diff --git a/harness/mame/vt1200.cpp b/harness/mame/vt1200.cpp index bdf3324..b204e55 100644 --- a/harness/mame/vt1200.cpp +++ b/harness/mame/vt1200.cpp @@ -642,6 +642,13 @@ static const u32 BOARD_BASE[4] = { VT1200_WIN0, VT1200_WIN1, VT1200_WIN2, VT1200 // 160-byte / 80-word pitch MAME computed from HEBLNK/HSBLNK/HTOTAL the text is // sheared and unreadable. See RENDER_REPORT.md. static const u32 VRAM_BASE_BITS = 0x04000000; // where the framebuffer lives +// The image accelerator ("scalution") register block, at bit 0x05600000. The +// firmware's DDX render path (file 0x122D94) drives it and polls 0x5600010 bit 1 +// for "initialisation done", timing out with +// "ERROR: timeout occurred on initialization of scalution" +// and returning BadValue otherwise. Before this was modelled the whole range +// fell inside the VRAM window above, so the poll read pixel data forever. +static const u32 ACCEL_BASE_BITS = 0x05600000; static const int VMEM_PITCH_BITS = 1024; // 0x40 words = 128 bytes static const int VMEM_HEIGHT = 1024; // rows in the framebuffer @@ -866,6 +873,18 @@ private: void unmapped_w(offs_t off, u16 data); void log_unmapped(const char *kind, u32 addr, const char *pc); + // Image accelerator ("scalution") minimum model. Registers observed: + // +0x00 control, +0x10 status (bit 1 = initialised/done), + // +0x20 timing, +0x30 control, +0x80 command/data FIFO, +0x100 control. + u16 m_accel[0x100]{}; + bool m_accel_rdy = false; // 0x5600010 bit 0 handshake + bool m_accel_done = false; // set once the FIFO has consumed data + u16 m_fifo[0x2000]{}; // pixels pushed into the accelerator + u32 m_fifo_in = 0, m_fifo_out = 0; // reset by a data-register write + u32 m_accel_cnt = 0; // words pushed in the current burst + u16 accel_r(offs_t off); + void accel_w(offs_t off, u16 data); + // VT1200_IRQLOG=: log DUART1's IRQ assertions (ISR/SRA at the // moment of the interrupt). FILE *m_irqlog = nullptr; @@ -1107,6 +1126,66 @@ void vt1200_state::unmapped_w(offs_t off, u16 data) log_unmapped("W", (u32)off, pc); } +// --------------------------------------------------------------------------- +// Image accelerator ("scalution") minimum model. +// +// The firmware's DDX render path drives this block and waits for bit 1 of the +// status register to come up, printing +// "ERROR: timeout occurred on initialization of scalution" +// and returning XIE BadValue if it never does. With the block unmapped (it +// used to fall inside the VRAM window) the poll could never succeed, so XIE +// export could never complete. Reporting the ready bit lets the firmware's own +// render path proceed; the pixel engine itself is still not modelled. +// --------------------------------------------------------------------------- +u16 vt1200_state::accel_r(offs_t off) +{ + if (getenv("VT1200_ACCEL_LOG")) + logerror("accel: r %03X\n", (unsigned)off); + // NOTE: the address map hands us (address - base) >> 4, so the registers + // seen at +0x00/+0x10/+0x20/+0x30/+0x80/+0x100 arrive as 0/1/2/3/8/0x10. + // 0x5600200 is the engine's OUTPUT port: the firmware reads it and writes + // each word to the drawable itself (file 0x125528: MOVE *B6,*B1 ; + // ADDK 0x10,B1). So it must return the pixels that were pushed into the + // FIFO, not a status word. + if ((off & 0xff) == 0x20) { + if (m_fifo_out < m_fifo_in) return m_fifo[m_fifo_out++ & 0x1fff]; + return 0x0000; + } + if ((off & 0xff) == 0x01) + // 0x5600010: bit 1 = initialised (DDX setup poll, file 0x122E54), + // bit 2 = transfer complete, bit 9 = done (file 0x1253FC/0x125448), + // bit 0 = DATA READY -- a handshake, not a constant: file 0x1254F2 takes + // the transfer path while it is set and the transfer loop at 0x125568 + // re-enters forever if it never clears. + return 0x0002 | (m_accel_rdy ? 0x0001 : 0x0000) + | (m_accel_done ? (0x0200 | 0x0004) : 0x0000); + { + u16 v = m_accel[off & 0xff]; + // The transfer loop also tests bit 9 ("done") of whichever control + // register the caller passed in B3; report done on the control cluster. + if (m_accel_done) v |= 0x0200; // "done" on the control registers + return v; + } +} + +void vt1200_state::accel_w(offs_t off, u16 data) +{ + m_accel[off & 0xff] = data; + // Data-request handshake: a FIFO command (0x5600080) raises "data ready"; + // the first write to the FIFO data register (0x5600050) consumes it. + // Handshake, taken from file 0x12538C: the host writes the data register + // (0x5600050), then streams the source pixels into the FIFO (0x5600080) in + // bursts of 0x7FE words, then sets bit 0 of 0x5600030. + if ((off & 0xff) == 0x05) { m_accel_rdy = true; m_accel_done = false; m_accel_cnt = 0; + m_fifo_in = m_fifo_out = 0; } // data register write starts a new transfer + else if ((off & 0xff) == 0x08) { + m_fifo[m_fifo_in++ & 0x1fff] = data; + if (++m_accel_cnt >= 0x7fe) { m_accel_rdy = false; m_accel_done = true; m_accel_cnt = 0; } + } + if (getenv("VT1200_ACCEL_LOG")) + logerror("accel: w %03X = %04X\n", (unsigned)off, data); +} + void vt1200_state::program_map(address_map &map) { // Catch-all for anything we do not model -- registered FIRST so every region @@ -1124,7 +1203,25 @@ void vt1200_state::program_map(address_map &map) // 0x04000000..0x040D7FF0 == bytes 0x800000..0x81AFFE (~110 KB, about one // 1280x1024 1bpp framebuffer). Mapping it is what lets the level-1 VIDEO // MEMORY test's walking-bit read-back pass, so it is unconditional now. - map(VRAM_BASE_BITS, 0x1fffffff).ram().share("vram"); + // Image accelerator ("scalution") register block. OPT-IN via VT1200_ACCEL + // so the verified default configuration stays exactly as it was. + // + // What the model does (XIE_IMAGE_DISPLAYED.md in xie/evidence/): it answers + // the status poll, accepts the pixel stream the firmware pushes into the + // FIFO, and returns those words on the output port, which the FIRMWARE then + // stores into the drawable itself (file 0x125528: MOVE *B6,*B1). With it the + // XIE path runs end to end and a client-chosen image appears on screen. + // + // What it does NOT do: it is not a real accelerator. It performs no + // compositing or scaling, and the destination is the caller's pointer, not a + // register -- so this is a stand-in for the device, not a model of it. + if (getenv("VT1200_ACCEL")) { + map(ACCEL_BASE_BITS, ACCEL_BASE_BITS + 0xfff).rw(FUNC(vt1200_state::accel_r), FUNC(vt1200_state::accel_w)); + map(VRAM_BASE_BITS, ACCEL_BASE_BITS - 1).ram().share("vram"); + map(ACCEL_BASE_BITS + 0x1000, 0x1fffffff).ram(); + } else { + map(VRAM_BASE_BITS, 0x1fffffff).ram().share("vram"); + } // Main RAM: 4 MiB (1 MiB onboard + 3 x 1 MiB SIMMs on the real machine). // The TMS34010 is bit-addressed, so 4 MiB of bytes == 0x2000000 address diff --git a/harness/mame/xie_acc.lua b/harness/mame/xie_acc.lua new file mode 100644 index 0000000..6d2945a --- /dev/null +++ b/harness/mame/xie_acc.lua @@ -0,0 +1,8 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("wpset 05600000,400,rw,1,{ printf \"ACC pc=%08X adr=%08X val=%08X\n\", pc, wpaddr, wpdata ; g }") +print("XIE-ACC armed (0x5600000..0x56001FF)") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "acc") diff --git a/harness/mame/xie_acc2.lua b/harness/mame/xie_acc2.lua new file mode 100644 index 0000000..a53a9bc --- /dev/null +++ b/harness/mame/xie_acc2.lua @@ -0,0 +1,9 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("wpset 05600000,400,rw,1,{ printf \"ACC pc=%08X adr=%08X val=%08X\n\", pc, wpaddr, wpdata ; g }") +print("XIE-ACC2 armed (poke + 0x5600000..0x56001FF)") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "acc2") diff --git a/harness/mame/xie_acc3.lua b/harness/mame/xie_acc3.lua new file mode 100644 index 0000000..b35fab6 --- /dev/null +++ b/harness/mame/xie_acc3.lua @@ -0,0 +1,5 @@ +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("wpset 05600080,10,w,1,{ printf \"CMD %04X\n\", wpdata ; g }") +dbg:command("wpset 05600050,10,w,1,{ printf \"DAT %04X\n\", wpdata ; g }") +print("XIE-ACC3 armed") diff --git a/harness/mame/xie_acc4.lua b/harness/mame/xie_acc4.lua new file mode 100644 index 0000000..de422ac --- /dev/null +++ b/harness/mame/xie_acc4.lua @@ -0,0 +1,5 @@ +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("wpset 05600000,1000,w,1,{ printf \"ACCW %04X %04X\n\", wpaddr, wpdata ; g }") +dbg:command("wpset 05600000,1000,r,1,{ printf \"ACCR %04X\n\", wpaddr ; g }") +print("XIE-ACC4 armed") diff --git a/harness/mame/xie_acc5.lua b/harness/mame/xie_acc5.lua new file mode 100644 index 0000000..52dcea0 --- /dev/null +++ b/harness/mame/xie_acc5.lua @@ -0,0 +1,4 @@ +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("wpset 05600000,1000,w,1,{ printf \"ACCW pc=%08X %04X %04X\n\", pc, wpaddr, wpdata ; g }") +print("XIE-ACC5 armed") diff --git a/harness/mame/xie_acct.lua b/harness/mame/xie_acct.lua new file mode 100644 index 0000000..a15d36c --- /dev/null +++ b/harness/mame/xie_acct.lua @@ -0,0 +1,4 @@ +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("wpset 05600000,200,rw,1,{ printf \"ACC %08X %04X %08X\n\", wpaddr, wpdata, pc ; g }") +print("XIE-ACCT armed") diff --git a/harness/mame/xie_args.lua b/harness/mame/xie_args.lua new file mode 100644 index 0000000..cab2a09 --- /dev/null +++ b/harness/mame/xie_args.lua @@ -0,0 +1,9 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("bpset 3FB29D70,,{ printf \"ARGS a0=%08X a1=%08X a2=%08X a3=%08X a4=%08X a7=%08X\n\", a0, a1, a2, a3, a4, a7 ; g }") +print("XIE-ARGS armed") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "args") diff --git a/harness/mame/xie_arm2.lua b/harness/mame/xie_arm2.lua new file mode 100644 index 0000000..8de2e90 --- /dev/null +++ b/harness/mame/xie_arm2.lua @@ -0,0 +1,15 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F5565D0,,{ printf \"ACBA a11=%08X b8=%02X b12=%02X\\n\", a11, b@(a11+0x40), b@(a11+0x60) ; g }") +dbg:command("bpset 3F5565F0,,{ printf \"ACBE a7=%08X\\n\", a7 ; g }") +dbg:command("bpset 3F556620,,{ printf \"ACC4 a7=%08X\\n\", a7 ; g }") +dbg:command("bpset 3F556650,,{ printf \"ACCA a7=%08X\\n\", a7 ; g }") +dbg:command("bpset 3F556680,,{ printf \"ACD0 a7=%08X\\n\", a7 ; g }") +dbg:command("bpset 3F5566A0,,{ printf \"ACD4_BADMATCH\\n\" ; g }") +dbg:command("bpset 3F5569A0,,{ printf \"OKPATH_6AD34\\n\" ; g }") +print("XIE-ARM2 armed 8") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "arm2") diff --git a/harness/mame/xie_armchk.lua b/harness/mame/xie_armchk.lua new file mode 100644 index 0000000..6c0d2d8 --- /dev/null +++ b/harness/mame/xie_armchk.lua @@ -0,0 +1,14 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F55E5D0,,{ printf \"ACBA a11=%08X b8=%02X b12=%02X\n\", a11, b@(a11+0x40), b@(a11+0x60) ; g }") +dbg:command("bpset 3F55E5F0,,{ printf \"ACBE a7=%08X\n\", a7 ; g }") +dbg:command("bpset 3F55E620,,{ printf \"ACC4 a7=%08X\n\", a7 ; g }") +dbg:command("bpset 3F55E650,,{ printf \"ACCA a7=%08X (req byte13)\n\", a7 ; g }") +dbg:command("bpset 3F55E680,,{ printf \"ACD0 a7=%08X\n\", a7 ; g }") +dbg:command("bpset 3F55E6A0,,{ printf \"ACD4_BADMATCH\n\" ; g }") +print("XIE-ARMCHK armed 7 breakpoints") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "armchk") diff --git a/harness/mame/xie_b36.lua b/harness/mame/xie_b36.lua new file mode 100644 index 0000000..641af58 --- /dev/null +++ b/harness/mame/xie_b36.lua @@ -0,0 +1,13 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F55D560,,{ printf \"STORE src120=%08X\n\", d@(a7+0x120) ; g }") +dbg:command("bpset 3F55D5C0,,{ printf \"OUTCEL a11=%08X star=%08X\n\", a11, d@(a11) ; g }") +dbg:command("bpset 3F55D7A0,,{ printf \"T_GATE a7=%08X a11=%08X\n\", a7, a11 ; g }") +dbg:command("bpset 3F553DA0,,{ printf \"S19RET a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F55DF10,,{ printf \"LK_SUCCESS_6BBE2\n\" ; g }") +print("XIE-B36 armed 6 breakpoints") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "b36") diff --git a/harness/mame/xie_b8s.lua b/harness/mame/xie_b8s.lua new file mode 100644 index 0000000..abef72d --- /dev/null +++ b/harness/mame/xie_b8s.lua @@ -0,0 +1,28 @@ +-- byte8 watch + PROVABLE stack control +local frames = 0 +local lastwp, lastaddr = "", 0 +local dbg = manager.machine.debugger +local cpu = manager.machine.devices[":maincpu"] +local idstore = 0x3F200000 + 0x67B04*8 +dbg:command(string.format("bpset %08X,,{ printf \"CTRL_IDSTORE id=%%08X obj=%%08X\\n\", d@(a9+0x40), a11 ; g }", idstore)) +print("XIE-B8S armed 1 breakpoint") +emu.register_frame_done(function() + frames = frames + 1 + local f = io.open("/tmp/opencode/xie_wp6.txt", "r") + if f then + local txt = f:read("*l"); f:close() + if txt and txt ~= lastwp then + lastwp = txt + local p = tonumber(txt) + if p and p ~= 0 and p ~= lastaddr then + lastaddr = p + local sp = cpu.state["SP"].value + dbg:command(string.format("wpset %08X,8,w,1,{ printf \"B8 pc=%%08X val=%%08X\\n\", pc, wpdata ; g }", p + 8*8)) + -- stack control: 256 bits just below SP, written by the next push + dbg:command(string.format("wpset %08X,100,w,1,{ printf \"SCTRL pc=%%08X\\n\", pc ; g }", sp - 0x100)) + print(string.format("XIE-B8S installed: byte8 %08X ; stack ctrl at %08X (sp=%08X)", p + 8*8, sp - 0x100, sp)) + end + end + end + if frames >= 2000000 then machine:exit() end +end, "b8s") diff --git a/harness/mame/xie_b8t.lua b/harness/mame/xie_b8t.lua new file mode 100644 index 0000000..65ef0fa --- /dev/null +++ b/harness/mame/xie_b8t.lua @@ -0,0 +1,27 @@ +-- byte8 watches on TWO objects + stack positive control +local frames = 0 +local lastwp = "" +local dbg = manager.machine.debugger +local cpu = manager.machine.devices[":maincpu"] +dbg:command(string.format("bpset %08X,,{ printf \"CTRL_IDSTORE id=%%08X obj=%%08X\\n\", d@(a9+0x40), a11 ; g }", 0x3F200000 + 0x67B04*8)) +print("XIE-B8T armed 1 breakpoint") +emu.register_frame_done(function() + frames = frames + 1 + local f = io.open("/tmp/opencode/xie_wp7.txt", "r") + if f then + local txt = f:read("*l"); f:close() + if txt and txt ~= lastwp then + lastwp = txt + local a, b = txt:match("(%d+),(%d+)") + if a and b then + local pa, pb = tonumber(a), tonumber(b) + local sp = cpu.state["SP"].value + dbg:command(string.format("wpset %08X,8,w,1,{ printf \"B8A pc=%%08X val=%%08X\\n\", pc, wpdata ; g }", pa + 8*8)) + dbg:command(string.format("wpset %08X,8,w,1,{ printf \"B8B pc=%%08X val=%%08X\\n\", pc, wpdata ; g }", pb + 8*8)) + dbg:command(string.format("wpset %08X,100,w,1,{ printf \"SCTRL pc=%%08X\\n\", pc ; g }", sp - 0x100)) + print(string.format("XIE-B8T installed: A byte8 %08X, B byte8 %08X, stack %08X", pa+8*8, pb+8*8, sp-0x100)) + end + end + end + if frames >= 2000000 then machine:exit() end +end, "b8t") diff --git a/harness/mame/xie_b8v.lua b/harness/mame/xie_b8v.lua new file mode 100644 index 0000000..7891181 --- /dev/null +++ b/harness/mame/xie_b8v.lua @@ -0,0 +1,27 @@ +-- byte8 write watch + positive-control watch on VRAM (generated addresses) +local frames = 0 +local lastwp, lastaddr = "", 0 +local dbg = manager.machine.debugger +local idstore = 0x3F200000 + 0x67B04*8 +local s19ret = 0x3F200000 + 0x6A7B4*8 +dbg:command(string.format("bpset %08X,,{ printf \"CTRL_IDSTORE id=%%08X obj=%%08X\\n\", d@(a9+0x40), a11 ; g }", idstore)) +dbg:command(string.format("bpset %08X,,{ printf \"CTRL_S19RET a8=%%08X\\n\", a8 ; g }", s19ret)) +print("XIE-B8V armed 2 breakpoints") +emu.register_frame_done(function() + frames = frames + 1 + local f = io.open("/tmp/opencode/xie_wp4.txt", "r") + if f then + local txt = f:read("*l"); f:close() + if txt and txt ~= lastwp then + lastwp = txt + local p = tonumber(txt) + if p and p ~= 0 and p ~= lastaddr then + lastaddr = p + dbg:command(string.format("wpset %08X,8,w,1,{ printf \"B8 pc=%%08X val=%%08X\\n\", pc, wpdata ; g }", p + 8*8)) + dbg:command(string.format("wpset %08X,8,w,1,{ printf \"VCTRL\\n\" ; g }", 0x04000000)) + print(string.format("XIE-B8V installed: byte8 at %08X + VRAM control", p + 8*8)) + end + end + end + if frames >= 2000000 then machine:exit() end +end, "b8v") diff --git a/harness/mame/xie_b8w.lua b/harness/mame/xie_b8w.lua new file mode 100644 index 0000000..3c9f8cb --- /dev/null +++ b/harness/mame/xie_b8w.lua @@ -0,0 +1,25 @@ +-- byte8 write watch + WIDE VRAM control (1 KB) to validate the mechanism +local frames = 0 +local lastwp, lastaddr = "", 0 +local dbg = manager.machine.debugger +local idstore = 0x3F200000 + 0x67B04*8 +dbg:command(string.format("bpset %08X,,{ printf \"CTRL_IDSTORE id=%%08X obj=%%08X\\n\", d@(a9+0x40), a11 ; g }", idstore)) +print("XIE-B8W armed 1 breakpoint") +emu.register_frame_done(function() + frames = frames + 1 + local f = io.open("/tmp/opencode/xie_wp5.txt", "r") + if f then + local txt = f:read("*l"); f:close() + if txt and txt ~= lastwp then + lastwp = txt + local p = tonumber(txt) + if p and p ~= 0 and p ~= lastaddr then + lastaddr = p + dbg:command(string.format("wpset %08X,8,w,1,{ printf \"B8 pc=%%08X val=%%08X\\n\", pc, wpdata ; g }", p + 8*8)) + dbg:command("wpset 04000000,2000,w,1,{ printf \"VCTRL pc=%08X\\n\", pc ; g }") + print(string.format("XIE-B8W installed: byte8 %08X + VRAM 1KB control", p + 8*8)) + end + end + end + if frames >= 2000000 then machine:exit() end +end, "b8w") diff --git a/harness/mame/xie_chain.lua b/harness/mame/xie_chain.lua new file mode 100644 index 0000000..7796058 --- /dev/null +++ b/harness/mame/xie_chain.lua @@ -0,0 +1,12 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\n\", a7, a11 ; g }") +dbg:command("bpset 3F553DA0,,{ printf \"S19RET a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F2D94B0,,{ printf \"RP a11=%08X src_base610=%08X\n\", a11, d@(a11+0x610) ; g }") +dbg:command("bpset 3F55DF10,,{ printf \"LK_SUCCESS\n\" ; g }") +print("XIE-CHAIN armed 5 breakpoints") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "chain") diff --git a/harness/mame/xie_cln.lua b/harness/mame/xie_cln.lua new file mode 100644 index 0000000..eebd889 --- /dev/null +++ b/harness/mame/xie_cln.lua @@ -0,0 +1,13 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F2DD1B0,,{ printf \"after 7F67F38 a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F2DD250,,{ printf \"after 7E75EA8 a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F2DD330,,{ printf \"after 7EA45FE a8=%08X a11=%08X\n\", a8, a11 ; g }") +dbg:command("bpset 3F2DD3F0,,{ printf \"after 7E7FE96 a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F2DD410,,{ printf \"after store a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F2DDE00,,{ printf \"RET a8=%08X\n\", a8 ; g }") +print("XIE-CLN armed 6") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "cln") diff --git a/harness/mame/xie_cmp.lua b/harness/mame/xie_cmp.lua new file mode 100644 index 0000000..4fcdf7b --- /dev/null +++ b/harness/mame/xie_cmp.lua @@ -0,0 +1,17 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F2DCF90,,{ printf \"r9F2 a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F2DD000,,{ printf \"rA00 a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F2DD0C0,,{ printf \"rA18 a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F2DD150,,{ printf \"rA2A a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F2DD180,,{ printf \"ERRCHAIN_1BA30\n\" ; g }") +dbg:command("bpset 3F2DD530,,{ printf \"ERR_1BAA6\n\" ; g }") +dbg:command("bpset 3F2DD630,,{ printf \"ERR_1BAC6\n\" ; g }") +dbg:command("bpset 3F2DDCB0,,{ printf \"ERR_1BB96\n\" ; g }") +dbg:command("bpset 3F2DDE00,,{ printf \"DRIVER_RET a8=%08X\n\", a8 ; g }") +print("XIE-CMP armed 10") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "cmp") diff --git a/harness/mame/xie_ctl.lua b/harness/mame/xie_ctl.lua new file mode 100644 index 0000000..10564b7 --- /dev/null +++ b/harness/mame/xie_ctl.lua @@ -0,0 +1,5 @@ +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("wpset 05600020,10,w,1,{ printf \"R20 %04X %08X\n\", wpdata, pc ; g }") +dbg:command("wpset 05600030,10,w,1,{ printf \"R30 %04X %08X\n\", wpdata, pc ; g }") +print("XIE-CTL armed") diff --git a/harness/mame/xie_cvt.lua b/harness/mame/xie_cvt.lua new file mode 100644 index 0000000..3bbb2df --- /dev/null +++ b/harness/mame/xie_cvt.lua @@ -0,0 +1,15 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3FE114E0,,{ printf \"H229C a0=%08X a1=%08X a8=%08X\n\", a0, a1, a8 ; g }") +dbg:command("bpset 3FE0F590,,{ printf \"H1EB2 a0=%08X a1=%08X a8=%08X\n\", a0, a1, a8 ; g }") +dbg:command("bpset 3FE0FAF0,,{ printf \"H1F5E a0=%08X a1=%08X\n\", a0, a1 ; g }") +dbg:command("bpset 3FE11080,,{ printf \"H2210 a0=%08X a1=%08X\n\", a0, a1 ; g }") +dbg:command("bpset 3F2D9EF0,,{ printf \"after 229C#1 a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F2DA030,,{ printf \"after 1EB2#2 a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F2DA130,,{ printf \"after 2210 a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F2DA220,,{ printf \"after 2210 b a8=%08X\n\", a8 ; g }") +print("XIE-CVT armed 8") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "cvt") diff --git a/harness/mame/xie_ddx.lua b/harness/mame/xie_ddx.lua new file mode 100644 index 0000000..87500dc --- /dev/null +++ b/harness/mame/xie_ddx.lua @@ -0,0 +1,13 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F3AF870,,{ printf \"DDX class=%d\n\", b@(a11+0x630) ; g }") +dbg:command("bpset 3F3AF950,,{ printf \"DDX f610=%08X (BadValue if 0)\n\", d@(a9+0x610) ; g }") +dbg:command("bpset 3F3AF790,,{ printf \"DDX_BADVALUE_class\n\" ; g }") +dbg:command("bpset 3F3AF980,,{ printf \"DDX_BADVALUE_610zero\n\" ; g }") +dbg:command("bpset 3F3AFB10,,{ printf \"DDX_continue_after_610\n\" ; g }") +dbg:command("bpset 3F3B8A60,,{ printf \"DDX_RET a8=%08X\n\", a8 ; g }") +print("XIE-DDX armed 6") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "ddx") diff --git a/harness/mame/xie_disp.lua b/harness/mame/xie_disp.lua new file mode 100644 index 0000000..419bd9f --- /dev/null +++ b/harness/mame/xie_disp.lua @@ -0,0 +1,17 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F55B200,,{ printf \"H_ENTRY\n\" ; g }") +dbg:command("bpset 3F55C1F0,,{ printf \"H_83E ddobj=%08X b1=%02X a8=%08X\n\", a11, b@(a11+0x8), a8 ; g }") +dbg:command("bpset 3F55B270,,{ printf \"H_64E_disp1\n\" ; g }") +dbg:command("bpset 3F55B3A0,,{ printf \"H_674 cnt=%08X\n\", d@(a13+0x1f0) ; g }") +dbg:command("bpset 3F55B420,,{ printf \"H_684 d8=%08X\n\", d@(a9+0xd8) ; g }") +dbg:command("bpset 3F55B440,,{ printf \"H_688\n\" ; g }") +dbg:command("bpset 3F55B500,,{ printf \"H_6A0_call_7EAC356\n\" ; g }") +dbg:command("bpset 3F55B750,,{ printf \"H_6EA_call_7E80008\n\" ; g }") +dbg:command("bpset 3F55BF40,,{ printf \"H_7E8_disp4\n\" ; g }") +dbg:command("bpset 3F55C260,,{ printf \"H_84C_default\n\" ; g }") +print("XIE-DISP armed 10") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "disp") diff --git a/harness/mame/xie_disp2.lua b/harness/mame/xie_disp2.lua new file mode 100644 index 0000000..e2c05b3 --- /dev/null +++ b/harness/mame/xie_disp2.lua @@ -0,0 +1,18 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F55B200,,{ printf \"H_ENTRY\n\" ; g }") +dbg:command("bpset 3F55C1F0,,{ printf \"H_83E ddobj=%08X b1=%02X a8=%08X\n\", a11, b@(a11+0x8), a8 ; g }") +dbg:command("bpset 3F55B270,,{ printf \"H_64E_disp1\n\" ; g }") +dbg:command("bpset 3F55B3A0,,{ printf \"H_674 cnt=%08X\n\", d@(a13+0x1f0) ; g }") +dbg:command("bpset 3F55B420,,{ printf \"H_684 d8=%08X\n\", d@(a9+0xd8) ; g }") +dbg:command("bpset 3F55B440,,{ printf \"H_688\n\" ; g }") +dbg:command("bpset 3F55B500,,{ printf \"H_6A0_call_7EAC356\n\" ; g }") +dbg:command("bpset 3F55B750,,{ printf \"H_6EA_call_7E80008\n\" ; g }") +dbg:command("bpset 3F55BF40,,{ printf \"H_7E8_disp4\n\" ; g }") +dbg:command("bpset 3F55C260,,{ printf \"H_84C_default\n\" ; g }") +print("XIE-DISP2 armed 11") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "disp2") diff --git a/harness/mame/xie_dst.lua b/harness/mame/xie_dst.lua new file mode 100644 index 0000000..0d3e411 --- /dev/null +++ b/harness/mame/xie_dst.lua @@ -0,0 +1,9 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("bpset 3FB2A940,,{ printf \"DST b1=%08X b2=%08X a6=%08X\n\", b1, b2, a6 ; g }") +print("XIE-DST armed") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "dst") diff --git a/harness/mame/xie_eb4.lua b/harness/mame/xie_eb4.lua new file mode 100644 index 0000000..f7a2e6a --- /dev/null +++ b/harness/mame/xie_eb4.lua @@ -0,0 +1,24 @@ +local frames = 0 +local last = "" +local dbg = manager.machine.debugger +local cpu = manager.machine.devices[":maincpu"] +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +print("XIE-EB4 armed") +emu.register_frame_done(function() + frames = frames + 1 + local f = io.open("/tmp/opencode/eb4.txt", "r") + if f then + local t = f:read("*l"); f:close() + if t and t ~= last then + last = t + local e = tonumber(t) + if e and e ~= 0 then + dbg:command(string.format("wpset %08X,8,w,1,{ printf \"EB4WRITE pc=%%08X val=%%08X\n\", pc, wpdata ; g }", e + 0x20)) + local sp = cpu.state["SP"].value + dbg:command(string.format("wpset %08X,100,w,1,{ printf \"SCTRL\n\" ; g }", (sp - 0x100) & 0x3FFFFFFF)) + print(string.format("XIE-EB4 watching %08X (+ctrl)", e + 0x20)) + end + end + end + if frames >= 2000000 then machine:exit() end +end, "eb4") diff --git a/harness/mame/xie_elem.lua b/harness/mame/xie_elem.lua new file mode 100644 index 0000000..a7ad1d6 --- /dev/null +++ b/harness/mame/xie_elem.lua @@ -0,0 +1,10 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F2D95C0,,{ printf \"TYPE1 a5=%08X tgt=%08X\\n\", a5, a5+0x58 ; g }") +dbg:command("bpset 3F2D9B10,,{ printf \"TYPE2 a5=%08X tgt=%08X\\n\", a5, a5+0x58 ; g }") +print("XIE-ELEM armed 3") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "elem") diff --git a/harness/mame/xie_elw.lua b/harness/mame/xie_elw.lua new file mode 100644 index 0000000..605304d --- /dev/null +++ b/harness/mame/xie_elw.lua @@ -0,0 +1,26 @@ +local frames = 0 +local lastwp = "" +local dbg = manager.machine.debugger +local cpu = manager.machine.devices[":maincpu"] +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +print("XIE-ELW armed 1 breakpoint") +emu.register_frame_done(function() + frames = frames + 1 + local f = io.open("/tmp/opencode/xie_wp8.txt", "r") + if f then + local txt = f:read("*l"); f:close() + if txt and txt ~= lastwp then + lastwp = txt + local a, b = txt:match("(%d+),(%d+)") + if a and b then + local pa, pb = tonumber(a), tonumber(b) + dbg:command(string.format("wpset %08X,800,w,1,{ printf \"ELW pc=%%08X val=%%08X\\n\", pc, wpdata ; g }", pa)) + dbg:command(string.format("wpset %08X,20,w,1,{ printf \"BANDW pc=%%08X val=%%08X\\n\", pc, wpdata ; g }", pb)) + local sp = cpu.state["SP"].value + dbg:command(string.format("wpset %08X,100,w,1,{ printf \"SCTRL\n\" ; g }", (sp - 0x100) & 0x3FFFFFFF)) + print(string.format("XIE-ELW installed elem=%08X(+800) bandslot=%08X ctrl=%08X", pa, pb, sp)) + end + end + end + if frames >= 2000000 then machine:exit() end +end, "elw") diff --git a/harness/mame/xie_elw2.lua b/harness/mame/xie_elw2.lua new file mode 100644 index 0000000..f666638 --- /dev/null +++ b/harness/mame/xie_elw2.lua @@ -0,0 +1,27 @@ +local frames = 0 +local lastwp = "" +local dbg = manager.machine.debugger +local cpu = manager.machine.devices[":maincpu"] +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F2D94B0,,{ printf \"RP a11=%08X src_base610=%08X\n\", a11, d@(a11+0x610) ; g }") +dbg:command("bpset 3F2D95C0,,{ printf \"TYPE1\n\" ; g }") +dbg:command("bpset 3F2D9B10,,{ printf \"TYPE2\n\" ; g }") +print("XIE-ELW2 armed 4") +emu.register_frame_done(function() + frames = frames + 1 + local f = io.open("/tmp/opencode/xie_wp9.txt", "r") + if f then + local txt = f:read("*l"); f:close() + if txt and txt ~= lastwp then + lastwp = txt + local a, b = txt:match("(%d+),(%d+)") + if a and b then + local pa, pb = tonumber(a), tonumber(b) + dbg:command(string.format("wpset %08X,800,w,1,{ printf \"ELW pc=%%08X val=%%08X\\n\", pc, wpdata ; g }", pa)) + dbg:command(string.format("wpset %08X,20,w,1,{ printf \"BANDW pc=%%08X val=%%08X\\n\", pc, wpdata ; g }", pb)) + print(string.format("XIE-ELW2 installed elem=%08X bandslot=%08X", pa, pb)) + end + end + end + if frames >= 2000000 then machine:exit() end +end, "elw2") diff --git a/harness/mame/xie_ex1.lua b/harness/mame/xie_ex1.lua new file mode 100644 index 0000000..9ee4da7 --- /dev/null +++ b/harness/mame/xie_ex1.lua @@ -0,0 +1,17 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F516BF0,,{ printf \"EX_LK ret=%08X obj=%08X\n\", a8, d@(a13+0x20) ; g }") +dbg:command("bpset 3F516C70,,{ printf \"EX_F5 obj=%08X f5=%08X\n\", a11, d@(a11+0x28) ; g }") +dbg:command("bpset 3F516DE0,,{ printf \"EX_CK1 req=%08X obj=%08X\n\", d@(a9+0x80), d@(a11+0x80) ; g }") +dbg:command("bpset 3F516FC0,,{ printf \"EX_CK2 req=%08X obj=%08X\n\", d@(a9+0xa0), d@(a11+0xa0) ; g }") +dbg:command("bpset 3F517180,,{ printf \"EX_CK3 c0=%08X e0=%08X\n\", d@(a9+0xc0), d@(a9+0xe0) ; g }") +dbg:command("bpset 3F516CA0,,{ printf \"EX_BADMATCH\n\" ; g }") +dbg:command("bpset 3F516E50,,{ printf \"EX_BADVALUE_1\n\" ; g }") +dbg:command("bpset 3F517030,,{ printf \"EX_BADVALUE_2\n\" ; g }") +dbg:command("bpset 3F5171F0,,{ printf \"EX_BADVALUE_3\n\" ; g }") +print("XIE-EX1 armed 10") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "ex1") diff --git a/harness/mame/xie_ex2.lua b/harness/mame/xie_ex2.lua new file mode 100644 index 0000000..dc9bfe7 --- /dev/null +++ b/harness/mame/xie_ex2.lua @@ -0,0 +1,14 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F517EE0,,{ printf \"EX2_CALL_7EA47B6\n\" ; g }") +dbg:command("bpset 3F517F10,,{ printf \"EX2_RET a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F517F40,,{ printf \"EX2_JREQ a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F5184D0,,{ printf \"RD_RET a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F518750,,{ printf \"EPI_RET a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F517DE0,,{ printf \"EXIT_62FBC\n\" ; g }") +print("XIE-EX2 armed 7") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "ex2") diff --git a/harness/mame/xie_ex3.lua b/harness/mame/xie_ex3.lua new file mode 100644 index 0000000..228019f --- /dev/null +++ b/harness/mame/xie_ex3.lua @@ -0,0 +1,15 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F518150,,{ printf \"ALLOC ret=%08X\n\", a8 ; g }") +dbg:command("bpset 3F518190,,{ printf \"BADALLOC_path\n\" ; g }") +dbg:command("bpset 3F518390,,{ printf \"SETUP_before_render\n\" ; g }") +dbg:command("bpset 3F5184C0,,{ printf \"CALL_RD\n\" ; g }") +dbg:command("bpset 3F5184F0,,{ printf \"AFTER_RD a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F518740,,{ printf \"OK_EXIT\n\" ; g }") +dbg:command("bpset 3F518750,,{ printf \"EPI a8=%08X\n\", a8 ; g }") +print("XIE-EX3 armed 8") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "ex3") diff --git a/harness/mame/xie_exbr.lua b/harness/mame/xie_exbr.lua new file mode 100644 index 0000000..6fe83d8 --- /dev/null +++ b/harness/mame/xie_exbr.lua @@ -0,0 +1,13 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F2DC420,,{ printf \"J884 b9=%02X (JREQ=error if 0)\n\", b@(d@(0xa6000)+0x48) ; g }") +dbg:command("bpset 3F2DC440,,{ printf \"CONT_1B888\n\" ; g }") +dbg:command("bpset 3F2DCF90,,{ printf \"J9F2 (JR 1BA30) a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F2DD180,,{ printf \"ERR_1BA30\n\" ; g }") +dbg:command("bpset 3F2DD340,,{ printf \"ERR_1BA68 MOVK2 (reports BadValue)\n\" ; g }") +dbg:command("bpset 3F2DDE00,,{ printf \"DRIVER_RET a8=%08X\n\", a8 ; g }") +print("XIE-EXBR armed 6") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "exbr") diff --git a/harness/mame/xie_exec.lua b/harness/mame/xie_exec.lua new file mode 100644 index 0000000..fb95ec6 --- /dev/null +++ b/harness/mame/xie_exec.lua @@ -0,0 +1,15 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F2D95C0,,{ printf \"TYPE1\n\" ; g }") +dbg:command("bpset 3F2D9B10,,{ printf \"TYPE2\n\" ; g }") +dbg:command("bpset 3F2DA350,,{ printf \"TYPE3\n\" ; g }") +dbg:command("bpset 3F2DA7A0,,{ printf \"TYPE4\n\" ; g }") +dbg:command("bpset 3F2DAC10,,{ printf \"TYPE5\n\" ; g }") +dbg:command("bpset 3F2D94B0,,{ printf \"RP a11=%08X src_base610=%08X\n\", a11, d@(a11+0x610) ; g }") +dbg:command("bpset 3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\n\", a7, a11 ; g }") +print("XIE-EXEC armed 8") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "exec") diff --git a/harness/mame/xie_expdbg.lua b/harness/mame/xie_expdbg.lua new file mode 100644 index 0000000..c54e45a --- /dev/null +++ b/harness/mame/xie_expdbg.lua @@ -0,0 +1,15 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F516BF0,,{ printf \"EX_LK ret=%08X obj=%08X\n\", a8, d@(a13+0x20) ; g }") +dbg:command("bpset 3F516C70,,{ printf \"EX_F5 obj=%08X f5=%08X\n\", a11, d@(a11+0x28) ; g }") +dbg:command("bpset 3F516DE0,,{ printf \"EX_CK1 req80=%08X obj80=%08X\n\", d@(a9+0x80), d@(a11+0x80) ; g }") +dbg:command("bpset 3F516FC0,,{ printf \"EX_CK2 req_a0=%08X obj_a0=%08X\n\", d@(a9+0xa0), d@(a11+0xa0) ; g }") +dbg:command("bpset 3F517180,,{ printf \"EX_CK3 req_c0=%08X req_e0=%08X\n\", d@(a9+0xc0), d@(a9+0xe0) ; g }") +dbg:command("bpset 3F516CA0,,{ printf \"EX_BADMATCH_path\n\" ; g }") +dbg:command("bpset 3F516E50,,{ printf \"EX_BADVALUE_1\n\" ; g }") +print("XIE-EXP armed 8") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "exp") diff --git a/harness/mame/xie_ext.lua b/harness/mame/xie_ext.lua new file mode 100644 index 0000000..fdde64c --- /dev/null +++ b/harness/mame/xie_ext.lua @@ -0,0 +1,14 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F5177C0,,{ printf \"EX_EF8 f80=%08X fA0=%08X fC0=%08X a11=%08X\n\", d@(a13+0x80), d@(a13+0xa0), d@(a13+0xc0), a11 ; g }") +dbg:command("bpset 3F5177D0,,{ printf \"EX_EFA objA0=%08X\n\", d@(a11+0xa0) ; g }") +dbg:command("bpset 3F517870,,{ printf \"EX_F0E a7=%08X a5=%08X\n\", a7, a5 ; g }") +dbg:command("bpset 3F517890,,{ printf \"EX_F12 a5=%08X (JRLE if <=0)\n\", a5 ; g }") +dbg:command("bpset 3F5178C0,,{ printf \"EX_REJECT_BADVALUE\n\" ; g }") +dbg:command("bpset 3F517A00,,{ printf \"EX_CONTINUE_TO_RENDER\n\" ; g }") +print("XIE-EXT armed 7") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "ext") diff --git a/harness/mame/xie_fix.lua b/harness/mame/xie_fix.lua new file mode 100644 index 0000000..a47b153 --- /dev/null +++ b/harness/mame/xie_fix.lua @@ -0,0 +1,8 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; printf \"FORCED elem.b4=0 (was %02X) rp=%08X\n\", 0, d@(0xa6000) ; g }") +print("XIE-FIX armed") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "fix") diff --git a/harness/mame/xie_fix2.lua b/harness/mame/xie_fix2.lua new file mode 100644 index 0000000..29d1b4c --- /dev/null +++ b/harness/mame/xie_fix2.lua @@ -0,0 +1,12 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; printf \"FORCED b4=0 rp=%08X\n\", d@(0xa6000) ; g }") +dbg:command("bpset 3F3AF950,,{ printf \"CHK_610 val=%08X\n\", d@(a9+0x610) ; g }") +dbg:command("bpset 3F3AF980,,{ printf \"ERR_SRCBASE_NULL\n\" ; g }") +dbg:command("bpset 3F3AF790,,{ printf \"ERR_COMPRESSION\n\" ; g }") +dbg:command("bpset 3F3AFB10,,{ printf \"PAST_610_OK\n\" ; g }") +print("XIE-FIX2 armed") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "fix2") diff --git a/harness/mame/xie_fix3.lua b/harness/mame/xie_fix3.lua new file mode 100644 index 0000000..70aa26d --- /dev/null +++ b/harness/mame/xie_fix3.lua @@ -0,0 +1,10 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("bpset 3F3B8E10,,{ printf \"E_TMPUDP path\n\" ; g }") +dbg:command("bpset 3F3B8A60,,{ printf \"DDX_RET a8=%08X\n\", a8 ; g }") +print("XIE-FIX3 armed") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "fix3") diff --git a/harness/mame/xie_gate_only.lua b/harness/mame/xie_gate_only.lua new file mode 100644 index 0000000..fd501b2 --- /dev/null +++ b/harness/mame/xie_gate_only.lua @@ -0,0 +1,12 @@ +-- minimal probe: only the three addresses needed for the BadMatch gate question +local cpu = manager.machine.devices[":maincpu"] +local dbg = manager.machine.debugger +local frames = 0 +dbg:command("bpset 0x3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\n\", a7, a11 ; g }") +dbg:command("bpset 0x3F55D7C0,,{ printf \"E8MAIN\n\" ; g }") +dbg:command("bpset 0x3F55CE20,,{ printf \"CLASS1\n\" ; g }") +print("XIE-GATE-ONLY armed 3 breakpoints") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "gate-only") diff --git a/harness/mame/xie_gateop.lua b/harness/mame/xie_gateop.lua new file mode 100644 index 0000000..31c7a76 --- /dev/null +++ b/harness/mame/xie_gateop.lua @@ -0,0 +1,13 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F55D560,,{ printf \"STORE src120=%08X\n\", d@(a7+0x120) ; g }") +dbg:command("bpset 3F55D750,,{ printf \"EA a11=%08X star11=%08X argA0=%08X arg40=%08X\n\", a11, d@(a11), d@(a13+0xffa0), d@(a13+0xff40) ; g }") +dbg:command("bpset 3F55D790,,{ printf \"F2 a7=%08X star7=%08X\n\", a7, d@(a7) ; g }") +dbg:command("bpset 3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\n\", a7, a11 ; g }") +dbg:command("bpset 3F553DA0,,{ printf \"S19RET a8=%08X\n\", a8 ; g }") +print("XIE-GATEOP armed 6 breakpoints") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "gateop") diff --git a/harness/mame/xie_handoff.lua b/harness/mame/xie_handoff.lua new file mode 100644 index 0000000..651ac58 --- /dev/null +++ b/harness/mame/xie_handoff.lua @@ -0,0 +1,15 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F55B200,,{ printf \"HANDOFF_ENTRY\\n\" ; g }") +dbg:command("bpset 3F55B420,,{ printf \"H_684 a9=%08X\\n\", a9 ; g }") +dbg:command("bpset 3F55B440,,{ printf \"H_688 guard a9=%08X\\n\", a9 ; g }") +dbg:command("bpset 3F55B750,,{ printf \"H_6EA dd_call\\n\" ; g }") +dbg:command("bpset 3F55C260,,{ printf \"H_84C_NOOP\\n\" ; g }") +dbg:command("bpset 3F55C6B0,,{ printf \"H_8D6 clear28\\n\" ; g }") +dbg:command("bpset 3F553DA0,,{ printf \"S19RET a8=%08X\\n\", a8 ; g }") +print("XIE-HANDOFF armed 8") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "handoff") diff --git a/harness/mame/xie_hlp.lua b/harness/mame/xie_hlp.lua new file mode 100644 index 0000000..1e9d702 --- /dev/null +++ b/harness/mame/xie_hlp.lua @@ -0,0 +1,15 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F2D9EF0,,{ printf \"R_1EB2a a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F2DA030,,{ printf \"R_1EB2b a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F2DA130,,{ printf \"R_2210a a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F2DA1F0,,{ printf \"R_1F5Eb a8=%08X\n\", a8 ; g }") +dbg:command("bpset 3F2DA220,,{ printf \"R_2210b a8=%08X (block end)\n\", a8 ; g }") +dbg:command("bpset 3F2DA240,,{ printf \"BLK_EXIT_to_1B842\n\" ; g }") +dbg:command("bpset 3F2DC210,,{ printf \"TAIL_1B842 a8=%08X\n\", a8 ; g }") +print("XIE-HLP armed 8") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "hlp") diff --git a/harness/mame/xie_import.lua b/harness/mame/xie_import.lua new file mode 100644 index 0000000..4f74ccb --- /dev/null +++ b/harness/mame/xie_import.lua @@ -0,0 +1,10 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\\n\", a7, a11 ; g }") +dbg:command("bpset 3F2D94B0,,{ printf \"RP a11=%08X src_base610=%08X\\n\", a11, d@(a11+0x610) ; g }") +print("XIE-IMPORT armed 3") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "import") diff --git a/harness/mame/xie_min.lua b/harness/mame/xie_min.lua new file mode 100644 index 0000000..b523999 --- /dev/null +++ b/harness/mame/xie_min.lua @@ -0,0 +1,9 @@ +-- minimal probe: ONE breakpoint (ID store), so nothing can be silently dropped. +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 0x3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +print("XIE-MIN armed 1 breakpoint") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "min") diff --git a/harness/mame/xie_min2.lua b/harness/mame/xie_min2.lua new file mode 100644 index 0000000..3f18bbf --- /dev/null +++ b/harness/mame/xie_min2.lua @@ -0,0 +1,10 @@ +-- minimal probe #2: ID store + the 0x6B966 gate CMP. Two breakpoints only. +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 0x3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 0x3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\n\", a7, a11 ; g }") +print("XIE-MIN2 armed 2 breakpoints") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "min2") diff --git a/harness/mame/xie_min3.lua b/harness/mame/xie_min3.lua new file mode 100644 index 0000000..2315132 --- /dev/null +++ b/harness/mame/xie_min3.lua @@ -0,0 +1,12 @@ +-- minimal probe #3: three breakpoints - ID store, class dispatch, gate CMP +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 0x3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 0x3F55D460,,{ printf \"CLASSDISP a11=%08X cls=%02X\n\", a11, b@(a11+0x20) ; g }") +dbg:command("bpset 0x3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\n\", a7, a11 ; g }") +dbg:command("bpset 0x3F55CD70,,{ printf \"LOOKUP_NULL\n\" ; g }") +print("XIE-MIN3 armed 4 breakpoints") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "min3") diff --git a/harness/mame/xie_min4.lua b/harness/mame/xie_min4.lua new file mode 100644 index 0000000..23c6ea1 --- /dev/null +++ b/harness/mame/xie_min4.lua @@ -0,0 +1,18 @@ +-- bisect file 0x6BA1E..0x6BAC4 on the arm path (10 breakpoints) +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 0x3F53D820,,{ printf \"A_REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 0x3F55D0F0,,{ printf \"B_6BA1E cls2entry arg1=%08X\n\", d@(a13+0xffc0) ; g }") +dbg:command("bpset 0x3F55D120,,{ printf \"C_6BA24 copy_byte40_out\n\" ; g }") +dbg:command("bpset 0x3F55D190,,{ printf \"D_6BA32 byte40_zero_check\n\" ; g }") +dbg:command("bpset 0x3F55D1F0,,{ printf \"E_6BA3E err_0E_byte40\n\" ; g }") +dbg:command("bpset 0x3F55D330,,{ printf \"F_6BA66 err_0E_other\n\" ; g }") +dbg:command("bpset 0x3F55D510,,{ printf \"G_6BAA2 merge\n\" ; g }") +dbg:command("bpset 0x3F55D560,,{ printf \"H_6BAAC store_5a8\n\" ; g }") +dbg:command("bpset 0x3F55D5C0,,{ printf \"I_6BAB8 outcell_test a7=%08X\n\", d@(a13+0xff20) ; g }") +dbg:command("bpset 0x3F55D620,,{ printf \"J_6BAC4 err_0A\n\" ; g }") +print("XIE-MIN4 armed 10 breakpoints") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "min4") diff --git a/harness/mame/xie_min5.lua b/harness/mame/xie_min5.lua new file mode 100644 index 0000000..0a24669 --- /dev/null +++ b/harness/mame/xie_min5.lua @@ -0,0 +1,16 @@ +-- resolve the 0x6BAAC..0x6BAB8 contradiction (8 breakpoints) +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 0x3F53D820,,{ printf \"A_IDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 0x3F55D560,,{ printf \"H_STORE dst=%08X src=%08X\n\", d@(a13+0xff80), a7 ; g }") +dbg:command("bpset 0x3F55D590,,{ printf \"K_6BAB2 arg6=%08X\n\", d@(a13+0xff20) ; g }") +dbg:command("bpset 0x3F55D5B0,,{ printf \"L_6BAB6 a7=%08X\n\", a7 ; g }") +dbg:command("bpset 0x3F55D5C0,,{ printf \"M_6BAB8 a11=%08X outcell=%08X\n\", a11, d@(a11) ; g }") +dbg:command("bpset 0x3F55D5E0,,{ printf \"N_6BABC_jrlt_taken\n\" ; g }") +dbg:command("bpset 0x3F55D750,,{ printf \"O_6BAEA_okpath\n\" ; g }") +dbg:command("bpset 0x3F55DF10,,{ printf \"P_6BBE2_success\n\" ; g }") +print("XIE-MIN5 armed 8 breakpoints") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "min5") diff --git a/harness/mame/xie_min6.lua b/harness/mame/xie_min6.lua new file mode 100644 index 0000000..9dd8fce --- /dev/null +++ b/harness/mame/xie_min6.lua @@ -0,0 +1,14 @@ +-- slot 20 body: the four MOVK 0x8 sites (6 breakpoints) +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 0x3F53D820,,{ printf \"A_IDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 0x3F55E690,,{ printf \"S1_6ABD2_movk8\n\" ; g }") +dbg:command("bpset 0x3F55E2E0,,{ printf \"S2_6AC5C_movk8\n\" ; g }") +dbg:command("bpset 0x3F55E4B0,,{ printf \"S3_6AC96_movk8\n\" ; g }") +dbg:command("bpset 0x3F55E6A0,,{ printf \"S4_6ACD4_movk8\n\" ; g }") +dbg:command("bpset 0x3F555EE0,,{ printf \"ERR_EXIT_6AFDC\n\" ; g }") +print("XIE-MIN6 armed 6 breakpoints") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "min6") diff --git a/harness/mame/xie_min7.lua b/harness/mame/xie_min7.lua new file mode 100644 index 0000000..5300bb0 --- /dev/null +++ b/harness/mame/xie_min7.lua @@ -0,0 +1,14 @@ +-- baseline + DD dispatcher probe (6 breakpoints) +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 0x3F53D820,,{ printf \"A_IDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 0x3F400040,,{ printf \"D_ENTRY_0x40008 a0=%08X a1=%08X\n\", d@(a13+0xffe0), d@(a13+0xffc0) ; g }") +dbg:command("bpset 0x3F400430,,{ printf \"D_CALL_worker\n\" ; g }") +dbg:command("bpset 0x3F55DF10,,{ printf \"LK_SUCCESS_6BBE2\n\" ; g }") +dbg:command("bpset 0x3F555EE0,,{ printf \"S20_ERR_EXIT_6AFDC\n\" ; g }") +dbg:command("bpset 0x3F200000,,{ printf \"\" ; g }") +print("XIE-MIN7 armed") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "min7") diff --git a/harness/mame/xie_min8.lua b/harness/mame/xie_min8.lua new file mode 100644 index 0000000..abd4260 --- /dev/null +++ b/harness/mame/xie_min8.lua @@ -0,0 +1,12 @@ +-- DD dispatcher probe only (4 breakpoints, no junk) +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 0x3F53D820,,{ printf \"A_IDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 0x3F55DF10,,{ printf \"B_LK_SUCCESS_6BBE2\n\" ; g }") +dbg:command("bpset 0x3F400040,,{ printf \"C_DD_ENTRY\n\" ; g }") +dbg:command("bpset 0x3F400430,,{ printf \"D_DD_WORKER\n\" ; g }") +print("XIE-MIN8 armed 4 breakpoints") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "min8") diff --git a/harness/mame/xie_min9.lua b/harness/mame/xie_min9.lua new file mode 100644 index 0000000..423e642 --- /dev/null +++ b/harness/mame/xie_min9.lua @@ -0,0 +1,16 @@ +-- generated: bit = 0x3F200000 + file*8 +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 0x3F53D820,,{ printf \"IDSTORE\\n\" ; g }") +dbg:command("bpset 0x3F555C10,,{ printf \"JREQ_6AB82\\n\" ; g }") +dbg:command("bpset 0x3F555E90,,{ printf \"E8_1_6ABD2\\n\" ; g }") +dbg:command("bpset 0x3F5561A0,,{ printf \"TGT_6AC34\\n\" ; g }") +dbg:command("bpset 0x3F5562E0,,{ printf \"E8_2_6AC5C\\n\" ; g }") +dbg:command("bpset 0x3F5564B0,,{ printf \"E8_3_6AC96\\n\" ; g }") +dbg:command("bpset 0x3F5566A0,,{ printf \"E8_4_6ACD4\\n\" ; g }") +dbg:command("bpset 0x3F557EE0,,{ printf \"EXIT_6AFDC\\n\" ; g }") +print("XIE-MIN9 armed 8") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "min9") diff --git a/harness/mame/xie_outcell.lua b/harness/mame/xie_outcell.lua new file mode 100644 index 0000000..619e74d --- /dev/null +++ b/harness/mame/xie_outcell.lua @@ -0,0 +1,16 @@ +-- out-cell test instrumentation + stack positive control +local frames = 0 +local dbg = manager.machine.debugger +local cpu = manager.machine.devices[":maincpu"] +local sp = cpu.state["SP"].value +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F55D510,,{ printf \"T_MERGE\n\" ; g }") +dbg:command("bpset 3F55D5C0,,{ printf \"OUTCEL a11=%08X star=%08X a13f80=%08X a13ffa0=%08X\n\", a11, d@(a11), d@(a13+0xff80), d@(a13+0xffa0) ; g }") +dbg:command("bpset 3F55D7A0,,{ printf \"T_GATE a7=%08X a11=%08X\n\", a7, a11 ; g }") +dbg:command("bpset 3F553DA0,,{ printf \"S19RET a8=%08X\n\", a8 ; g }") +dbg:command(string.format("wpset %08X,100,w,1,{ printf \"SCTRL\n\" ; g }", sp - 0x100)) +print("XIE-OUTCEL armed 5 breakpoints + stack control at " .. string.format("%08X", sp-0x100)) +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "outcell") diff --git a/harness/mame/xie_outw.lua b/harness/mame/xie_outw.lua new file mode 100644 index 0000000..03b46ea --- /dev/null +++ b/harness/mame/xie_outw.lua @@ -0,0 +1,19 @@ +-- watch writes to the out-cell (caller frame local 0) + stack control +local frames = 0 +local dbg = manager.machine.debugger +local cpu = manager.machine.devices[":maincpu"] +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F55D5C0,,{ printf \"OUTCEL a11=%08X star=%08X\n\", a11, d@(a11) ; g }") +dbg:command("bpset 3F55D7A0,,{ printf \"T_GATE a7=%08X a11=%08X\n\", a7, a11 ; g }") +dbg:command("bpset 3F553DA0,,{ printf \"S19RET a8=%08X\n\", a8 ; g }") +dbg:command("wpset 00415720,8,w,1,{ printf \"OUTWRITE pc=%08X val=%08X\n\", pc, wpdata ; g }") +print("XIE-OUTW armed: 4 breakpoints + out-cell write watch at 00415720") +emu.register_frame_done(function() + frames = frames + 1 + local sp = cpu.state["SP"].value + if frames == 600 then + dbg:command(string.format("wpset %08X,100,w,1,{ printf \"SCTRL\n\" ; g }", sp - 0x100)) + print(string.format("stack control installed at %08X (sp=%08X)", sp - 0x100, sp)) + end + if frames >= 2000000 then machine:exit() end +end, "outw") diff --git a/harness/mame/xie_pc.lua b/harness/mame/xie_pc.lua new file mode 100644 index 0000000..7732561 --- /dev/null +++ b/harness/mame/xie_pc.lua @@ -0,0 +1,12 @@ +local cpu = manager.machine.devices[":maincpu"] +local n = 0 +local last = 0 +print("XIE-PC sampler armed") +emu.register_periodic(function() + n = n + 1 + local pc = cpu.state["PC"].value + if n % 40 == 0 and pc ~= last then + last = pc + print(string.format("PCSAMPLE %08X", pc & 0xFFFFFFFF)) + end +end) diff --git a/harness/mame/xie_pcfix.lua b/harness/mame/xie_pcfix.lua new file mode 100644 index 0000000..961168a --- /dev/null +++ b/harness/mame/xie_pcfix.lua @@ -0,0 +1,14 @@ +local cpu = manager.machine.devices[":maincpu"] +local dbg = manager.machine.debugger +local n = 0 +local last = 0 +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +print("XIE-PCFIX armed (poke + sampler)") +emu.register_periodic(function() + n = n + 1 + local pc = cpu.state["PC"].value + if n % 40 == 0 and pc ~= last then + last = pc + print(string.format("PCSAMPLE %08X", pc & 0xFFFFFFFF)) + end +end) diff --git a/harness/mame/xie_pg.lua b/harness/mame/xie_pg.lua new file mode 100644 index 0000000..85e62b1 --- /dev/null +++ b/harness/mame/xie_pg.lua @@ -0,0 +1,12 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("bpset 3F3B0210,,{ printf \"REJECT_0x36042 (dstdataptr/img_buff/scalution)\n\" ; g }") +dbg:command("bpset 3F3B17B0,,{ printf \"REJECT_0x362F6\n\" ; g }") +dbg:command("bpset 3F3B1990,,{ printf \"REJECT_0x36332\n\" ; g }") +dbg:command("bpset 3F3B8A60,,{ printf \"DDX_RET a8=%08X\n\", a8 ; g }") +print("XIE-PG armed 5") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "pg") diff --git a/harness/mame/xie_pg2.lua b/harness/mame/xie_pg2.lua new file mode 100644 index 0000000..37482b0 --- /dev/null +++ b/harness/mame/xie_pg2.lua @@ -0,0 +1,22 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("bpset 3F3B05D0,,{ printf \"r60BA a8=%08X\\n\", a8 ; g }") +dbg:command("bpset 3F3B06F0,,{ printf \"r60DE a8=%08X\\n\", a8 ; g }") +dbg:command("bpset 3F3B11F0,,{ printf \"r623E a8=%08X\\n\", a8 ; g }") +dbg:command("bpset 3F3B12B0,,{ printf \"r6256 a8=%08X\\n\", a8 ; g }") +dbg:command("bpset 3F3B1370,,{ printf \"r626E a8=%08X\\n\", a8 ; g }") +dbg:command("bpset 3F3B1430,,{ printf \"r6286 a8=%08X\\n\", a8 ; g }") +dbg:command("bpset 3F3B21E0,,{ printf \"r643C a8=%08X\\n\", a8 ; g }") +dbg:command("bpset 3F3B2300,,{ printf \"r6460 a8=%08X\\n\", a8 ; g }") +dbg:command("bpset 3F3B2560,,{ printf \"r64AC a8=%08X\\n\", a8 ; g }") +dbg:command("bpset 3F3B2700,,{ printf \"r64E0 a8=%08X\\n\", a8 ; g }") +dbg:command("bpset 3F3B5BD0,,{ printf \"r6B7A a8=%08X\\n\", a8 ; g }") +dbg:command("bpset 3F3B6610,,{ printf \"r6CC2 a8=%08X\\n\", a8 ; g }") +dbg:command("bpset 3F3B6670,,{ printf \"r6CCE a8=%08X\\n\", a8 ; g }") +dbg:command("bpset 3F3B67A0,,{ printf \"r6CF4 a8=%08X\\n\", a8 ; g }") +print("XIE-PG2 armed 15") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "pg2") diff --git a/harness/mame/xie_r48.lua b/harness/mame/xie_r48.lua new file mode 100644 index 0000000..00d24a0 --- /dev/null +++ b/harness/mame/xie_r48.lua @@ -0,0 +1,12 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F2DC420,,{ printf \"J884 rp=%08X b9=%02X (JREQ if 0)\n\", d@(0xa6000), b@(d@(0xa6000)+0x48) ; g }") +dbg:command("bpset 3F2DC440,,{ printf \"CONT_1B888 (flag non-zero)\n\" ; g }") +dbg:command("bpset 3F2DD180,,{ printf \"ERRCHAIN_1BA30 (flag was zero)\n\" ; g }") +dbg:command("bpset 3F2DDE00,,{ printf \"DRIVER_RET a8=%08X\n\", a8 ; g }") +print("XIE_R48 armed 5") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "r48") diff --git a/harness/mame/xie_rd.lua b/harness/mame/xie_rd.lua new file mode 100644 index 0000000..caf44e8 --- /dev/null +++ b/harness/mame/xie_rd.lua @@ -0,0 +1,14 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F2D8A90,,{ printf \"RD_ENTRY\n\" ; g }") +dbg:command("bpset 3F2D8BC0,,{ printf \"RD_ENAB flag=%08X\n\", d@(0xa6220) ; g }") +dbg:command("bpset 3F2D8C50,,{ printf \"RD_ALLOC rp=%08X\n\", a8 ; g }") +dbg:command("bpset 3F2D8D20,,{ printf \"RD_BADALLOC\n\" ; g }") +dbg:command("bpset 3F2D91C0,,{ printf \"RD_SRCBASE a5=%08X e28=%08X\n\", a5, d@(a5+0x28) ; g }") +dbg:command("bpset 3F2D94B0,,{ printf \"RP a11=%08X src_base610=%08X\n\", a11, d@(a11+0x610) ; g }") +print("XIE-RD armed 7") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "rd") diff --git a/harness/mame/xie_rd200.lua b/harness/mame/xie_rd200.lua new file mode 100644 index 0000000..3c935f9 --- /dev/null +++ b/harness/mame/xie_rd200.lua @@ -0,0 +1,4 @@ +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("wpset 05600200,10,r,1,{ printf \"R200 pc=%08X val=%04X\n\", pc, wpdata ; g }") +print("XIE-R200 armed") diff --git a/harness/mame/xie_regs.lua b/harness/mame/xie_regs.lua new file mode 100644 index 0000000..5520396 --- /dev/null +++ b/harness/mame/xie_regs.lua @@ -0,0 +1,13 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F5565F0,,{ printf \"REGS pc=%08X a0=%08X a1=%08X a2=%08X a3=%08X a4=%08X a5=%08X a6=%08X a7=%08X a8=%08X a9=%08X a10=%08X a11=%08X a13=%08X a14=%08X sp=%08X\\n\", pc, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a13, a14, sp ; g }") +dbg:command("bpset 3F5565F0,,{ printf \"L20=%08X LCO=%08X\\n\", d@(a13+0x20), d@(a13+0xc0) ; g }") +dbg:command("bpset 3F556610,,{ printf \"REGS pc=%08X a0=%08X a1=%08X a2=%08X a3=%08X a4=%08X a5=%08X a6=%08X a7=%08X a8=%08X a9=%08X a10=%08X a11=%08X a13=%08X a14=%08X sp=%08X\\n\", pc, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a13, a14, sp ; g }") +dbg:command("bpset 3F5566A0,,{ printf \"ACD4_BAD\\n\" ; g }") +dbg:command("bpset 3F5569A0,,{ printf \"OKPATH\\n\" ; g }") +print("XIE-REGS armed 6") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "regs") diff --git a/harness/mame/xie_resource.lua b/harness/mame/xie_resource.lua new file mode 100644 index 0000000..37eec69 --- /dev/null +++ b/harness/mame/xie_resource.lua @@ -0,0 +1,178 @@ +-- xie_resource.lua -- trace XIE requests and dump the created resource. +-- +-- Breakpoint 1: inside XieProc after A9 = client->requestBuffer. +-- Breakpoint 2: 0x6CAC8, just after the create helper has A9 = new resource. +-- +-- Run with -debuglog (printf output is discarded otherwise): +-- VT1200_SKIP_LEVEL1=1 XIE_FRAMES=2000000 \ +-- /home/arti/code/k-space/mame0289/vt1200 vt1200 ... -debug -debugger none \ +-- -debuglog -autoboot_script harness/mame/xie_resource.lua + +local function hex(v, w) return string.format("%0" .. (w or 8) .. "X", v) end +local machine = manager.machine +local cpu = machine.devices[':maincpu'] +local dbg = machine.debugger +if not dbg then print("XIE ERROR: no debugger"); machine:exit(); return end + +local FRAMES = tonumber(os.getenv("XIE_FRAMES") or "2000000") +local WPFILE = "/tmp/opencode/xie_wp.txt" +local lastwp = "" +local last_elem = 0 +local WORDS = tonumber(os.getenv("XIE_WORDS") or "16") +local TRACE = 0x3F525D40 -- XieProc interior, a9 = request buffer +local CREATE = 0x3F565640 -- 0x6CAC8: a9 = new resource pointer + +local args = {} +for i = 0, WORDS - 1 do args[#args + 1] = string.format("w@(a9+%d)", i * 16) end +local fmt = "XIEHIT buf=%08X" +for i = 0, WORDS - 1 do fmt = fmt .. " %04X" end +fmt = fmt .. "\\n" +dbg:command("bpset " .. hex(TRACE) .. ",,{ printf \"" .. fmt .. "\", a9, " .. + table.concat(args, ", ") .. " ; g }") + +dbg:command("bpset " .. hex(CREATE) .. + ",,{ printf \"RES a9=%08X id=%08X class=%02X b8=%02X b36=%02X b40=%08X b44=%08X\\n\", " .. + "a9, d@(a9), b@(a9+32), b@(a9+64), b@(a9+288), d@(a9+320), d@(a9+352) ; g }") + + +local LOOK = 0x3F55D1C0 -- 0x6BA38: a7 = resource +local bytes = {} +for k = 0, 15 do bytes[#bytes+1] = string.format("b@(a7+%d)", k*32) end +local bfmt = string.rep(" %02X", 16) +dbg:command("bpset " .. hex(LOOK) .. + ",,{ printf \"LOOK a7=%08X id=%08X cls=%02X b36=%02X b40=%08X" .. bfmt .. "\\n\", " .. + "a7, d@(a7), b@(a7+32), b@(a7+288), d@(a7+320), " .. table.concat(bytes, ", ") .. " ; g }") + +-- Debug-only nudge: when a class-2 resource reaches the lookup, make it class 3 +-- so PUT_TILE's hard-coded class check passes. Proves the rest of the pixel path. +-- Debug-only: skip the class-compare failure branch (0x6BAF6 -> 0x6BBCE). + + +local BAND = 0x3F555C40 -- 0x6AB88: a11 = band record, a9 = slot20 request +dbg:command("bpset " .. hex(BAND) .. + ",,{ printf \"BAND a11=%08X f1=%02X f2=%02X f4=%08X f8=%08X f12=%08X f16=%08X\\n\", " .. + "a11, b@(a11+8), b@(a11+16), d@(a11+32), d@(a11+64), d@(a11+96), d@(a11+128) ; g }") + + +dbg:command("bpset 0x3F400430,,{ printf \"DDCALL a11=%08X type=%02X idx=%08X\\n\", a11, b@(a13+0xffa0), d@(a13+0x20) ; g }") + + +dbg:command("bpset 0x3F400040,,{ printf \"DE entry a0=%08X a1=%08X type=%02X idx=%08X\\n\", d@(a13+0xffe0), d@(a13+0xffc0), b@(a13+0xffa0), d@(a13+0x20) ; g }") +dbg:command("bpset 0x3F4000F0,,{ printf \"DE chk1 ret=%08X\\n\", a8 ; g }") +dbg:command("bpset 0x3F400210,,{ printf \"DE chk2 ret=%08X\\n\", a8 ; g }") + + +dbg:command("bpset 0x3F55B440,,{ printf \"HANDOFF a9=%08X\\n\", a9 ; g }") +dbg:command("bpset 0x3F55B750,,{ printf \"DEARG a9=%08X a11=%08X\\n\", a9, a11 ; g }") + + +dbg:command("bpset 0x3F553B70,,{ printf \"S19ENTRY\\n\" ; g }") +dbg:command("bpset 0x3F55B440,,{ printf \"H688 a9=%08X\\n\", a9 ; g }") +dbg:command("bpset 0x3F400040,,{ printf \"DEENTRY\\n\" ; g }") + + +dbg:command("bpset 0x3F553DA0,,{ printf \"S19LOOK a8=%08X\\n\", a8 ; g }") +dbg:command("bpset 0x3F554D10,,{ printf \"S19HANDOFF\\n\" ; g }") + + +dbg:command("bpset 0x3F52DE80,,{ printf \"S43OBJ a8=%08X\\n\", a8 ; g }") +dbg:command("bpset 0x3F52E230,,{ printf \"S43ID a5=%08X req8=%08X\\n\", a5, d@(a9+0x40) ; g }") + + +dbg:command("bpset 0x3F566070,,{ printf \"RESPTR a7=%08X a9=%08X\\n\", a7, a9 ; g }") + + +dbg:command("bpset 0x3F2D8A90,,{ printf \"EXPORTENTRY\\n\" ; g }") +dbg:command("bpset 0x3F2D8BC0,,{ printf \"EXPORTFLAG f=%02X\\n\", b@(0xA6220) ; g }") +dbg:command("bpset 0x3F2DC0D0,,{ printf \"EXPORTSKIPPED\\n\" ; g }") + +dbg:command("bpset 0x3F2DF610,,{ printf \"ELTYPE i=%d t=%02X\n\", d@(a13+0x180), b@(a9+0x58) ; g }") +dbg:command("bpset 0x3F2DF530,,{ printf \"BADFUNC i=%d\n\", d@(a13+0x180) ; g }") +dbg:command("bpset 0x3F2DF400,,{ printf \"PIPE_T1\n\" ; g }") +dbg:command("bpset 0x3F2DEA80,,{ printf \"PIPE_T2\n\" ; g }") +dbg:command("bpset 0x3F2DE990,,{ printf \"PIPE_T3\n\" ; g }") +dbg:command("bpset 0x3F2DE3A0,,{ printf \"PIPE_T4\n\" ; g }") +dbg:command("bpset 0x3F2DF850,,{ printf \"PIPE_LOOPEND i=%d\n\", d@(a13+0x180) ; g }") + +dbg:command("bpset 0x3F2D91A0,,{ printf \"EX_BAND a5=%08X elem@d8=%08X\n\", a5, d@(a5+0xd8) ; g }") +dbg:command("bpset 0x3F2D91C0,,{ printf \"EX_ELEM a5=%08X f28=%08X\n\", a5, d@(a5+0x28) ; g }") +dbg:command("bpset 0x3F2DD410,,{ printf \"EX_TIMING\n\" ; g }") + +dbg:command("bpset 0x3F55D950,,{ printf \"PUTCHK n=%d obj=%08X b8=%02X b12=%02X\n\", d@(a13+0xff20), a11, b@(a11+0x40), b@(a11+0x60) ; g }") +dbg:command("bpset 0x3F55DA50,,{ printf \"PUT_BADMATCH_byte12 n=%d\n\", d@(a13+0xff20) ; g }") +dbg:command("bpset 0x3F55DF10,,{ printf \"PUT_OK_byte8 n=%d\n\", d@(a13+0xff20) ; g }") + +dbg:command("bpset 0x3F2D91A0,,{ printf \"BANDFIELDS 48=%08X 80=%08X a0=%08X 160=%08X d8=%08X\n\", d@(a5+0x48), d@(a5+0x80), d@(a5+0xa0), d@(a5+0x160), d@(a5+0xd8) ; g }") +dbg:command("bpset 0x3F2D94B0,,{ printf \"RP 5a8=%08X 5d0=%08X 5f0=%08X 610=%08X 6f8=%08X 718=%08X 738=%08X 758=%08X\n\", d@(a11+0x5a8), d@(a11+0x5d0), d@(a11+0x5f0), d@(a11+0x610), d@(a11+0x6f8), d@(a11+0x718), d@(a11+0x738), d@(a11+0x758) ; g }") + +dbg:command("bpset 0x3F54BFF0,,{ printf \"TRAMP minor=%02X target=%08X req=%08X\n\", b@(a10+0x8), d@(a11), a10 ; g }") +dbg:command("bpset 0x3F54C000,,{ printf \"TRAMPCALL target=%08X\n\", a11 ; g }") + +dbg:command("bpset 0x3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 0x3F53D9A0,,{ printf \"REGISTER id=%08X\n\", d@(a9+0x40) ; g }") + +-- empirical argument/return map of the slot-19 lookup helper (file 0x66FA0) +dbg:command("bpset 0x3F537DA0,,{ printf \"LKARGS a0=%08X a1=%08X a2=%08X a3=%08X a4=%08X\n\", d@(a13+0xffe0), d@(a13+0xffc0), d@(a13+0xffa0), d@(a13+0xff80), d@(a13+0xff60) ; g }") +dbg:command("bpset 0x3F537E70,,{ printf \"LKCALLED a8=%08X\n\", a8 ; g }") +dbg:command("bpset 0x3F537E90,,{ printf \"LKDISPATCH a8=%08X\n\", a8 ; g }") + +dbg:command("bpset 0x3F55D630,,{ printf \"ERR_0A_badaccess\n\" ; g }") +dbg:command("bpset 0x3F55DA60,,{ printf \"ERR_08_badmatch\n\" ; g }") +dbg:command("bpset 0x3F55CD70,,{ printf \"ERR_0E_lookup0\n\" ; g }") +dbg:command("bpset 0x3F55D2C0,,{ printf \"ERR_0E_byte40_nonzero\n\" ; g }") +dbg:command("bpset 0x3F55D400,,{ printf \"ERR_0E_other\n\" ; g }") +dbg:command("bpset 0x3F55D530,,{ printf \"ERR_0E_other2\n\" ; g }") + +dbg:command("bpset 0x3F2FD2F0,,{ printf \"EB -10=%08X -0c=%08X -8=%08X -4=%08X sp=%08X +4=%08X +8=%08X +c=%08X\n\", d@(sp-0x10), d@(sp-0xc), d@(sp-8), d@(sp-4), d@(sp), d@(sp+4), d@(sp+8), d@(sp+0xc) ; g }") + +dbg:command("bpset 0x3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X obj=%08X objb0=%02X\n\", a7, a11, d@(a13+0xffa0), b@(d@(a13+0xffa0)) ; g }") + +dbg:command("bpset 0x3F55D460,,{ printf \"OBJDISP a11=%08X b0=%02X b4=%02X b8=%02X b12=%02X b16=%02X\n\", a11, b@(a11), b@(a11+0x20), b@(a11+0x40), b@(a11+0x60), b@(a11+0x80) ; g }") +dbg:command("bpset 0x3F55D7B0,,{ printf \"GATEPASS\n\" ; g }") + +dbg:command("bpset 0x3F55DA50,,{ printf \"E8_select12\n\" ; g }") +dbg:command("bpset 0x3F55DC30,,{ printf \"E8_maskcheck\n\" ; g }") +dbg:command("bpset 0x3F55D7A0,,{ printf \"GATE2 a7=%08X a11=%08X\n\", a7, a11 ; g }") + +dbg:command("bpset 0x3F55D7C0,,{ printf \"E8_MAIN_0BAF8\n\" ; g }") +dbg:command("bpset 0x3F55CE20,,{ printf \"CLASS1_PATH\n\" ; g }") +dbg:command("bpset 0x3F55D440,,{ printf \"SELECTOR_DISPATCH\n\" ; g }") +local frames = 0 +emu.register_frame_done(function() + frames = frames + 1 + if frames % 1000 == 0 then + print(string.format("XIE: frame %d pc=%s", frames, hex(cpu.state['PC'].value))) + end + local f = io.open(WPFILE, "r") + if f then + local txt = f:read("*l"); f:close() + if txt and txt ~= lastwp then + lastwp = txt + local r = tonumber(txt) + if r then + local sp = cpu.spaces['program'] + local band = sp:read_u32(r + 36*8) + local p44 = sp:read_u32(r + 44*8) + local b30 = sp:read_u32(band + 48*8) + local elem = 0 + if p44 ~= 0 then elem = sp:read_u32(p44 + 0xd8) end + if elem ~= 0 and elem ~= last_elem then + last_elem = elem + dbg:command(string.format("wpset %08X,32,w,1,{ printf \"WPELEM addr=%08X data=%08X\\n\", wpaddr, wpdata ; g }", elem + 0x28)) + print(string.format("XIE: elem=%08X wpset elem+0x28", elem)) + end + print(string.format("XIE: watch res=%08X band=%08X p44=%08X b30=%08X", r, band, p44, b30)) + local function wp(a, label) + if a and a ~= 0 then + dbg:command(string.format("wpset %08X,64,w,1,{ printf \"WPHIT %s addr=%%08X data=%%08X\\n\", wpaddr, wpdata ; g }", a, label)) + end + end + wp(r, "res"); wp(band, "band"); wp(p44, "p44"); wp(b30, "b30") + end + end + end + if frames >= FRAMES then machine:exit() end +end, "vt1200-xie-resource") + +dbg.visible_cpu = cpu +dbg.execution_state = 'run' \ No newline at end of file diff --git a/harness/mame/xie_rp20.lua b/harness/mame/xie_rp20.lua new file mode 100644 index 0000000..59640f7 --- /dev/null +++ b/harness/mame/xie_rp20.lua @@ -0,0 +1,12 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F3CFAC0,,{ printf \"RP20 rp=%08X byte4=%02X -> forcing 1\n\", d@(0xa6000), b@(d@(0xa6000)+0x20) ; w@(d@(0xa6000)+0x20)=1 ; g }") +dbg:command("bpset 3F3CFAF0,,{ printf \"RP20_STILL_ZERO\n\" ; g }") +dbg:command("bpset 3F3CFB20,,{ printf \"RP20_OK_CONTINUE\n\" ; g }") +dbg:command("bpset 3F2DC290,,{ printf \"AFTER_FINALIZE a8=%08X\n\", a8 ; g }") +print("XIE-RP20 armed 5") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "rp20") diff --git a/harness/mame/xie_s19.lua b/harness/mame/xie_s19.lua new file mode 100644 index 0000000..4a01322 --- /dev/null +++ b/harness/mame/xie_s19.lua @@ -0,0 +1,14 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F553D70,,{ printf \"S19CALL\\n\" ; g }") +dbg:command("bpset 3F553DA0,,{ printf \"S19RET a8=%08X\\n\", a8 ; g }") +dbg:command("bpset 3F55CB30,,{ printf \"CALLEE_ENTRY\\n\" ; g }") +dbg:command("bpset 3F55D0F0,,{ printf \"CALLEE_C2\\n\" ; g }") +dbg:command("bpset 3F55D460,,{ printf \"CALLEE_DISP cls=%%02X\\n\", b@(a11+0x20) ; g }") +dbg:command("bpset 3F55CCE0,,{ printf \"CALLEE_NULL_0E\\n\" ; g }") +print("XIE-S19 armed 7") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "s19") diff --git a/harness/mame/xie_s19b.lua b/harness/mame/xie_s19b.lua new file mode 100644 index 0000000..a18e729 --- /dev/null +++ b/harness/mame/xie_s19b.lua @@ -0,0 +1,13 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F55DE70,,{ printf \"SEL_DISP fmt=%%02X\\n\", b@(a13+0xff40) ; g }") +dbg:command("bpset 3F55DA50,,{ printf \"MASK_A_8\\n\" ; g }") +dbg:command("bpset 3F55DC30,,{ printf \"MASK_B_8\\n\" ; g }") +dbg:command("bpset 3F55D620,,{ printf \"ERR_0A\\n\" ; g }") +dbg:command("bpset 3F55DF10,,{ printf \"OK_PATH\\n\" ; g }") +print("XIE-S19B armed 6") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "s19b") diff --git a/harness/mame/xie_s19p.lua b/harness/mame/xie_s19p.lua new file mode 100644 index 0000000..eae5b98 --- /dev/null +++ b/harness/mame/xie_s19p.lua @@ -0,0 +1,14 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F553DF0,,{ printf \"S19_7BE\\n\" ; g }") +dbg:command("bpset 3F554280,,{ printf \"S19_850\\n\" ; g }") +dbg:command("bpset 3F554D10,,{ printf \"S19_9A2_handoff_call\\n\" ; g }") +dbg:command("bpset 3F555210,,{ printf \"S19_A42\\n\" ; g }") +dbg:command("bpset 3F555250,,{ printf \"S19_ERR_EXIT\\n\" ; g }") +dbg:command("bpset 3F553DA0,,{ printf \"S19RET a8=%08X\\n\", a8 ; g }") +print("XIE-S19P armed 7") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "s19p") diff --git a/harness/mame/xie_s19q.lua b/harness/mame/xie_s19q.lua new file mode 100644 index 0000000..dca0bf2 --- /dev/null +++ b/harness/mame/xie_s19q.lua @@ -0,0 +1,13 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F554250,,{ printf \"S19_C0 c0=%%08X c0s=%%d\\n\", d@(a13+0xc0), d@(a13+0xc0) ; g }") +dbg:command("bpset 3F554290,,{ printf \"S19_852 a7=%%08X a5=%%08X\\n\", a7, a5 ; g }") +dbg:command("bpset 3F5543E0,,{ printf \"S19_87C_mainpath\\n\" ; g }") +dbg:command("bpset 3F554D10,,{ printf \"S19_9A2_HANDOFF\\n\" ; g }") +dbg:command("bpset 3F555250,,{ printf \"S19_EXIT a8=%%08X\\n\", a8 ; g }") +print("XIE-S19Q armed 6") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "s19q") diff --git a/harness/mame/xie_s19r.lua b/harness/mame/xie_s19r.lua new file mode 100644 index 0000000..973b9f4 --- /dev/null +++ b/harness/mame/xie_s19r.lua @@ -0,0 +1,17 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\\n\", a7, a11 ; g }") +dbg:command("bpset 3F554460,,{ printf \"S88C word5=%08X\\n\", d@(a9+0xc0) ; g }") +dbg:command("bpset 3F5544B0,,{ printf \"S896\\n\" ; g }") +dbg:command("bpset 3F5544D0,,{ printf \"S89A bit0test\\n\" ; g }") +dbg:command("bpset 3F554520,,{ printf \"S8A4_importloop\\n\" ; g }") +dbg:command("bpset 3F554D10,,{ printf \"S9A2_HANDOFF_CALL\\n\" ; g }") +dbg:command("bpset 3F555140,,{ printf \"SAA28_skip_exit\\n\" ; g }") +dbg:command("bpset 3F555080,,{ printf \"SAA10_other\\n\" ; g }") +dbg:command("bpset 3F553DA0,,{ printf \"S19RET a8=%08X\\n\", a8 ; g }") +print("XIE-S19R armed 10") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "s19r") diff --git a/harness/mame/xie_s19x.lua b/harness/mame/xie_s19x.lua new file mode 100644 index 0000000..b80771d --- /dev/null +++ b/harness/mame/xie_s19x.lua @@ -0,0 +1,15 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F5544B0,,{ printf \"S896 plane_mask=%08X\n\", d@(a9+0xc0) ; g }") +dbg:command("bpset 3F554500,,{ printf \"S8A0 bit0test\n\" ; g }") +dbg:command("bpset 3F554520,,{ printf \"S8A4_import_loop\n\" ; g }") +dbg:command("bpset 3F554C70,,{ printf \"S98E_ELEM28_STORE val=%08X\n\", d@(a13+0x120) ; g }") +dbg:command("bpset 3F554D10,,{ printf \"S9A2_handoff_call\n\" ; g }") +dbg:command("bpset 3F555140,,{ printf \"SAA28_skip_exit\n\" ; g }") +dbg:command("bpset 3F55B200,,{ printf \"H_ENTRY\n\" ; g }") +print("XIE-S19X armed 8") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "s19x") diff --git a/harness/mame/xie_s43.lua b/harness/mame/xie_s43.lua new file mode 100644 index 0000000..756991c --- /dev/null +++ b/harness/mame/xie_s43.lua @@ -0,0 +1,13 @@ +-- log slot-43 double comparison operands (generated addresses) +local frames = 0 +local dbg = manager.machine.debugger +local cpu = manager.machine.devices[":maincpu"] +local cmp1 = 0x3F200000 + 0x658B8*8 +local cmp2 = 0x3F200000 + 0x656B0*8 +dbg:command(string.format("bpset %08X,,{ printf \"CMP900 a0=%%08X a1=%%08X\n\", d@(a13+0x0), d@(a13+0x20) ; g }", cmp1)) +dbg:command(string.format("bpset %08X,,{ printf \"CMP740 a0=%%08X a1=%%08X\n\", d@(a13+0x0), d@(a13+0x20) ; g }", cmp2)) +print("XIE-S43 armed 2 breakpoints") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "s43") diff --git a/harness/mame/xie_s43b.lua b/harness/mame/xie_s43b.lua new file mode 100644 index 0000000..33405f3 --- /dev/null +++ b/harness/mame/xie_s43b.lua @@ -0,0 +1,12 @@ +-- slot 43: log the lookup return and the two id words +local frames = 0 +local dbg = manager.machine.debugger +local after = 0x3F200000 + 0x65646*8 +local idstore = 0x3F200000 + 0x67B04*8 +dbg:command(string.format("bpset %08X,,{ printf \"S43AFTERLOOKUP a8=%%08X w0=%%08X w1=%%08X\n\", a8, d@(a9+0x20), d@(a9+0x40) ; g }", after)) +dbg:command(string.format("bpset %08X,,{ printf \"IDSTORE id=%%08X obj=%%08X\n\", d@(a9+0x40), a11 ; g }", idstore)) +print("XIE-S43B armed 2 breakpoints") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "s43b") diff --git a/harness/mame/xie_s43c.lua b/harness/mame/xie_s43c.lua new file mode 100644 index 0000000..afac31d --- /dev/null +++ b/harness/mame/xie_s43c.lua @@ -0,0 +1,20 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command(string.format("bpset 3F52B230,,{ printf \"LOOKUP_OK\\n\" ; g }")) +dbg:command(string.format("bpset 3F52B530,,{ printf \"P_A\\n\" ; g }")) +dbg:command(string.format("bpset 3F52B700,,{ printf \"P_B\\n\" ; g }")) +dbg:command(string.format("bpset 3F52BB50,,{ printf \"P_C\\n\" ; g }")) +dbg:command(string.format("bpset 3F52BDC0,,{ printf \"P_D\\n\" ; g }")) +dbg:command(string.format("bpset 3F52C1C0,,{ printf \"P_E\\n\" ; g }")) +dbg:command(string.format("bpset 3F52C280,,{ printf \"P_F\\n\" ; g }")) +dbg:command(string.format("bpset 3F52C3D0,,{ printf \"P_G\\n\" ; g }")) +dbg:command(string.format("bpset 3F52C4A0,,{ printf \"P_H\\n\" ; g }")) +dbg:command(string.format("bpset 3F52C600,,{ printf \"BAD_1\\n\" ; g }")) +dbg:command(string.format("bpset 3F52C650,,{ printf \"OK_1\\n\" ; g }")) +dbg:command(string.format("bpset 3F52CC60,,{ printf \"BAD_2\\n\" ; g }")) +dbg:command(string.format("bpset 3F52CC50,,{ printf \"P_I\\n\" ; g }")) +print("XIE-S43C armed 13") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "s43c") diff --git a/harness/mame/xie_s43d.lua b/harness/mame/xie_s43d.lua new file mode 100644 index 0000000..ee98b88 --- /dev/null +++ b/harness/mame/xie_s43d.lua @@ -0,0 +1,16 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command(string.format("bpset 3F52B230,,{ printf \"S43_LOOKUP\\n\" ; g }")) +dbg:command(string.format("bpset 3F52D1D0,,{ printf \"S43_TAIL_A\\n\" ; g }")) +dbg:command(string.format("bpset 3F52DBC0,,{ printf \"S43_TAIL_B\\n\" ; g }")) +dbg:command(string.format("bpset 3F52DE80,,{ printf \"S43_SET3\\n\" ; g }")) +dbg:command(string.format("bpset 3F52DE90,,{ printf \"S43_STORE3\\n\" ; g }")) +dbg:command(string.format("bpset 3F52DFC0,,{ printf \"S43_RENDER\\n\" ; g }")) +dbg:command(string.format("bpset 3F52E4F0,,{ printf \"S43_EXIT0\\n\" ; g }")) +dbg:command(string.format("bpset 3F52C600,,{ printf \"S43_BAD1\\n\" ; g }")) +dbg:command(string.format("bpset 3F52CC60,,{ printf \"S43_BAD2\\n\" ; g }")) +print("XIE-S43D armed 9") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "s43d") diff --git a/harness/mame/xie_s43e.lua b/harness/mame/xie_s43e.lua new file mode 100644 index 0000000..6a37629 --- /dev/null +++ b/harness/mame/xie_s43e.lua @@ -0,0 +1,16 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F52DFF0,,{ printf \"T_RENDER_RET a8=%08X\\n\", a8 ; g }") +dbg:command("bpset 3F52E010,,{ printf \"T_JREQ\\n\" ; g }") +dbg:command("bpset 3F52E030,,{ printf \"T_FREE\\n\" ; g }") +dbg:command("bpset 3F52E230,,{ printf \"T_MERGE\\n\" ; g }") +dbg:command("bpset 3F52E3D0,,{ printf \"T_PREC88\\n\" ; g }") +dbg:command("bpset 3F52E470,,{ printf \"T_RET88 a8=%08X\\n\", a8 ; g }") +dbg:command("bpset 3F52E490,,{ printf \"T_PREC98\\n\" ; g }") +dbg:command("bpset 3F52E4F0,,{ printf \"T_EXIT0\\n\" ; g }") +dbg:command("bpset 3F52B230,,{ printf \"T_LOOKUP_OK\\n\" ; g }") +print("XIE-S43E armed 9") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "s43e") diff --git a/harness/mame/xie_s44.lua b/harness/mame/xie_s44.lua new file mode 100644 index 0000000..a0caea0 --- /dev/null +++ b/harness/mame/xie_s44.lua @@ -0,0 +1,14 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F52DFD0,,{ printf \"S44_RENDER_CALL\\n\" ; g }") +dbg:command("bpset 3F2D95C0,,{ printf \"TYPE1\\n\" ; g }") +dbg:command("bpset 3F2D9B10,,{ printf \"TYPE2\\n\" ; g }") +dbg:command("bpset 3F2D9C50,,{ printf \"TYPE3\\n\" ; g }") +dbg:command("bpset 3F2DA0D0,,{ printf \"TYPE4\\n\" ; g }") +dbg:command("bpset 3F2DBB10,,{ printf \"TYPE5\\n\" ; g }") +print("XIE-S44 armed") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "s44") diff --git a/harness/mame/xie_s44b.lua b/harness/mame/xie_s44b.lua new file mode 100644 index 0000000..a4d92bf --- /dev/null +++ b/harness/mame/xie_s44b.lua @@ -0,0 +1,14 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F52FAA0,,{ printf \"S44_RENDER\\n\" ; g }") +dbg:command("bpset 3F2D95C0,,{ printf \"TYPE1\\n\" ; g }") +dbg:command("bpset 3F2D9B10,,{ printf \"TYPE2\\n\" ; g }") +dbg:command("bpset 3F2DA350,,{ printf \"TYPE3\\n\" ; g }") +dbg:command("bpset 3F2DA7A0,,{ printf \"TYPE4\\n\" ; g }") +dbg:command("bpset 3F2DAC10,,{ printf \"TYPE5\\n\" ; g }") +print("XIE-S44B armed 7") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "s44b") diff --git a/harness/mame/xie_s44c.lua b/harness/mame/xie_s44c.lua new file mode 100644 index 0000000..f7a7c7b --- /dev/null +++ b/harness/mame/xie_s44c.lua @@ -0,0 +1,11 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F52EDB0,,{ printf \"S44_CREATE_RET a8=%08X\\n\", a8 ; g }") +dbg:command("bpset 3F52EF30,,{ printf \"S44_ERRPATH\\n\" ; g }") +dbg:command("bpset 3F2D9B10,,{ printf \"TYPE2\\n\" ; g }") +print("XIE-S44C armed 4") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "s44c") diff --git a/harness/mame/xie_scl.lua b/harness/mame/xie_scl.lua new file mode 100644 index 0000000..9b19505 --- /dev/null +++ b/harness/mame/xie_scl.lua @@ -0,0 +1,11 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("bpset 3FB172A0,,{ printf \"POLL status=%04X\n\", d@(0x5600010) ; g }") +dbg:command("bpset 3FB173D0,,{ printf \"SCALUTION_TIMEOUT\n\" ; g }") +dbg:command("bpset 3FB17470,,{ printf \"SCALUTION_READY -> continue\n\" ; g }") +print("XIE-SCL armed 4") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "scl") diff --git a/harness/mame/xie_scl2.lua b/harness/mame/xie_scl2.lua new file mode 100644 index 0000000..a79b757 --- /dev/null +++ b/harness/mame/xie_scl2.lua @@ -0,0 +1,11 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("bpset 3FB172D0,,{ printf \"CPU_READ a9=%04X (bit1=%d)\n\", a9, (a9>>1)&1 ; g }") +dbg:command("bpset 3FB173D0,,{ printf \"TIMEOUT\n\" ; g }") +dbg:command("bpset 3FB17470,,{ printf \"READY\n\" ; g }") +print("XIE-SCL2 armed") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "scl2") diff --git a/harness/mame/xie_sel.lua b/harness/mame/xie_sel.lua new file mode 100644 index 0000000..8fb1a5b --- /dev/null +++ b/harness/mame/xie_sel.lua @@ -0,0 +1,15 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\\n\", a7, a11 ; g }") +dbg:command("bpset 3F55DE70,,{ printf \"SELD selector=%08X\\n\", d@(a13+0xff40) ; g }") +dbg:command("bpset 3F55D980,,{ printf \"SELA_CMP a7=%08X a11=%08X\\n\", a7, a11 ; g }") +dbg:command("bpset 3F55DA50,,{ printf \"SELA_BAD8\\n\" ; g }") +dbg:command("bpset 3F55DC10,,{ printf \"SELB_CMP a7=%08X a11=%08X\\n\", a7, a11 ; g }") +dbg:command("bpset 3F55DC30,,{ printf \"SELB_BAD8\\n\" ; g }") +dbg:command("bpset 3F55DF10,,{ printf \"OK_6BBE2\\n\" ; g }") +print("XIE-SEL armed 8") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "sel") diff --git a/harness/mame/xie_src.lua b/harness/mame/xie_src.lua new file mode 100644 index 0000000..9627b29 --- /dev/null +++ b/harness/mame/xie_src.lua @@ -0,0 +1,10 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F2D91C0,,{ printf \"SRCBASE_ST a5=%08X elem28=%08X rp=%08X\n\", a5, d@(a5+0x28), a11 ; g }") +dbg:command("bpset 3F2D94B0,,{ printf \"RP a11=%08X src_base610=%08X\n\", a11, d@(a11+0x610) ; g }") +print("XIE-SRC armed 3") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "src") diff --git a/harness/mame/xie_st.lua b/harness/mame/xie_st.lua new file mode 100644 index 0000000..fdae8d7 --- /dev/null +++ b/harness/mame/xie_st.lua @@ -0,0 +1,9 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("bpset 3FB2A950,,{ printf \"ST b1=%08X mem=%04X\n\", b1, d@(b1) ; g }") +print("XIE-ST armed") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "st") diff --git a/harness/mame/xie_stage.lua b/harness/mame/xie_stage.lua new file mode 100644 index 0000000..a13546f --- /dev/null +++ b/harness/mame/xie_stage.lua @@ -0,0 +1,4 @@ +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("wpset 004FE780,200,w,1,{ printf \"STG %08X %04X\n\", wpaddr, wpdata ; g }") +print("XIE-STG armed (0x4FE780..0x4FE97F)") diff --git a/harness/mame/xie_stg2.lua b/harness/mame/xie_stg2.lua new file mode 100644 index 0000000..5b40e1d --- /dev/null +++ b/harness/mame/xie_stg2.lua @@ -0,0 +1,4 @@ +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("wpset 004FE780,400,w,1,{ printf \"SW %08X %04X %08X\n\", wpaddr, wpdata, pc ; g }") +print("XIE-STG2 armed") diff --git a/harness/mame/xie_stg3.lua b/harness/mame/xie_stg3.lua new file mode 100644 index 0000000..8a294ae --- /dev/null +++ b/harness/mame/xie_stg3.lua @@ -0,0 +1,4 @@ +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("wpset 004FE780,1000,w,1,{ printf \"SW %08X %04X %08X\n\", wpaddr, wpdata, pc ; g }") +print("XIE-STG3 armed (0x4FE780..0x4FE97F, 512 bytes)") diff --git a/harness/mame/xie_stgr.lua b/harness/mame/xie_stgr.lua new file mode 100644 index 0000000..0515672 --- /dev/null +++ b/harness/mame/xie_stgr.lua @@ -0,0 +1,4 @@ +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("wpset 004FE780,200,r,1,{ printf \"SR %08X pc=%08X\n\", wpaddr, pc ; g }") +print("XIE-STGR armed (reads of the staging buffer)") diff --git a/harness/mame/xie_stgrw.lua b/harness/mame/xie_stgrw.lua new file mode 100644 index 0000000..74ea508 --- /dev/null +++ b/harness/mame/xie_stgrw.lua @@ -0,0 +1,4 @@ +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("wpset 004FE780,800,rw,1,{ printf \"S%c %08X %04X %08X\n\", (wpaddr>0 and 0 or 0), wpaddr, wpdata, pc ; g }") +print("XIE-STGRW armed") diff --git a/harness/mame/xie_store.lua b/harness/mame/xie_store.lua new file mode 100644 index 0000000..3232fc6 --- /dev/null +++ b/harness/mame/xie_store.lua @@ -0,0 +1,11 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F55D560,,{ printf \"STORE a7=%08X src120=%08X a11=%08X dst120=%08X argA0=%08X arg80=%08X\n\", a7, d@(a7+0x120), a11, d@(a11+0x120), d@(a13+0xffa0), d@(a13+0xff80) ; g }") +dbg:command("bpset 3F55D5C0,,{ printf \"OUTCEL a11=%08X star=%08X\n\", a11, d@(a11) ; g }") +dbg:command("bpset 3F553DA0,,{ printf \"S19RET a8=%08X\n\", a8 ; g }") +print("XIE-STORE armed 4 breakpoints") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "store") diff --git a/harness/mame/xie_trace.lua b/harness/mame/xie_trace.lua new file mode 100644 index 0000000..1de35a6 --- /dev/null +++ b/harness/mame/xie_trace.lua @@ -0,0 +1,80 @@ +-- xie_trace.lua -- capture XIE 2.3 request buffers as they reach the server. +-- +-- The breakpoint sits INSIDE XieProc, immediately after it loads +-- A9 = client->requestBuffer (0x64BA2) and before it reads stuff->opcode, +-- i.e. at Ghidra 0x64BA8 = bit 0x3F525D40. At that point A9 is the request +-- buffer pointer, so the whole request can be read with w@ (16-bit words, which +-- is the CPU's native access width on this bit-addressed space). +-- +-- M=/home/arti/code/k-space/mame0289/vt1200 +-- XIE_FRAMES=1500 $M vt1200 -rompath harness/mame/roms -video none -sound none \ +-- -nothrottle -debug -debugger none \ +-- -autoboot_script harness/mame/xie_trace.lua -autoboot_delay 0 +-- +-- Env: +-- XIE_FRAMES frame budget (default 1500) +-- XIE_WORDS request words dumped per hit (default 8 = 16 bytes) +-- XIE_JIT if set, jump to this bit address at XIE_AT (debugger entry) +-- XIE_AT frame at which XIE_JIT is taken (default 400) + +local function hex(v, w) return string.format("%0" .. (w or 8) .. "X", v) end + +local machine = manager.machine +local cpu = machine.devices[':maincpu'] +local dbg = machine.debugger + +if not dbg then + print("XIE ERROR: debugger not enabled; pass -debug") + machine:exit() + return +end + +local FRAMES = tonumber(os.getenv("XIE_FRAMES") or "1500") +local WORDS = tonumber(os.getenv("XIE_WORDS") or "8") +local JIT = os.getenv("XIE_JIT") +local AT = tonumber(os.getenv("XIE_AT") or "400") +local IDLE = 0x3FDCE400 -- level-0 diagnostics menu idle loop + +-- XieProc interior: A9 = request buffer. XIE_TRACE overrides it, which is only +-- useful as a control: point it at a hot PC (e.g. the menu idle 3FDCE400) and +-- confirm the breakpoint+printf machinery actually fires. +local TRACE = tonumber(os.getenv("XIE_TRACE") or "0x3F525D40") +-- XieProc entry (count only) +local ENTRY = 0x3F525CC0 + +local action +if WORDS == 0 then + -- control mode: prove the breakpoint fires at all + action = '{ printf "XIEHIT pc=%08X\\n", pc ; g }' +else + local args = {} + for i = 0, WORDS - 1 do + args[#args + 1] = string.format("w@(a9+%d)", i * 16) + end + local fmt = "XIEHIT buf=%08X" + for i = 0, WORDS - 1 do fmt = fmt .. " %04X" end + fmt = fmt .. "\\n" + action = string.format('{ printf "%s", a9, %s ; g }', fmt, table.concat(args, ", ")) +end +dbg:command("bpset " .. hex(TRACE) .. ",," .. action) +print("XIE: breakpoint at " .. hex(TRACE) .. " -> " .. action) + +if JIT then + dbg:command("bpset " .. hex(IDLE) .. ",,{ pc = " .. JIT .. " ; g }") + print("XIE: entry jump armed at " .. hex(IDLE) .. " -> " .. JIT) +end + +local frames = 0 +emu.register_frame_done(function() + frames = frames + 1 + if frames % 100 == 0 then + print(string.format("XIE: frame %d pc=%s", frames, hex(cpu.state['PC'].value))) + end + if frames >= FRAMES then + print("XIE: done at frame " .. frames) + machine:exit() + end +end, "vt1200-xie-trace") + +dbg.visible_cpu = cpu +dbg.execution_state = 'run' diff --git a/harness/mame/xie_val.lua b/harness/mame/xie_val.lua new file mode 100644 index 0000000..669583f --- /dev/null +++ b/harness/mame/xie_val.lua @@ -0,0 +1,17 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"CTRL_REGIDSTORE id=%08X obj=%08X\\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F553DA0,,{ printf \"CTRL_S19RET a8=%08X\\n\", a8 ; g }") +dbg:command("bpset 3F55CB30,,{ printf \"T_ENTRY\\n\" ; g }") +dbg:command("bpset 3F55D460,,{ printf \"T_DISP\\n\" ; g }") +dbg:command("bpset 3F55D0F0,,{ printf \"T_C2 arg1=%%08X\\n\", d@(a13+0xffc0) ; g }") +dbg:command("bpset 3F55D110,,{ printf \"T_J1\\n\" ; g }") +dbg:command("bpset 3F55D120,,{ printf \"T_B24_copyout\\n\" ; g }") +dbg:command("bpset 3F55D190,,{ printf \"T_B32_zerochk\\n\" ; g }") +dbg:command("bpset 3F55D510,,{ printf \"T_MERGE\\n\" ; g }") +dbg:command("bpset 3F55D7A0,,{ printf \"T_GATE a7=%%08X a11=%%08X\\n\", a7, a11 ; g }") +print("XIE-VAL armed 10") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "val") diff --git a/harness/mame/xie_vw.lua b/harness/mame/xie_vw.lua new file mode 100644 index 0000000..da5effc --- /dev/null +++ b/harness/mame/xie_vw.lua @@ -0,0 +1,5 @@ +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("wpset 04000000,40000,w,1,{ printf \"VRW %08X %04X\n\", wpaddr, wpdata ; g }") +print("XIE-VW armed (VRAM writes 0x04000000..0x0403FFFF)") +emu.register_frame_done(function() end, "vw") diff --git a/harness/mame/xie_vwr.lua b/harness/mame/xie_vwr.lua new file mode 100644 index 0000000..e8a1dba --- /dev/null +++ b/harness/mame/xie_vwr.lua @@ -0,0 +1,4 @@ +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("wpset 04000000,100000,w,1,{ printf \"VW %08X %04X pc=%08X\n\", wpaddr, wpdata, pc ; g }") +print("XIE-VWR armed") diff --git a/harness/mame/xie_w198.lua b/harness/mame/xie_w198.lua new file mode 100644 index 0000000..977c34c --- /dev/null +++ b/harness/mame/xie_w198.lua @@ -0,0 +1,9 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ printf \"W256 a5=%08X val=%02X rp=%08X\n\", a5, b@(a5+0x20), d@(0xa6000) ; g }") +dbg:command("bpset 3F3AF870,,{ printf \"RD198 rp=%08X b198=%02X\n\", d@(a6000), b@(d@(a6000)+0x630) ; g }") +print("XIE-W198 armed 2") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "w198") diff --git a/harness/mame/xie_watch6.lua b/harness/mame/xie_watch6.lua new file mode 100644 index 0000000..6fd9ccd --- /dev/null +++ b/harness/mame/xie_watch6.lua @@ -0,0 +1,24 @@ +-- watch a caller-supplied bit address for writes (generated addresses) +local frames = 0 +local lastwp, lastaddr = "", 0 +local dbg = manager.machine.debugger +local idstore = 0x3F200000 + 0x67B04*8 +dbg:command(string.format("bpset %08X,,{ printf \"IDSTORE id=%%08X obj=%%08X\\n\", d@(a9+0x40), a11 ; g }", idstore)) +print("XIE-WATCH6 armed") +emu.register_frame_done(function() + frames = frames + 1 + local f = io.open("/tmp/opencode/xie_wp3.txt", "r") + if f then + local txt = f:read("*l"); f:close() + if txt and txt ~= lastwp then + lastwp = txt + local a = tonumber(txt) + if a and a ~= 0 and a ~= lastaddr then + lastaddr = a + print(string.format("XIE-WATCH6 installing at %08X", a)) + dbg:command(string.format("wpset %08X,32,w,1,{ printf \"WSRC pc=%%08X addr=%%08X val=%%08X\\n\", pc, wpaddr, wpdata ; g }", a)) + end + end + end + if frames >= 2000000 then machine:exit() end +end, "watch6") diff --git a/harness/mame/xie_watch7.lua b/harness/mame/xie_watch7.lua new file mode 100644 index 0000000..25f8870 --- /dev/null +++ b/harness/mame/xie_watch7.lua @@ -0,0 +1,26 @@ +-- capture rp at export, then watch rp+0x610 (generated addresses) +local frames = 0 +local lastwp, lastaddr = "", 0 +local dbg = manager.machine.debugger +local idstore = 0x3F200000 + 0x67B04*8 +local rppt = 0x3F200000 + 0x1B296*8 +dbg:command(string.format("bpset %08X,,{ printf \"IDSTORE id=%%08X obj=%%08X\\n\", d@(a9+0x40), a11 ; g }", idstore)) +dbg:command(string.format("bpset %08X,,{ printf \"RPPTR a11=%%08X 610=%%08X\\n\", a11, d@(a11+0x610) ; g }", rppt)) +print("XIE-WATCH7 armed") +emu.register_frame_done(function() + frames = frames + 1 + local f = io.open("/tmp/opencode/xie_wp3.txt", "r") + if f then + local txt = f:read("*l"); f:close() + if txt and txt ~= lastwp then + lastwp = txt + local a = tonumber(txt) + if a and a ~= 0 and a ~= lastaddr then + lastaddr = a + print(string.format("XIE-WATCH7 installing at %08X", a)) + dbg:command(string.format("wpset %08X,32,w,1,{ printf \"WSRC pc=%%08X addr=%%08X val=%%08X\\n\", pc, wpaddr, wpdata ; g }", a)) + end + end + end + if frames >= 2000000 then machine:exit() end +end, "watch7") diff --git a/harness/mame/xie_who.lua b/harness/mame/xie_who.lua new file mode 100644 index 0000000..7e2635c --- /dev/null +++ b/harness/mame/xie_who.lua @@ -0,0 +1,13 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F55B200,,{ printf \"H_ENTRY obj=%08X obj_b8=%02X bandarg=%08X\n\", d@(a13+0xffe0), b@(d@(a13+0xffe0)+0x40), d@(a13+0xffa0) ; g }") +dbg:command("bpset 3F55B420,,{ printf \"H_64E_path\n\" ; g }") +dbg:command("bpset 3F55BBF0,,{ printf \"H_75E_path\n\" ; g }") +dbg:command("bpset 3F55C260,,{ printf \"H_84C_default_return\n\" ; g }") +dbg:command("bpset 3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\n\", a7, a11 ; g }") +print("XIE-WHO armed 5") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "who") diff --git a/harness/mame/xie_who2.lua b/harness/mame/xie_who2.lua new file mode 100644 index 0000000..55760d9 --- /dev/null +++ b/harness/mame/xie_who2.lua @@ -0,0 +1,15 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F53D820,,{ printf \"REGIDSTORE id=%08X obj=%08X\n\", d@(a9+0x40), a11 ; g }") +dbg:command("bpset 3F55B200,,{ printf \"H_ENTRY obj=%08X obj_b8=%02X bandarg=%08X\n\", d@(a13+0xffe0), b@(d@(a13+0xffe0)+0x40), d@(a13+0xffa0) ; g }") +dbg:command("bpset 3F55C1D0,,{ printf \"H_DISP obj=%08X b8=%02X\n\", a11, a8 ; g }") +dbg:command("bpset 3F55B270,,{ printf \"H_64E_byte8_1_path\n\" ; g }") +dbg:command("bpset 3F55BAF0,,{ printf \"H_75E_byte8_3_path\n\" ; g }") +dbg:command("bpset 3F55BF40,,{ printf \"H_7E8_byte8_4_path\n\" ; g }") +dbg:command("bpset 3F55C260,,{ printf \"H_84C_default\n\" ; g }") +dbg:command("bpset 3F55D7A0,,{ printf \"GATE a7=%08X a11=%08X\n\", a7, a11 ; g }") +print("XIE-WHO2 armed 8") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "who2") diff --git a/harness/mame/xie_wpb8.lua b/harness/mame/xie_wpb8.lua new file mode 100644 index 0000000..00abf83 --- /dev/null +++ b/harness/mame/xie_wpb8.lua @@ -0,0 +1,27 @@ +-- watch every writer of the created resource's byte8 (generated addresses) +local frames = 0 +local lastwp, lastptr = "", 0 +local dbg = manager.machine.debugger +local cpu = manager.machine.devices[":maincpu"] +local idstore = 0x3F200000 + 0x67B04*8 +dbg:command(string.format("bpset %08X,,{ printf \"IDSTORE id=%%08X obj=%%08X\\n\", d@(a9+0x40), a11 ; g }", idstore)) +print("XIE-WPB8 armed 1 breakpoint") +emu.register_frame_done(function() + frames = frames + 1 + local f = io.open("/tmp/opencode/xie_wp2.txt", "r") + if f then + local txt = f:read("*l"); f:close() + if txt and txt ~= lastwp then + lastwp = txt + local p = tonumber(txt) + if p and p ~= 0 and p ~= lastptr then + lastptr = p + local sp = cpu.spaces['program'] + local b8 = sp:read_u8(p + 8*8) + print(string.format("XIE-WPB8 installing at %08X (byte8 now %d)", p + 8*8, b8)) + dbg:command(string.format("wpset %08X,8,w,1,{ printf \"WPB8 pc=%%08X addr=%%08X val=%%08X\\n\", pc, wpaddr, wpdata ; g }", p + 8*8)) + end + end + end + if frames >= 2000000 then machine:exit() end +end, "wpb8") diff --git a/harness/mame/xie_xfer.lua b/harness/mame/xie_xfer.lua new file mode 100644 index 0000000..48b64b4 --- /dev/null +++ b/harness/mame/xie_xfer.lua @@ -0,0 +1,10 @@ +local frames = 0 +local dbg = manager.machine.debugger +dbg:command("bpset 3F2D92B0,,{ b@(a5+0x20)=0 ; g }") +dbg:command("bpset 3FB29FD0,,{ printf \"XFER a0(src)=%08X a7=%08X a5=%08X a6=%08X b3=%08X b4=%08X b5=%08X b6=%08X\n\", a0, a7, a5, a6, b3, b4, b5, b6 ; g }") +dbg:command("bpset 3FB2A0B0,,{ printf \"COPY a0=%08X a5=%08X\n\", a0, a5 ; g }") +print("XIE-XFER armed") +emu.register_frame_done(function() + frames = frames + 1 + if frames >= 2000000 then machine:exit() end +end, "xfer") diff --git a/xie/.gitignore b/xie/.gitignore new file mode 100644 index 0000000..9e1edf1 --- /dev/null +++ b/xie/.gitignore @@ -0,0 +1,4 @@ +__pycache__/ +*.pyc +core +core.* diff --git a/xie/GHIDRA_XIE.md b/xie/GHIDRA_XIE.md new file mode 100644 index 0000000..e306734 --- /dev/null +++ b/xie/GHIDRA_XIE.md @@ -0,0 +1,583 @@ +# XIE (X Image Extension) in the VT1200 firmware — ROM analysis + +Static analysis of `vt1200_v22.bin` (1 835 008 bytes, md5 `b46a3e442ccb86134d2356bd70d22fd2`) +under Ghidra, cross-checked against a live wire probe of `192.168.99.2:0` and +against the vendored XIE 5.0 server source in `xie/xc/`. + +Nothing in the ROM was modified. Everything here is reproducible from +`xie/ghidra-evidence/` plus the steps in §12. + +--- + +## 1. Executive summary + +* The VT1200 X server contains a **complete, older XIE server** — DEC's + `XieExtensionInit` / `XieProc` / `ProcQueryImageExtension` family — built on the + same AGE-Logic/X-Consortium code that survives at 5.0 in `xie/xc/programs/Xserver/XIE/`. + It is **XIE 2.3**, `serviceClass = xieValFull`, 8 constraint levels. +* It registers itself with `AddExtension("Xie", NumEvents = 3, NumErrors = 0, + XieProc, XieSProc, XieCloseDown)` — a **six-argument** `AddExtension` with no + `MinorOpcodeProc`, which is the root of the `minor_op = 0` artefact (§7). +* Its request space is **46 slots (minor 0…45)**, not 26. Slot 0 and 21 slots beyond + it are a shared "not implemented" stub; **25 slots are implemented**. The table is + a 46-entry array of function pointers, in ROM at `0x18D8E8` (main) and `0x18D9A6` + (swapped), and it is installed into main RAM at bit `0xD3F90` / `0xD4550`. +* **Why a 5.0 client dies:** the 2.3 request *lengths* and the request *set* differ. + Every handler length-checks `stuff->length` in its first six instructions and + returns `BadLength` (16) on mismatch — and that returned error is emitted by dix's + generic path **with minor 0**, so the client is told only "opcode 129, minor 0, + BadLength". `xieperf -showtechs` dies because it asks for `QueryTechniques` + (5.0 minor 2) in a 2-word request: in 2.3 slot 2 accepts **exactly one word** and + produces **no reply at all**, so at two words it gets `BadLength`/minor 0 and at + one word it hangs waiting for a reply that is never sent. +* There is **no `QueryTechniques` and no technique-capability reply** anywhere in the + 2.3 table. `xieperf -showtechs` cannot be made to work against this server without + a client that speaks 2.3. + +Confidence markers: **[C]** confirmed by two independent angles (ROM code plus wire +or source), **[I]** inferred from one angle, **[U]** unknown. + +--- + +## 2. Address model used throughout + +``` +ghidra_byte = (mame_bit - 0x3F200000) / 8 (ROM is mapped at bit 0x3F200000) +mame_bit = 0x3F200000 + ghidra_byte * 8 +``` + +Instructions are 16-bit little-endian words. A 32-bit immediate in the code stream +is the **bit address** of its target (`MOVI 0x3F5263B0` → file offset `0x64C76`). +`CALLA` prints a *byte* address in the CPU's byte space, whose base is `0x7E40000`: +`file_offset = operand - 0x7E40000` (e.g. `CALLA 0x07eff36e` → `0xBF36E`). + +--- + +## 3. Address table + +| Ghidra | MAME bit | name | what it does | +|---|---|---|---| +| `0x64A9C` | `0x3F5254E0` | `XieExtensionInit` | calls `AddExtension("Xie",…)`, caches the `ExtensionEntry`, then runs device init | +| `0x64B98` | `0x3F525CC0` | `XieProc` | **request dispatcher** for major opcode 129 (unswapped clients) | +| `0x64BE0` | `0x3F525F00` | `XieSProc` | same for byte-swapped clients; indexes the *swapped* table | +| `0x64C28` | `0x3F526140` | `XieCloseDown` | `CloseDownProc` passed to `AddExtension` | +| `0x64C3C` | `0x3F5261E0` | `ProcNotImplemented` | shared stub in 21 slots; sends `BadRequest` itself | +| `0x68A4C` | `0x3F545260` | slot 1 handler | `QueryImageExtension` (2-word request, 8-word reply) | +| `0x18D8E8` | `0x3FE6C740` | `ProcTable[]` image | 46 × CARD32 bit address, installed at RAM bit `0xD3F90` | +| `0x18D9A6` | `0x3FE6CD30` | `SProcTable[]` image | 46 × CARD32, installed at RAM bit `0xD4550` | +| `0x18DA66` | `0x3FE6D330` | third 46-entry table image | installed at RAM bit `0xD4B10`; used from inside slot 1 | +| `0x0BF36E` | `0x3F7F9B70` | `AddExtension` | validates 3 proc pointers and the two counts | +| `0x0BFA5E` | `0x3F7FD2F0` | `SendErrorToClient`-like | builds a 32-byte core error from (client, major, minor, badValue, code) | +| `0x66FA0` | `0x3F533D00` | `LookupPhotos` | generic photo-resource lookup; emits `BadIDChoice` (14) | + +The table images are preceded in ROM by their own init records +(`dispatch_table.txt`): + +``` +0x18D8E2: CARD16 0x005C CARD32 0x000D3F90 <- main table destination +0x18D9A0: CARD16 0x005C CARD32 0x000D4550 <- swapped table destination +0x18DA60: CARD16 0x005C CARD32 0x000D4B10 <- third table destination +``` + +which is what makes the `ADDI 0xd3f90` / `ADDI 0xd4550` in the dispatcher resolvable +to concrete ROM data. + +--- + +## 4. Registration **[C]** + +`XieExtensionInit` at `0x64A9C`. Arguments are pushed onto the callee's argument +block and consumed right-to-left, so the pushed order (closeDown, swapped, main, +0, 3, "Xie") is the C order `(name, NumEvents, NumErrors, main, swapped, closeDown)`: + +``` +rom:00064aa8 MOVI 0x3f526140,A11 ; closeDownProc = 0x64C28 +rom:00064ab0 MOVI 0x3f525f00,A9 ; swappedMainProc= 0x64BE0 +rom:00064ab8 MOVI 0x3f525cc0,A9 ; mainProc = 0x64B98 +rom:00064ac0 SUB A9,A9 ; NumErrors = 0 +rom:00064ac4 MOVK 0x3,A9 ; NumEvents = 3 +rom:00064ac8 MOVI 0x3f5263b0,A8 ; "Xie" (file 0x64C76) +rom:00064ad0 CALLA 0x07eff36e ; AddExtension (file 0x0BF36E) +``` + +Independent check — `AddExtension` itself (`0xBF36E`) requires three non-NULL proc +pointers and bounds the two counts against the event window (128) and error window +(255): + +``` +rom:000bf374 MOVE *A13(0xff80),A11,0x1 ; arg3 mainProc -> JREQ fail if NULL +rom:000bf37a MOVE *A13(0xff60),A11,0x1 ; arg4 swapped -> JREQ fail if NULL +rom:000bf380 MOVE *A13(0xff40),A11,0x1 ; arg5 closeDown -> must be non-NULL +rom:000bf38e MOVE @0x21a620,A11,0x1 ; running event base +rom:000bf394 MOVE *A13(0xffc0),A9,0x1 ; arg1 = NumEvents +rom:000bf39a CMPI 0x80,A9 ; 128 +rom:000bf3a0 MOVE @0x21a640,A9,0x1 ; running error base +rom:000bf3a6 MOVE *A13(0xffa0),A11,0x1 ; arg2 = NumErrors +rom:000bf3ac CMPI 0xff,A11 ; 255 +``` + +**Numbers.** `NumEvents = 3`, `NumErrors = 0`. + +* The wire agrees on the events: `XQueryExtension("Xie")` returns *present, + opcode 129, first_event 64*, which is what dix assigns when it hands out a + three-event block at that point in `InitExtensions` **[C]** (same registration, + different dynamic base is possible on a differently-populated server — the + *count* is what the ROM proves). +* `NumErrors = 0` is consistent with the wire: the only XIE failures seen are the + **core** errors `BadRequest` (1), `BadIDChoice` (14) and `BadLength` (16). No + extension-private error code is ever produced **[C]**. +* The reproduction of *opcode 129* is not decidable from the ROM — dix assigns + `major_opcode` dynamically from `last_opcode`. What the ROM does prove is that + XIE is the *only* extension registered besides `ServerManagementExtension`, and + that it is registered with the standard dix `AddExtension` path, so 129 is simply + "second extension registered on this server" **[I]**. + +`XieExtensionInit` then caches fields of the returned `ExtensionEntry`: + +``` +rom:00064b30 MOVE *A11(0x60),A11,0x1 +rom:00064b34 MOVE A11,@0x1ad960,0x1 ; XIE major opcode, used in every error +``` + +`0x1AD960` is the value later fed to `SendErrorToClient` as the major opcode — the +wire's `major_op=129` for every error confirms the field **[C]**. + +Finally it calls a device-init routine at `0x3F944` (`CALLA 0x07e7f944` at `0x64B64`) +and prints `"XieExtensionInit: Device Init failed\n"` if it returns non-zero. That is +the only "Device Init" in the ROM; its body was not analysed **[U]**. + +--- + +## 5. The dispatcher **[C]** + +`XieProc`, `0x64B98` / bit `0x3F525CC0`: + +``` +rom:00064b9e MOVE *A13(0xffe0),A11,0x1 ; arg0 = ClientPtr +rom:00064ba2 MOVE *A11(0x40),A9,0x1 ; A9 = client->requestBuffer +rom:00064ba8 MOVE *A9(0x8),A11,0x0 ; stuff->opcode = request byte 1 +rom:00064bac CMPI 0x2e,A11 ; 46 +rom:00064bb0 JRNC 0x00064bca ; >= 46 -> dix protocol error +rom:00064bbc SLL 0x5,A11 ; * 32 bits = 4-byte stride +rom:00064bbe ADDI 0xd3f90,A11 ; proc_table at RAM bit 0xD3F90 +rom:00064bc4 MOVE *A11,A11,0x1 +rom:00064bc6 CALL A11 +rom:00064bd6 MOVE *SP(0x80),A14,0x1 +rom:00064bda MMFM SP,0x2a00 ; handler's A8 (an X error code) -> dix +``` + +`XieSProc` (`0x64BE0`) is byte-for-byte the same with `ADDI 0xd4550` — the swapped +table. This is exactly the 5.0 macro + +```c +#define ExecProc(client,opcode) ((client_table[client->index].proc_table[opcode])(client)) +#define CallProc(client) (ExecProc(client,stuff->opcode)) +``` +(`xie/xc/programs/Xserver/XIE/include/macro.h`), except that 2.3 indexes a **RAM** +copy installed from the ROM image at `0x18D8E8`. + +There is **no per-request work in the dispatcher** other than the `< 46` bound — +so any per-request length check happens inside the handler, which is what the wire +shows (§7). + +--- + +## 6. The request table **[C]** + +> **See `GHIDRA_XIE_HANDLERS.md`** (second pass) for what each slot *does*, the +> corrected reading of the third pointer table, and a verified session-level +> client. Two corrections to what follows: +> +> * The array at `0x18DA64` (RAM bit `0xD4B10`) is the **reply-swap table**, not +> the swapped-proc table, and only slots 1, 3, 6, 10 and 24 have an entry — +> those are the slots that produce a reply at all. The real swapped-proc table +> is at `0x18D9A6` (RAM bit `0xD4550`), as stated in §3. (The dump in +> `ghidra-evidence/dispatch_table.txt` labels the `0x18DA64` columns +> "swapped"; they are reply-swap entries.) +> * Slots 1–4 are DEC's four **Session Services** (`INIT_SESSION`, +> `TERM_SESSION`, `QUERY_OP_DEFAULTS`, `SET_OP_DEFAULTS`); slot 1's name in +> §6.1/§7 stands (`QueryImageExtension` equivalent), slots 2–4 were unnamed +> there. Slots 7, 8 and 10 turn out to be multi-operation classes, not single +> requests. + +46 slots; `0x64C3C` (`ProcNotImplemented`) fills 21 of them. Length column is +`stuff->length` in 4-byte words, read from the code (see +`xie/ghidra-evidence/listings.txt` for the instruction addresses). The last column +is what the live server did when sent a **1-word** request for that minor (my own +sweep, `xie/ghidra-evidence/length_sweep_wire.txt`): `BadLength` means "slot is +implemented and rejects 1 word". + +| minor | handler (Ghidra) | MAME bit | length check in ROM | 1-word wire result | +|---|---|---|---|---| +| 0 | `0x64C3C` | `0x3F5261E0` | none (NotImplemented) | BadRequest, minor_op 0 | +| 1 | `0x68A4C` | `0x3F545260` | `length == 2` | BadLength | +| 2 | `0x68DA6` | `0x3F546D30` | `length == 1` | **TIMEOUT** (success, no reply) | +| 3 | `0x3FD78` | `0x3F3FEBC0` | `length == 2` | BadLength | +| 4 | `0x3FE06` | `0x3F3FF030` | `length == 2` | BadLength | +| 5 | `0x68DDC` | `0x3F546EE0` | `length == 5`, then `byte[4] == 2` | BadLength | +| 6 | `0x68EC6` | `0x3F547630` | `length == 1` | **REPLY len 0** | +| 7 | `0x66866` | `0x3F534330` | `length == 4` | BadLength | +| 8 | `0x668E4` | `0x3F534720` | `length >= 3` | BadLength | +| 9 | `0x6698E` | `0x3F534C70` | `length == 3` | BadLength | +| 10 | `0x66B64` | `0x3F535B20` | `length == 3` | BadLength | +| 11 | `0x667B6` | `0x3F533DB0` | `length == 3` | BadLength | +| 12 | `0x66738` | `0x3F5339C0` | `length == 2` | BadLength | +| 13 | `0x66A8E` | `0x3F535470` | `length == 2` | BadLength | +| 14 | `0x66C34` | `0x3F5361A0` | `length == 4` | BadLength | +| 15 | `0x6A536` | `0x3F5529B0` | `length == 3` | BadLength | +| 16 | `0x64C3C` | `0x3F5261E0` | none (NotImplemented) | BadRequest, minor_op 16 | +| 17 | `0x64C3C` | `0x3F5261E0` | none | BadRequest, minor_op 17 | +| 18 | `0x6A5A4` | `0x3F552D20` | `length >= 4` | BadLength | +| 19 | `0x6A76E` | `0x3F553B70` | `length >= 8` | BadLength | +| 20 | `0x6AA54` | `0x3F5552A0` | `length == 0x23` (35 words) | BadLength | +| 21 | `0x62D40` | `0x3F516A00` | `length == 16` | BadLength | +| 22 | `0x630F4` | `0x3F5187A0` | `length == 2` | BadLength | +| 23 | `0x64C3C` | `0x3F5261E0` | none | BadRequest, minor_op 23 | +| 24 | `0x6315E` | `0x3F518AF0` | `length == 4` | BadLength | +| 25–32 | `0x64C3C` | `0x3F5261E0` | none | BadRequest, minor_op = N | +| 33 | `0x64CC8` | `0x3F526640` | `length == 4` | BadLength | +| 34–39 | `0x64C3C` | `0x3F5261E0` | none | BadRequest, minor_op = N | +| 40 | `0x65262` | `0x3F529310` | `length == 4` | BadLength | +| 41,42 | `0x64C3C` | `0x3F5261E0` | none | BadRequest, minor_op = N | +| 43 | `0x65600` | `0x3F52B000` | `length == 10` | BadLength | +| 44 | `0x65CAA` | `0x3F52E550` | `length == 5` | BadLength | +| 45 | `0x64C3C` | `0x3F5261E0` | none | BadRequest, minor_op 45 | + +**The 46-request sweep matches the table exactly**: every slot the ROM maps to +`0x64C3C` answers `BadRequest` and every other slot answers `BadLength` (or, for 2 +and 6, runs). That is a complete, independent confirmation of the table contents — +25 implemented slots at 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,18,19,20,21,22,24,33,40,43,44. + +### 6.1 What can and cannot be named **[I]/[U]** + +Only **slot 1 is identified with certainty** (see §7.1). The rest cannot be given +5.0 names by number, because the numbering demonstrably is not 5.0's. Hard +counter-examples: + +* slot 22 takes **2 words**; 5.0's smallest slot-22 candidate (`PutClientData`, + `sz_xiePutClientDataReq = 20`) is 5 words. +* slot 2 takes one word and **returns no reply**; no 5.0 query behaves that way. +* slot 23 (`GetClientData` in 5.0) is `ProcNotImplemented` here. +* slot 6 takes **no argument** where 5.0's `QueryColorList` carries a `colorList` id. + +Structural facts that *are* established for the unnamed slots: + +* **Photo-resource requests** — slots 11, 12, 13, 14, 21, 22, 24, 33, 40, 43, 44 all + call `LookupPhotos` (`0x66FA0`), the same helper that emits `BadIDChoice` (14). + That is why the wire shows `BadIDChoice` for minor 11 at 3 words and minor 24 at + 4 words: they were dispatched and their id argument did not resolve. +* **Id field position** — in both slot 11 and slot 24 the id is the CARD32 at + request **byte offset 4** (`MOVE *A9(0x20),…`), i.e. word 1, same offset as 5.0, + but the request is longer overall (extra words follow the id). +* **Element-list requests** — slots 19 (≥8 words), 20 (35 words) and 43 (10 words) + are the only large ones; they are the closest thing to photoflo/element-list + requests. Slot 20 additionally seeds a local with `MOVK 0x19` (25) before the + length test, i.e. it has a 25-element notion of its own **[I]**. +* **The restart/teardown pair** — slot 1 *increments* the global at `0x1AD920` when + it initialises client state; slot 2 *decrements* it and returns `Success` with no + reply. So slot 2 behaves like a per-client teardown/reset request **[I]**. + (`0x1AD920` is also zeroed by `XieExtensionInit` at `0x64B18`.) + +--- + +## 7. QueryImageExtension and the `BadLength` / minor-0 mechanism + +### 7.1 Slot 1 = QueryImageExtension **[C]** + +Handler `0x68A4C`, `length == 2` (`0x68A60`/`0x68A64`/`0x68A66`). It builds an +8-word reply in its frame and hands it to the generic reply writer +`CALLA 0x07e6a422` (`0x68D62`). The load-bearing stores: + +``` +rom:00068c88 MOVE *A13(0xffe0),A5,0x1 ; client +rom:00068c8c MOVE *A5(0xe0),*A13(0x130),0x0 ; serviceClass <- client field +rom:00068c92 MOVK 0x8,A5 +rom:00068c94 MOVE A5,*A13(0x140),0x1 ; reply.length = 8 +rom:00068c98 MOVK 0x2,A7 +rom:00068c9a MOVE A7,*A13(0x160),0x0 ; majorVersion = 2 +rom:00068c9e MOVK 0x3,A5 +rom:00068ca0 MOVE A5,*A13(0x170),0x0 ; minorVersion = 3 +``` + +and the live reply confirms every field: + +``` +bytes 8.. of the reply: 02 00 | 03 00 | 20 00 | 00 00 | e0 56 41 00 ... + major minor class align first levels +reply length field = 8 +``` + +`reply.length = 8` matches the 5.0 source exactly — `reply.length = +sizeof(Preferred_levels)>>2` and `sz_xieQueryImageExtensionReply = 32` +(`xie/xc/.../dixie/request/session.c`, `XIEproto.h`), and `serviceClass 0x20` is +`xieValFull` under `XIE_FULL`. **The 2.3 request is 8 bytes, identical to 5.0's**, +which is why `xieperf` gets this far. + +One 2.3-only detail: the handler also reads the request's second word and compares +its halves with 2 and 3 — + +``` +rom:00068c6e MOVE *A9(0x20),A5,0x0 ; request word 1, low half +rom:00068c72 SUBK 0x2,A5 ; == 2 ? +rom:00068c76 MOVE *A9(0x30),A5,0x0 ; request word 1, high half +rom:00068c7a SUBK 0x3,A5 ; == 3 ? +rom:00068c84 MOVB *A5,*A13(0x128) ; -> per-client "declared 2.3" flag +``` + +That flag gates the per-client state initialisation at `0x68CAC…0x68D16` +(it is **not** used to build the reply — a client that sends zeros still receives +major 2 / minor 3). Interpreted as a client-declared version pair `{2,3}`; **[I]**, +the exact consequence of the flag is not traced. + +### 7.2 Why `BadLength` reports minor 0 **[C] for the behaviour, [I] for the dix side** + +Two different error paths exist, and only one of them carries a minor opcode. + +**(a) Errors the XIE code *sends itself* carry the real minor.** `LookupPhotos` +(`0x66FA0`) on a failed resource lookup: + +``` +rom:00066fd8 MOVK 0xe,A11 ; arg = 14 = BadIDChoice +rom:00066fda MOVE A11,*A14+,0x1 +rom:00066fdc MOVE *A13(0xff80),*A14+,0x1 ; the offending id +rom:00067110 MOVE A8,*A14+,0x1 ; stuff->opcode (the real minor) +rom:00067112 MOVE 0x1ad960,*A14+,0x1 ; XIE major opcode +rom:00067118 MOVE *A13(0xffe0),*A14+,0x1 ; client +rom:0006711c CALLA 0x07effa5e ; SendErrorToClient(...) +``` + +and `ProcNotImplemented` (`0x64C3C`) does the same with code 1: + +``` +rom:00064c4c MOVK 0x1,A7 ; arg = 1 = BadRequest +rom:00064c56 MOVE *A9(0x8),A8,0x0 ; stuff->opcode +rom:00064c5c MOVE 0x1ad960,*A14+,0x1 ; major opcode +rom:00064c64 CALLA 0x07effa5e ; SendErrorToClient(...) +``` + +Wire: `minor 23 → code 1, minor_op 23, major_op 129`; `minor 16,17,25…45` likewise +report their own number. **The real minor is transmitted.** + +**(b) The length check does not send anything — it *returns* 16.** Every handler's +prologue is: + +``` +rom:00068eda MOVE *A9(0x10),A11,0x0 ; stuff->length +rom:00068ede DEC A11 +rom:00068ee0 JREQ ok +rom:00068ee2 MOVK 0x10,A8 ; 16 = BadLength +rom:00068ee4 JR epilogue ; A8 is the function's return value +``` + +`XieProc` returns that A8 to dix (`0x64BDA MMFM` restores and returns). dix's +generic "extension returned an error" path then emits the error — and it has no +minor opcode to put in it: the extension was registered by a **six-argument** +`AddExtension` with no `MinorOpcodeProc` argument (§4), and `XieProc` keeps no +minor in any client field. Result: **`BadLength` always arrives with +`minor_op = 0`**, while errors sent by the XIE code itself carry the true minor. + +This is exactly the split the wire shows, for every implemented slot: + +``` +minor=1 words=1: ERROR code=16 ... minor_op=0 major_op=129 +minor=23 words=1: ERROR code= 1 ... minor_op=23 major_op=129 +``` + +**Consequence for `xieperf`.** Its failing request is one whose 5.0 length does not +match the 2.3 expectation, so the client learns only "major 129, minor 0, +BadLength" — the minor is structurally unavailable. The only robust fix on the +client side is to send 2.3 lengths; the server cannot be made to name the failing +request without patching dix's error path. + +### 7.3 The observed sizes for minors 6, 11 and 24 **[C]** + +| minor | 2.3 length | 5.0 length (`sz_*Req`) | consequence | +|---|---|---|---| +| 6 | **1 word** (bare header) | 2 words (`colorList` id) | 5.0's 2-word request → `BadLength`; 1 word → reply with `length = 0` (an empty list) | +| 11 | **3 words** | 2 words (`photomap` id) | id at byte 4 resolves through `LookupPhotos`; a 5.0 2-word request is rejected before the lookup | +| 24 | **4 words** | 3 words (`nameSpace` + `floID`) | id at byte 4; a 5.0 3-word request is rejected | + +So the 2.3 requests are consistently *longer* than 5.0's for id-carrying requests, +and *shorter* (argless) for the list query at minor 6. Both directions break a 5.0 +client. + +--- + +## 8. 2.3 vs 5.0 — concrete wire differences + +| aspect | XIE 5.0 (`xie/xc/...`) | ROM 2.3 | +|---|---|---| +| request space | 26 (`xieNumProtoReq 26`, `ProcTable5_00[27]`) | **46** (`CMPI 0x2e`, 46-entry table) | +| implemented requests | 25 in `XIE_FULL` | **25 of 46**; 21 slots are `ProcNotImplemented` | +| dispatch | `client_table[].proc_table[opcode]` | same, but table lives in RAM at bit `0xD3F90` / `0xD4550`, loaded from ROM `0x18D8E8` / `0x18D9A6` | +| `minorOpcodeProc` | separate `AddExtension` argument | **absent** — 6-argument `AddExtension`; `BadLength` loses its minor | +| `QueryTechniques` | `ProcQueryTechniques`, 2-word request, 32-byte reply | **does not exist**: slot 2 is a 1-word, reply-less request | +| `GetClientData` | implemented (slot 23, 5 words) | `ProcNotImplemented` → `BadRequest` | +| `QueryColorList` | 2 words, carries a `colorList` id | 1 word, no argument | +| `QueryPhotomap` | 2 words | 3 words | +| `QueryPhotoflo` | 3 words | 4 words | +| events | 6+ event types in `XIEproto.h` (`PhotofloDone`, `Flo`, `ColorAlloc`, `DecodeNotify`, `ExportAvailable`, `ImportObscured`) | **3** registered events | +| error codes | XIE-private error classes in `xieFlo*Err` | none: only core 1 / 14 / 16 are produced (`NumErrors = 0`) | +| version reply | major 5, minor 00 | major 2, minor 3, `serviceClass = 0x20` (`xieValFull`), 8 levels | + +--- + +## 9. Techniques and elements **[C] for the absence, [U] for a capability list** + +* There is **no QueryTechniques handler and no technique-capability reply** in the + 2.3 table. Slot 2 — 5.0's `QueryTechniques` — accepts exactly one word, decrements + `0x1AD920`, returns `Success`, and **writes nothing to the client**: + + ``` + rom:00068dc2 MOVE @0x1ad920,A11,0x1 + rom:00068dc8 DEC A11 + rom:00068dca MOVE A11,@0x1ad920,0x1 + rom:00068dcc SUB A8,A8 ; Success, no WriteToClient + ``` + + That is why the wire shows `TIMEOUT` at one word (the client waits for a reply + that never comes) and `BadLength` at every other length. + +* Consequently the answer to "what would `xieperf -showtechs` legitimately list" + is: **nothing, from this server.** There is no table it can ask for. + +* The *element* side does exist — the ROM contains the AGE-Logic element machinery + (`"error allocating export function block"`, `"error allocating export context"`, + `"error allocating export histogram space"`, `"error allocating export pixel + list"`, `"error allocating export RGB list"`, `"error allocating export map + list"` at `0x649B0…0x64A80`, plus `"error allocating photoflo"` `0x68962`, + `"error allocating Roi"` `0x689BC`, `"error allocating photomap"` `0x6D0B0`, + `"unsupported pipe element"` `0x1C71D`). But I did **not** locate a + `MakeTable`-equivalent array: a scan for runs of ≥18 consecutive ROM pointers + found nothing of 5.0's 38-entry `MakeTable` shape (largest runs: 192, 144, 128, + 120, 70, 64, 63, 63 entries, all in the ordinary-data region). + **Which techniques 2.3 implements is therefore UNKNOWN** — the code is present, + the enumeration is not identified. + +--- + +## 10. Other XIE entry points + +| Ghidra | name/role | evidence | +|---|---|---| +| `0x66FA0` | `LookupPhotos` — generic photo-resource lookup, emits `BadIDChoice` | string `"LookupPhotos: BadIDChoice coming!"` @`0x68910` referenced at `0x67128`; id comes from request byte 4 | +| `0x0BFA5E` | error sender used by all XIE code that reports a *named* minor | argument order (client, major@`0x1AD960`, minor=`stuff->opcode`, badValue, code) matches the wire | +| `0x64C28` | `CloseDownProc`, passed to `AddExtension` | 6th argument; small wrapper that calls `0x3F99E` | +| `0x3F944` | "Device Init" hook called at the end of `XieExtensionInit` | `CALLA 0x07e7f944` at `0x64B64`; `JREQ` + the `"Device Init failed"` string @`0x64CA1` | +| `0x67490`, `0x67A44` | xref `"error allocating photoflo"` — photoflo allocation | string refs | +| `0x67C50` | xref `"error allocating Roi"` | string ref | +| `0x6C820`, `0x6CAA8` | xref `"error allocating photomap"` | string refs | +| `0x68F38` | helper called from slot 1 after the version check; walks a per-client table at `0x1ADA70` | `ADDI 0x1ada70` at `0x68F4E` | +| `0x1AD920`, `0x1AD940`, `0x1AD960`, `0x1AD980`, `0x1AD990`, `0x1AD9A0` | XIE globals: client counter, two cached `ExtensionEntry` fields, three cached lookup/queue proc pointers, major opcode | `XieExtensionInit` `0x64B18…0x64B5E` | + +A *third* 46-entry table is installed at RAM bit `0xD4B10` and indexed the same way +from inside slot 1 (`0x68D44 SLL 0x5` / `0x68D46 ADDI 0xd4b10` / `0x68D4E CALL A5`). +Its contents were not dumped; it is presumably the per-request "device dependent" +override **[I]**. + +--- + +## 11. Confirmed / Inferred / Unknown + +**Confirmed (ROM code + wire, or ROM code + 5.0 source)** + +1. `AddExtension("Xie", 3, 0, XieProc@0x64B98, XieSProc@0x64BE0, XieCloseDown@0x64C28)`. +2. Dispatcher indexes a 46-entry pointer table at RAM bit `0xD3F90` with + `stuff->opcode`, rejecting `>= 46`; the ROM images of that table and the swapped + one are at `0x18D8E8` / `0x18D9A6` (46 entries each). +3. The 25 implemented slots and the exact per-slot length check in the table of §6. + Verified end-to-end by the 46-request wire sweep. +4. Slot 1 is `QueryImageExtension`: 2-word request, 8-word reply, major 2, minor 3, + `serviceClass` from the client record, `reply.length = 8`. +5. `BadLength` is *returned* as A8 = 16 and arrives at the client with `minor_op = 0`; + `BadRequest` from `ProcNotImplemented` and `BadIDChoice` from `LookupPhotos` are + *sent* by XIE with `stuff->opcode` as the minor and arrive with the true minor. +6. Slots 11 and 24 take 3 and 4 words and read their id from request byte 4; slot 6 + takes 1 word. +7. There is no `QueryTechniques` in 2.3. + +**Inferred** + +1. Opcode 129 is just "second extension registered"; the ROM fixes the *counts* + (3 events, 0 errors), not the dynamic base. +2. dix's generic error path cannot name a minor because no `MinorOpcodeProc` was + supplied (6-argument `AddExtension`) — the outcome is proven, the dix internals + were not decompiled. +3. Slot 2 is a per-client teardown/reset request (decrements the counter slot 1 + increments; no reply). +4. The `{2,3}` comparison in slot 1 is a client-declared protocol version that gates + per-client state initialisation. +5. Slots 19/20/43 are photoflo/element-list requests (only large ones; slot 20 has a + 25-element notion). + +**Unknown** + +1. Names of slots 3–5, 7–15, 18–22, 24, 33, 40, 43, 44 — the numbering is not 5.0's, + and only the *shape* (length, id offset, `LookupPhotos` use) was recovered. +2. Which techniques/elements 2.3 can execute, and whether a `MakeTable` equivalent + exists (no 38-entry pointer array was found). +3. The contents/role of the third 46-entry table at RAM bit `0xD4B10`. +4. What `Device Init` (`0xE7F944`) validates. +5. Why slot 20 wants exactly 35 words. + +--- + +## 12. Reproduction + +Everything below assumes the Ghidra session from the task +(`program_list_open` → session id), language `tms34010:LE:32:default`, program +`/home/arti/code/k-space/vt1200/vt1200_v22.bin`, base `rom:00000000`. + +1. **Make the session writable and analyse the reset path.** + `program_mode_set(read_only=false)`; `analysis_update_and_wait`. + *Note:* auto-analysis finds 0 functions on this raw image (no entry point). + Add the reset vector as an entry point and re-run: + `program.getSymbolTable().addExternalEntryPoint(addr(0x8))` — the reset PC + `0x3F200040` maps to Ghidra `0x8`. Ghidra still does not follow `CALL`s, so the + listings in `xie/ghidra-evidence/` were produced with explicit + `DisassembleCommand(AddressSet(start, start+0x5ff), wholeROM, followFlow=true)`. + +2. **Find `XieExtensionInit`.** Search the 32-bit immediates for the bit address of + the string `Xie` (`0x3F5263B0` = file `0x64C76`) or of + `"XieExtensionInit: AddExtension failed"` (`0x3F5263D0` = file `0x64C7A`): + + ```python + import jpype, struct + mem = program.getMemory() + a = jpype.JArray(jpype.JByte)(0x1c0000); mem.getBytes(program.getMinAddress(), a) + data = bytes((b & 0xff) for b in a) + data.find(struct.pack(" 0x64ae2 + ``` + (`mem.getBytes(addr, bytearray)` silently does nothing in this PyGhidra build — + use a `jpype.JArray`.) + +3. **Dump the tables** + + ```python + for base in (0x18d8e8, 0x18d9a6): + for i in range(46): + v = struct.unpack_from("> 3)) + ``` + +4. **Dump a handler prologue** — `DisassembleCommand` from the handler address for + 0x60 bytes and walk `getInstructionAt()`; the length check is always within the + first six instructions. + +5. **Re-check the wire side** (read-only probes, 46 connections): + + ```sh + cd /tmp/opencode && python3 xie_len_sweep.py # uses xie/evidence/xie_raw.py + ``` + + Expected: the 25 implemented minors answer `BadLength` (or, for 2 and 6, run), + the 21 `ProcNotImplemented` slots answer `BadRequest` with their own minor. + +6. **Re-check the error-path split**: `probe(23, 1)` → `code=1, minor_op=23`; + `probe(1, 1)` → `code=16, minor_op=0`. + +--- + +*Evidence files: `xie/ghidra-evidence/dispatch_table.txt` (the 46×2 table with raw +bit addresses), `xie/ghidra-evidence/listings.txt` (every quoted instruction), +`xie/ghidra-evidence/length_sweep_wire.txt` (the 46-request probe transcript).* diff --git a/xie/GHIDRA_XIE_HANDLERS.md b/xie/GHIDRA_XIE_HANDLERS.md new file mode 100644 index 0000000..74cd6bc --- /dev/null +++ b/xie/GHIDRA_XIE_HANDLERS.md @@ -0,0 +1,610 @@ +# XIE 2.3 handlers — naming pass + +Second pass over `vt1200_v22.bin` (md5 `b46a3e442ccb86134d2356bd70d22fd2`). +Read `GHIDRA_XIE.md` first; this file only adds to it. + +Raw material: `xie/ghidra-evidence/handlers/slotNN_HHHHHH.txt` (one file per +implemented slot, instructions taken from each handler's Ghidra function body), +`xie/ghidra-evidence/dispatch_table.txt`, and the wire transcripts quoted below. + +Confidence tags: **[C]** = two independent signals (code + wire, or code + 5.0 +source + wire), **[I]** = one signal plus a consistent story, **[U]** = unknown. +Where the evidence only supports a shape ("two sub-operations selected by a +32-bit word at byte 4"), the shape is reported and no name is invented. + +--- + +## 1. Executive summary + +**Named with real evidence (6 of 25):** + +| slot | name | confidence | +|---|---|---| +| 1 | **INIT_SESSION** — same job as XIE 5.0 `QueryImageExtension` (replies with version 2.3 + levels) | [C] | +| 2 | **TERM_SESSION** — argless, decrements the session counter, **no reply** | [C] | +| 3 | **QUERY_OP_DEFAULTS** — argless query with a fixed 32-byte reply | [I] | +| 4 | **SET_OP_DEFAULTS** — argless setter, stores the request word into the per-client record | [I] | +| 5 | **SET_* with a mode byte** — 5 words, byte 4 must be `2`, else `BadValue`; transport-shaped | [I] | +| 6 | **QUERY_EVENTS** — argless query, reply describes event selection | [I] | + +The six come from one coherent structure: a **per-client session record** at +`0x1ADA70 + clientIndex*20` plus a **session counter** at `0x1AD920`. Slot 1 +initialises and increments, slot 2 decrements, slot 3 reads the record back, +slot 4 writes it. That quartet is exactly DEC's *Session Services* group +(`XIEP_INIT_SESSION`, `XIEP_SET_OP_DEFAULTS`, `XIEP_QUERY_OP_DEFAULTS`, +`XIEP_TERM_SESSION` — `xie/docs/dec/…EK-V120I-IN-001.txt`, Table C-1), and the +wire behaviour of all four matches. + +**Not named, but structurally classified (19):** slots 7, 8 and 10 are +**multi-operation request classes** (a 32-bit operation selector at request +byte 4: slot 7 takes ops 1-2, slot 8 takes 1,2,4,5,6 (3 is rejected) over 4 +sub-handlers, slot 10 takes ops 1-5); slots 11–15, 18, 22, 24, +33, 40, 43, 44 are **photo-resource operations** that all go through +`LookupPhotos` (`0x66FA0`) and answer `BadIDChoice` for an unknown id; slots 19, +20 and 21 are the **large data/list requests** (≥8, exactly 35, and 16 words). +Naming those needs the experiments in §11. + +**A usable 2.3 client exists for the session layer only**, and it is verified end +to end (§10): connect → minor 1 → minor 3 → minor 6 → minor 2. The +resource/transport/pipeline half cannot yet be written from static evidence; §11 +gives the exact next probes. + +**Correction to the first report.** §3/§6.1 of `GHIDRA_XIE.md` mislabels one of +the three pointer tables. The array at `0x18DA64` is **not** the swapped-proc +table — it is the **reply-swap table**, installed at RAM bit `0xD4B10`, and only +five slots have an entry (1, 3, 6, 10, 24 — exactly the slots that produce a +reply). The real swapped-proc table is at `0x18D9A6` → RAM `0xD4550`, and its +entries are the `0x697xx` swap-and-redispatch stubs. Details in §2. + +--- + +## 2. The three tables (corrected) + +| ROM image | RAM destination | used by | entries | +|---|---|---|---| +| `0x18D8E8` | bit `0xD3F90` | `XieProc` (`0x64B98`), major-opcode 129, unswapped clients | 46 procs (25 real) | +| `0x18D9A6` | bit `0xD4550` | `XieSProc` (`0x64BE0`), byte-swapped clients | 46 swap-and-redispatch stubs | +| `0x18DA64` | bit `0xD4B10` | reply writer inside the five query handlers | 46, **only 1/3/6/10/24 non-stub** | + +The reply-swap table is what tells us which requests answer with a reply at all: +its non-stub entries are exactly `{1, 3, 6, 10, 24}`. Every handler that has no +entry there either returns `Success` silently or sends an error. + +The five entries: + +``` +[ 1] 0x3F5491E0 -> 0x6923C +[ 3] 0x3F549620 -> 0x692C4 +[ 6] 0x3F549980 -> 0x69330 +[10] 0x3F549CA0 -> 0x69394 +[24] 0x3F54AFC0 -> 0x695F8 +``` + +and the dispatch itself, from slot 1 (identical in 3, 6, 10, 24): + +``` +rom:00068d24 MOVE *A11(0x80),A7,0x1 ; client->swapped ? +rom:00068d2c JREQ 0x00068d52 ; no -> straight WriteToClient +rom:00068d40 MOVE *A9(0x8),A5,0x0 ; stuff->opcode +rom:00068d44 SLL 0x5,A5 +rom:00068d46 ADDI 0xd4b10,A5 ; reply-swap table +rom:00068d4c MOVE *A5,A5,0x1 +rom:00068d4e CALL A5 +rom:00068d52 ... CALLA 0x07e6a422 ; WriteToClient @0x2A422 +``` + +--- + +## 3. Slot table + +Request fields are byte offsets inside the request (the handler reads +`*A9(bit_offset)`, so `*A9(0x20)` = byte 4). "reply" means the slot has an entry +in the reply-swap table. + +| slot | handler | words | request fields read | reply | class / best name | conf | 5.0 counterpart | +|---|---|---|---|---|---|---|---| +| 1 | `0x68A4C` | 2 | 4 (2×u16), 6 | yes | **INIT_SESSION** ≡ QueryImageExtension | [C] | `X_ieQueryImageExtension` | +| 2 | `0x68DA6` | 1 | — | no | **TERM_SESSION** | [C] | (none) | +| 3 | `0x3FD78` | 2 | — (payload ignored) | yes | **QUERY_OP_DEFAULTS** | [I] | (none) | +| 4 | `0x3FE06` | 2 | 4 (u32 → per-client rec) | no | **SET_OP_DEFAULTS** | [I] | (none) | +| 5 | `0x68DDC` | 5 | 4 (u8, must be 2), 8 | no | **SET_* mode-selecting** (transport-shaped) | [I] | `X_ieSetTransport`? | +| 6 | `0x68EC6` | 1 | — | yes | **QUERY_EVENTS** | [I] | (none) | +| 7 | `0x66866` | 4 | 4 (u32 selector 1–2), 8 | no | 2-operation class mux | [C] | — | +| 8 | `0x668E4` | ≥3 | 4, 8 | no | 4 sub-handlers, selector 1,2,4,5,6 (3 → BadRequest) | [C] | — | +| 9 | `0x6698E` | 3 | 4, 8 | no | resource op | [I] | — | +| 10 | `0x66B64` | 3 | 4 (u32 selector 1–5), 8 | yes | 5-operation class mux, replies | [C] | — | +| 11 | `0x667B6` | 3 | 4 (id), 8 | no | photo-resource op (`LookupPhotos` type `0xFFFF`) | [C] | — | +| 12 | `0x66738` | 2 | 4 (id) | no | photo-resource op (`LookupPhotos` type `0`) | [C] | — | +| 13 | `0x66A8E` | 2 | 4 (read twice) | no | photo-resource op (type `0xFFFF`) | [C] | — | +| 14 | `0x66C34` | 4 | 4, 8, 12 | no | photo-resource op (type `0xFFFF`) | [C] | — | +| 15 | `0x6A536` | 3 | 4, 8 | no | pipeline-side resource op | [I] | — | +| 18 | `0x6A5A4` | ≥4 | 4, 12, 13 | no | pipeline setup | [I] | `ExecutePhotoflo`? | +| 19 | `0x6A76E` | ≥8 | 4, 8, 12, 16, 20, 24, 28 | no | data-carrying (list) | [I] | `PutTile`/`PutStream`? | +| 20 | `0x6AA54` | 35 | 4, 8, 12, 13, 14, 16 | no | photoflo definition (element list) | [I] | `CreatePhotoflo`? | +| 21 | `0x62D40` | 16 | 4, 16, 20, 24, 28, 32, 36 | no | photo-resource op (big) | [I] | — | +| 22 | `0x630F4` | 2 | 4 (id) | no | photo-resource op | [C] | — | +| 24 | `0x6315E` | 4 | 4 (id), 8, 12 | yes | **photo-resource QUERY** | [C] | `X_ieQueryPhotomap`/`QueryPhotoflo` | +| 33 | `0x64CC8` | 4 | 4, 8 (type comes from the request) | no | generic photo handle op | [C] | — | +| 40 | `0x65262` | 4 | 4, 8 | no | generic photo handle op | [C] | — | +| 43 | `0x65600` | 10 | 4, 8, 20, 24 | no | big photo op | [I] | — | +| 44 | `0x65CAA` | 5 | 4, 8, 12, 16 | no | photo op | [C] | — | + +Slots 0, 16, 17, 23, 25–32, 34–39, 41, 42, 45 are the shared +`ProcNotImplemented` stub (`0x64C3C`), unchanged from pass 1. + +--- + +## 4. The session quartet (slots 1–4) [C]/[I] + +Everything hangs off two globals: + +* `0x1AD920` — a session counter. `XieExtensionInit` zeroes it + (`rom:00064b18 MOVE A9,@0x1ad920`), slot 1 increments it, slot 2 decrements it. +* `0x1ADA70 + clientIndex*20` — a per-client record, `{u32 f0, u32 f1, u32 f2, …}`, + addressed as `idx*160 bits` (`SLL 0x7` + `SLL 0x5` + `ADD`). + +### slot 1 — INIT_SESSION (0x68A4C) + +``` +rom:00068a60 MOVE *A9(0x10),A11,0x0 ; stuff->length +rom:00068a64 SUBK 0x2,A11 +rom:00068a66 JREQ 0x00068a6e ; must be 2 words +rom:00068a68 MOVK 0x10,A8 ; else BadLength +... +rom:00068c6e MOVE *A9(0x20),A5,0x0 ; request word 1, low u16 +rom:00068c72 SUBK 0x2,A5 ; == 2 ? +rom:00068c76 MOVE *A9(0x30),A5,0x0 ; request word 1, high u16 +rom:00068c7a SUBK 0x3,A5 ; == 3 ? +rom:00068c84 MOVB *A5,*A13(0x128) ; per-client "client speaks 2.3" flag +rom:00068c94 MOVE A5,*A13(0x140),0x1 ; reply.length = 8 +rom:00068c9a MOVE A7,*A13(0x160),0x0 ; majorVersion = 2 +rom:00068ca0 MOVE A5,*A13(0x170),0x0 ; minorVersion = 3 +rom:00068d16 MOVE @0x1ad920,A7,0x1 +rom:00068d1c INC A7 +rom:00068d1e MOVE A7,@0x1ad920,0x1 ; session count++ +``` + +The per-client initialisation (gated by the `{2,3}` compare) writes +`rec.f0 = 0`, `rec.f1 = 2`, `rec.f2 = 0x100` (`rom:00068cc2`/`0x68cda`/`0x68d04`). + +### slot 2 — TERM_SESSION (0x68DA6), the whole body + +``` +rom:00068da6 MMTM SP,0x154 +rom:00068daa MOVE A14,A13 +rom:00068dac MOVE *A13(0xffe0),A11,0x1 +rom:00068db0 MOVE *A11(0x40),A9,0x1 ; stuff +rom:00068db4 SETF 0x10,0x0,0x0 +rom:00068db6 MOVE *A9(0x10),A11,0x0 ; stuff->length +rom:00068dba DEC A11 +rom:00068dbc JREQ 0x00068dc2 ; must be 1 word +rom:00068dbe MOVK 0x10,A8 +rom:00068dc0 JR 0x00068dd2 +rom:00068dc2 MOVE @0x1ad920,A11,0x1 +rom:00068dc8 DEC A11 +rom:00068dca MOVE A11,@0x1ad920,0x1 ; session count-- +rom:00068dcc SUB A8,A8 ; Success, and nothing is written back +``` + +That is the entire function: no reply, no resource work. The wire agrees — +`minor 2, 1 word` produces **no packet at all** (§10). + +### slot 3 — QUERY_OP_DEFAULTS (0x3FD78) + +``` +rom:0003fd90 SUBK 0x2,A11 / JREQ ; 2 words +rom:0003fd98 MOVK 0x1,A11 +rom:0003fd9a MOVB A11,*A13 ; reply.type = 1 +rom:0003fd9e MOVE A7,*A13(0x20),0x1 ; reply word 1 = 0 +rom:0003fda6 MOVE *A5(0xe0),*A13(0x10),0x0 ; reply word 0 low half <- client->0xe0 +rom:0003fdb6 ADDI 0x1ada70,A5 ; per-client record +rom:0003fdbc MOVE *A5(0x0),*A13(0x40),0x1 ; reply word 2 <- rec.f0 +rom:0003fdf4 CALLA 0x07e6a422 ; WriteToClient (or the 0xD4B10 swapper) +``` + +The request's second word is never read — only `length` is. Live reply: + +``` +minor 3, 2 words: 01 41 03 00 | 00 00 00 00 | 00000000 00000000 14000000 +``` + +i.e. `type=1, data=0x41, length=0`, then three fixed words with the third = `0x14` +(20). It is a small "what are the defaults" answer: 0, 0, 20 — 20 is a plausible +default bits/pixel or tile row count for a 1-bit terminal. + +### slot 4 — SET_OP_DEFAULTS (0x3FE06), the whole body + +``` +rom:0003fe16 MOVE *A9(0x10),A11,0x0 / SUBK 0x2 / JREQ ; 2 words +rom:0003fe26 MOVE *A11,A7,0x1 ; client +rom:0003fe2a SLL 0x7,A7 / SLL 0x5,A5 ; idx*160 bits = 20 bytes +rom:0003fe30 ADDI 0x1ada70,A7 +rom:0003fe36 MOVE *A9(0x20),*A7(0x0),0x1 ; rec.f0 <- request word 1 +rom:0003fe3c SUB A8,A8 ; Success +``` + +Write-only, no reply, sets exactly the field that slot 3 reads back. Live: no +packet (wire shows TIMEOUT because there is nothing to read), and the server +stays healthy. + +**Verdict on the pass-1 hypothesis**: slot 2 *is* a session teardown and slot 1 +*is* a session init/query — but they are not "init/query" in the 5.0 sense of a +pure query; slot 1 owns per-client state and a counter, and slot 2 releases it. +Confirmed. + +--- + +## 5. Slots 5 and 6 + +### slot 5 — a mode-selecting setter (0x68DDC) + +``` +rom:00068ddc ... SUBK 0x5,A11 / JREQ ; exactly 5 words +rom:00068de? SETF 0x8,0x0,0x0 +rom:00068de? MOVE *A9(0x20),A11,0x0 ; request byte 4 (8-bit) +rom:00068de? SUBK 0x2,A11 +``` + +Byte 4 must be `2`; anything else falls through to the error path. Live, with +byte 4 = 2 and the rest zero: + +``` +minor 5, 5 words (byte4=2): ERROR code=2 (BadValue) bad=0x0 minor_op=5 +minor 5, 1 word : BadLength +``` + +So slot 5 both *validates* a mode byte and then refuses the (zero) parameters +with `BadValue`. Its length (5 words = 20 bytes) and a mode selector is a good +fit for `XIEP_SET_TRANSPORT` ("Establishes the required transport context +information", with the "does not support a DCT compression scheme" restriction +explaining the mode check). Marked [I]. + +### slot 6 — an argless query with a reply (0x68EC6) + +``` +rom:00068eda MOVE *A9(0x10),A11,0x0 / DEC / JREQ ; exactly 1 word +rom:00068ee6 MOVK 0x1,A11 / MOVB A11,*A13 ; reply.type = 1 +rom:00068ef4 MOVE *A5(0xe0),*A13(0x10),0x0 ; <- client->0xe0 +rom:00068f14 CALLA 0x07ea8f38 ; fill +rom:00068f26 CALLA 0x07e6a422 ; write reply +``` + +Live (1 word): + +``` +minor 6: 01 00 04 00 | 00000000 | 02000000 01000000 01000000 01000000 +``` + +Four small words after the header — `2, 1, 1, 1`. With three events registered +(§9) this reads as "event selection state". DEC's Table C-1 has exactly one +argless query in Process Control (`XIEP_QUERY_EVENTS`, "Queries which events the +client will be notified of"). Marked [I] — a colour-list-style query would fit +the shape too, but the reply `2,1,1,1` is event-like, not a list of resource ids. + +--- + +## 6. The multi-operation classes: slots 7, 8, 10 [C] + +These three do not implement one operation — they **switch on a 32-bit operation +code at request byte 4** and tail-call a sub-handler. This is the single most +important structural finding of this pass: several "requests" in the 2.3 table +are whole classes. + +### slot 7 — two operations (0x66866) + +``` +rom:00066878 MOVE *A9(0x10),A11,0x0 / SUBK 0x4 / JREQ ; 4 words +rom:000668ca MOVE *A9(0x20),A8,0x1 ; A8 = request byte 4 (32-bit read) +rom:000668ce DEC A8 +rom:000668d0 JREQ 0x00066884 ; op == 1 -> CALLA 0x07ea742c +rom:000668d2 DEC A8 +rom:000668d4 JREQ 0x00066894 ; op == 2 -> CALLA 0x07ea759a +rom:000668d6 JR 0x000668a4 ; else -> SendError(BadRequest, stuff->8) +``` + +`0x6742C` (op 1) re-checks `length == 4`, then resolves a photo resource: + +``` +rom:0006744e MOVE A14,-*SP,0x1 +rom:00067450 MOVE *A9(0x40),*A14+,0x1 ; arg = request byte 8 +rom:00067454 MOVE *A9(0x60),*A14+,0x1 ; arg = request byte 12 +rom:0006745c MOVE A11,*A14+,0x1 +rom:00067460 MOVE A7,*A14+,0x1 +rom:00067462 MOVE *A13(0xffe0),*A14+,0x1 +rom:00067466 CALLA 0x07ea6fa0 ; LookupPhotos(...) +rom:00067472 JRNE 0x00067590 ; error -> return it +``` + +So: **{byte 4 = operation 1|2, byte 8 = id, byte 12 = type/class}**, then the +sub-handler acts. A two-way split with an id and a class word is very naturally +the `CREATE_BY_VALUE` / `CREATE_BY_REFERENCE` pair from DEC's Resource Services. + +### slot 8 — four sub-handlers, selector 1/2/4/5/6 (0x668E4) + +`SUBK 0x3 / JRNC` (≥3 words), then a decrement chain on the byte-4 word: + +``` +rom:00066968 MOVE *A9(0x20),A8,0x1 ; operation word +rom:0006696c DEC A8 / JREQ 0x00066912 ; op 1 +rom:00066970 DEC A8 / JREQ 0x00066912 ; op 2 (same handler as 1) +rom:00066974 SUBK 0x2,A8 / JREQ 0x00066902 ; op 4 +rom:00066978 DEC A8 / JREQ 0x00066922 ; op 5 +rom:0006697c DEC A8 / JREQ 0x00066932 ; op 6 +rom:00066980 JR 0x00066942 ; anything else -> BadRequest +``` + +Four distinct `CALLA` targets (`0x676CA`, `0x677DA`, `0x67B46`, `0x67DA8`), +all in the same `0x67xxx` resource-management block as slot 7's sub-handlers. +Op 3 is not accepted — an opcode hole worth remembering when probing. + +### slot 10 — five operations **and** a reply (0x66B64) + +``` +rom:00066b76 MOVE *A9(0x10),A11,0x0 / SUBK 0x3 / JREQ ; 3 words +rom:00066bf8 MOVE *A9(0x20),A8,0x1 ; operation word +rom:00066bfc DEC A8 +rom:00066bfe CMPI 0x5,A8 +rom:00066c02 JRHI 0x00066bd2 ; op > 5 -> SendError(BadRequest) +rom:00066c04 SLL 0x5,A8 ; *32 bits = 4-byte stride +rom:00066c06 ADDI 0x3f536080,A8 ; jump table at file 0x66C10 +rom:00066c0c MOVE *A8,A8,0x1 +rom:00066c0e JUMP A8 +``` + +Sub-handlers: `0x683A4`, `0x68462`, `0x68516`, `0x68660`, `0x6872A`. Op 1 +(`0x683A4`) calls the resource helper `0x66E70` with `(client, &local, +request byte 8, 4)` and then builds a reply: + +``` +rom:000683b8 MOVK 0x4,A7 +rom:000683ba MOVE A7,*A14+,0x1 ; arg = 4 +rom:000683bc MOVE *A9(0x40),*A14+,0x1 ; arg = request byte 8 +rom:000683c2 MOVE A11,*A14+,0x1 +rom:000683c4 CALLA 0x07ea6e70 ; resource create/lookup +rom:000683d2 MOVK 0x1,A7 / MOVB *A7,*A13(0x20) ; reply.type = 1 +rom:000683e4 MOVE *A5(0xe0),*A13(0x30),0x0 ; <- client->0xe0 +``` + +Live, with byte 8 = `0x2222` and op 1…5: **`BadRequest` for every op** — the +third word is rejected whatever it is, so `0x2222` is not a valid id/flag there. +That is the experiment to redo with a real id (§11). + +Because only slots 1, 3, 6, 10 and 24 can reply, and slot 10 is the only +multi-operation one among them, slot 10 is the most likely home of the +**resource query** family (one operation per resource class) — marked [I]. + +--- + +## 7. The photo-resource family (11–15, 18, 22, 24, 33, 40, 43, 44) [C] + +All of these reach the same lookup helper `LookupPhotos` (`0x66FA0`), which +emits `BadIDChoice` (14) when the id is not found, and the wire confirms it: an +id of `0xffffffff` produces `code=14, bad=0xffffffff, minor_op=`. + +The call shape is uniform — the caller pushes five values and the last one is the +resource **type/class**: + +``` +slot 11 0x667d8 MOVI 0xffff ; type = 0xFFFF + 0x667de MOVE *A9(0x20) ; id = request byte 4 +slot 12 0x6675a SUB A11,A11 ; type = 0 + 0x6675e MOVE *A9(0x20) ; id +slot 13 0x66ab0 MOVI 0xffff ; type = 0xFFFF +slot 14 0x66c58 MOVI 0xffff ; type = 0xFFFF +slot 21 0x62d64 SUB A11,A11 ; type = 0 +slot 22 0x63116 SUB A11,A11 ; type = 0 +slot 24 0x63182 SUB A11,A11 ; type = 0 +slot 33/40/44 MOVE *A9(0x40) first ; type = request byte 8 (client-chosen) +slot 43 MOVE *A9(0x40) first ; type = request byte 8 +``` + +So 2.3 has a *generic photo handle*: `{id at byte 4, class at byte 8}`. Slots +33/40/43/44 let the client name the class explicitly; slots 11–15/21/22/24 have +it hard-coded (`0xFFFF` = any). That is why they all answer `BadIDChoice` +identically: they are all "operate on photo resource ". + +Which operation each one performs is still open. The discriminators that survive: + +* **24** is the only one of the family with a reply → it is the **query** + (`QueryPhotomap`/`QueryPhotoflo` analogue) [C]. +* **12** and **22** are the smallest (2 words, id only) → the **delete** family + (`DeleteResource` / `FreeExport`) [I]. +* **14** (4 words, id + two more fields) and **11** (3 words) take extra + parameters → mutating operations [I]. + +The 2.3 lengths are consistently longer than 5.0's for the same operations +(11: 3 vs 2, 24: 4 vs 3), matching the pass-1 finding. + +--- + +## 8. Large / data-carrying requests: 19, 20, 21, 43 + +| slot | words | read fields (bytes) | what the shape says | +|---|---|---|---| +| 19 | ≥8 | 4, 8, 12, 16, 20, 24, 28 | a fixed header followed by a counted list — `PUT_TILE` / `PUT_STREAM` (transport) or a photoflo element list | +| 20 | **exactly 35** | 4, 8, 12, 13, 14, 16 | fixed-size definition: 35 words is too rigid for a data stream, so it is a *definition* record (`CREATE_PHOTOFLO` or `EXECUTE_PHOTOFLO` with a fixed element block) | +| 21 | 16 | 4, 16, 20, 24, 28, 32, 36 | resource op with a parameters block | +| 43 | 10 | 4, 8, 20, 24 | photo op with two ids and trailing words | + +Slot 20's `MOVK 0x19` (25) written into a local before the length check +(`rom:0006aa5e`) gives it a 25-element notion; combined with 35 words = +4 header + 31 payload words it looks like "one fixed-size element descriptor". +Marked [I]. + +**Slot 19 is the best `PUT_STREAM`/`PUT_TILE` candidate** (≥8 words, a counted +list, and it is one of only three slots with an "at least" length check, which +is what a data-carrying request needs). Not confirmed. + +--- + +## 9. The export path and the three events + +**Export.** DEC's Table C-1 says `XIEP_EXPORT` "Creates a new server PIXMAP +resource object" and `XIEP_QUERY_EXPORT` "Queries the export context". In the +ROM, the only slots that can both take an id and reply are 10 and 24, and slot 10 +is the five-operation class. So the export path is almost certainly **slot 10 +(one of its five operations), with the reply carrying the export context**, but +I could not pin which operation [U]. No slot was found that reads a `Drawable` +or `Pixmap` XID directly at a fixed offset; the drawable is most likely inside +the parameter block of slot 10 or 21 (both read a run of 32-bit words at +bytes 16..40) [U]. + +**Events.** `NumEvents = 3` (pass 1, `0x64AC4`). The three event numbers are +`first_event .. first_event+2` = 64, 65, 66 on the live server. Slot 6's reply +(`2, 1, 1, 1`) is the only event-shaped data in the table, and DEC's Process +Control group has `SELECT_EVENTS` (setter) and `QUERY_EVENTS` (argless query). +The natural pairing is slot 6 = QUERY_EVENTS and a setter elsewhere — the best +setter candidate is **slot 5** (mode byte + parameters, BadValue on bad values) +[I]. No slot was found that reads an event *mask of three bits* explicitly [U]. + +--- + +## 10. Minimal 2.3 client — the part that is verified [C] + +Everything below was executed against the live server in one connection +(`/tmp/opencode/xie_min_client.py`; transcript in the evidence folder). It is +a complete, working session lifecycle. + +``` +1. XConnSetup l 11.0 +2. QueryExtension "Xie" -> present=1 opcode=129 first_event=64 +3. minor 1, length 2, payload 02 00 03 00 (declare "I speak 2.3") + -> REPLY len=8 + 01 01 08 00 00 00 | 02 00 | 03 00 | <4 words> | ... + ^type ^data ^length=8 ^major ^minor +4. minor 3, length 2, payload 00 00 00 00 (QueryOpDefaults) + -> REPLY len=0 + 01 41 00 00 00 00 | 00000000 | 00000000 | 14000000 +5. minor 6, length 1 (QueryEvents) + -> REPLY len=0 + 01 00 00 00 00 00 | 00000000 | 02000000 | 01000000 | 01000000 | 01000000 +6. minor 2, length 1 (TermSession) + -> no packet at all; close the connection +``` + +Notes that matter for a client author: + +* The request header is the normal X11 one: `reqType=129, opcode=minor, + length=, LE`. `length` is checked by every handler. +* **Every reply carries `length` in words after the 32-byte header**, and for + minor 1 that is 8 — i.e. the reply is 64 bytes; the eight "levels" words are + the tail. Only `major = 2` and `minor = 3` (reply bytes 8..11) were stable + across every run. The words after them were **not**: three separate runs gave + `20 00 00 00 / e0 56 41 00 …`, the same, and `f0 9b 7c 00 / 70 db 20 00 / + 05 00 00 00 …`. So a 5.0 client that parses the tail as + `xieQueryImageExtensionReply` is reading per-connection values, not a stable + capability record. (Transcripts: `handlers/client_session.txt`.) +* A client that speaks 5.0 must **not** expect a reply to minor 2; the server + returns `Success` and sends nothing. + +The verification transcript is `xie/ghidra-evidence/handlers/client_session.txt`. + +--- + +## 11. What is still missing, and the exact probes that would settle it + +> **See `GHIDRA_XIE_IMAGE_PATH.md`** (third pass) for the request field maps +> recovered from the byte-swap stubs, slot 19 identified as the tile-put +> (`{id,x,y,w,h,count}` + payload), and the ranked create→put→export sequence. + + +Static analysis is exhausted for the resource/transport/process half: the +handlers delegate to a shared resource manager whose class codes are passed as +arguments, and those arguments are client data. The following matrix is +ordered so that each step's result disambiguates the next. + +| # | probe | what a positive result means | +|---|---|---| +| 1 | slot **4**, 2 words, word1 = `0x00000010`; then slot **3** | if slot 3's reply word 2 becomes `0x10`, slot 4 is confirmed as SET_OP_DEFAULTS and slot 3 as QUERY_OP_DEFAULTS | +| 2 | slot **6** after step 1 | if the reply changes with slot 4/5 parameters, slot 6 is QUERY_EVENTS tied to those defaults | +| 3 | slot **7**, 4 words: `op=1, id=0x00AAAAAA, class=0xFFFF` | Success ⇒ slot 7 op 1 *creates* a photo resource (CREATE_BY_VALUE); then step 4 | +| 4 | slots **11,12,13,15,22,24,33** with id `0x00AAAAAA` | the one that stops answering `BadIDChoice` and answers something else is that resource's query/delete — this maps the family in one sweep | +| 5 | slot **24**, 4 words, `id=0x00AAAAAA, 0, 0` | if it replies now, slot 24 is QUERY_RESOURCE and the reply bytes give the 2.3 resource record layout | +| 6 | slot **10**, 3 words, `op=1..5, word2 = ` | the op that replies is the export/query op; the reply bytes give the export context | +| 7 | slot **19**, 8 words, zeros except a small count at byte 4 | if it accepts, it is the data-transport request; vary byte 4 to find the count field | +| 8 | slot **20**, 35 words, zeros | if it accepts, it is the fixed-size photoflo definition; the error value on failure names the offending field | + +Each probe is a single request on its own connection, preceded by minor 1 +(otherwise the per-client record is not initialised). Anything that creates a +resource must be followed by the delete candidate from step 4 on the same +connection. + +Two cheap cross-checks that would also help: + +* `strings` in the sibling ROMs / DEC client kits for `XIEP_` orderings — the + manual's Table C-1 groups functions but does not prove opcode order. +* A byte-swapped (big-endian) connection: `XieSProc` indexes the `0x18D9A6` + table, whose stubs swap a *fixed* set of words per request. Reading stub + `0x697xx` for a slot enumerates exactly which request words the server treats + as 32-bit values — a ready-made field map for every slot. That is the single + highest-value follow-up and it is pure ROM reading. + +--- + +## 12. Confirmed / Inferred / Unknown + +**Confirmed** + +1. Three pointer tables (proc / swapped-proc / reply-swap) at RAM `0xD3F90`, + `0xD4550`, `0xD4B10`; the reply-swap table has entries only for slots + 1, 3, 6, 10, 24. *(Corrects GHIDRA_XIE.md §3/§6.1.)* +2. Slot 1 = INIT_SESSION ≡ QueryImageExtension (2 words, 64-byte reply, + major 2 / minor 3, increments `0x1AD920`), slot 2 = TERM_SESSION (1 word, + decrements it, no reply). +3. Slot 3 reads the per-client record and replies; slot 4 writes the same field. + Together with 1/2 they form DEC's four Session Services. +4. Slots 7, 8, 10 switch on a 32-bit operation word at request byte 4 + (2, 4 and 5 sub-handlers; jump table at file `0x66C10` for slot 10). +5. Slots 11, 12, 13, 14, 15, 22, 24, 33, 40, 44 all resolve a photo resource + through `LookupPhotos` and answer `BadIDChoice` for a bad id; slots + 33/40/43/44 take the class from the request (byte 8), the others hard-code it. +6. Slot 5 requires byte 4 = 2 and then answers `BadValue` for zeroed parameters; + slot 6 is argless and replies with `2,1,1,1`. + +**Inferred** + +1. Names QUERY_OP_DEFAULTS (3), SET_OP_DEFAULTS (4), QUERY_EVENTS (6), + SET_TRANSPORT (5). +2. Slot 7 = create-by-value / create-by-reference pair. +3. Slot 10 hosts the resource-query/export family (5 classes). +4. Slot 12 and 22 are the delete family. +5. Slot 19 is a transport data request, slot 20 a fixed-size photoflo definition. + +**Unknown** + +1. Which of slots 11/13/14/15/18/21/24/33/40/43/44 does which resource + operation, and which resource class each hard-coded type code means. +2. The 2.3 request layouts for the create/delete/query parameter blocks beyond + the id/class words. +3. How the export path names its drawable/pixmap. +4. Whether slot 6 is QUERY_EVENTS or a colour-list query (the reply is + event-shaped, but no slot was found that sets an event mask). +5. What the 8 trailing words of the minor-1 reply mean. +6. Slot 20's 35-word layout. + +--- + +## 13. Reproduction + +1. `program_list_open` → session `afdab6e16b8240f294d45a5309f7caa3` + (already writable; no re-import needed). +2. Per-slot listings are pre-extracted in `xie/ghidra-evidence/handlers/` + (`slotNN_HHHHHH.txt`, from each handler's Ghidra *function body*). + To regenerate: + + ```python + f = program.getFunctionManager().getFunctionAt(addr(0x68A4C)) + [print(i.getAddress(), i) for i in program.getListing().getInstructions(f.getBody(), True)] + ``` + +3. Reply-swap table: + + ```python + import jpype, struct + a = jpype.JArray(jpype.JByte)(0x1c0000); program.getMemory().getBytes(program.getMinAddress(), a) + d = bytes((b & 0xff) for b in a) + [hex(struct.unpack_from(" **See `GHIDRA_XIE_PIPELINE.md`** (final pass): the BadMatch gate is +> resource byte 5 bit 0, set from the create request's level word at byte 28; +> with a non-zero level entry the create (slot 8 op 2) produces an exportable +> class-2 resource. Exact 12/8/16-word payloads are there. + + +Third pass. Program `vt1200_v22.bin` (md5 `b46a3e442ccb86134d2356bd70d22fd2`). +**The Ghidra session from passes 1–2 is gone**; I re-opened the ROM and this +report's addresses come from the new session +`a03f3d788b874b1a976a55417ab9f2d3` (same program, same base `rom:00000000`, +same language `tms34010:LE:32:default`). All addresses are file/byte offsets, so +they are identical to the earlier reports; `mame_bit = 0x3F200000 + off*8`. + +New raw material: `xie/ghidra-evidence/image_path/swapper_slotNN_HHHHHH.txt` — +the 24 request byte-swappers, one per implemented slot. **These give the exact +32-bit field map of every request**, which is the main new evidence here. + +Read with passes 1 and 2 (`GHIDRA_XIE.md`, `GHIDRA_XIE_HANDLERS.md`). + +--- + +## 1. Executive summary + +**Nothing in the ROM creates an image resource through a plain single-id +request.** Every 2-word and 3-word resource slot (11, 12, 13, 15, 22, 24, 33, +40, 44) begins with `LookupPhotos` and answers `BadIDChoice` for an unused id — +that was measured on the wire in pass 2 and it is confirmed structurally here. +Creation must therefore live inside the **multi-operation classes 7, 8, 10**, and +those are the only slots whose selector semantics are still open. + +What *is* now nailed down: + +* **Request field maps for all 25 slots**, from the byte-swappers (§3). Slots + 7, 9 and 10 carry nothing but 32-bit words; slots 12 and 22 are literally + `{header, id}`. +* **Slot 19 is the tile-put request.** It clamps (x, y), adds (w, h) to get the + right/bottom edges, rejects a fully clipped rectangle with `BadValue`, + iterates `count` elements writing x and y into per-element records, and uses + the request tail as pixel data. Layout: `{id@4, x@8, y@12, w@16, h@20, + count@24}` + payload (§4). This is DEC's `XIEP_PUT_TILE` + ("Transports random tiles of uncompressed image data from the client to the + server") — confidence **high** on structure, **medium** on the name. +* **Slot 21 is the export candidate**: 16 words, `{id@4, then ten 32-bit words at + 8…44, two 16-bit sub-words}`, and it starts by resolving the id through + `LookupPhotos` — i.e. "take this image resource and produce something from + it". DEC: `XIEP_EXPORT` "Creates a new server PIXMAP resource object". +* **Slots 20 and 43** are the only ones shaped like a *fixed* descriptor + (35 words / 10 words); slot 20 additionally seeds a 25-element notion. + +**The biggest blocker** is a single missing fact: **which request creates the +image resource, and what class code it wants.** Without it nothing can be put or +exported. Second blocker: whether the export targets a client-created Pixmap +(5.0 model) or creates one itself (DEC wording). §7 gives the exact probes that +settle both in four requests. + +--- + +## 2. Slot table — resource / transport / export family + +"fields" is the set of 32-bit request words proven by the byte-swapper (`w` = +word index, byte offset = 4×w), so it is the *wire* layout, not an inference. + +| slot | best name | conf | 5.0 / DEC counterpart | words | 32-bit fields (byte off) | reply | +|---|---|---|---|---|---|---| +| 7 | **resource create class** — op 1/2 = create-by-value / by-reference | [I] | `XIEP_CREATE_BY_VALUE`, `XIEP_CREATE_BY_REFERENCE` | 4 | 4 (op), 8 (id), 12 (class) | no | +| 8 | resource class, 4 sub-handlers (ops 1,2,4,5,6) | [I] | resource services | ≥3 | 4, 8, 12, 16, 20 | no | +| 9 | 3-word op on a resource | [U] | — | 3 | 4, 8 | no | +| 10 | 5-operation class (query/export shaped) | [I] | `XIEP_QUERY_RESOURCE` / `XIEP_QUERY_EXPORT` / `XIEP_EXPORT` | 3 | 4 (op), 8 | **yes** | +| 11 | resource op with a second parameter | [U] | — | 3 | 4, 8 | no | +| 12 | **delete / free** (id only) | [I] | `XIEP_DELETE_RESOURCE`, `XIEP_FREE_EXPORT` | 2 | 4 | no | +| 13 | delete / free (id only) | [I] | as above | 2 | 4 | no | +| 14 | resource op, id + one long + two half-words | [U] | — | 4 | 4, 8 | no | +| 15 | pipeline op (photoflo family) | [U] | `XIEP_BIND_PHOTOFLO`? | 3 | 4, 8 | no | +| 18 | pipeline op | [U] | `XIEP_EXECUTE_PHOTOFLO`? | ≥4 | 4, 8 | no | +| 19 | **PUT_TILE** — x/y/w/h + counted payload | [C] structure | `XIEP_PUT_TILE` | ≥8 + data | 4, 8, 12, 16, 20, 24 | no | +| 20 | fixed descriptor (photoflo definition) | [I] | `XIEP_EXECUTE_PHOTOFLO` / `CREATE_PHOTOFLO` | 35 | 4, 8, 16 (+16-bit at 12) | no | +| 21 | **EXPORT** — id + big parameter block | [I] | `XIEP_EXPORT` | 16 | 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44 | no | +| 22 | **delete / free** (id only) | [I] | `XIEP_DELETE_RESOURCE` | 2 | 4 | no | +| 24 | **QUERY_RESOURCE** (only photo slot with a reply) | [C] | `XIEP_QUERY_RESOURCE` | 4 | 4, 8 (+16-bit at 12) | **yes** | +| 33 | generic photo op, class from the request | [I] | `XIEP_QUERY_EXPORT`? | 4 | 4 (id), 8 (class), 12 | no | +| 40 | generic photo op, class from the request | [I] | — | 4 | 4, 8 | no | +| 43 | large photo op (10 words) | [U] | `XIEP_PUT_STREAM`? | 10 | 4, 8, 16, 20, 24 (+ one 16-bit field near 14) | no | +| 44 | generic photo op, class from the request | [I] | — | 5 | 4, 8, 12, 16 | no | + +Session slots (1–6) are unchanged from pass 2: 1 `INIT_SESSION`, 2 +`TERM_SESSION`, 3 `QUERY_OP_DEFAULTS`, 4 `SET_OP_DEFAULTS`, 5 mode-selecting +setter, 6 `QUERY_EVENTS`. + +--- + +## 3. How the field maps were recovered [C] + +For a byte-swapped client, `XieSProc` calls the per-slot stub; each stub +byte-swaps `stuff->length` and then every 32-bit request word in place, then +re-dispatches into `XieProc`. One 32-bit word at byte *B* produces three `MOVB` +instructions: + +``` +rom:00069c04 MMTM SP,0x74 ; slot 11's swapper +rom:00069c0a MOVE *A13(0xffe0),A11,0x1 +rom:00069c0e MOVE *A11(0x40),A10,0x1 ; stuff +rom:00069c12 MOVB *A10(0x10),*A9 ; ---- swap stuff->length +rom:00069c16 MOVB *A10(0x18),*A10(0x10) +rom:00069c1c MOVB *A9,*A10(0x18) +rom:00069c20 MOVB *A10(0x20),*A9 ; ---- word at byte 4 +rom:00069c24 MOVB *A10(0x38),*A10(0x20) +rom:00069c2a MOVB *A9,*A10(0x38) +rom:00069c2e MOVB *A10(0x28),*A9 ; (bytes 5/6 of the same word) +rom:00069c32 MOVB *A10(0x30),*A10(0x28) +rom:00069c38 MOVB *A9,*A10(0x30) +rom:00069c3c MOVB *A10(0x40),*A9 ; ---- word at byte 8 +... +rom:00069c5e MOVE *A10(0x8),A11,0x0 ; minor opcode +rom:00069c64 ADDI 0xd3f90,A11 ; -> XieProc's proc table +``` + +Applied to all 24 stubs, the swapped-word sets are: + +| slot | 32-bit words at byte | reading | +|---|---|---| +| 1 | — (16-bit at 4 and 6 only) | version pair `{major, minor}` | +| 2 | — | no arguments at all | +| 3 | 4 | one 32-bit argument (the 2.3 handler ignores it) | +| 4 | 4 | one 32-bit value → per-client record | +| 5 | — | every argument is ≤16 bits | +| 7 | 4, 8, 12 | `{op, id, class}` | +| 8 | 4, 8, 12, 16, 20 | parameter run | +| 9, 10 | 4, 8 | `{op, value}` | +| 11 | 4, 8 | `{id, param}` | +| 12, 13, 22 | 4 | `{id}` | +| 14 | 4, 8 | `{id, param}` + half-words | +| 15 | 4, 8 | `{a, b}` | +| 18 | 4, 8 | `{a, b}` | +| 19 | 4, 8, 12, 16, 20, 24 | `{id, x, y, w, h, count}` | +| 20 | 4, 8, 16 | plus 16-bit fields at 12 | +| 21 | 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44 | id + ten parameters | +| 24 | 4, 8 | `{id, param}` | +| 33 | 4, 8, 12 | `{id, class, param}` | +| 40 | 4, 8 | `{id, class}` | +| 43 | 4, 8, 16, 20, 24 (+16-bit at 14) | | +| 44 | 4, 8, 12, 16 | | + +This is why slots 12/13/22 are "delete shaped" and 33/40/44 are "generic photo +handle" slots: 33 passes `stuff->class` (byte 8) as the last argument to +`LookupPhotos`, so the *client* names the resource class, while 11/12/13/14/15/ +21/22/24 hard-code it (`0xFFFF` = any, or `0`). + +--- + +## 4. Slot 19 = the tile-put path [C for structure] + +Length check and the identification call: + +``` +rom:0006a782 MOVE *A9(0x10),A11,0x0 ; stuff->length +rom:0006a786 SUBK 0x8,A11 +rom:0006a788 JRNC 0x0006a790 ; length >= 8 words +rom:0006a78a MOVK 0x10,A8 ; else BadLength +rom:0006a790 MOVE A14,-*SP,0x1 +rom:0006a792 MOVE *A9(0xc0),*A14+,0x1 ; arg = stuff word @ byte 24 +rom:0006a796 MOVK 0x3,A11 +rom:0006a798 MOVE A11,*A14+,0x1 ; arg = 3 +rom:0006a79a MOVE *A9(0x20),*A14+,0x1 ; arg = id @ byte 4 +rom:0006a7a2 MOVE A7,*A14+,0x1 +rom:0006a7aa MOVE *A13(0xffe0),*A14+,0x1 +rom:0006a7ae CALLA 0x07eab966 ; 0x6B966 (pipeline attach, arg 3) +``` + +Then the rectangle algebra, which is what makes this the put path: + +``` +rom:0006a7be MOVE *A9(0x40),A11,0x1 ; w1 = x (byte 8) +rom:0006a7c2 JRLE 0x0006a7ca ; clamp to 0 +rom:0006a7cc MOVE A11,*A13(0x80) ; local x +rom:0006a7d0 MOVE *A9(0x60),A7,0x1 ; w2 = y (byte 12) +rom:0006a7de MOVE A7,*A13(0xa0) ; local y +rom:0006a7e2 MOVE *A9(0x80),A7,0x1 ; w3 = width (byte 16) +rom:0006a7e6 MOVE *A9(0x40),A5,0x1 ; + x +rom:0006a7ea ADD A5,A7 +rom:0006a7ee MOVE *A5(0x80),A5,0x1 ; compare with dst width -> clip +... +rom:0006a812 MOVE *A9(0xa0),A7,0x1 ; w4 = height (byte 20) +rom:0006a816 MOVE *A9(0x60),A5,0x1 ; + y -> clip +... +rom:0006a84e JRLE 0x0006a854 +rom:0006a850 MOVE A5,A8 +rom:0006a852 JRGT 0x0006a87c ; rectangle non-empty -> go on +rom:0006a856 MOVK 0x2,A5 ; else error 2 = BadValue +rom:0006a85a MOVE *A9(0x20),*A14+,0x1 ; (client, major, minor, id, 2) +rom:0006a870 CALLA 0x07effa5e ; SendErrorToClient +``` + +and the payload loop: + +``` +rom:0006a88c MOVE *A9(0xc0),*A13(0x40) ; loop counter = word @ byte 24 +rom:0006a896 JREQ 0x0006aa28 ; zero elements -> skip +rom:0006a89e BTST 0x0,A11 ; bit 0 of that word = direction/flag +rom:0006a8ac SLL 0x5,A5 ; element stride 32 bits +rom:0006a8b0 MOVE *A5(0x160),A5,0x1 +rom:0006a8b4 MOVE *A13(0x80),*A5(0xa8),0x1 ; element.x = x +rom:0006a8c6 MOVE *A13(0xa0),*A5(0xe8),0x1 ; element.y = y +rom:0006a8d8 MOVE *A13(0x80),A7,0x1 +rom:0006a8dc MOVE *A13(0xc0),A11,0x1 +rom:0006a8e0 ADD A11,A7 ; x += width +``` + +**Layout (bytes):** `0 hdr | 4 id | 8 x | 12 y | 16 width | 20 height | +24 count | 28 two 16-bit fields (not byte-swapped as a long) | 32… payload`. +Minimum length 8 words = 32 bytes, i.e. header only; pixel bytes follow and are +covered by the same `length`. + +Not proven: whether `count` counts bytes, rows, or tile records, and whether the +payload is raw 1-bit rows packed 8-per-byte or bit-addressed. The `BTST 0x0` +on the same word suggests a flags/count word; the loop's stride-32-bit element +walk suggests it is a *count of tiles*, not bytes. + +--- + +## 5. Export candidates + +**Slot 21** — 16 words, resolves the id then works on it: + +``` +rom:00062d58 SUBK 0x10,A11 / JREQ ; exactly 16 words +rom:00062d68 MOVE *A9(0x20),*A14+,0x1 ; arg = id @ byte 4 +rom:00062d6c MOVE A13,A7 / MOVE A7,*A14+ ; out pointer 1 +rom:00062d72 MOVE A13,*A14+ ; out pointer 2 +rom:00062d78 CALLA 0x07ea6fa0 ; LookupPhotos(client, id, &a, &b, 0) +rom:00062d84 JRNE 0x000630ea ; lookup error -> return it +rom:00062d88 MOVE *A13(0x20),A11,0x1 ; the resolved resource +``` + +It then walks the ten 32-bit parameters at bytes 8…44. A 44-byte parameter block +after a resource id is exactly what an export descriptor looks like +(destination pixmap, x, y, w, h, visual/format, stride, flags). **[I]** + +**Slot 10** — five operations, the only multi-op slot that replies, so if 2.3 +has a "query export context" it is one of its five ops. Its request is only +three words `{op@4, value@8}`, so its ops must be id-free or take the id in +`value`. **[I]** + +**Slots 33/40/44** pass a client-chosen class to `LookupPhotos` and then a +parameter; they are the "do something to resource of class " form and +are the most likely home of export-by-class. **[I]** + +--- + +## 6. Best sequence + +Everything is little-endian; `len` is in words including the 4-byte header. +Step confidence in brackets. + +``` +[0] connect, QueryExtension("Xie") -> opcode 129 [C] + +[1] INIT_SESSION minor 1, len 2 + 02 00 03 00 (client speaks 2.3; any value accepted) + -> 64-byte reply, major 2 minor 3 [C] + +[2] CREATE RESOURCE minor 7, len 4 [I] + op = 01 00 00 00 + id = 2a 00 00 00 (0x2A = our photomap id) + class = ?? ?? ?? ?? (see probe P1) + -> expect Success (no packet). BadRequest with bad=0x2a means the + class word or op is wrong. + +[3] PUT_TILE minor 19, len 8 + payload [I-high] + 00 00 00 00 | 2a 00 00 00 | 00 00 00 00 | 00 00 00 00 | + 40 00 00 00 | 40 00 00 00 | | 00 00 00 00 | + <512 bytes of 1-bit pixel data = 128 words> + total len = 136 + -> Success, or BadValue(2) if the rectangle clips away entirely, + BadIDChoice(14) if the id did not resolve. + +[4] EXPORT minor 21, len 16 [I] + id = 2a 00 00 00, then ten parameter words (probe P2) + -> Success expected; the pixmap id is client-supplied (DEC wording) + +[5] TERM_SESSION minor 2, len 1 [C] + -> no packet; just close. +``` + +### 6.1 The 64×64 checkerboard + +64 px × 64 rows at 1 bit = 8 bytes/row = 512 bytes = 128 words. A checkerboard +of 8×8 blocks is a single repeated 32-bit pattern per byte-pair; the simplest +generator is "row r, byte b: `0xAA` if ((r/8 + b) & 1) else `0x55`". + +``` +row 0..7 : AA 55 AA 55 AA 55 AA 55 (per byte, 8 bytes) +row 8..15 : 55 AA 55 AA 55 AA 55 AA +... +``` + +Which of the two bit orders is "on" does not matter for a first display test. + +### 6.2 Shorter path, if it exists + +If `XIEP_EXPORT` really creates the pixmap itself, step [4] returns the pixmap +id in the slot-10 reply and the client can skip creating a pixmap. If instead +the 5.0 model holds, the client must first +`CreatePixmap(depth=1, 64x64)` and pass that XID in step [4]; then +`XCopyArea(pixmap -> window)` displays it. Both variants use the same four +XIE requests; only the pixmap's origin differs. + +--- + +## 7. Probes that settle the open fields (for the worker with server access) + +Each probe is one connection: INIT (minor 1) → probe → TERM (minor 2). + +| id | request | variants | observation | +|---|---|---|---| +| P1 | create: minor 7, len 4, `{op, id=0x2A, class}` | class ∈ {0, 1, 2, 3, 4}, op ∈ {1, 2} | the pair that returns **Success** is create + the image class. `BadRequest` (code 1) with `bad=0x2a` ⇒ id rejected; `BadIDChoice` (14) ⇒ op is a lookup, not a create | +| P2 | export: minor 21, len 16, `{id=0x2A, …}` | zero-fill the ten parameters, then vary word at byte 8 (likely the destination pixmap or a format) | `BadIDChoice` ⇒ slot 21 is not the export from this id; Success ⇒ export, and the reply/absence of a reply tells whether the pixmap comes from the client | +| P3 | put: minor 19, len 8 (header only, no data) and len 136 with a checkerboard | count word at byte 24 ∈ {1, 64, 128, 512} | Success on the first, and `BadValue` on a zero-size rect, confirms the geometry; a length-related error identifies the count unit | +| P4 | query after put: minor 24, len 4, `{id=0x2A, 0}` | — | a reply whose words change after P3 proves the data landed (the only photo slot that can reply) | +| P5 | delete: minor 12 and 22, len 2, `{id=0x2A}` | — | whichever returns Success deletes the resource (the other is `FREE_EXPORT`) | + +Order matters: P1 first (nothing else can work without a resource), then P3, +then P4 to prove the pixels landed, then P2. + +--- + +## 8. Server-side constraints visible in the ROM + +* **Every handler checks `stuff->length` exactly** (or `>=` for 8, 18, 19); a + wrong length always yields `BadLength` (16) with `minor_op = 0` (pass 1 §7). + A 2.3 client must therefore get every length exactly right. +* Slot 19's clipping uses the *destination* resource's width/height read from + the resolved resource record (`*A5(0x80)`, `*A5(0xa0)`), so the image resource + must carry real dimensions before a put. That is the strongest argument that + the create step (P1) supplies width/height somewhere — note slot 7's request + is only `{op, id, class}`, so dimensions most likely come from **slot 8 or 21** + rather than 7. **This is the main open risk in the sequence above.** +* Slot 19 rejects a fully clipped rectangle with `BadValue` (2) and a bad id + with `BadIDChoice` (14), both carrying the real minor opcode. +* Export target type (Pixmap vs Window) is not visible in any handler I read; + DEC's manual says a *PIXMAP* resource is created. **[U]** +* 1-bit only: the terminal is `StaticGray`, effective depth 1 (live probe), and + DEC's restrictions say "resource-manipulation parameter values are restricted + to those compatible with bitonal images". + +--- + +## 9. Why this should display + +`XIE 2.3` on this server is the DEC/AGE-Logic image pipeline: a resource is +created and filled by transport (`PUT_TILE`), then *exported* into a pixmap the +X server owns. Once the pixels are in a pixmap, an ordinary X client can +`XCopyArea` them into the Terminal Manager's window — no XIE involvement after +the export. The three steps map one-to-one onto DEC's documented functions +(`XIEP_CREATE_*` → `XIEP_PUT_TILE` → `XIEP_EXPORT`), the field maps come from the +server's own byte-swappers rather than from guesswork, and slot 19's geometry +code is unmistakably a clipped rectangle blit. The uncertainty is in *which* +slot implements create, not in whether the pipeline exists. + +--- + +## 10. Confirmed / Inferred / Unknown + +**Confirmed** +1. Request field maps for all 25 implemented slots (§3), from the 24 byte-swap + stubs. +2. Slot 19 is a clipped-rectangle tile put with `{id, x, y, w, h, count}` and a + payload, minimum 8 words (§4). +3. Slots 12, 13 and 22 are `{header, id}` only; 11/14/15/18/24 take `{id, one + more long}`; 33 takes `{id, class, param}`. +4. Slot 21 resolves an id and then reads ten 32-bit parameters. +5. Slots 1–6 are the session/event group (pass 2). + +**Inferred** +1. Slot 7 (ops 1/2) is create-by-value / create-by-reference. +2. Slot 21 is export; slot 10 hosts query-export; 12/22 are delete/free. +3. Slot 19's `count` counts tile records, not bytes. + +**Unknown** +1. **Which slot creates the resource and where the dimensions live** — the + blocker. +2. Pixmap vs Window as the export target, and who allocates the pixmap id. +3. Whether the payload of slot 19 is packed rows or bit-addressed data. +4. The class code values (`0` vs `0xFFFF` vs a client number). + +--- + +## 11. Reproduction + +1. `program_list_open` → empty; re-open with + `program_open(path="/home/arti/code/k-space/vt1200/vt1200_v22.bin", + language="tms34010:LE:32:default", project_location=…, read_only=false)` + → session `a03f3d788b874b1a976a55417ab9f2d3`. +2. Swapper listings are pre-extracted in + `xie/ghidra-evidence/image_path/swapper_slotNN_HHHHHH.txt`. +3. Handler bodies: `xie/ghidra-evidence/handlers/slotNN_HHHHHH.txt` (pass 2). +4. To re-derive a field map, collect the `MOVB *(A10|A11)(0xNN),*A9` offsets in + a stub: a 32-bit word at byte *B* shows up as offsets `8B, 8B+8, 8B+16, + 8B+24`; the length swap is the pair at `0x10`/`0x18` and must be ignored. diff --git a/xie/GHIDRA_XIE_IMPORT.md b/xie/GHIDRA_XIE_IMPORT.md new file mode 100644 index 0000000..a5a5957 --- /dev/null +++ b/xie/GHIDRA_XIE_IMPORT.md @@ -0,0 +1,285 @@ +# XIE 2.3 — why `PUT_TILE` refuses, and what binding it wants + +> **See `GHIDRA_XIE_SLOT20.md`**: `PUT_TILE`'s payload pointer (request byte 32) +> is handed to the DD input through a transient band-record byte 5 and cleared; +> slot 20 runs the per-band DD chain over the resource's 3 bands; the band array +> (`res->0x160` → `band+0xd8`) is created by the slot-8 create path. + + +Fourth pass. Program `vt1200_v22.bin`, Ghidra session +`a03f3d788b874b1a976a55417ab9f2d3`. Addresses are file offsets; +`mame_bit = 0x3F200000 + off*8`; `CALLA` operand − `0x7E40000` = file offset. + +Read `GHIDRA_XIE_PIPELINE.md` first — it has the resource class/level model that +this pass builds on. Raw listings: `xie/ghidra-evidence/import/` +(`lookup_6B966`, `slot07_op1_6742C`, `slot07_op2_6759A`, `resource_init_6CA82`). + +**Offset convention (important).** Offsets in these listings are *bit* offsets. +`*A9(0x20)` = request byte 4; `*A11(0x120)` = resource **byte 36**; +`*A11(0x140)` = resource **byte 40**. + +--- + +## 1. The lookup helper `0x6B966` [C] + +Slot 19 calls it with seven arguments. The pushes at `0x6a790…0x6a7ae` are, in +memory order: `req[24]`, `3`, `req[4]`, `&local0`, `caller A13`, `0`, `client`, +so the C signature is: + +``` +f(client, 0, &callerFrameSlot, &local0, id, mode, band) + ^ ^ ^ ^ ^ ^ + | | | | | +-- arg6 = request byte 24 + | | | | +--------- arg5 = 3 (mode) + | | | +--------------- arg4 = request byte 4 (id) + | | +-------------------------- arg3 = &local + | +-------------------------------------------- arg2 = caller frame (out) + +----------------------------------------------------- arg1 = 0 from slot 19 +``` + +The body: + +``` +rom:0006b97c push *(0x1ad980) ; resource proc table 1 +rom:0006b984 push *(0x1ad990) ; resource proc table 2 +rom:0006b98c push arg4 ; = request byte 4 = the id +rom:0006b990 CALLA 0x07f174a4 ; lookup(id) -> 0xD74A4 +rom:0006b996 MOVE A8,*A7 ; store result through arg2 +rom:0006b99a JRNE 0x0006ba8c ; found -> class dispatch +rom:0006b99e MOVK 0xe ... ; NOT FOUND -> error 14 = BadIDChoice +``` + +Class dispatch, on **resource byte 4** (the class written by create): + +``` +rom:0006ba8c MOVE *A7,A11,0x1 +rom:0006ba90 MOVE *A11(0x20),A8,0x0 ; A8 = resource byte 4 = class +rom:0006ba94 DEC A8 / JREQ 0x0006b9c4 ; class 1 -> path A +rom:0006ba98 DEC A8 / JREQ 0x0006ba1e ; class 2 -> path B +rom:0006ba9c DEC A8 / JREQ 0x0006ba1e ; class 3 -> path B (same code) +rom:0006baa0 JR 0x0006ba66 ; anything else -> BadIDChoice +``` + +Path B (class 2 or 3) — the two gates that matter: + +``` +rom:0006ba1e MOVE *A13(0xffc0),A11,0x1 ; arg1 +rom:0006ba22 JREQ 0x0006ba32 ; slot 19 always passes 0 +rom:0006ba32 MOVE *A13(0xffa0),A7,0x1 +rom:0006ba36 MOVE *A7,A7,0x1 +rom:0006ba38 MOVE *A7(0x140),A7,0x1 ; resource byte 40 +rom:0006ba3c JREQ 0x0006baa2 ; byte40 == 0 -> continue (good) +rom:0006ba3e ... MOVK 0xe ; byte40 != 0 -> BadIDChoice (14) +``` + +``` +rom:0006baa2 MOVE *A13(0xffa0),A11,0x1 +rom:0006baa6 MOVE *A11,A7,0x1 +rom:0006baa8 MOVE *A13(0xff80),A11,0x1 ; &local0 +rom:0006baac MOVE *A7(0x120),*A11(0x0),0x1 ; local0 = resource byte 36 +rom:0006bab2 MOVE *A13(0xff20),A7,0x1 ; arg6 = band index (request byte 24) +rom:0006bab6 JRLT 0x0006babc +rom:0006bab8 MOVE *A11,A7,0x1 +rom:0006baba JRNE 0x0006baea ; byte36 != 0 -> band checks +rom:0006babc MOVE *A13(0xff20),A7,0x1 +rom:0006bac0 JRLT 0x0006bbce ; negative band -> done +rom:0006bac6 MOVK 0xa ... ; byte36 == 0 and band >= 0 -> BadAccess (10) +``` + +and the band-mask test that follows (`0x6bb1c…0x6bb48`): + +``` +rom:0006bb22 MOVK 0x1,A7 +rom:0006bb24 SLL A11,A7 ; 1 << band +rom:0006bb2c MOVE *A11(0x60),A11,0x1 ; resource byte 12 (mask B) +rom:0006bb30 AND A11,A7 +rom:0006bb32 JRNE 0x0006bb4a ; bit set in mask B -> BadMatch below +rom:0006bb42 MOVE *A7(0x40),A7,0x1 ; resource byte 8 (mask A) +rom:0006bb46 AND A7,A11 +rom:0006bb48 JRNE 0x0006bbe2 ; bit set in mask A -> OK +rom:0006bb4a ... MOVK 0x8 ... ; BadMatch (8) +``` + +**Consequences.** + +| observation | explanation | +|---|---| +| class-3 resource → `BadIDChoice` (14) | its **byte 40 != 0**, so path B rejects it before the band logic | +| class-2 resource → `BadAccess` (10) | byte 40 == 0 (good) but **byte 36 == 0**, and the band index was ≥ 0 | +| class 1 → `BadIDChoice` | path A needs `arg1 != 0`; slot 19 always passes 0 | + +So `PUT_TILE` wants **class 2** (or 3), with **byte 40 == 0** and **byte 36 != 0**, +and then the requested band bit must be set in resource byte 8 *or* byte 12. + +Resource byte 8 and byte 12 are exactly the create request's **byte 41** and +**byte 43** (`GHIDRA_XIE_PIPELINE.md` §2), so the band mask comes from create. +Resource byte 36 is **not** written by the create path I traced — that is the +missing piece. + +**Band index.** Slot 19's `count`/`flags` word at request byte 24 is *not* a +count: `0x6bab2` feeds it as the band number. The live probe sent `count = 1`, +i.e. **band 1**, and only band 0 can plausibly be masked in by a create with +`req[41] = 1` (mask byte 8 = 1 → bit 0). + +--- + +## 2. Slot 7: bind, and the fields are swapped [C] + +Both sub-handlers take a 4-word request and immediately resolve +`LookupPhotos(client, 0, &local, ·, ·)` with the **last two pushed values being +request byte 8 and then request byte 12**: + +``` +rom:0006744e MOVE A14,-*SP,0x1 ; op1, 0x6742C +rom:00067450 MOVE *A9(0x40),*A14+,0x1 ; push request byte 8 +rom:00067454 MOVE *A9(0x60),*A14+,0x1 ; push request byte 12 +rom:00067458 MOVE A11,*A14+,0x1 ; &local +rom:00067460 MOVE A7,*A14+,0x1 ; 0 +rom:00067462 MOVE *A13(0xffe0),*A14+,0x1 ; client +rom:00067466 CALLA 0x07ea6fa0 ; LookupPhotos(client, 0, &local, b12, b8) +rom:00067472 JRNE 0x00067590 ; failure -> returned as-is +rom:00067476 MOVK 0x14 ... MOVK 0x1 +rom:00067480 CALLA 0x07f63a30 ; alloc 20 bytes +rom:000674c6 MOVK 0x1,A11 +rom:000674c8 MOVB *A11,*A7(0x20) ; new object byte 4 = **class 1** +rom:000674ce MOVE A11,*A7(0x30),0x0 ; new object bytes 6-7 = 1 +rom:000674d2 CALLA 0x07f63b48 +rom:000674d8 MOVE A8,*A7(0x80),0x1 ; object bytes 16-19 = result +``` + +`LookupPhotos`' last argument is the **type/class**, the one before it the **id** +(same convention as slots 11/12/24). Therefore, for slot 7: + +> **byte 8 = resource type/class, byte 12 = resource id.** +> The probe sent `[op, id, id2]` — i.e. an id where a *class* belongs — which is +> exactly why every ordering answered `BadIDChoice` on the second value: the +> lookup was searching for `id2` **of class `id`**, which cannot exist. + +`op 1` (`0x6742C`) = allocate a **class-1** object (20 bytes) that references the +(type, id) pair — a *reference binding*. +`op 2` (`0x6759A`) = same lookup, then walk `res->byte9` bands, collect each +band record's `+0x1a8` into a local array and hand them to the resource-init +routine `0x6CA82` — a *copy/derive binding*. + +Matching DEC vocabulary, slot 7 is `XIEP_BIND_PHOTOFLO` in its two variants +(bind by reference / by value). **[I]** for the name, **[C]** for the semantics. + +Note that op 1's product is **class 1**, and class 1 is exactly the class that +`PUT_TILE` rejects (`arg1 == 0` path). So binding a class-3 photomap *into a +class-2 sink* is **not** something slot 7 does — it produces class 1. + +--- + +## 3. What still blocks `PUT_TILE`: resource byte 36 [U] + +Two candidate explanations, both consistent with the code: + +1. **A band must be created on the class-2 resource.** Byte 36 looks like the + band/strip count of the resource record; the create allocates band records + (`res+0x160` array, count from `res byte 9`) but I found no store to byte 36 + in the create path. Slot 43 does build a *new* record through the same + `0x6CA82` init routine, using band sub-records (`band+0x1a8`) collected from + an existing resource — so **slot 43 ("execute/bind") is the best candidate + for materialising bands and setting byte 36**. +2. **The band index is simply wrong.** `count = 1` means band 1; band 0 is the + only one a `req[41] = 1` create masks in. + +Both are testable in two requests, and the first probe below distinguishes them. + +**Slot 43 in one line** (10 words, `{id@4, x@8, …}`): it resolves the id, +iterates the resource's bands, collects `band->0x1a8` into a local array, and +calls `0x6CA82` to (re)build a resource record with those bands. It succeeded on +the class-3 resource with zeros because it only needs a valid id. **[I]** — it +looks like "execute / materialise the pipeline". + +--- + +## 4. Exact next probes + +Each on one connection: `minor 1` (init) → create → probe. + +**P1 — the band index (1 request).** Same create as today, then: + +``` +minor 19, len 136 + word1 id = C0AAAA + word2 x = 0 word3 y = 0 + word4 w = 64 word5 h = 64 + word6 band = 0 <-- was 1 + word7 flags = 0 + + 512 bytes (128 words) of pixels +``` + +* `BadMatch (8)` → byte 36 is non-zero and only the **mask** is wrong: fix by + setting create `req[41] = 1` (mask byte 8 = 1 → band 0) or `req[43]` (mask + byte 12). Then either mask works. +* `BadAccess (10)` again → byte 36 really is zero: a band must be created first + → go to P2. + +**P2 — create the band (2 requests).** After the create, run slot 43 with the +class-2 id and zeros (it already succeeds on class 3): + +``` +minor 43, len 10 [id@4 = C0AAAA, rest 0] +``` + +then repeat P1. If `BadAccess` turns into Success or `BadMatch`, slot 43 is the +band-materialising step and must precede every `PUT_TILE`. + +**P3 — the bind (optional).** If P2 does nothing, try slot 7 with the corrected +field order, both op values, using the class-2 resource id as byte 12 and a +class code as byte 8: + +``` +minor 7, len 4 + word1 op = 1 (then 2) + word2 type = 2 <-- class of the target, NOT an id + word3 id = C0AAAA +``` + +`Success` means the bind worked; the current failure (`BadIDChoice`) is then +purely the swapped fields. + +**P4 — fallback import.** If `PUT_TILE` still refuses, slot 20 (35 words) is the +remaining import-shaped request; its header is `{id@4, …, }` with three 0x20-byte +element records. That is where an explicit Import element would live, but its +layout is still undecoded, so P1→P2 should be exhausted first. + +--- + +## 5. Confirmed / Inferred / Unknown + +**Confirmed** +1. `0x6B966` resolves the id through the resource tables; a miss is + `BadIDChoice` (14). +2. Class dispatch on resource byte 4: class 1 → path A (needs `arg1 != 0`, + slot 19 passes 0, so always `BadIDChoice`); classes 2 and 3 → path B. +3. Path B requires **resource byte 40 == 0** (else `BadIDChoice`) and + **resource byte 36 != 0** (else `BadAccess` when the band index is ≥ 0). +4. The band index is request byte 24, tested as `1 << band` against resource + byte 12 and byte 8; a mismatch is `BadMatch` (8). +5. Resource bytes 8 and 12 are the create request's bytes 41 and 43 + (band masks). +6. Slot 7: **byte 8 = type/class, byte 12 = id**; op 1 allocates a class-1 + object, op 2 rebuilds a record from another resource's bands. + +**Inferred** +1. Slot 7 is `BIND_PHOTOFLO`; slot 43 is execute/materialise. +2. Resource byte 36 is the band count and is set by slot 43, not by create. + +**Unknown** +1. What writes resource byte 36 (and what clears byte 40 on a class-3 record). +2. Slot 20's 35-word layout (the explicit Import-element path). +3. Whether the payload after a successful `PUT_TILE` must be packed rows. + +--- + +## 6. Reproduction + +1. Session `a03f3d788b874b1a976a55417ab9f2d3`, base `rom:00000000`. +2. Listings: `xie/ghidra-evidence/import/*.txt` + (`lookup_6B966` = the helper, `slot07_op1_6742C`, `slot07_op2_6759A`, + `resource_init_6CA82`). +3. Re-derive an argument order: count the pushes between `MOVE A14,-*SP,0x1` + and the `CALLA`, then map them right-to-left onto `A13-0x20, -0x40, …`. +4. Re-derive a field: `*A9(0xNN)` / `*A11(0xNN)` are bit offsets; divide by 8. diff --git a/xie/GHIDRA_XIE_PIPELINE.md b/xie/GHIDRA_XIE_PIPELINE.md new file mode 100644 index 0000000..a75f911 --- /dev/null +++ b/xie/GHIDRA_XIE_PIPELINE.md @@ -0,0 +1,340 @@ +# XIE 2.3 — photoflo / export layer (final pass) + +> **See `GHIDRA_XIE_IMPORT.md`**: `PUT_TILE`'s lookup helper `0x6B966` +> requires resource byte 36 non-zero and byte 40 zero, a band index at request +> byte 24 (not a count), and slot 7 takes *type*@8 / *id*@12 — not two ids. + + +Program `vt1200_v22.bin` (md5 `b46a3e442ccb86134d2356bd70d22fd2`), Ghidra session +`a03f3d788b874b1a976a55417ab9f2d3`. Addresses are file offsets; +`mame_bit = 0x3F200000 + off*8`; `CALLA` operand − `0x7E40000` = file offset. + +Companions: `GHIDRA_XIE.md`, `GHIDRA_XIE_HANDLERS.md`, `GHIDRA_XIE_IMAGE_PATH.md`. +Raw listings: `xie/ghidra-evidence/pipeline/` (`create_slot8_op12`, +`resource_init_6CA82`, `export_slot21`, `put_slot19`, `dd_input_6B640`). + +**Offset convention.** Every offset in this code is a *bit* offset from the +pointer. `*A9(0x20)` is request byte 4; `*A7(0x28)` with a 1-bit field is +**byte 5, bit 0**. The earlier reports' "resource +0x28 / +0x29" therefore mean +*bit* 0x28 = byte 5 bit 0, and neighbouring bits of byte 5. + +--- + +## 1. The BadMatch is now explained and fixed [C] + +Slot 21 refuses to export unless **resource byte 5, bit 0** is set: + +``` +rom:00062d88 MOVE *A13(0x20),A11,0x1 ; A11 = resolved resource +rom:00062d8c SETF 0x1,0x0,0x0 ; 1-bit field +rom:00062d8e MOVE *A11(0x28),A7,0x0 ; A7 = resource bit 0x28 +rom:00062d92 JRNE 0x00062dbc ; set -> continue +rom:00062d96 MOVK 0x8,A7 ; else error 8 = BadMatch +rom:00062d9a MOVE *A9(0x20),*A14+,0x1 ; bad value = resource id +rom:00062db0 CALLA 0x07effa5e ; SendErrorToClient(...) +``` + +That bit is written by the **create** handler, from the request's level array: + +``` +rom:0006cbfe MOVE *A9,A9,0x1 ; A9 = levelArray[i] +rom:0006cc00 JRNE 0x0006cc06 +rom:0006cc02 SUB A9,A9 ; 0 +rom:0006cc04 JR 0x0006cc08 +rom:0006cc06 MOVK 0x1,A9 ; 1 +rom:0006cc08 SETF 0x1,0x0,0x0 +rom:0006cc0a MOVE A9,*A7(0x28),0x0 ; resource bit 0x28 = (entry != 0) +``` + +The loop runs over the request's own words, so: + +> **A create whose request word at byte 28 is zero produces a resource with +> byte 5 bit 0 = 0, which no export can ever use.** + +Every create probe so far zero-filled byte 28 — that is why slot 21 always +answered `BadMatch`, whatever the 8-bit fields were set to. Setting byte 28 to a +non-zero "levels" value (e.g. `2`) is the fix. + +--- + +## 2. Resource record and class codes [C] + +Filled by the create path (`0x6CA82`), which is reached from slot 8 ops 1 and 2: + +``` +rom:0006caf2 MOVE *A13(0xfec0),A11,0x1 ; arg = (op == 2) ? 1 : 0 +rom:0006caf6 JREQ 0x0006cafc +rom:0006caf8 MOVK 0x2,A11 ; op 2 -> class byte = 2 +rom:0006cafa JR 0x0006cafe +rom:0006cafc MOVK 0x3,A11 ; op 1 -> class byte = 3 +rom:0006cafe MOVB *A11,*A9(0x20) ; resource byte 4 = class +rom:0006cb02 MOVK 0x1,A11 +rom:0006cb06 MOVE A11,*A9(0x30),0x0 ; resource bytes 6..7 = 1 (16-bit) +rom:0006cb0a MOVB *A13(0xffe0),*A9(0x40) ; byte 8 = request byte 41 +rom:0006cb12 MOVE *A9(0x40),A7,0x0 +rom:0006cb16 SUBK 0x3,A7 +rom:0006cb1a MOVK 0x3,A7 ; byte 9 = (req[41] == 3) ? 3 : 1 +rom:0006cb20 MOVB *A7,*A9(0x48) +rom:0006cb30 MOVB *A13(0xff60),*A9(0x58) ; byte 11 = request byte 42 +rom:0006cb36 MOVB *A13(0xff40),*A9(0x60) ; byte 12 = request byte 43 +rom:0006cb3c MOVB *A13(0xff20),*A9(0x50) ; byte 10 = request byte 44 +rom:0006cb42 MOVE *A13(0xff00),*A9(0x80),0x1 ; bytes 16..19 = width (32-bit) +rom:0006cb48 MOVE *A13(0xfee0),*A9(0xa0),0x1 ; bytes 20..23 = height (32-bit) +``` + +| resource byte | type | value / meaning | +|---|---|---| +| 4 | u8 | **class: 2 = op-2 resource, 3 = op-1 resource** | +| 5 bit 0 | bit | **"levels defined" — gates export (BadMatch) and bound checks** | +| 6 | u16 | 1 | +| 8 | u8 | request byte 41 (band count selector) | +| 9 | u8 | 3 if req[41]==3 else 1 — number of level entries examined | +| 10 | u8 | request byte 44 | +| 11 | u8 | request byte 42 | +| 12 | u8 | request byte 43 | +| 16 | u32 | **width** (from request byte 12) | +| 20 | u32 | **height** (from request byte 16) | +| 24, 28 | u32 | two 32-bit values from the create request | +| 44 | ptr | per-band array, records of 0x20 bytes (0x160 bits), one per band | + +Class ↔ behaviour, cross-checked against the live probes: + +* **class 2** — the *image* resource. `PUT_TILE` (slot 19) resolves this class + (it answers `BadIDChoice` for class 3 and `BadAccess` for class 2 with + bit0x28 clear). +* **class 3** — the op-1 resource; `QUERY` (slot 24) answers `BadAccess` on it. +* The `class` argument that slots 33/40/44 pass to `LookupPhotos` is this same + byte-4 value, supplied by the client. + +The per-band level count maps to bits per pixel (`0x6cb7c…0x6cbb0`): + +``` +entry == 0 -> 0 bits (empty band) +entry <= 2 -> 1 bpp +entry <= 0x100 -> 8 bpp +entry <= 0x10000-> 16 bpp +rowBytes = ALIGN(entry * width, 8) ; 0x6cbb4 MPYU / ADDK 7 / ANDN 7 +``` + +So **`entry = 2` is exactly "1 bit per pixel"** — the value to use for our test +image. + +--- + +## 3. Slot 8 — create request, 12 words [C] + +Both ops share one handler (`0x678DA`); the op word only selects the class byte. +`length` must be exactly 12 words (`rom:000678f8 SUBK 0xc / JREQ`). + +| word | byte | field | notes | +|---|---|---|---| +| 0 | 0 | header | `reqType=129`, `opcode=8`, `length=12` | +| 1 | 4 | **op** | 2 → class 2 (image), 1 → class 3 | +| 2 | 8 | **id** | new resource id; must satisfy `(id & 0xFFF00000) == client->0x20`, have **bit 19 clear** (`BTST 0x13`), and must not already exist | +| 3 | 12 | **width** | must be non-zero, else `BadValue` (2) | +| 4 | 16 | **height** | must be non-zero, else `BadValue` (2) | +| 5 | 20 | parameter | passed by address to `0x1238C2` before creation | +| 6–9 | 24–39 | **level array** (up to 3 longs at byte 28, 32, 36) | `entry != 0` sets resource bit 0x28; values 1–2 = 1 bpp | +| 10 | 40 | (unused) | | +| — | 41 | u8 band count | 3 → three entries examined, anything else → one | +| — | 42,43,44 | u8 params | copied to resource bytes 11, 12, 10 | + +Validation order (`0x678DA`): length == 12 → `req[12]` and `req[16]` non-zero +(else `BadValue` with bad = id) → id in the client's range and bit 19 clear +(else `BadIDChoice`) → id must be *absent* (else `BadIDChoice`) → create +(`0x6CA82`; failure is `BadAlloc`, code 11). + +Note `rom:00067902 MOVE *A9(0x60),A7,0x1 / JREQ` — **`req[12]` and `req[16]` must +both be non-zero**, which is also what makes the live "all-zero create" behaviour +consistent. + +--- + +## 4. Slot 21 — export, 16 words [C for the rectangle, I for the rest] + +``` +rom:00062d8e MOVE *A11(0x28),A7,0x0 ; resource bit 0x28 must be set -> BadMatch +rom:00062dbc MOVE *A9(0x80),A7,0x1 ; A7 = req[16] +rom:00062dc0 MOVE *A11(0x80),A11,0x1 ; A11 = resource width +rom:00062dc4 CMP A11,A7 / JRC ; if req[16] > width -> BadValue +rom:00062df8 MOVE *A9(0xa0),A7,0x1 ; req[20] vs resource height -> BadValue +rom:00062e30 MOVE *A9(0xc0),A11,0x1 ; req[24] must be non-zero +rom:00062e36 MOVE *A9(0xe0),A11,0x1 ; req[28] must be non-zero +rom:00062e76 MOVE A11,*A13(0x60) ; x0 = req[16] +rom:00062e88 MOVE A7,*A13(0x80) ; y0 = req[20] +rom:00062e9a ADD A7,A5 ; MOVE A5,*A13(0xa0) ; x1 = x0 + req[24] +rom:00062eb2 ADD A5,A7 ; MOVE A7,*A13(0xc0) ; y1 = y0 + req[28] +rom:00062f7e CALLA 0x07ea3432 ; prepare/validate export +rom:0006301c MOVI 0xc8,A5 / CALLA 0x07f63a74 ; allocate 200-byte export context +rom:0006306e MOVK 0xb,A8 ; failure -> BadAlloc (11) +``` + +| word | byte | field | +|---|---|---| +| 0 | 0 | header, `length = 16` | +| 1 | 4 | **id** of the image resource | +| 2, 3 | 8, 12 | 32-bit fields (byte-swapped; not read on the paths traced — reserved) | +| 4 | 16 | **x** — must be ≤ resource width | +| 5 | 20 | **y** — must be ≤ resource height | +| 6 | 24 | **width** — must be non-zero | +| 7 | 28 | **height** — must be non-zero | +| 8 | 32 | parameter (`*A9(0x100)`, used in the offset maths) | +| 9 | 36 | parameter (`*A9(0x120)`) | +| 10–11 | 40, 44 | parameter / flags | +| 12–15 | 48… | within the 16 words; not read on the traced paths | + +The handler allocates a **200-byte export context** itself +(`MOVI 0xc8` → allocator `0x63A74`), so it is the server, not the client, that +owns the export state. Whether the destination is a client-supplied Pixmap or a +server-created one is decided inside `0x63432` / `0x645FE`, which I did not +fully trace — **[U]**, and it is the only remaining unknown in the path. + +--- + +## 5. Slot 19 — put tile (unchanged, re-confirmed) + +`{id@4, x@8, y@12, w@16, h@20, count@24, flags@28}`, minimum 8 words, payload +follows; geometry is clipped against the resource's width/height (bytes 16/20) +and an empty rectangle is `BadValue`. The data lands through the device-dependent +input path `0x6B640` (`dd_input_6B640` listing), which copies 0xE longs plus a +byte from a per-band record before calling the DDXIE vtable. + +Slot 19 answers `BadAccess` on a class-2 resource whose bit 0x28 is clear — the +same gate as export. So **one create with a non-zero level entry unlocks both +PUT and EXPORT.** + +--- + +## 6. Slots 20 and 43 — status + +* **Slot 20** (exactly 35 words, seeds 25, loops over 0x20-byte element records + at `0x32…`): consistent with a photoflo definition carrying up to three + element records. Not decoded here; not needed for the minimal path if + PUT_TILE + EXPORT work. +* **Slot 43** (10 words; compares request fields against the static table at + `0x3F533740…`; succeeds silently on a class-3 resource with a zero payload): + most likely a bind/tap with no data. Not needed for the minimal path. + +Both are only needed if the direct put→export route is refused. + +--- + +## 7. Minimal sequence for a 64×64 1-bit image **[I, but every field is now sourced]** + +`base` = the connection's X resource base (0xC00000 in the observed setup), +id = `0xC0AAAA` (bit 19 clear). + +``` +[0] connect; QueryExtension "Xie" -> 129 [C] + +[1] INIT_SESSION minor 1, len 2 + 02 00 03 00 [C] + +[2] CREATE (class 2) minor 8, len 12 12 words = 48 bytes [C] + word1 02 00 00 00 op = 2 (class 2, the image resource) + word2 aa aa c0 00 id = 0xC0AAAA + word3 40 00 00 00 width = 64 + word4 40 00 00 00 height = 64 + word5 00 00 00 00 parameter (0) + word6 00 00 00 00 \ + word7 02 00 00 00 | level array: entry[0] = 2 -> 1 bpp, + word8 00 00 00 00 | and entry != 0 sets resource bit 0x28 + word9 00 00 00 00 / + word10 00 00 00 00 byte40 unused, byte41 = 01 (one band), + byte42/43/44 = 00 + -> Success (no packet). BadValue(2) bad=id ⇒ width/height zero. + BadIDChoice(14) ⇒ id out of range, bit 19 set, or already exists. + +[3] PUT_TILE minor 19, len 8 + payload [I] + word1 aa aa c0 00 id + word2 00 00 00 00 x = 0 + word3 00 00 00 00 y = 0 + word4 40 00 00 00 w = 64 + word5 40 00 00 00 h = 64 + word6 01 00 00 00 count = 1 (see probe P2) + word7 00 00 00 00 flags + then 512 bytes (128 words) of 1-bit pixels + total length = 8 + 128 = 136 + -> Success, BadValue(2) if the rect clips away, BadAccess if bit0x28 + is clear, BadIDChoice if the id is class 3 / absent. + +[4] EXPORT minor 21, len 16 [I] + word1 aa aa c0 00 id + word2 00 00 00 00 reserved + word3 00 00 00 00 reserved + word4 00 00 00 00 x = 0 (<= 64) + word5 00 00 00 00 y = 0 (<= 64) + word6 40 00 00 00 w = 64 (non-zero) + word7 40 00 00 00 h = 64 (non-zero) + word8..15 = 0 + -> BadMatch(8) if step 2 left byte 28 zero; BadValue(2) if x>width or + y>height or w/h zero; BadAlloc(11) if the 200-byte context fails. + +[5] TERM_SESSION minor 2, len 1 [C] +``` + +64×64 at 1 bpp = 8 bytes per row = 512 bytes; a checkerboard of 8×8 blocks is +`0xAA` for even (row/8 + byte) and `0x55` for odd, repeated over 8 rows. + +**If step [4] then reports the pixmap, display it with an ordinary `XCopyArea` +from that pixmap into a window** — no further XIE traffic. If instead the +destination must be supplied, the pixmap id belongs in one of words 8, 9, 10 or +11 (bytes 32/36/40/44); that is what probe P3 decides. + +--- + +## 8. Confirmed / Inferred / Unknown + +**Confirmed** +1. Resource class byte: 4 → 3 (op 1) or 2 (op 2) — `0x6cafe`. +2. Resource byte 5 bit 0 = "level entry non-zero", written at `0x6cc0a` from the + create request's level array at byte 28 — this is the BadMatch gate. +3. The create request is 12 words with width@12, height@16 (both non-zero), + level array at 28..39, band count at byte 41, three 8-bit params at 42/43/44. +4. Level values map to 1/8/16 bpp (`0x6cb7c…0x6cbb0`). +5. Export (slot 21) takes x@16, y@20, w@24, h@28, validated against the + resource's width/height 16/20, and allocates its own 200-byte context. +6. PUT_TILE (slot 19) and EXPORT share the bit-0x28 gate. + +**Inferred** +1. Op 2 = "create by value" (the image resource); op 1 = the other DEC create + variant. +2. Words 8/9 (bytes 32/36) of the export request carry the destination. +3. Slot 20 is a photoflo definition; slot 43 is bind/tap. + +**Unknown** +1. Whether export needs a client-created Pixmap or makes one (inside `0x63432`). +2. The meaning of export words 2, 3 and 10, 11 (bytes 8, 12, 40, 44). +3. Slot 19's `count` unit (tiles vs bytes) and whether the payload is packed + rows. +4. Slots 20 and 43 in full. + +--- + +## 9. Next probes (for the worker with server access) + +| id | probe | distinguishes | +|---|---|---| +| P1 | create (slot 8, op 2) **with word7 = 2**, then **query 24** on the id | if the reply is non-empty (it was empty before) the level array is live and the resource is class 2 | +| P2 | after P1, slot 19 with `count = 1` and then `count = 512` | which unit the count uses: one succeeds, the other is rejected/empty | +| P3 | after P1, slot 21 with x=y=0, w=h=64 and words 8..11 zero, then with a pixmap XID from `XCreatePixmap(depth 1, 64x64)` in word 8 | success on one variant names the destination field | +| P4 | create op 1 with word7 = 2, then slot 21 | confirms class 3 is not exportable (`BadIDChoice` at the lookup) | +| P5 | slot 19 on the class-3 id | confirms the class-2-only rule | + +Order: P1 first — it is the single probe that tests the new finding. If P1's +reply is still empty, then the level array is not the only gate and the next +step is to decode slot 20 (the photoflo definition) and build the pipeline +explicitly. + +--- + +## 10. Reproduction + +1. `program_open(path=…/vt1200_v22.bin, language="tms34010:LE:32:default", + read_only=false)`; the session is `a03f3d788b874b1a976a55417ab9f2d3` + (the earlier sessions are gone; the project is disposable). +2. Listings: `xie/ghidra-evidence/pipeline/*.txt`. + Key addresses: create `0x678DA` (slot 8 ops 1/2), resource init `0x6CA82`, + export `0x62D40`, put `0x6A76E`, dd input `0x6B640`. +3. Re-derive a field: run `DisassembleCommand` from the address, then read + `*A9(0xNN)` operands (bit offsets; divide by 8 for bytes). diff --git a/xie/GHIDRA_XIE_SLOT20.md b/xie/GHIDRA_XIE_SLOT20.md new file mode 100644 index 0000000..3e24ad8 --- /dev/null +++ b/xie/GHIDRA_XIE_SLOT20.md @@ -0,0 +1,302 @@ +# XIE 2.3 — slot 20, the band array, and the `PUT_TILE` payload hand-off + +Program `vt1200_v22.bin`, Ghidra session `a03f3d788b874b1a976a55417ab9f2d3`. +Addresses are file offsets; `mame_bit = 0x3F200000 + off*8`; +`CALLA` operand − `0x7E40000` = file offset. Read `GHIDRA_XIE_PIPELINE.md` and +`GHIDRA_XIE_IMPORT.md` first. + +Raw listings: `xie/ghidra-evidence/slot20/`. + +**Offset convention** — as in the earlier reports, every offset in the +disassembly is a **bit** offset. `*A9(0x20)` = request byte 4; +`*A5(0x28)` = **byte 5 of `A5`**; `*A7(0x120)` = byte 36; `*A7(0x140)` = byte 40. +This distinction matters for one of the two claims in the brief (see §3). + +--- + +## 1. Correction: the `+0x28` write is inside slot 19, not slot 20 + +The instruction the brief points at, + +``` +rom:0006a98e MOVE *A13(0x120),*A5(0x28),0x1 +``` + +lies in **slot 19's** body (`0x6A76E … 0x6AA54`), not slot 20's (`0x6AA54 …`). +Read with the bit-offset convention it is: + +* `A5` = one band/element record (`A5 = *(A7 + 0x160)` one instruction earlier, + `0x6a98a`), +* `*A13(0x120)` = frame local 0x120, which was filled at `0x6a882` with + `A5 = A9 + 0x100`, i.e. **a pointer to request byte 32**, +* `*A5(0x28)` = **byte 5** of that band record (bits, not byte 0x28). + +So the sequence at the end of `PUT_TILE` is: + +``` +rom:0006a87c MOVE A9,A5 +rom:0006a87e ADDI 0x100,A5 ; A5 = request + 0x100 bits = request byte 32 +rom:0006a882 MOVE A5,*A13(0x120),0x1 ; local = pointer to the pixel payload +... +rom:0006a98a MOVE *A5(0x160),A5,0x1 ; A5 = resource->band[] +rom:0006a98e MOVE *A13(0x120),*A5(0x28),0x1 ; band.byte5 = payload pointer +rom:0006a9a2 CALLA 0x07eab640 ; 0x6B640 device-dependent input +rom:0006a9e2 SUB A7,A7 +rom:0006a9e4 MOVE A7,*A5(0x28),0x1 ; band.byte5 = 0 (cleared again) +``` + +**This is the payload hand-off, and it is the answer to "where do the pixels +come from"**: `PUT_TILE` passes the *request buffer itself* (from byte 32) down +to the DD input routine through a scratch field, and clears the field +immediately afterwards. It is **transient, per call** — nothing persists. + +It also fixes an open question from pass 3: **the `PUT_TILE` payload starts at +request byte 32**, exactly the word after the 8-word header +(`{hdr, id, x, y, w, h, band, flags}`). + +--- + +## 2. Slot 20 — request layout and behaviour [partial, C for the structure] + +Entry `0x6AA54`. + +``` +rom:0006aa5e MOVK 0x19,A11 / MOVE A11,*A13(0xc0),0x1 ; default 25 (see below) +rom:0006aa6e MOVE *A9(0x10),A7,0x0 ; stuff->length +rom:0006aa72 CMPI 0x23,A7 ; must be exactly 35 words +rom:0006aa7a MOVK 0x10 -> BadLength +rom:0006aa7e CALLA 0x07f67f38 ; context/undo mark +rom:0006aa84 MOVE A8,@0x1b2b30,0x1 +rom:0006aa8c MOVI 0xffff,A7 / push ; arg = 0xFFFF (class "any") +rom:0006aa94 MOVE *A9(0x68),A8,0x0 ; arg = request byte 13 (8-bit) +rom:0006aa9a MOVE *A9(0x20),*A14+,0x1 ; arg = request byte 4 (id) +rom:0006aaa4 push &local(0x40) +rom:0006aaaa push &local(0) +rom:0006aaac push A13 +rom:0006aaae push client +rom:0006aab2 CALLA 0x07eab966 ; LOOKUP 0x6B966 (see pass 4) +rom:0006aabe JRNE 0x0006afdc ; error -> return it +``` + +Then a loop over the resource's bands: + +``` +rom:0006aad8 MOVE *A7(0x160),A5,0x1 ; A5 = resource->band[] (byte 44) +rom:0006aae4 MOVE *A5(0xd8),A7,0x1 ; band record (byte 27) +rom:0006aae8 JREQ 0x0006ab46 ; no record -> result 0 +rom:0006aaf6..0x6ab0e A7 = band->0x1a8 (bit) ; per-band device object +rom:0006ab0e CALLA 0x07fc22de ; 0x1822DE \ +rom:0006ab14 CALLA 0x07fc2c34 ; 0x182C34 | device-dependent +rom:0006ab2a CALLA 0x07fc2c34 ; 0x182C34 | band setup chain +rom:0006ab30 CALLA 0x07fc1aca ; 0x181ACA | +rom:0006ab36 CALLA 0x07fc288a ; 0x18288A | +rom:0006ab3c CALLA 0x07fc216a ; 0x18216A / +rom:0006ab48 MOVE A7,*A11(0x120),0x1 ; per-band result -> frame array +rom:0006ab6a MOVE *A13(0x80),A7,0x1 ; i +rom:0006ab6e SUBK 0x3,A7 +rom:0006ab70 JRC 0x0006aacc ; loop while i < 3 +``` + +i.e. **three bands, `xieValMaxBands = 3`**, each with a device-dependent +record; results are summed into frame local `0x100`. + +After the loop the handler validates request bytes against the per-band state +and returns `BadMatch` (8) on mismatch: + +``` +rom:0006ab82 MOVE *A13(0x40),A11,0x1 +rom:0006ab88 MOVE *A11(0x8),A7,0x0 ; band attribute (16-bit at byte 1) +rom:0006ab8c MOVE *A9(0x70),A5,0x0 ; request byte 14 +rom:0006ab92 JRNE -> BadMatch +rom:0006ab94 MOVE *A11(0x10),A7,0x0 ; band attribute at byte 2 +rom:0006ab98 MOVE *A9(0x60),A5,0x0 ; request byte 12 +rom:0006aba0 MOVE *A11(0x20),A7,0x1 ; 32-bit attribute at byte 4 +rom:0006aba4 MOVE *A9(0x40),A5,0x1 ; request byte 8 +rom:0006abac MOVE *A11(0x40),A7,0x1 ; attribute at byte 8 +rom:0006abb0 MOVE *A9(0x80),A5,0x1 ; request byte 16 +rom:0006abc4 MOVE *A11(0x80),A7,0x1 +rom:0006abce JRNC 0x0006abf6 +rom:0006abd0 ... MOVK 0x8 -> BadMatch +``` + +| word | byte | meaning (as far as the code shows) | +|---|---|---| +| 0 | 0 | header; `length` must be **0x23 = 35** | +| 1 | 4 | **resource id** (fed to `0x6B966` with class `0xFFFF`) | +| 2 | 8 | 32-bit attribute compared with band+4 | +| 3 | 12 | 16-bit attribute compared with band+2 | +| — | 13 | 8-bit mode passed to the lookup (`0x6aa94`); also drives the attribute checks | +| — | 14 | 16-bit attribute compared with band+1 | +| 4 | 16 | 32-bit attribute compared with band+8 | +| 5 | 20 | not read in the traced path | +| 6 | 24 | not read in the traced path | +| 7 | 28 | not read in the traced path | +| 8…34 | 32…139 | not read in the traced path | + +`MOVK 0x19` (25) at `0x6aa5e` seeds frame local `0xc0` — it is **not** a request +field: the local is overwritten by the mode-dependent branches at `0x6ac08`, +`0x6ac10`, `0x6ac1e` later in the handler. It is a default for a computed value, +so the "25-element notion" in the pass-3 note is not an element count. + +**Slot 20 is therefore a per-band *operation on an existing resource*** — the +same device-dependent band chain that the create path runs — not a photoflo +definition, and not the thing that creates the band array. + +--- + +## 3. Where the band array comes from [C] + +The band array is created by the **create** request (slot 8 op 1/op 2 → +`0x678DA` → `0x6CA82`), not by slot 20 or slot 43: + +``` +rom:0006cb54 MOVE *A9(0x48),A11,0x0 ; band count = resource byte 9 (1 or 3) +rom:0006cb58 CMP A11,A7 / JRNC ... +rom:0006cb64 MOVE *A13(0xffc0),A9,0x1 ; the level array handed in by the caller +rom:0006cb6a MOVE *A11,A11,0x1 ; level entry +... +rom:0006cc0e MOVE *A7(0x160),A9,0x1 ; resource->band[] (byte 44) +rom:0006cc12 SLL 0x5,A7 ; i * 4 bytes +rom:0006cc18 ADD A7,A9 ; &band[i] +rom:0006cc48 CALLA 0x07eac660 ; 0x6C660 allocate the band record +rom:0006cc4e MOVE A8,*A9(0xd8),0x1 ; band[i] + 0xd8 (byte 27) = record +``` + +and the record allocator itself: + +``` +rom:0006c660 MMTM SP,0x154 +rom:0006c66a MOVI 0x39,A11 ; 57-byte record +rom:0006c670 CALLA 0x07f639f4 ; allocate +rom:0006c692 MOVK 0x8,A9 / *A11,0x0 ; class -> 8 bpp (0x16-bit field) +rom:0006c69e MOVK 0x10,A9 / *A11,0x0 ; class -> 16 bpp +rom:0006c6a8 MOVK 0x0,A9 / *A11,0x0 ; class -> 0 +rom:0006c6b0 ... CALLA 0x07fc22de … 0x07fc216a ; same DD chain as slot 20 +``` + +So: **create → per-band record (0x39 bytes) → stored at `resource->band[i] + 0xd8`**, +one record per band, band count = the create request's byte 41 (`3` → three +bands, anything else → one). That is why a create with `req[41] = 1` and a +non-zero level entry gives a resource with **one** populated band and mask bit 0 +set in resource byte 8. + +### Resource byte 36 — still not written anywhere I can see + +`0x6BAAC` copies `resource[bit 0x120]` (byte 36, 32-bit) into a local and +requires it to be non-zero (`GHIDRA_XIE_IMPORT.md` §1). A scan of the whole +resource module (`0x65000 … 0x6D000`) for stores to bit `0x120` / `0x140` on a +non-frame base yields exactly **one** hit: + +``` +rom:0006ce56 MOVE A11,*A9(0x140),0x1 ; *A9(0x140) = 0 (clears byte 40) +``` + +That is inside the helper slot 20 calls at `0x6CD68`, and it **clears** byte 40 +of an object reached through `resource->band[]` — consistent with `PUT_TILE` +requiring byte 40 == 0 and with slot 20 "re-arming" bands. + +**No store to byte 36 exists in that whole range.** Either it is written outside +the resource module, or it is part of a block copied in by the create path's +pre-call helper `0x1238C2` (which receives `&request[20]`). This is the one +remaining structural gap. + +--- + +## 4. Ranked next probes + +The static model cannot finish this; these are ordered so each result eliminates +a branch. All assume the class-2 resource that already works for slot 21. + +**P1 — `PUT_TILE` with band 0** (1 request, highest value). +`minor 19, len 136`: `id, x=0, y=0, w=64, h=64, **band=0**, flags=0` + 512 bytes. +* Success → done: the band exists, the payload starts at byte 32 (proved in §1), + and only the earlier `band=1` was wrong. +* `BadMatch (8)` → byte 36 is non-zero and the band **mask** is what fails: set + create `req[41] = 1` so resource byte 8 = 1 (`1 << 0`). +* `BadAccess (10)` → byte 36 is zero: the resource has no live band pointer → + P2. + +**P2 — slot 20 as the band arming step** (1 request). +`minor 20, len 35`: `id@4`, `byte13 = 1`, all other words 0. +Expect either Success (bands armed; repeat P1) or `BadMatch` naming an attribute +in bytes 8/12/14/16 — in which case copy the corresponding per-band values from +the create parameters and retry. This is the request that runs the same DD band +chain (`0x1822DE … 0x18216A`) that `0x6C660` runs at create time. + +**P3 — dump the live resource record** (0 requests; use the slot-24 query and the +existing probe harness). Query 24 on the class-2 id and record which bytes of +the 32-byte reply are non-zero. If the reply is empty (as it was before), then +instead read the record from the server side is not possible — in that case skip +to P4. + +**P4 — slot 43 (10 words) then P1.** +`minor 43, len 10, [id, 0…]` clears byte 40 via `0x6CE56` (proved above) and +rebuilds a record from the existing bands; then P1. + +**P5 — the fallback define path**: slot 7 with the corrected field order, +`minor 7, len 4, [op=1, type=2, id]` (byte 8 is the *type*, byte 12 the *id*). +This allocates a class-1 object (a photoflo/handle) — only useful if P1–P4 all +fail, since `PUT_TILE` rejects class 1 outright. + +--- + +## 5. Minimal sequence (best current candidate) + +``` +[1] minor 1 len 2 02 00 03 00 [C] +[2] minor 8 len 12 op=2, id, w=64@12, h=64@16, req[20]=0, + level[0]=2 @28, byte41=01 (one band), rest 0 [C] +[3] minor 20 len 35 id@4, byte13=1, rest 0 (arm bands) [I] +[4] minor 19 len 136 id, x=0, y=0, w=64, h=64, band=0, flags=0, + + 512 bytes of 1-bit pixels [I] +[5] minor 21 len 16 id, x=0@16, y=0@20, w=64@24, h=64@28, … [C] +[6] XCopyArea(pixmap|window) or the export already drew into it [C] +``` + +Step [3] is the only speculative one, and P1/P2 decide whether it is needed. + +--- + +## 6. Confirmed / Inferred / Unknown + +**Confirmed** +1. `0x6A98E` is inside slot 19 (`PUT_TILE`), and it stores **request byte 32** + (the payload pointer) into **byte 5** of a band record, calls `0x6B640`, then + zeroes it — a transient, per-call hand-off. +2. `PUT_TILE`'s payload therefore begins at request byte 32; the 8-word header is + `{hdr, id, x, y, w, h, band, flags}`. +3. Slot 20 requires `length == 0x23`, takes the resource id at byte 4 plus a mode + byte at 13, loops over the resource's **three** bands, runs the DD chain + `0x1822DE/0x182C34/0x181ACA/0x18288A/0x18216A` per band, and validates + request bytes 8/12/14/16 against per-band attributes (`BadMatch` on mismatch). +4. The band array (`resource->band[]`, byte 44) and its per-band records + (`band+0xd8`, 0x39 bytes) are created by the **slot-8 create** path + (`0x6CA82` → `0x6C660`), one record per band, count from `req[41]`. +5. `0x6CE56` clears byte 40 of a band-reachable object; it is the only + byte-40/byte-36 store in `0x65000–0x6D000`. + +**Inferred** +1. Slot 20 is "arm/execute the existing bands", not a photoflo definition. +2. `MOVK 0x19` is a computed default, not a 25-element count. +3. `PUT_TILE` with `band = 0` plus an armed band should succeed. + +**Unknown** +1. **Who writes resource byte 36** — no store found in the resource module. +2. The meaning of slot 20's words 20, 24, 28 and 8…34. +3. Whether slot 20 or slot 43 is the arming request (both touch band state). + +--- + +## 7. Reproduction + +1. Session `a03f3d788b874b1a976a55417ab9f2d3`, base `rom:00000000`. +2. Listings: `xie/ghidra-evidence/slot20/` + (`slot20_6AA54.txt`, `band_alloc_6C660.txt`, + `slot20_helper_6CD68_tail.txt`, `slot19_payload_handoff.txt`). +3. Scan used for the byte-36/40 question: + + ```python + # disassemble 0x65000..0x6D000, then keep instructions matching + # MOVE ...,*A?(0x120|0x140),0x1 where the base is not A13/A14 + ``` + which yields only `0x6CE56`. diff --git a/xie/MAME_XIE_TRACE.md b/xie/MAME_XIE_TRACE.md new file mode 100644 index 0000000..14b12be --- /dev/null +++ b/xie/MAME_XIE_TRACE.md @@ -0,0 +1,232 @@ +# Does the VT1200 firmware issue XIE requests? A MAME trace + +Short answer: **no.** Over three configurations — level-0 diagnostics, the booted +OS with the Terminal Manager, and a forced jump into the Scalution test — the +server's XIE dispatcher `XieProc` is **never entered**. The built-in image tests +are hardware diagnostics that program the image-option/scaler registers directly. + +There is therefore **no ROM-side XIE client sequence to replay**, and the +`PUT_TILE` band question cannot be settled this way. + +Everything below is measured, with a control that proves the measurement works. + +--- + +## 1. How the test was triggered, and why the entry point is not the problem + +### 1.1 The Scalution test entry + +`"error initializing scalution"` lives at file `0x371F2`; its only xref is the +instruction at file `0x36CB6`. Scanning backwards from there for the +`MMTM SP,0x…` prologue (`8F 09`) finds the test's entry at **file `0x35EA8`** += bit `0x3F1AF540`: + +``` +rom:00035ea8 MMTM SP,0x154 +rom:00035eac MOVE A14,A13 +rom:00035eae ADDI 0x6e0,A14 +rom:00035eb2 SUB A11,A11 +rom:00035eb4 MOVE A11,*A13(0x520),0x1 +... +rom:00035ecc CALLA 0x07f67f38 ; 0x127F38 test-framework entry +rom:00035ed2 MOVE A8,@0xa5f00,0x1 +rom:00035ee0 MOVK 0x1,A11 / MOVB A11,*A13 ; mode 1 +rom:00035ee6 MOVK 0x3,A11 / MOVB A11,*A13 ; mode 3 +rom:00035eec MOVK 0x5,A11 / MOVB A11,*A13 ; mode 5 +``` + +It is reached from a descriptor table (`refs to 0x35EA8` = file `0x1AFE8` and +`0x1BA46`), i.e. the "5 - Scalution Test" menu entry, whose label string is +`0x2B5D2` and whose menu table is built by the routine at `0x2A9A8` +(`MOVI 0x3f35ae90` = that label, stored at base + `0xa00000` bits). + +**What it does:** the body writes the image-option/scaler hardware directly — + +``` +rom:00036b02 MOVB A9,0xca2b0 ; scaler control registers +rom:00036b0c MOVB A7,0xca2c0 ; (0xca270 … 0xca3a0) +rom:00036b7c MOVB A11,0xca330 +rom:00036c02 MOVE A11,@0x5600100,0x0 ; image-option registers +rom:00036c0c MOVE A7,@0x5600020,0x0 +rom:00036c16 MOVE A7,@0x5600030,0x0 +``` + +No call to the server, no request buffer, no `XieProc`. + +### 1.2 Triggering it in MAME + +The menu path needs the LK401 keyboard model and a menu map that is not +documented; the diagnostic menu's own key handling was not reversed. Instead the +test was entered by PC assignment from the menu idle loop, the same mechanism +`hello.lua` uses: + +```lua +dbg:command("bpset 3FDCE400,,{ pc = 3F1AF540 ; g }") -- idle -> scaled test entry +``` + +(Gotcha: the firmware reaches the idle PC `3FDCE400` **from frame 1**, not at +frame 300 — `progress.lua` samples exactly that PC for all 199 frames of the +baseline. So an "enter the test at frame N" breakpoint actually fires at frame 1 +unless it is gated on a frame counter.) + +--- + +## 2. The tracer + +Script: **`harness/mame/xie_trace.lua`** (new file, this task). +Breakpoint inside `XieProc`, one instruction *after* it loads the request buffer, +so `A9` is the buffer: + +``` +rom:00064b98 MMTM SP,0x54 <- XieProc entry bit 3F525CC0 +rom:00064ba2 MOVE *A11(0x40),A9,0x1 ; A9 = client->requestBuffer +rom:00064ba6 SETF 0x8,0x0,0x0 +rom:00064ba8 MOVE *A9(0x8),A11,0x0 ; <- breakpoint here, bit 3F525D40 +``` + +Action (generated by the script): + +``` +{ printf "XIEHIT buf=%08X %04X %04X %04X %04X %04X %04X %04X %04X\n", + a9, w@(a9+0), w@(a9+16), w@(a9+32), w@(a9+48), + w@(a9+64), w@(a9+80), w@(a9+96), w@(a9+112) ; g } +``` + +`w@` is used rather than `b@` because the TMS34010 program space is 16-bit wide +and bit-addressed; `+16` bits = the next word. + +**Critical harness detail:** debugger `printf` output goes to the *debug +console*, which is discarded unless MAME is started with **`-debuglog`**. Without +it the runs look like "zero hits" whether or not the breakpoint fires. All runs +below use `-debuglog`. + +--- + +## 3. The control run (proof the measurement works) + +Same script, breakpoint moved to the menu idle PC, which executes continuously: + +``` +XIE_TRACE=0x3FDCE400 XIE_FRAMES=60 XIE_WORDS=0 \ + $M vt1200 -rompath /home/arti/code/k-space/vt1200/harness/mame/roms \ + -video none -sound none -nothrottle -debug -debugger none -debuglog \ + -autoboot_script /home/arti/code/k-space/vt1200/harness/mame/xie_trace.lua \ + -autoboot_delay 0 +``` + +Result: **4 634 965 hits** in `debug.log` (`XIEHIT pc=3FDCE400`). The breakpoint, +the action, the memory accessors and the log path all work. + +--- + +## 4. The three trace runs + +| run | configuration | frames | `XieProc` hits | +|---|---|---|---| +| A | plain boot → level-0 diagnostics menu | 1200 | **0** | +| B | `VT1200_SKIP_LEVEL1=1` → OS + Terminal Manager | 4500 | **0** | +| C | forced jump into the Scalution test at `0x35EA8` | 900 | **0** | + +Logs: `xie/ghidra-evidence/mame/run_a_level0_diagnostics.txt`, +`run_b_os_terminal_manager.txt`, `run_c_scalution_jump.txt`, +`run_d_control.txt`. + +Run A's PC stays at `3FDCE400` (menu) throughout; run B ends at +`3F579870` (OS code); run C leaves the menu and runs code at `3F208xxx` +(file `0x109xx`) — so the PC assignment did divert execution. Caveat: a +breakpoint placed on `0x35EA8` itself did **not** fire in run C, so the exact +instruction the jump landed on, and how far the test body executed before +diverting, is not proven. It does not affect the conclusion — the XIE breakpoint +covered the whole run either way. + +**No request bytes were captured because no request was ever dispatched.** The +XIE breakpoint would have printed `buf=… 0081 0002 …` (reqType `0x81` = major +opcode 129) if the server had been asked to do anything. + +Corroborating static evidence: the ROM contains exactly three strings containing +`Xie` — `"Xie"`, `"XieExtensionInit: AddExtension failed"`, +`"XieExtensionInit: Device Init failed"` — all server-side registration text. +There is no client-side XIE API (no `XieInitialize`/`XieCreatePhotomap`-style +names), which is what a firmware-resident XIE client would have left behind. + +--- + +## 5. What this means for the import problem + +The plan "trace the firmware's own XIE client to see the working `PUT_TILE` +sequence" **cannot work**: the firmware has no XIE client, and its image tests +drive the scaler registers instead of the protocol. + +That leaves the static picture as the only route to the band/import question: + +* `PUT_TILE` (minor 19) requires, from `0x6B966`: resource byte 40 == 0, + resource byte 36 != 0, and the band bit `1 << band` set in resource byte 8 or + byte 12 (`GHIDRA_XIE_IMPORT.md` §1). +* Nothing in the create path (`slot 8` → `0x678DA` → `0x6CA82`) writes byte 36, + so some *other* request must. Slot 43 rebuilds a resource record from another + resource's bands (`GHIDRA_XIE_IMPORT.md` §3) and remains the best candidate. + +### Next probes (unchanged, and now the only path) + +1. `PUT_TILE` with **band = 0** (request word 6 = 0) instead of 1. + `BadMatch (8)` ⇒ byte 36 is set and only the mask is wrong; `BadAccess (10)` + ⇒ byte 36 is zero and a band must be created first. +2. If (1) fails: `minor 43, len 10, [id, 0…]` on the class-2 resource, then repeat + (1). +3. If (1) and (2) fail: `minor 7, len 4, [op=1, type=2, id]` (note the field + order: byte 8 is the *type*, byte 12 the *id*), or slot 20 (35 words). + +--- + +## 6. Confirmed / Inferred / Unknown + +**Confirmed** +1. The firmware never enters `XieProc` during POST/diagnostics, during the booted + OS/Terminal Manager, or when the Scalution test is entered (0 hits in 6600 + frames, with a 4.6-M-hit control proving the tracer works). +2. The Scalution test (`0x35EA8`, bit `0x3F1AF540`) writes image-option/scaler + registers `0xCA2xx`/`0x56000xx`; it contains no server call. +3. The ROM has no client-side XIE strings; the only `Xie` strings are the + server's registration messages. +4. Debugger `printf` output requires `-debuglog`; without it, breakpoint actions + are invisible (this silently invalidated a first round of runs here). + +**Inferred** +1. The built-in image tests are board-level diagnostics, not protocol clients. +2. If any code did call XIE it would still arrive at `XieProc` (dix dispatch); + a private internal bypass is not fully excluded, but nothing suggests one. + +**Unknown** +1. Whether slot 43 or slot 20 is the band-materialising request (unchanged). +2. The image-option menu's key map (not needed for the conclusion). + +--- + +## 7. Reproduce + +```sh +M=/home/arti/code/k-space/mame0289/vt1200 +R=/home/arti/code/k-space/vt1200 + +# A: level-0 diagnostics +XIE_FRAMES=1200 $M vt1200 -rompath $R/harness/mame/roms \ + -video none -sound none -nothrottle -debug -debugger none -debuglog \ + -autoboot_script $R/harness/mame/xie_trace.lua -autoboot_delay 0 +# -> debug.log: no XIEHIT lines + +# B: booted OS +VT1200_SKIP_LEVEL1=1 XIE_FRAMES=4500 $M vt1200 +# -> no XIEHIT lines + +# C: forced Scalution test +XIE_JIT=3F1AF540 XIE_FRAMES=900 $M vt1200 +# -> no XIEHIT lines + +# control: breakpoint on the menu idle PC (fires every frame) +XIE_TRACE=0x3FDCE400 XIE_WORDS=0 XIE_FRAMES=60 $M vt1200 +# -> hundreds of thousands of "XIEHIT pc=3FDCE400" lines in debug.log +``` + +`xie_trace.lua` env: `XIE_FRAMES`, `XIE_WORDS` (0 = print PC only), +`XIE_TRACE` (breakpoint address override), `XIE_JIT` / `XIE_AT` (optional +debugger entry). diff --git a/xie/README.md b/xie/README.md new file mode 100644 index 0000000..2c52175 --- /dev/null +++ b/xie/README.md @@ -0,0 +1,1213 @@ +# XIE sources: `xieperf`, XIElib and the sample server extension + +> **STATUS (updated): a client-chosen XIE image IS displayed on the VT1200.** +> The working path is `XieCreateImage -> XieCreatePhoto -> XiePutTile -> +> XieExport(photomap -> depth-1 Pixmap) -> XCopyArea(pixmap -> window)`, run +> with `VT1200_ACCEL=1` and the compression poke in `harness/mame/xie_fix.lua`. +> Two faults were removed: the accelerator's output-FIFO read pointer was never +> reset between transfers, and `dwt/screenshot.py` needs `--real` (1280 wide, +> 256-byte stride) for the VR319 default. See +> `evidence/XIE_IMAGE_DISPLAYED.md` and `evidence/png/xie_window_tiles.png`. +> Everything below this banner that says "NO client-chosen XIE image displayed" +> is *historical* and is superseded; the corrections are listed in that report. + + +Vendored copy of the XIE (X Image Extension) sources from **X11R6.1** +(X Consortium, March 1996). The point of interest is `xieperf`, the XIE +test/benchmark client, which is the natural first client to point at the +VT1200's DECwindows server because that server advertises a `Xie` extension: + +``` +$ xdpyinfo -display 192.168.99.2:0 +... +number of extensions: 2 + ServerManagementExtension + Xie +... +vendor string: DECWINDOWS DigitalEquipmentCorp. +version number: 11.0 +... +depth of root window: 1 plane +``` + +## What is here + +| path | contents | +|---|---| +| `xc/programs/xieperf/` | `xieperf` client: 35 `.c` files, `xieperf.h`, `Imakefile`, `xieperf.man`, and the `images/` test images (`image.001`–`image.014`) | +| `xc/lib/XIE/` | **XIElib**, the client library `xieperf` links against | +| `xc/include/extensions/XIE*.h` | `XIE.h`, `XIEproto.h`, `XIEprotost.h` — wire protocol and client API headers | +| `xc/programs/Xserver/XIE/` | the X11R6 sample **server-side** XIE implementation (reference only; not needed to build `xieperf`) | +| `xc/doc/hardcopy/XIE/` | XIE protocol spec, XIElib spec and sample-implementation architecture, as plain text | + +280 files, about 8.3 MB. PostScript copies of the documents were dropped; +the `.txt` renderings are kept. + +## Provenance + +Downloaded 2026-11-01 from the official X.Org release archive: + +- + — `xc/programs/xieperf`, `xc/lib/XIE`, `xc/include/extensions/XIE*.h`, + `xc/programs/Xserver/XIE` +- + — `xc/doc/hardcopy/XIE` (documents) + +Checksums of the original tarballs: + +``` +d138b68392d4ca49939fd0da46180763a23e82838fb30cb964ed2c5bc6d6c8d6 xc-1.tar.gz +cec75d6ae72d437783c72c2892d637a8a2acfd0f2088358ed024064a1a687976 xc-2.tar.gz +a980821b36607773eba8735ad5608e03c503fe139656f4e3beb64c1b5049fab9 xc-3.tar.gz +``` + +`xc-2.tar.gz` holds the same specs as nroff sources under +`xc/doc/specs/XIE/`; it was not needed for this copy. + +Other places the same tree is available: + +- Browsable single files (Debian's `vnc4` source package bundles an XFree86 + 4.3-era `xc`): + and +- XFree86 3.3.6 mirror: +- X11R6 (1994) and later releases: , + , + +XIE was removed from the reference X11 distribution in X11R6.7 (2004), so +there is no current distro package for `xieperf`. + +## Licence + +X Consortium / MIT-style terms for the X11 code, plus the AGE Logic notice +on the XIE sources. Both are reproduced at the top of every source file and +in `xieperf.man`; the AGE Logic terms permit use, modification and sale +provided the notice is preserved. + +## Using it against the VT1200 — status + +It builds and connects, and it **does** identify the server, but it cannot yet +run the test suite: the VT1200 implements **XIE protocol 2.3**, while +`xieperf` speaks **5.0**. Verified against `192.168.99.2:0`: + +``` +xieperf - XIE performance program, version 1.0 + +XIE V2.3 +FULL server +Screen visual class is StaticGray +Colormap has 2 entries +Effective depth is 1-bit +... +Class name: ColorAlloc +X Error of failed request: BadLength + Major opcode of failed request: 129 (Xie) + Minor opcode of failed request: 0 () +``` + +The request that kills it is the client's 5.0 `QueryTechniques` (minor 2). In +2.3 that slot is **not** `QueryTechniques`: the ROM dispatch table says slot 2 +accepts exactly **one word** and returns success *without a reply*, while the +5.0 request is two words and gets `BadLength`. So `xieperf` hangs at one word +and dies at two. + +The ROM analysis (`GHIDRA_XIE.md`) found **46 request slots, 25 implemented**. +Only slot 1 can be matched to its 5.0 counterpart; the numbering is otherwise +not 5.0's. No slot implements `QueryTechniques` or any technique-capability +reply, so `-showtechs` cannot work against this server. + +Raw X11 probes (no XIElib) plus the ROM table give this map: + +| minor | 5.0 request the client thinks it is | what 2.3 slot N actually does | +|---|---|---| +| 1 | `QueryImageExtension` | same request (2 words); replies **2.3**, class `0x20`, 8 levels | +| 2 | `QueryTechniques` | 1 word, success **with no reply**; not a query | +| 6 | `QueryColorList` | 1 word (bare header) → reply, length 0 (no argument) | +| 11 | `QueryPhotomap` | 3 words (5.0: 2); id at byte 4 → `BadIDChoice` if null | +| 23 | `GetClientData` | not implemented → `BadRequest` | +| 24 | `QueryPhotoflo` | 4 words (5.0: 3); id at byte 4 → `BadIDChoice` if null | + +`BadLength` always arrives with `minor_op = 0` because the handlers *return* 16 +to the dispatcher and the generic error path has no minor to report; errors XIE +sends itself do carry the real minor (minor 23 reports `BadRequest` with +`minor_op 23`). So the `0` in the error is a server-side artefact, not evidence +about which request failed. + +The full evidence is in `evidence/` (`xie_wire_probe.txt`, +`xieperf_showtechs_vt1200.txt`, `xieprobe_vt1200.txt`) and +`ghidra-evidence/` (`dispatch_table.txt`, `listings.txt`, +`length_sweep_wire.txt`). + +**So:** the extension is real and answers XIE requests; `xieperf` 5.0 is the +wrong client for it. A **minimal 2.3 session client now exists**: + +```sh +./xiectl23.py # against 192.168.99.2:0 +``` + +``` +extension present=1 opcode=129 first_event=64 first_error=0 +init (1,2w): REPLY len=8 010102000800000002000300... +qdefs (3,2w): REPLY len=0 0141030000... +qevents(6,1w): REPLY len=0 010004000000000002000000 01000000 01000000 01000000 +term (2,1w): TIMEOUT # Success, no reply +``` + +Order matters: `QUERY_EVENTS` returns `2,1,1,1` only **after** `INIT_SESSION`; +sent alone it returns zeroes. In the INIT reply only major `2` / minor `3` are +stable across connections; the tail words vary, so do not parse them as a fixed +capability record. + +That is the session half. Live probing has since established the resource +rules: the per-connection id base/mask, the reserved bit in new ids, slot 8 +op 2 as a working create, and the exact reason slot 21 refuses to export +(`BadMatch` from resource flag `+0x28`). The exportable object lives in the +photoflo/pipeline layer, not in slot 8. See +`evidence/xie_create_export_probe.txt`, `GHIDRA_XIE_IMAGE_PATH.md` and +`GHIDRA_XIE_PIPELINE.md` (when present). + +### Is there an XIE client inside the ROM? + +**No.** The ROM contains the XIE **server** only. A MAME trace with a breakpoint +on `XieProc` (`0x3F525CC0`) saw **zero** hits in three runs: + +| run | configuration | `XieProc` hits | +|---|---|---| +| plain boot → level-0 diagnostics | 1200 frames | 0 | +| `VT1200_SKIP_LEVEL1=1` → OS/Terminal Manager | 4500 frames | 0 | +| forced jump into the Scalution test (`0x35EA8`) | 900 frames | 0 | +| control: same tracer on the menu idle PC | 60 frames | 4,634,965 | + +The control run matters: MAME discards debugger `printf` output unless it is +started with **`-debuglog`**, which is why the first zeroes were not yet +trustworthy. With `-debuglog` the control fires, so the zeroes are real. + +The “5 - Scalution Testâ€� is a **hardware diagnostic**: its body writes the +image-option/scaler registers (`0xCA2B0`, `0xCA330`, `0xCA3A0`, `0x5600020`, +`0x5600030`, `0x5600100`) directly. It never calls the server or builds an XIE +request. The ROM’s only `Xie` strings are the server registration messages. + +So there is no working 2.3 client sequence to replay. The client in this +directory is ours, and the `PUT_TILE` band gate still has to be settled from the +server model plus live probes. Report: `MAME_XIE_TRACE.md`; reusable tracer: +`harness/mame/xie_trace.lua`. + +### Clients and tools in this directory + + + +| file | what it is | status | +|---|---|---| +| `xiectl23.py` | minimal XIE 2.3 session client: INIT_SESSION → QUERY_OP_DEFAULTS → QUERY_EVENTS → TERM_SESSION | verified against the VT1200 | +| `probe23.py` | live raw-X11 probe with a persistent connection: session, defaults, raw slots, create/sweep | used for all wire evidence | +| `xshow.c` / `xshow` | 1-bit image viewer using **core X11 PutImage**; reads the window back and compares on-pixel counts | verified on the VT1200 (`MATCH`), **not XIE** | + +`xshow` is the display half and an honest fallback, not a pure XIE image +client. The XIE path itself is now much further than the session: the create +request with a non-zero **level word at byte 28** (`2` = 1 bpp) produces an +exportable resource, and slot 21 exports it into a real X window + GC with no +error. + +Slot 20 arms the resource's bands. The request that succeeds is 35 words with +`id@4`, `byte8 = 64`, `byte12 = 2`, `byte14 = 1`, `byte16 = 1`, `byte13 = 1` +(mode). After that, `PUT_TILE` no longer returns `BadAccess`; it reaches the +class check: + +- class-2 resource (`create op 2`) → **BadMatch**: `PUT_TILE` passes class 3. +- class-3 resource (`create op 1`) → **BadIDChoice**. + +~~So the target is a class-3 resource with byte 40 == 0.~~ **WITHDRAWN — the +byte-40 rule was a misreading.** Measured instead: + +- `create op 1` and `create op 2` call the **same** routine (file `0x678DA`); + the only op-dependent value it passes is `(op == 2) ? 1 : 0`, and `op` is + also the level loop count (`DSJ` at `0x67A24`). +- `create op 1` → object class **3** but `id@0 == 0`: the ID is stored + **nowhere** in the object, so the table lookup can never find it → + `BadIDChoice`. +- `create op 2` → object class **2** with `id@0` set → addressable. +- Only payload **word 1** is accepted as the ID (any other position → create + `BadIDChoice`). +- Byte 40 is a **copy-out** field: the helper (file `0x66FA0`) copies + `*obj(0x140)` out when the caller passes a non-NULL out-param, and only the + NULL-out-param variant tests it — raising `0xE`, not `0x8`. So patching byte + 40 could never have fixed `PUT_TILE`, which is what was measured. + +So the real missing piece is **the request that both selects class 3 and +stores an ID**. Evidence: `evidence/class3_id_not_stored.txt`. + +#### The create opcode space is exhausted + +Every accepted create opcode has now been tested at its own required length: + +``` +op=1 12 words create OK allocates query BadIDChoice put BadIDChoice +op=2 12 words create OK allocates query REPLY put BadMatch +op=3 BadIDChoice +op=4 6 words "OK" allocates NOTHING, ID never addressable +op=5 7 words "OK" allocates NOTHING, ID never addressable +op=6 >=6 words "OK" existing resource left intact and queryable +``` + +`op 4` and `op 5` are not creates — both begin by looking up an *existing* +resource (`op 4` looks up payload word 2 through `0x7EA6FA0`; `op 6` looks up +payload word 1 through `0x7F174A4`). Only `op 2` yields an addressable +resource, and its class is 2. So no create opcode produces a class-3 resource +registered by ID. Evidence: `evidence/create_opcode_sweep.txt`. + +#### Slot 11 is not the class-3 bind + +`slot 11` needs exactly 3 words (2 ids) and performs **two typed lookups** +(call #1 pushes the literal `0xffff`, call #2 pushes `0`). With two valid, +queryable class-2 resources: + +``` +A=0040C000 class=2 b40=0 B=0040D000 class=2 b40=0 +slot11 [A,B] -> BadIDChoice (14) +slot11 [B,A] -> BadIDChoice (14) +after: both unchanged, both still queryable, put -> BadAccess (10) +``` + +The operand types are fixed inside the handler, so slot 11 cannot be steered to +a class-3 bind from the request. Evidence: +`evidence/slot11_bind_and_second_allocator.txt`. + +#### The element is created by EXPORT, not filled by PUT_TILE + +`element = *( *(res+44) + 0xd8 )` is **0** after create, after arm1, and after +`PUT_TILE`; it only becomes non-zero inside EXPORT (`0x1B234`: +`EX_BAND a5=003DC4B0 elem@d8=003FDA10`). No write to `element+0x28` was ever +observed. So `PUT_TILE` does not populate the element — EXPORT builds it — and +the source image pointer it copies stays 0. Evidence: +`evidence/element_pointer_timing.txt`. + +#### Export resolves the resource; only `src_base` is empty + +Values written by the export copy block (`0x1B296`), named against the +firmware's own dump strings: + +``` +rp+0x5a8 = 0x0040C000 src_res_id -> our resource, correctly resolved +rp+0x5d0 = 64 src_width +rp+0x5f0 = 64 src_height +rp+0x610 = 0 src_base <-- the pixel buffer: MISSING +rp+0x738/0x758 = 64/64 dst_img PWIDTH/PHEIGHT +``` + +So EXPORT is **not** failing to find the resource — it has the id and the +64×64 size. The single empty field is `src_base`, loaded at `0x1B238` +(`MOVE *A5(0x28),*A11(0x610)`), which no write watchpoint ever saw written. +The missing datum is a pixel buffer for the source image, produced only by the +import. Evidence: `evidence/export_renderparams_map.txt`. + +#### slot 47 is a byte-swapped dispatch trampoline — and is unreachable + +`file 0x697B4` swaps the bytes of request words at bit offsets `0x10/0x18`, +`0x20/0x28`, `0x30/0x38`, then re-dispatches through the **same** table at +`0xD3F90` (`SLL 5 ; ADDI 0xd3f90 ; MOVE *A11,A11 ; CALL A11`). + +**Tested and closed:** with breakpoints on the trampoline body +(`0x3F54BFF0` table read, `0x3F54C000` CALL — count 36→38, no command errors), +minor 47 returned `BadRequest` for plain *and* byte-swapped argument words, and +the trampoline **never executed** (0 `TRAMP` hits). So there is no +client-reachable byte-swapped request family. It is also self-referential: the +swaps cover offsets 2–7 only, never the minor byte at offset 1, so a client +request for minor 47 could only re-enter it. + +The default handler `0x64C3C` (shared by every unimplemented slot and by slot 0) +is the `BadRequest` responder — which is why probing unimplemented slots +returned `ERR1`. Evidence: `evidence/trampoline_unreachable.txt`. + +#### src_base sweep across every remaining slot — none writes it + +Each remaining implemented slot was exercised at its own required length with +`[resource_id, 0, 0…]`, in a full create→arm1→``→PUT_TILE→arm2→EXPORT +sequence, reading `rp+0x610` from the export breakpoint and diffing the window +against its pre-export content: + +``` +slot 18,40,44,33,14,15,9,13,24 : src_base = 00000000 window changed = False +``` + +Every export still resolves the source id and the 64×64 geometry +(`5a8= 5d0=40 5f0=40`), and `610=0` in every case. Coverage is now +complete: every implemented slot (`1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 18 19 20 +21 22 24 33 40 43 44`, plus the `BadRequest` default and the unreachable +trampoline) has been exercised against a created resource. + +This is **not** a proof of impossibility: only one argument shape per slot was +tried. Evidence: `evidence/src_base_sweep_all_slots.txt`. + +#### Multi-operand shapes fail at the same typed-lookup wall + +The bind-family handlers (`33 40 44 18`) and `43` were then given **two and +three live ids**. Two findings: + +- The third operand is an **id**, not a flag: `slot33 [A,B,t]` for `t=1..9` + returns `BadIDChoice` with `bad = t` (and `t=0` → `BadValue`). +- With three *valid* ids the lookup still fails, because it is typed: + +``` +slot33 [A,B,A] / [A,B,B] / [A,B,C] / [A,A,A] -> BadIDChoice, bad = 3rd id +slot40 [A,B,A] / [A,B,B] -> BadValue, bad = A +slot44 [A,B,A,0] / [A,B,B,0] -> BadValue, bad = A +slot18 [A,B,0] -> BadMatch +slot43 [A,B,0...] -> BadValue +``` + +Every multi-operand request fails at a **typed lookup of one of its own +operands**: the operand exists and is queryable, but lacks the class the handler +requires. That is the same wall as `PUT_TILE`, reached from four more +directions. `src_base` stayed 0 and no window changed. Evidence: +`evidence/multi_operand_shapes.txt`. + +#### The single wall, restated precisely + +Every client-reachable path — single- and multi-operand, all implemented slots — +fails for one reason: the server's resource model requires a resource class that +its create path will not issue **with a stored id** (`create op 1` builds a class-3 +object but leaves `id@0 = 0`). Until that class can be created addressably, no +request reaches an import that would set `src_base`. + +#### Why that class cannot be created addressably — CORRECTED + +> **Superseded.** The "mutually exclusive" argument below is **wrong**: +> `op=1` *does* reach the registering body. Measured with breakpoints on +> `0x67B04`/`0x67B34`, `create op=1` registers id `0040C000` → object +> `0036A950`, which is a **class-1 photoflo** (`id@0` set, `w=3259088 h=1`, +> `query → BadAccess`). `create op=2` registers a **class-2 resource** +> (`003FD7D0`, `w=64 h=64`, `query → REPLY`). The class-3 object seen earlier +> (`class 3`, `id@0 = 0`) is an **intermediate** that is never the registered +> object. So the accurate statement is: *the id is registered to a class-1 +> photoflo or a class-2 resource; no create opcode registers a class-3 object.* +> Evidence: `evidence/registration_hits_corrected.txt`. + +#### Registration audit: only class 1 and class 2 ever get an id + +A full audit with breakpoints on `0x67B04` (ID store) and `0x67B34` (register): + +``` +arm1 / put / arm2 / slot43 / export / arm1(photoflo) / put(photoflo) -> 0 hits +create op=2 id=0040C000 -> REGIDSTORE obj=003FDA10 (class 2, query REPLY) +create op=1 id=0040D000 -> REGIDSTORE obj=00385890 (class 1, query BadAccess) +``` + +Registration happens **only inside create**, and only those two object kinds ever +receive an id. The class-3 object built by the allocator (`file 0x6CA82`) never +appears in a REGIDSTORE. + +Walking the photoflo's `+0x160` chain the way export does +(`0x1B230 MOVE *A5(0x160),A5`): + +``` +lvl0 00385890 id@0=0040D000 class=1 p44=00386010 <- resource-like +lvl1 00386010 id@0=003859D0 class=80 p44=00386290 <- first word is a pointer +lvl2 00386290 id@0=00386150 class=144 p44=003C7150 +lvl3 003C7150 id@0=003863D0 class=144 p44=00000000 chain ends +``` + +Only lvl0 has a resource layout; from lvl1 the first word is a pointer and the +"class" byte is `0x50`/`0x90`, so those are internal blocks, not resource +structs, and carry no client id. So there is **no client-visible id whose +registered object is class 3** — the two ids a client can obtain are registered +to class 2 and class 1. Evidence: `evidence/photoflo_chain_no_id.txt`. + +#### The `armF` state gets furthest: BadAccess instead of BadMatch + +Tracing the one configuration never followed before (`I` = image, `F` = photoflo): + +``` +create I 0x40C000 -> REGIDSTORE id=0040C000 obj=003FDC50 ; REGISTER +create F 0x40D000 -> REGIDSTORE id=0040D000 obj=00388090 ; REGISTER + +arm F then PUT_TILE I -> S19LOOK a8=0000000A (BadAccess, 10) +arm I then PUT_TILE I -> S19LOOK a8=00000008 (BadMatch, 8) +PUT_TILE F (unarmed) -> S19LOOK a8=0000000E (BadIDChoice, 14) +``` + +Arming the photoflo genuinely moves the typed lookup past the stage that yields +`BadMatch` and stops it at a `BadAccess` check — a real state difference and the +furthest any configuration has reached. No configuration reached the handoff +(`0x6B640`) or wrote `src_base`; the registration sites get 0 hits outside +create. + +**Caveat, recorded because it invalidates a column I have been quoting:** the +`LOOK` breakpoint at `0x6BA38` prints `cls=01` for both the armF and armI cases, +and earlier printed an incrementing `01,02,03` across calls. So `A7` there is the +**export element**, not the resource struct — its `cls`/`b40` columns are not +resource fields. Only `S19LOOK`'s return code (`a8` at `0x6A7B4`) is trustworthy. +Evidence: `evidence/armF_lookup_codes.txt`. + +#### Three more assumptions tested and falsified + +Chasing the `BadAccess`, three structural guesses were each disproved within one +step — recorded so nobody repeats them (`evidence/three_wrong_assumptions.txt`): + +1. `0x7F638C2` is **not** the allocator — file `0x1238C2` is a printf-style + logger (format descriptors `0x3fb1cea0` etc.). The real allocation is + `0x7EACA82` → file `0x6CA82`. +2. `0x7F174A4` is **not** the XIE resource lookup — file `0xD74A4` indexes a + table at `0x21FFE0` by `N = (id & 0xFFF00000) >> 12`, bounds-checked against + a count of 16 at `0x225870`. That is the **core-X client index**; for our ids + `N = 1024`, out of range, bucket reads 0. +3. `@0x1AD980`/`@0x1AD990`/`@0x1AD9A0` are **not** XIE list heads — they read + `0x02000002`, `0x04000200`, `0x00000400`, and following them as pointers + reads zeros. + +The direct observations stand (`S19LOOK a8 = 0x08 / 0x0A / 0x0E` at `0x6A7B4`), +but every *explanation* built on those three functions is now void. + +#### The slot-19 lookup is `file 0x6B966` — and it does not produce the `0x8` + +`rom:0006a7ae CALLA 0x07eab966` → file **`0x6B966`** (not the `0x66FA0` helper). +Its flow: + +``` +6B990 CALLA 0x07F174A4 ; returns an object pointer +6B99A JRNE 0x6BA8C ; null -> MOVK 0xe (BadIDChoice) +6BA8C A8 = object->byte4 ; class byte +6BA90..6BA9C class 1 -> 0x6B9C4 ; class 2 or 3 -> 0x6BA1E ; else 0xe +6BA1E arg3==NULL ? require object->byte40 == 0 (else 0xe) : copy byte40 out +6B9C4 (class 1) requires arg3 != NULL, then a two-step byte8->byte8 / + byte12->byte8 deref +``` + +It raises **only `0xE` and `0xA`** — there is no `0x8` route before `0x6BBC0`. + +Measurements that contradict a simple story, recorded as-is: + +- sweeping request payload word 5 (the `arg6` the code branches on) over + `0,1,2,0x100,0x10000,0x80000000,0xFFFFFFFF,0xFFFFFFFE` gives `BadMatch` every + time — `arg6` has no observable effect; +- the `0xE`-build site (`0x6BA86`) *did* fire during a put whose reply was `ERR8`; +- the `0xA` site (`0x6BAC6`) and an in-function `MOVK 0x8` site (`0x6BB4C`) did + **not** fire during that put; +- the shared reply helper `0x7EFFA5E` did not fire at all. + +So the `ERR8` the client receives is not produced by any site we can see, and +site-based attribution is unreliable. Evidence: +`evidence/lookup_is_6B966.txt`. + +**Bounded next step:** disassemble the remainder of `0x6B966` (`0x6BBC0..0x6BBE4`) +and the `0x6BAEA` path, logging `A8` at every return, to find the `0x8`'s true +origin. Until that is known, `BadMatch` cannot be interpreted. + +Both properties the import needs are decided in the same routine +(`file 0x678DA`): + +``` +679A2 SUBK 0x2,A11 ; MOVK 0x1,A11 +679A6 JREQ 0x679AA ; op==2 -> flag 1 +679A8 SUB A11,A11 ; else -> flag 0 +... +6CAF6 JREQ 0x6CAFC +6CAF8 MOVK 0x2,A11 ; flag!=0 -> class 2 +6CAFC MOVK 0x3,A11 ; flag==0 -> class 3 <-- 6CAFE stores it +... +67A20 MOVE *A9(0x20),A11 ; A11 = op +67A24 DSJ A11,0x67AFC ; op-1 != 0 -> jump to the REGISTERING body +67A28 ... ; op-1 == 0 -> photoflo path +67B04 MOVE *A9(0x40),*A11(0x0) ; ID -> obj+0 +67B34 CALLA 0x07F16CA2 ; register in the resource table +``` + +- `op = 1` → flag 0 → **class 3**, but `DSJ` falls through to the photoflo path + (`0x7F63A30`, 20 words, error string "error allocating photoflo"), so the ID is + **never stored and never registered**. +- `op = 2` → flag 1 → **class 2**, and `DSJ` jumps so the ID is stored and the + resource registered. + +`PUT_TILE` requires class 3 (slot 19 pushes `MOVK 0x3` before the typed lookup), +and the only class-3 producer never registers. So the import is unreachable — +**not because a request shape is missing, but because the two properties the +lookup requires cannot coexist in the implementation.** + +`op=4` was also ruled out: it increments a counter on the target (obj word at +byte 6: 1→2→3 after two calls, no new allocation) and `PUT_TILE` stays +`BadMatch` at every count. Evidence: +`evidence/class3_registration_impossible.txt`. + +### MAME trace: the limit we reached + +A single MAME instance on the host tap (`-networkprovider taptun`, +`-cfg_directory harness/mame/cfg-net`) makes the emulated terminal available at +`192.168.99.2`, and `harness/mame/xie_resource.lua` traces `XieProc` requests +and the resource lookup. With `-debuglog`, every request appears as +`XIEHIT buf=... 0181 0002 ...`, and the lookup check prints +`LOOK a7=... id=... class=... b36=... b40=...`. + +Results: + +- `PUT_TILE` can be forced through the class check with a debugger branch skip + (`0x6BAF6` → `0x6BBCE`); it then returns success — a **false success**, see + below. +- ~~The exported window is still independent of the tile data: solid-white and + solid-black tiles produce the same 64×64 pattern. That pattern is the XIE + export default/dither, not the supplied pixels.~~ **WITHDRAWN.** +- Therefore the missing piece is the **band/execute format** (the + photoflo element/bind layer), not just the class check. The class skip only + lets the request through; the data never reaches the export sink. + +#### Correction: export has never painted anything + +The `8888…2222…` pattern is the **window's own default background**, not XIE +output. Measured on one instance, one connection, 64×64 window: + +``` +BASELINE (window created+mapped+GC, NO export) nz=512 first=88888888888888882222222222222222 +AFTER (create→arm1→PUT_TILE→arm2→EXPORT) nz=512 first=88888888888888882222222222222222 +identical to baseline: True +``` + +So every white-vs-black comparison was vacuous. The measured reason export +draws nothing: the chain is intact but has no source image — + +``` +EXPORTENTRY +EXPORTFLAG f=01 ; global @0xA6220 non-zero, render path taken +EX_BAND a5=003DC4B0 elem@d8=003FDA10 ; photoflo→band→element IS present +EX_ELEM a5=003FDA10 f28=00000000 ; element+0x28 == 0 → no imported image +``` + +The driver copies `element+0x28` into the render params (`0x1B238 +MOVE *A5(0x28),*A11(0x610)`), and the per-element render loop +(`0x1BC38..0x1BF30`, element types 1–5 = crop/scale/rotate/mirror/export) +is never reached. Because the import never runs (`PUT_TILE` → `BadMatch`), +nothing fills `element+0x28`. Evidence: +`evidence/export_paints_nothing.txt`, `evidence/export_chain_trace.log`. + +The correct acceptance test is therefore **"export output differs from a +no-export baseline"**, not "export matches a known pattern". + +A band dump at slot 20's comparison (`0x6AB88`) shows the arming state +`f1=01 f2=02 f4=00010000 f8=0 f12=0 f16=0`. The **second** execute produces no +`BAND` line at all: it fails in the lookup/state path **before** the band +comparison, so no choice of the 35-word comparison fields can reach it. + +The `0x6BA38` pointer was then tested as the resource: a second connection's +before/after peek at the same address (`0x003FDA10`) returned the terminal +message string `"Connection request from IP host 192.168.99.1"`, identical +before and after `PUT_TILE`. So that breakpoint is an **unrelated lookup**, not +the XIE resource; the requested resource diff cannot be obtained with it. +`GHIDRA_XIE_IMPORT.md`'s mapping of that path is therefore wrong. Evidence: +`evidence/mame_look_not_resource.txt`. + +The real resource was then located by scanning the XIE table entry for the +client id (id followed by handler pointer `0x3F566ED0`; resource pointer at ++12). At `0x003FDC50`, the struct is +`id | class=02 | width=64 | height=64 | band-ptr@36 | ptr@44`. Its band record +is at `resource+36` (`0x008FE730`). A full before/after diff around +`PUT_TILE` shows: + +- resource struct: **byte-identical** +- band record: **byte-identical** +- XIE globals `0x1AD800..0x1ADB00`: **no changed bytes** +- second slot-20 execute: still `BadMatch` + +So the post-put gate is **not** in the resource, the band record, or that +global block. Evidence: `evidence/mame_state_diff.txt`. + +Write watchpoints during `PUT_TILE` then identified the gate: + +``` +WPHIT res addr=003FDC80 data=00000000 ; resource byte 48 = 0 +WPHIT band addr=008F6750 data=00000001 ; band byte 12 = 1 +``` + +Slot 20 ANDs `band+0x60` (byte 12) with request byte 16 and requires zero, so +after the put the second execute must use `v16 = 0`: + +``` +arm1 v16=1 -> OK +put -> OK +arm2 v16=0 -> OK +arm2 v16=2/3/4/0x10 -> BadMatch +``` + +That solves the arm-2 gate. **Export is still independent of the pixels**: +solid-white and solid-black both give `nz=512 first=88888888…2222…`. The band +sink pointer `band+0x30` is zero; poking it to the resource’s `+44` pointer did +not change that. + +Slot 7 `{op=1, type=0, id}` was then tested as the bind: with it `PUT_TILE` +returns `BadIDChoice`, and the export pattern is unchanged. So slot 7 is not +the sink bind either. Evidence: `evidence/mame_bind_slot7.txt`. + +Static decode of the payload handoff `0x7EAB640` (file `0x6B640`) shows it is +the **import-element executor**: it selects element type 1/2/3 from +`client+8`, takes the band subobject at `band+0xd8`, calls `0x7E80008`, and +clears the transient payload pointer at `band+0x28`. **`band+0x30` is not used +by the handoff at all.** So the band sink assumption was wrong; the missing +piece is the three-element pipeline definition and its export element, not the +handoff target. Evidence: `evidence/payload_handoff_6b640.txt`. + +A bit/byte correction matters: `*A9(0xd8)` is **byte 27**. The create writes the +band record pointer at byte 27 of the **`+44` array** (`u32@27 = 0x003FDA10`); +the `+36` array has zero at that byte but slot 20 does not use it for the +handoff. So the handoff itself is not a no-op; the **element array** used by +slot 20 is the one that lacks the record. + +Attempting a three-element pipeline (create with band count 3 and levels +`[2,2,2]`) makes arm 1 fail `BadMatch`; the one-band path works but export is +still data-independent. + +Populating the `+36` element record by rdebug poke (`r36+27 â†� 0x003FDA10`, the +valid band record from the `+44` array) also leaves export unchanged: +solid-white and solid-black both give `nz=512 first=88888888…2222…`. So the +export path is not driven by that element array either. Evidence: +`evidence/element_poke_no_effect.txt`, `evidence/pipeline_3_elements.txt`. + +Calling slot 21 **before** `PUT_TILE` also gives the same pattern. Slot 21 +allocates a 0xC8-byte export context, calls `0x7E5B152`, then frees the context +at `0x630B0`; the export process block reads the band’s transient payload +pointer at `band+0x28` (byte 5), which slot 19 clears after the handoff. No +ordering of the current requests captures the tile. Evidence: +`evidence/export_before_put.txt`. + +The device-dependent dispatcher `0x7E80008` (file `0x40008`) was instrumented +at its `CALL A11` (`0x40086`): **no DDCALL occurred during `PUT_TILE`**. The +tile data does not reach a DD element worker at all; the dispatcher’s early +type checks reject before the worker call, or the handoff does not reach it. + +Instrumenting the whole path then showed the stronger result: with +`XIEHIT` confirming that minor 19 reaches `XieProc`, **none** of the slot-19 +entry (`0x6A76E`), the handoff (`0x6B640`), or the DD dispatcher breakpoints +fire. The “PUT_TILE OKâ€� is the debugger branch-skip taking an early return, +not an import. The earlier `put OK` results are therefore not evidence of +import, and the minor-19 handler mapping itself needs re-verification. +Evidence: `evidence/class_skip_false_success.txt`, `evidence/no_dd_worker.txt`. + +The live dispatch table then confirmed entry 19 is correct +(`0x3F553B70` → file `0x6A76E`), and with the branch skip removed the real +trace is: + +``` +XIEHIT ... 1381 0088 ... ; minor 19 reaches XieProc +S19ENTRY ; 0x6A76E reached +S19LOOK a8=00000008 ; lookup returns BadMatch +put -> ERR8 bad=id minor=19 +no S19HANDOFF ; 0x7EAB640 never called +``` + +So the real path is blocked at the lookup: it needs a class-3 resource that is +**registered by ID**. Evidence: `evidence/dispatch_entry19.txt`. + +> **Superseded:** the "byte 40 == 0" requirement stated here and below was a +> misreading. Byte 40 is a copy-out field, and the actual reason class 3 is +> unreachable is that `create op 1` never stores the ID at `obj+0`. See +> `evidence/class3_id_not_stored.txt` and the correction near the top of this +> file. The paragraphs that follow record what was tried under the wrong +> assumption; they are kept for history, not as conclusions. + +The bind/copy helper `0x672A4` explains why no class-3 resource qualifies: +for class 2 or 3 it executes `resource+0x140 = source pointer` +(`0x673F4`). Slot 11 is a two-resource bind (lookup id@4, lookup id@8, call +`0x672A4`), so any class-2/3 resource created or bound through this helper has +a non-zero byte 40. No request in the recovered set produces class-3 with +byte 40 clear; slot 43 calls the same helper, and its type descriptors/inputs +remain the only untried route. Evidence: `evidence/bind_672a4.txt`. + +Slot 43 with the source id duplicated as its destination field +(`[A, A, 0…]`) partially changes the resource — the lookup error moves from +`BadMatch` to `BadAccess` once — but the state is unstable: with slot-20 +arming it returns to `BadMatch`, and the real `PUT_TILE` never passes. No +class-3 resource with byte 40 = 0 and a usable band is produced. Evidence: +`evidence/slot43_self.txt`. + +Instrumenting slot 43 directly (`0x65BD0` object, `0x65C46` ID store) for +`[A, 0]` gives: + +``` +S43OBJ a8=00385D90 ; object allocation hit +S43ID ; ID store NEVER hit +slot43 -> BadValue +query 0 / put 0 -> BadIDChoice +``` + +The hit object is a temporary process block; poking its first word to a valid +ID B still leaves B unaddressable (`BadIDChoice`). Slot 43 fails before the ID +store, so it does not create an addressable class-3 resource. Evidence: +`evidence/slot43_instrumentation.txt`. + +A later attempt to locate the live resource by a field-filtered scan also +failed: the `0x60000..0x180000` hits were class-0 copies, and +`0x3E0000..0x400000` contained no matching struct. The resource pointer is not +stable across runs, so the class-byte patch could not be applied to the real +resource. Evidence: `evidence/resource_scan_fail.txt`. + +A deterministic capture at `0x6CC0E` (`RESPTR a7=…`) finally gave the real +pointer. For an op-1 (class-3) resource, byte 40 was `0x003C73D0`; patching it +to 0 still made the real `PUT_TILE` return `BadIDChoice`: + +``` +resource 0x003FDC50 class 3, byte40 0x3C73D0 -> 0 +put -> ERR14 S19LOOK a8=0000000E (BadIDChoice) no S19HANDOFF +``` + +So a class-3 resource is not in the lookup table slot 19 searches, even with +byte 40 forced to 0. The class-3 namespace is separate; patching the struct +does not register it for `PUT_TILE`. Evidence: `evidence/class3_b40_patch.txt`. + +The remaining gap is the destination/sink for the tile data and the export +draw path. Evidence: `evidence/mame_put_gate.txt`, +`evidence/mame_put_watchpoints.log`. + +That leaves the same conclusion as before, now with a concrete invalidated +assumption: the post-`PUT_TILE` state is not reachable through the recovered +addresses, and the 2.3 element/state format remains unknown. + +Evidence: `evidence/xie_export_window_vt1200.png`, +`evidence/xie_export_crop.png`, `evidence/mame_xie_resource.log`, +`evidence/mame_band_arm2.log`, `evidence/mame_look_dump.log`. + +This is the honest ceiling of the current work: the **server** is understood +well enough to create, arm, put and export, but the undocumented pipeline +element format is still required to make the exported image be the client's +pixels. A working DEC XIE 2.3 client library or protocol document is the +missing external input; nothing in the ROM supplies it (`MAME_XIE_TRACE.md` +shows the built-in image test drives hardware directly and never calls XIE). + +```sh +./xiectl23.py # XIE 2.3 session +./probe23.py defaults # set/query op defaults +./probe23.py cs7 0xC0AAAA 0xFFFF # create probe + resource sweep +gcc -O2 -o xshow xshow.c -lX11 +./xshow -display 192.168.99.2:0 -pattern checker -seconds 30 +``` + + + +Other server properties that will matter once a 2.3 image client exists: + +- **Depth 1 / StaticGray.** The VT1200 root is 1 bit deep, so pipelines that + end in `ExportDrawable` must match that visual (`ConvertToIndex`/`Dither`/ + `Point`); `ExportPhotomap` tests display nothing. +- **Image files.** Run from this directory or pass + `-images xc/programs/xieperf/images`. + + +## DEC documentation + +`docs/dec/` holds DEC's own manuals, downloaded rather than guessed at: + +- `DECimage-1200-install-use-...pdf` — the closest DEC document to this + server. Appendix C says the terminal "uses a subset of the XIE protocol", + lists the supported functions (session/resource/transport/geometric/process + control) and the pipeline restrictions. +- `VT1200-user-guide-...pdf` and `VT1200-release-notes-V2.0-...pdf` — no XIE + content, but they establish what the base terminal documents. +- `DTJ-1991-v03-04-...pdf` — DEC Technical Journal article on the bitonal + image accelerator, citing *X Image Extension Concepts, Version 2.4*. +- `VXT2000-user-information-XIE3.0.pdf` — the later DEC terminal that + explicitly documents XIE protocol 3.0. +- `DECwindows-Motif-OpenVMS-XIE-support.pdf` — DECwindows Motif shipped XIE + **3.0** (`XIE$SHRLIB.EXE` + headers), not 5.0 and not the VT1200's 2.3. + +See `docs/dec/README.md` for quotes, part numbers, provenance, and the +software-media checks. DEC did not publish the 2.3 wire encoding in these +manuals, and the surviving Ultrix UWS tapes checked carry no XIE development +kit. So request numbers and lengths still come from the live probes and the +ROM analysis. + +The closest surviving **source** is already in this tree: +`xc/programs/Xserver/XIE/` is DEC/AGE's server-side implementation (protocol +5.0, `session.c` by Dean Verheiden, AGE Logic, 1993), the direct descendant of +the ROM's dispatcher. It is the structural map the Ghidra work is using. + +## Building + +It builds on a modern toolchain, without imake, using the host's X11 +headers and libraries: + +```sh +./build.sh +# built: .../xie/build/xieperf/xieperf +``` + +Requires `gcc`, `libX11-dev`, `libXmu-dev` (and `ar`). `build.sh` stages the +XIE headers as ``, compiles `xc/lib/XIE` into +`build/libXIE.a`, then compiles and links the 35 `xieperf` sources against +it with `-lXmu -lX11 -lm`. + +Flags that matter: `-std=gnu89` keeps the K&R-era source legal on GCC 16, +`-fcommon` preserves its tentative definitions, and `-w` hides the expected +prototype warnings. This was verified with GCC 16.2.1. + +The original imake build (`Imakefile`: `$(XIELIB) $(XMULIB) $(XLIB)`, +`MathLibrary`) still works in an X11R6.1 tree, but needs the whole imake +configuration. + +### Local fixes for DECwindows and modern libX11 + +Two changes were made to the vendored `xc/lib/XIE/init.c` (both marked with +comments in the source): + +1. **Display-lock deadlock.** `XieInitialize` holds the display lock and then + calls `XInitExtension`, a public Xlib function that takes the same lock. + Old single-threaded Xlib made `LockDisplay` a no-op unless `XInitThreads` + had been called, so the bug was invisible; on a modern threaded libX11 it + self-deadlocks in `pthread_mutex_lock` inside `XQueryExtension`. The lock + is now dropped around `XInitExtension` and re-taken afterwards. +2. **Extension name.** XIE's canonical name is `"XIE"`, but DECwindows + registers it as **`"Xie"`**, and extension names are case-sensitive. On + the VT1200: + + ``` + XQueryExtension("XIE") = 0 + XQueryExtension("Xie") = 1, opcode=129 event=64 error=0 + ``` + + `XieInitialize` now tries `"XIE"` and falls back to `"Xie"`. + +Without both fixes `xieperf` either hangs or reports `XIE not supported on +this display!` — neither reflects the server's actual XIE support. + +### Upstream bug: `-showtechs` alone prints usage + +In `xieperf.c` the `-showtechs` branch sets `showTechs` but not `foundOne`, +and `main` calls `usage()` when `foundOne` is false. So this is not a build +problem: + +```sh +./xieperf -display 192.168.99.2:0 -showtechs # prints usage, exits +./xieperf -display 192.168.99.2:0 -showtechs -all # works; -all sets foundOne +``` + +`-showtechs` only prints the capability list and exits before running any +test, so the extra `-all` has no other effect. + +#### The BadMatch gate: `object->byte8` must equal 3 + +The `0x8` is now located. At `0x6BAF4` the lookup compares one byte of the object +against the literal `3` that slot 19 hardcodes: + +``` +6BAEE MOVE *A13(0xff40),A11,0x0 ; = 3 +6BAF2 MOVE *A7,A7,0x0 ; 8-bit field +6BAF4 CMP A7,A11 +6BAF6 JREQ 0x6BBCE ; equal -> selector dispatch +6BAF8 ... MOVK 0x8 ; else BadMatch +``` + +Measured at the `CMP`: `GATE a7=00000001 a11=00000003`. This is exactly the +branch once "skipped" with `pc = 0x3F55DE70` to make `PUT_TILE` report success — +that was never a real path, and we now know what it bypassed. + +`byte8` is **arm-controlled**: the arm request sets it to the 16-bit field at +payload bytes 8..9 (`v12`), measured `v12 = 0,1,2,3 → byte8 = 0,1,2,3`, with +`arm = OK` for `v16 ∈ {0,1}` and `arm = ERR8` for `v16 ∈ {2,3}`. + +**Correction:** `BadAccess(10)` is the *unarmed* path, not progress. `w9=0x100` +with no arm gives `put = ERR10` and the gate is never reached; with `w9=0x300` +the arm fails, so the put was simply unarmed. With `v12=3` armed (`byte8=3`) the +gate is still not reached and neither `0x8` site fires, yet `put` returns `ERR8` +— and sweeping the tile geometry (`64×64`, `1×1`, `63,63`, `128×128`, …) changes +nothing. So `ERR8` has at least two origins in slot 19, and the one that fires +with `byte8=3` is **earlier than the lookup**. + +Evidence: `evidence/badmatch_gate_located.txt`, `evidence/arm_sets_byte8.txt`. + +#### byte8 cannot be raised by any request except create + +Clean instrumentation (`harness/mame/xie_min.lua`, **one** breakpoint) and +corrected field offsets (`byte N = ptr + N*8`, since `ptr` is a bit address). +`byte8` was previously read at `ptr+8`, which is byte **1** — those numbers were +wrong and are superseded. + +Verified mapping from create word 9: + +``` +w9 = 0x000 0x100 0x200 0x300 0x400 +b8 = 0 1 2 3 4 +b9 = 1 1 1 3 1 (b9 = (b8==3) ? 3 : 1) +``` + +Sweeping every other implemented request against a `w9=0x100` (byte8=1) +resource: + +``` +slot 43 (len 10) BadValue b8 1 -> 1 +slot 44 (len 5) BadValue b8 1 -> 1 +slot 40 (len 4) BadValue b8 1 -> 1 +slot 33 (len 4) BadValue b8 1 -> 1 +slot 24 (len 4) REPLY b8 1 -> 1 +slot 19 (len 8) BadAccess b8 1 -> 1 +``` + +**No implemented request moves `byte8`.** Only create does, via word 9's high +byte. With the arm sweep (`v12 = 0..6 × v16 = 0..3`, 28 shapes) the measured +incompatibility stands: + +``` +byte8=1 -> arm OK, put = BadMatch (gate: 1 != 3) +byte8=3 -> arm ERR8 (all 28 shapes), put = BadAccess (unarmed) +``` + +So within the client-reachable request set, `byte8` cannot be raised to 3 while +keeping the resource arm-able. The import cannot reach the handoff, `src_base` +stays 0, and EXPORT has nothing to draw. Evidence: +`evidence/byte8_slot_sweep.txt`. + +**Harness note:** with several requests outstanding on one connection the reply +stream misaligns (arm/create replies are often not read back). That does not +affect these results — `byte8` and the slot-19 error come from independent +reads — but future runs should drain between requests or use one request per +connection. + +#### The wall in code: arm needs `byte8==1`, import needs `byte8==3` + +Found by bisecting slot 20's body with **generated** bit addresses +(`harness/mame/xie_min9.lua`, `bit = 0x3F200000 + file*8` — hand arithmetic had +produced several wrong addresses earlier), valid ids, no-reply model: + +``` +w9=0x100 v14=1 : JREQ_6AB82 -> TGT_6AC34 -> EXIT_6AFDC -> SILENT (success) +w9=0x100 v14=2 : JREQ_6AB82 -> TGT_6AC34 -> E8_2_6AC5C -> BadMatch +w9=0x300 v14=3 : JREQ_6AB82 -> TGT_6AC34 -> E8_4_6ACD4 -> BadMatch +w9=0x300 v14=1 : JREQ_6AB82 -> TGT_6AC34 -> E8_4_6ACD4 -> BadMatch +``` + +The discriminating check: + +``` +6ACBE MOVE *A11(0x40),A7,0x0 ; A7 := object->byte8 +6ACC2 DSJS A7,0x6ACD2 ; byte8==1 -> OK chain +... +6ACCA MOVE *A9(0x68),A7,0x0 ; request byte 13 (mode) +6ACCE SUBK 0x3,A7 +6ACD0 JRNE 0x6AD34 ; mode != 3 -> OK path +6ACD2 MOVK 0x8 ; else BadMatch +``` + +So: + +| request | requires | +|---|---| +| arm (slot 20) | `object->byte8 == 1` (`0x6ACBE`) | +| import (slot 19) | `object->byte8 == 3` (`0x6BAF4`) | + +and `evidence/byte8_slot_sweep.txt` shows **no request changes `byte8` except +create** (`word9>>8`). With the client-reachable request set, a resource cannot be +both arm-able and import-eligible — which is why every configuration ends in +`BadMatch` / `BadAccess` / `BadIDChoice`, `src_base` never becomes non-zero, and +EXPORT has nothing to draw. + +(The `v14` value is validated separately at `0x6AC5C`; `mode != 3` is required at +`0x6AD0`.) Evidence: `evidence/arm_requires_byte8_eq1.txt`. + +#### Closure: no request writes `byte8` + +A write watchpoint on the created resource's `byte8`, armed across a complete +cycle with valid ids and the no-reply model: + +``` +create -> silent (success) obj = 003FDC50 +watch installed at 003FDC90 byte8 read-back = 1 +arm1 -> silent (success) +put -> BadMatch +arm2 -> BadMatch +export -> silent (success) + +byte8 WRITE EVENTS AFTER CREATE: 0 +``` + +Nothing after create writes `byte8`. So the only route to `byte8 == 3` is +`create word9 = 0x300`, and such a resource cannot be armed; an unarmed +resource's import returns `BadAccess` without reaching the gate. + +**Conclusion, with evidence:** a `byte8` transition into the importable state is +not reachable from the client request set. The import cannot be driven, +`src_base` stays 0, and EXPORT has nothing to draw. This closes the last +request-level door in this investigation. + +Residual possibilities are all outside that set: an internal path the watch +never observed (nothing writes it in a normal cycle), an unimplemented minor, or +the real DEC 2.3 sequence differing entirely — which its documentation would +state. Evidence: `evidence/byte8_write_watch_closure.txt`. + +#### The three residual items, tested + +The previous closure was limited to one watchpoint on one resource; all three +residuals are now tested (`evidence/residual_items_tested.txt`): + +1. **Static search for internal byte-8 writers** across every disassembled XIE + handler. Exactly one candidate exists — slot 20 `0x6ABF6..0x6AC00` + (`*A11(0x40) |= request payload byte 16`) — and it is **dead code**: it is + guarded by `*A13(0x40) != 0` at `0x6AB82`, while `*A13(0x40)` is only + *assigned* later at `0x6AD92` from a freshly allocated params block. The + measured fired-path confirms every arm goes `0x6AB82 → 0x6AC34` and never + enters that block. +2. **Runtime watch on a `w9=0x300` resource** (the type the import wants) across + four arm attempts, all `BadMatch`: **0 write events**. +3. **Unimplemented minors** as an alternate import path: all 21 unassigned + minors × lengths 2,3,4,6,8,12 = 126 requests, **every one `BadRequest`**. + +So there is no executing internal writer, no runtime writer, and no second import +entry point. The `byte8` transition into the importable state is unreachable from +the client, `src_base` stays 0, and EXPORT has nothing to draw. + +#### Slot 43 decoded: a reporting request, not an image source + +Length is exactly 10 words. It reads two resource ids (payload words 0 and 1, +looked up through `0x7EA6FA0` at `0x65640`) plus two ROI fields (words 4 and 5), +falling back to the resource's own width/height at `*A13(0x1c0)+0x80/0xa0`. + +The "descriptor tables containing 3.0 / 438.0" are **arrays of IEEE doubles**, +not descriptors — `0x3F533740` reads `00 00 00 00 00 00 08 40` = 3.0, and each +`MOVI` points 8 bytes further into the same array. Each load is followed by two +`MOVE *A8+,*A14+` (one double) and a call into the **printf family** +(`0x7FC1CE6 / 0x7FC18F6 / 0x7FC1CDE`), the same helpers used by the export +timing print and by the logger at `0x7F638C2`. + +Tested live with valid ids and the no-reply model — **17 payload shapes**, +including doubles in every position, single-id and two-id forms, and ROI-shaped +values: **every one returned `BadValue`**. Its exact ROI preconditions were not +reconstructed, but its body is printf-dominated and nothing observed connects it +to `src_base` or to any image data plane. It is therefore not credible as the +image-source element. Evidence: `evidence/slot43_decoded.txt`. + +#### Direct watch on the `src_base` slot, and slots 15 / 22 + +The `src_base` slot itself (`rp+0x610`) was watched, with `rp` captured at the +export breakpoint (`0x1B296`, `A11 = rp`) — `rp = 00913330`, slot = `00913940`. + +``` +create/arm1/put/export#1 put BadMatch, export#1 BadMatch +slot15 [id,0] silent (success) +slot22 [id] silent (success) +slot15 [id,id] silent (success) +arm2, export#2 silent (success) + +rp+0x610 after export#1 = 00000000 +rp+0x610 after export#2 = 00000000 + +18 writes at 00913940; only XIE writer is pc=3F2D91F0 (file 0x1B23E, the known +`MOVE *A5(0x28),*A11(0x610)` copy) and it writes 0. The 0x55/0xB055/0x90E6 +values are heap-fill and allocator metadata. +``` + +Slots 15 and 22 are permissive (they accept `[id,0]`, `[id,id]`, `[id]`) but +neither produces a non-zero write to `src_base`. Also confirmed: export returns +`BadMatch` if `arm2` has not been issued, and is silent/success once it has — +consistent with the earlier arm2 gate. + +So the source image buffer is never produced, by any path watched. Evidence: +`evidence/srcbase_watch_and_slots15_22.txt`. + +#### Slot 43 excluded: it validates doubles and prints, it does not source images + +`BadValue` comes from a double comparison against its table: it loads a double +(`0x3F533740` = 3.0, `0x3F533780`, `0x3F533900`, … successive 8-byte entries) and +calls `0x7FC1CE6 / 0x7FC18F6 / 0x7FC1CDE`: + +``` +658B8 CALLA 0x07FC1CDE +658BE JREQ 0x658CA ; equal -> continue +658C0 MOVK 0x2,A7 ; else BadValue +``` + +Its one element-chain block copies each element's `+0x1a8` into a **frame-local +array** for printing (`659E2 *A11(0x140) = *A7(0x1a8)`, with `A11 = A13 + i*4`), +not into the resource. Every store goes to frame locals or the params block; it +never writes `resource+0x140`, never writes `rp+0x610`, and allocates no image +buffer. + +Empirically, with a write watch on the real `src_base` (`rp = 0091F090` → +`0091F6A0`), four slot-43 shapes all returned `BadValue` and the 64 watch events +were all `00000000` or `00000055` (allocator fill) from export's own copy +(`pc=3F2D91F0`) and allocator PCs — **no non-zero image pointer**. + +So slot 43 is a reporting/describe request and cannot be the source of the image. +This closes the last implemented slot whose acceptance condition was unresolved. +Evidence: `evidence/slot43_excluded.txt`. + +#### Slot 43: acceptance precondition still not satisfied (honest status) + +The table is little-endian doubles (TMS34010 is LE): `0x3F533780 = 3.0`, +`0x3F5337C0 = 871.0`, `0x3F533800 = 873.0`, `0x3F533840 = 217.0`, +`0x3F533880 = 219.0`. + +Logging the two frame locals pushed as the operand pair at the double-compare +sites (`0x656B0` = "CMP740", `0x658B8` = "CMP900"): + +``` +[id,0,0,0,...] BadValue CMP740 a0=00000000 a1=00000000 +[id,0,3.0hi,0,...] BadValue CMP740 a0=00000000 a1=00000000 +[id,0,0,3.0hi,0,...] BadValue CMP740 a0=FFF7D264 a1=BFE800FF +``` + +`CMP900` — the site that raises `BadValue` at `0x658C0` — **never fired**, so the +rejection happens *earlier* than the comparison I was chasing, and the doubles +are not read from the payload words tried. + +**Status of the slot-43 claim:** it is excluded on *code reading* (a per-element +reporting loop copying `element+0x1a8` into a frame-local array, then printf) and +on watched evidence that no slot-43 request produced a non-zero write to +`src_base` — **not** on a completed, accepted request. Its exact acceptance +precondition remains unknown. This is recorded rather than glossed: the +implemented surface is not fully exercised until that precondition is found. +Evidence: `evidence/slot43_compare_operands.txt`. + +#### The render driver itself returns 2 to slot 43 + +Instrumented slot-43 tail (9 breakpoints, generated addresses, valid ids, isolated +connection, create drained first): + +``` +T_LOOKUP_OK 0x65646 lookup returned 0 +T_RENDER_RET 0x65BFE a8 = 00000002 <-- the DRIVER returned 2 +T_JREQ 0x65C02 non-zero path +T_FREE 0x65C06 +(T_MERGE 0x65C46 did not fire) +``` + +So slot 43 calls `0x07E5B152` (file `0x1B152`, the render/export driver) and **that +call returns 2** — which is what the client sees as `BadValue`. Neither of slot +43's own `MOVK 0x2` sites is involved. + +The single `MOVK 0x2` in the driver's first 240 instructions (`0x1B360`) is an +*element type* write (`MOVB *A11,*A5(0x58)`), not an error code, so the 2 comes +from another exit of `0x1B152`. + +**Caveat recorded:** after `T_FREE` (`0x65C06`) the code falls through to `0x65C46`, +yet that breakpoint did not fire. Either it was dropped (despite only 9 armed) or +the free call does not return normally; I did not resolve which, so the tail path +after `0x65C06` is not fully established. + +What is established: the failure is inside the **render driver**, not in slot 43's +checks, not in the import lookup, and **not the `byte8` gate**. An accepted slot 43 +would drive the render path directly. Evidence: +`evidence/render_driver_returns_2.txt`. + +#### The manual (EK-V120I-IN-001) and the documented display path + +`docs/EK-V120I-IN-001_installing-DECimage-1200.txt` — Appendix C, Table C–1 — +gives the semantic model this project had been inferring: + +- supported requests: `INIT_SESSION`, `SET/QUERY_OP_DEFAULTS`, `TERM_SESSION`, + `CREATE_BY_VALUE`, `CREATE_BY_REFERENCE`, `DELETE_RESOURCE`, `QUERY_RESOURCE`, + `EXPORT`, `FREE_EXPORT`, `QUERY_EXPORT`, `SET/ABORT_TRANSPORT`, `PUT_TILE`, + `PUT_STREAM`, `SCALE`, `ROTATE`, `MIRROR`, `CROP`, `EXECUTE_PHOTOFLO`, + `ABORT_PHOTOFLO`, `BIND_PHOTOFLO`, `TAP_PHOTOFLO`, `SELECT/QUERY_EVENTS`; +- "Always use pipelines"; elements limited to `scale, crop, rotate, mirror, + export`, at most one of each, **must always end with export**, prefer that + order, max 15; +- **`XIEP_EXPORT` "Creates a new server PIXMAP resource object"**, and images are + displayed "by copying from a pixmap … using `XCopyArea` or `XCopyPlane`"; +- `SET_OP_DEFAULTS`: **"Bits/pixel parameter value must be 1"**; +- rotate only 0/90/180/270; width/height must be 0 or match the rotated source; + tap only on an empty pipeline; no DCT; no server→client transport; +- **errors**: "The client receives a Bad Request or **Bad Match or Bad Value** X + error … Do not invoke an XIE protocol request that is implemented, but + **violates its restricted use**." + +That last point reframes much of this investigation: `BadMatch`/`BadValue` are +documented, *expected* responses to a restriction violation (including "create +non-bitonal image objects"), not bugs — and `byte8` is most likely the +**bits/pixel** field, which must be 1. + +Implemented the documented display path (`evidence/export_query_copyarea.txt`): +`EXPORT` → `QUERY_EXPORT` (op 3/4 reply, 64×64 + pointers + resource id) → +`XCopyArea` → `GetImage`. The export context reply does **not** carry a usable +pixmap XID — its id-like field varies per run (`0x00920101`, `0x00380101`, +`0x00330101`, `0x00360101`) and looks like a heap pointer; `XCopyArea` rejects +each with `BadDrawable`. Window unchanged for solid-white and solid-black. diff --git a/xie/build.sh b/xie/build.sh new file mode 100755 index 0000000..8781718 --- /dev/null +++ b/xie/build.sh @@ -0,0 +1,41 @@ +#!/bin/sh +# Build XIElib and xieperf from the vendored X11R6.1 sources. +# +# The original imake build assumes a complete X11R6 tree. This script uses the +# host X11 headers/libraries instead (needs libX11 and libXmu development +# packages). Output: build/xieperf/xieperf +set -eu + +cd "$(dirname "$0")" +ROOT=$(pwd) +BUILD="$ROOT/build" + +CC=${CC:-gcc} +CFLAGS=${CFLAGS:--O2 -std=gnu89 -fcommon -w} + +rm -rf "$BUILD" +mkdir -p "$BUILD/include/X11/extensions" "$BUILD/xieperf" + +# XIElib.h installs as ; stage the headers in the +# layout the sources include them with. +cp xc/include/extensions/XIE.h \ + xc/include/extensions/XIEproto.h \ + xc/include/extensions/XIEprotost.h \ + xc/lib/XIE/XIElib.h \ + "$BUILD/include/X11/extensions/" + +echo "== XIElib" +for f in xc/lib/XIE/*.c; do + $CC $CFLAGS -I"$BUILD/include" -c "$f" -o "$BUILD/$(basename "${f%.c}").o" +done +ar rcs "$BUILD/libXIE.a" "$BUILD"/*.o + +echo "== xieperf" +for f in xc/programs/xieperf/*.c; do + $CC $CFLAGS -I"$BUILD/include" -Ixc/programs/xieperf \ + -c "$f" -o "$BUILD/xieperf/$(basename "${f%.c}").o" +done +$CC -o "$BUILD/xieperf/xieperf" "$BUILD"/xieperf/*.o "$BUILD/libXIE.a" \ + -lXmu -lX11 -lm + +echo "built: $BUILD/xieperf/xieperf" diff --git a/xie/build/abort.o b/xie/build/abort.o new file mode 100644 index 0000000..04dc74b Binary files /dev/null and b/xie/build/abort.o differ diff --git a/xie/build/await.o b/xie/build/await.o new file mode 100644 index 0000000..528e197 Binary files /dev/null and b/xie/build/await.o differ diff --git a/xie/build/clientdata.o b/xie/build/clientdata.o new file mode 100644 index 0000000..5a07399 Binary files /dev/null and b/xie/build/clientdata.o differ diff --git a/xie/build/colorlist.o b/xie/build/colorlist.o new file mode 100644 index 0000000..ac9caf9 Binary files /dev/null and b/xie/build/colorlist.o differ diff --git a/xie/build/conven.o b/xie/build/conven.o new file mode 100644 index 0000000..964c675 Binary files /dev/null and b/xie/build/conven.o differ diff --git a/xie/build/dec/MITMisc.h b/xie/build/dec/MITMisc.h new file mode 100644 index 0000000..8374c32 --- /dev/null +++ b/xie/build/dec/MITMisc.h @@ -0,0 +1,88 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/************************************************************ +Copyright 1989 by The Massachusetts Institute of Technology + +Permission to use, copy, modify, and distribute this +software and its documentation for any purpose and without +fee is hereby granted, provided that the above copyright +no- tice appear in all copies and that both that copyright +no- tice and this permission notice appear in supporting +docu- mentation, and that the name of MIT not be used in +advertising or publicity pertaining to distribution of the +software without specific prior written permission. +M.I.T. makes no representation about the suitability of +this software for any purpose. It is provided "as is" +without any express or implied warranty. + +********************************************************/ + +/* RANDOM CRUFT! THIS HAS NO OFFICIAL X CONSORTIUM BLESSING */ + +/* $XConsortium: MITMisc.h,v 1.4 91/07/12 10:06:43 rws Exp $ */ + +#ifndef _XMITMISC_H_ +#define _XMITMISC_H_ + +#include + +#define X_MITSetBugMode 0 +#define X_MITGetBugMode 1 + +#define MITMiscNumberEvents 0 + +#define MITMiscNumberErrors 0 + +#ifndef _MITMISC_SERVER_ + +_XFUNCPROTOBEGIN + +Bool XMITMiscQueryExtension( +#if NeedFunctionPrototypes + Display* /* dpy */, + int* /* event_basep */, + int* /* error_basep */ +#endif +); + +Status XMITMiscSetBugMode( +#if NeedFunctionPrototypes + Display* /* dpy */, + Bool /* onOff */ +#endif +); + +Bool XMITMiscGetBugMode( +#if NeedFunctionPrototypes + Display* /* dpy */ +#endif +); + +_XFUNCPROTOEND + +#endif + +#endif diff --git a/xie/build/dec/X.h b/xie/build/dec/X.h new file mode 100644 index 0000000..4df7d22 --- /dev/null +++ b/xie/build/dec/X.h @@ -0,0 +1,717 @@ +/* Definitions for the X window system likely to be used by applications */ + +#ifndef X_H +#define X_H + +/*********************************************************** + +Copyright 1987, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + + +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +#define X_PROTOCOL 11 /* current protocol version */ +#define X_PROTOCOL_REVISION 0 /* current minor version */ + +/* Resources */ + +/* + * _XSERVER64 must ONLY be defined when compiling X server sources on + * systems where unsigned long is not 32 bits, must NOT be used in + * client or library code. + */ +#ifndef _XSERVER64 +# ifndef _XTYPEDEF_XID +# define _XTYPEDEF_XID +typedef unsigned long XID; +# endif +# ifndef _XTYPEDEF_MASK +# define _XTYPEDEF_MASK +typedef unsigned long Mask; +# endif +# ifndef _XTYPEDEF_ATOM +# define _XTYPEDEF_ATOM +typedef unsigned long Atom; /* Also in Xdefs.h */ +# endif +typedef unsigned long VisualID; +typedef unsigned long Time; +#else +# include +# ifndef _XTYPEDEF_XID +# define _XTYPEDEF_XID +typedef CARD32 XID; +# endif +# ifndef _XTYPEDEF_MASK +# define _XTYPEDEF_MASK +typedef CARD32 Mask; +# endif +# ifndef _XTYPEDEF_ATOM +# define _XTYPEDEF_ATOM +typedef CARD32 Atom; +# endif +typedef CARD32 VisualID; +typedef CARD32 Time; +#endif + +typedef XID Window; +typedef XID Drawable; +#ifndef _XTYPEDEF_FONT +# define _XTYPEDEF_FONT +typedef XID Font; +#endif +typedef XID Pixmap; +typedef XID Cursor; +typedef XID Colormap; +typedef XID GContext; +typedef XID KeySym; + +typedef unsigned char KeyCode; + +/***************************************************************** + * RESERVED RESOURCE AND CONSTANT DEFINITIONS + *****************************************************************/ + +#ifndef None +#define None 0L /* universal null resource or null atom */ +#endif + +#define ParentRelative 1L /* background pixmap in CreateWindow + and ChangeWindowAttributes */ + +#define CopyFromParent 0L /* border pixmap in CreateWindow + and ChangeWindowAttributes + special VisualID and special window + class passed to CreateWindow */ + +#define PointerWindow 0L /* destination window in SendEvent */ +#define InputFocus 1L /* destination window in SendEvent */ + +#define PointerRoot 1L /* focus window in SetInputFocus */ + +#define AnyPropertyType 0L /* special Atom, passed to GetProperty */ + +#define AnyKey 0L /* special Key Code, passed to GrabKey */ + +#define AnyButton 0L /* special Button Code, passed to GrabButton */ + +#define AllTemporary 0L /* special Resource ID passed to KillClient */ + +#define CurrentTime 0L /* special Time */ + +#define NoSymbol 0L /* special KeySym */ + +/***************************************************************** + * EVENT DEFINITIONS + *****************************************************************/ + +/* Input Event Masks. Used as event-mask window attribute and as arguments + to Grab requests. Not to be confused with event names. */ + +#define NoEventMask 0L +#define KeyPressMask (1L<<0) +#define KeyReleaseMask (1L<<1) +#define ButtonPressMask (1L<<2) +#define ButtonReleaseMask (1L<<3) +#define EnterWindowMask (1L<<4) +#define LeaveWindowMask (1L<<5) +#define PointerMotionMask (1L<<6) +#define PointerMotionHintMask (1L<<7) +#define Button1MotionMask (1L<<8) +#define Button2MotionMask (1L<<9) +#define Button3MotionMask (1L<<10) +#define Button4MotionMask (1L<<11) +#define Button5MotionMask (1L<<12) +#define ButtonMotionMask (1L<<13) +#define KeymapStateMask (1L<<14) +#define ExposureMask (1L<<15) +#define VisibilityChangeMask (1L<<16) +#define StructureNotifyMask (1L<<17) +#define ResizeRedirectMask (1L<<18) +#define SubstructureNotifyMask (1L<<19) +#define SubstructureRedirectMask (1L<<20) +#define FocusChangeMask (1L<<21) +#define PropertyChangeMask (1L<<22) +#define ColormapChangeMask (1L<<23) +#define OwnerGrabButtonMask (1L<<24) + +/* Event names. Used in "type" field in XEvent structures. Not to be +confused with event masks above. They start from 2 because 0 and 1 +are reserved in the protocol for errors and replies. */ + +#define KeyPress 2 +#define KeyRelease 3 +#define ButtonPress 4 +#define ButtonRelease 5 +#define MotionNotify 6 +#define EnterNotify 7 +#define LeaveNotify 8 +#define FocusIn 9 +#define FocusOut 10 +#define KeymapNotify 11 +#define Expose 12 +#define GraphicsExpose 13 +#define NoExpose 14 +#define VisibilityNotify 15 +#define CreateNotify 16 +#define DestroyNotify 17 +#define UnmapNotify 18 +#define MapNotify 19 +#define MapRequest 20 +#define ReparentNotify 21 +#define ConfigureNotify 22 +#define ConfigureRequest 23 +#define GravityNotify 24 +#define ResizeRequest 25 +#define CirculateNotify 26 +#define CirculateRequest 27 +#define PropertyNotify 28 +#define SelectionClear 29 +#define SelectionRequest 30 +#define SelectionNotify 31 +#define ColormapNotify 32 +#define ClientMessage 33 +#define MappingNotify 34 +#define GenericEvent 35 +#define LASTEvent 36 /* must be bigger than any event # */ + + +/* Key masks. Used as modifiers to GrabButton and GrabKey, results of QueryPointer, + state in various key-, mouse-, and button-related events. */ + +#define ShiftMask (1<<0) +#define LockMask (1<<1) +#define ControlMask (1<<2) +#define Mod1Mask (1<<3) +#define Mod2Mask (1<<4) +#define Mod3Mask (1<<5) +#define Mod4Mask (1<<6) +#define Mod5Mask (1<<7) + +/* modifier names. Used to build a SetModifierMapping request or + to read a GetModifierMapping request. These correspond to the + masks defined above. */ +#define ShiftMapIndex 0 +#define LockMapIndex 1 +#define ControlMapIndex 2 +#define Mod1MapIndex 3 +#define Mod2MapIndex 4 +#define Mod3MapIndex 5 +#define Mod4MapIndex 6 +#define Mod5MapIndex 7 + + +/* button masks. Used in same manner as Key masks above. Not to be confused + with button names below. */ + +#define Button1Mask (1<<8) +#define Button2Mask (1<<9) +#define Button3Mask (1<<10) +#define Button4Mask (1<<11) +#define Button5Mask (1<<12) + +#define AnyModifier (1<<15) /* used in GrabButton, GrabKey */ + + +/* button names. Used as arguments to GrabButton and as detail in ButtonPress + and ButtonRelease events. Not to be confused with button masks above. + Note that 0 is already defined above as "AnyButton". */ + +#define Button1 1 +#define Button2 2 +#define Button3 3 +#define Button4 4 +#define Button5 5 + +/* Notify modes */ + +#define NotifyNormal 0 +#define NotifyGrab 1 +#define NotifyUngrab 2 +#define NotifyWhileGrabbed 3 + +#define NotifyHint 1 /* for MotionNotify events */ + +/* Notify detail */ + +#define NotifyAncestor 0 +#define NotifyVirtual 1 +#define NotifyInferior 2 +#define NotifyNonlinear 3 +#define NotifyNonlinearVirtual 4 +#define NotifyPointer 5 +#define NotifyPointerRoot 6 +#define NotifyDetailNone 7 + +/* Visibility notify */ + +#define VisibilityUnobscured 0 +#define VisibilityPartiallyObscured 1 +#define VisibilityFullyObscured 2 + +/* Circulation request */ + +#define PlaceOnTop 0 +#define PlaceOnBottom 1 + +/* protocol families */ + +#define FamilyInternet 0 /* IPv4 */ +#define FamilyDECnet 1 +#define FamilyChaos 2 +#define FamilyInternet6 6 /* IPv6 */ + +/* authentication families not tied to a specific protocol */ +#define FamilyServerInterpreted 5 + +/* Property notification */ + +#define PropertyNewValue 0 +#define PropertyDelete 1 + +/* Color Map notification */ + +#define ColormapUninstalled 0 +#define ColormapInstalled 1 + +/* GrabPointer, GrabButton, GrabKeyboard, GrabKey Modes */ + +#define GrabModeSync 0 +#define GrabModeAsync 1 + +/* GrabPointer, GrabKeyboard reply status */ + +#define GrabSuccess 0 +#define AlreadyGrabbed 1 +#define GrabInvalidTime 2 +#define GrabNotViewable 3 +#define GrabFrozen 4 + +/* AllowEvents modes */ + +#define AsyncPointer 0 +#define SyncPointer 1 +#define ReplayPointer 2 +#define AsyncKeyboard 3 +#define SyncKeyboard 4 +#define ReplayKeyboard 5 +#define AsyncBoth 6 +#define SyncBoth 7 + +/* Used in SetInputFocus, GetInputFocus */ + +#define RevertToNone (int)None +#define RevertToPointerRoot (int)PointerRoot +#define RevertToParent 2 + +/***************************************************************** + * ERROR CODES + *****************************************************************/ + +#define Success 0 /* everything's okay */ +#define BadRequest 1 /* bad request code */ +#define BadValue 2 /* int parameter out of range */ +#define BadWindow 3 /* parameter not a Window */ +#define BadPixmap 4 /* parameter not a Pixmap */ +#define BadAtom 5 /* parameter not an Atom */ +#define BadCursor 6 /* parameter not a Cursor */ +#define BadFont 7 /* parameter not a Font */ +#define BadMatch 8 /* parameter mismatch */ +#define BadDrawable 9 /* parameter not a Pixmap or Window */ +#define BadAccess 10 /* depending on context: + - key/button already grabbed + - attempt to free an illegal + cmap entry + - attempt to store into a read-only + color map entry. + - attempt to modify the access control + list from other than the local host. + */ +#define BadAlloc 11 /* insufficient resources */ +#define BadColor 12 /* no such colormap */ +#define BadGC 13 /* parameter not a GC */ +#define BadIDChoice 14 /* choice not in range or already used */ +#define BadName 15 /* font or color name doesn't exist */ +#define BadLength 16 /* Request length incorrect */ +#define BadImplementation 17 /* server is defective */ + +#define FirstExtensionError 128 +#define LastExtensionError 255 + +/***************************************************************** + * WINDOW DEFINITIONS + *****************************************************************/ + +/* Window classes used by CreateWindow */ +/* Note that CopyFromParent is already defined as 0 above */ + +#define InputOutput 1 +#define InputOnly 2 + +/* Window attributes for CreateWindow and ChangeWindowAttributes */ + +#define CWBackPixmap (1L<<0) +#define CWBackPixel (1L<<1) +#define CWBorderPixmap (1L<<2) +#define CWBorderPixel (1L<<3) +#define CWBitGravity (1L<<4) +#define CWWinGravity (1L<<5) +#define CWBackingStore (1L<<6) +#define CWBackingPlanes (1L<<7) +#define CWBackingPixel (1L<<8) +#define CWOverrideRedirect (1L<<9) +#define CWSaveUnder (1L<<10) +#define CWEventMask (1L<<11) +#define CWDontPropagate (1L<<12) +#define CWColormap (1L<<13) +#define CWCursor (1L<<14) + +/* ConfigureWindow structure */ + +#define CWX (1<<0) +#define CWY (1<<1) +#define CWWidth (1<<2) +#define CWHeight (1<<3) +#define CWBorderWidth (1<<4) +#define CWSibling (1<<5) +#define CWStackMode (1<<6) + + +/* Bit Gravity */ + +#define ForgetGravity 0 +#define NorthWestGravity 1 +#define NorthGravity 2 +#define NorthEastGravity 3 +#define WestGravity 4 +#define CenterGravity 5 +#define EastGravity 6 +#define SouthWestGravity 7 +#define SouthGravity 8 +#define SouthEastGravity 9 +#define StaticGravity 10 + +/* Window gravity + bit gravity above */ + +#define UnmapGravity 0 + +/* Used in CreateWindow for backing-store hint */ + +#define NotUseful 0 +#define WhenMapped 1 +#define Always 2 + +/* Used in GetWindowAttributes reply */ + +#define IsUnmapped 0 +#define IsUnviewable 1 +#define IsViewable 2 + +/* Used in ChangeSaveSet */ + +#define SetModeInsert 0 +#define SetModeDelete 1 + +/* Used in ChangeCloseDownMode */ + +#define DestroyAll 0 +#define RetainPermanent 1 +#define RetainTemporary 2 + +/* Window stacking method (in configureWindow) */ + +#define Above 0 +#define Below 1 +#define TopIf 2 +#define BottomIf 3 +#define Opposite 4 + +/* Circulation direction */ + +#define RaiseLowest 0 +#define LowerHighest 1 + +/* Property modes */ + +#define PropModeReplace 0 +#define PropModePrepend 1 +#define PropModeAppend 2 + +/***************************************************************** + * GRAPHICS DEFINITIONS + *****************************************************************/ + +/* graphics functions, as in GC.alu */ + +#define GXclear 0x0 /* 0 */ +#define GXand 0x1 /* src AND dst */ +#define GXandReverse 0x2 /* src AND NOT dst */ +#define GXcopy 0x3 /* src */ +#define GXandInverted 0x4 /* NOT src AND dst */ +#define GXnoop 0x5 /* dst */ +#define GXxor 0x6 /* src XOR dst */ +#define GXor 0x7 /* src OR dst */ +#define GXnor 0x8 /* NOT src AND NOT dst */ +#define GXequiv 0x9 /* NOT src XOR dst */ +#define GXinvert 0xa /* NOT dst */ +#define GXorReverse 0xb /* src OR NOT dst */ +#define GXcopyInverted 0xc /* NOT src */ +#define GXorInverted 0xd /* NOT src OR dst */ +#define GXnand 0xe /* NOT src OR NOT dst */ +#define GXset 0xf /* 1 */ + +/* LineStyle */ + +#define LineSolid 0 +#define LineOnOffDash 1 +#define LineDoubleDash 2 + +/* capStyle */ + +#define CapNotLast 0 +#define CapButt 1 +#define CapRound 2 +#define CapProjecting 3 + +/* joinStyle */ + +#define JoinMiter 0 +#define JoinRound 1 +#define JoinBevel 2 + +/* fillStyle */ + +#define FillSolid 0 +#define FillTiled 1 +#define FillStippled 2 +#define FillOpaqueStippled 3 + +/* fillRule */ + +#define EvenOddRule 0 +#define WindingRule 1 + +/* subwindow mode */ + +#define ClipByChildren 0 +#define IncludeInferiors 1 + +/* SetClipRectangles ordering */ + +#define Unsorted 0 +#define YSorted 1 +#define YXSorted 2 +#define YXBanded 3 + +/* CoordinateMode for drawing routines */ + +#define CoordModeOrigin 0 /* relative to the origin */ +#define CoordModePrevious 1 /* relative to previous point */ + +/* Polygon shapes */ + +#define Complex 0 /* paths may intersect */ +#define Nonconvex 1 /* no paths intersect, but not convex */ +#define Convex 2 /* wholly convex */ + +/* Arc modes for PolyFillArc */ + +#define ArcChord 0 /* join endpoints of arc */ +#define ArcPieSlice 1 /* join endpoints to center of arc */ + +/* GC components: masks used in CreateGC, CopyGC, ChangeGC, OR'ed into + GC.stateChanges */ + +#define GCFunction (1L<<0) +#define GCPlaneMask (1L<<1) +#define GCForeground (1L<<2) +#define GCBackground (1L<<3) +#define GCLineWidth (1L<<4) +#define GCLineStyle (1L<<5) +#define GCCapStyle (1L<<6) +#define GCJoinStyle (1L<<7) +#define GCFillStyle (1L<<8) +#define GCFillRule (1L<<9) +#define GCTile (1L<<10) +#define GCStipple (1L<<11) +#define GCTileStipXOrigin (1L<<12) +#define GCTileStipYOrigin (1L<<13) +#define GCFont (1L<<14) +#define GCSubwindowMode (1L<<15) +#define GCGraphicsExposures (1L<<16) +#define GCClipXOrigin (1L<<17) +#define GCClipYOrigin (1L<<18) +#define GCClipMask (1L<<19) +#define GCDashOffset (1L<<20) +#define GCDashList (1L<<21) +#define GCArcMode (1L<<22) + +#define GCLastBit 22 +/***************************************************************** + * FONTS + *****************************************************************/ + +/* used in QueryFont -- draw direction */ + +#define FontLeftToRight 0 +#define FontRightToLeft 1 + +#define FontChange 255 + +/***************************************************************** + * IMAGING + *****************************************************************/ + +/* ImageFormat -- PutImage, GetImage */ + +#define XYBitmap 0 /* depth 1, XYFormat */ +#define XYPixmap 1 /* depth == drawable depth */ +#define ZPixmap 2 /* depth == drawable depth */ + +/***************************************************************** + * COLOR MAP STUFF + *****************************************************************/ + +/* For CreateColormap */ + +#define AllocNone 0 /* create map with no entries */ +#define AllocAll 1 /* allocate entire map writeable */ + + +/* Flags used in StoreNamedColor, StoreColors */ + +#define DoRed (1<<0) +#define DoGreen (1<<1) +#define DoBlue (1<<2) + +/***************************************************************** + * CURSOR STUFF + *****************************************************************/ + +/* QueryBestSize Class */ + +#define CursorShape 0 /* largest size that can be displayed */ +#define TileShape 1 /* size tiled fastest */ +#define StippleShape 2 /* size stippled fastest */ + +/***************************************************************** + * KEYBOARD/POINTER STUFF + *****************************************************************/ + +#define AutoRepeatModeOff 0 +#define AutoRepeatModeOn 1 +#define AutoRepeatModeDefault 2 + +#define LedModeOff 0 +#define LedModeOn 1 + +/* masks for ChangeKeyboardControl */ + +#define KBKeyClickPercent (1L<<0) +#define KBBellPercent (1L<<1) +#define KBBellPitch (1L<<2) +#define KBBellDuration (1L<<3) +#define KBLed (1L<<4) +#define KBLedMode (1L<<5) +#define KBKey (1L<<6) +#define KBAutoRepeatMode (1L<<7) + +#define MappingSuccess 0 +#define MappingBusy 1 +#define MappingFailed 2 + +#define MappingModifier 0 +#define MappingKeyboard 1 +#define MappingPointer 2 + +/***************************************************************** + * SCREEN SAVER STUFF + *****************************************************************/ + +#define DontPreferBlanking 0 +#define PreferBlanking 1 +#define DefaultBlanking 2 + +#define DisableScreenSaver 0 +#define DisableScreenInterval 0 + +#define DontAllowExposures 0 +#define AllowExposures 1 +#define DefaultExposures 2 + +/* for ForceScreenSaver */ + +#define ScreenSaverReset 0 +#define ScreenSaverActive 1 + +/***************************************************************** + * HOSTS AND CONNECTIONS + *****************************************************************/ + +/* for ChangeHosts */ + +#define HostInsert 0 +#define HostDelete 1 + +/* for ChangeAccessControl */ + +#define EnableAccess 1 +#define DisableAccess 0 + +/* Display classes used in opening the connection + * Note that the statically allocated ones are even numbered and the + * dynamically changeable ones are odd numbered */ + +#define StaticGray 0 +#define GrayScale 1 +#define StaticColor 2 +#define PseudoColor 3 +#define TrueColor 4 +#define DirectColor 5 + + +/* Byte order used in imageByteOrder and bitmapBitOrder */ + +#define LSBFirst 0 +#define MSBFirst 1 + +#endif /* X_H */ diff --git a/xie/build/dec/X11/extensions/XieAppl.h b/xie/build/dec/X11/extensions/XieAppl.h new file mode 100644 index 0000000..1908e40 --- /dev/null +++ b/xie/build/dec/X11/extensions/XieAppl.h @@ -0,0 +1,295 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/******************************************************************************* +** Copyright 1989-1991 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Image Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** The Xie module contains definitions used by all of the XIE layers +** -- from the applications level through the XIE server levels. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Richard J. Piccolo +** Robert NC Shelley +** +** CREATION DATE: +** +** April 20, 1989 +** +************************************************************************/ + + /* + ** Symbol XIEAPPL allows XieAppl.h to be included multiple times. + */ +#ifndef XIEAPPL +#define XIEAPPL /* The "endif" MUST be the last line of this file. */ + +/***************************************************************************** +** Constants +*****************************************************************************/ + /* + ** X Image Extension name string + */ +#define XieS_Name "Xie" + + /* + ** Number of supported Events and Errors + */ +#define XieK_NumErrors 0 +#define XieK_NumEvents 3 + /* + ** Xie Event constants + */ +#define XieK_ComputationEvent 0 +#define XieK_PhotofloEvent 1 +#define XieK_DisplayEvent 2 + /* + ** Xie Event masks + */ +#define XieM_ComputationEvent (1< +#else +#include +#endif +#endif /* XIEAPPL */ + +/* +** MACRO definitions +*/ + /* + ** Return the minimum number of bits required to contain the specified + ** number of levels. Levels == 0 indicates unconstrained data of type + ** float. <<<< remember to include math.h >>>> + */ +#define BitsFromLevels_(levels) \ + ((levels) > 2 ? ((int)(ceil(log10((double)levels)/log10(2.0)))) : \ + (levels) > 0 ? 1 : sizeof(float) * 8) + /* + ** Determine if a value is a valid pointer or an error code. + ** <<<< remember to include X.h >>>> + */ +#ifdef BadImplementation +#define IsPointer_(ptr) (((unsigned long)(ptr)) > BadImplementation) +#endif + /* + ** Convenience macros for accessing generic UdpPtr fields. + */ +#define upPxlLen_(udp) ((udp)->UdpW_PixelLength) +#define upDType_(udp) ((udp)->UdpB_DType) +#define upClass_(udp) ((udp)->UdpB_Class) +#define upBase_(udp) ((udp)->UdpA_Base) +#define upArSize_(udp) ((udp)->UdpL_ArSize) +#define upPxlStr_(udp) ((udp)->UdpL_PxlStride) +#define upScnStr_(udp) ((udp)->UdpL_ScnStride) +#define upX1_(udp) ((udp)->UdpL_X1) +#define upX2_(udp) ((udp)->UdpL_X2) +#define upY1_(udp) ((udp)->UdpL_Y1) +#define upY2_(udp) ((udp)->UdpL_Y2) +#define upWidth_(udp) ((udp)->UdpL_PxlPerScn) +#define upHeight_(udp) ((udp)->UdpL_ScnCnt) +#define upPos_(udp) ((udp)->UdpL_Pos) +#define upCmpIdx_(udp) ((udp)->UdpL_CompIdx) +#define upLvl_(udp) ((udp)->UdpL_Levels) + /* + ** Convenience macros for accessing generic UdpRec fields. + */ +#define urPxlLen_(udp) ((udp).UdpW_PixelLength) +#define urDType_(udp) ((udp).UdpB_DType) +#define urClass_(udp) ((udp).UdpB_Class) +#define urBase_(udp) ((udp).UdpA_Base) +#define urArSize_(udp) ((udp).UdpL_ArSize) +#define urPxlStr_(udp) ((udp).UdpL_PxlStride) +#define urScnStr_(udp) ((udp).UdpL_ScnStride) +#define urX1_(udp) ((udp).UdpL_X1) +#define urX2_(udp) ((udp).UdpL_X2) +#define urY1_(udp) ((udp).UdpL_Y1) +#define urY2_(udp) ((udp).UdpL_Y2) +#define urWidth_(udp) ((udp).UdpL_PxlPerScn) +#define urHeight_(udp) ((udp).UdpL_ScnCnt) +#define urPos_(udp) ((udp).UdpL_Pos) +#define urCmpIdx_(udp) ((udp).UdpL_CompIdx) +#define urLvl_(udp) ((udp).UdpL_Levels) + + /* + ** The _MD forms access memory in machine-dependant (bigendian or + ** littleendian) format. The other forms access memory in + ** image format, which is always little endian. + */ +#ifdef vax +#define READ32_(address) \ + (*((int *)(address))) +#define READ32_MD READ32_ +#else + /* + ** For machine architectures that can't access longwords + ** on non-longword aligned boundaries. + ** The (unsigned int) casts seem redundant, but they are needed + ** to make the ULTRIX/RISC compiler happy. + */ +#define READ32_(address) \ + ((unsigned int) *((unsigned char *)(address)) + \ + ((unsigned int) *(((unsigned char *)(address))+1)<< 8) + \ + ((unsigned int) *(((unsigned char *)(address))+2)<<16) + \ + ((unsigned int) *(((unsigned char *)(address))+3)<<24)) +#endif + +#ifdef BIGENDIAN +#define READ32_MD(address) \ + (*(((unsigned char *)(address))+3) + \ + (*(((unsigned char *)(address))+2)<< 8) + \ + (*(((unsigned char *)(address))+1)<<16) + \ + (* ((unsigned char *)(address)) <<24)) +#else +#define READ32_MD READ32_ +#endif + +#define GET_VALUE_(base,offset,mask) \ + (READ32_((base)+((offset)>>3))>>((offset)&7)&(mask)) +#define GET_VALUE_MD(base,offset,mask) \ + (READ32_MD((base)+((offset)>>3))>>((offset)&7)&(mask)) + +#ifdef vax +#define WRITE32_(address,value) \ + (*((int *)(address)) = (int)(value)) +#define WRITE32_MD WRITE32_ +#else +#define WRITE32_(address,value) \ + ((* ((unsigned char *)(address)) = ((int)(value)) &0xff), \ + (*(((unsigned char *)(address))+1) = (((int)(value))>> 8)&0xff), \ + (*(((unsigned char *)(address))+2) = (((int)(value))>>16)&0xff), \ + (*(((unsigned char *)(address))+3) = (((int)(value))>>24)&0xff)) +#ifdef BIGENDIAN +#define WRITE32_MD(address,value) \ + ((*(((unsigned char *)(address))+3) = ((int)(value)) &0xff), \ + (*(((unsigned char *)(address))+2) = (((int)(value))>> 8)&0xff), \ + (*(((unsigned char *)(address))+1) = (((int)(value))>>16)&0xff), \ + (* ((unsigned char *)(address)) = (((int)(value))>>24)&0xff)) +#else +#define WRITE32_MD WRITE32_ +#endif +#endif + +#ifdef vax +#define XOR_WRITE32_(address,value) \ + (*((int *)(address)) ^= (int)(value)) +#define XOR_WRITE32_MD XOR_WRITE32_ +#else +#define XOR_WRITE32_(address,value) \ + ((* ((unsigned char *)(address)) ^= ((int)(value)) &0xff), \ + (*(((unsigned char *)(address))+1) ^= (((int)(value))>> 8)&0xff), \ + (*(((unsigned char *)(address))+2) ^= (((int)(value))>>16)&0xff), \ + (*(((unsigned char *)(address))+3) ^= (((int)(value))>>24)&0xff)) +#ifdef BIGENDIAN +#define XOR_WRITE32_MD(address,value) \ + ((*(((unsigned char *)(address))+3) ^= ((int)(value)) &0xff), \ + (*(((unsigned char *)(address))+2) ^= (((int)(value))>> 8)&0xff), \ + (*(((unsigned char *)(address))+1) ^= (((int)(value))>>16)&0xff), \ + (*(((unsigned char *)(address)) ^= (((int)(value))>>24)&0xff)) +#else +#define XOR_WRITE32_MD XOR_WRITE32_ +#endif +#endif + +#define PUT_VALUE_(base,offset,value,mask) \ + (WRITE32_((base)+((offset)>>3), \ + READ32_((base)+((offset)>>3)) & ~((mask)<<((offset)&7)) \ + | (((mask)&(value))<<((offset)&0x7)))) + +#define PUT_VALUE_MD(base,offset,value,mask) \ + (WRITE32_MD((base)+((offset)>>3), \ + READ32_MD((base)+((offset)>>3)) & ~((mask)<<((offset)&7)) \ + | (((mask)&(value))<<((offset)&0x7)))) + + + /* + ** Degrees to radians conversion factor -- with inverted Y axis. + */ +#define RADIANS_PER_DEGREE -0.0174532925199432959 + /* + ** These symbols define valid UdpRec data type and class combinations. + */ +#define XieK_UBAVU 0 /* unaligned bit array */ +#define XieK_UBAV 1 /* unaligned bit array that is aligned ?? */ +#define XieK_UBSVU 2 /* unaligned bit stream */ +#define XieK_UBSV 3 /* unaligned bit stream that is aligned ?? */ +#define XieK_CLCL 4 /* change list */ +#define XieK_ABU 5 /* aligned byte array */ +#define XieK_AF 6 /* aligned float array */ +#define XieK_AWU 7 /* aligned word array */ +/* Not yet implemented +#define XieK_ALU 8 +*/ +#define XieK_DATA_TYPE_COUNT 8 + + /* + ** Defs for DDX table entry points + */ +#ifndef externalref +#if (defined(VMS) && defined(VAXC)) +#define externalref globalref +#else +#define externalref extern +#endif +#endif + + /* + ** Typedefs + */ +typedef unsigned long card32; +typedef unsigned long (*Fcard32)(); /* Used in DDX dispatch table */ + + /* + ** Data structures for passing Template IDC (kernel) data to DDX + ** routines. + */ +typedef struct { + float value; /* A template value */ + long int increment; /* Number of kernel elements skipped + * between previous and this element, + * plus 1. Zero marks end of row */ +} TmpDatEntryRec, *TmpDatEntryPtr; + +typedef struct { + long int center_x; /* Template center X coordinate */ + long int center_y; /* Template center Y coordinate */ + long int x_count; /* Template x dimension */ + long int y_count; /* Template y dimension */ + TmpDatEntryPtr array; /* Pointer to the template data + * records */ +} TmpDatRec, *TmpDatPtr; + +/***************************************************************************** +** +** Xie Ddx Index - +** +** FUNCTIONAL DESCRIPTION: +** +** The following symbols define the indices into the dispatch table +** used to call "atomic" DDX functions. These functions include both +** processing routines for the protocol functions and DDX support +** routines. +** +** WARNING: The indices here AND the order of the XieDdxProc table +** in SmiDdx.c MUST match. +** +*****************************************************************************/ + /* + ** Protocol processing routines + */ +#define D_dxArea 0 /* Protocol functions */ +#define D_dxStatsArea 1 +#define D_dxArith 2 +#define D_dxHistogram 3 +#define D_dxChromeCom 4 +#define D_dxChromeSep 5 +#define D_dxCompare 6 +#define D_dxConstrain 7 +#define D_dxCrop 8 +#define D_dxDither 9 +#define D_dxFill 10 +#define D_dxLogical 11 +#define D_dxLuminance 12 +#define D_dxMatchHistogram 13 +#define D_dxMath 14 +#define D_dxMirror 15 +#define D_dxPoint 16 +#define D_dxStatsPoint 17 +#define D_dxRotate 18 +#define D_dxScale 19 +#define D_dxTranslate 20 +#define D_dxRmOwnData 21 + /* 21..32 -- was Compression handlers */ + /* + ** DDX specific function indices + */ +#define D_dxInit 33 /* DDX Init routine */ +#define D_dxReset 34 /* " Reset */ +#define D_dxOptimizePipe 35 /* " Pipeline optimizer */ +#define D_dxConvert 36 /* Udp support routines */ +#define D_dxCopy 37 +#define D_dxGetTyp 38 +#define D_dxCopyBits 39 +#define D_dxResolveUdp 40 +#define D_dxCalloc 41 /* Memory mgt routines */ +#define D_dxCallocBits 42 +#define D_dxCfree 43 +#define D_dxFree 44 +#define D_dxFreeBits 45 +#define D_dxMalloc 46 +#define D_dxMallocBits 47 +#define D_dxRealloc 48 +#define D_dxReallocBits 49 +#define D_dxCreatePipeline 50 /* Pipeline routines */ +#define D_dxDestroyPipeline 51 +#define D_dxPipeHasYielded 52 /* was D_dxExecutePipeline */ +#define D_dxInitiatePipeline 53 +#define D_dxResumePipeline 54 +#define D_dxFlushPipeline 55 +#define D_dxAbortPipeline 56 +#define D_dxRmAllocData 57 /* Pipe resource mgr routines */ +#define D_dxRmAllocDataDesc 58 +#define D_dxRmAllocPermDesc 59 +#define D_dxRmAllocRefDesc 60 +#define D_dxRmBestDType 61 +#define D_dxRmCreateDrain 62 +#define D_dxRmCreateSink 63 +#define D_dxRmDeallocData 64 +#define D_dxRmDeallocDataDesc 65 +#define D_dxRmDestroyDrain 66 +#define D_dxRmDestroySink 67 +#define D_dxRmGetData 68 +#define D_dxRmGetDType 69 +#define D_dxRmGetMaxQuantum 70 +#define D_dxRmGetQuantum 71 +#define D_dxRmHasQuantum 72 +#define D_dxRmInitializePort 73 +#define D_dxRmMergeBuffers 75 +#define D_dxRmObtainQuantum 76 +#define D_dxRmPutData 77 +#define D_dxRmSetDType 78 +#define D_dxRmSetQuantum 79 +#define D_dxRmSplitBuffers 80 +#define D_dxSchedProcessComplete 81 /* Pipe scheduling routines */ +#define D_dxSchedProcessReady 82 +#define D_dxSchedOkToRun 83 +#define D_dxBuildChangeList 84 /* Change list routines */ +#define D_dxPutRuns 85 +#define D_dxFfsLong 86 +#define D_dxFfcLong 87 +#define D_dxFillRegion 88 /* Miscellaneous additions */ +#define D_dxConvertCpp 89 +#define D_dxCopyCpp 90 +#define D_dxEncodeG4 91 +#define D_dxEncodeDct 92 +#define D_dxDecodeG4 93 +#define D_dxDecodeDct 94 +#define D_dxPosCl 95 +#define D_dxCheckLicense 96 + /* More RM functions */ +#define D_dxRmAllocCmpDataDesc 97 /* was D_dxRmGetAlignment */ +#define D_dxRmSetAlignment 98 +#define D_dxRmCreateDataDesc 99 +#define D_dxCreatePipeCtx 100 +#define D_dxUsingCL 101 +#define D_dxCmpPreferred 102 /* was D_dxSmiDecodeG4IsAtomic */ +#define D_dxRmAllocDataArray 103 +#define D_dxRmAllocCmpPermDesc 104 +#define D_dxSchedProcessNoInput 105 + +/***************************************************************************** +** +** DDX Access Macros +** +** FUNCTIONAL DESCRIPTION: +** +** These macros provide access to the DDX functions while hiding +** the implementation from the caller. +** +*****************************************************************************/ + /* + ** DDX function access macro + ** This macro calls an arbitrary DDX routine through the + ** xieDdxProc dispatch table. + ** + ** func = the Mi function index from this file. + ** + */ +externalref card32 (*xieDdxProc[])(); +#define CallDdx_(func) (*(xieDdxProc)[func]) + /* + ** Image functions + */ +#define DdxArea_ CallDdx_(D_dxArea) +#define DdxStatsArea_ CallDdx_(D_dxStatsArea) +#define DdxArith_ CallDdx_(D_dxArith) +#define DdxHistogram_ CallDdx_(D_dxHistogram) +#define DdxChromeCom_ CallDdx_(D_dxChromeCom) +#define DdxChromeSep_ CallDdx_(D_dxChromeSep) +#define DdxCompare_ CallDdx_(D_dxCompare) +#define DdxConstrain_ CallDdx_(D_dxConstrain) +#define DdxCrop_ CallDdx_(D_dxCrop) +#define DdxDither_ CallDdx_(D_dxDither) +#define DdxFill_ CallDdx_(D_dxFill) +#define DdxLogical_ CallDdx_(D_dxLogical) +#define DdxLuminance_ CallDdx_(D_dxLuminance) +#define DdxMatchHistogram_ CallDdx_(D_dxMatchHistogram) +#define DdxMath_ CallDdx_(D_dxMath) +#define DdxMirror_ CallDdx_(D_dxMirror) +#define DdxPoint_ CallDdx_(D_dxPoint) +#define DdxStatsPoint_ CallDdx_(D_dxStatsPoint) +#define DdxRotate_ CallDdx_(D_dxRotate) +#define DdxScale_ CallDdx_(D_dxScale) +#define DdxTranslate_ CallDdx_(D_dxTranslate) +#define DdxRmOwnData_ CallDdx_(D_dxRmOwnData) + /* + ** Ddx specific functions + */ +#define DdxInit_ CallDdx_(D_dxInit) +#define DdxReset_ CallDdx_(D_dxReset) +#define DdxOptimizePipe_ CallDdx_(D_dxOptimizePipe) + /* + ** MI software functions + */ +#define DdxConvert_ CallDdx_(D_dxConvert) +#define DdxCopy_ CallDdx_(D_dxCopy) +#define DdxGetTyp_ CallDdx_(D_dxGetTyp) +#define DdxCopyBits_ CallDdx_(D_dxCopyBits) /* 65 */ +#define DdxResolveUdp_ CallDdx_(D_dxResolveUdp) + /* + ** Memory management routines + */ +#define DdxCalloc_ CallDdx_(D_dxCalloc) +#define DdxCallocBits_ (unsigned char *)CallDdx_(D_dxCallocBits) +#define DdxCfree_ CallDdx_(D_dxCfree) +#define DdxFree_ CallDdx_(D_dxFree) +#define DdxFreeBits_ (unsigned char *)CallDdx_(D_dxFreeBits) +#define DdxMalloc_ CallDdx_(D_dxMalloc) +#define DdxMallocBits_ (unsigned char *)CallDdx_(D_dxMallocBits) +#define DdxRealloc_ CallDdx_(D_dxRealloc) +#define DdxReallocBits_ (unsigned char *)CallDdx_(D_dxReallocBits) + /* + ** Pipeline support routines + */ +#define DdxCreatePipeline_ (Pipe)CallDdx_(D_dxCreatePipeline) +#define DdxDestroyPipeline_ (int)CallDdx_(D_dxDestroyPipeline) +#define DdxPipeHasYielded_ (int)CallDdx_(D_dxPipeHasYielded) +#define DdxInitiatePipeline_ (int)CallDdx_(D_dxInitiatePipeline) +#define DdxResumePipeline_ (int)CallDdx_(D_dxResumePipeline) +#define DdxFlushPipeline_ (int)CallDdx_(D_dxFlushPipeline) +#define DdxAbortPipeline_ (int)CallDdx_(D_dxAbortPipeline) + /* + ** Pipeline resource manager routines + */ +#define DdxRmAllocData_ (PipeDataPtr)CallDdx_(D_dxRmAllocData) +#define DdxRmAllocDataDesc_ (PipeDataPtr)CallDdx_(D_dxRmAllocDataDesc) +#define DdxRmAllocPermDesc_ (PipeDataPtr)CallDdx_(D_dxRmAllocPermDesc) +#define DdxRmAllocRefDesc_ (PipeDataPtr)CallDdx_(D_dxRmAllocRefDesc) +#define DdxRmBestDType_ (char)CallDdx_(D_dxRmBestDType) +#define DdxRmCreateDrain_ (PipeDrainPtr)CallDdx_(D_dxRmCreateDrain) +#define DdxRmCreateSink_ (PipeSinkPtr)CallDdx_(D_dxRmCreateSink) +#define DdxRmDeallocData_ (PipeDataPtr)CallDdx_(D_dxRmDeallocData) +#define DdxRmDeallocDataDesc_ (PipeDataPtr)CallDdx_(D_dxRmDeallocDataDesc) +#define DdxRmDestroyDrain_ (PipeDrainPtr)CallDdx_(D_dxRmDestroyDrain) +#define DdxRmDestroySink_ (PipeSinkPtr)CallDdx_(D_dxRmDestroySink) +#define DdxRmGetData_ (PipeDataPtr)CallDdx_(D_dxRmGetData) +#define DdxRmGetDType_ (int)CallDdx_(D_dxRmGetDType) +#define DdxRmGetMaxQuantum_ (int)CallDdx_(D_dxRmGetMaxQuantum) +#define DdxRmGetQuantum_ (int)CallDdx_(D_dxRmGetQuantum) +#define DdxRmHasQuantum_ (int)CallDdx_(D_dxRmHasQuantum) +#define DdxRmInitializePort_ (int)CallDdx_(D_dxRmInitializePort) +#define DdxRmMergeBuffers_ (PipeDataPtr)CallDdx_(D_dxRmMergeBuffers) +#define DdxRmObtainQuantum_ (PipeDataPtr)CallDdx_(D_dxRmObtainQuantum) +#define DdxRmPutData_ (int)CallDdx_(D_dxRmPutData) +#define DdxRmSetDType_ CallDdx_(D_dxRmSetDType) +#define DdxRmSetQuantum_ CallDdx_(D_dxRmSetQuantum) +#define DdxRmSplitBuffers_ (PipeDataPtr)CallDdx_(D_dxRmSplitBuffers) + /* + ** Pipe scheduling routines + */ +#define DdxSchedProcessComplete_ (PipeElementCtxPtr)CallDdx_(D_dxSchedProcessComplete) +#define DdxSchedProcessReady_ (PipeElementCtxPtr)CallDdx_(D_dxSchedProcessReady) +#define DdxSchedOkToRun_ (int)CallDdx_(D_dxSchedOkToRun) + /* + ** Change list routines + */ +#define DdxBuildChangeList_ CallDdx_(D_dxBuildChangeList) +#define DdxPutRuns_ CallDdx_(D_dxPutRuns) +#define DdxFfsLong_ CallDdx_(D_dxFfsLong) +#define DdxFfcLong_ CallDdx_(D_dxFfcLong) + /* + ** Additions + */ +#define DdxFillRegion_ CallDdx_(D_dxFillRegion) +#define DdxConvertCpp_ CallDdx_(D_dxConvertCpp) +#define DdxCopyCpp_ CallDdx_(D_dxCopyCpp) +#define DdxEncodeG4_ CallDdx_(D_dxEncodeG4) +#define DdxEncodeDct_ CallDdx_(D_dxEncodeDct) +#define DdxDecodeG4_ CallDdx_(D_dxDecodeG4) +#define DdxDecodeDct_ CallDdx_(D_dxDecodeDct) +#define DdxPosCl_ CallDdx_(D_dxPosCl) +#define DdxCheckLicense_ CallDdx_(D_dxCheckLicense) + /* + ** More RM functions + */ +#define DdxRmAllocCmpDataDesc_ (PipeDataPtr)CallDdx_(D_dxRmAllocCmpDataDesc) +#define DdxRmSetAlignment_ CallDdx_(D_dxRmSetAlignment) +#define DdxRmCreateDataDesc_ (PipeDataPtr)CallDdx_(D_dxRmCreateDataDesc) +#define DdxCreatePipeCtx_ (PipeElementCtxPtr)CallDdx_(D_dxCreatePipeCtx) +#define DdxUsingCL_ CallDdx_(D_dxUsingCL) +#define DdxCmpPreferred_ CallDdx_(D_dxCmpPreferred) +#define DdxRmAllocDataArray_ CallDdx_(D_dxRmAllocDataArray) +#define DdxRmAllocCmpPermDesc_ (PipeDataPtr)CallDdx_(D_dxRmAllocCmpPermDesc) +#define DdxSchedProcessNoInput_ (PipeElementCtxPtr)CallDdx_(D_dxSchedProcessNoInput) + +/***************************************************************************** +** +** Xie Ddx Setup Index - +** +** FUNCTIONAL DESCRIPTION: +** +** The following symbols define the indices into the dispatch table +** used to call "pipeline create" DDX functions. Each of these +** functions creates a new pipeline element. +** +** WARNING: These indices and the entries in the XieDdxSetup table +** in SmiDdx.c MUST be in the same order. +** +*****************************************************************************/ +#define D_dxCreateArea 0 +#define D_dxCreateArith 1 +#define D_dxCreateChromeCom 2 +#define D_dxCreateChromeSep 3 +#define D_dxCreateCompare 4 +#define D_dxCreateConstrain 5 +#define D_dxCreateCrop 6 +#define D_dxCreateDither 7 +#define D_dxCreateFill 8 +#define D_dxCreateLogical 9 +#define D_dxCreateLuminance 10 +#define D_dxCreateMatchHistogram 11 +#define D_dxCreateMath 12 +#define D_dxCreateMirror 13 +#define D_dxCreatePoint 14 +#define D_dxCreateRotate 15 +#define D_dxCreateScale 16 +#define D_dxCreateTranslate 17 +#define D_dxCreateDecodeDct 18 /* Compression pipeline creates */ +#define D_dxCreateEncodeDct 19 +#define D_dxCreateDecodeG4 20 +#define D_dxCreateEncodeG4 21 + +/***************************************************************************** +** +** Pipeline Create Access Macros +** +** FUNCTIONAL DESCRIPTION: +** +** These macros provide access to the Pipeline Create functions while +** hiding the implementation from the caller. +** +*****************************************************************************/ + /* + ** Pipe create function access macro + ** This macro calls a create function through the + ** xieDdxSetup dispatch table. + ** + ** func = the setup function index from this file. + ** + */ +externalref card32 (*xieDdxSetup[])(); +#define CallCreate_(func) (*(xieDdxSetup)[func]) + /* + ** Image processing pipe element creates + */ +#define DdxCreateArea_ CallCreate_(D_dxCreateArea) +#define DdxCreateArith_ CallCreate_(D_dxCreateArith) +#define DdxCreateChromeCom_ CallCreate_(D_dxCreateChromeCom) +#define DdxCreateChromeSep_ CallCreate_(D_dxCreateChromeSep) +#define DdxCreateCompare_ CallCreate_(D_dxCreateCompare) +#define DdxCreateConstrain_ CallCreate_(D_dxCreateConstrain) +#define DdxCreateCrop_ CallCreate_(D_dxCreateCrop) +#define DdxCreateDither_ CallCreate_(D_dxCreateDither) +#define DdxCreateFill_ CallCreate_(D_dxCreateFill) +#define DdxCreateLogical_ CallCreate_(D_dxCreateLogical) +#define DdxCreateLuminance_ CallCreate_(D_dxCreateLuminance) +#define DdxCreateMatchHistogram_ CallCreate_(D_dxCreateMatchHistogram) +#define DdxCreateMath_ CallCreate_(D_dxCreateMath) +#define DdxCreateMirror_ CallCreate_(D_dxCreateMirror) +#define DdxCreatePoint_ CallCreate_(D_dxCreatePoint) +#define DdxCreateRotate_ CallCreate_(D_dxCreateRotate) +#define DdxCreateScale_ CallCreate_(D_dxCreateScale) +#define DdxCreateTranslate_ CallCreate_(D_dxCreateTranslate) + /* + ** Compression creates, used by Transport + */ +#define DdxCreateDecodeDct_ CallCreate_(D_dxCreateDecodeDct) +#define DdxCreateEncodeDct_ CallCreate_(D_dxCreateEncodeDct) +#define DdxCreateDecodeG4_ CallCreate_(D_dxCreateDecodeG4) +#define DdxCreateEncodeG4_ CallCreate_(D_dxCreateEncodeG4) + +/***************************************************************************** +** +** Ddx Alignment Function Access Index +** +** FUNCTIONAL DESCRIPTION: +** +** The following symbols define the indices into the DDX Alignment +** dispatch table used to call DDX image array alignment functions. +** Each of these functions performs alignments to meet individual +** algorithms or the default DDX needs. +** +** WARNING: These indices and the entries in the XieDdxAlign table +** in SmiDdx.c MUST be in the same order. +** +** +*****************************************************************************/ +#define D_dxAlignArea 0 +#define D_dxAlignArith 1 +#define D_dxAlignChromeCom 2 +#define D_dxAlignChromeSep 3 +#define D_dxAlignCompare 4 +#define D_dxAlignConstrain 5 +#define D_dxAlignCrop 6 +#define D_dxAlignDither 7 +#define D_dxAlignFill 8 +#define D_dxAlignLogical 9 +#define D_dxAlignLuminance 10 +#define D_dxAlignMatchHistogram 11 +#define D_dxAlignMath 12 +#define D_dxAlignMirror 13 +#define D_dxAlignPoint 14 +#define D_dxAlignRotate 15 +#define D_dxAlignScale 16 +#define D_dxAlignTranslate 17 +#define D_dxAlignDecodeDct 18 +#define D_dxAlignEncodeDct 19 +#define D_dxAlignDecodeG4 20 +#define D_dxAlignEncodeG4 21 +#define D_dxAlignDefault 22 +#define D_dxAlignExport 23 + +/***************************************************************************** +** +** DDX Alignment Function Access Macros +** +** FUNCTIONAL DESCRIPTION: +** +** These macros provide access to the DDX image array alignment functions +** +*****************************************************************************/ + /* + ** Align function access macro + ** This macro calls an arbitrary Alignment routine through the + ** xieDdxAlign dispatch table. + ** + ** func = the DDX alignment function index from this file. + ** + */ +externalref card32 (*xieDdxAlign[])(); +#define GetAlign_(func) (xieDdxAlign[func]) + +#define DdxAlignArea_ GetAlign_(D_dxAlignArea) +#define DdxAlignStatsArea_ GetAlign_(D_dxAlignStatsArea) +#define DdxAlignArith_ GetAlign_(D_dxAlignArith) +#define DdxAlignHistogram_ GetAlign_(D_dxAlignHistogram) +#define DdxAlignChromeCom_ GetAlign_(D_dxAlignChromeCom) +#define DdxAlignChromeSep_ GetAlign_(D_dxAlignChromeSep) +#define DdxAlignCompare_ GetAlign_(D_dxAlignCompare) +#define DdxAlignConstrain_ GetAlign_(D_dxAlignConstrain) +#define DdxAlignCrop_ GetAlign_(D_dxAlignCrop) +#define DdxAlignDither_ GetAlign_(D_dxAlignDither) +#define DdxAlignFill_ GetAlign_(D_dxAlignFill) +#define DdxAlignLogical_ GetAlign_(D_dxAlignLogical) +#define DdxAlignLuminance_ GetAlign_(D_dxAlignLuminance) +#define DdxAlignMatchHistogram_ GetAlign_(D_dxAlignMatchHistogram) +#define DdxAlignMath_ GetAlign_(D_dxAlignMath) +#define DdxAlignMirror_ GetAlign_(D_dxAlignMirror) +#define DdxAlignPoint_ GetAlign_(D_dxAlignPoint) +#define DdxAlignStatsPoint_ GetAlign_(D_dxAlignStatsPoint) +#define DdxAlignRotate_ GetAlign_(D_dxAlignRotate) +#define DdxAlignScale_ GetAlign_(D_dxAlignScale) +#define DdxAlignTranslate_ GetAlign_(D_dxAlignTranslate) +#define DdxAlignDecodeDct_ GetAlign_(D_dxAlignDecodeDct) +#define DdxAlignEncodeDct_ GetAlign_(D_dxAlignEncodeDct) +#define DdxAlignDecodeG4_ GetAlign_(D_dxAlignDecodeG4) +#define DdxAlignEncodeG4_ GetAlign_(D_dxAlignEncodeG4) +#define DdxAlignDefault_ GetAlign_(D_dxAlignDefault) +#define DdxAlignExport_ GetAlign_(D_dxAlignExport) + +/***************************************************************************** +** +** Mi Access Macros +** +** FUNCTIONAL DESCRIPTION: +** +** These macros provide access to the "atomic" DDX functions provided +** by a Machine Independent layer of the DDX. +** +*****************************************************************************/ + /* + ** Mi function access macro + ** This macro calls an arbitrary Mi routine through the + ** xieMiProc dispatch table. + ** + ** func = the Mi function index from this file. + ** + */ +externalref card32 (*xieMiProc[])(); +#define CallMi_(func) (*(xieMiProc)[func]) + /* + ** Image functions + */ +#define MiArea_ CallMi_(D_dxArea) +#define MiStatsArea_ CallMi_(D_dxStatsArea) +#define MiArith_ CallMi_(D_dxArith) +#define MiHistogram_ CallMi_(D_dxHistogram) +#define MiChromeCom_ CallMi_(D_dxChromeCom) +#define MiChromeSep_ CallMi_(D_dxChromeSep) +#define MiCompare_ CallMi_(D_dxCompare) +#define MiConstrain_ CallMi_(D_dxConstrain) +#define MiCrop_ CallMi_(D_dxCrop) +#define MiDither_ CallMi_(D_dxDither) +#define MiFill_ CallMi_(D_dxFill) +#define MiLogical_ CallMi_(D_dxLogical) +#define MiLuminance_ CallMi_(D_dxLuminance) +#define MiMatchHistogram_ CallMi_(D_dxMatchHistogram) +#define MiMath_ CallMi_(D_dxMath) +#define MiMirror_ CallMi_(D_dxMirror) +#define MiPoint_ CallMi_(D_dxPoint) +#define MiStatsPoint_ CallMi_(D_dxStatsPoint) +#define MiRotate_ CallMi_(D_dxRotate) +#define MiScale_ CallMi_(D_dxScale) +#define MiTranslate_ CallMi_(D_dxTranslate) + /* + ** Mi specific functions + */ +#define MiInit_ CallMi_(D_dxInit) +#define MiReset_ CallMi_(D_dxReset) +#define MiOptimizePipe_ CallMi_(D_dxOptimizePipe) + /* + ** MI software functions + */ +#define MiConvert_ CallMi_(D_dxConvert) +#define MiCopy_ CallMi_(D_dxCopy) +#define MiGetTyp_ CallMi_(D_dxGetTyp) +#define MiCopyBits_ CallMi_(D_dxCopyBits) +#define MiResolveUdp_ CallMi_(D_dxResolveUdp) + /* + ** Memory management routines + */ +#define MiCalloc_ CallMi_(D_dxCalloc) +#define MiCallocBits_ (unsigned char *)CallMi_(D_dxCallocBits) +#define MiCfree_ CallMi_(D_dxCfree) +#define MiFree_ CallMi_(D_dxFree) +#define MiFreeBits_ (unsigned char *)CallMi_(D_dxFreeBits) +#define MiMalloc_ CallMi_(D_dxMalloc) +#define MiMallocBits_ (unsigned char *)CallMi_(D_dxMallocBits) +#define MiRealloc_ CallMi_(D_dxRealloc) +#define MiReallocBits_ (unsigned char *)CallMi_(D_dxReallocBits) + /* + ** Pipeline support routines + */ +#define MiCreatePipeline_ (Pipe)CallMi_(D_dxCreatePipeline) +#define MiDestroyPipeline_ (int)CallMi_(D_dxDestroyPipeline) +#define MiPipeHasYielded_ (int)CallMi_(D_dxPipeHasYielded) +#define MiInitiatePipeline_ (int)CallMi_(D_dxInitiatePipeline) +#define MiResumePipeline_ (int)CallMi_(D_dxResumePipeline) +#define MiFlushPipeline_ (int)CallMi_(D_dxFlushPipeline) +#define MiAbortPipeline_ (int)CallMi_(D_dxAbortPipeline) + /* + ** Pipeline resource manager routines + */ +#define MiRmAllocData_ (PipeDataPtr)CallMi_(D_dxRmAllocData) +#define MiRmAllocDataDesc_ (PipeDataPtr)CallMi_(D_dxRmAllocDataDesc) +#define MiRmAllocPermDesc_ (PipeDataPtr)CallMi_(D_dxRmAllocPermDesc) +#define MiRmAllocRefDesc_ (PipeDataPtr)CallMi_(D_dxRmAllocRefDesc) +#define MiRmBestDType_ (char)CallMi_(D_dxRmBestDType) +#define MiRmCreateDrain_ (PipeDrainPtr)CallMi_(D_dxRmCreateDrain) +#define MiRmCreateSink_ (PipeSinkPtr)CallMi_(D_dxRmCreateSink) +#define MiRmDeallocData_ (PipeDataPtr)CallMi_(D_dxRmDeallocData) +#define MiRmDeallocDataDesc_ (PipeDataPtr)CallMi_(D_dxRmDeallocDataDesc) +#define MiRmDestroyDrain_ (PipeDrainPtr)CallMi_(D_dxRmDestroyDrain) +#define MiRmDestroySink_ (PipeSinkPtr)CallMi_(D_dxRmDestroySink) +#define MiRmGetData_ (PipeDataPtr)CallMi_(D_dxRmGetData) +#define MiRmGetDType_ (int)CallMi_(D_dxRmGetDType) +#define MiRmGetMaxQuantum_ (int)CallMi_(D_dxRmGetMaxQuantum) +#define MiRmGetQuantum_ (int)CallMi_(D_dxRmGetQuantum) +#define MiRmHasQuantum_ (int)CallMi_(D_dxRmHasQuantum) +#define MiRmInitializePort_ (int)CallMi_(D_dxRmInitializePort) +#define MiRmMergeBuffers_ (PipeDataPtr)CallMi_(D_dxRmMergeBuffers) +#define MiRmObtainQuantum_ (PipeDataPtr)CallMi_(D_dxRmObtainQuantum) +#define MiRmPutData_ (int)CallMi_(D_dxRmPutData) +#define MiRmSetDType_ CallMi_(D_dxRmSetDType) +#define MiRmSetQuantum_ CallMi_(D_dxRmSetQuantum) +#define MiRmSplitBuffers_ (PipeDataPtr)CallMi_(D_dxRmSplitBuffers) + /* + ** Pipe scheduling routines + */ +#define MiSchedProcessComplete_ (PipeElementCtxPtr)CallMi_(D_dxSchedProcessComplete) +#define MiSchedProcessReady_ (PipeElementCtxPtr)CallMi_(D_dxSchedProcessReady) +#define MiSchedOkToRun_ (int)CallMi_(D_dxSchedOkToRun) + /* + ** Change list routines + */ +#define MiBuildChangeList_ CallMi_(D_dxBuildChangeList) +#define MiPutRuns_ CallMi_(D_dxPutRuns) +#define MiFfsLong_ CallMi_(D_dxFfsLong) +#define MiFfcLong_ CallMi_(D_dxFfcLong) + /* + ** Additions + */ +#define MiFillRegion_ CallMi_(D_dxFillRegion) +#define MiConvertCpp_ CallMi_(D_dxConvertCpp) +#define MiCopyCpp_ CallMi_(D_dxCopyCpp) +#define MiEncodeG4_ CallMi_(D_dxEncodeG4) +#define MiEncodeDct_ CallMi_(D_dxEncodeDct) +#define MiDecodeG4_ CallMi_(D_dxDecodeG4) +#define MiDecodeDct_ CallMi_(D_dxDecodeDct) +#define MiPosCl_ CallMi_(D_dxPosCl) +#define MiCheckLicense_ CallMi_(D_dxCheckLicense) + /* + ** More resource manager + */ +#define MiRmAllocCmpDataDesc_ CallMi_(D_dxRmAllocCmpDataDesc) +#define MiRmSetAlignment_ CallMi_(D_dxRmSetAlignment) +#define MiRmCreateDataDesc_ (PipeDataPtr)CallMi_(D_dxRmCreateDataDesc) +#define MiCreatePipeCtx_ (PipeElementCtxPtr)CallMi_(D_dxCreatePipeCtx) +#define MiUsingCL_ CallMi_(D_dxUsingCL) +#define MiCmpPreferred_ CallMi_(D_dxCmpPreferred) +#define MiRmAllocDataArray_ CallMi_(D_dxRmAllocDataArray) +#define MiRmAllocCmpPermDesc_ (PipeDataPtr)CallMi_(D_dxRmAllocCmpPermDesc) +#define MiSchedProcessNoInput_ (PipeElementCtxPtr)CallMi_(D_dxSchedProcessNoInput) + +/***************************************************************************** +** +** Pipeline Create Access Macros +** +** FUNCTIONAL DESCRIPTION: +** +** These macros provide access to the "pipeline create" DDX functions +** provided by a Machine Independent layer of the DDX. +** +*****************************************************************************/ + /* + ** Pipe create function access macro + ** This macro calls a create function through the + ** xieMiSetup dispatch table. + ** + ** func = the setup function index from this file. + ** + */ +externalref card32 (*xieMiSetup[])(); +#define CallMiCreate_(func) (*(xieMiSetup)[func]) + /* + ** Image processing pipe element creates + */ +#define MiCreateArea_ CallMiCreate_(D_dxCreateArea) +#define MiCreateArith_ CallMiCreate_(D_dxCreateArith) +#define MiCreateChromeCom_ CallMiCreate_(D_dxCreateChromeCom) +#define MiCreateChromeSep_ CallMiCreate_(D_dxCreateChromeSep) +#define MiCreateCompare_ CallMiCreate_(D_dxCreateCompare) +#define MiCreateConstrain_ CallMiCreate_(D_dxCreateConstrain) +#define MiCreateCrop_ CallMiCreate_(D_dxCreateCrop) +#define MiCreateDither_ CallMiCreate_(D_dxCreateDither) +#define MiCreateFill_ CallMiCreate_(D_dxCreateFill) +#define MiCreateLogical_ CallMiCreate_(D_dxCreateLogical) +#define MiCreateLuminance_ CallMiCreate_(D_dxCreateLuminance) +#define MiCreateMatchHistogram_ CallMiCreate_(D_dxCreateMatchHistogram) +#define MiCreateMath_ CallMiCreate_(D_dxCreateMath) +#define MiCreateMirror_ CallMiCreate_(D_dxCreateMirror) +#define MiCreatePoint_ CallMiCreate_(D_dxCreatePoint) +#define MiCreateRotate_ CallMiCreate_(D_dxCreateRotate) +#define MiCreateScale_ CallMiCreate_(D_dxCreateScale) +#define MiCreateTranslate_ CallMiCreate_(D_dxCreateTranslate) + /* + ** Compression creates, used by Transport + */ +#define MiCreateDecodeDct_ CallMiCreate_(D_dxCreateDecodeDct) +#define MiCreateEncodeDct_ CallMiCreate_(D_dxCreateEncodeDct) +#define MiCreateDecodeG4_ CallMiCreate_(D_dxCreateDecodeG4) +#define MiCreateEncodeG4_ CallMiCreate_(D_dxCreateEncodeG4) + +/* +** This "endif" MUST be the last line of this file. +*/ +#endif +/* end of XIEDDX -- NO DEFINITIONS ALLOWED BEYOND THIS POINT */ diff --git a/xie/build/dec/X11/extensions/XieFloat.h b/xie/build/dec/X11/extensions/XieFloat.h new file mode 100644 index 0000000..c58f26f --- /dev/null +++ b/xie/build/dec/X11/extensions/XieFloat.h @@ -0,0 +1,99 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1990-1991 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** XIE - X11 Image Extension +** +** +** ABSTRACT: +** +** This module contains definitions required by the XIE library +** and XIE server floating point formatting routines. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Robert NC Shelley +** +** CREATION DATE: +** +** October 31, 1990 +** +************************************************************************/ + + /* + ** Symbol XIEFLOAT allows XieFloat.h to be included multiple times. + */ +#ifndef XIEFLOAT +#define XIEFLOAT /* the "endif" MUST be the last line of this file */ + +#include /* for CARD8, ..., typedefs */ + + /* + ** Wire floating point format + */ +typedef struct _XieFloatRec { + CARD8 e_sign; + CARD8 m_sign; + CARD16 exponent; + CARD32 mantissa; +} XieFloatRec, *XieFloat; + +extern void MiEncodeDouble(); +extern double MiDecodeDouble(); + +#endif diff --git a/xie/build/dec/X11/extensions/XieLib.h b/xie/build/dec/X11/extensions/XieLib.h new file mode 100644 index 0000000..25409f9 --- /dev/null +++ b/xie/build/dec/X11/extensions/XieLib.h @@ -0,0 +1,372 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989-1991 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** XIE - X11 Image Extension +** +** +** ABSTRACT: +** +** This module contains definitions required by all XIE client side +** layers -- from the application level through the XieLib level. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Robert NC Shelley +** +** CREATION DATE: +** +** April 13, 1989 +** +*******************************************************************************/ + + /* + ** Symbol XIELIB allows XieLib.h to be included multiple times. + */ +#ifndef _XIELIB +#define _XIELIB /* the "endif" MUST be the last line of this file */ + +/* +** Include files +*/ +#ifdef VMS +#include /* X11 Library Definitions */ +#else +#include /* X11 Library Definitions */ +#endif +#ifdef VMS +#include /* universal data plane definitions */ +#include /* XIE inter-layer definitions */ +#else +#include /* universal data plane definitions */ +#include /* XIE inter-layer definitions */ +#endif + +/* +** Equated symbols +*/ + /* + ** XieCopyImage, XieGetImage, and XiePutImage image data mode constants. + */ +#define XieK_DataNone 1 /* no buffers, no transport setup, no data copy */ +#define XieK_DataFlo 2 /* prepare a Photoflo for image data transport */ +#define XieK_DataMap 3 /* prepare a Photomap for image data transport */ +#define XieK_DataAlloc 4 /* allocate image buffers containing no data */ +#define XieK_DataCopy 5 /* allocate image buffers and copy data */ +#define XieK_DataShare 6 /* copy pointers to existing image data */ + /* + ** Opaque Xie resource definitions. + */ +typedef unsigned long *XieStream; /* Stream transport context pointer */ +typedef unsigned char + *XiePhotoflo, /* Photoflo: server image pipeline object */ + *XiePhotomap, /* Photomap: permanent server image object */ + *XiePhototap, /* Phototap: ephemeral server image object */ + *XieCpp, /* Cpp: control processing plane */ + *XieRoi, /* Roi: region of interest */ + *XieTmp, /* Tmp: template (eg. convolution kernel) */ + *XiePhoto, /* Any of: XiePhotoflo, XiePhotomap, XiePhototap*/ + *XieIdc, /* Any of: XieCpp, XieRoi, XieTmp, */ + *XieResource; /* Any of: XiePhoto, XieIdc */ + +#ifdef __alpha +#define RES_XID 16 /* offset to XieResource X11 resource-id */ +#define RES_TYPE 24 /* offset to XieResource resource type */ +#define RES_MAPPING 25 /* offset to XiePhoto component mapping */ +#else +#define RES_XID 8 /* offset to XieResource X11 resource-id */ +#define RES_TYPE 12 /* offset to XieResource resource type */ +#define RES_MAPPING 13 /* offset to XiePhoto component mapping */ +#endif +/* +** Macros +*/ + /* + ** Macro for returning a resource's X11-id. + */ +#define XId_(res) (*((XID *)(&((XieResource)(res))[RES_XID]))) + /* + ** Boolean macros for determining a resource's type. + */ +#define IsPhotoflo_(res) (((XieResource)(res))[RES_TYPE]==XieK_Photoflo) +#define IsPhotomap_(res) (((XieResource)(res))[RES_TYPE]==XieK_Photomap) +#define IsPhototap_(res) (((XieResource)(res))[RES_TYPE]==XieK_Phototap) +#define IsCpp_(res) (((XieResource)(res))[RES_TYPE]==XieK_IdcCpp) +#define IsRoi_(res) (((XieResource)(res))[RES_TYPE]==XieK_IdcRoi) +#define IsTmp_(res) (((XieResource)(res))[RES_TYPE]==XieK_IdcTmp) +#define IsPhoto_(res) (IsPhotoflo_(res)||IsPhotomap_(res)||IsPhototap_(res)) +#define IsIdc_(res) (IsCpp_(res)||IsRoi_(res)||IsTmp_(res)) + /* + ** Boolean macros for determining a XiePhotomap's component mapping. + */ +#define IsBitonal_(pho) (((XiePhoto)(pho))[RES_MAPPING]==XieK_Bitonal) +#define IsGrayScale_(pho) (((XiePhoto)(pho))[RES_MAPPING]==XieK_GrayScale) +#define IsRGB_(pho) (((XiePhoto)(pho))[RES_MAPPING]==XieK_RGB) + + /* + ** Return the component count of an XiePhotomap. + */ +#define PhotoCount_(pho) (IsRGB_(pho) ? 3 : 1) + /* + ** Return the number of planes (UdpPtr's) an XieImage "should" contain. + */ +#define PlaneCount_(img) \ + ( CmpOrg_(img) == XieK_BandByPixel ? 1 \ + : CmpOrg_(img) == XieK_BandByPlane ? CmpCnt_(img) \ + : CmpLen_(img,0)+CmpLen_(img,1)+CmpLen_(img,2) ) + /* + ** Return "val" rounded up (if necessary) to a multiple of "mod". + */ +#define Modulo_(val,mod) \ + ((mod) < 2 ? (val) : (((mod) - (val) % (mod)) % (mod) + (val))) + +/* +** Structures +*/ + /* + ** XIE Client Event Structure + */ +typedef struct { + int type; /* see XQueryExtention "first_event"*/ + unsigned long serial; /* X11 serial number */ + Bool send_event; /* Boolean: true if client generated*/ + Display *display; /* X11 display pointer */ + XieResource resource; /* Xie resource-id (source of event)*/ +} XieEventRec, *XieEvent; + /* + ** Image domain context template data for XieCreateTmp / XieQueryTmp. + */ +typedef struct { + long x; /* X coordinate of template entry */ + long y; /* Y coordinate of template entry */ + double value; /* value of template entry */ +} XieTemplateRec, *XieTemplate; + /* + ** Statistics data + */ +typedef struct { + double value; + double minimum; + double maximum; + double mean; + double stddev; + double variance; +} XieStatsRec, *XieStats; + + /* + ** XIE Image structure (client side image descriptor). + */ +typedef struct { + unsigned char Compression; /* compression scheme */ + unsigned char CmpOrg; /* component organization */ + unsigned char CmpMap; /* component mapping */ + unsigned char CmpCnt; /* component count */ + unsigned long CmpLvl[XieK_MaxComponents]; /* levels per component */ + unsigned char CmpLen[XieK_MaxComponents]; /* bits per component */ + unsigned char PxlPol; /* pixel brightness polarity*/ + unsigned char PxlProg; /* pixel progression */ + unsigned char ScnProg; /* scanline progression */ + unsigned char OwnData; /* image array ownership */ + unsigned char Stream; /* Stream transport status */ + XieStream Xport; /* Stream transport context */ + double PxlRatio; /* pixel aspect ratio */ + UdpPtr Plane[XieK_MaxPlanes]; /* data plane pointers */ +} XieImageRec, *XieImage; + /* + ** Access macros for XIE Image structure. + */ +#define Cmpres_(img) ((img)->Compression) +#define CmpOrg_(img) ((img)->CmpOrg) +#define CmpMap_(img) ((img)->CmpMap) +#define CmpCnt_(img) ((img)->CmpCnt) +#define CmpLvl_(img,ind) ((img)->CmpLvl[(ind)]) +#define CmpLen_(img,ind) ((img)->CmpLen[(ind)]) +#define PxlPol_(img) ((img)->PxlPol) +#define PxlProg_(img) ((img)->PxlProg) +#define ScnProg_(img) ((img)->ScnProg) +#define OwnData_(img) ((img)->OwnData) +#define Stream_(img) ((img)->Stream) +#define StreamFinal_(img) (Stream_(img) == XieK_StreamFinal) +#define StreamError_(img) (Stream_(img) == XieK_StreamError) +#define StreamPending_(img) (!(StreamFinal_(img) || StreamError_(img))) +#define PxlRatio_(img) ((img)->PxlRatio) +#define Width_(img) ((img)->Plane[0]->UdpL_PxlPerScn) +#define Height_(img) ((img)->Plane[0]->UdpL_ScnCnt) +#define Plane_(img,ind) ((img)->Plane[(ind)]) +#define uPxlLen_(img,ind) ((img)->Plane[(ind)]->UdpW_PixelLength) +#define uDType_(img,ind) ((img)->Plane[(ind)]->UdpB_DType) +#define uClass_(img,ind) ((img)->Plane[(ind)]->UdpB_Class) +#define uBase_(img,ind) ((img)->Plane[(ind)]->UdpA_Base) +#define uArSize_(img,ind) ((img)->Plane[(ind)]->UdpL_ArSize) +#define uPxlStr_(img,ind) ((img)->Plane[(ind)]->UdpL_PxlStride) +#define uScnStr_(img,ind) ((img)->Plane[(ind)]->UdpL_ScnStride) +#define uX1_(img,ind) ((img)->Plane[(ind)]->UdpL_X1) +#define uX2_(img,ind) ((img)->Plane[(ind)]->UdpL_X2) +#define uY1_(img,ind) ((img)->Plane[(ind)]->UdpL_Y1) +#define uY2_(img,ind) ((img)->Plane[(ind)]->UdpL_Y2) +#define uWidth_(img,ind) ((img)->Plane[(ind)]->UdpL_PxlPerScn) +#define uHeight_(img,ind) ((img)->Plane[(ind)]->UdpL_ScnCnt) +#define uPos_(img,ind) ((img)->Plane[(ind)]->UdpL_Pos) +#define uCmpIdx_(img,ind) ((img)->Plane[(ind)]->UdpL_CompIdx) +#define uLvl_(img,ind) ((img)->Plane[(ind)]->UdpL_Levels) + +/* +** XieLib entry points. +*/ +#ifndef _XieLibEvents +extern unsigned long XieQueryEvents(); +extern void XieSelectEvents(); +#endif +#ifndef _XieLibImage +extern XieImage XieCopyImage(); +extern XieImage XieCreateImage(); +extern XieImage XieFreeImage(); +extern XieImage XieGetImage(); +extern unsigned char XieGetImageData(); +extern XiePhoto XiePutImage(); +extern unsigned char XiePutImageData(); +#endif +#ifndef _XieLibProcess +extern XiePhoto XieArea(); +extern XiePhoto XieAreaStats(); +extern XiePhoto XieArithmetic(); +extern XiePhoto XieChromeCom(); +extern XiePhoto XieChromeSep(); +extern XiePhoto XieCompare(); +extern XiePhoto XieConstrain(); +extern XiePhoto XieCrop(); +extern XiePhoto XieDither(); +extern XiePhoto XieFill(); +extern unsigned long *XieHistogram(); +extern XiePhoto XieLogical(); +extern XiePhoto XieLuminance(); +extern XiePhoto XieMatchHistogram(); +extern XiePhoto XieMath(); +extern XiePhoto XieMirror(); +extern XiePhoto XiePoint(); +extern void XiePointStats(); +extern XiePhoto XieRotate(); +extern XiePhoto XieScale(); +extern XiePhoto XieTranslate(); +#endif +#ifndef _XieLibResource +extern void XieAbortFlo(); +extern void XieBindMapToFlo(); +extern XiePhoto XieClonePhoto(); +extern XieCpp XieCreateCpp(); +extern XiePhoto XieCreatePhoto(); +extern XieRoi XieCreateRoi(); +extern XieTmp XieCreateTmp(); +extern void XieExecuteFlo(); +extern void XieExport(); +extern XieResource XieFindResource(); +extern void XieFreeExport(); +extern XieResource XieFreeResource(); +extern XiePhotomap XieImport(); +extern void XieQueryCpp(); +extern void XieQueryExport(); +extern unsigned long XieQueryFlo(); +extern XiePhoto XieQueryMap(); +extern void XieQueryRoi(); +extern XieTemplate XieQueryTmp(); +extern XiePhoto XieTapFlo(); +#endif +#ifndef _XieLibSession +extern char *XieCheckFunction(); +extern char **XieListFunctions(); +extern void XieQueryOpDefaults(); +extern void XieSetOpDefaults(); +#endif +#ifndef _XieLibTransport +extern void XieAbortStream(); +extern unsigned char XieGetStream(); +extern void XieGetTile(); +extern void XiePutStream(); +extern void XiePutTile(); +extern void XieSetStream(); +#endif +#ifndef _XieLibUtils +extern void *XieCalloc(); +extern unsigned char *XieCallocBits(); +extern void *XieCfree(); +extern void *XieFree(); +extern unsigned char *XieFreeBits(); +extern unsigned char XieIsBitonal(); +extern unsigned char XieIsCpp(); +extern unsigned char XieIsGrayScale(); +extern unsigned char XieIsIdc(); +extern unsigned char XieIsPhoto(); +extern unsigned char XieIsPhotoflo(); +extern unsigned char XieIsPhotomap(); +extern unsigned char XieIsPhototap(); +extern unsigned char XieIsRGB(); +extern unsigned char XieIsRoi(); +extern unsigned char XieIsTmp(); +extern void *XieMalloc(); +extern unsigned char *XieMallocBits(); +extern unsigned long XiePhotoCount(); +extern unsigned long XiePlaneCount(); +extern void *XieRealloc(); +extern unsigned char *XieReallocBits(); +extern unsigned long XieXId(); +#endif + +/* +** This "endif" MUST be the last line of this file. +*/ +#endif /* end of _XIELIB -- NO DEFINITIONS ALLOWED BEYOND THIS POINT */ diff --git a/xie/build/dec/X11/extensions/XieProto.h b/xie/build/dec/X11/extensions/XieProto.h new file mode 100644 index 0000000..2aeac5c --- /dev/null +++ b/xie/build/dec/X11/extensions/XieProto.h @@ -0,0 +1,1228 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989-1991 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Image Extension DIX +** +** ABSTRACT: +** +** This module contains definitions required by the XIE wire protocol +** -- XIE library and XIE server DDX layers. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Richard J. Piccolo +** Robert NC Shelley +** +** CREATION DATE: +** +** March 1, 1989 +** +************************************************************************/ + + /* + ** Symbol XIEPROTO allows XieProto.h to be included multiple times. + */ +#ifndef XIEPROTO +#define XIEPROTO /* the "endif" MUST be the last line of this file */ + +/* +** Include files +*/ +#ifdef VMS +#include /* XIE inter-layer definitions */ +#include /* XIE device dependant definitions */ +#else +#include /* XIE inter-layer definitions */ +#include /* XIE device dependant definitions */ +#endif + +/* +** Wire protocol constant definitions. +*/ + /* + ** Version number + */ +#define XieK_MajorVersion 2 +#define XieK_MinorVersion 3 + +/******************************************************************************* +** Protocol request packet minor op-codes +*******************************************************************************/ +#define X_ieInitSession 1 +#define X_ieTermSession 2 + +#define X_ieQueryEvents 3 +#define X_ieSelectEvents 4 + +#define X_ieSetOpDefaults 5 +#define X_ieQueryOpDefaults 6 + +#define X_ieCreateByReference 7 +#define X_ieCreateByValue 8 +#define X_ieDeleteResource 9 +#define X_ieQueryResource 10 + +#define X_ieBindPhotomap 11 +#define X_ieAbortPhotoflo 12 +#define X_ieExecutePhotoflo 13 +#define X_ieTapPhotoflo 14 + +#define X_ieAbortTransport 15 +#define X_ieGetStream 16 +#define X_ieGetTile 17 +#define X_iePutStream 18 +#define X_iePutTile 19 +#define X_ieSetTransport 20 + +#define X_ieExport 21 +#define X_ieFreeExport 22 +#define X_ieImport 23 +#define X_ieQueryExport 24 + +#define X_ieArea 25 +#define X_ieAreaStats 26 +#define X_ieArith 27 +#define X_ieCalcHist 28 +#define X_ieChromeCom 29 +#define X_ieChromeSep 30 +#define X_ieCompare 31 +#define X_ieConstrain 32 +#define X_ieCrop 33 +#define X_ieDither 34 +#define X_ieFill 35 +#define X_ieLogical 36 +#define X_ieLuminance 37 +#define X_ieMatchHistogram 38 +#define X_ieMath 39 +#define X_ieMirror 40 +#define X_iePoint 41 +#define X_iePointStats 42 +#define X_ieRotate 43 +#define X_ieScale 44 +#define X_ieTranslate 45 + +#define X_ieLastRequest 46 + +/******************************************************************************* +** Protocol packet size definitions required by Xlibint.h +*******************************************************************************/ +#define sz_xieReq 4 +#define sz_xieInitSessionReq 8 +#define sz_xieTermSessionReq 4 + +#define sz_xieQueryEventsReq 8 +#define sz_xieSelectEventsReq 8 + +#define sz_xieSetOpDefaultsReq 20 +#define sz_xieQueryOpDefaultsReq 4 + +#define sz_xieCreateByReferenceReq 16 +#define sz_xieCreateByValueReq 12 +#define sz_xieCreateCppReq 24 +#define sz_xieCreatePhotoReq 48 +#define sz_xieCreateRoiReq 28 +#define sz_xieCreateTmpReq 24 +#define sz_xieDeleteResourceReq 12 +#define sz_xieQueryResourceReq 12 + +#define sz_xieBindPhotomapReq 12 +#define sz_xieAbortPhotofloReq 8 +#define sz_xieExecutePhotofloReq 8 +#define sz_xieTapPhotofloReq 16 + +#define sz_xieAbortTransportReq 12 +#define sz_xieGetStreamReq 16 +#define sz_xieGetTileReq 32 +#define sz_xiePutStreamReq 16 +#define sz_xiePutTileReq 32 +#define sz_xieSetTransportReq 140 + +#define sz_xieExportReq 64 +#define sz_xieFreeExportReq 8 +#define sz_xieImportReq 20 +#define sz_xieQueryExportReq 16 + +#define sz_xieAreaReq 24 +#define sz_xieAreaStatsReq 20 +#define sz_xieArithReq 36 +#define sz_xieCalcHistReq 16 +#define sz_xieChromeComReq 20 +#define sz_xieChromeSepReq 16 +#define sz_xieCompareReq 36 +#define sz_xieConstrainReq 28 +#define sz_xieCropReq 16 +#define sz_xieDitherReq 24 +#define sz_xieFillReq 28 +#define sz_xieLogicalReq 36 +#define sz_xieLuminanceReq 12 +#define sz_xieMatchHistogramReq 36 +#define sz_xieMathReq 20 +#define sz_xieMirrorReq 16 +#define sz_xiePointReq 20 +#define sz_xiePointStatsReq 20 +#define sz_xieRotateReq 40 +#define sz_xieScaleReq 20 +#define sz_xieTranslateReq 24 + +/******************************************************************************* +** Sub-structures +*******************************************************************************/ + + /* + ** Structure defining the Xie function vector. + */ +typedef struct { + CARD8 function[32]; +} XieFunctionsRec, *XieFunctionVector; + + /* + ** Structure defining IdcTmp template data crossing wire. + */ +typedef struct { + INT32 x; + INT32 y; + XieFloatRec value; +} XieTmpEntryRec, *XieTmpEntry; + +/******************************************************************************* +** Protocol request packets +*******************************************************************************/ + + /* + ** Generic part of all XIE requests + */ +typedef struct { + CARD8 reqType; /* major op-code assigned to extension */ + CARD8 opcode; /* minor op-code == XIE function */ + CARD16 length; /* length in longwords of entire request */ +} xieReq; + + /* + ** Init Session Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieInitSession */ + CARD16 length; + CARD16 major_version; + CARD16 minor_version; +} xieInitSessionReq; + + /* + ** Term Session Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieTermSession */ + CARD16 length; +} xieTermSessionReq; + + /* + ** Query Events Requests + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 event_param; +} xieQueryEventsReq; + + /* + ** Select Events Requests + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 event_mask; +} xieSelectEventsReq; + + /* + ** Set Operational Defaults + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieSetOpDefaults */ + CARD16 length; + CARD8 model; + CARD8 _pad[3]; + CARD32 levels[XieK_MaxComponents]; +} xieSetOpDefaultsReq; + + /* + ** Query Operational Defaults + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieQueryOpDefaults */ + CARD16 length; +} xieQueryOpDefaultsReq; + + /* + ** Create (ie. clone Photo{flo|map}) resource By Reference Request. + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByReference*/ + CARD16 length; + CARD32 resource_type; + CARD32 resource_id; /* new Photo{flo|map}-id */ + CARD32 photomap_id; /* existing Photomap-id */ +} xieCreateByReferenceReq; + + /* + ** Generic Create resource By Value Request. + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByValue */ + CARD16 length; + CARD32 resource_type; /* new resource type */ + CARD32 resource_id; /* new resource identifier */ +} xieCreateByValueReq; + + /* + ** Create Cpp Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByValue */ + CARD16 length; + CARD32 resource_type; /* resource type == XieK_IdcCpp */ + CARD32 resource_id; + CARD32 photomap_id; + INT32 x; + INT32 y; +} xieCreateCppReq; + + /* + ** Create Photo{flo|map} from client specified attributes. + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByValue */ + CARD16 length; + CARD32 resource_type; /* XieK_Photomap or XieK_Photoflo */ + CARD32 resource_id; + CARD32 width; + CARD32 height; + XieFloatRec aspect_ratio; + CARD32 levels[XieK_MaxComponents]; + CARD8 number_of_components; + CARD8 component_mapping; + CARD8 pixel_progression; + CARD8 line_progression; + CARD8 polarity; + CARD8 _pad[3]; +} xieCreatePhotoReq; + + /* + ** Create Roi Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByValue */ + CARD16 length; + CARD32 resource_type; /* resource type == XieK_IdcRoi */ + CARD32 resource_id; + INT32 x; + INT32 y; + CARD32 width; + CARD32 height; +} xieCreateRoiReq; + + /* + ** Create Tmp Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByValue */ + CARD16 length; + CARD32 resource_type; /* resource type == XieK_IdcTmp */ + CARD32 resource_id; + INT32 center_x; + INT32 center_y; + CARD32 data_count; /* number of XieTmpEntryRec's */ +/* XieTmpEntryRec data[data_count] /* list of XieTmpEntryRec */ +} xieCreateTmpReq; + + /* + ** Delete resource request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieDeleteResource */ + CARD16 length; + CARD32 resource_type; + CARD32 resource_id; +} xieDeleteResourceReq; + + /* + ** Query resource request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieQueryResource */ + CARD16 length; + CARD32 resource_type; + CARD32 resource_id; +} xieQueryResourceReq; + + /* + ** Bind an existing Photomap to an existing Photoflo. + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieBindPhotomap */ + CARD16 length; + CARD32 photoflo_id; + CARD32 photomap_id; +} xieBindPhotomapReq; + + /* + ** Abort Photoflo request. + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieAbortPhotoflo */ + CARD16 length; + CARD32 photoflo_id; +} xieAbortPhotofloReq; + + /* + ** Execute Photoflo Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieExecutePhotoflo */ + CARD16 length; + CARD32 photoflo_id; +} xieExecutePhotofloReq; + + /* + ** Tap Photoflo Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieTapPhotoflo */ + CARD16 length; + CARD32 photoflo_id; + CARD32 photo_id; + BOOL permanent; + CARD8 _pad[3]; +} xieTapPhotofloReq; + + /* + ** Abort transport Request (release transport resources) + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieAbortTransport */ + CARD16 length; + CARD32 photo_id; + CARD32 plane_mask; +} xieAbortTransportReq; + + /* + ** Get Stream Request (transport image data: server --> client) + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieGetStream */ + CARD16 length; + CARD32 photo_id; + CARD32 max_bytes; /* maximum return image data length */ + CARD8 plane_num; + CARD8 _pad[3]; +} xieGetStreamReq; + + /* + ** Get Tile Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieGetTile */ + CARD16 length; + CARD32 photomap_id; + INT32 x; + INT32 y; + CARD32 width; + CARD32 height; + CARD32 plane_mask; + BOOL final; + CARD8 _pad[3]; +} xieGetTileReq; + + /* + ** Put Stream Request (transport image data: client --> server) + */ +typedef struct _xiePutStreamReq { + CARD8 reqType; + CARD8 opcode; /* function == X_iePutStream */ + CARD16 length; + CARD32 photo_id; + CARD32 byte_count; /* image plane data length in bytes */ + BOOL final; + CARD8 plane_num; + CARD8 _pad[2]; +} xiePutStreamReq; + + /* + ** Put Tile Request (transport image data: client --> server) + */ +typedef struct _xiePutTileReq { + CARD8 reqType; + CARD8 opcode; /* function == X_iePutTile */ + CARD16 length; + CARD32 photomap_id; + INT32 x; + INT32 y; + CARD32 width; + CARD32 height; + CARD32 plane_mask; + BOOL final; + CARD8 _pad[3]; +} xiePutTileReq; + + /* + ** Set transport Request (set transport parameters) + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieSetTransport */ + CARD16 length; + CARD32 photo_id; + CARD32 compression_parameter; + CARD8 compression_scheme; + CARD8 mode; + CARD8 component_organization; + CARD8 _pad; + CARD32 plane_mask; + CARD8 pixel_stride[XieK_MaxPlanes]; + CARD32 scanline_stride[XieK_MaxPlanes]; +} xieSetTransportReq; + + /* + ** Export image data to drawable Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieExport */ + CARD16 length; + CARD32 photo_id; + CARD32 drawable_id; + CARD32 gc_id; + INT32 src_x; + INT32 src_y; + CARD32 width; + CARD32 height; + INT32 dst_x; + INT32 dst_y; + CARD32 photo_lut_id; + CARD32 colormap_id; + XieFloatRec match_limit; + XieFloatRec gray_limit; +} xieExportReq; + + /* + ** Free ExportContext from Photomap Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieFreeExport */ + CARD16 length; + CARD32 photo_id; +} xieFreeExportReq; + + /* + ** Import image data from drawable Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieImport */ + CARD16 length; + CARD32 photomap_id; + CARD32 drawable_id; + CARD32 colormap_id; + CARD8 polarity; + CARD8 _pad[3]; +} xieImportReq; + + /* + ** Query ExportContext Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieQueryExport */ + CARD16 length; + CARD32 photo_id; + CARD32 lut_id; + BOOL get_pixels; + CARD8 _pad[3]; +} xieQueryExportReq; + + /* + ** Area Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 ipcc_id; + CARD32 ipct_id; + CARD8 op1; + CARD8 op2; + CARD8 constrain; + CARD8 _pad; +} xieAreaReq; + + /* + ** Area Statistics Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD8 edge_size; + CARD8 stat_type; + CARD8 _pad[2]; +} xieAreaStatsReq; + + /* + ** Arith Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieArithmetic */ + CARD16 length; + CARD32 src1_photo_id; + CARD32 src2_photo_id; + CARD32 constants[XieK_MaxComponents]; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD8 op; + CARD8 constrain; + CARD16 _pad; +} xieArithReq; + + /* + ** Calculate Histogram Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 photo_id; + CARD32 idc_id; + CARD8 by_component; + CARD8 _pad[3]; +} xieCalcHistReq; + + /* + ** Chrominance Combine Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 photo_id1; + CARD32 photo_id2; + CARD32 photo_id3; + CARD32 dst_photo_id; +} xieChromeComReq; + + /* + ** Chrominance Separate Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src_photo; + CARD32 dst_photo; + CARD32 component; +} xieChromeSepReq; + + /* + ** Compare Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src1_photo_id; + CARD32 src2_photo_id; + CARD32 constants[XieK_MaxComponents]; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD8 op; + CARD8 combine; + CARD16 _pad; +} xieCompareReq; + + /* + ** Constrain Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieConstrain */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD8 model; + CARD8 _pad[3]; + CARD32 levels[XieK_MaxComponents]; + +} xieConstrainReq; + + /* + ** Crop Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCrop */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 idc_id; +} xieCropReq; + + /* + ** Dither Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieDither */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 levels[XieK_MaxComponents]; +} xieDitherReq; + + /* + ** Fill Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieFill */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 dst_idc_id; + CARD32 constant[XieK_MaxComponents]; +} xieFillReq; + + /* + ** Logical Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieLogical */ + CARD16 length; + CARD32 src1_photo_id; + CARD32 src2_photo_id; + CARD32 constants[XieK_MaxComponents]; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD8 op; + CARD8 _pad[3]; + } xieLogicalReq; + + /* + ** Luminance Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieLuminance */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; +} xieLuminanceReq; + + /* + ** Math Function Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD8 op; + CARD8 constrain; + CARD16 _pad; +} xieMathReq; + + /* + ** Match Histogram Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 photo_id1; + CARD32 photo_id2; + CARD32 idc_id; + XieFloatRec param1; + XieFloatRec param2; + CARD8 h_shape; + CARD8 _pad[3]; +} xieMatchHistogramReq; + + /* + ** Mirror Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieMirror */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + BOOL x_mirror; + BOOL y_mirror; + CARD8 _pad[2]; +} xieMirrorReq; + + /* + ** Point Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD32 trans_photo_id; +} xiePointReq; + + /* + ** Point Statistics Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 photo_id; + INT32 x; + INT32 y; + CARD8 height; + CARD8 width; + CARD8 _pad[2]; +} xiePointStatsReq; + + /* + ** Rotate Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieRotate */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + XieFloatRec angle; + CARD32 width; + CARD32 height; + CARD32 fill[XieK_MaxComponents]; +} xieRotateReq; + + /* + ** Scale Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieScale */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 width; + CARD32 height; +} xieScaleReq; + + /* + ** Translate Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieTranslate */ + CARD16 length; + CARD32 src1_photo_id; + CARD32 src2_photo_id; + CARD32 src_idc_id; + CARD32 dst_photo_id; + CARD32 dst_idc_id; +} xieTranslateReq; + +#ifdef NOT_YET_IMPLEMENTED +/************ NONE OF THE FOLLOWING REQUESTS HAVE BEEN IMPLEMENTED ************/ + /* + ** Display Sequence Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 window_id; + CARD16 frame_count; + CARD16 frame_timing; + CARD8 forward; + CARD8 number_of_pixmaps; +} xieDisplaySeqReq; + +/**************************** END OF UNIMPLEMENTED REQUESTS *******************/ +#endif + +/******************************************************************************* +** Events +*******************************************************************************/ + /* + ** Send Xie Event + */ +typedef struct { + CARD8 type; + CARD8 detail; + CARD16 sequenceNumber; + CARD32 resource_id; + CARD8 _pad[24]; +} xieSendEvent; + +/******************************************************************************* +** Replies +*******************************************************************************/ + /* + ** Reply for Init Session + */ +typedef struct { + INT8 type; + CARD8 success; + CARD16 sequenceNumber; + CARD32 length; + CARD16 major_version; + CARD16 minor_version; + CARD32 service_class; /* not implemented */ + CARD8 _pad[16]; +} xieInitSessionReply; + + /* + ** Reply for Query Events + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD32 event_mask; + CARD8 _pad[20]; +} xieQueryEventsReply; + + /* + ** Reply for Query Operational Defaults + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD8 model; + CARD8 _pad[3]; + CARD32 levels[XieK_MaxComponents]; + CARD8 _pad1[8]; +} xieQueryOpDefaultsReply; + + /* + ** Reply for Query Resource: resource type == Photoflo + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD32 status; + CARD8 _pad[20]; +} xieQueryPhotofloReply; + + /* + ** Reply for Query Resource: resource type == Photo{map|tap} + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD32 width; + CARD32 height; + XieFloatRec aspect_ratio; + CARD8 polarity; + CARD8 pixel_progression; + CARD8 line_progression; + BOOL constrained; + CARD8 component_mapping; + CARD8 component_count; + CARD8 _pad[2]; + CARD32 levels[XieK_MaxComponents]; + CARD32 photo_id; +} xieQueryPhotomapReply; + + /* + ** Reply for Query Resource: resource type == Idc of type XieK_Cpp + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + INT32 x; + INT32 y; + CARD32 photomap_id; + CARD8 _pad[12]; +} xieQueryCppReply; + + /* + ** Reply for Query Resource: resource type == Idc of type XieK_Roi + */ +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + INT32 x; + INT32 y; + CARD32 width; + CARD32 height; + CARD8 _pad[8]; +} xieQueryRoiReply; + + /* + ** Reply for Query Resource: resource type == Idc of type XieK_Tmp + */ +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; /* length of entries: long words */ + INT32 center_x; + INT32 center_y; + CARD32 data_count; /* number of XieTmpEntryRec's to */ + CARD8 _pad[12]; /* follow xieQueryTmpReply as data */ +} xieQueryTmpReply; + + /* + ** Reply for Get Stream + */ +typedef struct { + INT8 type; + CARD8 status; + CARD16 sequenceNumber; + CARD32 length; /* length of image data: longwords */ + CARD32 byte_count; /* image plane data length in bytes */ + CARD8 _pad[20]; +} xieGetStreamReply; + + /* + ** Reply for Get Tile + */ +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; /* length of image data: longwords */ + CARD8 _pad[24]; +} xieGetTileReply; + + /* + ** Reply for QueryExport -- returns LUT and list of allocated pixels + */ +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; /* number of pixels being returned */ + CARD32 pixel_count; + CARD32 lut_id; + CARD8 lut_mapping; + CARD8 _pad[15]; +} xieQueryExportReply; + + /* + ** Reply for CalcHistogram -- returns frequency distribution data + */ +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; /* size of histogram list in longs */ + CARD8 _pad[24]; +} xieCalcHistReply; + + /* + ** Reply for Point Statistics + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD8 _pad[24]; +} xiePointStatsReply; + +/* the following structure is used for Point Statistics */ + +typedef struct { + XieFloatRec pixel; + XieFloatRec minimum; + XieFloatRec maximum; + XieFloatRec mean; + XieFloatRec std_dev; + XieFloatRec variance; +} xiePointStatsData, *xiePointStatsDataPtr; + + +#ifdef NOT_YET_IMPLEMENTED +/************ NONE OF THE FOLLOWING REPLIES HAVE BEEN IMPLEMENTED *************/ + +typedef struct { + CARD16 screen_width_millimeters; + CARD16 screen_height_millimeters; + CARD16 screen_width_pixels; + CARD16 screen_height_pixels; + CARD16 screen_depth; + CARD16 screen_luts_size; + CARD8 screen_number; + CARD8 screen_luts; + CARD8 screen_brightness_control; + CARD8 screen_contrast_control; + CARD8 screen_hue_control; + CARD8 _pad[5]; +} screen_data; + +typedef struct { + CARD32 minimum; + CARD32 maximum; + CARD32 mean; + CARD32 std_dev; + CARD32 variance; +} statistics_data; + +/* Reply for Dot Product */ + +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD32 _pad[6]; +} xieDotProductReply; + +/*** following display stuff may be deleted or expanded */ + +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD8 idc_type; + CARD8 skip_or_show; + CARD32 pixmap; + CARD16 _pad; +} xieSingleStaticReply; + +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD8 idc_type; + CARD8 map_x_tiles; + CARD8 map_y_tiles; + CARD32 current_frame; + CARD32 number_of_display_frames; +} xieSpatialMapReply; + +typedef struct { + CARD32 pixmap; + CARD8 skip_or_show; + CARD8 _pad[3]; +} display_frame; + +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD32 current_frame; + CARD32 number_of_display_frames; + CARD8 idc_type; + CARD8 map_x_tiles; + CARD8 map_y_tiles; + CARD8 _pad[14]; +} xieTimeSequenceReply; + +/**************************** END OF UNIMPLEMENTED REPLIES ********************/ +#endif +/* +** This "endif" MUST be the last line of this file. +*/ +#endif /* end of XIEPROTO -- NO DEFINITIONS ALLOWED BEYOND THIS POINT */ + diff --git a/xie/build/dec/X11/extensions/XieUdpDef.h b/xie/build/dec/X11/extensions/XieUdpDef.h new file mode 100644 index 0000000..44d88ff --- /dev/null +++ b/xie/build/dec/X11/extensions/XieUdpDef.h @@ -0,0 +1,118 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/********************************************************************************************************************************/ +/* Created 23-MAY-1992 03:11:09 by VAX SDL V3.2-12 Source: 12-JUL-1990 18:14:51 VNRESD$:[XIESMI.SRC]XIEUDPDEF.SDL;1 */ +/********************************************************************************************************************************/ +/******************************************************************************* */ +/** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, */ +/** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. */ +/** */ +/** All Rights Reserved */ +/** */ +/** Permission to use, copy, modify, and distribute this software and its */ +/** documentation for any purpose and without fee is hereby granted, */ +/** provided that the above copyright notice appear in all copies and that */ +/** both that copyright notice and this permission notice appear in */ +/** supporting documentation, and that the names of Digital or MIT not be */ +/** used in advertising or publicity pertaining to distribution of the */ +/** software without specific, written prior permission. */ +/** */ +/** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */ +/** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL */ +/** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR */ +/** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, */ +/** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */ +/** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS */ +/** SOFTWARE. */ +/** */ +/******************************************************************************* */ +/******************************************************************************* */ +/** */ +/** FACILITY: */ +/** */ +/** Sample Machine Independant DDX */ +/** X Image Extensions */ +/** */ +/** ABSTRACT: */ +/** */ +/** This include file defines low level image data representation */ +/** structures. */ +/** */ +/** ENVIRONMENT: */ +/** */ +/** VAX/VMS V5.3 */ +/** ULTRIX V3.1 */ +/** */ +/** AUTHOR(S): */ +/** */ +/** John Weber */ +/** */ +/** CREATION DATE: */ +/** */ +/** August 12, 1989 */ +/** */ +/** MODIFICATION HISTORY: */ +/** */ +/******************************************************************************* */ + +/*** MODULE XieUdpDef ***/ +#ifndef UDPDEF +#define UDPDEF +struct UDP { + unsigned short int UdpW_PixelLength; + unsigned char UdpB_DType; + unsigned char UdpB_Class; + unsigned char *UdpA_Base; + unsigned long int UdpL_ArSize; + unsigned long int UdpL_PxlStride; + unsigned long int UdpL_ScnStride; + long int UdpL_X1; + long int UdpL_X2; + long int UdpL_Y1; + long int UdpL_Y2; + unsigned long int UdpL_PxlPerScn; + unsigned long int UdpL_ScnCnt; + long int UdpL_Pos; + unsigned long int UdpL_CompIdx; + unsigned long int UdpL_Levels; + } ; +typedef struct UDP UdpRec, *UdpPtr; +#define UdpK_DTypeUndefined 0 +#define UdpK_DTypeMin 1 +#define UdpK_DTypeBU 1 +#define UdpK_DTypeWU 2 +#define UdpK_DTypeLU 3 +#define UdpK_DTypeF 4 +#define UdpK_DTypeC 5 +#define UdpK_DTypeVU 6 +#define UdpK_DTypeV 7 +#define UdpK_DTypeCL 8 +#define UdpK_DTypeMax 8 +#define UdpK_ClassUBA 1 +#define UdpK_ClassUBS 2 +#define UdpK_ClassA 3 +#define UdpK_ClassCL 4 +#endif /* UDPDEF */ diff --git a/xie/build/dec/XI.h b/xie/build/dec/XI.h new file mode 100644 index 0000000..0c4c44b --- /dev/null +++ b/xie/build/dec/XI.h @@ -0,0 +1,263 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* $Header: /usr/sde/x11/rcs/x11/src/./extensions/include/XI.h,v 1.2 91/12/15 12:42:16 devrcs Exp $ */ + +/************************************************************ +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, California, and the +Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Hewlett-Packard or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +********************************************************/ + +/* Definitions used by the server, library and client */ + +#ifndef _XI_H_ + +#define _XI_H_ + +#define sz_xGetExtensionVersionReq 8 +#define sz_xGetExtensionVersionReply 32 +#define sz_xListInputDevicesReq 4 +#define sz_xListInputDevicesReply 32 +#define sz_xOpenDeviceReq 8 +#define sz_xOpenDeviceReply 32 +#define sz_xCloseDeviceReq 8 +#define sz_xSetDeviceModeReq 8 +#define sz_xSetDeviceModeReply 32 +#define sz_xSelectExtensionEventReq 12 +#define sz_xGetSelectedExtensionEventsReq 8 +#define sz_xGetSelectedExtensionEventsReply 32 +#define sz_xChangeDeviceDontPropagateListReq 12 +#define sz_xGetDeviceDontPropagateListReq 8 +#define sz_xGetDeviceDontPropagateListReply 32 +#define sz_xGetDeviceMotionEventsReq 16 +#define sz_xGetDeviceMotionEventsReply 32 +#define sz_xChangeKeyboardDeviceReq 8 +#define sz_xChangeKeyboardDeviceReply 32 +#define sz_xChangePointerDeviceReq 8 +#define sz_xChangePointerDeviceReply 32 +#define sz_xGrabDeviceReq 20 +#define sz_xGrabDeviceReply 32 +#define sz_xUngrabDeviceReq 12 +#define sz_xGrabDeviceKeyReq 20 +#define sz_xGrabDeviceKeyReply 32 +#define sz_xUngrabDeviceKeyReq 16 +#define sz_xGrabDeviceButtonReq 20 +#define sz_xGrabDeviceButtonReply 32 +#define sz_xUngrabDeviceButtonReq 16 +#define sz_xAllowDeviceEventsReq 12 +#define sz_xGetDeviceFocusReq 8 +#define sz_xGetDeviceFocusReply 32 +#define sz_xSetDeviceFocusReq 16 +#define sz_xGetFeedbackControlReq 8 +#define sz_xGetFeedbackControlReply 32 +#define sz_xChangeFeedbackControlReq 12 +#define sz_xGetDeviceKeyMappingReq 8 +#define sz_xGetDeviceKeyMappingReply 32 +#define sz_xChangeDeviceKeyMappingReq 8 +#define sz_xGetDeviceModifierMappingReq 8 +#define sz_xSetDeviceModifierMappingReq 8 +#define sz_xSetDeviceModifierMappingReply 32 +#define sz_xGetDeviceButtonMappingReq 8 +#define sz_xGetDeviceButtonMappingReply 32 +#define sz_xSetDeviceButtonMappingReq 8 +#define sz_xSetDeviceButtonMappingReply 32 +#define sz_xQueryDeviceStateReq 8 +#define sz_xQueryDeviceStateReply 32 +#define sz_xSendExtensionEventReq 16 +#define sz_xDeviceBellReq 8 +#define sz_xSetDeviceValuatorsReq 8 +#define sz_xSetDeviceValuatorsReply 32 +#define sz_xGetDeviceControlReq 8 +#define sz_xGetDeviceControlReply 32 +#define sz_xChangeDeviceControlReq 8 +#define sz_xChangeDeviceControlReply 32 + +#define INAME "XInputExtension" + +#define XI_KEYBOARD "KEYBOARD" +#define XI_MOUSE "MOUSE" +#define XI_TABLET "TABLET" +#define XI_TOUCHSCREEN "TOUCHSCREEN" +#define XI_TOUCHPAD "TOUCHPAD" +#define XI_BARCODE "BARCODE" +#define XI_BUTTONBOX "BUTTONBOX" +#define XI_KNOB_BOX "KNOB_BOX" +#define XI_ONE_KNOB "ONE_KNOB" +#define XI_NINE_KNOB "NINE_KNOB" +#define XI_TRACKBALL "TRACKBALL" +#define XI_QUADRATURE "QUADRATURE" +#define XI_ID_MODULE "ID_MODULE" +#define XI_SPACEBALL "SPACEBALL" +#define XI_DATAGLOVE "DATAGLOVE" +#define XI_EYETRACKER "EYETRACKER" +#define XI_CURSORKEYS "CURSORKEYS" +#define XI_FOOTMOUSE "FOOTMOUSE" + +#define Dont_Check 0 +#define XInput_Initial_Release 1 +#define XInput_Add_XDeviceBell 2 +#define XInput_Add_XSetDeviceValuators 3 +#define XInput_Add_XChangeDeviceControl 4 + +#define XI_Absent 0 +#define XI_Present 1 + +#define XI_Initial_Release_Major 1 +#define XI_Initial_Release_Minor 0 + +#define XI_Add_XDeviceBell_Major 1 +#define XI_Add_XDeviceBell_Minor 1 + +#define XI_Add_XSetDeviceValuators_Major 1 +#define XI_Add_XSetDeviceValuators_Minor 2 + +#define XI_Add_XChangeDeviceControl_Major 1 +#define XI_Add_XChangeDeviceControl_Minor 3 + +#define DEVICE_RESOLUTION 1 + +#define NoSuchExtension 1 + +#define COUNT 0 +#define CREATE 1 + +#define NewPointer 0 +#define NewKeyboard 1 + +#define XPOINTER 0 +#define XKEYBOARD 1 + +#define UseXKeyboard 0xFF + +#define IsXPointer 0 +#define IsXKeyboard 1 +#define IsXExtensionDevice 2 + +#define AsyncThisDevice 0 +#define SyncThisDevice 1 +#define ReplayThisDevice 2 +#define AsyncOtherDevices 3 +#define AsyncAll 4 +#define SyncAll 5 + +#define FollowKeyboard 3 +#ifndef RevertToFollowKeyboard +#define RevertToFollowKeyboard 3 +#endif + +#define DvAccelNum (1L << 0) +#define DvAccelDenom (1L << 1) +#define DvThreshold (1L << 2) + +#define DvKeyClickPercent (1L<<0) +#define DvPercent (1L<<1) +#define DvPitch (1L<<2) +#define DvDuration (1L<<3) +#define DvLed (1L<<4) +#define DvLedMode (1L<<5) +#define DvKey (1L<<6) +#define DvAutoRepeatMode (1L<<7) + +#define DvString (1L << 0) + +#define DvInteger (1L << 0) + +#define DeviceMode (1L << 0) +#define Relative 0 +#define Absolute 1 + +#define ProximityState (1L << 1) +#define InProximity (0L << 1) +#define OutOfProximity (1L << 1) + +#define AddToList 0 +#define DeleteFromList 1 + +#define KeyClass 0 +#define ButtonClass 1 +#define ValuatorClass 2 +#define FeedbackClass 3 +#define ProximityClass 4 +#define FocusClass 5 +#define OtherClass 6 + +#define KbdFeedbackClass 0 +#define PtrFeedbackClass 1 +#define StringFeedbackClass 2 +#define IntegerFeedbackClass 3 +#define LedFeedbackClass 4 +#define BellFeedbackClass 5 + +#define _devicePointerMotionHint 0 +#define _deviceButton1Motion 1 +#define _deviceButton2Motion 2 +#define _deviceButton3Motion 3 +#define _deviceButton4Motion 4 +#define _deviceButton5Motion 5 +#define _deviceButtonMotion 6 +#define _deviceButtonGrab 7 +#define _deviceOwnerGrabButton 8 +#define _noExtensionEvent 9 + +#define XI_BadDevice 0 +#define XI_BadEvent 1 +#define XI_BadMode 2 +#define XI_DeviceBusy 3 +#define XI_BadClass 4 + +typedef unsigned long XEventClass; + +/******************************************************************* + * + * Extension version structure. + * + */ + +typedef struct { + int present; + short major_version; + short minor_version; +} XExtensionVersion; + +#endif /* _XI_H_ */ diff --git a/xie/build/dec/XInput.h b/xie/build/dec/XInput.h new file mode 100644 index 0000000..a897842 --- /dev/null +++ b/xie/build/dec/XInput.h @@ -0,0 +1,849 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* $Header: /usr/sde/x11/rcs/x11/src/./extensions/include/XInput.h,v 1.2 91/12/15 12:42:16 devrcs Exp $ */ + +/************************************************************ +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, California, and the +Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Hewlett-Packard or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +********************************************************/ + +/* Definitions used by the library and client */ + +#ifndef _XINPUT_H_ +#define _XINPUT_H_ + +#ifndef _XLIB_H_ +#include +#endif + +#ifndef _XI_H_ +#include "XI.h" +#endif + +#define _deviceKeyPress 0 +#define _deviceKeyRelease 1 + +#define _deviceButtonPress 0 +#define _deviceButtonRelease 1 + +#define _deviceMotionNotify 0 + +#define _deviceFocusIn 0 +#define _deviceFocusOut 1 + +#define _proximityIn 0 +#define _proximityOut 1 + +#define _deviceStateNotify 0 +#define _deviceMappingNotify 1 +#define _changeDeviceNotify 2 + +#define FindTypeAndClass(d,type,_class,classid,offset) \ + { int i; XInputClassInfo *ip; \ + type = 0; _class = 0; \ + for (i=0, ip= ((XDevice *) d)->classes; \ + i< ((XDevice *) d)->num_classes; \ + i++, ip++) \ + if (ip->input_class == classid) \ + {type = ip->event_type_base + offset; \ + _class = ((XDevice *) d)->device_id << 8 | type;}} + +#define DeviceKeyPress(d,type,_class) \ + FindTypeAndClass(d, type, _class, KeyClass, _deviceKeyPress) + +#define DeviceKeyRelease(d,type,_class) \ + FindTypeAndClass(d, type, _class, KeyClass, _deviceKeyRelease) + +#define DeviceButtonPress(d,type,_class) \ + FindTypeAndClass(d, type, _class, ButtonClass, _deviceButtonPress) + +#define DeviceButtonRelease(d,type,_class) \ + FindTypeAndClass(d, type, _class, ButtonClass, _deviceButtonRelease) + +#define DeviceMotionNotify(d,type,_class) \ + FindTypeAndClass(d, type, _class, ValuatorClass, _deviceMotionNotify) + +#define DeviceFocusIn(d,type,_class) \ + FindTypeAndClass(d, type, _class, FocusClass, _deviceFocusIn) + +#define DeviceFocusOut(d,type,_class) \ + FindTypeAndClass(d, type, _class, FocusClass, _deviceFocusOut) + +#define ProximityIn(d,type,_class) \ + FindTypeAndClass(d, type, _class, ProximityClass, _proximityIn) + +#define ProximityOut(d,type,_class) \ + FindTypeAndClass(d, type, _class, ProximityClass, _proximityOut) + +#define DeviceStateNotify(d,type,_class) \ + FindTypeAndClass(d, type, _class, OtherClass, _deviceStateNotify) + +#define DeviceMappingNotify(d,type,_class) \ + FindTypeAndClass(d, type, _class, OtherClass, _deviceMappingNotify) + +#define ChangeDeviceNotify(d,type,_class) \ + FindTypeAndClass(d, type, _class, OtherClass, _changeDeviceNotify) + +#define DevicePointerMotionHint(d,type,_class) \ + { _class = ((XDevice *) d)->device_id << 8 | _devicePointerMotionHint;} + +#define DeviceButton1Motion(d,type,_class) \ + { _class = ((XDevice *) d)->device_id << 8 | _deviceButton1Motion;} + +#define DeviceButton2Motion(d,type,_class) \ + { _class = ((XDevice *) d)->device_id << 8 | _deviceButton2Motion;} + +#define DeviceButton3Motion(d,type,_class) \ + { _class = ((XDevice *) d)->device_id << 8 | _deviceButton3Motion;} + +#define DeviceButton4Motion(d,type,class) \ + { _class = ((XDevice *) d)->device_id << 8 | _deviceButton4Motion;} + +#define DeviceButton5Motion(d,type,_class) \ + { _class = ((XDevice *) d)->device_id << 8 | _deviceButton5Motion;} + +#define DeviceButtonMotion(d,type,class) \ + { _class = ((XDevice *) d)->device_id << 8 | _deviceButtonMotion;} + +#define DeviceOwnerGrabButton(d,type,_class) \ + { _class = ((XDevice *) d)->device_id << 8 | _deviceOwnerGrabButton;} + +#define DeviceButtonPressGrab(d,type,_class) \ + { _class = ((XDevice *) d)->device_id << 8 | _deviceButtonGrab;} + +#define NoExtensionEvent(d,type,_class) \ + { _class = ((XDevice *) d)->device_id << 8 | _noExtensionEvent;} + +#define BadDevice(dpy,error) _xibaddevice(dpy, &error) + +#define BadClass(dpy,error) _xibadclass(dpy, &error) + +#define BadEvent(dpy,error) _xibadevent(dpy, &error) + +#define BadMode(dpy,error) _xibadmode(dpy, &error) + +#define DeviceBusy(dpy,error) _xidevicebusy(dpy, &error) + +/*************************************************************** + * + * DeviceKey events. These events are sent by input devices that + * support input class Keys. + * The location of the X pointer is reported in the coordinate + * fields of the x,y and x_root,y_root fields. + * + */ + +typedef struct + { + int type; /* of event */ + unsigned long serial; /* # of last request processed */ + Bool send_event; /* true if from SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window reported relative to */ + XID deviceid; + Window root; /* root window event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* x, y coordinates in event window */ + int x_root; /* coordinates relative to root */ + int y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + unsigned int keycode; /* detail */ + Bool same_screen; /* same screen flag */ + unsigned int device_state; /* device key or button mask */ + unsigned char axes_count; + unsigned char first_axis; + int axis_data[6]; + } XDeviceKeyEvent; + +typedef XDeviceKeyEvent XDeviceKeyPressedEvent; +typedef XDeviceKeyEvent XDeviceKeyReleasedEvent; + +/******************************************************************* + * + * DeviceButton events. These events are sent by extension devices + * that support input class Buttons. + * + */ + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window reported relative to */ + XID deviceid; + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* x, y coordinates in event window */ + int x_root; /* coordinates relative to root */ + int y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + unsigned int button; /* detail */ + Bool same_screen; /* same screen flag */ + unsigned int device_state; /* device key or button mask */ + unsigned char axes_count; + unsigned char first_axis; + int axis_data[6]; + } XDeviceButtonEvent; + +typedef XDeviceButtonEvent XDeviceButtonPressedEvent; +typedef XDeviceButtonEvent XDeviceButtonReleasedEvent; + +/******************************************************************* + * + * DeviceMotionNotify event. These events are sent by extension devices + * that support input class Valuators. + * + */ + +typedef struct + { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window reported relative to */ + XID deviceid; + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* x, y coordinates in event window */ + int x_root; /* coordinates relative to root */ + int y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + char is_hint; /* detail */ + Bool same_screen; /* same screen flag */ + unsigned int device_state; /* device key or button mask */ + unsigned char axes_count; + unsigned char first_axis; + int axis_data[6]; + } XDeviceMotionEvent; + +/******************************************************************* + * + * DeviceFocusChange events. These events are sent when the focus + * of an extension device that can be focused is changed. + * + */ + +typedef struct + { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window reported relative to */ + XID deviceid; + int mode; /* NotifyNormal, NotifyGrab, NotifyUngrab */ + int detail; + /* + * NotifyAncestor, NotifyVirtual, NotifyInferior, + * NotifyNonLinear,NotifyNonLinearVirtual, NotifyPointer, + * NotifyPointerRoot, NotifyDetailNone + */ + Time time; + } XDeviceFocusChangeEvent; + +typedef XDeviceFocusChangeEvent XDeviceFocusInEvent; +typedef XDeviceFocusChangeEvent XDeviceFocusOutEvent; + +/******************************************************************* + * + * ProximityNotify events. These events are sent by those absolute + * positioning devices that are capable of generating proximity information. + * + */ + +typedef struct + { + int type; /* ProximityIn or ProximityOut */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + XID deviceid; + Window root; + Window subwindow; + Time time; + int x, y; + int x_root, y_root; + unsigned int state; + Bool same_screen; + unsigned int device_state; /* device key or button mask */ + unsigned char axes_count; + unsigned char first_axis; + int axis_data[6]; + } XProximityNotifyEvent; +typedef XProximityNotifyEvent XProximityInEvent; +typedef XProximityNotifyEvent XProximityOutEvent; + +/******************************************************************* + * + * DeviceStateNotify events are generated on EnterWindow and FocusIn + * for those clients who have selected DeviceState. + * + */ + +typedef struct + { +#if defined(__cplusplus) || defined(c_plusplus) + unsigned char c_class; +#else + unsigned char class; +#endif + unsigned char length; + } XInputClass; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + XID deviceid; + Time time; + int num_classes; + char data[64]; +} XDeviceStateNotifyEvent; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + unsigned char c_class; +#else + unsigned char class; +#endif + unsigned char length; + unsigned char num_valuators; + unsigned char mode; + int valuators[6]; +} XValuatorStatus; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + unsigned char c_class; +#else + unsigned char class; +#endif + unsigned char length; + short num_keys; + char keys[32]; +} XKeyStatus; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + unsigned char c_class; +#else + unsigned char class; +#endif + unsigned char length; + short num_buttons; + char buttons[32]; +} XButtonStatus; + +/******************************************************************* + * + * DeviceMappingNotify event. This event is sent when the key mapping, + * modifier mapping, or button mapping of an extension device is changed. + * + */ + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* unused */ + XID deviceid; + Time time; + int request; /* one of MappingModifier, MappingKeyboard, + MappingPointer */ + int first_keycode;/* first keycode */ + int count; /* defines range of change w. first_keycode*/ +} XDeviceMappingEvent; + +/******************************************************************* + * + * ChangeDeviceNotify event. This event is sent when an + * XChangeKeyboard or XChangePointer request is made. + * + */ + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* unused */ + XID deviceid; + Time time; + int request; /* NewPointer or NewKeyboard */ +} XChangeDeviceNotifyEvent; + +/******************************************************************* + * + * Control structures for input devices that support input class + * Feedback. These are used by the XGetFeedbackControl and + * XChangeFeedbackControl functions. + * + */ + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; +} XFeedbackState; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int click; + int percent; + int pitch; + int duration; + int led_mask; + int global_auto_repeat; + char auto_repeats[32]; +} XKbdFeedbackState; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int accelNum; + int accelDenom; + int threshold; +} XPtrFeedbackState; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int resolution; + int minVal; + int maxVal; +} XIntegerFeedbackState; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int max_symbols; + int num_syms_supported; + KeySym *syms_supported; +} XStringFeedbackState; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int percent; + int pitch; + int duration; +} XBellFeedbackState; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int led_values; + int led_mask; +} XLedFeedbackState; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; +} XFeedbackControl; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int accelNum; + int accelDenom; + int threshold; +} XPtrFeedbackControl; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int click; + int percent; + int pitch; + int duration; + int led_mask; + int led_value; + int key; + int auto_repeat_mode; +} XKbdFeedbackControl; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int num_keysyms; + KeySym *syms_to_display; +} XStringFeedbackControl; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int int_to_display; +} XIntegerFeedbackControl; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int percent; + int pitch; + int duration; +} XBellFeedbackControl; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int led_mask; + int led_values; +} XLedFeedbackControl; + +/******************************************************************* + * + * Device control structures. + * + */ + +typedef struct { + XID control; + int length; +} XDeviceControl; + +typedef struct { + XID control; + int length; + int first_valuator; + int num_valuators; + int *resolutions; +} XDeviceResolutionControl; + +typedef struct { + XID control; + int length; + int num_valuators; + int *resolutions; + int *min_resolutions; + int *max_resolutions; +} XDeviceResolutionState; + +/******************************************************************* + * + * An array of XDeviceList structures is returned by the + * XListInputDevices function. Each entry contains information + * about one input device. Among that information is an array of + * pointers to structures that describe the characteristics of + * the input device. + * + */ + +typedef struct _XAnyClassinfo *XAnyClassPtr; + +typedef struct _XAnyClassinfo { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + } XAnyClassInfo; + +typedef struct _XDeviceInfo *XDeviceInfoPtr; + +typedef struct _XDeviceInfo + { + XID id; + Atom type; + char *name; + int num_classes; + int use; + XAnyClassPtr inputclassinfo; + } XDeviceInfo; + +typedef struct _XKeyInfo *XKeyInfoPtr; + +typedef struct _XKeyInfo + { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + unsigned short min_keycode; + unsigned short max_keycode; + unsigned short num_keys; + } XKeyInfo; + +typedef struct _XButtonInfo *XButtonInfoPtr; + +typedef struct _XButtonInfo { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + short num_buttons; + } XButtonInfo; + +typedef struct _XAxisInfo *XAxisInfoPtr; + +typedef struct _XAxisInfo { + int resolution; + int min_value; + int max_value; + } XAxisInfo; + +typedef struct _XValuatorInfo *XValuatorInfoPtr; + +typedef struct _XValuatorInfo + { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + unsigned char num_axes; + unsigned char mode; + unsigned long motion_buffer; + XAxisInfoPtr axes; + } XValuatorInfo; + + +/******************************************************************* + * + * An XDevice structure is returned by the XOpenDevice function. + * It contains an array of pointers to XInputClassInfo structures. + * Each contains information about a class of input supported by the + * device, including a pointer to an array of data for each type of event + * the device reports. + * + */ + + +typedef struct { + unsigned char input_class; + unsigned char event_type_base; +} XInputClassInfo; + +typedef struct { + XID device_id; + int num_classes; + XInputClassInfo *classes; +} XDevice; + + +/******************************************************************* + * + * The following structure is used to return information for the + * XGetSelectedExtensionEvents function. + * + */ + +typedef struct { + XEventClass event_type; + XID device; +} XEventList; + +/******************************************************************* + * + * The following structure is used to return motion history data from + * an input device that supports the input class Valuators. + * This information is returned by the XGetDeviceMotionEvents function. + * + */ + +typedef struct { + Time time; + int *data; +} XDeviceTimeCoord; + + +/******************************************************************* + * + * Device state structure. + * This is returned by the XQueryDeviceState request. + * + */ + +typedef struct { + XID device_id; + int num_classes; + XInputClass *data; +} XDeviceState; + +/******************************************************************* + * + * Note that the mode field is a bitfield that reports the Proximity + * status of the device as well as the mode. The mode field should + * be OR'd with the mask DeviceMode and compared with the values + * Absolute and Relative to determine the mode, and should be OR'd + * with the mask ProximityState and compared with the values InProximity + * and OutOfProximity to determine the proximity state. + * + */ + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + unsigned char c_class; +#else + unsigned char class; +#endif + unsigned char length; + unsigned char num_valuators; + unsigned char mode; + int *valuators; +} XValuatorState; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + unsigned char c_class; +#else + unsigned char class; +#endif + unsigned char length; + short num_keys; + char keys[32]; +} XKeyState; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + unsigned char c_class; +#else + unsigned char class; +#endif + unsigned char length; + short num_buttons; + char buttons[32]; +} XButtonState; + +/******************************************************************* + * + * Function definitions. + * + */ + +XDevice *XOpenDevice(); +XDeviceInfo *XListInputDevices(); +XDeviceTimeCoord *XGetDeviceMotionEvents(); +KeySym *XGetDeviceKeyMapping(); +XModifierKeymap *XGetDeviceModifierMapping(); +XFeedbackState *XGetFeedbackControl(); +XExtensionVersion *XGetExtensionVersion(); +XDeviceState *XQueryDeviceState(); +XEventClass *XGetDeviceDontPropagateList(); +#endif /* _XINPUT_H_ */ diff --git a/xie/build/dec/XIproto.h b/xie/build/dec/XIproto.h new file mode 100644 index 0000000..ac4dd00 --- /dev/null +++ b/xie/build/dec/XIproto.h @@ -0,0 +1,1425 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* $Header: /usr/sde/x11/rcs/x11/src/./extensions/include/XIproto.h,v 1.2 91/12/15 12:42:16 devrcs Exp $ */ + +/************************************************************ +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, California, and the +Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Hewlett-Packard or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +********************************************************/ + +#ifndef _XIPROTO_H +#define _XIPROTO_H + +#ifndef NEED_EVENTS +#define NEED_EVENTS +#endif +#ifndef NEED_REPLIES +#define NEED_REPLIES +#endif +#include +#include + +/********************************************************* + * + * number of events, errors, and extension name. + * + */ + +#define MORE_EVENTS 0x80 +#define DEVICE_BITS 0x7F + +#define InputClassBits 0x3F /* bits in mode field for input classes */ +#define ModeBitsShift 6 /* amount to shift the remaining bits */ + +#define numInputClasses 7 + +#define IEVENTS 15 +#define IERRORS 5 + +#define CLIENT_REQ 1 + +typedef struct _XExtEventInfo + { + Mask mask; + BYTE type; + BYTE word; + } XExtEventInfo; + +typedef unsigned char *Pointer; + +struct tmask + { + Mask mask; + Pointer dev; + }; + +/********************************************************* + * + * Event constants used by library. + * + */ + +#define XI_DeviceValuator 0 +#define XI_DeviceKeyPress 1 +#define XI_DeviceKeyRelease 2 +#define XI_DeviceButtonPress 3 +#define XI_DeviceButtonRelease 4 +#define XI_DeviceMotionNotify 5 +#define XI_DeviceFocusIn 6 +#define XI_DeviceFocusOut 7 +#define XI_ProximityIn 8 +#define XI_ProximityOut 9 +#define XI_DeviceStateNotify 10 +#define XI_DeviceMappingNotify 11 +#define XI_ChangeDeviceNotify 12 +#define XI_DeviceKeystateNotify 13 +#define XI_DeviceButtonstateNotify 14 + +/********************************************************* + * + * Protocol request constants + * + */ + +#define X_GetExtensionVersion 1 +#define X_ListInputDevices 2 +#define X_OpenDevice 3 +#define X_CloseDevice 4 +#define X_SetDeviceMode 5 +#define X_SelectExtensionEvent 6 +#define X_GetSelectedExtensionEvents 7 +#define X_ChangeDeviceDontPropagateList 8 +#define X_GetDeviceDontPropagateList 9 +#define X_GetDeviceMotionEvents 10 +#define X_ChangeKeyboardDevice 11 +#define X_ChangePointerDevice 12 +#define X_GrabDevice 13 +#define X_UngrabDevice 14 +#define X_GrabDeviceKey 15 +#define X_UngrabDeviceKey 16 +#define X_GrabDeviceButton 17 +#define X_UngrabDeviceButton 18 +#define X_AllowDeviceEvents 19 +#define X_GetDeviceFocus 20 +#define X_SetDeviceFocus 21 +#define X_GetFeedbackControl 22 +#define X_ChangeFeedbackControl 23 +#define X_GetDeviceKeyMapping 24 +#define X_ChangeDeviceKeyMapping 25 +#define X_GetDeviceModifierMapping 26 +#define X_SetDeviceModifierMapping 27 +#define X_GetDeviceButtonMapping 28 +#define X_SetDeviceButtonMapping 29 +#define X_QueryDeviceState 30 +#define X_SendExtensionEvent 31 +#define X_DeviceBell 32 +#define X_SetDeviceValuators 33 +#define X_GetDeviceControl 34 +#define X_ChangeDeviceControl 35 + +/********************************************************* + * + * Protocol request and reply structures. + * + * GetExtensionVersion. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_GetExtensionVersion */ + CARD16 length B16; + CARD16 nbytes B16; + CARD8 pad1, pad2; +} xGetExtensionVersionReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_GetExtensionVersion */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 major_version B16; + CARD16 minor_version B16; + BOOL present; + CARD8 pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; +} xGetExtensionVersionReply; + +/********************************************************* + * + * ListInputDevices. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_ListInputDevices */ + CARD16 length B16; +} xListInputDevicesReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_ListInputDevices */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 ndevices B32; + CARD8 pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; +} xListInputDevicesReply; + +typedef struct _xDeviceInfo *xDeviceInfoPtr; + +typedef struct _xAnyClassinfo *xAnyClassPtr; + +typedef struct _xAnyClassinfo { + CARD8 class; + CARD8 length; + } xAnyClassInfo; + +typedef struct _xDeviceInfo { + CARD32 type B32; + CARD8 id; + CARD8 num_classes; + CARD8 use; + CARD8 pad1; + } xDeviceInfo; + +typedef struct _xKeyInfo *xKeyInfoPtr; + +typedef struct _xKeyInfo { + CARD8 class; + CARD8 length; + KeyCode min_keycode; + KeyCode max_keycode; + CARD16 num_keys B16; + CARD8 pad1,pad2; + } xKeyInfo; + +typedef struct _xButtonInfo *xButtonInfoPtr; + +typedef struct _xButtonInfo { + CARD8 class; + CARD8 length; + CARD16 num_buttons B16; + } xButtonInfo; + +typedef struct _xValuatorInfo *xValuatorInfoPtr; + +typedef struct _xValuatorInfo { + CARD8 class; + CARD8 length; + CARD8 num_axes; + CARD8 mode; + CARD32 motion_buffer_size B32; + } xValuatorInfo; + +typedef struct _xAxisInfo *xAxisInfoPtr; + +typedef struct _xAxisInfo { + CARD32 resolution B32; + CARD32 min_value B32; + CARD32 max_value B32; + } xAxisInfo; + +/********************************************************* + * + * OpenDevice. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_OpenDevice */ + CARD16 length B16; + CARD8 deviceid; + BYTE pad1, pad2, pad3; +} xOpenDeviceReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_OpenDevice */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 num_classes; + BYTE pad1, pad2, pad3; + CARD32 pad00 B32; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + } xOpenDeviceReply; + +typedef struct { + CARD8 class; + CARD8 event_type_base; + } xInputClassInfo; + +/********************************************************* + * + * CloseDevice. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_CloseDevice */ + CARD16 length B16; + CARD8 deviceid; + BYTE pad1, pad2, pad3; +} xCloseDeviceReq; + +/********************************************************* + * + * SetDeviceMode. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_SetDeviceMode */ + CARD16 length B16; + CARD8 deviceid; + CARD8 mode; + BYTE pad1, pad2; +} xSetDeviceModeReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_SetDeviceMode */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 status; + BYTE pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; +} xSetDeviceModeReply; + +/********************************************************* + * + * SelectExtensionEvent. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_SelectExtensionEvent */ + CARD16 length B16; + Window window B32; + CARD16 count B16; + CARD16 pad00 B16; +} xSelectExtensionEventReq; + +/********************************************************* + * + * GetSelectedExtensionEvent. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* X_GetSelectedExtensionEvents */ + CARD16 length B16; + Window window B32; +} xGetSelectedExtensionEventsReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* GetSelectedExtensionEvents */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 this_client_count B16; + CARD16 all_clients_count B16; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; +} xGetSelectedExtensionEventsReply; + +/********************************************************* + * + * ChangeDeviceDontPropagateList. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* X_ChangeDeviceDontPropagateList */ + CARD16 length B16; + Window window B32; + CARD16 count B16; + CARD8 mode; + BYTE pad; +} xChangeDeviceDontPropagateListReq; + +/********************************************************* + * + * GetDeviceDontPropagateList. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* X_GetDeviceDontPropagateList */ + CARD16 length B16; + Window window B32; +} xGetDeviceDontPropagateListReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* GetDeviceDontPropagateList */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 count B16; + CARD16 pad00 B16; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; + } xGetDeviceDontPropagateListReply; + +/********************************************************* + * + * GetDeviceMotionEvents. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_GetDeviceMotionEvents*/ + CARD16 length B16; + Time start B32; + Time stop B32; + CARD8 deviceid; + BYTE pad1, pad2, pad3; +} xGetDeviceMotionEventsReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_GetDeviceMotionEvents */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 nEvents B32; + CARD8 axes; + CARD8 mode; + BYTE pad1, pad2; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; +} xGetDeviceMotionEventsReply; + +/********************************************************* + * + * ChangeKeyboardDevice. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* X_ChangeKeyboardDevice */ + CARD16 length B16; + CARD8 deviceid; + BYTE pad1, pad2, pad3; +} xChangeKeyboardDeviceReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_ChangeKeyboardDevice*/ + CARD16 sequenceNumber B16; + CARD32 length B32; /* 0 */ + CARD8 status; + BYTE pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; + } xChangeKeyboardDeviceReply; + +/********************************************************* + * + * ChangePointerDevice. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* X_ChangePointerDevice */ + CARD16 length B16; + CARD8 xaxis; + CARD8 yaxis; + CARD8 deviceid; + BYTE pad1; +} xChangePointerDeviceReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_ChangePointerDevice */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* 0 */ + CARD8 status; + BYTE pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; + } xChangePointerDeviceReply; + +/********************************************************* + * + * GrabDevice. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_GrabDevice */ + CARD16 length B16; + Window grabWindow B32; + Time time B32; + CARD16 event_count B16; + CARD8 this_device_mode; + CARD8 other_devices_mode; + BOOL ownerEvents; + CARD8 deviceid; + CARD16 pad01 B16; +} xGrabDeviceReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_GrabDevice */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* 0 */ + CARD8 status; + BYTE pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; + } xGrabDeviceReply; + +/********************************************************* + * + * UngrabDevice. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_UnGrabDevice */ + CARD16 length B16; + Time time B32; + CARD8 deviceid; + BYTE pad1, pad2, pad3; +} xUngrabDeviceReq; + +/********************************************************* + * + * GrabDeviceKey. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_GrabDeviceKey */ + CARD16 length B16; + Window grabWindow B32; + CARD16 event_count B16; + CARD16 modifiers B16; + CARD8 modifier_device; + CARD8 grabbed_device; + CARD8 key; + BYTE this_device_mode; + BYTE other_devices_mode; + BOOL ownerEvents; + BYTE pad1, pad2; +} xGrabDeviceKeyReq; + +/********************************************************* + * + * UngrabDeviceKey. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_UngrabDeviceKey */ + CARD16 length B16; + Window grabWindow B32; + CARD16 modifiers B16; + CARD8 modifier_device; + CARD8 key; + CARD8 grabbed_device; + BYTE pad1, pad2, pad3; +} xUngrabDeviceKeyReq; + +/********************************************************* + * + * GrabDeviceButton. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_GrabDeviceButton */ + CARD16 length B16; + Window grabWindow B32; + CARD8 grabbed_device; + CARD8 modifier_device; + CARD16 event_count B16; + CARD16 modifiers B16; + BYTE this_device_mode; + BYTE other_devices_mode; + CARD8 button; + BOOL ownerEvents; + BYTE pad1, pad2; +} xGrabDeviceButtonReq; + +/********************************************************* + * + * UngrabDeviceButton. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_UngrabDeviceButton */ + CARD16 length B16; + Window grabWindow B32; + CARD16 modifiers B16; + CARD8 modifier_device; + CARD8 button; + CARD8 grabbed_device; + BYTE pad1, pad2, pad3; +} xUngrabDeviceButtonReq; + +/********************************************************* + * + * AllowDeviceEvents. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_AllowDeviceEvents */ + CARD16 length B16; + Time time B32; + CARD8 mode; + CARD8 deviceid; + BYTE pad1, pad2; +} xAllowDeviceEventsReq; + +/********************************************************* + * + * GetDeviceFocus. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_GetDeviceFocus */ + CARD16 length B16; + CARD8 deviceid; + BYTE pad1, pad2, pad3; +} xGetDeviceFocusReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_GetDeviceFocus */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 focus B32; + Time time B32; + CARD8 revertTo; + BYTE pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + } xGetDeviceFocusReply; + +/********************************************************* + * + * SetDeviceFocus. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_SetDeviceFocus */ + CARD16 length B16; + Window focus B32; + Time time B32; + CARD8 revertTo; + CARD8 device; + CARD16 pad01 B16; +} xSetDeviceFocusReq; + +/********************************************************* + * + * GetFeedbackControl. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* X_GetFeedbackControl */ + CARD16 length B16; + CARD8 deviceid; + BYTE pad1, pad2, pad3; +} xGetFeedbackControlReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_GetFeedbackControl */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 num_feedbacks B16; + CARD16 pad01 B16; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; + CARD32 pad06 B32; +} xGetFeedbackControlReply; + +typedef struct { + CARD8 class; /* feedback class */ + CARD8 id; /* feedback id */ + CARD16 length B16; /* feedback length */ +} xFeedbackState; + +typedef struct { + CARD8 class; + CARD8 id; + CARD16 length B16; + CARD16 pitch B16; + CARD16 duration B16; + CARD32 led_mask B32; + CARD32 led_values B32; + BOOL global_auto_repeat; + CARD8 click; + CARD8 percent; + BYTE pad; + BYTE auto_repeats[32]; +} xKbdFeedbackState; + +typedef struct { + CARD8 class; + CARD8 id; + CARD16 length B16; + CARD8 pad1,pad2; + CARD16 accelNum B16; + CARD16 accelDenom B16; + CARD16 threshold B16; +} xPtrFeedbackState; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; + CARD16 length B16; /* feedback length */ + CARD32 resolution B32; + INT32 min_value B32; + INT32 max_value B32; +} xIntegerFeedbackState; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; + CARD16 length B16; /* feedback length */ + CARD16 max_symbols B16; + CARD16 num_syms_supported B16; +} xStringFeedbackState; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; + CARD16 length B16; /* feedback length */ + CARD8 percent; + BYTE pad1, pad2, pad3; + CARD16 pitch B16; + CARD16 duration B16; +} xBellFeedbackState; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; + CARD16 length B16; /* feedback length */ + CARD32 led_mask B32; + CARD32 led_values B32; +} xLedFeedbackState; + +/********************************************************* + * + * ChangeFeedbackControl. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* X_ChangeFeedbackControl */ + CARD16 length B16; + CARD32 mask B32; + CARD8 deviceid; + CARD8 feedbackid; + BYTE pad1, pad2; +} xChangeFeedbackControlReq; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; /* feedback id */ + CARD16 length B16; /* feedback length */ +} xFeedbackCtl; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; /* feedback length */ + CARD16 length B16; /* feedback length */ + KeyCode key; + CARD8 auto_repeat_mode; + INT8 click; + INT8 percent; + INT16 pitch B16; + INT16 duration B16; + CARD32 led_mask B32; + CARD32 led_values B32; +} xKbdFeedbackCtl; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; /* feedback id */ + CARD16 length B16; /* feedback length */ + CARD8 pad1,pad2; + INT16 num B16; + INT16 denom B16; + INT16 thresh B16; +} xPtrFeedbackCtl; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; /* feedback id */ + CARD16 length B16; /* feedback length */ + INT32 int_to_display B32; +} xIntegerFeedbackCtl; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; /* feedback id */ + CARD16 length B16; /* feedback length */ + CARD8 pad1,pad2; + CARD16 num_keysyms B16; +} xStringFeedbackCtl; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; /* feedback id */ + CARD16 length B16; /* feedback length */ + INT8 percent; + BYTE pad1, pad2, pad3; + INT16 pitch B16; + INT16 duration B16; +} xBellFeedbackCtl; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; /* feedback id */ + CARD16 length B16; /* feedback length */ + CARD32 led_mask B32; + CARD32 led_values B32; +} xLedFeedbackCtl; + +/********************************************************* + * + * GetDeviceKeyMapping. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_GetDeviceKeyMapping */ + CARD16 length B16; + CARD8 deviceid; + KeyCode firstKeyCode; + CARD8 count; + BYTE pad1; +} xGetDeviceKeyMappingReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_GetDeviceKeyMapping */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 keySymsPerKeyCode; + CARD8 pad0; + CARD16 pad1 B16; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xGetDeviceKeyMappingReply; + +/********************************************************* + * + * ChangeDeviceKeyMapping. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_ChangeDeviceKeyMapping */ + CARD16 length B16; + CARD8 deviceid; + KeyCode firstKeyCode; + CARD8 keySymsPerKeyCode; + CARD8 keyCodes; +} xChangeDeviceKeyMappingReq; + +/********************************************************* + * + * GetDeviceModifierMapping. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_GetDeviceModifierMapping */ + CARD16 length B16; + CARD8 deviceid; + BYTE pad1, pad2, pad3; +} xGetDeviceModifierMappingReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_GetDeviceModifierMapping */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 numKeyPerModifier; + CARD8 pad0; + CARD16 pad1 B16; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xGetDeviceModifierMappingReply; + +/********************************************************* + * + * SetDeviceModifierMapping. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_SetDeviceModifierMapping */ + CARD16 length B16; + CARD8 deviceid; + CARD8 numKeyPerModifier; + CARD16 pad1 B16; +} xSetDeviceModifierMappingReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_SetDeviceModifierMapping */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 success; + CARD8 pad0; + CARD16 pad1 B16; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xSetDeviceModifierMappingReply; + +/********************************************************* + * + * GetDeviceButtonMapping. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* X_GetDeviceButtonMapping */ + CARD16 length B16; + CARD8 deviceid; + BYTE pad1, pad2, pad3; +} xGetDeviceButtonMappingReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_GetDeviceButtonMapping */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 nElts; + BYTE pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; +} xGetDeviceButtonMappingReply; + +/********************************************************* + * + * SetDeviceButtonMapping. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* X_SetDeviceButtonMapping */ + CARD16 length B16; + CARD8 deviceid; + CARD8 map_length; + BYTE pad1, pad2; +} xSetDeviceButtonMappingReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_SetDeviceButtonMapping */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 status; + BYTE pad0; + CARD16 pad1 B16; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xSetDeviceButtonMappingReply; + +/********************************************************* + * + * QueryDeviceState. + * + */ + +typedef struct { + CARD8 reqType; + CARD8 ReqType; /* always X_QueryDeviceState */ + CARD16 length B16; + CARD8 deviceid; + BYTE pad1, pad2, pad3; +} xQueryDeviceStateReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_QueryDeviceState */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 num_classes; + BYTE pad0; + CARD16 pad1 B16; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xQueryDeviceStateReply; + +typedef struct { + CARD8 class; + CARD8 length; + CARD8 num_keys; + BYTE pad1; + CARD8 keys[32]; +} xKeyState; + +typedef struct { + CARD8 class; + CARD8 length; + CARD8 num_buttons; + BYTE pad1; + CARD8 buttons[32]; +} xButtonState; + +typedef struct { + CARD8 class; + CARD8 length; + CARD8 num_valuators; + CARD8 mode; +} xValuatorState; + +/********************************************************* + * + * SendExtensionEvent. + * THIS REQUEST MUST BE KEPT A MULTIPLE OF 8 BYTES IN LENGTH! + * MORE EVENTS MAY FOLLOW AND THEY MUST BE QUAD-ALIGNED! + * + */ + +typedef struct { + CARD8 reqType; + CARD8 ReqType; /* always X_SendExtensionEvent */ + CARD16 length B16; + Window destination B32; + CARD8 deviceid; + BOOL propagate; + CARD16 count B16; + CARD8 num_events; + BYTE pad1,pad2,pad3; +} xSendExtensionEventReq; + +/********************************************************* + * + * DeviceBell. + * + */ + +typedef struct { + CARD8 reqType; + CARD8 ReqType; /* always X_DeviceBell */ + CARD16 length B16; + CARD8 deviceid; + CARD8 feedbackid; + CARD8 feedbackclass; + INT8 percent; +} xDeviceBellReq; + +/********************************************************* + * + * SetDeviceValuators. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_SetDeviceValuators */ + CARD16 length B16; + CARD8 deviceid; + CARD8 first_valuator; + CARD8 num_valuators; + BYTE pad1; +} xSetDeviceValuatorsReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_SetDeviceValuators */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 status; + BYTE pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; +} xSetDeviceValuatorsReply; + +/********************************************************* + * + * GetDeviceControl. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_GetDeviceControl */ + CARD16 length B16; + CARD16 control B16; + CARD8 deviceid; + BYTE pad2; +} xGetDeviceControlReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_GetDeviceControl */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 status; + BYTE pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; +} xGetDeviceControlReply; + +typedef struct { + CARD16 control B16; /* control type */ + CARD16 length B16; /* control length */ +} xDeviceState; + +typedef struct { + CARD16 control B16; /* control type */ + CARD16 length B16; /* control length */ + CARD32 num_valuators B32; /* number of valuators */ +} xDeviceResolutionState; + +/********************************************************* + * + * ChangeDeviceControl. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_ChangeDeviceControl */ + CARD16 length B16; + CARD16 control B16; + CARD8 deviceid; + CARD8 num_valuators; +} xChangeDeviceControlReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_ChangeDeviceControl */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 status; + BYTE pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; +} xChangeDeviceControlReply; + +typedef struct { + CARD16 control B16; /* control type */ + CARD16 length B16; /* control length */ +} xDeviceCtl; + +typedef struct { + CARD16 control B16; /* control type */ + CARD16 length B16; /* control length */ + CARD8 first_valuator; /* first valuator to change */ + CARD8 num_valuators; /* number of valuators to change*/ + CARD8 pad1,pad2; +} xDeviceResolutionCtl; + +/********************************************************** + * + * Input extension events. + * + * DeviceValuator + * + */ + +typedef struct + { + BYTE type; + CARD8 deviceid; + CARD16 sequenceNumber B16; + KeyButMask device_state B16; + CARD8 num_valuators; + CARD8 first_valuator; + INT32 valuator0 B32; + INT32 valuator1 B32; + INT32 valuator2 B32; + INT32 valuator3 B32; + INT32 valuator4 B32; + INT32 valuator5 B32; + } deviceValuator; + +/********************************************************** + * + * DeviceKeyButtonPointer. + * + * Used for: DeviceKeyPress, DeviceKeyRelease, + * DeviceButtonPress, DeviceButtonRelease, + * ProximityIn, ProximityOut + * DeviceMotionNotify, + * + */ + +typedef struct + { + BYTE type; + BYTE detail; + CARD16 sequenceNumber B16; + Time time B32; + Window root B32; + Window event B32; + Window child B32; + INT16 root_x B16; + INT16 root_y B16; + INT16 event_x B16; + INT16 event_y B16; + KeyButMask state B16; + BOOL same_screen; + CARD8 deviceid; + } deviceKeyButtonPointer; + +/********************************************************** + * + * DeviceFocus. + * + */ + +typedef struct + { + BYTE type; + BYTE detail; + CARD16 sequenceNumber B16; + Time time B32; + Window window B32; + BYTE mode; + CARD8 deviceid; + BYTE pad1, pad2; + CARD32 pad00 B32; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + } deviceFocus; + +/********************************************************** + * + * DeviceStateNotify. + * + * Note that the two high-order bits in the classes_reported + * field are the proximity state (InProximity or OutOfProximity), + * and the device mode (Absolute or Relative), respectively. + * + */ + +typedef struct + { + BYTE type; + BYTE deviceid; + CARD16 sequenceNumber B16; + Time time B32; + CARD8 num_keys; + CARD8 num_buttons; + CARD8 num_valuators; + CARD8 classes_reported; + CARD8 buttons[4]; + CARD8 keys[4]; + INT32 valuator0 B32; + INT32 valuator1 B32; + INT32 valuator2 B32; + } deviceStateNotify; + +/********************************************************** + * + * DeviceKeyStateNotify. + * + */ + +typedef struct + { + BYTE type; + BYTE deviceid; + CARD16 sequenceNumber B16; + CARD8 keys[28]; + } deviceKeyStateNotify; + +/********************************************************** + * + * DeviceButtonStateNotify. + * + */ + +typedef struct + { + BYTE type; + BYTE deviceid; + CARD16 sequenceNumber B16; + CARD8 buttons[28]; + } deviceButtonStateNotify; + +/********************************************************** + * + * DeviceMappingNotify. + * Fields must be kept in sync with core mappingnotify event. + * + */ + +typedef struct + { + BYTE type; + BYTE deviceid; + CARD16 sequenceNumber B16; + CARD8 request; + KeyCode firstKeyCode; + CARD8 count; + BYTE pad1; + Time time B32; + CARD32 pad00 B32; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + } deviceMappingNotify; + +/********************************************************** + * + * ChangeDeviceNotify. + * + */ + +typedef struct + { + BYTE type; + BYTE deviceid; + CARD16 sequenceNumber B16; + Time time B32; + CARD8 request; + BYTE pad1, pad2, pad3; + CARD32 pad00 B32; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + } changeDeviceNotify; + +#endif diff --git a/xie/build/dec/XShm.h b/xie/build/dec/XShm.h new file mode 100644 index 0000000..485fb87 --- /dev/null +++ b/xie/build/dec/XShm.h @@ -0,0 +1,174 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/************************************************************ +Copyright 1989 by The Massachusetts Institute of Technology + +Permission to use, copy, modify, and distribute this +software and its documentation for any purpose and without +fee is hereby granted, provided that the above copyright +no- tice appear in all copies and that both that copyright +no- tice and this permission notice appear in supporting +docu- mentation, and that the name of MIT not be used in +advertising or publicity pertaining to distribution of the +software without specific prior written permission. +M.I.T. makes no representation about the suitability of +this software for any purpose. It is provided "as is" +without any express or implied warranty. + +********************************************************/ + +/* THIS IS NOT AN X CONSORTIUM STANDARD */ + +/* $XConsortium: XShm.h,v 1.5 91/07/12 09:54:34 rws Exp $ */ + +#ifndef _XSHM_H_ +#define _XSHM_H_ + +#include + +#define X_ShmQueryVersion 0 +#define X_ShmAttach 1 +#define X_ShmDetach 2 +#define X_ShmPutImage 3 +#define X_ShmGetImage 4 +#define X_ShmCreatePixmap 5 + +#define ShmCompletion 0 +#define ShmNumberEvents (ShmCompletion + 1) + +#define BadShmSeg 0 +#define ShmNumberErrors (BadShmSeg + 1) + +typedef unsigned int ShmSeg; + +#ifndef _XSHM_SERVER_ +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came frome a SendEvent request */ + Display *display; /* Display the event was read from */ + Drawable drawable; /* drawable of request */ + int major_code; /* ShmReqCode */ + int minor_code; /* X_ShmPutImage */ + ShmSeg shmseg; /* the ShmSeg used in the request */ + unsigned long offset; /* the offset into ShmSeg used in the request */ +} XShmCompletionEvent; + +typedef struct { + ShmSeg shmseg; /* resource id */ + int shmid; /* kernel id */ + char *shmaddr; /* address in client */ + Bool readOnly; /* how the server should attach it */ +} XShmSegmentInfo; + +_XFUNCPROTOBEGIN + +Bool XShmQueryVersion( +#if NeedFunctionPrototypes + Display* /* dpy */, + int* /* majorVersion */, + int* /* minorVersion */, + Bool* /* sharedPixmaps */ +#endif +); + +int XShmPixmapFormat( +#if NeedFunctionPrototypes + Display* /* dpy */ +#endif +); + +Status XShmAttach( +#if NeedFunctionPrototypes + Display* /* dpy */, + XShmSegmentInfo* /* shminfo */ +#endif +); + +Status XShmDetach( +#if NeedFunctionPrototypes + Display* /* dpy */, + XShmSegmentInfo* /* shminfo */ +#endif +); + +Status XShmPutImage( +#if NeedFunctionPrototypes + Display* /* dpy */, + Drawable /* d */, + GC /* gc */, + XImage* /* image */, + int /* src_x */, + int /* src_y */, + int /* dst_x */, + int /* dst_y */, + unsigned int /* src_width */, + unsigned int /* src_height */, + Bool /* send_event */ +#endif +); + +Status XShmGetImage( +#if NeedFunctionPrototypes + Display* /* dpy */, + Drawable /* d */, + XImage* /* image */, + int /* x */, + int /* y */, + unsigned long /* plane_mask */ +#endif +); + +XImage *XShmCreateImage( +#if NeedFunctionPrototypes + Display* /* dpy */, + Visual* /* visual */, + unsigned int /* depth */, + int /* format */, + char* /* data */, + XShmSegmentInfo* /* shminfo */, + unsigned int /* width */, + unsigned int /* height */ +#endif +); + +Pixmap XShmCreatePixmap( +#if NeedFunctionPrototypes + Display* /* dpy */, + Drawable /* d */, + char* /* data */, + XShmSegmentInfo* /* shminfo */, + unsigned int /* width */, + unsigned int /* height */, + unsigned int /* depth */ +#endif +); + +_XFUNCPROTOEND + +#endif + +#endif diff --git a/xie/build/dec/XTest.h b/xie/build/dec/XTest.h new file mode 100644 index 0000000..0e7a71f --- /dev/null +++ b/xie/build/dec/XTest.h @@ -0,0 +1,151 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* $XConsortium: XTest.h,v 1.4 92/04/20 13:13:54 rws Exp $ */ +/* + +Copyright 1992 by the Massachusetts Institute of Technology + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation, and that the name of M.I.T. not be used in advertising or +publicity pertaining to distribution of the software without specific, +written prior permission. M.I.T. makes no representations about the +suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +*/ + +#ifndef _XTEST_H_ +#define _XTEST_H_ + +#include + +#define X_XTestGetVersion 0 +#define X_XTestCompareCursor 1 +#define X_XTestFakeInput 2 + +#define XTestNumberEvents 0 + +#define XTestNumberErrors 0 + +#define XTestMajorVersion 2 +#define XTestMinorVersion 1 + +#define XTestExtensionName "XTEST" + +#ifndef _XTEST_SERVER_ + +_XFUNCPROTOBEGIN + +Bool XTestQueryExtension( +#if NeedFunctionPrototypes + Display* /* dpy */, + int* /* event_basep */, + int* /* error_basep */, + int* /* majorp */, + int* /* minorp */ +#endif +); + +Bool XTestCompareCursorWithWindow( +#if NeedFunctionPrototypes + Display* /* dpy */, + Window /* window */, + Cursor /* cursor */ +#endif +); + +Bool XTestCompareCurrentCursorWithWindow( +#if NeedFunctionPrototypes + Display* /* dpy */, + Window /* window */ +#endif +); + +extern XTestFakeKeyEvent( +#if NeedFunctionPrototypes + Display* /* dpy */, + unsigned int /* keycode */, + Bool /* is_press */, + unsigned long /* delay */ +#endif +); + +extern XTestFakeButtonEvent( +#if NeedFunctionPrototypes + Display* /* dpy */, + unsigned int /* button */, + Bool /* is_press */, + unsigned long /* delay */ +#endif +); + +extern XTestFakeMotionEvent( +#if NeedFunctionPrototypes + Display* /* dpy */, + int /* screen */, + int /* x */, + int /* y */, + unsigned long /* delay */ +#endif +); + +extern XTestFakeRelativeMotionEvent( +#if NeedFunctionPrototypes + Display* /* dpy */, + int /* x */, + int /* y */, + unsigned long /* delay */ +#endif +); + +void XTestSetGContextOfGC( +#if NeedFunctionPrototypes + GC /* gc */, + GContext /* gid */ +#endif +); + +void XTestSetVisualIDOfVisual( +#if NeedFunctionPrototypes + Visual* /* visual */, + VisualID /* visualid */ +#endif +); + +Status XTestDiscard( +#if NeedFunctionPrototypes + Display* /* dpy */ +#endif +); + +_XFUNCPROTOEND + +#endif /* _XTEST_SERVER_ */ + +#endif diff --git a/xie/build/dec/Xext.h b/xie/build/dec/Xext.h new file mode 100644 index 0000000..0e277f2 --- /dev/null +++ b/xie/build/dec/Xext.h @@ -0,0 +1,74 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* + * $XConsortium: Xext.h,v 1.2 91/07/12 10:28:17 rws Exp $ + * + * Copyright 1989 Massachusetts Institute of Technology + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _XEXT_H_ +#define _XEXT_H_ + +#include + +_XFUNCPROTOBEGIN + +extern int (*XSetExtensionErrorHandler())( +#if NeedFunctionPrototypes + int (*handler)() +#endif +); + +extern int XMissingExtension( +#if NeedFunctionPrototypes + Display* /* dpy */, + _Xconst char* /* ext_name */ +#endif +); + +_XFUNCPROTOEND + +#define X_EXTENSION_UNKNOWN "unknown" +#define X_EXTENSION_MISSING "missing" + +#endif /* _XEXT_H_ */ diff --git a/xie/build/dec/XieAppl.h b/xie/build/dec/XieAppl.h new file mode 100644 index 0000000..1908e40 --- /dev/null +++ b/xie/build/dec/XieAppl.h @@ -0,0 +1,295 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/******************************************************************************* +** Copyright 1989-1991 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Image Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** The Xie module contains definitions used by all of the XIE layers +** -- from the applications level through the XIE server levels. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Richard J. Piccolo +** Robert NC Shelley +** +** CREATION DATE: +** +** April 20, 1989 +** +************************************************************************/ + + /* + ** Symbol XIEAPPL allows XieAppl.h to be included multiple times. + */ +#ifndef XIEAPPL +#define XIEAPPL /* The "endif" MUST be the last line of this file. */ + +/***************************************************************************** +** Constants +*****************************************************************************/ + /* + ** X Image Extension name string + */ +#define XieS_Name "Xie" + + /* + ** Number of supported Events and Errors + */ +#define XieK_NumErrors 0 +#define XieK_NumEvents 3 + /* + ** Xie Event constants + */ +#define XieK_ComputationEvent 0 +#define XieK_PhotofloEvent 1 +#define XieK_DisplayEvent 2 + /* + ** Xie Event masks + */ +#define XieM_ComputationEvent (1< +#else +#include +#endif +#endif /* XIEAPPL */ + +/* +** MACRO definitions +*/ + /* + ** Return the minimum number of bits required to contain the specified + ** number of levels. Levels == 0 indicates unconstrained data of type + ** float. <<<< remember to include math.h >>>> + */ +#define BitsFromLevels_(levels) \ + ((levels) > 2 ? ((int)(ceil(log10((double)levels)/log10(2.0)))) : \ + (levels) > 0 ? 1 : sizeof(float) * 8) + /* + ** Determine if a value is a valid pointer or an error code. + ** <<<< remember to include X.h >>>> + */ +#ifdef BadImplementation +#define IsPointer_(ptr) (((unsigned long)(ptr)) > BadImplementation) +#endif + /* + ** Convenience macros for accessing generic UdpPtr fields. + */ +#define upPxlLen_(udp) ((udp)->UdpW_PixelLength) +#define upDType_(udp) ((udp)->UdpB_DType) +#define upClass_(udp) ((udp)->UdpB_Class) +#define upBase_(udp) ((udp)->UdpA_Base) +#define upArSize_(udp) ((udp)->UdpL_ArSize) +#define upPxlStr_(udp) ((udp)->UdpL_PxlStride) +#define upScnStr_(udp) ((udp)->UdpL_ScnStride) +#define upX1_(udp) ((udp)->UdpL_X1) +#define upX2_(udp) ((udp)->UdpL_X2) +#define upY1_(udp) ((udp)->UdpL_Y1) +#define upY2_(udp) ((udp)->UdpL_Y2) +#define upWidth_(udp) ((udp)->UdpL_PxlPerScn) +#define upHeight_(udp) ((udp)->UdpL_ScnCnt) +#define upPos_(udp) ((udp)->UdpL_Pos) +#define upCmpIdx_(udp) ((udp)->UdpL_CompIdx) +#define upLvl_(udp) ((udp)->UdpL_Levels) + /* + ** Convenience macros for accessing generic UdpRec fields. + */ +#define urPxlLen_(udp) ((udp).UdpW_PixelLength) +#define urDType_(udp) ((udp).UdpB_DType) +#define urClass_(udp) ((udp).UdpB_Class) +#define urBase_(udp) ((udp).UdpA_Base) +#define urArSize_(udp) ((udp).UdpL_ArSize) +#define urPxlStr_(udp) ((udp).UdpL_PxlStride) +#define urScnStr_(udp) ((udp).UdpL_ScnStride) +#define urX1_(udp) ((udp).UdpL_X1) +#define urX2_(udp) ((udp).UdpL_X2) +#define urY1_(udp) ((udp).UdpL_Y1) +#define urY2_(udp) ((udp).UdpL_Y2) +#define urWidth_(udp) ((udp).UdpL_PxlPerScn) +#define urHeight_(udp) ((udp).UdpL_ScnCnt) +#define urPos_(udp) ((udp).UdpL_Pos) +#define urCmpIdx_(udp) ((udp).UdpL_CompIdx) +#define urLvl_(udp) ((udp).UdpL_Levels) + + /* + ** The _MD forms access memory in machine-dependant (bigendian or + ** littleendian) format. The other forms access memory in + ** image format, which is always little endian. + */ +#ifdef vax +#define READ32_(address) \ + (*((int *)(address))) +#define READ32_MD READ32_ +#else + /* + ** For machine architectures that can't access longwords + ** on non-longword aligned boundaries. + ** The (unsigned int) casts seem redundant, but they are needed + ** to make the ULTRIX/RISC compiler happy. + */ +#define READ32_(address) \ + ((unsigned int) *((unsigned char *)(address)) + \ + ((unsigned int) *(((unsigned char *)(address))+1)<< 8) + \ + ((unsigned int) *(((unsigned char *)(address))+2)<<16) + \ + ((unsigned int) *(((unsigned char *)(address))+3)<<24)) +#endif + +#ifdef BIGENDIAN +#define READ32_MD(address) \ + (*(((unsigned char *)(address))+3) + \ + (*(((unsigned char *)(address))+2)<< 8) + \ + (*(((unsigned char *)(address))+1)<<16) + \ + (* ((unsigned char *)(address)) <<24)) +#else +#define READ32_MD READ32_ +#endif + +#define GET_VALUE_(base,offset,mask) \ + (READ32_((base)+((offset)>>3))>>((offset)&7)&(mask)) +#define GET_VALUE_MD(base,offset,mask) \ + (READ32_MD((base)+((offset)>>3))>>((offset)&7)&(mask)) + +#ifdef vax +#define WRITE32_(address,value) \ + (*((int *)(address)) = (int)(value)) +#define WRITE32_MD WRITE32_ +#else +#define WRITE32_(address,value) \ + ((* ((unsigned char *)(address)) = ((int)(value)) &0xff), \ + (*(((unsigned char *)(address))+1) = (((int)(value))>> 8)&0xff), \ + (*(((unsigned char *)(address))+2) = (((int)(value))>>16)&0xff), \ + (*(((unsigned char *)(address))+3) = (((int)(value))>>24)&0xff)) +#ifdef BIGENDIAN +#define WRITE32_MD(address,value) \ + ((*(((unsigned char *)(address))+3) = ((int)(value)) &0xff), \ + (*(((unsigned char *)(address))+2) = (((int)(value))>> 8)&0xff), \ + (*(((unsigned char *)(address))+1) = (((int)(value))>>16)&0xff), \ + (* ((unsigned char *)(address)) = (((int)(value))>>24)&0xff)) +#else +#define WRITE32_MD WRITE32_ +#endif +#endif + +#ifdef vax +#define XOR_WRITE32_(address,value) \ + (*((int *)(address)) ^= (int)(value)) +#define XOR_WRITE32_MD XOR_WRITE32_ +#else +#define XOR_WRITE32_(address,value) \ + ((* ((unsigned char *)(address)) ^= ((int)(value)) &0xff), \ + (*(((unsigned char *)(address))+1) ^= (((int)(value))>> 8)&0xff), \ + (*(((unsigned char *)(address))+2) ^= (((int)(value))>>16)&0xff), \ + (*(((unsigned char *)(address))+3) ^= (((int)(value))>>24)&0xff)) +#ifdef BIGENDIAN +#define XOR_WRITE32_MD(address,value) \ + ((*(((unsigned char *)(address))+3) ^= ((int)(value)) &0xff), \ + (*(((unsigned char *)(address))+2) ^= (((int)(value))>> 8)&0xff), \ + (*(((unsigned char *)(address))+1) ^= (((int)(value))>>16)&0xff), \ + (*(((unsigned char *)(address)) ^= (((int)(value))>>24)&0xff)) +#else +#define XOR_WRITE32_MD XOR_WRITE32_ +#endif +#endif + +#define PUT_VALUE_(base,offset,value,mask) \ + (WRITE32_((base)+((offset)>>3), \ + READ32_((base)+((offset)>>3)) & ~((mask)<<((offset)&7)) \ + | (((mask)&(value))<<((offset)&0x7)))) + +#define PUT_VALUE_MD(base,offset,value,mask) \ + (WRITE32_MD((base)+((offset)>>3), \ + READ32_MD((base)+((offset)>>3)) & ~((mask)<<((offset)&7)) \ + | (((mask)&(value))<<((offset)&0x7)))) + + + /* + ** Degrees to radians conversion factor -- with inverted Y axis. + */ +#define RADIANS_PER_DEGREE -0.0174532925199432959 + /* + ** These symbols define valid UdpRec data type and class combinations. + */ +#define XieK_UBAVU 0 /* unaligned bit array */ +#define XieK_UBAV 1 /* unaligned bit array that is aligned ?? */ +#define XieK_UBSVU 2 /* unaligned bit stream */ +#define XieK_UBSV 3 /* unaligned bit stream that is aligned ?? */ +#define XieK_CLCL 4 /* change list */ +#define XieK_ABU 5 /* aligned byte array */ +#define XieK_AF 6 /* aligned float array */ +#define XieK_AWU 7 /* aligned word array */ +/* Not yet implemented +#define XieK_ALU 8 +*/ +#define XieK_DATA_TYPE_COUNT 8 + + /* + ** Defs for DDX table entry points + */ +#ifndef externalref +#if (defined(VMS) && defined(VAXC)) +#define externalref globalref +#else +#define externalref extern +#endif +#endif + + /* + ** Typedefs + */ +typedef unsigned long card32; +typedef unsigned long (*Fcard32)(); /* Used in DDX dispatch table */ + + /* + ** Data structures for passing Template IDC (kernel) data to DDX + ** routines. + */ +typedef struct { + float value; /* A template value */ + long int increment; /* Number of kernel elements skipped + * between previous and this element, + * plus 1. Zero marks end of row */ +} TmpDatEntryRec, *TmpDatEntryPtr; + +typedef struct { + long int center_x; /* Template center X coordinate */ + long int center_y; /* Template center Y coordinate */ + long int x_count; /* Template x dimension */ + long int y_count; /* Template y dimension */ + TmpDatEntryPtr array; /* Pointer to the template data + * records */ +} TmpDatRec, *TmpDatPtr; + +/***************************************************************************** +** +** Xie Ddx Index - +** +** FUNCTIONAL DESCRIPTION: +** +** The following symbols define the indices into the dispatch table +** used to call "atomic" DDX functions. These functions include both +** processing routines for the protocol functions and DDX support +** routines. +** +** WARNING: The indices here AND the order of the XieDdxProc table +** in SmiDdx.c MUST match. +** +*****************************************************************************/ + /* + ** Protocol processing routines + */ +#define D_dxArea 0 /* Protocol functions */ +#define D_dxStatsArea 1 +#define D_dxArith 2 +#define D_dxHistogram 3 +#define D_dxChromeCom 4 +#define D_dxChromeSep 5 +#define D_dxCompare 6 +#define D_dxConstrain 7 +#define D_dxCrop 8 +#define D_dxDither 9 +#define D_dxFill 10 +#define D_dxLogical 11 +#define D_dxLuminance 12 +#define D_dxMatchHistogram 13 +#define D_dxMath 14 +#define D_dxMirror 15 +#define D_dxPoint 16 +#define D_dxStatsPoint 17 +#define D_dxRotate 18 +#define D_dxScale 19 +#define D_dxTranslate 20 +#define D_dxRmOwnData 21 + /* 21..32 -- was Compression handlers */ + /* + ** DDX specific function indices + */ +#define D_dxInit 33 /* DDX Init routine */ +#define D_dxReset 34 /* " Reset */ +#define D_dxOptimizePipe 35 /* " Pipeline optimizer */ +#define D_dxConvert 36 /* Udp support routines */ +#define D_dxCopy 37 +#define D_dxGetTyp 38 +#define D_dxCopyBits 39 +#define D_dxResolveUdp 40 +#define D_dxCalloc 41 /* Memory mgt routines */ +#define D_dxCallocBits 42 +#define D_dxCfree 43 +#define D_dxFree 44 +#define D_dxFreeBits 45 +#define D_dxMalloc 46 +#define D_dxMallocBits 47 +#define D_dxRealloc 48 +#define D_dxReallocBits 49 +#define D_dxCreatePipeline 50 /* Pipeline routines */ +#define D_dxDestroyPipeline 51 +#define D_dxPipeHasYielded 52 /* was D_dxExecutePipeline */ +#define D_dxInitiatePipeline 53 +#define D_dxResumePipeline 54 +#define D_dxFlushPipeline 55 +#define D_dxAbortPipeline 56 +#define D_dxRmAllocData 57 /* Pipe resource mgr routines */ +#define D_dxRmAllocDataDesc 58 +#define D_dxRmAllocPermDesc 59 +#define D_dxRmAllocRefDesc 60 +#define D_dxRmBestDType 61 +#define D_dxRmCreateDrain 62 +#define D_dxRmCreateSink 63 +#define D_dxRmDeallocData 64 +#define D_dxRmDeallocDataDesc 65 +#define D_dxRmDestroyDrain 66 +#define D_dxRmDestroySink 67 +#define D_dxRmGetData 68 +#define D_dxRmGetDType 69 +#define D_dxRmGetMaxQuantum 70 +#define D_dxRmGetQuantum 71 +#define D_dxRmHasQuantum 72 +#define D_dxRmInitializePort 73 +#define D_dxRmMergeBuffers 75 +#define D_dxRmObtainQuantum 76 +#define D_dxRmPutData 77 +#define D_dxRmSetDType 78 +#define D_dxRmSetQuantum 79 +#define D_dxRmSplitBuffers 80 +#define D_dxSchedProcessComplete 81 /* Pipe scheduling routines */ +#define D_dxSchedProcessReady 82 +#define D_dxSchedOkToRun 83 +#define D_dxBuildChangeList 84 /* Change list routines */ +#define D_dxPutRuns 85 +#define D_dxFfsLong 86 +#define D_dxFfcLong 87 +#define D_dxFillRegion 88 /* Miscellaneous additions */ +#define D_dxConvertCpp 89 +#define D_dxCopyCpp 90 +#define D_dxEncodeG4 91 +#define D_dxEncodeDct 92 +#define D_dxDecodeG4 93 +#define D_dxDecodeDct 94 +#define D_dxPosCl 95 +#define D_dxCheckLicense 96 + /* More RM functions */ +#define D_dxRmAllocCmpDataDesc 97 /* was D_dxRmGetAlignment */ +#define D_dxRmSetAlignment 98 +#define D_dxRmCreateDataDesc 99 +#define D_dxCreatePipeCtx 100 +#define D_dxUsingCL 101 +#define D_dxCmpPreferred 102 /* was D_dxSmiDecodeG4IsAtomic */ +#define D_dxRmAllocDataArray 103 +#define D_dxRmAllocCmpPermDesc 104 +#define D_dxSchedProcessNoInput 105 + +/***************************************************************************** +** +** DDX Access Macros +** +** FUNCTIONAL DESCRIPTION: +** +** These macros provide access to the DDX functions while hiding +** the implementation from the caller. +** +*****************************************************************************/ + /* + ** DDX function access macro + ** This macro calls an arbitrary DDX routine through the + ** xieDdxProc dispatch table. + ** + ** func = the Mi function index from this file. + ** + */ +externalref card32 (*xieDdxProc[])(); +#define CallDdx_(func) (*(xieDdxProc)[func]) + /* + ** Image functions + */ +#define DdxArea_ CallDdx_(D_dxArea) +#define DdxStatsArea_ CallDdx_(D_dxStatsArea) +#define DdxArith_ CallDdx_(D_dxArith) +#define DdxHistogram_ CallDdx_(D_dxHistogram) +#define DdxChromeCom_ CallDdx_(D_dxChromeCom) +#define DdxChromeSep_ CallDdx_(D_dxChromeSep) +#define DdxCompare_ CallDdx_(D_dxCompare) +#define DdxConstrain_ CallDdx_(D_dxConstrain) +#define DdxCrop_ CallDdx_(D_dxCrop) +#define DdxDither_ CallDdx_(D_dxDither) +#define DdxFill_ CallDdx_(D_dxFill) +#define DdxLogical_ CallDdx_(D_dxLogical) +#define DdxLuminance_ CallDdx_(D_dxLuminance) +#define DdxMatchHistogram_ CallDdx_(D_dxMatchHistogram) +#define DdxMath_ CallDdx_(D_dxMath) +#define DdxMirror_ CallDdx_(D_dxMirror) +#define DdxPoint_ CallDdx_(D_dxPoint) +#define DdxStatsPoint_ CallDdx_(D_dxStatsPoint) +#define DdxRotate_ CallDdx_(D_dxRotate) +#define DdxScale_ CallDdx_(D_dxScale) +#define DdxTranslate_ CallDdx_(D_dxTranslate) +#define DdxRmOwnData_ CallDdx_(D_dxRmOwnData) + /* + ** Ddx specific functions + */ +#define DdxInit_ CallDdx_(D_dxInit) +#define DdxReset_ CallDdx_(D_dxReset) +#define DdxOptimizePipe_ CallDdx_(D_dxOptimizePipe) + /* + ** MI software functions + */ +#define DdxConvert_ CallDdx_(D_dxConvert) +#define DdxCopy_ CallDdx_(D_dxCopy) +#define DdxGetTyp_ CallDdx_(D_dxGetTyp) +#define DdxCopyBits_ CallDdx_(D_dxCopyBits) /* 65 */ +#define DdxResolveUdp_ CallDdx_(D_dxResolveUdp) + /* + ** Memory management routines + */ +#define DdxCalloc_ CallDdx_(D_dxCalloc) +#define DdxCallocBits_ (unsigned char *)CallDdx_(D_dxCallocBits) +#define DdxCfree_ CallDdx_(D_dxCfree) +#define DdxFree_ CallDdx_(D_dxFree) +#define DdxFreeBits_ (unsigned char *)CallDdx_(D_dxFreeBits) +#define DdxMalloc_ CallDdx_(D_dxMalloc) +#define DdxMallocBits_ (unsigned char *)CallDdx_(D_dxMallocBits) +#define DdxRealloc_ CallDdx_(D_dxRealloc) +#define DdxReallocBits_ (unsigned char *)CallDdx_(D_dxReallocBits) + /* + ** Pipeline support routines + */ +#define DdxCreatePipeline_ (Pipe)CallDdx_(D_dxCreatePipeline) +#define DdxDestroyPipeline_ (int)CallDdx_(D_dxDestroyPipeline) +#define DdxPipeHasYielded_ (int)CallDdx_(D_dxPipeHasYielded) +#define DdxInitiatePipeline_ (int)CallDdx_(D_dxInitiatePipeline) +#define DdxResumePipeline_ (int)CallDdx_(D_dxResumePipeline) +#define DdxFlushPipeline_ (int)CallDdx_(D_dxFlushPipeline) +#define DdxAbortPipeline_ (int)CallDdx_(D_dxAbortPipeline) + /* + ** Pipeline resource manager routines + */ +#define DdxRmAllocData_ (PipeDataPtr)CallDdx_(D_dxRmAllocData) +#define DdxRmAllocDataDesc_ (PipeDataPtr)CallDdx_(D_dxRmAllocDataDesc) +#define DdxRmAllocPermDesc_ (PipeDataPtr)CallDdx_(D_dxRmAllocPermDesc) +#define DdxRmAllocRefDesc_ (PipeDataPtr)CallDdx_(D_dxRmAllocRefDesc) +#define DdxRmBestDType_ (char)CallDdx_(D_dxRmBestDType) +#define DdxRmCreateDrain_ (PipeDrainPtr)CallDdx_(D_dxRmCreateDrain) +#define DdxRmCreateSink_ (PipeSinkPtr)CallDdx_(D_dxRmCreateSink) +#define DdxRmDeallocData_ (PipeDataPtr)CallDdx_(D_dxRmDeallocData) +#define DdxRmDeallocDataDesc_ (PipeDataPtr)CallDdx_(D_dxRmDeallocDataDesc) +#define DdxRmDestroyDrain_ (PipeDrainPtr)CallDdx_(D_dxRmDestroyDrain) +#define DdxRmDestroySink_ (PipeSinkPtr)CallDdx_(D_dxRmDestroySink) +#define DdxRmGetData_ (PipeDataPtr)CallDdx_(D_dxRmGetData) +#define DdxRmGetDType_ (int)CallDdx_(D_dxRmGetDType) +#define DdxRmGetMaxQuantum_ (int)CallDdx_(D_dxRmGetMaxQuantum) +#define DdxRmGetQuantum_ (int)CallDdx_(D_dxRmGetQuantum) +#define DdxRmHasQuantum_ (int)CallDdx_(D_dxRmHasQuantum) +#define DdxRmInitializePort_ (int)CallDdx_(D_dxRmInitializePort) +#define DdxRmMergeBuffers_ (PipeDataPtr)CallDdx_(D_dxRmMergeBuffers) +#define DdxRmObtainQuantum_ (PipeDataPtr)CallDdx_(D_dxRmObtainQuantum) +#define DdxRmPutData_ (int)CallDdx_(D_dxRmPutData) +#define DdxRmSetDType_ CallDdx_(D_dxRmSetDType) +#define DdxRmSetQuantum_ CallDdx_(D_dxRmSetQuantum) +#define DdxRmSplitBuffers_ (PipeDataPtr)CallDdx_(D_dxRmSplitBuffers) + /* + ** Pipe scheduling routines + */ +#define DdxSchedProcessComplete_ (PipeElementCtxPtr)CallDdx_(D_dxSchedProcessComplete) +#define DdxSchedProcessReady_ (PipeElementCtxPtr)CallDdx_(D_dxSchedProcessReady) +#define DdxSchedOkToRun_ (int)CallDdx_(D_dxSchedOkToRun) + /* + ** Change list routines + */ +#define DdxBuildChangeList_ CallDdx_(D_dxBuildChangeList) +#define DdxPutRuns_ CallDdx_(D_dxPutRuns) +#define DdxFfsLong_ CallDdx_(D_dxFfsLong) +#define DdxFfcLong_ CallDdx_(D_dxFfcLong) + /* + ** Additions + */ +#define DdxFillRegion_ CallDdx_(D_dxFillRegion) +#define DdxConvertCpp_ CallDdx_(D_dxConvertCpp) +#define DdxCopyCpp_ CallDdx_(D_dxCopyCpp) +#define DdxEncodeG4_ CallDdx_(D_dxEncodeG4) +#define DdxEncodeDct_ CallDdx_(D_dxEncodeDct) +#define DdxDecodeG4_ CallDdx_(D_dxDecodeG4) +#define DdxDecodeDct_ CallDdx_(D_dxDecodeDct) +#define DdxPosCl_ CallDdx_(D_dxPosCl) +#define DdxCheckLicense_ CallDdx_(D_dxCheckLicense) + /* + ** More RM functions + */ +#define DdxRmAllocCmpDataDesc_ (PipeDataPtr)CallDdx_(D_dxRmAllocCmpDataDesc) +#define DdxRmSetAlignment_ CallDdx_(D_dxRmSetAlignment) +#define DdxRmCreateDataDesc_ (PipeDataPtr)CallDdx_(D_dxRmCreateDataDesc) +#define DdxCreatePipeCtx_ (PipeElementCtxPtr)CallDdx_(D_dxCreatePipeCtx) +#define DdxUsingCL_ CallDdx_(D_dxUsingCL) +#define DdxCmpPreferred_ CallDdx_(D_dxCmpPreferred) +#define DdxRmAllocDataArray_ CallDdx_(D_dxRmAllocDataArray) +#define DdxRmAllocCmpPermDesc_ (PipeDataPtr)CallDdx_(D_dxRmAllocCmpPermDesc) +#define DdxSchedProcessNoInput_ (PipeElementCtxPtr)CallDdx_(D_dxSchedProcessNoInput) + +/***************************************************************************** +** +** Xie Ddx Setup Index - +** +** FUNCTIONAL DESCRIPTION: +** +** The following symbols define the indices into the dispatch table +** used to call "pipeline create" DDX functions. Each of these +** functions creates a new pipeline element. +** +** WARNING: These indices and the entries in the XieDdxSetup table +** in SmiDdx.c MUST be in the same order. +** +*****************************************************************************/ +#define D_dxCreateArea 0 +#define D_dxCreateArith 1 +#define D_dxCreateChromeCom 2 +#define D_dxCreateChromeSep 3 +#define D_dxCreateCompare 4 +#define D_dxCreateConstrain 5 +#define D_dxCreateCrop 6 +#define D_dxCreateDither 7 +#define D_dxCreateFill 8 +#define D_dxCreateLogical 9 +#define D_dxCreateLuminance 10 +#define D_dxCreateMatchHistogram 11 +#define D_dxCreateMath 12 +#define D_dxCreateMirror 13 +#define D_dxCreatePoint 14 +#define D_dxCreateRotate 15 +#define D_dxCreateScale 16 +#define D_dxCreateTranslate 17 +#define D_dxCreateDecodeDct 18 /* Compression pipeline creates */ +#define D_dxCreateEncodeDct 19 +#define D_dxCreateDecodeG4 20 +#define D_dxCreateEncodeG4 21 + +/***************************************************************************** +** +** Pipeline Create Access Macros +** +** FUNCTIONAL DESCRIPTION: +** +** These macros provide access to the Pipeline Create functions while +** hiding the implementation from the caller. +** +*****************************************************************************/ + /* + ** Pipe create function access macro + ** This macro calls a create function through the + ** xieDdxSetup dispatch table. + ** + ** func = the setup function index from this file. + ** + */ +externalref card32 (*xieDdxSetup[])(); +#define CallCreate_(func) (*(xieDdxSetup)[func]) + /* + ** Image processing pipe element creates + */ +#define DdxCreateArea_ CallCreate_(D_dxCreateArea) +#define DdxCreateArith_ CallCreate_(D_dxCreateArith) +#define DdxCreateChromeCom_ CallCreate_(D_dxCreateChromeCom) +#define DdxCreateChromeSep_ CallCreate_(D_dxCreateChromeSep) +#define DdxCreateCompare_ CallCreate_(D_dxCreateCompare) +#define DdxCreateConstrain_ CallCreate_(D_dxCreateConstrain) +#define DdxCreateCrop_ CallCreate_(D_dxCreateCrop) +#define DdxCreateDither_ CallCreate_(D_dxCreateDither) +#define DdxCreateFill_ CallCreate_(D_dxCreateFill) +#define DdxCreateLogical_ CallCreate_(D_dxCreateLogical) +#define DdxCreateLuminance_ CallCreate_(D_dxCreateLuminance) +#define DdxCreateMatchHistogram_ CallCreate_(D_dxCreateMatchHistogram) +#define DdxCreateMath_ CallCreate_(D_dxCreateMath) +#define DdxCreateMirror_ CallCreate_(D_dxCreateMirror) +#define DdxCreatePoint_ CallCreate_(D_dxCreatePoint) +#define DdxCreateRotate_ CallCreate_(D_dxCreateRotate) +#define DdxCreateScale_ CallCreate_(D_dxCreateScale) +#define DdxCreateTranslate_ CallCreate_(D_dxCreateTranslate) + /* + ** Compression creates, used by Transport + */ +#define DdxCreateDecodeDct_ CallCreate_(D_dxCreateDecodeDct) +#define DdxCreateEncodeDct_ CallCreate_(D_dxCreateEncodeDct) +#define DdxCreateDecodeG4_ CallCreate_(D_dxCreateDecodeG4) +#define DdxCreateEncodeG4_ CallCreate_(D_dxCreateEncodeG4) + +/***************************************************************************** +** +** Ddx Alignment Function Access Index +** +** FUNCTIONAL DESCRIPTION: +** +** The following symbols define the indices into the DDX Alignment +** dispatch table used to call DDX image array alignment functions. +** Each of these functions performs alignments to meet individual +** algorithms or the default DDX needs. +** +** WARNING: These indices and the entries in the XieDdxAlign table +** in SmiDdx.c MUST be in the same order. +** +** +*****************************************************************************/ +#define D_dxAlignArea 0 +#define D_dxAlignArith 1 +#define D_dxAlignChromeCom 2 +#define D_dxAlignChromeSep 3 +#define D_dxAlignCompare 4 +#define D_dxAlignConstrain 5 +#define D_dxAlignCrop 6 +#define D_dxAlignDither 7 +#define D_dxAlignFill 8 +#define D_dxAlignLogical 9 +#define D_dxAlignLuminance 10 +#define D_dxAlignMatchHistogram 11 +#define D_dxAlignMath 12 +#define D_dxAlignMirror 13 +#define D_dxAlignPoint 14 +#define D_dxAlignRotate 15 +#define D_dxAlignScale 16 +#define D_dxAlignTranslate 17 +#define D_dxAlignDecodeDct 18 +#define D_dxAlignEncodeDct 19 +#define D_dxAlignDecodeG4 20 +#define D_dxAlignEncodeG4 21 +#define D_dxAlignDefault 22 +#define D_dxAlignExport 23 + +/***************************************************************************** +** +** DDX Alignment Function Access Macros +** +** FUNCTIONAL DESCRIPTION: +** +** These macros provide access to the DDX image array alignment functions +** +*****************************************************************************/ + /* + ** Align function access macro + ** This macro calls an arbitrary Alignment routine through the + ** xieDdxAlign dispatch table. + ** + ** func = the DDX alignment function index from this file. + ** + */ +externalref card32 (*xieDdxAlign[])(); +#define GetAlign_(func) (xieDdxAlign[func]) + +#define DdxAlignArea_ GetAlign_(D_dxAlignArea) +#define DdxAlignStatsArea_ GetAlign_(D_dxAlignStatsArea) +#define DdxAlignArith_ GetAlign_(D_dxAlignArith) +#define DdxAlignHistogram_ GetAlign_(D_dxAlignHistogram) +#define DdxAlignChromeCom_ GetAlign_(D_dxAlignChromeCom) +#define DdxAlignChromeSep_ GetAlign_(D_dxAlignChromeSep) +#define DdxAlignCompare_ GetAlign_(D_dxAlignCompare) +#define DdxAlignConstrain_ GetAlign_(D_dxAlignConstrain) +#define DdxAlignCrop_ GetAlign_(D_dxAlignCrop) +#define DdxAlignDither_ GetAlign_(D_dxAlignDither) +#define DdxAlignFill_ GetAlign_(D_dxAlignFill) +#define DdxAlignLogical_ GetAlign_(D_dxAlignLogical) +#define DdxAlignLuminance_ GetAlign_(D_dxAlignLuminance) +#define DdxAlignMatchHistogram_ GetAlign_(D_dxAlignMatchHistogram) +#define DdxAlignMath_ GetAlign_(D_dxAlignMath) +#define DdxAlignMirror_ GetAlign_(D_dxAlignMirror) +#define DdxAlignPoint_ GetAlign_(D_dxAlignPoint) +#define DdxAlignStatsPoint_ GetAlign_(D_dxAlignStatsPoint) +#define DdxAlignRotate_ GetAlign_(D_dxAlignRotate) +#define DdxAlignScale_ GetAlign_(D_dxAlignScale) +#define DdxAlignTranslate_ GetAlign_(D_dxAlignTranslate) +#define DdxAlignDecodeDct_ GetAlign_(D_dxAlignDecodeDct) +#define DdxAlignEncodeDct_ GetAlign_(D_dxAlignEncodeDct) +#define DdxAlignDecodeG4_ GetAlign_(D_dxAlignDecodeG4) +#define DdxAlignEncodeG4_ GetAlign_(D_dxAlignEncodeG4) +#define DdxAlignDefault_ GetAlign_(D_dxAlignDefault) +#define DdxAlignExport_ GetAlign_(D_dxAlignExport) + +/***************************************************************************** +** +** Mi Access Macros +** +** FUNCTIONAL DESCRIPTION: +** +** These macros provide access to the "atomic" DDX functions provided +** by a Machine Independent layer of the DDX. +** +*****************************************************************************/ + /* + ** Mi function access macro + ** This macro calls an arbitrary Mi routine through the + ** xieMiProc dispatch table. + ** + ** func = the Mi function index from this file. + ** + */ +externalref card32 (*xieMiProc[])(); +#define CallMi_(func) (*(xieMiProc)[func]) + /* + ** Image functions + */ +#define MiArea_ CallMi_(D_dxArea) +#define MiStatsArea_ CallMi_(D_dxStatsArea) +#define MiArith_ CallMi_(D_dxArith) +#define MiHistogram_ CallMi_(D_dxHistogram) +#define MiChromeCom_ CallMi_(D_dxChromeCom) +#define MiChromeSep_ CallMi_(D_dxChromeSep) +#define MiCompare_ CallMi_(D_dxCompare) +#define MiConstrain_ CallMi_(D_dxConstrain) +#define MiCrop_ CallMi_(D_dxCrop) +#define MiDither_ CallMi_(D_dxDither) +#define MiFill_ CallMi_(D_dxFill) +#define MiLogical_ CallMi_(D_dxLogical) +#define MiLuminance_ CallMi_(D_dxLuminance) +#define MiMatchHistogram_ CallMi_(D_dxMatchHistogram) +#define MiMath_ CallMi_(D_dxMath) +#define MiMirror_ CallMi_(D_dxMirror) +#define MiPoint_ CallMi_(D_dxPoint) +#define MiStatsPoint_ CallMi_(D_dxStatsPoint) +#define MiRotate_ CallMi_(D_dxRotate) +#define MiScale_ CallMi_(D_dxScale) +#define MiTranslate_ CallMi_(D_dxTranslate) + /* + ** Mi specific functions + */ +#define MiInit_ CallMi_(D_dxInit) +#define MiReset_ CallMi_(D_dxReset) +#define MiOptimizePipe_ CallMi_(D_dxOptimizePipe) + /* + ** MI software functions + */ +#define MiConvert_ CallMi_(D_dxConvert) +#define MiCopy_ CallMi_(D_dxCopy) +#define MiGetTyp_ CallMi_(D_dxGetTyp) +#define MiCopyBits_ CallMi_(D_dxCopyBits) +#define MiResolveUdp_ CallMi_(D_dxResolveUdp) + /* + ** Memory management routines + */ +#define MiCalloc_ CallMi_(D_dxCalloc) +#define MiCallocBits_ (unsigned char *)CallMi_(D_dxCallocBits) +#define MiCfree_ CallMi_(D_dxCfree) +#define MiFree_ CallMi_(D_dxFree) +#define MiFreeBits_ (unsigned char *)CallMi_(D_dxFreeBits) +#define MiMalloc_ CallMi_(D_dxMalloc) +#define MiMallocBits_ (unsigned char *)CallMi_(D_dxMallocBits) +#define MiRealloc_ CallMi_(D_dxRealloc) +#define MiReallocBits_ (unsigned char *)CallMi_(D_dxReallocBits) + /* + ** Pipeline support routines + */ +#define MiCreatePipeline_ (Pipe)CallMi_(D_dxCreatePipeline) +#define MiDestroyPipeline_ (int)CallMi_(D_dxDestroyPipeline) +#define MiPipeHasYielded_ (int)CallMi_(D_dxPipeHasYielded) +#define MiInitiatePipeline_ (int)CallMi_(D_dxInitiatePipeline) +#define MiResumePipeline_ (int)CallMi_(D_dxResumePipeline) +#define MiFlushPipeline_ (int)CallMi_(D_dxFlushPipeline) +#define MiAbortPipeline_ (int)CallMi_(D_dxAbortPipeline) + /* + ** Pipeline resource manager routines + */ +#define MiRmAllocData_ (PipeDataPtr)CallMi_(D_dxRmAllocData) +#define MiRmAllocDataDesc_ (PipeDataPtr)CallMi_(D_dxRmAllocDataDesc) +#define MiRmAllocPermDesc_ (PipeDataPtr)CallMi_(D_dxRmAllocPermDesc) +#define MiRmAllocRefDesc_ (PipeDataPtr)CallMi_(D_dxRmAllocRefDesc) +#define MiRmBestDType_ (char)CallMi_(D_dxRmBestDType) +#define MiRmCreateDrain_ (PipeDrainPtr)CallMi_(D_dxRmCreateDrain) +#define MiRmCreateSink_ (PipeSinkPtr)CallMi_(D_dxRmCreateSink) +#define MiRmDeallocData_ (PipeDataPtr)CallMi_(D_dxRmDeallocData) +#define MiRmDeallocDataDesc_ (PipeDataPtr)CallMi_(D_dxRmDeallocDataDesc) +#define MiRmDestroyDrain_ (PipeDrainPtr)CallMi_(D_dxRmDestroyDrain) +#define MiRmDestroySink_ (PipeSinkPtr)CallMi_(D_dxRmDestroySink) +#define MiRmGetData_ (PipeDataPtr)CallMi_(D_dxRmGetData) +#define MiRmGetDType_ (int)CallMi_(D_dxRmGetDType) +#define MiRmGetMaxQuantum_ (int)CallMi_(D_dxRmGetMaxQuantum) +#define MiRmGetQuantum_ (int)CallMi_(D_dxRmGetQuantum) +#define MiRmHasQuantum_ (int)CallMi_(D_dxRmHasQuantum) +#define MiRmInitializePort_ (int)CallMi_(D_dxRmInitializePort) +#define MiRmMergeBuffers_ (PipeDataPtr)CallMi_(D_dxRmMergeBuffers) +#define MiRmObtainQuantum_ (PipeDataPtr)CallMi_(D_dxRmObtainQuantum) +#define MiRmPutData_ (int)CallMi_(D_dxRmPutData) +#define MiRmSetDType_ CallMi_(D_dxRmSetDType) +#define MiRmSetQuantum_ CallMi_(D_dxRmSetQuantum) +#define MiRmSplitBuffers_ (PipeDataPtr)CallMi_(D_dxRmSplitBuffers) + /* + ** Pipe scheduling routines + */ +#define MiSchedProcessComplete_ (PipeElementCtxPtr)CallMi_(D_dxSchedProcessComplete) +#define MiSchedProcessReady_ (PipeElementCtxPtr)CallMi_(D_dxSchedProcessReady) +#define MiSchedOkToRun_ (int)CallMi_(D_dxSchedOkToRun) + /* + ** Change list routines + */ +#define MiBuildChangeList_ CallMi_(D_dxBuildChangeList) +#define MiPutRuns_ CallMi_(D_dxPutRuns) +#define MiFfsLong_ CallMi_(D_dxFfsLong) +#define MiFfcLong_ CallMi_(D_dxFfcLong) + /* + ** Additions + */ +#define MiFillRegion_ CallMi_(D_dxFillRegion) +#define MiConvertCpp_ CallMi_(D_dxConvertCpp) +#define MiCopyCpp_ CallMi_(D_dxCopyCpp) +#define MiEncodeG4_ CallMi_(D_dxEncodeG4) +#define MiEncodeDct_ CallMi_(D_dxEncodeDct) +#define MiDecodeG4_ CallMi_(D_dxDecodeG4) +#define MiDecodeDct_ CallMi_(D_dxDecodeDct) +#define MiPosCl_ CallMi_(D_dxPosCl) +#define MiCheckLicense_ CallMi_(D_dxCheckLicense) + /* + ** More resource manager + */ +#define MiRmAllocCmpDataDesc_ CallMi_(D_dxRmAllocCmpDataDesc) +#define MiRmSetAlignment_ CallMi_(D_dxRmSetAlignment) +#define MiRmCreateDataDesc_ (PipeDataPtr)CallMi_(D_dxRmCreateDataDesc) +#define MiCreatePipeCtx_ (PipeElementCtxPtr)CallMi_(D_dxCreatePipeCtx) +#define MiUsingCL_ CallMi_(D_dxUsingCL) +#define MiCmpPreferred_ CallMi_(D_dxCmpPreferred) +#define MiRmAllocDataArray_ CallMi_(D_dxRmAllocDataArray) +#define MiRmAllocCmpPermDesc_ (PipeDataPtr)CallMi_(D_dxRmAllocCmpPermDesc) +#define MiSchedProcessNoInput_ (PipeElementCtxPtr)CallMi_(D_dxSchedProcessNoInput) + +/***************************************************************************** +** +** Pipeline Create Access Macros +** +** FUNCTIONAL DESCRIPTION: +** +** These macros provide access to the "pipeline create" DDX functions +** provided by a Machine Independent layer of the DDX. +** +*****************************************************************************/ + /* + ** Pipe create function access macro + ** This macro calls a create function through the + ** xieMiSetup dispatch table. + ** + ** func = the setup function index from this file. + ** + */ +externalref card32 (*xieMiSetup[])(); +#define CallMiCreate_(func) (*(xieMiSetup)[func]) + /* + ** Image processing pipe element creates + */ +#define MiCreateArea_ CallMiCreate_(D_dxCreateArea) +#define MiCreateArith_ CallMiCreate_(D_dxCreateArith) +#define MiCreateChromeCom_ CallMiCreate_(D_dxCreateChromeCom) +#define MiCreateChromeSep_ CallMiCreate_(D_dxCreateChromeSep) +#define MiCreateCompare_ CallMiCreate_(D_dxCreateCompare) +#define MiCreateConstrain_ CallMiCreate_(D_dxCreateConstrain) +#define MiCreateCrop_ CallMiCreate_(D_dxCreateCrop) +#define MiCreateDither_ CallMiCreate_(D_dxCreateDither) +#define MiCreateFill_ CallMiCreate_(D_dxCreateFill) +#define MiCreateLogical_ CallMiCreate_(D_dxCreateLogical) +#define MiCreateLuminance_ CallMiCreate_(D_dxCreateLuminance) +#define MiCreateMatchHistogram_ CallMiCreate_(D_dxCreateMatchHistogram) +#define MiCreateMath_ CallMiCreate_(D_dxCreateMath) +#define MiCreateMirror_ CallMiCreate_(D_dxCreateMirror) +#define MiCreatePoint_ CallMiCreate_(D_dxCreatePoint) +#define MiCreateRotate_ CallMiCreate_(D_dxCreateRotate) +#define MiCreateScale_ CallMiCreate_(D_dxCreateScale) +#define MiCreateTranslate_ CallMiCreate_(D_dxCreateTranslate) + /* + ** Compression creates, used by Transport + */ +#define MiCreateDecodeDct_ CallMiCreate_(D_dxCreateDecodeDct) +#define MiCreateEncodeDct_ CallMiCreate_(D_dxCreateEncodeDct) +#define MiCreateDecodeG4_ CallMiCreate_(D_dxCreateDecodeG4) +#define MiCreateEncodeG4_ CallMiCreate_(D_dxCreateEncodeG4) + +/* +** This "endif" MUST be the last line of this file. +*/ +#endif +/* end of XIEDDX -- NO DEFINITIONS ALLOWED BEYOND THIS POINT */ diff --git a/xie/build/dec/XieFloat.h b/xie/build/dec/XieFloat.h new file mode 100644 index 0000000..c58f26f --- /dev/null +++ b/xie/build/dec/XieFloat.h @@ -0,0 +1,99 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1990-1991 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** XIE - X11 Image Extension +** +** +** ABSTRACT: +** +** This module contains definitions required by the XIE library +** and XIE server floating point formatting routines. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Robert NC Shelley +** +** CREATION DATE: +** +** October 31, 1990 +** +************************************************************************/ + + /* + ** Symbol XIEFLOAT allows XieFloat.h to be included multiple times. + */ +#ifndef XIEFLOAT +#define XIEFLOAT /* the "endif" MUST be the last line of this file */ + +#include /* for CARD8, ..., typedefs */ + + /* + ** Wire floating point format + */ +typedef struct _XieFloatRec { + CARD8 e_sign; + CARD8 m_sign; + CARD16 exponent; + CARD32 mantissa; +} XieFloatRec, *XieFloat; + +extern void MiEncodeDouble(); +extern double MiDecodeDouble(); + +#endif diff --git a/xie/build/dec/XieLib.h b/xie/build/dec/XieLib.h new file mode 100644 index 0000000..25409f9 --- /dev/null +++ b/xie/build/dec/XieLib.h @@ -0,0 +1,372 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989-1991 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** XIE - X11 Image Extension +** +** +** ABSTRACT: +** +** This module contains definitions required by all XIE client side +** layers -- from the application level through the XieLib level. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Robert NC Shelley +** +** CREATION DATE: +** +** April 13, 1989 +** +*******************************************************************************/ + + /* + ** Symbol XIELIB allows XieLib.h to be included multiple times. + */ +#ifndef _XIELIB +#define _XIELIB /* the "endif" MUST be the last line of this file */ + +/* +** Include files +*/ +#ifdef VMS +#include /* X11 Library Definitions */ +#else +#include /* X11 Library Definitions */ +#endif +#ifdef VMS +#include /* universal data plane definitions */ +#include /* XIE inter-layer definitions */ +#else +#include /* universal data plane definitions */ +#include /* XIE inter-layer definitions */ +#endif + +/* +** Equated symbols +*/ + /* + ** XieCopyImage, XieGetImage, and XiePutImage image data mode constants. + */ +#define XieK_DataNone 1 /* no buffers, no transport setup, no data copy */ +#define XieK_DataFlo 2 /* prepare a Photoflo for image data transport */ +#define XieK_DataMap 3 /* prepare a Photomap for image data transport */ +#define XieK_DataAlloc 4 /* allocate image buffers containing no data */ +#define XieK_DataCopy 5 /* allocate image buffers and copy data */ +#define XieK_DataShare 6 /* copy pointers to existing image data */ + /* + ** Opaque Xie resource definitions. + */ +typedef unsigned long *XieStream; /* Stream transport context pointer */ +typedef unsigned char + *XiePhotoflo, /* Photoflo: server image pipeline object */ + *XiePhotomap, /* Photomap: permanent server image object */ + *XiePhototap, /* Phototap: ephemeral server image object */ + *XieCpp, /* Cpp: control processing plane */ + *XieRoi, /* Roi: region of interest */ + *XieTmp, /* Tmp: template (eg. convolution kernel) */ + *XiePhoto, /* Any of: XiePhotoflo, XiePhotomap, XiePhototap*/ + *XieIdc, /* Any of: XieCpp, XieRoi, XieTmp, */ + *XieResource; /* Any of: XiePhoto, XieIdc */ + +#ifdef __alpha +#define RES_XID 16 /* offset to XieResource X11 resource-id */ +#define RES_TYPE 24 /* offset to XieResource resource type */ +#define RES_MAPPING 25 /* offset to XiePhoto component mapping */ +#else +#define RES_XID 8 /* offset to XieResource X11 resource-id */ +#define RES_TYPE 12 /* offset to XieResource resource type */ +#define RES_MAPPING 13 /* offset to XiePhoto component mapping */ +#endif +/* +** Macros +*/ + /* + ** Macro for returning a resource's X11-id. + */ +#define XId_(res) (*((XID *)(&((XieResource)(res))[RES_XID]))) + /* + ** Boolean macros for determining a resource's type. + */ +#define IsPhotoflo_(res) (((XieResource)(res))[RES_TYPE]==XieK_Photoflo) +#define IsPhotomap_(res) (((XieResource)(res))[RES_TYPE]==XieK_Photomap) +#define IsPhototap_(res) (((XieResource)(res))[RES_TYPE]==XieK_Phototap) +#define IsCpp_(res) (((XieResource)(res))[RES_TYPE]==XieK_IdcCpp) +#define IsRoi_(res) (((XieResource)(res))[RES_TYPE]==XieK_IdcRoi) +#define IsTmp_(res) (((XieResource)(res))[RES_TYPE]==XieK_IdcTmp) +#define IsPhoto_(res) (IsPhotoflo_(res)||IsPhotomap_(res)||IsPhototap_(res)) +#define IsIdc_(res) (IsCpp_(res)||IsRoi_(res)||IsTmp_(res)) + /* + ** Boolean macros for determining a XiePhotomap's component mapping. + */ +#define IsBitonal_(pho) (((XiePhoto)(pho))[RES_MAPPING]==XieK_Bitonal) +#define IsGrayScale_(pho) (((XiePhoto)(pho))[RES_MAPPING]==XieK_GrayScale) +#define IsRGB_(pho) (((XiePhoto)(pho))[RES_MAPPING]==XieK_RGB) + + /* + ** Return the component count of an XiePhotomap. + */ +#define PhotoCount_(pho) (IsRGB_(pho) ? 3 : 1) + /* + ** Return the number of planes (UdpPtr's) an XieImage "should" contain. + */ +#define PlaneCount_(img) \ + ( CmpOrg_(img) == XieK_BandByPixel ? 1 \ + : CmpOrg_(img) == XieK_BandByPlane ? CmpCnt_(img) \ + : CmpLen_(img,0)+CmpLen_(img,1)+CmpLen_(img,2) ) + /* + ** Return "val" rounded up (if necessary) to a multiple of "mod". + */ +#define Modulo_(val,mod) \ + ((mod) < 2 ? (val) : (((mod) - (val) % (mod)) % (mod) + (val))) + +/* +** Structures +*/ + /* + ** XIE Client Event Structure + */ +typedef struct { + int type; /* see XQueryExtention "first_event"*/ + unsigned long serial; /* X11 serial number */ + Bool send_event; /* Boolean: true if client generated*/ + Display *display; /* X11 display pointer */ + XieResource resource; /* Xie resource-id (source of event)*/ +} XieEventRec, *XieEvent; + /* + ** Image domain context template data for XieCreateTmp / XieQueryTmp. + */ +typedef struct { + long x; /* X coordinate of template entry */ + long y; /* Y coordinate of template entry */ + double value; /* value of template entry */ +} XieTemplateRec, *XieTemplate; + /* + ** Statistics data + */ +typedef struct { + double value; + double minimum; + double maximum; + double mean; + double stddev; + double variance; +} XieStatsRec, *XieStats; + + /* + ** XIE Image structure (client side image descriptor). + */ +typedef struct { + unsigned char Compression; /* compression scheme */ + unsigned char CmpOrg; /* component organization */ + unsigned char CmpMap; /* component mapping */ + unsigned char CmpCnt; /* component count */ + unsigned long CmpLvl[XieK_MaxComponents]; /* levels per component */ + unsigned char CmpLen[XieK_MaxComponents]; /* bits per component */ + unsigned char PxlPol; /* pixel brightness polarity*/ + unsigned char PxlProg; /* pixel progression */ + unsigned char ScnProg; /* scanline progression */ + unsigned char OwnData; /* image array ownership */ + unsigned char Stream; /* Stream transport status */ + XieStream Xport; /* Stream transport context */ + double PxlRatio; /* pixel aspect ratio */ + UdpPtr Plane[XieK_MaxPlanes]; /* data plane pointers */ +} XieImageRec, *XieImage; + /* + ** Access macros for XIE Image structure. + */ +#define Cmpres_(img) ((img)->Compression) +#define CmpOrg_(img) ((img)->CmpOrg) +#define CmpMap_(img) ((img)->CmpMap) +#define CmpCnt_(img) ((img)->CmpCnt) +#define CmpLvl_(img,ind) ((img)->CmpLvl[(ind)]) +#define CmpLen_(img,ind) ((img)->CmpLen[(ind)]) +#define PxlPol_(img) ((img)->PxlPol) +#define PxlProg_(img) ((img)->PxlProg) +#define ScnProg_(img) ((img)->ScnProg) +#define OwnData_(img) ((img)->OwnData) +#define Stream_(img) ((img)->Stream) +#define StreamFinal_(img) (Stream_(img) == XieK_StreamFinal) +#define StreamError_(img) (Stream_(img) == XieK_StreamError) +#define StreamPending_(img) (!(StreamFinal_(img) || StreamError_(img))) +#define PxlRatio_(img) ((img)->PxlRatio) +#define Width_(img) ((img)->Plane[0]->UdpL_PxlPerScn) +#define Height_(img) ((img)->Plane[0]->UdpL_ScnCnt) +#define Plane_(img,ind) ((img)->Plane[(ind)]) +#define uPxlLen_(img,ind) ((img)->Plane[(ind)]->UdpW_PixelLength) +#define uDType_(img,ind) ((img)->Plane[(ind)]->UdpB_DType) +#define uClass_(img,ind) ((img)->Plane[(ind)]->UdpB_Class) +#define uBase_(img,ind) ((img)->Plane[(ind)]->UdpA_Base) +#define uArSize_(img,ind) ((img)->Plane[(ind)]->UdpL_ArSize) +#define uPxlStr_(img,ind) ((img)->Plane[(ind)]->UdpL_PxlStride) +#define uScnStr_(img,ind) ((img)->Plane[(ind)]->UdpL_ScnStride) +#define uX1_(img,ind) ((img)->Plane[(ind)]->UdpL_X1) +#define uX2_(img,ind) ((img)->Plane[(ind)]->UdpL_X2) +#define uY1_(img,ind) ((img)->Plane[(ind)]->UdpL_Y1) +#define uY2_(img,ind) ((img)->Plane[(ind)]->UdpL_Y2) +#define uWidth_(img,ind) ((img)->Plane[(ind)]->UdpL_PxlPerScn) +#define uHeight_(img,ind) ((img)->Plane[(ind)]->UdpL_ScnCnt) +#define uPos_(img,ind) ((img)->Plane[(ind)]->UdpL_Pos) +#define uCmpIdx_(img,ind) ((img)->Plane[(ind)]->UdpL_CompIdx) +#define uLvl_(img,ind) ((img)->Plane[(ind)]->UdpL_Levels) + +/* +** XieLib entry points. +*/ +#ifndef _XieLibEvents +extern unsigned long XieQueryEvents(); +extern void XieSelectEvents(); +#endif +#ifndef _XieLibImage +extern XieImage XieCopyImage(); +extern XieImage XieCreateImage(); +extern XieImage XieFreeImage(); +extern XieImage XieGetImage(); +extern unsigned char XieGetImageData(); +extern XiePhoto XiePutImage(); +extern unsigned char XiePutImageData(); +#endif +#ifndef _XieLibProcess +extern XiePhoto XieArea(); +extern XiePhoto XieAreaStats(); +extern XiePhoto XieArithmetic(); +extern XiePhoto XieChromeCom(); +extern XiePhoto XieChromeSep(); +extern XiePhoto XieCompare(); +extern XiePhoto XieConstrain(); +extern XiePhoto XieCrop(); +extern XiePhoto XieDither(); +extern XiePhoto XieFill(); +extern unsigned long *XieHistogram(); +extern XiePhoto XieLogical(); +extern XiePhoto XieLuminance(); +extern XiePhoto XieMatchHistogram(); +extern XiePhoto XieMath(); +extern XiePhoto XieMirror(); +extern XiePhoto XiePoint(); +extern void XiePointStats(); +extern XiePhoto XieRotate(); +extern XiePhoto XieScale(); +extern XiePhoto XieTranslate(); +#endif +#ifndef _XieLibResource +extern void XieAbortFlo(); +extern void XieBindMapToFlo(); +extern XiePhoto XieClonePhoto(); +extern XieCpp XieCreateCpp(); +extern XiePhoto XieCreatePhoto(); +extern XieRoi XieCreateRoi(); +extern XieTmp XieCreateTmp(); +extern void XieExecuteFlo(); +extern void XieExport(); +extern XieResource XieFindResource(); +extern void XieFreeExport(); +extern XieResource XieFreeResource(); +extern XiePhotomap XieImport(); +extern void XieQueryCpp(); +extern void XieQueryExport(); +extern unsigned long XieQueryFlo(); +extern XiePhoto XieQueryMap(); +extern void XieQueryRoi(); +extern XieTemplate XieQueryTmp(); +extern XiePhoto XieTapFlo(); +#endif +#ifndef _XieLibSession +extern char *XieCheckFunction(); +extern char **XieListFunctions(); +extern void XieQueryOpDefaults(); +extern void XieSetOpDefaults(); +#endif +#ifndef _XieLibTransport +extern void XieAbortStream(); +extern unsigned char XieGetStream(); +extern void XieGetTile(); +extern void XiePutStream(); +extern void XiePutTile(); +extern void XieSetStream(); +#endif +#ifndef _XieLibUtils +extern void *XieCalloc(); +extern unsigned char *XieCallocBits(); +extern void *XieCfree(); +extern void *XieFree(); +extern unsigned char *XieFreeBits(); +extern unsigned char XieIsBitonal(); +extern unsigned char XieIsCpp(); +extern unsigned char XieIsGrayScale(); +extern unsigned char XieIsIdc(); +extern unsigned char XieIsPhoto(); +extern unsigned char XieIsPhotoflo(); +extern unsigned char XieIsPhotomap(); +extern unsigned char XieIsPhototap(); +extern unsigned char XieIsRGB(); +extern unsigned char XieIsRoi(); +extern unsigned char XieIsTmp(); +extern void *XieMalloc(); +extern unsigned char *XieMallocBits(); +extern unsigned long XiePhotoCount(); +extern unsigned long XiePlaneCount(); +extern void *XieRealloc(); +extern unsigned char *XieReallocBits(); +extern unsigned long XieXId(); +#endif + +/* +** This "endif" MUST be the last line of this file. +*/ +#endif /* end of _XIELIB -- NO DEFINITIONS ALLOWED BEYOND THIS POINT */ diff --git a/xie/build/dec/XieProto.h b/xie/build/dec/XieProto.h new file mode 100644 index 0000000..2aeac5c --- /dev/null +++ b/xie/build/dec/XieProto.h @@ -0,0 +1,1228 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989-1991 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Image Extension DIX +** +** ABSTRACT: +** +** This module contains definitions required by the XIE wire protocol +** -- XIE library and XIE server DDX layers. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Richard J. Piccolo +** Robert NC Shelley +** +** CREATION DATE: +** +** March 1, 1989 +** +************************************************************************/ + + /* + ** Symbol XIEPROTO allows XieProto.h to be included multiple times. + */ +#ifndef XIEPROTO +#define XIEPROTO /* the "endif" MUST be the last line of this file */ + +/* +** Include files +*/ +#ifdef VMS +#include /* XIE inter-layer definitions */ +#include /* XIE device dependant definitions */ +#else +#include /* XIE inter-layer definitions */ +#include /* XIE device dependant definitions */ +#endif + +/* +** Wire protocol constant definitions. +*/ + /* + ** Version number + */ +#define XieK_MajorVersion 2 +#define XieK_MinorVersion 3 + +/******************************************************************************* +** Protocol request packet minor op-codes +*******************************************************************************/ +#define X_ieInitSession 1 +#define X_ieTermSession 2 + +#define X_ieQueryEvents 3 +#define X_ieSelectEvents 4 + +#define X_ieSetOpDefaults 5 +#define X_ieQueryOpDefaults 6 + +#define X_ieCreateByReference 7 +#define X_ieCreateByValue 8 +#define X_ieDeleteResource 9 +#define X_ieQueryResource 10 + +#define X_ieBindPhotomap 11 +#define X_ieAbortPhotoflo 12 +#define X_ieExecutePhotoflo 13 +#define X_ieTapPhotoflo 14 + +#define X_ieAbortTransport 15 +#define X_ieGetStream 16 +#define X_ieGetTile 17 +#define X_iePutStream 18 +#define X_iePutTile 19 +#define X_ieSetTransport 20 + +#define X_ieExport 21 +#define X_ieFreeExport 22 +#define X_ieImport 23 +#define X_ieQueryExport 24 + +#define X_ieArea 25 +#define X_ieAreaStats 26 +#define X_ieArith 27 +#define X_ieCalcHist 28 +#define X_ieChromeCom 29 +#define X_ieChromeSep 30 +#define X_ieCompare 31 +#define X_ieConstrain 32 +#define X_ieCrop 33 +#define X_ieDither 34 +#define X_ieFill 35 +#define X_ieLogical 36 +#define X_ieLuminance 37 +#define X_ieMatchHistogram 38 +#define X_ieMath 39 +#define X_ieMirror 40 +#define X_iePoint 41 +#define X_iePointStats 42 +#define X_ieRotate 43 +#define X_ieScale 44 +#define X_ieTranslate 45 + +#define X_ieLastRequest 46 + +/******************************************************************************* +** Protocol packet size definitions required by Xlibint.h +*******************************************************************************/ +#define sz_xieReq 4 +#define sz_xieInitSessionReq 8 +#define sz_xieTermSessionReq 4 + +#define sz_xieQueryEventsReq 8 +#define sz_xieSelectEventsReq 8 + +#define sz_xieSetOpDefaultsReq 20 +#define sz_xieQueryOpDefaultsReq 4 + +#define sz_xieCreateByReferenceReq 16 +#define sz_xieCreateByValueReq 12 +#define sz_xieCreateCppReq 24 +#define sz_xieCreatePhotoReq 48 +#define sz_xieCreateRoiReq 28 +#define sz_xieCreateTmpReq 24 +#define sz_xieDeleteResourceReq 12 +#define sz_xieQueryResourceReq 12 + +#define sz_xieBindPhotomapReq 12 +#define sz_xieAbortPhotofloReq 8 +#define sz_xieExecutePhotofloReq 8 +#define sz_xieTapPhotofloReq 16 + +#define sz_xieAbortTransportReq 12 +#define sz_xieGetStreamReq 16 +#define sz_xieGetTileReq 32 +#define sz_xiePutStreamReq 16 +#define sz_xiePutTileReq 32 +#define sz_xieSetTransportReq 140 + +#define sz_xieExportReq 64 +#define sz_xieFreeExportReq 8 +#define sz_xieImportReq 20 +#define sz_xieQueryExportReq 16 + +#define sz_xieAreaReq 24 +#define sz_xieAreaStatsReq 20 +#define sz_xieArithReq 36 +#define sz_xieCalcHistReq 16 +#define sz_xieChromeComReq 20 +#define sz_xieChromeSepReq 16 +#define sz_xieCompareReq 36 +#define sz_xieConstrainReq 28 +#define sz_xieCropReq 16 +#define sz_xieDitherReq 24 +#define sz_xieFillReq 28 +#define sz_xieLogicalReq 36 +#define sz_xieLuminanceReq 12 +#define sz_xieMatchHistogramReq 36 +#define sz_xieMathReq 20 +#define sz_xieMirrorReq 16 +#define sz_xiePointReq 20 +#define sz_xiePointStatsReq 20 +#define sz_xieRotateReq 40 +#define sz_xieScaleReq 20 +#define sz_xieTranslateReq 24 + +/******************************************************************************* +** Sub-structures +*******************************************************************************/ + + /* + ** Structure defining the Xie function vector. + */ +typedef struct { + CARD8 function[32]; +} XieFunctionsRec, *XieFunctionVector; + + /* + ** Structure defining IdcTmp template data crossing wire. + */ +typedef struct { + INT32 x; + INT32 y; + XieFloatRec value; +} XieTmpEntryRec, *XieTmpEntry; + +/******************************************************************************* +** Protocol request packets +*******************************************************************************/ + + /* + ** Generic part of all XIE requests + */ +typedef struct { + CARD8 reqType; /* major op-code assigned to extension */ + CARD8 opcode; /* minor op-code == XIE function */ + CARD16 length; /* length in longwords of entire request */ +} xieReq; + + /* + ** Init Session Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieInitSession */ + CARD16 length; + CARD16 major_version; + CARD16 minor_version; +} xieInitSessionReq; + + /* + ** Term Session Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieTermSession */ + CARD16 length; +} xieTermSessionReq; + + /* + ** Query Events Requests + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 event_param; +} xieQueryEventsReq; + + /* + ** Select Events Requests + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 event_mask; +} xieSelectEventsReq; + + /* + ** Set Operational Defaults + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieSetOpDefaults */ + CARD16 length; + CARD8 model; + CARD8 _pad[3]; + CARD32 levels[XieK_MaxComponents]; +} xieSetOpDefaultsReq; + + /* + ** Query Operational Defaults + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieQueryOpDefaults */ + CARD16 length; +} xieQueryOpDefaultsReq; + + /* + ** Create (ie. clone Photo{flo|map}) resource By Reference Request. + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByReference*/ + CARD16 length; + CARD32 resource_type; + CARD32 resource_id; /* new Photo{flo|map}-id */ + CARD32 photomap_id; /* existing Photomap-id */ +} xieCreateByReferenceReq; + + /* + ** Generic Create resource By Value Request. + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByValue */ + CARD16 length; + CARD32 resource_type; /* new resource type */ + CARD32 resource_id; /* new resource identifier */ +} xieCreateByValueReq; + + /* + ** Create Cpp Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByValue */ + CARD16 length; + CARD32 resource_type; /* resource type == XieK_IdcCpp */ + CARD32 resource_id; + CARD32 photomap_id; + INT32 x; + INT32 y; +} xieCreateCppReq; + + /* + ** Create Photo{flo|map} from client specified attributes. + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByValue */ + CARD16 length; + CARD32 resource_type; /* XieK_Photomap or XieK_Photoflo */ + CARD32 resource_id; + CARD32 width; + CARD32 height; + XieFloatRec aspect_ratio; + CARD32 levels[XieK_MaxComponents]; + CARD8 number_of_components; + CARD8 component_mapping; + CARD8 pixel_progression; + CARD8 line_progression; + CARD8 polarity; + CARD8 _pad[3]; +} xieCreatePhotoReq; + + /* + ** Create Roi Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByValue */ + CARD16 length; + CARD32 resource_type; /* resource type == XieK_IdcRoi */ + CARD32 resource_id; + INT32 x; + INT32 y; + CARD32 width; + CARD32 height; +} xieCreateRoiReq; + + /* + ** Create Tmp Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByValue */ + CARD16 length; + CARD32 resource_type; /* resource type == XieK_IdcTmp */ + CARD32 resource_id; + INT32 center_x; + INT32 center_y; + CARD32 data_count; /* number of XieTmpEntryRec's */ +/* XieTmpEntryRec data[data_count] /* list of XieTmpEntryRec */ +} xieCreateTmpReq; + + /* + ** Delete resource request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieDeleteResource */ + CARD16 length; + CARD32 resource_type; + CARD32 resource_id; +} xieDeleteResourceReq; + + /* + ** Query resource request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieQueryResource */ + CARD16 length; + CARD32 resource_type; + CARD32 resource_id; +} xieQueryResourceReq; + + /* + ** Bind an existing Photomap to an existing Photoflo. + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieBindPhotomap */ + CARD16 length; + CARD32 photoflo_id; + CARD32 photomap_id; +} xieBindPhotomapReq; + + /* + ** Abort Photoflo request. + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieAbortPhotoflo */ + CARD16 length; + CARD32 photoflo_id; +} xieAbortPhotofloReq; + + /* + ** Execute Photoflo Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieExecutePhotoflo */ + CARD16 length; + CARD32 photoflo_id; +} xieExecutePhotofloReq; + + /* + ** Tap Photoflo Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieTapPhotoflo */ + CARD16 length; + CARD32 photoflo_id; + CARD32 photo_id; + BOOL permanent; + CARD8 _pad[3]; +} xieTapPhotofloReq; + + /* + ** Abort transport Request (release transport resources) + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieAbortTransport */ + CARD16 length; + CARD32 photo_id; + CARD32 plane_mask; +} xieAbortTransportReq; + + /* + ** Get Stream Request (transport image data: server --> client) + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieGetStream */ + CARD16 length; + CARD32 photo_id; + CARD32 max_bytes; /* maximum return image data length */ + CARD8 plane_num; + CARD8 _pad[3]; +} xieGetStreamReq; + + /* + ** Get Tile Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieGetTile */ + CARD16 length; + CARD32 photomap_id; + INT32 x; + INT32 y; + CARD32 width; + CARD32 height; + CARD32 plane_mask; + BOOL final; + CARD8 _pad[3]; +} xieGetTileReq; + + /* + ** Put Stream Request (transport image data: client --> server) + */ +typedef struct _xiePutStreamReq { + CARD8 reqType; + CARD8 opcode; /* function == X_iePutStream */ + CARD16 length; + CARD32 photo_id; + CARD32 byte_count; /* image plane data length in bytes */ + BOOL final; + CARD8 plane_num; + CARD8 _pad[2]; +} xiePutStreamReq; + + /* + ** Put Tile Request (transport image data: client --> server) + */ +typedef struct _xiePutTileReq { + CARD8 reqType; + CARD8 opcode; /* function == X_iePutTile */ + CARD16 length; + CARD32 photomap_id; + INT32 x; + INT32 y; + CARD32 width; + CARD32 height; + CARD32 plane_mask; + BOOL final; + CARD8 _pad[3]; +} xiePutTileReq; + + /* + ** Set transport Request (set transport parameters) + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieSetTransport */ + CARD16 length; + CARD32 photo_id; + CARD32 compression_parameter; + CARD8 compression_scheme; + CARD8 mode; + CARD8 component_organization; + CARD8 _pad; + CARD32 plane_mask; + CARD8 pixel_stride[XieK_MaxPlanes]; + CARD32 scanline_stride[XieK_MaxPlanes]; +} xieSetTransportReq; + + /* + ** Export image data to drawable Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieExport */ + CARD16 length; + CARD32 photo_id; + CARD32 drawable_id; + CARD32 gc_id; + INT32 src_x; + INT32 src_y; + CARD32 width; + CARD32 height; + INT32 dst_x; + INT32 dst_y; + CARD32 photo_lut_id; + CARD32 colormap_id; + XieFloatRec match_limit; + XieFloatRec gray_limit; +} xieExportReq; + + /* + ** Free ExportContext from Photomap Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieFreeExport */ + CARD16 length; + CARD32 photo_id; +} xieFreeExportReq; + + /* + ** Import image data from drawable Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieImport */ + CARD16 length; + CARD32 photomap_id; + CARD32 drawable_id; + CARD32 colormap_id; + CARD8 polarity; + CARD8 _pad[3]; +} xieImportReq; + + /* + ** Query ExportContext Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieQueryExport */ + CARD16 length; + CARD32 photo_id; + CARD32 lut_id; + BOOL get_pixels; + CARD8 _pad[3]; +} xieQueryExportReq; + + /* + ** Area Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 ipcc_id; + CARD32 ipct_id; + CARD8 op1; + CARD8 op2; + CARD8 constrain; + CARD8 _pad; +} xieAreaReq; + + /* + ** Area Statistics Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD8 edge_size; + CARD8 stat_type; + CARD8 _pad[2]; +} xieAreaStatsReq; + + /* + ** Arith Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieArithmetic */ + CARD16 length; + CARD32 src1_photo_id; + CARD32 src2_photo_id; + CARD32 constants[XieK_MaxComponents]; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD8 op; + CARD8 constrain; + CARD16 _pad; +} xieArithReq; + + /* + ** Calculate Histogram Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 photo_id; + CARD32 idc_id; + CARD8 by_component; + CARD8 _pad[3]; +} xieCalcHistReq; + + /* + ** Chrominance Combine Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 photo_id1; + CARD32 photo_id2; + CARD32 photo_id3; + CARD32 dst_photo_id; +} xieChromeComReq; + + /* + ** Chrominance Separate Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src_photo; + CARD32 dst_photo; + CARD32 component; +} xieChromeSepReq; + + /* + ** Compare Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src1_photo_id; + CARD32 src2_photo_id; + CARD32 constants[XieK_MaxComponents]; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD8 op; + CARD8 combine; + CARD16 _pad; +} xieCompareReq; + + /* + ** Constrain Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieConstrain */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD8 model; + CARD8 _pad[3]; + CARD32 levels[XieK_MaxComponents]; + +} xieConstrainReq; + + /* + ** Crop Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCrop */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 idc_id; +} xieCropReq; + + /* + ** Dither Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieDither */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 levels[XieK_MaxComponents]; +} xieDitherReq; + + /* + ** Fill Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieFill */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 dst_idc_id; + CARD32 constant[XieK_MaxComponents]; +} xieFillReq; + + /* + ** Logical Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieLogical */ + CARD16 length; + CARD32 src1_photo_id; + CARD32 src2_photo_id; + CARD32 constants[XieK_MaxComponents]; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD8 op; + CARD8 _pad[3]; + } xieLogicalReq; + + /* + ** Luminance Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieLuminance */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; +} xieLuminanceReq; + + /* + ** Math Function Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD8 op; + CARD8 constrain; + CARD16 _pad; +} xieMathReq; + + /* + ** Match Histogram Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 photo_id1; + CARD32 photo_id2; + CARD32 idc_id; + XieFloatRec param1; + XieFloatRec param2; + CARD8 h_shape; + CARD8 _pad[3]; +} xieMatchHistogramReq; + + /* + ** Mirror Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieMirror */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + BOOL x_mirror; + BOOL y_mirror; + CARD8 _pad[2]; +} xieMirrorReq; + + /* + ** Point Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD32 trans_photo_id; +} xiePointReq; + + /* + ** Point Statistics Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 photo_id; + INT32 x; + INT32 y; + CARD8 height; + CARD8 width; + CARD8 _pad[2]; +} xiePointStatsReq; + + /* + ** Rotate Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieRotate */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + XieFloatRec angle; + CARD32 width; + CARD32 height; + CARD32 fill[XieK_MaxComponents]; +} xieRotateReq; + + /* + ** Scale Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieScale */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 width; + CARD32 height; +} xieScaleReq; + + /* + ** Translate Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieTranslate */ + CARD16 length; + CARD32 src1_photo_id; + CARD32 src2_photo_id; + CARD32 src_idc_id; + CARD32 dst_photo_id; + CARD32 dst_idc_id; +} xieTranslateReq; + +#ifdef NOT_YET_IMPLEMENTED +/************ NONE OF THE FOLLOWING REQUESTS HAVE BEEN IMPLEMENTED ************/ + /* + ** Display Sequence Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 window_id; + CARD16 frame_count; + CARD16 frame_timing; + CARD8 forward; + CARD8 number_of_pixmaps; +} xieDisplaySeqReq; + +/**************************** END OF UNIMPLEMENTED REQUESTS *******************/ +#endif + +/******************************************************************************* +** Events +*******************************************************************************/ + /* + ** Send Xie Event + */ +typedef struct { + CARD8 type; + CARD8 detail; + CARD16 sequenceNumber; + CARD32 resource_id; + CARD8 _pad[24]; +} xieSendEvent; + +/******************************************************************************* +** Replies +*******************************************************************************/ + /* + ** Reply for Init Session + */ +typedef struct { + INT8 type; + CARD8 success; + CARD16 sequenceNumber; + CARD32 length; + CARD16 major_version; + CARD16 minor_version; + CARD32 service_class; /* not implemented */ + CARD8 _pad[16]; +} xieInitSessionReply; + + /* + ** Reply for Query Events + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD32 event_mask; + CARD8 _pad[20]; +} xieQueryEventsReply; + + /* + ** Reply for Query Operational Defaults + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD8 model; + CARD8 _pad[3]; + CARD32 levels[XieK_MaxComponents]; + CARD8 _pad1[8]; +} xieQueryOpDefaultsReply; + + /* + ** Reply for Query Resource: resource type == Photoflo + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD32 status; + CARD8 _pad[20]; +} xieQueryPhotofloReply; + + /* + ** Reply for Query Resource: resource type == Photo{map|tap} + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD32 width; + CARD32 height; + XieFloatRec aspect_ratio; + CARD8 polarity; + CARD8 pixel_progression; + CARD8 line_progression; + BOOL constrained; + CARD8 component_mapping; + CARD8 component_count; + CARD8 _pad[2]; + CARD32 levels[XieK_MaxComponents]; + CARD32 photo_id; +} xieQueryPhotomapReply; + + /* + ** Reply for Query Resource: resource type == Idc of type XieK_Cpp + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + INT32 x; + INT32 y; + CARD32 photomap_id; + CARD8 _pad[12]; +} xieQueryCppReply; + + /* + ** Reply for Query Resource: resource type == Idc of type XieK_Roi + */ +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + INT32 x; + INT32 y; + CARD32 width; + CARD32 height; + CARD8 _pad[8]; +} xieQueryRoiReply; + + /* + ** Reply for Query Resource: resource type == Idc of type XieK_Tmp + */ +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; /* length of entries: long words */ + INT32 center_x; + INT32 center_y; + CARD32 data_count; /* number of XieTmpEntryRec's to */ + CARD8 _pad[12]; /* follow xieQueryTmpReply as data */ +} xieQueryTmpReply; + + /* + ** Reply for Get Stream + */ +typedef struct { + INT8 type; + CARD8 status; + CARD16 sequenceNumber; + CARD32 length; /* length of image data: longwords */ + CARD32 byte_count; /* image plane data length in bytes */ + CARD8 _pad[20]; +} xieGetStreamReply; + + /* + ** Reply for Get Tile + */ +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; /* length of image data: longwords */ + CARD8 _pad[24]; +} xieGetTileReply; + + /* + ** Reply for QueryExport -- returns LUT and list of allocated pixels + */ +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; /* number of pixels being returned */ + CARD32 pixel_count; + CARD32 lut_id; + CARD8 lut_mapping; + CARD8 _pad[15]; +} xieQueryExportReply; + + /* + ** Reply for CalcHistogram -- returns frequency distribution data + */ +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; /* size of histogram list in longs */ + CARD8 _pad[24]; +} xieCalcHistReply; + + /* + ** Reply for Point Statistics + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD8 _pad[24]; +} xiePointStatsReply; + +/* the following structure is used for Point Statistics */ + +typedef struct { + XieFloatRec pixel; + XieFloatRec minimum; + XieFloatRec maximum; + XieFloatRec mean; + XieFloatRec std_dev; + XieFloatRec variance; +} xiePointStatsData, *xiePointStatsDataPtr; + + +#ifdef NOT_YET_IMPLEMENTED +/************ NONE OF THE FOLLOWING REPLIES HAVE BEEN IMPLEMENTED *************/ + +typedef struct { + CARD16 screen_width_millimeters; + CARD16 screen_height_millimeters; + CARD16 screen_width_pixels; + CARD16 screen_height_pixels; + CARD16 screen_depth; + CARD16 screen_luts_size; + CARD8 screen_number; + CARD8 screen_luts; + CARD8 screen_brightness_control; + CARD8 screen_contrast_control; + CARD8 screen_hue_control; + CARD8 _pad[5]; +} screen_data; + +typedef struct { + CARD32 minimum; + CARD32 maximum; + CARD32 mean; + CARD32 std_dev; + CARD32 variance; +} statistics_data; + +/* Reply for Dot Product */ + +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD32 _pad[6]; +} xieDotProductReply; + +/*** following display stuff may be deleted or expanded */ + +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD8 idc_type; + CARD8 skip_or_show; + CARD32 pixmap; + CARD16 _pad; +} xieSingleStaticReply; + +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD8 idc_type; + CARD8 map_x_tiles; + CARD8 map_y_tiles; + CARD32 current_frame; + CARD32 number_of_display_frames; +} xieSpatialMapReply; + +typedef struct { + CARD32 pixmap; + CARD8 skip_or_show; + CARD8 _pad[3]; +} display_frame; + +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD32 current_frame; + CARD32 number_of_display_frames; + CARD8 idc_type; + CARD8 map_x_tiles; + CARD8 map_y_tiles; + CARD8 _pad[14]; +} xieTimeSequenceReply; + +/**************************** END OF UNIMPLEMENTED REPLIES ********************/ +#endif +/* +** This "endif" MUST be the last line of this file. +*/ +#endif /* end of XIEPROTO -- NO DEFINITIONS ALLOWED BEYOND THIS POINT */ + diff --git a/xie/build/dec/XieUdpDef.h b/xie/build/dec/XieUdpDef.h new file mode 100644 index 0000000..44d88ff --- /dev/null +++ b/xie/build/dec/XieUdpDef.h @@ -0,0 +1,118 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/********************************************************************************************************************************/ +/* Created 23-MAY-1992 03:11:09 by VAX SDL V3.2-12 Source: 12-JUL-1990 18:14:51 VNRESD$:[XIESMI.SRC]XIEUDPDEF.SDL;1 */ +/********************************************************************************************************************************/ +/******************************************************************************* */ +/** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, */ +/** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. */ +/** */ +/** All Rights Reserved */ +/** */ +/** Permission to use, copy, modify, and distribute this software and its */ +/** documentation for any purpose and without fee is hereby granted, */ +/** provided that the above copyright notice appear in all copies and that */ +/** both that copyright notice and this permission notice appear in */ +/** supporting documentation, and that the names of Digital or MIT not be */ +/** used in advertising or publicity pertaining to distribution of the */ +/** software without specific, written prior permission. */ +/** */ +/** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */ +/** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL */ +/** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR */ +/** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, */ +/** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */ +/** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS */ +/** SOFTWARE. */ +/** */ +/******************************************************************************* */ +/******************************************************************************* */ +/** */ +/** FACILITY: */ +/** */ +/** Sample Machine Independant DDX */ +/** X Image Extensions */ +/** */ +/** ABSTRACT: */ +/** */ +/** This include file defines low level image data representation */ +/** structures. */ +/** */ +/** ENVIRONMENT: */ +/** */ +/** VAX/VMS V5.3 */ +/** ULTRIX V3.1 */ +/** */ +/** AUTHOR(S): */ +/** */ +/** John Weber */ +/** */ +/** CREATION DATE: */ +/** */ +/** August 12, 1989 */ +/** */ +/** MODIFICATION HISTORY: */ +/** */ +/******************************************************************************* */ + +/*** MODULE XieUdpDef ***/ +#ifndef UDPDEF +#define UDPDEF +struct UDP { + unsigned short int UdpW_PixelLength; + unsigned char UdpB_DType; + unsigned char UdpB_Class; + unsigned char *UdpA_Base; + unsigned long int UdpL_ArSize; + unsigned long int UdpL_PxlStride; + unsigned long int UdpL_ScnStride; + long int UdpL_X1; + long int UdpL_X2; + long int UdpL_Y1; + long int UdpL_Y2; + unsigned long int UdpL_PxlPerScn; + unsigned long int UdpL_ScnCnt; + long int UdpL_Pos; + unsigned long int UdpL_CompIdx; + unsigned long int UdpL_Levels; + } ; +typedef struct UDP UdpRec, *UdpPtr; +#define UdpK_DTypeUndefined 0 +#define UdpK_DTypeMin 1 +#define UdpK_DTypeBU 1 +#define UdpK_DTypeWU 2 +#define UdpK_DTypeLU 3 +#define UdpK_DTypeF 4 +#define UdpK_DTypeC 5 +#define UdpK_DTypeVU 6 +#define UdpK_DTypeV 7 +#define UdpK_DTypeCL 8 +#define UdpK_DTypeMax 8 +#define UdpK_ClassUBA 1 +#define UdpK_ClassUBS 2 +#define UdpK_ClassA 3 +#define UdpK_ClassCL 4 +#endif /* UDPDEF */ diff --git a/xie/build/dec/bits.h b/xie/build/dec/bits.h new file mode 100644 index 0000000..2bfb950 --- /dev/null +++ b/xie/build/dec/bits.h @@ -0,0 +1,114 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* +************************************************************************** +** DIGITAL EQUIPMENT CORPORATION ** +** CONFIDENTIAL ** +** NOT FOR MODIFICATION OR REDISTRIBUTION IN ANY MANNER WHATSOEVER ** +************************************************************************** +*/ +/* + * This include file is designed to be a portable way for systems to define + * bit field manipulation of arrays of bits. + */ +#ifndef __BITS__ +#define __BITS__ "@(#)bits.h 1.6 - 90/09/18 " +/* RCSID = $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/include/bits.h,v 1.1.2.2 92/02/06 13:44:37 Jim_Ludwig Exp $" */ + +/***************************************************************************** +Copyright 1987, 1988, 1989, 1990 by Digital Equipment Corporation, Maynard, MA + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*****************************************************************************/ +/* + * + * CONTRIBUTORS: + * + * Dick Annicchiarico + * Robert Chesler + * Dan Coutu + * Gene Durso + * Marc Evans + * Alan Jamison + * Mark Henry + * Ken Miller + * + */ +typedef unsigned char *UByteP; /* Pointer to an unsigned byte array */ +#define BitsInByte 8L /* The number of bits in a byte */ + +#define BitInByte(bit) /* Returns the bit mask of a byte */ \ + (1L << (((bit) % BitsInByte))) + +#define BitInWord(bit) /* Returns the bit mask of a word */ \ + (1L << (((bit) % (BitsInByte * 2L)))) + +#define BitInLong(bit) /* Returns the bit mask of a long */ \ + (1L << (((bit) % (BitsInByte * 4L)))) + +#define ByteInArray(array,bit) /* Returns the byte offset to get to a bit */ \ + (((UByteP)(array))[(bit) / BitsInByte]) + +#define BitIsTrue(array,bit) /* Test to see if a specific bit is True */ \ + (ByteInArray(array,bit) & BitInByte(bit)) + +#define BitIsFalse(array,bit) /* Test to see if a specific bit is False */ \ + (!(BitIsTrue(array,bit))) + +#define BitTrue(array,bit) /* Set a specific bit to be True */ \ + (ByteInArray(array,bit) |= BitInByte(bit)) + +#define BitFalse(array,bit) /* Set a specific bit to be False */ \ + (ByteInArray(array,bit) &= ~BitInByte(bit)) + +#define BitToggle(array,bit) /* Toggle a specific bit */ \ + (ByteInArray(array,bit) ^= BitInByte(bit)) + +#define BitCopy(dest,src,bit) /* Copy a specific bit */ \ + BitIsTrue((src),(bit)) ? BitTrue((dest),(bit)) : BitFalse((dest),(bit)) + +#define BitValue(array,bit) /* Return True or False depending on bit */ \ + (BitIsTrue((array),(bit)) ? True : False) + +#define BitSet(array,bit,value) /* Set bit to given value in array */ \ + (value) ? BitTrue((array),(bit)) : BitFalse((array),(bit)) + +#endif /* __BITS__ */ diff --git a/xie/build/dec/decclient b/xie/build/dec/decclient new file mode 100755 index 0000000..87b1249 Binary files /dev/null and b/xie/build/dec/decclient differ diff --git a/xie/build/dec/extutil.h b/xie/build/dec/extutil.h new file mode 100644 index 0000000..b597c17 --- /dev/null +++ b/xie/build/dec/extutil.h @@ -0,0 +1,148 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* + * $XConsortium: extutil.h,v 1.11 89/12/09 21:12:33 rws Exp $ + * + * Copyright 1989 Massachusetts Institute of Technology + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Jim Fulton, MIT X Consortium + * + * Xlib Extension-Writing Utilities + * + * This package contains utilities for writing the client API for various + * protocol extensions. THESE INTERFACES ARE NOT PART OF THE X STANDARD AND + * ARE SUBJECT TO CHANGE! + */ + +#ifndef _EXTUTIL_H_ +#define _EXTUTIL_H_ + +/* + * We need to keep a list of open displays since the Xlib display list isn't + * public. We also have to per-display info in a separate block since it isn't + * stored directly in the Display structure. + */ +typedef struct _XExtDisplayInfo { + struct _XExtDisplayInfo *next; /* keep a linked list */ + Display *display; /* which display this is */ + XExtCodes *codes; /* the extension protocol codes */ + caddr_t data; /* extra data for extension to use */ +} XExtDisplayInfo; + +typedef struct _XExtensionInfo { + XExtDisplayInfo *head; /* start of list */ + XExtDisplayInfo *cur; /* most recently used */ + int ndisplays; /* number of displays */ +} XExtensionInfo; + +typedef struct _XExtensionHooks { + int (*create_gc)(); + int (*copy_gc)(); + int (*flush_gc)(); + int (*free_gc)(); + int (*create_font)(); + int (*free_font)(); + int (*close_display)(); + Bool (*wire_to_event)(); + Status (*event_to_wire)(); + int (*error)(); + char *(*error_string)(); +} XExtensionHooks; + +extern XExtensionInfo *XextCreateExtension(); +extern void XextDestroyExtension(); +extern XExtDisplayInfo *XextAddDisplay(); +extern int XextRemoveDisplay(); +extern XExtDisplayInfo *XextFindDisplay(); + +#define XextHasExtension(i) ((i) && ((i)->codes)) +#define XextCheckExtension(dpy,i,name,val) \ + if (!XextHasExtension(i)) { XMissingExtension (dpy, name); return val; } +#define XextSimpleCheckExtension(dpy,i,name) \ + if (!XextHasExtension(i)) { XMissingExtension (dpy, name); return; } + + +/* + * helper macros to generate code that is common to all extensions; caller + * should prefix it with static if extension source is in one file; this + * could be a utility function, but have to stack 6 unused arguments for + * something that is called many, many times would be bad. + */ +#define XEXT_GENERATE_FIND_DISPLAY(proc,extinfo,extname,hooks,nev,data) \ +XExtDisplayInfo *proc (dpy) \ + register Display *dpy; \ +{ \ + XExtDisplayInfo *dpyinfo; \ + if (!extinfo) { if (!(extinfo = XextCreateExtension())) return NULL; } \ + if (!(dpyinfo = XextFindDisplay (extinfo, dpy))) \ + dpyinfo = XextAddDisplay (extinfo,dpy,extname,hooks,nev,data); \ + return dpyinfo; \ +} + +#define XEXT_GENERATE_CLOSE_DISPLAY(proc,extinfo) \ +int proc (dpy, codes) \ + Display *dpy; \ + XExtCodes *codes; \ +{ \ + return XextRemoveDisplay (extinfo, dpy); \ +} + +#define XEXT_GENERATE_ERROR_STRING(proc,extname,nerr,errl) \ +char *proc (dpy, code, codes, buf, n) \ + Display *dpy; \ + int code; \ + XExtCodes *codes; \ + char *buf; \ + int n; \ +{ \ + code -= codes->first_error; \ + if (code >= 0 && code < nerr) { \ + char tmp[256]; \ + sprintf (tmp, "%s.%d", extname, code); \ + XGetErrorDatabaseText (dpy, "XProtoError", tmp, errl[code], buf, n); \ + return buf; \ + } \ + return (char *)0; \ +} + +#endif diff --git a/xie/build/dec/libXie.a b/xie/build/dec/libXie.a new file mode 100644 index 0000000..2b4304b Binary files /dev/null and b/xie/build/dec/libXie.a differ diff --git a/xie/build/dec/mitmiscstr.h b/xie/build/dec/mitmiscstr.h new file mode 100644 index 0000000..4576b0b --- /dev/null +++ b/xie/build/dec/mitmiscstr.h @@ -0,0 +1,81 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/************************************************************ +Copyright 1989 by The Massachusetts Institute of Technology + +Permission to use, copy, modify, and distribute this +software and its documentation for any purpose and without +fee is hereby granted, provided that the above copyright +no- tice appear in all copies and that both that copyright +no- tice and this permission notice appear in supporting +docu- mentation, and that the name of MIT not be used in +advertising or publicity pertaining to distribution of the +software without specific prior written permission. +M.I.T. makes no representation about the suitability of +this software for any purpose. It is provided "as is" +without any express or implied warranty. + +********************************************************/ + +/* RANDOM CRUFT! THIS HAS NO OFFICIAL X CONSORTIUM BLESSING */ + +/* $XConsortium: mitmiscstr.h,v 1.3 90/05/15 18:50:18 keith Exp $ */ + +#include "MITMisc.h" + +#define MITMISCNAME "MIT-SUNDRY-NONSTANDARD" + +typedef struct _SetBugMode { + CARD8 reqType; /* always MITReqCode */ + CARD8 mitReqType; /* always X_MITSetBugMode */ + CARD16 length B16; + BOOL onOff; + BYTE pad0; + CARD16 pad1; +} xMITSetBugModeReq; +#define sz_xMITSetBugModeReq 8 + +typedef struct _GetBugMode { + CARD8 reqType; /* always MITReqCode */ + CARD8 mitReqType; /* always X_MITGetBugMode */ + CARD16 length B16; +} xMITGetBugModeReq; +#define sz_xMITGetBugModeReq 4 + +typedef struct { + BYTE type; /* X_Reply */ + BOOL onOff; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 pad0 B32; + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; +} xMITGetBugModeReply; +#define sz_xMITGetBugModeReply 32 + diff --git a/xie/build/dec/multibuf.h b/xie/build/dec/multibuf.h new file mode 100644 index 0000000..7a72bfd --- /dev/null +++ b/xie/build/dec/multibuf.h @@ -0,0 +1,305 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* + * $XConsortium: multibuf.h,v 1.15 91/07/12 10:20:42 rws Exp $ + * + * Copyright 1989 Massachusetts Institute of Technology + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _MULTIBUF_H_ +#define _MULTIBUF_H_ + +#include + +#define MULTIBUFFER_PROTOCOL_NAME "Multi-Buffering" + +#define MULTIBUFFER_MAJOR_VERSION 1 /* current version numbers */ +#define MULTIBUFFER_MINOR_VERSION 0 + +#define X_MbufGetBufferVersion 0 +#define X_MbufCreateImageBuffers 1 +#define X_MbufDestroyImageBuffers 2 +#define X_MbufDisplayImageBuffers 3 +#define X_MbufSetMBufferAttributes 4 +#define X_MbufGetMBufferAttributes 5 +#define X_MbufSetBufferAttributes 6 +#define X_MbufGetBufferAttributes 7 +#define X_MbufGetBufferInfo 8 +#define X_MbufCreateStereoWindow 9 + +/* + * update_action field + */ +#define MultibufferUpdateActionUndefined 0 +#define MultibufferUpdateActionBackground 1 +#define MultibufferUpdateActionUntouched 2 +#define MultibufferUpdateActionCopied 3 + +/* + * update_hint field + */ +#define MultibufferUpdateHintFrequent 0 +#define MultibufferUpdateHintIntermittent 1 +#define MultibufferUpdateHintStatic 2 + +/* + * valuemask fields + */ +#define MultibufferWindowUpdateHint (1L << 0) +#define MultibufferBufferEventMask (1L << 0) + +/* + * mono vs. stereo and left vs. right + */ +#define MultibufferModeMono 0 +#define MultibufferModeStereo 1 +#define MultibufferSideMono 0 +#define MultibufferSideLeft 1 +#define MultibufferSideRight 2 + +/* + * clobber state + */ +#define MultibufferUnclobbered 0 +#define MultibufferPartiallyClobbered 1 +#define MultibufferFullyClobbered 2 + +/* + * event stuff + */ +#define MultibufferClobberNotifyMask 0x02000000 +#define MultibufferUpdateNotifyMask 0x04000000 + +#define MultibufferClobberNotify 0 +#define MultibufferUpdateNotify 1 +#define MultibufferNumberEvents (MultibufferUpdateNotify + 1) + +#define MultibufferBadBuffer 0 +#define MultibufferNumberErrors (MultibufferBadBuffer + 1) + + +#ifndef _MULTIBUF_SERVER_ +/* + * Extra definitions that will only be needed in the client + */ +typedef XID Multibuffer; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + int send_event; /* true if this came frome a SendEvent request */ + Display *display; /* Display the event was read from */ + Multibuffer buffer; /* buffer of event */ + int state; /* see Clobbered constants above */ +} XmbufClobberNotifyEvent; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + int send_event; /* true if this came frome a SendEvent request */ + Display *display; /* Display the event was read from */ + Multibuffer buffer; /* buffer of event */ +} XmbufUpdateNotifyEvent; + + +/* + * per-window attributes that can be got + */ +typedef struct { + int displayed_index; /* which buffer is being displayed */ + int update_action; /* Undefined, Background, Untouched, Copied */ + int update_hint; /* Frequent, Intermittent, Static */ + int window_mode; /* Mono, Stereo */ + int nbuffers; /* Number of buffers */ + Multibuffer *buffers; /* Buffers */ +} XmbufWindowAttributes; + +/* + * per-window attributes that can be set + */ +typedef struct { + int update_hint; /* Frequent, Intermittent, Static */ +} XmbufSetWindowAttributes; + + +/* + * per-buffer attributes that can be got + */ +typedef struct { + Window window; /* which window this belongs to */ + unsigned long event_mask; /* events that have been selected */ + int buffer_index; /* which buffer is this */ + int side; /* Mono, Left, Right */ +} XmbufBufferAttributes; + +/* + * per-buffer attributes that can be set + */ +typedef struct { + unsigned long event_mask; /* events that have been selected */ +} XmbufSetBufferAttributes; + + +/* + * per-screen buffer info (there will be lists of them) + */ +typedef struct { + VisualID visualid; /* visual usuable at this depth */ + int max_buffers; /* most buffers for this visual */ + int depth; /* depth of buffers to be created */ +} XmbufBufferInfo; + +_XFUNCPROTOBEGIN + +extern Bool XmbufQueryExtension( +#if NeedFunctionPrototypes + Display* /* dpy */, + int* /* event_base_return */, + int* /* error_base_return */ +#endif +); + +extern Status XmbufGetVersion( +#if NeedFunctionPrototypes + Display* /* dpy */, + int* /* major_version_return */, + int* /* minor_version_return */ +#endif +); + +extern int XmbufCreateBuffers( +#if NeedFunctionPrototypes + Display* /* dpy */, + Window /* w */, + int /* count */, + int /* update_action */, + int /* update_hint */, + Multibuffer* /* buffers */ +#endif +); + +extern void XmbufDestroyBuffers( +#if NeedFunctionPrototypes + Display* /* dpy */, + Window /* window */ +#endif +); + +extern void XmbufDisplayBuffers( +#if NeedFunctionPrototypes + Display* /* dpy */, + int /* count */, + Multibuffer* /* buffers */, + int /* min_delay */, + int /* max_delay */ +#endif +); + +extern Status XmbufGetWindowAttributes( +#if NeedFunctionPrototypes + Display* /* dpy */, + Window /* w */, + XmbufWindowAttributes* /* attr */ +#endif +); + +extern void XmbufChangeWindowAttributes( +#if NeedFunctionPrototypes + Display* /* dpy */, + Window /* w */, + unsigned long /* valuemask */, + XmbufSetWindowAttributes* /* attr */ +#endif +); + +extern Status XmbufGetBufferAttributes( +#if NeedFunctionPrototypes + Display* /* dpy */, + Multibuffer /* b */, + XmbufBufferAttributes* /* attr */ +#endif +); + +extern void XmbufChangeBufferAttributes( +#if NeedFunctionPrototypes + Display* /* dpy */, + Multibuffer /* b */, + unsigned long /* valuemask */, + XmbufSetBufferAttributes* /* attr */ +#endif +); + +extern Status XmbufGetScreenInfo( +#if NeedFunctionPrototypes + Display* /* dpy */, + Drawable /* d */, + int* /* nmono_return */, + XmbufBufferInfo** /* mono_info_return */, + int* /* nstereo_return */, + XmbufBufferInfo** /* stereo_info_return */ +#endif +); + +extern Window XmbufCreateStereoWindow( +#if NeedFunctionPrototypes + Display* /* dpy */, + Window /* parent */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */, + unsigned int /* border_width */, + int /* depth */, + unsigned int /* class */, + Visual* /* visual */, + unsigned long /* valuemask */, + XSetWindowAttributes* /* attr */, + Multibuffer* /* leftp */, + Multibuffer* /* rightp */ +#endif +); + +_XFUNCPROTOEND + +#endif /* _MULTIBUF_SERVER_ */ +#endif /* _MULTIBUF_H_ */ diff --git a/xie/build/dec/multibufst.h b/xie/build/dec/multibufst.h new file mode 100644 index 0000000..9af9e29 --- /dev/null +++ b/xie/build/dec/multibufst.h @@ -0,0 +1,301 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* + * $XConsortium: multibufst.h,v 1.7 91/01/05 16:32:49 rws Exp $ + * + * Copyright 1989 Massachusetts Institute of Technology + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _MULTIBUFST_H_ +#define _MULTIBUFST_H_ + +/* + * Protocol requests constants and alignment values + * These would really be in Multi-Buffering's X.h and Xproto.h equivalents + */ + +#include "multibuf.h" + +#include /* for Window & VisualId defines */ +/* Added to match X11/Xproto.h */ +#define Window CARD32 +#define Drawable CARD32 +#define VisualID CARD32 + +#if defined(__STDC__) && !defined(UNIXCPP) +#define MbufGetReq(name,req,info) GetReq (name, req); \ + req->reqType = info->codes->major_opcode; \ + req->mbufReqType = X_##name; +#else +#define MbufGetReq(name,req,info) GetReq (name, req); \ + req->reqType = info->codes->major_opcode; \ + req->mbufReqType = X_/**/name; +#endif + +#define Multibuffer CARD32 + +typedef struct { + CARD32 visualID B32; /* associated visual */ + CARD16 maxBuffers B16; /* maximum supported buffers */ + CARD8 depth; /* depth of visual (redundant) */ + CARD8 unused; +} xMbufBufferInfo; +#define sz_xMbufBufferInfo 8 + +typedef struct { + BYTE type; + BYTE unused; + CARD16 sequenceNumber B16; + CARD32 buffer B32; /* affected buffer */ + BYTE state; /* current status */ + CARD8 unused1; + CARD16 unused2 B16; + CARD32 unused3 B32; + CARD32 unused4 B32; + CARD32 unused5 B32; + CARD32 unused6 B32; + CARD32 unused7 B32; +} xMbufClobberNotifyEvent; + +typedef struct { + BYTE type; + BYTE unused; + CARD16 sequenceNumber B16; + CARD32 buffer B32; /* affected buffer */ + CARD32 timeStamp B32; /* update time */ + CARD32 unused1 B32; + CARD32 unused2 B32; + CARD32 unused3 B32; + CARD32 unused4 B32; + CARD32 unused5 B32; + CARD32 unused6 B32; +} xMbufUpdateNotifyEvent; + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 mbufReqType; /* always X_MbufGetBufferVersion */ + CARD16 length B16; +} xMbufGetBufferVersionReq; +#define sz_xMbufGetBufferVersionReq 4 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 unused; /* not used */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 majorVersion; /* major version of Multi-Buffering protocol */ + CARD8 minorVersion; /* minor version of Multi-Buffering protocol */ + CARD16 pad1 B16; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xMbufGetBufferVersionReply; +#define sz_xMbufGetBufferVersionReply 32 + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 mbufReqType; /* always X_MbufCreateImageBuffers */ + CARD16 length B16; + CARD32 window B32; /* associated window */ + CARD8 updateAction; /* action at update */ + CARD8 updateHint; /* hint as to frequency of updates */ + CARD16 unused; +} xMbufCreateImageBuffersReq; /* followed by buffer ids */ +#define sz_xMbufCreateImageBuffersReq 12 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 unused; /* not used */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 numberBuffer B16; /* number successfully allocated */ + CARD16 unused1 B16; + CARD32 unused2 B32; + CARD32 unused3 B32; + CARD32 unused4 B32; + CARD32 unused5 B32; + CARD32 unused6 B32; +} xMbufCreateImageBuffersReply; +#define sz_xMbufCreateImageBuffersReply 32 + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 mbufReqType; /* always X_MbufDestroyImageBuffers */ + CARD16 length B16; + CARD32 window B32; /* associated window */ +} xMbufDestroyImageBuffersReq; +#define sz_xMbufDestroyImageBuffersReq 8 + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 mbufReqType; /* always X_MbufDisplayImageBuffers */ + CARD16 length B16; + CARD16 minDelay B16; /* minimum time between last update and now */ + CARD16 maxDelay B16; /* maximum time between last update and now */ +} xMbufDisplayImageBuffersReq; /* followed by list of buffers */ +#define sz_xMbufDisplayImageBuffersReq 8 + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 mbufReqType; /* always X_MbufSetMBufferAttributes */ + CARD16 length B16; + CARD32 window B32; /* associated window */ + CARD32 valueMask B32; /* modified entries */ +} xMbufSetMBufferAttributesReq; /* followed by values */ +#define sz_xMbufSetMBufferAttributesReq 12 + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 mbufReqType; /* always X_MbufGetMBufferAttributes */ + CARD16 length B16; + CARD32 window B32; /* associated window */ +} xMbufGetMBufferAttributesReq; +#define sz_xMbufGetMBufferAttributesReq 8 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 unused; /* not used */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 displayedBuffer B16; /* currently visible buffer */ + CARD8 updateAction; + CARD8 updateHint; + CARD8 windowMode; + CARD8 unused0; + CARD16 unused1 B16; + CARD32 unused2 B32; + CARD32 unused3 B32; + CARD32 unused4 B32; + CARD32 unused5 B32; +} xMbufGetMBufferAttributesReply; +#define sz_xMbufGetMBufferAttributesReply 32 + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 mbufReqType; /* always X_MbufSetBufferAttributes */ + CARD16 length B16; + CARD32 buffer B32; + CARD32 valueMask B32; +} xMbufSetBufferAttributesReq; /* followed by values */ +#define sz_xMbufSetBufferAttributesReq 12 + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 mbufReqType; /* always X_MbufGetBufferAttributes */ + CARD16 length B16; + CARD32 buffer B32; +} xMbufGetBufferAttributesReq; +#define sz_xMbufGetBufferAttributesReq 8 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 unused; /* not used */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 window B32; + CARD32 eventMask B32; + CARD16 bufferIndex B16; + CARD8 side; + CARD8 unused0; + CARD32 unused1 B32; + CARD32 unused2 B32; + CARD32 unused3 B32; +} xMbufGetBufferAttributesReply; +#define sz_xMbufGetBufferAttributesReply 32 + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 mbufReqType; /* always X_MbufGetBufferInfo */ + CARD16 length B16; + Drawable drawable B32; +} xMbufGetBufferInfoReq; +#define sz_xMbufGetBufferInfoReq 8 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 unused; /* not used */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 normalInfo B16; + CARD16 stereoInfo B16; + CARD32 unused1 B32; + CARD32 unused2 B32; + CARD32 unused3 B32; + CARD32 unused4 B32; + CARD32 unused5 B32; +} xMbufGetBufferInfoReply; /* followed by buffer infos */ +#define sz_xMbufGetBufferInfoReply 32 + + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 mbufReqType; /* always X_MbufCreateStereoWindow */ + CARD16 length B16; + CARD8 unused0; + CARD8 unused1; + CARD8 unused2; + CARD8 depth; + Window wid B32; + Window parent B32; + Multibuffer left B32; /* associated buffers */ + Multibuffer right B32; + INT16 x B16; + INT16 y B16; + CARD16 width B16; + CARD16 height B16; + CARD16 borderWidth B16; + CARD16 class B16; + VisualID visual B32; + CARD32 mask B32; +} xMbufCreateStereoWindowReq; /* followed by value list */ +#define sz_xMbufCreateStereoWindowReq 44 + + +#undef Multibuffer +#undef Window CARD32 +#undef Drawable CARD32 +#undef VisualID CARD32 + +#endif /* _MULTIBUFST_H_ */ diff --git a/xie/build/dec/obj/XieConvert.o b/xie/build/dec/obj/XieConvert.o new file mode 100644 index 0000000..5ddadb9 Binary files /dev/null and b/xie/build/dec/obj/XieConvert.o differ diff --git a/xie/build/dec/obj/XieFloat.o b/xie/build/dec/obj/XieFloat.o new file mode 100644 index 0000000..6f5a475 Binary files /dev/null and b/xie/build/dec/obj/XieFloat.o differ diff --git a/xie/build/dec/obj/XieLibEvents.o b/xie/build/dec/obj/XieLibEvents.o new file mode 100644 index 0000000..0a9a8b0 Binary files /dev/null and b/xie/build/dec/obj/XieLibEvents.o differ diff --git a/xie/build/dec/obj/XieLibImage.o b/xie/build/dec/obj/XieLibImage.o new file mode 100644 index 0000000..a27c7d7 Binary files /dev/null and b/xie/build/dec/obj/XieLibImage.o differ diff --git a/xie/build/dec/obj/XieLibProcess.o b/xie/build/dec/obj/XieLibProcess.o new file mode 100644 index 0000000..9c8d8d7 Binary files /dev/null and b/xie/build/dec/obj/XieLibProcess.o differ diff --git a/xie/build/dec/obj/XieLibResource.o b/xie/build/dec/obj/XieLibResource.o new file mode 100644 index 0000000..2ae6203 Binary files /dev/null and b/xie/build/dec/obj/XieLibResource.o differ diff --git a/xie/build/dec/obj/XieLibSession.o b/xie/build/dec/obj/XieLibSession.o new file mode 100644 index 0000000..233d4b8 Binary files /dev/null and b/xie/build/dec/obj/XieLibSession.o differ diff --git a/xie/build/dec/obj/XieLibTransport.o b/xie/build/dec/obj/XieLibTransport.o new file mode 100644 index 0000000..b1b9387 Binary files /dev/null and b/xie/build/dec/obj/XieLibTransport.o differ diff --git a/xie/build/dec/obj/XieLibUtils.o b/xie/build/dec/obj/XieLibUtils.o new file mode 100644 index 0000000..64c75fc Binary files /dev/null and b/xie/build/dec/obj/XieLibUtils.o differ diff --git a/xie/build/dec/shape.h b/xie/build/dec/shape.h new file mode 100644 index 0000000..65aff1d --- /dev/null +++ b/xie/build/dec/shape.h @@ -0,0 +1,222 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/************************************************************ +Copyright 1989 by The Massachusetts Institute of Technology + +Permission to use, copy, modify, and distribute this +software and its documentation for any purpose and without +fee is hereby granted, provided that the above copyright +no- tice appear in all copies and that both that copyright +no- tice and this permission notice appear in supporting +docu- mentation, and that the name of MIT not be used in +advertising or publicity pertaining to distribution of the +software without specific prior written permission. +M.I.T. makes no representation about the suitability of +this software for any purpose. It is provided "as is" +without any express or implied warranty. + +MIT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT- +NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE LI- +ABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH +THE USE OR PERFORMANCE OF THIS SOFTWARE. + +********************************************************/ + +/* $XConsortium: shape.h,v 1.15 91/02/17 13:09:32 rws Exp $ */ + +#ifndef _SHAPE_H_ +#define _SHAPE_H_ + +#include + +#define X_ShapeQueryVersion 0 +#define X_ShapeRectangles 1 +#define X_ShapeMask 2 +#define X_ShapeCombine 3 +#define X_ShapeOffset 4 +#define X_ShapeQueryExtents 5 +#define X_ShapeSelectInput 6 +#define X_ShapeInputSelected 7 +#define X_ShapeGetRectangles 8 + +#define ShapeSet 0 +#define ShapeUnion 1 +#define ShapeIntersect 2 +#define ShapeSubtract 3 +#define ShapeInvert 4 + +#define ShapeBounding 0 +#define ShapeClip 1 + +#define ShapeNotifyMask (1L << 0) +#define ShapeNotify 0 + +#define ShapeNumberEvents (ShapeNotify + 1) + +#ifndef _SHAPE_SERVER_ +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came frome a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* window of event */ + int kind; /* ShapeBounding or ShapeClip */ + int x, y; /* extents of new region */ + unsigned width, height; + Time time; /* server timestamp when region changed */ + Bool shaped; /* true if the region exists */ +} XShapeEvent; + +_XFUNCPROTOBEGIN + +extern Bool XShapeQueryExtension ( +#if NeedFunctionPrototypes + Display* /* display */, + int* /* event_base */, + int* /* error_base */ +#endif +); + +extern Status XShapeQueryVersion ( +#if NeedFunctionPrototypes + Display* /* display */, + int* /* major_version */, + int* /* minor_version */ +#endif +); + +extern void XShapeCombineRegion ( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* dest */, + int /* dest_kind */, + int /* x_off */, + int /* y_off */, + Region /* region */, + int /* op */ +#endif +); + +extern void XShapeCombineRectangles ( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* dest */, + int /* dest_kind */, + int /* x_off */, + int /* y_off */, + XRectangle* /* rectangles */, + int /* n_rects */, + int /* op */, + int /* ordering */ +#endif +); + +extern void XShapeCombineMask ( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* dest */, + int /* dest_kind */, + int /* x_off */, + int /* y_off */, + Pixmap /* src */, + int /* op */ +#endif +); + +extern void XShapeCombineShape ( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* dest */, + int /* dest_kind */, + int /* x_off */, + int /* y_off */, + Window /* src */, + int /* src_kind */, + int /* op */ +#endif +); + +extern void XShapeOffsetShape ( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* dest */, + int /* dest_kind */, + int /* x_off */, + int /* y_off */ +#endif +); + +extern Status XShapeQueryExtents ( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* window */, + Bool* /* bounding_shaped */, + int* /* x_bounding */, + int* /* y_bounding */, + unsigned int* /* w_bounding */, + unsigned int* /* h_bounding */, + Bool* /* clip_shaped */, + int* /* x_clip */, + int* /* y_clip */, + unsigned int* /* w_clip */, + unsigned int* /* h_clip */ +#endif +); + +extern void XShapeSelectInput ( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* window */, + unsigned long /* mask */ +#endif +); + +extern unsigned long XShapeInputSelected ( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* window */ +#endif +); + +extern XRectangle *XShapeGetRectangles ( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* window */, + int /* kind */, + int* /* count */, + int* /* ordering */ +#endif +); + +_XFUNCPROTOEND + +#endif /* _SHAPE_SERVER_ */ + +#endif /* _SHAPE_H_ */ diff --git a/xie/build/dec/shapestr.h b/xie/build/dec/shapestr.h new file mode 100644 index 0000000..9f3475b --- /dev/null +++ b/xie/build/dec/shapestr.h @@ -0,0 +1,255 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/************************************************************ +Copyright 1989 by The Massachusetts Institute of Technology + +Permission to use, copy, modify, and distribute this +software and its documentation for any purpose and without +fee is hereby granted, provided that the above copyright +no- tice appear in all copies and that both that copyright +no- tice and this permission notice appear in supporting +docu- mentation, and that the name of MIT not be used in +advertising or publicity pertaining to distribution of the +software without specific prior written permission. +M.I.T. makes no representation about the suitability of +this software for any purpose. It is provided "as is" +without any express or implied warranty. + +MIT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT- +NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE LI- +ABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH +THE USE OR PERFORMANCE OF THIS SOFTWARE. + +********************************************************/ + +/* $XConsortium: shapestr.h,v 1.9 90/06/07 10:08:36 rws Exp $ */ + +/* + * Protocol requests constants and alignment values + * These would really be in SHAPE's X.h and Xproto.h equivalents + */ + +#include "shape.h" +#include +/* for Window & Time defines */ +/* Added to match X11/Xproto.h */ +#define Window CARD32 +#define Time CARD32 + +#define SHAPENAME "SHAPE" + +#define SHAPE_MAJOR_VERSION 1 /* current version numbers */ +#define SHAPE_MINOR_VERSION 0 + +typedef struct _ShapeQueryVersion { + CARD8 reqType; /* always ShapeReqCode */ + CARD8 shapeReqType; /* always X_ShapeQueryVersion */ + CARD16 length B16; +} xShapeQueryVersionReq; +#define sz_xShapeQueryVersionReq 4 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 unused; /* not used */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 majorVersion B16; /* major version of SHAPE protocol */ + CARD16 minorVersion B16; /* minor version of SHAPE protocol */ + CARD32 pad0 B32; + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; +} xShapeQueryVersionReply; +#define sz_xShapeQueryVersionReply 32 + +typedef struct _ShapeRectangles { + CARD8 reqType; /* always ShapeReqCode */ + CARD8 shapeReqType; /* always X_ShapeRectangles */ + CARD16 length B16; + CARD8 op; /* Set, ... */ + CARD8 destKind; /* ShapeBounding or ShapeClip */ + CARD8 ordering; /* UnSorted, YSorted, YXSorted, YXBanded */ + CARD8 pad0; /* not used */ + CARD32 dest B32; /* Window */ + INT16 xOff B16; + INT16 yOff B16; +} xShapeRectanglesReq; /* followed by xRects */ +#define sz_xShapeRectanglesReq 16 + +typedef struct _ShapeMask { + CARD8 reqType; /* always ShapeReqCode */ + CARD8 shapeReqType; /* always X_ShapeMask */ + CARD16 length B16; + + CARD8 op; /* Set, ... */ + CARD8 destKind; /* ShapeBounding or ShapeClip */ + CARD16 junk B16; /* not used */ + + CARD32 dest B32; /* Window */ + INT16 xOff B16; + INT16 yOff B16; + CARD32 src B32; /* 1 bit pixmap */ +} xShapeMaskReq; +#define sz_xShapeMaskReq 20 + +typedef struct _ShapeCombine { + CARD8 reqType; /* always ShapeReqCode */ + CARD8 shapeReqType; /* always X_ShapeCombine */ + CARD16 length B16; + CARD8 op; /* Set, ... */ + CARD8 destKind; /* ShapeBounding or ShapeClip */ + CARD8 srcKind; /* ShapeBounding or ShapeClip */ + CARD8 junk; /* not used */ + CARD32 dest B32; /* Window */ + INT16 xOff B16; + INT16 yOff B16; + CARD32 src B32; /* Window */ +} xShapeCombineReq; +#define sz_xShapeCombineReq 20 + +typedef struct _ShapeOffset { + CARD8 reqType; /* always ShapeReqCode */ + CARD8 shapeReqType; /* always X_ShapeOffset */ + CARD16 length B16; + CARD8 destKind; /* ShapeBounding or ShapeClip */ + CARD8 junk1; /* not used */ + CARD16 junk2 B16; /* not used */ + CARD32 dest B32; /* Window */ + INT16 xOff B16; + INT16 yOff B16; +} xShapeOffsetReq; +#define sz_xShapeOffsetReq 16 + +typedef struct _ShapeQueryExtents { + CARD8 reqType; /* always ShapeReqCode */ + CARD8 shapeReqType; /* always X_ShapeQueryExtents */ + CARD16 length B16; + CARD32 window B32; /* request destination id */ +} xShapeQueryExtentsReq; +#define sz_xShapeQueryExtentsReq 8 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 unused; /* not used */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* 0 */ + CARD8 boundingShaped; /* window has bounding shape */ + CARD8 clipShaped; /* window has clip shape */ + CARD16 unused1 B16; + INT16 xBoundingShape B16; /* extents of bounding shape */ + INT16 yBoundingShape B16; + CARD16 widthBoundingShape B16; + CARD16 heightBoundingShape B16; + INT16 xClipShape B16; /* extents of clip shape */ + INT16 yClipShape B16; + CARD16 widthClipShape B16; + CARD16 heightClipShape B16; + CARD32 pad1 B32; +} xShapeQueryExtentsReply; +#define sz_xShapeQueryExtentsReply 32 + +typedef struct _ShapeSelectInput { + CARD8 reqType; /* always ShapeReqCode */ + CARD8 shapeReqType; /* always X_ShapeSelectInput */ + CARD16 length B16; + CARD32 window B32; /* request destination id */ + BYTE enable; /* xTrue -> send events */ + BYTE pad1; + CARD16 pad2 B16; +} xShapeSelectInputReq; +#define sz_xShapeSelectInputReq 12 + +typedef struct _ShapeNotify { + BYTE type; /* always eventBase + ShapeNotify */ + BYTE kind; /* either ShapeBounding or ShapeClip */ + CARD16 sequenceNumber B16; + Window window B32; + INT16 x B16; + INT16 y B16; /* extents of new shape */ + CARD16 width B16; + CARD16 height B16; + Time time B32; /* time of change */ + BYTE shaped; /* set when a shape actual exists */ + BYTE pad0; + CARD16 pad1 B16; + CARD32 pad2 B32; + CARD32 pad3 B32; +} xShapeNotifyEvent; +#define sz_xShapeNotifyEvent 32 + +typedef struct _ShapeInputSelected { + CARD8 reqType; /* always ShapeReqCode */ + CARD8 shapeReqType; /* always X_ShapeInputSelected */ + CARD16 length B16; + CARD32 window B32; /* request destination id */ +} xShapeInputSelectedReq; +#define sz_xShapeInputSelectedReq 8 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 enabled; /* current status */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* 0 */ + CARD32 pad1 B32; /* unused */ + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xShapeInputSelectedReply; +#define sz_xShapeInputSelectedReply 32 + +typedef struct _ShapeGetRectangles { + CARD8 reqType; /* always ShapeReqCode */ + CARD8 shapeReqType; /* always X_ShapeGetRectangles */ + CARD16 length B16; + CARD32 window B32; /* request destination id */ + CARD8 kind; /* ShapeBounding or ShapeClip */ + CARD8 junk1; + CARD16 junk2 B16; +} xShapeGetRectanglesReq; +#define sz_xShapeGetRectanglesReq 12 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 ordering; /* UnSorted, YSorted, YXSorted, YXBanded */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not zero */ + CARD32 nrects B32; /* number of rectangles */ + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; +} xShapeGetRectanglesReply; /* followed by xRectangles */ +#define sz_xShapeGetRectanglesReply 32 +#undef Window CARD32 +#undef Time CARD32 diff --git a/xie/build/dec/shmstr.h b/xie/build/dec/shmstr.h new file mode 100644 index 0000000..4c742ac --- /dev/null +++ b/xie/build/dec/shmstr.h @@ -0,0 +1,207 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/************************************************************ +Copyright 1989 by The Massachusetts Institute of Technology + +Permission to use, copy, modify, and distribute this +software and its documentation for any purpose and without +fee is hereby granted, provided that the above copyright +no- tice appear in all copies and that both that copyright +no- tice and this permission notice appear in supporting +docu- mentation, and that the name of MIT not be used in +advertising or publicity pertaining to distribution of the +software without specific prior written permission. +M.I.T. makes no representation about the suitability of +this software for any purpose. It is provided "as is" +without any express or implied warranty. + +********************************************************/ + +/* THIS IS NOT AN X CONSORTIUM STANDARD */ + +/* $XConsortium: shmstr.h,v 1.6 91/07/12 09:18:52 rws Exp $ */ + +#include "XShm.h" + +#include /* for Window & VisualId defines */ +/* Added to match X11/Xproto.h */ +#define Window CARD32 +#define Drawable CARD32 +#define VisualID CARD32 +#define GContext CARD32 +#define Pixmap CARD32 + +#define SHMNAME "MIT-SHM" + +#define SHM_MAJOR_VERSION 1 /* current version numbers */ +#define SHM_MINOR_VERSION 1 + +#ifdef _XSHM_SERVER_ +typedef struct _ShmFuncs { + PixmapPtr (* CreatePixmap)(); + void (* PutImage)(); +} ShmFuncs, *ShmFuncsPtr; +#endif + +typedef struct _ShmQueryVersion { + CARD8 reqType; /* always ShmReqCode */ + CARD8 shmReqType; /* always X_ShmQueryVersion */ + CARD16 length B16; +} xShmQueryVersionReq; +#define sz_xShmQueryVersionReq 4 + +typedef struct { + BYTE type; /* X_Reply */ + BOOL sharedPixmaps; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 majorVersion B16; /* major version of SHM protocol */ + CARD16 minorVersion B16; /* minor version of SHM protocol */ + CARD16 uid B16; + CARD16 gid B16; + CARD8 pixmapFormat; + CARD8 pad0; + CARD16 pad1 B16; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; +} xShmQueryVersionReply; +#define sz_xShmQueryVersionReply 32 + +typedef struct _ShmAttach { + CARD8 reqType; /* always ShmReqCode */ + CARD8 shmReqType; /* always X_ShmAttach */ + CARD16 length B16; + ShmSeg shmseg; + CARD32 shmid; + BOOL readOnly; + BYTE pad0; + CARD16 pad1; +} xShmAttachReq; +#define sz_xShmAttachReq 16 + +typedef struct _ShmDetach { + CARD8 reqType; /* always ShmReqCode */ + CARD8 shmReqType; /* always X_ShmDetach */ + CARD16 length B16; + ShmSeg shmseg; +} xShmDetachReq; +#define sz_xShmDetachReq 8 + +typedef struct _ShmPutImage { + CARD8 reqType; /* always ShmReqCode */ + CARD8 shmReqType; /* always X_ShmPutImage */ + CARD16 length B16; + Drawable drawable B32; + GContext gc B32; + CARD16 totalWidth B16; + CARD16 totalHeight B16; + CARD16 srcX B16; + CARD16 srcY B16; + CARD16 srcWidth B16; + CARD16 srcHeight B16; + INT16 dstX B16; + INT16 dstY B16; + CARD8 depth; + CARD8 format; + CARD8 sendEvent; + CARD8 bpad; + ShmSeg shmseg B32; + CARD32 offset B32; +} xShmPutImageReq; +#define sz_xShmPutImageReq 40 + +typedef struct _ShmGetImage { + CARD8 reqType; /* always ShmReqCode */ + CARD8 shmReqType; /* always X_ShmGetImage */ + CARD16 length B16; + Drawable drawable B32; + INT16 x B16; + INT16 y B16; + CARD16 width B16; + CARD16 height B16; + CARD32 planeMask B32; + CARD8 format; + CARD8 pad0; + CARD8 pad1; + CARD8 pad2; + ShmSeg shmseg B32; + CARD32 offset B32; +} xShmGetImageReq; +#define sz_xShmGetImageReq 32 + +typedef struct _ShmGetImageReply { + BYTE type; /* X_Reply */ + CARD8 depth; + CARD16 sequenceNumber B16; + CARD32 length B32; + VisualID visual B32; + CARD32 size B32; + CARD32 pad0 B32; + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; +} xShmGetImageReply; +#define sz_xShmGetImageReply 32 + +typedef struct _ShmCreatePixmap { + CARD8 reqType; /* always ShmReqCode */ + CARD8 shmReqType; /* always X_ShmCreatePixmap */ + CARD16 length B16; + Pixmap pid B32; + Drawable drawable B32; + CARD16 width B16; + CARD16 height B16; + CARD8 depth; + CARD8 pad0; + CARD8 pad1; + CARD8 pad2; + ShmSeg shmseg B32; + CARD32 offset B32; +} xShmCreatePixmapReq; +#define sz_xShmCreatePixmapReq 28 + +typedef struct _ShmCompletion { + BYTE type; /* always eventBase + ShmCompletion */ + BYTE bpad0; + CARD16 sequenceNumber B16; + Drawable drawable B32; + CARD16 minorEvent B16; + BYTE majorEvent; + BYTE bpad1; + ShmSeg shmseg B32; + CARD32 offset B32; + CARD32 pad0 B32; + CARD32 pad1 B32; + CARD32 pad2 B32; +} xShmCompletionEvent; +#define sz_xShmCompletionEvent 32 + +#undef Window CARD32 +#undef Drawable CARD32 +#undef VisualID CARD32 +#undef GContext CARD32 +#undef Pixmap CARD32 diff --git a/xie/build/dec/smt.h b/xie/build/dec/smt.h new file mode 100644 index 0000000..5beb6e2 --- /dev/null +++ b/xie/build/dec/smt.h @@ -0,0 +1,106 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ +/* $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/include/smt.h,v 1.1.2.4 92/07/21 07:22:58 Jim_Ludwig Exp $ + * smt.h + * Shared Memory Transport definitions + */ + + +#ifndef _SMT_H_ +#define _SMT_H_ + +#if defined(SMT_DEBUG) +#define SMT_DIAG(s) s +#else +#define SMT_DIAG(s) +#endif /* SMT_DEBUG */ + +#define SMT_PROTOCOL_NAME "Shared-Memory Transport" + +/* + * Requests + */ +#define X_SmtQueryVersion 0 +#define X_SmtAttach 1 +#define X_SmtWakeupServer 2 + +/* + * event stuff + */ +#define XSmtWakeupNotifyMask 0x02000000 + +#define XSmtWakeupNotify 0 +#define XSmtNumberOfEvents (XSmtWakeupNotify + 1) + +#define XSmtBadSegment 0 +#define XSmtNumberOfErrors (XSmtBadSegment + 1) + +#define SMT_REQ (1 << 0) +#define SMT_REP (1 << 1) +#define SMT_NEED_WAKEUP (1 << 2) +#define SMT_NEWVER (1 << 3) + +#ifndef _SMT_SERVER_ +/* + * Extra definitions that will only be needed in the client + */ +typedef XID XSmt; + +extern Bool XSmtQueryVersion(); /* is extension on server? */ +extern Bool XSmtAttach(); /* attach shared memory transport */ +extern Bool XWakeupServer(); /* wakeup server */ + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + int send_event; /* true if this came frome a SendEvent request */ + struct _XDisplay *display; /* Display the event was read from */ +} XSmtWakeupEvent; + +#endif /* _SMT_SERVER_ */ +#endif /* _SMT_H_ */ diff --git a/xie/build/dec/smtstr.h b/xie/build/dec/smtstr.h new file mode 100644 index 0000000..5a46db7 --- /dev/null +++ b/xie/build/dec/smtstr.h @@ -0,0 +1,194 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ +/* $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/include/smtstr.h,v 1.1.2.5 92/08/03 09:32:18 Dave_Hill Exp $ + * smtstr.h + * Shared Memory Transport definitions + */ + +#ifndef _SMTSTR_H_ +#define _SMTSTR_H_ + +#include +#include +#include + +/* + * Minor Version Description + * ------------- ----------- + * 0 Wakeup request increments serial number + * 1 not implemented + * 2 Wakeup request doesn't increment serial number + */ +#define SMT_MAJOR_VERSION 1 +#define SMT_MINOR_VERSION 2 + + +typedef struct _SmtProcInfo { + int whoami; + int status; + int pid; +} SmtProcInfo, *SmtProcInfoPtr; + +typedef struct _SmtPrivate { + SmtProcInfo server; + SmtProcInfo client; +} SmtPrivate, *SmtPrivatePtr; + +typedef struct _SmtQueryVersion { + CARD8 reqType; + CARD8 smtReqType; + CARD16 length B16; +} xSmtQueryVersionReq; +#define sz_xSmtQueryVersionReq 4 + +typedef struct { + BYTE type; /* X_Reply */ + BYTE bpad0; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 majorVersion B16; + CARD16 minorVersion B16; + CARD16 uid B16; + CARD16 gid B16; + CARD32 pad0 B32; + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; +} xSmtQueryVersionReply; +#define sz_xSmtQueryVersionReply 32; + +typedef struct _SmtAttach { + CARD8 reqType; + CARD8 smtReqType; + CARD16 length B16; + CARD16 flags; + CARD8 majorVersion; + CARD8 minorVersion; + Channel chan; +} xSmtAttachReq; +#define sz_xSmtAttachReq sizeof(xSmtAttachReq) + +typedef struct { + BYTE type; /* X_Reply */ + BYTE bpad0; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 status B32; + CARD32 pad0 B32; + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; +} xSmtAttachReply; +#define sz_xSmtAttachReply 32; + +typedef struct _SmtWakeupServer { + CARD8 reqType; + CARD8 smtReqType; + CARD16 length B16; + CARD32 flags; +} xSmtWakeupServerReq; +#define sz_xSmtWakeupServerReq 8 + +typedef struct _SmtWakeup { + BYTE type; /* eventBase + SmtWakeup */ + BYTE bpad0; + CARD16 sequenceNumber B16; + CARD32 flags; + CARD32 pad0 B32; + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; +} xSmtWakeupEvent; +#define sz_xSmtWakeupEvent 32 + +#ifdef _SMT_SERVER_ + +typedef struct { /* SMT_DEFER_FREE */ + int (*freep)(/* ptr,dat */); + unsigned char *Q; + unsigned long *ptr; + unsigned long dat; + unsigned int len; +} smtQEntry, *smtQEntryPtr; + +#define SMT_Q_DEPTH 11 /* SMT_DEFER_FREE */ + +typedef struct { /* SMT_DEFER_FREE */ + int last; /* next to be freed */ + int this; /* current request */ + int next; /* next to be written */ + smtQEntry e[SMT_Q_DEPTH]; +} smtQueue, *smtQueuePtr; + +typedef struct _smtControlBlock { + Channel chan; /* channel control block */ + SmtPrivatePtr pPriv; + int wakeRec; /* wakeup requests received */ + int wakeSent; /* wakeup events sent */ + int (*ReadRequestFromClient)(); + smtQueue q; /* queue of req's to free */ + short majorVersion, minorVersion; /* client versions */ +} smtControlBlock, *smtControlBlockPtr; + +#else /* client-side definitions */ + +typedef struct _smtDisplay { + Channel chan; + char *buffer; /* saved non-smt buffer starting address. */ + char *bufptr; /* saved non-smt buffer index pointer. */ + char *bufmax; /* saved non-smt buffer index pointer. */ + SmtPrivatePtr pPriv; /* pointer to server-client private area */ + short majorVersion, minorVersion; /* server versions */ +} smtDisplay, *smtDisplayPtr; + +#endif /* _SMT_SERVER_ */ + +#endif /* _SMTSTR_H_ */ diff --git a/xie/build/dec/xemacros.h b/xie/build/dec/xemacros.h new file mode 100644 index 0000000..445b57d --- /dev/null +++ b/xie/build/dec/xemacros.h @@ -0,0 +1,358 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* +************************************************************************** +** DIGITAL EQUIPMENT CORPORATION ** +** CONFIDENTIAL ** +** NOT FOR MODIFICATION OR REDISTRIBUTION IN ANY MANNER WHATSOEVER ** +************************************************************************** +*/ +#ifndef __XEMACROS__ +#define __XEMACROS__ "@(#)xemacros.h 1.9 - 90/09/18 " +/* RCSID = $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/include/xemacros.h,v 1.1.2.3 92/04/27 12:33:06 Leela_Obilichetti Exp $" */ +/***************************************************************************** +Copyright 1987, 1988, 1989, 1990, 1991 by Digital Equipment Corp., Maynard, MA + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*****************************************************************************/ +/* + * + * CONTRIBUTORS: + * + * Dick Annicchiarico + * Robert Chesler + * Dan Coutu + * Gene Durso + * Marc Evans + * Alan Jamison + * Mark Henry + * Ken Miller + * + * DESCRIPTION: + * This include file is designed to provide the *visible* + * interface to XTrap data structures. Fields can be set + * using these macros by client programs unless otherwise + * specified; however, use of Trap Context convenience + * routines is strongly encouraged (XETrapContext.c) + */ +#include "bits.h" + +/* msleep macro to replace msleep() for portability reasons */ +#define msleep(m) usleep((m)*1000) + +/* Copying TC's assumes that the new TC must be created */ +#define XECopyTC(src,mask,dest) \ + (dest = XECreateTC(((src)->dpy), (mask), (&((src)->values)))) + +/* Expands to SET each element of the TCValues structure + * Returns the TCValues Mask so that the Set can be entered + * as an argument to the XEChangeTC() routine call + */ +/* Note: req_cb & evt_cb would only be used if you wanted to + * *share* callbacks between Trap Contexts. Normally, + * XEAddRequestCB() and XEAddEventCB() would be used. + */ +#define XETrapSetCfgReqCB(tcv,x) ((tcv)->req_cb = (x)) +#define XETrapSetCfgEvtCB(tcv,x) ((tcv)->evt_cb = (x)) +#define XETrapSetCfgMaxPktSize(tcv,x) ((tcv)->v.max_pkt_size = (x)) +#define XETrapSetCfgCmdKey(tcv,x) ((tcv)->v.cmd_key = (x)) +/* Note: e is only pertinent for "valid" or "data" */ +#define XETrapSetCfgFlags(tcv,e,a) \ + memcpy((tcv)->v.flags.e, (a), sizeof((tcv)->v.flags.e)) +#define XETrapSetCfgFlagTimestamp(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapTimestamp, (x)) +#define XETrapSetCfgFlagCmd(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapCmd, (x)) +#define XETrapSetCfgFlagCmdKeyMod(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapCmdKeyMod, (x)) +#define XETrapSetCfgFlagRequest(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapRequest, (x)) +#define XETrapSetCfgFlagEvent(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapEvent, (x)) +#define XETrapSetCfgFlagMaxPacket(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapMaxPacket, (x)) +#define XETrapSetCfgFlagStatistics(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapStatistics, (x)) +#define XETrapSetCfgFlagWinXY(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapWinXY, (x)) +#define XETrapSetCfgFlagCursor(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapCursor, (x)) +#define XETrapSetCfgFlagReq(tcv,request,x) \ + BitSet((tcv)->v.flags.req, (request), (x)) +#define XETrapSetCfgFlagXInput(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapXInput, (x)) +#define XETrapSetCfgFlagColorReplies(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapColorReplies, (x)) +#define XETrapSetCfgFlagGrabServer(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapGrabServer, (x)) +#define XETrapSetCfgFlagEvt(tcv,evt,x) \ + BitSet((tcv)->v.flags.event, (evt), (x)) + +#define XETrapSetValFlagDeltaTimes(tcv,x) \ + BitSet((tcv)->tc_flags, XETCDeltaTimes, (x)) + +/* Fields returned in the "GetAvailable" request */ +#define XETrapGetAvailPFIdent(avail) ((avail)->pf_ident) +#define XETrapGetAvailRelease(avail) ((avail)->xtrap_release) +#define XETrapGetAvailVersion(avail) ((avail)->xtrap_version) +#define XETrapGetAvailRevision(avail) ((avail)->xtrap_revision) +#define XETrapGetAvailMaxPktSize(avail) ((avail)->max_pkt_size) +#define XETrapGetAvailFlags(avail,a) \ + memcpy((a), (avail)->valid, sizeof((avail)->valid)) +#define XETrapGetAvailFlagTimestamp(avail) \ + (BitValue((avail)->valid, XETrapTimestamp)) +#define XETrapGetAvailFlagCmd(avail) \ + (BitValue((avail)->valid, XETrapCmd)) +#define XETrapGetAvailFlagCmdKeyMod(avail) \ + (BitValue((avail)->valid, XETrapCmdKeyMod)) +#define XETrapGetAvailFlagRequest(avail) \ + (BitValue((avail)->valid, XETrapRequest)) +#define XETrapGetAvailFlagEvent(avail) \ + (BitValue((avail)->valid, XETrapEvent)) +#define XETrapGetAvailFlagMaxPacket(avail) \ + (BitValue((avail)->valid, XETrapMaxPacket)) +#define XETrapGetAvailFlagStatistics(avail) \ + (BitValue((avail)->valid, XETrapStatistics)) +#define XETrapGetAvailFlagWinXY(avail) \ + (BitValue((avail)->valid, XETrapWinXY)) +#define XETrapGetAvailFlagCursor(avail) \ + (BitValue((avail)->valid, XETrapCursor)) +#define XETrapGetAvailFlagXInput(avail) \ + (BitValue((avail)->valid, XETrapXInput)) +#define XETrapGetAvailFlagVecEvt(avail) \ + (BitValue((avail)->valid, XETrapVectorEvents)) +#define XETrapGetAvailFlagColorReplies(avail) \ + (BitValue((avail)->valid, XETrapColorReplies)) +#define XETrapGetAvailFlagGrabServer(avail) \ + (BitValue((avail)->valid, XETrapGrabServer)) +#define XETrapGetAvailOpCode(avail) ((avail)->major_opcode) +/* Macro's for creating current request and trap context macros */ +#define XETrapGetCfgMaxPktSize(cfg) ((cfg)->max_pkt_size) +#define XETrapGetCfgCmdKey(cfg) ((cfg)->cmd_key) +#define XETrapGetCfgFlags(cfg,e,a) \ + memcpy((a), (cfg)->flags.e, sizeof((cfg)->flags.e)) +#define XETrapGetCfgFlagTimestamp(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapTimestamp)) +#define XETrapGetCfgFlagCmd(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapCmd)) +#define XETrapGetCfgFlagCmdKeyMod(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapCmdKeyMod)) +#define XETrapGetCfgFlagRequest(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapRequest)) +#define XETrapGetCfgFlagEvent(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapEvent)) +#define XETrapGetCfgFlagMaxPacket(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapMaxPacket)) +#define XETrapGetCfgFlagStatistics(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapStatistics)) +#define XETrapGetCfgFlagWinXY(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapWinXY)) +#define XETrapGetCfgFlagCursor(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapCursor)) +#define XETrapGetCfgFlagXInput(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapXInput)) +#define XETrapGetCfgFlagColorReplies(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapColorReplies)) +#define XETrapGetCfgFlagGrabServer(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapGrabServer)) +/* Request values are in "Xproto.h" of the flavor X_RequestType */ +#define XETrapGetCfgFlagReq(cfg,request) \ + (BitValue((cfg)->flags.req, (request))) +/* Event types are in "X.h" of the flavor EventType (e.g. KeyPress) */ +#define XETrapGetCfgFlagEvt(cfg,evt) \ + (BitValue((cfg)->flags.event, (evt))) + +/* Fields returned int the "GetCurrent" Request */ +#define XETrapGetCurX(avail) ((avail)->cur_x) +#define XETrapGetCurY(avail) ((avail)->cur_y) +#define XETrapGetCurSFlags(cur,a) \ + memcpy((a), (cur)->state_flags, sizeof((cur)->state_flags)) +#define XETrapGetCurMaxPktSize(cur) (XETrapGetCfgMaxPktSize(&((cur)->config))) +#define XETrapGetCurCmdKey(cur) (XETrapGetCfgCmdKey(&((cur)->config))) +/* Note: e is only pertinent for "valid" or "data" */ +#define XETrapGetCurCFlags(cur,e,a) (XETrapGetCfgFlags(&((cur)->config),e,a)) +#define XETrapGetCurFlagTimestamp(cur,e) \ + (XETrapGetCfgFlagTimestamp(&((cur)->config),e)) +#define XETrapGetCurFlagCmd(cur,e) (XETrapGetCfgFlagCmd(&((cur)->config),e)) +#define XETrapGetCurFlagCmdKeyMod(cur,e) \ + (XETrapGetCfgFlagCmdKeyMod(&((cur)->config),e)) +#define XETrapGetCurFlagRequest(cur,r) \ + (XETrapGetCfgFlagRequest(&((cur)->config),r)) +#define XETrapGetCurFlagEvent(cur,e) \ + (XETrapGetCfgFlagEvent(&((cur)->config),e)) +#define XETrapGetCurFlagMaxPacket(cur,e) \ + (XETrapGetCfgFlagMaxPacket(&((cur)->config),e)) +#define XETrapGetCurFlagStatistics(cur,e) \ + (XETrapGetCfgFlagStatistics(&((cur)->config),e)) +#define XETrapGetCurFlagWinXY(cur,e) \ + (XETrapGetCfgFlagWinXY(&((cur)->config),e)) +#define XETrapGetCurFlagCursor(cur,e) \ + (XETrapGetCfgFlagCursor(&((cur)->config),e)) +#define XETrapGetCurFlagXInput(cur,e) \ + (XETrapGetCfgFlagXInput(&((cur)->config),e)) +#define XETrapGetCurFlagColorReplies(cur,e) \ + (XETrapGetCfgFlagColorReplies(&((cur)->config),e)) +#define XETrapGetCurFlagGrabServer(cur,e) \ + (XETrapGetCfgFlagGrabServer(&((cur)->config),e)) +/* Request values are in "Xproto.h" of the flavor X_RequestType */ +#define XETrapGetCurFlagReq(cur,r) (XETrapGetCfgFlagReq(&((cur)->config),r)) +/* Event types are in "X.h" of the flavor EventType (e.g. KeyPress) */ +#define XETrapGetCurFlagEvt(cur,e) (XETrapGetCfgFlagEvt(&((cur)->config),e)) + +/* Fields returned int the "GetStatistics" Request */ +#define XETrapGetStatsReq(stat,e) ((stat)->requests[(e)]) +#define XETrapGetStatsEvt(stat,e) ((stat)->events[(e)]) + +/* Fields returned in the "GetVersion" request */ +#define XETrapGetVersRelease(vers) ((vers)->xtrap_release) +#define XETrapGetVersVersion(vers) ((vers)->xtrap_version) +#define XETrapGetVersRevision(vers) ((vers)->xtrap_revision) + +/* Fields returned in the "GetLastInpTime" request */ +#define XETrapGetLastInpTime(time_rep) ((time_rep)->last_time) + +/* Expands to GET each element of the TCValues structure */ +#define XETrapGetTCReqCB(tc) ((tc)->values.req_cb) +#define XETrapGetTCEvtCB(tc) ((tc)->values.evt_cb) +#define XETrapGetTCTime(tc) ((tc)->values.last_time) +/* TC specific flags */ +#define XETrapGetTCLFlags(tc,a) \ + memcpy((a), (tc)->values.tc_flags, sizeof((tc)->values.tc_flags)) +#define XETrapGetTCFlagDeltaTimes(tc) \ + (BitValue((tc)->values.tc_flags, XETCDeltaTimes)) +#define XETrapGetTCFlagTrapActive(tc) \ + (BitValue((tc)->values.tc_flags, XETCTrapActive)) +#define XETrapGetTCMaxPktSize(tc) (XETrapGetCfgMaxPktSize(&((tc)->values.v))) +#define XETrapGetTCCmdKey(tc) (XETrapGetCfgCmdKey(&((tc)->values.v))) +/* Note: e is only pertinent for "valid" or "data" */ +#define XETrapGetTCFlags(tc,e,a) (XETrapGetCfgFlags(&((tc)->values.v),e,a)) +#define XETrapGetTCFlagTimestamp(tc,e) \ + (XETrapGetCfgFlagTimestamp(&((tc)->values.v),e)) +#define XETrapGetTCFlagCmd(tc,e) \ + (XETrapGetCfgFlagCmd(&((tc)->values.v),e)) +#define XETrapGetTCFlagCmdKeyMod(tc,e) \ + (XETrapGetCfgFlagCmdKeyMod(&((tc)->values.v),e)) +#define XETrapGetTCFlagRequest(tc,r) \ + (XETrapGetCfgFlagRequest(&((tc)->values.v),r)) +#define XETrapGetTCFlagEvent(tc,e) \ + (XETrapGetCfgFlagEvent(&((tc)->values.v),e)) +#define XETrapGetTCFlagMaxPacket(tc,e) \ + (XETrapGetCfgFlagMaxPacket(&((tc)->values.v),e)) +#define XETrapGetTCFlagStatistics(tc,e) \ + (XETrapGetCfgFlagStatistics(&((tc)->values.v),e)) +#define XETrapGetTCFlagWinXY(tc,e) \ + (XETrapGetCfgFlagWinXY(&((tc)->values.v),e)) +#define XETrapGetTCFlagCursor(tc,e) \ + (XETrapGetCfgFlagCursor(&((tc)->values.v),e)) +#define XETrapGetTCFlagXInput(tc,e) \ + (XETrapGetCfgFlagXInput(&((tc)->values.v),e)) +#define XETrapGetTCFlagColorReplies(tc,e) \ + (XETrapGetCfgFlagColorReplies(&((tc)->values.v),e)) +#define XETrapGetTCFlagGrabServer(tc,e) \ + (XETrapGetCfgFlagGrabServer(&((tc)->values.v),e)) +/* Request values are in "Xproto.h" of the flavor X_RequestType */ +#define XETrapGetTCFlagReq(tc,r) \ + (XETrapGetCfgFlagReq(&((tc)->values.v),r)) +/* Event types are in "X.h" of the flavor EventType (e.g. KeyPress) */ +#define XETrapGetTCFlagEvt(tc,e) \ + (XETrapGetCfgFlagEvt(&((tc)->values.v),e)) +/* The following can/should *not* be set directly! */ +#define XETrapGetNext(tc) ((tc)->next) +#define XETrapGetDpy(tc) ((tc)->dpy) +#define XETrapGetEventBase(tc) ((tc)->eventBase) +#define XETrapGetErrorBase(tc) ((tc)->errorBase) +#define XETrapGetExtOpcode(tc) ((tc)->extOpcode) +#define XETrapGetXBuff(tc) ((tc)->xbuff) +#define XETrapGetXMaxSize(tc) ((tc)->xmax_size) +#define XETrapGetExt(tc) ((tc)->ext_data) +#define XETrapGetDirty(tc) ((tc)->dirty) +#define XETrapGetValues(tc) memcpy((x),(tc)->values,sizeof((tc)->values)) +#define XETrapGetEventFunc(tc) ((tc)->eventFunc) + +#define XETrapGetHeaderCount(phdr) ((phdr)->count) +#define XETrapGetHeaderTimestamp(phdr) ((phdr)->timestamp) +#define XETrapGetHeaderType(phdr) ((phdr)->type) +#define XETrapGetHeaderScreen(phdr) ((phdr)->screen) +#define XETrapGetHeaderWindowX(phdr) ((phdr)->win_x) +#define XETrapGetHeaderWindowY(phdr) ((phdr)->win_y) +#define XETrapGetHeaderClient(phdr) ((phdr)->client) + +#define XEGetRelease(tc) ((tc)->release) +#define XEGetVersion(tc) ((tc)->version) +#define XEGetRevision(tc) ((tc)->revision) + +/* Condition handling macros */ +#ifndef _InitExceptionHandling +#ifdef vms +#define _InitExceptionHandling(rtn) \ + VAXC$ESTABLISH(rtn) /* VMS exception handler */ +#else /* vms */ +#define _InitExceptionHandling(rtn) \ + (void)signal(SIGBUS, rtn); /* Bus error */ \ + (void)signal(SIGSEGV, rtn); /* Accvio/Segment error */ \ + (void)signal(SIGFPE, rtn); /* Floating point exception */ \ + (void)signal(SIGILL, rtn); /* Illegal instruction */ \ + (void)signal(SIGSYS, rtn); /* Param error in sys call */ \ + (void)signal(SIGHUP, rtn); \ + (void)signal(SIGPIPE, rtn); \ + (void)signal(SIGTERM, rtn) +#endif /* vms */ +#endif /* _InitExceptionHandling */ + +#ifndef _ClearExceptionHandling +#ifdef vms +#define _ClearExceptionHandling() \ + LIB$REVERT() +#else +#define _ClearExceptionHandling() \ + (void)signal(SIGBUS, SIG_DFL); /* Bus error */ \ + (void)signal(SIGSEGV, SIG_DFL); /* Accvio/Segment error */ \ + (void)signal(SIGFPE, SIG_DFL); /* Floating point exception */ \ + (void)signal(SIGILL, SIG_DFL); /* Illegal instruction */ \ + (void)signal(SIGSYS, SIG_DFL); /* Param error in sys call */ \ + (void)signal(SIGHUP, SIG_DFL); \ + (void)signal(SIGPIPE, SIG_DFL); \ + (void)signal(SIGTERM, SIG_DFL) +#endif /* vms */ +#endif /* _ClearExceptionHandling */ + +#endif /* __XEMACROS__ */ + diff --git a/xie/build/dec/xestream.h b/xie/build/dec/xestream.h new file mode 100644 index 0000000..ecc9361 --- /dev/null +++ b/xie/build/dec/xestream.h @@ -0,0 +1,201 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* +************************************************************************** +** DIGITAL EQUIPMENT CORPORATION ** +** CONFIDENTIAL ** +** NOT FOR MODIFICATION OR REDISTRIBUTION IN ANY MANNER WHATSOEVER ** +************************************************************************** +*/ +/* BuildSystemHeader added automatically */ +/* $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/include/xestream.h,v 1.1.2.2 92/02/06 16:53:05 Jim_Ludwig Exp $ */ +#ifndef __XESTREAM__ +#define __XESTREAM__ "@(#)xestream.h 1.11 - 90/11/07 " + +/***************************************************************************** +Copyright 1987, 1988, 1989, 1990, 1991 by Digital Equipment Corp., Maynard, MA + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*****************************************************************************/ +/* + * + * CONTRIBUTORS: + * + * Dick Annicchiarico + * Robert Chesler + * Dan Coutu + * Gene Durso + * Marc Evans + * Alan Jamison + * Mark Henry + * Ken Miller + * + * DESCRIPTION: + * This header file describes the data structures and constants + * required to utilize the custom "stream" facility which presents + * a common interface to varying I/O transports. Currently only + * partially implemented for (server-side). + */ +#include +#if defined TCPCONN && !defined VMS +#include +#endif +#if defined DNETCONN && !defined VMS +#include +#endif + +typedef struct +{ + INT32 flink; + INT32 blink; +} +#ifdef VMS + _align(QUADWORD) +#endif + QUEUE_HDR; + +/* Stream I/O data abstraction: + * The following structures support a loose rendition of + * stream I/O abstraction for use in writing more portable + * applications between VMS and U*IX. It was intentionally + * decided NOT to attempt to implement streams per the + * published interface specification (beyond *our* scope). + * However, the *principle* is being observed in the hope + * that someday XTrap can take advantage of some future + * streams implementation. + */ +typedef struct _XESTREAM /* stream I/O object */ +{ + struct _XESTREAM *next; + CARD8 type; + Bool queue; + int_function accept; + int_function close; + int_function read; + int_function write; + void_function err_func; + CARD16 addr1_lgth; /* in bytes (counted string) */ + char *addr1; /* string of what's opened */ + CARD16 addr2_lgth; /* in bytes (counted string) */ + char *addr2; /* Maybe a return addr (DECnet) */ + union + { + struct _qio + { + INT16 read_chan; + INT16 write_chan; + CARD16 iosb[4L]; + CARD32 efn; + CARD32 read_mode; + CARD32 write_mode; + QUEUE_HDR *read_queue; /* must be quadword-aligned loc */ + QUEUE_HDR *free_queue; /* must be quadword-aligned loc */ + CARD32 byte_cnt; + CARD32 bufsiz; + CARD32 bufinc; + CARD32 errno; +#if defined TCPCONN || defined DNETCONN + CARD32 accept_efn; + INT16 port; + INT16 mbx_chan; + void *ncb; /* VMS-only Network Command Block Info */ + void *netcmd; /* VMS-only Network Command Mbx Logical */ +#endif + } Q; + struct _dsc + { + INT32 fd; + INT32 sd; /* socket descriptor for init connection */ +#if defined TCPCONN && !defined VMS + struct sockaddr_in insock; +#endif +#if defined DNETCONN && !defined VMS + struct sockaddr_dn dnsock; +#endif + } D; + } u; +} XESTREAM; + +/* Currently defined Stream Types */ +#define StreamInternet 1L +#define StreamDECnet 2L +#define StreamMbx 3L /* Only on VMS */ +#define StreamShMem 4L /* Not Currently Implemented */ +#define StreamFile 5L +#define StreamLAT 6L /* Not Currently Implemented */ + + +#define BUFSIZstream 1500L /* Stream BUFSIZ used w/queued stream type */ + /* Note: Can't be <110 bytes for DECnet */ +#define BUFstream 1L /* Initial increment of n buffers per */ + /* stream. Increases exponentially as more */ + /* are req'd */ +#ifdef vms +typedef struct _QREC +{ + CARD32 queue_entry[2L]; + CARD16 iosb[4L]; + XESTREAM *st; + CARD8 *data; +} +#ifdef VMS + _align(QUADWORD) +#endif + QREC; +typedef struct _QREC *QRECPtr; + +#define MbxSize 8192L +#define MbxBufs 2L + +#endif + +#if defined TCPCONN || defined DNETCONN +#define AcceptInterval 2 /* in seconds */ +#define AcceptLoops 15 /* max times around the loop */ +#endif + +#define XEStreamEFN 7L /* Arbitrary event flag in cluster 0 for VMS use */ + +#define SIOErr(st,err_str) ((void)(*(st)->err_func)(err_str)) +#define SIOSetErrFunc(st,rtn) ((st)->err_func = (void_function)rtn) +#define SIOGetErrFunc(st) ((st)->err_func) + +#endif /* __XESTREAM__ */ diff --git a/xie/build/dec/xkmeproto_include.h b/xie/build/dec/xkmeproto_include.h new file mode 100644 index 0000000..e9e30d3 --- /dev/null +++ b/xie/build/dec/xkmeproto_include.h @@ -0,0 +1,123 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/*********************************************************************** +Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts. +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +************************************************************************/ +/* +**++ +** FACILITY: +** +** common struct +** +** ABSTRACT: +** +** It contains protocol definition for the keyboard management extension. +** (KME). +** The KME extension name string and all relevant protocol definition for +** I18N keyboard mode-switching are defined here. +** +** ENVIRONMENT: +** +** Ultrix +** +** MODIFICATION HISTORY: +** +**-- +**/ +#ifndef XKMEPROTO_INCLUDE_H +#define XKMEPROTO_INCLUDE_H + +#define KMEXTENSIONNAME "Keyboard-Management-Extension" + +/* constant returned by XKME routines indicating that the target server + * version does not honor the request */ +#define KMEBADREQUEST 2 + +/* Opcodes to set and reset keyboard mode-switch */ +#define X_KMEDoKBModeSwitch 10 + +/* command mode constants for switching the keyboard mode */ +#define LockDownModeSwitch 1 +#define UnlockModeSwitch 2 + + +/* reply constants */ +#define KBModeSwitchSuccess 0 /* kb mode successfully switched */ +#define KBModeSwitchFailure 1 /* kb mode failed to switch */ +#define KBModeSwitchInvalidCmd 2 /* invalid kb mode-switch command */ +#define KBModeSwitchNoop 3 /* Keyboard is already in the request mode*/ + + +/* + * X_KMEDoKBModeSwitch request packet def + */ +typedef struct { + CARD8 reqType; + CARD8 minor_opcode; + CARD16 length B16; + CARD32 mode B32; /* LockDownModeSwitch or UnlockModeSwitch */ +} xKMEDoKBModeSwitchReq; + +/* + * X_KMEDoKBModeSwitch reply packet definition + */ +typedef struct { + BYTE type; + BYTE data1; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 status B32; /* 0 = SUCCESS, 1 = FAILURE */ + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; +}xKMEDoKBModeSwitchRep; + +#define sz_xKMEDoKBModeSwitchReq (sizeof(xKMEDoKBModeSwitchReq)) +#define sz_xKMEDoKBModeSwitchRep (sizeof(xKMEDoKBModeSwitchRep)) + +#endif /* XKMEPROTO_INCLUDE_H */ diff --git a/xie/build/dec/xtestext1.h b/xie/build/dec/xtestext1.h new file mode 100644 index 0000000..9f86011 --- /dev/null +++ b/xie/build/dec/xtestext1.h @@ -0,0 +1,327 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* + * xtestext1.h + * + * X11 Input Synthesis Extension include file + */ + +/* + +Copyright 1986, 1987, 1988 by Hewlett-Packard Corporation +Copyright 1986, 1987, 1988 by the Massachusetts Institute of Technology + +Permission to use, copy, modify, and distribute this +software and its documentation for any purpose and without +fee is hereby granted, provided that the above copyright +notice appear in all copies and that both that copyright +notice and this permission notice appear in supporting +documentation, and that the name of M.I.T. not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +Hewlett-Packard and M.I.T. make no representations about the +suitability of this software for any purpose. It is provided +"as is" without express or implied warranty. + +This software is not subject to any license of the American +Telephone and Telegraph Company or of the Regents of the +University of California. + +*/ + +/* + * the typedefs for CARD8, CARD16, and CARD32 are defined in Xmd.h + */ + +/* + * used in the XTestPressButton and XTestPressKey functions + */ +#define XTestPRESS 1 << 0 +#define XTestRELEASE 1 << 1 +#define XTestSTROKE 1 << 2 + +/* + * When doing a key or button stroke, the number of milliseconds + * to delay between the press and the release of a key or button + * in the XTestPressButton and XTestPressKey functions. + */ + +#define XTestSTROKE_DELAY_TIME 10 + +/* + * used in the XTestGetInput function + */ +#define XTestEXCLUSIVE 1 << 0 +#define XTestPACKED_ACTIONS 1 << 1 +#define XTestPACKED_MOTION 1 << 2 + +/* + * used in the XTestFakeInput function + */ +#define XTestFAKE_ACK_NOT_NEEDED 0 +#define XTestFAKE_ACK_REQUEST 1 + +/* + * used in the XTest extension initialization routine + */ +#define XTestEXTENSION_NAME "XTestExtension1" +#define XTestEVENT_COUNT 2 + +/* + * XTest request type values + * + * used in the XTest extension protocol requests + */ +#define X_TestFakeInput 1 +#define X_TestGetInput 2 +#define X_TestStopInput 3 +#define X_TestReset 4 +#define X_TestQueryInputSize 5 + +/* + * This defines the maximum size of a list of input actions + * to be sent to the server. It should always be a multiple of + * 4 so that the entire xTestFakeInputReq structure size is a + * multiple of 4. + */ +#define XTestMAX_ACTION_LIST_SIZE 64 + +typedef struct { + CARD8 reqType; /* always XTestReqCode */ + CARD8 XTestReqType; /* always X_TestFakeInput */ + CARD16 length B16; /* 2 + XTestMAX_ACTION_LIST_SIZE/4 */ + CARD32 ack B32; + CARD8 action_list[XTestMAX_ACTION_LIST_SIZE]; +} xTestFakeInputReq; +#define sz_xTestFakeInputReq (XTestMAX_ACTION_LIST_SIZE + 8) + +typedef struct { + CARD8 reqType; /* always XTestReqCode */ + CARD8 XTestReqType; /* always X_TestGetInput */ + CARD16 length B16; /* 2 */ + CARD32 mode B32; +} xTestGetInputReq; +#define sz_xTestGetInputReq 8 + +typedef struct { + CARD8 reqType; /* always XTestReqCode */ + CARD8 XTestReqType; /* always X_TestStopInput */ + CARD16 length B32; /* 1 */ +} xTestStopInputReq; +#define sz_xTestStopInputReq 4 + +typedef struct { + CARD8 reqType; /* always XTestReqCode */ + CARD8 XTestReqType; /* always X_TestReset */ + CARD16 length B16; /* 1 */ +} xTestResetReq; +#define sz_xTestResetReq 4 + +typedef struct { + CARD8 reqType; /* always XTestReqCode */ + CARD8 XTestReqType; /* always X_TestQueryInputSize */ + CARD16 length B16; /* 1 */ +} xTestQueryInputSizeReq; +#define sz_xTestQueryInputSizeReq 4 + +/* + * This is the definition of the reply for the xTestQueryInputSize + * request. It should remain the same minimum size as other replies + * (32 bytes). + */ +typedef struct { + CARD8 type; /* always X_Reply */ + CARD8 pad1; + CARD16 sequenceNumber B16; + CARD32 length B32; /* always 0 */ + CARD32 size_return B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xTestQueryInputSizeReply; + +/* + * This is the definition for the input action wire event structure. + * This event is sent to the client when the server has one or + * more user input actions to report to the client. It must + * remain the same size as all other wire events (32 bytes). + */ +#define XTestACTIONS_SIZE 28 + +typedef struct { + CARD8 type; /* always XTestInputActionType */ + CARD8 pad00; + CARD16 sequenceNumber B16; + CARD8 actions[XTestACTIONS_SIZE]; +} xTestInputActionEvent; + +/* + * This is the definition for the xTestFakeAck wire event structure. + * This event is sent to the client when the server has completely + * processed its input action buffer, and is ready for more. + * It must remain the same size as all other wire events (32 bytes). + */ +typedef struct { + CARD8 type; /* always XTestFakeAckType */ + CARD8 pad00; + CARD16 sequenceNumber B16; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; + CARD32 pad06 B32; + CARD32 pad07 B32; + CARD32 pad08 B32; +} xTestFakeAckEvent; + +/* + * The server side of this extension does not (and should not) have + * definitions for Display and Window. The ifndef allows the server + * side of the extension to ignore the following typedefs. + */ +#ifndef XTestSERVER_SIDE +/* + * This is the definition for the input action host format event structure. + * This is the form that a client using this extension will see when + * it receives an input action event. + */ +typedef struct { + int type; /* always XTestInputActionType */ + Display *display; + Window window; + CARD8 actions[XTestACTIONS_SIZE]; +} XTestInputActionEvent; + +/* + * This is the definition for the xTestFakeAck host format event structure. + * This is the form that a client using this extension will see when + * it receives an XTestFakeAck event. + */ +typedef struct { + int type; /* always XTestFakeAckType */ + Display *display; + Window window; +} XTestFakeAckEvent; +#endif + +/* + * This is the definition for the format of the header byte + * in the input action structures. + */ +#define XTestACTION_TYPE_MASK 0x03 /* bits 0 and 1 */ +#define XTestKEY_STATE_MASK 0x04 /* bit 2 (key action) */ +#define XTestX_SIGN_BIT_MASK 0x04 /* bit 2 (motion action) */ +#define XTestY_SIGN_BIT_MASK 0x08 /* bit 3 (motion action) */ +#define XTestDEVICE_ID_MASK 0xf0 /* bits 4 through 7 */ + +#define XTestMAX_DEVICE_ID 0x0f +#define XTestPackDeviceID(x) (((x) & XTestMAX_DEVICE_ID) << 4) +#define XTestUnpackDeviceID(x) (((x) & XTestDEVICE_ID_MASK) >> 4) + +/* + * These are the possible action types. + */ +#define XTestDELAY_ACTION 0 +#define XTestKEY_ACTION 1 +#define XTestMOTION_ACTION 2 +#define XTestJUMP_ACTION 3 + +/* + * These are the definitions for key/button motion input actions. + */ +#define XTestKEY_UP 0x04 +#define XTestKEY_DOWN 0x00 + +typedef struct { + CARD8 header; /* which device, key up/down */ + CARD8 keycode; /* which key/button to move */ + CARD16 delay_time B16; /* how long to delay (in ms) */ +} XTestKeyInfo; + +/* + * This is the definition for pointer jump input actions. + */ +typedef struct { + CARD8 header; /* which pointer */ + CARD8 pad1; /* unused padding byte */ + CARD16 jumpx B16; /* x coord to jump to */ + CARD16 jumpy B16; /* y coord to jump to */ + CARD16 delay_time B16; /* how long to delay (in ms) */ +} XTestJumpInfo; + +/* + * These are the definitions for pointer relative motion input + * actions. + * + * The sign bits for the x and y relative motions are contained + * in the header byte. The x and y relative motions are packed + * into one byte to make things fit in 32 bits. If the relative + * motion range is larger than +/-15, use the pointer jump action. + */ +#define XTestMOTION_MAX 15 +#define XTestMOTION_MIN -15 + +#define XTestX_NEGATIVE 0x04 +#define XTestY_NEGATIVE 0x08 + +#define XTestX_MOTION_MASK 0x0f +#define XTestY_MOTION_MASK 0xf0 + +#define XTestPackXMotionValue(x) ((x) & XTestX_MOTION_MASK) +#define XTestPackYMotionValue(x) (((x) << 4) & XTestY_MOTION_MASK) + +#define XTestUnpackXMotionValue(x) ((x) & XTestX_MOTION_MASK) +#define XTestUnpackYMotionValue(x) (((x) & XTestY_MOTION_MASK) >> 4) + +typedef struct { + CARD8 header; /* which pointer */ + CARD8 motion_data; /* x,y relative motion */ + CARD16 delay_time B16; /* how long to delay (in ms) */ +} XTestMotionInfo; + +/* + * These are the definitions for a long delay input action. It is + * used when more than XTestSHORT_DELAY_TIME milliseconds of delay + * (approximately one minute) is needed. + * + * The device ID for a delay is always set to XTestDELAY_DEVICE_ID. + * This guarantees that a header byte with a value of 0 is not + * a valid header, so it can be used as a flag to indicate that + * there are no more input actions in an XTestInputAction event. + */ + +#define XTestSHORT_DELAY_TIME 0xffff +#define XTestDELAY_DEVICE_ID 0x0f + +typedef struct { + CARD8 header; /* always XTestDELAY_DEVICE_ID */ + CARD8 pad1; /* unused padding byte */ + CARD16 pad2 B16; /* unused padding word */ + CARD32 delay_time B32; /* how long to delay (in ms) */ +} XTestDelayInfo; diff --git a/xie/build/dec/xteststr.h b/xie/build/dec/xteststr.h new file mode 100644 index 0000000..9c04a0f --- /dev/null +++ b/xie/build/dec/xteststr.h @@ -0,0 +1,121 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* $XConsortium: xteststr.h,v 1.5 92/04/20 13:14:15 rws Exp $ */ +/* + +Copyright 1992 by the Massachusetts Institute of Technology + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation, and that the name of M.I.T. not be used in advertising or +publicity pertaining to distribution of the software without specific, +written prior permission. M.I.T. makes no representations about the +suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +*/ + +/* The following are needed for correctly-sized protocol requests */ + +#include +#define Window CARD32 +#define Time CARD32 +#define Cursor CARD32 + + +#define XTestCurrentCursor ((Cursor)1) + +typedef struct { + CARD8 reqType; /* always XTestReqCode */ + CARD8 xtReqType; /* always X_XTestGetVersion */ + CARD16 length B16; + CARD8 majorVersion; + CARD8 pad; + CARD16 minorVersion B16; +} xXTestGetVersionReq; +#define sz_xXTestGetVersionReq 8 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 majorVersion; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 minorVersion B16; + CARD16 pad0 B16; + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; +} xXTestGetVersionReply; +#define sz_xXTestGetVersionReply 32 + +typedef struct { + CARD8 reqType; /* always XTestReqCode */ + CARD8 xtReqType; /* always X_XTestCompareCursor */ + CARD16 length B16; + Window window B32; + Cursor cursor B32; +} xXTestCompareCursorReq; +#define sz_xXTestCompareCursorReq 12 + +typedef struct { + BYTE type; /* X_Reply */ + BOOL same; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 pad0 B32; + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; +} xXTestCompareCursorReply; +#define sz_xXTestCompareCursorReply 32 + +/* used only on the client side */ +typedef struct { + CARD8 reqType; /* always XTestReqCode */ + CARD8 xtReqType; /* always X_XTestFakeInput */ + CARD16 length B16; + BYTE type; + BYTE detail; + CARD16 pad0 B16; + Time time B32; + Window root B32; + CARD32 pad1 B32; + CARD32 pad2 B32; + INT16 rootX B16, rootY B16; + CARD32 pad3 B32; + CARD32 pad4 B32; +} xXTestFakeInputReq; +#define sz_xXTestFakeInputReq 36 + +#undef Window CARD32 +#undef Time CARD32 +#undef Cursor CARD32 diff --git a/xie/build/dec/xtrapddmi.h b/xie/build/dec/xtrapddmi.h new file mode 100644 index 0000000..6928ffd --- /dev/null +++ b/xie/build/dec/xtrapddmi.h @@ -0,0 +1,181 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* BuildSystemHeader added automatically */ +/* $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/include/xtrapddmi.h,v 1.1.2.3 92/04/27 12:36:37 Leela_Obilichetti Exp $ */ +#ifndef __XTRAPDDMI__ +#define __XTRAPDDMI__ + +/***************************************************************************** +Copyright 1987, 1988, 1989, 1990, 1991 by Digital Equipment Corp., Maynard, MA + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*****************************************************************************/ +/* + * + * CONTRIBUTORS: + * + * Dick Annicchiarico + * Robert Chesler + * Dan Coutu + * Gene Durso + * Marc Evans + * Alan Jamison + * Mark Henry + * Ken Miller + * + * DESCRIPTION: + * This header file is used by the XTrap server extension only + * (not used by clients or the XTrap Toolkit). Information + * contained herein should *not* be visible to clients (xtrapdi.h + * is used for this). The name is historical. + */ +#include "X.h" +#include "bits.h" +#include "dix.h" + +#ifndef MIN +# define MIN(a,b) ((a) < (b) ? (a) : (b)) +#endif +#ifndef MAX +# define MAX(a,b) ((a) > (b) ? (a) : (b)) +#endif + +#define XETrapNumEvents 1L /* constants used for AddExtension */ + +/* Other constants used within the extension code */ +#define XETrapMinRepSize 32L /* Minimum number of longs */ + +/* This structure will be globally declared to provide storage to hold + * the various extension wide configuration information. Allocated on + * a per-client basis. + */ +typedef struct +{ + ClientPtr client; /* Multi-client support and error handling */ + xXTrapGetCurReply cur; /* Struct of Miscellaneous state info */ + xXTrapGetStatsReply *stats; /* Pointer to stat's, malloc'd if requested */ + CARD32 last_input_time B32; /* last timestamp from input event */ + CARD16 protocol B16; /* current communication protocol */ +} XETrapEnv; + +#define XETrapSetHeaderEvent(phdr) ((phdr)->type = 0x1L) +#define XETrapSetHeaderRequest(phdr) ((phdr)->type = 0x2L) +#define XETrapSetHeaderSpecial(phdr) ((phdr)->type = 0x3L) +#define XETrapSetHeaderCursor(phdr) ((phdr)->type = 0x4L) +#define XETrapSetHeaderReply(phdr) ((phdr)->type = 0x5L) + +#ifdef X11R3 +/* Swapping macros not visible in X11 Release 3 */ +#define LengthRestB(stuff) \ + (((unsigned long)stuff->length << 2) - sizeof(*stuff)) + +#define LengthRestS(stuff) \ + (((unsigned long)stuff->length << 1) - (sizeof(*stuff) >> 1)) + +#define LengthRestL(stuff) \ + ((unsigned long)stuff->length - (sizeof(*stuff) >> 2)) + +#define SwapRestS(stuff) \ + SwapShorts((short *)(stuff + 1), LengthRestS(stuff)) + +#define SwapRestL(stuff) \ + SwapLongs((long *)(stuff + 1), LengthRestL(stuff)) + +/* copy long from src to dst byteswapping on the way */ +#ifndef cpswapl +#define cpswapl(Src, Dest) \ + { \ + char *pSrc = (char *)&(Src); \ + char *pDest = (char *)&(Dest); \ + pDest[0] = pSrc[3]; \ + pDest[1] = pSrc[2]; \ + pDest[2] = pSrc[1]; \ + pDest[3] = pSrc[0]; \ + } +#endif +/* copy short from src to dst byteswapping on the way */ +#ifndef cpswaps +#define cpswaps(Src, Dest)\ + { \ + char *pSrc = ((char *)&(Src)); \ + char *pDest = ((char *)&(Dest)); \ + pDest[1] = pSrc[0]; \ + pDest[0] = pSrc[1]; \ + } +#endif +#endif /* X11R3 */ + +#ifndef vaxc +#define globaldef +#define globalref extern +#endif + +/* Extension platform identifier (conditionally defined) */ +#ifdef osf1 +# define XETrapPlatform PF_DECOSF1 +#endif +#ifdef ultrix +# define XETrapPlatform PF_DECUltrix +#endif +#ifdef vms +#ifdef VAXELN +# define XETrapPlatform PF_DECELN +#else +# define XETrapPlatform PF_DECVMS +#endif +#endif +#ifdef VT1000 +# define XETrapPlatform PF_DECVT1000 +#endif +#ifdef VXT +# define XETrapPlatform PF_DECXTerm +#endif +#ifdef PC +# define XETrapPlatform PF_IBMAT +#endif +#ifdef sun +# define XETrapPlatform PF_SunSparc +#endif +#ifndef XETrapPlatform +# define XETrapPlatform PF_Other +#endif /* XETrapPlatform */ + +#endif /* __XTRAPDDMI__ */ diff --git a/xie/build/dec/xtrapdi.h b/xie/build/dec/xtrapdi.h new file mode 100644 index 0000000..ccca215 --- /dev/null +++ b/xie/build/dec/xtrapdi.h @@ -0,0 +1,539 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* +************************************************************************** +** DIGITAL EQUIPMENT CORPORATION ** +** CONFIDENTIAL ** +** NOT FOR MODIFICATION OR REDISTRIBUTION IN ANY MANNER WHATSOEVER ** +************************************************************************** +*/ +#ifndef __XTRAPDI__ +#define __XTRAPDI__ + +/***************************************************************************** +Copyright 1987, 1988, 1989, 1990, 1991, 1992 by Digital Equipment Corp., +Maynard, MA + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*****************************************************************************/ +/* + * + * CONTRIBUTORS: + * + * Dick Annicchiarico + * Robert Chesler + * Dan Coutu + * Gene Durso + * Marc Evans + * Alan Jamison + * Mark Henry + * Ken Miller + * + * DESCRIPTION: + * This header file defines the common structures/constants + * between the XTrap extension and clients. All protocol + * definitions between XTrap extension/clients can be found + * here. + */ + +#define NEED_REPLIES +#define NEED_EVENTS +#include +#include "X.h" +#include "Xmd.h" +#ifdef SMT +#define NEED_EVENTS +#define NEED_REPLIES +#endif +#include "Xproto.h" +#include "bits.h" +#define XTrapExtName "DEC-XTRAP" +/* Current Release, Version, and Revision of the XTrap Extension */ +#define XETrapRelease 3L +#define XETrapVersion 3L +#ifndef XETrapRevision /* Changed from the Makefile by users */ +# define XETrapRevision 0L +#endif /* XETrapRevision */ +#define XETrapProtocol 32L + +#ifndef B8 +# define B8 :8 +#endif +#ifndef SIZEOF +# ifdef __STDC__ +# define SIZEOF(x) sz_##x +# else +# define SIZEOF(x) sz_/**/x +# endif /* if ANSI C compiler else not */ +#endif +#ifndef sz_CARD32 +#define sz_CARD32 4L +#endif +#ifndef sz_CARD8 +#define sz_CARD8 1L +#endif +#ifndef True +# define True 1L +# define False 0L +#endif + +typedef int (*int_function)(); +typedef void (*void_function)(); + +/* This is used as flags to indicate desired request traps + * Note: This has been padded to a CARD32 to keep structure aligned + */ +#define XETrapMaxRequest (((SIZEOF(CARD32)+((256L-1L) / \ + (BitsInByte*SIZEOF(CARD8))))/SIZEOF(CARD32))*SIZEOF(CARD32)) +typedef CARD8 ReqFlags[XETrapMaxRequest]; + +/* This is used as flags to indicate desired event traps + * Until events become *fully vectored*, we'll have to fake it + * by defining an array of 5 events (KeyPress, KeyRelease, + * ButtonPress, ButtonRelease, and MotionNotify. The extra 2 + * are required as the event types start with "2" (errors and + * replies are 0 & 1). The event type is the index into the + * bits. + * Note: This has been padded to a longword to keep structure aligned + */ +#ifndef VECTORED_EVENTS +#define XETrapCoreEvents (2L+5L) +#else +#define XETrapCoreEvents 128L +#endif +#define XETrapMaxEvent (((SIZEOF(CARD32)+((XETrapCoreEvents-1L) / \ + (BitsInByte*SIZEOF(CARD8))))/SIZEOF(CARD32))*SIZEOF(CARD32)) +typedef CARD8 EventFlags[XETrapMaxEvent]; + +/* This structure is used in a request to specify the types of + * configuration information that should be changed or updated. + */ +typedef struct +{ + CARD8 valid[4L]; /* Bits TRUE indicates data field is used */ + CARD8 data[4L]; /* Bits looked at if corresponding valid bit set */ + ReqFlags req; /* Bits coorespond to core requests */ + EventFlags event; /* Bits correspond to core events */ +} XETrapFlags; + +/* Bit definitions for the above XETrapFlags structure. */ +#define XETrapTimestamp 0L /* hdr timestamps desired */ +#define XETrapCmd 1L /* command key specified */ +#define XETrapCmdKeyMod 2L /* cmd key is a modifier */ +#define XETrapRequest 3L /* output requests array */ +#define XETrapEvent 4L /* future output events array */ +#define XETrapMaxPacket 5L /* Maximum packet length set */ +#define XETrapTransOut 6L /* obsolete */ +#define XETrapStatistics 7L /* collect counts on requests */ +#define XETrapWinXY 8L /* Fill in Window (X,Y) in hdr */ +#define XETrapTransIn 9L /* obsolete */ +#define XETrapCursor 10L /* Trap cursor state changes */ +#define XETrapXInput 11L /* Use XInput extension */ +#define XETrapVectorEvents 12L /* Use Vectored Events (128) */ +#define XETrapColorReplies 13L /* Return replies with Color Req's */ +#define XETrapGrabServer 14L /* Disables client GrabServers */ + +typedef struct /* used by XEConfigRequest */ +{ + XETrapFlags flags; /* Flags to specify what should be chg'd */ + CARD16 max_pkt_size B16; /* Maximum number of bytes in a packet */ + CARD8 cmd_key B8; /* Keyboard command_key (KeyCode) */ +/* + * cmd_key is intentionally *not* defined KeyCode since it's definition is + * ambiguous (int in Intrinsic.h and unsigned char in X.h. + */ + CARD8 pad[1L]; /* pad out to a quadword */ +} XETrapCfg; + +/* These structures are used within the Xtrap request structure for + * the various types of xtrap request + */ +#ifndef _XINPUT +/* (see the definition of XEvent as a reference) */ +typedef struct /* used by XESimulateXEventRequest for synthesizing core evts */ +{ + CARD8 type B8; /* (must be first) as in XEvent */ + CARD8 detail B8; /* Detail keycode/button as in XEvent */ + CARD8 screen B8; /* screen number (0 to n) */ + CARD8 pad B8; /* pad to longword */ + INT16 x B16; /* X & Y coord as in XEvent */ + INT16 y B16; +} XETrapInputReq; +#endif + +/* These are constants that refer to the extension request vector table. + * A request will use these values as minor opcodes. + */ +#define XETrap_Reset 0L /* set to steady state */ +#define XETrap_GetAvailable 1L /* get available funct from ext */ +#define XETrap_Config 2L /* configure extension */ +#define XETrap_StartTrap 3L /* use Trapping */ +#define XETrap_StopTrap 4L /* stop using Trapping */ +#define XETrap_GetCurrent 5L /* get current info from ext */ +#define XETrap_GetStatistics 6L /* get count statistics from ext */ +#ifndef _XINPUT +#define XETrap_SimulateXEvent 7L /* async input simulation */ +#endif +#define XETrap_GetVersion 8L /* Get (Just) Version */ +#define XETrap_GetLastInpTime 9L /* Get Timestamp of last client input */ + +/* The following are formats of a request to the XTRAP + * extension. The data-less XTrap requests all use xXTrapReq + */ +typedef struct +{ + CARD8 reqType B8; + CARD8 minor_opcode B8; + CARD16 length B16; + CARD32 pad B32; /* Maintain quadword alignment */ +} xXTrapReq; +/* the following works because all fields are defined as bit (Bnn) fields */ +#define sz_xXTrapReq (sizeof(xXTrapReq)) +/* For retrieving version/available info (passes lib-side protocol number) */ +typedef struct +{ + CARD8 reqType B8; + CARD8 minor_opcode B8; + CARD16 length B16; + CARD16 protocol B16; /* The xtrap extension protocol number */ + CARD16 pad B16; /* Maintain quadword alignment */ +} xXTrapGetReq; +/* the following works because all fields are defined as bit (Bnn) fields */ +#define sz_xXTrapGetReq (sizeof(xXTrapGetReq)) + +typedef struct +{ + CARD8 reqType B8; + CARD8 minor_opcode B8; + CARD16 length B16; + /* + * The follwing is done so that structure padding wont be + * a problem. The request structure contains a shadow for + * the XETrapCfg structure. Since the XETrapCfg also has a + * substructure (XETrapFlags) this structure is also shadowed. + * + * The following are a shadow of the XETrapFlags + * structure. + */ + CARD8 config_flags_valid[4L]; + CARD8 config_flags_data[4L]; + ReqFlags config_flags_req; + EventFlags config_flags_event; + /* End Shadow (XETrapFlags)*/ + CARD16 config_max_pkt_size B16; /* Max number of bytes in a packet */ + CARD8 config_cmd_key B8; /* Keyboard command_key (KeyCode) */ +/* + * cmd_key is intentionally *not* defined KeyCode since it's definition is + * ambiguous (int in Intrinsic.h and unsigned char in X.h. + */ + CARD8 config_pad[1L]; /* pad out to a quadword */ + /* End Shadow (XETrapCfg) */ + CARD32 pad B32; /* Maintain quadword alignment */ +} xXTrapConfigReq; +/* the following works because all fields are defined as bit (Bnn) fields */ +#define sz_xXTrapConfigReq (sizeof(xXTrapConfigReq)) + +#ifndef _XINPUT +typedef struct +{ + CARD8 reqType B8; + CARD8 minor_opcode B8; + CARD16 length B16; + CARD32 pad B32; /* Maintain quadword alignment */ + XETrapInputReq input; +} xXTrapInputReq; +/* the following works because all fields are defined as bit (Bnn) fields */ +#define sz_xXTrapInputReq (sizeof(xXTrapInputReq)) +#endif + + +/* The following structures are used by the server extension to send + * information and replies to the client. + */ + +/* header for all X replies */ +typedef struct +{ + CARD8 type B8; + CARD8 detail B8; + CARD16 sequenceNumber B16; + CARD32 length B32; +} XETrapRepHdr; + +/* Structure of Get Available Functionality reply */ +typedef struct +{ + CARD32 pf_ident B32; /* Contains constant identifying the platform */ + CARD16 xtrap_release B16; /* The xtrap extension release number */ + CARD16 xtrap_version B16; /* The xtrap extension version number */ + CARD16 xtrap_revision B16; /* The xtrap extension revision number */ + CARD16 max_pkt_size B16; /* Maximum number of bytes in a packet */ + CARD8 valid[4]; /* What specific configuration flags are valid */ + CARD32 major_opcode B32; /* The major opcode identifying xtrap */ + CARD32 event_base B32; /* The event value we start at */ + CARD32 pad0 B32; /* obsolete field */ + CARD16 pad1 B16, pad2 B16, pad3 B16; /* obsolete field */ + CARD16 xtrap_protocol B16; /* The xtrap extension protocol number */ + INT16 cur_x B16; /* Current X & Y coord for relative motion */ + INT16 cur_y B16; +} XETrapGetAvailRep; + +typedef struct +{ + CARD16 xtrap_release B16; /* The xtrap extension release number */ + CARD16 xtrap_version B16; /* The xtrap extension version number */ + CARD16 xtrap_revision B16; /* The xtrap extension revision number */ + CARD16 xtrap_protocol B16; /* The xtrap extension protocol number */ +} XETrapGetVersRep; + +typedef struct +{ + CARD32 last_time B32; /* Timestamp of last input time */ +} XETrapGetLastInpTimeRep; + +/* Structure of Get Current Configuration Information reply */ +typedef struct +{ + CARD8 state_flags[2]; /* Miscelaneous flags, see below #define's */ + CARD16 pad0 B16; /* Assure quadword alignment */ + XETrapCfg config; /* Current Config information */ + CARD32 pad1 B32; +} XETrapGetCurRep; + +/* Mask definitions for the above flags. */ +#define XETrapTrapActive 0L /* If sending/receiving between client/ext */ + +/* Structure of Get Statistics Information reply */ +typedef struct +{ + CARD32 requests[256L]; /* Array containing request counts if trapped */ + CARD32 events[XETrapCoreEvents]; /* Array containing event stats */ +#ifndef VECTORED_EVENTS + CARD32 pad B32; /* Pad out to a quadword */ +#endif +} XETrapGetStatsRep; + +#define PF_Other 0L /* server not one of the below */ +#define PF_Apollo 10L /* server on Apollo system */ +#define PF_ATT 20L /* server on AT&T system */ +#define PF_Cray1 30L /* server on Cray 1 system */ +#define PF_Cray2 31L /* server on Cray 2 system */ +#define PF_DECUltrix 40L /* server on DEC ULTRIX system */ +#define PF_DECVMS 41L /* server on DEC VMS system */ +#define PF_DECVT1000 42L /* server on DEC-VT1000-terminal */ +#define PF_DECXTerm 43L /* server on DEC-X-terminal */ +#define PF_DECELN 44L /* server on DEC VAXELN X terminal */ +#define PF_DECOSF1 45L /* server on DEC's OSF/1 system */ +#define PF_HP9000s800 50L /* server on HP 9000/800 system */ +#define PF_HP9000s300 51L /* server on HP 9000/300 system */ +#define PF_IBMAT 60L /* server on IBM/AT system */ +#define PF_IBMRT 61L /* server on IBM/RT system */ +#define PF_IBMPS2 62L /* server on IBM/PS2 system */ +#define PF_IBMRS 63L /* server on IBM/RS system */ +#define PF_MacII 70L /* server on Mac II system */ +#define PF_Pegasus 80L /* server on Tektronix Pegasus system */ +#define PF_SGI 90L /* server on Silicon Graphcis system */ +#define PF_Sony 100L /* server on Sony system */ +#define PF_Sun3 110L /* server on Sun 3 system */ +#define PF_Sun386i 111L /* server on Sun 386i system */ +#define PF_SunSparc 112L /* server on Sun Sparc system */ + +/* reply sent back by XETrapGetAvailable request */ +typedef struct +{ + XETrapRepHdr hdr; + XETrapGetAvailRep data; +} xXTrapGetAvailReply; +/* the following works because all fields are defined as bit (Bnn) fields */ +#define sz_xXTrapGetAvailReply sizeof(xXTrapGetAvailReply) + +/* reply sent back by XETrapGetVersion request */ +typedef struct +{ + XETrapRepHdr hdr; + XETrapGetVersRep data; + CARD32 pad0 B32; /* pad out to 32 bytes */ + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; +} xXTrapGetVersReply; +/* the following works because all fields are defined as bit (Bnn) fields */ +#define sz_xXTrapGetVersReply sizeof(xXTrapGetVersReply) + +/* reply sent back by XETrapGetLastInpTime request */ +typedef struct +{ + XETrapRepHdr hdr; + /* + * The following is a shadow of the XETrapGetLastInpTimeRep + * structure. This is done to avoid structure padding. + */ + CARD32 data_last_time B32; /* Timestamp of last input time */ + CARD32 pad0 B32; /* pad out to 32 bytes */ + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; +} xXTrapGetLITimReply; +/* the following works because all fields are defined as bit (Bnn) fields */ +#define sz_xXTrapGetLITimReply sizeof(xXTrapGetLITimReply) + +/* reply sent back by XETrapGetCurrent request */ +typedef struct +{ + XETrapRepHdr hdr; + /* + * The following is a shadow of the XETrapGetCurRep + * structure. This is done to avoid structure padding. + * Since the XETrapGetCurRep structure contains a sub-structure + * (XETrapCfg) there is a shadow for that as well.*/ + CARD8 data_state_flags[2]; /* Misc flags, see below #define's */ + CARD16 data_pad0 B16; /* Assure quadword alignment */ + /* XETrapCfg Shadow Starts */ + CARD8 data_config_flags_valid[4L]; + CARD8 data_config_flags_data[4L]; + ReqFlags data_config_flags_req; + EventFlags data_config_flags_event; + CARD16 data_config_max_pkt_size B16; /* Max num of bytes in a pkt */ + CARD8 data_config_cmd_key B8; /* Keyboard cmd_key (KeyCode) */ +/* + * cmd_key is intentionally *not* defined KeyCode since it's definition is + * ambiguous (int in Intrinsic.h and unsigned char in X.h. + */ + CARD8 data_config_pad[1L]; /* pad out to a quadword */ + /* End Shadow (XETrapCfg) */ + CARD32 pad1 B32; +} xXTrapGetCurReply; +/* the following works because all fields are defined as bit (Bnn) fields */ +#define sz_xXTrapGetCurReply sizeof(xXTrapGetCurReply) + +/* reply sent back by XETrapGetStatistics request */ +/* Note: + * The following does *not* use the standard XETrapRepHdr, but instead + * one which is padded out to 32-bytes. This is because Cray's have a problem + * reading arrays of CARD32s without using the _Read32 macro (see XERqsts.c). + * This requires that none of the data be in the _Reply area. + */ +typedef struct +{ + CARD8 type B8; + CARD8 detail B8; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 pad0 B32; + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + XETrapGetStatsRep data; +} xXTrapGetStatsReply; +#define sz_xXTrapGetStatsReply 1088 + +typedef struct /* the XTrap Output header (for output from ext to client) */ +{ /* this must be quadword aligned for portability */ + CARD32 count B32; /* Length including this header */ + CARD32 timestamp B32; /* timestamp if desired */ + CARD8 type B8; /* event id, request id, special id */ + CARD8 screen B8; /* screen number (0 to n) */ + INT16 win_x B16; /* X coord of drawable, if any */ + INT16 win_y B16; /* X coord of drawable, if any */ + CARD16 client B16; /* to distinguish requests */ +} XETrapHeader; +/* the following works because all fields are defined as bit (Bnn) fields */ +#define sz_XETrapHeader sizeof(XETrapHeader) + +#define XETrapHeaderIsEvent(phdr) (XETrapGetHeaderType(phdr) == 0x1L) +#define XETrapHeaderIsRequest(phdr) (XETrapGetHeaderType(phdr) == 0x2L) +#define XETrapHeaderIsSpecial(phdr) (XETrapGetHeaderType(phdr) == 0x3L) +#define XETrapHeaderIsCursor(phdr) (XETrapGetHeaderType(phdr) == 0x4L) +#define XETrapHeaderIsReply(phdr) (XETrapGetHeaderType(phdr) == 0x5L) + +/* Define a structure used for reading/writing datum of type XTrap */ +typedef struct +{ + XETrapHeader hdr; + union + { + xEvent event; + xResourceReq req; + xGenericReply reply; + /* special? */ + } u; +} XETrapDatum; + +/* this doesn't get picked up for VMS server builds (different Xproto.h) */ +#ifndef sz_xEvent +#define sz_xEvent 32 +#endif +/* Minimum size of a packet from the server extension */ +#define XETrapMinPktSize (SIZEOF(XETrapHeader) + SIZEOF(xEvent)) + +/* Constants used with the XLIB transport */ +#define XETrapDataStart 0L /* Used in the detail field */ +#define XETrapDataContinued 1L /* Used in the detail field */ +#define XETrapDataLast 2L /* Used in the detail field */ +#define XETrapData 0L /* Used in the type field */ +#define XETrapNumberEvents 1L +/* This is the representation on the wire(see also XLib.h) */ +#define sz_EventData 24L /* 32 bytes - type, detail, seq, index */ +typedef struct { + CARD8 type B8; + CARD8 detail B8; + CARD16 sequenceNumber B16; + CARD32 idx B32; + CARD8 data[sz_EventData]; +} xETrapDataEvent; + +/* Error message indexes added to X for extension */ +#define BadIO 2L /* Can't read/write */ +#define BadStatistics 4L /* Stat's not avail. */ +#define BadDevices 5L /* Devices not vectored */ +#define BadScreen 7L /* Can't send event to given screen */ +#define BadSwapReq 8L /* Can't send swapped extension requests */ +#define XETrapNumErrors (BadSwapReq + 1) + + +#define XEKeyIsClear 0 +#define XEKeyIsEcho 1 +#define XEKeyIsOther 2 + +#endif /* __XTRAPDI__ */ diff --git a/xie/build/dec/xtraplib.h b/xie/build/dec/xtraplib.h new file mode 100644 index 0000000..2cc58aa --- /dev/null +++ b/xie/build/dec/xtraplib.h @@ -0,0 +1,158 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* +************************************************************************** +** DIGITAL EQUIPMENT CORPORATION ** +** CONFIDENTIAL ** +** NOT FOR MODIFICATION OR REDISTRIBUTION IN ANY MANNER WHATSOEVER ** +************************************************************************** +*/ +#ifndef __XTRAPLIB__ +#define __XTRAPLIB__ "@(#)xtraplib.h 1.15 - 90/09/18 " +/* RCSID = $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/include/xtraplib.h,v 1.1.2.4 92/06/12 09:33:20 Jim_Ludwig Exp $" */ + +/***************************************************************************** +Copyright 1987, 1988, 1989, 1990, 1991 by Digital Equipment Corp., Maynard, MA + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*****************************************************************************/ +/* + * + * CONTRIBUTORS: + * + * Dick Annicchiarico + * Robert Chesler + * Dan Coutu + * Gene Durso + * Marc Evans + * Alan Jamison + * Mark Henry + * Ken Miller + * + * DESCRIPTION: + * This header file describes all the structures/constants required + * for interfacing with the client toolkit *except* the common + * client/extension definitions in xtrapdi.h. Namely, *no* extension- + * only information or client/extension information can be found here. + */ +#ifdef SMT +#define NEED_EVENTS +#define NEED_REPLIES +#endif +#include "Xlib.h" +#include "Intrinsic.h" +#include "xtrapdi.h" +#include "bits.h" +#include "xemacros.h" + +typedef struct /* Callback structure */ +{ + void_function func; + BYTE *data; +} XETrapCB; + +/* Data structure for setting trap context */ +typedef struct +{ + CARD8 tc_flags[2L]; /* Toolkit-side specific flags */ + XETrapCfg v; /* XTrap configuration values */ + XETrapCB *req_cb; /* Pointer to Request Callbacks */ + XETrapCB *evt_cb; /* Pointer to Event Callbacks (starting at 2) */ + CARD32 last_time B32; /* Last (delta) timestamp */ +} XETCValues; + + /* bits 0 thru 6 are formerly "families" (now obsolete) */ +#define XETCDeltaTimes 7 +#define XETCTrapActive 8 + /* bits 9 thru 15 are reserved for future expansion */ + +/* Values bit masks (used when determining what's dirty */ +#define TCStatistics (1L<<0L) +#define TCRequests (1L<<1L) +#define TCEvents (1L<<2L) +#define TCMaxPacket (1L<<3L) +#define TCCmdKey (1L<<4L) +#define TCTimeStamps (1L<<5L) +#define TCWinXY (1L<<6L) +#define TCXInput (1L<<7L) +#define TCReqCBs (1L<<8L) +#define TCEvtCBs (1L<<9L) +#define TCCursor (1L<<10L) +#define TCColorReplies (1L<<11L) +#define TCGrabServer (1L<<12L) + +/* Trap Context structure for maintaining XTrap State for client */ +typedef struct _XETC +{ + struct _XETC *next; /* Ptr to next linked-listed TC */ + Display *dpy; /* Display ptr of current TC */ + INT32 eventBase /*B32*/; /* First event value */ + INT32 errorBase /*B32*/; /* First error value */ + INT32 extOpcode /*B32*/; /* Major opcode of the extension */ + BYTE *xbuff; /* Pointer to buffer for XLib Communications */ + CARD16 xmax_size /*B16*/; /* Max Size of a request */ + XExtData *ext_data; /* hook for extension to hang data */ + /* + * The following are initialized with the client-side version number + * However, when either a GetAvailable or GetVersion reply is received, + * these values are updated with the *oldest* version numbers. + */ + CARD16 release /*B16*/; /* The extension release number */ + CARD16 version /*B16*/; /* The xtrap extension version number */ + CARD16 revision /*B16*/; /* The xtrap extension revision number */ + CARD16 protocol /*B16*/; /* The xtrap extension protocol number */ + unsigned dirty /*B32*/; /* cache dirty bits */ + XETCValues values; /* shadow structure of values */ + Boolean (*eventFunc[XETrapNumberEvents])(); +} XETC; + +/* This is the representation we use in the library code for XLib transport */ +typedef struct { + int type; + unsigned long serial; + Bool synthetic; + Display *display; + int detail; + unsigned long idx; + unsigned char data[sz_EventData]; +} XETrapDataEvent; + +#endif /* __XTRAPLIB__ */ diff --git a/xie/build/dec/xtraplibp.h b/xie/build/dec/xtraplibp.h new file mode 100644 index 0000000..d2e7b57 --- /dev/null +++ b/xie/build/dec/xtraplibp.h @@ -0,0 +1,192 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* +************************************************************************** +** DIGITAL EQUIPMENT CORPORATION ** +** CONFIDENTIAL ** +** NOT FOR MODIFICATION OR REDISTRIBUTION IN ANY MANNER WHATSOEVER ** +************************************************************************** +*/ +/* BuildSystemHeader added automatically */ +/* $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/include/xtraplibp.h,v 1.1.2.3 92/04/27 12:33:25 Leela_Obilichetti Exp $ */ + +#ifndef __XTRAPLIBP__ +#define __XTRAPLIBP__ + + +/***************************************************************************** +Copyright 1987, 1988, 1989, 1990, 1991 by Digital Equipment Corp., Maynard, MA + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*****************************************************************************/ +/* + * + * CONTRIBUTORS: + * + * Dick Annicchiarico + * Robert Chesler + * Dan Coutu + * Gene Durso + * Marc Evans + * Alan Jamison + * Mark Henry + * Ken Miller + * + * DESCRIPTION: + * This header file contains the function prototypes for client/toolkit + * routines sorted by module (globally defined routines *only*). + */ +#if (__STDC__ || defined vaxc) +#define FUNCTION_PROTOS +#endif +#ifdef FUNCTION_PROTOS +# define P(s) s +#else +# define P(s) () +#endif + +/* XETrapContext.c */ +XETC *XECreateTC P((Display *dpy , CARD32 valuemask , XETCValues *value )); +int XEChangeTC P((XETC *tc , CARD32 mask , XETCValues *values )); +void XEFreeTC P((XETC *tc )); +int XETrapSetMaxPacket P((XETC *tc , Bool set_flag , CARD16 size )); +int XETrapSetCommandKey P((XETC *tc , Bool set_flag , KeySym cmd_key , + Bool mod_flag )); +int XETrapSetTimestamps P((XETC *tc , Bool set_flag , Bool delta_flag )); +int XETrapSetWinXY P((XETC *tc , Bool set_flag )); +int XETrapSetCursor P((XETC *tc , Bool set_flag )); +int XETrapSetXInput P((XETC *tc , Bool set_flag )); +int XETrapSetColorReplies P((XETC *tc , Bool set_flag )); +int XETrapSetGrabServer P((XETC *tc , Bool set_flag )); +int XETrapSetStatistics P((XETC *tc , Bool set_flag )); +int XETrapSetRequests P((XETC *tc , Bool set_flag , ReqFlags requests )); +int XETrapSetEvents P((XETC *tc , Bool set_flag , EventFlags events )); +Bool XESetCmdGateState P((XETC *tc , CARD8 type, Bool *gate_closed , + CARD8 *next_key , Bool *key_ignore )); + +/* XETrapRequests.c */ +int XEFlushConfig P((XETC *tc )); +int XEResetRequest P((XETC *tc )); +int XEGetVersionRequest P((XETC *tc , XETrapGetVersRep *ret )); +int XEGetLastInpTimeRequest P((XETC *tc , XETrapGetLastInpTimeRep *ret )); +int XEGetAvailableRequest P((XETC *tc , XETrapGetAvailRep *ret )); +int XEStartTrapRequest P((XETC *tc )); +int XEStopTrapRequest P((XETC *tc )); +int XESimulateXEventRequest P((XETC *tc , CARD8 type , CARD8 detail , + CARD16 x , CARD16 y , CARD8 screen )); +int XEGetCurrentRequest P((XETC *tc , XETrapGetCurRep *ret )); +int XEGetStatisticsRequest P((XETC *tc , XETrapGetStatsRep *ret )); + +/* XECallbacks.c */ +int XEAddRequestCB P((XETC *tc , CARD8 req , void_function func , BYTE *data )); +int XEAddRequestCBs P((XETC *tc , ReqFlags req_flags , void_function func , + BYTE *data )); +int XEAddEventCB P((XETC *tc , CARD8 evt , void_function func , BYTE *data )); +int XEAddEventCBs P((XETC *tc , EventFlags evt_flags , void_function func , + BYTE *data )); + +/* XETrapDispatch.c */ +void XETrapDispatchXLib P((XETrapDataEvent *event , XETC *tc)); + +/* XEWrappers.c */ +Boolean XETrapDispatchEvent P((XEvent *pevent , XETC *tc )); +XtInputMask XETrapAppPending P((XtAppContext app)); +void XETrapAppMainLoop P((XtAppContext app , XETC *tc )); +int XETrapAppWhileLoop P((XtAppContext app , XETC *tc , Bool *done )); +#ifdef X11R3 +Widget XtAppInitialize P((XtAppContext *app , String application_class , + XrmOptionDescRec *options , Cardinal num_options , Cardinal *argc_in_out , + String *argv_in_out , String *fallback_resources , + ArgList args_in , Cardinal num_args_in)); +#endif +int XETrapWaitForSomething P((XtAppContext app )); + +/* XEPrintInfo.c */ +void XEPrintRelease P((FILE *ofp , XETrapGetAvailRep *pavail )); +void XEPrintPlatform P((FILE *ofp , XETrapGetAvailRep *pavail )); +void XEPrintAvailFlags P((FILE *ofp , XETrapGetAvailRep *pavail )); +void XEPrintAvailPktSz P((FILE *ofp , XETrapGetAvailRep *pavail )); +void XEPrintStateFlags P((FILE *ofp , XETrapGetCurRep *pcur )); +void XEPrintMajOpcode P((FILE *ofp , XETrapGetAvailRep *pavail )); +void XEPrintCurXY P((FILE *ofp , XETrapGetAvailRep *pavail )); +void XEPrintTkFlags P((FILE *ofp , XETC *tc )); +void XEPrintLastTime P((FILE *ofp , XETC *tc )); +void XEPrintCfgFlags P((FILE *ofp , XETrapGetCurRep *pcur )); +void XEPrintRequests P((FILE *ofp , XETrapGetCurRep *pcur )); +void XEPrintEvents P((FILE *ofp , XETrapGetCurRep *pcur )); +void XEPrintCurPktSz P((FILE *ofp , XETrapGetCurRep *pcur )); +void XEPrintCmdKey P((FILE *ofp , XETrapGetCurRep *pcur )); +void XEPrintEvtStats P((FILE *ofp , XETrapGetStatsRep *pstats )); +void XEPrintReqStats P((FILE *ofp , XETrapGetStatsRep *pstats )); +void XEPrintAvail P((FILE *ofp , XETrapGetAvailRep *pavail )); +void XEPrintTkState P((FILE *ofp , XETC *tc )); +void XEPrintCurrent P((FILE *ofp , XETrapGetCurRep *pcur )); +void XEPrintStatistics P((FILE *ofp , XETrapGetStatsRep *pstats )); + +/* XEStringMapping.c */ +INT16 XEEventStringToID P((char *string )); +INT16 XERequestStringToID P((char *string )); +CARD32 XEPlatformStringToID P((char *string )); +char *XEEventIDToString P((CARD8 id )); +char *XERequestIDToExtString P((register CARD8 id )); +char *XERequestIDToString P((CARD8 id )); +char *XEPlatformIDToString P((CARD32 id )); + +/* getopt.c */ +int *XEgetopterr(); +int *XEgetoptind(); +int *XEgetoptopt(); +char **XEgetoptarg(); +int getopt P((int argc , char **argv , char *optstring )); + +/* sleep.c */ +void usleep P((unsigned long usecs )); + +/* XEKeybCtrl.c */ +int XEEnableCtrlKeys P((void (*rtn)() )); +int XEClearCtrlKeys P((void )); +int XEEnableCtrlC P((void (*rtn)() )); +int XEEnableCtrlY P((void (*rtn)() )); +int XEDeclExitHndlr P((void (*rtn)() )); + +#undef P + +#endif /* __XTRAPLIBP__ */ diff --git a/xie/build/dec/xtrapproto.h b/xie/build/dec/xtrapproto.h new file mode 100644 index 0000000..70b8bae --- /dev/null +++ b/xie/build/dec/xtrapproto.h @@ -0,0 +1,210 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* +************************************************************************** +** DIGITAL EQUIPMENT CORPORATION ** +** CONFIDENTIAL ** +** NOT FOR MODIFICATION OR REDISTRIBUTION IN ANY MANNER WHATSOEVER ** +************************************************************************** +*/ +#ifndef __XTRAPPROTO__ +#define __XTRAPPROTO__ +/* RCSID = $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/include/xtrapproto.h,v 1.1.2.3 92/04/27 12:33:34 Leela_Obilichetti Exp $" */ + +/***************************************************************************** +Copyright 1987, 1988, 1989, 1990, 1991 by Digital Equipment Corp., Maynard, MA + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*****************************************************************************/ +/* + * + * CONTRIBUTORS: + * + * Dick Annicchiarico + * Robert Chesler + * Dan Coutu + * Gene Durso + * Marc Evans + * Alan Jamison + * Mark Henry + * Ken Miller + * + * DESCRIPTION: + * This header file contains the function prototypes for extension + * routines sorted by module (globally defined routines *only*). + */ +#if (__STDC__ || defined vaxc) +#define FUNCTION_PROTOS +#endif +#ifdef FUNCTION_PROTOS +# define P(s) s +#else +# define P(s) () +#endif +#ifndef Bool +# define Bool int +#endif +/* xtrapdi.c */ +void XETrapDestroyEnv P((pointer value , XID id )); +void XETrapCloseDown P((void )); +Bool XETrapRedirectDevices P((void )); +void DEC_XTRAPInit P((void )); +int XETrapCreateEnv P((ClientPtr client )); +int XETrapDispatch P((ClientPtr client )); +int sXETrapDispatch P((ClientPtr client )); +int XETrapReset P((xXTrapReq *request , ClientPtr client )); +int XETrapGetAvailable P((xXTrapGetReq *request , ClientPtr client )); +int XETrapGetCurrent P((xXTrapReq *request , ClientPtr client )); +int XETrapGetStatistics P((xXTrapReq *request , ClientPtr client )); +int XETrapConfig P((xXTrapConfigReq *request , ClientPtr client )); +int XETrapStartTrap P((xXTrapReq *request , ClientPtr client )); +int XETrapStopTrap P((xXTrapReq *request , ClientPtr client )); +int XETrapGetVersion P((xXTrapGetReq *request , ClientPtr client )); +int XETrapGetLastInpTime P((xXTrapReq *request , ClientPtr client )); +int XETrapRequestVector P((ClientPtr client )); +int XETrapKeyboard P((xEvent *x_event , DevicePtr keybd , int count )); +#ifndef VECTORED_EVENTS +int XETrapPointer P((xEvent *x_event , DevicePtr ptrdev , int count )); +#else +int XETrapEventVector P((ClientPtr client , xEvent *x_event )); +#endif +void XETrapStampAndMail P((xEvent *x_event )); +void sReplyXTrapDispatch P((ClientPtr client , int size , char *reply )); +int XETrapWriteXLib P((XETrapEnv *penv , BYTE *data , CARD32 nbytes )); + +/* xtrapddmi.c */ +void XETrapPlatformSetup P((void )); +int XETrapSimulateXEvent P((xXTrapInputReq *request , ClientPtr client )); + +/* /usr/users1/miller/golly/work/xtrap/xtrapdiswap.c */ +int sXETrapReset P((xXTrapReq *request , ClientPtr client )); +int sXETrapGetAvailable P((xXTrapGetReq *request , ClientPtr client )); +int sXETrapConfig P((xXTrapConfigReq *request , ClientPtr client )); +int sXETrapStartTrap P((xXTrapReq *request , ClientPtr client )); +int sXETrapStopTrap P((xXTrapReq *request , ClientPtr client )); +int sXETrapGetCurrent P((xXTrapReq *request , ClientPtr client )); +int sXETrapGetStatistics P((xXTrapReq *request , ClientPtr client )); +int sXETrapSimulateXEvent P((xXTrapInputReq *request , ClientPtr client )); +int sXETrapGetVersion P((xXTrapGetReq *request , ClientPtr client )); +int sXETrapGetLastInpTime P((xXTrapReq *request , ClientPtr client )); +void sReplyXETrapGetAvail P((ClientPtr client , int size , char *reply )); +void sReplyXETrapGetVers P((ClientPtr client , int size , char *reply )); +void sReplyXETrapGetLITim P((ClientPtr client , int size , char *reply )); +void sReplyXETrapGetCur P((ClientPtr client , int size , char *reply )); +void sReplyXETrapGetStats P((ClientPtr client , int size , char *reply )); +void sXETrapHeader P((XETrapHeader *hdr )); +void XETSwSimpleReq P((xReq *data )); +void XETSwResourceReq P((xResourceReq *data )); +void XETSwCreateWindow P((xCreateWindowReq *data )); +void XETSwChangeWindowAttributes P((xChangeWindowAttributesReq *data )); +void XETSwReparentWindow P((xReparentWindowReq *data )); +void XETSwConfigureWindow P((xConfigureWindowReq *data )); +void XETSwInternAtom P((xInternAtomReq *data )); +void XETSwChangeProperty P((xChangePropertyReq *data )); +void XETSwDeleteProperty P((xDeletePropertyReq *data )); +void XETSwGetProperty P((xGetPropertyReq *data )); +void XETSwSetSelectionOwner P((xSetSelectionOwnerReq *data )); +void XETSwConvertSelection P((xConvertSelectionReq *data )); +void XETSwSendEvent P((xSendEventReq *data )); +void XETSwGrabPointer P((xGrabPointerReq *data )); +void XETSwGrabButton P((xGrabButtonReq *data )); +void XETSwUngrabButton P((xUngrabButtonReq *data )); +void XETSwChangeActivePointerGrab P((xChangeActivePointerGrabReq *data )); +void XETSwGrabKeyboard P((xGrabKeyboardReq *data )); +void XETSwGrabKey P((xGrabKeyReq *data )); +void XETSwUngrabKey P((xUngrabKeyReq *data )); +void XETSwGetMotionEvents P((xGetMotionEventsReq *data )); +void XETSwTranslateCoords P((xTranslateCoordsReq *data )); +void XETSwWarpPointer P((xWarpPointerReq *data )); +void XETSwSetInputFocus P((xSetInputFocusReq *data )); +void XETSwOpenFont P((xOpenFontReq *data )); +void XETSwListFonts P((xListFontsReq *data )); +void XETSwListFontsWithInfo P((xListFontsWithInfoReq *data )); +void XETSwSetFontPath P((xSetFontPathReq *data )); +void XETSwCreatePixmap P((xCreatePixmapReq *data )); +void XETSwCreateGC P((xCreateGCReq *data )); +void XETSwChangeGC P((xChangeGCReq *data )); +void XETSwCopyGC P((xCopyGCReq *data )); +void XETSwSetDashes P((xSetDashesReq *data )); +void XETSwSetClipRectangles P((xSetClipRectanglesReq *data )); +void XETSwClearToBackground P((xClearAreaReq *data )); +void XETSwCopyArea P((xCopyAreaReq *data )); +void XETSwCopyPlane P((xCopyPlaneReq *data )); +void XETSwPoly P((xPolyPointReq *data )); +void XETSwFillPoly P((xFillPolyReq *data )); +void XETSwPutImage P((xPutImageReq *data )); +void XETSwGetImage P((xGetImageReq *data )); +void XETSwPolyText P((xPolyTextReq *data )); +void XETSwImageText P((xImageTextReq *data )); +void XETSwCreateColormap P((xCreateColormapReq *data )); +void XETSwCopyColormapAndFree P((xCopyColormapAndFreeReq *data )); +void XETSwAllocColor P((xAllocColorReq *data )); +void XETSwAllocNamedColor P((xAllocNamedColorReq *data )); +void XETSwAllocColorCells P((xAllocColorCellsReq *data )); +void XETSwAllocColorPlanes P((xAllocColorPlanesReq *data )); +void XETSwFreeColors P((xFreeColorsReq *data )); +void XETSwStoreColors P((xStoreColorsReq *data )); +void XETSwStoreNamedColor P((xStoreNamedColorReq *data )); +void XETSwQueryColors P((xQueryColorsReq *data )); +void XETSwLookupColor P((xLookupColorReq *data )); +void XETSwCreateCursor P((xCreateCursorReq *data )); +void XETSwCreateGlyphCursor P((xCreateGlyphCursorReq *data )); +void XETSwRecolorCursor P((xRecolorCursorReq *data )); +void XETSwQueryBestSize P((xQueryBestSizeReq *data )); +void XETSwQueryExtension P((xQueryExtensionReq *data )); +void XETSwChangeKeyboardMapping P((xChangeKeyboardMappingReq *data )); +void XETSwChangeKeyboardControl P((xChangeKeyboardControlReq *data )); +void XETSwChangePointerControl P((xChangePointerControlReq *data )); +void XETSwSetScreenSaver P((xSetScreenSaverReq *data )); +void XETSwChangeHosts P((xChangeHostsReq *data )); +void XETSwRotateProperties P((xRotatePropertiesReq *data )); +void XETSwNoOperation P((xReq *data )); +#ifdef vms +void SwapLongs P((long *list , unsigned long count )); +void SwapShorts P((short *list , unsigned long count )); +int SwapColorItem P((xColorItem *pItem )); +#endif /* vms */ +void NotImplemented P((void )); +int ProcBadRequest P((ClientPtr client )); + +#undef P + +#endif /* __XTRAPPROTO__ */ diff --git a/xie/build/elements.o b/xie/build/elements.o new file mode 100644 index 0000000..12ac743 Binary files /dev/null and b/xie/build/elements.o differ diff --git a/xie/build/errors.o b/xie/build/errors.o new file mode 100644 index 0000000..1dd25bf Binary files /dev/null and b/xie/build/errors.o differ diff --git a/xie/build/events.o b/xie/build/events.o new file mode 100644 index 0000000..71196cb Binary files /dev/null and b/xie/build/events.o differ diff --git a/xie/build/free.o b/xie/build/free.o new file mode 100644 index 0000000..6279bcd Binary files /dev/null and b/xie/build/free.o differ diff --git a/xie/build/ieee.o b/xie/build/ieee.o new file mode 100644 index 0000000..2e120ae Binary files /dev/null and b/xie/build/ieee.o differ diff --git a/xie/build/include/X11/extensions/XIE.h b/xie/build/include/X11/extensions/XIE.h new file mode 100644 index 0000000..f426db3 --- /dev/null +++ b/xie/build/include/X11/extensions/XIE.h @@ -0,0 +1,430 @@ +/* $XConsortium: XIE.h,v 1.5 94/04/17 20:11:11 mor Exp $ */ +/****************************************************************************** + + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. + +******************************************************************************/ + +#ifndef _XIE_H_ +#define _XIE_H_ + + +/* Extension Name and version number */ + +#define xieExtName "XIE" + +#define xieMajorVersion 5 +#define xieMinorVersion 0 +#define xieEarliestMinorVersion 0 +#define xieLatestMinorVersion 0 + + +/* ServiceClass */ + +#ifdef XIE_DIS +#define XIE_FULL 0 +#else +#define XIE_FULL 1 +#endif + +#define xieValFull 1 +#define xieValDIS 2 + + +/* Limits */ + +#define xieValMaxBands 3 + + +/* Alignment */ + +#define xieValAlignable 1 +#define xieValArbitrary 2 + + +/* ArithmeticOp */ + +#define xieValAdd 1 +#define xieValSub 2 +#define xieValSubRev 3 +#define xieValMul 4 +#define xieValDiv 5 +#define xieValDivRev 6 +#define xieValMin 7 +#define xieValMax 8 +#define xieValGamma 9 + + +/* ColorAllocTechnique */ + +#define xieValColorAllocDefault 0 +#define xieValColorAllocAll 2 +#define xieValColorAllocMatch 4 +#define xieValColorAllocRequantize 6 + + +/* Colorspace conversions */ + +#define xieValRGBToCIELab 2 +#define xieValRGBToCIEXYZ 4 +#define xieValRGBToYCbCr 6 +#define xieValRGBToYCC 8 + +#define xieValCIELabToRGB 2 +#define xieValCIEXYZToRGB 4 +#define xieValYCbCrToRGB 6 +#define xieValYCCToRGB 8 + + +/* CompareOp */ + +#define xieValLT 1 +#define xieValLE 2 +#define xieValEQ 3 +#define xieValNE 4 +#define xieValGT 5 +#define xieValGE 6 + + +/* ConstrainTechnique */ + +#define xieValConstrainClipScale 2 +#define xieValConstrainHardClip 4 + + +/* ConvolveTechnique */ + +#define xieValConvolveDefault 0 +#define xieValConvolveConstant 2 +#define xieValConvolveReplicate 4 + + +/* DataClass */ + +#define xieValSingleBand 1 +#define xieValTripleBand 2 + +/* DataType */ + +#define xieValConstrained 1 +#define xieValUnconstrained 2 + + +/* DecodeTechnique */ + +#define xieValDecodeUncompressedSingle 2 /* bitonal & grayscale */ +#define xieValDecodeUncompressedTriple 3 /* color */ +#define xieValDecodeG31D 4 /* FAX */ +#define xieValDecodeG32D 6 /* FAX */ +#define xieValDecodeG42D 8 /* FAX */ +#define xieValDecodeJPEGBaseline 10 /* grayscale & color */ +#define xieValDecodeJPEGLossless 12 /* grayscale & color */ +#define xieValDecodeTIFF2 14 /* TIFF modified G31D */ +#define xieValDecodeTIFFPackBits 16 /* TIFF APPLE FORMAT */ + + +/* DitherTechnique */ + +#define xieValDitherDefault 0 +#define xieValDitherErrorDiffusion 2 +#define xieValDitherOrdered 4 + + +/* EncodeTechnique */ + +#define xieValEncodeServerChoice 1 /* (to photomaps) */ +#define xieValEncodeUncompressedSingle 2 /* bitonal & grayscale */ +#define xieValEncodeUncompressedTriple 3 /* color */ +#define xieValEncodeG31D 4 /* FAX */ +#define xieValEncodeG32D 6 /* FAX */ +#define xieValEncodeG42D 8 /* FAX */ +#define xieValEncodeJPEGBaseline 10 /* grayscale & color */ +#define xieValEncodeJPEGLossless 12 /* grayscale & color */ +#define xieValEncodeTIFF2 14 /* TIFF modified G31D */ +#define xieValEncodeTIFFPackBits 16 /* TIFF APPLE FORMAT */ + +/* ServerChoice preference hints */ + +#define xieValPreferDefault 0 +#define xieValPreferSpace 1 +#define xieValPreferTime 2 + +/* JPEG-Lossless predictor */ + +#define xieValPredictorNone 0 +#define xieValPredictorA 1 +#define xieValPredictorB 2 +#define xieValPredictorC 3 +#define xieValPredictorABC 4 +#define xieValPredictorABC2 5 +#define xieValPredictorBAC2 6 +#define xieValPredictorAB2 7 + + +/* ExportNotify */ + +#define xieValDisable 1 +#define xieValFirstData 2 +#define xieValNewData 3 + + +/* ExportState */ + +#define xieValExportDone 1 +#define xieValExportMore 2 +#define xieValExportEmpty 3 +#define xieValExportError 4 + + +/* GamutTechnique */ + +#define xieValGamutDefault 0 +#define xieValGamutNone 1 +#define xieValGamutClipRGB 2 + + +/* GeometryTechnique */ + +#define xieValGeomDefault 0 +#define xieValGeomAntialias 2 +#define xieValGeomAntialiasByArea 4 +#define xieValGeomAntialiasByLPF 6 +#define xieValGeomBilinearInterp 8 +#define xieValGeomGaussian 10 +#define xieValGeomNearestNeighbor 12 + + +/* NearestNeighbor modify */ + +#define xieValFavorDown 1 +#define xieValFavorUp 2 +#define xieValRoundNW 3 +#define xieValRoundNE 4 +#define xieValRoundSE 5 +#define xieValRoundSW 6 + + +/* HistogramShape */ + +#define xieValHistogramFlat 2 +#define xieValHistogramGaussian 4 +#define xieValHistogramHyperbolic 6 + + +/* Interleave */ + +#define xieValBandByPixel 1 +#define xieValBandByPlane 2 + + +/* MathOp */ + +#define xieValExp 1 +#define xieValLn 2 +#define xieValLog2 3 +#define xieValLog10 4 +#define xieValSquare 5 +#define xieValSqrt 6 + + +/* Orientation */ + +#define xieValLSFirst 1 +#define xieValMSFirst 2 + + +/* PhotofloOutcome */ + +#define xieValFloSuccess 1 +#define xieValFloAbort 2 +#define xieValFloError 3 + + +/* PhotofloState */ + +#define xieValInactive 1 +#define xieValActive 2 +#define xieValNonexistent 3 + + +/* TechniqueGroup */ + +#define xieValDefault 0 +#define xieValAll 1 +#define xieValColorAlloc 2 +#define xieValConstrain 4 +#define xieValConvertFromRGB 6 +#define xieValConvertToRGB 8 +#define xieValConvolve 10 +#define xieValDecode 12 +#define xieValDither 14 +#define xieValEncode 16 +#define xieValGamut 18 +#define xieValGeometry 20 +#define xieValHistogram 22 +#define xieValWhiteAdjust 24 + +#define xieValMaxTechGroup 24 + + +/* WhiteAdjustTechnique */ + +#define xieValWhiteAdjustDefault 0 +#define xieValWhiteAdjustNone 1 +#define xieValWhiteAdjustCIELabShift 2 + + +/* Photoflo elements */ + +#define xieElemImportClientLUT 1 +#define xieElemImportClientPhoto 2 +#define xieElemImportClientROI 3 +#define xieElemImportDrawable 4 +#define xieElemImportDrawablePlane 5 +#define xieElemImportLUT 6 +#define xieElemImportPhotomap 7 +#define xieElemImportROI 8 +#define xieElemArithmetic 9 +#define xieElemBandCombine 10 +#define xieElemBandExtract 11 +#define xieElemBandSelect 12 +#define xieElemBlend 13 +#define xieElemCompare 14 +#define xieElemConstrain 15 +#define xieElemConvertFromIndex 16 +#define xieElemConvertFromRGB 17 +#define xieElemConvertToIndex 18 +#define xieElemConvertToRGB 19 +#define xieElemConvolve 20 +#define xieElemDither 21 +#define xieElemGeometry 22 +#define xieElemLogical 23 +#define xieElemMatchHistogram 24 +#define xieElemMath 25 +#define xieElemPasteUp 26 +#define xieElemPoint 27 +#define xieElemUnconstrain 28 +#define xieElemExportClientHistogram 29 +#define xieElemExportClientLUT 30 +#define xieElemExportClientPhoto 31 +#define xieElemExportClientROI 32 +#define xieElemExportDrawable 33 +#define xieElemExportDrawablePlane 34 +#define xieElemExportLUT 35 +#define xieElemExportPhotomap 36 +#define xieElemExportROI 37 + +#define xieMaxElem 37 + + +/* Event Codes */ + +#define xieEvnNoColorAlloc 0 +#define xieEvnNoDecodeNotify 1 +#define xieEvnNoExportAvailable 2 +#define xieEvnNoImportObscured 3 +#define xieEvnNoPhotofloDone 4 + +#define xieNumEvents 5 + + +/* Error Codes */ + +#define xieErrNoColorList 0 +#define xieErrNoLUT 1 +#define xieErrNoPhotoflo 2 +#define xieErrNoPhotomap 3 +#define xieErrNoPhotospace 4 +#define xieErrNoROI 5 +#define xieErrNoFlo 6 + +#define xieNumErrors 7 + + +/* Flo Error Codes */ + +#define xieErrNoFloAccess 1 +#define xieErrNoFloAlloc 2 +#define xieErrNoFloColormap 3 +#define xieErrNoFloColorList 4 +#define xieErrNoFloDomain 5 +#define xieErrNoFloDrawable 6 +#define xieErrNoFloElement 7 +#define xieErrNoFloGC 8 +#define xieErrNoFloID 9 +#define xieErrNoFloLength 10 +#define xieErrNoFloLUT 11 +#define xieErrNoFloMatch 12 +#define xieErrNoFloOperator 13 +#define xieErrNoFloPhotomap 14 +#define xieErrNoFloROI 15 +#define xieErrNoFloSource 16 +#define xieErrNoFloTechnique 17 +#define xieErrNoFloValue 18 +#define xieErrNoFloImplementation 19 + +#define xieNumFloErrors 19 + +#endif /* _XIE_H_ */ diff --git a/xie/build/include/X11/extensions/XIElib.h b/xie/build/include/X11/extensions/XIElib.h new file mode 100644 index 0000000..fff688b --- /dev/null +++ b/xie/build/include/X11/extensions/XIElib.h @@ -0,0 +1,1916 @@ +/* $XConsortium: XIElib.h,v 1.12 95/04/28 18:01:11 mor Exp $ */ + +/* + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#ifndef _XIELIB_H_ +#define _XIELIB_H_ + +#include +#include + +/*--------------------------------------------------------------------------* + * XIE types * + *--------------------------------------------------------------------------*/ + +typedef float XieFloat; + +typedef float XieConstant[3]; + +typedef float XieMatrix[9]; + +typedef unsigned XieAlignment; + +typedef unsigned XieArithmeticOp; + +typedef unsigned XieColorAllocTechnique; + +typedef XID XieColorList; + +typedef unsigned XieColorspace; + +typedef unsigned XieCompareOp; + +typedef unsigned XieConstrainTechnique; + +typedef unsigned XieConvolveTechnique; + +typedef unsigned XieDataClass; + +typedef unsigned XieDataType; + +typedef unsigned XieDecodeTechnique; + +typedef unsigned XieDitherTechnique; + +typedef unsigned XieEncodeTechnique; + +typedef XID XiePhotospace; + +typedef XID XiePhotoflo; + +typedef unsigned XieExportNotify; + +typedef unsigned XieExportState; + +typedef unsigned XieGamutTechnique; + +typedef unsigned XieGeometryTechnique; + +typedef struct { + unsigned long value; + unsigned long count; +} XieHistogramData; + +typedef unsigned XieHistogramShape; + +typedef unsigned XieInterleave; + +typedef unsigned long XieLevels[3]; + +typedef XID XieLut; + +typedef unsigned XieMathOp; + +typedef unsigned XieOrientation; + +typedef unsigned XiePhotofloOutcome; + +typedef unsigned XiePhotofloState; + +typedef XID XiePhotomap; + +typedef unsigned XiePhototag; + +typedef struct { + int offset_x; + int offset_y; + XiePhototag phototag; +} XieProcessDomain; + +typedef struct { /* this is bcopyable on 32 bit machines */ + long x; /* when using PutClientData */ + long y; + unsigned long width; + unsigned long height; +} XieRectangle; + +typedef XID XieRoi; + +typedef unsigned XieServiceClass; + +typedef unsigned XieTechniqueGroup; + +typedef struct { + Bool needs_param; + XieTechniqueGroup group; + unsigned int number; + unsigned int speed; + char *name; +} XieTechnique; + +typedef struct { + XiePhototag src; + int dst_x; + int dst_y; +} XieTile; + +typedef unsigned long XieLTriplet[3]; + +typedef unsigned XieWhiteAdjustTechnique; + +#if NeedFunctionPrototypes +typedef void *XiePointer; +#else +typedef char *XiePointer; +#endif + + +/*--------------------------------------------------------------------------* + * Extension information * + *--------------------------------------------------------------------------*/ + +typedef struct { + unsigned server_major_rev; + unsigned server_minor_rev; + XieServiceClass service_class; + XieAlignment alignment; + int uncnst_mantissa; + int uncnst_min_exp; + int uncnst_max_exp; + int n_cnst_levels; /* number of constrained levels */ + unsigned long *cnst_levels; /* recommended constrained levels */ + int major_opcode; + int first_event; + int first_error; +} XieExtensionInfo; + + +/*--------------------------------------------------------------------------* + * Photoflo element union * + *--------------------------------------------------------------------------*/ + +typedef struct { + + int elemType; + + union { + + /* + * Import Elements + */ + + struct { + XieDataClass data_class; + XieOrientation band_order; + XieLTriplet length; + XieLevels levels; + } ImportClientLUT; + + struct { + XieDataClass data_class; + XieLTriplet width; + XieLTriplet height; + XieLevels levels; + Bool notify; + XieDecodeTechnique decode_tech; + XiePointer decode_param; + } ImportClientPhoto; + + struct { + unsigned int rectangles; + } ImportClientROI; + + struct { + Drawable drawable; + int src_x; + int src_y; + unsigned int width; + unsigned int height; + unsigned long fill; + Bool notify; + } ImportDrawable; + + struct { + Drawable drawable; + int src_x; + int src_y; + unsigned int width; + unsigned int height; + unsigned long fill; + unsigned long bit_plane; + Bool notify; + } ImportDrawablePlane; + + struct { + XieLut lut; + } ImportLUT; + + struct { + XiePhotomap photomap; + Bool notify; + } ImportPhotomap; + + struct { + XieRoi roi; + } ImportROI; + + + /* + * Process Elements + */ + + struct { + XiePhototag src1; + XiePhototag src2; + XieProcessDomain domain; + XieConstant constant; + XieArithmeticOp operator; + unsigned int band_mask; + } Arithmetic; + + struct { + XiePhototag src1; + XiePhototag src2; + XiePhototag src3; + } BandCombine; + + struct { + XiePhototag src; + unsigned int levels; + float bias; + XieConstant coefficients; + } BandExtract; + + struct { + XiePhototag src; + unsigned int band_number; + } BandSelect; + + struct { + XiePhototag src1; + XiePhototag src2; + XieConstant src_constant; + XiePhototag alpha; + float alpha_constant; + XieProcessDomain domain; + unsigned int band_mask; + } Blend; + + struct { + XiePhototag src1; + XiePhototag src2; + XieProcessDomain domain; + XieConstant constant; + XieCompareOp operator; + Bool combine; + unsigned int band_mask; + } Compare; + + struct { + XiePhototag src; + XieLevels levels; + XieConstrainTechnique constrain_tech; + XiePointer constrain_param; + } Constrain; + + struct { + XiePhototag src; + Colormap colormap; + XieDataClass data_class; + unsigned int precision; + } ConvertFromIndex; + + struct { + XiePhototag src; + XieColorspace color_space; + XiePointer color_param; + } ConvertFromRGB; + + struct { + XiePhototag src; + Colormap colormap; + XieColorList color_list; + Bool notify; + XieColorAllocTechnique color_alloc_tech; + XiePointer color_alloc_param; + } ConvertToIndex; + + struct { + XiePhototag src; + XieColorspace color_space; + XiePointer color_param; + } ConvertToRGB; + + struct { + XiePhototag src; + XieProcessDomain domain; + float *kernel; + int kernel_size; + unsigned int band_mask; + XieConvolveTechnique convolve_tech; + XiePointer convolve_param; + } Convolve; + + struct { + XiePhototag src; + XieLevels levels; + unsigned int band_mask; + XieDitherTechnique dither_tech; + XiePointer dither_param; + } Dither; + + struct { + XiePhototag src; + unsigned int width; + unsigned int height; + float coefficients[6]; + XieConstant constant; + unsigned int band_mask; + XieGeometryTechnique sample_tech; + XiePointer sample_param; + } Geometry; + + struct { + XiePhototag src1; + XiePhototag src2; + XieProcessDomain domain; + XieConstant constant; + int operator; + unsigned int band_mask; + } Logical; + + struct { + XiePhototag src; + XieProcessDomain domain; + XieHistogramShape shape; + XiePointer shape_param; + } MatchHistogram; + + struct { + XiePhototag src; + XieProcessDomain domain; + XieMathOp operator; + unsigned int band_mask; + } Math; + + struct { + unsigned int width; + unsigned int height; + XieConstant constant; + XieTile *tiles; + unsigned int tile_count; + } PasteUp; + + struct { + XiePhototag src; + XieProcessDomain domain; + XiePhototag lut; + unsigned int band_mask; + } Point; + + struct { + XiePhototag src; + } Unconstrain; + + /* + * Export Elements + */ + + struct { + XiePhototag src; + XieProcessDomain domain; + XieExportNotify notify; + } ExportClientHistogram; + + struct { + XiePhototag src; + XieOrientation band_order; + XieExportNotify notify; + XieLTriplet start; + XieLTriplet length; + } ExportClientLUT; + + struct { + XiePhototag src; + XieExportNotify notify; + XieEncodeTechnique encode_tech; + XiePointer encode_param; + } ExportClientPhoto; + + struct { + XiePhototag src; + XieExportNotify notify; + } ExportClientROI; + + struct { + XiePhototag src; + Drawable drawable; + GC gc; + int dst_x; + int dst_y; + } ExportDrawable; + + struct { + XiePhototag src; + Drawable drawable; + GC gc; + int dst_x; + int dst_y; + } ExportDrawablePlane; + + struct { + XiePhototag src; + XieLut lut; + Bool merge; + XieLTriplet start; + } ExportLUT; + + struct { + XiePhototag src; + XiePhotomap photomap; + XieEncodeTechnique encode_tech; + XiePointer encode_param; + } ExportPhotomap; + + struct { + XiePhototag src; + XieRoi roi; + } ExportROI; + + } data; +} XiePhotoElement; + +typedef XiePhotoElement *XiePhotofloGraph; + + +/*--------------------------------------------------------------------------* + * Technique Parameters * + *--------------------------------------------------------------------------*/ + +/* Color Alloc */ + +typedef struct { + unsigned long fill; +} XieColorAllocAllParam; + +typedef struct { + float match_limit; + float gray_limit; +} XieColorAllocMatchParam; + +typedef struct { + unsigned long max_cells; +} XieColorAllocRequantizeParam; + + +/* Colorspace - conversion from RGB */ + +typedef struct { + XieMatrix matrix; + XieWhiteAdjustTechnique white_adjust_tech; + XiePointer white_adjust_param; +} XieRGBToCIELabParam, XieRGBToCIEXYZParam; + +typedef struct { + XieLevels levels; + float luma_red; + float luma_green; + float luma_blue; + XieConstant bias; +} XieRGBToYCbCrParam; + +typedef struct { + XieLevels levels; + float luma_red; + float luma_green; + float luma_blue; + float scale; +} XieRGBToYCCParam; + + +/* Colorspace - conversion to RGB */ + +typedef struct { + XieMatrix matrix; + XieWhiteAdjustTechnique white_adjust_tech; + XiePointer white_adjust_param; + XieGamutTechnique gamut_tech; + XiePointer gamut_param; +} XieCIELabToRGBParam, XieCIEXYZToRGBParam; + +typedef struct { + XieLevels levels; + float luma_red; + float luma_green; + float luma_blue; + XieConstant bias; + XieGamutTechnique gamut_tech; + XiePointer gamut_param; +} XieYCbCrToRGBParam; + +typedef struct { + XieLevels levels; + float luma_red; + float luma_green; + float luma_blue; + float scale; + XieGamutTechnique gamut_tech; + XiePointer gamut_param; +} XieYCCToRGBParam; + +/* Constrain */ + +typedef struct { + XieConstant input_low,input_high; + XieLTriplet output_low,output_high; +} XieClipScaleParam; + + +/* Convolve */ + +typedef struct { + XieConstant constant; +} XieConvolveConstantParam; + + +/* Decode */ + +typedef struct { + XieOrientation fill_order; + XieOrientation pixel_order; + unsigned int pixel_stride; + unsigned int left_pad; + unsigned int scanline_pad; +} XieDecodeUncompressedSingleParam; + +typedef struct { + unsigned char left_pad[3]; + XieOrientation fill_order; + unsigned char pixel_stride[3]; + XieOrientation pixel_order; + unsigned char scanline_pad[3]; + XieOrientation band_order; + XieInterleave interleave; +} XieDecodeUncompressedTripleParam; + +typedef struct { + XieOrientation encoded_order; + Bool normal; + Bool radiometric; +} XieDecodeG31DParam, XieDecodeG32DParam, XieDecodeG42DParam, + XieDecodeTIFF2Param; + +typedef struct { + XieOrientation encoded_order; + Bool normal; +} XieDecodeTIFFPackBitsParam; + +typedef struct { + XieInterleave interleave; + XieOrientation band_order; + Bool up_sample; +} XieDecodeJPEGBaselineParam; + +typedef struct { + XieInterleave interleave; + XieOrientation band_order; +} XieDecodeJPEGLosslessParam; + + +/* Dither */ + +typedef struct { + unsigned int threshold_order; +} XieDitherOrderedParam; + + +/* Encode */ + +typedef struct { + XieOrientation fill_order; + XieOrientation pixel_order; + unsigned int pixel_stride; + unsigned int scanline_pad; +} XieEncodeUncompressedSingleParam; + +typedef struct { + unsigned char pixel_stride[3]; + XieOrientation pixel_order; + unsigned char scanline_pad[3]; + XieOrientation fill_order; + XieOrientation band_order; + XieInterleave interleave; +} XieEncodeUncompressedTripleParam; + +typedef struct { + Bool align_eol; + Bool radiometric; + XieOrientation encoded_order; +} XieEncodeG31DParam; + +typedef struct { + Bool uncompressed; + Bool align_eol; + Bool radiometric; + XieOrientation encoded_order; + unsigned long k_factor; +} XieEncodeG32DParam; + +typedef struct { + Bool uncompressed; + Bool radiometric; + XieOrientation encoded_order; +} XieEncodeG42DParam; + +typedef struct { + unsigned int preference; +} XieEncodeServerChoiceParam; + +typedef struct { + XieInterleave interleave; + XieOrientation band_order; + unsigned char horizontal_samples[3]; + unsigned char vertical_samples[3]; + char *q_table; + unsigned int q_size; + char *ac_table; + unsigned int ac_size; + char *dc_table; + unsigned int dc_size; +} XieEncodeJPEGBaselineParam; + +typedef struct { + XieInterleave interleave; + XieOrientation band_order; + unsigned char predictor[3]; + char *table; + unsigned int table_size; +} XieEncodeJPEGLosslessParam; + +typedef struct { + XieOrientation encoded_order; + Bool radiometric; +} XieEncodeTIFF2Param; + +typedef struct { + XieOrientation encoded_order; +} XieEncodeTIFFPackBitsParam; + + +/* Geometry */ + +typedef struct { + int simple; +} XieGeomAntialiasByAreaParam; + +typedef struct { + int kernel_size; +} XieGeomAntialiasByLowpassParam; + +typedef struct { + float sigma; + float normalize; + unsigned int radius; + Bool simple; +} XieGeomGaussianParam; + +typedef struct { + unsigned int modify; +} XieGeomNearestNeighborParam; + + +/* Histogram */ + +typedef struct { + float mean; + float sigma; +} XieHistogramGaussianParam; + +typedef struct { + float constant; + Bool shape_factor; +} XieHistogramHyperbolicParam; + + +/* White Adjust */ + +typedef struct { + XieConstant white_point; +} XieWhiteAdjustCIELabShiftParam; + + +/*--------------------------------------------------------------------------* + * Events * + *--------------------------------------------------------------------------*/ + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + unsigned long name_space; + Time time; + unsigned long flo_id; + XiePhototag src; + unsigned int elem_type; + XieColorList color_list; + XieColorAllocTechnique color_alloc_technique; + unsigned long color_alloc_data; +} XieColorAllocEvent; + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + unsigned long name_space; + Time time; + unsigned long flo_id; + XiePhototag src; + unsigned int elem_type; + XieDecodeTechnique decode_technique; + Bool aborted; + unsigned int band_number; + unsigned long width; + unsigned long height; +} XieDecodeNotifyEvent; + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + unsigned long name_space; + Time time; + unsigned long flo_id; + XiePhototag src; + unsigned int elem_type; + unsigned int band_number; + unsigned long data[3]; +} XieExportAvailableEvent; + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + unsigned long name_space; + Time time; + unsigned long flo_id; + XiePhototag src; + unsigned int elem_type; + Window window; + int x; + int y; + unsigned int width; + unsigned int height; +} XieImportObscuredEvent; + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + unsigned long name_space; + Time time; + unsigned long flo_id; + XiePhotofloOutcome outcome; +} XiePhotofloDoneEvent; + + +/*--------------------------------------------------------------------------* + * Photoflo Errors * + *--------------------------------------------------------------------------*/ + +typedef struct { + int type; + Display *display; + unsigned long flo_id; + unsigned long serial; + unsigned char error_code; + unsigned char request_code; + unsigned char minor_code; + unsigned int flo_error_code; + unsigned long name_space; + XiePhototag phototag; + unsigned int elem_type; +} XieFloAccessError, XieFloAllocError, XieFloElementError, XieFloIDError, + XieFloLengthError, XieFloMatchError, XieFloSourceError; + +typedef struct { + int type; + Display *display; + unsigned long flo_id; + unsigned long serial; + unsigned char error_code; + unsigned char request_code; + unsigned char minor_code; + unsigned int flo_error_code; + unsigned long name_space; + XiePhototag phototag; + unsigned int elem_type; + XID resource_id; +} XieFloResourceError; + +typedef struct { + int type; + Display *display; + unsigned long flo_id; + unsigned long serial; + unsigned char error_code; + unsigned char request_code; + unsigned char minor_code; + unsigned int flo_error_code; + unsigned long name_space; + XiePhototag phototag; + unsigned int elem_type; + XiePhototag domain_src; +} XieFloDomainError; + +typedef struct { + int type; + Display *display; + unsigned long flo_id; + unsigned long serial; + unsigned char error_code; + unsigned char request_code; + unsigned char minor_code; + unsigned int flo_error_code; + unsigned long name_space; + XiePhototag phototag; + unsigned int elem_type; + unsigned int operator; +} XieFloOperatorError; + +typedef struct { + int type; + Display *display; + unsigned long flo_id; + unsigned long serial; + unsigned char error_code; + unsigned char request_code; + unsigned char minor_code; + unsigned int flo_error_code; + unsigned long name_space; + XiePhototag phototag; + unsigned int elem_type; + unsigned int technique_number; + unsigned int num_tech_params; + XieTechniqueGroup tech_group; +} XieFloTechniqueError; + +typedef struct { + int type; + Display *display; + unsigned long flo_id; + unsigned long serial; + unsigned char error_code; + unsigned char request_code; + unsigned char minor_code; + unsigned int flo_error_code; + unsigned long name_space; + XiePhototag phototag; + unsigned int elem_type; + unsigned long bad_value; +} XieFloValueError; + + +/*--------------------------------------------------------------------------* + * Function prototypes * + *--------------------------------------------------------------------------*/ + +/* Startup functions -------------------------------------------------------*/ + +extern Status XieInitialize ( +#if NeedFunctionPrototypes + Display * /* display */, + XieExtensionInfo ** /* extinfo_ret */ +#endif +); + +extern Status XieQueryTechniques ( +#if NeedFunctionPrototypes + Display * /* display */, + XieTechniqueGroup /* technique_group */, + int * /* ntechniques_ret */, + XieTechnique ** /* techniques_ret */ +#endif +); + +extern void XieFreeTechniques ( +#if NeedFunctionPrototypes + XieTechnique * /* techs */, + unsigned int /* count */ +#endif +); + + +/* Color List functions ---------------------------------------------------*/ + +extern XieColorList XieCreateColorList ( +#if NeedFunctionPrototypes + Display * /* display */ +#endif +); + +extern void XieDestroyColorList ( +#if NeedFunctionPrototypes + Display * /* display */, + XieColorList /* color_list */ +#endif +); + +extern void XiePurgeColorList ( +#if NeedFunctionPrototypes + Display * /* display */, + XieColorList /* color_list */ +#endif +); + +extern Status XieQueryColorList ( +#if NeedFunctionPrototypes + Display * /* display */, + XieColorList /* color_list */, + Colormap * /* colormap_ret */, + unsigned * /* ncolors_ret */, + unsigned long ** /* colors_ret */ +#endif +); + + +/* LUT functions -----------------------------------------------------------*/ + +extern XieLut XieCreateLUT ( +#if NeedFunctionPrototypes + Display * /* display */ +#endif +); + +extern void XieDestroyLUT ( +#if NeedFunctionPrototypes + Display * /* display */, + XieLut /* lut */ +#endif +); + + +/* Photomap functions ------------------------------------------------------*/ + +extern XiePhotomap XieCreatePhotomap ( +#if NeedFunctionPrototypes + Display * /* display */ +#endif +); + +extern void XieDestroyPhotomap ( +#if NeedFunctionPrototypes + Display * /* display */, + XiePhotomap /* photomap */ +#endif +); + +extern Status XieQueryPhotomap ( +#if NeedFunctionPrototypes + Display * /* display */, + XiePhotomap /* photomap */, + Bool * /* populated_ret */, + XieDataType * /* datatype_ret */, + XieDataClass * /* class_ret */, + XieDecodeTechnique * /* decode_technique_ret */, + XieLTriplet /* width_ret */, + XieLTriplet /* height_ret */, + XieLTriplet /* levels_ret */ +#endif +); + + +/* ROI functions -----------------------------------------------------------*/ + +extern XieRoi XieCreateROI ( +#if NeedFunctionPrototypes + Display * /* display */ +#endif +); + +extern void XieDestroyROI ( +#if NeedFunctionPrototypes + Display * /* display */, + XieRoi /* roi */ +#endif +); + + +/* Photospace functions ----------------------------------------------------*/ + +extern XiePhotospace XieCreatePhotospace ( +#if NeedFunctionPrototypes + Display * /* display */ +#endif +); + +extern void XieDestroyPhotospace ( +#if NeedFunctionPrototypes + Display * /* display */, + XiePhotospace /* photospace */ +#endif +); + +extern void XieExecuteImmediate ( +#if NeedFunctionPrototypes + Display * /* display */, + XiePhotospace /* photospace */, + unsigned long /* flo_id */, + Bool /* notify */, + XiePhotoElement * /* elem_list */, + int /* elem_count */ +#endif +); + + +/* Photoflo functions ------------------------------------------------------*/ + +extern XiePhotoElement *XieAllocatePhotofloGraph ( +#if NeedFunctionPrototypes + unsigned int /* count */ +#endif +); + +extern void XieFreePhotofloGraph ( +#if NeedFunctionPrototypes + XiePhotoElement * /* elements */, + unsigned int /* count */ +#endif +); + +extern XiePhotoflo XieCreatePhotoflo ( +#if NeedFunctionPrototypes + Display * /* display */, + XiePhotoElement * /* elem_list */, + int /* elem_count */ +#endif +); + +extern void XieDestroyPhotoflo ( +#if NeedFunctionPrototypes + Display * /* display */, + XiePhotoflo /* photoflo */ +#endif +); + +extern void XieExecutePhotoflo ( +#if NeedFunctionPrototypes + Display * /* display */, + XiePhotoflo /* photoflo */, + Bool /* notify */ +#endif +); + +extern void XieModifyPhotoflo ( +#if NeedFunctionPrototypes + Display * /* display */, + XiePhotoflo /* photoflo */, + int /* start */, + XiePhotoElement * /* elem_list */, + int /* elem_count */ +#endif +); + +extern void XieRedefinePhotoflo ( +#if NeedFunctionPrototypes + Display * /* display */, + XiePhotoflo /* photoflo */, + XiePhotoElement * /* elem_list */, + int /* elem_count */ +#endif +); + +extern Status XieQueryPhotoflo ( +#if NeedFunctionPrototypes + Display * /* display */, + unsigned long /* name_space */, + unsigned long /* flo_id */, + XiePhotofloState * /* state_ret */, + XiePhototag ** /* data_expected_ret */, + unsigned int * /* nexpected_ret */, + XiePhototag ** /* data_available_ret */, + unsigned int * /* navailable_ret */ +#endif +); + + +/* Client Data functions ---------------------------------------------------*/ + +extern void XiePutClientData ( +#if NeedFunctionPrototypes + Display * /* display */, + unsigned long /* name_space */, + unsigned long /* flo_id */, + XiePhototag /* element */, + Bool /* final */, + unsigned /* band_number */, + unsigned char * /* data */, + unsigned /* nbytes */ +#endif +); + +extern Status XieGetClientData ( +#if NeedFunctionPrototypes + Display * /* display */, + unsigned long /* name_space */, + unsigned long /* flo_id */, + XiePhototag /* element */, + unsigned /* max_bytes */, + Bool /* terminate */, + unsigned /* band_number */, + XieExportState * /* new_state_ret */, + unsigned char ** /* data_ret */, + unsigned * /* nbytes_ret */ +#endif +); + + +/* Abort and Await functions -----------------------------------------------*/ + +extern void XieAbort ( +#if NeedFunctionPrototypes + Display * /* display */, + unsigned long /* name_space */, + unsigned long /* flo_id */ +#endif +); + +extern void XieAwait ( +#if NeedFunctionPrototypes + Display * /* display */, + unsigned long /* name_space */, + unsigned long /* flo_id */ +#endif +); + + +/* Photoflo element functions ----------------------------------------------*/ + +extern void XieFloImportClientLUT ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XieDataClass /* data_class */, + XieOrientation /* band_order */, + XieLTriplet /* length */, + XieLevels /* levels */ +#endif +); + +extern void XieFloImportClientPhoto ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XieDataClass /* data_class */, + XieLTriplet /* width */, + XieLTriplet /* height */, + XieLevels /* levels */, + Bool /* notify */, + XieDecodeTechnique /* decode_tech */, + XiePointer /* decode_param */ +#endif +); + +extern void XieFloImportClientROI ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + unsigned int /* rectangles */ +#endif +); + +extern void XieFloImportDrawable ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + Drawable /* drawable */, + int /* src_x */, + int /* src_y */, + unsigned int /* width */, + unsigned int /* height */, + unsigned long /* fill */, + Bool /* notify */ +#endif +); + +extern void XieFloImportDrawablePlane ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + Drawable /* drawable */, + int /* src_x */, + int /* src_y */, + unsigned int /* width */, + unsigned int /* height */, + unsigned long /* fill */, + unsigned long /* bit_plane */, + Bool /* notify */ +#endif +); + +extern void XieFloImportLUT ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XieLut /* lut */ +#endif +); + +extern void XieFloImportPhotomap ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhotomap /* photomap */, + Bool /* notify */ +#endif +); + +extern void XieFloImportROI ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XieRoi /* roi */ +#endif +); + +extern void XieFloArithmetic ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src1 */, + XiePhototag /* src2 */, + XieProcessDomain * /* domain */, + XieConstant /* constant */, + XieArithmeticOp /* operator */, + unsigned int /* band_mask */ +#endif +); + +extern void XieFloBandCombine ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src1 */, + XiePhototag /* src2 */, + XiePhototag /* src3 */ +#endif +); + +extern void XieFloBandExtract ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + unsigned int /* levels */, + double /* bias */, + XieConstant /* coefficients */ +#endif +); + +extern void XieFloBandSelect ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + unsigned int /* band_number */ +#endif +); + +extern void XieFloBlend ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src1 */, + XiePhototag /* src2 */, + XieConstant /* src_constant */, + XiePhototag /* alpha */, + double /* alpha_const */, + XieProcessDomain * /* domain */, + unsigned int /* band_mask */ +#endif +); + +extern void XieFloCompare ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src1 */, + XiePhototag /* src2 */, + XieProcessDomain * /* domain */, + XieConstant /* constant */, + XieCompareOp /* operator */, + Bool /* combine */, + unsigned int /* band_mask */ +#endif +); + +extern void XieFloConstrain ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieLevels /* levels */, + XieConstrainTechnique /* constrain_tech */, + XiePointer /* constrain_param */ +#endif +); + +extern void XieFloConvertFromIndex ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + Colormap /* colormap */, + XieDataClass /* data_class */, + unsigned int /* precision */ +#endif +); + +extern void XieFloConvertFromRGB ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieColorspace /* color_space */, + XiePointer /* color_param */ +#endif +); + +extern void XieFloConvertToIndex ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + Colormap /* colormap */, + XieColorList /* color_list */, + Bool /* notify */, + XieColorAllocTechnique /* color_alloc_tech */, + XiePointer /* color_alloc_param */ +#endif +); + +extern void XieFloConvertToRGB ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieColorspace /* color_space */, + XiePointer /* color_param */ +#endif +); + +extern void XieFloConvolve ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieProcessDomain * /* domain */, + float * /* kernel */, + int /* kernel_size */, + unsigned int /* band_mask */, + XieConvolveTechnique /* convolve_tech */, + XiePointer /* convolve_param */ +#endif +); + +extern void XieFloDither ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + unsigned int /* band_mask */, + XieLevels /* levels */, + XieDitherTechnique /* dither_tech */, + XiePointer /* dither_param */ +#endif +); + +extern void XieFloGeometry ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + unsigned int /* width */, + unsigned int /* height */, + float[6] /* coefficients[6] */, + XieConstant /* constant */, + unsigned int /* band_mask */, + XieGeometryTechnique /* sample_tech */, + XiePointer /* sample_param */ +#endif +); + +extern void XieFloLogical ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src1 */, + XiePhototag /* src2 */, + XieProcessDomain * /* domain */, + XieConstant /* constant */, + unsigned long /* operator */, + unsigned int /* band_mask */ +#endif +); + +extern void XieFloMatchHistogram ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieProcessDomain * /* domain */, + XieHistogramShape /* shape */, + XiePointer /* shape_param */ +#endif +); + +extern void XieFloMath ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieProcessDomain * /* domain */, + XieMathOp /* operator */, + unsigned int /* band_mask */ +#endif +); + +extern void XieFloPasteUp ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + unsigned int /* width */, + unsigned int /* height */, + XieConstant /* constant */, + XieTile * /* tiles */, + unsigned int /* tile_count */ +#endif +); + +extern void XieFloPoint ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieProcessDomain * /* domain */, + XiePhototag /* lut */, + unsigned int /* band_mask */ +#endif +); + +extern void XieFloUnconstrain ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */ +#endif +); + +extern void XieFloExportClientHistogram ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieProcessDomain * /* domain */, + XieExportNotify /* notify */ +#endif +); + +extern void XieFloExportClientLUT ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieOrientation /* band_order */, + XieExportNotify /* notify */, + XieLTriplet /* start */, + XieLTriplet /* length */ +#endif +); + +extern void XieFloExportClientPhoto ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieExportNotify /* notify */, + XieEncodeTechnique /* encode_tech */, + XiePointer /* encode_param */ +#endif +); + +extern void XieFloExportClientROI ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieExportNotify /* notify */ +#endif +); + +extern void XieFloExportDrawable ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + Drawable /* drawable */, + GC /* gc */, + int /* dst_x */, + int /* dst_y */ +#endif +); + +extern void XieFloExportDrawablePlane ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + Drawable /* drawable */, + GC /* gc */, + int /* dst_x */, + int /* dst_y */ +#endif +); + +extern void XieFloExportLUT ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieLut /* lut */, + Bool /* merge */, + XieLTriplet /* start */ +#endif +); + +extern void XieFloExportPhotomap ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XiePhotomap /* photomap */, + XieEncodeTechnique /* encode_tech */, + XiePointer /* encode_param */ +#endif +); + +extern void XieFloExportROI ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieRoi /* roi */ +#endif +); + + +/* Technique functions -----------------------------------------------------*/ + +extern XieColorAllocAllParam *XieTecColorAllocAll ( +#if NeedFunctionPrototypes + unsigned long /* fill */ +#endif +); + +extern XieColorAllocMatchParam *XieTecColorAllocMatch ( +#if NeedFunctionPrototypes + double /* match_limit */, + double /* gray_limit */ +#endif +); + +extern XieColorAllocRequantizeParam *XieTecColorAllocRequantize ( +#if NeedFunctionPrototypes + unsigned long /* max_cells */ +#endif +); + +extern XieRGBToCIELabParam *XieTecRGBToCIELab ( +#if NeedFunctionPrototypes + XieMatrix /* matrix */, + XieWhiteAdjustTechnique /* white_adjust_tech */, + XiePointer /* white_adjust_param */ +#endif +); + +extern XieRGBToCIEXYZParam *XieTecRGBToCIEXYZ ( +#if NeedFunctionPrototypes + XieMatrix /* matrix */, + XieWhiteAdjustTechnique /* white_adjust_tech */, + XiePointer /* white_adjust_param */ +#endif +); + +extern XieRGBToYCbCrParam *XieTecRGBToYCbCr ( +#if NeedFunctionPrototypes + XieLevels /* levels */, + double /* luma_red */, + double /* luma_green */, + double /* luma_blue */, + XieConstant /* bias */ +#endif +); + +extern XieRGBToYCCParam *XieTecRGBToYCC ( +#if NeedFunctionPrototypes + XieLevels /* levels */, + double /* luma_red */, + double /* luma_green */, + double /* luma_blue */, + double /* scale */ +#endif +); + +extern XieCIELabToRGBParam *XieTecCIELabToRGB ( +#if NeedFunctionPrototypes + XieMatrix /* matrix */, + XieWhiteAdjustTechnique /* white_adjust_tech */, + XiePointer /* white_adjust_param */, + XieGamutTechnique /* gamut_tech */, + XiePointer /* gamut_param */ +#endif +); + +extern XieCIEXYZToRGBParam *XieTecCIEXYZToRGB ( +#if NeedFunctionPrototypes + XieMatrix /* matrix */, + XieWhiteAdjustTechnique /* white_adjust_tech */, + XiePointer /* white_adjust_param */, + XieGamutTechnique /* gamut_tech */, + XiePointer /* gamut_param */ +#endif +); + +extern XieYCbCrToRGBParam *XieTecYCbCrToRGB ( +#if NeedFunctionPrototypes + XieLevels /* levels */, + double /* luma_red */, + double /* luma_green */, + double /* luma_blue */, + XieConstant /* bias */, + XieGamutTechnique /* gamut_tech */, + XiePointer /* gamut_param */ +#endif +); + +extern XieYCCToRGBParam *XieTecYCCToRGB ( +#if NeedFunctionPrototypes + XieLevels /* levels */, + double /* luma_red */, + double /* luma_green */, + double /* luma_blue */, + double /* scale */, + XieGamutTechnique /* gamut_tech */, + XiePointer /* gamut_param */ +#endif +); + +extern XieClipScaleParam *XieTecClipScale ( +#if NeedFunctionPrototypes + XieConstant /* in_low */, + XieConstant /* in_high */, + XieLTriplet /* out_low */, + XieLTriplet /* out_high */ +#endif +); + +extern XieConvolveConstantParam *XieTecConvolveConstant ( +#if NeedFunctionPrototypes + XieConstant /* constant */ +#endif +); + +extern XieDecodeUncompressedSingleParam *XieTecDecodeUncompressedSingle ( +#if NeedFunctionPrototypes + XieOrientation /* fill_order */, + XieOrientation /* pixel_order */, + unsigned int /* pixel_stride */, + unsigned int /* left_pad */, + unsigned int /* scanline_pad */ +#endif +); + +extern XieDecodeUncompressedTripleParam *XieTecDecodeUncompressedTriple ( +#if NeedFunctionPrototypes + XieOrientation /* fill_order */, + XieOrientation /* pixel_order */, + XieOrientation /* band_order */, + XieInterleave /* interleave */, + unsigned char[3] /* pixel_stride[3] */, + unsigned char[3] /* left_pad[3] */, + unsigned char[3] /* scanline_pad[3] */ +#endif +); + +extern XieDecodeG31DParam *XieTecDecodeG31D ( +#if NeedFunctionPrototypes + XieOrientation /* encoded_order */, + Bool /* normal */, + Bool /* radiometric */ +#endif +); + +extern XieDecodeG32DParam *XieTecDecodeG32D ( +#if NeedFunctionPrototypes + XieOrientation /* encoded_order */, + Bool /* normal */, + Bool /* radiometric */ +#endif +); + +extern XieDecodeG42DParam *XieTecDecodeG42D ( +#if NeedFunctionPrototypes + XieOrientation /* encoded_order */, + Bool /* normal */, + Bool /* radiometric */ +#endif +); + +extern XieDecodeTIFF2Param *XieTecDecodeTIFF2 ( +#if NeedFunctionPrototypes + XieOrientation /* encoded_order */, + Bool /* normal */, + Bool /* radiometric */ +#endif +); + +extern XieDecodeTIFFPackBitsParam *XieTecDecodeTIFFPackBits ( +#if NeedFunctionPrototypes + XieOrientation /* encoded_order */, + Bool /* normal */ +#endif +); + +extern XieDecodeJPEGBaselineParam *XieTecDecodeJPEGBaseline ( +#if NeedFunctionPrototypes + XieInterleave /* interleave */, + XieOrientation /* band_order */, + Bool /* up_sample */ +#endif +); + +extern XieDecodeJPEGLosslessParam *XieTecDecodeJPEGLossless ( +#if NeedFunctionPrototypes + XieInterleave /* interleave */, + XieOrientation /* band_order */ +#endif +); + +extern XieDitherOrderedParam *XieTecDitherOrderedParam ( +#if NeedFunctionPrototypes + unsigned int /* threshold_order */ +#endif +); + +extern XieEncodeUncompressedSingleParam *XieTecEncodeUncompressedSingle ( +#if NeedFunctionPrototypes + XieOrientation /* fill_order */, + XieOrientation /* pixel_order */, + unsigned int /* pixel_stride */, + unsigned int /* scanline_pad */ +#endif +); + +extern XieEncodeUncompressedTripleParam *XieTecEncodeUncompressedTriple ( +#if NeedFunctionPrototypes + XieOrientation /* fill_order */, + XieOrientation /* pixel_order */, + XieOrientation /* band_order */, + XieInterleave /* interleave */, + unsigned char[3] /* pixel_stride[3] */, + unsigned char[3] /* scanline_pad[3] */ +#endif +); + +extern XieEncodeG31DParam *XieTecEncodeG31D ( +#if NeedFunctionPrototypes + Bool /* align_eol */, + Bool /* radiometric */, + XieOrientation /* encoded_order */ +#endif +); + +extern XieEncodeG32DParam *XieTecEncodeG32D ( +#if NeedFunctionPrototypes + Bool /* uncompressed */, + Bool /* align_eol */, + Bool /* radiometric */, + XieOrientation /* encoded_order */, + unsigned long /* k_factor */ +#endif +); + +extern XieEncodeG42DParam *XieTecEncodeG42D ( +#if NeedFunctionPrototypes + Bool /* uncompressed */, + Bool /* radiometric */, + XieOrientation /* encoded_order */ +#endif +); + +extern XieEncodeServerChoiceParam *XieTecEncodeServerChoice ( +#if NeedFunctionPrototypes + unsigned int /* preference */ +#endif +); + +extern XieEncodeJPEGBaselineParam *XieTecEncodeJPEGBaseline ( +#if NeedFunctionPrototypes + XieInterleave /* interleave */, + XieOrientation /* band_order */, + unsigned char[3] /* horizontal_samples[3] */, + unsigned char[3] /* vertical_samples[3] */, + char * /* q_table */, + unsigned int /* q_size */, + char * /* ac_table */, + unsigned int /* ac_size */, + char * /* dc_table */, + unsigned int /* dc_size */ +#endif +); + +extern void XieFreeEncodeJPEGBaseline ( +#if NeedFunctionPrototypes + XieEncodeJPEGBaselineParam * /* param */ +#endif +); + +extern XieEncodeJPEGLosslessParam *XieTecEncodeJPEGLossless ( +#if NeedFunctionPrototypes + XieInterleave /* interleave */, + XieOrientation /* band_order */, + unsigned char[3] /* predictor[3] */, + char * /* table */, + unsigned int /* table_size */ +#endif +); + +extern void XieFreeEncodeJPEGLossless ( +#if NeedFunctionPrototypes + XieEncodeJPEGLosslessParam * /* param */ +#endif +); + +extern void XieFreePasteUpTiles ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */ +#endif +); + +extern XieEncodeTIFF2Param *XieTecEncodeTIFF2 ( +#if NeedFunctionPrototypes + XieOrientation /* encoded_order */, + Bool /* radiometric */ +#endif +); + +extern XieEncodeTIFFPackBitsParam *XieTecEncodeTIFFPackBits ( +#if NeedFunctionPrototypes + XieOrientation /* encoded_order */ +#endif +); + +extern XieGeomAntialiasByAreaParam *XieTecGeomAntialiasByArea ( +#if NeedFunctionPrototypes + int /* simple */ +#endif +); + +extern XieGeomAntialiasByLowpassParam *XieTecGeomAntialiasByLowpass ( +#if NeedFunctionPrototypes + int /* kernel_size */ +#endif +); + +extern XieGeomGaussianParam *XieTecGeomGaussian ( +#if NeedFunctionPrototypes + double /* sigma */, + double /* normalize */, + unsigned int /* radius */, + Bool /* simple */ +#endif +); + +extern XieGeomNearestNeighborParam *XieTecGeomNearestNeighbor ( +#if NeedFunctionPrototypes + unsigned int /* modify */ +#endif +); + +extern XieHistogramGaussianParam *XieTecHistogramGaussian ( +#if NeedFunctionPrototypes + double /* mean */, + double /* sigma */ +#endif +); + +extern XieHistogramHyperbolicParam *XieTecHistogramHyperbolic ( +#if NeedFunctionPrototypes + double /* constant */, + Bool /* shape_factor */ +#endif +); + +extern XieWhiteAdjustCIELabShiftParam *XieTecWhiteAdjustCIELabShift ( +#if NeedFunctionPrototypes + XieConstant /* white_point */ +#endif +); + + +#endif /* _XIELIB_H_ */ diff --git a/xie/build/include/X11/extensions/XIEproto.h b/xie/build/include/X11/extensions/XIEproto.h new file mode 100644 index 0000000..b097319 --- /dev/null +++ b/xie/build/include/X11/extensions/XIEproto.h @@ -0,0 +1,687 @@ +/* $XConsortium: XIEproto.h,v 1.6 94/04/17 20:11:12 mor Exp $ */ +/****************************************************************************** +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +******************************************************************************/ + +#ifndef _XIEPROTO_H_ +#define _XIEPROTO_H_ + +#include + +#define Drawable CARD32 +#define Colormap CARD32 +#define GContext CARD32 + + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; +} xieReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + CARD16 majorVersion B16; + CARD16 minorVersion B16; +} xieQueryImageExtensionReq; + +typedef struct { + CARD8 type; + CARD8 data; + CARD16 sequenceNum B16; + CARD32 length B32; + CARD16 majorVersion B16; + CARD16 minorVersion B16; + xieTypServiceClass serviceClass; + xieTypAlignment alignment; + CARD16 unconstrainedMantissa B16; + INT32 unconstrainedMaxExp B32; + INT32 unconstrainedMinExp B32; + CARD8 pad2[8]; + /* LISTofCARD32 (constrained-levels) */ +} xieQueryImageExtensionReply; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypTechniqueGroup techniqueGroup; + CARD8 pad[3]; +} xieQueryTechniquesReq; + +typedef struct { + CARD8 type; + CARD8 data; + CARD16 sequenceNum B16; + CARD32 length B32; + CARD16 numTechniques B16; + CARD8 pad[22]; + /* LISTofTechniqueRec (numTechniques) */ +} xieQueryTechniquesReply; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypColorList colorList B32; +} xieCreateColorListReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypColorList colorList B32; +} xieDestroyColorListReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypColorList colorList B32; +} xiePurgeColorListReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypColorList colorList B32; +} xieQueryColorListReq; + +typedef struct { + CARD8 type; + CARD8 data; + CARD16 sequenceNum B16; + CARD32 length B32; + Colormap colormap B32; + CARD8 pad[20]; + /* LISTofCARD32 (length) */ +} xieQueryColorListReply; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypLUT lut B32; +} xieCreateLUTReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypLUT lut B32; +} xieDestroyLUTReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotomap photomap B32; +} xieCreatePhotomapReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotomap photomap B32; +} xieDestroyPhotomapReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotomap photomap B32; +} xieQueryPhotomapReq; + +typedef struct { + CARD8 type; + BOOL populated; + CARD16 sequenceNum B16; + CARD32 length B32; + xieTypDataClass dataClass; + xieTypDataType dataType; + xieTypDecodeTechnique decodeTechnique B16; + CARD32 width0 B32; + CARD32 width1 B32; + CARD32 width2 B32; + CARD32 height0 B32; + CARD32 height1 B32; + CARD32 height2 B32; + CARD32 levels0 B32; + CARD32 levels1 B32; + CARD32 levels2 B32; +} xieQueryPhotomapReply; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypROI roi B32; +} xieCreateROIReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypROI roi B32; +} xieDestroyROIReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotospace nameSpace B32; +} xieCreatePhotospaceReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotospace nameSpace B32; +} xieDestroyPhotospaceReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotospace nameSpace B32; + CARD32 floID B32; + CARD16 numElements B16; + BOOL notify; + CARD8 pad; + /* LISTofPhotoElement (numElements) */ +} xieExecuteImmediateReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotoflo floID B32; + CARD16 numElements B16; + CARD16 pad B16; + /* LISTofPhotoElement (numElements) */ +} xieCreatePhotofloReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotoflo floID B32; +} xieDestroyPhotofloReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotoflo floID B32; + BOOL notify; + CARD8 pad[3]; +} xieExecutePhotofloReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotoflo floID B32; + xieTypPhototag start B16; + CARD16 numElements B16; + /* LISTofPhotoElement (numElements) */ +} xieModifyPhotofloReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotoflo floID B32; + CARD16 numElements B16; + CARD16 pad B16; + /* LISTofPhotoElement (numElements) */ +} xieRedefinePhotofloReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + CARD32 nameSpace B32; + CARD32 floID B32; + xieTypPhototag element B16; + BOOL final; + CARD8 bandNumber; + CARD32 byteCount B32; + /* LISTofCARD8 (byteCount) */ + /* pad (byteCount) */ +} xiePutClientDataReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + CARD32 nameSpace B32; + CARD32 floID B32; + CARD32 maxBytes B32; + xieTypPhototag element B16; + BOOL terminate; + CARD8 bandNumber; +} xieGetClientDataReq; + +typedef struct { + CARD8 type; + CARD8 newState; + CARD16 sequenceNum B16; + CARD32 length B32; + CARD32 byteCount B32; + CARD8 pad[20]; + /* LISTofCARD8 (byteCount) */ + /* pad (byteCount) */ +} xieGetClientDataReply; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + CARD32 nameSpace B32; + CARD32 floID B32; +} xieQueryPhotofloReq; + +typedef struct { + CARD8 type; + CARD8 state; + CARD16 sequenceNum B16; + CARD32 length B32; + CARD16 expectedCount B16; + CARD16 availableCount B16; + CARD8 pad[20]; + /* LISTofPhototag (expectedCount) */ + /* pad (expectedCount * 2) */ + /* LISTofPhototag (availableCount) */ + /* pad (availableCount * 2) */ +} xieQueryPhotofloReply; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + CARD32 nameSpace B32; + CARD32 floID B32; +} xieAwaitReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + CARD32 nameSpace B32; + CARD32 floID B32; +} xieAbortReq; + + +/* + * Request codes + */ + +#define X_ieQueryImageExtension 1 +#define X_ieQueryTechniques 2 +#define X_ieCreateColorList 3 +#define X_ieDestroyColorList 4 +#define X_iePurgeColorList 5 +#define X_ieQueryColorList 6 +#define X_ieCreateLUT 7 +#define X_ieDestroyLUT 8 +#define X_ieCreatePhotomap 9 +#define X_ieDestroyPhotomap 10 +#define X_ieQueryPhotomap 11 +#define X_ieCreateROI 12 +#define X_ieDestroyROI 13 +#define X_ieCreatePhotospace 14 +#define X_ieDestroyPhotospace 15 +#define X_ieExecuteImmediate 16 +#define X_ieCreatePhotoflo 17 +#define X_ieDestroyPhotoflo 18 +#define X_ieExecutePhotoflo 19 +#define X_ieModifyPhotoflo 20 +#define X_ieRedefinePhotoflo 21 +#define X_iePutClientData 22 +#define X_ieGetClientData 23 +#define X_ieQueryPhotoflo 24 +#define X_ieAwait 25 +#define X_ieAbort 26 + +#define xieNumProtoReq 26 + + +/* + * Events + */ +typedef struct { + CARD8 event; + xieTypPhotofloOutcome outcome; + CARD16 sequenceNum B16; + CARD32 time B32; + CARD32 instanceNameSpace B32; + CARD32 instanceFloID B32; + CARD8 pad[16]; +} xiePhotofloDoneEvn; + +typedef struct { + CARD8 event; + CARD8 pad1; + CARD16 sequenceNum B16; + CARD32 time B32; + CARD32 instanceNameSpace B32; + CARD32 instanceFloID B32; + xieTypPhototag src B16; + CARD16 type B16; + CARD32 pad2 B32; + CARD32 pad3 B16; + CARD32 pad4 B32; +} xieFloEvn; + +typedef struct { + CARD8 event; + CARD8 pad1; + CARD16 sequenceNum B16; + CARD32 time B32; + CARD32 instanceNameSpace B32; + CARD32 instanceFloID B32; + xieTypPhototag src B16; + CARD16 type B16; + xieTypColorList colorList B32; + xieTypColorAllocTechnique colorAllocTechnique B16; + CARD16 pad2 B16; + CARD32 data B32; +} xieColorAllocEvn; + +typedef struct { + CARD8 event; + CARD8 bandNumber; + CARD16 sequenceNum B16; + CARD32 time B32; + CARD32 instanceNameSpace B32; + CARD32 instanceFloID B32; + xieTypPhototag src B16; + CARD16 type B16; + xieTypDecodeTechnique decodeTechnique B16; + BOOL aborted; + CARD8 pad; + CARD32 width B32; + CARD32 height B32; +} xieDecodeNotifyEvn; + +typedef struct { + CARD8 event; + CARD8 bandNumber; + CARD16 sequenceNum B16; + CARD32 time B32; + CARD32 instanceNameSpace B32; + CARD32 instanceFloID B32; + xieTypPhototag src B16; + CARD16 type B16; + CARD32 data0 B32; + CARD32 data1 B32; + CARD32 data2 B32; +} xieExportAvailableEvn; + +typedef struct { + CARD8 event; + CARD8 pad; + CARD16 sequenceNum B16; + CARD32 time B32; + CARD32 instanceNameSpace B32; + CARD32 instanceFloID B32; + xieTypPhototag src B16; + CARD16 type B16; + Window window B32; + INT16 x B16; + INT16 y B16; + CARD16 width B16; + CARD16 height B16; +} xieImportObscuredEvn; + + +/* + * Errors + */ +typedef struct { + CARD8 error; + CARD8 code; + CARD16 sequenceNum B16; + CARD32 resourceID B32; + CARD16 minorOpcode B16; + CARD8 majorOpcode; + CARD8 pad[21]; +} xieResourceErr; + +typedef struct { + CARD8 error; + CARD8 code; + CARD16 sequenceNum B16; + CARD32 floID B32; + CARD16 minorOpcode B16; + CARD8 majorOpcode; + CARD8 floErrorCode; + CARD32 nameSpace B32; + xieTypPhototag phototag B16; + CARD16 type B16; + CARD32 resourceID B32; + CARD8 pad[8]; +} xieFloResourceErr; + +typedef struct { + CARD8 error; + CARD8 code; + CARD16 sequenceNum B16; + CARD32 floID B32; + CARD16 minorOpcode B16; + CARD8 majorOpcode; + CARD8 floErrorCode; + CARD32 nameSpace B32; + xieTypPhototag phototag B16; + CARD16 type B16; + CARD8 pad[12]; +} xieFloErr, xieFloAccessErr, xieFloAllocErr, xieFloElementErr, + xieFloLengthErr, xieFloMatchErr, xieFloSourceErr, xieFloImplementationErr; + +typedef struct { + CARD8 error; + CARD8 code; + CARD16 sequenceNum B16; + CARD32 floID B32; + CARD16 minorOpcode B16; + CARD8 majorOpcode; + CARD8 floErrorCode; + CARD32 nameSpace B32; + xieTypPhototag phototag B16; + CARD16 type B16; + xieTypPhototag domainSrc B16; + CARD8 pad[10]; +} xieFloDomainErr; + +typedef struct { + CARD8 error; + CARD8 code; + CARD16 sequenceNum B16; + CARD32 floID B32; + CARD16 minorOpcode B16; + CARD8 majorOpcode; + CARD8 floErrorCode; + CARD32 nameSpace B32; + CARD8 pad[16]; +} xieFloIDErr; + +typedef struct { + CARD8 error; + CARD8 code; + CARD16 sequenceNum B16; + CARD32 floID B32; + CARD16 minorOpcode B16; + CARD8 majorOpcode; + CARD8 floErrorCode; + CARD32 nameSpace B32; + xieTypPhototag phototag B16; + CARD16 type B16; + CARD8 operator; + CARD8 pad[11]; +} xieFloOperatorErr; + +typedef struct { + CARD8 error; + CARD8 code; + CARD16 sequenceNum B16; + CARD32 floID B32; + CARD16 minorOpcode B16; + CARD8 majorOpcode; + CARD8 floErrorCode; + CARD32 nameSpace B32; + xieTypPhototag phototag B16; + CARD16 type B16; + CARD16 techniqueNumber B16; + CARD16 lenTechParams B16; + CARD8 techniqueGroup; + CARD8 pad[7]; +} xieFloTechniqueErr; + +typedef struct { + CARD8 error; + CARD8 code; + CARD16 sequenceNum B16; + CARD32 floID B32; + CARD16 minorOpcode B16; + CARD8 majorOpcode; + CARD8 floErrorCode; + CARD32 nameSpace B32; + xieTypPhototag phototag B16; + CARD16 type B16; + CARD32 badValue B32; + CARD8 pad[8]; +} xieFloValueErr; + + + +/* + * SIZEOF values + */ +#define sz_xieReq 4 +#define sz_xieQueryImageExtensionReq 8 +#define sz_xieQueryImageExtensionReply 32 +#define sz_xieQueryTechniquesReq 8 +#define sz_xieQueryTechniquesReply 32 +#define sz_xieCreateColorListReq 8 +#define sz_xieDestroyColorListReq 8 +#define sz_xiePurgeColorListReq 8 +#define sz_xieQueryColorListReq 8 +#define sz_xieQueryColorListReply 32 +#define sz_xieCreateLUTReq 8 +#define sz_xieDestroyLUTReq 8 +#define sz_xieCreatePhotomapReq 8 +#define sz_xieDestroyPhotomapReq 8 +#define sz_xieQueryPhotomapReq 8 +#define sz_xieQueryPhotomapReply 48 +#define sz_xieCreateROIReq 8 +#define sz_xieDestroyROIReq 8 +#define sz_xieCreatePhotospaceReq 8 +#define sz_xieDestroyPhotospaceReq 8 +#define sz_xieExecuteImmediateReq 16 +#define sz_xieCreatePhotofloReq 12 +#define sz_xieDestroyPhotofloReq 8 +#define sz_xieExecutePhotofloReq 12 +#define sz_xieModifyPhotofloReq 12 +#define sz_xieRedefinePhotofloReq 12 +#define sz_xiePutClientDataReq 20 +#define sz_xieGetClientDataReq 20 +#define sz_xieGetClientDataReply 32 +#define sz_xieQueryPhotofloReq 12 +#define sz_xieQueryPhotofloReply 32 +#define sz_xieAwaitReq 12 +#define sz_xieAbortReq 12 + +#define sz_xiePhotofloDoneEvn 32 +#define sz_xieColorAllocEvn 32 +#define sz_xieDecodeNotifyEvn 32 +#define sz_xieExportAvailableEvn 32 +#define sz_xieImportObscuredEvn 32 +#define sz_xieFloEvn 32 + +#define sz_xieResourceErr 32 +#define sz_xieFloAccessErr 32 +#define sz_xieFloAllocErr 32 +#define sz_xieFloElementErr 32 +#define sz_xieFloIDErr 32 +#define sz_xieFloLengthErr 32 +#define sz_xieFloMatchErr 32 +#define sz_xieFloSourceErr 32 +#define sz_xieFloDomainErr 32 +#define sz_xieFloOperatorErr 32 +#define sz_xieFloTechniqueErr 32 +#define sz_xieFloValueErr 32 +#define sz_xieFloImplementationErr 32 +#define sz_xieFloErr 32 + +#undef Drawable +#undef Colormap +#undef GContext + +#endif /* _XIEPROTO_H_ */ diff --git a/xie/build/include/X11/extensions/XIEprotost.h b/xie/build/include/X11/extensions/XIEprotost.h new file mode 100644 index 0000000..2298afe --- /dev/null +++ b/xie/build/include/X11/extensions/XIEprotost.h @@ -0,0 +1,1118 @@ +/* $XConsortium: XIEprotost.h,v 1.6 94/04/17 20:11:12 mor Exp $ */ +/****************************************************************************** + + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. + + +******************************************************************************/ + +#ifndef _XIEPROTOST_H_ +#define _XIEPROTOST_H_ + +#include /* defines things like CARD32 */ + +#define Drawable CARD32 +#define Colormap CARD32 +#define GContext CARD32 + +typedef CARD32 xieTypFloat; + +#ifndef WORD64 + +typedef xieTypFloat xieTypConstant[3]; + +typedef xieTypFloat xieTypMatrix[9]; + +#else /* WORD64 */ + +typedef CARD8 xieTypConstant[12]; + +typedef CARD8 xieTypMatrix[36]; + +#endif /* WORD64 */ + + +typedef CARD8 xieTypAlignment; + +typedef CARD8 xieTypArithmeticOp; + +typedef CARD16 xieTypColorAllocTechnique; + +typedef CARD32 xieTypColorList; + +typedef CARD8 xieTypCompareOp; + +typedef CARD16 xieTypConstrainTechnique; + +typedef CARD16 xieTypConvertFromRGBTechnique; + +typedef CARD16 xieTypConvertToRGBTechnique; + +typedef CARD16 xieTypConvolveTechnique; + +typedef CARD8 xieTypDataClass; + +typedef CARD8 xieTypDataType; + +typedef CARD16 xieTypDecodeTechnique; + +typedef CARD16 xieTypDitherTechnique; + +typedef CARD16 xieTypEncodeTechnique; + +typedef CARD32 xieTypPhotospace; + +typedef CARD32 xieTypPhotoflo; + +typedef struct { + union { + struct { + xieTypPhotospace nameSpace B32; + CARD32 floID B32; + } immed; + struct { + CARD32 nameSpace B32; + xieTypPhotoflo floID B32; + } stored; + } u; +} xieTypExecutable; + +typedef CARD8 xieTypExportNotify; + +typedef CARD8 xieTypExportState; + +typedef CARD16 xieTypGamutTechnique; + +typedef CARD16 xieTypGeometryTechnique; + +typedef struct { + CARD32 value B32; + CARD32 count B32; +} xieTypHistogramData; + +typedef CARD16 xieTypHistogramShape; + +typedef CARD8 xieTypInterleave; + +typedef CARD32 xieTypLevels[3]; + +typedef CARD32 xieTypLUT; + +typedef CARD8 xieTypMathOp; + +typedef CARD8 xieTypOrientation; + +typedef CARD8 xieTypPhotofloOutcome; + +typedef CARD8 xieTypPhotofloState; + +typedef CARD32 xieTypPhotomap; + +typedef CARD16 xieTypPhototag; + +typedef struct { + INT32 offsetX B32; + INT32 offsetY B32; + xieTypPhototag domain B16; +} xieTypProcessDomain; + +typedef struct { + INT32 x B32; + INT32 y B32; + CARD32 width B32; + CARD32 height B32; +} xieTypRectangle; + +typedef CARD32 xieTypROI; + +typedef CARD8 xieTypServiceClass; + +typedef CARD8 xieTypTechniqueGroup; + +typedef struct { + BOOL needsParam; + xieTypTechniqueGroup group; + CARD16 number B16; + CARD8 speed; + CARD8 nameLength; + CARD16 pad B16; + /* LISTofCARD8 (nameLength) */ + /* pad (nameLength) */ +} xieTypTechniqueRec; + +typedef struct { + xieTypPhototag src B16; + CARD16 pad B16; + INT32 dstX B32; + INT32 dstY B32; +} xieTypTile; + +typedef CARD8 xieTypTripleofCARD8[3]; + +typedef CARD16 xieTypTripleofCARD16[3]; + +typedef CARD32 xieTypTripleofCARD32[3]; + +typedef CARD16 xieTypWhiteAdjustTechnique; + + +/* + * Generic Element + */ + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; +} xieFlo; + +/* + * Import Elements + */ +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypDataClass class; + xieTypOrientation bandOrder; + CARD16 pad B16; + CARD32 length0 B32; + CARD32 length1 B32; + CARD32 length2 B32; + CARD32 levels0 B32; + CARD32 levels1 B32; + CARD32 levels2 B32; +} xieFloImportClientLUT; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + BOOL notify; + xieTypDataClass class; + CARD16 pad B16; + CARD32 width0 B32; + CARD32 width1 B32; + CARD32 width2 B32; + CARD32 height0 B32; + CARD32 height1 B32; + CARD32 height2 B32; + CARD32 levels0 B32; + CARD32 levels1 B32; + CARD32 levels2 B32; + xieTypDecodeTechnique decodeTechnique B16; + CARD16 lenParams B16; + /* Technique dependent decode params */ +} xieFloImportClientPhoto; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + CARD32 rectangles B32; +} xieFloImportClientROI; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + Drawable drawable B32; + INT16 srcX B16; + INT16 srcY B16; + CARD16 width B16; + CARD16 height B16; + CARD32 fill B32; + BOOL notify; + CARD8 pad[3]; +} xieFloImportDrawable; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + Drawable drawable B32; + INT16 srcX B16; + INT16 srcY B16; + CARD16 width B16; + CARD16 height B16; + CARD32 fill B32; + CARD32 bitPlane B32; + BOOL notify; + CARD8 pad[3]; +} xieFloImportDrawablePlane; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypLUT lut B32; +} xieFloImportLUT; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhotomap photomap B32; + BOOL notify; + CARD8 pad[3]; +} xieFloImportPhotomap; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypROI roi B32; +} xieFloImportROI; + + +/* + * Process Elements + */ +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src1 B16; + xieTypPhototag src2 B16; + INT32 domainOffsetX B32; + INT32 domainOffsetY B32; + xieTypPhototag domainPhototag B16; + xieTypArithmeticOp operator; + CARD8 bandMask; + xieTypFloat constant0 B32; + xieTypFloat constant1 B32; + xieTypFloat constant2 B32; +} xieFloArithmetic; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src1 B16; + xieTypPhototag src2 B16; + xieTypPhototag src3 B16; + CARD16 pad B16; +} xieFloBandCombine; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD16 pad B16; + CARD32 levels B32; + xieTypFloat bias B32; + xieTypFloat constant0 B32; + xieTypFloat constant1 B32; + xieTypFloat constant2 B32; +} xieFloBandExtract; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD8 bandNumber; + CARD8 pad; +} xieFloBandSelect; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src1 B16; + xieTypPhototag src2 B16; + xieTypPhototag alpha B16; + CARD16 pad1 B16; + INT32 domainOffsetX B32; + INT32 domainOffsetY B32; + xieTypPhototag domainPhototag B16; + CARD8 bandMask; + CARD8 pad2; + xieTypFloat constant0 B32; + xieTypFloat constant1 B32; + xieTypFloat constant2 B32; + xieTypFloat alphaConst B32; +} xieFloBlend; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src1 B16; + xieTypPhototag src2 B16; + INT32 domainOffsetX B32; + INT32 domainOffsetY B32; + xieTypPhototag domainPhototag B16; + xieTypCompareOp operator; + BOOL combine; + xieTypFloat constant0 B32; + xieTypFloat constant1 B32; + xieTypFloat constant2 B32; + CARD8 bandMask; + CARD8 pad[3]; +} xieFloCompare; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD16 pad B16; + CARD32 levels0 B32; + CARD32 levels1 B32; + CARD32 levels2 B32; + xieTypConstrainTechnique constrain B16; + CARD16 lenParams B16; + /* Technique dependent constrain params */ +} xieFloConstrain; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + xieTypDataClass class; + CARD8 precision; + Colormap colormap B32; +} xieFloConvertFromIndex; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD16 pad B16; + xieTypConvertFromRGBTechnique convert B16; + CARD16 lenParams B16; + /* Technique dependent conversion params */ +} xieFloConvertFromRGB; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + BOOL notify; + CARD8 pad; + Colormap colormap B32; + xieTypColorList colorList B32; + xieTypColorAllocTechnique colorAlloc B16; + CARD16 lenParams B16; + /* Technique dependent color alloc params */ +} xieFloConvertToIndex; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD16 pad B16; + xieTypConvertToRGBTechnique convert B16; + CARD16 lenParams B16; + /* Technique dependent conversion params */ +} xieFloConvertToRGB; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD16 pad B16; + INT32 domainOffsetX B32; + INT32 domainOffsetY B32; + xieTypPhototag domainPhototag B16; + CARD8 bandMask; + CARD8 kernelSize; + xieTypConvolveTechnique convolve B16; + CARD16 lenParams B16; + /* LISTofFloat (kernelSize^2) */ + /* Technique dependent convolve params */ +} xieFloConvolve; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD8 bandMask; + CARD8 pad; + CARD32 levels0 B32; + CARD32 levels1 B32; + CARD32 levels2 B32; + xieTypDitherTechnique dither B16; + CARD16 lenParams B16; + /* Technique dependent dither params */ +} xieFloDither; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD8 bandMask; + CARD8 pad; + CARD32 width B32; + CARD32 height B32; + xieTypFloat a B32; + xieTypFloat b B32; + xieTypFloat c B32; + xieTypFloat d B32; + xieTypFloat tx B32; + xieTypFloat ty B32; + xieTypFloat constant0 B32; + xieTypFloat constant1 B32; + xieTypFloat constant2 B32; + xieTypGeometryTechnique sample B16; + CARD16 lenParams B16; + /* Technique dependent sample params */ +} xieFloGeometry; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src1 B16; + xieTypPhototag src2 B16; + INT32 domainOffsetX B32; + INT32 domainOffsetY B32; + xieTypPhototag domainPhototag B16; + CARD8 operator; + CARD8 bandMask; + xieTypFloat constant0 B32; + xieTypFloat constant1 B32; + xieTypFloat constant2 B32; +} xieFloLogical; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD16 pad1 B16; + INT32 domainOffsetX B32; + INT32 domainOffsetY B32; + xieTypPhototag domainPhototag B16; + CARD16 pad2 B16; + xieTypHistogramShape shape B16; + CARD16 lenParams B16; + /* Technique dependent shape params */ +} xieFloMatchHistogram; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD16 pad B16; + INT32 domainOffsetX B32; + INT32 domainOffsetY B32; + xieTypPhototag domainPhototag B16; + xieTypMathOp operator; + CARD8 bandMask; +} xieFloMath; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + CARD16 numTiles B16; + CARD16 pad B16; + CARD32 width B32; + CARD32 height B32; + xieTypFloat constant0 B32; + xieTypFloat constant1 B32; + xieTypFloat constant2 B32; + /* LISTofTile (numTiles) */ +} xieFloPasteUp; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + xieTypPhototag lut B16; + INT32 domainOffsetX B32; + INT32 domainOffsetY B32; + xieTypPhototag domainPhototag B16; + CARD8 bandMask; + CARD8 pad; +} xieFloPoint; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD16 pad B16; +} xieFloUnconstrain; + + +/* + * Export Elements + */ +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + xieTypExportNotify notify; + CARD8 pad1; + INT32 domainOffsetX B32; + INT32 domainOffsetY B32; + xieTypPhototag domainPhototag B16; + CARD16 pad2 B16; +} xieFloExportClientHistogram; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + xieTypExportNotify notify; + xieTypOrientation bandOrder; + CARD32 start0 B32; + CARD32 start1 B32; + CARD32 start2 B32; + CARD32 length0 B32; + CARD32 length1 B32; + CARD32 length2 B32; +} xieFloExportClientLUT; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + xieTypExportNotify notify; + CARD8 pad; + xieTypEncodeTechnique encodeTechnique B16; + CARD16 lenParams B16; + /* Technique dependent encode params */ +} xieFloExportClientPhoto; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + xieTypExportNotify notify; + CARD8 pad; +} xieFloExportClientROI; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + INT16 dstX B16; + INT16 dstY B16; + CARD16 pad B16; + Drawable drawable B32; + GContext gc B32; +} xieFloExportDrawable; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + INT16 dstX B16; + INT16 dstY B16; + CARD16 pad B16; + Drawable drawable B32; + GContext gc B32; +} xieFloExportDrawablePlane; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD8 merge; + CARD8 pad; + xieTypLUT lut B32; + CARD32 start0 B32; + CARD32 start1 B32; + CARD32 start2 B32; +} xieFloExportLUT; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD16 pad B16; + xieTypPhotomap photomap B32; + xieTypEncodeTechnique encodeTechnique B16; + CARD16 lenParams B16; + /* Technique dependent encode params */ +} xieFloExportPhotomap; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD16 pad B16; + xieTypROI roi B32; +} xieFloExportROI; + + +/* + * Technique Parameters + */ + +typedef struct { + xieTypFloat inputLow0 B32; + xieTypFloat inputLow1 B32; + xieTypFloat inputLow2 B32; + xieTypFloat inputHigh0 B32; + xieTypFloat inputHigh1 B32; + xieTypFloat inputHigh2 B32; + CARD32 outputLow0 B32; + CARD32 outputLow1 B32; + CARD32 outputLow2 B32; + CARD32 outputHigh0 B32; + CARD32 outputHigh1 B32; + CARD32 outputHigh2 B32; +} xieTecClipScale; + +typedef struct { + CARD32 fill B32; +} xieTecColorAllocAll; + +typedef struct { + xieTypFloat matchLimit B32; + xieTypFloat grayLimit B32; +} xieTecColorAllocMatch; + +typedef struct { + CARD32 maxCells B32; +} xieTecColorAllocRequantize; + +typedef struct { + xieTypFloat matrix00 B32; + xieTypFloat matrix01 B32; + xieTypFloat matrix02 B32; + xieTypFloat matrix10 B32; + xieTypFloat matrix11 B32; + xieTypFloat matrix12 B32; + xieTypFloat matrix20 B32; + xieTypFloat matrix21 B32; + xieTypFloat matrix22 B32; + xieTypWhiteAdjustTechnique whiteAdjusted B16; + CARD16 lenParams B16; + /* Technique dependent white params */ +} xieTecRGBToCIELab, xieTecRGBToCIEXYZ; + +typedef struct { + CARD32 levels0 B32; + CARD32 levels1 B32; + CARD32 levels2 B32; + xieTypFloat lumaRed B32; + xieTypFloat lumaGreen B32; + xieTypFloat lumaBlue B32; + xieTypFloat bias0 B32; + xieTypFloat bias1 B32; + xieTypFloat bias2 B32; +} xieTecRGBToYCbCr; + +typedef struct { + CARD32 levels0 B32; + CARD32 levels1 B32; + CARD32 levels2 B32; + xieTypFloat lumaRed B32; + xieTypFloat lumaGreen B32; + xieTypFloat lumaBlue B32; + xieTypFloat scale B32; +} xieTecRGBToYCC; + +typedef struct { + xieTypFloat matrix00 B32; + xieTypFloat matrix01 B32; + xieTypFloat matrix02 B32; + xieTypFloat matrix10 B32; + xieTypFloat matrix11 B32; + xieTypFloat matrix12 B32; + xieTypFloat matrix20 B32; + xieTypFloat matrix21 B32; + xieTypFloat matrix22 B32; + xieTypWhiteAdjustTechnique whiteAdjusted B16; + CARD16 lenWhiteParams B16; + xieTypGamutTechnique gamutCompress B16; + CARD16 lenGamutParams B16; + /* Technique dependent white params */ + /* Technique dependent gamut params */ +} xieTecCIELabToRGB, xieTecCIEXYZToRGB; + +typedef struct { + CARD32 levels0 B32; + CARD32 levels1 B32; + CARD32 levels2 B32; + xieTypFloat lumaRed B32; + xieTypFloat lumaGreen B32; + xieTypFloat lumaBlue B32; + xieTypFloat bias0 B32; + xieTypFloat bias1 B32; + xieTypFloat bias2 B32; + xieTypGamutTechnique gamutCompress B16; + CARD16 lenGamutParams B16; + /* Technique dependent gamut params */ +} xieTecYCbCrToRGB; + +typedef struct { + CARD32 levels0 B32; + CARD32 levels1 B32; + CARD32 levels2 B32; + xieTypFloat lumaRed B32; + xieTypFloat lumaGreen B32; + xieTypFloat lumaBlue B32; + xieTypFloat scale B32; + xieTypGamutTechnique gamutCompress B16; + CARD16 lenGamutParams B16; + /* Technique dependent gamut params */ +} xieTecYCCToRGB; + +typedef struct { + xieTypFloat constant0 B32; + xieTypFloat constant1 B32; + xieTypFloat constant2 B32; +} xieTecConvolveConstant; + +typedef struct { + xieTypOrientation fillOrder; + xieTypOrientation pixelOrder; + CARD8 pixelStride; + CARD8 leftPad; + CARD8 scanlinePad; + CARD8 pad[3]; +} xieTecDecodeUncompressedSingle; + +typedef struct { + CARD8 leftPad[3]; + xieTypOrientation fillOrder; + CARD8 pixelStride[3]; + xieTypOrientation pixelOrder; + CARD8 scanlinePad[3]; + xieTypOrientation bandOrder; + xieTypInterleave interleave; + CARD8 pad[3]; +} xieTecDecodeUncompressedTriple; + +typedef struct { + xieTypOrientation encodedOrder; + BOOL normal; + BOOL radiometric; + CARD8 pad; +} xieTecDecodeG31D, xieTecDecodeG32D, xieTecDecodeG42D, + xieTecDecodeTIFF2; + +typedef struct { + xieTypOrientation encodedOrder; + BOOL normal; + CARD16 pad B16; +} xieTecDecodeTIFFPackBits; + +typedef struct { + xieTypInterleave interleave; + xieTypOrientation bandOrder; + BOOL upSample; + CARD8 pad; +} xieTecDecodeJPEGBaseline; + +typedef struct { + xieTypInterleave interleave; + xieTypOrientation bandOrder; + CARD16 pad B16; +} xieTecDecodeJPEGLossless; + +typedef struct { + CARD8 thresholdOrder; + CARD8 pad[3]; +} xieTecDitherOrdered; + +typedef struct { + CARD8 preference; + CARD8 pad[3]; +} xieTecEncodeServerChoice; + +typedef struct { + xieTypOrientation fillOrder; + xieTypOrientation pixelOrder; + CARD8 pixelStride; + CARD8 scanlinePad; +} xieTecEncodeUncompressedSingle; + +typedef struct { + CARD8 pixelStride[3]; + xieTypOrientation pixelOrder; + CARD8 scanlinePad[3]; + xieTypOrientation fillOrder; + xieTypOrientation bandOrder; + xieTypInterleave interleave; + CARD16 pad B16; +} xieTecEncodeUncompressedTriple; + +typedef struct { + xieTypOrientation encodedOrder; + BOOL alignEol; + BOOL radiometric; + CARD8 pad; +} xieTecEncodeG31D; + +typedef struct { + xieTypOrientation encodedOrder; + BOOL alignEol; + BOOL radiometric; + BOOL uncompressed; + CARD32 kFactor B32; +} xieTecEncodeG32D; + +typedef struct { + xieTypOrientation encodedOrder; + BOOL radiometric; + BOOL uncompressed; + CARD8 pad; +} xieTecEncodeG42D; + +typedef struct { + xieTypInterleave interleave; + xieTypOrientation bandOrder; + CARD8 horizontalSamples[3]; + CARD8 verticalSamples[3]; + CARD16 lenQtable B16; /* multiple of 4 */ + CARD16 lenACtable B16; /* multiple of 4 */ + CARD16 lenDCtable B16; /* multiple of 4 */ + CARD16 pad B16; + /* LISTofCARD8 (Qtable) */ + /* LISTofCARD8 (ACtable) */ + /* LISTofCARD8 (DCtable) */ +} xieTecEncodeJPEGBaseline; + +typedef struct { + xieTypInterleave interleave; + xieTypOrientation bandOrder; + CARD16 lenTable B16; /* multiple of 4 */ + CARD8 predictor[3]; + CARD8 pad; + /* LISTofCARD8 (table) */ +} xieTecEncodeJPEGLossless; + +typedef struct { + xieTypOrientation encodedOrder; + BOOL radiometric; + CARD16 pad B16; +} xieTecEncodeTIFF2; + +typedef struct { + xieTypOrientation encodedOrder; + CARD8 pad[3]; +} xieTecEncodeTIFFPackBits; + +typedef struct { + INT16 simple B16; + CARD16 pad B16; +} xieTecGeomAntialiasByArea; + +typedef struct { + INT16 kernelSize B16; + CARD16 pad B16; +} xieTecGeomAntialiasByLowpass; + +typedef struct { + CARD8 radius; + BOOL simple; + CARD16 pad B16; + xieTypFloat sigma B32; + xieTypFloat normalize B32; +} xieTecGeomGaussian; + +typedef struct { + CARD8 modify; + CARD8 pad[3]; +} xieTecGeomNearestNeighbor; + +typedef struct { + xieTypFloat mean B32; + xieTypFloat sigma B32; +} xieTecHistogramGaussian; + +typedef struct { + BOOL shapeFactor; + CARD8 pad[3]; + xieTypFloat constant B32; +} xieTecHistogramHyperbolic; + +typedef struct { + xieTypFloat whitePoint0 B32; + xieTypFloat whitePoint1 B32; + xieTypFloat whitePoint2 B32; +} xieTecWhiteAdjustCIELabShift; + + +/* + * SIZEOF values + */ +#define sz_xieTypAlignment 1 +#define sz_xieTypArithmeticOp 1 +#define sz_xieTypColorAllocTechnique 2 +#define sz_xieTypColorList 4 +#define sz_xieTypCompareOp 1 +#define sz_xieTypConstant 12 +#define sz_xieTypConstrainTechnique 2 +#define sz_xieTypConvertFromRGBTechnique 2 +#define sz_xieTypConvertToRGBTechnique 2 +#define sz_xieTypConvolveTechnique 2 +#define sz_xieTypDataClass 1 +#define sz_xieTypDataType 1 +#define sz_xieTypDecodeTechnique 2 +#define sz_xieTypDitherTechnique 2 +#define sz_xieTypEncodeTechnique 2 +#define sz_xieTypPhotospace 4 +#define sz_xieTypPhotoflo 4 +#define sz_xieTypExecutable 8 +#define sz_xieTypExportNotify 1 +#define sz_xieTypExportState 1 +#define sz_xieTypFloat 4 +#define sz_xieTypGamutTechnique 2 +#define sz_xieTypGeometryTechnique 2 +#define sz_xieTypHistogramData 8 +#define sz_xieTypHistogramShape 2 +#define sz_xieTypInterleave 1 +#define sz_xieTypLevels 12 +#define sz_xieTypLUT 4 +#define sz_xieTypMathOp 1 +#define sz_xieTypMatrix 36 +#define sz_xieTypOrientation 1 +#define sz_xieTypPhotofloOutcome 1 +#define sz_xieTypPhotofloState 1 +#define sz_xieTypPhotomap 4 +#define sz_xieTypPhototag 2 +#define sz_xieTypProcessDomain 12 +#define sz_xieTypRectangle 16 +#define sz_xieTypROI 4 +#define sz_xieTypServiceClass 1 +#define sz_xieTypTechniqueGroup 1 +#define sz_xieTypTechniqueRec 8 +#define sz_xieTypTile 12 +#define sz_xieTypTripleofCARD8 3 +#define sz_xieTypTripleofCARD16 6 +#define sz_xieTypTripleofCARD32 12 +#define sz_xieTypWhiteAdjustTechnique 2 +#define sz_xieFloImportClientLUT 32 +#define sz_xieFloImportClientPhoto 48 +#define sz_xieFloImportClientROI 8 +#define sz_xieFloImportDrawable 24 +#define sz_xieFloImportDrawablePlane 28 +#define sz_xieFloImportLUT 8 +#define sz_xieFloImportPhotomap 12 +#define sz_xieFloImportROI 8 +#define sz_xieFloArithmetic 32 +#define sz_xieFloBandCombine 12 +#define sz_xieFloBandExtract 28 +#define sz_xieFloBandSelect 8 +#define sz_xieFloBlend 40 +#define sz_xieFloCompare 36 +#define sz_xieFloConstrain 24 +#define sz_xieFloConvertFromIndex 12 +#define sz_xieFloConvertFromRGB 12 +#define sz_xieFloConvertToIndex 20 +#define sz_xieFloConvertToRGB 12 +#define sz_xieFloConvolve 24 +#define sz_xieFloDither 24 +#define sz_xieFloGeometry 56 +#define sz_xieFloLogical 32 +#define sz_xieFloMatchHistogram 24 +#define sz_xieFloMath 20 +#define sz_xieFloPasteUp 28 +#define sz_xieFloPoint 20 +#define sz_xieFloUnconstrain 8 +#define sz_xieFloExportClientHistogram 20 +#define sz_xieFloExportClientLUT 32 +#define sz_xieFloExportClientPhoto 12 +#define sz_xieFloExportClientROI 8 +#define sz_xieFloExportDrawable 20 +#define sz_xieFloExportDrawablePlane 20 +#define sz_xieFloExportLUT 24 +#define sz_xieFloExportPhotomap 16 +#define sz_xieFloExportROI 12 +#define sz_xieTecColorAllocAll 4 +#define sz_xieTecColorAllocMatch 8 +#define sz_xieTecColorAllocRequantize 4 +#define sz_xieTecClipScale 48 +#define sz_xieTecHardClip 0 +#define sz_xieTecRGBToCIELab 40 +#define sz_xieTecRGBToCIEXYZ 40 +#define sz_xieTecRGBToYCbCr 36 +#define sz_xieTecRGBToYCC 28 +#define sz_xieTecYCbCrToRGB 40 +#define sz_xieTecYCCToRGB 32 +#define sz_xieTecCIELabToRGB 44 +#define sz_xieTecCIEXYZToRGB 44 +#define sz_xieTecConvolveConstant 12 +#define sz_xieTecConvolveReplicate 0 +#define sz_xieTecDecodeUncompressedSingle 8 +#define sz_xieTecDecodeUncompressedTriple 16 +#define sz_xieTecDecodeG31D 4 +#define sz_xieTecDecodeG32D 4 +#define sz_xieTecDecodeG42D 4 +#define sz_xieTecDecodeTIFF2 4 +#define sz_xieTecDecodeTIFFPackBits 4 +#define sz_xieTecDecodeJPEGBaseline 4 +#define sz_xieTecDecodeJPEGLossless 4 +#define sz_xieTecDitherOrdered 4 +#define sz_xieTecDitherErrorDiffusion 4 +#define sz_xieTecEncodeServerChoice 4 +#define sz_xieTecEncodeUncompressedSingle 4 +#define sz_xieTecEncodeUncompressedTriple 12 +#define sz_xieTecEncodeG31D 4 +#define sz_xieTecEncodeG32D 8 +#define sz_xieTecEncodeG42D 4 +#define sz_xieTecEncodeJPEGBaseline 16 +#define sz_xieTecEncodeJPEGLossless 8 +#define sz_xieTecEncodeTIFF2 4 +#define sz_xieTecEncodeTIFFPackBits 4 +#define sz_xieTecGamutNone 0 +#define sz_xieTecGamutClipRGB 0 +#define sz_xieTecGeomAntialias 0 +#define sz_xieTecGeomAntialiasByArea 4 +#define sz_xieTecGeomAntialiasByLowpass 4 +#define sz_xieTecGeomBilinearInterpolation 0 +#define sz_xieTecGeomGaussian 12 +#define sz_xieTecGeomNearestNeighbor 4 +#define sz_xieTecHistogramFlat 0 +#define sz_xieTecHistogramGaussian 8 +#define sz_xieTecHistogramHyperbolic 8 +#define sz_xieTecWhiteAdjustNone 0 +#define sz_xieTecWhiteAdjustCIELabShift 12 + +#undef Drawable +#undef Colormap +#undef GContext + +#endif /* _XIEPROTOST_H_ */ diff --git a/xie/build/init.o b/xie/build/init.o new file mode 100644 index 0000000..cb7d582 Binary files /dev/null and b/xie/build/init.o differ diff --git a/xie/build/libXIE.a b/xie/build/libXIE.a new file mode 100644 index 0000000..73b384f Binary files /dev/null and b/xie/build/libXIE.a differ diff --git a/xie/build/lut.o b/xie/build/lut.o new file mode 100644 index 0000000..bd379fd Binary files /dev/null and b/xie/build/lut.o differ diff --git a/xie/build/photoflo.o b/xie/build/photoflo.o new file mode 100644 index 0000000..9dde04d Binary files /dev/null and b/xie/build/photoflo.o differ diff --git a/xie/build/photomap.o b/xie/build/photomap.o new file mode 100644 index 0000000..c51be38 Binary files /dev/null and b/xie/build/photomap.o differ diff --git a/xie/build/photospace.o b/xie/build/photospace.o new file mode 100644 index 0000000..ab4bcd4 Binary files /dev/null and b/xie/build/photospace.o differ diff --git a/xie/build/roi.o b/xie/build/roi.o new file mode 100644 index 0000000..c914a51 Binary files /dev/null and b/xie/build/roi.o differ diff --git a/xie/build/technique.o b/xie/build/technique.o new file mode 100644 index 0000000..5170d3f Binary files /dev/null and b/xie/build/technique.o differ diff --git a/xie/build/utils.o b/xie/build/utils.o new file mode 100644 index 0000000..38f4c22 Binary files /dev/null and b/xie/build/utils.o differ diff --git a/xie/build/xieperf/abort.o b/xie/build/xieperf/abort.o new file mode 100644 index 0000000..417928d Binary files /dev/null and b/xie/build/xieperf/abort.o differ diff --git a/xie/build/xieperf/arith.o b/xie/build/xieperf/arith.o new file mode 100644 index 0000000..fede8ac Binary files /dev/null and b/xie/build/xieperf/arith.o differ diff --git a/xie/build/xieperf/await.o b/xie/build/xieperf/await.o new file mode 100644 index 0000000..1bdd2fc Binary files /dev/null and b/xie/build/xieperf/await.o differ diff --git a/xie/build/xieperf/band.o b/xie/build/xieperf/band.o new file mode 100644 index 0000000..581d41e Binary files /dev/null and b/xie/build/xieperf/band.o differ diff --git a/xie/build/xieperf/blend.o b/xie/build/xieperf/blend.o new file mode 100644 index 0000000..c4f5910 Binary files /dev/null and b/xie/build/xieperf/blend.o differ diff --git a/xie/build/xieperf/cache.o b/xie/build/xieperf/cache.o new file mode 100644 index 0000000..5bea221 Binary files /dev/null and b/xie/build/xieperf/cache.o differ diff --git a/xie/build/xieperf/compare.o b/xie/build/xieperf/compare.o new file mode 100644 index 0000000..cb74613 Binary files /dev/null and b/xie/build/xieperf/compare.o differ diff --git a/xie/build/xieperf/complex.o b/xie/build/xieperf/complex.o new file mode 100644 index 0000000..b0bae50 Binary files /dev/null and b/xie/build/xieperf/complex.o differ diff --git a/xie/build/xieperf/constrain.o b/xie/build/xieperf/constrain.o new file mode 100644 index 0000000..ac28bb8 Binary files /dev/null and b/xie/build/xieperf/constrain.o differ diff --git a/xie/build/xieperf/convolve.o b/xie/build/xieperf/convolve.o new file mode 100644 index 0000000..652b147 Binary files /dev/null and b/xie/build/xieperf/convolve.o differ diff --git a/xie/build/xieperf/creatdstry.o b/xie/build/xieperf/creatdstry.o new file mode 100644 index 0000000..6d4f734 Binary files /dev/null and b/xie/build/xieperf/creatdstry.o differ diff --git a/xie/build/xieperf/cvttoindex.o b/xie/build/xieperf/cvttoindex.o new file mode 100644 index 0000000..a62405e Binary files /dev/null and b/xie/build/xieperf/cvttoindex.o differ diff --git a/xie/build/xieperf/dither.o b/xie/build/xieperf/dither.o new file mode 100644 index 0000000..8b993a5 Binary files /dev/null and b/xie/build/xieperf/dither.o differ diff --git a/xie/build/xieperf/encode.o b/xie/build/xieperf/encode.o new file mode 100644 index 0000000..d3f73a2 Binary files /dev/null and b/xie/build/xieperf/encode.o differ diff --git a/xie/build/xieperf/errors.o b/xie/build/xieperf/errors.o new file mode 100644 index 0000000..7698266 Binary files /dev/null and b/xie/build/xieperf/errors.o differ diff --git a/xie/build/xieperf/events.o b/xie/build/xieperf/events.o new file mode 100644 index 0000000..e1bb144 Binary files /dev/null and b/xie/build/xieperf/events.o differ diff --git a/xie/build/xieperf/exportcl.o b/xie/build/xieperf/exportcl.o new file mode 100644 index 0000000..02c22c6 Binary files /dev/null and b/xie/build/xieperf/exportcl.o differ diff --git a/xie/build/xieperf/funcode.o b/xie/build/xieperf/funcode.o new file mode 100644 index 0000000..9b7cb44 Binary files /dev/null and b/xie/build/xieperf/funcode.o differ diff --git a/xie/build/xieperf/geometry.o b/xie/build/xieperf/geometry.o new file mode 100644 index 0000000..7c449ea Binary files /dev/null and b/xie/build/xieperf/geometry.o differ diff --git a/xie/build/xieperf/getnext.o b/xie/build/xieperf/getnext.o new file mode 100644 index 0000000..806b480 Binary files /dev/null and b/xie/build/xieperf/getnext.o differ diff --git a/xie/build/xieperf/import.o b/xie/build/xieperf/import.o new file mode 100644 index 0000000..78e6d74 Binary files /dev/null and b/xie/build/xieperf/import.o differ diff --git a/xie/build/xieperf/importcl.o b/xie/build/xieperf/importcl.o new file mode 100644 index 0000000..c317ab3 Binary files /dev/null and b/xie/build/xieperf/importcl.o differ diff --git a/xie/build/xieperf/logical.o b/xie/build/xieperf/logical.o new file mode 100644 index 0000000..bf27073 Binary files /dev/null and b/xie/build/xieperf/logical.o differ diff --git a/xie/build/xieperf/math.o b/xie/build/xieperf/math.o new file mode 100644 index 0000000..0912b77 Binary files /dev/null and b/xie/build/xieperf/math.o differ diff --git a/xie/build/xieperf/modify.o b/xie/build/xieperf/modify.o new file mode 100644 index 0000000..48ff49e Binary files /dev/null and b/xie/build/xieperf/modify.o differ diff --git a/xie/build/xieperf/mtchhist.o b/xie/build/xieperf/mtchhist.o new file mode 100644 index 0000000..f548b93 Binary files /dev/null and b/xie/build/xieperf/mtchhist.o differ diff --git a/xie/build/xieperf/pasteup.o b/xie/build/xieperf/pasteup.o new file mode 100644 index 0000000..0859a3f Binary files /dev/null and b/xie/build/xieperf/pasteup.o differ diff --git a/xie/build/xieperf/point.o b/xie/build/xieperf/point.o new file mode 100644 index 0000000..57a185e Binary files /dev/null and b/xie/build/xieperf/point.o differ diff --git a/xie/build/xieperf/purgecolst.o b/xie/build/xieperf/purgecolst.o new file mode 100644 index 0000000..8b65c52 Binary files /dev/null and b/xie/build/xieperf/purgecolst.o differ diff --git a/xie/build/xieperf/query.o b/xie/build/xieperf/query.o new file mode 100644 index 0000000..c7208dd Binary files /dev/null and b/xie/build/xieperf/query.o differ diff --git a/xie/build/xieperf/redefine.o b/xie/build/xieperf/redefine.o new file mode 100644 index 0000000..dcc82cf Binary files /dev/null and b/xie/build/xieperf/redefine.o differ diff --git a/xie/build/xieperf/rgb.o b/xie/build/xieperf/rgb.o new file mode 100644 index 0000000..e1d2a90 Binary files /dev/null and b/xie/build/xieperf/rgb.o differ diff --git a/xie/build/xieperf/tests.o b/xie/build/xieperf/tests.o new file mode 100644 index 0000000..8d41326 Binary files /dev/null and b/xie/build/xieperf/tests.o differ diff --git a/xie/build/xieperf/uconstrain.o b/xie/build/xieperf/uconstrain.o new file mode 100644 index 0000000..1d44346 Binary files /dev/null and b/xie/build/xieperf/uconstrain.o differ diff --git a/xie/build/xieperf/xieperf b/xie/build/xieperf/xieperf new file mode 100755 index 0000000..1b2a262 Binary files /dev/null and b/xie/build/xieperf/xieperf differ diff --git a/xie/build/xieperf/xieperf.o b/xie/build/xieperf/xieperf.o new file mode 100644 index 0000000..01fb263 Binary files /dev/null and b/xie/build/xieperf/xieperf.o differ diff --git a/xie/decclient.c b/xie/decclient.c new file mode 100644 index 0000000..071b733 --- /dev/null +++ b/xie/decclient.c @@ -0,0 +1,173 @@ +/* + * DEC XIE 2.3 client built against DEC's own libXie sources. + * + * XieCreateImage -> XieCreatePhoto -> XiePutTile -> XieExport + * + * Usage: decclient + */ +#include +#include +#include +#include + +#include +#include +#include + +/* the client never calls the DDX dispatch table; satisfy the linker */ +unsigned long (*xieDdxProc[1])() = { 0 }; + + +/* Read a drawable back from the SERVER (not from the framebuffer) and report + * how many pixels are set. This is server-side truth: if the tile is there, + * the server drew it and the remaining problem is only the framebuffer mapping; + * if it is zero, the export produced nothing at all. */ +static void readback(Display *dpy, Drawable d, int w, int h, const char *label) +{ + XImage *im; + int x, y, ones = 0, total = 0; + im = XGetImage(dpy, d, 0, 0, w, h, AllPlanes, ZPixmap); + if (!im) { printf(" %s: XGetImage FAILED\n", label); fflush(stdout); return; } + for (y = 0; y < h; y++) + for (x = 0; x < w; x++) { + total++; + if (XGetPixel(im, x, y) != 0) ones++; + } + printf(" %s: %d/%d pixels set (first row bits: ", label, ones, total); + for (x = 0; x < 8 && x < w; x++) printf("%ld", XGetPixel(im, x, 0) ? 1L : 0L); + printf(")\n"); fflush(stdout); + XDestroyImage(im); +} + +int main(int argc, char **argv) +{ + Display *dpy; + Window win; + GC gc; + XSetWindowAttributes swa; + XieImage img; + XiePhotomap pm; + unsigned long lvl[3]; + unsigned int fill; + int w = 64, h = 64, nbytes, org; + + if (argc < 3) { + fprintf(stderr, "usage: %s \n", argv[0]); + return 2; + } + fill = (unsigned int) strtoul(argv[2], NULL, 16); + org = argc > 3 ? atoi(argv[3]) : XieK_BandByPlane; + + dpy = XOpenDisplay(argv[1]); + if (!dpy) { fprintf(stderr, "cannot open %s\n", argv[1]); return 1; } + printf("display %s opened (root depth %d)\n", argv[1], + DefaultDepth(dpy, DefaultScreen(dpy))); + + lvl[0] = lvl[1] = lvl[2] = 2; + + img = XieCreateImage((unsigned long) w, (unsigned long) h, + XieK_PCM, (unsigned char) org, XieK_Bitonal, 1, lvl, + XieK_PP0, XieK_LP270); + if (!img) { fprintf(stderr, "XieCreateImage failed\n"); return 1; } + printf("image: org=%d w=%lu h=%lu levels=%lu,%lu,%lu arSize=%d\n", org, + Width_(img), Height_(img), CmpLvl_(img,0), CmpLvl_(img,1), + CmpLvl_(img,2), (int) uArSize_(img, 0)); + + if (!uBase_(img, 0)) { + nbytes = (int) uArSize_(img, 0); + if (nbytes <= 0) nbytes = (w + 7) / 8 * h; + uBase_(img, 0) = (unsigned char *) calloc(1, nbytes); + uArSize_(img, 0) = nbytes; + OwnData_(img) = 1; + } + nbytes = (int) uArSize_(img, 0); + printf("filling %d bytes with %02X\n", nbytes, fill); + memset(uBase_(img, 0), fill, nbytes); + + pm = XieCreatePhoto(dpy, XieK_Photomap, (unsigned long) w, (unsigned long) h, + XieK_Bitonal, 1, lvl, XieK_ZeroDark, 1.0, + XieK_BandByPlane, XieK_BandByPlane); + if (!pm) { fprintf(stderr, "XieCreatePhoto failed\n"); return 1; } + printf("photomap created\n"); + XSync(dpy, False); + + XiePutTile(pm, img, XieK_AllPlanes, 0, 0, 0, 0, + (unsigned long) w, (unsigned long) h); + XSync(dpy, False); + printf("put tile sent\n"); + fflush(stdout); + + swa.background_pixel = 0; + swa.event_mask = ExposureMask; + win = XCreateWindow(dpy, DefaultRootWindow(dpy), 150, 200, w, h, 0, + CopyFromParent, InputOutput, CopyFromParent, + CWBackPixel | CWEventMask, &swa); + XMapWindow(dpy, win); + XSync(dpy, False); + gc = XCreateGC(dpy, win, 0, NULL); + XSync(dpy, False); + + if (argc > 4 && atoi(argv[4]) == 9) { + /* control run: window mapped, NO export at all */ + printf("NO EXPORT (baseline)\n"); fflush(stdout); + readback(dpy, win, w, h, "window (no export)"); + } else if (argc > 4 && atoi(argv[4]) == 2) { + /* DEC's IDS pattern: crop element on the photomap, tap it, export the tap + * into a pixmap (ids_build_xie_pipe.c: XieTapFlo(XieCrop(Photo_,0),True)) */ + /* The photoflo must exist and the photomap be bound to it before the + * element chain can be built (crash without it: XieTapFlo derefs a + * flo link that XieCrop never set). */ + XiePhoto flo = XieCreatePhoto(dpy, XieK_Photoflo, (unsigned long) w, + (unsigned long) h, XieK_Bitonal, 1, lvl, + XieK_ZeroDark, 1.0, + XieK_BandByPlane, XieK_BandByPlane); + printf("photoflo=%lx\n", (unsigned long) flo); fflush(stdout); + XieBindMapToFlo(flo, pm); + XSync(dpy, False); + printf("bound map to flo\n"); fflush(stdout); + XiePhoto crop = XieCrop(flo, 0); + printf("crop=%lx\n", (unsigned long) crop); fflush(stdout); + XiePhoto tap = XieTapFlo(crop, 1); + printf("tap=%lx\n", (unsigned long) tap); fflush(stdout); + Pixmap px = XCreatePixmap(dpy, win, w, h, 1); + GC pgc = XCreateGC(dpy, px, 0, NULL); + XSync(dpy, False); + printf("crop=%lx tap=%lx\n", (unsigned long) crop, (unsigned long) tap); fflush(stdout); + XieExport(tap, px, pgc, 0, 0, 0, 0, w, h, 0, 0, 0.0, 0.0); + XSync(dpy, False); + printf("export sent (tap->pixmap)\n"); fflush(stdout); + XCopyArea(dpy, px, win, gc, 0, 0, w, h, 0, 0); + XSync(dpy, False); + printf("copyarea sent\n"); fflush(stdout); + } else if (argc > 4 && atoi(argv[4]) == 1) { + Pixmap pmap = XCreatePixmap(dpy, win, w, h, 1); + XSync(dpy, False); + printf("exporting to PIXMAP depth 1\n"); fflush(stdout); + /* Clear the pixmap to a known value so the readback is unambiguous. */ + XSetForeground(dpy, gc, 0L); + XFillRectangle(dpy, pmap, gc, 0, 0, w, h); + XSync(dpy, False); + readback(dpy, pmap, w, h, "pixmap after clear(=0)"); + XieExport(pm, pmap, gc, 0, 0, 0, 0, w, h, 0, + DefaultColormap(dpy, DefaultScreen(dpy)), 0.0, 0.0); + XSync(dpy, False); + printf("export sent (pixmap)\n"); fflush(stdout); + readback(dpy, pmap, w, h, "pixmap after export"); + readback(dpy, win, w, h, "window before copy"); + XCopyArea(dpy, pmap, win, gc, 0, 0, w, h, 0, 0); + XSync(dpy, False); + printf("copyarea sent\n"); fflush(stdout); + readback(dpy, win, w, h, "window after copy"); + } else { + XieExport(pm, win, gc, 0, 0, 0, 0, w, h, 0, + DefaultColormap(dpy, DefaultScreen(dpy)), 0.0, 0.0); + XSync(dpy, False); + printf("export sent (with colormap)\n"); + readback(dpy, win, w, h, "window after direct export"); + } + fflush(stdout); + + sleep(6); + XCloseDisplay(dpy); + return 0; +} diff --git a/xie/docs/dec/DECimage-1200-install-use-EK-V120I-IN-001.pdf b/xie/docs/dec/DECimage-1200-install-use-EK-V120I-IN-001.pdf new file mode 100644 index 0000000..1b11256 Binary files /dev/null and b/xie/docs/dec/DECimage-1200-install-use-EK-V120I-IN-001.pdf differ diff --git a/xie/docs/dec/DECimage-1200-install-use-EK-V120I-IN-001.txt b/xie/docs/dec/DECimage-1200-install-use-EK-V120I-IN-001.txt new file mode 100644 index 0000000..52e1fb9 --- /dev/null +++ b/xie/docs/dec/DECimage-1200-install-use-EK-V120I-IN-001.txt @@ -0,0 +1,1509 @@ +Installing and Using +The DECimage 1200 +Video Terminal +Order Number EK–V120I–IN–001 + + + + +Digital Equipment Corporation + First Edition, February 1991 + +The information in this document is subject to change without notice and should not +be construed as a commitment by Digital Equipment Corporation. Digital Equipment +Corporation assumes no responsibility for any errors that may appear in this document. + +The software described in this document is furnished under a license and may be used or +copied only in accordance with the terms of such license. + +No responsibility is assumed for the use or reliability of software on equipment that is not +supplied by Digital Equipment Corporation or its affiliated companies. + +Restricted Rights: Use, duplication, or disclosure by the U. S. Government is subject to +restrictions as set forth in subparagraph ( c ) ( 1 ) ( ii ) of the Rights in Technical Data +and Computer Software clause at DFARS 252.227–7013. + +Copyright © by Digital Equipment Corporation 1991 + +All Rights Reserved. +Printed in Taiwan. + +FCC NOTICE: The equipment described in this manual generates, uses, and may emit +radio frequency energy. The equipment has been type tested and found to comply with +the limits for a Class A computing device pursuant to Subpart J of Part 15 of FCC +Rules, which are designed to provide reasonable protection against such radio frequency +interference when operated in a commercial environment. Operation of this equipment in +a residential area may cause interference, in which case the user at his own expense may +be required to take measures to correct the interference. + +The following are trademarks of Digital Equipment Corporation: DECimage, DECwindows, +LAT, PDP, ThinWire, ULTRIX, VMS, VT, VT1000, VT1200, and the DIGITAL logo. + +UNIX is a registered trademark of UNIX System Laboratories. + + +This document was prepared and published by Educational Services Development and +Publishing, Digital Equipment Corporation. + Contents + +About This Guide v + + +1 A Look at Your Video Terminal +Imaging and the DECimage 1200 Terminal . . . . . . . . . . . . . . . . . . . 2 +XIE Software on the DECimage 1200 Terminal . . . . . . . . . . . . . . . . 2 +Differences Between the DECimage 1200 and VT1200 Terminals . . 2 + + +2 Installing Your Video Terminal +Site Preparation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 +Unpacking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 +Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 +Verifying the Memory Installation . . . . . . . . . . . . . . . . . . . . . . . . . . 10 + + +3 Installing Optional Memory +Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 + + +4 Upgrading to a DECimage 1200 Terminal +Unpacking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 +Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 +Verifying the Memory Installation . . . . . . . . . . . . . . . . . . . . . . . . . . 22 + + + + + iii + iv Contents + + + +5 Improving Hard-to-Read Images +How Does the Terminal Display an Image? . . . . . . . . . . . . . . . . . . . 23 +How Can You Improve an Image? . . . . . . . . . . . . . . . . . . . . . . . . . . 24 +Displaying the Customize Image Dialog Box . . . . . . . . . . . . . . . . . . 25 +Customizing the Image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 + + +6 Solving Problems + +A Specifications +Site Planning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 +Display . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 + + +B Options and Documentation +Related Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 + + +C X Window Image Extensions +The XIE Subset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 + Pipelines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 + Decompression Constraints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 + Scaling Constraints of the XIE Server . . . . . . . . . . . . . . . . . . . . . 35 + XCopyArea and XCopyPlane Constraint . . . . . . . . . . . . . . . . . . . 35 +XIE Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 + + +Tables +C–1 XIE Functions in the DECimage 1200 Terminal . . . . . . . . . . 36 + About This Guide + + +This guide describes how to: +• Install your DECimage 1200 video display terminal. +• Upgrade your VT1000 terminal or VT1200 terminal to a DECimage + 1200 terminal. +The guide is a supplement to: + Installing and Using the VT1200 Video Terminal + +Who Should Use This Guide +This guide is for the installer and general user of the DECimage 1200 +video terminal. + +Organization +This guide contains the following chapters and appendices: +• Chapter 1, ‘‘A Look at Your Video Terminal,’’ provides an overview of + the DECimage 1200 terminal and lists the differences between the + DECimage 1200 terminal and the VT1200 terminal. +• Chapter 2, ‘‘Installing Your Video Terminal,’’ describes how to install + your terminal. +• Chapter 3, ‘‘Installing Optional Memory,’’ describes how to install + additional memory. +• Chapter 4, ‘‘Upgrading to a DECimage 1200 Terminal,’’ describes + how to upgrade a VT1000 or VT1200 terminal to a DECimage 1200 + terminal. +• Chapter 5, ‘‘Improving Hard-to-Read Images,’’ describes how to use + the Customize Image dialog box to improve images that are hard to + read on the screen. + v + vi About This Guide + + + +• Chapter 6, ‘‘Solving Problems,’’ describes how to solve operating + problems, including basic X window image extension (XIE) protocol + problems. +• Appendix A, ‘‘Specifications,’’ lists DECimage 1200 specifications. +• Appendix B, ‘‘Options and Documentation,’’ lists options, related + documentation, and ordering information. +• Appendix C, ‘‘X Window Image Extensions,’’ describes the DECimage + 1200 implementation of the XIE protocol. + +Conventions +The following conventions are used in this guide: + + + lO Keys or switches that are labeled appear in a box . + Example: Press the Return key. +Ctrl key For Ctrl key sequences, hold down Ctrl and press the other + key. +Warnings Provide information to prevent personal injury. +Cautions Provide information to prevent damage to equipment or + software. +Notes Provide general information about the current topic. + 1 + 1 + A Look at Your Video Terminal + + +This chapter introduces you to the DECimage 1200 video display terminal. +Refer to Installing and Using the VT1200 Video Terminal for a complete +description of the DECimage 1200 terminal, except for the differences +described in this guide. + + + + + Keyboard + LEDs + + + + + GSF_0837_89A.DG + MA-0248-90.DG + + + + + 1 + 2 A Look at Your Video Terminal + + + +Imaging and the DECimage 1200 Terminal +The DECimage 1200 terminal lets you run X window applications on +your computer system, including Digital’s DECwindows software and X +window image extensions (XIE) software. The imaging features allow +the terminal to send compressed image files to the server and to display +image information faster. +From the DECimage 1200 Terminal Manager window, you can display +a Customize Image dialog box with features to improve images that are +hard to read on the screen (Chapter 5). + +XIE Software on the DECimage 1200 Terminal +The DECimage 1200 terminal has an XIE server that lets the terminal +run XIE applications. XIE applications let the terminal display images +quickly by decompressing, scaling, and rotating data. See Appendix C for +a description of XIE routines, their functions, and restrictions. + +Differences Between the DECimage 1200 and +VT1200 Terminals +There are only two physical components that make the DECimage 1200 +terminal different from the VT1200 terminal. + +The DECimage 1200 uses ... While the VT1200 uses ... + +an image board with connectors for a RAM board with connectors for +optional memory. optional memory. +a ROM board with imaging software. a ROM board without imaging + software. + 22 + Installing Your Video Terminal + + +This chapter explains how to install a new DECimage 1200 terminal. The +chapter provides step-by-step instructions on how to: + Prepare for installation. + Unpack, inspect, and check the terminal’s components. + Connect your terminal’s monitor, mouse, and keyboard. + Connect a printer, modem, or tablet to the terminal. + Connect your terminal to a network. + Turn on your terminal. + +NOTE +If you are upgrading your terminal to a DECimage 1200 terminal, +go to Chapter 4. + +Site Preparation +Before you install your DECimage 1200 terminal, make sure your +computer system has the necessary network hardware and system +software to support the terminal. See your system manager to ensure +these requirements are met. + +For System Managers +System managers need to prepare the computer system for use with +the terminal. Refer to the ‘‘System Management Tasks’’ appendix in the +Installing and Using the VT1200 Video Terminal guide for a description of +the required tasks. + + + + + 3 + 4 Installing Your Video Terminal + + + +Network Hardware Support +The DECimage 1200 terminal requires one of the following physical +connections to connect to a host computer system: + +ThinWire Lets the terminal operate with X window applications and +connector multiple text terminal sessions, using either the LAT or TCP/IP + network protocol. You must use the ThinWire connector to operate + with X window or DECwindows software. +Serial Lets the terminal connect to a single host or terminal server as a +line traditional text terminal. + +System Software Support +The following table summarizes the system resources needed to open X +window sessions or video terminal (VTE) sessions: + + Operating Communication +Operation System Protocol + +Video terminal session VMS Version 4.0 or LAT + higher + + + + UNIX (any Berkeley TELNET (TCP/IP) + (BSD) compliant version) + + + + ULTRIX (any version) TELNET (TCP/IP) + + + +X window session VMS Version 5.3-1 or LAT + higher + + + + UNIX (any version) TELNET (TCP/IP) + + + + UWS Version 2.2 TELNET (TCP/IP) + (includes ULTRIX + Version 3.1) or higher + Installing Your Video Terminal 5 + + + +Selecting a Location +Use the following guidelines to select a good location for your terminal: +• Select a surface area that is large enough to hold your system box, + monitor, keyboard, and mouse. +• Place your monitor so that the top line of the monitor display is at eye + level. +• To avoid screen glare, select a place where bright light will not reflect + off the monitor. +• Do not block the air vents on the sides of the system box or place the + system box on its side. Blocking the air vents can cause the system to + overheat. +• Keep the area clean. Do not place food or liquid on or near your + terminal. +• Keep the temperature between 10° and 40° C (50° and 104° F), and + the relative humidity between 10% and 95%. +• Keep the air well circulated, to prevent excess heat and dust from + accumulating. +• Keep your terminal away from heaters, photocopiers, direct sunlight, + and abrasive particles. + 6 Installing Your Video Terminal + + + +Unpacking + +Unpack and check the contents of each carton. +Make sure you have all the items shown in the following figure. Carefully +inspect the components for shipping damage. If you have any missing or +damaged items, contact your sales representative and delivery agent. + +WARNING +If necessary, use two people to lift or move the monitor out of the +shipping carton. Approximate monitor weights: +• VR315 monitor (380 mm/15 inch): 13 kg (29 lb) +• VR319 monitor (480 mm/19 inch): 27 kg (60 lb) +• VRE01 monitor (480 mm/19 inch): 7 kg (15 lb) + +DECimage 1200 Parts Checklist +1 Monitor: VR319 (shown), VR315, or VRE01 +2 Power cord for the monitor +3 Monitor installation guide +4 System box +5 Power cord for the system box +6 Mouse +7 DEC-423 communication cable with EIA adapter (6-pin to 25-pin) attached +8 Monitor cable +9 Keyboard and legend strip +10 Ethernet cable and connector +11 Installing and Using the DECimage 1200 Video Terminal +12 Installing and Using the VT1200 Video Terminal +13 Rear dress panel +Optional +14 SIMM memory card(s) + +NOTE +If you receive three power cords (a short one and two long ones), +the second long power cord is not needed for this installation. + Installing Your Video Terminal 7 + + + + + 1 2 3 + + + TM + + + + + 4 5 6 + + TM + + + + + tal + di gi + + + + + 7 8 9 10 + + + + + 11 12 13 14 + + + + + GSF_0822_89.DG + MA-0249-90.DG + + + + +Installation + +Install any optional memory first. +If you ordered optional memory for your terminal, go to Chapter 3. You +should install the memory cards in the system box before proceeding. + 8 Installing Your Video Terminal + + + +Connect the cables to the system box. +Perform the following steps to connect cables and set the monitor selection +switch on the rear of the system box. The steps are keyed to the figure. + + + + 1 + + 2 + 3 + 4 + 234 + 1 + 5 + 5 + 6 6 + 7 + + + + + MA-0667-90.DG + + + + +Step Action + +1 Connect one end of the monitor cable to the monitor and the other end to + the system box. + If you have a VRE01 monitor, attach the cable-holding fixture to the rear + of the monitor before connecting the cable. +2 Set the monitor selection switch to match your monitor. + VR319 = 2 VR315 = 5 VRE01 = 3 +3 Connect the mouse or graphics tablet to the system box. +4 Connect the keyboard to the system box. +5 Serial printer port: If you have a printer or secondary host computer, + connect the printer or host to the system box. +6 Serial host port: If you have a primary host computer or terminal server, + connect the host or server to the system box. +7 Connect the ThinWire Ethernet connector to the system box. Connect the + other end to your local area network. + Installing Your Video Terminal 9 + + + + + 234 + 1 5 + 6 + + + + + 8 + 9 + 11 + + + + + 10 + + + MA-0668-90.DG + + + + +Step Action + +8 Make sure the l O power switches on the monitor and system box are + off (O). Then connect the long power cord from the system box to the wall + outlet. +9 Connect the short power cord from the monitor to the system box. +10 Route all cables under the dress panel. Push the dress panel onto the + system box. +11 Turn the monitor’s l O power switch on by pressing ( | ). Turn the + system box’s l O power switch on by pressing ( | ). + + NOTE + If the screen appears snowy, the monitor selection switch may be + set to the wrong position. Set the monitor selection switch to the + correct setting, then turn the system box’s l O power switch off + and on again. + The keyboard sounds a bell tone, and a pie graph displayed on the + monitor gradually fills in as the terminal performs its self-tests. + When the tests are done, the keyboard bell tone sounds again and the + Terminal Manager window appears. + +This is a good time to set the brightness, contrast, and viewing angle of +your monitor. See your monitor’s installation guide for instructions. +If you installed optional memory cards, go to the next section to verify the +memory installation. + 10 Installing Your Video Terminal + + + +Verifying the Memory Installation +After you power up the monitor and system box, the Terminal Manager +window should appear on your screen. +Verify that the number on the right side of the Memory Remaining scale +displays the correct number of megabytes in your system. +Standard + Optional = Number Displayed +2 megabytes 1 megabyte 3M + 2 megabytes 4M + +The installation procedure is complete. +Refer to Installing and Using the VT1200 Video Terminal to learn how to +use your DECimage 1200 terminal. + +NOTE +If you had problems with the installation, review the installation +steps carefully. If the problem continues, refer to the ‘‘Solving +Problems’’ chapter in Installing and Using the VT1200 Video +Terminal. + 33 + Installing Optional Memory + + +This chapter describes how to install optional SIMM memory cards onto +the image board. +The terminal comes with 2 megabytes of RAM memory. You can add +1 or 2 more megabytes of optional RAM memory, for a total of up to 4 +megabytes. Optional memory comes on 1-megabyte single in-line memory +module (SIMM) cards. You install the SIMM cards on the terminal’s +image board. + +Installation +Use a grounding wrist strap and an antistatic mat to perform the +installation, if available. Otherwise, frequently touch the metal chassis +of the system box during installation, to neutralize any existing static +charges. + +If you are installing the terminal, go to the next page. +If the terminal is already installed, perform these steps first. +Step Action + +1 Turn the system box’s l O power switch off (O). +2 Turn the monitor’s l O power switch off (O). +3 Disconnect the two power cords from the rear of the system box. +4 Disconnect the monitor video cable from the rear of the system box. +5 Remove the monitor from the top of the system box. You may need two + people. + + + + + 11 + 12 Installing Optional Memory + + + +Install the SIMM cards. +Step Action + +1 Remove the system box cover. + • Release the top cover of the system box by pressing in the two push + tabs on the side of the box, as shown. + • Slowly lift the top cover until you release the hinges on the other side + of the box. Then lift the top cover completely off the system box. + + + + + 234 + 1 5 + 6 + + + + + 22% + + GSF_0839_89.DG + MA-0251-90.DG + Installing Optional Memory 13 + + + +Step Action + +2 Remove the image board from the system box. + + CAUTION + The image board and the SIMM cards can be damaged by + electrostatic discharge. Handle the image board by its cover + or strap. Avoid contact with any components or circuitry within + the system box. + • Release three standoff clips ( 1 , 2 , 3 ) by gently pushing each clip + away from the image board and lifting up on the edges of the board. + • Hold the short strap on the image board and gently pull up to loosen + the board from the standoffs. + • Release the other three standoff clips ( 4 , 5 , 6 ) by gently pushing + each clip away from the image board and lifting up on the edges of + the board. + • Grasp the long strap of the image board and pull up firmly to release + the image board connector from the system logic board. + • Place the board on top of the power supply’s metal cover, with the + strap side down. You will use the metal cover as a work surface to + perform the SIMM card installation. + + + + + 38% + + + + + 6 + 5 + + 1 + 4 + + + + + 234 + 1 5 + 6 + + + + + 3 + 2 + + + + + GSF_1362_89.DG + 22% MA-0252-90.DG + 14 Installing Optional Memory + + + +Step Action + +3 Install the SIMM cards on the image board. + + CAUTION + SIMM cards can be damaged by electrostatic discharge. Handle a + card by its edges and avoid contact with the gold fingers on the + card. + Remove the SIMM cards from the shipping bag and place them on top of + the power supply’s metal cover. This prevents electrostatic damage. + Install the first SIMM card in the connector labeled 2MB, the second + SIMM in 3MB, and the last SIMM in 4MB. + • Insert the SIMM card into the connector at a 45-degree angle. Face + the components on the SIMM card toward the components on the + image board. Line up the center key slot on the SIMM card with the + connector key on the image board. + • Push down on the top of the card to seat it in the connector. + • Raise the SIMM card into a standup position, until both sides of the + card lock into the connector tabs. + + + + + 2M + B + 3M + B + + + 2MB + MA-0508-90.DG + + + + + To remove the SIMM card: Gently push outward on the tabs at the + sides of the connector. Tilt the SIMM card toward the edge of the image + board at a 45-degree angle. Grasp the edges of the SIMM card firmly and + lift the card out of the connector. + Installing Optional Memory 15 + + + +Step Action + +4 Install the image board back into the system box. + • Grasp both straps of the image board. + • Carefully place the board on top of its connector and standoffs. Use + the standoffs as guides to align the connector on the board with the + connector in the system box. + • Press down firmly on the wide end of the board to seat the connector. + Then, press down on the edges of the board to lock each of the six + standoff clips. + +5 Install the system box cover. +6 Place the monitor on top of the system box. Leave enough room at the + rear of the system box and monitor to connect cables. + +WARNING +If necessary, use two people to lift or move the monitor. +7 Go back to Chapter 2, to connect the cables to the system box and verify + the memory installation. + 4 +4 +Upgrading to a DECimage 1200 Terminal + +This chapter provides the procedure to upgrade your terminal to a +DECimage 1200 terminal. + +CAUTION +The image board and the SIMM cards can be damaged by +electrostatic discharge. Handle the image board by its cover +or strap. Avoid contact with any components or circuitry within +the system box. + +Unpacking + +Unpack and check the contents of each carton. +1 Standoffs: 2 keyed and 1 unkeyed +2 Installing and Using the DECimage 1200 Video Terminal +3 Image board +4 ROM board +5 Optional: SIMM memory card(s) + + + + +16 + Upgrading to a DECimage 1200 Terminal 17 + + +1 2 + + + + +3 + + + + +4 + + + + +5 + + + + + GSF_1598_89.DG + MA-0255-90.DG + 18 Upgrading to a DECimage 1200 Terminal + + + +Installation +If you are unfamiliar with the connectors on the terminal’s system box, +refer to the figures in Chapter 2. +Use a grounding wrist strap and an antistatic mat to perform the +installation, if available. Otherwise, frequently touch the metal chassis +of the system box during installation, to neutralize any existing static +charges. + +Turn off power, disconnect cables, and open the system box. +Step Action + +1 Turn the system box’s l O power switch off (O). +2 Turn the monitor’s l O power switch off (O). +3 Disconnect the two power cords from the rear of the system box. +4 Disconnect the monitor video cable from the rear of the system box. +5 Remove the monitor from the top of the system box. You may need two + people. +6 Remove the system box cover. + + + + + 234 + 1 5 + 6 + + + + + 22% + + GSF_0839_89.DG + MA-0251-90.DG + Upgrading to a DECimage 1200 Terminal 19 + + + +Remove the RAM controller board and check for SIMM cards. +If your terminal does not have a RAM controller board 1 , go to the next +page. + +Step Action + +1 Release the standoff clips on the RAM board 1 and remove the board by + firmly lifting up on its strap. +2 Turn the RAM board over and check if one or more SIMM cards 2 are + installed. If any SIMM cards are installed, remove them as follows: + Gently push outward on the tabs at the sides of the connector. Tilt the + SIMM card toward the edge of the RAM board at a 45-degree angle. Grasp + the edges of the SIMM card firmly and lift the card out of the connector. + Next, you will install the SIMM cards on the image board. + + + + + 1 + + + + 2 + + + + + MA-0808-90.DG + 20 Upgrading to a DECimage 1200 Terminal + + + +Install SIMM cards on the image board. +If you are not installing SIMM cards, go to the next page. If you ordered +optional SIMM cards or removed SIMM cards from the RAM controller +board, install them on the image board. + +CAUTION +SIMM cards can be damaged by electrostatic discharge. Handle a +card by its edges and avoid contact with the gold fingers on the +card. + +Step Action + +1 Remove the SIMM cards from the shipping bag and place them on top of + the power supply’s metal cover. This prevents electrostatic damage. +2 Install the first SIMM card in the connector labeled 2MB, the second + SIMM in 3MB, and the last SIMM in 4MB. + • Insert the SIMM card into the connector at a 45-degree angle. Face + the components on the SIMM card toward the components on the + image board. Line up the center key slot on the SIMM card with the + connector key on the image board. + • Push down on the top of the card to seat it in the connector. + • Raise the SIMM card into a standup position, until both sides of the + card lock into the connector tabs. + + + + + 2M + B + 3M + B + + + 2MB + MA-0508-90.DG + + + + + To remove the SIMM card: Gently push outward on the tabs at the + sides of the connector. Tilt the SIMM card toward the edge of the image + board at a 45-degree angle. Grasp the edges of the SIMM card firmly and + lift the card out of the connector. + Upgrading to a DECimage 1200 Terminal 21 + + + +Install the image board in the system box. +Step Action + +1 Firmly bend and twist the standoff 1 to break it and remove it. It is + normal for the broken piece to remain inside the system box. +2 Install three new standoffs to support the image board: 2 is unkeyed and + 3 and 4 are keyed. + +3 Grasp both straps of the image board. +4 Carefully place the board on top of its connector and standoffs. Use the + standoffs as guides to align the connector on the board with the connector + in the system box. +5 Press down firmly on the wide end of the board to seat the connector. Then + press down on the edges of the board to lock each of the six standoff clips. + + +CAUTION +Pressing too hard on the narrow end of the image board may +damage the board. + + + + + 1 + + + + + 38% + + + + + 234 + 1 5 + 6 + + + + 4 + + 3 + + 2 + + + + 22% + + GSF_1362_89.DG + MA-0254-90.DG + 22 Upgrading to a DECimage 1200 Terminal + + + +Install the new ROM board and verify the installation. +Step Action + +1 The ROM board is next to the image board. Remove the old ROM board + from the system box by releasing the board’s standoff clips and pulling up + firmly on the board’s strap. +2 Unpack the new ROM board and install it in the system box. Align the + board with its connector, press firmly in place, and lock the standoff clips. +3 Install the system box cover. +4 Reconnect all cables to the monitor and the system box. +5 Turn on the power switches on the system box and monitor. + +NOTE +If the screen appears snowy, the monitor selection switch may be set to +the wrong position. To correct the problem, change the monitor selection +switch setting and turn the system box power off and on again. +6 Go to the next section to verify the memory installation. + + +Verifying the Memory Installation +After you power up the monitor and system box, the Terminal Manager +window should appear on your screen. +Verify that the number on the right side of the Memory Remaining scale +displays the correct number of megabytes in your system. +Standard + Optional = Number Displayed +2 megabytes 1 megabyte 3M + 2 megabytes 4M + +The installation procedure is complete. +Continue to refer to your VT1000 or VT1200 Installing and Using ... +guide for information on using your DECimage 1200 terminal. + +NOTE +If you had problems with the installation, review the installation +steps carefully. If the problem continues, refer to the ‘‘Solving +Problems’’ chapter in your VT1000 or VT1200 Installing and Using +... guide. + 5 + 5 + Improving Hard-to-Read Images + +This chapter describes how to improve images that are hard to read on +the screen. For example, you may have scanned-in images that are too +light or dark, streaked, or smudged. You can use the Customize Image +dialog box to improve the image currently displayed on the screen. + +NOTE +Before using the dialog box, make sure you set the brightness and +contrast controls on your monitor. See your monitor’s installation +guide for instructions. + +How Does the Terminal Display an Image? +Your terminal displays text characters and graphic images as a series of +dots (pixels) on the monitor’s screen. The terminal reads the information +for each dot from the image’s source file. A typical source file for a +printable document stores images at a resolution of 200 or 300 dots/inch. +The terminal displays images at a resolution of approximately +100 dots/inch. Terminals and monitors generally have a lower resolution +than printers. +As a result, images that are flawed in the source file may be unreadable +when displayed. For example, suppose you have a document with a +broken E character. The character may be readable in the source file, but +unreadable when the terminal displays it on the monitor’s screen. + + + + + 23 + 24 Improving Hard-to-Read Images + + + + + Stored Displayed + + + + + 300 dots/inch 100 dots/inch + + The terminal stores all The terminal displays + recognized dots. one out of three dots + stored. + + LJ−00046−RAGS + + + +How Can You Improve an Image? +If an image in a source file is imperfect or incomplete, you can improve +the displayed image by changing its brightness and contrast values. For +example, you may be able to improve broken characters enough so they +are readable on the screen, by applying brightness or contrast values that +fill in the characters. +When you adjust the brightness and contrast values of an image, the +terminal recalculates the darkness level (black or white) of the displayed +dots that make up the image. + Improving Hard-to-Read Images 25 + + + +Displaying the Customize Image Dialog Box +To display the Customize Image dialog box, choose the Image menu item +from the Terminal Manager’s Customize menu. +1. Point to the Customize menu name in the Terminal Manager’s menu + bar. Click and hold MB1 to pull down the Customize menu. + + + + + LJ−00043−RAGS + +2. Drag the pointer down to the Image... menu item. Release MB1 to + display the Customize Image dialog box. + The values on the Brightness and Contrast scales represent the + last adjustments you made to an image and saved in the terminal’s + memory. There are two ways to save adjustments: + • Click on the OK or Apply button in the Customize Image dialog + box + • Choose the Save Current Settings menu item on the Customize + menu in the Terminal Manager window. + 26 Improving Hard-to-Read Images + + + + The terminal saves your settings in nonvolatile random access + memory (NVR). If you did not save any values, the terminal displays + the image with the values at 0. + + + + + LJ−00044−RAGS + + +Adjust +Normally, this option is disabled so the terminal can calculate its own +brightness and contrast values for the displayed image. If you want to +change the brightness or contrast values, click on the Enable button. +Default: Disable + +NOTE +Remember to click on the Disable button before the OK button to +close the Customize Image dialog box. If you leave Adjust enabled, +the terminal may display other images with poor quality. + +Brightness +This slide bar controls the density of the image on the screen. +Moving the brightness scale to the right darkens the characters and lines +in the image. + Improving Hard-to-Read Images 27 + + + +The effect is reversed for applications that display light text on a dark +background. +Default: The last values saved in the Customize Image dialog box. + +Contrast +This slide bar controls the area of dots that are changed by the Brightness +slide bar. +For example, if you set the Contrast slide bar and then move the +Brightness slide bar to the right, selected areas of the image become +darker and thicker. +Moving the Contrast slide bar to the right causes detailed characters and +lines to merge. It also causes more background data to appear in the +displayed image. +Default: The last values saved in the Customize Image dialog box. + +Customizing the Image +Most hard-to-read images have broken characters or a smudged +background. + +NOTE +You can make the greatest changes to the image by making small +adjustments at the ends of the Brightness and Contrast scales. + +Improving Images with Broken Characters +You can improve images with incomplete characters by making +adjustments to the Brightness and Contrast scales. +1. Display the image you want to adjust. +2. Click on the Enable button in the Customize Image dialog box. +3. Click on the Brightness scale pointer and drag the pointer to the right + of center, closer to the right end of the scale. +4. Click on the Apply button in the Customize Image dialog box. +5. Redisplay the changed image from your application. Note how the + new value changed the image. +6. Continue to make adjustments—moving the Brightness scale, clicking + on Apply, and redisplaying the changed image—until you are + satisfied with the results. The Contrast scale setting should be greater + than 0 and closer to the left end of the scale. + 28 Improving Hard-to-Read Images + + + +7. After you finish customizing images, click on the Disable button + before you click on Apply. This allows the terminal to calculate the + brightness and contrast values of images. + +Improving Images with Smudged Backgrounds +You can improve images that have smudged backgrounds or smudge +marks by adjusting the Brightness and Contrast scales together. +1. Display the image you want to adjust. +2. Click on the Enable button in the Customize Image dialog box. +3. Click on the Brightness scale pointer and drag the pointer to the left + of center. +4. Click on the Contrast scale pointer and drag the pointer closer to the + left end of the scale. +5. Click on the Apply button in the Customize Image dialog box. +6. Redisplay the changed image from your application. Note how the + new values changed the image. +7. Repeat these steps if necessary, making small adjustments until the + image is easy to read. +8. After you finish customizing images, click on the Disable button + before you click on Apply. This allows the terminal to calculate the + brightness and contrast values of images. + 6 + 6 + Solving Problems + +This chapter describes image display problems and solutions, for operators +and programmers. +For other operating problems, see the ‘‘Solving Problems’’ chapter in +Installing and Using the VT1200 Video Terminal. + +Symptom Suggested Solution + +Display Problems: Operator-Related + +The screen appears snowy. Set the monitor selection switch to the correct + position. + 1. Turn the system box’s l O power switch off + (O). + 2. Turn the monitor selection switch setting + on the rear of the system box to the correct + position (Chapter 2). + 3. Turn the system box’s l O power switch on + ( | ). + +The power-up diagnostics Replace the ROM board with an image ROM +are unsuccessful, and the board. +pie graph is distorted. +The displayed image is Check the image board by running the power-up +incomplete. diagnostics. Turn the system box’s l O power + switch off (O) and on ( | ). Report the error on + the screen to Digital Customer Services. + + + + + 29 + 30 Solving Problems + + + +Symptom Suggested Solution + +Display Problems: Operator-Related + +Different images have The Adjust button in the Customize Image +different display qualities, dialog box is enabled. Click on Disable to allow +or the quality changes when the terminal to calculate the brightness and +the application changes the contrast values of the image. +image size. +The terminal stops The terminal ran out of memory. Turn the system +operating or displays error box’s l O power switch off (O) and on ( | ) to +code 28 on the screen. recover. + Use fewer windows. + + +Display Problems: Programmer-Related + +The client receives a Bad Do not invoke an XIE request that is not +Request X error. implemented. +The client receives a Bad Do not invoke an XIE protocol request that is +Request or Bad Match or implemented, but violates its restricted use. This +Bad Value X error. includes attempts to: + • Create non-bitonal image objects. + • Transport from the server to the client. + • Transport DCT compressed data. + +The client receives a Bad Ensure that the parameters passed to the +Match or Bad Value X protocol requests function are properly coded +error. and within range limits. +The client receives a Alloc Use less server resources when the XIE request +X error. generating the error is invoked. For example, + reduce the number of windows, the number of + images in the server, and so on. +No image or a partial image Ensure that the transported image is properly +is displayed. coded by verifying the content of the image file at + the client and verifying the client application. + Solving Problems 31 + + + +Symptom Suggested Solution + +Display Problems: Programmer-Related + + Check the image board by running the power-up + diagnostics. Turn the system box’s l O power + switch off (O) and on ( | ). + Report the error on the screen to Digital + Customer Services. + A +A +Specifications + +This appendix lists site planning specifications for the VR315 and VR319 +monitors. Refer to the ‘‘Specifications’’ appendix in the Installing and +Using the VT1200 Video Terminal guide for additional information. + +Site Planning + Weight Height Width Depth +VR315 monitor 13 kg 400 mm 400 mm 395 mm + (29 lb) (15.7 in) (15.7 in) (15.4 in) +VR319 monitor 27.2 kg 457 mm 495 mm 452 mm + (60 lb) (18 in) (19.5 in) (17.8 in) + + +Display +VR315 CRT 380 mm (15 inch) monochrome screen + resolution 100 dots/inch +VR319 CRT 485 mm (19 inch) monochrome screen + resolution 100 dots/inch + + + + +32 + B + B + Options and Documentation + +This appendix lists the manuals related to the DECimage 1200 video +terminal. Refer to the ‘‘Options and Documentation’’ appendix in the +Installing and Using the VT1200 Video Terminal guide for a listing and +ordering information for options, modems, cables, and other manuals. + +Related Documentation +You can order the following related documents from Digital: +DEC Image Utility Library Programmer Reference Manual AA-PG62B-TE +Provides programmers with information on how to use +software routines to manipulate an image in an X window +image extension (XIE) environment. +DEC Image Utility Library for VMS Installation Guide AA-PG63B-TE +DEC Image Utility Library for ULTRIX Installation Guide AA-PG8AA-TK +Provides installers with information to install the Image +Utility Library on VMS systems or ULTRIX systems. +VT1000 / VT1200 / DECimage 1200 Service Guide EK–V1000–SV +Provides qualified service personnel with information +to troubleshoot and repair the VT1000, VT1200, and +DECimage 1200 terminals. +VR315 Monitor Service Guide EK–VR315–SV +Provides qualified service personnel with information to +troubleshoot and repair the VR315 monitor. +VR319 Monitor Service Guide EK–VR319–SV +Provides qualified service personnel with information to +troubleshoot and repair the VR319 monitor. +VRE01 Service Guide EK–VRE01–SV +Provides qualified service personnel with information to +troubleshoot and repair the VRE01 flat panel display. + + + + + 33 + C +C +X Window Image Extensions + +The DECimage 1200 terminal includes X window image extensions (XIE), +an extension to the DECwindows server. With XIE: +• The terminal can handle compressed images for display. +• The server can manipulate the images while accepting user input and + client-based application programs. +The XIE server for the terminal uses a subset of the XIE protocol to +display document-size, bitonal images only. + +The XIE Subset +Table C–1 lists the XIE requests that the terminal supports. When you +use XIE requests in programs, you must obey the following rules and +restrictions so your program will be compatible with the XIE server. + +Pipelines +Always use pipelines to display images on the terminal. +XIE uses process control services, known as pipelines, to allow a client +to create and execute linear, macro-like assemblies of protocol primitives. +Pipelining is a single threaded list of XIE protocol functions through +which image data flows sequentially. +When you construct pipelines for the terminal, the following restrictions +apply: +• Pipeline definitions + — Must use the following functions only: scale, crop, rotate, mirror, + and export. + — Must not have more than one scale, crop, rotate, mirror, and + export function. + — Must always end with the export function. +34 + X Window Image Extensions 35 + + + + — Prefer the following order: scale, crop, rotate, mirror, and export. + — Must be limited to 15 pipeline definitions at one time. +• After you display an image, free the resources used by the rendered + image. Also, rerender from the transported image, if necessary. +• Specify a request to rotate as 0, 90, 180, or 270 degrees only. +• Specify the width and height to be 0, or to match the width and height + of the rotated source image. XIE ignores other values. +• Specify the XIEP_TAP_PHOTOFLO request after the creation of the + photoflo, which is when no elements are added to the pipeline. XIE + ignores other taps. + +Decompression Constraints +XIE limits image decompression to CCITT Group 3 and 4 images with +scaling widths of less than or equal to 32768 pixels. CCITT is the Comitè +Consultatif International de Télégraphique et Téléphonique, a standards +committee for the communication industry in Europe. + +Scaling Constraints of the XIE Server +The server may adjust the scale factors used by the image board from +those specified in the XIEP_SCALE request. Any adjustment will be close +to the specified scale, but will not exceed the specified scale. +The server restricts the scale factors because of the word size of the image +  +accelerator. To scale A pixels to B pixels, find the corresponding M and + +     +N, respectively, that satisfy the following constraints. should be as +close as possible to , without exceeding . +• When scaling down        , the constraints are +      "!# +• When scaling up  +   $   % , the constraints are + & '   ( )!* +XCopyArea and XCopyPlane Constraint +When displaying an image by copying from a pixmap to a partially +occluded window using XCopyArea or XCopyPlane, Xie may display +some or all of the image in reverse video in the window that is partially +occluded. You can correct the video sense of the image by removing the +occlusion and causing the image to be displayed again. + 36 X Window Image Extensions + + + +XIE Functions +Table C–1 describes the XIE functions that the terminal supports. The +table also describes restrictions for each function. + +Table C–1 XIE Functions in the DECimage 1200 Terminal +Session Services Description + +XIEP_INIT_SESSION Begins a client-extension server session. + Restrictions: None. +XIEP_SET_OP_DEFAULTS Establishes or modifies operational defaults. + Restrictions: Bits/pixel parameter value + must be 1. +XIEP_QUERY_OP_DEFAULTS Queries operational defaults. + Restrictions: None. +XIEP_TERM_SESSION Ends a client-extension server session. + Restrictions: None. + + +Resource Services Description + +XIEP_CREATE_BY_VALUE Creates a new server resource object. + Restrictions: Resource-manipulation + parameter values are restricted to those + compatible with bitonal images. +XIEP_CREATE_BY_ Creates a new server resource object. +REFERENCE + Restrictions: Resource-manipulation + parameter values are restricted to those + compatible with bitonal images. +XIEP_DELETE_RESOURCE Deletes an existing resource object. + Restrictions: None. + X Window Image Extensions 37 + + + +Table C–1 (Cont.) XIE Functions in the DECimage 1200 Terminal +Resource Services Description + +XIEP_QUERY_RESOURCE Queries an existing server resource object. + Restrictions: Resource-manipulation + parameter values are restricted to those + compatible with bitonal images. +XIEP_EXPORT Creates a new server PIXMAP resource + object. + Restrictions: None. +XIEP_FREE_EXPORT Frees the export context. + Restrictions: None. +XIEP_QUERY_EXPORT Queries the export context. + Restrictions: None. + + +Transport Services Description + +XIEP_SET_TRANSPORT Establishes the required transport context + information. + Restrictions: Does not support a DCT + compression scheme. +XIEP_ABORT_TRANSPORT Stops the required transport context + information. + Restrictions: None. +XIEP_PUT_TILE Transports random tiles of uncompressed + image data from the client to the server. + Restrictions: None. +XIEP_PUT_STREAM Transports a stream of compressed or + uncompressed image data from the client + to the server. + Restrictions: Does not support a DCT + compression scheme. + 38 X Window Image Extensions + + + +Table C–1 (Cont.) XIE Functions in the DECimage 1200 Terminal + +Geometric Description + +XIEP_SCALE Scales the image in x and y directions. + Restrictions: Limits the scale factor within + specifications. See the ‘‘Scaling Constraints + of the XIE Server’’ section. +XIEP_ROTATE Rotates the image around the z axis. + Restrictions: Supports 0, 90, 180, and 270- + degree rotation only. The width and height + should either be 0 or match the width and + height of the rotated source image. XIE + ignores other values. +XIEP_MIRROR Rotates the image around the x or y axis, or + both. + Restrictions: None. +XIEP_CROP Extracts a subset of an image. + Restrictions: None. + + +Process Control Services Description + +XIEP_EXECUTE_PHOTOFLO Begins the execution of a pipeline. + Restrictions: See the ‘‘Pipelines’’ section. +XIEP_ABORT_PHOTOFLO Terminates (prematurely) the execution of a + pipeline. + Restrictions: None. +XIEP_BIND_PHOTOFLO Binds a photomap to a photoflo. + Restrictions: None. + X Window Image Extensions 39 + + + +Table C–1 (Cont.) XIE Functions in the DECimage 1200 Terminal +Process Control Services Description + +XIEP_TAP_PHOTOFLO Captures the current output image of the + photoflo at the point where the tap was + issued. + Restrictions: Tap only at the beginning of + a pipeline (when empty). XIE ignores other + taps. +XIEP_SELECT_EVENTS Selects the events that the client wishes to + be notified of. + Restrictions: None. +XIEP_QUERY_EVENTS Queries which events the client will be + notified of. + Restrictions: None. + \ No newline at end of file diff --git a/xie/docs/dec/DECwindows-Motif-OpenVMS-XIE-support.pdf b/xie/docs/dec/DECwindows-Motif-OpenVMS-XIE-support.pdf new file mode 100644 index 0000000..8ae7fe5 Binary files /dev/null and b/xie/docs/dec/DECwindows-Motif-OpenVMS-XIE-support.pdf differ diff --git a/xie/docs/dec/DECwindows-Motif-OpenVMS-XIE-support.txt b/xie/docs/dec/DECwindows-Motif-OpenVMS-XIE-support.txt new file mode 100644 index 0000000..95a6602 --- /dev/null +++ b/xie/docs/dec/DECwindows-Motif-OpenVMS-XIE-support.txt @@ -0,0 +1,6259 @@ +HP DECwindows Motif for +OpenVMS +New Features +Order Number: BA402-90005 + + +July 2006 + +This manual describes new features and enhancements that pertain to +the DECwindows Motif Version 1.6 software. + + + + +Revision/Update Information: This manual supersedes the HP + DECwindows Motif for OpenVMS + Alpha New Features for Version 1.5. +Operating Systems: OpenVMS I64 Version 8.3 + OpenVMS Alpha Version 8.3 +Software Versions: DECwindows Motif for OpenVMS I64 + Version 1.6 + DECwindows Motif for OpenVMS + Alpha Version 1.6 + + + + +Hewlett-Packard Company +Palo Alto, California + © Copyright 2006 Hewlett-Packard Development Company, L.P. +Confidential computer software. Valid license from HP required for possession, use or copying. +Consistent with FAR 12.211 and 12.212, Commercial Computer Software, Computer Software +Documentation, and Technical Data for Commercial Items are licensed to the U.S. Government +under vendor’s standard commercial license. +The information contained herein is subject to change without notice. The only warranties for HP +products and services are set forth in the express warranty statements accompanying such products +and services. Nothing herein should be construed as constituting an additional warranty. HP shall +not be liable for technical or editorial errors or omissions contained herein. +Intel and Itanium are trademarks or registered trademarks of Intel Corporation or its subsidiaries +in the United States and other countries. +Java is a US trademark of Sun Microsystems, Inc. +UNIX is a registered trademark of The Open Group. +The X device is a trademark of X/Open Company Ltd. in the UK and other countries. +Printed in the US + + + ZK6663 + Contents + +Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix + +1 Introduction + +2 General User Features + 2.1 General DECwindows Motif Environment . . . . . . . . . . . . . . . . . . . . . . . . . 2–1 + 2.1.1 Support for Internet Protocol Version 6 (IPv6) Transport . . . . . . . . . . . 2–1 + 2.1.2 Extended File Specification (EFS) Support . . . . . . . . . . . . . . . . . . . . . 2–2 + 2.1.2.1 File Selection Popup Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–2 + 2.1.2.2 New Desktop and the File Manager Application . . . . . . . . . . . . . . 2–2 + 2.1.2.3 Traditional Desktop and the FileView Application . . . . . . . . . . . . . 2–2 + 2.1.2.4 The Programming Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–2 + 2.1.2.5 Translated Image Support (TIS) Library . . . . . . . . . . . . . . . . . . . . 2–2 + 2.1.3 Color Customizer Example Program . . . . . . . . . . . . . . . . . . . . . . . . . . 2–3 + 2.1.3.1 Supported Displays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–3 + 2.1.3.2 Supported Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–3 + 2.1.3.3 Building the Color Customizer on OpenVMS Systems . . . . . . . . . . 2–3 + 2.1.3.4 Running the Color Customizer . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–4 + 2.1.3.5 Modifying the DECW$LOGIN.COM File . . . . . . . . . . . . . . . . . . . . 2–4 + 2.1.3.6 Command Interface Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–4 + 2.1.3.7 Changing the Mapping Between Color Resources and Color + Cells . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–5 + 2.1.3.8 Using the Customizer with DECterm Windows . . . . . . . . . . . . . . . 2–6 + 2.1.3.9 Changing the Default Value of the Automatic Shadowing Toggle + Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–6 + 2.1.3.10 Using the Customizer on Multihead Systems . . . . . . . . . . . . . . . . 2–6 + 2.1.3.11 Using the XSETROOT_CUST.EXE Demonstration Program . . . . . 2–7 + 2.1.4 Drag-and-Drop Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–7 + 2.1.5 Tear-Off Menu Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–8 + 2.2 New Desktop Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–8 + 2.2.1 DECW$GREET.TXT Timer Added . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–8 + 2.2.2 Workspace Customization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–8 + 2.2.2.1 Workspace Button Colors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–8 + 2.2.2.2 Number of Workspaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–9 + 2.2.2.3 Add and Delete Workspaces is Not Displayed . . . . . . . . . . . . . . . . 2–9 + 2.2.2.4 Removing Subpanel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–9 + 2.2.3 Updated Welcome Message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–9 + 2.2.4 Setting the File Manager Refresh Rate . . . . . . . . . . . . . . . . . . . . . . . . 2–10 + 2.2.5 Selecting Screens on Application Launch . . . . . . . . . . . . . . . . . . . . . . . 2–10 + 2.2.6 Front Panel Icons Support MB3 Operations . . . . . . . . . . . . . . . . . . . . 2–10 + 2.3 Traditional Desktop Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–11 + 2.3.1 Resource Added for DECwindows XUI Applications . . . . . . . . . . . . . . 2–11 + 2.4 Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–11 + + + iii + 2.4.1 CDA Viewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–11 + 2.4.1.1 Using the CDA Viewer to View Asian-Language Text . . . . . . . . . . 2–11 + 2.4.1.1.1 Specifying an Options File . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–11 + 2.4.1.1.2 Defining Logical Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–12 + 2.4.1.2 Converting Files That Contain Asian-Language Characters . . . . . 2–13 + 2.4.1.3 Dynamic Font Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–14 + 2.4.1.4 Enhanced Display Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–14 + 2.4.1.5 Pack and Unpack Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–15 + 2.4.1.5.1 Pack Application Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–15 + 2.4.1.5.2 Unpack Application Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–16 + 2.4.1.5.3 Error Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–17 + 2.4.1.6 New CDA Viewer Error Message . . . . . . . . . . . . . . . . . . . . . . . . . . 2–17 + 2.4.2 DECterm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–17 + 2.4.2.1 New Default Font Sizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–17 + 2.4.2.2 Scrolling Using the Keyboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–18 + 2.4.2.3 ReGIS Input Cursors and Escape Sequences . . . . . . . . . . . . . . . . . 2–18 + 2.4.2.4 Automatic Window Positioning . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–19 + 2.4.3 Window Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–19 + 2.4.3.1 Overlay Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–19 + 2.5 Tools and Utilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–20 + 2.5.1 AccessX Keyboard Utility (accessx) . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–20 + 2.5.1.1 The AccessX Configuration File . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–22 + 2.5.1.2 Default Resource Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–22 + 2.5.2 X Authority Utility (xauth) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–23 + 2.5.2.1 The X Authority File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–25 + 2.5.2.1.1 Format of an X Authority File Entry . . . . . . . . . . . . . . . . . . . . 2–26 + 2.5.2.1.2 Specifying an X Authority File . . . . . . . . . . . . . . . . . . . . . . . . . 2–27 + 2.5.2.2 Invoking xauth and Entering Commands . . . . . . . . . . . . . . . . . . . 2–27 + 2.5.2.3 IPv6 Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–28 + 2.5.2.4 Accessing Online Help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–28 + 2.5.2.5 Creating an X Authority File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–28 + 2.5.2.6 Displaying File Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–28 + 2.5.2.7 Viewing and Editing File Entries . . . . . . . . . . . . . . . . . . . . . . . . . . 2–29 + 2.5.2.8 Generating Authorization Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–32 + 2.5.3 X Keyboard Compiler Utility (xkbcomp) . . . . . . . . . . . . . . . . . . . . . . . . 2–32 + 2.5.4 Window Dump to Print File (xpr) Utility . . . . . . . . . . . . . . . . . . . . . . . 2–34 + +3 System Management Features + 3.1 Installation and Upgrade Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3–1 + 3.1.1 DECW$STARTUP Log File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3–1 + 3.2 Security and Authorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3–1 + 3.2.1 Support for ACME Subsystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3–1 + 3.3 X Display Server Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3–2 + 3.3.1 Support for Choosing the Location of Dialogs in a Xinerama + Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3–2 + 3.3.2 New Parameter for Enabling IPv6 Support in the Font Server . . . . . . 3–3 + + + + +iv + 4 Programming Features + 4.1 General Run-Time and Programming Environment . . . . . . . . . . . . . . . . . . 4–1 + 4.1.1 Multithreading Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–1 + 4.1.2 Binary Compatibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–1 + 4.1.2.1 Use of Asynchronous System Traps (ASTs) . . . . . . . . . . . . . . . . . . 4–2 + 4.1.2.2 Levels of Thread Safety and Concurrency . . . . . . . . . . . . . . . . . . . 4–2 + 4.1.2.3 Enabling Support for Multithreading . . . . . . . . . . . . . . . . . . . . . . . 4–4 + 4.1.2.4 Developing Applications with Thread-Aware Images . . . . . . . . . . . 4–5 + 4.2 Application Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–6 + 4.2.1 CDA Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–6 + 4.2.1.1 Changes to the CDA Programming Interface . . . . . . . . . . . . . . . . . 4–6 + 4.2.1.2 Changes to CDA External Reference Processing . . . . . . . . . . . . . . 4–7 + 4.2.1.3 Restructuring CDA Shareable Images . . . . . . . . . . . . . . . . . . . . . . 4–8 + 4.2.2 DECterm Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–8 + 4.2.2.1 ReGIS Input Cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–8 + 4.2.2.2 Page-Movement Escape Sequences . . . . . . . . . . . . . . . . . . . . . . . . 4–9 + 4.3 OSF/Motif Toolkit (Xm) Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–9 + 4.3.1 Drag-and-Drop Enabled Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–9 + 4.4 HP Extensions to Motif (DXm) Programming . . . . . . . . . . . . . . . . . . . . . . 4–10 + 4.4.1 SVN Widget Supports Extended Selection . . . . . . . . . . . . . . . . . . . . . . 4–10 + 4.4.2 DXmCSText Input Method Support . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–10 + 4.5 X Toolkit Intrinsics (Xt) Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–11 + 4.5.1 New Functions Available with X11R6.6 Upgrade . . . . . . . . . . . . . . . . . 4–11 + 4.5.2 Support for Easy Resource Configuration . . . . . . . . . . . . . . . . . . . . . . 4–12 + 4.5.3 New Option for CompositeClassExtensionRec . . . . . . . . . . . . . . . . . . . 4–13 + 4.5.4 New Default Format for XtResolvePathname . . . . . . . . . . . . . . . . . . . 4–13 + 4.5.5 XtAppMainLoop Routine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–13 + 4.6 X Window System Library (Xlib) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–14 + 4.6.1 IPv6 Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–14 + 4.6.2 New Functions Available with X11R6.6 Upgrade . . . . . . . . . . . . . . . . . 4–14 + 4.6.3 Updated Client-Side Extension Library . . . . . . . . . . . . . . . . . . . . . . . . 4–15 + 4.6.4 Support for LCNs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–16 + 4.6.5 Updated X11 Environment Variable Parsing . . . . . . . . . . . . . . . . . . . . 4–17 + 4.6.6 Additional Non-C Language Bindings Available with X11R6.6 . . . . . . 4–17 + 4.6.6.1 CLOSE OM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–17 + 4.6.6.2 CONTEXTUAL DRAWING . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–18 + 4.6.6.3 CONVERT CASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–18 + 4.6.6.4 DESTROY OC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–18 + 4.6.6.5 DIRECTIONAL DEPENDENT DRAWING . . . . . . . . . . . . . . . . . . 4–18 + 4.6.6.6 DISPLAY OF OM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–19 + 4.6.6.7 EXTENDED MAX REQUEST SIZE . . . . . . . . . . . . . . . . . . . . . . . . 4–19 + 4.6.6.8 INIT IMAGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–19 + 4.6.6.9 INIT THREADS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–19 + 4.6.6.10 INTERNAL CONNECTION NUMBERS . . . . . . . . . . . . . . . . . . . . 4–20 + 4.6.6.11 LOCALE OF OM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–20 + 4.6.6.12 LOCK DISPLAY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–20 + 4.6.6.13 OPEN OM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–20 + 4.6.6.14 PROCESS INTERNAL CONNECTION . . . . . . . . . . . . . . . . . . . . . 4–21 + 4.6.6.15 REGISTER IM INSTANTIATE Callback . . . . . . . . . . . . . . . . . . . . 4–21 + 4.6.6.16 SET AUTHORIZATION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–21 + 4.6.6.17 UNLOCK DISPLAY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–21 + 4.6.6.18 UNREGISTER IM INSTANTIATE Callback . . . . . . . . . . . . . . . . . 4–22 + + + + + v + 4.6.7 Support for Additional Fonts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–22 + 4.6.7.1 Additional 75-dpi Fonts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–23 + 4.6.7.2 Additional 100-dpi Fonts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–27 + 4.6.7.3 Additional Common Fonts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–32 + 4.6.7.4 Bitstream Speedo Scalable Fonts . . . . . . . . . . . . . . . . . . . . . . . . . . 4–34 + 4.6.7.5 Agfa Monotype TrueType Scalable Fonts . . . . . . . . . . . . . . . . . . . . 4–34 + 4.6.7.6 Adobe Type1 Fonts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–35 + 4.6.8 UIDPATH Environment Variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–35 + 4.6.9 Client Side Extension Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–36 + 4.7 X Window System Extensions and Protocols . . . . . . . . . . . . . . . . . . . . . . . 4–36 + 4.7.1 Additional X Display Server Extensions Supported with X11R6.6 . . . . 4–36 + 4.7.1.1 Application Group Extension (XC-APPGROUP) . . . . . . . . . . . . . . . 4–37 + 4.7.1.2 Big Requests Extension (BIG-REQUESTS) . . . . . . . . . . . . . . . . . . 4–38 + 4.7.1.3 Colormap Utilization Policy Extension (TOG-CUP) . . . . . . . . . . . . 4–38 + 4.7.1.4 Extended Visual Information Extension (EVI) . . . . . . . . . . . . . . . . 4–39 + 4.7.1.5 Low-Bandwidth X Extension (LBX) . . . . . . . . . . . . . . . . . . . . . . . . 4–39 + 4.7.1.6 Security Extension (SECURITY) . . . . . . . . . . . . . . . . . . . . . . . . . . 4–40 + 4.7.1.7 XC-MISC Extension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–41 + 4.7.1.8 X Double Buffer Extension (DBE) . . . . . . . . . . . . . . . . . . . . . . . . . 4–41 + 4.7.1.9 XINERAMA Extension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–42 + 4.7.1.10 X Keyboard Extension (XKB) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–42 + 4.7.1.11 X Synchronization Extension (SYNC) . . . . . . . . . . . . . . . . . . . . . . 4–43 + 4.7.2 Server Extensions Updated for X11R6.6 . . . . . . . . . . . . . . . . . . . . . . . 4–44 + 4.7.3 Inter-Client Exchange (ICE) Protocol Support . . . . . . . . . . . . . . . . . . . 4–44 + 4.7.3.1 Multithreading Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–45 + 4.7.3.2 Differences from the Standard Implementation . . . . . . . . . . . . . . . 4–46 + 4.7.3.3 IPv6 Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–47 + 4.7.4 X Session Management Protocol (XSMP) Support . . . . . . . . . . . . . . . . 4–47 + 4.7.4.1 Multithreading Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–48 + 4.7.4.2 Differences from the Standard Implementation . . . . . . . . . . . . . . . 4–48 + 4.7.5 MIT Shared Memory Extension (MIT-SHM) Support . . . . . . . . . . . . . . 4–49 + 4.7.5.1 How to Use Shared Memory Extension . . . . . . . . . . . . . . . . . . . . . 4–49 + 4.7.5.2 Using Shared Memory XImages . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–50 + 4.7.5.3 Using Shared Memory Pixmaps . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–53 + 4.7.6 X Image Extension (XIE) Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–53 + 4.8 X Window System Internationalization Library (Xnl) . . . . . . . . . . . . . . . . 4–54 + 4.8.1 The I18N Library Now Supports GB18030 . . . . . . . . . . . . . . . . . . . . . 4–54 + 4.9 Transport Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–54 + 4.9.1 Support for the LAT Transport Interface Available . . . . . . . . . . . . . . . 4–54 + 4.9.2 Support for the Logical Connection Number (LCN) Interface . . . . . . . 4–55 + 4.9.2.1 LCN Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–55 + 4.9.2.1.1 Initializing Thread Support . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–55 + 4.9.2.1.2 Allocating Connection Numbers . . . . . . . . . . . . . . . . . . . . . . . . 4–55 + 4.9.2.1.3 Querying Status and Signaling Input . . . . . . . . . . . . . . . . . . . 4–56 + 4.9.3 LCN Routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–56 + 4.9.3.1 DECW$LCN_ALLOCATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–56 + 4.9.3.2 DECW$LCN_CLEAR_x_READY . . . . . . . . . . . . . . . . . . . . . . . . . . 4–57 + 4.9.3.3 DECW$LCN_FREE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–58 + 4.9.3.4 DECW$LCN_SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–59 + 4.9.3.5 DECW$LCN_SELECT_ONE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–61 + 4.9.3.6 DECW$LCN_SET_x_READY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–63 + 4.9.3.7 DECW$LCN_THREAD_INIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–64 + + + + +vi + Index + +Tables + 1–1 Directory of Features for DECwindows Motif Version 1.6 . . . . . . . . . . 1–1 + 2–1 Asian Language Codes for Options Files . . . . . . . . . . . . . . . . . . . . . . . 2–11 + 2–2 Logical Names for Specifying Text Encoding . . . . . . . . . . . . . . . . . . . . 2–12 + 2–3 Languages and Associated Basic Fonts . . . . . . . . . . . . . . . . . . . . . . . . 2–13 + 2–4 AccessX Keyboard Utility Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–21 + 2–5 Default AccessX Resource Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–22 + 2–6 X Authority Utility Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–24 + 2–7 X Authority Utility Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–24 + 2–8 xauth Transport Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–28 + 2–9 Keyboard Compiler Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2–33 + 2–10 Window Dump to Print File Options . . . . . . . . . . . . . . . . . . . . . . . . . . 2–35 + 4–1 Level of Thread Safety for DECwindows Motif Images . . . . . . . . . . . . 4–2 + 4–2 Multithreading Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–4 + 4–3 New Header File Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–7 + 4–4 Names of Shareable Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–8 + 4–5 ReGIS Input Cursors—Cursor styles and Values . . . . . . . . . . . . . . . . . 4–9 + 4–6 Drag-and-Drop Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4–10 + 4–7 New Xt Functions Supported for X11R6.6 . . . . . . . . . . . . . . . . . . . . . . 4–11 + 4–8 New Xlib Functions Supported for X11R6.6 . . . . . . . . . . . . . . . . . . . . . 4–14 + 4–9 Additional 75-dpi Fonts (.PCF File Extension) . . . . . . . . . . . . . . . . . . . 4–23 + 4–10 Additional 100-dpi Fonts (.PCF File Extension) . . . . . . . . . . . . . . . . . . 4–27 + 4–11 Additional Common Fonts (.PCF File Extension) . . . . . . . . . . . . . . . . . 4–32 + 4–12 Bitstream Speedo Scalable Fonts (.SPD File Extension) . . . . . . . . . . . 4–34 + 4–13 Agfa Monotype TrueType Scalable Fonts (.TTF File Extension) . . . . . . 4–34 + 4–14 Adobe Type1 Scalable Fonts (.PCA File Extension) . . . . . . . . . . . . . . . 4–35 + + + + + vii + Preface + + This document describes the new features introduced with the HP DECwindows + Motif for OpenVMS Version 1.6 (DECwindows Motif) software on the OpenVMS + I64 and OpenVMS Alpha platforms. For information about how these features + might affect your system, read the release notes before you install, upgrade, or + use the DECwindows Motif Version 1.6 software. + The features in this manual are cumulative from DECwindows Motif for + OpenVMS Version 1.0 and indicate any undocumented items that still pertain + to the software. For previous features, a label within the description indicates + when the feature was introduced. + +Intended Audience + This manual is intended for system managers, users, and programmers who work + with DECwindows Motif. + +Document Structure + This manual is structured as follows: + • Chapter 1 provides an overview of the current release. + • Chapter 2 describes features of interest to general users of the DECwindows + Motif software. + • Chapter 3 describes features related to system and network management. + • Chapter 4 describes features that support application and system + programmers. + +Related Documents + For additional information about OpenVMS or DECwindows Motif products and + services, visit the following web site: + http://www.hp.com/go/openvms + +Reader’s Comments + HP welcomes your comments on this manual. Please send comments to either of + the following addresses: + Internet openvmsdoc@hp.com + Mail Hewlett-Packard Company + OSSG Documentation Group, ZKO3-4/U08 + 110 Spit Brook Rd. + Nashua, NH 03062-2698 + + + + + ix + How To Order Additional Documentation + For information about how to order additional documentation, visit the following + World Wide Web address: + http://www.hp.com/go/openvms/doc/order + +Conventions + The following product names may appear in this manual: + • HP OpenVMS Industry Standard 64 for Integrity servers + • OpenVMS I64 + • I64 + All three names—the longer form and the two abbreviated forms—refer to + the version of the OpenVMS operating system that runs on the Intel Itanium + architecture. + All uses of DECwindows and DECwindows Motif refer to the HP DECwindows + Motif for OpenVMS software; and all uses of X server and X display server refer + to the DECwindows X11 Display Server. Additionally, all uses of DECwindows + XUI (X User Interface) refer to the DECwindows product prior to DECwindows + Motif Version 1.0. + The following typographic conventions may be used in this manual: + Ctrl/x A sequence such as Ctrl/x indicates that you must hold down + the key labeled Ctrl while you press another key or a pointing + device button. + Return In examples, a key name enclosed in a box indicates that + you press a key on the keyboard. (In text, a key name is not + enclosed in a box.) + In the HTML version of this document, this convention appears + as brackets, rather than a box. + ... Horizontal ellipsis points in examples indicate one of the + following possibilities: + • Additional optional arguments in a statement have been + omitted. + • The preceding item or items can be repeated one or more + times. + • Additional parameters, values, or other information can be + entered. + + . Vertical ellipsis points indicate the omission of items from + . a code example or command format; the items are omitted + . because they are not important to the topic being discussed. + () In command format descriptions, parentheses indicate that + you must enclose the choices in parentheses if you choose more + than one. + [] In command format descriptions, brackets indicate optional + elements. You can choose one, none, or all of the options. + (Brackets are not optional, however, in the syntax of a directory + name in an OpenVMS file specification or in the syntax of a + substring specification in an assignment statement.) + + + + +x + [|] In command format descriptions, vertical bars separating + items inside brackets indicate that you choose one, none, or + more than one of the options. +{} In command format descriptions, braces indicate required + elements; you must choose one of the options listed. +text style This text style represents the introduction of a new term or the + name of an argument, an attribute, or a reason. + In the HTML version of this document, this convention appears + as italic text. +italic text Italic text emphasizes important information and indicates + complete titles of manuals and variables. Variables include + information that varies in system messages (Internal error + number), in command lines (/PRODUCER=name), and in + command parameters in text (where dd represents the + predefined code for the device type). +UPPERCASE TEXT Uppercase text indicates a command, the name of a routine, + the name of a file, or the abbreviation for a system privilege. + Monospace type indicates code examples and interactive screen + displays. +Monospace type + In the C programming language, monospace type in text + identifies the following elements: keywords, the names + of independently compiled external functions and files, + syntax summaries, and references to variables or identifiers + introduced in an example. +- A hyphen at the end of a command format description, + command line, or code line indicates that the command or + statement continues on the following line. +numbers All numbers in text are assumed to be decimal unless + otherwise noted. Nondecimal radixes—binary, octal, or + hexadecimal—are explicitly indicated. + + + + + xi + 1 + Introduction + +This chapter summarizes the features associated with the DECwindows Motif +Version 1.6 software. Version 1.6 is a major release that includes support for +the HP OpenVMS Industry Standard 64 for Integrity Servers (OpenVMS I64) +platform, the Internet Protocol Version 6 (IPv6) transport, and ACME security. +Table 1–1 lists all the items added during this release and cross-references the +sections in which they are described. +For a detailed description of the corrections, changes, and known problems +associated with this release, see the HP DECwindows Motif for OpenVMS Release +Notes manual. + +Table 1–1 Directory of Features for DECwindows Motif Version 1.6 +Title Section +General User Features +DECW$GREET.TXT Timer Added Section 2.2.1 +Workspace Customization Section 2.2.2 +Workspace Button Colors Section 2.2.2.1 +Number of Workspaces Section 2.2.2.2 +Add and Delete Workspaces is Not Displayed Section 2.2.2.3 +Removing Subpanel Section 2.2.2.4 + + +Security and Authorization Features +Support for ACME Subsystem Section 3.2.1 + + +X Display Server Management Features +Support for Choosing the Location of Dialogs in a Xinerama Section 3.3.1 +Configuration + + +X Window System Internationalization Library (Xnl) +Features +The I18N Library Now Supports GB18030 Section 4.8.1 + + + + + Introduction 1–1 + 2 + General User Features + + This chapter provides information about new features that pertain to all users of + DECwindows Motif. + +2.1 General DECwindows Motif Environment + This section describes new features that are common to both the New Desktop + and Traditional DECwindows Desktop environments. + +2.1.1 Support for Internet Protocol Version 6 (IPv6) Transport + V1.5 + DECwindows Motif now supports the Internet Protocol Version 6 (IPv6) transport + in addition to the existing support for the Internet Protocol Version 4 (IPv4) + transport. Included in this release is support for the transport names described + in the X11R6.6 and X11R6.7 specifications published by the X.Org Foundation + (formerly X.Org). + Use of the IPv6 transport is enabled with the new global symbol + DECW$IPV6_SUPPORT, which can be defined in the startup file + SYS$MANAGER:DECW$PRIVATE_APPS_SETUP.COM. + Support for the IPv6 transport affects many DECwindows Motif components–from + the display device to functions in the Inter-Client Exchange (ICE) library. See + one or more of the following manuals (or sections in this manual) to learn about + IPv6 support and its use. + + For information about... See the... + X Window System support for X.Org Foundation web site (http://www.x.org) + transport names + Enabling IPv6 support, valid HP DECwindows Motif for OpenVMS Management Guide + display name formats, host + name translation, and using + with font and proxy servers + Impact on the SET DISPLAY HP OpenVMS DCL Dictionary and DCL online help + command + Impact on the xauth utility Section 2.5.2.3 + Impact on X Library (Xlib) Section 4.6.1 + routines + Impact on ICE library Section 4.7.3.3 + routines + + + + + General User Features 2–1 + General User Features +2.1 General DECwindows Motif Environment + +2.1.2 Extended File Specification (EFS) Support + V1.2–5 + In general, DECwindows Motif supports the Extended File Specifications (EFS) + option available with OpenVMS. The interface either supports the new ODS-5 + file names, as described in the following sections, or provides an error message + indicating that the particular component does not support the new names. +2.1.2.1 File Selection Popup Window + The standard file selection popup window used by most DECwindows Motif + applications fully supports ODS-5 style file names. The window supports deep + directories, case preservation, and extended-length file names. The window + supports entry of file names using the extended file name character and displays + files using the extended file name character set using the circumflex character + (^). + See the current OpenVMS documentation for more specific information about + using deep directories and the extended file name character set. +2.1.2.2 New Desktop and the File Manager Application + With an ODS-5 volume, the File Manager application supports deep directories, + case preservation, and extended-length file names. File Manager supports entry + of file names using the extended file name character and displays files using the + extended file name character set using the circumflex character (^). + Any custom File Manager command extensions must be modified to support EFS. + See the current OpenVMS documentation for more specific information about + using deep directories and the extended file name character set. +2.1.2.3 Traditional Desktop and the FileView Application + The FileView application supports case preservation and creates files with the + extended file name character set, but does not support any operations on its files. + FileView also supports extended-length file names and deep directory structures + with the additional restriction that a total file specification cannot exceed 235 + 8-bit characters in length. + Exceeding this limit causes an error message for some menu items. +2.1.2.4 The Programming Libraries + The programming libraries fully support deep directories and extended-length file + names. However, the libraries do not support case preservation or the extended + file name character set. +2.1.2.5 Translated Image Support (TIS) Library + The translated image support (TIS) library has not been updated to support EFS. + + + + +2–2 General User Features + General User Features + 2.1 General DECwindows Motif Environment + +2.1.3 Color Customizer Example Program + V1.2 + The color customizer example program allows you to dynamically control the + colors of your workstation environment. Window, icon, and window manager + colors can be changed individually or as part of a palette switch. You can control + mapping between resources and color cells, as well as the size and contents of + the palette set. Also, automatic shadowing with the standard Motif shadowing + algorithms is supported. +2.1.3.1 Supported Displays + The color customizer supports any display using pseudocolor or grayscale visuals. + This includes most 4- and 8-plane workstation displays. +2.1.3.2 Supported Applications + The color customizer can affect the colors of any applications that use the current + release of the X Toolkit Intrinsics (Xt) included with X Window System Version 11 + Release 5 (X11R5) or greater. Applications from other vendors and versions of the + library previous to X11R5 are unaffected. + + Note + If the color customizer is used to control the colors of applications that + have their own color customization dialog boxes (like the Session Manager, + Window Manager, and DECwindows Mail), those application-specific color + customization dialog boxes may not reflect the correct current color values + while the customizer is running the application. This is normal; use the + customizer instead of the application-specific dialog box to change these + color values. + + +2.1.3.3 Building the Color Customizer on OpenVMS Systems + To build the color customizer on OpenVMS systems, perform the following steps: + 1. Copy the files to a private directory. For example: + $ SET DEFAULT SYS$LOGIN + $ CREATE/DIRECTORY [.CUSTOMIZER] + $ SET DEFAULT [.CUSTOMIZER] + $ COPY DECW$EXAMPLES:CUSTOM.C [] + $ COPY DECW$EXAMPLES:CUSTOM.UIL [] + $ COPY DECW$EXAMPLES:CUSTOMIMAGE.DAT [] + $ COPY DECW$EXAMPLES:XSETROOT_CUST.C [] + $ COPY DECW$EXAMPLES:BUILD_CUSTOMIZER.COM [] + 2. Build the customizer using the following command: + $ @BUILD_CUSTOMIZER.COM + This command procedure creates the following output files: + CUSTOM.UID + CUSTOM.EXE + XSETROOT_CUST.EXE + + + + + General User Features 2–3 + General User Features +2.1 General DECwindows Motif Environment + +2.1.3.4 Running the Color Customizer + To run the color customizer, perform the following steps: + 1. Copy the files CUSTOM.UID and CUSTOM.EXE, which were created during + the customizer build, to the directory where the customizer will be run. A + typical location is the directory SYS$LOGIN or the directory DECW$USER_ + DEFAULTS. + 2. Copy the files CUSTOM.DAT and DXMDEFAULTS.DAT from the directory + DECW$EXAMPLES to the directory DECW$USER_DEFAULTS. + 3. Run the executable file CUSTOM.EXE as follows: + $ RUN CUSTOM + + Note + Only the colors of applications invoked after the customizer starts will be + affected. For this reason, start the customizer as the first X application + during the login process. + + +2.1.3.5 Modifying the DECW$LOGIN.COM File + As noted in Section 2.1.3.4, the color customizer should be the first X application + started during the login process. Do this by starting it as a subprocess from + within the DECW$LOGIN.COM file. Add a command to wait approximately 10 + seconds between customizer startup and the startup of other applications. + For example, add the following lines to the DECW$LOGIN.COM file: + $! Starting the color customizer + $ DISPLAY = F$LOGICAL("DECW$DISPLAY") + $ SPAWN/NOWAIT/OUTPUT=’DISPLAY’ RUN SYS$LOGIN:CUSTOM.EXE + $ WAIT 0:0:10 + See Using DECwindows Motif for OpenVMS and HP DECwindows Motif + for OpenVMS Management Guide for more information on modifying + DECW$LOGIN.COM. +2.1.3.6 Command Interface Summary + A box containing a list of available palettes is in the leftmost section of the Color + Customizer window. Click on the desired palette to see the colors take affect. + Below the palettes are two arrays of colored buttons, representing the + dynamically allocated color cells for normal and shadow colors. To find out + what resources are affected by a color cell, click and hold the arrow button next + to the color cell. + + Hint + As a shortcut, you can click on the screen facsimile in the rightmost + corner of the dialog box. If the portion you click on is colored by one of the + resource values controlled by the customizer, the pop-up window for the + appropriate color button is displayed. + + + + +2–4 General User Features + General User Features + 2.1 General DECwindows Motif Environment + + To modify a single color cell, click on the corresponding color button. A colormix + widget pops up; as you modify the color, these modifications are reflected in your + workstation environment. Use the colormix widget reset button to return to the + starting color at any time. You can also change the color cell you are modifying + by clicking on a different color button while the colormix widget is displayed. + The automatic shadowing option causes shadow and select colors to be + automatically updated when their corresponding background colors are changed. + The standard Motif shadowing algorithms are used for these calculations. + Use the File menu to modify, add, and delete color palettes as follows: + • To modify an existing palette, select the palette, change the colors, and choose + Save Palette from the File menu. + • To add a new palette, select an existing palette, modify the colors as + necessary, and choose Save Palette As... from the File menu. A message + box prompts you for the name of the new palette. + • To delete a palette, select the palette and choose Delete Palette from the File + menu. + Changes made through the File menu automatically update the CUSTOM.DAT + file, which contains the resource defaults. + The File menu Exit button causes the customizer application to exit. A warning + dialog is displayed first. Note that the color cells allocated by the customizer + (and used by the currently running applications) will be deallocated. After the + customizer exits, if the colors of the currently running applications are not + correct, the applications should be restarted to restore normal colors. Usually, + there is no need to exit the color customizer; it is typically kept running at all + times, like the Session Manager. +2.1.3.7 Changing the Mapping Between Color Resources and Color Cells + The file DXMDEFAULTS.DAT allows you to control how many dynamic color + cells are allocated and what resources are affected. This file contains resource + specifications like the following: + *background: DXmDynamicWindowBackground + *foreground: DXmDynamicWindowForeground + *topShadowColor: DXmDynamicWindowTopShadow + When the customizer is started, the file DXMDEFAULTS.DAT is written to a + property on the root window. Any application that is subsequently run and that + uses the correct version of Xt merges these resources with its normal resource + database. Resource specifications in this file take precedence over specifications + with equivalent resource names in other resource default files. + The resource values within the file DXMDEFAULTS.DAT have a special + format. For each unique color value in this file that begins with the string + "DXmDynamic", a color button is created in the color customizer. If the + string "Shadow" is encountered in a name, the color button is placed in the + shadow button box rather than the normal color button box. If a color value + string ends with the suffix "Background", it is linked to any color buttons + with identical prefixes and suffixes of "TopShadow", "BottomShadow", or + "SelectColor" for purposes of automatic shadowing. If a color value named + "DXmDynamicScreenBackground" is encountered, the color cell allocated is + used by the customizer to set the root window background color. + + + + + General User Features 2–5 + General User Features +2.1 General DECwindows Motif Environment + + You can edit the file DXMDEFAULTS.DAT and define resources to use the same + color cells. You can have separate dynamic color cells, for scroll bar widgets or for + your DECwindows Mail application, for example, by adding the following lines to + the file DXMDEFAULTS.DAT: + Mail*background: DXmDynamicMyMailBackground + Mail*foreground: DXmDynamicMyMailForeground + Mail*topShadowColor: DXmDynamicMyMailTopShadow + Mail*bottomShadowColor: DXmDynamicMyMailBottomShadow + Adding the previous lines to the file DXMDEFAULTS.DAT and restarting the + customizer causes four new color cells to be allocated and four new color buttons + to be added to the customizer interface. These buttons are assigned default + color values (usually black or white) for each palette. These defaults can then be + modified for each palette through the customizer interface. + + Note + The text of the DXMDEFAULTS.DAT file is read and parsed by the + color customizer. The parsing algorithm does not allow comments, + incorrect spacing, or incorrect resource specifications. If this file or the + CUSTOM.DAT resource file become corrupt, the customizer cannot start + correctly. To resolve the problem, copy the versions of CUSTOM.DAT and + DXMDEFAULTS.DAT from the DECW$EXAMPLES directory into your + login directory. + + +2.1.3.8 Using the Customizer with DECterm Windows + To change the colors of DECterm windows, copy the DECterm resource + specifications from the file DXMDEFAULTS.DAT and add them to the + DECterm resource defaults file DECW$USER_DEFAULTS:DECW$TERMINAL_ + DEFAULT.DAT. For example, add the following lines to the DECterm resource + defaults file: + DECW$TERMINAL.main.terminal.background: DXmDynamicTerminalBackground + DECW$TERMINAL.main.terminal.foreground: DXmDynamicTerminalForeground + This allows the DECterm window colors to be customized with the color + customizer. +2.1.3.9 Changing the Default Value of the Automatic Shadowing Toggle Button + The default value of the automatic shadowing toggle button is set using the + Custom.autoShadow resource in the CUSTOM.DAT file as follows: + Custom.autoShadowing: False + The default value is True. +2.1.3.10 Using the Customizer on Multihead Systems + The color customizer affects only applications started on the same screen as + the customizer. On most multihead systems, you can start a different color + customizer for each screen and have a different palette in effect on each + screen. On multihead systems using XINERAMA, a single instance of the color + customizer affects all applications, since the screens function as a single logical + screen. + + + + +2–6 General User Features + General User Features + 2.1 General DECwindows Motif Environment + + The color customizer can be configured so that it is invoked once and affects + all applications regardless of where they are started. This mode is invoked by + modifying the Custom.multiScreen resource in the CUSTOM.DAT file as follows: + Custom.multiScreen: True + The default value is False. +2.1.3.11 Using the XSETROOT_CUST.EXE Demonstration Program + The XSETROOT_CUST.EXE demonstration program, created during the + customizer build, is a modified version of the X utility xsetroot that is used + to set a bitmap on the root window. The XSETROOT_CUST.EXE program + uses DXmDynamicScreenBackground and DXmDynamicScreenForeground as + the background and foreground colors of the specified bitmap. If your + DXMDEFAULTS.DAT file contains entries for these two dynamic colors, then + use the customizer to dynamically modify the colors of your bitmap. + For example: + $ XSETROOT_CUST :== "$SYS$LOGIN:XSETROOT_CUST.EXE" + $ XSETROOT_CUST -BITMAP your_xbm_file.XBM + +2.1.4 Drag-and-Drop Support + V1.2 + The drag-and-drop feature lets you move or copy screen objects. This feature is + provided primarily for programmers who choose to incorporate drag-and-drop into + their applications. For example, you can move text from a text entry area and + paste it elsewhere. + All DECwindows Motif applications except Notepad support the drag-and-drop + feature. DECwindows Mail supports the drag-and-drop feature in all windows + except the main message area, where DECwindows Mail has its own drag-and- + drop; you can use MB2 to move messages around with the SVN interface. + To drag and drop text into a new location: + 1. Select the text to be copied or moved with MB1. + 2. To move the text, press and hold MB2; to copy the text, press and hold + Ctrl/MB2. + A move or copy icon appears. + 3. Drag the icon to the location where you want to drop the text and release + MB2. + If the object is highlighted as you drag the icon across it, you can drop the + text into that location. + For a list of the widgets that support drag-and-drop functionality, see + Section 4.3.1. + + + + + General User Features 2–7 + General User Features +2.1 General DECwindows Motif Environment + +2.1.5 Tear-Off Menu Support + V1.2 + Most DECwindows Motif applications allow you to tear off pull-down and popup + menus. Tear-off menus let you keep frequently used menus displayed without + repeatedly pulling them down or popping them up. + To tear off a menu: + 1. Display a pull-down or popup menu. + If the menu is a tear-off menu, a dotted line is displayed at the top of the + menu. + 2. Click on the dotted line with MB1. + The menu remains active until it is closed or until the parent application is + closed. + To close a tear-off menu: + 1. Click on the Window menu button in the tear-off menu. + 2. Choose the Close menu item. + +2.2 New Desktop Environment + This section describes new features related to the New Desktop environment. + +2.2.1 DECW$GREET.TXT Timer Added + V1.6 + The login process of the new desktop facilitates the display of a custom greeting + message. + If an user does not complete the login process within a specified timeout + interval, the custom greeting message pops-up and the login process is + reset. This timeout interval value (in seconds) can be set by assigning the + appropriate timeout interval to the "Dtgreet*timeout" resource in the "cde$user_ + defaults:[config.c]xresources.dat" resource file. + The default timeout value is 180 seconds. + +2.2.2 Workspace Customization + V1.6 + This section describes the new resources that have been added to customize the + Workspace in Common Desktop Environment (CDE). These resources must be + added in DTWM.DAT file or a local per-used resource file. +2.2.2.1 Workspace Button Colors + V1.6 + The color of the workspace button will be tied to the color of the workstation + BACKGROUND color when the Dtwm*VMSButtonColorBackdrop resource is + TRUE. + To make the backdrop of the workspace match the color, BACKGROUND must be + selected as the backdrop. To do so, you need to define the following resource: + Dtwm*wsbackdrop*image: Background + + + +2–8 General User Features + General User Features + 2.2 New Desktop Environment + + To modify the background color, you need to define the following resource: + Dtwm*ws*backdrop*imageBackground: + The default color of the workspace button text will be the foreground color of the + backdrop when the Dtwm*VMSButtonColorBackdrop resource is TRUE. + To modify the text color of the workspace button, you need to define the following + resource: + Dtwm*ws*backdrop*imageForeground: +2.2.2.2 Number of Workspaces + V1.6 + The number of workspaces can be limited by combination of the following + resources: + Dtwm*VMSMinWorkspaceCount: n + Dtwm*VMSMaxWorkspaceCount: m + where, the value of n can be 1 to Dtwm*VMSMaxWorkspaceCount or 64 or + whichever is smaller and m can have any value between 1 to 64. + If n and m have the same value, then no workspaces can be created or deleted + and the value of n will be used as the fixed number of workspaces. +2.2.2.3 Add and Delete Workspaces is Not Displayed + V1.6 + When the number of workspaces reaches the Dtwm*VMSMaxWorkspaceCount,, + Add Workspace option will not be displayed in the workspace buttons pop-up + menu and will not allow the user to add any new workspace. + When the number of workspaces reaches the Dtwm*VMSMinWorkspaceCount, + Delete option will not be displayed in the workspace buttons pop-up menu. +2.2.2.4 Removing Subpanel + V1.6 + To remove the panels after a specific time interval, define the following resource: + Dtwm*VMSRemoveSubpanelTimeout: n + When this resource is defined, the value of n will be used as the number of + milliseconds before removing the Subpanel automatically. + +2.2.3 Updated Welcome Message + V1.2–6 + The welcome message in the Login Screen now displays a host name regardless + of the transport. If the DECnet transport is configured, the DECnet host name + is displayed. If the TCP/IP transport is configured, the TCP/IPhost name is + displayed. If neither transport is configured, a default messageof ‘‘Welcome to + OpenVMS’’ is displayed. + + + + + General User Features 2–9 + General User Features +2.2 New Desktop Environment + +2.2.4 Setting the File Manager Refresh Rate + V1.2–6 + You can now specify that the File Manager periodically update its view on the + New Desktop by adjusting the Dtfile.rereadTime setting in the DTFILE.DAT + resource file. The value of this setting represents the seconds elapsed between + checking for changes in the viewed directories. Note that this setting does not + work when viewing search lists. + +2.2.5 Selecting Screens on Application Launch + V1.2–5 + You can graphically select the screen on which a new application is displayed + when launched from either the Front Panel, the File Manager, or the Application + Manager. By default, the new application appears on the current screen (that + is, the screen containing the mouse pointer). The feature allows you to drop + an application icon from the File Manager or Application Manager onto one of + the numbered screen controls of the Set Default Screen window. This starts the + application on the selected screen without changing the current screen. + The Set Default Screen window is activated by selecting the ‘‘Set Default Screen’’ + application in the Application Manager’s Desktop Tools folder. You can start + a separate instance of the Set Default Screen window on each screen. The + highlighting of the default screen is synchronized across all instances of the Set + Default Screen window. + +2.2.6 Front Panel Icons Support MB3 Operations + V1.2–4 + The New Desktop Front Panel supports mouse button 3 (MB3) operations. When + the cursor is placed over a Front Panel icon and you press MB3, a subpanel or + menu appears. The menu items are as follows: + • Top item–The label of the menu. + • Second item–The application that starts if you single click on the icon. + • Third item–Add or delete a subpanel, depending on whether a subpanel + already exists for the control panel. + + Caution + If the third item is ‘‘Delete Subpanel’’, this change is difficult to reverse + without reinstalling the kit. + + + + +2–10 General User Features + General User Features + 2.3 Traditional Desktop Environment + +2.3 Traditional Desktop Environment + This section describes new features related to the traditional DECwindows + desktop environment. + +2.3.1 Resource Added for DECwindows XUI Applications + V1.0 + The resource Mwm*useDECMode has been added to allow previous versions of + DECwindows XUI applications to behave correctly with the Motif Window + Manager. In particular, this resource is used to control focus, window placement, + multiline icons, and the window’s initial state (normal or minimized). + +2.4 Applications + The following sections describe new features related to specific DECwindows + Motif applications. + +2.4.1 CDA Viewer + This section describes features related to the Compound Document Architecture + (CDA) Viewer application. +2.4.1.1 Using the CDA Viewer to View Asian-Language Text + V1.2–3 + You can use the CDA Viewer in two ways to view text files that contain Asian + characters: + • Specify an options file to the CDA Viewer application. + • Define logical names at the DCL command level or in a LOGIN.COM file. + Refer to the DECwindows Motif for OpenVMS Applications Guide for information + about using the CDA Viewer. + 2.4.1.1.1 Specifying an Options File Specify an options file by including a + one-line entry in the file in the following format: + TEXT TEXT_ENCODING text_encoding_value + • TEXT is the format. + • TEXT_ENCODING is the option you specify to CDA. + • text_encoding_value is the value of the codeset. (See Table 2–1 for a list of + values.) + Table 2–1 shows the languages, codesets, and text-encoding values. + + Table 2–1 Asian Language Codes for Options Files + Language Codeset Text Encoding Value + Japanese DEC Kanji DEC_KANJI + Japanese Super DEC Kanji SDECKANJI + Traditional Chinese DEC Hanyu DEC_HANYU + Simplified Chinese DEC Hanzi DEC_HANZI + Korean DEC Korean DEC_HANGUL + + + + + General User Features 2–11 + General User Features +2.4 Applications + + + + + The following table shows examples of one-line entries. + + Options File One-Line Entry + HANYU.CDA$OPTIONS TEXT TEXT_ENCODING DEC_HANYU + HANZI.CDA$OPTIONS TEXT TEXT_ENCODING DEC_HANZI + HANGUL.CDA$OPTIONS TEXT TEXT_ENCODING DEC_HANGUL + + To view the EXAMPLES_CUSTOMERS.TXT file that contains Japanese + text in DEC Kanji, use your editor to create an options file called + KANJI.CDA$OPTIONS. Add the following one-line entry to the file: + TEXT TEXT_ENCODING DEC_KANJI + When you access the file through the Options File dialog box with the CDA + Viewer, the EXAMPLES_CUSTOMERS.TXT file is viewable in the DEC Kanji + codeset (Japanese language). + 2.4.1.1.2 Defining Logical Names The second option to enable viewing files + in Asian languages is to specify the text file and encoding value by defining two + logical names: + • DDIF$READ_TEXT_GL + • DDIF$READ_TEXT_GR + Table 2–2 shows the logical names and associated encoding values. + + Table 2–2 Logical Names for Specifying Text Encoding + DDIF$READ_TEXT_GL DDIF$READ_TEXT_GR Encoding Value + LATIN1 MCS MCS + LATIN1 LATIN1 ISO Latin–1 + LATIN1 KATAKANA ASCII–Kana + LATIN1 KANJI DEC Kanji + ROMAN MCS Roman–MCS + ROMAN LATIN1 Roman + ROMAN KANJI Roman–Kanji + ROMAN KATAKANA Roman–Kana + LATIN1 HANZI DEC Hanzi + LATIN1 HANGUL DEC Hangul + LATIN1 HANYU DEC Hanyu + + + You can define the logical names on the DCL command line or in your + LOGIN.COM file. For example: + $ DEFINE DDIF$READ_TEXT_GL LATIN1 + $ DEFINE DDIF$READ_TEXT_GR KANJI + Note that this example defines the text encoding for DEC Kanji (see Table 2–2). + + + + +2–12 General User Features + General User Features + 2.4 Applications + +2.4.1.2 Converting Files That Contain Asian-Language Characters + V1.2–3 + You can convert an Asian-language text file to another format by specifying + an options file or by defining the logical names DDIF$READ_TEXT_GL and + DDIF$READ_TEXT_GR as discussed in Section 2.4.1.1.1 and Section 2.4.1.1.2. + The format for converting a document from TEXT to another format is as follows: + $ CONVERT/DOCUMENT/OPTION=language.CDA$OPTIONS filename.TXT/FORMAT=TEXT - + _$ filename.output_extension/FORMAT=output_format + For example, to convert a traditional Chinese language text file to a DDIF file, + enter the following command line: + $ CONVERT/DOCUMENT/OPTION=HANYU.CDA$OPTIONS - + _$ GUIDELINES_PERSONNEL.TXT/FORMAT=TEXT GUIDELINES_PERSONNEL.DDIF + Note that this command line does not include the /FORMAT=DDIF qualifier; + DDIF is the default. + The output file, GUIDELINES_PERSONNEL.DDIF, contains language data. + You can also create Asian language PostScript files from a DDIF, DTIF, or text + (ASCII) file. For example, to convert a DDIF file to PostScript (.PS) format, enter + the following command: + $ CONVERT/DOCUMENT filename.DDIF filename.PS/FORMAT=PS + + Note + Convert only DDIF and DTIF files that contain language data to Asian + language PostScript format. + + + When you print an Asian language PostScript file on a PostScript printer, ensure + that the required language fonts are available on the printer. Otherwise, the + PostScript file defaults to a basic set of fonts. If these fonts do not exist, the + PostScript file defaults to Courier fonts. Table 2–3 shows the languages and their + associated basic fonts. + + Table 2–3 Languages and Associated Basic Fonts + Language Basic Fonts + Japanese Ryumin-Light-EUC-H or Ryumin-Light-Hankaku + Hanyu Sung-Light-CNS11643, Sung-Light-DTSCS + Hangul Munjo + Hanzi XiSong-GB2312-80 + + + Note + Vertical writing is not supported by the CDA converters. All vertical text + is printed horizontally. + + + + + General User Features 2–13 + General User Features +2.4 Applications + +2.4.1.3 Dynamic Font Support + V1.2 + As well as supporting a static-table for the fonts supported by the DECfonts + Typeface Collection Version 1.2, the CDA Run-Time Services includes support for + dynamic font lookup. This enables the CDA Viewer to use new fonts as they are + installed on the system. + Dynamic font support is implemented using the WRITE$FONTS.INI file, which + you can maintain using the Font utility provided with either DECwrite or + DECpresent. If a document contains a font not found in the static tables, the + CDA Viewer tries to open the WRITE$FONTS.INI file and search for the font. If + the font is not found or if the system does not contain a WRITE$FONTS.INI file, + the viewer uses a fallback font. + The WRITE$FONTS logical name references an initialization file used to provide + font definitions to the CDA Viewer. + The default location for the WRITE$FONTS.INI file is SYS$LIBRARY, but, if the + logical name WRITE$FONTS is defined, the CDA Viewer uses the logical name + definition to search for the WRITE$FONTS.INI file. + Full path support is included, so any of the following definitions are valid: + + WRITE$FONTS Logical Name Resulting File + Undefined SYS$LIBRARY:WRITE$FONTS.INI + DISK:[DIRECTORY] DISK:[DIRECTORY]WRITE$FONTS.INI + SYS$LOGIN: SYS$LOGIN:WRITE$FONTS.INI + .TMP SYS$LIBRARY:WRITE$FONTS.TMP + DISK:[DIRECTORY]FILE DISK:[DIRECTORY]FILE.INI + +2.4.1.4 Enhanced Display Performance + V1.2 + The current version of CDA Run-Time Services includes a performance + enhancement that decreases the time it takes to display the first page of a + CDA document. Other applications that use the CDA Viewer to view documents + (for example, DECwindows Mail) also benefit from this enhancement. + The CDA Viewer enables this performance enhancement feature by default. You + can disable the feature as follows: + $ DEFINE CDA_QUICK_FIRST_PAGE FALSE + The CDA Viewer might not display some documents correctly when this feature + is enabled. If you encounter such a problem, disable the feature and invoke the + CDA Viewer again. + + + + +2–14 General User Features + General User Features + 2.4 Applications + +2.4.1.5 Pack and Unpack Applications + V1.2 + CDA Run-Time Services includes two standalone applications that can be used + for transferring CDA documents across a network. The CDA Pack application + packages a CDA document along with all of its externally referenced files into a + single file that can be copied between systems or mailed to other users. The CDA + Unpack application reads a file that is packaged by the CDA Pack application + and creates a copy of the original document file and all its externally referenced + files. + These applications allow you to copy CDA documents between systems without + copying externally referenced files separately or correcting external file reference + information after copying documents. + To use these applications, add the following lines to your LOGIN.COM file (or add + the lines to the SYS$MANAGER:SYLOGIN.COM file): + $ PACK == "$SYS$SYSTEM:CDA$PACK.EXE" + $ UNPACK == "$SYS$SYSTEM:CDA$UNPACK.EXE" + These lines enable you to use the symbols PACK and UNPACK to invoke the + Pack and Unpack applications, respectively. + 2.4.1.5.1 Pack Application Syntax The CDA Pack application creates a single + output file that contains the contents of a .DDIF or .DTIF input file. The single + output file also includes the files that are referenced by the .DDIF or .DTIF input + file. + The format of the PACK command is as follows: + $ PACK input-file-spec output-file-spec + The following sections explain the format of the PACK command. + + input-file-spec + Specifies the name of the primary .DDIF or .DTIF input file. + + output-file-spec + Specifies the name of the output file that is created by the PACK application. If + you do not specify a device or directory, the output file is created in the current + default directory. + + Qualifiers: + + + /[NO]SKIP_MISSING + Controls whether the Pack application continues processing if it cannot find one + or more of the files that are listed as external references in the input file. The + names of any missing files are sent to SYS$ERROR when the Pack application + is completed. If you specify /NOSKIP_MISSING, the Pack application does not + create an output file if any of the externally referenced files are missing. The + default is /SKIP_MISSING. + + /[NO]CONTROLLED_COPY + Controls whether the output file includes only those external references that + specify COPY_REFERENCE as the value of the ERF_CONTROL item in the + input file. If you specify /NOCONTROLLED_COPY, the Pack application includes + all referenced files, regardless of the value of the ERF_CONTROL item. The + default is /NOCONTROLLED_COPY. + + + General User Features 2–15 + General User Features +2.4 Applications + + /ALWAYS_ENCODE + Controls whether an output file is created when there are no external references + in the input file, or if none of the externally referenced files are found. The + default is not to create an output file in these cases. If an output file is not + created for these reasons, the Pack application returns the CDA_W_NOOUTFIL + status code. + For example: + $ PACK MYFILE.DDIF TEST.PACK + 2.4.1.5.2 Unpack Application Syntax The CDA Unpack application unpacks + an input file created by the Pack application. The output files are the .DDIF + or .DTIF file that is packed by the Pack application, as well as a file for each + external reference in the .DDIF or .DTIF file. The Unpack application sends a + list of created files to SYS$ERROR. + The format of the UNPACK command is as follows: + $ UNPACK input-file-spec + The following sections explain the format of the UNPACK command. + + input-file-spec + Specifies the name of the input file that is created by the Pack application. + + Qualifier: + + + /OUTPUT=output-file-spec + Specifies the file name and location of the files created by the Unpack application. + If you specify an output file name without a directory name, the Unpack + application creates the main .DDIF or .DTIF file with the file name you specify in + the current default directory. It also creates all externally referenced files in the + current default directory. + If you specify a directory name without a file name, the Unpack application + creates the main .DDIF or .DTIF file and all externally referenced files in the + specified directory. The main .DDIF or .DTIF file has the same name as the file + packed by the Pack application. + If you specify a directory name and a file name, the Unpack application creates + the main .DDIF or .DTIF file and all the externally referenced files, in the + specified directory. The main .DDIF or .DTIF file has the file name you specify. + For example: + $ UNPACK TEST.PACK + Output file DISK$:[SMITH]MYFILE.DDIF created. + Output file DISK$:[SMITH]FIGURE_1.DDIF created. + $ UNPACK TEST.PACK/OUTPUT=[SMITH.UNPACK] + Output file DISK$:[SMITH.UNPACK]MYFILE.DDIF created. + Output file DISK$:[SMITH.UNPACK]FIGURE_1.DDIF created. + $ UNPACK TEST.PACK/OUTPUT=[SMITH.UNPACK]NEW_FILE.DDIF + Output file DISK$:[SMITH.UNPACK]MYFILE.DDIF renamed NEW_FILE.DDIF + Output file DISK$:[SMITH.UNPACK]FIGURE_1.DDIF created. + + + + +2–16 General User Features + General User Features + 2.4 Applications + + 2.4.1.5.3 Error Messages This section describes messages associated with the + CDA Pack and Unpack applications. + + FILESPEC, Missing filespec: file-name + Severity: Informational + Explanation: The Pack application cannot locate an external file included + as an external reference in the .DDIF or .DTIF file or in one of the files + referenced in the .DDIF or .DTIF file. + + NOOUTFIL, No output file was created. + Severity: Warning + Explanation: The Pack application cannot find external references in the + .DDIF or .DTIF document to be packed, and you did not specify the /ALWAYS_ + ENCODE qualifier. + + OUTFILE, Output file created: file-name + Severity: Informational + Source: CDA_UNPACK + Explanation: The Unpack application created the specified file while + unpacking a file created by the Pack application. +2.4.1.6 New CDA Viewer Error Message + V1.2 + The CDA Viewer issues the following message if it is unable to create the + application context: + + DRMCTXFAIL, DVR could not create application context, aborting + Level: Error + Explanation: The CDA Viewer ends because an attempt to create the + application context using the Resource Manager failed, which is usually + caused by insufficient memory. + User Action: Reduce the system load and start the application again. + +2.4.2 DECterm + This section describes features that pertain to the DECterm application. +2.4.2.1 New Default Font Sizes + V1.2–4 + In previous releases, the default DECterm font size for the ‘‘big’’ and ‘‘little’’ fonts + were chosen by point size. This depended on whether 75 or 100 dpi fonts were + installed first in the font path. Starting with DECwindows Motif for OpenVMS + Version 1.2–4, DECterm chooses its default fonts by pixel size. + The following table shows the two behaviors. + + Prior Releases Since Version 1.2–4 + 1 + Default Font Size (in pixels) 100 75 100 75 + Big font 25 18 18 18 + Little font 18 14 14 14 + 1 75 dpi fonts or 100 dpi fonts on a 15-inch monitor + + + + + General User Features 2–17 + General User Features +2.4 Applications + + In addition, on 100-dpi displays DECterm now uses the big font by default. This + results in DECterm using the same font size (18 pixels) on 100-dpi displays as it + did in prior releases. On displays that are less than 325 mm wide, DECterm also + now uses a bigger default font. + Follow these steps to use the same font as in previous releases (14 pixels): + 1. From the Options menu, select the Window... item. + 2. Choose Little Font. Click on Apply. + 3. If the new default font is too small, click on the Big Font button and change + the pixel size in the Other text entry field from 18 to 25. +2.4.2.2 Scrolling Using the Keyboard + V1.2–3 + You can now scroll through text using the keyboard by pressing the Ctrl key and + arrow keys or by pressing the Prev or Next key on the editing keypad. +2.4.2.3 ReGIS Input Cursors and Escape Sequences + V1.2–3 + The DECterm application supports all ReGIS input cursors: + • Crosshair + • Diamond + • Rubber-band line + • Rubber-band rectangle + For a shape other than the diamond cursor when n is equal to 1, define the + logical name DECW$TERM_REGIS_CURSOR as one of the numbers defined in + the SYS$LIBRARY:DECW$CURSOR file. + V1.2 + The following escape sequences are supported by DECterm: + • All page movement sequences (NP, PP, PPA, PPB, and PPR). + • One rectangular area operation sequence (DECCRA). + • The DECLFKC sequence. + • The ReGIS command S(C(In)) supports the rubber-band rectangle cursor and + the diamond cursor. + See Section 4.2.2.1, ReGIS Input Cursors for additional information about escape + sequences in DECwindows Motif software. + + + + +2–18 General User Features + General User Features + 2.4 Applications + +2.4.2.4 Automatic Window Positioning + V1.1 + A resource has been defined to manage repositioning a DECterm window when + a resize operation forces part of the window off the screen. If a DECterm + window is enlarged by using the Options/Window dialog box or by entering + a SET TERMINAL/PAGE=nn or SET TERMINAL/WIDTH=nn command, the + controller moves the newly resized DECterm window so that it can be viewed in + its entirety. If you prefer DECterm not to move, add the following line to your + DECW$TERMINAL_DEFAULT.DAT file: + DECW$TERMINAL.main.terminal.autoAdjustPosition: off + +2.4.3 Window Manager + This section describes features that pertain to the Motif Window Manager + application. +2.4.3.1 Overlay Support + V1.2–3 + The latest version of the Motif Window Manager (MWM) supports overlays and + utilizes additional planes of memory, which are available on some 3D graphics + accelerators. The Window Manager places borders and banners for all the + windows into these extra planes of memory and thereby reduces the number + of expose events for your applications that use overlays. + You may need to modify your existing applications that use overlays to avoid + potential problems with the colormap. HP recommends that you set up your + system to share the overlay colormap with the Window Manager, as the hardware + supports only one colormap for the overlay planes. + See the associated documentation for your 3D graphic accelerator to determine if + overlays are supported. + Setting Up the Overlay Colormap + To modify your applications to share the overlay colormap with the Window + Manager, query the server property name SERVER_OVERLAY_COLORMAPS. + When you make the query, the server returns the 32-bit value for the overlay + Colormap ID. + To set up your system to share the overlay colormap with the Window Manager, + edit the files SYS$COMMON:[VUE$LIBRARY.SYSTEM]VUE$MWM.COM and + SYS$COMMON:[SYSMGR]DECW$MWM.COM. Change the following line in each + file: + $ mwm -multiscreen + Edit this line by adding the -Overlay command-line option as follows: + $ mwm -multiscreen "-Overlay" + Note that if you create and install your own colormap, the following problems can + result: + • Colors flash on the screen when the colormap is changed. + • Border and banner colors also change when you change the colors of your + colormap. + + + + + General User Features 2–19 + General User Features +2.4 Applications + + Restrictions + The following restrictions apply when you enable the Window Manager to use + overlays: + • The Window Manager supports only single-screen systems and does not + function correctly with multiple graphics devices (multihead). + • If you select a Matte Size value other than ‘‘None’’ from the Window Manager + options list, the Matte color may not be correct; that is, the color does not + match the selection and is occasionally transparent. + • If you select ‘‘Show feedback when moving or resizing windows’’ from the + Workspace Options menu, the window with the feedback information causes + expose events. + • When you move windows by showing the outline of the window, the outline + appears to go below the window borders and banners. + • Window borders are occasionally and randomly displayed in clear or black. + If this problem occurs, select the restart option from the Workspace menu to + restart the Window Manager. + +2.5 Tools and Utilities + The following sections describe new features related to specific X Window System + utilities ported to DECwindows Motif. + +2.5.1 AccessX Keyboard Utility (accessx) + V1.3 + The AccessX Keyboard utility (accessx) is a client application that enables you to + set one or more AccessX keyboard enhancements available with the X Keyboard + extension (XKB). These enhancements make it easier for users with disabilities + to interact with workstation input devices (keyboard and mouse). + Specifically, AccessX enhancements for XKB offer the following capabilities: + • Sticky Keys – Allows you to perform multikey operations with one hand, + one finger, or a mouth stick. You can use this feature to enter certain + uppercase letters and punctuation characters without having to hold down + the Shift key. This feature also makes it easier to enter control sequences, + such as Ctrl/C. + • Mouse Keys (also known as Dead Mouse) – Lets you map actions that + you would perform with a mouse to keys on the numeric keyboard or other + keys that you specify. With this feature, you can use one finger or a mouth + stick to move the cursor to different areas of the screen, manipulate menus, + and select, cut, and paste text. + • Toggle Keys – Provides audio feedback when the Shift Lock (Caps Lock) + key is pressed. This feature helps users who might have difficulty seeing + the keyboard light indicator for the Shift Lock key or users who are using a + keyboard that does not provide light indicators for any keyboard settings. + • Repeat Keys – Allows you to adjust the auto-repeat keyboard mechanism + speed or to turn it off entirely. With this feature turned on, you can set your + keyboard so that holding down a key for a longer than average time does not + cause a repeat entry of that character. + + + + +2–20 General User Features + General User Features + 2.5 Tools and Utilities + +• Slow Keys – Makes the keys less likely to respond when brushed + accidentally. With this feature turned on, the computer accepts only + keystrokes that are held for a certain length of time. The computer ignores + light keystrokes that are held only for a moment. +• Bounce Keys – Eliminates the problem of pressing a key and then + accidentally pressing it again before moving to another key. You can set + this feature to tell the computer not to process a second pressing of a key + unless a certain length of time elapses between each pressing. +• Time Out – Shuts off the AccessX features (except for Repeat Keys) on a + workstation after a specified period of time. If you are sharing a workstation + and have set AccessX features, the settings are turned off automatically + before the next use. To retain the AccessX settings at all times, you can turn + off the Time Out feature. +The settings for these capabilities are stored as X resource specifications available +from an AccessX configuration file. This utility reads the appropriate file +(either for the client or server) and adjusts the resource settings depending upon +the changes you make. +See Section 2.5.1.1 and Section 2.5.1.2 to learn more about the configuration file +and its default values. For information about enabling and using XKB and X +Keyboard keymaps, see the HP DECwindows Motif for OpenVMS Management +Guide. +To run this utility, define accessx as a foreign command, and copy the UID file to +DECW$USER_DEFAULTS: +$ accessx :== "$DECW$EXAMPLES:ACCESSX.EXE" +$ COPY DECW$EXAMPLES:ACCESSX.UID DECW$USER_DEFAULTS:ACCESSX.UID +The command format for accessx is as follows: +$ accessx [-options...] +You can run accessx by entering the command at the DCL prompt, with or +without options. The options, described in Table 2–4, allow you to specify which +configuration file to load and choose whether to display the status of the editing +session. If no options are specified, the client configuration file is loaded by +default. + +Table 2–4 AccessX Keyboard Utility Options +Options Description +-client Instructs accessx to load and use the custom settings in the + client configuration file. This is the default option. +-server Instructs accessx to load and use the default, system-wide + settings maintained in the server configuration file. +-status Displays the status window when accessx is started. +-vmods Uses the names for virtual modifiers in the status window. For + example, with the -vmods option, accessx displays NumLock + instead of Mod5. + + +Once invoked, the accessx dialog box is displayed, which lets you select the +AccessX features that you want to enable. It also provides a test area that +allows you to preview your settings before applying them to a DECwindows Motif +session. + + + General User Features 2–21 + General User Features +2.5 Tools and Utilities + + For detailed information on the controls and menu options in the dialog box, see + the online help available from the Help menu option. +2.5.1.1 The AccessX Configuration File + The AccessX configuration file is an X resource file used to store and load specific + AccessX settings for the client. The default client configuration file is located + in DECW$USER_DEFAULTS:ACCESSX.DAT and is created the first time you + choose Save Settings. + You can choose to edit the file directly or use the accessx utility (with the -client + or -server option) to modify the settings. Note that any comments inserted in + this file are deleted when you perform a save settings action. + The format for entries in this file follow the standard X resource specification + format, which is: + *resource:value + For example: + *BounceKeysToggle.set:False + Since an application can consist of a combination of input widgets (such as, push + buttons and a scroll bar), you can use the widget class and name identifiers to + create additional resource specifications. +2.5.1.2 Default Resource Settings + Table 2–5 lists the AccessX resources and their default values. These are default + settings maintained by the server and also represent the initial settings in the + client configuration file, prior to modification. + + Table 2–5 Default AccessX Resource Settings + Resource Value + *BounceKeysToggle.set False + *EnableAccessXToggle.set True + *KRGDebounceScale.decimalPoints 1 + *KRGDebounceScale.maximum 40 + *KRGDebounceScale.minimum 1 + *KRGDebounceScale.value 3 + *KRGRepeatDelayScale.decimalPoints 2 + *KRGRepeatDelayScale.maximum 400 + *KRGRepeatDelayScale.minimum 1 + *KRGRepeatDelayScale.value 66 + *KRGRepeatRateScale.decimalPoints 2 + *KRGRepeatRateScale.maximum 400 + *KRGRepeatRateScale.minimum 1 + *KRGRepeatRateScale.value 4 + *KRGSlowKeysDelayScale.decimalPoints 1 + *KRGSlowKeysDelayScale.maximum 40 + (continued on next page) + + + + +2–22 General User Features + General User Features + 2.5 Tools and Utilities + + + Table 2–5 (Cont.) Default AccessX Resource Settings + Resource Value + + *KRGSlowKeysDelayScale.minimum 1 + *KRGSlowKeysDelayScale.value 3 + *MouseKeysToggle.set False + *MouseAccelScale.decimalPoints 1 + *MouseAccelScale.maximum 40 + *MouseAccelScale.minimum 1 + *MouseAccelScale.value 20 + *MouseDelayScale.decimalPoints 1 + *MouseDelayScale.maximum 40 + *MouseDelayScale.minimum 1 + *MouseDelayScale.value 3 + *MouseMaxSpeedScale.decimalPoints 0 + *MouseMaxSpeedScale.maximum 500 + *MouseMaxSpeedScale.minimum 1 + *MouseMaxSpeedScale.value 300 + *RepeatKeysToggle.set True + *ShowStatusToggle.set False + *SlowKeysOnAcceptToggle.set True + *SlowKeysOnPressToggle.set True + *SlowKeysToggle.set False + *SoundOnOffToggle.set True + *StickyKeysToggle.set False + *StickyModSoundToggle.set True + *StickyTwoKeysToggle.set True + *TimeOutScale.decimalPoints 0 + *TimeOutScale.maximum 10 + *TimeOutScale.minimum 1 + *TimeOutScale.value 2 + *TimeOutToggle.set False + *ToggleKeysToggle.set False + + +2.5.2 X Authority Utility (xauth) + V1.3 + The X Authority utility (xauth) enables you to manage the contents of one + or more X authority files. The X authority file contains information used to + authorize client connections to the X server. + This utility is typically used to extract authorization records from one system + and combine them with the records on another system, such as when granting + access to additional users or enabling remote logins. The actual record entries + vary depending on the authentication scheme currently in use. + + + + + General User Features 2–23 + General User Features +2.5 Tools and Utilities + + In contrast to other X Window System utilities that are available with + DECwindows Motif, xauth is included as a part of OpenVMS Alpha and + OpenVMS I64 operating systems. The xauth commands are case-insensitive + and available directly from the DCL command line, xauth command line, or from + a batch file. + The command format for xauth is as follows: + $ xauth [-f authfile] [-options...] [command] + Table 2–6 defines the available options. + + Table 2–6 X Authority Utility Options + Options Description + -f authfile Specifies the name of the X authority file. Version numbers + are not allowed. If a display device is specified on the + command line, xauth will use the X authority file referenced + by the display device. Otherwise, xauth will use the default + X authority file used by client applications. This file is + the X authority file referenced by the DECW$DISPLAY + display device, the DECW$XAUTHORITY logical, or + SYS$LOGIN:DECW$XAUTHORITY.DECW$XAUTH. + -q Specifies that xauth operate in quiet mode. Status messages + are not displayed. This is the default setting if the output from + xauth is not directed to a terminal. + -v Specifies that xauth operate in verbose mode. Status message + are printed. This is the default setting if the output from xauth + is directed to a terminal. + -i Specifies that xauth ignore file locks. Normally, xauth will + refuse to read or edit any files that have been locked by another + program (such as, by another instance of xauth) and not timed + out. + -b Specifies that xauth break file locks before proceeding. Use this + option only to clean up stale locks. + -n Specifies that xauth not interpret the host name when the list + command is used. Instead, xauth displays the literal value as it + appears in the X authority file. + + + Table 2–7 defines the available commands. + + Table 2–7 X Authority Utility Commands + Commands Description + add Adds or replaces the specified entries. + extract Extracts and writes the specified entries to a new X authority + file. + exit Saves and closes the file and exits the xauth utility. (Available + from the xauth command line only.) + remove Deletes the specified entries. + merge Appends entries from another X authority file. + nextract Extracts the specified entries in numerical format. + (continued on next page) + + + + +2–24 General User Features + General User Features + 2.5 Tools and Utilities + + + Table 2–7 (Cont.) X Authority Utility Commands + Commands Description + + nmerge Merges the specified entries presented in numerical format. + list Displays a listing of entries in the X authority file. + nlist Displays a listing of entries in numerical format. + generate Used to generate a new authorization key. Requires that + DECwindows Motif be installed and the SECURITY extension be + enabled on the X display server. The generate command creates + a key that applies to all entries with a matching IPv4 or IPv6 + host address. It is not limited to the IP address of the host used + to connect to the display server. + help Displays information about the parameters and options for this + utility. Subtopic help is also available by typing a question mark + (?) at the command prompt. + info Provides a brief overview of the X authority file. + quit Closes the xauth utility without applying any changes. + (Available from the xauth command line only.) + source Runs xauth commands from a command file. + + +2.5.2.1 The X Authority File + The X authority file is a binary data file that contains information used to + authorize connections to the X display server on a system running DECwindows + Motif Version 1.3 or higher. + Each time a client application attempts to connect to an X server system that + uses an authorization protocol, it references the current X authority file to + determine the appropriate authorization key to apply in order to authenticate + the connection. Each authorization key consists of the protocol name and token, + which can be one of the following depending on the protocol in use: + • MIT-MAGIC-COOKIE-1 + random numeric code + • MIT-KERBEROS-5 + encrypted string (cached separately) + By default, an X authority file is created automatically the first time a user + logs into a desktop on a system configured for MIT-MAGIC-COOKIE-1 or MIT- + KERBEROS-5 authentication. The file is stored in that user’s OpenVMS login + directory (SYS$LOGIN:DECW$XAUTHORITY.DECW$XAUTH). Each time the + user subsequently logs into a desktop on that system, a new authorization key is + generated, passed to the X server, and written to the user’s X authority file. This + key controls access to the X server during the DECwindows Motif session. + A separate X authority file can be manually defined on a server level (using + the DECW$SERVER_XAUTHORITY symbol) for those client applications that + require access to the X server outside of the normal DECwindows Motif login + process. + If the SECURITY extension is enabled, authorization keys can also be manually + generated. Manually-generated keys can be used to further restrict server + access. The generated key is stored in the X authority file on the client system + overwriting any value already present for the specified display server. The key + can be distributed to different client systems to allow connections to a specific + server and can be revoked to stop subsequent connections. + + + + + General User Features 2–25 + General User Features +2.5 Tools and Utilities + + Generated keys are assigned an authorization ID that associates the key with + the user who generated the key. As a result, only the user who generated the key + can revoke the key. + 2.5.2.1.1 Format of an X Authority File Entry Each entry in an X authority + file corresponds to a particular X display server and is composed of three main + components: + display-name protocol token + display-name + Identifies the name of the X display to which you are authorizing access. The + display name follows the supported display name format described in HP + DECwindows Motif for OpenVMS Management Guide: + [transport/]host:[:]server[.screen] + This format enables you to use a single X authority file to grant varying levels of + access to different X display servers and connection families. + For example, the following entries grant access to the local display server on + node HUBBUB and the remote display server on node ZEPHYR via the DECnet + transport: + local/HUBBUB:0 MIT-MAGIC-COOKIE-1 cfcc5ef98f9718f90154f355c0ae9f62 + decnet/ZEPHYR::0 MIT-MAGIC-COOKIE-1 cfcc5ef98f9718f90154f355c0ae9f62 + • [transport/] + Identifies the network transport used to connect to an X display server. + See HP DECwindows Motif for OpenVMS Management Guide for a list of + the supported transport values. If a transport value is not specified, the + default value is interpreted from the format of the remaining portions of the + display-name entry, for example: + Host address and one colon (116.94.24.187:0) (TCP/IP) + Two colons (::0 or ZEPHYR::0) (DECnet) + No host name or address and one colon (:0) (local) + • host[:] + Identifies the name of the host system where the X display server is located. + A value of 0 is interpreted as the local host, which is the default. The type + of host is determined by the transport value. See HP DECwindows Motif for + OpenVMS Management Guide for a full list of valid host name and address + formats. + • :server + Identifies the server. This value is required and must be preceded by a single + colon (:). Typically the value for a single-server system is :0. If you are + specifying a display on a multi-server system (such as when using a proxy + server), additional values may apply depending on the number of servers + in the configuration. If you have specified a display device (with the SET + DISPLAY command), the server portion of the entry is assumed from the + device specification. + • [.screen] + Identifies the screen. On OpenVMS Alpha and OpenVMS I64 systems, the + screen value is not held in the X authority file and is ignored when included + in a command. All screens on a single server have the same authorization. + + + + +2–26 General User Features + General User Features + 2.5 Tools and Utilities + + protocol + Indicates the authentication protocol in use. Valid values are MIT-MAGIC- + COOKIE-1 and MIT-KERBEROS-5. + token + A random alphanumeric string that functions as a password authorizing a server + connection. The format of the token depends on the authorization scheme in + use. MIT-MAGIC-COOKIE-1 uses a 128-bit string known as a magic cookie. + MIT-KERBEROS-5 uses an encrypted string to authorize server connections. This + string is stored separately. The token entry in the X authority file represents the + encoded location of the Kerberos keytab file and associated principal name, which + is referenced by the server to locate the encrypted string. + 2.5.2.1.2 Specifying an X Authority File By default, the X authority + file referenced by client applications and the xauth utility is defined as + SYS$LOGIN:DECW$XAUTHORITY.DECW$XAUTH. You can override this + default and specify an alternate X authority file in either of the following ways: + • You can create alternate X authority files and switch between them using + the DECW$XAUTHORITY logical. For example, the following command + changes the X authority file in use for the current DECwindows Motif session + to UNTRUSTED.DECW$AUTH: + $ DEFINE DECW$XAUTHORITY SYS$MANAGER:[SYSMGR]UNTRUSTED.DECW$XAUTH + The logical definition remains in use until it is redefined or an alternate value + is specified using the SET DISPLAY/XAUTHORITY command. + • If a display device is used to create a client connection to an X + server, you can specify an alternate X authority file using the SET + DISPLAY/CREATE/XAUTHORITY command. Note that the file specified + on this command line overrides both the default and any file referenced by + the DECW$XAUTHORITY logical. +2.5.2.2 Invoking xauth and Entering Commands + You can choose to enter commands interactively from DCL, or enter the utility + and issue commands from the xauth command line. + Note that SYS$LOGIN:DECW$XAUTHORITY.DECW$XAUTH is the default X + authority file. If you want to work with an alternate file, use the -f option on the + command line to specify the filename, as follows: + $ XAUTH -f SYS$SYSROOT:[SYSMGR]UNTRUSTED.DECW$XAUTH + Using authority file SYS$SYSROOT:[SYSMGR]UNTRUSTED.DECW$XAUTH + xauth> + Tips and Shortcuts + • If you are working with an X authority file other than the default, and plan + to enter a series of commands, use the XAUTH -f command to enter the + utility; then issue the subsequent commands from the utility command line. + Otherwise, you will need to reenter the fully-qualified filename with each + xauth command issued from the DCL command line. + • When adding a file entry, you can specify a period (.) in place of the + value MIT-MAGIC-COOKIE-1. The period is replaced by the name of the + authentication protocol. + + + + + General User Features 2–27 + General User Features +2.5 Tools and Utilities + +2.5.2.3 IPv6 Considerations + V1.5 + Note that xauth interprets certain transport values slightly different than in most + other DECwindows Motif interfaces. Table 2–8 describes how xauth interprets + each transport. + + Table 2–8 xauth Transport Actions + With this Transport + Value... xauth Commands Affect... + INET All entries in the X authority file whose host address matches + any of the IPv4 addresses associated with the same TCP/IP + host. + INET6 All entries in the X authority file whose host address matches + any of the IPv4 or IPv6 addresses associated the same + TCP/IP host. + TCPIP or TCP All entries in the X authority file as if INET or INET6 had + been specified, depending on the setting of DECW$IPV6_ + SUPPORT. + + +2.5.2.4 Accessing Online Help + To display a brief list of the available xauth commands or a summary of their + function, issue either the XAUTH ? or XAUTH HELP command. +2.5.2.5 Creating an X Authority File + Use the XAUTH -f ADD command to manually create an X authority file. + You must manually create an X authority file for the server when enabling + authentication outside of a DECwindows Motif session. You can also choose to + create additional user X authority files to store alternate authentication settings, + such as for authorizing untrusted network connections. + An X authority file name can consist of any characters currently supported by + OpenVMS; however, the file extension is restricted to a maximum of 37 characters + and version numbers are not allowed. + The -f option specifies the name of the X authority file, and the ADD command + creates the file by adding an entry. If you do not enter a fully-qualified filename, + the new X authority file is written to the current directory by default. + For example, the following command creates a new X authority file + UNTRUSTED.DECW$XAUTH to be used to authorize untrusted network + connections: + $ XAUTH -f UNTRUSTED.DECW$XAUTH ADD :0 . + cfcc5ef98f9718f90154f355c0ae9f62 +2.5.2.6 Displaying File Information + To assist with debugging file access and write issues, xauth includes a command + that displays summary information about a particular X authority file. Use the + XAUTH INFO command to display information about an X authority file, such as + the current lock status and change history. + + + + +2–28 General User Features + General User Features + 2.5 Tools and Utilities + + For example, the following command displays summary information about the X + authority file UNTRUSTED.DECW$XAUTH: + $ XAUTH -f SYS$SYSROOT:[SYSMGR]UNTRUSTED.DECW$XAUTH INFO + Authority file: SYS$SYSROOT:[SYSMGR]UNTRUSTED.DECW$XAUTH + File new: no + File locked: yes + Number of entries: 2 + Changes honored: yes + Changes made: no + Current input: command line +2.5.2.7 Viewing and Editing File Entries + Each X authority file assumes the default protections of the account and directory + in which it resides. If you have the appropriate privileges, you can view or edit + the contents of an X authority file. To ensure the appropriate level of security, + access to this file is typically limited to either the local SYSTEM account, the file + owner, or both. + + Note + When an X authority file is open for viewing or editing, one or more + lock files are created by adding -L or -C to the file extension (such as, + *.DECW$XAUTH-C). This renders the X authority file locked from further + use. When the file is closed, the lock is subsequently removed, and the + lock files deleted. + If a DECwindows Motif session is terminated abruptly, one or more locked + files can remain. Use the XAUTH command with options -b or -i to either + break or ignore the locks and gain access to the file. + + + Displaying File Entries + Use the XAUTH LIST command to display the contents of an X authority file. + For example, the following XAUTH command displays the entries in the X + authority file UNTRUSTED.DECW$XAUTH: + $ XAUTH -f UNTRUSTED.DECW$XAUTH LIST + local/ZEPHYR:0 MIT-MAGIC-COOKIE-1 cfcc5ef98f9718f90154f355c0ae9f62 + decnet/ZEPHYR::0 MIT-MAGIC-COOKIE-1 cfcc5ef98f9718f90154f355c0ae9f62 + 116.94.24.187:0 MIT-MAGIC-COOKIE-1 cfcc5ef98f9718f90154f355c0ae9f62 + + Note + TCP/IP is considered the default transport for X authority file entries. As + a result, the transport portion of the display name is assumed and not + displayed for entries that use the TCP/IP transport. + + + To limit the list to entries related to a particular display, enter the display name + at the end of the XAUTH LIST command, as follows: + $ XAUTH -f UNTRUSTED.DECW$XAUTH LIST ZEPHYR::0 + decnet/ZEPHYR::0 MIT-MAGIC-COOKIE-1 cfcc5ef98f9718f90154f355c0ae9f62 + + + + + General User Features 2–29 + General User Features +2.5 Tools and Utilities + + With the TCPIP transport, multiple addresses may correspond to the same + display name. When displaying X authority file entries, it may be difficult to + distinguish which entry applies to which address. To differentiate the entries, use + the -n qualifier to list them in numeric format, as follows: + $ XAUTH LIST + test13_2:0 MIT-MAGIC-COOKIE-1 12 + test13_2:0 MIT-MAGIC-COOKIE-1 23 + $ XAUTH -n LIST + #0006#fe800000000000000200f8fffe101905#:0 MIT-MAGIC-COOKIE-1 12 + #0000#c0a70209#:0 MIT-MAGIC-COOKIE-1 23 + Adding and Removing File Entries + Use the XAUTH ADD and XAUTH REMOVE commands to add entries to or + delete entries from an X authority file. + If you have created a display device (using the SET DISPLAY command), you can + specify the device name on the xauth command line to insert or remove entries + related to the display device. Typically, the X authority file entry for a display + device corresponds to the display server specified by the SET DISPLAY command. + However, if the SET DISPLAY command specifies that a proxy server be used, the + file entry pertains to that proxy server. + For example, the following X authority file has a single entry for the LOCAL + transport on node ZEPHYR. To use the same authorization key for the DECnet + transport and to specify that Kerberos be used when connecting to remote + node HUBBUB, you could add the following entries to the X authority file + UNTRUSTED.DECW$XAUTH: + $ XAUTH -f UNTRUSTED.DECW$XAUTH + Using authority file untrusted.decw$xauth + xauth> LIST + local/ZEPHYR:0 MIT-MAGIC-COOKIE-1 cfcc5ef98f9718f90154f355c0ae9f62 + xauth> ADD ::0 . cfcc5ef98f9718f90154f355c0ae9f62 + xauth> ADD HUBBUB::0 MIT-KERBEROS-5 "" + + xauth> LIST + local/ZEPHYR:0 MIT-MAGIC-COOKIE-1 cfcc5ef98f9718f90154f355c0ae9f62 + decnet/ZEPHYR::0 MIT-MAGIC-COOKIE-1 cfcc5ef98f9718f90154f355c0ae9f62 + decnet/HUBBUB::0 MIT-KERBEROS-5 + xauth> EXIT + Writing X authority file untrusted.decw$xauth + Client applications running on systems in the same cluster share a single X + authority file. As a result, in cluster configurations, adding an entry for the + DECnet transport to the local system grants client applications running on other + nodes in the cluster access to that system. + + + + +2–30 General User Features + General User Features + 2.5 Tools and Utilities + +To discontinue remote access to HUBBUB, you could use the XAUTH REMOVE +command to remove the entry, as follows: +$ XAUTH -f UNTRUSTED.DECW$XAUTH +Using authority file untrusted.decw$xauth +xauth> REMOVE HUBBUB::0 +1 entries removed +xauth> LIST +local/ZEPHYR:0 MIT-MAGIC-COOKIE-1 cfcc5ef98f9718f90154f355c0ae9f62 +decnet/ZEPHYR::0 MIT-MAGIC-COOKIE-1 cfcc5ef98f9718f90154f355c0ae9f62 +xauth> EXIT +Writing X authority file untrusted.decw$xauth +Copying Entries Between Files +Use one or more of the following XAUTH commands to copy entries for a +particular display from one X authority file to another. +This enables you to use an existing entry to grant another user access to a +particular display or to obtain access to a remote host from the current display +device. +• EXTRACT – Creates a new X authority file whose entries match those in the + original file. +• MERGE – Appends the contents of one file to another, replacing entries for + the same display name or adding entries for different names. +• NEXTRACT and NMERGE – These commands are designed to be used with + the PIPE command. NEXTRACT extracts file entries in a text format that + can then be used as input for the NMERGE command. + For example, the following command extracts the X authority file entry for + the local transport from the file UNTRUSTED.DECW$XAUTH and adds it to + a new X authority file NEW_XAUTHORITY.DECW$XAUTH: + $ PIPE XAUTH -f UNTRUSTED.DECW$XAUTH NEXTRACT SYS$OUTPUT :0 | - + _$ XAUTH -f NEW_XAUTHORITY.DECW$XAUTH NMERGE SYS$INPUT +These commands can also be used with the rsh command to copy entries from an +X authority file on an OpenVMS host to an X authority file on a remote UNIX +system. For example, the following command extracts the entry for TCP/IP access +(TCPIP/0:0) and adds it to the current file for user SMITH on the remote UNIX +system FLOPSY: +$ PIPE XAUTH -f UNTRUSTED.DECW$XAUTH NEXTRACT - TCPIP/0:0 | - +_$ rsh/user=smith/password=secret flopsy "xauth nmerge -" + + + + + General User Features 2–31 + General User Features +2.5 Tools and Utilities + + Note + When using the PIPE and XAUTH commands to pass information to a + UNIX host, you must press Ctrl/C to terminate the connection to the + UNIX host and return control to OpenVMS. + + +2.5.2.8 Generating Authorization Keys + When the SECURITY extension is enabled on an X display server, you can + generate additional authorization keys. Generated keys enable you to further + manage server access and control the type of operations performed over the + connection. For example, you can revoke a generated key at will, set it to expire + after a certain time period, or use it to further grant or restrict the operations (at + the X atom level) that can be performed over the connection. + Use the XAUTH GENERATE command to produce a new authorization key. Note + that the generated key overwrites any existing key for the current session. To + preserve the existing key, specify an alternate X authority file on the XAUTH + command line. + For example, the following commands specify the alternate X authority file + UNTRUSTED.DECW$XAUTH, generate and display a new key for the local + display, and write the generated key to the alternate file: + $ XAUTH -f UNTRUSTED.DECW$XAUTH + Using authority file untrusted.decw$xauth + xauth> LIST :0 + local/ZEPHYR:0 MIT-MAGIC-COOKIE-1 cfcc5ef98f9718f90154f355c0ae9f62 + xauth> GENERATE :0 + xauth> LIST :0 + local/ZEPHYR:0 MIT-MAGIC-COOKIE-1 cfcc4ff77f3709c46222c355f0ea1c93 + xauth> EXIT + Writing X authority file untrusted.decw$xauth + +2.5.3 X Keyboard Compiler Utility (xkbcomp) + V1.3 + The Keyboard Compiler utility (xkbcomp) compiles X Keyboard source files into + loadable X Keyboard layout (.XKM) files. Using xkbcomp, you can customize the + standard layouts provided with the X Window System by creating or modifying + the component source files. + For information about enabling and using XKB and X Keyboard keymaps, see the + HP DECwindows Motif for OpenVMS Management Guide. + To run this utility, define xkbcomp as a foreign command: + $ xkbcomp == "$SYS$SYSTEM:DECW$XKBCOMP" + + + + +2–32 General User Features + General User Features + 2.5 Tools and Utilities + +The command format for xkbcomp is as follows: +$ xkbcomp [-options...] input-file [output-file] + +Table 2–9 Keyboard Compiler Options +Option Description +-a Specifies that all user actions be displayed. +-C Creates a C header file during compilation. +-em1 message Prints the specified message before printing any informational + or error messages. +-emp message Prints the specified message at the start of each line of + messages. +-eml message Prints the specified message after any informational or error + messages. +-dflts Specifies that the compiler generate default values for any + missing parameters. +-I [directory] Specifies the top level directory for include statements. A + comma-separated list of multiple directories is allowed. +-l [flags] Specifies that a list of matching keymap files be displayed, where + flags can be one or more of the following options: + f: lists fully-specified filenames + h: lists hidden keymap files + l: generates a long list + p: lists partial keymap files + r: lists recursive subdirectories + The default of -l with no flags turns all options off. +-map keymap file Specifies the keymap file to compile. +-merge Merges the keymap file with the keymap currently residing on + the server. +-o file Specifies the fully-qualified name of the compiled keymap + (.XKM) file. +-optional parts Specifies optional components of a keymap file, where parts can + be any combination of: + c: compatibility map + g: geometry + k: keycodes + s: symbols + t: types + Note that errors in specifying optional components are not fatal. +-R [DIRECTORY] Specifies the directory in which the component source files are + located. +-synch Forces keymap synchronization. +-w [level] Sets the warning level for compiler errors, ranging from 0 (none) + to all (10). +-xkb Generates an X keyboard (.XKB) source file. +-xkm Generates a compiled keymap (.XKM) file. + + +For information about the keyboard components database, see the HP +DECwindows Motif for OpenVMS Management Guide. + + + + + General User Features 2–33 + General User Features +2.5 Tools and Utilities + +2.5.4 Window Dump to Print File (xpr) Utility + V1.2 + The Window Dump to Print File utility prints an X Window dump using the xpr + program. + The xpr program receives as input a window dump file produced by the Window + Dump utility (xwd) and formats it for output on the following printers: + • PostScript + • DIGITAL LN03 or LA100 + • IBM PP3812 page printer + • HP LaserJet (or other PCL printers) + • HP PaintJet + To use the xpr program, define xpr as a user-defined command: + $ xpr == "$DECW$UTILS:XPR" + You must specify an input file. The xpr program prints the largest possible + representation of the window on the output page. Options allow the user to + add headers and trailers, specify margins, adjust the scale and orientation, and + append multiple window dumps to a single output file. + Use the following command format: + $ xpr input_file [options...] + Options include: + -append filename -noff -output filename + -compact + -device {ln03 | la100 | ps | lw | pp | ljet | pjet | pjetxl} + -dump + -gamma correction + -gray {2 | 3 | 4} + -height inches -width inches + -header string -trailer string + -landscape -portrait + -left inches -top inches + -noposition + -nosixopt + -plane n + -psfig + -render type + -report + -rv + -scale scale + -slide + -split n-pages + Table 2–10 defines the available options. + + + + +2–34 General User Features + General User Features + 2.5 Tools and Utilities + + +Table 2–10 Window Dump to Print File Options +Option Description +-device devtype Specifies the device on which the file is printed. + Currently supported devices: + la100 DIGITAL LA100. + ln03 DIGITAL LN03. + ljet HP LaserJet series and other monochrome PCL + devices such as ThinkJet, QuietJet, RuggedWriter, + HP series, and HP-series printers. + pjet HP PaintJet (color mode). + pjetxl HP PaintJet XL Color Graphics Printer (color + mode). + pp IBM PP3812. + ps PostScript printer. + lw LaserWriter is equivalent to -device ps and is + provided only for backwards compatibility. + The default is PostScript. +-scale scale Affects the size of the window on the page. The PostScript, + LN03, and HP printers can translate each bit in a window + pixel map into a grid of a specified size. For example, each + bit might translate into a 3x3 grid. This would be specified by + -scale 3. By default, a window is printed with the largest scale + that will fit onto the page for the specified orientation. +-height inches Specifies the maximum height of the page. +-width inches Specifies the maximum width of the page. +-left inches Specifies the left margin in inches. Fractions are allowed. By + default the window is centered in the page. +-top inches Specifies the top margin for the picture in inches. Fractions + are allowed. +-header string Specifies a header string to be printed above the window. +-trailer string Specifies a trailer string to be printed below the window. +-landscape Forces the window to be printed in landscape mode. By + default, a window is printed so that its longest side follows + the long side of the paper. +-portrait Forces the window to be printed in portrait mode. By default a + window is printed so that its longest side follows the long side + of the paper. +-plane number Specifies which bit plane to use in an image. The default is + to use the entire image and map values into black and white + based on color intensities. +-gray Uses a 2x2, 3x3, or 4x4 gray scale conversion on a color image, + rather than mapping to strictly black and white. This doubles, + triples, or quadruples the effective width and height of the + image. +-rv Forces the window to print in reverse video. +-compact Uses run-length encoding for compact representation of + windows with white pixels. + (continued on next page) + + + + + General User Features 2–35 + General User Features +2.5 Tools and Utilities + + + Table 2–10 (Cont.) Window Dump to Print File Options + Option Description + + -output filename Specifies an output file name. + -append filename Specifies a file name previously produced by xpr to which the + window is to be appended. + -noff When specified in conjunction with -append, the window + appears on the same page as the previous window. + -split n-pages Allows the user to split a window onto several pages. This + might be necessary for very large windows that would + otherwise cause the printer to overload and print the page + in an obscure manner. + -psfig Suppresses translation of the PostScript picture to the center + of the page. + -density dpi Indicates dot-per-inch density to be used by the HP printer. + -cutoff level Changes the intensity level where colors are mapped to + either black or white for monochrome output on a LaserJet + printer. The level is expressed as percentage of full brightness. + Fractions are allowed. + -noposition Causes header, trailer, and image positioning command + generation to be bypassed for LaserJet, PaintJet and PaintJet + XL printers. + -gamma correction Changes the intensity of the colors printed by the PaintJet XL + printer. The correction is a floating-point value in the range + 0.00 to 3.00. Consult the operator’s manual to determine the + correct value for the specific printer. + -render algorithm Allows the PaintJet XL printer to render the image with + the best quality versus performance tradeoff. Consult the + operator’s manual to determine the available algorithms. + -slide filename Allows overhead transparencies to be printed using the + PaintJet and PaintJet XL printers. + + + The program contains the following limitations: + • Support for PostScript output currently cannot use the -append, -noff, or -split + options. + • The -compact option is only supported for PostScript output. It compresses + white space but not black space, so it is not useful for reverse-video windows. + • For color images, map directly to PostScript image support. + Program limitations with an LN03 printer: + • The current version of xpr can print most X Windows that are not larger than + two-thirds of the screen. + For example, the LN03 prints a large Emacs window, but fails when trying to + print the entire screen. + + + + +2–36 General User Features + General User Features + 2.5 Tools and Utilities + +• The LN03 has memory limitations that cause it to incorrectly print large or + complex windows. The two most common errors encountered are ‘‘band too + complex’’ and ‘‘page memory exceeded’’ and are described as follows: + ‘‘band too complex’’ + A window may have a particular six pixel row that contains too many + changes (from black to white to black). This causes the printer to drop + part of the line and possibly drop parts of the page. The printer flashes + the number ‘‘1’’ on its front panel when this problem occurs. A possible + solution to this problem is to increase the scale of the picture or to split + the picture onto two or more pages. + ‘‘page memory exceeded’’ + This occurs if the picture contains too much black space, or if the picture + contains complex half-tones, such as the background color of a display. + When this problem occurs, the printer automatically splits the picture + onto two or more pages. The number ‘‘5’’ may flash on its front panel. As + a possible solution to the problem, it might be necessary to either cut and + paste or to rework the application to produce a less complex picture. +Program limitations with a LA100 printer: +• The picture is always printed in portrait mode. +• The scale is ignored. +• The scale factor will be different in the horizontal and vertical directions. +Program limitations with an HP printer: +• If the -density option is not specified, 300 dots-per-inch (dpi) is assumed for + the ljet device and 90-dpi for the pjet device. The LaserJet printer supports + 300-, 150-, 100-, and 75-dpi. Consult the operator’s manual to determine the + densities supported by other printers. +• If the -scale option is not specified, the image is expanded to fit the printable + page area. +• The default printable page area is 8x10.5 inches. Other paper sizes can be + accommodated using the -height and -width options. +• Note that a 1024x768 image fits the default printable area when processed at + 100-dpi with scale=1; the same image can also be printed using 300-dpi with + scale=3, but it requires more data to be transferred to the printer. +• The xpr program may be tailored for use with monochrome PCL printers + other than the LaserJet. To print on a ThinkJet (HP 2225A) printer, invoke + xpr as follows: + xpr -density 96 -width 6.667 filename + To print black-and-white output on a PaintJet printer, invoke xpr as follows: + xpr -density 180 filename +• The monochrome intensity of a pixel is computed as 0.30*R + 0.59*G + + 0.11*B. If the computed intensity of a pixel is less than the -cutoff level, it + prints white. This maps light-on-dark display images to black-on-white hard + copy. The default cutoff intensity is 50% of full brightness. For example, + specifying -cutoff 87.5 means that a pixel will be displayed as black if the + computed intensity is less than 85% of full brightness. + + + + General User Features 2–37 + General User Features +2.5 Tools and Utilities + + • A LaserJet printer must be configured with sufficient memory to print the + image. To print a full page at 300-dpi, approximately 2 MB of printer memory + is required. + • Color images are produced on the PaintJet printer at 90-dpi. The PaintJet + is limited to 16 colors from its 330 color palette on each horizontal print + line. The xpr program issues a warning message if more than 16 colors are + encountered on a line. Xpr programs the PaintJet for the first 16 colors + encountered on each line and uses the nearest matching programmed value + for other colors on the line. + • Specifying the -rv option on the PaintJet printer causes black and white to be + interchanged on the output image. No other colors are changed. + • Multiplane images must be recorded by xwd in ZPixmap format. Single-plane + (monochrome) images may be in either XYPixmap or ZPixmap format. + • Some PCL printers do not recognize image positioning commands. Output for + these printers is not centered on the page, and header and trailer strings may + not appear where expected. + • The -gamma and -render options are supported only on the PaintJet XL + printers. + • The -slide option is not supported on LaserJet printers. + • The -split option is not supported on HP printers. + • The -gray option is not supported on HP or IBM printers. + + + + +2–38 General User Features + 3 + System Management Features + + This chapter provides information about new features and enhancements related + to DECwindows Motif system management. + +3.1 Installation and Upgrade Information + The following sections describe features that pertain to installing and upgrading + DECwindows Motif systems. + +3.1.1 DECW$STARTUP Log File + V1.5 + When you start DECwindows Motif using the command + @SYS$MANAGER:DECW$STARTUP RESTART, a startup log file is now created. + This log file records activity from the detached process that invokes DECwindows + Motif, which can be useful in diagnosing startup problems. + The name of the log file is SYS$MANAGER:DECW$STARTUP_n.LOG, where n + represents the server number. The default server number value is 0; hence, the + default filename is DECW$STARTUP_0.LOG. If you have set the server number + to a value other than 0, that value is then used in the name of the corresponding + log file. + To minimize disk space usage, the log files are purged periodically. A maximum + of three versions of a startup log file are kept on disk. + For more information on the DECwindows Motif startup procedure, see the HP + DECwindows Motif for OpenVMS Management Guide. + +3.2 Security and Authorization + The following sections describe features that pertain to maintaining system and + network security of DECwindows Motif systems. + +3.2.1 Support for ACME Subsystem + V1.6 + The Authentication and Credentials Management Extensions (ACME) subsystem + features of OpenVMS Alpha and OpenVMS I64 are now supported by + DECwindows. The following dialog boxes and screens support access checks + using ACME: + • Login dialog box (New Desktop) + • Lock Screen dialog box (New Desktop) + • Start Session dialog box (Traditional DECwindows Desktop) + • Pause Session screen (Traditional DECwindows Desktop) + + + + + System Management Features 3–1 + System Management Features +3.2 Security and Authorization + + All ACME features are supported, including intrusion detection and remote + authentication. See the HP OpenVMS Guide to System Security for a detailed + description of the ACME subsystem and its components. + +3.3 X Display Server Management + The following sections describe features that pertain to managing the + DECwindows X11 Display Server. + +3.3.1 Support for Choosing the Location of Dialogs in a Xinerama + Configuration + V1.6 + In a Xinerama configuration running the new desktop, there are some help + dialogs such as Login Screen, Login Help, Set Password, Kerberos Login and + Kerberos Help displayed in a split manner across all the displays making it + difficult to use. It is now possible to position these screens using appropriate + resources in the resource files. + The resource file and resources for each of these dialogs are: + 1. Login Screen + cde$user_defaults:[config.c]xresources.dat + Dtlogin*matte.x: + Dtlogin*matte.y: + Default Positon for Login Screen without resources in the resource + file is the screen center. + 2. Login Help + cde$user_defaults:[config.c]xresources.dat + Dtlogin*help_message.defaultPosition: False + Dtlogin*help_message.x: + Dtlogin*help_message.y: + Default Position for Login Help without resources in the resource + file is the screen center. + 3. Set Password Dialog + cde$user_defaults:[config.c]xresources.dat + Dtlogin*help_message.defaultPosition: False + Dtlogin*help_message.x: + Dtlogin*help_message.y: + Default Position for Set Password without resources in the resource + file is the screen center. + 4. Kerberos Login Dialog + cde$user_defaults:[config.c]xresources.dat + Dtlogin*help_message.defaultPosition: False + Dtlogin*help_message.x: + Dtlogin*help_message.y: + Default Position for Kerberos Login Dialog without resources in the resource + file is the screen center. + + + + +3–2 System Management Features + System Management Features + 3.3 X Display Server Management + + 5. Kerberos Help Dialog + cde$user_defaults:[config.c]xresources.dat + Dtlogin*help_message.defaultPosition: False + Dtlogin*help_message.x: + Dtlogin*help_message.y: + Default Position for Kerberos Help Dialog without resources in the resource + file is the screen center. + +3.3.2 New Parameter for Enabling IPv6 Support in the Font Server + V1.5 + A new server parameter, DECW$IPV6_FONT_SUPPORT, has been added that + controls how the TCP transport is interpreted when specifying font servers either + through use of the DECW$FONT_SERVER parameter or through the use of an + explicit font server path. In addition, the DECW$FONT_SERVER parameter now + accepts an expanded set of transport values. + To set these parameters for the server process, do the following: + 1. Edit the SYS$MANAGER:DECW$PRIVATE_SERVER_SETUP.COM file. + 2. Define both the DECW$FONT_SERVER and DECW$IPV6_FONT_SUPPORT + parameters as required. + 3. Save the file and restart the server. + DECW$FONT_SERVER + The transport options available through this parameter have been expanded + to include all valid transports, as described in the HP DECwindows Motif for + OpenVMS Management Guide. + DECW$IPV6_FONT_SUPPORT + This parameter controls the interpretation of the TCP or TCPIP transport + name in the DECW$FONT_SERVER definition and whenever a client explicitly + specifies a font server path. Set the parameter to one of the following values: + • TCP_IS_INET6 + The TCP and TCPIP transport names are interpreted as synonyms for the + INET6 transport. Using this value enables IPv6 as the default transport + between the display server and its font servers when the TCP or TCPIP + transport name is specified. Note that this setting requests the IPv6 transport + be used as a default. If the IPv6 transport is not available for the specified + node, the IPv4 transport is used. + • DISABLED + The TCP and TCPIP transport names are interpreted as synonyms for the + INET transport. This is the default value if the parameter is undefined. + Using this value sets IPv4 as the transport between the display server and its + font server when a TCP or TCPIP transport name is specified. A client can + still request the IPv6 transport by explicitly specifying the INET6 transport + in its font server path. + + + + + System Management Features 3–3 + 4 + Programming Features + + This chapter describes new features relating to application and system + programming in the DECwindows Motif environment. This includes extensions, + libraries, and functions made available as part of the X11R6.6 and X11R6.7 + implementation as well as those that are specific to the DECwindows Motif + environment. + For information on how to program X Window System applications, see the X + Window System and X Window System Toolkit (Scheifler and Gettys) series of + manuals described in the HP DECwindows Motif for OpenVMS Documentation + Overview. + +4.1 General Run-Time and Programming Environment + The following sections describe features related to general DECwindows Motif + programming environment. + +4.1.1 Multithreading Support + V1.3 + DECwindows Motif now supports multithreaded client applications. Client + applications that use the HP POSIX Threads Library or HP Ada tasks are now + fully supported in the DECwindows Motif Version 1.3 or higher environment. + Additionally, each of the following libraries are now fully thread-safe, supporting + simultaneous calls from multiple threads: + X Library (Xlib) + X Toolkit Intrinsics (Xt) + X Window System Extensions library + Inter-Client Exchange (ICE) library + X Session Management Protocol (XSMP) library + +4.1.2 Binary Compatibility + V1.3 + Client applications linked against previous versions of DECwindows Motif are + binary compatible, with the exception of those applications that use any changed + or retired Xlib entry points documented in this manual and the HP DECwindows + Motif for OpenVMS Release Notes. + + + + + Programming Features 4–1 + Programming Features +4.1 General Run-Time and Programming Environment + + Existing applications require recompilation against the X11R6.6-compatible X + Window System libraries if they produce a shared image potentially used by other + multithreaded applications and that image uses: + • Any of the following macros defined in DECW$INCLUDE:XLIBINT.H and is + intended for use in a multithreaded environment: + LockDisplay + UnlockDisplay + LockMutex + UnlockMutex + • The ConnectionNumber macro or XConnectionNumber function and assumes + the return value is an event flag. + Note that recompiling unmodified applications (those that use the previous + version of the CompositeClassExtensionRec structure) against the updated + library functions may generate Xt warning messages. +4.1.2.1 Use of Asynchronous System Traps (ASTs) + In the past, DECwindows Motif supported application calls from user-mode and + normal-mode AST handlers. With DECwindows Motif Version 1.3 and higher, + applications calls from AST handlers are only supported for existing, unmodified + applications (compiled against the X11R5 libraries). + New applications compiled against the X11R6.6 libraries should not call + functions (other than XtNoticeSignal) from AST handlers even in single-threaded + environments. + Applications compiled against the updated libraries should either use multiple + threads if a higher level of concurrency is required or call XtNoticeSignal so that + AST events are processed in the Xt main loop. +4.1.2.2 Levels of Thread Safety and Concurrency + New and existing DECwindows Motif shared images can be grouped according to + the following levels of thread safety: + • Thread-safe–The image can be called concurrently from multiple threads. + • Thread-aware–The image can be used in an application that includes + multiple threads. However, the application code must avoid making + concurrent calls to the image, typically by using a global lock. + • Thread-unsafe–The image cannot be used in any application that has + multiple thread support enabled. + Table 4–1 shows the current thread safety level for each of the DECwindows + Motif shared images. Note that all images in the Translated Image Environment + are thread-unsafe. + + Table 4–1 Level of Thread Safety for DECwindows Motif Images + Image Level of Thread Safety + DECW$AILSHR.EXE unsafe + DECW$AILSHRR5.EXE unsafe + (continued on next page) + + + + +4–2 Programming Features + Programming Features + 4.1 General Run-Time and Programming Environment + + +Table 4–1 (Cont.) Level of Thread Safety for DECwindows Motif Images +Image Level of Thread Safety + +DECW$BKRSHR.EXE aware +DECW$BKRSHR12.EXE aware +DECW$D2DXLIBSHR.EXE aware +DECW$DWTLIBSHR.EXE aware +DECW$DXMLIBSHR.EXE aware +DECW$DXMLIBSHR12.EXE aware +DECW$ICELIB.EXE safe +DECW$LCNLIBSHR.EXE safe +DECW$MAILSHR.EXE unsafe +DECW$MAILSHR12.EXE unsafe +DECW$MRMLIBSHR12.EXE aware +DECW$PRINTWGTSHR.EXE aware +DECW$SMSHR.EXE safe +DECW$TERMINALSHR.EXE aware +DECW$TERMINALSHR12.EXE aware +DECW$XEXTLIBSHR.EXE safe +DECW$XLIBSHR.EXE safe +DECW$XMLIBSHR.EXE aware +DECW$XMLIBSHR12.EXE aware +DECW$XMULIBSHR.EXE aware +DECW$XMULIBSHRR5.EXE aware +DECW$XTLIBSHRR5.EXE safe +DECW$XTRAPLIBSHR.EXE aware +DECW$XTRAPLIBSHRR5.EXE aware +DECW$XTSHR.EXE aware + + +In addition to thread safety, the updated libraries offer varying levels of +concurrency when called from multiple threads: +• Xlib and X Window System Extension libraries + For most operations, Xlib and X Window System Extension libraries allow a + single concurrent operation on each display connection. If XOpenDisplay is + called twice to open two separate server connections, both connections can + be operated upon at the same time. However, there are a few operations for + which a global lock is needed to prevent corruption of global data. + Note that XSelectAsyncInput and XSelectAsyncEvent are not supported if + multithreading has been enabled by a call to XInitThreads. In general, use of + XSelectAsyncEvent and XSelectAsyncInput is discouraged since they are non- + standard functions. The equivalent functionality can be obtained by using + threaded Xlib functions. +• Xt library + For most operations, Xt allows a single concurrent operation on each + application context. There are a few operations for which a global lock is + needed to prevent corruption of global data. + + + Programming Features 4–3 + Programming Features +4.1 General Run-Time and Programming Environment + + • ICE and XSMP libraries + ICE and XSMP operations allow a single concurrent operation on each ICE + connection. + • Transport library + The transport library is used to communicate between the client application + and the X server and between multiple client applications that use the ICE + library. The final level of the transport code (which can communicate via + global sections, DECnet, or TCP/IP) executes in OpenVMS inner mode, and as + a result is serialized by the operating system. + Running on only one kernel thread at a time, this code temporarily blocks + all other kernel threads making OpenVMS system calls that execute in + inner mode. However, whenever the transport code is blocked, such as when + waiting for a connection to open or for a reply to arrive, it is blocked at user + mode allowing other threads to execute and use the transport. +4.1.2.3 Enabling Support for Multithreading + To enable multithreading, a client application must include initial calls to the + multithreading functions in Table 4–2. The specific functions called by the + application depend on the shared image(s) in use. + + Table 4–2 Multithreading Functions + Function In Image Enables Multithreading For + DECW$LCN_ DECW$LCNLIBSHR Transport Interface + THREAD_INIT + IceInitThreads DECW$ICELIB ICE and XSMP + XInitThreads DECW$XLIBSHR Xlib and X Extensions + XtToolkitThreadInitialize DECW$XTLIBSHRR5 Xt + + + Note that IceInitThreads and XInitThreads implicitly call DECW$LCN_ + THREAD_INIT. The interface to DECW$LCN_THREAD_INIT is described in + Section 4.9.2. + These functions have no arguments and return a success status upon successful + initialization. To ensure successful initialization, be sure to: + • Link the image with threads. + • Verify there is adequate process memory. + • Issue the initialization call prior to making any other call. + In addition to calling one of the multithreading functions, a client application + must also be linked against the POSIX Threads Library. For example: + $ LINK THREAD_ICO/THREADS SYS$INPUT/OPT + SYS$LIBRARY:DECW$XLIBSHR/SHARE + SYS$LIBRARY:PTHREAD$RTL/SHARE + Explicit links against the threads library are not required if the application calls + POSIX thread functions (such as, pthread_create). + + + + +4–4 Programming Features + Programming Features + 4.1 General Run-Time and Programming Environment + +4.1.2.4 Developing Applications with Thread-Aware Images + If a thread-aware image is used in a multithreaded application, the image must + not accept concurrent calls nor make calls to other images that could change the + state of the thread-aware image. + Note that if a thread-aware application uses the XtAppMainLoop or XtMainLoop + function for dispatch handling, calls to the image will be made from callback + functions. Xt makes these callbacks with an exclusive lock held on the application + context. To avoid conflicts and deadlocks, applications that use a thread-aware + image should include calls to XtAppLock before and XtAppUnlock after each call, + or sequence of calls, to the image. The application must also call XtProcessLock + and XtProcessUnlock to protect the thread-aware image against changes made by + Xt to process global data. + In the following example, an application contains a background thread that + constantly checks for error situations and displays an error message when a + problem occurs. The main program thread first initializes thread support, creates + the application context, creates the background thread, and then enters the + Xtmain loop: + static XtAppContext app_context; + int main () + { + . + . + . + MrmInitialize (); + XInitThreads (); + XtToolkitThreadInitialize(); + XtToolkitInitialize(); + app_context = XtCreateApplicationContext(); + . + . + . + pthread_create (&thread, 0, backgroundCode, 0); + . + . + . + XtAppMainLoop(app_context) + } + Code for the background thread is as follows: + void* backgroundCode (void* data) + { + . + . + . + if (problem_detected) + { + XtAppLock (app_context); + XtProcessLock(); + if (! dlog ) dlog = XmcreateWarningDialog (...); + XtManageChild(dlog); + XSync(display, 0); + XtProcessUnlock(); + XtAppUnlock(app_context); + } + . + . + . + } + + + + Programming Features 4–5 + Programming Features +4.1 General Run-Time and Programming Environment + + Callbacks for handling the main events of the application do not require changes + for multithreading, since they are called with the application context already + locked. + Worker Threads + Each of the DECwindows Motif libraries can create worker threads to support + multithreading. These threads are identified by their name, which begins with + the string DECW$. + Worker threads typically operate at an elevated priority to prevent task inversion, + where a high-priority application thread is waiting for the worker thread to + complete its operation. Note that worker threads are typically used for short + duration tasks, such as responding to an internal AST or sending a status + broadcast to all threads waiting for a particular activity. + Upcalls and Kernel Threads + In general, DECwindows Motif supports client applications either with or without + upcalls or multiple kernel threads enabled. However, to avoid problems with + priority inversion, HP recommends that upcalls be enabled for all applications + that use XtAppAddInput. If upcalls cannot be enabled, then HP recommends + assigning the same priority to all threads that use DECwindows Motif. + For example, an application calls XtAppAddInput to request a response to an + OpenVMS event flag. The worker thread executes a SYS$WFLOR system call to + wait for the event flag. Without upcalls enabled, this thread remains available + even though there is no event flag set. And as a result, lower priority threads + would not be scheduled. + Cancellation Points + Although some calls in the thread-safe libraries include cancellation points, the + action of canceling threads that are executing DECwindows Motif functions is not + supported. Canceled threads may hold locks, which can block other threads. + Multiple Application Contexts + Note that multiple application contexts should not be used with multiple threads + and thread-aware images. Thread-aware images may contain process global data + that requires a single lock to control the data. However, multiple calls to thread- + aware images may be made from Xt event handling functions prior to acquiring + the lock. + +4.2 Application Programming + The following sections describe features related to application programming. + +4.2.1 CDA Programming + This section describes features and changes related to CDA programming. +4.2.1.1 Changes to the CDA Programming Interface + V1.2 + This section describes the changes to the programming interface for this version + of CDA Run-Time Services. + This version provides a new set of header files that define CDA constants, types, + and routines using portable naming conventions. By using these new naming + conventions, you can use a wider variety of C compilers to minimize the amount + of system-specific code in your CDA applications. + + + +4–6 Programming Features + Programming Features + 4.2 Application Programming + + The names of the new set of header files are the same as the names of the + previous set of header files, except that the dollar sign ( $ ) has been removed. + For example, the cda$msg.h include file is now called cdamsg.h. Other examples + include the following: The DDIF$K_DSC_MAJOR_VERSION symbol is now + declared as DDIF_K_DSC_MAJOR_VERSION, and the CDA$_NORMAL status + value is now defined as CDA_NORMAL. + The previous set of header files is also included in this version, but these files will + no longer be updated. Changes introduced since the release of DECwindows Motif + Version 1.1 (for example, the new definitions for audio support), are available only + in the new set of header files. To use the new CDA features, change the file + names in your source code. + The new set of header files supplements the previous set of header files. If you + want to write ANSI-compliant applications using CDA definitions and CDA + Toolkit calls, use the new set of header files. However, you can continue to use + the header files that define symbols containing the dollar sign ($) provided you + choose a non-ANSI compilation mode. + By using the previous set of header files, you can successfully build existing + source code that uses the previous naming conventions. + See Table 4–3 for a list of new header file names. + + Table 4–3 New Header File Names + Previous Name New Name + cda$def.h cdadef.h + cda$msg.h cdamsg.h + ddif$def.h ddifdef.h + dtif$def.h dtifdef.h + cda$ptp.h cdaptp.h + cda$typ.h cdatyp.h + dvr$msg.h dvrmsg.h + dvr$cc_def.h dvrccdef.h + dvr$cc_ptp.h dvrccptp.h + dvr$decw_def.h dvrwdef.h + dvr$decw_ptp.h dvrwptp.h + + +4.2.1.2 Changes to CDA External Reference Processing + V1.2 + CDA Run-Time Services supports relative file specifications for external + references. Relative references are also supported: that is, a reference where + the directory path is not fully specified but is relative to the directory path of the + parent document. + + + + + Programming Features 4–7 + Programming Features +4.2 Application Programming + +4.2.1.3 Restructuring CDA Shareable Images + V1.2 + The CDA Viewer includes two shareable images to allow installation on systems + where DECwindows is not installed. + In DECwindows Motif for OpenVMS Version 1.2 software, shareable images that + use the X services were renamed. Table 4–4 lists the shareable images in the + various versions of the CDA Viewer. + + Table 4–4 Names of Shareable Images + CDA Version Image Name Description + Version 1.6 CDA$ACCESS CDA Run-Time Services shareable image. + DDIF$VIEWSHR Callable viewer widget. + Version 1.7 CDA$ACCESS CDA Run-Time Services shareable image. + DDIF$VIEWSHR The DDIF$DECW_VIEWSHR widget is + DDIF$DECW_ a callable viewer widget that uses the + VIEWSHR LIB$FIND_IMAGE_SYMBOL routine + DDIF$CC_VIEWSHR to invoke the DDIF$DECW_VIEWSHR + (DECwindows interface) and DDIF$CC_ + VIEWSHR (character-cell interface) + widgets. + Version 1.8A or CDA$ACCESS CDA Run-Time Services shareable image. + later + DDIF$VIEWSHR12 The DDIF$VIEWSHR12 widget is + a callable viewer widget that uses + LIB$FIND_IMAGE_SYMBOL to invoke the + DDIF$DECW_VIEWSHR12 (DECwindows + interface) and DDIF$CC_VIEWSHR + (character-cell interface) widgets. + + + By using the LIB$FIND_IMAGE_SYMBOL routine to reference the entry points + to the DDIF$DECW_VIEWSHR, DDIF$DECW_VIEWSHR12, and DDIF$CC_ + VIEWSHR images, an application can dynamically determine whether it can + execute in a given environment. The DDIF$VIEW.EXE application now replaces + this routine. + The previous DDIF$VIEWSHR.EXE shareable image is still included to maintain + compatibility with applications linked against it. However, new applications (and + previous applications that take advantage of new features) should use the new + shareable images. + +4.2.2 DECterm Programming + This section describes features and changes related to DECterm programming. +4.2.2.1 ReGIS Input Cursors + V1.2–3 + DECterm supports the following input cursors: cross-hair, rubber-band line, + diamond, and rubber-band rectangle. To select input cursors use the S(C(In)) + command. Table 4–5 shows the values of n. + + + + +4–8 Programming Features + Programming Features + 4.2 Application Programming + + + Table 4–5 ReGIS Input Cursors—Cursor styles and Values + Cursor Style Variable n + Cross-hair Omitted + Cross-hair (default) 0 + Diamond 1 + Cross-hair 2 + Rubber-band line 3 + Rubber-band rectangle 4 + + + Note + If a shape other than the diamond cursor is desired when n is equal to 1, + define the logical name DECW$DECTERM_REGIS_CURSOR to be one of + the numbers defined in the SYS$LIBRARY:DECW$CURSOR.H file. + + +4.2.2.2 Page-Movement Escape Sequences + V1.2 + The following page-movement escape sequences are implemented in DECterm: + NP Pn U Next Page + PP Pn V Previous Page + PPA Pn P Page Position Absolute + PPB Pn R Page Position Backward + PPR Pn Q Page Position Relative + Note that ‘‘Pn’’ is the number of pages to move; the exception is PPA, where ‘‘Pn’’ + is the actual page number. + + Note + DECterm does not support cursor coupling; the cursor is always bound to + the current (displayed) page. + + + +4.3 OSF/Motif Toolkit (Xm) Programming + The following sections contain features related to OSF/Motif Toolkit (Xm) + programming. + +4.3.1 Drag-and-Drop Enabled Widgets + V1.2 + The drag-and-drop feature lets you move or copy information between widgets. + This feature is provided primarily for programmers to incorporate the feature + into their applications. + All DECwindows Motif for OpenVMS Version 1.2 and higher applications support + the drag-and-drop feature, with the exception of Notepad. DECwindows Mail + supports drag-and-drop in all windows except the main message area, where + DECwindows Mail has its own drag-and-drop feature; you can use MB2 to move + messages around with the SVN interface. + + + + Programming Features 4–9 + Programming Features +4.3 OSF/Motif Toolkit (Xm) Programming + + Drag-and-drop functionality has been implemented in the widgets listed in + Table 4–6. + + Table 4–6 Drag-and-Drop Widgets + Widget Drag Operation Drop Operation + XmText copy and move copy and move + XmTextField copy and move copy and move + XmLabel copy + XmPushButton copy + XmToggleButton copy + XmList copy + + + For information about how to include additional drag-and-drop functionality + in applications and for an example of a drag-and-drop program, see the Open + Software Foundation: OSF/Motif Programmer’s Guide, Revision 1.2 manual. + +4.4 HP Extensions to Motif (DXm) Programming + The following sections describe features related to HP (Digital) Extensions to + Motif (DXm) programming. + +4.4.1 SVN Widget Supports Extended Selection + V1.2–6 + The Structured Visual Navigation (SVN) widget now allows users to extend a + range of selection using the Shift+Down-Arrow key sequence. Note that this + change has also been applied to the sample program SVNMSAMPLE.C. + +4.4.2 DXmCSText Input Method Support + V1.2 + X11R5 input method support was added to the DXmCSText widget. Specify input + methods using the vendor shell XmNinputMethod resource. However, to maintain + backward compatibility, the existing input method resources DXmNinputMethod + and DXmNinputMethodType are still available. + + + + +4–10 Programming Features + Programming Features + 4.5 X Toolkit Intrinsics (Xt) Programming + +4.5 X Toolkit Intrinsics (Xt) Programming + The following sections describe features related to the X Toolkit Intrinsics (Xt). + +4.5.1 New Functions Available with X11R6.6 Upgrade + V1.3 + The following functions from X11R6.6 have been added to Xt. + + Table 4–7 New Xt Functions Supported for X11R6.6 + Function Name Description + XtAppAddBlockHook Registers a block hook procedure. + XtAppAddSignal Registers a signal callback. + XtAppGetExitFlag Supports controlled exit from main loop in a + multithreaded application by returning the flag set + by XtAppSetExitFlag. + XtAppLock Locks the application context in a multithreaded + application. + XtAppSetExitFlag Supports controlled exit from main loop in a + multithreaded application by setting a flag in the + application context. + XtAppUnlock Releases an application context lock. + XtCancelSelectionRequest Cancels a multiple selection request. + XtChangeManagedSet Simultaneously removes from and adds to the + geometry managed set of a composite widget. + XtCreateSelectionRequest Adds to a multiple selection request. + XtDispatchEventToWidget Dispatches an event to a specified widget. + XtGetClassExtension Locates a class extension record of an object class. + XtGetDisplays Lists the open displays associated with an application + context. + XtGetKeyboardFocusWidget Determines which widget would be the end result of + keyboard event forwarding for a keyboard event on a + specified widget. + XtGetSelectionParameters Gets target parameters needed to perform a selection + conversion. + XtHooksOfDisplay Retrieves the hook registration object for the specified + display. + XtInsertEventTypeHandler Registers an event handler procedure by event type. + XtIsSessionShell Widget subclass verification function for the session + shell widget. + XtLastEventProcessed Retrieves the last event processed by XtDispatchEvent. + XtNoticeSignal Notifies the X Toolkit that a signal has occurred. + XtOpenApplication Convenience function to initialize intrinsics, create an + application context, open a display connection, and + create an application shell. + XtProcessLock Locks the X Toolkit process lock. + XtProcessUnlock Releases the X Toolkit process lock. + (continued on next page) + + + + + Programming Features 4–11 + Programming Features +4.5 X Toolkit Intrinsics (Xt) Programming + + + Table 4–7 (Cont.) New Xt Functions Supported for X11R6.6 + Function Name Description + + XtRegisterDrawable Associates a drawable with a widget so that the + drawable receives events as if part of the widget. + XtRegisterExtensionSelector Registers a procedure to receive extension events for a + widget. + XtRemoveBlockHook Discontinues use of a block hook procedure. + XtRemoveEventTypeHandler Removes a registration created by + XtInsertEventTypeHandler. + XtRemoveSignal Removes a registered signal callback. + XtReleasePropertyAtom Releases a reservation made by + XtReservePropertyAtom. + XtReservePropertyAtom Reserves a unique atom for selection requests on a + widget. + XtSendSelectionRequest Sends a multiple selection request. + XtSessionGetToken With the new session shell widget, gets an additional + token for a save callback response with a deferred + outcome. + XtSessionReturnToken Returns a token obtained using XtSessionGetToken + when checkpoint processing is complete. + XtSetEventDispatcher Registers the event dispatcher procedure for events of + the specified type. + XtSetSelectionParameters Associates target parameters with a selection. + XtToolkitThreadInitialize Initializes multithreaded support. + XtUnregisterDrawable Removes an association set by XtRegisterDrawable. + XtVaOpenApplication Convenience function to initialize intrinsics, create an + application context, open a display connection, and + create an application shell. + + + In addition, two new variables are provided in support of the new session shell + widget: + sessionShellClassRec + sessionShellWidgetClass + See the X Toolkit Intrinsics - C Language Interface, X Window System, X Version + 11 Release 6.4 specification available from X.Org for detailed information about + each of these functions and variables. + +4.5.2 Support for Easy Resource Configuration + V1.3 + Setting and changing resources in X Window System applications can be difficult + for both the application developer and the end user. Resource Configuration + Management (RCM) addresses this problem by changing the X Intrinsics to + immediately modify a resource for the specified widget and each child widget in + the hierarchy. As a result: + • No sourcing of resource files is required. + • The application does not need to be restarted for the new resource values to + take effect. + + + +4–12 Programming Features + Programming Features + 4.5 X Toolkit Intrinsics (Xt) Programming + + • The change occurs immediately. + RCM was made available as part of the X11R6.4 release and is now available + with DECwindows Motif Version 1.3. However, note that RCM is not a standard + part of the X Toolkit Intrinsics. It is neither an X Consortium standard nor part + of the X Window System specifications. As a result, there are currently no public + customization tools that take advantage of this feature. + If you are interested in learning more about RCM, see the X Toolkit Intrinsics - + C Language Interface, X Window System, X Version 11 Release 6.4 Release Notes + available from X.Org. + +4.5.3 New Option for CompositeClassExtensionRec + V1.3 + With X11R6, some modifications were made to the widget internals, as described + in the X Window System Toolkit manual. + In particular, a new option in the Composite Class extension record enables you + to make bundled changes to the managed set of a Composite widget. Widgets + that define a change-managed procedure that performs additions and deletions + to the managed set of children in a single invocation should set allows_change_ + managed_set option to TRUE in the extension record. + For more information about the impact this new option may have on existing + applications, see the HP DECwindows Motif for OpenVMS Release Notes. + +4.5.4 New Default Format for XtResolvePathname + V1.2–6 + In XtResolvePathname, the default pathname is required to have certain + properties when either no other path information is present in the call, or + when it is referenced by the environment variable XFILESEARCHPATH. The + former default OpenVMS format of the pathname consisted of a type-name-suffix + substitution. The modified pathname now reflects the 6-part fallback, as specified + by X11 Release 6. + The new pathname behavior is enabled by setting the DECW$VSW_COMPLIANT + variable, as follows: + $ DEFINE DECW$VSW_COMPLIANT 1 + +4.5.5 XtAppMainLoop Routine + V1.2–5 + Previously, if a program entered its event loop, (for example, by calling + XtAppMainLoop) without having opened a display or specified a timer or event + flag for the program to wait for (by calling XtAppAddTimeout or XtAppAddInput), + Xlib terminated the program with the following error message: + X Toolkit Error: Error in XMultiplexInput + Starting with DECwindows Motif for OpenVMS Version 1.2–5, if there is nothing + to wait for, Xlib stalls waiting for input instead of terminating with an error + status. + + + + + Programming Features 4–13 + Programming Features +4.5 X Toolkit Intrinsics (Xt) Programming + + To allow Xlib to process events at a later time, applications should provide some + means of regaining control, such as specifying an event flag (on DECwindows + Motif for OpenVMS Version 1.2–6 and previous systems) or a logical connection + number (on DECwindows Motif Version 1.3 and higher systems) by calling + XtAppAddInput. + +4.6 X Window System Library (Xlib) + The following sections describe features related to X Window System library + (Xlib). + +4.6.1 IPv6 Considerations + V1.5 + The Xlib library now supports both IPv4- and IPv6-compliant transport names + discussed in HP DECwindows Motif for OpenVMS Management Guide. + The XOpenDisplay function cannot be called from a user-mode AST when IPv6 + support is enabled. This function uses the TCP/IP Services getaddrinfo function + which is not supported in user-mode ASTs. If your program must use the + XOpenDisplay function from within a user-mode AST, you must ensure that the + program is run in an environment where the DECW$IPV6_SUPPORT logical is + defined as ‘‘DISABLED’’. + +4.6.2 New Functions Available with X11R6.6 Upgrade + V1.3 + As part of the core system upgrade to X11R6.6, the following functions listed in + Table 4–8 have been added to the X Window System Library (Xlib). Note that all + functions are included in the current version of the DECW$XLIBSHR image. + + Table 4–8 New Xlib Functions Supported for X11R6.6 + Function Name Description + _XAllocTemp Thread-safe allocation of scratch data space for use by + extension writers. + _XFreeTemp Frees the scratch data space allocated by _XAllocTemp. + XCloseOM Closes the specified output method. + XcmsSetCCCOfColormap Sets the color conversion context for the specified + colormap. + XAddConnectionWatch Establishes a watch procedure callback for when + internal connections are opened or closed. + XConvertCase Obtains the uppercase and lowercase forms of a + KeySym. + XContextualDrawing Indicates whether text drawn with the current font set + includes context-dependent drawing. + XCreateOC Creates an output context within the specified output + method. + XDestroyOC Destroys an output context. + XDirectionalDependentDrawing Indicates whether the drawing functions implement + text directionality. + (continued on next page) + + + + +4–14 Programming Features + Programming Features + 4.6 X Window System Library (Xlib) + + + Table 4–8 (Cont.) New Xlib Functions Supported for X11R6.6 + Function Name Description + + XDisplayOfOM Returns the display associated with the specified + output method. + XESetBeforeFlush Defines a procedure that will be called just before data + is sent to the X server. + XExtendedMaxRequestSize Returns the maximum request size using extended + length encoding (the BIG-REQUESTS extension). + XGetAtomNames Returns the names associated with the specified X + atoms. + XGetOCValues Obtains the current output context values. + XGetOMValues Obtains the current output method values. + XInitThreads Initializes support for multiple threads. + XInternalConnectionNumbers Returns a list of the internal connections open for a + specified display. + XInternAtoms Returns atoms for an array of names. + XLocaleOfOM Returns the locale associated with the specified output + method. + XLockDisplay Locks a display to protect against concurrent access + from multiple threads. + XOMOfOC Returns the output method associated with the + specified output context. + XOpenOM Opens an X output method for the specified locale and + modifiers. + XProcessInternalConnection Processes input available on an internal connection. + XReadBitmapFileData Reads a bitmap from a file and returns it as data. + XRegisterIMInstantiateCallback Registers an input method callback. + XRemoveConnectionWatch Removes a watch procedure established by + XAddConnectionWatch. + XSetOCValues Specifies one or more output context values. + XSetOMValues Specifies one or more output method values. + XUnlockDisplay Removes a lock established by XLockDisplay. + XUnregisterIMInstantiateCallback Unregisters an input method instantiation callback. + + + See the Xlib - C Language X Interface, X Consortium Standard, X Version 11, + Release 6.4 specification available from X.Org for detailed information about each + of these functions. + +4.6.3 Updated Client-Side Extension Library + V1.3 + The client-side extension library (DECW$XEXTLIBSHR) has been updated + to support multithreading and new header files for the following extensions + available as part of the upgrade to X11R6.6: + • Application Group (XC-APPGROUP) + • Colormap Utilization Policy (TOG-CUP) + • Extended Visual Information (EVI) + + + + Programming Features 4–15 + Programming Features +4.6 X Window System Library (Xlib) + + • Low-Bandwidth X (LBX) + • Security (SECURITY) + • Synchronization (SYNC) + • X Double Buffer (DBE) + • XINERAMA (formerly PanoramiX) + • X Print (Xp) + All extensions in the library (new and existing) have been made thread-safe + (as described in Section 4.1.1). In addition, the minor version of the library + has been updated from 2,2 to 2,3 to prevent images linked against the updated + DECW$XEXTLIBSHR from loading the incorrect version of the library. + Also, function names longer than 31 characters have been replaced by macro + definitions compatible with the current version of the OpenVMS Linker. + See Section 4.7.1 for an overview of each of these extensions. For instructions on + how to link to this library, see Section 4.6.9. + +4.6.4 Support for LCNs + V1.3 + Xlib now provides an alternate means of obtaining connection numbers for + connections to DECwindows Motif Version 1.3 or higher servers. The logical + connection number (LCN) interface was specifically designed to support the + communication needs of X11R6 systems and is intended as a replacement for the + EFN mechanism. + The following functions and macros are designed for use with the new LCN + interface: + • XAddConnectionWatch function (registers watch procedure) + • XInternalConnectionNumbers function + • XConnectionNumber function + • ConnectionNumber macro + These Xlib functions and macros are described in the Xlib - C Language X + Interface, X Consortium Standard, X Version 11, Release 6.4 specification available + from X.Org. + Note for compatibility with DECwindows Motif for OpenVMS Version 1.2–6 + and earlier clients, the existing event flag mechanism remains unchanged, + and the XtAppAddInput function accepts both EFNs and LCNs. However, HP + recommends that new applications, in particular ones that use multithreading, + use LCNs. When Xlib has multithreading enabled, EFNs are not available. If a + multithreaded application uses EFNs without multithreading enabled in Xlib, the + EFN should be restricted to a single thread–the same thread used for all X calls. + For more information about the LCN interface and its available routines, see + Section 4.9.2. + + + + +4–16 Programming Features + Programming Features + 4.6 X Window System Library (Xlib) + +4.6.5 Updated X11 Environment Variable Parsing + V1.3 + Xlib now accepts the equivalent X11 Release 6 (X11R6) POSIX-compliant forms of + the following environment variables: + + OpenVMS Form X11R6 Form + DECW$DISPLAY DISPLAY + DECW$RESOURCE_NAME RESOURCE_NAME1 + 1 Also requires the symbol DECW$VSW_COMPLIANT. + + + + On connection to the X display server, Xlib checks the variable name. If the + OpenVMS variable is not defined, Xlib checks for the X11R6 equivalent before + returning a status value. + +4.6.6 Additional Non-C Language Bindings Available with X11R6.6 + Non-C language bindings (such as Fortran and Pascal) for the following Xlib + functions have been added to DECwindows Motif Version 1.3. These bindings are + in addition to those documented in the DECwindows Motif for OpenVMS Guide to + Non-C Bindings. + X$CLOSE_OM + X$CONTEXTUAL_DRAWING + X$CONVERT_CASE + X$DESTROY_OC + X$DIRECTIONAL_DEPENDENT_DRAWING + X$DISPLAY_OF_OM + X$EXTENDED_MAX_REQUEST_SIZE + X$INIT_IMAGE + X$INIT_THREADS + X$INTERNAL_CONNECTION_NUMBERS + X$LOCALE_OF_OM + X$LOCK_DISPLAY + X$OPEN_OM + X$PROCESS_INTERNAL_CONNECTION + X$REGISTER_IM_INSTANTIATE_CB + X$SET_AUTHORIZATION + X$UNLOCK_DISPLAY + X$UNREGISTER_IM_INSTANTIATE_CB +4.6.6.1 CLOSE OM + OpenVMS Format + status_return = X$CLOSE_OM + (om) + Argument Information + Argument Usage Data Type Access Mechanism + status_return longword longword write value + om identifier uns longword read reference + + + + + Programming Features 4–17 + Programming Features +4.6 X Window System Library (Xlib) + +4.6.6.2 CONTEXTUAL DRAWING + OpenVMS Format + status_return = X$CONTEXTUAL_DRAWING + (font_set) + Argument Information + Argument Usage Data Type Access Mechanism + status_return cond_value longword write value + font_set identifier uns longword read reference + +4.6.6.3 CONVERT CASE + OpenVMS Format + X$CONVERT_CASE + (sym, lower, upper) + Argument Information + Argument Usage Data Type Access Mechanism + sym uns longword uns longword read reference + lower uns longword uns longword write reference + upper uns longword uns longword write reference + +4.6.6.4 DESTROY OC + OpenVMS Format + X$DESTROY_OC + (oc) + Argument Information + Argument Usage Data Type Access Mechanism + oc uns longword uns longword write reference + +4.6.6.5 DIRECTIONAL DEPENDENT DRAWING + OpenVMS Format + status_return = X$DIRECTIONAL_DEPENDENT_DRAWING + (font_set) + Argument Information + Argument Usage Data Type Access Mechanism + status_return cond_value longword write value + font_set identifier uns longword read reference + + + + +4–18 Programming Features + Programming Features + 4.6 X Window System Library (Xlib) + +4.6.6.6 DISPLAY OF OM + OpenVMS Format + display_return = X$DISPLAY_OF_OM + (om) + Argument Information + Argument Usage Data Type Access Mechanism + display_return identifier uns longword write value + om uns longword uns longword read reference + +4.6.6.7 EXTENDED MAX REQUEST SIZE + OpenVMS Format + req_size_return = X$EXTENDED_MAX_REQUEST_SIZE + (display) + Argument Information + Argument Usage Data Type Access Mechanism + req_size_return longword longword write value + display identifier uns longword read reference + +4.6.6.8 INIT IMAGE + OpenVMS Format + status_return = X$INIT_IMAGE + (ximage) + Argument Information + Argument Usage Data Type Access Mechanism + status_return cond_value longword write value + ximage record x$image read reference + +4.6.6.9 INIT THREADS + OpenVMS Format + status_return = X$INIT_THREADS + Argument Information + Argument Usage Data Type Access Mechanism + status_return cond_value longword write value + + + + + Programming Features 4–19 + Programming Features +4.6 X Window System Library (Xlib) + +4.6.6.10 INTERNAL CONNECTION NUMBERS + OpenVMS Format + status_return = X$INTERNAL_CONNECTION_NUMBERS + (display, fdptr, nptr) + Argument Information + Argument Usage Data Type Access Mechanism + status_return cond_value longword write value + display identifier uns longword read reference + fdptr longword longword write reference + nptr longword longword write reference + +4.6.6.11 LOCALE OF OM + OpenVMS Format + return_value = X$LOCALE_OF_OM + (om, return_string) + Argument Information + Argument Usage Data Type Access Mechanism + return_value longword longword write value + om uns longword uns longword read reference + return_string char_string character string write descriptor + +4.6.6.12 LOCK DISPLAY + OpenVMS Format + X$LOCK_DISPLAY + (display) + Argument Information + Argument Usage Data Type Access Mechanism + display identifier uns longword read reference + +4.6.6.13 OPEN OM + OpenVMS Format + om_return = X$OPEN_OM + (display, db, str1, str2) + Argument Information + Argument Usage Data Type Access Mechanism + om_return uns longword uns longword write reference + display identifier uns longword read reference + db identifier uns longword read reference + str1 char_string character string read descriptor + str2 char_string character string read descriptor + + + + +4–20 Programming Features + Programming Features + 4.6 X Window System Library (Xlib) + +4.6.6.14 PROCESS INTERNAL CONNECTION + OpenVMS Format + X$PROCESS_INTERNAL_CONNECTION + (display, fdptr) + Argument Information + Argument Usage Data Type Access Mechanism + display identifier uns longword read reference + fdptr longword longword read reference + +4.6.6.15 REGISTER IM INSTANTIATE Callback + OpenVMS Format + return_value = X$REGISTER_IM_INSTANTIATE_CB + (display, database, name_str, class_str, callback, client_data) + Argument Information + Argument Usage Data Type Access Mechanism + return_value longword longword write value + display identifier uns longword read reference + database identifier uns longword read reference + name_str char_string character string read descriptor + class_str char_string character string read descriptor + callback procedure proc entry mask read value + client_data char_string character string read descriptor + +4.6.6.16 SET AUTHORIZATION + OpenVMS Format + X$SET_AUTHORIZATION + (name, data) + Argument Information + Argument Usage Data Type Access Mechanism + name char_string character string read descriptor + data char_string character string read descriptor + +4.6.6.17 UNLOCK DISPLAY + OpenVMS Format + X$UNLOCK_DISPLAY + (display) + Argument Information + Argument Usage Data Type Access Mechanism + display identifier uns longword read reference + + + + + Programming Features 4–21 + Programming Features +4.6 X Window System Library (Xlib) + +4.6.6.18 UNREGISTER IM INSTANTIATE Callback + OpenVMS Format + return_value = X$UNREGISTER_IM_INSTANTIATE_CB + (display, database, name_str, class_str, callback, client_data) + Argument Information + Argument Usage Data Type Access Mechanism + return_value longword longword write value + display identifier uns longword read reference + database identifier uns longword read reference + name_str char_string character string read descriptor + class_str char_string character string read descriptor + callback procedure proc entry mask read value + client_data char_string character string read descriptor + + +4.6.7 Support for Additional Fonts + V1.3 + DECwindows Motif Version 1.3 offers support for the following additional fonts + and font technologies: + • Agfa Monotype Windows-Compatible TrueType fonts – To ensure + fast, high-quality text rendering capabilities, DECwindows Motif includes + the iType font rendering technology from Agfa Monotype Corporation along + with a number of scalable fonts, including the Albany, Cumberland, Screen, + and Thorndale type families. These fonts are identical in screen and printer + metrics to the Windows core fonts Arial, Courier, and Times New Roman. + Agfa Monotype’s Windows-compatible fonts are part of the Enhanced Screen + Quality (ESQ) line of TrueType fonts optimized for viewing at any resolution. + For more information about the iType technology, visit the Agfa Monotype + web site (http://www.agfamonotype.com). + • X11R6.6 fonts – As part of the standard X11R6.6 implementation, + DECwindows Motif now includes the 75- and 100-dpi versions of the + Bitstream Charter and Adobe Utopia font families. + • Previously undocumented fonts – These fonts include the 75-dpi, 100- + dpi, and common versions of the Lucida, Present Bullets, Fixed Width, Sun + Open Look Glyph, and VT330 font families, and well as a set of language- + specific and miscellaneous fonts. Also included are the Bitstream Speedo, + Adobe Type1 Courier, and Utopia scalable fonts. + The following sections further describe the new font families, which can be loaded + as described in Chapter 8 of the VMS DECwindows Guide to Xlib (Release 4) + Programming: MIT C Binding manual. Each section provides the following + information: + • Location and format of the font files + • List of the individual font file and font names in X Logical Font Description + (XLFD) format + + + + +4–22 Programming Features + Programming Features + 4.6 X Window System Library (Xlib) + + The file and font names are provided in a series of tables that are intended + to supplement the existing font tables found in Appendix C of the VMS + DECwindows Guide to Xlib (Release 4) Programming: MIT C Binding manual. + + Note + File names containing consecutive underscore characters (_) or hyphens + (-) may appear to contain a space between the consecutive characters. In + all cases, the space is not present in the font name. + + +4.6.7.1 Additional 75-dpi Fonts + Table 4–9 lists the new and previously undocumented 75-dpi fonts and their file + names. The files for these fonts are located in the following directory: + DECW$SYSCOMMON:[SYSFONT.DECW.75DPI] + +Table 4–9 Additional 75-dpi Fonts (.PCF File Extension) +File Name Font Name + +Charter + +CHARTER08 -Bitstream-Charter-Medium-R-Normal- -8-80-75-75-P-45-ISO8859-1 +CHARTER10 -Bitstream-Charter-Medium-R-Normal- -10-100-75-75-P-56-ISO8859-1 +CHARTER12 -Bitstream-Charter-Medium-R-Normal- -12-120-75-75-P-67-ISO8859-1 +CHARTER14 -Bitstream-Charter-Medium-R-Normal- -15-140-75-75-P-84-ISO8859-1 +CHARTER18 -Bitstream-Charter-Medium-R-Normal- -19-180-75-75-P-106-ISO8859-1 +CHARTER24 -Bitstream-Charter-Medium-R-Normal- -25-240-75-75-P-139-ISO8859-1 +CHARTER_BOLD_ITALIC08 -Bitstream-Charter-Bold-I-Normal- -8-80-75-75-P-50-ISO8859-1 +CHARTER_BOLD_ITALIC10 -Bitstream-Charter-Bold-I-Normal- -10-100-75-75-P-62-ISO8859-1 +CHARTER_BOLD_ITALIC14 -Bitstream-Charter-Bold-I-Normal- -15-140-75-75-P-93-ISO8859-1 +CHARTER_BOLD_ITALIC12 -Bitstream-Charter-Bold-I-Normal- -12-120-75-75-P-74-ISO8859-1 +CHARTER_BOLD_ITALIC18 -Bitstream-Charter-Bold-I-Normal- -19-180-75-75-P-117-ISO8859-1 +CHARTER_BOLD_ITALIC24 -Bitstream-Charter-Bold-I-Normal- -25-240-75-75-P-154-ISO8859-1 +CHARTER_ITALIC08 -Bitstream-Charter-Medium-I-Normal- -8-80-75-75-P-44-ISO8859-1 +CHARTER_ITALIC10 -Bitstream-Charter-Medium-I-Normal- -10-100-75-75-P-55-ISO8859-1 +CHARTER_ITALIC12 -Bitstream-Charter-Medium-I-Normal- -12-120-75-75-P-65-ISO8859-1 +CHARTER_ITALIC14 -Bitstream-Charter-Medium-I-Normal- -15-140-75-75-P-82-ISO8859-1 +CHARTER_ITALIC18 -Bitstream-Charter-Medium-I-Normal- -19-180-75-75-P-103-ISO8859-1 +CHARTER_ITALIC24 -Bitstream-Charter-Medium-I-Normal- -25-240-75-75-P-136-ISO8859-1 +CHARTER_BOLD08 -Bitstream-Charter-Bold-R-Normal- -8-80-75-75-P-50-ISO8859-1 +CHARTER_BOLD10 -Bitstream-Charter-Bold-R-Normal- -10-100-75-75-P-63-ISO8859-1 +CHARTER_BOLD12 -Bitstream-Charter-Bold-R-Normal- -12-120-75-75-P-75-ISO8859-1 + (continued on next page) + + + + + Programming Features 4–23 + Programming Features +4.6 X Window System Library (Xlib) + + +Table 4–9 (Cont.) Additional 75-dpi Fonts (.PCF File Extension) +File Name Font Name + +Charter + +CHARTER_BOLD14 -Bitstream-Charter-Bold-R-Normal- -15-140-75-75-P-94-ISO8859-1 +CHARTER_BOLD18 -Bitstream-Charter-Bold-R-Normal- -19-180-75-75-P-119-ISO8859-1 +CHARTER_BOLD24 -Bitstream-Charter-Bold-R-Normal- -25-240-75-75-P-157-ISO8859-1 + + +Lucida + +LUCIDABRIGHT08 -B&H-LucidaBright-Medium-R-Normal- -8-80-75-75-P-45-ISO8859-1 +LUCIDABRIGHT10 -B&H-LucidaBright-Medium-R-Normal- -10-100-75-75-P-56-ISO8859-1 +LUCIDABRIGHT12 -B&H-LucidaBright-Medium-R-Normal- -12-120-75-75-P-68-ISO8859-1 +LUCIDABRIGHT14 -B&H-LucidaBright-Medium-R-Normal- -14-140-75-75-P-80-ISO8859-1 +LUCIDABRIGHT18 -B&H-LucidaBright-Medium-R-Normal- -18-180-75-75-P-103-ISO8859-1 +LUCIDABRIGHT19 -B&H-LucidaBright-Medium-R-Normal- -19-190-75-75-P-109-ISO8859-1 +LUCIDABRIGHT24 -B&H-LucidaBright-Medium-R-Normal- -24-240-75-75-P-137-ISO8859-1 +LUCIDABRIGHT_ -B&H-LucidaBright-Demibold-I-Normal- -8-80-75-75-P-48-ISO8859-1 +DEMIITALIC08 +LUCIDABRIGHT_ -B&H-LucidaBright-Demibold-I-Normal- -10-100-75-75-P-59-ISO8859-1 +DEMIITALIC10 +LUCIDABRIGHT_ -B&H-LucidaBright-Demibold-I-Normal- -12-120-75-75-P-72-ISO8859-1 +DEMIITALIC12 +LUCIDABRIGHT_ -B&H-LucidaBright-Demibold-I-Normal- -14-140-75-75-P-84-ISO8859-1 +DEMIITALIC14 +LUCIDABRIGHT_ -B&H-LucidaBright-Demibold-I-Normal- -18-180-75-75-P-107-ISO8859-1 +DEMIITALIC18 +LUCIDABRIGHT_ -B&H-LucidaBright-Demibold-I-Normal- -19-190-75-75-P-114-ISO8859-1 +DEMIITALIC19 +LUCIDABRIGHT_ -B&H-LucidaBright-Demibold-I-Normal- -24-240-75-75-P-143-ISO8859-1 +DEMIITALIC24 +LUCIDABRIGHT_ITALIC08 -B&H-LucidaBright-Medium-I-Normal- -8-80-75-75-P-45-ISO8859-1 +LUCIDABRIGHT_ITALIC10 -B&H-LucidaBright-Medium-I-Normal- -10-100-75-75-P-57-ISO8859-1 +LUCIDABRIGHT_ITALIC12 -B&H-LucidaBright-Medium-I-Normal- -12-120-75-75-P-67-ISO8859-1 +LUCIDABRIGHT_ITALIC14 -B&H-LucidaBright-Medium-I-Normal- -14-140-75-75-P-80-ISO8859-1 +LUCIDABRIGHT_ITALIC18 -B&H-LucidaBright-Medium-I-Normal- -18-180-75-75-P-102-ISO8859-1 +LUCIDABRIGHT_ITALIC19 -B&H-LucidaBright-Medium-I-Normal- -19-190-75-75-P-109-ISO8859-1 +LUCIDABRIGHT_ITALIC24 -B&H-LucidaBright-Medium-I-Normal- -24-240-75-75-P-136-ISO8859-1 +LUCIDABRIGHT_DEMI08 -B&H-LucidaBright-Demibold-R-Normal- -8-80-75-75-P-47-ISO8859-1 +LUCIDABRIGHT_DEMI10 -B&H-LucidaBright-Demibold-R-Normal- -10-100-75-75-P-59-ISO8859-1 +LUCIDABRIGHT_DEMI12 -B&H-LucidaBright-Demibold-R-Normal- -12-120-75-75-P-71-ISO8859-1 +LUCIDABRIGHT_DEMI14 -B&H-LucidaBright-Demibold-R-Normal- -14-140-75-75-P-84-ISO8859-1 +LUCIDABRIGHT_DEMI18 -B&H-LucidaBright-Demibold-R-Normal- -18-180-75-75-P-107-ISO8859-1 +LUCIDABRIGHT_DEMI19 -B&H-LucidaBright-Demibold-R-Normal- -19-190-75-75-P-114-ISO8859-1 + (continued on next page) + + + + +4–24 Programming Features + Programming Features + 4.6 X Window System Library (Xlib) + + +Table 4–9 (Cont.) Additional 75-dpi Fonts (.PCF File Extension) +File Name Font Name + +Lucida + +LUCIDABRIGHT_DEMI24 -B&H-LucidaBright-Demibold-R-Normal- -24-240-75-75-P-143-ISO8859-1 +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Bold-R-Normal-Sans-8-80-75-75-m-50-ISO8859-1 +BOLDSANS08 +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Bold-R-Normal-Sans-10-100-75-75-m-60-ISO8859-1 +BOLDSANS10 +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Bold-R-Normal-Sans-12-120-75-75-m-70-ISO8859-1 +BOLDSANS12 +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Bold-R-Normal-Sans-14-140-75-75-m-90-ISO8859-1 +BOLDSANS14 +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Bold-R-Normal-Sans-18-180-75-75-m-110-ISO8859-1 +BOLDSANS18 +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Bold-R-Normal-Sans-19-190-75-75-m-110-ISO8859-1 +BOLDSANS19 +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Bold-R-Normal-Sans-24-240-75-75-m-140-ISO8859-1 +BOLDSANS24 +LUCIDATYPEWRITER_SANS08 -B&H-LucidaTypewriter-Medium-R-Normal-Sans-8-80-75-75-m-50-ISO8859-1 +LUCIDATYPEWRITER_SANS10 -B&H-LucidaTypewriter-Medium-R-Normal-Sans-10-100-75-75-m-60-ISO8859-1 +LUCIDATYPEWRITER_SANS12 -B&H-LucidaTypewriter-Medium-R-Normal-Sans-12-120-75-75-m-70-ISO8859-1 +LUCIDATYPEWRITER_SANS14 -B&H-LucidaTypewriter-Medium-R-Normal-Sans-14-140-75-75-m-90-ISO8859-1 +LUCIDATYPEWRITER_SANS18 -B&H-LucidaTypewriter-Medium-R-Normal-Sans-18-180-75-75-m-110-ISO8859-1 +LUCIDATYPEWRITER_SANS19 -B&H-LucidaTypewriter-Medium-R-Normal-Sans-19-190-75-75-m-110-ISO8859-1 +LUCIDATYPEWRITER_SANS24 -B&H-LucidaTypewriter-Medium-R-Normal-Sans-24-240-75-75-m-140-ISO8859-1 +LUCIDA_BOLDITALICSANS08 -B&H-Lucida-Bold-I-Normal-Sans-8-80-75-75-P-49-ISO8859-1 +LUCIDA_BOLDITALICSANS10 -B&H-Lucida-Bold-I-Normal-Sans-10-100-75-75-P-67-ISO8859-1 +LUCIDA_BOLDITALICSANS12 -B&H-Lucida-Bold-I-Normal-Sans-12-120-75-75-P-79-ISO8859-1 +LUCIDA_BOLDITALICSANS14 -B&H-Lucida-Bold-I-Normal-Sans-14-140-75-75-P-92-ISO8859-1 +LUCIDA_BOLDITALICSANS18 -B&H-Lucida-Bold-I-Normal-Sans-18-180-75-75-P-119-ISO8859-1 +LUCIDA_BOLDITALICSANS19 -B&H-Lucida-Bold-I-Normal-Sans-19-190-75-75-P-122-ISO8859-1 +LUCIDA_BOLDITALICSANS24 -B&H-Lucida-Bold-I-Normal-Sans-24-240-75-75-P-151-ISO8859-1 +LUCIDA_BOLDSANS08 -B&H-Lucida-Bold-R-Normal-Sans-8-80-75-75-P-50-ISO8859-1 +LUCIDA_BOLDSANS10 -B&H-Lucida-Bold-R-Normal-Sans-10-100-75-75-P-66-ISO8859-1 +LUCIDA_BOLDSANS12 -B&H-Lucida-Bold-R-Normal-Sans-12-120-75-75-P-79-ISO8859-1 +LUCIDA_BOLDSANS14 -B&H-Lucida-Bold-R-Normal-Sans-14-140-75-75-P-92-ISO8859-1 +LUCIDA_BOLDSANS18 -B&H-Lucida-Bold-R-Normal-Sans-18-180-75-75-P-120-ISO8859-1 +LUCIDA_BOLDSANS19 -B&H-Lucida-Bold-R-Normal-Sans-19-190-75-75-P-122-ISO8859-1 +LUCIDA_BOLDSANS24 -B&H-Lucida-Bold-R-Normal-Sans-24-240-75-75-P-152-ISO8859-1 +LUCIDA_ITALICSANS08 -B&H-Lucida-Medium-I-Normal-Sans-8-80-75-75-P-45-ISO8859-1 +LUCIDA_ITALICSANS10 -B&H-Lucida-Medium-I-Normal-Sans-10-100-75-75-P-59-ISO8859-1 +LUCIDA_ITALICSANS12 -B&H-Lucida-Medium-I-Normal-Sans-12-120-75-75-P-71-ISO8859-1 + (continued on next page) + + + + + Programming Features 4–25 + Programming Features +4.6 X Window System Library (Xlib) + + +Table 4–9 (Cont.) Additional 75-dpi Fonts (.PCF File Extension) +File Name Font Name + +Lucida + +LUCIDA_ITALICSANS14 -B&H-Lucida-Medium-I-Normal-Sans-14-140-75-75-P-82-ISO8859-1 +LUCIDA_ITALICSANS18 -B&H-Lucida-Medium-I-Normal-Sans-18-180-75-75-P-105-ISO8859-1 +LUCIDA_ITALICSANS19 -B&H-Lucida-Medium-I-Normal-Sans-19-190-75-75-P-108-ISO8859-1 +LUCIDA_ITALICSANS24 -B&H-Lucida-Medium-I-Normal-Sans-24-240-75-75-P-136-ISO8859-1 +LUCIDA_SANS08 -B&H-Lucida-Medium-R-Normal-Sans-8-80-75-75-P-45-ISO8859-1 +LUCIDA_SANS10 -B&H-Lucida-Medium-R-Normal-Sans-10-100-75-75-P-58-ISO8859-1 +LUCIDA_SANS12 -B&H-Lucida-Medium-R-Normal-Sans-12-120-75-75-P-71-ISO8859-1 +LUCIDA_SANS14 -B&H-Lucida-Medium-R-Normal-Sans-14-140-75-75-P-81-ISO8859-1 +LUCIDA_SANS18 -B&H-Lucida-Medium-R-Normal-Sans-18-180-75-75-P-106-ISO8859-1 +LUCIDA_SANS19 -B&H-Lucida-Medium-R-Normal-Sans-19-190-75-75-P-108-ISO8859-1 +LUCIDA_SANS24 -B&H-Lucida-Medium-R-Normal-Sans-24-240-75-75-P-136-ISO8859-1 + + +Present Bullets + +PRESENT_BULLETS8_75 -DEC-PresentBullets-Medium-R-Normal- -8-80-75-75-P-76-DEC-FontSpecific +PRESENT_BULLETS10_75 -DEC-PresentBullets-Medium-R-Normal- -10-100-75-75-P-96-DEC-FontSpecific +PRESENT_BULLETS12_75 -DEC-PresentBullets-Medium-R-Normal- -12-120-75-75-P-114-DEC-FontSpecific +PRESENT_BULLETS14_75 -DEC-PresentBullets-Medium-R-Normal- -14-140-75-75-P-134-DEC-FontSpecific +PRESENT_BULLETS18_75 -DEC-PresentBullets-Medium-R-Normal- -18-180-75-75-P-172-DEC-FontSpecific +PRESENT_BULLETS24_75 -DEC-PresentBullets-Medium-R-Normal- -24-240-75-75-P-229-DEC-FontSpecific +PRESENT_BULLETS36_75 -DEC-PresentBullets-Medium-R-Normal- -36-360-75-75-P-343-DEC-FontSpecific +PRESENT_BULLETS48_75 -DEC-PresentBullets-Medium-R-Normal- -48-480-75-75-P-458-DEC-FontSpecific +PRESENT_BULLETS72_75 -DEC-PresentBullets-Medium-R-Normal- -72-720-75-75-P-686-DEC-FontSpecific + + +Utopia + +UTOPIA10 -Adobe-Utopia-Regular-R-Normal- -10-100-75-75-P-56-ISO8859-1 +UTOPIA12 -Adobe-Utopia-Regular-R-Normal- -12-120-75-75-P-67-ISO8859-1 +UTOPIA14 -Adobe-Utopia-Regular-R-Normal- -15-140-75-75-P-79-ISO8859-1 +UTOPIA18 -Adobe-Utopia-Regular-R-Normal- -19-180-75-75-P-101-ISO8859-1 +UTOPIA24 -Adobe-Utopia-Regular-R-Normal- -25-240-75-75-P-135-ISO8859-1 +UTOPIA_BOLD10 -Adobe-Utopia-Bold-R-Normal- -10-100-75-75-P-59-ISO8859-1 +UTOPIA_BOLD12 -Adobe-Utopia-Bold-R-Normal- -12-120-75-75-P-70-ISO8859-1 +UTOPIA_BOLD14 -Adobe-Utopia-Bold-R-Normal- -15-140-75-75-P-82-ISO8859-1 +UTOPIA_BOLD18 -Adobe-Utopia-Bold-R-Normal- -19-180-75-75-P-105-ISO8859-1 +UTOPIA_BOLD24 -Adobe-Utopia-Bold-R-Normal- -25-240-75-75-P-140-ISO8859-1 +UTOPIA_BOLD_ITALIC10 -Adobe-Utopia-Bold-I-Normal- -10-100-75-75-P-58-ISO8859-1 +UTOPIA_BOLD_ITALIC12 -Adobe-Utopia-Bold-I-Normal- -12-120-75-75-P-70-ISO8859-1 +UTOPIA_BOLD_ITALIC14 -Adobe-Utopia-Bold-I-Normal- -15-120-75-75-P-70-ISO8859-1 + (continued on next page) + + + + +4–26 Programming Features + Programming Features + 4.6 X Window System Library (Xlib) + + +Table 4–9 (Cont.) Additional 75-dpi Fonts (.PCF File Extension) +File Name Font Name + +Utopia + +UTOPIA_BOLD_ITALIC18 -Adobe-Utopia-Bold-I-Normal- -19-180-75-75-P-105-ISO8859-1 +UTOPIA_BOLD_ITALIC24 -Adobe-Utopia-Bold-I-Normal- -25-240-75-75-P-140-ISO8859-1 +UTOPIA_ITALIC10 -Adobe-Utopia-Regular-I-Normal- -10-100-75-75-P-55-ISO8859-1 +UTOPIA_ITALIC12 -Adobe-Utopia-Regular-I-Normal- -12-120-75-75-P-67-ISO8859-1 +UTOPIA_ITALIC14 -Adobe-Utopia-Regular-I-Normal- -15-140-75-75-P-79-ISO8859-1 +UTOPIA_ITALIC18 -Adobe-Utopia-Regular-I-Normal- -19-180-75-75-P-100-ISO8859-1 +UTOPIA_ITALIC24 -Adobe-Utopia-Regular-I-Normal- -25-240-75-75-P-133-ISO8859-1 + + +4.6.7.2 Additional 100-dpi Fonts + Table 4–10 lists the new and previously undocumented 100-dpi fonts and their + file names. The files for these fonts are located in the following directory: + DECW$SYSCOMMON:[SYSFONT.DECW.100DPI] + +Table 4–10 Additional 100-dpi Fonts (.PCF File Extension) +File Name Font Name + +Charter + +CHARTER08_100DPI -Bitstream-Charter-Medium-R-Normal- -11-80-100-100-P-61-ISO8859-1 +CHARTER10_100DPI -Bitstream-Charter-Medium-R-Normal- -14-100-100-100-P-78-ISO8859-1 +CHARTER12_100DPI -Bitstream-Charter-Medium-R-Normal- -17-120-100-100-P-95-ISO8859-1 +CHARTER14_100DPI -Bitstream-Charter-Medium-R-Normal- -19-140-100-100-P-106-ISO8859-1 +CHARTER18_100DPI -Bitstream-Charter-Medium-R-Normal- -25-180-100-100-P-139-ISO8859-1 +CHARTER24_100DPI -Bitstream-Charter-Medium-R-Normal- -33-240-100-100-P-183-ISO8859-1 +CHARTER_BOLD08_100DPI -Bitstream-Charter-Bold-R-Normal- -11-80-100-100-P-69-ISO8859-1 +CHARTER_BOLD10_100DPI -Bitstream-Charter-Bold-R-Normal- -14-100-100-100-P-88-ISO8859-1 +CHARTER_BOLD12_100DPI -Bitstream-Charter-Bold-R-Normal- -17-120-100-100-P-107-ISO8859-1 +CHARTER_BOLD14_100DPI -Bitstream-Charter-Bold-R-Normal- -19-140-100-100-P-119-ISO8859-1 +CHARTER_BOLD18_100DPI -Bitstream-Charter-Bold-R-Normal- -25-180-100-100-P-157-ISO8859-1 +CHARTER_BOLD24_100DPI -Bitstream-Charter-Bold-R-Normal- -33-240-100-100-P-206-ISO8859-1 +CHARTER_BOLD_ITALIC08_ -Bitstream-Charter-Bold-I-Normal- -11-80-100-100-P-68-ISO8859-1 +100DPI +CHARTER_BOLD_ITALIC10_ -Bitstream-Charter-Bold-I-Normal- -14-100-100-100-P-86-ISO8859-1 +100DPI +CHARTER_BOLD_ITALIC12_ -Bitstream-Charter-Bold-I-Normal- -17-120-100-100-P-105-ISO8859-1 +100DPI +CHARTER_BOLD_ITALIC14_ -Bitstream-Charter-Bold-I-Normal- -19-140-100-100-P-117-ISO8859-1 +100DPI +CHARTER_BOLD_ITALIC18_ -Bitstream-Charter-Bold-I-Normal- -25-180-100-100-P-154-ISO8859-1 +100DPI + (continued on next page) + + + + + Programming Features 4–27 + Programming Features +4.6 X Window System Library (Xlib) + + +Table 4–10 (Cont.) Additional 100-dpi Fonts (.PCF File Extension) +File Name Font Name + +Charter + +CHARTER_BOLD_ITALIC24_ -Bitstream-Charter-Bold-I-Normal- -33-240-100-100-P-203-ISO8859-1 +100DPI +CHARTER_ITALIC08_100DPI -Bitstream-Charter-Medium-I-Normal- -11-120-100-100-P-92-ISO8859-1 +CHARTER_ITALIC10_100DPI -Bitstream-Charter-Medium-I-Normal- -14-120-100-100-P-92-ISO8859-1 +CHARTER_ITALIC12_100DPI -Bitstream-Charter-Medium-I-Normal- -17-120-100-100-P-92-ISO8859-1 +CHARTER_ITALIC14_100DPI -Bitstream-Charter-Medium-I-Normal- -19-140-100-100-P-103-ISO8859-1 +CHARTER_ITALIC18_100DPI -Bitstream-Charter-Medium-I-Normal- -25-180-100-100-P-136-ISO8859-1 +CHARTER_ITALIC24_100DPI -Bitstream-Charter-Medium-I-Normal- -33-240-100-100-P-179-ISO8859-1 + + +Lucida + +LUCIDABRIGHT08_100DPI -B&H-LucidaBright-Medium-R-Normal- -11-80-100-100-P-63-ISO8859-1 +LUCIDABRIGHT10_100DPI -B&H-LucidaBright-Medium-R-Normal- -14-100-100-100-P-80-ISO8859-1 +LUCIDABRIGHT12_100DPI -B&H-LucidaBright-Medium-R-Normal- -17-120-100-100-P-96-ISO8859-1 +LUCIDABRIGHT14_100DPI -B&H-LucidaBright-Medium-R-Normal- -20-140-100-100-P-114-ISO8859-1 +LUCIDABRIGHT18_100DPI -B&H-LucidaBright-Medium-R-Normal- -25-180-100-100-P-142-ISO8859-1 +LUCIDABRIGHT19_100DPI -B&H-LucidaBright-Medium-R-Normal- -26-190-100-100-P-149-ISO8859-1 +LUCIDABRIGHT24_100DPI -B&H-LucidaBright-Medium-R-Normal- -34-240-100-100-P-193-ISO8859-1 +LUCIDABRIGHT_DEMI08_ -B&H-LucidaBright-Demibold-R-Normal- -11-80-100-100-P-66-ISO8859-1 +100DPI +LUCIDABRIGHT_DEMI10_ -B&H-LucidaBright-Demibold-R-Normal- -14-100-100-100-P-84-ISO8859-1 +100DPI +LUCIDABRIGHT_DEMI12_ -B&H-LucidaBright-Demibold-R-Normal- -17-120-100-100-P-101-ISO8859-1 +100DPI +LUCIDABRIGHT_DEMI14_ -B&H-LucidaBright-Demibold-R-Normal- -20-140-100-100-P-118-ISO8859-1 +100DPI +LUCIDABRIGHT_DEMI18_ -B&H-LucidaBright-Demibold-R-Normal- -25-180-100-100-P-149-ISO8859-1 +100DPI +LUCIDABRIGHT_DEMI19_ -B&H-LucidaBright-Demibold-R-Normal- -26-190-100-100-P-155-ISO8859-1 +100DPI +LUCIDABRIGHT_DEMI24_ -B&H-LucidaBright-Demibold-R-Normal- -34-240-100-100-P-202-ISO8859-1 +100DPI +LUCIDABRIGHT_ -B&H-LucidaBright-Demibold-I-Normal- -11-80-100-100-P-66-ISO8859-1 +DEMIITALIC08_100DPI +LUCIDABRIGHT_ -B&H-LucidaBright-Demibold-I-Normal- -14-100-100-100-P-84-ISO8859-1 +DEMIITALIC10_100DPI +LUCIDABRIGHT_ -B&H-LucidaBright-Demibold-I-Normal- -17-120-100-100-P-101-ISO8859-1 +DEMIITALIC12_100DPI +LUCIDABRIGHT_ -B&H-LucidaBright-Demibold-I-Normal- -20-140-100-100-P-119-ISO8859-1 +DEMIITALIC14_100DPI +LUCIDABRIGHT_ -B&H-LucidaBright-Demibold-I-Normal- -25-180-100-100-P-149-ISO8859-1 +DEMIITALIC18_100DPI + (continued on next page) + + + + +4–28 Programming Features + Programming Features + 4.6 X Window System Library (Xlib) + + +Table 4–10 (Cont.) Additional 100-dpi Fonts (.PCF File Extension) +File Name Font Name + +Lucida + +LUCIDABRIGHT_ -B&H-LucidaBright-Demibold-I-Normal- -26-190-100-100-P-156-ISO8859-1 +DEMIITALIC19_100DPI +LUCIDABRIGHT_ -B&H-LucidaBright-Demibold-I-Normal- -34-240-100-100-P-203-ISO8859-1 +DEMIITALIC24_100DPI +LUCIDABRIGHT_ITALIC08_ -B&H-LucidaBright-Medium-I-Normal- -11-80-100-100-P-63-ISO8859-1 +100DPI +LUCIDABRIGHT_ITALIC10_ -B&H-LucidaBright-Medium-I-Normal- -14-100-100-100-P-80-ISO8859-1 +100DPI +LUCIDABRIGHT_ITALIC12_ -B&H-LucidaBright-Medium-I-Normal- -17-120-100-100-P-96-ISO8859-1 +100DPI +LUCIDABRIGHT_ITALIC14_ -B&H-LucidaBright-Medium-I-Normal- -20-140-100-100-P-113-ISO8859-1 +100DPI +LUCIDABRIGHT_ITALIC18_ -B&H-LucidaBright-Medium-I-Normal- -25-180-100-100-P-142-ISO8859-1 +100DPI +LUCIDABRIGHT_ITALIC19_ -B&H-LucidaBright-Medium-I-Normal- -26-190-100-100-P-148-ISO8859-1 +100DPI +LUCIDABRIGHT_ITALIC24_ -B&H-LucidaBright-Medium-I-Normal- -34-240-100-100-P-194-ISO8859-1 +100DPI +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Bold-R-Normal-Sans-11-80-100-100-m-70-ISO8859-1 +BOLDSANS08_100DPI +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Bold-R-Normal-Sans-14-100-100-100-m-80-ISO8859-1 +BOLDSANS10_100DPI +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Bold-R-Normal-Sans-17-120-100-100-m-100-ISO8859-1 +BOLDSANS12_100DPI +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Bold-R-Normal-Sans-20-140-100-100-m-120-ISO8859-1 +BOLDSANS14_100DPI +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Bold-R-Normal-Sans-25-180-100-100-m-150-ISO8859-1 +BOLDSANS18_100DPI +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Bold-R-Normal-Sans-26-190-100-100-m-159-ISO8859-1 +BOLDSANS19_100DPI +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Bold-R-Normal-Sans-34-240-100-100-m-200-ISO8859-1 +BOLDSANS24_100DPI +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Medium-R-Normal-Sans-11-80-100-100-m-70-ISO8859-1 +SANS08_100DPI +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Medium-R-Normal-Sans-14-100-100-100-m-80-ISO8859-1 +SANS10_100DPI +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Medium-R-Normal-Sans-17-120-100-100-m-100-ISO8859-1 +SANS12_100DPI +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Medium-R-Normal-Sans-20-140-100-100-m-120-ISO8859-1 +SANS14_100DPI +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Medium-R-Normal-Sans-25-180-100-100-m-150-ISO8859-1 +SANS18_100DPI +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Medium-R-Normal-Sans-26-190-100-100-m-159-ISO8859-1 +SANS19_100DPI +LUCIDATYPEWRITER_ -B&H-LucidaTypewriter-Medium-R-Normal-Sans-34-240-100-100-m-200-ISO8859-1 +SANS24_100DPI + (continued on next page) + + + + + Programming Features 4–29 + Programming Features +4.6 X Window System Library (Xlib) + + +Table 4–10 (Cont.) Additional 100-dpi Fonts (.PCF File Extension) +File Name Font Name + +Lucida + +LUCIDA_BOLDITALICSANS08_ -B&H-Lucida-Bold-I-Normal-Sans-11-80-100-100-P-69-ISO8859-1 +100DPI +LUCIDA_BOLDITALICSANS10_ -B&H-Lucida-Bold-I-Normal-Sans-14-100-100-100-P-90-ISO8859-1 +100DPI +LUCIDA_BOLDITALICSANS12_ -B&H-Lucida-Bold-I-Normal-Sans-17-120-100-100-P-108-ISO8859-1 +100DPI +LUCIDA_BOLDITALICSANS14_ -B&H-Lucida-Bold-I-Normal-Sans-20-140-100-100-P-127-ISO8859-1 +100DPI +LUCIDA_BOLDITALICSANS18_ -B&H-Lucida-Bold-I-Normal-Sans-25-180-100-100-P-159-ISO8859-1 +100DPI +LUCIDA_BOLDITALICSANS19_ -B&H-Lucida-Bold-I-Normal-Sans-26-190-100-100-P-166-ISO8859-1 +100DPI +LUCIDA_BOLDITALICSANS24_ -B&H-Lucida-Bold-I-Normal-Sans-34-240-100-100-P-215-ISO8859-1 +100DPI +LUCIDA_BOLDSANS08_100DPI -B&H-Lucida-Bold-R-Normal-Sans-11-80-100-100-P-70-ISO8859-1 +LUCIDA_BOLDSANS10_100DPI -B&H-Lucida-Bold-R-Normal-Sans-14-100-100-100-P-89-ISO8859-1 +LUCIDA_BOLDSANS12_100DPI -B&H-Lucida-Bold-R-Normal-Sans-17-120-100-100-P-108-ISO8859-1 +LUCIDA_BOLDSANS14_100DPI -B&H-Lucida-Bold-R-Normal-Sans-20-140-100-100-P-127-ISO8859-1 +LUCIDA_BOLDSANS18_100DPI -B&H-Lucida-Bold-R-Normal-Sans-25-180-100-100-P-158-ISO8859-1 +LUCIDA_BOLDSANS19_100DPI -B&H-Lucida-Bold-R-Normal-Sans-26-190-100-100-P-166-ISO8859-1 +LUCIDA_BOLDSANS24_100DPI -B&H-Lucida-Bold-R-Normal-Sans-34-240-100-100-P-216-ISO8859-1 +LUCIDA_ITALICSANS08_ -B&H-Lucida-Medium-I-Normal-Sans-11-80-100-100-P-62-ISO8859-1 +100DPI +LUCIDA_ITALICSANS10_ -B&H-Lucida-Medium-I-Normal-Sans-14-100-100-100-P-80-ISO8859-1 +100DPI +LUCIDA_ITALICSANS12_ -B&H-Lucida-Medium-I-Normal-Sans-17-120-100-100-P-97-ISO8859-1 +100DPI +LUCIDA_ITALICSANS14_ -B&H-Lucida-Medium-I-Normal-Sans-20-140-100-100-P-114-ISO8859-1 +100DPI +LUCIDA_ITALICSANS18_ -B&H-Lucida-Medium-I-Normal-Sans-25-180-100-100-P-141-ISO8859-1 +100DPI +LUCIDA_ITALICSANS19_ -B&H-Lucida-Medium-I-Normal-Sans-26-190-100-100-P-147-ISO8859-1 +100DPI +LUCIDA_ITALICSANS24_ -B&H-Lucida-Medium-I-Normal-Sans-34-240-100-100-P-192-ISO8859-1 +100DPI +LUCIDA_SANS08_100DPI -B&H-Lucida-Medium-R-Normal-Sans-11-80-100-100-P-63-ISO8859-1 +LUCIDA_SANS10_100DPI -B&H-Lucida-Medium-R-Normal-Sans-14-100-100-100-P-80-ISO8859-1 +LUCIDA_SANS12_100DPI -B&H-Lucida-Medium-R-Normal-Sans-17-120-100-100-P-96-ISO8859-1 +LUCIDA_SANS14_100DPI -B&H-Lucida-Medium-R-Normal-Sans-20-140-100-100-P-114-ISO8859-1 + (continued on next page) + + + + +4–30 Programming Features + Programming Features + 4.6 X Window System Library (Xlib) + + +Table 4–10 (Cont.) Additional 100-dpi Fonts (.PCF File Extension) +File Name Font Name + +Lucida + +LUCIDA_SANS18_100DPI -B&H-Lucida-Medium-R-Normal-Sans-25-180-100-100-P-142-ISO8859-1 +LUCIDA_SANS19_100DPI -B&H-Lucida-Medium-R-Normal-Sans-26-190-100-100-P-147-ISO8859-1 +LUCIDA_SANS24_100DPI -B&H-Lucida-Medium-R-Normal-Sans-34-240-100-100-P-191-ISO8859-1 + + +Present Bullets + +PRESENT_BULLETS8_100 -DEC-PresentBullets-Medium-R-Normal- -8-80-100-100-P-105-DEC-FontSpecific +PRESENT_BULLETS10_100 -DEC-PresentBullets-Medium-R-Normal- -10-100-100-100-P-123-DEC-FontSpecific +PRESENT_BULLETS12_100 -DEC-PresentBullets-Medium-R-Normal- -12-120-100-100-P-154-DEC-FontSpecific +PRESENT_BULLETS14_100 -DEC-PresentBullets-Medium-R-Normal- -14-140-100-100-P-172-DEC-FontSpecific +PRESENT_BULLETS18_100 -DEC-PresentBullets-Medium-R-Normal- -18-180-100-100-P-229-DEC-FontSpecific +PRESENT_BULLETS24_100 -DEC-PresentBullets-Medium-R-Normal- -24-240-100-100-P-305-DEC-FontSpecific +PRESENT_BULLETS36_100 -DEC-PresentBullets-Medium-R-Normal- -36-360-100-100-P-458-DEC-FontSpecific +PRESENT_BULLETS48_100 -DEC-PresentBullets-Medium-R-Normal- -48-480-100-100-P-609-DEC-FontSpecific +PRESENT_BULLETS72_100 -DEC-PresentBullets-Medium-R-Normal- -72-720-100-100-P-952-DEC-FontSpecific + + +Utopia + +UTOPIA10_100DPI -Adobe-Utopia-Regular-R-Normal- -14-100-100-100-P-75-ISO8859-1 +UTOPIA12_100DPI -Adobe-Utopia-Regular-R-Normal- -17-120-100-100-P-91-ISO8859-1 +UTOPIA14_100DPI -Adobe-Utopia-Regular-R-Normal- -19-140-100-100-P-105-ISO8859-1 +UTOPIA18_100DPI -Adobe-Utopia-Regular-R-Normal- -25-180-100-100-P-135-ISO8859-1 +UTOPIA24_100DPI -Adobe-Utopia-Regular-R-Normal- -33-240-100-100-P-180-ISO8859-1 +UTOPIA_BOLD10_100DPI -Adobe-Utopia-Bold-R-Normal- -14-100-100-100-P-78-ISO8859-1 +UTOPIA_BOLD12_100DPI -Adobe-Utopia-Bold-R-Normal- -17-120-100-100-P-93-ISO8859-1 +UTOPIA_BOLD14_100DPI -Adobe-Utopia-Bold-R-Normal- -19-140-100-100-P-108-ISO8859-1 +UTOPIA_BOLD18_100DPI -Adobe-Utopia-Bold-R-Normal- -25-180-100-100-P-140-ISO8859-1 +UTOPIA_BOLD24_100DPI -Adobe-Utopia-Bold-R-Normal- -33-240-100-100-P-186-ISO8859-1 +UTOPIA_BOLDITALIC10_ -Adobe-Utopia-Bold-I-Normal- -14-100-100-100-P-78-ISO8859-1 +100DPI +UTOPIA_BOLDITALIC12_ -Adobe-Utopia-Bold-I-Normal- -17-120-100-100-P-93-ISO8859-1 +100DPI +UTOPIA_BOLDITALIC14_ -Adobe-Utopia-Bold-I-Normal- -19-140-100-100-P-109-ISO8859-1 +100DPI +UTOPIA_BOLDITALIC18_ -Adobe-Utopia-Bold-I-Normal- -25-180-100-100-P-139-ISO8859-1 +100DPI +UTOPIA_BOLDITALIC24_ -Adobe-Utopia-Bold-I-Normal- -33-240-100-100-P-186-ISO8859-1 +100DPI +UTOPIA_ITALIC10_100DPI -Adobe-Utopia-Regular-I-Normal- -14-100-100-100-P-74-ISO8859-1 +UTOPIA_ITALIC12_100DPI -Adobe-Utopia-Regular-I-Normal- -17-120-100-100-P-89-ISO8859-1 + (continued on next page) + + + + + Programming Features 4–31 + Programming Features +4.6 X Window System Library (Xlib) + + +Table 4–10 (Cont.) Additional 100-dpi Fonts (.PCF File Extension) +File Name Font Name + +Utopia + +UTOPIA_ITALIC14_100DPI -Adobe-Utopia-Regular-I-Normal- -19-140-100-100-P-104-ISO8859-1 +UTOPIA_ITALIC18_100DPI -Adobe-Utopia-Regular-I-Normal- -25-180-100-100-P-134-ISO8859-1 +UTOPIA_ITALIC24_100DPI -Adobe-Utopia-Regular-I-Normal- -33-240-100-100-P-179-ISO8859-1 + + +4.6.7.3 Additional Common Fonts + Table 4–11 lists previously undocumented Common fonts and their file names. + The files for these fonts are located in the following directory: + DECW$SYSCOMMON:[SYSFONT.DECW.COMMON] + +Table 4–11 Additional Common Fonts (.PCF File Extension) +File Name Font Name + +Fixed Width + +5X7 -Misc-Fixed-Medium-R-Normal- -7-70-75-75-C-50-ISO8859-1 +7X14B -Misc-Fixed-Bold-R-Normal- -14-130-75-75-C-70-ISO8859-1 +7X14RK -Misc-Fixed-Medium-R-Normal- -14-130-75-75-C-70-JISX0201.1976-0 +8X16RK -Sony-Fixed-Medium-R-Normal- -16-120-100-100-C-80-JISX0201.1976-0 +12X24 -Sony-Fixed-Medium-R-Normal- -24-170-100-100-C-120-ISO8859-1 +12X24RK -Sony-Fixed-Medium-R-Normal- -24-170-100-100-C-120-JISX0201.1976-0 + + +Sun Open Look Glyph + +OLGL10 -Sun-Open Look Glyph- - - - -10-100-75-75-P-101-SunOLGlyph-1 +OLGL12 -Sun-Open Look Glyph- - - - -12-120-75-75-P-113-SunOLGlyph-1 +OLGL14 -Sun-Open Look Glyph- - - - -14-140-75-75-P-128-SunOLGlyph-1 +OLGL19 -Sun-Open Look Glyph- - - - -19-190-75-75-P-154-SunOLGlyph-1 + + +VT330 + +VT33018 -DEC-VT330-Medium-R-Normal- -20-180-75-75-C-100-ISO8859-1 +VT33036 -DEC-VT330-Medium-R-Normal- -40-360-75-75-C-200-ISO8859-1 +VT330_BOLD18 -DEC-VT330-Bold-R-Normal- -20-180-75-75-C-100-ISO8859-1 +VT330_BOLD36 -DEC-VT330-Bold-R-Normal- -40-360-75-75-C-200-ISO8859-1 +VT330_BOLD_DBLWIDE18 -DEC-VT330-Bold-R-Double Wide- -20-180-75-75-C-200-ISO8859-1 +VT330_BOLD_DBLWIDE_ -DEC-VT330-Bold-R-Double Wide- -20-180-75-75-C-200-DEC-DECTech +DECTECH18 +VT330_BOLD_DECTECH18 -DEC-VT330-Bold-R-Normal- -20-180-75-75-C-100-DEC-DECTech +VT330_BOLD_DECTECH36 -DEC-VT330-Bold-R-Normal- -40-360-75-75-C-200-DEC-DECTech +VT330_BOLD_NARROW18 -DEC-VT330-Bold-R-Narrow- -20-180-75-75-C-60-ISO8859-1 +VT330_BOLD_NARROW36 -DEC-VT330-Bold-R-Narrow- -40-360-75-75-C-120-ISO8859-1 + (continued on next page) + + + + +4–32 Programming Features + Programming Features + 4.6 X Window System Library (Xlib) + + +Table 4–11 (Cont.) Additional Common Fonts (.PCF File Extension) +File Name Font Name + +VT330 + +VT330_BOLD_NARROW_ -DEC-VT330-Bold-R-Narrow- -20-180-75-75-C-60-DEC-DECTech +DECTECH18 +VT330_BOLD_NARROW_ -DEC-VT330-Bold-R-Narrow- -40-360-75-75-C-120-DEC-DECTech +DECTECH36 +VT330_BOLD_WIDE18 -DEC-VT330-Bold-R-Wide- -20-180-75-75-C-120-ISO8859-1 +VT330_BOLD_WIDE_ -DEC-VT330-Bold-R-Wide- -20-180-75-75-C-120-DEC-DECTech +DECTECH18 +VT330_DBLWIDE18 -DEC-VT330-Medium-R-Double Wide- -20-180-75-75-C-200-ISO8859-1 +VT330_DBLWIDE_DECTECH18 -DEC-VT330-Medium-R-Double Wide- -20-180-75-75-C-200-DEC-DECTech +VT330_DECTECH18 -DEC-VT330-Medium-R-Normal- -20-180-75-75-C-100-DEC-DECTech +VT330_DECTECH36 -DEC-VT330-Medium-R-Normal- -40-360-75-75-C-200-DEC-DECTech +VT330_NARROW18 -DEC-VT330-Medium-R-Narrow- -20-180-75-75-C-60-ISO8859-1 +VT330_NARROW36 -DEC-VT330-Medium-R-Narrow- -40-360-75-75-C-120-ISO8859-1 +VT330_NARROW_DECTECH18 -DEC-VT330-Medium-R-Narrow- -20-180-75-75-C-60-DEC-DECTech +VT330_NARROW_DECTECH36 -DEC-VT330-Medium-R-Narrow- -40-360-75-75-C-120-DEC-DECTech +VT330_WIDE18 -DEC-VT330-Medium-R-Wide- -20-180-75-75-C-120-ISO8859-1 +VT330_WIDE_DECTECH18 -DEC-VT330-Medium-R-Wide- -20-180-75-75-C-120-DEC-DECTech + + +Language-Specific Fonts + +HANGLG16 -Daewoo-Gothic-Medium-R-Normal- -16-120-100-100-C-160-KSC5601.1987-0 +HANGLM16 -Daewoo-Mincho-Medium-R-Normal- -16-120-100-100-C-160-KSC5601.1987-0 +HANGLM24 -Daewoo-Mincho-Medium-R-Normal- -24-170-100-100-C-240-KSC5601.1987-0 +HEB6X13 -Misc-Fixed-Medium-R-SemiCondensed- -13-120-75-75-C-60-ISO8859-8 +HEB8X13 -Misc-Fixed-Medium-R-Normal- -13-120-75-75-C-80-ISO8859-8 +JISKAN16 -JIS-Fixed-Medium-R-Normal- -16-150-75-75-C-160-JISX0208.1983-0 +JISKAN24 -JIS-Fixed-Medium-R-Normal- -24-230-75-75-C-240-JISX0208.1983-0 +K14 -Misc-Fixed-Medium-R-Normal- -14-130-75-75-C-140-JISX0208.1983-0 + + +Miscellaneous Fonts + +NIL2 -Misc-Nil-Medium-R-Normal- -2-20-75-75-C-10-Misc-FontSpecific + + + + + Programming Features 4–33 + Programming Features +4.6 X Window System Library (Xlib) + +4.6.7.4 Bitstream Speedo Scalable Fonts + Table 4–12 lists the previously undocumented Bitstream Speedo scalable fonts + and their file names. The files for these fonts are located in the following + directory: + DECW$SYSCOMMON:[SYSFONT.DECW.SPEEDO] + +Table 4–12 Bitstream Speedo Scalable Fonts (.SPD File Extension) +File Name Font Name + +Charter + +FONT0648 -Bitstream-Charter-Medium-R-Normal- -0-0-0-0-P-0-ISO8859-1 +FONT0649 -Bitstream-Charter-Medium-I-Normal- -0-0-0-0-P-0-ISO8859-1 +FONT0709 -Bitstream-Charter-Bold-R-Normal- -0-0-0-0-P-0-ISO8859-1 +FONT0710 -Bitstream-Charter-Bold-I-Normal- -0-0-0-0-P-0-ISO8859-1 + + +Courier + +FONT0419 -Bitstream-Courier-Medium-R-Normal- -0-0-0-0-m-0-ISO8859-1 +FONT0582 -Bitstream-Courier-Medium-I-Normal- -0-0-0-0-m-0-ISO8859-1 +FONT0583 -Bitstream-Courier-Bold-R-Normal- -0-0-0-0-m-0-ISO8859-1 +FONT0611 -Bitstream-Courier-Bold-I-Normal- -0-0-0-0-m-0-ISO8859-1 + + +4.6.7.5 Agfa Monotype TrueType Scalable Fonts + Table 4–13 lists the new Agfa Monotype TrueType scalable fonts and their file + names. The files for these fonts are located in the following directory: + DECW$SYSCOMMON:[SYSFONT.DECW.TRUETYPE] + +Table 4–13 Agfa Monotype TrueType Scalable Fonts (.TTF File Extension) +File Name Font Name + +Albany (Similar to Arial) + +ALBANYBD -Agfa Monotype-Albany-Bold-R-Normal- -0-0-0-0-P-0-ISO8859-1 +ALBANYBI -Agfa Monotype-Albany-Bold-I-Normal- -0-0-0-0-P-0-ISO8859-1 +ALBANYIT -Agfa Monotype-Albany-Medium-I-Normal- -0-0-0-0-P-0-ISO8859-1 +ALBANY_ _ -Agfa Monotype-Albany-Medium-R-Normal- -0-0-0-0-P-0-ISO8859-1 + + +Cumberland (Similar to Courier) + +CUMBB -Agfa Monotype-Cumberland-Bold-R-Normal- -0-0-0-0-M-0-ISO8859-1 +CUMBBI -Agfa Monotype-Cumberland-Bold-I-Normal- -0-0-0-0-M-0-ISO8859-1 +CUMBI -Agfa Monotype-Cumberland-Medium-I-Normal- -0-0-0-0-M-0-ISO8859-1 +CUMBR -Agfa Monotype-Cumberland-Medium-R-Normal- -0-0-0-0-M-0-ISO8859-1 + + (continued on next page) + + + + +4–34 Programming Features + Programming Features + 4.6 X Window System Library (Xlib) + + +Table 4–13 (Cont.) Agfa Monotype TrueType Scalable Fonts (.TTF File Extension) +File Name Font Name + +Screen + +SAN_M_21 -Agfa Monotype-Screen Sans-Medium-R-Normal- -0-0-0-0-M-0-ISO8859-1 +SAN_P_21 -Agfa Monotype-Screen Sans-Medium-R-Normal- -0-0-0-0-P-0-ISO8859-1 +SRF_M_21 -Agfa Monotype-Screen Serif-Medium-R-Normal- -0-0-0-0-M-0-ISO8859-1 +SRF_P_21 -Agfa Monotype-Screen Serif-Medium-R-Normal- -0-0-0-0-P-0-ISO8859-1 + + +Thorndale (Similar to Times New Roman) + +THOBI_ _ _ -Agfa Monotype-Thorndale-Bold-I-Normal- -0-0-0-0-P-0-ISO8859-1 +THOB_ _ _ _ -Agfa Monotype-Thorndale-Bold-R-Normal- -0-0-0-0-P-0-ISO8859-1 +THOI_ _ _ _ -Agfa Monotype-Thorndale-Medium-I-Normal- -0-0-0-0-P-0-ISO8859-1 +THOR_ _ _ _ -Agfa Monotype-Thorndale-Medium-R-Normal- -0-0-0-0-P-0-ISO8859-1 + + +4.6.7.6 Adobe Type1 Fonts + Table 4–14 lists previously undocumented Adobe Type1 fonts and their file names. + The files for these fonts are located in the following directory: + DECW$SYSCOMMON:[SYSFONT.DECW.TYPE1] + +Table 4–14 Adobe Type1 Scalable Fonts (.PCA File Extension) +File Name Font Name + +Courier + +COUR -Adobe-Courier-Medium-R-Normal- -0-0-0-0-P-0-ISO8859-1 +COURI -Adobe-Courier-Medium-I-Normal- -0-0-0-0-P-0-ISO8859-1 +COURB -Adobe-Courier-Bold-R-Normal- -0-0-0-0-P-0-ISO8859-1 +COURBI -Adobe-Courier-Bold-I-Normal- -0-0-0-0-P-0-ISO8859-1 + + +Utopia + +UTRG_ _ _ _ -Adobe-Utopia-Medium-R-Normal- -0-0-0-0-P-0-ISO8859-1 +UTI_ _ _ _ _ -Adobe-Utopia-Medium-I-Normal- -0-0-0-0-P-0-ISO8859-1 +UTB_ _ _ _ _ -Adobe-Utopia-Bold-R-Normal- -0-0-0-0-P-0-ISO8859-1 +UTBI_ _ _ _ -Adobe-Utopia-Bold-I-Normal- -0-0-0-0-P-0-ISO8859-1 + + +4.6.8 UIDPATH Environment Variable + V1.2–6 + When opening a hierarchy, DECwindows Motif searches the DECW$USER_ + DEFAULTS and DECW$SYSTEM_DEFAULTS areas for the User Interface + Definition (UID) file. On UNIX systems, the search path is defined using the + UIDPATH variable and its fallbacks. + Now DECwindows Motif also checks for the UIDPATH variable if the UID + file is not found using either of the OpenVMS symbols listed above. This + variable references a UNIX-style pathname (for example, /foo/bar) and allows + + + + Programming Features 4–35 + Programming Features +4.6 X Window System Library (Xlib) + + the substitutions strings as specified by X11 standards. For more information on + the UIDPATH variable, see the OSF/Motif Programmer’s Reference. + + Note + The UIDPATH variable does not work with OpenVMS directory + specifications. Use the DECW$xxx_DEFAULTS logicals to specify + OpenVMS-style search paths. + + + +4.6.9 Client Side Extension Library + V1.1 + Starting with DECwindows Motif for OpenVMS Version 1.1, Xlib added a client + side library, DECW$XEXTLIBSHR.EXE, that allows OpenVMS clients to issue + Shape, XInput, Multibuffer, and Shared Memory extension requests to servers + that provide these features. + You must modify the linking file options for client applications that issue + these extension requests to link to the Xlib extensions shareable image in + SYS$LIBRARY:DECW$XEXTLIBSHR.EXE. Add the following line to your linker + options file: + SYS$LIBRARY:DECW$XEXTLIBSHR/SHARE + For more information on Shape, XInput, and Multibuffer extensions, see the + following text files in SYS$HELP: + DECW$SHAPE.TXT + DECW$XINPUT.TXT + DECW$MULTIBUFFER.TXT + +4.7 X Window System Extensions and Protocols + The following sections describe features related to X Window System extensions, + protocols, and their libraries. + +4.7.1 Additional X Display Server Extensions Supported with X11R6.6 + V1.3 + The following X11R6.6 protocol X Window System extensions have been + integrated into the DECwindows X11 Display Server and are now supported + by DECwindows Motif: + • Application Group (XC-APPGROUP) + • Big Requests (BIG-REQUESTS) + • Colormap Utilization Policy (TOG-CUP) + • Extended Visual Information (EVI) + • Low-Bandwidth X (LBX) + • Security (SECURITY) + • Synchronization (SYNC) + • XC-MISC + • X Double Buffer (DBE) + + + +4–36 Programming Features + Programming Features + 4.7 X Window System Extensions and Protocols + + • XINERAMA (formerly PanoramiX) + • X Keyboard (XKB) + BIG-REQUESTS, EVI, SYNC, TOG-CUP, and XC-MISC are a permanent + part of the DECwindows X11 Display Server and are always enabled. DBE, + LBX, SECURITY, XC-APPGROUP, XINERAMA, and XKB are dynamically + loadable using the DECW$SERVER_EXTENSIONS parameter defined in the + DECW$PRIVATE_SERVER_SETUP.COM file. With this symbol, each extension + is converted to a shareable image, which is run at server startup. Note that some + combinations of extensions can result in conflict; see HP DECwindows Motif for + OpenVMS Management Guide for instructions on enabling these extensions. + To access these these extensions, link applications against one or more of the + following libraries: + + Extension Library + DBE DECW$XEXTLIBSHR + EVI + LBX + SECURITY + SYNC + TOG-CUP + XC-APPGROUP + XINERAMA + BIG-REQUESTS DECW$XLIBSHR + XC-MISC + XKB + + For more information about the updates made to the client-side extension library + in support of X11R6.6, see Section 4.6.3. + The following sections briefly describe each extension, its function, and any + variances from the standard X11R6.6 implementation provided by the X.Org + Foundation. For a detailed description of each extension protocol and the + available server requests, see the X Window System (Scheifler and Gettys) series + of manuals described in the HP DECwindows Motif for OpenVMS Documentation + Overview, or visit the X.Org Foundation web site (http://www.x.org) for protocol + and library specifications. +4.7.1.1 Application Group Extension (XC-APPGROUP) + XC-APPGROUP enables multiple programs to manage X Window applications + on the desktop. This extension allows X applications to be embedded into the + window of another program, such as a web browser. + Sets of one or more applications, known as an Application Group, are managed + by a controlling application, known as the Application Group Leader. The group + shares the Substructure-Redirect attribute of the window with the Application + Manager and one or more Application Group Leaders. + Code that uses XC-APPGROUP must include the following header files: + # include "DECW$INCLUDE:Xlib.h" + # include "DECW$INCLUDE:Xag.h" + + + + + Programming Features 4–37 + Programming Features +4.7 X Window System Extensions and Protocols + + This extension is dynamically loadable (along with the SECURITY extension) at + server startup; see the HP DECwindows Motif for OpenVMS Management Guide. + Call the following routine to check if XC-APPGROUP is available on the server + system: + Bool XagQueryVersion ( + Display *dpy, + int *major_version_return, + int *minor_version_return + ); + The following table lists each argument and its description. + + Argument Description + dpy An input parameter that contains the current display. + major_version_ Major version number of the extension implementation. Returned by + return XagQueryVersion. + minor_version_ Minor version number of the extension implementation. Returned by + return XagQueryVersion. + +4.7.1.2 Big Requests Extension (BIG-REQUESTS) + BIG-REQUESTS enables a client application to extend the length field of a + protocol request from 218 bytes to a 32-bit value. This is useful for clients and + other extensions that frequently transmit complex information to the display + server. + The only callable function associated with this extension is + XExtendedMaxRequestSize, which has been incorporated into Xlib. As such, + it is always available when connected to an X Window system that offers this + extension. +4.7.1.3 Colormap Utilization Policy Extension (TOG-CUP) + TOG-CUP provides the following colormap management capabilities to the display + server: + • A mechanism for a special application (such as a colormap manager) to + recognize special colormap requirements. For example, this extension enables + an application to locate and initialize a default colormap. + • A policy that encourages colormap sharing and reduces colormap flashing on + low-end 8-bit frame buffers. + • A behavior in the color allocation scheme that reduces colormap flashing + when colormaps are not shared. + Specifically, the TOG-CUP protocol provides methods that query the server for + a list of reserved colormap entries and initialize shareable colormap entries + at specific locations. If the core protocol does not contain information about + the returned pixel values, the AllocColor and AllocNamedColor requests look + in the default colormap for a matching color. If a match is found and the + corresponding cell in the private colormap is empty, the color is allocated to + that cell in the private colormap rather than the first available location. This + minimizes colormap flashing when the main window’s default visual class is using + a private colormap and is set to GrayScale, PseudoColor, or DirectColor. + + + + +4–38 Programming Features + Programming Features + 4.7 X Window System Extensions and Protocols + + Code that uses the TOG-CUP extension must include the following header files: + # include "DECW$INCLUDE:Xlib.h" + # include "DECW$INCLUDE:Xcup.h" + This extension is a fixed part of the display server and is always enabled. Call + the following routine to check if the TOG-CUP extension is available on the server + system: + Bool XcupQueryVersion (display, &major, &minor) + Display *display, + int major,minor; + Note that client applications must call XcupQueryVersion before calling any other + TOG-CUP function. + The following table lists each argument and its description. + + Argument Description + display An input parameter that contains the current display. + major Major version number of the extension implementation. Returned by + XcupQueryVersion. + minor Minor version number of the extension implementation. Returned by + XcupQueryVersion. + +4.7.1.4 Extended Visual Information Extension (EVI) + EVI enables a client to query the display server for additional information about + core X visuals, such as colormap information and framebuffer levels. Note that + this extension only provides support for client applications and not other X + Window System extensions. + Code that uses EVI must include the following header files: + # include "DECW$INCLUDE:Xlib.h" + # include "DECW$INCLUDE:Xevi.h" + This extension is a fixed part of the display server and is always enabled. Call + the following routine to check if EVI is available on the server system: + Bool XeviQueryExtension ( + Display *dpy + ); + The following table lists each argument and its description. + + Argument Description + dpy An input parameter that contains the current display. + +4.7.1.5 Low-Bandwidth X Extension (LBX) + LBX is a network-transparent protocol for running X Window System applications + over transport channels whose bandwidth and latency are significantly lower + than that available in local area networks. LBX combines a variety of caching + and reencoding techniques that reduce the volume of data sent over the network. + By using a proxy server as an intermediary between the client applications and + the X server, low-bandwidth/high-latency communication is maintained between + the proxy and X server. The proxy server reencodes and compresses requests, + events, replies and errors, as well as the resulting data stream. Additionally, + + + + Programming Features 4–39 + Programming Features +4.7 X Window System Extensions and Protocols + + the proxy can cache information from the server to provide low-latency replies to + client applications. + A proxy can serve multiple client applications and does not prevent clients from + connecting directly to the server. The proxy can combine calls from multiple + client applications into a single data stream. + Use of LBX is transparent to clients. The only interface to LBX available to client + code is a query to check the availability of LBX. Code that uses this query must + include the following header files: + # include "DECW$INCLUDE:Xlib.h" + # include "DECW$INCLUDE:Xlbx.h" + This extension is dynamically loadable at server startup; see the HP + DECwindows Motif for OpenVMS Management Guide. Call the following routines + to check if LBX has been loaded and is available on the server system: + Bool XLbxQueryVersion( + Display *display, + int *major_version_return, + int *minor_version_return + ); + The following table lists each argument and its description. + + Argument Description + display An input parameter that contains the current display. + major_version_ Major version number of the extension implementation. Returned by + return XLbxQueryVersion. + minor_version_ Minor version number of the extension implementation. Returned by + return XLbxQueryVersion. + +4.7.1.6 Security Extension (SECURITY) + SECURITY contains a new protocol that provides for enhanced X server security. + This extension adds the concepts of trusted and untrusted client connections + to the X Window System protocol. The trust status of a client is determined by + the authorization method used during the startup of a connection. All clients + using host- or user-based authorization are considered trusted. Clients using + token-based authorization protocols may be either trusted or untrusted depending + on the authorization data included in the connection request. + The requests in SECURITY permit a trusted client to create multiple + authorization entries related to a single authorization protocol. Each entry is + tagged with a trust status, which is then associated with any client using that + authorization entry. + When a connection identifying an untrusted client is accepted, the client is + restricted from performing certain operations that would steal or modify data + that is held by the server for trusted clients. An untrusted client performing a + disallowed operation will receive protocol errors. + When a client is untrusted, the server can also limit the extensions that are + available to the client. Each X protocol extension is responsible for defining what + operations are permitted to untrusted clients. By default, the entire extension is + hidden to untrusted clients. + + + + +4–40 Programming Features + Programming Features + 4.7 X Window System Extensions and Protocols + + With DECwindows Motif, the following extensions (standard and non-standard) + are defined as secure: + BIG-REQUESTS + LBX + XC-MISC + All other extensions are considered insecure. See the HP DECwindows Motif + for OpenVMS Management Guide for more information on how to select an + appropriate authentication method and specify trusted or untrusted connections. + Code that uses SECURITY must include the following header files: + # include "DECW$INCLUDE:Xlib.h" + # include "DECW$INCLUDE:security.h" + This extension is dynamically loadable (along with the XC-APPGROUP extension) + at server startup; see HP DECwindows Motif for OpenVMS Management Guide. + Call the following routine to check if SECURITY is available on the server + system: + Bool XSecurityQueryExtension ( + Display *dpy, + int *major_version_return, + int *minor_version_return + ); + The following table lists each argument and its description. + + Argument Description + dpy An input parameter that contains the current display. + major_version_ Major version number of the extension implementation. Returned by + return XSecurityQueryExtension. + minor_version_ Minor version number of the extension implementation. Returned by + return XSecurityQueryExtension. + +4.7.1.7 XC-MISC Extension + XC-MISC allows client applications to retrieve previously-used resource ID ranges + from the X server. Xlib handles this function automatically. This extension + is useful for long-running applications that use many resource IDs over their + runtime life. + Since the XC-MISC functions are part of Xlib, they are a standard part of the + client. As such, they are are always available when connected to an X Window + system that offers this extension. +4.7.1.8 X Double Buffer Extension (DBE) + DBE provides a way to display flicker-free animation on an X Window system and + is intended as a replacement to the Multibuffering extension. Successive frames + of an animation sequence are rendered into the back buffer while the previously + rendered frame is displayed in the front buffer. When a new frame is ready, the + back and front buffers swap roles, making the new frame visible. Only completely + rendered frames are shown; these frames remain visible during the entire time it + takes to display the new frame. + Code that uses DBE must include the following header files: + # include "DECW$INCLUDE:Xlib.h" + # include "DECW$INCLUDE:Xdbe.h" + + + Programming Features 4–41 + Programming Features +4.7 X Window System Extensions and Protocols + + This extension is dynamically loadable at server startup; see the HP + DECwindows Motif for OpenVMS Management Guide. Call the following routine + to check if the extension has been loaded and is available on the server system: + Bool XdbeQueryExtension ( + Display *dpy, + int *major_version_return, + int *minor_version_return + ); + The following table lists each argument and its description. + + Argument Description + dpy An input parameter that contains the current display. + major_version_ Major version number of the extension implementation. Returned by + return XdbeQueryExtension. + minor_version_ Minor version number of the extension implementation. Returned by + return XdbeQueryExtension. + +4.7.1.9 XINERAMA Extension + XINERAMA (formerly known as PanoramiX) enables a system configured with + multiple video monitors (multiheaded system) to function as a single large screen. + This extension allows application windows and cursor movement to span multiple + screens and move from one screen to another. + The overall size of the composite screen equals the combined size of all screens. + Monitor configurations can be easily modified by enabling this extension in + conjunction with the associated screen symbols (such as DECW$SERVER_ + SCREENS). See the HP DECwindows Motif for OpenVMS Management Guide for + the complete list of logicals associated with this extension and for instructions on + how to setup and configure a multiheaded system that uses XINERAMA. + + Note + This extension is only supported in a homogeneous graphics environment, + which consists of common display devices, visual classes, depths, + resolutions, etc. In addition, there may be some restrictions if operating + in 3D mode (such as with the OpenGL layered product). See HP + DECwindows Motif for OpenVMS Release Notes for the current + restrictions regarding this extension. + + +4.7.1.10 X Keyboard Extension (XKB) + XKB enhances the control and customization of the keyboard under the X Window + System by providing the following: + • Support for the ISO9996 standard for keyboard layouts + • Compatibility with the core X keyboard handling + • Standard methods for handling keyboard LEDs and locking modifiers + • Support for keyboard geometry + Note that all AccessX extension features for people with physical impairments + have been incorporated into XKB. These accessibility features include StickyKeys, + SlowKeys, BounceKeys, MouseKeys, and ToggleKeys, as well as complete control + over the autorepeat delay rate. + + +4–42 Programming Features + Programming Features + 4.7 X Window System Extensions and Protocols + + Code that uses XKB must minimally include the following header files: + # include "DECW$INCLUDE:Xlib.h" + # include "DECW$INCLUDE:XKBlib.h" + To modify keyboard geometry descriptions, the names and identifiers of the + predefined bells, or X Keyboard map definitions, additionally include the following + header files: + # include "DECW$INCLUDE:XKBgeom.h" + # include "DECW$INCLUDE:XKBbells.h" + # include "DECW$INCLUDE:XKM.h" + # include "DECW$INCLUDE:XKMformat.h" + # include "DECW$INCLUDE:XKBfile.h" + # include "DECW$INCLUDE:XKBrules.h" + # include "DECW$INCLUDE:XKBconfig.h" + This extension is dynamically loadable at server startup; see the HP + DECwindows Motif for OpenVMS Management Guide. Call the following routine + to check if the extension has been loaded and is available on the server system: + Bool XkbQueryExtension( + Display *dpy, + int *opcodeReturn, + int *eventBaseReturn, + int *errorBaseReturn, + int *majorReturn, + int *minorReturn + ); + The following table lists each argument and its description. + + Argument Description + dpy An input parameter that contains the current display. + opcodeReturn Major operation code of the extension. Returned by + XkbQueryExtension. + eventBaseReturn Base event code of the extension. Returned by XkbQueryExtension. + errorBaseReturn Base error code of the extension. Returned by XkbQueryExtension. + majorReturn Major version number of the extension implementation. Returned by + XkbQueryExtension. + minorReturn Minor version number of the extension implementation. Returned by + XkbQueryExtension. + +4.7.1.11 X Synchronization Extension (SYNC) + SYNC provides primitive calls that synchronize requests from multiple clients + on different hosts running different operating systems. This extension enables + applications to make the best use of buffering resources within the client, server, + and network and eliminates network errors that can occur when two systems are + running a distributed application. + Multimedia applications can use this extension to synchronize streams of audio, + video, and graphics data. For example, simple animation applications can be + implemented without having to use round-trip requests. + Code that uses SYNC must include the following header files: + # include "DECW$INCLUDE:Xlib.h" + # include "DECW$INCLUDE:sync.h" + + + + + Programming Features 4–43 + Programming Features +4.7 X Window System Extensions and Protocols + + This extension is a fixed part of the display server and is always enabled. Call + the following routines to check if the extension has been loaded and is available + on the server system: + Bool XSyncQueryExtension( + Display *dpy, + int *event_base_return, + int *error_base_return + ); + Status XSyncInitialize( + Display *dpy, + int *major_version_return, + int *minor_version_return + ); + The following table lists each argument and its description. + + Argument Description + dpy An input parameter that contains the current display. + event_base_ An output parameter that indicates the base event code for the + return extension. + error_base_ An output parameter that indicates the base error code for the + return extension. + major_version_ Major version number of the extension implementation. Returned by + return XSyncInitialize. + minor_version_ Minor version number of the extension implementation. Returned by + return XSyncInitialize. + + +4.7.2 Server Extensions Updated for X11R6.6 + V1.3 + The following existing X Window System extensions have been updated: + • DEC XTrap (DEC-XTRAP) and X Test (XTEST) – Now disabled with the + DECW$SERVER_DISABLE_TEST parameter + • MIT Screen Saver (MIT-SCREEN-SAVER) – Updated to work with + XINERAMA + • Multibuffering (MBE) – New XmbufClearBufferArea function + • MIT Miscellaneous (MIT-SUNDRY-NONSTANDARD) + • MIT Shared Memory (MIT-SHM) + • Non-Rectangular Window Shape (SHAPE) + • X Image Extension (XIE) – Supports V3.0 and not the adopted standard of + V5.0 + +4.7.3 Inter-Client Exchange (ICE) Protocol Support + V1.3 + The Inter-Client Exchange (ICE) Protocol provides support for direct X Window + System client-to-client communication without using the X server. This + means that DECwindows Motif client applications can use ICE rather than + connect to the X server. The standard protocol provides the basic mechanisms + for establishing and closing network transport connections, performing + authentication, negotiating versions, and reporting errors. The protocols running + + +4–44 Programming Features + Programming Features + 4.7 X Window System Extensions and Protocols + + within an ICE connection are known a subprotocols, of which Session Manager + (described in Section 4.7.4) is a member. + A new client-side library, DECW$ICELIB, is provided. Code that uses ICE must + include the following header file: + # include "DECW$INCLUDE:Icelib.h" + The following sections describe the implementation of ICE provided with + DECwindows Motif, highlighting any variances from or restrictions posed by the + standard implementation. For a detailed description of the ICE protocol and the + available server requests, see the X Window System (Scheifler and Gettys) series + of manuals described in the HP DECwindows Motif for OpenVMS Documentation + Overview, or visit the X.Org Foundation web site (http://www.x.org) for protocol + and library specifications. +4.7.3.1 Multithreading Considerations + The ICE library supports multithreading after IceInitThreads has been called. + IceInitThreads must be the first call on the ICE library if multithreading is + required. Programs that call IceInitThreads must have been linked against + PTHREAD$RTL. + The following sections further describe issues with using ICE functions in a + multithreaded environment. + Lock Nesting + Locks held by IceLockConn and IceAppLockConn are recursive. The + corresponding unlock routine must be called the same number of times as the + lock routine. + Deleting IceConn Objects + IceConn objects can be deleted by: + • IceProcessMessages returning IceProcessMessagesConnectionClosed + • IceCloseConnection returning IceClosedNow + In these cases, the IceConn object is freed without validation even though locks + may still be held. To avoid race conditions, ensure that the deleted IceConn object + is not being used by another thread. + Non-Atomic Functions and Macros + The following subset of the ICE functions that prepare and read messages are not + atomic and do not acquire locks: + IceGetHeader + IceGetHeaderExtra + IceSimpleMessage + IceErrorHeader + IceWriteData + IceWriteData16 + IceWriteData32 + IceSendData + IceWritePad + IceReadSimpleMessage + IceReadCompleteMessage + IceDisposeCompleteMessage + IceReadMessageHeader + IceReadData + IceReadData16 + + + Programming Features 4–45 + Programming Features +4.7 X Window System Extensions and Protocols + + IceReadData32 + IceReadPad + Any multithreaded application that uses one or more of these macros or functions + must explicitly acquire a lock on the connection before creating a message, and + release the lock after the message is prepared. For read operations, this action is + not required since the ICE process callbacks automatically lock the connection. + For example, the following is sample code for creating a message: + IceAppLockConn (iceConn); + IceGetHeaderExtra (iceConn, _SmcOpcode, SM_RegisterClient, + SIZEOF (smRegisterClientMsg), WORD64COUNT (extra), + smRegisterClientMsg, pMsg, pData); + *((CARD32 *) pData) = len; + pData += 4; + memcpy (pData, previousId, len); + pData += (len + 3) & (~3); + IceAppUnLockConn (iceConn); + Since an ICE connection can be shared between protocols, every protocol must + use these locks, even if the protocol can only be used by a single thread. + Opening Connections + DECwindows Motif restricts multithreaded applications from concurrently calling + IceOpenConnection and IceCloseConnection. IceOpenConnection can accept + concurrent calls to itself as long as IceCloseConnection is not called at the same + time. + ICE can maintain two open connections for the same protocol by using a major + opcode check to the IceOpenConnection call. Since a protocol is registered only + after it calls IceProtocolSetup, a conflict can occur if two threads simultaneously + establish ICE connections for the same protocol and request that the connection + is not shared. + To prevent this conflict from occurring, code for opening an ICE connection with a + major opcode check should follow a format similar to the following: + IceConn conn; + IceProtocolSetupStatus status; + while (1) { + conn = IceOpenConnection (....) + if (conn == 0) break; + status = IceProtocolSetup (...) + if (status != IceProtocolAlreadyActive) break; + IceCloseConnection (conn); + /* Try again as another thread set up the protocol on this connection */ + } +4.7.3.2 Differences from the Standard Implementation + The following sections describe differences from and issues in the standard ICE + implementation provided with X11R6.6. + Connection and Protocol Authentication + The implementation of ICE included with DECwindows Motif does not include + any authentication mechanisms for ICE connections. All listen objects must use + IceSetHostBasedAuthProc to register host-based authentication. + + + + +4–46 Programming Features + Programming Features + 4.7 X Window System Extensions and Protocols + + For protocol authentication, all authentication schemes provided when the + protocol is registered are permitted. This differs from the standard ICE + implementation, where only those those schemes defined in the ICE Authority + (IceAuth) file are allowed. + Object Name Changes + The sample implementation of ICE provided by the X.Org Foundation contained + objects whose name differed from that described in the ICE specification. The + following table lists those objects and specifies which name was used in the + DECwindows Motif implementation of ICE. + + Documented Object + Name Implemented Object Name + IceGetContext IceConnectionGetContext + major_opcode majorOpcode + minor_opcode minorOpcode + + IceGetHeaderExtra Structure + The header structure used with IceGetHeaderExtra must have a sizeof value that + is a multiple of 8 bytes. +4.7.3.3 IPv6 Considerations + V1.5 + For ICE clients, the ICE library has been upgraded to support all the transport + names described in the HP DECwindows Motif for OpenVMS Management Guide. + For ICE servers, specifying a value of TCPIP or TCP now opens listen sockets on + all configured TCP/IP interfaces. If some of the interfaces are IPv6 interfaces, the + library supports accepting connections on IPv6 interfaces. + After using the IceListenForConnections call, you can use the + IceComposeNetworkIdList call to obtain the address for the TCP/IP listen object + in the format "tcp/hostname", where hostname is the value of the system logical + TCPIP$INET_HOST. Use of the generic TCP transport allows the listen object to + be used by both IPv4-based and IPv6-based peers. + The host-based authentication callback is provided the peer’s host name as + returned by the TCP/IP Services getnameinfo function. If the peer’s host name is + unavailable, the callback is provided with the peer’s host address in either IPv4 + or IPv6 format (depending on the protocol used to establish the connection). If + the address is an IPv4-mapped IPv6 address, the address is converted to an IPv4 + address before being provided to the callback. If the getnameinfo returns a name + that includes a scope identifier, the scope identifier is included in the value passed + to the callback. + +4.7.4 X Session Management Protocol (XSMP) Support + V1.3 + The X Session Management Protocol (XSMP) provides a standard way for users + to save client sessions. Each session is controlled by a network service known as + the session manager. The session manager issues commands that direct client + applications to save their state information for use during subsequent sessions. + This protocol is built on top of ICE, which manages the client connections to the + session manager server. + + + + Programming Features 4–47 + Programming Features +4.7 X Window System Extensions and Protocols + + Code that uses XSMP must include the following header files: + # include "DECW$INCLUDE:SM.h" + # include "DECW$INCLUDE:SMlib.h" + # include "DECW$INCLUDE:SMproto.h" + The following sections describe the implementation of XSMP provided with + DECwindows Motif, highlighting any variances from or restrictions posed + by the standard implementation. For a detailed description of the XSMP + protocol and the available server requests, see the X Window System (Scheifler + and Gettys) series of manuals described in the HP DECwindows Motif for + OpenVMS Documentation Overview, or visit the X.Org Foundation web site + (http://www.x.org) for protocol and library specifications. +4.7.4.1 Multithreading Considerations + The implementation of XSMP is thread safe, using locks on the underlying ICE + connection as needed. All send message operations are thread cancellation points; + all callback operations are made by locking the associated ICE connection. + When SmcOpenConnection is called, it opens an ICE connection and + processes messages until the session manager registers the client. The open + connection subsequently causes a series of ICE watch procedures to be called. + Typically, these procedures add the connection to a list monitored for input. + IceProcessMessages is called when input to the list arrives. The thread issuing + the IceProcessMessages calls will be blocked if it tries to handle a new connection. +4.7.4.2 Differences from the Standard Implementation + The following sections describe differences from and issues in the standard XSMP + implementation provided with X11R6.6. + SmcCloseConnection and SmsCleanUp + In the standard implementation, SmcCloseConnection disables shutdown + negotiation for an ICE connection, which results in abrupt termination of + the connection. This can prevent the session manager from receiving all + SmCloseConnection messages. + In the DECwindows Motif implementation, shutdown negotiation is enabled. + SmcCloseConnection returns SmcClosedASAP, and the connection is closed only + after the session manager calls SmsCleanUp. + Note also that the sample session manager code does not specify whether + SmsCleanUp closes an ICE Connection. In the DECwindows Motif + implementation, an IceCloseConnection call is issued. + POSIX Property Names and Data Type Definitions + The standard specification defines the data types and property names supported + for POSIX. The DECwindows Motif implementation specifies the property + names; however, the data types definitions are not provided, since they may + vary based on the use of session manager in the OpenVMS Alpha and OpenVMS + I64 environments. + SmsGenerateClientId and IPv6 + On a host where the primary TCP/IP interface limited to IPv6, the ID generated + by SmsGenerateClientId will follow the IPv6 format (as defined in the X11R6.7 + specification published by the X.Org Foundation). + + + + +4–48 Programming Features + Programming Features + 4.7 X Window System Extensions and Protocols + +4.7.5 MIT Shared Memory Extension (MIT-SHM) Support + V1.2 + Shared memory extension support provides the capability to share memory + XImages. This is a version of the XImage interface where the actual image data + is stored in a shared-memory segment. Consequently, the image does not need + to be moved through the Xlib interprocess communication channel. For large + images, use of this extension can result in dramatic performance increases. + Support for shared memory pixmaps is also provided. Shared memory pixmaps + are two-dimensional arrays of pixels in a format specified by the X server, where + the image data is stored in the shared memory segment. Through the use of + shared memory pixmaps, you can change the contents of these pixmaps without + using any Xlib routines. + These routines are included in the client side extension library. See Section 4.6.9 + for details on linking this library. +4.7.5.1 How to Use Shared Memory Extension + Code that uses the shared memory extension must include the following header + files: + # include "DECW$INCLUDE:Xlib.h" + # include "DECW$INCLUDE:shm.h" + # include "DECW$INCLUDE:XShm.h" + Any code that uses the shared memory extension should first check that the + server provides the extension. In some cases, such as running over the network, + the extension does not work. + To check if the shared memory extension is available on your system, call one of + the following routines: + Status XShmQueryExtension (display) + Display *display + Status XShmQueryVersion (display, major, minor, pixmaps) + Display *display; + int *major, *minor; + Bool *pixmaps + The following table lists each argument and its description. + + Argument Description + display The current display. + If the shared memory extension is used, the return value from either + function is True. Otherwise, your program operates using conventional + Xlib calls. + major Major version number of the extension implementation. Returned by + XShmQueryVersion. + minor Minor version number of the extension implementation. Returned by + XShmQueryVersion. + pixmaps True, indicates that shared memory pixmaps are supported. + + + + + Programming Features 4–49 + Programming Features +4.7 X Window System Extensions and Protocols + +4.7.5.2 Using Shared Memory XImages + The following sequence shows the process for creating and using shared memory + XImages: + 1. Create the shared memory XImage structure. + 2. Create a shared memory segment to store the image data. + 3. Attach the shared memory segment. + 4. Inform the server about the shared memory segment. + 5. Use the shared memory XImage. + The following sections explain each step in this process: + Step 1—Creating a Shared Memory XImage Structure + To create a shared memory XImage, use the XShmCreateImage routine, which + has the following format: + XImage *XShmCreateImage (display, visual, depth, format, data, + shminfo, width, height) + Display *display; + Visual *visual; + unsigned int depth, width, height; + int format; + char *data; + XShmSegmentInfo *shminfo; + Most of the arguments are the same as for XCreateImage (See the X Window + System for a description of the XCreateImage routine.) Note that there are no + offset, bitmap_pad, or bytes_per_line arguments. These quantities are set by the + server, and your code needs to abide by them. Unless you have already allocated + the shared memory segment (see step 2), you pass in NULL for the data pointer. + The argument shminfo is a pointer to a structure of type XShmSegmentInfo. + Allocate one of these structures so that it has a lifetime at least as long as that + of the shared memory XImage. There is no need to initialize this structure before + the call to XShmCreateImage. + If successful, an XImage structure is returned, which you can use for the + subsequent steps. + Step 2—Creating the Shared Memory Segment + Create the shared memory segment after the creation of the XImage because the + XImage returns information that indicates how much memory to allocate. + The following example illustrates how to create the segment: + shminfo.shmid = shmget (IPC_PRIVATE, + image->bytes_per_line * image->height, IPC_CREAT|0777); + This example assumes that you called your shared memory XImage structure. + A return value of 0 indicates the shared memory allocation has failed. Use the + bytes_per_line field, not the width you used to create the XImage, as they may be + different. + Note that the shared memory ID returned by the system is stored in the shminfo + structure. The server needs that ID to attach itself to the segment. + + + + +4–50 Programming Features + Programming Features + 4.7 X Window System Extensions and Protocols + +Step 3—Attaching the Shared Memory Segment +Attach the shared memory segment to your process as in the following example: +shminfo.shmaddr = image->data = shmat (shminfo.shmid, 0, 0); +The address returned by shmat is stored in both the XImage structure and the +shminfo structure. +To finish supplying arguments in the shminfo structure, decide how you want the +server to attach to the shared memory segment, and set the shminfo.readOnly +field as follows: +shminfo.readOnly = False; +If you set the structure to True, the server cannot write to this segment, and +XShmGetImage calls fail. + + Note + The shared memory segment routines are provided with DECwindows + Motif. Using global sections, these routines emulate the shared memory + routines on UNIX systems. + + +Step 4—Informing the Server About the Shared Memory Segment +Tell the server to attach to your shared memory segment as in the following +example: +Status XShmAttach (display, shminfo); +If successful, a nonzero status is returned, and your XImage is ready for use. +Step 5—Using the Shared Memory XImage +To write a shared memory XImage into an X drawable, use the XShmPutImage +routine. The XShmPutImage routine uses the following format: +XShmPutImage (display, d, gc, image, src_x, src_y, + dest_x, dest_y, width, height, send_event) + Display *display; + Drawable d; + GC gc; + XImage *image; + int src_x, src_y, dest_x, dest_y; + unsigned int width, height; + Bool send_event; +The interface is identical to the XPutImage routine (see the X Window System), +except for one additional parameter, send_event. If this parameter is passed as +True, the server generates a completion event when the image write is complete. +This allows your program to know when it is safe to begin manipulating the +shared memory segment again. + + + + + Programming Features 4–51 + Programming Features +4.7 X Window System Extensions and Protocols + + The completion event is of the type XShmCompletionEvent, which is defined as + follows: + typedef struct { + inttype; /* of event */ + unsigned long serial; /* # of last request processed */ + Bool send_event; /* true if came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Drawable drawable; /* drawable of request */ + int major_code; /* ShmReqCode */ + int minor_code; /* X_ShmPutImage */ + ShmSeg shmseg; /* the ShmSeg used in the request */ + unsigned long offset; /* the offset into ShmSeg used */ + } XShmCompletionEvent; + To determine the event type value that is used at run time, use the + XShmGetEventBase routine as in the following example: + int CompletionType = XShmGetEventBase (display) + ShmCompletion; + + Note + If you modify the shared memory segment before the arrival of the + completion event, the results may be inconsistent. + + + To read image data into a shared memory XImage, use the XShmGetImage + routine, which uses the following format: + Status XShmGetImage (display, d, image, x, y, plane_mask) + Display *display; + Drawable d; + XImage *image; + int x, y; + unsigned long plane_mask; + The following table lists each argument and its description. + + Argument Description + display The display of interest. + d The source drawable. + image The destination XImage. + x X-offset within the source drawable. + y Y-offset within the source drawable. + plane_mask The planes that are to be read. + + To destroy a shared memory XImage, first instruct the server to detach from it, + then destroy the segment itself. The following example illustrates how to destroy + a shared memory XImage: + XShmDetach (display, shminfo); + XDestroyImage (image); + shmdt (shminfo.shmaddr); + shmctl (shminfo.shmid, IPC_RMID, 0); + + + + +4–52 Programming Features + Programming Features + 4.7 X Window System Extensions and Protocols + +4.7.5.3 Using Shared Memory Pixmaps + Unlike X images, for which any image format is usable, the shared memory + extension supports only a single format for the data stored in a shared memory + pixmap (XYPixmap or ZPixmap). This format is independent of the depth of the + image and independent of the screen. (For 1-bit pixmaps the format is irrelevant.) + The XShmPixmapFormat routine returns the shared memory pixmap format for + the server. The XShmPixmapFormat routine has the following format: + int XShmPixmapFormat (display) + Display *display; + Your application can only use shared memory pixmaps in the format returned + by the XShmPixmapFormat routine (including bits-per-pixel). To create a shared + memory pixmap do the following: + • Create a shared memory segment and shminfo structure exactly the + same way as is listed for shared memory XImages steps 1 through 4 (see + Section 4.7.5.2). While it is not necessary to create an XImage first (step 1), + doing so incurs little overhead and provides an appropriate bytes_per_line + value to use. + • Call the XShmCreatePixmap routine, which has the following format: + Pixmap XShmCreatePixmap (display, d, data, shminfo, width, + height, depth); + Display *display; + Drawable d; + char *data; + XShmSegmentInfo *shminfo; + unsigned int width, height, depth; + The arguments are the same as for XCreatePixmap (see the X Window + System) except for two additional parameters, data and shminfo. The data + parameter is the pointer to the shared memory segment and is the same + as the shminfo.shmaddr field. The shminfo parameter is the same as the + previous structure. + If successful, a pixmap is returned, which you can manipulate. You can + manipulate its contents directly through the shared memory segment. Shared + memory pixmaps are destroyed with the XFreePixmap routine, although + you should detach and destroy the shared memory segment (see step 4 in + Section 4.7.5.2). + +4.7.6 X Image Extension (XIE) Support + V1.1 + Starting with DECwindows Motif for OpenVMS Version 1.1, DECwindows Motif + supports the X Image Extension (XIE). XIE allows image display processing using + resources on the server side of the X client-server model. XIE eliminates the need + to transmit image data repeatedly from the client to the server and also allows + data to be transmitted in compressed form, reducing the network load. + DECwindows Motif includes the XIE client side shareable library + (XIE$SHRLIB.EXE) and C language header files. These allow applications + to communicate with any X11 server that supports the XIE extension. + + + + + Programming Features 4–53 + Programming Features +4.7 X Window System Extensions and Protocols + + An XIE program uses a structure called the XIEImage to describe image data + on the client side. This general mechanism describes data that the destination + server is incapable of processing. Consult the documentation for the server + system for information on what data types and sizes are supported. Unless + the documentation specifies different limits, the server is capable of processing + unsigned byte (UdpK_DTypeBU), unaligned bit field (UdpK_DTypeVU), and + aligned bit field (UdpK_DTypeV) data, with a maximum depth of 8 bits per pixel + per component. The XIE client library supports these data types, as well as + unsigned word (UdpK_DTypeWU), and a depth of up to 16 bits per pixel per + component. + Although the XIE protocol and programming interface have been standardized for + X11R6, DECwindows Motif has not yet migrated to the latest implementation of + this protocol. + +4.8 X Window System Internationalization Library (Xnl) + The following sections contain features related to X Windows System + Internationalization Library (Xnl). + +4.8.1 The I18N Library Now Supports GB18030 + V1.6 + Support for GB18030 has now been added to the I18N library. + +4.9 Transport Programming + The following sections contain features related to DECwindows Motif transport + interfaces. + +4.9.1 Support for the LAT Transport Interface Available + V1.3–1 + Support for the DECwindows Motif interface to the LAT transport, which was + withdrawn with DECwindows Motif Version 1.3, has been restored and is + available on the OpenVMS Alpha and OpenVMS I64 platforms. This support + enables users to start LAT X sessions and communicate over low-capacity + networks with systems running DECwindows Motif Version 1.3–1 or higher. It + also allows client applications running on these DECwindows Motif systems to + use the LAT transport to connect to X terminal systems. + Note that the restored LAT interface included with the OpenVMS operating + system can be used as a valid network transport for communication with the + DECwindows Motif Version 1.3–1 (or greater) and OpenVMS Version 7.3–2 (or + greater) display servers. However, use with any other communication protocols + in the X11R6.6 environment is not supported. This includes communication by or + with the following: + • Inter-Client Exchange (ICE) and Session Manager protocols + • Low-Bandwidth X (LBX) proxy servers + • Proxy manager applications + • Font servers + Additionally, HP does not support the use of a token-based authentication protocol + (such as MIT-MAGIC-COOKIE-1 or MIT-KERBEROS-5) with the restored LAT + transport interface. + + + +4–54 Programming Features + Programming Features + 4.9 Transport Programming + +4.9.2 Support for the Logical Connection Number (LCN) Interface + V1.3 + DECwindows Motif now includes an interface for determining when an I/O + channel is ready and available for use. The logical connection number (LCN) + interface is now used to signal when DECwindows Motif I/O channels are + available, including those for Inter-Client Exchange (ICE), local and remote X + server, and for Input Method Server connections. + Previously, DECwindows Motif used an OpenVMS event flag number (EFN) to + signal when input was received from the X server. However, EFNs cannot be + used safely in a multithreaded environment. The LCN interface allows multiple + threads to handle the same, or different, connections without any thrashing or + unnecessary delays. + The following sections further describe the functions of the LCN interface and + provide detailed information about the supported routines. +4.9.2.1 LCN Functions + The principal function of the LCN interface is to test the readiness of an I/O + channel. The design of the interface is based on the UNIX select function, which + tests the state of UNIX file descriptors and returns when one of them is ready or + a timeout occurs. + On OpenVMS, the LCN routines perform the following operations: + • Initialize support for multithreading + • Allocate a connection number + • Query the status of a connection number + • Signal when input is available + 4.9.2.1.1 Initializing Thread Support LCN routines can execute in a single- + threaded environment using EFNs to signal input or in a multithreaded + environment using POSIX Threads routines. Multithreading is enabled with + the DECW$LCN_THREAD_INIT routine. + With multithreading enabled, the select routines (DECW$LCN_SELECT_ONE + and DECW$LCN_SELECT) can be called concurrently from multiple kernel + threads in user mode and one kernel thread in exec mode. Calls from user mode + ASTs are not allowed. + With single threading, the select routines can be called from user mode and exec + mode ASTs. Note, however, that the only concurrent calls allowed are one call + from user mode followed by one call from an AST in user mode. + 4.9.2.1.2 Allocating Connection Numbers LCNs are allocated to a connection + using the DECW$LCN_ALLOCATE routine. Values for LCNs start at 64 to + distinguish them from local event flags. The maximum number of concurrently + allocated LCNs equals the open file limit of the process. If the quota is 0, a + default value of 1023 is used. If the quota exceeds the maximum value, a value of + 2047 is used. + Once an LCN is allocated, it is unavailable for reuse until freed by the + DECW$LCN_FREE routine. + + + + + Programming Features 4–55 + Programming Features +4.9 Transport Programming + + 4.9.2.1.3 Querying Status and Signaling Input Each LCN has three status + flags, which signify whether an LCN is ready and has received input from a + particular operation. Each flag can be either set (1) using the DECW$LCN_ + SET_x_READY routine or cleared (0) using the DECW$LCN_CLEAR_x_READY + routine. + Input is signaled by setting the appropriate ready flag. The following table lists + each LCN flag and describes when it is typically set and cleared. + + Flag Description + read ready Set when there is data available to read. + write ready Set when there is space in internal buffers to which data can be + written. + except ready Set when there is high-priority (exceptional) input. + + Each flag can be set individually, and a select operation can test any combination + of them. There are two routines that essentially mirror the UNIX select function, + and test the ready state of an LCN. DECW$LCN_SELECT selects and tests the + status of a range of LCNs or EFNs. DECW$LCN_SELECT_ONE performs the + same function, however only tests the status of a single LCN. + +4.9.3 LCN Routines + This section describes each of the LCN routines, which are available from the + library image DECW$LCNLIBSHR.EXE. To support use from protected images + that cannot use the client library, some functions are also available as part of the + X Transport system services (DECW$XPORT_SERVICES). +4.9.3.1 DECW$LCN_ALLOCATE + Assigns an LCN. + Format + DECW$LCN_ALLOCATE lcn + Returns + + type: longword (unsigned) + access: write + mechanism: by value + Returns a longword condition value in R0. Condition values returned by this + routine are listed under Condition Values Returned. + Arguments + lcn + type: longword + access: write only + mechanism: by reference + The value of the allocated LCN. + + + + +4–56 Programming Features + Programming Features + 4.9 Transport Programming + + Description + DECW$LCN_ALLOCATE assigns a logical connection number. Initially, each + allocated LCN is assigned with all ready flags (read, write, and except) in the + clear state (0). The state of these flags can be changed using the DECW$LCN_ + SET_x_READY routines. + Once allocated, the LCN cannot be reused until it is released by DECW$LCN_ + FREE. DECW$LCN_ALLOCATE must be called before any query, wait, or + signaling operations can be performed. + DECW$LCN_ALLOCATE is both thread- and AST-reentrant and is callable from + exec and lower modes. + The equivalent function of DECW$LCN_ALLOCATE is also available as a system + service (DECW$XPORT_LCN_ALLOCATE) from the set of transport-common + routines (DECW$XPORT_SERVICES.EXE). + Condition Values Returned + SS$_NORMAL Routine successfully completed. + DECW$_INSFMEM There is insufficient memory to perform the operation. + DECW$_NOFREELCN All LCNs are currently allocated. + +4.9.3.2 DECW$LCN_CLEAR_x_READY + Changes the ready bit for read, write, or except operations to the clear state. + Format + DECW$LCN_CLEAR_READ_READY lcn [, prior] + DECW$LCN_CLEAR_WRITE_READY lcn [, prior] + DECW$LCN_CLEAR_EXCEPT_READY lcn [, prior] + Returns + + type: longword (unsigned) + access: write + mechanism: by value + Returns a longword condition value in R0. Condition values returned by this + routine are listed under Condition Values Returned. + Arguments + lcn + type: longword + access: read only + mechanism: by value + The value of the LCN whose ready bit for read, write, and except operations will + be changed to the clear state (0). + + [prior] + type: longword + access: write only + mechanism: by reference + The previous state of the associated ready flag, either clear (0) or set (1). + + + + + Programming Features 4–57 + Programming Features +4.9 Transport Programming + + Description + DECW$LCN_CLEAR_x_READY clears the read, write, or except ready bit of an + LCN. This indicates that the LCN is not available for input from the specified + operations. + These routines are thread- and AST-reentrant and callable from exec and lower + modes. + The equivalent functions of DECW$LCN_CLEAR_x_READY are also available + as system services (DECW$XPORT_LCN_CLEAR_x) from the set of transport- + common routines (DECW$XPORT_SERVICES.EXE). Note that when using the + system service, the prior argument is required; use a 0 value to prevent the prior + state from being returned. + Condition Values Returned + SS$_NORMAL Routine successfully completed. + DECW$_NOT_INITIALIZED The LCN has not been initialized; DECW$LCN_ + ALLOCATE must be called prior to this operation. + DECW$_INVLCN The LCN has not been allocated. + +4.9.3.3 DECW$LCN_FREE + Deassigns an allocated LCN. + Format + DECW$LCN_FREE lcn + Returns + + type: longword (unsigned) + access: write + mechanism: by value + Returns a longword condition value in R0. Condition values returned by this + routine are listed under Condition Values Returned. + Arguments + lcn + type: longword + access: read only + mechanism: by value + The value of the LCN to be freed. + Description + DECW$LCN_FREE deassigns the specified LCN. Once freed, the LCN is + available for immediate reallocation. + This routine is thread- and AST-reentrant and callable from exec and lower + modes. + The equivalent function of DECW$LCN_FREE is also available as a system + service (DECW$XPORT_LCN_FREE) from the set of transport-common routines + (DECW$XPORT_SERVICES.EXE). + + + + +4–58 Programming Features + Programming Features + 4.9 Transport Programming + + Note + If either DECW$LCN_SELECT_ONE or DECW$LCN_SELECT has been + called to test a state of the LCN which has been freed, then the status + DECW$_INVLCN is returned from the select call. + + + Condition Values Returned + SS$_NORMAL Routine successfully completed. + SS$_INSFMEM There is insufficient memory to perform the operation. + DECW$_NOT_INITIALIZED The LCN has not been initialized; DECW$LCN_ + ALLOCATE must be called prior to this operation. + DECW$_INVLCN The LCN has not been allocated or is protected. + +4.9.3.4 DECW$LCN_SELECT + Tests the ready state(s) of one or more LCNs and returns when one of the tested + states is set, a timeout occurs, or a specified OpenVMS event flag is set. + Format + DECW$LCN_SELECT retcount, rmask, wmask, emask, [timeout], [efn], [efn_mask] + Returns + + type: longword (unsigned) + access: write + mechanism: by value + Returns a longword condition value in R0. Condition values returned by this + routine are listed under Condition Values Returned. + Arguments + retcount + type: longword + access: write only + mechanism: by reference + The total number of entries set in the three mask structures (rmask, wmask, + emask). + + rmask, wmask, emask + type: mask + access: read,write + mechanism: by reference + Specifies whether to check the read (rmask), write (wmask), or exception (emask) + status of one or more LCNs. A value indicates that the status check be performed; + a null value indicates that no check be made. On completion, the mask is updated + to reflect which LCNs have their ready state set. + The format of each mask is an array of word values. The first entry is the + number of remaining entries in the array. Each subsequent entry represents an + LCN value. + + timeout + type: quadword + access: read only + mechanism: by reference + + + Programming Features 4–59 + Programming Features +4.9 Transport Programming + + The time by which the select operation will timeout if no input is received. The + time value is expressed in OpenVMS binary delta-time format. A null value + indicates no timeout. A value of 0 indicates the operation is in polling mode and + will timeout immediately if none of the specified status bits are set. + + efn + type: longword + access: read only + mechanism: by value + An event flag number (EFN) in the cluster to which the efn_mask argument + applies. EFNs are typically used for single-threaded or inner-mode operations. In + this environment, efn identifies an event flag for the wait operation. + If no EFN value is provided in single-thread mode, SYS$HIBER and SYS$WAKE + are used. In these instances, SYS$HIBER must not be used concurrently within + the process. In particular, POSIX Threads must not be loaded into the image, + even if not in use. + For multithreaded, user mode operations, this argument can be optional + depending on whether an EFN has been provided previously to DECW$LCN_ + THREAD_INIT. If the EFN was specified and the value of efn_mask is 0, the + argument is optional. Otherwise the value of this argument is required and will + be used as if it had been provided to DECW$LCN_THREAD_INIT. + + efn_mask + type: longword + access: read only + mechanism: by value + A mask of EFNs to be tested. Requires the efn argument. + Description + DECW$LCN_SELECT waits until one of the specified LCN ready states has + been set, timed out, or until the event flag condition is met. This routine checks + whether the selected LCNs have been allocated and returns an error (DECW$_ + INVLCN) if one or more LCNs have either not been allocated or freed for reuse. + With multithreading enabled, this routine is thread-reentrant and callable from + exec or lower modes. Calls from ASTs are not supported. + With single threading, the select routines can be called from user mode and exec + mode ASTs. Note, however, that the only concurrent calls allowed are one call + from user mode followed by one call from an AST in user mode. + Condition Values Returned + SS$_NORMAL Routine successfully completed. One or more LCNs have + their ready bit set as indicated in the updated mask + values. + SS$_EXQUOTA A process quota has been exceeded, this can be due to the + timer entry or AST limit quota. + SS$_INSFMEM There is insufficient memory to perform the operation. + SS$_UNASEFC The process is not associated with the cluster that + contains the specified event flag. + + + + +4–60 Programming Features + Programming Features + 4.9 Transport Programming + + DECW$_BAD_EFN_ An event flag was not provided to DECW$LCN_THREAD_ + CLUSTER INIT, or the specified flag resides in a different event flag + cluster. + DECW$_EFN_SET One or more event flags in the mask have been set. + DECW$_INVARG The array count in a read, write, or exception mask, or + the timeout value is not valid. + DECW$_INVLCN One or more LCNs have not been allocated or were freed + during the operation. + DECW$_NOHIBER This call was made from inner-mode with multithreading + enabled. No EFN was specified. + DECW$_PTHREAD_ A POSIX Threads routine returned an unexpected error. + INVALID + DECW$_TIMEDOUT The end of the timeout period was reached. + +4.9.3.5 DECW$LCN_SELECT_ONE + Tests the ready state of an LCN and returns when one of the tested states is set, + a timeout occurs, or a specified OpenVMS event flag is set. + Format + DECW$LCN_SELECT_ONE lcn, read, write, except, [timeout], [efn], [efn_mask] + Returns + + type: longword (unsigned) + access: write + mechanism: by value + Returns a longword condition value in R0. Condition values returned by this + routine are listed under Condition Values Returned. + Arguments + lcn + type: longword + access: read only + mechanism: by value + The value of the LCN. + + read, write, except + type: longword + access: write only + mechanism: by reference + Specifies whether to check the read, write, or exception status of an LCN. A + non-zero value signifies that the status check be performed and the result stored + in the referenced address on completion. A zero or null value indicates that no + check be made. + + timeout + type: quadword + access: read only + mechanism: by reference + The time by which the select operation will timeout if no input is received. The + time value is expressed in OpenVMS binary delta-time format. A null value + indicates no timeout. A value of 0 indicates the operation is in polling mode and + will timeout immediately if none of the specified status bits are set. + + + Programming Features 4–61 + Programming Features +4.9 Transport Programming + + efn + type: longword + access: read only + mechanism: by value + An event flag number (EFN) in the cluster to which the efn_mask argument + applies. EFNs are typically used for single-threaded or inner-mode operations. In + this environment, efn identifies an event flag for the wait operation. + If no EFN value is provided in single-thread mode, SYS$HIBER and SYS$WAKE + are used. In these instances, SYS$HIBER must not be used concurrently within + the process. In particular, POSIX Threads must not be loaded into the image, + even if not in use. + For multithreaded, user mode operations, this argument can be optional + depending on whether an EFN has been provided previously to DECW$LCN_ + THREAD_INIT. If the EFN was specified and the value of efn_mask is 0, the + argument is optional. Otherwise the value of this argument is required and will + be used as if it had been provided to DECW$LCN_THREAD_INIT. + + efn_mask + type: longword + access: read only + mechanism: by value + A mask of EFNs to be tested. Requires the efn argument. + Description + DECW$LCN_SELECT_ONE waits until one of the specified LCN ready states has + been set, timed out, or until the event flag condition is met. This routine checks + whether the selected LCN has been allocated and returns an error (DECW$_ + INVLCN) if the LCN has not been allocated or freed for reuse. + With multithreading enabled, this routine is thread-reentrant and callable from + exec or lower modes. Calls from ASTs are not supported. + With single threading, the select routines can be called from user mode and exec + mode ASTs. Note, however, that the only concurrent calls allowed are one call + from user mode followed by one call from an AST in user mode. + Condition Values Returned + SS$_NORMAL Routine successfully completed. One or more LCNs have + their ready bit set as indicated in the updated mask + values. + SS$_EXQUOTA A process quota has been exceeded, this can be due to the + timer entry or AST limit quota. + SS$_INSFMEM There is insufficient memory to perform the operation. + SS$_UNASEFC The process is not associated with the cluster that + contains the specified event flag. + DECW$_BAD_EFN_ An event flag was not provided to DECW$LCN_THREAD_ + CLUSTER INIT, or the specified flag resides in a different event flag + cluster. + DECW$_INVARG The timeout period or EFN is not accessible or within the + range of valid values. + + + + +4–62 Programming Features + Programming Features + 4.9 Transport Programming + + DECW$_INVLCN The LCN has not been allocated or was freed during the + operation. + DECW$_NOHIBER This call was made from inner-mode with multithreading + enabled. No EFN was specified. + DECW$_PTHREAD_ A POSIX Threads routine returned an unexpected error. + INVALID + DECW$_TIMEDOUT The end of the timeout period was reached. + +4.9.3.6 DECW$LCN_SET_x_READY + Signals that input from a read, write, or exception operation has been received by + changing the ready bit to the set state. + Format + DECW$LCN_SET_READ_READY lcn + DECW$LCN_SET_WRITE_READY lcn + DECW$LCN_SET_EXCEPT_READY lcn + Returns + + type: longword (unsigned) + access: write + mechanism: by value + Returns a longword condition value in R0. Condition values returned by this + routine are listed under Condition Values Returned. + Arguments + lcn + type: longword + access: read only + mechanism: by value + The value of the LCN whose ready bit will be changed to the set state (1). + Description + DECW$LCN_SET_x_READY sets the read, write, or except ready bit of an LCN. + This signals input has been received from the specified operations. + These routines are thread- and AST-reentrant and callable from exec and lower + modes. When any of the DECW$LCN_SET_x_READY routines are called from + exec mode with multithreading enabled, the call declares a user mode AST. This + AST performs the signaling for any user-mode processes that are currently in a + wait state. + The equivalent functions of DECW$LCN_SET_x_READY are also available as + system services (DECW$XPORT_LCN_SET_x) from the set of transport-common + routines (DECW$XPORT_SERVICES.EXE). + Condition Values Returned + SS$_NORMAL Routine successfully completed. + SS$_EXQUOTA The current memory quota has been exceeded. + SS$_INSFMEM There is insufficient memory to perform the operation. + DECW$_INVLCN The LCN has not been allocated. + + + + + Programming Features 4–63 + Programming Features +4.9 Transport Programming + + DECW$_NOT_INITIALIZED The LCN has not been initialized; DECW$LCN_ + ALLOCATE must be called prior to this operation. + +4.9.3.7 DECW$LCN_THREAD_INIT + Initializes multithreading support for LCN operations. + Format + DECW$LCN_THREAD_INIT [efn] + Returns + + type: longword (unsigned) + access: write + mechanism: by value + Returns a longword condition value in R0. Condition values returned by this + routine are listed under Condition Values Returned. + Arguments + efn + type: longword + access: read only + mechanism: by value + The value of the specified EFN. When multithreading is enabled, an EFN value + must be specified when performing select operations (DECW$LCN_SELECT or + DECW$LCN_SELECT_ONE) with event flag masks. The EFN is supplied either + by DECW$LCN_THREAD_INIT or from the first select call that provides an efn + argument. + The value of the efn argument must match the value supplied for any previous + select operations or calls to DECW$LCN_THREAD_INIT. The event flag must + also be in the same event flag cluster as the efn value supplied to subsequent + select or initialization operations. + Description + DECW$LCN_THREAD_INIT enables multithreaded LCN operations. This + routine is only callable from user mode with user mode ASTs enabled and can be + called multiple times by a single process. + Condition Values Returned + SS$_NORMAL Routine successfully completed. + DECW$_CHANGED_EFN An event flag was specified that differs from that specified + in a previous initialization or select call. + DECW$_INSFMEM There is insufficient memory to perform the operation. + DECW$_NOPTHREADRTL The POSIX Thread Library (PTHREAD$RTL) has not + been loaded. + DECW$_NOTUSERMODE This routine was not called from user mode. + DECW$_PTHREAD_ A POSIX Thread routine returned an unexpected error. + INVALID + + + + +4–64 Programming Features + Index + + Color Customizer, 2–3 +A auto shadowing toggle button, 2–6 + building, 2–3 +accessx + command summary, 2–4 + See AccessX Keyboard utility + mapping color resources and color cells, 2–5 +AccessX features + modifying DECW$LOGIN.COM, 2–4 + overview, 2–20 + running, 2–4 + setting with utility, 2–21 + supported +AccessX Keyboard utility (accessx), 2–20 + applications, 2–3 + configuration file, 2–22 + displays, 2–3 + resource settings, 2–22 + using on multiheaded systems, 2–6 +ACME xsetroot_cust demo, 2–7 + See Authentication and Credentials Colormap Utilization Policy extension (TOG-CUP), + Management Extensions (ACME) 4–38 +Agfa Monotype iType rasterizer, 4–22 CompositeClassExtensionRec +Application Group extension (XC-APPGROUP), new option, 4–13 + 4–37 + Compound Document Architecture +Application Manager + selecting screen for application display, 2–10 See CDA +Asynchronous system traps (ASTs), 4–2 +Authentication and Credentials Management D + Extensions (ACME), 3–1 + DBE + See X Double Buffer extension +B DECterm +Big Requests extension (BIG-REQUESTS), 4–38 automatic window positioning, 2–19 + escape sequences, 2–18 + font sizes, 2–17 +C page-movement sequences, 4–9 +CDA programming, 4–8 + applications, 2–15 ReGIS input cursors, 4–8 + dynamic font support, 2–14 scrolling using the keyboard, 2–18 + packing, 2–15 DECW$IPV6_FONT_SUPPORT parameter, 3–3 + unpacking, 2–16 DECW$IPV6_SUPPORT global symbol, 2–1 + changes to external reference processing, 4–7 DECW$LCN_ALLOCATE routine, 4–55, 4–56 + converters, 2–13 DECW$LCN_CLEAR_x_READY routine, 4–56, + converting Asian-language text files, 2–13 4–57 + defining logical names, 2–12 DECW$LCN_FREE routine, 4–58 + interface changes, 4–6 DECW$LCN_SELECT routine, 4–59 + internationalization support, 2–11 DECW$LCN_SELECT_ONE routine, 4–61 + message, 2–17 DECW$LCN_SET_x_READY routine, 4–56, 4–63 + packing and unpacking error messages, 2–17 DECW$LCN_THREAD_INIT routine, 4–55, 4–64 + programming, 4–6 DECW$STARTUP procedure + restructuring of shareable images, 4–8 log file, 3–1 + specifying an options file, 2–11 DECW$XAUTHORITY logical, 2–27 + WRITE$FONTS logical name, 2–14 DECwindows Extensions to Motif + DXmCSText widget + input method support, 4–10 + + + + + Index–1 + Drag-and-drop, 2–7 Front Panel +DXmCSText widget selecting screen for application display, 2–10 + input method support, 4–10 support for MB3 operations, 2–10 + + +E G +Easy resource configuration, 4–12 Global symbols +EFS DECW$IPV6_SUPPORT, 2–1 + See Extended File Specifications +Escape sequences H + DECterm, 2–18 + Header files +EVI + languages, 4–17 + See Extended Visual Information extension + HP Extensions to Motif, 4–10 +Extended File Specifications (EFS) + File Manager support, 2–2 + file selection popup, 2–2 I + FileView support, 2–2 + ICE + programming library support, 2–2 + See Inter-Client Exchange protocol + Support overview, 2–2 + Input cursors + translated image support, 2–2 + cross-hair, 4–8 +Extended Visual Information extension (EVI), + diamond, 4–8 + 4–39 + rubber-band line, 4–8 + rubber-band rectangle, 4–8 +F selecting, 4–8 + Inter-Client Exchange protocol (ICE), 4–44 +File Manager + client-side library, 4–45 + refreshing views, 2–10 + differences from the X11R6.6 implementation, + selecting screen for application display, 2–10 + 4–46 +Fonts + IPv6 considerations, 4–47 + Common + multithreading considerations, 4–45 + Fixed Width, 4–32 + Internationalization + Language-Specific, 4–33 + converting files, 2–13 + Miscellaneous, 4–33 + viewing files, 2–11 + Sun Open Look Glyph, 4–32 + VT330, 4–32 Internet Protocol Version 6 transport + 75 dpi See IPv6 + Charter, 4–23 IPv6, 2–1 + Lucida, 4–24 changes to ICE library, 4–47 + Present Bullets, 4–26 impact on xauth, 2–28 + Utopia, 4–26 support with font server, 3–3 + 100 dpi Xlib changes, 4–14 + Charter, 4–27 + Lucida, 4–28 + Present Bullets, 4–31 + K + Utopia, 4–31 Keyboard + Scalable scrolling in DECterm, 2–18 + Adobe Courier, 4–35 + Adobe Utopia, 4–35 L + Agfa Monotype Albany, 4–34 + Agfa Monotype Cumberland, 4–34 Language bindings, 4–17 + Agfa Monotype Screen, 4–35 LBX + Agfa Monotype Thorndale, 4–35 See Low-Bandwidth X extension + Bitstream Charter, 4–34 LCN + Bitstream Courier, 4–34 See Logical Connection Number interface +Font server Log files + proxy server DECW$STARTUP_n.LOG, 3–1 + support with IPv6, 3–3 + + + + +Index–2 + Logical Connection Number (LCN) interface, 4–55 + allocating connection numbers, 4–55 + functions, 4–55 + R + initializing thread support, 4–55 Rasterizer + querying status, 4–56 See Agfa Monotype iType rasterizer + related Xlib routines, 4–16 ReGIS input cursors + routines, 4–56 See also Input cursors + DECW$LCN_ALLOCATE, 4–56 + DECW$LCN_CLEAR_x_READY, 4–57 + DECW$LCN_FREE, 4–58 S + DECW$LCN_SELECT, 4–59 Security extension (SECURITY), 4–40 + DECW$LCN_SELECT_ONE, 4–61 Shared memory + DECW$LCN_SET_x_READY, 4–63 creating and using XImages, 4–50 + DECW$LCN_THREAD_INIT, 4–64 extension support, 4–49 + signaling input, 4–56 pixmaps, 4–53 +Logical names Startup + defining in the CDA Viewer, 2–12 log file, 3–1 +Login screen SVN widget + welcome message, 2–9 extended selection, 4–10 +Low-Bandwidth X (LBX) extension, 4–39 SYNC + See X Synchronization extension +M +MIT Shared Memory extension (MIT-SHM), 4–49 T +Motif Tear-off menus + variables using, 2–8 + UIDPATH, 4–35 TOG-CUP +Motif Window Manager See Colormap Utilization Policy extension + resource for XUI application support, 2–11 Toolkit +Multithreading changes to CompositeClassExtensionRec, 4–13 + binary compatibility, 4–1 easy resource configuration, 4–12 + enabling support for existing applications, 4–4 extensions + supported libraries, 4–1 DXmCSText widget, 4–10 + thread safety and concurrency, 4–2 SVN widget, 4–10 + use of ASTs, 4–2 Translated image support + Extended File Specifications (EFS), 2–2 +N Transports + LAT interface support, 4–54 +New Desktop + logging in, 2–9 + U +O Utilities + AccessX Keyboard utility (accessx), 2–20 +Options file + Window Dump to Print File utility (xpr), 2–34 + specifying, 2–11 + X Authority utility (xauth), 2–23 +Overlay support + X Keyboard Compiler utility (xkbcomp), 2–32 + See also Window Manager + colormap + avoiding potential problems, 2–19 W + modifying applications, 2–19 Window Dump to Print File utility (xpr), 2–34 + sharing overlay colormaps with the Window Window Manager + Manager, 2–19 overlay support, 2–19 + + + + + Index–3 + X Display Server + extensions (cont’d) +X XC-MISC extension, 4–41 +X$CLOSE_OM routine, 4–17 X Double Buffer extension, 4–41 +X$CONTEXTUAL_DRAWING routine, 4–18 XINERAMA extension, 4–42 +X$CONVERT_CASE routine, 4–18 X Keyboard extension, 4–42 +X$DESTROY_OC routine, 4–18 X Synchronization extension, 4–43 +X$DIRECTIONAL_DEPENDENT_DRAWING parameters + routine, 4–18 DECW$IPV6_FONT_SUPPORT, 3–3 +X$DISPLAY_OF_OM routine, 4–19 shared memory pixmaps, 4–53 +X$EXTENDED_MAX_REQUEST_SIZE routine, shared memory XImages, 4–50 + 4–19 supported extensions, 4–36 +X$INIT_IMAGE routine, 4–19 X Double Buffer extension (DBE), 4–41 +X$INIT_THREADS routine, 4–19 X Image extension, 4–53 +X$INTERNAL_CONNECTION_NUMBERS XINERAMA extension, 4–42 + routine, 4–20 X Keyboard Compiler utility (xkbcomp), 2–32 +X$LOCALE_OF_OM routine, 4–20 X Keyboard extension (XKB), 4–42 +X$LOCK_DISPLAY routine, 4–20 Xlib +X$OPEN_OM routine, 4–20 changes for IPv6 support, 4–14 +X$PROCESS_INTERNAL_CONNECTION routine, client-side extension library updates for + 4–21 X11R6.6, 4–15 +X$REGISTER_IM_INSTANTIATE_CB routine, extensions + 4–21 client side library, 4–36 +X$SET_AUTHORIZATION routine, 4–21 LCN support, 4–16 +X$UNLOCK_DISPLAY routine, 4–21 routines +X$UNREGISTER_IM_INSTANTIATE_CB routine, XAddConnectionWatch, 4–14 + 4–22 _XAllocTemp, 4–14 +xauth XCloseOM, 4–14 + See X Authority utility XcmsSetCCCOfColormap, 4–14 +X authority file XContextualDrawing, 4–14 + adding and removing file entries, 2–30 XConvertCase, 4–14 + copying entries between files, 2–31 XCreateOC, 4–14 + creating, 2–28 XDestroyOC, 4–14 + definition, 2–25 XDirectionalDependentDrawing, 4–14 + displaying file entries, 2–29 XDisplayOfOM, 4–14 + format, 2–26 XESetBeforeFlush, 4–15 + generating authorization keys, 2–32 XExtendedMaxRequestSize, 4–15 + specifying, 2–27 _XFreeTemp, 4–14 + viewing file information, 2–28 XGetAtomNames, 4–15 +X Authority utility (xauth), 2–23 XGetOCValues, 4–15 + entering commands, 2–27 XGetOMValues, 4–15 + IPv6 considerations, 2–28 XInitThreads, 4–15 + viewing and editing files, 2–29 XInternalConnectionNumbers, 4–15 +XC-APPGROUP XInternAtoms, 4–15 + See Application Group extension XLocaleOfOM, 4–15 +XC-MISC extension, 4–41 XLockDisplay, 4–15 +X Display Server XOMOfOC, 4–15 + extensions, 4–44 XOpenOM, 4–15 + Application Group extension, 4–37 XProcessInternalConnection, 4–15 + Big Requests extension, 4–38 XReadBitmapFileData, 4–15 + Colormap Utilization Policy extension, XRegisterIMInstantiateCallback, 4–15 + 4–38 XRemoveConnectionWatch, 4–15 + Extended Visual Information extension, XSetOCValues, 4–15 + 4–39 XSetOMValues, 4–15 + Low-Bandwidth X extension, 4–39 XUnlockDisplay, 4–15 + MIT Shared Memory extension (MIT-SHM), XUnregisterIMInstantiateCallback, 4–15 + 4–49 updates for X11R6.6, 4–14 + Security extension, 4–40 variables + + + + +Index–4 + Xlib X Toolkit (cont’d) + variables (cont’d) updates for X11R6.6, 4–11 + DISPLAY, 4–17 variables + RESOURCE_NAME, 4–17 sessionShellClassRec, 4–12 +XmNinputMethod resource sessionShellWidgetClass, 4–12 + using the shell to specify input methods, 4–10 +xpr + See Window Dump to Print File utility +X Session Management protocol (XSMP), 4–47 + differences from the X11R6.6 implementation, + 4–48 + multithread considerations, 4–48 +XSMP + See X Session Management protocol +X Synchronization extension (SYNC), 4–43 +XtAppMainLoop routine, 4–13 +X Toolkit + routines + XtAppAddBlockHook, 4–11 + XtAppAddSignal, 4–11 + XtAppGetExitFlag, 4–11 + XtAppLock, 4–11 + XtAppMainLoop, 4–13 + XtAppSetExitFlag, 4–11 + XtAppUnlock, 4–11 + XtCancelSelectionRequest, 4–11 + XtChangeManagedSet, 4–11 + XtCreateSelectionRequest, 4–11 + XtDispatchEventToWidget, 4–11 + XtGetClassExtension, 4–11 + XtGetDisplays, 4–11 + XtGetKeyboardFocusWidget, 4–11 + XtGetSelectionParameters, 4–11 + XtHooksOfDisplay, 4–11 + XtInsertEventTypeHandler, 4–11 + XtIsSessionShell, 4–11 + XtLastEventProcessed, 4–11 + XtNoticeSignal, 4–11 + XtOpenApplication, 4–11 + XtProcessLock, 4–11 + XtProcessUnlock, 4–11 + XtRegisterDrawable, 4–11 + XtRegisterExtensionSelector, 4–12 + XtReleasePropertyAtom, 4–12 + XtRemoveBlockHook, 4–12 + XtRemoveEventTypeHandler, 4–12 + XtRemoveSignal, 4–12 + XtReservePropertyAtom, 4–12 + XtResolvePathname, 4–13 + XtSendSelectionRequest, 4–12 + XtSessionGetToken, 4–12 + XtSessionReturnToken, 4–12 + XtSetEventDispatcher, 4–12 + XtSetSelectionParameters, 4–12 + XtToolkitThreadInitialize, 4–12 + XtUnregisterDrawable, 4–12 + XtVaOpenApplication, 4–12 + + + + + Index–5 + \ No newline at end of file diff --git a/xie/docs/dec/DTJ-1991-v03-04-bitonal-image-accelerators.pdf b/xie/docs/dec/DTJ-1991-v03-04-bitonal-image-accelerators.pdf new file mode 100644 index 0000000..5274732 --- /dev/null +++ b/xie/docs/dec/DTJ-1991-v03-04-bitonal-image-accelerators.pdf @@ -0,0 +1,6705 @@ +%PDF-1.6 +%¿÷¢þ +1 0 obj +<< /Metadata 3 0 R /Outlines 4 0 R /PageLayout /SinglePage /PageMode /UseOutlines /Pages 5 0 R /Type /Catalog /ViewerPreferences << /DisplayDocTitle true >> >> +endobj +2 0 obj +<< /CreationDate (D:20060408155056+01'00') /Creator (Adobe Acrobat 7.05) /ModDate (D:20060422101625+01'00') /Producer (Adobe Acrobat 7.05 Paper Capture Plug-in) /Title (Digital Technical Journal, Volume 3, Number 4: Image Processing; Video Terminals; and Printer Technologies) >> +endobj +3 0 obj +<< /Subtype /XML /Type /Metadata /Length 3650 >> +stream + + + + + 2006-04-08T15:50:56+01:00 + Adobe Acrobat 7.05 + 2006-04-22T10:16:25+01:00 + 2006-04-22T10:16:25+01:00 + + + Adobe Acrobat 7.05 Paper Capture Plug-in + + + application/pdf + + + Digital Technical Journal, Volume 3, Number 4: Image Processing; Video Terminals; and Printer Technologies + + + + + + + + + uuid:29957c69-46c1-4ce7-a80a-4489671d4d87 + uuid:62f3916c-ba2b-469e-a346-eefcdc8b32ae + + + + + + + + + + + + + + + + + + + + + + + + +endstream +endobj +4 0 obj +<< /Count 13 /First 6 0 R /Last 7 0 R /Type /Outlines >> +endobj +5 0 obj +<< /Count 17 /Kids [ 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R ] /Type /Pages >> +endobj +6 0 obj +<< /A 25 0 R /Next 26 0 R /Parent 4 0 R /Title (Front cover) >> +endobj +7 0 obj +<< /A 27 0 R /Parent 4 0 R /Prev 28 0 R /Title (Back cover) >> +endobj +8 0 obj +<< /Contents 29 0 R /CropBox [ 0 7062 590 7864 ] /MediaBox [ 0 7062 590 7864 ] /Parent 5 0 R /Resources << /ColorSpace << /CS0 30 0 R >> /Font << /T1_0 31 0 R /T1_1 32 0 R /T1_2 33 0 R /T1_3 34 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /Im0 35 0 R /Im1 36 0 R /Im2 37 0 R /Im3 38 0 R /Im4 39 0 R /Im5 40 0 R /Im6 41 0 R >> >> /Rotate 0 /Type /Page >> +endobj +9 0 obj +<< /Contents 42 0 R /CropBox [ 0 7065 591 7864 ] /MediaBox [ 0 7065 591 7864 ] /Parent 5 0 R /Resources << /ColorSpace << /CS0 30 0 R >> /Font << /T1_0 43 0 R /T1_1 44 0 R /T1_2 45 0 R /T1_3 46 0 R /T1_4 47 0 R /T1_5 48 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /Im0 49 0 R /Im1 50 0 R /Im2 51 0 R /Im3 52 0 R /Im4 53 0 R /Im5 54 0 R /Im6 55 0 R /Im7 56 0 R /Im8 57 0 R /Im9 58 0 R >> >> /Rotate 0 /Type /Page >> +endobj +10 0 obj +<< /Contents 59 0 R /CropBox [ 0 7062 590 7864 ] /MediaBox [ 0 7062 590 7864 ] /Parent 5 0 R /Resources << /ColorSpace << /CS0 30 0 R >> /Font << /T1_0 60 0 R /T1_1 61 0 R /T1_2 62 0 R /T1_3 63 0 R /T1_4 64 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /Im0 65 0 R /Im1 66 0 R /Im2 67 0 R /Im3 68 0 R /Im4 69 0 R /Im5 70 0 R >> >> /Rotate 0 /Type /Page >> +endobj +11 0 obj +<< /Contents 71 0 R /CropBox [ 0 7066 591 7864 ] /MediaBox [ 0 7066 591 7864 ] /Parent 5 0 R /Resources << /ColorSpace << /CS0 30 0 R >> /Font << /T1_0 72 0 R /T1_1 73 0 R /T1_2 74 0 R /T1_3 75 0 R /T1_4 76 0 R /T1_5 77 0 R /T1_6 78 0 R /T1_7 79 0 R /T1_8 80 0 R /T1_9 81 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /Im0 82 0 R /Im1 83 0 R /Im10 84 0 R /Im11 85 0 R /Im12 86 0 R /Im13 87 0 R /Im14 88 0 R /Im15 89 0 R /Im16 90 0 R /Im17 91 0 R /Im18 92 0 R /Im19 93 0 R /Im2 94 0 R /Im20 95 0 R /Im3 96 0 R /Im4 97 0 R /Im5 98 0 R /Im6 99 0 R /Im7 100 0 R /Im8 101 0 R /Im9 102 0 R >> >> /Rotate 0 /Type /Page >> +endobj +12 0 obj +<< /Contents 103 0 R /CropBox [ 0 7062 591 7864 ] /MediaBox [ 0 7062 591 7864 ] /Parent 5 0 R /Resources << /ColorSpace << /CS0 30 0 R >> /Font << /T1_0 104 0 R /T1_1 105 0 R /T1_2 106 0 R /T1_3 107 0 R /T1_4 108 0 R /T1_5 109 0 R /T1_6 110 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /Im0 111 0 R /Im1 112 0 R /Im10 113 0 R /Im11 114 0 R /Im12 115 0 R /Im13 116 0 R /Im14 117 0 R /Im15 118 0 R /Im16 119 0 R /Im17 120 0 R /Im18 121 0 R /Im19 122 0 R /Im2 123 0 R /Im20 124 0 R /Im3 125 0 R /Im4 126 0 R /Im5 127 0 R /Im6 128 0 R /Im7 129 0 R /Im8 130 0 R /Im9 131 0 R >> >> /Rotate 0 /Type /Page >> +endobj +13 0 obj +<< /Contents 132 0 R /CropBox [ 0 7065 591 7864 ] /MediaBox [ 0 7065 591 7864 ] /Parent 5 0 R /Resources << /ColorSpace << /CS0 30 0 R >> /Font << /T1_0 133 0 R /T1_1 134 0 R /T1_2 135 0 R /T1_3 136 0 R /T1_4 137 0 R /T1_5 138 0 R /T1_6 139 0 R /T1_7 140 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /Im0 141 0 R /Im1 142 0 R /Im10 143 0 R /Im11 144 0 R /Im12 145 0 R /Im13 146 0 R /Im14 147 0 R /Im15 148 0 R /Im16 149 0 R /Im17 150 0 R /Im18 151 0 R /Im19 152 0 R /Im2 153 0 R /Im20 154 0 R /Im21 155 0 R /Im22 156 0 R /Im23 157 0 R /Im24 158 0 R /Im25 159 0 R /Im26 160 0 R /Im27 161 0 R /Im28 162 0 R /Im3 163 0 R /Im4 164 0 R /Im5 165 0 R /Im6 166 0 R /Im7 167 0 R /Im8 168 0 R /Im9 169 0 R >> >> /Rotate 0 /Type /Page >> +endobj +14 0 obj +<< /Contents 170 0 R /CropBox [ 0 7063 590 7864 ] /MediaBox [ 0 7063 590 7864 ] /Parent 5 0 R /Resources << /ColorSpace << /CS0 30 0 R >> /Font << /T1_0 171 0 R /T1_1 172 0 R /T1_2 173 0 R /T1_3 174 0 R /T1_4 175 0 R /T1_5 176 0 R /T1_6 177 0 R /T1_7 178 0 R /T1_8 179 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /Im0 180 0 R /Im1 181 0 R /Im2 182 0 R /Im3 183 0 R /Im4 184 0 R /Im5 185 0 R /Im6 186 0 R >> >> /Rotate 0 /Type /Page >> +endobj +15 0 obj +<< /Contents 187 0 R /CropBox [ 0 7065 591 7864 ] /MediaBox [ 0 7065 591 7864 ] /Parent 5 0 R /Resources << /ColorSpace << /CS0 30 0 R >> /Font << /T1_0 188 0 R /T1_1 189 0 R /T1_2 190 0 R /T1_3 191 0 R /T1_4 192 0 R /T1_5 193 0 R /T1_6 194 0 R /T1_7 195 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /Im0 196 0 R /Im1 197 0 R /Im10 198 0 R /Im11 199 0 R /Im12 200 0 R /Im13 201 0 R /Im14 202 0 R /Im15 203 0 R /Im16 204 0 R /Im17 205 0 R /Im2 206 0 R /Im3 207 0 R /Im4 208 0 R /Im5 209 0 R /Im6 210 0 R /Im7 211 0 R /Im8 212 0 R /Im9 213 0 R >> >> /Rotate 0 /Type /Page >> +endobj +16 0 obj +<< /Contents 214 0 R /CropBox [ 0 7063 589 7864 ] /MediaBox [ 0 7063 589 7864 ] /Parent 5 0 R /Resources << /DefaultGray 30 0 R /ProcSet [ /PDF /ImageC /ImageI /ImageB ] /XObject << /3i 215 0 R /3j 216 0 R /3k 217 0 R /3l 218 0 R /3m 219 0 R /3n 220 0 R >> >> /Rotate 0 /Type /Page >> +endobj +17 0 obj +<< /Contents 221 0 R /CropBox [ 0 7066 590 7864 ] /MediaBox [ 0 7066 590 7864 ] /Parent 5 0 R /Resources << /ColorSpace << /CS0 30 0 R >> /Font << /T1_0 222 0 R /T1_1 223 0 R /T1_2 224 0 R /T1_3 225 0 R /T1_4 226 0 R /T1_5 227 0 R /T1_6 228 0 R /T1_7 229 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /Im0 230 0 R /Im1 231 0 R /Im2 232 0 R /Im3 233 0 R /Im4 234 0 R /Im5 235 0 R >> >> /Rotate 0 /Type /Page >> +endobj +18 0 obj +<< /Contents 236 0 R /CropBox [ 0 7064 590 7864 ] /MediaBox [ 0 7064 590 7864 ] /Parent 5 0 R /Resources << /ColorSpace << /CS0 30 0 R >> /Font << /T1_0 237 0 R /T1_1 238 0 R /T1_10 239 0 R /T1_2 240 0 R /T1_3 241 0 R /T1_4 242 0 R /T1_5 243 0 R /T1_6 244 0 R /T1_7 245 0 R /T1_8 246 0 R /T1_9 247 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /Im0 248 0 R /Im1 249 0 R /Im2 250 0 R /Im3 251 0 R /Im4 252 0 R /Im5 253 0 R /Im6 254 0 R /Im7 255 0 R >> >> /Rotate 0 /Type /Page >> +endobj +19 0 obj +<< /Contents 256 0 R /CropBox [ 0 7066 590 7864 ] /MediaBox [ 0 7066 590 7864 ] /Parent 5 0 R /Resources << /ColorSpace << /CS0 30 0 R >> /Font << /T1_0 257 0 R /T1_1 258 0 R /T1_2 259 0 R /T1_3 260 0 R /T1_4 261 0 R /T1_5 262 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /Im0 263 0 R /Im1 264 0 R /Im2 265 0 R /Im3 266 0 R /Im4 267 0 R /Im5 268 0 R /Im6 269 0 R /Im7 270 0 R >> >> /Rotate 0 /Type /Page >> +endobj +20 0 obj +<< /Contents 271 0 R /CropBox [ 0 7063 589 7864 ] /MediaBox [ 0 7063 589 7864 ] /Parent 5 0 R /Resources << /ColorSpace << /CS0 30 0 R >> /Font << /T1_0 272 0 R /T1_1 273 0 R /T1_2 274 0 R /T1_3 275 0 R /T1_4 276 0 R /T1_5 277 0 R /T1_6 278 0 R /T1_7 279 0 R /T1_8 280 0 R /T1_9 281 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /Im0 282 0 R /Im1 283 0 R /Im2 284 0 R /Im3 285 0 R /Im4 286 0 R /Im5 287 0 R /Im6 288 0 R /Im7 289 0 R >> >> /Rotate 0 /Type /Page >> +endobj +21 0 obj +<< /Contents 290 0 R /CropBox [ 0 7066 590 7864 ] /MediaBox [ 0 7066 590 7864 ] /Parent 5 0 R /Resources << /ColorSpace << /CS0 30 0 R >> /Font << /T1_0 291 0 R /T1_1 292 0 R /T1_2 293 0 R /T1_3 294 0 R /T1_4 295 0 R /T1_5 296 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /Im0 297 0 R /Im1 298 0 R /Im10 299 0 R /Im11 300 0 R /Im12 301 0 R /Im13 302 0 R /Im14 303 0 R /Im2 304 0 R /Im3 305 0 R /Im4 306 0 R /Im5 307 0 R /Im6 308 0 R /Im7 309 0 R /Im8 310 0 R /Im9 311 0 R >> >> /Rotate 0 /Type /Page >> +endobj +22 0 obj +<< /Contents 312 0 R /CropBox [ 0 7063 589 7864 ] /MediaBox [ 0 7063 589 7864 ] /Parent 5 0 R /Resources << /ColorSpace << /CS0 30 0 R >> /Font << /T1_0 313 0 R /T1_1 314 0 R /T1_2 315 0 R /T1_3 316 0 R /T1_4 317 0 R /T1_5 318 0 R /T1_6 319 0 R /T1_7 320 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /Im0 321 0 R /Im1 322 0 R /Im2 323 0 R /Im3 324 0 R /Im4 325 0 R /Im5 326 0 R >> >> /Rotate 0 /Type /Page >> +endobj +23 0 obj +<< /Contents 327 0 R /CropBox [ 0 7066 590 7864 ] /MediaBox [ 0 7066 590 7864 ] /Parent 5 0 R /Resources << /ColorSpace << /CS0 30 0 R >> /Font << /T1_0 328 0 R /T1_1 329 0 R /T1_2 330 0 R /T1_3 331 0 R /T1_4 332 0 R /T1_5 333 0 R /T1_6 334 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /Im0 335 0 R /Im1 336 0 R /Im10 337 0 R /Im11 338 0 R /Im12 339 0 R /Im13 340 0 R /Im14 341 0 R /Im15 342 0 R /Im16 343 0 R /Im17 344 0 R /Im18 345 0 R /Im19 346 0 R /Im2 347 0 R /Im20 348 0 R /Im3 349 0 R /Im4 350 0 R /Im5 351 0 R /Im6 352 0 R /Im7 353 0 R /Im8 354 0 R /Im9 355 0 R >> >> /Rotate 0 /Type /Page >> +endobj +24 0 obj +<< /Contents 356 0 R /CropBox [ 0 7063 589 7864 ] /MediaBox [ 0 7063 589 7864 ] /Parent 5 0 R /Resources << /ColorSpace << /CS0 30 0 R >> /Font << /T1_0 357 0 R /T1_1 358 0 R /T1_2 359 0 R /T1_3 360 0 R /T1_4 361 0 R /T1_5 362 0 R /T1_6 363 0 R /T1_7 364 0 R >> /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /Im0 365 0 R /Im1 366 0 R /Im2 367 0 R /Im3 368 0 R /Im4 369 0 R /Im5 370 0 R /Im6 371 0 R >> >> /Rotate 0 /Type /Page >> +endobj +25 0 obj +<< /D [ 372 0 R /Fit ] /S /GoTo >> +endobj +26 0 obj +<< /A 373 0 R /Next 374 0 R /Parent 4 0 R /Prev 6 0 R /Title (Contents) >> +endobj +27 0 obj +<< /D [ 375 0 R /Fit ] /S /GoTo >> +endobj +28 0 obj +<< /A 376 0 R /Next 7 0 R /Parent 4 0 R /Prev 377 0 R /Title (Further Readings) >> +endobj +29 0 obj +<< /Filter /FlateDecode /Length 5659 >> +stream +H‰ŒWK�ä¶¾÷¯Ð-m`$ó!R$rŠ€íC� ä° �¤éæZ-õJêÏö·»(’%Jj'ÙvwVd±_}õÕ—Ï×ZKžøÍÉ8#„ö炪<³_5×Iu=|ûó•$?ô‡¾”Š’„ŠŒKø‘H{�ÈåGw�†{9ËX„p÷h&¬™œ'’f¹ýÂrx˜ð¬ðp.¼ p’öe³�Åÿœæøå�<€cJÙ'µ7ΉBÚ‹‹ƒîbŽ ™É9ùæ&ytO„{$#*9„$«ë…c”¾–¤³v +•ÄçMLrøîtøöD…t&§—INØ?½ÁÉiL(±$<9 åe>÷$S…Hr"3NµH +Eh¦…*’Óõpüþ2˜qêo—fø%K¾9}>¤ð(SÒZ™„cðF}8þ£|ûn>‚©Ì„IJá59ûöŠœy{ß›²«LßöîË´dÎ�˜¿ÿ«n†É½gïBK@6©²‚jÈ$üÊòBé9ž¿ã›TÏ×ö‰PÂ"lsñû¡¿� Þæ™&tö‹pçw9Al¦kV®EoÀ … ®à^�ó ?þ®1ÛˆjsñߦûaI¦Tö:S®—¡wáªÐ™˜«[0ÀU¡¨½ùéøS9ÔoåÎ +~ü[U5m3”S?ŒÉ7ÿ9ý2W2ŸÕÔ—æ%z,‡DÙ<¸ï�¢\¾3Sß•-|.1ÔQ;?_Ëó’QZhw@ä2`jè«fMwžOYpSîù£>»6@O#6c”jQ dIešú +þØ6Õ4ô�©–ÒäY.…Í€;á)k¿`Üá™áÈø>N͵<ËYî¿NCÙ�/Í’.©?£¹?ójš�ûˆ'TÎ]Ð’‡Fê_"ädTùÿš²Mßú¡­—BçÔÅ hHéX5]³˜÷)b™Ò¾¯>mñR*õ±þ Y*íCJðQÓMýâM +¤+]•©ÎZmÎf²e–üøl‚µ•wL…§_ÜÛŠ�(þÓþqEÑÓkÙ™Û½-'Ówp’‹cÙÕþ†=\dôwЉ}ƒê9Ná™à: Ì‘ø,BŠ¡C·)‚©ƒI„~(÷"B?¬ øÉ&Àa>åz†S3î"L™Ìh>çÐR¬}në 4{p¥-ß"q59 pº–ÃoÍÑb÷4¿ÓŽá²Ç"ËrÁ°ºËQ0Ǻ¯>¾]Ó9ëÀ"L⣄v…OOËËÀÝá·‹©.[˜ÆUp»êÍLjÞEi†aÊéã4#(Ǫ캸Q½÷<ÓÛ¬oÓMp½ +eþ~�zE:&ƒ±M¡W0!2´û­¼5øSÓ@�(a Ð`Ó#ãÔ-t¨ù¸ÒRÀ4˜æµl—Á Á‡NÂ?õ÷æµiÿ£bÉÌÅœ/{~XÀm³»ÜdÐ54À»nºÑLÆæL‹ãmèë{Õø†g"pԠܤ¿Ü —±TèãkœD@þˆ I¦™@GÊ©è))ùr7à †À;þ-è2±Àízì é·ˆPOù8ï®Ö h¿Æ$X@ÚoªKg¾Ü›qcÜNÞPT�yÎHÙån¨Å­øÖ´íªgð¹p�Á?E‰>ä¼@‰Ã3kUÂväu[«¯#¤–že{î3]®6ŽTóã,°R* ±û€ 5)LVÛM¯Ív>À^•z I­txÃ6Ë ßÔÛAS@S©hZ[`\ÀbE¢žá™7SO,Ò r|êcOám]ÛÎpCož¬›N„ê#…u+P:™qIJ¯t ûVÔ9:`%JªØ±¬.ÀŽsJ±ÒÊ[M˜â”A•iŒ€?©tApšñÖ–ï1ZµBúoàw˜…Õ—­ Ø‹°]iÓŒDC—GØ–HKu3šs×Ô; Kö(»�@(æÑ˜˜ÚÇŠ3–3J„dQ +þur +ò<�’궉}IlähÉØ…ÝEÙ�³2÷ÏWÆ*h¯ß|Fc"ðBvM ¨)*�|ÓŠ–°ß?­¡”ÐFµ)æ¬ê„1s}Ö©‘à ^C­‘\Þ€vC€Û f%LL÷±ì"�€õÒr·[k*÷”„H œ¾;�¦ž+”{»ƒ&ßtuÔ»Fe´Ñü¼×€‹®k3áÌô»P¡Ö …Áœ#]Ù¼3€…s^ÊŠy=ËTOÁô/ð×vK„�¬=o³±_çrànØ]õæ*hÓkº­©Í%a+@Ý<Åø.‚upãNDö“#œ”}¿‚̃ ¶fz 3NÀs_¶ãS ¢…Jâ•áŒU¸TíP?êh/Tnqçĺ›b@—ò¡tÈCX"1/&�V: BòxH€þ›Z¸6, ª¹Îâ þÜ•m쇖È�,?¶ÍÙHÉ/°ÀEøz›-¥�¥r‡rX:èÿ˜ìñê²<Õ}•>˜Œñ89÷+n+1§÷qÐ/ñ¤šçŵ~ûƒò²ë�Ü6£ð}…¯XMDRŸW‹"i +EQ ‹EÆÙVvf4�4Þx/üÛ{H‘/_‘²‘Ü,¶%‘ïÇ9ÏéffZ)Œ¯âùä­—–9´vûK7F§(ªÒ¯å32D<´µkÿyL‰3šäCò½Yz*»¢s½ãÅmzyGI7½T«FU¯ôÐÎÚν©Ô?×+.hÞ4 €SS)t©(` :Lܲ(b©È*›?V�ÜlÏqµë"Êz\å§�¥£r.–~|G<Ð¥vì/3GB»›`çÚ�Á3�È<Ì$Y0Î&ߨÜRº‘\%¨€PÔõ—K,pRºqdnN„VWníÚát�(LÁ mÒ+h4îì wöû)"œ«iQ.WŽHT\Øï’iÆÙ Jx¨lÀ2¿Ï+ö*Ë2¾‚²×ÇqAЯ vU£6*HCâ7Vß`Š„9éí¨M§k‡óÜŸ¯N¾qÑZ|_þüˆÒÝýÔ^§­H‚TÆ îa‘Ødºt-â([iŽáý4ÑÉW€œÇª‘hrïB£µ( a1Ø©­ 1•:Ë[Ãä(�mÝÒL×upTŒö& xµØ©,J9´O± ÉÔë< ’÷å�»æ¹›¿ã—8ŽP˜Çýyº £%9o†"±>óè¶­ëcw>Àéý¶S3óLú~uþ%4ÌÕæý…ÆRøðÈ{Ò(w‡#äô¾?öóË.8¦¾Ï:£|z +¡�羕ËÑTÓØè�Ò�M®z0Â�§'{g˜.)±s% Â��°ï¦púÕ®Pî$?þãÂ骻TT!³,J,Í.«¿ñ›ˆ¤È"ïãaq “*‚=ç©ñNû[§Ÿ?ù³ê_Á�KbƒŠ)T 3[IUh“,ŒIþ/ìSà­2Çt1Ö�}íχáëF�+Vƒ€Vvã©7{Žü˜ÁŸ»ãpѰ«[ÊL±†m¸[Þ¿DÓãIceŠŒï’Ï@£ã/ªävkÁ‹]Ek6!-³ä?Ø)nf9Åç¿&†F“ XòÏq¸^"€XRŠl¯wg� ´Ç«ÁºTˆÂŠ~*3‘<\çëØ±ã™þ�¾n„8þ\V“—ÖmТTòÊ6p�N\42l›Ò²f˜ºJ�\­£¹ƒhÜœ{û”Ó¤Zf+·’yècgn$i�O”¡¿c�sט-Iôfb z¸N)ìªã»¥š†·ÁBÀ÷ŸÄ¯Ù ææÁ|¯YÞ(õê¥(âMéVJ”ʯÔíü|¸¶DŒx¾±rWåDlÃ*Ä)'.· õ¤?ƒ-n°Øþyƒ»@Íô!~¾Ns8Æ�n’°°’ˆa´R¦ò{ß>�‡ãðøÂ†·Þ¹Ý‡iN6ô¦Ü5Ká¶ê�…¾p4‘²)tR>>V±· t¿’¬«[p]£ã¥šÒ`?Oü€²$ªÆÍÛ~� +…ù`FtEì-cU`»êF“ªåÓÓp=†ÃË) +€Þ… ÈñÌ- Ý=Ê‚Üi'<4û¶x)ÛŽ,ü)ä³Ìî2!™µi£|™¯¹3û…ThÞâÛßoL"ÍÆþ8vûÃKˆ¦\�£ÙâsðKÔý£èç‹þo•'pý,‹b‰5)"ÛÒL�»Ð3Aó„ÛV±Ò ¼ª²UðÛ5 {/ÈÞ´i ¤MrßQAWXBÕâøswˆæšuáb)í€c 2Z!)Ê—¸�+ßt½è(Á´Ó"TŽ1q䊎¨È,˜{“õ–¥ÛžÓþ·aæ‡> ç0ÏWºeá’Ò#Ç&«�ÂMÝ/ɱÿž‚GÛ¹û}^-!Å”÷e×»Pˆýu¾9’€dû—_þ1¡çÔ1 $è…³d9ßN< í°Áƒt„Ÿ6VŠÖ×ìS…ËèÝÔÐ&š*¹êhÆk¥‘ö‚0øZÔÁYc­ZN‹Î mZf|\(ªoD�ï>Ò£þ¢ßת*j˜|�·®_ñïÁ^ØwèÇV$™AŠtxX?š‡/ƒ+cžF‘ùs?µóñ6ü¨¾sÖ˜‘mè5õ�T™�½«Wˆæ; ýÿOœ–`ë@:€•¤ïh�-°-ÁZ\C¸Ð©á¥endstream +endobj +30 0 obj +[ /Indexed /DeviceRGB 255 378 0 R ] +endobj +31 0 obj +<< /BaseFont /Times-BoldItalic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +32 0 obj +<< /BaseFont /Times-Italic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +33 0 obj +<< /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +34 0 obj +<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +35 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 584 /Subtype /Image /Width 8 /Length 403 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ HÿÄ03q�2ÿÚ?Ó(ª3"Š£2(«rJ*ÜŠ*ÜŠ ÜŠ ÜŠ +ÜŠ*ÜŠ*ÜŠ*ÜŠ*ÜŠ*Ü–Š·"Š·$¢­Éh«r(«r(«r(«r(«r(«r(«r(«r(«r(«r(«r(«r(«r(ª3"’£2)*3"’£2(«r(«r(ª3"Š£2)*3"’£2ZJŒÉ)*3%¤¨ÌŠJŒÈ¤¨Ø¦¨ÕÕÕ¦¨Ȩ®EErZªäUW"ª¹À¬®p++œ²¹À¬®p++œ +Ê纹À®®p+¯œ +ëçºùÁ|΂ùÀñ_8�â¾qòøç<þ9ÄÏæ1ÿÙendstream +endobj +36 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 32 /Subtype /Image /Width 184 /Length 424 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  ¸ÿÄM R’Ò“AÓ!aq‘â31Qá"¢CSƒãDÿÚ?ýJš¼#Ї`"€P Î�‡„4€ªG +EPáÂ)\8påp€éü(ô!¨ r*�€áT8r¸E¥sÑÏÏ%¦Š'vŠÉëc×ÕÿkÝ/.Ÿãìžÿ¢n~£ýÎÁšÿKoÒ\߯}zUó´(gÏ€T«æF†t¸#^¿*Žt¸$Ik¶Ñ£�. ÒOXÜ´©fË„7õ+é§O1xeYj,Búà*J¶ØÆòá*-K1¼¸NÓj'_°¾÷7YZ\ÃuC)‹ê,Búà:}Eˆ_\zöayp�ê¶cyp�=[1¼¸OÿÙendstream +endobj +37 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 24 /Subtype /Image /Width 88 /Length 527 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ XÿÄB!1AQa"q�¡±á2RbÿÚ?ôÓ•Á&�À'˜…¯5œþWÆ(,Í¢�Ý$Á+a7¦ùÁ±¢(@�Û�ȸQ‚}b+I䣾ÀDÄ�7�&9u«ÿF=™�"ú^¢³–¼Eøuµo!ñÎÕ fÀÈÐI’¡¹rä+ æ²6Üû�êªK–ÒâÀñ�+’Ù‘@$ØÄEæ}+1`¬…J‘3¬ÎžÔk”¸ië#mýèsÅ•vcRH¶�·›Ç¤\ûkD­‘^dm,L!¢ âDû)åÖ™•±åQ�ƒvoÖ6ˆÿ"géH¯=Ä‘À†�õÖ±�äR{–ë}bæoKイ�¡F¢8“soZ¬™’„=ˆ¸ $‚£‡æ‡*efЋ̬M›F$h@jÜlf#16&×å©Òÿz?$/`l%‚-È5ØÀª*xÐ}à¼ÌÆöÛë1O«�R*EJ "®+ÿÙendstream +endobj +38 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 8 /Subtype /Image /Width 64 /Length 216 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ @ÿÄ5‘’SÑBRCÿÚ?Ós¼×©Ì5Nožë&«.�ú²`œª0NE.m˜$W¦w¶!=Œ;„SØÞB+ÿÙendstream +endobj +39 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 7 /Subtype /Image /Width 31 /Length 214 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ÿÄ8Á“AaÒ#BÿÚ?q[2âû�8»‚M·-ÝQ槸¶šƒ%#ôTi¤Å ¨—}3åZ´ÿÙendstream +endobj +40 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 7 /Subtype /Image /Width 368 /Length 627 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀp"ÿÄn‘R’SQ¡Ñáb1AB¢ÒCQ!ÿÚ ?î/2§¯=]SÔ¼Óiyêê€<i'ø™£î¡£®¡-s +€´}Ì +(ûˆE¤. RÒ2øj"Ò2ØjZJ[ @ZJ[ šõ”®µz€”Œ¶µE#+†­š>[ ZEÑÒÐ<Ðtd²üi•Ñrð¼Ð]p¾Ïrèat=Ï—.€0ºëË—C+¡âóFA§b]¾Ï-žà8G[øÌa}»Wfp~Ý€)jè ïeFw0ºcŠ3¸g2ºg‹¬"è ¯(gÍ7ãÌ›;ÁÖ€&p‰@NÂëI·óкÔLá ¿Ÿ…ÛHM¿Ÿ…ÛH™Â˜Bí¤>“ýïSük¿°<#滘Àå¤&ßæ0;i8Coó(´ƒoó(´€ œ"mþe–�”g–Ð3„ÿÙendstream +endobj +41 0 obj +<< /BitsPerComponent 1 /DecodeParms << /Columns 2336 /K -1 >> /Filter /CCITTFaxDecode /Height 3149 /ImageMask true /Subtype /Image /Width 2336 /Length 73888 >> +stream +Ë™ E¸Ó”Ò›3…Çbâ�«ŠŒÌ|¦�4ó½ä6H&,µn ‹Áð�n´Öß*è�‘(=¯á-&©~›éx­i ?ª_ô…#·³YÈ>“8ÖGHÎÕMrô�-/i-•%Õ´––¿].µ§JÇJÆ´’Õj‚Uá%]ß®�„¾�¬P¦‡¿ÿKª¡Ð„–?~=~º´’¿ŠUJªC‘JÒaª×øIU7úKT©*Èë_WZ¯ývô—¥ð•z¯·õ_K¥m/úâ Ò¥zmWÿý7ô¾’!kI}jõÒ_¤½¿é$¹ªé7Òÿ5k¤¯é}WëHãú}köµ]�#}zZôµ¥—õ>ÝëHÇÞ´«0¯ÒÒJºr}háú]io¥é{ZÕVÚÕëT’´«¾Ò‡tô—÷U1¥PÛâ›KK1Sa/UŠJ›¦Òáö÷_u ÐV‚­(¤’tÚ®Òt\0Á*´ªa*a¤…qA…ôpš¦)ˆU\1Ó… Ä&ƒRN°ƒh0‘Ñj +Šs�)»ÄqÄDF„x¤•|ìUÒþêºJ’_tŽÆUø¤Òé°¢¸ Å…Ó…Äÿÿù1Ÿ)¢ù�Þ¼¦£'©Gb¡Éò,��—26/)“0úaãÓþŽî­"_U~�={ «ë‚ òd¥ú[Oô½¥ ÐAu_/azZX�Ò¤†¿HRévò”íLy0ô‰8§Œ>fÍDPΧ� ®x‰Ìñ™�"�@äB>A(3Ä’‚`† „ &‡D}-B¦EÃ6®°E=,ÂK'ó¸#¯j•.¶úþ•%f�aê¡--u�ê©=h.»úU ­ô�.¿KÕ¿í(®6ÒŠ´—t»if:Ы¨®•$ŒTÚI%¶R (V§… ´»j’i% +Öh-/IŠýº¦«¦!Si4è.Ån—M °Ú +!lBaU8bªšÚaB B¦Ap D!h„ BDœ!„B´ ˆ@A‚„,`„0A‚YNSzˆÑnjÿÒ;uõK÷]t¾Ú «Á ¨ñÿÿÿä!p¼€ˆì ™¸‹å6@läD +û!`7l4?öyݛР«»t¶Ò ûþ�KézW¥_T¿H”z)ÌèÌíÞ‘Pϲ@§VI„:‹Ò Aá4ÂeÁý$‚i„Mà ™˜DÝ„[¿¨D°4”"á…CßUL$aU& ¿¤•á0“ª"Y jô•RtqúºWÖMóÅ-é{ÖŽôwIZ_ºþ‚IqN’¥HñKµI*KJÒÒ¶’_ –Òׯ®ŸëÚ\kÅkØA%Ö’ŒPëuŠ)i/Cú^’÷T«µ[ëÈÞªºIR_ô½S B_nºô½&ÿ¥Õ¼ ¾ÿª—âµéUЂé_ÕHZÒ[õõMÈ¥?ÒKÈËúÛ5~ªŠÝ}þ’ÒÕ­*ª¤·úW®¿Fÿ=ÞºXJŒf'É×ß®²uK[ Ýiõ_¶µýºT“…ð«JÚö”Ri^Ú]vëJÐIEoÚI: +ÝZ]6ôh&>~]ê©´˜®°ØI°“ +š ½!Sš¦(0¼Ód81‚ °§È´F…`ƒ@ÌŒž@R—ÿÿÿÿÿÿþSc_, UîŒï#áÍyüÆr#™±›>XH§qð‰uðÈ¿i‘¸M/"¯i®¡|%ýo½S\ ´·­â’Òô‡”zCýôw£é¨ÃóìÖD6}“™C>gQ¥ÒFfPgˆœ) !ÐÏH´A0A„Ó +L"Ü<Ïõ … ¢á¢vUê8FÁõF¶ªš…+×z +ª­„›TúH'FˆF„�T#•ék^’3ÕêéZ)á~ë§[Gz;ÐZ8é,%êú •ÿ´•¯;®’úIi*T—ZNºñýt•X®•$ÿI/KZ¯hTP„µÕ¦�õic­}/ŠÒQŠªT‘ÿQIo¸¡õªUô—é/ê•tÚZ]R­- •*®‚ßU뿯ªõè.ª”$•hÃéumõ¥¤„Kò®/LU%MÒ¯Õt¹ŸÒÈÆ±T¾ªíš½.ª ¥ªþ©[ÿéR8ú×Ik¡éUf5£ûéW¿K0”ßU“®ŒzA+'Y;ªK¬¾žú÷]-t•-k¤´µÓ¯K^ÚÒ®ÚÚPô³ m.?Û *õÅ{¥ûJ*¢ª6JKë„”&Òm— «UK ¢ºªb�ÓU]]6‚øbS Š *®ƒŸMU4„…8&X(°B Â%â¹. Œ€¸Øoÿÿÿÿÿÿÿÿÿÿÿÿÿå²\¥§q7 <›”APp¡ NMÄ„-Ä™‘hTDw&àÃ:fBA°$𩤕ëÒåzA 52×ù—†ÒõZÒö0«ÌŠA*¥}8d–•õk õ¥I«ÕµJ•V”zëª_Ö¿U_]UUt¿­/úú2F¤HR,E9RKLˉHЄh�c%!ò&D…5 +Dz&€L'õ;² �ÈÂ)È�E¼‹‚0r4Ê@`L¨ +ª@Ã@M< a0ŸÉ`rœf±’a3¨‰‘¡TÊ€#Á0AÐL&xA¦"%², !L SÕ Š „Éph ‘€Š ¨TÐi`ƒDxðˆð5 …8 Aó *a&„ Vªj +[4Â`ˆ¸ÒÁ-„EƵ 6B!;„˜jª‚ °¡?„‚i„Bô.¡œ‚¨A6®M„°‚o 6©„XIµM'g‚›_XD'ÕBM'XAj¡+­,$ØJè%®s : +ÕUÅÂPÕj�KUA8UÂN©¤éa---RµTº +Ú®ô“h¸¯ÐM*„´Mþ“®µÒp“…ô´[Ô%ªV‹Œ·«éih»_ j©i=8J‘oUë ¥¥tÒt]¤«JÒÒjÝVÒ×Õ%£EBT–ºZN‹´––“JÒ^ºZét–––­iu×U]^\Rê·IR×IWIÒiiRZëUÖÒÒ«z[ZJ¾•%I:J’Ó¥Iu¯Z´“I-%¥IRT©iVûJ–—McKKJ–’×^©*KKHTWýtšKû­*±ÒºÖ©•-*KªÚIWI¥UÕ$µU¥ªIi.•&®¾•&ºÕ.é-/¥P–©*K¥×J‡V–•qðÁ6©cT>º¤¡xékŽ­*ÕªIU*Õ +K×I ýë�ÂD’�M$•zKI Réj«Ii}-­0õUJºÖ¢–½%]*¥éRZÒªI-.¶•q_IU%]/UZJµÕ*I(¥õâ›×õKõU^—©/J©xK¥¯Ûþª´±ªªÒ¯ •W¤ªI/Ö“uZý*I/úI$‚HzXK ‚é%×mu¯ë뤒þ‚ÒÔ «/­Szפ—¤’KéiNëùp]P‚éjµo­kÒ_ëKñºÄ ЕWé´µ¯ª¥¯K¤”†a)1ž‘ ¥ +@¸§¯]ÿõUé*KT¼ƒt¥¯!œk ¹f–º¦þªª«éj«Ò ¾Ç_È`OI*3úÕꕤ’Ì?˜}hÃÖ·ÿýUuÛ_¯Ò3ý-$µ¤«Òÿªªª4_T@Óýt«ú¥õª×­/õ_K F–ªI.ª—éQû¥Ik?úÿà©izïUn“ÿô’3ÒÒô’×I%K¯*+*<¨éÙ zÒZë¦þ—ª×_IW^´¿Ê�}u×ÿÒUÒꮾª«Ö¾µZT–ºTÚ¥¶–¶ª–’Z]U:KoN’ÿK¤­-*K]-W_êÒtµ°—¥¥¯UzýkÒT½-U--%K´’» +éZT“­ZVT�.ëtTµÖ­--%KKJ�%ô„�-+K°’¥iwí¤—ð–—©k¥iEv]°“iXKI°’QUa'¤®’t¿ÚQIU¥¥¥I6—¶°I°•¥aÕE: ºÝÕb«¨«JÒj» *pÎÁ˜J)†ªªm*m-´’û +5QZUTÅÓbÅS­S ´·I6‚é§TµL(…P•„†Š�´ÂaBaS +*m†Â +¡0�Vªi…TÁÂaA…Õ0ƒXb‚©’È4’¥¨UT„Õl/  &aS „ )T;¶S …L&*  �ƒ Á0ƒ!„Á0‰H‡`d¤¥j˜L& +`˜& ‚`ŽÖÈ•2 +‰¸ 8çÚp¡aZF"""¿^[ZP@úuÖ�zëë¥ë ®•ÐV*ÁA‚�ÿÿ–X« s!ÁS–õ‘]Xl&È2`Ó Ò"�ÎD��Êó µÐ¸k@Ó+«*m6¨·¬3”ü{’�Îá‡Ã Eí4ýÃä%U·é¼è ý×éURÚí¿ÖÛ_ª¯ÚÖÒÿ�vµI/ãUþ¿þº­%•ÄŒ”ŠFȤ20d˜^—©—|«©‰©ÐSP¥X9 +"@å g$Ã@& ‚ ˆ ÿ¢.2.E8¥P=d@¦¡€„\‚S�¬ð©‚JC@ Áa0˜L zÎ��ƒ0™¾ „È�| `ƒð˜Lh0ˆð0ˆ–DK &šaN ݨR©ðA„Â`…*ABa0C‚aEÆ’I¨Da‚"[ Z†ÂA°˜U ? ™˜4„CðaBa|&ª �‚d6VÕ4˜a„a&ÕÕBi>’ +¡à +˜D'ëP¡B ¤œ%êB ´› iIÕQqJ«®mT µ¥E»P“¥¤ÚTª•„´¯ut\B¥¥ �@­³Y Mª4BMjµ¢â“¤Èq‹ÒU 6pºÖéR.5I?Ii+E�IÒëF„“¥¥K¥z¢â‰½m--7WKé/ô’^“i:á/×KK ijºI4–•«I^öéiii]B -R´´´©RK]-%í-$’餴š^ßt©-èUAm.’K­-*­*K_J´µ´šIpÕµJ—I%ä4«Jµ¤’Z¯¤©*I/ÚK„ªT–¢•[ÛIt’_Ð$½+KKJ•$ªµÒT´© ’]5ÚKØØ×Zýîº^µT¿­zÒý| ¡RÒZªÝŠCÒZä5ƒIi]uJµ�ZI-z¬B ÒõUwë×�^a޾*ºZÒJ’é.´”%¡­U[mV¾©¥ô•%®–—õ®ˆj�UST’»¨¤¿†Ò¥X­zâºI$½$¤3E•WZL6úé½kô—ú]/­)Ô†ºªM¶•}U´¿I.•$–—WUA%Uô‚»Õ'ýô¿¤¿ÇIWTÿ¬$Ûk^—®µëªÕAtªªM·Z¿«IuT©zéi]%KטÛoJ�*þ½kJ©-.éH5ê¾A mºý¥Ýj½u¯¯I¾ ýQ ¡{uJéjé~ª—ëZÝ$AA--jC8+mz ¥_õ]uIj•[AH.–¾¹ *_Kmõ®©i/×ч¶•uKá°Ýk¿]}hÏ®©t©ˆ_ÿ»­R Z®©jº×Õz Izò)¹:z4×?¢v +«ýkÒŸõI/K?"pAÄzÖô„ëJ’�ª3èŸÖ¨ÿIRѧúž•/HzÊ‹*;{uK­uªªõë¥êµU^©$¹Qéik­éô¾«U¯IÒI/]-%_KKUµKûJÕ7·ÒI%¿ékþ–’K_¤’éi&ëÓ¤é:WÝ*^’}%ZKK×K­.¾´´“Òþ´­+jßJ´¡ë¤ºzJªÒ°–©/¥i*Pì$ªéZZWõ¤ºPuKIUÒÕt´´ºK](¨6Òé´› 6êý/ä65cKKKJ´¬ŠT¿ÒbªCa†—ð› 6n­(ªŠƒª¦–“p¸¨ªÒZ¤*ª °IRt¢ %i7UÂ�Ìj%ÚQQN’Õ%šõU!˜BOmÔStÝRÔB +©´ºj©uª¨6�A°‚a0›I´*¦0”&�UT a›TÂaBa°ˆ�i+h&a0ÐL4«¨s% 7¨M„ÂaB¤þš¨m-!1„¦Òi ØASM4Âê˜L(Pà h0L0�‚ !a�³ +b ØL(MH'DZa0“DXE*#-J˜ˆ'’Ð�…`˜@È:XL&" û –Z6 r̘C`Ön ¤H6�n�tŠp1SXR 6h„ & TÃïß~ýo¾í7[Ûí¤ÚVé´­¤ÃJi `Â@È1ÁA�c B†!T€bY‰ÀÁe( ,ÂaF?ÿÿÿÿÿÿÿÿÿÿÿÿ-�2n+ËWŒ ÎÈŽÔF¢ +vË%XF�¢ÃÂ…p‘\›¬‚à§k9ŽÄTý;»¾¹!ʾŸ¤Ö�ÕW’Ë#UÅÞ—;XÎÀåë¯UD±þ«ÖºÐ¨¯ú Ó^�¥­u\W¯ª×éRÒ�ü¤4v#%l� �å ÖŒy/“ç³A’3ÞC“"‚'"|Í’œ‰‚!ç²Ly³'Š�A8‘3PÜNdO$ËžCξFŒƒˆLdèÏ4�LÆfD<Ò3Š�øÓ>4E™*‹òÐH3™ÆhDxû«®5V«ŒPÝU¬P¤µøõ¥U�XÕc]*ã­Ž’¤¡%×\t±ëXÿǯÒê«UZ_¿¤±ÒÒ¥]$+¥­VꢵªÕ-ÿõ¥ëÕ-z¬4+Ia×ýijµÅRÓ´¾ª•/I-iXÕ!ZªIUU-uJ¿Å-/J4©WÕ7J«ëKªÕn—«_¥Ö’J•tµõUªéU.–µªªëë…þ¿KI.ª’ëëë_K×Ö«ª¥ÿ×¥]zÛëÛ¤½TªºJ–•kÕkúUáRJª´ZUë^•kT/„©uZëUAtºýXIºJ½/Jµõzû~©R]i}/×Z¥Uë_Tª¿ú„©z]ëëø¥¯Õ~’×ê´µªÒºà�7Öµ¥Zô—uÕ-]ÕAj«_¯_ª¯þµúÒU_]+j’ô¼ñ_Õzÿ_ZU­7X·ªÞ¿ëõoý¾¾½+Jµ $´«ë×ZIuô•.²êªKÖ—J´”µ"‡¥6�º^µÕ}Pý~¨"‡á*ë®’Ò_]mÕ{u¥KÚP¾´qýuÐEª¡ô¿®CÒðŽ?¯ªê´_ëþ²‡^½/ªKúÕRþ� [|"‡Óa*úUIiý*×qÐbëUÖ½*Uë­uÒ­kÖaRUúZ©…�]IW¥Ué}i%ѵ×J•z­*T�ï¥ð‚-pE>ª«××^º¬Â}i%J’ª˜U­.¦5ª0³ Ö³ K0ºSÒU_/êOU/ô©¤¹…®¹šÒÌ.ô²þµôc×ZÌ-,¿F50¿0´³ +ìþbýQ„¥üT¿FÖ–_Ì-s L#ýdfù…­ikækó JŒ.—0’­,¿¥¥­._éUtµ­-*KI|ÿW¥õÕú®•VºZKŸZKN—¥¤©=.ºÿZUJºé^—G>–¿¥¤µ®–´·ÓiUô¯Ka%¨m©Î©W]*ÒT´•%ªK^´–�*Ò7i-*¥¥¥¥ÚXAu t›$>¡éi6–VÂúWI +Š´´+ àáëa$ ´¯O„ºÒ½-u†µ¤©E¥üV—¥ô“Ö)°”5Ї®‡ƒŠ‡iqW¡Ç¥V•¥„«AÃÕx¥1%iEVÇ©Òô*tªUKTÅT8¦Òñ¦1PîUCt¢ªÒWIm(M¥QU Š×…]V‚ˆUMUBt–¶«¦2)1LTUU é:ª«„Á°ª˜MSiSÓio +ª«¨T› +!x\(uL*¦Â +¡6–ÚTÃJ­µPÚz­…ÕRi5U +«bš§ªªªal*…M4�áaŒ*Új…„Õ1 a0˜LBM5 „"Âi �a†�§µTuUM1ULB ÂÄ&ƒ-R*Øa8‹ ¦°†s;b4W†Êê‘\nlE©db""!̈Øcˆˆâ.mR´›Pú®’n©¤�-%uïïÕzú]ýÒ×êé/¥zJ“tW,éºæTéÒ[JÒmm¥kjm(Ø4´¡†$~(ؤPaEe dc§ ŠÈ²F ˆŒü¦T⸪–�.Y#*XEÊãG,€Y‘V›š�‚A';$¸()جv<i_õkþÿä$�ý¦ˆ¿•™ Šå·_­OO¥ö©¥Åjµ +‡®…GZõ�ê½~µUS³<ŒÊžA¯"ÖȤC3¢3Š Ÿ'$Èùâ* 2 ÈfteóDfÉó6Ošflœ‰8ú(ò¥�„FÒœÍG•lÍh Ñ‰ƒ4Íå¤EuœiG£6C#Hù„BVn/‰hBy|OBÑ@ƒ3g™ã¤0�’lÎ=g "9ÑÂÂ0莂a4i„4Â5ž�ÎÁ &šjL*5’Mß&éa�eãñÈ$_1šeâ^<Ϙ&?´ #»#Ð36MB SL"âpÂ3´õM0� 0©*ª3Ô(E½èöÔ*höÕ|˜ð¿IªAÕR ¤6¨îÑWTU¶Ne[I¸$UÒm*Þ¡zª;´�m&ê�@‚ªi1¤Ú¦×Té4ƒr`ÐnÕB=¶\Ïpº;ÐZ ´œ$¡QÇ¢¢–¨Ï ²ôqÚ’P’ôcÏú®«×¤«ªéuyþ«K?Õ%„Ž-ô« –´ºéj·ô�k{×}¥®«¥ªZK­é7Z]W£ _Xyÿ]t––›ít³éRuT¯ÒOê°•¥×M¥¥ÕR ›J¨% ª°‚´©*Š´£¶ÒÕi´¸?O]%J)´–›Iº¨ø«í%½ÒÂHV…T8­ +aéiEt¢´´�ªm´—ŠÂïô¢¬%¥Ô=(§JÅFƒt´­(zÃÒX¨qKQ‡i/ÂKPïJÂY‰(V•ÐV“¤½¥M¥ IÒô˜¦*ªÔ*¨v“¥ Pâ¡pí*ªŠ­[تcÒ‡WUu\(Ui1WKTÅuë +.¡T6*ª˜…U\SQ `ø¦ ´ºm*ˆ[›J˜h(P¡o×Òlh.Â…MW ŠøL*é†Â¦SÓLUVÓM‚MUWMUB¦©ªªj‘C†Ô*¦¡U; +†©¡„Ó†b˜M1 bši¡„5XHðiŠ…ª¨T!Fª„]ª &šh0˜A¦°ƒB„L!Á ÇíK-Ëc#lDb""“ ´ +íê�zAÕúIº†ðéKú÷ïé%u¾ònÛïOV“in˜iE:VÕ† 0˜¨dc„ A34 ÿü³ es$d‘¤yG‘�̪æGÊà|²¥’ ®JG`ó·(ã" S.#±ò£;2(FÝÕ»L/ÚM6©:TëM;õÑ?]!S´yY¿ëë\¬ß&2U¤�u¥]}uÕS^µÕF”TWÕ~µÿþ¿US"ÏÉjT²e‘nˆœ¤M�cR7”ñ:$D¼He IÑÕ“š!PW”A4ó<£$2AË!*:d ÕHæS£jBhZ +¬µ™‘#=�ghd<äNÌf„u25�ÇÌ!DqšDK6Ë@fŒþPDz´�tPgÙÈ36z †}›jpÍAÌyÃ@Á#°C>Ða`�ŒÚ L� Â$9Ça0˜F€Áè&‡ #»“u–g³Ìñ…#È�A¡‚°Á ›”ᄼ™¶ƒÂ5´Ó0 ‹³žª¸#óØ`�aB5ÓÂ45UP‹pÕP ‡ü&yýØ\$ßé¨IŽ“E]&Ñ¢¨§ �&ÕxG¶¬œé6жâÕ'A:ÒA´ƒpºªi6І“a–ê�0�wÒml#Û ¹¦õG».�k„lI0’ ¥•µT¬3Nª‚tPû¯„›E>´¹CôµZGzÓ Gz¶‚ ÑO]*K”=ï´¨-]«\$ÚZ)úZôS¥EïGŠ µ“xî“î“k¤úM¢‡ûé6¡Rê•´�xK R)î“è¡øGuZ^•k­¥K¥„½-ôSô›G–©>Ò´•.‚ÒÒ°–––ߣ½}­ÑOE>­*ZTšK¯«¥¥®ºWö•V–ŠxG}.–Šz½-¢Ÿ*)k¥¥¥U¥¥‚;¤µKE>µÒÝ.´©µ÷_ßÒÕ¥KARô–¢�¥ÖºÿZö4ª‚T´ÇÒ±i-qëét•V–—Š]V—ߥ¤ö:V”:Ç­cª½RJµZÕ +](b*–5J«]-u�ic=cþ—jª’IRJ•$©V5�*écŠÚJºUéV”/J«¯ú¯ªŒPëãCj·TºéRãÖ«U] RÿUËr1ë�ꫪ¥Au¯¯ªÇKJ—ï¯ïÖºõUXÖ=GUWW¯ZéU^–—Ö5KZ­,:J†•-/UÒëúZªú¯®½¶©TRþ¸­ªªI?ÒëUô•RŠIUmu­*¯T®¿º]$«ê—AtµÒê’UªéRZú­R¬$ÿZÛÕzIRAu×ZV«ý*¥J—ÐPºIÿéWªA^ßú®ª¤µ_ —ÖKT«®ºK„®^’õ[iRÂõÂ^ß^‚n¾µýt—éPW]}*êÛUöÖ¿ß ~µU*ýª×ÿ]`—à‚_ÝWõ¥Z¨„’¶º¡ +úIj–—ˆU¯\ŽM¯ª­RÄ-¿T¿®—K~•xA*KUõõ®²0ÒQ×M×MÿëÉk¦éjM?_U¥®[)ÿ_‚oIkþ¤´M×íÖ©-6–*’Kþ?Á*ÐUI.µ¨%൥ÂT­õõ„Pø_ÿM¥ÿøE?­Pôª±ú ¿ úöÿ÷´„qýa>ºêºYC¯õªëªª] Kßô–¿Kmiw꺠Š}ÿõïªÕeUö×J�zë@‚ ªë¥¥ú^’Òó úôºK^©!J½Aë£kJŒ/RûÖmWꮺIi)…õJ�ªKß]kJŒ*®Ÿéz6µ¬òUÍi)}TÂÒÌ/3Y�hÇš-t²ý%ú¨E=sE®h´¼Â½"3|ÍieúÒÒ×3UYÌ%K0³<Æë_ZY„©Ræk3ô–’ômfhÞïKK¥®¹šR{§\¨ß^—JŒ(¥U륭j©}Z]i-jy$“Õ'Õ¥¥iQÿIRºï×K¥×K­/I:ÒÕRm+é*ÒµÒ¤´´­.ºþÖý~´–ºÒúîªý-/]+ÂV–¨%¤©+iEV×KXj)ý¥ °–ҵ{iaPz °’¡^ƒ‡JýUÒŠ‡a(¦×K„�uJ“ii:T©aaªM­_ºK¥éTT6ÛJ8„±QQ]¥KÚZQUM7JÒÂM®“·˜‚TÃÌA+J)ˆUP¡Tu ´ª©ŠÐZTÚP’ŠAE1X…ªÅE]h/IˆU¤Å+i.•]SiuPبUUULUU1R)ªÓM´˜¨„Ä(¦|B¤E0ÐL*¯j˜[±]S ŠL »A4Õ; ­Bª¦˜¦ém*« BiˆTØ ¶*¬¦ ØMWMU0šj˜LSTqF»ši¦BâÕh XLSM4,*i¡„Âa4Ðh5B¦„D0ƒ T"Ó  Âáͦ�‚ XhCX„,!Öɹ."“e¹\""2Ê¥(ˆÍ±‘ƒzAÿZ¤Ý$Úÿ¥uÞ©kî–ÿZý+¥õ¤ô/òÊU$ªvEWÚA?Vž“iIØ M8 Á¤Å"¦ð™JVƒ Œ€¸Øoÿå2IË2Ùe+ÊL·K&éY‘¬ˆ3!,¤Êê0RŒ‰x¢XäÝ`‚„xëiÐtß´ëÖ¿TRîŽÀÿT9¼ÉÿÎÄ¿ôȵõúiZ¥N–š¯¯J#�Ðê?­.•k¬î5Rÿ­r¸ÖUTˆ$r + µdªj¤CÊ#«$ æ’‘ÌŒE  ÉÙB!™ ´E™2 |öPŒÙFC,üi9 fef™ìœêFÑAš¢VYžO#<Ò:9‘f�2œ! ‘äE¡70Ca¨H28+Ë™¨i› åù|LäeÁ™ˆNÏ0�¢Ç Í›`ƒD~ û@Œdì d‡Úa:aG‚ #; ¦Pa™Á0� Â &‡¾i…îÂ3º0ƒL*5¥PŒá¦¡ "xÓM/s†fi„h �¼j3ÐEÃTð˜M0� pÂ5¸Â.#@ AUB44kê©®˜FÂZš6UW=z=°� p¡Ú£�×PŽì � °�p�mSGwM­«h¬höÕ!µG{'DIµ]êX]'G¶Ë M»z„¤ÕRcIµÐMÒª£ŽÂ;´›'I°`�N“²ÐŸ´›I×]UQQXIi6áèñíU&éÕÕ-Rp‚ÑÇ¥ ´µm+AZ8ôTR÷]-t�='”:-¥Ò}(t‚ÑCÒÑÇÒM¤úWºªMÕŽëVM¢Ÿ¥xG~Ž='KKÝ+¤´½H¡áRÂTŠt¨¡è¡èã Žéôºi&–Á´ºtSÑO]_taÒ¶Ž=----t´´šVÐZZ_h§„qÒ^Õ¸WJÒëÒÖ©----*Az_T­ÖŠ|§ÿIëª×JµuK¤´´µÕÒ}%KÒÒçuõ¥ÒZ^éikK¤)kIi/¥’ìTaiZT–µ_¥I*^5®’ÕS¥Ó®˜ã RÒÕUz'KUK_¥Õ1Òý(t—¥Ò]t´·«éU.º¤¼VÕi*¥Tº´”WKAé$—WÓtµÖ¸â«ÚK]tµ¤’T–•*¤½$´|a�}�+c¥ÕjµŽ–4’ŠÒ^µ®¡Uá,ikUס®’T—Uºôµú¡±UJµÆÔt—Õq×Z­*«Æ—t”tºUê–±ë­V•oýzÕjÅRת¥zõŠÕU¯¯ªªKÖ‡KIkתZUKê—­zëÕ*â“_¥[¿î—ÅV©UuáÝV•SÚ¥Ú­$µ¤ºÕ}7_ô©lUWUUýuÆéRºõ¤«UIV•R¤–ë­U^½%¶©i-%uJ½$—ÂUýBVÝkú¥×]RªTo¯ú ÿÕ µ®«µô›UZUZ¯ÐKúúK_ÿIz„wZúë¯Ia¥¯õè&í~VI/үꖪ©.¡/].ª­}RZ\Mþ½z¥á*J—ëíR¯×ÒŠmÿê–—UÔ^½R¯"èß­Wˆ^’ý%^úQUÖž¢ RÕ~ºD]uªª× k­U/N—ê¿\ަÚÖº×IWßþµ¥-;n´½fÓ]-z…źþ¹l£4¿JL&¿¥õ‚Ò®¼*Rô®CõÒô½*ªUà¶ëJ—¡ÿôªô’úéݯֺU^PëuªUýtCᄪ–ºW¤ºoIpŠ}PúYC¯úõëTúÕVÛÿÕn’áõE?ô¾µ÷¿¤ºúZÿÒûõª¯Ò¥P@…kZ^§KÖÿþ«ú_ÐE:Tº¬ÂêÌT–aj»êauY„©%Ð"ž’Zyß­L$ª³E½k©…ÿJ¥úÂ8ê’Ì-èÚëUé.¹´£ét¥úKõ0¿J´’SÒ£ L-,¾—¯¥FÖajµ˜Xæ~«ÒõæhÅd}éuU],­-,¿ —ÌÕ™­--u[S—¼Âê©%/Ùÿ3Uõ溤’çó«¯^f½RXJó5[k^¹~’Õ³èÞýz^ék®’ÖÙõ¤´¸IUj•VÛKª­$–µá_¤õõ®«®½iRM®—KÕuZWÝ*Z^––“i*U„•-á-&ÒëA]*Óij´–­´°—ZJZ_­ou]--.ºÖ‚˜u¥izJ”:Ž¢¡é:Zª]+i_iEZUÂH= +Ї¤ÚºUPj–ÚW_ ´–SiiQ¾–*„–*+JøÝ-%°µ6’Ò‡zV“¥ª„­&áqʇ*!{abª*+áuv“i/iTSuÔ'IiŠê$Ô&*)´µ­%Š´›J�*ªŠcí*…LUT&)´+KASºiC¨lxKJ*úb­,%L$©*…ZÄ&¸UK]Cb­*ªP–ÔS¶ª…^ÓU´ÁZUU‘ÆÓLS©´ÓL.+ê[ ŠÃ²>–Ö¢ª¡°˜„Ã-ªª¦˜®šiªjžTµP††‘P1F¨ŽBA„„CM0…„4Ó0ƒAˆB,*‚aA¡`ÄDCBB"*"!¡a%„b„ÂEXa„AŠ;ƒ NÆñÄDD(lDh›–ðÄhb"""=RA¾«¤Ý*¤ëëWëß×ï­}-Wt’÷ë]©]þ–ÒU^õi +mêƒ0ƒÚô ¶�A„Ñpѳ  +ÜÃvMˆŒ1B"›Cb?ÿ-¢y’„WTÉùi å¸Vv+Hì‰öµ%ˆ¯|å¤&F¼·P@¨}'ö“v¦ÂùSîÿ+æwÝgfµ~w¥ÿ-º%r§äe¥ÿ]W¯ëÿJµÇZã¯Tª?T«éW_üªæCyÙ„FU" ,aÐâ ÎHŠögA©ì§Ê‡F„§¤B Ô4ÃÔôCeP@Š‹2dô~4�²x†2ùøÒ(2r#FGŒÈÖÍ3Ñ¡ydx̤ÝhÊÎ9gÑ ÈÂ?gÈ"'’¡¸¿&œÞo&A)—Åñ2(fãŒÎ"�h A ׳Ìñ"Ü3HÛ´NÏà�Úƒ?& Eàš¦  ÌäѬçª4ä&‰àj¡4°˜G€ÑÇañ„gaÞM5Ø(*„xi„4k£ÃUCGÐhðõTÂ<4qÚjŠpôxj¡T&¡ªhØzm=ê¡' êŽ<Çžk¥jšA´V?ðÃ'DÚ¦dž]MT °¸IªGvî °=#»I°‚ ¤Û,á6“j¸FxTµ¤›EcFÊ+(§øI¿ÙAáé6¶¶­„tPü$]jŠw*(¡èïECI·ïGŠZJŽ?-ÑPÐ]8GzO[áRm?J×E;ÒÒZ)èñIý*ªÚ8ú¨Z]Z8ú¯K[Ý&Ýtž‘ᢇ ¹CÒÑÇêÚºZºTº]R W¤éh¡êŽ?A~“~î–Þ–ÒÐZéaô´°“h§¢ŸMéP#½-*ï8´´±¬"Ÿ)éZNé{IéZZZ]*NŠ|§¥h-WTŸtú¤é}%ªZC¥¥U¥¥Ij—m%VÒþ¿­mv—KEBAnº�ö?¥­zZék„ª´º´°µúZZT½kU¥úZ´–’þ˜¤ïb«¤’úôµj¾ºêµÖ•Rª×Lu¤¿KKIR¤±­W¼RZzÕRìv)iiÕ%Ú[ª¥ÒU¤£ÒIUb«Ò®’Ð¥ê´�],V•zUÒŠÆ©/ÿª‚I}WK¡[—Âõ�_¯U¥Zé-cøê«UZKcKªÕ$¾ÕF?ü^ºU--$´•W¯¤±±z¬zZZµ®m®µc÷ªéuê—UªÖ­~«Z¥ªÚ¯ªÐ^Æ–½Umkúªõ«õP—U½[Z«ªÒŠê¬SÿJ¢µ¥±O¨I%þ“éZÕEXÕZ¤½b¿ÿ´“}*Iq Iuªê®–×ÕUioj«]$ßÞ«¤·T©%­ªÂª]*_õ®’¿oP”%_ÿTµõZUJ©]«J’þ©U% 6»zKAë·oKZT¾›­•t’ÐKª]-*ÕW¯ÕzÖ”$ß]i-k__½WZ×þN©x —K¥_ð‚énºÂUT·¼^¸ ›Öüú_Â^ºþ©}$¿U¥úàŒêß‚ ë^ºýWëë^!7‚0ŒAu¯ÒT¸A6´ëª^´÷B ªˆ&úuˆ/_¤ µÿëú_Õzô©+úmqõ®—Z +ÝikKô”±�X¥¯Zźۤª^•­»rz¥Yf­òêI~²zªë­*Òþ’¯ÿ^›Õý$¾—õJÂU®­*__U­tª¸G¾Cßþ«¡ïzú¯§ª^’K¯­%õ¡úÐEþ•꟫ªú^¾¹Ç AÕVãëZßͯ¥¯úþÕjý/Õ*½þ»é_úýt’ÿ¥¥]iR˜UJaU%¥¥úO›]R˜Tm%¥­ ”ÂQIu¤›].ú¯ôªaQ…„qú L-ô³ Ô"‡¥©„¦–a=úªÍêêat–aU)…¯FÖ•k¥˜U˜Zæ*­.¿T¶f‰êrÕ+?뮺_J–·ÒÖª_Òú²EækJϬÍ%ôºéR¥K™£¥©êÈòæk]uÔ�rn¥mŸK¥iï£×­ŸKÒë«g×é=kZZª®––þ–«]-+úë]%é-*ªÒÒ¤®ª’P—Z˜’ªÏ~ØKKVÒÒ­%­%ÂZXK£v’ÕÖ‚Zm*J’ÒZºÝkékúÝRZUZKéiU(JÒXxT*¢­$UPz[¥¤ØJøwÃm*¨¨¥6’Ý,,S M¤µê?Si&Ò¿J)´´¨Þ’ÅCŠãŠm+øáý„°•„¢¢¢¡ýöÒ­&Ò´¯¨¦Âü:¨¦ÂªÅ:UQPºŠ«UKI[…iG¥M¥ÅkU¦ªÚQ +¡Òkh(uZziE6‚bª)�´ª©ª… Šml*m(¦)Ž&6‚ÚQ\Š@¦ê›J¢¥_Q +ª­.˜T´ÕuMa*ÂPl¶*šªª¨…V‚ªAñI‚UU„ê)„Å5M0ª!uPºªbº¦)¨L/銱L*a0 Õƒ¦¡UUBhi Ä!Þ†©ª¤ „0˜M’a0ƒFXB¡a#Ûr!ˆ¢’ƒA„ Á†„DTD ÓB Â;Yp ß2Te¤o¢»ÍŽ[�±F"4#ã¤뤗[®–©RW¥ýWþ•%ÒõªÑ\i$§jšMÖ£,¦$“JÓI´‚„QA8l4‚ 'º•µ”¡4"#ÿË*’&ÁQÚL²‚£‘fTée-2Ý>v gcà¤ÙؼÑÙdVȈ‚òNL5êÖ÷ý\·Ô�ëúúÎÖUy›¢ºœ®¯Uµ_N©ª×qǨ¨ã­*­/Õõõ"Š”0 3•¡‰ffj}œ†Éb7š‘C#fPD4gšJG"ˆÒPášQšGÚ ÐÊ36NF‘¤(26ˆñ|Ó3Ž¢y윎„c?FlÏ=“žz(ÉÊ�Rn´GR4�²šG"s/dœigŒêdv|gR@Í#lÐPDZСÆm ËÄÀZ@Œeà�EÈû„¹Ã4g A‚öƒx&"øL Âj ªÅ Dy5L&"úaBjªá¡˜L#E4Ñá„kª©¦�ÐM4k'ôü÷M0�ªaÒªªap•ÈüÐѽ.!7ºT»®’KK¥[}xõú¥ÐU‚ÿ·Z©cP©/òôª×É�¥]/õ�x¥×I%éiA*ÿËzIm%imÿÕ}tCÒý*Kék¯¥õoT«Kª¡ÿøE®¾˜¥¬Búú¡ô¿TGUKûm¯†!`Š~…K­jÚÿ_¯Zèã뤿éë^¥>½i.ª·ZÒ¬#¸T´T×úýtº;Ì+1ú®—»×@Ž$—0ª}iR˜Y…Ò¥F7Ò¯úõ0–©¦<ÚÔÂÔ£kK1êaU^–_\ÇÖa~ïT’6¨Ú_U/ãÕGU0ºê”¿—érþ’øæk­ë3òG˜^a%˜^’®a}.´©ä{ÒÌ*³þfµ¤µ¥T´´³5­RéfkTˆó륟ô’õKK_3].–º^fª¾Òðó5Ò류UúõZT•ê’Ö­¥ŸáéÖº­éU*Þ½%¥¥T©]õÒ]&Õéz®´´•m*KÒŵ®›é---t«K iSkkÐKKJ›]*Jô­¶¬$Ùά%„´�ª¥JÒÖÛK­ÒÒm'«Ðª‡Òƒ‡ ÐUT«éÅ öÒÒ´ª ô°±QN±K—ÒŠÒm(¨¥Š� +]-*ŠŠ†¶’˜ê*ëzK´¸Ð¨ªÖpáØKIxM¥tÚP—aÅW ´–,Þª¦ÒÚªŠbœ µ¥J!U1P©iŠZê„¢¡BêSÒ +©Š«J>ÂXlUS¨T•T*†Å&¦Â±M0ÒƒøH6ª�v“_Q á1 áU4Âm*êÂUL&µ°ª˜­†MuMU0˜K ªØ\=:ˆTS†ÂªaSMt"ÓTŠ€ØTG!  „Å;h#C¨L${aˆC „0„D4á„"  ˆÂe€ŽÉ"½Lì©F°ÄaC ¯ølh0FA ؈¤Øˆˆâ"*"4)é 7ŠM„ƒij“Òo©7¿^õ}ë}Òýûÿ¿¤µ÷ýn½-n·W[¥t*¯Þ›Im[H&6Ò°Õ´‚ 0á $\9²ÈFS  ƒŠœ2)˜¡aA°`„DF#ÿòÍ +Íhìè—Gb蛣; å œvt_)y|ŒEé‚PSQ�Š\d`¤Fv32Î )˜â��/¿´Öï»ÏÅòÞ•é_F—ÿ�„¾Š‹è�Çc/×ú_×µ®Ö«_Z¤ª•hV±‡KÖ8ÿýWú×ZÔìÆTóºòJrB;VéNˆ­êEr-©$º�ZYF¨�£S zœ�qŒÑGS£8Ó>‰ó¨ˆ‹“ÖH"$eò„1Ç#B'#By” ¨g™â›=0@ÉÙ¶q™ä#DsfÌØ ѱfâAŒ äQ²c˜àóÌÑ„ ÍŸÁUÆlñ‚!|œr4"<0ˆL.eùΛ¬ÇšEó6y a6Š#’ ý Ð´Mi¦šað´H#[AEÄ#]UÚ8íï ¨ÐõThjšh×õUðÂ<5Ñí„gaé¨EÜ:5Â4 Ô#[[G¶ª˜p�mUá˜éU4{uL&”=0Ž=+U^‘OØ•áëZ šdéGé6'Aa/P‚m$—J;´°¨ãÑâ“jÞŠˆIµPŽïZt�>’ºt�Qâ‚Ù¨i:^Žõ¬#�Òü#Åš‹U-'qTPý.Ç£½):(xGzN“khïô›Ah¡éiR)þÇ„¶•'Ò´´´©=RÖþ•'I´w ´´´qÒZZVŠz)ÿ¢�+úZ«¤éh㤴«[*IÕ'E:[IõlÞŠ}zVŽ=ô´½zO­ëAii`–––•£�§×ªNÒ¤´´©^©/¤ŸVÒÒ¤´¹Oõ +úZ]Rõ¥ ´µé´©j½-1QJ´»•--uIÒÔt´´º].´µ¥ô£t©F�T’º]-z¥Òê«KAjÂ[è%ªŽ––—ãÒ®–’ZT–’¥ RìqZKUIkUT]R㈤î?cÒ®•J’Õ_Õ%Š¥CTª’ŠIt•t?XãT¼i$—¬RõU¾(G®º¯UQZôªºú×UªUîºê‡Kª¨(hzZcëz­U¥ÇUZé*õëýP֒뎒ª¯ÕU-%UÒëñ¯QÒXzUKªú×¥­~ªïAê°ÓU*_ú§ºÕmU®¾•$ƒëUÕV+]PIUtº®**©+KIÿ]*¥úªU¥ý*Z¥IU·ZZIitª_ªÛj–—UJ’éj½*ÒUÒ]V’Zª×]%ëZ¥_úÖ’¥]iU~´«UIWô}j”/¤¾—ÿoúIµ_úÖº¯P‚ZT%Ö‚ÿÕiPXJ¸Ikÿ__õ¥úJ—×ÿ¤¼mºü_JG-WT´ªÛÕM×Õ%ú¤¿X%®G%Õr9tºÖ¹«^/ªþ’ëé*ú¥×¯T–•t¢ ¶õ¨…ªðIWÿJí×ÚªJº×úÒÄÄ×# -%õQú’Ó®’Zé*¤¾ª«¯KÿK_¢iÞ´²ÆÕxýWþÛkRÆzÿú¯¥åÔ’–6¿‚ëéUe²ŸÖ $¿úý¯úªéÿJº¡øE ŠÓ·ÿõÖºU¥Oá~ÝêºÕB(õK^’ÕxE~ºé%ÿ_ëIP#�ê‚(¥X"�RUé{þ§¥U»Ñ´•uKªTmzëïI{èï0«ÁëëJ´«õÔÂëÒT«^’ÿ]k¥K_¥˜If5J—ó \¿ëô©%¥Hiåõß×_\ÂÌ×ë¥é)|¾Ù„ê’FÖf�þ’Jª_ÒÌ%0µÒÌ,Ñj¥û¤³5KY„¦™¯K0³N�¥/þfµJafkK/ôºT–’®©ieúãÒUT½Kõ[k¥˜ZZcžg@‡ãl!P™›A Á EÆá„\T Ñx"8îÂ%�¦˜F¶šjšhTÔ#;Ðú5’î u„Â-ááF†á¨EÙ,ª44lHÐ4T0�MQ¡¢¡£c¦¡“��5×ÕU4k ˜Ñíá0�uѯUTqát�&ÐZ£ßn’]« 6».i½Uz*!' +ŠŠN‚ë +“J Ä'éè Ò ´´›IÖ˜J�›K 8IÒm}ÚºVÌ¢�“ŠV¨«¥ÖŠŽôx„´˜A.‘Þ“J¡.ŠŠŽô ºa.•"Ÿ¾úTŠ�ºZ(¤ÛèãÐNº +¥KIÕ¿G´Š µÒm/i-/ÑÇ¥£�KKKAVéh¡è¡ázé:Mô‚´wÒM£Ž—AxG­%¥¥¯Þ“ih§¢ž•RÒ¤´´©---uzµKKû],"¡RV§¢ž‚×KKJ—QKôª´µZÕ-%QIWQARéUk¤’ZbºM+H*K±]tž½---iPT’Ö’ ª´µKIRÖ’éPéj©k®’ —¤¾úëKQ×J6’é$µT´ºUÔuÆ©.ª´ªÖ«´¿­V´µúÒT„u].±ÅUqéRñëK¯×KªÒ¯¡K�Ö•/õ­ _é(õꣵŠB)ºZ¡ÒU­-kô—×_KUõ¬zÕW¥µQ¾ªû×®®$´£ I-}auÅ=k +ékUKíuZõê«^ÃÒX®•.¿UZT+¥ºZ«ûJ©Vž«U[K_étµ×J•kÕzéi*ÒT©WÕR¯_KõªÕ}.•-WÖµÒÔ$’Û]RmuKÒZImRJ©/ýWúZKª®—é$é/¥õZ®ª’û}Rú]R zúA--/„©Wú_­RºK _Ö¸I%öð–¸A7õôµô½/Òú¨Aj©k›¿U½a*J›UZIÿPK××Ö¾”K[Òô«þÚøA=:õ„¤·‚ ЦëÒý¥ýV•ë«ôµõªªë‚0>·^¿J±®©}WÒè/­-Vµë}P‚mz]/éÐ…Ôj’é-i$«KIV´ÚR5—ª®•}]cûõUéW.µÿª®—㤭¥_Õ$©7MKû RË «n]ieŒÿ]ÿKõúPUJÖ¸×ê¶Â  ŠM뮿ZÕV•x#޵úôÒZ ŠþÇêãþ¢ºôqþúû}V–½uAÿ­h"ž‘«Zqõ„PýV¾�iRºë‚8ëK_õ¯ E:þ½R¨(UªT¦T–a?ûèé×éf‚)×õ¾¿©…FÖ©f=~´½%H0¾´³ ik˜J•("�J>ž_®«ÒÌ*T«¥éj•-—ÒÌ,ÑfkK/¨æ˜ZY…J’é*dtú Kùu/ꦤ’éfÓ|ÍVafhÞï]%®¯Z¥¤‘�L,Â^�¥JŒ+KÒUô³ +«ù…¥­Þ‚üÂ1¾•ZZõ®f—muZ]%­U´µÕ{Ö—]zëJ¡'éRMžïª¿VÏzZZë{jª–¿ªéRZZÕV—T’¥T¡-uóëKJª´´½U*ZõyïI –½WKIk ¤ØK®«ð•¥ii6‘ƨ(pÐv–T´©+K[ð±Z_:‡¥¥¥„�«ô¸m¥i:^”TV’ÁÚPqÃ×KKJkUiAö––¬8¤ ´¢¢U¥Ô8¨q jÖ·Ij¢£…ÅX[KÒ¦ LIECÒb&*Ò„Ã]ŠŠ¸¨V“Uup«J'Au”*^)ŠM‡˜‚QP–)=USU*ªºÂTÔ*ÂLBÕ°‚­aB¥¦!1N.%CªaUTBªa¥[M¥H:… ­…¶‚atÓá-†^ÚUUUUU A´”Bk¦½}B¨l&ºds‘Ê«ìL*¨…TÕ5P©¦� +�ºªªTÄ&©„Ä*G†4jš„Å44Âh0•ˆU0†šaU°ša#ÀlµT4–BXá£JˆÔ$Ž#!™[˜eróerH®/ËBØoM� +¨ã¤ Þ“Ô?TµM¤ß†é7×I+î©}Ö—]÷­ÿKZWÝwî´² ¤“וËdž­Ò�ª“ºI´ºm+jr5oI´›IŠa¥dc”:šÝJæÃ Pb¨1PÄQd9ƒ!™œqÿËAJ2¯*òÎ_&¨Ç-§!¡åO&ÀQ•à¦qÙ¬eqÚ×ÃK§_¦ÕçâûùÙ*­s±‰}z;5’ªò5XìM�ªY“úÓ¿4¾´«Ö¿ZÕ5ZÕ}hq¡ê”|q¡¯úëKKôºT”¨YSº,�ÈFõ!ù$’�¬–f¨×Ñ0‰¤HDªR!)VÈ»&‰>MÖ£LöH2ùžr'2‘—Š dæ¤äižÊ �By †ò1¾pÁK³8ñ ÍãBÔ\ÍÇA!Í2:ÈN 3ÌÛ @D/¢–”¤³ ªý/T¨ÚZÒ¬Úý}/„PõÒ¯ÐJ_Ì×™¥0¿AfakE K[Ëþ½fi,ÂS +ª´³¿ÑµÖf¼Íi$’¥™¬ÂèÚüÍV’®f•hªפ³5¥˜Zꪫ˜YšPŽ=#^êaiifazªE÷ªª0³ KQ¥¥×¥úækZ[>«]izÓ~«?¯UXK]V—qéii'ék­k¥®ºªÖ–mWJ«KK]&Ï}ik¥­zTÒUmuÖë]u¥UÒô¯7àŠzZªÕtSëK[9ÚÒV“iiiké*ZN’¶‘»T´¡®ÛJ¢°–––RëW¦ÒVÒÒÒ†ÚPÖKK´ ÛX¥AiiV…6•¥ÒŠÒ‡¥ ´¯‡„�qPÞªÞ–’¥ Wa,%:t¢¡ºV“iCm%ŠŠŠ´ªýs6•q a.¢•„¢­º‡h+ TTTUEWQLUEU¥QÚLR­EE%QP´¶+JÒÒ¦*¡Sh%«KŽÂWæ$±ÅBKbª˜¦6*¢©ª§KÒÓ«IŠª¦˜¥®)Šav•8V+j«jªªº¦*©‘†ª©„ÕUlT*b¢˜®UiU6‚éŠê¢„ÓMSL-„Â…µUTØJ˜…§PØUUL(UL*ªb¨0˜TÂjšaPÕµL&š„ÂM5OMSÓ ¦ „õT5 Šv0˜CQ\Iª1ˆú­*Qÿÿåœfd¥�…çy�šfBHò;>DfD¼›¥çeðSLš`§j2œ�NÒˆÒ&t` ¦q ‘Rö�'zu¿°ºÿºþ¯»M*»¾­*ê¼…ÝVV,ì¼SþBŸUæo&Oÿ�§f»¥¯­uV¶—ZÚÕ¦¢4´4*?¯CC­ b?ýVµþµZ©ȤVŠÎuÈÉ«ÈëäD$õ$Ñt‘ßù ®U¼íüìšònµgÙöu2ññ’#Hû'"�Ëü4�"Ê ¼ˆ˜YȨ792cšrqJã#™´Bðªy” Î9c†ƒÌØ eG‚!0³á”G‰“™³„B(aBfÂ!0³‚/GŒ"ˆ¤ÉŽcƒSÌÑ”eã64gÙã +_7�cÆxÂggΩªhTk%Õ +�d†êrDñꢂ +ª��SÎÂ5Õ…¸#³;P�thhØß £CU¸‚ž‘>t¨ÐÑ z ›UðõTh Ѳ²c¥IµNLz60�F‡A5 6©ª¶“ž˜F¶©­B£�ED šIÔ**)R]6Ó¨T„ Ùs¥ª*0�.’mQâ“ +… h-+ º$w ›UA4 [Þ¨, �—:AµE^ŸEGˆA:T–®!RmQQqJÂN“èïZßiÁ˜JÞŠ�jŽ=)òž–––°‘O”=-&’ûÛå=ZJ°Œ:I´SÒut½+G%¥Jòž‚¥m&éRuÑÇ£�KÞ�QN•¤«E:KE=-]%t´´°’£�ÑÝ$è§¥ÒM ´½'E=lQpE=ÒÒÑÇIia+E=ét´´´´–´´�uÒÿé-!K¨ZV–«ŠZ®–—½ŠJºZ_¥¥¥¤éký%¤)t–•¥ªØé%ZT’¥H*¡Ò´µô´©ER´©,WâÇ]--Kõ⢕b©Râ©$—éU:úJª¸ªã¥ÚUÓ×KW�ZªëIjµ)%ÿŠª®:ã×õ…U׬}W*×^©,tº¥«Ç®©* PI$½it¿Ðé-iZ�URÕkÕ¤´¶:ÿt’ÕW]uCKÖºõZ­qÕãµÒ¥JªµZú×J½kÖõõÃCÕERÒZÃO¥­b¿UUúUI}{]u­:ÖÕiUoAê©Rý}*UÒè%´¬i*¥JªµíiuªTª•Wõô¡/QQUÒ¥Ký*Öªµÿ^—ëºKU¥ªúZKÖ–’×Uú]V—ëôµUõõúþÒUµZJ’^µª¤—K=j½RÖ©zUê•i*UÒúmzÿöéu*úÕ¤•j«Õk¥ôß­t’Z­%ôµÿ^¨%é~¿Â J�×ëÞ—õ¯ÿ]k­U[¥ëëV×X¥ëâýWÒª]zíý*Kë_ªK¯J—ÖG-}]u\_KõZ]~ž•R^«ë¥úõ¥évÒ½*‚Òׄ•/õKþºÒ¶’ÿõ]/ýi-kK# RôÝ%U_ÏkIV´ÚT—iuê½zÿôßúÒôõòÂu¤¥ÕV•uþºÿ¯¥ ŠA=uÿëú¡ý/£_¥üÕ¥QõAô ul%AUKêŠ-RImÐE>¿¤!6µýø"ŸTº×ëT•mý/ëXE>–´’ׯÿªÌÖ’¤G*UÖªµK®aA!} ^–a*ëKézþ¦¥˜^•sØOàŽ:õ£i*ê—0µªó PE:ÿU0Ÿ¯J�RÁzåÿS õ0½U*Ò¯ÒS ¤…j¿ô«F’J£U˜Xé$µKY…Ff´”¿FÖ_zªRéÕRU/ú©:.ŒzY…™§­-s=t•Vµ£®f´³ +�¥0›®“#úJ¦–Š¥¤•)~�­^ºZ6ž´³ 3õS +ÌÕ -fþaYšªS —ÿ]-(y}UoKKJ•W]tºÂUV—¤�iiUiuV�u¥¥®–½izUT«ZUVºë¥¥¥\$ókô´´´–´°½a*KJ´°–ºZ¶—ZZøIuê•uU¤ºUKZZMªUJ+^±é´µ‡uªé_¥¥ÕAý´�m¤ê…U6•ZPzZZPn–AÇI`úO¨xT„¡éu*+Ib´�,,V•% ´³Ê+AÃU‡iUAÐ¥XqÅCŠêâ’T´¡¦6”U\'ATStÅ\&ÐKPÛªŠ¨­JbJ)b«­$*­(®:ZMÖšÓ©Š¨«ª„éRQV‚b�LR˜’¨«U°ÿbµ­UT*‡KPê­˜J¶)…U¶—V•u­UÅSTÓi5PmST˜K 5LS +SuMEa:ªáS]VÚ j�([ +®5Pê©…õ¦©¦ªÚE@m5ši…UTÄ!¦)ª Âða0©¦aP´CUDrB +©„ÕU2JaR.ØÓL&©¨U +hjƒ ¦BÝ0ž… lFš©dXψH6"‹€¦°Šël®ˆfhscIµ ãŠMúA¾ÚOJ¡×IºO¿[Òïßmë}ýRú÷W«Kîµ~ÚMé«tšm¥a¤Ú@˜M†�&a¥bƒ" +0¦þD^e†Eh,‰x3›yM±QÿùkT‰²Â&ÇRцW̃�"e\ìtc2¯Ý‚™4‚…� S°¨ªèö*ßÚõM^£�ª[Y§�¹Úó³]®’å”õWútµúõ¤ÕWV”UªÕÚÇZÐÕ-u눯Zõ×Õj¹7K5#™ÖÉÈ‹¢|ŒÍ£Di�Y"%™ŒÑf§•.dèú3#ª7 gõ4Ñ B”Ô�ÃÁæ‰ÎEÄ:žÊto3ÏdâÆ™ôt‹æy윈—Èl�dƒ¢ƒ'Ï"_DY’ üy“Q<ŠxÆi�qHÊ2ƒ!£<†‘ +eð�e Øl'æI†";3Ž@�„\2vmœph!h4A `… Â !¦ÎÂa4É„ÓÓTÓF²>.!z *„Fw„&M0‹Ši¦Zi£Å ‡ #Fw DyP`†"ᦚ@ÂLôyP�½ a0DešV©ýiÕ0˘Mê¡QÞ�iB;Ñ¡„kah*;Ѳ©¤ßh¬hÙeÓJËŸI¤aiQWeÒ©7HîÂ6%TŠáiU&FÊN�tjMª„]Ù:Þ¨¬ÐL"îºM„{…IÓGzƒ/´›Uï÷ 6«¥®Šz;ÐZNŠ–‚t­è-*E=Òm=%t½?ãôTu„• ž•¾‘VÐ^–“¢Ÿ¥A.´‡ÂZZN–—¤Úè'i+E×Ñâ‚ÑOÒ÷E=(M ´SééZ;ÑßW÷è§£Ž©[E=ô•-p‚ÒÒÖ’ÒÑN—KKÒÒÑO½/KT«[ëIÒõkÒ×T�-tSÒÒ¥t°E=ÿJ’i&—¤´qá /IÒÑOWT›KJ´µtµÁõÒþ®’ÕZZZO¥iPÒUZZªT–�úT–’¥¤¿¥J)U Uu^ºÚªãJº]V’UCIuúI%]%¥¤*)¥¨¤’­¥¬J‡t¼Ei´´”URÕÔ1IßÕF(V´”�ˆë¤µCÒª_�Z¨Õ$�Ðëþ>=}iW}«®º bª+_Š*©*Òª¤µ½V*=%K¯÷KŽ—_\ht—ª­qŠÐQT’ÃéRIaÒTºëtªªªýkÒÕ®_ýRéF’ª]%…T¾µZÐÕ.¼+ÒékIXªéu×úªUõikÕ/K¥Òþ°›Jºê¿ýuêÇI(¥_×é}V’KU­$—Z÷B•k¥JÖ´•~ºýU%ét•-$—ÒT•*õÒ µZé~µ®’Û×Ò…¤”$µ¥¤ºI}*Ii.’×îJ«¤ßÕt´p}~½B ]Wé}iBKõI-(Kzõõ×¥UéµÒ ýu¥×\ ©-BZõ­7ëׄÓ¯^«ÿUX‚ÿýiz\UúúÄMª­-}:ý}õÄ%éz¯ªéIé-U‚0z_ÕµézP‚uº]kõýW•W뮿J’Kô•mõôµ«iz…W¥Ñ0:KZ몄¹`©zñIikþ–•qot©k¡é%¯P¿­*­ª^ ~¨*òêõÒÿÖUZ8ëoªªðŠ„PúJµú¡ÿ¯á?ÒÛ¥ÂõOZ]j¿ú××T¿ G×Ð"Ÿ^Ž:ëÝ~–—TKZ®�uú¯J¿Ö§–«ÿýY¯Iþ¥>’íPDt V½zô–ºúê”Ç ”¯ô•TÂë/éi7‚)Ò˜Y…FÖafJ=i)0¼ÂëKÒ_J‹ëÖ‚RÿõFiýu ’1æ×^•i*®ýŠ©…Uõ­is4µ­*ÒZÒ®_ÌÖf´¨Çë¥ô¹šÉïK0©UuU¥ÖÝt«U1½*Kgý-*0«Kè#�KJ«ÌÖ–½YšÌÖafitºP–¹>úZTau™¢#z/¯K˜Z—î’éúÒ÷¯ô´´µ¦×H÷®‚ª¬$µ¥¥]k¥¥Ö”V’UwZZ]^nÒéÒªÒÒôºÐZZëM®½6ÒmU+_KK§ª¾½--&Õ?«­-W÷\RzM­v’ÕEZQUI°’v�`ã±Òm{â�qPâª* ‡¥8v’ÅQ½+IM¤£†± í-(¨¥ÒŠAÚM„­(n•G¤¶’›IGKKIÃX¤éR T¢µt©U(¨KLT|T.¡U„¢•´šª¨Pª¡ºUU×]¤Åi­u +˜ätP©Šj˜¨¦*˜®TéWZiBIÁ&)º¨}UVÐ^ö“U¶—UMuL&×TÖÄ&EBª¯ªM´ ¦)ê¢U˜UµP©…ì(TÓ ª…M=6-Ѝ…O˜LS ê¾¡ŠŠ ! ÂBš -¨C +¡ƒA„ „Âaaà 4Âa°†0…‚j´-0„4"A Â XL!b…„, Ó4 BÖÆ …tZ¬ÈO-é$؈ˆå ªlEGô´’AôƒuI.–’m-ýW¥ï[ô’]$½/Kô•%uùêY É +�Z‰¸½M¨ÝZí$ô¡¤ÚM¥Öpí†GH Á„¡Úph† Â� ÿþY{+—Šãåe.É(ÂŽÉ)”èì´‰nxÉt|�8H‹ÚA½:ON–êé[ïêü²,ßI5_M~iz¢WxõZµZ×RQÇkK×KKýHìì×;-è‘�׬›¥ �dxÎ>Â"Z>ÌóS3�3çÍ#‘93ù9!Þ_Є驙Ǚó:xÌ`ƒÂ¾o=)³'tfÂ!,¹�°H� #]Bzªª¦.j¡:höEÝ B„Mú¦ša"ì—š„ki1Ai5U’'t�-Qß.tqÞ¡QÇʈ{UIµÒÐTËúʆ�5ZHïEEt¡ ›ÒÒi?G†º´2‡õÒÑOKzKÑÇHïAa/tqò‡¥¢žëi}#½-/ãÑÇ¥¥¥TÒô–´¯¤è§TŽý'é +ZZZõãÖ½u¥¥­¥éiu¤’ÒJ¨-¥®–º_õÒª KÅi+é%CÕR¤î©%T«õ k¥Õu­-*¡¡ëJ’ZµUK\j–ÅV¿®’¡ýC¥¥¬1¥¿ªª\t•/á¡ë_Uªÿõ¨ýW˜p•qÿJ*ªIkªªõZª¬%¥ÕV«­P]kþª¯×IcIúé$ºT•u +©ÒUA}z­SõUª¯ôúÒ„—ê«KëKÕ„�}/_KÒªõ¥_I/^¸$–µ×ú®µªU‚ ¥ú­K]/ÒúúZUR3ý}%ZªªÝ(\A6´–½}ý~’Këý`«é%Ú¥õPŠiA,‚ôµZÒôCÒê´¿¥_Ö«ªþ�ÿ¤½h1 ªAƵÕ~¿_Kô—Öª´´µSÌ-jµÌ%0©zSüõúƒ ÒÌ.”ÂZê•Va)…˜_—é,ÂÕz¥³5¤ª´c\ÂT•0¿KAeÿS +ÌÕ�ZJªaf.»>´²ÿ­*®•$½/^½k¯^Õ]* RJ•R®’Õçý-+U®«U^´�ýtºUK Ek¥U„•*t´­+J-TU¥¥ V+ C†ÚQá&•  áÃê턘¨u +*õŠÒ^m&*}EB‡UUP⩎¸Jª«ÅUu +«ª…¥M„¢˜8Zë +º¯„ÕCaB`“⪪¾ÂaPµT•Ò!„ÂiªÚjª„j¨#Û 4Ò<ÂdõM5]K(lF\26")ÎÀáÕ�l$KZ¤ûÕ%­Õÿ^þ•-/~¥–4”ì’ÛJèìD–W¥{iZV('˜i0Ò‡£²A‘6j)©i­!�ÿÿÿÿÿÿÿÿÿÿÿÿÿü·UFFqÝçiQTŽÊY‘TdUÜFFBc2'ât¯ &F  ¡H‰Tìú¨UEDí$™Å�: ­ +Fd +Bgc)’X¤t]“µAõß§õ«JáB6��TÃM=;†„0ÿ­ý÷wuI´›I¶ƒßï{Ó¿Oµþ“º*ûi6°Ü7OõÜ—ó)¯ÇÇÿ2/ã¤ý«í•Ÿ÷Òßÿþ¿ÚOW¶¿×Oÿÿ_×í~ÿé�—�VEÙøÖd2:’�t*8e9�O$ êF™ÄN‰8Î8Œy³)›"LRq”#‡˜# †¬â<Œd@Ï#„{<Œ#1�’ã(Ùh¹Ã!ˆh²€ä˜…3xˆbc‘ ‘PE ˆ*{$„é²: ïû™‹¹A”#¤”™ó: ˆÑ�ËѦˆIšÃ$awdB4Á0�‚3°�a—Â69eÛÖ “á0�fD#`aÃ1ÆxÈÀÑ„<¬=0��£ÃL â668£ðFÇQ„l #d#CøÑñá�ŽNdçFÊ5†�mSL#e :=´k"ñ±•„ü&±ýïV��³8#Xf3Ö�ä$g ÓÐF°ËÇó<&¬3UÒl!h&ðšs;G¶“i1¤Üša¤ÜÆš=´˜zL4˜ Ó ’àšÑYT›‘ÛIÂM¢;rý¤ÛM*L0Éòi&Òt�'IàÎ4˜núN�tmÙ´ƒi0Ùa“I6Ûe¡ÏmßþºOº¤Å+- õTx„{ii1AQ4˜ýe¡6‰{_TØv–´•´–“Âm6Òo¦Õ§ÝëÕ'‚m+]ûioJ—½%i:ZºŒ&Òwô�-m Ò´�÷V’µA;ãkÿ¨Õª´ºOªl6ÒÖ•ÚÂÅn•¾“ýn“Ó­ý«ûZMë×ïÿ¤þ­V׺ßê›ÿ¯ö?­þ–“¤ÛNú­éu¯´þêžßÿÿ^ëû^“Óôû÷ÕºÝÚýxô:÷ý[_Kn·uèkßn6éãÛ¥#…®¾éé¿ýGßÔŽ›ë^7®?Ûþý×~½öžµéô¼¿ë|ü__}[ëööõÿ­GÑ/]èzÄãÇëþ¾­ÿ!T|D9?þ‹Œjßkðïýñÿñýÿûoíÿÿ¯Ë¢ë_õêßõßú_ÿܰ=rÆn‘u®Ø8¿õ¥_è˜××å‰ÿüvé¿á×ÿÿúýÿ÷õýÿ¯×ÿÿomoKÿëýö×ÛUý[aÿÿÿÿUûuÿÿ²+Ø?Ø·ê¿þõû¿ÿÿýµÿÿÿôºtS¿ÿð_ÿ¯ÑÝ×áXa¿ÿÿÿÿÊK×ÿÿ ,/ Ýz_ÿëkþ—þÍ/ÿ(öëÿ×ÿÛ­mt¿ÿñÿÛ_¿_Áàá¿ÿÿÿÿÒvÒÿÿÅ!ß þÝnCŸÿ'�´¿n¿ÿé?þNè/ÿÿý°‚n�'ÿþÒÿÿ÷Kîô¶Ãÿßwÿwè-´ÿÿ¥xo]°‚ôÿ �´í ¿ï^‚ÿô¼~ïþýê†Çî¿¿Â_õpûöÐ_®?ëÿÿÿøK¡¿ÿ½*éúñõÿôºð‚ÿÚúÿúé_¿ÿ]ªM±QþÿúïìToz[þßýï×í½~“ýÿé+«ÒZ ÒÿõÒý?ÿõ_ýU_nÿÛ_¥é¯ïõÿ¦ýº{S~v/¿õûöÚÿÚê«þßIts}uõ_ýU^—·_ÿÿ÷{ï[ktÿíûú¶hŸÉÓí“«ïnºÕÖþöÞ¿l�=zÃ/¶gÿþN´’oÒ´¸ÿÿÿý{t¿_ÿY s?l3é³ëþÖÞ™"}íg×·ª÷V¶Ki°I¸xG§­¥{iZíÃlýi/¶ 6’Ø@Ù檽˜ý†ÒI´®�J–È?ìÚ°ŸúéÈcþÈ;y¦’r'4“YÃUTîEpÛb"ñAªv˜m­¤ßµªjÓ ² a†§a­X¦¶)Š†ÃºmBvÚ �ƒ´ÅÒµMŠm(r8M†!]§š±A4’t›]0‚VÓ‘l3¶©Ü0Ûj·tÐI°›I4ØOiÚjÂ{jh4šªm¥m„®›Ú´ì4�†XM9PÁ:a5 0©¦ ‘ªd]–g ±L+#„AŠ Úa„Pè&Ó¦ÂTö“†AA0Â(u¡ +í6štÂݦïi¦›tQ°h1 +VJ2c•qž’ŒìÕD1 A#Ÿ‡;GeЃepð`„A”8"Ü„P̉`�ˆƒ6ô9çe(¡ÏH¢†QÏ“yî"")=e¤¢p‚!IÄBAÄRzºýxA —õëKª®� —]~½$–‚ëK¯M¥Ói6WM¥mh Q†“i6‚´2~!ƒ! ´!$ …-![ k† -Ž�‚ +@\l7ÿù_DMÆ2ÜÔÌ¢-ÌòÈÂ�ô¡Ù4d<3H)%gk¥0¤™ S"Z)ÚÛ;vbÓ;5aá|&º …4¯úOÞ­;û¿¿wkÔ]úwªÞ¾Â¨[ŠçekÅñjW5û!xªÿ¯ÿ�}uéuÿúå"&:5#Z#êFÑ+9+Ëäʲ Ñ&ZgC)Ë'j|É<Ò F@‹(YÕ™ÄÄiI<äj#YfPe!äˆfuMU#¡FE#3:Oˆ„24gFC"a‘™NYÍdM"]dÆuè„É�I’âdâÑ ç‚ü!a’3*æÐg$Ã4‹˜F€fxF€Ê @Â5†ˆMHIš„]Â<6)ÂH#Ø3V@Ê"Üž\Â5†ˆ/9ž230ƒÖ!:0�a„l�¬aÁ„g“æ#XaÁ„lÁO23 „3ä�a„k “Ìðƒ$ðƒ „xdø@ÏŒñ„gi˜0�f¡à=†Î>ƒd¨Â�œ çÌ"ìŸ ‘BÁþš6��FÆ��êšMªdò ‡A¤›TÐN©Õ4›ôƒh'VÚhRuMh Ú¦“ÓL#CBÂ44ƒo„hi0ÒuH:Aô4ƒ 'IÚ¢8m‡IÒl*£»DnÑ¡«i§M$5Iµm'I´ÓKTÐA¶K:M„!…AäôjÞLó6‚mݤÚNË8dsI†ƒ<„�é&Ñõp©6™ãI¶YrЛKKv•Â#ÀÜ*Nô›eÏ©ó´Kƒm+fCt›K +ºW¢OKIÒvšIwÕÒmPa´0ÛIÔûIj&ÒÕÒtÏ4œ Ï0•»L$´Kšž,(IÕﶺޕ¥é5½^»ëÂk+Ý+Ý+IÒ߯š}.šWï÷KûöÒuö–×þ½¿Å~ŸõûÿÝtµêÒÚûßKpîß«¥ÿTÕuÒ}¡J÷èzÓÆÝ[kÛý¿¯«kõ†¯÷kî‡×Ýoi{Cim­¿÷Dpûî×[Ot–ãõÓ¯M©pŽßõ{ý4—ý>5ÕÚÝ[T7¾½×õ×µ·÷­[ÿß­]w±­ÔuúzþÖšÿqýÔ}Gºß­øïI­Ý§ÝF¿òÜ•e¹#ÑnJ‹êÿ¯–ŸÛúoéºþ¡ÿ«×ÿÿËOún¾òÉýµÿáãÿÿÿËW`ÇõúEŒÞ>ßCÿÇÿýt½‡¯ëúëí«ÿÿÿÿÿ_öþµõÿ°Òÿõöét¸kÿÿ×ûú¯ÿÿÿý¿Øÿÿø^˜ÿÿÿÿÿ¯°×õö×ÿaÿþ¿¤¾¡µÿý½Wÿõ8/ÿÿÿÿ¯ ÿÿÿáþÿÿÿÿÿÿðlcÿaÿ×þÿü�‘ßÞR2÷’ìŽÛaÿÿáÝ0ÿÿÁÿÿÿû¯ƒÿÿÿá¶¡ÿõÿÿÿÿÿp�„߯þÿýþê‚û@°l ŸÿöýB ÿýõÿû¿¿þëÛß÷ÿïKè7÷ýÿÿÿû}øm/ô¿oþ°ßÿéÒ_¥º_ÿÞ“z ÿý,Ýûÿ_Ü;ß´¾ëÛIõØoÿo×ÿÿôþéiû¿ÿ¥û /uÝ/ïýŽ)~ºû_ÿïû¯îþO¿ÿ¯ÿ¥ïõ¾ëÿÿ¿úß¿~úÞÿßßÿªÿý®úûþôÒúëî—ý¶û¿¿ûÛÿzöëÛ¦ÿÍ]ßuÿÿßíÓùΕ~×ÿÎtßÿÿº®ßœõþÿºÿ®¾ÕÙžÙ¢Û3Mû×íµ{im¥î½ºÚÚµ¯ÞÚºÿÿ{f}û­©ûµµöÌýXûÙŸë¯Õßgíz×ÛûlÍ;ëkkíÚÛ/{a+¶VÊËêÚKíž¶Î_]®›i.^m&ÂÈ£‡·IþÃ9[uþšúl0JÈõí¤Ã iõ\´Ø`”ˆ86ËÐÚTû/]¤Ã—ôùÃOäAÃÛ)õ‘\;Û]†©púÒöËîÈþ!CMŠ U±LSƒl$ƒM6*ƒ�v’a´i¶‚A±M ™|'«I4ÓMŠM°‚ ¦i¦šiÛ˜ šm ƒbÓa‚(tÂh Ób ¦!Vši± aÐb¦ƒM4 ÓMØMb¡v‚aa4ØÐi±MpžÂ Ai±LSh.A„ Âib‘¢�mØ0……+,R*Øb*ÙB BØØAˆA„í¶GQŸ<4QÏl"„� (¬£Û•p�tV4x“Á„ÂG¶ŠÆÄ&…ÎÁf-¢"G¶ &A¡åc•mÅ+L#Ô+(ðÑ¡¢±Ê̬m4O¢±ÓV0Âh4ªjx£Ã&`ñG†!šˆQ F4{a…U,¢hDa‚ãìèìbŒˆËy¡Šà¹6êjÁdâ4"#¨þ>ºúªKô’Òø-@¿¡]4ûTšqFŒÎâ"?ÿ–@FUc.#µˆ®+ëL®YV"·Á3½9‘¦e<î‰"_ +â‹?™”•AB;Ô)\<(]ØOOIݦ)íý&½5ÿû¨á¦¿ÝGþîþí;ÓúO»¼DqÎÇóµ5ù’E™ŽdeþA?ýWõ×ÿOÿ®Ÿéë¯ëü®‚%ÆT#£5 ”‘NÍC) èd!g «<Ù”™¡&CJG‰r#Dgšg²}Hë8~H#®Ošfc$"0f¹:lŽƒ@ÈAHÃ$ +UŒÔÌÅÌÔR�‰"C:³1 +ˆ¨# Œz"P‘dÙ�E\Ù‘¡�Ì—flŒ38ê2E]’lˆÍeÊã¤{ #c8)ã?„Â63H¹Â6‡€Â5†g™á0EÀf0Œáá2Œ#@fe<aD$Ía£Y¨,#XeóÑsÖGƒ>ð�aŸ çˆ#c<3Æ�ašI§„Â68gà�Œ¢4khðÍ$Ñ±Ú #c4ÌäѬ3"à3òhÙðÓÖÂ6 B5†Q,høä&B ÖYÌá„F˜ Â62|Á„kh�.ðŽàÍ0�„l¤ôÛÐM“wªM¦� &Õ4gi1¤‘ÛP“#º[&€›A0äÁ¦4-Ãdù3a3‘Ûô “ôÒW ¤h[&z44›e¢“ a œ$ÚMÙ²IµDXi1H ÚL5vY6“²Ð ÈùƒI¹3ÑîM¤DWa� &j“aRo :a4ž\%o OšVÂ¥i¶“…Mºa%Á6˜P›DcÒv•µmÖ‘'JÛ»µw«o´“oKhœ&­Ò¼$“h«®‰=+„JÂÂu¤´Iéi>•¤î­¢O¡m[kÒt­b¢~¥«¤áRúm3Æ—ñíÒß{_têý:ÿúõ /ÒÒ}'¦’÷¯y“î’¦Ý%í{jžþ×c]§·ïMÓíS m-ÕzÒnšÛJÿWÛv¿~÷KÕõéÕï©+iS©+Bèo¤.ïZ_¾û¸¥è}þâ­·¯\kmú¨n=qî­ïÖãè{Zé ŒuèZ_î;«~ô)u»µ¡â¢õõO×xq½w¿¾ÿãÓ¿û�êßý}×¼´º–9ž ý9Á=oÃEŽFO¢úè±ÈÓùc¥õoî¿Õ[ÿkv½/×ðÑeÁú,gE§éÿÿÿ¢j×þ­Þ¿ïMÞ¸¶’&Ÿþ>¿Ãü{–3ÿø¯�}~û×ÿú,e,|}ëì=÷ÿÿû×ý^¿ë÷¿ÿ]î’úÿÿoØïþÝÿÿúÿ­ÿþºúý‡ÿÿÿý½ÿí¯ú8ô¿ÿ´që·_ÿÿáµÿõýuÿÿÿÿÿÿõ×ÿ†ûÿÿÿm"!‘ßö¿�/ÿzýºÿ_÷KýÿÿÃeDÿÿí¥ùÈïÿÿÿÿÿÿüß‚3¿þÿÿÿÝ$ ü6‚ý'ïöÐ_êÚ_ÿûi_Wÿÿømÿÿ¶‚ýÿÿÿÿÝÿÿþð‚ÿønÑÝýÿ÷ý„Kÿé ·Û¯ÿÛÛ¯vÒÿÿëÜ%ÿßðÿAýÿ½_ÿÿÿzO×÷÷Òo¯ïßøP—ý_¯·Ö�ö”6+ÿÒ†Å\oÿ~Úøï¯ôa·Úûwý}Zþÿÿ÷ú^—ïý¾õoßïð£_áGú_uÒýÿý÷ö¯ÿþ¼ò×ßVÿ_u_uõÿíºÿööõ]¿œëIúþý¿ï_ïõöî´öëjÿî¶›'[}û~ëÿ¯}_û}“¯Û¿ºún¿m×ÿÿÿUÿþÙž•Ú¶gûfk[ý�}û ÿÖîÛ>�vCtšÿ?{¥[a-³þ}þÙÿ¶é{¯VÏö“g¯ä0™­°·Ûgöõuí]/ÛºÿöÌý¿^ÿo§tà -è&$šl0_lÛONá°ÓTÛTí†Ã‘|m •½´¶™ߪ¶“´Å;»"ÛV6EËiZv‘\;b“IŠM5m‘GÛ¡°ä_ÈAݶ‚»A6“"å6¹ÒOOOa‚I°ÎK"¸|CÕ´é°i1&ƒ´˜„šlB ¦„¡4Û¦“Ní4Ó¦˜L&Èé$m¥]&žaÃJ¶0�mÂM6 ¤ÛI4Ø…„Ú�ØH0“Nì1I´Ó´Ó +‚l4“Gv‚m*NØ Ã &�§i± +ÃkM“Äš Ž��ƒ>evˆä )Xç¶NΙB+ŠG<îôs²]ˆƒ1¥$=¥Ä!a#ä–B2©dS¦�…+%Dd: š‚ƒA„,¬gXC@΂ªc= Á3 + 42±† h1Aˆ@ÂEc(@Á �R>e\£Ec•lGH0D:HðÚt{sÄ2v·"2œRq˜"Ümrœ9i*úZé>¿_¥Õ×V•uÛJÒá%¥í&Òm!m-†)�²)!Ùší%�L=ƒ6apVU±�ÿËA|·�þMŠ ì;SEº¾WãL$(#» +v 3†_";*#²÷;JˆµäCó³’”v;'ЈÕ' +}“šî«ÿÝê×7ðé?Þ½Ýÿê´‡¯Ô_ÿÕyÝ´Ñ%Mz[ÿU¿!xŽRZ™~"£ä£ñ×$‹þ«êº�úò¾-2ŠÚ#ç|Ž¨ŽˆÄ_ â>¥�PY¸˜#R#¤Èlƒ2ž%@å:™Ôò1’—‘HÕ„v–f¼¤4ò­“�Yjt?$â�Œe:&ˆ�þBiò¸äG²x�‘ò†GDy&w'ò:#ÄŒØÉƒ&2ã82Š L@­¤*vˆ“<F€ô ‘„k —„'žÍY�’ašfÆÖÉóvˆIšÑÁÃ'Í�#tט ƒ»'Í‘!À�„hOX‚à3LÙ"eyÐhk‚p`�dùsÎ "ò!<Л F2ašfpe ó ÁU‘†Bˆ\4D®‘ã1r�‘â$ †GAIÅ£sÒA =U!a¦˜TgYS ¤ØI‘ðL4�&ô�Èj“h&Ý'H2> ´Âi6š¤Þ“h!ÒmB -Bi¤Ú„ÓM4�&ÏÈ&Ô'§¤Ú„Âi6©á¤ ½þšL4i¦Ÿš¦�„|li¦��˜FÀí¦r5‘ù¸hÐó\ši£ØaÈüØÑ­ÒoI´žYÙÒ  Î¤ê‹«�ëþ?ýÃüÿüWÐRÜúX?ÑnI9nPåŸòÜ‘þ‰ŽHÿ–9tÞ¿þ>ÿ�òÇ#˜zÕ¿ëýzI_ý/‡éúÿþ¿îÃô¿ý/ÿ\xãˆÿ�}Ö+ÿÿÿúþ,?ÿÿëÿëúëÿõ†úÿ×ýÿ_ü¸¬?ÿëÿWÓ]¿þ¿ÿõÿýºõÿý$¡ÿÿÿ÷ò…·_š2;Á?ÿý·_ü‡ÿ‚3ÿÿaÿþÿÿÿÁ߆ÿÿýÒÿÿÿ_ÿðG߆?ÿÿÿÂnÚ +ýð�ýÞ ¶‚þð�áÿþOÿˆ¿ÿÿ/ßÃÿþÚ_ÿÿ¶—„{ÿáºXÿõýëèÈé½/¯ÿü;¿ô¾þ¿ÿÒÿè7ÿÿßé?·áÿÿþ!_ßÿí ½/ßÒv +Ãwîýµýÿ×F'}}ýïtm¾¿Þ—÷þ—ÿ½Ûÿûþ—öûÿwýóë÷Û¯úKÿÂ\ �8}ûÿÿê© úúTÝußá/ï_w×÷ÿ×ýNÔ“ýÿýþ«íÞÿÿþ¯÷z÷éz×ÿê7ÛÛ¿zý¿ÿVÛþõu×m¼Óöÿÿ»Õ~ÿ×ÿ¥ÛÛÿöÿÿm¼Óÿm¿ÛÖýÛzß×õõõP–uOlÿ¶g·}¥ýÿêÈ?;õîî®»?7}Hc™Ÿí™¯]³=¾ïÛÿ×ý&ÒoÌîï¾Í~«½™«óŸí™í™÷ögòìÍ}æ‰µÛøeîîÿýXfdêý®ØI†r²þÚZi¶r_NEpÛlÜØYòüŠ8n––ØA6r²ýí°ÂZ°Â§"¸m—Øa&ùpïl/§"§Ú]0ÍÛ $¾^Õ6Á/YÃûl/]'êØJÂ_¶Øl5Óaž˜an¸~È?óÃ˯þÐ9 s iC‚ ˆLSƒ ¤ši†)4ÓM®Ø¦D|-Š‚pÃJ¼Xb˜¦i6Å&ƒb�p¸¦)ƒØ&‚i²+ÓM6 ÓNÒ†“ BA„ؤ ˜b“MÂtà Bb¥„A¦Å!&MŠA¶Å&¡Šbƒh$Ãm¦ÅD(xM4Ó°vØ«JÂ:   pÄ$gdú+aù¦�Vá§£a A„ÂhC’ BÃM24ç¤0HöÉða#ݦ˜A‚-ž=°ÐÊ¶Š¼«pš'ÑYEcˆLŽ §†Höç†ÂG°ÎH÷ 5•g†iÓFŒ#;4à ¦E¢žÚ=粨a#Æ¿*Ø`§‡?Ø]†0˜Ód¯i¬*h-ún¶”›¬îd$ÄDi²m8´á³ \¡™z'14Ÿ +øIÕ¸֫¯¯WékZëõ¿ÒúÒÒÚI6–ØI¸]C#*`Á› +I´¡ˆI‚aˆA�²AÜR\1i-º˜ˆˆÿþWVŽÏž; +Žã+•£$ñ6K‰,DâlU�qÝðP¦¼)/… + +§b’… + +-tôýWÿ¥;-d»ï¾ïîï¿wÝßw÷÷wë�/&^VÿòÝiu“…"¸*ò²¶¾¿ÿëúk~¹‘oýuÿ_õ_õ™"…” "„aÈ¡¢/Í‘(D%ô"üÙÌê<�)Ð�H¤#\h2â”è¡eS£C:Œƒ"œÎƒÊˆÐgAš"[š ì,‰*™ Šs:(3^N;*ÇšS¡¦J"œˆfI™)ÍHæF�HèKœÓÏ" š¢7®OÉÒ£„l &¸Î §„Éà�}ø šA¬<#cÖx¸Ï°�aši„]†uãFÆi ¸§ì#;4�¬ð69 3L&�“\ØÂ.Éá9“¡èg ÃÐGÆíÈžh Ó £d 3M°a��¢Ï¢ȼ_Á„\ G°Í‘ó4Â"¢3@2ˆ¹¢f¶wÂxC†ˆ�Œ€ÊŒÀÎ "(0ÈhÃDK4çoŽú +ÙhM �Q¶Z(ÐÕ'e &ÐAáœ4Gm Þ“i1A¦•ÓTm4“hl*ÐM¡¤Æ“i8MA:L0‚ú¡¤IÒtƒÉ�6š3´�- 'Ai<‘Ól˜ö"7h&ÐN“o„- H6½›Aq 5øM¦Ñ4‘ù…L÷±±W}}-uA_n»ý¥tè'Jô›Zôµ•ô•¢7½k¢OXIZ^.º$ô´·p¨“¤­-]]¥Óm-'“Òi'Kí ¼m&ÕÕÜ:%î_´›Cf!ZO/Ý0¥¡Ÿi6ˆíÏt›P“hadΚþ“ý¥«Nûj£¥«Tï«i;i/†½õ¶ª×Ié¤�U}ºè4·_ºN©þ8õÓ«®íý%ú[kxâøvöÒ¹;éZ^Ûï¶•ÂnÒ×mеÿëÔŽ\?õ‡½‡Úzô›ÿ­ÅHáz�¡­Ç´:ßWq�ÃŒiw}nõ×B––—×·íÇﺶãªïOÿªôþé[‹ï_Çä<Öûÿß¿êßÿÐÿÚ¯¥Žÿ!Òk­Ö¿}û$ü\w_ÇÇúÝnÕÕ×ñ¯ÛiuÆÓõëÓúÿ]_ÿýƒåÕÿ¯_Û_Hz–2߯òÅ>¿.¯ÿ/fXpõÿ¯þÚüºÃ‡ûïþ‹­{ÿè±ÈÕüwÛ~Û¯ÿ®¿þÞ•ÿ¿]/¶¿×ý$¿ÿÿúl6¿ëÿ®¿_°Øþ­þ¿·_ãÿ×þ¿×ýÿý‡ëÿÿ¶­¯ý{k®Úáÿÿü6Þ¾ºÿëþ»ì6ÿÿÿúÿþ¿ý]'ŸÿÿðßÿÿûitAïúÿY<û¥aÿÿÿùÚÆÓ`ÞÏÿ4dw÷æl½�í×á°ßÿÿÿ÷_ÿ‚0ÿÿuþ‚ÿÿp~ïþÿݤûoýtŸn_ÿÿþ¸6Az ÿô _¯áÃÿÿÿþëÿøAÿ×ô¾ïÿýßÿõ¤ �/ñ½ºÐ_‹¥ýýßÿ¥»xK÷Ð_×¥á/z× †ÿÿ¯»ÿ¯ÿÐ_í¯õ÷ÿ÷Û¿þ¶õK݇÷ªè+K÷ýÿûKw×ÿ_¾ô¿ønÿþÚþÿ°ÿ¿×ÿø¯ê½ÿÿç=wÿm~’}{Ûß_ ëÿ·ÿï瓚÷ëûÕwßýë5'ÿ®¿ßúÿ×úþ¶¾»m¯ÿÿ·ï[¬=}¿ÿûl�/í¯·ßö«ýzû÷wëzï«kE?VºêõÝ߯ýÿûköþý;0›=ݯÙ�Öé³i³ûö»iHa —[g¦˜g¯õ0¶CÂVÇwÝ홫ïöÏ÷v•­ßí§~Þßwýý6µ_í+JÒöÌÓktÕûë½ØÓ† ±±±Ý§š§¥"ø¦A-¦ša´m¤ÛL3›±I´œ0Á¦Ûƶƛ!æ Od í4ئv“iH¸Óc†Á¦ÈAÛ6‰a°äD+ 0Â]7M‘Âii6—eöVÂz]—ÓÛ9kÈ£‡¶’Þc{%tÝØLdpTÓi;Mƒ&0´ÓM°’m ¯¦“a4H=7h'l*i0˜dWA0Ðaì*M6·°Jéªp©²8´Ò … ‘Çi­Ø^“ÃI‘ޤw´ ƒiÅ1à ;šlPA¦œ'ÛJlUJéÚÂ"HD£³6!ƒGG ¨ì¿”ˆF|£žd:"<Š"„" Ä dô‚ aŒöÁ¡ˆƒ0„0ªˆæ &F¡†˜TG*#�bÑa2f +± +˜SÆU¶�wm5†(&­rÑ9èF„E'Ë"ÂÎÂá£!´d­ˆˆôµU}^½Uu×õûIWK_×^—ÝÿVÒ33*Í´°KðK[ì‡�Õ{µARÐi£´4L é."#)–…sF†�m¤H �†ÿþZ€™_G-£ØTÌ•b"2[ŽÅ#²Ó;ºdi•2¹Q’\¡‘f¦–ªDAÚ’¯û uh%ßö“[ûî�¥Öþ£†åqD#–å+ÎÈH.¿¤�‡]NÄ¿´±Ê®I¤öëªú¯ªþ»rº}3¡ñÕ�B"ù20΄C2C&#[ÍydQšˆŒÍdKY2$ìÔk’lèÍH��ªät¥C#f¦¼ª$¼«J¾«·+šæ˜@äIšÃ4Ð0�f¡ì‹Äø¸ �a$f #@0�Â5†ì0F³ <h4Áð  0‹³Ðö #Xdùs3@�Â4lSÆÐ "eÃ4Ì àÑ Ó”3x#Ø3HXg`· •›Ù EÚ"RGÉѲ +Ó ¤Ú¦ ÃI°í �á6ša?Mi:M¤-ôðƒH'ѱ¦˜Mz×i�ŽEÀV� *hÙF².ØF†=2yÁ£ãF°h<#cÙðÎ7öÂ6åÛ4 ÑíÕy³!6§Í]v’mö®­„�&յ¢\Õ­OšêÒM¦xÒl"1ê—OT®Ì„Úgˆá²Ñ3i6®“i0Ùb.ô“²Ð›3„y¤ë„¶M²Ð› T™tè‹mé4†“¢, áªN“¤e¨&„ÃIÒm¦­ éZ †šaì$õ¯[ßþݵt­]ozº}].µéÒé¥IÔ_Çî©ßo¼{WÒÔt®_ ’½+餸+]ZD¢ºôꓨ¥né:ZïN´“iZŸ6÷½?eÄúC§qVècíé×Ãõ«Å¿„ÚQ¾½UÚÿUÓZ¾þõÝõý%õÛK_tž·wn½'µoûIÒ¼Vÿõ¿¡ü7mUíªÕaÛ½½~»¡ïVÚÃÐýÿC††¿m¥u½ûéGÆÚ\-õ×j¶›ÝÔzý&×­ºî5#…wÿ-?‡ü±{ëԺÇÿþ?ËOå§ëáòÓÿùu‡/j©¾ÃÑc�ÌÃÿI�<… V>õþ>ÿðÕ¿úÇÕí(ÿ‡ÿý‡éí®Ãaýõÿ×é~Ãm&ÿþÃÿaÝ0üGö~´:,ÿ_õÿÒaÿ®ºßÁ˨±Ÿaÿÿaíÿÿì6í¯êÚÿþÃöÿþÃרn¬?ý‡üø_öëÿþþÿº[ü?ÿ¸oÿÿðØo÷¯È#¾¿ÿ ôÿÿÃᾃøoûý½õÁü7ÿÿþÃÿÛÿþm/þ¼8oöÐ_ [h/ïðÛjÿÿþmCøoù�ÿx#Gý´°�ÿ ÿÿš{u†ÿðßÿðß×ÿÞüŒ·élŒÿÿÐoÿ_Ã{ø~ƒ÷ø{ýïµÒÿÛAi?ÿ†ÿÿÒ},?þ ÿï߇}n¯nÿÊSúèÚ¿·a¿¿ÛÝÖì7ÿßý¿Ñáé~ßC„¿þÃÿëxK±Pß¿ÿóŸ»ëÝ_˜OøOô´¿¿È¢|ÓÿýýwÉÓïû¿öû¥z_ú^½~ÿ^Þþ­ïïÿoúûëum³§Kþ¿ê­û~ÚÿÛ¯¶töÛ¬Œý{¿Ï}þÝ÷·zý믯ötݵþ¯_£Z}¿Ï'ýÛgýzÚlϵÿ·_²3ýìƒû3_gÿmºi´¶ÌÿÏß¶gé6f�~šn¶ÿÿöÛ3öÒoM}¾B£÷_¶Ý={jÿ¾´ßýôÕdN /Úû ¹è$ÛI³“an­$ÓØzéÈ®m˜=[ i°Îv—Õ—Øa.ÖÛ//a+« +Ú]¥ÚV^a›½nŸ¿l-—˜fåóÝêÚ²îÂz]ퟵmWzµÂ(y~–Õ³ó þ¿Õ4m1 4Øt¦!i& )ˆLVM0�è4Ó‚íˆI¦¤lv•CIŠb“ §± ˜b˜i!6‚Aé=¤Ä&)5AÚMÚa8lBb˜¤íŠb¡¦›iØ7iZ«i6‚M‘}¤Ç X®®˜a&%ªÚYí™È÷a Œ#ñXGçȃ +!J¶„ 0˜0bˆqœ�nzjV4WvÐ4EŒ0‘í“á…<H�‚b¶F@A‚G‡*æ“m#\#ã #Ô Å"¹±I1M=´T²(8#C·Ï Ò &a6©®Ù+ØMß# JÓ†LM¤œ&ÂA’»Ó¤ÚLB BNÐv”·!ÐŒÒ&¤æF»�¡Žv-ˆ�Râð`„DDn Eq´PÄFB5â"A…+¢‚ˆÕ'P a"¸«+2­ƒÅ]'¡lD+åpM"oa¾ºÖ»Òý-V•µýúº¥ ÃÒÔ%ÛI´�h+· Ҧȃ„Á‚ D(ÚVW(40â…T +Zñ£CªX+©q°ßÿ墸³'“b¤W$Gfj[×"q–‘]. +E³b‚fF¦‹µ‚#p;þøƒóîx�”4{÷ïvNvŸIôŸ_U»þ£¨É¾¾iˆ�æJkÚÝ/þ7“Oºúë×+ã4�)´c%ŒÌBtl� R„p‘dUh#¨�¨F‚-g"ˆ‚ÄÔÉêDÔŠœ±B~L22ô"¨+ †Uš„iÈÈ" Ž„i †Kjdh#¡AH%¡!ù2!&E �‘ÒS©‡‘‡�Ì�µ5d³ÎÉúÌ�$Â64]“Âs'CLÎѱ¦˜A£`i„ÕØF°Â43M2L#`hÖÎ':‘™œPƒFÆ�a“éšã<&G†�a—‘±… ¨MÃÖFÆñ£Û3Œàš=†cÐÂ5´{fÈùša¬0�œÍ#@eA„»ÐŒö`Â5°@‹´BLÖÉóA™™šh#XÁ ¡0�Ñ ç€dù²!�HŒÙ"‚¢AgÂz‘C"§!àè#nt4› îꆓalÑî“hŽÛ-:M¥„E††“i;¾ËDXhŠí&ÐM¡¨DXh¬a&Òb’a¢+´ð‚a ›Iµp“¨TxaXÒt�'wMRm'ÕCI°“j“ &ô˜i¯¨Mè&Ò}[Pš7Lå „#HlFƘM˜EØgèѬŠV–øI½.m¥h'Ö’tžrqJéÿu‚t6“jÚ$è% ‡úÒZ +l.•ÓL$­'W}C¥i~­¢OK¦‡JÒÙhZ‡ápÂéXLŽjì³­ÛK +g &’nM"y†‚mY&îÂ^¿v˜Koëµ¾):ôû^˜ïï¶í­¤Ý4õM¥¤ënÛ´“Ó^˜¨û¯ö*;î–¯j•Ó¥¯ºZ^•ïôôépšQÕÐN“ôõI6Ö0N®“®êö†5ýècÚãßµßhTŽÿÚÚzuÜ]¯¯ãiÜVÒ>ÝýëÿqR8ZãVÜküPëÔŽ×iÒ½7­§]ÚÕ÷ý½zþ«¢ 5þèðOðèùÃÿín›ýñý?º­xwïãÇÿ¯/µãÖÔ±ãüoïú‘Â÷Öý~þ•÷N†�¿¨ùuùiþ‹økþ�°ÿÿßÿÿÿõoE§ ‡ÿðØã^ëþ>£ÿ¯Í¦?¯ÿÿnXà—ô¿ÿÿÿì=áÿÿû¯ÿýÿÃaÿª°áþ—þÿ~—×ÿZC°õÿÿÕ¾ãÿÿÿÿÿÛÂ(øaÿÿÿÿú¶¿ÿá¶ý+a‡õ¯¿ázð¿ÿÿ°õÿÿ_Ø~—ÿÿÿÿÿðAþÿÿÿÿäó¶—ÿøl7ûi‚²ì6ÿüg¶¾±ÿÿÿ†ðFÿûuøoÿÿÿÿÿþÕÿ¶ÿÿÿÿýº ÿû ‡ü6’ ÃýÝÿè,6‚íÿÿ}á¼ Ÿýßm/°oÿÿÝÿ÷ï½¥ÿ‡ÿÿõoÿÂ^?ï^7ú ’ÇÿëKƒôßÿþKÿýŠê›ûÿþÿÿûþú_îÿÿôþ—ÿé_]­îÿ …-ßéÿmuÑ«n¿ÿþûéëóŠ×ÿÿÛ¾ÿoÖÿ4ݽ³¯ÿÿ­Óÿúé>¿¶ÙÕf?õó‹6¿îÿ­p—kí×ý÷¿¯ßøJûúnÿ¾Ûÿ÷ûf‹ý&×ý¿×ÿéÖëÿÖï­ºÛ¿¯ï__]¶ý×ÿoÿ¿ÛÛÊ?_ÛÿW¬“ß]¿Ûözaí÷¶{þÒ^ÌwMØOí³Þ“wÙµý¥i6—ü†9™«JÝ&õgþ®½YÙKí.›îÏî™ç·^¬ƒþÏÚ홫ÿ~ϯ¯_^AÌ4¾®›'WýÐaŠ`Áù;TØ¥M6CóN)µd>`–Óc´£¹¶šéÐM¥jš|0Ãm�â)+i0`¡Š´´•m¶êÒ‹V% .›i,ŠáÚ¶‘\6Eà«f+Tá‚m„ûI²ôC¾ý°Û^ÒÒllÿûgÕ6ŽÁRi†®ì5iµ ˜TÕªl& &Já6“N쎂M¤4‚i¦šoØj ÙH1L(¦)4Ö÷‘GL4™PaˆAƒ0ð›i ám Ã¡tÅ Ø… Ó ŠéˆH=(…%p˜A†Et�„Û ¤›iZLPb­4Øâ#��¡!”! �¨C + ƒ�ˆC*¨ˆŒ£Æ�)] D `�•ª¥P¢ + çb â a ¬` DO QÖ ÂG£3ƒÂ˜@Á"²Ô)ï*í0ƒ +xlSM4Œù�µZóÈA8¨¦!xkˆˆŽ""!^ŒŠ7&Æpr¸Z;2ÉÌD)¬!þúéb®8ý®’ÿé}u×þiZW_Û ]¥iip©†)C!MìS %tAƒ`ÁbÙg*Ep�ˆ0Pâ"?ÿ-ÜË<ê(yoñØÈìDe�^2X¡'ð¦‘3‘â[‡Œ”ž&pR_;,ɱ:“ÿÚOª¯¦˜Z�¿J;¿¿¿ý¦¿wú;_ÿ&X¤#“<ì¯ÅJç]_Uõy\ty�YRޱ+gVI¢Ei 1§‹²|ÀɲÊ�ƒ3(sš VF ÐG ,�“£m&Lsx.eA >`gFGdâ™b03„H eFl�!'Œ <¨œTB"{&AY “fT Œ gAS$È—ˆ#dH Š}2*"2#3Z0ˆÚèCI´×„ÃMP°Œ;I¼&“i6“ oM&ÒÃn“i6‚Òm4óH$Ú5»T˜a4Õ4ÚièüÕ0©„Ñ­ªam;%‚ªhרGÆœ&�duÚ¦ äò5†£ŸÑ±¤høü Éà�l#[ØÂ5´BLç5†HÂDaQ˜0�l#[]³H h„óÙ“‚/àÃ4‚¬Ç<èŽøD½¥jì³ÛWDü0ÚXLñ¤é6“aG0™sJÒÝ Òm-,)â�©6–Ë:I´ÃAœ0“aN‰†Ðgq¥„E¶“h&ÕÛÖÒµiQ´œ%¢+†¨«Tƒ¤Ü™é0Â"Ý'“=�Rt�&A¶Y˜aB40�˜$Õ&N‚mQÝé8H2^jšMªi7Ý´¯}&ÕýÕ÷Iý^𦒵ýuý]ÃmõIÕõIºzoä¡5¼”*iµá:N¶°˜…iuK Ö·‚ âÞ©in©<&Ô_Zzt´¼*MÄ'AÕÒºÒ´l³Þ©[Aœ0“a 'í:‘õÇ]ÅÚëkHSN­¡q^¿¡ÓK¯ÿu÷WkiÕ6‡JÚºÚÖ•_§õwÝ'KßIÿûkÿÓǵwÒzootµéßt®�y(Iâ6ºm¯v½Õ ]ø×õC^¶›i½ê½ê÷ÛCý½ß¯zݯ¯ö¿­Ûv÷Q¯t›ÞýßÐèwíðÓâ‡j­~–»^›BºöÑ4ýñWùdÕú'Rþ¥ÕÇßQýùnIwüwÕûZï�ïþ==?ãî¿Ãÿ‡_^¾Ú–>ã߇ñî†ð¯ý~ÿÿ×ÿ_ê•kÿúþÿÞ?_ÿü¹ÿÿýþ¿ÿ‡þÃa¢ëý7ûê0Ñc?~‹ã–,r4Gÿÿëëÿëÿúÿþ¿ÿ¿ÿþ¿ÿë¯Þ’ÿú¯ïì?øpô·_ÿ¦þñǯÿÿø#ÿÿÿÿÁÿàŒ?ÿÿÿÿaëÿø+uûtÃíÿð_ÿ ÿ†Ãÿÿíÿ†uÿ…ÿÿÿ„ ûÿÿþïÿþOÿÿÿÿ„ÿÿ„hº_M¤“ÿþ�ÿ ÿ†Ãÿÿàßûº_êýþ¿é÷ýß÷ú_ÿé}ÿõýÿéßú[a/ÛIÿý„¿ÿ ÿ†Ã}ëÿý†ÿÁ¶Òÿp�×ïÿ¯ï}~ÿïê½uö—Ö¿­ÿÿ¥¯ÿéxÿBõÿÒÿ_ðáïöÿÿ{ü7¿ô¿«uþ¿ÞëíßíÝëëÿëíÿÿ½¯öÿéaöÖªëÝo÷ÿwß}/ëwÿpÊÑýé¯ÝÿÛnÿß÷mÿëKÛ_Ý/鿵ÿÿnÿõ_¥_]~ÿúóÉÿÎ,†¶ïßý{:§oü†ÝÿK]« ÿ}×ëªí¶t—lÍ_ðìÏoÖÖ×Û×»¯ÒlÏ]ëÿ_m³4ÿ¾AöC×[®½½}ÒõKþûöþëúÛ¿üÓ®ý¿_ ›–ÛI=>EpôØfæVêöVÁXeëläØ% r+‡¥¥¦Ã9ȃ†Ù{tµ´¬%¦ÚIëȃ‡¦Ùé°©úø Ø=nÂ!n–’ì3Ö1Ûk÷G¯þ´˜gÓfjÕÒû^Ïý6g¯ þÌõÛ3Õ;ö“˜L6’iÚ „é¦Å1 °‚MÅ2 ö!aŠ B Šê ­©±LÄ ˜a¤šv R ÚI¦ƒN MX„Åa4§%vÂi¦ÜŽ¥ii±R8 �6ÒM6ÖÙ)­¥tÆÃ‘y¶’~‚M°[I† ZvG®˜l0–¶¹pýÈ#¯+¡ˆGYÅS+0‘í“ÀÁb+=°`�„-A`ƒZj!D$xUÁ…TÔ«lR=²~ ƒ<4h²4Ú=¹WžMOÃA…Ú„íª�Úv�´ÔTPAØaB¦± +ÓŠØA4ÓŠŠ Å0“a¤˜NÒL1 +LRi± ´›b „› ¤ôY)M!bÍÓ¢stDeØRìÙi”è¡â" Ð0�” ¢¹†x’ÊU°Á()Vå]¦F0ô†§¼ñaOm„óÃÿ¤ëãB""årˆÈ rl¨ÿ­$ÿêÿÿëÒ×ÿõi}}í&Òïô©¦žÃ+ j;iSM0ƒ ˆ +!ÓMƒ# K=°‹†pÑpɸŒSM0ÄAH5Æ?þMÑÊõäÊ# ¦BQ‘xë¢2ˆ´eu¤vSÌ’Á@UH), +kˆB’ÝNÆó*³±)^¦DŒ)Ù]¯ðDx]U=;º\$?—÷ÝÚ ?iÃÿûÓ½-÷ú ï¾ïûîÿïÎĶV?Ç,£B'÷Ž>¿¶¿ë®A¯;¼«_;zÿúë§ê¿$D +H“‡!™˜Ê4!2p΃( dflŽƒ$Hf.ä¸Â!&E§6D�” ŒN2�Ir" è) ”Ö20R�MQ.2��¬£f|΄C26΄Fˆ†dF e¶¤3)šËS©TOš™RD|§Zä·%^R%OèØ44n£dÏÂ6��Šçá°0�l#`jØ60�Ô|ög£AÏôh~ÐÂ>0����£ã3Ñì‹Ç†±„l£ÃGÆ�lÓLô­„kgeš„ÓÎÂ4c?šac„GŒaÖbÁ¸jƒD'žÌ\Τ4k¢f°Éу?‚0F€e;3Á2yœ‚Ç)è„ÉÂ$#f)œiœ2ˆˆœ‰Ó†C¤ÚM¥„„4›IµvYÈî“iI´Gm&Òm'I½Â„ƒ…e /¹í¤ÚN“¤Ú¸P®M œ$ÚN“hj�m'Pˆ®Â<0‚m&5 +A M¤ÃMÚ ´jƒÒt›T Õ&ÓM4Âi=Á£e& …P��ƒd¦k#æhØÌÌÌípš6>“ii?ÉÅ+]G‚m/¤®¥¥¥¯ëP—Wñµ×IÒ´µI…ÚVºë¥hœU+Ü,&ú´õi'IµØWI´Âežéh3†–hM„F=3ƒ8éÜ:N“i;,àÎ4Òa¸tŸGºL7äÁ“9´˜]'Å{õ¼mS[^Ç·_ÒýëűÿIëÅ/kUQé¦ÒÒk«§WV÷IÖá>¢—N®épš¦›Q­~i:M¾­bÚNîíAZ_[®µß#…ïÞ;R8V¸ã¯ÿmúúëºÐ÷÷Ð×®ÐÜ] ·këíúô5¿C·þ×_¦âõßÚ­?î+ý~·ÿº§ëzéd¨?Ñ@â ÑnJd=Ù…hÿ‚¤Ý¶ëdýŸí÷MŸïlÿußë!�ü†6×VÌÓfkJúÕ{»³ÿûui·M™í¯ûi|‡?uµïîm ¡°Ø¦4ÃÚ¶¬‹m0Ä&Òb‚i±LS­¦M´ã†`Õ;†v“a$Øj›ÅCaÚLRjÅi&©ò+†Úi톹Ò]† +ô™R+‡¦ÃËÍ„½{JÂ(~•¤ÝÙ{[t›Ø;VÒ¾ó Û=UƒJ¨2P™$ØQLBavŠaZ†`ƒ%a0 Єž› §´Âµ± ‘ÀL&!ðša„&�°I„�°˜a$ÓPœ/NÓmŠ 4¦Å1 +ÂL&Ò… Ó Šö!)š ;IƒAŠcbvm);m4ÛA2vÁÆšlBˆ9ÚT÷¨##V¨…ìîˆDCDCԑ΄DD„S©]) b¥ "¸ÏG=Í4W‡¤&!ð�Œ aD1MG>@…¦<4hr¯*ÛiŠaNÂjÂÛ˜*µ¶Á& +ši; DDGœDE'&Á{ˆˆŠN"4"2Û˜dj„QHˆ‹v5ƒ)¾”®°‚º¸â!\Dk¤½RÿêêêÒé×¥¤é~—¥Òm& ´•´�«§Å1VÚRÏÌfÆdÔÉJÛ! Å„Des +"?ÿ+“#!¬î2mC2-ªHGc0 ¦J¬‡©Jp�š~´çj­}ï¤ûõ}÷Q­øŽþdPŸ¯äÒ×ÿú¯ÊðJEYöugS#LêyÆtdh”‰£6@ÆKƳ53¡Q ˆêdh²6u2-'œ�DBH22¡Ã�šg€Ða.Â4c?™á¸ Ç„G€f‘sÙ6Ï#83LÁ„l`�`‹€`�Â6p�lŸ0`�rÍa’2ä�a¢Ïa’3hGÌì#XdÆ�¢!­„k‚.:Ðgj¹±”Pdù²:D|�”eΓM=4g„hi6“¦� &=ÚM¡i;%ˆ4“¦©6“p›I´¯I†š¤Þ“ tŸ 0ÕCººM�Za?F¤Ã'„ÃH6ši6˜A¤-„–“nE†ÚZL ©·L,mtIÒ[½$á]+IÂN“i7¥jél³¦Â Žjìº& Ž{¤é6©žl³Ä6•¥«aè3d–ñ%htŸ_Ò×Òu÷IéÒ÷×wíutš[´½Òýºun�üWêßÒÕÒmxAµw ¥rq÷‡wz÷pú_ûŠ»·UЩ-t) z‘ÂãúNÐú[C÷ïî«Z] ½{¯�/~±ÿß÷¯ÔwCU?ö‡û{Õ·ûWkÿ#…_m{­«Èá_·ÿÿÿúþß_,O^:�ëìÿÖOÿ¨Ö½n>ü’ÿÿ_Ûÿ×ÓUõZúÿ~ÿ°ÿÿ¯Ý}}!ÿÿ¯_õëûo_úÿ¯û~ÿ°ÿÿÿ󨾿ÿÿÉÙ¶¿¶—‚0ÿðŽíI òÿׂ0ÿðßÿ†ÿ÷ÿÿ܇ÿÿýP,6‚ýÒð‚ÿm/ +þ~ÿÂÿƒþÿûÿÇÐ_þÿý//ì ½÷ûi%ú ¿»Òýwõü7ÿ­÷ë~¿×þºCü!õ÷ب¤¾×w½õ÷ðÿþ÷ÿïÿê—ÿuÿuÂ_…õÿ§×mVíû×î¿n¿ÿîöé¾µé¿uÿÿÿÿ¶¾¿ûmÞßû®Qû¯yÏoÿ÷Ý}W×î—ÿ« ÿöAõú÷½]ퟵm¶ÏýŸï^ëëºôí&Ïÿß¶f®î›4]ktÙ§f}´•=4äW »ÓµYöEOÚl0”Šá°ÍÌ3s *¶YÃd^¤�¥ºI¶ Óa->D¾Ã +Ãt˜at¤WI† iØi Ô&šl.Ô&›h4ØN›f'¦�6!0�Šb˜„˜b�l.ƒ $›ia„“`ͶLPM4ØH4Ã3 0Ò U„˜]„˜„áƒ)ò1 ¬”b(çhªÊEùDÊ.|ƒGy�Y,f¦ $W0`¥ch0ƒ1ë*V0įi„ÈõƒHøÑXÚ(ÑXÃÓ10¢ +šˆ žRܪqIË~E¸’HDR+„b35«K\DGý/þºý¤Ú_m+ }Š Œt©Á“Sh4E䦈�ÿå ª…÷òÜW+”ù(ëÿ]fIyB# ñÆPŽD!r|H24„Ã$A„Z‰ù0ÈÓ“¡¹?&géÄn4DF=“òt;´Ñð4Â:á˜F†¡0�£Xf4lfpL&�a™Á5:è0ƒG†¡´­ÝÜ",4{a&Ñ-9(öÒl fÍ'IŠA6ˆí£Û&Ñ,aQY 6‡°’m–Âà˜zÚïõ鴵¥¸PþÐ't ¿DŸ ’oÿMûÿO]:ôêžÓk¿×¥Ó]-ÿC§Ýúß­xßÐÚ}ÚëqÒ�ý?,pOÿ�¸þ‹Œéÿÿqý$XáýGÿÿÿå§ÿÿ„±ÿýúúõþ—ÿüiÿÿð_Û_ÿÿ׿ÿÿÿ£?Í-ºÿÿüŸ~[»ÿýÿú ô�áßÿ¤ÿ{ÿÿÿÂ_¥Ðÿÿþýßÿíÿúþ–·ûÿ¯·kÿÿÿÿUKÿÿõþÿkûÿ¯ý·ûÿþÛ~îý³úöa¹u­„ä1Ìý®Ùÿï×ý¶ÏíšVBTÕŠM8Õ4áÃ[a˜&Ø„�«šr.”î×b¤\Ø->ØV›I§´Õ§M[I­°“¶M5k Ü6˜\FVI"•\’!é'RŠOT¬¡ec*òˆFMÂn@bÈn¯_ ¿m …†@Ë£�þZê¢Öó®AðL®¦,‰ +œáÐè*y¼œÔ·&ÂùÝ0‚Ì�Ò_+‹äs8eð¥½l*eñÙˆ%�•_KЈÒ"\VP¤U„x�”°ªv• ©tª«/ õõpúOý¥éáVÿúŽþñÆ–øi­ÚëzREN)é†ÎÍQPÕ#\w§÷Ä|T„Ȧ>T�Ð"ì2AŸ"á„Hpσ„ “vhÂ#¨V2vyŸ3æf4Ef +?Ò¯ªI:¦vѰ0F|ãÛ¼ASEçF°Õ0¡4Â3¿žÉ3!YÑDA‘TJÑÈh��?Ô§ò¡i¨A0Õè'IÆ�“:m¢‡£Ä ´‚Nª’¸ôª«õj½*ýPé +¯­úÞÚzÝãÚv¶ÿKCº÷wCÿÒ¶ž¾›õ#…ãQÜW­ÔzXt–’K·IC¤—UBºŠ¦þüØý¢Ü§2;zíÓü¸'@Çïå¹#ÿÿÇ×Þ ´Xät_M¿Õ.’é%ëikÕ%H*±¥¿ü?]ñúõס†»þ?¾­úÿ豜Wÿõþ¿.¶Õa*®¡-RÛÿ†ýÿþ¿Vÿ¯ÿÿûÿÿ¯ÿ×ÒYi-=WZñUTßý¿aÿÿûkþïÿÿÿðGÿÿÿÿúJº^­¨UÒ¥„¾¯ÿü Oÿÿÿö ‚ ÿÿÿðA?ÿÿÿÿýW&3[|¡Õ.õ&"’Tßü?¯÷ÿ{¥þõÿÿ¯××ÿßþÿýšý*ý%«¤¾°E?ÿVÿïÒK×õüW{¸KëÛý÷_ ~¿÷{ßý½z©µýgªY´—I~•%ÿÿUõ]ëß·×_ÿûÿ]¿Ûÿô¿õÒér…”-%S ô•t�ê’Fô²…¯F÷ÿœþ¿«úíZïléëõíþ»×¯õþÛz¿ûmýV–­ªKI ýi*ë]éUj‘vÿ_íuÕ³?µÞµmo­uûïû_×m}¾ÌÓw·_¶ÚºJ©6•¥Öë i.ÂZö]-/ÚzwZR+‡h&It“m'ÛM³’k"i{g$óa;l¼ÚWØGp{¥«gµmlÿ˜]¥ßg÷I´ª*ÂNÒŠ¾ÒФ6ÒB•Ö—Òº„ÓM;JÐP½&) “m*MŒ1 ºa= �i±VÅ28ÅAÕŠ¤Ãp–Ø«bƒƃ ¤U m®’ÓÅ*P›A1 .B­Šê¢›J�”VIãL21‚MD žTöÃ$6xl•„ÂdZÂåX„�VÃ'MS +*áÓÜR &A0 *¶JÓ†Á0`�a¢´TÁ0 ÁLU5TÔ"\;_M‚RÝ.›nfŽ�h¨B A1‹  Â–â0š„,*©xÚLWòÒ2Ô4 ÿ¯ÿõÿTÓO ÓMsÅ5¾""� âœü›¼d©)ä ++�‘¦F‘Ú|ïÄ +L³´š…S´ù +ABôëM=tÓž?ÃOûþ“új·§ßÔ^#“¬È¡o�’¡þºþ¹Qý=?ÕW•ј#ƒ$ +H"£0D1艤ÁFP2£6d�HyÌÒ8Œh‰Ó†AŒ—ÔŠvt˜,—%( d3%ãRLˆ<“-slÖs#ISL#[]‘ñ¦�aȤ릱£XeãÚ„=¶"¢�W„Â44h #Xfp ѱšEÈ#@xFÈFÆí„hg˜3ÐPš!&zÃ$aÖ!*!2`�l·TÎô"ÜÓª#€g -&”"-Õ­“N²I´˜ ª�m ìŸÒÉœŽÚM¤.M¢,4˜hi>“¤ÃH:M¦ºð’L4Âi0ÿM&ÎÊ£yÎÏ‚¦îã°”* §^©a6“[PƒiZÒ¦ê;ÒµikI7éhŒzW¥¥­›PáQ/l³Òm3Æ“l°ež|Ò¶4ÓÑâv.ÎÓ³¸j¦q‚ݧé×Úÿ÷TÒ}ýÛÿIÕ{[h4¾“÷ŠMo»ë·N“þé[ ÝC_ýßz÷}ÿûC÷iîýúëô-§Ž†¿Ðî…Åé½Òßï÷R8Wý!¯w®®þ?¿ÿï,r9÷øoi�òÇêãªý¯¿º·êßüy2Ç «Ó_´ÿõÿÿÿþÿÿøü±šëEÖþÿþ¿ô^Ö+®[¬þIþºÿÿºº_°ÞëýzKýÛ¯ßÿÿÿýU}ø#n¿t¿ûÿ 觯øV×ÿÝ}†¿ÿ¿ÿÿšŒ)™ŠT ¤ğŽ< ‰§�‹f‘ße>kÈ¢)Ñ/•ÿô¶Òþëÿm/Ãm¯_à�ÒÿΓÿ†ÿÿÿÿÿ4Âd�Fº=³LÏ0˜PƒÂ6‡¶ˆA'šÃ(‹™ü0�‘|Ñ@Ê6 EâgQpȼGDy™02È#Œ4BL‹Ifƒ$#†SÆ‚ÿÐNÅ~Ø"œ/ý°‚ü7Ókþ–Ú +ÿÒÿÁïÿÿÿÿÂ"ÃY3§I¢8£ÛBô›IÙ1Õ$Ú…£;Pša5l$Èþ©¤,�CxBþ˜Fã“i#Y›áÞUö°0˜L£L#cÿ„–tÿñÿxCøvׯô¸Bÿz_}¶ÿÿ¯ßÿ|jû«ªÃm÷¥jí ,醉:D°7 +§Ìñ¤é4pÒpªì³³Æ•„°’NLëÂM¢+†Òoÿá/ÐCúØ_ø¦?õÂßúûûßõÿýþþ¢£þíêž>—OM7û¯¿ Ö¼zt¯uV·_“ŠWŠWú×_×úó›½ý~ßZÞÙÕ?úûuî¿ííoÝ»µ´üwêÛ‹þíu¥»þÿ¿¥º_ÓøþÛ°¿¯êÈsþA÷­šr�éS÷úÃ0›'_êžÞÚÓ׺ý×ÿÿÜ?ß½ô_O¿íï¿©*ïï׺‘´î*G ûYpà×V õúL4¤1õîºókõ�Ç0—°Ï]….¶Ðvz´›3_i]Ú^Úÿ¶gÿìÿ~]`ÿoÿüWÿþüç_þ?\Œöë‘·�§p�´í6ðƒdz‚b›M4ÛIôÙ;† 6ؤՊM†`­�еcUÒd\·Kn’².U†ÿØl?ÿö¯ÿÿÿúðÿHÿ_HHi§i´ö¡oú• ƒ +Ó´ÛMt˜NªØI¦$é¥dpa6ã ÂAÝ„šL6I¨mƒ š ŠÿÛoÿý¿ÿÿõm/ÿoý}ºõÿüÔ9\Ï'1G<ì£(fK9“–#°3)óREÈeV!JÆP˜…+¡…+< þ †ÿÿÃÿÿäìŽÛ¯ÛK ÿþëàŒ?ÿõ¤é:ºN""9nªÿÃÿÿƒÿÿÿ¥¶—íÂÁ¿ÿíè/ÿþ®ºêÿþïÿ×·ï_ÿèÄ/Ùˆîýˆ^þÿ±é-u×ÿ»ÿÿoö¿ÿëÊôa+ÿ¿Í^’ÿÿÝu¥iù§‘Ÿÿ¯�w÷ÿÿÕB„¿öÿ ûõ¾Òm[KKÿÿÿúÛÒû¯ÿÿÿóŸÿö¿Þ½Û`‚°“ /¿»«¯ÖÒÛ?Ý^éwçïýdd'ÿmµäŸ_nël�Cƒ„ ˜MSVEºZJ©Þ’±V²)vÚJ©÷éò+†Ãõ¾Òl½« æÝÛ²ý„í³Ö•ØJMÔ f\¦�Ãa1L0Tí5°•´Ý4m(iªxM;A°�°šh6Óm(„š Šd ôÛV*G 4Ø«I0ÅKaN!d0‹™�“Ð)\Ã�j{”$WÒ“Ec4Ê:i™XÑ�Ïz9VØ„Ò=¼0ƒ +£ÛA´Âim…‘Æ› +"9’ÞvrQ‡—¢†v¦áè~®Ä+Ð�¥ú_ë×]}-+ô¾-¥¤Ú\&ÈrÀdt 0Òº  bdM’º)œ7òlS•Å\O™gb0 ¡JãvÓõ%à¿÷Wîï»ÄrˆRÊåÓÑ‘’ú®¹Ù®vÿU×U^W¬Ï ‰#Ft26JNi�dš=›Šq”„SƲR΄K摊x�™Ñ§žDÂ#é©­'Êæ¹œL#ØsØf3ùœa1„l„x žgˆL#ĨFÆ 3MÙ{¬2F@Éà@Á`Í3¸ ì4Bt˜[ˆK#Â<=’Ô·02dE'M‘ RÜÈêƒ6hðÕ±J¨öÒ i:MÉ¡<“è:Òm'L#;IÒm&¦� SW‡h&ÒMT_à 4 ½ðƒFÀÊäÐF�ävN#"¸Õ +“ ÒÒh*n°’×tœ4/H—4­-6ÒÂN“aàn™ã[ +é6®Ë@gš¤ì´'Aœ0‚m–„Û- ûI´ Â…P¤Dv)®í:ÿ¾–“«ºûÕ?N“«í´×M¥ÓKâôÚâýBo½&ßm+Ö¿ö+µõ¥½>ß××êí¡¥¿ô)u»·[�§þ÷¶®ê¾ÿ¯T.îö¿ãû¿ë��õº�몶ÿéz>·¿®ãÒ¾¸ÌŠP«×Õÿÿë_Û^å•w®¿ýÇåÖü>×t[’Wÿy "Ùÿóº,©¯ú·ÿ¤¾«õ¾¾º×ÿ¯°ÿØ{×ã«¢ä©_ýuÿ„Pþ¿n½mÿÿÿuöÿÛõßÿ×;Y#¡úgV¤Ã+2’ÇþºÿÁ.Ú_ºø#¿!ß×äW}¿ÿXÿaÿ°öÿÿÿÖF¶iE™fpÑ 3иHÌ ¨ƒ ‰ÏüФ]çPrìñŸ†ŒP5"$P)B6GB!Œ„§d@óUŒè*d1äHTʶC2­ÿ× „í„ ÂO¤þ¿„¿ÿÿô ððKÿÿÒt BÉ�I¼-6©ÓUIºo‘lV�Œ*èÝŸ(ÖÂ60¡0�†™ñ„le„lÐdðFÀÑ 4Byñçˆù£ÛD"s80�ÁÃÿ¥ãþ•è/KØú´½ï¿ÿÒü7þÿÿ¯ïu´ÏB–Ë= ØAža&Ùb#˜I°“ᦘI0Ðds 6M¤Ú#¶“i:L0†“Í’¤ØAdΟwH;¤é:MÿÒ ô¾«¥ðµÒý÷ÿõ_·ÿ}‡­í¯úŠ[¾—é[^ÛÓUï¤ÚOïêéZ Òµ›“ŠM ¤•­´¯¾»1té:_ÿUü-ëê»ôßýöÝÒ_ÿïýþú— O×êÝ:^Ъ¥îÞ–ã¥Ø¤þí¯†¿ÒkÇßñKÿ¯Ûÿýúê¾ûzÿ®»gN¿Îu¾­ï^÷Wñ÷­ý½ã¯ô¶Ú×ñR8V¸í&ÜRo·R8Zÿ½.ÿÿa6Aþ» áá;»þ›?Ýý­¶—ßWí™ÿëM™ý­ûl<ý_Ñdû~¿× (‚ôXätþÿ#Ÿ‡ýãØôÓTØf »´Øl\0m‘l6äR ™tÈ£‡¦Ã †ÎOIý¥"Ž`•Ö^]n²õiZM—›KÕ³Ü4¿ÿoÿõû¯ÿa豟 _Wý!øÃø}4í:jÂa4öG ݦ�®Â†*A4Ã]±A†Jšv‚tbi1H4Ðm¤Å=¤¨„A2< 6(0ÿ×ÿ÷ýsÃmWøû}ýíýl?Øz°ù_DA¡sÉu);íB¨DrFV4WCB �Z>e^ša#C &FL$UÑí£E‘¤ +¢ ¨¨K°ƒçFGÿÿ‚0ýtwuþ¸aÿì?ÿÿÛý‡« b)8ŠN#åplËD"<¶úoôÿÿøIö›õÿðüÿÿðoðÞ±á²!‘Ýu×Åpÿè/úý…ã¤þ¿{}þß_ÿw†ÿ„ ‚ëõýnÿ¯í¯ÿØ_º´ûáïû¯¥×ûþÒÃh/×I–þ»ýëÞ¿¯c�ëÿÛýÛöýw½ÿ}-×¶•¥ú÷·÷þëö¾Ú¯Okíæ½Ûý³§õõ×ošoùåþsuí¤Ú@—„¾¬ÿþ¿uí×¶gë¾õ÷é6ß¶Ý:í®»wÿªÖ«ÿd)h¥MBö“a$Ó‘,Šá¶cÝ%·ISa¥aÁ®Ói]¶�ÕŸÛ=}žµm-ë®Ï홫nŽ[}÷vÚZÁ‚N\“AÐA¶�b“M¨\L0ÒA„ÛH Ób˜¦­­´‚i±¶�b˜¤ÕˆWMÂVÒ´Å0ÂÈ–Òû#×Õ—äAÚu"DE[$hh¬l&šjV0ÅOVÙÍ  +°˜‹jÈáE0˜I¦‘0¨6ÂPEð¸iŠaE{°Òb˜'m(.S¦"" !b +WCBÄ ­ƒki‚ddÖÅ4Ô€‚˜DDs±¤#áª��ÉjÇWIªC¨ùn"$‘’ˆìJ;1UB…%ð¦KQ»ï§±Ganï¾á®W­{»õïÈÌ’þ90‰bÃUõ_Õr|í^2¼kÿúkªÁDI‘P{'¤Ðf¦f(EÃêk!’NOY.dFhDŒÙç02r*'5:4È’=‘†jõ Z�¢5t|v� š6Qà394nª5¶EÅ„{ Ó „l„h Â?„Â3†¡< Ê0� Ã×gD™à!,�Ëæ0�šlˆA€˜2x»!æˆA‡‚?1Ï 0@ɱ7IäΛ‹m' :[,€ƒmT˜Ž3f“¤Å¡¤èCÂ45H6“ � úM»êšM«ú ´ƒjž~TØ84~„k„Êå$Ec°¼ìi}]¤¸V—èŒz^¶ð�'§KI„‰Å'D»n+WWí™ZIž4›IöX4é0Â"Ûe¢Û¸I´ƒhðḬ̂Œì((L�í:N“ %wUoצÒ×ÝzooI¬RÒô·ëm+ÇÒtžºÂ}ÖúV“I¯_}~½n5è[iu¾¯»�nÝn£¯_ûjÓj·ë¥m~×úx¤= ûáãïãºý=c×_ãïî”:Òø_Öñߤ;{îïèw´»¿aÿÖ½|²àÿ×ÿÿøk��¶¾‹rTõÿÿåŽG@Ës_�ÿøzúëþ—¯þºÿõ×þ¶ñaýÿþ0Õuÿ;îÁÂ8ÿýõÿë÷ÿoýý¿ÿÿý&Ú‘�â]DdFõÍZÿë á?á/þïgÿ¶¹ÓÿüóIðF¶¿°ýÿÿ ‚4¹š`�„ ‘>aŸ˜4By ¾3–sÁ 9C›ÈNe†|B R_'F" S™ÌÒ7˜ÈAd@d&M™Ô‰h¤7‘tDH<¤5)Ô7¥ýè'ïÿ/ý´¯ÿØoÐ^/Òüïÿÿì6�m'BÑ�„jšMê&Ô ÐBú6©£óבò?llE1HÖøA„k ¨‹’60Fpò04 �”EÏ×k ‘›!&2B#zÒýð—þè¨z ûÜt¿ÿéz^ßÖÿÿÿðé:N‰ðn“aG4¶Yî“¢]WeÌ&ÐÕÒ¶šT›dø&‚ ¹3œ3†“hi6“xd±4�m ÐN“i„ô Ýõÿõÿµo_ß-/_íï ë÷­¿¿ÿÿ»ikí6·M%øuêñûD£Š[´©[½m¿ ÂV‰:JÒúv‚M¢N°“¤ÃLóe¡6—2Kûÿ½~ÿJõ_½}zÿ:ûõëÿNußíºýÿíÔkwãhkñ­ßÓ.#�ޓ¿ÐiSI÷tªé¯ÕºoI´»uëí®»~fi&ÿ÷Xf¾¿·÷ªÞ»ë}{zÿÿ¶té!ëÒq÷¸zPáw\mô¿úŒu÷êÛŽ—[ú·ý+/È£‡«wapÕµ²ói/víì†;`Ž;Òý³>é¾ÿ{úlüÚœ½¶ëíWmlÿÿü±Ÿÿ‡Ë†>®‹Ã#kMÿË¢Ç#OÞÒ¯×Vÿ¬|4˜¨Nšlq A±ÅH^h6 ’„ªÆÚqMÚ&©±ZLl6"Øl9…a&Jêí‘k Üék—½;¶Öë_ÿõöì=ºñ¿ÿô‡Åvý[ÿ¯õû#!4Ôðì2P ¤Ã%k¶©Ó†Èã„Ú{#�Úa„Á„d£O ­®ÐLB´¨&Óa$ÐlBM›†!6–ÿ__aþÃ]}ÓIÿ×î¿ÿÿ߃·YÉÌDaPˆˆ1GfœB" dÎ¥s `ƒH¬dóR­šh­S „ÈöYñÿγùÑ—¼7øl„dvßöŽúÿýpŽ?´S×ÿÿÿX¤ø�K7ÈAú ôáÿ@½/}×ÿÿ'Ýt¿ÿÿò‘Ýk^×ÿÂ_¥ø~öÒÿ½+ÛÿïÂ_Óÿßÿ ¿õéÞ¿¥ûþë±^ÅEuþþ—°qM¥ÿÿê^ë]µ_ÛÿÕ|çíä„ëÖÞÓ¯ý÷¯¿ýý~ßý-võþÌÿÿ_ÿÕ-_Úî¿ßm}éëßmé{,%Ùõa2:×m%µlÇØOî¶ïºßØgýÝá™ûfk^ž×ïzý×áˆA©†6JÕŠ‡a‡œŽk¤›v°áÒlSÓh+d\¦Ø%ØYÃßm/ní/¶Ò´ã+­à +�BØaÚi¤ÚpEíƒ &I¶§uaS¶�N“L1 …ZtÐmƒMŠ ¤©°m ¬7-¤¦T�1ìIˆ†!JÆHöå\0‘Xà „Ò=±…Ød¬ Å^Ó`Š?)±¤Z Cqÿåt¬ïâ½Fvr¸Þ)šPƒ+Ã;R¶º ìY„x��Á$¢;”ˆ‚šîïêúMv÷¯ÒGýù\t#ŽÓ ­ªþ�ŽDüiúúó$´p�fš"tÙc!’ã!‘š$ÈœeAñ&Y.eÌŒ3[L«dM’(Í^¥>J׈ SÚé„haikaÁÉ̹šÃG¶gk ¢F°Ñ ¡ðÞ‚ÖD Ÿ º Ê| #@3ŒÍ”Y Èñ1˜`h„˜d<Ù"Ò@³|É�ÈÈ<ÈÅdý4¬´8Òm'T�&ÞÒt�Ra fÍ&“ÒÂa4›IµÒmRtží!´…Ír§OhØÔ&¡æ¹S £CÖG,�™Á'Œˆ¯ÐW…ii:î“»Ó«ªMÂt›hUóæ“i:Ëœ œ*ONî“k…Ažrý…e¡0Â"ÛIõDvÂ5´› 4§h‚„|aB�™d¯;íéýú_QWôÇ'í'ñÛ[]]ÕüTkJÔR«Û]&á:ú ¢—T÷¤×¦šwm~ºë{¡þÝmÝo·n4…þ…îýW}öß]®½Ý§]_§Qwÿ}?ã¯Úü;ë¯ûÝ-ý^îüŽÛkÝê›Þ¿kë÷kÿûªÿßì{·ôßòë_רÃÿýwÇßñÿ/*Xˆûÿ×ö×á°õý}‡úþ» ‡ôÃÿº÷ÿÿÿÿRmÙÞ�´qé…ý‡øa°ÿÿÛßÿööû÷ë¯þºœØUœˆÅ¯ª¯I¿ü£øoðpßÿøoÿÿ †ÿ ÿÿþÃÿðVéNË Éô e ÄNŒ àÊ‚#Æy‡ÈW7Í�ž"&)¨‰12q ¢3PŒA"dQ2¬Ÿ—¡= ¢i �“¤ê}¿Ký/ðÛÿÿÿÿðàßàßÿÿáÿá-¤éðš °ša3IƒVô<*a4hfšhÙѱ£Xyù0��”A2x#[" �L Â3ƒF€Ìgó9ÐŒ#Y ‹ÄðÖl!&h Ÿ0G 3Á~D¡ì�VõtÇþ•~÷áÛÛ¯n·×¿ï ¿Ûÿ×ÿ ¿ûKb….Ï´›SÃ8Õ-'Ùsè3‚›i8D[aÃÐM¤Ü™ê“ ÛTƒj�›a)8IŠUô˜ÒwÒ|$Ú¦ž©£E4Â6l:ÿK¿8�ýß×õßíÿ}ß÷ÿ_××ÿÒч“ö¾Ój“¯¿Ó ´¸&ÿ\$ï‡I´ªZ¤Ãm'¦‚¦V†˜U²Ð› ž3í–q¤Ú"Ý&û_ú¿ß~qf:ß÷óVýwý瓘Oí�Sÿþßëÿë¤*4öGín£_¾õ®ú§ªtþ;¿«í>ºý:Z�¨é_ï'i. ¿¿ßÝßûwßý×Ý}i6ßíë_ýÿõî—ÿýR­zïUÿïÂýCQÝn�Ò÷­-Ýöû«Ôާ}Çß±×ÿ„qåÓi÷MŸ­m+­Ò÷KµÕ³õÿ}­Ó{fk¯ô¯ºýûäj¿–Ÿú�ÿøûËŒùc‘Ñ}oûþ?ÿðÝo�ÿAö�r.4á°ØÓ°“ÈAßZJÚI«i&ÚV‚ba›“M0ÙƒO«JËÖà iwÚ]—Ý-9pô×¼‡ ƒÿÿ×þ½õoúÿÿÿaü‹ýÇÞ¡V“º ÉBØ„L*b˜0�U°ÒNØ4“°Ai4Å&MŠM†°Iˆ[i&šv’lPa¤šp�tÓN!;ÿúÿÿÿÿÿëþ­ÿéCm&ÿëðrl’Â1b­1Ö�ˆTG""‡šSÜ)â B Pj Å#Å3Õb‘PÚˆSÞ-5 'zmUÿÿàŒ?ÿò%ÿÿþ¯á?¯ÛÃ~ßÿÿ†Í‹,«,² +dçÿÿ„ÿߤÿÿÿÿþ!ÛK}Ò ·@ßÿçYý¿¤ÿÿú_ÿè/ÿúÿïý]´¿mðßÿè/Á¶ºÕýÿÚ_ÿëÿ÷í×þµ¥¸ÿ„>“÷þ©~ïÿûªÿþ—÷Ûþ¿¿úXA~‚a¿ÿºþþêý¿ûÿÿÕ}½»÷¯ïïU_Â�%äéöÿô¿þ“fkÛ?ÿmëÿùúÓÖÌþÌöþ×öÿþÿ»Þÿÿõó�Sa‚L0©ì0ºz°ÎR+‡¦¿÷„wí¥¶“ äÙzÛIolýÿa6Aþ» éõ]m™ëö·úôÚlB ¦šaŠa:a4ÓL&žÅ4©±I±LTBL6‚´íŠM5M†`›»M‡iv“"ða+ÓË×"Ž­Ô²™! Ec )Xå[F‡*Ⴆ‘¡£ öT +‚± Eùá»MC°ÂL0ƒ ¤ãMBa…­§MXTÓí'Ц!*i±IÁ:i¶”¶ÓæKÈfNÉtQ£�ƒ@Ða  +³Äža#CpÒ=¹á²6ã1IÄUÅL–þºOCI~¿Ö’Å´­.ÚM¤EŽÈRÒ£Z *ˆ�“j²¹O24Â��ॺ›Þ�‰IïûÇ�!þ¥s_%’…õ]VW¬Èc%£8ˆó†FÈ�2 F¦u3¨È�ò†™Ñ‘6Dd"#Ëë+šær Ã/„|r~Hæ°ð˜F€Â>2“3 ÁÁ‚.¼"í„l#84By #@9�²S›#¤GD}–|#¸§7+'’x"eY~E¨‘YžÉhDNn"l(½“;UZ¢,4˜Òwt›‘ÛIÒuMØF†“ ˜¨M¤é;¤è'?" ômB …¾E±Å#c'—´ÓF†g&­¨MFš‚aI²Üv«¨8X'XJîé<¥«…Qa¶“ôZO- WYæ’†ƒ<Ò¶Z „“ „Ë8ÒtE¶�pˆ�Òl&¬½©*di×…3ÈKTqÝûIì}'ßì×W¯uÝ|TU.­+÷ÒnN=<”$¸WÔi7‡t�í=4×"A=Ú~ÿQô¯wiëKR8TºúíéWݽ/.…z|]µ½­G÷÷}Zÿðÿ§øÿãévédp­jG ú[o ·­ûié·zñý{Òúaÿþ‹þ<=VP/ät·ëÖ—�ðû^µ;OåºÂÉ*wÿ¥ÿXêÿZêÃê‡Òºÿ__‡¿þºëäJ£²ÿöðßÿ†ÿÖÒÿÕ‡¥ÿ¶«¿¯°ÿαk�š¤õÿ_Ûiÿò¸oü�—›¯Éׂ3°Þ¿þŽî¿¿gøoÿÑ †°Éó #À4BtÀÈb Ä'ÌÁ�Å*ã¦Ds7GÑä_"Ù²DJE$¦GÉËÍÊC%:™S55¢?ý°‚ ÿá+ ÿ ¶Â ¼+áƒ}{~¿ÌïÒüÿúIµM þš?4l£]SL#cc?#f)¨Ê¹Bj�a„nša1а�ø@É!<ö‰æ°É†ì4BLC$#lø¥�ýBÿ~•ÿK¤ú^–úWÿ¤ß¯·è/Ûÿö\ÓaG5ÙhgØIºt¬ ÍŠlÒm¦P‚a°ša*#¶É¡Òp¡&)YhMò7 ,˜áŸI†©¤ú74höѰ���øW÷ô·ÿ­!ý/K}_ý¿¯÷ô¿~µú^šQ~×QK¦¥~«»ê‚v’m-i„Òù¦ÕÇå�6dsWe¡6ÕÒi&ÿÑûïõ<¿õUný~‰4ý_·Å0Û¯o×÷÷ÿ‹h~ŸNý§}ôïö¯Jÿ_ÿßÔ][¦±t®NÒZÒWþ„ßíÿßþ¾ÛzúªúFkÿ¯_¿Uó�kuú½þ‡uþ¤pºN†í¤îÿ¥¾ï×öÿÖÐþÛŠ_¯û�Ç®“jÞ¶Çz_­Û üÏMÝÝݶ–ªÙž{½³O}ºöÿ_þ�.ùc,òÅCþHiü±ÈÎýÿVÿ÷Ç÷øz¶ðõúëÈái¦­÷RvÈ|wÒzw ‡lS!ÃnD²(áÝ&–à 'ì0I²öÓ¤�·eîEpui6•æ?áÿ°ÿÒ/M/®µýûöü>›Çõ”9mÁ§pí¶E@TÒai¦J�¦ÓM† iØPMZIäqé¦Ä&!5†I¦œR ¦“M´°“i&Åk†ÿØazöýoÿÿÿõ÷ø}|=}o¡ˆÊD8aª™YEEó" ëŒ`�(Ðà +„X¤ha謰§�wr)Ä&!' ðßølcÿú÷Gv—ÿþõëÿ†ÿÃýzá^„DRq̨†ŽÉ9¤ ðßømÿõý/ÿÿÛKÁÿøoü7þ±í¯]W¡÷Ãÿ‡KþÛKÛô¿ïý°‚ð‚ÿðßøô mú×_½ÿ·_þ+~›ÿþý#ãé^¿ ïélô’ê¿ÊþE¥þÛöÊÿzý?_×ßë~ÒÂèÚm¤“h%öûÿoÿÿÛÚÿµ_¯ÿ4^Úÿýa&öT»lÿõk¶gÝZ÷¶f«³=ÿí鿆_î×ëïúÈ[uªü2#~!WN“VI;JD¾Ã­)pýXa_l%N«y„ÚPý�Çó ~Òþ¶×êÝ.îCÌÑþ Ëd%h6);I„ƒ ± +҄馃b©6+¤Ó ±¶�bÓm8áÃM4•‘m¤›i'k"s]‘G ¶T⋇+0H®`Å0‘­ÊÆLSM#ÛG·ºšhÙTѲ��™ÖzP˜F°ÌhøÔ Â6æÆ²vi !š`�„lšŒñ{ ž7“ÅÏ'²>O²â’ˆK=žÏ6ƒ8Òa²Ðæ  ´4 "-´¤Új¡m«“¡h&Òa¤é6ˆŽÐZ ´-'Ãi:Méé ¤ÈüÓžOqLfIh­3 S+…Åw°˜ZïZÚ¼›¥áZéja]4¢‰{[KKKD¾Òmæ–ÕÒ†ü ›IÂËæ +Ë:i¤®ÉDRÙÜÅ +Káo¾Ÿ·M¥Ðªté:Þ;N¾í­ö“¥¿ZÝ:¿¨¥Ó_j×Mÿ½¯Z~½­ã}xÚÞÚt45þ�x߯õZV·Ûÿ¾ŸkÚ}ûòÇ"Óôëè·&‹Öˆt}þû¥¬wë]×ûÈá_C_Ý÷Ý!ȦŸÿøÿÝ~?òÆÖyu_ýyiý~Ááœ?.ËŸ~ÿÿOÉg™yU_×õÿýÿØ~–¿ÿúÿ !ü[ýÿÛ¯õý?ßÿûÿÿûÐoÿÿÿüؾßÿ_ÿêv´gÙÔÈÈ«G< Ô¤2x•<¬zëÿÿÿÿÿÿ°�oïò)ÿÿá¿÷_ÿú;UÂaà3HdŒ(DY“òt„x žt$A»'Ì ®tá„DãÙšÈë=’AJj4BdÀÈAHÄp΃(Í™¨e:O6gR +tDÿÿ÷ïÿ¿ÿ ¤ÿôÿÿãàÝþÚ ÿöÕ»G†mQ�…Böð“ÉŽ•&IµM' gälr7=(Mdf&pOÓ'‚6Ba0ŒíSØÉðA¢(0�aÈO.Ù>`ÏA÷þëÿþÿñ{¼%ÿþßáÿâÿý ˜o鶨�˜wÖÚ¡ØAœ4°ƒ8it +“mtpÒ}m²ÎÃT´²H8DG &C“…„hi7H&ÓU §þÿÖþýÿü Ÿ«ß×ï¿ÿwû™?¯ö4Ú^ûMÿ_íÂtºt�ëJßkIê¸+é×xN—KDcÜmÒm–ujéž3Çý¿Û§öþöÿÔ�~»w¯ïÿœ]þõÿÚúÚ~Ÿô½Òßö´»WUÛWkW÷éõµÚu¶š_ï÷~ëyû½[VÌ×ý˜ºé¶ßÿ½¿~ûÛöÿ¯ÿ|w¿á{íï[ºï\mõ»þÿïnÝ}ÇCÓÅé‘ÂbÓ¾×lå——n›NÕ³—·v¿« âZMŸìõižµí½³÷·zõg×¶gÈ<ö¿íÿÿïøþ¿�ÿ«¢iö¯ÿÿü=ÇÝCÿEޏÚ릚lSšm„ƒ Ri±†( Õm†ÚV“Å;†i«Ã´á‚±v“a}† 0õAií—´ÿ_ÿõýÿúÛ®¯ÿëÿöýËÿ3ýtÑᆠ+ðÑâÃ%=°»d¬&ÆŸ‘ð�a ‘ÂݤÓdp˜„L0f#‹i( Óbh;H&šq ÿÂÿÿ¯ÿ¯þ¾ö—úÿþÃõßÿ_ÿ“jfAY; +Aˆ¸Œ¬Ê¬޹B +1A‚GÆ�l0‘é'SÀ„‹“¤hmS_‚4ÿÁÿþF™ÿ·ý¢ŸþÝþÜ"‡ÿÿÿßÒqÅÊàˆDFœìoëÿÿAþ�~—º½~Ú_ÿ†üÿÿßúþ!_ü%ÿÿ„¿×Òÿÿ¾­b¿ÿJ‚úÿÿÿ¤¿__ÿý~¿¿ëÿ±^ÚQ_ÎSÿ÷ô¿¿÷ïÿ½i-/ëÿ¯õýׯ÷ÖÜm/„¿ÿ~—×ÿ¿ÿ�„¾Òÿ×þ¯Õouÿ÷ßÚÿ_ÿÎ~ª½7ïûö 1t�-þÒ׿î¼ûÕvïÛ3÷ý�JGÿþë]oý¿ÿ†D+lR§k 0í5Òd íYpäLm¥iò+‡§ NéX`“Ö©°Ó_l½ýÖ•„ô›=ænÌ%¶Ïû ÿ¯Ë)ªL*M;¬&�Ã#“ N´˜l$šmÂÐi†:tNšwzi§“A§¥i2PíÅ'ÇjÅ2/2柧-‚èâ•q„„Â`¥caaOÄ=³MØA¤hbÓgxaÏÂsûjîÚ×a‚ #á*{# �ií&›T„ƒM4â"4d+ŒÁÌ„8„# D§q•ŽRp@ÁÖ•…YY'½+㈹7, õKÿ×U¯JÒô¸¶•õM‘Âñ„ÚqÂ#æFYO›fAQØe�B¢¡•ÇØÓ+’ÄG_W2J Y0Ôüv)’À��Æu7÷u9‡ÿaQ¬4| :ßzpÃöœ‰Œ‘Ô& +‚m[Iº[æB‹]±²�f͈0Dñ´vHÒm&Öq×öÊÇÓ@à ¿ A±ÒIþŸí®®Þé>:WÝóftŒÍ³¨¤ù³5 ÔѦÈè2„q¢$Èë"ñH+B2È#F\á6Aš�n‰ý¼WýÕþah<50��™É®ÖÔ Õør~KÏŒ#cöÑ 2ˆ {š �’!<‘éƒÛÒ"HÙ2¥: ë~[úú=Òma„�]¤Ú‘èÖÒl",6Zh ÛººL4ƒ¤Tw}¦“#ç£[ÆŸõ%à¡0ƒÑ»#ãcÿ«Ú\Lã°‘ª2©þÛK‚oÐ ÚZ#xjô›‚}&W½ik¤Úbß…I„–ué>ßAQ´{¤ÚM$Þ•k�•AU3ˆI|ì¡… ë[ÛKvû¡öÕ=·IÕ§Ô{Å+ß}WÔU„ÛiuI_ÿÚµö�*~¿xÚzéÐÚëC[¡ûR8[VÚ~¾öóÝ?_¯úKýP¿ûÿÿD8‹c¿!QþXäg_Zü4;¯ÿßëïãÝ߯u#…ëý¥wªwݧÿ,ÇöÑc?ãú·û]`×ÿÿÇáÿõãü‡WKüs¹ä·òJ¼‰ÿÿýÿ_ý/‡°öÿý}vËÏÿú,N—ÿ¯§ÿ’¬­ù)ÿþÃÿÿÿÿÃ{úÿë°ÿýuô¿ÎÌ‘:)ò�*”ëõõíWÿþ‚ÿÿÿÿÃxoÿöÒ|‡á¿ÇïÉÙ·^“þvX�0�„F€‹²{#çL�‘ò#0fb¢ˆµâ&¤J��6D12R\h‰B3óe#§f ¹†h”Ôd†¹Ì×&JŸÿÒÿÿþü7ƒ~ÿNÚ Â Á½.ÿám¥è+ß ¦ ¤ÚBÈù j¡��™µFÊ£cðš6B7M$k ¾~´x|C(àÂ5°�ša³ r."f°Ð# ™ EÚ!**ËðÍ#CFÙñ?ß„—«ÿÛ§ðöý~»„ Ò}ÿð–Ä+Òû¥LáijÒPÐdsI¶]hi6Š´Û-žaÃK +“É�7ËæLéÒmÃIôT65Òl$Â;´ŸA¦�ÕA¦¨Øÿ¿Këÿßúß¾í¯õ ‡Ò÷ëoý-N—^•;iiRºN•éZ%…öÞ¿IÒZV—éµzt´ ´¼Cnì´+öYØ6•ËÒ†ƒ6A=&ÿÞ¿Óïû×çÙÕ?KéaWUÈiõòþ–“}'Ý_¯÷Ì +⾪㎕ôÚ¦–é?×íúcû¤ôÞ––£ú[á¥xAºt®¾ÙŸu®­™®þÉ×ö­ß}­6¿¥ÿýúY¦ßÿªúÛití>?h[Qñµzÿ¡®þý~ïÝo¯¶ß©/Ó×´8Mß÷«iiHƒ»Iµ\Â]† ^¯L3Õ®“g¦Òzý%d÷­õ¥«kÿ{ üÍ=Û_ÿ嘢ܭh·*¬·ü·$ŸÿØÿcïûéô¿Bªß#…¦œ6*ÂP®ÐLT64ÕŠTÐm„ÈAݤÅZ¶’i¦ÛÙÈ®iitÚú|Š8m°Á%VÒzÿô’ññØ}ã_ÿûûý~ßâÃü–žü…n!<(aD&Å0“«†IêØPÂ`©ˆA…tØI4Â$ Úa:v�L �Ãi&š§ íˆH:m& ý_ÿöÿÿýºõÿÛ__úÒ‡úúWè¶æDf)5„dPÄD0„5e\— ˆ=í ¦+!ŠGàH¬Aˆ$x£Ð¢ +¶ÓS͆F·AŠb¿ÉÙÚ_¿°ÿÿÿ_wÿì?ÿõöÿÿÿ:‹ònyÎÒ!HìW ~‚Ãp¯ÿÿÿöÐ]%ÿá³^ÿþßàßäìŽÿ¯ÿ¥ˆ¥ÿ ¹>¾ïÿ¿a ¼%ÿàá/ïþ» þ/ïý¯ô­®�¯¾÷ÿÿøCÚ_׺_ÿ¶—‡ý/ûûõ¯úé^ûþéwá/_ÿt¿ïwý/ßÿö•×ÿÛ}÷”ußûoÿÿ¯š/þþ¾Î«ÿ¾¶é¦ÚV•ÿ¬ƒó?í™ûföõf}ü‚Sëõ÷Úû}«íßþ¾Þ¿M6)ƒ.Õ5äW ¶ÂI°ÂVà 'u˜ÛK1®ØI´°û/]Ý¥Ý×êÚzUvêý>û?õ¶f¨ø40d×I¦šp» RlPMŠM´˜¦Òb­6!2 é;MˆVTÒM‘n”6Û �‘x0JÒ‘.›"Ž‘í´´¶Yk‹)W'ÑXØ@Ò=aO 0HÙ +#.b¡Ó ˜KjÓNœîÁM„ØASI¦ÈáJv–Ðb¢˜H;‚v! Ø« Ø©l aÎÖÑ‘J(ga³±d ˆb0@ÐaJ¶i´M#ä0¨ŽH«†$âÄDs#&"#éuú]W¿I{aÚKÙtÃHá°È‹¬Ö"Ò(øâ9\u ��â2 ŽÑUB„aáNÍÔe;2µè'£µ( hx#Ã;kwuìY64a&ÿÜ­Šf28hTa&é²M›GßùØúG|¶˜RàŒr‡“´Ÿm[ m5ï×]Ú„Âz´´¶˜Cò£È'®žú[âýöõó ¡faÎfÆq‹à��Y ¤hgA�Å((©™�”#ul�ç¬þ¿ÕÕí/„Â5°©£vGƒb‘í™É„laF°Â6��ØÍ$Â4<#`eM #Y�h&‰Ì ÁÝÐãõu¾LF8�"ùO˜#ÊP)øØÍç3^—>Òt4ÓA –†“i6“i:Mè&MÉ¡0жL釘ýÚ †ëém¥"ÙŒô’i±±ì¢;W—oÑ(«¿[ÉÅ+K :ZW®‰=-ÒtNI6ö‡Â÷_®»iša‹p‚Òa²~šÔ*‘{én)vê—B«ôê꺦ÐÿÞÖ­´×õn¾—ÿ[üjé6ûOÿÞ¶½þ¾:ÔhcãëÒmÇ®‡ÝHáëý†íûõ¯ºîïü}~ÒÑc‘‹éQc‘ž‹rH�ÿ«o×u鿤þ½6ßEq×ý}zÛõñÖ±ñý_ëÿE•×Òÿ¶ï÷­~Ôȯ_ñúÿÚKë¯úýÿÿ÷ú_ÿ¥ÿí·ê¿ÿaÿ¶Š~ÃüÿÁÿÿÝ/KþÛ_õÿ´ŽÂ†HOªy¶k2U|¬äu�ÖV°‚~ý[H ¿Ñÿð�ÿÿÿúÿGw£»¯ÿíü#[ØÍ0@ÑA ” ­‘™ƒ<à Ó`ó¨h—M}Ô6¸ßýÔŽ¡CýÛª··§]Ûö¶»Ý>»f}íÛf~Ùš]{KÞ»öÍzííÒMµþû«\4A)øÝGýVý}^;ê·\Ó† ½H®l0”Š8l3“g&Â]¯"Ž—�tí%Ì+[ +úhzZ]íku»-?ÿE˜ËWÛ¾Ÿën´^×jÖ˜`Ì:v�6* æ)0Å á;ƒh$ì6”65L1Zûi7Kuúl0›i=7ÿÿÿéþ¾?R¼$k+P¥[ Œ&‘í† Ú Â )VÃ;¶šj*ÂaŠ ÒvÂi5m&ÂA4Þ‚i¦xm*vûÿëž¿ÿ]ºöÓYf“Gñ Pb¢ +èŠ+˜GÆO†(D7ÿÿäDÿ„wiþ¿£½)j†Róÿ¯þ—‹uÿ÷õíÿ{ÿûíú·Wûí¯zM÷ÿÿõö*_ñ^Ç-q¥·ûû{kôî¿{íÓ[ïÿÛÿߺ÷ÿkÝ6}}˜WöÛ3ZûM¯Úmm™û™Ý&Cõ69lRl‡Â+†�n•ì0ž› %×`Â4ƒM¦´Ã 6˜ZoA†‚L&3“bšø6T�ˆÊ¬"£:Â2±ˆ± ÎV0ÐŒ«†F¤ÆÃÿ&LjÛ;¸íDF3·ŽÅâºÒ–â¨UP¥LCL¼oS¾Ï`™OœÕ„Å'±òV[g]÷Ü;°· 'dø>W5Ç÷ßß}ÛÿþI=¼Ü¥*ÿëé¶µ:‘Í"5ì«�ó¦E¬éÿ¿ÿ­“5†i3ø a(Ìä àB¦�fÂ/ãü,�3dtˆè�2>.3Ѽæ Ó!Žò)8¤1çS>d2:¨‰3##Pÿ%ZwI´4-¨M[ÒÒm­!ÂBØPšBØHx†Å0~š6%#H#eF°óL&G€Â5žæ°Â<i ÅyìÁŸÌà�¢BÅa—&y*¡.ZhŒz'Á¸TÏ^“¤Û°’oI´ÃI´ž_°ÓL´y ›½Rt›A0ôEv�l$ÚQ¤ÚMª3°‚MUBneP†Ä ++–Gc×^í7î—¥®úúWM¥i{}u­éKJÕ½‡ú°’mtÃi7ª‡ +™ãf‘qèÑϲa�Œ“³³ÁBø·÷ië׃O«OÛiµ÷ݵéµM÷Iý'é¦ÒÒÖÒßþ·÷Ñ|_]&Ÿûÿéuÿ�Ö‡ª»¼kíõúÓ®†·M}{q×N—¥‹´ü-ß~ŸwòÓÿõåŒu->›í©kü±ÈÒUë�ó_¾?¨ï¯ûýoøˆµ×ô¿ÿÿõÿÞ—÷¯ñ¿ô]vïÿå‹ÿå¸_ÿúä“;ñÿûÿ¯ûuëÿôÿúºJ¾¿úékÿ�þ8þ«ÿ¿õòvGúÿÿþÚÿÿÿÿíÿÿÿþp΃*²)ãAšÅ$ �3A•¥Xò Ó%ÑÍf¹Q‘Ñ4ÿÿÿ ¿ÿÿÿÿKþéÿÿò}Ý,‰oýÿ‚aTÊ0˜FÀÂ.FÆñ„|aÃ�‰Ë±šaÃ0ŒôBLüD¹žg²4DN˜I™9 ölfóÄSæpˆbœÍ£ÈŽót«P2!�GßÿôþÝ{W½±÷ÿþÛAiÿÿÜöÒa„D†Òa ƒi0Òup‚nLM 5Öo…L&d«áv“xsò69 ¥P˜FŒqQ Eä#XdðA„lßÿë÷Ü;ú×Xoï[öݥㄿÿÿñ´¸&Ñ(¤éij)>Ãt�Rh+,úUSçM2ÎÃi6h*M´ÓH3‚›i6Ó +_°‚mè Ú"ÃI¿ÿþ¾þÿ¯·ýÛþúÿ®V¿ßÿþê›¶ãÚºßb—Kï�{¯Té_é[õP´·öÖÒÖá:WÛ'_ÿëÞÝ7·]m÷¿íýöõÿêßûÿÿ×NÒMÐÇz·Öéoº[é~êG +ÚN«n´Óÿ[éúMÓ³a/_ÿÛ¶Ì÷lýºZM™öº]¯f{JÚ·j{ÿÕ³k'Zýÿÿú,r0›ýQ˜pë×ýý_ÿÿ÷�ýý¶½¡¥ûZ‘Â☤ÓMSM8l4ØØ­ˆ[iZL0I»´šËÞØKÛ¶ÏmÕ­¯¢‡C%…[nëßøï«ÔºÃa«ÿý{ÿê-¥¢iö—ãþòÇ"ˆêßò6çh0“O½S¦“ ”&4m,$Ä&B¬%±  U&ÆÅ +ÓNÖ»lTŽMXÓM4Ó‘d¯ÿý®Ãaÿûé~ßýMÿý¥Þ+×é ®JŠÒ”ˆ<‹F¤…EÈŒ`ÌL¬©¢�Ø`†xa’€ƒ �ÓÖÚjà „Òi²8&š¦›_ÿÿ†Øÿ¥úÿÕÿuúi}«Öÿÿòȯ<ìPÌ´D]ÿÿá°ÿn¿¯ÛKý×ÛGù8šúÿÿ×Wÿÿ«Á°ßÿ°Â ô¿m/ï¯öÒúG»_ÿþ©/ûýÕíÝëþÿ_ñÿm.Ûÿô¾¿ûþú®—þ—}îö½ú0ÏÕz ÷¿†Å~¼=^ÿÿõuû}o[gO0·­ýK­¿o¯Òßí÷¯z‚Ci~ÙŸ¯jÛzWÚÝý˜ÿHÏþÿmûý}&ïµûÚ¶Uì%t›i0ÏV{º´›KnöAÿf½Ú²3ööϪ»ÚêÌ÷Þ½³5 ´ØL4Ó U„a´bb›Jè: 64ÛN5³ª›l‹tئ“czOYpûI°I†›i^ÚÑ_F¼«r­†BF‡L&)‘T4‚a’€»M«�;î¦Za…Nšwõa Ä&6Ò ¦ÅDP#°ãµŒì¯'gcy;!hF{†ˆÏ v�­‚ ’°L�‡†qIÒrºž ÁzúëÐõ×ÿ]/m& +©°ÁÚEu#¦„ÅVsbf\—&Ũ·JFA\®jDxÈÀS³(ÜvhÁ3´¹ÏÌ"ù±K�‰À¡'k“„l5OÊ“ô´žŸÇQû’Í'É×�…§Ú¨ªC¯®¤Oë§ë번ÆxÎ 21Îr¬–A")3 ÌCDNŽ™ÃÑhŠA‚z‘g"¥” kœµ+(‚«lt��¡B„Ѳªš69?'6ì#[ÖF¸yó>a¡ÃG¶TÆD'P4A�.dH%ç ð\È…SdxŠ"ì R§iyÙO†ÓI;- + àÎ4›¤4nè‹òch6�mÃAýÒÒm' Ÿëà‹w!#v BhØÈ˜L&“hÖGæÀÁB•Ò¢°ì7ýÕé«éQ(«{ O´–• ›J÷t�&Õ÷h+- Ùs‡eÒ"1áØTG`Î4´�&õ;0©_û}cëÓã´)[îß««tê×þº‹º[íÓûÝ5ß ¦÷V’·¤ì;[ÐÚûý¿iþ†·èKBû÷ÿÿÚ_­--W÷~zƒåŽFÃÊvëÿ~ªÞëúõ ú~¿ÿÐÝ߯ã;+ÝÚ÷†õaéðxb¿ýþ«ÿÿ—X}¯ÿÿ¼¸&5üEÁ=…|® øÃ·Mÿííÿëþ—õ¤ÃoÿÿÿÇýõûêøm߯ÿÿÿÿØz8í/ÿÿÿý´´ó‘2PyÈ’ä%‰~íÐ~ÿïÿÿ¿ÿþüm.¿ÿÿÿÊ-ëD'BO0F°ÏŒñh)ã=0dùƒ>Š,�3ìže„=’Â0ȾBdÀÈb™ˆE…!’NdÏÇR:ÔdÀΆC23""�ÿ þøoûÿþïûÿì?¶¿ÿÿÿáí¥²ÇXF†©¤Øpé2>¢­¾“iªi vi:i¦±úa7gÈFƬŒöœ)38&0Œá„h Æv=°EÀ0�šA(Ð0�f9à›{22øo¿îÿÿþÿïÿ»¶—ÿÿÿÿ¥Ä/u $Ã}Z±v˜I:‡ +“ ô�p�4›eœ3Í ÚXI´› 8KDXaPfÌ#CH8I�ÚM ›Iµ …L$Ú¯ßïý¿zþ¾Þ¾ïï·Šb¿ÿÿ¿ô¹U7ÛÚI÷J¶ß_}'ß­+ë[I÷Jê·‚uIˆN•Ó m]']3Æ™ö“h29ú¢~¶ÿ9Ó~ÚߥíÚûþþu÷¯ÿÿÛÿU ¿[Šßí×Õx¿m;©§¦Òì}]/mÚi×^¼UÒÝß[I­¤÷Vm6׺m{KNÔÏûzÖÚÞÙ§ôÿý¯zÿÿßý?ÿ¶£¾¿ß_ë¯jG õµïõÖ¤p·C]=A„v–©>¯I8�I%ÕkuéWí$ºJêØI&ÐK„¡‘ €“!äXEu0â?-õŒµŽÉ"gâÇ +ªP¦v¯WÊïh© wÕ§ëU¾øú‹üíפõ»õüì³Lzþ¿ò¸ã!ŠC \ f¸Ð‘ä‚É(­ŸgR)ãY)¡&C%RNõ„hhÖF°Ñ­áaši„g B5†Q ���ŒÒ4 #@f˜@Â6Qì4By¬2F\Ñ “$Pˆì“Í‘#0ÌÄ:ˆP!8‡„%Ѳ$ �Šˆ€Ï¸�¥:NM¤ØA7 ›CIÙdÃCIÒa¢+°� 'MN}&Ó¿M! ¨MSFÆ�a£e3ã3„Ѭ�A±¦©¦fgÏD$ÎÌ,;/%«¤ëzV‰Å'umzZZÄ'KQt½ÙgM…vYÃ<Òl ÎL4ƒ ˜i:NÛIÒa²já„h{ìš&JL-z¤ŸÿÚ_I餟·ký´�EÒok­zmŠN–ºŠº �i'iÄ'h.[”åsÊW[zÔTPô7þÜ}Hákzß_ûhz}6›hVÒuNì]ÛIûÚi÷ÿÿŽ•KŒùc‘�¯¯øÿ]ëÿ¡»ôÚŠ{_¤ÞÿþîžÿÕGHué¾´XÏÿìMÿËrI6ëÔ±Èè¿ÿÿÿãÖõúÿ××ÿ_^¿þ;þ¸Ã`ÿõÿÿü®eå|ø_ÿ¡ÿÿÿÿ†ÿÿÿߨmþõ¿ÿþy&ºðF�ÿ„¿ÿÿ(]~ßÿÿÿá†Ãþ×ÿÿðˆ»,"TTx%Ĉ" ‹¡±h*Éù=Ó”‚jrTΦtdfJÚÿKûü Ÿÿÿ¿ø7ÿú¯ÿ‡ûiÿÿ£[ +™1*i£;F¶cØ5†¡ªa0�ŒŸ0Fw(vö #@0FpÉô £60A”#l”¢&C�)gQ�ÆQ›0¤Tú ïï_oï¿Òþðûÿÿÿá°ßí ¿ÿÿm B"ÁÚN““i6–=´˜hi6“¤é0ÒmBjFàÓRb@ŸÓØ5ƒF°Éà˜F°Â5µ ÈH'ä¦x¯nÞú_¥¿þ—ï¿uþï^·aÃÿC¯ÿþ­¢QXL'IÕ¤¬$é<ÒÂ$ô¿WIÒÐgš óK ­;,áœ4›IÐA´E†“i6“¥Òoª·z®ÿ{}zÿœ_¯ýë·MûþÿÿJÜvŸ^µë_ÝmÃI:Þ):½]ZW‡U¥i:ܤé7îî¿Õ¶Û4öͯu¾ßëûk~Ý·×®ÙÓhÇÿÝÿë´ý<-|ŽF·k�éíF½ÝÕqïßÒt›ÛIÕ=¿Òý„wÏMž› +anÂf6ÒØkgµ¾îûúÝìÏ×znÌ×é ¼ëÿ¯ûøþ²1´=z,r,ZnÒkk¯#…p÷ú‘¨®Ö¢†íÿ_b°Å1LRlBNG +(6’l[ªpØkl]¤›h+l¿¦ØJÒM´˜g6ÂÚMÒü†4•}½lÂëÿ×èWÿ×áãÿòªðÿ�ãkoêXäZ_ñý8aa[ 6�¦ÂVÈáÚm4ží„‚m¤œRi†!Z 6Òcb›JÖÓM¶Ò´Õ8»�ÿÿoõÿø¶¿é°ÿE”ëõÇÿù6ge¨â”œ£š¡R¹†) Ü«°¢lPa`“5¶ÐA�¦Èâ›IÿþQz_ÿꈣØzÿþßþ¿ëÿ¯,Êâ[ˆˆ†`¢‘ ß ahQ[Xÿým¥äEÿçYçœ7‚0ÿÿØÿÿïÿñ®""7ÿáí ½'ÿÒêÃáÿþÿÿÿþhÈïªÿÿ„¼nÐ_þ‚× é?ýøoûßÿÿÐ_úëÿô¯ýëí½¥ÿþÿ÷߯áÿIµÿÕU¶ÕõÒýWý¿Û}/vÿÿý¤õÿëvßþßû�.›ÿÿÎý¿÷õúÿm&ÒOíl lƒó=Ùõv]_¶~õ3»öõÿlÓöÒý³DÝ×¶Þ½úôb›JÖÖäq¶)Ž SØ`’r+‡¯tÃ7Hƒ†¿°Â^µeïm[m/¶Ïú^¿Â?0`ƒ�M0©¦ÓM†ƒM4ši± 8^h6Òc‚Ða4lBL&ÚLBTئCÎ’jÃ0Ø`• ™™q$QÃOE¢¼�ƒ(E¢:Á Â¤{d9‘ê ¦§|ÏNw†vÅ4šl&ƒ C¤ì1 Š´©’¼'N!'&ꘈˆ†"¤å `¡Ì0š„ÓHØS|òÎ “`�ºÿ¯h.Ú\2�& ÌãX óÛˆå¸ô)žvÉó³Te]tôÓS²Ûÿ}•ÅßwjŸøâ=wÉ•��b?õ2OJæ¨Ù2„„—� �Ž3¢8yVD‚R�‰|Õ,•¬’kÓL ѱ…Ìäx£8a0ƒL'”aÁ£Àh„óÖD0@Œ2®`ʱ‚J@ÄD öJ„"²b©±yÐd¾k"šDV#ÑøDXh÷I´�BM �Qá…ECÕ&ÂO&:Tjš é°˜M-ÃGÆ¡<þfÂgÍ“¡°3C>höä'›(‚°àG™àQ˜a^h`“[�ž ¶ÒÒÕu|[Ä7…IÖÜRVÓñÆŒ†³"C( †!¦b‘¢O°‘Ÿva4­1 +¿ëÃü_ÿ_ÿÿ�ÿ×UÛØü²†ŽÆñHˆaíþý?ÿàŒ?ÿÿæçÿÿ§ÿì0¿ñ®?ëxoü%ÿÿ„ÿÿú ÿÿòË¿ÿ …ÿ¯üW‡½t½Û¯ô¿ÿÿÿÿûAWÿƒa?þ¿iÿz×ýÒþ¿ÿ«ëÿ½/¿­Ð_×Òÿ¼ŸvízÿÿÕ}ûÕõÿý.÷×uÿi¶—îÙšú³DõÚûuÿÿ_û}í×íßî•}ƒ´•zmvÒl+j¿«¥ÿ¯¯ýúO¯ÿú··Öiúü› ‰x1VšìRv¬Bm+†Ã[m+Tø‡Ý_®Ã=©›ï¯ý³>îÛnÌý/îþ" ¹;LZN!›AéÓM´“M4äqO$ÓM9Å^šØAZiì‹Á‚K"Žg¦ɰ–•—í-Ë­e°dÄ1 +W0ÂX熤V4hsÆU¶Hðâ“ûi„ šÂI¦štÅ à�Šb˜…i1ZPá­ÄDE!†ØÈÈbDqšòi¢±°ŽŽUÚh0A„ŠiˆTÒiÄG®¡›„DÍÿÿÓúiôÓN(ë¤qÿ–ºÇ‰²B&#±_�™AáItì;‰¥í/A®v2 +õBûëü©¡^·Þº™WùEU?[ôÕt×%^>v(¥®*< gAT�2r%Ù0DHÔ‰"?êºþ°��áØø Â5†HÐdŒ#X4{6žg'á Ñ‘Ù>`Ž Š +ˆ@)‚R—�N–— +­ðƒi=m º[ŠZV®�t0²ý¤ÜŽÚA¹. +�n¤pºã[:ûNôß¿I‹ö—«¥¤)h”}´¸+I·pì´&ñÈy÷V÷z‡ºoëýßôÿÖ½¤î>ë{öúN·EŒ¢ëý«åŽX�ôß»ðÿ_#…µŸn?Vöþ›ÿ_ÿðý!ÿÿý‡ÿ×ÉP:ÿDjõ·¥¯ýuÿðßëúþßÃÿý!a¯ü²ž¿MÿÿÿÛü‡ÿÿøoõרï×½õ¯¿¿¿üü ¿ÿÿ þhÈïü7ÿÿïkÿíÿÿßíÿÿ^ýÿÃÿÿaÿ÷ûþ¿°þëþÝ[þ—ßaÿÿý÷Kýíþëÿý¯þ¾¾ÿ¯¿½ÿßë¥~ý²u¶ßÝ~Ùÿÿ÷þ¼�?ëþÛ¿ëû{Wu°K³é³5{k®ßûfž¿Ýz÷ÿß�WÓëÕ5ë Rllr/7KÓa›®›/l0–Ç }Òúþ¯õÛÛ4W·úߺµïV 0 &“ 4MaŽÒˆH6!E:i¦ÚIÚIÈ–ÒËËÈ£†Ùy´Û i7÷MŸþë{me®´�” a"¹±×Ï CȨJL&—M’å@a›V““NÄ&6!tÈ~k ˜`’vÚ]f;J[@™–†Êè±F­„ªž<6šh2Pš`ÂM&œx+ša´šâƒp¤ÄDEˆ"2Gº40Ű˜äÆÃ|›Jõgd‚Jð�§;M)–�•�…ô·"å�ÚØK¥£³RÎÐ6ºÖµï¥Z *ª­xª�'33ɤt2LéH¥ýBg4Bó ‚!Æ Ì‰Ìê(# CQŸ,Ö:(fŒ¢%¦wA0¨XTÂ%�¸MB-Ù°Âa†&t ©…Í@æ�Nƒ(3ãRGx2/Ô$à P\ �r1áB0Âê.xPšaˆDvB\&¡‚4k£½.‘ǪV‚Ñâ¡lqGzV¡汤Ý*;Â0ð‚Ò¥P˜Iô—úN� \.—¤Õ °¶Žôº jÞ–‚Òi&;Õ)B­!^•%¥iV•$*©%¥¥é^•%®ëKGt—OÆ’¡UjºQÕqêÆ4–¿éi$•zÒô—Õk*šõÕRõÒÝ t–µãUùd&ÎÄ£´‘Ø__ëÒUIUk­RÕ-t–•FºU +V°¡I²§ÒJ’KZô½t’ÿ¨„•¤—S¼ŽÊ¿ëý*Kéêµ®©z_í~ +A0º¤¾’UÒ륪ªÖ«Ktºô·iýSê½%õJªºê«úéjõªOYÙìQxõÿ¨Z_Këõ®µ[I*ÛK_\ÉO;4_O­#iMõ¥ÎóŽë¯KJª–•*IŠô˜¢É<Ùåj#©§”‹]T©~=kJ’ýÒI$’Ìy!)½ E?KSë^Žó0à’KA*xF€aÁ‚5´BtÀ¥#Ä[6Yˆã(§#ÆC†<‰´ó™¬¾ý_QÎÌcµÿÜZKWZPéj|ìû +t�–„ÚA䱄E†“z6�d¯ +/FÆ�ŽÎHÖ> £c¼š³8&ˆN„EApõí{>)Ù*=‘-2µ×åz¿úcþ)>êîÞÞ—‹¥ip®i7«kM<Þôƒi:NM„EŠ=´˜h-P‡áÚ ¿î½)„ «˜4BAè`ʲü5$Å# èˆÁ”èœÎ…•4ž¿ûë¿q­ßÞžÿWÞŸ½+§ÒVõ¼Tvà˜m¥¤áQ/²ÐÁÒ‡ý « 6©“É7Á°i„çæ�FÆQáž0‹¶O„F€a/gxÁ2ú·«k·íôÝé7Ö·îûö—·°j¿¦xÕ&Ù�ÂMé0ѶšA0ÓT MõH 4!<Ç6�oG¶�ŒÓ0�`Â5†H˘G°Èl‘ “dC—†2A”쌊wý‡|?ÇßÞ¡òz÷¯¯úß^íw~4½¦úu_دƛTŸ~NÒúM Ÿ¤¬(ut›Ý¤› +Š¶Éž“a/H:M¦‹¤é6�¤å<¡? £[G¶ 0FpÌàƒ'ÂÐ>`ÿ°õaõ¯þ¬=ZÿWÕ¿m{é¸ptßè±È³ïÿäp»xoíÛuñÓ¯­ÿ½ô›qm¥IÿWJÔ[WI†× +ƒ<Ùg á„ áA:…„mWîÞCÃm¯ÿûo¯ÿõÖúì6ÿŠÿÿ�zw¯Ý RmÞé²òý/¾ëI?ŠÞø¤ôÒŠU}?¨®º%ðˆú¶ƒ#Ÿðo-Ûzοÿì?ÿþýµ×ÿmµÿÿÿÒÛ.´~õÿ–9Çý×jÐ�µ¦Úoèkî7ï·ß§_¦•ÞÚººï¨àÛ „ŸÿÁÿý÷¦ëÿm‡ÿÿõÿ†4•¿aÿÿãjÿ豘rÓÞ—ýÔ~Ñc÷µû×ú¨×Oº®?Ãá-àô¿þÛîÿÿöÒ×ÿ ‡ÿÿÿÿ&ý½ÿý_ýºöë¾ÿ¯‡M¼?ÿ–8+Hw¦¸ßûþó×Kÿðÿÿõü�_ÿ†Ãÿÿÿú»àßÿÿûúûî¿ÿöì5öÿãÿè�Ì…üçë›Ü/¯_»îÿ»k¶’,p˜o[t;uÿÿÿzT÷‡ÿÿÿþ¼7ïÿþ»öì?ÿI‡¯üÿ_õÿ__ìéýÞÿ×鯯ëýßÿÿ_íÿÿíÿ¶¾õÿüˆŸÿoðßÿíëßÿoº÷m)þ·_·¥¶ßû®õOÖù½Ëîÿîÿÿ·KïO¯ïúý^öëÿô¿àÿ†ÿÿ äC#¿ÿì^“" 8wMò áéz°ÏWVÙé½un¶Ò�r*½×]]wÿÿ¥ujo~¿þÜÔ›WØ~÷Ã×ÿKÆßÃÿýƒè/ÿë#‹ ­â›A°Oa$i±M¬‹â™·}¶’¶“­-´­+WKöÏíÿv»fjÒÕëK]¿ýµëö÷÷oëí}ïÞëÿÛÐOÿ~�‚b�‚Â==º¨„½ƒÅ4Ájšm¤›i;Ú 6Òm[I´•;a…lM{#ÞÃMRn›[£�­»µÛ4ÛV×ÿ(öúÒ×Û_5'ÿ×ÿmíÿâ""“ˆˆÍ²ƒ +PVW0Ä)XÑæùV*Ã`ŠXAE0ÒM5ba¦ƒ ± +ÂlB´aÚ +×´“lõÝí„�M«ÒîÙŸv•™þ~n®¯ÿZoÎnÝeÿù&ŸUÿJù\ÏB" �…+2² Â2¯;Ñ„$ì44ƒjÚM‚O¤›Èüi±[i6•§L0Izl%½ºéfÃ>µí[?þ“ªÿÿ¶´ßÿß2KÒ_WR¸R‚ šq„ôG+ 2WL0°È£¦ÂI¦ìR †�b“­´”i±Ã 5´ .�Óiv•ÞÙ�¶Ïö­ëþÙŸÓ®µèBD_200ÄOšb >X¦#[Ûb Á&a§{obi°Òmƒ´“M8¤ÕŠ´˜féÃMWa„“ÁézJòl|82‡6;0`‘\QÛ#ÔBž·°•6`‚ S ÓM›ƒ´Ú_Z(p—ªɰ+�Ò²ŠÆ¡† ˜²±¶±KUË&!0H6!(×Ö1•Œ&‡IxˆŠ‚¥Ðt)åœFU¸�ü®#…©Ú[%ØÌì�Êä±Ý;÷tFFC0¡Nâ-ÊUúý=B•X"=�¨Í0ò¦†·öŸ°�¤éKtfF§ÂˆäI?¾­h5*±Ù\¡û8#e/ÔÈ£Ýë«£\*8îWqå:’‘£×È�ÊôIu¿¤IáaèøÁÃD'ž ù #6EX„mã!Œ†D Èc$ÌŒ�CÓ%zëëã�jŸKu ¼$ÃI½5H6¡2y)à©„Â40�d~yšF°ËÁ4�°dºD'œsŽZr%“" ‹YBT�HèZ�HŒYäKV¿¦vk�ˆÿÒÕéi;,ðé6g (A8TGp�m&ÂN6i1I6¨ÎÒp®¢èÖѱ£åÃÖžáÈIšÃ¼¢eÀeFld�2Aˆ“ TÈÖ¿¯ùRþ¿Úþé[O¯P˜…kÔ%„ëK¦ÚZË:t´�&Â6M… 6Ë!6‚ÕÚ ‡„¦��á ƒY�CXhöÑ 3¹?¼P�ŒœI„] +‚Ã'ÄŒHBÎJ¦½=uú‘ÂêG C¸íÓô?OZ»úN—N®¯Šý/Úºþ•¤á–…i=ŸhÆ�oI†“Jm'Ó´¬&š64Ñð0©œ‚ <£F€Ìx@ѬªÉP„˜+$fP"r1“¢<Š‘ ŠŸþ¾F#zúﺻO×ûOõ»Öý׎)7^—¥¯®“[p­+Òu¥¦Õ¦YÙÒmn“²ÎƒhiÏV<(IŽG +'¤ Ó¦�“òlQöD ÎÐóÄ|Â5†�a’y†}°Ñ xŽÎˆÃ„¡ŒˆÎL¹¨a37!!Ò¯¦ÿ¯ñýÿÇ}wÔ^½½ GÝöô­'ÖñxM%Á7‹­¢P±a·…Jl²tEÆËBl ÎN¬´&šÒoé6“ªh&ý a… <#cFÊž‚ã80�”›úúÿ¯ÿÿÿÿðLJM¤ãòÇ¿Õ~¿·í!Þâ»÷Óm^ûï[ ¤®�E_§¤¿Òµpƒ#šM²çI´�–„ÚNË8´˜hZ»Oo¶·_î–£MwéZ^­¤ú' &Ñ.bÚOÿÿÿÿaí×í®¿û Xm¯ëõéëÿüºÃÿàúoÿ§Ýþ7ïýÖ¿Ðí¡RúúªMz¯í$ÿ¯¿ÿÿÿ t¾ÛHƒßÿÃ`Œ<6Ãÿ ÿÿÿþõ¤Ãõøÿÿÿþ‹rHðßÒèå�·ˆþ5½Ç¶�ëýß½è-°�}: /ïðáplü#ÇÿÿÿþÖöý}½ÿoûÿÇØ~ÞÚÿ¨°ôZ~‹rTðKúïíw÷û_ÿõñÿ–ÿøm-°Ûþ—Ýýÿÿûh/ ø"ÇøoÿÿÒÿÿöõÒÿPÿñKDêÿMþ>öïÿöÿ×/ÒÿÿuPï}¨Kÿÿÿÿl »ô ðoÿÿn¿ÿý¿m[PŠþÿþ¿×ýmš-¶ýºÿÿõý%þÿ4Ý}ô·ýÿ{ÿn¿„>ß„¿oÿÿl%õÿø7ú^[ÿ†ÿÿÿÿõ¶³ûwºþßþ°ÿ‡þßÿç:1ï·¯ÝýÿúïAvßÿÃí×ÿÄÿÿ‡ÿÒ +?öÿþÿÿò‘‘ÝŠMŠa˜l‰–ÒNöÊí|#Ž!�÷!Šª»ßz_úMÕÿ¶ß¶ßû×kU�t¿ýý=û÷öt—þÿ¿ÿÿÐOa&Âb˜H6ÐI¦˜b•;XnÚi«pØv› N×1·QêêÒlþ½Ûgöîìüßûj¯PÌ-¾¿_9¾ÿÿ¯ÿïç“ÿÿ»÷÷ïþßú\®'f¶H¬aˆSÃ÷G¶Iëm5ªwnê›H6*Ò’½¤ÚA´ƒœ6ÙÅ6§n^l$ÙÆŸö–ÚRöÙþêÕ?ô»¯ÿþÿ»ÿ÷kÿ³¯ÿ»}ßú_¥Éµ£µœœÈÚ”xŒöVpÐʶÂdbA‘ÐS`Š»´Â`éˆAˆLBM4Ó  “m&ÕŠ´²;¹pzÝ+iü†?ÿ{fÝwúú·û¿ïÿ¬UÄ+™ áœFˆˆƒ0�„ŠÊ+=¹á±¦Ä+M„ÚLRl&i¶’ 6’ Sõní‘A´û#Ì0’Ý¥æ?ý¾ÏÝm™¯m½»þëõé:¹7ŽÀÑC „� „ý±I±Zi ôÛ §I¦b˜¤ÓµA±M5 ‡±lU¤› öÎL3ɲé†{nºKö½.„+•Å3/ÑèDÆŠæÂ Tñ•�„Sà ± anÓ„•à †©±A=Šc‹b˜¤Óm+TàËžëIqƒʤ �Œ¬ˆƒÄ$ha‚•Ð�g A„ d¡'lKi´ý-.–ŽMƒDB!‰„Õ´›KIu,Äá�€„#!+Kªƒ2©™˜JÒXˆbh ²ÔKÃ!Wšˆ2×!Eãÿÿÿÿÿÿÿÿÿÿÿþd”³ h&Æ~W¨ €¼²��¨2K0,  Õ-Z€”Ëj 6ƒT±P�†ÜþWèˆD ̆‰&v­L�Ðh0TGC ȼK Ö�£²œ¯§’À×Ñ‹¯)+#FS²¬‰RHìÑ–²•vÚÏ:ŸUíaü#Ã&,µPä<É|‡eŒé–±ðÃí´×ûý5Ô-&í¤¥÷p©jÏVé8ŠõB£Õ}ô‚úô›KI&ýšdæCY"QZ×Òêô¨~’Ò·I¿„Á#Œ Ô"–NŒF‚æÌû6fl Š×3"†k�góÑÒ8»¤°ŽõHßé}¤ÿtµH4´�kÂÚ4=5UÎÐKI¼§ša4Ók¤}‘Ö•yóITƒÒÕ/´—øzÃÐKÒJÒÒEEQÇ„qá&ÂMz µÕBèÖ«P�3þ» �g&’£«_¯þŸê¿¥®ºµŽÝŽºT–ºVÞ¡ëá/t’ÒA+ªM¥ç’ t¿ÿ¾µZ^µ¥IGXêŠKZ¸­U›Â;…¥ý$Þ Þ––ª•%¯ê•ôµýR­%UOZÒJ´’¿ÕU-WÂtô•¤”h/ë^¿õº­*¯¥Z×J¿ëKIUWÕZDi­þæÄ«¥·_ÿZ´«®¸‚Z­W¥]uKõ_I}÷UÒ÷J’Õ½µI¾•+¥ª¥è™ꪕi*ë]k]i.ëëÈæª*¿Aµa×ZZßK×_úý%ZJ•*‡é:ÅzUécB»uë3«/ú_ÒT¥ÒFZÿµë_ëûZ�kIj´¡ƒZ„—]rê¹õg—^ºÙïw‘ú/î•)åúª/áyRêºúúÖ¿ªZ¾•¢)ÜB†”5´�$Œj·X«ÒK¨=«a®é%«é%X"Ÿ—Ii%�Bª©ª¤ÙdN𪩈P’½´¡]T(¤®´²:=¥î‘Ïô’UÕ*Ib6Âa4ÊÐ&†LUÓa×íUSi]Ò´é*¬ŽÝ$Ò‚5²¸±ƒb""Áa š¥Lmé¦Âê“ $šUè®7!5 ªøzApåsŠá$\œ‚K¾•¤WΆ¶–�lDPVéˆBƒh ¢!@£ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿɨdƒV@ÔBÌ�,!r@]³T�Ü¡rP]¥T��7g&Ã`Ôd ���Ø? SFõ|�l†þ@Èšÿÿÿ�üœ8 @‚#¢Ü, +€È@\l7endstream +endobj +42 0 obj +<< /Filter /FlateDecode /Length 8311 >> +stream +H‰œWK�ÛȾëWð8Ft¿Èiƒ\œÓ+ä² g†‰DjI�'ö¯Ou“]ý %ÙÅ–åewu=¾úªêÏã5áÖZΫ=©‰dðÓT¤¦Œ+Á*Ék-á³�•¡5“FSf*­9¯9’s]Ï»Ï_ΤúÛ°ûÇîÏ•5WþQ^!—œ + + SÂX^QZKŸ¯¸`5×Fm�JVƒZ+´YTRT :)a•u:A‘•\9�ŠfTÅTmŒÓ zÀ`¶3 +*�®)eÔ‚þY% *­­�s[y·³ŠYéÜÖJq©+ �œVÌYiµ; ÿ[;ó¹´„.*yP)lm�•†9•” +ØpFc¸0Ç�ß.žÔÚ +x•[IØ¢Q Æš»Hé95Ä%ÉÙh ÂÈ +î`(!1î·€0VZ(ÈŽ2p()ƒJSS—H›SI�V†oÚ( ¤CQH‡ª4QkH%_ªÿËFU+J -ƩԵ�{lÔAå-H®�dRÕ` VR¯•1 2¹h4A#Ü5ÕëNÀqëÜWà>Í”À¿­“`‡w´–îÎiY[@’kJx- xf6í¬šÔÒ–ÊñuG«®Úýõ°û| �ŠV‡—�óChøy¬HuøQ¦Š÷ç�ŠW‡þâÌ€/¤²5Tü•[å@Ìj†T‡óîá˹ym«O‡{åtVîjK§t,*¨«` ˜ZB 5¿ŽÃ±�¦®}ôʈ»,!ê™÷¼{øg÷Üó'HEðijûi§ÛiÚ§µÇux®ëƒmDU©Ì^J2›FAW©Ì0êºgxãe86§Í˜²°MmÀ´$»—SÓc¢ŒCO”%\%Yãuh#z…u¤}- ,ë{lÎín¹A"•E–<�ÍÞŒÃóûñŽ?ðØ:æLñ|æ©‚Uœïj_Œbµ�èÊp>ýmh'1æ@ ¡ž»×n�YU*³0»š¥’»¬R˜¼CÝ�æÚá£y–d?ÎB^Ïíõmx~DN‘U*át¹�TO¹AÊU½"RW´âÍc¼ÉÜþ¸ FuØ«‹ —=AåøAbX)çA³¥4­ŠCDXZºSáxn®÷ù³y%VÒfGŽ•$Ë–”Ýbè Šp6p,´Ø�ªRé3jÄF ·;66Èè·fºÃ¥ lÀ¹é¿ßèÕi…48ŒÍy—=0�¦&0X%ila.šõ A —“ÁÒ[êØ1LŽ~èSn(g°­ Iq³ }¿„YÆ(…q˜ É[ “°†ÙRë¥ûoHœjU¥2o/ìfÝtÛ»lÂâë.ˤÇÊ¢#ÁÔ¼E`Ô§,Ê,s°Ý°ðPˆ`ò§QTÇa(¢;øs§ÝH¿„ÒMù°o@ÒÝxŸÛ�Ç"rÿʤ0 ‹Ÿ_$3M¯ãð~¹°¬?º*j¿¸F¼Ø3·Øf”]–*õãõ"|�jË· +u�(O<š~Æ$ £y$öHdkXíÓK‘ÿš¢w½¤”I­@\�c;]†>ú,ªTf°& ˆq&­Âå4º1VnS¬ÛQ‹±rŠ3uÔ•Èõ<ØIÒx‚Y,é¼Ä÷Ü(ËAQ!ôqPÜš¨ïû°˜�”ìá�´Ç=[¢ôø°X¥‡·î§ðÁàW°&£ªÍÒÞØ�Cmº¾M Ì˰Þûκ¿íΞêšÛ|g‰ šW©,pbUˆDó4¼_o1íyI:„Ÿ\Púy12g×_aoè®Øó¸ïw( ¯m �d£¥¾W£,HÚà„}N÷È3#*aXÉTTù ¢ÌúVЕïƒAD&Þ§ƒÛf³vði…‹2ÏæÖ¨9CþÌZý·˜õì•%<¸*õñm•= ‹t£÷§´H¢êV°0‰¤Ö:x_ ‘ù€Ä�dÄE¯1•ÂúØà°¹ënPùÓö\oKðqœÒÎÇËóÖ3ú{wU�¸¬ý%ˆ_¯”à–ÞØô“ Ó�—Ц!aöŒ Û†õÚQTGÉ:}kwæä™`Ù·nêžNí]øâÊåa6÷ý!"~kº5rµjĽî�¤ÝpÛe"7Üxî¦Ë© „µ±®æí�,’2|n¿uÇöv&Ó�P‰ÓûñíNØæœø¾4;3Ý(�l_Ò?“´1¼—ÑÃù®KV88jÙ—Ç +A–s'4¡�úé8¶m��ZzOPúŠ÷ï–+é¼€‹þž‡÷þz;Ù"*0ïØ róU‘ræ&¦´p—þœtÜÜ‘8ºK˜XI¤9èWKH“¾#<�¢,2¯ &2™S¸ïåQF`Åfx<5ÓÔ½tít;%±)B»6?Û5Ùê‰wéÖ ©·˜k«»Í}tOamÕÛ]‘»m'‘9ÀB©J l{çx'lÀñ|©œúžš©;Þ6!JÖÅõû¥�BYp?¹E ·>è°·U‡—ùAãWA·ËYÿË@ •–Ú=ir›Ü/^¡»K—»4å2h-ø°Ò»ÔÐ7§è)÷ø.›,‚oÈU[øúSàYœ„(Îü1wI�Æ*[ü×}Z-ÛdÜ&âLô÷‡¶q„»§DÎ5ò—êÓ¿OÀ·§P¬†g#õÛÚœØ`RsfW`<À0àŠéÖˆ0ó´¨ Ýé´<©Uk FAkä´R-D�ÐÐËíÃ�vÑD£ÅÁzla°™ÚþÚõ¯y¶`¸À ÙG;]{ä&+Ç—•±I} ë|£—aJÇ‹ÈàŠoý0¥uÇê¯ïÓ{sZð–­ ±<�šãŠÒbŽ3Z´PóðÄÇ[wm¿~ª±Ìò5º(Q¡¬´dº–’²Y¢ëÂÔµà€òìÞï¯có}?*D(F—Ô„åTmpìúÒm”¦ÁÕóûéÚ]¶Â-yÀ`TPb|µQj–ºZ ´huè¾Ô 0»åU‰$(ù€r(@béϯåÂDöL�3èrÒ–x.ý5î!¸3Dºç«¹Xjã}By}kNïee:W5“éððÔ^?` +—íŽCžøºÀÑ”8 Ç¥wŸCp‰¸ÐÇ’ö¥á®+üéë§U 5òs‚÷5¹ôÃÌ\ZCàKöTÀÔ•æ6±'Å�Mhd +5DJ{~ëúcÔ4³ E/èJ):áôÆÈ îHba°º›±MÃ(ÿÇxÕôÈm#Ñ¿âÛvKIQ”�Sì¹n¼ ,심ÖL V·µzÆ“_¿�”Xü’�ܘ&Ūzõ>8·m bÉ8·²©nCøÆ=÷j‚a’÷Q—�æ +}‹*…r’Už—éüèb¹‚_¤€­‘?vBš< +‘KÛ¡í�œÙ�ø”£ñÅÔçÍÚì@¼dž9 Oç�]�úÓ–Fm*¡‰%ŽÙËÐ_BÄÎ&±â] F. .ª,ñ—ÐOþ†G²�‹©íC÷!€án%wüV 1æNË™àÕf�bªl˜%¹˜€©ü‚+ÂìuƾxDfeY û›Ù9 /´Ê*�å�˜i±Ixì—.ºFÊv>!KYÇïŒ ›öX4²T�\Pl£·yS §ÇL�•Šðë5 É™OJVɲºˆÌN8n°?²´4šG�Tfk…¹K¼(zÇ⛞‡­™RÛNæû­–?ŠP8þ鵜&JþÍ–ïÅKl–tæ{-ß¹jRÕÙ!.ùQ¼ssÞM ú‹·�#Ðê• 8Òòƒþw“G»§ßƒ© ÝÕ»;åƒ�­£#s»$MâèH™4‰$…5 yæÖk“/W¤Í÷¹íRŸSYeñ2 ID¡”Å DBC€'=+"·?ñVŠfØ1 gE¢t�ô.ôçzÌï~€á]§xÀm�E_™v,b?€8iTlº'gå¥VodÂÉzƒTa˜€ ±=ÔÑ &vmŠ©âDÇÓòH¾c7Ä¥"òÛL^ô6„)î– +€·A'�"reíåÞ—2Dÿ>£8¾jÌÈüWlà§BÏÈÜ N( áJÁ¨hø)™ýpa"ó².dtr�’µw²‚}È0רt�Òí“�¯K@´Ž¬VѲާkï ®¨lï/Ãó%� :DqÏZœúƒë‘�¾1@âEÚ=­.ý‹�!Ó>d+“<�ÞŸk^’ÛÁ¸yÍëÆƒî "l×=·:»] B+ƒ2?rÛa˜êãRRÿƒ“,µÎ¾Ý¨I¸ã(‚·Pxj£º€Trû¾/ö_D•Ä£Ÿž`•n&µ²æô´L×x“uÊh¶ÿ «QÆwÝ=ÇŒzæ,|GlØ•%€×A3sš¹”GÝýbÜBDÁ›´s‡ž¬üþÚ 6kØ6PÔdö}ž‡[;&—‚vcø³?È{œ˜{éÿx ‹ñÕŒWÛSHše.)É|cÖu„boÖ.b}NC� ”`£J·ñ9â>EŸÍ¸þLÌ&Ë@A²­à¿Ö¢èUSa€‡ÈuNÈy<‚ .b0�kwÑM +-…‚'H†èvÜ ™-H¶Æ +̰*ò¦ä».÷ç+Á쇱ÐL�~Go vBŒ6˜àñnºÆZ'Ç5®ÉÊCn)Ø~î�¯mctÆ`ÓÚêSqÃUrÎ.'†È6ƒGoéçqè ·Æ\sudã ÏŽ'–iž½Ýrá¡´ï5‘èž « kå҉󴮉kÜAŒŒ‰¸ƒ{äatìö2�/1¾´ò܇íé7íççitCæê@õ(¢z�:p<OK:›·�$DBšc>%‹ÉèxÛuÓã¶'Î=?Òþ÷×þÖ/:&Ä”󘟑¶8—Z†"ÐÒnÒPÿšÔYWÔ»»Ý]doa5«Çl¬]9Û_Â$ÒÊÔõ÷{æq SûOJ5†å²±ô=Oi>ÀО|~$PÇ +Û³·¡ÏÉXñ©vZý’ýñ@Í«·˜ªö鞊©ó3¯¸#µÂ5G@ô•LH´ >]…¢kàd¢:]&Ÿö1;ÂÇk?ŽIš¾be)‰)B¹%%/™mÓ½©�6W:Îb,àÆ-òÀ~Ù.õ ô1X+(4¼NŽg£Aùj¸%ó/ +õ·JÃõ�qµŒ™ò‡æm[¶i�‡»Ÿû'oeÜB;êJj°¨ª±ÛÐé“ÌHMÓ³»oõ¼1œ(tk*X^p5l„ìÊO/íøè“íÔ CX�éiíñ°²pëZV`„Û €hx|¿c÷E^õÄVÆ7ü;µ}ÇÍ=9±"E( ù·FÜ]Ú¥í,ÀH‰ìµI½¯CwOfIyj˜�V– Ââ/Gù‘Oã|öËÐõ”aÇB™Ÿ°ÚòÓOß#œ“hȨêÔmõßï·Yè0TIæ/ÔAüà¶ÍÝ4ÚFïªJaíØ+ûJ)¦5©^”mmÝžîCèݯ±6z�ë£}ZUi®Œ‘&ó‚\µç8õ´Á´Ü:«½nfª>}ÛîK’½^†ÕxjvzÎý{2 qâÀëtVTë¸Tj¸( ðŠìÜ ˜'KP–VÉ~»Eç�“*ØÑçÍ`þY]†½Ú¯ÔÎ…¼RÊÊ<€¦†Y±€ 2é!ŒÇa’) �§>U`:z²1È�øÕ�øÁ²iVl ­-ú«rœm*ÎéK7 Â{L›"oDù.;Üæ²i’Û=a#"E3b&¥VÒnÁõqwÐÔÈ7�Y‘Bùo+"í9𪰛û»—@<ðht@é¢HPæM�"Ôm!t½@,/Óx¦;:óR…øÛ‘ÁcñjhÞ�ÿs^-½qIø¾¿BGð0löƒMì)�C>l‚Í`÷ 5Óšáz†œ�ÙÊA¿=Õdwõ‹²w÷bа»ºª¾×¨ö ‘”Z‘Øà +” YdÝ©ˆE|B]³¸Î v×ó£YÅ€è9±¿°Dÿv¨ v˜ˆÕ%^:«gÌ +¶N?(ch –âK‰eÎ îîãyÉbAеè-Éq1d©45£ˆntÄþ*JCì‹Êx'W&†PŽ”èßâ(«\‚“íÉ©í…\‚¢>Õck3½lÆ籋0 ;»VGkõ‚‚=×0bB–¦g œ…Ý?<¹LŠd:ö—£v›$`UÀ0�>ïšiŽÄÎj:öû•–4j˜� ·dh…hwÇXÖ šI'L½ÆÜ=žå¥|Ûi#/Xà–ÛÓ麘ĸrŠØw•;x8›5\fFT·ðÈ[µ°ßé8ªBdß0;qßðÀu�߀}âEöÓ :~=ÓåâU�¸Ó˵ñ‿ô�œŠe +d�N­Œ�Úm׬iÿZÑ2eÖ¥öš¢#òw©‹£{^Õ_ ì‚âxM�)sÂíZŒNp€E$3k{^-éÉDX´¬1~ÅTÀHƒÐ6Æ8öu  £ +F§è½°Î$°ºîtÇ�ˆ‰o! 4^j± 6ÒeÇöpTC´aÒu6]Ë`yîWH:V?_ -ÀÐa;·Bo5Z„~sùmhºRX÷ÚLö78‘ Üà `‹qmªÀïø>@rößøä‚7|!,¥¤М1o†��Å>À»óêp0` +8Gkà×vÐ1Ü`^Rå\Ðä%¦Ï·ÛñŽ“RLG|-â:M.œÌÂhÎk“ƒÆÑª�'f +uëuQÝä쪹UäR¤—"a9Ιa’G+½0žñ]ûô¤ÕMÑ14—›¬î†£pPaY£»"¤Y(={šc`‘=BÖêš“±ˉ>Ù:¯k ²Z`Ck×ð~\1|ÌVm ¦"´º,/ +ü•–¦� è…ì²Oe„ÉÀF†-•mÎïʣʽ‡=dÛ£Ò¥×Üu2¾ÑÁµI|‹ŸyÆ èüÔ {=B å9wìÐ'g Z²ñ¢v§§Œ=EYûƒR_›ÝtJ+vÇþË7„q…'(å-&lÏ*ä‚nŸ€ïß«7N€×£÷S�!|áà +`az¹¨˜q|¾sŒã²—”)ÖBÁ+íç?¯d7‡U‹Ý,H<Ô»XŒahã׈@ç}M¨5Q�bÙ;ŒMô¥^�®ðVàÜŸN Ô<ó K¸‡L§È‘¯½5vf¢¢Žù4iQf}§¥~]Ö½Åë«•%¯ÑÀÄei̪qûÖ§fž¨=¥V¸‚‹‚ç¾´�×qófÈ!n&¹ÊߥEÆÿ§^̳‚¾hÒ_:óã–ü^Þ8Ÿà#FøÜðá¥>´¸!EN+~ÃDÚkWQÆ¡GÀÛ3¼;gx±‡àÍÐ+<„ÀYÅòš×2:ÄbIR`%ššô!Ä/EêRjmÄGq)".Å�†q-¼Éª€¸ÃSžp!œG{#±é#ö¶?·“ +0ƒ9ñšºÖåví²ûnRC7OÈF��ÇŸ5–³óþŠÃvÕn?ßß‚’@„üãŠu£±!¸¶öëV±uö�ÓV�>_Ž}çµ$à»~Ÿ²ÛÛûíöÓù)…E뻄¡ëœsûÐÏ]ÿ¥ UÙF5c4†Ùü,ð×÷:t<²C½,ðôwÈÌ�„ëC…ÌäV´€áQŽ<]Ùã·v‡Vˆfƒ„§ ¨8zKS$’€_Ø £`4 Hx"‹G’ Šiƒš|‡ÜÓ3Ë…¤ñ6ÞCqß«±=¤YLÂMÄc¤‡¬³4²‘ÆsmXšT‡æÁ\ì;ÛñØð“Ø1câpòÌ«ù�2¯–‡× q0Lºâª¬+ýn6¿ûÝÜß½CPX']“°ýTóPüuyÓ«Ü€�~˜Å?“~W²W¶)_óÞp +µ»=(p·ÙøùEY%Ï7ö`ê¬Ë·LýCvi†©Ý]Á~it”%.C<ØáÂöû.§6«ùI— Où×Ë�wÝ{­@QR4¦‹}·,×—c«mÓìÞ}k*¥Ò¹y‰š_椰�}LŸ!©jÐrò2\w0€ +RÐ ­»7`ª·yñ—~³;µ ´ãLâ‰4 y_³`Î%ùQ~ž£äÉ6º¾Êòû™ Ì:©�«Ò¹aaîü�}ÛÅŠQBáÖjüzì§~‘Ÿ]tHF)ítß½¨AçÉM)„Ïä3€µ*ëM5ø• ƒƒ7*fPÒÊI÷§ìã¯ï?|úá{œ©õ^Éç&±]–ͤ£=IAÎê\àÀ~¸–ꬆƒ·é¨û„aîÓªMh¼\è»·ÿ¬¶œ hª'È”Sš8çnLýž¬š­XC+Ç©Þ$ 7Iè7g¾9Ï~M×þ9æ†K ˜]ÎF�Õ!¨V´²_&àËpïûåû³åDäU}»â/×—ËìVYÕA¨–21ûš|Í#¼åu)«í;üƒþ­ùK=«!z ø¿ÊnLñÜà u€ÐVcæ‹?ö�Úeèw6x[ÌO¶ØÒßâ+™8Bø± +Äš50ÙÌšÉË5ÌÓNÀ„6 �“Y‘cžj¢+мbµ«àr�ÔÀ  öÙs1˜Íz3~NËeÓÆKŸð�ïžûÓ³“G‚S(§C:*ø§z>Å¢…¥ êÜ?{ØÇ™c}€ß쯙n÷¢©°ÙÓПQe \%˜öDV£b�|i¿ªSÂe2`“'¹k)]¢ÙÒ›\V°ÑÚíÁsÂAKõ&ÿô?�xL€Î†GL/Ý»Äq æaã.m8øÌÅÄfF_‰D¹T3©x½@Ù쌛n%^€"xíS8•¨�Ç×Ùc›F&Aì +�TqN�M…Òg¼Ì¦_³kº®Ÿ<â`ìµiÙ€KÍöíx95/jÛ�ç æ¿oµ›N/O¶®¨X¼CD$QÛ{û ¸‹Qׄ¸Ñ I5í|']=èš~†)k)‰e¥½BjÑX«y�Š+GФø¨€6céWÆ0Rv/ÓqM€)çˆÓ]ÐBõhì–7xž×•½Ë³˜ô¨”X‰ù#�ÿßá`ÀÊ À.n`™€ñô7-šè‚¦ +eÐ#·:®R€¨Ãò¯ÞËÚ`uF¯ Ò‚ß:åb(€Dsíµ§~D˜BMá×ÿès†pw@±d³j> º¡µ�UÁ×? Ánj‰×D¶|²¤1B4¿Ä%“º&qS4Òå€Ù,,‡è™³a+¥]‰�ýu°Vçýöo á©fuendstream +endobj +43 0 obj +<< /BaseFont /Times-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +44 0 obj +<< /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +45 0 obj +<< /BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +46 0 obj +<< /BaseFont /Times-BoldItalic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +47 0 obj +<< /BaseFont /Courier-BoldOblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +48 0 obj +<< /BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +49 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 56 /Subtype /Image /Width 24 /Length 355 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ 8ÿÄ<!1AQa�q¡Á"ÿÚ?õ6CC£Â¡sXíÂÄgì‹·n‹GÜsÆÖs5qò`£_³ÙG6µ H$‚%ÃsùUh@ ó"Ûºº‡sõ,™Ý¬ ˜†&®¢ÏZ9d¶hÌÛb.ÙC—4£ÓiG@Ý<•;ìØ-ª¤‚÷À­OP•§e…jõ±åƒÕø,S¦ý·ØPP9-ÙÄ+VÚÏê À°=ñ+GË`�5&$ïåÿÙendstream +endobj +50 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 12 /Subtype /Image /Width 16 /Length 254 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ  ÿÄ8!1A2Qa"#ÿÚ?§œÌ0ùDô$˜Ï»{eÔ’åŒ/«�/|É?%Y·ê ^ŠÙ\4ɱu²Ä“ßo)m{›)þujëÜÕ¶fuþÊŒ&ŽÅóϦxÿÙendstream +endobj +51 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 28 /Subtype /Image /Width 120 /Length 500 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ xÿÄC!1AQa‘áq�ðÁ"2¡ñRÿÚ?ú”I, Æ +¨–½k‰g諼‰ê检 & /(³ù(7=¾Ó>ÿº»èFà\a´ +›…C•‹ƒjXW :àx¯ˆ-bA'[nÐú)þ{ƒk×h†­r¨"®Ñ¨uŠñòÞû¶³€K�¸e�±uèkž1SQ?px-ô¨x_~XŒ·FPðÜVÍZl(äŠü”· ˰¬¿ÔIrí ,�ëò‚Ó�Ìþ ¾+cŠÁ‰6  sŒ°Í–xkzrÖ?Ř®k¹®âX™Ñs¯Ű«g0aÿTü6ÜK ’A2p‘å^:Z”!«Y$ +á%þk±B�è“ÑôIéñî�諈ÇQñîŒzvò£�¼¡§o*±Ôvò�mGo(ÖÔvòŒu¼£²­*´£J‘¥FUTEÿÙendstream +endobj +52 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 80 /Subtype /Image /Width 104 /Length 1350 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ PhÿÄF!1AQ"aq�2‘¡±ÁBÑáRb#ÿÚ?ô¼žC"±WÇ*¤ÍàOZGɲqt-��.`HžïJCˇ ò#Jrä»C˜“kÒÉå²ÀŒ9X’-ÿ™ÿ/Zß&X@d)e$¹‰�¥`¾R«dÁâÀ\È’Š@ôš¼9Ëåtäûy ªJƒ»MuR¤Æ×7ý!8›‰U'sËC÷oLæÊ!±òò$_X½6Cpø ¿Eàô7Ö·í�©v’E¨6".)¯1-m©�"³|I�‚Ò8èA#]t«UUPª Ú�Rb–m}…!Ĩ:o}¨,¡yt¿SRQ2¾ü€Ò²o!pÊ*’xÉ+ǧSBxÅ ÈVç¼�E€m·‰§‹ÆÀ_�8ÄbÆ�ä)áÓ'¶Ü ¿!]ÑQDRe䌽A�b¸XÀ*ØJ�[ÇáP|0[™‚x°ÚÅŒˆ•:mjo…›¸"‚ È=ÄtûEhs•n.¼IRÂûïR|‚?Ò@&w-ÄVŠîÍĨòAÓ¥ kP¹Ë/"�¦o#c¤<žFnÞFà@$�ýªþG€xk2AÒ(Ç�ñÑ­opô5­‰�=*C>ë¥ê~f‘ÙÚ`;š•òñ*$2†™ˆÅhqc&J‚b/Ò‘ÅŒˆÖ6šj¼dÌɨL*š÷këñMpâRa@, ût¡qc[*…©��ÙK�=΂´¥Fש Œ¨âÈ ¢“q;ÜÔ| äån@  οµR/{9—2ê‘YáùCåùB•$‚&ü¢ä×67ɘ(˜òŠ>Šy°­ÛROÀÃ\�mÛµP‰upD@årmÑ£z®9(=Ì"bÒ'ý¦²Ç‹'ήÊÜ@h$ý²DÜzW]*M殊D èk$Âˑۗk*�ÔqŸëHx¸ÀP»#�úO§­RaÐcWn*¼@µ€úV “+q$�rqä@û{.`޵x²åÉ’!D‚".=ýÅHwTrÐ6nÛÅ> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ hÿÄ/ÒS“ÑÿÚ?¢ëpň{ð5¸fÄ=øɳbü tÙ± +… dÙ±e tÙ±… dÙ± +… dÙ±… tÙ±… tÙ±… dÚ±… tÚ±… tÚ±…ÿÙendstream +endobj +54 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 824 /Subtype /Image /Width 9 /Length 917 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ8 "ÿÄ^�Bq213A1ÿÚ ?ú©‚üìmÉ‚¶&÷þºäó©h7õ×8<éÚ�zóƒÎ� ô~œÿ<óŽO:v�Q·í§¬§h6ýþ~Œ”´ +VŒ|ù3RÐhÇÏ“5-•£>LÔ´1óäÍK@¥[?>HRÐ[:I +Ú*ÙÒHRÐ[ZI +Ú*ÙÒHVÐ[:I +Ú +U5¤’­ ¦´’U´•MiÆIRÐSZI*Ú*šÓŒ’­ ¦´ã$«hªkI%[AMi$«hªkI%[AMi$«hªkI%[AMi$©hªkI%KAMi$«hªkI%KAMi$©hSZI*Z +kN2J–�J¦´’T´Öœd´ +RÖœd•-5§%K@¥SZñ’U´Öœd•-•MiÆIRÐSZñ’T´ +RÖ¼d´ Zñ�VÐ)Kzñ�VÐ-ëÆNVÐ +æúã'+húã"­ 7×9[@·×œœ­ R†úó‘VÐ õç"­ R†úó‘VÐ õç'+hs}yÈ«húò*Ú(n§+h9ºŠ¶€PÝE[@7בVÐ +¨«hê*Ú(n¢­ ¨«h¡¾¼Š¶€n§+h®n¢­ ¨«h õäU´}yÈ«h õç'+h9¾¼äU´†úó‘VÐ õç"­ R†úò*Ú¾¼Š¶€Pß^E[@7QVÐ)CumÝE[@¥ ÔU´um”7YmÝE[@(n¢­ ¨«h¡ºŠ¶€j¢­ R¥ª”­ –»òR¶€T·ß’•´×~JVÐ +–ûòR¶‚ZïÉJÚR×~JVÐK]ù)[@¥ ÔV´u‘VÐ +¨«hê*Ú(n²*Ú8R¿ÿÙendstream +endobj +55 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 8 /Subtype /Image /Width 17 /Length 178 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ÿÄ.A¡ÿÚ?©ºN"öëEWPø‰vOÿÙendstream +endobj +56 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 824 /Subtype /Image /Width 9 /Length 965 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ8 "ÿÄ]�B2q31AAÿÚ ?ôÆë!VÐë!VÐJ”¬…k@¨U´ƒu�«hºŒ­ ­Ôemn¡VÐ + Ô*ÚÝd*ÚAº…oöÕB·û ÕB­  Ô*ÚAº…[@¬…[@)Zýê2¶�Zýê2¶€RµûÔemµûÔem ÕB­  T*ÚJÝFVЫ!VÐ + VB­  Ô*ÚAª…[@¨U´ƒu +¶€7P«hêmn¡VÐ + Ô*Úßç^B­ üëÈU´¿Î¼…[@¥ÿ:òm7ùד•´ +W7ùŽ@­ -ëŽ@­ R‹zã�+h Zã�+hõÇ VÐõÇ'+hsZã�+h Zã“•´ +W5®99[AÍkŽNVÐ)E­qÈ´­1ȪÚLÖ˜ä +ÚÖ’*¶€S5¤�[@ZÒEVÐ +f´‘U´ Ö’m¢Ö’*¶�šÒERÐR™­$Um5¤Š­ ”§kI[@ìé")h3ZNRÐ;:HŠÚNÎ’"¶�ÙÒDVÐ)NÎ’"¶�ÙÒDVÐ)NÏÏ")h(ÇÏ$Ô´ +U=þy&¥ ¯¿Ï±%-•_ŸbJZ +ûüûRÐ)U÷ùö$¥ ¯¿Ï±%-•_ŸbJZ +ûüûRÐR«ïóìIKA_ŸbJZ J¯¿Ï±%-}þ}¸$¥ R«ïóíÁ%-}´íÁ%-•_m;pIKA_m;pEK@¥[ÛNÜNÐ_×NÜNÐ)Z=5íÆLéÚ šçŒ™Ó´ +V�MsÆLéÚ šöã&tí•£Ó\ñ“:vƒG}sÆLéÚ+G¦¹ã&tí�MsÆLéÚ+G¦½¸É�;A£Ó^ÜdÎ� Q\ÿ:vàŠ–‚¾ÿ>Ä”´ +U=þy&¥ £<“VÐ)T÷Ç÷ «cùýƒŽÿÙendstream +endobj +57 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 8 /Subtype /Image /Width 48 /Length 351 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ0"ÿÄe ’Òð!AQq�‘±Ñ"TDaÿÚ ?êAÇwt¬íƒNˆŠ M<±[ “]4€xûU +9ÌOÉ%¸ï¢$ÐÍâ~WÛe壉?˜ó{|¢$ÔÿÙendstream +endobj +58 0 obj +<< /BitsPerComponent 1 /DecodeParms << /Columns 1904 /K -1 >> /Filter /CCITTFaxDecode /Height 2944 /ImageMask true /Subtype /Image /Width 1904 /Length 86622 >> +stream +ÿ“pâ½LìR+ŒŽó–ú3±6k�Hìhen ÈqÈì«<Ó;Ä3F4ò°3̾Ÿ�rgjxü_P¥LñÈ1´¬hVñ»�Á…B#}a„Èð= ×Íd¯îȶù¬•Ýý>ÓÓZ[»í0Ú"�;ôÕöÅñëÇßKkï¥øþÚÿãÉÛ0ˆJB50¾~.išAfBxe¶ ƒ.)00@ð�„ ‡‚у6hÖÑx4oÐÂL0‹Æ‹Æ�tp¡`‚1Úª.èØÂA‡£cCA—\•hÖôl„\4F8a—Õ5‹Ñ°4Ân‹°Ñ­Å¡hØ]†pEúa£[áÕ…Ö’½AU´´­]\$miðI' +ÚW«aA& ° ˆúÕÒl ëôaAã’�“a&ävÁm„¯AZN ›Iÿ½ikzL”iµt­EG§ßK^µoK‘¾�׺õûIõ‘½iÞ­¿JÒ¨OM«xVÖ•mCöŸ¯u[ö—J•nÝô¶÷KTÒ½S¦ŸÝ§Kî·Tœ4ÿª»Zª¿m}ÞÚNÿcÿãŠqJñŽ ßþ¿ŠßCqƒ­.)ÅßÔŽ‡�Ý'ÒýÐáÿ×Ñ',a' ÝQppÿû]tCÏòÿ^ÿ²c¯ßä�Ñ5ÿßÿÈzÿ…n±ÇþJ¦Ãý½ÿä´ß%_ÿ×a‚ÿãÿÐü–Ÿÿû¿“¬?øF~¿ÿ†ÛÿJ+ÿÿÿðF~ØF�ÿÿÿÿÿû¥íÿ m'ÿðàÿ·OÿÿÿøAx:_úÿ÷ýÿÿï^ÿ¥± +þöÛý°•~ýÿëáÂ_ßÿÿ¿ÿÿ¶¡×aÿëËp_é{ºýJíöþßÿéxt¿ÿÿoí¿û®ëˆ/ÿ®�·íí¶CÜÆÿ¤SÍw_ÿúùÍÌ=~ÿÿõÿÿþ‡lè¿÷h4gÿz»ºÿÓOÛ†ÙíÒÛ?ÿ÷é¯W}íÁÿ§¶½³4ßû¥½îÞšiðeÊCÂJ­¤ÙͳwÝZ§ ¿6®6Õ´•†ª¶«¬ˆï¿ˆj¬Uªß"cIm†³’ö­ÖÚRûg.©¦©´ì6! Óm A +ÐV‚M4Ã~˜a1 ºA†)4ÓA ÓM¬'ar;IÛ 4Ó ¦Ó˜MŠb“M;m$ÛI»b¥N|Ïy­´.Rß=°Ä ÂaGB,Ëv¾“dì  Œ%…s¿šúÛA‚šÛ¦•6JYÝßm¼0˜Wá0Ä+ Bl&dVhQØÀ`¯ 0帚rl�ˆ0¬D�J7ZE\jRsè&Nè$½n½$¿i6‚º†)ŠJA„… +?þHhhȱšSü�Õ¯Qh{?ÿÿÿÿÿÿÿÿÿÿÿò7–‘’–[­_"¸²…PP¤ �¥ ¤F+lËS‹sHÉRèðùâ©÷™ÙÜ@�fšGar�‚Án¢ÒBû®½ Ÿ¿ZékôÓ»ÒMõ¾ü™/;0ŽË¯*Hr&¶¶½Ú­¯¯Úú÷ŽwV¯ˆãô×T×]}qþks5‘R ²N5!ÈÂ"¦FF³És dCju"]�†¤ ˆlŒ�2¬ò ²ƒ5 HÙ’ù³š�ÌÈ×)ÌèjBD›Èl‹"?Ù+^Is_’´jèöð�„hjo‘*^D f€Â8á¦3Xf‘sÎ ÓA„l„hi˜aØ#8h„™­„xÖ‰2 ŸšÃî Ó0�„k5M ·„k1†ˆO3“óC$A$ @Œ;Šƒù Ƴl°îG€ÁFé:»n‚42|Ù°Â!`ö{$žKÅàHŽò_6D1�b“£„F³dpˆc$ †!Žâ$ +o=™¬¸Îƒ œRœdB6GQ˜,œPDZ¤øF¤h&ô ‡ª $…¤Ú¦“¨A¥¤Ã +I†“zL4›§Ðv“iMFv“|&ô› ÝSH0Ô& Ü�ÚÉŽ’uMv�m% +“¥¤ÃPA NgÔSØA0 Éå ‚.ȺÚa23P¡0�Œ#Y�0˜MÛ#üCFÃVha!ù4ÓT��„h£ã«Ø6–¶Ì16˨3…è—4›Pôè3Ì ´�CH-'e -t¶c²9¤ÚÚpÛI¶]jô›JåžA6™ãT®6ư™âÐV“ªV–‚må\+-0˜i:MáPg�4–g *#¶��-'„Ú#²ãÖ‹ÃpÿPÝÿãÿøþ‹ŒGÇ×´[’I‡oÿè‡I¼?þ¿uôµúþ—®×ÿÿKõoúÿaÿ¯ÿŽðýºÿþ¿ÿþ?«u¾<6ÿo–)`íÿÿúïëÿúþßÒþ¿ÿÿÿþÃÿýWü0ÿVÕÞ—ÿÕºÿ_ü+ ½ÿÿnÿÿðFø#?ÿðF�; þK²;ÿÿÿÿ×ü7ÿø#ÿÛû§Éq?í Fÿåºÿ‚0öÒü6ÿäjØpoÿ¿ôýè/ïýø@°oíÿÿïÿþÿÁ¾¿ð�ø7î¯ÏöÕÿüÏ´úOÿ£Ü6ÿÿA`÷û¿ÿKÿKÿûKí-ÿKýþÿþ¿ÿßû¿K¿½ÿ§°‚ÿØ‚'ÿð�a´ú Òý,8ÿð–‡ÿÿé}_Kÿ¿ ~»û¯ý×ï~Úþÿïÿúïß¿°Êµº_üäÿûép†ÿ l>­-ßÿ®Òßûo½z¥õz¯ßíê­®ÿië¿ÿ÷ך'ïmý/úÎ'ý{_ü*¯ÿ®ÿýuÝõýw]ä?þî×ë][×÷ÛõÿΟ{ûuÞÛ~õûzúÿ÷úÞßßîõÿýÿê­þªþÞ§7!¯ÿ®üâý{fi³5½zV½Yÿ´ý»olÍkm™­zÖÌû_ÝvÌþÏíßi~Ý×·_¶Ú÷·¶h­¼ÿ{v½ü…Oÿ×ÖA&ÍÿôÚ¯Ýë¶hµëk¦Ã +à eöÒí(2åi6àËš|0G¶qì0²+†åæYô²õ¶ H®ôöÒØa-°“ Ý—¶ÒÓM†n´•²ö’êÃ77k"Ži¶ ^c¤í&ëaÁ¯ìƒé ÿý„aÙtðI~ÂuiYîÂ0ì V–¿}¥¶»„­ºM6)Šb˜h ƒÒ„ö PA´é„تbA±M;˜¨]¤Å&…„ÓM´A±I†)ŠbA†ÒMSb‘Ý„�q +I¦ƒb™z Ù,RiÃIÅ? …šL&ƒNáƒi„A„h8„Ãa†)5 ¶ ºa Å1 ½´¡Òv˜OA&È]Ca�Ô2^{h÷ `˜AŠŸBi¨‚ $x°ªUåC˜A…+!„ 4 &š S‡†A©îO£C BžØ0H®(á ¤|aˆH¬sÃGÈ0¨1jØLQØTй<A£^ÓA¡ =²|20Ü*h1†MJ¶�žþÚiÌþÚ¤l°®ïʱU‹#NEú÷“a4Ó"ÐÈn–Õ¤Êðs!ÑC;HŒ‰!ú«…uÿI_×¥¥ÿÚZ_\$ÚM¤ö¡Xdta„‚¬&ƒ¦ è è¯r±°„ZšÜC)7AÿùÙó°(ìÖ-Ëåt¸’‘ÜfE9_¢%•ÕQn +¡NÓê§hÎÒÄ3‰d â +á‚‚“äÓ +ìk;I‚�Š£´´÷ö�Žÿö½;ôïA¦·÷ÒïºBïîÿûýýzÿ_¯ßzù«Ç*«;-Tâ9\/ÿ&h|G;RCÿ]q×ý^¾ž·•ê^¾ŸéôD¡9A!Œêóu"tÙKæÌ¤58ÃPŒ +EYóÊP�Ʊ” +P�‘ R�HhÛ3M�D&L †,‹B-Dh#<íN4Flò¬eRÒUM4Óa˜$õb–ØjÚIØI4ÕƒÓb­´˜á˜4ÂlVU pÛd|ÓVá°ôض-0ØKKI4ÓoA&¶Á‚IÃKa “M‘kzpØzi¦í¤­0Á+ ´™ ´ƒšhîÐA„ÒjÂÒL1L&˜a8a„vž·M'jÖA6¸4iÛA4Ø@›h Âiôà A]´ÓÒ¦�Öi²8LŽm ´‚Tîí% ¦¤Û„Ûi'p•;§¥Né´¯bC�‚ !•‘ PŒ¬ˆÑsgÙh3³&"" BA³ ™^�@ŽËT¤òHŽñ—<¹ˆŒ£è¹’Tk@Éž B5¢‘$#’´"53�[‰2Ì „Gq¡¡W¡ÄGé?¤ÿ_Zõ®—úþºUû¯ºõêÃA{h+ZÛGa0› ÃN¡ ™t(4ˆO–âêSs2�ÎÌ!ˆˆ�ÿË"Vv£+¬å—’Æv4ŽÅÙ—%Ù`ÊéL(()n+ +Á3±ÚC ��˜Z„xªùœ@£µV¤­…Ôî-s³õiÝßÿ·wßâÿÿï½?ýÒó³þ".ÂÉWíy*DÚçi÷ü¯@±ÿ;«ÎÓïw�ýuõ×_õÒKùS¹ä•em*•�rO ˆÖˆùÝÅ;*‡��MHº+yj@³»YP—$òT²'‘Òå+U*4ÔÕåFUQ\Õ,2|ÀÈbâ"R(B%”#8D€„èÛ>)›"6ψtd|)ÌŸ:åÑš<�"&Hf""r<ˆL˜ Fât`Íq¸`Ê382F`ahHÍ�FɦЕ£Lá"i˜ç‚øÐFO—h„™HEâFl‰|»S’ ¤dnD&L ‘dx�`‚0óHŽˆð \2B6h‰Ó”#dpdñ¹™00Ah„ ‰0‹¼àÌãq›"b%ã 0>ƒÑíªhØÑ±èÐÂ.Ú=°ªš7SMh4Õ„<&x·[ôÐM¤-úa&ÓM(i6…„ÕU&Ô&–©2>/j®ÂzN¡tüð“zi jIµM-&ý4…´ÓVô…‘ô[MO~ši§Oºi? ›Ã¤Ú„ÒlÎI‘õ8DXxKDvÐM ›e§N‚l% Î0��(a 'A› ž“a'é8I¶YÃ<Òm&ÙggÚNô� Ú'Áž0™â<Ò „ÃIÕZH(Aœ6Z0¡°ƒ8A&ô�–zM ÎNƒ<Òt›eœ3Í'29¥é: °ƒ#˜VYÙö›ŽÖÛµ´î­´êï»»þŦûÒ÷¦éÒÝ÷[÷ÓhÝm¡ÚiïIëÿÒÓ¦×uá7vúÝ츟¥i mz‘¼.­Ö×õ?Ð×ýHáô…ßë~·íýõ#…Ý×ëõß®µ×ý¯õw~Ÿûý/ëÒC~ ûþøþ‚oQÿäg�½W_òÜ�ÏË�:oþFzÓÿúÿÿÿ®?tÞ?Ó}�õÓËŒñÿ«ÿÿ‡øþ>‚–9NXŽ�Ðÿ×õþ¿×í!ÿÕ×ô±þ‡ÿH}oÿöý¯ý/××õõÿúÿÿÿØÿëˆõCõÿ×ÿ×ÿõÿ¿ÿýÿÿÿÿÿ×8?ÿõõ_ú_ÿýuõÿÿöá}bÿ÷_8/|‡ÿøEÁ~õá?ÿÿûÿÿÿÿÿýºÿÿÿÁ{ÿáÿÿÿ‚0ýºÿÿðßá|èÈïÿî¿þ‚ÿüBøIÿðIÿÿÿÿÿïÿÿÿÿm,ïÿÐOÿà—ÿÿÞ/t¿ÿüü#GÐ.[¿ý´¼¤ÿߥz ×½ëõßÿÿÿ×ÿõÿ±_ÿûøKÿø_ýÿú^Å_ÿþïé~—·ýìW}t¿¿×Òþý/÷_þÿ{ÿ~Ûÿý×ïÑœ­ÿÕÖ—í×¥ýý~úú6¿ÿýÿKõû¿ôdÿú¯ýiU¯ôÞ¿W{þÿ÷×÷úÿýþþ�ÿ»~ºú¯¯¯ïëýézO_ÿî¾—ëïûéK_ݵýµ_ÿ]iêûí¿Ût¿öÞ¿ýëï×ÿþ›­n½Wïn¿ÿÖ×ïÿ=ÿýÿ¶ßÞ½zÿíëÓ¿ý½{®Õ¿ÛÉ×ù¦ÚþÞÝ¥ÿö—¶¼ƒÓþÙ§êëëî¿þÚ¿ûdëµÙž¿ÿúþ×½vìÍvÞÈ%?Il'ì3êÒ[ +ÙþÁ?¶Ï]‚dJÞ›M½†y0Á&Ì~à 7M—½†rÛ=6½ëî’Ûv›ýl¼Ã v‚nÈ® ²÷Â[‘íÃm&ËÞùÃá¶’ù�_][/w"Ž—óŠáöØ_lúØk{I;ÓM�ãIÃ6aŠ‘ÃNÓb“d U¤l ˜äXllT Ø¦ÐQ 0›ƒbƒh ˜TÓL&I0›Ú¦šqLB;I°•´ÔRa†A„ØM Ób› D+6) 6Û Â Š4Ó4áÔBL'ìS NÃM‘GH6ÓOdrMÝ4à ŠN¶N˜U $騫b™+ è0ƒ  š†bš Á† bO{*Í ¹ÝʶAeaâ; …qæÑVÂ5´{”l aJÌ"8Ã�åC…L)ìô‚5ç‡ E[G¶ÉXAˆ":jå\0Aš•yý† ‚hÑaJ‰Fiʶ�m‘D$|+ +»´Âa0š'F›Ê†ŠÆ!´y´|+o "2²"Gb¨ìV7Ö‘�©!P¨Gw‡+§„l’!£%¼DDRö\¡Â+™éâ"#–Tÿˆˆ¥ˆˆ¤ÿVµikúúëû®êëú^“h/l1PÃ& -0˜0a±‘µ;|b1ÿÊâyؤYÅâ¸L›’DñÜP¤•…;Èí-)KÎİH‚e¸aB…YŠS_ +ƒ"­S½0‹÷ë½÷ð‚wwÓ»ýS¾î‚oÞÑ Tv°¼�-Ê’ÄsºÑ’Ê_É/ÍXâ¾¾¾ª�ÿÕ5õôýU/^¤¾KÊI™Øñ¨ï=šˆÖZç3Y…”Ô”�™"†|Èdt3¨ÈA” ¡3æF#\Cóuˆá’DpÉtQ˜Dâäâ’„pÑbDzH"�Fr†Éœˆ) DS™Ôf¸Ð~O$ó†CŠ™ó: ŒfbÑ QrøvˆO9ÁdŒÙqB #@h‰Ð@Â3†wD&B­„kxF°Ñì!<ÎOÍÊ ƒÐÊ|Ï ¦ 0Œá˜AF°Â45 „Ê3èÒLõL#Xegõ “³´˜L‘ȸ-� ¤Ô&˜F¶¡£[F¶��Éù)™ÃZ»= „ldòaß›ñ¢¡4l ¤‚a0��”J�ož‘c¥I½PAµ ª£ÂMúih'ðŒíÚL= ØI·TÒ ¨LѤaB"»öÒl$´˜i6–ˆá¢±­¡h.ÃH6šªhöÒc‹«P�W ƒªhöÙd ÃI°‚´a&ÝÕÛ,¢‚a¨G¶“ U &-6“¢;aÚL4- Ý–|!¤¶Yé6g "<¦Ù�Ï´˜il³¶Ò´éZNÌv\Òm3Æ’ZÂaõÓ -'IÐL;JÑ'Jð›Iµ;¦…vW«…NÝ+­' +ÚM»¦ï¥iºXPé?ûޕˆ]6‰:JúÒ¥ê•ÓÕi_¶“«½:Úÿi}4•Óé5ÓM®¿jÿTétÒ^ýã´ëííªþ;O¤Úé=W~×þÖ¶â—í×¶·´Ú½•>ã_O¶Ó´î¿_uû©tªºŽâ­»ê.×׺‘ÂÐ¥»ún?ÚM»þîÛ¶’‘ÂöûÿZŠB“¿JG +ïUþ½qµën1÷J¿]÷øÿ]â<ŽZúßt½ñë�G¯T>ë׿îï\êØúÿ¿äˆç!ÏÑ<oý߯EŽFQ÷¦ÿô[•¯éºÿE“�.¯ïÿÿê‹&¿ñ׿ÿÿØc�ïõéjÿþÅ"Æyc+ú_Ëú·ã~¿_ÿÇÿÿô¿õ¿ÿõ¿Uý/ßýÒØþ¿ÿþÿÿÿÿÿþ’ÿÿÿþ¿ÿÿÿÿÿ×ÿÿÿ¿½o·á¿ÿÿÿû¯ý}ºÿÿÿêÃÿÿÿÿÿÿÿÿÿòvGm¯’ÿýçOÿÿ´¿¿ ÿùI?ÿÿÿùÖú_ÿÿþ‚ÿÿÿÿÿ÷ÿÿÿú má'ÿÒÿöÒÿ¼>¿è/ÿÿwÿÒýÿÿÿ뤗ÿÿßÿ÷ÿýÿ ¶!]¥ÿé}kþáýÛßï wÿÿ}ýè/á�÷û×ýWöëÿÿºýû¿m¿õÂ/K¥þÞ¿¿¯ «]m÷ÿê·¶×ÿÿ_ÿÿí{ý/úÿÿúÿíß¿ÿÿúZMßÿêºW_áG­&ï=¿ûª÷õÿ¶­ûz¯¿íþõ¿Ò3_{×þßíÕÿþÝû×íÿëíëû®ëÿzZNßÖ¿u{mºßÿ¿ÿÿÿý¯IuÕµÿÛ3ïÝ[Sõûf{f~ÙžÝí¤¾ßýìƒó3îïûõ3´®¿ÙIþìÿ¶—öë«m™¦é¿ìц úöÌ×þçÝ›^Ã>¿zÛ?Û/_È£‡˜ûIuí°–cöé°Šù{VI†[˜g,ÇÚZi°ÍÚkÈ®°ÂMœ Øvžf.EpûH6’w¦ÞMl0aSõÓ‘9¥"¸l3 †´¤ í4äK¶“ +šl‡÷ÃU®4ðÈRm5m+b±ATŽ$'b“  �aša6)Š0›aûbh6)ˆH6!1LR 6’i¦ÅÓM8-¶(1TÐM4Ø ƒa?^&ÂH0˜A§v‚LMˆIÃH&ƒM„ÃA0©ˆAŠm&&› ¦ „ša¤Nš{°“ ´šØ`Â&°¯Úi…lW*Ú4>aì&�l1L&Ò=²|0ƒ xaÂFxb49â�lHøÑîO¢±´(ôfŒ!|ÏqÕƒL*¦(1+$žŽƒ�ÑsGÊ5²x¢•¡0G(hB0A“è¥$ƒˆŒ¥¡E'¶2²U¢*„X£ZnQ“brÈtùeMð7Âá_ýu¥ª×®´’¥iZýkJÐX$1 Pd(°@ÂAÔµŒñ�ÿçuÄ”Œ“‘UŒ‡Ì®,€‘Ù,v7�RJ)°Š# +g�<«ÂšåU4jvì)�³¡èÑIôÓOÿýüÜ_ú…ÿ{ÿþµ¾¾íW_µ´íRÿ;*^I1ÇñÎêñÖ:…]õãÿÿ•ç•ñ‹Îëò(—+h‚F³8‰¡“6uE;;ŒŽ‰vjgH†þm�G�̋ƌë)Py.D ò Ô—ÍçQ� "†|Èc!‘Ðy²( e:8ğ2„pΙäGÍY² êÌÅ'FÈñ­ˆN! #ƒ(Í–N!¸æc.ÊqI� ódHP%ŠCÖh„é�”fÈádxˆFØ Œ MM¢Œ�˜"á�hÀÎ  50`�É|Ù3f¨ð ¡‚a‚4øA„]¹�e îK�Â`�h„¬Öc‘444lša0ŒôBLüAæk #d§Œð˜L#CÖ|#`xMGƘL&¡¨LøãP˜F¶g&®©„Â64l 4ÓPž��Šb‘ñ„laÞO(L#af·£Y�ŒžÏ^š„Ðh¦š +7 +“™:fz ´ÓM&ª +Ô ÕRa„›I†“УCA7¤ODqÐÒoI‡-éZZ„˜µ“F„›IÔ",4{i6cI¸g &ÒtGl#[IÂ"Ûi¤ÃKMÒ´GdvÒm&£À3†g A6‚IÒm'Ô*=´šKÒiÃCVZ<ÑÂ>RmG4i8w +ƒ#šV8i6ƒ#šM„ÂCH6‚tté~ÛJåÑXW@˜m¥²Ä&èRtœ-0‚º¥TÚN”=.¡UÓ¥« ¢—oI7º´–‚„é:MâÓÓë½(¤ëámÖ’}i^N!zá1Mî‚im_ô�+…N“té-D¢•«­¨¨úûöö¿IôŸKK×üU-/ÚoÕ×§ûi×wµi´¶‡éßkwki½Suö’ðí{þ“¥x‡z~¼q]/÷ÝÝ/jÜUÒu[¿ê\&–лO_ßZï»ïH~í}~¤p¿]µõûÓ½o[Ö¢·îïÆÚV£_ïõÿ¶×ûOÃxÿݬޝm¥#…wj­F;¿¼z¶ÿ�¯�[Öþ”ÿãÿ#Ç¿Çý{ô«ÿ½9¡¤?ÿŠþ¿ÿýº-ÉQû&ëü�Mëè˜ä¨?è³ÿúoUÿýeÔ¿ô‡öþíû¯ÿ«ïâÓÿÿÿÿÿØ?ÿÒ÷Òýê…†Ãÿõÿ®¿ÿký%ÿë¯êÃýKý8?ÿÿxzÿëï[ÿßíÿÿÿÿÿë°ØfÅÿÿþ¿ëÿ_¥ÿþݰÿ ÷ø#�ÂÿÿÿûƒqÿíÑ }¥ûÿûÿÿÿÿÿðØmýÿàŒ?ü‡þÚ_¯ÿ擺_“îø#GÝ/ >Ñþm•ÿÿû„ŸýÒA>Ú_ÿþÿÿÿÿÿø88ÿÿÿÿ„ ÿ ¥ý]ÿõ¶•øK þ—ýz Òÿÿÿl7 ¿öF /b¿ÿá¿ÿûÿ^ÿûÛoýÿþ—½iáú_ÿ„ºÒßôì? z_öÝׂ*Ú_ú1Šóëÿÿß¶ÿÿÿþ·W·ÿÿê½®½¾‚Õ¿ÿð“ú[þ¿úZéúÿý«o¯þ’øW¯ÿ÷ÿÿo÷­½{«wï¶—úûú«ø_ë¿ýu¿ó‹ÿ_ú_ÿÛzÿKm')ýµ_õþ­}ó�mßÿÚÿ[íÙÓ£þÿÿþëû^ÿHÏm¿ÿ[oõ¿õOßÿµý»_õõÿ�A•äz×ÿõÛoÿo½ëlÓ×´­³4ß×öÌý´¿õÝ+Õ½YžõJÏí÷¯ìƒó?ý¾—öŠyu­ZW~ýözzõ¸[gµ¶Òlõar;ú°x'l6Ò½²òú÷JÙɵm>ØfïVÒV%i+¤8Û ¥¥õa‚[i'¦œ0ÃdZš\Šá±Ûi².UCÆ©¦œ0Ãa†*ӆú é°á§oam á°í0˜b˜a$Ðwa-Š Ý¤Å1 ­4í¹+vÛiÓˆI¦ƒM6ÒA±LlŽ!0ƒb“MÚH6!Z  4˜„«JPƒ  Ø„a´iÚní6�A°�‘^�¦Òq°™SMzöM6©²>–wM&Šv“i ½†b× +Šða&®Å*ŽU³L'?6šÑý†!J¶tÚG¬ÑE[G·*Û#|a„'´Á#ã•ÐazÏA�œ(Â5‘ô&�ŒÓMd°Ÿ“™¡åSƒŠ"38  #[ÖEãa¦|lŽÅ1XMša0‹Ãz6£sP°NŠv¡4Ú¨CzTþI´›IµTÓM4ƒjš„ÒmSFv‚ é6…¨t™.jmÜ&Œá¤dö[TU´˜ ˆ°Òm“ôI´—E[w“¡*L< ŸEcTžKM¡ ƒ»¤Þ¡–pš +ˆ±Ee-&�M¤í0š†y¤ÚdrA7I¶Z„4�pƒ8A^$Þ'e¡Ÿh& Òa„Ïæ™Â<Òl Ï4擦x�+e�0Ñ'IkA]&Ýñt›h*‹«PMÓoÒV‹nîú¥éváR… JÂ#„–î—…w¥‚a¶“­-¨»Ô-+H5]+Ò¹8¨ïO½~ª/¶·¾ýtí¥uÕþí­ºON½>×}í÷¾ßí«{ÒÞÕ7ÿëÓêôê›M-Zí«õúN¿·ï«Š§ÿñêÚomU=ïõT©+iÝëVÚwt·®?·×hRoÝ´ŸßKvÖÛÖ0ÐïýÓÇ¥û÷ñ¸×è/û»õüpï¯R8]¤pº‘½«»»¤‡½õÆ¢®ÿOûõ×O®¾?¿þýï_ï_tˆtvÿuѧýÿÑŠþ7¿u×�è·%Fö¿!Ï�çˆ.CŸ¾ö*[’?‡ú-ÉUÿOþ?òÆôßþ¿úÿÿêÝë,gÿë–ž¿ÿòÆÿÝ×ñaýz,fZtZz,eƒ¯~±öø¯ÿúßúÿÿ¯ûÿïþßþ÷_ÿ¶¿ÿú_õú_õÿ·[ ½ÿûq¿ì?ÿÿÿÿ×ÿ_VÒÿ÷ÿý*þÑǯÿýÿ·_äãÿýµÿ(½pÃÑNÿÿþÃGÿíþÿÿÿÿü‡ÿÿ‚3Þ¿ÿÿöëzÿÿ¯ÿÿuÿÿÑWÿ¯ôéaÛW¯ÿþOýþÿÿÿÿü Ÿÿü [h/ÿÿýÐ_ú¶—ÿí¯ÿûh/ñ¿Â_ú_é;hÒµûý÷Aµ¿ÑOü?ýßÿý ¿ý¿^Ç×õ×þ W¦ëÿÿÇ¿ÿÇÿýoöøKÆÝêëßÿïýjÝûÿ_þÚÿ¯ýýip_ÿÿú?k Š¿ÿaÿá÷ßéÿú¥¼6þû·½ºO®•þy?ûoÿÿÿëÿëøOn¿¦ëý>ºz¯¿}ÿ×ßÿ÷ÿ]&ΟÿïûÉÿ¾´›oïý¾×ÿÞ¿×ý½ºÕ}Öý'_þÒuÞý+úï¿ûûïµ×ÿÿá˜Vôy;û}“«f‹oèòW×§³5ý_¶f›t—ÿm/ý?Û3ÕÒíd{¯ÖëþCêÝ5¶göº{ퟶõöAÿ¶Vÿ¿ìÂÿð› üÏV©õíŸö%l+eæÏm$êí,-¶í,Æ»aXg&ëÖ×m%M>Ewk°Á+m. ¹°Ó ¤ÈAݤI4ÓVôim2Ý ™=‘B-ж-4Óa¦ƒb­��ƒ¸a†˜N6�i„Ö7aˆWVÖ¡È_lUˆQLiÚá´ÚlRiÞÅ Ób˜¦ÂI¦ƒ ¦›i ÓM6�4ÓbM´�m;i¶“Z °�M4í½ÚU´œ§i0[ †PÉB´ÓÓP ² ö ªNØZÞƒw¶"Ò-CÃVPÓ „›´î*-Ø0“A²(@¹á°@Á!#CG·*èØS–íà B×Eˆ(ƒÛa ++% îaˆH®°L)TˆdëL*.ÃFC¢t(çåÌEQÖ„"9غ<…ìDDs±¬í&PÄ3é2àÜDD0„Fm…‚2š ˆD8Â!ÊUˆˆ¤"!'DE'¢¹ŠOÖãÇ-Ÿ_¥}B_×××®ºKõõúZÚUúí-+]]G¶Cº +Á& +Á& +¬1V5Ø »!$²ƒ-aWA„eÒ £±^™gEp´""1ÿùfš¢n4ÎÔ³%¨ÉIJHÈ×2xì¼vŸ'Šõ°™nqØS*2x)Ù4FÐS'U3È*ð¦½HŒ*…_4i?…Ó è>š =>Ãûþ“øpÿÿÿÿþ£ÿÿ~·ÿöŠ?üGIã‘4EÖJ¿r�ßÇÎçþSÿ×Õ=Uõ_õþ¾«þªS¥Î̳²_Rhˆë:"::"3RžÏ"���Ÿ®r5Vd´ÈÞj<ˆ3Q�ÆS汑±‘a”#ÜŒ% Í2]Σ!’‘3>gB!‘Ð\Á",Ⱥ‘:pÉ„BTE§%Å(†�³èÛ3ÐSLÁ!£†tÕ(DNBdÙ‘†GÍ"ì�#ƒ$Fó°«#åóf|Í3(H„‚.¨«/ÂÙ¼„àBÌyƒ=0ч°ð@Áž †ÆP Œ¡ú!:0�a‚5†HÌ3ø#[!æx@Â3‡„{ ¬5³H a„kf¼Á„lj#dÓÎŒôˆIŸ†GaØFÉO™è4Â<0� Æví2�4kw„Ñ¡èÐü"ì4l 4ÓL#eT650–¨Øü&‚ £ãK „ÓJÂBÆÛ{z{´ši zm¦©>“è«iÃ%ˆ4,A¤›ÿÑI´›TÕ&Ké„ÒoI´›&ôaÃI°©:j“h]-BA�Y4gú ´�QB=°“i1 ›³d¬³§“9´ËNè'A6†Òm'A›$˜a8ÒvM6Ë8gšM¤é6§†q„i4î|+,é ƒ#šM²æjé;2‹i7M4ÓM~ËD[I´›2; +´3Æ—«„´¬ Ã¥kº‡JÑ.tœ-BV‚Ö­¥…A0Ûô˜I\ Ø^…à›W÷ôµ´J”$›Q„I¸M¥´­ð´­E/i¾ëßÿ~_ú¾>þ•»û×úZMÓôý:_�5Ûýê;KÓtŸWüiU_¯I×ýÝÓý/Kõt›hZmßßßJýÕn·k]/Ò÷úqTõMÇÒ½öý&õUÿ|â ÛBë»õö¢¤p°� ÷·n»¥¾é!Öî×^Ú‘Â÷ÿ½}Cþ¤p·ÚMúúÿÇi¡¯õþÚè|m_·émß·Çÿ©*ûÿ¸ý¥ï×D9ï¯ÿÖXõßñþ ·~XøþªßðP÷_zúoôLrœÉÃùvPçÙoñÿþZz,f_öý+éž¿ãM¿ÿü�ú,ŇÌ3ÿÿëÿ×Ñi7ì?×_ëô…‡ûúÿÿB,?üF¿_Û¯þ_®ÝîšÿúKÿÿíÿü?Þ¾ßúIÿ¥ïì?ý}/ý¿ÿÿÿØkÿþ¿éá‡ÿÿÕõÿÿûi~»ÿÃOÌ ÿ¯×ÿõn¿öàŽ?ýý‡¿ÿÿþãýÿðŽÿÿÿ ÿþÚ)ê觯ÿÿï_“φÿü7ÿ_ÛKúÿüžw_üü ¼—ßÿüÿÿÿüÿþ/ö×ÿßÿ«u«iýÿ¶‚ýàÿþþ?ÛKô¯ÿt¶‚¿ðÿ¤ú_ÝëØÿþÿíÒý{ý/þ¿ðßÿÓ~­ÿþõò0þöûûß}wø@¿K¿ü%ãõïøKÂ_¿¿¾ºýÿÿº_÷þ—û¾÷ÿÛ☨l¿½þŒŸõïùÄýýý_ïÿú„ëïþ¾¿o^ÛÕ7ûû×îU§Kÿ¿ÿÿÿ÷¯Õªzþõô¿_woÛïß­ú�é]ÿë­õæŸúúþݯçUë×ßv¿ßÿí¿ª¯þÞÞQ×i{ÖûWÿ¶õ÷ý®uêßÿûÒ¿ßzF{mÿúÃo_ÿõÿ÷¥Û4WWM¥í®õûwV¿¶gÞßÿµ¶f¶ÌýjßöÒkklÏûöÏí¥òÿÿ¤Ùš†öëëlÿ®×dþªÙý´þ›!Œg×]˜]zÚvaXRÿ°ÏV—°ÂZZN–­®cm&ËÞÃ7ZÈ£‡®Ã 0ÖÁw"¶^ûV$›|‰Í-6ÒÚÚa‚_"õ6 m$Ómtá†`ÁX¤Ób–ÒV*ÐV5µ‘yûÅ&©§ l1à '„™;†`Ø;1A´�h6*V�m$ÐllSiD+6*ê ¤Ði±A†¬Âp©Ä*A†! Ø„› &aÓm*ëb‚«A4Ø„ÚI§vZxm¤ ÂNà +Ø0�T6GÒ†Gi°‚q°™ š 4Ú{aJ� 6š „Úi§pƒA°ƒi†Drb=´h†I@AˆM{r®L‹DÒ4Qï+ + &Ƙ&jVÊâ¨=Á…+˜0¥c �0ƒI©XÃŽÀôp¢†‚ B5©Y”y4@Á‘™EEŒ«CQ + £žBÑ;ŠŠ9â!‚#£RÂ;UB,ûÀTMÌG`ynfŒ”n[ÍŒRqrlbèR~ºOú×_KÖ×õuéuÛKJðV ¶‚a¤©Ðd+t;!dHB› †Á™½N ’[GÊ?1�ÿü®QÏ+“6&Îç™Ó¬È(g¾—DÉ;XÊVŒ=MZ… âeB�ƒŽÇyShG Ðjšh'Óý¿7ë÷õ·}ï×ÖÛ×´þ×´×hqKñì"‘nJ²d¼Ñóºgf_ïþºú}W}mtýLµˆÄG\†d¼t”˜d"%šæÙ¨‰C3ޤC#¨üÙ�‚’l”"qä¤��ÃDJ˜$A©*(E¬¹•d¼™]¥“ò%ˆ"PöJ„S‘g�,Ù"'L +HdxˆFÙø�‘ãA ú‘ÙO›"†GD|—DèÙD]‚b$BÌl[„hÁ.Ñ Ð�0�¢(4{d¾g„ #Ñ�„\?L‘£[5ÁHÎp‚6=F°Ô&¡>gÂ>2Ÿ3“°�ŒžM4ÂhÐÎÉ%FÆ��‹Æ¡4ѱ¤×$ôÐA†ši hý’òsÆzPšdz´ÓM&Òd|›ºM„m&óÒL0¡4Ô'áI†©¦¡¤ Èð ß„{aRt,(j &A´ƒhŽÛ- ¢,4�T#Û“:m ÁÚN†“tÚ ´Gm–€›H:„ á²ÎÏ´hi:¸wÙg ÎN¡pŽZ´“} ÚN–Ë=&Ðg * óe�†ÐVO›i:ÂJûm*Ñ/jô—¥¤Ún–¨«…·i&Ñ( ˜N–‰E+W®oZZÂzÛ]´•ã¿J‚u„°©Òt©.©ZN—ªMÓôßëÿ¯¿}j¢½´–õu·}}ûõ·�×q_O}SKwÿ[qÓ_÷wÝݧ¯|/ÛWýÕÚ}þ�UÝÞ´µ#äq}ÞéÝê>†Ÿúݧݧ鶟ámGjGש?ûôñêGÛ¿ÿïú‘Âô´†½êýÿüŽëÐ�÷‡ßbº­ïŽÿ ÿ_ü}9ägþÉO¿þ‹rC<Žaÿÿïøÿ�ß×ÿÿÇÿù`¿Ø{ì9iÿÿÿÿÿÿt?ã_ÿãаÿ¯ÿý}.·_ïÿþ—úÿÿ÷ô¿õý‡ÿÿêp_a¯ÿÿëêÃÿÿ_õ×þ«ÿÿÿÿ«iíþßûþCÿ ?ýÿÿÁ¿ÿÿ÷ü7õþÝ“²;n¿ø#ÿÿÿÿÉÙ·_øoÿÿüBÿ‡ÿÿò�ëÛ¿ûÿÿ{ÿÿt¿Ð-´ÿÂÿý÷þ–éàß÷÷¯éƒúÿ„> ÿÿÿÿ¿ÿìŒô¶GOêÒÿ_ÿÿýò3úðÿ¢�ßÿé¿ÿÿ¥öïÿÿÿ{¿ÿèæ?®�W·ºÿÿ×ÿþ–7þýi7ï×ëþÿïÿ¯ýÿwÿë­�Sÿþ¿ë­ýmn¿ÿÛÿU>ß¿<½uvûm×óŸÿië¶tÞÿmÿÿmÞýnÿ_ÿWïMÿºýßûÿÿÿÖ“~Û×ëþÿû×úÞßNN¾òu÷öh»']?ÿÈ Ïú²ÌÓ9öÖõû¯ÿøgÿýd1ÌÍÿî­-+lÿ¶f­~ì&]i}Ûk¯ØGvzm&%û m5üÇí‚Jï°Šù�]ƒ_YÃm†+ö“g»Eeëm-?Û/êØKÓYÃm† +�ªiÚZZvà l0PÚJœ‹a˜$ÓNÒM5M´M5M‡ (b¤ÅÕ‘ø¦4Ô&Å&˜b�lU¤Èâb‚i„i¦iÂíŠé†ÐAбx„ ¤�„ÓN)4ši ØNÛ°šiÛiXH&MŠ †)´i´ÓA0šlBNÓ#…m(iÃNš†LPa\6ƒ2PøIÛ 0ÂdR#Cj¿*ÞuEÙP{r®°öšžlUØ Âi¦®!O ,ñE]ÛHöÁà �Ú=³I¦‘é &‘\åc'‘VÃDrâHDˆêƒ„S¢„",ª¢B"ÆE:+§Ëp󱬈ˆÂqƒˆÉ±�Ì®-:¼DRêúºµ_Ò×××].Ò°•´¶ †‚°`•†BlAÞA0fd‹°Æ#ÿòÎ&êl·R‰¢)yÞ™�VÔì’;,‹qÙ®�‘)5 +h‚…&3³ê@ÐU$™ÙfB*êI"Ü öÎÖ/OÓOéúiúý†KƒZþ÷ÿ¨ßQè;t?×Õ}ýëëöÕ¯%H~jU�Ú*Öv­—ýI�+šõãþ¿Ç[Õ]ÿ_¯k¯ÿ�”¥õ5"*ŽÊQf³)"›Šs* Ù®Éȉе!ŠTD ƒÈ„NŒË<‰�” L˜D|’ù&ÕslÖd¯LèDft’è“ddjT +HHÓ1cDA&L †))#ÆŠA-€È“!$3”EôBxY!£l ÈèˆF>lˆÖlÁ$eØ@‹À‹³ˆ-û'Í–0F°Â7AÁŸÂÎÁœ EÛÙ Z!xöÍX@ÉÁ6r§Œ#;äü• �ôD.˜dŒØÈMƒËŠÐ¡ž ˆJÈL„#[!38 h„™¬3L höÍ4BYNgi„ ! #Xz5†�L#`ké£c óL(L#CÖEãcF·êL=!a… +°5mBe<¡4ÂM„™´a¤Ú„änÒl ³9'B�zj˜i8VLt�p�›5jW´Ò ½Ã¤ÚMóòM¨M[‹I¼;ú3´›UMÒm IתIÔ#Û-H7 ˜hZM²É–pÎM¨NxaÚN“I6–Ë’�$Û,è6†‚l$è3†¡p�4žšI´�'3‡I´µW—¾·i--&…taCÒ ½é}ô­Z²ÏA0Ðgš\ÞÒa¾Ì³Å´…Lñ³!6‰sW +Ë=¤�7IÒÒ½&Ñ;I6ý:V!6®°’Õû %n•¢Q[úpµ_«U¥ý>Ú_®.Þ»éZOø»~’ûé?ëxéUé´½´›ß÷[÷Öéñ÷×ÿßoWÚïëTß®´�S¯Š_ÝñUK§ÓºZZ¦¢–ÓÓ饽´ú^’‘ÂûöÓ»i)/ÕÇ}Ò·ÿm-ÿõ#Êí?«öÿUÓk¤)zÛŠMþènï×Üuòø8ô¬xë}ßëô:­ý´5ÞûÇøÒþûÞ¿mGý9o¾ß×¾ßþñþ‡÷í¨ïÖªß^¿ü±ÈÂôC�ý´C£ô‹rI?þ?ËޏÿòÕþþÚHºÿÃß`ñú_ñ‡õü_ÿÑcwùiü?ëõÿÕ¿üÿ–/é¹c*ߊÿúþ:ÿ¥^Ãýz×öî—¯ý0ÿÿíÿÿÿÿ°þÕëÿÿýzÿKýÿýý[¯_ßý‡ú·ÿì?ßÛÿöëõýÿ¯ÿÿaûÒÿ¯ÿÿÿþQmÖDÿïÿÁÿþÏt¼‡ÿÿ†ÿ4eí/üþÿ¢Eÿƒÿaÿÿÿÿþÿaÿÿÿÿÿþ–éa/ßÿÐ_ÿ ¶Òð‚û¿ú Çÿúwº¤ÿØÿ„ ÿÿÿ_÷öÔ Oÿõÿÿþ‚Ù!ÂÒÿþ» þâ ¿ÿðßémÝþßèïû¤þÿ¿Òú×ÿïÿ÷üWÿÿ×ýÿÂ\ú´¿ïuô¿ÿKFÕÚÿ«þýiw¿ïÖ“o°Õ·ÿúÿëÿÿ÷ïðÒþûýµßÿ¿õÂëú¿~ÿÿþ»ëý]ûëû·¾ºW~¿ù×þõëêÝûÿœÿu_m/®ëÿÿô›ÿ«Þ»UÿõZn×ûVßÎu×®Ûþi×]6ß_ÞÞûíúÕû¿ÿÛÿúÿ½·­µÝ/öÿõd<Ù¢þÒlÑv–Þ½ÿë þÌöÍ?þ¬þßÚÚ÷}ŸíOÝëik¶ßööÏú_zýt›«_öÿ¶ÿ¯{¿olÑZï[zß¶yצÁ¶ X Û/{`’ºVÙÊD;Õu‘\ÂL0²+†·i6† +›Ö‚á°Úa‚Lvœ‰ -%XlWPØ|„±V–Ëé¶—È®¤éY¹9*Ã8“´á‘Ó Â#¥[IYm¦¬l‚M ¶Â 6ÂPØ;61M0šÃì1R8Ä L ˜ ƒ 4‚ 1L' „Ðh4Ðm4Øbb Ða9P„Á˜“†•¤k B Ž:l&+$Èâ&´áÁPa0a+›i&ƒ…Ú0ÂLVÕZ 2 ЦÛšl:¸TÓ§lŠðÂm ƒl*m‚(p‚mÃWÜ6šž „ÓSX„H·lBŸ,(MOyVåCGº*Ü«l&‘é "M´Ô¬r®,PaC+ É�ÈÕˆädkÅÄC$0"äwè­¡ì"G¶�šEX Ä&˜L&!0 H#ñBàŽº+Šðb ÂÄedA”°!3P£2SÊdr¾��¸â"1¢lW“tN¯ÿK_TºõÖ—êÒÒôºÚM¥‚UÁ[ 0eÚx„ô‘'H>ZÖ„b?ÿ)¥¶v>wÔ› fZfUÅuˆËˆ +v%‚)YJâd+ŽçŠð™Ùxî©+Ié~“»ëµiÿQõÿã¿ý}¤²T²ºå›“Ì‹tŠßüîˆG;*É?¼í$º®ºÿ]W_OÕHZ%(ˆüêˆõç#[&,ät"f£é©TJ¹Q©G_9Ì‚Ju"c9‘!©Ðd1©Ø(ªG“#Äã5™I è3hÚ%ŒÌRd�’æ}3Aš™˜¤¤4pÑ„BäB„Hñ8Cì¨Í�D&„'Û!£l"¡l80EÞi“æ #¸`�å8¤4p΂ä�MB“�…È¡•d”в2dPd$È¡•eüÀÎ �*!�™00Ah„hg0dù�Ø@Â5™AèxˆO.Ã4‹š„ ¢.A!&la��Ž8Â63H&Di„l #a<'2t= ì#sØ Á“Àœ�ØFÀÌäÂ5Ìà�” Q±£D#s ›|Ô'É� Á¦Ÿ¦•„xF†±ª¤H7ØÔ ѱáFÆ¡çð��PdRM4{xFÀÓMS „k¦“é6“jœ�ÚMª£;ÐMª¡ &Ù1é7 é‡'2ÈMª=´Õ&ÂAÝÕ +IÒ ¢,6©&ÐÒ …IƒT{l²m&Ò´�&øD[l±RmG6Zö“i>-¥ Èæ–“ÒmÛI½&V“rg¤ØDX¨D[„¶YÐl! Î ãKe¨,ìûJÙdÂt°™ã‚  › +˜»1 Pè—4F=+hRµÕ·t­F‡JÒß +‰:¦ÒÒn ݤ­�T“j.ëii8K«Þ¿N“¾ÚZOþ“K¥T›A:W¤é:[J“p›XWî•ÉÚ¦›KÿKÕÒ÷¦×öõ½ÃO ¥½m-'õ½Ý¯¯ôƒJšN•íëî*:ïé7ZµN­ûOëmúiém j>ÚÕ?´Ÿ÷[iö�/Ûqëÿ§ý'ö½ÔŽÁ]ûRò¸í¸ÇÆ®·\o¸¡¯îPñö¶ô6­ºo}ÅEÕ·ëR8UúÜz¤Þñé6£_Ó~ÿO¯´ýõê5»÷Æõñ»®µ×è‚Qu!æ¿~C§«¥!ÏaëÿMŽ•Sÿÿøþ?¯ý9¿ãî¾þãõÿ�þ?�ûãþ‹ï–Ÿ.®­ü´ÿE×ÿå“Uûz,f¿ÿëÿÿ_ýW®½wñׯÿÿ][ÿÿþ¿ô¿ÿÿÿïõÿÒ_þ½‡ÿþ¿ÿÿÿ꾿�Eíÿî«ûÿëÿúÿ®«ÿÿÿÿÿßÿÿÿÿëá¿ÿð_ÿÿÿÿðE�άŽÿÿÿ„¿ÿðFÿøGþNÈïÁÿÿÿÿÿÿÿÿßþÝx7ÿþ£ÿÿ÷ÿßè ^?ÿü£ÿÿ ŸÿðAè/Âÿßÿÿÿÿûÿÿ÷ë{ÿýè/¿ÿÿÿïÂ^—úÿý/õÿÂ_ÿé~ú í/ÿÿ¿®þ÷ªî¾ÛÿÝÿد_ú^û¯ÿÿ÷KÒï¯þ¶‚ÿÿô—n¿Òÿ×Ý÷ÿý¿µÿ÷ÿû¾¾Ÿ}¿ýRöõÿ÷¯û¿×]íÿ{{¯ï_ÿúÿ¯þ—ÚÿÕÿ·õ¾Ûý{ëÝÿþÚÿyGý~ßííúÿÚÿ¶ß¯ýú÷ú¿¾×ÿ_zÿÿÿÛÿÕ¿öÿîö÷^ì�~Û÷ûm½{¶gÿ¶—ÛÕ«m½ÞõßÙžßëÚ·mW²uºMÚ~õæký{_ý}{^Í¿ug×ýŸ]¥¶f¶êÕº½†û³û¿Û?¶~´¾›þ·]s¥¢‡¶ažM¤ØEÖóm¤žc]°I³–²+†œŠá°Í»¥í„¶Õ³öÇûizÖÂjõÚò(á¶^l½ÜŠ8v_l‘\5NÒl*iì‹Ìt“dQԉ˜¶Ò "ø„ª›ȱdXa4ÅÒA«²ƒ†’m “MŠ ¥ XlPcl$Èâ˜MŠM´“b�i†!)4Útà°Ä+p“MŠM´˜¨l6GÍ´”'ªÜŽA°ÂH4í:x…“ Âv(1P¸i£»H1WiÐbÂI†)„L„6’  ÒpÓ &¶ªð Ø"‡ a‹VÛ£C Å4ÐabƒPˆi +U°Ä$|l)VÑí†a#Û•lEa}�4à 6!5I†!&› á„ØOaŠ´ÓØM4Ôðå[i¦ƒ ¦F�Žƒ%X"U¢¸©„ #R„G!@Â5b=‰Äsµ<´*á‚)ÑB ˆ0„DE©Dçih›‹Dز\‘×õõý|l,@ò¹ŒGÿå®6dk;3Gw–ãHÈÇ+¹�‚¢¹<ƒÊ^dI©;)f *Y�¾,îå +dª‰4¡B…3‚•î"ðIüûÖÎÈÓÖ¡R0šºý¤þÿáî“_ß¿‡ëíÿ¨ïUþÖd1SKãâ£ÿÎÍP�äoÇÎÈÇ*?ûþL~¿¯ªëÿÿ×_×Ó&iHR&5\ò"" ò Šu’-< ˆ[:�MC" —ˆGó$fÏ()Ì뙌£0GŒ‘›< Y’¿L�D]çC*P"žBÒgC"¬ìqsg” ‰(! C+ Fä`†yÃÊvyFâú"P·1ʲæTÂÈò! ž ˜Y#&!*!:" „lš$h üÎÁM�FÈF°Î +lgð@Œ0�mvñ‚4�ŒÏPƒA¨AáØä^„hj˜MBØà�“æC°¨„ò¬¿]“£„Ð!<vHFÙüÙ dŒæQ@‘>!&k0Ñà&3„g£[4ô­„l5‡£Xi¦� ¦r6S à“r\+A6šaRÏÁ&]&ÿM&ÒÓA:§¤Ü ÒZM´TiéÒt�'TG�tEwÓi6 &Â"ÅŒ Í–‚n­ªi Òi¤é„Ò}Úa5 „ÂV–š§$„Ú·MIÂZ*Þ�m'&˜ÐM¨F†“i:¤Úg Kh4Ë@M¡ªNË='VÐL6X2Ñ3iZN]p´°í$é6ÓARt¯½Ò× +�0Ûo ZVú\ ¸A½zZ#¶—,ãJÂ"Ý'e�º#°Ï4›AXP™ãi&[´´ë‹zV“Ón­Û¥¥¯I>¯¥Kh”%ÅÕ'Å[wô­/Q„úOªZÿ«ª®£øÿ´ÿûi[¾©÷„é;ÉÚK‚o+ÃPšu×÷ut�ý1öõMuô›Ûýü]¾»õV…ý¥kKýÕW}Ûý½|¸FÒzº{K·v�ÛÔŽHá]*Ýþøé{¯¸ûÿ¶âýé®í?W__íèu«zíu¥½´ß[Ö‡½ïC{ù-}ïµõZҷcÛþÿÈë ˆt?ûè·$¶ºýïKéô:ÿÕ±VÕá¿òǯ¦üx{ãÚòÇ#Gƒí`×ÿHU݃ïUyc]cìÿ·¤2ˇûÿŒ_qþÿòêÿõÿ°ýêX¯Vÿý~êõãðÿ‡ëÿü=õn¿ÿ¤.°ÿÿ÷ÿßëÿÿ°õoÿýÿ÷K‡þ•¯ëûõ×ý¿Ãtïÿøo­uõz×pÞÿÿÛ:‹_ÿÿý}‡ÿÿÿþ·á¿ÿÿÿü7û݃·ÿÿíþÃÛ¯í~Ñç ”û†ÿÿýþ¿ó]ÿùÕ‘ß¿ÿÿëþR2;ë ÿ÷ý„hþ þN·_ðßX7ÿø7ø@Ÿ_úÿ°ØAa¿ÿý0‚ÿÿ ¿ÿKðoÿÿÿþ�× ÿßÿþ—û„ŸÿÆõÿ¿Ãþ—×»iw¤á×ÿ×vŽí/ý{¤ÿþ�~úõÿÿ¼ ]Öÿ÷­ºô»\?ë°û÷û_û÷×]‡kqï}éþ»é6—ÿü%ÿúþûkÿwïý*°÷ÿnû__KúõÿþýºÿmÿëUßÚïK<ŸSRþ»m'ÿúÛë÷ú_ÿÿïÿº¯çõþõoÿßœÚ×]í¿9µí�:×ÿ¿9ÿûÞß¶Þ߯×þ»f‰½¿ÿKlÑëûÿ¯œëzÿnÿû¯ûývÛí{¯µÖë×Û3_¯·Ó×~ÃmW­/ZolÍ{mŸÏKÚWv’ÿu¶¶z[¾ÿK°Júû}­ÿûi¶o×·]ZúôÙý´Öé|Š8põºÒíáÖc°©­Õ—¶ÊöÒòö›fæÁ?´­.Epö6 i6 »b¾î˜l?[L'„¶BŒ’N 0šv–«Èƒƒî ó"Ž·]¥§ðÂM‚wiåæÒ‘\=m$ᥱLSh&E&A5§ véZAc»¤Ðm¤Ä$ئÒa¤lB +˜bƒGi¶–6»#‹¦¦´NÁ:¦¡‚(p¡­Ý ‚ ¦�­4ø„ +Â{ +‚ 0È®˜¤¦›im ƒM4ÃÈ®•Sb ÂzM†’r�¤m28LT& +A°šdp“a ¨ HÑiªaEÛG¸dˆA0LŒ!*Û +VÊÆL!•…`ª#”¬ƒL*%ò,ƒ"" Xˆ1b"0�8#! Eðš]¦ +xm4�lŸds=ÑYGˆˆaˆ^O´… „"1H1�B ÑUŒ“Â"#ˆÁäØˆˆå¸$#òÒ‹éuõý}.¿ãÐY 5é‚~˜Aú:? å4LDþX)åœ +‹�\YPÁe$d uL»8D|(FxR·–æl•´¸R¥…2DF©z¿¾æâúô/û÷ßKw]Úh£Üí)/ýVù’šòÜ ´#ýüs%¾¿UÕWÕ~£Ž¾©© +E?�s5‘ˆ©7/ÿ*Ì“dB'Ês%²”ƒÎˆ“�< R��$pÏÐe�IŒ Rtp�dCẻä'‘QÏd‚2Ì9C˜ŽÁÈöÐ ‘—3 g¿¥¦+‡oi÷ÿi^š½§þŸõZݧK÷õ¾º›×q}¯ÒÔŽ†·wÒoxúßþÔU¾½¾½zÕ¿ûþ¼^®¢‡C½}tí ¿¡¸­¸ê-dpªG +ÿ\iíÿõã¯ûøÿÁ(ÿëú-É +ûü:ÿµüÿßýh±×º\?_ý¿ü±Èϯ‡ZŽ?ú-Éÿ_ÿÛý~½ÿý!¥ÿßñÿõ†µë}õéÿÿןôX_°ýÿô‡ÛØ5é/ÿÿýõõ­õÿõoÿÿÿ×ÿaÿþé¯ÿ_×ÿú×ö¯¬5ÿÿ×ïÿÿ×ýÿÿ×ÿÿÿ­Aÿü‡ÿá¿ÿíÿÿÿÿÿ[¯ÛÿðÚÿÿÿ†ÿÿ‘&Gÿÿø#¿ÿÿò�ÛKÂ*ÿÿþ—ÿƒÿ¾é}ÿÿÿþÝ ÿäá°Fÿÿø?ÿÿ _úÿÿ žÿÿü °Ú]«ÿÿú ÿð÷×ÕÿýÿÿÿúüÿÐXl _õýÿ†ÿ¿ÿKÿÿÿÂþ»ÿú^6á/ÿ_» þÿ¶»bÅ{ÿÿ×ÿÛKíþü%‡_ÿÿn·¾ÿþ×ÿÿöÒÒíþë_×A?¯ûú¯þû×ý×ß½¯ûÞ>÷÷ÿt¾¿÷õÿÛÿô¿Û¯ÿõ^ëuÿÕBݯÿ×·ÿþi½Úï[þßÚWßW÷í¯l¤O}Ö¹¿×^ÿ½ë%÷ooÿÛ×ý]ºý·^ëÿý¶ÿýÖÿ×ÿÕ·®Ò÷û3ýý>×OÞß·ÿ·ú¾¿_û}®ôÞÙžÙ¢ó5ûf}ÿ½Zþéz·uº_ýÛ üϦÌÖ¿í¥ì3Þaa?öÌ+¦ÄÚVë½-¶ ^ÚM‚²/PL„ȼßgïlÍ6gÝ_wýÕÝ¥ÿvÞ»ïµl*zj»a)pûVÒ°ŠûeæÒYÃa›ƒi+i_¦œ6a�ƒ†i¦š¶“#­†)ŽG U4ã´˜¶Ò † N˜L1 4Û)5i0º¶l$é°Â°Á+I²õ°Ì=8mÚPÛÒMVÙÅ+i'a È~ ˆLBÓÓ†›¡:a4 & tÐq ´�l'b› &ÃH&ašm5l Å;A4ÓL2Z ƒa4Âj0˜M„ Â R 1#ôE¶Â!ÈÐÃ�„ *#“Â"ƒ©6(1V“°b“OnF8M7¤ši¦Âa Û#é\Ba&L$×°»M4�nUÊbšiÚ3Ú BGÆÁ0�‚ AJÆ„kÎËäì–¡VJ:2X„@¨PFZB#a0ƒŠ Â`�Šj0H¬ Ÿa1ˆaRAQF ÁÐb!0‹:Þå ²•êB"#–‘-ñ×ÿ_t¿i_ POa‚GÇÄF?ÿ-nEq™‘­-Éo3; ‘giØP¦B‘lv.$ªŒ2ø–ÀŽì)ZÎÖ%UÔˆguZ Z�txg`±ß5;©ª”¦§‡WÃöþTÒiwÿ¦Ÿ÷ßë§þ>×î¢ÿ¿â9�’+¿õi­¯ŽÎ²¸4eßþDý~9ÙR2§cúëÿ릿Uÿ]WÈydK%+ÔëDÐò‚:™fq¨dA©DeY/œ27ˆá"!ÈÐU–'FÇU\íidid4jd†¥AÚç#QFfάèDº"èñ¢„{"Pˆ`Š¢`°@ÁÎ# dù²P§LØÎ#‘{04BMC%ÆxÂ5Â6€ÊL&hÐÉL‘Ä4h £ „k ¢ „Õ3Òa<#cM=4å"8h„™9¦U’âDhD.EH «#PBb62@„žlˆ†NFvG²NeüÓeÐÐ#Øf‰b…Û{ˆN„ #aÉžg€Â œF°eóé�YæÂxFÀÕFŒCÂ5°��t{ja.Gƒb™= ›ª>Òt­ÃMF†A†š<0”𠦍&Õ0ˆ°ÓUDvå� Aœ9ÖPž�l¢M4ÓF†¦z5†Q&Iɧé£cPƒ'¤^I zA‡«h'IÓÐV“ü¨i6¨¶¢�t˜ÂØTE‡&„Û,€›I¹½éi>Á�n“´Â IcVZnÒH'I°“j,;JÔ[ +ÒM¨ua¨j µ¨'uÑ(ZOPˆ°Ùg ††ˆá„{i;-l ͘Pˆ¶ÙgpÒl"$5‚A7¥éjêØV\é6®ËD]+ +“ ´µa%j�;¤Û«i{zºO×ÁZ[éAk¥¾«¯·ï·»ýí$øíím>©´;OX&ôœ"QA6én«p›á? Ò¶ ×¥½'ÕñǼ_moK×ÿÝéoJÿo­/ %ï¾ß»º…éÒí4�ÚÒß}&ÜVݦÜ]þ?ïöí4Þû_ÿ¶íªúµ×Ûú­ÿ‡w­-UÚ¾›÷¯~¼t«k]¾¿ò8VÕý¿uoú¯úÿE¹$»úM¸¿×¿¾ûû¡´ûiGã×vþ‡¢Çýcþ/úúØÿŽºCý}¯þŒ}yuÿýoßÿÇÿïý~>êÝÿ,rI6ìR/ŽzXðpÿ—Xãÿú_ÿ×÷­i/¯}{é—þÿ×ÿ¾¿ÿÿÿÿ_ý~¿ÿô‡}¬Xl?öÿú·ÿ^ÿ®þ±dâ¯ù±^×ÿoÿÿÿÿÿÿÿÿÿûÿ¯ÿÿ×ú¿ú†ý‡ÿÿõÿÿàŒ?ò‹ïgÿøG}ýÿ÷ÿÿÿÿÿÿÿÿ×ÿÿÿþÿÁxl7þ ÿÿ”nÚ_ÿþ‚ÿA|·Š_ø·N¾½ºÿÿÿÿÿÿÿÿÿÿÿhÿßÿýÿ„ Çÿ ÿÿ„Ú ûÿ¼ ¾°“ÞØAúßú÷_úÿÿúï_ÿÿÿÿÿÐ_ß_ÿßè§ÿ¥‡ ëïÿþ—�ÿëúÿ¥¾Ú_ÞØÅ¼>ûÿÿµúÿïÿÿ¯ú_ÿÿÿÓ«wÞ»¿öÿßúè/ý¿z__[ïýûkþߺý´¿î·¯_ý¿ÿûúþõÿõ·®“~ú®ÿ¹©?ÿúª·ýév¿Ö»{ªýïÿÿ{n¿½n—kÝÞN³Oÿû×ú¯ÚßÿÿZVßœók_·ÿ­˜Ûÿz·­uõ½½}µßûaŸMmí™÷_Úÿ·Võé^¾ca‚ZzÿûKÿ[Þ¿þöíWm³?o×­lÍ6·íŸþû ²Ìúÿ1¶–cm)pí¶Üg¾äW{k×{—› ¦Ø+ A´•5  “M6Eö&ÚIé&�„ ƒÁ˜AýwJÿ°ŽìºÕ´¿ÖËú°ÎzXJØa-†näWÖé;Ø`—R.v*õ Èá°Ã"‚a5b›IŠm*{IÅ4¤á´Òi†EÓ„MÄ ÅRl†Å6M4h+M8LB¶Á $Õ>˜HÎÚF·*Ü«©Úm¤˜MSb¡²Ò ²tM!h&:Ô+NÒl+¯»µn‚´ ÒÒÒß +“¥i:ðV–ª4Þ–þ—¾·ººO­ít˜h3†M ›eƒ,ìûDcÐV•Á6“«¤•´ô‰{KWÝm]m¦’÷miÕvëIûÒU×ÚKßw½½/¯M·¥#ÊãCÞ“xÝ&é¾Õ·­¸Nº^ßã¤×îßx¥©p�§�ûõò8wýu#…oCC[Zï{õ¶º‘Âö±*·ûWKÝuÿÜUT�­:]ê;tÓ©-ü~®>÷^²7 +±ëˆ.�QWëáþ?û6�¤XÍW¯ÁöÚã¦þ¿#…ãÛ®Ý/^ã¿EŒòÆ×ñý!¯Ë¯¯°ûû®‡M}ßa×ô\¯ÿøããÃþýÑuƒÿÿÛëÒõ_ë¯_ý‡¾×ÛëÿÿoÿŽÿúIz°ÿzý†Ú_ÿèãµÿÿõÿÿÂ,_¢¡¯ÿþ ÿÿÿÿöúþÛ×þu~Ú]å$ÿ·_èÑÿà[kݯÿÿáÿÿÿÿ¹šÃ·_†Øiáþ›_¿¯~‚ÿðýi}{î•÷ûÿÿþü+‡ÿ_Á¸;ÿ¯uÿý-ûmþô¿¿}t¶pã÷ëmwÿúÿ÷ê–þ¾ÞU_½~)‡íúÿØ÷Ú¯¿¿ëþôßn¿YFÿûÿßÒß½‡Öá6ÿÒúÿýooݶ×ûóËë×ÛßÛºÝ~¯_ÝíßZœÿý[:oþß~ïíÿ·¶hŸ¶Ízûu¥Úmvzl϶Í®Ým®×Û׿ïµ_ö÷ëêCÌÿlÏÿ>ÿÛ?ßvêGVµ°ÏVÏö‡w¶Ÿ¥iz8áöÚÓ°Â[ n“m$ú·^ÙžÝ/ûgöÿ«^¶ÌÕÕ¤Ã>­NM°ÂJ› IÃa§µZlR¬6 +&¦!)ˆM¦›i7 ƒ Bz PA†)°‚M°’ +é.ØIÒì¾¾ØI°•¥"F;TØadCô›n¶Ã“MŠOí½Ðv»¦™&ªØA¦w²8 Û"Ð"8å[i§ža†«a‚ B•Œ1+ É¡´­6!Ò6)š Š R;°“ „ÃA&¦ØH1 +ÒÑéF°¬ƒ(.LÑB!¢l$ÄDG-ì7b“G¶R:£G†ŒðÂ`„1Â*Uê#�0�“:Iƈˆ¸ˆéI°§B"*ãþµÒ×ýWUô—ÖÚIiI°áƒ!?¦1ºÐLDb?ÿ-°<®¤ŠÒ–¡”©f_… +v±ë•4ÿöÿ÷é÷ó Šíê#üµü·,×ôþ«ù’×-Ý)«*’ç#Y‘hÏ5™ÐÍFKæÙ(DãÈhâ'Fe‘AJA™ó3Ê TBr"üÀÉ5):8D #ÄH R‘ò^.f‘ˆ†Ž!</˜<h„è@ÁÃ)ѦaNh #@fðEÙ«AHÎ +xÂ6>0P�açÌù„na×0›'äüýéé„hfšhöÓ ”úi¦�mÈøÜI´˜i„ôkf’ éßFv“iª<4{tÚLT&Â";Pð’oj’íÝ+IÂ"Å�Ý[e¡–€Ï4›ÆÐg * àÎ0“¤ÒM ƒ¤3†Ë: Ï4¶dEÒl*bõÒa$ÜŸ°¯I^ô¯î•¨Á0ÛÞ‡½ip¯t�jé=ii\'ÒtªÔ}µÿtµÕv÷ISý/þ¿¿Ó׺[[ÓºZêžÒ¶ïû»ßò,7vº÷R8V›vê=º¯õ#…¶Ÿûÿûõ»»ý~†£_ío]þ…uãü‡O~E9~£ÿÉP?þüzÇÿñþ[’­oø÷ìòÉÿý“íKOÿô…ƒÿáÿÿ_ÿ_ÅVÿ_áÿÿ®¿ïíÒÿ·ÿ°ÿëëÿêÚ_ÿ­xoÿý^½ÝÿPŠþÃÿÁ¿ø#ðŽ?ÿÂ8þ¿ÿaÿ†ÿÿÁö¿÷íÐ$ÿàÿøoþ_„ÿøA;i¾áÃÿè,6‚¿ÓýP_ö¿|?ý/Òÿü%± úý/ðÿÿéx@½tw~ô—þÿûôá/ÿÒæÓm¯ëß¿÷þº_ôžøkþÛÿÿý×ÿü%oÿªþqýúX[ëÛUÿ:¯ÿ9µÿÿ_ÿÕvíëÿ¯¿öÿõ¶ô•+½ÿµl�]kÿ^×õÿÿ�~f‰»I_ú9_¶~ÿ·d™þÒÒm†{êÂ8ï»l×þí&ËÛ1÷‚0àï°Œ;_þDm‚L3“iiÙzEpvŸi\‰}ƒ-SáÃa±ZI§lVì;Ù=ŠºL&›#†ÚQ +Y¯E&œBm4â¦aMÂi°Å1A´“MˆL*NÓm-„ƒMŠ ¦š §Ã +ÐQa0‡TðØ* &EÔðà‹è¬a¦tÈЧcQnkªÇkl)JʬÒhÎÚ`“ØM#áXU¹VE²¬öÂ4 ¤y°Á1Ö¥ca4H¬¢Ž|aŠqGȃŠê(‚²"(çcEÌ· Â’èí[ õU"}…-ÅЊAÌ”!DE'¡“OL-ûûî*㊿ÞÃÿÿºþ—^½ÝÚ$&±úK¯yN?Š�éU¯õÿ_m!x\ =Ôî´jÈ�<ˆ%—=†“!Å_ózgB%ãSÉLh΄t3¨ó†C8¥XΈáåÄc Å)ÆC.*!ÊÂI3P"`ð@ÔØÉá ¬<ÎdCa„ÅÃáðˆ¥È”^$h#!3L a4x n�ÃÂaF¶¬5 ç­”jy‹'²"L&“hÖÒo”í4Öi&ü³pE;†\f–�0Ô&�>¡Qá£Ã :AŒ ›‘ÛAtéÑ=¦’ „ÑíÂn_5e„„E¶M¥„ŸÚg�CÁ ›èz¼ me¡6ƒ<ë¦ض—L/‚µui+@›Þ’nín›_‚Iéþ›VÕ|{jûukû_ë¥{¥â­ïúWN’{¾©Ö“îîí¤¤p¿§Û}-Þ½÷zëR; ÿu¿·[¾‡»ï¼~£ûné×Ýõn´½ßÇ^#¬{VÿÕoyc‘¨ßþ‹rIÿþÃÇýÿÿ�ÿþ‰�õ‡ÿßÿC¿ÿŠ¥ÿÚ_�þ¿_ý[ëö½¯ÿúÿ¾ÿÓßÿ×ÿ^¿Øþ—ÿÿþÃÿýÿÏÿÿðFþÏm/Í,ÿÛÿïÿü ŸÿÓ¿¤ÿÿè/ÿKt¯tœ=ÿéÿÿéwÿ£»ÿßýþÿð‚âè-¿þÇÿëÿ´·ýt­øï¯ÿ×ÿ¥£Uõ߯ÛëÛ×ÿõ¿ë¦ï¥ï^¿ÿëzªœö×mëÿm{ýt�¿ý}¯ªÿê½ÿôõû½{dëÿûÕÿ­nóì³tÎÏ�ßÛÒíÒûOÿ´ä1Ìÿúõk¯V–­‚V—f?Û9XA°ÎZé&¶Ù¹<ì·+˜ŽÖàPRXÁLúö’yyºO‘ S]9pÛl$�È®F;WIm<6’¦Å&V 4Ó TŽ!ŠMa$Âi†)72JEE4Ôʸ¤½táv’lSašl ÓM4ØM6¤Õ„Âa ƒ š„Ú  �vÁO„6»L0˜M+=èŽF½ÙFGMôð�Í5÷w~¨×•b«Â Bxm4� (ÐÑXå]„(ô† +UÑ\V¡(1Dv(�¡Ä"¿Gj÷WI÷ýÿ–å{™b#Öúûôe‰ÿ½k™V‡§ÊÐ�ý}z×ÇTÿë^–½é®J‘tu³è§y Ù'žÒJÇ7‘„@Œò"LŒi�h—Ð¼Š³æHÎP2`R*)¨‘²*‚°‘R’!Y:ÈN˜¡`“5°@ÁÁ&™œ�„Åt�WŠApÂbHáž FpÍ š!fW‘G'3[Ù²Ÿ3 ¡<#cF²XNdæxfrvÈæL&�dQ²ñ¦¿8ôÂi6‚oÎÒ =-tÒdu†FáRFíÚ � ¤Þ�²cÂÏð‚a¤ð¦��tE‡¤Ã wp“¢,6Z(ó…DxÒjhl´1 … $Ú½‹i7 œ(LûI… >xÁÒm'éa1v„*UV–ÃUhzZïÓ OAzXZ´­¢Qö÷_Ò½}uâ";}¥ú_ø¤ºOýÛÖëõÝ÷ž›KJÚ·;ôŸKpÓïÛU_ëi÷U#šûní;OÆ¿Ö×¾ïú»ÿ¡WOßûÿÝ¿ýê#\0ÿûÐ*üô¿ú¿þ^€ý}wÿü±¯ÿúHºÖÿ¿,kúÿ¥ÿÿÿ‹÷ÿý{ÿÿúë·ÿÿþ¿ëûuÿý0ÿÿ_ÿÿÿ_‡ÿÿÿãÿëý/ÿðoÿÿí/ÿæ—þ—íÿÿÿ„ÿ¥ôÚ_ÿØÿßÃh/ÿè/ýÿÿÿÂ_úþÄ+ÿý¿ÿÿˆ_ÿÒÿêïÿÿô¿úþwÿþþëßú(k[¿×ÿK|�uÿ×mÿ¯ú_¨½öÿu¾¾þÿ¯þ­ßÿúíÿ¯÷¯éZÿí�:÷^ÿÿMßÿÑšßÿþ—mo×þŒÿá›Ê7¯þÌý~ëoý�.zM™¦ÿ×ïIXgûSõ¥ÿil3ý÷áÒKí�~m¤­——Û ]jém‚z«~Òa…olÀ²+†©äv«¶a„í´½4ô“b˜`Ž=‘Èà4Ód\j4Ó¶ÛI“M„ÚA˜a¤›"ºMƒ·Ú ŠdAìŽ,-›ƒÈâ(0f. $M4á„“ ÅmS ÓA°“ÈâÓNÜ2G46‰#aP|†#ò±£ØlBEqæ„~*ÏnU³Q·;È©FG‹)¯*Å0¶*íʶ)Y@ÁBÐ1‹¢…\�h�ˆŸˆˆÊعÑs!4 §E!"»¼*’ùÊǦ"#•ÖáR|DDRzêšiÿëÒÒÇÿÿét«ÿYdTCý¥W¥+?‘4v“×÷I&ÐCþ×_á¤,2:«ê¹]UìÃ+H3©ò�6t"L‰s:MC C§œÍe›‚‘¡Ir\á�Sæ²!êŽ Rdc:Šˆšx.dA£Ás42xÀÉs\¬Ô.Ù¤h„™æ{ Ã1„k ¢ „lah0e›�ŠƒXx@É„¨þkaÃ'ä&Ba¤ „xa ˆMØFGaªØÕ4˜jš¦‚nž˜j¡°•0‹„cA0ÕL9ñ•Ò��tTRnFá¬%IÒ …“9´˜hi6“hŽÚM¤Ãh'Ÿé6Ò ¡ ›Aœ0ˆÇ¤ÚN–�ÁQoa+i‹¥ˆŒ2ÑÚW4ØV-:V­AZZ$õÒl V•¤òq^©+“´•¢Q[„Ü&’Ó­Ýý×IÝû¾ëïÖ˜­þëtIûwþñKÓÇm¡UvÜpž«O»é}µ¡ÿCÛ}øÞ÷�Æ´›}HáRmë¤7]ãßR8[Èá_ýý/ÑjÿÿðÒúшÿ¼A}”±ÈϦô[•¯ñ†£ÿÿ·òÚ‹ËI¾ö´úùc*¯è²vý*ô˜:ÿöõûÿ¥¿ì?ÿÿÿðºÿÿíÿÿ×ÿÿÿØÿ‚ÿÿ„w¥ÿÿàßÿí¥ÿÿÿðßÿà‰�ÿÿ-+ÿÿÃwÿí¥ÿÿ¿ü?ÿðOÿõ¥ÿÿý‡ÿÿWÿÿÃÿ÷„½~õÒÒ}ºï]ßÿôiýúýïÿý¿Ý¿]+õþ»:­¿ÿQÛÿzþqûz¯_}j»ï[zíßÿÿuÝš/íõýí÷ÿ«¥íš&×Õ#>Íj{Û3úìúé³?ïÕ�zé{aK>±Ø)ûû?ÚÿÓgÿµaž½[][ +é]„aÚ« .ÝZ¶´¶ÂÚL0’iäw­Ûi&¬Q’œve©GcMTׂäL¦ØKAl‹¦Òa„¶EͱIÃi-±M¤›®6! Ãa+A± +ÂA«IˆI¦Ä$ÓM¶I¦Zªá7ØAS T4N“ob‚p‚jI»M‚(p­6`‚NžXè0­ˆ'F†Q !„ P0¥[ž!„Šâ ®*Êê=!ˆFµ)r>ýøDŽU°Á"°Q¯ ! š°B2€Ï\D1di0FUb#.B¨8ˆþúï2‰º¯¯¹ŸñãZþ¹ØÏׯץ¯ý.Òôò¶¼˜Gj,Ük),•™öt Ž£*$(ÖÌÅÖé™ Šw›3¨ÈÒ!ŠH :"Œº‡7#P �„BtÙærç‚9ž…�U’Àð�„kdùƒÐ! •C»4xaÙŒ#cF°Â6£['“׎ȣ F€aÙ>z Ã5œœÏ���„nØFÀÉy0��„n°rg6°?4 Sƒ i§£»IµTƒrc ¡Q¡£ÛI´˜ÐM¤ÚL=CH70qH:Ú¢­è«i6î“i6“²Ð˜hh&ÒpÛ-ža&Ðg˜w3„yâI°ƒ#šM¸…¸zéB[ :MêÚ% ¬« Rm'L_ÒouÒëÒmŠÚ_¥¥oM÷Wð«Û[¦’ºö�-]n«ô­¡Æ"•%íí¥¿ŠÚ¿»B¾þ“¯ú­?»¾Þ­ +·»__q¤)7ûÝF¶½Ðþã_Jø×ÝF>´7ÿút)ëßñýã?«|:CþÜÃD=û¢Ü•ú-Éü¸&_ûÿËWýÿ夫}|?ÿËì9u}_ŬÇÿÿþÿïëÿý‡×ý/‡ÿÿþ¿ÿÿûÿÿêÚ_ÿ᾿ÿ†ÿÿëÿÿÿÿÿþO»¯ÿøo‚3ÿÿÿÿÿÿÿÿÿõÿ…Û…ýwáø@¿ûðßÿÿïÿÿÿÿÿH.ÇßÿÒÿßÃÝþ½ßïßÿúÞÚÿõ Wv»×íWú¿}ý¿ßûÿÿúúþ¿õÕÛëµÊ7ëÿþsÛ¿zÛ¾ÕÛý¿¿ÿouÿíS½µÞ½mÿé7kÕš'_KmµûlÑ_¶gÿ¯é6f¶êÿ½Ù s?°Ïï [Kêßþ“gþÛVÕ¾Û^ÏmíÛ õ`–c]°’{f+í8i0Ë´ÛISMV ¶(1M…VÒAÃJY »bƒa¦°Òb˜í&CÌlh$b˜ÙCƒƒMŠM6!i¦œ§aÅ&ØH ÓM;k°Âa6¡ÂPÅÙå¸ÄM¾%ò §‚“<1M:w)ÚL)ÛAƒ%v›I6%z¦˜L)YG¶EBF†Ô>ec•P„F4|aˆ&WH²GõûÚZV¿ýÖÙžÝ×uõ·ô߯½×»gõ»ÃûMë[Ìm„©3"ÜËã±" Y2ÎÊ`ªE{imµºV­ÕÕ×¥l0“ äé&é'i7";´¢äW 4û pØaŠN©›":§M0›„¸P¨ï +g…P©ÛI8=¦Ò´l ›I´“Aä‚lSÃI6I¶–ÖÃÙXM&�J†‚:¦Ó®„"�lŸ•�„¦— ?ôïØ ›MlBˆAŠb™χ´…*Ø0�‚(éƒްb› &2ZJ!b úBïBûNïP± a ˆaˆ†DE³²\E'×ÿÉÐÇ-êé/ñü‚zö ŽÌ²úÿ®¼7A%_ÿÎ$È�O$k"AhŠ$VFÃTš‘\¤ˆš"ÈöifãXÉae R\f™³Ê{6‰Ñ) y@BB6ÌÅÁh_“ò #8dú¦ #[E`fÈùé’ú„û`¢ˆI¦ �0)" 2 ñ+ x@Â5²|Á„| ‚ ÓL#ãPƒÂ48ÁB5°��èØÓL"¿$îÃn“i6©ª¤ØIßÙj(ŽßÒoÑ�„mBaÝSG‡£ÃIµ +“MBÓWDpô›jA´›Ò „5á»2°�,&xÂn‚½Ü>é W=–„e¡‹¥iŸ7p™â|[I°ˆÇ¤î“¥N Ý¥¾–“zV‰ZQ ÿî—¾ÒÚ�þï Ž•¾ß{û´ôÚÝ•½/L]½IÒ¿mÆûý!­§hTŽÿßâû}j¯ý~Üm +Þ»îûTÚJ;zï{þ£¾ñÃÿ÷ëþ‡¿¿î‹�úø�úý?oúÿE§ÿÿMÿ,oÿÿŽ­ÿ°nÝwIW­ì?ýWþÿÿÿÿÿÿý}¿Õ×ÿöÿÿá¿ÿúÿÿÿïÿþÃü¯ÿÃþKÏþÿÿÿÿÿÿÿþ þжÚÿþ ÿú ÿ ÿõÿÿÿÿÿÿÃþú»ÿßÿ°—ý‡ÿþ¯ÿÿÿ¯½mûõ¯ýºß¯Þ¿÷ÿÿÝÿýö¿ï®–îõë”'×û_öΫÿÿëÿ÷ÿ×½wç–µëÝ®õß×íÿíõ¯÷÷¯ÛÿþÕ¾ýþýoÚmëm~ŽV“kwj¿gûÛû½vÚWí™ÿÿð›?n–Úúë·Øg¦Òø^·Õ„Pï1¶r‘\=4Û iHAÚr%uî^mròí˜=Y;ONÕŠM´“b“´› ' ‡± ´�a†Aí0¬Û¨-šaІ“ M…vx„Ú ˆH4Ø„š …¦šr�„0“m ›#…°a-ªƒLBPÅ#å‘i•b4ÁL ÂÂF·+2�˜2eAˆM"¹¢±ƒ#ãžØaAJÆ2ªDf¤=¡¤!s"6pÜDDR£¼B"#ŠñézפºüiÔ'Äþ@BNZÄÑ6…–ƒ‘dv[�’è’þ^õ"§89ZŽÍlˆd]ɱ”vµ˜)$Á ¡%<¦Œ¥ +`“ÿù\Y‘\(R\Œd)éúO¾3=ïß“D©ýÿ¿ê?Núño»Ö×û¿Y 틈åKû»ï´Çñý²õÛ�šcÙÇõ×µÊðŽÊò3Îd™-^—üì„S¢ q?]×8ΤF"LÈc"‚’ãÌó!„$#lÌPR¶‚b›uo\;[¬˜ëÖÒm B"ÛIÕ'WDvÂ>R ¡¤ÚZ ƒSçˆl*¶Ë?Nœ2ŒÁ‚]œãhÐ"Ü<#aÓžg€Â #ÃÐ|"ì=4xa¦prtçõOFÀâé:i„Òm éô{a4wjð’ úL4›IÒm–¢ƒ8GšÚ´“iné>–u]…q½+Dž +Õ„E.iXD­.¢­íÿ‹ü"ž�dyTž©'H7Mé6¨Ž!I°“ ½ØI´œ fÚ=ÝöYál´rý…e�8TÏMÖñoØPô•úMô¢“z¤Ö—Tº¾õþÿþé'BûûßÕ>ÛŠ§im>ïïµm& Ži[´“¥izVa·ô«±¿W„ÃoZ ë{~£Ó¥¯Oû{i$¿¾7¾íoZ¾µúû]ÖïÕ©;»éoh-ß]Ðïo¿áÿ­t�-ëšKÖÿÒ×_t»­ÿvŸU§~Ýõ6-iîÛ¿‘ÃúWzW»ú_¡¯õþëÿü�ÿ±ÿ§å¹!¯¿ðÿ­îã^¶�ׯîÓ׺‘Â×_»ÿ¾ß࣯Óö’ÈÏþ?ÿÇùfã÷ýøÿþÃÿ[|XÿÃÿOíW}¨ú_ãÿ#OLJÿÿú-É'»ðÿÇëý‡�«pØjßþ¾—úþÝkýWÖß°×ÿðÃßÿ ?6/ïñÝ(?å“ÿúCûÿÿ¿�ûô–¿÷¯öÿõ×_×ýn¿×ýëa‘ �þÿü7õÐõ×Û¥÷ÿ×ý¿ÿþÿü0ÿõ¿}µþ�°Ãÿü#½ºÿÁÿ·_ÿöÁÐ/ÿðßÿàþ?ëۣ°×ÿõzüžØÿÿÿá¿ò_oûþÿÃaÿÿÚ +ÿÂÿ®¿ÿømÃiÿ¾¿ûÿ•6ÚçVG†ò"ÿ4�´¿AaÿÿÿÿÃ~ö¿ý?ü6ëÿ­‘Óþ—þ=¿ïCº_í×oý~ÿÕÃh-ÝDëÿúØa+ð– ÿÿõßûÿ ·ýtwoí«»¯þ–Š®ßëþÃÒÿ¿ð–ëÿ¯”‰Û­ÿ]Ä,%æð—ßøK¿Òßÿÿ_ÿÝ*¿ý&ïÿ{ÿõÓ¿õ_ÿÿÿ×9ú½mÞë×ç?â–�_íÛ_ÿü#UõßÿÿöúóDþ·ÿétÿ½Ú1ï_ÿ«múÿþ—®Ù:ýlŽ_ûk¶gõÕ¥ÿW÷ inDoþÿë­ÿ›ÿÿý/×ÿöõoúÖÛ'_iM¥ÿÚ²ÌϽ¿Oö�Ú]ûa%ïdf×ãÈë^é[ i6––ŸiH¹÷ú×MëÙ:ÿøeæÍêÝkÿ[f}Ò÷_Ùþí†}~–“m„³ïu´›J×Tû‘\6Û dGpa¿dTl&-‘n› šl4Ô60ƒM0ØA Ø… Ã+H&šm¤Òt¶Aÿ{ÚM™­öUþÕ�Ç0¿a0�izÝ«eë´•†Ð["ÛKì0`”6 S´¬'lPO0ÃA6•¤A 4Ó‚ì1AƒÚÚtÂm5¡&Ô; ˜[ôw²(ÄÒ=Í${aŠFv)ˆQedC !§m§ ‡¾È£á°Óbjšvm± ÖG aé Ó`ôâNÂH6! Eà¨:´‚a4Ø…´¤Óƒ ©„à +Þg†!2: + B•’®EsG¬¬´2¨Á„qE' 2%E ®QˆÓNÓ§¨dt�bZa¤îÂ»Û †Âi‘jk´ÔðÚ•Žr­†† �Pa&§>2ŒˆÄAœÆXâ„DD9nƒˆâ*¯ÑÃ?4s¹XÄpb0B2¶PsÌ�o8p¯ÒüDRqŸ×­VºÖµþ—ÿõÿJý&Òý%uôØA`¬0A'´½.Ä2N‚t…vÒa„´ÃbžMÕUЦB/a¦"#LR±ŒDDù—KdA–ôЬvÖZ@Ñ\*;&É+ �¬¢”—ÕVvO2�ª$®ŒôÓíià ¤ÉËuqÙS úM_îý,&«îÓ¤5¾ùÙWÝ÷÷ÿ;SÄqýïûDM0²¹¯�è¿ÿ_ã™*â§eýuý%×9šË¿ëú~¤#¢V”ƒDZ:‘%E 6E!fȤ�™ �Öò'ÍB‘#È„è@Â5‡ýS+MNþÈ ÎÔÆP4D¡‰#Æt:pˆb�e*ÌŽÑ3ÁXOÉLð Ÿ64BTD¿=Â5³y çÏL£Ö ¤M0�…�nÉù3›74~êšMòMTDâ-ç‘GÖJÈ£8È„O’ñG hEE9XHXöJr9“ç 3DˆK"Ù*Èð—.óÆ|Â60�a„hj�m$&0��ÂaZÞc·VÔ.yÌ9WUFv“'É©µI¾{h‹®“iné6•¥²Îæ“r«›Äp³cDAPOÂÈñ'¤]’&ÂCG…é8k]½*õÆ�Åzý!R8[ý +»ûiZ%µ¿I¯ øt–ýûvö»Ç´P÷ñKiöŸUwoê¿ì¸‰ zm?ºVºúõµ¿ºNÿíþé~ßN¿¯#˜Ësêß^ªâªª–£NÕ½úí +— NРkj£¿uþÿ÷úV­¡¨ü‡Ÿýçÿ×MõøÿÿþÞ—ÿÿßþ�°ÿ¡í­qµu×»í¤‘>ñ¾é„qðÕØï¿è´þýèåíV¼ºµü´úÕÿõýÒÿôÿÿú^¿öëoýä‘DÇ$˜æéëû{EŒß.°èƒÿÿø~Ýj¿ÿÿÿÿ¯ÿúÿ¥ûi6Ž>¿ÿÿü7ÿí/Ç¡¡×ýÿ÷öû ÿðßêÝøE×ÿÿÿõûÁÿû×M¯ÿÿ÷ÿƒýÿ_ÿÿðßû`Œ?ÿÿ =[¯!¯ÿ¿ÿÿÿýÿ ÿÒý†–½þ¿ÿöÿÝ´w¥ÿáÿßÿøoüA?ÿþ}]B¿× Ÿÿÿÿ¿ÿô¿ô¿ƒn�ÿöëÿß÷õÿ„ ßý?ÿðßøt¿ÿü7ý]%ÿé{ÿ÷þ¯Ýmþ—ÿÿ)Hqÿ×­ÿnÿݵëÿÒÿþS¿ïû{ýÂKÿ÷ïì8iwj½Ýÿþßúÿ¯ÿ¥øMªýÿ]éÿnΫýý6—ßvõúÒ{ÿ¯÷ÿÿÿýÿÿ_ßý»þ¯zïõ_ôŒÿý¯ïúï¾Õ¶Ìû¯ìÑXqÿ»ý¿®·ûzí�S·ù§¯ÿíùÍõ}W½¶ÿnÿÿÝ[ÛÕ¿õÿÿäfÿ·ö•ºMÃû>›ô›1û /kÛîÕ[þ´›oþ¿ÿÿÿûlÏý/Ú×öÌöõlÆÙý¾ý†}fÕí¤ÚÒÛVî ý²õªI§°î�=6 ÄŸ¤›i1²,0ÆÈ^|aÄ+þÙ¢ÛlÍjÚúôí™þÙŸimÝ6f¾ú´ûUûK[­²õr á혰“ Ý"¸q°`¬Z§l‡˜Ó ¶‚bƒi Ù{#‹%h ÓˆIƶ›I§`Å&� ­²:I‘ÀMl&™š(Ño .ÿa%löÚÈ®Ï_ianÂZl0–’l3ŠÒ`Á-9VMSM6G1IÛi'ž˜'NE‹¦°˜„Èà$Ó †¡-°Â²8 °�&ÖÔ(U3´{l �m$$V4V4z\FUÈD ¬�1!†õ¦› ŠbšÃa;A*i†)4Ø«I6B{A)4ØL:v“M;NƒXM‘ѵCU*ØjƒvK°D§ 4P„DD2ö«;ŽÇÝÌ�Â6©4à 6TÐ`‚w!¬lGÆTa‚ˆE:ÂExˆ0b#+'fpŠ–RˆUþvaFAÂ"4"3õþ"8õô—õô’ÿí¥_ÂJÃHSøUdI +º­ c+n"4Ñ­ŒDùM˜Îõ审•Ô³#\íDKÀ¤¥‚Ë0¯; F@yFƒ +ÌîMÉ2ŒìµŒ` ™•pP¤.÷¬ï-Ý÷’C-Ò3±à¡Y·¯ýUk}ß÷Ö^Û¿ïп×äþ‚ðÃÝ­Ý¥*?O'_¯wIݼìBññÿõý¥í÷ÿ¯W§�ÍdS×9‹’¿KÛ×üífU+A™‰Y�H�Y@¤Èȧ y deè‰ÓdCÏ(Éæ%D'B¬3LÁõ×ÜîÑÎÍITäj"VgBÈdD/9’ R\BFl�‘*!<ðNLÐÂ_!£ð ؇ #YŽháámÃ(ÓF°hÖ°2�0úè0‹ÆÉø4l#Êifw£Å&Ó^I¢<¥LΦFdÁù¬eXÈe’FIæ±#AIѶh) vKŠO˜$*FeÌÓ60�¢!Ö¤\ÁÁ„køFge_²s'çÉùڄѱ®šÁ™šM ™5I°ÕS¤Vô› ÐÒl ›Òa„Ô«ï ³ƒ8á6î“æl µe¢-¤ê˜$Ú!0†|%æ¶Ö¦0�”AF¶¬0�aáÃ(ÓÂ4?¢ì#cM0�Œ#[l#[TÒÒtÓH7¸F†“qi6“Vi¯»¤êA´ÃI†ËYî ´šPë´ÒN“¤ý6“aŠN“zO‡§êjÞü/Ý_t¯|q¤ä±I´›L#;H6¡;&Òm&�m $›ùþ‚m Ú ô´ÃIÕ´ÏL6Z¤ØDž“¤Þ‚mCA}õ«§I·÷þÖ·Iý1KKÒ^ݤšïï¿ô¯Õ÷Kób¸ái[-¡ ­&Óm&Ó ¥i:Mé6(é~4º%mFÕéÒÒéÒצ•Õ½_ ?ýº·N—øú®î?u¨×©*MШ¤Þ“o¿Ö¯ÿë¿ê é´­ÝõµéÒ·ÖÕÒoíØKÿªm +Wo^ëÖÿ}:ãC^¶âÿöë¿·ízãºÃ¡þFŸº_ýWû÷ÿÿÿ�wUöéKëú·OCúM´=~”~ÝÝmu�n—ýj­õÿü>›õÿùdý/°×ñ_Õõ}oþ¿ÿ¯ý/ÞG Þº[Öú,pZ·ÿCúH·$Šðñýöÿ–Ÿ_íÿûÿßÿÿÛ¨zéoýÿÈÇÿÿëÿÿæƒïŽ÷¤2ÓõÆ«ÕÿÿØz÷ëëÿZý¯ÿì?ÿÿÿ]u ýÿÿÿ·ÿþÝÿÿô¿Kÿ¿×ÿõô¿Øzÿ¯ÿëõÿÿá¿ÿÿý´³¬÷A¼ˆºÿÿýÿ÷AÿÞ?öÿÿÿÿÿãý/ðÞÃÿÈÆ]ÿëßÿÿþÿÿÿÛ… ·Á½ýÿõÿ¿ýþÈÈ÷ÿÿÿîÒÿÿÿÿÁúÿƒx@Ÿ¯…_ÿýß_ÿáûÿÿý‘‘KÒ}/õï_]+ÿëÑÓÿÿ÷¶—ÿÿÿÿé_ï¯þý¿÷ÿÛ¯ÿ¯×ÿ´PÊì7µ]ßöý¿ßý××ïÿ¿ÿí¥õýßëÚ_¥½%ýõÿ_ÞýzÿûúûuÿéëäbÛ_»­¾¾º¿ûý}ÿöÿ¾ÅEwí¯Ûõ·úþ¾ô믾¿ºÿöÚïÿÞq{uî¿ÞÚþ÷ÿ¶évén–¿z½6²>ßßÙþúV´íÿ×½ºýoÿFi¾Ôçëýúý×íí½v—ÿÝn¿uÿ¶g²ýk¦õkmŸÛ]³ûkm®fÖï0½´¬º¶°Á4ò;TÃeÍ~ßí·í¯Ûw[¥úúKfkzêµí¾ïÝ/Û?íš+[zý[õVémÒVËɰÂ(và 7r+‡ÚA°°eÍX¦ÒL1M¤›h ƒîÓc4ÛI�mPaƒ0Ób¦Å ö•ŸVõgöÌÿzöÏö}6–ÚÝápýU°©¶•ªÈƒ‡í‚r(áêÚL‹”Ø«dÚJÚI„Ó¹Ü:M°’ &H â ƒŠ´*vÒb˜N›6‚A´4m‚(uxA„-…*åbš`¥RÖ<|†©uºM…dD'l$ôÛI4Ø Æé&Ú&ñN˜NÁX«m+ªa8A¦È® šMÚM'mÃ6ŠCa ®í6&Eò±†!"³<6!#[aJ» +êÈÑ„W1 Pb�ŸdDbÄs!d2& Eäb˜OAŠbM0Ù“L4 ˜è&Ä+m…A;„GA6!FB…SÃG¸hZ sà B 8Ð#RzÇ(`DÞ¤â"¤ÞÄ Á0„C ×EuˆD³1ÖƒE:s*º,Ëž–¤ÜD+×öÒÕn­„ÕiC -"Rl0•´dœ,„Á”ÒT1ÿü¦SæBt³As¹¢ßâÜ. +v©–´›Æ@±]#4aHˆì— +º}ÎÕÄñ‘ Bªªöÿü™Ê§bxG²ü½�÷vœi{i?ÓM;¿çz¬s'áì4Ÿßÿ×Ö—†ÕÚ;²ª¿ÿ×ÊÊZ_}�ëÿù^ò)‘,Ôò‘#O9LŒŠAI3l‘ Yª^Þ+¯þDüʑԊDqšˆè2Ô‚ +P)Q›3 …Z8gÌè)#6Ï™x«˜0F€xF€Éƒ{ �@Â3†O„ Ùžg„Ði„ð��¢í2~Nf†¡<ü…Ró¿Måmš�s™¬”˜Dè̉�’’F31JqN¬ÐSZ'D1 Äù O8)ç—4Ì2C1gÈì±aÖyB #XaFéNff²xÒ0��0˜&°4Õl ˜iô˜iªAßki6¨ðÒ¨Ž<0ˆ°ô›A;º Ñ6Yóÿ�Åò BFlˆa » Y²hÖÑ ��„k —8HÐ pÂ5‡„]†Q¨GÊ<390�ŽOÉÌøØ6OÍo둎õmßAT#ÛIŠDp ´›§w¦ÐM„EºA´Áœi6ž“¤é7 ›Pë³!ÚN˜ºê�6.�7¥i>뿤�oѱª ¨Ù{5JI´›ð�m&öK‚ mH7 ˜hZNt4né8wKðÓPA½'Jø ¨S­ ›«JÒß^® +êÒ…¤ÚN•¤é^­ï�ºûx«»»¯énþ— ~“ 8Ò†“Ü0¡m¤ÚVË<[A[-¤­-&úmt¢º%½Ô}'ÿ¦ÿI­.›§§]SWüU7um§uwTvô�Æúëk·iô4¿¯÷뿤ð›Iñvé4•þ»¿í«­êôºÜU_¿ÿm-½-GIÚ×}Hác_íHá÷]þ­ÔŽ’þû÷íÿÛÑ8&_øõúZKô­ý?a»ê*__|ŽÛ¤ž†›ÖÜzÚ�ïëþ·ë®ŸÿùËŽ‹ør'¦ÿ^³‰võêÿÁÿÿC_ÿéV¿Ûô;°ß½D¯·ªÚ¯×ÃEŽF_Ãñýµïp—ÿé+ü9c_ÿßHuýöõöÿÿúÿç…ãúûËšÛýQf?�ßÿêÞÁþ>Ãõÿß__úÿÿa¥ëÿÿÿû¯·ÿÿþãÿÒúý~�Áàßÿú]éo[ÿ·ÿ°ý~ëõãýµÿÿ ÿÿÿÿþ þÏðoÿÿü Ÿý!ëûþÞßÿÿº)Ýzÿû Œ¿ðß‚0ÿuüßßí ¿ÿÁ»ÿÿÿÿðßáü?ÿýï¥ÿ¯gÿþ ïÿÿú믯ø: ÿáÿ¯Â ù�þéWûþÿÿÞÿøÒý¿ÿïý/þº ÿû ïÿÿ{uÿþ á¿KöÒýoüïößî¿uÞí/_ýþ·ÿ_K„¿µ×¿ýÿú¶—¿ï[¥÷ïëýõ¥Þÿ¥íÛþ÷úÿoûu”oú¯‘‰¯ý{oõ_üÍ]/ÿw|«_÷þûý½v»ÿûúÿëÿ·úþÝ÷œÚýë÷KíºÝo¯ÿÕúÛ¾×]}%úû×ßK_íÿ}=×~õ”-}¿9÷ÿ¿Z«}ÿû{¯êÙ:öÿî­³4Û¥Ým¥ßõÿimž›îíàïl½ªíµû:zÿíÿ·¾êÛ¥Úýk·jÝ~¿Ú_¶gíÿ!�³ûgû¶û¦%­¤¾él0¬3•ªº_È–Óƒm5aªiÚv�MŠd öE{ ¤ÓˆIÃ#Žúû×¶ú3í/ÛlÏý³ýíZL3ûk½v¸O³ÝÞ“`ŠÈ®ÛJ’r+†Ã -¦š¶�±LPc‘¶“ša´“L à ƒbƒA à $pÒa&›Nšv ša4ðA&A­„Õ<¨dû Ù ¾Â0àý´µoN´Û_V¹† 6_Ó°”ˆG Ó m$ÛI;JG Ãȃí&xZiðEô“a8b“´Ó»°¬ ÂdpTØ ƒ Q¡†)Ú=¹Wb6A„ Ä)XÃR² ™TDe +¤„G;4 Ûb{i&›!}¤— š Å1QV˜b˜UM„bh$Ø`�&ØA0šM„ÂiŠq„ÓHñG°úb¬maJ¤ ¤KA”?§†ˆ\ðÃ2A¦ƒ�lÓ'Á„ aV9Y0„C�‚ B5 Å#Œ™*HDDUþÙ‘x´…/í¤«_m*µøm½_a„�&ÐA0ƒ· d;9«F‡¢Ý؈ÚÿùM*™ØE2IKd¦)yÞ°U +A¥–e‘�¤M¡’MLð¡Iy+§ÎÁ"·‚FJ;Â�šGaÊŸkªAß¾)/…P—ûþ層Óý=è_ý÷Úü{¾úôÑ!c��ÿ÷üE<ÓýùÊ_ëÖ¿�˜Dº!hºÉ\JÏ8óŒ“,Ùk¿¯ú�¨èõ:+ÈÔˆÓ6yA#X¤0äK6gÌ�!@΂”2@�ðƒÐe4cÓØ¦Ÿ×ò²dj*Qšˆê24Y*ÈŒŒÆ{6‰òœd�IÅÉÄ;YÍ‘C/"!sÁ>5†Ð ÙŸ=œk ƒÌð@Ѳi£ãPžì3ƒ<Â.ØFé/(LF¸FÂ>7&ÒÞ¡0Œì6 Þ�nÂ=µ&+ÖÒl&²´ddk,˜Ëç#E›0ˆJŠ��02§Ñ¸â/�™�’¶f!ÐÜiL�x "ì¤Ì EÙ>†±„k ÖxöG‡Á Šæv4=Ùd¡“"�uT›Iöý'TÑá¤ê“…G€ô¶šA6–¨ŽÈ¶Òµi&Òt›eƒ á>é=׋i+Wi^œ¦0�’ 3œ, Éì#`~š64*)SM4lhÝ dèl $I´Õ&ÕØA2\›I‡&M1„4›`©]Ú ÐMª 󦂳 Ži6“‡}–táSm,*¾-êÿM¤ê‚‚Òê’ñI¾šmô¼[þ½ÿN"Ý¥ÉpA©µe¡6Ë@g &à  ƒ8hh&NÚZeÚN˜ºÒV“n°‹ˆa…Þ”Ru}u«V—¦»Çý1éÒwÇ}-éUwiÞµ~þö¿Ôk§uýHá^“Ĥîõ ×JÞ�+ê›D¡+¥úN–—N¿{ö“ôçŒiïÕ¤½Szt·ÚÈúßþîëöíõê¤pµïé}©=¯ïýÿO!οM¥½ôÿý6©¶­6Ð¥kþ8OÜkwKCï^«zºøÝÿ}ÐŽÿïúÞøí×»þ?ìÞ�Óþ¿ÿú,f–Ö¯o^ú‘Âþ‡îþÝ~¨S^×_ªOû�¬5E¹-‚ÿÿ—XìÿÃÿÕ!ÿÿª`×þ¿ÿÛÿãýokÿ_Ë�½×_Ò–WÅå‰ïý[¨zøÿÿìü?ר­×ÿ몷ÿÿÿýÿ_ëýüuÛÿÿ¯ÿ­}ëõ<(aëÿ¶—ûá‡ÿá‡O”[¯ÿå7Xaÿ÷ÿþÚ_õÿo_ÿÿ¯ëÿÕuö×þ×q÷ì<#�ÿÞ¿Á¿ðÿþúOÕÿüñt¬?ÿÿÿº ÿÿè¡ßÿÿ¶¿ÿÿ‚0üèËÞݶ‚Â[Ñ!áÿû /ðßøoÿà¶Òÿü ¶GHmÿÿÿö‡ï•­ÿÛWKÿÿëÿÿíÒþè/÷KAzBÞ—ÿÁÿ¿øïÞ×K·ÿõÙZÞëÿïÿ {ð—ÿÓÿ÷þÚÿÿ„£÷ì ­ºñÂ[ =„¾ÿœ³öÿïûûþ«Ýÿé`•¾¿þßþŸßKûÝn¿ÿîúþÿ·__Ð*õÒÿÿÿÂ_¹©?ù¢ÿ¿9ýk¾ÿþªÙÓ§¯ÿÿÿÛéñLíÿúïOûÚú¯¦-¿®¾KîÚ®ß÷ý­_÷þÿÖ—ûf‰¿ÿÙæfµmí[3_û ÿVϯþëUÿþÛõÚß}·ÿÿÝ«õzù§üƒÌÀ÷¶g¶·ÿ_Úí®—`Ž;.�µ¸küŠ8m¶é´µ]† °aSTÓM´Ód/‡UûßÿlÕÿf®ôÿ·zÞ¿!Žf{¥Ècúui6z°™Øi/¶©ÙM† tÈŽö´—L1iéZA8¦1A‘]&M ì1 ´›A 4ØfØ1I¦šiØNÚOwíû÷Ù„Ùé;6—m'´•´˜vÞÃ96n‘\5‘\;Ûa‚ ´“m8`Û¶ ÅHᦤ 6i±I±P ¬'ÚI¦›#„œ4¡Â¶šÃ ¨$Sà‹ò­£Ãa5<Øa23®Ê¼öU•Œ0„R… +é‘Ï4D„#†Ú{ô«llW"ÛV*­ƒm&* Pb˜Z „á0›aŠa¤l ÚzlL&šØHñFvж�KÊÆ)EÁ,ˆdöZ‚b#™v®e¸�§°›"©ÓL&ÓÛV˜aqVÄ&JÐz`ƒ +ƒH¬m4� ŸG¤AˆF´ŠD�åzñHRwH·®I×�†¥VTˆˆˆó75N"*â¢*øúÒñëW^’ë_ëK®µÝ.•¤ÚU¯¯]$µÒmI}-$›I+ 28 �»ê]´›A°a! àÄ fÚ$¡�»!KdVên„z 0@Ë +ˆŽ‚b#ÿùj…RnNR~v*~ŸÓþwýd'Ëpˆ—XëÎôÕê©å Í¢4. ³aNviõ5¢ˆè¬³£:¦¹ÈÔ2*ğ2AFvÔÙ™š3ò{ŠŽUshÒ<.s(΂” +ˆI…‘â_0`“5 h<ó@`�Ñ 3L h„ „è@Â5²33Âa0� #X2øFÆ‚bŸA7쳦0IÞÉy:ÙÒÕRmSMR ¤áÚ…wÂ44ƒaB#†�m'IŠI´�Ý|/ö˜A/è&Òm–€˜h29„h3†¡Òºt›Ažlà †éXIØékIZ_¥þõÖ÷Õ´Ÿ¸M¯Wûj›»ºôêšÿ^þ¿KýWv…5vñR8[‹§úãÚú×�üÛ«u_ñÃé·�wŽÑc§ÿÐOøþˆvA×ÿúõôXätzú-?Ñu‡�ÿËIÿùl“þ¿Ýz_ñƒÿÿØÿÿêÝÿïÛUÿoß÷öÿÿø]ó9ÿÒôÇÿ†ÿþüÿÿÿñm/þ¿Ýn¡ÿƒÿûÿÿá-´ßá/ø{Òöý®Ãÿÿÿ¥± ÿÿýˆK÷°ÿ÷¯½ÿýÿ¥„z�þ¿ïoÿýºÿÛ:§ÿÿÿÕ=ûõÿê¾­�Súíõë·ÿíÿ¯¶ßÿùÄçëëûf‰RÞ¶Ìý-³4ÝYšû¿lÏÿ»�Ç3ùêÈAÜ0ÃM6EBõiíöé³i]¥il0ºM…^D ‰�a‚I§§ ¶Ø¬1°¿M6øfdAØb›X¦Ò †+IÅCH1H4Úh&›­4Ói¶ÚÃ.á„"2“ÇM8AÁl(„ B¶Ra„Å0H¬£Ûa0‘í£áG„FœöP©éDjd„e­„Wӈ⯯_KõÿK»i'öEê`Ùd*‡b#ÿÊd±B#65-”¼ï4g�…9jƒ4ÐOÃ^¢ö�ñäÜ+Îʾ’¯Lìë*‰Iƒ%â‘DL�b’P) ùÚ^u27ì‰ �T.dTR h„ Ó"êFAÈO"U—9²82ŒÃD$ÊA¬2F�¦#0aÃF†±£[øùÔŽ  B�HqŒ“l#XdŒÀ˜@Ê"æ¬0�m3Â5†HÓ*4{a~ £Û3“ùѰ4ÂaBi«zi6¡4!ª¤ØAÒmé?4“MØEÙ‚a ›Iµ £ÃPšªM¤ÚN©0ÓöÕ é6Ë? h3Í ì³ Ø]xÏNË=&gÚ%ì Èæ‚m-+ZÇ„±œ4ºa›IÒa¦x�Oš‡IµiuH6�…QKÔ>õ¯¥x5[¥¾“í´í–ÕÖìSðšztŸ°“Óí>Þé^6*•´ÿûŠ[Ocí¸»]{öû·B“t1÷Ý­uÕhVëÝ·ïÝþô¾¼Vë÷õEŽG@ïû×ñª¶ÿ¾ˆ$Ü7Výá�ãü?ßúÿ½^±†ÁÿÇôX¿ÿ—Xpúÿ‡úû[ÿ]ÿ÷ývþ¿¥ÿïì6ÿ°×רÿ¯ÿÿþoÿ¶—ÿÿì0ßÿƒa|#�ì7ÿêÏ×ÿÿðlÿ”-ëÿÿðl7ÿá°F�`‚~�¿ÿÂÿÿÿ{aÿá'mÿÿøpßî—é~ÿ_º_ßý~öÿér3îÿõöÃÿøm/Òýö×ýëÿmowÿ¯>­úÿûëý/õíÿÿU÷_×ëléæÿÔ%Û¯ýy©4m>Úþy?Þ¿œýëÿþëúÝ[lÑ=]×¶ÛºÿKmUkzýj×õþ¶ÒÿûÝ~Ò¶é³õ…´¿ÿ¬ƒû3VëÿíŸúµí/í,‡Ù�‘úö—j²+ƒÌ{h$ý%m&(1 +ÖÒ¯­„wÛ (a››„ž�„­ƒ­[H&IBa[X¦p¨&‡AIA¦ÂiƒM´­< I¶�a4Ø ™è4 6)¦Å6M4ôMŠa ›A[ á¶&MLí„ÔE»dZÍ’9ñ£Ü£Æb­ C&¶dØÆd|­E‘e#Û•sI„G¤0@ BG¹B4¨¹‘T `ÍH¢ß�Œ!DfC PR +YUw;Te—)4Jw—Þ¯õ÷}Òÿ~ýeuU¥ýëÍ1îëéãë«ia9¿üÈ ’³"�ÆJ#XØ0’§(óª;(ÍFj,äjd‚%™š,"9ìš$â‘aJ$fàÊ3dÐ00F°Í3¢Í �ÁF¶O˜0ÁŠ ";%" ”HFÌ”flPEY�h #[ÂÎF°È4Ÿ’Ÿ?(AèØÂ5°��SMB &TÒmSÐN…¤ÃMEìxGz64|FÆš”’¦«i2>L=ÚMÓª*Ú<\>ËE]é0Òm ØAœ#†>h&Ðg &Ðg›,éÑ/h+Pâ?°•„ƒz ††¨3„y«i4•غZºm‹oøT7¥¤õp©ý[„ëÓ}‹N¾×­'ïWD¢´Ó¥­%í¤ø´ÿû´Þ©¤êÛ´í6–ý¦þ®Ú‘¸õzi&ô­¡ëõ#…®»÷ÿiß�EÝö÷AÂ×Ãï‚ýZŠþÛ»^—¿øöÿÿ÷¢Ü�Ú¦ÿÛ_ñý‡ºCýê›×ÿÇü}aÿÿïâ¿ÿÿÿ°ÿúÚ¯×ÿ®©~Ãÿþÿõÿýÿý¿ÿÿÿéuú°ÿÿÿÿÿÿÿÃÿÏýÿø#=µüÑ‘Ø7ÿÿÿÿÿÿþ÷ô†ÿÿÿ-´úáÿÿÿÿÿõÿ÷ÿôÿÿÿÖÄ/ÒÛÿÿëíºÿ¯ûýú~Ê„·m×ÿúZ*¿ª¿ÿõ¯o¯ú·_þh½oˆûë½ë„ï×9ÿßÿíÛ×ýkíÿW–šÂÓÛuÚÿúÿÿ_ÿú^h›mÕëÛ3ÿêÒlÿ“zÑ\P‚u¶Ýw¯þí�Oõëûû»­†­Ÿî½m&ÒÓ°•í˜I¥¤Á‚Jdµ�©É„x•Í%®Ã<®•´“[îE8m›“äWÒOM�ƒµd\á%b˜ Ú 4z †’i†!Óƒ ¥a„ƒ +ª—¾á±†Â +ÛJÓ +šÁ;lRi°¶ši°»i;#¤6a1S½SˆAˆHùQ $[ÑXØAŠŠë¨ï … &0›NxsÃG†Ó +U`ˆ¿*Û0™)YPÌ“ÆBðïÓ]ÑÏ% ÊãPû‘ ;³ ´£‘œDUÿ×]}k_þºå¹K5¦£õþ¿”ˆŽŠ¸�e9�M2 j^5£Œù�j#æt†�²ñ¼Ü]fgœD†GD|Â9“åZ0`�FÊ!&kÿ™, gBTE9"eY¨G¤â(F±J„É�’C»'ËŒ a43Äi„ ‰ÍaÆ¡ƒ» ÎL&°4Ðdq±š¥ ZXààÍ$ì$ÍEªMí%M3%d|ÁØFƲF²ËÐhØs›²~M¶»é �´�SG¤ÃÃi„[¶[¤ƒrcâî‚mÛøÒ ¡A ÒM„�èA‘ÍÚNhL; M0˜}'I´�“!6†“i;ºM¤Û,áži6•„Ï6�l;§n4ÛH ´­Õ¢PºD¢•Õ>°ší'Òx25ÅCG¶Šû‡§JÒÝ&Ñ8IZ[¸IÒ¾´´¾´¯éõ½ÿÚiÕÚÕÇT¿wÌ%_[Š)�£¨ö“ºMᤓ_é­z}:ÚwI¿wÒoÚu#…[úiHáßB*¾¸ý©*úî(uúŠ‘Âþ¤põ¿ÿÿÿüôﯲtÿ¼ºÿ·ørké¾Xäsÿ\Œ¿ùPPõÿõÿÒÖöëHkÿ××û _ÿÇýRñýÿýÿÿÿÿÿÿÿü=}}/ÿÿ_ÿÿÿÿÿÛKÿÿÿþÿÿÿþF™ÿÿÿÿÿÿ¯ÿÿÿü?ÿ÷ÿßúÿÿÿÿßÿÿwÿÿ½|ÿÿÿý/ýýÿÛ­‡ÿÿwö¿{¿¿ûuý/­ÿý¿ýÿ×öïÿßÿï¿õÝþ÷ý¯ý×_õÿ½oïþ­ß·_<¶ïÝ}ÿ¿öÿ÷[ÿuÿoû_Û4Ûí}³=µÝ-¯Ûu¶N›í[lÑfŠ×û­?¶ëý³ßïKVáí„Pím† 1l‹í/wMŸôíÒÛ ^GWmž˜a[/vØ%"¸5´ÛIƒõ‘+i'¦c è0Ã$„Ø„|é¦Ä Èá4ÚRÓ³d ûIŠc‘}¤›Ų,X Ä(„˜L1PP“M0ÚLŽ(460ƒNØ+; iÔ¬a„[DdÁ„ B¢‡lØH0ƒ#„Ó•†d¬&¨0šh£E» &šF²¬«r±†!Šç(¨A"¤7ÄhDFeùÚ#!¨·¯ 8hCˆÌìÖ,¥KUTÕ¡¹Þ¯_¡_áýþWÇ qÿ¯õZ@ÿ™+ÉY©"*2ž4—Èy³"â"šéÎ3®a™:0ˆ´c:²¹�‘qJ$#dxŠ3dt˜dŒØÁÃ4Ì +ˆ@3ÌöÂ<¬‹Çv°36ÉÎašˆŒ¬æÈ†� +xÍå’€Îx°ƒ 3œîÂLâi³M°�aé„k i„Ó  ›L&“jž©:N“Hi7¸Aœ4› ¶ *a›ÐX|�YóI´0“ ÃKH<3†“„ƒalg &p‚L4Ï4›Lûe�Õ×V‘8¤Ûð›¦Þù… &ðÓµºV'¥®®— ÂOÜ&Ÿ½6—ßâ“þÂßÝÖû··K~õ¶¶Ðimm-_éÒmÝØV•¿#‹O½×[B•þÚþ�Ý-vÛþã¬5­!ÝE~·uoÑc�þÇÿÿé¾ÿb¤p¿¥ê.¢¢?õMÿßï�üþ­ÿÿÛØt;küPK^¿þõú_» oÿ÷ÿûÿiú¯ëÿÿÿûh¡î—ÿÿÿmÿïÿÿÿÿþ ‚]×ÿÿÿ¿éµÿò]ÿÿÿßøt¶_ÿßÿ¿×¯ÿ =þßÿßÿêén;¥úÿýïÛÝ/¾í/ûëþ¿WÿuP‚ïþ�/Ö“ßÿª·ï¯ú½}ÿœõ×z¿ïúêßµ^ÞÛkÿm×ýZûÿ÷Úþ“ÖYT"ÜRõ¥mûÿÿ·íºÿ«×ÙõÿÕ« þÞ~“i)\_;$Ô­Û_m³???ì3ÞÃ=°Ïv až½†{n»í&Òö§²)‡iXa¶l,‹Òm ƒï; +¯ÒÒ¶Á.éý°’lS`Óa6)°‚MBv‚m$Ó RiÒl:w´ÛPá5QAˆW•¦“§¿´a›½è ÂlR 4vƒ'a„îçwÄ �lŸ )YEc "*ƒ%´ìFÄe·+êÖïX¤|;™èÚ„X~ˆ¢€Á `„DQC'e‘¼hì- +N?е’¤d–ˆ/Žm¨“`8DV·;*ÎÔ/_þ¾WÄv£ý=Us#TK¯_Z¯ªé�¶K¢$D��ÆPŽd�Q§ †)(G ù’E ,�õÛKL¬k•l…Jt"-3©¦GÈA�ÃD&L ¢.Ñ ð_šÌsÀ2F\Â5†� #[Âh„óÛ\FÀÉ=0˜M!ø!aô»K2U“"VOÁd}�0(#Y’C@4By¬2F`Ïa0Fpг<#`jôÒÔ(T› +š¦“h&Ò „Ñí²Ðƒ²ÑF¶‚l*#¶ñ¤Ú´“úL2|Ñò¨ØÉÞ�·èô›MBn“ B¦���–E&ѶYÃ8i8e“ºNƒ8a2æ“jéZvëOzꂊÒê’ºb˜3lá¤Û&€˜ié[-“aSÒdti&Å1 ›�i¦a¤˜[M„ÓVÚ µ*Ú,{M0§†PˆäSæ¬0�‚5"„!„v”„DE â2ÑmŠa1 ÃaJÆOƒ#ÖåˆGdˆÉQ–á$¬›Ò;”ˆŽÅ `„hì͈êÕHŒ®(Âßv">½=÷뺵ï]5éwk;SXŽÃ.Dò½1×PÈ…žºyÙó²èŽŽñ‘‘¨ÍCA�U*FF¢¨ò(2%¢à f&�ä¸ÍŒf¡ìŒ™àŸ“èF³Á¸×•Ï›$Ëæb�(�³dkdèÖ�çVPŽ!Ðg "ì—ØÁ.óæx‚62\3™³ÕaOá4{a6GæÈt›M5T›PšQI0ÄqeCGÆKÉ‚GµLžL=„¬Ò„óò¦�dbpƒTߺL6K”%“;Ed(DXa-&‚´Â&Óv_×_õÕ¥¶«þv´ˆù©�OÈeœ“!Œˆ2}jÒý¿S ó«$2¬Éx�FqÔa#¬á�ÖÌRœS«>)ª4a&#Cl¢�a’2ça(äIšÃ(ÐaûúM„h‰„N#¬Ó"ÔJ„A„TH<Â4È* ø,�‚4Тk ‘„ ŒÂ hØ~øFÊ>Qí™Ê��°l0“„i>“ ÑVÖM †˜GºOû ÃFýÍ;P‹°Í0š6395ÖÂ6©¦©¦© i:NšL5MÃG¶‚¹3Â5´˜aé6ªM‡“iCKe�68X¶¤›M´¿°eÐI† �k'Bæa=&Ð3fË.ƒi6ƒ8G˜Lñ…‚´�' +“iŸh(zV÷¤ÝjëáÒ¿Å'WuozoÒvºü0ňî­+Pé\'t´›J½½ÖñÆ·Û¦›_ÛWW±…ã¯Þ½-ÇwÖ÷Kà˜ÿþЪtúMnÓ»Mâ¥õ½Ò·Ýõ#…ë[_÷R8_µ#…_Vþþ·ÇãïêG +ñ¿¨¥oû¼Gpí[®¿‘ÓôõÃæ¢þ5¯ûþßÿÿÙ#ÑnHÿ¯ýî‘u‡ÿý!ÿ¿aúB>ïëÿÿ×ûúCãú«ÿ¿°Øuÿÿúë°ÿöûÿÿþãÿÿÿÿÿþÃaÿ÷ÿÿì2žëðßÿÿÿáÿ_¯ÿÿÿðØoÿ¯ÿÿAáïÖÿÿý/õÿÿÿÿø8{ÿþÿÿ „»¿ ½ÿÿ÷^—ÿîÿûÿú»l?ÿÿûtÞéïÿ××ëëýÿý×ÿ­ßÿýÿ×Ý}¿8»¿m}}ëõý~ýþÝÿë¹×~›¯þÿz¼ß_÷ÛM¿½}w¯ô¿½¿÷¯úÿíš/ïou×lÑi·Ý¯ºKØGý/Ûòuûv—ú[fk^¾¿ûÿt›[«öÂMúM›› î—a²'4“M‡w´»Û>¶%ݘMŸÝ´­°­ÕöÚ =4Ô2Èñí¤ÅÚØa¦ÅA„Sí ÅExA†IŽí$ØM¤štáj’j¬…æÅ&œaŠmL'i Ø«I´‚m…M;[aU„ C¦G6&šL0ƒ�2=B &øØ‚EtC„Cˆ7–C‚ÐmC $Âl&�"ú=¸"üB÷2G%ç¨AÑB#‰b*"o¨nvI ˆìì (àŠ¼ò$#%Š„Dh²’†åW? :”¶â"#ˆÙ )ðÉuÔí;økûåqd¸ÿ_¯�s³Å>u2³�ÆFGL˜¦l΢‘„C3 ù ç`ãH‡œ�dK³¨Êv™*ˆASC‘(��²7—A’ #C!ç2a0Â5†OÎA3ÑÈ"¹¨A„l ž £u.ß#’Ç›If™È£0A¨A„k ‘„EØfpA¡„lG¶±£`z64Ó#%Ml-„™.M‚M¤MÓT›W‹ Ú#¶“¤â=ÚmàÚM¤Úi£CBL4ÑVÐM¨F†É«L6XK¤ÚMáØMÔ)òm'¦’´´­]C¥jðAº¸M¥¨óúXA>ÚN¬5>m¢^ÒmE´­7i&ô´�&ýºiz×_µum¡q^ÅÝ[Ý{úZû¥¥þí«{ûþúZÒ¾•¸»»Ö–«C_Zý®×]ãúQÛvºzßCiõ¾º½zÚþª¶î£z^­w×ýõn¹c‘Ÿõãªý6ÿãú5_Óûÿaåôzô©¿û¯ÒÕ¿÷ÿÿWõÿáî¿û¾¿¯þÿÿÿ¯ÿÿý×ÿá‡ÿþî¿ÿÿÿÿþIßÿÿå m/ÿÁÿÿÃ|_ÿÿÿÿÿéÿÿÿ +î—wþÿÿÈÏÿÿþÿ¿ÿ/þÿý.Æÿû}[¯½ú]ý½×ÿþ–—zýéc¿_¿ëþýwþ×ÿëßöý}¿×üû{m}³ªúz÷Íÿ(Kþßÿ«¯ßýj­õ·ÿê½¶õ÷Ö•þÞÝU¤[’Ç}uûýºÿ«¯oíµõ¶×zÕ~ÖCÌöõöíut¾="ß³±¨Èµ‚"¯B{ÿÕ¿mÒÿIµû?þõÚ¶zt»I~ÖD6Øi0Ì6ÒM6Cö­ÃH&¡Š¼(UF�õ a†Ã9jÃ96º}¤è$ö)4äPm$Øf 1M °ÚH4ÓMÂvÙLS ša… Žv&!\6JÂd]‚B;Õ4þ*ðÅ Ób›A&šxI´“L0“M¦ÒN�„Ø"‡Pà $ç|ðÑâP¡:= Â#l„Šæ"0¡D1`”;ê?Â´Ó hެ0A“9pÑ퓪AM=Å )ï* ƒ&ž"#fZndˆŽþ—ó"LDDroIö·øÿ“džvŸÿþµúú™f¸èy ˆÑ�Ѳ: HÐ¥d�HhÁý,·‰tžs)ò#\äj#¨É%†)@¤0ò$È„e«4ƒÁ>3—„\'Y¬Ç5—æ€ð�‡Hh©£d#óØð�Œ*öë+“G ñÆP) ä|ž#¢< ÔF‚ >4Bt aÃøÂ62Läæ|£cÝ´li¦“#Æ©ÚN“tÞ•¤é¢± œ$ÚA½ÃA‘ϰÅ2¸ra4Â>4l#à…´»XFvµG91ÂÂ44˜jé0ÝÒm&O,á6†“J-é]'_I´µÕ×Jõnž™7MQ‘m¥¤ÒL5yhbé:bãn“u¥îºZ[í¢P–·÷ÔRt½$ë}.šÛÒñ„ÄU®´—Bûi}û¤Ú�Ч¾•´>â—¥ã^¤pÿºê+ûmesv�ëßTÿöŸ­{Cû�/_¯øj?ÈÅéSzüGKõ#…¾±ÿúxh‡ðÑv]?M¿û¤Ã¯ÇúõÿïøÿœL?ÿÿ¶±nÃÅûõ醾’ÿÿïÿ×T†õÿׇûÿþ½¼ð¬9gUA5L Ø'l17LBA„ØM&›H4Û 0a&©ŠaHøÃ‘„Žy¤#†(·.–„¦ +�å[•vš5“2@aOq¥VÁ„CR“„DD#-vƆW%DvF™ØÜdW©)dN-Ô°äÝ*®mBÝ[ú_­&�÷§õk¤ª/÷ímiZÿqÇAR³™QdŸþ•¤¯¦¿Ö™d"5‘!dB( Á„ƒªë“ªyÑ’²'G#Qšˆ†2RDb=š²þpˆÕ›‘aæh˜0�a¨A”a¬0ȬՀˆJ@ŒöOB4 Â!r%"tØÉ2ƒ9:à�a’3ð4 F°aa’ùœŠ66<&O“Íá4äǪAÂj“hZj�lxEà ûPƒÐÕ;F·!ðšM„iô˜j©:“¤Ú µDvÃM0 Î0©]Ÿa\U-C ›—íC¥y4jè3d“j¬°aÙj C> ´ƒ¤Þl Èæ¼¿ii:Vûð›TŸo¥Çuöö’NôÚWA´µ¾÷Ûô´¯Û¦±Ûô¿WmúÝÕ¯}ïöÜTޝôþã¤ßú§µ·¥´7¶–¢¤p¡Úö×Þ†¿{i>ŸämE�[¯n¿_ëCQ_Ûx{�\ŒÛÿ×ÿ‡ãþ>±ü¦ÿå˜TÞ¿õHí/ÿýƒÒ¿HÔ/Vþÿÿÿ_ý‡ëÿ¶¿ÿ÷·ûÿýw_ÿÿÿ|7¸_ÿGw_ÿøoÿëø/‚ÿÿÿÿ·áÿýúÿÿàߨÿÑð�ÿÿÿðoÂ÷û¤ýÿ¿ë¿é/Òþÿÿ×}W¿ÿ±þÿ÷Ûþûª_I×ýÝ×ûú^ÿ±PÿÿóÉÿ¯-AEïKÕ×ÿw]ºÈ4ýjÝÿO~ßþµ·¥¶N‹5OŒ'×õþßþÝÝnºúKÛ¿ûûkmŸõÛ u¸¬æK,ª³D +dž÷í®ºëî—~ÙžÛ¯u¶–¶lúlõþÖ¶ÙôŸ¶_O¥`Á-›[š¢36Â…]?ëoVÒÂ8áö^n¼ÇðÂL3“i&é'u¤Ã0LlRi«T�„Ã!1¦œRpÒA± +ÒM„vK¡IVý¾£d_iC6z +)íˆM¤lPA¦ Å6‚L0ÒNÒÐTÐi„špéÑß*«m=´V6>Y‚±ƒ +‹˜ŠrpO»½=t•¦ÂUÙ$Âh&ÐbÂç† Á!¦J¦ V]“`¶<»ßã”èx† „a!DE�r¸î–ÞeZó²EýñÄzõõýWøãß®HDMÒ”ùGS¤Î„T +i›3P΂È%Ÿgß�\×’¨ÔAs‘¨�d¦‚‘ƒ53A‘"%§+ l‚DvP�°Hy™¬0�”BLÖ5´‚aÖÌô)ƒþd°gˆ†2(› B}ƒ'eò_04 #Xr!ì0���l#C4“ØùP�Âii6šifœöSÒmÉŽL4¢8 'H6—D×ó!|Ï ¦í‚5‘xÜÂ>?MšAÐA�=0Œí&äÇáA´žƒ¤Ú ´› ³¦Ðg  œ&é`© $ØIÜRmx éZZ¾— P3f� ]C¥jüÃJÒÒ´Ât›hqm[I×KDžºô–“«¯M$øª_ºO�jšM?øaM–�T›K¨I7CÂt­E+§o¿Ò´¼~…S±ëiÒëq÷¥#…Jþïn5n¡e2‰ZwõôÓÿ[UzÔ¼¾êßÝoûþ>»¥ëé<:t[’¢Xˆwôº~èw>„Wõ¯cè·$0<_ë×û‡ø¯·Wü‚‡×,sz‰˜ü´ÿW®ñ`ÿý=~’ývÿëÿýœ?Òa×ÿýû _o_ô¿ÒÿðÞÿý×]‡þÃÿÿÿ „qþÃÁø#?ý~¿ÿýµÿ‚½a¿ðßÿÿøl%ø>/ýÿ×ÿ·ÿÿÿÑm+ÿÁ¿ÿ¯«Ã ¿ éé_~•þÞ[¿aÿÒÛÿÛßÿÿí„¿}ô½ý'ÿ§ëÿè-!wÿûïm}×íô¿½kÿ¶ýÔéþÝÿÿ]+Ûvÿ¿ú¼æÕ{eGÿïëߤf›¿ºêÒÉÓ~ÿýW:ÿù×ÿÞýÕýuóO«µöÿÛ]{?·vé6ºM„›=k_û¸eÛdëÎ.öÍM™ÿ¶f¿n˜iõn¬4›K1àŒ=xiÈ£ƒÛ Ý(a„˜`œ‹í+«IŠb‚h7ÿáY s tƒõa…Õ†×a—6Eʶ“¬6lU«ÃMðNƒdAá5#ˆ¦†Ó +Pë#áA…RÒʃL&špÌlT4´Ãb4‚h4Ø…I Û 28LAU&LBa0šF†Œí¦A„�lB�QN0F¼D„ \(„"<²„Îþ;  jš¯tÖÂli4>LP0¥]*Ø0ƒ ŽVCDF Ä!ÁDW(…aUQᩜâd “™fTÈI’ÁHÛ_ÚÕ&’}x"ø¿¤>¢µü ƒnþ»ZúWK|­þKþ;Ö ;%ZOéý¤u]!ÿÕNÓ­[A[×_$Í<äu(<Ù„B(" ˆ ‹B"°ôBIL„f’•¼Œ”ÔgRè¤,�22!hŽÐd1�ÆH#„Hæo7—ò:#Œ­¢ ƒF°Íòö�=à +ò�”o™Ê ÌÕ°@²;4a†i›!&k °j¬<#Xeaa0� #`0��„|d&�¦9á¤ß£CI¼8V8g –� Û&£iijmE…„Úié6“¤“H6ª“…G€Òt�&ÒtÂ<Òm¦Ói[,í´˜oÓ +ën—B–½' 6™ãe¡6—¤Þ“aC¨âÚZM¥j4Õ¥¿¶•Õi?¯¾“oé®ïǺ}-_I½mÇÝu¥ïÞ¾·R;_u¿¯ÿëºÿj¯êG _ý;Ví×C‘ÂÛ]%¶½Ä×ÿú·� w]¡ïúú·­ð÷y*øÿº,Oêßÿõû÷ÖŸøÿ_ü?ô…‡¿¶—ÿÿßÿêÃÿ<-‡þ•ûì?_aþÿÿýëÿÁCý‡ÿÿÿá½Á|7øF×ÿÿÚ_þ¢ þ£ ÿþßÿ†ëÑðßáÛ_ÿÿ „ ûôÿðû¿ÿ\ôáõÒúûýëÔýw¿íÿþ÷ÿ¾©}¿ë°ÿþ×Ð_éinÿÞÿ³ªÒßû¥íßô¿I¿ú½oõ9÷ùj R«¿ýÞêÿidšÕ»:úý]û¯ßïKMþYÒD¦ öÿm½¾ëzÖ´—¶Û¯ïjÕ³ÿíÓ{ ÿîÒðFé7®W �¸*ý&Ìÿ»?·Ÿ›WKµí-+ ‘öÏV{×îE?„ØI‘r›iHŽØzlФƒŠnƘA‚…÷·M‚ZnGm„¬vVÒVÒMÖÒa˜ Å*ÒA¦œÒ^ 1Ui¶“^M„Ø"‡ 6LŠ`•„tR±Öïá¤Ä$ÓbbƒaìA0ÒA†ÐH8…dr¦˜L&!F†� Úzb0@ÂY ˜©ÏɰFÿÙ¡#ÛŸ +äA¦‚ BÄ"� +BDD;™î.ÿɱØ�.MÃüìKÿë¥ëæEHŽˆl‰‘Ò)ìãÒõþdD6PDm‘ ê<�(†) d4p�#6D„m™Æ0I—Æ€aû{/¡?M¤M®"ŒÖiù³:‘I$D¡Tˆ‚Ç0eY,#Aì‘‚|\0�fãXa.Í ƒ¼£d#cØÂ6˜Pš„ÓM&OAÒm&ÒoÐø+h"l<8!Âh #À4DùÁNƒÖ ðh­¤d¸&™hA´iÂg†q„Ï Ži_«¥¦á']+IÒn˜¦öÒu¼TVÒuzá:clV -&Ùˆ» +ô›w§«IÒ½¦Ü:N•¨¨¤îþ“®–•Õl&Ú[¸ë¡Þ˜ŠVßéWÚú¶­m»]6Щ¾¶´µãQÛw÷xîÐ!×â¤sVÒKQ÷ê÷ÞµèRÿ}øîþ½h±Èé_÷ô]a°rÕëüoC×õëmëÓkþûzC †¿ëã[ÿ·ì8~¿Å†:ûkõ÷_êßÿìÿýõý†Þ¿Òµÿ¯ûU×ÿÿðÛ ÿÿÿðØ7‘ÿßþ×ýÑÝ×ÿÿþ “ÿÿÿÿàá½ÿó®ÿ½·ëÿÿÿ†ÁÐOÿýÿý{aô»ýØAë÷é_¿õÿöÂ_ýöúÿ¯nö»ÿEC_ö+ÿêÛ_ú÷0Ÿ_½þÞ¿ÿ:îaz÷÷[K¿¯éƒaúÿþ»gUÞ¿¿{okÿ[}^Ù:öÿi7ïÿ¶µïM½×ÿÿÞêݽ¥¶g¶½6—¶gý´�Vïzm[´¿ÒÛ3îº×¶ö6Ïl3ÓikÚI¶ ui2a±VžÏÝݰþ¾ÒÚ³ +é³Ó¥ªÚI°Á+JÒ‘\4Õ‹b˜ Å6�A¦�¤› +Úw ©Ø`‚[a°ØeÛ"ãpša´šã „i&ƒNÒL1V“h&¦˜d¬&G0˜&!J¹>Œî!ð`ƒ$‚{S-e¾D¼ š{†*÷†Ð[M(0˜„Š·*Ù?Ž9XÁ‚M•“"V"#-Õ)Ú©�‹E\¡L²G¼¡s�ñÊ"¹âÝ-ÊPÜÈÎ_ú+…!„g‚Ÿ®I¢:#H•<†f£+Œ,Áeè4l}I¤DŒ�<‚!242�J5˜D"‚DI�™02D,ÊÂ0Éó‚3ƒÁÃм�‘ó?„| ψxEãh#ó¢'‘Ö_‘Px#¡ YvA8–.ÍŠxÂ4hˆBç‚~k 4Ê3­£ÛF¶i„óñžš5‘DtÒm[TÒ¤ÃIŠÚT�eóÐMˆ�B6fÕTÕ‘mBI°úN�oAÚA´!¡i6�tƒi£ÃežÚM2Îæ“i:gÚ^“i0ž‚®›Ò».‰´4›Aœ0ËVƒM%´Â§I¶Z†G4®OÚ$é&×JÖ›ê +Õ®’þßêÚkíúwJäâ•ÓÓú_¨¥|&–é餯MÅÿzýõKô¾½½/÷Ðÿãû~ßíö­î1öã‘ÃÜ»ëþ¤pµµ�«{Ã~ùÔ +ÔŽÔŽ¯oJ½+¯Ñc÷ÖE›D9ÿ×ÿâ?ÿû¥°ýùmEŽCŸÁÞ?ÃßñÛñƒ–Ÿÿÿé/¯^—ðÿÒè±”‡öúÛ¦ oÿöÿnݯÿ·MÖ ?ÿÿþš…Õ¿¯ÿmkÿuÿaþNŸ÷]pÿÿëë´wÐG{tÿÿÁ¿ÿVÐ_Ø@ŸÂ_{h'¬7ÿÿßu/PoïÿÃÿßÄ/õýð‚±ßýý÷þ•é}?_õí¾ÿó‰ýÒý/é0ÿë¿ÿìTRì7m~õíïúð¿Þ¿®Ú…|æþ¿ÛÛÿi|�?ÿך“OkÿþÚþ¾õu½}m“¢ÌUÿÿm~ë½{zíªÙ:ÿùWû>¯ûOµdË÷ö–ØH®*ÊãqÚ–¶gÛï®Ý6—¶ëlÿtà }˜ïØ;/vØX6|sMÐL>“°’v’ ŠEÌ„3cR" +AÝ6×aœûÌoR+‡V“i-°ÂV•±Ú±I¦Á¦�¶Ä$ÂaŠií6�C -ôØh$Ñá‚ XA&ÈÆÈ±ÿ¦Ä$Ø ƒ +ÅSÂÞÒm$lU„‚l`‚a-´¶V‚.6@˜L$VQA‚ì¤HçnTÐa� +E Ö9ý÷« 0Âá´"ÓTÈÆ„$|h®`ÁB#‘Oˆ1ì¥1„d’vÄDTv¿Ú2N³'år”eÌDB¸¤õ°·ÈšÅu¯ý)\-cŽºþµ«J•}sºf¦k3¡®q�FU£dxŽ‚’„D9c“ «%„bÒÕ$ò”Š|Ôf·‘A¬Á"!È¡žÉ†E¤‰æÈàÁ`ÂcøzÃD.Pa¦˜FÆ�œ"í ƒi¦ŸÛI´¢ …aÜ®=’Л�Y‡8æ¡ £•x ¢`Á‚5˜N¬´Âe„liF¾Aµ „ga& ‘âm ìœ,#ÛI†ˆâî“i;-XM¤ ž#Î l4™ +ºÚd|5  WBÞšv� &Òd½7™¤ƒjÿ¡ßè‚úì>¶ÿú»äp«ÿ[_ü¾«o»ë~?þ?ˬ?ycøz¯ÿn»JH"oßÇúzÿúÿÿ×öÿû°ÿÿ6/×|ÿW׿÷ÿõÿöÒØÿøoÿÿÝ~¿þ·^ûÿÿàŒ?ÿ([Ö ÿÿá¿ÿǺÿûþÏt¼ÿÿAøMØia¿_ÿýúÿÿôÃJû_þÿ/ÿ@¸…¿½ÿ«ößÿoûÿ lÿÿþ¿þ¼ú·ÿýé÷×ÿc×uÿ¥„z¿úÿ^—ÿª„³®ÿ¿÷œþÞ¿þ¯¯ÿé··_^Úÿÿþ­õëº_·kÿ~­¿ÿUÿKµíëíýYögùÊý³5ûkÕ˜MŸÞ®ý&Þ½Yöiœ÷þ¾Òýÿû +Ûa&Òòòì0]4ÛJÒ�Šl$©ß7½öz´µídW †Ã¦ÚIÚI²9´´á°ÓMšr8Ø«JØ„ƒA±&ša´Ða1H; ËHI1Ö Pm$Ó´ÓiÛ Vm„“”í�6�NÚh&ž„Ôþà ‘�>I;UØ„Gfa¹eÌ�ì)ðœ.ÐL&Á:AëÊ· •HaR60Ĭxd�VD1�£µ<E²Ü˜ndfek2‚™W„wǃÂ.Ä;NM²~‡aN驜@¢¢í'Dìžq¬D+¥ô�Sý}FÿúJ“OÿÿOëõi%Çwö±T·Òútª¸ä“‡í(i¿ÿ$Ð%°Â@ȆÄ~¤)Ñ©äW%†}�5䨉2*ræU’Â1n``‚7é†Eg;UÈÃ*ÍJ‚:H"!ŒŠ2 9.4D¬‹¢f@,˜Â|�™¦4kf�Lþ�ª5†O&©§é„› ƒYÌ3ìŽÉód1k9s@9³X0�aáÃ(‚ñšó8&�£dÓØGçùùÉúm-4wo¢8hðÒm P‚Éœ ÚDXh¬|3Í(b5MÚ„Òd|›I½&ÒoI†ª“ª"ÃH: ÕZVZ5H&ÒÓÜ:bé6‰: +“m-¢Q„Û𴞆–g &’´ƒl¤ޓjÜ*ék…ª +ái%´ºÝÒè4ëZM´-5ûëD¢—N´•¥zZW¤Þê;éi;«¾ã®»ÿ^†ãÐÿûþ¤p¶‡ÚýHú«ê*ßî6í=ký¾éG^þÿºêÛÿþ7¯ã«ê½[á¿�[ÿºH·%?ÿü´ÿëÿý.;þ¢¾ªýnÃÿÿÿñÿÿÒÿÿÿÿÿÖÿßü?ÕKô¿ÿÿÿÿÿþ¿ÿÿþ¡¿Â(í×éÿ¿ÿÿýðFí¥ÿÿû„Ÿ÷Kÿÿÿÿûÿ×þ_º ÿÿðoð‚ïÙ!×éÿûÿÿÿïÐ_± +ÿúïÃþ—üþ•ßÿýýýÿ}GÖëÛkõ¿ë¿„ë¿ÿÿþÚÿÿ–��’.¿«w[þë”/õ[õþŒÓwþºíû_ÿ¶Y Ñ]jE;+A?þ»¯o]×ÿûÞ’¶h›ÏþßûgÿaŸVé/©÷~Ã9åy%‚jFà“ei„×ëòìÍ]m¶–ëÝa6×d|ÂU[›ÓÖÁvž› %i¶ +¬4“M;Ó´bPªºµþì ×a°ÂºI°Îv–ÚWi&špÌl4ã».6)�´ÐlšvÅ&˜bA†ÒMS Òzl/wº§„äq´Ûbƒ $c ¤›h$ì$©¦Ó²8§i°‚q†%wG·‚þôŸÜ:_ý}¾íÿߥÛÿýÿ×ÛÒßô¾÷ þÚþþößþ»�wÿ÷ÿþúÿé¾»ß^æ¤ö§“Oÿúß_ÿÛ¯}/ï×|â×ÿÛíkÕlÓoýoo_ýXg¿úùêõöõöÖë]³E®ÙžÚ^ÙžÚ·Ý0Ò¾õäW †rn•5MU�ûuú÷ûwv]]ÿh¶ËÝØ$ÚJ›Ô‹ ´˜ Åªi„¨i&ÓM^ÕÒÖêËò+µM‹¶a‹´¬MˆLBM0Ä&ÒM0†‚~H0™š<9á£[hC"e+"#M4i&ƒ`Òb ¬ Ódp´›%a0aî˜aR5•…qT1 +{+ +1(·* Ë=q”Ò49ÞPƒ‘�š0Á†het¨ÄFWDC™¡S ±\Ï;‚•&TI–²pÜ(_¿ïÓ‘!LÁƒ@Á¡÷Úiº Ø¥Ú«å¼Ö#A馜5õÕúÝfCÞžvM¥ÿüìÕò/Ìêd�•c5F‚¢!ȳ“ˆs8�2Ÿa‚]’3{ëÛ©3�#QF¤G ê)6fžN)Õ•‰”HÌ0Iƒ?D0F°`�a£ÛÐÍ4EãP��FÆÆ +~H9œ‚mSIÝ/ÖV ƒ0�a„kr»MÃPƒdü�(ÎÌäÂ.Ú6£óTÒuN�&Òm'IÐá6É¡7 ›i„p© óWm~ê¨îÂ=´˜i<š€eÆ“aa»è'CA6“xI°ƒ#�=ž5Òt«¥¢p–ÚJõßÒ+¯Ò÷Za†ÚMîð�´›„ßWD¢“¤ß·M(Óiik¨þJõõOûÕ¶�zûõûj;N“m?én;[zVÐÞÝZŠ‘Âén(||v“ÛÖü6Þ®î—ý¯ßõ´�¥ë½î=|1ùQE¹#ÑnI‡ÿ°ÚýoêÜ?zoÇ×úo‡úâþX—¶+öÿþÃûþß×Õ¿ö®”5ÒÿmvþÒÿðý×ßÿÿý‡ºøa×ÿõ†ÿðÃÿý~ÿý|Çÿ_á¿gøl„ßÿõÁ»ÿûuÿÛÿÿð‚ÿÿÁ¿A}‡ }ÿ·[×^¾i*?þ ÿÿúOÿß¿„¿—¿}Ãßm}ÿrÌÐ_ü?Óu×é}ºýo­væ¤ë÷þûÿÿúABÑýþþ¿¯ëýþ¹VŸ¥Þþ¿ÛÛóŸo^Cýÿ;œŒÇûtqN½~«¶õ·ëë­·~žÙ:¶û4Oÿi]¤Ñ’^MÏ$�þë­Ö­¯ûv»ÖÝu{v}u~ØK³ÞØJ¾·TÓOVë +dH�5%RZI;×îºútºþÂ(wÙýë´—JÒ‘G †rl-¥ ‡±L‹Â•ФÛI0ÃA&˜m$a‚MQ/„r_6“�Q>d}%ún•¤Ù~Òm+I‘iÆÚaŠa„“ ¥×J ئ)º¦‚ ¨A… OȳaŠ5)W �î„?²|ÞŽôÀ‰hDi}4Ó 0•¥a&XI‚Óa: „Ä,1I± +ˆäÐa d™J>íï5“ÊO?”’*×åjØ‚(0¡È0t\ÄB2–Á2Œ¥ ÎØ]äÆ4ÓÖ•:Zó &#•Åž#¾©z_ºë”—ÿü�"Z«1lŒgQ¨ãDlTBTÈï62†ÿ�ÔŠßåj2Έٟ20ÏÐRtld0æ‚„BL¤Èñ6Dó0:JÐ Ó4lê°><#;„ÃþYV³>gA�ÅÎ ›# ÉÄ*yÏÂ5†Ö TÂeM±ªhÙÖôÔXjI½-'MO¤pÒ Éƒ,ì\$ßõA Â<0�o2}BaFÆIÁ+ôƒi6�mÃEcDpÂ=´›DvÒt¶Yè& á¤úZV£h/Â0á¥mVßÑB=Òtƒpg * óA7N©7¤•¤è&Ð&h&Ý+„é=>’·O�_î¿‹{ÿªÓL Ð&jépŸ­mE¥´�[ëißëK_uvžôº§Õúm+út*šr¹ï¥¤ÿÓkî©á(ÔVÝÿÔŽuëÞ¯ïKëÕ÷ÿ–"WDEéëQÝߎ‘ݯÿï(gÚ{ý½z¶®›ºíµÿWH®V•NÂ__ô½Þ¾ÂzùŸ_×ûö·Vî·Kmëû« ¥t2¸´Bâ%—ÌÌ�„‘$ˆû×þ·Úû«ªMþÙ§¯oÞ÷VÚ[k¶}ZKÞ“¤‘“Éš#ÈÊz¬Dj »ö¿÷öÝ}ŸRÿ×L3Õ§m¥aö#Žò;zm& ¼éÛA ØÃiZ…°�a¤vh)Ü$0)X‚=¸Ó^n/¨-ý^½ypóº^ØVÓ‘\>±VMŠ‘Â «LU8m Å6•¶’a Ø"‡A8pâ�À4H"ù×Ó[º[¤éuA¶H0ƒ´á;Ûa š ŠmÁm6 ÂiÔ0˜M&�´Âa†! #Z Ùœ(º=M¾�µO׎8Õƒ_ í4Ö„�m Á#Ó+pbŠtMÒäРŸir%�“Cõ¿Ê÷�n"*#„³²I¼�¼_ñó±ŠÚ½x®:¯¤¾9yAÌ�‘!:6EXÍ2LK¯é*Zzé� Š2)„AŒŒ"@¹vK ù:‡ÒêI‘4΄¤˜ÈÃ$ +s'Z!&G2gâ rtlh„ðF#LÁœ‚aBÌð�a“É„hé’á7¤Þ“iE&´Ú£ÀvŠÈTwt›†¥I¤¬2Œ aQ¢ÍŽ‚>O=àäçÂ=½%Âa=Új¡NËE ÚlÒoA6XIézM« C…ÔCx¶©{¥ÝÂD¨ÐzM¢1Ú=µdÝ$Ú¤ThiÝöd'ežËOSí™ µ¢Ú[¤“h'K×ß½o^Ÿj·uýS‹Höé&Â+B•êÚn£¿®êþÞ¾Óÿé[¿êšZa;RéxÖÚûÝëøàÉÄU&÷ïJÝ÷ý/‘G¸ï^þ×_è~‡¯ãïúþ‹ƒê#ößC÷k¿ú÷ÿÐ÷ÇõoÇÑpNµËãË«ÿÿ×ã×§ýõÖþøÿÿËOÿëÿÇý/Ò×ÿÿMÿòÕëøëÿÿúÿúúÿûÿýÿÿÿÿöúÿÿþÿÂ8ÿÿýÒλÿÿý¿ÿÿü7þÏÿÿü#ÇÿÁÿÿbÿÿÿÿÿ¿ø6¿¥ÿïÿ„¿¿Òþÿ¿‚Ò­ÿ¿ÿÿwøôÿÿú_ÿ¯Û÷¿hÕ×ëöÿ{w_ý¿þÿ¥ÿëßé~õëÿýî—Wÿþ·sª×ÿìêž½ÿ×ÿÿÿ_µÿÛooo»õÒý½½³5íÿý·[_9¿ú¯ÿÛÿ½w¯fŠÕ³?³þÙúAÿ~¿Ãûl-´®¿îÛW¯Ö×½oÿÛ?ÿmÙ…¶—áy+`“vØ$¬0KdQÓiÃaÚ Bi†DÁìB¶®—þÙíµm/ºîó£Ž/Zwì‹Á„•4áÃ�ÚA4â˜Ó S"½ˆH0Å&Ä+ ÓYt‡¦ÂÞjjÚI¦šr/ + 4›H&›i28i±L6˜„L&AÐb�ktÓJ…;°› ©á†pÂ�‚G;3B5ˆˆŽ"2͸¥á´i&·´ ‘Ð"‡6¡Â´Ù +ÂG¶Âiª•„±Ï�+˜0޼¡(ˆˆ4W'¸ãËry[Šï)ž +A`Ä Ä#R Јƒ²Šoò¸T*÷Ùi\—Ì‹ê´Kß»õöÿ]÷{þÃÝÝÌ”,}´à ý¢B×ðÃ.i„çi[äŸâºý§+«zúé�L…’‘š#‡”"9¤|Q÷®RyÉHÓ3ޤHÍ™6f¡IÈ„â3dpdñ�™‘âD$͇9àšƒdÓGƘOöÁÃ|rfgR$#† 242`eÙ¢&CØ;!"AÜ0�„h PjƒØÂ/!6¡0ž›‡ÒmB¤ê“ª<¤ôÒO+L#aé áÝ„haPa¾˜H7 ¸Âè”4xi:"»ƒ0I6‚t›I´Â< Ệd+ŒzZ¯ˆo]õhÐÒ°�›93„î“¢-ÒvYÃ<Òn6¬°�0Þ­  ¥~“¤Ý;tßýÓI:Øþ–õÔm&é·ÞÒà­~—M«í:í=7é:Öým7úfhWo¯[î©Ó鋯½?¾»¾××ÞêG +½ +VÓûþ†õ¼=ñÛ¨wxßï­õÿR8^ßüwDkUÿ{þXÏðÿõaýþì}ëÿœs¿ïý÷.¯ïþÿúû}n˜–Ÿì?õÿHGÿõßÿÿÿÿÂ8÷VÿöŸÿÿù@¿ÿÿÿÿÿÿ†ÿIúÿûyVÈ÷ÿÿý}“Ïÿÿÿÿÿøoð‚ÝCÿô ÿþÿÇè ¿ÿÿýkÿ¿ú\7ÿøoKÿÿÿþ¾º»÷_ÿûßß]}ÿþô¿ßÿÿúúë¿wþëÿßž_Z«šü³R×î½Õ/Wÿo¯ûKë¦ïo¯úý½ýkKÿ£#<�dØ«+¼ ÿüÑïþ¿¯¯ý¿¶—ê“km™ý§¶ºöC²éí#$‰T‰E¸Ì�á#bë·ýþŸ¶¿¶gÝwýúZMŸÛA°ÏN·í¥`Šwdy† &ÆŸV’v,:ms®_ É)Ügb”5Ed>¿Û?_éRyu«pÛ톺K—“ùô­&)Š Si&NÒ`ö)ŠL28IÃ-nÖØA!(Ai„*6‚w®› K²-ºI†Ã튃´Ø… $šiÁvÂA„ÉZa!w¡ ¨L Á#ã !”ª.f´#‡AKÂù ´ �C5<�ÆðËŠ`#nè'úi±V�6G>š „Ù&‚jR B:ð¥[4Ñá´0ˆãˆDD",ˆË�œF„an�t½ DìDï‡Ãð“oÑ\R!‚:èª�!$LÑ\¤5ô¶ÇR L0Ÿ‹ìü__U¤v/ú™ úH''ÒÛöÛê¼…$d eŠ_é(ãê“jÿ¸õz©&3¢8Ï™NGÌè) s7œEüðÏæÖ˜g8G´F†ñÒÿÿ!£RÎe; òD衆’ŠC�x·ÒHЄÂea0��4Ö*=¥M&—L#ÃI´ž‚ÿŒµD!‰®#¢=‚Fõ6< `�fA Šƒœ»'„ü• �I/ôA´G �ÛøÒa¢<{L. óI·zQm/Kÿؤ-é6˜OÎÒoF¨A;ºL5ÿßJ©´ †Ú ++I´¿Õ{oûútvaI6ˤނ°§ÏÚM„Ä8T·tºUþôµ¿Úi÷i¿­Ó¥íÓõÞ‚`œÐÌ…P¥~•ënߥoõúÚÕâªÛµ¿¥oöº^­Þ»�q•Á¢½ˆ�¾¾»¾êÛNêÿÿ¾tG¾¿ÿþ·ô¿ÞÿØ8‡R8_�ޝëþ¿D:µÿùí +Õÿý[ÿ­~¿KöãÁz-É"‰§¿ïúÿ,Kÿéÿßÿÿí­§þÝþ +ä?�_ë~ÿÿÿâ‚#¡oýÿÿúÿü#¾¼#Äÿÿÿÿÿÿþ?ÿÿýî´ßû~¾Ãÿÿÿÿÿû¿ñÿÿþë¿¿I¿Òßÿÿÿÿÿ»û÷×ÿ½uÃÛÿb¡ýo×ûÿëÿþÿõv×ÿí}ýë\âöýÿûkýÿ{mÿÙÓê¿÷¯ý¿µkÿ¾ÿï×ÿïûùÈôû¯ÿßû]ûÖ×Úõ¿o½}ëûï·ooÿ?¶·Wÿº]ý·Ûi~²+½+{w_kêÚêÙŸn“i~•†Òt´Õ=6ÒMz]0›i5¦œÃKgûÛ=ö{Ò÷®ööÁ{ $ì5 ¯þà A4Ði¦˜m$ÓAéÅáŠqFvO†ƒ2‘Xö*ÒÂm„“ ¦ÈƒâÅ6I°�PƒXbb6¬Ÿ•”WeeˆC*·•ô ÃL ƒ AƒV ƒ°Ä œÎÑ¡°°Ô ÁaˆE9‘´4WKå”n""_-Ì@‘ù”ñÕ B„A‚&LD[ªdA-Ê¡Cet¸GmVŽ<Éà¿°ý´'A†ü6®ÐIÝÜ·„þÚEt³’H¹‚™…QKý6uÖ; Y(|ä¬vT’ÿïÆ¸h6‚Ói*_æJND¼k"ž +G� °ƒ1ÚO·ªYÝ2�š™NÍD¹‚ÈÄuH!C#ÄŒÙ<EÀd�ØzÅ„|ÓFÇô­Ý2>Nd:™ã!�HhÛ3‘)ŒD„m‚n�æ‘�‚4i Â6b|äèl #s 0˜Fv„4 0Œí+‹LéÜD{¨üXF³ Îì&ƒG°Õ$ÓGàÒÒd|Ó 6“jIÑ´ž_=Ý&Ò´ƒjx›D½¤Úm ® ßú_&tiá4x"Û l°tÂM¤êÐMÒl ­OšV‚´ºoÝ+I¤¯wvÒn�}½7þªÒV™w‹ ÷zI¯K§¦—ï§IöÿÕE[vº}HáZëú®–“l!zÒý¡M5×q‹R8Wzß_ÔŽ«ýõoö øwÒ­/ýÞ½t:ÿEޤ=8û×ßøª·ÿuúCûí±êÛþ?òêÿâ‹OëÿÒÿýÿÿØ~>n}ëïÿ_úúÿÿÿÿûÿmù£’ [ÿýýµÿÁÿÿÿÿÿßѬ¾ýmÿþÃýt¿}ÿÿ÷ÿÿÿ½v÷Ûÿü Oÿí ¿ð—÷ÿÿ×ý¿ïý¿ûÿ×ÿûµÒýþ¿{m×KïòtêZ }¿ÿô½û½ßéúÿo×ý7_ýýQÚ®Ic¸gs~ßýëÿ_÷ÒwoõûúõnÛ_õVÍ?î³ñ7Ô(URZûß×kþ¿{w§Ù:lÑyŸß·ÚíöaŸO_ÚV—°Á+Û/é%�­Å0¤T"_¿í½WzÿÖßlüÞy²ë %a};aÞ­§¤œ„°`�a‚¶’¦� ƒi&˜bM8¨ixS» +<#xinÿݾÒM´“ÓYpäJöÅ1{vÅ!&âi Ù^A&ÂØ¦I§Ä Ä$|*Êâ¨4Q¡°˜¤«_´~xIÒzñ„ì0ÒTm “NÐl°›M„Èá7„à «·i¤{e44Ä)Y$b ! ˆÌ¦SÎÕÂéêÜ �/++öà A]¤{aŠ:Ò°ª2|4 ÓdKŽv""!²Üð�h'Òm"«úüD`Œ‹aÕë ¥­'ô†—ÓÉ4JPD1�gÝ$ë —Q¯HÜF†§S)ÙÔ9 §VfÐTBdÀɸ²°ô=³ð"à3µê´“Ò!i"&E;:�R"LøC<«Ì UÚ!<ΦƒFê3³94n£ãûIÒÒm úLvV’è$Bb8D1©I˜3öGŒÑ|ÌÍ3cH#@f˜A£eJIQ±²~Nm4©'e�H:#¶–‚t4�'ežfÒa �+\-0¡ºÒI4¼&¸é*© ½4á$é£CIðºA·p™ÂKWÅ-´®‰E-F½-t—xel¸0�¦,³ƒ8iZIº ·§Ì*Z�¤õºW»AÒñuÝÕÒÜRïÝMŠ—o¼C" ŸBt¯V•·öÂ"îé~;V—}~½mwྈz?â#þ»B—îØN¿_uýÞ¸xûÖ>¼?èW—X?_º‘ÂåÏ}¿§EÛëÊôßí¥pÿ×_دÓóbÿÇŠ×ÿߺø0µÿÒÛ×ýaÿþÞ¿éa…ïþÚÿíWÿÄ0ÃÁø#ú ÿýƒ{iÿÿ|þÿÿì7„ÿ„þ ßßὑ„ÿßÿ÷E_ÿÿÿ"Œ>—÷¥þÿÿ¾ŒcûoÿõÂ_Þþßýo¥ûé¿îß~—ÿýô¿~ûÒÿß_ÿ]¼òïÜ뵯÷î©÷ÿýr“õ_½~ÿý¶øzòOmý×ëªû{~Ýk×÷¯¶ºíÝÑËöÏ÷mœ®¶ÿÛ~ëkÕiý«~é7Ú_]„w«iÈ®¶ã»JÙ)±A�Šm$ÛþÙôÚ]×zKayu«vÚ[iEé&ÚR. +i4"=„á6¬%°‚i°™LŽfw*�—õa…n“ „™>Ò¦!0ÓM‘b4A¶“#�‚'" &œŸ•Âa4•Œb™ ÝŠM¦ ›h& Ëè$šiÙ¤a!JÆ„#$W$Âö(‚±ƒ Š& F²'$Wª©k„ch.ºìЏÊWè0_„C#ob „Æ<ÖS0`�ÿ�*åµy�Lì£;4"Lk-�3P¡›f:–`„Î×EsE{GðÞM…‘nI“Fwy\îšÜî¡R°§QPEÒlð?;5F¤d>‘.I5]=!ð‹ÀÒr ”ÃÞéÒÑ/•_3AB�]'c´ÓÃþ¾Bh&ÇÚ „›]ðÃñ‘Å ÚOÿ»µ”y2ü ž·  �,vü¼žƒö£ÿçiÑ�^?®ª){ F½²(2„pˆaè-þ¶„rQúª®Uµ:‘O†t%DJI¤½ÒKð� 0š7uþD±Çýra’“*Ì�‰dJk&¬ÃœstÀÁ’¶ˆIšÃ4 FÊ„l (_z^ÚM Î_ßÕuÉ3*ÍJS²@¨‰em(¬$ƒÁs!&R É�AÃÐ Ò.a¬Öª?38'Cé¤A§¤Ú„{ $ÃIÙhA½}´‚izZN“Çó²Œ×šÙ¨ˆ˜È�H„pÎ £6Y¸â9‘àˆ\›C7„l£ã4Á4kfzÈü½•0š·¦�mSIÒm I´m—BЛD[i<3Í&Âdse +MÒ´·«PƒÿAÖß´ëüäk2TD�’”è"¹…a%S�•ÍQ2¨x#À`�YÍ›A\þkh÷3”&š„öG„鴰“i£CA:²Î¨"-´¶Yé6>éÒÑ'IZÛ½\¨ÂÒnZýúO«t¨A¥õý#aÄÉù¬0�mÃÏŸÏáL&°=+3i¦ša5m&4¬*N�mQ4{ ÎÓA™3JÒt­6Õ»µ ÒJÞÔ~ƒJšMú§½ïÛŽ¤p­:‘Âþ¾ƒ÷¤~k㾿ÓI½4›§A7»l´Ra¢;i6Ë�q…SÄxÒÕ¤›]Ö•m´›ß÷JÒ~ÚñûVº÷Û§ºÜcÿC~ýÿ�ó_OÊ÷þ- ¿ÿù›JÂeÚM««wÂ¤Ú ÒoK„ß»«Ó÷¨ã¿´ß×꾇½¾õ¾¾–ý�¢%¿–䎸M¿�¢ëÿy>rÿ(ëÿÿ¶½:ø¤ÿïí{zï»´õ®†÷o´îþ¾ñ¥¯Ûúøÿ·ìË_ãì?_Òý}}ˆMœøiÎ +—‘;þÿÙ#Œ]­ýn“nëð¿ÿѸýí×èšO,gƒö÷ÿ_¨kÿÿ†ÿÿÿøký[kÒôÿýEŽ®¿ý¦ñÿÿù`Vþþ¿Òÿ°ÿ¯ßÿ ?ÿÿ ÿÿÿÿî?ûŠZA'ÿÿ, Œ·ÿïëëÿë×¶ÃÿýºÿÿÃkåÿáÈMÿÿðßÿßÿ¿õú^—÷ÿõoÿÿÿ×õm}†ÿÿÿÿ\7î’á¯ý†Â_ÿþþÿÿw÷Oþ­ú ÒUÿÿûÿÿÿÁÿþÃÞ¼ÿÿ×ÿÿÿ¯A~õáÒþÿ÷º÷÷ÕúôŸÔ£ÿöÿÿƒÿÿþ‚ÿü NÃAxwÿýºþï¿aúÿkî¿}}ùŸõûû¿z¿ú¾�ô�=}¿ÿáÿÿÿý/ÿÒàïvÿúáÿ¿ÿûëÿùÅ×»kíÿûuíûmûjß^‘<Þ–©'apûm?þîõÿëíÖ—¯úèõwýwý»Û|òÿn¾ý{'O]Ù¢ÖëÝ.ͦÏÿg¦ÖÌwMÒI¦°ÃKT ˆXA¦Å¾Þ×ÿoýuÿýU7ÎyÓ¯þºÿõ¯××Ý/êßa„›Isa+ô´ÛIYÅ&˜b˜âƒai(M0‚Û@’¤ �„Ô÷GÔž¿þj[×ÿ×½zÿÿ÷ÿÿë½û ÿjÃ=ûkÙ…ZÈ®eí´“[J 6)´�lPb‚iÃJÓm$L$Õ„Èâ PdPiSà„ä:i†ÎÂÿ·¶½¯iûi}¯wÿúÈc™ûé:ým/ÈïVÂLŠ=ŠM;H'¦ƒalBM´“¶ê¨&A°E“a¬hðʰ¬aˆB Ï\ÉD‚AWöÏÛgû§®û1Ûª«ir(áÿ¦œŠá¶Å-¤IUv‚éŠ4blÄ ¦Ø ­¬íW'¨0ƒ#Ö!JȆM‘[¹gÿa„­ŠÒm-�ƒ¶)0ÚIà  ‚I ÓM4ØOa…l�á6‡ BqG_a#Ý0‰Œ—ÍHC�HhDDhDEˆTÁpƒ4Ø„iŠl�¥ ‚¦Ã+MŠEÅ„è¨hÏEcEc'Aœ&ôˆƒgb!Êúâ*)Q£*è®(áqÖƒÖ„FP€Eg‚;B"“�ZIK!VÿT5­%®©t° ¶ÐI¥PÅ'MA—- +æÐÅ!ÿËTYÌd’¤MˆÌ’ UÑ”Ì)”KòÒR�Ù%¿~YMp©4¿ï%F[”Ai$l !ßs²Ó;&Ì”aLås"�A6h_;%Cÿ÷"²¦êø"ñ¤“„O�æY•?]Õ×ï ƒ¥WMêºy2i�b#)Ë4"JUŒ§fbš"†Q›F�öŒ«YÙŸ¤Ý ¸a®kkœ�dR#ŒêD„nD!r*s'¡0F€h‰0EÙ¤ƒd#@f‘rÙF².Ú6Éøi§Hs!"ºë„©#w¶IG"yf ´åYjÈJD'BØÔ Â4šyü"ì3†ÁèöÓTŸI½ÚZM¡¤é4†“ àÎ×Uò <ƒÍ#PÉvU’” ÖT*¾äS0a„l Ò ž”ôša£ ¿G†“a4gi:&z ·„œ(t�™ ˆp‚t´IÒN­"QI·á7ÿ ÕšÑ*gBO6gQ’èáž3 „�!Ë8##6A$`�„ (‚ #d#`frj–—hZM²è› …UTV5aKBa²ÐÅÒ¼[KD¡4©?ÿ¾:[ÿôKKhRýÞSµ&<ëˆá�E52NŽˆÙB'0åD� /BL«i›#@0�‡™z��A„li„ÐhØÑû„ &a0� SG†‚ ¨F†“¤Ú"ÃI/ÛDž•éXPøuMë}·Û[Û^‡}§ô·ë§K­Å}¿î#‰© 8)ã4G¼Óm0š63I899Âdö�áT^IL&“i^ËA´˜h޶ÒmvYt ÚŸ0Úg‰ÒnÝ'JàŸKKÒ½u]­_Kë�Û…¾éõ÷Žÿ�×úÿ½&„0¯-é:#€Â ´7tG�YeÓªNÒZgŒ �&éà›JÐ&¤Þ:ZWþÓ­ú_íõׇ�ò8SÍýÿVÿD9;�úþ?ýÿ÷ÿ ƒrÓ’ö�zI½F ¾Ñ([µtµÅ×§W[×ßJ×ÇmÚÚõm§õ#…kI-/t[’Edg^ÿõÿ,Oýÿë°ÿýuÛKÿÞ¶á¦÷I$ÿuM¡w×{ë~†>¸ÞŸnô—÷þ¿_‘Ÿë¥þ=_õÿýkÿÿ†¿ázÿþ“û÷J½Óhµýoxûª,r(tXäeþ»ZoÿÕþ´‡ò@ëKÿÿö×ÿýÁzÿʆó¦ÿà�ÛKÿÿ»c�ynI÷Õøõ�øÿð~¿ÿ÷ÿù±zD3Ù‹ÿÿþ¿ÿð�ÿÂO†ôŸý/¾!ú×ûØu°ÿÿÿaëëÿÿíÿÿÿÿÿ¶ZAÿoá´ÿ÷¥ÿþ¾ ëï¢ëºÿ÷÷ÝvÿÿþÃ×ÿýÃÿÿÿÿ�šØ×ÿüŒÆÿïT¾ûý/ý~ô·ô»¯ëÿïì;ÿÿÃy —¿ÿÿðoÿÿÿï¿ý-.ÿÿœK×ÿKÿÿùVŸ_ßþÿu¿Kÿ÷áÿÿÿð}ýÿÿûûuÿú_ÿ·éïÿ„·_Ûýoõ]jÿÛívùžëOÿþÝá¿ÿÿý½/ÿûÿÃ÷¯ÿ·ýíÿéz[}úú{uýékûv½ÞÚú÷wª¶ƒa¦é6 a.¿VîßKÿÿ~ý~÷ÿûuíÿÿõïþß ý.ÍßþÈ8G­˜^ÙëJÑÇd²öÃ9X&œ6ûI‘l0ÃM0Ç h6B›L0ÒdqÐVÿ]'½ú¿ÿßÏ'×ûÛÿSŸí×ÿºýíû~‡i5l$­ž¯Õ6‰Í(Ó°ÅZPؤ‚ 1L¶›¸AÚ +½¦ÉXM4� 0˜HôÊÆ„L*#—¯ªJüúõoÿû]kUöìÖ¯Û4_½u¶éöÝvÚ †söÒ\&¸aŠ ± Ði¦žÂa š°¬B¦¶« 0A¦¡V �žâ"#�×צÛô®³EÚÿmþ·w«l3é?ì%Ú¶•¤Ùy†sm-4Óµm$Õ�Œ&˜a @šÄ' °¡†¬¢²�lŸ•nz0Â!ˆÍ€„DD·?n–êÖÛî´˜j·w®^nÓº‘,6l‚yí†GH0›šÃm+âb›H&šiªm„‚i†J0V¡‘§+dL€·ÄRý¥zJÙ îÖÒb�lMÅ0t­¤Â¦‚i°˜Oj¡„�PÄ ÈÐa!Ôªâ"‚)Ñn³¤÷uÃið•‘ôÓi;`‚ +i©á„| ðƒˆƒ;„DñrЗ­z\2b¤M–„vƒ™$µÛKŒÛRˆ�W[#t¿H[Aaˆ$Å�òÆW~ ®)�?ì'î#þ@A*”ÕÙ¤ ËoH¬Çp`¡Nô¹j‹çi#°¶*D¼¿RÌÌì’ ™Û½»ï,ïD‹ËþûÓí&Æ#´ìÈ%‚Ya½Ý÷}¯äÞ—°éþ¿^@â¢ï­»~w¦ù—ÿúy&{úKÃò¯_]rSggÙÔót�2<ˆL›#['Œ=xäm–þ¾vYäȬh΃@ó†t¨9�ŠqˬÀ¥D< ÊL0ŒáœöÄ4l fŸaÚL5 %¨}uîÌ•""5–§A„BtÙÅ b”¡SLÓ6AÙ1 Ѱü „l ¬�üz3³F“z3´G ÚM´ÔÞÒm&²ÏÐM¨zú™BÒ5um‘¤{/œ�3 ÉÛ3"ìŸFÊ!<Øá0‹ÀÂ6�2ЗPƒ F ”4xi6ËEÚM„œ4Ó +Å´’{ ‡i;Ò¶•¥k[¯¾ËqK, i’!3ŒÔ)B6ódt2;Í� �Ó<&Cî"(ñáv¦º“jšO&:I†É 3‡ Òti8TçP‚ ±t¯½&Ò÷÷T½ët»]×Uu +ã5RL‰*j‰ÆFŒñÄ4ÐCˆ�†~Èù#Èž`P�”| ž|jG¹¦# ¡4 ¼'¥„Ðjì—ÔÆ‚l!¥ 'LûKq¦Þ�m'VÒ~­]ÝÒ·Û[ݾ½Ôk×[ûqäp¯þG Â=†N¤Iœæ°Â5°� ÒA„ld$M(ÐÑó'äæXô…°–Aɦ“„›G³§DXiXC +ˆ¶Ò|ÌÕ©ó nõ ´®NO^ÚO«ôé&®¿í:]z]6—¶´ï_^>—¢Ü’¼úÿǤà²cÕ&ÐN“hi0Ñ´V0‚a¤êîêè+KU>Òé±¥t ´›“µÁXI÷¥Ý½Þÿüt×}}oõ#‡¡¦×÷ù§×öúýwý[öñ¡ÿK««Š¥{¥¢N’áCÒÒñÝ]muÛW[ñvûÇÞ‡uKiÞ÷­ÔŽÐÇ®¾¿ùºõÿÿËOÿ_µÿÿׯÿÿãÒ¥¦?A¥Oiôý}ÅHékwëVûiÔŽÝõÿû}½‘Ÿ. ì“ëêÿÐÖëÿÿ×ûýõÿÿ„w¶¿ÿÿWÝ­Æ6½»ö¸×zׯ‡ß"ÓUÿ¯¿÷^�ô+ÿ÷ÿÿþÝ~¿ÿ¸Gv¿ÿøA}ÿþ¼±Ô1ôXäU�J°ÿQ¯ÿWáïCþ—×ÿÚ¯ú¯ÿÿÿÿí¥ÿÿþ—ÿÿézõßýö~,?Çù‰Ø×ÿ_{׿ÿÿ÷”î¿ðFÿï÷ÿþéÿ·éÿélûöZP×÷õaÿ¯ÿþÿÿÿÿíuÿ°�ÿÿßßüŒïþ·âÇýÿê°µÛÿ¾Ãÿ ?ÿÁxoÿÿÿÃÿÿþõÿ~—÷ýú¿øÿ¾û¿ýwé¿ëo†ÿÃ�›ÿöX7ÿÿßøoïþÿÿý[Aºþþگݷ_ùçÿýÕû_ßÿþ­™í™®þÏ®ýƒi¯ ·þïÿúÃûÿÿß×LT~ßÿõþÞ·ÿþßî“©ýÿÛÿôþ›Iµì¿jØ^ÿîÿýwÿÿm«ûÛ÷]wÿÕ}¿ml�[tÚÿ!…lÿf¶¬;NžÖØfÚjšw"»jA1LPA±I ÃwýÝ~þíwý»ÿ¿¬Ó}ÿîþ½¯Û4öͧö»Õ­°ÂMž�&Õ4öÓÓb£OmÆÛÒi„ÓA¦ªÂ~x`Š&aO 0‚=¹XÁ‚5û:¯ÿÿÎûÿ·ºß]6N¿Û÷o´–�Û^ØKa¥"ïa…d_h&E¶›¦Lˆ=4Óm4Ói¤Â †dpˆ¢¬2t�aƒ +VI¬ˆˆâ9�ÐnQýíß®ßíëí®Ýÿ¾Ým­¤Ø%þÃ<µÛÒµ¶¼&Å&ÆÂpšlˆ=¦Òk°Âa(4G¶�”V4zQñ¢�VID„„"â"v¶‡×ö}uûgÿØg»;«¡Ý°Îm­§È£†ÚL‹t­&)5M0Ç Û"¾ÒN½ ŽáÛ˜a0š•�XB!“\„æBXŠívEÆÃ´¡†±Ié±R8ÚLá6(28„ÓL6a†Ò… „˜Vƒ»a5´{á¡¢9"º�rÞB*ý[¤é0Ä&AVa&xa0šdRJ¶MR4Qî�l4,˜8@� CB"–"ºKdz6«ƒ1�¤v±�•fZBß_T²Ê<ÂU¤ —oA+iWaá* $ü>Ѓ5Äh41�þSiQÙ­-±´W%aV[ R~YЬì—S8ì¢H1îòÎD;)Á{ö\ÿÊä¹>L,†ÿ¾û¿ˆëù‘ƒ5 å*Æk3 !PœL F"6ûÿûéiå."Ñ&D:‘‚�ѶD +HFÙø»8)²Ð ¬#87Ø<3H Ѻ�Œ"ñé0Ó abÿ‘¯̹VELƒJGÊ„Qž˜’dpdˆ6Q› @Œ3=”A0�øFÀÓMÈù¦“°šAI´ƒé8IµG¶“¤è&�l+Çÿ_:$É Öd‚&âʆHÌ +HÁ°�e ðYÀÎ|Â6�ÓHÎ ¦“ Bh êAµзçôƒha'MÒ· (¤ézP×MÒÒz}+Ã_ò‘e’ r0dB&9�c1IѲ82ŒÙdöGÉNaÈL<kð3LÏÓ(ô~a&Õ4›I´ÖZ úi ÚXP™ã×T›M¸_éZ'jšI¤½t©/^¶�t©oVÜe>J2T‰Ç’�‘¡“‹äâŽÁ%\ˆAYšÖFhØÙFЦš„ô…†­É�I´ƒi8H",4V5ÂV�my„­ ØPîýU¤ýn•¿Šö֯Ƕâ»�mÕ¤5ñÖýj*ß_:lÂCG…žÝ&÷¯×ÿ[QÕ8×תý¾­„!„ÃÂJôÕÒmþM¤é: Òa†YV’mC¥½%Âiè7ö¾–®˜ýoªjÛN‡NÐí¾ºïï‘¿ ×|W—úo÷ïƒþYGý_¥¢^Õé&ð• +N¿úZZé?"ï·_iÞ½V¾ºÚÐëýmþꛯý!øÿî¿þôÃÕÿÿÿúN½´–÷M&’ýS]-~ø´›xÛJ¾½øÇÇXïËr[-·Ò,£ûj«ÿÿì?_ÿm-u<0ÞK‹äRÿÿÿý;½G¾£_¡×]kòù/H‡!Ðÿí赞´Ãÿúÿ¯û¯8?ÿü7ÿ…ñýë:²;n°Þ�Aÿýv¾ûTáþ[’Ÿzmöÿ–\?ÿõõaÿúÿçQwöÑO_ÿÿðßþÑÿØiaüCzZáÿÝÿñ]ö´ýƒUü}ÿßÝÿ]vÿÿÿÿ«uãÿàßþ—ï\—‹é}¯÷ým¯ÿÛ×ÿ_ÿ÷aÿÿ‚3òDø7ÿ÷ýãkÿ¯ÿýûúú_ßΟ[ í_ßm×ë¯ïûÿÁÿþ?öÿÿ žÃÿþõ÷þر·_ÿûïúÿ®×È4î«·ÿ{ÝoðG÷ø7£ßÿAÿþŠv�ÿ¯¥ïÿïkû×°ë[ÿÛóËî¿ýë¿ÝjõÛ3Zû|7]´¸A?éþKÿÒþõõím/þ»KÕ]ÿþßöíiºþÿ­ÒýsE¶¼ƒÏkV“ ÿh§}§„m‚(v97I¶’t¿ÑÝþö¿Ýéwõíþ“kÿ®úëÙ×ÿþî½·®ýÖÿöÏÿkm¯ßi÷[ 9Ã{PÅ0í0Ä)B &ÄSØA&ØJëõÓß¾’þúïºÿ[i?ÿ×kþßÿû“§Kìõiy„×tÿMXa$ÓºVÐI§a†ža°‚AéÁ{a8L*}„Âj{ʶ1°AˆR«E:ªë«oç–ÚþÝê·Ý{¯uv¿Úí™ç+NðŠ_lýÕßöÛI5bƒiÐl$=4ÓA†!&›a$ÃiÓi«æ†„j§£”R�Œ· 7þ´®þöõû3ß»ou³Km+löðF>×­† \sN±LU¤ša4Âj¦ÒM0 ¥tÖ‚hB>4V2t�Œ0ŽªPb+¬ŒµÜTzÚZM¶ïI³ý„wdÛ CND6Á6ÐL‹”ÛI6*î)íPxA Ø­„á7h0˜¥ín „…+%X„MÕw¬ŠáéklR­¤Å1QV˜bƒìˆ:m&°›h$Ã.Âh*<4Vbޏ`œì‘–`öØH&]L4šlB SA9á°™+  Â†!-Aƒ2Öqº[MQ„g¹!(¨ Â,™zU¢Êgm¤J�é27 ý ¯ˆ�¾„h5TÆ?ò™ì®hRÚÂghÎd4Î9k“ŽÇG‘ج`P´K¶  ¹gì›ac&#°†Ntyn™MØXh7½4á.v2" +¤¾»»í¾;��é%ã´AI{"¶˜vŒ€—�Âï ‹Å¤{ü]õòZ´ˆ)lÙýý~¾¿©(DSÏd ³Z(F%8gQ ó "ÉŽa©I˜0�™™òTþÚÚ;&²¹ýr‘eD´ÿ8d1Q„@ȤeøEÙ¤l°@Èh¬>EÄ¡4~ªz?uTƒn0\RǺäÙi™³ Éu h‰Óc(f,#Xd4i ƒ4l Q±„]‘óM'Pƒ´h`©7™á¦"Àa&¢‡²Ïn‚ Ži6ú陵ÎGVF22`d�IÅ5!2o(FÙÚ–g„A„hhРƹ„|iá:oI†š„h “øGÊL6Y6“¦è+Až<[TŸ§It°¢×Š´ÒWîÿÉEœ‰Q‘#:’›2d�H6GCeâF`Á!:0F€f˜A„ha!a£Û3‚i„L4ÓTGmÚM„ƒV®�Ï´›Òl*nÖ•¶“n­Ô$š_oé'²8í'oL8ÿB­ÿsª6gˆ†) yà DC#LØ9ãÍŒ��áLa öÂ5†xA“ÆxA£a6šh&ªAœG†“i£ÛI´›A6tæg &Ânc¥Ô%om+Òo××ÒµwØO»¨ÆÚM6…}åÄõþõM4x„k2|Î £`k"Úð˜P“xG¶]0ŒíÃdÏEcPˆ·I ˆ¶ á ›A‘Íl´EëNÒ×Iþ®¥ÓJӺ뤟ú—×÷§í*é¿o¼w¿¾_X{Ësiàö/Vÿ莶ÂM¤ÜÆÛIº &˜Y›T›¶Ò­6Õ·ÅÖkPTêÚN·î½?ã´—»ún!ßê©ÔŽúâ=[ßâëëÿï^•6ÿC¼<0¿ýèMúO µ„ÚV»ûj“_¨Ó¤ÿí~îén*¿Öï]¤5µî‡¿ãÿ"Ì?Ñ`šßùv ÷ëé×ÿ÷_ ïÿÿ­'Iý÷_oKÝF�íõ¿wß~½¶²8Wñß�ÿ-?þíhaÿÿÿ�ÿí®¿ÿ�ÿá†ÿÿ÷k­Gwk޶ÿt¿‡¾ßÿÿëê?ÿÃ×þ¿õõaÿÿÿÿÿÖÏûÿ¿¿¿ÿÿãõÿ,rJíõÿûëÿýþ¾ÿVÿ¯þP#u†ÿÿÿÿûÃh-ÿÿ(wÿ¶þõúÿT¿ô‡íÿ‡ëÿÿÿ¿¯‚(záCqÿÿÿ<],ÿÿÿÿþF%ÿ÷¤þþ÷ö¿ÿ×ÿý¾¿_ÃÿÿÛ¯ÿÿ¿‚=ÁðA?ýÿáLŽŒ?÷ßÿþ¿£'××ï’MõOïWõü‡ÿÿáÚÿþÿÿÝ/ÿ·éK éÿþ–Š­oÿõÿûu½%¯¯÷ªÞ“ù§·ö¿¥ýÿÿº]þÿÿö!¯þ—éoií¿úéßûnÚÿþëÚ§ë×íÚI7|3ÿ}6»Ó~—ôžÿûïuýÿí×ÿ²‡ ÿßõýwÿÿÿõ\ëÿÿ_ßý[Ó óßi~Ùôª·¤ +ž^µaÂM´¤Gv—ð—ÿýÅGýþÿ¯ÿ‚CûußÿþKûj¿íÿýÈ$Ù¢èå~Ã?í¤¿˜^­¥˜ÛI†œŠáé&šlha4ì$Ä$؄àÁ �m‘Ò ªˆ_õoÿoj¿ÿ<¿ÿ×÷]¿õû]&õÿ³=Lïûaì Sï/.Ø%†ÒTÂlaƒM´˜¦ÂZp^UÃ(EŽÑ\èŽa„j@Ðd‹HňË/úÿÿ¾×íÿÿuÿò£}×gû6»ÑCÿã†Ý6z‘ýC`‚» +M˜m²Ú[ƒA± m ;¤3†vU&b +QÚ(YȈ¯«ÿíßûvÿíýÚ^ÚM˜ÿÕ‡êé&Á‚R/V°Ô' í&)„á4ÓMŠO‡¦¦§ö ‘ì${Ïl¢ Å�!„""®8ÿû †{Öý†nzM†aÚkt˜L6”„i¦Úi Ã $˜b Ój�vÓLP`¡§Œ¨h®+ +Â�Õ¹‘f"ÙÙ&""“ÿTÓ‘Â Všh4Ø­è Âi†!Zi¶—m‚(t×÷sÍ£ÛGÕ±+ª ˆ®³¥Õ-´àŒ&L ƒYßhöÃØŒ«£ñV{ƒè¥fVC'*�rn­)Ø* i;B"�‹b4WUúÖ�i_üEÅZ^’Òm¦·¥V’Å2±¦�aØw‹B Á ÑñˆÃÂ@ȬՀØbÄ0Qÿ�UÊm`��A‚ÿÒÿÞ÷¦éûÿÑB?:Né}¯û×m¯ÿëðWÿÿþÿÿÿÃaÿÿí¥ÿû~ú_Þ’ÿ¾ö°â·­½?ÂJ§7ÿ¯ÿß÷¯ÿÿ£Çÿÿÿúûÿÿÿ—ÿ_¯WÖÿú¾¿¾¿~y?û´ßþ¿ßõ~Úÿ¶h½´¾×ÿÿá/ïÿÿ¿Þ¾ÿÿîÝ*ÿÿÝvµïòtß�?UûÿZÕ´½Íí™ü†'ù jÕµýëû/0ÁSÛIY¶‚ úÿïK_õöÒÿûWõÿþ²a:ÿ·ÿýëõþ¾Úë·{kïMpÕnØk¶š{peÎÒ†ÃØaša6!1 0ƒm$6•õÿý¾ëÿßïïoÿÿmþõÿ¯×öéz³ +Â;ƒöÓ‘\5† §Òí¥´¤Ó ± Úi¦Û Û¡ÂkØYì¯@ÂG°åc B5â !ÿþßþþ¾õ÷ûi>ßÿýÙšn­?Û?·÷Ù„¹�í.é4Ô0Ö¡¥Ò 6D Ðaƒ0Ó†’i¶“NÂîVCHðå�ŽVJ4sÄC#‘dWà߯û¼Ñk÷õí¯¶gþôÃAÙë¿ÖË˶JEpôÕƒ¤ í4ÓŽ˜ªÐI¾˜C 2:ú¦)…Z3¼4MR>0ÐÊÈ2j" ’t؈ˆ¥Ž=/ïl÷ ðƒöÂK¶ÒM6s][I�ŠMSU¸¤ÂaˆPÒ‚¤ÓA†)‚Ó[i&¹á·ÊHN¤#@ϲB—4º¿´“M5d~( ùm6Dua$Âm “MˆH4m¤Èà ÂTÓAÃM„�ga¦)¡GÂŽÑñƒU¢¤<ÒÖ�ˆ¨�Kû &šiÐjÝ„ÐM0Ô(©á£D1ëÀž(®f˜b7"­ºK^—E:$Јˆs±&YTÿl¿ ®´«6ÖzK±h –“iW\$– 4`Á!ÂKÕ ‚ì! �N)uÅ$ÄDzW§Çalpƒ ˆŒ"áŒGü€ÁjS`ò·,¶SçeL’D¨C°8™A&ùjE{AH�UB7ƒ»AÔGƒo,øˆ8ì$¤,D„l{¤ß¤|gÙxƒo–ã2¸ÄGÊvEÙ@¡BíoNúAºh%H„0Ø|’DðRg™Fˆø@ŒjšáðÕi7é0ÌŽ†šI´møP½‚¤- ›{ó³LuÌÿKM_Ò¶ÿJÒ·¯Êë‘/ñ_VÔ˜ij*ÞKŒÔG@ðáß2Iµo�zú¯ämd„D‹'ugThGA”#c"$ˆI”ƒ@d<À©};a¦ƒßþv&‰¢ûï×ÿÊ|¬ÊR/GØD$ȧ›"¦s,åY~lG³Usø Â5†^ÐÓLžÈí:i§ö·¤án—ýSÒtŸ×ÎLjY„BdÙÄÉód @Fò|Ã=›DÃD ƒXe@Â<>ô{jKIÐi¤é7èi1I6¨¬agúM²ÏI°™ö½×ipMÿô×íl¨%4G²ªZyÃ: +hŠÐy²$ó!á†p3ž F¶O˜? „nê +Õ4ÓI¼óIµÐÒ}¶YÓ¢©´-uî­Ó×·ÖÖ“ ½{÷ñÿHßý‡ÿÿI´ŸÚa$ÚN–ƒ8tëj|ÒÑ.h“ ± Ú]/êý'ÝWýÖþŸßTÛé|CÿC}ÿzß ãÿ�ü?ÿý[ÿÿ_^“¥ûý$ë¤ê){«´ôïMøÿï_°›z¿úo×ýÐöÖ7þXäeïòÇ#GÇõðßúûÖõúWú_ÿðÿ…ÿ¤ëÿX¯[Ou¿^ÛŽ×ÝÒºû¸ÿëÿïòÜ‘ßHšô?øÿÿ~¸}ÿض¿é0ÿÿöïÂ<ê5ý­¤5¿i{¯¾ÿÃïúÿÿÿÿÿµ¯õÿÿ_ÿöðGþO†Þ·¢yÿT×ÿ»¥„¿þ?¿á�ÿßÿÿõöõÿÿzÿíÿÿÿaÿþQ{è'ÿAkáïÛAWý%ÿ÷ïú_߯ú‡þÃþ½ÿö×þÿý÷û_ýÑÝ×ÿÿÿ ¿ÿ'ß á÷·¥ÈÃ_êûzÿú¤¿~«í«uý¯ûÿû W_ïÿÿnµÿõÿïÿü ¿ÿA¥ÿ®þïóÖ¿ëþ×ß<¶×ÿ¿¯ôÃ×Ã`¿þÿá°Fÿÿáÿÿ¶—þÚ_ÿÿúþÝzù©zÿz_îÝaWý#4—ý}÷OJ«ïðFêÉyü6ŒÿõÿðÚ ÿûÿKÿÿƒÿý´¿÷ÿ¿ÿõÿ×Õ}ÿï<šm.µý%ÿu÷ý´ªï[^‚ý¼Ð_†Â ûÿÿ—ÿÿÖ¿þ¿:öÊûÿÿ_Þ½Wn¿û[]½}.Aùÿý¯·_ö“i,ˆ;ö Ú_ôÞ—î—þõÿºþôôþº_ûuáýïý¿öÿ×»_×ÒõöÿÛ»H6’mÈ£†©ê”Šá².[H&­ ÛI†‚¦„Ó Ž[öÚþõÿëÿº_ßk_ÿëþß·ÿgÿí³÷ý·½w"¸>öËÒ+ƒ½‹†i±ºL4mÁ: 4ã‚á&Ú +ïPÅE­ÊÉFi¾¿žN¿ßÒÿfþé=?¯kß½iÈ<ÿ¶~v¬ÿ¶^í°¶©Ù`ÂIÚpÃr.6H&�4› („Âh&˜dp«M‘ƒ ;´y¶šG·+(¬h¬DÉ©1¡úþBtßúúûz¯þÝZû{}©ugžÇù…í¤ØEaþ› «b–!XL1&ƒMˆLBL&›» 6ÐI¦Â¢Œ1A„Ó +V4UhîlDRdK¥o_kVõöÒ¿Û†õëÙ{JE6ËÞ–“ ´–â˜{›iE‘Ûaši±OA„ƒh#ÛF¨øÍ)W c®I¡”JS}nÚV„aÃþé³”ŠáªwPÃMŽÂPÓµbôñ0ÚA†‚ Ž„n AÂ9á± ‚¤zQ«*³áXVA‚,Ä[a+!ðBp¡i´˜¨Z ; ti²8 +Èú SMLŠ &šGÆÄ&(40ˆå+!̹8ŠDG Îd0ª�h�dz„Ðiå Â%ÑB„„"¹¤"8WI†”DE9]D?í¤#ÒZa‚ZúÒ AWÒm!Ö¢Ã(UL2+_‚¦˜é2ÞkˆÇü¦Ö©mM–P¤Zr«FÝ,½–j[Š"Ü<)”#ßéׂÙÔgqœ`Š^�äÜ!¤EXR$•ݨT/ºˆó±\ÈÆ‡tCÌaÓ%~d*F±�ó›2>\SƒÝê�ÞŽÊ× +I�* T˜i7öæClä¼p¢8Ò}|u\­dnõÒA¤’m&ßôaíOÅö~/©[t—êw4KP�lèÉ ‰ +L# Ê!‡#q†O0É�„ûºŠJÚ·Šgj^N‚~¸­Ò}Îó5še@ΈÝf̧gÂl�]„{7žÌ0ó=³¡IÌøÑ°0�Ô›Iµ £ÃïùÚ½%Òýuuo]¯@íºK92Í™ÐSÈò=—Ïu4Bq¬Ä ñà�‚44B'6©¨L£Tla- ƒi:N©é: ´�'A0Ñ, ÿþ•_~¹V‹é +CŽŒï‡èFЃFÆñHØÌï¦Õm0� +eƒM¦¡`0ž�m+Iµul*û¨®–“«tÓÿõ£zº¹Hy¢=YÔR¬f¢: +ˆL˜$ÙFaÒøâmëhj�oÖÒm¦M¡ËBa„Ü)óm't› +7ºV“Ixããú§ºB–×ÿÈl�•4pÑ„A¤½ö�” ‘¢ž���lÎA„lÓI†¡5¯ÿ[p¡.ô¯Ò¹8º¾×ëýã¾;j*GAVÞþã_Ûß’C)Ï(, eXÍLÌR! ¤ù²!‹˜Öd‡°ÑœŸ’› …F¶«õ„�j¶“i:"Ý Û,ó6“a2æ«û¶õ·Ó[j›Òøé[Bí=zM‡jÝzã‡o 䨵_ù×0GÖF¸F°ð�l#C4“FÆ�mÚh4{qI°“œ8DX 2È6—Zér|Öµ¥à­+ý.šªÿõ÷Hk�ò8Vµmÿ_ߦÕE‡ƒö+ÿýSM&A:MéI´4aÚO Ù$òýé6“lµ~mÕ´¿ôžŸWÅ/}¿|Ø®?þ÷Öëè±ÈÐÕd‘ëÿýÿ×êaûú§üà°ƒ8gÚMî“zºZ' m]xAµé½-[ >•¥ÿþßÝÖú_ê ÿé^—ÿãÕÿúÿÿþl<7ì?ÿþµûii~?†•:i/t½ü'_ýÿZþ¾ïO zÿüý'¿ÿö×ÿÿ_ëü6Ã~ýßøÚwK^>ëqCQ¯ºûÔŽ[ÿ}[Kÿ¯õ¸«¥ÿå:«_ÿþ¿ýüŸÿÿö‡ð߯÷õn´XþÇä:´>ãïãÿ÷Ö¿úû|Œ{ ÿÿþ '”ô¿ÿ×ÿÿÿÿû··ïÿÿý|x?–7ýªÿßô¿ÿþP÷oÿÿîÿnÕ¿ÿöëûÿ×õõÛ«w}ý÷íºûÿ_¥¶ºëëúÿÿüA·¿ÿ¨Ø6Toÿ{¿âÅEoÿÿëý/ëÕï|ò9íÞÛ¯ÿÿý‡þã÷aÿÿÿþïÿ÷_ÿÿÿÓ_ßÛ¿ºÿëÝzíÕ¶tókN¯M™¦ÔþÝ¥ÿÿûÁ²£ ýÿßÿýä ÿß×Ûi~Ý~ûmÿÿ¿¿uþ¾éw[«wÖ¾•Ý¥jÚpÛ9<$Ó_÷ÿ‡Ký/Òÿïÿ¯þº]-×ý¿!îCÿûûvÍ¿÷ÝÛkz[tÃ96n´®“mXï S"ÃaS[ÿÿ턽í/T¿ßÿ×ë}Öþ½³Éõ­ëûÛïüÓ¦¿aû ÷M…µm$×Nr*v‚NÒA¶LB S &IÃ&JÓ"†h\0ƒR²#ÿý÷_½_®Ý.þ¶×m+§õÒÕ%þ×÷4[iÒþßMSlÜš±ÓA¶’i¦›NÓi' HÎÈèA„ É+ƒ"!þôßyíëöÕzU×nÿõ·¯ßµë3¿« —W½Y�Ø`– +à i§ÓI¦˜b“°Âv£Û �éGª+ˆ† fÀE¿ío¿ÿnÿK[¯4O[]®ÚM¤Úv’zwkg 4Øa& 0ƒ R 0ÐA²>‚ Ú_Ç•™ì«+0R²dMˆãÿz}³5¶•®Ùù³êïJÑÇzVà 6’v^»JEö‚M´›I‘a$ôÓ`Òz m šðÂG¶ §9d’¯¶”;l-õ"¸|4› »I‡ÒV6Ò ± °“A´‚m ˜ Â…‘ÈSÃE{ B;>Y�U5M´ƒ"½ˆIÃJƒ B SOiSHð! Ã2G5¶ ¡Æ!ˆB !–Ò*c[M°I¨A¤x±M‘í†0B0ˆä"-t"?aˆˆ0FTb?Ä ÿ¿ãÿá°AÊç £ã£¦…Çùa"2¯”ÑT \íÚËnˆì²ýå®]'~ï-`äúúå”j)Q’}o"k;5YòT‡“`¸)ž>…GÒ×™g�ˆ´ý¦ŠýëÞ™ÚsÈÐɯ¾ULë¹³!�ƒEa/<9¸ÖóƒM4leiÓ¤ÚM ˜hŽØG¶ˆ°we¡6©‹¸…»|iõ·KQÐU_îÓô•÷©/×SV™1“#È�N¯'£4ÈLÀÎe�{$AS!&| ¢.AFpÌäÂ6šhZA´ƒ¤Ú¤Ø@Î0©:ZN­ ­Ð þék·×¶Ÿëõú^õûíª¾ér9‡ÎIJ#S³R"<ˆ"Ð""{#6M4hgðƒÑ�›$ªIµ §&=[CWA:M¦xÑ'IZë…I¸Mê)i:NÓ»ßú»ú‘µÛõ‘Âÿt—ã{ÿÕþ�°å9hÑ”æ|ɳÊJsx�Hñ#`Ñ †Œ%ưÉ>höÂhÐÔü��SKT„/A;Tƒ83� Ú á…qI´N:è”Rºn�SÇ+ºñïö›ýHá^¿þöÕd”Gaé_ÿý~Ýpá›á3ƒ4Ó ªxEØjšh û#´&¯I8e¡;&z †�œi:«¢^õݤ¡iZOé^ê)x®í¸Çvûûߤ“ÿ½ü‡/ý!öÕÁÚþ—ûkþ¸aÐNÕ$èƒG†‡ ›DpE¶“jì´ˆ5 & Ž|%}-¥W„ÚZâíé=«»{m;êÛ�ûQï¥vëÃ{ÿæÿûm}CqÿýÖI†„“ ˜o%Ï«A0�&ÿÿnŸK_t­õÞÝúßkÒßúûѰ_ˬ8?÷Øÿþúš…ÿý‡õàŒ=¹cÿ'ßý×ö×n»i~Ótúí;®£»z[Ž•õþßÖ÷W�¥õýþßòöKú`Ø}°×ÿþ¿ÿÿ úø@°n›ü%ÿÝ_ý‡éºIoîÞ¤p¿ÓwÞ–ÛZW�ºûÿ}[ÿVÿרïí†ÿü6ÇÿÿÿmþÒßoôÿöô6Ò®Ÿß÷õáïzþ”?ÿõøýýí¯ÿa¶ÿü6¿ÿÿøÿ߇î¯]ûý÷zöΫÈrÿøÿì?ëýXzÿþøaþºÿÿÿ†Áÿ‡ûÿ—ßÿß¿ÿï°ýs‰÷ÿÿû_ïË.—þô¿Ý‡¶«¿_ÿý¿Á{u¿ÿÿƒaÿ ¿ÿº­õÿÿíùÅûßmÿ­þï[¶fº¤ëþÿÿ·èîÿì7‚3ÿÿ\ð‚}ÿÿÝ/½}ßÿÎ']õÿ­ÿûïïÿoû¿ú´ºa®¾Âÿÿÿƒ{~–¼ÎÃè/ÿ÷Ûý/ÿë½Û­×ÿíËï½Ûuþ¿¶N¿Û4_ÖÓfk×v_îE6Ëêšxm$ÝŠ‡^Â=ÿþÿðþ“û·„¿ÿ¿ÒØm¯þ»ªïÖÙÓ¯íÿmÿî¾Û ]í›M…ûKØa&E¶v—lU„àž)4Ói´“ Ó"žô¿úÿýÿëý·ëÿÿ߯_ÿÿ(_÷¥æ‹W­ëþ°ŠÙõi/zL2ýåæ)Vä_�iÞ¦!BzdS»jT9âÐaöQÜ¡QDFè¨kÿÿû«ìq¿öúþÝ{ùäúë¾»¥ÿiwþÙŸ®ÚÝZ[iiö”=†ÆJÓ ØIŠØ„Òi…i„»"̬b ! ˆìµŽÖÒÿ×oû¯„Õ×¶{k×Ý~×ZºÿýºþÞ¾¬;m+A&Å:V�A¶’i¦ÃI¡h4Ø"‡&�gуLa)�«I½ëÿu9ûî¾úÚw}×·ö–—a¥öÒOä_i]„¤p‚lV•†¢˜¤[Ã$ƒÛ(ÑXÃ" â" ª‘hpÝ´›_ývÌóß÷]^Õ¥÷u˜äAÃÍ¥tµcMµÒìti¶’a4M‘Ò 6!0šF†*.b κ^Ùõ÷wö–ÃI5Óm+VE1Ãi Âpí&)„ì�a¤šl„�‚ +Â@ƒwÈžO¢­†*Vec'ÄbB"#ˆö5¸l5MtA±Vši†Òa„M4Ú ? �Bi„�pÄ$V9XQƒƒ¨!¢lûA4Úi5¸¬0ƒÏ Ú+Ê8„ňbN„CGiØ+ð`¥ÄeØ!&àu|DqõÓõú® &��¥j�ÄzA:â˜Âc‡ÊoLíV„ ,¦tŽÇhñát©åªI™ Äñ‘Eê/,ÒHªÀ§`�WièìµrÎe).‚ÿþ·Ë* ªžû»_¯2X3!H‹˜R ~î×�çy®q�G;dD‡dXgzÅGÁ/dj«wó%•��ãùE%”D<äkN�¤B ¹–æ ðG`Ñ ÐA„luT“�…@›I·Þ¼{×Ì–ãQ’ÜÐd1©¯LÙP@‹¼ hö±ºœ“A6©£;eŽ´ki7}ZÔ+Iºö½×ÈÖt¼’£™ ¦¢­ÿÚß.°jÿÿúÿÃ_ÿö×Í‹ø#ÿü Ÿð—ú÷ÿºÿh/ÿÿ_Ý¿zúýê?�Þ‹r‡.¯Ðoÿÿ÷ý‡ÿþ÷ÿá‡ÿÿ½øA?ÿá/î öÆÿÛ¨¯Ð!Û¿þõ_¿íþÉ×ÿßÄwÕÉß_þp_ÿÛÿÿë&'ÿÿÿÛAxþ‚ÿÿK÷Kûïýkô½ÿ÷ÿÛzûµ¶Á.»aÿóÂÿû×ÿø7ÿÿú ÿ ¿ÿüŒ?î¿÷þ¿kÿ_íÓÿ{dêû_µÿlÍRjÚI®È·MŠÿ‚ÿÿOÿõ¬/ÿÃÿÿþ—÷½×÷ú(r“ïõ_ßõý¿÷Ûý×þCM°“hÞ¬0ƒ‘\4Õ�MÚI¦›PðÂäDÿ<ÿ\{÷üÿo_ÿ__ß}ÿOÿÿïýo»_í³ÿ÷Nš{jÅ2#„Áºh0Á˜˜N�†H¸dì1Ô¥l«/ —ÿ¯_ý«÷õöíÿûuéä5½~ßéÿ®·í™¯[@ó¶r‘\=6“b�a4ÃaKiÚ „§„ŒîV0ЈÊS•ô ô¿Aßê¿_Ýu¯¶uOׯ뾾ßÓí™ÿ²?§È®D·²©ÝƒQI†*ƒOL0—(Ã… +<¡OI\oÚú¯×·_[k½:·õú¤ë¿{uyúÿ´í[K¾ÂZi°ÕS´ØM0“ †¡Ú»°ˆh0š $UåV‰bž¯_Zë¶ë¤•½m¥ÓÞ—°ÏWMÕÝåëtµ¸l5MŽé´“ +˜b“Nír®ŠÇ+ +¨ Â!£$¤"®»×];­³>ëÒí/¦Ò†´“Mеl$›#ŒRa´“OÝ4Ã#…"Â�nç†Hðå\Ÿ”|ªäØ—ZJÃ=X[JÂ;Èþ’°ÂN’t“"ûII´ƒ"º´“L0˜„Ø"‡ ]¦+tr°®�¨Œ£qõ±PÍž‚Šb“ Ø ÃH&©B ‚(p�í’¨Bhb¬£ã@ÙÙBqIÕÒ A„ÓQ +š•b pÁ!´‚È.+�kK ¸ˆËÄe¢:ŸÚ@�bƒ\D Z_@În•Ž“h'Ðd+WOfjŒÓ„æ‡ÿ–°-S&²Ì‹u[å£X)¿–åQ]j#QdnïùßAHŒ Ñì0��ý¯)8S±»´~i6“ÐÿþÒ´›[ë"XúÚ·£.TëíãåºÁdAf„ 2+0 ¬Tim+õ+­æÈŒá6<#|#Øz=¾v ê•:¾w1“‘ ²Ÿ„™DH>‘œ&O5I7¥¤ì³¯ô™ÐéoÊ‹3Œ �æ ²�a„l1牓êaPL&x”;•ékûôά‰2 ÍEœ2¬RB8ŒG„:EDl‘ 3YÒ/í-S'•R´�&÷vYé6ˆóN­¯¥érœŠxÔ<§Gó:HÌ "f€es{ F°xA“áÁ´�Œ2~ ºL4½- Î„Òm]&÷ý&á6í»¤¤pº_õÂ5†i„ "ìjh4kj™=¤Õ'IÒ{EeRm¦’mÜ Î´&]ýzmi®ñïߥßwvÒ�\|zMªh'DpEº6ƒ8aYhM„˵t°‚»l*Vô•ïMºZ"ô¶›w;I¿÷¦ÿ¾)Ÿë­&ÐgšN‚a6¶“¤ëtøþÕúþÓ~ØO¿ýÝ¥¿ÿ×ß}ÿýku~Óé6Öý7�Ö�îèmÔ~北[ÿ_þ]a¯ÿÿþÿápFµiÒú×w}wº×Þ TXäc?~Ü ßý{°÷ÿ½ÿÿü#ÇAt+×÷¦ÿé¾ÿè±�Ç÷×ÿŸµÕÑdú.°ÿ�ä<©20Ⱥ6Gˆ†2�Hb‚"Ì„.»FÈFÆš #dÎØ¦’s:L|$˜hi6ƒ8lµeÐ29„› ¶/[ÚîêÒ^�¤îþïß[ÿËrGúõþ¾Ã_ä1Hr0C<Ùf“pgÌ#À3M2®TÓÐѬ‹ÆÀÂ5½&Òt˜hŽÝ6¬³¦’Õ¡`’°‰E+§w¦¶ÝÝoz^ÿýä¨ßÿÇýÿõö/ôl "ògO”ÐzMð‚M¦íª#‚-´“H&ÒÃ2… ´´¨«¾“þ»�ÓûB–×ï뻨þ½~,8=oÿÿõÿÃüG�ô›A:¤Ü3‡¥†š]FÕÂuuim_KWTÚ÷ÛÿøÚR8WÿVÿ«Û¯õë÷öÿÿÿÿ„ ðØAÒm-Ta7«ë^êÓéu¯_Zñïô—D:+#?÷ÿÐÿßÿÿÿÁ°oÿÿÿÿô¿—ýow½úÛëwïZñ��Z,r3øoýË¡ÿëþû_ò^ÿÿÿ ƒÿÿúßöû×ÿM®÷W�Ðÿ¿�貯¯�°ý´¿ÿÿÿþTû¥_„÷ÿÿ»ý÷ûïÞÿ¹©>¿×¯‡¿¶¿ÿ¯ë¯þÃþ—ÿÿÿÿWúÿKýzíßmÿû«Ûï^Ö•úûõéý[­pŠÿ·íÿÿÿýÿÕì={Kí¿ý|ÔœÂþ¿öÿu}½³E}¶f›JÑÇ÷ý‡¾¶¡_gºX#Ç-ÿð×ÿûÿÿõºý¯úÛû÷_þïî˜h6Ï[`”Š8r' { ´ÿ þNÈíè£ÿém¥„¨ÿøoúoþÿÿÿûßö×Ûuÿ]³>ë­ºÿ¶ÎV_MCi1LPA±PNÓ­*îxÿú õ¯ÿÐ\B´½.û÷öÿïÿ¶—ÿ~–Þ»fi¸Wú 6ÂZV–ÚI¦ši†!1I ÛA28A„�l0š 2{ëøo]·A/ÿÂ\ÚW×÷þÿÛïý^¿JúÒ¶ÏR àö+a$Âwi&ÅCI´‚m¤�©F°ª •™í†Oj2Y ÿ¿×µÿÿÂO®½íùÏ÷ûÛ3þþ×ôîE#iئ ¤ÃÚ®!#[ Åb­rÐßnŸÏ'ºÕzÿýWµÿu¿Ò[«A÷¶zÛU¼Æ¶é&©¦¬.!J¸a4Ô¬((õ!E§²¤ ýo××÷×ÿõ�gío[¶ÏzÝy{b“M6!�a6( Ó 4i¦2· +ZïôÚú]z÷ÿý„w#°ØiH®‰Yà lRi¶’lBpÈá&GA4à +ÃHמ,)í¢¹†!Ј®ôÛI»î´–EpêÓ»L&ÅSlS ØL&™ »dt<: ÂG+¤ÝM}6Òc ¶•„�l-é¦/tÒ?C ¦˜GfhDqé°h&J¶FtG$|ÐÑÙª;.Šˆˆª×•ðňФ#ˆW¤µˆŽ+ê aék œ®}tŠå&èÐ�ÛK�³dn|1aÐÌŠ!�È (åŠgdE* -°y$I…3×…­?–±tJѨ——x(.Ký‡öŸ–f¹�ªý?ü~Y1’`¥oMßöd­ÊéH)J»¿Üš,tÿ*†t%•ë`§xŽÅïßÈž¾e=s™NDT9)žl²taœók #fºÿ}ÿUÉWžÉI’�Ž!# ¨„&Â"�k #tÎÙTð­Â¤›IçK®Žæ±ÿÔ�™Ñ”ìÍ�,�ŒüáC`ð@Â=ƒÐ„a0��ò8iÒuI°™âÒô–—ߪóLW¢¹®D<†gAù³DCL!&x/Ía‚3†i„A± „ÓA7£; 6“i£ÝÛH6ËÚV–½aõõJÒçiÑÙB³·½s z™ÇjC(Ì è˳Iƒk‚5†°x Éíº…H6“i¢±£Ã ¿ …p¤ø¶“Ö›h'Jê›T×ñ{éÛÔŽí¦Ÿêv.q�FA ù�Å(9¤†°5MÚA´¤ÚOg�e�]–}¥iiؾü'T½ÒuÚÚooß#…­í¦ö¾½x¯ëE^GÔ��„¡YiÏd�‰�0�Œ¤Ìà˜L#\"ì�ÕŠN“h3†N“a-ÚOM«Ðø4––Ó»wûãê5îú_¶ˆp>ð÷ÅmTkùY ÊxèAN¨Šf¸Þ_D&MŒ$Ã43Ĉ@†wámTô¡5deøF†“jˆí„kiZM›IÒºuÕ½×ýµÓÜsuÿ½në¾;ÿÿËü?÷ªúgFL †2�šÌ‘›"¤ˆ¸ ’‚5†i aÃ4äLž6Eã¦3ÒÚi0ðܘé'Ùh °†¨3†“L´6Ò°°˜…iu_�ÓtÕZZ——¸~ý¡ßÛ×꾿õoô¿aþºëÂ!<Ð Ú4� Ó ¤FÆ�t´›PšNN‰„а˜AQNYÃ8i6ÜRJäî©=o¿oÓúºÝ©+ê+¯ªý¾Ãùjÿ÷_¯ªÿÿ¿øoðFÝ:7IÒp‚l$ÚhöѰ‚a¤è-&Ðgžêï»øÔ'I¿×ÿÅÚuÔŽiúûC¾ ê›ü‡õþÚ¯ÿÿõÿÿ†ÿëý&c§WI×NÐOé:º]Z�o½õú¿õú‘¾ÿõ¡¿ãü·%Pi¯úUÿ°ýôwuÿù/?ÿÿ†ÿKz»ë⢯[NÖ©®¾ŸzÒÝ'÷«üˆ-ÿÿ–+ÿüXëÿÿῲ!ÿþ¿ÿ„ÿ×ÿáÿU‡¿~ú÷ݺÐ߇í÷ÿëÿú,gþ¿ÿ×Kaÿÿÿþ þ‚ÿm/ûþÒÿßõnÿë_nû÷ Gÿ“”úòÇ*�ý'ºÿßõÿý×ÿüºÃÿ÷ûþ—ÿ·_ß½ö¿[ùäÖ¿¾ÿá°ëÿ¡ÿ¡aÿÚ¯ÿþ¿ÿÝÿ¢ÇºX{ýÿÿýýÒÿaÃýþ×ÿêý»õ^½vÌÕÿaÃUÿÿ×Û­´�ÝÿàŒ?ÿöÒÿÿùb°ß÷uïý{¿kÿ¿÷íëþÚö“göþêÒì#¸:a…lû ½ÿÿÁ¿ÿ×ÿÿ'ûÿbÿúóêÝÿÖû¿_ ïÿ¿ûwÿoY¿JÒ`ÁS×Ib©Ã~ðFÿÿ~ß½7_ÿéÿÌ'ûÿ\.÷í½?¿×ÿÙ§¯û_¶zÕ³”Šá¦šjØI‘¤ Å6aÛ PÁ +Âk Ðü8o/ÿÿü=ðý[Aºþ—ïþ_¿ÿ¤Ù/íûm÷¶i·Ú]õf=†”Šá®�vMІ˜b¡R¦�·MJ�0�ÈÄ B‚(DhGá°ö—ÿÿ¿¿Ûýÿë÷þ¿ßþ°ìÏêÏþÙþÒmá‚8áÚIȪÃJ) Ái¦›´ì0�ÃÖÁ‚GAEg�¼Wîï_ýß}ûûÓ÷ý_¯í“¯öC¤~ÙšÿöCÒm Å&›m È®˜ ÅT§i&ÓaÖÓM"±¢±“£µµDDzûö¿¿¾û~sû§ÿÛKý>Û pyzö*i¦œ0ÃmŠ´˜Iá„Ä&˜@Á„C�h´=üÓÈ�o_öÉÕ÷æ‹ú÷?m~®­«eéÞȾ+M4Ûb“MŠ[ÿ°ÂbŒ±b¬¾ôº»ývÂMÛpÛ }®È¨ÝjÈûm  Â)ÜBa>Ðai­°‘X: +VÇ9â#„·˜î­&ÎR(áéÚlSNé:§zº°›œa4ÓA‡ A„jB"ŽˆˆqIðµb›I¼1PNš…L0ƒ%JÎÑí†Gçâ¦å¹\â®uM„ÅKPš|+eTT”&R»i}[Rl6’êÒ¯iiRI´˜a/PÂAŠ‚B ŠØGù`·;Ò‚…–ÚTF�TµË%R!»ËQ.;Ißùf—DªS=wwùga0½«ù�²ù7$’_Þ¼‰ëçf)Y{»ùØëõ;TKœ�dEÅÊ!ˆQ‰�‚2;%Y�÷üì?_Ô†DS6gŒƒD� „ #aÅ ƒØÂ.ØA0ÓL#;’H�5OýuÎÀò´ˆ�Ê4 gD —�‘ ç°Ò  ÌÎOÍ›‘ÃJÒt›A6�mOý÷Ú;Yÿý<á�J(‘›#ƒ'�$eÌ"á£\#ãØPñ ='DqÐÝé¹10M¤ÚOM¤é^íúÜ® ãþVó²RRM™ˆCF ˆNœÙ¤N„Â6°4lj&©¡h Ú ´�&Òåû +Ë=ÐL7Ý]ªm-u]­Ý®Ð¸®¹2f¦t²��Ç‘QIÅÙ4Í$ѱ…`þšY1ö�m&Òt p�;ù Z‘¤)_ñüì&kgS:�(EI02n{  Ÿ‚.ð�Œ#t#õ �PÒm ì´ZiÚ[JÒuzié½¥»ý/·÷ÿ¿µ�|2œÿüȆu#· a™02@¤£.0�‚3ƒÐŒ#cTk!¤ÚN�t›ÐM¥«¤ÚáQ(¥i?¿_úZV×í¸ÇêG ûü?þ¾>�ޝüŒ2Xdm� $ÆSŠqŠEólü „\2èá2|Ó0hÖF·é£q”é„xi&4˜l´—í&Õ´­/JÒ|Rm'v…t¿è}ÔŽGoýôA&> ~þþÁþ•߿ńaÃ$f^!æxA„høÌüŽhØaRa„êšiÒvYÃ8i8U>A´½„—÷M¯ŠM$ú§ê®¿Æ¢ûk×Zûÿˬ6C^þÃþ¶ÿÿÿþ@Ú„ÎAÈúš<4½' +�4“jéZNá¨i+ǧJþ¿_·I½ôíF¾4»«­Ýä©þ¿E•¯ÿwØl?ýöþÃÿÿÿÆ“a�UiStŸW_JÕÒëÿiS^ŸWwt´´=~Ðí!ôCÏÃ]Å/µÿ]ÿÿ °ÿÿ ÿx?÷}ýWöé¥ß¦ÿǽÇUýÜPïõ#…úëùOMï,H?åÕØ{ÿï]ÿÿ}ølÿðü7ÿþëý+h]/}/·I ÔŽ/þÿ!ÉÿÑbŸý‡¯ûÿÿÿ¯ÿÿðØnïÿýÿoÛ»ïûïïãðß–9!%Oïˬú,Sú·úþ¬?ÿ ÿÿûkÿzÿׇú÷ÿßëoÛzþ¶ÿõü=$‡HkÿI¿ÿÿ¯ÿÃy/ÿàßÿ÷ýoÿëÞï~¿ÿç?Õ»Û'Wkþ¿ëõØz_ÿþÃÿÿ([iþ'ÿ~¯ûþo_ÿš“˜]¿×šúõwVnÛ›=:Zýµýpßÿÿö ëÿêî—ÿá½/ýÝ_ý¿Ûíëmjöï½o¥öîÒÌzA°“¦ 4Óÿ½~ÏÁ½/¿ÿÃÿá.Fw·^ïk÷{ß·ÿ~Ûo_émŸÛK¦Ï¦áéyzÖÕ66Òb�Dx$Å28L Á‚-Ú=¹Vÿí¥øA{zW÷ÿïûÿ¥�ëÕú¯¾Fýéÿ¶ïh�ÿ³û ôÚZö’°ÂWÚLl„&H6!0ém9&)„Ðb0FBÁ½ÿ#éx÷ÿößûÿóí½ý[ }7ûwŸþÒ´ý³Ûgÿùé±LSiÓNÂH0Å6“dsa)V!JÆÂ ‘²¿ô]Ký'îÿ_:ÿÿÞ«ýÕ×í™ú{göôî�XÓMŠb¤\tÛV¡„AƒAsÙV{pˆãF†A“@„Yƒw¯Kýr >·ïëíÿíÿÚÈc™š¶ÒÒaœ®› H®ö)‹í&ÐA‘ÂM0˜Aá„HFA²ÊÚÿúú×Fi³D{Û4ÛÛý³ÿWì3—ë\›a‚È¿JÒb›H1M:m2+¦ÛŽÉq•‘wï_ óßw¶ºKaSØ`”>Èá=Š´™lBM4Ðm4ØbAƒ #À„&GPL"'ˆ‡-Ì*í¤�°õØl4í š‚†+A±LlŽ) ØL@©„0¸r­£Û•i�a1W?¯m$Âm„ÓOi8…y@Á6��`�“ˆa,AŒÈW#K\1 +xh¬£Ó+2±ˆŒ¬ƒDD8ˆŽ"+ªKÄDE'2HµÒ ]]~©!:õ¶�åuI}&úK …lª¶‚ +ÈuÊŒ"¸]ü€Ì¥‚"_ -¢D¡yl~®/xykdZ@Â’÷ýT#ÃÿËBÞv®õkëøUú‡ù7 âëÔÈMc^n5ŽLGeã"iSÿ×+©"òqH)Ÿ2@‡3y´^±… ÿ�–/×&HŽŠš'ÐR@¤1HÃDAËàL—FÆEà˜M1O Ù¤ß÷ó²“/Ô’¢:%¬ŒdÂDNœ2¡"EÙ+ 4±£Y “ð• ÜŽ“hŽÚ+M´Â„i]Ýó´èì¯ÓÕL¦ˆÌêdät"üÁˆO4AV_„,Âæpf˜A™‘ö)áO…4…’¨I†AÒa¤Òq…Gš® ½+„Ãt·÷[øê¿ª�…fÉL33/‚4�„l9Íý4l7Rm0šM¤4xtÓ-Î0¨3Í'29¥¤é6­BµÕ}½o«ÿî9©d©?Ô쟑s)Ì�AHölŽƒ#Bú!<ðG2\KÈM•BjšÚAÐN•¥è¬ Û,è6Òm-E·ÞkV´Ðkµþ·wK¦øÚúÛKtC�u_!™Oš‰2²GD"ð�‚5†�aÇ Â6�ŒÌàôÐaÃrcÓi± ´˜3m«I…°¢ª:°ÆˆF\„F—]Ú÷ö}}Ÿëþì# †n†Gƒ“[ &ÆÒa›'–!(&› ‘@�U ÉV˜CDr�„ëô•³ ¼‡1¹{¶Â§±OA0šiÄ'mŠ Ž!ŠM6 $ëæyB¡a +WgFBÐõÖ�.;N!;“ †)4à +�;ÑßMO6 Ѓ5YY š�äÛ[WI´ªÐP­4ÓS»ž0¥c(D<ìÍ9�ð¶‚a„&ÚN¾�d‡@É7Zê¾�Ä}zmÒ ¦;I$�Ò°ÁB2l0Úˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿ倰È©L@QþC$%D�YlT d2Õ €j–•@hË=@h š�y7 0Ú$ ¸Êõ 2�q” l5ã�Èzˆ.ÅB?ù…œ°Fv;4)L«È¸ÉpÈù",ÁMA*[4ÎëÉYÑ’¸Ø¦¦˜x޶ƒ å®U™-iPáOÄD°ôœÂ±ô|'‹úå¬PfŒ(GvL +¥æ´’ÐXI’àüó¯~½)/�GUH Û´§ó¯¤Ú¶�„ÂúÆ…,ì�„koX÷¥Ž•~—ö#¨¥‘|†Èq‹HЊæ~8Î3f ™ÔZo¯Õ%ñI+ô· ̇&P%dì� +¦Ìñ˜ ˜# �W¸ .P¡<#^²¢­ê–Šw¤c¢%_þ•Ÿ0�TÂ4}´gÒ«ªAÒz °Ž=uG®•qÒô�–ô}‘Ò sª ¯ô¿á&E‚IÕBXA>á„qÃtSÒh%ZKh' Žá˜ÐW„¿«}k*”–Ô LêמAuÒ¥ô¼Ç×¾ê—QTº¥E/ÒÅq¡URõé$ÏÉO¤ÚJª‚é.ëÿARãé%é$”V5I$ª¿t©-U½RðKê´ª)k÷ïÒQëZõõXKúÕRK­uªÿí$®�kzV—6RT´¯mRéu­%ÒTÒªê¿]*ëZõÞ½QXéÕt•^½-ƒH0uý>ªµ\AR]UUké*ÒT©Wý$¼o¿ÒèU/ÇÒUmUKòÃékëUý"‡_ÿÿ_Ý\UTŽ]-$©.ªÒÿI/®©0´´µÌ*¤‹øGGòëÿ^•ðêŠFµéz^¼Ms ¡å×úÒåú/Ùõ‚8ð–]o¨K *Åa(¤øz_Oÿ‚)×é.’J_Q¢úK…aåÿ>¬ò¥¥¥KK ZÐQ +ë…ª¿Õuþ•V—Yt’T–”8zPqIC[JÁ,¾—cl„Á a$é5]mBkÿ¤¦+º_¤«úA-PU"�Ô*¤Ã"Ìu©¦˜MBð`¡QÞ�¿õÖ‘Ï룒¬ÝФ’hB¤0ª©ì Áhì]ˆ�~›JK¶–«UÕ„�AQøÃ+”¿uºP´“AR=œ¨­ÖAˆ#[+�IB¥plI]Ò-`­!íÛínÇÝ&FlCA¶�°alP�v!ÿendstream +endobj +59 0 obj +<< /Filter /FlateDecode /Length 7912 >> +stream +H‰”WÉŽãȽë+ˆ¾Œ(qr_|›—† ð¡Ç0Ø«DC"Õ$UåꯟH27f²¦ÝõB22âå‹/¾ìh©¨ÖZЕ $iq@%£HJ¤ "I)ÌsÍ +\ +ͤ ¤�Xã3‰ü£¾î~|¼¢â×~÷ÏÝ—¼Ä>à"�”fÊ„´ÁÃy‹RS¦¡…D‚•R G؈ØEÔaŽ…’b„AT—œ „…Ôà-©Z1©¹Ìˆ�££R1—’q¶$Æ)F2£Â!1‡Ó-yá°€ÿU6õ•ê�‚—×r;C¸„§Ù€šJ­µ™ Ÿªâyǹ(•ù�•Ô�(/€¸ÂZ`\H¦àMx«Ó’ÚH›+áXsš/¡á”1üÏ;\´ÅîçãîÇ#þ*pq|Ú¡âXðó +?Åq,02~-hqà%&ž óWÉ ¢d ‡éBJMJ®¡ ãu·ÿk5œ¾Þ«¡)>ÿ»c‘41O»ýOuÝ\š¡šúaœBÁ„Is(¦ûÚS?¸§t~ÄÃöá§ýÏíÔwÕ¥øˆÙ?^«g8çßÇ¿-¹ (Û0ÿúºǶ{¶Ñ¨É>ú Líx©j +ÕQ(�kS‡ê8/©ÐLu§v¼]ª·æTúz8X‡|’Ç3dEñ~j†«Mϔʖ æîź¿Þ“eßšì�¶÷ŸØØ²„{·e �ù é&!Sʼt€vâ†ÑØ�{~w:7î%LÈ%göðýØ~]BrÀ| éò¼JN€ÀÒ¥±ZhWW?´Ïí|MRìÛå–8ô^ÚSsZê;„ȺdÂþü–�J°üN]ä¿Þ*Èâz ÀiàØ6d9$á¾L "¨!ëµ õجTIc÷¿:‡ˆÄ—ë輪 +ššy2ÍðÁm0ûûBè5?àII¡ýf�X•aN‚Ï 0¼¤·0]�ºÁy)Œ\J�uÀAã™è¿üòx<ú¶I"ÜÓv�v,edœªîz0>$—Êà�_ª­'f©mˆ€ˆ¨<<£Ñd®æÚw—·ÒäÐ&è/jÅíeh—ˆéÁÕ9¨ô7æG÷®ËVCKìûóVÝšôÂa†�§¾¾_Mÿ&í?ß'h ¹¯«.2BæÒz©†·ŒõZ¸žx…Žº¼%¨*¼0�3­ÐæÕoi…qKŒªžîYÙæ©ë­ºï&(*Õ +Ôïë Å™žØ“}à™ý©ØRCeûÂñ;¨Nˆ03\˜®ØŸ2ÝukÊt™aO®cœ—Æœ»!£UÊ=ä×À¤k†ê2ö1LJ:˜>\úq¼€2}H‚3ð#ªk3�û¨=šš{²œÛúœdß󵩺1#› +×XY@åSZ¹v2yjbmu% +˜Ô$f‚'˜?[ +O•XpO±ï,IuÑKpK >Z8|¦>"LÜÃÏùÅÿ%ô »üåÞ ßH,ÈmúÇçŽs²`Î>€ÀÏ(Y øûû ƒÕ�EKNEÑæíüò5¹Ç’ÚàÈkWßå5jæà…Qs�quíÓS3@÷ÿþ±´—/àZx|ù�]mh~#C5N!>ƒýÂcs­:¸ÅláùÛ‡ÔT™¶öamª¥Žø)°³B0çY].ýk† ×ÃÊ“$ûô>í—ìñ�VÍkv„\áÈCÒsÃz`"©Œq7ŒìÇ»iÜÙˆ€�JÜ@5eë=ȧ}fUïçÂ×°X7ñòˆøüßÚæTͳ6 V…ïP)üäïšj¸ä•Kåø £ô©©§˜ì©-²‡I«_�SîÉu˜Îd°šFW~º×Sf°`ØÛYp13uø ª-6çö9M³½¼¦ß‚NŠMèü@~iÇöó%mWûÞížšç¡:U¾´CÌ{è¼ÿm·¢&ñ½gQ6dû �ÞÊ�æa;N+…?5‡þ)5á´TÊõ¹™^›&µa0Ÿ(óR1w@>h%FDù±ÍÜh™S¬ù>#·áa]qʃ*üvb!Hˆý(ãS^>_š-)ÇÓý’·B˜>uïäþ*ˆðWËd,ÞuØf< ²jã#³Ê©[C€ÃÝsß,÷úöHcß9·ÛFŸa¡YaôL´µ + P«x€Á‚Sz;F#GvÂìŠ+?'áÿÍîÂ%L žÙX±ŸºïX\Wˆ'1lâžhÞ9KXsøj²÷ùlóLëœá8İí”ãVyRØ�l²qpt¹! SóÚ« a~ålsê£`àà»t] P“{a¼Uu.«‘–w§ŒÆ’û}oi®).`\ ;‰§2VÞˆ�«T�cM욆`44�•“ÜU1¥;cì5¯M3ÅÈErc¦Ä‰Åý«�—Ûü¡ùro‡fÞó™‘%ãœñ<4ø�χ�MrÌKª-‘ý§,ô�~€Ýצ$H ‚K^}þ÷æë==ÜD@ZÚ”´9�¹`Ÿ�vâë(¿VS(¬Yþ)‡‚�¦|»05Þ>3 2¨ÅúSDz8]póî§1K ”Ìä·¦šî0&¾c«üÉ¢$Œ=…‘4Wp^µX˜fۃ·õÉa÷PèúɳÚd˜m2AËŸîÝ©2¼§šòPÀ4ðãß™ò$’0*ãQù4ô׬"½„OÍÿ ÈA�åRÖ³Ÿ‚'ñ+ÖPÝ`}´„Ñ`%ÞËþëÜÌÞ{3Åb~ÜÄN:›–ŸÀþ4¯fž`º¯Ï°ØÕÌ‹� ÇÞÞT2ÀGD•Ÿ�ÜÑ·¶ä ÊkdæA—ý–µrl’i!ãíR¥n7—O`Ù^Úºy0K Z-‚¶&ØU™;eìïCHä“ F$Œe'SÁã÷Ï4åXj@Þ`©Oaít4¦þîî19}¥ÁºGk¨l"2·~˜ªn +ÊI"åT®s�…�ù�çù �Ë„™f-�¡÷ÝY™ ØêÞ*Äxvsâ·1ãê=„A9<:KÛ$½§K£,‘ëÚn>g¿÷U¬^änCÛM¶KV– 积UfU#or®^R_[‹Š¬v®pŒ;>Ç™û¯CæM N[¬´KUñQ Ó¼¶nï�OmXs¼ Ó`(t ò§ý+¯Q±êf“HPûaLr‡öö.¿í’Éì1lB}7¥_G C.K*܈Øé!µ» v™^¯MôÂËЬ¦‹•2þ‚R¶Ú×ê1¿Ù A aðS‹VRBOçÔ�{rgwÑÒU„fÛŸ†ê5x~› ¦¸B_Ûà7ˆti»”†s‰p­×vj_šñ!3…^µó‰‚C§uñFH¼Óƒ~åà%ïCíéÈõŠŽ~L#¯ýÐÂÂS¥›ŒBÁ7„$Zßh<ÃO}}¿æÃž�\ø~{­æ‰ÉÕ~¬«®kNù¥hæç4tIo^Gl« +dq$߯©¹–¾Ø�hôêEÂ3—-ïØèãÕóIšSƒ— “fYòmÏS8§ÍT¯H +Ëà³rϲ Ôš2�½oVm|€“ÀFA“º^Çá;°8o¬ëqʃ$.±¹Ð¼K‚*Ÿ mÂRgÿ2ŒØ…ö×`�âPäe°Gº¿ ‚gºÃ×R›,¶„Ó“MY6XZ²”•všíýœ¬ß£]Uþ�‘fÖ$:$MxQù¶–É5¼f¢L—OªaáCƒU9‘ïì…„¢“ÐêÃWYdžmŸ·N~*NÏI7LKBÉtr6sÓv!O¹Ì¿ŒÃ%:ÓŽCí†Þm� œï�»/¶$Ó�šâZ;1aÈÅAn~4]cnIŸæ*™ºáÛÁzþ¿@·§Ðí5äṧ�1{H“"Tß›±5ó{h‘°" +.£¬Y+®}1¤aäBs%ß•Gà*w¼ÓÔ;Q¹rÏ}]+òeIS2™ÞŒ™ÃËíyÏj‚ŵ¹šñ¯ÑÉE¹ôŽ"R!ägTu�Òàk˃\U,£÷ÃÌg_–îΦ™Zï$Žþ^£…η¨* ¶iª·8~Z¡Ó5àþ%D“B£)ˆÑü3U…C ¨R j+íkßÌ·‘ŽaCÞ²xæ º÷¸¾K…¶)²ŒÍÈÅ<–MõaÁ–øTÛI`quñ©ÊteIr]þ’|wî+ü$+|—!>k\eû¥>/%U†�Ы—ŠJìu4ÀÅÝ*jëò¾aµÒ’㟘Ö�h-ò© +.Ÿ§·flNpŠU‰¹oLÁ ½·ùÆÊ­VQâzß”Hã¤"µ™Úÿ™'‹&™‡îÜ?Â$òoMÊ3Lc®7ª?L­Õ +ÖJ�BʽM¿3ò•k{²@›"¡¶6„i‚—µ½°à‹ÀÏ@û0±È|ŠX·¦–ð®J›z3]ngf×.¦k]EœóÕ�´w6ÍZ=ºmí{6WÓŸY…¢°X2G×r™ª2ùóÖt­u{¥”/¥IöTT…8¥ð€uß@K*Ÿ–p+¹Òæ)ößñ•£ÀŠæ�-Ÿþ›o °�§]šÿFšÓ.ÝlÎcóíØœ¾ÆIG‘mµ1œØm;¯¯gö¶qµå½•gŸ”'¹B;&´a2Z¢C®xÓlûÓ›Xú)B÷¹™­Ü—Âq5Ì’ +â7ÄÀ·ˆi5e�ìÖÍS8cYE³!l‰ÂÍfš‡‘ž| ’¾>�û½TQê‚§Ša ûbU^’T„Mlv§{Nz3ƯV¡J¤£±é§ë0Î!máÎ,í« ¢\¦C˜&’¢›Ì?[_HU*Ë’w²ïÚ|s!WîöVMœ~u*ù|KM&s:‹n]nûéöÅ+ø(ûârz¸(6Í4-tfž!å`þFÁºfÜá­"ÝÑW/f +çA–a´d×ȵ“ëbƒåså~ý2„Ž…H·¹i„W¯¢e¹ù5šmV’™Yž &Çv–ØÏ¦€’ZËÕ‹”X„5Ê i!“&ÂX�38¥”Blý uØ9_۸̒�ó~C‡ðÀ[a·é R»mõ¡H�ïðãšñ,“fþT²ÀõQ¦¦ä_ÕÝ�â‘:Ò–JûÜúç­w°ï»ÀÝ-°¬mwa¯ÄO*/Bõ©*5t¥ÆÊ6µe?K{JZ FVØ~w1¯Íñ}61ë¥Ð£Ø_øb.éÓ aYÁIxÏYÝ¿�Ãá0Ò<³²Š о›.†œ®žV ienÍr4ø_kjQ¼Cºú~ $êM~‰;ê� R°£Pº"{5ëò|•õ®å¡¬i•1Îñ¶Ÿ šK,£”ä¥Í8G +f�“ú·óͦ¢z׳²J­ +ÍÞ/°r‚ªòõó}šÍ%² ì¹ñ÷%.nÉÉ{bä¤âPodÛNÑÊ‹ÖË[>……:ï�¡Y\a_ØTž—ó¨_3gêÎä švBMYz6ßç9>š]÷”,)˜z…H3U'Íq¸Í>œJU¯ô®ˆÞ w‰ÃU€üºZÉ]ˆŸªBUÀ—5á~m»ÁªB-;ÇuŒ+OvÄA’à¯Iè)BpYû0flŒ‹ò"µÒƒ5Âç¤Z–8|„uÂþài3†YIaGÁÓp9h•¬^³€½Øw‰œ4i“Br±wDGí_yÄФäÚ>X„@Ž\X•x %~ìè¿$ŸÿøÛï¿ùå§OWà+~ÿ¼Â¶–X Ý›©'îk(JÕ¦¥l�)|¥¡ïRñ0¡åÙ'Y Vç"ÿTµÆêl¹‚ +Õ=<:þA'únØC ¿Ñ‚u ÅØþy±üu¼¸.lªØþ-új‘:äÒ!ê�öÒ"õuïO¦,G>¢~%œÚB­¯(QuXäG)ލ¶#عQ 7n7 Þ7Kw€³™Nc{ QËÎøˆx™Òp±Ëµã Ä_�Ý`+`š—Urnœþ”ÆÙUá»]HSÞz.·SØ ,‘Šz#Ó¥éº(!Á0¤ÓŒù­ -ò)wâ�O#TK)Œ2 Š<Ê’2—ÊýÞó%B Â#@Èð·Gõ|,¦ ô2²�8ã(QÐÍŸÄ'Ìæ|oú§ ïª2è�mIe‘t€í¼¨ÏôÄžºD¥uS›Ì=îœ5‚oÅç91KÚ(uÒ\¯´uY“-YáöŽ,oÍ=¾B& \òüºôëbS(AêPgtdæs²²%U!=½™)ìsV³òMP'UŽòåÁ¥Ê½GŸÞz´È×÷ƒ_V¨È†s"Ísù€Nt$D9Š|{Q®"æÜXÒ-;j]óLB˜Yó¯‹ÀLœ8鏿ûxX.�æËǯ†å†õèuGCB¨”¡çá„rÛÏ~:pŒÂ]çÒô˜G|oU®Ðjƒ(»Æ“}W‘Áê[+[À ÈeN@[;Å�i ¨¢S{'.rNÿøåy™¹.m¡™R &ÍÅ!Ëôž=Ïf´:ÿ?ßÕÒã¸�„ïù�œ ¥ˆ"EŠÇ`“]d{ÙÆ‹ °ev[‰-ye¹�þ÷[¤ÈâK3s˜10¢Äªúê{¹Ÿ£%µ$¦':±ÿaÌ_ùe— +dC“7|�/¿lÈ«DcÝ–�Yê�ÁÖ©K-ñî÷ÞÃõ_v]¡"»Yy¨"ÁðœÕj8¼jAa´«c{ÎÈö�ôû1ä>Fý€G z¥uïyÍ+0ÏÙù�TCibYTb(è3Ê2OãP*>÷D«0¾#lí ^ÇI¯¹"AæZOFíÊma¨ì%~©À^ÝϼAý< ìx<$0'FÁ̈nê:i¾Ý{ +$J®§OÛ½|&%�¬¬STà]Õ ó²•èšÁc.@ðç$?òºOô¦nkÁ1BÈ]މæÓñè†òŸeš Ë½¯ƒc¤dH¤`Î}MPôy\£ C=~0»þiéC¯)[’ŒH¨}¹eUB  ¼=— +¦i+¯ˆƒ=ÒÝ^M]‹sR]~Sê‰3æËo…©IÏ÷ÛÙé YNHŒ¹,ê³b5õW´ âšâÒ ¶sÌûÑ€ÐQd×Uç‹ÛB’ñ5íIe\Ô˜>¸ªGËE7ôW¬Ûão +·éÌËHÃzÂÊLuî£b0–elňGY$g¸Íeäž%îF‡J—'ô'ŸÀ˜“g®Eƒ)?tØzwèˆû½Ÿô£XBây&¬Ž�§,V"°·ã9o~ìÖlà„ÛçÛ»ÿ×{iH:ŽŠ8_r ÄJ¾ñ˜ð³UçE«ãgimÛ¦”®°¼ Búnr@ß›­…Jª�ÝÖô»O”k4Fù9Û8˜(ØàÊu¥~¯K¾ê¥ÝyØya°´´Kì‘›(³½éEOCþ +£_ˆ�w ñÅâöézš+ô„Gþdá}QדߠÍV8y“æe&:A6àÑS/ˆÛOùLsQ¤�ÅäÜÛ}Bέ_¼Iàs·µ/@Ýa‚Û¡´1�vMÈ0Z¶$ ˆÃ_¾å&ЖEøšõ>®†–˜°D7?—„£IyœÆáT8{¼/|¶]Î@Ê„�ßà+‹¬ÏW~Ë XÀ@=Yw›š£&´ºäÂc�0ã<¨^ð|‚ì·8÷&Huþ"?½_KãC$ àþã> kl)£¨[�q=™fLçý8ⶉD?î'•¼ÊÔK¡Ð¨^;Æ„¢/ � •!ÙuÌS `\EÑùGþœæG4âdÑK‡’Š AÆ_«<Æ ×JØ ª¢D¨îØn"f¥Š·–)Žx�‰tQÓ{u°-àà–�ÔIã.óê”:Ý�jÿ¾ë¢�›UžŠ²$�\¢±›�mÁN—6¤ºàÃôœ.jº¿©a½/!/meÉo7}y C’¡ 8$"CS´ë}��‚t +)o#B�DH �6þmÈ“h™Døk‘© +â!Ü0orp=xSÀ±ËêªÄKßyß�®áQÚaÖùÓo_ñí‚:ªb�§�‚•#âý²Ym)€@w†Z ”×Ïàu\Ñ×%ÊÝ``1DR‚º¯û&K>¹w‚n_ìE¯§9d[u‡zÇÝTÔ�¿â¸�Q|B�«½¨r…’vT«Ê¦ ª„ôbÉ}ǃ2¹9Ç46Z·‹l@°±ÿv­<ÆùžÕLšÎ»¯ªP�¿g)+‚IŒAãåz6ºr‰]÷n +¹ iÈ×Únd–«F£-»•Ü}ë^Â×óºÌêìVÜõ%ËE7� ú@Z† �€M/*V«Š^O!áâ+ÐØˆíäÑùWpEÅ5$vßúÅŠ4ÝÁº¹q(üAW÷AWŒ¤¦[6¾iëçUßž3@šp{ƒ¥wßu\‹BðÕƒZ–ÑåUk: VÙ7› ï°hëŽoDFþpùß}\ ’L«i†ì·PV {B¢ØâPëg}�;` œä}¹MJ4Ž»}™—<‡E‘övUƒ®KœÉÖ?±çŠPûÔñ8�•A«‘Á÷æ«¿Ÿ2aßÔpk>+Â;k6SÌØIšº$ýÐQd„¨EñŽ™vGcŸ§œßÀ2âÿ^Õ²æ�t#dž tËwf]Iî»Zx¨mZÖ·ÞCk™C 3;™³h­½éòùl¹1ØUð®4 ΚíuË$üúÄñ ¥îQçæªëKLnÝ«–R³U9f^ó6³Z#�¢k|Óþ«×bžAtw€¼tÄxQ’‡ã¬oÙ¼Á¶ž{¦yÝMK‡“ú(Ýj‹‚³Ç¯œb,ú¼­úâ Ð†øïåý»_Èïì `ýfÁÐÛ×÷Þé ó£“µàÆæ5R˜cºµŸãüá cÌ1Î šö<pkzðE§ |}ðHTx€8ŸØ[›HZžýç|_¦�yhÛoêËñœyáàõ%0Dzø?3©©=jj¦[Í6ÈÉ6}�Ø>×§¼¸þ¿æ_â·•Ÿ\¾mZ8–žfX4—ÛGý©§–t{íú»"?Ø„[wÌ/±ivV@ZÆ“wÙKˆ”á%­7�?.ʸyKs�®a5ë‹�»küòòÝÿäæ~úendstream +endobj +60 0 obj +<< /BaseFont /Times-Italic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +61 0 obj +<< /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +62 0 obj +<< /BaseFont /Times-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +63 0 obj +<< /BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +64 0 obj +<< /BaseFont /Times-BoldItalic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +65 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 568 /Subtype /Image /Width 8 /Length 394 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ 8ÿÄ0q3�2ÿÚ?ÓqÔƒH1ÔƒIÑŠ¤u&*‘Ôb«ª1UÕªêŒUuF*º£]QŠ®¨ÅWTb«ª1TŽ£Hê1TŽ£Hê1TŽ£Hê1TŽ¥ÅR:ŒU#¨ÅR:ŒU#¨ÇRtb©:1Ô�êNŒu'F:�c©:“£H1ÔƒH\u ÉTFJ¢2U’¨Œ•D¹jˆËTFZ¢2Õ–¨ŒÕE†j¢Ã-Qbæª,3Õê‹ õņzâø±|+‹ +âø°ð®,<+‹âÈ> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ XÿÄ8’SQ‘RÑBCÿÚ?Óo¼Õ¥ÄŸEïš´¸“éo|õY Ï=VD‚óÏU‘ »‘U‘!näTdH.äTdH.¤/ôdH.¤ÔdH.dÔlH[™5 ™5 ‰Kûn¨^ù|Ûªé|Ûªµœ“QÚÎI¨ìg$Ô»Ûšj7·4Ôonh7·4Ûšrf1)1)1 IˆÜ8…PŠ�\„Ü\q?ÿÙendstream +endobj +67 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 24 /Subtype /Image /Width 200 /Length 384 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ÈÿÄDQ‘Ñ’aq!1A2R�bÒÿÚ?ú–—’;‘ØÅEH***J–¡:¢ÔTTè:éÇr4TŒT6JŠŠ€Z‘w +•1^ÑR¦ZžŸÉûm(ENt¢±™Ïì?§æ×Šü< ßÚ~*=þæ7KÙu²Ye�yñ²Y^œŸ„²¼5Xò²q×ÁÜθ¶;ˆÛ°UØJ» )R½�±W¹™õôÏ$ÿ’óãéžI`N¦>*Ye€êaûe–çÅÛ•à9ñÛsÀë�·<Õ[neãNÛ™xÕŽâ©ï¹…=÷ÿÙendstream +endobj +68 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 7 /Subtype /Image /Width 208 /Length 525 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀÐ"ÿÄv  ‘ÑáR’¢SQ¡ÒBð1Aa±2‚âÓQ1ÿÚ ?Üb9Sç©ô©òb:Z%ï©•�)#¤ßDÅ7à[ÌÒq/BE/�o3Haø«+yšGð6Vó4€&tþ"Î&i.Ÿ¿Ù½8€iûý‹»ˆÉ;|ûÒN εy\ÖË©—öŸ–+'@‹$NV*‹$FV*€Y"2±T$ˆÊÅP‰$FV*�3O›µº°OžZÝù¯oŸZI«“8DÓè�©¼Å{îœ3„b½¿Œö"/Ý'ÄôDzöI|–çgˆán½a/³I‚ô1ËKìÒ˜GÿÙendstream +endobj +69 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 7 /Subtype /Image /Width 399 /Length 700 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ�"ÿÄt +“QRÒc£‘Ñ’âB1A¢#aÁ"SsTdÿÚ ?ÖØ”u":û†Ä£©×Ü" ö%|‘}ÅØÔub:ÛhlŠJ±m´]•KV%ãm!fSIñ¶†Ì¦’%ãm!gSÿ¥ãm ¡NÏì¼m "íJ‰bž¶Ùv¥L±O[l7ÚÕ2Å=m²íŠªÑO[l»jª´[ÖÛ+=¹WZ-ëm€! ¹WZ)ëm†{z±žh§­¶‹@¬­õ¶Ë¡VÖŠ{܈hU•¢ž÷D­­ó¸F®­ó¸º5uh—�À5uh‡Œ´4ŠêÑhd"¹žh޶Z=�Þ.` úYò½Ì kò½úÀ,Қσ/8O<óN¯–ÿªo0 N¯–ÿªo2éÕòßõMæ�è¬%¾ê™Ì¾’ÁŸ½Æg0Ma‹Æah,1xÌLÓXâñ»-Ž.XŽ.Yh¬qrÀ(¬qrÎõGù~°ŠÇ,QXâe€& à±ÄË2c^e€ ظb«ÇîSË9›‰¾îÙ¿rŸ�‡áù ÿÙendstream +endobj +70 0 obj +<< /BitsPerComponent 1 /DecodeParms << /Columns 2320 /K -1 >> /Filter /CCITTFaxDecode /Height 3117 /ImageMask true /Subtype /Image /Width 2320 /Length 90461 >> +stream +ÿËl¾d\Œ‚ó*ܵíg³qZŒ–ˆ#*a‚v`�B�©†Ö¼S)Ù/I<–;¨LŸ4ì&Jé M©¦ïߪ×;wïÝU=ëIv—^ê«JµÖ:Òã­WUÿëôuDTò4޹Œ�’�éÊŠ ¡ÈqŒâ‘fKB¼ô'©Üñ�óßDòhD<ÍšÙy,Ò>Ï™­—ÍuG³Ñ �dNENF‘¤|Ê àˆI› ˜ …‘œ™8sìÛÎÑÞƒŽa„¼ƒLã»9Úh8Ñ­¦š¨P¡i‚ª©‚4 ÈüÖõNÂ5°Fvn8í4ÓM0:¨FʨA:(zèÙTÒ ¥aè é7ÂmT"î ³…j¡àËšmV�JÉÐ ØPŽônôCÂ8ôTBN“IZÖ¡&Òt„l#ÛUGxA0µA-?Ai5éRÒ]i8JÒè%h¡Ò ŸI¹C¤ú +ÑCפPú[G“„ªµt�-¬$ž•==i:V®®ÇHãÐ]WÐT–Þ´—ZZ8ðŽôµÕ¥µ]-éU%¥Îûj•´©êG&´›KKA*ª KKKI×Ò jÒ¶�¯µŠZ +—_éiRJª®ê�¥ÒÒUÒ¤º•WKHTU--!ŒWKªIWëJ°´•wJ¨*†)j—b£Žªê’¥)c_T8ŠK]*ZT£ }+I +¿Ç©~ô¼u¤©,p’ÒªÒ­E$½¥Im¤…*ùd$±I*T©%½$µKK^’ªñ¦é.öÒÒâÒÿW¥^’Ëž‰/Z»áúJµõUT’R:#‰é%ÐA$’ª]kê·þ–«ªzT½a,kÒÂMßU­UWIkÒªÂQK„*^¿íé-SÕ$µIRU¥ªë„꺄m¥«Ö«×¥Jµð@‘çëÄ•~­ÿú¯ë¯×¥¶’©j¸„Ûzúý*¤¿Zù%iýG“ëT•7^¿þº^«IuÔšMzRÄ7ª§J«„PÿéiB(t’ /ê¨kuþ×J’Ò­*¬"‡IUà•/¯»k¬0‚úKø#Ž—]_ÿõô�ëÒWÿýMÿ®¯úU@Šz K¯wÒÐ „-V•%®aU%¤¥ÿKÍæ––aQµôõ¥Zѵ¥¤–ai)~�­-M¥JŒ+Ñ{¥y¢~º6”¥—ý«„SÒÒ­'3Izæ{fj—3ý%UKK(½õZÂZO].•V«øKIWmÜÍZFÞbu/øJêºKU¥ µÒÒÂ^¿iZXIBV—¥Ö“uWK ºU¨­*P–”j‚ªJ*ÂõIkJÂN¯ÚÅ$©7ø¨k„„¢�…M„–Ý&Òmb› Tpáé/î•* +:K‚†«ÓbÃlÕ´k`•¥p«Š‡L&ÕUBŽ*«b‚ &Å1Q +¬* ØJ˜h*m%Bªipªš:¨P´‚›IˆLS ÅBª@àšl*¦„Âj˜I£]„ &˜(MBj ¡1Xa +>TBÓ ªFÆ#MBG€ØAƒÄ&`˜ Õ #ÛÊÔ£qÝ>@æCS#A ØŠAþêÝwß_¼¦Tk{Öá6•¥´˜pƒ +a�‹Ö* κ³.°#ÿËXÈ@Ûëå’ -ƒy_l <ÿÿÿÿÿÿÿÿÿÿÿå° ™%çhŠVv+I¸YªB"> +v‚ª‘T¥k;ÊãJŽÃdÀ†Â)6xì–ˆôZM2¸S;ãûEñ}¿ÿÜ?óqú…¿ÿ[½t¿¦Šä/ñüì'ˆ�kë|’¢l±Šu�úü~±Õqÿ×þ>™Ø¾v§Y)ß%) ‚™ È™C"ž +CœgQ‘#>΄U‘’cα¡ÌöqfÌè3 ò„JÍ™6gS ¦}�H2ÈlȦ±�È�3B"ã•È<—e?’"(gR_6gBDC‘ÖižÉñ$€Ê!£xŠ#$#l0AŸ2`eFa‚EÚ"P¤Uæ #@j‚~ki„k Ó@ä'žß„F¶UÁ0ƒÐ¤pDagÂ3³�žJÄ0� #Xyó*#<'á¬ÄÏ3;0� Œþg5†^P™D\‘¬0�a„k Ú=†TaÜ �òt# üð@‹³ƒ¢¤p·}ë{wëoR8_÷CãqkÒm¯Ýãì=7»Â÷­¬Ž·–>U|?Õük¯]Ç{®ÇKK¯øNþ?»ÿ¾­×ݽ×{ﯯ_ùcôA¿×ÿôXät_ñÿõzQaËOöòÅ?ûýë½zWÿËÿßÿ÷Öª,8|¾ø­ª�¤<±ŸëÿïÆßÿÕ¾¿¨iÿôõÿ÷¿×µÿô¿Òÿúßþ¡°ö}‡þõKÿÿúÿûûl?¿Âÿÿûý¿ÿ×ÿõÕ/ø¿ÿÿþ¿mÿ 6þÃÿ×ÿÿÿÿÿðØoÿÂ0ÿÿÿÿ ÿþÏýÿ:Îܧþgß,ÿÿå +ÛK÷¯ÿÃa»oøoòn¿ÿÿÿÿÿ †ÿü _ÿá»üÿü ¿ÿÒõm/ ?Mÿýÿ…pÚ_²C…ÿö> ÿúúÿýÿýÿÿá°þ—é×Ûÿ¿ÿé{øAm×ú_·ÿÿúZ„÷×}áÃtûðßé;uwÿ÷þÿþ—aßÿ×ö×ïðïûÿ¥ýwÿ Šô»ï¿öÿÒÐCú0�~·wÞþÿ¤·¿ûÿý·_ÿ¹„ûéû}m�Wš'ÿÿ]×]þµooÿÿÿ_Òëm[³¯›^y>üò~µöïþöÿýëléÿ鯽~½Þß÷þßë÷]þ»V«ûÿûê·ú_«oÖ»ïëëû¶ÿíÛí½¥ÙŸ¥~ÝÚ[fkJÛ?}Ÿ¯úý³ÿö»ª·ú˜Ué^Ã>®ÿ¿lÿ¯ÞÈ<þÈ`%-µlú³ýÕÕõ¿m-/^Ïöƒ9~Ùë0¬÷kÛ ôÚ_Ú[a+«A&Úé§Û/mªl0ºJØI4˜a%ÙÚ]«š¦Á—-†‚¶!§"¸7jÐL6ØöÕvEÆ›�ªl6i¦­Ü$ÛA0`¬V–’ÚV*wV—"¸tÅ1Wé±LlRi¦›ÚAšv’ 1M¥i&A&šrWˆA0Ú ¨h$Ø„H1 4Ú´�M¤í:}´“dp“aUr�¥¶ Úi„ASa&¶�=¦šwa´ƒL0I‡§`•‘§a+ACa;†ƒ"¨ Âi°¨0“¿ bµ¸…l(¦G2³�…Y£‚a¦©62> ´,&“i¦úh ë ›A0ß‘b“iÐÕÅ(TU´›Â¢8"CI´ƒA + +ÓARt›Iåû ™h ó 6¸YS¤ØVÙ{-Ižaé‘Í+V÷JÒÒt�™uAi6í0±mR|[Pé6“x}˜é„Ï4�™ ´Èæ–“I6‰`gšM©â<쳆pÒµp³ý&·,!gÚV“hŒxU¥ÅµõA0�.«tŸzÒÒµöúê×QU¥é·Zµé×K]-]/ôµ’_}/}¥ñÿÇjñöéÒëîž×Ý¿N—Ž4·M¿Zé6‚iÒzýÚ]S_ÿÕi÷µ÷ÓÜWM/wzR.|T¸JÒÒ¾¿‹vë}Gñ‹·þÞžô¼}]Hæ½<„õú}w\¸Eÿt/Ã�{¿^õé{¡ÖíÓ®†¿o]hvé!«{Ö¯¨ðõ]zñậëïÖé_ý»÷«m5úµènÿô8}!Óô­»ÿ¸û¿�òÇ"×ýzåŽGEïjÿ-É ©dÿýxì5ükØ}K+ßú_ˬ?øÃÿå�þZÿ–91éK'ÿå“_ÿÿÿë�ýkâ¿o_ã¥ÿúé,:ÿ]aé-éþ¬?öì?ÿ¯ÿÿé _ô¿úýõõ¯m}ÿß_öõ_ÿý[×õÕ½w¿ÿaÿ°ÿaÿ«kþ¿›þÃëÿÿûm ÿ‚·_ýÿ·¯á¾¿ÿücÃø"Çà‹ëÂ;ëÿü7þü7þudw×ÿÿÿ éÿÿ¶—á?øF‹¥ß¶¿ÿú_á½ÿû@°nïð�zƒz[u¯ÿøðßáÿÐXm/ÿñÿaõÿþÿØ…ú_þ–Åÿ¯ÿÿáôŸÿïÒßÿJð–úú·ÿá¿ðÿ†ÿÐ\Œÿßÿøo¯_þÿ˜p¿ ú\'þ+¾ïÒb¿·êÿÿÝwwïKü?M±ÅþÛ¯ïûÿ¯>¯ûÿû¾•¿þß^�þ¿þ¸F©ßµ»ïý¾–Ý·ÚYÄ÷þ¹­zFk¦¿oÿÿ4ß÷Û­p¿ÿÿïÕî¿ö×¥ÿÿú×ûÛ¿§ý²£õo_ûÛÖû}¿[Öý%n¿ÿÛ:tëßþjû×õoöÿþÙ ×FjÝÛëïýûYG~ûkf{k¯ý™ÿÑŸf{t½íö¿Û>­[Óÿý{3G§Û׳÷Ýûiim׫ þÌÿÛ>¿ÿgïÒVÌÕÕÿgöÕnC× +]Z¯xA²àÏmß[vÚMÝ¥M——l%ij­„�+MpÃ7+a)wh&° °ND9È® —Pþ•5`Ì4ï 0•Ó`©È–é4ÕêDæ’r+†Û $ŸØ'§Û/i¶•ÖªÃm%d\¦¦ÒM[TîGªiªÃ6m±L„.›b˜íñH4ÃtŒ1A†�M4ÐlR 1P›†1A‘GL†Á;P¶ÂIÆÄ-®ÖÚaÄ&F:ƒ6Ój);¸a&ƒa$ápØ„ši†!ÕW –ôˆ‘-ÇjQdRaAHÈì­Qp¡B�•æÂ…%å&#%[ÒäY‘8É?G¼a×»ðøi‚Ã÷Vƒ.ýÿ§ÿã¿õYÜ×ÿ_Òß"~#®Eó Ÿøò½?ñ××Uÿëÿæ¿;×5"!š²·&Wx—E;ÊÁ¦BÏRÉtu21†§t,òÎŒŒDò¡ä±ˆ××$â.ΦK¢|—È™hGC5™ dDfŽ3ç‘‚”ï0A”f¤lˆcÉR6GRð@Áç ¢4ÍŒ;S2]“à�£À3ð `‹2F`ѬÐFƒ9?0áåÅÉè"ù>±Ið�0ü EìÀÁHì"$Á“æÇD&M� ÁÆHÂ#²)Ïdh<óXhöÐDv0�”By 2ˆ&˜A„�l¢N!“Ú5–xL#CÈši£CI‘xØÑòÁÉy²ši£aË6¨“­&Õ4ƒ¦šß#¸i aª¦©6¨4�SAjº§¦‘ê!é SM!4a&GÔáÚ44ÓøL#phØÒj©¦š¤ÚN�Ônil™Ða¡…T{çð‚a¡ÉãVZma¥áB ئÚZM$Ú»‡K +ˆ¶Õ ‚a È椰ˆ¶ÒÐg &ÙhL*I´ÈåÁ2ÎÈæ–ƒ8jè‹m&A‘Í–`3†ÒaË÷¥h3„y«~’O™µp“¤Ú"ÞË9´­'&ÂgóLñ«¥jêé6“ÒM¢1ùóoöÑ'P›][@�'øL&Òui+Wu…¥[i?Ip�'§]÷¤›¦ºÒuÒuMïMp›“´¯O¯M^7¯]¨¤épWá:é{u]7ºøâ¶–é6“_Ùi7Mmý6í¯ÿ¯ëãê/Oén.¾Ö–×§»z¾:[�nÞÓi[Žï�_~ün“ïÓ¯¿§õ–Ó»¾1÷ÿ†…Úã]Çw×k¯wiëKŽþÝýöÚú÷_Ðûê­ô¶«k½Õ¶½·_} ¯½ÿíFÿô4‡mÿ·XvµêÛûÉæ¿¿¦üüD=ø~þ¾ÚCÿï,r3ÞÕKÇø}ÿÿM÷Ë’?,�ÿ‡ÿòÜ�÷åÖ9u~¿úuoßÿÿý~Zpý‡þ¿ÿõú�}mú_ûzÿõ÷ÒáÿþÃ_ÿ¨×ÿúL6úÿûÿþ¿¯þ­ûØÿ÷Kÿþé¯ñ~¾Ãÿýÿÿý¿ÛKØx_ÿKÿ×ì6ÿÿãÿÿø/þÃô¶ü7ûuû¨/ÿÿ)ÿÿ‚0ÿ ÿÿÿÿøaÿ׆ð_ÿÿÿøl7ÿÿÿÿÿáÿê“¶– øoöÂ_øF�ßþÚº_ËwáøoÿÿÿïðÛKÃz4ÿÿ÷ö?ÿÿÿÿÿ¯þè-†‚ÃøØ…ûi ¿ÿý+úûôŸÃýÿûÿá¿Ø¯¥ÿû¿ÿü8oý¿ÿn¿öëÒÿð¼!·÷ýp¿Š_ÿßoŠuöý%÷ëÿ_¯ß÷þ½¥ÿ÷ÿ÷w»ý/ÿ_¯×ÒÿúT³RÒ®—ûþø¦¯öý8ŸWKúõë¿ÿÂ-?*º_ÿ»zÿ®óïïÿïúûþ«þ««yÏýmwÿÛÚÝ/ÿ¿«ÿ]¿^ÿ9ÿ¯ýëÿí»_õÛ:MßÝ÷__i~¿þ² 7ÿò²Ý~¿ÙŸ{Ý}þ¿ú½[¥u¹šÿ£ŸìƒÏÞÚÿlÍY¢n¿Òìý}«göýÒ_Sïm.ÒÛn¯´Ë¯þ Ø;=ÚM§uêÃm$ÞE=6 ôÛ dwÓkíÙy8†Ÿh+I´“l½¥·Z[ 4þêï»ûI†r‘í—»ll$é'§Ò¶ÒÒa¤Æ›kzwÛ¤�¤œ‹í%M†`´ÓAÜŽ-†+JE�„•4m¤�BtÓdGI¦Å1Ma´ÓbGÂzV‚l$œB°’ ´„¡± M6ÒÂh4Û†ž“ÂuOjÅ)†TîJb#0éŠdW„“ ¦›„b“”â­„¤Ó¦�ª¡6šØLBj˜¤óÃb¦w´ÕÌì5 +xsÄ0P„Y$ØG¼«mOig‹ÄðÚŠ°Ç*$T0ÂO�ìW44Ó™Ø]Š *¤aÓ Âb 0ìÓ„G« &ÙAes #T""!„"B!„d£'b !`„E"s›³xˆŒ»!‚`ŽÓâ"#¡ˆƒ""2l(Á„YK'W¬q®<}*__¯ÿé}+¤¿®ÚXHí.Ú †‚¯m*±A‘$h0ÈCb´e$†¦€Âerµ•qˆ�ÿËL äâº3$‡+ƒŠë ª²³ÉQH)Ü"¯ +VÙ%Â0ìì…U +v*ÉL ƒÂ#ÄÅ ï[IÓõ¿èÜB ÅßI®åhf±�ã¼pÈù|ŽÎwt•¯ïøü `�œ[U¤ÞÙPóº±ÜR;*C+�amz› ÌØ^Hßä·ÎÂb=:߯ê[‡�…õÒt›i-ŠÝןÿÕVºN~¶·\…­<“‰_”Œ‹Vˆù©’è…#Y�­å!’ñÙ!åkgCRL‰KÄc5’äC,�D•¦C"+3«L«2$Èèd¾iÌŒd"#”†eC fuÔë‘úyÈÔj8ãµ�‚"%§=’ Œy ¥Ã3f""tÙD#lð�‚A `„ BF3ƒ$f@É@óbž?ÏXFpɲ­šH0�ÌôByè\0�Á.Í$EÜ#@aà¢.gLÎA¢Ì8es= aÎ “9ÈD„[ƒ"𦂠 L5L#ÃBѸ5 ¤ 5OIÒmSIµnÒo&>E†“j¿¤òg ÑN“¡¥¤ì™Ã< ´0–Ë= Ú¤á'I°ˆðæ™Áœi6Þ¤½ð­¢8�ÿËUMqu,„EyŹx˜‚gk1•xDbfÙr[%2àÌl6[¥0ªW3µ;Ǫ£Ä(GxRS)�«uûÿõwI¯í{ÿÿ¤:ˆÃßëÚÿt¿ÿ™(ò ��ŒÿòcñÈšþºúþºþ¿ýs§¯�™¼ìÆE/Uôù\TȺ4�vSç3Q�Ñȧ"PYAã<‰Ñ.Ï™Ðf³„ò*¹³3Ê!‘NGY:�…qP~# ¨-Íg|%Ç9Ó‘¼œLÄo9˜Éóc7!2l³AJ3 øÎ‚y>cz*3dpŽ‚“ˆL ‰&‚¢dSI‘t* 0FAdYÎ 3ÄC ޤK 0jt2 � •é› Œ8dŒ¹ŸÁ EÞ¡Î 0�„k Ò.a!Ðäü”Ï„Â63L'£[ÂlŸ’ê4� Ò68¤g * Ž3ÆÄgŒô�ôl{Nrðž� S¸"ùû#áHØö ù¨M±£å �!:45F°Â¦°0� ÃÁ2™Á4Â40�—‚5†fÂ4 Ê4BLÖba£À}B a¡i¦� %º¦“„-&д´ƒ ƒné£ÅÚL4ÑáÉ�<Žw“l ¬ Î6š'Bši’àš +–“xi„Éú %“9½&ÂM¡´ÒL;wAœ4{¤ÚºMÉ�é6ËBÙ:CI´�&ôkjˆí£ÛI°�b’oK†l•“Ba„Â;°“}å&Â#§‰ÒoAœ4žKšM¢OIÒmmÝE‡ij-¿Á6îëý7×¢Ozw¥KJÿW„ú\“¤šWzIýé»JÒ›u×Òv»Dž•¥„žðµ_„“t“pœ+I7ˆm +ÒnšÝºøMý6½4–“¤×û­ï¨áþ’i-­ôžƒ +÷½Ò×Þ·Këסý?[ÿ§Uöúzô½&èW^½·¦›­-SÛõozþë´/Zêí¥»qn+÷Cî×ý÷ý u[‹Öôëäp¾­ûûõ¿¡ÝS»ñÚúõÿ®ñÖ£^××¶†—¶ýo×Úé·ß…û׺õ®¿úïÞÿ¨ûº�êÞ¿¢ KuÝãÿ €U_ÿÑ@ëëÛtA+¥ï¾?È WwÕ¿úÿãþ?ËO^›ÿùiþÃïïÿ¥ïîºå§êÞ¿ÿú&/¯ÿùuƒVõÿëå“ÿÿüµŸÿÿÿÿ×Û__×Kÿÿ‡¿é/¶«ºV«Ký×uÿ…þ›_ÿý¿ýu×õÿýt•ÿ×þÿëúïÿÿÿþþ¿Ð#ýÑÝÿû­¢ž¿ø]ºúßÿðßþÃðŠÿ…ÿÿoýÿý}ÿþ±ÿ‚3ÿÿÿ÷ÿÿà�Õ-Û«ô¯ÿ§[ÿð�ÒÝÿðßþ—„¿ü#Çÿò}Ý,ª/ÿüŸÿÿÐ/ð‚¿ÿûÿÿÃý¥ûz ý]+ûýµ½ÒÿÐ_a+¿_ÿÃú  ÿð—ÿú[°¯ÿþ‚ÿëþþ’ÿý¿ÿïðý~á/â‚^Å{ŽýñOQÿëø¼Wÿý‡n»Â^¾ßÚ_ÿá.¥ÿÿ„¿ÿÿþ©z·ßÓÿÿï¯÷þÖ½1Pÿþ_ú^‚¶ž¿ÿ}w×Òý/K¿ÿð‹Õ¯¯ÿ¯ýºÿKúþ½ýoÿoóEÿî¿ëý?{{½úëö¿þÙÓßïýWoVÿýtº^½´¾¿î¿ê¾ªº···MßÿýúW÷¯¾»¿·¶hºßÿµäÛ½m¯öf›JÒÛ]î¶Íwÿ­¶¾½¿úÿº_ïú¿¦Ïýí¤ÙšµõaŸõ³ £•Õ®m0ÏXOZ´ kko°–í}—µõØl3Ý6½Þ»kÓu·Ø@ìÇ`š¶’v–¿½TgóÕý}¥÷õÛJÕ=‘G´˜l; 0ÂVÁ‚ Òa‚²všvÅ*lv•ØA2vÆÅHᦟ`Ò ÚÓc W[I± +ï†lÐm±[h+cTÓ U¨l$ƒc‘Âb™(h6ÒL2ƒ0A�üÓTÓXa†,6*Øl; '"{In¦˜l$�ÚpNƒ°•5i1A0ÈÜ ÉŽ˜„ÂôÓ $í¦+•˜*„M:vÓ´�m+#‹ +Ö›XL+T¶M1A6Jéݰ˜¦)YXN§°ØI6©¦‚vš}µÛ ¦¥@4“a6‚M:pƒ•ÈÑ�† ‘¡¢±šH®+!…*Ü"941#V(§`ÁÊȃ(!„Cì]!;2ÄQKÙÏ;üŒGeðÁ B"#);%DEñ",AJÈ0ƒŠtŠÐ`‡dÄÐu@ÌÐ*[%%cŸˆŒDGÿå ÔÈ´W–‚¨È®;Šê#"ü®2Â0ì)ZFF¢›aNè�D�áy‘‚) (XUA>ƒ‹tôF°Â5½4œ#X3Xz*±Ò å¾­?7Ë;Šr3Dù«/�ò?¸Gæ“i6ý4�n²2qßßKw 9ý=]CÝE+W +´÷ÎÌ"´’#kßEóEójl/3Y<’„9C««ã¤Üãr¨Èmù^žv7êºõøA í%±Në®¶·¯¥øÿ]W\qÒtŸ­¯OZ§§õÿúå[#Y)òašŒƒÓ:©4×9ˆ‚3ìêgS5œgQ¤); b© e³2¼Û>d1Iu e5™NgQ� &i-­“šfÚ�2"2|‰2#úÿ„BtÙ ‚H.dèx„BÐ"!&4ÁD"€Ñ„È@Â.$ó<&aÁ‚0ìÞ­øA„]´’ñÑnÑ 3ÃH&v±$aŒì"à3EÛG¶p,vi„Éà˜EÃÙhˆ@%þ²’ ‘ÈN<ó@e `�„Žf�@î¡ÙqŸáùÍ‘ÐÈï6_ £cF†�omµoFÆ“OFæ…áƒü"Ý › +…¢­¤êpi0ø3f‚aÿè²gM¦š¡£Ý'I�à : °�6š3µG†‚ 4´¹!%þ–…¬˜ôÕ Úvš:¦Ú¢˜‡ ¯!%4 ¼'dÎGm&Òp�vYî—¤ÚM„Ãe¡6‰ûe¤¶Ë,íÒmQ? ´�(A+á6–«ú»K¦xÕàÛIÒ„—ºNºm¦ÚZN“´ë <¿a\UÒmOã iž8p¡ËöõáQépÎ;PV•®—úúN“tî·¾“oö·û¯½~ýÕ�^ýzûö¢¯]>ëikººÝ{ºW»×NÅCÛÖ„žuZéÿ¯ZVÚý_Òþž=ß­-HáCUþô¶·wzÒÐú·vž5ëÂ}úû¿Š¶ík¾ä¸”ÿïOOþ¸ëQþ¾†½ô?öÿÕúáýÿ¬Xj?úÖ>‹€Ýþ¾ýªÿvÁ¾ÛKÝ­Gè˜äczü}WþZ{ëÿËþ?¤>豿ü?ÿÿåŠ_üº¿‹ýëîþ¯ÿöÿÿÿC¯ÿíÿûïÿÿ­ÿÿþÃ×Ïú·ðÕÿ\7ÿÿÿ¯£ón¿ô¿þ¿ëÿÿ¯ÿÿþéÿûzø_õÒÃ_ÿÿë¯ÿÿõð­ÙáSÃó1ÿþïÿaÿÿþ¿ÿÿ“Ûuÿ»þÁ?ÿòvGmÖgÿþIÞú¿ÿÿþÏôƒoÿWÿÿÿÂ_øAÿûÿÿÿ¤í¥÷†ô ñûÐNÚXoAÿ¤ÿÿÿÿþ‚þ½¯mkëÿÿéwú_õÿþ¿ÿú\Bÿ·Ãá/ÿÒàì=„¿ÿÒ÷ÿÿÿ¯Òý^‡úïÿÚ_ú_m¯÷ÿÿßú\úÿÿ÷×ÿ­-[ºÿ÷z_½=_ÿ¶¿¯ÿûÿÿþ»¯ÿÿûuÿÿê¿Ûl‡¶Cÿ$÷ÿÿÕU²6»¯ßßUÖûWúëÿÒÿ¥ëÿÛÿíÿßûn—íþëþßúýÿ¶­¯ý^¿ÿýÞÞ¿íßý:OWëûuþ¾ßZÿÿûöÏÚ·þ»f}×Ûf~·uß¶ÿ´ä1ÌþzíXgöéºþ××þûNCÏ÷Wkë¶o´ïom[ô–÷KûýÒ9¥tÿûÌiH£†Ã96^lÅqa«iiÈœK·/¶’l‹�XauNàË“lR¦¶Å6­ªªÚR%ƒ.Všv©Á—&Ø­ Ã0äWNÓa„˜‡"äQ$é<&NÒµNÒUäQÃÓ´­-*[ïažõ±A˜b©ÃÄ.Jé±6’i´Å&›H&Òi± 4ÓM¦› 8M4ÃAƒ F:M4Ø4˜Pœ&ž4Úi¶Ä(, ÓM6(2(á0NÕ1L5b­š 0ÚI Ó‚pša´´�a'@ 5MŠM=vÂa4L&¡4Ò+a)Üña v�  Éœ¬a…+¬` z>2u+Š=!‚©ù�tV0`ƒ‚:høÑñƒƒ�匪â(ô“Á `„esEt�"DB" L& zG)Xç·*Øb¥c4¥[hžÙ¤…„¬IlaŠ3Óà ;–`¶å�“W3h!Êê†#“e€Ý]vDØ”.ºð±¯] .Ò´¾é6•‚VC²%¦Àµ–aQƒuGÆ4ÇÿËH·2̋ګ•ËÅV;RŽÏšÆJXŽÐÂ…A–Wgj‡ +ªvj•JTbP¡"^•BÒªvþ.½ë�ÚõŽëØí(ý×íÇÈ'¸ËŒÿ«®[ûÿ,r-_‡øü?E¹)�ç«~ã½ÄË‹ë÷tCÞ·z,r;¿ü±þ>ßZJßO¯õþ¶ËðkõÇ¢uƒaÿ�êþÃÿáÿðÿiÿÿº,gQÿùu‡[¥ˆÿê?ý¯,ÿËOÿ®¼5ÿoo]†Ãé¶þ¿®Ãµ_×ÿר®Ãÿëýúþ¿aÿÿýi/½u_ÿÿ×ðÚúì?ý¶ý†ßþÿûnŽî¿ÿü/·ø.ÿÿÜÿÿõÃ~ÝþÞ·ë¯ÿÿžæl½ølcü�O†ÿðØ7á°oÿÿðÝúÿÿøG�ƒ£? ÿÿøF�ÿÿ†ÿ_ÿÝ"v]Ó·]ÿÿÿø_á´ ô¼ÿÃ}‡ÿÿÞé÷ÿá/ćþûÿKÿÿÿÃÿÿmÂ…þ¿ÿû_ }áÂ_aíémîÿÿí׿¶—ÿÿ¥ûþ—·÷ÿê—ÕûÿïaïmÿüŒ…^ßÿÿþ;×ßuÿ÷oôŸÛwþÿÕ÷b¢¿n¿í×ß÷úý}_îÿÿê;ÿݯ­ïÿ÷ýú^ó‹¥Û_=ýo›Ü¾þuóû¿yϧÿÿÛÿ9ÿþvY×·{kõK÷ûÿí�Sº¿ÿÚU}}·_ÿ¾õ÷ï_ÿéµî´ºÛ4_ÿæ�ý¤ßçÿ·ÿæ‹_êÿ_þÌÓfžõé_¤Ù¢öÍ;íZº¦ÿöÓUµ}½Ûþßiö½_m™öºtõ¶·V»kuuû uÛ¦Öéµ~Ã=Zë°ÖÂî¿°ƒÌW^Ú¶¶Ò]pŠ}Õ¥í¤ßwjÃ=¶­«¶¿¾ÏìƒãúîÏí¤¿¶f½l0YpÓa‚ÚL6±VjêÚ[h+VÒØ­-%M6!H¸ÕÒc´ºûMŠím6*G ÚLŽÚr8± +Ҵئ)‘K´“´6cM6)ƒq섪lU¤è-†UÕ6Á&6¥R/0¯Všì0º}‘°šL28°iSH0ÂwA°ÂM„‚ 6“´Å1¦ži4ÃÈâÅnÐL&˜aÂi§a„ÓA;c«Új˜Á4à ‚a6’Èå]‘ÐH0I¦Ðb6&˜aD ÃJ˜¤M0Ånövƒƒ $M›š§°…ØhCJ°`„ec! ‰b BB  +UqU„" ça£"lÈÍ�‚ã +Œ)�‚”`®š�3ÜDDZ Á’‰ÎWI…+3Û +z6¢°ASA„‚š4Iô{a‚EcF‡<9f�ˆˆã�¬2¹"IÄGB""�ˆˆÿÄ+¨Ž¿¯¯úIRþ뎻iTí6C©a0ša…RÚ JÚÙLÑAÿù]FYÌ#»Ë9ŽìÖ+”2lV`§he�ñؤ3²LÛ;¬¡ ©ŒíNòªÔ®QÆv’ PR (G‰ØØ7 +ßï}ýmÕU­Ò~ïÓÿïûã7íÔes§öª¶žšªv�$ÿ¿Ër»%ürÜSÇÿ¥¯ý¯¯ã�UÊO:dfkÎÀ™Õ�3\S¬ï³Qš³µDFå:™Ö.ާ©©ä›"椃"Ù›Sª#åY�FU_è‰ÓdC„'� d4l�FlˆhÁ„ gÄ"Á<�æñ2>D™xˆ‹ÆlÑ“Ðdùƒ Ÿ04D al#=Q 3@y�’ Be a0És.!à Y²D'ˆa$fA•ØÁ)%ódKç3df'"LˆAV\ʲXFQÎÐf¶f*"LŒA¨F.FAÂ~Xg²cDˆ$ºÇ Ñ±£u64| 4Âj +¨ØÑò�Ð�Á¤#‘„ÂhöѰ��Á‘�ÂL�a¤Úª5µOFÆ�0ÒI‡„çæDH-ªi6¨29f¹B —´l£cTÎAd~o„ѯ¦(¢©¨ÖÓM4ÓðƒØ¤¨ÖíÁ”i„]†¬0‹€Ê0˜AªesÖ4“9Òm'&ÂVl ÍŠlÂ"@hi6®ºV–"<#ÆÒi+Uzwt´Òѹ4&Ò´¶Zyó +ØT�'3†�l!NÂTæ–téÂTœ*"Ý+Â"@j„“{,áÂDXhöø3�&ÂMÉ� ´›AÂ� hZM žÔiZ_¤êÜ&Á:%­G´Ÿ¨]kIi(«^®“« �Ò´´ŸI½º½t®�+“´úÕúërPº¥‚´¾ µé+ß¹(ÂmøM¥rp»t›D¢•„´›’ÀÞ_´Ié6¯ýWÕ:zmßvÜUuô·iÝ÷Òþ·ݽ~×Õ½µW§UkVñé÷üiºWkÝÝ´—ô›i„×ÿûKt¶í}5Ý;{ÓKxÿ�t5úÚv£»C_þèo}mVׯ‡_^èzñï[¶®Öý®ïîú^Óí¥¯ŽÓû©+ŠMâ¤pª*Ûµí¸Ç~´C—\±ÉS÷¢�Ã�´ïøÿ,rA0ÿÅq_¤Lr‡.…ŽJŸÿ–ä�ëDÇ$~¿ÿü:ûñþÝŠD:>ßÿüŒøZízU×ï­ÿ–câ«ÿ¿-8l4]kÿ_HvÿÿЊCú·øëÐþßiì5¿ÿÿ}åŒõÿþ�èšé¿ýòëÿëÿ¿û ‡ÿúÿ°Û¯]ÿÿoÿóƒýÿý‡ÿi~ýÿÿÿþ½ÿÛÿý‡ïÿÿÿöÃÿ‚,vÚ^uðF�Yýÿÿÿûëÿ_øoýëð¿ÿÿÿÿÿÿÿïì3ÿÿÿÿðl»ÿ¶•Øm´„è/þÿÿÿümðßûi~�ûÿßÿÿÿÿÿü7úÿÿÿûÿÿÕD‡ˆ^—¥ÿýu½ö¿__øöF ÿOÿÿÿïþÿÿü8ÿ»Û¶ë×ýÝÿü/6�Ã*¾—¥ÿ¿í®·þûkÃÿݺù«úÿèñ¿¿ÿûÿ_ô¿ëÃ÷÷×ý-³ªw»ÿë 7œNj~«¯ûÝÿÿ¾ßþÿûëá/Òþ´›Òÿýö÷÷¶ÿõí÷íÞÝ·_ÿ®cíÿõ_ÿÿÿûm¿zé¾ÿÞ¿ÿ4÷¯Ký}~ïÛÿÿ¿í.Ûëþ¼ëÿÛ3ÛìÍ6ëý¥¶g·^æ›wÿiÈc™šî¤oÖõý³>ÏÍý®“fz¶­™ë¶–×ÿí¯²?ßÝi6Ùš÷¥ÿööÍ=ël�n¿ë·×½´›M°¬3�¥ß¤› %iZL0”0M?N ¹6à +¶“ ²õȃ†± >Èó $ØI°M‘y¥i0Á-†a…´í/M?l½i6•­ÿÓÒUÛUM´¾ÔûþÏ[a+mnÂG º¿ÒÛ?}‘å6)�Šc  “M;A&ÅZV“Ò¦šl'mŠNÒmˆ[ A²wL&Å1LBdWTAZLR ‘± 4Ãi ôÓM8…tÚ 4Û ¦œ•ÓÂI…A±I¦ÚH4Ó¼ Ó †!&ÅÛA&­�I´•5ÐVÅZV�a6%aa4{hñžR40Âb˜„&˜D$i£áPVZiŒ0нŠG¥¨(A¤gÓH¬£[a0ša0ƒ‰�C�ÂÁ#<Ÿ BF½.UÑ᢭´È¤Ä)á£;žoGˆM¦¸…iì$ì1W¨MÓ[i6lRla¦ÂI­êa0ÐR¹…*BæÙ�¡")9ÚDWB+”â""‘؃ˆ‹)`ÆÈ§BCR²#—11QD.®#ˆ«Ž#ˆŽ"?¥é/¯õÒékûKJ®´¿¤ÚE—Cm.ºlS²7I�Aƒ* A ú4DDgˆAÄDQÛ¥�ÿ–™š(RÜùØHÉV-ÖYÝ �¢3bÓ +¡LÍÖ +á5 +v)H8ìÊȈ)œ᣼ìœeV)_òÞ’¿íl ¿Ui'a§öd‡„hýýô½üTC{¿õ_úzKý%oÿÔesã•©n#Š­¬‰¬z;'†ù6[Z×Uõ]u×õÎËõõý$ôýU¿]xR�‰¦C žq�FLÈÁ•há�Ç‘Dl�Љ:¤4lŽ‚¢"‚(g²z‘AÌ"¢ÈžE¨º ¬'BŒídRda(FÈèY&�3 É# ù’3fFdäC ÈC Ùdhˆ&¦£:2%eWS¤¹ çA‡œ=“!A��F¶¬<™í1ž”&¡ä$¡0ƒÐ5‘xØè(MaÚ„FÌYF¨Ý3µF¶i&­¨O´{gà�a”i„gaBap��EÛÐF§ £ „Õ2ˆ Â.öÂ0ìÑ FDaÁšEÌ"à2­aD$ˀ ‘˜0@‹¼¨Œ e†ˆžB("ˆ\Š‚¬—šÎº¬œU#Í'Ù4›-hi0Òm R R„ÑVÒoPˆ±GºZN“jˆ°ÂL6MZ 0ˆ±I‡%a«&­k'Bs ´4› ¢­ÉëIÕ&Â"ÃIÑ Òzl$! „-l! PéÂaTÂAÕ4i¦ž‚l"ì�ª“z Ñ¡¡§>Q±ª3°©±GŽâ%¥í$ßn“¤Ú#iqm}a0ÛKXI] N­´“Âm.…i'W¥´IÒMâÛêÒ¤Ü'KA:N–´­&ä°6ä¹¢OJÒë -¢ )XÁ‚a! ¬•6DԣȒ•™F%EñqÂÂaÑØ²”(QRbÕ"¥’�RpB !­† �|÷EqX‘\à X1GD„�lÓhša#áP{sÅ„ÂG�M⪶˜„Å&îšµ,�Îd2{&æ±7&ËpDDDeØ!aDeêþÚXWÄDWë†Ð_õÒé†Ö¿ ›&Òôµ¶•¤…¶–”2IÛ , `‚a‘7ÁÔF|cñÿ–¢¤V¹_ÑôMŠYØŒâ + +MÂ"lž#íbÆM”fõ´Êþüím�§¤Øf\*cÔì*°’KïPÿ Ȇ·­Ýý÷“Ÿt‡ý-¥­·hÊ×µNþ¯¿;Y×_Å|›_ˆþ?U¸zT¾¾¹¾VÑRΆ™ Í#\K¦ÛÉj2ƒ¥"ÙЉ|“G2&D3(2LÈ<•"K•SžN̆ѩ•FRåÌ€—ÿÉó ͈‘›"LðO�„h ‚Ç€h Ds'Â#â/Wð�„ Í^$„FÜA’0@ÍŠ¡Px'ì Âg„#Âx‚h‰ÓdaÐ ì“6Gˆ£(0ƒ!3 ‘‚Œg˜ h„™åY.$:FÑ>xBtpÈÒ6D¸¤�Js>dŒÙ‘™ É4 d1ù ȾiK9©®%?Õ4lp›BôÕÚ ½ ¤P˜zѹ£d%‡¡Aѹ¡i¦šj�Á£õª¹¨M0˜&�ÁøMšN“�•É„Âj-„]‘ñ§L"ìŒ3ã�FÎ��4Â{ãFÆ¡2ž +F°høÊ4MB ž „l #[ÖÂ.Ú6Q Ƴx'Ç€a&6!BLÖ#6@ˆ”ðˆ¶Òp“ ë,ìŽijì²’XG�-æŸIº}é¤�&DxæÚdsJÕµp©0ÐgšgpÒ¶YÃ<Òa„�' +ˆìÃKI¥‹m'IÃM$Û- °ƒ63‡™¦šI°ˆ¶ÂH‹ ' 0Â"ÅÚ#†©¤ÚN“ ˜aÉ=&j…£;WˆiºM¨A£[ü'KÞ¯§WÅé§W…oZV¢¢ôºõ[6“¥õޝW´ëõ¯O�M:õ¬'J�õ¥pš}^’áZ N“«pL;„Ú†’¿Ý-]¡I°®‰ðm¤òù…e�0Ðgš_ÚÒ­ßÆ¿zëÞÿnûèi¶�ÝÜtÔmê÷iô‹„éºm{vŸ­]ÚþÞ”uÝøýS§}´žŸ§§Úõëöö· ý}ZÿwUo÷®¿[[¥¯vé*ïõn…C½mÿ}^»ýëÿ}îÖøú}º�÷ j+nþÛŠ¡¯¥´.֗ߤÞõÿÿþ…aÿ�ÿÓpàý*oýùu‡ßÿQþ›^þ?»ÿ 釢c’?å÷TCžÿõÿ¿Ã†µêÛÿ^ï­µ×ÿKÿøëíÖ» †ÝkÿúPØz_ÿ_¯ì?ÿÿÕ‡¬Cþÿ-?ý%oÿÑiÃaË«ÿþ?¿�ÿÿýCÿëû ½ÿü6Ãÿÿÿÿaýk¥¯ì;¦ÿýÛKÿÿÿoáÃÿÿõßëÿÿÿø#aÿ“ß¶—á°Ûuÿÿí¶ÿÿÿÿ†ÿÁ{uûtÛ¨oÿÇÿÿÿÿà 0ÿ÷ÿ_ÿõÿÿý„ƒÿ¤ÿÿ†Á½ÿûÁÿÿÿÿÃá¶—í¤ øoÿÛ¯ÿÿÿðáÿÿü‡ÿÿ‚0ÿýÿúXoý/úß«oÿü8ooÿïöÿþ‚Ùbvè?ÿëÿÿÿý†ÃÿþOÿþ_ýÿý%ô¿aö“ì?¯ÿvßÿÿÿ¯õÑ“ýpO ¾ÿâ¯ÿ¶ëþ¼8{ÿ_ô¿ûý/ÿn—úÿþ¿þq9„ûn¿õÙ×ßt¿öÿÖó{ÿ®¿¤T'wßü¡5ÿï¯úîïßÿú__þ—ÿnÿÿ9×úþût½ïÝ®ßF:ïÿïöé¿ÿý/Õz'ë¿õÛÿíÿúìéæÛûuÿ®¾ézÿû4M¥ÿ­öikþëiu°Ý´»?~ªéퟯÝ[ÛIÕ�yþCºÿlÏüÏÕÛ3_ûv—úí·ßߺÿ¯ýßÿí5 ‚OK².dW#VG¯NäAÃO­´›«J›0m¤žŸJÃJÒº¶Ò[Õ6Òs +Õ´¬º½4äAÃm=6í'ºl¼ÃKµM>­u¿ažÛ¯ô»>ºé†}7ö—ùúÓ´½ÒýxM4ØAZtƒa0˜a&+M5`�4Ý6ÐQPi8b˜h$Ó¸aƒ Ba¤Ã &ÃA&©ÚlB`Õ6ÐA‘]ZI¦šp]¦ƒ¶íjÂQ ŠMo�b“µM6)´•4í$Øí+I�‹Vé=>äAÞ‚ì¾Ý'È£†�ï*Øa×£Ûa"»M1 „è¬r¯*ÛMè¬tV0Éè�Š Á1Õ£Û4⬆˜„tƒu‘¡£C4� aQ«ë„œhDG+Šg`ˆ·0õZOëãIWÒëýut–”²™ÚÉÝ¥a º_PÈ£¦I,uH0Ä ÄqíˆÐN"#ÿù\ÄO«‹qFY-ÎDÜ¥B… •Æó²X)ÚÎ&v—‘¨�Dÿ§éÏmr�Š )… w·ÔmÕß}ú­Ò¯I·÷ùÙe¦eþM‘Ž94Eao# _¿ÿU×ÕG;½eñòT¾¾S뮪ºÒWúÊè”:*M¤é7g Ãw“&öÚ@ÜŽ¦k&=&ÐMëõmúöÕ=ñTðÂÒmô�¦žºþºzúmÚõ'iºj½ûQÞšÛ_×K]/¯íÒztºû’…ë¾’%­]xM¤îï_At˜pM½P¤Ú½/ëÛ^¸þãhuô¾‡_t5·iÚz#…íÖýÅ/Õ»õôï^Ú·¯©v­ûMúº­ +¦—îâ«c^Úß[kéz^÷[Æ?«wÿ¢_ÃD=ß­¼wºþXà’¯÷·Žõµãï]ú^ÿ�ÿãèFè/zý ÐÿÞ£º÷¦ÿ"Bþ‚}[ïKŽÿûÝ,Ö3íé.ëúC«ï¢Ó†Áûþ»ÿÿÿ,i7ü²àþÇùnI&[‘úÿtCÑ�ëþ½_¯{õºÿÚ¯ÿ°ÿ_ÿ¯ÿÿÿ†Ã×ým¿ÿÿÒI}}ýÿÇÇÿå§÷ýá¿Â öût¹u‡ÿÝßÿá¿ýºqûkÿÿÿá†ßÿÿì?ÿVÿõÿõm/ÿÿa®ûÿü_¯¿ûW=ÿþ—ÿ†ÿýB_×ÿÿÿ†ÃþtŸü7ÿÿ“Îé_àŒÿoó6G}ÿûaWþ·zÿýºö'ÿm/ÿðßþÞ‚}×ûÿÿì8ÿKÿÿÿ¥¶‚ÿ/ïôÚ_ÿþÑÿï“ÿþ¾¥ÿûiø{öë—Åí×øpûé¤ÿÿKˆ[~—è§ý ¶FÿþKý{ÿ«ÿöÿ_Þ˜¨¯ïÿõ‡ÿûÞ½}nïé~¿·¿ßÿ¥£kÒÒûI¿UÑz>ïÿ·KëúÿÛ÷§ñðÞ—íiÿ9»~ûªím¿þ½�Vcÿÿÿ¯ïÿ×Jÿÿ[ýt¿ÿ5'_Wÿ§­þ×Jo_ÞŸþízþÒ¯ÿÛ4WiÖÝÿ·_ëÕÿÿÓmºõÛI¿¯I½»ï½µÿí/Ö×oÿßÍKØRëív¬Â]³ûö“ ÷¶Ý=‚{þÚ¶zím.Ï÷W[¥þ¹µ·WMÛfzúë« þÏΗ}¶g¤÷¥« þÌþÌöý}³4Ýj©=Z}=wíÒÕ[kV‚]´«ŽÕŠbÛV)9Ú\ŽtȹMŠ Si&·¤›¥¤­¤šÜrcM´´£`ÂÚ§kr+†Ü0IµN ‡"pa%¼½iH®vÛ 7·éÚÚØGtÚßi6»~éZ^Ùš¿Nh0Ú é„�°¤qˆA¤AЦ� ¦Âi’v�‘ƃ &)�6); ÂxI¶a„™C“M5´ØOaˆM “§iˆA4iBì1H0Å1ÈAØNÃi[ ´È i¸Wi«ii<‰Á‚õ !e\‘†!Œ¬ˆƒ ÂRXB#+¹YB!ˆB#HOƒ>ˆR« +VË•X‚(B *CÉÑ>iƒL)Ga‚ T¬°ƒ „V�SMO6Á&Âdo`«M„Ä&žT4›I’´Â 1KiÛiA’¦˜a)ht#DÜÉˆŠ¹\CH8ˆŽ"" Â`ƒ„EEc'تbÐ0˜…\WÕò¹A™ÄGéS¯„ +©w_X¯ÿÒê +i+ikí�ë«°Á,A ƒ AK0—¡�ÄDXQÿò¸H›U•ÖL›�ЧdÙ\œȈ& •Â>§iQ2•B£ÄìÖG†¦Q™ # ¶I#±Žõ®úµj×gw¦ª½÷÷¡¤…õWþJ–všiýkýý©\þºˆÿ•JH­fC¬‰JSúv¿Ñ “'dsD%@‹¼#@3áœñs"9¢g9p¬Sd áT{ "ìŒÑ ё̟.yÁž3¬0ƒ'Ì"y 0@Ñ�ðG€ÂG0ƒ +Ã#3l&O›FmŸí(DB+ˆIΨÛ>) gAH¬pÏdþ`Ž‚š¢q”  U!–KÆŒêD±�.ˆª#Ë”yÿ§Né7¤’åQaî¨&AÕƒÒÂN–¡4n�SúTѱªé0ѱçV©„Ò „]‘ø&Ó +�Á¡i…FÀÑñè×Ѱ³´Ñ¡„k"ñ±±ãÐalÒL#cFv�Œ¤Ñ æ€ÑO:A0�ašEÌÍ"$Ádø@ÂA†ˆ“3–sÙ Ì9‡‚"«.r4) S¨Ô vYÃ<ÒnXÅé6îŒz¼³Òm¦‚¥é?¤Ú óJÒl"1ûMC8a&ÐdseÑ8IÙc#²<¥¤á&Ó#šVÚdsI°�m–a;- °†“«I6> ­Ú ´-& ´µdÎöˆÞж“j˜P��&Ô&“é6¡4‡FŠi£uÁ£XhÝØ­-Òô­ú„Õoíõ¥zZŠ]ZZ]5¿MÕ¤úV—¬&›Kª]'KaÒt›[÷ÒnJZM%{ÕºV‰ÂJýZ +Ò‡WAºVˆÇ…I´´æ®Ë:tÃIÒl!¥¤é6–“~�ý»uqKÝ-µu.W×ÝM‹íÕ6ªãªÐï×êún?î;tÞ£íЯþ÷×ûJš^?�[úôÖ“«Õ®ÿM¥¥É:IÒt›IÒ¿ð½ë½ý{«}>½w A~Úï\k»¿_¡ºMºë÷®õú‘Âï[©+Švý«ÓºBê5¿ûB–“¤Úÿü|~›½,ö×Q׃ñúôXΉáè¿ñþ[’–9$_®›áõãüA7¯Ä,t=¿ßýÒ­®úÚׯ]Ezµ#…þºë¿ëÿ×_°ÿI~׿èWÿÿ!¿Vרz·þ‹Tß豜x?‡ßòÓüaãýcÿÓkð_×_ôÒ×ÿ_ýµÿ÷­ÿÿý[I~¿Ë‹ûýoKÿØ~ÃCý/×àõõþ´¿¤‡ø#?gþܧø"Çÿ·_øl§dw^KÏúÿ¿ÿäâuÿþ¿†ÿÁ[KÑNÿõVý¹wÿúûû®¾½ô ¿õn°�ú÷ø6�h/ÛÿÿÿÑ¢Ú_û_†ÿÂ4^¶×¯üˆœ7á¹ÿÿùÈïÃyÒÿÁÿÿá/KßnµÒÿÛÿ½Â]øKþº¿»ÿÒØ…ÿýáÿÐ[a~Úýú ðm'þÿ§ðo'ÿÑÿÿÿ¯¯ÚQ±Z_üVÿ‡ÿö¿îýzZ(sèëýµn·Û­uÒŠÿp–ß¿ÿ„î©è/¾ß¾ÿ×¥þ×ëíÕw¾qiiûûßþºíõþ»úéh&âŸÛïßÝ'ýþÒü>—÷¯¿ßÿõ[×n¶µïu}½µ¿_o_ô¯í¿ÿT›ï]éºÊOÞµUúÿ×9þi¿ßê¾U¯×ß_÷Ò½½÷kßn•}§ö—Ùÿ¿«þÏ×û]6gêÙŸfjîÿÙögÛgë­µuÿµí9öh�m~ÞÙ§ýwÒ¿íû÷ëýÿ·Û{ýÌ-YpäB®¶“öÈ£‡"cz¤Û &Ã¥"¸k°Á)ûí&I;a„› ˜×^E6á‚JØKK´›K´›/6—„aÛ †’{^Ùëa¥¨@®½µí~ÏþÙš×ú½}µ×½·Jöì 8NÔ-6Ò¦‚p�„˜a„¦¤Ø¨4¡i Ã¡i­XIŠA„Ø Å1I„ÐiÂ{ BA± +ÂH0Ú ´J(6‚A± Ûd/¶µ ±I±R+†6’r%´•;Óa„­6YÃO´œ½"íÜŠ8{i°ÎWM Û?ÚF†i°�¦A©XÃ"��„!©W BÍp`¥dzŠa.‘¢M4� A‚�è·a‚  å\"â�m¦§›a#\0¢4C„›˜LW^Âwil$ÚalRl+Mši†)4ئ¦�ìS ÓMŽÃcbƒi1LT›#±dWåÉX!H8–¸Ø!G;â2“ÆWMXˆ4" S*ÙÖž…qVU°Á"¹�ða5R®Œ; �Btg£Û �„ÓA6G0˜¦G ‚ŠÖ*ãB“åžpˆõÒõª_¥®½.ëê �.ÚVÚIV­‘ºVCk †! Ù +Ô8Œ¬–ãh·Y¢"?ÿ,ƒ©\¼d²ÁJ£2ˆÆvJȈ©G`q]vLËp.§f­Tˆjw¬RàªwS*%PªJ Žì©ávv�¾ÿþÿé:h'A�šÙÚÄv¢2-È[¾ÿû¿ûúŽ­k„a¦¼ª¦·iúúÝ÷ÿÝ"6F±HhÞsoý�Žvø�ˆÿ“¤)•b:G]Ã^plPnŸ¯ëÿëùÚ�¤©6‚ ´ÓdIPü‹JLEO%=þET¥&"—çE“Çiïõõô´œ$íUªåW•ÈœÉð@Ô� �‚O› †k00ƒÍ‘.�°@Ñ ª(2œLœj„¨‹¡ Ög5@òâäâ„â” †�³â�š +ˆ€È¤Él‰2EÌ$Lì†d]Ÿ3«L“"^%Zš™ò£% ˆIZéVíªëFì—“9°43ò65M„ѹ£[Ðf’5‘ô ÂaQ­çäll�‘é�Ôl£Cb˜£Ò5ÏÑz69ú�mÈù¦� #egð�mBj�eœÎΑžD'šÌƒ9.<0˜#8h„™Î#A’ù¦d$Í“æ ÎƒÌ DvO›A�Ä×m”"áø©šÈƒô#²¬¢’†D ˆÍiaÜ ¶N”ƒam„´Gm-.æ'³í29¥²Î‚ †ÓJ“zZN“´ARu“ǤØI †“¡¥¤á'dÏH6ˆ°Ù3¦ÐÕ dΘhhZ44›“¨ÜÔ ÕSÒm5H7¦“jš6ñ±¥ë÷„lr/%ØEÛY9“9òxÂ0ááÃ4ˆEÊÒWk[„ôè&Ò}êõkºuõßÕ+Ò|RÞ½ÖzZêëH“ “¥ûªW ¶’m�TOÝ$Ú$ôKƒ´·©0 ó +g›,é´Èæxg 'D[¥I6·kï&„ØxL˜„Ú Šo T�oIµ ô¿¦·¦ÚÒÝ×KßKß÷JÞ�}{]µÔ_oTëÓIè5ZN—º·O¤Ý5îé=5[«úNÕí_V“¥Ât¸+V’½öë÷JÞšJÒÝÕÚIô›AžlµÂ—õ_zÚë®·úÞ½Õ½|ޝ…ûß¿è~ãë×õ¿ûBïý¸»õïÞï¾¥Â8Ó¯Kp×ï]´¿Wýõõé¿ÿ[Ó~?®?ÿøÿíÓ¢õá�× ûÑc‘Ö¹ÿ�ãî­×«oï¯õ�ëµ»_J? ô¸×vïÆéjG +—_Õ|[þ¿__×ýÿÿýyiÿ­®Ã÷ñùu}kÿÿ¯ÿ¦ÿÕúoÿÑ4úñÿÑ1É'ÖÃÿÑ!üïj>¿×ÿÿ×ým/×ën¿öþ¶ÿéizëõþ¿þ¿ÿëÿýkëíô>Ûü²áèº×û×ËOÿÿþø#ÿaÿ¿ø#ÿ×ÿ ”ⶸoÿý¿üÿÿÿÿü/ÿÿÿëÿëƒþþ¿ú¯ÿ¿ÿÿA?úOûi~_ÿÿá´{éa¿ÿí´²ý?ÿÿÿø#=ÿÿücý´¾-¿ïÛÿ¿n—ÿÿþÿ¥ÿ ¿â ô¿½ºïðÚ_áÿÿÜ ¸Oz_ÿÿÿÿú[ÿÿÿø@¿t½Ìðïÿÿÿù"þÿßÝ.ÿ Ìëô¿øøuØ÷úî÷Ð,/á/ÿöÿý¿ý/Ûÿþûô½â +üwÿôÿëÛTŸÿßíþ¿_߯á!ýz}¾ý%­ý}û Jÿÿ_éú_é×ÿÿé6�&öý.Ñá÷÷Iýÿïn½Wß_ÿÿû_÷Íî»YÏÿný-{×ö×öÿýÿÝuÝý½¿ÿ ;ùïÿô¯ßþÒûÿwíû¯ëíúÿ óþ¾õ[{~•¯ÿ×f{íšr N­úû×ý÷_ÿ÷_ÿÿªÿwß¶HÿÛßnû÷Uÿí¦Ã/Û ådy6ë[îðÁ9pkì5ùpm—“m'Vφ�ÖÜÚ]¤­¥Øi0}„ ´ì vc»[Õ´—ýµýu½×ÿÛ3öÝüƒû3ZOÓÖÙ¢Jí³DßÿûÙ:cئ)6  Šp˜L2+¦H4ÓÐi„5“m*†Å&¦Òb¶“´‚ 0•±A�Šm9Xäp˜¥  •4Û[´ÓMÐW§r+†È½m$Õ4öEàÂI¶rÓ‘V +­ÚM®«v’·˜V­«~Õ§¶þP˜P�„ÂFˆcFz×;ç‹U ž3ÃæÇ£CØNÕ±XP¶JU46ÅsÀ„ &G +Ói¦G §a&Ø"‡Iè0Ú&LŽ‚a†’a4Óa;H6 ;M4éŠA†)4Ø&“M¶)»[H6�Né‘x‡íÆÅC¡òv¼ˆ;Øj»"®V[—Eså P"½1ˆa"¶ ç�…�h1ìtÏŒ1×�T¬£ãhXH¬aˆF¬žž(¬£Ûa +{† Üñ®wÜýai¦¦*Âj Âl  =…§L¦Ä$Ó¨«™rW,Ã\ÎÅXŒ¬ˆƒ(bÁ‚ áEc>g†Â®ªêíÂq"4"#Òé.›\GÒWK†Â ¶’Ú]0Òì$m&Òt AaŠa‚ic@Á(SˆŠqÿ嶤«&áqØ9¥GnFfuiJôˆ&Ò&B—Õv‡jZ¤ŽÅâ58›Ñm>ãÓT�ôY ¤w0¡HÈ(Sµ1M2JÉdûè¾/¯ºŠ�é/Ö±¦JÚª‘_P·wÒßôŸÝ'÷þ#�š[äÏô²Xšt¤‰÷ëwúÿÿê:DŸ(j>J’¶"þ×QÇ]}t•/ÓÿÆW�‘FÈñ(ÔR¬ShÚ$ÅÑ +¨p>lˆAQCL�BCÉÅ*ÊÓÍ™¨“5d|öS‘Ôf³ Dt"0Ï™#8ÈÙe2:‘Þ3VI½#ßë�ò¹à¡2M0š44k ¾±¢ìž™s4<ž´0_ ”höÔüÐÂ6Q±„k �BV #Xh„ÁxÐEägf�L# #Fƒ ¨A”f #CG§gj¹ƒÖÂG‹£„|ÉÑ<\Ï‘4l0A�ѱç3y²IQ 2 >Od‚Ìôyèˆr2Ò2(Ìì�ò¤É<º#vVº¢,53f�t´˜Òl �ô½dΚäp¤–�¤ØA:L4˜rt&^xÒm“¡.N�6@ÃTÒ<Ò=!£CBÓTƒ $.š¤Ãc}5MšèØÂ§Å­Q±¢"¹â3ôk53À@EØašó8 ÂQàŒá“æ83쇲0`�“Ƙ&) °°N´ÛikIio¤ú¿\ªú'×KI·­´›§i¤›KLñ¥¤ÃD¸;D¹…p—é‘Í-'w ¡¤Ú¶L4E¾Õ.É¡0áì ¸A0ìÙ™¬šm'µDpÑ�®“j»éI‘åQ­ªzdðF¶�ŽÖß^—N©ïëþÿ·âûUÓ­¤ÞôÚîö’ß{¤éu¾Þ­E'JÒ÷©;KþðW½%ºO¥öáútµØaPM‹…Ò Ž{MS¥Hih‹GmRm'»îí~¼i^þ—[Þâ–¼kþè_¿N¢­»ín*G ¸ªÿøé¨¥{÷¥ëmáé>ïUÞ,=ßõzIuiŽðMÂu :¿¯ü_ñÿoýïÇ­û­½%ߪúwv£¶²8T¿wCµ·÷¤¾›*Óë}ë¡Û ë­ÇoK÷½éú|ÿÿ, ÿ¥ÿúòÌ&ÿyiýòê,gU¿ûÑ:�ë%Oÿ-Èæÿë^¸o ?^íúÃmßß­¯ªÒÞ·oÝFÿÿ«×þ¿ßþÃõüÔ5ÿÒÛÿÿ÷é‡Ð×ÿŒ:ÿoKýô½[ïK—Xa¿ÿíGúêÿðFkÿ¯î—ûþ¿ÿúiÿÿûfÅÿÿVÿ¤¿»qûßì0ÿþ¾ô­úÿëÿú[iæ“ÿÿàß�wÿÿûÛGz_ÿÿþ_ÿü7ÿÝDïÿû׆ÛÿõýWõÿöÿô°Ð_úOûi†ü%þ?ÿþßÿÿÿàØÿÿá¿ýÕÿå»ÿý|6ÿÉÙûtÏm,‡ÿøoÿøK»oô¿â¿ßÒï¶ÿÿÒþÿëÿíû¿ÿ ßÿ�7ÿßÿ·^ÿýþ¡ºXA?ÿ†ÿÿê�¯ý/úÿ]ÿKý½Šb¯ûmëßÿýÃÿì?Ö¶ýºênÿþ‚º® ´¿ÿ ÿÿ][¿Õó›ýw¶ÿé[~ÿþ»gTûwÿÞõÿíë¿ë¯îTÿ¯í„¹«¥ÿöÿÿÙŽßÿÿÿÒôÕ׺ûÛßnþÛKþ¿ûý³§V¿ÿÕmûþöÙÕ?ÿú¯þõë÷÷ß`�Èc™í†­Ý‚ù´çå]n¬Âß»ažÛK]&Ï÷NÙý³úí™ï]ö–Ã?Ý[w¶¿f½~þÚKßÚZUÚ÷_ÿþê¾¾¿ÙÓzª¦šÜŽlS9-XþÓTÛJ4á°ØØÛI;´"¦)Š´Øa&ÒÕ=$Û­%lÜÃìÇ~ØJé´½k²óª[}·WO¶}6‘ÊÒÿý?Z¢›×¯Ûêšwé…iì0›.ÙZp�°« ÝÜ0¬+§ Šè0AƒI0ƒGv¡ÓL*vƒI¦Å6�M4ì$›i&Å6M¦ÂM¤©¦é± ´ ;M]+Al‹Ã´­Õ;ÓÓ‘ 4êäAà 5‘K½³ý¥-Ö‘Cs°<ìº!´""!ˆRŠb!ˆB ÁŠì¬eC B5©Y•Žˆå+0AŠ•lL”Z…*Ú=Ø(„Å îèiŠ všaŠ•…¨A‚ŠIˆJšvšl¦›ì'mÂì$˜Tئ҅~‹(8®/¡Aˆ†† ±aj{(ò„N‘\U•v˜R­Ê·N #}0ž!-á„ÅW×Ô쬄h®$œFƒˆˆËÙ¿ÿPZá'Ç ´½P%¯ûiãJ—ûIA%Á%êÒáŠAöª + —ZË šT¬‹,DesF¶õ@Á ä¨�qÿ&ÉâÈjd2 fJ´®O +kFARe[ +e#‰CmHÛ2åÙ2™§„ÔÑ•V¢º`�á¨êûý]?úéii?¥þõ¨ú];ûâ–×û~“«»âºNãUimzW«iii:NˆÇ…‚m&Òup©ž&Ñ/xI¹~ð¬0‚~XT›H4Òpˆ±G¶¨ è”4xnéí÷«iÒ÷Kw~½Ðëÿÿ^Þ´ñë×ÿöÕ5j¿½5¿ÝSß_I´�o´š}µÿ­Ûêöúm_¤ŸKª“Š\­$ÃwÂ]¾®øík¿O_Ë¿�¿{Þ¨SÚý¡ÿî‡C_Ú7õÇëºñÚˆh}¸´»v�÷Ôº]ôºkI×ÃKôþ4Ó{Ó]áôßÿÿãþ?ÿî— º–žõì·&�ÿ-ÉN?Öä«ÿè±Èö ôAk­a¤ïºCÞþÕñz¶£h*Þ½ÜkwÞßýFžÃ×õÿÿô’KÿÿØ=Rõøiÿxëì<ÿyb½µåÖÿ,·ÿwEŠßúÒ_ñÿx{þ—Ûÿ×ÿý_ÿ×öëmºöëÃ÷÷]~×ÿÿýØú« ÿÿþµ×ÿÿþÿ ÿå9‘ïëü�‘Ý¥ÿš2;ÿ\7¯ëíÿÿàŒ?ÃÿÿÿÿÃïì?ÿ_ÿãýu×ý‡ÿÿÿô ÿÿAm¿ôýø7÷ßàÿÿøA~ÿÿÿÿá¿ÿ"þÿÿßþÿn°_öÿÿï·ú_ÿú dt·ú ýÒÝ´½ëÃwÿþ“ûÿÿÿþÿõpÿþÿÿËwøF‹¥„{ÿƒÿ÷úô¿ÿõѵÿ¯üVñ_ÝÿúnÒü;ÿýÿ{u}¿ÿ¥†×ÿïûú¿ÒÛ kÿ‡¿ÿåOºÿýßúé]þ¿íníïýÿëúÿo_ÿÿ«ûßêÚ[ÿÿëýïú_¥ÿ·_ÿïî½WÛÿý6ß¿ÿóŸ·×œêý~›m9»v½û·¿{gTÿõùVŸÿ­ÿz{ný, ‡KÿþÿÖê½ß·þº²ÌþßúÿÿY§»kîh»ýlÍ7­®•™§¯û3_Ù¢îŸ×oõmUkÿ^ô»[ÛÕ}Ï/ÿÿi&ÚVœˆ8i«eÄONäW ¶ÂPÕ†^¹ÃOl¾ý �† }‚8îé†6Â}¤Ø[=Hƒ‡wtÚ¶—˜ýµ½[I³ ´­Hé³=´˜gÒý6´íuûI[3]oM÷|3 _ýkûVÿi&Ú 4ØM'lŠéS´ávÅ1± …¦œU'¥LBAÓ¶blŠôíÅ*ÆÚLSišlRiÛ!É�ÒbØ«¦ÂÚÚL0°e˯ÓÒØat¶Òaž[mß„SÙ vÂe×ýÕû홥áŠ!áˆF¬Ÿašdði„� Ù/´žlA“‹PšjUÑí°´{lP†3ö©ˆA„› +“•ba Ù+La„Ø%ÒvA0ša„Ða¤tƒH1I§a&!4ì0’ šv‚A±PÒM´˜Öؤá°ÛN‚Tôô•>Á6_“q\8‹��gkˆa�™ØÛ„W‰Ð2…B`à Á 0H¬gM‚a0ƒLBE^{£Ûž1SÜ0‘àU±A„žÈá]V›M&ši°Â¦©°f ŠA§Wê‹H„Bãpˆˆ0B ¡Â;3ÉÌÑ%+$¥¥fVeTƒD�n—ªŽ""®Yú_é{­$¾¶–î­‚ 4�/J BOÓm(Ϥ٠+ȬDE0Qÿùnñ�Y§Ë4•JåpTw`¦‘4ÎÄfO•Ñ£F-ÍméWi¦JÚgið¦�UNúSZ+‹]Ôþÿ¯ÐfArý'§ÿßÿ�ä͈®ÖþõÿÖñòIçcM ˜aÅm™ÔF‡£c +NÿÖ©´Ò[é:ÚMÿNá½Ò×uV÷ÇßZýk§§W«KA=?®–�ÓN“úV‰G„é:á_u¤­|[Ű•¥ª%�¿Õ%iZNÔ4ÒMáÚ"ÛE9fàöé×C¡ú�ô·ºQ¯[öí;†�ÒýÚuýÝ,4ÛMúB½´î—ë¸þ»¶þ8«Uï½i?M6–­%ii?¯IÁXÕ½zåŽE/ÿEŽE¼}ÿzuoïÿúëwþ®º÷wß…ßõüm{ÂÚþßR8U÷úëR8U#…¯ÝµKÕ=ÿu¯�ÿãOý÷ëÿïÿøÿÿ¯ã½÷é üD:?�ïÆ£ï¿ûÓ㯯ïõèoöÕÿô•}wß½ý¿ÿÖÿþ/×}ÿVëòÆ_øpÿýF¿ÿÑdã_÷C\·$ùNÿüÛÿÿÿ×ÿØÿý~ÚKëÿú›‡úÿþ½{ †’ÿÒÿêߤ¿î«ãþ×KÿñöÒÿ ÷ÿë"'ÿðßÿåÚþõ<ß‚3ÿÿgá¿ÁÿàŒ?ý°ßÿÿþ½ÿÒÿ÷KÿôŸØ…þ¿ÿé?ÿƒÿ„�´ì4~‚ÿÿAb þ_ÿé?~ †ò"ÿÿÁí¯ÿí¨"ÇÿÛK¿Â_Î8'oÒúëí/ÿßÿô¼ ¿ƒW¼%ÿý„·ý'ûÿAá°Ý¥ÿßÿ ¶Ð]ÿý Uõö*+ûõð£zZ^ºþ—ÿïÿúZF*Ýkõ×ëºú_ÿá/ýßKÿïÿ q +ûÿuKÿôû{zþ­·úõþÚ¯¶—œßÿÿ_×þ½uöëÿßÿÿÝÛKÿwÿ×FÖïÿûþþþh½~Ì{Ö©ë¥íë{ÿ×ÿê·ú¤ßë×_ª�©ÿê¿ê¿æžQ¿ÿ÷ýjÝßÿ_ÿÚáÛ n¶Ècƒ=Ú]­¥uÝŸí<Âí-mÿ»du¶Cdþôû[_aß×úûfkÿ_ï­&íÛ'Oÿë{oßµ®ßÝ­66)9$ÓmŠm$Øf Aa%PÅC0Q¦InÒ»NíS†Ãm;VûµØ‡ ´½³”C´½9Áé°Õ6ËÚØGvGï¾êé†ÿÖÂV¾½ìƒðgû?_ßÙŸ~Oö°ÉZ $Ú{[ ÂIÓV Yi¦ÓM0“mi¶  ¦-¦ÓV˜M;Âi„Ó’½„­˜L1Lžm$ÓM…]±W“¶*)5NE¶•« †©­†)�Sµ†Ã¶$à 0Õ‘¦ò(á턾ËÉɰ¶PÄB# ¡AJ؈bÁˆDYJÆK¢_'Ã4ŽvŠ9YGÇ=5+ÐŽ$V6aDBEcžØ`š &GCÃG·5A„hhÖÑ­£ÃPš6bÂ450�ßÎ0áØFx#d dˆ h„é�‚.Ð ˆñA’-Nf3ÄŠy²D$Á” +CœB f¢:Ƀ>jui’dAçVE §á–zL4G”敤ÚN8IaÚD[¤Ú#²­ö“ߢbŸÿþ½¾º¿ÿòë[”+÷ÇüDÇ%@Çú÷ÿÇÝ[øwuõÿÿýn¿ÿÿÿÿÿßouéû_\Ø»jÃÿÿõ†¢µô¿¯Ð°këÿïÿûƉŽIÿÿÿø#uÿÿÿÿÿÿé‡à¾ ÿºÿþ¬?ÿõðÞ¾Ú÷êÝm¯ÿÿëÿì6 ÿþÿð‚úÿÿÿÿÿÿmAý>�ÿ<Ë¿ÿsó†ÿÿÿaàŒ?ú!ßàŒ?]†Ãÿÿÿÿý†Ãô� öÿÿÿIÛKÿÿïÿí¯ ß„¾Â_ÿ ¿¼}'ÿÿü'½Õ'ý¶–‚ÿÿÿ!ÿÿ†ÃÿëÿnÿK¿n¿ÿÿýý׆úIw¥ÿô—ïú[ÿÿ†ô¿ºA„�´Qá´ŸÿÿõÿÛH¢û¯û{ýjÿ¯[u·ÿïýû¿¥íÿߪÿþ–÷ÿí»¥ü0—ú] ¸KûïÿÒÿü6üuÿmߪÿ·_ëÿÿ½yýjÞ¿¿×ýþªs}öëÿûÖ÷×ýB[ëÿÿú_ÿ»ì=î¿íŸìþßiZþëÞÝmÿûfi~ÒÚºÖöÛ4õûõ×Ûô¿¦ïuÿÛ:tÚïëþ¾ÙÓ×÷ëÿÿÛ¯<²M;üǶ’zí„› 6 éHƒ†þÚ^®’l3rw÷°Âý¶¿iZX Û>˜iX@×n–ÛAÚÚÚ¶g·Ú_ûgÿ³?[¶µÿälÍ7ëíÿÿªÞëëWßb�l4i¦›¦Euh&I ÛA&š 0ÒA±I¦šaSb“M0Ú'¶º +JìlTŽjÅCAC#¢æ˜M�Rƒ.6Òa‚L0A½i¶_¾[¦ÂR+†ÃO°Žàý²õ‚ ‡k¥hÝßúÝßÝ›}6g½„Š»*èøQ†� A„aEBkG¶��Å#ÛG фG3THÑG~�ݰ“¾*éˆQUA„M:i†J•¥CIÛ#€‚šaZLBdA 0‚M8¤ÂaˆM„ƒšvB¶*“N*G UÔ3šljšv·"àl9›iiÝv“ %QHDDYH[&bÙØ’;3GgB#Œ¼ÈW"è¯y! ! BGÂŽØD�Øa10¡Pa0†�°š{a2)té¨dp“M5µjši0ØH&› &í&)â"=�–jÊ(b !Y”«!ÝJUÃHÖÊ6F{CÖ°®[¤B"â=%×ÿõÁB^’Ó »h$¨>“µJM�(Za�Œè)£J?þM†”·x—‚eœJål(\² +a2tW£; År¬ÊOAù`Ð"ÿM~*)nÓÖ­×úÛõë«¥¯êúïö‰Ex Ü Þ©kë·ûÁZNí$ÚMÉ`m¥…t¡%i:ON‰sJCšŠA7&03b›aì°Âx3�ÚO¿uúýë}õ#…QRá.ÿzÝÝHácÝÝëKCIþ½þ•\kÒ÷§ÝZ§ô›ÛQÝ.éuéÝo}ûKõt¹;Zº»Âa7¾“ÓiZ]í.¿ÿäsQv;Mú·×é],ý{ö¨mWÖö÷½ {®×uûª…½q¸¥©pŠéw·î>�>þ—«×ö;ýÿÿÔtZpØ5ôºÿQ–Ÿþ?¨¥øÿ½K²Ñ}ýE~¿‡ãõ,uTúµñ×]´è~†£íuéêG Ý4¿ÿõÿ¯†Ãþ¿þ—ÿVúÿ_íqýÿÿoØ~­®2ÓþXÏ¢ëãÃÛ–9$yc‘Í�ÿÈæå?ÿÿÁÿ 6Á~ßÿÿÿú_úþõë¯íú«ëûÿ_ÿ¿]X~�úCÿ¯^�°îº_ÿøG¿ÿá°l ¿Kþÿþò{n¿óFGÿ‚0ü‡ÿþÃÿý¿qö–¿û¥ú°ÿÿÿ]‡öÿÿýûì8tŸuïÿÿ­'m+ÿA?í¯„„ÿþ‚ÿü7á-ÿÿÛ¯ÈÆ^ ÿÿþÃÿðö‚Šïÿô¿ÿøKâ¿þßÿKˆ_ú_ýz Òÿ¯ÂZÿàþ‚}/ÿÛKôûûÿ ÿÃãkÿÒÿÞÝß^¾ºûÿÒѵ·ú_ðï_Ký}Òýº÷ð–Ý÷ÁÝéaÿÿÿ§ïðÝþÿÿ×þÛ³§˜õ÷Û_ÛÿõUoýW÷õýzÿµÿ_Ö6Ûÿѵú[ôþ÷þÿì>ŸmoÿOÿlÑ[f‰¿õýëöÛ¿ÿí¾ÿÿoý}t½¿÷üçúííêÛþy>·÷ÿë·ÿnóö^ü‡‘ý}µlöÚZWV#«{0­{ìôÙÿû[NCÏö¿¯í6gúúõ×Þ¿iÿíšmÿÿz¯õmÿ¯þÙÓI±Å&¬B°›˜¤íSbƒ!y¥iHá§ÆÚIªlS" ín ¹6Ø`Š{ ½r+‡¬ˆ‹ $œŠáò áéiZ¶z°�¶cÛ¯´¿]´›?ë¶gòæg¶·wV­™þíÿë·í·ÚjÙ´]Õ*wl ¦)ŠiÓ¦lC…¦˜a4ÂL*i´ÓaŠb6!l'Ój˜¤á{ °•¥v©(¤Ãi&½Zpa†ÓÅ'{ M¶$Ñv–“a.Øg&ÏV_þÂÙ„ÙûìúÒ–Q0ˆ¢Ä1Žûtà�„KR?©YG¤0A“‹PTÐEaì®l,0SÃi ƒ„ñQ@©°˜M4› $š Š ÛNí4ši± ÛÈAìÚV‚b &Ä&)ŠTÓ‘Â�ŠÓc´¢#E¹Fâ9ØW­›åàGe¬§B "­RÁ‚GÉBEqHèÑé0BÓ†*(0‘î‹xaVžÓ°ƒi†‚]_¬qeHM8ˆˆÌº”Aˆ*¯¯Š¾#K¯õÿii\ÒÁKÓuí¥è žƒ6E'GÇApb 9ÌQÿ–º‘éùn’ +R°S¸Šàþ�ÎÓ¼)ØÐ!"$òÜÅÒkþJý5Ö/»¸aïòn£Å®©ë~ªWÿl—ñy\ ΦwT’�W}úü®ŒÃ2ù³>d\Âdù‚80DCžæBqÌK�Èìx�ñÔʤ¦¨Œò¥ýSŸ˜EàÛlÎTѸ5 ¦��SçÌ„âà2F`Ê´i `�‚]„��„ ”lŠ3dP)Ðg\Þ_ð™ dA�O%±¤jgS5×#y\ Èæm&�Ô&\Ò°ˆìÃI°ˆ¶Ùg¼˜ô 5 +ªšZ2>4é„]‘ƒ„laÃÂjF·£XaȰ˜õ3¤$Í”A0Fw”™¦0�„w�„¾O†bdC•ë*b¤éÓ^“úÓKÓN•Â}'qI´Èæ Îæ“iPTGm'dЛH>�mÛH0ð‚m]¦ºY4jšMꩣà H2^ ´�)¦�Œ¨6 FÀÂ6m +§þøûNëµö>ÚOÕijÖ‚z¦’´»t¤ú¶“ êÒWWLñ¥áBg‰ý](jÚM„4›wIÒm'èi~î‡ü{÷¥¸»Nëûµ«ê©=mk}7ÿõnêþíiiR_IrP’ÝÕÒ´»ËrtÿòÇ$¢c’?áêÛNÿ KwãQßzo_î­õnž½ëzýUGèU?±]'ø×þ�ÿCûÿüÿô[’§ß_¯ÝY~þ·ÇÝý/ò8[Aowÿ_ÿÿý‡ÿþ­ÿÿŠ_ÿ«Õ7êßÿøßâÁ�¢Ç#ðÑOÿÿÿÿoÿýý/ÿÿÿmvÿýõô¡þ=0åÖ¿ÿýÿþ ÿÿ‚,{i~Ýÿÿ½t·ÿÿþ¿¶¿íëþÿÿûü?ÿø@¶Òý´¿ÿÿí+_ÿò{ÿÁí¥†Áûÿoÿ¿ÿïÿÿ[_²1¯ÿøl$õÿþ“ÿè-´ƒhÿƒþÿûýÿ4OÿþFOúïÿýºQ±ÿëÒÿð–Ä-ÂÿïßÛþÿ¿×Û¯þ°—á[·þÿª ·ýµô¿ýtmn—߇¿íŸ¯ÿsEûfíÑåëÿªÿ®ßÿio¯×ÿªÿõ„­×ÿ}úv“jà Þà é°ÒÕ²õª{uÿÚÈ=>È96ÙšoýþÒ³k¿ÛKÿÿUÜëÿ·ç=»é†)�‘^š ŠM5b“¸«JÕÒMWN ¹0Õnó« ÷ëm¥½2B>Õ/z^ÓÿïdÙšý{µolÑ7í„'°©l0_a…¦Âb à $ 4ÓiÛM­±AŠb•;VÒVÒaý¤¬‹í+N ¹é§Û"Ž6i¥"޶{»Ò´›N".dYŠ+!“9¯;ãö‡ýß××þÿÿ Ž­ëúÿè´ÿÿÿå·5ÿõßuÿýëõãÿþ¿ÿÿÿõëþÿ÷à‹ÿûkù8�ÿÿÿÿÿú¯¶¹Ô_ÿú~/ÿöÐ_£G–ï¿þÿÿÿ¿'dwäìŽô¿úûèîõKûÿbè/ßúÿÿÿÿô ô…�ÿîÒK÷ÿã”Qõþî�{þÿûÿô¿Ar3ÿÿ½__÷þŸé~ßß¿×ÿÿþ¿®�«ÿûv“zªûÿÿëí·o]í«ûþ»ë¥ÿlÂöÏíŸÖô¯ÖÖþC_¿Ý¾×m^›µý¿ÿÿôÛªÜv¬S $�ÚLŠ8}°Âª{iüŠ8l3�—ÛIomnïû?ýÿªú²Ìý» °®ØLPTíÐM0Á˜“M6ÓM8Nƒ¸lSA&ÛACÌjšlU§"“§È®§"¸m¶–Á**"Q#YDaÈ0˜R±Ï ¡Ee�Ú=$ +G¶Ž„ÔðåC3ƒ ¦*Ù+±A„É^ï M6kpµNaˆRÚgk™*Â"ÇÈÕ ¤ £áXUÃ4�F]\²Õ¸õÒÒþÒÒî•ÕX0I´¨0b ‘ŽPáK DAèüÄ1Œ®5’q„Cͳ¹ç¢&DóФpQì[â˜ØÙ ‘ + dŽÜKî&G=l•É}muº¦ÂÕQº$=É+ëíÒ^µª×YÇûúþµN´Òn–Ôhu¯£�õ!Õú!v¦xZ¯Iû  ÉÙ÷çB.Ï»Ê ž@ÍD@Ì»'�óà‡Å¢ f³13‰ Ò>ÉHZN¡à +ºá „5NÁ}„h ÂaB.ëhü�ka ªj˜í:ýÒM£�úѾhb�úGÎ=°‚mê� Õ&pƒz¥aÐdÏ¥T6�Ž—¾ ¯ÂUA*Òoµt´qéa/Òt’I´£½QOT­'¥¥é~¿¥ªZ¥û¥a*ART–´¯á-.’­tw®®MÒòJ¿·K„«uÒ]%ªw]%K]-%¥±�ÂU¤´•V—b®ªT¿ZQê«J©*þ«J’ZÒT«ô’UÕ*T•E/R!©”Ay–#´¨Èéi7­*ú¥ªKŽ¿ªÐéj½\œëÒâµZJ·ú¤á0¡ÝÒZõÕu×¥Ö©PªKU½ÒI*­F:«}ô‡Òk¯ii*UUIRIWÒ¤K¥¤«o­%U®„¯k}ÝF‡¿ «]W_úý%J©~­U$’]RZI²l ã™ ¤‡JŒô¯Råõé.’®«YrIWIU[§Áêµ¥'__ôP{¥J’¤—UÕiR¡ éz­¼bJ©|Bl·D ¯§ý/ŽHb몡úA?ÿ’0‚(u×ôë%¯úäA ·Á80AšfƈB“YšÈîlб3dJ…$ +CÍ™ R TD™\� ‹™Ôˆq’ñF¶v;Ö–¯J«ª«®®ºKT»®�E]ºªãªÂ8ô¤Ô4Ó £cM=‘`Pk “ÈÖ» #cH Ñ­™èÐÓF†¬4B š„hvO¢3žÁ�x a/6c6@ƒÍq0GCœB*$йZõ_¤µ¤¹µ¤—¥Ké-.•kú¥é —Ý3ƒ8ÂM¢-¶XPA¦¤vÕ ò;h&Òa„D†“…AdÎt›dÅtƒ¤Ú„Ô&i*a&F4)Ѱ<ñ°jša>Q­§¯~‚)ÒT•%FÕ-%›Uú^´mtoÒÌu›N¾’˜ÔÚ×6«ziº¸NïÔ'T¸'KIà�'Uv•Òn•¤­-y Ï0¨3†“TI½Ã„±œi6“¤e® +—ù>¿ZZZªZZúKViéj––½t¦'¬�iRT´•*äù½úÕZýÖŸWõk¶¼WmñI¥zº¾ž·¤›ß„ÓiZºVõê›KKIR´•-+IRKJ•ÒÂJ–µ„’T•%ýt¿KIRí$÷~=öÿ·Hw¡I½ì=÷_j5Ó»¾Ú½ªÿ½j¶)7×W°–ÂXK ±^–‚´´¢« ia/I¿l%¤¨-% iS¥}z-Îç?ûKÿÕ†ðøjßiýn×ïTßûñßõTö)û * +*¡D*N)Rb¢©bœ;Il%**)[ 6—ø�íÿõþßÃáðÿ‡ÿÿþ«ÿú,r:5o a°¤^BaB¦¡€õa&˜Pª¡B Óh$ª…Uh/ÿûKõÿý‡°öì¿ÿûu¿ÿâÁ×Ñ®�<öÅ„Ó Ä*uL(U4븡…\5H¸m1@˜`š¨L(Xa*ÿõ´SÿÿÿÃxo þÞ¿ÿ¶–¿ÿûË Y«d·?ÿwVëÿÿðÞÆò!‘ßÿý7ÿÿì?õˆ�ÿÿ¯÷ÿ^Ãxoðú ÿÿ ¥¥ÿÿ‡ÿUýþØÅÿ¯‡ßøoAÿÄ/ÿÿÃwô¿ÿáµûmÿïÿ½¯ÿø±Zÿý‡ÿK^ß«ÿþßOœß9¾N�´²(½WÿóΛÿÿ~–•~ÙŸöiSþßí¯õõw¿­7ÿÿ«º_þÙÓÛWªÚì0–®^·ÿaž½†zt—m{\âÒ´»Û3ZÿþÈ9Fë´ÿmºzå�VAa4Ób“N+ÚM4ؤÂlSi&�¤›i2-´ƒi'Ó ,Šá§§¦š·N—}žô­%ÚA4hÏ Øa#Û�Û Ú«[ %°Âa„§“ˆP¢›AÙéŠa:i¦š¦�¸a¤›!ª¦«PÚWŠ2Í|¯ÆS¢„ P4  B•ÌhŸG¼¤ðçº5¹æÆ*Ø*‡{ +)´‚vìÒ%” d/†!"—UÕÄF’_ê‚´¢ÚVFê‚�ÿÊâq^‘\ɦWT‰ù_Ä6D|)3‚aL©ÄÎ0�–ŠüG§™,9ã…ÔÎGŠ<2lŒì2«#™Ã/…&â,Ü_Cï«XÒÕ«AÄG��ÁNéo¿¤?¾¢�ú/ ÿ­ñÉ„IPÿúçd×Uþüí|ì§ükÄP[õü}S]ÕKt—¾M‡_󑨊œi™ÔÍFEG”JujJr0È)äÉYFUk:ÿúxã¯ü a‘¬Î@œ0�g6A.Ñ æpäK"ñ<4ÐAD† ðFðAÙ>l� dù²„™œæo62E²Ⱥ—B4ÉP‰²ÃÙ=Ð{'Yg™¬È�H…f‘®52��òM�#[_øG¶‚mP´gaéGɆ–“é7µI¦�m4Â#°ÉΚC¤Ú„Á4ljÑ£ñM#dÓ¼#c3“» Bj¡4xjaäðMQ™á�“0ᓞ4 "ì ÁG�`üÙ2,�‘ã:  gAJ*ÆHFòr& 3¡²:–RDº#~)Òl*%Áº¶“IZN•²Î¶dZLá¥aU¶].ÚZNˆì�)6Û&tß´ÒN] ¢m Ú"ÃdöZ!„›B ††“…Pž‘è*á¤ØEÙŸšÂhÜѲ�Ò®M0ƒöѬ2ú64khðÂA¬4{ “5†Q0‹€Â6A.Í0@Éý6¾íu­%¥¥ëïTÚWõü'KK„Ói\'i/ݤµ­-ŠV�;R\×D|ÖÑ'¤é"]e¡6¨–éi4m_†y¤ÚM„¡…3c8ÂZLi0ÐNm ÃIäÈL=4iii¦‚×õ½~¤x*¿õú´Ú‘¾?µ®¾Ö»_ÿj“þ©¸ûý=tÝtøôÞ•ôí«ïÞ=kô®°šou¤µ¥Ñ'Ijî“a�I´�&Ðg /úNþ?ñøý}ûÿï\-þ=úýéwøéHái÷n¶�Háq½ý[ÞºÒÕo§ÓQÓ~´½Öìk§[ÅÒzim-.�òÊþ£_�º]¨ðúãþ‰ŽHÿõ÷ôXähÈsÿqß÷†õõ¾ý~‡¡Úîýiqõ¸Çm k¥µ×ý×éÿÞ¸ÿ¯ô?þÝWþ:,gÿÛQáÿ«ãüºÃþ[‘Ì9c’Iü@¡�¢Ç"¨zúÖ?¯ÿÿ^¿]vëü7ÿúÿþõ_ÿÿÛ_­‡ÿÿëûõ<×åÖãÓ|º¿½ÿðE�m4dw�Ùúÿ†ÿÁ?ÿð¿ÿÿþý¿ÿÿVÒØí¥ÿ·[ }½õõÿÿèÚ +ýè/ÿðßÿèÿøG¿º_ÿÿøG�øoÿÿÁ{Öÿ ÿå®öÿëÿÿÿ p ½í�W·ÿú_÷ú_ýÿýÿá/ïÿÿü ¶ÒÃýá»ÿKm,6Œÿ þÿ‚3ÿÿ·þ¼Ú[××áëáÿÿ_ÿõý†ÿ÷ÿé%ÿ¿ÿ_é0`˜M!#C qa;£Ûž!’�¥ÿW“–QP߯K×ý¤—ÿKõ ¯éu`ÈèI`–­¥iAˆ… õ¶I´£An�a0Ä&C²• Œ¢²±–QÜDDþWЊàQØ”dklTaØP§`Ñ>CÌð¡2ºÔvž$Ì®¥Ð]dC‘áÍ‚ËÊW<ªÝ•S +eUQßv¡3e{Õ'¥%भ“,íqJ’!lÑÒwª÷÷QÞßNEpiªó±¤I¿v½Ý]ëðÂÿëýºIc�Ö@×Oû{½S_ÿýqÄvÇöL ê�³æ§A¦TDFk%%È�ç2d‡mÒYÈÖdB;©ñØyR¿ôÿþˆN3“ó¼4Ñ 3[8)±¢°EÙ¤EÝÙ#0aÃ'Â"Ò#Ð FÂ"lŽ�ÊŒÞc"C#‘Äc! è~hE•qÖûHŒzM¢\³!6õŠZg�-* +éh—»„žžß†y„›Aœ4·®“a 4J“lŸ ÂIÒnÃI°†“i6¡4U´´a¨I 't�4/H;&< ›MPNM¤UGÀí5TÒdQ††šhÙ)ÆÆzØÎˆ£ÑžÐ�P�£[4Á0Á#Ÿ›óðšWK}l:N—º¾û®ºõÔ_êû§W}!Jäít©[ô¢—N¼“¥ÂN¸¶–•½%¥Ë:m~“m +M…ut›Ka'ÑY ÎM$è‹l �¦¤Ãd¸&•à 1ô“¤áR 4ƒ~×ÜjÿÇiuµÖ–ã^ûô7n•:«]j¸¶®½ºÚµO[B—Oî“ûi-¤î“í÷¾+«ÉE_Ö›V’à­w¥Kw¥A7L-$®´’ÒýÚúý>­øû¯íWî¶÷úõ÷y+ÿ‘¿ÚCõõ¨»ë¡¿ÿm—©+�ÅÖФ?ïZ^ôÿªoN½‘ÅõIÕÿ¯Óòˇÿ_þÿÔé|´ü†²Hé<…Fêãã׿¤ÚK^·õèmZÖý8vµë}véãÞ�ßxÒíÔk÷_¯ÿ¾¿÷ÿþ¬7¿ÿ^˜t;~‹õaÿúÿ\²áË«ôþ5ˇ-_Kÿñë¯]C½ù> xoCýÿÿýÿýÒÿÿnÖ¿õöõýÕ¥áu΢þ¾ÿëúþÃÿ¿ÿ_^þXÍÿýøzþõÿÿï!ÿ·YÕÿþÑÞ¿ùÈï°ß¶¿h§¨aþÿÿoÿý?ØzÿþÝ-þõíé¯jÃõýÿúzýî–‚ÿü~ÿýøoô½Õ´�ïÑã„hÿÿÿÿàŒÿÃx#ÿýÔcÿõýïýë|7ëí×ÛÿôwxKÿˆZ_ÿoi1_úOáïþïðßá/KÇÿÓÿÿ/ðøAÿÚ ÿÛ¯µëûK³û·äC#¿×ýw÷O¯þ‹®—ÿîÅ~—ïì~õ¿¥éwý÷)Ýß·úUøoA?ÿìR_þ¾û¯áŠô°oÐOú_uÿÖÿûÒ×Òý³¦û_þ½Nß nDë¿_KÿI½ÿ¯Kï{_¿þaÁ/÷Ýw¥uü„·ô¿oý×öÚMúûÿþß¿íú÷ÿ¿¾®ßÿ«ÞÚ»wî¿ûþ«½„…/ßoب„bλö—÷ö××lþ•ßûw!�ëim¤rª]³?õÓ½¿ÛÚêÿ^öÿo´›ßî½Vï!:oûÿõ_¿Ûßõ곉ýWÛݺV·"pÓ¹B+‡§`›iÈ®–žÙÊëw¾Á-8‡}¤Ã9ú°ÎMv“g®ðƒ¼ Û?ú¶ƒlþ¶Ã?Ú«k÷{fí™úíÿò3~Þýµÿ¯íÿÔ& 4Úl&]¨Zi† Ãm8] “M0ÅZWT˜L1I«'vBÒb�m[¶›PÅ&œŽ7 Ù±J¶Å1J›ÅÛ¥iȃ‡"pa$î¬%"°ÎV·{v í ëlúÚý�,»Jû­³5¯ùXås BEqGÏ 4 _(Ã4HøQá¡G¤Îh5DrG·*Ú40Á1M£ÞU°Áºv +˜„ÂQ †[µaPZ ÕÚlŽh'l È£Âl4i°M4Å&ÃH1PXMŠ ¦©¦Ãd­ªlŠ:í�áôôÛô¤Qݤ› dAÃ÷ˆ¤W +ÜDhÈB•´€‰¹ZA›Ë‰!@Á ¬aˆH®r®Ð°ƒ> �PM4� 0®ímkOpÓ… *k §xB žÒMŠai§QWËY/'er3iìexMb‘î (M#ÛøúøIÄUÌ„!ý~–5Ò×ém¥õ×b­°‚´’ƒm ­%Œ«l„\ Š: DA‚#QÿòÑ\R㿌ˆŠåÌ›*Rl-)œªTõ ™,Á'ŽÁÆ]׿OFŠ�¥°��Tˆ�Kq«¿þ“ú×ÞKÊVë]nþ>�þÿrº3%Ÿ;4_×ôÿÕ],©b—�†‰bǪ�Y4VV2¥þŸëú®v·æ˜Ñ 0eÁžƒÙiÏd‰�œDƒ«=—àÉÄ!!£„T +U‡"3Í–N3‘¼ÑáÊ$g´AŒ�5Í™Ôe@ÉVŒè2‘¦v¦²#å>¿ª÷¯FÆQ²��¦4<��Y?'6>B64ÂhÐѲi#]BxF†Å4n„]³ƒŒþ 0‹·!2ÖÂ40�ašó4‹˜F€a F„ÙH(2|ÀÈ‘ü†H“* ù3Ù%dD„;Ÿå‘!”0D ΃Ms‘&ÈÙ‘³R1k“BmG4›I´Èæƒ6J“l�.™Òm]&D[ii:¤áaé6ÓIh&Úh(AÐL93Ñí¤ÚAÒaÚ0Ò ÉŽ’mSGç£óFÇ…Tl Bdò5‡±„k #CÓ(Í0š5†ˆA2¡(Âa„hlSd‡ŽÑ†HÌâ#hÃ3Ð!Œ�´ByšáN•¤ý$ÚO6©;[Ó¥{¤Ü'IÒuÞo]é-+v•t¶±l%ii6î™vm-&ÜRѰ“xI°‚¶YÆ“am…Iäÿ¤ÚM¤ðÍ’a4gi7$/Â=µIÒxA¤¾�3N˜L*hØçË'2sèÖÉŒÏ õÜq]ÅÝÖ¿ÇÔWk]}EÛëôŸô´š[þ¼U¿§¦»Jé^¯®¯¢QI¸O¤ízZN· °–-¥m2ÐÜ*ONô¯,„ØA›Ù¡¤ÚNïÉ�8Pš*ß�«¦ß½!ýÔŽé½áu½´ýmÒêG +Þô9/º×î) +·×¾Ÿ¦“[ŽízO¾©¤õïߊ‹øºW „è”Rµ÷W\[è˜ä‘†½nÿÿ%@×ñ×á÷�¯ÄZ¢Oü5oõZúÚÐôvWtDé³!�4+ GÇâ||*Î`ŠV„bD�Ê:*¨”•F‘‘‡gY<�ÙIõU_õ_xA„hj…3ú5‡QE>� Ôr^kg ñgÎ ñšðƒÖ!g€ÁQ a$f "`‹³HÀÑ&ÁÌ � DB"P„BL‰†Ãù¬‰²©8Ê3¡H« �"Y™ÔÉgœÎÁùõ_&r;¥²Ä&” › —&•Ý'äÿM&šL=P´aØPƒI†šºO§¢ž��9ù£cÑ­ú68 Jôxi Â4|Ö5°ŒîGļó4ÐF€dg„ ¨Œ‹Ä[%†¡Ë.BLUˆ— ›"ˆ„.GCÙ= jKBE`r6eQw„ÚNïAVÚÚ +»¿¾“ûÒŸ4›e—¢~mO˜A6™å¡XAœ6X½Õáža&Òm– Û-A4&ÃP¤ö 6†t›IÒm¦•SI‘âp©„Õ=8A¤…ÏÈØÑ­èÖÑíÅ“ÊFÇ„kjÐF°aÃÖÎ +lh„ó9? Ó03ƒ$YÎf3ÏÖ¾ûþéxú�¯ïî­ÿ¸vöéÝ.�ÖÔk]+ûÝ+zk]…L$¯t·h*gÚ´“„”ûAœ+>Þ’p©6—„a._¨‹ ܘ@�i6“i6“nÐѹ¦˜M!añÿzý'CoÞþþ¿Ò~½Ýú×Çö¾Ÿ§ÓUÒo×m/¯iuµŸK}/m'Û&—Ò}÷T ×uy~ÒÒt­&Þ,äž“hŽÃ< ½¦¿�·òÇ#>éáýøþߺ·ý{Ómh/}ný=Èá[KëqÛC¿oz}íß 7ÿn£^´—Mík}Žþ–¿n“Ó¯ ¦ûÿúúZBÞ¼?aúÿ__ÿ¶¿�ÿÃùnJe¹Ç1û~ˆpÅxÿÈ!v?[ÿoûÖÚW¥_C^Û»Çûij(hm¥¸Å¿ªï_þÿïØ~Ãßö×ÿÿÿõþ6¨â=,ÿÒ–4Ú¿üýÿÃ|}GÝý9ð÷¥�VëÑcéô?_àŽ?zöÑÇ¥·ì? ýÿÿ·ëúl?ýÿ_Ò‡¿þ“ýþÒaõúÿøìê£,¸�òøç·_ õþ›ðoÃø#Çõÿÿÿücÿžpßÿÿ·ë·Xa…Òý½¿ÿßa꾿ÿÞÚõ¿¥þ>¿Ò}ë½t°ß†ý'öëÿýÿýÿ« ÿÿýø#?t¬8#=ºÿH7ÿþ“~ïðFÿøoÿßÿýºþ—Øûuûø_ì~ÿÿô¼%þ¸ý¿í?/l%†Ò}  ÿþÞØKð‚ÿÿüüÿßÿÿÿ_‡· ŠßßÒý¿ëÿëÿÿÝýïÿÑãé|Aa ùÏýA¿Kú_öúKïOïÿÒþ«¿¿œßÎ/Õ÷_ÿVëÒÿJÊtÿ¥î•úøF©¾±_£+þÿÃ}Òû ýïéwèïÿÿoÿ÷[f‹kêÖýÿºÿúuýßý¶öÿ½¿¯\�-zü$kOþ¾ïÚÿý?ûê—·tß¿÷ÃúØO{mZû[î›»OÚöÖÿ[Jêîÿ²}nÿ³=³?zöÌô›¿^Û4Wûÿkþµù§íþÚ®¿·�iúö÷[ûÿÞÈ·¶‚‘AÕŠÝ6Òd ïJ82äŸéºL‹_Nô�%²="Ž�‘äþÒÓl$ÃJËÖ—eæKæ>Âì†9¯Zê» üÒÿKÚ´–õÛÖëû4]úªíÚMû·Õ„štÓ +“a5IØ#޶G6GšL'I¦h&iÚv 0”6!BtÓb°ƒAé'lSÄ ÚAÄ&)Sb–³M¶*Ò‘\:»M‡tšö’ÖÙê û=X@ô•m°¾–•ì3é³èólÏK¾ÏÚ퟾W)FJ1`ÂÄ aŒtW…\1 ¤WçÆiÊ·ƒ�i¦šG·ÿjG +âž­×B¢‡wý—–ÒúôéÒºi§­­ìV½ý×iµö÷ëzö—Ë–üÿÇaÖ÷ÿÿÁ·Ò,eGá¢ëXÿ�ßü5‚«ëR[¾´#ºÝô5öÔ}ûR8]ü;¿ß×O¦¿ãßm{ÿÿÿÿØj—ûþßkõì=ÿöÁêßòëòɆ?òÜŽµ®—ÿÁ?Ã~Ÿý­ô:oïzèîëÿÿßÿö½ÿÿì;ZÿØ…m-ÎØ~ßê—°Øì5ÿÿÿñý‡ÿþ?Ë«ü?]úÿÿÿ¿þôw¥ÿþyN×ÿ þ ø/úû~Ãýa°ÿØkúÿÿú_Ã_ÿ×ÿø{}Òÿÿÿÿÿ ÞÚ_ÿþWK»ðßèÑm,#Gÿð߆ÿgþ ÿ¶‡ÿÿÿÿûoÿúÿþÃúûi}÷ýëÿøöëý ·ý×áûÒÛAiãáü?á߇þ/ÿÿÿÿÃø#ÿü7éX¨¯ÿÿÿûߨ¨ÿÿÞ)�ÿ{ôº/ÿÃÞý/ì6ÿm/ÿÿÿïðßÿúOÿøomtþÞßíõÿù­n•5ûuûµ^ßžO¾–×ëýýöÒK{Ýÿ°é½ÿÿø¯ýÿþûþßÿëÿ·ßuÿºþiû·þ»wëÿ¯ùÏo(ÿþýËïþëÿoÿÿ¿ïÿþþÿÛØ}­lúØgû0½³þ–¿mŸ×¦Õÿî¾ôž›3öÛVé¶Ôÿ|2ÿýýýmÒ«m¶tÿ¿l„õ_ûÛI¿þÿ)Óÿÿëûuïöµ¶4Ù0i« —´äN »IÒÚõm-r;º­´­†r°ŠéYí»¼,†=ÚÚ^ßÓgþêÝnÛm³?I´¿³=º´ÿlÓo~õý¿ÿþÿ_Û×ÎúM0Á ÃL$í…i ÓTØLRv�a š šh0ÚI Ø¦ÒÚb‚lB`dž¡Šc¸f͵°ÃÒTä îÒlO\¼ÚR áÃ9°ÎL0•×Y…턵ÑOý´›NÒlúnÿ³ÿÝ×߯zý½6½o•·(²T8Dr•”Wr�h)VÃÁˆ£CF†Š¼TðçŒ&(E…a„ûÓ#…×aý—A$Óal4ƒƒaÓÚ ‚pÅ1LS (i1 Ób­&5M6)Œ6“ ,iêØI4òõ¤¾­„Pôó„ížÛ^î®�¸ˆŽWV„R;«`„D8Œ¤DF�‚”�†#¤ÈË„¦¨0ƒLSÒØa1 +šM; 2 é´b™SNÚlU¤ƒM;‹#¾)’Š«Ú �Iˆˆáz&Æx0B"!„Vðe8� Т²Šâ� 43M„©ã*Ú;°Ul*tÓ &I’‹›ÿß-5³†‡¤¾"¿Òþ•Âê¢ÚZÐa� �Êæ °PËQlåª q¨ÿòÝv2RPŒ;4‚�‹AKp(È«•Ï ƒê*‚‘¦d3)żÏi>8|È7æ� jJ£±šfC#/´£ÿáûEûøgf¬#D)ÔÏ!lì%i/÷ ‚ôŸÕ?4qüíGçc^da{I?Óâûÿÿÿ×Å'ÄGÚßù]!’ rA瑈ù“ʶ@ü«È–ž¾�éXãíJä`‹F€hƒÎ¨6Š� Ÿ0gÄD&MŒ `�æÈ3©‚H(DÔ¹‘u>ãÙì©‘j5ª :F„yò ×9d 5’�UÿøÂ �´ŸÒh>œüÕQ±øMF°ðƒG¶g*=´l Q²i&¯La¦»a&raŒáÂf°Ðx�h„è@ò_F¶‘0Œ3âÍæÆk�)@ò�’£>d1�È�3©’ƒ) 5:‘ݪ)ÿú¤é4ËŸK“ôÂÌØI´4›“<ͤÚAó6ÐÂZNÉ¡0ÐÒvO“I6ÐM¤èZ[%Á“FvÈñRøG·š5 ¤Ã¦�)¤|hÖF‡„ld&gÂhðÂ43üÓ0EÃ7‘F€aÈH!&kf‘²"Í‚ œ!@!Í‘V�‘Â!ŠCT å^D2]u_Ò·zÛ[“ŠVÖÚVö÷D¢®•´–ˆß»»Ih”R´´IÒM¿I¶Ó†‚²Ðß Ï4®‚NÓI8A6—¤Ã +ƒ6hðÂM¤Æ¡ I�PN“u¤Þ Ú6gæ�Ò^Pši¦��&˜F€`Œáä¼ÉÐÐD÷Hoõ#…o_×_Õi¯Kq­ZÕ6¨î’Ûµé=:îßNýo·õik%Þ”UÒ}-Raºé0–K©B +®�m—BЬ ÎºM„›IÕp ÛG¶“ œ(AÒoI„§“×ïÿïô6£þ5­ªèt>ÛøèP×q¯z~Ý_ýÝÔŽq®ûKKÕ7v›­~›ßÅ+­+§ýý-RxL;K]WKÒ{°Ò–9�ãû×ïuü{þ‡[îïÆ®ê5õ»»ïöÿk_ÿÿëªë°û¯ÿ[T½ïÿÿ¬öö_ÿÿþþ‹þ[’§ÿôA&·H|~ûÿ†ÿÞSµÿÿÿaø#ÿnÑO_ÿÞÿÕ/ÿÿ­t� ÿë¥û~ÃÛÿþ+ÿüº¿¯ï¾ÿýêéÿÿ ¼ ¿ðmÖÿÿ:ý£¿öå?ÿÿÝðFu†ðŠÿûú[ÿ_ÃÿÿÿëÿþÃíÿÿÿþ“ô÷øt¿ü$ïV–º¶—ÿýß„ëA¼ÿüžwKöë ÿïûÿÿÿ×_ÿ6/ßþ)�ï¿îü%á/ßvëï»ô½^·m/ÿÿÿKñ è'ÿôÃA~ÚXÿüÿÿÿȉðFÿ¯ÛÛjûÿ¿ëêß{Ãb¿]Š�ãb¿ÿ÷ô¶{Kÿð—ø…†úûÿoÿÿÿÒ| ŸÿÙ—ó§_Þþß·~¾¿·”{Ó{wô´××ÿþÛ~¾úýÿú2£ ݵÿü=ßÿýþ—¥ÿøöõ_lþÿ¶~Û3ïÛ3Mþ¾­ßþöh¶ß×ݯÿûÿò_ÛUÛÿ\%úÿûþÿÿÛý¥éÿØg+«öÂUý¤› ,Çí« ÷ö�ÝÁ°Ï[ ö·Mm„®ÏöƒïÚÖ¾ÿïs9¿Õô¯_ÿÖÿó�:_þ§=»ÿý»ýW×®¾˜b˜a špØ­ ƒL1I±LPA¦Å1Zl3�†˜©Å^–Ó±LU°ØÛéȘý5ØaÃIb®›?ØOažÿý�y¿�À�÷^ÙŸíëVfŸÿý×oõõ×አ&!JÆ�l#Ä0„Q¯*ØaO 0˜^ ƒéÓw &a Øéà 0 Šð�;TNšM„L*i¦ÅÒAÈá;j©±I§kÃaª{wÓi'dvà *ØMºmaÿþÙš¿lÍkÚõ×é•$ác±e{`ÁÊëB"Ê¶ŠÆUv§Š49X{+3ÅØa![ ®)¦š6“MS§ÓM6Óa„ƒi&Ä&);dW¶“ÆšiªvÆÆ› ,Šáò áéi|µÉq `Žï jV4QaÎÑï=´V4zQXØ„„�ƒ +xa¦(0ƒ#�Úi¦¡„zlS ö ì%a ©ÅLŒç"û¤"(Þ!Áª)Ye'3Ä&š¬=j¢B‚1Þ’urÈ&å·V½/úׯ…´­.¡[A:_¦)Šïƒ&¦ V"(4ò±Ê·ÿå ”ÎÂge®©’Ȩ̌°GvhÁB™)ôôÓ KS´™�I±3!ÄØ¤ýú^ú~WSŽÀÁ€§fQÚ¬‡eunôï‹ïï²ÖÐN²Ü¥û­uüí_ˆäFIQ’„;íUbŸ'¦¾¾©®9RÄUë•ÈÍ™NÊ|Á4D.|(‚2ĉ8ÂIË*5 ©- ÔH¿$s"2&—$Ñ%꟮ì,ì‘T ÉäÎJš žS<àäüÖF¶¬<a4 ƒÌà�„ #8a1„khƒF†S†s…„ �Ÿ0Ìé4ä&L �!! d`Ê´lˆcÂ!(GǨöBl�Ñ$ȃίÈqNÔ�ÅoÞµ„E††¨Ž¶Â²g´ÐA6“¤ÚZ#†¨Šì#CH8I�&„EtúhÜÕ4�¿Mš6˜SÐEÁÏ8L#;ð‹°äLXF°Â3ƒD/œåÀdˆ0�~hÌEQ 3Ás"{$¬®7›ÌgÄ'FÙñ1Hhá’*Í7RXÈ‘•%®m„¨&¤Ò½-î“h“ÒtaP&Ý.˜I[.}+aMYö“aG0“l³†pÒ†“a R DvÒ}–€› B“ØRm ìœ%A0Õ4ŸÐMÍ� +#cP™<��ŠcGÊi£\ÎØÓ4kaÍB[H“Ë�G€fÅ“¤-«jœCFÊ5Ѱ4‚ -íÅÿ÷}ýÆ·Þ·Kô?Ðöú{M¡U÷í_÷ÝöÒ×úöéñ×í~�+„Þ–ô­É:HBI6‚uÒoH+¥Ó 'I´´Ã—ì ¡¤é6š=°É® ¾þï¾”±ÁZ·�îþ?Ëü±íõè|¡Uoííp¿R8Vý!KÝ&Úî=K„¡ñÛÝÔ;k§Coíx¤Û±[Ioâ“«¤ÞÚºB•¦õÿÿöõ¿ÿÿÔQí~Zz, òÇ#÷÷ñþC�Òñ÷ýïÐ×uÚô‡ÐÞÝ[Þÿi¡®ûV«wßN×}ÿÿÿÕ7úÿúýMõëÿ¨«¥ÿè°b´¿_áËï.µôßÿRÇ"Ó}oÃVûqÝ+¡­¯´;ŽŸïïÿë°ÿÿÿëÿÓ_ÿÿÿÿ ýzþþÃÃúúÿÓj�ì­ü:÷ÿ†£þòÇ#ÿÿÿÛ¬ü¨¿ÿ(öÒÿíÿÿÿþÝ~ û~¿þÃÇÿÿuëØûûöÒaëþ¢Ã–ŸÿÿÿÖÃþ“ÿøIÛJÿ·Ý/ÿÿý´¿F�÷äA‘ßÿ†ÿÿÿÛ_oÿ þž¾Ã×ÿoÿ¯ÿû½ú_ÿ¥xAúWÿÿý{ú_Ú~�þÿÿÿ׃®þSó«#» ÞÃÿ}‡ÿÿÿý·ëKÿô© ÿv8¯~ÿw_Dµú_èñí/õöÿ¿ÿï[Ãýxoô›Ð-Ô7„ÿ†÷þ—ÿýgUºúÿþª7ýÓ_{ÿwúú_·Þëûþÿ·_»ïëáï×Òú¤ÿø?ÿ¯ÿ½Û4WœWZÿþ¾ßíµû}ÿo^—꿤ßuýלß(^ßëý½öÿ~´›×a½¥þ®÷ÿ]W[×mn�m¥ØLÂÿû¶AùŸÿ³þÿf~ÙŸûšv¿ ‡ý¯¶h©½½ouÿ×o÷¯íü£þ¼ç¶½7¯“§õÿ·×ö‚M4ÖÕ‘ãiŠT¶ÒM†`…SM5M†Ãm°IU6IêöÁ+a„›/jà 6–¬ß„wd}lÆÚ…û?_÷_iµÛ3L?m}[Û4ÿÛ_þµ¿]v×þ¬˜öÿÅ'ö· +é„0“†Òºi=S´é« RÓ U:„Ób¢h6(6‚A¦ØTÓb¢“b˜¥¶EÙX¨l9iiÝi®ÃVÎM—»KöÏ[iv•º^ÚMª¤ÿ´Ý7¯é9§íÿ—$n„vX‰|Eì)Y'F˜`ŠZžaO 0M\ï RßkÓVÂ`‚a8L*va°’vØKCMŠ TB0ÚA�†)¦)t­¤šv“i&¶œŠáö“g¨‡~“ +JÏ|EÄE\·B(çgaHʨ0„5+!ˆ �ŒŸb#XHöÃ&¥d1 õ °„0¶)6 MŠ  “0šp·´˜¦Né§ &+IŠ´äUÊõKrmª2SÌ´„! B5ò±²±�sIŠ +šG�Ê�A„Ä ÐM6Ö’ËI+2TÊš—]b>›J긶–’ Ša„«ƒ&l$Dib#ê?þW Q.›„a~R@‘\Fs&ÚE¸4v—_·Œ®1…+’áIõ;KˆÈ«#³[ô,:}•;\#½Lîd­uÿýþ“]õɦI|íUeºý~£ýuôõ+J±ÉBÒz•ôPE8Ï"‘flèE9¦DóDPŒÙ ‘³5³¤D"ò0Œá™Á|gŒì¯3‚ !&»'Ì Ÿ9Í’!(E&GQ-C§"ÌöN¢=HÁ’D„%%zåZ;5~½&’m+w@›m-3ÆÓí$êé:N®‰upÒm-QYhM²g óI´œ4ÒNÉ¡6ˆà‹oˆí'BÚiU4�ÒmSø ú>¡™ÉŸ$®¡�a„k ü�åF€äAPö ™.( ÈùNo<`ƒ!£“�‘&ENX‰D2"#YWIÕ¯ÿ·wÞ—Çë¦é×KXW¤ÛTÚV»ÒÓIZ §à�-ûÐTÃIå¡am²ÈµL´ ÚNˆ°Ú¤œ"#°‚mÚ„›Õ'¦­4nrÇ£c ú7ÕÃ'“Fɦ 0‹†o=„ #XzÖè}§t:}½k»HRßk‹]ÝõoõìzÇ]ªúm]ïú|].¾ôëip›v·„[ +ê¾'eˆ©öË<ù¥a‚a0’a¡él³„ÚNšZ �»Iºõ¯ÿÿÝw×û¢ÇU¿ÿüwk|{¾ýt÷N×µýý6—Oj¢ÓuÕuþ5÷î•ï¤Ú%-öÑ'¥„’u„�I¿íÿú-?ï^Cÿâ¿__Z!À›ðôA)þ±ßu÷½ïî–½o¿m:‹×½îïú«·K¸ézMÐa$î¾ûi_×ÿÿ÷½Xl=×ÿտ勃҇ËOÿ×ïþ?ÿ­6?éCî ,}ïzëxýi·××q_­-õoþ¿ÿýª[ ½ëûÿÿm½‡ÿÿû¥ûÿîµ×ÛØ{¢ëÿÁÿþ‰�;ׯý¿Ü®¿ÿÿÿ¼§å àŒÿÿÿÿý‡ÐoÿýÿaáÝ_Òaÿëì?ÿëëþ¾¾½×ÿÿÿþ­¤“‡ð‚ÿïÿÿüPßÿùßÛ¯Ãx#?ÿ§ð¿{úûÿíªíÿëëûíýºþÿn½,6ö—ÿÿÿÿ†Û ßÿú_ëø}/ýµü#GÞƒø#?Ãÿú;¿ÿÿÿ]/óbïÖÿÿøØ¤·}/ýïÿm/íá‡ïÿÒÿ¯Ãz_ÿJú ý ¿/Á¿ÿöý/ÿÿü‡·_ýíÿÿoö½NnAîßÿßÿÿû¿ÿþ¿°ÿ}/ý‡Ý%û ÿô¿ÿïI¿¯¿ÿð‚vÒÿ÷Mÿ÷þÒý{j¿í·ÿ½~ÙüÓ}¿ÿ_ÿÏ'×ÿýWýú{×÷ÿ¿ïë_ýºïÒàÿ«vÚM™íþ­žþÚím[JîÿìÍ7ÿÚß¶fº­+¿ÿÿ×õÿöõ_È?ÖÛëó›ÿþÛ ¿ÿ×KFOÛ[¤ÅHAÝ­±Úr(בõtÙ·"zm‚M‚8ôý²óif;í[WºÌMŸÿ3¿ÓúþÒ¿ûÞÝ-}ÿ¦ÍëÿÿÓõ÷ï÷ê«ÿdpbƒL-¦A4ØTÓ á¥i)‚tÕ4ÃÅvšq6‚b­0ÅZ]¤Å2š¦ºk"»MNêÈôC×1ôæ;«ã²?õuiZ¶f»ý´¿ÿlÓ}´½¿ºÛÿýÒˆ†3TEJ +È4""ÈÀÉT  Ò=²}ï &˜A<îÚŠ ¶Âb1Pƒ m7 ;a:iº ›i1RWMÅx ØIŠbˆéS}- Å0anNêD©§Ù…« %´ë{z¶–Úݧ!�}Ô³VìGtC8Eg¼¬tŠÊ3Ñ¢Å0šjøH:a1TÓö;.‚L Å-8A§i4ši°a4Ø„ÖÚ =�6Ò¶5ƒ.M®ÚQÊåZB#íW!X‹(  „3ŒuM +>e\2G9á£ÛaOnxa„-0i&‘Å0ÚA6GÚi´Ó ¥¬G¡Ëu¤v6bXØ&‘éGº+b«T¹dJÜE!ª–®4©/^ +W5_­aA/KÕa6Òˆí”Ë`¢?ü·2áL€£%(ì§+ϨU +›DnúêWXÂ…;3*÷ôÿ%°G†d‘(®³šínû¾ªÒ )\n +[…~@²ÿîøïõ_Uó!¼¨ñþ’¯iåqˆÔ�yÓ#Ë”™1ýWÈÏÇþWÒƒ3 ÍZ!:l‰f!>`� L TDâ%ë.dPd“—T«Èùì�‘š ƒÎdL‰u5W$ÙTõüÈE™W� ´›FÊ7á4nh×F¶©¦�ÝÚª5†i&® 38 Â6Ma ñaÃ(‹š6QíÚHÌF">�f@dù�¢¢¦224�DÔ½•‘—"�’N]DÞ¹ÈÔD™‘'�s·—×é6–“i[,ážiCIÒÑ‘a„¡áÃe ´ÃCIÒÐ3f“†O“I•4œ$áj© 'ØÕ?ÓFÆÁ°hùFÆg&�lÎG¸F€Í0ƒÙD&Bp EâF`¦‡eÛ)ód ’b"¢"Ã"ÙBd“–yVyPgBS_ô�_¥ú×Å]êúîû¢OÝ'„é{ÒL5—º%ì Èæ–ºM¢;r`Ë@g˜A6ît›C :„�,!i~¡ ›@›MRÐ Úiœ”&vF0Öôk£Xh»'Äü™Íaša!&y‚.ðEÀ0‹�ópe²3‰ôBP2B6Êq•aJt Q¯ý¿ZÝßOïÕ: %öÒߤ½¤�D;téZŠW ÚëýñKD£ºî“Éý'e�ºM¤Ã ‘Í-(a Qºtƒl±�8A6‚}Òl!rw +‚ôh aªi¡ ƒdú°4Ô#C'Â7Q¬0��Wh{ZÖסè~†ãu¾¯¾­¸ÿN⫪Ó¶©ýªn*:Šý¥þ¾Ý:N—% a:ÒW«­¤ï¥r]qTŸIÒl ÎÃ�ç†îËBl!¤ØT°‚m'¨¬·(s þXäeÃþB¨Ë‹O,r-6=u·u^¼?k#…¸ßúÐþã«{­Ý~›‹KqKö…öÒt›ìk_uêÿõÒº§.þ•ÉÅ-Ru´¿ÃHGõú&5Å|võýU¾¶Þ£ Oÿå¹5,r4o±ë¯õVÚô?kõûR8T¿Cwô¾‡m§}¿ÿuëWêÿ¦ÿZ^»kþÝ×ëÃþ˜:ÿü}‡ŽÁìúÿRÒ}ynMÿÛï‘Ïÿ^ãê¿ôÿ©+×Ö‡_"·ÿ†Áÿ¿ì0Gÿ¢ž¿øoý¿ÿ×ïØ{ÿéWúCÿõìC_¢iÿúTßýÿXî¼±Òýƒw­Xmÿÿø6_ûkÿøoü7ÿÿá‡íì5ÿûÿÿýÒý¿þ¿××ÿÑc?éô·ÿäÿßî¯ÿí¥ÿ†ÿÃÿþÃxl˜dwÿýÿÿýÿ°õÿþ—ÿÿÿÍ^¾½¥»þîÿ÷÷Ã¥ýî—õÞûÿøoÃáÐOÿÿÿÿí¥øÿÿXÿÿÿÿÂÿÿ]ïû}o¿½Òÿãb›]÷ëßÿ÷ð÷†ðéÿ÷ý_û ønÿïûÿÿÿø#GÿíùÏòc×ÿÿò�Uöúÿó‹×lê�ÿþÿ÷Ý/ïúÿÿ„oÃíÿÿ¥÷ÿÿ÷Š_}ßo_³D{ý³EÿûdëlÑ{fŸÿî®ÓÖß_}ýþߜݼìó‹U÷ÿ·K½¿ð�õ»ÿ¿ô—í×ÿÿ¥ÿý†r‘Òa„“lÇÛ n¬5öÁ+ml³ ´»«¡÷ß[iv¿®Ùšöÿÿ4Û]+úïÿ¿öïßÿö×)×wýÿþÞ¿õûë÷¿Ø¨[i1Wi±XJG +Õ6)X¨ãb¯J» zmU†GÒ´“a…´˜g5óf5Øiw{g¾ëº8ôý¿û3O]ÛðËï]í·êßú¯·_ë}ÝðÁ0šba;&¡‚bNÓa&ÓM4d‡M4šltí �lmÕ ­ŠÒb­6!E&¬S"½´ž¾—"{`›eþÛ +ÚI¶› ÷ÿ!„í~¬þÞßgÿïOm×þµÛ'Z®ßoÄD0„8ˆˆ0Gj¨…¡ PŠ>4Wröj!#\2vŠ„C &!Mi„ša„×A°Ò °×aRi±Å&bi[˜M5m´v“ ¾ËˆØ$žÙ{‘\5aœ­/[Jû0¬ïÛM³ý§²„DfJÉLÁ�<…+Šá75»¯ZØïè~úõýM¿üu¿¦Gk{»i?_¾5¯¿[¯½^+W¤Ú[ÒWî‚b�&Òt­3ƃ8a2í ßM/ÿÿ®ÿËOëùfÿË�?ûoøû¯¿ê»úÞíKM÷j5¾î×ZZ— n﫯é7û´ÚÚÿOMî·¿ÿ]½½wÿ_Û_öúCÿ_ÿÿÿË0¿åÖÿ®¿Ã¡ÿüŽÞ¾®uÿµñ¤5¾Ót4ÝÑÝ¥þ ÿûÿý¶ÿÿÿ×÷ÿÿè̽‡ÿÿþÁ¯ÿÿ¢ëþ¸îªßÿ¢+÷uú_þŠ¿ÿÿùFÿëþgÿÿÿøEÿÿÿð¾Ãÿm/«òâÞ¿þ¿·ÿ¶½WÿòËWÿÓvý/ð¿]~ŸøKý¿ü6—ýÿÿø$ÿÿÿÿûýn‡øaà¿þ­¥°ÿý[_ÿÿ_ï_Óú^ºíèîÿÒûúÿ—ÿÿú_ÿÿߨø?ûi|öPïè>£ÿàŒ=ºÃþ‡}ÿú_¿åűÅ¥ÿúI7þ¿ì?íÒÿÿÿKýûþ¼7þÅwBþ!½/ÿ ÛKÿð�zÿÿø#?ÿÿOþ«×[ûÿ×·ÿ¹H�ïýëý/ßÿÿþßþg´¿ÿKˆVßÿIm÷ÿÿ„ÿý^»ýtµî’¿õ^ÿûÿÿÿµÿUûKÿnþýÿÂCm�ý¾½/ÿÒѵ¿ûªñ_ÿý¥×ãÞÿ´õÒÛI[þïÛ>¶¯Û3îµ_lѽéÞÿÿ·þÙÓïõý/S®íëÿêªÙÕ?ýémuÿ÷¥þ»u­Y4Øf +ÐV‚MÒTÓM5`Øl‹Ìóì0•¥"¸wÛ ÓM´“þÂ0ÿm/>ìÂöÏíÿmŸ´¿Ùm.ý¾×ÿÿõÿÞµÛ_ÿÛÿÿ[T�_MX%aƒH´ÓÓ„ôÄ%¦ &›iBÕ0›“½6Ò´Õ6!C‘y¶’iñûÄ5[/°ÂWV_UØvÚ¯Ö“gû¿ÿÖCÌöëþÒOw­µý¶õý-º–ëm,p„1 +p…[•qÂGâ�h£EqTÅ4Ò=´{sÄ0§†˜BØ ŸiÓM&Ä%M¶A„Údp“Pá±LS &)4Âvᆫa4­ ÅCaöªŸ"¸m°ÂV’iö^m,‡‘ÕZýþÙþÓÿ­×Žd¤‡H¯ù;T2šˆy †V9±°ƒÅ0®îÛ BM;âši ši¦š §mŠ´•4Ø„IˆQá´Æ�«ÙÉ‘Gí.ÒøÐˆˆ¹6Š""�0DF#+ŠFQÊâ©•l0šG¤0LR*ßµ M4ÚAÉE5¶ƒÐM=$mõP®ÚB""‘ÛîW ÄFV2]0A yí“ôGá�þ»i +¹7b"?I- Ú àµÓ %×M:Òt´ºa>B-¥ÄD¸® É‹btW8�þWÔɾЇe¹D+¨ÎÖ2 ©8R(ÔÓ +¥½#±™RŽëTšý$Õ\. + +ˆ�NÅY6 ø¾ïºµþR3ŽÊ3³™’tFaimnúC¾îýÞKSµ–OòÜKÇ;YP¿ß÷ÿ—„òêŸ_\/�”ãþýoUNïÓ(ÕÈèD†AÄhŠÖGE;_Oõ_òYø� + }ú!0»f‘r×4¬"Ç�„û4‹˜@‹å>`g˜€Ñ Ó¼ñ•hÙa3dP)ÕŸè4D9ÖF,Hõ%¬ŒÍgçC_õÿ߯ÉÌ&M… ¤ÚXh'Iµ´ †ša4a£÷ت:APhØðš3³94haÃP�m4Â.Éá.%3;Ê4BYÐΦ0�”By 2F`ÏfxŠ"í›R*Ífr„GE&N<‰¼ÛÉžr"¹ªñÇô–‰=&亓¥«¥¡¥iœÆ“jì´CMD[¤Þ�m'CI´›dЃ îé7¯TM¡izL5TÓ ¤ßÆFÁ£Xd@Ï3‡ž3æ"ï<p!:2Œ¹Ÿ6@ÈH¸É|Á"ÊÃ$ +B×6gCÈÄy² ¯É5ß½¥º´¾ñK’„½4ÚWÿ¥ÁZOn“¢Q\$í%¢p’wt¼+,ö—Dý¤ì³¦Â Žjxg -—µ„ÐTœ ›ªI÷p‚nGAiªha@æ�TÂaL Ñ­™áÁ¤ðã3Â.8 Œ#Ù…¹�’$ÆO"Fl¾†ÐÆî¢¤p·[CÖ­¦>ß»­V»�tú§´¿¥þý{¥é7O´êÿJ“knÒ_ºðL=-–‰öÒm& +ƒ6)¶“h3†“…H63foj‚ ›d¸ ÒOé£cöÕšy=ÕÖ¾;]úïú¡ÞÕj:Š_׿¤»ëêî.ý{Ó¯ï¤ûõïöûrv—J÷á0›JÒtµJé¿Ý¥I¶¶—áœ4› h‹Fï_,fZ~’.°þY?ûkúøøérÿñ÷Ûà½ëêÚéëõzÐô«þ½½Háq´×KÝõÚñÕ¶�/_}G„é^èpA½ÿì5Òý[ƒ÷¯ÿÿå§ÿÿô?¯¯þ+·ëËxÿ�¾‡×¡Æ»õäp»ÛÓ_×Ûiú[¾ßÿÿØÿíþ¿¥ë¯®—ÿö«ÿïÿú_¨ô¿ÿËÿ-ʃ̘ä„ôC£Ãu÷m]¿u#…­Û§ßÿþ52;ÿü7í×ÿ„Püÿýz_ÿÿ×ÿê×ý{ÿüF†¿ùc;ÿþ¹cL?ä8ß~ÿÿþûÿÁ¿×ÿÁ'Â4ÿÍ'ÿPFÿÿàŒ?m/÷I÷ÿõ΢ÿÿðýÿõý5‡ú,§ûÿ¿þÃiÿMÿÿ~—¥ÿßé· ¿ÿÿ ÿÿÉþNÈïÿÿÿÿü0ÿõÛ¯·Øÿÿœïïu÷ýµì?ßÒô»ß ÿ —÷ÿþ—º_Ûz_è/ÿÿÞÿÿÃÿäóúû„wiÿÁÿÿ@ûí¶uN¿ÿÿ÷éz_ßÿÿÃÿÿ_ô¾?üB ü ¾»ÿìþü7ÿ ½¿ô¼7þÿÿ÷·þµ®ßïG:éÿoÕoûýÝ/Wöÿõúïxúúÿûÿþ×Â_�·éþÒzÿÆ­ŸÕ³ÿ¶f›3õþÏÿÚÿÿßÿjÝ··ÿÿªýû¥ÿûïÛ¯ý¿þ÷ÿ¿ûÿü>â˜ßü%ÿþÛ [ $š°Âl0•ÔŠá턵ÛJé²õ×ížµ°Nð¶ͦÏû{~ºÛWûuÿ®O×{fŸý®½wþÝ¿ÿ~s~ë×ßÚ§ýõþ¾b“b“L1 Ša¥ A†)4a´„¢“tÓMŠTÙ(k Ù†)�ŠM°Y;‘\4íÌ-ˆ~Ø'¶’}¬ˆ8m—­öí´š×îý-³>ÿ³4Ùš¿ý³Eíû¯ÿíîOÿÚúZü¯¦ ðÁ„�yXÃ&GZiì$UÑ¢�l1LBaû°Â»§AÖÔ&­‘°\-4àêJé ØÂ 6’i…Né±±\Šáìr+‡il0–c_l+ [AÿÚKz]¥úÛ[f{לÿlÑkuuòÊ„v–�#»B  0B(÷žkh0‘í£<2v ñ +Âݰšat›#„TÂtÙ+Âì$ƒb˜¤h6)Šb“M; …ö¶’a´´äW ~Á*{I;öÂÚzê½DDs°,› a2¶9XÚa4R¬A"²(SÆxs» &d¡.š°‚i±I¶¡Â ¦Âî“ BzºÂjb¬´‚»ý]Qns: ÄB)Ô÷EdQ톋"Ñ\;`�òåi&ºÔµ•Z +ˆäkH¥Ö×èhDa-/…ÁK_h Ë5nâ ¸qþMÖ‹Çi9]HC³ #½IV³G ÂÒ}<²Ø¿õ쯬� NÍrÞ‘Ø×Ú^½U®ÎÆAI\®=ÎËz"^9ÚR§H~ûU믩e«ú}þVÒ¯ê£â?¿4Í‘Ï6H„¡¡E|Ù�O$2f¢"†™©‘,ÖÈÌ”zùÅþ¡4k¨L¢Â6�aò!¬Ô5ä‰ÁÃ4‹˜F€Â5† !&g ‘˜0AÌ&CFÅ3ŒÐgA’"ìÐd1MB"H ÎÌÙÒ “�’›õþˆí¤á!«- ´ƒrÀÉœŽØA6¨xA6…¤Èù6‚} mU&Â.ÈüØÑñª #CÖ5²5&±¢à–òT5‚,p‹àŒàÁ#´BP¤d4l`ˆ@d$È¡•e“" ˆ‰ RfgÙª:™ÍLïïÿMã µÒ´›w„ëjýtF:I¤­]–„Ã29¤é8A6“¢,4œ ›&ÐÒa„wuMPBÃA ¼*6M8Fƪ¬4kz5²ˆ¹�™¦A‚]„g ‡™á"<@¢ì¡gÄ&¶f&N(D&…rÏ(Dª5‘Ù®KéÕ¦ÿÖþºöšë„ëKâêôÒ]W¨Á6–®¶‰=--Ü(WJÂN®ÉÒ“h‹m'e�0ÂAÒ áÃBÓXG†“iGÕ „d”&ÂaQ¹¦š6<#G?2>'ÆÇœã!4 #[<Î ˆæO˜ —µÛNú‘Â×û©+Ðén;¡ý[�«ªwºôÿA„©×îízõµ¤Ü'ÇI¹8¥i7«h“ ”–éjÐIyÖtÈæ•„4›ÒnMšI‡ÓI„xi0äx�'TÑ»ý‡ßò0;ÿ¿ ÿ‡®Ò ô;vëQCq�ñR8Z½×k½|U¥¾º~�´´««V¾�+’Š^»«ÒW½(ºVÓ†’l"-°‚ÿÃßÒÿQüÑ2€úoå¹!§¸éA:!ï_»Q­{Ó{ßMºCO«n.õþïºZ^>Ъ}ëïö–ý%Â}ÿ°ÿÿÿ¯×Ö˜ÿâÁúz&U—WÿEìÉëýëúß^ôøý»ÿ[¡ñõïÔ}Óº— n¾Ö—ü7ÿÿÿúÿ°õõt–ÿéÿÍk_ÿƒÿ¯Õ¿ÿþ¿–9Š,r3ÇöÕw_ÕúA{¯ü7ÿÿÿø"Çí¥·þÃî°Ãð_ÿÿÂ"ì^¿þß·¯ÿÿ®—þºCãÿòÆÔ{Qÿÿ‡ÿ¿ÿ¿Ð/m+ÿ-´°þïÿÿÿ‚,ÿ†ÿÿÿÿ_ýº_ý}´½´¾›ÿëþýÿÿá/b íú b°Ýi}ÿÿã _ÿƒÿÿÿ„w·_º‚0ÿü‡ÿÿ_ö’úÿß_w¯÷ý}[ÿ¯ Ãú÷÷ÿ÷¥ÿû]ÿÿø ¶Â_¶‚A?þ‚ÿKÿöÑOÁÿ”Ÿÿv¿÷ýxJÿK\"õ}éVßßÿÚÿþþ¿ÿ_ú[¿ˆIu¥û¶¿êé{ÿÿý/lÓzÿoõ_²+ÖßúM‘]ôµoíÿöÝ/Ûýöý¿Û_ÿÑà/æ$¿ï Õý}ýé¾êëÍ«JÕ³ÿ÷òæ~ûzõ�š.º[¶÷¾ÿíWô¼æÿ^Ýÿ® +ûÿ°ý‡ûh+¥ýøU[K +b›JÙ)¶Tö ‡¶ØJë1¶’va°Ö×[ +ÙþÏûfi¿_lÍ7§{×én»n»×ÿÿú¯íëþßûq±¯ÿA¦ƒa„ °I6AêÓ Ri…§6Ø„ÚQM¤œŽlSiZ †`˜ Å[ ‡±j› + ò°Œ8z¶–·[im™«Km/×Õ�yþAÂ}²uþ¿ÿû×ýñB£Hˆ0AˆHøÁ„\VpÁJÆiJ°Új{s͆Š€ƒl'°ÂŠŠ¦ƒ  ›˜ÙSMŠcb²>m¤šmªmÒ°Á[­´´ÓùpîïnÁ¶Á%až¿½¦Ìҵ홪}}¾#–å˜qB"Žxƒ +Xáƒ"/ƒ2qaAJÆi0ª©6JÓ‘Ž‚m‘ÐA Ø ØAi Ó´p�µTØl”$ؤخ ‘{°ÁØa_Â8ÿm>ÄUÆŒ‚2Þˆ6FÐb!J)…+dÐV9WE^w£Ûi©ù§v´é°“a ÷ ›LRM6+¨l4Ócý$þZ r†"2‘•±¦!`‚.4� "ᆴÕ*lŽþ½p®WCˆ2œ"l²÷ +Òô¿®¶—ôµÐl„&ÂWÝjµ!ˆAS´›ATD(i°dt 6‘]Lâ2š� `�“à�¢Í’œÀÎ RDGˆb‰›2Ê3ÈÂ3.!@ÈyÄH"y.f£ÈÜD%5¢µ—þ¾4Âa4›Tôe$ªF†d_>4ká�œ(Â5´k£Xg“óY¨g%Ç€xFpa&8`ŽàÍ0ˆæD˜(2ˆ¼C2 C<ëž¡Šq”ìÌe³ÌÚÑ/’ùDGÈÒÿ¦xŽM„E¶Ë=„E²:[Ô/úÒò8[¦î£qö†¶Ÿ|wõO­SÇýéöÿÅ.�µëÝ+_D£ë¯Ò Nî´•¤é6§ˆóSÃ8 °‡þ¿aÿ®ª,:÷K Eµ–Ÿÿê>øþ²T wTA÷¿‡¿¡»èn»¾¾ÿÚ¶õÅ¥â«^â©ÓÓ¾ïþ+®•îÞÓ%ÿíÿ¯Ó×öë¥×_n—õ¾…‡ýKÿߨòÜ‘ÿ-ÉÿÿîŸZÚŽ½¤:×ÒÚ´:·­ÚÕ6‡ÿûÐFÝmø+u°ý}uýWõaí¶¾Ýkþppÿñÿýÿá«Ëè�˜Ÿå¹$úÛßþõ_ô?þ¾ ÿ„ t°oÑã®ÛüŸ‘ ŽþðE�ü‡ºXoÿõ×ý[ÿÿ÷ÿoÿØþ½øªú_ V©¿ÿ–ä‘ÿoá¿í-°JÃÞô°÷¥è/A?ºHú ÛK ý¥í¥�wÿ†ÿÿýÒÿKÿoÿUõý~ÿý‡J¿ÿãúÿßý}…¿¥¶8}¿Â^—þÿK†‚°ý?í ¸_øƒÿÿuûiá¿ÿgø#¿ðFï_ûÿÿüÌ_ïÿþ–BÛú\;wŠo_Kö)Âð‡}b¯ �a/ýÿÿý°‚ý´þÿ ô¿Ð_ëõá¿ÿÿÿýþiÿú®uÿÕòMw__­õ_ô©;·µé¿^ÿ÷ÿ¸ÿCÿ†úÿªì%þ“ûuÿ‡¿ÿÿ_êÙž½ôsÿ¾´Ù¢ÿ^›½·oU×oÕ]lëýmëþ¾v¦Ÿÿþð‚ý×îÚþÚþ—öï‡ÿ†ûÿü}ì4¿ºMWðŽ=�Ç5ºÖïlÿÕŸöÏýþ¯½¯úÈ$Ù¢÷^ÿׯ¿ý¿Û×ôõ¿5oÿé~¿ú¿ÿîý×ÿÛÓTؤ ‘ãJÓM5†ÃmŠÒ[†Û±V“ ¦ÂWÓ‘ ¬#¸z¶c°Žìºa¶¶“i4Ùÿ�Çþ×ÿþÌÿþÿúÿ§¯ÛUÛÿm{ßÿ<»o_ÿÿv¾‹O}ÕlM6žš†�b�ŠM’ºl* ŠéاN☨l6)4›Kb•´äWA*v•—“µm-vïdúÈc‹©­ý«ký™öžßÿîµþ«W·_þß-Ê çiòsb¥nÁ! ${m5W®82¹ÙÝ"¸+¦È…È\Ã!B ·Tødÿþ�°ŒÈ·))Ú[2XŽÂ÷÷ukMu3j›òl>IS¸û¤>ÿª4L’£µZ®M1Ê_ïîÖôÒ¦µ]Îã!â?´ê>òº±M)#5:y +5;d‰uUü}ÝåsÁ Ú5²ˆ'!&k>xžäb4‹˜F€hˆ,[˜àÈy�”K‚D9ౄ'M‘ÐdÂ8È„N2œˆc$A7�$aõ_õ+�ä-Tm'&§&€˜aêL~ +ª“áa£`jš5Ìôl£eSð˜F¶ Ê0ƒF°Â4»a£Ø`‚/" ¡‚"y „ ÃÙ$vªH!#ò +E[ÈSõOªZº¶™vé[Âh|*†éÙbëH6ƒ8i8Tœ ˜a –Š44ƒ CI†�n 'IÐ&ô…‘ñ¹ùùBh»#Ùi¬ø#@~lSÌ"à0Fpò Bq ódP)@„`¤èá�¤¸É"�È�‘‰tS­z«ã]5ûiz^ÒŽ“¥i:Фÿ$þ!:Z%ì"QI°–IÕÒa²ÕÚJ-žÚN“j“~Ö‚m ÈÅdò5†�ÍBhøÑ²¢˜A£d#@höFr�ašf #[4‚Cl³…‘â1gÄ(P(D!ÌŽ„@d„0pç³Yä6­¸èn—ãzŽÛOºê›A„ôÚ¦í»¥¤Õ^**Þ•%ïÂz¤�W÷i&Õ¬(AJ#¶“„ &Â"Ü œ$ Â"Ó$›MRa¨MÚBÚi£s»#ãy¯ŸÓG‡gð�a”H23‹H `‹€ÿuú·_½úïÛÖ‡�ZOŠ·B¤p·×ú«ûZº__ô½~ºZ Ô}xVº I¸Nâ“i—iZ á¤ØA6Ò†“ªM²Î0“rh¤ÃC]£;A7éƒVþYpù}~’¦þ¼±ÈÏþC¤ÛU¬w [ÿ#…÷ßÔ^¿u‹WÞŸÝíS­§§Úî›×§K§Iû“´—P—ŠíI¹?h—¼]&Vÿ÷öý¿_¶øÿ˾­èºÁ°ÿù +ÿÖ?ô¿ê(mv‡_®�¤Ûúâ¤p­:Ò«�«ë¸×é7îÞÞߨû~>Ãÿé‡úÿÿúì8uþ‹Oÿõÿme¤ÿRÇ$�XädûÖ¿ý~úB‡¡ö÷½{ý;¿¥üÿÿðÝÿá¿ýÿý°ÃÿÿÿK×úúõH{aãúúÿËOQþ[’‚÷aô>ë¿WZ·íÿôÿÁ¿þÃûÿÿømÿm/ÿn¿û]µÿöõÿ÷ý.¿ÇE×øý7ûïÿé}Êwþÿþÿÿÿüÿm+ÿÛKÉ÷÷þ¿úaà¿ÿÿÿ¯ú[ÿ_ÿÿ¶÷þ“ïÛi{þÿÿývï~Ä/ÿb¼%þ–Ú_߃èñÿÿÿÿýºÃ~·ÿþ¾\_�?¯m_ü¡>ÿç÷ßýõ¶­îôm/ÿz_¶;¾þÛÂ_ÿÿßÿûia¿:ÏÿÿÿöÛÛ_´®ÿ_·¯ýÿÿ×ý³ªs t´›ÿÂ6ÕzÿvŒÿÃé¯ÿý¶–Ð_ÿÿývÏÚO^Ùý[Éåöë4m¶¿{fŸû}m¤ÞN—¾ýý[ë÷ÒöÛó‰í~ßýÿÞý!Ûð—íÿÿãMŠ´›IY…-È—×´¬¿°ÎV’ö•¶¬4»1®ÙþÖÞ›m[KÝ.Aýš+¿äe¯Uýµÿévÿï¿¿m¿ý}_û &)ŠA ©°°ƒMi1M±A´a;H&ÆÅ â­X«A+i0ÍÌ0JêÒm-†Ã ˜ó«Ùõßùù³ùé�yžf¯¶Ù¢öë4õ÷VÝoý¶ýsŸëû¯ëïQ ®ƒHÖR ÓR¹„\4{±L' b“¶!a’ˆam&›VA¶“ÅA„®›AlTTRw ¶[`Øwµl0–Úw{ òa„–ô˜iÜ6ÌÕ×ö~Û3KÛfklÑYÅõúßuý}¬›©¡r¸ÄT(Dr5ÁŠ b�’®sû  …¦¶¥¦“ ìW~šlli­« 0ÓMŠc ¤º¶V]6ÏVa«!ŽÝY…î¿k{ÔhFŠôÃ�„ÉÌì*Âi¬9î\óm8E»L0ƒ 4Ø„Mi¦Ði²: &š 1 Å&¡Š R Šní&5†Ãd\m “OIvÒ®us%„â)‚VôìÕ!`ƒkH®;žØaJÆSÙXx 0L,0VbšA»ÂM´“OA&›iké']_,•dæh�¡•ÑaOl1 Ù§‘¡£Ûb«¯×Iz¹��DF–ÝZI.’I>1»JÒÒº­.a˜m„�*m$®º`ÄdI,Å�ì‚ô¹fÚh0L4¸ˆ†D‘K�§{qù]DvM‚eºwHªSÄì*;RÝV ‘6,ïi?y]Hgmœ3pP¥R ªZ¯J?½Uo¨PŒð²º9ÙRªwzkwÜîš^di #FOW[;TÈ"Ì”Öÿ^ýоƒP¤›;OýOÒTõ{I"#Èß•ÖëûýÝsŒê2QçC;Í2aªëo×®ºåSúßü„ÆalˆÍ0ˆ³!<2F`Ïæp�]¢@d4pˆ’8h„¡r'#dt"Ld2"#Hˆju'´•?×µó²\Ⱦwè|j²g#¶‚aª£ðiªjKÏHØÓ ‘POØè4k1sXaÃ(Â2| ÌÌÌÑ 3¼O—;b°ˆN› ˆL˜ B,gˆ†2&t"3"^Uþº¨_µij‰u—Ki‘Ì)â<ÒnLô˜am…DXrhL93ƒ8 ´›I††¢¶ý!mS}#KÂÓFÉ™Á4Ñá„h ¾ˆI„G‰ †H˘ ˆìž0<Ùš ˆ+CÁºGóŒêEHÔêgy¯ÿ~ú¾›IÞ´¶•'„ë ·I·„ÚÚN“h—M¢^ÝÙhM„F>ßVZöË8g ¡…DpÂ40“i7FàÐL�©¤Ú§„5Ñß Ç’›N!àƒÖ¤\Â5Ÿ˜JÈIšÎsÁÈ@`Èhá"„bD|ü‚f‘OÿCÝõww_t­­éÿþ´´›ªÝ¿×¦½%}¾ŸuA1 ×Z–„Ú´ÒnGnÏ´Ÿ¹9Ý “9M¡i0Ú­&Õ9ò~ØÓ áÖä'›ù1™á@Ê6 ¢/Ù%bú÷¯«iü}ö÷v½[÷CQ]ÝÝÿ‹h[}ÿöÕ7v›­-Õ´ªNÒ\&ûÆ·wD�<¥h“Ò°ð™hVg 'T˜am²Ð˜i<š>4ÂjØI‘ù¾hÖFLÞkÑ`_×ÿýÿ¯ø*ßú¿Ñcÿ߯­kë߯wé½Õ_úkõ餶ëJéÔU&á>“{ºú©ó�\/¯ºßÿÿh§}øÿðÿÿávÒý´°oÞÙõÿuÚÞõÿö¿¶Ý×ý~ßOÿýÿúî�K¯ýÿÿöý[ÿ_Ý ÿÿé�/ío»3ó9ë¿ýÍú­÷ú¯^sÒÿý´Ÿ<Ÿoþ÷ÿÿKg¯ô8{ 4ÓM4l$šiÛNÅ ÛI4ÓM6!6“#ͱA�´­SÒdGna0Á+÷\Ç{e×°×ýöAöªÛI�Ýéœûïÿoêûõý/ú*ÿûª‚_¥¼D4HÁ„U¢u+>0Å$V4{dé„Ó +x±VU¶›PáRi°M0Ò iÚ ­ƒ BOj�lPM8»MŠM;Xl6‰Ô¯‘Ò^é5ûOþÏû úVöÌÿn¶ëöÖÿÿÿÿ\â帒ŠüŽÝ81E'=èŽA„Á4Høñ…Û&¡¤Ó töÓh&Ðl'´­; iÚl„¦È¹M†Û +¶Ù�†Tí%t¾Ì'®¿ÿ]dŸ�à[å™T[‹¡G°�ç™ ªŠ Ûé¦aUÒi†)ÅÓƒb“í(m¤˜M�´­&EÏú|CaþÁö—®"�e”}¤‘L!•X#® 6¶ƒ +Óds±Wl&)Š¤Ó ¦�¦ÉÞ¦›k¥ÕÂ^MÌ! h˜E å$höʧMO7wÚlBô—â"#��áÄEñë¬UÂN;´®µþ­¥i}-B Š ‡-éiK0¾M‚0Â6ÒoˆŠ>6)†QÁEn4#ÿɹ$[ƒåz0¡L’¯ª–ålì&vk•}ß2j}�,))‚„Ê›;)Œ„”}ÿO½"^U2¢ÎÐù’¿÷ÿw·Ó×þMÙ4;»Öôï×+˜�FF¢+�yµ|*ä“ÇÚýÞWFg„ #@d2ŒÁŸ˜3 Bx ¡š<�‚ˆjì£)Ìù�k4ÉR38êy&ÊL‰Þºþ>?TÓ 2:©¦©ѱ¤-Ï™ò�ÔkaÃdüœ „l Ï ¢Ï`ÍxA„ Ds83„¥Åg ˆN˰@Éó(Í‘ÐR@r\gÐLèGTm™³«LÊžBÿça\*gŽšLñ«¤ÚM„›IÕÒtl ›wDvÑí¤ÚhðÙ3§CÐÐOA¨´�´l ›F¶©¦˜EÛFÈF‡'丄™¬0�A„#84BLûYj0ˆJžuÎ"6 Ž„TÖr#k98ê¿^®µMõj*)kjûÂaÚZmÒ´‰p„é;Ô¿ +IÒm-pÑÚ ´�-ÞL„ÃCÐÒwP�æpFÂ>7Â4>3Æ~¼„k #»&AÂÂHÉæ_„™‚1â�*$ ˆ2È@¤‚#lêòÝnýßµiVõÒnŸúuºwÆ«÷÷JñIÕÒn +Ò´�'wt›D¸7Iåž–iYhO†šT“im’ÀƒZaR <&�mI8´khÖ5†QF¶g„n„k Ó0gàa„ HÆGf‚KˆˆB ¡«'å®î—¶ë¤1ÝÖº�µñ¿Û»¥ém©-­Vï¿¥¯úO^»é>“JéARt›I·z³æK³ì ƒ¤Ú"Þ_M„aÃDXi:¥¤Ú“ih-!Ú>sÒaFpÍ0˜Aÿÿ齨8kÓi~ú ”¿�~ñÚC[[èkÂÿ[wz÷_ÿ_zTûßßIû]. ºuµt›@Ÿp©iZ#“i:M¤éi<™Æ“i:%moûëôÃaÿÿü´ÿƒÿt»DÒ�õÈZqÿ¯ñþ·÷ëõi- &Ý´½Ôw¦—ýºëÿQÕׄÒéij+¨º%­'ACýoúì6ÿ÷ÿì?×÷¦¿è�]Vÿýü}¿^Xä_ÿûÕj0·÷R8Um§Þ´7µþë÷_i¿í¯ÿá°ßÿÿÿ·þÝ~ÃUûê¿ÿýÿÿêÿnúõô‡ß¾ *߆ëË­h.ë½¥#…­ÿûh/ÿÆÿÿÿüüžõý¼‡ÿþKßÿÿæÅÿý{_×}Rÿý/ÝGVý‡×�.®<1áÿ#¯Oÿb¿]†Ãýÿ×ÿ‡ý'ëð| ¿ÿÒÿÿÉïöÒðG½ûÿúÿ×ÿô¿Õ‡°~�ÿÿF1öÕ÷{þÿûý¿ÒÛ°Þ—ÿw Ÿÿý'ñýÒ|$þ¿ÿ£»KÿðFÿÿ†ÿú°Öÿ_þ¡.¿¶Î›»ú_ÿþÿ¥ÃëwKÿü%þõú_þÄ/A{ÿ¶—ÿþ‚ÿÿü?ÿøFw†ÿÿÿë·Mþcý½¿ý¿Í?ý_W{_ý»ÿû_Òÿôjúý�þ¾Ú_ÿ¥ÿßþï¿ð�a°–üˆ¿ÿ²ž–é6ÙžÝtrot›mÿëõë«*ý¿ÿßU¿­W[ð—¥í÷¶üTßÚÿÿׇÿÿK–ý'þ«mÚJÚL3s %¥i\=ºlõwk°ÏzÙ…uý§ÚM™úW¯ûfŠÿþÒÿýÿõ_ßÿt—únÛ_ß»×t°ÿií4îÐH6Òb˜¨iia�´˜¦D¶¬RÜzV©Á—'Òa‚WA³Üˆ8kû [AØ'kf×}ÝíüƒÏz¯ÞÙ¢ußöþ×ývúóËï¿},âuÿÒÿ•ôHüR(ôÄ#\„ Âdtì•ÃL-4ì0�i´Ã[M¦ªÒb› 1P´j›ÅHá±lm¤š§ ‡"c† ì?1ØGvGö¶öÖÒ<Þ¿oÛ´þé³E¶¿~ÞÞÝúÿš·öõþ""�yrÉ’¢b +ÄyV(&! Ñž°ì0LŽNÈá4Á¥¦›M0“ Šé6ÓŠb¢“ÓbØ Ú]:zl3’{ å\µÒmXg÷¥ô¶Ó³ÿgæûîµëÛ_úþ"9nRD£ �ͨ\÷M…M&Ò²+¦›A;ÒiÛšlS ÓM4˜¦)´­;¤ÛÛ m¤Ø#ŽäQÝ¥ai}ŸWeÕý¡¡‰ÌË�b•�ŒÓ ÷G¶ '«¹àSLPM8¤Ù ŠØ®ÚÙ³mY6¦¾´”BN"Ù\žGÄCS¤pÔöÁ¡ +a˜&�ˆM4Ø L$a4Õ­ÛKÒꉸ„W-B;KAk¨Œ1J ·IA“8J£+žÃÄD1 +?þM”‘JálÒˆ3%J¡H´âïVWXÎÈ´ê—¨P¥sAßuüš4w�¼Íš2BÅÞ½÷ÒtÕPfAˆv‚Gd㺿Š^þ£»í&v®;(‚…3ÁNÁßÿ)Ñ-ò¨š_ö¿}<û&Êõ2ó±ú~£D¯ýßår‚0áùÁž2O00ˆµ‘8‹Ç²<9Ï©‚=ÐH=Çš2 ò‚:ä4VÖ«®¿•ÇC”/ÿèÜÒ ýQÖTÂ4SFÀâ3Æ�l#[Ö5–ƒ;FÈG²Óš$f4 ‘âœBB6Gˆ£6gAš£A�ƪt%Îf²²dÿõÇi®“¥û´"-´›dæ› ŸÒN“aÚA°…¥« ˜jºFÊ>Q­£[M0š„F†i¦�a£fBy¬!20˜D$Ê¡ì— 3°±¢!r/?%Y>Sæ¦kz¯ä“ë«ûü']¤¯zV’mt®Oá'IÕ´ô¡Ó«¤ ƒalÑîƒ6I6šaÚO¤Úá4nM0˜MF°Õè„ó*3< a(Ø0�‚hdw“£d@ÆH"\É#5’e!§úô†¿éÚë×{ñU¦¶öëÅ&Ò}-E]/¸M·A´´Ëµ´¶YÓa–v}¥l�(ŽÁœ4›H6Ƀ<œWÕ4ÂjØI‘ù¹Á>&¬4k2 á”g ùÈ0ƒD!pÉ��y±œÍÅôDéÃ&ˆF³ÈC%� Úþ¿µ}ëò8]êе·×µÜ¼UÒoúoéëIý¿ÒÚé§JÒºÝÅ|*žÆ—N•«è‹ & †ˆ®ÕÝSFæçäl Sˆ¦3Úá0� ÍÉ ×4Â5˜\„!&E¦�¯½o�Ès½aÒJÝuÝ6Ö‡v�®í~–â¤p¿¥ôëû^ª­ºŽ¾»M««IZOÂp“î� +î™ãJäÏI´E¶Éú ¬™Èí«{„ªM¥™ÈÖGæú4?ÿ¯þ‹º‡.¯úð×ù @áûî?ëêßù.û\uþþýu¥ªãÓu¥oî“´©7 ßÕ¨+KÝ\*M¥…IÕ–…ý}º×_½[Kÿöþ‹N *ÿïÔkÿþHGý»·ÃßÝ߯㽭E[§kV·]®ÞŸÝ'~½m'Õ¥Ò‚0ÿýÿÞöÿûÿm½÷^—ÿõþ^Õ~ÃÿÿÑ@ÿJ·ÿÞ‡zow×ÿýw¦×ÿ×ú ý)çü#½ ßÿøoÿa°ÿÿ×ÿÿëÿëáÿÿ¯Ë¬?õÿÿ__û§ëkúõët·ëøIý´¿¯ÛKÃßÿáÿðá¿ÿðFÿÿÿÿûÿëÖÃÿÛÿÿÿû×üW×éµÿñý¥ý넾ý¼7ÿþÿ°Øÿôßÿÿÿÿ†ÿÿÁ{k†ÿÿÿÿ÷÷¿ÿÿ×ÿÿþ¾ßÿìTS½ÿÞúþ=·ÿÐKûÿþÿþü7ÿþ–ÚXoÿÿÿÿþÑÇ¥þ¿ÿõ·úö×ÿõöé®öëüâvÿmÝô¿ÿ÷ÿÿÿïðÿÿè'tÿÿÿÿÿzÿðFÿÿú_öÿëý}ò3¦Û×Û×ëóªÌ.ßÿT½¿Þ¿oÿÿÿð—„¿ÿ_ÿÿÿ«uþ_ÿýí×�ÿ¶´WÿöÌýþÏí½{úM¥íß{w_ô«÷ö¿ÿîÛÖÿÿú¤;ÿm¯_ÿúûu¯ú ÿÿöÐ^¯Ø« &ž�§"¸i°Á.®› +Ùí´“áÛtë{gý.ŽM™§_ô¯Û3M®õûwÿÚäÿÿ®­�Sÿÿÿ÷ïü6+ýýºÿAz_ ;§t˜Táa6)­† Bcm$Ó v“i&¬U¥i[´•>Òˆ{ +w˜›VÌ}¶ÿVÌÓÒÿÿÿú×í½·÷^õþ¿ßë~‚Kâ"#ˆÊÆAp`„X„ íÔ6ïd÷a?ã–ŠÑC`É"(E!†(ëO‚©áÏÂa&4»­6i°¸1Ã"M°‚Ù:NÓd[ Áô’¹’Ë+ú*1`„4!„(ÐÜ0ªÛØM? Zù6(ÄEˆˆˆÒý*¿¯ü(m¤©-Dƒ©-(† ’ÒŠLTdVåb?òl§É°IGrÝ#ÂNM–#´‡ô°¥Rîɼÿ¨½¤ç`¬®g…&y_"QX_ê:zaT® ŠÑò¹JzKÿÂ�pS<ì’ê¤;Wã�•c»¿^˜SJW#©Ú%ÿU_Çýþåsæ #Xa ¾pÏ:'‹˜)Œ¡·¢È•“¬�zd¸�d´"ˆ'©!©)Û«ÕwªM„5T >��šJ\Ѭi¦�f9¬2Œ&¬4BLÖ!,� q �@V Ó!ˆFѲ‘&F0°Éù=KC$È—ˆuäèqê‰=+I§Â¢1éZ[,é´0®A´G[aÚA°ˆ°ÐMÉŽMøuL L?†�ŒŒ•¨Ö žLö˜Lœ‰3œÖ#˰�dŒ¹�’#hÞD( dXd!ˆÍ-uñÓK¥ïÂu×ÒmŽ+pšu´®kn)0ÙhM&xÒm–‰›I°¡o&p›aa£ÛIäÑI†… ƒ &¦v7=#t#`hÖ „{a„k £@ÉqMŒ†dx‡˜o7ž<ž>ŽÐf™Ã=• “2‚ HÒÓûŠ~ø¢#ë×qºnšVéÖôŸÒ¦Öß´¯‚mÕ¹'PL6Òè*M¢]KH6ˆÇ´ÂP‚Òl ˜j¡Ò ¤Úš¦šÃTö*œñ(MÁÄQó9#;F€ÈÌ0�™™óÑœðG„ƒ"%ÆDȆŽ2#É…õõÞ5úm«_ô:ßCÖö÷{#„÷Uÿ¦è5úNúMÓi:W §i}+Û +•$é6‰ðgŒ&x�4ƒap÷kaE†M²|©6i6‚m4Óÿ?*¦���ÓM<&Q(E.fr×XåÕÿåÕõøtÛü±ÉRßÈ Í~—h¡»úî.×û®úŠ·�®“®“ø¥¥{¿ZWOÿPMí»´‚t�]3„y¸~LéÛÖ †“… 6mi ðšA†“}*ÿÒKÿa¯ú�ú&b­÷ï, òÇ#/þŸüuöëªÝ÷^5·µmÚÚwVÚ÷KAn“vû¶¾4í¿´°˜…úZ®º%íO©i?ÿÿý¿þ«úÿzÿüÖÿ×ëõ_ÒzÑE½Õ¿Öïþ“뽤×]½ïÓjŸõÖí¸}$Ÿýÿÿÿá‡ÿÿÿþ¿ÿÿÿúúÿííúòê·Áª·ÿëþÝcôßþ=ïÿ»^†»×]u{¨¥þý~ïÿÿÿÿûuÿÿÿÿ‚0ÿÿÿ3Iý‡ÿÿíÿ®^õÛÒõƒÿÿþ[’šÜqÝÝ÷ªÿÿÿÿ†ß_»þÿô¿ÿ÷ÿü ¿ÿÿÛÿÿ ÿÿÿýÔýÿ°ÿÿÿÇÿÛïÔ~ßÿ»ÿïuûÿûu±ÿÿÿÿôÿÿþ=þÿÿÿ÷[ÿmz^CÛ¯ÿÿÿUýÿ_·ÿÝûu¾¿ß^߯_ßûuþý¿þ½{ÿÃÿÿÿÔÏÿé¿Á,7ÿÿÿø(_ÿÔཱིEûmû®D{uþÚÿÿõÿúúÿëý}¶»ý·[ß_ÿ×í®ßûk× œÿÿÿð�F�ÿàŒ?í«{ÙýþëÒuý³Dõíí¥¾­þßû×úþëÿõ¿ë¾ÚÿûküW~ÝtÚúíÿÿÿþ–—ÿøIÆ›Á‚±i« ¸Šé'tÚ^› [KÛ?Ù„õf¤Ùþý³?þ×ÿ_ºöÝ-ûÛzÎnß_ÿÿÖßë+Òßÿÿþý-/¯ýÓa2 ùU �Ò 0ÂI°ÒmšjÅ6’¦Å1¶“ZL0K/®Ã ¶—ý„ ³ÚÞÙžÝ~Ú¶f­}-×ÿÞ¿}¿zwõSŸÿÿýþº^º_iqÁ‚"˜0@уF©‘ê)�݆b“¶ †iôÅ Ób“M4mƒTӑŠMÐJ¬0­¥ÖÝÚ·KtÃ>›¯ÿ´—õµëÿ¯ÿÿÛoÿÿýõåtèìt"" B¢9 ¢‰Ø`‘î�nA±é§´íXa¤�†!6�AºlaŠ ¥m¨cm%OOM´´÷ïÛ¦¿ÖêþÓïþßõµÒëí~"+FAhì« B”T1 +V1L2PLPN)¦ÂI¦ši¦I˜N“†©¶[I¬0ÈÇj©í—9~ÙʯŸuivݯònèea,1 +V9âŠâ¬®h¬r®4$ü¬}Ä; =§M7a6MS‘Ý6“TÓbƒpÆÃÒÒUa›r áúËK1*ªQ`„Ž‚°«+Šš„�ñžEÃ�Øa2VµOOa+ &˜b˜_^‹~D)ŠÂ0ˆå¹�4&jšê"Ö8ˆˆìº_„ô×^4˜*_,àŠ«ãŽ¶iÅ4âŠüGü› rÞ¨ªaI”w(IB…,�WIü¯T@àEŽÌÙÞ¬·â;P‰"è-öíu&Z™HðTÌ„·„é>á‡JÓõh,)/ÃËpE]/"^Þ�éú†�tœ®믮Ù2ÎÓä—ßzH]Ý!µ•ÀˆêIél–-vÕuüÈkë÷•Ϙ0�a„h"|àÏ5»ËŠOò<ˆ‰ÄHÑ 2%%Äaèá�F†AH�k¯§¯ŽµÐ´›H7&‹OI7#к6²s'ÔlyÁƘA£X0‹¶O˜3ÙƒÖF`‘ìÇdO6H„™Á2„L)ƒá`5(/$3¡*þWQ�D�$ØKkzT¸ Úé7»É¡7´Ò#¶�mÃCMRa¡„�È6˜AèØF‡£fEÁ¬‚ÿ»9AÇx#@0‹€Ñ\‹¡VIDäI’Y*¹È�¼ìmk™ié¥é¯úKIµ›Þ�+Þ�N•¥aˆL»I´F?í%>ÙhM¤Û,„Ãv-A?º ‡^“ ›ÏÈøPš5Õ̃90ç‹!›"£0ÏŠO› @΃D@ÍB1„ü˜ÑcdÁ•C ,Ž·-GÛ×öõõ_ÚÒoݦšK„Ò‹¯zM¥éaëkÒÕ½'I†Ë<$Ú#¶“É0аÉbjG *6<&¡4hi Â5‘ùvž“F°Ê4Âdƒ(ÌF€e@Ð2@DB"èU’ ‹I/›24D3:™“õ_¥�½ÕÿÇ·[ú‘Âââ­¸û»êÚ^ÿ⯪¶‚t�¤›D�SµáRnæÒtEºº ¹:T ˜aa£ÛL&ª�m0˜Mž~ØTÑ¡êƒ'‹�FÃÐÐ#Xf™�Q ær×XåÕûÿ¶ ½’:ú¶²3ÿáÛ×× Ðí/ô:~ê÷§~ÇK§w­½&«“„—i4•º‡Vá0íOš Ži6™Áœi0Ùg¤@Íš^´4˜h&Òm Òo¯î—ïoþ‡n¾º齇ÿ®?,r2ªßkî¶Óú¶ãzÖé=7Š^ÿôíW[»i:WM6¿­Ó¤ü—´F=-]&Ñ?l³§ÿÿþÿÿ×ÿõøþÞ¸°ÿYa_‡Mý¯{ýÔ}ë}-HáwmÚÚwmÚ鿦鴽§„ÒÞ+{ÿÿÛ¬ÕþÿÿëÿÿÃÿ…Õÿ~/a¯êß°z·Þ—ÿãÿÈpz¯þÚ®½}×k¯ÛqŽãKÿúá/Ãÿí¯ÿÿ†ÿÿûÿÑ~Ãÿÿoýïþ¿_ôX×Vÿß_úoëñ÷Ýmwëÿ÷Z ðýß×ßÿá¿ÿÑ£ïúóφÿÿØö©~½kíÿÿÿíßÿ«~¿|ºÁËOñûwíëé;kÿì?ûöü?ÿÒ öÿú¼7ÿþÿyOÿÿ÷Kÿÿÿýÿ_oý~ßî¿›_ÿ¿ÿ_é}º¯¸#»ÿµðíÿþÿVÒþÿG¿¶—ÿÿÿ_ÿþÃÿ]‡þ§íš+½ïú½Òïïýµoÿ(N¿÷¥ö“ÿû{õíׇ޶ÒÿÿÒþ +ÿÿÿÿÿÿA?ï†ÿÁÛVÏÿO®—Ýzí™­ýé¿n»ÿ÷¥]´¯ý´¼ú}_~׊b¿Âÿ ÿ¯ÿëöÿÿK×ðð‚Æ›Å2.?‘\;JÒm-°ŠeöU¯´¬÷{¥õ_ö•¯i7ÿ{ëM×½yÏÿûï¥ô…¿mëu¿ëÛ¯ {×mÿ¤ûa¡&í°¸iZ6’pc±LRza0ÚLi«i]¤©§¶^m,#¸m—Û9-¶c¿lþz[í]O_kíûi{_·úþ¿½¯u_¯ëúúûßérÜB¦ÈØÁŠ BG†i ÂM«¶Á: $Ðm‘ô‚qT�§ƒi1O·ši±J©§i6•¶^ÛIoKzëý¿í?�kÿ[¯í×½zúÖç]ÿõŠæ@IDCŒ"H¥t1�x4”«¢­£ÃaM"i„A­Âi† A¡m¤ÃAqI†ÐVœ4“m$ßOM†n׃.^Ãaœ“·¯í.êý×í_^úoõûc•þ+š `†{gH�œLPb°¡Å²1 † ]4˜M6)aÓ¦›lB´Û *w¤›i*{tÙ{m+ì }Ò¶f­[?kv´ƒuDÝó³DP†V¨CB#ÃP–Y/'b" ¤[„G$|aˆG^U´{aŒ4�l1Kӄ쎂 +Ún˜I¬&Õ½„œDFŠåöB"ˆ:ÂEcžÊ˜L& �l %øäß|U’×ꆭ/ˆ‹¥öD*Ãh;Чgqùn•„¡T©Çbåð¡÷Ý'2e¹[&êo‘d™o:[…'ÿ{ðÎÀ ¤c¯‘oR„=+^¥¸-_^“2JÈ&dŸHwË}XY\1�óˆÆ|f³„é³:‘:&6ÓÊL�Æ¿UTó <ìkë„l àâ‚6g„õ0�aÉy:à�0) @@ÁDK" �ea^GQ¨F4Kʬ¡„¦Èm3S"Ù¯]|©côô›i¤›³EYȰÒmôƒ#Êo¦��˜FÀî͆wÐÍ4Ѭ0�a¢&Lôh žĈI†F„'‡›"mÏŒ‘˜hˆL‹I@Τ¤Â#ê«æKÇ¥oI]6<¤ÃwI«>äÏ3i6´“rt,äý’t-ÚM‡„úO£sF¶��¨LðÝÃImÞvÂ4D$Îq ‡˜8�”"„#&OËÐ’s +Ι­×Õz­þÓ¾é?­{[i^)6Öý%¢p–Ò·¥We�;- †M¤Ú#¶Ó ›\š@›ÐL4ƒáQ°0©£çF°Â42ž „<i„ ù™š!0ðM �\ÉœðZsÙ"ÂNE™u“òÏ6ò +ˆ£"5/ñ¾‡ýk½?꪿ÛÒûK­½j?¾êêÚ Þ–ä�:Þ•„­–t“h‹uvZm&Ñ4U°“hŽúºMöÚ¦q¨L"ì�S[×GÊ5†gÂ<ا™«EAàŸš ÁNDò&„#”G!(H¹ÄFˆtRD—þ¿ÿþ;¦ýíkqCCm'½GJÒj›vþºk¯ôšÕ&á7»í¥ ˜nºÛ».iÂM²Ïp†’#¶“Ii8K&Ñ4U¹=¬!j©0ѱ„nh×F¾ÉÌŸB6vÎËùiÿûÿú&$ÿô?-ÁBzâ»[zޤpº뵨é7îÓuïúé5ü”%A=Rûâ¶‚a¼{M"^ Ži6N”4� Û.—e¡6¤ÿÒý^×ýúƒÛöõ]E.aì?t«ý)c‘Ÿð^»Ózõµõ¿ýt?л¶¯Z�îÓíýmÓ¤Úë¨õ¿¤Ú%Iÿÿ¿ÿ¿ÿíÿ÷ýSì=‡×«z�¤:.¿¯»¦ÇüüuýݯºîÐÚý½µî+Ðþ¢÷ý»Zÿn¿ÿþÒÿðoý´qé/ÿaì?ÿ÷J¿üÕü?ÿÿÿÿÿñáÂÿêÚ¦Õïý&ñzýëÿûh/ÿoÿI½ÿ·†ðßÿÿÿú¢.Ê>ú°õ×õÿÕ/ÿúØpÑc?^Ú[ëÔ±ÈæÿÚÇûþ»uî_ý‡ëÛô’û»ÃáÿÿÛ¯ÿëÿÂÿÿÿÿþªÃaÿÿ×þ© úÿ÷§ÿõð‚÷ß_é�Â;ðøo¿ÿÖú¿Çÿpoð�Í/ÿ(¿ÿöèÞ ÿþÚÿ¿°Øûúûïÿ×ÿmÛý‡I{m¥{ïý·^Åöÿ¯¿é¤ÿúOÿ¶�K †ÿÿÿÿÃa¿ÿÿ¶f�¿þëïÿÈ×½J¿¤Þsòuî—¯Ó~ÿþûz_éú_ÿû#œ8{ÿý/ÿ°ØoÿüÒû i³Þ¶a{¤ÞÈ?ûÕ³?í/ß]¶é¿õ®öÞ¿û½¿Ûýý$¿Òÿô·ÿý”MnßÿìWúÞ?ÿúOاb“N;VÒ�ƒ¶í9û ´›Tì¼×av]mŸÛ?…þ¯«m&í}ÛöÍ>Í~éyÏß×ë_¿U¿ÿÁ%Wvÿþ¿ýÝúý}/µMvÒi²C¦ ½6�h6*Ò  “bÓ¡¦Å1]­¤È¶×/:L3“i/MŸüÚ°’¶­™¯ºÿ»Jÿ×ÿý¾ÿõóžc¯þ·ën›·öÿKå¹¢•S…ì"¸¬*ì)WEd0LBŠM¦žšM„ÐM;a«L4˜¦ Š  ¡§±I±±VÅ0Á[/&éku˜Û­þïûý[ÿþA+¯ûdëû_×uìéæ?¿ëõâ"*çpŠâÉå(˜LBa0ÁE*´Á& L0˜¨„˜a¤šxJ(6”8iÚ°Økl„¬ˆ8l3seæÌW¦»a£ººl^ô¾Òî›sOÿý××ée”•0F´ ã5*ñH4؄ӕ4˜Té«M… Ø'b¢´h4Û‘ÀV–“zÚ kI7I†ra„­+«1·Ù�´¯»ÏÞ‹Hb•µYˆŠèa0Hýi aš…<9ã­°šb˜¦iÚ;´‚} “ 4˜¦!ZVŠ‹b›A*Ãaÿ¢×Xʈ0�„""!“ÑgX1A„Ä&!0™&˜i Ói Ÿ´—¢¾1jÚIkˆØ®¾ ›]-Ò\m/°Á JàĬZN2³ÿËrù7UÊêU3$ñÙ¤ +2Œì‹ë‘ ì6JâÑ +W Šêjþþ¶“Öd¦)¢R3@‘]ÈY4ïþ�îì#Ä)’‡TÊæÚº¶‚uõ‚aºN“ÿÿõ ÿþ­¥L?ÿo×ÿÿÿÒQþ]aÿ.Cýá»cî¾ÚÇí¨ýÓoôÚ‘Âß_«[¿N×_í7û_ÿüé8nÿü‡õ†ÿýÒÿÿßÿþÿý‡ú_ÿÃÿ¹iíú/ +/]/†¾ûÿ}{ÐöúÞõýzZ_úþôÿü �´¬7ÿ÷Y×ÿÿÿ÷Kÿoÿÿöë¿é¥�_ì?ÿÔaãúïõøûOõÿÝuü%‡ÿý-ˆXÿl ´¿ÿÿÿÿÿÁ¿ïÿðßÿíÿÿì=ÿúaëÿ~­ÿÿ�ÿ¿÷ýûõô³¢wÿzÇ }{ßÿÿº_øoÿÿðß™ïÿ£»KÿöÿÿØþÿþ½þ·ýë~õÎ/ÿSìmÿíPZúÿëÿïÅ?öÿÿÿ†ý/þÒÿÿÁ¿ÿðÞt_ÿÿÿÿºFÅßkûßßþºM�?ýéÿVúÿÿïýÿoÿ÷è%õïº_áÿÿ°øWÿÿüÒüÓۯg×®–ÙÿÿÕ�~fkÿío×Kÿ_ÿ÷ÿlêŸÿÿ÷Õ}oŠŽÿ¿}ü7¥ÿÿþ—ÿîÚCdxÛA'i±k"¸wL‹Á…´ýdAÃmµ´—Û0ž™ÿõû¯ÿúlÑdéÛÿüæÿ_û×½~ïÿîú_ß^Ýz_þâ¶¡Öša… „ñTÄ$Õ4ÐllU¥vœm¤ÚpØv’~ÙÊÒý=lÇ»köØ%iv½Ÿÿÿë­zo§oµoÎ}×ÿoëþ¿¯¯ÿKÎÜÔD%h”¡h0�„ŠÆ� ÓFw*ôÔüà ˆASM¦*Âm=„“M« ÓMSN)iŠM5b›®D¶¬0Io¿ím$ý&ÌüÎzlÏÞ›×ÝöÈ>µý¾½ëÿÿ¬,›è†ØùC`„DCŽpÏâ0ˆå ¤˜jÒѺ¡¨F†BfpA£[3Â.áßõoÆ?Øj,?Çÿ[ÿôXäQ–ÚÒ÷ëÝ߯ãöµÞݧWv›TýÖëVßz·N•¨¥h'u@›ZDá$Ú^ÚI°ˆÇé:T“²gM…DXi: �&×a°ÿaÔ?K_úÿÿÿÿÑúÞÿmz]:õí +— Vâ«k´õ»Óî¶—ïJôÖºN•´–¨¤áRÒ¿ÿá°ßì<7ú¯ÿÿúÿ·ý/þ¿,[ëðßÿùc‘Ÿëu«{ÆîÔwûµ®ã{zÕ´=:ÚÿïØêéÿÃa¿Ãxoü†Èïÿÿÿÿÿÿý[¯ÿØõþ?úÿè±›ÑnV�¢c’GßÿEއû×õë…õ½7½jG ÿü6ü=†þôÿÿÿÿí¥ù=ÿàŒ?\‰_þýµýÿÿ÷ñaÐÿÿøû}SoÖ¸øîü7_úí¤öáÿ‡ÿKÿ¿ÿÿöÐ_¤ÿøAm °—ÿ†×úÿÿÿÿÿaÿþÝkç‡Úÿ¯ëÿL?Ò_Þï¾î÷¾—ÿÿþÿñ ô¿ý'b¸Oÿ†ÿm/ÿÿÿÿðßÿúø][Zÿÿ]‡×õÞ›lé¹í#‹³ªþýÞ¿×·ýgÒÿô–g +Âÿ~ïìBÿÿÿÿÿÿÿm/gÿ*úÿà¸/á¿ÿ]­ÙŸ¥¥½^Ù¢½½½û_ÿí/_Õÿ Kÿ¿è¡/¿ÿýÿoþÚ Ð^6¿ÿþ�#GðßÿKm&ÏM¥ut­­Õ®“}Ÿî××zÿöÍ7ÿÿÿõö×öüòÐßï_ÿõïÿýá/JÿÿKÐ_á¾ûØIA(1V“j­¥¤Å]6\VÂNaHƒƒ^öÒ_oÛJÒù ½ýdlÍþ¿éÚ¾Ú^Þ»gTïÿá.ÿŠbº~ÿK×ü?þ)bƒÂcˆPÛA1A…dsdq SÂi0ƒMÚVšÈ¶Óbƒi'mÚkÿ^!°íl?oí%]�rÿsE~ôÞÿýßßÿ¯µºû÷Iz_ÿþ\`Â)bhZŠ„0ƒL ÑFŠÊ44|lR}°½„Ú µM6O*Mƒ‘ÆÃ#„š±¦Ú^›kì5Ì~ÚÝÚK°Ïö»f}¤Ùšÿøeí²uþÕ×Ú·ëÿç“÷·Ë.§+'TŽz+Š‚±Ê»M#Ùõ(ç·*óÅ„öÂiÓA†JéØ#Ž“A§h4Ód,Å&­ ˜ÃiZl0–‚M†ºa…[Ì$þC-„µßu]½í5»_ïÛ¤Ù’tPÄFQ¤°�ŒÓG¼óhÑçva' 6 Fé´M6*ÂI±V“ƒ ±è4ÛMІkNÚV­‚pÁpŽáæ<j·¥¶›g×Z +â#B");Tb!ˆR¹•0Qk�‚bƒ 3;h&·vÂwMé´i±A‘^Å;%{Mm$ØØúëˆW+™FE¡�†„C‚>N¨cI…TÂj‚vœRlŽa~¾¼+ˆÑ‘”"#VÒÐZZâ4¤ÚW^–W0Å28M¥õiƒd;qí¥ °drˆA† ¢?ü® �Åf©+aB�ëšâñ‘”w‘\¾L×ý‘�(È¢P¡ÝÃa„¾vXÑâSÁ7kïÝô�RɰX…k%¹72\�cþU_¨ê(øÓ³±‘ÜGjó·`™XŠ‘uùNõ¬øíi?êšáB;åp"Êd)ÖK·®¹’5W÷Ý^W<\Â5¼ DsD$Êâ>'â9�P"/Ê=ž3Ù:¶òq¦E™¨ó¦º}é:Ìò$„ZkßHj©0ôƒzu£cä}GÇ£[b3ÇÞ�aœñ¢h† 2FldñÙ.5'£0Ѧè2£'FdJF¤(û:¥QTÄGþ¡Ò½-–{°’oi„} Û%Á5¾�l=2c¤›A0ÓM!sò7Q±ªw Ñ¬3XÏFvO˜3ú5†ˆL#âÆ¢lðGB$È•—²R0É.fÐöaVjdj½sµ/þëêþúW¿Ž•»ÖÞ•¼*“a[Aœ4œ(Ai6äÎÃ&á4“a *M²cëH7‘¦š62y0�a„kO@Ò™4BLÂ/æ v 2-€È¥Düž„ô&6j‰–!¶_[Š[¿¯õzM¿[zÛi=5MÓã«¥rNž�mé-�T›¡v’m–ˆí²gL44›I´,"Ý„ÓH[Tѯz453Â. ó8&aÁØF€Ì#<ÓFvE°�0Á*"²Öõö×o�ÒÔRÚíë^‡®¶ô¶ƒZÛô•ú Ý'D¢“¤Ú% Óh·µ½·_9ûÿþÒÿíõ½o×÷þÞäÂð¿¿ú\Bþ+  °ÿÿÿÿÿÿÕŠNEpÙ» %½ÖÚ[I®Ùí+³äÙšm/´–Õ³5þÙšõöïn¿û^Û_úÿÊß×÷þ¸F€¿Fºïÿ×ÿßúß׆M…´�1IÓi&ÚUöìPNã¶-ÖŸVà °Âö^Õ´ß ûgït¿»zÛzÿKöûÿUöÿýGõõßÿ^ÿÿÛýµå}0GT"H¬b +Èæ{a’XA¸h-µ†(6I¦Å&ȃؤ“†Ä*‘]¦¬Tˆ„ÚJšj­¤›gëUý[í³ÿç;«Ó¾ÿõ¿üç^Dÿíÿ·ÿOÿ&ÀY0Œ´B!Á‚ BEqGl$h†0Ž›V§`œ Ó &ÚH5M4i[AZ§h);ÌpÂÝ “´²õ„aåÖ­ž¿ý�yþCÿ¯ÿéwÿߺÞõèG-ÄÔ¤åV¤khÐÑžN)‰‘�†i'iÙ˜[„�¥¶”S¡²>lPM;Xl6iíÝÔˆ8i¥ö·[g¿öÏÿÝ6¶—\DF‹r“•ŽBaA4$l<Å4Å0©ª †¦·O¦˜NÕ†”Ý&šwa›T튑2›i6 ¶«õ;Šâ¹9Ï«(SÒBlŒ"i‘iôàÒà +ÓMZa&¡´˜Ãh$é%ⓈŠNd”L"„BA„CR°£ˆA“&‡I-u|²)ô?Òÿ,«gÝiqïJë´n›KŠl…!d$å2•4…œEGÿ&ê‘/™Çd®[†Ì‚A=UÔÑÿõE˜��“Šù“5-ÇB×êZZ…$¾¸¢�éu„{‘�G†v‚×ògû¿Z´ƒY^¦fΆ™&Gc_®×¨ô;Êô‚ Â3ƒD$Îs@dŒØÉ8ÀÈfG‰0< RD¹�"&œ�Dj5RÐS�¥K] E[IÙ1ÂTƒ BjšÃFÆ�Œý„laÁ”a0�„kx@Â5†NÌH„g(sP„.k$A²Z‘j/ÊHF¨ORjgÔÍÁŽvU�ˆ]àÝ'hB¤Ú óAœ4›IÒu—ÏI´ƒaa¥¤øF†“h&�·xM¦�lÒM4xd0�Á“æ „lœÃ'Í‘ÚÞaš £6ddh2AÈŒÔ�df@ÿÕW»Oþ“ÕÂm&ñÅi½+Já6“ýºM¤ì²i†ËPE¶“h‹„  6Òthh ÃIµ5L#cPƒ'‚ar¡„h "à3H4BLó5ƒ(˜`ˆ…ÙqšÙ ¤1HaÊkˆ¹”ñ¨ÍF@�s_¯kÒ÷ïwu{·Ûý&éÒÔ}~õmÐM®�:è“õ÷IÒmzZZ ói0Â"ÃCHXh'A§ª„Òdc ²y0��£CÝØÍ ™O˜0F€Í0�„h Â]�A¬4B žèBL26Èdpˆc„.F ˜Gœ�Wñýv½º»¿}Há}ÿéâÔ¸N¼4Ýnßt#_ãÞé:½7%¸A´F=-]-3ÆË=pÕ¤›—Á¡¤ÚN“¤ÃCBÒÂ"; 1Âa¤ÃÈ9PxFÀÓSÐTÂ4<ü°2ˆ&ˆL„;.Í#ÿý7þ¼8oßÈÔ[ñáúHz·ï[M¡½hx¨ÖûB©´ÝÞ+{¿N–—A´J)6–––ˆÞ‰:Ià�* i6Ë'Ažl³¦Â#¶­¤Üš)6¨ðü#ØtÞŸõõÿöØl?}!¯Õ‡òê-?þÇÞ[“D†­mÇ»CÆÓîÓï^î*뮩´4ÒôÞõ«nµzMÉÆB×p’L4Ûe�ºXAœ?à¿ÿ¿°Øÿú°ý~¿ÔáËHÑnHýÐ"êÿÿ¥öÕ\.´:q­ôµ.½÷ÕñÚn½ýßôºáÿÿþ ÿÿè¡ì?ÿÿ_­}‡úÿŽß.°å§ÿþ>úã¯,r4qëøÕ½Úú·këõnŸ¦ý¯ú ÿÿü8ÿüÃÿþ þ íþ¾p_ÿaÿÿ¤¿í¯ãëþ‹_þ¿øû×ÿ�¿õý¿õè6ÿ»ýáÿÿü#Gü#GÂ0ÿýÿ ÿþúÿëëÿ·ÿÿíÿþ¯ïÿÿKý/öÕßëÿÂX{ïýýé~ þOYBÿðßëý¤ÏÿÁðGú_ÿÿþ¿ßý/ÿ×ßþ¿]¾¿Wûÿô—÷ÒýïÒü} ÿþÜ$ÿ£Gÿ/Û¯ÿÿþ�ý}ú÷Ý~®‘ÎŒþÚúäÿot¿_«ÒýþÒÿ¾»{÷ý‘«_ý ¿ý'öÐ_ÿÿþ£ÿÿ‚3ÿý„ˬÂÛKô›¯´–ÒÛ4Þ¿ïöþÿ­u¿üæíî«þëïÿú0ýÔ/{úÿwÿýh/ÿÿA ¦› ÁGm¤šÚV•×_[ m/°D*z^Ùý³þÚK¯ÚNiö­¯_û}m�7o×ð’_]õýú_£kÿý×ýÒÿÂ_ïNšiCi&� ƒi0ÂL0’A›IS‘ºÓb˜Ù+´Cé†Èv»VîÛ3íoìÍkßY:ÿûU×zUooÕ}[m/þÿô¿oÿÿåqT""„kÉøDq†)ˆLB:h«$r²AŠOi¦(&›L* 4NÒ’½„˜¤ Ù±¶“°Á)pÿmm%l÷jà {f샧}×ki¿š¯÷ÿû×ÿÿ_úÿËsSY$F¶ &!On)¦¢`¾¶J6& 1L'M4š +ÚLU§i¶È£‡¤›iA—(vÃI{Nù s?¶—ÿiÚûkÿëü›�±¥X£Z•Œ0BÒ+«vQA0Š M¤ÓNà�L6‚ià 8f U¶)ÒM4ý´´ÿaóº^ß{ÿòn,ÄA˜h¤ò+šhça„2°A#C Ba4(0�m§Nì0ƒ NÓA†Ò5M8„ìm ¬'"Û[‡iÿÄDE\DPGbˆDDQ�Á”êVM4V4W0Ä$\4{dúlŽ�É1”ñ Ê3gœdÁ’‰¢$¿Mm:WÖµcí«ŠáÛv»Iýu´´ŸKJ¤�%Á0ÛI½ÒÕ ªÒ ᥲÏp†“i0Â"Û'{Fv‚aºBÞøF¶¡0�Ôh"ñá„hj £Ð Ã*0�œ"2†\dÂ!|*†²u Š%8Õ~¾‡ ·þ²8]èUµþ†:Òõþ…Õ½¥|tª�䢕¤ðŸÙ‘ÂòЛË&´ÃK :XBíªM¤é„Âip�Í �68¬&±£ÛÁ32>r ‘¬„¡As* D¡rߦù +Ÿ öÒu’FÞ¿õTµ·…í½n×^5Ûî×_î+­µ¤þõoVôë¤é:L$N)<—8§ +m]O á¤ØK +“²Îš‹¤ØIîx ;ä$¨ØÂ5°©…Lô�”lÿôZ»ÿ¡ß^¿©bÞ±ÿõm¡ïïzÿ¨é½ëýHáuV×­õÿizzo¦±Út­^’÷¨'J÷ŽىÃ,Âm- B †—ÿõoúÿ÷_×_ý/þ½aÿãþè‡ü~¸ô7K­§¯wݺÝE]­zõÿÛTñ¦ÿô�tJ(”W÷ÿøV¶¿ÿÿúþ¿¯ÿì?Kÿùf?¯è±L·;œ1Xþ¿ãïî”?ã]á{tíÇ{þúµ[‹Ž©¨ÿü#DúÿÿÿÁ?ðVëÿð¬?ýýÿÿñÿýuÿöè˜ä¨¼]Ñc…}ÿô5Õ:þþÐ[¥ÿÿÿ _á.–ïÿàŒðÞÚ^NÈïÿÿ Åÿ÷×ÿÿ¿øЯ¯ã¿ï¨îü±ÈæúõÃû¿õ¿ïKý±ZÿߤáöÒôÿÿ£?ÿÛÁûÖ»ÿA‡ÿÿº_°ÿÿÿñaÿ]´·ÿúÛß÷µÿ]séJÿý,7±é÷þ‚ÿOAö–tßÿÛÿü¢þ·Ûÿ××õaýºõSŸï·¯Õÿz÷éi—ÿéo£WÒÿý|%ûßÊ~ÿÃijÿýƒÿþ“í¯á¿ÿðGûuÛ´ÛKý¾·W[Ûn•ÿUÕm-WÂ^¿û·þ¿ý¤Þ—ÿ´¾¿Ãÿwè/ëðÿÿéá¾­¤Ùy†sÂ0äQõÞ¶{ÒÛ«þÌÓfjÖþÖA)ÿÞ¿5õÿÿ÷¥ëú¿­ëýá=/_íÿÿ_‡K†ÿÿÂ_øzh6ÐQ Šb¨MZ¶+I;I†a—­°¶ ¹6ƒðŽö°¥×ö¾¿È<þ½ûf‰ÿÿïm'ÿß]W¯ÿßKßíÿÿÒÿpô{sÄ1´Tö ]醰’a´˜Ø…†(1TìRqL6Óa˜%NÛI9úØzÈ£†ÙyÂi¶m-moÛ3í³?nÿï¿õý³§þÝú¯õš—¥ÿßÿo&ÂxŽ\§¶4å§PA„&š ”%ªÂtÒi¦A&Ó¶’ ´áÂx¦E}±M¤�Á—<¼žÃ Y~Ò ^aX@ûodöŸ_·þ­™¦××{Iµ¯ûö×ÿ:þ²º–Ngq†!Om„Âds4Q§žVšaUÚa„¦Âv)4ئ(1I¦Ç`ÒjŰÖDÚIé°ÍÖ—}«wv‡d}³jÙù:8í&×öõý¿®“•Ív̨d °‘î­† „�ÂwM6G A°žÂI¦›Ý&L1Li± +*+´�têÁwfÙzÏV5öÏ÷Z× +â"#ÈiŠ9Ü®b1j‘XÍ a25·d¡/¾MÓÁß[Ç}'+Ä[š¾¾MŠª´«+ œSP§24gÌèE<�•y™Ó×"þW2ÚH_£uÃÖ'äæga0�a™ÁD Ü$Ë9 "!ʲ4da‘C�,Á"ÈêD9"$2�Ó]u-Óý=' ÚAÝÑ´xi6ˆ°Ü#½'I´k„Ó +˜FƺSêša¸ ÆvqŒ eƒÐÂa“Ù'FÙŒÞxÏŠˆœ«$äDäeËDÚ<—9šÏ\zý¥ïPÝ+@žX¦Òt›JÑÚ"Ý&Ò¢8aZ �ÃZj“ 'A i¦Ç£cF¸Pš5µF°eAñž4Bd a;� §‰ÆH §R;53©*Ö´›W~šmtŸšK„ð›JÒÕÄ'IÖ\—4Èæ“¤á&ÂL ‚a¤èŽÚA†ÉˆM„/j¼#;I´{a^3°�l#Ã�“5²x¹�‘s\pÌ#†y•†f!>`Ž †)¨‘#!Œ’dLȆE#¢ë®�û^†ÓýÚ¿µµúNîÓ¯ºÝ7N•ãÜ”/_t¤í$Ú#îí2ÎÛI°–“¡i·&€˜jšª °‚cà ÒTѱªi„lfpM4By­”EÌ„‚H˘@‹À�šñ tl‰#hã5­ŸDA“½{ÿü±ïõÚB‚ÿÐ×ëëK�ÛÅVÕZôÔ]µ½&Ú¿út­za"N’ºÝm Ci6“¾¡ &Â"ÃGºM¢,6L™#¦©ªhhØçæ±ÏŒü&�a—‚„EÀ3Á ñ„'F „Ì2|À :õÿ�ëÃÇýä<û¿�ë»QÚ¤‡mtßûî—ºõ¯M*i}rv¶—¯~J)pM¶• NÓI6‰=pÂ#†Nm'IÕa¤Å!h Û#°©ši«jš7/®—þ—ñl?ÿEÖ¿ÿå˜ú'PrÜ‘íòÇ%@ý}[kÿøë÷:õ.Ç5ßÚMÿÿtžšIºj�ÅEP'ZD½¥mt›ihŽÚ_ÿÿÿö¿úÿëÿôÃÇÒQaÿõþÚ_¢{KÿCúî…%ÿǵ¡†›õ·Ón)]4©÷¾“»{oÒòv—A:Oÿÿûýl7‘ÿÿ¶—þÃûé‡ûëÿ×õÿ-_Qùc•§÷Ñc‘Ÿð_ÿï[j(w»Oí:^ÝA¦ã[Zÿûÿÿü?<ÿÿ'¶ëÿ û¥·ÿÿö¿ëú¯^£ÿøþ‹þ›ýשc‘Ð8oÿÚ·z¡õ»×½ºÿÿúpÞÿîÿô�°—þÿ°oÿÿßÿaï_ÿÿÿÿÿ¯íþ¸Ã‡ÿïï|´ñý{ú·ÿ·úÛé®ÿú\AØt°ÿÿÿ×ú]¥äDÿÿ¯ÿÿÿþ¿« ‡ÿ_÷Òÿþ÷ÿÿÿÞÒÿÛÿô´m_ûßÿ®ßûih,6—¥÷ÿÿÿÿÿÿþ ý¶¿îšúÿß´›µý¿Òléíÿÿþªý[gTÿM¿ÿ×÷þâ„ÿÿÿÿÿÿ¿øl7û×þŽÿÁì=ºlÿß퟾Í/Ò»_öÉÓúýëë·¾uÿn·_ÿßÂ2{þþÿß÷׿õÿ†ÃL4û~—£?ÿ¤ÆÆ�«“O/ZÝÓg©pÿÛ›_îÓ�Ç3?­³4ÚVfºlѺ÷þÿÚëëíýßÿÿÿÝý»¿ðúMþ‚ÿá’¸bƒ ’ºkm&›©›i*ªiÛÆšzȃ†Û %¤¬0½6»¶·_i[¥ÿûf‹ïoÿÝÿöýÛï]}w§·Ñ…uìqO„¿øˆaC= +® ‹†hÚÑï+,Pa4Ô? °™STÓa4Ûa$Ø«IŠOb´“VêDÕ¤Ÿí—µl%« ÿlÿ®ßÙ§}¯ÿßÞÝ}v·š–_×Vêš½¾M†!+‰)U•ee‚zC§†LPa[M1I¦&h$ÓV¢Û"¸mðÂR+†Ù}†nöI¾ïÛ3^­ŸÿÝ}w¦ÛZëõëZßÿ~YÈÜe­‚;!D&!ˆA„„��mKH0› „öaŠ…Å1H4ÆÆ�±ªvÓY´»Im[>›?ÝZý²M«tïfŸÿ}_-膋åp™ Cpa4ÓA„š†dcÙ+ØL0“MCšmh$‚A†ÐLlU«i&š°ô�.˜iz®Ý×ÄE% ¹H¢ÁJAîë��„�Ì1ñ[`“M7QJšw ƒ &¶)8a‡i±úô¼DDhDC)d ¢Ê„!dÐô*ò³=1 +)Ú +v‚i²8ôºëÈ£y¥YÐVA‚ijµZ¾"#d8¼´½~  +Kô¸£ç …‘#úâ, Â]´¸ˆA¦ÈÜ$â˜bq�ù\ …2[ga#µT(@Ì–+ù)§‰Ù\–Äc2ÝûK¼*‚ú}GÉ[,±;ò +‰…°ºÝü›…ˆ/]SÅ"·�ï_Ÿd#2ª%™\V•Ã,äjdSU¦¾¿ä a;ý¦v�¬#@< `Œá“åÌ""N!&!fbæÌƒJ¹ÈÔI�Qþ»ÿÿéàÍšM§hÑFç£`aSÖá ÌÎOÈA„&A­”f™ƒ�ž!�Ѳ„"ÖE¨�¬Ük,‘‘׫^,-ߤð�,&G4›JÙhM¡¤‘V÷“P´hi0¦ª�Œ*×3äf°ð�„½„…M3!ˆN)˜¤S1�( ¤(ÿ%ó°¼�â-t½´¸M%¤úV‰GñmÝÙg‹iZ¦G6N�0Ñì±TéÏô›‘»@˜zZ¦��5´ÐaÎä$Ï„xK‹€ÎÁQ³gR;ȺýUG¨×î>­k¸ãMýW¥é;[Á_¸I*I¸ ÚMéam„› :N†‚ < ›ÂÐiØPšhÙTL# £.FxÂ4?)’((FÈ“# òAê@¥ýxøøñµ{ÿú‘Âî:W¾¢â«ííé<'¯ÒtIÒ^»,÷¤›DvÑí¤Ã‹{ikÕ$êš F°ÑùáBaFÈFɦˆI”ƒ ‘›"(""P‹2Q¨j‹ÔœŒkÿ¥¢Ü’0ûÿßÝ­wûzBöÒé-­S±±¦•>½_î¡Ú\Òl ÈæíS ÎM„„¡ª"ÃIÐXAk¦‘éBsã´xyø#Xdg `ŒàÂ4BfHœeáæÌê_×^±áïÿê?íÿzRÇ[«zû¡öã^ý)p”Óª~êÝ?¨ÓijêúéXWW +Ë=&Ðg '“:vZ)6¨ŠíN“#ãN˜EÙ3Xa„ð˜F{úëþÃÿÿ¯ëýƒ×ÿþ[’ w®>ö¨m|n×[Bé[M¯O§¿õ×úWM¨¿ê“…@›IÒh*#¶“I:M„ÑVäpBþÏÁÿá¿ÿÿÿý¾’Þ»¯ñ†ÁòÓÿ~^É~ˆsý[½áj(}:Zéoû{Þ“úO»þµ ž°“¥âÜi_ô¼ ¿ðßÿÿÿþÃÒÿÿý†ßëú_òÓþ½´¡øõ,r(�ñª×÷]®ú÷QzÝ/Ý­^�}÷[ß ½/ü?ÿýÿÿƒzßÿÿ†Ø¯·_ÿÿôÃýT×ÿ鿼Ýþ¿ÝýF©ý¸ÿ¯¥ß{ÿÿÿßûõÿÕÿ†ÃþÏÿÿÿþÕ‡ºõúÿ¯ì:_Küú÷[~¿ÿï×ÿÿÿáô¿¿ÿÃa¿Ð_ëÿÿûá¿4þ×ÿÿöÿþ¿ÿ­ÿË]gýuVí¼£õ×ý¿úýõo_ÿíÃþý´¿ÿÿè7èÑïè„2;ÿÿý½ÿ_ÿK_ß·ÿÚ·¶gÿ×ÝýþÚþE×ï]ÿ»÷¯ñWÿýûiô¿þ ÿÿü7�'ÿücÛKöëÿû ÜŸ"Ž\˜g,´–èãµoý\Í~õýúFi¾­wþΛ˜_õûÿßÿÛê—oøKÿÿü7 Ÿÿô t—ÛK"/ÿ†)4á: „ìSb¡éi ¤ îDD½°ÂªiÚ^Ù„rÒÖìþzÕë¿ßJý½Wöÿÿt¼¨Oé}þµþÝx{ éq ýÒÒþHÐÑá´Ò=·h0ša&à +Üî …°šµb“M0ÚKqÝÒz°Â]¤ÚVÚVîëHå¶ïö›ý¿ïÝ~µoþ·ïÿ__ÿ×™?ñ´«ÿ“e,\C ƒ „ŠÉFR¯<; I„Úí$РÅ] ›I6)4Ø«[«VUb—þÎ_¶ýÒöëI5m²uú­íÿ¿ä zþßúV—á-/þâÑ\ �lœÃ å@„ÅÙ$ì0›qÔVƒbÉ]Š Ðb“µcTöé>ÒÒÂ;í°‘êû»ooþÒóÿ_ûÿª¯é7¯ëÔqs! A‚rcê˜@Ó "I­°“M6 6¯´˜¦d<ÅjšÈƒ†Ø-‚í—¶Òûµõ¾ÿò?Û}ÿMÿrÞщÕå1"áì‹AUA„ÂÂi¦ÂvDéÄ$Ãh šwi2< 0Ù,3ÓÓˆl=m�Áv}^]~“f}$’ɱj{?DDCCB� ¤|(ã´Þ!SM5aŠUNÙ+¶ša6Øá°Öí&%JºËu<! +z…YYE[a‘¿<4h}†©«X#$Ä(ŠKù^ÐqG<ìL`Ái$º +êâ1_Ià–—ZUêÒºÐA�ÚQ•�‘G °”D‚E6%ÿËyÅDMÉ}år ¥uO]¨/­òl–åña>WjWX•Òó%µ¿£ÄÈ �ŠÒ½YgRL�꿺´¤Εé„E ÐGf‰‚!£dTÆj2MŒ‰J¾>5n°…„ ÏHØÂh0� Î3ž25 ‡“¶ �\Î๑(D$\±Wœ�gé=oD½«jêË=&"Ü$èŽØi¤!…AûdçMøÂ5ƒ'‚ �"à2) B��E!DS™¨ò,dZÊÿåG“¡þÝ6ºÒ¤Ü&×A?H—5IÙg¸CI´�&Ñ„{p›TÑ¢vGæÊ3†iÂ5Â^<)Â<Ó6FIË%õ×O2 Pî¾/ºíu¾þúÿÉE-t›„ì´ +p­¢,4›IÒa„j˜A:7U?5 �•ŒñÂ,pˆñÀÐpgˆ�N))Ñ3¨É|æSÊUµÿRKêé»kzo맺i¾‡ö…S±Iºmêêá×é/Óëݶ�-V×NŸK«~•Òu|Rm0éiž$°ˆÇ²Ä&Ù`Ë@ßA0дh{~zTÁ4lsôÓG†œ0�a‚a„wiˆ” äo0Ž$D\—÷oÿõö×ÿ–œ:ÿùnPç¸ÿ!É~¾G +ú[{©p›~šé½­î—Mk~‰=Ý-ðíßfEpgM„œ(IÒt�&Ò©Ú68¦¿øoÿð¿×ÿþÃ_ÿÄ{þYŸýeAÑJXäZ~´6úC®»VéãiºÚ›Ý¡õ¿wýi¦Òµ×t�C„�mpäÎaÚ–ºWø7ÿøG�ê¿ÿíÿ¯û®’¯ý·¨þ¼±›YnJ|xu½.é~¿ÿ‘»_ûõª×¥¯ŠN—N×¼/ú‡ÿý/Û¯ÿü7ÿÿà­ÿÿõûu÷Ò�¬5oå˜ØÿMÿë#¿¯vŸ�-ë®èkkÕ6×ôûÿþþÇÿÿ ÿÿøF‹h,­Oÿ¶¿ëîš×«ÿÝ}þ‡ÿÿô[’§qdž£ïÆé}nŽ/öëÿÛë¿ûßïÿ¥±Z ÿúýºýõø# ÿÿÿÿýÿÿþ+ê°ëýe†+ôë~¾¿î»ûé÷¤—8àœ%ÿÞ¿ëíúß œÿüÍ‘ßÿÿÿßÿÿ®ÃUÿö·]_·^~×þ¿¿léïÿÿ®mýŠþô›ÿKoÿô ÿÿÿúÿÿðF·ÿîý&Ò´–DÆékví«KoõlÏêëÿo¯I¿û¦êýŠö8§ð–ëï —ïÿÿÿÿÿè,�Ø7’ìŽÿÛðÂ6”4­¤Ã $ÓäpÓ_IXg&Ëͧv´›JûöÌÖ–²óZ×Û÷oënš»õíÕºÿïÿÿÿô�' èÿøDr B(é0§¼WnÓ¦�a$ÙS Sjé*ȸö[X¶Cí?öí³5ÙŸïï¶Þ¹Íúöþ¿×ÿÿÿÿ»ð––öÿÑNýˆs½aH*¼B•Œ0M5 +xl&!Èé$í¤Ób´•¶Ø«†Ã´ÛqÛ .ØJÿlϧ³=ýzm~ôµöÿý¿ÿÿ÷ýRÝÿûV׋B<Ò�hC +U´V0ÁE4ö^ê›LSLPM:¶$ôØ% '¤ÚKmžú¿Ý.û[4_Ú÷þÝúê§7´¿ô¯ëY6†"Žˆ‡”‚²`„0SÃÝXªÃtÉCm è+V; CaÛdvÚW˜ûÛ ÿß¶g·þgÿMëûi?õõòl ÄCÂaBv*0ša‚ƒKpœBmb�l„†!*vŧ"cUÛ 6ƒX†�‚a´›?ßöÙž•Ù¥Òý'Ë%qKC,q#>0a!#ãaO ‚¦v’´› ;´Ø¦)9+Û% [V8l;NDàÂKn^½¤—ô�Ž[èŽ h‘“¢„Ѝdì)VÚié⃠+š +› ˆA;ˆ\& «ÚU“qLDö&�„�«i÷Iö’^WGa‘º¸Šaˆ-yf‹c¤”B *â1ÿËp6W +\&v º…3Â�¬gblŠ«¾š‚“à˜)\ ûï§²gM$ý °�^3’Ã@aB!LŸ… Šˆ{(F ¤ §d’êdkþÿõþ;]øÿ^Ó¦ÕZ×Ý×ït­/÷ÕÞ’m–¬³³ì$ÚAÐÒt!Ú*ØT�th²~Læé¤�lŠ ñ ‹¸F¶0DSžÉi&Öd”—$íl?þ¿E¹*Mú!ëµu¡ïõ¿í«m?ê´þ—ÿ¥ë¬$IÒV‰sŤÚM¤ÛºZ„ Ú +‚t˜hÜÑ¡¨M!Ù¤gÆxÂ3†ˆL›"@Btm•³ÒRwè#aèke µR²1Rmhq¡êºÆî’¦½RÒmAA?™³2$<‘z’—ë×¥O[JÚVÐ(/„\êah#³ATÛ>fÙ™š +NHÌeOF´u—I-íRÇK«Wçy­ÒÕ\"‡ÂIë&Â4:MSThhÑô\™æ¡l "—G‹K|ù¤b_UêÔ_ú8ú¥|%^º¾Þ�‘Í=,%®“aUUB„\{Tk<õÝk) KF¡꿯øëÒÒê’ZB…hã­-Z^”%hãè(M\Ò×I&Ò%Õ&RµXF¾—ÿýV«¥­%ZÆ $5]z å>w&\´¿¤¯Z}+KSÉ*õýWõ¯Ò¥_¤”/]R×JÆ”b„j–©Õ|'Ý-¤¸T´º×ªÿ[ªêºª_®´’ÖºÕj’úU¤F¥u­*ÁRô¶ÿþ«M¥UZÔAR]U*¥¥KJ«Ö½/ßzá.�$’]zmWõKi.«\š:꿯êµT©VµíÓõÒ®½tjÃëúÑ„�òézÖºªë¯úëÖ¾+ÒÖ¢ üit¶è7_ô”-�%EìÞGÔ¿^ª´GðE=B—T–µ¥^½k¾úƒ+µÒø¨ªýRˆV‡¬TWg“gº#ª¥Ô.}apò=ô Žò=­ôPò>‘…]%×Ф©u¥IWÐ…H‰@ ¢BVÂØKguÜBmbD-ÒŠBªR+ŠÂúY„ªú_‚)úZ×ô +¡¾ÕPMŠbª!|(¦ROUIUÕD*t°‘ξ”ßU¤‘.²ú¤’üE","+†0Bе°]VÃ(UïUU¥w®Ú U°”4•$•|#[+‹0ĈŒ ÁBhC*ªJÅÐ%M8ª…j‚I~¦e•Æái¤{hÑjº0�Jÿ¹\ +H®H®N!ÿÝ\"ºƒöëI†"7Ã"Ž„&pÄ ÂEÛ•ÙzƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäÔ2¹rȃP �&‚éƒS°°<ÆÁr60_òpjfÿü›…�á¿ü®j ÿÿù‘¨ _ãÿþM°Œ“aÐEx!ü€½A¸€endstream +endobj +71 0 obj +<< /Filter /FlateDecode /Length 7508 >> +stream +H‰”WMoãȽûWð/0êíïÌiA€É)Á +¹‹€¦h› ‰ôˆ”½³‡ùíyE²›-Ò#۲ȮîzïÕ«ê¯7A2a9çÊ;Τ—\ÈPpÆ×ÁØB*ÆUA©Â)¦½sJ„ÂYå˜ Ö)çŠêtóó—/þÞÝüûæë� +‚Y‡%!Áí4B"°4NZ2©±¥1…sô\;! +g‚a\뼜CŠR¦è�ÜÒ!¹¶!8A‡”J#|áÒ†ÒYf¸ÔƺÂ!.3FÇÕQƈKÆ€‚" +g¥Ñ +•Ã׈-¤dÞã�d¢¸ ¥.pPÊHIåbH•‰Í$­Pã!•‘Úy:¤NU(æ H« +8s6Xë-EÔLyüاˆ:F̰ß-Œ€%©¤ D²@YP®–g¤øhpvî¤0sD#b+:¢› +%…F®La”)�|zn¼cFø`²Ö;ID7zŽhSÖxPZa ‰eÚ�1ÿ ¥ó¤ âØ“ÜE¶] +‰cXÊ;hŠi47BÝø±B!¾5xîl`Å1=ñm5ÓBk¢(ýG|oÉQ�a–¸‚œ mçˆ!Ai2" +?FÔÁÍ›µÑ¤}í±¹s�ÒÆø¨rþ;P°Çë +|kÒ¹q= +J5�Ni¡'Ð#RÌT:µ“‰ÈÏ%N©�—Ð ˜#(µ)<ÒðÜäŠ"×ÌáZÄÄ…ü(ó7ê[�k�Ÿ‡Zµ(c…¢.ÅR<¥»…iÎp +åÙ( 5Ö#² @ 4 +ç”É4ôpJ)¹l—\ÅxKv$÷…ãD:Á©œ©€²’Û-…ø¦Ž8`ð°HÔõTäF€.CÚÿß7pZ<ÇÞ ÐÁµ™4¥™J4Å´†ÀB¼­M¼)€¥ÆÚ K”OX¤¹Ô�J2!έ6ü±ƒ|´ž +CA +fŠ˜ê‹}ñ1qFbâJP· 1iK] ÞàÑ‘”á ƒ<µt°|ÁÁ’Ô£"fsŸ ¸hWä¿Ï�7¢hŠ›_÷7?ïÅy!Šýà ¡-µ.öUÁ‹ý+~û¾Àð÷¯Bû3þÆxÀ �ü �bD¿BãG¯)ö§›Û/§ò±.~ÚÿA9I£( pÓBÀ�O‚{Ž\-ý×¹«ê¾oÚÇO1€�;R€yW +CT·ZüŸæPwÓ²7·„¦ƒÙœv_ŸOM[û´£�~ZµœÔ =«åe{xKi$\#ØM–M;Ôçe?G‹ÊCò:TõÔvÇûù5Xd‘ÿ‡Ä�˜¸£B°#P E‚,h´1ïG¤µFóÀ±è ýs]Iëhññçúë¥9×§º¦dâ0è}z~¯{X²�ãöh&1H¹Š�ƒˆ0?;uCÓµ«Å +¨Éù…—…Íì€f<>¿›�ßyy[^ Þü}ÿÏ,ÔN 豆ü•"ößú¡>±ULìÉEŒùúÔTOÅOîöté‡rFÖ0ÁcÞÏ纯Úáç?”CÊ?RÃBL¿\/…<¸‹àWåq74§zsÔ�ø)‡ºg‘ŒaJÚ3‹l³¤é7)£»öqQ/<ÆÄüÊ´L{?óšHžÖ'Äkcâ—>—¶œ#§äªrb] ¼lÄ + ¯°ÂȦ\¢¥ÀÊN¹Û~(‡¦š™¡÷4JnŽÒ�ïô«8 +~îß}'É» .j®ã+í&3ª˜Ý¼•mY ÍK½ÚFÃÍtÆÍ§ Šf‚) +«Ù§ƒ$ˆûº¹æÂùˆNyLÛadšðt1©¡ûÁ/Mýº©!cäšÈI<˜ëa�¢»´9õ1Õf W.“jÎrÇCw>Í4ìq!¤GYBê$ž§®©²3»ÑèÜd¶?Æ,´B\M$äsŸ¿üãa,zÓ ¥Ä5Þò…ÿøÞËFP«ß”Ær@—d„t'„�뀄J™R»AÆ®l©ú|Yû`^}}¬«aS˜"OŸ6$[L!‰†v³|©ôXQ‹òŒ³YEEYîòš²<½²ÈCó‘L;‚JøÚ±J SÒpNg½&x#1òbpýÇ‹«…ÏÝku~:æÂuÀWåÂ=·Õpl>ÿ,äàènåmÈе"•Wwdëê㩎{ªr•øXämýç°ÙÓdbµJ+š[¯O5ƒŠÄp×Éˬ7³ÑÉYNÏÝyh¾·™r1h'é6}©×ò(2–gÕµU}n“%Hào:Vè}3tm™�{ì»’Á�ucŽ5±îœ¸¨©ÔX»êBsÉæ„ZFNe ãÊ_J£‹N…U·/͹ké­‰`§d§P±#¼2Ítø8�S¸d’ËHÃ0ÐûQ”¿f˜Œ£�YX�R‘iõ8…J«!_ÿe÷cCõ2®¥‚Ž“Ã‰õÚ…Õl"ÌLç­‘pΗ-´æi$üá¨a¾4Ý¥?~[AŠ ­�5EXBÕõaÝþ ˜ÔoÉ'›m¤Š{�Žjr[½!·¥Ý\!iàI=+C1´ãiðê³rå ;œ¦}�?Þ0h„ÌÛ4ã_ÀOü@ßèå×ëC…f×¼TÛaAÄŽ¶´ïTÏ2MÏåó2K%ïö~U kÞòAµ{x¨ÏY΄˜,b¨–o«¹QÞ×mýÐ ýºÇ`Mœö›ß�xfÐóÔÎõp¼TÕ!wŸPy~úÖ7Ä·Þry¥ºsvÏœÑ!Ë pš|ì.«zÛ #ŠwP z Y…6Ó¥BÈÛ¾9]Žø¶†ä×W ’Í2(WtaMƒ¸PSʼnù8÷?ˆŠÄáP,ÒéQÛ9gÛÿÄMÍÕÂt[rJÓLq=¸mÓ>ÕA~oŪ#Ýw’AG¬!†3/¦EO6}}EB³I>}êÎõF&¼w3rÍ8Ü"÷84%›G&8§1W­ï·úÜŒl,‚Yúæug[Tœ:[›]wS%�š÷§hîÒýãGTší»ã ÅøêaÌo'tà 4J,Ùfw¸T»k²Ï@ÌŒã}OøÒ>×WO£#s<á­©/ŸwÓ- †ñì×§»àOÏDZQÖ‡© bzKž¿__”¸b¤zjê‡-ÅËø¸�Bnûé•ã*ÇŒä +‡‡>k¼<×Y®1ŒÜvµðêFY§™ãÜff‘€à2æz(‡2‚Uwúæ¯Å>’tTráá\¶=Í]«èãX*eØ$>M°*J÷¡;»×lºL3„Lƒó</æo�ÁÄM^×Df3ðÝmýgyjZ¼"Üm]R_�(AktW7…ÿ1^5=nãHô¯ä–`lH"EI˜S�Ábû²‡Mn=µ¬n ‘-¯$;ñe~û>Jd±H*ÎÜh“bU½z F£–¦.í�CÚànÂØõW‚¬(ãºÔ{LtæÓÆl5xRΘýÙ½w3Pè†+�±”µŒOMEb2“wƒ¶—­;�W?1§ +:#ïÛÍÐoÎ\"ãšÍ,¨„e3+@v‘-ïš/( ô¨į°Ú's \3›¾äë¼ÊÌòÍi˜âÌ•%v}ÖtTáÈ—�X"2»\&Má†!š’ÛòifC†¼™’5³\ò‚b½Ô³AŒØWŒ¯ß†©žw�*3f?ÐJæõ¥Lpƒª ¢Ìð`) S÷Q›5$Â�ï—®©{(–¥Ýcò¯q\Ð6?kÍî7en8C$ö7á"Kí?ñŽ]ä+°j Â×Q7dÑÌùXÏŒ6°¹Ýøc}‹éBH[ökÛ†º¬·�Æïm2÷M Ü��уÉW”ËŽ®¾rQ,Ú)³RƒÃ¤•�©ZêŠ,¦¬ö¥\‡_Ñ §ËunGÏ·(2/7Œm}¨û°ŸÊ�â ãi1ÖozFeîl{šd+¹úæZç9‹d„±kou¿�£‰ÁŸíÚÉ4ÅàC?Xpõ}báBÕö¥‹råÀäû%QY’8´ç Ò&LþgìI02gޱv)eá±Zû1\±•’mÖú]‚Îï}Ë@ªý²iwŠYH?YH.ó� ¶ôT÷˜W¾Ù™A x`‘(ð‰Ð<¯ »SRû™]ƒÇ +<é3H×�Ô]¨+”sãƒ"a¯‹¾†ÍP2úÚ©}¯_ï3å„T/ݲ}yJîzŒæ“VA(Òì’Íœ»‘�’„+öÞ³TºWë¿þ=|oolîÜAbò Ãz}Ö I•2€(±…�ŒL “)¯¥ª¨jƒ³‘ÝŒ"°Qµa¥0ÓHÝ8¢hR–dÔ(Ë Ë¬Ü`Þ *s¶,x>@ÂÛ«$:ÚMáó"fƒ•É„Ö+ïày ‡Pe T+Ê#²UÊèc~¦?Dú*àvª=Æ™«XÖ*ºNK»}¦CaR°­a9o–ÏçiËUœ2%TÒ"H3v}¾sgCŠ‚ØQß5·­Úå_§”§¹e&‡Æ_ц¼EÐ@³‰ß{>Dx;ßà�*° Ef›E¶a"˜û†Ï}[�ýý÷€óu½UšqüÞÍG¾—™$¶õýcˆ56!'gÁ>Š„f8·Íñ<ôÃ{×j³+S6JS´•2…7Jæ2SIN´>ï"ª¨ðî‚�‘AÝE±Òzåú ëwðY"¥Ê#e`#š-r$S’±ksüGаÐË#`“¢Øv01ÁWBǃ,8Ø×ã†ûÎHšoc§6„¦ÀÓch:'Iàîœif ÓšK?Ô�Õ\ø/-».¬XÏû_õïCYéÖi~K +tÀøñOæÏ¾!lb…ªè"®8]ˆT,¯X.)÷KÜLM>ñ_ñåóósø’݃§¤¹‚¥[€Àïyë"w ;¬±½À³ƒ ˜"¸‚\•¢†o\B‹0·?æ€#8ÙÑ$+!V¹N ´Î”ØL¥M¸÷rã¬ÕL øt.÷ùîõ¾KÓ]w6[äÞ­ÀYÄ<Ƕ�C(#£Qa>!Ò†¢úÒ†N¼¦ +ËZcû¿k·&¢¬JžêËe~t»PĪ}›%Æ2µ*Y=·=Ó!¸8²s(Zä MÒE¡Ùv‰å@Ô"‘ƒÕJíã¼_ëúÁù8Od’Då›õ+ìú�Z¸¸;I‡õ€<—>‡�ƒ+yˆ&{§Úð ™þéØ4nTd ̈K¦kωÄA*·U깎G�ærš®&Ïá§ö_õ8‡!–3ÙñúÞþîNä‚Õò—„ÜbE\€f²e þxþ’´¾\­k©üM1i›ZwLÇ᯿nç-ª.Ä6m ô^ +MùERjÆ�ËM=Φd@—ÞËòéÐjwƒ^O,6˜N°xJ¯Ý<œ�™ô’ +ûO—n‘X¤Å¸ŽWެ¡I]扙-ÈÇçsýê´Fåú"ß®ä:ŠU”ž²T÷ ] +4_f&Šþg˜Û«Î¨8�`ìAaqÚì:ûÒ*xgŸ”Á—²_%¥øqPžþz0Ý„ó®¢2øMyóCnÁ«m9[‘!u~¨ñú§òÒÔT‚ñ�ýÍò˜°Ùô,�/T)ô™t­ëĬzQIÕLe©�H�*ˆµª„‹ÓFÀ;Èßɰ‡_1m¸Å´²Äñ½¾ïp‡™8R”´Œ‰” <éPƒÀ1×b[2ûÿÓ0÷Œ.)E@‰geë^Gº÷#_EJ?×)Vèšp0†=‹ƒB^Ò+>aÒ|ÀÆ}t”$u3ÜOõ·&ðt^>AÀu8äâXƒIÊÏ%· |Ñ!2”?½öuóm‡aì¾;½Ô†ÕÌ›‘6…óܲÑÔz”>¨äÅìƒnó٪¾òåó%1_ê"s)ù|±¹MèpXP|­uÔS¥%…CX`%¦¿iÐ¥"[CìØMº‡>Í«½t!ÔA˜ˆÁ)=Æ‚íì¡›šëª#aS:“ðIº #nJ‹ôC@j[�xXš¹Óeà^ùô¯ë|í�×ròÜ–óÌù…zYævŸš¦íÛ±žíjšþI‹úÿ®¦{­%’PÄÆvBê™6À eˆÖ¼JÂRV†oWRÚÓ&W±æ’ß“$š±¢rŸýU *[îÊòåòdùq¡Ù Úž¨r•Ò_¦&€² Ðû Ië§|NÏÄÁ"úX¶-yЍ‘ê,êýºëûë´ :®�(þæX›1ß6Þ(í½v¡¸3æ.óŽŽv!žÐ\ËDD òéîjG>#R‚5]ÌT.ÓXý,ÚÚ*ÐÈ©€�· +…lºY…ùÓ—ÏÏÏ[†òçÍ÷yª­©w�6Ó!úXÈ!Ð +e{sº6Ç GiROs�ïNuÿm nûŒ|"¦sö<<-E}¾Ç­WDfÿ´õ4r×ú©éúñúw{Æ#`†ìdoí8�‡6–žäØîüVJmS!žl í˜Õ±ì¿B@¿ŒCƒŸEØr˜‡È‡$dâÆöpm<ƒWU…ƒœ¦Â�lF"d×2�ªåY¾¯“]ÕGáUÀ�,�—Ò Xq•‚sº)n4"Ð/Ê–)9¬µ»¥VÎó0�è>C¤ðXe¸¡0zêÅOù +ÀYˆ!zÄò$K“Sîr3tYNÚ9ÕI´\\¼ˆg]2вëÓ¤ È´ý2ºá{§ƒÜìÊ^ø/Ϲôtq@yYû¯ÙD8/Ûj ƒf_)K Né=®›f„òi8N¢:Q�Ñ U²èÜ>¤;Ðà¾HyÜyyúÌ×]÷ïøÖ|@æp¾/<ÖÕ•v�?Á2ž.Ç—jÙq¿{ÏÇZkiÀ{m‹Åhä‰ðæË9¾ÕP›ì™u6Aö ðû�û] +&ZîæãñózZ¨U˜*óJê¥5}}Ý„YÈŠ*(Çn¸!‚…·y ”@ƒÎEu™k +†ÁN@Í)XÉhŠ×i™íÀNU©/šY-¼oÚ?ùö£AèPüŸ½Z¾y}Ëþ�¯PàOÞç1ßL® + þÒc'8.­5>CÜîïŽ92¡9tX¯;ÉšU,«Çöil€]Så²»÷'ƒÚý C'‰Ù½sR§P•÷ˆh™{ýÑ„ZMA'ó�,­#Õ›œÚiK%˜›”xkZÊU-¼…¼}ý˜X 7bøq÷Ûþ™xÉp{Å�ߥÎÂÏP¥$Ùp7ªcUÍa¤w¶§’áç«jI«ý.V¶]Ú5އ>îîŸg:"”C„ÝUŠ!¶ÇЋù€ËÛ;à§ßÅÕOù{ùd®XóË|<ß½\²L{ºVu¶JU€Þ…ol(ôëìÚ,»6F°B†Eå,·/ÎòAP›¬Æyo£�NÃóô®w»ß\L- Ðt�K¢¬fñÛóòä,&säÔÇÁõBà9z5W�ð…3ß¶›)ðÚtïûGŸ™l�ŸâÎ~¸ûdÝÃÂ÷…ïÈï ú7‚X¼ø~&M˜�P «±×åýàÒ6AÅX^ÔQC l„á2Ð':㟺ž8€á_]UÖ«Ž0¨årÆê Þ#í}½úJô¸£;e ‡šé>åM¶¡p«Ø ËZ�Ùëe±V ÁùõζV±¾Ï˜UØÑvN÷gÝ­¦BvÁ¡"i­±ØwÓ[¾M±„Á�;ˆW¨·qõ†_ ïóbŠ­M(×6�JÕDsàSUÏ«%\ÔÍ): + c;š/ª›Æ ð"ÁàëE¥"vˆø×¼w¤É ­”Vœ79·eÍ�Œ6Rîº~óz˜QŒÁ}*I]lß”à* "3áz wrýâ¶‘$´îo/ž{H]¤+HîEZ +êrv™…$ƒ¹Ã†Xú!®gzpŠè› í\hß»b‡ßÏÇ.îÑÇ=0ì´‡ªÎ$žõ›t|cT{®µÛC…‹`ýHå«õ¯?§KŒMè °ÚB—t¼]ž€Ëã¸dÞøÃ••®æêo}÷úu}¶"#ª@@€¸^7{Àâ°�>hc¯`ür«@\¢çÍ7pñ—äâyoÜà²ØA»XI늊¥·Óáñ”4¢¦óJöƒgÇbÝÏçÏ˲œÜ²7·ßü'À•}Œ0endstream +endobj +72 0 obj +<< /BaseFont /Times-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +73 0 obj +<< /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +74 0 obj +<< /BaseFont /Times-BoldItalic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +75 0 obj +<< /BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +76 0 obj +<< /BaseFont /Courier-BoldOblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +77 0 obj +<< /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +78 0 obj +<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +79 0 obj +<< /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +80 0 obj +<< /BaseFont /Times-Italic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +81 0 obj +<< /BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +82 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 24 /Subtype /Image /Width 96 /Length 410 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ `ÿÄ>!1AQa2q‘±á"RÿÚ?õ7$µV +rB2£ÃΛ«k W@`XI“xÄvpñ�†OŒï˜Æb²Tmf•x3’÷¯²Íkz�*Øëß®]R°KfËm9OËÜWÊ–V>žÀÇÓ‡�ýoó´ðürkí…oåg³=3k#Pá#ž“®3öÖ«÷u]2¼vñÊokU­[ +Çï/L›û-e=Vµ]“¤‹8WȲ¾Åm;OÆÝcû¨Ck[â¦ÿ·èç^-NºaA„ˆÜtça „Âñ„“þo\©5R¬Jõ“y¯�ýt¶ì§:ç?ÿÙendstream +endobj +83 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 44 /Subtype /Image /Width 408 /Length 3629 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ ,˜ÿÄN!1AQ"2aq‘�¡±ÁBÑR#áñrðb‚3’¢$ÿÚ?ôí¥² +°,H�•.¦vÚć o5…i90VbTø¦l›GΦuìÍ}¸ó=þýh²lFD$›‘7¬È-ãÈy�㞟…'ÿ¤=•Šú’$Ÿ)‰ëúÓêÖ@Ö²ÊÄK <ÛŠ£›bÓÉùTû†+‘Øf +‘'Äc,¹´UX°‡[‚OÆ×°¢U‰�LL3“—éJFðfZA@Hþ\S.·³6×™gÂ?ãÖ«­É„*U±›ý;š–ÏU²(­Áž/LÆy+Äc‰‚›Ž³HË»ÒSâ;Wˆ09ê2ƒjn0œ�ˆÜð)>fý*®®\‘XáHg­‘(ê?ä_¬JÚö†ßüƒ+ å¿x¢u™-9º—çðÊ:ÐEÜ6áŠÂâ2Þ{|+*mC)".¸i’g*}ɱ‰ôÁ“ˆ™‹OˆsÚ¦uï’«8¶@x €TEäŸ4Ò�l*eya&í±3Þ»,|FOÊ)«Tö¨lN%ˆ6 ÁùŠ‹êØ1ma¬C&z‰[µ/Û9L ¨,Ä•"y0n WV·ìÂüg©ý©6ú*Š¥]@ƒ•­Ö‡§µƒ‚—"Ä™¿JwÖþªì@B¥g©Šž­;“XFY€, 7ç5MºÝ•T ›�…"êÚGŠT†cx’%±'½SN¦L‰ZybÒiI,R‚T£“UØ€•l3+Á°Š�×»6!B•‘r2‘ÏʪQ±K•&~WøTv{}Œ6bc¯ g#k|è0ÚÎÁVì)ä©‹OH§ô¶ä„`~ô§Ü RÆB‰%¢Ð:ÒíÞQ "Ü2¯ŠÜ°ZQ&˶eF=pLš¯ª-â1|æÔ[h^TÞÝ9íÍeØ�·'çHþà(Tbb|G×½»ý!ÆMƒ‰ #œxý¨ìÐ62¾L¥8ˆ�Ìmz†±ˆ$‰f¿v%�ëAµdù‡eÝ‹r$ì@�úÓ¦µBH$Ïx¬u)‘$r¥ôbŘڰ�” ¦ô„ÎLm�4ʸˆ™øšjÔ�­\†=8©ý²�gIfÀ‚¤Hàþ�µÖdÆL›õGéEt"–`X91žiƵ…Î\ÏÊ)Ûª’C4˜“31ó¡öº�‘#ÄǨëLt!P†`»^fmkz +@˜€AzŠdHXhÉ8ñz_C]­Äõ2¿CGf¤ÛçìVÆ,Ü�Ê·¤£‚Ý:ñ›R:„`J‹\›ƒÞƒhF4�`Ä›Go¥¶Õ~n1>#À¢ºS–=¤õÿz£S¡W˜`Cxˆ$ˆ5LTÇ\n/S>ÛQR¾,XÌdÑÞשû�Û5‘‰P¡K4ób#­a±ü#5c>"u°‰4=r\*r,;Æ7ªiwع7^?­D>ÄÖJ0a$,‰ÆæäÍeÞæ2Ù¯’ÂàÁâ|5·nqêÊA°Pa€8öùó4©±“\å]æÝz_˜«hÚΰæZñÇÝ$sK·fá´„>IÜ€MfÚB‰ØnLymþ”=»öÄgq’MSvÖFdÇ$Dζ��°,IˆíS;v0ØW`R¯‡�ØKkɸ"r“joXÁ–ã’ �r?jf̵ÆÉS<‹¸útš¦—͉’ÄŽb"÷_”îlÝgÊá÷�¬Oá•&�P#$•Q, üÚÂÝ…Û¸“*ÙX,Hé~ÓL¯µ•HfRG—‘3üêš6ÔÿÙ~DdÅ ¯°lÅI:ý?z];6Yg>‚G˜™™ðÚŠíØU‰ƒ Î 'Ülf`¹&äOøÚÿ­ujȧ‰³2|Q›SÖ¨îwR¸È‰�=GÁ«�O¸QÁ�QŽ$A ±"äDUõ»A,I I•Äð˜¨.Í›0-š¾KáÄøI>AkóUoX�ãa$‚q sÞ²6üœÜœA‚zt }h,Ì`Ÿ”�J=Ew \‰P\-ÚÜØVVÚDº*¯”! ŹéLhÖ¥Ëæ`¸Æb<Àbµ¿Íë¨Í°�l ›™–àRmW%� ßæFXÂø~kÓ#{ƒé—‘ l`ÏçM¥—WøÃ1›Töà9ò�UTh."‹¶ßL2çš�+ÜON•˜í9`Ïâ�”ňivâUËìX€ªD˜7&ŽßX2¶°ßúñ":–_ÚiÜî\="ïrEâ rZ³:)ˆð æ�eI´µŸ0ˆ`Ÿ•daà`ÀZÆb±t ç[4âDÄÇX 6ê1¦FBâã½c·Pf¸Ì6“D¶°Àa74=]~#šÂóqo�a·YORF2Dͬ`þu½]w2P bDA¿4ÁИÈLÇ=i~¤>&äž�¼þ´Þ¶£Ã¯Èã½W^æ¸÷‘}MdÀa1<ô­êk’ÀDMÇ^(—U"˜{Ò«è Ø²å>0™âõŽÍM +XnÜÇûVµ!ÔŽ,zŸ÷¢ÛHV`ð ¹ »C3ŽEäuGÕÕoñq~Õ†Ýd1øÑ;5† +Xl.ZU�Ô0ç½éµlP8 ÇÖžµ#ìÖ„`¤ÌyŠÞ¢wÿ¯…·WVaõ0>´©³J�¤øG4ãb0$M[W%€‰&{h6íJHf&I°µÍëzÈOÂ&ˆæ”{­pKœß�a»Y¶C¯åXîÖ ¿n¼MeÝ­Î*I7<† âžµçÛ¨³‡¶ »ÚüEê:´om*_؃72<Äžõ_Kic‘RC ˆíÏzu6œ@U–€ì¢ +<&¨ÈÄð±3~µöÎò¥„ÊOS"/ñ¬}¾ÌÆÌÖ@òÄ ˆ§×©õë á•U¹&-~(ìÒÌáÔ‹ræ“_·t$‹ˆ›ÉïNÚrÔu‰$À�$™ýoIöÏ”‚9Sÿƨºœ6gÐE¬.gãS>Ѻ¸'Æxþòö¢}»�ƒfK*r8ãßãGÐc•7˜"ÜbzÖûr%A “ó‹Ú)_ÛlgfËâŽ_÷îªmÔÎF ¨‘Óâ+.DPD•8É“ßÅ@ûs�rP´Nÿ·ÅniG¶+üqcýj�¨æ]Z 4‚xâ/j,ŒÊVD˜‰£ãH¾Ü¡•k�H$@2 M¢h}³JœÇ…³òò@Çû»Q×í›S3+ËÄ?Ýÿu €n³27Ÿ�ïO§Yׯlˆ$ÈÉžæ©Z§³PØèÄù 1ÞA_Þ“Ñ`$4²ùLtíÏïRöú¶ìÕ¯fäû}…WÔÔHx(mâS¯¯S"ã—H˜¿êi~ÜgY"ñ&˜ã�•DåžWÇaÞk «*´3ǃÚâÒ¯ZbC“X{b lîZ|¢ß) }¬êmEüåÉ1ýòcŸ�íž6Ùõ$ùE‰jmZ¶œ�-Œ&o@ûbu¾¬ü; kø‰'¯Æ³û|Á¬H<^Aö£³Ûú¥so,Äâ:ÍaíÿÈ6–9&�¢Ž¥s“ºúd±ðÌÊ‹)Ÿ�5Z5«ÿÙendstream +endobj +84 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 8 /Subtype /Image /Width 96 /Length 242 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ `ÿÄ0S“ÒÑÿÚ?Ñ5ÓjÄ +r.ºlØ�NC]6l@§"k¦Íˆä5ÓfÄ +r.ºlØ�ND×M›)Èk¦ÍˆOàk‘›ŸÀØ#a?�®F,B\ŒX„þÿÙendstream +endobj +85 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 776 /Subtype /Image /Width 9 /Length 902 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ "ÿÄ^�B23q1A1ÿÚ ?õR_ïòSÛõ“:¹üÿPMî#G·ë> ÊZ úçÁ�;@¥h÷×>2gNÐ_é®|NÐ)WúkŸ´úiŸ´ +UþºgÁí¾Ú{x"� R­öÓÛÁí¾Ú{x"� R­÷çìE;Ao¿?bJZ*Ÿ~y&¥ £òMK@¥QŽy&¥ £òMK@¥QŽy&¥ £dš–�J£òMKAF9äš–�J£òMKAF9äš–�J£òMKAF9äš–�J£òMK@Øç�)h¦Æ™–�³¦@¥ R›:d +ZÇ<�K@¥6yä +ZÇ<�K@¥QŽy&¥ £òMK@¥QŽy&¥ §ßžI©hª}ùäš–‚Ÿ~y&¥ R¨Ç<“RÐQŽy&¥ R¨Ç<“RÐQŽy&¥ R¨Ç<“RÐQŽy&¥ R›<ò-gL�K@¥6t–�³ ´ +SgI–�³¤�K@¥6t�+hZHT´ +RkI +–�5¤…[@¥&´�©hZHT´ +RkI +–�5¤…K@¥&´�©h:HT´ +RkI +–�5¤…K@¥&´�©h:H´ +SkI–�³¤�[@¥6t�)h:H´ +SgI–�³¤�K@¥6t�)h:H´ +SgI–�³¤�K@¥&´�©hZH´ +RkI +–�5¤…K@¥&´�«hZHT´ +RkI +–�5¤…[@¥&´�«hZHU´ +RkI +–�5¤…K@¥&´�«hZHT´ +RkI +–�5¤…[@¥&´�«hZHT´ +RkI +–�5¤…K@¥6t�+h8áJÿÙendstream +endobj +86 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 312 /Subtype /Image /Width 448 /Length 20390 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ 8ÀÿÄW!1AQ"aq�‘¡±2ðÁBÑáRb#ñr‚’¢²Â3C4Òc³ÿÚ?ú'gÝcÉ�.DÔà?©ý™{rß§+^á‹bÿøšéî3£c~�à Þc˜ƒô5Œ9ÁPd´�¶A+ •SÃò¨–6dYY�T‚D4¯ôén°Ù‰å„` +’uéáºÔöàL`ãOiZz•B}ÃR¤qñÓÚŽ�v��ÅŒºMO¸,¹FÕ7`¶¶Ëóó§Û=™X³ÎA`Eœ–Oô†ÛéO: ˆ‚ËÔeH¸qþ4vé„98±µØ(á¶)´ÚÍ0®²Ìq®‘—ØJ»�²Xž™·àqŠŸpÍ�2ª½Öà*‘Ô?Vë |õ¬]âª]2 -úŸûmëVý‡ x¸RW�"‡iʨé$ð� øÕ¢¸sdöË&Æ-�Ò¬V@ÛvÛÑÆ©�žwœdAu¸ê�ßpƒ¡�¦‘LÍŸí`�A’H–êvG#s<¨Ã“Ú>ÙG’ÚHêbOPµ&œYƒ'p"À˜�ºðý5žÜl¬ÈNüŠÀF�¨¼yšÞFÜ +Ö*M�_áRÄÝÎB7SH‘c Œkæ ü§*Q·0:ÝbÖý\ê�ҳʬÝL mváGn¡,¬¤1 ZL™�œ~&¦¸2{·:³¨¤‹N¢ÚZµÜ`ŒK�Ê,´€)mfι6�]|e¶|ºMk;³í@$¯Þ,Gêã¶jÏq‰‡¼ªmƒ2L\{h8Õp†b?ÆÊF¥€�¤…ê1#•t`ÈÙ•‹.Ò ¨· ¬fÃ.™$‚4õü�k{–'iÚ8qk /n"õ�úälX1£+)TUê‰éK0¼N¦ºOÄ}k�9±â]¬`™´ÊÄXøÍa±>\έ�²²ï@ê +- »‡*éOqA"äÜ�OQˆá&ž.Ó.« Ú™'_:½¨*ErãìÛJä!d˜�$±“s:šêEQJ�*YðœÀÅoxâ ˆ­dF*UÓ11éF$d͸Þñº E*ž'bX±c7á*¦Ôè¥ÆŠ)ð¤)Ò¢�¢þTè(¥kN°øÆH�‘©§lˆwK1æÄ˜ò +°¡T(�aNƒ@¬dMâ$�(üæšcÔ(áZ¢Š€îñìÇ`?×ÑñÝZ=Î%eBê¾ÐH–ò7q‹!�AH'A{ü�,½Þ&Ô˜'‡:oÜâÆfZxùV±ä\ªH ‰hA¥“'¶$Ç�‰?©¦tî~7R  ÍüëiŸY +ÀÇ/ +Ê÷x�Ê+‚Âl< …&î‘2*›nÐÚ ˜�:¼×.NåpæTv#r±]6Âã2ÕuÊŒ$ELw˜\CÆÄðùŠOÞáÆ3À'h�~鈦ýæd‚ÚkbBù‘§­Zf±—IÜT �8yÑ�:e$)�¦�¬ëh“¬L³¤NšÚž^ç"&H˜±�!AîñmVÜ!‰Ìkð‹Öñç\¿lú‚>¢©5�Âcm¦Iähžq¥MÜãÄÌ’L�Ý'¨éöþS[~åqmÝ7ä }¬eîT£ n)þ<<ÈÒ‡îÓ]ÄDÛX°�/ηï†uê'ÇÂÑCw˜”&ÆcŽ€žTò÷ ˆ€C䥴ò¡»œhªKj`s'”TñdgÍy ÿÇù×LÔ1÷²:–#ÒI—ÆkC¸Y:Úƒ˜ïÚŽ'ÆÔÏp�Љ$DÇé‘7­«†õ¤îIáXLêíA‰ÅÀÿZ¬Öe‹ÛXÖW¸GPÀë§¥,}Ò8bAR¿pa`}uáS?ö–í¹m7RyǬk«.pͶ¹¼jmÞã[™÷#¦t”Õ†P`€oáüi{Êoõþ,=ÑÌOL|­=\A­'t­0I‘G7ùS~åqë¥ïhµ¢¬ ‰®.×>&Æ[p‰fŸí,Ho.3ëAιB4À2'B5Œ[>E&aŒ_Nœs©díñ3±vd‘ U¶IãŒ|«M™20Tq1¸ú–âTøó®œ + t�j‚&jóbÍŽU•–.A‘RÍ$ÉÛ‰äܽ>U…À�PãE# ‹®Ç�ÆÖ5ÐHÅ”3ñ$%¾Fº´šÁu0$XǬW3·y`ßsm×�~^ð™É,Áƈ:-¸ò5D'6r°¡qÞÆzØhyGæ g!“!$ˆ,T°ÔsyãÆºñ\j@��¦Î¸à1l?*ãÈÞîeö˜“0&à¬IƒŸ�hœ&U­u‘{5 [C¥¨ÉíåuF bËf�é‰ü½j=ÆLxÇnU¦ó«m »$Þñj«wÇv1ï +vÍô~ +î&kŸ's‹ã�È8üÀó®^óºFÄ#.!"ÖÞ›¾ZÖß9 6APA$m:éÇÎü¼ioĘË!ÕÔÌžTÁòb²îŠ0d,¡@q`’œIð«Ëî›ÚǙݰsbv#$¤ 61þáôñ¥‘p3˜D›Iû‰6>—åå[,�Q÷2¨$ßuà6³ ãzÖ‹“1e¸¸ŸEþÕ^g¸˜Ÿ;–0nCd˜ç]}»‚‘Ä—úš"««–k IS¼ˆ$¯M¼üh\©�Ê7\“2Çõ¤Ú—dŒ¸É`Ãq¦%aBÇI#„ë]">_W��ØwÌKnW~�<:MþzW§\>êöe›+1’DÇ Å”$˜Ý•iÚW¦Äü5½ABfÌÙÁ0  ‘‰h'�‘?í„á(EÎ\¦5³#äEwëà·¼~“@Åâ8~$VÛ*îÚu"Õ$ž×±g˜�_I�ãXS¿({Á�§-ÿ+Ö{u8ß*‘;›u¹Q…1‡·VÜ0+9:…µÔÌxÈɃÔZ,bÁ¾ž¼+§"†ìNºøŸU Š4úÒ�X(øS£…&Ec$L :Š~ˆ ‰–Ã�ãr©óA„ÎÑ<âô XÀ€¢‘n<é”RC@‘¡ãZ5Ÿmf`|){IÁG-+[fÓ)2+ HãN‚ÔRU  ¢$ÌPTiÀÖˆ©Ò‰¢®\�³û¾æ6U$AÜ»Œrp·ó®„Ç´’u5 "§E0(£J(©ÑJƒN–”EéN•• ’ ¯/ñ­Š(  +"�DТiŠ–ã0$D‘ÿ%%X_ÄV{¾ãö¸2f�ÞÚ3@ÔíjªOjI�Û;c) +º4ÝŒ)Ó€ê«îhÒ ��±ÜˆÖ¬6”M"à�( &&ôÙ‚)$ÀÍGfÈI0'C::~8ÕC«ý¤*e†“KpQ$À¬œÈ°2|©ïR`?‘̊Á Ç„ßáCäLcs0™1Z àÖ[*)�'KѼ¾ºSWW ×6~ê\n›·A¾€žºxP2) ÖW¸ÆÌP:’8MèLÊå€áOÝIÛ¸O)¬bÌ\¾ëm$pþ&„îðä�¹À“ u³•VÖ“gÆ«¼°Û3hçPîsäL˜ÂmÚOTÌê Gƺ¦£•³6Äy™´Vû„xɵ– Ômý½_Z®LøðÆöt“­ Ÿ@á�S¡Õ êLN¿:ÆNë"Cºˆdè9Ÿ +Ó÷±Ágn$ë­«ÆÕÇÿaÝûŽÆ Å¹jÍ”Œª² ƒc©ŽWü«c:T0$jχ̸ÈÜ@Ü`x�mMs#±PÀ�&&õÌ;uí„‚mü€L™ÐxÔñöÍ�cÈßã`$�åJÃÕò¦q©a#wQê&±ûxþ-Ta�#ÐÆö< >:ø×63îá‡&V[Lí\…Wíåoεß"'eÜíP³‹$Ä\í"õ|˜Un$Ü/smÐdH×O•Ky\Ž×�¤ØÁ?N¾”“²ÚY·$î&J ÆA™Ší�À&àü*0†´‘Î;‡ô™ש>1‹:{H© ¯¦„øÖ;~Ù.BEñ¸5i\oÕã”±c,ÎFÐT!Ô²R ¿ÝPÀìØrmûƒål)éÈácA6㯦!‰H_p±:#p1Ê+GרT¶†!S€§Ú-ã¥c+¦w‘´²ÆÉ´.œŒÍr`p�·fÄ&0AÔ0( øÍzÛ�17£#ªNâI7<I¨÷B‚fE†¶¼kÆ#ùMM7cv9 +…�ñˆXÜݺ´¸ñì Áf‚#„ŠÎe�W +Î@$)¸B È:wk[Q�Y™˜)h…ÀñðùV×ÛÈ Èe0dÜØ×:–\™@е�Óh÷@øúÔ»ÜÈ�žEÉ‘w¦6ßq÷,OÂõØÌ¬Q–ýRH?ÚÂMK½v¹}©Ýí0M¿tÁÛ¶/åZtAµ”ž‹ºqX�Âÿ!Ê·Û#,ð ‹ �'[žB«‡·\ µKýÌ\üX“KöèL‘7ã~3Æ“vèñ"`Úú~>–Ò³—µÇ”ÂË¥Èá�`ÿ×àee†ê��ÀdS~Ã@C)‚¥H“u´Ç®µ¡ÚcÝ77˜,Jοi1Oö˜†OrëÞOè>ÿmŒ™ Ÿ6$|&8[•Q—pþ+ÂD"fä›ëƳ�µÇ�‹r"I%£ÌÖÓ +&“a�e{\Iöˆõ<çêižÝ/mAŸÕ­<¸:u ¤AB9t )F¦}ušÊv¸ñ’À"$’Æ<Í5¨ۄÉrOÔÖŽ5}GÎ>•…íñªì‹> ÌüiŽßªª¨t@Tý”‚#QÊ’öè¡€v³yáI»\l‘ nI¸2&uƒQÙ‘zB:¶í‚|$Õ†GV·¸é73¨Š @¢dáBf/æk#¶Æ&XŸC"´0¢�B‰ò¹øÖOmŒˆ*ˆƒqѶƬ¥Hp¦1ªÉ]|i.O´5ŽnmAÆQXÃÚáÁ'*î×h|â–.ÓöñªÎ»T óŠ Æ«€ŽC…kjÌÅôšÁÃŒ¹}ƒtFèêŽSYý® cXˆˆÚâE%€˜’Ìs âG¹PLDÇ +Î<ñEU)¾4È!”15— „PlbL à8ý)à˜‡J*¨~U¦ÄŒCŽ1AÆŒI |9P¸‘L…ž1G´ŸÒ>HLí +Ïíñ^o­…ê9{S¸60–0°×HГå[ÅÚªd9LL@ÄŸX +è§J³<ës® &û¬4½§�…Rh¢h&OaœAðüª”�Ó©äÈP€´ò‹_Œ‘T4M4Æ<«‘w #‡*Ð`iÐ(¨fî}¦Ú£sÜ@×o�“ò«©ÜÓÀÐXLqÖ£‡9ÈX+©æHáåV¢h(§Jh§E¨št‰µOo{x"fÌ +�y5¹¥3J[t@Žsyò�ηN¤™IÈÉ´�±~jƒZsH‘D€iÐ ÜWâd!ýÆ�ÆÓÓÔ`[Âiõ÷XÑÕ™7|FáãÇÒŸlL•,Z¦&Öà)§ÞG· ( èC0S?äÏ�f,=LeäI’?ÆÕÔ¨Øn]›�ã—„W;aîr9 ÚAyl-´,Y®ô˜¾µÆ¡»œŽK8Ué +%‚A25ҖʤPÊZ´O°ê ±�%¸�©3ú¾´»5ÜÎn66Ý~î•2ÜÍõ®Ö ž<ª8ð„¾æc$ëùW#³÷¤Œr»wK2èÌ’ÿ¶E[2åIx¢k¹Ô-Ï!¯å[tlhÛ ˜;wndþ<ê'|±e$‘˜ƒÄY¸Ç)ãzë8C–Á¬H¸ƒðð¨öø×%mìÖI"Är¥�}Ìä†m¸Ô&Å�?!õ®§m·òñ1\¹%q¦EgYe$�Öêž 2c€¤’ùÈ3¡>VKWmr ߙԓbHø!üëf‚~oΩ�’ª†âgpݶ ¦ûqLÀ-ÿ"k]ʳ¦ÐH›XßN*1¦ywÐÜ:Òö°•™X2wô�ÓO €ÜA’Â@Ÿ ŸÇ…mð&s�¬B±[Ø‹­ëŸÞ#¨Ë�#†Ü…ÿÝKÛ³¡Rĵº™›ˆ“oéÊ–~Ñ»ÂX2‰XêRûMôë3#’˜§r�ÄJ™R¢ÆIñŸîÇŒãP7<Ìñ|«Ú†ÇÊ@�`™1´>—¬àP,ÑÀXFœªÙ~ÍcO®žµÅƒ£• +RV,#ŸšÍ¹ùð®—À6ìRT ÐënzøÏ:–$ï¿Ê¦‹°}¡ò3p7nI�ÇËI®¡þ$�rÆ+˜ö~ë³o"azôþ©®Õ�æÚó®gN²7W ÿOÒm\й´2( häU#‘þuÞ¸q£n +:žB±Üå†D÷VÙÛÓÒ½2Ñ®¿Â­�ULZçwÞL‹p¾Ó‡·•ßtï‹r�”í=µTРߨ›ÍÉšÑÂå¤9E züiâÁífI$ŸROçZt Ž úƒ" {=Àr`’< [È©ÄÍfÆt¶•–ÀZÛÈ>R?ׯ¬Q<˜w°2DpÓéRÅØ®4+½‰Ô3A`cm­xV±ö¥_{df1l ‰õª® ¤‘ÎLqáJÓ(aåP=¦â¸þ7×åoH¦ý¶ù‡eh _ŸâÞŸ´ßl"9 ñ›v»çs±A"þ”Çmw±å1Óò­."ê7ÓKT‚ŽÇ®ûG±�éUÀ¬¨7Æè£ú¢¶È®¤ ˆ"¤�¨@æ Dyxê~5¡† É™ž +­Eûew $Dè`�~²�ª¦î¦;µ›Úf<®i¯l Af7&I�uôð­ãÂ1MÉždšmŒi§i‰°X'Ï™6dÕ€ˆŠ“vÈͺóÔxÇ�…!ÚbÚI‰:´ÏÆk_·KL˜¸’�Gÿùݹ );Œ™$’co>VòµlF`©Ó<|¼¸ÓÀ¢�Ænb$[…ç•S5Åe[ ÑJ¦3ãÞqî„Hâ7L|vš¥VS*ä�¤0`Ìq­ŠSEc&lxD»çM2+‚T‚#È�k ÜâÊv£©<�«QA QJ¦ùÓªÜótÔøzÕfƒEÒ§4Rš(4Q6¢Šu�ãvÞ15ª(&§‹2ç¬À1pWO:Ù¢Š“gEm„Þ&9�-ÏQñ²wI‡îŸÓ&w¢#ĉ寬¦h Ó¢�)LÓš+–{‚wnXí Ã�Ë�Ê¥Üw910%”=Lu>\ª�›!Ëí¬´ÿÅ·_Ϧ·‹!%”É".c™<«Ÿ¸ÆíÜŒª´($®ëFOV2ª�@-}²bO‰ÛóéSí_¹~¬€�$?í†'ã]l‹�`:ƒ¥pÖ=ÄX{‰ÿøâ®žî}¦ ‘µIµ¦Ð”g�‡9?•,yˆÊq1’>�1ñ†øxŠÞbC)T% €mÓñ"¹;Øñª<{„‚ðA†€`Û–ÑåãUîݱû;`Ñ'�VoIÛÂk¥·‘ÓÈ×”ßå\û²ã^§´ e’;ëM;ƒ¹Ô´ì!I":ˆ ðê.Õû¦`r2Æ[FÖcóª{�‘‰ß³lH;HÛ©:Ï1æ*yreL ¾@�¶m´KF�S]L¬V\#QTÍŒl9K¶¥Š¨‰6Ò-o:Ë>vÚ¡‚³9á cþ1¼Å<+�±mÚ×}¤¯¦œ*xŸ¹Îûƒ²@ .Þ›AS-­µ»—ÌÙ +«²�$*° ëvò¼Ev—Ú“"ð)k +Žùq£î'p@$ ýk “&\»Š• +Ä «“içÐ�YËâÄI;™VO T7²A²1Þì‚ÂìªÇ«Kt“a¯…kÜlY׸dvÿÀ§>{ª™§6ÈX� “–úT2æÉ¿ ˜®œT13<:mëZîs´!3&@!dy�yÕûuȉI>1#ÂÀQí°vy¹¢Ütž<둲äÇ‹ÜmÓï `1:6Oh7 ™Ýåoô˜·*áí÷o2ÌL�IâLtÚ4å�®÷ÆáŸF¹�¶* ˆÓ_ZÞ @Iv`L høøT—tެ �×'!ê_ölÛ1Ê/^††¼ßûcŸ X�'O¿kfl™ÓÞ*!IA:63r|¹VÑ[»w%Ü(•P%*YIÖòE¸G +®LnÐă}yX[Ä�A¨cu\Œr«ûä !¤ð¶œü 2ì…v–$Ü�6Í–`í±\r¨;Ä^Ðìúy�Y$æ`ŠÌ �×ýÙ’7>èÒÑô­cÀTAbDÍõçsü+iŒ£1ÜLž<*»3›*ä÷mR¶ì­7ôÕ Ï¿q�¤í�~‚ƒ€î,‚DøúxV× +ª¹%Œx“sXÉÛŒ‰±˜™ÔÛ«œÚ/Ulr¶5œx¶jIó¦1Ã’f-ÀyTÏm-¸3 -äOñãé‡ì·äW÷mÐŽ<ÄñçWÆ µˆ¿­n‘4è¤MéQ4QE:+%€ éãZ¢ŠT LÀ  ÓÒ‚( + +`ƒE& \š5P)Ò¢Št©Ò¤X V‰Iµa2®BB™">zVéS‰¬äʘ—s°Q̘­Š(¢Š(¬c̹I Ã[­nŠå^ç#› 6?«� ·ª³$î½õóð¨/s™H/ŒµS&|ÁöãÆÛ;‹³ýÝ$‹×Vèá5Ê�ÎFÈT„€H0ÒËÄM†µ =ÖÌNÊ„u€ÔáctL]¯{×J÷ 6ï»A kê+/Ÿ2Ë]²–2dÄØ[ñ¥S·ÍïâvÆà qƒq5Êì]²²*YX †ê� ÈR¼k½rnPÃB&àƒð5ÉÛ!íûXÄ ÆæPx`z„1�~T ÝÈ;Yq†&O vøÁ w�ìÛ½�Û 1¸§†€Íýj©‘Äï*|�·ÌÔs÷Î¥UdD•ˆRÚÞt�*yì2dU ([(cyDEþÛƒ1Ì� ‰àA_‘ƒQ‹…]°Kä% ÈÞN×&ü9xEk\ÓB‰€ 'Æmâ+}Ķ6M¬JëmEǘ®1™ÏmÛ”…܈@›_l Ö/ëVÍÜäÄ£q Y¶’‚ÌMæÀEæº0–d¢O-+—u‘Ýd…Ü'c)WˆR׉½ª®ùÞN=¢807>`þ_³Ÿ6}ŒÈ*³ »‹˜±§›¸tU€ &þJŸœÒÇÜe\¾Ö@²ÊÌ»t„Ø “âÔ±åÍ›k.Ц ‘ÕÕµ¸4}¶×[ø/vû±¬†m¹€‰Ðx»œ¬’Tî$�*WœMÏÖº4Ä<)¸c¸ÓÂügZçDÌŠFäÜH’�[¿:vŸ1V H8ùÁ§‡.\‹& &"v’4“YÍ—'n�‘ÚB)$(Ú$Øü¯TWmûIà Z/:ãRÿ²fÇÛd`Ú¬ÇtÇJ“ òŠ3¾Pv¦@¤ƒnæ1|¯xµÕ&-¬W&<ùsªåV„`¥FÙn½°Zú Ð|kiÝÙ +n›DÚÚÌÁåëU##¥¢t \~8~'†FÏÛãÊüˆ®ôîÆ›O»cr ›è¥LDÇêÖ¡†U²Û@bLŽžj­“(P¢ HÜ@àLMϯZ¦}̬ê;`ùGð©&@7"…Ô�¡á¥U[#´­ø‘Àøsü_Nl‹“¸ŒO„í2³b¶Òuš1 ‹�‰ÆÀa¥cDç…<ë�³F6#k€eu`±ú¼)>ÉÛäÂAÆA60uõñ¬õfÊB¹VP¤¬h ÄÞ†º{`ª»-3ÔLž&õ Ý»dpv·Ip`>Ó0¢xèt‘jèOq±Ümb4û ü¦¹×Q“¥6,’ÆuÔô¨0$™'ð&½¶B¥cs£È ÆÍ†ªÅUÓ.M�1´dŽbß*Âc÷˜—`ÄIAܶ/À¦µtÌùF&¿ nd#ë΂3cbQn¹$íêˆñµ¿/ÔH“?åí×'o…1ŒdíP³*4X�MP‡vS´�¦u±�A0eDtÚ`±o¸)‡rÄ'@}|(\-Ûï XÞÂl¹“nUÓâÄŽ¶2RÂѨ1¸GÀEt¹î³"�»Dì�Çq2 OJ +7Äøi\øW>b™bÆáÞ厂ðüŽ´ã+21@!L‰›’¶rÖ¬û¢À#� ½scí_(Dû@/žØƒëfÅ™à64{÷F׺OÆfº0ã(¤I$–7¼n%¾S\ËÛäw•PÈÜÀÉp¦@°_ŸˆãWöò+1Xƒ&oéóþ2ÏÚåÌ; ‚ ‚EÇ Ú¤ø;¦ +ŽA’7A£í¾žvÃ�ç\»GJ²Ž®Tž�¿ÛýT»\9{|J¤)6›˜°Ž^²áî!ÄYH%fÅ¢vžÇ­,¹±‡Ú�¢ç�¨ôµ,C¹+þM€Ûí’•º("‚(4ªgL\ë�c—•mQRÀF¿:t +(¢* ÙábI]u¹ƒæ& X(P+TPh¥H€À‚$�í0†Ý¶LÍäßÖ¯DÑE*tR虢Š&‘§ES¥J)ÐiiE:( �/@2&Št¨®,?ö ‘Y�6“ºnä}ÂVÜ`Û�T÷hÁÔ®š�b‡ïéc$�|´&K¹ïQ0û�ö‰"`“"fÐLˆå¯“0KA&&´�pU¤ð‹Ò\ƒ¹)"G„HäcLj©ÿÖel½¦rK6$,OTVÊ�Ö="Høÿ +ÀîAMê ê+]Êv�|Ek÷)bð´Ï-kK˜$àk»U�ÊVt˜$Üó¬æï”b5‘!2~Ð0\"¹¿~·!Y‚˜bé°m&L‚4ÕÆ`N„vŽƲù¶“ÒÆ5�á>´Îu€yéãQPrfÜÛ–f×Ý68PÝê‡(0@Õ3F7fî[nÌl/ybàôÍ…‡~�S\ÙW!ÉFÙ¤™Û öú�é5¿Üѱ¼øSýÀÚ úL¬ÀîK*PÌA¾ƒu£Â¨ù‚:›Gʱû¥îÂ)·=xV±æ$°eÛYê³>EWhìcF‚ óáæ u¥”yTûŽà`PH’L(ÍÈIcîälq  1ÚÅ€ÿÚiäÊ1ăr„ÜÒlûfTØL'åI»‚»ISê/™>–îX �ž X�À1δýÎÒad2“ ¿9¥—¹ØÊ¡d·ˆäO*ØÏÓ,¥m1©ñ›ŠÊf,Ä�gYðð©þéÈ$$�­ô�&|"¨¹™�2¨ã ˜ˆ×@k{Ú@�34²d*B�3}ê¹îaí ÐJ�öh1®Ù +Ò÷{ñ«€%¬˜˜Ý¬rð£vYÙ +€V ¿ŸMû—WE ;‰ý_hMW.Î8�X\ޤ;†ž"¹ñg|c8™n�tw'ñ¥<ÝéÇ�òéI™�z'uˆä-ÏÊõa“&â +�Èο*’÷9v‚ØÀ–mmÖç ªaÏî3¡ÕOä‡bÅCã ‚#im®ìÊAÐÈ4ñ†w¹ _¨�M…â>'Z«ä ¯6\]Î\FâÅ„€m`rõ®ƒ”c;®ÁŒ‚‚ÆãMks£ªä[^įQÿhhüiK¶Íí'Pƒ¸‹ÅŒnñ3$é©ÒµÿOÿèöâ# ‚H ñ£ÿ×l„ßp°êOçQÇ�ÜÆqäSò´Ù€—,šÈ:ÈñOsrU„“´Ç†¢f'ÇÊ™È60iI%¬l#ý8Qí¹t.¥µ‚#j ­Í'Ap8p¡6âédfûnz¯Zoh�u¯Ú-4å^m™³.HÞ§ì}Æþ�³¨åU˘eö‚«Þ Õ„m*z­cêÍ”b0Aˆ›)<|EpXÉ2n‹˜Ø6ž+ËøPs3åãq04Ò\™Ž5A�+º„n�¦bÄ™<¢±ŒîYÈ0é�b‡!2b#ªº±¸pHR.Ðø�Sl›]º[E™©!ŽáòÁ†Æª,fq³“Ãû­Ag|cÝ0±Æï±éãüé"6Õ` )6a `Ë0¼ç•.䈹=¦b�¸%¥¬WÇ�·Ž±TF,\l‚5€ žBúxÖ0†60$þ£»†¦þ +;‚Ì£Æû•¦-g “6ª§qÔ˜ÙJ–Yó-j}ÈÈP´Ìž A?X®nÛDî™¶0VÄ¢æv”g7>;íäf+¯9tRÊ 6·¯ãø*Aòwâeˆ={nEâž4‹å`‚,KZ"ÐHåOl�-vµ¿µGåSÊ��2Á¾Lm$Za?ûk«à%LÛ¦:¾×®¥92İÁݤ1ãÎ/çPÆ2«NÆ�Ö—ž$MgøQÛŒˆÏ8ØI‘§ê$ð<&õa�Õs07‰bXqYñ[ÃŒ¢ ’x“©ó©w ë• +ãgA ¨Jó`xp£s¶]Ç �§Vè6ê›mãXíñdNßk+�ßlX†ðçYí°äÅ�˜¤Q&A‚ÆÇS÷røÕ»lXË6DÔ¾¡Žãêu«äfET±‘`@ú×.Lo“ÛÛŒ®Ø1+h+m|*]ÆÝÂäFH•`ߨ0Fï3Ñ—äUmƒ‰û&Ŧ5ŸÁªºº‰´xÛN"žw».ÛhH&}-ZÊ¥‘‚�¤‚‰ƒÎ*x0û)$’Iˆ’LøÑ�UbYÁHXüÍW�PŠb”T³á^ãc$€À‚F·jÆ>Õ�RùYöé`8EàWEQDM¨Š MS¥NŠZS¢�¢"–Åݺ/¤Ó§EMŠŽNØdpåšAG~f­E*N�ÄzQNŠË®ñ"š�¢)ÑEP*I�rÀ‰±±µ,}Î,‡jº“¬ hgÇ'¨tÌßHÖhÉŸ 0¤�|«JêâAž VrfL@o`'�gÞFMêClMK²Ì{€X¸<Ô6é"MùÞ¯—(Æ4“À I®Lýá8—.R»ÑLu}Ϊoà ®œ9Ó:îF /q¥­­is#±ð<�ö0Ûw µ¦÷Ÿàhñ´Ã 7Ð\_àkû¬Y§cL ðŠxûœy¾Ã»Ä·ã¥{œXˆ À@œò­dʘFç kã\ÉÝ� =™]JF¿î5eî±;Ss¥�ü�¡h©cïp䀭;¾ÓÓÒt6*}Ë1*FÆ Ž•M¸�Â=+§vÑs ½cu�+mRf&*c�è=Î50O;Á+o)¶tCfbÀ›øÆ”dîqã`¤Üðãø±¤;¬eBJ¨w�<š*c¾Â_`&mÀÀ“�ªeîSÉžK}¥ûœm�xib&F¢5Ÿ +Î,Œù]£lk�Ò"'•롘(’l+‹7rrmÙ¼ 2J•êÿ];•Ä@!�ûT·Ò´2©PÜ |ë?¸PáH �-c5…ï1¶?pn+ YX›øDü«y;”Ç7ä ¤;�ÂB±3o¬ÇδùÑ,bHyž‘Ý'V¢9ƒ.u‘Ý«1Ý1611Æ4ãM»�o�ÿu£AÄ^Œ�Òãb +µ¢Lt‰Òõ~T™ €8×*`ÌFæÌŵOüu�_Z¦2}ÂŒ…YÛú¼*ß¼7D`›Z“wALc¥Àé¿�e»ÄT`WwHžžu¥eÌC©�4ƒcðÖ™Ì@'cDO üëháÄ�>µÁÚ:®Z äÊ×ã��ˆ>FEùSí† +Ã#ÖÍdžÛ^ß*×|ƒØÈqޝi¶mû¦ m‹ùRÌ…È(@qÏúnvƒx˜½�‡‘ +í!@‰±nM¼it.i'¨ˆL@þÝ=b¢¸¶>B¡@f˜‹­¼éÿÖÝ®?ã[ú +ß}…³vùQD³cp‹)§Ýfœ3ˆ†—Æ C …Ô?;m™ ‰î§ûAñ;ËðYô£!ÀÈ„®ÉqÞT¯ÚI%¼ ýjN¾Ãa,À*�Xþ˜uY-Ô¢º?vŒÛ& �µ¥ˆ1åóÆ âa¸l‹Òm¨øŸ:¶7Ih^” }ÖÒ§Ûé‘|Z†æÛ•5l’¢HØ›¡-Ó0Öþš†^ëî1º°esI^©¾#ë‹2¸Â2¾àZÆ@S}ÃîÖGåʺòN¢DmçãQ÷1:¢‚¬D€²&@"Õ_toUàfþ"-õøVò@[Ž#ã5ÀFFgLL…‚�7FmÑnDü"ýòaÊû« ½ ýÁyXXî2œ ¼UÜ¿p'¦aæ4�ÇAÆÕƒÝá÷ÕE“·h›Ì>‚¹²w•û¸È¢1 Y�ÉóÒº²äC†AÛ¶ßRÁ¢<æ¶rãLª¤¾Hi‘0 ø¯^7M™ÈQsu€¤^8RÅŸ^à²2°d@ Ìo'N®žà>ÉFÛ ¤ÚzCÂZzÔqe¹ei$°0âÖ“eŽãn=·nÕËcÙn:4TÉVÍ��pªÌ�¹$Ï/¸kZR¹Sy·1£n0/5�Ø=¬ƒ=°Œ$¡Æ%†�@xUr0l $K‰þé‹úÐæ3¦M@F$û…"?ñ½ w¶è †Ûâo+ç7þuЙC1A2±<¯O62ÅH‰S"Dø\ ®qߢ㗠j¡X™þÞ�O…¨W'#ÒJ 162üÇ�hû,]î ´¯Ü`XµôøTòîÞB­ºD(ƒb.I‹_‡/JÏnHí±¡R­�qÈ<”¬ùé]yˆˆ¹‚¤Ç ÀþT²,ÚL“áiUpX¨ÔDúÖSö2›Ã ¢z¦ÖÖô×*9 #QÄR÷’çpé™<s§î,�4ŽU'ŒzÖ·®³áHdW a;¬9 +Á¤kÙ´>±j×¼“†»å +Ú¸m+/‘R7'J=Õ�t£ÝH$˜�¾´“¸Ç“í`tùéôªEqûH�0N‘§Öq&>â~� +ÇlÙ‡œp¬boð‚nC&¼L­üéw`TN�Ö•±DyV³¢öùp`)É“k˜»(Ç‘µó»ݯ…O"ª©à$“¯ <*c·Ç…�ƪœàDßÂ9Ô׺2>\bLÃt•¯ŒŠÎ0�ÐïÓúÍÌÑÛöØßСmh±]ànˆãUÇÛÌr*…_™?Xøó¦øúÆÈ±ƒÒ )j±Ï�•W·UD +¢ô�øÛ�qûD±Ü “p3Å`ëb4Òã„Å«x‘ ¹Ø¥�±YæÅ¦ü&Ÿoƒ|{�±3%zˆPŸƒXî6äÉ‹•ƒ7ûJ�Ä1šyñ¦7XŒm +¤Éݤɾ•^퓪Ý11]Þšüõ®|xÁÈ3( ÓÒ5Ú7tŸÒΞ.ÁP+åp;Bª®FJ˜ž'ZíîIœ®¡L|+Ÿ"nÄËŒ…ih� ÝÇÀ�k¿h�²�®ÆÀ(0ºp… óÓãWŇ2ä@-ÔZe�Œš’ª>r $‰¿½tŒK…B§H•€4BÀTû|ií£íŠ©&"ñüëk�}|Ís¨eö÷L´Ì�íI$›ñÿS¡Œ~à» @7�§iòÖk9J„ß�¤n䇈±ZÀãjÀÿ6E-Ò¢ Hë0Ö+ë>b„ý‹¬ô‰†¬  +Þ$ÆeÜA€ ‚¼V1c(ÊH o[#u�L äóêÓJïBb¹;· +JqeÕ¬?WÚbçÂk§ ž`™ð¼Ö%×)g€²Bë¡ ¯®êLq$‘XLU‡òùV3;„!VJ�LuÀ ëËYñ"¹{}Ž®!NÌØÀÑôå­u€‹�W[m€,6©G!T|XÈ€:ê9™5Ê»Œ–Î6õ7:“ö؃ú¦ÕÒ™ñ¶Ñ¼KI QîÎä' }j¹�·.«¸Ç NÙ |ÍS·Åìã +`›’G7&‚Fø:‹�–®<ýÎ £&"PNÁ$$‹[Zßnßäb÷�"Ð 3ùè"Žï&Óˆ¡ÿò6íºFÇ™�î�ZìBMݺòDko…/ñ©bí1áR«º6fø$ŠÎ~Ëqµ�‚I0Åfd~’9ÖÏl„†%¤Gêa§„Þ©¶Ea0"ˆ¹ÓRXôésB`D$‰¿6$[�5“Úb/¾7Ð� À¸œi/e…Fа7€Lc¸“Î÷½7Çí+j @ðx•LX×"²øîGóóªOØ@fþ¤‘ð§û|e·í3>$GÒ‘íñ·3bff<é¾}gâcáM±+ê'O•ÅsåíghY…3‘Æ×�5¬âѲ+±DÊ“¼“Ã]#ºoŒ;D¯Ûý³Ë•V*KƒˆÚ^öå~× +©›“âIúÓöRf5Ö8ùŠÏ´¼¸Î´¿n€‚À�åZ\Ñv…DGåX~×c,ŠN’GU¬˜1äRŒ ©H"T©ÔÊ´q¬DiPÏÛÿ‹f h(-âº|*X»G LxDËl†Þô™Q]kÛâÆ!TsDÍ5ÄŠd(N…e;l8L¦5SÌ+=·l½°`êbÆ\Õ3* ¸¦˜Ó„P£ÀE‰2}ʘš(epc@B¨ë)ŒH8 +G?éÇ:Šûù2FLXö`‡,Þ%|k£h¤q!2TO•Î8�¢9EG.Èè jCxÊè#–‡ÒºE"¡µHãFTåAƧP(ö×�­”QE)›Šf‘0&¹q÷Á·�Ô©o‘=&`Õ°f9SqFCý-ÿ¤‘óªÑ5Î"¤MøiÎæyiΫ@`ÂÆxS¥DѸ…�z(§¥.kN¥�8Èì‘u$@§ÿ•VŠ&¦YƒñŸ*ÜÑE + Št¦£—3ctP„†0X~›1“ÿŒzÕè&)SÖ‰šF‰™¨fî\c@ Zü”‰õ¿1W5…ÊYÙJ‘yÖ÷ ‰@`l¶´ÄÞ‚E�rbœƒH0&ƼÄ|™pãÎÀm� ˆë¶¥fÛ§ÒºfÍ�,¥&G;Z}DzÑÜbʸ2.6gr®PໄyLÏ�W%Â!d`8ä8TûÌŠ¥Ø€ÒYÞÆ&ÛoK´-‘a§¦,`ŸµMâÚš›âØQ71‰c?rñ«ÅIh>íl§�ž3!]L»�’›AÚcA®š kPL^ØVåˆâÖ•¡Çʹr0 A;ˆƒC¿âÞuFÆÎ|#Y¸2"q¼ÿ:äl8ð2®Rù5‰¾ã¸’Ó—éãDäƒqûŠ€ FÐ�Mã©�ïn׳nÝ÷îX"6ª”[q�Æþ5Õ™E¸ιö.M¤)é�T™àtøêcÄù‘}²ÇS7ß^W÷UB±vÚ¼fnÚ³XÇŽ=^q¹£ùT‚¶\%ä–GÊ@àÐ\(5“…GtÑ`U ‹IëÔêt:E«£Ø\(¸ñ�«k€< A©v½ ÀCH1ö YõS]y*@16‘Ãã\¹ûaíãÔ²²™�¬n7·o ¶ž?ir÷2(=,Ä�ãÛæ9×¢+�úŸ0ä¬$Y¾Ôm}j½¾%ldGêqk}¬cNQLôå@9Ç¡V·þ‘\űûK.v‡N¿ÖͽJ}¢!¦ÿë[î2cbë´;AYéâ&/¨++„¡U•eÜ\–¹Õ�‡öµ§í“2o’Ä�:´û€p#M*½¨(Á]Hm§‡M¶Íljµ‡•i;5DÁé]°9ˆéZý¹Ú 9•ü®)§n¨ä—$“¡¿ˆ�…„�^qý‘ •×Äm'ÿRž¦Ý£0Ý`Gê…“çÓ*Óöåˆ`ä0"/èfƒÛ°�™,"OÄGÊ´0�cÖ‰0N‘Ê>U%ìBí'#’  $Âobñ]QQÇÛl™Èí:I€|MëK„ƒwb9�¤Õ¨/gŒ]UH!L +™µûqîû››@"zm'OZG¶Fæ’Mùøëó¦{ec<¢4é‰ÓãFnÝsÄ–È‘øüp§‹ +☛™$’OΛáCIKGçY=²” ,D‚CFµ”ìñãek’&ææñ©×…höÊ_t‘à, ¢ñ¯­¶“¸ßËøV±a„ncæf±›µLåI,#€0�oðüI­bÀ˜IÛÈA¥ ˆ97"ÄXƵ�ÙãÜXɼÜÈ×�ëkÛªƒs–EpðT²XÅ�RÝMøÈúTû^×j¸(1¡ûU: +�¦&yG­uc¸ôªEeq…øñ3­Hö¸É’ ’ 1#KzVŸ¶G`ÇtŽL@·€1Aí±–fƒ-sÀF“ø·!Kö¸ÀªßÜÓêfiÓm÷›_qá1ÇÄÖÆ]'HÔè+8»lx® Ì“rZç]j¬&¤;lk ô“ +K‰G3ëT©~Û“´\’O13ð—´Ä«´“bD“s7¼Ó¶5mà°ÔðÒyÓöðä$ \Çãv!Y·~Õ¥§—…[oµz‰&ds[F ޵GÁ�"•eA½iQWAIr.ä!�â ŠÑ¢k•TÁ<¾zVéQI˜.µœY—:îI�WëT¥E:SNŠ(4éR‹Ó4QES¥@ Ñ­QEQ@§JŠŠ:TQE +t«ƒµÈFu–ÛmÊ“ ñª#åG ‘Ã?¥v€ ‘ú�#ò­we†7#‚“ð¹»…É»f„ßm¾åá?�u�wõçÀúŸÎ³‡!6g€RÀSçË�Oö‘¬›‹I¶”û¢K¢¼�&à¬×·�¨På|@_k?¹‚St°‰´™½µñœïŒ^¨¿�7´Ç�I²w¶«2’ÃP +HqטþÕ›ÜY,Q¶’@…n )âg,dð�@&g€<+=¸tÈêÍ»F˜æÌ×€ë]tQE¦)ÑKÆ�©Ð4 QJ”ȧÆ�N‘1@3OZ(¢ƒ¥ŠF…Ò�QA¢Š4 ^¸pö™qª¡ˆ[ÌñÛ·JÛaÊÙíb-> þê¯q�²ceX’¼ÅÄ^*ƒ+²³éå"LƒùU�28‹EÁÿZÂ`Ê–@´!Tü?Ò´0ä‹‚¡Hˆê0IüèÍ…ÝÕ„Z×óò­:d�T‹ Úæ8üjm�Šè²H&ñ¡ÝÈñðªÉ�M¤ˆ×úGç&Ùö–Û"4'˜<¼+?µÈ=Ø�îI7:íT^~´ñvù�Ü̲Màh²Li}:±FÝ6Ÿ?—�:ÖȨFÜÑsΩF”QJ)ÅÐh¢”SãEŠTèŠ"Š"Š"Š(ŠDS¢ƒ@§E*ME@Q­©éJ�iEM À‹SšF�DÑEa²¢Næ™<9Ólˆ€'A75ª)ÑJŠ)NƒEVUÕÉÚAƒ‡‘­MQYÞ7m¼ùøÖ¨¢ƒELQE:TQN•T»œÃ·ÆÎH�bü,NHÐýxÕ ®\Ys»1 +K³ +’¶}¦$ã[lî£@.  Müªg¹î ”T]ÂlÌT4$‚[ª.*å™’Lˆ"9ØÚõ7ÌqÆ€6ô¬Ðr¸b˜É™~õ‘YúUD´†‚?×7ýi-� 2HY<ì+§.A‰Ï5>Ù˜âBÑ%Fè27~¨ŸäÅ�¶@ :°i7ܬ¼š,5ðð‘]›÷E·]�Á°`mõ�liþÖ‘È&GQG D×í�8i{E·¶ß„Å^o\ï�r�ÁH ó{×.á»�Úå"=ÌAˆIöÈøMUû¼Þë½*@¥þ0møò®åmÀß˜Š–WÈ$&Ù‹Mîy‰[øW;wYà+ö®î¨�7[QÄÖÛ'tq.À›ÿVéP,M…øÀׯúS\¹ÕáÔA’ +߈XÚu¿¦”ýÎãÜ=*SÎk惖¾‹w9ݔ㺴BîX<Îáé›6I§ˆÛºgòço…g/s•UPAÉ +X(î›�Ì¿Òj�󲕈1f ,N«#í´ßʳÛåÊÅK2�è@Hûgœëáü-í°}òn.5òŽó© È éx#[sã•gÜÉ…Ðe}ÛØªíXÑYº¤ž —ºùs2«” +¶‹™~´ò#94ÃÆE&ß1n笈¬âÎ[+bÔª«I㸲ÿñ©#çmÅÃXZƆÇåð®ÞÅÚ¹œ Ü«€Oõ1Diðû´¬c=Ñi:I¿NØðÓÍŸ6(]I ©º€HŽŒr]Ϻ�%�%—‡MÝy^Þ~uܳRÉ»%•ÊÁ¼Ëû�©öù2øÎ@Ì­íˆÑ ð�¬/SÌÙð{}{¥àØLMþ"þ=Ó¥q»»e 9‚‚ /õƒ�6µ<­‘ßb¹P@Ð º÷žVüê˜3ÊøÈûB™Ÿê,?ø×AT3«¹ °2È&`Ïχ­M°œdûhDD(3÷pòø +ê×6 -Ûô� ;þÇg�ÿ•QaÚÐ@â" äŽèma­¥¿Çyª�˜c’Ÿ”í_)ƒñŠÉÇ› V0¬5†[ÅÁ+68kFLyò+) fñ7Ü-À_Ƴ‡l Ù/ÃM?ŸÊ·Øá|•2D€ƒ"Öä(îqäÈT*©]À´˜ÐΛLüª·É�!öÕ¶ê0Ë� +×±“, Š€)�AÜldX¯àÞª¸Ý�Ò¤�’IŸZËý²AâLQ9LHQq7áÆ¨fñéR#,‹/ ¹×� +åÇØäĸ•HÛ‰B¬Ü°uôZ¸Å™í)’dáiÏË•ú@"&õÅ“ÝÜ»`ÀiŸµf#ÆMg. ›Ãâ*¦ó ™'h¸M—ÏÆ$®ìjNV}:@·�dcË‘�}  ê ç+"#�­"æÜwmÛ&fôcÄØúDmP-—¥O. ÆÊPȹ`MøÒ´;vÆR D@¢âàyðãT ’A$xŽ^F±íe,¬JÈR4:’<|+e2÷qŸ--¥gfYX�6:ñ¨÷®|ÇWE(宥¤ËpàÕ‡&Mìʪ®KºÛöÞö™¶“]�®í‡q$L)6f©8Ï +ÖlnëÁO27y|ÿj~Æ_w~õˆô™ OÑÇ•ghë•ò3¸(€"6ayþêªâÈ#sú[sáãð«EsbíN<™p‡`ј s<€ÐZG·Î]�» +LÀQ"@<½)ÕÙ·3`_n�gŸoÚnU]Ñ´�¼tÒyé] +ˆ&|jY0;6äm§Än_„�­5ÀWs)Ú‘6 G3Ʊ“µ|¡Aa Ì�ékò5ГXlD�wãzŸí˜0mܸ_ëãOlqdg-%„p‘Ç„Õ袈£…*Hв@ÔÉñáX¾5bÀ&MÍÏ3U¢Š(¢h¢ŠDŠtRštQN²X-És5Œ�¾,ñ½U£IýkaB€€§J�QE*t¬M:)sj&ŠFž”�§EQE‘`54ë�n…§!`H™Ôx·ãëzêÊ츋-ÈsøÇÖ¹{]¬ûýÆ$ê7]ÃþL¾“ô·GtÃ’ät6†œê_ºlCÿ©ÊɼN„Ì'Ä[Êð*«Ÿy�¬Mö™ƒë¬9NQ%Jù×>-ã¹`Y�Ý®–͇©¬Ë/v³ÚEíÖ2Z¿Hñ®æ0 rbfí0(bîDýÐÎlZñÆ*©ÜÛYvÞ‘}H?#M²›í?Âk•rîžHÅŒ‰¸ä›Äþ‘]8³œ²†�—åV®lýß´ã€X‰»òï‡[&Ûöõ:ŸoÝ>]Ë•2þ�Û¾p9І?û=îÃ�bIHË@ˆ·>"µÜÿØ·h°çîð k/xá±î<†³x}º×h2ˆ¡›h'Zƒw £ylð’vÞâ’x +ÖD¢@0d¢€€(¥g+”�8øÖ1`Ð`ü¦Õ<½Ë¤íQy¹cÂ÷ª{¬àóšI™ƒ}H7‚¾#�>|�#Ü4nÛnQ$|?*G¸s“ÛP‰½„IÿÕÎk¡I+1³‘Ê)15 Yó3°dA 0ˆ0cœúG­C·ï²edÞ¤n¤ÿ¸ˆ>v«/u‘×#íP˜Ñ‹¬LˆkO�YÚ ¢þv1Y_Üe0@žËÇÆ–6Éí‚D3Dƒ}“ÀÁ3ÖtøUNPªL�lM͸› +Æ.ë<�øÉXÔ)S»XÚu?€ðçÊA›tàTÏPüxWdÖr15›�C·Ï“.ñÓ!¬`�·qŸëIß¹M§üv±Fé ?§Êó¤ñ­™\«cÚTó›ˆ(ñð¦ÝÏ´®Ï¢IàIàXÈXóúEûœÝ²3åÙ +®INœÎ€“ùÕçÇ ì�A´m ëc'„ÔófÏÛYñ›X*w± +‚ìF¦”ó©†rcse…€  ·.3]k™C2Hõ�•rû*Æ7€Ã­Üü:¦ø×f@z6�ÇõØu@ñ­�Îà¨H¹ãm©eì—k‘2C\ÜõO¬_Jk“.DÚ –$‹ ÖDð­>7(ªX“05þ¯ôçT€áSî— +ÀA˜¼„¸ðéãCbcŸÝ‹tˆãÓîÿ¾ªp®> •Ü@’d¹“bcË—Ï=ÂâMøÎLˆâ om»IY*5°) fbÃéy© ʽæG8Ûk&5Ý"%Bm3ú‡ +¶s‘™�¬€ÇÆzIþªé˛ݷqQÓiæA3¡ [ð/ˆmɸ 4©ŒY=Æ;bwA1É›øRí†lJ1Œ[B€, +í·­´¸½?óâÈ&äÛHÒdÞ߃6Y±ffÅ�(%L�+xuká¥íÚ�:Ò`bÚð©2; X‹ƒ­„•h;†Ûí˜�dGÖj‘XÌ$÷/ÔT{}Ù1"í l$A§:yqÕwAƪdøáZM鈼ʤ{S��²(6ØÌ¬î?ª ŠH#Æm?ªk � Í¿m®5·ÿÓ]@EO*³)�¾5”GE` b Ó¨î¸õ©âÇ�U�cREþP>CÊ£— ö¸P �HÿjªÇ‡->uÓˆ¶æßSSLYÆMä-Á� צ>”Ý’˜ÃH°rV-7Ú>•P®ÉÖÅÀ6øÅMW¹rwìQÃl“§3ãáRÇÛdb§* *A•$Ëiº A>¶‘]ÑQîÜ.È׉� ? +ŸmÛäÂìK¤r¼îføuEiÑû‹0Lô™þtÚþÚ,m‚l†dm˜‹úVjùqdL‘þI ´Ä+tÚfá|*¯ƒÝFGƒ3åˆùu�™˜¨`°'‰bxrR=¾l�½Â#eÏMïx´�ÄU_LŠí ¡X�D}ÜêɉTîÚ¡Ž¤ +ÿÙendstream +endobj +87 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 88 /Subtype /Image /Width 96 /Length 1417 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ X`ÿÄH!1AQaq‘"2ð�ÁB¡±R#ÑñrÿÚ?ú2àȉ õ2ÝÈ¥¶îï«®#øB‘p ^6�´¡xõ·e¹|¯Þ£Kƒôè/+�À´ßZ«�'"°Æ Py Þ=»ªÌÉ›"Ž!`°ä­ºpÞõ½6 +À + *�µFÛ[°mûS&>kàù¨> ��€ØñˆƒNq1bñrDì'üÖã€<ŠÌ›�hÛ?�UÀçME[EeQET1çæa—Œ›I¾Ýñ5§<ÁA yÔz¬yå {”A°ÿ&»…O&^ $ì·}/çžC‰‘F0#Y�ûHµàSeÒ`˜À‹ùÔ“©b@lL ’±Ò÷âL¯Êc‡«ð>V]ÖVã‘‘u:˜Йä°`wéi¿�+uG�. F�lcJŽRÍ›Ö ÌXz\}E&&Ê磫}â=#y GtXè|»pä9KzJñ1x½…V¡˜²º•IÜÓqÅ¢þtœOä9 +DXXòã?l�nƯ�¿ '‰:ÒåbŠ!KhûžáPÈ‹Ö@*à++\qö²¿î´˜ñâd!”–v �‘Ù†£P j#—`ØÉ ¹2¤ý´øÄÙC-åŒmrNº|m¥tÅmaQE`¦¬¢¹óu˜pr,ÞÕäÐ q^ÓAÏýÁC#O?�•7ý)$z¬cÚu‰ì¡ú¬h ’``[O +tÊ®³Ù:ˆÒÛÖ.ub›‚Aƒïøš�QÔ^@ŒA î‰ +~v¶ÿ­W§iK� DÒ·U�IÇS°ùš´Ô›¨UÜ�3týþTÏ™@µÌX5ÈïÎ`ñ(}JnÐFÐLy_õ º‡Çˈi'~-jTê…ÄØÁöÀ¾º +røÿèö‚{áíV9ñ�bñê€ ˜:ŽÚL' "¢�Å"B�Òjk•zl,™_“ð˜Ôx¨ñõÑ�¥ �¹µ¹® œ¸ó(B ›q÷j‚O|=‘5èâ#"âDÖ¤r(fB5Û[D_³JLdâÊÜØ…"DÙ@…>#õ®½è ã&Xlg"ð2 ª~ÙåÿÍv*P£Aó­Š(¢Š(¢�fBx†Ù7 åE0Xv&†Ì¨Dîk 7 C/ísóŸ¥2d\€`Gh3M\ëÕ¨Æ_'¦¬X™˜ÄÜöU"…äH&õ˜ócÈ V ÁšÄê1e$#«ÀA©tÝKäFg‹@:@>u½6\™¨¡�~&x™ÓãÊ¡ž0 elY�¹õ(¹ÞÔÙÿb*ŸP>°Fºvê>•N�1"J ’Ò"#ÈÜxÕJ«Á;0ECIê2¤Ø*ñgJë#�ƒQÇÅäB²ñìÑH®L¸1dĸq02™ºA¹®²,_¨F€—€âoo«ˆ¾‚ñ¦ Q�p$(ÉÈÈâŽKaµKÕÿ.~$†âxƳÀDW|¦!r˜žò`SIEŽ¢¸Ï@¿�ä8‘Û”«?¹ ƒÄÅë§Š±b7:ü~´“q�ãNcFâ9žµ¸ú\8˜ºcUc©|MT€Â "àÆ‹À"…ˆ€-‰ÓâÄ�(е1&5âªìb`Ä‚x7'÷&�Óâ"í·f•¿‡ñΛö×ÿÙendstream +endobj +88 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 80 /Subtype /Image /Width 272 /Length 1772 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ PÿÄ[ !1AQ"aq�‘Ñ2¡±’ÁRbr¢Ò#3SðáñBâs“4DT‚ÂC$ÿÚ?ýOj¡ULÐ#QTQ“JŒ©E +¨™¬•SEVvª©¡É\Ñ2U‘U¨ˆÈÈˆŠ¨ªˆQ¢2€*ˆÈªˆˆˆ +"#£¢DBˆˆˆª(ˆ�yEùHk‰ÐZ@BT,%·a ­«ÜH  ‚6‚2*Yæìs-\„Û2n¶VW¡l�Sˆfw 6¢Ã¼à†ô„LƒœÔõ3f:žäŸ3ÈnõìZâGH.æé иŒ�»ÄàzŠ ‘,AoB.ò c™f®¹]æá¼ e#-1ަy;Ÿ–¤Ó%«�ëP™‰‰1ÄãC±é ”y‹µŽ’"K3»bÛÞ¶]y{Æãê¡ÙÕŽet�ÈÄ€HƒÑèþ ³ð”„Dªj:GFÕMø 3á‰bìàÝ +f®*"QDÍU dÉ6/7/jvîó�¤î G«‡úÁY�h’N¦a\5Œ1éô«  *ÍBI'PÁµmŸ5lÊ2”L‰²šHY�3îl™yáÄ3…ÈnÀéÔ `× :³1+Ï̘˜8¨3Ë÷Ð^žVô¹ˆX‘$ql™È|ÇA¥\yŠìÇUÃñdÁÜî‘ Iy®röm�ºK Žb:¢û»^Û@“'5|м²û@ _e7¯)4¾ˆn¥ß�Xˆ˜àˆÀµ J^ZT—NcÎ?w?ö®¥ê©¦ ÅÏjÌÃ[‘œ‹’'ƒqŒ±Ív 66Ë ,T‹j*¼ãE«³ÓZNI'r�ÿU£´‚s'5ôm‡ˆ£tl[DFFDDDFDD\cËX�qƒ�]‰ Á¶,[åíYòB1¦@ Éˤ•›¼­‹ÄJvá#à˜‚GS­Ü±nôtÎ1�ØC�JhŽÀ©·PQ]w`ê VĉõUi€9)¦,Ì ' w$„IÄŽ•ÊVn¦Z†‚Ä‚ýú›è¬óü™çmˆ iƬô”e˜ÊKÔ"D—`ªª"¨ˆˆ¢"*¢/  #8<@Õ:·ë§»Ð56É™‚h ybKUo˜ç͈Nzu»—ò³¹–À:ô.“½1(�PLœ³¶/�B°pùã›>k>ñº$ªào¥Ü .ò ̵ő•ÒìïÐÿ–%àåê*Îý�UàŽ‡x�¹2@Ž“ R΀Èêöä»›Znq´ƒ=:C僶¦|W{—t ic ºäùCô•‹ÜÄ­é4b[,35”h;z–êMC«WÊp~ßкº5E TBT8²¨ˆŠ+š(B¦*¯ˆœõGp’h] `Y¶.Ö¬Ä=M1/^Õäæ,ñfæÜµAÄHùXÈÒí· +äkךµ×"$„�� BQÙ˜HñoDÄÇD›¼«3€ý̰m] EÁ©™ÏA¥´élñèuÚÙ�¸`a&`uÓIèÇSö.·-ê �Ü–v'pÛГÅÃKtÓ}åCŸAÁÖÇ$GA,Ã;yE_иkæÃó¸rcW/Äé]ôÝ‘Þ;¥°!Å@g�jÝ‚¡n�¸�¨š6õOjîÈʳ"…PgU£#:2"Œˆ²-Æ229ý? +Ò³8 N_—À´ŠQg@Õ«<“4DD@ˆª"Ѝ�TQƒÝù÷þfÂý´÷~{û˜ÿ ö–½ß›Ï˜–ÀøWAo˜ˆcv'¤ÃÂJˆ_o¼�³ùÕÑwã�gó©ÃºänÀ†Ý×ûÏ@NÐ_‹.¦�‚¼;†$q[õ2Ç÷ãKº?UvÑp�3uX6®~$¾�‚ç+7Ï–ñq‰ø?væŸùŸ¡=×›?Õb*žS›þê^Ä<÷.oû¹ûþªO™ Û˜aˆ�º×¦ µ»­“ªñ›�BcºØçèeÓEÏŒ;�Šº'ñ½~)ׯõø§ŒÏyñTÛ'ÜãáX•‰MrAâÃäã¼ë\Ýk„Ng¼ø¯/þ}Æoz¼]ªðq�ÈYÿ͸ßÍßï‡ÔT�ž|Õÿj?USþ:Gú‹ÞÐð]G) ßmr�#?ôÕk�6ûÙýªµÀ—âK¼x/ÿÙendstream +endobj +89 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 832 /Subtype /Image /Width 9 /Length 994 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ@ "ÿÄ_�Bq213A!A1ÿÚ ?éòtR"9 “¢‘ÈJ•rtR"9 +•¢“È)W'E"+�©Z)1‚•R´Rb9 +•¢“È)U+E&#�¹Z)‚•R´Rb¹ +•¢“È)U+E&+�©Z)1‚•R´Rb9 +•¢“È)U+E&+�©Z)1\‚•R´Rb¹ +•¢“È)U+E&+�©Z)1\‚•R´Rb¹ +•¢“È)U+E&+�©Z)1\‚•R´Rb9 +•¢“È)U+E&#�©Z)1‚•rtR"9 “¢‘È)W'E"#�¹:)‚•rtR"9 “¡‚•r~u"#�¹?:‘È)I#çPâ9‘ó¨q‚”’>u#�Nÿ:‡È)IßçPâ9ïóÈ(ŽAJnÿ<‚ˆä¿Ï ¢9){üò +#�^ÿ<‚ˆä¥ïóÈŽA»üò +#�R—¿Ï+È/ožV#�R›¶™XnA»i•�†ä¦í¦V#�nÚe`¢9){i•�ˆä¶™XnAJnÚe`¢9í¦V�R›¶™XŽA»i•�†ä¦í¦V�~ºe`"9)úé•€†ä®™XnAJ~ºe`!¹ë¦V�RŸ®™XnCGMkj™á¹+FzÖÕ3Ãr3Ö¶©ž�R´g­lg†ä4g­lg†ähÏZØÏ ÈhÏZØÏ È)Z3Ö¶©ž#�Ñžµ±ž�R´g­lg†ä4g­lgˆä­k[â9 z­€ˆä>^«`"9 z­Œñ‚�z­Œñ†Œ½VÆxŽA½2õ[È=}TÔñý Þàzú …?£{ŠP¹~Š/Ñp |¿D—è¸>_¢Çô\Ñkèõóäop5}TÎ=kc<7 ¨Ñžµ±ž#�~šVÀCr +SõÒ¶-<H>T­iãü'žÃÏ‘JÿÙendstream +endobj +90 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 8 /Subtype /Image /Width 152 /Length 494 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ˜"ÿÄo “áÒ1a’STd‘Ñ!Aq¡±ÁR‚4Q!ÿÚ ?ô+ät:…øSÆûø\™rLt˜è½ÂàÔȉ”/z‡À¨’ü  tc¢òÞ^¦S‰yNZ¦R€1ÑŽ‹ÏKS/ÞzZ™x€1ÑŽ‘;ÏKS/Þ:Z™x€1ÑŽ‹ÇKS/xUÕKR¿¢'ÕÀ tv’ðîN§u¹Ê½Ýü�Në3€1ÑÚm;›•?š>êf7½Ñˆ´ñ›µÈÝ àåP::wõ¶/‚ùÕ_Å~~@Ò‘ñ\Öª£ʉ©5®Ïn„ tÿÙendstream +endobj +91 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 8 /Subtype /Image /Width 24 /Length 304 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ"ÿÄX‘2R’3ÿÚ ?ÓjÀ‹æÞ¨ZÐ뱸@E¯á£ÿÙendstream +endobj +92 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 8 /Subtype /Image /Width 208 /Length 567 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀÐ"ÿÄu + Ñ!1Aq‘R’Ò¡±Á"2b¢S4DTa�á3C$ÿÚ ?úncºcWê¥[§òCäHÝ�Üà Tè1­›%¡!­Ã)‡x ±P÷}6IvQÛ1Â:PÄ)ŠÁiÎòn͉ç3/ž‹Äc–SȹîÖ¨øžÄ¨‰›­¬ù£©*¦ÉkõSjIB"B&åkõsê7²†Çi ~Üâø•»·~2"$#³l<Ù9ÏâÂÈ üØ_ÃÁÓ1Í!�Òˆ�‹™>—)W6—(‰U„å4ª[&ùÉʈ�ŒLÄÇ:L#,Vÿ8F7náŠÕQ8NSJ"åþ{�†ôñŒ.ÆH‹ýEŸæ¹þY6G¶Ï†Ôþ´»*Ÿn˜ù‡µ…‰ÿÙendstream +endobj +93 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 8 /Subtype /Image /Width 112 /Length 447 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀp"ÿÄq ’ÓT1Q‘ÑÒD!Aa�±á‚¢SdQ!ÿÚ ?ô‡¯ +š(^VN´£*O¼P¯_Îü`u;¨ÅtKL³i�^Š>VbïN•:bвÌB�ñ׎?¡ØKhTéÝW]™íIß AË+ÿ +À©Ñª—°õR�€«!1b~&«�˜>I蚬O1bz&«½e +ZäÞ$¤ŒÌýMtgÌàÿÙendstream +endobj +94 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 8 /Subtype /Image /Width 16 /Length 196 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ ÿÄ1!1Aa�ÿÚ?¢Æ;މ—’’ÅÃ]RÜSˆÝ,I;"ê�—> =ÿÙendstream +endobj +95 0 obj +<< /BitsPerComponent 1 /DecodeParms << /Columns 1920 /K -1 >> /Filter /CCITTFaxDecode /Height 2944 /ImageMask true /Subtype /Image /Width 1920 /Length 65735 >> +stream +ÿË2™\Dwt›éêjR‘���šŒªRßVv&Íc2aAB íF_?ý9“£93½ôq'•ˆ�“Ÿç@^â#w¹ÔI6•;À�oGG~ò,=qÞ´Èñí5ð˜'ßpâ'Ó¿÷{ié§KëÚÚꚬmm‹ãÖãûbµ¿ÿëÓ:C�Ù®²¤òC5²§sµç™ Ê�jUµ(#Z#¬¬øë”#ftˆöN22B6G@þg˜f™>l‚ e‡„@òã!ÅÅ0@É8 �òŒÁ"@¥‚Ìã Ò/…Èè h¤iHŽß'‚e“²ìž.Fm0@Õ4A'„k`‹všaªj…èÖž8 "à8†…„]¼"ì4]‘zvFÇаƒ·h·"qpÕ0‚a„kh» #d#eP28ÒdRt”"îv†ôƒhi˜Áª¢¡¤Þ“¥a`�Oá (DvØ “aA6“Èî4˜zM¤ÐT›V¸DpE¶“i‚ ½PÕ´›Iµup¡IÛ¤é6•éXP“ +‚‹kë¤é6¯Ò#©7®ˆÇëi=6–•é6µ¥ãÒiÒÒÿ¤F=+ ¯ŠŠTêÖ’®¶­ëÈã[þ“ê+Ó¥ÚÓ[¿§M~•nú¦Ÿ§ýZ[ÖšVé¥M;ö÷KUJõMªßwzû…¿úN/^†ã¡¨ûýýûäp�}ýýƒâœjÔd ø8;}~¿�#„Åÿ|W�‚K°—¿ÈTy?úO¤ÿ¨°ñþëWÑ!âÆÿö®º$åÏzCÿú{ áþ‰Wäõÿÿÿíÿ×Ñ%d“ýq†Ã¯}úßÿÿÁ~Ø_ÿÿÿÿÿöëÛÿš29¶¿ÿ†ÛÿJ+ÿÿÿô¶£ÿÿÿÿÿþéxú zÿýÃþÝ?ÿÿÿá'Ä¿¿ÿÿ»ÿ¿½´¼þvÒoïÜ„ ÛJ¿mëoÿõó¡¥ÿÿûÿïïèÛÿÒâ þ›·ý íµïÿÿÒ÷_ÛÿÿöïÿKÒJ¼é¿ÿT^¿uÜ鹄ÿí*ý·­¿ÿõÎyƒÿÿþÛ3^ÛíÖÝ(íïÿU[öé»3_zúŠz·Òï×ý4û¯AûpÓôÕƒmU;9¶qj»¤›iHcì3�¥O^áÈ?³ëWI†Ã[««[�o°ÂL3sum›“O´Õ6 ¹'ÕÃtÓb•4îö*Ó SM;A·I½6ƒd/´ª�§ ; �ú;n™â­+I;NI±AˆA´“ BMSMSá8M´·im‘¸Všdt6šNÚ vžÄ% Bµ 1TÕm¦› $Ól ƒ0˜h ×pï-ì˜Àƒ E¼0޼ù•ÒtQ”"Œ9/¶!ÃT‘6€\•ó±¹^ ]Ëp¸D#\hÏÙj²s¤NjN}+÷é%ëué$Ú][„"Ã+h0�b1ƒ"¦ 0†?ü´‚Ã$ Jã`MÙ €XYÂ@>@´×5ä @Ã`O�ÿÿÿÿÿÿÿÿÿÿÿò ¶fNe~2’2*h¡Ü›‰er\íg;+‹²Ve\@ØPEqæJYÈâBO; +Â"® +¦r„‘’­Û—é<)ÙT�µ¶v’ÿ¤W>÷Qa(»¨ûªö¿t›zwJ·ûê?»øû_ºD"òeþ±Êùþ>J¿Âþ¼®R’;$ÿ^¿UÿÓ _Ó×ÿKΞ¦´GÎŒ«D{&#H”FŒë�¿DMH�6D1JHéÌá5›%!">¶R‘)Ó&%ó±Ë$eó¡‘&S™Ô”«#ùB5!vJGˆ†‹°ˆˆ*Í9áž:Ï™:ÉÈ�dq +|3¶›1A†ˆJ�„ ¡Œä ‘È£0f v¸MœÏ³6  Éóù¯LŸ?“ç­Ÿ%QO‘â&Áó´¸�‘â!ŠP�’!<ŠLŠraœÀÎ †Øh„°É@ÈB>Ìôl„˜aÌ�« Ò „n„x “™:¦˜FÀÎÁÂ`“xI¾©z £sˆa©¬˜ô…¸N“DpÂ=ÕµÁ°“h[UÉŒ- ûIµutEŠ+)ZöxÖÂMÒM²ÂÑÈü0�a”g0� +•ƒ?œ‰ã†y™™¤gÏG#94Ñ­… èøÂ6=ØTÑÝ„ ¼ü“j~¡¤ÚA†Ñ´®î“…I†ˆì‹t¶Z{´á´˜rýô₵t›eŒÃmnÛzmtõµú¶¢—ÃmmGt¯ßo«¢+´› 6–ÂM¤ûªM¢;"Ã&"Ó:t˜rÔ'Aœ¤Ãež“ ë´©:M¥iZk¤ïÖ©<&{ºÿ úýé·õñIßôºwVé¯þ�}-ë^éýSÒ¾®�Ò´­&äÞ•¥¾²qJáA?Âv”Rmצ›Ýôž¯ÿ_o÷I×õw[v´¿OzAézW¿Z‘ÂýîÓ¯úÛ‹uÿ¡ßïë~ªµ¯ñvÒ×ü}'ÿ§ué¾×Òö´¯~÷t´¸Òëwúý~›÷¯HŽÔ'‹êß¶¿ÃV×ý'úýùn +ÿ¨ÃühzoÛN¥Âj—J«û´ªþ†×Ý7Öþ¿®×ïè±ûc^¸ÿ[¯øþ}mÔ¯y…õíÿŒ:ÿèÛúÿèaÿÓÒÿ÷ú¤—¾?ÿ�òÇ#?ïñÿ¦þ›öë_ÿ¯õÿý|}!}ýºÒaÿúþ¾Úÿû ÛÿÿÃÛÇô«ÿKü`Õõÿÿÿ^´©×ýýÿ_ÛÛ‹ÿý/oÿÿÿëÿÃûÿþÃô«ÿÿÿëöÿÿÿ_Û¯ÿÿ×ÿÿßý^ÿÿü7ÿÿÿ¶¿þ4Oþÿÿaÿÿ¯ÿÿþÃüÇÿÿÿ¯ÿ¿ùQÿÿò„ÿÿ3¿ÿm|7ÿÿÿãÿØl%ÿ†ÿÿá¿ïÿÿÿÿÁÿ ?ÿÿýw÷’ÿþ‚ÿÿü%þÚ ßïþ»ýþõßÿº_öÿuÃýÿÿÿÿ·ú ÿýÿm/ïU¿½/ÿ×ð—ýû×L=߯÷þ×oÿ·_ýë{õá¿ÿí¿þÿÿë¥ÿu÷_ïë_ëû~õþ½ï]ûúýî¿÷ÿ_ÿå"}l“_Û{uß§»÷ÿ÷þÿ{õÿuý}ûíº¯ï×ïïý}¿öþׯlé÷_íþþ×þÚ¥ÿ·×·Û¯}o»ïûÿü�}zÿ·_[{nªŸ¾½î»¯ÿvf¾·÷JÒkÌþ�ìúý´¼ü»kmž®­¿îÒµlúaŸ[uΚ]6Ýûoÿ·û}:ÿû׺ÿ½Ùšº¿Û»¡Û}ßizÜ=µ·Tîöáu¶^a„“I¸_i°`’zm¤Ÿvœ‹�X§JÛTöD¤î“¶BÐ… 6 ýZVÛm«ßíž¿0­&Ò[aßí¥eí¸Iî› Ƕ`Ý&ÛÓŽöä 푦A*woÅ'UÃM6ÒL-D ÅöÂAš¨b•;muA4ØKa… ~ð˜6Øøa!JÇ¿I³‰†olǦÁ˜Pø0MS ˆ9^Õ6)5c½´8„Úi¦ØJ!&ØI4é6 B KtÓ Ž‹°Xh4›i Ó ´í<=",Š«a’AV °Â É+‘ù¢²" ".ƒ�~Mæ¶• ™‚"é† 7¸5i¶�Û ;¦Â Š ^Žï BjU°Ä#V� †„ Ä’’ \žB4ŽÉ2¹§V‰D0h"x0@ÞDb ¢¨£í‹05 ª£FB"ÓÙÖ«ú—ú�%ð‘�3úÕuþ�¦˜Äü¦Ë#¼¥®aàŸÁ¢åY¨{6ÉM (A�øf’ ŒÏù”Ó +lgìý þ^B7aÃd¼±‡é>ÙíôÓM;M&HFä˪WOM6ê넘rjÖµ>r£"z‘bTè&\#æÓIi:ØLñ¦x„ϺNÐzKW +“o¨¤ôÛJé]¼Ö³„}œWiž�´Â)Ãd¸œÅhã†iíáÚ‡}ŸßBд›§I´E‡Š ÒyhM«l±ƒA6—²ÏSÄy¤Ú$ôž’m_Úê Õ¢N—Õi.–«IöúLBétûû¥_î¾:Mﮯ¥ýuz¥x$›LáˆwÚ±ªöD°0ûû0Â\Ñ'I6®•Á;Iin–—¢N—ßiµºkÝ|ZNÓkÐkÒwIÿ•4ºvþ†·éݯt¿J·û­oõWz‹´¢ÒôÛ{¾Ú¤ôôí¾£Ótëâ¿ÿÿ´*š_îú«Š_§}Öîªâö¿ï¾‡ßzVµîÿ¿�·�Z·ðׯ_í÷ªo[é{¤û»_Þí¸ÅÚ[O®—×_ý~þÿתVî?|Ýoÿ¥,r9ýñ‡Cÿÿÿ�½µo­/Þ•ñïí­z�ûýûè±Õëýcã�N��ÿé?C×zƒ_ÿÒ¡ªöÎ&ÿÿê»kÿì?ÿÿ8Cì¿j¬0JáéV“Øzª~›vÜ2:ÛmmÐL·±¶‚deÁ»!}§ZÛí³?óûÖ½ÿ­§uémŸú³ëöû¿}ìÂVÏ«‡åïUaðØpÈé†qZÝ ¡ÃÒ RúLŠ=6Ób“�Šb¡¤÷†Eùtîí4îÝÛk{PÝ}ˆd¡:TÝÞê´kü:tõlÍiéíö“eûK†¶¬4“V1¶‘p6á°Ø8lˆ8CaÖ!&�¦ÈJÃwm�ž "‡]…iì$$M†‚h5v­rdž2V‰44 ¡ Ú•rÆ™¦O"�ɲ né=ì�Ä$ÓOëNÃ!9ééÁúPð’ 1 †�dOwlŽ>ÕuM(m¦­®wÜðÃHùjš &.¡É„4G ÁèìO(fIÑ�²|46T_¸�Ï J©£ÜD4"!ª.dtŠÆ & ÙEâ4")8¯Ã�ˆÊål´,?Õ®/úÑ•~•/ûKºãý¤´¹ØªõlB†Æ; :…TÓ Ñú<›(Äb?ü€€ékÅuHìA“ÆNÂË@Œ)•²¡;© +—+‰År˜…ANÅ2[–äÙ zxK÷�û +ªI_iöþê.ß*5ÿÿ­úÿáÃÿôÂkÉÐä %þýñʪ"H® �ƒýuÿ®d…ùÝúªªúéþd,ˆë9�¡ý]SMW9˜Zd Èd§IMrfžNŠŒ�2tmš#Ë03HÑóy DY�ìYº2Fr>3ƒ>ÏH=ëúç"$“5êF²TGÖÉ+ˆ<Ĉ›,*ÍB¦D¡G(r¬ç=˜h„È@ÉÌ«ÌüÖ“8gϲèÏ3‚aÃ&,ϹÏmSÑÿ!=5 ^}ÜI’ý…µÈ=óí&ÚkTUºä¢$šyÆS²]¬Š²‘�"tljPˆ;#pÌÍHöeZ¹ÏaÈ“:€ÉxÏMO¶63ùèÍ:W„�944Øi<™á!+NÔü®ïЪg�&H"ÕäÏm—>oul+„®Ûß •¤êým« ö¬[¶CG¬£9’4 £7DG Ï9 x Ê0Û.dü®f™èÍ©6{´Ó*,$?_[Gž9önL÷“E&Ô&y¢²Òt›WW—°K…t’m]í´›V’Õ÷Ú º´“¥´—ÿ¨¥ïôï«÷ø¦>“ïUÂ;Õð”4  +Æ­¤ì´à 0ý][OI×DvÒÂV“îô¯m­4–êuØmî´¶¢–øõ¯�ZûKx¿ï·Zõþïª}n)§þ–¤K¿u¶ÿ}{é6‚nš_ ÷w±JéÒuxN“÷ÿÿ^?×Öõ¥Óªõÿò,;÷ÕÆ;ÿÚ×­/¯ôû¯B¿ÿñîþ¾Ò~¶£í«¯Zoºß¯â½tþª—»uûß_¨¾ïZðûKá¾èUþ’è±È³ïþ¸øÿÂ1ùbý!ûmëú{ÒÃõ×}r,~ÔŽèk}¯oWþñ÷¯ñýGC?ùu‡þ>0ÿÿÿþÃÿÿõaÃõû¯÷~Þþ=þ‹('¹t£ýiÿüúÿ¯Ð°þé0ÿK¦ÿí×®¿í¯ÿ·Z°Ã÷(zýx=ý‡þ#ì,g___Òÿo_ÿöëmpßûÿÛÿÿ_¡ÿþ`—ÿ¶–á°ßû¤õøØ~ÿ~Ãþ½¿¯ÿö×ÿ ?ÿÿ×aøoü7ÿØ7ÿûp»¾tOþ#ßÿÝ,‚îÿûÿ#·ÿô¬?¿ØÿøEôwi·¿ÿå mƒ’ûá¿ì?÷áÿÿl ½/ á´¿ÿÇ]°þôØëôyÁ¿ý´Š¹Áÿ¿ÿ%Óÿà� í×ÿƒä�ÿü$ìVKß¿ þþßÿð‡××þÝ~ÿêÒÝþÖý†ÿöH-¿ÿöÿð¿«uþÞ—ÿú\Ú7KÃþïýöÿÿ­ézÿî—ÿá_S›ÿÓÿIß×âKÿï~¿·Ú^ÅCÿ}¿õÒÝþÿÿ5'ÿý_×ÿÛ:¯]¿¿µú"?Û÷ÿo¿èÀ}þ¯Ýû×ýÿ§ÿýÿÕU³ªõÎËöÎ�~ÞÚ¥kßöa^½ëýéw·úrìë]¶—^é5þ³Éû¯ZÎ/ÿÎ.ö×ûíWüŒëÖûÿû~¾úû¾�_·¶ºïÿd#ì"�û Wlúº‘Gl妨Ea°Î+Û^ÒÓm-¤Ó«þëþ·þÝ÷·ÿí«zû_úÝß°ÿ[¶Aø3ÊÒ¶im—öÏ+Õ‘r› ÚØõdAé°Èé4ÖØÛÙöšlˆ8CiA4ƒb“V vÙ KnÁ ¬C„�¶•:ÝnëºöAÆ?«í¶×I³ÊØw m½»E8í—ôî¡‘Õ†Ù0Èq�4í» v•ÛÝ' „ö“tšlˆ 6 ˆL'OÓ» ”/„ÓIÏ ¶.äð`‘Yƒ �`±lFÎÌÃ~í-ÒÓ¸6¥jÈP€Þé�6BV7MXÙ ì_j“Š´ÛA8ý&´îÝí„ê‘f{l$ka„Ã' "•pa4 �äì·JÜCˆÓ] ƒ  “Vá5h&‚v}±jËMv;A…NOˆˆaˆ4dM2ÝFW)õ~F#RQ3Û”yg=+¯ÄDD$þ’×IWZúÒKúBÚM¤5¦ÒÅ´­¥b&ƒ]0xaˆŒü€€j[@hÔÎÂòßòŸÈÇ-®—™!“8™0U"0¦¼ÈÖ;� Ù.¤²–Cd¾B¯IéýVøZ’©B™¿wßÿIýÒ�ë{2,þþû»]Vþÿ¿O¿ãˆˆÐÿúr¸E¹S_äJÿù\•>Tõõÿÿ7üíQ¨×õ_OÌŠ²B#þrS Èƒ!–Eó5³Z:ä5ä¶&ÂÍoj]5_ÍJÓÎ3Yæ}K›#¢#‘”¡ΈÜkÉ�œ"ŒØÊ3fŽ"}†!a“Ç2�l e!<ÖF˜F€ó\g Ðdûf”�ÑÌÖœÏSæ~=ŸÜצžQ7 ó9œ&ºy³*†Cˆ¸¹�â CAŒ|¹”saø†-Y¡PÍñhgœ‰Øa#Ð%‚L0JÌøj¡vši¨% 'I´¬%èðÖM6˜F†“êˆà3Ì%¤è(iáj�W¸TÃÒóç¥|ƒf³*DˆA²~EN_2—·¥|Ö›3‚dj?'Ÿ�fmB5²y¿?IÍ+hg+‚ØM&ìñ„›TE†•¥ç�[e¡0ú +“oTÔ¹´®ƒ}5·é~“«t×¶¯Þ8¯¾ß÷Oþõ¥«ª®’ÿ·þÿõÓ®ÒöÎ_"[M†aéS#Æ›!èCͤškam�¼Òm ÈJ�‚H80ÃI4à©5NÓiö›Èâ0¤TîôMʸl�ªÝ÷mÝ„Pí‡kMŸW"^ažWì0•Þ‚b“O»nÒM� @Ãii±MSV› ‹°“Ò{2V˜L&Á+î!ØL‘Ú0ƒB!ˆ#TAˆH®(ñ좬¢¶v-Ó†öÚj©ì!bÛ!fvB˜p¶!0a+Ob¦‚ $í6ÝåEl&ƒ…Ø`„XE‘CB2²vJ„Fcdç"7tÓNÓi… Üi1 )PØMP6èè† § #ª%L³‹JòlWˆˆ‡;*ÿ«êå‘:ô©$¿ÚT‡ »is±ŠÒ (aŒEÐ\1°Ë±¢¸J0B1ÿòÄDUòØ×+þwÍGa0²Ïy”DØM3y ˆ†KïV;È µYn2VdZ•ÅE$ îPÿ2ÿV·•Á»Xõ%š*ûµÍˆ_¤l÷ü_šó,²´žö¾kIßÐ'ªúKéÞ®£ê=ý¥cåmc”ŸúÔRÿw#Y-òU¥�‹úúýÿ;*^)\ìþUõÿOUÎÑ‘ò+ ‹+�zÿÞ¨~ž¿ä£)ò=‘RÈfH!2`Š¢)ò•ȃL˜‰ˆ!`ÌѶi døA�ÑäûOU_L–뛎ÃD?o'&C:lf©Š'SÌ)ÖK£L a>gÌ#dÒ9l~ƒ'�dBLϳÆ~=�{ |#C'á”û«a]0� 4ÂLóU;¯•œŸ"dÁA•cÍ™ÐdMHÕÁ�Ù:9 d6ÂFäDêHÏd»>PÔò4‹–Þ�ŽBy¹®3¯ÉàÝ¢ <Ò‡…L&î“í¥Éœ3�+W +’a¤Ãe«,íµotžµDxÖÒygÌÖ ”dM4Bb62FˆO=˜ƒÁ?<Ù€r 2à4=‡„EØdŒ£ƒ3�dgþ=¶å«é=áW¹ýÒ´>ô –„Û- ûIÙ`TŸÞ“i*g�{ºN“xµM¤ÚŠúZ»õ®˜¥¯¶Âu¾æ¸Î0ƒ'M„k#óñ¼ý à Ÿ¦‘ÿI†ž�“É« †ËV›Ï´jm+]^…u}'­™ ´­ÝE+D�o«¿¾ß¾½7¯]>Öÿ¯õën)j•þúøÖþú¥ÕÃEetšI½Â¢-¶YÁœ5¶]kر ´¶’oIí´˜j“¥tøé>.º�N¿ëtÛÒ½Sý/ëßÕwÒÒÐïÝVô—ÛÿImGÝõESÕÛjëK¨Ôð�+ö÷ªÿVÝ^¿úõÿý.ý×û†®;~Þ‡Ó×í}êGÂÓ,pWþ0ßÅüX:ÿèWízZN©û¿¿éxîé}}êÞ¢«]õÞ=ÿ…û@ˆü£öõùnHÇñ÷èEÿÿÐÁÿL=$«ÿJ¯ÿ÷ÚzûûýWÛiü}[×ëzÄxxðþô?ÿ¯Çõõþ’þ¿­X«zûÿá¿ÿÿþ?¤0úÿÇ_ÿëëÕõIaë«õö{~ý~¾¿éÿøoü0úÿÿoÿÿëü?ÿKßý×ûýXz†ý‡ÿì?ÛÿÿEÿKÿûðßø}/ÿìÈ…ÿÿÿô¶¿ÿÿÿÿÿû†÷opßÿ†ÿûüÑ?‚/ý×÷ÿØì7¥v¿ø{ ÿÿÿVë ßÿÿþÿÿÿø7’†òMa¿ÿ¿cµÿÂ_„¿ñÿÿÝÿw÷ÿ÷ô¿û¿þ´°oÿÿÿÉ×ÿÿ_dI;ápúáÿ¿ÿÿ×õÿÈ’ÿþûíô­ëþÝ¿ÿwïù§¶‚ßÿï×ü%÷÷ïþ},>–ÿ¿½û½wÿþ½v‘Gýþþj_ùH½.×ý²Oýîÿú^6ÝZÿÿþ¿ÖÿkÛêþ¾»ÿý½®ßê¾¾»kþßk{kß·uæi·¯û黿öÛÿë ·ÿ÷Û¯ýw^ÿ­»\çëœÿSË¿nóžß»ÕæŠÿ_û­³= +ý»í½³ý×íéi+gÓi&ÙM»I‡méªlŠA?¿ª¤ÙÓkÿï×ý~ëoÛ_oÿ×ﻯìþßÓgåöÒÌl0¹�Ypì¼°l=v *zl‹ccb´™)² å'zz²I8¤öB§t2:Ý5M6 0«ÿðÌ~¿þÞÝk÷vê­Ÿýëa¶z¸wWuÈ£½&EÊm‚PîÒb®Ý´¢˜¦*l.! Ýà‹Á+ BÓM6*Ù+²8°˜h&«mŽªA†F¤ÑF Âí"#1ªý܆8;«÷0µlúÝ+ôí»n°k¦Ú 6A&*ÞÒ¹+ØI‡ í +Ô1 ½º`“Ü0ÂL Â…)éÂi©ï ¡ PGˆa «“ò±’#¢`Ë%†þšvÛl‡êªÜwlŠ8B›i&š{»m¨L1 +Ó ª`Âa4ÐdeÛNÄ-„¢:‚=Ä0ƒB ¡ˆ°‹H 7M;W{ (cv­vEcb=±hAÃ%¾(H­„" ÁÀÐnwVPÈ Òzý-×JÚPÁ‘Üÿòš(Žú2Ç-!l·FF"¸P«'Ê4aÚ’wÓÊé#°¸› ÑWS²Çh&¿wæF­B™¨ìekþ¢ÿïUûõºéÿîý~â+�ýÝÚ¿üì­|í ;YØ"HÌ�3¯”dtGÈÒ#äcR*ˆcÉ”ì¨FÈñÄ:5"Ÿ!zëª~vgšDB:Ôi˜D +$ +N)¨�dtД‹æÈ�Æ3Y’#Ù„}•FÁŸl[°fš ‘ä A„lØ<šiÚ64iŸÏÿµ×MNËÄUHêD®*Ù ›2_?db4E:6Ñ9È�‚fz�”H0�a—Â.Ù1¡�›„l œ™¤˜FÀÂ7I9Bi2\[Îw÷ 6‚}Úº#¶¸$é7¤ØA‘ÍpÏ´ -+Ûêžr%fѧ(2­”×"!†Ïx ¡`‘¼†�4 *34äFÚ„#a±p�0‘ý5ƒƒÂ¦Ý¢¡ ›I�ÃVZDÚNtE†ˆ¶Òm-Pg &—]§ô�/JÒÐ+KKI½&áR^­¥­¨É8�в*È¡óHæS´D¨„è@Ê3Ù¦˜Mpƒ(ÍPL$܉çÇŸ�&NÔ&�«i2]A¢¡„$2­¥¦xÒl4ì%°Ÿ'8}%ÃWZK +ëI>ðOiZN´Úû¤ý(¥_÷û¤êë~Û‹Nëî½È͆°¶Á+Ò³I¹2äÏ>jÚ#†fÙhŸ4ŒäÏMIŸrg¥¤‰`nºÒ¨¾ÐU¥umowJè;Oÿ¶—Oßãé{ïéo½xû}â—¡Õ»ý >¿ý6¼wIÒtϽ¤›Òm-¦­Ò´ ¾Ý}ÔZKzIúi´žŸ¦×|RÃM¤Ûz_�þí~ºö�ÖÖú‘Âþ×í5ãiÐþº­õïëÖ‹­×_µ×I¯Ûî½éÕ=¿ÿÇwý}ô¾ëßöõ#êÿï^?ïÚ�ôüŽ}ÿñÛ†¾‹-_]·ÿºûHR÷µO†š�Öªí?÷µß]:½xþõûØþ“mëˆÿÿÿ¢Å¼¿é þ»__ÿ}ÿýºÖ×jÔŽ’¯õ(_þ‚‡�õþ¿ÿðk·ýÒ_ÿúõû¾ÿÿîµÉ°õÿýÿÿü0ô?áà„Wþ‡ÿÿaÿ¯õû~ÃÿíWÿîý[_Ãÿÿî»¶aa¼Ÿä¡‘ïÿÿÿÿÁúûÿÿÿÿØÿú¶¿õ†ÿ÷”î¿ÿýÞ¿ ä½ÿÿûp³ª|D/Â÷ÿ¿ÿûuý‡ÿÿÿÿíÿý{½~ÚXmÿôµÿÿóMØh/ÃÚ ÿûÿ±Â[·¥ú_Þúí×þ·Û÷ðßÿÿÿÿƒyÑÿš'a ¿m,9ÿíý_ÿ_¥Á߆ô¾¾ÿøZðÞÒûJ¿íÿ_öé÷~DƒÿÿÿÿûxKÿý|¡ÛKêüXcÿÿëÊ«ý¯þÿúúîúïÿu½ýöu_Köÿÿÿÿü>½÷þ¼ãºúôöÿÿõP¯äšwUÿ¶ÿ×]É¿ï_omÒïÿm&Õ»£žÒýÿ¿ûÿûÿ_ß¿U îyï¯N»ÿÿÿÝúÕÿûwÿ ”ë·Méí™÷~öÙ¢o·IW·Ví³ž•Ý{íÿßÿÿ5ïÿßÿßþs¥õnž›û^ÿÖAý™ÿÓfk¡ßv­ž›¿Ø;‘ ­&ÊFíX4¤Wzll‚M ”6•¦ªÚ ‘G±ÚW½|§[{wßÿ·ý_ûÿ óv²mtî­-ÛÓ»_Oˆl6I4ÛØ0°öÓU¶)�4Óm8_ ÅBtÙ¬šlŽaÒ»A'ÞÄ&ƒ0š#¡{ý7¶ß~Ù¢üý}¶}^Ú_öÝëÜ6ÿm>¡†ô¥[!}Û„ÓÓdólBTì „1N.�Úl&G oF‚¶Âkdu‚h—DˆFUPa°giHDD^û¾Ò³ßl;.¡‘Òì0Ašwš²þ“#ÆÃd}dQÎ2¶�½ªi¶� �ð�mа­6JÐNUÑâPŠ5= Ÿc˜ÁF&Q”ˆÑ7Kì‡ÆÚ§iB{ „9 0Û´ÙnÕÚ[jÓ†¡ÓNÓ +ÃhðåCE\¡4 ÈDeR""4M¯qV¾[§´GBGT@Âh‰>PqGÝs"Ì:O«ú¥-ËЏWÖ–ªº_ýt£^­„‚[]-´˜4–ØØì‡n¨EV 0ì!p`ÓˆÿùM�òÖZF@ó 8Êâ" -^È8&–A=Bç}/üìfM‹²¯5ÊW®ÿÿSDWá›5ü?ÿý?I§ÿÚßÎÍÿ }¬�y—ÿëÿëóµTw®Wÿ_]NÌ/²“'ÈÅ��ÇA’ÌŠr7�ë㎚®žwþVQSÈúç³°ŒÎRŒ—‰f +aÿ”ù²!Æ$D¨ð e +>ÉÑì§G¢|ög #ãØþ«þ§aØÔ™¯;¹²##Dlˆ‚!É!0Ñ Ð@Êα!Ê| ÂQžˆ~9™ît#Ä  33`óKTqÚ ‡¡a·Ð[W ZŸ4�&úêEÑó‘SaIts"Òd!çˆÁ$fš=“£™>{3‚�ØF‡¢¶Q·'äæl#ÈLÖa´lŸ”&“%§3j6pA ¢8a*ØIÐM«»T“ ßKLCj–0–ëô“v5vê)\¨Éü«È4pÈ̉d $ÍL&@òp‘ 3Ùƒ°„ ‘œÊx Ê3Ùáœ<�³LþO°àÏÄû 0šl5L-„´­O›,çúMì™Ùö“nêÔ3Íúh(Lñ¤ì´um][A6ÚM¥­âûI6ÿý¥oNÚ^=ªõÚ§5è@Ê3Ù!f™Ÿ 4Ê0™èäÉóÚi f{ytg“ì5 á&&ÿG¶m3Æ“ Úq]m]–zL5>Ÿ0›¤ÚºV›öé{^­ïU^ê=:Óî¾+´úߪ~Ú«þ—º¾íu箫¿4T36¶ ií„Á†ž“{a+Lñ²Î¶„*L4϶Zjü[J÷]áx¥iz«öïMwŠïº�ý6•ú½;öîûÿ§i/½6¯Û}Uþ»]_[�ŠŒ<_†‹�B‹Òm,$½6®•¨¥{¾þ¯·«i_ßßj›¯úCºVïM¸ªëÓ÷_þÿßýï×úI^‚zþ´Xñ‡Úÿõúÿû˜TÃKØxý×]Ò}ñÿëÒßJßÒÕÿuVŸí.ÔwÛ­÷I(y±ÿÖÿÿá¿ÿÞ0ñý]|a·êýÿûÿö»ø}Úõ¯­Ûu[Uwëßoýº¿ü}ELJ�ëþߌUõÛÿ°Òý†¿ÿúÿ°ÿ×ý‡ÿÿ†ðëÿÿÿûËá¿Ãü_Ò‡þ¿¿þ¯ÿþÞÃÿÞ¿é¿öÿþÝzá¿ÛKü7ÿÿ†Û0ºþ¿ÿïÍÕá¿Ãþ¿ßØiÿÿ¿ÿÿûzÿÿöá³²Äÿÿî—øÛ…ýƒß÷ý‡öÿþÿÿõ÷Ã߇¿õúÿ†ÿÿÿÿÿÿÛÁ¿ÿÿððá/þÿb½ðßìŒ÷ÿ×÷lquÿý×ýWnÝýÿ÷ûÿ†ÿßÿÿÿÿôðýý¯ÿ½þÿùÇ>ŸßôdŸßýöûxl;ÿ¿î¿×Û~üòÛÿßš'ÿ’?ÿÿúþÿEG{ÿë·Ý/ýëÂCþÿ¥ý÷ý×¹©o½~ÿ¿ÿýÙQíý×ÿýí·ý/õÿW_ÿí[Ýÿzý¿ÿÿµõÿ9ÿ¯í�=¿Ý&Ö×§µ»ïûJým³÷VzýXg—ßý}}ïõýëöêÿöýÒ¼§]·ö¿ÖÙÓÛüÓïïÞ›VA'í[KöAë~ßM¯¶•íÝ=: ¾Û×t¤M)ðØiÛšAŠM;¦?÷~«ÖÙÓõ_µÿW¯ÿí&õÛ¿z¾×o«ûë_öÒîw}*«yû ßi0Íúi·A��¿J°ÝC]‘ 0ÃI„ši»­°ƒbIÝ„amÿõßI¿¿÷¯Û«K3ÿo¶þî›>˜mí¥®‚M†qZ¶q&œ‹m(a‡°v­¤ÈâÝ„Ùö’iݱ ÓdI´™·i†6J!¨0‚q`ÐM´Š†h—� Éꈌ£‰f""!ú¶ßþ•úoûAݶ–­—Ý'K¿M†oMY û`ô™ BÁ¦ÚI§¤›!=ÐdO¦Âa„šÂ à ӻavL�ˇ<2~USÛEV�•!Y`„D„›†úížL=8l;A+!+©2Úpm‡ƒVÒM8¦Ò 4¡á{"W°ÐNÚlX@ÂjÄQâQá!„`„D¢¸PÄDFDE åœ0Ý;M‘›úI‡bÂNÚÝ«UEFxl e •šG¶XÈH®±ˆŠN!^(«e4" 2ÐU/¥2¶>—_ººþ‚Òû#„cÓ P7Ó¨áÇÿ–Ú¼íhÌ‹Ç-eqßGc"§¢‡™ØDŠ[©ÕB’õž?–�YØS5çc2iÿ¿¤3ù~ž¤,�VD5»O÷÷T¶÷…*y’Õûþîû×ÿcÓíëö¿ò'äÏÇÿ[Xˆÿþ«Ñ“å:#÷hG"_ÿ§¦E¼Š³S:#Œ×ã]æÆH2; „pd†G�ÈøS|§Y�ÖI~òlFE¼Ùä6FyÊs: Nžl‘(±Íó‘™Á“ Š „x˜A„lÒ úhrb>Âi„ +ÂŒ�ÓuÕKs%©*ˆÅ‘FfÍqNˆÑ�ó‰£c; G"F2°xAæ˜a’Ÿ3_ Ò £fG„¦_S'”Ï?„ ôÉöÍ;‚I†è‹¤ØTx &Ðø3�+ +§†pÒziuôÎÔ‘'�ÆD.ŠtHFÙäp‰‚E.*"P®9°dú”ùžƒ2tÃ4¤¦yšJGQ¾˜VÓL$ò7z¸VøJèŽÚNÓµhöÕ–…tÝŸiZ·JÜ´€›WÅÒ¹7ð›Jý§õuºyÆRŒñ’3fDD4m„Íq>l ÈœCŽ36P�i‘ ƒÖF™ C4ÙèÕ4Éãòadz‘ŽÉé4aª*¾¨6|×IµLñ¤Ò¦}¤ÃSí.7¥¤ý% ›Iß|[WõµµÝ'v�/mS¡ÿ÷kKKRúäN„F{)ã8&ƒPƒ(Øi¬úÕ<Õó›øVÏN´ƒiƒam&ÓÓÊqí!r�¦¥C;&b"މfWa§m*zºM­µº_G‡R¡´GBÑhC9ÎÊ�ˆˆ£¢W:¿­Hžvb/ DÜ¢}×ý(â+­uí¥úëK¶Féii&¡ûi6“h$Óbf ãà B0¢4 ärÙTdØxí[ -�â[† ™,þgrՌ˯ѢŸ«ïþšýùY‹ KÿQkqÿÿãÿÄKþZ—ù\Mef! Is5DTfƒ5g@¼ÉB+• ¿æ¤GÉnu2!™²6gAš¢0P@ȃ%âFq—3ùÌ‘E¡œ@Ê3‘œhN¨*I†º¸CI°’ á¤Þî–“ilÇM„Èì �&ÐL6Ð&ëD�.)6¢ÚW ´µÐMv—â“¿�ª¥ÈHƒYB7�qäPÍ3d27afDÔö Âašh3NÍ#„=ɦ��Ÿ‚";Tüü¶“FôG #C 6ƒ8Ùfݯ¥â—'­RtŸÝ/´½'„êé7^Ókо®ýoýn(jïã÷á~j¬ÂL2Epv˜L& 6¡îM9B44›LûV×V£À3�ÚgÛ¬4Ï·¥ ´¬47 ·JÒoO•?ñ÷iÕ¯ý3 Wûq¡÷ww­û«Ý.�,wJ·†¿pÑKK 6“nê|Ï4›B ÚA0Û]6Ò餮Úm~é'÷~�'¯wö·Ý/ºÝHú»ô?®„Uz¶ê­õö>ðÿÇÿùjÿ¾ ‡.¥éצÒký¿¦úô�¯×ö«T÷õ§ÒÜ{Þ½}øo¤0ǬGõþ¹u~¿¯ýÿ†¯ý믯°×ØpëëÖ¶£îÖ©¿»O^õÓ k¿^¤p¯·¾»ïø¿°ô¸~—ÿëÿÿ_ÿ¯°ÿ×ýöÿ †ÿÖºõÿ¤ W¿Žøÿ�º-Éò.ŸKzoÿKøz[ ÿÿÿýÿ ÿ”â‚0ÿü7øl7üzéµÿñÿõÿTZãö‹ÿÿÿÿ ë¶ÿÿÿÿÿÿÌÿÁ¿ô{×áÿá¿Ãa»¾«ÿÿÿÿÿÿÿí¯ÿÿþëÂ<ÿÿÿÿÿý/ßý/ýÿø{÷ýÿÿÿõò‹zÿþ¿ëÿÿÿ éa ÿÿïÿ¿»ÿè%ûëéw·¯Û~ïî÷ðFÿÿ¿ÿïév—ÿÿïëÿÿøÝ/¿ÿß»þ·ëýݿֿõÿûóÉÌ-Ûéÿÿÿù¦þ[aÿÛ÷ö?ÿýþúVëïýÿûû¯n¿ô¿œþ¿_½}»\ç·k×W| ŸÿÿÿÿKôºþÿ‡½×þÿ“l^“gUÿ·ýíßÝm·_ÿÿ¶—Ýû~»f{Ófkí+I¶ú[}×þ·ÿëúé?þ½ûû¯ÿß©š×´öÿom[Û3Û÷]»_í,"‡ýÓ¥®Ãõo‘\4Ø`“[Iƒ`Á;_dAÊ úþ·ÿÿþ«õ­þßÛÿ÷_ûõÒ°Ï«¯¶Ï«îûqÛ{a&Â(zmÂM†ntšzPņšv“i&œBa¦› MˆL=6AˆM›v0ŶG÷··íÿÿþ¶ßöh¿³EíjëÿÚöiXI5VCãJ 6BëM0È£ŸÃ`ö6!0c¦ØI0Å7IÚxI¦“VÁ8A‡\ðÚi +; ™tDŒ0ŠˆD0aŸfZ·ºMÿ퟾×ý{ÙçêØ%í°ÁSOOmšié²r¾œžG0˜ªjØIÞEE¨A’¬ â�Œ1Õ5Až‚8áCPÞÐmíÕ·éí„“ìºÓNØzpÃm†Bõ;b•8lB[«M´“µNÃi¦Ö !PA¢l·ì�´ƒ!æOMˆV› ?m¤Ó®Ú¿ +Ú )U2áˆE¤gZh2w •`ž@ÁƒR•‚²EYk QaÒ·â¿õõh%¶#aÇÿÊlZ–ª¦M´GÑ] ÉÃzP¦O�àÙ—†K娧*aÁ¯jþû.zM÷ínþvënZ¢ë;$C’¯ôþ¸]tõò6gv:ÿäÄE2>kEüŒDs!Œ‘ò�J¶g—‘ B(eYeù¡˜Âc436KÅÌ#[–¯+ÎF¡”‚’t"#I$†‰D#œ™à¹’ääù�„ Ÿ6ÂL3$ÀŠv aÃ&¹¦˜A^² è ™<æ—iå¨g‚"„!:�„]´haF°Ôü�`ÉàžÉÌŸY9“�4nzª<=ÒcA^é6“i7Õ¡«rh ƒWÒI´�ÝB¢‡I\µä-ðF†‚m&Òm–Š ´E‡ŸÝÙgº Žh+Ó -†ˆO<AÁ(ÌFÀÂ5°‹°Ìäð��„会xF·#w„«é6ˆ°ÒÒ_ß~ÿõUÿ®–’Õ=m·KM–A¸&FÆ¡£_ÂašZ‹É�I´E†š¤ÚN‚mmÉ¡6‚Õpôž7¥kêðN—¯¾£«J’]UV©-%nµVÒ¦Û]G8J#†­ ˜anË:çÍ+KKhW@›Pé^)\ÒVºÓÿMëxéuú_ý×ÿKú_KÝ$«m,6øJ…´µà¯ÇÝ+Ký-ÛÚõý¿ÒÞŸKß‘}{¥Óÿßézé$½kÖ!zQJí¤ŽýݧTÝß÷Õ-/®Ÿ#…µ#…kÔŽ}þ¾õEã¿éðõ­Rë„aëUÕ"�Ñ VŒ&�<æú^SÎסÿ©/�Žö×#›ägþÉÓ¿ãïˬ=}t¿öók7½%‚8øY…^’˜´´±SÑ�xo ô’1Ù?òÜ‘ïÃÿÿßHX4‡ô†¿õÿaÿú_û Øê•U×¥ÒUÍ¥K¥ÕRO_õ·éRÕÒ·ÿáþ—¯ÿ°ÿÿÿ]ü0ðGþ‚ÿÃkõK§ªT±ZýpVн*T�WÅEZW_ÿ°ÿúÿü7ÿÿøGþ ÿÒÿÁÇ¥¥iqQP­´°qU–Ý]T&ÂM×ÿá¿ÿ4Ÿ:_øoÿÿð@…ÿÃéõÿ·P”(n‚ZkµZ¨U è_!‚톓tÕ1M¥ÿø7ÿéz ÿ÷ÿ¯¯·¥ÿ¥ÿ½4Sh*¨P©?¦¡CªaC ±AˆP¡ ˆ[ÿïýú^ÿ·ïÿÒÿ·×ûÒ(_û  Ä-¦©¤Ú¦©¤á \Çd3 Ùÿ÷ýý/_­ßýÿÿ^½õ_}oÿ9òb ! œ’ÃÄDGûýÿ¶ÿë׳¯ßößþ¾»gU_ýèWö­ÔDB'p‰ãýÿ4ÿûõõëoÛûnÿýn¶õðŠíÿ÷zTƒiÿùåûf›}ÝÛÚVÙõÓg׿ž›Õo´S‡¥°Ì;®°ÓM�Sö†•"ŠC[ažõ³jé?Ø`“a>!Ù~=%ŽÒcMX°Å1§jm‹Á’¶!C�´×lŽ>Šˆ6ÓLŒK}Óµb–ä[a%;6!0cÉZaÓÚ 0ÂdQá…vÂ`ƒ'{G†�xm0’ ’@�².ŠåA¾û¦¶I„ÚbWs<0ƒ‹A ÐÅN-"ˆ²-öÓyg5Gjò¾�ˆÛ§¡ÚL4¸`ÂAƒApÄ béӖȪ�ÿ–ŒÈZ–Á®dLˆd¬nhȺ -`¨$¡NÕÄ +“ª|*�ÃÑôô‡·–KˆvÉC;2É_ý4þçf¢2t¯\®'(R"UM7}GÚÈLëžÂ7†xÏcÌ”jev÷Oþñ¬$ôÒü¨Óï÷Úh®ªŠRÉR Ö*Tjè&ß÷ÿ_^M‹uOTý}TT}rB/‘,¼Tó3ʨy�Õ§"•-Ut×$¨¨E"$íslÔ)22#U£c$ Þ—È/ðI†Mš ˜M“òg6Tö9Ù-ëêdS©’$ÈÄk‘ “dH"hBdØÉ„ÈðDAË¡pÈŠ¢¢(F¸F¶Q&zF°eóÒi„kÿé6ki:#¶�mÝ'†pëþ¹P< gB@ÊA‘IŠD‘²80@Ê#!<ðÏL4BLüz„Â4?ÓFÀÂæuh&èCrcäáH°Òm ÃMU&)Pg /í/—>“ic +ÇÝ+§ÞB¢tJµ$Œ.4BLˆì‘At£CÑ­„\AŸË�FÀÊ$Éà��‘’i¦�m&G°²c„†–É¢ÃIäÎƓɧ&pgM¤ØYçAZ¶Ð¸Á:M¤Þ%iR}ôS¶ÿwÖô÷Q§äDKæÌ§Žï'DkÎdˆŒÐ0ˆÃ+CÙÈ“: +ã Ð £=“Áô=£`jŠvo&ð‚mÛ-I†�›5IÔ ÎÃIÒiÅzNÒZ»P›JÚji^8¤¶•ý:ÚWC×µ¥ëÃ_þ?kþ¾ŠyÑZ„Ê4Ïç³Ä}Ÿ‰öœËóóÙ/ªa †ÓEC“$ÕµöÒm'Ïš²Ð› ‹ké7¥i>‰Æ›„ꕬ*uÖºi}oÿý{}U_þ?ÝwÞ¾›a×þˆ Ì?ýÚ‡Tw '„®šT›~©p�[QwI´Ým/mt›Ý/ïí]ö•öõkwt¿Ükõ¿zþŸ#…½,ޝý9»oû¾>»ÿ嘰ÿúúºø†÷¦ßUouÞš×Ûõ¶µO÷õv¿ÔŽC¡ÜVÚÞ…ÿ®¿HŽ3jøÿü�8n’R‚_ÿÿÿ_Ãÿðÿÿýã¾*­Ó¥oߥï¦ÿ«{úûoÕï_«ôþë¿�ÿøŒ?ÿô…‡øÿý·_ýØoÿü7ÿÿ§½·__½µkÒK÷­õÿ¥ü}Ÿ.µýÿ__þ¾Ãýöô¾ÿÿýqü‡ÿÿ ÿÿ×½üzu¿¿¯ñßöþ—ÿßÿõõÿÿÂÝÿ þÿaéÿÿ· ð‚}ÛmÿþÿïýÃÿlzýƒÛÿÿ¥ÿý¿ÿ_ÿÿÿü+¯ÿ·ø#ßÿÿÿïýÒü%éoÿþÿÿúYÅÿ·ãÿÿÿïÿþÿÿÿÿø#]´ù¯Kÿ°Þ—×ÿÐþ—ï·ÿÞÿýýGmïíÿûͯÿÿÿþ¿óOÿÿÿ·þ¶!zþßë_ûé[¯ýõëþ¿g—ÿþyûþ†ÿô¿ð}¿ÿûÿÿÿý/þýºÿÿKFÙ—KíÿKÿWºÿÝ{_×Òúl‘þ»þëIÁÿ¿ïðß�ÿõ×úõúúýöÿÿßúé~»�wÿ_û*6º·_öÿÛºuÿÛ?w_ݶ~ÿmëì1ÿßaÿ×í¯Ýúû¯ÿ~ëÿ÷ª¯¯ßW÷w~Ù¢ÕR3Û3î®ý³û¯²õì'¥êÝ.Ÿ°ÂIÚIé±±VŸwýýëßÿ¿ÿ÷®úÿÛÛoî¿oÿYÙ'´í³ûkÿùµ«anµVÂN’¹…¦Ã +Ú 4í;NÁ»M8i0¦˜M4Ø…pa©Û%Â^•¿]¿kç—ÿ·º_múû¥úí™ûf}Þé~Ú¯ØF°m—¹w"pí&Eºpà ‘ÔG�Û›I8Ø ÃIÁ¦›L4“»ÖÚu¼*ÄðÉò#•…R "*Qˆˆˆ÷9Ö»~õkÖ×íëÛuퟯ<ú¼Úm-bí°–Ùƒlå"å´“TÙNÕSbmÄ$ ØL(¨V�UV˜i‘ÐððÂb‘íƒHøVœ Ä)YÏ&ô Òô´¶þÒîÒ]tïÛVÒM6)‘cÚ YÚIÜ•µblB SPÛ#¤v˜a-Ý×=ØH¬a‚hé©£²L®¾Ó¿A+!CI†Òdq´¯´ì2Úpí´“M„ôܨa+h1 ¶š• 0¥j`ƒé±+%£;E ´ \&›iZVЦ„ÓØí,—ØB-b,ÄZQ°Ë­QíÊТhŽFBH®ŠýDR¥¦Ö>õ ¹‘BJ²ßKņ‚-¯… ˆÕì)gµèa>#ÿ”Ùb=“J[)f@ã%¸É`Cb*ËK:+‹åÜABçf(þZ°˜Dk‰T(F�óùøTxaþšéÊãLíW]­ÿQñ÷òaMz¦é +�ÿŽ>�?×òKêTú÷ó"k___;ÑòLÉxè/›%3Íè„ó9a+;ÎÆzõþd ý<äj.) gVj"B6GA�ìë˜ÏÇ\Ÿ0`“¸ ‘ höý2„~#-oI㚪çTGÈ�‚Œêğ? hÜÍ‘ dù²$Ù¤`fc?íƒD%D'AØÑí„l{Í ˜TÂ6—ž›OA? ˜i„xiàÎ4ÛIÒ¹3«êªdªY ÈDD"0Ï™ÑÑÃL�)–Be†N�°F°Â>3ðL&¡ù¤{M8<›P™zuІäÇ ôki0Ò“«h3†™ãI´ô•®º¤Úm­p´´´¶’ú•�0™ÔÈ–l�qFl‰|Ÿ0a ���83‡'CÃL)ÍB ÙFÇè¦�:Nˆá£ÛI¿JÂ{-ù¥¦}¤ØAœ7¤›q–‡¥­%×OºV»ýïŠíÓãíªÿÈ8d2"ÌŸ7‘¸ÔDVÑ…Uœç‚xhQ�3LàÏüåø„ÉûP™#m=-[I·tÏ36“iŸl³§A6Ë9sP Ži:Š ‡¥úWNõîº];ºÝ>ÚÞ*êôôë¥úøÛ¥¿}~—_\×(L#Xf'ØK$û3“&+á&Ú)Ú +äÈ´ÐI¶Z )óV á¥k¤é0Õ÷Ví+VßÕ·¤žIŽí?ÿãí¥»Öפ­ýqÝ o¿‘®ÚZµn­ï~é��Pˆ°Òc :M¤èÆ—°’µÂb]Âô•é7¶—M­î–“ioûªoø¥«�uõú«õÖÕ×»k_ú ‰Ú�ýòT_¤<>¿‡þ¿õ¦Õ¯éxV¯é^﫾ïÿ»ûM¯Šþ£îü?~ÿÐû†þ?ãþ?�ý/ÿ- :_ô‡úöþÃÿÝuðŸÒ|R÷¯×Æž½ô•uon·}^µzÿÔµoåŽqÌE‡ÿÒÿ_ÿÿöÿÿ¶¾ÃÿØþø#¾ï¥×uµ×ú»ãû~=~?xÒõkÿÁ_Ð� ‡úÿþ¾¾ßÿá¿ÿÿ¯ ÿàßþ¦„¿¿�cøÿC_þ’Z·þéÿÿþÃÿ]†ýÿÿÿ äºÿÿuðü?ÿ¥è/ÿ¬úúþ¾ßÿ¶¿ÿÿ×ÿ†ÿü þQþ¿~ˆ…û˜ÿÿi?ýßuí÷ûÿvëëÿoدÿ¯ëÿïÿÿÿÿá¿ûÛ þCÿþ~ü%ý×ÿÛnÿþïõïþúÖ¿÷K þ¨ÿûý¥ÿækÿÿÿÿð÷ÿ‡Âÿé~¿ÃuÿÞõÿ{Ý÷Ý|òÿnÖ»ÿ÷D 8l“Oá_ÿÍ?ßþº ßÿÿíÿ¾áÿ_ßÿ_K÷ºÿl«O¯ÿo÷”uÝzþ®ý§ëý´á×ô¿¿Òê÷ý~¾þ¯ÿ¿Ýëïs²…ÿ_ßúýÿÓ¯þ©7ÿíš+Úo×uû£×ðÛðF;/È®ûÝ/Òÿýaý®©z·¾êÿ~ÿ“®×ß(ÿÿ_oÿþ×ݺïÛ?]7wß¶¿lâNé6ÒTô¾í�㯈NÅABþ…jëþ¾ßúþß×_×ßuzÿkOKÙ¦½]ÙêïîþÛ×m$ä^{¤È%¶Âjš± Ž˜Ól$› jÁ„°ƒµ &…¦˜Nþ«œý}ÿ_ݽµ×][4VÞêÝßì3ëû«KM†í+I=8l?b“ƒµ¶ÓNÝ46’mM‚`ÂA„Ó]öA’¸ƒCޏ`ÆQŠøÿëÿûwúßVÛÕ ­‡i6 ¶ãÛ„Ã<˜Õ=�üÓƒm ÚH4Ø„ƒ´¢“Né à 6‚pEöšG‡*-9B'ðÉ ¬b޲!ApßöAÔ;º¶ï¶Û òÓNÃËþÈt€ÛKJÞÐLBMƒÛ BPŽ7¦ZmX†!h¬†ð dW(ÄDGªmÛzM¶šméÃd$Úí´Ø¦Ða4Ù% NÔB <0І!:áQªv¶Ó°Çû ÑB ëÊ�„0B#35ò!£žWš¨¤ãý,Ã3­}Z¶‚ìmŠ 8a£åÜDDòùm(ÊñË`N )«2£©g¼›ExÕ{ÞYs±Hì±…;¿ÿ™\v`ÎÍPªV¥{÷|xSµ:ï¯Öþ>‚[ûîâ9زÉW÷ÅßÇ%«Ó×2Šƒ5dI_×ÿ_]HLŒÍYO¤LÏ"/ +Cž1ˆÓ<9™ÁHÏ£LÁžMýH…ÿ©\¿” ʳ"è̉"Ö�Dudy™62ˆŽÑ  #q<Á™¨f˜@ÉôÉÈŸÍyœM+F²/IÓP˜I‘òµ>Ò´õÿIÿé� —ÍC#  �à‹vÖ"Ý‘ƒ=]{ßQUéëíGß~ +·üD=ÿˆþ:ôGl]p™ãv¶Õµt®¶•Ô_ +ûk¨î¶“Þ®¶»Mþ•º�}õ´5÷_jß¿ðѦž´ u�ãðÿýGÿÿ–œý%ÿøNÚ^ïTÚ^ß»ö?Ó_]â¿ýªûÖß}5÷«n?¢Ü–É;¿Û©u‡,cõñõKõØiô¿ú·[¶¿ÿßý¯÷ƒWÔŽþýF´»k#…^µHk{ßJÝGáÿÿ�ÃÿõJkÿÿúì=ÿÿ +ë°ÿëÿý?^ú] D}kä¡×�Hkú×ßï`ýv_õ…Ø~ÝmÖÛ¯ÿÿÂ8ü7’ìŽÿÿÿñ¸X?á´ÿ�÷ÿŽû~ø�¤#û¯«×õÿýÅ¿]‡þ­®±øoÝ/\7zÿÿþ'ÁôÿÿøAl0‚Ããÿ¥ÿÿÇÒÿöÿ¶ÿÿÿæÓß ÿ�wt�x7í¥õa¿KÿûýíÚ ÿ»ÿׂ +6ÿ Ÿï_þ¾Ùµÿÿ¶ÿÉ�¿ýÿÿÛÁüŒüý-ºÒ÷¾!m®l{ÿ¿õ÷uÿÝÿôµÖÿÕàŒ?ÿïÿÃ`ßþ®ßÿÿÿâôŸo¿KÇ_)Þï~ýÛýW{Kÿ»ÿõ[:é·íÿÿøÿÿá¶ÿú ýß÷ÿ_ ý}ÿ×@ˆêÒ÷z:=ìê½ÿ¾ÿóW·ÿí¿ÿðÛ4ZG?Ùï·Úy÷ý/Û÷ûü8¿KÞÛ]}ßµ]÷K]7×=ö¿MÞß¶·{mÿ¯tݯýŸÛÿ»lºd˜-Òz{l4Ó`Èù-†Ó÷ëýýÿÿûúï·}­¿õù:öÿ!:î¿»¿÷©Ÿ³÷MŸ¾öý³ûvakapÛ/iYÎE=tئ-4õ†Ãl1 ´´í;d'íŒa»Ûÿ_߯Ûü�9ßïõ<¿Û¶ý}úï_[m.¤ÙÿaÃ[¦ÒaÛ¶V“ i6-�¿V6DªÁ¦�ñ ´ƒI¦š†#…éõI† œ�¢,f‘Ø¿ÿÿµoÛûëJÕ¿»ºÛ3V­í·}µ«I[<¬0û«.žpãa±Q Ó´›I°�*IˆN˜dnƒWa„XH~xmšdz„ÐÊ·(¬#²´PÄD6V“‹ÿ×þ›¾Ï¯ï9]^ßÈ£»I6L;�ƒ¶ÄÈ®UáU7´“ Š>ôØi0à $�5a…M&ȺHô£XbAŠed�‰º}õ¯"ަö“ v $Ód[i[jÈAì4Ó‚}+ ˆ€Úaa‘d¡HB6“e>i¢„â!ˆF¨FQæ@XÓˆrÊžÒZi§ ÓZGvG"{L0i¬&ǰ‚`°ÁÊw´àÊ$9ÚÌmå~ÜB¸­WGj«*3Ã'M5*Ù>â„SâŠâˆDD8Â-Ö¡ÂN¿­ã;B"#�]tÚI6?ÖÒÒa …³êµúM¤¿Òà“jÅ EUˆA‘³VAPtW ÇKCÄcÿËd£–À³R"–ac2ÌŒ³*_É·geQn©¾Ÿü)J“þÿ2<©ø»Uþß×ÿûÿú¡Í?+�"š™Ý¬©¬åš‘HgŒè3Yž"†¶]˜æFyXÿS!Ñ5�©Æ„u´o"ÈÜh)( ɲ'"<)>kÌîO³Vgh0��™Á4ѱ“ɱGÝWÔïTwÌ‹dx�‘ ªAæ#\u‰ódQ› H3�|�–á0‹³»'€Ï™>šaFÀѱ¨N~Ÿ’p‘ý5 z<=&ÐfÌ#[I´Gl#ãA0ÐÃMmH^KöI ùéšãQL¼i“ÅäDvS°�`Í3ØGÀÑ­‘ë#Á''˜g»Pš„Òl$éè& Ý„4›I´h‹m-RÒ°™Ò|[ÂV“zW +õtJ=HLÓ6ezgÙ¤ƒ'�Ü0–‚lžm&ÖÒzt­Å'I×Aœ4Ï´­,(t­-Ýd╤ҷj*“÷ ¯Ûý§§t­¡mv¡OÙE Ó=‘¨ûA™ç»#£õ…A╨6•ÕÃG†ï²Ñpƒ8Òa„ 률�-x««~)jé?¥i;µôýøúé^öþªâ—¾¡R8Wý·êjÝ]«iZVª}«l!IÐ3�×¶Ò}ÂÂa¿î— +Ò÷üUºM.šŠMú½m>گ↿»©-ív몸ýý?ò3ýZº]'V×¼_á^¯¿¦>Óïÿ¾©_Ýt*+÷ýÐÖû^G +»U_¿Èë­ü>ºßHH¯n¸´õ¤ëûú^ýté{µÿõ¾‡ÿmkZõo†£ÿ¬­¢êýzCUû_×ÿÿýÿýÖ¢†ïß[^ÖÿÃÿÇÞXäs·ðÇ¥HXl:øt¿ô?ÿÿÿì?ÿÿÿÿöÒÃÜz–8/áãþ+ëßÿÿé ~ÃUøl?Øzÿëÿÿÿøoÿ:²=ÿÿÿúá½ë�ðõÿþØ?ÿõÿßa¯á†Ãü7„qÿÿÿÿÿø7ÿ„ ÿÿþ×û¯vþ¿á¿ÿõÿü6Ãÿ þ ÿÿÿÿ»¿ß¿Òÿ¿ïÿØv¯þÂ(ïþÿÿxÿþ Oømÿa/þïïÿÿý÷ïKýÿÞ¾ ûÿàÞ¿äÿá¿ïü ¿»ü6½ö=ûz_þÿ·÷ïo^ÿÿõß÷ý®÷óëï÷×ý/ýÿ¯õ¿÷K{w~·½ßöÿþÞ×Î/ooU×ÿo÷¯‡è/á½/õÿßÿý/íëß[{:¬Çºå?N¿ýßí÷ûdêÞ¾ëµo»ëaŸ_¶zý´¼ó¾¾÷ÿ¯ú¯ÞjOÿÿ¯ö¾yk·mßí×÷¯ûf{}°Ï«]}°I†zm/ÒVöÏ%‘v‚Û +ž›š¦ÚA×ú^ÿS›úÿþßþ¿~­šoV·ZÛv}uÖ–�0íß¶mU�†ãÙ;M6(1M¤ƒN ÙìIÂx"ðH é¦Â[°ØKÚ�?_m¿ô­Vÿ_¯í»ïl$ÚWzR á†Í¦äÚV•¤ÚI‡I‘>0tÕ4ئ4iŠØ*[a0ƒ»§ˆpÐbˆsDaJ¬ã‚!H’ Â]{mŸÏ_ÝvŽ8?nà Sa‚8îÒM=X=8;o°Å6“ÚL±† „2$ȳ“dt’pÁ m¦»@‹è÷ Éäì*ÎÔÑÚ¢+�-¥h+a°eæ*ÕSm& ±i4áß 6­$îïtÚôÕ„bÕ4GCL h5a Ã6;[u¤øb »ØcXr ;@ÑB'Á¢Ìu¡ZeM{¸K¥…ú×I6¸¦5Âqÿ�‡-µ†R£µ(ß-t™‘T …%Ò’y•òÌ­+Ž`§d¸Y㦩é &D@¦h#@3ïOIÞßÖW1ò-Àš­ ÐO¾ê=m +UáwßIý¯ÈšÇš­?þ•ÚÊV4ºzí÷iß;õÿÎÉ3®GÉJ/gBûXÿŠþw5�m©ŒÐdA� "èᜠRˆÆC�à�l2M›D'Ÿ(‹�¬ò•šÑ\æSšfh¨G ¤@¶EQ @LŽÑ ቃ ¢C» ¢0�a䜘M4{i2>L<]4žHé´.?äƒ!yNgAäYÌ ‡dxa¢ ˆˆ5†ˆK#òú(‚6Ðò¡Éùú�ÐL5]É &Ñ´½PfÅ8ÕÒi-[ +®Ò°Ñ'_;ÌŸ5‘# Èb�Ñ츸F³¤<à0F¶°døF€ìÕ*i ¤ôh¤Û,ê•T�'÷WJ™ÂmGþ’ÿ×KaÿÿmÒÿø#ÿü‹ßá°ßÿÿ~‚¯þÿüp—û¿¯¯¶¾¿þ–“~ÿÿýºÁ²-¯î•ÿ�SáÿÿA?Øpúÿýþ–ÿÿï°úï_ÞöëÿëÕõUξ§:Û¯þ´°ØA?ÿí×÷„½/ûû_½Û~»ïÿK2ÿíÿ¿××ï9ïëõî¿ÿÿÃ0›4ÿ×t¿ù§º[¥ÿýPÿézÿÿ¥Þîþ»õ·ý~ÝþÞýmÿÿfžÝz^ÝwiÿööCÂI×t›ið—CaºþÿÒoß__÷­½vìëúõßûþ¶—ößýÖ»fköþ› &é'i+ �¶’k\ÕUSbm±M¤›a$ÛA ÿú…õýÿ×ûÕþ××ooÌuë¶f¿lÏnû³õÿ¶za››/jÃ72!ú 68l5�ƒí&!&I;A]¶’i°žîíkà T¬+„! Q¯ÿ¯M�:UûÿM¿oÿ_Þ¶í6Í úlúêëºV×µa„¡„ùpíÒ[ †)ŠˆI Ø¨O¤˜a;VÁm‘ÐA=Ø„Šç*Űh1 +{r¶ds³"�ßÿá˜ÿ9ëíÿlƒû3W·ØO‘G´ÛI6ºD²(é�ŽÒÒ»A[ši±A‘]' ­Š†¶A„ÂF†OU˜2È>ÿû¡Ü†83êé9pïl"‡i¦­²öȃ•îÁ»„骶‚MŠa;ƒL&ÁÃÏejØPEôx“á„Âa#Ûa @ÁçâµÕ>Ŷ٠Í-„ê›4ºvÕ«�»«M#ÛG‡*©ƒIˆÂE•O֩ݦíXh6- J‡+[DQHdè´Åüˆ‡2N+ÚUè.–Ã*¿´ †E�^’ZU�®ë¤-¤ZŸÛI±d  +?ùM–Gd)k†ŠâÑÝ#!4iËI:+žÉx)Þ­?å•")q®%£2-0¿¯ïɰH™0š…G�¿‡¦²f†ºúNïíb=ʼ‚Gz¿ÝÔ2&±õšû¿wÿõü“Dx‘‘õ$ÆD'­ÿÿÓ&KÈ”Fd¥™™Ðd‚*ÑÃ: —dù²$fÇ„† $Á¢g9¬2Œ']¡Êýs%—•<ÖE@òAã%xˆb”#†ˆJˆ¨* ¤�fÆFó=˜y10Í0�‘ža0� #X3ô˜A‚6©6š 4òy[I¹8„‚ ´ÑíéÇ_üíQ"5�"ƒ;SÍæÆ<öO’3Dh.F±„k #Ch3‡… =n*“iÞÇ\¤Îõ,Ú\Áú!<Ô9«'çâ”0Ð ¢.aÃÝ8gÌ#XqA¤lƒƒM0Œ;A6‚t› ߠ͘F†‚´E‡&0'OIó3 +í%õi¶¨ ´�iqn©_n~®¿÷OËqÍPf»02Ù—3莎dèÜì>GÄüüsŸü2Žô…²yR³^ÚiݤÃKwI¶©&÷™Á‡I°“i6•»¤Û«pMºôá/z}_^ŸëKI÷ÕëÝßzý[džO˜fy9‘ãFffhôkÌÑÈþn8gÌŸ=™ç#T(ÏF‘ÈŸXf{ÃiÓ´ì$éö�+_ÒnLá6ƒ#šVºž0®“i?¥»I7ý4ß~•«^îêžú^4?õ^–û»õûïõµu~£ï^û)ûT L;uÕ]'Ý+IÔù«i6vZ-ᆕ…t›WI½ÚJÒðÚî­¤ëitÝ4­þé5ªûïZª^Ýסµõºîúµõï×�ÿøûïõúÿ†m7I&ßW +®®ú·½ºZWúMÓ¥tÒø­úK«î©ën*¾í¸Ö—ê-Õ7þú믿ËŒÿ«öññÿýÿ_ÿUýþÚV­*MŽë¦5­úO¯¶»Žž­íë×Þ½6×Öï«éj¿ÿË'é¿ÿÇõ×ý%×ÿ÷¯õÿ}ÿÿì­ ¯öýú®ïªªý7¾G ªPëúà—Ý!×Òûë_ûÿÿÿ^¿ô¿ÿöõÿïÖ×öè—¿ÿÉvGÿoÝ鿾ýACõkÿ¾H¾†ûkC_ÿþ¯ÿþõ¿ÿÿëÿÿÿÿ@Œ? s_þñn¿t’ÿÐ_ÿÃi ëü=‡ñaý%ú¾é°÷ú_ß÷õÿÿó¨ºÿÿÿÿÿþAïÿêO„ÿẠöè ¿ÿ´_ü7ÿû†Ãô¡ÿ¯ÿê¬>ýuÿÿßÿÿöëÿ¯ÿïÿ¿Â ÿÛ¤½/ÿÒèÅ/õ÷K÷_¿ûû °ÿ ?ÿÿÿ þßÿÿùOÿûøëÿÿûïÿÿ¥÷ü4¾¿ÿ]-zºû_î¾ÿðÞ þÿÿÿàÿé]ÿÿá/®ÿþ+_ÿ¿´¿ý¿×ß÷×_ÿÕWõ_]}¿½×íÿï‡ÃaþÛÿÿþý¾¶ë_×µ_ÿþÚn¿ÿ¿ïÿÿUïý_ÿÿøzÝu­š+_ºÿþ¾Æÿ÷wî¿îí¯ÿÞÝzúïWûúÿûmíÓûë·ýkŸ­?ÿ»�Çý�Æ�=-/l‘\6L6–�ïÿßw÷~÷¿¦ûúêïé¿]¿ëµoÖÝ뵿lÏot›3Mÿ¶ü°Œ;¶ÏúÛÈ®Á—==S»a¶¶›v ØJÐA˜b ¸«m$ÖtëöëÏ'Î,ÚþΫöîýë_léÓ®í·ëï[zémÓ}ì3ê›K»UÛ¬&ÚL0²vºlRi±lBm68v�0µºtÕ;Uv®Â󽧈*#à”¬b A„ "F„2•û~ëª×zÓ«wûm¶½¥tÙŸ¶gôÝ{m§¤Ã9í¤›r+‡i[¤ÈAÛÃvÒ °zi¦Å 4Ú1L-4Ói=…]ƒâ¡£ÄZ #ÙùŒ¡XˆŠ1â"‘9ˆÌ]†ö“uwÕÕÛg×_m·m—�t˜a{­m-¦BÐv‚cM´“d%Av’a†L*‘Ü1BÄ+v¥^xhöÃɈDµ ©1­'ý¤ÚiºW½v–“a¥i&¬‡¡p|B  “IˆH0Ä&Èé ÚIì&G +T Á"® ¨ +U°Âi¨DqÏpÄ hDA�¡=]_ïL„þIƒì$›tÝCÙlS°Â a0¨ŽR¬Ž°R±†1 0ÐGbèʦY�–ºøa‹L«(-2™Ç¯Z_,Ûi6´»õ¤Ã &¼Yá2]§ËH8Fxr­ñ„SXÈùM�BËHYãQ,ŠâŸ,Ñx�db0er¨*ÛRÊxìÉ…�ÿ䨑ee®‰Ù>½¿•È\�gf±ØÉ?Þýn+Ó¿éúÝÊàñõÿûYÙ_ÖÿäÜi&Vò>jYÄ@̇ÊtpÎ ‘Ñ4Ìâ½Q�*uò*ˆŒD|ˆÉâ=’蜉420Š|á’¶f!Ö/ÆóHÃ=³�BL®2sÁ>G0IY?&sX0‚a¦M.©§)Ј§éþRGdŒÍ’è†*FÌè&S£¨pDJÈ£‚°Ê �„a( #aè{höÌà�a“Á5 ¦˜FÆL4› é^­§¥i{¤ÚM Í´VRmpfΫ�„È5‘HÍ�Q­5"LŽ/›"ge°A„ÌÎNfŠ ‡‚ Ãϙ͔~a! 4z3´xjMRm'IÕDväpÐÒ ¤éCKÝ–„Úé6“o¤éZL6ÖêÔ·„v>¤iæEQÕ”#e˜ F™�„ ž4Ïfš ä˜A dèö‚ð˜A6…„hnè'e×Thiwt¤ÚM¥ ˜i°Æìñ«¥jêé-Âx&Ñ'Uijê*.·†»ÿIý§ÕiÞ™ØÑ3\C"­"8ˆ¤¦ÆuG2|¹ŸPò""?Ù[JêÿñI×ÿéuøAî´¼ פÚZr¹�†“ U1d (4Â3gAXÆ#ÿ 0«”ÕlìRYldMòl)Úˆ˜|µÊÅ8D|)Ó_òÊY!i ïÎÄ™\‘©Øµ7ï®#È£m#³WõNù\Ég`_Ô—ˆå]ÿ_Š’þ¿uZ¿è® «Žš¯•„GÉfGDn:�ý ;Y1™xù�ÄFÑ(Ⱦ]j@̧2äI˜shU—åa>%Y “$G22#0gÐIš癜F‡Ý¥+…¬]UJä">C�LÔ^m•c)ófSƃ5ŠP! €¤xט �š36fÂ‚Ïøð¤˜GÆ¡j©„ÓôaÚV“ T*Lj¨öÒoã¯êIb4Ž3PÈÈ"&Á ² +‚c—eq2 òSL EÌ 0�aø@Éð��BeaÖFê?B?U4S¾Òy1òqMRmB=´�–tÃAèŽÈñ²ÏÚM¤Ú Žj“*v—ý<ìk5µ' ˆš¤éÎ9+*…aÊÈO<ãAŽxiœ‚„Â5†OíÚv\uaÒt�Y&ýê“…EXa¤ÃIÒ†–®g6ï[Bâ¡ÂöÚŽ“i: +þ¾Ú ¥_§ÿ©ÊtvŽ#\¹±�¾`�0@ˆæO›ÈyÌŠjáæjÈÚ³>(Ža&ôô­YOWDW &ÓÙ{6ÚiÝ'IÒi&ü[ +£‹té6“¤ê8§õÚ®½ÿ�ýéRÜ_ww¯‘fF’" 4n>™°œË9øô+ Ð39{=d{LŸ=¹SîÐN¬—¦ÕÒnM\*<ÒÛ,ý-1oÐ&Òm_îF÷ßÇ÷[ýýñôŸ[Wïñ¯{Òm¯ÿR8Umßÿ„nLž'áá4�_Òµ}Óuo>ÕµLñÒt¨%ikººŠúWî¯ÚŽ[qt›aý¥¥ÇïÛ¶é6¢‡wÓýûC¿ýÿüýÿév}¨I¶XÞµwÖÕÒ×JÚÛJÕkõ~ÒÒô»qKük§Úºë_m/ºýx{Òõ,r9†Ãÿáÿü=[ÿý*ÿ_פþ©[ê8î–¢“â¿ê®Óº]jªõõÞ’®õ¿{«oÓü1þX'øú¤,8ûÿØÿÿïï_×ÚÛuúµõúÚ×ßÿë_E¬|{‡ø7¿×û¯a¯ÿì?÷öÿaÿøoÿÿÿû_É÷ê5úïpÿJî£Ö¢ÿ�éÿ«I/_aïþ¾ëì5m/ý½ÿðØoÿ þuõÃÿï÷ømøKõî�ü6âÃ^¿¯õ¿_ö¿¯·ÿÿõí‚0÷¯üÿüÿðoô¿ ÿÿýëñ ô¯¯ÿ°áúL?ÿÿ÷¯ÿaõø#ðßþÿ·ø: ÛKÿ ÿý»ÿïú_¿×þ»ÿ¢ /×ÿÿ°Ûý‡ÿÿøEuüŸ÷Òü ¿ÿýÿKÃa.!ﯭ»¿þÿ®ûí¯ÿöõé�õÿÿÁ°oðýð@…ÛA~^Höõ¿Iü?_÷\?t¹õïû{Û¿þq?ëùäÿ_ÿö¾¿ëÿÿ †ÿl�ïþúþÆïKÒÃõú_úÿë¿¿…ÿÏ'ëêó¯˜ÿïûÿõ­×ÿöÍ7¯d¿ÿþáþÃ¥÷ý¿õûë뾓þ¾q?¶—·ÿœõ]¿õ­-Õ¶É×ÿÿuþ¿t­Ö¿eïa‚M¤©¶ºvß¿ïÝýÝWÿÿ× 7ëê¤ z߯÷õ×õµiék þÌó’þÚé[h&ÏÍ‚]]w·ÚV_l¾œŠáªn©¶’ 5N!h6)´�ki¦»…ÿþy9…ý�V¾ßíÿªý¯ÿ×Fi³WÞ¿Ö“kÛi}÷R+†Ã† w¦�Õ¤›i1 Š´­$ÓAÁö“pTšpÈúI†Èè$½í ‹èÏ b«!èôÊU)[·ÿ~­ßÿ~ÙŸÿiÈc›~·}úJÃ<“l¼²+†½¥i:IÈ»,i é�´˜NØbM;°–’m¤ dtdZʶ� ï Ð5*ØŠ: +È1!¹R A±~­™ëw]7Ùÿ«öõêÚKéè§m°Î&î ²:¶Òj¬…÷®i·V�a “i´½“ÄÈè©�¤~h®+ +¹:!Qs)Ð`Ë!eìô¿i}¥i]¶Ò¶l‡#ÇlRi§¶.Û!Ö·vÆõa;Hñi¢|CcŽLBžØˆŽ"")9‘«¡ŠM; R t›Øxbi;I†$Õ…<4hhñG†Ð:= Âd7�¬Â":¿Ô0¼+#cehÐ@â "Ý:q¥ûJY OZõé}---‘\*×í¥ƒcÒdn“i] ‚vÄ'Œ¯Ã ¬8�ÿ,Çd”¶jEt‘ÙTOSƒ'‚ËY-"PËÎ(H8S³Ü³"L‰.De¸)�iëúOÛË;ÁAØP¥KÂi>îê/\ì¾Vr½ÇdåTƒÖ›éýgjw*™\¹-~“_ú¹,_¯^ÿwQÿÿõÖÿÿÇ]\‡͙ԔŽÿO�¥ÿ¦v(‰b#¬Û)4Gó:d{Ê2ñ©È/ðAÙf|„ÊaÃ333^w5ãÿù\Ö&hŒgSÈ–n4gC:Ôh‡ƒü h„™™œÁx Ñ™²ˆY}=µ4A0ü$fu® Ü–' &8XG¶‚mÝÆ¿þ¥&k~PD22³#°@Í'ÍŒŸ �ÌAäH Âa„k ư8ð��èØÂ +í4T>ÒnEŠNšA4´ÓH[L& jÚz¦�¤Æ“…E[VÒ´µtÏ´¹s¦Kô›Z +¢“¥Âºmt½}ÿÿ^·iþ‡{wzþ7ßCõkúÿ¨P˜@ƒ~ „i�—%m=&ÂV­4“i:zM Î4µµÂ¦ÚL-ña¥¥jé{jîôé~¾ýí%îþ]õ֖¤p¿©/M×ÿ¯ßãú,r4/幌>¿öÿ¢;sÛI¶·I†–‚ ¥jé?kÒZZ´¼&×J÷é×Lw[ôµß¯ß¯ãK{Q­ÿB«ýÇùû;œ%qÿúø¯ãÿ�kׯþ=wí].›íÅ-/zT÷hU7ë_}ÛÕWá~¿øþ¿ÃHz÷—Wÿý7ô„_ý}‡ÿÿ¯·ÕÿÿöŸOÞ­-ÛR;ZQ]ÿ×ãÝ}Z÷ûÝGÆ÷ÿßùu}‡¯ú_þ­ÿÿºÿÿ°ÿ¡ÿÿøGv¿ÿý¯B¿_÷CEzÇmRô[’?­!ÿöé*ÿ¯ÿô¿=·¯ÿÿë×ÿø#ÿÿÿ +ÿÿí¥ÿÿÿùc‚þ›_匪_Zþ?ÿþ°÷ÿ ëÿ¯í¥„EÙPx"ÇÿÿþÏm/ÿôÿÿ‡ü _ÿÿº]û×ÿñÿÿÿö×ÿõÿÿ ÿøK_ÿaÿmׇÐ/þÿü [¥ÿþÿûöÿKûÿ¸¨ëû_ÿÿÿïÿõûÿÿûiÿü#Gÿ/÷,Cz_ÿÿëÚߪ_þþÿ®ÿÿ»_ÿÿÿÿÿÿõÿÿÿöÐA¿îô÷ÿ ¿ôÒÿßÿÒÐCþûÖ¿ýù«õ_oýºÿÞ¯ÿÿÿÿ÷·ÿÿ}ÿ¸AÖÿK÷ÿ×öÒ¯u_ûoÿUVÿ¾Õï_ÿ]ÉÖ¾Ùšv¯öÒ½¿ÿ÷þ·ÿcw÷ïÿè!ß×ûÿ×ýG;RÞ×ÿoÿÿÛ4íëÿø×öC¿†ÿ°µ« �é¶“ã¹gÿý_ÿo·¿ÿ{ÿ©0¾›»õÕÿÿöýºo[þÏíÿúlƒðg®öÒÌm¥apûV#ŽÛ9iÚJšv-û“M4ÃõqI«i8Ó ýþëý>Ýûwíû÷þ¿®ÛyýSûÿõû?HcúMŸV‡#¿«i0Â(w鬈;¶)5MŠcm+4í†4¤í†~î˜L5sà "—ƒD:Dß÷Múß·û®ÙŸ÷·²[®˜m¶°ì#ýµMtäWðÁ‚MݤÆÄ&•4ÐaŠ`Æ“NÓ`�°Â[L0˜ ÃA4ÑP‘ᢰªXF¦CD�‹&ÅA¿îh¯Ý_3ô›3[ ½¦ôÃÖÒÕ¸l5ôÛ´¬$ÈS�´ìBtÓ`Ý4ÓX]ìBl+UH9á£Ûž!„QXÑ\U3ÙJÎx0‹=A¿¦Ã ˜ýºaÃNá0i&Ã8™ ý�ô0Å&›"Ž™ 6škv‚ÐA¦mÞ»žzeDŸ•lŸa8ƒŽxƒWI¸ÓNئ)Sl ™ÓxPÈžÃ"!]%(ahÐÃ@ !Rƒ�ˆÐ „D\®#Å£Ä0¡ F9ZˆA¡z#�3·T¾.®¼É'ˆ„¿_­}ii6•~µêÐZí-&ÐL‡g^ë2l*zÃb¥¸[¨6ƒdß”Gÿ)±âb–Ѓ y�,«-e9<)Ú¼�A~ZKÚÌBð¡&ôïùf-`¡SÒßyª"hÊ‘KdœOÑ&ﺻM~Lp ¤è™Fõ+)Â…&—¾ï• ýy$›¯ý»¹Ø_�’ecïýoøa:‹¿Cþ«¯’ÄEb"5eâ‘“�“;—²¿ÿ23Ç×; )©DBR#Ê8Σ óhŒŠžl‰æ¨ÜQAŸÍÄø@Éð�„ƒa¡,­á/ŽT,‚ëäƒ5 “2@ѦȆ)!8„4lh„ž¦4BVƒ •™0�Œ% £Lôg#9SG·Ó„kjж�›4˜téu²Î›úþ¿�4v¦E&Ȩ3æ@ˆ†!V)8¤6^Ì „k,æ¶g™Á9ì3á4la60©è Úa<$é3´V4˜i0ÂT› +™ö“é:N“¦.‚tµÒu}®ŸùÚ|ÖdmÆtDBàÈháò“6xÂ40‘¼ð§ #À3M0™Fg&�Œ#cF†+×I´ª£; +ÆËA´›I´˜h‹vZ´E¶Ë›eƒâÚZMÓªµö¾˜¥ÿ{}¥¥¥õó~žj4Dé²"�Ñ»ÍqüÜ`gÙš4Â" öÊŽF¶°<ÎFƘLÑ\‹kH6“ ¨Já3ÍØT Ù¤ÚM¤é7gÞ“jáS Ó à´­'I¸&õ¸'ößõ½ñë÷KüR÷}HáUþ¾¾œ£D&òÔM ƒ]OÃÂL?4ÛˆU…PŽì$É'N‚m+e¢“ pÕÃM0�V•½$ü=PN•¥ii>ß·ŽÖ¿Mª{K¿ª¿¥õñ­»®ï×ÚÖ×_#š× Ù®¬¸]j�vZœjÞ­ú¶v•0u¥¥m'Õ&ÒuõµÛÿi½Û]uö¿K·Þ¿ÐÔi¿ò8]ý¿§D:u×ýcì4‡ÿHW­ °º¸´Ö¢ÛÂm+t›ô¯z^éñ[Iÿv»w¥#…@÷I-ýÚò8\Ž£^­ßÿü±ÈëK﬑þ¿üµvÿÿ^¿ÿÿ¯o××õõÿm¿}×½Tw[Þû_–<+i¾þ²EòIéðoÿþ>ÿÐÿýÿþÝì=ÿðG‚0þï¾ßïׯMúûjíiJŸë~Ž#ÿúþ¶÷þ—ÿÿï×ÿúþãðoaÿÿøIôí÷ô¿÷Q×úm¾¿øx¥êß°ûI$�ÿ×ÿÃõÿÿÿÿÿÿ· ð‚|7 ŸÿûÐ^_öÿÿ¯_Méƒÿÿm¿öÿÿð_ÿoöÒþÿÿÿÿÿ÷Kô½ð—ÿá/_ÿýÿÿý½~Ú·ÿþxGv—ç_ÿëÑWÿ¼ü6_ÿÿëßï_�éx{KÿÛÿõÿÿkÿÿÿîݯíÐ7ÿþëû°‚ÿð—ÿï¿¿{×ÿÿÿ»_Kõ_o_öý½Wþÿï_ÿÿÿ¥¥û ƒÿÿ†Ý]+ÑP×ÿîí.ÿ÷ü#$ýíÿ·ûuþß^¿¯�?_þÛ[ÿÔÍÿ_ÿÿ÷ÛÿüC„ß~õï=ÖÒÿÿuÿÛ£‰ÿ_öô¿ÿuÿÛ_†a¯Ó}ÿ¶½´ì"‡m—X#ÿìWÿ߯ÝE1_ „^ßí}ݦí'ÿÿnõo÷Kÿ¿Û'M·_¶gýÝ/ퟞ¯d÷ȃ‡ÚL3”ˆ;OOb˜¶;ãˆOéëÿýºýZ¯Ó IÞýëÏ/öéµ_ÿlÑ7«ÚÚJ» õ5Øa&ÏN–­—›KMËΕ°Èúi±M “VÓTØN�áŠ`žÓ´Ã2Pƒ% §i¦šõÿÿû{¯·[ÿ­[k÷G7¦Ìû[»ÿû +ÙîÂ0àÛ=zm¥uv›r.5b˜¦ÒM8„Å&œB ¤´Ó aS´û(á9¤ •A/“¢¹�okþÿß·Ý{«ÿÈb¶“gÓgûÞ–ô¡îà 6q-ȃµOM5b˜¨„ìRi¦AZJ;a-°ƒ ˆPEûh0ˆ|«a¦!#à`Ò(2±ƒ‚)ñ”‰7õýçïý[Ý/m*tÓÛ½�§¡´­¥µLPdNi°Ozj¶  +š $¿+jŒ0`É‹ÑÎÊæhqWÚ 4Ó‘´ôÙ;dQÊm$ÓmÒÚvè Ð`šº#¤YPÛ 0†P¤›î"½ØIm6¦šp¬+r²ZžÚ>üªI +zA„e¦""´µÄ)XU2±ŽL‘\qÕú��!Wô›J«¤ÚV:áSiº‹=±Mš¦ 0Æ Õ¡�ü°“(Œ†éM¦DvYl�gi ª~ :MòÕÈ ;ywÒ¤«„ ®ÿC‹É°,s¿´©\ÈVR  ž�¬ÈQxùØI>jµL$ã�ëáõþQ×úU*Hº)å%ÑÆu$BdÙDwýªÈ¢\”F¤GDœiYš8‰Ò"L‘äù–D²'†9POÂzÁ¢Va¦‚ üÉ "HR;h‰™ ÉȨ"\È<ŽóA�$#m™62|ÀÐdæÍYÜ@Â<Œñª<ž38ö–iz¶ƒÕ´Â<91á`4›“83�'ŽU$Ù$f<!0GÆì4h ÓÖ ž ‚ ½ȼli¦r“„ghXG€àœ*3Ñâ“m4Ë:o¤­,,ºDØIÒ´Ûq‚®ðµé�ÓÂj©ª &ªÚN‚p©Ð3g^“I6†®6.‰ðn½°ÅµÞŸøIZONëî•ï½¥û;Ó/‘iJФk!æÈ�*ÒM Îæ™ãL»JÕÕÕ+„ëêÒM¢v—ÛÚÔwÒÒ}/_õMÇPö¿n¾»“™Šo(GQ‘“æÈ‡e>l‰r3G0“ Ÿ9šaLéœ�8<ñ™¹ÍCpjQuJÒkÛ§JñÆ•¿Iÿ[qýúÞ»®½%Z·ø­ÝýÇþׄka'äèl Ú„ÐZ ¸%i8I†š=´I:tƒ{òg¤Ú#·¿»[´Þ*G wÖÓ×¥Óÿ[OÛøî¸úX¯ú->Zúþí§wIµtG�,$x�dsI½ÒÓ°ø­îí/p�GJßÝßîÝ[ñÿ[wÿöëÖº_ÿé¿û«K[¥ipµÜ:M.£Ý>šMÿºM×ÿßCÿ¯ÿÿÿýµýRÿÿÿ×öþ8ÿ¯¶—VÐéê¯ÿÿë»Þ¯þú°Ø}íÖÿïûõëûÿÿÿðG�á»Ýú‘ÂÂÚýÝÒ«×~·þôßÃÿõý†Ãÿý×ÿÿÁ¿Áä?Ûÿÿÿð‚ÿáÃþI'×Ûñ`ÒØuÿÿì7ÿÿÃa¿üŒ¾Òÿõü7ø@�±×îÿÿ¿õKü7áÃô‡úÿáÿ°ÿÿ_Øwÿÿ‡ßè'ÛAÿøÒïA{ÿýî¿ëÿöõÿÿ ÿ°ÿÿÿoÿúì8ý/‡¯ÿÿúíëí»ÿô«ùÄü6üÇÿÿ†ÿÃÿÿþî¿¿»oõêº5Zÿßõ__»ÿÛÛÿKÿÒá°oð‚¿üÿ ßÿ¿á¶Îªÿõìé¿M¯¯­¯ÿùïÿÚÿm¶ÿÛ3üÏÿïþë‡oí/ÿýïðÿÿÝ{¶¯_­~‘�Þ¿øo_ë¯×ÿÞCöÛ¿M6Â[ %¦Èº0•°Ù5´»oú_ÿ]¿ûõÿëîÚÚ_ém™ýuv½ÝìƒûIU²ýÿv’éÈ® Xkl…NBM;b�aˆI¬-íWm‚]ßÝWï×ΫoóZÛ_ýëÎ{jé'«il0Iµ´•á&¶Ú¶ÚH;ŠTÐi¦ÚI¦› ªvš¼0ƒ`‹ÁŠ; ¬`”‘QvwEÎy„ÿkûýmßÿ{×iÞÚþ‘Ì6�a¤© ì$ƒb:aªa†NÝÖÛPëM¤U¹ìîgfš<6*VQXÄrÞŒGô©6­š-}¾×lÏé³÷ßV—~a-ÒÛuaˆAŠEdQíÄ$V0a&q胥d¡Š9ã•ãýÕ×m…´qþ=› %i2(ëM‘Hi:["ÃcM´iÚYg¸È—q®›i6“ÃtÓd êÒMˆLH1 4ØMˆm ­UO ©á£Å‘Ñk¯¶*E ” ÁS£Ä£Åc« Q®R gK–¾D ÁFS‹MRÒKˆ�·‚¯Û úaˆZ+axLÚèØÆ˜�9’UùL�g`ã 7-s$WÉK +¹X¥­�(*ªü)/­nïÝ?k|~ï¿Ý¯4ò ’ÿüì_ÿµü“F¼«D~ZŠž¾ž¾s)Ì•D{6΄Sæ‘x–#c$3G£ƒ3˜fxAe—]rHˆù +ÊtGÉ@É8´DW03DQ¢&„N„E Ðâa´­^¯}öýßmoK´žƒK{µë·^ô0é6“¤ðV©[ëû¥j)÷´ºôïýv­÷]n(k{¡û]ºþÒÒ}õúTý×ëv´7#…ÿûÿô/WãòÇ"Ö·åŽq˱Ø}t›õÞBýÈám/ßú‡ÿ¿ÿâÚÃõñVþ„wX=�û¨¶’CúÉ' Ñf) ÿÿÿé‡ÿ_ÿ«×ëùc?ý ÿü?ÿÿÿV¯úÿ‚0ðßýÕÛ_ýµÿðßþÿÿ·A¿4ßÿÿƒýþ¿ðl‡ÿø7ÿÿÿêé?~ýúX~ÿ‚;ÿÿÿÃaÿý¿ÿÿýöý/Û¯ýá'ÿÛýÒÿûÿ¯ÿðßÕ{×ï­_¿ª ¿îÿn¿÷»ÿÿÿÞþ¾ï^úKœý¾úïþÿîé¿gUÿõÿí¹×ÿv¿fŠë^¶ýÒ­þÞßöTÿ{dêÒ»»öÌþ×ÿlôð—a…Ò‘ÒM³oºû·_íš.­lÿÙõh/ó ¥~meåÛšt“á·±M„“MŠL+Ý(bn´Û?g§aœ›/{`•¥"¸zjÃU`Á+Ù´ãí&6GP…i± †C¤Ói 0�•ax`¥X‚h4 –… +"óJmŠM4تb¢„Ø«à´í6!C Sh'­§•‚ ’´ÓEðà +�‹”Üô ;†j˜`„0š´¾A‘Ñ£'E'ƒ2is!F Ä7 +Ö#Õ%üA*Ú�Ë P²½y�®p:?˜ƒ6– +ˆàRl�GcŒƒ!­­ˆ4{†ƒ$pÒ~#µÕ¯l•KúaÖQ}Sj“×~—ý¿¡«mR´–“®:±/¯ÿ÷‘åd¾he¡°¡÷&5*ÙDNˆèˆ “³6hE$O�Å#³€å˜* 4hZ@fvkÄÃΪVh`ˆš—B‰Ì5“’¦™Ö +8)¦ÃKEØÁÂ/6¨ƒ¸AÙh-Œ–Ú8íT슞þ¨¼"öIêƒIE÷PŽôw¥¤ë~M2ô ¦Â;â’×&¿Iÿ…I¥qФ�*ÑOéRPI~‚ô»V/Ò¿ê5KGt” ŽúwHøV–£éa/uÒÒÒKl�*C /è_k;*Gb?¥«¥Z]5Â]èÚÒÒÒÒý$°’M�i%úùSÇMz¤µ¥¨®’]%Š¥ŠI%éz®©mâ–¥ i¾¿èiqZ¡I/¡¢þ—ª¯¤¾¶©%Iÿéä<ŽÈ«32B#Ô¬$\„¡1Ì¡/¥¯#*ZZªë]$•%T•=$©~R">¤°Ž„¥:#†h):65#Äk04B|eƒ?„aÏÈØd0ž¹ý}UBKJº‘ÔB¤«Õ/UÒVÕ,$YYΦC ÂæÌè2­fbšŒù�?›Ï3<»ÈCa¢9à—FÉÓ™�£t#]4üŒ•&=Új‰[öÒmE&#¶ËBo­:ý-©.ëUÒ Z×W –E’ódk0A„»]ž†¶­È�0��ª£[3‚ Â66+ 7 L7½&ÒwtE†“¥h3‡B¨3ÍÅ[Pé6=aÕ&á;¥t©zªT” —õZ_Á•*T´ý! 0™;Tl ›„ÚN“ÉžŠÊM„4hŽè÷H6ÓIzMË.Ò´·à�--'u«Ò½ëmÞ›öúú¯IHT%I*¥ÛI-kéuJI‘à4Èæ“i6º}ÞÛJäâ­Ó º¾’úw„×i>ûí{ï«n-}>ëoëú¦ë]K_­PëJLoKª»ÒUˆt�&Òkµ¯ñUªÕ¶×õ½Å kIëwݯ®·Çúÿ§Ò®•R¥'Uú]w†‚ÒJ�ÕP"�j>ÛŽÚŠ— º‘ºO¯õêÞè‚F¿ÿÿõõõoþëU‘ƽ%ÑŸ¤µZJŽôúJmzY´C^C[[IuÃÿ‚©c‘ŸôÛt?_˯ÿ¯ÿÿßÿÿ×ý-6©zô¨ßú›é*7â9BÒÒüÚU×èÚ ×·î¨ºÁ°ÿHzÿ_ÿ×ÿÿÿÿÿÿÿþ’›XæÕJ‘!dþ’¥ÒT–½^ºZI$’ºI%ijVÌÿÖý‡ÿ_×éÿÿüžÿÿÿòuÿÿôª‚IªéQ´>––’KéZZVÚI%¥¥¥¥¥ê�D.t¿úÃmÿÿþÚ„qÿÿÿþÿÿÿõÿÿ¥¤Ý%¥¤fŒiiiuJ–’¥K+ AÅXJ*ÒŠSiþØ7ÿÿÿ@�ÿÿÿè/ÿþ¿Òýëû®ЇšA ƒ +éF…zÅEC†Ã#šiEUD(ZP‚.ÓÿÞ ÿ}ÿî©}ÿßÿz_ÿî¿ê¿kþµI(:«¢ +“J©¨PؤAqÂaT&¸h* Ó þ¼8{ÿÿn¡¯õöÿûëÿÿuþ¿½~ÝBš‡ +š Ó ªÂ…¢ 6"‡?*„ÕB*4Ž˜BCûkÛ¿ï·þºûþ÷ÚÿÿÿïÿÿÚþë†ÁÖ-UPhhg›�6YË*þÜÔŸþïýéÿ´¾ßÿmïþÒ¿ðE>÷®ì½u;¹²¸ÔzïMÚæ?ööÿmß]³õ«ß„PÿÌi¯ºJš}‹ ‘zA&±A°‚¤Iúí+lÏnº9gÖÙõÿOí´­Xi2(ù;MXá‹a4Ø®Ó °Ò‡j›ì$ì$�°ƒPø{JÛVÏL0ºV•¶_Ó jÆšÛ *’½¶‚  Ø„.ØT�†Jí?Ñ še1ެ‡�xˆˆm"#I×ÂA0ÚAŠb +Wðí6�l$ÐjÄ!i �ÉF¹Wƒ4JÑ7€ß}âÄ Á˜ Èé V9ê@‘ß²Ð7ûæ—Ë6{ßûÓh-m¤Ú]Xi0Í ‚Ò†(®SEc„x§8ÿü€…ªZúGu>Y‰h·ar!�‰Gb>;.ºþÚ–ƒ=SßüdO7cɾû°Š¢çA S*¯¯;0¼o&õ¢?Cý¬uõÊé:eò Ï 2�‘¸ê�,28yü¿¿C“Ÿ”¤¤IÑ.ˆ2²,2@„„pÏNGCŒDŒØÁ,I†QÐi„Ê%?žÌ÷=¦~I°˜Aýò¹š+u+–¢>j<‹3 ×6D1Hت\e@B@ŠGeD,Ô+È£“™¬4SÂ5†vÓ ¦NÂi„hXI´˜hŽÚ=°¨ðIµ}Õ&Ó<é~v•ª“m¦´L"Ÿ.̵Ì$ÃlžffÐNeÛ‘:ƒFÀÂ6Éäna�' ?Òmm&ÐA´ÁœiœÆ“ ö“¤Ü+è�ûÅEUºn8ê©™‰xבâHF¼˜FÈá&YÍ øqéš#£!<¬5gÆgÞG3ùéU ÚOzN‚nLàÎ4›H7/ØT�'e˜N*JëIêÒ…ÓMïºN“tï·Š§Û¥oý2+D<景$#†¤R:f¸ˆE$OÁ”hPÁšg³LÁœ‚f‹5ABi¥¤Èù6–�ÉŽ–éÕ!ÒmG4­-Ü ›JÚ„ÚWVíéZO¨â’ZºM+m;½i[øÿïn«vûÿÍ‘ BŸ0Gˆ‡›Šz Õ™Áj2{(̉å`aBr&§óô÷žl3NÊy†�mÃA6•¡¢;jêˆíŸi6“IXIÒwÕÂ�.“¥jûíwÿ«{o®=¾¤s^ÔWÝÕ½Õ[ß¡‡[ÿ Ñ±ªhã°“fŸªy„{i†PÓ¹3ôÏšz¾û¬4�&Ð&Òumz ÔVºZÒ߯¤é‹¥ÛŠ—K_¤(~êG +¾ú‘¯n—OTßÿ×õ_ÿðØ}àÎ4iž1 ¤ÃÞ•6ijÚ´Ò¾íÅEô´µ½ÕצšÿïýtºúïIU¨�_¯‚§ÿ‘Ípô’×ÿÿýýý†ß½~k¯î¢ë^Òok_o{ÿñVß¡Óqw·iúéõññíõ©¢Å¾�÷·Ðûø¿ÿÿÿÿëðÛÿþ©´î•Þîï߸ð¶¿ïÕV½Õ$¿‡þ?¨¯êÃÒ®¿ëÿ]}}‡¥Î?ÿÿÿÿÿðl ÿÿñ¿íÞï^ëøÿ¼8�Ö?Ãÿíjµö—ÿÿÿïÿƒzZFgÿÿÿÿÿøvû_ôè·$3ëÃÿöé¿ÿØ6ÒUT¿aÿ¯ÿêÃÿÿÿÿÿ¿ ÿ¿ÿÿÝÿëîÿÿü­‡ýþ¿¯ûmÿÿÿá¿òqKÿpoKÿûÿÿÿßJÒ»ºÿþ½úÿ®÷Þ·ÿÿì?ÿÿÿöÃÿÿÁ¿ô{º ¼Ï|‘¸}/»ÿ¿íºë{ßIýõÿ÷þÝ¿léæ?µÿÿþÿÿýÿÁ°ÿÿýþÿKlo´½-þÿÿûß]{|¤O­ïo_ÿi{w_éy§ým×ÿÿðëÿòBÿÃa¿¿þÿßýt¾—×}/nÿ¶ÿ·®¶ï_£4ÚVÛzÿ«¯¶m/ô¶Jé´“t­ÿÞßÿÓuëÿ»ûÛkï¿úé6ß®ªt^“~þ­÷íš+]|Óon´–Ïç¥Û?Ú_ë· MƒVÒONÒMŠm+I[I4ÿßý?ÿ®¾¿þÿo×ßùÏÿõï_öTþf›Û3Wmí°Ï¯Û +ð“…°ÂL3“eý$ÕCöÅÐI¦ƒNí°’j„Ú Sð‚•l0LŽ„t+ +9$AÔþûÿ¿úÿœÚ1þݺûmÿ¥ÿ« üÛ¾ïU­%³Ùæ› + Ž$[ Ãd:BQ+Uù’¿Ì„ìäj"ÓΠβafhŽŒHŸ 0�a“É„k#ã;H[`äþ'•5d¹:L4>W¢üÈ-„ÎÍ8¡ƒ +²0ȤɎc�”3–sÁ9žÁáØz™FzBÊ)..‡óÎ j6ËEÙh6†“ Èæ‚a»©óTæ“J*Ú$ë¯éš²,ò’&†tE8¤HBB6ÈÌÙ"`ÎÉ0ƒ»ff|³òi£c@�šMª„›Ñ�¤ÚO-6“h‹«ÂJôµ}/[D¡-$Ò·û}6¾“ÐôýN¹O‘óDFˆñ|¡"x&@”Ï0`�g…03æ{3‚`‘¸ÂùØÓM4P‚m Ãpì´B£Ü ˜i:M¥„Ò|]+Z{mn Õõ½']ýÒm¡IÚ¿v÷ëû~jEO Ôdb)#T¦ˆÞyG£dFãDnó„}’莔Óa„ƒ/ ̺ØMÃM5A:ZzMÁ4Ò¦xÒcIÒ ¡ª*Ú¤ØD¢“¿­·ø¥¤ðšKÛï×Ûí%ÿ¯¯ÿßo÷}þNüÓ�”l0�„k5 +ÆDvi¦<¤L “Äõ…¿ôÝXi6ú ÛEe&ѶLé´�t�ú]Ö±«D¡bTšv»÷ÚÕ?_qQô;éõiݺ×\|}[×ÿëø}ýBaÚM¤Ézm][AÚPäΜ&p•&ÒýÚKI´�Ý&iZ ÚQKÝ}ëÛ§M[hwu›ý÷C´:ßõ¿ñÛv¨õÿ×ÿ¿ïýì?ú%�ºêé6®–“JÛ]PmR}ýé'ÛIþ¿Úû_Ûuß^×Ú¾ŸÿþXäjÖ9}/–œé~õúëþÝÿëÓÿM6–•/�᤽½ÝÖ’ÿý'ÇݧCßéÚºzþé·Ý×Wõÿt?ÿÿ÷õÿÿÒÿÿöÒÿÿ×¼„u¸¦¾–ÛÐ×úI}¯¿ËOøkûÿ°ÿ_ÿý¿ûÿßù<ù È÷ûuÿÿ»¤ÿöŸ´Xâ +Çèv×õÛ_^¿ô¿`ÿ]5ýºoÿóP¿ûÿ·`Œ?ÿ! ÿûÿ/@¿÷_ÿñ Ýÿñ‡õõþ¿Òû¯¯ÿ·þÜ¡õþ¬?÷ÿÿÿ°oÿíÿþŠw}è/KïÒÿõý_ÿÿ¥L4µõß×Ûÿÿÿý‡®j½&Òý´7ÿö?ÿþÒÿðÿßêþúú_Ö»uý~•:ÿõn•‡þÝ¿ëÿÿÿàÿ„ ßÿØ ÿÿÿÿûë÷öÿýi6ýê¿î¿ºßÿ毺ÿäìŽÝpmÿ×üˆOýÿÿøoô»æpOuëûkÿ÷ڮ߶u_íë¥w¿ÿí×!Qëô¿d4qºKÿ@¶ÐVŒþ÷¯ð¿°wëýþ÷ëÇúBúýwõûd¦ÿÿêý¾½¶Ìý´ôîít•�~¶“f/I4Õ»Km+ÿ„¼]Ö÷áëÚ_Óï¿þÿ»þ®ÿ©©o^»{¯ÿÙŸÕŸµØg×¶gÚ^­ží©[ $œŠ>Ew"Xm¦ÃI6Ðm¤Ä/ ]§lN ÿú +Ý/¿ÿ×Þû«ÿïóO¿_ÿ³jó‰µ[­½´›[/~ØJöÂR+†› *{ì�lU…L Óba³ ØU¦ 0•£ûžáˆL(X „Eðظeÿ®¹©¾ým¯ûî“wþßޑ;ïöAñÒëÒM†nM´„Å'a0Å6�b Ó Ri°¡ ªö¡„ +xaôTÊ G\;(P… qÅ&ÅÇÿªm¯kÝú[ý­«gûO½µòóul‹¶:i§zXl �vMŠA°Â°TÂU¶ ‘ê&#52" žÅLÞÓë_ÿÙö}u¾ÃÌ}¤›ÚdX†ÐLl„j›!}¦Ä+JßMݪNûl\1Sâ9‘GiH1M‹eõצ¼6 ‘GV”6Ód(1Milðûi0˜-tx†´ÈÎ�ÍqØPÄ8ˆÐˆˆ÷_U i¦ÓìSh*Ó &�hhQVh>èD0fE8Žÿém¤4|=•r„ŠÆ"Žvd—°ô8믶— §uÎ¸Ž’Õ|0E'Tº×Ò^ÁŒB }}$ÝVW±ô–¨+MŽÒ ‚BiˆÛ¥ñžÝ†4ƒ¡Ò+ÄGü€€Ô¦�¶–¸";(2ž%Ñ ‚aJ .²ÖÈR +U%ã±’²‡½T”É£GUÚï,¤±7[GýÓ»¿»ïÌ‘Ò;gjfJ‘W©I.îî£ûˆøõ +¹öšI{¿¿‘?úûÿëçt^ëþ¾Ar;»¾û½ÌÖºx�þ™Õâ)ˆë“�'Èè�dD^!Ù ˜Ë™³>f˜AÿÉ*š%n¹*GüÝ”3P¹:))â1ˆìÞiæˆI²ñW ‘Èú°<$/„„ÃÑá­î˜G·ÉRýtÓ·+'” Öd1¢&ÈœB0h„àF·‚„~dðN( º0ìžt ´E†¯ &ú|ÍS¤ø¶dséÜ×�–z×®¥:%(Š‘.ˆƒ>d„pÍ2}Hb_šf ÙŸ3L'„l Î0�„wÂhÙI¿Ðõw¯÷߯¿ÿ_ÿþ¿ÿÿ_Øþ«ØGÿÿ~ á.ÿÿþÖ·øÿ�t‹Œ +òÜ”ãë¿þ’_ý+­oþÿù8¿ßë·_·ÿäì½ËwûÓ¥ÿÿûáÿÿÿÔaÿÿ¿�ã_þ¿¥¯ÿÿÿÿÿÿÿî—àÿþ�ëÿøG‡x~¿ÿÿý0ÿ_×KÝýÿÿÿÿÿÿÿÃ_ÿûa/Ã}¥Þúíñ_÷×Ûþ½ÿÿÿدûÿÿÚ_¥ÿ÷äž÷ÿÿþ?ÿ~£û¶¾º«í½qMúé7yíò„ªß÷ÿÿ þhËß¾—ÿÿ· õÿÿÒýÿïÿÿÐ_¿ýkÞÝû_û}i;~ºêßýÿÿ þ‚ÿ3÷ÿÿqþ­¿ýÕ{ýÿÿoÖüòÞ½o·KßûlÏ´•m³ÖÝ­dW ³’é±éÿðÿ¥þ¼1õïïÒý'ÿû¯î¿ëöþÿÛù§ú9¶—×Û{m¥oK§"peÏJÖØ¥´°†Âv)SM’ºþßúÿKïíýý/Ò3Wûê­ºÿ«kmþŸö{öËÿi]¤¶’pÛd>vÒN�4Óa1 +ÈèÓM…È´SÚhA„CE +P4"?÷×ÿWo¦ïï×ý[oÿ´¯nêÿK¾ïd õ[b¬&Ûšv•†ÒAÊv‚WpÕà  +É¢Ed£ zBʹo¨oÿgUÿ­ÿþ–h›3×oÙžô»m>öËî•°ØfàÚ SíÁìŽd/ ‚í0˜a¹Ý´�tU¶ˆè\1×–ê�ˆ÷]»¯îÿ»vÏI†°ºmÚm§"óUd=éªqA´�ئÒMS²>“|& È4G`¹9”¬GÝÝ·¤ÞœŠ;‡§mÓ4˜¦!&¬-¦Â\Ž a;\§{0˜DµÈ„# „M‰ïö ƒÕ�žÒ†�ÂvÓOq "7ˆ`ƒ<2„H9ÙTËrìEZ¯] Úbƒˆ†A„eù•§Uå“/é/×i$Ÿ­°‚ö–˜ +ÚIƒl ¬b#ÿÊf¬Èeô".ÂbZÄez㲃+(’Á�«ËQS +v¶—AÚµ»Ë9fd©iízBûËrñ]VR7fvþûT®äË)K�ŒŠ¸—Éka©ØÇ‚ÎïëñìgêŸPªJw;Q¿û éñUÿëék[øaã�Óÿ\•¢þmš‰(E¨½N˜#.ÍEpúŽ.?~¯ä8“ÈñdA¢çAäTd¨B|Üc?L=ÖD\•™¦Ÿ¦NiïúGd,’þþVuÉiˆ��Æf)DC: +t +KŒ¨ž75ˆ!lÓÐŒö(¢‚.ÃG¶'ìV“á(&ÐÙd+Ce¡Ÿkiž?þºûgbùdº9�("B60A¢¦¬0J #ÛF¶g„k Ær4l #t#ÛF°Òmt{… 1I£ÛY? ›KD[l²/TöÚ°Ñ'ZV‰:ý-'þºêLÑ_dÆl�HÕœ AU@Â4„l4Úaï¦KÔé:AÒuIŠDXi6‚Òtt›A6“jëM&Ú´é:¼ûéŠZNÐk^‡§÷ÿúf¦FÙ)È1š‰HÄ`ÌÑÍžx&0®?OF€ýÍ3êÐa#ý„Òs6¡4™-•ÒmÛV™hgØT�'Z¡U¨N•«®Û]|uëÿi/ëwïHá_ú÷’„j�YRsÍŸ"Ь(a¦x%Ä„fD «/SÙ°¦ 2ˆ¹‚44f"FÓšœ™D¡<$Þšž‚¶ÓI?ØJŸ4¬)óKTæ“ZV‚z¯ôÇñO§¦ý-.…+^.Þ�Ýý!­¯Û[ô�þFãü§FÙò#À�a!P�á<Ÿ9¦Fš¦ž¹¦šNÁ$Úv“¤Ér´�m¤éël³Ü*Vô—ÿ{k{ïTÚÿµ«ôþ—{®Ö¤p¿Z«Ö‹_ÿú�ÿÓûúÿè4ѹ¤é:MÉ@xI†‰6Ѱ�Žc¦ÓuzVÓ#´ºj­. +Òzt¯ßï÷TÝÕ_K߯M]ûýí®áÿüãÕZøÃÿÿ×ýµ‡ÿëÿ¿ ¤ÚV–¼oK“N0¢¿´šÅÒ¸O뮾ÿ�øº­¥_è}Çºï¿øÿÿ°cÃaÿé j¿^Ãíÿÿè0ÿÿÿ'øit´´½þÿÇiô›qý·ºuë}v•wýñÿ–9î‹rGõÿú ú×á«ëÿÿý‡õÿàŽ?ÿÃÿÿ£GíµïýêºM»_¯Þ—�üÿ_‹î�éãøÿÿþ¿í¨m½µÿÁÿƒ{iøIÿÛPßÿßú þ†–¸ûú8Ï×ý6ðý·þ‡ÿÒëÛ×úßÿ¿ëýºÿÁíƒ{uÿ„ÿ~m/ÿAý?ÿ¿úëùc–#_Þ�êÿÿì¾¶ª»¯ÿúþ¿ÿÿ¶—û¥þ, í„þ—û~�øKÿa‡û¯ÿÒÿÐëûÿÿÿíþ¡=ë _ÿûѯÿúöÒïØ…þ-Ãô‚û½/ºýøCõ÷ÿÿî¿ÿÿ__ÿÿÿÛÿž×hÿÿýáÿýÿÃôjÿº[¾�ûúîë}¾ÿmWþˆ?û¯oþ×þK²;óFGÿÿÿƒéa´ ¿þÿñKô½oÿôm’ßÒÿüæþ¿múÝÓ{e__ÿ·ÿïÒî–ÛgÖÙ}oaÃ×Úú ÿÿÿü7½ixE"¿ßÿÛ /ûÿÿõï×üçªôoÿÛ½vÝ_lý¥²þîìú°Šûeõí-6ÒNEñÜRk�4þ—z ë½ÿþë~×KKt¿o½ÿô¾›öÿý¿�çÿÕ«\†?¶znì‡l3“p˜a=°•ûzkjÛÓN):ºNÛI6 6´Újxr­ýw×ýû_ÿ_ÿð�Þ·ßÿÛëé7¤ßß!�–mm�Dz÷}¥\í+I6ÓØ¦6!6Å6“;›$í5²>Ø[òƒCƒ%3ÙHa´­ ý¯ëëß×þÝdg[uë¶¿ºíþÝ'yûI³Ö•œZ·úm¦Èi·“ ¦ÚMs4H‰„|X3ã[ #‘²~çÊaÚŸa&ÓP­¤áS<ÒkIµ@˜zë +ýzkëý­_ßí뎆­}lwEŽ{†ÿèºþßÈÌäQ Ð=2ˆæUøVàÒÁ+TÒÂrtM(m“&LîVPM®u´ÛMµµ±éµ¯ý¦ÒéÖúx·wÔŽýû×ýÑc‘¤¯ZBÃüV ‡õúþÚÂM¦í°Y›A0ÒÒaÁ �&Ðgšº´î“m5‹kv;¥Óµ­´I?¿ú§»õ­Çú_ÿÈÏÿÿa¨ÿøÖëð׬0Ø{¯ÿýRm;jõÕÒm¥×¦ñ÷Ioý}!­ýõÆ»}ëÒ§¯ÑnK`Ÿ–+ÿÒÿûƒ¯ÿÿðÃ_¡í·ÝÿþéýµM/}}_ÿéþŸ#ëj>金DVÿãÿþ?×ÿÿ¯õ†ÿÿÿðØ#?Á. ƒ{ ¿ÿli;ýé_ZK]½¶’ßúãÿñøßÿû×ÿÿÿ·_øoÿÿÿ „ ì%¸odaû¿«÷¿é +ÿ¯�Áþ?ÿC’ÿú°ÿëÿû_ûÿ÷Kÿ ÿÿ}‡Kô°ï£'ûþõÿþµëØ~Ý?þÿÿpßí¯ÿ“­Ð_ÿÿþÈÈÿ‡¿þ÷W÷_õßKßõûÿÿÿÿ°ÿÿý¼—dwÿäUa¿Ýÿêí�ÿÿ÷ì¡×÷»ÿýÝ{úö¹ÍÌ~¿mýÿÿÿÿ õÿþ èÿá,?í„ ÿÂ]Úÿïà�ÿ_ûm¾ßg__oõÒÙ§lϵ´Ÿÿÿÿýø?·kÿ½„¿ÿ\?á!ïÿÒ¿ÿÿ¿_üÓßÿm»JÓlÍuw·a;ºn•†šl4˜»J¿ÿ÷ÿÿ¿ßÿØw÷þÿÿKÿÕU¿Ûïý¿dþ¡êgz¶rläé0ö -¥m Ù +¡‹v•¤�öÈDÂ”ì ¾¿ýû¯ïîõþý¥ÿ·®DþßÿÃ0¬Ñk¶gú¶z^eÿ¶í&Î$ïTíŠbƒ çAˆL4¾Âi ÈèG£5š+ +<B)8Íÿÿ¾ýûÿû_û ^Þ¿ÿ¯þÈ?Û?ÿá=�~`“"å6s¶BTÂlB°ƒn)4pàÐA‘=„ô„AˆAÉ|0fB›�ª­×þÛï]íùÏïzïÛ3ú»×]†{S7î½oa‚¦šk XvÅRvÄ$Ø.Ó¶‚|þÚ(ÑWE[�ÄR²Mû~ë÷íßi[{gÿëÝ´“íXam ÙÊEw§i±IòWm$ÓM°›“Mm¦¬0ƒ†‰ð`Œ…P9eú–Ú_ý¶›iH‚EØjŸi+"¢ÚI°j›M«¦šØa[´Õ�$HHô“ aJª""Žˆˆˆ«éU¸Zpi¨d(A‡I„Á�2$Úm‘Õ\* ¥Ò<9á†�‚G)ˆ‡œDE]jõ¶4ÚNØ É'(b Â:¡bˆ¸„®h•×Òm J‚ yg¾¯ƒ.‚ –‚UÖ–‘eÔ†¤Ú¤6–“ B?I´ƒªÅB5jƒ ÍQŽ£þ@a¦Õ0²Útd0«-� š�dù†ñØF·Ÿ‘ûŸ’m'd±®xi0ÐÒm–†}¤Ú'Á‹tÚ»ººV¯ºOMôþ×ë·_Oý5¯8“)dFDž"†³3G‘ÂIƉ3Æf¯Ê1†Æl ÏÐé«mSIäζZ+²ÏA=;OXº\œR·Ûúõ¼}¡úÿW÷ßR8Vµÿ¾só ávkFÈñ¬Žf·‚"ù/.šg‘¢=k ¢A�àšhØÉÞ²žL&kÜ-aX~m„í ›z Z Žj/O®/®£¿¶·°¿­owVïô5ýHákßßø/ÿØrN:Dù²ÂtG=&k %ÓM2tg©Â=·£Ãé–Bµt ]Ù4˜k¥aS<÷Q¤¿«wu·t­'½÷Hm·J¸èTŽøßë¿y5þ{ßÿúÿáÈ͆rµ àÛäЃin™Â<ÖÒi|[i­(x«kP¡i>ë}6˜é-ÚjÛzKé*´?^÷ë}þˆ!üŒkè·$7ýáþ‹¯úCÿÿ¯·_†%¤éž<7W´“a}'mmu}¿uÓI¼5»­â»¿ë¯¯¶º·ûÃÇøPÛÒùc)øþ¶Ãÿ_ÿÿÿ÷_Ã}ÿ}Öým?¿¯õí¶:ÿ¸µôÛZôöô£ôßÒC¤�ì¿Õ‡§ÿÿÿûÿÿÿÿÿnáºB—O¶«ôé÷´ú×^ùõëjþÿøþÁéU?·®ÿ·¯°ÿa·¥ÿÿÿàßÿÿÿÿßȤ|=kõõ²¿ô‡Çöÿ­ÿWÒþ¿ÿuÚûaþ þÑPÿÿÿþƒÿÿßÿþÿ0á~úöÒöÿþõÛÒÒ‡ÿÿÿ†úÿÛ§¯×‡ —á¿Á½t¿ÿÿý¿í¿ßÿÿ¿ ýWÿúwÿÿ_ÇÃëÿö¡½/ÿÛ­ÿ è'÷ûv÷ÿïûýÕÿûÿÿÿÿ=ÿÿÿ߯÷Iý³ Ãïÿû†ô¿öÇû¥øw‡ïÿîŸûoöÿïý³Eò7ýÿÿoÿÛAþ>ÿÿïðÿu°ÆØw¿¯ÿnÿ·ßíþêsKöÍí®h¿VõöÂÞÞ_M;K‘ ÿÿ¿×þÐ —ÓØ{¯÷_ýô¿Õ‡ûçj¿kùÏöΟ¿æ‹ný³?öêêÓÛ +ÚØ"�°ÁSVË÷ã»M6)4Ûb–ÛK…ÿïõßþèWúÝÿ׺ßÿVýýÛïzõþ¾ú95û =³×í„“Óm¬ˆ¡„Ø„Á„Pö B´á¦ãK EðÁ#Å›aÑ>­¥ÿ_½U×î’®¿{¯ÿ÷ù×ú3_·O¶g´ÙŸ™Ö“vƒl½ßeí³•¥{IìBA±LM6!i¦ØIˆL+°Â;Pƒ‡’4DÑ•î"#}Vþ×û_éöΟuþÚ[~½i+ ôqÚÚTí„¶$�ß`ñ 6ÂQ 0ÅZ[Nša¤ØU_•l4E=¹UŠ "©ˆ‹•ÉgÚÿ×ÛÒZ_· ýô»³ë§I~Ý$ÛþÒMUˆ_a´ºb©ˆI슄ÓMq ©VÁ„ S�º&Äï·¯ûkM×jÛØv“R/Òm+OVÒ¶ �¦šw§… 4PŰ„0Ž»†�Lu«à 4ô æ¬2:‚Ý-m�”wÚ h4Á ˆé†ONÃޏ6EåÉЬ•Àñý+]7ü"øI�…ö$�e(w´�öšÄ Ãb7,ëm(aÓHîÑVÉkG —Ò¡¥Ødt•Ô4WU¤ÃÇa/ªÆØô¥®Z£Ö;PJÃA,2"¢‹Qÿ Å)·ae°ŽÞ2JŒ‡ÉE¼µÖØ(UOùgO•õŠæR¯û¼´,´ -»´õ_P�²óôþwZ"h”¡ù]e™ÉU¤ÿYN¼™¢¤» +Ÿ”ˆŒS²ñÙ\¤U§ºŽãjºëŸD�y‚ 3Qÿ̂ѽ}S%¦kòB#²#ä TD¡#‘ñ\Î\ÉŽmf'‹³„fÂ.ÜCØÂ6~ ýÚi¯M}<“DtB:=H—I‘tˆDäS†ª6,3q«45П‚+žz&Ñû£ÃI¾�MË«h&ÒmmúÊúÿ§™k²%Ì�3AH�‘„C�`’!2leÍY¬Ý>€Ð3Lög§„l ˜Ah ÚBú;- Ùh«Éž“¤ö.–ô•ж¶—qÔÊ™¬‚›H‰Ó†C ˆæNŒF°Â3ƒÖÂ5Ìäk ¼rM@ƒøM!m'´ha&ÓVZ¤òb¤ÚZWúÖ—®-*N£¶“¿ÞêšÛ¼‰Zgu"2""+¦kÊvf�‘Á‘hÕ #XqøMA +©6“ÓÐuIŠDXh&ÒvYÙö“tø¶“jé¼ZK¦÷[Q]wT÷W¿þ”Žn8ëùXÉò1ÔJHG2£5³Eg ÒF{ ðgö<˜BÓ)ãû¬§i7&œ™Èí ›[A‘ÍÚN®ºJÔ®•Öߨÿxê©é +ÚZ÷|/ý ÓŽÚÇ臡‡#?‘ˆ�)*D›:"7™Ž!ò.�4 e†šªŸ4�[]S—ýÿëÿ¿ßúÚ_¾ŸM¿~Ù þëíÝ[oÞÙžÞrº»»úÌ-†yi*Ȯȣ¤Òb˜¤Ó‡ÿý´/àÿ²27þ–ãÿáû_þÛ÷¯ýý×÷ÝTçF4»üÑ7ú·×·]¶ë6›>­&í°–•ºÈ¶Â)Ü‹ÛI�0Çk 6Ó ‹ÄtaÃúÿâ¿ú5wÿ\ �ÿ÷}ßûÿóËû«¿»[†z´îºÙý¶·v_¾ÎV–�¤œ‹â­YC ¤È�b0“ÃPé§a[aÒl&!ñ?A¢4Ä„"#}ÿôµÒïýUoÿ4òÚÿ÷~é÷^ëú°Ïr(áí…‘zÚöš±LlRi†*ÒM0ÚI´L0APh6 4 Bpb(DDC–éúÿIsRÿ]¿ÿM¿ûë¦ÿ¿m¿m[ÒM6ÐL‹©ݱPM˜NÄ&E›l'` •„Ò¶êƒi&©§´Óc­ÏùZ„DóLCA„Žyf-ºJÈÈDeaVVEììÆ;-ߤ§d›¤é>£Ý]i´«ZZL‡fþ—Wƒµ´b6ÐM‹vEpƒ  ˆŒ�iJm9�šÄ! rÛ>ÏS<#ÃE^DvL:ûI¥©k%ÆBZO¤?ŠŒ³LšÃIõéjY ÿÔ_ÇY6¦@°´õY’DB/ùÙ¦)H'åwKª®¹©NÈ×V¿_U;çL¾Jâ:YÈœÊw¿vŸ×ÎÓ³6uÈèº5´DÔ‰…SŸ�dµ"P ž˜eƒHs;Ѹô;þûþwVvi�Q¢kάÄy™™¦ƒA„†Í0�÷#áJÝ@ŸI´, Ÿ—Bè¬!ÿz*™224�FH!‘Д—†Ž e9gã>`ÏáÍÄ&òÓ›É4á ›½BaÚM¦�b �4wAOö“Ó¤Ü Ú ãøÒ>jè+Çÿé¤äǫ3Y„È1’ ¡ FÉ:³H Â>3EÌð��„|a„Ò‚mݺ#¶�mÚ áÂK CJÚ¿¥­Õûî¶œ§I/×ÎÔŒŒ”§×( f§›ŒgŒ#[4Âr£åÚ=°¡4�6ÕÚNM›IÒpˆ·Aii0Ò·áC×IßuñVÒi&éßo#…ë¯ä)ÑD ÕMyÔSÑ>CFÈàÂ4O äO+�aG¶i.ÇIÐ3fË›&Òtæ–‚´x…h-^)pM«î“«[í6·^ž–·ZŠïím}Ö×&3º¬êˆÒR™Ì³žÐxtG0E|¨Y:´lÁ²s 4Ò ª(w«®“i8CÚi+A6뫯V®¶Ö›úéûéi}¤>׿wíÒKµº¦ÿÛÒ2.f½W62†‘£:Æy†i †”ϲ‡"'?P&ÒmBj ‚M¦áp¬4œ;…µöîÒz»¦Ç"¦šl‹LˆöE{p˜àÁôÕ6B{»´°Ã¡ÂP§¿sµ$Y¢·o[¦Ò\Úµt›{JEvšmþÚ 6Ò T}ÛÓM4Ñ$ 8ŸFж #¤ŠÈh9iqì�Á—»t›A&Èóa´˜>Ò…j›Pź[Á4 óIrC&ËIý1I§ �+jÂ47¨¤Dk$b Ñe×TäZ)0c,Òž“ˆŠK+*B4‡ê?ü¦²³%D +–ßAB�‹D ü*¯÷Çë©jÄÚdÜ–;‹òX±çaçið¡J­“eEéùÝHÖ‰z)¿i?ó»D)HÔy +3Ä&Z!™ŽTå÷|W%H�ç$Ì,Ù�D «-:#ä|„Ð0�ä3‚i„œ L��]_ÝÚ,çGd">FŒèD�¢¦È‘˜`„žQD|�áC FÆšg%Nfö +Þš#¶�m+V’nû¿–QAäU243XÉ‚"ùÖH€¶ �0F°Â5†­øM ¨ÜÙ9†�ÈøŽ™óÅÚA´Ö°ª|ázP˜v“ÕW§Ü©çk–ðŽÐÈlŒ3µ–Ga!áL&Q0�a„k "ñ„|£eBj.�Ó¤ÚNËDÍ„4›}Z‚wŵº´šÒuÿ§õuY4ò%þ¾v È“&CNGˆ¢02DË9XJd¼˜ƒ@0Fpf˜Ms9&P˜DGhZ6“h+Pé6ƒ8iXA‘ÚN‚ºäî•ïU·úª¶Ðë»õî××èu×É*"莓"ƒÍ‘NdBÊttÌdš9‚8å@a„]ƒØ<˜OM,&è ›IÑÚN&Ñ9?h“¥´ž›ÇmxN˜®Ÿ¾;~¯_¼kïþãþø¯Ër€¼òU!äi.*‘™NÙg4¹CJŽ‚¸=3H&QAäü0“%æ¢mEÒmé6ˆí£ã3†“h3†á¤�'Dý¨¤“m>ÚM$ÚM*öÓu¸êG ºÿßþ‹Œ 6ÿÿÿÿÐÈhðÍçØ@ð@Ñ 2¸ú•ó4â«{¸ï‚¿úoÿÿÇÿÿ_úõìyêøzl0ºwTzv$Ú¶“¤Ûж{à›I½[ª×LWV–úwzÚýF·íêßÝÕºÆûÿÿ_ý¶—ÿþH¶ë²~šVZ&m–„ÚZNíb»]¢QKéwKJ¶÷ßJÕõúèi¶¿m/},}áëÿõ­Coa¤Ãÿÿuÿÿ÷¯ÉÙÿØAn•ߥÒ´�/üt›hkW×ÕF¶µ¿}lu_{ñý¾¿aûþëþÃaúíì?ÿû¯ÿÿm/Ð/ÿA; ^Ý_ßVÿÛ¿úý%Õkþ½oüX5¯ÿÿÅWÎ ‡ÿûÿ†Ø~ïÁ¼ÿü6‚ÿïþÐ/Â_þ»{ßÿÖ¸ýÃÕ·ññ_õ~¿Ò‡ûýn¾ÞCýCÿÿ¨6¸ ½» ÿÿÈÃÿ÷^‚ÿÿU¯é?þõ«ppúÿëKÿï÷_ ¯ÿù£#¿ð‚üÿý· ú^û¯FOÿ½}_ÿõnßÿëì0ÃÿW_ÿÿþëÃ`Š¿ÿúû—XKñÿÿ}¸wÖ½Ýÿõô¿÷zÿýÿdÙšö—ÿÿ¶Ûïiÿÿí » „»ÿý/áÚ_û¯ëô÷ý.½�ýºÕûm~Açýû׈mØ-´Sÿÿýóƒ oüè°Ü+ïÿë½ÇÃ¥úÿªÿºþý×õºÛgO1µÿ”{}º·²>ß°ÎW ;aúpÂ)Þ©ÚrW°Ä.­¥ÿÿ™þ.ý|ÿßý-ÝVÞ¾ú_ÞÿÎÔÿuý-ºoëWJÿ¦ÏþÙ½´‚l;àôØ ÚI§¦šÐýü¬+jz0a[¯ÿÞ¯Ka»}ÖºW½ÿÚïIwÿÿ_íëýw_ý¤ÛêêÒ¸všLU¥Sm& Áá4Úì0ƒ$<뢭ÏFh†VÍqÃaÿö¾¾þ륥ößû×j»gO]·Ký+_{».¾Ò¶ÒM;+m&Dª¼Õ´°‚Ý0ØI„ÃA5¾� 2u"�ç¶ä&œE{ÿÿWªå:λ÷_«{oÿk½2?ÑË¡Û ôÚZö”Š;ÓÃmXa¨NÒ †ÒTò8Âa°‚ †6- ¨Ž1t↔'¤�Zïÿº·û¯¥n½« þí³êÞé+i6› â´®¶Å6’vž”¦�0cÒv Qe (B)ˆŽ""®+é¾íºml"‡uuu˜Û¤äW ¶ »‘|a�øÕS  •´®Ã"MÓ»A‚dd0³¾)ÆV…'ƒ·ˆëV•ö´òúì‹í&;ÝÒm&)´“‚íˆ& „�ÞUÉhy´U°Âvhɱ[úé´i6)Si²:I‘Å߃ +ØJd�{n æ * â#ÿjÚ +DI&Ò>…d0ƒˆB#@çaiÅöÐLŒr‡ƒ¥qЮ­%�ÂÕ‘]�U®‡KÁ±i_‚¨A�n›!ô6>ÚMˆAò™¡FIGb Êè�2ÓCå6;*¡V[EÑÙÌ£*‘�·\µ S¾AÁB§½hi,žH„½÷嘶0F¸TßÚ)KäÜ_;´d†Š¹SOºîeh™¢´‚„Õ}!èÈu¥‘%Z¯‘%;Tpa5ZQÕÌ‹¯ëªiç"�”ˆ��×)@Ê�…nsow~½Wó¢õ):.h‰B0"dÍ© ” Ç]Ð …ƒÖ Ø>:N­oé +êvd—8ÊtGÑ +DÐDDé²$ +ˆA– #Y�hÂ42xÏ0‚~Â3µ°“h& ¤ÚOQ¡¿ÉE‘ˆ§Íc)Ñ9" °˜da æ9àŒ0JG‘ Ѓ(…²|Á¢ }šá­ám&Ð3g&tÚ„EºNË<]i:¶®•ã×;V¿ÎõF£)Ù ‘ç�F®Â5²| hÖÉðA„gjg¨A„l%PV©¨°ßE[I´öOþÃe¡Ÿil²éÒaÂv«X&ñ­µ´�'Kôçf«ò_ȼi1¦J²G +þÐÿþ?¯ü±Ÿñý}ÿïÿÿè¬iÙa/‹,è6Ke¡6¢ÒM¢qJñ}'ÛKþƒKªúÿ‡}U&ýþ¯Õ(wè˜ä€þ>‹_û×÷ÿÿÿ_ÿÿÁ¿ÿÿ¦ÚW¥»¥{¥ëw­ãÿãõõ¸îžÝSרþÿ�òëúT¿ÿýWÿÿÿüŸÿùÓÿ ÿÿ}·kI·¯öÜwÕ¿¦ÚR9­úÖ>?ðˆèu_ÿé_ÿõ¦ÿ_úÿ·AÿÿÿøAÿ„¿ÃÝÝ~ýÿKõõúáëþ0ý/ýþ…ºßÿÿÿÂþÃÿmóªþè @…ÿÿÿÿÐ_½~—ûÿ¾¾ÛßVñþŸ¯Ý‡þ�°ÿ¯¯¯ÿÿÿø"Ç·Xoý´þ¿û`‚Ký¿ÿõûµÿÿÿnÞ›ó¯þ¿þõõ¸~þßÿàŒ=[¥ëÿÿÿý¶‚°íˆW÷„¿ôÿÿÿïõ]Þ¿_ó�_»v·¶hºÿªúÿþÿØù½/t¶×ÿÿÿý¸ïþzÿÿý5_n¿oý¿ÿ»þÿÿï†zlþôÚm‚Ú_ÿÿÿðßþÿ¯„ Û«ÿÿû×ÿJ’ß÷Jý½WýÝÿÜ�_ëmº]æÖ úÝH™MŠcmÆÄ+Kÿ¿ÿÿ†ÿì7ÿ„½}!vµ÷ûþºWÿ{ÿþÈ%Uîêõaž­W† eåäWE¨vÚI«#ÀÍši¦Ø@©„š†`�˜t<@ɨûò¡~õß½õ÷ûÿÒô¯n¿ý¾¿ýU³§þÙ«d™ÿØg®ÁlÇü9pÓÝ)ÞÅ'iØb˜„ƒM„í!0 m¦š•r„P˜Ä(åHÿ_ïßí_zÛýýõ}××ýµÿîÙ÷×vÃ7'm‚I¦Å'#€â•Bm°]¦a&i†´ØTŠÌ«•”¢Ýl7þµÿ_þˆÅö¾Lm_¯kÃ/Y¦÷Wwû ôé'¯r(á¶È%´“L&Å6Øbi† „ì(pîÐim�Ä¢ºYJCm}}ëoÛ^­ëo^Ûýý8{!Ž %N–Æ©ìSh+NÓN í„à çw3à Ѧà +{ˆÊÙt –s†þõ÷í¥Ú¶õif6Ò¶î›Pö¶Ÿm¬1iØbœ0ÒM’½é† ŠNÑᓤ|+0`Ád-Â""—îÒnE=6×aÜ‹í+V)´“d(†”ìBM7»k]‚Ä$VCDB2$N#…Ö©¨m(8'#¤Õ´ 0é„ÚPÐPƒ °Âda¦Õ�B;D†[–ï]L6M;B�…qð¡6D1a•Ë}i.®¢"‘dšÒ[K(õj–“ /¶‚D ÈŒõØJèFÆEm –P%ò ð²ÛÌ�Œì—å° )ó´ `ô©Ú¶@¥L2µå®ÿÓÐÿµ¸ÿÄqÇçtŽÇk¿ÎÆE;>d4lòxŽê� µôüìµdhˆDFF‘"LŽÈ„r3˜f˜M0¡ �‡5ÞÒ®V‘Ë¢7�"„xˆc(º#ú4a99šA0ôa'&Ñ0�maé?Ò-5ˆê�h¾K¥ lêh„É��ÅENZu „ÂÎSÆri„{hØGÁ æ¶LaÞ“z^>‚a¶�7­÷S²”Y·ŠQ›26ÁDDæi‚ˆI•CØa1úaŒ#`f�OI2>4è«iÕÃÖÕÒi'ÏémzN•é:¥Õm7ªÉ’ÉRì³ð¨üÔ ÓM6R´ÓÓL#;I�–pÎ ´›O +­*béz ›ÒÖ’½u÷Çúî·ww㮺¡¤ØDXa Ý6m3ÆË=6Òatõi7O¥Kÿí;×¾±éJG ¿cÿÞ‹rJÓUDž·7$éu§~�~�SßÝÚt½ÿKô9ïþü+ÿ×8Èc[)ÑNÈdxŠD#0‘4©´í +§­¿»¾ÿ¡I[_¿�»øÿ,r1²ÿÿé°×ÿù1„Dê a gødòg¤ÓF·¸Ç·Ç +ßÿÿ–9Ï¿ýÿÿô;íÿú°ÿÿæ¹0nLó6oYì4ž#Í-™˜—EŽF~è·%@幇9ÿ¿ÿâ¯úý/þºøýäM‘Ø6ÿÿÕ6Ú½v´›§Ý´ŸñïŇˆÿþ¿×ûÿ¯þ +Ý~Ú_úáÌ×ÿýwöëßñv¿úßÛÿýëÿþëìŸÿ„hº +ýÐ_Þ–Ø_þ¾í×é6×½ÿ†ÿö—ÿøl ¿/ÿAm„ø ¿õW¯ÿîîýcÿÿ�ÿøÿÃiñ ô¿ýt«ö‡÷×uÿ×oÿÿ«ÿ¯ß^ÿþý×Ñ“ý/ÿKHoÁoïóRÿþ¿ÿÿÿúÿý½ÿú2OÝþ—ÿÿú¿úíä…÷V¿Ú[ åÿÿÿü‡ýëïÿú_ï^¿ªÿöœ3šg—r›öÏVœCÒ°ÃÓOKb¿þiÿáÿÖÙÓÛÿõý½~AéûOÿöCI;ÛƒÓb®ä¯it×#à‚Ø_ÿAÿè'öõòtõfÞ» õý³ûi^ÃþDé§§ 6Û„Óm³li¦FxÊâª(ŒP�ÿÒÿÿ×½³=éXam&ÒÓý;l¿¦Á‚MÂP›i Ó`œ*ªw^ÂåsGŠ9àÑ ¤óµXþ¿ºÿëì2îÐVÄ+V)>EÆ�·i±Lpî|¯)ÇÞ§;;Ñb"ÿÿ×û¯õôaSj(5¦Âì,óa �…aW!á‚H¡™k¸Wÿ÷ÿî¿ÿ£ä0�‚Es: `ŽÊPs(õ¯ÿúßuÿù<",ÒêÖ—I}~ûoM´“Ó[a².uk^´‡§i²<­¶Á¦I4í6ø_ýZWIÓM6“†ÓN�m’©¢’‚Ò´›I†O)«ý&Ò`Èì2+q1V$ %lxb!„�Gÿ,9L¢F²˜SÂayj)ÇjQnK'ï +ˆwÿ,ê,ˆTîTÑRDÑrlL¾ø�êŸ+§Á3H®ïíx[\‚æ¨�¢�fˆa”ADï`Í?u´žM6“Éœ3Æ•«¤Ú½6�0Ûû�4jG"D~c�\®}=5Ͱ§A‘<‰#dpdŒÄQˆÌ#X0‹°Ê4 S +™í³4ë„ÒmB=µ÷Õåœ2;JګŪt¯Ò¥·þ:i8IÚk×ÖÈš%Ì�ÅáaHä'›(“öò^M4ÂV“%çðÒmö�xg +WWT˜qN¿ø¼'_]?ÿ‘G¨«{OL�~®‚o×2ÈÍHˆ™02G4Bj~#âø„VHÂdš´Ó‘¸aYhL4 Ù„¼(Aœ#Î�&–ÂZMÂa·M¢Q[QÇIéÿßÜkÔ/î¤p¶‡Uÿ××Qÿ*¨˜G §dKÈù:Ds!&U`Ê3™�tÂ?¶õ.H0Ѱ­¦xæ›^›A>ÿU®º]5ï]6Я{­µoÿ{�á‡þ0å�UÿÚ’œŠ¢�éâ—¢ ÎN�ED3Ùí0ƒ'“=ž�ù¤6näÇ„ÓÂQL³³Æ“ –…oX«hk«ïêíi{´î—Nª�¤Þï»án_ÿðé ýA×ßæÅ艄|_¨2�„hÿêÚPÓ‚Ytè2{øí˜Fæ‚tÓG‡A0éÂ0÷iòf²Ð„q”ñ ¥™ŠN!!©l#@0���a„kf¨Ï £ÛùA6ª6ýmdÓ§“8Òm+Sæ-Õå GqõR½HÊÙ ލã"3ª4AAO ѱ„|„|£c�6“ii6“¨@Î0–“„aG5Kñm]E¤NפÿûKÓÎËQ Ú8ˆº6ιÖg˜@Ó<g¶o#âèmª CA6®¡´›IÒÒ ¤é7ŠÂ½Ô{„Ö“û{Ч[´õÿýI@Ñ4{$æ‚0á†O˜25˜3ùì"ìr~N†£SÞf�'DpÂg t›v‚¢^Ñ'Kt8¥ii:V–ºû¥Úî=~ïß¡Cÿÿ7—’£:‹˜"=˜!ÑÌ�Žr ‘±èCÖÕ4iªJÐM;¨]XiºN�7M«JÛÒNôTÓÿuux»wë¸ÝÇö߽幄ôž3ã<ü„ŒàƒØœýÑá¨Ø †˜ª`äÄȰÒtÃIµtN)ZO¿ºøþÛ‡ÃI[i;M¸Çv†½UÖ‹‹ï§-ϯ_ýƒüí¥! Ñà:ÿTVRnæ—‹jÚ»TÛÁ7ð›ïkkÒÿÇ]-ÛíÇÛIýÑc‘Ì8r‹U×Ňú°ñÿÿaþ¿áÔ<]Úð©¶“Ö˜úëz¿º[º*«þé,1÷ÝÕ¶ÛñaÃEÕýþ˜?Õ‡ÿÿ†ÿ"ÿb¯ ½~ÖµOî’ë­í7^ÚNÖ?ÿŒ?ûëkþ˜l?ÿü7ø# þNÿüü Oü9>õ]÷¡ûýR•M~ãü±�*ÿ醻ïîùÁÿ†Ãÿøoð‚poôÿïýí÷nŸß_`ÿuoõÿÿÿVÿÿïÿ°ØoÿþÃ÷¥¿áÿïö«þU°ßzÿÿÃô¿ÿ]ÿÿÿÈ�ÿÿxÿ‡wÿ~ÿ¥½ÿýy­?ëÿ +÷èð¾h?ÿ ÿÿø#?ÿÿþÛA?ÿjú÷}ûm_·ëÔê�ýW×ïöÿúA·>?oýü7ÿÿáÿ÷ÿøuÿ¯Ì÷õíÝ¿~¿:ÿëýÿýW¶~×¼û¯ÿ¥^Ö¾¸oïÿô¿ÿ¿ýÝ/]wªoëléæ?o·VÕ²uýúÚM™ÿ„PïÒVÌ-+/¦Ã H®õOÓãî£âÿ¾ÿûuú^·ïÿ÷ÿ]v©_¯šíÚ¶h›«Û®½dAúa‚I§ [á¥ppÒa¦Ä& NöªÿPÿÿßÞý~µéþÛõöΞ«®»Ò·wJà ]]0ÍÍì0VÐLlU¤ši°]¤Ä$Óv‚(|¨dtAZbƒD<B2ªˆþµ×ß¿·Þ½WÖý»Ûþú°Šé]+i-øACb¥i)�ƒÃƒa ÈÞÂdZäè£h4 �aJÔ¬e•¿ý?þß‘¿öîí{JÓé³õÛgÓ}ß¶s´›Û´I¶’Úpi &E™@�‚a1DA„YÄÃwT¿ÿÛþ½¶öÒô¤AÝ ˜¥M�´¬>Ða‘&ë†RFB´gÌ”iÝÒT»MU6ÏJ�¥¦ÈZóA ˜'ÂL$ì0ƒîÂ!è¬`ÁˆÁ µéi&•¤Ö�§±IÝ‘ÍSh0ª!Ô®ÑÚ.b""â"�Žü6N”¨, ÂagŒ¨a‚EcE[ B;YÄF„qÇøb¨ …ŠÈÒ&Æ·ÿ†‡ÿà‹[ÿªÇÿáÒ½4Ð`½tÂxÁ$ D|¬h¯z�ÿÿÿÿÿÿÿÿÿÿÿùg¡B!ÎM°WÐgb†J�r��‘¨‚|ì¼>CDþƒç@PB2¦Ð}ægëÿPŸzú#ö?ûñþ›þ¨”ß$wýr _]ÿÿrF¡ÚòV/ß;óY# BÌ@¶K™à`½w!Ä!™™N< _<`ˆ$ÈDdTôæf „ÂxAß Â|è&l²�{*š0˜A™´ôK„¦ƒø´Âha;ôä­ðžzÂvšq ëéŧñrXÖJ!ôè–4Ÿ„^$ɆœEÞŸXißD»ò,2—%ÔxyÔTž¾·ÛÈ} vE‚&d}äû°TÜ�?ÂvéÒt› ‚óÕ^>Kœ‹�ç°{ÓûzMþ“tÿûXÿíé$÷ë¦ôŸ`릛¯[¿§§ëÖŸÃz_ë¯Ûà n¾›éï×õþµõL¤ ¥È#\ }|^¿þHïûòOüœãû}jý<íÂ…ÿø÷úüÌ1ÿ‚þÒ Ãæ ¿ÇƒŸÿÿÛÿð¿î¿¾”šGÊ}ÿuÿÿÿýsÿ¢_ù "Dt°~ÿpˆ¹ÿù1¯ÿèÿ¥Úÿ¥¿‘÷ù!y$'…ÿÿïßÿÿ×ïúVQ›7è/_ïKÿ¯ÿzú_ÿ[[3;KW¿×uû­Úöhõ^×ÿÿö×V×ïm~ºîh}ÿÿí®—º_kÿÚ±·LVˆgÁV—ûûöÖ×ûKÖ>BXkÿÿÅìS^Óím-´¸«_ãØªÝŠö?ýÃ"Ŧ½¦½…�b¶˜ÿ­¨[°½¿ý��0˜^A…Øëk &B�þMÂÚ­Ã ÙÔ!Âè„DG²$dÜ-¬0˜AèGhA„[áŒZ `„DG-Å b#Ý{K±ö q�þ@@X3Êh,2Až[a`h òØ h3ËV &ƒL´�@è +òÐ Ñ&æ vs*€æ +R@ß JVÃù �m`üÿùL 1-•3(#fy“KòQ-‘'Òý:‡•Î RÐT&“þ�Is̉�à¹Ùª„ô‡þƒãÐz_ûiôɹhd†V—äM”„ƒÜÐ"|'D»;})P.\gÌÌ>!8PL'¸MB¤ß¤¸N!úi þÓíuÿéßIÉ;L5è–C‰÷îFŒˆ>+´O�6‰Ø$O6‰caoM¿û Â!ü›‡þ“uoºMý?ðE×£Ÿíœ_~¾ý{Ⓢ®?a¦‰[ûún›mz»ÿý|‡ –iäxûÿÿÐ0VB ÿšÉÁ;V—_#�ÿõÇ¿¨.†N>þßþíþÿ¤EŽˆóÛÅkêÿñ×�M_ú¢Ð_-�5þ›ÿúäÒ=Kéx=ÿïÿ±îÿékÿ áíÿ¿³6m»iv¿ÿ-�ù>ÿ·í¥µÚÚ_ÅZÃ×§Ú_û¯k|i^Åtà·35ÿïØ© 6Å1Mp£wö·ÿû~Õ¾ÓMp™îÈ·ö“¤ëþþRã´ ,Þ6)†ºþM�LDGµÇþ0ÐaHAÿ­„ˆäبHˆõª‹; Xÿ, i�³ßúåª*42 +Í@F>å�йh �wÿáçÝ×çjîW¬6Cù9±äÙHœeÆl� ÐB€¼Ô ö>ÿÚÄ=ðÌ’>GoßÎÇÏžÚÞ“·ïáþr8ÌÙ˜¾D4f Á—ü‹o“Æ“ûÈAí§éÚ ý;X´þ©ôžŸÉMínN2vldá˜@Ì™ÿi'éǶ´ßãúm?l í0ž¿ûi"xýçR;"ßúô…~ä<Œ2PGÌè2ˆÙ yæhg�’ôâï{õÛÒo�_7#šiþ¿Âý³0�>ÍƘL&˜M{âÓÝ·¢xðÁ:V–ÅWôõþÚÿ‘ŸÓ ßiÅþ”4ý'’ç¾×ÇÒÿßTÿÿ…þšh“» |Žèž?¦ÿ¾·»ôž·÷¯ôK¿tOœž?’Â< ƒrY}úm&ýz{÷JÔ|ž¿ÿµÿ¯úV“ýU¤ûÕ=ÿ!þÿÿüWù£Kÿ¿þïÝ~Úúÿ°~ÝIŒ§ ã…ÿÿ½ûk¯õÒÿýëún/_دòiýÿÿ¥ëÿé¿ëãÿëÿ�zrpŸþŸî—ÿP×n­ÿÿý{ýI§çB÷¯M³7ÿÿ¼VÅ1_ÿÿÿKä�´¯ïñú$ý}µÿù7[OÿÿþM>ÿþ´¬ŸóöÿM¶—Ú_û]Pa29#Kûÿúö;Kµp_ÿ¯Jãö+ü|DG«i6|õÿ(_õ홸¦ÒöþêØa{ ý/iëû`¿{ÚëQ^Åv×ÓµÁB"?Šm&Öÿõø &JkÚß-3A}1QL±_}E1P˜NÐa^š )?ö½÷—0‰¹™×„ÓM?T÷è5ˆÊ¤dªydP$WõÔ®,'ZÇ\F@aIËÂt-•30Â|µJcaý>² ®©´GÏ–‚–BÙ‡ÃÞŸ©©­¥}¤Ù�̧gRä¼v”)Kuÿ{¤åDâ5ô—ßï]÷µMm¿Ú'™<Éã‘ÙÜ—dY§ßtº{ÿúÿ†Ãÿþh2œˆc(�¼ˆgƒ‚ú_j½6­«tÓ÷I^8Ó{ÿÿõÈY�Nzðƒ3a4kka?D¯#¿þ¯]?ôõOë¥ÿ×ïì0ßõðœZzߦô“ÓÿiÕ}ëpá÷û�ÿýÃr:ÿòPí8Ù‘+wÓïÿþ)7ý=FÈy�ü=û_ÿù2l†9:ßõA7#Ɖ晤è:oþ¿úCÿÿöÛÿÿÿ_wÿþôé7#Iz¤ûÿÿÿàà È<þëÿÿ¹†ù¢×Å^ôz[õÿ¬ƒÏÿÿ&NC�uîµþÖ›>ÍŸ~ƒµô»i^ é*ÿÿþÉÕëÿðØöÕºëºÿõm[õA~:#BéG¿ÿú^hÛ_í-¼ÅÙ›oâ­/ívVÒn˜¦?DáŠü7¯ÿÿþi6¿ÿù›0nžë®Óñ[Å1M?’ÿ~¤ÿ­þøJ×í/ívÕ´›í+Z 0¿“u°ši¦GH—~J¹No¥&3·éjÚN¿Ú\U­«°ƒ_\&ƒA„ ˆý.úïÒ~õµû„ÅFÅ´Å1L'ɰF"#ˆˆŽúõ}ý+(^ßuý4M-Öi„dXãÿ[«3}¥® \qôðšh0½­¡a0�‚¯ÿ«kÚêÚîõ­ˆ0�ŸyÿkiZ[È1‚—dXɺüGÿ±ÆÅm{]¸ÓiúïðšÚö¼qýZÞäÝ„B!…O­ô­øþ„Fßö†#ÿ–à å0!¼¶BÃ$7–°Xƒ$´ê@\Ô Ë8X!¨e5EÌÀ�¹¨n¨Ï¢ì¸ $qHá’ † \gL•£0Áà Û#†ñfo#£˜ä2@Ür‡)ŠÄDÿ "¡ÊlфꜶõE󖺣5ÉýõUIåœLgAªªã,õI¦«Ìúª &Y B“„Tµ�„J¥Dï/ªù¿ØZm+ùŸ^?@©{–@³54´¸‡L}´¿]{ú^ß×\—h·–…'þúZ]7ïÿõ×ÿ�bǃbû×õ×OI´ýÿú\AÿÓôÿÿ^ÿèž<êH¾ÿÿ_ô›§ê›ÿÿA–Uºÿ%ÿаa_®ú«þÿoµ«wªÿÿƒ[×Ù JQúÿ’öÅP¶—ÿÿµÃJAÙFíî—îÂåAu-”¯¥â4Ãz_~¿å¢ú·ºM×ýΗ¥š["5»ïmv«Ok¥k´öÅhƒ(Dkµì-; +�©¦¡¿äÇÁŠõå±�N +FµÉ 'õýjYô�3 Ö�ë+’a4A¬´ŸJKæJ"í4裸ê§Å" £!Þܼh�ÑyUIuá?_Òzm[FU¥[UþûK¯éRý"vè‹¥QÝ'ÛÛKÌ.•iå˜=LÖðNþ´µx†µúIººýý­4’´«ûiygR£e׿¥Éó×ÿí¤I™!’ñæa=;¿u]Òúþ­¥þ˜AÅÿýr�øƒ]6–\›Kù¹xävô¿ÒÅÒúõÚ_Ó¤ð·_õþ¾Çn—õi7Oaÿô‹(›Kòù†ŸéñßKþþ¿{uÿ×éæïþ‹æ/ÿëøA~¥‘QÞ—ôŸOÿÿI×ý/ô­¼ðÿÿôíïkð½zMÿÿëú[ ,G¤ßÿÿV—ìWü�Õ+ÿÛ4««imý&ÿÿú�c…1ˆ0‡¶•¤“ûizí4>ó†úMÿö—ûL+¶–Å$ÿcüA‚±[T?øa}am ;B-÷Iˆˆ¯­­ë}Òå6¶å6²>Ÿ—ZêC: +|š´ÜµÆ¤ÓµIêƒN½åœ1Hb�ÅT^QxÍGUta0»i;ëÓNÁRöÒÌ/¢yDí¢óíúH‚}õtêßZ]_Òt›¬²kúÉ[ÿþ߸éBoÿõþ—¿ÇI×ÿH[ú÷¿éWô¿ÿI‚_ÿ„¿_ÿúI¿ÿÒË(7·Ë8ƒÿü ’´´¯ÿê–ûkoÿoK´ºÿ¯ÕlS,ó{i?ê’M5ÿ¿m|4·þ—i" |G«i7ìWÛ­t°ÂëÅ1ˆaÚi„0Âa5ÿÿ”Ù’")M•@ˆ¡ƒª :¢qDáË]HR¤1V›¦å®5Ó –C0‰6“Õ4Ó_I垸è) U—�Ž^='Æ©¦'IÒrÊ9÷Õ4ÁwÛ÷úšÀ‚$Õ¶‹ÏZZCÖ¦ áiöÿÿßA÷I´²Èaßõü^M¡Sû~£æÏù=^ÚI(Oú~ZÎ�_b¸‡ý7ÝoýdG÷ÿ#BǃbÿúiA7ûý?OÿÑYCbêò";§}¶‰Û—m”·Ý~¾H3Q„ÿÒtŸmkJÿK¯Ã_n›ÛI´‡úõôª‹ê�ú_Ò_—/®ª¤FjÒ¿´¿­RÞ!ú^•t·]þ›] ZÓõÿ0öÖ´g‘C:+÷Òù>]Qž–Ú ×)ãÌ&zzKö“OêŸK]´…*ø°œ[ÿùü[ø‡¯­´´¾K¼rXô¿ÒoÿúZ[i—÷Iº}þÿÈ`•]v详Òzí/ëo_É{¥¥±é}xï„úD‹ÿÿ]m0×ÿý/þÿ7õ×ȱ×ý~“ÿûi_ÿ®´Ýÿ +éÕ+Kô¿ë®�íÿúZߺ¶•¯µâ Òoˆÿ×þÃJÕŠé6A¿ÿ!¯Òm&ÒØ¦)¯T“~ `¿ÿûM0¹©šÚMùÑÿÿHƒ)ŠaïêÛiWí¥þÓB#I»_û_]¦¿¤ÛþÅ~ Âý; ý…ô?ÄC]†„{•Àß­÷K}Òã)²¨ê!ðc§Õ>ZàC#2@„1UÌÔå®y4ÓL Õ4Â¥¥,ú †) UEåeãEã÷¨A¦˜T›Òtœ²»õ¦še‘Âzï¿ZYxÑ;h¼zN‹–�âµIé÷ñ…ÿëK¦Òl²}KŠúUÝÔâKèÙé/÷¯ÁOÒÂzÔV¯{‹¬è8‡¤µõ¾Dv—Éc ¥ÿÁ6½Óé%¿úzÈÇMáÿÿm-¿Ò÷ÿÖ·ÿIK9wÿüCÒíÿïæïõÿÿ{ßý÷÷¯Î�_äžYéwV¾•^Ú_[õýµÝ+WÇ«ÿ¶–ÆÅþÒm.+„Õ´¯µÃXh5ƒ +Å1L&†ئš ¦ Âb?ÿùM…†@o)ª�l¥·PƒT¶À”ËV &ƒT´‚À˜²Î0Õ–@°&‚‰n6@×�æþ@Úm�O!� )±œÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ@@XËa“Êa �\†ITAuÍKj È2×Ï‚‘2@®Zõ@2�yf…†@n#-`fË%@f š�yoP‚æ \gPe5˜2�qÈdƒ-DM ˆÿå6Y�𦑒2¨ÉFKHÕœùLš¢‚ÈìŠ%N˜ùlé�“ˆÙ¥ƒ¦šHW» +¥® �¤‘- å# �l"ìè1i8k¼øO=-bÂ>F¶DvL0©nú ›A6¬Ÿ·£ï÷¡KôÖ!¶éµÖ½~ÛCÐÐý²•Ùy)VŽ¢» ý,~’mn»U$g_5£ùDPEGz…(3Ìó6fÌ&‚ Âa=kºM$¿ÿ§4‰Ì‡d†G~‰2'#†0¡ÚÒÂ.Ë øYýº]Ð#~Aú_¥ë„Áþ¡}#]:ª(xEIÂMt“ºNŽ<"�ëðŽôõ¤L+Ï’K�e­*ý/Ò~‚N’¥i>Ï�W 4—ªß°ÚT©(âúœfIn¡ÃKH µ¯_ëipG}%^ª¢„'`¨W¿K¥HR¤—¿¤‚¼ »¤�$³š -UëÒúJ’…ý$’¥ú×ê¿úI½Uô›KÈö—ë}¤—ÿZªJ©.ºëÖ’]/­iI-$ýRÂZŽºUN“ÿ¥®µ_a*ô©*I_J©RýkÞ :n½$¨RK]‡†ké.ô•*ü š¥ÿ­%Öµ¯_פ½µýRÿKQQI.–ÒúÒ¥’¥_].«ª_/þ´½/±KÈáU%Òª_é A/¥¯ÿUïú©ëðGp×¥’[ì? ®U×éWI*L$cÜ¿þ’KåûËð~ÝDÒP¡¥ô«ë¯Q­.µT’T²>˜øK/EjÙͳŸUi�˜Pá]:T—õOéõ]_¯Áz—]R^”U§¡Â¿ EQ�/ضª•†M=U4Õt«¯ëKJ Åt’Ô% +BOUTˆL.*©„ÂjªƒGja¾–éfz¤ïG5ØûÔ ’T ªØMU4Te’ô©Òµ¯°–©ÂëÒ Ž(2¹CéU ª©1m£Ù[K$"!åqººBH®$�Òéå¬ ¤#¼Bÿi^ÕP«&ñÚˆ°ÐTðb"íˆÄ|@endstream +endobj +96 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 128 /Subtype /Image /Width 60 /Length 944 >> +stream +ÿØÿîAdobed€ ÿÛ„   %((((%46664<<<<<<<<<< + + +  $$$$))),,,ÿÀ€<"ÿÄu !1QAa‘"�2RÒ±ÑB“ðq¡Ááb’¢#Ã!ÿÚ ?úŒdLˆ!¸Ç]9Ñe“ÉŒHˆ£Î1.Þ-À«Œ˜É‹jC±ý´Uì⺵ ¼\ +mÁDZy£-"´m*um•àc8‰Ä¸�ERPÆ"\˜Ž5ÑþÅpc"( äY‘Pd‰¸‚â$ƒìA0@¯±vÕTîD ×E1�“·Å"9=& 0¤Œ‹K�tE¾Å#KĽ" Ê@—4ш4ö­Ù"Fr�”®v±�j´¢I‰ C_ÔÅY‘Udq¼2Ä0î;l)jŽÉ1Œd‰;†["�r})²@[´HL­´·Â­t}ÚŽ´R�e#I[Iô#Nl¬gÃrÁ«Vz²ÃÇÅ—�r1™Äå/í ¨|l·D›M³º²5O—ó&£¬È HRë’^>SHÞ H‘¥ï~ÑuD4@Ø"¥ÑJ…AaPAˆpæÑ@ò&¿½_�¸N§RFû-OÑÑH‘Œ;—ˆÊë@6“Å·UÓ)17¨:·Üº ãlÃw/+�Ž¥½0Ü+L’Ìí�^€RŒÏÑt"Erdžhƒ–&ã[k82gâh·Â LA,KèüÖŠÄ‘á*Ø7=J‘ߪª—ãp¡¹”d £¸ê—ÃâTJ7KAbA¯1U�ðñ|Y¿;/΃^æ?Ž=BŽî/Ž=BÏé1Å—ó²|ë›Êÿ‰ÿ/ϳëühù}§í÷ÉÉmÍu·’ÎÁAè"• +‚" ")A¥C ”D@DDD@DDY¾‚Ô~UYKÊ f> +stream +ÿØÿîAdobed€ ÿÛ„   %((((%46664<<<<<<<<<< + + +  $$$$))),,,ÿÀ "ÿÄW1‘¡RÿÚ ?Ô­>{2Œ¡éxéÊY¸´ƒDÿÙendstream +endobj +98 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 152 /Subtype /Image /Width 48 /Length 1265 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ˜0ÿÄH!1AQa"qð�‘¡±Á2BáRbr‚ÿÚ?ú™Pš�À˜8ÑAäY¬þ‚ž:"”ãTPð$íP³Ç•jl(ì”4$\WN5‚ AÖ—�‹#*‚g´úU ªx²ŒË¸5±mÐÕ8P (1\u,¤LHÖ£—ÇÉP 0"ö:Èë>µmS(Ä'i‚A$ÍŸ™ÿ�[ OàÐ ù5'—ŽËSŒ0@obf• +åþ Éb�©Ü?” >/^ƒ®å+$O#¤p»¹»�Æ¢-Ê�ÇY™3kñµ«¾ÀæÚ¯*Fñ1‚X ý‰ÒcœTW<À;`Úå�%‚–”²’o·TWÈFm½ÓÕHR*µÚ›eDuRnÚuãûSð¥Êžâ2I‘b'•@�jmÚíP,À±[EÄ VpÙó0t%�Á@P ô‰6æ~”ù_)È0m,ó7¾�=hÈù1çÄ 3mÒâW#kÿ�>¿- 'yDZ$ZÕ\ˆ2#)Јç­g>!ÊèÙ0FÜ ,wA¹˜›WÖvå` maˆÝÈžGO§(ŒÛ”†‹�K[¬õ<(Ëã6LŠû‡iXÈ 0çÄ1PØrv½Ž ‰×‘‘Z«„�s\A1A¢—+”BGMa_#"xùr1T=É3ØZI tà*ÌÙQFÒ G·?Ë•+çËŒ»4lQb'I?O¿ëÏÈÊç¼<=²¿y5­ÉÛ#Zë¦ðG1“ØÊØòc!B±a®énNåŽ:A¡À2É" /°F0“¤Oæ;·XéJ‹œžíª:K8k÷«0;NÝi袊 r†`¢N‚õò +ÁØJÌ&u�#ãÒõ—Ç'\̈ n±0Í©×J¾\û�J�wYæ4µ�¥sÉó¿ÕÑ �ÌáVD[œÞ¸þBæÄ7»äx� GÐMþ|«c Õ ÌIì#×â>õ xÛ3m't›k©1÷§Î�•€ÚlMíFúükO¹Ä¦/¯_I¬þbda�†6fG-µvñGMY”jô+”QELYÛÌE't€’D>ùqª.`[lJÞB¡ƒ"àI°“¯­.O)q²�CZÀ±Ÿ@,:ÖL~p×";3°#´ …gp �“Ê·ç!q±'úšÍá‘í:wå±êÌz\Äeq±„Úó§k€cÕ…Y²"¤'€'—-*A†,¦T€M ì ?êj^.T³0 0tÜñ¿Ï­z•È¢(Š(¥ÈYTí‰á:R~N%qŒºï2BÈÜ@é\÷2{»`mÛ Í÷^GéQñüœ¹W4…Ü„(¯›U½ý¸÷°êb›ßÅþëa:�)ÛJÏ»w� –Ù&dí�ñYð3þF׉ñ“ì}ÉÖñjL$ ^Y1f&÷Ós£ÉÇ¿.ÙŒ¯Âu\•³&> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  ÿÄ5�B23q1ÿÚ?ꤾ>ÿßä§·ë&usùþ Ñíúσ2–ƒG¾¹ðgNÐh÷×>2gNÐ_é®|NÐ_é®|NÐ_é¦|NÐ_ë¦|NÐ[í§·‚)Ú }´öðE;Ao¶žÞ§h-÷çìE;Ao¿?bJZ +}ùäš–‚ŒsÉ5-ç’jZ +1Ï$Ô´cžI©h(Æ™&¥ £òMKAF9äš–‚ŒsÉ5-ç’jZ +1Ï$Ô´cžI©h(Ç<“RÐ69ä +ZÆ™–�³¦@¥ lé�)hò-gž@¥ lsÈ´cžI©h(Ç<“RÐQŽy&¥ §ßžI©h)÷ç’jZ +}ùäš–‚ŒsÉ5-ç’jZ +1Ï$Ô´cžI©h(Ç<“RÐQŽy&¥ lóÈ´ �2-g@)h:K@ÙÒ@¥ lé RÐ6t�+hZHT´ ­$*ZÖ’mkI +–�5¤…K@šÒB¥ Mi!RÐ&´�©h:HT´ ­$*ZÖ’-kI +–�³¤�[@ÚÒ@¥ lé VÐ6t�)h:H´ �$ +ZÎ’-gI–�³¤�[@ÙÒ@¥ lé RÐ&´�©hZH´ ­$*ZÖ’-kI +¶�5¤…K@šÒB¥ Mi!VÐ&´�«hZHU´ ­$*ZÖ’-kI +¶�5¤…K@šÒB¥ Mi!VÐ&´�«hZHT´ ­$*ZÖ’-gI¶�³¤�KAÿÙendstream +endobj +100 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 24 /Subtype /Image /Width 40 /Length 330 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ (ÿÄ=!AQ"‘ðq¡Á‚ÿÚ?êÏTÏ‘ÖEôžR¬òV‚xƒ Ø·lªkâ%”+u�ý`eŠÑI!D÷ŒeTìŒNü°Ü|tœ|€u„Œ$`ï5}Ñ×¥H#DXÊ­#ò8ë?±€'j£S&hǯ¦aoaS*‹_„ÇŒDˆ>;Ÿ”dškµÍꀰŠÁÐ L?�íö#.Ÿf•ž\—M23±+ŸÿÙendstream +endobj +101 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 272 /Subtype /Image /Width 368 /Length 12730 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ pÿÄT!1AQaq"�‘¡2ð±BÁÑRbáñ’#r‚¢²Â3CÒâÿÚ?ú€Ä�‹w‹ÔãÅÁÙ¿ª>Ÿ�jÛ±’´_¡©ö�â"™Ä�ªƒh҅ƘÇ€@§Á@€t©lXÚAPdÉ‘­Oí°˜ÚXZ¬ éTDÚ¤âCªƒhÓj^Æ0#‚ÇHEÀ uÓzfŸd³(>biœhÑ* XZ—³Œ~‘ò§í§Aò âFJ‚:Eª¸/Azž { Ó⦠ij +Ž”‚ÒŸvÒ™c½  øŽ”q,-Eõ¢ˆ Ò4(4EEè©$Q SÑF”‰kI›a­z—É«þ­$R&‰ oD‚H›Ò䦨A�ÐÍz©$$mB–&ñð§RI€D�DÕTsUÔ�ù¯Q})“rLÚ’äV°`Hñ¦èbDQÍE¤MÕ5 yÑÍH�Du¡r#ý¬‘š…î1dn +êNà4ýì|¸rºMéøùp漺Mê2wHbÍ÷úÍTÇ÷0:˜ÓZÌ÷˜÷S‹�‚zZœŠ¢IÖ¸ �ÌÝ@’!Óœqu¯dbº˜3#‘åú ïü+¢¼îñqf•q$>;‘aÉí­íjœ—nÞoÉ€7?Ðí×»%Æ="9LZäßó¬ÓUB± \‘r8ž·™®€t®\Ò{„ð#ÿW¬±ª÷ ˜0›°>†p!˜XXŸ�†ÕÃ…‡"«ËÜÊ“Ä}¸Û'ðâ+¨ÆL°è¤ âM΋ÿúùTeÅŒâ�u-$IלŸ¬Í<+þÎ6Ü€OIa?SFÝ1•rüÉûXñŸ +�­v +ó;„ö ¥¥ÉccÄ‹ÄxWjä±–2 íô½F\ÏûPò…•ëôøÿ +Õ›0Y˜’L:ùW*àS�9pã¬IkkÉyOËÆ�D�¥'’�nXÓcñ3áH)p †IR9–¡‘ü*Æ6qÜ$›– Èq¤]êMüÆÕ«ãP!@Æl/&[ç\ÈOîYö±ë¯ÿ¯J¼!8°fãê&ã:�×ñÚY¾,eƒ&EüƒGækÏΉíw@ôã$.s>G”WCcFLF'O·‰:tþUÐp+Ä\Ÿ—©ýª@ +=$‹kø5-Ú©|D(ÿna�Øm›ßzéŠË/k‹<òY�ÉÇ�¸èn:mX¯ün(@oGÛëkZ:ßS­h½®4bÑ&fYŠßûIŠg‰µÞ~ã?7ò­B mY?k�+ói‘ê6‰ÚczIÙaEe¡µšòIëÔÖ¸ñŒbüIoιûÔÈáJrtרˆŸ3?�%ĉ øM…/Ûâåˈ�~‘ùQìcåˈ™ŸŒDÐ0c¤oÿ•ÏΠv˜öÖA�cCZ(L�&gã?*¡�j«'í±duvE,³‰"l`íSû<Jûiʼn$qÄë#z´í±cPŠŠ\ ½ªéSÞ¥˜,LÜÅ„ÕEiFÔ¨4F˜3Egï/¹íïŸ ˜ñÚ´,½©Ñ5–NåqåLd1.bD@±7ÿI­f‰¢h QECd*@ +LêD[ÎOåWµŠÍó„È©XÄì,ÍÿÆ›¹X…&OËή�e›7¶,¥Œ +´nBb)ÑEŠ&žôQ\˜³®u ­¨x­ŒßÀŠŸuÆr€’!ˆ6 êi`qÏïbI#ÕkßôÛ§M+£&>qÐ_ãµrç,\ŽL,"†óérÓ©>“³ä%eÔ“ +Ab,Ââ9𮸰¹¼×÷raÈVdE€@ÛõÓCs¤SÀ½Þ7–ãÄ‹ÿ¸ÎfúƒóûrNB <© É0fëcoÚk^ó+cU�ÔHÖ0X¦•<›·eRÌà�Z&8±Øé©È�Ãd,€‰ÈËÿŠˆ£/¾ä±˜vM# ó¤FrˆŒJËz™[•¤zy&óý:o0j±"ãî\ û1Ü’N¹-s]e9nt?ZÄ 'ÚæmŽ^¸3;~tÓ'£ ¡2n=•ª£b JÄ]‰ Û¬þu–3Z÷\ UÈEÖòDÞ ‘zÓµÀØg‘×`O€&ÕŸv�Œ·6Ež>gÇ¥u¨‹V·gv/Æ'Ó¬/ß;†å|i`#0"l„L�K‰ó|4¬²ڀÓò(ú€›tO€®’8<ƒ¶“}EõÛñâ²vá„/¤ÞãQ&OÖ v¬L³Ï¤‰‹Þ'Ãn”±vl®�“!vE* qû¢f<«l¸ß%•¸Û¤ß­dÝ£<©K\€ üæ†íÊŒ…W u�j²öì쬹 +źî'[m¸>Sû%(ÈI†Ö-ᦞcO +jä·<ŒÀè Ñçó4ñö¥1r@ E¾$Ú¯7n3q“¡$yÁÆ�e‰ž[�…ÇJO„´Žd G‘¥ûP’±‰‘müÿ˜í¡@æÒ”ξÂ¥;B¯Ìäb~Ëi´õ­Ù9´Vm€�°ä·ª66ªÇ‡�$’I×oÊŒ˜9°``ŠXðpäI$±“'òéI;hiäÑ{Z ™ü}jòã.°­õ?Pi&ÂrcýÖ©NØ –f‘£#Î?–×ÙU^nÁ@‘¼?£Û‰± L‘C`å£0�µSb T’m´ÛåQ—¶\�È3#DJ��� Šn#“I2LÞiI;@òfr¤Z&Þ@V™q{‚9äb¤`¹X€@��ƒ·•#Û†`y-n”‡mŤ; oM6íùA™IÖ"ÿ0hnÙH33:ë:ÍYÄ&ß‹Öx»eÂd$€%˜±�çVø— èuIŒ$›Þõ‡º2ä #�ûHo*Ôà TÎ P¡&ò$-ŠVå$’¹'J A {ÑE)~”èšQ½Š)¦/R¹QÙ•X¶` ×ήŠ(¥E1Ec›¹Ç…•XÁm¸x‘ZéNŠž@˜ª¥4T¾QŽ&LÚÀ·åVmJm@¢‘¢iÍ:FÕ*ü‰X6܈uɈælJlŒÀäo7�5¬òw9‘“äö™�=,f Ml*©%A;½¼Ì~-ãF'}Ü4X€7ùšJù&K¬°‘ÇŒë?_¥Aåï!5k›&LŒŠc€ˆ™°í3]IÌTL�/i¶Ãjäï�%:È�RÖ äÇKu°ãü+ŸNã+Hå@ '·kEÏ-»Á$t¬}®.r[‘1°ÒNµÏÜ6~×elœ¸+44/+Ï".:éÖ¶Æî¹8»06oÈùíÖ²C“¹äÉ•”"8¬Ê„ Ó+=|v®¬N\Iø£c Ú¹3eËšø9 GêSÇõƒ¡¶Ê™Ø(Wã’&ý<§ñjà îVFËÈ©[È {F¼¾~û‡ÛY‹�HâçK�@ƒq·Â£ Ïê èX«ë=Î\�ºœ¤eéälvŸ#üif“¸à®V™rõs‘ê‘‘µ_6bN"ÄKbªSÇõMÁð­Ôä0§¥ÉŽZÚÂÚOò­QJ›™­s…Ș#ÂÛ|kíò¶DO¤‹u³ÿµnË�ôÓ­d˜rãˆàl²‰°¬1áTRÊåˆ$#îF<¶‰‘þUÐØ]œ8‰|€oÿª0öù;~DA,C6�˜·öÔe Ölè…‚©‚fI_HÔÅïá?[.rT¹%m$KTäÃ$ˆÇRÅ“i=/IseHR F«üëïòs!Wõ=.Ó1ú€�­z¹j2äöзÈHvêk�+äc…™•Cñ–iF¯éøíZa÷1žÝµ- v$·–1=Mfqä9Xœd“Â¥®gÓ½º×V%( 1’�éfžo å$~uɇl.ÄH –<�3 +º›Uö8�Ö +…¼È$üEmË/"£‘$qñГô­Ísw¸¸Âè?P#ýB cÜcÍÜãQÉ � °ý�~š¿Û1ÎùH�êˆG@œÏ-¾*ñžà8Öw<½:ŸŽ—úWLÏ2–[ õhý'–ñÒ³Åî.5R†@q§“žDdD†H‹ük �¾L˜x/%õ–‰˜’ÜXK2bW±‰"ÐIIÒ'qhÞŒX× ’¤H€ Oýª9Ù†d… `]ŒIëaüt@­Ijâ8så ͺ�ÓêâWÕé¹Óé¥kíä[ŒùŸýoÓËëZ‘PB†>qåXw]¡î”«($©Y'Ò90:øÇò®œ!•O.¦>?:§ƒ1jãÁƒ7%lŠªxúÊ““Ó~? MêðàɈ´þ«ÛibHúëF%î}!Õú¸™åhÒm×Ξ4΋¤’L‘a>_�¾˜Ü¶FY,m¤õ3[Eë66+›ÚÌ{¥ÈQaU–yÞ‰>žÚ?Ui›¹�Fº�‡¦Â#Xüi\ù;nçž.!KI%LJíúzÖäwÊFÇ‘ŸˆãK �ù2"nB±<š8ɲíáÒ»(¢Š(¤h¢(4S¥Eª¨¢Š)S¤èA½e�¶ÅˆÊ¨¶ ÑEQFôQA¢•EÅÑH¨aCRr&§us¡×ñjË't¬²…ˆäTMÃGð4¿âò>^Ï·wnLØ�–þ¢TI®¦` “µ`{´ ÛS°×ò‹ôÞ¯&eÆ4$ôÒNárVlH� #¤Ö¿Â’À‰¸?všëEÍÈÁF_ÀÖIÿ!� ä�™f9ˆãku˜ñˆ­(RLÚÿ*OÝ j )Bí©Ó}é·p€˜×OãMó…&bOÖ¹û6gÉ”¶Íón*×`É=-uÕ—(Ä/'ʲ~ñMÏ«ŒUþUãîí¡ƒøñ©^ì3G5�ÆÆ¯&R� yE¾f¸ã3ñÀÌÅÍÁõ™a*¦ó¥Ï�ò®œ}òdn$17‚#àL|j‡vÇ$@¾Ÿ��.ß,ãä=S%cõq�ʄmÀ´9Ž-"myùЦî8’84 íÊõX³.tW]<�fÝàYô9‚“HåÔÕ¶~,V½¬&ž<Ü×—"ƒc–ôgý$iº´O^$Æ”¿|BФÁw1Êb©û™ã$z»I®Fï‚YHRÁCH»3¹Þ*²÷l�Åq³éq3pz@¿–“[cÊ2(7¼jÔNñ\yy?qŒ°+ï ú–þκóe‘œèŸÖ°PÄ–f*5<ŠËtè§Â¶|åO…­·˜×çRýÒãU-bHýÇkÅ<‡ÜGS+*@ ú´ë±¬ÿãÉlfI?îeÔ͆F�ð¬ód÷]•[Ü•2cÈ��ërã1â†ãxûd�©7q�Ä ,4‹_¥aÿçoÛau!½ ´€zïm+Ÿ&E`¤°Û•ÁžžÖ@ßÚ\’ÿh dž\H3hdÞc]sc‹&SŠûˆTqà 8f€cÄ×F2=§-¼*q÷Xó9 + ^Ö´ùåŇ·tœ˜¼“Ä€ÏruŸÇBu®õe‘’~bÔ¸ž@l&zøò¬2ãÁÌ{¸Ã0•å;ùUœ‹„ ʯ�|ïjŽÞW>Aón`Á€8¢\ÄL©·J×¹l�ñ*hIç§ÙÁºÿwòšyò™Æàô´ïåM2$ò +DÅúÏ•r÷Ùö[‹9ZaI#Ñ‘fÒNºVÒ0ål…I, HéY#ã,m>UÍ€1Ç”ûdÉûXqŸH^‡q°6Òk¡Âá(#‘€ §z]–@QÌ0ˆ7F_ÒêtÚ´NñHåÅõˆ(Ó§•rçÉË6à)“Å­,� ­¡ gfÊ8 RñÀø{| ¶®ü@PˆØq‹E­\ Œ ¤ª2»Èå XÚMÅÌŠÕ»œjÜ€6·™�õ¦Ù‘P»*’Þ˜3R;¬%‚óY1o +ÑÝqŽL@äšËu�3V¸‘Xé¯Xª^çèÀ�$i¬k¦´ß>4™:\øyÔŽá9‰ÐØ|¾ŸÊ˜Ê€\O‡Θþã & 5“¥SåTN´±æL‹ÉM¼ˆÓΣw‹¸Ž�t0xŸ#¥l AÎ�Š“q­Œ|è9�v›¥&îq­‹\˜rGA½V,É–x™ƒhAñ²eLQÈĘr|*¹F�ºæ«ÌPÝÎ5ÜÜÆ„ކ“s"nuÂŒ�Î\A3}�éÿ:O›‰H:Ÿ:gºÆ Nñ0bw½iÈ Í �6ÄyÐù–cV 퇘œk¹UþúÖçÆ¹ÓÛÊ(#’}Ç¿X®|É� @º�·–=úW£­y½™Tí Ànoöм„Óîd¿Ã%^DÇ”Ë?¢å[‰†>šß¶d)è~`Zg–ž;ÐΜ¢DÚÓ{Ì•la™Dr€X ¦cáYöù ˰2лL( nÖÜÖ÷VXl\1™:kh¸ùÍ"‡+¥â$õ6ÞDÛz�>nw6^@Ž·˜µgÝb\XT(ˆ&bÚ«LÇSTL÷*E׋ÌiËý¸Ÿ˜§˜#âeE Èh±u"7¶šM_o�ç<ˆ#IñêZèÊ%t&ãO5ç¦C-�=ePAþ•é0O©·×£{l�伌„ÈñÌ,GÃá]8Y&HXk´v3¸�ÃY«ÇíâÆ °)I™û£}L¬W>Lø}§L…ˆ‚¬A Í>ä¨tmN†|« ÝÞ4î㜕Å�•ÿó?oÎ+\9#(RÁÌap,!³O”ÞÕÙ�×(•Ò§(P¼™¸�©˜3zçÆ2 &ÛÞ[�µ�æjòãLeXƒé :úl�ë|e’¿;Ö]ÎAŒ†vâ‚ìI`ldÛYøV-ŸµÆ„(p@¾Þ¯¯Ö§eÇ•¤¨V FüŒë¿—Žöú̾قV`cDôŸ¸ÏÂ<~5Þ¹ñ�×*ñʡ -%Šž¤òU½Nl¡³a úB™é<’'ëU��dÌI2ü óù×Cž@†`D�Äz@‰–éj0¶,‡’I‘3xúÕwÆ Ò­3`F¶žÕ¡ÆŒÊÅA+¡‹‰Ö)²‡ ê*}¤™â(ö“úGÊ®³öqßÒ.dÛSUí¯AG´°m-N#JÌàÆ[‘Už±�ƒO½CF’&©±#ýʘšMƒA* i#J<„PHÒDÅ]O¤ Pq«ýÊ u½œk¢�•FNÝJªƒ¨¶ûTãÔ°.TFÊ5é$×D ÑRÑ[�Q'x½6Ek� QÄ6¢iYÐPʤ‚@µ2 ì( +#J8�0šXÓ‚�3_òªŠ"‘N Z‚&ˆ¥E(  +qDQ¥Q@4‰®|=ÓdÍ“XâªÀÌÈfuÿáõ®‰ŠsDÒj$Q4M"w 7+Š|€0M"À šœ™x( L²�õ?�ßÜUc¸çWÈVxû„Ìœñ™ÿÄÁúÕ#ʆku¦¬à‚(9@‘C:¦¤ +`ƒDÓš(¢�EQA¢Š6¤h¦(¢ŠuÍÜq0%£�øÏ#åÆÿ*åÆ8÷#ˆâùÿõÁúšx»tîs�D‚9(&#έÐåÊ�Á*¼Ä´n¿ªA>QK¶Ä˜»¼ª¢?ÚÆ~o˜ÒqˆlLáÅÏæSã²Ç +¼ñŽ€EÇOÆ”cÃí'%�>>ŠÜãíã⼂ G1zñÚ´“°P•à[À›|+Ÿ³c“¶Ç‘¾æ\r`nùиɓR¸Öm$r¹1 mçmë·Ó¿‰½«A¥1E”Q½:CZ:SŠ[S¥¹ RØSÞ…¦h¥Ó¥ÄV±ÁË�@QoÇ�è(Ž%ÇíŽam£·+tòúÕŽÙ…¹I$üç_�,}®,N]Vˆ&I¶±:Ë/#”q˜u�Ä6†#X­ß +º°3êH$<Å$íѨƒ¨$¶ºýÓS�´Å�‹I$™,[_ú‰é¥4íq "I7$™¿‰£'i‹.EÈÀ–YÉv¶*›1ßmÈÐȤ¸°I$™7&ðcÀ˜¤¬ÉÜ’ÇêMKv¸Ý¹gþ¢È§Â¹`·BGåAÀ„AƒæWB~T“¶Ç�Æ …ˆ)§k‹U™6ñ�ä(^×Ì,OBEP€qf~u)ÛãÇȨ‚Ú™2~:ÒnÓ¯$H7'îgQµ3Ûãi¶³¹Þ©q n@Aˆø +º(¢(¢(¢ˆ¢Š(ÖŠ F”QE:TQDÑEQEPh¢§zª(§JƒE +)ÑJŠ)ÑJ�*(¢ƒEŠ)Ò¢ioOz[Ó¤t¥7 Ó64t�¨Þ•UNôö¤j©Ò¤oE@Ö™ Ò§EQFÔ(šF�¥:(Ò‚h¢‘ QéTÄDÞ‘ƒ¥UŽ´EéïST�)ëUJŠtE*\�14äè§J�(¢ˆ¢ˆŠ Ú•8Š"Š"Š+™�ÎA1Ä M‰¿ÆÊ—¼ÊÒÊ@ã$’8‰Û¬ÛüjW0rr`L^OÜ¿ôü<¦*›¼Ub +�6øÏ§îÛ¥ö­rl'¦ß:KÜRH6è ›O¦×¨îˆt“D·3a¡û�§ãZáĸ1ª(€ ÀPëêåhù‘Xbσ²  +©ÐBï1òªýêˆä¬³1#îÒ xΆõ¶<¡öƒÓ¥â²~äòeÆ…Š˜7ã ¾ºÕàI‹--öë øyÒLìI  @lgÃÂ¥»¦$ŒiËŒÉ'ˆ·N¿—�o� q#©`Ö±c|ŠÅAaI^Q&uÛíëü+LœH $é$ÇÌÌ +ƒÝ¦> +ÒYŒ@ L^QÍ—ÜFç–׈}:Öc.LŽ} ¼.`:ñ™êßJØæ–*¢H‰Û_Çâôð»ä°Z Í£{5Él&.bôÏ„Û{ÅK.<@8^0E€¹Ø yÖXò’Fb¬(U�Àròð�ºV™»·Ç!S“â&'ŹD é5Xóäp£ˆåÆZ¥ON½~U¶7.. �FÓcjªt¨§JŠ( ÑEQ4ë‘3$‘"Þp6©Ç”’ãŒir :¯øû´Æ²µ¶™�éþ¬ÿpŒW#¬¹ƒŒ?¯`t›_ëjÑÔ•cî2Ø ê!§‘‹™£,UllCIø1¼Ó¦rdL€Tñ cÈj[míòë]sÚ+)V`lfH1ý6þ&³|.E-§�o"Ë�ií//qWÔð’ѯúE@pÒÄñ$ü¢“�Ä, #œ� ¸¬òæÆÁ½2Þ™!dò=]MÀ­0©ÌÅÙ¤ˆ°ý&:?Å¢C#³/"'`8Í„Áø‹�<먰ƲÄ’N•†.ë\ŽªÂWî É*4&>Ý(ÇÜà�n +Á!��N›mø¶Xr°v”d(ŸQ(̳åN–š¬åÌ•md�Ó'”ÏÛÆÑIr2£ydžS “&zÎÖÐU ö †È<@& |+|9NQÊ Èw¸‘�rº!Áš3Ö Ic…²d` ° r9o'Ê¥»±‹Ò³4²‹±kÜù þB§´fŽDNF>¢H¿q +^Ø™�O€™�=|¨â Í. Ë” ˆ�é•�o4‚AP)ðGZ=µŽ0#H‹T”[4\¹qœY‹Œù$‚³Ä\YˆÜŸ¥^Ü.S�+'§Œ 鼋AÝ­]O]éÄëGA‰˜¦RŠšdTñZdSŠQN(¢Š("�#J)Ñ¢ƒ@âŠ(¢•:TiEéQOj)f¦�Šf‰¢Š( QES¥E´éPh Ph¬ògŇˆwUä@@’v¥:T +å9óÿ± <5éõ£v +ËŽB�Oê'ˆçjwR ¤@KkÖß�*¹püBˆµæŒÚ�}‹�0`‹Bègäiw…xfÇ•£`mz¬½Ã+D/äE¢&gÀÚ²n÷"¯#�Crq (s¼m>—¼(Ê©�œ˜Ò†A$ÇôþUXû–!¹¯ À‘*¦øØÇ�óå~-À;ò–ú>´³wYV=¬|çû¸üt6üEfÝÞRèA ¤ÿP;Æ Š¦îòs`Ò…W‘1Éš4¶—j²w…JY., ¤�L|�«|¬ªÍÇA?-ivÙ2:ž`D� É0böY Á3d,8¨ò&Þ�²ca}ü|Êã¨,ÊU%¸‘b"Õõ0)'{•Ô¿€…µ#‹@!X"ÞyûÌ�¾{ÛŒò´ :7Ó¥ßzØT/Ü ,dÇ´(=k£S•dˆ#X˜ëi²9²ä$㈙äH&amð3zg6Fâ¸ÔIÔ™…ú*´ÌZAŽCiüu¬ÿpèWÜ +¼Œ O"cå`Oò­nLUbDL×>nõ°¢†›‚f: ˜ÛÏa5x;œ™ʙؕ)?qKÞÏŒKªÁ±�˜�>"þ'vÁ&E…nýS�…†m±4dîr®B@4Pf\ß{ ¶—µtä–Qðñ¬2e8}¤X�3¯oþ4†|¯* ¢IØ™ €'ûzÕŒ¹aAPƒÊòª|4›ùS9Y–½¬T‘ƒ­qwm�Q™Gû˜‡¤Ö\v™Ð‰š×¹îrã†R I2`Péҵȹ›"²°¶,fuúGÇÂ'6lÀ�¥Vê%”´– [Ô¿�•t+’ ž•‹g~a}—�êôñSô®\x0Ê2b 7 #Ô mÕŒHjéos$/Çá¿ó®r¹Ù™[ùG Ї‹ýÓÈ |+EL¸ó±Hc<¤QÌúz|i÷¨î�UK\›GB7"ž2áØœmÈ>ŸéQ×§8Ë‘ #It0JØ)RbÿÛó¬›&LyqŒ’B‚$°¹>öÖºÐd`ILØúÁ4±{˜Ô'�/#ˆ²øÌFÕrÀÄØÄÛçYfÆã(È«ÊÀD�Ë_õT~Û#å.òt‹úVé#îš�‡18K Ù{ÅÖß1]YCd^  �¨íÀC, 1yÔÍbøò³±áÔÁ�Bíÿi©\Y ñN çl,-V¸ –^W�pblxÁ6ÒßJϸß.'ÄTCu3÷ÎÆ4ž·úWC �(- ÀÄßáÒ¶Çȯ¨z ¾5ˆL˜Øñ©�O†¿áñš?ÝPL\¿„ÅHÆÊç/ÈǦE´“òåSŸ ÷#�-±Ù—ÿ•."_b‚xØxßI?‹ÕnÁ]Õyëkñ ã1Ô�µ«)3ÄE¬Mõ¿ZY#¬qýcÒ3XåíòäĘà% õ8ÙXñ�‡�6Àîà”ýr'‰Õt¸1qü¦ºÌˆ´õ®l˜rä|l@Ûòû½.ŸºhLy±seU%¦Å L’/ÏKxÑíeÌäUx†,¼¶¼/åX÷G6c… ½ØÂˆ,v¨nì$rV; ¾47zˆìŒqPÄÅ‚™þTÓ¼Wn![{Ťm=|©dÊL~£ê1¥�˜ÿÄÕ>~&±êD[æj[¼UPʬÂ$Ä#[ò"¨¯½ ,"Lñ�ò¤P®C““H&Ö›�ãÓέ³„Aˆm«Vä"< sgîIG �õZÿ +Ñ`@£“A äÆV?™ªLáÜ©À‰ƒ=�¬Ûº +¼‚–¨�üÈ«^åY¸€fÿHþu)݇V!ZT€V.D�c~´ÿtª.æ¤�|tªýÎ?\�8 bl{“á—ZC<�-ÖE!܆-ØïæDÆ»|ieîx +$yq™òªnä$=Fmäc]/µ^¾êÏ·"��®ÕdÖ2 «¡ŽCxÐÿŸ:¸¸¬\ÀÓ®— ÷V6¸Déü~•-Ý•YàL�-{òâ~òªNç”,C^VDˆòó†|Þê)<Ö Ø‘ö̃§øùVÙ{’„*¯3ÐÑ'Õ½VNà"3�aD›"z~U¸È¥Cb>£¬_ú§‰ùFïÞÄ�0&CjEÖ,-jéšÏ&`‘ÔØ¦¥34°e‚¢`™é¿ÒŒ]׸Ê#î–X‰û€ãõ¯ÿÙendstream +endobj +102 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 8 /Subtype /Image /Width 120 /Length 389 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ xÿÄ?!1"AQa‘¡ðq�ÁrÿÚ?è9ñ¹ðcžXÅœ+(·²ÂGw‹­8óeçÆdKU¢Ú»v_f»h_�3"1‘6Ç’j îzëy*Ät3OŸÐijÖí-ø¶©‘$ɰ1»~/HËs²½Þµ \¸èG�Ë’ÖÛµßS�.iËxд¬Ö´yèןÝb�{'!�÷cI†1>DäU_œgèÖ™ÌÇJU[k.Os)Uò +U¥Mëôj™sg†ÂG§J‹ÊT´hi3çaóX‰n eåӤ善kÞ´Xï÷5ÿÙendstream +endobj +103 0 obj +<< /Filter /FlateDecode /Length 6139 >> +stream +H‰œWËn#ÇÝó+Ù„Ôåz?0ÛBœq²p0Üi‚€"[ ’­!)kä…¿=çvWU»)ɉÐŒÕUç>Ϲ·¾Ì„”Ì{ιgRp!½¯jθ6Q ÁŒ¤ïª’R1m¬‘ÎUÎ+Éœ Þx]­v³o?îxuÝÎþ5û2†)‹+Ü’K+-×=¤ÊùÊ1ëBÒUÚà·ÎX)må\ðÌ'­•Q$Ä@HÂja´è�"haI8Ïðw@@•ÓVÚàÚ%çd‚RF`ÝuΙÀƒSdügñ]iË”—:H�x¹¥3ÁK!U†äÈœ²ƒ”FYBÜpc}eÓŸ¥ +¢°�ü…�ŠyÍ•JÑꄳœJ"<á9ï‚Õ¯”DkÉ‚åJ¸¶ž)®|Ž�&A:Ë‘+A‰D”ì!¹5V jæ‚¶ªrŠ9+E€qTitÊYñìÿ^beó2X‰¨´§(pÂED—“˜=¼ Å]îD…oÙ¢ñ=‹4ŠÐ—Ú e)é=¤O�hWN˜ªÃTA¡x—ƒB28.…Có8n˜AKg"bxÇI�–®’N2Kß:'•…F.§¢óÜ×€*Sö1pÔ£¥+dz҆`fŠAù¨}µ!À€\ëWbÖÌ'D×!´…E™2dfŒLPP6ti”çºþÖZSyÍ4ÕÚ ÖŠœ´Þ@J¹GmEfLÖ+yé�2ðGÈ&ꥈ3Òz+,a:4¤4<ø„©ß©Í©�‚°Ù!7]@Æ,ÜÌ‘›w“ tã!àeW…Ó µð�›$ªZ‡Äaß…œ\Ã� ƒ?h"dÓaI#f¦Ž»Sßq(¨†vE×Ð@œÝÔºSÚDEG¿�¦OÔ™;Â2ˆ�Ô2˜Ø™L4 +â©Q° Ñê&{™¹CÕ­îgÆòÂÙ€4R.jÁ$ â‹v…¨3ȰCÄvFZ“h)#�àŸ'é~îg¢ÚT³ï³oâ?¼ÕânÖu$i±ªxµxÆ�jq¬§¿«Tµ8 ýø-Ž#�`¿ôPb¨/4Á †Î Õb7›ÿ}yX?/MõÍâ—'8 YwºžÍ¿[­šmsXžÚÃñnsè‘¢pByº+&š«4GüÈÐ÷›¶ûý6CÄ8x¼L.Foñ/­ 1À�0>î–÷ÑÓýy”ÜGKšÑÅŸíïÍñx·ÿýK¼.¡=åOd™¼’C` +“bì[e\òK#ObNð‹åí¶È ®øáŠ7L«.ïåÙïÈ"/ØÁîBÜòç·n柖»G2¥ÃüÇÃò¥>®–ô¿ÿ^ü”Mçc—ûõÛæ¥Ð4cÕèÞí¶í› ¦±f¡×9¨@½²�™¥iÜuÏͼ/—sóO›ßšct“æj “¡³01¯ºP9éö²uÝ®žvÍþ48Úß‚¶ëÔž‹—ÇÜñs݇_ôJÁvùéøo“SÝ¡ 4”$xO_þ±Ù¶·/'rùÜ8t1s£½Ë�èz +0jÉþãõò´œzd—°he³/Z¦ˆêçÍ×f;º,™QÉ￵‡Ýp³†ó¾Œ÷óüºYµ»Ç¾Yþ&Ç EG˜Ӄ­û\ÐìÉ™—ꌗ©—šÉáÍ}gñ/#"µ¾æ›w¢©TaŒU7¾—lÙÅž!R��”„«±ï²È¿�ÓûЧ¯·›ÓP½\ ZŠco>6èäÚêÞRß›Ý8„–“ë¬ß€eŸTôôÈX�U‚V?ʼS=æ}AI%盾ÿ²1¶—k\Á$¨׳¹‰QðÞf¡‚1ãÊ�tà�‚Å$2ãkv%"iÖž†áÙqs)Q^Oó<®¾gÑßÉ™�IÎàý¥ú�Žm"ÛµNyõÿ«寖 ¿TéŒ0>õÂ&��’ý‰T‹õ�¨) ظ*‘2@ÚßâÁ´@n|ïryÞçA*`į̀"x8\èÿŒ›sÛ§vœz—Sö˜5¨ÆsBû?�o›}.òÝÿ𒬻O©¼˜ã<Å-eXÑ“ ÁbSæ� üw–a<“úF+oâÌ$2Ï�Í~õpUŽ�?Ñ>õ:wÖ�›IeÊ¿Wìÿ¤fƒÈ8=1W OµÒY!|n�àSIòàèþ¤X ºEuø·Ýç³ßŠN·Ý›ÀÓ[0¾Kæ§æWl„y@IÝé¥ÂÜ7‰·Ëí}{ØœvˆSòù]ò­Î[ Ë!!íî"õeDLmÓbhÖÈͼÛYsÀø ª¯Â›õy³n¶/yŽJÙƒâÍ>a<è�â% “[§ö´ýpzaé 6¥Øê.A|w9M;gtzNÛ ümÊ]Kö[„:7_BPÖÆMÀ‰äÁC3ÁÇë1qôÐüºiŸŽ#€ Å;ÒáYØ�<6+ò¤oVpK†©�è[i`×O#pÊOò5ÙµûÑ}Í轫־ö¢«ð~¹- +†ȳg•R)“é}B3×ö/¬TåA?±Ê�åhs¥×–ÁäRxÔö;ì?þõÏã¨Ç�â34½]>ž°MâÅtÌRd¢ˆA¬ì}2yASS“`L€~TµØª«œ]Ô«»¯†N…Ã’íIÍÎîþ僪åõ0³õù¬:D"Íi)8ÃHKqñ˜Ãy¥T¯É z7¢�z1>ø<ÿ /zñzNñÌŠ/¡3¤ç‡Íê!%²=JUÒRuŠÈ;ü¦‹a;–Œ‰I®ŠÎbqñ†˜O*¢mß>µv¾||<´Kò$)UŒÃ1—ùþËÓ„(oüus\6·ÍšM)ïŠõ}Bj씑ÙÀÀH¨I=j]â„0ªäÄzé!©45baÿ¶«]szh×W¿÷½áô@ë¡ ^c‰�IÑG€,±Y¤Ͳ{4A‚øüð´ÒÓ#ØPHÓÍ|ÛìïO¸äìüîÐî +�ÀöëMv`;Q*´f¹®dÑÞÇ•$¨œ¸©P‹ 2›±�Lcà¸Ü�U˜^ŠÉ1¬ûc ”LäwÈv³o†nÈžq•|œzÆ�yÖ ŸE‘oæ§ç¶>«t-¥ŽE=^åÔG“‹‰÷oìƒ{­ÖÑ1ÍlÞaŽíîB'B{'Óà9Á¿ñ|BYRnË–AùËŽ‰6 “6y�;å Naµ”oÄ唲.�1�¨µ�<ãJt”¦® æ¬BÀ®­‹�R‡ÐõÄDf07rOmÆÃ�£x™·Ëí±�Ñóæër,’›LKOŒæS;tîÀ‰ÜØ«v=)δ†7óCC«–ª’¾T%‹ÃæR•âf˜=Jcç¬ñ²2b±“¡ÜÇžÚíX% Ò]`â@Ô¼LQÖ ·(ÒàC©›Ëq6ú¥»¿þ§is�Æy™T"¾!DŽùªœFŸˆj¯B­²dè°4&v³7WF›|yeeÄî,Þ’³L‚.‰W#ãÝÂÜ.2¹:®V�§²þËxÕôHŠÑ¿Òò©,u•I2“ïiµšµFÚ][š‘m©CÑÕ¨)¨ª{Ëÿv¿2òƒšÑ^Z=Ó�DF¼xsÒYnõü<Ö/¢‘©M´�nw’^"Ì*Ç«ÄÃå’¿’ ˜œì‰‚¸HMÁþùÇì’ä•,Vðú¢'�ŠnŠH¢™-^êÕ•ÒGï#ùšEÓÏÇ…ý×å‘ÑÖ1Áµä†,lp†£‡uB°‰³mén<Ï‚ ¶X&¢j/*A×Ñ0o\§zX4j¦ýrÃÏmSm•Íe2 ª (ÉWZ>((±µ)_«qýŒSæòøVvûp/SˆˆÍ¯�‚:‰íŸ¿ã 8Ã/+©7/»í,6Û»´¡®Úk7µeWÝbIÁ „Ž5 +v˜IA*Ä’}bŸ¤©Ë>Ž2Yj +\@R3ÔÓuèÐ]¡,M]¦kZ24H³u …p<×cC¡3š�„<Ùr¦>¾Y +Ü‹ º^pÉðÖt'¿ž$çzÆÛ8Õ°*{% °wî‡Ûc\ŒCíK=»™§|Ù¹ÌY�±p&ó}–5T>—’Y¿9uÍsΜÚiËò÷GœÞ¿Å|,Ñ#‹Î®Æ ¯:ÎsûÄ4”Ýxé‡xfä7’ÀJï.õðÜg`ruœD'¨Åû9œ|¶šYu†fº&>üB¤šs R5Š\Ÿå® Ú÷âìµ?†Ñô9ª>MÔƒÿï(tÚ>þSß�¸0Ë2œT´÷s½€ ›ß¤Î"#%Eô3P#L¶D¿Ï´R¸Îï•ò›Lÿôo&¸ÓhÆÒ3E¹½Hæuæ�„øFëz‡ A§¶³kbI¥+ɇPmÀØc̆Ú—º*ç\»~k±ò ù‰Ft?´§ê°U'ÎåPùŒ¥ +‹å¡³Dz×]=�H'ro™Ü�S?ÔGîÜ*ð^ö³«µ!|0eÞÛ4ÄŽ~Ïý»1øÌ”CÙJ +xœl¸t5T©=ð­©Þ«‰æZ²ï\¿Wë*ºùî½�££”îönvC*ßMm_]áU§1>ØÙS›óµãÖÈJí-„%ù¦…Y"ãÞÆ­Þ/ÏM?Ó>м=åe¹Úîé�D7½„íÂ# —]S0:“ˆÀ;²ƒJ¥ž/´O•�žx’Q53ò‘kè7ý 3$°LBìµ1Kfú㵚°\1^6â¬9\œž0½4£™¢¸TŒEÊŒøÃÿ¦x NÊ¢¤«ëc¬z´«: DØ “ Ñe�/õwö” D´jÎv~½6Õ+Ai/²|÷<ôg†á¢Ô>íôÝöc…�¸#VŸWy#î!rh8 Q˜ÈÒÀñÎë÷ר|AÞ©º­//s•”0Ë Ò,ï¬V�!¸dÚ�ïõ0cžÉì*„âaôã|%sáETÊwÚŸÍK¹1Ò«¼$Íù\›-WÂ! 鸢v˸tÝ ,®qkk ¹úN㸭N,‰(~„%Ð?~‚’t„Ž}šê(õ9^)ÑŽ¬‚û úHÖ²©|]& Hâ$Vhû\ÛÏ=70ºÍyóYuPìrþ@"{òÝ²ÒØ‹é½®}ÿ †áO/Ü2‚2A¬zi7òœtÂa›Î9öæ‹d¥­5*‡:œ#Á؈�Ã{ŸKˆ•—wÛr8q@r ¤¬­ßý륎 +Â_°¬ú¡qN|Ú°ÔÕK×|½Ö1Û¨?ÃÛ75Lu¸ü1æO'섚£±h!òº]�CÛèh‰°¾v¶tŸ¥²ƒdj¹oŒ°m·Î>6uމ­´Ï×3Ù/¼ÿ 2$=N£˜W/�l'æç· +a eI’FOŸëSùå¶Ùrp*Ä¢T­"︗©§d^W´tYªeâe¢ÂÒÝ=F• –òÝû�'Þ¸3Zgk¢kiÐ|ý5(€®%çkéÄëÚ½VHMI6xçµi{j…5ÔXcŸšÙG4î äíqÄ™‚“ÄBa| x7ö^~nEgèx,ŠÃ¥;og¶81Üû{¼Ë¼»ž¿Ô×Ç’{ŽR¾(ºèz)«×š¨v_|±œè7í‹÷Æ +ñ=GÀ¸AÞ›5œáÊjèǘ$¼EZ}ë>30/Ó{?¼>Æ ¦H©Ð(Ÿšg0/ +«‹åˆ°~ ëh‘OªågW݈̰¹[^Ä ±Àuu…„Ô$ÉÖ鄌deFw|ÔÖ‹pÿ=§ÊvÑ/–W[Ü™k*ìš)p“RX¥ï‡ÖxÅäŒ,Ž}v‚L’e;n �ù{¡“x²d–m&ë-`<¥‚åŠ7ÐÇIšD®å/ŸÅ²ìÖ³Õ`G¼&9dêÁ¨Ü YÆá·ÔúÖwÆc0]ƒé‡GÄãaX¢Ÿ©¾¿} &7%où×+N0*ŸÀ]„¢må\âïk +ûÜ6(õÒõ {ȦûÖ_7…äôf9‰.alÊÜuýûF6½u‚;¾“>ŠÜW¬lT7Ý6uA0Vo.4 c‰–‡¤°ˆiø"ÎçÊí0¶t 7Wó,ô‘,*±;‚:ßš½ïˆ!â8Ð[²þ:¶·¨Œ�sÌxñ”›ªòÔkª—o×T`(û„—¢ø2n ßrC©ÜÐ!nåL»‰ñ'÷á­ŽÁ�J¥è{3½l."3öÈ�¡D§2ÏF>Æn–"It<®�ì��‘»Óù禭cÙƒe¬M0×ãÔ´­;Ûoë쟇­Av0�„ÒM²„ +l†;�#åÔ¿OþœÈP•›}ÔÌÂõ×kóV¶‘‚äêÌ‚µú{ß¿ÕÃcT1¹a±=÷$õ{•J+·ô¯¬ 3õUߎ^DPv)ÛæÜlaš¥©Q³:D”d‰R¶¶Åxø\{ð} Ní„�kâæpZ}¢” ‹Ý¹„1½žãþk°ºÝ²ÈA9zÍc‰�\ÓnöžqS=ìšC}ˆ“ :—±ŽvþÜ +H^á£Ôƒp5x�@VôÛ!”_ÍY3_6dI-6[å•mŒ=œ›¡É ‰?U��‘û£eÕ,À}¾™Û�êiÜÔÁ[ú´;6oÍ‘¸kŸª!œÈC¿¶Ssi7™Î[·^VÍ"W‹iÈVå/¹¡´+ ÉÏI“ã0{þ�Óµq ·É¾¸:ÁK+m¯‘�uhχzô©H‹B^ƒ„âá’Ðå¶>žÎ³”Š‚PY"ë½’¶ À¨‘TZ/Ê~™ªŸ*ï&„ŠÍ›·=  BEÛãU˜ +&Zw+Ä&öå3|ã•ôã>5²gzb0ÈŒ>a«sV€™þËuŒ ¾ÃÖŒ©0ø<(Êú +£)á�ö›É²ZðZÖÝiz¹E›'16æð”%åE‹Ìïò�á4ÖÔ·¹3êÌ :¡�]ä�HˆIgÐ}üõÇ¿}xø3òÐ?>þûÃ/Ÿ–êè$¹œT,h§“Òä ñ«P¨*Ÿñ‹@’É|Æý™=óZ‚ÿõÔÈ5ä†LòòÊßûà( ²8¦ÈO?ýøÛüw EÛ&üòq})¸!>!Sìp}àçùQ¿©ÈÐуöîë ëú•ë¸óoRÁÆgˆ&Í$®ÿS^%»mÃ@ôޯȭ—B!G\O�UÓØA¤ —\ŒF öÿ÷q“HIm‘‹¼ÎöøæÍP+ïæk;!®MÑXßP- RØ5Õ¦Ò¾j*Æf™’0Um}¦ù__¿·}3°Äuž 0ø·¦bS’l™Ã ”Ÿ  QõBFÈé�á4$C8âü%\F»Ð:!ÇÉS�jÈy=Ö:ßí vÄ7òN'QUî•ɉ‡š ‰k.¦‰;ª›…]ÿ\mÇ¿RXt›òPƒ'êÿ™xÕ.³�ëb`]„Ãd‰”›¾½ý+ CÚŽ\*p/iÄfÿøôÜt]³Å|²ø¸mºL9ÃAƒJ$’H·»Aã¯UšJ«\Öm2Øìw}»{Ù¿tS©l^¬Û¾Øi†¥¢ëŸ›ÕcŒYK|�=£2Ʀv®¥ +W;žÆ²ç£J[kQ=©qžß߯Ù*54sœæ®£ÃP˜µãˆ"½L¸É? ¶>^ο§Áj•.¨iì´Åæ�#s6@™_˜ hËüQc¯µñ©>Èi"a™Qè +M>Ãíñýx¹ž¦R9š'ÆüN ÛÞ_Ü~²«“M»‘ïtN˜ˆ˜M»çëGBÅ5heTUÏx®Üæ>‹ùz9}›v +€ã”NBÜ-d Kt餺›�ð“ÂZHE(×°Ò~wÎnaƒ¦PŽ/å,ÒñW4G‰Ðã èÞ@±”¦É.,•ëkxG5PP³R¹µ|¡XÃT‘{X +$K›@é£öšþË3w!}endstream +endobj +104 0 obj +<< /BaseFont /Times-BoldItalic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +105 0 obj +<< /BaseFont /Times-Italic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +106 0 obj +<< /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +107 0 obj +<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +108 0 obj +<< /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +109 0 obj +<< /BaseFont /Times-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +110 0 obj +<< /BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +111 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 12 /Subtype /Image /Width 128 /Length 247 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ  €ÿÄ3!1QAaÿÚ?ê}Ô�úUu8Ïèw�ƒ·GwóÜ–¶vŸ$Ð ê>™éîn&¿¨v^åá”Ia“ØåDPi9^‘Umì©%¢‚@ŒÈŒˆ[ '°’DuLÿÙendstream +endobj +112 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 16 /Subtype /Image /Width 32 /Length 301 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  ÿÄ<!1QAaq�±"B‘‚#ÿÚ?ïU{TȪ�™Æo¹¨ ÝIˆÞµò,��˰·#ÉBE`fx º1‡.0˜ìWUX?Q} cÌÏ�_Û5ØÁøþ¦WóOmfL\Ââc`xàN¦d” {”ýƒA~DSÓÛT¿i�#®B  ‚FÓ¼îwÓmÚ‘¯ÿÙendstream +endobj +113 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 568 /Subtype /Image /Width 8 /Length 387 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ 8ÿÄ0q3�2ÿÚ?ÒèÇ‘F<Š1äP�\P�\P�\”<+ŠÅ +壸£¸£¸¡¸£Eò(Ç‘F<Š1«Š1äQ�"ŒycÉhÇ•cÊŠQeE(²¢”YQJ,¨¥:ŠQeE(‘Ô´¢GQJ$u¢GQJ$u¢AJ$uâLŠq!iÄ‚œH)Ä„§œH*D‚¤H*D‚¤H*D‚¤ZŠ‘jZ±j*Ũ­¬ZÑj¼z°¯¬8G«„z°á¬8G«êÄz°ããVBññ« åãVAËÆ¬ƒŸ�Y/²~5d.žQ�ÿÙendstream +endobj +114 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 24 /Subtype /Image /Width 32 /Length 238 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  ÿÄ@ q‚ÒD1QÁ"â3“ÿÚ?êQÔЄ¸;m¨&! ÞðáXOz�®�…P›ö͇N›|ª£þ‡2®6ÅÔ£ô¨ÆQÞAuÿÙendstream +endobj +115 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 8 /Subtype /Image /Width 112 /Length 245 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ pÿÄ6‘R’SQÑCBÿÚ?ÓsºÜÑêÕ›×?XõæuÏÕš‚ràäf Œ¸9¨'*FÔ$vb½µ +ÈŠöÔ+"#ûmBw£½µ +ÞŽáTî²áUn2áT‡·È_ÿÙendstream +endobj +116 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 176 /Subtype /Image /Width 40 /Length 756 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ °(ÿÄO !1Qaq’A�‘Ñ"Bbr#±2‚²sð¡ÁRCS$ÿÚ?ôÿICúáºÈ°ç© +µ)DÝ}š§L®çBˆhS§ZÑ,à‘©O ëïAÕŲñhŒR•ÃIÒN…z"Éš-V›h?4vP¥Òœ´^N€8à­‹nX*Ó,özš¶1ð�©P‡n 4z"Å›˜§V™%ƒššº15‰Rƶ1ýºÎµ`˜<�©Å·‘JÉ›8jBF2 D»DÊÜtÚÀ +“š…BbDÚΤ­ü•¾ž­ãΞž­és§¥§ÚÞ—:�KOµ½.u>šg¿.uVÂZr�·–ý +ôP¥WN3‹â“ÛeŒÁ…úmV"""‚@½JÀiÇ$I…;ZR2rL¥{pžS³U� ( ò”‹Je¹M±Ù`½¬Ugñxù` ÷¦ñŒ}ì¾Õ4)â•APY"§&–øž×ê�Vh[jLS‰‘ 0w7 ªšyQ Žd@¸àæ½M¬hŒŽa #±‚êµÖb\ÜE„>‚ eÀŒ†) Ä¿K‰®Q °�ÎÙ?µ^ˆ –¢%Ãé]".*9ÎG' +í¶D½—6ÅÚ"ær SÀ(‹gÏÌÒ£x�›?†Êczß…mDE‹íþo‰˜?Ë.�Ò‡FGÞø–ÔE�î3"�¥Ó¬|8ž‹Þ#»J×r”E†?èÎÊ]ZÂ>¥F‘ä‹o¹A,l…)R¢ ÃNdÎz¥3ˆŽ+¸–¤E‹?çJ–\uåŠ_N›J\§ xÖÔD_ÿÙendstream +endobj +117 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 104 /Subtype /Image /Width 24 /Length 384 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ hÿÄH "!1qRÂ�¡Áb’£Q‘±Br¢²Ò#ÃÿÚ?é°NçË4n¦ +SeÍ/MR†Ü¯q4øêýA1Hsà»·w¤HÏXÜLRþ ›33Ìü{ÉŠCæ™-%p÷®)ž±ãìLRÂ*ù{Ì–°¸ç1¶ºi•%H|· NfÄ’7£]Ú½TLR¦îYßk†‡1£Ú +b�Û‚ùÝø[å¹ßzb�î0][¿k‰ˆkþ´Å!ó "ìÍÎx{ÉŠCæ ÿÄgkK†–bìK¡jÔn\ý{HIÏÃh?=kÿÙendstream +endobj +118 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 32 /Subtype /Image /Width 8 /Length 210 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  ÿÄ5!1sQaCÿÚ?ÔFêÈʶ&rÛĨ`}»�;[Üi°j*©nqÈœŒ¡çSw(ŸS ÿÙendstream +endobj +119 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 80 /Subtype /Image /Width 112 /Length 584 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ PpÿÄK +!1AQRaq�¡±Á2rÒð‘"’áB‚²3³ÿÚ?ú¦#ˆÇa•–Åó ËR_?ÀòÝÍQ�Üý&o^à‡Þý&o_à‡Þý‰O4Ý»tÛî:ÿYB­14;÷38eè–»�þ…ùŸW>‚°3š¶ªú±dßçžeÖýk…´ð~w¯›G9X“ÍJìœ2éI¬%7üpõ>EÒÑÒÆV6[“nszg/2عÜÚŠ«$Ü»œÆåmÛàOëŸ�­ ‘t½Ei$¨�×sOyÛ³ùëà‡™÷i6ÎUB^åÇ¿r”Þz¹"µ/†P rQUn„´½›Ó[P}%éíæ*IEQ ïf·%íÛ[óáZ#Ë'©uìFZË=årëßšÑÃ*ïÓØR»s7…ªÂm}Rò'ûŸFÒ¨ÅEQ€Æþf6(±”Ÿ†+Kãnƒ”ró¿-ëïê­§ô-•â}]¥`<Ìó Ç.“IÑÜ~åâ}]‡[hX«Ur~)> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ pÿÄK !1“QÓTAq�"S¡ÑBa‘2Rb¢ÒâãÿÚ?ôASª5´tù³á#}Ôý >tø(Þõ?CO�>7ÝO—¡Ÿ. +7½OÐÓçO„�÷SåègK„�ÿSåègK‚�ÿSå¨çË„­Ç?È~5'¸×òÔó¿Í1¨Öö飛ýS÷:ÎXfâ�q«åÆ`ù&5:®Ý7 �JÔé69½ÎYÐkSÄ1â/æm¬�J�¥)ÈD É,Ð.¹ÖÔRÓ‡«8Àm‘Õ#!Ie™ÔŒ?½m 2œ`ÎYËõ¤!M«¢p¼D±JÂdÑAš×Ä#µ"'9‚ØA�¥üÃ`ß JsÂiÈßõbo)$}6Ø«ÊmP¨ï1¸_+MÁv£F 06}ÉVˆ¨0·e—)jÔŽž�Ðp `oÂuʘ D¹‘/Ø@]',%‰nÁz’5Lç(ÉÜ_]þÏÒ­_ÿÙendstream +endobj +121 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 5 /Subtype /Image /Width 368 /Length 525 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ pÿÄHS“Ó’‘ÒãTD!Ñ1�‚ÿÚ?çøÛÈVCiøão!Y §à +cê(Þ6˜úŠ7�„&>¢�ãa �¨£xØBcê(Þ6˜úŠ7�„&>¢�ãa �¨£xØBcê(Þ6˜úŠ7�„LÇ´Q¼l!1íoL{EÆÂÑFñ°„Ç´RºlA1í$®›L{I+¦ÄRJé± ˜ò’WMˆ&<¤•Ób �)%tØ‚cÊI]6!ï)%t؃yÝ$®›o;¤•Ób çt’ºlC^ülþº;MÂ'ã!Ü#´Ü#ao»¤•ÓbŸ×£›y"`ÃÓÙ5ÕÉ‚=›]\�è#ÙµÕɆ0ö�µrEºCö�µrDôÇíkŽ*�³}qÄ-Ó©Ú·×B½"‘öÍõGtªvÍõGñ?à<¯vž£ð‹Cð/+vMGáH~äÒ�ÕÑ#ü�öÃoé(zRÇ÷7ØÿÙendstream +endobj +122 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 5 /Subtype /Image /Width 296 /Length 547 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ("ÿÄc‘ÑSR¡¢1ABc!ÿÚ ?÷²в|ªr}U’|«@ Îú\nü·ÍŒ/Ñ£_Ù¾@ è‘òm�>M¢€0‡C�“h¤èQòmC¡GÉ´QУäÚ(tù¶Š: |ÛEè1óm�>m¢€0‚ý>m¢“ 3›h  "köómšý¹Ea×É‘”RkÔÈÊ(šóú2ŠMx¹Ea]»+(¶&ºvXè¶a]?,~lMrü±ù°k™2ÇE±5Ì™có`×e�͉®%ËÀ "k‰rÇæÃ\Mš?6a o6hý¬Mq>hý¬œ"kyóEía­ç͵€„5¼ù¢ö°“„ÿÙendstream +endobj +123 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 32 /Subtype /Image /Width 200 /Length 1086 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  ÈÿÄF!1AQqa�‘¡"±ðÁÑ2Rr²ÿÚ?úòq‘cÇoœOâ„îq¸Ü­"úxXúEèNç†3MäÓ­ÉÆi$›‚uˆªÇ�2ÈY±ƒ ®�k<}ÀÚK0±‰1ýmM;¬nÛA3¦†Cieï1ab¤’EȶÐyÀµhs&ÐÀÈ"D^G•eÛå|®òÀ‘„+H·ŒyWMc—!V  !˜´XŽ>tcvPßa4:ZšçG1q&‚³Ç�,�Æà×NWM˜Ì­‚^DFôããuHøÛ#†Ü6¾<¿?¸¶ŠÉñe5ƒ1ŸZôÏ�³g*ÀËfÛpé]Øò ªf0Aô7¨ÊÙCj>@ÍÁÒÞ·®\HFôÚ«‰ h´ÞÆÐm§ ãm³ÎP£o¯ú˜±ä`ÖNF\�Ì”`üFÂÒ@ç&ýi…Ñi 1w€u™caÒý*þ.ÀµÌ4x©Ž•x1¦$Ú“™'þ«ójíf¡–y¿ÃÚñU™ÆåqNÙ%’¾”“bâUÕvíøˆÜ#O +{—(hÜC!oKÖy];ˆPÀ…a¾’>:xF³Tɉ¶¼<Á�,¼/"ÞõJ6²ÍäÚÄÜÍ;6ã]AáD + r£håKhÒ=£X¥´röƒÂ‚±½F”DÐi@P €)l^CÒ�£Xj +‚ª¤DÒTT ájp5¤È¯€1ÌS +JŠ“´:À¦ f½Æ'«©X Å?¹?ÈzÐÙ±¤u¤�&«zÚúéBº¾„”Ù‚‰&*~ĘÜ-ãHå^O ÑöþæÚ®@©w! Ü@0&$òšjH"'Ò˜`Ú¢b�`LMé}‹1"zÓ.ª`‘=hgTÄ´Õƒ ”šbÑ>5'!URF±4Û" %ˆÎÕ@‚$RWW�¤äh¤í‘<¦õÿÙendstream +endobj +124 0 obj +<< /BitsPerComponent 1 /DecodeParms << /Columns 2336 /K -1 >> /Filter /CCITTFaxDecode /Height 3114 /ImageMask true /Subtype /Image /Width 2336 /Length 56323 >> +stream +þS ÎZÀ¨Ü;5Œ’¤ÊÀ§ay«7¬¢;ÅH«íc +âTÃ8Š;T(3µªÐi×V¤ý®Âhû]V´wCÝÕ÷_¥þŸ]-úI/ªø×¥�õ®¿¯þIU„ÔêˆèÔ�z�üªVCÕ%\ï×ÕI³‘¤!M¤z(gf{ á0`ˆ´�`�z ¡ „?å^Á�œŽŠ›¬Í…#ÇÌ�’ã:„Ò4gŒñpHŽˆùªžŽEj˲x�’ œŒÙ›>dãÕké¤ê¸Fʪ¶–´hh&è$ÃUFÈdÇ �jš+`‹¤†àý%­š„aØ"óZ…Gz…JgÇT©„l9 †ÑN× +�„ۧ𓪄qõ¥ª¤Ýi8A:Mª[¨ASŠVê½A6át({ˆIµAu®Š�”zL%½URm&ÒlöØ …ý)WT"žŽétºZ8ôw¥®•.—¥‚)èïK¤›w£Ž•­lOGz—Tõ°Žé-/P–––ªÒô‘OE:JÒiukpFïKW¡Iiii*þ¤º¥Tµ–—KJ’U]+ÇKJ*¢*ºKKKJªª’Ö’×KT’�ÒmE/Æ$©uõT�Å*ª§¥­!K®•u¥¡J´½Fê›|ÒÓcÕ$«�¡J«Zø ’A +é$·ŠÔR¯–E*I(ª¤–7I%ªT–´’­U�j½+k¯b© ¡iWÒQt½~ñ®¿ÒÕuê’ªK¥ªT’Õj½7ýSõëªT’�%Kê’&!zT•·P«ZI*ꪺ]iEéi.Z¥úúJ»i*KT–¾ºúÒ +´—Tzë×Ò¥ëª×ÈäŽÿR9y´ºIvëÿÿ×_ú¤ºT _ò8Ûo__ëI-*¥J„F†¼ŠBˆ$µ^©µõ^¿]*¥ZUW\zô¸+nªžª´ÿ¯_RÒ'®^¹uÒöúJ«T©*­V©´¾—‹¶º¶–©At•q×IWéõàŽ:­$Ÿÿÿõ§þª� +é*ý¶ô©A/éz¥˜Uª‚)ÕýiifoëI%Z£kI*ÏuFÖ–«S¸_õï×  ºé)…é*¨EK fÙšK³?3ó?0¬Ïô•U-*$n¿Õ)…¯^a*Y……K¬ÂüµÍ<ÍY�Ô¿JaXÒ­-$´©-t´•-ÒKt´›¥]*Ò¤´º[öÒ­uÒmiRÒT–ºZ\âXv}-:M¥ª}þºßô¡ñQZ JÒ†•„µ´›JÂPí%ŠŠŠm.Ö´•R†…i,6*jº"Xvá-t¬$ÚWWPøwM8¨T„ÆÅ1U±H;b¢˜ªbº… ÂUp¶ÐZiT&ÐUUP^•5PØ¥§A1QMÕ¥ISØ_\(UT „ØM5L0ºlC‚¦)[*B;aíUu +¡´žÃ@¡0¢˜…]C¢§•8ˆˆƒìM"« ­’ÄF„EƒHr¦ÎæD­`ÈÄ Ð4¬S'‹tûer0ÝT6“zWWûï_ùL¿MÕÖÐM¤ßŠm&Ò†�± 2>QÿòÖ�6ÿ,¡`U™�(™�àpG b"?ÿÿÿÿÿÿÿÿÿÿþ[A\¶Vråtã–¸a¬ !-õ2¯Ä6ƒQ„Oéɰ †JÄ2gefB%N‹â_A?2!‘A3±³5TѸUFAh ³±šÿA§„ü ûÖ’ó±HïŒ ’ +Ñ(ÂiéúI­%ÿý4ôý1èî×QH}-Gÿ%m›ÑßÂõ¯P�éL– Ò}ô›ô›Ò¼‡eTüìĈq„Åé2!Ud5þ›Jýý'÷HgÁ;>ÁC3†§‰#£<É͘Â"L0A�æl ƒ!³B‰Ò;6Ï2@Èì�“³ã3ˆË¯¹Ùtif¨ÐSè–ŠjÔE$ “ˆ#¨úÊÊ(gxEÛP¾�Íz ê˜EÝB„PåCEðѼ5PÉÂ/ša|«n*˜Eä*§£;䀹±äâ}•ͱžÌ“„§—„[jƒM?té9áÄ${r¯<4{qÅ#Ûa4Ô÷'Úr\a„ &ƒµ ¸A‚*2]¦�Ñé‹A…*Øa\1AŠ Ä$|´ÔðÑâØÐb§ˆ`™+XþIÝòp‘'hž4JÛ äñ†‘,™3,Er´åœ”7ýK¾Á ƒïNÂô�…Oá_~“umÓíàÚM¿ÿ^¿¿ýõÒñÿÇÅzëúMÖÿðé¿×ô­,Žþ÷\[!kÿ“…ÈaqÒÕÿþ¾ÃÿÏ3@ÆÈÙ†»ÿû×A¿õ]ƒÂ zoÿïäÉ¿ýî‰ýû÷õ�ß÷J½,G¿ÚWµäbvÒõKõíÿÚûgÌïôµÿß¶—Ov“{¥Å_^ß±ÇPlv“M…»^ÿUí1Âé�¶?~RÝ4ì&k©îÈ�–hÄ"°pÐh0„CB 41ËlÈ7J KêSF¬É�,eERY)�8)–¾þûîú®¾[IÑØºÇ¦¿õ;“ÿ–º�HÃ&F£AMFxŽƒD$Ȥȶ{6çâ/EÔ–HGY"ò39©&)dÁ"8Š21‚”  �q#¡�K–bY‘pÁ¡�Vj62ˆ Â3²¢ £[3‚i„lFÀÑó=Ô#dÍ„ÐhðÍ$Ê=Š¿_ö×õ_÷þÕ¦úÿlÐS¨¦ffÎ382@¤ìÀ¡Ï™œeÅEnfO ¸~�Áž0ƒô™®šà¿ÿømÔ7¯àŒ?ÿ¯mÚ_ÿ„P÷Gw_«ëÿ0ƒø°š.ÿˆaÅÿi'á8â/ü#ßÿÿ ôïô¿ï_ëÿÿ!×üÿgÿÓOâÓ¶¿´ÿ÷TJrPûÿKïÿì6؇ÿÐ_ûuí¯WøKm/þÃÿ„ýÑ+h•¿‘Á(ž9Ø-´¤yDóÈó®ÝB~A~ ¹d°�/^—úï^{þÿáÿ°ëëûû·×iúnŸé¦Òéßú´›êí-ŠVý'ª«µõöÿµßß¿ÿï~Ø{w·ú[÷Ûÿ¥ßô�/駦ÿú§ß§�ëþëwëõý÷®È´Oÿúþÿ·¾ÿ^«O¿š—®Þ¯ÿoýzoß¿ëio÷ê¶××Û'_Úíõõmÿÿ{^ûwºÿ¿ÞÚ×[ëKÿ°_ýjÐÿ­¨ù-W_O_¶ k·VÙêéî³ åý‚ vÿaí6Úm¥öÚÛ¶Ï÷V•Ùþí¿ÿÿñÿ½uÿ û¯ÿm$Ód¬4ؤí[A0lBm*´¢˜¥M;6i¦Ç«"Pkd-±miØ7Z±±V–’±R(í�ƒúÿÿÿúÿü˜Êõÿû“N©6 5¶ Zj=Ši…ií4ša‘º µL'¦J›»µlŽ ‘NÂI†°¿ÿÿÈ!ÿßòFÝÿ¹4ÿÿ°aèËHDAš¸0‰°ù’“ A0D[_ÿòi÷í××þŸ÷ÿˆˆÐˆÐˆõ½³7¯ÿüv¯ÿ«wéÿ]/ÿÜÒÿ³7ÿɻϟßþ¿I¾Ö×û_úµmô­¿ÛKý/i:ºþÚü?ºÿý[Š­�ÿôÆÅGüWÃÚŠb¿úv½¯ðKÓ §ü5ïôÂÿÒ¶½…ÿ§„Ó ‘Çöºkå ˆŒª Â ˆÒrnsÈ 7úòo‚zõØ\Gùfº-ê‹tQËx&l0W$vÝ‚™¢ÎÖØDxfEŽW+0ƒ3>¤ú Plƒ•Ê®ž·¶­>û'?ôú¿Çúw¢\Åd�ö–.;õé¾�¿ç‘¿z]oßê¿÷öÉÈÔGAJrfp@Á¢SdÓÖÏÁÂ<pgŒ#@4Byœ4BLô5ƒ(Ð4{xEÀeƒ óƒé_í­>žK©; ó�“~õ¤é7Nôð’÷ëtým M«zïnß÷W×é;÷OC¦õ]oOÇÝ>šî;Nôúë­‡¥Zú·¿ÕTö64ÿûíûõõð÷Çu¼}ûÞäóÛ¤­ˆïïz,zï­~¿½»ñ_IÃ}þ�¤þôÞ·v¶“ÿ¯ûjúûÿàÿ×øtëøÃÿ߯›úéÿ뿃zIߤ‡÷ÿÔl…¡ ãþþ¿ÿÿ‡¿¶“zþþÃýúuÿô¿þµ¿ÿæD�kܤ”ÿÿþÃaÿõïÿÿá¿×¦¿þÞÿíÿÿ¯ôÚÿûÿÿoKÿÿÿðà ?ö×ÿÿÿoòvGz†ðFÿ†?ÿÿÿý½ÿýßJAÍÒúÉUÿÿ“'!ŽN¿¶‚ïÿÿðoôÞÿáÿîÈiÿþÿöÐ_ÿÿDÿú�Íõ“dÏ¿ÿßáÃíû½ÿýÿAv!½×Ãúø6ÿÿzþFG¯×ú]ÿ_¥¶fÛK×Kl§Ní”-tjÿý6½ø}uÛ}/ß÷ßò!Zÿõ½ÿc¶¿ÿÿÛÛ]&Í'×3zÿ÷ù› æÏ�øKn¿^·ÿ­}ý~ëþë½½×·_ʇÿõÿ_µÒ× Å6¶­¥ï¥¶¶­«të_®½?ßœýs_Zþëç?uÛI×ÿ­»¯oÞ¯×þ¾êÃ]&êé†b£þ>*ÖÖ8ù }ºní[Koúëúµ»Nîëú=÷[kwÚö8Ý}¹ûk÷ZöÓøâ¹0}1´×õ´Å1M:¶›iC#þ‚´“a‚}¥i'õdzDȹ ¥§i&˜m$ØkvÚzz[avÒM6ÛÛI°E?Itñû†½§„Âi…ü·[M4Ó"?m0ØIŠí ÚI°ËšqVMÝá‘͈L'jÛI;cÓlC¤Ùšnê�Ú 0Ä&ÛA-²¦ƒmÁ�a+¾È�öE{ Ø\‡ƒ4Ð5íh0ƒ0ƒCHô!!± ¦¢b40â�l„G#U ¤˜„ÓXDŒ1 \0š•Œ1ްa°š(RµÑ‘Xà É„DÑò„õ ‘á£ÃG‡hDCB !`¬Ê’^Ç6Ö¥qÑ_¡;Q¸ˆˆÌl�Ô-xúOþ¿É"é?ßõ륥ßJÒúׯþ—�³Òm.EŠMtÅ‘ŽqÂN ÁÐt˜cå°UJÆMç ¬rãa¿ÿÈ¥°Ÿ,‘©�•,�`l¤Óò‘Ì�@š ÿþC$4šCÿxˆøÿò×3[*FCÄPˆŒÐŠs:ŠH dAŸ2B8gAšÌë’A�C"1c(�ÍAI��ÆPEêˆ$U[ÿqþéÑD‹Œþ ¬®OkŽïÿÿ‡ÿõ,UWÿþë˯�ª-8®Ã_á×ÿ×ÿaþ¿ëÿî¿ÒëíÖÃ_øzû uÿ¯þßÿÿÿÿí¯ÿ®ÃÿpÞ·°ýàŒÿü7êtŸÿÿüÓoúÿÛKL_øo"{Pß‚0ÿøAø?éþ—úÿÿ†Â ÿÃz ðþOÿKÿÛý/û¿ûð—ìWßÅXtþÒü=éô¿ýÿKÿ~¿Õ§·½Ý×öÿK÷}/ÿÿûÿÿmÛkÿUûïWëþíëýúÿÕó�_ëíí½®¿öÛ{¶tõþÔ¨ÿüç·¯ÿ´ïþÖÓîõm³4Ù¢µÿ«ÿVÏÖÙûìÿÕ§íý7wþß§ÿƒ.kúwL]Ão¶¹† +Ã0Þ“¾ÂR(ïM«a„˜fæ%tí)vžØ"Ÿi0ÎR(ïí+9\ˆ;UÖM–‘جKĺ2Ò T' ¦ÚAж Óµ¹’ÎC@§w�ÆP*d‘¸; úf¶Âi#ÛF†Œîx± ¨$hmSÛ'�‚0ƒ�\¬*ÊÌ[g¶OQÁ„ •…„M4O¢±‡bƒÂy�ʶÅG�z<9Pú„Ðjh?ÓóîôÔ²”1³CuA¦©§êžýh¼~µ—”O+/'ŒuDñ㎓kð©7M”ù«)Â$ôùVŸÿ^ µ×k×Oôßé6ºõuvÐZ¿úù¶™C& ÔÈȈ2$�ùŸ‚_ý´ƒ*?çXØÍ#ŒÎ3#Oðƒ3h e>ƒ3F‡Í³?Ò×™¿umGûX¾Õÿªqh?ˆ{¤ƒëKA×awM ±W«ÝSñJGaá¤OŽÚ/rXûT^ÁUÂm+‘Ö›Þ’¬G«ÝjÅUúUúÕþôé=Sí¥Mé/ÒØ­/}ŠVý*Çn›¯ØÕô’úIµ¤�{ÿ¥ÿý7×ë_IÏÒEûÛëý-ýƒ­5¯Ú°ž_¤“Þ’ßï„¿ä*ÿ‚¯„¶Ñã„©ÿÿA†ÿÿ¤„>‚­+ÐTÿ¬ºú_çA~Z÷-< ¯¥ºMé÷^—ùNÿÿ_Iú^“z ô´Xïô¿w¿~‹wôTJÕ&ô­oÒ{'ý+üó}lÒôºo4zL/^“úûzÿ¯ßu¯~¶ß¯ÖÒI½[JëJÛ\óÖÒíÒµoí-'m.A}~A{j“|ƒà ¤Û¯ Æ‚¶qLW­Åwûb©ýŠŠ÷kþ»jgMs:êÚü³ÎçE*ûG Â–ëKkš¸am0ŸaU8kª4‚�<(Xˆ0„A…ƒAqs#Â#–¢QßÄ}÷_×ÿ_,âHËÑ�šÇýzjŸå'ñõ;5EWL§D£%š‘¿ôÿå–¬ÙÅ'Í‘ÔC«>""Š.DкP ( dTR@Íd�� y!ÐRGJBÌù�òœŽ£"¡ÉÍM¢�6Íq##²Gâ"…£CM4lšI£gØÂ63òaG¶¨ØÑ¡„l #`fpNÏ»G·“Ò3c!ÈÖgÂiaÃ/„khý{3óÊ6H6aÑAh‹ ˜hirhL4›CI°–Ë &Ai6“h3‡&w¥ë? +ÒÕÛG¶m&4 $êòg ¹+ &Òtt ½à›]Ž.“¤è”R½Ý}Òt®�ªu}$«m'XL=u¥t´­¯‚m}Ò»¶—‡Tè}oi¡]/TÒö¿¿•Wún´�oÿKÝ'Å.ÓÖ÷ßM¨ñס֢†×µ^únÓõük××Ýv¤p¾Ç§E¹ðÿIÑŸËr2�HToÇô¥Ž ñý9icã«�ݯòÕüUQc?¯¥�ÿÿŠ¿ý¬<~¶þÃÿÿ×þÿúÿõÒý}ßa¥ðFþßÿ‚8ÿúÁ¤¿þíÿúú°ù6øŠÞ“ÿƒþ%›ÿøA?¯ÿäöézš2;ÎŒŽü‡†þ¾‚ÿÃÿú ô¾ÿÒþ¯ÿÐ[p¿@½ø@œ=÷ô½}ýoµý.ÿô¿Iÿü%ãøKÐ_Iaþ=/÷¾ßú_kíÿ¯ÚÝÿþ•·¯¯ê®ÿU^›Ê?é½µ]Õ[þõ_­ÿõÒþ½}WïõúY§þêÞÞ·~Ûÿéíßÿªm·ëלöý¥`ž¬4–êÛJÏ%³Õ„óg« Ùí³×÷a;õI³Óìƒû?ÞŸý¥¯V=L•Fb=g?D@„�Jf‚‘‘èÀÎ œ!@ÍÆbéHáÚ ŠAÚLh ÅÛ#†Å1V †6)5d}±o[V)‹MSì6ÃcbÙÛ"Ø8j”ˆ8v“azkªÕ0ƒOO´Âi¡ ì¹´ö 5±M1L ˜`šxA„îÂ`“ºA»§pˆâ0™+µMï`™(.O_.’`�¼1 +èq§é¦žŸiªp�B0¡ƒC[‰#!µ(¬çdèDA„",D i¦G¨MQ<ÈøŸ[Ñ%ÔOš'Ô_¼h´îWG§ª}*tž›Òoë§§¯ÕúOUþ5Á}};Ž–­ö©%üUºµ][ÿ]ÿúôôºžƒÿ_¯¯ÿQþC êÈOD~?ó@ÿí ¿‚·[ÿð_Ó †B2 þ‰ÿ\Ñ?òÌDÿòÙ�» ýo�2ºÿþ»èDvº]¤'’ÿïKÖÿüd½ëû“ßÿ~im}Z½¿^×ëÕÕ¾Úú}­¥k¶¿ö¶¶¶=†žÚLm§Å±llU‘_ÆÓÂcÚÿd í‘bÕßd[ì&™¼0ºöœ>Ž ÐàÂ5àÂ2�d¥.d•%½+ú]¥b‰PØíS³ ¢Ü§†¨JF˜RÝf&tDTˆy‘߬?ÿÿÿã�ÿ+¬ynZ¿ë§æA)kЬå”- ‰�‘\«ddk5ÎF£%FÍ}e®œ4, e¬3S>AØF¶O˜0�lÖ�0�‚3ƒ4Âì4Bd Â5œç‚zš#.`�ašF™D`dœS³\kF¼é¢&ÆH )8‡Ae§#„t¬Ñ 26ã, ¬#Û]&÷§I†‡Nš"»Iа“‘a¤ÚA2\í&î )û'Û³ü3þ{ýÚ68XFæ��°rs0í°3ðN‚>m;QNI·ut°‰=\*ÚN‰u Û,à›J'‚dsI†î‰s\$ç÷VÕÕÙg‹„i:M¤Û¸DXq ›D[rgM÷é¿_ÔR·|z«íëKõxM$ÿM¤ë«þ8û}¥í¤ÿÓkÁ[KVÝ*ß‹ý‡wÒéÒýÐñKqïÝ¿¡HU5ÿUÝ+Z÷­SßÇßþ—Ö=á¾ã¿·ü±í~¯ûÖª½ÝoZô?»Æÿvô¿å¤ì4‡‡ÿëÿ�ý_ø­t,8¢Ü’M¯þ‹ŒëáôÿúøõýÿKÿÿõ®þ+ÿÿãü;}þðßëÿÿ¶—ÿºëM°ÿÿëý{öEC_ûöý¿Êx?úÿ½þÿa°ßÿÿþÿ᾿ÿø7àßéÿûiþkOø6 ÿë÷ÿÿ†íú_ÿ‡¼?é¯÷Ä.ÿð—w‡ÿÿÿÿŠb¿ïßßô¿÷÷Ã*¯_ª®÷‡þïºÿûý¹]!‹Œ•D c#Q�H®@ÍQ„H_ÿ~ßÿþÝy÷_évïýýoÿÿy’ !<&@…NðŸú Ð'¿û~sü£ÿUýWïû«õ÷m³§˜ÿÛ½½»ÿoìÏzè=Sô™Þž›×ûgæþ›3_KöŸ·_·r÷_ë[¶úÿÛoz¿ÿÿKJ‰ÝV]±Ñ<㎋ÇRñÓßì0”„ÚL0Tí+Ó‹Ot™)¶a«m&#Ží)Ãaœ›9YÊûI²þ¶rom&ÏMþ¬3×÷YuÒlךùuÒ~›ý'š´ßA0š{˜[$=ˆI°ÕSM’ºi†MZlRnm ˜>Ò…±AŠ Sa&ÒŠ†˜b™{i* NÕ;b–Ù5ÑÐ%v¸*Mõÿ¶©es=+@Œa„Â`ƒ�„tƒˆDi“Ì&‰ôxaˆL$U²|#¤�B$0Ä&¡B#“MA‚ˆQMxÏ „І(0N5v¡‚µjúmº¯ýõëðãDØOeìy\‘u×m/Ü—­#1ÿ˜"„�™ŠT è2„m�±šò4-z¡|GD¹øl%’™›“ê~º 4Âf¹0šjšfmƒ?õ_æý¤¥Ï¥‹Þ�}Ô_§ÐqÄ>ÒO#�9õâ)6”CǒǶ’/ÚÉsÃ‰ã’æ‹ì—wT_=$!à�éx~ÚW¥M÷¤û·µOOM«ÛI&þâÛAtJúAêO´û¥Mý?㶯Ó÷UéIó¶Ez êÕ7¥û¾�uÕÖÞÅ+zÓÉsƒ�éP¾•7×èž=¿o×ëßð�ôâŠç|%~—ï ŸþB OQè&üGè$S·Â_õíÿ†ÿÿ¥ÓI[ôýuÿ†È=?܃Îÿá“~—éËOßüÖ,gõ–ž‚þd¤¾’l—^‚þÿÿÛµûûôˆo~ƒô’n t­-ü�½m/oýï(úº´½i$Ýú_¤Û‚÷ÿŸ}®iv–“¶I×ö¾“n—ÚýÚYçiZ]ýÓkëíßö­­´´Aq‰»^A}ZZNßí­¯Òµm.ZVÚZ Æ4­+i;¬V“lW±Q]±QQñZ¶Å{ÅX^"×Ìëí…ì)¡nÔ·L.h];^ÓVº "+á¡@…¡pа„Âíˆa†aDDGDGÄDþ¼´-FEòȯ–UL(RÜvLga ëÓ׳º�Œ’Gc.?»û'?úi¦�ß}þ"#“¬•xï�p¿çoãý}>ZàÄ*ñ‰ì"dZ‰hDA…­HçDJÉ'5ÁœXú”zN¹3ìŒY5ÎD%1¤Sô|ŸŒäÓd¼£C4“¼£c“òs+žpgš£[M2v˜FÀΛh�FjÏi�i‡š(dùœ;Ñ 2ŒÁÈ�#²% h LFm²$DtGé:¢;#ÆöZ„E¶‚†‚mÝ_iÙdDXhi0ÂM…m]' +Þ›ª#†¡™þ}mL}£ÛI²"BÂ<0‚l%%æ�0�ÈÛ§QT/÷K‚´�[ÝGv�n ¹8¤ÚZV£Š^–�_´›DâÐâØJÕÀÝuuLñ¤×Úwß×wÕ+~ÿÒoo n­~š¾»í>2 þö¿ï§m.©w§•ÌER·ÿ¯Ð÷ÿm/Úv…n…Vkî5oÕv«õwÝ~°ßÿñ÷‚[ø~º··Ö¸ÃµÇî_*Úéý÷á~íöÿÿù«_°öë¯õ}&¿û‡¶¯þ�ÿ�ÿÿÿÿ__ø~?ÿÝpØk¯ôÃÿÿÿÿÿøaÿÿ‚ÿþókÿývØÿ°÷ÿÿý]m.ÿü#ßïü7¶?ÿþ ‡÷ÿ ãÿÿø#ºûë†ÿÿÒõïðß—_ÿ÷†Ãwšø?ÿÿú m/¦Ò™ è<œf¶B#c82�I7“Œ?ÿúûÿáöïOaÃúÿíÿÿá²0þÚ +ƒ<&hÔ‡&©„Ó „ßÿý/Ûëÿú뵿wÒÿßmÿõÙë÷CM= ÐÓ,ѯÿÿ×ö×Ï'ý×_­³ª~ýÿ¯öÿ×á*/š'�Eó®K cDú‰õÇ¥ÿ¯éûoV½o·]m«wÑ¿o_ü÷[¯ÿúÿÒºoW’O­éë„Ût«Ûv¶c°º¶zµ»ºêÍ«JÒ·¦Û=Ú]7ÝÿwG­º¾öý}Y§á—»¤ý7ô×ZN½­ÚjÈãqRVÖØ Ú ‡Ú„ÞEö–’¶“!?ŽûI�üØ6ÓN×]m%l�i°ÓNùpØvžÈ;q‰þ—_¸ÿM±A4ôê‚mWi°LSnØÝ4… &ÈaX¶-]:ëmµ ÃiCˆI¦ÈATàž×Nø¤ß¿õ­:ášAaˆâ‚…(¸„W‘ù†!¦‘W$`Â$óJs•…e©ñ­÷¯ë¯òpŸŠ�Al¡ˆŠ:?ÿÿÁ­-_ÿÿú'ß�v¨ßWKÿßÿ ¿–Õ*ü+­’úÿév®—~—m/ÿÿû'Ám°‚Òßûkÿëk… œˆ +ÐWIµî¿ý6Õ¿Á† ˆÜ#kim¥ÿ¶¬v�ˆƒ;t‘LVÇÿŲ#Ø¡† a쉰Ô4ÂÓŽQÆ”›Tþ•ŽÂ†£ËhÇ {2epï�¼¤C%²™¾¡ý~ï¾–Á ëªú�ƒüªçc^#“[ô×þZáP‰ÑóLèddg:n)È‹äQ”ãȵÞd…§Â=³c“ïOŠ·_¨îß§Ó~û¿«ª¥¯¯¶–·øí¾ÿÿ¾Ñcûjµþ·ÅHëÿ†í}~‡ð¾¶µ#…�.ð}CÑiÿ¯¾;û×ë÷B?½ÿ�òÜããÿI}Ûµaÿþþ—ëõîqWûÿúÿô†]^²ŽÇL7¦ÿÿÿÿÿÿÿÃÿõýuÿöÉP£!ŠLÔd1IS ‘×ì&eFA#%@`ÐR�z†ÿÿÿÿÿÿmoü7þHA=ºÿÿÿaôÓTÐ~_3¿Mnƒÿÿýÿ÷ýÿ_ø7þ£º_¾ÿþ꟧ö»õé¦Ä7ÿúÿÿ_ÿºÿíÿ„ÚWyŸä�ÿðzª/�Z'‘Ñ|ïs#CEã—×·ïÿýÿmÿŠÿÃÿ¯�éz_ßíåëIÊtkæ×MéZÿI:VîÿþÝu}ßÕÿÿë ¯××÷»ßAví%T¿u×K}Êá?4ûoûuÕ½w§ý¿vÿÎoÿávý}~÷Íïÿm*÷ëF}$>ÚMZ[fk׺º³>ëm+ÛVïìëßú_úÃnõÿöÛ¿®Êº[id»ó®lfŒÛ3fbëþ\SH g„)óc!ŠO›d<ØÍ#ŒÍ™‹¯÷[Ô‹á‚éö_t´›´®Õ†·v{´öÏ«ýn¿½Ùöo»»¿³ûgæöÖ¢ï†U×öÔ'ú\_„á Ði¬C¶Ô'¥]XJ¡¤ìBNÐlPa¥ $Ä+ &A1°xb˜{A�“pa5¶ÒM;Xm°Ø¦;n¶žÁ‚L0“`Ž>ë!ÃŽÊõ!ÈŠßtž:÷µ.ÜZqßtŸY³mX…²2 $aÙ¦O°ƒ‘X ƒ +BUÃ%i¦ƒ ¤Å„ív­‚ U¶½‚dqw}í0Ä&!0a{ oJÒOäýzUÉ{Ø$›“ö‹ç#¬Ÿ½Ò—Ï\&ÚC•Áb¼# ´PfZb  ƒ·íÕéo¶©7éujûî“Õ>ÚI7ÔCНW¿zA©>z×±Ué/OøÓtÝzÉc×õz]>–ßKá$¿ûÿé½¥oªtõÂXúUíw¥^ï°u¦µûZëM¢|ÒÊ㮾’máÿ’ÿì„Oxÿøúúp\m+é#ßÒÿð‚ïü0ÿÿý}&é6Ð_$¯Òþå§¥ÿÁ¿–ŸýËOÿôÃ"2礓~‚ý}/ü§zÿëõþY¢lJ¦AoÒI†KÞ•ú-ß �­~ï~ýï×üG¯JÞ––¾Þhõ*þ~³KÒé·4ÿ´´’{õºÒ¶üõ^¿}¥¯~·¶“i_únÒî×IÛK¿´–í+Vþ×IÛK[[[¢ V›cäÔW·¢ Šá±Å1\V­ÇÓÅZñv²ÇZVÂÿ–:í©�5Ìë« /i«^-oMtÐkú¦švÓ ­ª§kØA…2YÄDG;Ò2"°¬7ÿÿKýÿ-�e¹¬v-‘©�B�ä&ñ&ÅïúZßßQÿï¼µÁùZÌ”,ëªþ¥¸.Tþ¥:É4GÓ#Y(d©'“ ¬_¦¼·‘ 0Lµl¸Áh„ ¿P��A™æÈè!¬Ñ„Pɼfh‘‚4yN‹è„ Ô#_“$\Õ&$Påħ×$ù\Äž“qhØóáQ¡„ #e FÀÍ£`a¨ÜO Ì�rì<%œyé0��”@ƒ „k ‘„ "ìÊ lÚ?—#Í—Bæ\Ër*‚%0Ñ “þËB Íá¤Û,ô�n“r8 &Óå�›IÒwp¨&ø[L): &#†ŠÆ‚a¢8h&Òc]ßÈÇx@›ôaØFã·úWºVòp’à›ø é7NéiioªOÖûRqI´ ¶Õ´ êÖ�dsH7¼ nZ –v!´¯�·¶«¸®þ=¯Ž©î¿¿Z_û wô�[^ž]¿M¾ÿ¥Kß#…ø^÷OMµÆ—_ºŽ–Ým +ÞÓ­†´5ñIÿ}+éÿû÷Éãü=µý9:ÿÖ—¯×ý?׿Mû©,Éi‹;¼Ÿ53\FZÞéÿûþ+ÿë¥õû÷ó ýýù&á ‰$ šO›d8ô0@ÁÌ0@ÿÿÂûÿÿÿǶ¾¿ëú½{ÿõþ� „íx´ÓCOÿüÃÿÿÿߥÿÿÿkÿïÿý4NÞ‰C�‘ÁÚ'�Š/ÿú=ü7ÿþ¿ÿ3½¿ÿÿýºÿÿÿü¾i7 ÉW„Ó¤ÚAÒoëïÒü7ÿÿÿþß×ÿÿöØ ¿ûûÿé:O¥uíuÓ×·õúþ­~ïÿï~½~ݽ_ÿ½u~ÿ[Ž–­úêߥÿí×ï·ÿíïö¿ëîŽ2ÿÿïQßIºÿ]ÿzëý|çëþÝÿ~ßï_¿öŸu×[×÷ëÿÿZÿmm[¾ïúé´»lÑ7·þÞÞ×Úÿuíû­úö¿ÿÿ¯ó0O�²õ¥¤Ã9åî!ëui:W˜ìm8{kv¶×»zõm+Û?È<÷]õm×íÿÿÿ üB  “A1LBAÉâM6Ò°�a¤›¦6B�ƒ´Ã½á5m©Ûi-Å0Óm&E~‚²û¤ÙM†rÿÿþ‰ÿå³Ab«ƒ +¯~ÙÄ(DrN ’°ƒ `« +Ž´ØîðØ%jZa†&žÂL6 +)=ˆ_ÿÿ뾋QV2­�Šb Áˆ0„FQÙ¢ B†‹›AˆA©VÉðÂäõþ—þ—¯ô"®"4MÀƒ{]-¿ÿûìÒý_º·ö¿þ®­¯ªýº´¶ÒÿÛVßõ ¼S±_ü\lW«¥Úkkÿd ì28°¯­+†ƒXaWU°œ5†‚avE.M€˜£F•ÒB|DDQ^äÚ©!ö%ІË]n;%EV+ëÂ… + +M¨Ê?ù\ +ÂÃáßÿÿò×ó± úúëçky"Êž?õõõóµ>Zê„é²!ŠjgÒ"P‹I@¥³Í‘ÐdC:Œ“0˜Lèddk +hE<™ˆÈë‘ò�Úõ£`~FÆi&š£[Ñ­¨O „k ¢0��£À9 „$Íf™œGêGf˜@Ð3Ds»4Â`̈ù‘Ñ'F ŒFH�DtG�óAI‚8Fˆ“DFéÐM²ÐJÚ †‡²h ¼ ›‹Èá ƒaaÓa&äÎL„Ú"Ã\ M¢+¶%„�4Ò#ÈiAÙÈ(MÈÂ-£Ûô|d¼šNeÌøî·ÂuÑ'í+~ÜpN·áoÝÒ¸'I×@›¥z´Ï[MRM„Èæ¨—4š XKô�lgÚ»-¸4›éÕ: !Õ=W}´›Û­/Òý.ºwÅ.Ÿõá5Õ««ïø šmÞŸ™*ˆD;‘.ÈS ™ gAH”L2)O”쌊äƒ3ÍY ¿ô7= Û¯ßC¯Ôާ^·û­ûÛôÜ}Ò餿MßôǦ¡0Ÿ¦OÓ ù¢ ØL Õ¿äýJ}ý[¯ÿë~ÇÞÛÒCݯÔkûéþú~¾¶ŸIþšÓ¯ùc<´ùiÿ×貟ãëÿÃþ|·0þ‡ûÿïËÇ‘tGT^4NÞ(¾kމçTNßÿ_Z[ÿþ¾—~¿°ÿaýPÿú¯°û¤ó=p ¸*MÓëkôÙ©­?ÿÿÿÿÿÿÿû }¶ÓUÿn¿Ûÿ¦Ý[H(\/¤ßOú]*Mÿ÷÷ÿÿùßÿóMÿ ¿†Žô¿÷\Øû×¶—ý?þŒ?OuÿÿÿïÿÿKûÿKü?áÛþÿÛAa> ÿáÿÓiLü—ÏæÆH.+­÷þÿ»ËsÄ�Û*–ÖÓÖýqÉFd%’Õä kÿ]}cã•ÎÊ—gky©&kIúÿ60�œØÏ8d #ÄHFÈñ"�Iä@¡‚¤PÈ„PH2,ÃDJDN›"ÈBRsL†_Á0�n 5Á ÓL&��£tÎF‡FqíFÆ­„l4ÊèGƨÖá0��„n„{ˆO=¿Ùö–í$ØTGdy3c8h&Òp©;- +Òm&Òm&ÕÒvM6ÉœŽÞÚZ[- +æK: ÔÈÂ)Ñ3@ÆC4ÖΈÍÁ” +C#™ ö×}+á4Ý4ëiz[¥ii8IÒµv•¶ ´­'W×™)I„ÌÚ’ ΃ á4ôÍ¦š¦ …OëéWëiõÿ_ÿÚ§û±ÒoÛ[õÝ'Ä4ã‹Û¤ƒAè8ø�†uÖÚÆí?ÓÆ“¼/R> ZŠŠßýhi]争ã©>Ò—�ƉãÑ?¢Ç#ÿôXätøþ":Uw¤ÿË‹WWW%ZouI½'Iôž ªzm-&ÿëÿñ_ô½QiÁ°ãþ½´Ÿ§Û¤Ÿ§¦únºkõt›õmÿÿ××öÛÿô½OM×ñ]û¥éuû�OþÃúÿÿÿ áa°õÿýuúý7µúCßÿÖ¿þ[¯ßÿþãà�ÇÿÿÁ~Ãôñ×î‡ûôõþH¸ý.ëÿÿü ¾ÒþÃa¿ÿ¿áÿÿÿûÿ™‚épïÿû¿Kô¾ðáöëÿ××ÿÿÿÿÿácÿ®ÿÿûúûkÛ»¿ÿ½éz_å§þœ´ÿÿÿÑ?ß3?Ûÿý»ýÛ»:¬Â÷_íýu]¯ÿ¿ÿþ—ÿûÙŸÿýºë{z¶Û÷uûw¯ÿß´´[»Û4´½úõ¿°N›KÿöÏw}‚ÛgÕŸMž®­-Ò¿lþßiÞ¦~ÖÍ/ô¯4½[öÿÿVüÑ„Ó‘ÃØ¤Õ;M4Ø Çl•¹È}mŒ1ÅZWR/´¤K|l„"ò="~­{]]µÎö—¥ÿý«i^Âq $ÓL/i†%h-m0©°Âh0˜0�TS ƒ 0I¦L-‚v)‚jÚö—Mßí¤Úí¯þÚ¶­å¦„ZŒA„  �©í“à M5M5Šb¸­+b½�ŠØ¯þ-‘@FòÇL.[­]…ì&ÂÿÙ;k h4ki¨@Øh] Ð´-4ÓL&�­…ÄG2KcÿúFAm_ô˜…ñkᨈÿü¶Ù£2ŠåT#XjB5ÎÉÔ�ÿÎÊÞŸßú¾Âþ½ã™È"ñ™4±õOÎÀ³°?ä!�Ù’ù¬Ž¥’HךÙNÈ•�Q.ˆú©©z¯°EÀ0�Í0�“ÁF†²EQ�„ ‚�>Iæj„ÌŸ!æñÅ5š!&F „˜<ž40Y dC:š�8Ò5"<§Uá ›IÓ ¨L ˜ieD´Ñ­„^óó :L0�Ž “›L&�ÌÍ‚xGÇ£Øx$v<„l ¢0�˜H„Nx ‡D$æþÃIÖÓÿÿÿÿ¿ÿÿú„¶‚ÿÿÿü æ~E¿ÿ´¿ÿûØKÿÿý.!wõýþKÛ´¿ü1 ÿÿ–¹’Ý^ïýÒæ+÷_ÿßKï ü/þÿ¯iûÿú„‡ûïÿ¿ß_mÿuôa/ÿ¶¾½Ûµÿ_m½é»ÿÿ4ýW{_ºô¿÷ÿi7ûgæÿ×YG}¯ÿ·ÿÿ¶ßÿ{Õµaœ¤QÃ×NÒlÓâg&Õ´˜g¦Â(wöÙêöî®Â(wwg¯Û¯d'õlÍv»A*¦ši†!1¦ž›'{ SmÅ2+ÓMX¥NIƒ±o¶*ï´­6Û/ú{a[/¶”1A‚i¤{w;¹Þ �þîš¶d£�… +“í…{LŠ=§p¶[aInâ“NÓb¢ƒh)mŠ"†WŒ€°Ä$|(ôs°Ò+2¢OJ¶M +ɺÂrn,úõ¥®—VÒº²7M„¡ˆ&Fê ØÇÿòÚ5¡I¹fCUÉ´ÚªÿûÖüµÁû¾üÈe’¬È§2ºú¯¯Aš£2)Ì�3Dqš‰<Ù�I3ª'G‘ Ž„Sä#"M3¡Sõèè&�šA0� (A„[†Q˜4BÂ5†ˆK—ØF¶i#±O0G°r$Í Ó03ƒÄG‰<ÄD#dpŠ3eœÍ¢u— gQ” öO’3‰<ã:‘ôD‘#Hެ³Œ$ØDGh èZhrc©†“rcä¹0’a ˜jŒíí{éаš\$æpP¡4ÓãR">Vò&Œ¹äŒ’'ÒK;ÿØFÃq.%ưÍ"æì=Í#y�Neƒ=D< f�A„A˜¹ ÆÀÊ3 e‰42�(Ø<+°É a'�(ÌV¢ Þ°fˆžØdŒØÉ:>`ÏÌÛ-0çÇ ¡3‚"¶+Í‘ eá‚"VK‰ öI9õ9ƒèt‡.bï9".G_Ý7M ›NÕð“zLi0ãY3‘ÝÃÐÒy3¦ÐôUµ“B ¦�„›ÒmXa G†…¡ ›WW +�°Ó ¤Új‚n‡FÇ£C èÖGæÆúXL#`i„Ѭ4kdòiªdðAžDtØAYåfy>Ã$aD'›AðÝ<0Œ8D|¾q™š4‘ã\^'ÌÊ R‚:ät�ŽÃ[v–Òi/ýi&Ñ7«Ânn®é6‰ÇÕ¤­E¿Òt›“àÝæ‰Å&ÕÒp©6™ãK ‘Í[IÐL='OIÒn߆pÒmÛH:6ƒ6)³DXhj,4�]Ra„E‡&„à ^�mQ�š0‚;ÐA°�è+O<ŒöOÏ��†:#Û°Òí%ö—Òôš[¡úéß½­¿V÷K×Vöž›Ý|qöéÒéÒµoK§V’¿éÒ¸N–¶“ Ð&Ñ'®´®[„î–“âÚmª´î•Ó«§­»«¤Ú Òì5#…} ƾ¿º÷÷þô›Ç­úúëÝ·¾Ý-ÿhUm/_µVÝ*­'I¶ŸvÚ %OtžŸí^úzKõµºu¿Å+]^ägÔ·��ú¶ÿï÷ûí¾­î>ªÛþú,uõozÞ;Ûá[üúºŠþí>:Ý¿m^«C»ý{ªÚ^+ÿé:ðÚBÚãÿÿÿÿÃ×ÿÿþ«ÿüaÃñô^ÕC_ô[’Ú_ý7ÿn”ª ÕÿõýÝÈán¶µûC^¤µÿKÿÿØ~ÿÿúëÿþ“ ‡×ÿ°ÿÿÆÿÑc=ûøÃ‡Õþ�×ÿ^© 1ü~‡šÇ†ö×ÿÛÿÿý‡ýoÿÿÿûûl?ý}‡^n·M/ýWÿý†Ã×ÿ_ÿÿa®—ÃE×ûÿçVG²¯÷¯ÿÿÿÿÿÉÙÿÿþa¿ü‡øoð¾½£¿ÿÿÿý°ßÿÿþ¿ì5ÿa믽+Âé{h/ÿÿÿÿþ�ÿÿaÃÿáü7øG¾Ú[ýÿÿþ †ÿÿÿÿü6Çÿ†ÿï±¾—„¾‡ÿÿÛõ½ü%÷ÿáÃ}þ—áïÒ­ˆ^“ßßÿþ7ÿÿÿÿáÂOþü�ï+«÷«ÒÿÒëÿýöÿÿÿ÷ëýwwÿ×íÿ_™Á\Uûuÿûo·ÿwÿ·ý†Ð_~ï/ÕµúëêÚÿÿŸ_××·^¿n¿õÞûׯ¹Ú¢w­/ ÿ·íëÿ]»ý¿ÿÿº_ûï¥í[ÛÖýtÞ¿ÿÖ·_^Ýöî¿×léæ?µÿïí}}½ÿýÿõÛ:§/¾ëûwÿßí�Sªïî߯º³þÙÿ¿Â)û þ×ÿþën¾¾Òÿíµûë³÷é+¥úí™÷½i§È$Ù¢j½¿nëþ½k®ëý¿ýÿ×_»Î~¶Òbšb­‘G}�ì7A&¬‹”ÓÓÒM´– 9°´îÙÉé=m-°•ÕÖÝiÈ®l0•¤Ú^‡aØ$yïíž–Û>›KûI[´­U×öÛÿ»ÛÛ3Û«NÛÿl�6«Ø4al$á8A»pðÃI;…z§l=6ÂPå; +›0ÂI§o 1M„§xA ÛI†’ ´iÂÓb´›KbH6õI¦Å&¬m¥jž•²6•¶’jȼÄÃ7ié« lÇl0•¥„aÃÛnî˜`“yúÂ(w0B  ²²LÌ0r­�0„DD0e{ Aø† ¥d BEqXU³è4W1 +U¹XU•z#’ °� á4i„n9ÍÒ"3“ʈ&�£XaÙŒ =>GÚ!&˜wëW[ß}Em_VÕÕÿµ§JéÚUnŸÒÕïV•â“„¿I$Ûû»Ò%ð«¤öü&Ò´® †ò|Ñ8¤Úº¸JÒÕàÏ4­ZJ»- ´Èæ• µ‹oDpÂ=´i1¤ÞŠ·Ó&=&öûÖ«õö½zõÖß]»Z­7ºíjŸí~ë7ßQýÛÒi/w§V•½¦é½¥ñÇ´�v­.©]F’n�m]a_ ·[ZKŶž…+¿Zÿ¶¿z¯Ók×Ò½ûÆþôÞèio¿\}¸¡é:W÷·´ÛÐÿïÐÖÿ¶ãvª»Öþ¯§zøú^ÓôîºOûzN¿µzÒ¯†£^½bº÷ôLrHþ¿ËŽŸÿÑNü±È§ÿÒÝÔzýÕ[§÷Ò»¿Ýýú}6Ò¿ÿ¡ý{mü[¯úû¿Ý}ºCaúÐÿïø¯ÿòÄÿŽ–­ûoÿ_ÿÿÿ—XpÐC_øÿ-É_–9ÿ¾ÿ,p^>ýh±Çí/ýºö¿ÿëmÿõÿÿÿÿ¾·ÿì?Kÿ¿ô¿ÿö_ÿú¾�×ÿþ?ûkã´Sÿÿ_ ÿÿíÔÿ ?ÿÿÿÿÿÿzÿÛÿýuõÿýõa°ÿÿ]U‡ÿÿú]/õ¥u´¿öÿÿþhŸTœ?ÿÿÿÿÿúÿàÞÝ‘ÿÿëÿ†Ãÿ‚·[ÿÿÿ¶¾ö¿éþÿëÃw÷„¾» ÿÿþÿÿÿ·_^ÖÿKÿïÿÿÿð�Ò°ÿÿÿމ̎ýëíŒVýðý÷÷WÕXtïÿÿ¯Ýÿÿzï�þûýïÿÿëá°ßú dt†ëû¿ÿûmþ½áµÿ¿»ÿþ¶ÿ¿ûïÿÿý°ö×ßÿµÿ÷ÿÿmÞßÿ]tïëÿÿÿ ’ý¿ï÷·÷œûoÝ+×9ÿßߥíßÿíõß}^sÿ¯_ÿ¶ëþ¿ÿ×Hmöý»ÿÿm! ë{éöÕ³?kMºn׺m?¯¥ûf‹ýºû4M¯÷íéniÖÚÿ亮ý¯¶ëþ»gNŒ{wÿú¶Uýõïÿÿ­}}ßM»l%í‚)ö“ ònÛ/¶“wl:O»®öUóºZ¶ 7~¹�ìõ¥°Ò}鵺³ +µÛ3Z~Ùš´¿ëoÛI³=µÿÕ�ó¶–ÚVÙ:¿ÿöýu}¾Ò°nÅ'P~“BÈAñAÒ`ûß Ûi&©± 5b¬6’v¦EzwlRi†+I6+V +Bí(ûA&Ã.r+µc[a…t“µ´¸gÕÓ ¹¶M?‘G †rë1ºí‚M§éÿmŸä1�ë»3Qᇄ)áí4؆à  ÐpÂiªjÑîÅ#œðç†S»¶Ä)áÛ ¦·Iá‚Ë •°šM�…².ÁSØI0Å0�9í6(0ÐI­ØIa&ÒÐLSvšpNÛ &(6‚MŠcTôÓUb›‘\;I©,·W•Ó¢º�Ò∈`„A aT"9ø0DMƒEC B5e�D® ÊÔ¡€ƒ&GŒ«hèµ<Ø`˜¦Ë ÉB½0šÝ°® +‘Ý„¶b±DEh®‘•ëÕõEm £ÄD1 +ƒA…Tºô±qÄþ´®´—_õê%¥÷Z iÁo´µý×dG ´%è  B©â#)—Pšˆ�ÿɲH›jÊÄYMy]+ +NÔì. +vˆ·„Ÿ",—zåuyØœL¢#äR#Q»«_ÿ¦ª‡Ú‘�Uï�¿ô¢ß+‚£±¯2uäQcþê“§z®©kþF²ºRçOßú~Ÿ¯þºTÞ>J¹’©Æu%$�<äj"4ϳYF¤ÀÈdDFlˆfq¬‰y2_Îi�">Aå?•\ŠåÑ­Ψ˜ˆ’#çd‘×É8­"1d_"ëTýÖ�`Ѭ0�`äI�qÈ<�à�„l8C¸hGÀÂ49¬0��”A@Ê0ƒF°É@ä'&#0v‚¼„¢a’0�”lBf™‚#.a+lŸH¼vO˜0B fb#e— dIfb’œÁ( z"ŒTŒ‚¬˜gà ‘ФgVj¢Ñ:—÷ç_ZN‚m&äÑ Ãe£<4¬";hðÒmMZm&#ˆF†ˆá£ÃA0Ñ= ÃC†\a\ ˜j >ªL$é2^ !t›UFƱÏl(N!£cMB64n²~LåØhØFú„k T„ £0hЋ“4i ÁÁÈ“G³ƒ<ú|ñef6�"ú!(FAp%i[IÚT›@›ñt›… ÕµªIÕ´ Ð(n­ NË¢´H| me¡6ƒ<û„Ï÷¶–•®–†“i6Aœ9| °†“inè&Òm-–Bl$Ú"»BÐÐA·a&ˆâí¤üüÿDDos;ÜáÜqJ°0��Šézíïí­í6•âéi=~í¤ýÖÝ=6¯½6—ÿ¥«Ij+¢QJÒzzo ú%­'Ý-+Kt›ø Ú%íz¶ôÃm'–„ÞÓP ÓtxÚvM ´Ÿqj;¥¾ÿ^­Þ£Û»µ_{éxîúVú^í;­õ¸®­%ﺧµëúµézM¥íí_þýï°ÿªÖé·§JÕö‹Vûú_×~¿ûëµûmvú·õÿð´µ#…ºÚ�ÚûC(uþ*G ÿ×NÓâ­¶“´î—¦GKôEýé7·×ö8x¯¯ëòÆÿ·J›ÿúoõýÿü}ÿùÃD>ËPÿ¼·#RÒäsú¶;ÛÛU½סÚƒþ“ëïk©/aýÿÿÿ®Ãÿÿõÿÿþ¿ÿõoHX/jµÿÇEÖ¿Òúý÷×`ÿÇå¹Zý¿Òúo·þG0ì5ÿ÷ÿÿØ~¿ÿÿûÿÿëÿ¯ì5ÿÿ_ÿÿ×ÿý·ÿ_ÒÂÿïÖ�°á¿ÿÿÿü7ÿÿÿÿÿÿàŒ?ÿ +ÚXl‡þãÿÿý×ÿÿý}¿�×ö×áÃÿþ¿ÿøÿÿÿÿÿÿÿ„hn–A„ÿÿÿÿùdwÿûàŒÿú¿ÿëÃpÛßþÿÿôí¿ÿÛÿ×ÿ¿Òÿô»@¬8A¥ÿ¿wÿÿèÿúè/û_æÿëá»ßÿÿßí«ÿ_ÿ×ÿÿÿ¯¯ét;¯Ý¯úÿÿÛ~Þ—ÿôŽÿô¿Þ©ºÛÿöëÃs ¿Ûöëÿÿ÷Ûuÿýn¾½Òõÿô©&ßÿKÿ½»þÿú_®¶Ö›ÿ }ðý{öÿ±íûMþëÿ·ûts¯ºÿöëý}~ÿ¥ÿÕW:úûmªÿWÿîÝûªúëúßþ¿º¿·ú]7ïm[?6f¾ëSó~Ùû÷K[m×û÷[íºî»zûÿý9›4_®ÙšoÿW4öÉÓ{km·÷ZõÖé$ßúöß×[û~¾ÙÕ?¦A0Âm¦Ú]Ý®ØI;VÒº²<Ã6ÛA^š§¶’êé'¤žcm/‘Gý9vÁ°ÂÚVvÚÙêÁw~“ %m‚M¯m™«?·Ûk½­­Ý%ÿÚ{fI6»×_wᄘ Ä(vI5ÛM6!ZÛi0Á&!!6’§z¦Ú +ÓL6•ÃI6 ´“N  4ÓVm±]HâbƒÚiÃA1JÅ1²+ØØ¦9éC‡ ´¶’ßzpeÎËí„·K„�ÞÚV“[g­#”„@ b*¶íƒLr°£Ã�ˆ@Ð0ƒ¥aEÙ¦O“áˆF­Ú=°Â:Ȭ‘WiŠG·*Ûµ»p�'Ý&ßÂZ‹»„G€Á¸ m+ ÿC_ûëÝ^¯jé®Ü-¯ôºý´«uÛß¡�ƺoÛVÜ}ë~ß›hVݵ·Iý/ûÿ½¿ªéÒ½ÿË�_üpɲ5³A�FC6D)ˆEqJ!�0GR:È‚\ã:Œ�‘/”ævdÓ*±e&™Ñ®§`ïUׄh~ÉÌŸŸ! h0�†›L&še„l #ÛGÀð™'99ŸyFÆ�Œ#Xgâä{ÓÖFî¬2ˆ¹H�0‹¶¬2FÙö²hB 4�»$L|�6!<ÄGh„É�”EäDx%ļÇ8`Â!M™Ôd˜¤‚)Í2LÍD@ÈêgM<äkEÑ[KÒoßWI¹3†q¤ÚZ"ÃDX ô˜já&ážjî“É“ Òa¥¤Úzz*ÚM¥æi&˜ø3Ž &Ô' ´ U4�é&ô¿¦•Ú¦d¼Ÿ› °4{aÃ4Âh„.xp Ï0aÐ" !2ar>U£dC!x>‡ò%eäâ9Òýßt­¨M¥{Á7ôé6–¯V¾´ÒZZ‡ >ébÚM¤ú¤Ú$ö†­¤Ã Ÿal$Û, g + ?$Û,÷eœ3†“rj6!ƒé;-\á¤ÚAÐM„E‡&¡6‚m5H6‚lE[!°¡4l7N +�ÌžOkÿê?úé{{xî½Vþøþ©ãU�¶·öGOµî––÷W¶ôÚZý.øôén“ÿï ´­i[‚mý'WIµzvYض“h3Í&Ùg´ÂI´=…¯þÔŽ¯#…­§iÝnµÚû׎ÔkÛ�.5¶‡õ#…VéÔ¸D½¦×HtŸ}?í?øûkâ©ï¥«î•☿¯V•îúÚ$÷J?ü>HŸÖHOßuXéðúÑ@ÒwÝ9~O;oïõ¾‡·ï ô�ûþ¿ßïÞ;�þºU»ú{.�;Ý}ý&ÚÿØiô+¾ú·ÿü=yu‡ÿâ½=ZC·òöeÿ-)nV¸�ÿðÿD:€Ñc‘Ÿã«UÝþ„FבÂûiÕÛÿ×ÿõÿöûÿ_ÝýÿÛ^Âã°ÿ_ÿ‡íËôµn?å‰u’>ý[u AØøGÿø/ÿ†ÿÃÓÿÿÿÿçQõâý¿Ö¿öûýØl?ÿ¡ÞÒ¯Ò„{ÿƒøA?ÿá?þÿ ÿÿãÿÿÿÿà‹þÃü#ÿðßûÿû ‡ÿÿkÿKÿéÿH+þü7þÿÿÿÿÿÇÿA|·~úÿøoüÿ)÷á°ßÿû£»Kþ¿ûÿØI÷Uïÿ~ýÿÕÿoÿ·¯¿úAwWá¿Âÿþü?úÿ‡þÿþ¿ùnéç¿ÿõ×z_ÿ¿ö÷ÿwú_ý¯ÿê¿·{þ—ÿíý[éwôÿ½µêÿ¾¿ßí¯®»Ö­ýjs÷Û:nßõ¿¿þßôÛuú[{ÿú_ÿ¿®÷úý6®ÿßÿLíïÿ½»öõººíWoöþ­¿Ò¿Õ»û®þÛKý~µöÛÍ7ÿ[ÿÎí�/ÿ]¿ó ÿýö:Òöø#×µ´›=f;ì÷iéi[Õ‚Ùëþî³ì3ÕÓgþô›?7Ÿ·I{Û?½-¶g·^•íÝÙš»Kûÿÿ«é¾›ÿVöÒ9×þßßNßïˆNªÈAö“Åv«ì%i&&JØb­=‘Å´¢˜Ø¦Õ�5†‚b™?M´®Dºm‚M¥jÛI;JE6Ëm°[/õeí9pì¿êÝÝf;JÏwMŸý¿nÞ¯´¯Û3ý³Eôõ÷¯Ø-ˆA‚«PÂiøY pÖ°ÂýûA0ƒ% +A„šhðL&¦ÃI6¦Ä&ÒM6(6’v”'b–ئ)´˜„šÁ;ši°}¥šAŽÒc[‘S†Ãa˜jÚ]]eë[¯a…l¾îÚK¶~–ý™ #*B á"" ÃY:¡`ÄDQ^Ã�x0ˆj{dì1ÕÊÀÁ‚ ™Í +h$Í0ÁBbšíÚ¥ï¦E@S¸¦ †`­Z§bl4˜a+# “–ÓMˆQU¶”;»�å�b@†^ÉAb!„ ç`®V0Ä b1ÑFŠÈa#ÅØa4ÓA°E­¿ñ³P„EÿãýõÕ4ëZv•ÕM ˜ÄDecˆÿü®j‹qtv¥BfFl¬5;O˜dÜ’2èî>g‹µUP§q(R©… +MÅ‹þîú¾Ÿ�¤ŽÔ‚„w‘ˆÉV¿M?¿¿ú¤é�˜d +^Ðç`×ûOïúŠÿÇ_%_�ÕæDüíioS/Uÿúúúë§äÆvg•Ó¬‹ã\É`”¤Í#QùÔò-F¼Ž“ÎF¬¾F-|Š+ÎÄ%ÿUUÇ£\ˆÁ4i„ F#DP�d<ÀÊË#X@ #É�@ÂL0IQ “!™#bæb¶ ÓdHFÈàÈ ‡C3"¨„¡¢¥ê} +Â{%9Éi5£XɆt ¹¶u0JQ)Ö LˆÊ¹Mh�#¸Iéð‚s6…£Ã&Ї ÂjÃYNÖô-Ã|¡¤Ú_¦¹„k|ÖGæÆšž¼ „ÂhÖæ¡ 3GØ5²&`Ù)°™Ø,aûœ94Ã3ÌàA„hf9 �ƒF¶²vˆO]‚]È–U í“‘å"¹²:‘NÍ$ Öhˆ�éHfL" Òmêê“i‹kèŸÚW- Òa¤ì³³í&Òô�&ÂêËA>h‹[¤29¤ÚMÉ¡6“¡»„E††“h'wIµCH1É‘ÛI†“¤Þ“h'?$G0‚ =aȆ£ñègaØœj°8†Kè„ó@`‚Ã$#SÄtGˆLÀÂÕ×j׫QÖ÷Köµßot¿ý_V’ouë‚a6—N•¥ºV®‰=Þh“¤›I÷I¢^Öœ`›JÒÒÙgON³Í%l´&á¢,´4›I´Gm“P›“Wdâ‚umž’GÆ�0�oÖõ¼^þ¯Oýo‚)ßéZûMªuéjø¿·Ö“ãÿþ4^ÓÓª~ú^ú_éijúê+ª^“pà�m„–•Âv’m ´*é6UiPg /®ïê×oWõïèG×·_èuÿVÿ[¾¢Ò‘ÂסÛ�îã_¨½>þè{××n5þå@M¿ÃJ×ÿß¾)^R¥¦÷õÿËOØzï�ÿ-?×_ùnH£ÿÿÿÿ?!æÿý/úwÿùcׯ®Ý$=+)Ó¡¸Ð©->­ïÚ·Bû¾éÿ×áûÿþ—ÿÿãþ­ïÿéi¢Ó‡ÿòêþ¿ÿê5��åŽIGÃ÷,pZò3þ½û­ÿÚëÿý~Ãÿ×ÿÿÿývëýÿÿרþ—ÿÿ_Òë«I!Õ¶÷H}!ýáï¿¿�ÿÿðßþÿÿÿÿàŒ?×ÿÿÿ ì?ÿÿÿÛ_ÿ]Xzÿ¿ýíþÃ[ý_ÿÿƒù:ÿïÿÿð‚}´ÿÿþãá·ÿïÿÿ¯ÿaø# õÿÿ¯ÿþßÿÿûÿÿ_ ÿÿÿé{h_ÿ÷ØKì?ÿÿÿí ¿ýáá½/ÿÿÿÿÃýºü"‡ÿÿoß×ÿþÿí%èuÿÿý/ÃÿÿÿþÈÉþï'ë­ý}ÿÿáÿÛKðIýÿÿ¿uëÿßïOëÿ¤ßÿþûkîÿþÝÿ£ }|%¿^ëÿ½ÿ×á¾½ˆ_ ¾ÿû~s÷_ÿöÿµ¿ö×ׯÿûÿìê¿ÿßöÿ_Ûõ_R!>“}õÓ}ÿ¶·îÚüðé~×û³÷õÝ/¯þgß½7Ÿÿ³Eü‡£_ÿööÉÖ»fŠþÿÛ¾×ýÛÿ_ô½éuý¿úÿÿ ëöí4õl$Ÿim¥§"¸vºl0¹y=´›qÚm—ý°J!ìikkþÙúÛ¶û[¥µý³ûl3éVÙ/öÌû]o[­LöÍ>Ö®›'[mý¶¿štõëú¯d õM; BM;I0é'p´í; Bb›i1TÜRi±RWNÃh$î 4ÓNؤبm²/ +ÒM‹Ó¶)‹bÛ v­È™M†a„äW ËÒ+‡i'I0ÂM—›I-&Á-³>ÏK{×Ýí¥ì‡?íx`†Q6!„CÑ�ƒŽì�äóM#Å>i†#œöÁ‚i„íO !„Ó÷ aZ¿MC 6l Á1I²V“L&Ó#…" Ri§m&›Ç ˆL'ÒÔŽ#¢ƒh$­&)6)е‘4•;#Ý6–œß ùe-ÌŽŠB20„DD0ˆ¶d%ƒ aB ñF‰== ÙB2vM5TÅ'ᄈH(¦†a-°˜0’ 6!0ÂM¤ƒVÓTÛøW-÷-Ôc42F¾VA bb>gAý£ÆýýzN9n©ƒ“jÃu]}zZ KK¤ÚW_Q†‚l »¨d#BAWiD0I¶¡ÂŠ`Æ1ÿ™*Gb"¦Geh£+Î&æ½B£»;0H•åM…+‚GjÐR¸\vÎÕné5éøSHï…S#¨_¨ÿ¿mwÖWJŒ¬KºNû»ÓOîø^w?üs´‹ÚúׯׯŽJü|ì§r´Œ”"‘TŠn§�âQ¯þŸëÿ­ÙÙ�Ýk Ôa¹²)ôÍL‰™â ËÈÄpÈÈëN2\ˆƒ\ã:‘ OF¬�h�šÑ!¢eMýr¡�ªäºõÕUhÈOèÙ3�0�dvDêfš gäÏ#ÑFL#Ø~˜L¢d^A8F¶ð2‰"taÃ{/Á™ÁJ c„,)vi‚"§”fy²!‰“æˆL›$ ìDDЈ Šy8¥‘(Ðd0å:5Œ�D�SÎF¡¦F¢.ÉVªvj½z †ˆ°Òy3³í]–w…a„GmÚ_…G†¡á ¯§I†�›93¹á¤ÚN�y´xi i:M µ áT&�� +Ÿ„Â64k™Ò3e�mÃ*äѬ4nž94ÃØjÚ!:EÃD$ÎäøÐ Ó60F€Ìódtl26Ña0«'Ä´ "ä’2Y‘™"H��Q^¼¬&»ßI¤žޝø¶¯JÞ®­Âv±t›V’t †éZºN“¢]ÒAžaÞˆ¶Ùg£ÛI´œ,ÿ(i7¤è&ÐÐM¥»¤Ý6y!ú=´oNÒÓMé ÐL4Âùè(L&±áL‰ÁCAœært°`¦óHÀÑÞ½SÛIýÔ_k½Û_ö÷IWQI¿ö×Å}­/þ¯ZûàŸÅÒ½Õ*Ý/V•´N+i>á,-ûCn•²ÏÒtÏ5uˆÞ¢‚ ½£ÃI†–L#sF‡£a™<™î;4ÓL#d#`e Â6‡)ÃD Â!Ö@‹ÄŒÁŸÂ3² EÞˆƒ|H�› ˆë2¶CŒF‚‘TF%D|ë‘‘ÚÂ#wv•†–«zZºº¤Ú Òu@˜„ÚMËD]&ÒzÙh óI´ŸI¤›C &pÎ4G[iZL0ƒ6h÷I´„6É�äXi6�0ÐÔ$Úa&üÎM0M -´FÀÍ$ÏG¹ÍŒž623Ƭ3C>d,ùƒ4Ð28D†c3ÍÄxÞs1šÄ ÔG@ÿzIÕýÛ[ÛÇIû_Ú×}½´µµÒõ¥´Jµ ´ ö’nm¥i[BË8'I´›ŒxZ„3Æ—²ÏSÃ8ÒoÑYI°†•Éœ&ÐÒa´ÒL=Òm-0ša48 ÆÅ#cüÍ$ѳÛÕnºwàÕû~éëëx¾´µï¦ô×þ›h_ö�ñß­}¿­unšÕút¿ö›Jü[Jäâ•´­¢OJúI·Òt�3Í3Í Û  ÒN¬0¨öÐOûª×zõ÷½wÇßÑc¯öë¿Ðá}kïÓÿknüi7û¡u´:[¿ÿ»Zÿ¯�ën÷Õ½Òþ›¦Ò·ë¤¼m~Þ»ußòÓø}7ÿþ?®¼?å¹"¿ôÛÿ¿Ã¯ôA6Iÿé[wÿx_¿¼~ñ´«ÓЩ.•~¢–ûûvëb©î“þõÍ?¯ÿaëú¿éþÃÿïÿÿøjßòöeÿå˜ÿÿ�ÿè‡)Öˆtlu·äbOVþ«¯×ã}hãÒób¯ÿûÿÿÿÿدúÿÿì?ÿ5ô«öÿÿýe…þXÊ ý!ê¿Qÿëî¡¢Ç"Ó×Þ›ÿÿÿÃù=¯ÿÿá¿ðFº_ÿþßÿ¯ÿÿý~¿ÿÿÿþÚÿëþ­·¬<}®—�ÿþ¡ÿð‚ûÿü7þ/m/ÿÿÿÿÿÿýµü‡ÿÿÿÿþ—ÿÿÿtÃÿûuíÓÿþ὿ÒÿÿÿÃÿ¥ö‚ÿÿðÿþ?ÿwûh/ÂÿÿÿÿÿÿäCÿý´SÔ7ÿølV¿ÿ~þ—¥ÿ·ÿÞÿºß‹uÿ¯»×÷¯ÿÿ¿Kÿÿÿ¿ýºÿÐOÿú¶�oÿïOßþþy{ÿ¯ÿûtûÿiz _ÿ÷µÿý¿ñýÿ¿ïÿîÿ¥ÿýþÿþ÷Mÿ÷ë]ׯþßî·œÿÛ×W¯¿ü�ÿ_·uÿ¶—ž¯ÿïÿ¿×ý}¥ÿ¶“ÓÞþÖé6�ß·­Öé}§ý¶f¯î›ôŽV½š+ùv«ÿÿ¶¿¶ëþßÿÿÿý÷·ÞÚí»kíëÿðë¿~Ȥ]´™zªjÁ›K}m¤šÈƒ»O[‘-î“wun_öÁ,M�Ǻïµûºt¿³Õ¥¶m/�yÿ_ÿlÍÿlÑmï[uÖºÿïO�~ßßa5M‘ɦ®û`ÆÕµM´®Ø'UNÃL$Ó 4˜:´¶)4Ã%}¶ÐH5dxÓMWI´i¦ÅéY)à 7I«ôäWÛ/z{kk«`¶Úv½žŽ7m[Û´ïö×~¬ÑjÚÄD1ìÕ•«;P‰ða4HÊbq)ÚEcG‹ӣÞ!�N¿»`Â0i-á‚lŽ‚' 4Ã$ÓmSNœBM=6+‡Û“d/°Ú 6+ÛI‹a›r ïþÒkºlöùg¯2×'0eH=!ˆ†"¯‘\R Á!©XÑé•nU²y¦‘âÒ=n¿<0ÂÖ°“a(lC¤Ã º 0‚‘Ä1 „馚a´Ói1IÛ 9d4B““b» BƒÂUåaZž%b‹#Ð-Y/Ыµ•Ëa¥Òý¯éV:V•U†N�¬2#(Á@²Í(@ÉúˆñÿùeÈì»;ˆ·¸í]+�U +² ÛÿIJtd”ôïï¦d<¦BݯwWLÉ[™*æI^wE•…ÿ¿õ]=|‚dÇ™�“ñ¯ª�4OñÕó·JF-i?Tõ\®þd¢g¡PG`ʈa”„G�¶9åÚ!&C#Ä ›ÈòxŽˆè��‘ TBdÙDN›# È ÖgŒè27‘óÈò!³¢8³r®r)Í2¦ˆú�â;Zÿ +´ÐM �i«a&ôna¥CM“òs3½!f›A£a,è4|øL#`aG†iÐhØp‚9>3ƒ89$��™™óD!r'BÐÑ „ ²>Í3cD%ž …9Ó‘DNO‰VNjPE™]$PÏÆ£:¨ˆl”%Îæ–Ë:D°3Í&ÕÒl&é6–ËB†º»º ááØTVRy3ƒ8ÒnL䱤ڸI´G #CJÙ>N“Ðj³ÛûM ÃâƒSóL'ÅF�a£c'‚a0˜L¢MÚ=´khØÂ6HÌÏ  aд¬0�ˆr&CˆF#QŸ2¡Š ù=ÌL¡Îl?ÓWþ“Tׯ¥ã¿Óÿ‹kMBmv¡Z]? ˜„é^í$ïP›we“-æ–ËA? +‚M¢-ÙgL$ƒ ›DvE¶ˆ° ´ƒ �&ND¡„xjÚLi6‚s\¡ߦ¹„|„¬Î „Ñ­çã9ØÈÈ dŒ¹›Ï ñ™¯û¦ž*î*�®;íê›ÿþ>ëiŠNí:îô»ûoïºVïµðW¾–­ ¡pM¢qVÖ•ÒÒÕÃtµi&Õ¡A¶YÙö“jéhŽÈ¶Â ¶Z(3f�m&×A]4ŸvŸCº½Úö½÷¾¸úëÐïZô©ÿýWÛUOÒt­Ú}ö•Á+¦Î>ÂR á¶_a‚ÚIØEïØg-YÿÝ~Ã=ia;ý³ývž~ë^õlÍ]=™ÿ´Û×ú퓯T­µÿõlé×ÿÙPµÿÿöõÿÃNÕ0Ä&Òb 1P\SulŽ*šlRvÃdyMÒ‘qÛu [OM�Ú‘ov“ l¿eôö\ÆôØKÛ/l3Ókþ–Ø%u{gë¿ýYö~ÿÿru~¿·ÿýmý¤x”!ÂdcAJÈ`ši `�’VxµHðÑâ�pak¾"‡ ¤Ó &Nê�°U°ž´wa&³Šb“MŠb·b“N!lSh$Ó[A&ÅiZLSi¦°Øm°ÂWI¦›eþØ`•¥i¯mž›ÿlÏÒVÌ÷å•m1*HD0b2ŠÂÈbPM0¥\ž (B!‚[jƒ °I>ìŽVÂ`ÂLL ÉBNÖéíˆL0’ÝÅ&›u`Úi«"ãÓ¶*Ò¶Á*êâ"#M“e,FR�PŠtj@Å�h42²iŠ+@Ôôa„Ä)èx“íOw† °A4ëÛ …§« +ÒMˆZuúÇ+ë¹6Ÿ¥\0…ßÕkW��z¤—Kö’Õz]´(¯uÃ"7J@»ip`ª•�æÂØŽƒ $å´„'kqÿ-ó2$eÊ"¸›+¢§¦w L†ìŠ +W Êàßÿ^~™ÄÜ{¾ïé;ýæ§Gi×Ýëþ>ÿÿÿ;ZñØS%²)ãAžÎg„KŒ‹&) ‰FY0ÍC%$ò?“åó¤GÈžGDV#hìëþüfJ�2x&°6*3ò5†fff�a£Ûø #Àf�@òB3�0�Œ“A&IƒÒa„˜`‚gâ>%ÀÉóŒì�“#ŽÈ�HhÙ"¤R�¡ÊP)Ø(Ȱóhò$ÈÕäF%%ÌèD]ä&"[tE††“m4¨&ºN�t�&Ñ6i6š:O¤è&ÒméÚ4”&QÐ ö±„Âa0�Œ#XhØÂ7B5´{aÃ33æ‡(wÆy£Øgä "à3L"?!t Í3d%%Ѳ@Â"'% dÆFÔR@Ês>Èȉ²7�Qü캠M¢OKzUmõu •«Á>¥jµW«¤Ú +Þ 'D°3ÍPg i=¤ÃYá£Ý&Ò‚m- ÃH:A½ÐBûZN… ›BÝ75 ¥šAB`‹²:�Œž „lf£dæg "ì0�l¢A f’" ðO�x"�à¢ÙE“�œ"D^E7çmà ¿ÒǤ¿ßû\WñJÖÛ¯§miÖÒØi7‹m¥iki:ZÒM»«í4®‰sI´K²Ó§I´æ–péÒ ¢;h&ºg�é#ˆFŠ"»CA�øH]&Y®B +F²/æ6 +ièPÛ§[û´‡éþ�Há^ëõmUÒKëzu]ØÖºN“~©ãÛøþ£M¯Vø¯V“­:×p�WJÒ´ ´6‰½&ÕÕÒ´°¨Ÿn“i4›~ÞB¢½v£¿»þö‚øuäp·ÖÓûñ®ÃI·#…Qô¸í&þöÒݸ½ûÓÝ-­´�&öÕ=ÚÕ¥m¯vÕ¥¼q]a6–­%÷Ñc>­ü8=ý!á�ÃÛHXb?ïè±Èè°ß׬’º¶º,r,Ãÿ¿¨{«_hm~í~»\½ {½;CÑPúþ¿­Sÿ¶—þÃoÿÿØk°×ÝÿÃjÿÐÕŒ5þÚ°þZÖä�×ÿé¿D8Îú«oïºÃ†±îÓõ¯ÿÿþöÿÿØk·ûÿÿûÿúÿì=ý‡õºý†£ÿÿÿËIÿÿöùu‡ÿÇô‡þÝàØo%ïÿü6±øoûÿÿðÿÿêßû½½ÿØÿí¤¿ÿõ_ÿì8iÿÿÿ_ëp| Oÿþðßöÿÿûÿÿá¿ðÞêûý¿ÿÿÿÿÿÿý°Þ¿ú·þ»Çzðíé}ÿÞKÃh§eÿÿÿÿßø?øH7ÿàÿÿí¥ÿÿÿÿûmÿþÒÿì>×Ýíÿ÷_vÒÒp—ÿ÷{ºÿwþíë὆¯ðßÿûŸÿþïÿüÿÿhÝ}vÿ«Ï/u^¿Ûô¿÷Võÿ÷|�õûõ}»þþúÿ»ÿÿu×ÿÿÿîïÿAm„ëßm}r3«ÿÿó�kžéººµÿþïׯ۶ÕüÔ»¯~¯þþûð‹W_¿ûÿúì;»ÿëã{JØgªÞ›î®›Â(wßöÙŸõÓ¤ÙšVõÿí¶ÔÍ]6¿¶ÛÕí­:Úœër3õoìÕ»~ÿûþßþÚ_ëÿwÿ®‚øIX­6Ò�ƒ½+VA,1m5M4Õ‘GIß"ŽÓ½´˜aVì0íuOlònÓ½ÒþÏMŸ­[¶Ï÷W]Úÿ]YŸþ•ýÿÈA¿×Ûþ¶Îžc÷ÿõVöGa‚ka„˜TÁ¤ÃH0�ûMnØ„¬AB{a„i1.Ûªi§«!ÛH6‚TíŠbƒh&6*Õ´˜î–­+I°I>Ë÷M›iì0º|†*i-°ÏmÚÛfjÒ_µÛ3ÿÛ4Wÿý˜ÛÔÛV!ƒb 0gÝB'ECžÊÁD.bƒ�„IªjT4hc<4xvvÈ�ƒJÕC0˜ É@L&(6R;¶’½¥a Ä$Ób˜i1 M‘¶›a´­X¨íXÃiZ§ “a‚WWL0Vý5ðF²ÌôrÑg(�ÎÂŒD15 ‘†*!«£Ûa2= á®×¶); 2;ªa„Ú nìC¤Ø„à 0ÂLBcO´âm±WËT ½«ì/(aœpŽÅ2�„Lh«ÄB5A„Ä&!2v»öªÃ]qW+—ŠêØ�õò¹ô½-ýkÓ»KÚ¦»i+a(´a�‹“m�©ò a¹MÄ1ÿòn——geq�UP¤²2DMÞÿ… +hÊúsµ¨)6O*ýßò½L)-Âßß~N{÷¼­Òm_�ÓÿØNôÿ÷]ñÌ“­§Þ¥5ΚÿúynæE ‘"0a/”fȆŒ3³\á"!V[˜™VHœ$#„P*!2`e•yxÖgV¡çfs5–Q‘â`Š|ë’ë×]xMPL4Âa4ÏG#ñÈÓ=&Âj?'8OØi°š6ßMJÍ ƒ¹'œŽ ñŸ�ÆpA�€AóÁÖ 0ƒ(˜39ƒ'Â’ù±�Ä':æóhÞ|SQhñÎeäDé³"C!‘GDs"Œ†E “%#=zdsI°²¬4Èæ‚nœ$Ú ãe«îè3‡¤Ú#¶­2ÎÃIÒmÝ,$ÛN“h³’äÔ‹ &ô›Ÿ©6“jÉäÓÜÂ6s5ᜈ¦(õá0‹€Â5†Q„ Ô"*üÎ0�‚ †Œ ”d6Gy²)Ì“´kGQ’žr5£ÞŠ“¥n.“Kj? ¿}éô®Õtê)h&ÒÒ·i&á;õÚMé6®t°ƒ8xTÃI´›Õ¦M¢,6K“K&pÎ4i0ÑáBÐÒGê ÌänaBz?0�7„Éà™Fv3‡'Bì0�nDè@Ál‹æp`ˆ§"èDn!ÅV›hUmSÇöÿ§WéïÚ×ý%öÝúÒ¿µ�.�úu÷÷i+‚vž’j›IÒma·'ízVº¶&Ñ.l´(i7 ó‹mPMo ´žLäpÐM’rÖÑvGæÇj7wŽãßkÚõ#…ÿº÷­Há[ÐÚöÒÝ[Ðúi÷kÓÆ=núúÒtž¿otµuº½tž® +Õ'}ov �&¢|æ–“AßEŒÞ‹rT ä�ßÿä*?Øþ¿#>¥Ž ïþ½mkÿÝÝ)+[¶¿º�nï¾(~ôÞïë[ﯺZ�·ÝnÚõÿ÷ñaãÿÿ¢Æ~¿aÿZBÚãïïËŽÿü·%G/ºò3û÷ëÕÿjÚ–>áëµèt5¿¥ú‘ÂßêG�?zëWTÿþßÿÿÿ¯ì?ÿé/Õ/[øiÿ‹»zCïuþ•_ûø°áôßòÇ¿ïÿ÷Ö„Fôý~‡ÿðÃÿÿÿÛ¯Øe]ÿúþÜ¡ÿÿ·¯ÿ÷ýªýÿÿúPpÿõÇýúý!aÿ,Wøÿ,r+rÿþÿÿÿm/ÁÒÿöëý&ÒÿðÞÃýÁ½õý´w×þ¿ÿí·¯ú_ÿÿ°ÿÿÿÇÿá¿ÿÿ¿tá°‚þÿ[ö×ÿüÂûÿ†ñn¿ê×ÿ÷ÿðØoÿÿÿÿÛÿÿWK÷×oÿÿéî—ÿlWþÝ^Òÿÿ úß¶¿ÿÿÿá°oÿÿÿÿÃýø#ºûë»ÿÿûú_ºÿý?±PýµíÝÿßb¿ö+þÛÿþÆ÷ÿ¿õïü7ÿþ[i~úìéíÿëýúþy~û{}ý?õ·ÚÿÿOìU¿_þîý×ïÿý‡ÿÿAo í™ö»f{tÙ¢û¶ÿÛ3ý†cþý~öÝ¿Ûü�ûÿí�7ÉþþŸþÝWô»×ûÿýßûÿ_› %¤›`–“`–¹îý°«rö_ý,‡®ßg­³ÿí{¥¶gôÞ¾¿¶f´µvÍ?¿nëþ¶Îžc­ºþÛÿÛþοûÿ®WMŠ´lT4˜¤Ób“dqM=ˆV­ÅZv”Bm4ØØ¦˜¤Ö½6ÒØ`’i6r‘\5Oôì-Òôà _µÙôÚÿkvë÷_Ü�7ú÷êßÿÿmå[ B5A‚bƒ�yáÒ=¶šGŠõÿ2×ÎÂüì4çiÒ^ÔÈ�`�ú!2lÈb'"�Ÿ3 Ê²$ häk"“#äkDtGD²\äkGf‘ß­uï]u$¿�öÑñ»^hØÂ>0�šAƒ»aøÑ¡Ö†b`‹0‘ì!:aK²6F¶h3ù!Á3ʱAPEA¢j$΃òA«dhж¿úêŸåV««ˆÉœŽé6“¤Ú#ˆFŠ †“i<™Ú=´ ÃBÒl—“ ú<0‚ ¨LžL#`l—Š?#cdüœÏŒ#]„kšA”fp&°4A�„khö#83LÁ„ka0Ñ>²qJƒ<)Ðf¶ ÓdHÔh‹ófu4Õr.Š¢¾•¤-A6–®–‚a¶•¥îÖ-­¤Ú'ô› +™ãe¡‹i6g Ý4¨&ºN�m'JѽQMúL4�'CI†“çïÂ5°š£Y›3a|Ñ4‚ < Â5˜ç¡àž¤"‚>'„JÈ1ð„2¬B� ¢PŠ�äã5˜R@¿¿û±ö¿ý1ý-[Û_§ýzmŠÛÒ«î£ÒZè'ÂÁ:VËŸJÕÒtHz]<³ÿIÓ#šN“hl´Æ“hŽÛ-­¤Ã +†É Þ~Âü#sFÆ�ÄðœË9ø—“ã;Ѭ39!8Öõþè}{N¤pµþê\%oÆï½>›M´*ººWþ*õµï·ÿ¥¨®“¥j/ÿé:´•ÉÅá øN“ª'Jú–¹ô¡ ›IÝÕØH&ô›DXrgO\‡.ÿô·#…½ÿKq­|}´¿zÖýÝw§ýu×}w_I¸'}ûôXÐéÃý!¯|þ[•Q½9*ëŽþÿ_ðëkïëixÚ뮟Þ7qôÛKÿÕ4¿Ý$Ÿ_oQ«þÿ¬?ÿô¿ÿßÅ¿¯Øpëÿô\‡üºÃQ‡ÿ�ú!ÑüwÿKõI´¿Ðãÿþ½ ¯à­÷á¿ÿ ÿÿÿÿÿõÿÃaªÿÿúPצþ¿Ëÿÿå§ý þXäeËrT_»iËðèñ ÿ†Í'ÿ"{†ÿþÿÿ¿ý×ÿ 0Þ ÿÿøm}‡ÿûuÿ¯ÿÿ¿úCŠÿúøþÄ ÿ†Â ÿ a»ÿõ¿ÿÿí/ü7£ÇÿÿðØ#ðß÷”^ëÿ„qÿÿýÿÿëõü:ïý‡KþÒÃÿwÿÿÿÿ÷øl=„¿ÿÿ°ØA?‡þ´Ÿmÿ„¿ÿþÛÿÿïn½ ×÷ÿÝwýúÝÿÿë¶þîéÿî—ØoÿA|Wþ‚ÿÿþÿïÿü�ÿü7¬ßÝm“ _û¬âÿ¶×ïÿï]ýëÝíÿÜ:_¿þùœÿ„¿ÿÿÿÿûŠ÷øo«uûwZþÞ·þÛ×·ÿíõÛö¾sÍ_ÿÿßöu^»dÂÿô…ÿÿÿ¿ìˆMÿ½ßüKßðûaØ@´³«g½pFÞÙêßKû=ZêÙÿûöÌý-³?Þ›]/o_ÿoöï_׿õ]oýÿÿI¿ûßÿþÿ|Bqµb–Ø«¨„Új› "�Ý2<¦Å6‚]�Ó²>žÙƒ´“l%JÚWmÒtÃ=XUïöÏGö}uiì3ûi}ßß “f‹ÿ_ý¿Û[ÿm»ïÝüÑv�ˆM^‘(¾í…C¶Ui†m+M‚M4ؤÓb¤›é¶“ÚM¤…fÍ4Õ4ÕŠÓTØí)v›a+©©Å¦Ãa‚§f5í>ím³÷Ûiwý™íš'ÿ­vÿ¾" ˆˆ0Gd¨­â" "R¥caJÆi†B5A„E0Ä&šb™DÓKv�Û ´í0Óa:lU¤ÒiÚl•Óa± +â“NÁ°šÁ¦¬U§Á˜ÖäJúm‚M‚L=µ·´öÏ«þŽRÌŒ�ƒd5£×GÆ Â#0LŒ€Š${eñaTðѺV½¦­6»`–݃ Û&�± ŠdAðaõ«Õ�U‘m¥|G&Éx9ÚÂ+DA„ 0šEsG¹¦ Á5¸ö-5a„�°˜0‚¯JäÜ¡�…!Å_Ä}-|tºm¥Ód9¹nY‚Paq�ÿ&à ̎ÍhGv‡æEQÚF[“é4‚|íRÈbS³HÊŒ)™e\MÊ:Š�ýºý²=S#8ÉVו–Pÿ|ìÂ!åïðÜ% +ULÓ%©e¸ÒTŠ’ú;¼™Å4ï¾ýZ IM¿^ëëvøëµûõõÿUïò±^W4GeÖv·ëåq|�#†)š’y·yW•¯:uYV‹¢$¿÷T׿;ŵ2$Ïg†y“¦ Ï=¦Â5´H˜|dùîD®�žöDfA™­æ› ‹FÆo=—óA�X aº#C%ÆT êğ?%S ÛÉDŒèd]Jž¾¤«Æ“oA]&A›)0ˆ0Ú9¦Ò¹2ôU¶ªôÓ'ºI½'dc‚.6+L#s3“FÃ*9OWB40�Œü „h~Kæp@ä'—lÞŽð� ‘˜0F¶3Â*d„a�²6y‰YȤ§TB"?�=5ëoIZôt®šZVÚÅ·¯Sæ¡à’‡«m Mfm&ÐdsA6¶ª­¤ÚNƒ6aMú¢#¹2aÿ¤hi0ѱ†ƒH ÃY*“MGÎE ƒFÇœ ñ£XerÏ‚Q˜3ìŽh„œÄƒ''& ûTó�St•¥M§Õ·ñ[ö÷m[Òü_¯]'[ýW]E&!:_…‚w _u¤Ú&ô´ƒuI6‰Aœ³A6“rbäXi7&r|I0ÐúBÐÐ@Þ“aš6£ç(Ìà˜A“ò ‘ ��‘™�¿·T?ß_Þ¾í�‹»ºJG�ußM¡^›§Æ»i§ÿzoý×J÷JÒ·¤­'¨N­®Ô¥moI6‰?a"\Ñ'¤Üša¥i0ô›ÕÃÐÓ“&yöO¶g!ÒQßVþÖÞôÛ¶— ¿í ãÿºÿëý¯R8Zºöñ×o×q§t¯Ö÷õnšÒÛ­+i]'Iõ}a6êÓÛkj7öOÿðè}ûýŠÇ‡Ú_,r4Qc‘¨º¼1á¿�ïü~º[Hk¶”m?ýí<~ÝVã šmÇoJÕ¥¿Ýÿ­+]û×·×ì?öÜÚÿKa·ÿ��_°öÿÿ¢äkß—R–9$Váþˆ%-ê­¾–ú_¾4ß~×ûöÿÿöÿ~ûûzi}¥°Õ‡úÿþk%ºÖô–ÛÒúØËOïÿIÿõ´¿‡¿ïÿ«ÿÿÿÁ¿öÌ,¿ 6å?ÿÕ¿l+ðŠÿø]×ÿý/ÿØûzUñ{z·×«ì?ÿÿÇûwÿ‡ÿŇÿáõn¾ÿüñüBÿÿüÿ½þßÿßÿÿÿþÃÿÿô¿`Їß_û÷Úè¨w†Ý-zþ˜{a-¿×ÿüx_ÿÚÿþÿÛïKûÿÿÿoÿÿÿê÷ëõïM¿ëo¼SÿkáÒÃþ—ÿ÷¿ÕßýÿÞÿýûùnÿþÿðoÿõÿíÓnß[kîÿä"úÒn÷ëï÷ÝwýÿÛ]ÛI‡ÿøïÒºÿ~·¯ÿßÿÿÿ¶·o®õçô®ôŸ}t�¼÷Oû{uç—å:ÿ¯ÿïûýÿÞ¿ýŠ�ëÛ×µþÝpßÿï÷û=¥l3Ô3ÝÓm¤©Ý6õ¥ô¾ìÿÚœ©û³E¶h•ûKïþ×ÿÛën¶Û§¿ûS‰ÿo¦­~ÿýéî¿ÿÿßአØb˜¬  ÛI=Õ�‘Ö ûA&¶Ø_­évÁ$Û½z°Gé}áÿÙë÷K³û¥¶gæwïWWöh­÷¯o­º»[uϯÿÿïì%Ø ÂŠh6’iÁ¤ÁB”ìŽÚLt”&˜bVÂÝ:¦Ä$Ø¥«´­»¤íaÃMSMYÅ&öÚ[`­­0ÂIÚêÚZY�Û f=¦×ßKt¶é»®ëÿïöþ""3`B!lDD1XÑs{ÊÈ0R¬ü š;½5=°ÂQVÁÓ²,ëm5h4îá0¬Bm¤aˆM �ŠOµM´­&)4ئ)öÒO»Km+/ºL3m´¯«¿þþϯâ"+GeY^¤"GdˆDH«dF©îÁ!`¥]Â݆)Š„�†SLBM;ŠA¶“ ´I;IU;MX9m—ÒOõ嘄" ÂÈšñ‡ Œ1  a ++dbîÕ{ØJ¡‹TúÄDs%�¶S a ++]W,ãu­$—™*×ÓÔGÛH>#+�ÄBqÿòÜW–óÀÈø)�Ó24ŽÅYÎDZ§ÙؼB©Ø!•Ô�ÅõßÿéNô‰ºvvf« ÷ÞÊõJñ ªß ~îþº^v GìÎÂ/"KúwQëéúþJQØ¢ù’Á�KÎJv]dÉkéþ¡%HaÙ¼"ìç;’+áDh„Âq/=™'"2ã82@ɲ(—Œ"@¹(ğ*!2l΃5’©Ñä¤R*�qÈÛ%Ñ�'•i}u„˜¤kú*Ù?òYm,ÎBÂhÜyÂhù3‘°2x&­äi‚ &��øA£àa²$ÏóæiœÑ­‘­–B83Æ2|3µ˜ÀÉ’gˆÐ@ˆJˆ•‘4$ ‰B5À‹™z$5 ²VÊ't^�i+A‘Îì[V-Ô*a¥ª'Ĺ¥h3†“…I´Gm/DX¢±¤Ü™È턘irhMô“ 'V ªF¶¡5M6?FÎ�s:Aæk5Tk .ÈÌa0ŒàÏ"934O„ Íó'Ì "2åY/1ÎVK‰R\gQš™N*!+›e"΄C2°‹ú~é¯×ÕÒ×­+§Q¤›A>ü ´·„ûi;Kð‚WN“¥»I: ó‘ÃIÒ}„‚†Ë�gøA6Ë & ´0� 'a Ðì6…„‚aƒdæÂiÅ„~f’a„ò>Ä"`‹Á/KO›*èt=>»·IZïNÿ·~íiZßZN—¤øúŠêï¯WKI½®ô)%]êÚè—ÚNôO„&ßD°3Íçº%€Î¾ &L90tx}2hÚå$�Ì­¨Oûþ—úí׿©+]ºW½{¿‘Âû­ÿùÄ«u×Õnû®µ¤«§Š®é:]zï^×½4Ýo¥O†×Dž“mbwi&ÕµJ÷Dxþ‹¯Ço×]ÿä‘áþøÿë#§ë_m­vÕ®½¸]”}½!ëu»½v“Öÿþß´ïN©´?íºZÞ:Ú\+¿ÿ×ÚUÿúCì=[õÿ¡ý[¯\Æ�°c×ãÿŽºH·&Œ=)c‚ë¬vÒwÿiö¿ëî=[ûþ;ý/}¥÷ë¶¿œÿþÃÿÿÿÿÿµá¯é/úÖ–;Koÿaÿÿÿÿî‹rH×ïÖ¶èuµÛ¯ûýÝÿÿ†ÿðŠÿÿÿ¬{kíëçßâý¿K_ý_ÿÿÿÿñÕÿmyu‡ËZý°‚úêöë_ÿü7ÿ‚Oÿÿÿ�ËàØ#ÿaÿø#�ÿaé¯ûÿÿÿÿÿ÷ï×°ô—ñ ÿý[«ÿþü?× ¿ÿÿ¿@ž¯ „ ït‚ ü}'¹nü7¯ù®Þÿÿÿÿ÷_ÿm}‡ÿåTÿßb¡ýÿïïºøKÿ¿Þ¿KÛ°ëýÒ_øA~¥ ¿Í>ÿÿÿþÿÿÿü7àŽ?á6ÿï§nŸÿ¿~ÿׯÿµýW}Òþ_ê¿·ïÓíÐKýpßÿÿÿÿÿÿ¥áü$ÿÿö÷Ýoÿüçï^¿û½_kí¶u^·¾¿éw½ï¥~¿úY!?ÿÿþÿ«ï_°ü7Ú ü†9Ÿ³:ÖÛ3WµtÞ¿¶gÿö¿¯ûÚ·ÿ¶Ýë·ëÿJ­í·”ÿ¯¾»þ©7ÿÿÿÿ÷Úúý¾émŠNÖÕŽE#ºM„Pî×M†>ÐVÚJ�„~Ùêýºnü'ÝžúÓnÚÖý+VûÿèÍ7Ýkúëúÿ÷ÿÓ_O·ö¿í„žšÛÓTh& im=ˆV�é†ÐIölÓTö)ƒÓ‚cdx6�±ÚR í�‘\?´ Ë�žöØg+1ÚVªÙêÌm¥ë}¦“íÞ¿úý¥í¯¯yÓ­µ_£žNÎï&4B!“D Jˆƒ‡£Ü)ž!°‚F†Ží¦»í‚i;†‘§p¶V‚`�‘ƘNšv“N¤íˆQWJ†ÅE:PÃÕ; ¦šiéÃ#ˆ�éí¯®“ 䮕õퟯ9f}ŸÏfŸÜ´LÄA„#9€„DCB-4�hq +°Âì0˜L‹7°L&Á&œ-¦î];dqµNÓ`Â)ÚkpÒb¡†ÐKh&¤NÖ�¶Ó‘ú¹j'f#µ†""(#·Gj¦ÑbŠº=¼ar�ܨƒ lǧ*Ka0˜0•ÞÄ-¶J�|²•#µF80ެ„Ñ/P0Tì'G‡ô#B"؈‹ˆˆ�­~Ú_Ud;P%%Y‘+ô’ˆA‚IWÄcQÿòܤŒ�‘ŽÊó»áG†(Ro8®]­¯S²¸ì® +vY„aÙ£ ¬ÉÙØQH_~ôÐAÕUI³ºK¿ï¤ÿY•%™*ùغÿªõwüì#úä�øŽ)~û]HªU_ÿó²U�Œ[_DI‘PÔR`YÁ?/R0ȾÈk›gw—βæBYÙFS¯ôõÇ%Hj� ȼlhÖ’ðL Â6�mŠ a¢a¡HG²“.aa„”ó3dù��å>�#£#³y¼á’’¬È)ž0ƒ$ ê2E;:�;2ÉóS53Y'�ÞHÈ’"%×ÖËBtšI´ƒlµdpÂ44›IÙfaÉE>Uµa§h Ú ûTÒçÊ`˜@›bœƒŒà˜F†iÊHÏ#„A„{ Ã1„la¤0�ƒ;-Fš4 Â44A�šÁ5/Á‚uh‰Ó†HNh‰Ó‘¨dV4�^·KV’´›á6é7¾­´!ì[JÓ#šM¥» ÎN¶4›i¥DvÒpˆ¶Ô",nÒb’a ­ IÓBÂaØEÙ¦ýž�I0�„~lšIöhЦð�„]²„ a"ìð§ŒŒÌ Ø¦hž5Œñ‘¬Ù�2ñÐyI•Ÿ¯ÿÛÓ¿j.“ýk ší'út´ºtŸ¥„épV°L&÷ZK]úNàÏON“l¹ô›Òl!«AÚ™Ã8ÒÂläÎGmÚ% #KŸ�µ“ðfm0A¨A„¬#XyóÖ! •f¡^Aèk;qu©*O¿¤ÿß‘ð_úuý­iµ}µ÷úÒéûIßþ·]ZJßÿK’uUÚ$éªm'„íAZV‚b6“¼¢Xæîˆì‹pˆ°Òm&úA6ÉÄ$éÍЂ¾?ò5{ÿî¿þ¯¥ûõ ½èzvºßwwõÐþ�/vºëUýSþƒKªÐk­}¿~ö´·¥¦½á0›„]'á+t*ákI¿úB¿úì>›ÿÇE×ÿ××_ÇßüÇßÞµãý­Æ� ÇÞ·ÿC­ëµoúÚzÒô—|q¯ë¿þì?ÿÒõÿÿýºÿÿÕ}WõÿÇô[’ü·$ùc‚úǯ§–=ý-´�§ýßîµ¢ûuUà¯_ÿûÿÿÿþ¿ÿëÿûuÿÿëøÿ�ö¸ÿÿúCøÛÿõû�é"Ç]ô‡Â4m/ÿü7ÿÿÿÿà¿¶¿ÿÿëÿÿêÝúþ—úÿÿé5ÿÿþ•¥�J[”9mÁè-°E¯ÿƒÿÿÿþïþ—å\ÿþNöë"Ïÿÿaî¿þ ½áÿýÿÿý¿Ž¶–#Òüoÿõ~ëþþÿÿKÿ¯Ð_ÿ �°‚ÐOÿþ‚vÐ_þï¶—þWÿÿÊ¿÷ÿõïØõÐC½¾ÿÿ¿oÿúÿ°ÿ_ÿÐ\B´ÿþâÿ¥ìUÿ„¿ÿýïÿÿó9ùc¿ éUn×þëÝïÿoKûÿKÿõÑ¡j¿úXß÷¯ Ÿý/ÿ¿ÂZ)ßúÿô‚ú{Ãéí·¯÷SŸÝ·Ûk߯¶ÿëÿºª‹kûÿúŸoÿ¥èÕ?õÿÿúÕÿÿÿ w·áÿÝ‚lƒó=6’þÚ][iÙÿlϽÿo¿ÛÿÓÿÿ»ÿ¿ý~ÿo×_ÿ_ý¿×I¿ÿÿUßn÷Ò¼”6ئÒM=6ÐV”¤›"å6)6$ØEä í4Û¡ò(ïM³Õ/ØF¯ëa;d™ë ößÿ¬ƒû3ÿ¾þB�“®ý¿ÿÕ+ÿÿúûïý.Õ=†6’jžI†MÈé$á&¡„›˜?`µ¶ x'MX§´Ö!6�ª¦�‹vÅCÓV/ÓND6 $Ÿ¶räQÃÙ s¾ÖÂwö­™ÿÝ«~»kþ¾ÞÛyIú·sÅÂDEÂ*¡B„kÁ„" )íƒD4Áòx; Óóà *[ºõ»»w°Á;„Ódp“NÓ`�¶(&šaŠN á¶Å&Èómƒkl‹{b“Ó‹í4þî×´¸mŸVíŸï®ŒöÌúNYyÃE DYîQƒB� Ù¦iU#Î)Ÿì+v‚ì´÷µ…i°•;’¸Uí4Ø5[OACv5¶*D.ÒÕ[ WUrßDÈK'3!´CHøÉÔ«r®Š»:)†�áÊ‹Aïᄚi«¶Ý'«Òá]'&álØš)B­u×ÄDFØA/]uÛH$ÚZ]vB2þÐM¥irº�&C·N)°—+Œa‚ Bâ" q¸ÿòl|›ª¨Sµ¨ž-ô`� fHɨU,6fÈ*=…&ÄGcÄ«ÿ¨¾þ}��Lâ2(ŠÔv.ÎÁ ˜¯»J; ïð¤U;QÑÇjW‹¿¤îÿOîÿÓAzÊá#±?ò ÿø�_OîQþŸëÿä¾wVd +±ØOÒ_+ù…+Zç#¬GÈB5F™ú�¤v¥�V¿ê©ÿšcä©Ì•s¬ÜD²s.‡‚xhOœ¤N„Ža8DxÏ@ÉÉÑìë"a1Ì‚*r\M²iË™ ȳ" ŠFCÁ_(jг:’’ Ra�‰N¦v«’ÿ¯¯’öv©ô4rtèr(í'“ŒŽJíÐÑá„~Ïï„la™8 &¡OѰó>B6Qñ£u»4Âà0���“DˆA€Èx@Ñ�„ 4By!æ¬ÜmÉpå!…!:#È�2[Zä6U2#ʹ=}z'­÷Dâ/kM ¤ÚZ'ÀÛKô›We—M¤ÃD°��l!A ]+I†—'ýÞˆ®ÂM¤éiçšA†¡=F²?6=!¦“çð�È#[ݸgÇ'Äá“æ Õ ÌÌùè„N{$ˆ ÉxÙC'�DI‘@¶žr5D|�«)òT¾ÒûûOãíö£µÿþ:M+Ó^-ÉÇñÅ]'wÒ½÷éi8VYé6g –€›IÒnL÷KVšT´›KAÚia¡¡„hnߟ“AèØÔ&�mÃÁ$kª=ù@x ÂL2"Dˆ<óAD(ÔBq;Š‘ÂþãO©-Öõúiúë}7¾+~©¯ÿû¥¤é¥m=+jÒVô)a.‚¤ÚM¤é7ÒZ&ôKƒmßežƒ8z ´ÃVÐOÂA6É�?,a8ȰÐM ÓCI—ð�Ì#cFÇëÿß¾¸íý/×¾†›kût;´:ÿR8]ú×]ý[§Òë_M'w§]S_·ûÞ¿ÿ„Þ· ´°¯Ò¶Ò�¸Á6•¤x•Û- ´›I‡úÿ‡ú- �ð†«ïïË‘Ü9c‘ÿÁ{�õûÖÿ¶¼}ûë×ZMô‡‹»ÿ¾ú«¿Óé*ÿõ®î‰E]ûIÒoëÿì?ø¯ìÿÿÐÁáÿÒú×ÿ×ôCŸ }½×EŽ—ö×iëÿÚ¿#…Û­GI¿÷C¦ÜR½&ö·ÿÿì?öÿíõ¿ûêÃa­ÿëþúßÿòÓØuý�¯è±Ÿÿýô¤�ñëJXà»ÿå�wko]Eoÿÿ†ýðoòvÿ†ÿÿÿ †ÿÿýÿÿ÷n½¿Û_ê½ÛKÿÿÿÇõÒǃÿñï_¦Ò¯÷ÿàÿá¿á†ÞÿÿðØ7ßÿùÈïÿÿÿÝ}‡þ—ÿÿÿÿÿþëÅ¥°ÿô·ëÿWÿÿíÿ¿á/ðÿ¯ÿØw¿ÿýÿõÿÿ´¼7ÿÿwÿ_ÿÿÿ悆ÿÿÿÿïïÿïý¿õþÿÿë»¶ÿýþïÿúÿV!x{öëÿýµÿÿÿÿG¿3¿ ÿÿÿÿÿ¿ÿÝÿUûûn¿ë·{¿ÿÿ~ÿÛ_þáÿ‡ÿúØßÿÿýú_·xþÿ¿ÿþßç•_ÙQÿ¯í�?m×ÿÜëæ:ßý¿Òïÿýº½{þý÷{{ÿÿÿª÷»íÿÿ_÷ý{lÿéÿiz¶~ëûµÛý»­}.ÿÛ»ý¿õ~ÿÝ/·]¼ÏÛÿ­¿ûÿëoÒßn÷ÿßÿú·^±L�Áêš~ȶöJÒOM‘GwV_läé/él3•ÕÓ äÚÿg£×­½¦ß··_ÝH?³?oµë½»Ýÿÿ×úÖûóOÿï]ºÝ{ú 0Tïi§ (V› ÂZwé¦2>Ú Šb›JÓNÒMа“i1LiªlVšÜ8ll0Ÿ"õ´“M‘y¤Û +/ZMݽ·mŸM¦Ý4Ã=ZÞßßim™úV­í¶N¯¯ý¾½{Ûzò�”6ŽË¢F�P bˆz>¶�ÉôVCb-0‘áÏTb¬0›AFA’„¶˜aiÚ{†JÓ 4› 6ÒM: ¤Ãb˜…¤Æº±±±¶–Å-ªrw²/t“a…´ Ë“g«m† f;£×þÙÿKn­Òn×–�fcm˜ˆÊé ˆ‡qEqGH¬aŠ:謰ƒ'°» ¦!28IŠl‹ „È®˜¦ƒ +ݰ´ÚN X…¥ إب§KNÙqÚIºYyºlôÚ_,¥¨¡ˆƒíaˆC Ï[*:'ƒ ‚EciÜ„ ­AHPívMH´§p´Ã $Ãi1 ´ð®MÈ„eÚ; +c+¢ "®¢ª * a…#ÿË{ŽÒ±ë_�Òÿ¶—ð›—ôka‘MÓ¿ˆŠaœ¦Ud|a8ˆÊí!�þY‚t·JaK8Òùn2+–á3±¨”3´»¾žª¥rlìRµÿ¿…–H_[ÿÓ-õ±ßy’Z"dvdˆè–dU/þvT·y’®üÐÍè×”#c/2� BR>r0�³‚"!ÉVK‰’âA‘ÖO‰êF¬¢^mšˆ�GL¾JÙ©ò$ŠR#£«$2’ý<”Ù(È*èZj�osM°Ÿ“ £a!³ó�Ÿ°Ó3´È¤˜L#`fpM°2ŒÀ`üˆL„F°ÐDx$à †CFÍdeÌA‚ Cƒ #µXÐR@§c‘ e;#2¢5žAO:f·¯ê½ö®•®•® ©ž4�,5 '“BmpfÍÃGºM¢;aÚL4CÂäÎGm&Ñú“hØÐL0…„Õ4ÓFÆ�œô~Øa3°I0‹¶‹²xOÉÐô3“óXaØ#838 `�`�óæ00EŽ?›8Y;1‚GÔÌRœÏ f³D@æè4ÌÑã!¢2ù®*^B"ú�$þÞéZb·¿Z¿V>¢ÒV”'@›m+…´›D�=<&Òm[I´›A6‰`gš"ÛaÚM«ªM„E¶†‚l �Ý4-&Ô:N…¤ÚA·¤--ÆAZtk#âÇi„l Î ñhÖ!,†~'æ¶lÓO BDbÏBÑ àѦÌèE;»â¾¾-îÖ®­÷ûNîÿí>ô×õ¯ŠZM+tíÂnJ⢩7 Ñ8¥i~¨“¤®´�ö“¥ð‘?i6ÉøU¤ÚN“¢;"ÛI°ˆ¶äë'a¤Ü™ÉúiÃI†šhCF¶L=¤lz>o0‹³Lð­¬-ê×^ÿzW©+ÿN¤p­zÛ‹u)?[M´*�Û®×µõïÓ®£ï®“ézM¿ZV–­B‚Òà­¨A´­ß¥´»¿«}û®Öï ¿õ¾ïþ—{~ûþ‚V¤ÃN½8;JºÌmž—ûVÏ_o]ß¶é³ûw_é+gý&ëm/Ûom}»¥ýoîŸîõþÿé÷«¿ëWÛ½ÿÃI6B{I�žÝ4Õ»Ií&)ˆIªi­±IÚ¶’~ȹM† iXV¹´“O´®ÖëI]³Õÿ«gým?Õµ~ÝiöÌÓòlÑ}ë~í·ö«Þíæýþ¥\B!„uD]J·<9úÄ*dd&{ {l%ul+Mˆ&0Ä&(6•ªv’aˆM¥ Smši†)†§±klUÔˆ;M9Ãa›»Om'«a…a¦È?ý°¿Ý6}[]ŸìÍ/Ö­«y:ÛHâ¿oôdP‰ ‰%^dköƒè¥Vƒ0ƒ1 tjÜB�ÛLŽ‚­ŠÓ¶ÈãiµÂtÓalRpÓM´jÅ1¶ši± ;dd4"‘¦Ë›fž”ˆ8l3—l0I²ÿH=vÏ_×DvÊå DC"ˆˆ0@Óƒ—H®a‚ ¢zUé aJ¶Š²;£Ä1ˆÛ ’°®ûakS¸`¬&©Ãƒ“Xa& b“¶**ÒvG�6)~µUâ"#™¢½H¡�–ˆˆ4GLb +š )Ï LUÂ[aZ¥ZñW›j�9-B#ïô½|\~‚ $¿úTØ0�PZý/¦•PýÖ”Éc 6Ác­¦„±sc“�¤ãÿÊëXŒœ¡T­ G‰ØH›U}2ªÂ Â’ÉKu¦[�fBewõkõï$Œ&hÌ‹kûâþé^�Ÿ+ŠR¹bñ¶�Ò'þó±žWJ^º�ÿõÓȦd; +ò·™(__Ì–ˆñƈ�8΃5’š&2ȉJ„GD|†ˆù.—2Ÿêšê¾¿Ì•$Ó» pƒF°Â7B5†ñ™á´BD¾— Ò¥ÿô›zJÑ8Ix·½;Ò%Ô­–„-0�M¡ð¿Ì3ý× ƒÿÿQÿÛ¯ÿÖÛÑc‘“ð]úÛéxûÛÝ[ýqî>×nôô?}}n;Ã_Õ=í }6ú�Õ¥~ú¶‰?A_ÿØp÷¯ÿ_ý÷ëëE§½×ú_ü=×ÿtXädøÿ~¶ú^>?è¡­¾†ã^ÿ}n¾ý%m—ÿÿöoµÿõÿn¿ÿö×ÿÕiøý}‡ûÿøÿìÝ·ÿü±?ËrJ×Ô‡<~þÛV¼ŽÛ_ô¿ÿàØon¿ü‡ÿëÿÿéí£»¯ïÿaÿÿÿ¯°ÿ__þŸñVÛY†}þÿ•­¿Vß÷ÿøpÞÚ ÿÂÿî—ÿÿÿÿZÿ,�wðßÿúþãý¿ÿýuõ_ëú]Øm¥éÚUùÿõu{‡éÿëÿÃ#¯ÿïn¿ö×ïé¿ ~ÿÿü ¿ ÿÿàŒ?'dw·_ÿºÿþß_í¯ü_öÿ×ßÐCïö—ÿ�þ¿Ã¿¿¦ÐZýú_†ÿÿÿÒû_ü Ÿ@½°•ÿuäðoÿôwiÿß¼òÈÄúûzÿ¿ÿïOûì8Þ½¿K÷é×ÿ¿_߯öý/ {_ÿëx@¿ðÛcÿ¥ÿÌÿíÿtÞ½ÿÿëÿÿýv»~ö¾ÿ¯¾·_ÿé~ú½Z_ú6¿öéŠ}÷þöý+þÿ¶z³imÒm;®®C×Û»ÿ_Kzi¿o}ëÛõüæ—N¿û~«ÿÚû¯®—¥Þµz_^ì?ø¦+ý¸MSb¤\jÚLzV’¶šß°f(6ÓÛ/úiý¥¶—g/lôÙµ´ÚëwÚzõkuÝûfkÿÎO_u¯þ­þÛÓÿÿœßöö·¯xa0–Ø`Š28LAC+´íSL1L'´á§]¦ž’ ´¨1I¦ÅH¤-´wr/6E÷~‚t–DÙLÇö²÷`ƒ¾êÒm{6�.ÓívAùŸ—ìÑZíúv•¯ÿûÚûrÜËlÖŠv"" Á$HA¢ÈÞic§¸a„°¯`˜M4ÚI­´œ' ¦Ã ZA†”6˜ ƒL1Q 6J*ºXI´r(F’vá°í¶Â_¶ 7[g®Â(~½¶“^Þôõíɱ.â"#B#-tâÊ©ƒéˆÊâ°÷!Qƒ�[ +l&“§NÙà ŠA´Å&ïÓ§aˆH4ö(6‚iŠNðÝ ˜î´öƒl¿NÚKÝ&ÆÑ6zgƒDSã¬> Ñû{ÿÿÿÿß÷ý(�ÿý+޽¯ÿÿÿÂ4ýÿa¯ûuûkþ—þÿûûÿÐ_÷ÿÿá°Fÿ¯ý~þ¿ÿëþ—}/ïÿÿì6/ý´úÿùÓÿêߺÿ¯îþÿÿ‡Kÿb¿n¿ïWÿÿ_ßÿ¯Ýëvëûºÿó8/á½jú ë_ÚM™ýº^·wí¶gþÝ×öë÷á!ýíz½úL0I5n§¬]ì3“ )ÇÓ{¯í�?öÿÿzÿUû¯à�bi¶MS¹+¦›Ä.ÒlüÃ>›¯ìúë]³?äjÖÒoÿuþaJ·+bª!äù¦ÂG†Oƒ0šÒb˜am$ôÛ iH®ØJöeû]ÒÒlõØEÛ¶ÒÔý¢ÔF ˜AŠ ¤švÅHÇP´Ãšw�ì4¤Å'bÜÜ%¿‹ˆÈ Ä#¯*Ù: Ši©á°HïævÖ�1Ä& +Ýڰí~[2†"8Ë„v¡! è]^¨DDzÿú^ž•p›iæD´‚ÜAˆ* Çâ?ÿÿÿÿÿÿÿÿÿÿòÑìêˆÐÊ +q� ý„ÉØA©Ð9üöOž9¿Fç2²Ç}ªèØôÒn¡[|ÕRk¤ÿú_Mÿ�ÚOï¶—«õU÷ÿuÿðEùÇ×CÿuøÿýµõدoúZõµðÿý|ƒè+ä,Š™1÷ûy ½ƒî–½ó+$š©þ<éÔõÓðßÛW¿ýß·ß­wÿI¿ÿ]¯ÿä?û­·þ“ÿÿµ¿[ûKõÓ¶úoûë²ò¤Ü†,‚`¨Ð�a„/õNì)q°ßþYu €kÈ-†š`̹™û„[�ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2ªú_§ô×éý»úMý[ú ¿¤ßÒoé7õoé7ôVþ“A7ô›ú·ô›úMý&þ“I¿¤ßÒoé7ô›úMý&þ“I¿¤ßÒoé7ô›ý7ô›úMý+úMý&þ“Iþ“I¿¤ßÒoé7ô›úMý&þ“I¿¤ßÒoêßÖþ…ý?§–ð}< Í>pÖ) S¬Od<ë‘™àrœe‡QNÈ>ž„Ðk}ç ðƒ?œ‰ó�ƒxAôBì)è¿wÌLþѹÝÿ|ÄËÇ02ùí­h»}o¦ÿI´�þ�Aº ÞÚÍUß[Ò{õÒnïûô›ßúî›è”aé7G¿}ç|þÿoßm/_¯&ïýÿ…zÿ™þ—þéWµÒöú~ý¾›¶ÿï÷×ïüz^úôßÃ×ßþõÿ]н¾—·ÿò©‹êÿß�p×!î×ÈÚFš^ßö߆¦öÿÛÿد�|°}/oýù„ƒ×ÿÿ–Í€«ü|%íï÷áî=¿öúúª§5R º^ßk·á¼‘^ÿï÷éhÃëé{ÿ•Ò/ýÿßëý7÷ÒööÒØÿmkØÿcÿõnò~—·þýþ“{þûi~•ýý/oa¥¾ÚM¥ÿÿ¶¿ï÷ô½½°—È`6¬0–Þÿ½Ý~“¥Òöö*Ÿb—¼‚_y j+ô®CA,0—KØxaˆiªk¯ -úbº^ÞZ Òöñé{KÛý{¯µí~H’NÚøüƒJ#ÿÿÿÿÿü™ÿù2ýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿȸdGÿþ@Ø �1¿ÿù`7gSÿÿÿÿÿÿþOjŸÿþW+¬R½l¿ÿüàÏrº¦_)ã\-ÿÿûKÄÿÿõäºÿÿÿ¥ÿÿÿúKÒÿÿÿ¥ãÿÿÿKÿÿÿéÿÿý/ÿÿÿ¥ÿÿÿô¿ÿÿþ—ÿÿÿÒÿÿÿú_ÿÿÿKÿÿÿéÿÿý/ÿÇ GÒSÿÿúA/*?ÿÿ¤— ¿ÿþ’^—ÿÿƒ¯Kþv20Žð’ô¿â#þ—�ÿüÿý×ÿÿÒÿÿøKÿÿéÿý/ÿÿ×ÿÿÒÿÿøKÿÿõÿÿô¿ÿþ5ÿÿIÿÿúKÈEÿÿ½/ÿú^a%ÿþ^’_ÿ!®’á�ÿ×Òëùìþ{?ŸÏG³ùë1ŸÏgóùüö?žÏçÐ\é.¿ÿÿþ·ýýöƒ?ŸÏG³ùèöqÿ¥ÿÆ�é¯i¯ëßÿ¯²> ú_üì»; 3ºçô½ýú_ÿöý/ÿû~—ÿÿô¿ÿïéÿïÒÿÿþ—ÿÿôŠÿþþ’ Áÿÿ~’^—ÿþ /.’ÿÿÂK†—ÿÿK„—ÿÿKÇÿÿIÿÿKÿÿú_ÿÿÒÿÿþ—ÿÿô¿þJA«ÿKÿÿþ—ÿÿý/ÿÿú_ÿÿô¿ÿ$_ÿ¤§ÿÿÿÒKÁÿÿÿ¤>—ÿÿô½/ÿÿÃKÿÿõãÿÿü§_ÿÿú ÿÿôš×ÿÿõô¿ÿÿ×¥ÿÿü%éÿÿKÒÿÿÿ^—ÿÿô½/ÿÿéz_ÿÿÂ^—ÿ_þ¼ÿÿiÿÿá—¨ˆóÐ/ÿðòÐ/%¿ÿÆ?ÿÿÿÿþW3`3ü´†H4üÿÿÿúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÉ€É ù’|˜D™#á��‘9•™³92Œ÷ �¬™8„ùª3�3y!Í‚æÁÿ¦šoÿƒ)ÁR B¿Nüíi’a ¤i›Ê3Ù°\Ø?ôkhÖÑ­ß_ŒÇ4œÐôý'¦“†C»U[õã¤Ú]7Úÿé:6†¶ëÿÒ5½/ÿ's3M~Ÿm}ý&é.ÿÿ¦Öa¯Úþ£ONó¿ÿÿ¦û¯ýu­UÿÿKý­×ÿO¯£=ú×oÿÿæïÿ×ÿ÷ÿûçÎï_ÿàƒ¯ýù?ó"wº¿ÿô¹¯Óÿþ/ýëãùÙš‡^½Gò µ†’éêëÿ—Ï×µê\ MŸ÷_øÒåØoü ìÂO¯ßûZ(þirýëæ?æ�úéî¯ÿþ÷ÿOÿá/﾿©ú–-ëÔÇüÌÓ_«ÿÿôßÿÿ¥kº×ÿïãŠÿÐ_êéêÜ^õÿÿÞµµ§ÿÒõb£ÿÿã½ÿ­ÿÿúD=_ÿÿߨ¯ÿö“i6“×ÿßimý3Þÿÿö6)ŠßþCU!ñ¤Þÿý¶½¥_ÿö©ªªÿ¶)НþAöJÒÛKkÿø0Es@FšÚÞ«Šãþ¾C Å_-„!„-5ûü¦Cÿÿÿÿÿÿɺ§ô¿ý/™I}„’ú /„’ú +¾_¤d›ÒúC«ÿ·Ž’_¿õi5¥ð‚Kô¿K $=zëã¥ô’­µÒÿþúÿÒøAøý¾4ŽÃ/�¦ë_¥ÿÉ»Kß×âþ‚; ¾z=~®ƒüÞÿå¿á/Õ¾/ÝCzÐoïÛú ïÿl‘Ói?þ‡tßÂ_þ�>»i_ïù#¯é–{¯ûé‘ý~�G®ß 5ºý-´¶ûíuý¿oè êÚÚ_¶–ÚN“ÿý¥ßÂPiXJ*CŸa/JûJÒÒmµßé1LS]aŠÞ˜¦8©~Åmü ˜ Ј‹]XL*éØ_ô„DR-jÃ$¾•}¿ %ô_KøI/„’ú +¾Kô’úÉi%ð�Zú ¿ $—ÒI#!µð‚ kô�I$’Ké«ú µð’I/ÐA$¿„’ªúH%_„IWÒ $¿A ¿á$’¯ ‚I/ÒAÒI*Æ)$¼­ ’U-a’ +ZËH© ’é’¨ ©e¤,’^�I$¡)%ÁVÒU2.¢Kå¤a ’®)RòÒV‚K]$’^B‚¯¤’ÐÄ$’ËI:A%ÂIiB$—I$ªA$´_ ’¨ ’ZUÂJ•—I*„µ¤—A%P’KKª %¤— %T´’á$’–h\‚Ç $¢J’TI(I*UA,$•$¨*–hÒIaBIRA%$ª!% ’¤”%TÒJJ—A%I(K ’¤”$•.‚JY¯$‘‘§ •V x„’IPU -$¨$¡$¨*„–Y�I$ª‚J’\$J)%AU%„’ ’¥ÂIRJ‚ªK %A%J©,$•”³ItI(I–\RJJ•PK %I* ¤‘\5I.ùg4H$–©%•êQJ…)gKA%â‚K¤— WA(ÒJYÕPJ¢’ÐIRJªKA%I(K ’+—Eu$—„«é*OA%Ý$«„µåœ ’ø¤‘^½,ß wëH®#KÊàçYgB+ˆÐV”SÕRÒÍý=%ã}(JÐUUÐQÓÔÄ…/î +Aש=z]SJžšÐiÕ5ºJºH*z ‹Ð*ú•t  +Ÿ�Ut –Õ‚…\E*}|Då‘-�^™:aCDƒ("r'#¢$Ó(2C$HÈl�É �È'Fp×±Úh4ÓMPjƒ0š &  ÉÓ œ‰È¤3¢$Ó:£¦H3¢$-dÍRª‚¨ÖÑ­£[F¶¨ÐôksÛžÚ44hh±Ú-Ú-Ú馚i„h=tÓL‡�4#:`�š œ‰ÈœˆyÕ è‰PDäR-dÃ!Ô¬(-XT�&éºl*N´�[I´›„„Ú Ö|j�mÚ5¹££CUTgz-Úªk¦ši§ªi ÓM2FuÂd=0™( ÉÈœ‰È‡�?úºÕúë­:«kiuî®®“aB®©=7M¤ØTœ*ªA°¨&ÕQ¯¬Ðæ¶�mÚ5µThz44hh·hÎõE»TÐzi¦š§:}šJôôûëk^ôêÝ]]_ªÓ…«]tœ.ØP¡k x(T›IÒÒtž›UI°´ôð� áV›Tkh×Yï5´khÖÑ­ªýúÿÿ«4üÒÞ¿õÕ÷§'ΚÜïÞŸ~úÿWé½éºo¾× +œ*¶­«uaB¤áRn› +­¥¥¤ôê¿ÿýþ�×ÿ§§õÿ뫬ÒW'Ιӫ4—4ˆu9>ºõÓÓúß]u«ëV¾º¤ôÝ7ÚØP¿ýúÿ÷ÿ­~ÿëõÿÿÿÿþ·wï}÷Wÿ'ΟšJûïVi�%sJžœµ×¯÷ÿ_ÿÿÿûÿýþõ¯ûõÿ¿_ÿ×_úßÓ×®¿ÿ¿öÿ¾êõ“çOÿÿúßÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿ_þÿ^¿ôõ×ÿþ¿ÿþ¿ÿÞ¿ÿÿÿÿõÿÿÿÿÿÿÿÿÿëÿÿÿÿÿ¿ÿýÿÿÿÿëÿÿÿÿþ¿_ÿÿëÿÿÿÿÿÿÿÿÿÿõÿÿõ«ýýïþ¿þ÷ÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿýþ¿ýv»ÿÿ÷ÿþ½þÿÝÿëÿÿÿÿ¿ÿý×ÿ_ÿÿÿÿû_ý÷_¿ÿÿímÿïßÿ×ÿÿ¿ßÿ¿×ÿÿÿÿÿ_ÿÿÿþéwWÚë½v¶¶¯Oººëÿë÷W^¿ÿ¯õö¾ÿõú÷ûúýÿÿ÷ßü² g³Ûi}þ¯OOö¿O¿­¥u}þõßk¯ïÿu¿ö¿úû¯ýÿ¿÷þ¿ÿkþÿ_ÕX¯a¥¶•…µm-¿mm+J÷Ý]&Òû_I÷ÝjÒý×´¿ýéû[í­×[^½ÿ[¯õu×ÿ»µìVÅ1LTVÅlSÆÅC C CIµöÒÛ[JÒa¥·ÿ}úí¥ö¶—O¿î½Õþë÷÷ëôÿßkòÊZbÐa4੦˜M1LSìVÅ1LT{û°Â_kí¤Ú¶¶•¥íÖÚ¶“i_ú[Ó~ÚÚV—Oü³jA ÐaP´,&šam~Õ1^Å{Å1LWÇÅE1¶—¶°¶–ÚMíí­¥æ™ì÷H®6Å¡„XL&škÚÚjìVÅ1\qLSÅ}ÝËh[ 4"ÂiÃ0ši¯ªäÆÃÿÿÿÿ,ël§p�„FD Σ(Ê3`¹!R"§AѦþi¹¦çNnhÜæ¨¼aa„NÝè?íiù½OœŠ0ƒ4Ê0ƒ53Í‚çAO‚æÃš”*V“zíÓé6“uA´mžŽtç÷Þ¨¼h¼ìÑÿá·Ú.ú‡ ÉÙC¤é7íé}ôßÓ}é?ö‚më¿ÐA¿Aæ÷“ÈÞÉÜÓhÀÿßÿ÷¦½´›Kßß½Rm&ïþ›únŸt¶©ôÿB“ Dyüqþž›Ûÿ¾gÿ}}þ“~¾ßíûý­{ù߯KwúŠÿãÌþ­!Iàˆ÷ðD{ÿýÿëÿFÿßÿ]ïߦÿ¿½öïëý/ñÿ±ÿïý?¯¥¤Û$;úýøÿÓþßûz_ÿ×kÿºãŽA& 2-'þA<Š3·Ót¾ß÷ÿ·uíúëÁùßÿ…àÁ†ÿþ~Þ¿ûÓÿ_²*qüŽ¿Mí×þ×Òæ¬Ó£gCž¿ÿÌ ?ÿÿÿÛÿü0ÿ ‚M}¯ÿ¿é¼8oÿõ¢‘ûíÒÿÿø0æ÷àÃý_zîH¿uÿÛ[$wþß¾‡oÿûk÷ùÕá¿&4èÉ÷ÿ½´¿ýóW˜ßÿÒýþÿ$v–Þþÿÿ½~é¾>×éuþÿí«ýf¯÷Ѩÿ÷ÿ·þ½½þÿ×zí«ilýúú_ikßì~Ú¶¼±êÚù¿ÿ5ïïÍïþÚM¥ÿû¤ÚúM¤ÚéÿÚõ¿ïúÝ~¿úOÚö)ŠÚþäI´¤6“iZVÚ^é6ÚL4·ÿm[K[KýÒÿýŠì Âzë¬1LUÓÅEH? +ÿÛI°—þí¤ÃI´›í/µûé¿åš°6NÉÆÂ *Ø]=;Åoû±LS°ÒþC÷å¬jA„#UÓ0˜L(^Ä/ß~¹lš E¡v¸ˆˆÿÿÿÿÿÿÿÿÿÿÿþY¢ +Yºçó°L™Œì/!Ù�dú˜R² ’Ú²5 +v¶OGedýï"w2I÷Â÷F�§ÝFŽÊΟú-t5ãK„¨ì{ÿ­* v¹«$Ò(Èê–´�ãH&»%ð§Ù³hiVfÂ!<Œ‚üž¤ÜßÍ38Ò)ã ÍrE&¤wÌÖ•­RoÒU» B„:Ó „Á ">m¼¤ … û>ki‰Ì�F†I—PF“Aë£�KÕÃ.�:£Ä"ñ*AQÇ£»F¸@˜ÂL:Fæ¡B`‘æ¶"ò8í|Â5²†x¨WÖ—‚;餴´�}$Ú8ô´èïIÒ ҄“ªZ(z;Ñâê¨& ÑXÕ&Ô#àÒãI% UxÐZ­¥¤©u ´´•n–’M¥ ´º´SÑCÒµm\#+EAyýzI/–9œ1KKJ’Ö•U$•*IR×ÖÖ—J·KV’ñV�T­„©.½RÕ RI(¿]ŒU$½°ÕIi,t”Uq†+ö4©ia/Zú®©tÝ*ZJ—]Ö’T´’×¥}iRWcøõ^·KU í…ÒJ«I%ú¥®�Vº¥zIhRñKªªÁI_¤’éW­}t°‚þ•W¥A6ßðº[a% ¨õ¤¾ª—]t•=( ZKýWDq¶ÚI/^�‚Ã¥_ÿÕa:UJ—[KÖ’Õ. +ÛýW©„�Z9פ«U¥úýk¤ñUý.—âí×ÕR×ÒÌ.Ì×T¦56ž’S%Ö•%žªS‚Üéét–—¶ë¥þ*𒤓­k¥„µé%JŒja˜Z L$ÆÌÕ¤ô—˜]%¿˜ý%0« ‡¥l$ª”TV•a+IPZ¥Ik¥¥n¯ë¥ª¯™£v^zIÒéh:ƒˆUQW¥ +›A*ÅC‡®ƒŠ‡Òmt«B©*µ¾õKJ´¡�Cª¦L! +©ÐU +PNªš¨lSi6‚Z­%l%Óké*,Òˆñ«Hü0ƒBÓUAªjC`ƒØJ¸JTÅ1V‚„Ú +ª�l›G 1"ÔB„Á0ƒ©ŠáRtƒb"35·H:ÿzßýº½l4ž¸l�„4–"4�8ƒ1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2» hÓc“jƒ$ �AxÈ-ƒShÔ³FÀÔ– Øª[`l å3P†ò› °h�¨£ÿæK,ŒÎé’%æJ@é’l‹’#² Ü‹ä2ŽÉð~ÔU&Ö!ر’ÄaDfv”»~yóá<¿Âã #H˜f�"¨‹ä|ƒ�Älˆgì4Ò¯ª}¨T¤ˆQ±K‘5ž†³�f±·IÄt…E!ê¿¶Ú Sú„“aKUi‚Žý’æ¾HF¥¯é¥O]m¤ÛAQùüù„¸ÎfŒ¹ôÈþlÏÇ£("†^¬Ñ�†¾’ Šv©cÖ—ú)ôúÕ& ¤¡Fv’ªj� ‚éó3<Ï3fq›0D'+Hÿ¥o¤bõûJñǮޖÃô¿ a'Â0ôÂ8ü °‚ü †ÕUUQ£ê9ãWGói%S¨‰i%ú_úUátµõ¤ÔVß«®–•„qô¨§a829„ŸÒKI_ 3¨UAúÿþ—Æ«ÒÕ%\PO^�¥ZK�¢œ8ØZZ½$ÞL~©iyä•uÿ¯T—úÒZÒ¤¡}V—é](Э*U¯è:oí%RéRÒÒýkKÒºëרIuÕUU뮿I- mzKAV†—¥ºõá/Ói-*ªXA~•UWI%¤«ªKõýö«¥ÑåI~Ý?è=*éW]|$¿ª¥úýU-%¤’ïOÖºŠéi^ÃT°ƒªU$Ž©}UJ½kô©kÒðý+áý5¤—K ¤Ã¯OÖG‘µEäŒx#/éõ^µ_]RÿZ¢ _Ž+詺„�«ˆV–”8}žVy$’äu—óþǑֺJÃË¥ëRé/¯ú¡ i*Z¥IbÞÐP�8VÄ*¥ml._ªM1m(;‡½C‡®Gìœ<¿ê½>ºþ•*^ô!5ÕU&Å1Ui~ÅUU:UUW�PéÐPÎi/pª°G—_KüF†°©í„Á l&©„ÕR°Â +ªº…Õ6”/÷H÷ö• õI–ðF¹\]† „Di¦CmV’‹¥ªv5 +Ô$’ýLË+�Â"!ÖQôÕh •ÿr¸‘\$‚+¤�Fµ×{« @�:ÛKA¨b„Òƒ(üÒ�J’ÃAq�ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿɨdù@j¦² dMÈCvÀÜ�Lar@]ž©�» Ùe¨ ÈFÀЈØ/ù �Ü×ÿÿÿÿÿ .6€€endstream +endobj +125 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 72 /Subtype /Image /Width 72 /Length 299 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ HHÿÄ8!1AQaq‘¡ñÿÚ?õ+6™] ©Èm!¹r,¡¹12e×Ìí¶C£�KuŒu3lhjf£TÑ$2©E©$\fÒ‚€’S89òÞéWb«—ÖÑŽê—ãìÞåT·4‹(J‰’.J½ù%9$Çî&QkzÛFŸ¢»%ÔÿÙendstream +endobj +126 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 128 /Subtype /Image /Width 64 /Length 1462 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ €@ÿÄI!1AQq¡"ða‘2�±áRb¢ÁBr3ÿÚ?ú6]ø1®æ'ocµfæçQ[cÀ0–`Ìw»€&s£ä9G¸Ú¨1Ù{A� ’f ÂEtˆ’ÐZÓ=gh‰µsdCÆÆ2«äxRX]÷“¤�$�ñØ„øÛ‘‘”»¨’='oú¡±&–<Í“‚å0Y’Z6©ë'S]T*4‚ õOöªËÄ÷B‚ì2tõZ ȪNãŒÎÖ*zC†ki¢Šó9ªÁ1‚ò}ă]éu®ÅÍ»µ¢±Á•Ÿ'ÞÌ î»Vc÷Í×e( ÆòËÓö;^GËåU³* ;̺O_› ®Ð`î ·�¼¿Trä +Ê­,,� �bÔxV8ù9²cÇ‘\�#Éi€tm}@ùV¹x¹3mÜÃÒA�ä¥X^4·jÕñäpD�3q¨~sPœ|»ÁvX…Û¶ãúUrpÅ ÆÒHÿ‘VO¤1ªÛ�ÏÛ úõ£"9º#¾•#ŽG¨Fæ#wk�ôíYãá¶4Æ€ÛmY=¶ÄÛø×e%`Úª¤h S¢¹_3»ìÄRßq2OÊmo=+—�ŒYq°s¨=GØ�õ­rrÝF0�Ip6î%w GÚz)4'#�ä¨TµÉ“AEàƒÚu�_­sqùr,±x[‘Ü« £ÿNle}ÕQ½‚¨S¸±‚N±?®«7/($cöõÚ¡‰›]¿/;^·(ØØ•I˜"zýÓÐOž•Ž9�0 Ae62l{vøÒ§ÿ3ŸfÆ1F—„tïü«L8òc$•Ôž£÷1FŸ·‘¥î¦âÐeMÿ)ê~FŒm�¤²(–Žç ð¿�F|Y36&Ûÿ[³D‹Êºý¦Œ‰È¾Ä]ÇF&Âý@¹�ð5®êFŠ)M­B™ª¢¹˜2ÁQ*Hƒ:õ·×º¦°9Íö©m¦O§zŒ¼Ý˜ÃŒnÒ4]¤�íù~TÏ&ÂI$ OÆ´Ó�#í31uޱjÓ±ÂišjäTxéֵĘ7äL›YZ/`:î‚nm&Óð5èW7¸ØDmfˆ¹6ÖmVÙöê­&,Ÿ1j—•$í&n"÷ˆ�–”,ºŸIIžÛ¼¦ž"ÂÛMäùÿ™¨Ê§‘�&"¤Iþ-k|àö®ºTP)Ò§Ed¹%�o*IÉÇ�)Y!¢ oOßMÛ'ÕÇp±1õè¸÷“Ý]-K!2» �É‚³iã¥^L‹‰K5…JgLŒTR€Hê˜úÅBóp¸V éboõ3¥þuEÒ`u·�½sœ£&%]\�$Ü]„‘Ô¬M,Ûqr°äwU&ìÎq‘þÃTÜœYÈô�nºÏÒ*¸–0§p‰Ý%»ß¡7&µÏn$OÊŒ×*b'U}à‘¨Ü¾Ü€WÔLʃ2MïØV˜¹fÒ•”�°E£H¥uÅA@�(§EbœœYjº“Øh<¬!ý½ë»öÈÝ>òr1b ;ª“Ð�*ŽEQ$Ú’eL‹¹XÜbÌ™„©ïäb¬°Q&£ÞǸGy¯ÿÙendstream +endobj +127 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 24 /Subtype /Image /Width 96 /Length 639 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ `ÿÄD!1AQ‘"aq�2R¡±ÁB¢ÂÿÚ?õq‹‡©ÍxŸí"D�ֈ͌‚C)dÈ´k4Ë‘\rRê ¨&TyâÀưf°È¤‘ÈHÚh>|X㓪Β@¨ó&6( “Æw`6?•¾6‘\Ä’TùK9ƒ0�4�Ëá¶Ãq|‹‘8•äÇ̤ ˆ¯¬�§o§nHqóÅ“‘ ²Ä4ÚÖ:õ¥î}@¹ +ÉŒÞ5æ¥?ˆªqÉ�2 +‹ƒ´u®]ê�‰À80ˆ´q6Šæ w%â†-©õüŠ£"¬*õ">6®jÊcÆ÷·Èo¾•:gÀ vÌQL·—’èÆ~ß‘éOí¿©êb·—ã6–S¥Zpc`QAZ({|PbÚM©†4 Ä(Ž‘jɉ1@ ­Ûây €‚‚$^æßoMxð�Æ"6ŠSÛãnR òm÷kÖöøÿ¬ýb'±íñ¶ª6ÿ&WÀé[&*@vÚñ�Þ¤L9Ÿâ|HibÊWpÿZ¯Û§M€&n@ëÖ¿ÿÙendstream +endobj +128 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 8 /Subtype /Image /Width 160 /Length 303 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  ÿÄ8ÒR“Q’SAÑ¢ÿÚ?蓌{~Mè'ökÀé Æ=¿&ôŒ»5àt„ã*ÍŒé ¶U›Òlë6;‰m�fÇq"N3¨ø® &ÙÔ|WŒê>+ˆK5«^H’Íj7¤YfµÒ$³Z�ŒéY¶çÆt‰,×sã¸�–m¹ñÜHšþÃ]<ÜÅq2×{˜n ÿÙendstream +endobj +129 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 16 /Subtype /Image /Width 32 /Length 295 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  ÿÄ>!1AaðQq�±"ÁbÿÚ?é£ì¬€A¾ûw~h´2* ˆ<íL¹úš´ÄùkPÏýÓã´í.«Õr!AÖâœes� ÂÑÖ`!^gÊ£…Y˜¹ÞChÓI˜Ó@cÖ†/—#cöº±ƒ’Ò«k…-È‹xóZ llBÂË 1ûv½ÿÙendstream +endobj +130 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 832 /Subtype /Image /Width 8 /Length 718 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ@"ÿÄ[�±2r!AA1ÿÚ ?Ó5Í<þ/ïú Õüóçé0:«çé믟¤;¡×_?H ÕTú@(tÑ>’Azhé Q:hé ½4t�¦Ž’M$ +t�:(é E$Š:HÑGI¦Ž’Š:H4t�(tÑÒ@飤€4t�:(é P裤�ÑGI‡E$Š:H:(é ½t�¢Ž’E$裤�ÑGI:(é tQÒ@¡ÑGI裤�C¢Ž’ ½$裤‚tQÒ@Š:ïGI†ôt�7£¤€ÑÒ@ÞŽ’ èé oGI7£¤�½$ +ÑÒ@ÞŽ’ èé oGI†ôtz:H7£¤�½$ +ÑÒ@ÞŽ€Qv¢´�µ¤ +†ÔV�6¢´€¦ôV�6¢´€QZ@ÚŠÒmEij+H6¢´�µ¤ +‰µ¤j+H +mEij+HMè­ mEi]¨­ mEi6¢°QZ@ ¨­ mE`j+HQX6¢´‚íEi†ÔV�6¢°µ€ÚŠÀÔVj+Cj+µU€ ¨ mE`(kEZ¨Ô5ª�­T é¯ÿÙendstream +endobj +131 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 8 /Subtype /Image /Width 48 /Length 334 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ0"ÿÄ\’Ò‘ÑBRAaÿÚ ?Ñb¼�†+U‚l—†+U !ä~¡Š•igÈG«*Ð ²êÎêàO�ÓYYÝ\ ¯ÿÙendstream +endobj +132 0 obj +<< /Filter /FlateDecode /Length 7928 >> +stream +H‰´W[�ã¶~÷¯Ð£X3<¼ó1A€"ERÄè.°) +­G3ã®mÍÊžL7¿¾)’¢dO'}˜ÕŒÄÃÃó]ÎáוdNzo´k6œqRV5œi2Ü»†¤bÒ;£‰á3‚smDc�±ŒáoÔ쎫ï~:òæÇ~õ÷Õ×–hí�!’–k‹�\xå5Ö2c½'£GŒœRjä†)/õxØ#²…}bo¡ª$�NXÄ#a´4EP$ Ì’”Öß Gh „ÅpV :.9ê·¼èF³ðŠ¡¹s²Ð£ЇT’2'…y îtüª(oÁ]”4Ò<¬”AóñZ"³pü@7Ú"l‰B è´ÆR«aÑ*ˆ#À +ã¦$ ñÐ×bvAÜáyxXQ³oV?lWßmé_¼¡f{¿§<îÞl_ð£ÙžáýáÿßÙlüÂBÃ?ˆ7ÎQh_ÁÂäÆñÉqµþéØ>tÍ»í¿W<„B‡ð!ÞÝjýóÐïºóyzxßÇÚ�Jø +�Ñ”SdŒ%h^hDœËEðìïº~ +î§tâ"تŢm7÷§öpž¶U€fܶ:�€Õ„ùl±¼=ÝM;RÐ߸¢Á,æ´øþçaºtCÙ+Œ ×{A_°k}•êîñÔú‡}w7eÁnêŸ/€F#h|:ÕÑó|¥ iÁ?­·�f#ÌúéÐ^îûáØ¼ûçö¯�zP\¤™AõF´ð>ePNÀ”ÈXöÏCUèÿ~ìÏ—¼,…ú §ñõÐíºÓ¥fl ½kw»îÐ í¥Ÿj Ÿ™?ÛŸim( å”ðÍåqd`(”˜Ø-ŒY# ±Z>óXBq>Sm |x S×ÍvÎ;'¸Æ"ÂǸø +R…fÕןÖ/ûÓ]ÿ’j}Iœe7è>ë—Çýî1¾£õó9�#!—±�Cä"çÓo& 6ä˜�ÁU5:ô»ö0:…¡Lo$I˜s0 ž¢ÌZƒ±QC×.`¾>§ˆÆêK/C{:?õÃ¥”V„(Ü$Ë7@,D²h&꺎ôëúoßo}w¢ël¼‹]`ãÔ]^úáËâ,èópϱšOCéwý�•Z‘Ì#Ň˜£,cè–Z&écŠ +LÀ„- Ó[XwîûÓ@l€á:‹¨=ìïîrtL¯ ]ª"Zþò؉&}]WË` sÑ~çK+gwK¸ØîíbÍÇ7y‚¦kâœ1¯B7üÖ 3«(�´»/Ýeâ.ùÄݘb`¡p¼:ĵ»åné ˆ€#¯ŽðÒžÿéJ‡4vï/ûãþRÁ7ö"´o()¸Ï‡‹cÔx8gkIHÉL¤Ü,4"Ô­ji<¨Çx{©×|ÙúÏß.¥á¨LŠN2tWZ,/íñuš‡›“p¡Œ³•36á|:[üåÛÓ~fN#K±}.Ð÷›‚"ý ^Ʊ0ÌÚøÉ®?> 7¦B—&‡DSœ»~÷|œu$Å„ãÛO#Ðä×í\à?ûc{éßFë�C ›™g +£’H‚[<W󥨯 eó3[ÚŒ‹áãÔÊÇ#t“9% D¸;¤C~Ø_§ZŠlô¦ \Ñè%Ïä°8†,å~û*¥FŸ¨W}B€Ë?t¡´è`šÖ]ÚW.\JÒ†`nëÓØX™Æû̉YÛH  µs§ãG/ýóáîºÅ8Ûßf£)•7C÷õy?\q¥n÷y湚™]ª�™ì×DÁØL{8ŠC£üÛá¡ûcþ!p‰ÕšÖ,Â]{Yv_��ÙãyɶÚ`*ÑV‚†+fÝφ¼jà»ûrê_ÝÝèž�y[6Á\ѼìüÝ7€).J¬3 ^2Sãâ<¢WÆjSÕÑÕ�ÂU([7F¾±KU +í—/\ø 6©“º>.±ˆÜv”IÞ9®÷ ¿Xÿ!Ím×W¬&áÂh¨kò•¤`”.^7±Ï>_¯ÿ¡=wK{@:ï¿|;_ºc ž÷¼_úûË &¸æ�àë¿ ýóÓûåE`CÒr•¶`†ñò 0‹vaídÜl‹·Ÿ3™qŸ¯ Sc+ä@[-·ƒv¾ö©ò© Ã*ÊGÊÁF8—<-ÆVþ¬|Ü;$=g”­¦0ŠNãmi�iù-»F3³&6Äza駬î*duNv¼†‘´ëÏÆëJòì9ç +ÇJÈÜeÅ<øêZ[Ÿ_áÂ{Um`Á3ûãÓ¡ÛÌ{¨V5æë îžXk—^‹Jªüò®;´ßòê´ÐO—½¹�Ìv0Ì›ìçÝ#ÚÈû:Šr9Jº]{²�7½£€vš9ZÀºÀ’S›' Ú•_Ÿi‚°� Ö<‹U(ZÜätO]]0[d˾OwÞÉoâÎ&ñßÜãº]ದd0¨Ù÷»Ã¾ªq銆òîI•IVô_ÆË¥INäŠÂE»©‰I>€ðÊ�#fãpØÚõlE©°h¨ ¨nÉ¿Þç&ù†ny×3ªL2oÞ{Îwly‰ôô0L�>¡íT‡¬˜ç(a'5øM˜6ßs ú€§/=>ѧB*”ó{?�µyd@ +]ýë�ê—®ÎßW‡KdŸ¡Œmæ)˜ùz`WFGEÞHÛ}Ÿ�” V€ri‹ø�IÝT{EONqµçiKF-©3F¸w½Î¯hH”>$ÙD+*ð‰½u@P)<9`ØóãÓim¿õx¼ŒËòt~,º¾æL¯È¼q#g›�¡šÚ »·Ó§ßóçпQÆHó2É€Kª+ܹn¶z1à¯íÔš‰ÃÑ+y®JžŸ‡ù£<ú+«PкÝØoº ©ö™ÿ1¯C—®×9ÔèÚn6¢¶à/‰6[_A3ú¿ÊP]SâÖÎù†g£/¤³5>‘Ö’*)zªvE¾«�…c8Ê1Ò�Í_º+9 [SÑŸÛÕµÃDkXÊKn­çÏÓ§OüýÏ_cƒ\…õ<÷ÝÒ‡,âÎæ•á~m—Å&¯à…t²qY»Å¼‡·¦°ÉœŒ +‡‰˜ÜqíV³¬f¶7·+ߥ™Þ˜éÕÒSzi¡psÑ ðÖF3ÿ‰‚õÃK¨×ø}¼’q™#yŽ–þ "Õ/–q7¸ãfgGf‡Za€‰e£þ}³F‘Pé[ ‚;2"¢R9’Ø"ë»ö±*ž×)OEmGõ† 4Nkî];Má=»8‡Ÿ"¯óljål˜§]8\4ó­_Ú?½'þ•vþ5wÝcI�wžlÿþÇcÌSg#Z_;CA¡~„—ñHª1š¼8ÐÀi^Ýãq÷xŒb›±$&–h)› +¯§ÌšvO#o½½é_Ybµ^‹¢é ǽ²n nû¨Qc[À6­nHå u×N1üÉSf!Ã)÷ètÐ,êÈ‚?2YÃcÖ0ûI�¥ûðp¿�-ßÖç o>’µ5ý®,µ¥¥´N,jÛ` ôC,}Z��#UˆKR?B¸ò·ƒq=Ë�‡ùóÕv›±½&@÷ÉÚ|² 䇕ô¥ª¡/‰íœÁVûîáZ­X¼æéô {,ÔcòtYægÏó¥�q»QE¡±BÅ1iñ·cÕß•¦„S×àŒäÀÓ}m}Ôô ]ªÅ‘™¨Êv@ey#¢œ¶ô“zÏK&�·µ¬ñtúFÆ�‰JgÜ8Z†äxïÇÞe2‚²Œñ¤.$PY,r:…Ñ-œWÎ{ **k³/Cÿú1ìÁX¼0”JúãàvT¥¶¦Sls�Ù³Pé>l7B¬n|¼¤~]û´ÔU¦'FÊdbŽˆÔÈíAªEYJòÒxŸÝÔ'—b6¡»4¶ duc¿ö;–r+k;¨dÞ]7¡Ë‚f»#ÑôSÁ·ïg³Ã¦IÑ4r’'º¯à¹ =µV¤rP#% ú×Ä^Ǹ«ä†Þ$,Ì*Ë�¿¹š>‘�ˆútyLݪÁnÔ˜ÒñÊað%öB&eX˜Ã´ ÊÆ¹Ïpÿ¦�ÜàíÙŽ“7¨ÅLÍš<’/NÔ`¢>òñ=ÑSEÎK­;Áª§ÓÔ¯¯óòíú´ŠGô’ÉÊb‚U?©64¨ì1HþШeEô�ÃÓ»þô>¸ê�¥°­‡VÄ¢¶'Ø®!¤«KHÆé ;ϵ½›Xpó­‡3J„2”‹¿Žd¹_¯~oÐ’-eªá•tZå‹|´AdtNI™Hƒav|ñ­�Ò>kj+±—aôÛùÑcÌYhÄ[ ¦ŸiÊ£CZËeëwm_úÝëøCÔÒÙyXBqï"K{ùþr±¿ØyÀNºbá3 uÀÃ¥û­Ë<†JëÜi~1 ŽÖB\20=}Tå½­ªMŽÆÅõ+™öÒ.»TŠºb†³¤/‚f€´µ+^\ñ„¦¬ûÌc°¯‡‰MÐH79Ÿ~ÿÍ;©ÑYEôÓÎüŸAq˜�síøã¾Ó}8Uãˆæ:¿ú~Ú¸¯�/8“¾]W”?0;9g�— ¸¼çî¢TødÝçöËRXéôÒO‹$£Î¬’eüg1IÈ:šü£uçþ-Zû“e.å.“$Ø#Ì­Xx@Ž�r˜žÒT[á/^xO +-)Z\ÚÜ#Záú.¡¥·®È¥Øênâ„no…úÓåˆd�S½ý'a¶”ß-ÔÁJZ§VžnèO�Ǭ "•hq’OÒE%3H-ÚÅÛƒîªáU»¯Q¶.ˆ¢;Ôyé$‡|Éú&eI!xÚ�ú{²€e4Ø:þˆe /géé$®Uð&­|8ùæb�+ÙÙ&UkÇq?·V½®Ö*Ì[Ï€f¿ÇÝÃ�U ݱwp$ÄX‘Ðö�†ØZ† BY·äRñÇ�¿: ‚@Él×UQÿP²Ü"„j�69àçÁ”7HŠòK´hž#cÌÄžPéOD•~&Øî4}ײͦk÷Ýt�ê¢çq<ýÆó€›òÍ^!7¼ŒÌ{ @ùëuè®vY9;ïÚ€7!Ò~éËÁIËÂå²±oÊL#ÔÖP‡iýÔõë˜î!òÎûn©˜O8a(€PÁv鳤FÔª•ˆè2/DH5ÛÊžPÏec½õ¹R#í°Ss™»Ç=퇈â.Éjœ·°c1?vÔÎÐ8Ö´88ªÊ帮ëÆNCÜPÖ‡ô“1ÄÞý4Î];†›zj Ó×äÌ"—Ü׸ €õôü¸§úËÑ”.Dv�¹#&ƒ"þ½Ö†µE.úK(\º$�Wðv?ië;ƒ-ªv·[sJÝi¢!J) +òf‚ uAXè!6Ä�›Úud˜êʾþ4o—¨CmѤ0šš”€V4¸Éÿ熼ByÙnẠ/Cü®ŠÛ›­íýÛ_öŒ¼ÊÎÛ¾ YÍm¯™>Ìà2Ûsg�Ò" Í†~juûn~¶•¬ð*¨äš -ÖŸ1}L�îèEý·í[S[•såâÊ"rçêÆávëÏz0ȳßÅh@ÀvíeXß™ÃØDð0ö2�{¿ü’ru™óÚVÝ ß :•®\T±Ú¼Óy~ýð+ –ÿöw‚#s.]1Ú—Üö4ߨ A ©à–Êžw™áÑý97Õʨ�?Ç­]¸;Ó£é§v¹3| -çljp +2L šuDü”%¥–öÿ=Ü+T�ÏÅɵí£]hóŒ§/óz ÚSbüJ§œtø¬)é“·ÇÆ4[Y3ä%sý@M.a†�vÞÆþ{¾ïs…?&lɵ½ó¼ë=ÆqT‘ ñ5¨ínŠFH �ŠÐ õ¡àÀÊGJ“½¬qoe€Ô>oþYÀ’Œü�P8Ú€BïÇ#¦MËõo`Ý^(çÇj‹Ü&ÅÒû…ƒ|Ø= žNó2|&RÀŒ•% ËDº ‹Ó8L½–yº ßûÑ1òÿ¯¶Þ¶‘+üž_áGˆTÎp8ÃiŸ¶uƒ¦@‹ÆØ--ÑaIÔ’TŒìÃþöý†œ9s“Ó¾8Ž¥¹�s¾›/« ôÊ"yŸGóbœÖL°Å"eª¢©¶N)T#^¹+¿Ý4µæš•"úŠüá*Ó4� uCÕXQ°¿vÛv“®2Ægpp.ù3uë(­¤Ð)¬}Õ’‡B^ +�Í?—ó‡zãôÑBüËL„ª„6ÜZÛÀ›Qv&†5²(x²’.”Ý»ªŒ²1}µ0GÕ‰¡©h{ïØ¼‰—d»,ͱ épšUú�·í…�•k€¨YH?ÎK¦§ÂTÃ÷ŽVxåÆü’ÂÊ~XÀF8Ì9›GCòÛ‘¹ˆO*÷�¶3ÖûÏþz®ÃήUdmìZUªM©¡¼ÞîäæN"4©™�Âo®û6»CIߥô‹Cï’ù4x.+Nõ8!Ñ�Òç‡á•,nPZØfévŠ`A‰Ž4iv(bõh™¾ Ä6ò>®òÆ’SB­y]ä2 s«…ïÒi”ä^0�íãû…΀Gb¥€¢©ÛR«xJ7R¸¿œú]‹¤Ñ&$@37x½Hƒ)UŸm4E¼·Ê®ý©”,2⣧t5Fi‹ý§¹ô0«�qγ߯6\3÷ý¯]ûÚ<ÛY@´ó¼–’mq%ØÆ½Ø’Ú[žùiÞ¨ª;·»Ç÷›ÌøAD�z£¦þrèŽQè#”}�{<]æÖ·¥ ’šXårì¶®kQº­o ��ª 5C /B¡·9î1—Óá4¦BŽcvé*Sh9ŸÚïÐ8ï]xx¡V¦ò¼\²CZ¯kÖX‰Êi:¼]xBØfAžðÔ×ÅëÕØ_Ý8Í…ÛÙv�UÁ#0:Í\—Jùzd DîE‡f̬eEåhÏ‘y”ã¡Í¸�«x]zánöY^0ÂÂë°EíùМ·ÁÐAð²hŒˆ¨Xûˆ5';·à(…¹PG¿^QÊéÛ&Ýî[Ô‘ûþtŸY‚E³ÛuÓ,¡k)çj0ß¡qj#ó¨u“çt‰->dn@é7‚cň‡éÐïûu +¾5‡à× úçLYC·2'ºÐHcræicë b$yw`:0¦åE&#Óû%É® HFt±Þµ˜¥(ó•�X ª=ÁQ��ïó|JR‘‰Éü=2 w{5i½ C4J ï¯�|Y=_ÏÛ¥PŒ­úsî¦ëÿçŒÈK‡²Dß—~lÒ]À<Âñ¹?E^–wýöº¾È:Ì«¹š)·rÌ�ë˜#ÕtÞpš¯Ñù¬®)tôÃn4ÒÄôj¸žÏF´U¹²&øž3ô“ÁA•£é¯•¯âÐnýÔ2³£ +f~Q†¼ëB¶��yÇ»ÆP°¬ŒåÁóûÆîŸŽn`Yá8sTÐ(½6ßRä†W´>>%Bôú60ƒÙ¡�©¤ýñ\/|ÊY^"y½é,JwAãS²ñä¥ÊƘM¾º€�†¦›ÖƼe,7^«�Òôšû.ŒÈç]'�1a<"oðñ%šIUÐ0㆛|ÚuáÊõ)BÎÖ–èí,ÝgÛfl?dÅ*ɹ[–&¶DA‘"&_fª¦#°mŒè0±:´ÇKêË�d*+'Ù> +endobj +134 0 obj +<< /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +135 0 obj +<< /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +136 0 obj +<< /BaseFont /Courier-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +137 0 obj +<< /BaseFont /Times-BoldItalic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +138 0 obj +<< /BaseFont /Courier-Oblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +139 0 obj +<< /BaseFont /Courier-BoldOblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +140 0 obj +<< /BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +141 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 140 /Subtype /Image /Width 4 /Length 348 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ ŒÿÄ?!1AQa�‘±Á"RÿÚ?ôno…ÉÁ“�ÊÊW#âÈ—Ûz¸µµßjy¾â9ÿG�šÉ·ÜÂ�¼\§µwQYâvt–€f4ð«ŒG…g�=¼A ,t´yµV6.·*{j¡D Fá!äë¡3$yÕ£.ÞŸZJˆ$¶»˜ûP¤‘$Z{v¡X0•3S‰,Kz¥,%ÊÌ›˜uI�ã¥R*¨…; +Ž8a…C'¶Y=+ÿÙendstream +endobj +142 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 8 /Subtype /Image /Width 36 /Length 250 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ $ÿÄ8!Q1a�BRrÿÚ?Ó-žï§™VGqñ1¦.Ã’²Ä¯¦Òžþ58óÛ-K•‚'ì)ñ¡Øž ¨ïø°ÆÛêŽÇô޾l}c²æÍÍÇJÁ&:ÖÖÝý�ÿÙendstream +endobj +143 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 56 /Subtype /Image /Width 104 /Length 1073 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ 8hÿÄI!1Aa"Qqð‘�¡Á2±áBRbr‚3ÿÚ?ôÌžbã@ÐI1 + 1�?qOSZ¾J�ˆ ž»zÔñçWrÄ"tˆü´¦b‘ûXX©›€Óì'ïj©ÍÅI*fb¿_F¦|®%y)Œ(Ø·ð®t1\x‘<��Äɳk�³1ÄÍ­yµ&D+Jñ’;ã]ÉÐoVO$unÞ�½wèE+ù�1¶^$"É$Û´j±T9Ç0€w�Lyˆ1åwíø§˜Ö8Ž[t3J˜WA�U`ivØmõ¥—¢…X@š’÷‚‘èLéi;kXÍ�Ç ’ /pËqYâ£Ùk2e+ˆN\‰Ò4`O/okÕ0eù¹RŽÓ&Û³Ufã×Z“:Œ¡KbBÄ�ov´ýk¿*r’H�16<�´ÿm©¯ý¬x ¹1÷,}4ýmJ€J#Ä-Ä~�¥(Ì�²w˜P€I &ÛÞâÑé´U ”(h¿åëWHQ¬V2 ìk8,D¡ÑZÌEsgíy8y¬Žâ4€·® +©PƒˆÚWÒ=Þ›X×K(`$™ƒÚ·"9ZÞô˜“�`ØÀ½·4?`*äHŠtVk3ÄO¬Pq«H4>”ÔQEEQ@4QEÅ›ÿ@b*‘~nnÝïzèÁœyZu }ª“zçÍå²/#ÄÁhÙgZl™�X*'#¹&¥ÿ%ˆ€½Ó0:›�#Ú„òÆLeÀ†+Û�n�7ú4Ÿæ˜F)ñyÓ‘UQKS%ù2®9ƒ¸ “ùÛôÖ³6Vl]ÊT– ¬I -bߤڌÞSãeEBä�¼Dƒ‡i­O)Š¿$†Y…‘Ü92­ì%¢´ùGë€ :�§íÈVØØ@ä§‘ÓIƒ×®ßÎØ‹:Ë/v™§®<øyÈàÇ™¿Ä@‹·[j/íMñ¶œ‚–,nfÀ�‘ÿ¤þµ¹L€Èã¬wãµDŒëŠ +2 � xmôi3.gññ ÂÒ2D¯oÆèÇúºmO‹å²1ÄÀH2¾ˆ=zSy&tãa�ý'ö0îé[ßòøÚ!FÖŽ]ÕR ãlÙVQÝkp.v'c"¨±”/ÞA‘" ›ÎÓi½wDVÖQEQERº ‚ܵêXü> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ àÀÿÄW!1AQ"aq�‘¡±2ðÁBÑR#ábr‚’ñ¢²Â3CSs³$ÒÿÚ?ú¡©¶P«¸uIÞ&+`Ê3ãWÜ �Q4óZjy»ŒX#Ü`³1>Oʃ÷ñ€Ì`,jc¿íØ� ÖŸ÷Xö³I!I&GÖœæP8òŽ41æÝh+ài[¹Ê +´1€@‘>1¥>L»”·€§VÜ'O:Wȸ”³—ßH™�âᄯÐÔ1åvÂå@•l‚7ì°#‰ ùøVË…0û{G“Äõ.¦ºYØ™·Ö¹q)pX«:D’d6ÝDÞcç½Ì@û€ô¬ƒlÏWÀ‹ò®Ì8Æ1aC-ÀóQ\}¢íìðª�¤âP ¼¢8Þ®0dVݽ@" ó™�•O±2Œ¥ˆ& 6ÉQá?:¶ÁX̘iÿ‰øÐeý¾TÛ=`î“3 ·¿™üEu{P 1¦üGÇ•sdí1â)%�äè78R4ôç["/¾Y�y�¨¤OßÒ·v Jº+ fÁÓ�wI z­Î¸ß¬Šd™€Fë±?p¸p½í¬Þœ.<Žp’`ó�g×éQÁ…rå˺ãHá÷=W¾„ÆDxm56Ãûœó‘[jJ€OôÍ”îÛÎäzV~ÉAÆq#5˜ €ãtø_‡<êžÒàÊ¥n0cC¸;iæ>¼Íuh+“FgR,wXép”ýÀBˆ¹Ûº9GÓC¡µsïöñå*¡]€0Dç¤æDk~w®Œx†ê�'ŸÆ¹ñ …–a·RH%¥d7»CÎÓèð®Om}Ø:Ké=†ýR-Á�H?®ƒ¦ð¸ä�$À„aøŠî7®Tì†0@v‰˜‘kÏ.t‘åSNÜ!  ’`’GVºððªû`�O ¨§h¨D3mÉm¢yZ~tÙ{q•ƒne +4spª"l ÐɈfR¤‘" 4‡¶´ I†&Ñ}ÀÍUV}k2‡ƒcS~Ù¼ÜþåM“òâ Í¿:UÁ ;Øü?….>Øb˜$ÍàÄLÌØ ÍÚ¡t@‹PËÚ.C;™mi‰P�"ÿ�olœùδàZ�*_·J’ÆD;[â±·\k� h#Êpà\`…�à E«'l¸À˜'�ŠCÚ#D–1I½ŒëéNp ]­r(bÀS3¼º4ýQÅ­¯ +è—Û·qÓZ*�dÉ¿�E{Ù�•\Š›öøÝ·°’�.6¤^Ï A hfð:xU'XÔÒcíqâ'h7ÖIiÔñžté�R#„Ä’uóªTŸ9¤Äq1o +QÚ%þëˆ=MühþÝv•ŸÔgã3U$4ƒ ëj5… +WÈ©7ä úSQ¬+kZ´ÑšÓZ…ÜkÔ5¡M4+ rl*KÝbx!…ô›OÆ­J]@&D jgºÅÿ¸¿ê±w8³±U`H¼xsòªŠÓZµi›P­F€4­” H&`í±]&ôõ�jkV�Ej5©]†5,f“~B“·Î½Â–Y€Ì·æŒTüÅV‘²66 T›»Æ¢LðáÌÀshª&]æ ˆæ<&œÔ;ŒÃ¦ © ùŠU\˜ÚîXG&|Ä})TäΣ"=ˆ• ƒ¤’ GºÍ—9�„…Fçcsˆ�J§û‡þ!ÿË‹ÿµ+°äÌÎr9=±m°T³zhá|ù°cf±‚ «�-´ðõ¤É“>1°f1ÇûÄ´½vþã>¯Y˜™˜X°�ÅêØ&'Ü9Ð�¿- U¯\éƒ&Äd-knî�¸íŠ—nÝÆYÈ� ®Ó·ô±YûG.có§Ç‘ýÀ7îµôŽ­Þ6Ò!ÏÜ#&Í¥„›—R=tטµ>\íÒgjî`|v’>ïÓ§å5‘s[NS¸;Š€ué|ŒDÓ{­�€vÝ1Ž;Iø°ãCVî±ŠÒ mé`™&Oâ+fl¬ÊˆÛ ÍÀ2�ψ?�*»ç|F k¦—§Æ¥żLIøEK6_ê"s7á¨cÿmTªžði{Œß·Äù"v©051£‡ Χ^� +Ë:L–îð¨ûN,²¿¦Ç[Ö›¹TíÕ$©TSÆr‚Xɉ":êSaRÉ�Ù”‡ •‹0#ã"¢½ÈÆdˆ* ™k»l™×Æ—çß,NÞe‰&üWjÅ©{Ul®í¼‹�@�»ieÜm¬]SI#ׯ¹Ñ]†=Ù3¤£©1VØLäb�‹öؤ�ÆVuâTIù›Qíe¥ËÌ“`d-î<Æ•w’-jáA—.쉑ÁXm%”q(H¿â-UÊÏc6ûcİYùÒÊì1¶B"¶ôîݺuÀê)ñîÆå fY$~Ø ÓrI›™þʯ·°B[Ã…¹ +†F˜[¹ÜH¹-0¥¸žKÂ�Gî’Í 1µ¡fHý:‘Sx +ÎldŤ�76ó¥\»s¶ X©½ÇVè¹3úLúPÿm?Òþlÿý¯]sSÌ@Äbm^}*#"»)ÚL€M¹ébf5¥È2¾9R•�7xr®¶�½1>5˜�à ÖÓƒzDԶ쬦4 +�foyåMìäRv°‹@�>|#OZL½¡Ê¥wH†0 "4êG¥'qÚgÌ¡FE:½ÔŸ±ƒ¨û‡+×fÓP=»$1™ô€#ÊÔŸ·îP*¦U2—h› Þ8q35l˜Ýˆ(À2'áãËèh{ D;n¿-pÖ—nøÞw7==LÜÉò¶•Ñ®g1/ýAl?3oÏÈ6 …eL’EŒK3sÄÔS´Î6–Ȥñ„Žq·ªÚñšl]¦\AáÔ–$Ýt$“üÞ4µÌŸnE™:©" �7 +¯¶1! b¶µ±ábC9Va "ÇÔÖl9'¥àAü ˆ ØX˜V±7™ªäW+ +@<È‘õUYEÌÐÈÜp›sùÔ€|é*Jy¯P#Î�í�¾ö ¦£õ)�b™±3�"<™øÍÛ“�d&H�<¢GÅA¢Y²9]½ &ÒyÄkUÖ¥drlbõíß¹§t‹J›’uÇ… }£ãÚ¾áÚ U"8Ç•©±ö§MÁÈ[��"I&f'SΨø†GV1Òdx"~¶<{X›rÓ€ÐTÇo‘ís ňimyl<(dí²JŒy +€4€Ó}dþ/M›·É‘”ï°ý0&A�¢¶Ýñ1%Émæg�W!»‰$šóûB{�Í�7Nå$&Á~o]y{bà*´DE·S¢‘»PÊ£q•¸cs4GnûL¹,A HžVŠžÌâB£#ê6NQ½‹é‹Iãë5Ö+TŽ(¹�gt ßHðÒ†nÝsDÏI‘Çâõi¬ jÔ(�+VŠÓXÑ 6„*ÔEjłܘ¬ j–A‰Ø+$è MPVÒ€¦ Ä'AJ™ ܬ¸�dZÔÔhV£i­5¨‘B€£XV4o@Þ•™qÄÅéµ£Bµ+O +Õ««V­JÌKžzW.éò<±$?oø¦=-@w9\{�T$þ¢ÈÛx’ +Ûñz©ÎYTãîþiXóÏ„V]CnM‚ ›˜½Oq—&æ + +‚@ƒv+ ë¤qøWIjLŽê:só®fïrc@]UX‘’u~Ðf/ç¥fï]q“í–i€0Ó�{È®”.d>Ó<«‡*öÏŒ a*»m"ñà?].Oi +*Ž•7&4ÒÂiÏrWöDHž<@�i;~íÝYœ@k©'ˆÚÃáÎ¥Ü{�Æ\ S¸€½R ÁÝâ<+ÐW/u•ÑÐ,܃¬MÀƒcÏ….mþâFÝÖ組Õ3”fÚ “xé3k^})p÷\¦M³ô‹[o3ýê«åÈK1Mÿ½ >UÙ6®a(T€Ì³T;[æüè7rÄ»Xo +¹×iãÀϧ—ºÊ\d1ƒ;P¸™�C¸5c�É,kc©ƒ·áyüª¸‹‘×<~f£Þw�7(&Iý f8éÑÆÙÃSfØá&÷â}8TûŒù±õ®Ð èT“i<Ç.UWÊÙf6PA3#tX€ÂP®^ç6LM€ä!@ÈÁˆ0¥,�yá#Ÿ «.|¤»˜öÖbû�~1Ýf÷.¦/aŒ‘áÔå]%rïRbNàA28GU¾jáî;Œ¨Ý.‹p*H™´È�αÊÿºbƒ³&ÓúŽÓ��fþURÙº@e›H#w)ˆ+§—*‹÷9²—ö™-ö€­’I�ä}ºéÊó]¸Y™¸ HñÔ¥O¹9Ì{%EÌîRÖƒ§RñŠUÉ‘žÎ…b@ª9Îã<´¢_(<"cû:UîHVã´Á6·VÒNšDš¾Ub‡iʼn„ùHú×*cfeéd +OÔ"#Œ>”Ž3²¶&RwnÁ[óˆŽ>´í€áa‘uÜ?Wê"'üGãUœŽ ¨À™&@חΧ�_¶R»Ku1´¸–â|b® �"*즒 ¬E¾4­ŠY_l›y¬NŸéSQ›(#"…ЬIñ¼- I—ÿÆ£Œ)¶œÌIô¬˜Ü+ �vSÄ{–3ãÆª’ª x_ÓΜ&WÆÝ;#íẞ–å#•0³HtUȾâb +“¤yW>L=ÁÅìª.Ф¸È±^g‡Tóµzv‰��r…¡•K2è&6"O¥#&BêÄ\FšhÞ>5‚dFÓrI‚¬[_Zž.Õ±e  ç;U;|O‰Š�¶fO�½tšå\Y0¾FA;Îã'ˆUA‹zEíc8ø§$ÿ‹'»òùøUWDØÄuˆ|ùM[ûï�m¼häÝ·§_Ï�ã7ÜÜIàÑçÂk¡K€ˆj×!`UUÇNØ<é?•b™}¶ÝŒ‘Àå×vœãÒ·ÿ¢XÂ@:�Æ?V±?Ê—°Ç›6B‚]Øm%¾ö/ÅWI§=¸9ÆVž‘OMøíç­ü|« M‰�¶ª“7ÖIˆó$ÏʑӸܬ1ƒ$¦¤nUÔ/zåÿq*0>ùÛ 1¬m3E\¹<(‘¡&~B¹òö¹réI¸“¹”͉ÛhŸvÁ—/�Päh&IU&:ÁG¶^ß>sˆ¾Ã±‹& £&Þ?ÍV ’n�þ(\¹¡yÉ-ðÛùÑ>îð]±©�ÓåýµX®7í³dÞ§l6àõ¨nTƒëð§nß'¼¹A^”uÎ�°Ìÿ–‡µŸsm+þ©øFµ¿o—Bq +EÁ^:háo(Ò/Ö €$Ímk�;L˜ñ›¡ÈͺXQqa&tõøWG´¡B€ h8Z¡û|ˆÒ„ "mãzì4´b‰ +E(Ö¡FµkV¬hn'•[ZÓBš…Õ«V­@Q"´V­Bµjy0¦R ©‘r#‡ +uP¢”kV­Z�£¥jÚÖ­F…jÕ¨"¹³�T&M�2÷øƒó¦ýÀÕ®ÖÂçv–¬{‘´­1%m*9›Ç·pÇ£k $÷">sG.qŒóµÔ kéô4™»ÔÄb @“Xz‘O“¸T€.I ("NÝbO5Ý‹w,Hqb!�M¶Fѧá] ýjy²:² ¹ä?�ãƒg!T„r[€€Gœ‘O�(É0‚EÁU*y¤­š.¼ê.¹“·ÛîK…¾Ñs¡m²<âj˜} ð¹j9¶µY®nø¸Æ0Iß�A»¤äPÖÿ ß…2w;�—cBÏUŠÛÈÏʡܳ&(“©ÿu¼M_'p¶(ÜÑ;Añ2tµ1:í`@�9Áðàj]·rΪ[4�‘"+'z\18�B‚I;o¤1åN{†96í"#Xê™Ò<©Û3B}` ?�#wJ"–Гë>cãTL…Á�EâôóPÒ´ìêÚH$j<éß.ÂLž<è®MÒ9W|Ùr…; +N§¨ˆ<8W¡¥bÚ$ò®|NÝÈ!†‡^ r ¨ŽënÀQ€h¹�Ž"yÀ¨÷î˜û|­�¤’ííƒ?ÊH¿Ò»1fLêB ƒê)ôÇ‹¸ÌìÇhe“ciRT‹ëq¯üj‡;…'`$5�|b‘û· °c%¢bEùÄ‘ai1ÄzQ² ¸šeEÄý¶Òo¸Ý“þ¦¹ÔéxADw ƒúŠÒÒÂçÈVÕ²nWHÔ<'�çVÆA8çMSÌÛEµ�~¦Ch:‹RæËí¬ëë Îsâ`êW­`†×R·å66§÷™Dí• 37žU›º¯Pf¤1�ÞUf!A'…sçîS,UŒUf<4ô®Gb§³M¬J?Q +H�Òäl)ðçT|²®“;ýMöÛ«Ò—¹î¶TÈc#ý7‘Ðë$m�Hª;î í, )i“§ê~”}¼xòleŒ1ºÒM™¿Å§ÀE3Ÿl‡æJ�ª2·ÿTŸ*8ó{Ù”„p›°+÷m#Zéµ.l‹‰76â-ö«9ø(&¦Ù6²�� LiÊÿ*Nß»e‚7`�§E[�òˆ®°*yZÚq§˜¨º#�£†ÜäLG­y[.N”!�ÆT–å´��t–b@�¬)kMÇŸ*ž8”îX`*�ñþÊäLyi‹Fܨ ˆâ1ƺkjìl»b¬Tò‘æ(cEÆÏ’©¾$íYˆä£çQòáÇ�UÔÀV™M£nÒf1à}k£2«‘Œþ O "ElÁ“ p¥„ #„Ž?⤠ì»>Æf I$nbÈ7l‹¿¤¡ÚCh&ÚA3¤Vìñ>$ÚÄ›ôÍš LÅ®dÛʺ«“¬4°� "&èpáøŠ8ó 8ÜL�<ê#1}»µ5K£ï $qÐÔÛ.Lˆ¸×A“ö´qÖ`1zôµŠ\Ô0±@l`³Ô–ãSÍ»0ÆB‘H"öe1iåT,Q™Šh bOâbº1’VXAå­Ervèø–$fž[™›óª‰.L Ÿ^,ûWºÄÄ™ò€  œrÞ�>5?aÙs6Ø9fèJ„“裟åUƬŠNÓ©›Œ�1|�m‘¥çãÊ¥‰2â¹R|7n:uÓˆîÝ(VO¼Zmåðªñ®a»&S¹@&à{HÌzŠ€$�&ÞµDΙA*f5ð ;„m'Î |hœÈ$è$ø +{œXD»m×Ã_¥ÜãRdĨ#áΙs#®á `©¿�½*w ’`‘¸"Þ´«Þb}¥I!¾Ò ‰tñø_JÙûµÀÈ0Æ'•‰ÓS§ +±puâ&À“ð©~óí½ZÇÚÑ1<¨žåQÕÕ§IùÚÞ´Ã:ät<)Gr’Âçk0 ˜Çñª“©¦a“@G˜#ëH;ÌLDÔ$ZÌ5‘ñ¦~ëm¼î"ý6¿•ëcî±ä` Ü‰ñÇáÆ‚wx² Öƒ΄sÔS êt˜&-zܦ7 +CI1eb=H=it™Š“i©IXÓY­�?·…)’UdíÛ,mö›‰<5¢ýÚãRYZ܆ï^™ªû–˜>QzUÌ­»û´˜»‚àÊ�DÍŒjE�)½ðNØ7¨àÌêÙ 6pªÐz�Ei½¾âE­Âœw‰8Æ×þ ‘ÓõåTÎÌí™6´Hž=VµGýû›!  ÚL@,Ü Çü¨¢ås¼ÚÓ‹üuòÒº·yó\=¯q±rÜÐà1 +jÙGÍ�c€Å×oÝ6[ðüé°äݸž#ɘ~U±÷i•UÖv°[��?•UÇI×N× î{\¨#¡˜` ÷tô›Ø��>1í3Œ ž6;š>“7´6°PI;´caÇKUœÉB ·^4ûZ£ÛîØû§ÿ!‰åîùElyÔbÆ5r‰ý{Iê7�+{hùʲ‚­ºA%£O�X*û�~Eì.E¿?á\ª0cÛ�ØÜãtÿ7QÜ×™m|xÑC½q¦Hß$ޏ;H‹Á�ÃóŠuÈJH¸-´ÜOçƒëL˜ñc²ï2$‡.Öÿ<ÔŸ2Œ�*âá(¤7W5ÞeÐí7"ƹW¸ÃÛ)’CíÚ·3G?:L“áÞvÿN$ȧS¤òÿ�;±Ë¿f�Ä’  »”6�>³G÷[ÛG!šmi–]H·Ç…nçh\§uÛ@#І?÷W?yÝâeÂë‘aœÁÄmn<¦+¬w·ìÞ»µ‰§*àíØå÷N' ²xÛÚ +8êƒ>Ó„ö{£:¤KÓc»ü-o:žl+�¤¬P#µb«�ûvr;�µÁKýÌÊÉóWX2$W#à÷©‹º¾·;6�|.ôñ¢ƒÝ YeTB�¸‘Ÿ¥r·tWR ¨,£k­§‰#ó˜ª ÊXCËö“Ô¾#ÏNuט©C¼¶ºkRÇ�AÚÄ’H‡Ò¹ðw8°â!ØkjÆÀYEÍ?tª=½`¾î£ýõoÕôô®…îت^"L£×JæìBä,d†[BýAª¶eË�ЬdyIãÂbxzR�Û ãÔ«7ÛÂi°w(ÀØ@66ƒ¡›N“zsÝâµÅé—Þ-"/>d/ÿÍsöcokŒ¡±ªëi xáó¦C½³(Ym6¿Qãæ*é˜d¤� c�›yøSB¢ß Ž“Î™r®a Àqð¡Û)‚Æ#Eµc^¹_»mN‘;šKt•¿ËáN]ŠÃXÈÓÎjÈ6 ’L “©ñµyݬ£3‰;¡‚ÅÏHˆ’Ðëá]«ÜãuÜ&ñ¨ ßÂ¥ˆ¨›’Â8�å¿:\¨r`\w&RF¤ª‘¸4Řžœ+º“Û]`sõÒƒâL‘¹AŽbk6$mTçCÙK£áI“ 1ªƒ"xXáC´íÿo�AU RWŒU½µ™Ú&gN5Ž4}@1ÌVljÚ€|ëV@>t`V\jš+lY˜ÖŽ” +¬Í ˆ"¶Ð8P*5Š09VÚ(mÀ@¨ ‚,u¬VÚ(Åh«E(‘HAÆ´˜°œDò·Äü¨gÀÙH†k_p!‡¥¿´Ub¢+Z´ +ÑF Eh¢@­ ReFu!NÒxëü)‘v¨0) Ðh¢´Zµ`)2±Df‰ T�¶c™7ÜÂßÝb¿•PšWʘÀ,bHÌéLX(™¡ºÓX0} ùPÈÌ«*7SIî;\(61ÕðáÆ¹Ç{‘—#.-Á k¹ÇÒº1äf0ËRuôÞàe%d‘>qM¸hH¦Ò¥ï«(`u xÜíÓΜ8°$I ŽB°"oTÇ*߸DLÍ£�&.ãbB0$j¢‹æ@¹ž\3Lr¢� N€›šWîqcÕ†„ú O¥ŸPá�SfÆt¦W 16ÈÔFƒÆ—#N\"MølÈùÍ_·ÑýªÙ ´Z_�Íì~ë�TPÕ²ŽV‹zT»œ±üçäÌ¿@]¶+M¤À<í1ùÔŸ.ã2Y�‰¾ØÚ°¼…§Ìš^É1ûY@Ÿm@#X q©÷ã¦dC÷C¡»[õ¸ÔÑËÝ•eö�äR,&:AÏåê&~À\LC¹—tÈ%FÕ#I¸]Žu+“y ‘pzO— +=Û.0ˆQ+$� u/Rs‰³)$Cí?u²E# ãM°"\û›À<áVˆr!2Û˜À‰™3Ím™±¶l¸Ô¯J�Äø�´|LúUràLÀ+‰õ‚8XŠÍÛc+² DX‘oJµÆ€"u‹ˆ¦\(«´iæOÌÓ�Hp£2¹•˜<§Z!@$Ž4£·@Û¯>$Ÿ…í±ä™"'Œrš?·H‰oõ7ñ§U + TW³Äº(Ä‘Òl \xQ^Ó*ªˆ + A"+V=¦&™Yd ˆ¸¦ÇÛãÆÅ”\êu?G.ËÄÅàéXvøä·xQ\* (�zSÛc!T­—AÊÑô¢;ljIU“&-'IùV=ºrÖgüÚÔ<ØX…]ÒfwE¸s«~Ý]c"‚dó �©ý¥¥=¾6H> ÏÖ•;<8ò‹�C6¬Ü|Ïeíñ!•P˜¶›Œ´y�jiØv˾1 ß;á@ß?ÍΩ‹¶Å�B¢‚� |)´FɉàjJÀÒFß¡«›ê)PPp+ß‚QLÂ@³só¬pcfÞQIˆ˜?QXöø·nس¬ÀžZÖL ˆ’ªòŸ +1’£á[ØÇü£‡Z|+{À�¢þ½ŒrNÑ}LkPɃ"0laH‚vÀ¶�§•Sn™Ình“à4ü|ê‹�RÊòІÔLVö×�¿… ™ŠFíñ¹ªcI·±ŽwmÎ/@a\rØÑCGcI5ÏÛv¤1÷1ã逌æ* ZTA· +ëeÆã•‚•1&0v€<„U(V¬(6”¹rŒHÎA!A&cn@\ÖG.²A$|&�wf¶›©mÖÛÒ@#Yž¡Â¬LT{nå;¬I•'kª²Èƒµ„‰J¶”&µjÕ¦´Ö¬hÒ«KÊ�`iräö‘ž Ú �©ŽT¸2œË¸ˆ»×í%*l¹=µ-ÇE|؈çDQ­B¦¹·d)Mü£øÕM +Æ´ÖF¡û�ë ` .gœÇÐñ«Ð &(ÌV MiµZf¦¹yRkݹÚ8Zª h+‡?DM«"°3¥ ÀQ,"MzåË8¨“,"Y‡ŸV¶½M å`™v¨Ü§]Ú€HåÆ*�€¯PvÝ jH‰�4©¦fÈq?RŒ�IFÕeXÇÒk¨œôâf¡›#3"0Í D� «‘â±ê*kŒbî’ ¾<š’xãç]¤×Ÿþ݆{nÝ‹cÇÕ9x�ËJs”º£¶æ%“÷DøõªdÄT а–˜¾‚óoøÒ)bÄŽ¢%�—^Ÿ1ñ£Ûà͈ËDs ÄúîŸÊ»&+ƒ·9{o=&þcµLøz[— ÌÛÉSÌË­ÀƒH¬£÷.C‚©õGý¿:äîC/e�ÕÜ2#0;šA\vã^‰Ä¥ýÉiûŽßôÌ|«Û, –ΑÈi\ݨ|˜Ø†‚2dQ2ßk² Lð˜�yRöý®VŒ…¶ÏP»n½á·Ž +c�{ÅÈr+ mH±]Òº=*ýŸþ3þ7ÿ­©{Æ!ðNA� ½¼‡�•7´Ç(“ÑÐAÝÏtÇ"Ь’ ÄÛäf wö¿µÆ[{í³–Û�›vº’ž5›¹œ‚I™±6€ѧk°HÊLeÉx³_—N:†21eMŠWsA-«ô¹æO­2öÞîS.Ý0mÆYµÝ<…ÄP-[Ü€®Q/Ygˆµ¤•¼ñþ4Ù{s“b[gS“HÌ9ñ®ŽÝ +f @#êOÖ“ºilhdd�ÛE™@Sç»åS8Ón€@ÐOKˆÌ +« ¹ŠýçrêÚñ0åTÀçÌ{E¿F3x×JæîΨK#r»t~5êW…ÏÜ66…E>~æðAðéÒ·´˜QÑd/!'@LsÒßY­ƒbÛ�a�6×X’5>³ñ ;Tîs€X™W…-ô�`Ów.ê¡UIÝb`õ½¸sµ.lj©´t©± dmêiyðŽT«Ú ÂEÁ�£eÇ-µ— +¦Ø«¹Ù�›o¹±�<)ûí\½®4Ç‘£ã‘‰€¹^�a�~ Ä�LE¦@&F—$üjÍ� ÊCnýF'Nv®¸©ûPÒ¼-¯: „ 1ÄΑô©~φöÛ3¶ßXŸf�qÚûåö]²zLL‚¿�oÚ�®=×ê'—Lÿ-¾³Cö“ìH&òAÔt�oÆ·¥NÁ(˹É€‰Ûgþ‘],¥„LxІ.Ípc\j͵v€ ˆc·ìźÚ€!A´~�)ñàöÔ€Ìd“$î2oÇåLØÃ€ ô>¢óJ½´K3ImR³QÃÚ®ÚOTL™¸OÀRŽÉÛ¸í±�?µ6\ v–^'i#A*=‹n �ÊT�ue˜X‘qWÅÚ®+4[R[O[Ø&G¸×žVžV£‹Ä™$ð7:Y{d]&ä’43 ·­O/c�3n%�ˆéb²ß#g¹Àz+�·rƒ­§åTñ•—-»�”Ûj��OL­—&"Ú"°1pY²ûE>wÈ�UL’H“þÜ…Ss;À Ìø›¤î¤uV$ÿP:ÔpwLɺ‹mRx�›øG «"æFY}àýÓ<€_ι;Èݯn¸ÌF<{‰#béq¶WÉï& ñ¹\Èž�‚dèe¹ wNÖÀk}ËfÒ.6·*R2ã*w’�DDÛHÓÆ›!È—Ý`¼¤k6:ÛJ,YÌ+�ohDñUÏÛ±G@kœX¢©ˆ÷!-¸,˜�¤ø ÓÇãC:¾TÊK°úyõUs1�Û$’G�Ðð©ûÄ#ºd÷6±ˆ•á*ºÒ{¹ãáër¢T*Œé¨S Ö8ZŽ^ìö¹¹•ö²9<½­œ¹îþÊ_ÿQÉ=q:ÊDGòòŸ«¾ÿtäJµ *VüøÿÃ�vî±2?øÄ +\ªÎ!X¯Á.uç·`¬Û·yÌXyjG*æË›.$W-Ôr"�ä²*,¼ ®¯êff“µ—iê'C=6‚9™®~íý¢ŽÓÓ&×ýIÎ>~µÒ$óÀ|â¹»Eî 3™$\ï�gû»zSö¥�_ �ÛòRq» 'ŒÀIÛ;îRìàñ Aû¦mÊ9^„Ò¸b§iƒÀ‘"|E¾µÏ—(c[ Vû¾$ +¸*u¨RFÁ¹šôð>4®�Û(pîÆó$¶è´ÐLpfÉ”…}¤¨Ü¤BÚÓú¹ÿ +LÎq»ÃL�ÄÀ^œw5Ö1˜q1}h>&rX;8mGr}²XÙIRIà„®í<$ÒâyÉ·–%¤±#îçi�$Wk\EIŸÚM„ ñ3Rݹ½°X¢dŸ¶u·>þƒ#Î#j:Áë>ØDã'N¶°Óï¦í1‹)`6)t�aoéð®1‹úÿs_søcåáC¸Opåêu>غ�¿û‚Ôû™Ój´ÜÌíVƒã¥v™‹WÔâĸ�é@¡o~€5ˆåG,û—Ýd!GA-üÚÛ�3vä9t0XA>H´s'ã[&'fS IñûJÛãV@BõDøReÃî•Ó¦àÄ�ÜÄøHõ¨cìÙwÛ¤‚%Eˆ~`_×ÑÆ.âdä[ 6êÜõÓÃç\Ø»ãƹ1îE +ã›(Ú-¿_^v«Ž×7¼¹YЕ¤h›ï�Ò8PÅÚdUt,°ÅˆÚ±µœ–cÔÏ74þÆV#{‚È + Û™$Õra÷ +ò ôÒŠâË[H]³&Giçq˜UO¢˜smÙBd¤0ðÜXÛÒ‘»L»š2ô4ʰ’'‚™=?(�zª�ˆfÛ´“,IbÐ’x“áÆŽ59FLXÉÙQ{u…_ö„í’ VfS3nù1¢{bΈ$£_µ¢F¼ÔS �ö<¡ì8mû„Ü p1ü)ö<“<¸SbFE†mÇœE ™w`½$É:©ô¥Ã1ÜEÇ!¨·¡¨7ûxlccl2�U¯7AúÕ�nd•b>u3Ù»'$íâEÍÁ:@áÊ�;r£lˆµ€�4ãáClø¾ì¬þ`~C�” S'lJƒ–6Ö\–?2kÛI3´Tø±œ(ªX´q&Iñ5J�íP—Ü$0" Ô¨�/ǟœb`@¹6µÉ™øÒ®K¢-à9ž5—×Ý7$“ãÂ>B‘»@X´Ü’Oü¿M¢¨¸™g¨‘{Q…¿œëÈ^ÚTµ8T––È›ÉrÞdü=+b¶Ù¯ê#e‰›€ª¦Ö?Æ»"iç $G|§Ê²aXˆ–ðŽ$ÔqvžÓ»fߪ�»u'‚ƒÇ�3v»–•ñÎI‚“ÆÔŸ²a�1®WP‚dŽÓº”­Aûmï¿{j"žÃ�ÚnÝÖÝBÛ?ôøÑN×b�¦Xƒiµáé­ `k+ +Õ…bb±£B� ÄÞ&+U $è(Ö£@ŠÀ�+V¥|‰ˆK0f)´¥÷þ¡ËZzXZµjLyS!!XÖ Å=c[ZÕ«V©äÏ‹ ‡eYæ@ªH"EjA‘I±ã¿�N+Â…czÔj9;¬8X+8&&ñåN®¹©‘N(QŠÔ5¢D×.™æ’ãi&`m�7NÓçç]˜ÆÑ“âu©?o‹t•X‚"÷3Pš¶MÌ’q´˜¤~Ý0cgÄ–÷H�g‘Ó‡×�[?s�8ÇŒ)b¬T1 ±&@?Ì*Þ鯅˜h>6›5"\åBá~Ãa&òžS>LÎO¶ŦI¬�Ã:ÈÚ-âz£w‡ + +ù™€!m;¢})û|�•w4AÒ>º�i;¾ß&\9—ù‚™�¬V‘qAW¥XI`ÍÚ Øux +^ß¼w 07å�€æ6úPÃÝçÊÌ5€àXÌuL^ ó§\ùrý�l`̈ƒ´ùÄÙ;œ˜]wFÒ@´î’B�­T)%î"$ż&>U<¹râ;‰]²Á“ºÃM.cJwÊÝD  ÜÂÞ<¾µ÷ añ«0£#µ…½ v×#cÇŒ8DÜØhX±�9’iÆFÚn·"B�t‰œ>T˜;§t;Êî ¶bH ,Xó�j¸r;’¤ÏMŠðã?ˆ¨`îsäÈ! +A&T®Ý L™×�®Ç¸®,[™î :õ1Ñ…˜NÐ~„ÓçË�Wúe wW šÏ—0kA¿ºO¥bÙN`€w ‘ӥĸÒ?s˜¸(%LA ¸|dpåVfîÆÐ¡ L“ºLén>>–^áÑ2cÛBÆFã#w•º|=+± e  çj‹F7f1&.DXpÝá}yÔýÆ +©ŠxËp°nP3¯?ªä}Ç“iÝh§Îÿ*D¸Y€°Î¶ ÙX¥Šè`zi­P!OI‰´˜" 3ä\ƒ0%Áa ¦Ò$7™µ¸q“+*E‰Ø‰ç>ß:žî]Ô:ä"b A ÿ99Ж³ 0¤^øéy�*‡kŸºÊC�ÅH$}ª¥NÑ,Òm¬~Uß‘¶+ S\½Ÿ¶LаK¸7ÜNÇe×ÓÓJtÚ¥ý¥ÚXîk L #ÈTòæÏÛõ6Ý þ©›µ•D›Þ¬E œ’ î|8^ß:LÛ3fY#Û}“oäGŸùªiÝ“Ûû¤ž| FÝÞåWC™ ÜÁ¯ÀD,i®¼jìH\Yðäc¹W¯r‰;$Çðuµ«­I"â/YÔDíÜEÇÓ�sÌlA‚w�gv³çTîQ².ÕY ™ûAO�D¦GΙJµx_~Ã:ðÛuß�]vé¬ç¡®vÓ²ŸmmaÕúI6Ö‚oÇ�TœØ¤*ok�Äüª˜qûIeÀø�Ç…CöÌÄ–v¹-´Äóô�u� š@& ˜Üã!”¢ú‚O¥�4ä$BÀ3Ç”A©ö¸²bl›€ë!­ÀíU#þ]k`Ç“k–Ö#s3é4½Î™öØ ­»]J²°±éW'$L›M.|OœmˆÔζRê"¦qe`$(;`Þ@·.7ò¤ïq÷yP kŽN¡œ¨¤X…3sÈWmàH½rãýÞ÷.˜¢Øf™“ÓÊ�°½Ê�ÔA ém£—!S^×2}¥be„HacÃAÎ�{wUh!M¶ ©”ǯ”Q½È1�¤sXÜë`4��["–R�*�ÆîÀä +à 2l|-"™qu–$žS˜·Ê}j+ƒ8$3)¹‡.ªL…ˆ Æž>tÏ‹(È6Å䙟Ӡÿ/:m™Q” ]�»b9¿�4dSÂ-ÎxÍsdí3eÇ•eAÈ…fý2[㫱~¨ÔéË…K"åV>ØS?ÌM¼t? +QÛI�Pý‚#E°�§ãäEË-Æ�¨ãFE=*·&I&O­W¾â5´r 1-´O×_ãC.wɱ�Ø ƒP¶e;�MÐox“§•‡¦YYXêÌA�Än$ÅÇ ·…™É»(ÀÝÄÉ:_:è¹Ùs+Ê+IJgáD&E%¤08�´|ozvÆr-~3PL9É]ì°£ôƒÔ}IñµþU�m‘2;c*�LÉꀳãe§­sçÅû^Ô«-`‡ù§•v®7m¬_Ap>Ö>·ù×ÿÙendstream +endobj +145 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 56 /Subtype /Image /Width 88 /Length 903 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ 8XÿÄJ !1AQaq�"2‘¡±BRÁÑár’¢²#SÿÚ?ôì|…v(AV L4ÆŸÊhNJ¹]b5[9@‹È´u©/-[pƒ(e‰7˜Ò{(ÁËÍ•€µÌuð6®�Ec#2ÁE¦5½­q\ËÉžK! �†³/õ$e_îP!cÒm©Ô¨°�H·ï©žr –¬D v÷Ö ú™A¡&'iô°ŽÿtÛ²™Œh1ÜÆÁ0Lè&Þ><áÄ…ƒER"vºÛç:émj²¼¬n»[iLˆž†'ZX2$…L%dNЪ=½ÕËÂTÚêà]ò=Uòä�#Ò±�•e!ýÉ:bÄ™ÜÃOÓjü|xq³.=ÓbÒY¾m]UÈ '!‹_tí€=€%Œ\ú‹tëÒÓŽ>A¿ B{âKRÄ1l iȲ¤–q¥ŒÜEûhÄøS L’Ë$ÊM�€­3$×^µC•0992V`‰ëÖÐ<ª/™3� €ºA;}w|©6+ÛxWF.F ˜å—Ô./]~‘ð§±t�zaBè"ŠL¡…ÄÑ´ +J t­¥D + vVCƒ7¦N„ÂæL‚TÏíþaÈÏŒ3€§¨@ó ~¤È™¥�ð3Fõ‘núY2¦!,@¤Åh0a Í9‰©ýÎú'õ +#—X=dWÿÙendstream +endobj +146 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 16 /Subtype /Image /Width 312 /Length 512 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ 8ÿÄF‘QS!a¡Ñ¢R’ÒC1A"2TÿÚ?ú¤R)‘H„Š""$R)ˆH„ŠD$BE"‘H„ŠD$BD%aJV©XR•Å)XR½£ö»i ]´„®ÚB^6‘4¼m"ixÚD×>ÚÎŽ%;k:8•;[/Jv–^��¥�¤/.…‘ÂêwɃȟ¬û�òM #…Ôîi¡äpº�Í4,Ž÷;ä‡Áä�×Ôï’hY.§sM !‚&y© øüÌóWAÈ`7�4в âšC© øü&…ãÿÎÉ.šVS L¦““?Pâ¦�’Áji<©¢ä0%·ø¼­£œçY5ÅÀ´¸~d³ñ9;#X±§fÐ!ø Ž è¸nÿqæ²2–M »ýDOñÙ ”lØ·rÝó)tÝó)t7Ì«v7Ì¥Øß2—b“2•&eK–Ö†Ðö„GµPošT™¥A¾kÿÙendstream +endobj +147 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 88 /Subtype /Image /Width 104 /Length 1611 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ XhÿÄM!1AQ"aq2�‘¡ðÁÑR±áBb#ñ’²4ÿÚ?úƒ¹¸A'Î+�»osÚ$i‘äµÒ™Ù‹tôƒÏá?½‡§i'úº­­¢©‹+»&5Ò ‡‡ã�æ¡—¸(v¨Ìí“ÈkR|ŠÙp³nRl™ec@§ˆJx襟;@2ÌÇ ¶§ŒM.ç½8 +�«q2ÍyºqdT‹ ¤LSh*G…pv²{v[ŸòåQàF +/Àð®�ù%-37:ƒj�t�Üm,.t Ã)��]7(ëy�§ëQÆÙn1ˆ€$I:(09ëÃëUp®Ld©QH3û˜¶Ÿ +½råÞù62Ë �¦Eà üª91ä߀lb1¶âAz]6Ëm»X4>n穇nå®ïM†='Õo—ðEq\bRJÉê¹=LWNf×âtãÓ�y`)ä Ðä…Ò|rvé“"­ŒÏºí=-�¸ãÈ×|ÅDÑEŠ ©ÑEc&AŒ3�$ü…Dw©¸VRb%MçÊÜ)žïh½ãäxù^¶3©˜ cÀý)粩'¬€¦,Ƭ|”Óû”Úí1°�ßÛ¿Âõ�½Ç!a¤˜¤‰Ý·Q"Ü|/ÀÕÃMë3 d,'€ü¨‘˜)V¶¶#¨E®8q©æî†TÚÌÄcE‰ÔŽb´Ýʺ’öP/&'ʶ™ƒ’°Aò®~ùU°¸u I¶~“#QÁ™[kætÜ#N˜>ž,ߺ(ìÀ9;�HêÈAþŸm‡ŠšªlËÛDØÀUÚO!çO2±|&TÉ'thUÖ[Ë­súGwY,#P=´Kÿ¶ºN{V$´@Žw¼ÇÁµY$ Æ4¨w,Ô�r°�•þuŽÛ: A e*²mȦµ<ùS,Ia ékÈ#”ƒäA®„,¡Yƒ AŽ�u‰çY\eû£’ P ¢e·EøÚl4ð¾\C0H"H#„‚<¸ñ¬®-Ö儨@ÆDÕ‚Þ‚8©çÅîãe$1:щgqö�™ªDQˆ¦@¤4êMÜâWÚ]Aå5£•mÜ&&8Å uð¬àî1÷+»`òµ ÜcFØXO*ys&(ÜÀM€çXf$†�cY5§‹¸Ç�wc`Àñ1GÝá/³x™�xòó¦Ù‘L~ZÓ|ÉŒnb�$é$ÀúÒÉÜcÃŒNƒ�ʪa#�y¸°áɉըt¶ã´˜4©¿•üf™ ÷XÓQíä0o${BoÆõÛaaáúT»&VÁ�i¡f ðÊÙAWtmê¥ÆÒn\7£«ŒÈ5«#Ï“qÕW�±RfZ42"üüj�qeKC,�*(¨8>÷LÁW˜1-ããQ³�iœ�WH;g|›|øSÆË“tI‰Ò!'ë4wêÙ0eL~¶G pâ†+y3ãÄà»’SýÕ®ß/nˆ6•$fAÚ¼’Õ>ßíå·î�»ç[ö’}#YÒ�—éFœ9V‚*P©{XçvÑ<âô>$PÌSÔp©{(à¢yÅéŒj 0/áXû|RNÅ“­…æƒÛâ6,N�+~ÚÀ-¥©>%pH´r­MèÐÓšÂ8È%t4ÝÆ5,ÆO…0À‰hÖ�¤Q¸s¬>à]¦"f¶1 p¯7/nÿúý=£{u`Ãl4ˆ�DÖ»…+“·BĆɷR4L­ÀßÓgç]C·EÇí�ÒfDž5µIó4Ý „Áâ Š–LHFÓa êF•‚‰‹*•¸�IÛÂ9ßé]$M�qeÇ·r ¡B@�¤›ñÃÆšcLÝ,€2 Ya&�74ФÁ*ÒÚ’.ÁC y_ëCØSåÄþÜ”»Tÿ#ÍàÈð»éð¯ÿÙendstream +endobj +148 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 40 /Subtype /Image /Width 192 /Length 1419 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ (ÀÿÄO !1QAaq"�‘±2ÑBð¡Á#áñRbrÂÒ3“ÿÚ?õ�8‡& ^×k: Ücr@k�$hÀoÑLÊíÄÄÜE¼)”·æXq0"N••×¹l|“%øiíš^.÷ØË‘sd,dqIÌ Q=5ó®ˆpDÒð÷ ˜�³#¡~´ÃµaþŸÞóíñ¶V—eI€nÌ¢aDùøV¬½Âb’baAcB¬3)PÂn$!¾Fô¸FRÀ› ŒÈÖÕ\]Þ<®PH`‚ +˜:ùS«(þ¡…Š�Èò$)âx±PIÇ�«Žó!pìi¿„MÔ �Ljz½Fî!”c¯Cò¢ý¡ˆ&5�1UËÞbÂb`˜°&þ1¦Õo~D…iÚßY�ßL "±f Ü(ÖfÃ[HõÆE�Z ‹·G!y3™fhº�Xø +¶<¨¤žJÜA-ÆüTÉÒ禕«®UWC*Àw‰0$Ò;^ãPQ2+2 S³•�¶î;vî{ˆe%Uy\H²kåZ2gÜ ¡Ñ‘dÈ €wåÒÒ>4üE ó{þÝ¢ëËÕËáùº�Íf$NÓCÜ]ÆúÑä„P‘¦ÎÃ* ˆ1;Ü7üiÅ‚‚I êªë�J�G…è ØØ•¤‹DÒ;nïÜ÷ •\(éùUºùÖ“‘F¤|ö¢0�A 2£F¢t 3c<½CÓ­ô¨™‘þÖv4´Ì_# @Ò56SüjËÜb-ÚòÚDÑË™1X²‚t“QIÆ¿ÍeÔÜ":jOÖŠæÆÿk)ò Ð÷ñÈ„�ë¯à~TS6<„…`cX:\�¨"±÷\W/lD_-ÿóËGh¤9ÈÜÙ2-p&LNÕ?S¬úûÿÙKÊ8œv´‹˜ Þ¥¹ +Ñ•Ï'� +/n$øÛ¯Òªýºœ¨€ 'Î"g{Ÿ)MÛ{ií«œƒŸ©X$z�¨!w-¼Óœ…ÉŒˆDmö½å‚€OË¡ó±µ-²ctnlyAã '­�Æ®˜0 @=<  ÇÀïX»`&@I+î  ž ©ò½t}¬lfO-ãHÂåA "g@œšzŽŸ±Òš ¢/¥ô©‘B� + ý[|j˜äñÆþ¦€Y£R±¬k|´¨žœï1äR1vÝ® AÈ 4ñ‘Ä3z�{È­#& Ä<)=Þ5ñ|"k.<ν®ÊìáqòåÊgøøM]_ÜÇ”¸C&LqëNEN´jà“´µ�…FP™T-´°Óí¿ÿÙendstream +endobj +149 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 808 /Subtype /Image /Width 9 /Length 929 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ( "ÿÄ^�B2q3AA1ÿÚ ?õP|g÷ô`ëþ“{�“êþ�ë?˜É�_¯õþ oqû׸ � ¿n™à‚v�J¿vŸ\NÐ[»O®§h«wiõÁ-»´úà’–�J¯~™$¥ ¯ŸÑ%-•Nÿ<“RÐS¿Ï$Ô´ +UóÉ5-óÉ5-•F<òMK@ÙÓ RÐ)TcÏ$Ô´ �2-”ÙÓ RÐ6|ò-•F<òMK@ØóÈ´ +ScL�K@ÙÓ RÐ)M�2-gÏ RÐ)MŸ<�K@ÙóÈ´ +ScÏ RÐQ�<“RÐ)TcÏ$Ô´cÏ$Ô´ +UóÉ5-óÉ5-•F<òMKAF<òMK@¥Q�<“RÐQ�<“RÐ)TcÏ$Ô´cÏ$Ô´ +UóÉ5-óÉ5-”ÙóÈ´ Ÿ<�K@¥6|ò-gÎ@¥ R›:H´ �$ +Z)³¤�K@ÙÒ@­ R“ZHU´ ­$*Ú)5¤…K@šÒB¥ R›ZH´ �$ +Z)³¤�K@ÚÒ@­ R“ZHT´ ­$*Z)5¤…K@ÚÒ@¥ R›ZH´ ­$*Z)µ¤�K@ÚÒ@¥ R›:H´ �$ +Z)³¤�K@ÙÒ@¥ R›>r-gI–�Jmi RÐ6´�)h¦Ö’-kI–�JMi!RÐ&´�«h¤Ö’-kI +¶�JMi!VÐ&´�«h¤Ö’mkLrm”šÓ…[@šÓ…[@¥&´Ç!VÐ&´Ç!VÐ)I­1ÈU´ ­1ÈU´ +RkI +¶�5¤…K@¥&´�©hZH´ +SkI–ƒŽ¯ÿÙendstream +endobj +150 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 16 /Subtype /Image /Width 312 /Length 677 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ8"ÿÄn‘QS!a¡Ñ¢R’ÒC1A"2T!QÿÚ ?ú¤R*®ÚÎŽ%;k:8•*U± OkeéNÒËÒ—D$U=¥�¤.] #…Ôï’´­YçÁäOÖ}Îù&…‘Âêw4+A~‡‘Âêw4в8gÜï’ ‘YçÁä�×Ôï’hY.§sJV„R+?BÈ`‰žj4€ÙžiJшH…Ÿ ä0ÇšhY ñR•¡ˆYúC© øü%+B!"³ô/þvIY¥e0ÄÊR»"‘\zNLýCŠ�%‚Ô¥vÄ$W‘“Áj�!€É%+º!"#ü^VÑÎs¬šâà‰Ú\?2 +,üNNÈÅ–,iÙ´~#ˆ)]‘ XR«¸nÿq漌¥“C@nÆQüvCe6%*ê•…+ÍËwÌ¥ÓwÌ¥+ÕqJV…æèo™Sv7Ì¥*KÚ?a+¶�¢ìo™K±I™JT×m!+¶�¢ ¤Ì¨¹m`èm€`Dp JõxÚDÒñ´‰¥A¾iPRf”¥ãiD¨7ÍWÿÙendstream +endobj +151 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 48 /Subtype /Image /Width 176 /Length 1365 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ 0°ÿÄI!1AQaq"�‘±Á2¡BRðáñ‚b¢ÿÚ?ú‘JG0‚ �KØÄ ìY`R<|W„[ëaZ“nÝ¢HµkhA¸¤¸ÕtS.”2ƒ¨¥í§ñ*{TtlPd4lRA�jE7öŽÔÀ@ €h@¬Èm(ð§¸z*Y9 +¨ì°J‚b|7SÅ“põ2Dyª3*Ü�<èkŸ.wÇŸ02³×ÒTGý« 0:H:ž Æ·¦]F¤|é̉¬ Ê\¤ÜOûL})œŠ '´ÓëI²*� N’h|©Œnfw&*ÎIÁ�²¤6Õ'[ ŸµYó& °Yîb´¹†àAÌÚ°y€,]@$‘a­ë—Œyd¬3$HµM¦$~ꇄÀ+»*�O¤­ÖjÂæVX’º±SàfDAûWió¯3 +qÝÕ[Û‰�+WV>.<ž¦PHcxì°øÞ£˜N_l•’¦�°ºÈ I$|-Öºx¸WŽ›¤-kXvï¯Æ¹ù�Ï#H��®Ÿ–*¿ +*‚3]�æþ® u5?o‘ ( +E mÊ®qì!@X°°ÿx�ÉvçËkBí�7y�Òµ„ ¸ÜƒŒ’ÍuÒgÓ»þQ¼k§—éåÒ¹&MáGïf‹(‹t¶½lI¬|Ì –Ä -êõî ¿ÊÖ§ÊÅ‹�ÂΨû½9 ’?& Ç@;×Síl –)·#×!Xk6±ýi.,6EÚÈI'OÎß>¤Ö²ŒO¹�‚þÛDýcà/VÇ�1HßY%§ÎkøXq´ª�×ä#é[övëÏ™úU6Ô×�‰ * ÚÝK}M#ÆH‹‹Í‰[Ÿ*D¨0 ¬H:ù�TDTT@–¬dÏÌÇËJM'âIúМ|xز¨“©ê|è .X�aõŽ¢¨E`bPÛ¢çÆß*=¤™Ú+qQ~&må›I�cIòª6%x‘¦‡¨éj^ÒH1¡‘æzÓ‘@DÐv ãF]¥A¢ÔÂhšbŠE‚›�'JsKp¼Txœ•åâLª¡„ˆ0ÂDн!YÉ�c€z˜¹¢‚h¢”ɤíí¡b €L mF7Þ¡ ‰èµj‚b£‹�2î hcäH?J¢d¡®$QQ·,Grf MØôµ$ÂRHc'ÄŸÐÍMñ{j7;µÄÃ’HíöòÒ�p6lc«âfÒ�fß—køEû`\Ü\ƒ2–l>EŽû’të\ßù˜U¸øZM�s¡Ué÷«±.Ê6™:) “yŸ*¸1¶ A2 $I�I?àTùJeL�/XýÀ}ê ä¶u7�ÄÞä¿Óhж^9ä å—qÊ&iývšÆe —×/üTH +-%¯åTÎÁ6)˜éM»÷þºÅE“89 ØY#BKjm¸@žšÑÅáåã•#*‘I–$±3ãçm#³�HÄÄ€Oʹo‘Tj4�lI¥tñ_~0H"{öéRÛïç`êa} ék+ný ë¥K1·"@,E­mǵGŽ£/ŽO¯n%$NïÈ •&ý|{WÿÙendstream +endobj +152 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 16 /Subtype /Image /Width 72 /Length 454 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ HÿÄC!1AQa�"¡Bðq±ñ2RbÿÚ?ô¬¯–åU`72DÌüþ6ÐÄrãÊq6B÷\ÊHжSÚÕµ8‡+¡bÂH—$ïôÓâr~qt�ȃ;ô¨¥`Áï­F`ÆúÅ“�ø¸íÈ7@Ç}Œ¸�}§·c«>FL� Løïqú[ªrrcyb'ÚµFþï>¾š±îÃs>W b+´{z~zYxù]Õƒ¨VT±5ûÛ¶ˆâäùÆ[Öam¦a­û®ÿ=´ÿæi€Ð´ GHi�ÔË4ÐP©ÕŒ ÓÍu�¸ÅñüLAB- É%m·ù]>¿¾¡ã9påĈéÚg¯�\Žát†Ü@©" =dõ®¸MÙS–*=ÌTíO»i&)¯ÿÙendstream +endobj +153 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 48 /Subtype /Image /Width 16 /Length 310 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ 0ÿÄ;!1AQa"2qÁ�‘ÿÚ?éÃÚÂÊKA2ŽŸŠ�íãï vH�AÇN´¡ Ab×›ÇÐm놕.ÁO3<¨—&]Ä3ÉacÈž:VÎG-´4Xîbj ùeCcŸ.à`[•8½ëÿÙendstream +endobj +154 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 32 /Subtype /Image /Width 40 /Length 424 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  (ÿÄB!1Aa�Q2ðq‘±Á"BÂÿÚ?ôü>8ÀZ¸ÉêÐ]¨®y°®`lÁ»­Ç×ëYÇ€¡–vsÖ?¨ÓÈÇ’a´éj_ëÃÄ75¢ 0n ï4òyñ)f0ÉØ +Y<¬X›‰k�$L±¥läP9Lˆ‘‘Qã"¸ÄÜ�CqÈˤƒÉ­ ý²+Jÿ)"Äúºƒ¸�{Õ �`‚°Ø:üêlc‡L’SÌþ2׳X‘Óí`ãÄÿØ)öžL¬lwžFªÍŒº2¡ +När^âÒ*fðß2„b¨I +tåh�êÅÆ« µ �\‚Ê i#J †ƒ±½ÿÙendstream +endobj +155 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 184 /Subtype /Image /Width 9 /Length 275 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ¸ ÿÄ+�2BÿÚ?§Õ† :C§ ô…Vdé +¬0ÉÒXa“¤*°Ã/HUa†N�ªÃ �!U†:B« 2t…Vdé +¬0ÉÒXa“¤*°Ã'HUa†N�ªÃ ½!U†:B« 2ô…Vdé +¬0ÉÒXa—¤*°Ã/HUa†^‘ÿÙendstream +endobj +156 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 136 /Subtype /Image /Width 376 /Length 8363 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ˆxÿÄQ!1AQ"aq�‘¡±2ðÁBÑáRbñr‚’²#ÂÒSÿÚ?ú.Ûˆä˜Æð$±€Ð¤Þÿ‹Sû,ÀÃõs3ÃI‚)ß¶OQkòb¼¸ŠWF8‚,¨"÷ÚÀm˜=-ÀØTŽ5ÁÜâ N7› ±ÇÇZ“vy;½Ï¼,�fV,¶›6ñ骺;>%w$‰=Pä‘ãC"ºWûqbù›q5#�_3n¼*xË_åRîÔ§´ U0DɱLµÆÙ�xUpLªQ!dë?ÛÀrü†½‡OªýEpàpvøÕzN%“"]ƒl`Ÿ…u&5ÆzLxpãRí0¬{—–ÚÜà•Y‰˜®¶’Ò ¤71y‘Îj1c~ï; (ƒ�ƒd©el�ÿž­–Ïíò6�ç´Ž®èQ�³DˆÿiþuÅÞc§؇ÊK_YÄëôŠïÚ7¦. ì߉­ÎÊ1¹bT2F EÍpäs¿·$@\¦xÀÙ•A'Ä‘ñ¯A1 zR¢5´ÚLA´ÇÂtáL0Éû�Tí—s�Â.ÆtÛc¨ükW´U ËXDIޤ[…iíÔ¾þ$Aòå:Ö~Õ öˆðÛ:|M;â77�*™íî» ]¦‹_—ë­s÷=±P®VRĶ܅fN»�‰à UpãfÊ_ÛÁ¹˜Þí �³`<~{æÂ¹×k�zX©·ŠÁ¥ÇÚãÅ�q€v®’I�SN1f“l�½“tx±oùV‰ ½®<‹µÆá$Ü“3¬ÖžÙ ›ÿ¸Ç-&‘;L]µÕOH°’Ð9(&Þ•×·,IÈh@’ @±ÚbAšë8�8E¸ +OØá,\¬“?Úd| bã8Ù1c@¸ÔkôP>¿ˆéŠL¸S0À0AhhÆ9*.}OÆ¥‰N¶FSÈ‘åúIL½¾<ÀPbuñ~Uƒ¶Æ«´¯Ò�P(�K�·ÇŒ«@ [J ‚&u’hUfÚÞæiqöØñÊ·" ãñ¦D Ó™¥1Îè½ïÆúý+N¹€x|ªµ…°b"`ñX¸ÑK0Ôóáz’v]¾6f\H¥þâßæ#ZCÿŸÚ” ìãÚ …Ú6Ï8Ò¯í%„�<<©_¶Å”C¢°ñýh=¶"ÁŠ)#C~5HµêIÚ`EU\h™PBŸUm( ‘A4VQ1HÙ—*�[KO[4Q4TógL ¹æ4°,oà ššw¸� �¯IR$3ánuÐ éFµ•´VVÑ4LÑE›Æíµ´ +(¬&(�)seQœè “ä+q¶ñ$sùSQDÑQÍÜ{L«»ø�ùÕA �)NH`°Lñå¯ð¦šÙ�Er"fÄ¿ödw/öލO�Á¥^áŽL@~´.fM—h�þý|vÉ„û�‰‰N†Ä�_Ljs‘²eØ-µwÇÜa~†§—ÝØ»úop¬Íá÷ŒÇ�W²}Ø�ÜÌ $¬`xÇÇZ~àô�ó§ü–¡ÿœ@ì°OÿÉ?â)ˆ'¡ФikrããÊ�"±6’IùúÒ®]¬Ïê’Ä)kTÛù=Æ-:ºVÚ‹|é3ätêuêe‹ Øáf\EÌ)N3›1Wct;x'~|xÒþã# ‰rM²½%G´Iá­6^ß ›ÜnºÔŸ³náÙÃ'.…Ï>ž¥_…S66l˜•œÈ"JÛƒùñ³63�¸íÎæ=DDØôd$� p¥Å�{�û…ÕŒD3o"møl (Q”È’‰FÛ€·Ö›´FÞÍ¢Ä*ÄEÚO¨Šgíò0‚ò%NŸÓê)?fÛ‘·Ý¨h%Iÿ�9íòŸsÈE½ozeÕb^oËQÆô«ŒvÛŒôÁ$IÜIf#Srt§À¦ nݺH6ûx S:R‰H¨·lí´{“dŽ©x@å±;\ˆÌÁÄ·öøÏ?×í_ œ&zyò½6NݘB¹SÌE�‘šSÚ°†\‡tA&óyûD•Up +Y~u¹qœ bàé?išFíÁÇí‚Ub:z`xF”ψºí WÄRžØ:v&DX•�+Úµ0X‘X{¸0m°ðþu�Úï`Ûˆ#O ‚~0+NaáÑ„Àý^œ8WlkØá½Æbìä ;œ3aB�<Äp®¿ÚcÉ‘37S*�“¢îÔ�ÌÖàíGo=lÒI;£õà� Ú&6%IdßñøòǶR@mbÇHÔ^—öh7€J‡§o„‚/>3OìDC€DG•ûEue,ÁZwuÝmuùÕïÔG”RŒ! ‚ndøÚ+rb÷"äyq¤ý¢KXÏ�„[•¹P{Ub¬ÌĬEù8˜Ðýª¾¬ÑqÚ1ÇÖ©�ư'‰¿3X¸J´îcàbßJ{u$\Ø@ÀŽP5õ­\X´Ÿ•¾Tƒ²Ç±’ä4MàȈ2 Í…écŒ%ÚóÔůciÐHÐZ«ì¡"÷��+vªH2m#—Æ›'n¹H&d-ñ¥²®„‰×ÆóùÔ³c8ÄgS;�†�Úˆo?…7iÛ¯o;1®5?¤(S?éµuÆ`ºšÒÿʶ“z±Û©§¢ŠÊÑY[ER¶EB°ŒN¤^ÔÆƒXX,xÒûˆ,�ÄÜ�­½i�m+8&šŠ( ˜¢Š(¢Š(QXX´kEmeƒSLêìPL©ƒ"8ÿШœ¹Hg° 6‚f>CY“6ÖÆ»�‹àÐÎÓá ]�b@ ÐX*æÎùNXÆ@€"~Þ©×ý¼è½Ö�gÒ6ãšuðã_u“yãuSi0.l1<*}¦|Ù‡(V÷›É®·$ŧJâÆýÆKïO·úNÝÆ#i›­2w + #!rÊ©©ÖÛ¦ÂxÖ¾lžîÍâbv…'èðžïT%Æe¾¡¾oñ¨åÏÜ>HÇ;md€OõËò®¶.@ƒ¿—…rfÍ™ˆx×{J‚Ì·�.ôò®–C“iŸµ‰>1øš�o—#7SÌ’"[Dòç]ŒH=¬Ì ÀÚ²eân·œÿ +æÅ“34± Ì•�µF±"n'˜�En<¹²¹ÚÀn +΄ƒ0å]HLCHâ*o‘§R¼€“xäkNðC€bÐ#éÏÆ› +¿SÜ •°);¬�‰d[[ëÂj}ËgTÿ®æEíÌLL +Ü<ö4,<ȵ/o‘Ûq ´€Vd‰b|µª°Èª:ÍŒh ðü¢¤3·vqlUw‚’ sÓîÙ2æÀ™XÃm¬Ú`Lúü­|/•1¶BòqˆBÍŽ¿/¥ª}Óä%•2²é…„ÏWÝ…>|¹Xªâ¼‰³ k¨<ÅuãÝyÖ/ð¬È›¼…MÕúH:ë{ó¬pÿqsi0<4¥Lû ™³(åÝåý4�Ç¿‘�Ç¥äoÙËûó®¬A•@bX�©‹ü)ë—"2¬6FªDÞã‡éÿÏpd6b :],l`Ò"y€f"$ÙyŠuÅ™U“§¨±–¶ã7~£Â(˃#¶6 m·º$•d26ž κ¯\ùñäÜRlâD7°3¯…báʹ ˜¼ñðçÈAu[\q¹G#FÍmålN—‘Âl*™ ÅG<“.ª ÏI77¹Ò¨�çp‚"Äq¹rvyr‚¯±�bA?r©?lEíjè|NYYHµ¤ÏÚbGʳÛÌU—o" ý—=¼¡�N�˜“,𙨷k›"äV]JÚGL´k7†üi]+�Ê2±‚fã„ÿ +’`È_sí"Ó-ÊM«¤Ô¶ä m±æo>–ùÒû9–‘p£á>55íòî†)´D±‹‹žUk˜¾EÆÊ'‰ijÞ&õÚQÔBÇÛdß…LâËxe¼Å¸Ú&ãJ2ƒ´'lvîqðûgZé*Y±Ð&מfD~u™p¶\{w6ºÛKÛñç"§“¶Ë‘X{¤Û’/6‰ò À¯“3‚Ì(Ú:g™?Z1£ä{ €ÿ¤Òßi�ÞGòª6Ülˆ�yM#öÎøÙK‰`A1a60'ó£öù +fX;¦ÇFõ¥~Û)¶õ‰�³ÆyÕ öØ)¶£p·„Š®5*:ŒšÌˆÎ:L)¥ÝDn›qiN,­ ¸‚" ýM'í\(–A&v�Zf:¼MiíZå_ih$€.D ¿0"±Ó.$³%›ÎäÄp®ªž\C,Iˆ#O9�•Ðß»X i1?JAÛ°rûµž^>z(¢Š „ÍK�c€$ÀsM[E8QA¢ŠÂ+(‹ ÔQ´LÅQA kY„Š…V’Q4VÒ&TveV® #뵯 ’` +ƒ\~"´ÑH¹QË •0c�åNmE&\É„Æ'Jq\íÜô{Š7,L‰28@PfiŽbv›ó±çHŒÏ—t0@ƒ&öæ}c—Ü9ŽOp%Z +�Õm¾&úÒvî1â¶æƒ;‰äx~ kw-Žw§lfÙ �Sä¹@/'éPÿÏ‚2�Çû]—ò¬ïÊF7Æ¡�¦Íü(Ã�àTlj „Æv¨?Úyq5ÐùZa­Ì�5ÏÜw9qàT+nE€dKº¤I këÖ P÷9L{W{HÝÒ6Äð“¯*aÜ�zí+>QÎmY‡¸É•‚œele¦VD�þTåNù´~UÖ nb¸›½eUÈV²¨Cõ² 0Ñu뱌 kð®LÖ\·Úº&G0|i³w1”UUbÎV$ØA3§!H;ÌŽêeÏÛ'~Ñf<4â*ÃÞ÷I±B¦ë®‚<¸×9ÿÑ;¾ÆÚ Gš*ïŸ)hÆ Æ»ŒF‡‘çCæÈˆ­´I*&>èÙ;œŽÌ¤œxĸCe2G#?#V͈¹VÓ "nu<æ$zñ¥PUvb(¤`-'ŒZÓ5'ïp–!efv�ä�8ˆáWíÎX>ì6�ø™ó·•kïvÄ^yúWsÜìÝÊ«BX0…0›�¤ë¤M[)ÎÙ¡U]¦ämܢ¥Üä.€˜ 1æƒ|íÔ=Å`K ±ÔåRÆ­�v.;$ßVc¹�I�jÞá°Úu�–¾U¾á˜Ú`{Gš)ÄÎÊŸyÜÐI’Q¯ö¨®L]³ ¿Ü6�¤�Tð$H+"ºCeoÓÔøZ�˜ÜmÃ2@-¸NÕÝ÷qãmu¼QØ£ãÞ +Ë3\ƒ÷34XøÖå9NaÎÐGTŽN ¼$Tr¦bç"á$¦›œuaÒ$…×_ +¹l¸Äì/1`E¹ëtw8Û6" + ¬ ÆÁÄ“mEëJ8#&ÀLhÜ<1¬ ò©÷reÇ–n`Ê·×p‰<´Ó‡p0‹˜ñY�½áf:ä~Ñòãî�‚¾ü‰�Ó8×õ_ížÞ$̈¯;'g›"Ò�$êÈÊûxÂ’¿Ê»r«º@‰· "§„?ê@Š¢Âdü¸VaUË•²NÞ�1çiò©œYœíÚîÓ¡Dß‘ª¯¾nÐVO\ðà6ü½œ+r+±Û2Oò¥eË™B²�t&ï¶ëD~"¯�H@¤pŠ’{Ë:©ôãÇü4£Úe`áWwý#Œq¼<&±×;HS{.€�A½OØÌ‰ +‰ú¤•DTñƒô¨äǘ”] í@YP +øªÞgŒ}h>|G¢Ž–Üvô»môä?�rbîÚ;S¤ ÝGYÇO…T.thP…"È#íð>?!ãLã:,¦ÆkH$ 'Ì‹xVbÀã;åh‘T€gì,W€þ£?•Y·�ð“üª~ÞDrË´ƒ6�f÷üO¤rvLø™€X±&, 4ÄÉÒòx×Zî*7…!8¡ãðá\ÿ³vÂø\‚®¥X‹®Ó5¹A:ì&E‹@#Ï•Kf^áq•€NÓЬ[X×åã]QštH�7>¼*æŠ&Š+DVŠ( ¢‰¢Š V2†5‰�q¨Q ¦¢h¢Š( VÑHØÕ¦@3cZª@+EQ[EeE§›�¥4¥îñ¾Ò¦U€†C6¡»”BÝ?N‰Òµ{…e ·�#�å@î1–‰¹{rÓž¼*I•¿q‘KtŒhÃÀ–ÈÉErœx‹df}²IÛÕÏíQN;¥PYÁ@’Ñs0O#L¹†R@@xAM… Î}Í¥Z8-Ç_‡Ò›`U˜“o¥½k¹ÞÀu‘bE�À˜õ¡û°¡¡¶Í€Ö5‰"hýâ{C$$, eŒ­6Þöî–R¦aá6æ)¹Œ¡ èÜ5Û´Èðê®rïÚåË“nL�•aTî¸-º7£Îº¿t¾Ú¸o»Kƒ:˜ï”â|¬¬¡7nç �OLò«bÍîj#dž´¹»†Åöãg´Ú§Q‡½Çµ +�Ç ”Y˜DØ1)×¹>àFÂ8LȦ.uŠeÎNÙXݤ‘:Mêy{¯d8ب#A¹ŒÅ‹ñ¡»Á0‹¾ÒH#ÀùèE1îni"o§/‡Æ«¾Wt"c�rdÌsvÌêÒ +V-–Çñô§Á™´Øc¨î‘›s«ï ÀRi[6Ð ·‹‘©0>'J¸ +áHÔHø€~¢°ç! �þ™;½ªÌª\.é‹·HÐ&�³p¡ ã<8ÿ˜¥^èbD@¸Ôò�ˆ®N鲿DgM‚f “¡€`DÏ�­tåî�¡8cÑ<뤘\ÿ»;}À!ˆ*d�x�ŽSÍ‘räÛ·yX`-iÝ >•Öª1¨ÀZ¸;~ä&<…ÛþÀ Ä‚ûO Ý~>u«ÿ¡—xS†7.äê°3hŽ&ºÎRªY„F—Ö“\¹ ²R ýÒàžD|ë?s’Š@ OÝ:M�s#1ĪáP†ûWí…iP4Õ©Ûä>îpI e�Æ?êÄ`|MOº ífù°Ä™·º§óŠ·¼;�¾Ù˜"F‚"ÿô¥B¸Èä�§f~ÆÈ[á¸W6<.p¤’6íb¿Hô†™+´ŽD×Z÷I—rª’T^A 1ýZI¥Ç–Nî¢ Ói"ÖÒÿ�t‹¸ƒ¨¥ÈW%„ý³¡Ñ¤~DfNá•B’GWR0Ûu A†¬Åÿ^|¬À€Ä�`þ•EúƒY‰ýÐIVÚæNå*@ÚêØ5ÑÚè[VñŽQåSÊŒ¹—$H +½E#þ&§�ã¹ÊåXŠ*nU²L[ÄT{gl]¶*ÊUQHöÙšÊio=)“y°…iek²íû޼u¹ÙÛ?¸ +&åJñþà sfw +ŒnbHÚ=– ˜ÄO +^Üdíðcé'b*°¹'Û·HŽ>>�M�¾6ŒlDhzKN±?�g¸s›L‰"#„Þ¡‹À{%Žæa`L¹ÜnB�v·….í¿mÚ nGTÄ)ê#PmSÏ…ÙO¸ŒÎ¶R²CµdñL•ݨ½$(�`Mçç\±äÅÚû �lad\�-~UÐãA*ÆKh9™¡ÛÌ\+�èÒÒHñ“¼ü)2â~ëfzñ´qÛ�ÃÜoøð¤c“&T'®ÝÂlTÝx†ðµ¾Õ��åavàXøÎ¾sÓ¯S�æÜT�4‚auádyñð®„ÊÌ ”*m#ι†�´‚7Ãý[çj܃.ÅĨ[h‚ÖUûHã}Æ›"–#r3"Æ,êo¯(½t”%&M¯â8×7mîáÅ‹ +Â’HhEã#l“½)eÇÝ1öœ¡DPò±Ñ¾mºW*î&ÜëÍíŽlc)l :°šQýQªÖ…Ì·oiºq•k¯Ic�û¸m:WSeÈÛ‡´Âƒ++ýjj2b{bûŒ‘!WuØê|AgÆÆK#VR¤ i Àë?KרErãÀø²3n^¶–±’`(¾îLø}àÄV¿5;†„qDVQÔA>)¸VQDѵ•´ +(4QEVVÑEQEƒZÚ(¢ÔQEQQEQR^Ý@u�O•.슒9kÂ׷ι3wÎ(,è¤ÿVæA#Âíðšî\Èí +À��¡õŠL}Ć.Tmh±ðó½><©”nS"´¶Úçî7Æì¬²Ÿp•è#ƒ^>uVî1â@ù(�Iµ ÝbCÄÎØãº&"ŸÝB�Á•"dr¬Ç™2}¦žb¹ñgtÄqµZ`…’5´ZMªØò®IÚf :Æ1-¥"wX²‚U�/Âþ5EÈ­¡ü©q�¬ ¾† ]+ºÄ¤Ú’& H™¾œ ÜãÆÛI3m1:LP;„/²z ˜ƒp"câ)Žeo ñ¬ÅÜcÌ% ˆGCéBw �À�|A_¨¤ÉÜ#© +ì$‘¹DÁ˜Ô‚5®� ®~ë+ bI�½$…&H"o§_Üãíq“•É + & !G8Ÿçª½Âº‚uh ƒêžµ‹ÝbmÐßaÚÈ<¢“÷ئ•¸@�cŸ˜vÖª�Âd, Ýu¾�9Õ+•³œ˜Y–VÄ©‹ÆÝÀà (ÅÜ*‚­¸FâI˜Oê6Ò®Ù›ò­Å�ePÂG˜ƒó¤ÎÛq±’,n¢[ÐCIô4¯Ý. ¥ƒ_’“ÂoM�¸\«¸nú©SkhoYû€WvÖ&ü©0÷c&=ì»wVÛjqÜ+8B$òX“ó‰Þ#€T1ÄÅ´|fÔÏŸk*€L‰á¤�¤ÏêåVDÔÛ,d ¤Æ¼d6Ÿí¥Ìêȱ_™.ü°Æ“%ñ˜ì÷w¤kJ¢;¦'Mˆ)—Ý6Yô®\¨2¢•Sî…Y²q,Hpñ®ÎÈ䜉’åHÄØj@ü(âz§iʼnæD�­L:dЂC^„pT‰�t® ~à >‘Ãt¼ÇÊk¡öäRgp úne[ò�+{VÀÖÄûâD†ß­î×úÕÚ Î•ÁÛ–nß +±#'´-$†Ú'}ÁŸY®®Ú%¢÷¹þî#Ò¬ÁZ�mæ/\�íºc8ö�6Á[�»—HájÌm¿&`ÆAcYP¨ zÍ65UDß;¢ðIRZæP,ù“2Ûr½r’ ˜ò¡ócÈá•Õb:Ùx yóŒSep�Ö&h¶,“Ï\|5‹kO›½ÂØË Š•ÌAÜ,y +Ä\Y;le6°D}²®9ò£í¤.)–¬I·»—+ùSfî‘Ýê0´þ•eŸ‘Êk§®E ºk\ún«í‚b ðPë*Þå�gÄL}Àæ¹"~5oú°¸é‘Â}t©ˆ ϼÃ0€t¸H‰òù×7o‘Sl �¸ÆáV6#„W¢‡;€~z¡® n1á|m÷ÓÍyùÕ{|ø×â@ß[~£Î°æLd–’­ µ‡é�]B0.« “ZÑ'ÒŒ¹–æ>5!Üã A±Ž ܹL¹Ä_ûQ~Pk0°rÉŒ³¬KÚ:‰±²‰ôóçM�ÀÄÊ:ˆbÓ+½É1u™"¦þçV7_W(ÓÊ:ʺ²°qY_¨þŸH²«)ç$§ÿ“]ÀÈ˜ŠæÎÊ�ÀñчÿUÿÙendstream +endobj +157 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 648 /Subtype /Image /Width 9 /Length 845 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀˆ "ÿÄ_�Bq23A1A1ÿÚ ?ôéZ)˜®CR´S1\„©Z•¢™ˆä5+E3È)Z•¢™Šä5+E3È)Z•¢™ˆä5+E3È)Z•¢™ˆä7'E1È)Z•¢™ˆä7+E1È)[“¢˜ˆä7'C‚•¹>u1ÈnG�LDr +RHó¨q‚Hó¨q‚”’<êG ’<êG ¥$�:‡È$�:‡È)I#ΡCr #Ï ¢9){ùä7 Ýüò#�R›¿ž@Är ßÏ a¹)»ùå`b9ïç•�†ä¦ïç•�ˆä¿žV#�R›·žV#�nþyXŽAJnþyX(ŽA{ùå`b9)»ùå`¢9ïç•‚ˆä¥ïç•‚ˆä¿žV�R›·žV +#�^Úe`b9)»i•�†ä¶™X(ŽAJ^Úe`¢9í¦V +#�R›®™XnAúi[ È)TtÖ¶©<7!FzÖÕ'†äª3Ö¶©<7!FzÖÕ'†äª3Ö¶©<7!FzÖÄðÜ‚•FzÖÄðÜ…ë[Ãr +Uë[Tž�£=kbxnAJ£=kbxnBŒõ­‰á¹*Œµ­‰â9 +2Ö¶#�RŸ/ÊØŽBŒ¿+bxŽAE~VÄñ\…ü3�oqL£Çè¸>_D—Ñp |¾ˆ/¢àP¸ý¡pú7¸¿€Æ¯÷ý —ålOÈ7¸‡ÏZØŽAº×ù…l G ¥/m2 +#�^ÚT8®AJÖ}?´­áôã��ÿÙendstream +endobj +158 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 8 /Subtype /Image /Width 176 /Length 491 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ°"ÿÄq ’ÒS“ÓA‘T!Qa¡RâCD�ÑáƒÃa�ÿÚ ?ú2N̯ĉNr¤äÊüGÓe` 5&¯º™á–›Néëé;kk&“VÑ÷kµ iS6¸4šÞó¼=æZøŠ½,Ð�‹¤Mñu1)yL«ãê†ÊkP�r÷|:b%R[ÎðìÅò<ö©xXË–-§î!c.Pzô»«»òx­y•Ä geµæIè@_Üäþ"Û˜Ü@ÇvH-9•̾3òFÿ2º—Å~PkzÁ“ª—L÷T®ûÿÙendstream +endobj +159 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 32 /Subtype /Image /Width 744 /Length 2024 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ è"ÿÄ„ +!1Q‘Ñ’S“TA"RÒaq�¡BÓD±Áá2¢Cc£dð‚4!Q"AaÿÚ ?ýUfÍi'ÿAôjxkO2vˆ±FÉi?tñêc?6•ãÀZyÙ¶búh>‚/�wÚyÙ¶búknùùÙóEô�}_v}4¢‚î5>vwíw3>Ó{¨Uè »O3>Ðî¡òÃÌO´;¨\^Š ³ý‰ö†„ºÿØŸoôCÞâåª ³ûóíþ‰v~}¿Ñ ‹Ö(nÁ¿ŸoôK­»é¸…{‹Ö(n¶ï§â9.¦ogâ»J"†ë�{7úRê�y?Nò"†ê‹y?Nò)‡·7^ú…]TPÝ0v¦ãKßK¦Ô¼i{èUÕZ¡º`Ë/^ú]Pv¦ãKßB­ªUEtÁÚ›�/}eÑgË/^úR®E ÑgË/NúÛ¢ÍýÎ,�ä¥[TQ]\�â?¼—E—²í·÷’ªåŠ+¢ËÙ;nÒ—E“°v�¥(¶©U Ïdì§iKžÉØ;NÒ—ÕEÏdì'iYsÙ7ÉÚRຩUÏdÝûΕ—=�t3�)p]TªŠç±n›ïKžÅ¹nd¢åŠ+žÃ¸fd¹¬'íãÙ EË*¢¹¬´[ З=ƒ–‡aºk ¡5Û”).{- ºç°rÐðÛ¡1½¡�Úã@AR\öZt!ò{Çe‡†Ý-^u›”(î_.å á·B\Þ_ÊÁÃn„|Æ�ˆgYóYÚԃɼ¼}¬<6è[tX9hxmЂ“^>ê#tªþ[Â3-Ôhè#¾|¿™‡mºV_^_ÌŶÝ*íQ‘5FD¢ëËù¨G­íš_~]ÍÁÄf•uP)D7ß—sPñ¥/¿/æaÛn•u‰Dß—ó1íîõ²oZ¬¢P%ý/»ý‡Ôj—݇|=êú%ëx ¾ì[ßqЗ݋yü]¡_@”Sëxˆ/«óø»B_V-çñv…}‰õ¼*ÕÿÐÙlñ:@$�´WQ‘¸¹Þª€}Z"yýj¸K3Ù#Z¡Ã_kF/jìçjŠ©-³2#. +fŸ +í(q:úà47¤g%_Qꚸ’jq‡ÐU„ÑÀŠ tâðDEA-D@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DD‹Qx”8´ê’E?Z¯kÌ�×k›”�SJðÐÖ¼‡V¤� ­1S§¡PÉ«F�áVÔ1è>…æX# ÷d¡ÎµÌ”’êŒBŒè®]jUD{€<4—I=4ÁAN�Oüè[)êþí_OO±y‚'BÆ0R�À)Jb…éòW¨]AQOÁ? +åc.-u\\5º¥ßº™ ¥1~%PMågˆ°9ÎÀ^A"µ ê†Ðz0,µÆù¢sN°¡©¦�*pptÏm�î%ÁÅ•n*âÁLªêËF=P\¡uF:Ð�bé,FBÜT8kêö¯.ŠCP­zkJt{Q—)žâÒ#"£ô.�V¦¸pz—7Äpê‡ ÂEM(�W¸›ªÆ�FZû×µ�hh Z¨ñ!¦¦•Á_IÀÏl­kõƒ¦:˜ÚAëà £¨¾ƒÚçT +b9׉bsÈ- šŠŒ`çÁ�A¢GAn+Zôä^(ÐÚáqíÓBÖ@æ’K«^…àYå×iù�P0Šu‹½y=ˆŠ]ˆ©uan»ÜÂíP]QPìŸ96G4ˆËA=.Ã0-üW-I™c`f�¬p4`¦¡:®2=öhätU“ .ûŽ/jôÊ™Xè\ƒµúÚØN¸V¹ÇÓè]ÚÇDÐÖ€OI=_Áym�ÍÖv·Y‡¨¦FÕ°Fæ8šÓåŸÜ»®q5ÌmA58@¢èªˆ¼¼8ƒªhz *ŠtÿÙendstream +endobj +160 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 16 /Subtype /Image /Width 88 /Length 433 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀX"ÿÄf’‘ÑS1QRCð!aq!ÿÚ ?únú›Y¹Æ(k©‡›œb› +mä&Ƙx[”`…gô©5ÚžU [‹°LhÆ”…\£’%DÖÓŽ.Á0XýAçjxqUÛ3§ ¡6ítCpR•Dµc²ßD7ÞÔ"åU«}X¼â¾˜À\Á”LY†[ 0�°B·n‘rîHy©LÃæâ‰”rŠÿÙendstream +endobj +161 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 176 /Subtype /Image /Width 9 /Length 398 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ° "ÿÄQ�2BAÿÚ ?§Ó† zB« 2t‰R•Xa“¤*°Ã'HR•Xa—¤*°Ã'HR•Xa“¤*°Ã'HR•Xa“¤*°Ã'HR•Xa“¤*°Ã'HR•Xa“¤*°Ã'HR•Xa—¤*°Ã'HR•Xa—¤*°Ã'HR•Xa“¤*°Ã/HR•Xa—¤*°Ã/HR¿ÿÙendstream +endobj +162 0 obj +<< /BitsPerComponent 1 /DecodeParms << /Columns 1920 /K -1 >> /Filter /CCITTFaxDecode /Height 2944 /ImageMask true /Subtype /Image /Width 1920 /Length 71082 >> +stream +ÿþZcHï¹hŽÅ Lìq•U&áÆJ2ª3±¡•£;PŠt¸AË}YØ‘‚•œ× ü�Ρ�ôs>_»±È.=þtvT \S[Íd¯î, È¢›>ïh2;tÓ^—¿íÒ¥þÖ©½öºÝ…ïŠÖþ7vÆÒèmGªjCÊ|�Æ«öþ8äèŠD¼SµòO5D% U–žH# ¹��ó 3@ù0¼�"¡¯#¢.ŽˆÔgB¼Ÿ'!³®_ÊɆi±’"|Ù2ï +a„Ê$E@üü\”ÐM<v "ÝÅ¡aÃp‹€ÑvGð‹¶±òxÁFƒ9g4‚ÜÕó칙̽ á‚Fð‚eðBËœžA„h_t•M¸`ð› 4Õvš¦NÐW¤á&Â"»EçÂPˆ°ä¨_0‡¤ØAä‡*DxÕ½ ÚXP•«ô Ž4ÂV¬�“ôÂM„› C +êêÔ1øT^R´›Ò°†Xg (†×ut›¥é +‚wJÑ~ºøºV“j•«KWü NxÕ´´›èÒ´�+§W +u¦ÒUt›[ÒmG«W­¥ê+ö¯ò8Oú«M}ÓUnêÞ­Öë¦=^ÒÕ¤½dn•´¿Ll~ÒÒÕRn•Zi÷vºÖám=v“†¶¾+¾?§®½7о¿ÈüìËÕqÿ;0”™"è«=T�‘°�æˆ]éb©Ú}-_þ� Ú"»Ô;-΃iº#‚-¶YÓ &¸ZDø1t›ö`—«IÖÐMõ¤é:W¥tþûh”/Û_¦úÖÒßÒútšÕWéßTºÿÜ{vŸÝƒ÷µÿzýWâé6‰ûÒݤ›^ úm„“oá÷m&Ô}¥½û§uÒ~¿_½+h_þ-¯÷�ûÒ­EEïwõ#…ö¼Wÿü]ßÇü~ÚûzÿÞ4îêÛB¿¸½}ßBª�ª¿Ö¢�¨"‡ñµ^»÷ú[ÿ¢ë¼=!ë–9ˆ ‡ÿòÄqõÞ¯ÿÑf>ÿúý‹wëô�¯õúoú}{ßÕG|}qu�Ó{Áÿ-?ÿ–M|=-R¡aÃÿÒ×ÿÿÿúýu_è-¼ïéÿÿún¤5_õ¥Ë_þõÿÿì8ÿVÿÿÿÿÿÿýÛ¯ü±¯þ¿ÿÞ¯ÿþÃÿÿÖ¿×ÿ ÿÿþ¾Ý‚þoÿÿÿÿúýü¡;iýõýÿÿÿÿaþ¿ëÿáþß÷ÿÿàÜ·a?a°oÿï4O’7ÿÿÿûÿ lB¿ÿëÿÿûÿ÷þÿÿ*çÿð“ÿàßÿÿÿ‡ì%þ?ÿ~ô¿¿ÿï­ÿÂ\úÿÿ‚3ÿÿÿÿÿüÿÿA?è/ÿoÿÿí¿ot»½ßÿ__úÿÿ]þ½Bßÿð�ÿÿ¯ÿëï÷á.ûï }þûÿÿ÷Û]Ý·þï×U÷_ÿoK²ÿ]ÿé¯ÿuëý}Óþ÷þ¯o¿û×ÿÿþÝùζþï5,Çßþúÿý×ÿýdéµÿöÌ&ÿÞºþõÿë·ÿþ¯íÛ¯o}꽯œëöÿÿoÿ¿m¶×ÿý³=¿_õuïý‡iZ¶ºßw!Žg×ÿ¯_¿ÿzúÿöèçß·ÿíÛ{~¶õÿ~Ùûó÷ퟛû­¼"‡¶Ûv— +Ëêºl5† a†Ý°Ó¶ÐZ¦È¹M�õ°–¡µNÕ;m¶Bƒý½uý×ÿ¿m+^ýÕºöÛoïÛ>˜wÙõr ï1ÚJ·R&vI5ÿMŠdX§¥ðņÈy�ó"Wj±WiìB ŠöÞºi¶’v°¡¦A@ØPئ·»Øalý¥Ýݶ—ú¶–é7íÖ“eôØg òa›ôäZƒa±²r¨Bü2Û +âƒiCM°“A›“M<a4à ­6ÐWšh4Û N-.i¡ Ó´Ð‹ŠL¡“ÆQÑÚÞPÆ«¶´Üº 4ôÓm+m)=4ÓM°‚†”Rl„A AI¦ÓNAÅ¥a\'aIxlBa"±¢±ƒ +UåaGm#óWFT´ÙÓÐh4Ø…‚(tl'tMS´Øa$Ø*²M Eò|1 ŠaJ¶ `�Qn–¥Ýè÷G¶ *!OqapÄ­ˆ°„E0ЦGe…§_ vdž�­2×�þ@BW-”™‘B#"_;Ö ,Â�L›U�–".!¶š…%’òlXŠàqß0L)]’× ã_‡òĩ̊%R^ÿß›‹õäU;½N¢p„ƒ#çC#çew{ïïô‚ÝÜ[òTº£[@›GçþôTÖ8ÿõ�™d/+6¼™£\HÈùáPM¤ÚÃ*óyâ§§vœÊ‹ñÇýWÓ¹Z"w›8åE&Ò´ž+ìbuÿÒÓ z‘!®q�ÍHîS­¦©ÁÇIöûÁkúåu$§cùˆC"9ì¤Í%šìÙh“²822$fÈ×A™ÅÌ FäBTU�Höhð:û¥øë«½kç"$³‘X�2@ѦÈé�ªæÌ§fb�ÄD%EAŽ{$€Lx�³˜`ÌÐ#X`�aàƒ(�†|3ž3Ø@ÈÌÎ<£»¼Ò=•/4�hXEc'›PŽ;3ÞÐÂܘóü4Ÿ>ÂMɨ]´º««µ;®R�”™¦ˆ”"Ö`Éy0"u˜ò)›¼|ðƒ*Ô2LÌÚ5´| #ã]0‘íB œ(FÆQ£`hÖ Z„ÒoªWM'Iô{i7%Á4ˆáª"ÃÕðoJȈ%¥h– Òm1þYÈǤî)^/¾íQ§Çý×t‰€ÎxÍzH”#[3 ç�FÆiÏI¦O‚dýò-Š­Ã4”7„h½¤á&ÒvLävÒ´Gl*Aµ&Â;2u Ï4½é&‚ïO‹i6ïH¬étÞ• ÷Jé«I¿QxN¾ºý¥ÿÊ3Ûkúû·R\Gša Ò 6O‚jY †žƒ8gØT ãWà ڱp©]¶ïOW‹PM¥p›“„•ý¯«Ö—þ:Š�öÿ·íé{zè4µÝ¯º{Ük׿ëòg%�&^—þ“½*m®“{Ó¥áëøM¥~þÞ­WéŠéÿôî;z­]={uoÞé7·O»_^þG5 ¯›ÝwïÇð·Ó�Ú…¯kÿ}°oý:OÛߪt4ï¿^Þ•n�ïú‘ÂþêG×o_�zߝָpÿÛÖ¿¬~õ„FŽ´‡úoáþé ?×ûko^—ûíÓ¿é>õÆÿ¿ÿ·ûªÿáõøÿO¢Ü•?�ü=†Ãõûÿýwè[ÿÿö¯°ÿÿ^¿õÿúû¯Ûzè±ÈÑ÷ô¿ÿØi ô‡¿×ýºaðï÷½/ûÿ÷ÿÿöþÿô…µô¿Ý»ÿ­~ÿÿý´ÿëþÃÿï_ý}}Xxm‡þíÿþ ÿÿþ÷]¿Í/ÿõéߥÿîÞ—ÿþ¿×ûþÛÿÿÿßÁÐo ƒöïKÿÂ4ßÿÿÁü‡þ þÿkéÛkþ¿è§ÿþûh§¯ÿøo ÿÿÿäºí¨> ÿ½?ÿè/ÿ¿ÿý¿_·þÿÞ½ý"Ÿ£»Kÿöׯÿü�~­×ÿøo ÿõÿøKô¿¦÷ýn¿ý/ûþÿº÷ô·wýÿþ—^­·_ÿÿN¿ÿøKÛõþ×ðöûýºîõýWa¾ýÕ‡ÿ×ëz÷ÿ_׳ªÕûÓ«­7í×÷êëußÿëö,Wÿû»þúúûúúþþHO÷[ÿþº÷·ßíמ_¯ëÿ÷ÿ±ô¯ô¶Ãý÷â˜ÿú^Ýýÿß[ÖÝÚÿûš~sÿÝ_ÿÿëm+Ûý×î¯×m´½ÿmú]]+{ÿ}Õ{ÿÿ¿íýç=³§ß·¯k¶f›õýzÒúºû­¯ÿ°ŠÚ]Ói¶}v¶’§¥‘ßa‡eöÅÓ ;†ÃdQŸ·^¥î©[ÿ¾êýÿÿë™§ÿoÿ«?õÚÞ–Ú]…aœ¬¿"ÜŠáýµÚV–›¥Zziªw¶šI²­1²ª˜n}¤Ä$Ûv(1ÚVš»Âßÿ¡¶—[íiÝo¶ÿõ¶ôk¦Þ› ¸–“`•¥"æÙ²Æ‚M´¦)Š`¸iÂÓvÂI²Cí$Ô0ÒI¦švž/;²:% ;0®T9አ+xdûDt-ÓA Â ˆhgZý†÷úM¤•×鱺OR/�4Õ5[¶Óö“MY ŽØf͆ )Ši4à +!XcØA„Õ4�x´Ò<4š#¤†!'³ •"„"" QS’&ÃA»#DzI*iè7A›Òi«"¼6‚§h0I­÷jí[ˆÏ …c "(MA( ÐaJOVÔ‹„!‚̫ɶŒp“L0†Ó¡gh®b(¬Ê¸†ŠêH›“b=\´_“a‹ú�/¨ø/$°ë…Hb?ÿ)”æ[ë'-Qòi‘XŠ‘B;)ƒf@™Ù?å¡n2UÎù…4XpU#QÜã½bªÉ÷M'ê¤Lgá‚ú#[¯ß¥Z�53¾~ï +�ý!¯Qkꥺ¢;µîíSõ«¿ˆæEhr£þ!¢5F“*B_üí-xÿ”øŽvŸU^íŒÈˆâ6y NÅVí„’_×ÕUH$ˆº×*ï–úé5£q}lKÿêv,ˆè’"O!U¢óç PÊy3Û<Í�sùœLŸ 2žŸ¡ 蟒e; Èò�l$Ú"ÃeŒ£Ã 0Ð墓iŸi6ËYÃ<Ò¿�ƒJ@ÌŒd6]#†u§h4»Û)±�Î ðg½:é~)~›º·Ž¿ïª~ÚJÛŽ“Nâ·¤Ý 7¿Y/èk¼=/ôq”„zÿô§†;ÿÿÿõëÿÿH~Ú�õn:××´ÿk¿[}î¤|.ß×XíÕªÿj�ÿ,Ÿ¶—è°-ÿã°ø_ýÿÿÿÿÿ^«ê´”}Çø{Ó¿ÿýýªþcÿ}^·ïÿúøvÿÕÿØjÃÛ_ÿ_éÿÿÿÿý6¢¸þ?¯°ÿ¿óZ÷ÿo­î?Öÿ_Ý:ÿÿn/ÿÿÿü6¡¿¯ÿ%Ùÿÿÿÿÿÿÿ^¿þÿÿwÿ^šÿÿÿöŽõÿÿå�ÿò]?ÿþÖƒƒ{iö�ÿÿÿÿ÷ÿ_Õ}|7ÿþÛÿý£¾¿–;ÿÿÿ}ÿþü7Mÿ­¤ÿÿømwÙý/ý_þÿºÿÿï·ïàŒÿÿÿ +ÿïzýÿÿïû¨¯ÿðýÿ~¿ÿ½ÒßFOÿ×ÿíëõßßþD'ÊOìˆ_„ öÿÿéõÿÖÇúo÷¯ß]‡Wýþûýêÿÿî»éö¿ýuû¯·ÿßü%á/ÂOé~î¾õÿý†Ãm~úívÖÞ½ßþÿßöý{ÿöóËÔÔ½öÿûV×½º÷¯öÌ׺×ëÝW×÷×Uþ›ëïþ½½~¾»_ïöÛóŸ·ÿ·ïÿí÷]Ýl‚S÷·ª÷Ó×ö—Ú]öÚýo]kµýWþŸ÷×ÿo}×ß­µÝ[zÚ¦Ìûößúf}mŸ]¶­ßör½+aô¶§ªl3tŠáÚr.°“i,‹ÍÒMCi'jÅvéµývÿÿÏ~•×ùŸ·¯·{·]·i[ÖÚM¶¹�»ikÃ7Ãí+mUY]�¼lŽ0jšvÅ-ÔB{Ó´í;¶)…ªmYA0Ò†Ò†êí†M¯awVÿ»Ûþûý-].ïUî´ìòÞ­/½%mÈæá2r¨á{TÅ0zaŠ ‰6Ò ¦� Ã iÝÚNõ +dTé¦E™ášÎxdô«%�p`š !•pj�„„kÎÄÑÚ�oÝ]°îÛìçpØdt°ÛM;«I´­ƒtÕSUO „ :pÚIÝÚ 6Õ¦ÂA¶ÂAˆµH4{l Ó¢®AQ¦J°h¯\UQ ¹�ÈDF¡´d.=wL2'·m7tí´´i&Ó~ÝÝr¡†Gx„h³Kwö ¨Žƒ ¦¥Cw(A¦�¦ˆyݲ:Šù/Ër¶6—×ÛAv—Ãim¥|2·pÐKÄlAê2­Õ1 ›©n†?ü¶Ìó²˜îl¥RÖ‰ne‘Ìáð¡TÏ +e³–A0R¸Õú}Êéq)ŽÁ°§j%ù¸¾»¾õ2R•U÷}-Ýö±©=õÿU¾vaxçbÿîV³ˆ�ÓþWO�c¯é­÷}Œ!䥨úþ«Ç&JÑ[Áiù’D¤ÍyÈ‹yȬ‡$ó<ÙdèÜKäI"eAs!9VpÊÂJ=uORÜhÎÑyßæˆá‘@ˆ¡D ¬— ˆ Ð36|�# �Fyn™Ú§…ÏH“W„Ÿ?(°Ó ý=WtŒŠ"3"=H²)Ä!YÁ›�‘ñM":#À‹€g…DdºT8f½5Í‘›¢-#™B0f}™£Ù>\ʈ e †HL|Ì㔈¬¯f|ƒÌüudHáÚ]Øi¥a¦©?¡„­tÑNÕ†§Í&ÒnLôG`Î4}»êÓŒ¶–ª) zîÒ�%úWO)Ņ̃F¤n$fÆ@³lÑÍ"ï³Æò(Öð™? ‘9 Éö`&‘Nl&¯„­;°ml+ð’m–c¬ÿI¶ „KWH7Òê'ôIÒM¨¨ƒi:n®–× ¦ûö÷Å÷Tÿ÷×}ÿûÓÂY§ mt0A  Ÿ'’êO- ûIÙf œ3�[}t­]¦•°­aµt¯¤¿£Ko¥¾=»¥{¯ôÒÞí­µâ·ýkõýõ~–÷¿[�õî•¿W[I´Ï´N*ÚÞ­P[]ö×v¡6•¶)ŠÞý/O¶ºµ »Ót•=½/IñUÆ¿qÖÚzo{×vŸ�ÿ¿Òx}ãðìßø¤ßºézŠU¤ÿ¯ÿì=|[ôÜië¡ÒUíô6ú®ûn6‡ý">èû÷á¤?ú-Éþ¸kúü=ý³‰‡þ·ÿt›ÛÇZ÷ÔŽ—úëýÔ/zµ¤’_c®8÷¥,_j<5óÉ3ÿˆÁî¯ìÿãÿ°ÿÿaþ¸·¯ÿí+]­Ò#…t½W÷ëå +áã·âûþ_Kaë߬íþ¿ì?ÿoÿÿïa¿×íþîm0÷ÿü?ÛÿÒHF¿ÿô†ØizUúÕß°ú§´•¿××ý¿ÿoÿÿü7ýþ þNžÄ!¯ÿðÕëþ¿ÿýý‡ïÿ¯·¥è§àŒ<7ý{ÿƒþÿÿÿÿü?ëẠ?¿öÿúú_ÿÿá°ßÚ_ïÌïÁ½-µzA8oÛ_:§ÿÿàßÿÿûÿ·øIXo®ý×ÃÿïéûÿàŠ†ÿ¿Ïï}û}Z„°ÿÕáöÿ_{ÿïÿîýúÿ_×á¿ÿìŒÿÿüÏÿô°÷¸ÿ¥ûw‡ÒÛ¤·uaú_öý?îÿÿÿ¿îÿë®ä v¿½|?ßþ—é]ÿ¥ÿÚM¿Ãþ—÷÷Öí­^ëo×ýõºóË»ÿoýNuýßœë¯û¯ýµû¿×úþ“ÿëÿ¾Û¾÷ë­í·”‹éß\çºþ¿í�4ºt¿¦ÿöÍïöý#ÕûgöõºÒîëI»‡}¤�ÞÕ×û_û¿ýí,“]ûK·ßÝi«'[ë÷M6gÝßíÝZMªö•Ÿ]Úí‚Iª}‚8îõ‘q«">Ý-+¶ÞêÞ 0Ü%YÕoW_·þ‘šß¿_¿m&î›öû[¶öØg¬ÂÒÕ[ =Hƒ‡tél0Im¿V ŽõÒn­;PÈ£¦GÕM6+A¦›°a&ØIÛ5¬1ÐJÓTØ´ÓMB#¡T2~½«¯÷¯¤¬3é»õ»¾öÖí&åofÑ' ­¶Í;b˜»ÓÕ‘Tð¶Ò 4šb Ý;A± †‚´lS¶Å¶‘á£Ã¼0š%«r­†„1 ¡GÚ¤DG2, î�&é?lò°ÃM=[JƒNÛn †GJ›!U»Òd$àŭ—Òw ‰Û &ÐIÐPØ‹ ¦Gµ1A„u„Q[€B4M¯v�na¦ƒ „ïj Ž=�ˆšMwi»V¨2†jBCAE”Îûh+áSž(÷ '"H�ÀЃDÛHt¸ˆŒ¦RÏY$Qôµúà¾Æë¨Möƒ„ÆZ¨ÿùoñj*¢¹)8™Å*„‹5J;a\ÎX@‹rñ +fAl)ÛÇs•v¿éf@âÕNÌå%Y»ÝÔ_ù®; 3²Œ ”Œ•ýë}'ÚáM"YPT©}ïúß*?ڹؘÒwëV²I�¥ÿÞŸÒÚ"‹;´>:ÿ§”‹ÎÕ"Zd�IÚ¬ì^K‰W®½úyW�$GÉ{%Q2DJÈ�6D1rO3Ì'F¸Æxι¶<�3‘ù!£ÑDš=Â5‡Îïȧkú÷®¤Á’èƒ##QMlêœSS„POÉ{8ÑVmH�60Rø$Ã$aÎ ó»4ˆãÖišØø&�Œˆó8ÿ¡x$ìU Õ+IÂ`ØVÔûIÐMõ×Kû:£Z/’ˆŒ°¤u›4Ι«8dJ!¿Ð yšÙØ$\Ñ­™Áº�lÒ çãì&I†k‚O&ë  L0‚m Úp‚m &Òm&Ù`ËA>aØK]Ñ1ÊÀú·i'JTÝ6›jë}2-jF}y¯³Kš"Q‘ØVeÙ¦�¬CÂdŒö�ž#îÂe=g¶ôT4Ÿ‘‡&=&д›DXi8A0Â,ôGaŸa&Õ^‡3i6“ ï×¢N’m-&ÝëïÕGõÞ·]1vÕ¶¼Wä¾lŽ HG2ŒU({\ù™Ù>ÃÑC†xéBA: Ó “Ü™èöÂVË:h)âT›_õh- ¢N’n Ò÷“µÔ'o×Ûô›¦÷Òé¥ý+úmSK~¿qÿmo{�“É„Âf” A „´‚A¿9tº°ñݦZjõižimbÝ[ºXmR}õ¼qK´š_oÕqÿÕ7ÿS ?ê·ëßý +]í¯­µÔŽ–÷­ûE¸.SÄy…i[IÃMéá.“{}?â½6“þ¿{»­%ûÛêG +bÚÒÐßvŸCïÝÕºöÔwEއ[ÿ–8*ø{xýx‹û�÷ot¿ÖüÌñÿ§oÕ>·ÿÝ}뾆¾»t£Ñc‚ÿ‚ÿùc”Oü²kÿ¯Ç¯þ‡öÿ]+Ýn¿Öþ©z·íçé7Þ–…Z^ëÿ�­;¨ô·IÙ'^ZÿŽÃÿÿÛ_¯ÿöÿVëÃÿÃîÓþ ¿×Óâÿïü±ÁCëý-¿ýxØ]¥ÿþßÿÿÒÿÿÿá¿ÉÙÿ·ÿíÿýüW÷ûËþ¯í¥ÐÃÿÿþ·õÓ>6ô¿ÿÿÿÛÿÿü—dwäEÿýþýÜ|ÿð{ÿÿUëûÇÿøû ÿö×ýîyö—ÿÿÿø7ÿÿ¶(/´»ÿûðßéwØzöÿÿëÿÿû¶axlŠ2;ÿÿú¿È„ÿnÿ÷ÿþÿ¿ýú^¿ÿïÖ—[_{ÿÿÿýòÇÿýƒh/ÿÿÒ¯Â^“ˆoJÿýÿÿßûëöý¥½ßïúÓöý?ç7ÿ÷ÿíÿþ>ýÿÞÃ××ýô¾ý¾ÿþ÷ÿuÿ_þ×ý¶üçézÖÙÓõºþ¯ÿÿÿÿOýÒÿÿë½z·öÿÿÿöóŸûw_×íêõßæ�ÿZ÷oß]:]¶“ÿßö×n­¿¿¯½¿ûßö×ÕÍ¥íû{ÿ~•ûf{¯ïûgûvÒ]vI½6êÒäW~dwiZ ´“]Yr�ÿÿwý·ï^ûgOÿ~ý¿´¶ÿ[ëHÏolõ÷°Î[eë¿lú[«.•[›I=xl4بm¶’ ƒM0Ä&Da6‚átƒb­à“i-ÃßÿöÛö×m.þÒ´»³5Õ¯·ÝÖ—vÃý´“Ua›­ŠMXؤ⦚l…­¶“lBmškM4› ¦Ã`Š.¹ÞÐaˆZ"9„|+¤ì,7ÿûlÍ=ÛÖõ·îºU—›¾Eé°öEºa�¢`ÞÒL2žšh9'K¨bM„�†J!…m^¸a›bÑ#a!±•TFVÿFF!Q÷k¯aX`Ž=‘}¤­¤¶šm ­'bb› Bpš°u +Óa5Q 0¦§z8íî""FV�h›B#ôÓNÓMƒ B`ö›H ÛüPB5A‚bg¶P‰ʵ-œ“ý(ñG†(¬mhC0b�ìÈB-Ìt¹$\³‹¯ÿé`¼›Í. +šIÕ+¤œ$ådË8T“Ó„íÇÿ !')…DGFWÍ…–°TUc²˜î‘3ga¦Kfœ§k,ÁTv¨)/…URQŸ÷‚d°B‚R# +dNÓÿÕßù]# l›<ÖŸ¾ï¿¾âþ¶–›}÷|Îïÿ\�DÞÓŽ/úþ½ñå Þ9‘ÿçcBd§ÈÚ/®r5 �̉¢Ü_Òß×üéÊܹ‰s:ŠP*‚P��U +ÃD'B "áÑ>`Ð"÷Õ}oΚd'ÍDE‘åœe ¹³)'¨¬Á! �dãAšf83ÆS£L r%ϳ6G3H&°4l ŸÑí…  ”Œ�Oè«h!µP�ÿfKh�\ž54Î…w^hðDM’ƒàÁxÔ$úeEØjaØG¶g'i„n„ ‡£a¼Ù‡õAQÜœþ“ q¤é6–“¢-´œ*»- [JÐdsJþJ2UD¦ +a¯4ÏŒ dF^(Í‘#6D4a… 38Ú0ƒg “6hðÏ4Fð‘�£csòšØd±>fÕì•´›WD[t|Ò†‚}&ÒÂû´û^éi6“iZºðV—âû÷ ®çpÌÙ ddD³ª"Irr#橃8GŒŸ@Ê#q¦8¸ P�l#ä%jB¦‚aÇFrí¤Ü˜á%|&¤-? trÑD°3Í&éÚ¼*W Òt¸+§IÒô¯è>ãÿ¾¶Öµéi{îÿVˆAø¡ÈŒähˆèæQ‚ „<=ŒÖ}&iž�,ˆôn ›h6©£ÅÚ"»“K“Jé6“h3†‰óA‘Í&à+‰øm¤î)7oÃï¥Õ·Zi×wKoV©ÒÒ÷ï\uT·3OOÿ"Çz5ëk_¿ã~´á¢8a)ž44›VÕÕ´´´›I·Ñ, µmvšzK]-&öé¥mÒÿ]Ööé¿Òô¯zû#¤ïëzQö½ÔŽ|Žm]ÿõY E�õðÿEŒ¢Ê’t›A6Ú·'µu¯uÒ´šÞšué¿ëì}¦é¼Wm'vž¾?R¬¤þû¿¡÷^ëô>û|ŒBÒ”ýÿ-?Ñuõõöÿêé;^íâ·�®–—¶£õúµí¶µõ»»µM½�¥½ÿKÖÿ~X_ë×ÿ¡_ýÿþ¿ÿöÿüê.‡½§iê;¸j¿¥×¿ªÿøðÇþÿ`ÿþZ}«þ—×ÿíõÿúÿ¯ÿ·_ÿÿþCÿðßÿõWíÑc‘fãZû¯ÿCû}l?o}_ÿ_úµýÌÿö×õÿÿÿwÿÿÿÿø$ÿøoÿÇUïâÃ`Ð%ë[¯þ¿ÓUa¯ÿïþ¿·ÿÿþ¾Ø"¯ÿþKïÿþýÿ¿ÿïôÿ‡ÿúÿÿðÛÿÿÿÿÛ”>�=†Ãÿÿ¿ðFþ“õ3¿ÿÿû´¿ÿ/þÿ/ìÿÿ»Òý¿oûïÿÿá°Ãÿÿÿÿ½&Õ2ð: ÿÿÿ'ýýýþñÿöÿý¿´¿÷¾ëøÿßÛúÿÿûíÿÿü6ûþÿûýµè [aÿþ ÿ ¿á�®ßëû÷ ‡ÿúúõoºþÿÿ¿½·ªû~s¯ïÿÿþ ÿï]ÿÿûb¸uúëu4Wþ¿~·÷ï_þÿ÷íëú÷Þ¿_ý­ý·~¿kùÎý³öÙûwÿ×aÞÛþÿÿÿaÃKuõ׺Iÿõýéëoíö÷ý¿oþé³M½³Ewïýý°Ï^Ã=6ÚvŽ8w·}Òy}=†MŠ¿_ÿ»¿ß­ÿ÷þþy×[êßúû~–»ûÕúÛgæ¿Û?/gÕ‚~“ $ÙéX`”Š;ý4ÕSd ö!ZlS!hl]4Ø=6ÐNÅ*lBL0[uÿ]³ªÌ.ï}é½o÷«Në]uí$¯ÿí³öôÝ]êÚR&4ý†[Ié±V˜c’µi¦“˜¤Ø¨NiÒwiÛ†— „a|¨”aÈV–«hªÂ:ãnëþ¶ô®›onÛVÛÿoý÷Ò‘Gw +á&é-úiçEñKA&ÐKi¦ÚL$ÓM6*´Âi†vU…åX Â3°`˜C>4V>V2]Jo£2àݶÕo´»ºÒlúm;ÛA7`Ž;OMƒ/§²)uÃnøMéXK ¤´ÓµqvzL}öÅ4ŒùâO£Ã #±(“Eu„"#VÏ'Ajž’l‡æ•ì… Ã#‹¤ÈCƒÕ;b“NMVØ´Ö2S°ÂR�2®Š¼¬+‚aGV8 ƒDD3ËÁp´¶BÒvž‚L0›Ù0ƒ'aqš#þOœ�3ì4 Óf9�„W?L ƒ9|”ïzD¿®º‘´tD䨠…5 ¤êšM¡|™Ó !¤Ü™Áœh&Ó8GšXU>ÙŽ›IÝÔVÝoÒ}*ý]mutšKÿô›hS÷þl�g5"Õ°é™!:�” Šæö¦g ƒ<¬ÒA„¤|n<Úi£sL“PÕÒ}Ú„EŠ+V¤®LìŽkh3Í]pÒa¢OfØ-'“ŠVÔ&ÖéÛIý¿´¿´›ÒoÜ]ÝÒë^º]Uëÿ¿ÔŽÅh¦{3Núš^� “„h„ÕÕÓ× +Ú ãI¤­lg iž7´´âÚÁ0Ûú¤­¤šK¦ñ¦ÒzkûÇÿUÚÿIÔýkë­|(ë[ãCé6÷ÿ( +_6še¡0×· ¬³¶èmµé-]]tkIZM:Ý;¥úµÿZN¯ûC_í7Û�¤ÛJG ÓÆ×Öûý×ÃIúo÷üHzT‡K_öô‡Mîÿcëõ¾úcøã[ÿí;®ÿéj;»O×êG�w­®Ý×ÿø‚ýâ>?úÿ°ûÿÿõUÿÿöÿûn–©«·¿¿[õ»UïN¤p½qï¨V´¿üˆCãïºoõ}Qùf>½}:ü?ÿÿþë_ÿÿØýÿU»ëÿþõ�ÿÉè±ÈÏüGÿ¿_‚ÿáïÿÿÿþ¿ÿûÿÿûk‚0ÿÿðoÿÛit,7µÿÿaÿýªCþ?¤¿ÿú¯­«ÿÿÿÿÁÿƒÿÿäéÝ„ÿùÓÿÃÿ}ñøw×ÿû ÿßÿõÿü¢Û¯Þœ7ÿÿÿÿáûÿÿÿÿÂñ Awßz_~ÿ¿Ûé†ö¿ÿíþCýëÿÿgÿþ‚wKóªüÿÿûÿý/ÿ[÷ºî¿ÿK]í÷×úßûÿá»ï¯ÿðÛøþÚ_ÿøAÿ„¶Ò¿ ~ýúÿ÷úÿþÿÿ¯ÿúŸo­½÷ªî¹Gÿÿ0» º_ÿþ:ÿ�ÿÛ ß­¥ÿþ—Cú_‡û¯Û÷ýÿUëÛ«óÉÝwïÿ×íví½¿öëÿÛ3_oðþÇÿþ_Üoÿ÷K¿ÿÔ$߯þºÿ×ÝÿÿºMÚßu·_ÿë þõlÍ7}ÝÝÚKik« /áûÅWÿû¥ÿø Ÿ÷÷½_ÿ×^ý|çôÝwº[dèç~ßú÷Ýö}wÂt½&ï^Öà †Ã7Hƒ†Ã +Ã72 öCþÛƒ ¤ƒºÐwlWªíÚÿÿÿõýoûýµïÿý†a7÷Úõ¤ëûkm‚Iæ=[=ëÈ®ªºL0¬v­¤˜a¤ÈƒÐi¦�¶í± ‚v(1A„a„ƒwh6ÙŠåD£ .¯¹×ö¿ÿÎ~¿ÿ ³D¾Ù¢üŸí6ÿþÂ(w!ŽzÛí+I´¹e-´•ŠØ¤±I Ó…¦š a Å2WlŽÃ’m¥Z4Q¡£Ån��˜@ÌœD„ Á©ýw~ÿý¯õwû þÂö­‚ZݰÎ&E°ÍÚz¦�‹m²9=¤Ó¾Òm›A6! ØMÒ„ØZ4e[i¤g£Ã'Ñò2 bƒ�hPGfIɰÐoi>ú9W·§eÖŸiXmS†ÃM6Ø„šÛ�°íŽ Ø¤ÓNý¦¶I»Ê¼«`ØÂ@�„Ž!a‡2RE¸ÔõJ˜6Bõ+v“†š¶)Úm ¾Ói¥Nà ´xa‚Gº<= `š ÙÙZ(3µ¸DDqüyôa ¨¥nT';B"(çgj¨DUúZ“{Ý•"«ë¥ZKKI´¾—]2(å½v’ˆc+V�¶‚Æ­ › '›áñÔòšJŽÍb•Kd²U3–Y‹‘Ù[;æd’ ÿ&ãfWx*­»ûÌ«Šå²(vw£_ÿÝ®v4ÊvÈ-á'÷wzrÜ©Žv�ÿ¤;õåp?%YØÞ¿ëðÿ¿’•úê©§© çL–š�.ûZù1ÒþW…å^¤¦² d¼u2!‘N4D×›#¡vF3øÀóFÃ=ÏÀ��¢ÁÇýuó£"#W’q"œˆdC ÊC$ + Ód!+<ØfŒÍ“£’!šÃ:¦#X3‡'CÃÐîA„l0€³9è^‚mŠÕäǤßÿþÓ)òȧð EÙŸ#4 £0aÃ]ƒØiŸF¶gÁ4l%¯ „kz¨E»» <� °H6“nè='“ +Ï´›KZäùé}P¸«ÿÔèY×)јʦ§H"&†&h# «,‚¸Ý¿O·Zþ—é +[ïï^ù+»ýý¡¯í¿Ôÿ Ñ™™œ™Y?{JšM†O•jÚN“%„vÂ5´˜h‹m–¬‹mt¾PÜS{zVÒ~–kNõûþëmoo÷׸úõýw¥]{øþ¿ÿ~òÇ#.´Xå�—þË:a«|$æ­îÖ•®µ ˆZðWÁ6–“é.ø¾«xè-ýïWÿÝHúý7»Þëí{»î?�HÿÇÿƒÿñëÿ¤Ûè”/I­*m+w¯´žŸ§T÷ÝëÇKþÛªv±}ý®5Ýáý7�ý×úÃÒ_ÿ]kÿaþ—ë¿ç}ý¡KWÒnõÕW]¯÷þëK¥ Ãõ[ÿÿÿÿÑ{%ûþÃõõÿ] 8¿ÿ÷¥ÿÃÿÿÿÖÿ®‡ªÒÞëÑCëýô†¿q×Kßþ^ÿVõÿÿÿý‡ÿÿ·_àŽ=»"÷ÿäæG­/ÿ ÿÿÿãë÷p‚ß×HGÿÿÿü*[Õ*~ÿÿºÿÿÿý¿ü«ÿõÊ7ð‚png¤ÿþ�m¥øïûµÿ«¯§ëmõë½ÿºñ~ÛÊwÿûtÚ)éÿÿþÿ„Ÿ÷K/ÒÛÛAþ–áÿ÷ýÛíÿÿÿüûkÿkÿÿ‚0þXÿ ÚZ_Ìï÷ {ÿÿÿá¿AÃÒü%‡Û þ–‚ÿßêýíëÿÿýÿ¶ßÿ· ÿÿÓ~ ºýþÿ¶-¥�ÿ÷úþÿu¯ýëþ¿ÿþ·ÿž_«ßokÿÿß™Þÿ¥i¶—ÿþ—÷{Å1Zû¥ ‡ÿûû×ï¿¯®si]WÿõM¿ï_êÛÛ4VõÿÿÉ�÷÷¦ÿîøCÿþ©w»îÕ={¤ÿÿ÷ö¿œÿº×þ¿ÿ×lÏ××ôí�gÿÛ^¬ÚÒaœ›Û0l3“i.Ÿm/Â_·ö°Ø~úÿô»íßïk÷úïÿ~Ýï_·^éwÚïØGí—ì‡an»¹ÃO×Mƒ ¶Åi§!m¥"ÖLS±1M„­;ÿþ·ßôþߥûÿúÞÛæŸï^ÿÈ ûþû=æ=´µOKVÒd]A°ä^iéÃm8¦!XÚIݰ�4ÓM;®ØIÚ°U L$UˆA‚!„ b …}êývöý×o¿ïý+¶û³>ú=µÚß~¬éÃ#¤öG”Ãm$ÓNI ÛI¦�„šm'ZµNÈé4žƒHöÑí¢¸£” ˆ£�“mC~×ý[ÞÕº­[?6œ†>¶Ã9^Ùu¥"ŽØiÛ ‘m¤žÐmšpÓNÛ¦“m4é4Ø(VÅhÐåe‘ˆ=²|10Šêyß!IêôÞ¶ŠpíoÛIëb˜ÛNÕŠTã´¡;!{aˆM0{¾ÚJŸéÏhDB ÁWˆˆˆ0„DGzm ¤ îØnsóµM´©Óa2V›U°Â½¨¦ƒ„Á„L1¡è#±#J˜m& +“¬6�„v*ˆ[; e¸éuE7HP}j­b¿Ð¶‚­w²1ÂÚ^�rý«k´­¾×¶•ïŠû¦);ø¸­íöêÛª&3[\”FhÙ"8E.�BF “ižÛ$ üyr$ÏÆ›Mf½¿iª9:zÚ­ ƒ Ýa ÎWI´žœ%ik¤ûéZZ]6–“_·¶–“é^ÿë¿È£”=ÇÇÚ¨Úý«ÃR#@”¡ÌÆp�žCÏFši¦™<˜M/é+H:MÛT­É¡6ƒ8gœ5 Éд-¤µuoV–÷@›Iºi-1L}'±é/ýëõuÝéÔ¸O÷ÿ§�íû_Ý9ÿz·£Fš* Á&SZ¶Ðgq…Aœi7é$ë­ÃÝE¥Ð[l4­¯zýÒë $ÛîØi·/©p‹é z‘¯íuÖôßz¾·ÿè±ÈÄx9iìãý´½UE×JÝéR½êÂm/ŠüVØoú¦íl=ý¿Kq×qÿiÝõ#…‡*¸j?Èæ±÷õÿßúÿÿa× ÿî-½VÚ^Ûïþ4ï¿þ—z°ô¯ÿvÒ¿ÛZõ ’#ž­þß¾,6.¾Ã×HWýÿÒÿÿÿöü7ÿÿáú﫤ûij­?¾ð¾_ºí$Pè6ÚÃÒÃ{}ã±]ûzPáëÃÿõ×ÿßÿÿÿÿ øoÿÿ»Þõ×Ûzøÿþ?°Ç‡ˆ†ú‡ÿ†Õ¾´Õt°×ëÿøl0ÿ à¿àŸÿÿÿÿÿÿ†ï ÿÿöïKÿ_ºÒÿÿ÷VlXøûzÿ¯ÿÿÃaÿ á?è«ÿÿÿÿÿþð÷ÿÿÞÿ×Ý¿ÿÿÿµaï›Mÿíý[„T4ŸïýÿþÃa¿Á½'ÿ ÿëýýÿÿ~þïÿîúÿÿmÿòwû‚0ðÞþ ÿïÿ¯e íÿÿúðáî÷Â_w¥ýÿÿOû×ÿ¿÷÷þßôS·ÿÿ`Š�ÿè/ð‚p}ÛH7ÿ¿^Ý:A/ïïÿý÷wû×w×÷ïúÖïíþüçMæ¯n×ÿº]—M�ÿï¿ÿÿ ¿ÒÛûýÿºß)zwþ¿­{~ü«Në÷~¿jßëÓmöõ÷ûf}¯MŸþ›ïÛ?ߘêÞ0ÿ¿\l{ÿýÒÞÉ„íÿùO÷ûÿÝû¯ëÖÙÓÌ~ßÕë¶ê¿ÛÛûJÒlþÝí¤«¶a]¶îöÁ{Iƒ11¦›¶Åi¶ûï°Ø{ÿþ¿ú»Úäéöÿéë÷×m¿n­z3ô•³ë®˜gûLã´˜gÖ{g¦§‚0îöí³’iè-&)�‘}¤�²=Aª± ƒÛ 1 Á„ƒ™+¦› 5…KßÿºþÿÿÿIs�_M-^N¿´­/z»¶Ï¦þÒîÒNÒì-¥i6 0Á^ö9Sb™{q ´Ó`ö*Ó²:JÒa28PA´í5jÂi„Ä ÂEc P`„el][ö÷Wöÿÿ×þõlÏ¿´¶%ýí®Ù~žÛÛ ¤›¤Èã„»I« 0Òbdp®D &I°MÓHñ· a{r±ÒDr%ñ ##D"#IºjþÖëk»ÿÖEö”ˆ;n› Z[« ŠÓMÐAÐA8®·MŠ 4†ÐM«•ÈD}T“"^:—”dk'!&E™ B0ÍŸ•Dd)úê™’Ök%("PŽ¢”â�#C(G!y!#6H„™Î{ ‘„ #@~pgŒéGÀð�oÜzý5ÎÔבDGˆ…“|Ñ™ä]–�Ñ„üªÁ„l„k øg>høÏÊGhØÂ5´ÂaèØa&<(I†š<4ŸØL$4ƒl³­–…iS²¤GΑ.r:Œ‰æÌè2¹FgàˆC0ÑrÎVQša0™F¸FÇ#Ŧši:L6K$�g�&Ò´Gt´iž7’ ¨¶—þˆÇJß¾•ÓÌ�ò‘â(‹ù³Ê FROÎåˆL0¦4Bt hÖ„Â=°‹°óä�3u'>æ„ ‚ÓDpÑí«,hšm0ƒAS–¿·ÿ^ÿ¥ÿõë¿ÛE=vÑß_’»ÿ¯Â ðnÿ¿A~÷¾—ÿÿ¬ûýC�õ´¿öëWî¿_}µ×îþ­ÿºÛè/ÿýáÿßT»Û}þÿÿÛ®¿÷Whˆ_MÿÞë׺ÿÿ½¶h›S5oÒô¯ü%õß®¾ïýúþÝï¥ÿÿêïû{uýiù:9Úûku¥}×Ýû­¤ÙuapÛ/¶ +ݧŊئßÿíþ¿ýjß~@ÿVÿÿ·ªÿ´í&»U]† \Š;ÓnÝ+K/¦ÚZpÃi­Xm(ìx¦!E‡W÷ëë·}kç=¿ÛÒí½¶þ®ŒÓ}ßömf6ÒzOM�´·´“Ì Š¸&ÓØÃ + 0Ó ‘ÐH&µªzaŠi¦š &÷ÛkooúÛÛKÿ«?ÚÛgÖ•‚0öÏW°Ï+/ZZ« Þšªzr)�M¥N¡4Ùm'¦!xPÂwiB_ ”¡Æò®ˆ!”PCMŒÃzvÍ홥lýö’ÙêËî’r+‡ÚM…d\jÇiD&Ø¥†Á„˜„ÚIêÈ€M;TÓi„Ä#!:'Ê! B !; ŒˆCz°Ié³lT6iXbÚVÂÓ´˜„ÂTØQU†ẠR=ÄCeU&êŸ÷ B§bl&ªwa­4a*‘�(A©UÆ[”9Lå½b,!Á#ÛˆƒDF\ ˆ×QˆŽ–±üâŸî¹f‹ÃÆ£¶…Çÿ)±W)„³;×Y‹Qi™¶vjÊÿvðHˆË9Deò"�Õ_èW +Êܧo|Šÿÿ„E$F²ªävCÂ…×›‹õ»Y‘nJ—I%#5ã#𝾂Ûñ¥O„Z7páúÿüÈ5�uÉ8˜ËçL�›¤•~–þd]cŽ>WQ��£ŒDxèGDGyT*d¾^<3[„˜4BdÀÁpÒ`ÂA†Q„’[_[ÿþR–E#¡¤DDH‰™Šˆœ’ƒá0ÏøpÂÁ„\0 êxÌÙ¤\Â623‚ ù1HØzÞñúa#ØI´›DpÂ=ºÖ>J±ÇÓÈ’&‹$›"v¦‘Ì¢ F°É@ÂO„ ¢.aÃGÊ>Läldòi„Â…Fæ@è&ÒÓ´›P¨ðé„‚m –t쳳ƕ¤é6‚a·¥¿_Ô×�”‘G �'G@¤­ @Ê3cÂ5¿ „n84:V“i6©£Ä!j©6ÒmPM¢-µG°ÕÒm+JNî™y+K}muãÓ¥ii7_I/ò�yìÔ³lꎢ’+EÓ<Èò!<‘òtlŽ �fòF`Â5†hÌÍ0š=‡„­&$¦šzMðÎV“¤ÚN“ &xŹ?j+Ýu[‚ñ}Ò´�/ß…÷í·J›C§ï®=»]R1y y²>Žf˜D%”"p�… $a£[SÙ&“60¨ð†ÓM5d¹ª »tEpÒô´jƒ8GšŸ=|'JÒý-'¯ÛÝ/t›ÛïµJýÅXþÿR8U_ßUçˆÏÂ6§xFÊ?|Hÿ%a¤Ý8JÕÚ„“rhM„ÏÃI¥­¾�Õõo¦½½oÿ]SÇ·wiÜTŽíý­¦Ú^”ŽÿIëé9=ÿ²`Õ7ýNi|%Òo>M|-6¿ºWÚêûx¾®ÒõN¿¥tí:_i_[»ê¾êG Z®ÿÝ}Þ­þý6¼­5ü±¯¶¸ûúB¿ÿü ºMáÝ'ïo½Ò|USûSwÇoû¯÷ßêøÿà¾XätTßûøÃƒzÿÿÒÿÿúöÿÿüØ´ŒÍ/¯ï»õ_ô>ë´ýºøúéÚK÷qøkoþüÒ +úB¾+ÿþ“ ¿ÿõÿÿÿn¿ ?ÿÿûizO¤ÞïZ­þ»�p†°ô[’?ÿÛ¿µØÿúÿÿ¯ÿû ‡ÿÿÿßÿúþÿÿǺ^“ÿ·¯Cùb»X{¦�öºÿ¿°÷ÿÿ5ÿÿÿÿÁ¿ÿÿûÿÿÒ¿ ÿwÿû¯ zþÝuÿ}†“ µ‡ÿõÿù'{ÿ÷ÿÿÿÿþÇÿÿþÿÿö+÷ÿí/û¤±þÿ®¬?ÿVßA¿ýµ¿¯Ð^ÿÿãýÿ·ÿþí÷ÿíÖÿýÿWïûnÿÿ[¿ÿëÃþ}—�¼oÿ÷…_þ“á¿ÿþÿï»ëþ·wúþ½nïýÿ}sOÿ»¯ÿÿÿoðßÿ X{oÿû¯é/}õÿÝýõÿ^÷Ý]é½ûûÿoÿöÍn—¯ÌÈŽrÝÿÿöÿ¤·pðÃ÷øí¯ê«»×ÿ[ÝíÛuÿ[gO1¥·_Õ¶­¶g·éퟯöÏ[eÕÓeýX`¬3mµÓþ-mþ¾Ãßûõßwü¨Úô¾yv¿úÿíšmí¶ëý­Ùÿ«¥´¯´»¦ÏL0¬0GØ"Ÿ°éSV˜¤ã´¢“MˆAŠmž�¿Û÷ÿíÿõUì‰/4ý¿ýºÿþ÷¯û­¿Øa&ÂÙɆrm%×A(b­-vÒ^ÂI†Â ŠbÁº �ƒvì+i‘B)G40 b>¬}}ý×^ç_ý¾¼ç·{ZVÙ¢ý�n“~—~‚m%ûÒØfïMŠc Bb›A&œ;JØM„ +˜a:L6•„ðE¬1†0ƒBW3«)4}‰„W7o÷÷]'ïÿlÏ´¿¦ô»¬Ç`—kjÚRwi[}í¥i¦�„‚ Ї 6 ’´Â b­Jº*ÝÈךðq,A„#²*†î’íûiuVú8ÿa—=(l;I�ªm«¤Õ6Óm&m­´wñ¡„W¢2Œ„­¥}§· +IàÙ Ô°ª› ‹È'ئ˜aÓ`Š* .ѡʤC�¡˜qv˜Üg†A;µ†ØJT•4Âa‹SÙÎU� 0’b„CB;UA±Gû¥d"²O“¢|1X…–å:×üÈ¥ÿô½¿Ó Õ-Úé°Å0œ«c A†±âŠl +4#ùMŠrÚZ�#G-”¦·Q|´‡Š¬W–¿–WFBíI|* ýÞWB;-ŠÄv%ÕS÷qù‘Ydξûוʲ7ýuÿw|r Úßÿßü}iMiI2%ã©y  RœŽß}ó²Åù7B×=‘¤E�‘ ލÙ"Œá“¤BP&j‚ ’0�£8~pgØF°Â62ˆ&ƒûÿ¯æBÌèʨ<Ù”ñ ¦¡ +G@ˆ³"ù‚KŠC">ˆ� $ašEȱ„k�fCL&˜AÁ™ž¼ôL4Ñ�„ûT“i0Â"ÃG¼ìkÿý<¥Dº+k6Èófv›"Fa‚_h�a¢Ü2ˆ j(“F°Ñ±£ô#d#câѰ>Ñ¡¤Üi6“aÃTU‘m¢-·vZvdiµïݤž›‚m¿ÿ�µäæDFŒ‹’”™®Í‘Š33¢†I†sÅ e#`xA¦TÐL4�'>Ð Ú¢Ça`4í ÚVm&éù|Ò ³"-®'¥a'ÛM„ðOÞÚ_ê“«½u)ÖA¢�üé‘!� HHŒòxú8d0‡£c8�N�¢�B5�paQžÍ4äMOÒ}‡£ŽÉæyÕ0I¹.A©5IôVB"ÛCA7N“¤­¦„V’m'復ҿÒé®ëI¶�öÿ¯t·ëöõ½ÞTFft"œÑ€Èd¥8�êOY¤Ãÿÿ–7ï¯ÿ_ÿ_ëÿÍ‹A6éZ ÿWK]/]õÒV´ûw¥®®¿ñm}Ðú‘¿¡íþëýè·* +8pv¯ÿúÐÃaî­ÿþ¿ÿÿûÿú_ÿÚÚÝU.´¼¸N»ÔŽÖ£Žë»­~þ‹‹OÃ_æÓòÊ__ÿ¿ˆ°Ø¿^¬6ÿëÿ¯ïùÑ‘ïÿ'dwíÿþ×ÝHáwÐý/Õqô½>=MßZCÿþ?ïHKM¯ÿa·_ÿÿ†Øÿ•lŽÿ÷ÿýÿýÿÿüoüŒÿ–9øëãíªB5ë˜ÿÝ5õúý/ØkÿýÊ_ÿþ ÿÿÿƒ`ÿÿ _ÿþ¿¥þ¾ýƒ»¯ÿ¤?ã_ékÖºö¾¾õþÚÿþÿÿt›_ÿÿ ßÿ÷öíÿ_¥÷·Kÿú_¿õý>¿ÿÿ¯ÿöÇðŠÅÿ¶Þ¿ï_ÿƒß÷¯_ßÿ†ßëÿûpØ~�{×û×þ¿_î½íëÿÿÿ‘�ÿ(ß0¿æwÿ¥uþÚ ûýïÿöë_ÿë·¶¿®õÞúÝu¯¶Û×úߪû¯ëîݯ¯ÿõô÷„�æ¿÷÷ÛõîüÝýÿxlW÷úîjOý]«y×£Ó÷ÿý¯÷_zwÝ}ÿ¶n¿ÿÝè/ýv·¯{u‹ï Duýþ÷÷ý½ÿ]ù�Ý]é¶É×éím.ÿVÏÌ3éºí=&Áw—¤Wv_MÐZr+´ÓiŒ6‚M4ÿÿ¿¯ï¥ïé~ßêí¿Oÿò1oÿÛ{þßë¶gÝu·Kév“gö%tÝ^“iYÖáÛÃh$Óì$ÈâÄ&�†˜a„“Nšx`£ïþÿÝëß~¯wû}ûÖÿk·ö½ûf‹û:ÏþÙŸö‚M† iZJÚZv‚L6“Å6•¥i ƒi1 4é†aA¯£Ã†MU0ƒµ*Øb¯(Äe^Vr±ˆ�ûý·ýöõöÛ[Vöýµm»�yý³ëû¦› ?lòéÓTؤӴ“b0•„“m$zI± „)‚žU’N!4ŠÉ#hQ÷¤DDfÀEwCý¿ûõnìúîû{ݽõn©Õ†ÞÃOM�5dzR …DZ M0ÈI¾–Õ¥N("á†Å"¹†!"»=蹈hDA„å¸p¯öÏKÙ´Ã96œŠ;a‚8öÂiÁ¶Ó “6ÙŽvØAt›!hµNØ$í©P­lB"&„eW”š°Œªb"?TÕ6)4ä_Ç ¶b 6á„ÈáVK†!ÑÃ2ŽåŒ©,±zÖ¶›«0A“ÀšiÈÆtÄpg\²â#úü–¢¹„*ÿÖ EWKÆ×ZI.kð†Ó±«jšc™p‚.+üDDt1ÿȆDœ¶Q™ʲÍ(Êâ˜P§uÎð�…; ‹Ýro©üw¤WýAÞ¾W(Œ­¨U4­&°Âñò“‘h.£ÿ�™ /ûäñ+kÓAÿ_;¯$õü˜òBS­ü;¨þW¢ýU|ÉÑ:eò"3d<äK¢3®F¥ŸlÔ!<«ÿó·^v>Lkÿ®r5 “G"$3XÉ�Ôè†�³3#ä®*!`ÂL2ˆ h„ £3Ñì#ã=äùí-.z¿£±DvûêÕSR½H哌úÍDHG Ó„NBL�æBu¸i erØF°Ñù„nœ99´Ð& Ý&ÒmQá„{ fÍ¥jêá&ÒÒuÙgßÿÿ%iTèDLÏ#èÂ>Hˆ\„ò"rÁ‘VØ,=Ñx±)¤ „Ø3GèÜÞG ˆá®‚m&Òa¤îá › +®“¤ÃM¶á6“ÕÐ÷ÚM¥¥Ò_×;.ˆ„_:d}rBtÙ�F¢ö@Ò›!“4*ÀˆÂ4O®�Œ¢Mé„н ØzÑ´E€ße¨- ¹hé\œÚ ŽÕ´�t·ä¡w¨¥¤í~Þ+§Š¦ºõõó±´è2@ÔŽódC¤FÆd|ÂB¨„ó@2ŒÁøA£aÒÃÉóJÔ'ÒA¹.M$Ú²dË:a„4­pÑ/zVõ ž7»º¶û}¿ ¤­'T×ö…WñïwiéVíºÒúå"È<ÀÍŒ��3c(Pr˶ò‡„Ñù¦šÃAÒ| ƒi«-­ ­&õI†ƒ<ÙdËBmޒµ¤Üœ%Òz}SÒÚ÷¿êúÐöÜ}E¿ã{Uwþ߇,r/éqñå='•4gi¦˜VäÇ ÃI¶YÃ8a+DvÒm+Ke�6¡øN¶“ê½_¥ûþøÓ´ï|m¥»½ÿ¯úîêÝKŽÝ䕨iUÿ¿L:õúMêƒ8M…LñûŠZûOMÂt­+ß[þ�~¿WWvÒ¯õ·­÷}&ëúúoùb_­qÿñáÿ×ú¶Ã_ÿZúÕ}:]wbô굯ª^¯�èiéuý_ã¿×�ýòˇÿÿÿþÿõÿûÿÿØa¿üÒ|èÈï§½;»õêG þ†ï‘¯յü±ÈÕÿõÛºÿVõýú÷ÿÿÿÿÿÿÿïÿÁ¿¿Az×ÝÿÜ‘Íÿ,r4�䩘…ëÿãÿÿ·ª¯ÿ¯ÿ»ÿÿÿÿÿßÿá¿ÿþýÿ¥ézÿÿHX?è‡ýÿÒý/ÿnSëÿðFÿÝÿÿÿÿýÿÿø~ÿÿÝ·û××ÿÿëð××ÿÿÿÿÿÿ[RDÿþ—ÿ÷ý¯ýÿÿýÿýï}Öî÷{ézÿÿÿðßÿÿÿÿÿßþÝxAþ'þ¼#¿ÿÿëû×z{¿ÿÝ×ý{:ùµ»÷ëzÿÿ÷ðßÿ÷ÿÿß÷ÿÖ“Ò_»Ö¿ÿi7ÿ_î¿¿]­»÷íç>î¿ëoÖ¬�7¿wùûÿÿš/Á¿ïþÿ_ÿ÷¯ÛV85ÿµõý~›ÿ]~ëû×znÉÓ«fÓn’ý¥·ÕÓ`•Ãa§"Žì¿"¸wÿÿÂý¿ïöÿ¿þÝýÿõO_ýkÿ[déoþ¾íÖý³ÿKi6a‚W¶¡ûa.Òaœ›KÓÒA²šM¤Å1 Š„ì8/ÿÿÿýûÝý×þß·þêþ½«këö–ØT¬ý­é7y�/7 #¿`Ö 0ÚLlPcƒÝÅ&Þ¦ÒM;ÈøJØM�‚0ƒ%aL0ƒ´Ð‡ßÿúûgTÿÿ{û¯û÷ûuµaû÷K‘½-ˆIøAÚØIƒØ6!6bA¦Ä,¾’lB `™+N5=à �É  B%KˆB"0Œ„vÿÿõ߯Û'^ÙžÙŸumöÙé†zí†y{dy²ý¥]�«#.ÛA'„Ó°–ÐTšiÄ.ªƒEGâŽ!§A¢ßXF¿ÿþü3Õ¤ÚÛ NÛ 0¶¡êI`õbƒ¦È_§Ië{¤Øí¦´xÂ.e:(R¶ ¸È„#ˆŽ¶Ë´ôý;†È¼*ø;V+MŠb`ÙCÐm„�mí„ÂÑრ+T4{l&bŒ´Œ’¡ô¡ˆVOM5Þ + š[ hñ Â#+˜b¬e”Îþ¡„3»;B Qf’_ŒDDÿ§[TöA–抴S)œ®b1þ@Aª%4¦fCÇaHªËT­ÊXU4i×,ÞÂfEžv*ÈÿòÈ¡£2 ªÿ¿+ú+Î ‚0õ3·Ý÷v‡É…+Ø” +´ÿ[â>>�WÝ!÷s²2Gu¯ý¾¯YÚZÕ5üì $…‘»4ËÈ„™œÂOÿçuvžªžI¢W’Ó#qÔ²) Rq”#…�hØÈyÌ�ÁF8œÏÇ�,%xA}Üì³ÉJý?20jFÉ2FlÈ4ˆ…Rd&M�@ÈœÃ$EÌÍh †�0�„hÙØF¶˜O'“M+BÉàÔ$›Â I¶YÕÿõÕH.G^n5‘�Df‚"l°¨,ç²A›!Ã43ĈO„ÍOÙ'köƒÜp4ü*L�¨ŽO¥¤éZ áêƒ8a&Ñ?jÝ-õ¯¯ýtóqNyЈÐÈžEédFl�&rdN `‹¶IáF³a ã +Ú„ZMáÝnò`tƒrg ãJÒ „œ*°•t¯Å/z}R~ö÷I}^¾Ÿæ¤¤Y2PÓ)3fFE?šF¤¸@Á¢Í”f Ã*Õšg³90‚Í5 ¥#/Â4:mÃI¶¡Iìµ: óIÒa¾Ìr^÷ué¨M¥i^ú_·ú«¥ÓîÓª»{idpºõõÈÂ#<ž>�‘’hñdãÍ3y# HF¼ ÑdöQ0xHÓ‡èôz6ƒÒm]&ÑÝaSø7’ûÿÿúßá/ qëA}7ék%Eÿøÿ¶µ¥ÿëé0ÿÿÛ¯ÿÛÂ8ÿÿÿÿÃÿíÂü%áì%ÿÿú;·ï_Kë¯ûzô?ÿÿ¬_ïÿíÿÿº_÷÷„ÿÿÿþÿ¯daý/wKÿû×I¿}Zö¾¿uëº_ÿÿÿÿþ ÿÿ¶—ýwéíÿõþÿÛkèÉþ¾÷¯_ï×Ý÷þ¿âÿÛ§¯ûuÿÿ¿-ßÿÿaúþ+ûý _ëþÿ¿ú_×’¯ÿ÷®‚m½ÿüÏ‘‰ùŸÿí×û¥ÿÿŸ_ßÿõíÿó¹C_ýÖý}ýëüçÿo^ŸúþÞ¿¯¶gõk¶~¶Óöì"‡ :þß¾ßýß‚(p¿ÿè/{­í®ï~ÿáGöþÒo_ïnµ¿¾ÿ¿lÑZ^È<ÝöúÓgëAöº¦ØJÒTíŠV;aÁØ¿ ~ßÝbßïÐ�÷þº¾÷ÿÿdm;ýÿÿþÚOéûjêßéiæ×u˜V­…m-6Õn¦ÚLUƒ¦©¦�±XJÁm‚M‘Âvšv›¯}þ¬;¿ ÿÿ¯{mý7½mªVN½µþA¿lϾÏýò+‡{vÚV\IšLl]ÚLj›ƒi Ó´ÓN›M‘t ¦“»žðÉð¢8Í|Ô)8GTvSëooßßïÿoþ½¾îô›3öÒÛ?Ý6µnÿaæ=Xa}† -².Ê&›h&G„™+ÂM°•'´¤x�#Qʺ>B?Cg¶È•™,ý_´¿mµ�y¿o[Ò»om³ë1ÚV»K`Á+V)S‘šiÛš ˆA4ÂiµN»%a!4Âj ƒB ƒŒ†“ˆˆÓ)u]o‡ß·MjÃ<›¶žÃ8»lŽ´­¶BVm�´i(&IÅ6C¦¯ÒwvÂG·=Ã�H¬a„ŠÆO0Šæpˆ«ˆë†Ûg4îÓt¶­�´¶ª›!=«xIÚ7†¡J± ‚FÈdÐ{`Áv”2n+/Ö› ‰ÛTà $Ó¦NÂFú(Ä0B!¬¹“e]ý,b  B;AÄDqþ눅}:í/þ–È#t�Ö¶ÒÁ„��¥ØHb#m,1 +V;h,šåA‘6HÄòšUÌ–éLE)…*ˆì3#ÊiKTDUc°G™Þ˜FçÜ´ª‚’ø\ì¥÷¿OòoD[©Ë§ÿ_®íL…󴈌dDÍo‡ëüiñ�)NøS†Ô–5ÿ;%Geü}G¯ì7÷Çì‡ÿÙV²¤¿7ëȲ˜ÿU_!¢¦JPDš ÆHKˆN<ƒFÆQd~ýoâïëú©ÔŠy3¡”ŒO"?,Òeáð®,¹º�‡â_?„k ôkaÞO&šBÉ òR’ÿÿ\äL œdO:²„l²ã:DfÆqìÁŸH„Â˰Ìà�¢gÀÑîç4‘ú¡='d½%¥{J“h&Øa&Õð¡q¤ü˜ôÇüŠæ‘�ŽÐh„¡ʈlÂYF�2O`Ïí… è4~r;iT'ôÚ">L„à ZXT´ÃÒ¶�-oJ“¥mÓ¥ü&Öºÿégeˆ�ÆFó$f̧dK:ämdb4Ð4 £a“Æò=£eí†O‚kE[TaÈá„›KDXyó 6ÐaPA‘ÍYh- +Ñ/n­î¿�7¥é+®õ¥¯“¥ûûÿ šüÁdãH�Y�‘‘ñœö{9AƒGÀÊ4 B žLö?Ù䦙üÓA¢¡™µ´™.¶“„›e¡>íbáB\¤êè'Û÷êŸô·ô�-/M¦úþµ#…×QR8PÚ�{ïõ!ÁjˆˆÁñgÌÓ9ÈA¹GOFë¨O£;'›v´�&Òm6aèŽÚ Ži^êéZXT…†ÚN´•¥¯®ïíêÕ?Im7º§·´?©p”úÝk½ïÖÚKÿ½rE‡ÿùçæOÚ Í+'›é&œuo>z †|[I¶¶·IÕ†“m ›IÖÔTV×ÿ_~Òzô»Ò÷¡í!ö¾ÐÛéßõ¬zêÞ?Ö¢ÝkBUÿÖº[ 'Sæ“¥| –ã¥íë ì}+Þ“´ºö›¡U»^·vºÒÕW¯­ï÷_QÿynI^×ýGýµý‡¿·_Zú†ÿÿé>úû~“Z]ÿïªh5ÛÛoõmÚ}ßîõ_÷Ôkô¿ÿ_ü[ëþ¿__aÿëûuø|‡ÿ·T´·KwKQÒUúûÐÂwëí­Õ¾é ÃHkÿþ—õ{ÿ¯ÿßíÿüÇþ_'{i¯þ/ýÒ¯_]]iih«øûòÜ‘‡é¶úƒ]¿öýƒaÿþ­ÿúò‡×ÿÿÿ¢ŸÿÿøKûÿ@¿ýëíô¿öÂñÔ}Çô’ÿüCl?ý5aëÿþÛÿÿKòÂ8öÒmÿ%×ÿ¶¯__ÿ žýÿKêû±ü•.Ò¿ô‡ZëëëúïîÃõîPúoÿÿà 7ÿþÝ~—„ëÿßá'ÿô­ïöè%¿»¥®Ã÷‡ÛÛºÿé}þ?ÿüÿt›PoÿÿÃÿšnØA~—¥·éþÿ]ŠŠûÿõ×÷ý/¾ÚÛ¿½×ïþü±ßïþá¿ýz ÿÿømîÿôº¼%á.)Šþþõÿ½¯öÿz^üçõû¾ß¶Þ“þÈ!4O�Óùÿêÿ(ÿýý½½Ô>Ý×nÿÿ®–ÿþ×ÿî¿ôÛ_ûÚûú]­6¶}=Ùý³ÑêÒlÿ`Žá¯¬=á}_Û¿_^÷þ¢¢»×ý}Ý»ÿõVï_UÚý¿½I³5¿ýŸûmêÂmý “K‘\>EǨcb¶Òb¢šTÓM¿¥á/Òï×ÿßÝZÉÓ¶õÿ[gU˜ýÿõïmÕÿVÌÿaÚwéXW¤Õ‘|‹Â“YÃJÁ¶4ïÒà· ˜ƒ +“`˜[UÃG9Vç†j-úÿ×ûmý}mç_û­ÿµÿ]»®›¿õ»�Ç}7àƒlÇ"lŠ:µdØ6©ÃH1Té§ +a&›M„N(H÷JˆŽ0�M D¼E�ˆƒv(ƒß_UÕU¾ßít»K×uzºlÑ=zÝ'zV“ ‡úwm¶Èqƒ‘Æ)„ûAšaŠ ¦'tîTL"—#Ô�„kåfP £°F"Ê1_úÚV›{pò{ß]º´¶•=¤È$ÚJ�è+ „ö–“!M4ÕÞà ‘Å„Ó +±ᢸ €¥\¡uF*µmm†Ý† °Ï+¶Î&œ6í² åW¦›h'¦Ä0˜h+µÄ+MÐ�4"2²"2‘,Àª¾Á½ðm½„›pÁ„…°È”zuʲ¹aÇ ÑN‘î„w¢ :+ë¾·PÞí5òD!ÄD hÉä\ +_ì%;„DluÔdG ¿¥¨6<{A è~é#[¬…k Z ¯[®4ÑñÄË…-€Ñ6aÙ¤O…rÕt‰)–¹YËa«p™ØìíªzUü³ªGw.—ú�òܲ-ÄˆŠŒ(_HZwSŽÅ ¦SŒ¾§QœÑ¬7w×2 C¥õ +B®Ì‡#æ•Ó¹Ú5"'ÚÿúW;U¤Ú¶“{™z; +ü˜úMtó¢¿$Ñ ŠA�ÃïçngòAdñû2æ“¥k~}WUÌ¿#¢2RPˆ¡�C‚g™¢:=›FÑ!#6ÑçÈ4ËPx'ÅØaÙˆö°4ÂwÚ;©}Ó„œq½Õÿ\­¢<¤„¦¬)ÔÓ1""r&Ìè2a‘ÙÌŸ!æüÁž©œç€äJçŒþg Â/!ƒdc²8ÝšadÇú¶ž‚m&)RmÛøÞÓ ­~·Wä3 ¨Ò5OD&M‘ E3Ùs!<ðBLÖ`dçá°0�7ÉͦšÐ¶©É�d¹4¨‹ êÛBÂi&½¿W^­a*M ›”ÿ¯·‡VŽÈþ¿"¬•£5„h ‘›"F\P�„l=ä&Ê8M˜KVäÇ«rcÒm“ü˜2g á¤ÚNÂdsW[ Ÿt5¸X'KI¿¥owKÃK¤úÛ]}s‘¬öñH‹ àÍL Ìðå:W\ AÍ3ÑÁ‚A#þ“h4� +MžÁ 8g (i:[ŠNâ“·xN•¥ý4­%o»º_~•»zøÿ×B¤p½ôÞõ:ù3Y’‘s™B:#l§G‘‘ÑD&BØqK~KÆxM3M°“#õû¤êÛZW¤Ã£æ‰ðn“i¶ü']-__Kwëý'ö…ÅL Oß»N¯¿Õ6ÿã¿#uïÿD'‚7gÌ#c4“Fë'äéSÒa0�²0>î•þ’„G`Î5ö‚MéwÝioKzO·´Úôÿ¿ï_^­ÿî¤pª?µ…{§úÖÛµ_ÿ]!×þ·ÂI†¡Kw=B£ÛV™gm¤Þ߬&›]ÿõuO×Ö÷þ-ÿô5ëëëþÿ‘ƒûéþ¿¯_ÿÿÿ¥ïöY×ÒZn“ïN¸ºUúÿŸÒÞºt�SÒÿ_ +Ý`½7V×¥ÿòÇ#±\oÿÒÿÿnÿÿÛT·ÿÿoÿú¾—o¯ø»ûôñ~ûõú__õ¤:¨ëïü´ÿý!_×_ÿõÿÿÑÇ¥ÿþŽïÿü„º ÿõé)-=~þÿú,r(­ì/þ+øè/õþ«ÿý/ÿÿÿþ¿ÿÿöÒÿÿÛúÿýþØE¿þ>—#?_ÿÿü~šÿþ½ÿmÿßÿòuçOÿÿÿÿÿÛKÿ¿Iµ×ÿKíqõþºIÿÿëÿôÿú¶¾‚ÿÿ¯ÿþÿþü/„Ÿÿÿ»ÿ¿ÛKÿ¿Û¨¯ÿÒ÷Hwÿñÿÿÿÿÿ�þÃÞ½.ºýµÿÿÿÿïAz^õÿïÿýñLWî¯Q´Ýê½×i_ÿÿöÒûõïü NÚ_Zëÿ߯ï¿ÿ»ëé}¯ÿÛwû½}­zÿÿ·{×ðF,wÿÿûp¾¿ßý/ß¾â¿ïþÿþý_þÿïÿûß÷Þ�Û¯ÿ^Ï© }´µáz¿ÿÿÜô¿ýUo(WÝ?´ûu×ÿÿÝÿ¯¶—ÿ¶h›õÛ3ÿ¯û¶ÒéÒÓM4á†lm¦ÚI§ÒöïÿÿÐ_ßíÿ®—¤Q½?{}îºþßÿ¹žÚëvžõý—ý†³“f+´Ø`’k"(´šjȃÛI§ ¤ƒNí7tà ¶+¾«·ýÿþ¿ú[�ÿÿÛ××VÕ·oºÒ×lÿ­Ù{M†“ '"¸l‰AÛ"ûI4Ù`¥ ±1LBÓMŠNØU­Øh44„C ÙWŠ*ÙF#+"Žv"#×Ý¿_õý½,ÓµÿÖCÑèmÓtÝÝ0Ót´“µc[d]•I«ÈAì'a0ž™!ÐL&«°Ða5CˆqÕÊÆ Â&Å[ÿÛoîÛÿÙ}·i^¯O‘ ƒlòµmÚ Œ2;!>JÐI­°“M¦´ga„&4Â`„ Ä$PÉh"{}÷g¥ÛîÿNÙ°f¤š¶’§§Û!Þät®GAY¢9J¸ˆ0E©YȮӶ*Ód öA¦šm´©† 4V�¢7*èðå!4S˜aŒB‚º´Âu°ÂTà +ši2­šr®k0i.jtDGÒ†\&â"¯°ÒŠZød&ëZëm—ëJÇ{i}&Ep‚v†Ëq. ˆÇþ@A/)„ˆì– -ºð¡NÅnZºne�6¤¶Ãü#Ã5ÆC$ÿÿ“{Šæ±]RV–ÿý¬˜RÜ¡ªÝ[Xù’ϬïH­Æ¨¾K?õÚ;VŠLG+_®œ+# iÿYKÎË«ß�úRóBRpØa•á;}ãûÖ½­ï¾‡Ç{Ý[úõÇÒ’Gô‡ÿþXŸ÷ÿÒÖ“†šI½&öô›h*Z[P›÷­×þûzVÚ-Å,?a§VÃûîñÝü‡Eç ü?ÿÿÿÿ_ý/õÿÿ I¾’}}½[õu¿ÒÿÔ¸Jt=õ_Òø_ßuÿþ‹r´oÿ–3‹ì?¯ý´µÿÿÿÛÿÿÿ4ßñ­6ª×§ß^ô:û×Þú¾ˆ%=Õ7éxûÃÝ_ÿüXkÿé/~Ãÿÿü/ÿöJ·ÿmÿÿ^ô½T:ú·ê�þ?þ?-=½Òõö÷ÿþÃÿÿðÃðßÿûu‚4ÿÒÿÝ/ÿÿÒð—[Uå¹"Ûï_ë×¥ÿÝ/Åÿì?ÿÿ\7ÿý¾Á¿¿ÿ]/¿û —ÿCõýé÷¯Ço¯×ÿÿûöÑǯÿ�Søoÿÿü7ÿÿàß¿ÿýÖ—ÿÿÿëÿ¯ïþ—ÿ×ÿÿÿúþ›ÿ–ïÂþÿÿûÝïÛûÿ_íëïþú_úMÿ×ÝúÞ½´¿ïÿÿÂ4ïÿ]'þý/Ã×ÿûëÿß¿gû¯ÿÿ÷ÿëúVžßwßõÿc¿_ýÿÿíÓ÷^ßÿ¿¶¿ÿ¹©?ÿþÙÓî¿î¿ß×lÏïVÌû!÷û|†83Õßi_eöùw"Xmÿÿû¿Â_ûýðâµ÷ô¿ôºÿþýºÿ¶É×z_uî·ß^ûi'˜ý†Tîì[lBUOIƒØ¦„ì-¾Ã½÷ýßÿ_ûö÷§¯oÕ|ç]6½ÿíÝ:_®a0Á%lúºîÒÓn^d\Þœ6Å[ 6)?pšr;Øa]ñ ¦˜AÅ„ Ðaÿ¿m/·ý~ÿÿÞ×Û¾ý~ÕëÌ+ûÛ=é6’i÷ƒd?4™ÇjƒM°“¡ Õ­ª†AøAņ ÛDÍŒ¤DDeØ##»»{{ÿ·wúßí™ý¶f¶¶ëï/r á÷u ›I8Ø5MSb¡« $ðƒM¦†h&­ˆH«Ê¶„Ð5+n³xïoÍ3ËvÒµm¼Ç­£Žc²þ› *jÈy‘H»i'vÅ Ø&“VVGI0ÂI°š¾öƒ�Ì©#/Ò&äÛöê¬õ°ÂI«ºR/Xg6C�Ší±x¦*ÕˆIÛPªƒi_p§»N� ŸdgHB AJæd:,ħ]ŠpÅ+ ðÚ „›!+_a0‚:¨DU"CˆÂ2„DGK†(a‚ÐD}à ©XQd)éq¡vSKiu2Nõb5Z§¥câ6£þ@GÒÛ +Ék&PS±ùlW*% Ýt«~YÂ’3±—„ÿ,¢ ŠˆI½ÐOã ã"Ü”ÆKxPºA†úE úwqUAU7¡ S¢0) S�†Ëu¿Õ?áå(:Éþê¦dqÉa4\6dkþ—ä•�Æ´HDtGGB:0E<�‘åêNm;*Ò ÛA¶™§½s#¢: y5F¹R œŽ¢’à„ã: +P!#6G¢0DŒÁ‚>‡²ù 5 a„T#aŽg öØF‘Eà ÷s"híýU'a¸oÝ´ÎÌâ,K›3¨ÈŒÙ�Ѷf)¨PB Ð@¬0AE%ä&B��¨ø5†��B„Õš­¤é:M¥¤Ú«T¶ÊÒõý}½¿ÎÁFˆ“*Ë™¨*ÉaùÁŸÉÍÃD pEFÀÔ ÓP��„l š?PN(i ¬˜ûEcI†–l ›I†ƒ83ŽÃWA6®ºM¤é6‰Ej¾Úú¦kYÛ³Qd1‘êgÌ×"Zß¿°��SM3CXM N ´Ÿ´U´›Dpд›IÂM«i6•¥ÓŽ-¥¤ý¤é=UÂou¼q[þÚ_í¯�ت#¢�¦BÚ"©šDw˜#.ÉóðFä!8ÖDg ˜LŸ½{Û÷IÙ3Œ ¡¤Ú#²<¢|æÕÙiâÚWDá$Ú_õéjëúÚë­-ÓO¾*G Ük¤ßý|„4Èe‘¦ �š„8‰ Á’!g9à9!æh¡™¤˜A˜IµL$Èù\˜áÒAµTGm�[e�-¿ûWitº\&›ÚýG¦ÿo m¤êšŠŽ _üu¡ÐÓoýµðíI¯Ýÿ"LˆAVZ»f˜F€Ì#>Dó@z„l dæ &š;´› +“¨¶Ë!6†“v}¥¦xÕ¤›q›Pð›/Zöüúñè}~ºßÿu#…÷ÔPîÔŽzéѫ˯þúCººÿõÜÓOÕ&5“:oKI†‚wmO˜†Ò»>èB ›u´JO¶¯½kýí{ÿþ¯{¡ÖÓïÿï‘§¿_,r:Áò´_üµ}!ÿÿöýÿSbÙgM„>¤áZK×I×ô¯ßkÕ6‡¯®�^/I·¾¾­¿ìŽWåŽÿöºCÞ­Ö0á¤+¯ÿþÿïì6ÿí×Öä¡o­é:ÚOîú‘ÂÓï¿£]oú,uÿ¾>¿ü|?H{ÿï‡ÿ¿ë°Ãÿÿÿÿøl7ÿû¤Á^›h}÷}/^›QþŸß÷ôXäh¥â¿øëÿÿ_ówaþ¿ÿ[ÿÿ†ÛÿÿÿÿëðpoÿöÂ=ÿ|~µÿýG÷ÿÿúýÿ×ÿýðß丟ÿàßÿÿàØ7ÿýÿþ½¶ÿëê>›ýÿýKÿ¯ÿÿõö×ÿýþëý”D7üñÿÿ ÿÿ÷¸~÷ÿÿ×ÿ÷{½ÿAuÿõõÿÿÿÿÿÁõÿþN¿×üpߨKÿûßûëm'·w~ÿ»Û¶ëþ·wß´½úï_ÿÿÿÿÿÿ„á´ÿøKßô¿ú_ÿø§×ûß»ÿÛo_õìéÑŽ›½ëá—ÿÿÚùÑ‘ßÿÿÿÿÿúOò3ý}uÿKþŸÛKÿÿ8¿[ëzÛ:y�wßþööëû«lϵµlüÝœmªìƒ�õ¶‚ð�ýÿ÷ÿÿߥüú½¿ý~ÿKÔì£ÿ×ÿþÿ¦õí[³5ÿfjÖûVÏí힘g§IIXa'¦éŠcÛI4Øýv!z_~¿ÿÿ¯ßþ¾þ½ÿý/ÿJöïÿîþ»[?éoL3Óan®˜a[·l¾¶Å1±LSi&šØJبdt°“ ‘ÀNÃ+_·_Z2~¾û{ÿíÿÿíúþ›{¯þ»éi}7^Ã9H£ƒ×_lŽîÒdPÚ ŠÐI¶LPb´›IŠdXðÓM¦G ‚ ¾èŽH®(0@ÄB!SâáˆB(ç_KKëïêÿÿÿööÿ_dÙŸÝzûË«ÒM-VÖEÆÅBtÓM4ÂlBá¥HîÐA…¥m¨`˜L‹2.¡˜Mµ+$Œ�ˆˆ‡„"4eèUû×®¿®û¤Ýýí¯Ûgõ³úöƒNØm‚JÚJ�¬7cp˜AXA&ƒ¨„Õ°ªÞ� Ü­T1A…AŠ\Ä!D\¯v—í}%d{¿m6Õ³ýþ­œ­;#ËiȾ*ÃiØ:§aŠA†Ò†šÛM4ÜBAš+@ÑnCõê­Öš +í;#Ò(í66ÐLli¦›¶Ä$Õ6˜I†´Ô¨£Æy°ÁJÆ4îVDDG»Jêƒp‚A¦G6Ób'M‘Âa„ƒÉâÑî� 0DžÔöU•TÈŒ9’T–ßZ\6§óØ‚Fy¨ŒàÐ`ˆ4"„Mª�´¶ +dk‡°ØK²I/I†‚Ä&WEZº 4£ëI¡1ÞÃ!E4iDl‰°a0ȉ²Qÿ”Ö¼,µ¸Œ®;X¹j•@ŽìÍ�—òÊ;ª&ÿ*AðÃþM„Ùà¡}&¶äÂ)y’W+Ã;ÒîÕQÃ~vèí&Rýu“ B¤Öï_¿ª®š‘4v$‰J.—ú�㥷귚d}Hy*ˆ�š€Ê2ñB6Gˆ„FžQa¢>î“ä¥?÷�“D|§Y âi�UŒ�!<öJ‡D„˜9 é†��OÉ£ó 6ši¦š* '“+þHEgõɸ/§” ²$2„p΃Ȉ»%ódpdƒa‚X$'‹˜#@r$ÍŒ#`rs'ÔÐlŸ“úé<˜ô›Ke ZM¥h3‚›a3Æ!·uwøUõRn302‰ƒäøFÆØF†˜Méi„Âhii0ÖÒy4&M»ÉžŠ¶ï, Z[Bº»¢P–÷¨.¿ñÿ®¹Ø¯¦@“œd1šˆ‡Ñ©ÉÑ„G‹u¦“¤ÃÒp¨öÐZM¦p�4›KJÕ¤¶’´›}ñ û¯úZ�B©¥Ó»´ÿÿÉB.´È¶ˆL›"GDx§Œ £#äx‡°yÂ4ÏhO ðA„hfšaÈý0Ô]PgšOËŸK´¯].šÒµÒö—×[ÿÒÒúïxëÿï’ú�ÑtjDx� Ê(..`e“æ öl³„}„ Ñ Ì㑜~ƒH[ÓŰ“xi+e—MÃ8i6ÚM$Ú¶µkîúÛ®î—þÞÝjG +ã_7ûWÿ��~‹riÿÿðø\Òá‚C~.`��‚=†�l#që>tÂ5µT!þm“™hM¦òg óA6g +I¾•½'§K‚µuú}ëÿÈán¿^¶½-ÇÑ#ÿ¿ëþÃüÿø>‚ÒÕ´í&×IÒ´žÃIÐdsDýí5õ¥®ôÚð›]&°� +î—Oû¥ªx»]èxûøÿíú�òÌÿÿ_aþ¿ÿá¾–“ij×i:´•¨ÂIöý$¿í¡ýSvÒÔOQî·ÿ �ÿ-F¾¿õë­ÿÿ¿aþÇÿÿ†úZÚMSIkã÷º[Žû}~«ôñî=i$—^?úCõÿõÿ_ÿÿÿÿÿóIó¢Á¿Â ÿÿÃxÔ\TŽ»C¿­¦¯èÅÿEÁ1Ÿ],uÿÿ‡ÿÿáÁÿþuŸÿÿÿ ×øKÿÿ×J¾G^øþûkú_øö¾¿úûu†ä÷ÿà�ð�ýþ/õÿÿô¼%¿éÿïë—W¡á¢Òõÿëÿõ÷_Oÿaÿ®ßáÿþ—÷¯ûÿzýÿÿýéWï÷¯ÿÿ×ýU‡°ÿÿ¿ÿÿðFßþ_†ÐX7ú_ýééÚ^ú_½×ïë®kÿ×ÿûÎÿü7†üžÿÝ"]þÿ¥ûÿè/âßéý%ýéý÷ë·k¯÷¯þÞ¿~¿Õÿüˆœ7†ýÿú¯ÿÿÒ öþýŸVýÛ]}ÿýºoo[¶Þµî›í¾ïû«Øg+ÆŸéì»I‘Sÿö‚ÃØ íÐKûÿ½Rïnÿ×ð¿úÿÿßßkû¤ßgþü³Ói_eý+¡Ü‰X0G"8l‹a°ô Ób¯TÕ;MˆTØI…¿ýv÷ô¿®ÿÿÿ×ûöÿÿlé×öŸk°ÏT~°F«|Š8iûi0`Š{l0ÛÚL„ÅXIƒ„ÞÁT*i°‚jà ¦§†(ðÉtO Â„¡¿wº[¶ÿ¯¯¯íÿ·Ö­í··úü‚MùÍ5äAÞ·±Kq +¦Ç ÓM6Òo �t ÚLÔ„­hDA„[Ôþýêsò¡~¿Öúûíš-+ÛݳõßàŒ;öœ®“Ma<0š„aSÓAa’»M"±“¤VC�¡‘8DFÞÝí¯Ów_¯kÿÝž»/ÚØ%iH£¶Î]±R-D>5ˆN¶Ãb›Kž3ÆV6"­Ê抭ƒ>©É²•µlÍ7ÙþÂwMž´µ°Žá§ ¶¡°Ó`ؤØÕ0ÅiBmŠNØ&a-µ¦  •7}»a‚L3r±V ÚLUé¦Å:v’}4›A‚M‚¼0TG  `‘ê(á’"†")}ƒ§±AІNì0�a6Gh÷(áT¬tG$V"1ÿ)±ò•éKn"¸[3ÕNr×+ʬ¤DA§÷-E6�aNôj¨=ÿ ×_}÷aü Ÿw¯Û´é;^dQÿ¿2õ¤P±õÿ¾ž’ÿšüâ"2:"HÇ‘�lœSyÌ�ˆñVÿÒùÏ!¢ùŒÙÔˆfjD$ÈBpDPæ0H9¦­ž‚¨Ïb�°‚ 0‚ïgbÉN¦u%TódtDhSù±œGx\<a•y¦A„{ #Y ülFç% V–´G&Ú¤›K~`Žƒ b£|C@ˆ„™ 0�”‘ ÔÂ6KŒñŸ‘°8Œ0‚5¹ïI´ÑQí¥¤Å$Û- ¸A´›' +µßïI]w‹Fä5†Tlsæ‚M¤û&r;i6ÓJ“lŸ…Ip@ÃÒµ@˜m««I[÷M¯þ;zOzêï—Á¤ÃIÐÒmm–„ÚZµi[Ò¥«Óééuþ“{äp‹½Óõ½dp«ýÒÂO'­.’´ž½×ýwo¯½Há]Úz×R8]~ÒZûíÇ×’¢ïMªtÖ*©z—Kë×tù-éW¿ÿãüAtÞø®ð÷ÕºHí¡¨µ‘Â×èkÿ¢%t¤‘¼W¿õôX§ý/Ø®ºÿyc‘T-d“ô†¿ùbšñú÷ÒÿÛ¯_ÿÃðŽ?¯ÿâ½ +úõþÚûv«ÿþP‚({¯ÿÿ†ÿ-µÿÿúÿÿý~ß@Œ?ÿý7mÿ÷øÂ_]ÿ×ðF}ÿÿ¶¾Þê'þÿÐ]¥ïÿûþ–÷Òÿú ¯ïÿÿJô¿ÿôºî½ï߯÷ÿÿÚ_wÿÛ¶8¥úßýU'õêßÏ/U]îÿï~¿¿ÿÿM*ëßúë{u«wëõþÙšmhÿû}´½»ßöý¶¿ëoÿí³?uºlþÞ·V—a8tÚ¶šß®ÿ[ß¿íö÷ÖÒìÿúØEÙö¶^n´…d ûÒÒNÅÝŠc¯i6i·¶gß¶~´ÞÌ/l÷[g.¤W RMŠUNÛÛbBl �"ðH1Â¥`ÂPÈè%´Õdð$«¤ÃI†sM†‘GDàÂL0^4Ó S¦Å5Âà‹É&IÝ®öh1 +ƒ�¡!AˆŠˆŠC†“Ç Š‚v˜„tÛ 4ØU<0Âh5L•l$ˆDQH•Ⱥ£ÄA„JNÓA‚Á©Y!¢Ü¼ý,FŠó„DP‚ˆm}$¾¼%m´°Q†vélC…­±a^S:b1ùdGbœ›Á.ÎÒE³ ¸ÖÎŒ’4ou*Àƒ±¶ +}'xd|L+kWôßíýf•éÖ—_MÕ}:üõ¢Ø+¿¥©Ø¢¼¼KÅ;" KQ+"™ÙL´³!©/$E" ʈc(ÌãFQR÷L– Ð0C-!ª�»_“åZ!‘ÐΑC4Èb‚� dæC¸i¦¡Ba ȵµÂ60��Ñd1 +3µ©IïðýA(_a… +˜EÛ¼øFÆ¡v}A6ªQQIÛ¦Ò´­,²˜Â�hÍ”«;v_ßôvÕB64› +º + I$œ* ÐT•ª£�ïIÒ˜ÛKK dÝLgdÞ[÷ÿǤ’ °ª“„�xG~“iV’VŒô°––ŠˆGŠ]k®ß¥¥¤“¼&}ÿö¿;«þ—*(ï]+KKuÒøK¤µUÒ^’¤´Õ¶–ºéoõ×X¾Lÿ×á%ÂJ•$)iR^–’¨I-%ªJ’ÒÒÇZ^ý--}õÅÇõò³¢5ä}<äF36C’I~�¥ ñ§T’¬ •GU­RJ(U$ºßÕUi'´¿ýJ’ ã^GòNSÁ!ç ˜iC 0ÈhÁŸH„è@Éðƒ0��„¥_¥ªµ¯DqÕXÒKJ=i/¶’ÒT’öý~CŽÔ"ï%C$#‡•b“ŠˆJ9a%â| a!Âs8¹l 0˜#[Òd~˜a5NIÖ¡ Î4{tø‚¬b•Rª¥I%WT“Ö•$»­[õIRI_Iso(&2‘Ÿ2Fl°@ÊŒÙÑáOPo!3�a¦Éà��„kx@ƒh+BÒÒÓt›TxŸIÒ ¨uhmÒ‡¯�„RI*K^’ª§¤¡*KH*_z~°‚ +–ت ‘ᆭ™ÇàA„„ô~hCL<$›Ó °¨ðõI´¶Zi:'ô´µÒoëêÒWëþÓãDÓ¤«T—Ô$«ê.½B ¤—VÒò8ò9->º3°ºÃIÕb�pˆ¶ð“aó +ð’½_¼[Õ'W×ý´µÚûKëWÅúv¾ú‚ ðAU%—/yk¤–G=zzõX%…öý†×KÝa0Û„Þ»Mí×~Òû{­VúioýzM´Ýzõoÿ¿~!i`�*ñ´“È©Òÿ—ö“õCCA?Ò¯ûQª­¦ý=ÝÒRúî(nßÐפG ^ë®ÿ¸ÿïOÿðt ’äuªI«÷ÖCñé%b«ê´Ûû¾‡nÓûèm^Úè}KŒé÷QüGúë×õýoÿ×aù1 Tª‚)ûÒ]/ÒôÇ(pD"ê¿K6½/þÿÿ–9»ðÒHõé}÷ßÛ¯ÿÿ þ½zô©UJ�úÕfÖ"µ®P²…¥«wÿ¢ÆÁßû~?¿ýÿKªÿÿ÷‚8ýÒÿÿðß×ê—ÒSj®ÊQµ¥¥“¯6•%Oê›V×I$¾¿öÿÿ_Ûû÷ü#�ìŸÿÿøIöÒÿÿðô¿(VN³“fž––øK×KKZP•i^’¥ ´´´�5ÿØÿÿÿÿø ŸÂ ÿ¿ÿ/ˆ]ÿ·óN­-%KKK kÞ’ªZI› .«úÒl+a(¨«Gÿƒÿÿß÷_Ú_¥ýÿëª_=Uÿÿ~ÚJá+ u¤ÚV¨5Û TSiTB¨Pí-(¦)… ÒÒÿÃÿÿû¢�ßúþ—º_¿û_…ºÿÿ>ºÚUi:ÃÒ°J!jÛÂ… Šë¨vR; Á0MUìöÿýoÖ“þý}ëÞ¿{Öª¾ëÿþµØ­ŠbE1MB°ªšØ*ª£P Ä& …_ûÿëÞª­·÷¯¶¾Úþýû¥Ö¼ƒû«VÿîêjaS …L +©ì‘Cí. 0Ö"".ÿí�%×ýmõ¥·uþ·f}Þ­íûk¥a‡¶ÚKr/4Óµt³N "S“nƒŠU_÷þ½ÚêÛgõÛ>´µaž¤AÃËÍ‚R ï¶64h+I·Û ¥j i­È¡DRoõlõÕÚö–ÙËK[a…ÕŽÒ +˜b ¶!!0œ&›"dqVÁ8Ys¬#ÙðôaŠ:óÙIΖ_§Óö*ÒU´ôÄ+A&šlBA Ø+#”; &š¦ef{a‚E÷Lˆ¤æ@A¾êôši ÃÅ&š|PA†¢‘\w4Ï’‡=¹]5(AE¹á~ô"ŠÆO¢¸«=°aDF]„#6Hì–÷噌qZºKÿ¥n‚ ÿm+ $þØ`ŠCf W´ÃÆšiŒSM1¦ŠÆdŽ"#ÿå7<È ËiQš ¤ÎYkz+’a0š‘à‘ÚÛ +ªý¼/îïU,ùôÿ;S]SïäÂÊ–·+�–à¯ÿ"þëªu%ÇGw{ùOë뜊¼¼™&ED%9Cœ‚ï:ƒþãëùV‰�S5dLŠC>Σ)Ìù‘Ñ/›‰óq#6X@ÊM¢΃à0�o!a ®~ÇÎôF´DZ�H¨ Rqäâ„BdÀÂ"yš6äIž„h §‚a°2{@™«N“ ƒ‘ÃM'e¡«i\ši}¼rl§³©êÌÐf¼¨#Åp¨„™¬0�l#[Ðôl~˜Fê«É�:Nˆí¢±¤ÃAé6–“t|àœ*¾¡õºé?³#ä§#çS"#HˆˆØÉ4ƒÓ03°X hF€ÍŠqadüŸ›(a¤/¤ÚAÒ ¤Þ“ –pÎPÒÖÚ«K„ÃÒn�+±V÷Ûñzé}S_ºåuDDd¼F£©¼¼k2P� ÖD0�“á(ÌEØa˜FÆ~Ø S‘»G†–Âj_“né6•¥²Ð›]-/Kzt´´½é½ñ]Ué¿{Ý!®£¯çj‰s™O‘ò°ÌÙÐŽ„Rò:#Å8ûÿ¥$05öÿ‡ÿãýB6ƒØa>rs>Qû� ›MÃG¶m'I†“jÚéŸh ØTÃiR\+K]'w}½¥ÔqÕ½ëëýµ#…ûR8UúíGÑþHgÿý_Æÿ®Ãýý$ØI´Ÿp“a&,ñm(i ˜¥Kô“JÿûZõï½uîî(wn»[øú[ÈQ•¢õx?å˜úB¿ªÿß°ÿÿaþÃÿúIZN•¿ÿî—Õ6–®©â¯]=6ûî»ëª¶ÿMÔ‡£†ôßÿ·ú,Ça¤?ûi/ÿúÿÿøoÿ|ï/ÿdq{Iÿ|U?u#…Ýúûû¡k}ýÿzê¿ÿ—X8ÿë×ÿzÿ†ÿýó£#²Èïÿðoÿðÿ¥ÿãCÆ¿´+ÿzñý!†¢¿ïÿúëÿþ“ ‡ÿÿ¶¿øoÿÃxG�ÿ~gú„|ÿׇÿý¿ÒûüŸª?Ö9·ñÿÿ`ÿÿýWÿÿ÷ðØoÿüž~¿ðnÿðöÿÿÂ^×ý×·uë÷ûÿoÐn]j½‡�éú[t¿ÿ·@¿ÿÿþ ÿÿ¥é}øo¿öÝ/¿Þÿ×Kþýû­<¿uí¿÷ªü?ÿü"‡·XoÿÝ �ÿÿ°á¿ÿô¶þîþÚ¾—ÿÛé}û×eGºõ®µ÷ûf{ü7ÿÿ‚[ia»#?ÿöÒA÷úû‡î¿ô¿¦ÿ»þŽ©ïöÿí~õ×û]³5ÕÕ¥ÿW°ÏVC‡˜V¿ß’ó~ ÿÿè-ÐXoIÿÿÅ/ï~¿ëwýý__S�[ûª¤Þ»þÙšoµï?_®é[a;Ý-%Ó´ Õбv6)‹ÿ„íÿßøK¡ß_ÿð‚_ß·_ÿ³¯›O·ÿë÷Mš&ÿs:ýººnþîûa«w"¸r%†Ã¹Úv¡´lB´ƒ -(iÛ*{ &šh0ƒ$“îÒü?ûÿúßzÿÿë÷½×ú[~©o_ýߤØ[¡Ý¤Ã&&ȾÒÕ�K 6›jÅ1Ál*~ MnVL‹¨…޲8AfUÿº_÷ýÿ®“’¾›_ÿôûöÖݵ¶ÏWWKi^ž› †Õ¤Å0c¶“È�¦ÒaÐaV˜a4�†dÃA¡ '•“±Lf\>›¿ó›·ûÿýß·ÿê» âL‡ûvÃ97 ==¬V•¥a°’i¦št×*& ªˆA„ 0ƒ1:•“%tD}<â5)—¿õüíV#¬Üj®>Š‚D$È€’>HÌH3Ð!`äOÈÿÝÊäÿ_9L†Yq�$O˜&n hÖðÎ|ÎA=(bÉsTjòhµ_2Yû2 +DtDyÍFKG“Œê)¬Ñ “(Í‘±p�„g ­è4l š¦!|#CA6Éòa",94ÝRºV–Öõr¼Ú’“!�P¢0ò„i 3 �d~ldï=}¦<#C&Ò|ñ ›I†ƒ<ÕñmXnü´­«í-ÿüíoÉ¢\Û:Œ¥Šufc%9�ADA3@0�Œ"º¸5oMSI‹ 7¤é6†–y›SÄyÛþømm.¼}'Þ·ÖëÅK„Köê¦U#²’%ü3¢62âtˆN hØ~%剞ٜš7V©“i:ºN|*g�&éBI¹8ÿí{¥¨î¾»w¿mêÕôÚíF?ëL¤2]�ÆJŠA9È<5†Q0�€Â6¸3fÁ¦¡Ú"Ã餘h3†“i[�º¶õ½:W¶·®˜Þ){´û×÷¶ÓþÿãߢÇ#¡c‘ŸÃý¶õÿwýJ±¦š7š¤Ü˜õI†ˆá¤éÒm'wPôÜ{é6“¤ÒßN»j—޾­õöµÿøÿ¯ÿÿûñ¡ö¯Ý÷^¿ÕÚž4µ“¸…VÐOŠV“IºÝ{inÖ®¿ñým)+]xðáÐûÿÿÿÿÿì=õðÃÿ¹C×ÿt¼Ÿí­[VÒ¿]ôž›Om|_qV÷ý+Þ‡ úÝó¹Ê:¿°Øj¿úþ–ÿÿþ¬?ÿoýÂMÿûix@¿úVÓj¸×¿mv½ +ÿ[ûi{ê�ÿ,eWHGÿØl?×ÛÁvëÿÿüÒpoÿÁ¿ÿÒÿðE µý‡ÛwÈá]¯ÕþéÖ¿WÿÕÿßÒëÿü†ßýÒñÛKÿÿý‡þýëznŸÿPâ>—ý~ñ¡þ¯Ø5½ÿúÿÿöÔ”ßÿà�Ἀ_ý ’}´¿ÿþßíýþÖ?Û¢(öÿÿî–¿þÃÿÿÿm/ÿÿéÿÿÖ ‡ÂþûøCÿÿÿï¯~D÷þŸÿ_}o~ÿëÿíÿÿÿÿÿÿn’_øKw´¿ô`Zá^¿ÿýsŸÓõíûý·R=™÷y…×ÿÁÿƒÿÿî¿ý¯¼0—þÚþîÿþ_«_ÿÿ×õlÑ6iûuî“_æ7I†› H£¶/ÿ„ ÿü?ÿÿü7UïþÿÛÿ×8³²…Þ¿÷ü7¯ÿï÷ëAX$à 'ë¦Ú[I«I´Ã ž +uûµþÿvë¿Û_ûÿoýÕÞ¯[î›»õÙ„ù {JöËúiúk ‡iCH1LRiÁ„ +¡¦ØJ�m„Ä$zM3TT—þŸKþ½õ·ÿ¯ÝëÛÿoý³5í¥þ•¤Ã=Á¶¾›6­¶�M8®í4ÖÚ¦Hpˆè”Áa +UÑŠ†#=°Ä#µ„“ˆŠÛ­o×Ý|ç½7ºÿÚ^ÛgVý¶zâ°Â§¶“"�Ý¥¤ Á: 4{Nƒ¶*ÑÝ´Q’œN‰Ô¢ÆM‚箽>¿Ý¶­·ií×ÛºêÙôÃä\jÅ4ÉE6*Óm(TÛ“ M9<�m�(çei#¢E”ûÖ¶f¿½µþ®¬ôÃ97í¤škA´vÈ£¦BRÒÛ „Õ†*‘\QÄ hDÉMˆŽâ“ŠÒÛJÒa…äWEæè$ûH6AŠb ô`’iß´Ãa…°‘ëŽMÍ']ÒJÚV‚b�m;JÃI4Ø46¡„ &šG†‚#¡•ru�¼DD6"5¥Õ¤ÅQƒ ,&0§²Ž!J&ÊåHiz´™r‡K * 63Ö­- c£�R¶“iõKd.øWÄ2Ùš`–#ú§CLd³�ùLõ-Q¼í.SG-?AB™*?‚¥ÿ,‚‘Øq_ÿ}Ú“eˆ*§»ŽBs±W«*ÿ÷ÎÔ–v7”¿XGŠiîïëë­/ÿ]4È\u3©�H¨´jÈb脳†skŦ³³þTD¤Î„žr5 +D +i“¤DóAÎ „&x#Àa„h Ævdåá>.dü×ÉîJz•Åqÿ-À²RYØ(‡RÍŒ2|Ù#À0�aÈ� #]düŸU6OÉôë!aNb�MÓî•êË>¿¯‘dt""4ŽˆäFÅ(˜„…9*Ë¡ Œƒeø'i£[P˜I´›“£[I´›we 3†îËOD°7J餭'}/]ú©YΦžlÎ�"‡‘ª Ã$a@ÓF`ѱ„lhÙ3‘±“Á¯¦“ ›D[pÎXAœ4›I¶†ô›I½Þ~ý4߯éûýs»ÍhŽˆˆìñÖDBäJOv¡Ï¢¨4ìŠcšgô› 6…„xj� h&Òéµ&ÑVÂg�-x+„êôé5ß¶¶¶ÿ¾û¿×N¤p«ý¶²36f¡šš!<¯(ƒÁ?<à`‚Ùt=ƒ!£Ñ¦{ æÌôÏJ~FÀÑíé7nËA´›KJÒt˜hŸ1uÒioÛ„Ú]:º§¿ÖÓ¤(}qÓíÿÓãÿ#¯øûýT&±šIé ÓÕQt,+jÚM„õež‚uoKW൵u´Ÿ}ßo *¥oÖï\mtõú¯è±ÈµÿÿÿT†¿ÿu¢8 ÃCe�6ºgˆóKDý¥¥i{«ë¥é>/N©¥®�¥uîÛŒwn¿×ë¢Ü‘ÿŽÿ-'ñÿÿÿõ¿_×ûª6º% I½ö¿Ý]m'Åý!¯¯ý××Vß÷Ñc‘f7¦÷úñÿ_¯ÿ÷ÿÿzÿÁÿiÖÚ_Þ­úñu¯òÇ�j+ÿÿŒ8ÿÿÿ¯ÿÿÿÿÿ“Ïiáÿm{q¿VÓú^êˆqþ‡ÖøýUï¤Ãaÿúÿÿ‚;ÿÿÿÿÿý¶/ý/þ¾‹�ÿƾ¥˜_ëûúÿÿÿÃa¿ü‰¿ÿÿ ?ÿÿÿÿÿ„¶*ÛýØÇÕÿ×üÔ5ÿרÿÿþ ÿèÿÿ¥ýÿúÿ¯ÿë„j¿ëÿ÷ÿÿ××_ÿ%ÙäMá¿ïÿÿþÆÿô¿¾ÿÒÿ¿íëþ¿ÿ­nûÿÿÿÿø#?ý¯ÿ@½‡ÿ¾îÿõÝÃ÷úÿÿþ¿oÿkÿëÿëm·þ¿´~ÿÿþ_Þ7ÿiz ÿÿÿÿoú^–ýíÿ¯íÝûoV·¤ßöìƒû=7¶C»î«eÿÿÿþ—ï¿û¯®ÿß½½ך–c}¿õöû3ÿõöÛ?~Ã=¶•Þc´¬½y{M>6Ç"ÆôÐqUþý×ý+þÿûK×ÿvûnÒÿ]µô·­m×nÛJûYÃM6¹†‘q«ÚLÅi1 bv©Ó[ ’ˆjši%am]ºÿÿmïýõüçÿv­¶Úýémž®®•´¾áÚllRh4Ðm:i†)ˆM'l Ä&©…ƒBÑB!„(çb.v�¦ý×ÿ_»oþïÿ«övÃ<›zO[A&Å:M¤›a$Ó· +›#ˆa'4aR3å[ aR–ЈË�éúª¶gýÕÿ¶Ão[/ì3”Š8w¥š² å ��ˆ!ÐJ�à•† +9�Ä=M i•l¡DÜ6µöÒ°’î–žœŠïM†sd)r�Å&¨'½Ø0“Ka°É@A ÂžÊ³Õ ‚}Q§úôƒA†Iªw ¦5jÔðà  ÐE[ Q\µˆ�Ö•HøH0­!ˆHñ;!Bo´°ºˆEžØA*W`Á( B�åtF©ˆôøÐ~?ËñÙU)‚y*KËhD'ŠÔ¼µŠÙNÔÑÿ¿,ÄGj±\¼a¥™ÅD¿ÿË8‰Uˆ_{ÿÖv¹\B;žRÒ’òá§Úó!¼í\Þh‚fJ—»þÓN>ºõ%°Gº„Öÿÿ óº¯×9Ì«"tá�u#®m{é÷§§ÿ_*HªÅ:#ù‹¼ƒÎ2pÊ„p‰äBd ÁÃØ<`üŽ#ðaÈü(Qüqÿ:ú“ „Jt"Ld�J�há +BEÙ>`�¨P`ò�B Bea0�²2vG &Òm5–†GGM¤ÒMú\s!üÔe@ÈaJ¢!pEâD\TBy°ÅÊê5†íäòa4l#©6„4�'Õa¢,¨3†®Ë@&Òm&ðï‹«ijÝÆ½rSç"DP¤m ÈþiG¶º�ÓK? ˜jœ˜é&Õ´›Iõ‹m&’Ñ?¥¥v¨pN´ô×Zët?iZºWÿ;„B²4Ô“D™šìÙiƒÂ 3LÁ£[Í4ÓGàôƺ AaYg¤LûqIµÂN¾°N´¯ÚN­{·¶ôëûÅÓý{·ÔîÈŒŽÉÑË'äu�H>мŸ0Â<D ‰Ì‘¦äg|ðŒášACz<4� I²u>Ñ´›Òm'WWý+ÿ¼j’ýýë§^‡v�¦÷ÿ]8Koúþ¼‹"ì×)eY’~D™1ÌAPHB4Â@ØP�á��FÀÓ4ªi7'Ì$ÃDwI°ÓL,]R¼]-„“jé6‚u½­--/õm§ÒnÒ÷ßÇ~µý½ßÿükÿ¯þFeÌ(lÓ#SDGG3I3ÑøA2B!šzZÖ™ãÒm¦A´E¶“a7]Å*njûûj“[~­-¥îÓ¯ï_®ûÖÿðÔÿýÿÿÿýÿ÷m-Ë‹NÒmà :l4ÝQ4žYÓ Èæ“…WÛÒßJà›úi/Öë±o¯uK1úÛñ¯ú»_ýWþ¿ÿöÒþ¿ÿúþ#šM Oé{¬+Ztž_ã·ÿîÜkõo{Û_zè}9¯ÑnT€¾µÿûÿðÿÿ×ÿÿß÷¯ÿÿöÒñÂk½´�ozþÜRÞÚ~¶ÒJöÖœ}ë~ï­õÿƵoñÿÿÿÿðÃÂ(ûtÃÿÿÿý´¿»ÿíX…÷7×Ö�¯õßÞûÇÿùc?ïì7µÿõëÿÿÉ{ÿÿÿðø$ÿí ‚ÿ÷ÿ¯ñ ÿ_ÿœpµé}i ÿý7¯ÁïíÒ¿ÿëü?¯ÿÿÿÿÐOÿÿø7¥ÿ²0‹ûÿÿü·¯÷ ¢Ý^Zÿÿÿþßë¥Þÿÿøm°Žõÿì¨d{ÿÿý/ïÿþŸ}ÿ£$þýÿ]~~ÿ¿þ××þ¿ÿuÿûðFÿÿÿøoJÿÿÝýøKÿý×ûWµÿÒUÿ×_ïöÝ/÷© +}ÿÝÿÿKlÿÿðm¿KÿÒÿßûÿï¿û¯¾Ž¾Ú¯úÿßÕ×Ü‚Pã>ÙùµìÇí¤È?´¿ÿýíÂÿü?áå×_ä‹÷ýñcþý/¿µ÷ýU÷ÿuýצõÿdºûjßv–’®Ã¶ËúlS “Š»m+m/ÿÿö=ÿïú[ ×[ÿí}Øuÿÿ÷½}ÿ÷ßût¾Ý6•ž¬#ÿXr á§±² ÕÒ´“´Øw�°˜a$ØA5b†![ÿ®¾»÷ëþþ½/úóËÚý¿×m¾×Û3õìnk¶_½-6Eö•«Ä+ +švÛö˜d¢Wy PJx~�;†¬)…+a�`½û÷þ–ë¿úëïZ·ÿºÿOë·÷{gö÷InÂZiÈá²,&BN(&i&�6G8 aSÿ*&²¦‘VÑU¡aЈˆ �Ì–gýíÿ¯ußœþ¿{K¦û^Û¯´�Tþ¬3rò(îØ¦6ÐV¡Š4ÓiÃÓ G‹R­†!iY Ä a‰ æ_¯¯Û÷_þB“ºíëÕ¥ý:ZM›iÈ®"å´iß}iÛƒN¦Á28±¦Žì0ŒŒ"lþ—]U³ÿݶûÙ m¤›!Ý¥¥pØxm+IˆIÁp­´“M‘i«?lÓ>4VDed´,M}Òém†]‘G±Iªí¦Ú 6­Ž‚Vš ÂˆA„tš aˆÊÈ`œ³E$¿J›J›v 'v�åFÅ`q”b"#Œ¹oöÒÁ:£CÓ(@ÑØ4PÄDF«ôÛbÆdS?ôÃÂa±þº@ÝØÖºÄD}kÛKíŠtp÷EȈ�ü¦DòÜÊ–ÂÃ+Š"ùNˆøSµ¨7 ™ +Æà¬0�gì9j�ÇaPF‰O › _mËAª;QºkAjÃI·£"”Ü&¤¶}GJ’}¼U¹dŸÿ[I +Ú^­ÌŽŽÅÂ'¾çf¨‰!HR§ï2ˆÚ.ŠxÓ5™&G�Ý3±²<{ù’ÒÕ={W)‘£*Œ�CˆñÑ‚PÍ4@Â6‡€âÂ5¿¸0ëÅtó°%eb)ó©�HïX%šG0�gƒñ ç㜠Ã*ãì Â63òaÚa0� „E‡&p�¾Ócë’ÒRDF ˜ BlðG`ÉÛ­›Fhöhº!ÆpAÿii6”Ri6“aQé8WI´ÏiC‚m¥~;~v2)#Q"&ÊÏd�x,ò¯0`��È“<gà�€ÉàƒFÇ‘�›IŒ+jÚ¨Aœ~ºZV“Hœ%´® ›Iö¾½ñ¹Ú_·‘R5š‘6S£„HËÀŽá“æ œÐ #@f™ƒÔ Õ½5I¹8„›“E&Ñ´ƒrÕÑ,KZJÕéa7¤ý«á¥¿ßIÜQr‡nÓ©+OÛ׳°ãHˆÈ�ÉÅ4ƒŒ2!‘Ù:8JkÌF°ÌäG“£ùœ™í4ÂA‘è›MBM¢+†“hröæ“êé6Юê“p�+~�´ž�oßÿ]½¸Æ ¯¾:ÿÿÃê@£Ft¯ÜœBž5äŒ a'Â" ðO��F¹œù“Àš ´Ó'´4h³K Zn3Æ­$êéZ­‹Õÿ¿}½>þíu¯ï»׿è±È队זŸô?°ù�‘Áš™:632>Ñg™ A„]†gý£ó4˜gö¦�6š ›®ƒª°Ñ4´ÏZ'®«­«ûÕ~ý†�}¯t¾…[ëÝmô¯zñýô¿mÐ!ÿ†þ¿õþL&4Û „ú“%AƒaÚ ´›Ý&ÒÒmÀÛ ØW[Q]RxM¤êé>ëÖ—íºº^*G Ýn;]{×�ôþ¿þ¿.°ÿÛ#߯éúÿÿᾈà�+¦y´î+LBÒµ]'[¦ŸmÚïÇ[Úq�ßÕwkúÚ�qÿÇõþÿÿëaÿ±Uç…ýëúÿÿÿ ô ¦Ò龿iþûTñW¯§¡C»znºß___ÿÇÑf7ÿ¯ÿúÿßþ­®ÿýµÿÿÿÿ ÷ßm/kÔŽøÖ­ÿ·Dnë÷ëå§õ¥ÿëû¯úÿëÿÿÿ‚0öë ÿþ?¶‚ÿûÿïðëéëß÷ÿ‘Ì?E¹*-ÿß—X8=_×ÿKÿþõ_ÿüŸÿ�'ÿÿÿÂí °ßúW_èÝû÷ûÿÿÇöÇÿHXНÿûl?ÿõÿÿÿnˆÆ^ÿ??ú ÿÐOÿýépx{þ½¾ÐCÛÿýþNž¿ÿÿü>¿ÿÿa·ÿ‚8ÿÿÿÿÛJþ—þ—ÿ„¿z÷ÿõÑêúºû®÷^û¿Ú×ýÿðßÿÿþ ƒw÷„_ÿ¿¿ÿd`×ý%ÿ„¿m}~×íõUsRwý+«í>ÛþöÌÿáŸûÛI¿·ÿá½ÿÿÿ ýÿÿèà—Þµÿÿõ¯ï^õÿýÚÕþ“í«lƒý»=^¬3×a.Ól$š²-úþN¿ÿü7×ÿÿî߯¥ûûÿ¿ú�ïëÿëî·ÿÚÿúÈ?³êéÿA6“vÃ8›Ù AJ¶¤b“MX¤î�é„¿þÃýÛ¯ývï¿úÿ÷÷ßúJ½õÿúûuÿº]ºIݧȮ †¶ºé¤Ú ƒÙ Fƒ Ú† !G†N�‚:e@Ä(_×øû¾–÷ÿûÿuëû~ß··ÿ]³ö•ýý„w©ÚR. ‘rÚI¨mi¦©°žØ¦)´ÓTƒC íÌ·"þ¿ÿý�W«võþ—gO1Öëÿö¾gûiÙëý�Àl#¶•¥"쥧Òi†Ò}êÛI4â‚hÏGŒç<:jzA„ 8ˆ„0„iÄRÿþÿûimÚÿk¶~ë­´µ°šíÞà +šm‚±I¦š¶Ä' ±VÚ6“éîxaˆL&a†!Ѓì¯qAWA×ÿÿ3WG%A0Ïmž�/¾l0•¥i+h%»ÓM�Ä$í‘Ä0“M;ºì0Pˆãh5=¶‹&nØK —¾ÛÕ¦ÓOM†•¥ØIŠbƒh$í; &Ä&6;a­«OØdð$|ƒ‡`Ѓ(ÁBeË+ÛcÒ]S¶ôø?NÃ"{KB оThŽDttƒ „B‚-ÈþÒ ;T +�«M'íJ†Š©ša„4ÑPB ÁˆÐh›)ÏôÛi ìQÿ[i*F×´¶D!zX7]°JÇáƒN²ÈaB„ÇE¾ªãä R˜Ey�–¹i•Õ`§k0Gàùk*'ÎÆ,ÎôŸ–a,Ub½ �Gºþ¾¤¾¤RA¤ÖµþÒ¿-Ì¢—•Ò¥OüzÇ;¢"XãÈ+"²…·þ—QôÖó¢„ÔÉJSíwÎÃýW%ò;##3:2>AØ  ÍQˆò'á+¾õŽ?©�½�h�šì ‰H¨„™r;"":#ÄŒØì$ 2x h0�q�a 0‚nOɘ¦Ÿü® +‡×RSä™V2 ÈA‘FDU‚Xgà�áÃ8GØGî­ÆzHXh]¤Ú#¶­¥ii0Ò·z‹�‚ øéùÝqÚXÊq�,�)8¨ƒœäQè]`Â4ˆO9Í�”a0��“°š5´‡3’maêí4»,ëež‚mû &á^•®®“ïÈÿ×6É�s"„ ìøÂ43QÁ„~£`plœ÷i„Ò ²Ç¦“am¤ÃAœi:Z«Á7¥þ:OêÞÜtïékxýWL|íj ò!‘}ƒ +²XFHC?—Ô £Ø™W£ã× +®“në¤Û.—ÙtºgŒ ¯’n +Òn~ºã·k·Kÿ¤ï†ÒÔŽzm®¥O+ O*òtl²q’ÄmhÁ�2tr? †˜eiœ�6~ „Ó'Ï쟯3j“Ã8aRt­*Ò÷Å+ßéöŸíÝ]ôºÞÚ}¯[ëß½Ø}¿òIÖ½O9\ƒD�Hì“Ì eD!S9°©áÙÁ¸MOm„� VÔù¤êÛ,ôÎæ·Ú¼*]>¢“é�þ¿ÿîéé7½^õ®÷Þ;tÃÇõü:ÿÐþëò#9" 0x eì„Vp�#Êã?ŸÐ³6uÝ/=iž=[i„®•î‰sI‡oŠWÕ;}ï[z½?~ß_ÞG ÿÿ¯ÿÿ�_Ö¿¿†éÿ_ÿÍŽ“{-vÒ†¯T®ËB´Kƒotœ.*Þ–þëi�6¯éÿ½j­ë[ÐûÝ|1þ$�ÿÿÚ¿«úþÃýzaëÿáÿÿÿþ­²Ò`µ{u[¯LÝ¿ÿ÷o¶žÔ.ûÿÝ{¯ðÅvðÒÿþºÿÿÿ ?öÔ7„qÿÿÿÿøÒnŸmmt¯]Ú}-í§ëm&°·º_ß:�þ�Þ¿×ì?†¾ÃÿÿÿÿÿÈËý¿Í'è ÿýïþïÿëZ­·ß¯ðÿ¾ñÿ¡‡û~ÃHß{¯ÿØk†á¿ÿÿûÿÿ'üôé>ÿýõÿ÷[ýô0ô¯¡ý†»ÁïíÖ¬=×öÿú8õýl‡áÍ{øoÿÿïÿÿÒïÛýxo¥û¯ïþÿÓÿý†ÞÁëü?ØúûÿÛÿýºÿò„ ðØKðÿÿÿþ¾ëé¿Z^þ¿uå_W_Û}­ë[ÿ¦,?ü7û” ׃þ ÿÿ­×÷ûixt¿{ÿÿïÛþÿÖýõõr3õý×Õ'_Û½ºm¿ÿøo6ƒøoðßá-¯†ÿü7ÿûu�ïûªî¿»ÿÿÿõï^»ùκ×ÿÿºó=¾Ð_¶zot›=YßÿðÛjßÃþ‚úíýº÷¿þá°ÿ¿Ý|âëóŸ}ÿ·î¿ißÚV—a;{Ëò á¶_MÒÓM´ƒtž›ÆÚLS¿ÿØ~ƒ}þöÿ]‡ï®¾ïÿ»ÿ¿ç?ûõuöÌÿþÿnöëW]dAÃa‚¦ë¥·†êÎqP¸« 4“Mäc„à *v � Ä `ƒCzÿ݆ÿûß¿ZþïÓþywÿÞÿßïZýX[»¦ÒM´ôÛqÞ›"Ž_VÂKa†‚M6 ÃbNJ +ñöEBa4ÑD„ŠÆQÐ6„d´ÚÿÛïºþÿëÿÙÕzÝ}íÿ«gY¯öÏßv”ˆ8}¥ Ù±ÚLRlŽ!›¦›öÚ +Ö*xsê «`Ä*#�ˆàÂ&ÃA¿ÿ¹ü�w�þüç]zµ·uÓ¥ßVzoïlò½¤Õ6*ÓNÖ ±UR8²(a'P¥]BŠâ¬ù$1Á’Tv— ºÿ¿~¶ÿé»ú´¸‡ÛJÐM¤šÚLTiªl„ž´í0ÂÓV!4Ô¬a„"" d»ºW~Ùþê­&Û9ö¶“v–’ÉåÓd'ºÁXt�¶!‚k•txdè0œìBŠB#­´– 5b´žÒ†ÆšÃºdp•±ÐVí%a ehˆã 24ŒƒB#¥m$Ú[a6)6.EFOˆƒ"4"#ˆŽ">”1 +V0hDG2K«ð±÷I?ëŠu^±…XIBð·A¤ÚE{´"#ò›0ÎÒ)mEy¬ÎAË`ðS³Iý{þ¥ ]dTâ«ÎÞ«–@8&žˆ‚«â9Ø|È …%²×ïþ³(ƒgbÿ´�¿¹oEå¸ë%|Öˆú‘ò:%ÆD’ÅD¤g¦þ¾úù’xÕ‘òÁ"†d|�JK£l$Ø4#?£àeAïÕ¯¯Ç×2�‘ æƒ#Q¼�Fpˆ= ˜Í ƒØD@˜ifr Rl ›e¡„›Dwÿ‹Xÿåq$GI’#Lù”ñ‹ù±” +r/3ÙÈ„ çŒ#`eƒ¼„|eFdæ\Ìá¦4hZ²A#¶“ pÐM¤áBºM¤úÓ ݪ|©#%Ÿ×É)ä¢3gR; FÈàÁYŽ{%2Ïl„�ƒ'ìáG¦­±T­É`T“hh'IÂè3ÍpÒD»M*ÚMÓ­¥ôëi?«µÎí’®v•ÿ#Æ…›<ÀÍyŒñ„{>ÌÙ¦4 ϲÖMÚ¦É�DpEºîƒ8ÒvšI·ÒM¢qKÆN;ÓpŸ¦×§÷­uwq�¥·z~š‘xÌÈC'Ÿ7’èÞk ÐB¨XF°dñƒÂ Ÿ4ŽœU›ûDqÑ&gó&ÂgÛK ˜M¤ÿ ¿õßûÇÓÇýýúwÝ+wŽ·Ñc„¿_Ô…zjSÅ;#dAÄx“�‘œCÔ�g³8 h4:6B ?R>3°•„¹3 Ú|3†*³íÚI‡» ˜m¥tíöÿ‹^–éz[iEíÒM´“Û^×»Óýÿú. “ÿ�v¯ò\Btm¢A¬Ó*Áò'e ø^Ia“É�#ð&&Í{½üBV™æ®“„ij­&xÕ´�Òoá>—ï¤ÿ´ÿ»Z‘ÂÓ÷´ÿôõô•ëÿßÿÿëú¿â¿ëýý …=g¤­[äçm[Òm7 +‰sKßuw«[´¾Ôz÷_½n‡}^›ë¿ýÔŽøßíüvëÇo–+º_]ƒÿÿûÿÿÿýÿúN™²ÏI×Úô�¥mZéµÔ],uÚwõNõz}4¾Ÿ÷ÿmU¿ßùÁ>‹ø?ÿõ×õßÕ‡ÿÿï_ÿÿÿÿôžŸ¥IÒý'Iô­¡ß®þõÿKB­ýô’ýmÿÿê¿ÿHÿaþ­¥êÝm¢�ÿøoÿÿí/ÿÿÿ_þ£�ºC_Ö£ï½ivØß‹ÿ˲èÿŠÿÿÿëÿÿÿþ_ñðF~¾–—þÿÿöÒÿÿÿïÞ¿Nû¨þ=ZÛûŽÁðô¿__ÿOþÚ^lVÿÿÿÿðßå ÿ/öÕÿü?ÿÿãû¯Ýÿný¯×ÿýV«ÿáì?ÿ釶¿]ÿ××_ÿÿÿáÿ mú[h/îµýÿÿþ÷û¿ï~õúÿ¯×÷ÿPÛfÓÿá½ëïÿÿm/_ÿÿÿöÿK‡éqÛû{ÿÿø_Þ¾í~Ûû_ÿúûýÿîÄ0ÿÿ°o´¿þÿö!}Õÿÿßïúïú¿½×çëÿýÿi{f‰¿Û?6}^ð¿ÿä»#¿ûÿò1a¶ÁÿÿßqÿýçOØ}ûû·ù:wýkצßuÛïÛÿûVAÔ}Õm°I°E;Ob˜àÔ64ÿý _”'ë_Ôß~ÿýôÝû×ø_Ý{ÿ¿ÿµ¯ÿþöÏÛM¥w}]‚)Ýúi­¶ºa´i±Aƒ¥A°A¦®ˆä¾þü%ø^ÿÿ÷·wý¾ß_ßïÿÿºÿöý[3ÿ´–ûÚȃ·a„[p“c´�lši­Úwi­ÉkÍ£k0<œ!®6@�h„‚~N†r~kaG¶g&��£c ©ÉmSe�JÒutE¶“Z"I°ƒ#·zJý[D¡:é]ºcÜ!äÏ;ý|”5%™£:Ôˆ„PÌd½š œób›Ó'ôn¨LžI·vÓ´›WWCI´ ]PPÓ>ñJÒÒà­&ßuá;ÿ½%m¾õ#…ú§© DY´_O9ˆ‹ŒœeÙ)×� ž‡€h0�Â5†_?³ÌXF¶ioLŸ†pÂéCAœ5A7,÷I¤›¡K“ŠV­«ªïºZOûï÷¦ã·UëÿêG ÷ï×ÏgTa"(CÖ PDZÏ; �@Â5†hfl#ãÖÕQçü ˜l¦y™´›IŠIµtN»M;µNºOMª´þ­.š^>»BêG O¡ými_èVÞ£·«oþ>Á¤<—D|ŒdAä'I4s!æHFäDè a(4Í\2Œ`�Œ#s3ð‚wÁL?IÒÑÒÒt˜t«}iRÞ+®¿[kNþ­6éáÆ?ÚR8Zmßßà—þXÏ}u_ú^Ãø+i Ê ƒÊ2�†­ä|Ò 0Õ0A É�³í-–!8Iºm&ÕÕ塺M»«¥ ›W±§v×WTõÒßm[ÿ} Ý×ý8(cü•èšµþ¯ÿÞ’¶¿ÿûA:\hŠï +t·ªÚ óÝ¡ÛWuÒu~ñÅööþÇÚÒõ¿iúÿ[®·úí/ù3ÿBÃô‡_××ÿý]>úÿÿí  A½RnŸÒºÔK×é&•{ëK«ßí_ÇíeP5ÇöÖÿþcëýXkÿÿÿ‚)ÿÿŠÿÿþúí;OºÒÿ·O~ÿÖ�¨¡ßú·ðÇõáÕÿÿÐí§ºÿ_ÿý‡ÿÿÿêÿÿûtê�m¥ýø{õ÷ßÐ׺ïßXøëRëÿì?ë‡ÿÿ¥L?ÿôS×ÿÿÿpæ©ÿÿþü ¿ÿÿ[¥áÿûûüow}Ô§øÿ­0lõü?ý‡ÿú·XoÉÓûi6®—ÿÿûØ6—ÿ÷ÿz_ºÿìS -§¯ûý¿O÷úÿ~Ãýuý¶ÿÿ ÿá¿ÿÉ÷t¬7zÿ�Wÿß]ÿî—·¯¿ïë÷×ý¯ÿ©Ïúíïô¾¿°ÿÿöÃÿƒø7ÿú[iaý/ÛlqÿÿÖÝ/Û¯¿îÿ÷¯Ûß×zÿlÑ7ôÙûÿÿ„qÿþüŸ}ÿÃÿ¶{ÿßÿð—Žþ—÷ ‡ÿz÷ÿ�Wýÿÿ¶ß®¶•ûfiv¯sói-—»a‚Ùq-&)9È÷ÿà‚ÿÿ/%ÿíÃßáÒþ÷ºÿü%ozÿ¿ÿõ·ß·}§¶i¶—¶gý¶}7ß{®cöÂõÁ†ûm+ˆZlBdqb˜IÐ/ÿí/ÿßô½/¼;ÿ×ëÿ»ÿúõš–þ¾ûÿ¶hµÛ3Wûgþ°Ž>Û :IÛ *§"`Øá†×  ˜­6)õ § 0�M¥Gˆ`ƒB59Xá/®¿KöëßõõíïÿoóÉÿÛÏ.×ÿûm{ûüþ×÷°ÂÚ 6Âåæq-Š´¡¶›ÚI¦Äi°ƒ ‘Æ»M†‚aÆQ†눈퇄dd÷®¿zþ¾ÿëêݹ©fÓ_ékÖ¿zï_ÿÈ?»¦ûoÚ¾­4á± +ÒMŠb#Šm21õ¦ Ä)VÑW(3¢•phEu>„i}uyå߯û·k¯~ÚÝÚVþÚwM¤�¦¼8l6CãIŽÝ;~š´× (…<0Âi„Á"¹ƒ›¬/¯ë÷¯¶¿uýÝÛpÛaÛMÖ_OxL>êÛM6 ÛI´”-¦›O°›&GG†Šv4WQË*Ÿ[ôº½‡h6ËýÒÞ”;NÛƒ¶Ù™sÌ…ö°“i†ÂPÞÒý6êÄ1 +}ŽèQÎɱˆir+‡iZ Sa›V¡ÐVœ4›M]ÚðaÃ8¶4QJ¶Ä Ñ\}RÂì¹aSLÓMC « eE†-ˆƒDÜË|l j!QGkHEhíeu˜¼GI.¿iQûj¨?†Bmil ÕDwtÂqEÎÈÉ›”Ôã!L*Â’¹=å¯8›k=ýKX +v[~ÓòʤŠãoø�ɸÖFŒ&¿�ð �+mÝËp<¥þC\ŠæÙ�¦©o¸äWUβèÖd°ð@ÍC!Ë:„0ÂÑ/–›¨ÿª‘$™ŒÙ¨�LŽ”¢#ä]#ƒ$f •‘W™Á„k Î ¥ã¯ÿs°¤V2þv\ލÑFÑ2O6gQ mž{/ÂeŒ!Ã0�� ‡ ÌÞ-J ’ãxjˆíé:%Íù¸¿ý5¤v/ê«•Ìó[$™ E8¹²DI�� y1†°ÎxÂ450�ÌžOC'4™1èŽ=µ 4œ$ØTKƒIö’ÂÂë_[ô#ë¯yÈÔ2H2@ÍqÙZ6Aîáže8gŒô�|&¨Üú?$Û%ˆ0’l ÎM ÈæË9'¥«B‚a¶•¥××k¯ßO¥Ó¯Kó¸ü‰%ÎF³!FC"P޲g""uGÆU™óøÂ63H& „ÂM×%Á4¡'¹í²Ð›i¥I¶ŸK„Ý6“OOëÕi7ê›»]ij`G­ú㎦J¨ì#ú"sƒ# ñH�"à2aa0��B=³Hkà� $ÛºN“ 3Æ}¤îÓ½.8î“oé{þµ¶‡Å-öŸôž?Üäâÿ�ëýHiš‘R26gC#³C#Ç2vO—#Ùì …läa'‚iú<4l&ˆí¤ì´\"-Ùi Cz½ÔRÑ(×®é?þßÝב¶ÚUoþ­ú,r5ÿHGýþlˆL܈”*‡°ÂæRGðr® ¦°4 Â7aÚêÝ<�¤Ú#°Ï¹hbéZ M®épM»í­¿öâí=·Ouëêëþ?Óoãÿõªãþ¯ÿÿù±~ƒ4’à“L#ŽÂ=´›_Dp ãIµëw29¥kµºMÂw}ûÿßÿRá>Ðëö¾›×¿é¶ëž½¿ýÿúÿî¿ðGÿø3�Rv‚¦ 6ÒµQ@šm+KQøMv—ãßýZ»ß_ý<rÇm{Þÿ×KMWÿõò�ÿÿÊ-´¿ð‚ñð›Ô~¿¿v¿K¿qU_i&Úúþñ÷ÿE‹x4XÏëÓz[ÿn½¹CëÿüèËß_ÿßø@�Ð_øKÿÿÞîÖ¤}^ýÔŽ»÷Ò¯ÿïôX¯àÿÿÿaÿêߢ‡~ÿõý&Ô¤Ÿÿø_�¿ÿþ¾7þ—ÿéÞÿÞ5{ÿ’O‡úC¿«ÿÿû_ÿý¿ü‡é6“Öÿÿ·_/ÿð—ÿßÿúXÿúûþÿôX¶ô…XëÿÿÿøoÿÿÁ¿ü$øû®ÿn¾÷I/«¯Òÿþ›ïÿSí¿õÿÿìÿíÿì?ÿÿÿÿðÞ£ÿÿ†ÿôÃÖëî¡ï)}ÿÿW_oýÿÿnÿí¿ÿ°ÿÁxoÿÿÿÿü>‚ÿÿðÿú^Å0÷ÿß·zúmUÿî›Ûý~CÌÿûaÃí°E?þÿƒà�`ÿÿÿÿÿíëÿýûßþ¯ùåþÚÖßZêõýßwí¥wg/NäW ¶)4Ó ·„Õ‘¿þü?ýmÿÿëÿ÷ûéþþyoþ¾×¯öé{gÓ½½¥i-—¹v�‘åOm&6)4õa;l%[é«°ãÿ ÿ÷¿ö–ÿÝþßÿïûÿÿ÷ëWÿ¯´·_˜Û§» \;ÐA´�q 6¦Ä$ôÛH2Vƒ •ri¢1“²HŽÉC÷ÿýÿuß÷úÿûüçWiýÞ­™ö­«gﵑ ß»I;ŠmI†)êžÈäa+i, è¬a¢f̦œGþÿûÿ÷©åßݯºÿ~ÙŸûi®mf;Øa&ÈõÝ1I¦š ‚êšMŠL& bЏaˆÂ„nWóËÿï9ÿ¶h»ºý¶ÿm/òúí‚^ŸL0ÚiȪ„Ób¢»a'*Ú¤™ +¿_®¹ÈÔ3¬]FD y0AÑD'X4BL¤̃;¿¹oZ*Kò´—*Ñ*†H"@É%qˆ†Œ!24| ¡—Ñð2ˆ&�aä›T· žMáB ´Go»•Ò’iåqTTãYÉJ�H�ŠˆN˜3ðMY¬G°Â5°�� ˜a5ô{a&Òc 0Ѱ“êé6Ì…n*“h&ï��eKMW)#°¡I“ŠO›#¨„Æ`ak #d#cÌÚhü�èÎÐL4Õ&ÕÐN“i6¡Ù‘éµj›„ÿî•ëÿms!O×LÈB Òš™*D¹yÌÆˆJ¨!2`d†GÈFÀÑí¦ƒÜÕ5H6“¤ÃÕØI°¬´EÒut�-E+VÿõºÕöÒüU¾½Òozú•U‘O$Ññ-gÌè0DPÚ!&h —ó3A‰ŠÂ6ôÐM¤ÚM„´E†“h3†}¤ÚZWã¾ëxi'¯UIñ÷V×JÚëÚ¯ÿÿ•*4D9B-F¤,�" €¶] •yœh0�møÜq˜aÚ  ›d¹0¤Ð›e�ŸiCZI÷‚ ¯Oö“ÿº¦ÿqШýäp½µýþ?ïþ¯ò“"fC2‚#B®l³ì\Ï�%„k #ôÒTæ‘ì …¹1ê-¨G¶¨ŽØGÆ“¤ÒVÌ@A¾•mßt›ý'Åi/{ Öé7è{Zú ‡ÐðÒ˜s‹ÿõVý_[ÿÿ‘� eƒWø#['Ïa>‡dñë·U&€ƒiiCÒµºí°°¯]i+ÖßÕ7ÿ~Ÿ#˜[¡­«BŸý.C”÷–9?ËU`ñÿûn¿ÿÿÿøBÐÕ´�' Z¿bI¾VôÒ·b—¥i4é?½;×úêý<{ii_ë5ynq/«ú-Kô?ÿíÿÿúÿ“ßþt¿ÿÉsDâ·Ž)^/¶¿]þ·ëú�ôûÿÓ©/VÚÒ!ÏÿÿÆ¿�ÿÿþ¿þÿûi¤ÿú ÿý7´º¯^žUnº{_R8ZÇ}ÿùC–¢¿\±ŽÒÕÿI‡K¿ÿ¯ÿÿþKîÿþ�þ_õ„¿uû¾(wj·úÖ—ë­ÃÇÙNzuÿþÕ!w^µÿÿ àŒ?ÿÿÿïÿð‚Ãÿý ×¥ûkÿßúmà®-ÿC¤�õ×´„ÿõÿû¯nPúÿü7„ÿÿÿÿÿö–öëþÚ¥kÿýi×ÿ—XpÒƒÿ×m}Øúÿø+×ÿþ“kÿöÒõÿÖûÿßïuÝî¿úMëÕ}Öõ÷Kÿ¤ÃoaÿQý~ÿÁÿ¢®Ú_í¯m®—ÿíéþûïëïÞ§>ÝÛ[6­_n»vö×^þÛ ÿÌïoü7ÿ„ ÿü%È´õþÅn¿»Þ½_÷WßíÿÞßmÓf®ë¿t™ú_ áé¶“"ØmÃM´wúÃ`ÞþûõíCß~—ÿésiÝX}°þÿìíOv×Õ¿Ý_oöÌõ¿lý¶°P@´›9&é&ȹM¸Vh$Óqp©¶”&·¶FEØl=‡ÿÛ¸¿½ëÿúé7Ýwï½~Þ•ëuf÷L>ÏG}„¼¾»›•‡i1Ni\(i†ÈúÜh}4äü«a“¬!Áõðîïÿ¾ûÓß~«ÿú¯n¾Û×ifjé³ÔCÒl$ž˜m(Ø­4Ó BA±H4à 0ÁU1L&Ãް0‰=‹GD£+ª†÷îï¿÷¶ßÚ‘‹}ÛÿÿþA&Ìþé­³êœÍÙ}Õ²þ›`­¨b¤q°�b§m¤C  Ÿ†EÅ¢ˆŸ­ ¸ˆˆî>®Î«6»5/öûÞÞ—¾Û¿ÿûaÛà 6_tµcûb›AE'aˆQ „Âj!ç†i†N@`Œ–’ývï]µïÛÛn¶×Ã<›²= ´ÓM=8„ÛlT0ÃJ­„ÓNÓšG¶Š¸`�„"3XDÝkZémž´®›=]eåÛ9'l3dsh&Ïl‡æÈS�³žÖõO®{†AˆEQ‹–æ!úé+uÓa&!&›–Ø„ÕÒ†!‚ÃA h�£±¡ˆˆ¾“a- ¡°›# ‚l$& +®V�™>NÔX„[æõ¥ihŽE>!ˆ¡FZbºâ ˆßñê°gn�|SÚIô™ç$Vx(cC^ƒGòšSr˜RˆÔîΣ´9jš#±\¯l*•F“KÁILý'ÞZB­%]Þ±he•S;JÉœ¾ïâ§ehdÜR)PPP»ïäbõ•ÇŒ‹R™Ë»¾þLí?L˜EDVÇ +I$ÿü–ë�þ™ ˆ³>gA¢ ‚ g€ÉÙ‘­ÿÿw;O뙞B††3Y¢'L +H�äk‰æ°Ê"äz4G·Ÿ‘¸5Aé„ß&=>ôó‘¬È(É5²®$#„JSæ‘søä'ž¤ÝôÒlŒ“ðäâ“ =ÙÒyh¤Ú óijý?úæUŒœf³£c!‹šfÉ�#aÓ—äæ|a4‚�͆ „ošV†“É¡6ˆ°ÒyhgÍaS Фں µÝvé±×™E_�ù ¦j<–Œˆ4BtÀÉØF¶i˜FÇ¡|Ší&÷WI°†îƒ8iiZ#»«Á:[î·Öé6лº^é[ú‘Âí:dQGX�©V2@¥9"ŒÙ`�¢gÇœø#`eAý£sH6•¢;pgMáàÙh/é[½ +W'wá:º\&±Ò÷ÿu#äq]ßÿ®½Õ÷~FZ¾v2"™+b�š’ã3Œ'Øgˆû™ŽáÃGÀÉäÓBð‚ á&ö´˜hŽÛ- ûI´´´Âm+Ü;í­ú�¿Z‘¸ß[ZO×Çþ­»øÿWúC;�h¾S´E¬„éÃ!ŠDóAšØI†HGòù,Ó®jžoÒm-&Ò  Î0��àô­™ +÷ªnþ–¯í~¿W×ڑ¿î¿ðñýñÿ¯ýëù˜Á’#y#00�‚L3MŸ„Ñù�zà39Òd¿j“¥…WAœ=-ÚI´�'[Jü?ßßêôý>´5ï¼{¿èu÷ÈÏÿ¯‡¯zþ—ÿÿ¯ÿý ¥ EŽÒmÛeƒ-vÂL0¨–õi:Mªº¾£ ¿Þ—ô�&ÚwïR8]HávémÿÐÔwþXæÓ·ü°.Á¤?ÿ¥Ã×÷ÿÿÿðŒ?ÿþˆì3Í Ú%�ºM ¯à¿é§]iWÅ/·}/XÒÔ}ý§ããõ¯ÿ–9¶¿ô‡ÿÿoÿÿÃxE?ÿÿÿÿÂÿëøNé];ktïÓªÝ{ÿk½íõô‹½+íè´ôXÏ[ý¿_ÿÿ°ÿÿü7„¿ÿÿÿÿ„¿¿~ý^ÛµÆÿö…;O�ê“ï‡øí®5õÿÿûj¿ÿ¨_ÿÿÿÿÿï ëþ¿ßýÿé×ïiô¿×uþXäa?_ã°ÿaþ½W¯ÿÿÿ_ÿøG�ÿÿÿ‡¿þÿ„¿¿÷ÿëÿ_uþÿï_-?ßñÿõK‡û{êÞ¿ÿÿÿ¶¿ÿÝ„¿¾ÿÿ÷ÿßýÿïýµÿ_î¿l¤_Öÿÿþ¿÷ü7ûðF~¿ÿÿÿøÿÿéÿ×÷ïÿ÷ÞP½Wïý¿÷¯ýouµ?gÛg£Òÿÿûÿÿö—†ÿü ¾®ÿÿÿïÞ¿ýµÿß×÷óßûí÷_û÷öÿm%[YÃËɶ’ݧ± ÿÿÿÿßùBÃ`‚¼7~ý-†?Ýÿõßì;_þÿúïëû¿Û']§íÛ~“v~û/Úl%Úi¶”4Ó¶�ˆI°h+WV˜Tÿþÿÿÿû¸…áÿ}t½ýúÿ÷ßÞ¿öÛ×ý¿[öÌûO¦%·é°ÁX2:#¥¾ÁÓVa¦˜bj©†Á:YÎTIöv¥[ Bqßþ¿ÿÿÿôm{þý~ößm¯ú÷w½¯ÿ™¦ÏØA¯{ Ü� ¤\{ÈAöb�pzi°f °‚iÚNÝ„Ò*ò±ƒFPØ„d4«ûkýÿýÿ¥¥yåßœÿõÛ½·¯í-³?lü´õÛeå¶lTŽ)¦˜A±IÚM&› ‚Ø„ÂÝ©VÉðЃF‰¹®¿ÿ÷ÿöÿý[úoÛ­/½³ûvÙþÒ_é[›/°Á+ÛI5ˆV›ƒ „Òió<0‘]ˆA…*؈ˆ0‹)j¯ï_ßÿÿö¬ƒû?ö“kzV•È£¶¡‚L„ÆI5O &Ä(¦!+LRvÐNÃ[Y39]¶—퟾ïØg+µäW ¶ *v¬kii,'ØTÂm.îBxa„ÂÕa„kEºT’[^×Oa„´äTàíX¥TÓ‚íˆI°Òd¯lTBGw ð ˆ@„Fm‹Dq¦˜mš¦Ä$Óa4ØV�xe ÃE9ƒ +VC DA….Áˆâ#׿ BGŠ*°Á„°¤3!dâ"#�;)CE}uâ+]z~µÎÆÌ'¿“¤\;céâ6Óìc*ØŒGü€À:S Îé�Îå«®�éü´èa5#OþYšGv¥M¿´W-ø#ÄìcI¯ó!¤w¢Åy\ͼ®K¢KÕßÃY×Ílêù�^r;5`·j=9O�¨ÓUÎÉ£¾eFGGÑäPDN3˲tlh‰@D| \ÈÀ7 ™ºëiNÁUS¬¦½<äj‰ð@É�Œì 4Iñà3H¹‚a'M< Aš‹È8÷}é¬ì±ÈçÿüzõÒÿºöí-‡¢‡j¾Ãÿþ�¸H[MRmÚ"Ãìû&Òu·Ãz[ô×ã¾ûx¯ýkýý«Ö¯ÿ,rÂñXt?ÿ¥ÿÿÿúþŠƒm«Ñ"áÿÿWIÕÒ†· ý¿ýFžÿ§O¦Ò·î=¶Ÿ�ì÷]êþ¯×¡þºØÿÿÿç[ÿöëÛWKÓª ô¿ÿâ¾KU¦ÿTÒÿn«×B­ßoí8/ýä‚Xÿ_ÿÿÿÿ¨oÿÿÿü ¿ÿÒý+öõºKô—þÿCB¤p±µõƻÿ–8(}¯ðñÿñá¯ÿÿÿÿÿþKοÿÿÿÐ_Ûl8­Ø¦ÿÿÛûWôXägÿ¢Ü‘°û»ëÆõû /ÿØkÿ¯ÿÿÿýö“‡ÿÿ¾ýýwÿë}­ëUõÿnü:Òükáï«kÓÿØÿá°Fÿÿÿÿßÿ ·ÿÿ®×_Ûû9ïÿëöÙ¢|ÿ†¿_ÿûýxoÿÃÿàØAýÿýÿÿÿj¯mÿýî»×ýÿº·¾Ýo„PÿÿËÖ 0Â(}ÃõÿÿÁ¿Íÿ`ßþà÷ÿû¥ÿï÷ÿ_÷ýúç—ÿþý×kzíß¶~­³×Ié=Cià 4ÓbƒÁ�Ûÿÿûðßè-´½þÿwÿïzÿÿú÷_÷ý½¿]¶ÿï³En–éf;ã‡eæ»/^Á„�6)§XiS»¦›M/0A¡¨7ÿÿÿ‡ëK±÷ëýÿÿÝþýµû¯ûý³5¶~Á;¦ÏwÙ]6%"ûI6á1Vñ ŠbM0Ä*Ø!V6G²&EÃw¾Ûÿ{ýÿJŸ·ÕëûÿÛÏ~½¯·ï^ëßl3—¦Ã °Á)Þ“Ri§lS ƒI6Èú´ÓMR®Šâ�6) Ý÷ÿþÿ×ÿsRúµóžßþßÕÿ~ݘÖÒ½ºMƒ´Ø„ši±H6!0�ŠaJí#Cž3³H Ðb rȪ½÷ûoç?¯_µõzצÌ×ßÙÊí)v› Ž"¦È˜m$Ól “h*†sÄH¬ƒD,ÂṫýÛÿVÛþ´»·Û=]]6—Ý1².U5 RÚP›NG{PÓ W;Ã� µ Co³=³ÿŸ¿³•§ÚV—a¾Ø«K&ÒM6V +ím…lS ¤{a£°<µ¬7LXg+a„¬*~švÅD›ii'ô˜`›(aÄ${”lB‘®[a»g6(&Ä Ä$ÓÓMC „•pÅbŠˆˆÁÅa»"諃@Â!è¬c+¦¤v¡P×%ÑnEñ×õõø$�=8O;¨ØÄb?�•Jn¸,¦£!V§d>쵯¼µ®-ǽÿ–�¦WGóá ¦íßqå¤ì)‘)8(E�ü|ìŸË ÜW®}½0¡Õgc_¯[Þ·huõͲr%“(ŠGbWû»kã©D{'ˆù­æÑÑ”ù°C„ˆL„F€p¡OÞ@ïÜoI,›D¼KÆ¡IȦ`Ž‘“£g"C ó3< ¡šIì�òtÚo´&¥i{k¤ú½­qï[ÿãü‡W‡‡ÿÅ}¿úý^×ü‡äN‚¬0�Ó8"»‚A0¨a œ.ËEÛÖÒmæ‚nZÒVdsÐN¡¥ëQÛ[Ú÷iÝzßW]îßÝ9üÿý'a°Õëýÿãÿ¬#½/ôäpÒm'U~ KKÖBÒºÖÝÿnauÐ¥íÛºOCÿñ×½u½ý~?ÿú·û ‡­ÿÿ‚0ÿÿÂOííïÿ„»2:V–¸ð¤î·þþÓþÚþޖ㥽mwWÛû¿¢[ÿû Ó_ýÿÒðØogÿÿáÿ„úZW_ém/ôð–:¥¥îסµÇ·¥¶øKqþëÿõËúëì3ÅhãëÿaÿþQí׆Áð‚ÿïúA?ÿé/°Ø¨ëúÐ×{Òu#…­þC�t^þõý/_aþÿÿëÿû 7Û_ýÿøIÝáÛÒÿÿõÿÿÿéÿÿü}è/–#ÿú,_ã·Õ|~¾ÃßÿÿÁÿáêÒÿü ¿ÿAn7»Ú_ý·ê«ýÚëþÿþ¿å¨û®�­ÿÿÚïß„qþÿÿÿÿø6,T?¿_ÿ× >îúÿ¿õÿ·ÿû[_øGý/Û‹ÿÿÿÿï¯å»ð“ø7ÿÿþ—ÿûÓÿëÿþ«yÏ)þÿþÛÝ-{Û4MþãÕwöEÊpØÿÛ¿%çÿÿÿo~ÿ¿A~úëÿßkýíû¿íÿÿúößíÓvž¾ÙþóÎÒ‘\4òòl0J Ç|6 7§M„�´×ÿðngú ¿÷ïÿJÒ×ßÒýýÿÿÝ/ßüçïïÿÿ÷lƒó=}i0ÎPeÏôئ-ô¡vÄ% S�&Ó_GeX�ûü7·ØKÿýþö}{~¿¿W_ÿßýíÿÕk ö¼C_í86ì1IÃJÒ U8M4í„+ +èŽ6šE[ OY¶%ÿï·º_ÿÿ¿´ßíþ¾qzºýÿ¶uí}µµú};b­9+¦i¦šl'm…²*�@Á0†Qb"A‚2Yÿ»~ý÷­ÿýýïºýÞ«÷WW_ëížáÈ£‡«a;a‚iÚTé… Ói¤æz0íÚ*å°‘Ï�W�¿Î/÷ÿöý»ÞëÛÖÂ0ïô´¤›"èEÇj›Á:i°c°ÍÊÈ«Ùí•óqõþÝýû{fŠÕ¾ým³ÑÇ휾�$ý‘óbi­¥aC $êkvÓ»Höç†AÄCB+¥ûû?·ú ½† A—6"ãOV+M6)ƒià “»¥¯Øª#�b«•»–ZŸXK"cØ0I�¼'i±TìŠö§vÂ{ØM±É<"#ô8[&˜bd¢› »Ã +pІˆy¦K¡qÕ´º´Šæò ! 2¸…Ö’mDF„GÔ2¼…$ÒF–#¤âžV8�òp�•š£Ëh2[ª¹k(ÎÍ`º�-EXìì))aW®ª«Aõ*÷ÝÇ_»¿©K�|·-oõ•îËyÄW#åaš™5Ò'ž A¬ÜDù¤®;YYØïÿó´ˆ–d|¥ Š#¼Ž�æó 6Q˜2®0�0Í$ð�t¯ÞªŸÿç�š¢é:l΂‘¨ÀÉ.†‚0Á dùƒ$à�Œ¤‚a!¸è ˜j¨‹ &Â|ºi<²/_v¿9ŠÉÃ�1I‚O˜F`PIœç‚c\ ÑùªihZL4©:sÛJݤ›A‘Ím+§u´�ÿþIç �)B6D9p�£@z7B6B6­ªjšL46Zá„›Aœ4¢^ZN–8¶•¿Ü&�¿ÇÕ!öêã® £Û + ¥è«aÞ–“i6–ƒ<Ðgš +Ñ8ðOÜ&×§ï?פï«VÁ'l$ž“¡6(1±+ÿú áÿÿÿÿÿªýþÞÞIõþÙ§™úÛgý+aݤØ]m%MЦ);#ᆘ`ƒ +‘I×ò{u áÿÿÿÿÿÿþëíïz·iÿ¶í³ Ø`¶”B}&! 톽„,)Qˆ¢QˆˆŠÿA=ÐoKûÿ¿¿ÿûÖïîþÎ\0ŠtÃ7Xm5Nؤî ›YpÁHðÈ–„d¢õ¥Ã|%ÿ_¿¿þéðm¦¬a5b“ ì4˜§{»V +Ý¢FŠÆ TPŒˆˆÿõÝý}ÿïïÿ´Óa:i†J× 0­ØLްDIhD\DDqÇ^º®F'×û_Û÷ï¿öÌó‘h}ÅbXÄE¿þ¿u¯ýëüÏöÓlÿæ5í[ e¦øK¥éÓi]„Pá·m¥ûM8ؤؤÓ[b—áv’r ﵃±x5m$h0Ä%L28L$Úž¢G†O†š­S­„“`�¦ÐM4ÓV„ŒùV+0†V2×NôÇ¥[hT0b"" ˆ‡HE!M9‰"""™+½~£ë¯„êŸòÃå¶f‰µu<"9<‰i–¸Üv’E^õi +fBˆìI�™Î) ‚×òÍ©X dðLŸX‹ÿ2*CË0Y‘CPŠÆº|Ü_§}"ÜZMe iy÷«_º^ûYGçuD•é™Iïéíu¾w§Ž¦JY©ò_%ˆ“#¡\ðbd„Á¢£°ˆƒkᆵŽ8ë®J"P‹³ Í£VU£lùð‚ØgYƒ)ó°Ó£Øyø$Ú„MÉ— ÿãÿÿ•h”Æ‘¨É:ŒˆBAf³ÐИ0 ØFÂ|\ÉÐôj�Á„…Òm=&ÙhNË=ÃLûH6ó¸ÿÊæþ—�þk?Í™D&L d|�a#8hÖ|#`hØÕRa駤à >áB¦“iRN®“n¿Jû}ûÿ"ÈÈ&¿ùÓ;RAŠCFȇd>flÌÂ>?´nf¨"8aN“M¤Ãeд+LûWJÒwü]1KÅoKô­ôŸÿ�§õTÎÄò25–L#Í!Üó“Æð�'‘°�!4›Kôk{¤ì³ÌÚPÖn“«Ii6î—øý¸Èƒúê›ëßnµ¾¹?ë©Ú¬ˆ…ÈŠÉù0Ì9C� & ÓFÊ?Lälá(ô›I½Riy ›IûßQKZw^µM_ò8ZwR8UýôXã±ßñýÿzþTÑÊ"\ÎæAXLƒŽPæ™ìŒƒa�x'›?™Á0˜A öšNuI¾ +N}iz­U­¥û~êG +ÿÖ¼u~»õÈæ¿üX5××÷úëžDȳ†E †,øA<¿LF`ó矓+L ÂBé§M¦²É“EpgN¶õÛîÖë´ÓM† I\&›i¦Ä&E……¿¦E¥©XVpaŒE DD~ÿ÷^Ÿûïºûw÷ÿi7WÿÝ„¤Wv›¶•Úi¦„Ó\ðç�è®(á#2Òßû­÷úÙ¢½«¯¼Ú[aÞ·ZM¤¬Œ!4ÓL1PV©²8†JÂM‘Ÿh÷•sI„""('ú_ûu{ ÿ_a‚åÿ  “»dxâ§m¥¤ØJáWò¢ ÂH+""""¹$ú×[Û/é¶‚d öûM6!1M;a$ÂÜ+§•…²3Èä„jE‘bÒÒè4î¦Ú°]üï•lM†!JÔ©¡ê›Ihã´|%pÐEfV0Ä!މn ZBÃI2Sß´ƒ"®jëìP�kI¤Oñ¶’vÂIØds-ÖD 2ª²å–ØñÜGz,<µõý?–°™„ÿ®ZÉà�¿+‹c’ü´+ŠåY’™‚¤ÃüWYd5#2 ` ©6ù%ü™d6Ѳ»çf�G†ßùØÇÞeOò¾‘‹ÅJò9¢$Ê‚~U˜a›ô geàªgm$ÓæJl˜ZO®žwȈ‹å^i’ùx£6DŒ `�m4‹�Aªv¶i$År¡²Á… oÕ!QÊæéëzš‘"‘™� 4f„ˆ�0)"8‰r>Ìð‚aœÁ‚A&ІˆÇi6“h29«l³†G4�U…‹÷ýÕ#!Öž¾åY)@ÈdS³1HdP(°e^4Â=‡„‚7¿G†•ÓªM´ÓIZ'íÒµz|^K­>ï÷s²•=u&Vˆ”" kÝØF²>3´l #a¦~éÑB=´¾W-t½Jߤ½½µM/q­Öûû_~«�üudXˆ†C TB%Ĉ‘ý4l[KI´� ÚM¥²ÑmÃm_¤­öÖúÝwiÝã­«ñßÿæ¼}UHªR£#伈™6d1I6":# G°ÏƬ2‰��Þ3“MžŠrЛý-+J' t­F’ºô½ÿ©+k©+~×Ý6‹�?‡ÿÿÿR.ˆè¾tˆú‘Ù¬YÈžXç ,�" BÁ”há��”òaIд›P� 'I¶Yè3„y¥xÒMþ¯êøªj·¤îÓת‘ÂûõÓð]ЮÿŠðý~¿ê@ò|Õ—ólè2<2]‘â]äF`Ól$Á¡£`k„~ $,? ¢+¶YÙãI´4¡¥¢~Òm6ÔRn–«Jý_úÔŽ·Ž;ûü}-’Qô…µÒõÿÿaú{kü“ŒÆHˆì‘õDDç€a 0ð�„hgFÃV +ÐYœš¤ÃA6Ë›eк[A;,BmöîéZ'ktÇm+T÷§}~¯õø/ÑnJe¹*¯úé$?ýt¿¾ãðß‚3÷¯ädFÃÌ, ‡ÏÈXF†“z5´›v °“¥…Péi>•»¥izÞý?¸ª{¶­ÓÚ»ú‘ÂúÿÖ�õã‹ßþ×ÿm}´TT‡ÿáÁ½Ð^Ú úL4›I垉øm¤Ýé~¿¥þ•«ÿê¸é;ÿ©.…^õ¿rÇ#ÿÇ÷ÿýaÿø,_ÿÿ­Ð@Ÿÿ_Kð@‡ü›ÒÒÒßë[Û÷¥M/wÅHáhu#…ø×ïùÌ·8aþßÁãÿ¥ÿÿí×á¿ÿ÷™ßÿ¥íú¥þ¸KÃúúâ©úû»ñ×^±Ö¾×¯ÈÏæŽ‹_õÒ{¯ì:ÿÿÿÿt¿ïÿKÞÿ¶}1ªõ÷ÿézê*ºÿÝ/½9Mo¤5¤>¢¾ÿÿì?ÿ ÿÿÿ¿~Ú ÷ÿõöß÷÷aÂ_^�W*?õÿî‹rU×ßùf?¥Š¯úÿÿÿ¿øoÿÃÿÿ÷_xý½:þ’íßöýïýi_ÿk óöm|ÿÿÿÿÿÿÿÿÿÿü7ýû¯¯º ·~ëõûßÛ'_­¥i6°Ÿu—®Ev›Ù~¿ÿþOm¥‚;ÿÿÿÿÿí÷÷¯ÿï÷[Õönοn¿ë·f�ýŸ½°I®Epô´˜«Ðm¤Ä$à­< Âp¾Çÿÿú ü%ÿÿÿÿÿþúÚÿýöëÞÞÜ3 lÑ6gõ·_ØFÛl0JDÊlSI±[L/+ Âv¬2D"#*è¤3LGà‚ÿÿü%½h.ÿ»ïî÷_ýû~ºó›ÿÿ÷[¤Ý¶zd1Û˜iZL‹í©¦Ä&û BaCPÂ0B48J�#!­Çéÿþ—¥¿îûû¿uÿÞÙÓõoþ›'_ûfyíl¼ÚJÝ1±Mà SiBlŽWk_<6A™RCB¯ô»ÿûõÞ×ÿ»ïî÷_×mlÏë§Kí&Á'1ëÛ $šlB ¤ƒm&G ……abš AÄ[˜µ¯k¿ÿ¿þú·ûmíûm÷_~Ùël´­&ÒM6ÕŠŠ Úi±M„LBE{ ˜Ø!t2n•Ûûÿûýj×µîÏMŸÛlô©¶raœ›/†ÒÓƒTؤb­,$ÚKva5ò­£áT帗þù§«ö¾­Ÿ¿waœ¡„qÃnÓV)Ž ŠM6(1PÛ# ’jÕÛA°Á&t\ƒˆÎ̵m*°ÂR(á°Â(~^ôö)5†Ý1N.Á„S¥°Â &˜.g†0M"ÈUˆˆ×]†B% بNÁŽÄ$îÓa-´â&ƒAÄeTɰ›]$Ó `Á4Ó‹Aee”Õ¤šŒíQêÃPèF=/ˆÖƒ–gqþ@aèYLèŠÝË` + �r¼"% W�Ç\fþZ ²=Ö)Š嚥•ßR¦Òkh5Ó•Éä¿Â§éÕdèu^Y²-{êÿ…Êô•HíÍ™Ò/Êå±ÜKþ?ÿ’2¤2DG�qœ^"y3Ùâ}D c ƒ8ñ)r¸/¯æB±›!ˆ‰Ïd‘ ÍlÌÂ5°‚ šA0�9ÐgA!mB8îL|š<Ò¿þW_ùÑÿ$ êG‘.õôÛôë÷ý<š•ÂDN‚PÁ²#3‚ ì0�d^6¡é7áÃdý0�MáÒ´N)0Ûý½o|U<{Õ-ÿô>v:ÿ22í„2"$fr=G­“æ ì¦L&²+´aQ"Òi&Ùsé_¤ÛúÛ¤•î×Ûîûê\'Üm[ýu¯òà°zù‘Ñüät3ùFc?ˆÌŽˆñB03ñŒüÖF°ÉAç¤ÑùêÛa$Új¡pÙh/éZ ˜&÷V’¿Ò¸÷·IR>GÇwÿêý~ÑŒ>Òÿèzä’Èy""œf¼Ðd#E9V\Ñ{�ÞôÖØJ˜a%íSdqMˆIÚI†!Hï˜I²2@Œ¬7÷ÿð—¿þÚ_ý{á/¾ÿW×ÿm~öýºÿöÌÿ¾ÂÛij› M0Ã-¦)بv·Õ]#Û�‰Ø0„A„"#K»ÿ_ºïã¥[ß×ÿ×ÛUúmëýëuÛ3ÿYÚlŠ:ÓP›% †Åîæ�¨ˆaFjÃ�…Â#]Þûê½wí«Û^›Ê¯·¿û¶g÷îÙ¢µüÆ­¤­¥L0’i¦ƒi4Â}Ü'G¸aJÆN‘XÁ‚Z•-}.ïß_½½½é×úÿlÏëì"‡ua)vŸ°eØm$Ób�m¤›h' BMÜðÑW )WEs(ŽË¢†[£ê®Û}úwim«f~Ùÿ´ºažûK†Ç 6Á-ôì[ÃÂ{Nƒ›A^°ÅO 1A…+nNt½§m¶~Û3îß6›­¾ÂOkºI„v¨7¶! ZhC „l�`ÁYºøF°ÎMœ›-Š[¶Gô“c B ÈŸ 4²: MˆD"i¢ŒGE™â+C؄አSl$ݺ ‘ô;†ƒB:ˆFBj´¯Xa0�…*Ù;•‘£% RÛH'&ìŽ7Îê�`Ǥ +5 ].›�ÿÿÿÿÿÿÿÿÿÿÿþZÂà¹Y)i¤è4嚤F Ð|ϘS %k, fv�¹sïôÒ–CPÐ|Ï* ÿýÁLˆ2² ƒ©ƒ©ÿü‘üÔ +C" páÿýÿÐä(u¿ ÿÿµd1a$%¥Ý2–ÍÔB0gA‚Náÿ ê2hä!ùÙI”äAÉù8¤ìã B†l͘ Áff˜A§þï䀲C}ÿòAdèó3NÍŠPÌ ÉÌ(@ü'j¨=nÓN-0ƒ×¢\ä¨ä¨ÿþü�ò5 “ +hÍŠCÉsÁ„„i„îÂ_Âv¸N8‹NÓåY}x}¿ü†{“ŠuC”ãL& „í4ÿÓãN.âqÿq¼�ß"Á tK².d²‰óþ¯·¿æ¡ž ! SN&KžhÂaÿMƒN-ôýΉc‘"ˆíàÉ ª'ÏN�äI¦®›«Iµoš¬áä�×ûþfÓL ÓPŸéé Âh¦‰cµýçé6ÈñÓÂm'‘é[‘QIáSOôôôü > áû÷üi¦†ŸéúrYDXü‹dKh—iäy’ì†yú¾EŸ§úzn¸éëÞ¿ÔWè8‡¦+ÞÿÅ¢\ÑÑ+¢Xô‘.¤Ü'ú§¦ÕéÒÒ~‡ûºzé«ëuÞ´úw§[×üŽÈ™­'¦ä§§¾›­'ú}q÷ßþÿ§ºÖþ´ëW¯Éÿ�¢]‘sh–0—ÿ EzkÞ�&ïÒn),}ÿ§«Zëÿú_�¨¿×QÿÿŸ?ý=7¤à¿ÿîØõïÿ×k_Óþ¿½z�Aýƒÿø]þ¿ÿëé¿ÿú­W_õ¿×ÿøÉpOù"ÿð_aÿü��ÿú#ïòl¥¸®ß÷ÿúúïakã´3@}ÿüÿÿ×ÃÿÉ ÿþ—ÿúõ²Lü�ò€ÿ$_òGx/ÿøD8ÿÿä…º#ï�Eÿÿ÷_úþÍ ¾~7ûÿüø/ÿý^ˆ‘ÿד#ÿÿÿ ¿¯ÿý×ý~ëš( ·¥ÿ¿„C�ùÄ~HjòC ÿþ¿×÷ÿþ÷¯ÜÐÿ_ý~û^ýÿKÿä¿òc_ýÒõýý%ûÿ²{ÿÍŸiZÿk{kÿ¶“itGßäŒG_ÿô·_ÿÿ¿ÿ³Gÿ¯ø_×ïÕ´¸{i{iØ_b˜®‚õûúׯê»ì†¿rwof�õÿÝÛ_Û_µöÒŠ�‡±üWû´×®úÝuÒÿýusCþ×Ýuoý{V×íb½�㦿axký�‘öšÿÖæ‡~–½ÿ~Ã[KöÒû]l/þÅGìµïíIºaoµ[ Úi£4"E;úÚ÷éGÿö¬m¯ìu±LlûOì…û^È‘ðÂÚ &�Ä0‹1P7ímvÒa­WÿÇ!G±_µÛNÈQÿûL‰iߨB-Wˆˆ�Ö*ØØ¨Uÿîv¿axa2-Ú}ÁÄA„-Ã>Ç[MT/ÿdHŽ[ƒ ¡ rCòÜ›­„‚‚¦„DA¡Ë@QðÓÓCA¡^M쿯nØ«PÂ�þSaa�¥2j[u¨5Ë`Ô @Ë-@°9)f…�4åž 9†¬²TÐÒ•ÂÀëΠr ¯�66Ð'�<ÀE\ÿÈ)¤T”Áã°¶U†Ã ßËmd“ÿþLò ljÿò ýy;÷þ¹3ÄCïò`ȃ$ +u BxÛPÎL&ƒù9 d¤RvmçÏ3f 36 Ÿ4ÓMoX» ï0™ƒé´¿ÿm{æoz´¾ÿÿím{ÿí/¶·[kíý¯¶¶“ÃÿØ®÷ÃÝ´½ý�ب¦¶ÿöªìSo±_~þÔ›¦׿†ÚúkßÙú *h4d6Ó†Ðh0Œ’1`Èÿÿ +?È”رܦB2,gŒó>_ÿ×þÝ_ëøø÷¯úù•¼ÌWä�ä@§A�!ˆheÅð�óŒÀÁhüù„A„O††ƒõƒ_ÓM4j‰ç¬òxÑ/ëÿñIºt½ÒÿÓOÿŽÝ{ßÿÿoÒÿù¯ÿ�þ>¿ðÃÿÿì?ÿöÿÿø7ÿù ÿüè9:¿þÿÿý÷4v¿ïûÿóiòBµëíL¿ÿù?¶}ûkî·ÿÿýumn¾Õ×ÿÿ·LSÅ{WÿýŠi¦½‘ÒïÿöƒL ÂÜ4!…úi‚ gÚÚ¸ˆˆýwW]ÕÆ�ò›)È™a¬¶ÒˆÔV»S5uUä¿ +Z~d0Ø\ôN”³ ä†I²�þá{û¾ëþPA4ž6ÌÅîýÿðƒM4Ô'¶¹)ò\Åva4ÐÌ= žœiä½�¿úi„õôJ`‘Åwí;ÿá¯ÖÖþÓ"Å‘Çv„C ðT ˆ0@Â&êŸ-4ÿÿÿñÿùM”† !áä¥ËmT$‡‡’ƒ¿– Jë’›ùf²PŒã6}�šßׯ;ïä§ýû¥þííÿ™ˆuxÍÉ;ÿÿí?0ƒôÖ¡¨ø÷¹˜‡AsÆh*駤›Êr>¿  õ5ù<¢Vô‘(z¯èèãùÚOÉ@Ö>ýæ‰æOŸ9Ñ.¥Ý/ëÂ$÷üû0GP f ÌK)Ìð.ƒä°�þé6“¥tÝ>Á]W&#܃£Õ4 ;ôúÿüwýëûè ¿Ñ.òO“ñj›Ò'Úûí!KÝx|�ÏÈ:=}7þÑ>¢YDñÁçA¤ÿÿ†«íý;!OäûÉÓÒóGÛdÿävGß§I¶ÒúÿöCðÿÿaú]’êÚï‚ß§ëÿ =-¿ÿöÿøaÿæg¿ÿk¶Ý_¯'Û õÿÿàßÿø?ýý¶}ßjÚ]ØX­}TÒCÿÿ!ŽN¿ÿ�Kõt¶õ½�ŠÝŠÿà¿&.—ÿþ|Ñé{jÿí®ìp÷k¶Ÿþ|÷ÒÿÿÞí[ÿÍ¿ãŠí¯dwkpÂÿ¯ï¬‡eÿþmù›_µ¾·kv“dá¿ú%ß“&I¤ÙEÿÿÞÚÚM×¶¶¾È± *$a kþ—úOÿÿiE1Å|lR–˜˜oÿ[«m®•”'ÿý�ÚkÝ®ÿëk™¿×¿ÿØL&ƒ^Zÿ¾­«jÚN­¯ÿøh4A„"#:ÿߤÅr `§+”Ÿý�‘ÅWµõÿ a ×°®»û"Ävƒ…N³±3©Ùs§®¸ÛHqPÑcAð@rw-´± Ú„í>Zá™ò!‘9‘DF¶P(Aè�-d¢_Pƒ +š =&ùf§gC>D2'"œR@¤1�é6é5ÓD}Ò~YV5½ ˜A„O]Õ=Q'Ó}7• ˆ"AÇ,ŠfH32!‘¡áô­é¦œ7ûIƪ�m&ú¬ÀÁ³.eØAÌ’¢½b’<ýzývÒNIé­ÒmûªÖ—�„F Êq¨è0œZr •q;×µ¶×ß¾¤ò‚ Éåǯ¤“þÞùqAfa0ƒ#˜N£D­ê‰Cæ 3‡÷ÿõ÷JÚ¤Þé7[é·Xª¥ÐÅ âÐÐ|ŽÝ<–4O°ž—ù?Åé[_×n«¯öî¤ÞÇH·¢ßºÚ%{D®‰Ûéëßuoÿíþ¶é{÷¥ÿézý)ƒKKþG”›‘æ�'ë´ºë�ý­Ò·_t‰½Žÿ¦ýô›kAÿÿW]ZOMÿþëëþü‚Ɔü˜û_ÿk«U÷º÷‹KKÿÇß×éÖ¿‹ÿïç™8†mB®Ûî´ÞÚ½ÿÕ¥¥ÿNµïÿ™‚õüÛL�D�;\'¨Nôºû¥Úb˜¯÷T›äxëÿý~¸»!Ÿ…ÿ¯ž3‡š „ã3h;“&?N;zíÿþ¿þëïuÒÿó0Oÿ_D³ÿ&%Zú/Ðiû×ÉãÑ<»^ê­úÿëZëû�ÏÂÿÓú¤ûëþ¼'w&ôÑ<ké7#š{T¿ï®Ñ(h•¿­Õm:z@âÿ¢Yûää–ëëûúé|ž97H0HŸwÿý¾»ÿ®ÓAÒþ£¾âïïôúö¿®®­Ÿ?¥é=?é^ ^�Ò[û§î«ª]7÷Æš&ÿýuõÿöÒßþׯ¥û}·^ö>Úÿ[êºÿQÞÚOÖ¯«oÖûi}jÙöà úû /ŠôºÖïÿÿŽÑ'î¿ôݤC#QÝ6¿¯¶د�Ù{ÿßõãd)û×ÿ±¡§Û­÷ý"GkÞ×jÅ{kìll/ ;^ÿýºöÇÿý¢OþÕ¿µöÒzt›u÷Zøý‘bÓ Ù8Ž_ÿý|7ÿÿ×Mý"G¥é>Ú_­í±^Žý­„ddÄDEGßÿ¿É“~×y£ÛWD�Vúzzm¾×VÖ½.¾˜^Èð&„ph·­þN?ÿ¸oþ›_ú´¿ûV☦*)éÒl5á£!HDDTm/ßëÿe:ÿK´©}¿¥Ò·i¦«÷aƒ:éF¦ÿ·íö“ù› þ×·í«î•ûÓîÂa4Ñh4˜¯¿ÚVµm­¤¿ñ[Õ¤ÿ÷G\ &�…jÂýû­¥ÃеÿÚØUû~Zf@àÕ½¿b£i¶˜ªÚðÂÃA¢Õ.~þ“uá Ö[@Ëÿ´Ó :Á„J7;1ÿ[U¹Ú±+t·j®#ò› Îê¹M†Hnv¥·P-ƒPË`,ÁªZÕØ2�yiÔ`¹¨f�˜.jÆYBÀÌ5ã&õ˜.jÆW¨ ÁsP.3Pƒ!¨†@2TAvÄþ@BFk3©Aa9L¨�i§A ÉÁ;hœ4NµÕHè0ƒ ­: ºnƒ �dNÜ»zMî“ËH´d1„ÐkN“rÛšô½å¤�Âh4NÚ'•JÒz¦ñ«–B‚: †=4éé°»ÿô¼²‚ 4¢vÑ;¤ß‚׿þó³2TÐi­7Mý?õ¯©‚ùÙlj‰ÛDî‰ÛÒt¿üRü¹ß„þ©­:M¤ëûuùCÅb±ê‰Û&Ø&ë¦ÑŸõý®[mdxþ´ßé7ÿêã¶–‘,v´ÿ;“éZ[izÅzTÛ7ÿrlwþ:ÿé>[êÒdWÿú½ÿI-Šô“Û `Öûó²Çøâ’×úHž?IÇûÿé`’_éSí¥ÿ¯ýRUÑ<~’MøAuÿít—­&ü ©òÞ‘ erY[Ûÿé$Sµé¿Kÿ¨5´´´»k¤n!¥ú_·¥}í«ixð‚Awî¨+_I]&)Šc설“ßþÚÈ1mZ„× zAHY65?ô­x­Š ˜\^•Aôߥ ¾4œ0°Â>‚KûI½X­£¤×­$›Km[KkN×ýv!Eåc !ÿ¢ Y04¶ší¥û!„ /i~Ð�chD0»F!¨ÿÿÈRŠs�Lœ tí4å0X)Õ‘�tN'nZä¹NÍDŸ©Ònž  5P½:MËI[4h¾j ©$ß  ø%¢NÑ;iYÀŸ_ôè¾Âz}Õe½w®Y ä0CAJv¾•¤ÚMÐèÎÅÒÿ®ƒÑ|åÖfà·ßÔ„?ëQç`¬ë.š¥tµ¥¥î—¯¥ÕQuÆ»ÿ¿ôlô½&Õj¤Øâtý +Ф)5á¯×iUV’ÕQâúõmRæa?џч— �I),zUñ¥U&Úµ­.Œ а¡$©õôƒ#ˆJŒ÷ñþ-8~»}~ *ARÎ��ã]Éc“ë`ÃJ½o¡Òÿà /%Ξ›Ãa-ø‡ª ©'Œ*]XØîè/ïÈ~•§ëÝÛm´¿¯†’T¿Á†—_æ, µÈ‡¥¯¯ðëîùn$ûÒoÿn¤ _ݾÿÿëKþ)i¼Cóz˜}­¤“kþÿù¿·X}ÓÓ®Å} qä뾯Òul% $A†ã…â;ø5µ:;JûX¦+hG_ÿ¶­¤ÚA Ö3°£öÒm*b˜¦)¦á}­®ÓMÿb˜¬0�„_ØL,D~! ÂˆÄÿò?�Ã!ŠC HL&šr˜&�B”$¦‰Û–ÁÙ¨Ó ÷/(¾hž4›–º˜pA„¦ª“i7O\´�eL&²ñÉŒÿ¥ÓËK³¨Á(Ó“¶'£¨TžŸ…A¦²zæ‚lzÿ¿ùdN2¥„‹M:…_é~+õÚ̇AõEãDñÌÜ*“tóGÔƒ5ñW©ÙP¤�MT·*“Óÿøâ»¥¯ „Ó—Ž^9b?¤ë[þ´G¯IŽši:O�BtßÿvºQíRèŸ4_:on²Ü)¯­H«i`’%¶ÕQ;Wºõÿ¸ùƒOد |®¦ØÂ ýÒoýH7úQIÛkí´ÞÛ#ŠI7IÿÅ,ÇþN�»ÓÈ6?†°–ÿñId?ádùÓ±¢xößqÐUûý+îœ[zo+‹Ý%ÿô�$Kø6>Èâ“÷÷ªWõõéÿ÷�o“ßêmõ­½µHa„ßû×Þa¯®’¶»]R �ú¿¯ú_·M¥ ¾:¶ +ÃP‚wÿ8¼·³~ßiqLjÅXãI¿ßO7ö”4µí&ÒÚamYC#z_÷ÞŸÿk±Lxi á… a­CúZ¶“i6“im5ˆˆÆ‡KÌ5ööÖø¨¦+i„®–—ý¥i6“A¦„Dyµ[}¥ìSÅš NÅ�3N¶“¯»M�[äÁ±^Âi­¥im5ˆˆØØ­„×i¢l)ˆÃ ¡ƒ1ÿÿ�äDÅ!Žf£M)€ƒ: †) TôÓ–ÀÞƒ „Ðrñª/š/œµÂ�rDMšij•ü´âOAËÆ‰åƉãIµÝ'–�AITÒznžŸ‡ÿrÒÉ4Ðm*'ŸKÝ'¤ºë–Dã: �) UM5-Ô™À”ÚMï_ªXêð˜MƒT^4O¼iiÿù¿ÒùÙPS€Â še¸°‰=:M×�×j+„ -/�„a=Ê'™xÑ}]ºR¡Å_J!® õúºm'Ûëô�-Rí%‘ÛKþ´k4ž½ëg�ÿuæ Rb�*zïáfH½^½Ç­}}:_¦×)Ïà«×ÿþýiq $�w]oÿH¿]+KþG�’HŸMouÛûÕcºÝ`“õÕ¤•6ßÄüìê’ÚM®¾ëÓ¤Kÿ0ýo˜4‚JÅ1NÚ^è$Ûý}þ.‚×äDùê½a$¼Å¶§Fß×A®’iíÓþ’ ï÷Òm|Ÿ:& $‰óEûÛKúû¥ý[KmuôêéSi7ûw®úU¥ö¼SǦÒKüžëÿ´•[VÒb¶ší®[¤ý÷½}ò Y04˜Ø[ ¯äÙ Òÿ¿ÒµKtµb˜A¡úIéí¥ÿì{L&‡ýª^Úú¶­¥ì!OÿÕ¯ìSÅ{^ô›I][Kiªiv² cJ-0˜A¯k±[Ä"l@Ì7¨‚û5�<7¨‚æÆ¥´6 ˆËX,5‚¼å6 +Œ�\°3;f´{ )£™"4d|‰{µ-šÑ]AÙIqðº’ÔDÙæKæy«<‰,õѬ•§÷䑱ˆ˜ÈÔQ%'Ǥ}-¤ÉsóõU}V•KUdÍT&é&ºÒKIÁ~Ýkø¤:GbK¥P°“ô—ôë}�V#ãY$Ž¨Ýæ„NÏÇÙ¶qœ2v\ùH’ëô?­¥¥º¤¥N<Ùžg ù‚ …K]†šªj¨-a4�*ßIRÒ¯þÏ™ñL#Ä™8OÎÂ44—UFºZI6¾ŠS°ŠzUUKÕ&Ä$b£[#ú_×¥ª.ÇÐFϤھ‡¦Ot°—éh§[ ï_½i>œë›IxG¿ÿª^éSM.’Ii5‹¸úŠZZØéP�¥÷\B5ŸÒV´µ iikÿÿé%é%BŸÕ$©uZþ©*],úA>‚t›Is‰é}_¥ÒZ¤—ë­/ë^«Ò¤•uô‹½%¼�­.ª•$¿}ÕuþµUIBKú­$«ê¿é/ÒìR´�}ö—륤ÚÝWJëõ×h*KJ«úªé/_ýyµú*ÞæXITR],3ÚúéURú@½}uK_ôª´’ézIx¶6>—]~:ªK¶•U}PõT—×úJ§ëùËýwKÒvÕr8]%KI*®–!¤¿×ÑuázFÖ¬:¤Šâ—®=~ê…¥ý-Rô©®]u—_g’J–©ÙåptÚQH/¨U}.ª½ü¤u×ô–©-ê¶G˜~¶s×/×wiBé](Z]UWK¯Kô«Ázé$’ZW}Ä$¬UŠb«KªdOUTÃAt"ÓP‡¯éeÖT'tµÂ_é%¨K‘)j¦Â‚¦!0© aŽíL7âiyÏ룚ñ +ýPI,AR¨0˜FFL{Ó¥b©+¶–« +º@‚ ‚cÎÊã}r!Ó*®„C8áh©E m5ø°„R+” î‚ùk)Iñ ø½ vHØ imD21„Ó†Œb0endstream +endobj +163 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 24 /Subtype /Image /Width 32 /Length 318 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ  ÿÄ:!1AQaq"ÿÚ?éTݲ÷§ZÍZ¬HxX8Úìmt+ô1Ú|þ8½›.ŵ“VB2¬<­¿¡ªÔúõµgÍk$ãŒÿ>¹XE"kdñøxfº `Èaà?ŸU¬Ù®\̦|1žWñÐ�³Øû.F}y#b¬XÄå¶LCéÁ5l­ënû\8©™Ìðln¥F­Õ²²Ìïí;Õ:ØŸ8ÁŽÿÙendstream +endobj +164 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 24 /Subtype /Image /Width 28 /Length 350 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ ÿÄ?!1Qa"A‘ðq2BÿÚ?ê.µ*wÀAÆtUz‰ÅºšŠ"¹"[™Ÿ\Çã—K]Ëk�–0„ÄǰÉä#¸#k:•ÑTÇwßrâ²»0ÚŽ�Òe DžÖŤ;TI[2… °33$Ië”ÿÐ^ÀõªÕ¶£H{B¥¤YÝS?ºŸ¨Íäkvå!jPÚèH óŽXß:ÉÜs-:DtÃòÖ’ltŽš{ákk�à ±10ÿÙendstream +endobj +165 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 56 /Subtype /Image /Width 408 /Length 3874 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ 8˜ÿÄQ!1AQaq�‘"¡±2ðÁáBRbÑr#ñ‚’¢²Â3ÿÚ?ú_ñæ'#�Í$N– ´rüiS¢)˜ä÷\ÌúNÝ¢BééŸÊ8Ò·ÿ<2”A`Æ6Ì©j§�òªý?åHEõG?OÊ)¡Øîã#ˈ?M ’#ÓÚi�HÄGºüLÿãXz0rœ…ÚH‹D ¶Ÿ¸Öÿ~¬¹ ™™Äƒ¶ÀµQú}ùýÇ6‚6´Åͧ‡:VéeÃ+•P 4™¿¦uäh=*™ •‘"þb¬ˆ4Ž´™pû€Å{©W¦U;�3kñ LÙzÕéÂ’II:Þ~úÌ}*âˆ&ƒE*õÎÝ*”e€Àƒ õ28ßZ`™™›q×ÎŒ]8Ä"I´I%�™¤N•Ë×¼O¦yÆ”¹: yI,^â @ˆˆ�·ÄÕ°á\+ 7$™2eŒšÿÌGukaV ™�#Z=¡ ^xQ‹á@‹`Àʵñ‡R¼ë�ú$É‹›†Ún +þXàiÇL¤†$’" á§™šßã içãz¨P Rd¹ÏaeMí}c„^§ü,d¡%‰AY¾7¿ŒÓž™¥¯h¿/º•ºÃZ·Q”ˆ å‘"7“È3γù.p#ý%öqá[ b|oTLO�É9„ Ö÷°?¹‘ÆÖ(Í� ?(¨dlùÌâ$€XX…©Ûy›ƒÙYÕ£·¶¥ˆ2 ÚAÜ¢x‰ƒ]ê +¨Ì“Æ“*3� W[ˆåÛ5ê#)Å=“sêq¤ˆ¹øU<‰&<éÊ‘öš’–\jʼn$¯#v1ûyÓ><™#!t1ã>5$9ŽC�¦Gªcw—¿.u~—ÞǾ?„²ü@5>³qÛ @L'„ }´©–vC‰î¼’Fô° L0›� ߎ`ÅÔãv-vØ{�“ÕÏÔ£çNo}¶‡"w’vìðk<9Í2°0mÖ¹Ôœ8r•'Ó¼ë{:�k2ælh—7}½·p ÞtšéÇŒâ2‘{XÏy=õã Y·þe­´éÇx®Ø*"t®2IêBÉ‚Ž{Gÿ�µtdÇî¬na �Iƒ~ÚåÇÔdÏÓ«ãNÓ61©ƒÎº±£)ݸÄhI#ãTÉ; 0o\Ƀ2(U*.9�ª‚Ã…ƒ:·ø�DÇÔ²?ë¶þ<4ãJý6Gpƀϻ¢ÑÌÕBe (QÂtîµ!éÝ�]¢UcÌ‚x~Úq…‘‰] &×'Ižèᩲ֨>Ñ +AÂ=$ªÚ·¨éÎp°ci$wÁ_¾˜ãÊXÂ"ã¶Ú^5£ú‰<ìÀT=œ˜ÉÈÌ43hå©ìŽU 2‹½•q&×kŽ%˜viâ+¡0uáré`m2²ŽëéÊ“GÔtøWȤ¬ Å Àq¿_è8ÁÜüÐ5·^3÷Òö€2‚Ú’Ë<8V7³”äß¹túL˜ž;»ySŒy7Éq›à ¿oÛZ1 +$è+ÊÿåÍÓb+”)ŒÀÛí¥¦xëã]í�˜‚¬ãkø·•OFØñû{ì, @ˆ�öåØðg_«.ëGÒ‰íøvS 3¸q‰U§�ÊB›bä ´øÒäéKª�çp î0I‚uâ®�Òº¹2¤‰ûÅ`Ä`úŒž#‡u Âáää1Á`@ûþ4ë�ï¹�|æ°akÖøùÍhÆÛ§u¹EcábIV‰„Áæ>ÑTU�Îi_â·oOâ¤Drn8´ƒnÙ3[ì¾Øßx€LÔÇD»6O§Ü÷#÷n÷9þ»þOe€£1ð=±HzIR»‰Ü<$tŠVè·À.`@äÛƒàE6ly°—h$-†ë}3ÛQÅ/ƒißµ �ââ ¹†ÿ—�v m£v±~úGÀƒLÄkÛ~ØK�§tf>ëа½Ð ù“SéúÓâ8½Ça m�#oÌUÓÇÄžòOΟ"{ˆVH‘5Ä€$Ö5´QEVQ Èš•´¡BÌ kI + 5›‡:Õ`Ú¬.¡¶È“ ãZH C"E$cÂ'Ò³Ü)ÄE«jg2+Œe†ã$,Ü�­ª”QA¢�A¢Š QEQEO6|}8ÜæØü„Õ$R«®@ èA‘MXµ´QWwÉ�A*û‰¡õÙ‡ u¾œô­n¬àø,Œx÷1ý O§�>5gÈÇn “´¼OmOÌŠFÍœAŒn –;½ ±&{ª�6ä h‰�ˆŸ¾‘ú’2û@\ƒà Kp°,2ænY}W°ïûsìšL]SœžÞ@ µ´vÍÏ÷Pùº€ k„’çîù×6¸3uEBî|²››ÚÅý+§?RøRvÉ&ÂæþÙ¤ÃÕdÎ!€³u[ö4Lv*éýVÌX¹Í…ë\n \TrtøŽTrŠ[é.,xÒc ‚B]ßžm¸Ä/g!áUe†ÞŠ»›hbuÚ» xIó¬L‡!Û”(3!f~�¦|ÏË�¨Í�‘Õ&ÿ´s�[ƒ3»:ºÄ#pñ©u(›jn}¶&@]xÁ�UèÊû@ q�k€ ‘¢—6\ŠÂ6…ä‚Oà;jg#Œëµ,uþ‘�Y3dAþm ØH0¥˜íæyyÖ&L±¼ÁHc^fñCeÍ0ˆ™&a¢"/mk?�̃"A ´¨ˆ%XvùÒgËÔ …Ù;Ik0æ/Çá]Eö®ãÀTËf±ôÄÜEü ŠÒÙv�¼¤âtûq¬gÈÊ6@3rA"5°·Î¦sd´ÅöÇý‰¿ûyxš\=[åÆZû…9XdöÏ=>=“f÷²ã†k©â-géwtq¬n£1ÈB¨ p›ð“<ï§Æ—?QšG·qv®ïP¶»€çMŸ>E €L’v™!Eö¯>Î\éN\ãˤî`ÄIQ1µW1ßM“>TÁ" è,L�¦ß‡:\³¬œ íÐ}ßíb>°dË„d÷)–�±é*ÑgJôŒí0&£³6<{C×¼9‰’Ǿ ­Ô&C�²)bAd(OêŸÊ~^Ÿ;dŸzˆb¤ÀF(Ç]$ÝY‡9÷ +îÞ!ˆ?Û·—÷V;g'rdI€ë#�Ð�N—¤Í›¨'ürÐ ìÛ¨µýÃÎl<뫤ɓ& r¦Æ¼ƒ �‹ ë­C Í!�ÊÄ–ýÒÐ4�Óe|* ÁvÙŒ-µÔp1]@¸Vµï©eÄù£r‹Û¸í=ÿ=)º\/…a¯ass1uC/§¬ÆnO·–Â.'äžêéBì ºÁä Øžp+‰:$Ʋ2:ƒ" ½�åøë]LÝBÀ¤“ÌÚ5žïõ®|X2û™Yñˆl›”‚ €¸Åç™Cðã§K{»=+qÔEûmò·…¨pNTU�±ií˜*ÙÌ$íˆ`ë?ëý*õ7x؃Ƕ§“»–=š� 3n>~Fî ¬f÷Ûké­ô¡qdÝî2.é�fŠî¼rQo�:£K9@ÚÆ}*[o.tø}Ù'&Ð8˶—/Qí¾Í®IÚ¤�8�âhéñ¶í&I%¾lir&_vB+ÊI‚œåûé=¬ë•H +E·ÄnÑvŸÕúª f$†U� I׊ÀùÓ({ˆ>Ek¦èž<;«(y‹p¹íáãöŠ‹àÌÏ;Q€iV'Ô¼À~úèöý!~Ö©�Ôa ´™S'pç"/Ç�k «ôA¿t?Ò·c…�ZLÇ*›aÈÙ˜¶ÛwûT×§=:í�»w>]íáêµn1›&ÈÚ ™,Än�]q2¹k]¦;!Gþ´­‹2±8Ù@&`®šÎ„q¿Ÿ‚6äJ¹ˆ úWÃê£ØÊ FÖ$z�$‘ª-´Á¹ãË– ü©}œ®Ä;¼^3 ™&â¹óôYß´ŽŠ»H�¦dÚG¤rì×�wá Áhã¤ÔYs“mƒ]dð·.5¾Ë—bmÆÖ 9~êL]3bFR–‚MÙ˜¹á¤šEé2#‡X@ä@°ò©.Œªâd %}$n+¸‘]a2J°�kŽÓ}`Ïf•ljÊ!ŽãοÿÙendstream +endobj +166 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 56 /Subtype /Image /Width 120 /Length 751 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ 8xÿÄF!1AQq"a�±‘Á2B#¡á¢3ÿÚ?ú€ÊC…*EõÜ\Ïgg Ž»Ú5Ü�îºyÑ)“*âÎæ‡Äö…v òÛ¬§�ä}ðL9 éô›ÄDDæO%ÝÈ)@5>ïZ¬³çcþµå[ë]Hü¦Mæ?´&;%KVŠ*´$‹³}£>äº)_h!‰º £+­ +×Uî%ÑHÈNº€6ª¢Æïç7eär +8÷Ö¬šøP=f •ûjù)äéÔ�{³4ÁŒ.‹ÞÅ¥kßa©¹Õ"p¢d䶇•fÿŒ7À^ö{zË—Ï�-æœ7º÷·Îý4ßYžeÍ™¨¦”( r!¯žÞßÓÐúOBEDDIˆˆ‰dD«8@I•Lã'Fu+ÿJ±!An&š¿n—¨ôé¼Ó˜ßé0ÂìÙ˜­jû{z|Ìꈈ‰Šù*ä…ÑâMhÏ”!îhF£kþ²¼Ç�´¼×UÜ=¯àfÊCGYŸ�¡Ð‚¡�¡DXßrmæX³P%ìÐ×M |$}Ôl[�×s{WSé0ñƒa8K1âQ€ö†@×dÝÈ|4�²sÎÀBõ­6I׉q¦$Ùyš +l n wÞY¨h# ­‡µ…ÄKœ£CDí_9¼DqQ&D˜ˆ‘¼ELòy±ÕIØ©˜øžCe ÐâÀŠ·ç4ÅåáÌÜS"“W@ë]ë´Óî-‘vFõ­AÈ�y+¿Ma2£’Ôn:ËÄDDH™ç +ÿ*µŠ,9/ÆÀ+õŸÿÙendstream +endobj +167 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 16 /Subtype /Image /Width 152 /Length 674 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ˜ÿÄD!1AQ"aq�‘¡±Á2ðÑBÿÚ?ôŒŸôðâC‘˜ Ò#ª#î*¥`ÂF•žH0bxÔ=»çÎ…þHhˆÚ6NÑÃ]LþÞ´}Æb”{‰ ßnáÎúVÁ�Fí¹NQ H††nsŸ*5Ç‘Ào˜Þà6ÄÛPNž4K¸ä“=" úK4=(S»gŠREØÇì[8ŽtÜyYï¶ Ï@ÝÃ+‘´Úfú¤xQeÉ�0 ø“óJËÞŒi¼­‰rêây?¼W{~ìg1çq%mc[ÕT.»„Iô1H\C"’3H››Z°ÊŠX!ˆ;ZÝ&/Æ–q/l@»›r‚Iê;˜)3õ�JÍ�ÕŠüLÆ`DFšîåõ𪆑YŽÑÎ9TX öà¯ÆÄ’4ˆÐ$iDݱٵT)i&.'fÁ~<+¨­‘™“Ç#ü �ÃK)ˆõ®&|È�NÜ t•+èIŠwÈÀ ÊI›Ç•M—.\ØIÿ_ `Èv’’v•&ûã‡:rå|k�'2$m…ŽrÓí5̸Ü�TIÌ xóþiKÊr3Y@e}Žâ=ÿªØƒYÎ8e‘‰Ú}„ô‹iÈš«dcÔª0fþ›­FeãËJœŒ¥@*dÃY¬LÚâ‹ +8EÌmæóû5Ó½ÈFI�’`XîµÿÙendstream +endobj +168 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 120 /Subtype /Image /Width 384 /Length 7789 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ x€ÿÄT!1AQaq‘"�¡±2ðÁÑBR#áñb‚²r’¢Â3ÒS$ÿÚ?ú:¶|m»+¨@ Ú$ȃ3a­¾u|}Ö,ÖFÄÀ<$�ÈÖþRnÚdix;oþ­*›‚‚IÒ¼üŸû“&1‰„5þÓê�J�†ùŠéŽü›™v¨·1`Nã4ºLÞœm €Aþ¨1"ªù“o¸Àž'^>àð©ãî±å�§PH�D�¿�+÷¸�Á:j`í¬¶œ)²÷xð�¬nDÀŒs�™s£ pd ‹Èé©ÜãÊi�¶#÷7Ð^ëFrJ…’À­†¦ñGp™G¦mÌú�A»¥}°$�-´$kx5½ãîí‘O”~¿J¾Â¼îÒ#�Ï s§NçG( ÄMˆ×¯Ù;œx®Æ’LzDk- ªnµyÿûûn8œ©ØåX.àJ£0‚mÂk«/w�·|›þ Ñ~àª;¾C�î±¢ƒs"FÕ,cÀUGÞ$~•Ç›¸fÌX bUÉ,¬º~Øþ®>wÞ3Mô0cÎ8ðçMï¬�{ñƒzRæîñvä � u‹ùÛJÍÄCgi‚2>߇>`ò$iQl¥ÁQèfi‰øšÞþ< ó¶'_fÐ<)²ç\@&m`[éGUʤ¬õÄ Ô}ìåÊmAs&T¾–»iY»œ‡B¨¤Àb!£ªî‰¥Nã3�X.ÒH·Ýcb¬�‘™€[ ^n|¼?“&fR �·�>ë‹�mLÝÞ4m¤Ÿ1ÖúP^é ”¦$úLŒDßJ9{•Å÷OO²tsw+„d΀Ç–‚²÷ �ÄÞ'i³DÆŸ +\]Òe Ân%HñÊ«—")ÚÌ"@'P˜®V¹­¤7ÿñ¦Ù‡¸ä„y•$z—_·^DiÀÓ÷j[ m!LH$À\ci‰®nÿ>,g±†C`º�­2¬¾Y�»­Êá4øÏΊfU$³¡€X‘`¸ù™˜å¯Z«dä¹D±$€5úÕrÁM ’"'Y¶•Ì;„�¡„›oÑð5`øö[MtÓ©h€íImsÃ�µªfÎ 6Ñ ™ŸNÖŸô‹ñnÛ¸GÀަAQf§Ý:•,¦ì¤]Y‰‡•uàÊ™„©‘5ÇÛwŸ¹Í§ÒºtgŸ*l ½Î²&òƒÔ!ö±P5oyÃk3·÷k6†|8Šb, +MÅ­\�ÞElÑq0fþ¿ÔW~\‰*At¿Fï0«2—€ö޼«�ùÉÀY€gÛE“,.¼ÔóÒ«»r•‚�Ä�Â×1–Kr’LzŽÃ©V-ÜÁB0CÛû@™ôÛÇ�„”a q/¹¥A’7nžV5Ú;”Å>ã*_‰�§X®~ç2äda aqN彸SbÈe,ޒ䤛m +€øz¦“»Î_JÃnq´Ä€ ¹ˆ?*^ì ÊÊ…¸„DºD +¢þ&¬s¹�m »nŸGÚxH¼ðá×JˆíýÁ”ŸK0Û#U�̶ n O +~Í»cI‚ À)χ‡Ê»ÙµøŠÁ�åD"ƒ £ƒ&ŠæÃ�:>ÚÿHò¬1¢ˆ +<£±u�[hˆ‹VÚ¼…«m0&±µb¶ÐE  D4­Ð* QÚ'JÛ@áB´b´ +Qˆ­Bµ�¨À­@€kX­¢Õ VR(@£Zˆ Eh"´T³al„2¶Ò è Ú/>40öÞÓ¶FbÌÀt³‰«ÅbÁD’ëCz‘3n|+ ŠI‚F¢h—Y‰ä7½°€1™þ�Ÿþ_*¶ñÌVÞ£ˆó¡îzÊôŸÅ©·)â+Bä‘·ž´áÃhA¬t‘@º�÷:ÅÔjEoq?¨_¯**Á´ øRïa�,‰™¼øGçGzÞâÔ]¶©104-ù}>‘z¤Á ^|êx{–`Fm¸Ût6?ô“å['pØò¢Ûk“®ŒøÓå˱ÅàO•t.Ä ÔÀ±Šly(ܬsEC¹î2a‚®ÅÅ�sõ"®�½A¡“2cÕ€'@LT»^äåǽàqåh™ª&|y¾Ç ˆ5½ä ³p�boåE3&BB°$0fZ¸ÆfõÝÊDùS ©�\Yñæ‘Õ‡0A*\}Î µÔÅÌb�2èG®±DeC#p°“~1çÇ��®¬F Hñ¡‡¸Çšv™ƒ�eîp»lWRy&Ôç60ÛK(:D‰½gp�y&¹;žé‚ãl,…K c÷Y˜)ˆ=k­r+X0˜Ÿ�ãKïã,zî7DŸ…•KìãÐÞ-áÆ£Ü eôo½�ˆ>«ß¥«�4MȽÇîÙÅoÆðxÕó"`ËÛìNFLŽ|ØIçTÂ}¸P O¨•ž{­ø~f‘Ñ3gØÀ0(àƒpAöê�ŸdĘ`Až±PÊÞÉ-¶V@‘÷K ûcö€gÆ5®²ˆ„¼ "&$øs©cß½K¨–Г¬‘ÀM‡:Í6[€¤H¼t¸ÓˆŸ*ŠøÂêÀ‚+�0æ`€(ØE€]¤yn>u|¸Ñ–Àº9`ù +Ž,Aò í’£MÀKG k†b ãx×ÈQ͉ Æ#_K¾4\vP…‡KT2(÷Ðó#þ/Sí͸µÊ0 +N£Ò¼z×Wn�‹#6òªcmÄ'ãLH¿Ãë\nؽüŒ´*±‘ªz€Ž~¹®~ØŒ¸ûpäLs?¸ìcùM_»Ø¸rí#Ó��,"ÔÁCÀ& –ަuòøÕ;lcaî—:™Û#þÐ(gí}ðÀ±‚°×t02|i»ueHgÞF§¯ð¨à îdl�CG?HfÛsþ� 5ŒØvî‰e2 µ‚ŸÝ7«¦4=ÒäŽ%f?Úô¶0w:˜jš�o>TÄF4e©ýÀtç±|ªøq†ÆCSrЛyˆüê66|6ØÛîÐ}×G�P„ÂÄX)4¾Èñ>u<8Î%|v…_@NÈ·à>µ~ßnÈ"ûÛþDÓœ(Nà=Sõôá\ݾq“8–K«@VÝÿëð«bÊ™$3Bî p5-QíñbíFÔÈôÁ A<”©ÒÔ«‡vRÀ©G`ÅHŸR�þ©¼ÏiõW£ÄMqw9Pc]…H.Šb†uVF™TŽã ˆM‰÷1}×ð ò¨c|k›6Û‰ÅÜYlrçq�8یȫ ¼ÊÇC‹†àÙd·ÖØÕ�Äéò¸©äí1d2Ú#áÊ›øé33ó¢p¤Ì\h5?ââWnÇZÝ©ÈÊ["l$ý¶1n$øò£üLE÷•¹3©‰çPnÓ Îá32 $ÖÚU†5S"ƒãW2ELö¸Œ±´@‚DV¦öRC^uÔý)WµÄ�¼,'¤�LU2âL˵Ô0�`óEb‹!¢à=ùV8Ô™¿�.>Û&ܪˆž’OÔšfį¬ùšÇ +zq<)•B R6i$kð҉ē1øçKü|v;E§ç¯�0Ä‘ çå@`ÆÉø�OΙT.•�¹Èá½Ç ¨Ûã·w‘«…#àÇ’ì èn?¤Èò:Rÿ›kLˆgYOmNµ��o”CâB-un:ŸqÚáßîl]ÀF裔ëAûL,ÁÎ5'œQÉÚáÊÊîŠÅt$G�áJ;>Ü9q�w6­O‰£‡¶Å‚}´U�`ô¢Ý¾']ŒŠV‚$@ÒÔS=¬6€d�IÝÈýj±F+E¨Djk1 +¤“j†,¹[++c…€U÷Lôެ`Eg.FÐq&çM-xü*±X ã\ý¦ƒyfbÀL–·‚±µUÓq™"¹v.71’�s:¹ý)°+¾ã>VHU¸²‰–Söêm:ñq°C‡cÈÌü5,çĮޗ?»6õ•67±ƒ q§oŸ¢ê­rK5Šqbu›ü+¸‰#¥rwXÏ´ÅXˆRmÌ áK•w÷Xñ’a‘ØÁ#ÿ­±À�hõ_ËKU;w÷Á&ÐÀ :NçLûv±¨$…n§lʯƒc7$DèI�gñʹòJwˆ7˜lYLM†Óˆ©ó­†U,X/7™Ö%n³ÓSwï5MÌvÍÔ¹‰Òàˆ6¡Ø±Ý�‰�‡·�¾¤ÓwÜ;bF�/‘qQy°úÚ&"mö¼Ï=• Ê­0Ì_rŸI¸ˆ;mϯ=h·o¿ Vg��cqýۦ⠘òŠºY2áB`"0’Zì\q?éçOÝüØ—a6É�.wz_"+}Ó¢Ëü<à vVÛ%É*qé$×BöáÕŽãºXnžLyòé[Û’Á‰bN·?§Ö³¡Ë˜‚ÌÕ°�÷oñ#†‡€®V'>è!>”.$“êõsÿ¤xñÖ»ðá\rF¤Þç�G.Tp�ÁíÿcRw¸“nð£qlk=7�ÖŸ·LŠªYäm�J`[sã—� î mõ°ê"ÿ +Ž>é³vøóT:‹7,Ęu5NÑ˦íûÁ2¤€='ÂÇ¡®ŠæîäÈ€ ´ˆ]8ýÞ)Jp�×Ú¢ï¢ðî8 ‘´ñ—bÀ ^>5,-Üû›ˆ}¦uÙ6µˆµwëPqÞ4QÄQ<¢4ë438íðd|—¥Œ Udñ:ÅK,¢�î{h Ì@Ÿ‰°£Ü·s�1¢äXK0¼oN ´Ÿ�v®ðd°#ˆŽzq¥Îå�@ÒI1´F·§Œ{ÈBfcçÓ¸q‹¯#ËJ—÷26%L®.YåT‘imr:ס\}ãmŽV@BƧH±“ÓåGar�¼/Æàý¾4¹XŒ¾¬„ B/9‰cÈÚºJÌMâ5çJ؉ubßož§ò¨É܇Ü)iDHk®·Òô3gË·Êïx±ÄcÀ_äyÕãÈI˜’OF:¶®f kJšwDH+ŸÆ¥íf,!¬’ÖÜÇO·—t¯Û>BÊÅJ“ ßp ßéÂ#Y’ç1öÊ˜Ü øcå]˾2®ÒÄA++ÂñGœõ¥Ç‡3÷Yh´)�Ú¹µ¦ß:)Û¶3‘–%ر�•GÉEI{\¸Êìx +d‚>á·lŒ®.Ù‘Ü&I!Dð�Ç›fRò_Ò?l^|ytùÕÆ•&Äìá·@¯syò�9‡i�_+Œ‰ýÅz¢7\ú½_wJqÚ;"‡a*Y�æ 4$ÛÔxÕö¹Ô�onJ¸²‰'�€œzùxUH:Úž¹»œ9²²n©´“u/2 +ÿRó¦î1dÍŒ(` ©$‰“:HúÐ8²�¡Y@‚¤“w +wLŒlðÕ«R;ªÀbè6˜�+Eµ.ä�¤�ѧ§ DÐ�X +1€¡£Z+δQŠÑfD;¥­xøEOù'5;vÓ{ݲ¤É6°â•{¬å¶{cw>‘öîê~ësãvÊÛ$/ª& ŽxÝòšŸoÜ6W!¶@‚­<äGKyÐîœ ˜ÁRH2 ÙdªùßÊk7s“q + �¤È,dŽ êùÙÂn7'A&&ßJó;Œ™±92¨b¨YvÝ›ÐocÊ~5Ü;†¨ð�`XÏû‡�.^ì¡€/ÊÂâ@šéWônkZOJŠåÌÃpQ÷É¢dt¿ÊŽNà¦E@5�æ`˜4;’N¡‡ìm@ƒch½9gS`»Hn7Ýá2'éClŠ +ä(ÍÃl‰ÓU¾Ýy›^‚·r—ØgP ˆ:êMÿí¿J>c”ª�¬’4ƒóŸ…l}Û:™ûO! 7çOtU¥` ;/ŽéÒü)“6ODƒê‰§ã­ùNïíò�V¿*ƒàw +‘¾lf2 ‘¯Âœ.UÊ_lƒUçeíû“Úœ!•B« f…€L‹OÆ:×FDÈs¦@¤íFN½�μ6r¢=ü{U1®ÑiÜD/~7§Cc£\0 øEÀÝ:ó2xTß–Än}¶Ý6õzYO‡Ý4Ù}̨ɲ7#�©‘Ü#€$‹Ï¦lxp×ðiðã�/Ô“õ¨gÇ™²€ê'h×ö�LÇÃæ�‹>c‰œQ‹À3rŒ›òצ‚mÐø÷ûFè`‰ÓÌùÔóáñ·¶B±9¬þî"ÚÇ1æÆçÓ�TÁ;ff?Ëü"ôÏ�Ù‘“l†îk�IàoK³#6òŠÐMÏdž¦�i…»tÍ€'MiG¹ÃïŽ~D~u'×#¦B¨"8ÅI¿MµG\™eHX‚ ÁžQ�ø8•Ð +ª€(¿Ê›6!˜xá~bób-\™ð÷Y}¸öÄ-$Ú&-}:|+6.çvB¡ÎÓ¸ž +.6ÿ§�íÜwD_A +~Ño*Ý›dd°}ǼßïnxÛ^¶ª…ÍŒª*©@ÜÎwèz_‡‡ñ{Œj}¶]Û¤–$îЛ�v‰á{i+�&\¨„I_Q‚lF›£ÄØþUÔj î“ýÅP#ö±7ò$^åÁííƒê¾íÄ“%@�‰<¨¶,¥„`I ¯„/çúS·º‡j"×,g¯ +\]»Ýœ�ÄϦ`iú §Û™ŽÖ +hCO Ø}i,«�µ®M¾ô¤NÛ6=ÅvË0b ‘ö… i ߈íK†Þà�‚>Ñ ƒz¦îl–3K€ëo*ÿÙendstream +endobj +169 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 24 /Subtype /Image /Width 248 /Length 1165 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ øÿÄF!1QA"aq‘�2±ÁB¡br#3ÿÚ?ú™5Í“;—…GœwsowNµ°ùî²õ»‰éT\�j¦¡ò¢@føšg"©� ØNôïY‰¼POQ¥‰: +C*1 0$n'QBºä[”‚9j2(:NµY2¦(¹‚ÎÒb§òRñ�v‰ÐLÓ´™©÷Rbá;DñKßÇ6Ü'h‘3FLɆ °YäÅ?u +‡ +ž³§­$Ï�(•`G�—äâ¹Võ–ûD‰hã�è?!”:DIþ2vÏ…hLTŒÈÌá$êcxòšY3"nÀF§Àrj‹ª‰'}¼jFde¸0  �£CéXäùjز6&VeR@�$ [&NÙ<‘èM³ãÍ601¼ªº×°L¥ʃԆ{f¯ÛĸíÈt¼jÆu Û«xÄP1Õ§P’ClÝA×§í](�tä’}MBª cÎ¤ŽºGJóýæ|xŠ÷‹L©&ÒcS1Ýô®†·ó1Äk�,ùÎ*ÛÅć´mI›@yÛ­hègB„�Œô®n?ÇÆ›@_´ Û¦õÒñÜ!�'þ`,ÏŒÝJÇ._Ž…û¥A1 $ bÝúíô§•ÆF0W³Gž�„ê:ƒ§uL>6}ÂOöÚàIó5ÕúWÃ@Uõ:SüQb„Ç‹ß”Ç E±åHÁs=Î"Õ€L{¹äG¡£ ÂÈe»fëƒLd™@ÂËj´ àÚ`\ÛƒLõëã.1¦7)cí³X#zкå + öÖFŒ�·žþ†‚1ÿì,JÉ’4àé]v… ¨Ôx(öÖf*}œe‹Z$Äž¦Ý½+ZͰ£J�DÁ樨"*ÇÆL•Lk®úý*€g¬EF\þBÛ‘Ç .†¤|L *Œk ˆÑcAoM>.N]CؼÏZ¡…$F†GŸ4Û9¨1È¡±«ýÀ1õýªˆž/�‹üÑWü@¥W´€“hÔÉÓ®ÓAÆ¥ƒ Û¥&ÄŽ¶2‚¤AH�*=ŒpE«É¤ÌÏ­Oãa"5�1 ë½QÁŒ²±U%v$ F©”0‚$ÅBü|Il"‹fضx¡°cv¸¢“Éi¾$È!Ô0à‰¦1¨€â4©\ÑmUP8LbH"Ñɹ¡pãE´*€:"¿ÿÙendstream +endobj +170 0 obj +<< /Filter /FlateDecode /Length 8438 >> +stream +H‰„WËnãÈÝë+¸‹hrê]$²êALY$€�Yƒ€¦Ê63©&){z¾>§HÖƒE¹³‘d“uë>Î=÷Üo^”¼ª*Å3RJ‰b*ËIQâ›Iš±ª*$#„ûB©¨ÖDeš*^ˆª¬*VeÍåðÓ× ÉþÖþ}øv(Ë‚ÛÚ`Rp%¬A"%«t•Ѫ •½? **n_„M^( {J­ö¨³GeÁìáZX‚qÉfƒŒQ†ŸºPö˜ÎÞ$”©JfZH ¿5!%] 2oïQëÂ#…ÐR +ò�E®ªB—ðnÁGQhFT©]ÌÜ›EYÚ$U³� yªf‹DU”±Œ6ǯ2©uA¥”œ•KÔTê²ÄU‹Eá³(à™õQÛ, +ŽÀÄ}‹4¶G“ªHg'Ëìå )Ô|Rà ¢ð,g°A5Á1-´OU…„mÎÅbµ„'b5­Ó9gYü9¼hÖf‡Ÿ?=Ðÿ�ŒfÏ’=4>Þñ‘=Œ%öûÏŒgþ(´Äb¡+�/^!ëºâ…¬´È.‡ã/õpz¯“}zøï!Ÿ«¬]Q0  ÖO‡ã—¦1g3ÔS?Œó{dy£âî�ç~Xøó6mj}ús;õ]}GyÁ¨\~½Ô/»ÛY¡…;ý¯¡oÌ8¶ÝËzç¶Â'²c³B׬tBÌ.Øf‰S†¨*ZTT«9mï/õÔö�‹�«Ù ˜¬n>Ÿ‡þ’}âê8½Â]~<õÍíbº)ûôÛÃ?æÀ�!*�2çz¥  ZÿûíÖ6¿Ÿ¿û„-ç8zÜ_fÒêxíÇ|±ŸÓ­ �™R./�íÓÙ|Î>åœëîäYÃH[¯_ûÛù”„‡NQΧ®ŸbW5©Ö¯õ›qçðö\&ÊõéÔ'6á^å@1ôS=ùâ,—Ó¥-ÜrúÕÄ—ªÒå­Ý`b�'�·Oiòrp`Ö‹ÓS#3úølÞÓİĹZ:™—Á˜q!Úƒ²]„ëU¸A;?.õï&IŒ3—»vr×› PÇ]�¯fx6Íd��óã8 uûòà¤ù|�G¬æ>×\¢ÇˆLsé=±9QŒÚœ0”s†Aƒ`»"ñ +¼ ˜óêáÕ  1‹ Ãí˜b\Ñ.m‡r�w69Ì8pÝ…á¨ø]TúRél)¥\ª�FfyÓÅ}ê;“X@ *W‚úy2CâîÒ¶Ø-ÝÿÔÔ†¨¼åŠx盺ë)…®£•ƒÇua®¿®�W¿maŠÏá^[)IÄ\)l©u �,.¨+Sß5k…®i-ýæLª®i­ÊRø¨Næ�ÈçÕrìs„#G£E©¹<ÒåÅÀ öw¬-c£ÂŽàÙöÍ$Þê©~ªG÷MB9ð„°ò¸U1¼ ŽµÌ›¾ïAQºž¿�+fò¸ôV.¸wÆ=,ê]Ë+éœ:µèòöé6™Óš!!¦#Ö:šî­úΖ"¹D!�>W?›¦†›–:˜ÍÕ÷4W +iq5µómϦJ¹&éŸw Áu¯{ój>&Q—g".~Ó_®ˆ<>L7¶oæsD®ôm{>÷ïP/[ñ– TíSíK�-ê™ô‡cËò²KØÚžùˆ«”pžŸ§%ÕIÖ’É‚NS.±õ´C‘wb™^¥}ÅPÈßú3´Æ¾ÄÐs«±·Öι„/Í�ÓFßDTKt,*Žï1#{.gÚ£ÁœnM:Ó1@Ô�9äËR)—–úz=·ÍìË_ÆÄH2æÃG�À—\T÷vyŽA–†9��vôÆíŽãq5&�8AX<.¬“SNŽõ)ð�7Té¹�¦s4;ÀÎ>oõù¶×Šù!kñ——dIV*Nì–´©Úš) CIE\­ç[ר7UpKQÑ窌‰WÆ”,%a‹,fvG�˜Ú.x’”šYUüxü{;KvAŽÿ4/íS‹€W’‰Åö}�­ÐkÁZj»á«³}mÏ;)æéÝÁãŸbÆ]jGÚi³µãxÛ‹áÙä¹n<*Ök+R3‚Œã¡Ò+fó”âPM6ò*4|žy½¸ãI‚(œ—vüí!´ÎØþi>Ç1ǰ�ßãm&‡Mаe'/íEœvñ?/·TÅXyp™œYÚ‹²(13"p¢�¨s*ÒÙ# +G'_÷’–ù±y8LKÈr,‚\Uðu»- ™Q¡ Eà&ª],àêΟ »¡ËlŠYªÒãæÙÊóö-…¥rNeì[®ÙdY°(¾ ÄÀõ\ï·@â¥Øø}œÌew{ ³¥0y…ó”Â:^ûyîî–\‡7WE£µ›ÐK˜È–ЉÛ²”J̘¸æIPž7™tܸN׺kR ? gN&té{öžŽÔ~«D¤·ótO™íì»Õ Ÿm$ÊÇœ£;Qd5 ¥›p“íAV쇩i¤mžâÞX]PAÎ…‡½LáÔ¡Ãt¯q}®lÇþ6쎫Òy€Ý“|½ +s…q¢÷ùóFY±Åýuj/`¦Sâ&‰'¶$KÊ”£%ì>”z¨/‹IÊb�ê•ÇJÌ¡ˆ.„'3NÛ$€vÿ( ÐÆÚ¨±jiCÊ¥‡á Z­KBÃfJ‚P +Г_Ø´Æþ’Þ�´}Ì^–WÔ7n=ÀF%—eiéX(>²Q|7ì„;©í?DQÓwÓП‹ÄS]æZáëP{3v£IÄ0ŸÉ;Šœx6¸ôˆvHª ¨‡Žï÷ã¹D7ªý|»£�ƒø»O:^A7u×…D…@}INv­™Z³¯HX”l¾ÚîfÒ¦ ÌáñV“¶kS�)…Ï Jµ•"Ûž•óò‰¹”üJß-ŽüVÄFiŒ�´8tã<Ž—Yj¿©ÔðÂH Qa<¬êïKYÜ _�K(Æêæ ðûŒî?ÕOV72íXU”~4®"Äï3ÖWÕüÑŠˆy£X”¿­°WX,}¶™ÓHhþ#R÷ð¹“Ù0y¼¦ú¾«/÷&°ål74º,7�ÙQ2´ÊyWzÒNmAqzê«Còàúe¨¿çh‡UÌ‹B�ÿ3öÜ}·q?•A‰ÌaûN—‡Kí¸!›�û‘<ÌÅ$""iéÙ¼Ó@€Îwæò8™æµk¿ÝfüÎdˆcš³À%w^þºg|îæ6ú÷­Ãt™âg36eUFí Mm¦×‘0…¬˜SpÈ‹!Y)_¦Ýœ äΔîr—ѺiÌâ ì&}¸‚ù+ +S|Þ‘_àùºû!+Mæ|n_Àðwp«Äf+À‰!)¸—]Wë®çéUKöq.‚#÷VH-ýó +ì¼Ï#1§‚¯íÕœÛÎ.U¾yJ ÷¤ýîU>VTY˘„;óÇ´ •Pgc´ëEß~KáË–ba@°ŸÙ+ÅB“VÈL‚4Ws‰†¬9ˬ¿ø°VÖ¡ºZ¥ÜzÑ—€—wÉ5Wteq´ÈmMÒ«þÇxÕôFn#Ñûþ +ßâÜŠHŠ¢´s +v‹rZYÀ¹›¶…Q·:’Úç°¿}‹”X,RlÙ‡T LK"«^½�¯zlŸW©ŠìÑŠÙ¥¼EÀÿQ +bŸ+]Sôw°„0•�?GNí‚Ø¿D#sôkÛ_buÕC?º ä.z ˆ¼p ˜†æ4KJ˜ U6*$«~Y|Ï®ä ݆’¥2#•ßâw¡ñÞN \ÇXXDÆJ÷ô*¯ÀA†…®6€�Ú¯B‘,ÝÝ@KF"7»Ú˜örð×î€ÖbFý€…àU2/Q²B’9h0ú‡uc©�ß;Å]€�ªŠU𸴋fV Ñ,¬®WFWÖ:%²R +„’–ùཔ +2ÑS¿¶ÌHCŠÕ &7hH›ùQÏ£ŸäúS7ö1iƒœ¢Õ[,ë¸úgn�ˆå%4V0ë% ¶æ¹Ú}3…+éSj ú8’u›©ÙÁ]†8èÑŒÒoV/>+]½æ±¿,Ç% ™ñ 19x•ЏÁFXÎ((�ÍðMOÀ:{bü$Њh»wxÏ¢N‰¬@Yúù~´9ÄÓ€ã3¾f'„¦¬¹ƒæþ¥é:}2�܉ⶳ9"ô62«¹×Ü`'dÉþfÜùpC½ +†&B¹zòýý–ýþ÷ø 1k«2ÖŽ�ZX¦Ö³¬Vk�ÉŽ¶‡ g›öÀ„>ë-ÁØþµv ¼¨\ë «îDÉ\]ǸN©‚™ëc?ÄNœÚô}?N±Lñ¬¬Åzq¼²;.~#¸8í¸b`¦·~ø�Se©oìú·CÿvúBà­cªÜLË`¨En&S/C埪Ìʬzøè‰Rc]9Ú• $6_@Ü¿¯âŒG nõxÖÚíͲÏ(ˆ�+%fº¨‚>è}y_Ùr cßZ?…+no²Ö}„çƒó­» +bèt7ÿaA°c¼ô¶ç8T*¸¥ƒK‹t_É"–NÂ+T¸ë?µ+Iåð7üéÉùa¾PFuûÖžCDÕJøq±¹DÈ'oíô²âð’#=õgCÏF3wEQÜýÌ×_â]�úƒ;²ÀÑ!yùÓC97© Râ eñ (}Y=ºe/4I ‚Zõç¥éÚé·Ðç»ÜmCÂgqveUðÅ&8‚ļÝUrQî"ˆ·÷/m¬… í¹D8ÎVÕ[&aÆýÐ>ÉXÎVe2:ÙŽò2Öí[ó-00j×:dòŒI„˜âI?¿û›S$Á“‘ µ§§î¢O{ó&™pð‰%=øôÌ&¯‘wÍpv¼b·_ÿõÏ…�†H±qÀÒÓèMÖ’bÀÝwõßR9¯,¨Ñƒ0ö+Pyš„Ñï/ã:xp‰ã´—9¸€ö<Æ;º$ñ†—ÑBHªÙf†’0â5"iqŠ(ç�ŒÅ‘g•`An1\[,Ç +6?–äÅqK`GM4œ¯ùµ}n§¦ûa¤d^Tnzú{;N)_�þíÁÐ(Åݨ‡W —c0HÒn}fHm"Lý¾ï⃨3—ó¹b×MÝ#Ì` Ü‹(©Å%G_[χۗf8¼5¼@AŸ÷{H\°ýàvˆË„9R‡ç¿ýxÏþR»¹²gÊçDËgªŽ“7¼.²B”$Cu•¥ºk0ö†�í�¸€&“ +o6§Ì�…vòû“< è�[éÿ+�q¡H]ŽÎðèŽ +c¢æµÈêÚ0µ*xVKnsü{ÜsnàC*¼hI¸Õ9]Ž�Úq�0ï&~» °¯Ü°‘£øZçÎàŽz­mÎç΄’AŸó³—™,²/Dr�–<çK;1¬vöƒ+{•x/± dW�'B7�qûú¥„ý}°–¹=]ŒrÊ:‘8sú0sX}Õ.ñÒ€ÇWs¦yµtüÙáM˜V“MÂÍáy¶³bÜ8dRƒkÃÄór½¼€#vCk08�5YÓ¡ïb�Í,E Æ!.xmÁŠu~=ª‘pÁä¶™&}<#åÃP4¿+×D d…B`?á:pc§H zÃçûÛ‡:CÜ×ÖÁ&D|}Ck0#˜ª@·øÒvú3g§ Ü€¸éW¿*Ìl©f�!©Õ’ÚêdÎ<ÿAG:— +�<`Œ^7è%Ÿ%µFgÜéWí6Ò˜JZCŠ¡¡)& ô†¢rc8ë$ûØ€BxK‹Q¬AïJ°çJýÔžÐ:qf�Õò†ß…Æ!•Yîò5@ªÉ ¼ÁùÉá‘Y„øu¼ÀsûAcë쯱F8�ʯªŸ©°7ÇêÆÃØ|j+$7� ¡ÐZUZ5„7a×»A+’(ܤ1|øéÞÅìX½Ô™—q¯Ÿ†þ¸q²ƒ¢rÏœ{çõ©?Kb—+쉰Æ:†dЙ»/%DžÚ— 2“ö·Xƒ% c,f§'Ü7ÃT¤ú}ãÂ1�µÜ +V+O¸1KfÊ®# Æ¢\³~í&xõ¤»÷»ë ã/Á‘»$0öOÓlÞæçL;I Yìxî¸ãˆ±)-:®q�L;¯�¯}m¾–>°Ú«‘ñø4˜¦Û;�–¤[³§ö'›}¢Mö›f£²tO¿µÓKAíBÈxñò†wŽº¡ÕO>¯Q�-Þ!o†¶$R`&)ÌŒ—†«lÛ”`߸G¼BÊÌ-+…×ãCóþø¡D sžO©AZq€Ù7§S?e÷X\ºÀ_€b{ˆCxwËsK úFcë´å°C`–œÑVŸ›¡9ÂF>˜lƒ„pZÅt•2Ž©TŠ’gDí¨ÐNŽï#xªñCrHF³áÜ¥ëŒ(šæuWîêãÝùLÏ!åH<{¯…I;‡‰$°�Ã×§±�Z=Þ]Ÿ B¢ay5ƺûy\%‰º²ˆÃOûÐþ…îÆª¢+Q ¸wÉ(»iû‰ã©SØN‘®Ÿ’a˜#×.ø£™’E§ˆ°7d,¶iФ=pA@b9{SÏ­tb�ÚÆj#¼Ç3OÊ ,œ�WÈé~ü‰èFÆ)ÐOÄ$(Z%¦×1Ñ^kÌY˜/ïI†cìÆ—ˆ² ìrE)Ë}ÛD…E…T‘h··Áå®J¹;…j½i�A~ªz…TVÚ»`�¾$ÜGÇè¡£�[ëÉ: ×B¯ Ùãº+O/Ý Œ°;‘N'¢Ó„$‚~jæk Q(Í8¶þºI裗–xÀÆ7Èr?V{V¨u÷“ö»ï±ÛõoÎòXÊ÷5¢–ºp�h䯄¹Ú†Ïøð¸ug�Œ%8o­æ×0 $�¢(¡ñ 5JÖ*“ xÝ$�ÿ~f´«ØTÈ2S|õ²·ötÀ–1a…5JJ?˜‹]jU�ÊIè5Yíc þ�+nh�öÎ{¦c3|ÓÓýÆ<•Ù�©Âü£Þ7—ѧˇX#KQ ·Kq^¨ËZ£œá£OÓõ§-ÃLàî=Ïl¯; ³†¡ƒÓ,ûq³iè•ÉT^6,,E¥7Ìͱ¿øX»¶�¬J¶Šµ›…Uöì»×@§ç�¤:²ÿÈÌpR-Sø} Ýý@‹ÊÝ‚êHÒX"MÖ6qšÔßÏzïGº‘Á,ÖjÅà‰ïƒóÊO²E³³6ax& Ô’W=NGГìú.üxÏþB¸¹š +>SEÈ;¼† Yå¨B@ºP³TqïÙXÙEÁºEõBÇ…ü¯£7Fkr… V®7¿ô½áTÌÑÙ|ô<ÉoBqà·èÈ?uÓKy~A±ê�5èf\‹k~¦Š;æ1hîôgöÆÜSGzÍÀåê¨ó"I[ÖÒ�H®JJ#ã¥ÅõY[‹À'á­4„Œw÷=fO‡5ºÑóó¹k÷�ŸúÓ݆8Íi“—4žxJH gGÉ[VèOqÓ¥ÕP¬Aó ]œ±YzЇMâFB­‘¸ûÓfû�æú¡=Æä´H,X@)SÓâç„=Öèsµ»×Óå´7Mqç×~ªÈdé† |ååÞ´AÛ™Ÿ¥#™*“Ç唹·jŒ+··ù¢‘F¾×¬QZA®J‚ñâÄeXFݽE�®ùž�‘—ˆ@;IÌ�¼Ÿ“gI¬¦P¼Ó½}¬©ÝÒ¬hoÄÍÁ·=Ƙ +¨âà +¬yâ1ê˜jUðŽtm`©»Wá¨Ê/t�­a¾% c}C&•þï#/¦]gì>düzœùWÔÇ3B@æv7¦~ü-~‘ðwœ±þcµ‰œT1ÜQ£aÌ µ@Óœ=±³èÛÔš ˆd+Xt‘å“°4'/¤û(Íbòr�GÍ÷ãðøxz¯Tè¹S_ÿv¯¯‡o�«Äò®C™Û'—š•Î%×,´fBûÑ€1º– ·ªh?�þ›ö-À.¥¹K€f.CÝ0b®Ê'——‡©³†ÿd»áä —[[;4õ„fÕ4Lç°T]á‡,SCO;=bœ44És}­{ti|æ0z�2&¦ÕSå>³ÉõÑ�q’X�ÃHÊ/ÍØ]« Î&Xñ½ž )YøO`œ«9ÉÑT¸ûðmØ=ž;0Y–<Ö—Ði«€b<%|Ã/ém%€‰!JtÓ×-(æ­n±?·�JÁ„\ ^r¨4?ç>d÷vÞzJ·IèLíµ²*´v¼éñ ćø9ÞE´€êg ÿåˆKE çVóó©s©ú/5nÑÆ€å”8»ë¯Í0bŠ·p °…Hšj°Pþ柿 8ìË$²"¼gAmàÄ#ë@¶,.X“_ Ÿ7jž$®y×ß_›ÃëãÆç7hÇîpwn’œæÏ¹4°ï ´²9�$ Ü–ezp{`}ü¼åfx¾úØŒì¿[Ž…Ñz5fâÆ„É’•˜àcý•6)S>ñåL#z7W¤'ŸHãUÇÞ¬<б«—j f_/ž ãC©üÚ¶M‹YC.GO»×åb ááR4ƒÖúÚœƒºTfžxŒf…ÔH™¯}w?¿Þîãc­ä0n‚¨új¬÷Óƒ3Uļy,ðbËfx×�Õi!ÉÀ°ƒø†Ìm(O…×H0²‹ÀùÀ—-™û‚`ŒVǼ`^±Ã+mP‰ë­<_íÂc¼�²}И2Rgšÿ0�EN8óÈîvïoÝæÝ“°ë‰©'›UñXŒ Ý"V‡CÝÂGB�D&‡ÊÄj6oR: ]”tí¨ÀkâpÙ–v� @õè¥ Ÿºö;‚³@îÇÇ_¤C–Ð#ybèüÁºgm4}° ýÜÅÙh‰ßöuuÄ 'üÿ1úœðoÉèG6Ú—'(ŒKû’Ð'ëQ§½ýbŒ:+K,³™.g-T¨ò >‚µJék…1Êáô߯ÃYÀÁ�{ ÄȽ†„�½£ÊÅ…HºU=ÖCs¾’8ñŠ<š0Gò¸?7yfÖ–«¡Q‚ë:jk"‰erÕ¾Ðá‹7 [à® zO’nƒ¥ + +O¨¶ ¥ Ÿ0Úßê~5Ó´óç›íE¤r�N£ù»ŽnÃ}Þšú³çk�1žvhös—¡Rœ¡³�᎘/¼¡Â¯­=µdyHÀ bêŒÂ–ñ”-©Ã™`Lj +š){s£‘f93oÚÊ„ñDŠ1Ò†¦±y»µÎë¸ÅE㌉â¨Úîzšc¸°Gc•U!œv`x'?ŽæÍO»/Ô½øQÑ)¶ø6‡¹„öLž$üŸ1ú<" BMPõ¹ïIŒÑÌD(ú¥;ÖaÝJl5|Zòr®hÊ)‰Îš­‰0I©@Si«þLמI1Æ0S.]÷1`첚fP$çDÎ)–3<5ç�RµŠ2I[³çq¯ê­¡ÏG e®;m" �+lÚîæø…w€W1ÅEåõ¾HTs-d´Ge3.êÑM~T@�Ø£¸0%PT€êºT׿v·§�¬63‡S)Þ\žý¶a篷•„(¿ QŒ–4…«`RÝ“÷¥–Ì\ °�nsBÉ­™9µ;ÌfÖ�v»´ÈÌp—e¶’YÔg‰Mpé�Ádæ?€qñ×q¨žéÐ].Ýõq‘4|°x$ê˜uXsëýŠõÒ=�×ÉŠ"aTF=ñ8©Ó&\2Qr¹/ «¾~lJ€�šÈ Rrëëa÷X!;aö"[8×ÀI 9)Ñ,5váp¨Zè«Ï›ZÄî52> +endobj +172 0 obj +<< /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +173 0 obj +<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +174 0 obj +<< /BaseFont /Times-BoldItalic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +175 0 obj +<< /BaseFont /Courier-BoldOblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +176 0 obj +<< /BaseFont /Times-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +177 0 obj +<< /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +178 0 obj +<< /BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +179 0 obj +<< /BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +180 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 624 /Subtype /Image /Width 8 /Length 423 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ pÿÄ0q3�2ÿÚ?Ó0ÕËjå“ \±†¾XÁ[’`ðä`ðä`ðä`ðä`ðä`­ÈÁáÈÁ[‘‚·#nF +ÜŒŒŒ—nF +ÜŒ¹kr0VåŒ5rƹc|±†®XÃW,¸jåŒ5rƹc \±†®XÃW,a«–1UËjåŒUrÆ*”±Š¥,b©KªRÆ*”±Š¥,b©KªRÆ*”²â©KªRÆ*”±Ž¥ÈÇR.JºŒ•u.ZºŒµu�–®°3UÖ š®°3UÖjºÀÍWXêë=]`g¯¬…}`g¯¬á_X +úÂúÂ/ËÇXCåã¬!òñÖùøë¿?aŸž°‡O*ÿÙendstream +endobj +181 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 40 /Subtype /Image /Width 184 /Length 418 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ (¸ÿÄI +‘ÒQS1aqÑáÓT!A¡"¢CÿÚ?ýJµxEy�ì�*õÇ¡ @ +pߣÐj‡"¨pà®GWLxEzaÐlB‚9#‡ páÂ(páÊîWpåsáÓûšøZÒ2‚«l> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  ÿÄ?!1AQ"ð�‘¡ÁáÿÚ?îíý�Ç[¼Š“>>Ï,^'ã‘ë¦Õ?½Xh‰6Ûå¶«"�äsôÒÏè¼zîz¬#²“qt>åx¬ä ;‡Mo›‘Øà +À'#ýÿ;ìdfÂY`Ä•~´S!‘“b¤uf:�2�8êYm€4 )9=Ã€Ä >£_ÿÙendstream +endobj +183 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 16 /Subtype /Image /Width 344 /Length 431 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ XÿÄC‘Ñ’SaR!1AQqBC“TÿÚ?õC/¼¼Bc‰[àI�!@N%|yyÝv^pvUOÎ b®pcsƒ/¿Ö ªoX>L­ŽÐŸMÛàS�åô?³GòKi~[Dûµ4$¶šù=ìR¿-¥_ÒÒgÒ¿-¡CJþõ;òÚk{§}Õ©ÞV—yA®Ê²^EÝQÌ’ò.â“úåŠ.=? åŠ +´�êQEÄ—©D¾ù|Ð÷"¶‘Ï¿ÓgS¼­í>m;È»Í>l—‘w”3d¼‹»¡™%ä7T3$¼‚ÕQrKÈn)fKyqK®X¢ãÒë–(cSê–(cSêQÒuKâÉÔ¢\I|ÔOÿÙendstream +endobj +184 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 5 /Subtype /Image /Width 31 /Length 210 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ÿÄ7�Ñ’Ò‚DTÿÚ?£óy>eºNäC×2‡yn“¹2Ç’É©–IÍX�ÇfÚAÀ¯ÿÙendstream +endobj +185 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 5 /Subtype /Image /Width 176 /Length 494 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ°"ÿÄt  ’â!1AQ¡ÑáRCS‘Á¢TB‚3c£$ÿÚ ?ûêÞ ñoÊ]Ç o)H­¿X¦é#žW#UJÚ©”�7È5j¦R£z¦R£x¦R6x¦R6— �]¿¶ŸoÒW2€´Ž&üRwSùk � ‹`¡uüº@mÿ6+Ôý¹&5ƒƒÖɤH› ­“H°�xü3€XH„{V½Ô"¯§°Ïlæ,å_Ná÷ÎbÎ#ÿÙendstream +endobj +186 0 obj +<< /BitsPerComponent 1 /DecodeParms << /Columns 2336 /K -1 >> /Filter /CCITTFaxDecode /Height 3113 /ImageMask true /Subtype /Image /Width 2336 /Length 84565 >> +stream +ÿ)”ìÉMKX-£ùZÌ’ô Î +ÕœÎÔ³bËX¨X¢H3²\ìÔ‚�­]ªí'Ò}ÿHŠåHÈ-ù ΃$d1“:Ò'3h\Œ9 B2õ-gÔukÔäü�C¡œ2€ô¸F0˜L"c„GÌGÌ'ha˜!Ƈ(v8"e?µ��¯2'�¤�mSHU¼­i T±ª;»5U¾ƒ&BÚ Óâ‘ÙV+úAÚ8ôx„­UþÕÑÇ¥‡¤íÒ8éP^•¤Íç�×_S²[ü–£S!äFÔõÐZZZ;ÑÞëÒ½ÒÒxZ mkGzUA-t¯êFÖFŒˆÉð¹ÈêD˜¹@Êq‘ˆŒ3æt�4DE¡Ï”`ó‚æÅ<Êy—C@4Â# ÖF€i%®––•%¥JºZ´•.–’Þ–•¿êëåsRDJk.eY.$Ad ƒ�ódˆN<óXe@Â!20�†lEØaÃ8rs3†ØÓ5G¶�”l`Ï™¤Má®´›I“h úZI%Ii.ÂKë_Z´’Zn—¡¥T•uêd™Á4Â5²y4Ó „kyù!a¨AéªM¡aܘêE†“i<&A6îˆîñ ›‹vYu¤ØI§uI¾ ÒN“ÉsI†¾«Z^µ¤)-kIXþ:[õÕ/]?TGm“8A´0ƒ63�-–zM Ï6].“h—ÛŒ¹º´�[I÷„ÅZÜ&ß§ÝRkKõñ¦Òñ£¢ª•hcJ•uîµÒVÔi/I/¡PNÒ¶a4Ú¿¥u~é]뮓}Nª×¥Ø¯î¾–éWnÚ·jˆ$R‡I%J½i$ÚÕESt’JºZýÞõ°âõ×û{ø«nÓû©-k¤>×Ç¿^—úC¥Þ×{×x0¨$’é%]iauªJý*ZH.´»OÓÖï^ëµíWÿý/N¿¾ˆsüxïén�ðÿna(AV ‚¥I&Öê»^ºÁë÷ýmÿúoý[ÿô†¾ÿþZ¬Ö¿«×aüBê!uéRMî½>ª«‚éiÿÿõÿÿÿÿ_ÿÿÕ¿ýcÛ­‡¿¶lz饅 T-k$N’«Õuãu×ÿÿUÿÿÿÿÿÿÿü‡ƒÿïÔ„ðßøm^¤Ëª“´—ªmSAUk¤O®+_ÿþàŒ?ÿÿÿÿÿÿÿôœ?ÿs;ý\7þ �ÿúHïÕ-¾Áy¾´µÑÜ-/ÿÿ„ÿÿÿÿÝÿÿÿè,7þût–V÷×IM®´³jŽ*KéE%6—£zê¦Ömj:_ÿÿKöÿþ¿ÿöëÿïð–ÿûíðÒßô�ºÊK”%ÒI--r„nu1ßK×úT•.Oßÿÿý/úÿmýïÖÿÿÿ{ÿ½½õ9¿^q;øJ´¬/¥ª®“iuI]iz¥ZZZZW¥ÿzÿ×õþÿÿïßoÿoõSžÿí÷Òÿ«tµ{i*¤è*ÒÒÒTýa®•¥¤ºJºM¥«ÿkþ¿·_í¥ÿí·Ým¯í™¯½t¯m{ÛûVÒéÒµmm*еXШ¬$Ú +ê!0é +ÒŠ¨¨qV 0àÿï_úû¯ûׯöot˜gþïí1ØF‚tßa;M³•Þò á§V“it¦)iˆTÂ… B Šm*‡Õ¥ j¡1 +[ôÛI>Ö Û/mÒz­¥§l‹”ئ6LS#Š„ÕŠM8¦!1M¤ÆÁŽ˜b‚ßL'm,$ÃI†AƒVTÂéª!0˜ªAÔ&!5PªƒH:ªi¦ÚVš§#…“l “Mƒ ¤M8V˜a28¶�a>�à +Mª¦(2Qi ‹ˆa#C'A‡>LŒ#�` !aBPšF¡X a0AÂ$ÆvZÎ ÓM PONw°šjxaˆB�mD£R'SÛÊÆ ¢Q®’‚;üDrn§ÄPAºˆˆe´ a éÒˆëáµzõ¤û×^ýÒà»÷¥N–éÔ�UH6Ò¸I¥,ÒXeu´ƒ %"3©ˆbƒd¦1ˆÿùe[E¸HÈÊèÌž"ñÝÄd +’Ë+š ¤a¨Pª½ôúßÝ÷þîÓ¿_wÿ;å��£µÈRÇ�ÿ®«¯ÿýuÕ<É?–êhì\‰²�ÿ$ÑÉ O q¨“ÎGVI£2L� +D£AB!&E™ B(2'M‘ BR3ÄQex‡AåÅ<)±�‹g\º9Ôì'Gc ¤º;'L‚ǘP2,2„pÎ�È3#¼À “ ÐÏž!R0�`Ñ"G€gx�a¡£Xe^š5‡£Ûѱ®FÆBGÁÁ4› 2?@ÜŒwA¨Œ.�M3!í0¥[„|f|^°0� 0ƒFêöšL7í-Bi6÷=´›i…M²ÈA°… ›e�l´Û&z+M…D°�]: ¸ l4Ô»%—Ò~ÿߤë/ž“i6Ú Ióí&ðÞ–™ö�nZ¸ë»¥n“rp•¿wí¬]+ZiÕÕ¥½½$Nú‹×¾ÿp»zV— ÕñÛI·õíöÒ}$½oi&ô½SýwvºÒÕiÛëòf„r&±¦/MÿíiwêÿU´é?]mè};Šÿè~ñ¿õü}õÿúëÿ}½×ºz¿×¿Çê [é¼~Xäj>ˆ"�ãú,nö£�®�/†ýðCÿÃõþÿ×ý[TLoÿëãü±/ëÿ½~I²YdFAùVDƒRL޹¸êeTe$j<ä™Ð‰xêy-Éó[:¬ì?}©úØ¿õÿÿõ^úÿ¥ÿþ­×o¯›"#¢>@‘±Ÿ3æO˜±râ’ˆŸ0hÄG‘ð ÒD<£Â#˜Fph…óœ¸ �„{ ƒ#æ­š#L `‹pì d„ˆIšÃ$aÐ)¦0�‚3†��áÿëë·ÿÿþÿ®¿ÿçKÿÿðF¯íצ�°Âi¶TÓ‹„ÚA zNš xT„6�v•i£ÃI°î“…DWh É#†Òa¢8i>š‡i6d|pÃÿÁøaÿÿÿÿšNÝ~¿é?ÿáí ¿×³í&Ðg ôÂ<åû 6‰I†ËWµºo¾ý!ý‡ðþÿûÿøÿ-¸¡‘jýýõýÒ¿Ý÷nÞ»¯^ÉÕûfþ²ìÏëÿÿûÇ_]÷ýý‡ì?ÿþ¿_ýßÝm“£ž¿~—Ýw÷WúíŸö×m+0¬'f6KÕ´¾ÖD6 %iWÿÿûÿëÿúþþÃöÿm/ÿôÿý´¾—¥m‚Iápõm6êÕ´›0.ÃÓMÒ²<šr+†Ó"ͤ›i1ÈáÅ1L�6Å*a4ám±V“úÿÿõÿ‚3ÿÿXÿÿ ø7ûuÿþÏÿÊõî“M%b®Ü6B´‚i†ÒdqL2+¤Óa„˜„žÂ}„Óh$ÃÂiØA…PÂa„ƒûa:?à +Uˆ_ÿþ¿ÿá/ÿð�þú_÷øAøWm.Å';ŠM„í4C +Kÿÿô´¶’t�[@� �Ý-]Õµ„ÚN‰E-ut¾u ¸&Ò¹'I{P›JÖ’ÒxMÁ7­ÿºþØAw‡ÿð‚}ïÿþÿô½B ýéÒtŸ]-'{ݦýnÇI½­j˜Jš]Чµ«ª{ý4¿úö+k´ûý/½+«î‡ÝöÒý}¿þþÿ†þ«Â…ûÿýý}j+m?µü~»ï‹Œuñûö†ú�¼|uí»{×ÝŠcK{ÿUÛoúÿoÜ„OëáGû¯þ׫ýÿј~ÛúN‹�>,r1+ÿ-Érñþ´CÐ4C�wßzýõ{kÞuýëÿïïVý¶ÿ^ÿï÷KÿlÏ­}vÿÿåÖ_ÿŠÃÇþ±ôXÏÿ-8rÅ¿ÿý·Ý{Û4MšÚÿ®í™ÿtÙÿÛ3W{M¥ú{ ÿíµöûm%ýuÿÿöÿþ¬?_T¯õÿáë¿ùÁõìÿO{göAýÚL4“¦ËΗò+‡và ^cÒa…Oa‚¶m²&{¦EÇ"»VôÙCI4ä\jÅzëÿÿþ×ÿôPðßûuÿ‚ÿᇂþþ¹ÃMŠzcb›PÈZ +m(¦I„p°°Ø¤Ø« 1 0ƒbb˜PêÈé(H6vM¦ÐV›&› Í7Áÿÿÿá¿ÿüpßûiuøG¿þ÷ÿÿ †©Ã#ˆjÐl ÂdU1 öšå\0‘VØTG0ÂF‡+!„&EsÁˆa©íˆŠ9Ù.„1�¡_/ÿÿü7ÿÿ °ßûa+ûÒÿðÞ—ÿãh5+0B""Žvh„A„WŒ´ÄDRq½évÝ}öûÿk‡½øPOþ¿ý‡µõ×â""“B=->¾—ëÿÿ¿¥ýú_þöô¿ÿÒÿþ¾«Þ¿«oÿÿ¶uO¿û{j§7o]ýÛ:nÞ½uõÿ§ÿ^î¾ÿ¾Ö»¯ï¿êÌ×ðÌm“¯lÑjžf¯Ûomo]/õ¤ÚPÓÖÌ+ —MŸN—÷÷¶{µ³ ´—Û=+g»Âi6§Ÿì†9‚W¶°Œ=Py…kg­+=X]-u¶‚Ám ÅÈ®3ÆÚI«"å5bئÒ�´­4Ãb™({jÅai¶Å&››¡§±­†*Òb˜fÐV‚Ní¤�B·G „í4Ði’&œ$ÓM‘ D&ƒ´Ø+ *qbkTÓ¶ì+¦­é0¬&(0Tø%drM;![Š<mÀÂ; †! ¥e)h! #.ÄDEóµ\DD0B#H(P�h� ËnPV2Õ-ŸqˆŠOÿJ¿t¿ÒKí¤?b“Y`ÓAÈ Qùj~vaI°wY–Er S¸�dØtG#„GÁB0ð¤¾w^Fà§j� Јôé§~ïæâÿ¨¿ï¾úÝÿªÚߥú�‹xˆçw‘¼øô¾«üü©%5jRK<äj,�JYÌÌÊæYÚ¯+•3QùÈÔD “!ŒˆÍ “! HÙ""`gŒ†.@Ѷ ‘äByà!&R ’3dì< hСŸ<#dîÊ› +FØY�P…GfˆÁ‚^kdù²ðA‚.Ù<\Â5‡!8ÖFئOk¦šdòh2|Î „F·… +�0õoM Úa“áØA0÷Òs!'Õ+h4"-´š†ÿÿûÿûÿÿÿá'ÿÒý¿ßïþôšWõ´j)~—Mp›ô­+Ý.šÒ·õÕÔ}ýµ×KIûT­ë„õP÷ßÿÿëÿíÿÿú_·Z_ÿ¿ÿï¯_Ónÿúõ»¿«íú›ÇVíÒ¡«½ú÷ð�j;ºö®Ö¯ßÿ}½ýÿßÿÿõý}KßÝ/uÚî¿�ÿ¿«_ð_­ïUnýµ­ô4¾·Èá_Ýû»{ßÿÝwþsÿÿýz×öÿ$ÿï×õ鿆?Ë’?¿¯Mþ?·zU\=¾¿å”Rÿ’E'ÿ™ÿÛýíî»f‹ÿ¯ÿÿÿµõ½Ò¿ýêïmuõý‡úCÿþÚþ—®÷¯°ý5ÿIÒÿúû{fjüÏý³ÿgþêí3nûî—ÿ¿ì>ÛJËÑ1í×ÚIí¥`Šzl0š¯ÿ°×ÿ÷ÿÿÿþ¿a÷ÿúÿý®Òaœ­†­œ¯NôÛ a† +i+¶EÆ©éZi¦¡5L&œŽ¦A1 +G¤Û &�¤šm„˜=6D‚;ÿý°Fÿÿÿÿÿ¶ŠzþÝÚ_ø"Çÿí¯í×IŠ ±LB §A4Ób‚ ŠA†ÂH0Óm*vÅÓîíoa<4ãi„ì+ A'lBžèöØ‚i¢ ÂÒÿü/ïÿÿÿ¿ý[¯Ã~—ÿÚÿý~ÚV!†0‘¢�oGÆŠÆP�‚5 `‘ñ† ¥s5n#)Z-a'ÿðéÿÿÓÿ÷Ó~·x}¿KÿKÿ½b Â&ψº_·^éÿ¯ºÝ{ôÚÅ1OïôÇþëßûú0à£W¯ëî¿·ÿ_~¿õVéO±×ý¥¿í×é [_Û¯9ÿ÷þ¾é7_~Ý;÷ÿOþÞ·þÿ®¿÷_ý}Í?úû§_lýÛ¥ì7Jëzþìý{¶f¿äº´˜g» ²÷i}¥"ŽeæËÌ0’÷¥eë/6•¥¦ØKí&¶Î6êÒl½NŸí¥Øg%í†UM‡Ç#…˜miõ âS­4ì$Ä&!Ò  ‚ &Ä$L6–ÐbaiD.“L'lB“˃L&Å4ši·a0ša&ý‘A¦ša}Ä&LB R6f¶H÷G¬Pˆa)ŠhE2­ÁÂ<0Âi Â�èñÃ{î[1²Ð”8ëôŸé{¯ivÂPƒ ˆÜÂ3²Ð§ÄGòl±��)�,vF�‚™Œ¹ÕxP¡“H�2Âwý ÿú�õ¿ô¶„qåß,ìÿª–šÆv7•ÉW×5":\«2«©'dld3!™Èhã ft2+œdfh!¨d�’f)žIE&êã»�0�•ÑÜÆÕfê2*œB6D1H˜¨„‚c#äùƒDN˜vq"¨xHÑ ç "ïG¶¬¿44 B £3‚a—Ô Éä60�a„]†­£[L�hØ]ó)ÁB„x¢® �Œ.!„l #eh4l #[ôni¯£;A6B tÒoIÒm&Ð3fˆáª#¶cDXhi6“h&ÐN“áRm;­'_W\¾i6“¤Ã‹t›Keд+LŽl³ÅÒµDº–t—«¤éh&Ð&„tÂ@›DoI´�+Æ…¥JúÝEEèCé´´�&áZV»ºWOíöµ~ªþ*ÿ¾ê×E=¶‡´ŸÓL]Wßý~ëkûOõþ¸×©pŽîû×Ý o¾zIµ#…»ã+Šgj1ëK_·i7êG _©+^ñ½~ãö£ÿ»ÿÛ¯\ÃtC®Q__¯è‚ÿù +SþU_Ñe_ýxuÿÿûþ¸°l>ZáUò.²iÙ×ΫýË(ëú,/éÿÿþÃUÿÿÿßI¶üÈ1Jà ¹³„¡Y~EЋÄ&‡ÃÁœó$%(èÞo1"A`öKPeÁ `ˆ•—2¬–�E¨–„B ¤‡” á•„õ#F…'¿ûþ¿÷ÿÿ®ÃÿÿÞ¿ÿa°ý„È”¡=i£CÖÔÿưÀp��±LR6=¡0��;A£c'“M4Ñ¡™É£XaFèFÀÑ& #cÙF†³ÿÿðFÿÿÿäìŽðÞDOÿûiþÒl"-µ‹m–€›CI´›E9g†ƒ &ô›h0‚ ½ Û, ‰ &Â-0ÐÐfÆpÐNˆ¶Ò“ii6ÉýÝ&N–—ÿÿð�ÿÿ Ÿº÷ÿÛ ý†Á¾Òá6°¯ít–q×Òõ·ÿ[à›Jä�:º%šuà­--'JÚÐM¥¤é>ÿÿþÒÿÿÿýï„¿ÿâúÛ»ÿµôî©Ðiz}ßTúî•>›Ý¿¡Ò·�Ò÷IÕ4¿ÞµMuñõ~ëúþÿ÷ÿëîÿ¯þе·½»ï^îþ†ãZŽúQêG +ꇯ´êG +ÿ×õ¾£©/»Ç\.ú÷ßí¯÷ú¿ÿªä v¿ÿë¯Õç_1ý�þü±ÈϽ½9—‚êXäZiþä9ú¶ÿ�^‹Œ¯Äú,r9ñïí¾õÿû÷ÿÿ®Þ¿ÿß[i6Ù¢ëÏ-³4kÿÿÇ×ô±Ò×[÷EŒõÿÿXÖ‹ÿàúMßi{fk^ó?ý³ÿÿÚ÷M™ÿÿû àm-Õ³ûk­¤ƒÏ¶Ôó†¿þ–¿ßÿ]ÿÿúúÿÿþ¬=ÕžÛ†Úû ,Šá§—˜a$ì¿ì0’iû"ãƒ.}¤Ã¡°ÖÕ4ÓM»I6Òb˜¨uia=Šð¿ÿà¿¿ûj¿ÿÿÿ…ÿÿÿò7íì ˜¦0è$Ób¡i± ŠMІ›i„Ó¤ØNmáˆM4šié„Ó¸`’ 10˜&E˜„öÓ Ü£ÿ÷„hÿ¥ÿ]ÿÿßþÏ¿ÿÿý'ò�„ƒ2PWa„ÓHÎè0ˆs"°4|="È�JƊ⨭¹:Âaê¥eù B)Ðaƒ ˆˆº_ÿú_í×Þ¿ÿßÿú þûïÿô°ñn&„DE"¸.øˆˆî—ÿþ—�ûí×ÿÿú_ÿÿÿ®ÜDWõ_ÿÛÒÿ‡íÕúúMû×úþÝû÷z[ÿJ«ÿÿÕ¿vý¦÷¯ÿµÿUý»ÿößU9û®—_ÿlÑw·õíù:í}&ýëÿ_nÌÑôÞÙ:ÿÉÕÿ×K­ÿÖÌl5ðŽ>Ïöc·aží³Þà m¥Ý6zÓm%þÂ0àý†zmPm¦Ø%¯°ÂMÝ„PîêÃAXÃa¦Nî)ŠAÅ0ÃÁ§LPM�¦)Ch žLBA¦ÚH4Ô&Ä*Tئ+cb�i¦›Ç °Š¥d(ÓªNðšm +ƒ ¥pÂØBH64âƒWaоÓÞA„ìŽí0ÂdpN,T³@Ý“b”MÄErŒ®AÄGÇþºú¦4÷Ë1j•ÀÑ7œȯ)P™\FdíJ�§ êŸÛÿz÷ûL-¬íew-À±Ì‡µÿþž¼®,ˆúgS;A) ʤj5ÎF¢%LÍ� Nƒ)ò y-G (EnReÊŽ`’åÙ ™)‘.y¼â<‹ähRl΢” ‚fȆ�²2#0Â!&k Š¢tla �là‡§Â 3i™ #Xdn0ƒÐ„óc'‚g �#r„ÕÃS²è(FdB„l2cŒ#cH Â5†¸åm˜SÒMªn“ 0˜M'I¶¡´ÑᄘùA´³ÐÒäИaURoTGm–@A¼* �£¡ÿãi÷­w¿÷ýò‡òtwªúõí{�1ß^ºÿoD:¢Ç#GKá¢Ç­áû÷ü‚×ÿ[ò�ü²||W½†‹ý~·íéK¬vÿaËýWáÿ½üÕ¯_ý5Õõ¯ïÃÿÿßûö×úøúþÃÿÿ_; #¡ ù’3g“’d1H²6gÌèD��F@‹"4GH3È÷ú�&gL)Ðy­&u-J”FÏÿ믫zÿÿþõõí¯†þÃÿ ÿÿþ¬F€Ê0˜MBF³q 3[*õ „Â3´k ÆvÂ6M4hi„ÐQÃý¾y™Ã]ÈO.Ú›H˜# #8Dy�BY K�dùs\TfpeÍæËïø#ÈlŽü‡†òU?ÿÿú^¿×‡ÿÐ_á¿ÿû½&ÐA´ÓG¶…é6É¡6 G¶“i1H&Z ƒ…OKa?ìš(Šíl ŸA6áÃH'H[öBƒ¤ÚÚ ´Ó £F(5ÿ¼ ŸA~,Ð_ßÿûk·þ¾ ÿé?á¿ÿÿÒumO�¢\ô›¤›TOÃm-i-' +´§ÏKv¿h*غÛ,êú¥t˜lº‚~¡%„4›DvG”›kúþ— ŸÒÞÒÿÿKû»Ø~÷þïßþ¿ý-+÷[u¿õ}ûKñÞ¯¥ÿ»½{ø«ïú\”/„´·¯÷ézý.úÿþßõíÿïÿûûÿÿ·zжíu||níu¥©*»Þýmÿï^—¦G õu~íþЪ~ÿß¿]WUݵþÿëÕ¶ö÷óËoýVüæÿëþýWþúZÿ�ñÖ÷W�×û¿�Qí­¯­õ_OÖõý·×ÿ¯9ÿûºßUÿÚÿÿïú_õûf�ë·ÿ|´ùb_×Ñc_‡¿¶¿ÿþ‹øtß½¨ú-É+øúÿlÏ¿_[]zlÏ8õ÷ïn»IÛ?´Ã=wL3ßþ�ªÝY…­¤ßf &àõÿßÿÿÿöë×ÿúßÚL?ßëñÿºÙ{VÒa‚È®eéÃÒ‘\;VK‘\4Ó†5í)J[Å&Ó!v“š¦œŠá±Ý¬i§iHŽãb˜¯ÿÿÿõm/öëkÿþ¿¾Ã_ÛMUÿÕÖÄ-6)‘O¡v‚…Ú Šm…¦˜`Ì4Ó ‚(t‚/ ©„Ó =‚¨ Òiªl&ƒ#ŠlS +Ӕ쎂L-„Âdpÿÿÿù;#¶ëü7ø#zÿÿXÿú ÿòŸ@Œ?ÿêÔl Õ0©¦šEX„ÓAŠ è4�nUÃC++Š8ˆ@ÂÅd ‘W+B a!—@Á4uBˆ##Gÿÿÿú ÛKü?áëÿþ/öÔ?ûk¨AøF‹k&äfKxˆ�D�¯ÿÿýÄ+¿ þ“ßÿÿ_A¶ÿÒoAú_Z¥¶×þ»ïýyUÒÛÿÿ_øo×·QK÷ú\:­?ÿ¯ÿú¨M·÷ëUÿÿÒ÷Ü�'×ãiýwÕ-·_õ··ÿÿkœë_ݺÿý{õÛ¯¯öÿþ’íº_Ú[gûlÿÿ¬ƒû3Mþ¶—®~uïû¿lÏÚ3ÛI×Ýõïý^ §bÆÃ9¶–Ÿ¥°ÂR'UO‘\6 + Ž;­$äW»I9zÈ£‡eæItún»/u"޶rµîk Si&švMŠiŠM4Ðm;lS! 6V‚M„ï† M„©¦œ± ŠMÛ†“h$S\'†Å&švÓA„£¯*Ü«qkà „ "‘ñšsÛaR=!‚ O23¢9šêk Ä)VÚ$h¬höåša +xi;#ÔhÎØBÓMà oi¦¥°5 +î"#B"4W#rºÚêúúõúª¯¥ê«úÖ’ûiX$ +’[d>ƪ¢ Ãu^W1Et45HDcå˜jŒ½B#�äi�…p¼¯€ˆñ÷;SgzºrX 'Zþáµ½é¡4“y­×²7ˆÓÿU¯�3½Q2³²MJ̧F¥!¡“düÉLe;3ÉòñQŠtÍ™!#ÄC¡$Bòq�D4ò(‰ˆ>l�ÆódˆIœsŽ`Ê‚~x%„bæ€äA£Á?bD'‚#š!&R pɲ"È#Ù—.eS2ŽÌã´‘ÛÔk Î9 +?a4l B 4ÓØÂ„ýQ¸ç60�m“ò^~£sF¶¡6)ð�¶T&šL=U&�oMPši9‘œ¡Ix#Ã;)¤v¢ +ªd²é6ˆ°ÚiPdsI†ˆí¢;#¶“h‹L+IZM¥¸uÒ´°ˆ¶Úa2Θh29„Ïæ‚nX˜dsH6Ë:Ùg¤Ú ó +¯x}Zÿý+„ïJt›„è(N•Á6úIZO»ê)Z¼'Ý'ëWt�+Òý+«ñ§úÿúôßî×ÖÓ¿ïÅzÒ_ÿ[O~•¸´î•î;þÝ;¯’•ëÿïÐÚÛ§qV÷R8V¾^‡C_Ú‘ÂÖû¥«m·´—׺ïö?Žw¦9ŽÉ¬îÿõúõ[ÿð_á¹8ÿ’,ÿÿþ¿þ?Ó°z꺯ÿ–Ÿÿ«ýûhºëì4‡öë¯ÿý[ÿ_øz~ºiëý}ºÿÿ×ýý}‡¯ëþÿ_ÿÿþÙØ&lÈhÛ3‡Ëä@r�Q¦È„z2°–„_""†{&è‰ea¬õ ñìÂ�8d1M0ˆ•M™ ˆ)FNˆÆFˆ¨f¢5ÇBÿëÿÿÿ÷àŒ?Ãx#ý/ÿÿÿ:_ÿáµ4ÓF¶|lgôl„lk¦Q£ãƒd¦ÂhÖŸ‚654xy>±L™)’ãÿ4l “ò\ðƒÐ¦`Â6NsÄà¤\Â.gn; F°ÿí×ÿÿÿ¿ ¿ è/Ûÿÿ¿ÿ/ÿðl",0†‚ °˜ARt›dÎGl*Nˤ:#¶MÉ�$Ëp“z²gL&OÐiY3‘Ý&ÝÙb(ÑIдÉpT“wh&ÒtaÂm&ÿúÿÿ÷ÿÞ“ø{ ?õßÿÿÖ‚ÿÿxA¹'K~©:VÔª¿è'WiRxM¯…j·è+PM¤Û¿m¥¢N—wa.Òm'K :M÷ø¯z_÷ÿü%ûé~Ãÿÿýµ×öë÷iè4“mÓ¯þï�ïÕn¶×^ûioOÿ×ôé;ú]5ߤë¯ïßíûÿVï_8�½úÿzÿ×ý~Ü^µ#…ëïö�Gé½ëÿÛ×ý&ÿÝ+q_o÷4µ?ýOÿÿÖÚ÷߯þÚÿÚû×þõùÏßVïuä8�¼?ý-×ñ÷î»ß§ÿü~¶ô‡ÖºT>ß¿¶¿ûdëÿl�^¿í™¯í÷¯÷¯µõû_ÿ¾·KôXøÿÿÿî­é¯ÿÿ÷ï,Vµ-ʳíŸÿíéÛ¿'•&Á&ÏVmzm;ëm+_m%¶Ò²ôŠàÛ/m¤¿u¿ÿÿþÃÿÿßÿúïÿßÿ]{ÒýuQÅ&µi¶•¦š¦Å&¬‹› 1AŠ‘Ã�ƒ¸a&!HáÓpƒm$ÓL&ÚH4Ãh&!B¨„˜mƒ ¦Ú_ûiÿ†ÿÿÿ×öÕ´qéÿÿþ÷¯¯ù±ØIÛ…MŠ´ÖÓ`“¶„Âa4ì1 „Â{N•ŠO튴âši¦”1ó;ž#Ø'ÿÿÿÃÿù>ÿõÓÿÿäû_ØG}ø#?ýfD”¢Â“ÃS£-ØV""*Y Ýwº_ßøoÿÿý/ýuÒÿÿü%þûªú ÿjYëÿøÿáÿÿõð—ûÝ?ÿ¯þ—ߥz_¥÷ã­}+ïoýÿû÷ÿÿ¨â¿Ûÿô½ö8¥û w¿^¶÷ßÿη÷^¿î×ÿ×ÿýôÒÿûwë]ê»Û¿úÿïÝ_¿k¿u¿õ]ö¿ÛUoo…Òí'¶á¶zÌ/Û^Õm³ëÛKõÿký[Kïí>×}U³>í¶ìÏámƒ ¥AX¦)ŽiÚH6Dvš†6EÆÚI§ zlŒ…ºl��· �ƒ¶EÖ›\¶/R+‡l0JD6͆rl%êDm‚(töÈá0TMˆJÕZl(I¶Èi»AS­ªN‚i¶aSV�4a‘ŧ…¦Ä&LaŠ WjY`„d!™Y”è¡´4LÐÊNÃ�‚ÁL�a¡a=°Âa80A„Á=‡›ª¢n‡¨ÿ¥þMÁNöÔGòÌ"-Ȳr;‰ã³\**2l¡ ý=_ÿº�ÿwäØÉ™OÌ�éKpMþ«ë¯2$ޤKæ‘Ñ”êD¥¦t¬Éš‘ÄyFc%ò@ÌóÆHDÈcDNœ2¤S!ŠP)®DJ@�dê# «7(Fœ¹•d¸“x>ÕOµ²Ù°†�a’0@¨™Ÿ4BLÖ™Àš!&kf˜MÙú8Â.ÃG‡áa²ø—fpѬ3\FÆB'3[FÆiÕÃPƒ» 4Ô#Xdòi¦˜$‚$dê“a&#vж…»j“j¨ÐÙ4 ÚlÒ´Ô&ÂMú ¶OÓJˆí¤ÅZ3ÛI½ÐN“ –B ¢+´a e  Ú#‚-³%9U0�r¹�§R I´›@˜n/ná–…aSm¤­&Ö‚½-¯é6ûK Ö¼t­Ý]-¿JÂJä�:Ú#z „êï{‡^“[{^ßé{úÝ>?¥×ýïKÚNûjŸâ·A§I°ÓA­&èZwwÝE¸OQK­Ã¿èoOÆý»z‘Â×êÛz»OÿÇ÷CþêG +ãû_ÖAVêPµém¿Õÿ,{¿®÷épCý}Óÿþˆr~ ‡êÛß#?VÝüÈ[IéJäÓy�šúÿïþ?òÓø?ÒÕÛ×ÿþXŸ‡,g¯t‡ÿýu_ôýÿÿéþÃÛ­¾ëþ¿ý‡ÿÿõÿ�©25)Hyäš�L§<¡$|È6ui¦Bâ)”ˆìf®Ž=ÿÿùÔ_ÿÛõÿûG¿¶¿þõÿÿÿÁÎsÁ>]¢ex‘›™Ÿ4BD¡ 0��R;8)² �Á9 L-ÈìÖGÀÉѶf!.ÌBtle‚ wY@¥;4"§L�N“͙Կÿÿÿÿá½´²¿û¥uûiøoÿÿÿü$ÚªMáP&„â·é0ÒÐ\ Фé8FÀÕb(4­¦š64lhÑM4�høtë£Xdò„k Ã<)ÂF°Í0ƒD&PaßÿÿûÿÁÿ´¿ÿuýÐ_þÿþþÿú´ÒÙt¤Ú ó—ì;²Æ„IÒmé'I´ƒlœËA? ¤°†M¤é6ánm“wè&д›A6Âi&Ðü#ÛI‡ÿÿÿÿý¿¬%ûÓuÿãÿïÿÿéZN—^õtû¾•¥¥¿�¥m;ô¼”/K^î +öÞºÕ´IÒV­»IZ'YÛ¥{ÿÿ÷ÿ¿}†ÿö°Ø¯Òþýÿë§þ¿Õ\t¯~ÿÕ½ÿîÅ_öÖ¶…SW­§Ý'÷]&é¥ÒnéKí×úW÷þþy?ÚÿÓÿ¯ïç“¿ºë~ÚÿÆÕvêÛ^ÿõ®‚ÛJú¿¿¯CHk÷Öþë]Å ÷TC‹,òl¬7ú¤«K­ QÇZ�Ë@I9nIANéJéò7)Ú”¤¼ªvgUSõ{}oÞïOõjœìUVÖ퉦¢9Øþv—ãâ¤n«þ¿!H�©N“&)djL�žr&r ¥•HÔGndÐÓ:5) „S%$`�™ ˜›#„HÌ<¤Ì0Al4Byœ0ˆIœæ°É±‚=†UÌ"+;‡„ #Àx@ÍB›F°ó„x‰òâ„EÀd ¦Æf�ÙÀØp‚4D$Áh„hQM„Š0LžTÉå „Õ½SH[è6ê“ 4Òtƒá&íÙ¤‘óFvÐi&÷ ª£ŽÐMÐh*M†K¤� óÍ&Õ0Œòž Î ã +g * áixA‘Ì$Ãe£ËE&Ó?ÿí¥·ÿòÅZê>°ñý]Jêõ"Xÿÿÿÿ×ÿØk¯ÿþ¿ÿ¤õÓ}0õýµ×MUÿþ¿úÿû öÒóbÝÿúþŽ;Vÿ¾v ›"¤èÛ>)B6G†"!(FAà¿"¤"œˆPO‰FA„T„[*²¸‹Ó Ílù�ÆI‘")šÉHLë)ÝÿÿþÃÿðFÿ†Áù_ï_ºÿÿíþÝxo:2;ÿõ „h¦š45M��» %GƱٙÈ4Ñœ4k Æ��‹Ô{h„™±šaƒÖÂ4i0�a•p@Ñ 4B4ˆI‚/"!rc—æ&E ‰@dù²þÿþ_þ‚ÿü8AxWý´¼zÿÿ½.õnƒáÿü Í’M¡¤ØDXh¬¤Üšl!i:L95pˆ±Ec'IŠI´œ4ÒAÙ4&#†��'TÒmS&ôé]ž�&ì#d#cG¶¡?ÿßè/ÿKÿðÝz_ñ ÛIÿÿÿÿPÞ—ý}×D¡%Âm´­Ò¹8Jé6ÐX&úÒV¯Ò»Ih&ŽÒÔ4“iž4˜lµvÙhM²ÏI½&Òl%¢;ÿÿ_ÿ_ÿÝoKý?ŽÒÿ÷b½ƒbŸ¯Û_iºé¥ê¿ÿjÇ÷éÒt�SÅüuºõÝ}Õü].‚¤ízOº úÿÿ¯ïZ_·_¥_þ¿_ÿ÷[~úÿÿ½n5»º†ã«{»õüwÕñ»¿[Œ[]_éxuhlV’ßýÿÿÿkëî¾siWUÿ÷n»ÿmûz&:ÿÝ/||ä=2ÇïÿÖkzõÃKuø}CÐÖÓÿ_ÿ×Û«Ó¾ëõ´îýyŸÝþÏþôúݯwKíïþ‹OHxjßþ¿,H> ùiþÃùb~›áãî°ÔÿëÚò+‡¦ée金Ún–�Ôˆ8yŽDzl4ÕÛI[1Zé¶tØfç"¸m˜öÒÓõ×ÿöÿÿ[ µaÿðׯý‡ÿÃ×è4ÖÓµM4áa›i1P�ŠL6’i¶“ìS ¤Ó¶ÓAÓh$´ÓL1T›M0ÂLT. &IŸ‚áÿ ÿþãÛ]¾›ÿÃk¯þÞö¿^[NÖxa6š™óÃb¡4Ó†˜„�l¡24‰¦ Ñëh«£Ó=Q BÙj‡£Û•l0†|*�± „Âi„�a†)“KÑã‚4ÿ ýÿ„¶ÒÁ½CølŸÿûÃÿ <‡ü·“kB"“ˆŒ"Ü +B+¥éýá¿ÿÐNÚ ·@ßþ }ÿàø@¿Ãè/¸Š¸ˆôô¿ïðú_øKˆ[Ø¿‡A_ýøoKü7¤ÿ_Uô¿ý÷o¯ýQµaÛýÒ­¿ë}°öÿ×_ëû}äÿ×þº¹^NŸo¼òÿý×ô¿ÿ_ék¯ÿ¶N¶þ›_ÿûý{ÿ½Woî²£kÖöÉVí¯öÒºÂ°Š­‚Va6ÛW«ÿÓ.¤1ÌÿtÓil3ßý]öö×Öïöζ•ÿÙpœ%#ˆN6šaŠcb“´›I5Tîa¶ÅZ]Ô‰Ì.©ÚR á턵t›/]f8‡eõ³ÕÝ6z°@þ` „ÒÓ¶ „�‚ ²9ÓM5v­«J­&“´Øi0Mb“A¶‚ˆM„˜©+±Pö�b¤p“XÍØÄP„FPÁ1S©@ÊȈ£ž ãDõƒ&@ÂEqGÊÆ¦�åc $gf�bLBa4ÓJ'b˜M:wÉ´÷ËuyØ!”ܧW¡ÄjºÿKKô—ÛA ©²Í  ËsTDGc3°¨ËòlAB‚áIòiŒÈ&µÿO´û»ÿÿÿëz{ùØ¢òf…Çþ¾Ÿÿ_T¹’¦_9“£3*P•dã!‡8ЍR@ѧ †!Fl‰²Ê±MD ‚.…a4ODódj©“Œ�)¯8�"ññIÉK4B8FWÌ‹CAãÖ\Éù:Q²DàƒØÑû'äÐk #`k„ѱ„hjPžOkhÐóú6˜AÒ6SL#c4“ÖEÛ4˜â‚64l‘90��¦-ȉâܲ%’#±b²\I÷ ÐÐM„·t›I¶LävÒm& Ù",=Rm&äÑI†ˆíŠZ£Ài0ÐÐM ›VšI°‚t4›Dvó¸d# +¤œeIBªÝé+wýt¶“»„�+j ´´º  Mê“¥¸T›A=:‹¥¢Q +éZô•ú%­ïþ¾ê�ú¶þ—A¥M¯ÿ[ö›vý'ýý­1vÕ:ß]'v½¯÷wÝÝ'íÕ«¸äpµúŠ\u»´û¨×ºMïm6†ê*G +ýF»B†ï�׋õ_¨ÛÕ[_¯IÏýHq_¢·ß�ÿ÷¼±ÈÑJ ¶Õô_ÿâ9H·ý×þ¿�ú¢Á?-W¾þ—êþÁþ>‹ê]_EŒúþ¿ÛÖ¿õÿÿÿ_ÿ×ýöÿí¯ÿçvYA‘‘Д“"%dEL�ÞvDu3½Ú¢Óõéÿÿÿÿûà¿ÿ‚ÿûÿõÿú„l„k5Ñ žˆIž…Àa1k ø¦Æ¬Ç<à‹¿"ù�› Eäwd8�‘âLˆò"YS!Ȩ*ÈÃ"tá�@‘Ã"20Ïš›3¨ÈQ{Gz_þÿÿÿá?ÿ„{ÿø7ÿþ¿ÿºZM¡h']PM �&Ú $Ú¦“~IÊ©¥a Èù säÏ¢9£ui£upƒØa|Ù:ØO „]²|Á„k �Ä=}ÿÿÿ÷þ—ÿú_ÿ‡ÿïoÿüRt›D¹«…ež“jÚL6šI°ƒ#š_ª ái6­$ÚNi+I°ˆ¶Ð[&r;¤Ú#»¸DWhðá›$ 5I¿«i÷ÿýÿÚ_ÿÚÿ¯¿ýý�ßߥ­ÓãúÞ*ý/M%úÓZZT–¢¾“ip�]¨&Ò´ †ð›K +é0ÙmÕ±Q_ÿ÷íÿ¥éuî—íþý_··¿þ¼oÛü„Õ¶ºmûÖëï§n)kíiûûÓMáûÝ'û¶—ïûþßêßþ¿zÿ^Cý}¿Û¿oë_¿t8kúÂýßá~‡n¨uî¿êG Oí{ڑ¸÷ÚÞ›]µÛ¾Õ¶ïî×K¯nÿuÿºo¶É×Û~߯-=áÿ.°é¶êXÈÿþ?Èraõ!Áý?ÿïî†Òÿj×ûöÏí÷vlõûg½>êÒû?am¤¿ZL3ÞÙý°Ki³ÛkÙí}ÿaÿ°ÿ_ÿý}*’-cõþ�ÿÿܱšoûi1jÇlll„¦*EçlpŇ¥a-C †È¹miÃJÒb�aŠb“ØØÂ ŽÓÿØì?º]ýuØzZÿÿÿÿ¿ÿjƒh)U‘ba28°Xa0˜V˜a5PÈè ²8áà TÂM°E‚vÈ¢²äA6˜VÐa28ØaÓÿÃá¿uó«#¿ÿg¶–ü‡ÿÿÿÿþ¿ B;Er[SlXˆ0ªìI _øðÿþ‚ÿý-´†ô°�ÿÿÿÿÿÇÿ ÿ†ïm/Aþ‚ج>¶—÷ÿÿÿÿÿÿ¿íþ)õÿýtmo¤ëÿÿÿ­^ßÿóÉÿÝÒï_ÿÒÒ·êÒþÿßÿ÷_ÒÿÚ·ë_¶têéÛÿÿõ[#¤gúûÿßÿþÞÿý½³ÿëÞÙÿS“kVõÿîöAù™ýZíšg;þûöͺÿ×Ýu[a‚l0–�¥²&Xan•Òpà +œŠá¦šiüŠ8m¶ Zô“ ¼‡M´cµl*÷ÿi0Ï­Òè4a†a±A4Øi ØI± †“l41 8Zi­¦œ'°Ä+„R8ŒB¸„éÛ!LRvÄ$ÓdAÚiªi1¦ÚIÓM0â ®) ˆH®l$WpLŒðÄ! Öi¤Ve\¤Í$hhÏa4k&2S*Ýa„í5;°¡… +”&ÂM6 Mnw`�a&ÃI9l…åql9ØVW*B"‚Ul1 +W>—– ÒZÿ¥Jé*V•Eƒ#˜Áˆ(þddŠã3½2KP‰*;Œ²‚` ¡B‚dè;NÂ�­åbä±ÿZôîÖÓ»ÿ¿÷ÿzw÷ãÿ�™ yÞeQggÈÞ/ÿô“õ ¯ÿý?ÿÕ)’ òAHÔd ‰ó‘¬gB:R225*Ìè5'ѹAˆ�‰Ï"`a2ÓsfuH0™ “$ÈêŽ:>-Ƭ3LÁŸÌà�„h ÃPA„]°�a„l‚3ƒ4ÂyÐ ¨Ø<ž¹ Ð�aÈø—%äÎkBLÖ!:aØF·!<Î!<Ç5†¡(öɱS)Q’¼ž+yFW2T¤Újª�m&F!½.7i÷êÔŽ K­­zÒëßô6úÿR8][êÐþ½û~Úú÷é'úè±û¿Ü=ã–:\¬u×ÿ厺ÿëþXê?«uØXþã[¿ñÿöhºãÿ¯ýþ6¿é­ëâÃ×ëøzÿõ¿ô¿ô¡ï¥ëþ¿ÿúOKÿÿéCÿ_ØfJkO%‹üqÿÿ¾ÿõÿ_ÿÿ×ÿÿ ÿÿ¶v±˜#ÄH R„â|ÙE(FÙ(f*"PŽsC‚BçÂ|b|”Ÿ•¨§2GH†f·äŸÿþÒ ÿø#ÿgÿÿí·D6Gÿÿa¼‡þ;+•4Ñ¡£Y��*š5´ÓÙF†¡ Ñâ�p�aÄQã?øF€~Js< `‹€fyƒx"ì#@2x7æ‰B"­Õýÿ¶‚ ÿ~'ÿ/ïÿýP/ûÿü7¤ÿþPˆ°E¶‚t�&ÕÑA0ÐÒt�“:nÍ�I°“¤Û%�4Ò +© ›MP&Òz�oÓFÊ5Ññÿÿbõ¯þ‚ÿÿÿÂ_ÿÖ¾ú öÿ°˜Nº°’º ÕÂ#zN–ÒðƒºM´ôô¿Tæ“«¤ÚV–•ù›&A°“ôb¯ïz_Þ½ÿÿÛÿ¾ÚþÛëÿ^ý;¯þ˜vÕ6ƒ ×ëÝ-EW}ÿÿ¦×Ýt´Å+ÿýowéz·¯¿«÷ÿý%ÿÿ‘¤ú¯ºù#w­-é´7ºúû®Ð¶ÛKô¿ß¡Ç_Õ}µO··þ¤oúÛo_ï^öÿý·×Õ½ºý»ÿû¯÷ä<ßË�ÇÇÜ{¯ÛñýëWCAw‘Âþ‡hvû>¿Ù/­&Ìû?7zû}Û{wÿ¶~ïÛìúÝ+û?uë{­í¥ÿú-8=ñÿþöZ›ëÿÿ®XåQ|>I+òÇ"Ì9c‘·'`›auTÛ´­&I°“`Ž;‘öÁ8m¶^¶ÁvªÈ¾EË %R+†�—°¬‹í&Dº†JÒd["‹ÖÒ_¯õoÛô¿]wVÒÓ_×ÿ]!†�ÿŒÿÿï´ûmú_þÿ]÷ÿ¿Óýÿëþ—øÿýw·Šb¿¯´˜÷ÿßöÔ?ýÿìS÷þûÿ·¶ªs|Ô�¯þ¿®öÿ¿ÿÿÛÿ«úý}ÿ÷ÿÓk[ÿimÓïßíþôs¯öÿ÷ö×ÿï¯mŸ[ ÿa[VÏö¯_ëº_i¶þõí/¿í³5÷í“­ëýwöš°ÁSb¡˜+I†´©ÓUÒVÒ¥a…l+eý6ÍÉûi]f?M³Ój·˜^Ó´—ÿµ¦L1I°šjÒb›Ié4Ó†‚A¶“ Ãa± +)4Úi†Òl$Å&šaŠb¬'M¦)6ҴӆݰÁ8ˆƒF؈1ׄecEyXP@ˆç+bša „�mI¢}¡LBas»Ø&OaX†a†’j�6 ޶õ…# h›Tb2²"!¡å§ oÿ¿<®qÿ–ÙB‚•¼ÊqT"-rÙ•T#à +IcÈð¥e«þ׃îû¤.  ôR/ÕÞ©â¤/)?ò5úCõÿ×oÎêå®Jd ˆueBd}2*~uµ÷KYkè#;'ÌF°Á.ÁÃÐ $Á„B]¢A¦ÆH(Ï63q±•æÌè¤EPBtÙÇihöi‘HÖJH5:¢ü2XTMRm&Òtœü“é>¸M��ÄS£cPƒFÊ5´ý4l8J#¾YÊÙ› q¨òr%Q¤jyIåYLë‘tGÍL¥¥]j’UZT•.–ºZ¤éj’Ò[–qL  ž3Âà=#p@ œ2x¹çˆ#aø„*—#[Ð Ï`ϳðA  ‘VGdâ"K>ãÐÜE9V]ÅH´’ˆ3¨ÉI�Ùù¬—*IV—¥­uT—UÕuèŠì#ESG†}ê� #CIµ^WŤÚM«vÁ¤èØ@�²1Â.($¢šaFw„k ¢A„]†¸à¤2x aÂ#È„n^Lx㪤µ¥^>–+Bª= LBmT[[Õ´Ø„ÚN¯ÒM²ÁKàÒ´›Kpêé7N ²èZ°šI´4›A>“  ›A6“jŒíSH[êgÖ•%Kªê±_ÿÕ~õøõþý.ôéZN»éŠV£ßïK¢OKWÒmúV“®›h3†“ –Ü�j‡ªë¥] •%ªÒw}ô¾ÚwKÇAiûjªÕ¯¤ß½õÐa-¥é>ß«¥ïN¯þ¡-uI%ëý*ûûï íþ·ÒC÷ÈáRþãµÿz­Æ:õ°Ö‡C[[]_õªT— KúZô¿ü~ãúRÓûJZ#ü4C‰ƒ¦ý½GtXäR¿_ê>îëõ­zÿ#“kI*ë_ÿë°ÿ_ ûã_°å–ÿÝ~+íú,¯ÿÓ~†©Ui(‚t—®µÒÿõد¿ê¾ÃÛ_ÛU_ÿý/ÿþ½at¼²í.––¾¿üŸ†ÿXþXÿÿaþØú;ºðНþ¿ÿ×Ii/ôÀÒéu­ü ¼?áúoÿ ðÞûߪ3üÿÿ%ÙÿÿªóiRéUC›ZUG›ô—ýRðßé÷h/ÃØmÿtŸA~‚þô ÿÿ©µTºIJmQ#r…cKIfýhÞ¿Oÿ¥ïú_¶ßÖëûïuÿtü%íÿØKÿ¿ô’éik®•­éi*J–•%¥ÿÿ¿úößêݯ瓶úû ~õúýÿÿ®–º¥¥¥I*ÚV©iii*ZZÿþ¹î¿_Ý¿­¿ÿÉG·ý?í¯ºûv¿û¯àê*) +ŠÕÂLV”8¨¨¨kÿßëý§íÙš³JÕ³>õµ½½'Kß×É×÷_mÿýý:XMT%6#h*… +zkðl4î—N ¹}¶ ˜ï¦Mž¬#îÒlöÝ]vcÚÂ8õa…ÓÛ_lú½}wK„UT*)„ƒ¦!UUi¦�„Ðté°ÒM4ØMM0Ä&+L ˜ ÅD*cºb­Ci âšâ˜vÅH®º 5l0ÍÒ+‡§¦Ý6^£$Za4ÔÀa|m ¦†‘\U•ŒÓEfV4hmH¬²1"°«=³I§•™Y•v ç�0˜&L•¦E &)°E•…´Â ˜a0š¶ÒNÃÅBÓM›h(…&Á ؈ˆå¦”Œˆ„3—™™¯$ Á ¦‘íÏã3ØÚ¤¬´Ç ÕºZNK½Vô†ôvT’·H4­¥ ˆê1Qþ[3²ˆ®PerÕE\*8ì&WI”uð‚Ì”JWÕ Quit¯t‡}úGb‹2S[]o×O+‹y*Çúþºü®"Y2‰±&Êó"¬ÙFHFÚ"PŒa´'Ä�‘:p΃$ÌÖgÙ¨‰l¤%#Y2^:Ñ’]~dZ)±˜3ÁÉ|(S±lì–G‰*Žç�ˆÂšj» 5 £àeLôMpL#ch Ó  Â5†fGÌÓ„\ˆDæ€dŒ¹‚5†u˜0�a‚�XdF`d�¢&È�4D¬¥dDj5ë+Œ-õ‡›)«§i}ÚÃDXh&жH醅 Í˜F†ËFxi0ÒÂr­„xi0ßPž‚aꚦ“ ƒi6�:Ng*aduð˜F‡r~KÍp‹¶i¦íÈhâ~ðáê½ÿQ¿ô ´­„I´NLBwÅÒÒ|aºM»¢]e„M²Ë†pÂ#“i:M¤êØPˆ¶Òi–pÎMɃºN‚m5H;%ÁP_¾–í;½uíS·û_í;Oí­¯´ÚO½^®ôÝ5ºëÿðž¾�-§zt­C«»´¿·ÒÇ!~"�ˆâÓ©+Ž­¸µÿÇ[úß»õ{M´)]5¦£‹µ«ôÿúcûX¿ÿ}/ÿûˆ/¯ÿõŸÿ¯VýõmE +¸~ÿýê\#�í×ûoý?½Ñc:·ÿü²�ôßÿ_ÿ¥,ssƒ†ïÿãÿ »½_üRYÃʈ�8gA‘¤l�lŒFÈñ(FâìÚ<‹ÄTf‚›ÉѨh‰äR„ÉF¦OɆFAÑa‘‰’ öL3Ù4J²$ÿÿÿëúÿÿû}zB6Ãÿÿÿa¢Æ`Þëûuà™=„l . „l &™Eg¤ÓM ËŽ(«‚>0�m“òg6�(ÖÌó6š5‘IžfvÐÑ¡˜Ïæp Ѭ3F€Ô&¨<ŸÖ #À?ÿÿÿ×ÿÿÿÿý†ßú_¯ì?aÞ¿÷JæºM†Z<Òn² êƒ83f“„4 +“ÐwtlœÓiÕa¤Ò¢;höÒl$ƨ‹ &4�¸a ÓIµÿÿÿÁÿÿÿÿÿá¶í×à¿°ý·_ûZé[Õ¥Ân�R„étïø­n¶Òéa`›V‚ ¡ét Ö\ mûÂA'Iþÿÿÿ ÿÿÿÿ¿°löÒü#Gðþ èîÒÿ½mÿûª{ã´î¾=iâú§Ö“¾þîÓ~»ÓtëÓ†Ÿz×ÿô¿ÿ´¿Þ¿ûþ¿öñ_¥ß†ï ·_ýík}®:mßø[ڽߡõ¨»é{_^ÞÖ½}÷ê5é?·ÿÿ¥ÿkÿõëý¸wþqÁ~—^ßVëýõÿ!@þ‹Œõ¿�¿Ã‡òÜ�¯ß|ñ÷ßt‡ûþ¿ÿo_ÿÿuÿtž÷ü(þ—û¾ìT?ïkþ‹þ?ÿþ–ƾ>—ÿÿÿÿ÷ßÿMš/mïõÿnµþëë¾Û:tcÿKÿüâï'Þž¿ÿÿÿþ»~Ãa¿ëþßþº_·®ûþ¶“k«×þa{fjÓýÒoýÕt·I¼Óý/Ù/û[µ½¿§ÿè§¥ÿÿÿ¯‚ým†ÿÁô¿Â·_éÿ©Át˜¤Óm%MS�v82æší¥!i¬ˆ1¥v•·L3“ %ut«ÃlÇøGßÕž»]«û­ÿÿÿÿè«úàØoý?í×ø"Þëût@çÿ¯gÔ0“ +Ðm‘Éœ;aC °štÓM†“ M6˜h �¤› ˜¦)°“i]„pvœ6"Œ!vb•º­{ÿÿÿ„½´°áÿÂ_û ½x[h/ÛA%ÿþXÁV�b +WN¨ƒ@Ñ  FV9ì«+Š8 Â`ˆyF ¬rÆ `ƒ˜ ©öÐNé¨L1A„ƒ´ž“M;ÿÿßÿé|Víÿ¥ßøÿ„¼ ¿¡Kë¯Ð^MËÙ,"(è�™2†A“K”$V=5ÿÿõëínÿ¿é{ë„þ’^ºý¯â¹e ßÿoöõÿõüâÌuﯯýkúë×û¯é?öÍý™÷_ú¯÷ý­þß÷ÿ¯þ¾º_zÿV©°–a^ÚZ_ý£ŽJë¶Ïë{gë½�t�{ÙŸä0¡ß]^Ùš´þÒý­¦¨ÕX«I4íSaÒzv•¤ÆÅ í†Å*­¦�¬0Ãa¦š· »JÒTØ`°eÍ}-4°©´ÂNaeÐI5[N�:ÛA0ÂL•à 7pÁ&�¶šk¦�¶ÓØJÂI¦¦ÞÃJM–h‚;UÄ8ƒŽõB#*¨£žJPˆŠ9Ü£•ŒQÏ !ˆ(‚•Œ¡ „Â0ƒ „e+ÇœRqIÆX‚×â�ÅM�feéuuüDGªúKÿK«®¿«a¥h/ØJé´›K÷†Bì Pd([¸'@ͱrj…©°œ´Ò�Ç岠ɥ …£ÅILFê´ët…þ[kÚªåkÌ…ó²jªº§&΋0teYœ§#SO:µÊ´v +µ‚–{‚aÙÁè a‚]¢2Í’3ˆL˜&Gˆ<Ã*ó=Í£ˆð¥„BK‰†EAVJ„Fu£#&w£Î˳·Œ¡”¸™^“mBTÐM ƒ ô˜i¯„Ð&Ìå +t•6)¤l #g? TÓÿ¯wéC +ÏM¥ËYÐm29²ÎÏ °¡\* á´ÒM¤Û,äXh¬„ a²læ[½;Õz[uM­¤ï¥i?N·î´Û´•âðM·ðMµ2RB90„E¦Œ–—¡ºíÆ£êÛ�º«âûê«ýjžýu¿–>ÒÝkëkøÝÝ­ºŽ÷} ¯®«ø±_.®ëÿ¢ÜÚõEŽG@ÿåŽFÓ*ÆtÍÇB c%ÉIÚd2%̈È2!q¦kgC5X#ºÙeEŒ†gzJByCÒkoÿoÿ¯¿øÿD$ÎsXi Ã5èÐÂ6B<D'šG³PüEŸ—l”á#À0�g ÖÐS„Ø|!£ yæx# x F€fÙòk ¬3^`Ž Ï'Á0Ñ ¨EÞ2s#Ùq�Âmÿëÿÿþél?ÿûª ´Ñc´�PN“„›’“¤ágú ²bDW„hjéHù6ÓJ“r<44A2=Käé=¶“têNKÓéz>P&â7ÿÿÿÿÿ ÿÿÙ�VÓm\*º_†…-[T©+ +�0ÛIÕ¤›i ©Xw¤”ûV’IéÇIµp™â<ÇWe§Mêé0åûJßÿÿÿÿ¶– ÿÿý+§QñIÒÿÇï¯KI×ÿ½ÿ´µÅG×Qëô†’õ›ÛWÑNúÿëþÿÿÛÿÿî­¿o^—})pŽîõü[i:·^û½ßÙtÚwûÿ×ßMÕ½nýµÿÿö*Ãÿÿþ½ííqñíÒ�úÇôXëÝ}]¯ÞïÐŽßþôÝ7Ú¤ÿ¿ÿûýýÿý¿aðëû‡ª,£úþ-×,c¿ÿáÃùu‡ÿÃÇ᯼‡Ø#Jô›¿zÿÿý³¦ÿï÷õý‡°×]X}ÿU¯ú_õ°ØÁÿì?ØòöHöúlþÝö—ûfß»f~—ü35ÿöÃÿØz_Þ­ª·^ßþÚì6Óû]‡¾é6n v“ Xg<½m¤›eíXi/ýZWVcýµ¿6�¿ÿ†ðoÍä9ÃzÿX#z½îÒÿ¬6ü7ÿ†ð\7ÿ†(&�„˜„Ø ˜m$âi±I Ô ÓÃÚQJšlR¦Èóÿðø@¾°~¿ð‚vÐ_^Ú_øm†Á¿°oÿ á87ÿa‚”‚³ƒ0L$laˆGY¤{sà $ôîÅ…Òi¨a't×Þ¼>÷¥á-½+ÿAr:[öÒþFÿü>—¾¿ŠB2ÛÌ C³J¾×ßw××}õÑêÃíŠ�ôd—·ÿßKßõqÄzÿœüçÞ¿_Óê«o½5ú[—ß÷ÿÎ'Ò÷n¾ýí¥ÿûúÞ§N´ŒÿÿÓn»ÿÓÎu÷¶tÿïûü÷ëÓÞ¿¯¦×ûÖµ¦ÌÑëïÕ�gïlÏz¿d½«u÷ëÿuÚþÝi~DÆÚV�ªv±È®‰a°ÛUÕ† iêœŠá¶ØIÓa‚TêžÚoZM˜¶ÎV—«iÚÜŠ8}¤éi0Î}„›i*l4l4ƒ#|-…»“Cb�Bv› íˆT›ô�§iÃJQ BºM4#�L' i6”4˜øh‡†! ÷ T÷baa L!ds+ Á‚yXQÊ<£i©èÁ‚�l!WE]Žz4{lŽ‚ƒ +ƒ ‘k<4{sÆ¡2*MCb* Á²ŽêÜaƒB“Ñ�*qX꓈¤å4pßZ^–ºZºº‹i6•�ò0C¦µNB`¢?ÿ–KEt)_HˆŽÁfKdÙ”v§Ô*‘!¢¡£Ä¬ÁHˆ«ÎÄ}öµi.ûîï´u÷ÿþ—]ÿÉ—©SÇ"~#ÿ×¥×ùD‘~R%]uæJYvH‹êOõ4F øCAˆN¡‘õÍ3d@…Í‘ BB6Ñ(EAVHlŽd%�œEÐ�ÈM…aV~"“˜$BPŠ0˜dg’Ã>Άu26Î…I´‡HtÓFê>Q²�Ôúa�� „li§£CM°?FƬ<üÆÒ68†OaDhÐIæpL ÑàF€ÌgóL Â.1ÂZ IÂ#”5t›I†—¢<¤ðÎA°†ËM„EºM²èNa6“l´Zi&Ÿ5“Ba¢;iz¢8hðÂM¤Õ] ˜û«¥Âi_KIøV£N·% K„ÚW´¶|%Ò]6®“ �'¤ÃuÖTOë +–—¾:kŽšû½ÓÓm»Z«útû½-ïý¾—í4Ýi?ÞúýwC»C¯ûõþñú�ëo«tõî××Û´éqׯ–9Ç!çÿ‡ôß�º!ÑåŽEšÝ½9�þ·ÇßñýÿëZú‹.¿ûÿÿ–3â¿Ö=ú¿¯ÿÿÿ_þ˜l?ÿo×ô¿ÿû_ïÿýt¿¾Ãÿü6ÿöÿ’¡ÿ÷¯ÿýý¿÷J‚ÿû †ÿüÿô{ÿëþ¿ÿù>ÿù;#¾¿n©=÷øpÝÿ¸ÿJÿÿ÷ÿÿôŸÿAm ¿m*_þîÿþþßëýûßÁß_×¥ÿè-‘‡ø…^÷û:§vïýÿKÒ¯þÿý}µõ_ß]?ƪýÿy�÷ýH?÷ÿ_oöýßÿ¯_ÿKKóÏ÷¶»dëô›¿öÿºþÿöÍ;þú÷_ÿÿ[ÿØ m¦Ýì0Jêé³ûpÎ?ô½´»4¬#�.µaŸKm¤Ùõí6Òóiºý^ùŸä°¶ÉBd ö8lU¥i1LV[ºM6ÒM‘qÆ�²šlPcd\{i+i¶’iÈ®š"¸m¦žÃÓ°©’°‚†"ÌŠA’„Òv›"ͦa+a=5¨i0›MRtÔ¨ $œBm$Óa:i¦šp»M4Û–åða!“1EÎÒ‘"#0`¥ !Ða!"»*í4ŠÇ*ò®O¢±´ÑNf|«£ÛFž""9dÓq„ý' +ú]s²¼§DÜË¥¥Ô‹sTãlþa�Â*"U”™Ú"]…2¦vû­(ö)ˆ&F!­z„ŽÓÁAJGI´‘ü¾M0M: +ƒûº®•�BÂ1×ÿZú{¾ïÁ‚ A$—ÿ]´ûÄG«Ö—Í?ëªR‡£�]=ó'õžÎ¥æŒë¿(2^ëÓÉ7‘õô0�°�‚^3Ž:ÐZ^:°…ÅÚÊ¢¦h Î'Èq{60@ÈAH„pÎ…”3ìÔF²Ê )Ò^¨ïIµÑYA6šú¤M �&ô¯ôÒa°pi2.SÖÑñŸ“0�d\„l83»0�a„^B5‡‚4Uƒ4Œ £02C#š!—]+Ké\%h¡Ò¯XI°–“Öû-6‚mäÔÆ–“ª#¶“ZL0ˆ°Ñí¤ÃAi7¤Ú¾š¦‚ýRN—KnºZ;ý-&ÒÒÕo}µmõj{¨ª Ö—ô›§I¼ �l ÎD[i6ËnOTµUÔRÒéª×­*_§ÿKî¿Kö´ŸïÝ']}tºx'ï®–—Õé 1]$—IRT—ÿÛõéë·ß½Há]¯´¸úÚßI¿U^•.—Uú]z_ëÿøð÷ÿCý_×Z÷ݦ*’K·¤’é~©$—ÿÿúÃÿùc_«^Z~?ý7þ°‚é´‚ ô—Òð•_þþÝz°ÿÒÿÿÒÒÿÿ¯à‚¥o#¾¾’]pA*?ÿÿõðFý¿ÿÿü/ÿúKQ^ñU‡úÒ#MÿÿM¥è,7û¥ÿÿþÿù‘–M”^•týõÁ$¿þ¾Ä/IðÐ_ýÿ~£ÿü)¢!r“te×Ò·õ®–ãÿßûš¾ßúÿý¥ÿÿPŸ™ÁBšêT¯ß¥jŸÖ¼ÂJÿÞ½/ÕÿHþ¯Kÿ¿¿ë­õNm#×™ë×¥ ³ +ÌÕ/þ¶¾¾¹O¿á-¿Ý_½´¿ý.ïᄎZ]tÚZKéi(IÂJ–ß~õkõÒþÿû«Ûï_öÿŽ[ò襧zÒ7$ÃI°•Õ‚It­ ¢¢›X¥üÇí¥{ þÖÓº×d1öë÷Vû3öïÿzþv ®?ˆAñ Š 0A1LBÂÐMÒaTB„A„©¶“!m…NÁ»Tí6Õ°KOm&Â(vØ$›g)põûJþ«¯•Å¡„A�„Âhb‹Â¨Pa5hp�{ÁRiîìBL&žƒ B ¦›h&Et„˜b¡:iØL6“2U%%Ì¡òC%lº D§AšóH�F‘4óq¬‰I ”¢>J²¦Sä òЫˆÊDDDF¬eQÚ>C +V3JVriÓ „�MzvÃI¨Fɦì0¡ÁÃ8)æîpg�ÃD$ÍlÓDaò>a¢H@ÑðãüÐ@‹³ñ��áa’3dO0fˆÜo9—Ï (!øÚ'Ïufcò(ğ2@΂ˆWqH®MBN©:ô›kIº¤Ÿ&ÓFvBÑᾂvL|3´Õ ðƒªi6¡4œ+�ÇÖ��ãFÆg&¡ùO‚ Â44k#ócñ +â#K +¯'ïIÚi]Ú]–ui°Ï´Oƒw¯C6“jéCKAœ4›Aœ:u ’¶M6“ ¦’m &ü*"Åé6tkÕRÿëÔ~ë÷oñ}µ÷KQ„ÚWN¢½%m+i6ô•¢Q_ø&kÔ%½+KïtÞ–ÚÞ—©pŽû×÷íÙ'Š—KnÞÝ=½¯éZþªã_ýu«ªm ¾»Ûøý]ðøúzïÝÚÐïuß·zR8_n›n²8Z¯Ý߯´;I°‚×ÃïÛXn“E§ÿÿùf8ÃúoáúòB+¯ªÉ"?õãü±È¬¥B˜ªû}zaõÿÿØúL>×öÞ�ÿ¿T?ÿÿâ Ò˜/ì?ûØmá¿ÿÿaûþÃßûaýûkëÿë¤��ðßå tƒzA¿ÿÿ ÿøoÿÃ}¯ÿõàŒ?ÿ·ÿÃþõ¨oÿÿÃÿø7ÿá½ÿÿm}ÿøG‹¥ïÃ¥°Ãm‹÷ÿþÿíúÿé_ÿþÿü%¶‚»ûõ¥ïaÿÿýýowÕº÷دýb¯Kÿô½}ÿ¯îîN½ÿÿßÿ³ª×ߦ÷¦ö½ï×A ßÎuÖ«‘�w÷ÿúœÿ¦þþ›¯7ûý¯[ÿÿ…ö¤uõivŸ¯ÖÙšÿöý+Òl϶Ì×ZN¾Ý{fŠÞ›W³5ëÿúÛv"vº\ˆ;jéí&EàÂö©¯eûn²õ¥`’°ÂéZV’úKL0–ÚN•6¾ÿÿdÙþÈ®“dc« û *m*b“M�¦ÅpÒb¤„ƒb¡¥¤A&ÖÝŠdsi6–Å äpÕUSNa°Ø¨4F&⎻O²=aŠatÑã*è÷(HÐÚ¦FB•ba"²LTB w ˆA1aPb`Š&ƒA6ƒA¦š{öˆŒÄ¨rÜ£—`„D!ŽÉQÄHGzäæOu¡É¹¬ãõÒ~•zDÙ+úý À¦‘Ùª;Õjî í~ÓA�§dÒ OKa ·ÿøN¨ تëëy\_FÉ7†d·äÍ´×õ&À_OMyk§2;1A‚˜k9Êâ-frì®)Μ�²DÉUŒ jIŒˆ2ªÏƶudMŒ”/ NÁ²S7ѱ±G�3h28±„hjPžOk #CD$ÎsXeL‰æx&�‚3†Ð `�„g ‰2ñÈìœBtl‚!(EAງ ÆD2`Ž…IÜ:¢‡,"m¦’m + 0’l"#°ˆŽõI´�“E ÚhΡaÚM¤Èù¦šA‘Öo °�6��4vÕ0�Œ#d#[$h0�„kdùƒâøQt·¤­�¯‚ ê“¥´+MµD°7KV•QYI¥IÒtaQîË@M¡¤ÚN�a¦á¤A6šïÃ꟮âýnÛ·é?ë·OÓ¶¯OâÚÒâ–¾7¥hœ$­'JÓm+ jûÿ�º�í*Úz}ÔRðéoî×Zûþö“ª{ÿ†•?Û§Iª½ðýô[’EQ„øý½þ>û{¿õûýoj1¿©+Œiio¨©t¸áÿã|±�/}ý/×ÿñ_÷þ‹Œ÷ø-:][ô¢7·ÿº^Þ¿ÿ¯ÿÿÿýû ,H|÷Ñc0ÿÿþ‚ÿÿþÿþ­¥ÿ÷ÿÿÿÿÁÿöëõñÿüˆÿÿÿaý~ÚXaÿÿþÿù ¶ÿýom —ÿþÿÿþ[i~éaÿÿÿÿþd—¼Èr+”D_&õÁÿî+â’ÿþÂ_ëÿé;¿ˆXnÿïÿÿøU3�B<0 ¦] Èÿµî¿]~·ÿÿéhóCÿÿþ¿Þ?Òj°¤ +ix�‰ï··ÿ®¾ÝW·_þª�~—½þýÝßýñw~­ZÒþìÍ;f‹­zëÛÖ÷_ÿúýs›Ûß¾Ý~ý÷]ýê†êÿmjÒ·ûJÒû»û¯>ÿõ�yýÀ�Mÿ··{¯·É5¹: tHJÚL‹ ÙqXd/øl=--XfDÆÚZ§Èƒ†ß¨mm&é†{ÖÌmŸöÏÍÝÖ­¶gÿõõ}�ªáša êžÂV; B§i0ØI4í4Õ8.ÓM6¶¬S�±LRlS`Ž;t»aœØa+úë뮤Ž#¹Â.e>P�„ÂÂG¸b ñ� Ü«r­´Ôóa{�é±0A…Û «a0tašlSƒ™*"3ÎN)FqÈLÙ�E54By9ƒ%äÃ#AXOR*¦ë'©ôóŒê2 +D�é•(ŠÄDý2±¨�Žd5�§ÃˆŠ Ä3í<™ÀІ!#Û'Ã0–�ÓMa<#[68Ô Ñ°39=D™é0˜F†¡0�m<3H&°h„èA„]²O0aÃG¶l�žˆIž‡‚2‚-ÃHæhF“¢%šÄÔD#_Já\´†á…Iá›--¦�fÉ&ÐÙgL0žˆì‹ &Ñ´ƒi0ÂMª=´žHävÐM¦©6“¿ºªa&F  ÇI¼žã �Ï_Uúú¨Âo]êƒih”tžž¥ ›JÒ×M´�¨+JÔ:V®áöc óV’pî—«2I6Ën…õÒô�ýúï§TÜ~ñ§kV–ëk]÷[Ú]Gÿk­/ÒõúVõô´®«½Ó}o[qµ¤Û¿×½ uï_ñ¸¡ÿïN®¿þû­[‚­‹i:Zø{ãëè±ÈÑÿüTC‰ý~µøûÿ_׿ëõaYtÃöýºïWÿþ¥•ßÿåŠeÖûÿ¯ãþÚTßAƒ A*¾ßë®ÿÿúúëõÿéCÿÿ¯ÿÿüQý’èGû‚;úÿÿüÿÿÿðÃÿýµÿ_î¿àßá-µÿÿýò,ŸÿÿÃÿÿ×ø#ý×ýû×ýÿá/ï_ïÿì7ÿûh/ð�éøKaë¯úþöÿÿ¿ÿû#Iý/öûÿÿ_ÿûú_ßëßÿ»ÿÿ8ÛýïýùÍõ×úoúÿÿÛ_ÿöû:¯ÿð“þ¿þ—oúºõ}sEí¯úkíÞ¾ßÿ·~¿úwßÿ»m>ÒÒ[ Õ¤Ã_t¿·ã˯lþÙïý»¿lÏìÿÓlƒ¨~ºýï]�6ÖÒ¹7ÐLRi¶‚TíaÃTØØá†¦ÈAÜ‹�a‚JØJÒ²=iÙ}4öÛÛäW×1½¤¶G&ÅCPè+ ê$A¦Ä$anšM0 *ÓM…M&›ƒ Si1ZlR¦¶D!ÂÓ†ÅPm ƒˆˆg Ùà˜B"+H• gÛ•™W„R²ø£‚•Œ0AŠ 0ˆs"áÏ £aa‚„ÓH«a6#ãŠäØ B# 'ìõˆŠ¿]t½KqÌ®]ÒèÉe˜)Ýe´»­JósÄìD…¨G‰n)PÊÍÁvÐX]'XZZ…R[„ê#ij/?—ö”ún † ‚2*C�è©-¿Ýíâ"3ã…~?é?×UñÍ8S¬F¬•¢�¦R)DÊL‰ÿúä'‚.Ê3=Dòt4† B޼HÍŒ‡ç�!B7ŠˆI‘S—2)I!ff¬šsŽwÿäЛ +˜NBFôÒm Mªh'ðš64ÂhØ£àdòhØÑ�•|Â=°�lŸ0d\PƒÐHTœO.3<�°ˆ† &Ý#¤ê™ãeÒ ÎM³“ 8Òoƒ8Òl!¤Û&tÚL0‚mÝ éÓ]SI†–��ÐlœÉÐóØF°É¥ôÿÓ¤ÿ¼&÷á6•¢QJÚÛDž—ﮕ…p™â<ÐM¤é7çÍÝy0$ÈïþÿíjÖé[øþ»�é7A„©¥ï�nýjÚZWí¾»¤ÜŸøï¿ûÐî­ï~ñº‘Âë¸Ç_Ú Nêûªûÿé7·×ÿýþ­C©}>‹Œö®ÿV¼~ÿíÿÿÿþòÆQc+~?ÁËýzÑc‘Ÿ¿þ­ÿ_ÿÿÿÛÿÿßý‡ÿî¾?ÿõÿ!Ïÿÿÿøa÷ÿÿ¯·ÿÿþßÿÿÒÿÿðÿýr¥?†ÿÿÿÿÿþdgfAæF¾‚ÿÿÿÿoûïÿA~ ÿÿÿÿÿü)U@¦h©0R“#™Â#ॿZ¯ÿ¯þÿöë°—ïÿõÿÿôôèDzëÿÿþõÿþ߯ÿ¿þë÷ÿÿßyx_ßÿþÿoí|æ×[¿¶¿œÝÿïõÿô¿þü/ÿ_ý}»ÞµÔòý³Ol�v—þ½_û¥{WþÿÌ”–8ú[îȶEpý;l‡v› Ýeõm/ºOµ°•¶ &Ýl3ÙëVíµlÏ×î›VÌׯÿuôÿü|ªôÂtÂi„Ø…ªllR ´“M´´ØbMŠ¶Ò¶;†lwL0I?M´›N×Òo¾ÛKÿøþ¡„"ŠâœøÂ>9î‚GÖ&ñdg„ج&ƒ °­‚ †ÂA0Âß‘ÆÂ ˆH4ÓL6“b“†‚‹UdU $Ö “ft(3Æt#¡�FU�"¡y9Ñ:33¨üèDÊ{9¢YšòŽÂ׈ˆ�&V ‰";1â Âb�„td G·*áˆA’€˜W*28IÛA´“¿„FÀȌΠ Â4 3EØac3‚>Â4lSƬÈ6p�a‚5†i„0@‹³HÙæ ž7�–Gˆˆ‡˜f¼Ùу>!Ô9¸¤"ÈŠÏ„øØS›ÈÙVäßÍ#“=”›T³G¶“a&4h'Ut!é8j’mé0Òm4ð� &ðšA†“i ù°jšQ°4n²^LæÀôlq�‡eYˆ�ñm+ +“K¦V“­:%ïJö’m_I´›LñÛia3Æ–•„n!„E°ÐÒl °î“²Îœ2|H&ëÿ¾ÓúÿúbÓþô¶—í­Óú^é:W¶ü”(N‰E&×Ý/ëz[_º‘Âá¯KÝHáRßï¯X×Òã~ž¶µÒý¡vÜUéý'|^õM/üŒ¿ñÿ‚_†ïŽÞ‹SêÚïõ»Ô{´íU¯ê=ÛÒÿHÿHa÷ýb¿òÓÿÕÈÿ÷¯_ü7ÖXäm„¿ÿõ×þ¾¶¿ÿÿÿÐÿûû¯épûñÿÿ…zÿ 7ýëÿÿõÿßÿûÿözKÿÿhÚ_àÿ“ﯫÿþÃÿÿÿÿÿÃz)ßÿ¿ô°ÚWû¥·_ÿÿ„ ÿÿÿÿÿ ¶½ÿôµ/ðýa.Çõÿý/û×ÿú¿ï ûkÿõÐB÷ï®»w÷þ¿ßÿÿ¯ÿ»iE?ûÿ­müâÿ¯ßvëÿ_öÛ¯ô¶÷ý½âžÿ·ÿ­·Z­7~êßÿû~¿þõù¦ý[>¿ïd™é¿êÒïvÌöóòÝ6f¿½Wm³=ºµô»IµÕ¿HòiÛ'VE½±¦�§ †ÛÈAëii+"¸{ cíÒa—=u‘\=Xg&IÒ»î­Õ»nØg«1Ýúl%aZa‚M5º{ &m‘Ï ' +©ˆLŽ8L0ÂLBMiÂÐi±LSi0z$Øi1²8±QV¶û-áhEìA¡Ä*.b!ÈÈ¥c A+>�”{´Ò>e[ a)Ú¸¤Ø„Èà&¨0šbžšaDRqG2.Šê#™—·ý"þµèÉ+;ý~ ¡+¥¢^%â¸�iiu„h�ˆÂaB„ “­¤ º]i¯£ÅH>È]“t˜ºŽîézfC{xOV¿Qþ"3D›èïLÝê"¾¿®#\“ÔŠ/ÿ¢&H²>N!9—ä\ÙE„.EIJÏÄðØQg)\ ~n5‘R3µý4…´~ VˆW|„Â5‡Ÿ‚.Ã'“F»RX]‡'ä§»0‹€ÈÁž F°Éó »1›Ö'É +ˆ!Ή£†FÌüu"ž ò«Ùgg�+]&Ùtº"ÛH;-h³IÙ>M ˜nA<Ž ·i&Ô&Å0˜6OÍ��ÎÙ:HM0ƒ! ˜@Â4i e@ÈhÓ60‘�î•╾ðV—ªMÂzwv©·ôž ´›i¤›Œxh8wKJäç|*#¶ˆá£ÃIІš &˜L%#n§]WÿtŸ÷ÛLwIÿm~—¦ºüU¶�õA<&­¢\Ôñ*g�?øî?ÚÔw[k»õoôºn-µ´Ú×Ö—ÿiºé÷Zµkü±ÉP4LrJÿÿ×ö÷Uþ¿¯¡ý}¡ÿ»N×Öí´ÛNéÒþ—«~ýU¿ÿybN¥ŒÚü8/÷ÿÇwwÿûÿÿÿa½×ÿÿëï^ÃEŒÿÿÿ}ßÿü7ÿÿÿ°ôS×ÿÿî¿_aÿÿþ»ïÿÿÃÿÿømµÿÿ÷W_oðßÿÿëÿûu&æ«ûÿÿáý´¾ÿÿÿÒðßÿÿÐ#?ÿ÷Y6PÁNÝ”¨ìÌ¿ßÿïÛ¯Ú_×ÿîé^ÿÿü ¿ÿÛAJà‘+j©ÁB®Ø2çýÿÿÿÿöö¯[ÿÿëÿ¿¯õ¥ÃVA0˜b ÿÿéÿøoðŒ?ÿÿëÁÿ®¿ÿ¶­Œ®r¹�ÿÿ×ÿûðÛø@¶×ÿÿôÿæsàŒõÿðØ#<6"#ë_ÿ¯ÿ¿Ãþ•õÿÿú_÷è/Aßx6X7mÿÒ»ÿÿu­xzß½„¿þ‚^ÿÿt·ÿ_þ»ÿ÷ï®–ÿý¯ÿý¾¿ÿï·½ozÖÿúnÿÛ9ýzý7ý¯í߯¯ýþëœOm.¿ý#=³=ûöÌÕÿëêÖ•ûkÿÿmš.¿×ööò�×ö¶•—ÓO½VÂL0E;Ìw¶¬4û«K°ŽÿVÏ~õßá{lÿk¥¯ÿÙþìÿõ}Ô6‚°“ši¦œaŠcØ šlPdW®tÅ0ûA1A›i&©¬0a¦¬0V*Ò‘\4äWÕ°¹y°•ÚR(îÒ†!B#�…½méz��Ö÷�ËrA+!P¡ü?ÿëÿ®×xÿúÿÞ½zëß_�H±˜~Ãÿþ—þhÈï ?ðoÿÿãÿmzK_¯îš¯¶¾ÃøÿoÿÐ^ü?ÿþ_ý7‚3ÿÁÿèïÁõá¿ndËs kÿúïôá¿è7ÿÿ¤ýö¾_~_íúAýµð߃u+ŒaA¿cÿ×ß}_ÿïÂ_ïN’]þ—ߤޗÿxoÃ}T©5ýþ·ïUþüâ}ëÿõþR^þ—ûu¿q^þýßïþ×ÿ5õ·Ò÷kû~¿{úÕÿ{ñ´¿´ûûß÷ý¿ko¿_îÌý--ëû3_®ß´¾ßª÷µþßyFþy?)[æSZi«~Ã#ˆÙzäWºÈí°•¥ueöÒ³í¯éíÛ]ÝÙüõö»k¾½™îßÕ¯õõÉV[Æd•¦šlŽnƒd ö!l'M°“­&Òb›J)5b“N6›"?xm«éȃ‡¶C¾¤QÃÛJ¬÷m¯v—ýu\íM©XÃBŠæ(ÐÃ-BªEcb& +)ŠiŠa\0Ò{º ªjštk ¦Á4lF× á±XcNÒb:Œ�0¥F_<‰Ñ¡dt,�Y2E<¹ÈשPιtIQUõ&Àl#%„q¨�‚i«m<Ï �„"ÓAM0IÄ&G +Èç "ì0�ŽB#Q­ûž¤˜FÆ¡0�ašf +Bq‡)Ã(Ìè  "Ç Ó#@0EÀh„é��ÄDæ «%©ˆBäb ���HHÚ"d´�eг’àšI´4›2ãH6‡&t!´4,#CAL&mߦ�Í#Á… „k?l ¢AŠ=¹ Ç‚~k #[S|Â42|Ù9›GŒÖ$ˆÜBºß»Ò蓤®6•¢Ot¬"1è—M¥¦xÐN“l´y„›dçtGm'e¢“ a¤ògj“aÅÛH6¡4~qÒ5µâ“~ÿ]4©íªt×¶Ó½N¿oëµ½:O­6�:»¨t­]Ý+Aœ0•´Ò6Ën®×ýº­Æ7m ÇKÆ�Òß¡Uá7§¿M¤þ®ö£îº^é]6®úÛáíýê>‹Š2õêÛOõú¡þ‡ûZŽëm=î(uÿïMt“~~÷_�ËOÿüå¹!¯ËrB?ÿ×÷Ö¿©+Z�¯öýª¯ú_ÿëéc¯�þ—«~Ãùuä‘Ò}[á‡þèîéÿý÷ÿÿÿø~•~�ÿ¥ü?ÿêPË¿ûÿÿXÿÿÿÿÿðÃÿÿýº¯†ÿÛ¯…ÿÿÿáÿÿÿÿÿÃÿÿÿò¹dW%Ãßú¶‚ ¯ÿÿ_ßÿÿïÿ‡îÿïý…)#é{ýûÿëïßÿÿ~õáúïÿöÒ¿ûMú+™{Óÿõûuþ—íÿWÿ¿Úûûÿ¿ÜW÷v×^þ»z·úÿªë·ûÿö¿ÿÝß÷îýöÕ´»6¶¿lý¤ÙÿÛ¯ûOÛ³<åýö¾ß¶—’?íý½µù\uí¤ÚI²) ‘\=†´¡„­]$×N ¹{ òm+³Û öŸw¶~³kzþ½ÌëÛÛ4ýºzúù\j"ð¬Pm$Úz‚ ˆV‚ PMa$ 4ØM&˜c Wi±[«ȹm$ÖÕU†L>Ávà {g÷µY\Yd4Kc¾“ÿÁ‚ B5 aˆÊæ "9>4W0Ä$|Îô{r²ÓèÎØL'aÔ0‚ ’ºvM[i&›�h6)�ƒØ šlUÐW2Í"F`d;EAà´äIœ™PXÀe�ÑÂD@Ë™�3æHÍ™‰Æg’„f3[>ÍDSÊC%:™D Ó5#±ÑE¸Û¡HFŽëÄEÎÉQÄ Ê¬! šrŒ2U«†dQíP`­0ÂØa OÁªitl SGÆÉù9ÓFư4Âj~Mª Ô ÉàA„l ‘ðÂ.Ù¤hF°Í0�¢�a¢f€d¾Á‚5†HÍ�(ŒDŒÃ5昆‚‰ˆˆäÙئ…)¸Óº óI °† »¡ ­&ѶLïI¿‹VB";CI¶šA0ÐfÌ#CI´Ew¤úM¦˜M&Ó šZMªjGæ�”lüG½Z_ÉBïÑ(…zmí(t›øL6àƒh”Rmé+IˆN“h²ÏvZm3„xÒa¦y¬² G0†m&ÒoK«ûú¦Ð¤Þî4êôûB·õ[¶õßûMkÓzޕӾÝ6®“¤òv¿ÒoõûZèzþÒŠØé¿wvž…&î�ýзÿVÝ­-÷Ò·O¼zÿ×,r4i¿ê¿Ýzÿíý×–:¯¾¿Õ¿m­×]ëãÿê­÷ÿÿï¯è±ŸÇø=ÿ_ä=§A¦ ÿÿ_ÿúýÿÿ÷m/ô¿aû×ÿÿ.°×GÆ�ÿÿÿÿþÿÿÿÿÿoÿÿÿVeÅžÿÿÿÿÿÿÿÿºÿÿÿÿÿÿðßâ#ÿÿoÿÿÿÿÿ÷_ûü7ÿÿÿÿ†þ¿÷ßÿÛuÿ¯ÿþ½_ÿïõýÿúþñÿ¿ú_úÿ·ÿú[ì?÷ü>Úÿÿÿîí×þööÿÛzÿëÿþëoûÿÿ÷¯öëíõÚû}š-éµÛµûÛ_ÿ­ÕÿÛüÓ÷¯íõöΛ¿»½»l[K»lúzïWK?~¶—uL3ÿö~ÿ®Òýë^Þ¿4Õ+JÁ馯¤m&G›i&›#ÀÛItÕ;ÒL6–Ø$ž›ažÙ…i6cm-vÒÿ1¶’ì4›¦êí.Èà&aŠz°Âd‡Iõa†‚½4ÓNÈè$ƒl$Ðb•4Úpv”m$Ði¶’i„ÚPÐlSjÚRܱ +±Y(P�‚)ðăuH®(ð`¥]ÅL b˜AˆA«Ï ‘žpí¦)8a…˜¨ˆˆå¾"´¡™d¿ÄDG–n.Y‚�LÈ øUîÊ3±Ý}&“S%›º�ô¥OË*ÇšüìÅÎÊÓQ×_R7ŒµËYÔÈœJ½r‘k¯-zŒù‚4k "ì�"¢&È�!)@¤�!‘ND'äÈ+ ¢PE;?ˆŒI�d wIÒm' „Òðš60�a£XsçØÔéá0ša5Ö¦ „ #Xf˜D~BLðD €LÁžÉ2‹»¤é6•¦y¤ì³†pÒm áI¶X„Û-<",4xaSt›DnÑá¤Ú‚n·?$j¿ŠétÚ_N•¥ö»¤Þ°Pß>ZM L7I´K²Ñyg¤ØD[¸¿}~µÒt›Ç[i½õ½¦×«t·Ò¸OûTõûÆ¢½ôÞí>íñ¿Å»õï¶×ørÁ>¿è‡O¦áëÿûë¾µé~—¿Øÿüµkáÿÿÿ-?å§øÿ»ÿa¨_ÿýv¿ÿÿÿúúßü7‚3ÿÿÿoÿÿÿýÿáô¿ÿÿÁ¿ÿÿÿÿÁ?ÿæJY‘má½/ÿþü7ÿÿÿ_þ�ëÂ�­L–Ÿ»¥ýÿÞÞþ¿þ¿ÿú_ÿÕ?;¸¨ŒˆŒˆüæö—ÿþúO¿ÿÿw÷ú_·_þÓ¿Ûÿoý»o7¿uÿõÿÿ­þ¿zwÿÓm+3ÎV¾ÿí·×[¯ÿ®ßíÿ¯½"XýVØ-Ó`’È£‡ðí²÷Ùí†{m+JÌm¤½þ–ÙÿöÏÿv·Úÿ_2Ó;)ÆE�¤¦á:i†8„šaŠbƒi6±M¥j©­¤› SØaSì¿"ŽcÛKÏ¿úª°©Š`�¦–Ù+Ö›4ÅE0˜„M4ïA&Ä$Õ6!&›ìRa´h?œÑ¹a4„“—Q!ä ÈfC"ž%óYÒR‘F™&Èè†d .""æD¸3ŠUQ.Ê|)U•eqG*èöØM4ÂG¶« +×dæO§äkeA„h Ó0�”{aË™à3H dð asÁ2æ¸#['Ì FžˆJp¬";ÈìœB6H„U’óú‘ƒ!(E+ êGY¦E ŒäRäY&ØË7}Ý–ˆA0ÕÚNˆá¤á'I°“j� SJÓP‚t›PšAÕ ›‚�6�Ì&yù4%äè]‡£XeD˜A£X3ðMFv�l#[¯¿ª¶›¥hi{¤þ›iž4› +éiXLû­e¢•®Nmg»,ðƒ8ú ¶Y6¨ŽÚ ´4˜i:AÒ ¯ýúßýÒutº}Öö’t­õuJÔWÛÆõ¦ý+umPNtF=-']+Kÿº·N–ú÷C[í﫯ïÛï‘ÂÚŠ¶þûú‘Âë¾ê.1×q�ÿöþ¿ØuÿË­Gáÿƒ5¯ÿýø.›ý'DãÚ¯¿×õõØj¿ÿõì?Ò×ÿþ�ÿÿË'ƒ–ȲÿÿÿØÿëþÃÿaÿÿÿëÿú°òÊj¿ÿùQ·¿†ò^ÿÿÃá¿ÿÿÿÿÿoÿþÿÃè/ÿÿðoüÿÿÿÿÿÈ‹ÿþÝz_ÞÂ_ÿß~ÿÛÝÿÿ÷ÿÿ¤áÿÿ¯¥ûäbwÿûßýÿßÿÿÿoÿí·ÿ÷ÿ_¾ûKÿûÛóÉÿmÛzÿÿoÒþýw¿ÿizþÿ·¯û{ÿÿù×û_ÿ×ßý÷U9¿Ûïz^Â(~¶ŸMßë¶ïlÏû®öÌÿmëÿý³EÝ}ÿMÓ�ƒ¹-¥i¶,5¶;I†aÃaéé°Â¦ÃØa$Ó´“²ú°Ò´˜g“i{eïVí°•˜M¥û þ­Ÿì'jÙš¦ÂØI²C¤ÓÚ´Ã#„Å1Té¦MˆI† Ãb“NÒMŠA±WLm¤šqJ¶ÈâÇi&šlRlT3OI�í…£%T""„kRŒ ÂÐ0A„HøV’tP�„uÃB ÒG@¤{°‰a2*@ƒi°¡ÃN¶A†TÓ &iÆ ©hEºFKBb�‚� 宵”ùÈÈ+‚ØÂ…2R2‘ Ê«;RèŠ?ü#Ɖxˆóy¾ûé?öv2ÖÿÒ�‡ú[ÿÿýñü‰øµý›"¥@΃5‘Ðe>hY ˆR4�dSžu^jZÿ £cÖEóXfpL"í“à˜F€òœÏ˜F†¬2|Ášð@Â�a„lšAÍ<‰ò.ØGÊ)Ú„Â4! „ã[$eÈ#d"ï¬2˜@ÂG0Œì¡„Än1žEó™#ȉB%|Iq]€<8ˆ� +AÆ�…e�ž;Ò¦Ëö +Ë:i&,lSféÐA´ŸÓEcIäæL醆“¤ÜŽ“f¹ M Èù0Òx¨¤‡´li¦]'u½ýRí¯þ“º¤Â}Ò…WŠºv•»¤ØDcÒÒà›Òl*'ÁžkiRM¤Øi¥y4Úgqôºõéýw}·ýÒ[ݧÒÕÕ4êÚõnšIÒöõýÛKV’½ý!inšm´´ºÿú}û¾ÿÓï_hv¯ºUõ´?^ß½iu¯‹i^ªõ¶•Ö’ÿ¿ÿ·Kîþ?ËŽo¿Õ·\}ôžŸxáýè{ìU¤ÚA+ùÇá¿ýÿ_¡aÿÿýòÒýå ´¡òÜ‘þ ¶‚‚¬0H/ÿô½ÿî·õõÒXh~Ÿþ¿Þ—ú·âÃö�âÁUÿ}ºÿý×ÿðFÝa‡#wëÿúïÿëÖÞ“ÿkÿí¥ÿÿ_ÿ �µÁ¹Tø#:ÿüÑ‘ßÿø#=µØmÐoÿýû¿ÿmuÿÒÛA[­øAÿ ¿ïü ·A`ú†ÿÿÿÍ]ëþ+ÿð—pÿéýè/¯ÿK‘�†ü?ÿýÖÂ^¿û¿ê·Iý/ÿ}}wÿ®}nÅ?ÿ½¿ëý­/ë],ê¾ÿ_n»×þÿ× ½§ÿÿ·Ü‡=Wÿzÿõ¶ÉÕêþ¿ºïÿ[úí�ž÷ÛÛ/jÞÜݘݵ]o´Ù s i»û¿´»O].ÏÞ½òìÏÒÿ³?üBM6BTÙr¦Ó°‚M›M ¡„ÓTìmŠºÕm6 Ué6Iô¶ÂZ"Ž †•×if6Òþ×mXnÓ•“ö¶Ò ßi»Û ’i¡§´ƒA†A&av’aˆA4ÓN¶Å6“WLS˜M9oR(g`xbŽÓäæ!±^Y +Ÿš?C‘ñ†…¦‰ÆŠÆÂ”r¯*Ú=¶HÝ &+dT ÂNø^„Rrl�Äp`„DF¯«…zK¥ëÒJék&ÊqØvií%ÒÒH·(aI\¬À¦CQ£;P̉ØH$ÃI´‚_}åo +©–h¡ðÈ›±L�Ò￯鄛–åÕhÃJ×]>í>�ÄDZ+Ÿ�c�ºÅuõü”ç`k©ÔˆÄi™Y#_ûÕz!&kdø ah �Æ"!fb`ˆ“!44Šsùsy¼ò/„"²¼;Ò§½(ým>©Ö£NÚ¿Õ:]?JÛ¥oAUÚV™gM¢Nÿý÷¡õþ±úÛ»ýñ­ï]~Óº^:ZzÛixøé]5ñþ å¹#Çݽä�n¯÷wÑc­áï×ïõ¾‚CãtžûÕ¼z_ÃáøÿécêÁÿ÷ãVÃüWÿÒ–9$QC®ûëþÃØkëÿ÷L?ýõC‡ÿÿ¯ªCË.ÁðýÿþÂûº·ÿÿ†ÿ^ÿøÿ}½‡­þÿÁ¿Â4Kú ÿÿÊ›oðF×åßíì=‡ÿ+š³»ÉtWÿÿ íþ‚ýºöÔõÿWÿÿè'æwÿƒxoÿ…!0S%,¥²7�Í�š{þû÷¯ÿ|Sÿõ¿aÿKÿÒý»ô÷ÃÿÿO+ )R²" +O ‹¿ýÿKøOÿ¯ioú¯¥ûý£»Ãxoëûï÷ý¥ ûü÷Yζÿ÷orÿý¿õÿõý¶ý'ß}µÿï½{àïîf¾ÿý³5ÚýYšÿÿÒÛó_ÿþ¾«÷íÓyåäëÿþd¶±ÿëé‘x0©ëuÝv‘GËÖí®÷_­ÖÙüô•õþ¿ý§í·v•ëZÖÚ_õñÇ*�)4Óa„“m$b–±-1KZJ©ÞV+O´•>Epõõƒ.}¶Ã9mžÖÖêî·¯úÿ¯°ƒtŒär)á²1vÂA´ÓPÜ0½ŠM4ÓÈèC„­(MÃTÕ6ši¦ƒkA­±R*qA;½d[­¶—2Slˆc'Y@R(ŽÔR`ˆfH iç#QÜŸ5ÔÍE�ÙN½?,‚˜3”Ê1 +Rr…ÙÖ B•ŒÓ•nšEcGÆŠ¶�nUá>žL Â[ °Áp˜L4‚l4�p�� £àrs'8Fé &» ü\Â6‡€Ñí£Xh„è@Â6Yæx"Ø4w #;Ðð@Œe89qtD°ô(c0Góhò/�hÜh)¬Î�ÉÅ5ÅY�„G+ƒFKh°Ð1 b¥^“Ã8a&úZ¢;h'BÐV­„�&äÇ ÐÒmSFz*ØI´ƒ%è7 › "ñ¼Y¥”\Q㋎5L"í™Á0‹Ê63H&3Âa1ùf— ÷§ÛwÒÖ¥hœ%m/t­ÆÝ+ +› [IÒt¯JÒa—íp¬³¦¾ ¦AÚ ´E†‚t˜haBhðÂLkÓtžý_§V¶•4�EwÛ[ëýi+ÒºÒÛ[J¾ƒ¿M$Ü¥¥¢7…źa%ïÖÿ­÷¡qŽ»Cë�ÝÝ.µ]U]éß}ë¿ÚÓÛõ¶š}×_]zÿ®‹éoõü~G ïÛïë¶ÚN(mkÇBïî[êßÿÿâ¬9b_–%üDļ­?¿ûu¿òþ´Aÿþ�¿ûúÿÿa¥ÿ¯­õ¤?ÿþ¿uÌ3¯,gýi;þ¿ÿýXÿÿ×í¥ÿûuîºÿÿþ(¦j@ßÿ÷ÿù87ÿÿ”-µÿ¯ýKÿÿþ†ÿÿÿú ÃßÿøWmûiÿ×·ÿÿþÚWöëÿÿô·ÿÿÒâöÅþßýwÿÿ†Ò¿ëÿÿ}ª»ÿéhÚþqÁzÿÃø÷ßú„È÷íÿþ¹Ï¿ÿÿVöÂ�ÿÓíÿÿð‡¶—÷þÞßû·þ«þ—×öúÿï·þ×½7í¯í™­³ÿôÙþý³÷ý¦È'³5¶g2 G¥ÿWO¶h½¿ÿºa+M´„ìiªl-±ÃaÚLT‹�X0—ªr áÃa…Øa&¥}æ7Ò­µûØg×û í… Ä ©¶…AYtÓ PM„í1M4šlBM;M„ÓlPA± +ÂpÒ ¦bªÒtؤÓcd?µTÛ•ë@Á¢·¤�#V")ñGÉPÈ'D¾Â #Ò )U<ܬr¬B•txvÖFŤØIØd®A¦šw-xqH9ØÞ*eD2“ÑÎë«Ö")?ÒÖ–½uªûJÒI.ŽÊâÝeù•FV­¤ÚJ­¥ ÎÊ¥%å b˜ �VÒýÿ–�R LUVû¼F°dÛ�•´… kK¯ˆŠ®8ù‘5MWõ–¸`� B��"Ã5’!3Ÿ REæt0¥!ùÔ²SúË]<¨0š4B.¾|a3‚jz28§�!&xBLç5†Q #@d“6Do63q±æÈ“02. ÈÁŸEŒ�#PÊ}N†Eº¢;"ÛI´ƒ„›I´GmåœS + Ù3¦äÇ…IµM äªPœE>'‚6=0‹ÈF²Ã5‡'äèx0�lÒ!<Ð ˆæN�³1+ + +Òê¶•ÂqÑÝÕÚ÷I´çXTæÉú +>Õ'†pÐN�m&ÝÐ2äŒí&Õ=é:i£fû¿«éþÞÕ6–:_¥mj=[õÚ¥téiZOº0Ý&Ó«¥íî“Õ«ýzûöµzM¥«¤Ò[¥ºO¾– Òê·ºáSu¥vYÓ¦yÚJ–½·ûw¯ww­- Ú}_ÒÚ¾ÅZKÕ7vŸ×Tÿô�Eצð’¥w׬ý¯÷þ®¿zÞºô=¯¯míéÿë}´�!ÿô߯þ?¢Æ¿®?ãë Gå¹ ŸÇø/†ïü=®°È’ÿÿÿýÿßÿn˜=|ÿ–áÿì<«¿ÿ¯ÿ¶—ÿêÚZêxVõÿõÒKØõ_’žÿÿæ“ÿå n¿ÿaïX#ºØx#ÿì¿ðßí¨aªù±iÿé?þÝ/ÿ¶–-Ö�ôÿèÏt¿ þôÈlŽÿ„¿ûýÿéq +ÿý.!i~!½'ÿôÚ +ü7û ÐOãýK×ÿÒÙZÿÝW�=vá/¿ð—�ïü}/ëõïú¯ÿà­ÿÝ._ïÿýt›÷ý_¥ÿ]~ëÿÿUÿ÷_ÿÉ}ÛUÛÿð—ç“þ‘_¯ÿK¶Òý?þù s3ÿîµ�yõ~›×³?ÿXm¶¿úwëþaÚ 9é&²+¾õN ¶$šk"u)Ãa§"¸uiYêDÚKþŠÈc™ÿ»Kí�Åz»¿½J‚c¤ØAƒI;a=¨NÓiÛbiÛA†”-´ánÚAŠaRlRi¦œ1a¶Å1Ý&š·iH¶ ´øˆ±Ö„1 +VÅ +Æ"�I;•T£a!4Ò=Km5L�P¡>VŸµV‘ÞF:L&�¶“M:a97Q¹�=–[23ÉÌDAÊE)<1A„A]]Rq§ëÒ¸Wétº]m"•½n—ui(S<)Þ†RÙÝq–E+2ïjÚD¨ô´½?:Úš¥ +v“*Ñ ¤n†BÉ!Ya„˜io»_¯²<%“�Éx, `¨2&É?þï¾ýM•å¦fü—^>ÖîôÓïOüªy0½õÚykƒDB5/_õ×{KÇ–ºp…ˆN�‘!# ÈaȤ0è‰B(dcÈ##Pò)šÏ!²/‘Ÿéöô—çÈFÆ� 4h0��£eFé�hØÂ/ ŒàÍ0�„l¯3‚%4f#‚ž3;#ŤÂ8A“""ƒš (J“lêEt'×úN“i8D[„EºM„¤ÃKY4&ÐZAÂ";IÕSAi6úBè!ÍRa=40��� B4hFpÑì0�nØªÌ “‰QIׄÜ+Jý-'WJÒt¸'K +ƒ8ii6ðIC aB"Ý–„ÃI´�&Ù3§ÑVÒt�&ú]3KFǵªÚÚIÖÿ¥O׫WéÕêÝ$Ÿ~zN–––ÒW‹i:¸JÛû>ÂáÞèkßu#…^4·ãK­§­ÚzÕ[KM-Úõ¿Iÿúmu½ÒÛõðÔø‚­Oþ«�ë»ëÆú¿¿MÖ½}{×jG +÷ûúvÿ¢ëòêÿ.¯ÿÿZ,¸9c”æ§×±ñûþÝ*ýÃ×ÿ_ÿý~¿ÿÒ¯ÿÿÝXi ßïË�¹6ðFÿÿÿÿÿÿïÿÿªë¯ì>úÿÆ„ÿÿÿùIÿÿþßÿþ à¸Eõot×ÿ™¢±†ôÿwÿÿ«ýÿß§wÿøF�£Ç¿‚3Ã}£½/þ + +MÑÂó"7×ÿþÿÿKÿÿôwÿÿéw„½,7éÿò1•ÖØR[‚Dù¼ã=… +ö¿ûo÷ýÞ—ÿÿÞÛÿþ©~—¥ú llýßý‘à ‚ÌÚ™SÛÿþößöß×ïþ÷Jîÿöô·××õߪÿÿ[áÚ„Â÷m&õÿlÏo?Ùš¿¾õý¿÷í&Ûÿ¯¿ÿéTç¶ÿýüZýúzúl÷"Žºl4›[m[ý†{o=]ûwý¦Ùž—gëMm+V×[Ö×ÿ¦¿Ûù6¸½ë�š'†“'M4ÕŠc¶)�6Eá±Ü6jŦšl0¬2æ¶ØI°¾­—�dQÃnðŽ?ßJÂ(v+¦üöÿªÿ^Ý/]Š MOîÃ2Qp Ž70A’»´ÐNÙ$ÓL0f†„È�M4B  ¡;S ‘àpíbǤà 'NŸÛ å2UNE:'E™œu#¡šˆ¨G²$E9�dƒ!Yt¦¥þ–¹n™â,  †VIÔ«†„${e0¡#Cžïj)¦™&U:;²>“°™è1 zM4†*°a4 #`É|Ï0�£¸a1„k 0@Ê3�„\­„k7žÃ4DèØÂVˆJC,rú`d„lбLgB:Œ Vجø¤˜R\d1”èê3C\äj-ÊåhÉh„AÄ0š)IÜ÷žIÒÓTœ*%mH:Li6…ð‚mÃI´�'L&šLލFæ&ô„ÉälŸ“¡°4k}R60�ÓH#[G°Í“%æ¶�f¬„è@Â.Ô´–Ct�'Pé:ICu´˜IZ%Á…t˜iiC­\*g�&™hV“pÏ4G�B §t›A;n©0ÒÕ' 6ÒtŸÂ=´iUuö¿¦žµ×§¦•Òt´Ç�kJÒvºµWô­_ô´µÝ'wÝ]–†é7K®··këÝ Ûq«QR8_ßýUZ§§zÿì_Im'ÔUýGmm*®=øÿï«u÷ þ¿#…¡ö·_Ðîß�ß¡þúãÿ¯ÿü°=õª‹¿ü•?ÿü½¤ˆ �Ã_‡¯×ÿíuKúƒ‡ýúCÿé{¢Óƒ¿–½‡^Çü¶ÍøEÿÿzÿÿl0ÿÿ×ÿÿmÓÿá¯ÃaÿüCÿï“§µÿÿö—ÿÿþôw¥þ†ØÿIÿþ‚í ¯ßû ƒþè/ßÿõÁ¿ÿðßá°ßÿ×ÿý- ë¿Ã¿ìBïÿÿì;i6—~ðØ?þô¾ÿô´'Õz·wý5íÛÿxâ¯ð÷áÛÿ¿®ÿ¯áFúÝ^Ϋÿ íÿÿû»_û¿»ÿ{×ïÿÖÛ׺¶ï1ÿþßÿÙÕ{·~qwçmöÖÂvßw²ÌÿÖêÙš³ÿ]zÈ8‹fi¾ÿoöïj¬Ñ7÷·}ë_·c†`•�Sµ†Ãl1V•¶“ +a+J×öeöVÏ_~Ú·mžôŽ=Û +ßõfkúé¿lÿdqi¤#Ši÷M[ &Ú1LT4˜tšh6☦)0ši„ØÙXí-­Šd õ´ƒ +ÈAÝ¥k"[VJ[шŠ9Ø0¨¹¢º„@Á)‘̬h¬dú=-aOUþÃ$ú¦ ˆOÐa0´Ø¦!0¶Òa¤ÂM6*)8æE6d" ÁPÈÌ0B Ä&öåc *ÖɱªÿÖ;¯¬²²ªÊœvQt»KR" +)d(í »KíüÉa’˜Ƙd,“·÷õJ ²Ö $ú}ýäߣ[Ç"ß´ï_;Ìšes¢²ˆZÿúªª”žvË\`¹��ƒ£† “fF"q’ƒÍľ¤+²g¦«F‡¦O#Y!?2| Â.33äœ< dð@Í ù¢ ¾Á„BP�çE²SþšúˆˆŠ9ò“Á‚ôa“¨($zQ­Ïx„Ô&–�„VÈ¡wv“a$ +ƒMŠaqLR¦«V!Zȸs%, aÖ!:a@”èGÌ ¤,2ˆT�fȃ2P�Œ"E½_¢¹¤ Ä hXT †é6ËCm&ÒIÒm' +g †îÒt›I´é6†–É¡0ÐÒt’m&Ô Â¨O 7é¤È¼ †šzëøˆ�iµÝt­'wÇ´¾jûî–“¤ôÞ•¢N’v’m�Ü*M¤è—Uy²Ð›ð©4“am²ä®¾×Åôûöª¾úWø¯´“ªÓKé7 ¥]zµ«Ò¿Ui+„îÚZ_ýK_í·ßoÞ¢¢‡©+�¸ü]{¾ú¯ºZ«_i6—ÿ–Ÿû×ðå¹)ÿ×ú*�JyãêÛÃtšÚݯ�ßãßb™¤ïõþ¶¿°ñÿëýuEŒ¤?×°ùk_ÿE¹#ÿÑ1ÉæD¦‚Oÿÿÿì?ÿÿ×ÿ×þKÿøÿô?ˆÏlõÿÿ ÿÿþ‡ÿøEÿ =WÿÿÛ¯òÎkÿÿÿðÿÿÿ„ ÿð‚ü7Ø#ÿÿýÇÿÿWøoÿïý/ï¼$ÿáü ŸÿÿÛKÿýþÚ¿ïwÿÿ¥Ýÿ¯ß‡Ý/ÿÿÛEÿÿÿÿÿzýo}/ë~Òÿþÿ¡¿ÿ·ûuœößþ×õVÛûõÝr…ÿÿÿøKÿýŸÿumm[«3ÛÿzmÛoo_ºïÛUÿöÿÛþŸm«eîí&îïI°”;õm+»°› úm³þÙÿ»·_£–gYžr3õÿöÌ×òïúi¦…“ †ÐLli(1I§m¤Æ› Û l‡˜¤â–r/´“´­=°KNEpý?²õ¯ìƒó=ý˜óÜŸGÐ&‘í£Ü12vM1L&G ÂaƒI“Êu†i„˜aCiÚm›iiáˆ[m: 4Ði±1I¦­±I„⥠Uˆˆ0§¶§"ð©á++´ÂNÐi†mDDEÁÄEÄDhíZ”ˆˆ�D+úúJ¹7 +ô–‘�\ ›A^d³ñÆÒÞó+ Å5úÁžE§n{ ø®9Û¦«êd“¢e Ô9ƒ=’ALŠ��B-dô#NzD—Ͳ—‘†u#\vÕzi Bh×ÖѬ�͌Π„]†iÂ3‡¤ffff™r=„E Ð=†O&�#x�PG¡™2(da‘ÒH"Ó:ež“am �-'A6ˆ°ÐM¡i>·×ZL4�&ÓH&ÐѬ�Í�F¶¬0�oÖÉó"í”;†HÌ26!Q›"��Ëê“p�E](KpN•¢N’}öîdsD½¤ÚºM…Lð¦ÚN“ ›IÒ ¤ÚMé0ÓT›p�6©‘?T&�oï»]Ö®©íý:êíý;¶“x¥®Âmu¥ÕÒÒt¯JÔ:O- †«hŽÚA¶[r{­»Ý/ho¡¸×´þдêþ›½u¤êšZºZ^—ºî¯'kéé_úþÿ,r-,~?ß¿uv†ûõüuШ¡èx×Õ¸¾-jßõoØãé¾ÿî¼±ÈÉÿÑc‘‰Ö¥�å�zõþÝëÿþÃ]/ýÿ÷†�ÿÿŠÒ¨ê4?¶ïÕ¿ÿí‚0öÿÿÎ ÿÿ·ÿ­×¯]k×ðþ·ÿø6–éçUÿÿþÿÁ{®¿ýÿûÿ•ÊòÝI¯ÿà�´÷…|ÿðÝÿ„ÚYŸÿΫýpßÿ +w]ó!¯ÛKÜ%ãÿ¥ÿÿøý- A=ÿxIÿðßÿÌ…#¹Ê¡L©‚“ _ÿ}PWï¥ÿÿêÿÒèm/ïõûß ýýýÝÓÐgz¿Þ¼÷®¿ß¯¥þ“뮻߾—õïÿÿw÷÷û_ó‹Ól�{zÿßôéûÿõmVÛo¿__ëæ@Ñ‘ ÷ëÛ/m¤·i ìd1Ì%}Ÿûµ´¯ín½¿ýoööû×Û×9µíªõ_Ç2¯x„¡´“ Ú\ŽlRÛpÛ½&BÓÒm+¦Î^½„ üï¡í™¦õgý³ÿ­º_¯½}4ÿý¤BOb´öÂL(aÝÓ´ NÐA´› 1J©§#�±PÅ†ÆØV$›a.D<ŽÛ­n—´›6¦Jc$ +N.N)Ó6ÍB“¤˜Èˆ©~r)ÏõÄE`ˆ£žN„A‚5á‚íјP‰ÆÉ! +;ØMXa;°ƒ¤Ãl-ˆM„i¶•¦JEn\#ãF°Ñ¡èØÂ.ÃPƒF¶i �ÈO9Ía”a HÓŠ „è@ÁldñvO˜3ò˜Ž Þi�fb“²*Ã:‹“t[×9ŒGIÎÌáafPÄD@Á> ¥ca4Ðc†›M´š¤é6—¤ÃA0 Ù$CI¹4R ¦� *"»’£;H7„Òm5Kd[$¢šhØ„Ê$ÂhØòxÏ £Xd_3�D'B#¯â®[£ B¸IÒ}.›„éZ$ô· +“j-…Dþ[Jó3IÓ#šNa0’l! ›DXjI‡¨@ÍšMª¢ÝøG¶‚nºõÄv4ëêš¾Ú§M÷¿ßºW¿Ó¥ï¥ÉB]mqm/Zm+ +�²ÐÝ&ÖÒþº�|knÜn5ûþ«éxûßí +¦íû­ý:_Nûku¥úXt>‹Œš÷EŽFˆû­îí~ñï[¥î•|m;»qîú¿×¨¶—ÚØj¾*ßãÿÿÿ蘧•ÛñôXäf6ôëõËïúšm ¬?ÿÿ_ßÿþ½î¿ÿ–Ÿþ?ÿ-¾…Ë0ÅXxEÿßÿÿÿÿÿÛU_ÿÿô¿_ÅÍ maðIÿÿλÿÿÿþOèîè‡ÿ­ÿÿÿøˆˆÃz ÿÿ uÿÿÿè'ý¿P�ÿÿÿü=¥öõ¯¥þ¿ÿ÷éé>—ÿÿÿ¿÷×û_½.ÿÿÿý/µûA/ÿ×ÿÿÿÌ�VÚ®Ûýûuÿþߪï±Q®÷Óýÿ¿ë÷ºo_´µoU÷_ÿÿ×ï§ý½~Ÿþÿÿëgû ì3ÛÖ“gå¿í/þý¿×}ýWë´¯ý¿ÿot¦JÅ6• ˜«a°ÙuªiöGµa›µ‘Øwµ¢‡ì3ݤºM™¯û?ž¿¿lÍY0©Â 4ÃKI„žð“ „M5°›i±H4ØNƒck†,;b­+´™Õ[a‚_¦æ5ì,0B"":.b" ÔªÄ"�Oeh«£ãa#Ü¢<<8\ïd¬*i¦‚a…‘ÐH'‘Ð š´ÓL1Wi§ƒ †*#™%#°¤d§C"EÊ`Á9H®(ì5OF¶àQ˜0EÛ4˜aÎ óþ—Š¿ïíÁZZWꮓÒWN•¢]eœ29´Ò»,ëežma¤á&ôÕ&Òm.¿N‡u~û¥{¤ë¤ïZî©®—WI?¤>ïí OOú½]:[M–>ÖÿõÚ×�}F¾5ÐÝ÷Ò½/ÒmÛLRýÒµÒÿúCŸ×zoý­ÒJ¹cëÚûëÝv¾¿/ªZí¥ÿaÿÿ÷×.¯ÿ.¯�ûiCÇúþûQuÿý‡þÿþ|4×ÿ×ý/þ˜zþß°ÿE“®Ú_ðßÿÿëÿÿÿÿÞÃ××økúÿÿ°ßÿÿíþD_ÿþêÂ8ÿÿ ÿ¯ÝÃßë÷øßÿ¤ÿ÷ÿ¤ ÿü6EYþÏ÷JM´¿wëÿëß»ý/ÿÿo¥ÿømÿ/ÿÿd±;¯ÿ¯þÿi}ÞÿöøKöëÄ¿ºýÒÿ¶N—ºÿÛþöïÛU÷ïÿÿ_ü%ßWSM_ØI´�vûWKÛÛm{ý²u{{‘Õ}ÿ8µý¿þ§zbÈ·MŠºm$ì½y{m/m6ÏmÞÙõ`�˜M…o³ÿÿÿý¥÷ëú«{ÓV“L5 ˜h$Ø…± Ú 4ØØ¦4ÃŽ�ˆL[ O‘1½¤ÙzÁf=ºý/öÌû¶þd²Î¤¤¹�ÔÔ¤1XÁ‚(0f½¨Uÿ—_ÿ–3û¼?ÿÿàŒþXÿý¿¡þéÿì?ÿ]t—ÿøo ÿÿþ‚ý»þÁ¿Ÿíé†öÒÿÁ[ÿõÏ pEGÿÿøKêÿ÷ô{Ó÷ø}ÒÿÂ4[AçVGµoÿïõý¶ÿÃö—úÝwá½’Ýém¥ÿ ^;Jó‹ÿÿþ¿ú_بÝû}¿¾•ÂûÒûš$›ïÿý¿õöÛÿ9ûj­ûWûá/oÒÂßúý†«~•¯Ù…퟾ïîìϲ}}º¶ÌÖ·™¦¶ÛVÎ�÷ë_·¯Ø ©§i0všq¦¬Rv²(áêÛ`“—“´ïK1ÚØGvÚ µgûÛ?ëÈcûfi½>ÿà ÜUí6vÁ&·ášlBŠÂi…†¬Pb¢­Šß Sà u·ì0­§‚0áÈc™þöÏÞ¼¶)4#+" )âŠAVA…'æ¡­œ #Ù°„™Ü4B"{$ÜYÛúiÃ{~•ÂoKkI¹'P¡ÚL5 zV¡ÒûeŸ¤ØAœ³I´µIÚiRm’ÀƒI>nÏHÖÔ'iýÆ�-Ev›×ßzjšt½Ý¤½ñK×^¡:V“ª_J“nô®ËBvYáDvýþ÷·y.ü/ÖÜ_Õ·U#…ÆëßÓißÒõßÖ÷ñußî}ý÷]ƒä‹üoëéú÷¯{KßCR8_zúxÝ´½/t›ßÿÿÃH{ÿVÿÕ¿U å¹"ÿ�´øí®—ðúýv¿ÿþß¾—ÿÿíÕm¯øþ‹­ü±�áãï·ÿõÿ ÿ”Oÿÿþ¾Ã_ÿÿÕ´¿M(zýÿÿÁ»ý/ÿÿöëÃ`Œÿÿÿþ½·Ãzÿÿÿÿ­/_ÿÿ[Ãh/ÿÿóK×ðŽí Þ±ÿÿëþ½ýt¿n¿úúðéÿÝúNßí׆ô ÿùn+Ô½ÕºvÿKýÛ]�Ýïÿô»¯Õ´ƒéÊãçòxî KÕÿZœÿ­Ww¯ÿ鼡:_ÿíþ–ßqQO„¿ÿ™ÆÒgb*Çt­µn½³OKÓ¾×ý´·ÿ×öÿïõý§ý¯°ƒ ÕÌ…�Bz �ƒ»Òt­&JÖì#Ì%zïÏÏ^Ã?÷WÿgåöÍ~¿·äGëûkö˜Z´a§i0´íiZLB´lB†Æƒl$š¦¶ÚWM…[JE;/'¶—«i6½„ÚÛ3O_÷jõúévaôG&$l(èŽr2 ŠNš¥a„“M;ÛH&ìBNÒ‚v!'±Iªl… Õ†`õa‚T÷V^†Ç1ö•çïKç`Ê›ªeQˆËVÊU+§T"1׈0R­±NÓR¯†Ý´Èãtí&Å=6”Bm¦)0ÚI§}tÿoÇÄDG&ňö ‹#B®±K}/Z_kÿ2„Cú­zl¡©©˜2vfÈf¦ŒƒŠ|öJš‘…>¿õõ‚M0†4$Á 3#ä�ïBjBh‰f|Èf\”Ö!©™µ²@§Q�YÐÈ’ý*®‹º…ž «„]Ó +vZ-÷aª.TÁ Ø`(a4ü"Ça't#ÃMVª‰ßH0Â…­ ØDí¦‰a ”Ði„|%£ÅRÑãá*G+¬%¤ët­ª„œ +Õ5 +ÒpŒ=* +‡£Ýö44ª’�éRKN–‚©ÞºêéR^’£½éV“hïG®®‚Õ„Ž>±Òªé4’ÖºªéRZZM+¤ª––•%éiU5Z]ºZZN—‘C¥Öºã[¥Ijé%ZŠB¾½i4’Òß­.«mR^–—®¨b…-RªQŠ]%I*I!ö–•,bŸÒñ”Pê´ª‚Òõ]%I/Iu] +—ÓÇU[þõItºé%¤’ô¼%ÐAUt–•RTÃKÿ_^ª¿^‚CÕPT©j«ô¾Wê©WIuKªIRˆ%Zˆ^G%Kÿ\ ›KªúZ¥KJ¿¢ÁÏùC§×T—T„{¥^¾PýUU$‚\Š4¿‘§¢(E¯é/"“íÒ¥]$¨Ú­æŽëå>©[þµIt¿éSi1 ýkªéRÒJ–’˜×KÉ Õ},Ç›ZU®ú0áW¥´´«]U--tªÉÿÖÊP©Ji/Kê•d„rt�鑵_IŠZÒÒÒÒÝRí,.º;×ÒÒT´«JÖý+K^¬T$¡Ek¥• •\%iXKJÂIZQZ½zN•¾’}$M‹ÚÜK•5…[ÔBŠ…[aWll$ÚQM¥ÅTS ’T¬%u:ŠU +[Ó„AµU +š¦ª˜„h8¦!1TÅSU ´»&*ÒAHpõ¬ñ*QÚxŸ&yجv§Ò­Ô*i„Ó ¨[ 0˜`˜&0º„ÓaEXf0›I©é§t†ïNS´�P²n„2ˆ†0ˆƒa°© Ä& ƒ1 +Ô/Z§ÿ~Yâ;Z„ Ä0‰·ûãOTþñ‹¶+ê92ÇÝá êSÿþ92]AÑ 0òã: +Ld�I’¹ ŠÒ4Íqª××çAèØâ63Q²~katl¢�a’2äUà�„ "9„x‡™æP)!>lÈy³Ê±”L«—y×&~ŸöZ_°‚mÝ'A0Òy*&© ¡hã´ƒa&Eê¦�„zš*jy<¬0�ÈIž†¶HÂ�a‚3‡“Ì#02�IáÊA�s‘¨»é>ßN•¥´“a�H"\ÄIÒa�g ZI°ƒ8aaê“h.M ÃMN“zMªhÖEÃ\ü���Œ#`h„è@Â5†i;u­î©î˜úOíÓK¿ôê“Õ%Ópƒz¤êî+QutŸH6ÚM$êN“ &Ù3Â44›U¶½7ÚÚú[Bín–»»jþÓm?¥¥î­í¨þ•Âuj…WKI¶­Òµa µ÷–9?µ¯VÝßë÷kî½ûÝF¿­ý/ÛkôÞ�SïÛ_x1 ÿÇØ9uÿñÿÿ÷úun¸uëî—n¼jßZ0`½÷_oÿÿõÿÿÛï×ÿöý7ÿ­9uÿ¼ÿØÿÿ«i¤¿¿ëûß uý½‡¯Š·ü´ÿýþÿÿü¯Û _ÿÂ(ýaµÿý‡ÿÿ¥ýzüÿÿð�pÚ_¶�F�ÿà—úølcÿöÒ ÿÿÿÿW÷»ÿÿÒâìR þ¿A?ÿ†Âÿî�oÿÿþÝ}ûïÿÿ¥¢ëø¯Ö¿i÷‡Kúø‚ÿÿßõêõ9íß¶—ÿª_ž’õÿÕ}ÿt½µù”{íÒÿûu«šíºïÿëÿúõ×¶¿ÚUœ^¿øI÷ûÿeçKI†“wug«‡Ú_ý¬ƒÏò SõÒöõ÷þõ÷¯Í_Þß_ßbm(h&)‘_¤Å1I¶’i§§"i¯E;JÕ{Âw¶•ýZ{i|ƒ÷Û\ÓmoÛíEJ�A„ÖÅ28I†ÐI¦©¦Á;i ÓnÚ A&˜d=‘Ãd\m¤½¥"ö×M‡i+và :_¶å²D"2†FªUÍ4V3M¦‘èÌùâ�nm5vÂiÚM´iÃI‚tÛA&›}Ccb›AH¸ÕŠYLqHFX‚ö4VCˆ)¡G¶„�nxÏöEû%h0˜¦“¶�uu+š àÂE`¥c®—á\²@oÖ—ÿJëú¶•¥úÙ&%÷PÃÄA„ RÜZ;ŽÑðÄ)’Ƥy®S,DÛÈD{ýªfJäT3°ÖÿßÕ¤]®ŸÔ}ã“?J¿ùnŸ;IãSQeëëåÂ5†°øEÂ^x#Dёَ B‹ hÙ"'M‘Ðdº8dhŠ´KŒ‹f¦FiëW§Jöôf’a0�Ô²žTá0��0™F`Â5†xgþpòš5†j33G¶¬3H¹�t h' ¢dJË ‰Ó†T$DišÏXA§i!Ó°’Èá&šlS«q¦¬V‚VºÚM‚ÚV¬5³Ö­®¨;0»þÕ]%ÿ¾AöV�æƒ8z¤Ú[,ð‚ ¢,4¿ÐÒ ¾t›TÓ „Ò ¥£wÑ­“É®(Â4<"ìŸ0a\PŒÕ#ÄHêòŒÐa:>4cŠ $wÍ… „þ˜aJv› ;aCI‚¤m)7Ý1AŠd|ÛA'|i°Øi¦ÚVÚÞši®Ãún›Õ'W¸&÷íÒ·}Ò´F=3„y¤Ú I‡²Îm “9µAÒmT+#à› ªi„Ñ¡šiçÌ"ì9ܹne4@�£äF¥sà +ƒ#NEÐ ÁPM°E”&í]:§iØh$Ó´îÓm-Ûi½Ö«ô›ÝGÛTýExMS¶•«¯ý¢Nš‚°«éh29¤ÒM¦G0ƒ6)³Aa¤l¶äñ+™!r*„DAˆR¹† Ì颮Ošfš+=5ï¾ô5î»]õÇú‹×¶—§ºMÐkÝñÒtšß´ž ÕÑ(ð’¿âåpˆiÇÿõ鿇úü?ß_Ðýw¾ÿqKM\]ô·aiõ®»íþ¿þÃþYŽÃ–Ÿý6¼‚SÓÿ¼ºûÖ÷KÿöÿÛÿnŸýÿüò}WKÿKû\­+I4Û=ȃ‡˜û«îŽ?Û?_ÕÿºÝ·÷]þ¿þßú¯·}„Õ„¬$š†8\Ra´“OKíXa&Bí&‹ÓÛI†aœµm/ý´½yögÿÿ»}§ˆQŠÇ 0˜M5lRìŠ=ÁMˆLÁ¨b�i¦›h È®˜ ƒA¶’r/;Në‘\4Øl0’}­‚{vz¸Œ±ì�ˆ0‰b ¨ Ä Á#=ÅYã*Øcjƒ PÅ[A5N( ØN›lRi§l”$îØ¦En_ɱZ2è§@•‘ž žÝQ<�K +ý:pL*a„Âùg¯s±\òz—ÕÄD~¿ú÷¥0›iL’éX>6F겑(Ì‹q¡ A\¯� (ˆýZÎÌ¥"%Q}ÿ™+Å/ÿçzgbŸ•4.Ó]U}r'™_2T`ŠN!ÔSè�ó:!4 Ðd®S©6@š‘Dºê°���Óòs3†ØzBh4k „Ìð�¢f°Â<‰“* ø&tNx#²3C‘‘žP3 ¨0D¼@Ï9©Ñ­'A0 ·tEˆF¶“aa²Îœ*läÇI6“h&ôÓA0Â5µTѱª6áÖÐgó¬2F2Bh‚HH„ã@2%Ñ!±�ÄD#aa-]_x&!ZW ¾�PM¸¤Ã]]–r1é6–ƒ8Gš †ËV›Òm Û-Òa„Ñ�…H7%§ÐrA ¦š5¾®•ÓOôê›O¦>úN—‹Ó]«ÓZ»¥zV—¢p’oT¸ ØVYøUpˆ¶Â6Ël%×¶£îúöïëuÞЦG ]n•ëêªï´“{j“[ú޼­õ×IzùnH÷ïþ±ïÐëVøøÒÅwÝG·ÿé¿ÿÿøþÁÿíðþZ¿ÿ¢ôCÓûuº[ý½î¾[ùÒÿÿÿoýuaÿÿ_->]këÿïàöÓyØ,Þˆ×4)—MÿÿØÿ°÷×ÿÿ__ÿaðÿõIÌžñ;ø™a3"ÿÿÿÁ¿ÿ ÷ÿaÿÿÿÿÿþÞÃõýGV´Ôì%‹¿ÿÿøÿK}p�?ÿÿÿÿÿƒxoÿkè}×Aïûÿï÷ÿn‚Xo}/ûÿïÿÿü7ƒù\HìÉ +ïïßzÿ×ý}þ×ÿûïöÿÿ÷ßß×\Gk­­­ÿíþiÿï®K¯]W÷¯öÿKûëÃáþë;KD}tür�½ºlÑ6¿Ù¢ÿÿí/Zöÿû]½¿ßýõóEÿë‚ ašâ쌠DDE9².‡²uzD¤2ššÿ[`›¤Ã a;µÛ½³ KöÞ¿«Û?ëûÒ·¶f›û¯ï¯¿9þß�‚Ê.“hØÑ±¨FÆš5†&¬Ô3°Œàä$Ê9p#  4Bx2B6ÉÙxâ7‘„~6G3™Œ„3¡lŒ�gý�†b˜1ÓMX¤ÓŽJ·"ûJÖDÆÃYÃ^ÛKl÷Ú°ÏVcÛJý³4š_×׺XT›KIÒm–]0Ù1ˆ6©¤Ú�z +‚a¦šMèØÓ ±QGð�†ÁìÎA„k ¼Ð>a&¼ÙD]“æÈ„Í™š$y9Èu(dÓˆ `šixa‚ö®Õ¦ÈúU°Òa&Ä& ÓM´�lRaŠb¢“m%Óa—=-‘m¥ÚZ·M—½÷Å-Òm¤›Sæ“h“Ò¶cÒmpÒvYÐl!†ƒ*M²|˜AQLRV¡–˜M:mBdò„%äçG€ä'ž‡€hÎ䨣 D Âb Ì0ª‘âO£Å‘�°¶ƒ „›i&L1PEð�N­$ÛÓA¶Q ñKµOýmÛ^šÿÛ§ÅÒ¹;^©[»J�:ÒN™ö“¢<pÂNˆíª£ÃwÂMÉ¡¢7a É7Yº b*@Á ‘^U R+#{sÄ1µÃ®Ðô›é¶ž-ƽÒÚïÛqm'ý×kI×í.?Âl.!·õÜ$�J¢"#–ýC·$zúý¥�¾Þ÷¯û©+~îÿ]:îú^ï¿õï·¼vÃÇßýå§þ¿ÃZoºä9ö“ÿŽý}=moßõûé}†¡¿ÿK_ÿaëîº,cÿÿõÿßÇÞ¿í‚0öÿÿÿïì?þ½î¿éÿ_ÿÿÿø8A8?ÿÿyÒÿoýµûE=mÿ×ýÿ_öþK ÿúÿ×ÿàïÿû¯þÚDEÿþ ÿþ ÿ¥Ý-ï×ÿ|%þ¾ïÝ.úm/ÛA$ÿÿ„kÿÿ£?ýºþ¯íûý^¿ÿ¾õÅ{iEP_ÿéÿáÿ¶\çK�}¿K´µú_n½ýn7ü*ÿéëú_ý «úé6gÛu½]6N¿½×Îu·[^õý*ûÿëë×ëÿ¤;´¤Aú°–cmUµÒlíþÒ×Uuýºáë÷þ¿úÿ_úÓaÓ m Å1A´ ´¤Å'‰�ºîÒ¶ÒõaœýVä1£OÛým?úþ×ÿ–¹y‘§ ¦G &RlTˆ:a]; 0ØAí‡A6ÐH6�lm4šj݃i«§r îÿI°ŠøG}òn¶‡9n,B •X…+ŠE‘ÖVC‘ì1Ãô�§né¦Èá'i°�4Ó´™V ƒMU¸Ðˆˆ¤vŒ§“˜Œ¤å ++Фž…Hðç‡<9 R¨m4ÒwmñdÎÒóCézOôµu¯NÒô¶Ú]™Gw’E{Ó „‘-´¡UM@ʤv§ˆ0A +Ü›êGˆR_ +Bc>A–Ü ÝôŸMS;�÷Q}õ™ÿŽínÿó$K‘?©ÿúãD&L +C¤P2„l� ŠvuI³©�4{5µ#W¯ôÂ64l„l 4ÓЦhÙ4Ìä #@fôÁð Ó0h„ĈBäUãD%Ä ŒòTÌãQ� ªGd,´LÚM �&Ñ‘ÛIÂ"ÛA: fÍ Å*i6…é0ð�n!“ØFÀÊ š3‡•œah #@dŒÓ00‚/‘�’3 ÌÈñÔB� Å3ûiZºV‚„épV¸T¬%>k¢1ì²aÙa/˜VZ ÛIõDpÑá¤é2>¡a&F]¦© M£XhØÂ6Qñÿ]/Úw_tŸ}'ÛK„Ö·Itß¤Ú Ò|* ±t­&P‰{I¤ÎCI†�p‚m&Òñ®¤p¯õ¾»´ý»u¸êÿíþí:_»¿¯½ÓÓÉE&ÒÿÕÿ¢Ü’�É#ã×[ÿî?ÕõîúÛõî××»Ó®Óm +é:§��ükHýÿÿ_¿¯Çßñûw¯wzmEòßDvÿÿõ¿ÿÒõý¿ßÕ¿_ÿÿÿ½z–ä¨3°¦)‘Ld)ÿÿÂÿþß¿ÿ¯ÿúÿë¥ÿïúã ƒü)/;,E·ÿ¿ü£ÿû¥æ“ÿàŒ=ÿEÿ÷ÿm/÷ö~ï~v&,ÿïô_þÚ Ð_þ/ÿüÿòyí/Þ¿ÿ °Ú÷Ü?-ÿûÿô¿¿ü"€ú_]iÿè'ÿÒÃh/¶Òÿü;ºùº~ÿ÷¿ëûÿ¤:¯îºï^õá/ÿKˆ_ÈÀ¿­í·ë•¯Ð[ÿÛ~ÿUûÿK¤¿¿__µÿÿÒÑ“þq=îÉ'ë®R_þý³>öÿÿôõ×·Kõ¯zõ_ÿÂ_…×o{w;$ÌÁ‚P) Bq1æ¸Ðd‚:–Pˆ¡ÙO‘¥ÿŽ9�ÿ1ý¤Ú¶{_°Nû]vAÂjÿºõ×í_ÿ[ýzô­³§F<ìªTÓF†�d^64k£ÃÊ4Â.ØFpÂ6MŠp�>`a”Ã(FDPä ‚!(F`�!äíN¶T#Zõ±AS S"b­Sd­ªliÚmÚR(áí—ÛI9pîeçKíôöAçöAÔWznÌÿn‚„E²;h'I¤›IÂMèh&A´¶šH6©è&¦��£dƒŒôôk Ù𠞎yqAa‚" ˆQÍ™ÐRÌãQMl(#6 ;IÚuÞ+¦šw„ š8 ÚH8OaSbh špÌšzl ´ÓVí$ÛI†y6•Ö¼(Nº´•Ó¯„J5ii;´•„Ãe &ÐÒmê-0ÂM¥¤Þ�n-[FÈEç "í�xA„F°ÑìØB7.MÁ©H9ÝÉ¡•Í„£Ri©àA[Lv›N4ÓNÚ¦�Ú 6Òcb›JÒv�×ÿLkÝ¥ý-é+§~Ñ(¥at ›öý']–uËàÒÒmÃôVPM¢+Â44˜i?ß+‰çj¬Œ¬a¡G;F²¨Éùèâ‘�±A„QQ …¥¡Ý~*G Z¾ªGÕ§ÕZZ}'KKKÕéÕúKñm+@˜m¤Ú»-¹4Ÿ&Ë)ÄDRy“„"" ú„ÿ�ðPÇÚñë¾#ý ã]ßÖëW¯¯n¼tÿúõmGªX]'ÄGÿ½œ?ÒwI3òÜ¡ËEô_ýcÖ>×½v‡î¤p®ï_î¾—×õoýuÿüG—W¿Õ½ìxrÇ"”þC„Ö­Ãúý]åél5ÿöëÿÿ¯ý}u†£ú,oþÃí »]/ý'´°Ù/¿äDûëÿÿÿøEõ×Õ‡_ýõÃìRm ›IÐ[h+þëÿÿÿïÿ-üŸ‚0ÿaá¿ÿÿ ðe˜l…-#+ÿK¤ —øKµloÿïÿõÐ^_„ƒwÿÿ†øˆ0@ÄOýU!sRuÿ_áÿßoÿ·A.ð— ¿Koÿë¼7Äg·þºÝÿíÖû·ÿÿÿªÿúý%‡ïÿ~#¯ÚÈ$Ù¢ý}½o­}½»ë÷¯}}}U{ÿÿßÿáÈì6Ò´µîÏ÷·í™ÿm™ûf{kÿk­¯ÿלéÿoöÒ8Ÿ¦šh6*˜l…íC¬T6°ÂZyŽÂI°Òo¿³ ëÛ‘G¯­®¿fµûýþwÞ´ÖÓ"ƒTh0§dc”>˜¤lPb“b˜Õ4ØØiCa±R+‡"YÃÒ‘é†rOû=÷¶—\¶¢† Â&X0„A¡#ªEe„Á#;a28IöÂb©Ø([L.¼‚`» !a8zliªoV“dzÄDr¾ˆ“„A›@�¦ ÒLB¦ƒšÐÂi†Úa†R1ÔWè²Ú;Œ1¦uI[ vÈI©’ ÎȆ¨ñ +4Ÿ,†"Ý.¨¹d>/÷þ®õÌ•åu¥õUú!<Šœ±¹8Íc%1¤j"žTïú6O&º�a„\6GÌÎ@Â5†i„ €G²XF‚!Ïdˆ" ŠY.$d¨Däät"¤ˆÿe�0ÐÒÐL4môG M¡za0š5µ „khÖEã`i¦˜FÀÌà�£�Ñì0�‚XeÙža“æÈ£6D1”ìÌdHf¶uÒmŠN­¥»ÂaºM¢e�Ïæ–ƒ8ii4“a`‹m&ѹ5%zN�m'H[VÔ&¡4l5 ;ÖÂ3³8až»�¤ÞÖûN¾ß»i:N®­%p˜N•Âv•õt˜jÚM¥¢;h3†“a é:"ÃA~›i-ukâÚ÷¯ÚzÒÕZwý¾¯Å/šWA7M¥rp•Òt¤ýöÒÿÑc¯÷ë~¿ÈáR8V½_µn׭߯Å-¦ÿï¯_ÿãÿãøþ²HüAßuÚC[[Zõµ¯ÿõÿý/ÿ__¡ý3õðöáãÿ¢c’FÿYe¿ÿÿÿÿúú·_ÿÚÃ]‡¯ýÁ¯®MÃŽÆaLž&#±;ÿÿÿ÷ÿàŒ?Á{®¿ÿ"Žö°õÿûÿÕ<ˆaB…ÿûÿÿÿø@ŸÒíÿýO>öðFÿá†Cÿý÷ÿ¯÷_ÿÿú_„¶‚ÿ¿Ò¼Áð‚ÿü÷Ýû~·ÿ·ÿê¾—CÿþÛÐoIÿïmÿ“sT#�ÿ­÷ß_ÿÿ_õ ¿ôûÞú__Ðp—÷©•ÿm-¾êÿöÿÿý}¿ïõ¼÷ëÚ¯ûï¯ùØPÈdD36FF‘¬‰*#ä²Uÿî•ݶ“ úoý³ÿÿëúÈz35ûfŸßý7D_¦ÿþò�_ßÖF°døA„F0�„h ‘› A ‘˜ eÛ>*""Œ&A\°o7†L¢ gUð›ictƒ„§¦Ã '²)Šò+†·Ø;_Û ~O-ëN‘ûï_öÍ×ýé6“hŽF†ˆÝ£ÃH6¡“jš64ÂhÐÔÏÖÊ0š>233�ˆL d„ 2#0Gˆ3 !@¹.2E!ej3£¦Ø"‡ +dndÇL& M;b“N‚i§ L'#‹lRj›š².WM½µî›=D>ïm+ml"‡~Þ“¤Ú ˆN‚aºM Ï0“ "-†“a 'dÏH6E[IÕS“„ÓA:„ÂhØÑº³£Ã4‹�FÄ6B.[ƒ#"0Gˆ£6F¶f)@´R´"!ˆ@ ñE ¬† +UÑí°¥ ðí¦¯a:a…Úl$Ó…¦ƒM´›A[a ÅHâUVBþÒ†ÃMX`šN“}tí¥u{Ó¥rN’ÚT¯Ö‚¢>¸Ùö[ŽÈ¶Òa¤è&m &ÒÐM ƒh(j˜MBdòhØÑíË(²(eUÄU*®%Åa¢± ‚a=¦œ6�qM4šl2:#µi߯ot­¦þƒKú·¾;_þôÂt�-Ñ'¥i:M¤éÐfÆq„E††“ ð®WÃì‘XSÆV0qmý§×kö�Há\kÞ·íéúwŧu½Õ=.ší-uÒ¸M76ˆÇ¥­&Ä•?ÿÓ~­÷ÈÏuoíßÿ¿éµãëqC_NšÛzÃMÂiSƾ«ÿúÿ^éÿïÿÞúõ®>µ¡¨¯¿»ŒwÒKõÿÿÿýý‡ÿü?ýyiûË1å¹**ÿ÷[¶‚¯ÿÿÿÿÿÿaÿþÃÿÿÿVÿÛåÖÒßÿÿÿó¥ÿêýÿ ÿÿëÿÿÿû«oÿÿÿûÒÿ÷þÿÿÉvGÿÿÿ°Ì f�__þÝ}ÿéþúÿ ÿÿè¿ÿûÿ‡âÞ«ÿëýtú_þïúú¿úÿ¥¿ÿÿÿ†Ç·ÿû×¶ºß¯·_ÿû¿ïßzýßÛuë׆íº_ÿkï]7¯~¾s¯ÿÎ÷Oúþýúÿ¯oaœ›KÖ×n¾ÖÒ³ÿiêÝkÿÿõû­«íÞÛoÿÿÃÚ 4á„í[ &®‚Òb¸2å"ct¾éS¶Ì}­Òý¤ÞÙŸê­™ïæ‰»Kþ¶Î›P w…Ó°ØI4à ,Žˆä6ši0ÃI4Û Z„â­nÕ5MºdQÛ %È®iC¶¶õþ–ÙŸ¬¶i  ! +¢`Ž»4ÂF¨Ic�Û‚w°‚i¦Å-¦&Bbp´bƒÈy´•;´“a‚WQËt `„ec BA„�m„ÔðØLŽ &˜0•¦¶MˆL4¹e 2a "8Ññƒ ‘·ÄqÿëÌ’ô +JÙTd^Où›ÈÆ›geÝX„ßü®©(PP¿¯~”§xü™-¯wÿ®90ŽÔ#°µ^ïõõ +v��ºæJ�I!’•H4΄t,ïž«éð���l#dÒÖ #84BLÖ?Éti˜Á‚Ã(‹Ä1J€CA¢%Õ‘ÖLàÉ„@‰N­?úN“i:¤ÚNÉŽM„´ÓL&­„™›FèF†¡FÆi„Ðgó\SÆ�a¢Ìá„BLè42°’¢³fè)/‘„tEà¹ÈÔt�&ÒuIÒz›K +™ã ˆ5=Ø„kÉöF -ëUpÙ+'i´Ã­Õº{W¯jžµkv›vý×W¦ºÕº¥¸&Ò½2í&,ëež�mpÒÑ «äÚ´PˆZõ¿t5îúô>îÓ»õÕ¸ôÚVºMî¿N“êþ·N¯é=z`ý¿†£ý~»ÿûú»_¯¶»õ[Šß^ôÞÚ^ßúV¿l=ÿý½¿þ¯þ›ýºÇúñývºÚÒú &ÿö¿íÒ_ÿýÿÿýWÿíëôß�ÿmT7ÿ†ðFþëÿÿýÿëþ¾¿úþ¾½�ëžÿ‡Âÿ¶‚ÿÿöÒÿÛ¯ð_ýýäÜ´éöë Þ“ÿÅ_ÿþÚ_ÿí¥þïÿ�Ùÿø#ëãOëïkÿÌàŸúëüoþ¯bþ—ÿ ŸÿÐ_üµõýÿ"ËÕÂC®¿ ºÿé_ëûu ¿ÂOßÿ´½i¿ÿÛþºý[_÷T´½/õÕ~Òé/ÿu¶’ÙçtÙš×þAæd�õ×ø}Ý+ªûúþÿë÷í%mšÝ¤Ã‘\=4ö¶{ÖÒºõdÌa¯}º²ô¯´þÒÿî½o±VÚ¦›¶¦馛xb‚ÓAXIU6¶’l‰•n­ºü#½zÞév~×ߖŇ1 ‚!¬£Øh¬hô¸aLì'¢ïÃh$ØA4Û&Û$Ób…M†“"Øa†È¹m$ÕdW >Ç;RB);ˆˆË.lDQÏ„ŠæHøV�Ä)TaŠE[ꡦÃJ»VÚIÛm:a0È¯â¯ø¤ùÙžío;´4å áR4fvé/úøK+¬dذ7K¤½zÚõ¤—ôºIE´’Õ´’¿±U{h!´’•É#½0ÁMÈY)(PS±(ì†d)Èî˜ØLrNFÐ[Ò©,(PRQge8ˆ�ýá~¡AIòµ÷|4îÿ¦Ÿ%þÿ¿ÿü©¬�/wwúë¯þ#2$ã!ŠN�¼Ò4i›< Ž¤CPò4Έˆ^ž¿üÈ(&¢šx$�‡æ¡<#@aÁ„laåƒh FCS™Œñäèá +ˆ‡" �tóŒê2’Ï#]çEÑ, óI´=¤ –€Í–“¤ÚL0“éªAµn¸ëL&²¡G°ÑºˆN‚ #cÃÁUƒòqJ3$ è.BP2,zvÒÑ(Z w Þ–tµ¼+¥i:NÓXD[tÛ&„ÚN–ËEÚM¤Þ¡¦þ��ªhÖGæÀòyGÆSÆpAšW¯Ú%O§×ªî½ÚJý/®®ÒVºOÞ•„vÚWé6ƒ8i:Mê“i:¢,~ý~’ßZŠ‘Â×â¤p©kºív:ék¾ÚÚµé~•Ó­%z¥j*�7ÿô·$~øéHs¨Úëÿ{㮾¸èiÒýWm'Uõïkÿ®?þ‹ú,�vÒþô[’O_õ_ò8V¿�xíÝËz�ÿéþÞ¾¿¯õûâ¿ü³ýeVŸÑnHD=ù�VŸò‹ÿÿÿÿÛÿoÿÿ¯_¡ü~ZpÿL#Ü‘Ááý¿ü#ßÈÞÿ’ëý/ÃÁý}öÒÿ‡û«ZÒý¿ëKô¿Â¿ëø÷ÿÿÁÿÿÿ†ÿCÿ×û¿]nì%ý¥ûcøoÒÿþü ¿ý´ø?â¢ÿ×öÿô«uÿK¾ÿ~Òÿÿô¿¿bøoü¬gb1ÿþíýz·uûz¾ÿžOëßý·õÿó8Wöïú¯ý}»3W®·mëú÷ÿ¯¶ªÿïúþß„‡ßÎÖQ¶f2ƒ"0JJRgDGÈ–kþŸ"¸iöØ^Ò»ãÛ?Ùõ¶gÝ·çïú¶ÌÖ·ÿmþ¿þß¶tõôÓF°Â5†^=„k žF€Ñ YT<D$æòŒ¹‚D d]Hº‘C*Éù0"zfM4Ó…¦�†)‘õ› †¦CÖ 4Ùu ¶Áíôõ´³­„aÛvqÚퟛôÿlÍ|ƒû3õlÏoü!„i1J‚m ƒn*zM…Ѱ0��Èæ±£Xjƒ ”fpL#@t{h¯*�¦§‡<4xl(QKT S¦˜b»U¦š ´˜ÃÄ+cä\jÅ0Ì=6E4Óa…]»I{]-s:IÒÚ +­¢_Vå§ Î- +MÓ²ë<é0ÐM„ ÛG¶ªŒí&FÌ®¶�B#/kfV0a „Ÿ(öÑîÈȧ ”ÛIØa1I§é¦Å Ól1V˜b¥i§Ðj´ŸI¾Ò·éÝtJ)Z‹ô“jÝ0Û +›i0¢9]Fd%‘T Î ÅaWhe[•l0‘îñ£Í°‚vÓ‚Ú{Šoí:·»O¤_Wï·IºýÝTdh†… â" Áˆð^êÛõîÿ¡µê•®íoO¿\E\tN¯×ëÿøè˜ä¨_Mû¿÷ÒUúÒÿöÿôº’·ÿÿÿK¯oÿÎ ùáÿo__ÿô¸*Z^Ú ÿÿÿÿaõÿÿïPƒ¡m.دüzÇþüKÿýö×+´È®¾ëÿý†õÿÿöÐQ ŽØFÒöÿýýút›¯õð‚�®ßý÷¹×}+õÿð‚Ù¢�CÞ½µÿÛïõ>žž½^ÃV m/zÿ»>¶ÌöÒ´»[_ÿº Šm0ÚA5l$ši§"óM† u—µt›¯×Ùó3­XaZlU¦Ã i¦Ðb“b¡¤Å!†6I§i¦›â(蕈e”ÉÔ¬a„ × “Å4Ó[´ú¥“{HçcWŸ¤¾ë­¥u`Á-(1ÃJd³’ùo†B38$O6d%…+„‹LURa§�å�–"ÞxÂ+LD6º„�²º’Úëý…Ç H^–ßêdc2¥¶E³62F]”#!Œ eZ8gB@ólÔEj4�yN‰uª¯ýBi¤ØTÂ44k#óM„#[1 ð�„k ”#L avOdx�òAæl8¡ 3@2Y²ÎLs{%2eYs#¯ßK«]Z[nšíÒµD°7KWI´vZ«¬ÿJôƒa&Ð&Ô'¦š>ëÛï[º]{ZþÚ§ÓM¥¥K¯î•Ð…J’m–„ÚM„ "-¶YÆ ÿëÒë­wßúãÚú÷ÓKK×MÅWÒ´šÛ„ï'k¿ïøþ?ÿÿ¢Ç ÷ëô5ëë¾�½[]-¯Å&ÿÿ¯¯ÿÿãþ?ËããÛ¥,uÖ�íïºÿÿÿVëÿÿÿ^–µö\uo_þ›ÿþQ?‚3ÝzÿÿÛ_×VúKúÿÿþ¿„è-´í„¿ÿÉÙ½~Ãó£#¶—úïÿÿÿÒü%ÈÃûaÿþ�m„z ô°o[ÿÿÿïÿ¥ú\Õý!ÿÿ q ð— TKþÿÿÿ×úÿ„¿Kûÿôm_¥éoÓýzÿÿ½_Õ×÷ÿ].ýuÈ¢}+ÛWÿûû­Úr?È ·ì�zú¦Ûëúþ¦kú¶ëÿKß§§"|ˆ8l?V ²òì0KÿÙö~¿[Ó¿¥l�m«n¿íýÁI4Óa=¦Âi°ši·“V)4ídW ‡ $ÃäW1ØF=+T› [Óv—ÞévÈ„”¬Œ«ˆ¢®Šâ°'G¥Ü«sÃ:“Wa„škp¼1 ƒÚv*!<4‚i—&)‘}¤Ã7=iåíº[cB)�9(A³ $!G; iáT&šb ¦Èé&(0ašlBA¶H;¤!]\Gs!¬DD1�‚b+!PGÆÅv×Ö‚N""�ˆÑV†ØA-uЈÃ8@´¿JEÓiZV± »a‘ÐA6‚†! Ä1Qɰ–?ÿ–^à‘ÝQ\Sê¥Çd_ÕJóG;ÌïLª•ßùœpÍy-#¼Rºª#fwŠMÔ~ï´!´ÞKG‰\,Á1“C;¬Zù�¾tí:Maa©£^2«�®d±šDdUÿôùQVÚ� ›kAjwd„ elŸ03ƒGd„`ËÆÑÄ^"B’t&F&I9«$<’Ó×õ±Õt´ŸÍ$œ‰ßÓMÝ0ÓL&ÚvÆáØFÊ„ka4²D³ÖÒSȺ>�L»'•Ða–Uf¡^E1 …�̪êt^½}$ßJ²‹¬ªÕSæØI´ÏÆ“a7i„“i0ÒÙgN“i¢­¤éªM„¸¶Lá6��‘¸&°>(ñ£[$f>aÃÂ4fœêNdxüpÏ"|ò8d…M�œˆõÖèi[Ôkë¿uM¥{O¤é>>éi¶–®•¥»¤ÚM¢;i6Ë9. ¤ƒ 5é'Òaȶ�!Ð&ØŒñ¦a?3ap�àÔ†Dxó4ÕO‘>{AšŒó<Ó"ÄDF¼ëƒJ–½Zâ£Ö™#µí´?´¶º�Ó¤êéZ¾é4•Ât¯w¤› +…^�m„ÓI:L6O‚h"-½uE[yátÖ¨#@i¦˜F¶P 0ƒ@Á 3h2‰ƒ¼F³Ät¶iF¼Ç“ê]+ÈB?øÿ_m$†›¾ëÜTŽ¿]Wo÷õ·­%+}$´›Þ¡;U„qêût‚ÑOõI«.iµ]áØEÜ(F“a&Â5ÕxEÞ°ªHaè(TÎù,!Ã<ã4g™ó(�‘ø ËÈžH#¢4¿¢Óþ›ýW‡ÃuÚõý!�­Há}º§¡Ò½_uݽ¬uKW­B Iý$­tŽ?I´Såw¥ ´ª IÐVuA8Akú ÕZ¾Üó ˜éB„Â;µA‚)è„HxP‹³œ0ƒÿþ¿i~ÃØפ5þ‹sqN„Þ«o ¯«o¥é»ÒÝt«}*íÕ$´°•RVºM$©iiR*)iRZ +‘OKJ¼‡éxG¢£¥»m +£Ž‘Þ–"‚ *‚µGÿÿÞ½Ø{ }_üGå§÷_ë¯ÚÖ»ßõŠß¤ª—áµ] +Ö‚ŒF’ZI%ZKQ]--U.´ +’J©/JýkÂ;ÐZZZ)èöJ¨#�I´S¤¿ÿÿëøo …ÿÿô¿ûUþÕ‡í·ëï}]Òéc¥’Q½oKJ=,t©*ITh%¤«Šé*�PízºÖºUZUE ª KKAÿÿoü7†Á?ÿÿÿîŽî¿‹oýí/÷UýRm~’ôOZ^–0�¨Z¥ºéVÕW®’_¯×] +¥…¡Å%]*[kýþÿ×áðéÿÿýúÿ,xoûÿÿGw^¿~’ýR„’¯áRIiiR +•1UJ´µJ—ë­Ui%¥Uª­Rx¥ÿÿipý_t¿¿»ÿþ÷Kÿ¦Á¿§[¯öý~«n’éuð‚××_Z­BJµ¥õªZÕ:ê¿ÝôITKþÿþöÞû¥ûþÿ½ÿûh/ûúuýt›ÿT�}k¥‘té%^’U¯‘Í*ë_ª×Uë뤗¥A*ô’¯÷ûuíôsóOÿ¿nÿ¿ßb£ÿm÷V Š¿Û¨¯ZÛé,"‡érëUúUêºXꪕ:ª¥I~½i/ÒéURþ¿Û3_º[M¶—ÿ¯¿ïêÛ};i{‘´ý×O·Æ×ÒTÝ/Kë^º®½Sê¿z¬"‡õ¾ºUÖ«õK¤’ëúõOa‚éí¯ÙéÒºl½ua~­§¶gÚ·Ûf·¾õíþêýúUþ’˜NµJ•U½RT’õ¯¤§_¯¤�#ލ#�õTºª×¤´µÒ¤ª©¦›“M6ÐH: Pm,%iC‡Ûl0“ ;. löÚ^ÙîÌ-«_»®ê�µn�üÏTµ/U.aif«¥é˜XK0’Ì,ÑzY„’˜ZÑ„ÚékUUêékZ_I$N«ýfJªVQ\QÂ:R­Ê¶„�œ0¢˜LŠ6š ¦Èá&¦DÈâÆÅ Õ�ްÚI¦Ý¤›i=7n—ZiéE7é*ZJ–•Yï®’¤µÒUéms5¤«× µzÒSÌ%1©…FÖ•ëJm%¥Jm$hµÍ¥6«I*•Ëßâ Á4wÈ‘Š=°Áa5A‚aA°˜OM “Nᤘm*vDÚMa5Ô$•¤©CЇt©]-t*ÒŠ¥A:VºõX%¤µiR KIRÒ×^�*\%˜Ijaa$½% j¦ùŽ4YÌÕ: Ó B &´¶èBaZZ +˜P¨ Ø¥Û V•EBXm„›¢¡ª ÒÂQXJTT®–––––¾¤wéu¥«¥J—,À¸ì%!QqµU¦ÓTÚ ® +ª¢˜„Ô*… +exQP˜ª…Um •¸pÂÅCЇi,UZHDUƒL!h0˜PªškaB¨UPª˜a,%P–ªEÂ… +·AUR^²Üb",&á’Ñ(U +« Âk… ´PZª¡HTÈš !…¥T²Ü™�Ub#Òô‹p�Vª#•-Í`ÒIaa„ŽÁÉ$Á‚UÂqV�±ìÄ’å}¦!¬%Ël0AÄGÿ2YÌÌÓ-ó„‚Ù)ŽÒ°¥º: O;5aJé"¹GImÿäµ…%™�]™åðS"ˆÈr"|$‚l7^ÿ¦„G�•ÁT�»b8¾ü¼'ÞôxyÚÜWŠ—ep«ÇáVû¤×…;4þßø¥¿Z‹•‘JqN¢õt¶ÉnlŽ‚#lÌd�” +D#†tiæÙ¨ŽÝ¥þù‘?;ò¨G@`<½×ÈÜ¡4ki¦�†™ì0�“9B`�fƒ˜!2aÙF™² ¢.Ê"ñ R*�³1’Ã:’” ‚F£%&Jr1)㎿”žÐa²ç@œzÒV¨3†M„Òl%¤Ú„Ñí«&z44˜i¦ Ói2?7I¦�‡£ „n„]²x¹ŸÌà�„h ¬3ñ��,�”<�gn/œ�fLõÕWpÛ¶“çcçbê»­:O ¤¿énÒií´¬*gˆóWIÒ°†‚a„E¶–‚a¡¬�ÚLŒ :i¤-ÂÐ ä²FÀü ÁÙ˜Á”P‰Ñ²D&M‘NŽ"Œ†*d™k›f¢ÛÝ&õ^•½:´â©¤øí?õ¥õZZ´•ÈÝ/ +ÒÒ´IáBVºg + 6“ªMøFv“ 4ÂhÖÓMá2|r^Ng¶ˆA°Ñ0„Ê ï"Ä|Èc!‘Ô‰6j Ž…’�vŸKwñã®ßë÷R8Wwt´µVªm:Oô×éj):WÚZ¥}†ÒµÞmASUõ^´½Û]`›éÑ(úí+n.6Jÿ¢;„ka&Òb’ ¤éÒm&ôjÚ£c'“5ÈÖÐÂ5ƒé?ÿŠÃþÿèÇþPæËrG¿ò3÷þ¾G +‡[Çî¤p¯]nÿOŽøé?úûyý%„Ä+]i+IÂV“¤Þ”0…„�–€›C +“²hMô¿ÿVÿúýëéøýiÿì>ñ—WÑ#ÿéúßÿ÷­ý:EÂïÓÖ“ªkÓIkérv½ûD¢’NÒMô¿ÿaá¿Þ¿þµn¿õÿþ¡î—ü¹'þ?�ïý|?¿ý~Èå»O×èu¤*1z«Š^“x¾:Mô¿ÿA`ßí¥ÿþNËͯÿÿûjÿÿý/ÿÿþOÿ�Çÿ�òÇ#t:éy/^»Oí%ÿð–ßöþÿÐ[ ¿ÿÿÝ ßÿÿÿëÿÿ°õÿÒùyÿÿÄ})iøãûoÃÕ¾—ýö–ÿÐÿ¿éq +ÿïÿÛAþÿÿÿÁÿþÿÿúýtµô´µëö_¢Ž¿ÿßô¿ô¹´÷ïßüBÿÿýþ_ÿþÿÿüðFÞºÿëÿÃþë¯íí®s¯×û_ü$ßÿ¿ú:§K»ûÿýÿÿáÿÿ¿ïü ¶ÒÈ•ÿø#ÿÃí +¯¶öÌýôuûê¿·÷ßøRT¿oÿ×ÿÿÛÛÿý-ÿÒÛAaÿ Ÿÿ ÿuÓMXg>ÂR á„ëÔ24ý³ÿßiÈ?³?¿ooþïëný¿ïõÿÿ÷ô¿ßÿý.º {ûÒûü7ßoISM�¨,6’km².Sb¯TäAÃa°ÒÛ9jÚÙõªìƒ�ëI³4ÙžÞÌÓfh§_ßÿÿÿœýÿûÒÛ!ÿë…µïÂ_þþ)m�°SØl&š Ž˜iÛ +Óa(M4ØM6Šإ¶64îÓaÚV“ ÂVšzÔóAþÙþÿ__ýzî¿Ûü�ÿ¥ªíÞ߯׿պ;WˆŠ9â2²CÑ\QÊ<ža:=!…a… &ÈâV*{ + 1AŠ ŠûO W§¦ØU^Epÿ³Û}Õº_öf´­¥ÿ« ¿oo½}µóËÝm¨ŠNdœÈ ÊAÎÃŽ@Á ¦=Ó tÂi†!&šp´ÓMƒL&œ]¬Š1¤›"å6Á$ÂI¨mo_ !Žgû¶Øv~¶Ï¯[zû«º¶‚\+ˆ«Ž"".""{g\žaJAá£Ûi¥í®Ód®Ø#Žš`ÒN“MŠL$†ÃH&ƒµ‘Àm±Pm°ÍÍ›› +`¼ˆ8y�´–õÛXl$¿¤ýd؈ƒ‘ÄÂEqXU°Á)½;a5l&†(1AˆI†)Âx6Ò†¶”‹ía ºZëU,àòs`�„#¤$Wa;AŠ ¦Å4Pê&ÂZZ]R¹o†"E†‚m+]U'†D‘!tÚ RK¨0@âÅ&#iK5fNÒˆ¶” ˜ÿæIt)\RÒ•¼É.2'•Ë×ÓR  � fCwÿš2#ä)6->îþý¥äC;"2évdZDÒåpž=?¤¢ýØA8GŠõò·ùÚ_êÒO™ ¹’ ò��H†DDi•¶tDttïÿ²cÈ�UŠ�Â6 #``‹€Â5†Q eq’3ÐÁ²øG‚!:lŽ„JQ²>Èc!‘Ôd©šŒëä4GIú®¸ça1_é:M ƒi0Ñ4xaPj©0Ô^‡ð˜FÃ+4Úa�£@f0��‚5˜æ°gæ�èˆ*F‚¬–²`\ƒG%S©*굕µµIÒ´´›A6-©óA‘Í&Òt�–†}¤Ú¢8"ãIÂLRM¤é6“éYW&¡… „l£XyFÑ „™¬4AŒv3 óŒ“"&IšõÔ.d¯þ®­µûi:WŠbûiZ ˜ZZMUÖ“Õé6¬±p�a �&ð²7auI¾F†¬< Ê0�aœákdFg˜"LgAà¾"Xåá ¡ìÐg7DÉêENW2:("-šF¦K?×Z {¸iÜTŽÿÕ]§uýuµô­]xM®“ë6¬²e¡6Ë�—°DØA7"à +“m4“ *ô BhÖÂÞ~b˜ ‹¶¡�ŒÒA„k ¢.G°@ÂÐ Ó62ÁšD|�¢È•–A “ft3¢9È�I“ +¼‡�[í¨îúãßëKR8[QªÔŽôºt�'úoô›÷KW‚uJÚh%jYgM„4�'ežÂ $al’a¡É�0ÐÂ� 'L&‚m!oFÆO'á°0�a…0‹€Éòära¢@Y!£c'Z.µÿï¢ëè·$cøÿÈÅCÇã~·×QwÛïÿªß_ªö®–äíz^¾“tKDžÒM¢O’ÀÝ-3Ì$éCeœ&,áœ4›H6„4m=&óòBà ¦�ë_ÿì6øÿþ�°ÒôX¯ºë÷ýëHkt-µCÝûW´ŸvëV›Té­&éªi¿«]/WD¢ôéZV‰{J½;,ô›D[¤ÿÿÿì6ÿøVþ¿ëëªÿïMþ:ÿ å�zô>µõCÞ7Ü_Ò÷¡×JÚ¿VÝû¦—}&à›ëÿÿàØoÿü+¥†ÿýÿÿ×ÿÿ–1¤£ÿ-<ÛåŽ Ñc‘£«}xíj¤p¾ßî¤p´í6†ã_«¾£û»ÿÿ ƒÿèñm,É}ÿÁÿÿïëÿ¯ú]Wÿª_¤£Þ?_ÿõŽ»ÿ!ëß«¥ïW÷ýÿÿíßÿü »…má/ýÿÿÿÿàŒ?ÿµÿýº­ÿÿõõKÿôY?·,dýØ{Û¾¿ëÝÿ¿ôº=¥÷á/ïÿÿÿÐ/ÿÿðE�ý×ÿÿýÿÿ÷ÿ_VþÿmzõÛ:na?ïþºNú_ú_ýþ¿·þÿïJÿü _ÿÿûàŒÿÿÿÿÿÿý‡½¶Þ¿ëúÿïýUl•ûzíÿûïÿþ—ëßûÿéwí¥ÿÿþ_÷ÿÿÿçOÿðÝ´Û=°ÏV’ßil3ûku~ÙŸÿ§ ¼Ù¢}¿ÿUûïô¿ô¿öëÿ½-þ)ú¿¿ý/ïÿþõÿWÿðnÈAìlPm+Tí$Ø««JD·¶UÖÂ;Ùö‘çi]ÞÙšìÒ×ÛVÿ¯î¿Õ¿úoÿõ¿ï_ô½t¿ßÿÿú½/ú÷†&a6¡Ð[N‹ ’a…i6“ 4ؤÓMÅ0Øl…ý¤�°Óa—4ì¿r áÞݶý/·KîÕ¿Û4Ý¿í½vý¯¦ýÿý}»Û¯÷_Kö×Þ[�ªˆ"�ðdÐL"ŠÆ$W†�oªV›a š¦“ BMŠØNM‘±I§i+"ƒ"ûI5‘6/Çg®öÂ]ž¿Û3]¦ßíš-lÍ}×úþÛ~¿÷i{ÿûÇ2RB�”PÄ8lDE!…oˆ„ÓÊæœE8ÿ™ð¦B.v/©\•ôó²ØìΑÚn#;[DNûÝéçiPS²Vc›b ÓJÚëï¿ù +KÁJá"b+š©�_Ž4PºÿI®ð¡L’Ù�}||ìIvB§uÿ%> +KõÏ-=>ÈÞ?ôîÿWD&A$Ds"yÁM£ˆÞkFÈê fyÈÑD¤e>A’ëªúY߯ÓøM#Û#±´zMº°6#“5³>Aæk ‰†ƒÆˆL˜*‡4B#^¥‘+R©_éÿïÙggÚVÐa4¨ŽÚ I¶O‚i'Yþ“r-¬õé£`xO?„l ¢0�yÌ F$Byà¹�…È„Éå$h*ÉjHyØYä6™RZÿ~v:þ•¿APNºL7v·T©&à ¦Vd3Æ“ ",&ŠMª=†“zL=[ÏÁ„ì#CTÂ6A �g™è{$A‰($BdÙ�©Œ†E+""Ÿ#¯__N¦ÛÝ­'þÕGKßK§I¸ Û…I‡n—„Iè Û,ëež�mpôœ"-´�'IµPš74n�qù5 "ì ù)žØF¶O2300�’ à Z“‰äB��FHË(ŽÉ­?øVú}×I»é ¶Ò×ßôŸw[¤¿JÒ}. +ÒÒÒ¶\ápÒm,*"ÛdÏEeÛ¸IÒaª¦štÃHtlz)Ú5Â.ÃÐFÀÊ �„l‚]”#Gó Æt�&E§Bÿ�kÿûÚPÝ/÷÷¦Þ÷IºzüU¿ÿm§÷IÕÒ·é×IÒ‚¶­´­ßt­ŽÓ64hä&­¢f°ÿ¤ß_Ö¯~ÃÖX[ëý}ýwÇÚ¯…î»ð·×­HáwkÓ]÷ëÿQK„Õn­¥÷­î•®“i¶–“®ÓJÒA´›Â �“Baÿô×õýí&Ii¯þÿûúú¾?Ó~>õ¯ÿºn×î¤p¿hn.î–®«Ó¨ý5Ý:ºêïIRÚ_«´“ûGÿþŠ~ÃÒÛG_ÿÿÿÿëúÿÖ�ÿË‚‡4ÿÿÈuå�úöëCþÔŽ!I·zëq×zoþÇIÿÛî—ÿí¯@Þ¿M¯ÿïÿà¿úÿúúÿÿâ?ÿè±.ÃQÿ]ynPåž·CÏþ»[_ë׿­ÿú¿ûÿ¦Ô?Wkÿÿÿþãÿ�ÿøFþ¿þ¿ÿÿ°ëÿõÄ|Ž# ]¬}´¾›áÿýØ8¯ßulbŸK}Òÿý×Iÿô ÿô ÿÿÿÿÿý‡ÿÿúÃý¿]×ÿaôßûÚÿï†ÓêÜTWׯþ¾ÿ¬%ÿøKûïÿÿÿÿÃÿÿÏöÿÿ×n½uøzÿÛkþ÷IòP½-¯ý¿¯oý}µÿÛK×ÿûÿÿÿÿ¿ÿÿÜ7ÿþÃý[KÁ†ÿÿgýÿmn©ïèÏo~ÿK_ë×ÿ×ÿí/ßÿ{ÿþýÿÿÿJÁïëü ŸöÒð�~ ÿd\¦ØIëÕ½×­-Rlþõ÷·]{kÿî•ÿ½z¯ß{÷ÿþþïÿ÷ß»þ¾Þ—¶“Þ—íÿjÓ U:i Ùxa ší$ÕXªtäL«¥¥eýÒû_n½}´¼ÿiêÞÿþÛ÷÷çíÓÿVïmÿé|R6º_Ãíð®(!{fœñ >Òˆ‚V— …7, aDåwÊëjdK‚i“Lì—;dOª>󵦡IðFvìÕ”¸ïJH+oß´¹œ)•Å Êy®�¸nŸõiûôò+ +¥ÆF±‘—KlZßÅßwûõ +-ó¥M•Ô~T,¤__M{»êI0º[_U_ÝÓ;[kXM’†j"C:²¯®¿øþûûÒJȈÏ0�a™æ vÐ"ì ži˜AÑD&L †)P!¢$ǦtÉÑ.Jž}ïço�¯ß~®¡a¤Ú&ÂA´�T&GWL#sEá<'2æhyFˆLœ FÀä"r¦$F2­‚(y!žlòqœÍHø¤1ä^3�q©”ñÕÿê¹Ùg•ÖWP�¬¤èœBV–“… ž5vYÃ<Òa �ô›Õ“ A¤›ûFv“ 9¤�u<#Cd}FÆy"#< Âv"ð F F€v\eÿÐÃø>XÏ÷ïêè‚W¿ëC¿_ý¥¿ò5ÿÒÿ×ÿûößÂ=Û_ÿÉçn°ßÿ½ÿÿUÿÿõa¶“×÷´¿ùjðÿÿå¹Pvé.—÷ô·ý ïþ¿ìW_÷øÒúÿý'm,ÿûHŸÿýÐ"Çÿÿþé¿÷ÿÿaÿ¯ø�ÿïoS›þ—ößéÓkÿ¿ºÖ¼;¿ýÁïÿá°’ ¿ÿuÿÿønÔ7ÿÿ_þ¬?ÿþý~ßkÿëûÿÿïÿíßœO®–ÿÿ®�«ÿB%¿ýÿ_÷ÿö|7ëþÚÿ®DNý´¿úKýíŸí6Òý�qŸ³=¾Óµÿt¿÷ûúõÛýUsRÿFÿ}û ÿ_÷è?ÿýú ÃþÚ þÝR®fäÛ Hƒ»¤ÓM¶ËݰÖÿÂýíÕß¶gßþ½ÿÿí¯×ú¯{ûú_ï·þÛ°ß¿þÿ¥†ÿbÿI$ÓMŠMŠa=¤©ÝÄ$ÕˆL„ȰäpiȈV’æ4Õµm>ÒºðŽ=¦Ïíÿ®²ìÏn�v—ýû÷·~«ýý“ óMÿþŸûíwýý³M.QÊÆP�‚!ÀÁ0�‘êUž+?6´ÃAöªšl,6’ ŠM6!1¯XIaÃØ`“ &º|Šá°Øii'¯êÈ:zÚ¶­™í«ÚþÙ§ºþÚÿÛëÿú¯ú_ݸi$dI”1edD0†V4W6°Å#å…Û ‘ÂMІ‚Nž˜¦)4ÓA´í±P×´j·r+†Ã6Ó°“wXGw·Ú[ugæé¦ÒÛ3ÿê¿ooÎuúþÝâ’\s°4d²à‹œ¡H0@ËV4V3Mð©¬&*‘ᤚi¦Ü-‘LaŠcv*rvÅ2/´™)¶ i}f;KûI×ÛÛ3õÿä»þÃ`’Iõ̯gÚÕˆR±ÊâœüQÚ=M2v ’°ªš °°Â¦ÂM&˜b4»IŠ Ri„ÓK»M†n¶JDŒw^¬<ÂöÏöÄ ´¿¥qHDGWWˆb „ŠâŽÃ ЦFBa}Îâ©0šlRlB`˜L0’i¦Üi« ¥u¥ªâɸø0ŽÅJÔ÷$+˜aU1 +xws½„œ6áZ_ýuˆâ")–dæ"#a‚X%¥¥ÕP¤ðĪ‚¶•¤ªµIÓ´ºøŠxdUÅȃ„MÜרˆƒx-„£Tà G ADå¦E¹Î®g��ø�"Ù¤ +§en/¡ûÎÓÚÒß÷_,¦qÙAHîž¿j·ð¦�FxPR•ék|Èøõý¥ùöJL·ŽÆøã®9Ù?}!wý0¡~v1~¹nŠ—×û¿¯Ì ��2>G�HìœB¡…Èô+ ‚‘�("šžRF¥é®ByO°ŸÝþá¦�¸@�F°óðFÀÓ0�Ð�‡¡ì0F€fyƒ3Y��ÆH"&tGÑ¢(GÈíòé}T/�ŽþÃaUéÒm ì´Ra ÎZV“¤Ý¦- 3÷ÓÖâ,ág àÏJ¦iѶE…D@Ë™J†J¢ŽVÁ áBg"¿ÿ“’¯ÿê)Z^©6“¤é6®“„˰²ü4›]–pÏ4ƒl–H=R ¸6 0¨øÓ=&�F°Â.¼¸§Œp›Éð@ôBA¬®)Î��!wœ�DDÏ ßáWôî£j©?îÿ­â“Óôé^=i[½%»A&‡ZNÉœa&Ùh ´¤%äüÖò{cŒ#`|„è@Â.Ù4@�a™æË4Üo9—Ï‘Ð9(G ñ� êf¢"‘­�W¯ÿ»�Gu¶�.;H\_µ×§T÷¯wäí(´ˆÞ¾¶´í$áÝ/ +Ë:a$ÓHZ! ´´Òt!èÖØ¦(#aŽn”’a4FpaÃ0‚5†EØ#@j`gˆž02@¥Û4# p™ iç#[ÿ°á¢Ç#§ëÿ[]öò8[ý ÛT¾’¿Æöš¯­'ÒWõߦ߷I´œ*¶.zXi¤›KTG #CH8H1i6M¤ÃM0MSF†šasvBLÐ!:0Aÿðl¿ú_ÿ×þ{è>E)a Ó +m¤šlV„ØH1H;´˜«I‘q« %O\¶Òïm/׳û ä[ÿÿÞ¿Û¿9¾ºýßÿá&í¾ÿ_îýµÿˆˆˆ0†DD1Ö¥\4 &!0XNT 4ÃI­6+¦Ói1­Ô‰ŽEpÙ˜I½µo´ÿi´¿ìÏÒºýÛýWÛëþ—÷ÿþå”]5(X1¢ +Æ !¶)’º)„œ.ƒÛL0Š";ƒ.J¬Š�¤­—½´¡ßu¤¶¦gûOÿYöN¶×ýuÛ¿zýåš3 "T�„$M4Âa#Íì{ a4šuA´�q 0›Çm­¥peɦÁ&Oõ°Žá°Ø`“ öé×í™íý­ý讇¡ph”©\UÑòÕØaGâM„Ö È®“M4¶Ä&6ÒTûJEpîI»l¼ÚY…íŸê®¸ˆˆåtG#Z Á£C4ÑÝôûA„Ø"‡ 4Ó²å L1 Ž!ÐQ¦¬}/èhG;)B"ŠDD1¥ «¢ˆL&‘­°ƒ'a4Å0“¶.’×QWr˜C( ¦àkiÒøˆÂM¤KUþÁ‚A%þ½ ©:Á&Òâ-'„Õ†‚â"ƒ¦BìË)„™^äFWb?Êá8A›S ¬#@ÎÍ",Îò2®§NT‚ AõwÔ'ÍLèF£öí}tüzñQǪ °ã»¤Úg�'A6“²Î ãI°‚tƒiT™Bi0ý¿ ôÐh0FpÑ�„h “Œ ��³1¡Íå¨Pˆ”#¿™‘Ú®}~¿Ž–TÒ_ßýnž¾ÒêiZéZáU ™ãH7&Oé‹�m&Â2>6©¦š60�ÖOÉØì#[x¤‚5†FÑ#!�„9G)9+œ�g§ê¸ÝÿøßHUWÿë[ÇJ·JßoU„Ãm'XA+Aœ0†‚a¤î+e�=µ¤ØEàÙ?%懔y±ž0‹€Ñ Q Ô #@eA´S´k™ÈÝÖ5†ˆ["a¬2ˆ0hˆœ4Bjx%ă#ò�Su/ÿÿKý!^]`ßýxÿñþ=ý´¿Qíí$.Ÿëýþÿo´…'K„ðM¥iaPL7[I¤¯ÒuKH6“l˜ëI´ƒz6=SL#C‘p”ÎÜKþ¿ÿþÿöý/Ûþ^ÿÑbŸ_þ»¿–:_ëߺIÿÕn�/oIöštµ¤­[ÝRt­+heÍ6•Ɉ †ËNG[i8vÿÿÿÿ¯ý‡¿ÿý?þ¯û¯ë°ã_�¾ëßÖ‡j5µ¾‡ï__¯Z�ê©~ºNÒ» ˜N–ôÿÿ¯ÿÿá¾Òÿõßÿí/ýõÿm»I%ÿÿ¥ÿå¹$áÐÿô»¿¥×‘Âïn–…¡þšµ¥{Nëº_ÿÿïÿïð}´ÿøßù=·_ÿÿì=ýmwÿņ«þ‰Ô¿ñÿ’Ýë×èt>Þÿ]¤ÿÿïÞïÿý½ˆ_×ûÿ¤î—ÿÿømÑÝ¥ÿ…ÿ¯ÿØÿKÿ­é°Ë&Z/�>¿øíÿÿÿïÿÞû|"ëí¯¥ÿéq ë×ÿÃÞýÿ„xÿ¯ÿíá?ëÿýBؤ—ãÿÿ°ÿÿ{~ÛmÿÛù©:¥ÿþßú\ªž¿ß÷‡b¢¿ô¿ÛÿÿðIÿÿÿïm.Eßÿÿÿú¿ÿõlÿöh›??~Ù¢½²tµþõédë!ÿê¡7ýëÿßw¿Â_ýkÿ‡Ð_ßþ[¥Ï87ÿÿÿÿ¾lZ®©±°ÒöÁ&ÒaÞaZÚ·¶]�ö—¥íÿÿß]«·š.ªßõÿaÿý½¥ÿ÷ÿ¥¶‚´­ÿ»ÿÿü�÷ûL&GÐi²Wb“L1LS"ºc[d:±l0AZ]é¶©éZ¶¿®²ìÏÒÞŸ½¾÷ûÿÿÛ¯ýõÿ÷ÿ×Iü?ÿÿÿú × § +"#>IÓL ÂFvŒì0˜MT$Âa¦EtÅ0ÐI¶ša´„ÂJ¡´—O‘\6iZí­Ý­š+è÷NÙžýúÿëþÙ íªÿ·úZBÝ;÷»ÿÿ¥ÊwˆË$ñÑ¡£Ó*Ü÷Š ¡ 0a$Âj› Ûb­ƒmÆÈAØa˜l‹m$Þ˜kk®úÛM×míÿþÿþ«­�WýßßÿúZMñ Ù�æ‚•Cñà«ašGœ0¢à G …± +›K­ˆL0GÈAÜ8iî^ÛI<ÂöÏzV~´ÿÛ3íï†Þ÷ííÿmí¥ÿë|.""â0B"�q–T!† ‚a)¡ VÂ÷M8…A´“cM6*è1PÃiªì0“aU{Á{ üÏGß[}™í™¯{·¯õTŸô"¯“`–PL Ñ>QµÅ]'a…Âií4Ób™ziªq †ÛªÚ]‚8öÂMª{ öÙÿµ_í4¯ô¾9ØvQƒ `ˆÞQÊÆ�l0ƒM]Ãê¬0Nš �0ÅlBb—b˜©ªVžžÜ5¿_DØ£'`Á4�nWXHöÚ„A„ƒ6ƒ  ÃAÕ4تNÓéi~“•ÊXa ×OCÛéÂ}Ø0I´½W,å�¸b †ô—ˆbO^£xI´¢}¥Ÿ*" ɳªü®0��„]Ñ ç³TO(ÐR@ÈÃÿM:ô°�a"^Òm{.‰´Â#ÀgšNˆ¶Ò“jˆ®ôhi6š¤;¸F†ša kr!'™t"'!2lˆc#F}��ÿ ÿì?ÛaÿÿîÁû ZõúÑJÿï­ÛÓ{ÖÒÝ­Å-­'vצ½´ž«K‚´­,*IÓ#šNÉðL$›CIµIü"Çi7øL#`d0�“æ˜@æAiöÿðßì6ÿÿý¿‡¯ï¯.¿ÿß.°áëøþ¿î®ïÛº㥸´î¾êÒÚ½îºN—¾–‰ÂJ×vYØm'fPYÃ8i6ˆá£ÃIÔ*Á¿üü6 ÿÿûÃÿÿÒßýý†Ãÿ×ÿþŸþ®¿m§ø[ô1‡iþ·ÞëðÒ§¨õÿÓ­ ˜n•…†yÒ÷×öÿÿÿàþÿÿÿÿý¶¿¯ÿú_þòÓõÿÇÝQQúv¶«ÝkqC{÷Kúzݧþº^ûðÿ»ßÿ†üÿÿÿÿÿa†ÿðFÿþ¿éz_ÿÿòÄ¿ãë·ãòÇ#Q¿ëÿCkë}¿ýïýû¿ýÿÓûÝþ½ýÿÿàá¿ýÿÿÒûuÿïþº¥ÿëÿuøì?Çÿ�ê>;µÕsߥ~sûÎy´ÿ¶ÿëÿ¿ÿ÷ëÿ^ëéÿé~ëÿ_þ ÿÿ¯öª¿ÃýÑ1¿ÿîÿnŸúoýkþÿèæþy;wíûûþ½»ÿá/ÿým÷ÿþïÿÿ‚0ÿÝÝzíÿÿ×ëþD>éÖ·M™«úÖý³4ßúýÿ¿éw··_ÿï¿ÿ÷ÿ×ðþ¿éþ‚ÿR‰ÿ þãÿÿ×û×i6‚cM´˜0VBín³­…lÿýÓiiÝ6gß·[öÛ¯ú[gM£Ú^¿¿þ—èÃ}ÿÿ×þþ½/öÒúÿÿIÿÿÁ?ûTlŠ ÈãpÂAŠal4˜a&( Ób˜¥Tð•¤Çi0Á[Ót­†›g¦í/úìÏ×­ëÿïÿ_ÂZWï_é~ÿþÿöÐA/÷ü ¿ûýÿ–äÐ1‘˜0˜ Ä&!0¥xa„H8iäyÉ^Á:bdW Ãi&ÆÅ2(åͤ�­¥¶ºm-µ×_oÿ£?û鿵ÿUûÿ^ö*5ö÷ý/ÿý/ùe‰°`„Aˆ `ƒ „AÌRlŽ`ƒÚ 5» ÃÚPÒM´ià 4Ód ïý$µÙÖÏݽkÿíßþ¾ý=/çþ¿ûþþ¥s,1 +{”$VaȧØ)ƒMŠíÝ4ØT¡4Âjl®Óaè&ÂZ¶’Ø'홦ÏßzëÞÿí÷þ«ÿ×ÿ&ÖÎÁ1QÎz� ï¸Â„ÓᤄƒM´­4Âl”¶È£Ø¤Ó[äAöïjßlÿõþ·ûªÿòn+“œ"9>4klŒîû¦“ ±0•4¦ÂÂluýŠ[JËúØGpy…g×÷ÿõz+Þ )ìª9Vç‡<8Oa‘¸OTáÕÃIŠM6)¦6E¶˜cOM‘G 4ÿ¤ù7-@Á,¦=Ó®˜Zl$Ó¸'TÂë-ˆg‰BE] iÅYã*ÝÚYjøok¥ÅÚ^Q¹P¤å°JÂ[$èÿÊâù•)>:º¦©—S£´Wß;¨Cfƒ&%?üEóºëû†0ûïL)¥Çݾ·ÿ,å¿ý²±»îøS)Å`ŒÎd¦¿ÛüìO¥UEÈq3‰LA”‚-´”†t2)‘®Sýµéri‡Â4BNT#¼ËÇÙÖ4<ž>Ða1‚]šA!\À¥�‘¸ò/öK’gG©ö¾M”—ÓJÐI³±Ï Ži6“†šH>“aS ¨A¦˜F¶¬4khöF";ÐD\ó‚h!6G#yŒøò„DäRÿì:ÿüW×úßÿ÷ëî6Ò{ÝôºÕ=õéÛÒ÷¦Òuovž¶Z ÎË I´a'A  ƒjžš5´llE1„]†Q˜<ñh �BU(ˆè� �5(Ð*d“ì5_ýÿÛî¿ÿ†‹rD +áï¿®ñ¿ÚŽ’‘´.î)ZŽ’Ž•Õ< Ú%´œ-î®­¢1ù›KIÙ?A„‚a¡}$ý!l#[FÈFÀÂ7d' ù F`gˆŠÈB B0ÈÛŠ·’÷÷·Kÿë·¯íׯ¸þ—¢Ü¡Ë:øh‚Sþûmom÷©+Ní6Ó &ÒëQÅ+„ÖÚ¾/ÒM¢1× &.…—„ -é6—&q ›M0™O.rL#`hØvâ`Þ“ÿº�&Gÿú)Ýkëë°ÿaÿ·ÿˆþÖžÚJ?ëw¥�ýñõ;µmÇëí×xMt—þêêéZ[AzA´Îæ–NƒI°‚»v‚ÿÛA Ÿÿýµ×­ºò#¼7·†ÿô¿ÿ(þ¿ëaßE§ÿêÝK]ÿõÛúÛŽ‚VÿJëK]'Ü:Ý;{´‰E+[‡Òÿð� ¿ÿý&ÿÛAz Á¾ðßûuÿþß¶—ïù±Xn“ÿï­R7øðûªü%]z·Zñ¯Ð¤ýoîÂúæE«mô©¿Û¦ø­x?A{èã¼?ûh/ûüÿÿÿaûþÿû µÿX6õVý%oÿÑŸß¶ŸhPÐëZ¯úB«ïþ±Mu£'ëïi>ÿðwÿâô¯ÿÚ ·A¿ÿÿöÿVûÿ�ÿõ®]kõÿÿ�ó,}½½Óÿ¿Û§ôµõ÷Òoôeº÷½ºÿï}A¿ÿÿðØ7ÿ‚0ðÝ¢ž—÷þx_×õÿÿÑu¡ôÃ=Ø@ÿÙóh×Ûïu¯KÿòG·WœÿõoÿÝøß×÷Š~ÿþþÿþX6ëuü·ÿàŒ?ÿÿÿÿSPö�b™(IÚ«àËž›`Ž;ûKjÒä1û×ûVÿÿ»öÿ!>ö¯ët�§ÿúþðá·¯Òvý×úÿÇð‚ÿÿÿÿ[#Ð*tÂiß°�4تM0Ú ­0‚M´äH"¸iÚMœ—[«õdWí™÷ß¶f½¿^óµEäéöÿ×ëmÞ×ô°íÔo^ß_ú]ýÿÿÿÿˆÊ9Û‹ Œž 0†xa�ÚBÚl&Ût¥»l$Á§wm›´Øa/Ìi¥kö}}m¥{ÿÿÖÚ·�|ÚýW†Õ¯m¶¿úKöÿëÿÿcIÜÉQŒôša„ÓDó#.LN!4š¦Øb“MˆI¦ÅÒ Rm1§a$Þº«KlÏÿKzm²uê“uÿœééëïÿz^÷ÿÿûëâ“�’¡DE�a"±Ê¸a#ÆwˆM[†zI¶´»I‘x0—§im¥g¦Á+«§Ký{_m´¿µ÷îÿºÿÿI+ˆ¤æCâ" ¤îˆå*Øb ƒ =‚TÅ&šv’ ´ƒÅiZ¶•üƒºkm/mêýºÖöÛý×ÿöïu­+ˆŽ"" ¤ B 0H¬h÷(Q +ÃL& $Ä&ÈúA0ƒM’°›Kh6‚OÛISÝ)pÛA¶{mSÛ­~Í/lÍ6iô‡Ik쵈ˆƒˆ0ƒSè÷Ec„Ó#%Ü6( Ó0à 0[!LS¦ØI;Tò;´Óm[ [ 6–½dØPÊ~W9í±M Âdq  ÛI5´Ø­4ئ*…i6–¹eB‚”`3^Â~ØL(0AŠ´â"EÄDb µÕŠÂXñZéP¿tšQӨόb?òº]S#7Â�—FUGf·Ó;ª +ÉQpë~&ÀÔÈ+÷ÝÔ®‘-—6ÕÒ¹�Fx×é“(#Ä(-MkUÇÞÕ'ú!&DÔŒ‚)悚ÆF‘äK5ÿÉ¢§QwèØÂ5†±èøÂ>3x“E9œŠ@#q!h„A “fC@¥"¹¤kΧô¢;öZm&ÒoIÒpî4-&ÂiþØ=°‹¶Sæx@ÂO°a ›"�ÑÃ$ Ö‰Â�3ÈŒˆÚ#ú•Òµ;×ÎÝ}m'I½u}óæ‰sI´ÈæË¬³†q¤ÚAÐL5Dc´xjÚL—›á4k#ÒÐÌàA„l› ç"ìŸ.`¬2�‘⥠“ŠkDí3£#f¿¯Òm'[ñ±ýºmnŸá]ZÒXT0Ý'I ¨3†“Áœi:NÉòi&ÐÐA´„k ØFÎ�ŒÒ0�h„˜# £0Â4eÆt5Ι +IëÿQ¯¿ÚwzoÝ|{ÒÝuô�jihŒz[´ÒNí+IÒ“i0ô›CI·A6ši6v«™Á 3×D d'#!f¡!:lˆdFi� ò]õoVøpÿ¾×këCµ#…põ×û]?ûA„—ÿÂi+KKIÒô­z[2!°®“ª"ÃH1K&?A6˜Mð˜EÙ¨xa¾gìx�ÿKöí÷§ÿåŽ +#Oßk÷w_ë¡W¶é-Çý'IÖõNšKÒ½¬B N´ÆN‰†Òm–‚8h&жHéÒ~’ÿðáÿÿý 4‡üWÿúÇzßZõ#…­EF>7×hmÞÒi^JM¼¥h“¦’u}„“ÿÿ †ÿÿÿõaÿÿÿÿÿw�â?¢ J�Óo{Oïõm +¿·ôӝޖ?ÿÃa¿¯ÿðßþ½~Ú^º«é.—U->Z¯Ãÿ×êúÐÜzïKÿ‡ÿÿÿá¿ü‡¶¿½x_ûתÿÿì?ýÿoÿÿk½õþÛ~·_ý‡ÿ mý¥à�Ûï F{áÿþ¾û]^­þ‰§ãÃÒ‡Ý[n·ëõÿÝ»ÿIØ…^Åz_þê_aÿø#ÿoö×ÿÿúõaáX~ë×9¹B×§ÿûwÿKF¯ó+é}úW¥ú÷áÿÁ¿Ý/ÿÿÿVl>êÛ×¥ÓýkuÿçN¯ÿT¿ zû»–®–ý÷¥úá¿¶Ð_ÿÿþCdvöí—Û¦ÏM¥·V·ëÓ¯þÙ¢öÿ×_ÿ׿k^Òíßõöýÿˆ_ßÿ÷è'¶Šl ˜¦Òín¤ ïAZM¤›eöËÞÚWV{_õd�éÿú½ÞÞ¿ÖOÿ£˜ÿî—ÿ¥†û Ú Pa6¡ÐA±M‘ô˜.Ò°“h$â¢jÆÚLwªr+†ÃµVü"�÷ÓV»f}§m¶f¿ý×ëð¿éwþߥ¾ÛËy°Åƒ ‚¢9B#˜b+,&®Ã † % §l.ÂpíµXpÓbß‘a„°Œ<�°ÏmŸV» ÷ëmÖÞsþÿoúÿý}·ˆˆÐæT1•…YWi¤zQ¢¡4Óºi0È®«a: ŠˆLSÆÅ&Ʋ+‡"sI>“ý�zý½m­û~¹Î·=ÿ+ª'DˆˆŒ¢åÒ3à ª  &PØ[ ´“†ÓM[VËêÚ[¥˜K¶îÓý½#žõq –ðŽ e* Ä)í± ¤ÓN)ØIÃJ4ÕŠYȃƒºîêþ¾å—‘FŽy®a#ä1lBjÓa Úa0˜iÓa¥ÿ¥¡Ì–‘äL!d~z–GEûKH+ˆˆ�ˆÕ=&Òª 6C•†–¹\É|A‘L:ˆˆ‹ab ÁGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæEa�Y@!6+ïɽ@hËE@h RÍ@d– X†òØ@d”Á¨$°a• 0,2*?üÈ’"Ý3»S @p™Hȱá‘ò42/�¬ÊÖGaÞñtÁMANÅH•£h‰£µ¾áºÏ=Éâü0¸ÌÌÔe@É„HZmëªúúi¦ƒ£ÛdæDƒ�²5EØŠXãµOð´›v’“Ï‘’V�gAšÕ–ÜÆäªJ:ú¤?¥OÐTi8RÕ[ˆaiYó9¦P%dˆ†ë¤�/½.½ÖÒ·þ¨¸%•Ñð@‹°@ˆç›3ìÙ™²qIÂ.fE ÖÍÇóÑÑ›_é"ŸUB—I}Ó×Â8ôšãÚIÕRÒuL(TÑ�„kÒ„Æ§š¦š !úG"úT¶¦f1z_¯º;quU¥ë¥ú ZOH¨£�Gx#º :UÒ +]SPGz5×I Ïô©ð�m-N¦G½W­tµƒÖ5¤µÕ$8KZÒiuÕÑÞ¡|¡Á‘Å •WI7 » “i-A)u_×úõÕ*õU¿ÅTR_JÇ¡†Îê KõKH~›AV©z_ÿÿ¯ZUT–©uª¤ºIuÒ×UÒïAî«¥ärI%ÕýW’n(’«¥]uØIu¥ÕRúZ]tªºKÈ«¤´•AÒë«Wªä#q®»IURô º¯Z­Uª¥__IµUª}t¶ûþúÖ—UéI‘KJ«U¥Kª]kî•wìWHŽ‹÷ÒT¾Ã¦®Ã¤’Â/æ—I¥ªýuª­%J’V5_L:ø�EV´ƒ¨n«)ÇÒ†š®w/þ®²?—Yšòú—[ÖÿÿúZú”�¯KðôÒ¨q Pii+g;IRX¨v¸#¸ª éQ¢ýR‘ü#�Ëï¥ûõUÒúT»t!T„˜MUZÚLUë…V‡ +)'¨¨¥X¬% +§K.ºÿT�}T’­oFâZ¤MV›ÂâtÅRP»J*áD*…]C9*Ó¤oJ´¤½%üDB43°Ðˆ†µ „ÓOA°‚ªëjš¦Ò…Öí¥ý…¸y*H%ú¹\XÃg`HY*i$ÇAi¦Ä$¡Z„’_¤ht"")a„{t×XA—®åp'EuErr~ߥh"ºƒ:•´›IÄ"šÅt¡ˆQpƒJB6Q¤–?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“PÈò Èä@ÔÛ5�)‚íJ¤ €»=RCsq² F \ìl;50ßÿÿÿüª£™#1â"9 Ò1‘쀸Øn endstream +endobj +187 0 obj +<< /Filter /FlateDecode /Length 7977 >> +stream +H‰¬WM�㸽ûWèx€±†Åo^7Éa‚’¬‘zƒ…ÚVw+°%�,ÏLç×çQ")Yôì^‚]ôÝf±êÕ«W�_6–Â9M\;V’Åá +V2¡¹’®0¥6Α–w¢”¤œ’º0Æ™RrA†‡óæÓç3+þÔmþ¾ù²ÑT"‚pœ|@n�sB WÂàÿB‰Ò('5“ñÒjAþBc¤--ׯò‘bÄ9…Ýœ+¥ÄUáT‰+˜°¦0²$á$“ñH”?¹¡�ÇxDa¬ebLQi²FJD$©˜?,XiÈi§Q3îa†K²…Aí¥³¨ß˜RÄ�\—�ÆG¹¶F[�¢’B#¢R‘³¾8ÉDIÎ8ËRj@À™u\„�2†”¸ŒœR#ŽBi®ùÃÆÔ£™vÒâ·ZQ) àÔ:DT¿ƒ#óM7SZÏe L…2Ì07¥(¬²êT5ÊB)ÖÑX6[¥MA%šÊ¹Ò…�ªT)Á.ËJ-ñkF>¦,…ß1MŒ9g±›S#ðßERS¤™’Êÿü‘¤Ò) ™iS¿¥QV¢vÔ0 ÖÉÇPZ$?õÉ ®Rp- ‹]ŒèœÏ\Q> Ë®Êá0FuåéŽÌÔX·V¸‡“E§Pƒ�¤¤47 ï¹Yi- ຠkÞ>X91̘á¸À�“ 1Ó丆‘r†‰1¨uBƒO¨Ü1ÍÉ`!e‚dÁa+4‚’€ÖjÏât¤�eàØØuDÒ<„Ó!g#”°€“ß5š[“BŠßd&šŽžÇÑttBiÆ02€ 4#ìçW—š0u(%ÄLóCsó0vÝÜã™ôcNJ(ZbãÆ˜5q&IýÿkOC„³¶xÝ@Q—‚|¹bÇq¥ƒ¢B:íi)æÆsŠ9ƒ9Ÿ.d™)b*<…aBùÏmþÙ¿n¨hŠÍOûͧ=ýÊ +*ö/�¹FAûCÁŠý7ü(öׂ˜ÿ÷¿…(ö½Çj¤#þõ�§Y8¿ð‰”°?o¶ŸÏÕk]|ØÿgŒ ÙGHòz�â1 "z¸;ú·¾;Ô×kÓ¾~L8hé#@£Ãy Ó_2“ÝýÏæXw‹£*Õ)oÿɳ\B©W‡÷unÚêt�/—r•=±.°À @«U{�2jÂhº'ÏŠmÚ¡îÙ†dïŽY åÀš\§zxk»S÷ÚÔ×éFˆÅ´ãO´Ù·—¦öŽäÔá~W‹ó‹ÅùR¤Ä· tã ouÌø„øÈŒ'Çq³}­Ûº¯Nñ'ÿ È…áÇúÚ¼¶sqS QbÏ…ot/ñ¸´S‹Asþ8d×C Ÿ¶ÕáPŸ�Àо—z{»z þ½ÿË"˜íB¼jmÇ�’—pqǨ—æRŸš¶F¹ÚV—KßU‡·2„õ§l©"?7í¡^ÕÏazbçê{s¾�ã7ø¼ãá—ºéúsãønñ4ŒXBzbQhÖ4|óÈAµ�›îšÎÏÝ)=èöÝYߦ¾>®Ð�àðXHâô³4öÖQ5J¿#§_Ÿªþ5§w)æ¹»µCN©ÕŠÓ}~û‡f¨2Ì™Ž>߮à +pØŠÉ>Ç”Èr7æ @èFß­)”8)Â!½þK^œêňÃÄQ ðü¾º˜Ûß 3 H„cIç»ê ñ6V÷ÜUýñcÖ)¯Q±üÓÐ\NkVÂÇ—êz ‚±ƒ áKþ#Ǿ»½¾exG™U‘¨à=Ø"¿¬éØV±Ê¾Î2±ám7,;gþðRW׿ùT—9]ñ4�ç¤;½\]±(>e¿N|¨úݪ.ß{í/sï_ëaÙz̺Mtï¾eÝ5"*á¡ËX -sQHŽ]’ð…Ò*¹Æe‰¹óV{õs¼|™ÐZí¼hÄ¿}{ëNõ²ŽH°§m3mni·Ï·—¿š‚ Z&.ÓÒ’4]›‰øÜÓG|ñ¸ì„)CòÎÄŠÿÕ ‰„Fð5Ø]›ÓÈÉvýýP_†fN+\,±š"�ÙöÝPù/ýòa^õé‹&ƪNëçi�'Þ’�Y?ì°U’§)>�Û^ߺÛé˜�…v�› +.{­R‹µH”Ȳ¨ÞÞ» <>ᙀǬwVxl@¬l¯óMdº1Û x¼”Þ\¯Î-î›÷pB(nÌ€"ðB/éñmÑˤȳ�x((2Òçú~ês†­K£ �ª9µ�Ût¾9_Nï« pž›$-õqìËJ2xÜoOS†F¿Ëm˜º6–©Å’uØ‘»ežÌFF?r:6“¥ÔšdtF|³úg�‘¯æå6<öUÓæåÁãñøgww·a,ù.qƒ´ÄQt9ïGƒY±lþOõ¡‚/{ ÛBÿâr•ÝøŒ�S~9;>dtášCÇXï9ûÈ}d|'­‘/«³?r&Bæ¶5 K„>V³A‰ˆº4ÚC—±�%¡¾ÛNœâ¡¾®r6 ÞKß­M¦_í6sAЇƒ–Ìñ4,-È»gÍrµ›ëåT½Ïþ1èµÄ€$¼ÚUz ¿Êæëzèëºý˜t1ÐA––‹œ¬áš¥M€Ôó"MHì¾$åuöX©³ˆê¼2P³ÇêÚÏïËå9�Û[õu5LË5>¬Ý%Zob‹ÏÝ×_Mà+Í„õdçÌ”Bû— rÖo³ÉÀoÕð{\÷;A�â-�>�lä’&— w&È µ³GÉØ3浪];_¯Ò.ÝÓÓöåÖ£�þ¹FJm»‹·»ØÀéÑFÌÙé‰%«>£ÎLÚf˜an#íö9àÒÍF¶¹fÂ3Ï)”íãª`¼^LVðúÜ©{m™eÀ0º»¥Ø×_néÑ5ª ©IÜ0s©q~­OË\‰±avêyV[¦nÜáëþ�xwp|oæO¤y£>Ò‰¼Ló½>9Á}¨|X™Ykwf¶ƒdäϘäÓŸ›á\]21Éöné.fuôo$lü«ýÈh #±idž³sø øzu¬i§ÛqѶ$ÆE�jrƲGnç'£—šXýiO¿Š2ò21’;%:›=UXd«Æ±Ö¯°)Ï?Æ÷Æ„J4]icü£>Þ³Ež:§åܹùè#h6¿I¯Ù¿Âtå70·úŸ¿_êöÚ|]¬þ)¸ð¤ˆ?/Ü]ì0ÉiPüsãè+9_`@Ûáš0¡ “ÅÜf½“#é�¬‚욌ìÓvïÑߑضõ¬uÉò™hØççÚ�™#é9ïÿ4!äbQùÃËj=óºk«Ó\18fâXø§×«-X¯ÅôàÂŒ®Lñ=ýC¨ë* +’H¢Ù¾œnu{¨3¿ + +¨äÞ3qä:›ìåMª|¨.Õssj†µï–¥d<ƒ0MɃøÿ#¼Úz$Å­ð_™·­•‚ ø²#­´ŠíDyˆ¢yë‘"šrU£¥ RPÝ3/ùí9||lS½«�Ñ`Ÿó]c‡o DMs2!”¨©.¼B˜y?Þ6"ÑV¼vJ¶¡A^@a +vɣî:½…PÚ¹¬dóJƒÄœ¨t:¨Ô˜ kÌñ“Ë š[,SÐmX�x¹ö�Ë;*Jiê3§Þ|ïÈ2´�å�³�²Ö"*]ØoWQQ|H°R™² $×Å­ +†¬z»ÖëÖ ’¬Ò*àÒ¸f‡È’kî`·[�¥“,7Ò<Æ}Æ@$DMçöeHNKIÂ/€CáÄõfÎð¥§è*€ŽB}ÀQº‹\œúlù²d;Ý©k›!Î{•�tM‹?Ør2Ä^Ç.êµ\P ƶ½ßÈÅ—�ªc8»­ \ÁŸy„(÷ÅÔnÁ×xôØ®[J$ðÅ\Æà6³ö“PÑë¼,ã‰gteI"!]Bׯ“…Ü`®+Iƒóýög!‚W"½UT´�ÝÆ ç$…`ÅrìWe®k§_SÕ�ûWáÓ Ó 2ÕO æ¾�&nòŠ�.¼"ž�KõÁp@/ñê, 5T_.M7Ìð2ØŒ;ß^®–åêºr žš  ¨éٱ£V ¶Õ^t$œ:õ�´)a zFžór�MØ”¬é”B{5·f6ñaêÒíàv¸ï ½‹ãtŠ‹X*³R[yñ§©×T®—ª´ +žt›J +ki²*€‰¥K ýÓ8£óª\"}ð{ZP:±+Ú›�wg<ÆÈèdöå÷» éš�õ¦ÈâªÞ™^*dzÊÑl›Þ6‘×þÇýønyÆ8[¼4'™R¡Y®¶¢4 ú +Øo^êØU¥/­¶ðu¥ +wT Æv$ɹf.Níð>¥ y§U–ZÖ‘Ú;°Š9múö.”6�õj©¼ûÂx6P·ïc©€V΂cŽ D}|}íΠÏY"“*/Š@&�f˜°[=°²õ¬ŸÍ¬«W ¹Úr³¬eÓ[ÊJ•; �&€ÌÁ£Ï‡a°¶f¥p£zŠ¢àÃnÑ/÷9Ù¨<ÞhºÆA¨Ç:®”«žmÇgëñ ë6Ëñ«:gu!—›7nLÑe­i›~诟ð§ìxí�ÛRúÐP©ºá}aFN›ŸÍõz¿Ãœfc¯?ÌïKbÅzß0¸fpÅ]zu‚‚E�‰Á}ßä»,AfÙV*›?So—ƒ§Xa¯Ý€Ó{Ù)£ìñmg§ÕñŠEë%‚Á7áLÅ|l¿X2ŒÃD¨m££‚åàü’üfnO‘¶A²Åxôž6W¬χÓx·9V”[6ßö…ïÞ¢wrˆO»Ú`Æ3C{3�KîÅj#eå-éܽt}–vUô ¢#ˆÁÉò�®Ýä»ÜäOéx•;¬ù~]òy[�ò=[ÄÀ¥_ºyšžÄ�£@Ûd˜x»pAè0�Ñ@Ý•{¸¡¢/J·Ùó­ù‘Ùn�lãf ”gÑ—í€jÎè€&¹r˜<ÅêQ� ¸c¾üØâ}ræð—¯ì?ü¤²Óº¹*�§HøJ-?I®!Þ€/`ë >"¡ÔöX:z„cÓ÷XMœt(þ‚™á2qïD©øØ¦€ê1@Ð9W€p¦¶XÒynøð‰zÚöħ£xÉW¯´øL:&æ¨Mš +€he«/¥¯M|ÌDÒ +é$�<hé,'?ý¬õ +ßí„í@s1P�yâW5ºÉ×Å�ãŽ_ÇŽá-@–1çÐȼYåžmŽGÒ|‡Õ;8Áñb†EÕø@ÅeÒèÉ.¸àv¼áPÀ}ÝGi8 ò—(ăÝãÜJ‰ðp `‹Ô¨Ã/V�Ë¢m±H ¥Å©† J®÷&Ml˜Á¯ßºñ>í%oaãÐÇg¥;t`“Hu$À�( 9#Þ×PïÕ½àeo«š¯� d`ņùïâ}޾X’œ`´�B’¤¾*Tÿ‡2ámñ¯.ç³Í‚íÛÿmŽ÷={ó®<înãýüêqÏÄzÅŠ¹ }Ô�#ßwνKX^�ª—¶*Ú㉲`Ëñþu36Lõ?ˆ�n)HùË û0{UÁcá š)¦gòi?ÈR\BrXÓO’Ï}DÃÎHÿY!1ÿùëß¾~éæÁéq ’‰í§ I&à’;摬™¦*+�Òjßî8h²ò*Ë•Q—fè®÷~ÛE¦%$x#5J5H†fJ$©ØÍβpg}á°Yß¾™>ñ”‚öy@šÂQâ÷î D^ge /ƒeª÷‹Ü„”fï§èÞ¾òuéù´pZì}ˆ˜g)êhå…÷ãl»þRª¢9^ Ä`îÇÛ%QßBúO÷ývwH÷º"w¶¹æ­;ZYdµ8ôÐ,aNY%#4̦ïc­Ö¹½ö?KoëN6¬n¿ôFæ×èqÉAq!b�nûÓ€ç%�& )K7ßœ2 5Jºý]œ Áä¤ûö4ßÀÅ G*Ì}4d‘K$ÃêÔ©)UOâ­V„´çÛç!’ÑE©ÊÛy\þxÒOF2BÑèfú±ÝŽÒ¸§1Ðö’hPT �Ÿnã׺�Iäu¿ŒYqEOl§vK0!DøJPÏAÀÐ^ ü·\_‰Ò¾Æ0.5^4ÑG뢀Ý�8糋𩯊UX>ǰuÇF3Ý[ûDóx1L€šQ¾~õ"²MD¤�!Bˆ0w#^E [Ö»ŽŽ7ó“iÇaûîH6�<)K…ó»^Müš%ó@t ó E�¦ï½�Bw2ï›Ôn®#Âeœ›>Y!Çhr„4óŽÉñ‡ø5�/_NñkŸ�ëu½úÈå&+Ý�Cü“¢ÖàÎPlüv`¿°ŸØOß~öaÛEY?°8TròBE¯úÇ}šc„ÐÜè³þc�5Ð|}íÚ‰(O»t°Ï¢[ê@“!œÈ(œxíHîMn–B§ûÌ0¾§MÉ×YC¢ +l]sB“îGsL?¯°]|¥â…6k&2C&q4Swžè8™ª8mî10ˆRo‚B�ÆßB:æ;D1À3$­¦}íÌ›‰m™d÷ç•r`¦ÓÜÌ÷-вÁ4û?åÕÒ#·q„ïù{Ë1›ý"áC`[Nb#tXK $ àr¸Fr@r´ÙôÛSÝÍ®.vsä"ÈÖt³ºê«ï‘І x¦èSê¨#`Î ´€$Ån2=ÏTq ªãÊ ì}——+ñ¹t¸õgV€.á�[Ìd¤Ü‡‚4ß®×qZRX  õ Ó:f07k P!©`P‹ªã8�+U]›Ìºsš\ 7íªw܈“}Ô²ßUA´s±u<Ýš°ë9põ*(~¬oÚŸë7³P9X +îúþ\®¨ôšGüé±%Á¶Z7�•±ï#‡�Ó1±ý>·�ΔoÛ&€õ­cÊ�e_ËÿÎ3Í(8<„þOÎÏ4c×ù#ç]'ðãm6Ëóúô›¾�›©{l›8€ +i/r&0€ì¿Ð�V9n³á×LÈÃm6Xó;çí+X‚µÀø©ØÑlG.±Ù¤‰wÇ ˆü•°Y ?wKK‰¿ª‚‚0Ÿ0 „…+}'¬±6¹(ˆC4ZÆæ€<þ·`tÁÞüòs(m3C� cEž§â�úfv°Ir$´Løñ>œ›5Ì |lfp«Æ¤§º ÐñœÚ 0lºÜdš8Û#S® \;"ÀJüX?>gÆ£Þ"gH§Ùµ�à쥚„ò™‰¸~à§±¹™Ê(QA„ÎÚ›EÝ1•êð¥kŸS®.ªá¾ñ·(‡’3>ÇYàâaý꾆†ª¼¸�¶�ý—ÝP¢+I*_“hììYâŸWëœ{óúØö]û”@Z³@eõ’ðz_(ð°àþ…°é“{õ!ÍmšàÉ=! +jÔ»áK;/]–<ºÉÙï'k@©^†U4“$v§£4’“KJ`&;w¦mv™ ‚š¹å£-šY9öòAß5uZ/ ©Øè �ËLË-p¹ˆ¼‡€“ïF º!a„9ÅÞÀ¨Xü?ƒêÇ®…�Éeò‰q¤ŸÀ/ÀÚ7Ÿ½‚À³A’7þhçm +µòÇ­_ê¡ *”»| ”GŒ[E £)¼ééJÕ’Ìž4Ò.‚›ZØ7ú=ÝŒƒ2›žÛnÚX4î jÿÝÍ Áœ1*V¨7*­%cY„„[94Ѩô0~ýºBvÅ“Ë1šxtJ hµ½ìƒ'Uú L³ËÝŒŒüš†L‚�U [ +Ba(™F€-çDY +ϼÀóãåÒNMW÷v¡¸DÚsx¼ÍÝ~Ï®žt«”Å�i€ �ÁÚœû¤&t¤ ÁçvJ–?WÁ²ÖqÐ{§<‚æ¦`uO]“¬\QÊíâo…[Sb1ûÎ]’×%œç~ǃ„Gš&³M® ˆ®ã€âÝ×Ã`FË66d}ª®Œmˆ‡2/½Ç}Šo, +.*éèŒò_cC¦q¡‡ù69‰Š¡JŽLPw—9™v!ýù5UÀrÝGM� Vêçq¾vKÝG£´�‘’ë +CG/AÚÍ‘‚.í  á®".4¿�¬ÕÏ›à‹šIiøü:,?¸ã'sÖ'_©äf ·to ,UºØØ„ºYná(´œ›å�ÒŠi3¯J«¸Y?Æp¢¤¥ +úom>XÿÔžÌS +¡Âlýž¡Lp"¥¿&èMÎÓmhˆÄ’b¸«G=Ñöã¢>Û¾Ÿ +vblðXF¤²q2ÀØqlFF9]Ê (e�.e5&J9¿;_[Ÿž6«ŠÓ„\ ÿ€öq (½Ès.¬vTGQüNšÈ©@O5—ð7ãhŒÍmÝgñpÓ° îF‚ûÐ\€·39œ¥†{Œq�eŽ—�ˆÉ‡ÃÆñâ®) ðí[åQ#í5}w½Â�R¿`ÿäw gO´ö=ðýâ¨|íÔ]‚N¿hû7 ânêþs;@lë)*¸ðKùÖgÏ®Õê'ðoBÞ4E°PÄÊt;ýÃ:r°.Pfêøu 4ËKL/íS7ì¡¿’AÑ6m3šùa\»Á-7õÕ™Àèz]xŽu +sï M«è³�8ÄÃç6¦ë©¤Ó†Â™�ëØù”ÑúJî¿Þ ÉbæyòrR*‰¨ßͨæ@Pð{ÜwI¦¡ZôÜNq'Ív3m·Ûd\ó«¿$ÙÔ�FËÂ�5Œ@Šh:u3(óKÜ`|@œ¢_ùëøœ 5gžë gö¸û'sZ +×™Ÿºe ê¹@Ï +ÑÇ�ƒásÆøá#øÕ…´�âðÓT¿d3hvÉXL뜔wàYtõc?N¿K¤HŸþβí ZP²­ dðOÚšÞ²�cFÛÇ�­†–Ê °D'É!VϯŽÞØrgÈÀ$"øí§þ–­é£¹,¨h´p_ºÈ{»¢ ¬Â¿Ú†€Âpê[[_¶#ƒ7çqô##ã,ÐòµãE^¦e…ê5îµxkŒcj%›¦í�©—AHÇÿq„ “&… oÁå`2_Ípê[ڣ̖đn®86"QߌHRéëëá4Nä�ÃôÀ1exÑ<&Î¥ïÿÛÕo%¨8Ú­ "³²„yÏËê-y€�RéW”ŠI ~¾*f*F©Æqï/6'Gªqùæ€(Aq­Ûµý}åo¯Üo¥‚ˆ•”ų÷¿½E!Î�@KåÈWá-ÞÉKc +ÝòñðîÇ¿C"ý^—y¬êßx°àâat×m舶aò ¾q'ù0áG¦¶’¢)¥ƒ¹±¹ç¸‡•šú3&˜)†Ùb~þÇïÉ{^™�N·�¡çÏõ)U{ °vÕ¾tmjV‚Ê6T€¤ÜMÃK0#a=•¿eŸ–@«A,}G(qR ÉÐ.Ý¥�Ó 4\úûŸ¦ñ²1Æ*¼Ý‚" ¾¨ÌÛKûv¹%Ç´eÐUaáN�­dÝåtÞ…ùcó9( ð÷ö«þçvÈr‘ÑÁh8ÍÇ” +P¡B�Yå#÷Ìé]€;»‚•9u?¡µ¥Ç²g¿vñ"%À�š?µýónúd±'€­7ÚX"€Ím +5µ¯Ÿ5ÿɬ¢‚7ÑÃÃG5ù¨ö\[†,·çD\ª>ú'š:£öü©îûÝ9ŠgM�‚�‹è‘¬ªXÒЀ§Ç›^ .WÀ“+ÞtŸº…&)ßXóM%VÎ&Úæ> +endobj +189 0 obj +<< /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +190 0 obj +<< /BaseFont /Courier-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +191 0 obj +<< /BaseFont /Times-BoldItalic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +192 0 obj +<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +193 0 obj +<< /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +194 0 obj +<< /BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +195 0 obj +<< /BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +196 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 8 /Subtype /Image /Width 40 /Length 236 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ (ÿÄ8!1qAQ¡"bÿÚ?Ò.rÞ,‘Bªêh~Y ÜiçÈ• +ÙôM?¯Æ…ŒÅ�É¥è´×åå· $ëßPÃ’ÿ¦]0dµ4+ºØ­ÿÙendstream +endobj +197 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 56 /Subtype /Image /Width 64 /Length 184 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ 8@ÿÄ)ÿÚ?ÔÔ¨(* +E¨(@* + +ŠTÿÙendstream +endobj +198 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 512 /Subtype /Image /Width 208 /Length 15901 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ÐÿÄV!1AQaq"�‘2ð¡±ÁBÑáñRbr²#‚’3Â$¢Cc“ÃÿÚ?ú¥s”~l9[X‚/·ªcO +\!г�Dè¤ Pšõñ®e\£*±G0ÆIˆ�ÉDÊtÒ¯€ÎG³CpFç¨ñ¬IíÉTÂXZ8€¡L\Ž›|ºôÁ+{[jä9›¶om09]�¢ñ?Ÿ„ìÈÙ�h0,:üi¹\`¬pouÓå]AغŽ'‰ '¡´~tÙC¯Ø +’9|†ÄYuÿª—¾ ¹C#†éÆSÿŒüj¯•ñ‹cf“ãaÔò"ß…)æ­ H ü?=ÿ¥K+f%âo +À‡R6 +–SÜäÛÂIJ²¬‹ˆ«}|4®µbRYJ\ØÄÜÿ‰§ÃˆcX¿RN²heÇê $§Ä^ÕQœ­‘_Û€­#—«�òØïO�»“(`l“¥æm½s¶/kŽL®Ï÷ù—ÌíĨ + Ê#\ªÎ¬k§r+ê&ó¼JÌ› *Í“�ô�È·Ä}Ô¯Ýb¡Y¢9³ÖH««õ©äÎ1°^,fö��K÷¿ñ—8²)�/O‘#k^Ÿ/r¸“™P k:GO¾)1÷Øß”‚¼bf"ú@•Ÿ ­�»”£#!‰ "c‰:Hª®~F85æ ¢ÞG}¨¾p§ŠúšÆ$Hn~F™Ü�Qwà‰š\ðq·Š‘ó®lyñ¢ zŸñ&“#¯¾¼H¼ w‡­‡.5-‰Ü––h2‹1ˆQ‹Ü +ÃÊÉj³åS¦²¶ßZ–‹…P¼ŽJ«7"@;h<ÿ•'¸³“$ž6*ò㌓ÓÛ0u0Aõ1±�I?…)UlœÉŽmÑÈ×^Ÿ�]š†‰¸ƒò4]¸‚NÕçÿë${ ˆ’¬øûh¿Šš¶'P†z¹ør?Æ¥Ûä^ßsKåh +^ÌÎÿ¤¿†´&&ÈeX#z¦/Èñ}5®ìAø/8åcIÞ+—<Žå UÆÊHl|ÚjeKw^Ц5dl“þáG عðbhRœ\žR¿\@1¿�ª¬À¯Â`EÇ–µ aÆ|yHb2’D_ƒL@�é"ñåVÉÜ.L|‚½™ i±N3X}�*@* ‘IúXUìÎS…NQň’³Ï6ÃU�7UñÒ*egöìâl¼¤ƒëñª6UL¤©�HXÀ  +4¸5ɉí;NBW�u ) üEvãDlÍ"nu¼J¦“¥B}0J–�mÃVŸ¾+ KŒ…“0 ÚÒ$PÈ@ÄÖ‘Çû9.‘·èV\Ø�2‘® ƒ\]Ï/Û÷^Ü—†)Çêåíˆã×MÓ"qUáÄÉÜ0*�j¦aÍFþ¥ÿp®î±7mŒ¦E2 AOcåzëv+“Q/Ó—ªcáJ¹ðã\„&†"LF�H6«²ƒˆˆ0V:û«�2�‘Dóä¤h«÷Á3Ŷҗ+K¡åd³ bêd“à(–ÿ“9ÑìŽ?ÛË–Nqã¤×Rq6´†cåçHØq¹õ’I–Ä,-Äé¥u2)$¸2CCØK[C?(û)ÄF‘áSnÏ·.\ã^DG(£¤Ð‡l1œc&Jñ~ZUhª€€´t¢q!i*$&:ëøTÿeÛÀ_i ˆ°ð¢;\ ÈE̘}i†$ +/­µ­‹<1¢¨ÿá[ØÄ·“©�&œ¨"�hi3ÄOX­í'ö�¶éMëJq©7Qo +ÊòGåV›T3÷ ��*Ï#s1@é}jÅ€ÔÑf +$˜¬X ÅA¸ X i}Õ+ÈGYµ7!ZEî({ŠH¸ùÖy‹k\÷\Kõ9i”ú‰&'§åá©!wî[“'8R¤·¹ÊúÞʯ…F>JëX˜;×?iÛ¸+’»©&>¦&ñå4ÏÛ{™Ü3�¡Lê^åL€?´Ž†’ø™½LO2I`b8ŸJÏ�«¶%ÉžXO¤yúÇçJÀçÉÅ�Pc”7+‘¦¶ÝOÙà=¶%Æ[Ÿ�~òhåÀƒÌ t׿ÖëyµC�F– � ô´úT;Ûa}kgÆ1{bIõ,“©<–ö¢Q_<7‰OD¤L)ÜåÌŽ$DFÞ¢àýÕÞ â ®nðÃcóîZ†^×÷y ÈÓ�©hZEéû„gP9KÇ|" ÷QÁ“ÝÄT– +m<ŒÉäFãrA]¾�eVäMù-‰ ÂÐmçN~¨:D��þT«�$‚fbG—…C¹Ã‹LlÈ �òÿ‘ùסR�QÖb~ÈÞ®ñ½.D …™}ñÈ}�®Å k­d’_´Ð²«ó¿(‚z‰‘>Sn•›·W2×éá@öØÈ4û~t[·F îºtùiñ¦Ç�q/5ùÓ2Rÿ +S�OñÒ—/m�9V~^�!ˆtúQ8˜1™ˆÔÇËMµ¥¦5åêO#1ó¶»Sâĸ§ŒÞ÷%¿Ù0&R M‡R$À¬­Ì7£ZµiÊŽÌ ÝLþš€3H¹C³(Ò`˜´ÄüuªV¦iø� ™éT¡5¨Íi¡C&A�ˆ&0£‘1Ð h#�DìbG…¤SÍjžbF7ƒ‰ƒÐÅq`VöÉ,H÷@¤e�:¿n‚kñÀ±¶—šçÌÝËæ`¼¸@ŽŸ«ŸY¿ŸÊœ`ÊWšØDñùoE°ää +8¼¯+tuTN ’z�~ê€í²ÿ“Ê€ò¥£?H3êÿº*)Ú²úyzd˜ƒÊæ~©ü¼«Ñ¥È s2l~¨«¢�"Ÿœ�Ë  +�o¹›õ¦Å‰�’\™Ðl¾[üêG³'¸\þáô«¨XÇ' ñÕ>óá;2�€häIÐêÄ“¼ïÖ�{_nJ´dÛS_åT\Dê72<+�ûáCeI�@^ZA2Aƒ}£Âº[ .Dk¥ÇC4xz¦LF–�:GÀ§“ 4$Iä>Û�f¢;'_Ñþ“ÊÑy'H«díÆFHòÞÑöŠ“â8‚„äİ’Ä�®OÛZèȇ" VF¢$yMs·eÉ`äyõC[XG”г` $“=zyP=²´É&LÏO*µ +ÚšÕ�J4»ÖÔ jÕ©dgਠ>_ÄSÅc[jÕ�jÓZ(Ö¥wÁ&cÀMC÷ø\°ÿúÌ7Àu®šZÕ<ÎB’,bÞt0Ž’cÌ3}fiò1DfHÇZäß6Ew… rbY ­ŒZª�‘^‚À�õ™è#úÀVlÒÏÉUEà©6‰3zö\ª"“$’%Oh~—¸î3$S$�¹°t¼LЧlùX�xƒz؉7¦Í’!‚³Ž]OঠŠéÜ]¹­´iíÓcÏ“&1•=jÊcÓÉJÎ�㤟:®2íyÓUó©å=ÂËP Ie­¬@ i­.7Ë*Ï‘$¨W¤·@Oô¥Ë—7ºe‚¯$-Éäú‰Ÿº*ä>HnP ‰¼�é‚1`I²éÖoRa›1~/É�`U¬�âþ™ê¸®,™rdhÇîÖ�Èÿö Ûo…ï˜qL\IúÔ �¶û6"’ìçKŸð®ªÑB¹3'pÙ±• í¬“,C¦œNžuCî –Eˆ±˜o—-ê¹A(B‰$o\˜0æÂ…HSêvÔèìXmãV –A ‰´\É�ƒ*p�õ0ÓüéÆ6I žž¢déG"d ” ÞbF–ükb\‚K°3 #ï43á÷¤ƒ×ï?3Q^ß7¹î3)0D oýºýÔpvχ² @ˆA–¼dØ_áD`ɉxã*+Zʳ'O·�1Å™Á V‹LøýÕ7íø£3­ÿS[ÛOQ¦ËÛ;’Tª“¼LÆ“åçN0º¢¨m:ôÚ˜&P> t¼|èy9’Ñam¼ÍX, ™¨ '� >d™ùÔ²ö¹Ø¯¢}IÈ’m™zt« YNBYÔ®À-þsùUõ mFµ@›Q­F…jưµmkDÔkE(ÐЦ­5«V˜®UιB»Y·/MϤH=gJ “Ž\Kóacãçµ }ëdk'§”LÉð$ �ŸòoÝ34&2×p L_Ê)±‘Ü/&R‘ÄìAéð±ùP|îo&<ö¥=ÆPê¾Ñ‚Gªt�NÓ¤}⩃;fåh•™™*`Õ«ŸÙS™Ÿ~+øµ'îØå8Õd-ØÌq[‰ù¯])ñçÉ’ü yÞA ÿ.¾Ÿ;à€ú‰‘iküèäÉ�ÁAkL˜|¯Pýè>âºý Ɉõ2ËçúNß:?¹l Œ¹±ƒ  MÍ­U\y˜/ijÞÑ"ú�"ÿ…Lg΢]PXÈÉã0f"àO…v)$^¥“7Qii‰Þ/Æ¥�>FBà#Œz­6–�¾˜åÌ€€²cðk&L�Š’¤ì+ÆI£ˆfC U‡€ ͧRm­saÿØ>V_KÑomÓŒÿ‘Mwº‡RAn�qd Ül£,dWå?ãuÿ(´MµéG†F|y8Ádk³��ÕXsl‰ާ“7éR?Iž¡tµOFÂùx£9¹�O'´“]2äÂblŒEøqQ1þn?:L¨ùH! Žíhl:ùÕrT& ̹¹�·ÆŽ1‘P, _¨›òé�Z¹Û&A‘£"L‹ÜÎûT-•ø·ü˜ÂE­Ä½þ­ùÕñ—UaÀ̱{�Æ£•2äp}®@\Ѧòg}©²«f*%�ƒ"ÜÐt·_áQ l�¨’ÅI-ý£$€O&'û¾[Z_&¯ÇÒ}.N×õrøU^yqÁ€ö6 MµÔiáP@ÇÉÅØ‘#™â%´ ‘þ™uè$� ¨÷ +þ’8‹|'H¡�’£�½/0£I'µõ¥Å�Ž7t]ïs¼@Ô[NŸ +^ß ‚%8¼)±7›GŒÕ@ÌT‚W—bÅúÇ->41¦t +²䋘Ž�>0<«¦µj‹‰PÈÖ/ãNu­S| ‘ÑΨdXkùÕhQ¡ZµO.y£˜ž&G�ÒG�lxSÒ#¯Sæj´¬¡�H"*?³Â—N·½þ5qZi]$±‘ÌS�(k[z5´®>ç+eTfî·pä9ßý3åU‚ªÌ’T­“»Ç‰F�«©ƒm§ËÇãCr¹I€Eâö�oí[÷kËŒ6±$@™Š+šKØú|?ŒRbîùY‘� Œk$ «{ßâwû¨–ãs^sÝ6A�”:鯤�]uéÔWYÌ›1…PI'A†>äd¹FPDŽQqä ÔqÿìñfT|jì®9U•âG%3â4þ4{†o @9 �ˆöòü@ùSäï84lFì#ˆ·+Þ~꯼céi½­høïµG÷Á€)�Ø›�an¦Oʺ È'K‘/ÜáUy �G €ªóyµ«Ÿ³È@{æònD.F]Lôþ‚º2wA8€¥‹�×^š£å(„…,vQò’>ú ›ÕÄ€ H½Í>Lƒ–;Tñçl‡é�y¿N–ªäRèÀ¤‚‰ÜLþǕЯ¶¨2¹˜3z�Ê£¸h +ô±ÖÛ�¾uÓïbPKX9om¦¤ý¦e¿ÕÄ“šš3#cà ŠñˆöÕF£I[[ÎE­]i•�°m £�"g[ MÇ]ˆ?…&<ØÉ ½¯}ïùiMÜâ9�¬‘6�`‰Ü£Q\½æQ‘T"³t&èë:oÒù! Q&ö¿åSÀá˜ð’&L©[G ?ιû#Çÿ_…Dϰ€õ}[J¦y÷pH"‘…fC®ªa¬R“—"2²Ù˜€‘Ä2ñ¬ú·_J·pY¸%Ì ù‘àxÍ/uÃ*66+….=$~ÑÛ†`'Xy&¡�– ùAV%Û˜€b8"]¢?I´ÐìùcFä¬9;°±Ñ�ˆüj¹3cƒÉ1aã×HßZtÊA +PùŦ£”3åÄÜO¥Zlz©�º­ÝÈÄð¥�“¸‰E«]ŽÆÜŒ‰ù×M­ZÆ´VŠÔ¬ ±Ú¶5* 'sMZ+i@ƒµª§mûLkŒ1`ªª&'Ò8í+¢„Rp<¤™ÓãT¬kV­F…ÕªmŸ°Rê ‹ÖÔ2÷8°Ç7Uó Q÷±… ÈAˆ3c:R?u�w“!`]¹Ä ù_JlY“2‡F :ƒ"ƒw8Ѹ–�'u˜bÆ[š¤D³} ØZq†.<¤\u‘Ž,é›é2:žtÙ …<'i0>pk›tù1³DžJf +ÂG-¦÷­Ûg|°Üñº€e“vž’ÑÄÏ…PdÈÃ�ª8“& וþÆ*ÀÔrwXñ·Þ¨˜±­«Ÿ°ï†^ÙsdÈ�¤ tßʺq÷X³ªLƒ}lN¿ +زóg tó#òªe̸@-7;Çä+ÏÃÝ;äî¹é +òB7,‹àHÖº—¹ �Yä“Ð3äýÔß¼Åò™$[Õô˜:l¦™{Œy`+ ‘ð×å½G´l˜Õ—+ó`@˜ $ªµ€ÚõcÝ"Ìí¨Ôü…>^^Ûpú Äé;W6<¾!—ˆ_Hƒ0½ÈÒÿ] »„#ȹ&l$·7�go…z²&TäŒuEqâö×ûüÿä°Uå4Ï�Zé( Qa°FžÙT:A´Æ„­æ×¤Å•M§H´kv!D“©®nÛ‰EI �ÔÀÔm­K/j¹›*‹ó^I$Ž$qÖ@¸1âw3TÃ�SfK3B˜å,I‹*˜°¶,Cm(ÜÈ>5 ËÛ;Œ=[Çù²|d\¸óãt䣜’GÀâåyÚ+°gÇ�€ÆÁ _‹iyF¥ÚdÆÙr*°'ÀÏêjnáÓµËîåÉÅ8ÁzMÇ;-ç>?q[¸Ìò8ûH È³+d?¨GÝKïbã Ȥ*Í–EàÓ÷?B6Ã"$ sS­uŠd�[u®?|7"ª[›©YÿƬÕ¬yÓöà¾|� +"èVà»o£ +ô !ēˈž±C& y¾´V�$øÑdG³(>QöÖ"t¢Q‘±#°fPHÜŠÇ1’ ùŠb¡�H;PÕb¥´¦ Tß +dÊ4É�qŽ*"�3¦¥ ªYq»•*)$É�ˆüêª ^�+E/RÏ�³@äE¿R²²ü-qVÂhÀ¤È¬Tð![bG!ñ?z+H¬)y�fÔÊÁ„Š Bܘ$SÅ“#µÂ�`ÉÚ6óª%ˆƈ`ÂEÅO6VÆT-x´ñ3µ|„�Q´ #—˜xÅ.<ïÉ—*…ˆ †�ÀÏ‘£¸ÊHa�ÐHñpr¬ûkøWH`Dõ¤É™1G& :IŠòNY +Φ>Ÿ¾ŠæÆÌUX5q𠹋de�¦:^~3÷ +¯(ÖÕÉ—¹a•ŸPÕµ o�þ[Ȳfõº’XûkL¹‘Ä©Ô>7¸`tß©�÷Ò6l‹œ$&/yÑçðv0 ®?Ûb̤�æðC­#ê¿ä|ªÜµÄÚÆ+•,ªš‘¡Oê‚Ö¤é >ëPÊþÞ’–mhÈü j4� uöø±âÇÔ(Ö�÷R¸/™C(â$ƒ;Àß§â¼ †<6­‹<%Š(RÆX��SPîÄÁãÈÁ‰Ð[ã÷Sv,[½ùäÿ{WGJãl/‘‘• / W©æ�÷5Ñ”s*¾2GQVÂ=µ¹“ð’GÝ[tERf êw¥;ÂN ‘ú¨û‡{‰_p™PÜ8Ø‚U”DyÕXbÂÊê"‰xÈùÆ”½«w81l�<½¼gñ5Nì u’·Õtÿ(ó¨÷90Jú“’²�G 9¨#çl…0b-È(¹�@3$Ÿ Ö¢¶w÷b± s¨ƒµ¾'gÉì49*HÈ3”ñ‰ë¨�…&2éì.R À G÷qi‰®úƒv˜ÙË�I171nQiÿ#['k‹+I"A*c¥©¿oŒ¡@ÈZõ“ !wÖ÷ùÑÅ…0/(¾%ÈA#mt7¥¾5R @&O™Þi±ã\b~uŽ0Lš\8S!I“øS:‰¥ý¾>,¥A dƒy£� +bž+¯�/í±æyLÌoÖªE)Æ­$‹›ö5ÍÝacŒ¦%Ž@‰X}0Ú[z®ñz•¬FÔËÛbG9(c«G¨ùš¡ØŠšöØ”Ž(¢4€-h·ÂÕ‡m…L„Y;ÀÞõ³bŽ YHŸ:L]²+8Ô4˜`™«juY¦&Ô†`It�-ó¢¹Å�ÄÜER…jÓZhЭµj3BkV:Ô_¸‡(’“¬z‰ð«McXÀŠÄÅ.6vž@ Úóó¬ùQT� ¬ ¨Žåÿsíx’nJñÚ4õu®�kTŒóøα­0HÔm\ì«Ù§)Èæå‰1:LmÒ—¹uÆ£™e€H!޶€DÜôÒ‹?.*¹37U…YÆ-Óà|jYpfÍ�ñoHY– ôá}t䯗g+>¢Šëk\ž¶Ç›";e½¿Q°`z�O•_m—¹>¦ky6þ5eÂP’Á �I>6½WPkŒöéÛ–äï`=Çå7Ж¶¶ˆÒ|“ã,˜UØŸSv-ÆëÌêwéÔSdí_;Ä`ņºC úWj/5ÀЙ348Ó�½Ì—1üÕQÚ#Ã0<ƒO)<½'¯O *áßS¹ë\øÏ–-~E©°àB¼â ‘#üM¿ +«"dhb¶7ˆ�ãM‡"e†@%z] S÷Šçî‡Ø‘ÉàßP!üir`Vï1I01e µÅsåµ6'ç…ØˆŒ™$,Ücvusz¨¡ ïFµ,ïYH`2 èÖ£Bµa¥cZ´Ö¤Ë˜a™¿ð›�´ª +±m¨3*)c Y2.E 4=Aäi«VšÔ/\¸P¾8-fÝAOI¸ä‹}…#ãîW£$µâ@‹ý3å½67wÍÄ1!Ta©Ÿ +èȬÊB�ÄÒ`ä0§%àx‰Y‰�-kW#7u“!ãÉDˆ>ž kqs5è ëÏîtÌN"xÅ ¨ãÉIùS»åÂ��‰$�¢ý·êÐ_S­"~àb,Ù$³!´l.À|&¨§0Uiå7â5ÒbIôÚ—&CÎ!eOTM�6ümò­—&Uý¸& °V"x3ŸöÆµÐŠØæ^dÚGÓ´xü¢¾‘,}JAøŽ”ÝËBCqe´â#ê¸"Þ5Û$ä 3ªudHÿ*wÆ_;Cô.‘yçACcW^e�Íât}µðµs´•ÀŒKK²’côeh$Wt +[]o~•™È ›+fãˆ_î$�z1Ÿÿ®=É&$A'Žæ‹ËepÎH…*« ¬$‘±®ÃqjçÃ…ñ¨…‚�7>Tß@<Ì΃á§�s*äLȤ;,I‰›<~ë×VdvXBêG/ºELbË([ ´ò`7MIˆ¡—fy\¼VŽ é3sæ>TîPÞáà8Àú§êš¦xÜ“âu¤É�#0*À í$üf�vÌc“ò�GÎ|j}È^Û'p¨3 +9r×ãCµ Ü*8Ê¥#Eí¤éáWì�Éî ��ÕÄòYò“ó½í�X¸<’‚40Ãb6h¬�¡Æî܇¬’Ð50v DöÙ’s1hPÛ ûõùUra÷Œý´Ú*xû_mƒ$�I‰>qG7nr8ur„¤_]gβvÜyD–2IòAj'¶Vv$�A™¢˜8*ŽD‘úŒ|ÿ•1ÃÉH&g[m¤TOdY6W $ñ–céÓÊ)¿h9,Þ:\ÚúŽÖ®ŠÆ�PÂÎ�kVšÍ! ‹ƒZ¶•¢k RbΙ„£qâ'ð5Jk@Ð €E5 £ZkQ L ®,}ÆfužÄØLñ؆ý[m½I»ì…ÏiB6N@þ®Ké|¾BÏÜf%B ¢9Úä�"ÿ�WÈR9xísP×1„,9Ï!?Þ×ó«â÷<™I¼@�ÌÒ2æÆ!À‘ô±1ÔÚ†`�WbÀ“:+q'{ŸL‡*rt!H�=|zT°eîr¯6h$ýQøiã­´®¬YFljãF‰ñ½R¼¬û…|ç ^IY?øÓ~Cå÷ŠêÈsó•u"G[þî`•6 �“‘$@bŒþTÝÆFN$AùSË•ñæE™cM=,ß�©œ¹R[�zbÓq¡¾ô;c9Ý€…½:À-×{UfÄ݃( ` ú|gÃ¥;ûŒç‹ÀÀ2

Õƒd`AV3hØÿ/ÊõÝÆttÇ�Vð 'üXíÓ�W\ FQêp°¦ÓÔÝw¤Nã.@-¥�LèIQM‹Ó™üͼÂWQ0+Ë œá+ì¸<ЀJL)BthØïWÈ2?¶3h$ÚÐA�|+´W*‡Å‘€BA¿+qÔ˜Öfý(vã& ¡ÔG@áA‘„å\rðý£x¿#]Ë5Èãm¿u È\?¹Oý¤7å\ÝÖ,¹•B­Õ•®uàêcâ©;ŽÉû¥È'"2Oör•#}+¥3q Ž §ÔùŸ•£"�Pr= â±iÛøÒv˜`Ñvf·Wbß�c�˜; …ÈÆ@IÞ³öäb*£S-‰<�ªÛá­O>穌XR~¨¸¿ã¿„]ûnÙ°áL&á7^ �´ª˜H·Ôo¬,ü?ž÷ÂÇ"æomCI:·Ó�ÀÕÀÈ ›túVÚHY‰ðßáQrá±ÊŽr ôÌ?êã1µ]W#] x Áó·áJ‰˜<ö“ÿUô¾×󠸲®VIb碎Ÿã]T+Q¡Zµi­ZµjÓZµcZµjÕí±ãrê ±“ss'à"«H{t,X‹˜“Ö4ªiZµjãí»‘�9 ^¸þ�m:γT^ì1Ž 1c4qwK� ¤j¤zºh'¥ }ØÈüx0° ˜ƒ?Ú¶>äd’ªÑ±µþú'¸,)3µ�r|i°å”8˜=j=Ç|;x<�1 Ì�¶“Tnâ NÝ…&^ùq¡Y‰˜Mà˜�'Ò:¢ç #p#ÏúâïrätÛÈ ¸",�w¿ÓÓÆ*ýÇ~�¹ +xî ,ªbç[ÓŽð#I™X#Y¿ÛjžýŠàY`A$@0¶ôú½QaÈMY{ K)R +ÄN�=šÛúŠäÌù2eÄÍŒ �îÒY> 7ùï]™²[jH÷'n´ƒ6EBY.4�Wð§\­0Ë Èü¨gÌØ@!y@b‡mÜœü�^%I3¡#ïŠ|ˆ\‹‘à7¨g{áH0Í h¬ß•;Ž`Ç#ojé6¯' Bçô<{¨Àp`J¢ã˜¤é®ÕÔ�¢¢y*?C<È>5ì3æp�Ç‚J˜$6NP7€A¶»Q"¾>a™¬ é˜`|‡ŸÂhvØÎ`\„‘Ä#‚€&4¶µÖÙS$ɼ)cÓôƒUK‰ˆ ïÊÊ©‘§ i¼ñXÏoéMë Œ�é�?M›ø�)QçÈࢠ¯©ÛXÐò<™ržÙ‘p<”eßÚcSðóÞ/VÉËåír±˜ú¶ˆÛ�þuVÊP}ÈØRçNE‰tÞàe‘¥*çVnA‰ƒÓ­¨®nGCµêMÝ…b +´ Ê--¬ï¬S~åK0ž,›X‘?˜«š‘ÏÅ£‰‹^D_ãPnè6LEX€Óéƒ- °¾ÖR~×ìÒ¼¬y±º÷¬G;þ,c_1NýÊ„GB§‘`%€CêêƒxØRŒ£ ÈÉ‘CÁº¯8”¨©i�ãWÆ{g#„1[ZñêƒÿäŸunÛ S”³¼Ô¥Áx ÓÕ5gîq"sfã>3e`à\YH÷ }1nD)&ÑÕ¡Ÿ¾™™pææé~0�À‘è½Ïç±ÎÀ…eP`É$.Tni;v^Ø7#©&M¯Èõût¡Ÿ'©Y¥±"T1ØKZ†³ôvË‹êÆœdD•*`b÷ÜÕ3aNá‰VHêA¨eÿìU05>™´[]/|*xÿ³‘ãÒØÑGú•²·ýB¬¬1ä ±0ð \Åâ? +L¸Üà± +>‘«´¬kå¿Z¡ÉÏE& í=&¹×ÈíÁs~A…ÉÛ]ïJ™9:ú2,AR¦9_�ý>vÒ‹7,¼€ÉÌzxñ…=(ŸÕƝB¼òï’ÒÀr™ƒ:ñÓo*lìrdíø«Bd–±°öò.¾dWu#¥G/n]ÕÔ€Vu­:aâÅΤG„yU V�BZ+Õ­XŠÔŒ°*@ÜDͨ¢²€ÉëMZµh­Z�Qº¨ $� k®Ÿ?:ª"ãPª@À +j›fÆŒ°è&ô2寣o¼ÅEŠËF¦#¤Ûî¥lê­ÄÚ"ÿ¦N‚zÒcî9;+/-ü*¾î>ù136�:³&YàÀƱµRb£�ºÃ•‚£‚H‘QÔS¦dÊHS1ÓJUî1’À0%~ .F÷ ;¬%¸‡RH]Ž•²w8ñ0VkÄÆ¦:Àªƒ5<ù1vƒ= ›Qlè’€Š'2ƒÆoK“¸ÇˆÃ0 �L Lk½1Ê LêcãåJ�Î7˜m ±& øP^ëú„ƒ‰ÿ«MêÕ ýîÚùï-¯Ë~›Ó¶uYÞ5�1ò¡û¬\UƒHa ‹ˆ;Ú«\®q.<� +’I°åÈñ®|„¦LJäL¹o5ã¯@Ez @W4¢eböØ�4AI€É’n6éõ4Ñî#%€RÑapìDƒyŸ!s[´ö9Ç—™‰úƒýõÖçˆ�k‰qÊ’ …·‹Æà[I4ÉÜãÆ!˜â ’`È�uc[·Lj qPYšð#›øÏÆ¡›$$é—$ÿ¤s×ÃJ«öë›).Z·ÈdëôDˆˆò®´!¤®õËßç\Û³?roÎ<�>qñ¦NãÌèμ�¨ Àå5 ý×lý¿$È…Cã¸"2š|™‡[MØ›r�`ÔpgL˜O eÈ/1É]˜_Ì +éL«™ˆæ¤ÚÂñ?Óñ©v¹ð!ö¿ýŠe» ÿ-Hñ?ôk›+;ȉsÆ[—/JÉôÞÑá;Ò9C8³,‚°I�TÈ"ÿ­©�߯‰Æü Ü·¡“¯ùMvR6$b PHÐÅë64i•lmMA”5È),f}+}l/EpãA + °À¥‘1¢}*�ŠÃ((h"°DØ• ÐQ*¦,-[JDÌxQà± ­¥h®¤Ç[mSÇ…ÃrÈÁŽÐ°·ÜÍúÕ Q­�£Z´Þ(mH®LÌ*yó2¨8Öe”_Ó��”ø²«¨¸’"tšrÀ 4¨ë’êAò5Ÿ*bŽLt“�•½ÄAVZtéhüêœÔ$[Ƈ5&$HÚoY²ªê@ß]©3g\(Ù Tc¬*‰:Q|éˆìÌÅP0q È:JsãVYyÜÑÉ•1]Ø/™ŠŸ5ä̉’m�ÆVÇ�™bÀ›‰ÒþŽXuHÖom¾3÷S Ê[ˆ ‘bô£“*bÌñ¬™W*‚¬:Eî1ã`¬À&7ùQ9�€Aµöé¬ôªk­yÏÛvË�§´· 'ú¯:mö‘W1¼!U…¼ Eío‡ÝC·Ä¼Xug›™ú˜k¯—J³AÔþ¡þêçíÕSÛâ¡yã A%xDüê½Ö0ê$Lãhk®~Ë',ÙÀ€¤m«éO›Ü9ÆSQȶª¾V‘ñs}*9½Û2ˆ‡â'e —Jnp™_‡ºq‚Uu$¡hÆö›º\xQZ"cêÈ‹]Eeìñ{Ï(rÌgÔ9qÆ»éaO‹µÂØßÛPÒ 7å<£ÏÃ]u2W6.oÌ»c ŸLãP?i«öë�TŒm"v2$ë§Î¸ì!Ó‹+<Ú¨6·«ç}…vb†å3rA5ôê4ð‰®|¹q‚øÑ¤ðó×�w6;Ñb_  ‚ĸ‰þîQUgUʈ<~pÿ¡�±·k�…áÁ\,ˆŽ‡…¥Mb¬=³�E&T+é•Àé:uH®¬JHÓh’gã7¦p’&5߬ +á탨xÿ.>?èãŽxøk÷×§JTJ +гÐ\J¦DüI?�/íñÉ A&Iܘ‹ü(û Ðé�é�…öøR®4R• �¾,¤P|ÇÛ¥cƒ*/ÿNŸ*Eì{u$þ¡ÄCO÷uøÐ=‡lÊáB«ô¯Å|†ÕÛ¶\³—–O+�`�öÓ©»|N²)@@ S ( +Â�OÓo§kt¢QE(Ã�H!VF†Ã�!–U$i %A�#KVöÖfùu¥öqÜq‰·M)½µè6t¨¿hŒÊx©@V¦ÅƒÚbD@ô€ùé­PãBgˆž±[ÚHúGÊž¥‹0ÊZÄq$_ž|iFE-ÆDÄÆñD›Å ÈÇ!^&–ÆfÃÊ/ð©bîŽ\Ù1#‚«IÜ3:ÿð?u[òŠphkãI“*âÆ�ñ&<ÖÒ°`t3[’“zÖ`‘áQÃ~á±p€[”ëÏžÞ~ú©È“„�¦ôæ´R—UÔ�çL)YˆRbk›´ïOsȔဠ¿¥™/¶«Ö©�.G +JÆHé´}ÿ:è¯9AyK5Øê#õ·K ¢¶9\²…,Ì1Ø3(&ü´φûÕq¬ç � GÉâk�»Wïääª)‚¬]DlÜì|@®üa•1’‹I��(À¾ãe˨Sà±î5ÌŒq£_F¾¦ã›Ң¨Ø—€ÔÇãk æ¬;83ÈH:Ç«qs5L�®<¢L‚ î:ŸdGsÛbÈÀq«Z`[ñé­tbĘ—Šˆ){ N"` %dô‘q=‚¸BÅå`yXC®¼t:�Ž‘M‡¶DE�G¨þ¢w¹“÷Ô›&ÃqÖ0(ênMÌêgSz>Ð�[}úÖöWÕ7å¨7E:¨A•ñŒªTÌxÌ^“n˜‰* �I%›ædÖý®)’ �dÜüée„†O-}MaÐ^Ãʈ찫 q“úd÷šÍÚã/Ì‚LGÔbÆ~™Ša‹þNwÒÌA�Ó¦ÕZ™Â¬o}ü&gJtEÆ Q7¨âíqabÈ�I’cÄ–?y'ÌÕ©�"š„ÖšŽ.í3d|k2‘2� ×MªÕ¨M`hŠÚV­4 Š3J®àѬl(šGr¢ÀŸ/çMz;Ö¢(z¯MXÜW+;$’Xð[Âýd ·òò¦âäYÍɸ�›W&Lp€òkÜÀ1צ¤OØRb9ñ£³ƒi 1AÕh`|ÆI`W‘Q?\†+x€~èñ¤ÁûžrÁâÿ©76´màk³9eÆì„âbn&+—´L¹_!$dq"Þ�æÛA{yE¹rˆ Ç(F™ëôøPîFfâ¸Ì‘29p‘ÝÄ�Å]qåaêb øÄ�ÈÒc#ž9 (¯F‰¿ÀÔ²»öøŠ†`ÎH€ÅX©} EtŒ%Xæi2Lué2ÿʼn̓ +N§j–rÜBþ™‚y0o¨u“3VíþƒrnMÈ$r¼[¤Ñd9I�MÏ�ñ¦Äœ77�I4®¥Ú 0zˆŽžu)+Œ¯"n¾®<¸ê ߯ZLk™ñbuaÈ„$,Jòê~™‰5Ó—¸¥d‰›ƒW65\¾‰u*Óv2c{™ã6½�H®êGBÄiçð©ãÀ1»¼-â Aˆ�ÿ¥"öÎŽÎäËÖ±f_÷ü©ŽÈÈU‡)°277¿Zb®I�BÈ$jb'î­Û`É… +»%˜È~¢[I=k  î$’½µ“öÚ«�•1¹$ÄÉ>UçÿëS#âaî†_w.‹êò5¤´Òº²v¬ùÃÇàÀÏýÔsvîÍËB†. 2›‹Ç]¾Â¬¨@!ŒÏ†4dH-'¬j|…'²íÌ3ŸQ‘8ÇÛzà ,ò"Ë™gZ9p¿¬�ƒ=dmQnÍ‹+Œ�Ë"bD4 Ÿ +«àb°�dÀ;Fâ-Yáã$�â.#qÐÕ©Y$È€|©NLÞOÎE x= ªˆÃjUíßC‘²»ú!x�(^_}S–ë±ý:Hûª•¦�6¬¤+V¢)Ej&•qªL'¥85«PhЬQšÄЊÑZˆ­F…jç\¹]¤ 7%¯@ƒøÖ9˜ª(0&Iü…é[7í±‚Rð=+ µïk/†Ô¸»¿rX�q–›iôŠCÝföÆOm@ �9ÉúK GÊj«Ü?¼q3rzxҸ˕I)-˜±0‹­Ãxþ5@0” Ìú”Èé\ÝÉ)ƒ‡B�ñ�Ö«�2¦DRÞ–X}E7ÿ§§ó2gÊŒ&X}C“Xý± +žß"çrRâU&A Ĺë$úúSãÂï�.Æx’ÿQ Ì9'ô–�:¦ ™Üñ||`�X‘lTuñÓÆ­‰��ä±r•RµjÔhV£BµÕ«WÿÙendstream +endobj +199 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 392 /Subtype /Image /Width 200 /Length 11805 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ˆÈÿÄW!1AQaq�"‘¡2Bð±ÁÑáRbñ‚’#r¢²Â3CÒSs$ÿÚ?újÙƒ;m¬ßX�Oâ*™z‘1ב¨§¿$X“}Óiÿ„püq"&\lÚûuÝÄ´’O�´VGjW©‚Ù¨¨�;BhIà=¼žï¹·øDOºÿóSÌX…•�V>3}â€s3´q7òÑ2.F0!›Î ùVÕ$,3ñ¹ãΦØò––.4!¦ÑX\FÀ@`Ý'B8�MþUc�ö�Ä—øÊ’®wXr‘ö^ 0àzTvÌmŒ2—$èEý#OÁ®È`:×!í²¶5Çé±BLÿ—JºŒ¡`…ÐqøÔk“{´€ÔAc¯P|©/k“Ra82Dã­ùREÇí—'mɽȋñŸ•\{®�„Ô� D�‡ZGm‚J³hAô¬žª®EŽ� 4†Å�åÜ"qá~×�S5Ä»V|ÉcæLš¥ RÒ�d€hD\k + V©Q4 + 1E*)Ò4LVF$�ÛDóŠÕ4 +uϰE‰�o`Á57È!r:0n õ¨ ôÈóà<ê‰ÜK”a ×QÇáo�sÿýLEöÚ$ƒê®ÝIY°µ]û�¤„É7à#ŸøU•·b'�C/u°íUÞÖ•nèo±¦{ƒ �a½B˜#¯Tòf`«µwÓ�êMe{� ‡@&ª@åÄü)cîÆA%XAa¡ûߙҡƒûšga<œ3G ~5ÞxTÆb/¡ùmýµ•ï ¨hìÔ-ÎL�)'tûöä@�Œ%åšÅ®"�ã@î2ä$®1´’ÐÄF Aù‘[É›)r¸Ð%¢ü¬ A¿¸�‡ÜÛ7P ÿ_I‹ò§‹¿ …d�@½­sTí»—Ì`…"òU·m`ci®©±5ȽÖL€º(Ú úŒtûzU=ܬ´’}_ûiåÎèꪪIe Æ‡h‹Ä‰¦Ca�(\»–J°´Ä^¹ò£dÌÒT¦E$‹Kl‰¬jªJ1AŒ�HnÖy_ñË^ä¸@­ÆNÒiÆ­Æ—º|�HdE°:¡ÈO—ª°˜žs¯"0±°UA{)«&.ø€GýÆŒ‡#ôX)ÛS1Gï§�2ÅÃ1Žæ,/XÆù@TöÚÒ b–¾Þ'[yÅu\…²àŸiÊ…oW¦ íáº~ÞUθržØ+bpÃ&6�A?í”oã�·�_(É•°Ÿm†ÆÜO§Š²Aõ7 ©YÕÎB‡!p�·ÒWj ޲bÍC«æÎa™v¨(·«©ƒÃ‡æ*ƒb +¨•'HÝrëÍ…ïÖ¨Í�Ð�€¶ ~îVáO·Æw³+1$�Å¢mÆñ®‡@êTèAιq¦l‚¢™bEàzŒ›�Ú’N–Ò³“¶Èٽ ª Ÿ¡”“¹G3#–•¿iÛ2å#éVP']ì¦äù×Y¢ŠB�´§E!æ•è4¦¨¿k�ÛtMÌ1Y1ƒÒ©�â Ò˜½1N�EÝÒaú§ÉKZ(4›»ÄŒªMÜÀn`´|ª>UMgÈùTÓ¹Æé½L‰‹^ó|¼¸Ñý^3ÂâGZ È¬$TÇwŽUIÚ[éÒ[ÀgºÇ¤óó#P9‘¿ªI6oH“é:|/OtîqŒ‰$5Á ‹x3w ‡h2Kh’kK•ON••îì'R'¨áXËÝŒNi:Lb9éR9[}Þ¶RÀh}?=k¡3.E$p7tž5„î×#*•eÜ$H×§�OØj™³ "à™0çQÞí1½ŒÆ'‰ŠÙîUZ"Ó&,:ÞhNësm(Âf&·�5¼yCu‚4 ÁYÊϨ� "ú|Íû•͸¨&$i©RAê(^ësÈ3ê�HŽs•,¹1…oPúXëËZáÅÝà\)”ä@ƒ._Váù4ç]Y3âÇ•/ºÓI�‚ð>1î³&7íŽí ä;¤Ä§¶ÿ)Ûç§Ì‡½ÆÇ�qÊ—oÜ�d°;‚‘!}D©X›kΫ˜œÛF2$XXútòƒêÿ,Tû}�Ü8 \:Ã>žј´„wå÷xZµ�"¹dSu"D‹|)fÈ0°, 1n@úŽš‡¸Œù”íê7V ÀΜG…_®D%cêm ñ5>äûyq±Ü4¹ÑÆžu�‘[¹’°ó;žU>Ëv€Á2¿0W#ä+ùͳvÍ� xaƤ%–Gñ‹#]=Ùnvˆ> $�ˆ"±ÛêÄHŒL�9q�Æ”�J>Sê £jðÚ Z‡j»r¯³¼©ŃkǬ±’H�dé[í18íñâ’¬žÜ‘ü›Iq^ÙТ¨ÆÃo§Ô»~ƒ¶c^*É|=Ç¥½XÙƒ$�ÑêÒ;�¯rmµ§^Q];G* Å8€ˆ©ÒŠu5ÆC&y[AʄĨÌÃV7>J QEP)EèŠË®áÔ4ÔÅ1ETýüaöo]ßÃ#w´]A‘}){È~á~´&TrB°1¬¥“2â#tÜ�/PËÜ:fÄ£nÇ0N§éf·úk¡2¦Q¹0æ ŠÊ÷8²1Uu$jŠg>%�΢,d�©�Ö¶ MòÈ‹h3®ºp¡s«9[Û�ÂüêŒb£ýon?ö§ú…3Ýà «î,¸•%‡Nt¿«Ã»nõ�5ãʵýN#“ÛÞ»âvϪ9Æ´÷nS°‰‹VQå}R.Âý QNä¿pO§kŽ*Sÿ•t¶@‚M´Çõʼn:¡ÐVŽd'åúÔ±fȘ”æ¹0B¶Iëxæj9{ÕÈ167;]ö’-¢—û‡òþúÚ X1]‚€×$Ç'¯Î¨¸Ã¨-"@Ôú…¹Ž>‡Ç°.Ñ;yŸœž“TÇ0 ãPï•¶©@d>1#]¾ânò�zTûŒ‘— ðÑ‘ÿ5§�ý̙Ռ€á@·Ó³GÅ�M{”Ë™" +¡ÖÞ¡’?*ßjCäÊ?ÛuTÓÒ=´hø±®Å°�ÂÕÇÜ…Æļ|%.ܨîsI(ó—1ãï`FµÇ‘n¸UwJ™Ý-eC1�w�;³² + +®’Àܵ‰Öq­älxqXX)']¨ž57a‡* zD’y› +è\øÚa…„›ð’'äk'zú€¤Ik4¯ämʹ׸ŗ»Ç±�2A™3ˆð®úå;ÛÑ ÆâÐwƒ„n™é¥ßFØ·s�t®,@¶]€� �¤�4v½ªáÚw`Ò!»XÉ!€ÿ•Mù™¼›ÕóÜ»¦Þ«LZÆxqãúV›æ-$_ãY=° ‚ÄÈ Ì\xÐÝš2Á-7¾âÕõ\~9P{U)·sXƒ2wXΦ›vÊH2Din<ºV†(3$ô:P1*èLrš^Âïyß¡‰̳Ág_Ý[ŠÆL •v±0A Xõý¿ S¼„$¯­¦Mµ™:�j�ÚãÉ;�¸�Hé6ã×Zg¶ÆH1¤ñ1~šT‡öü@ s?SkÏHá[=¦2A2JÄz�¢G>´/k�@:“©‰7ÒbªÈ‰›uŠÃàF‰“º`È>Uº&Š@Ó¢•:(¥4éNƒJŠ(šAƒÓZ‚ :SDÓ²X­j¢C±`tæ(\L~³0I§/ÇÆª¯\زáŸkRF‘I_;©£9̸›g© �)kL€xMQ–å§OƵ¶˜&¸0;dm»²,²ÃêÛÄioÂ×­³¾BȬU‹â6�ê"8kéªË¸d ³Ä‚xI6ºÃ™=*ç·êûˆ=8‹Xô¬w+<¦Âåe¼¸_ó¤Í•²"±cKÁ!øÛ�áZɉ±ãb‰U‘Ù'V€HŽzUû`5“$™2-sÎ�l†c¸ßOåÓJæ £ +eÄÅ•™KIôä+ÏÕÇñ¥t¶&¶ÖŽ|O•/o(B¡Æîl²>�ΨŠU`™<ê^ˇ,¯f‰Ô í?šÖ†"¡@:kð¦¨àA`táZuܤñ©cÂCnr­WÓuÉàiàÊ�ÀÞ„0:ó¬·k¸Ü`´‘ç5£‰‹HhXli�Ë•kr#ò¸¤{y`Óqå?´Òþ�ˆ ä$8’xGLX½ D“roüÆi>ÆC2óFütŠšöƒfÒÌÄ`°1-Ç•Taìf ½�] »2©�¶Qm>�$L}°Æd‹E¢Zç‡9>~GǼD‘yµOúS2=¼/ãj²(A#ƒq's xóü~/MûuÉõ#ph˜ºÁuZ(Ö�A¢ƒE-)Š4©®|D1!fLØG_*Ò¸Ê%L‰#Ì5ª)M:"•‚‰4±¸È-<®#ó¦X($è)#‡¸ý�hlЬ›�HûEn¸òw0•f ´•R8îf/ËÕøà»Žã*HXÜ 4[^+¬iSÊî«éÖ@Óv¦4‘Sl™q‰0Ö: ¦x&/ãRÇÜæw¸;gÿ­‡üÒ*m›¸;™BmPN¤nté¬~ÚÑî‰P7Ãýi1ãSÅÜf ‘˜h ”¦Ÿ¦<�ÄPn`é7#KÇÄþ•LlI‚À›¼¦Pk�µÆ¡;…Ú'%¢×w'ã[ÔáÀÍ6Ý’ñ0ÛÚ,.dð®Œyò°�UbüK_­\×>a™¾†ÇQ>}ãeÆ¥,À‘¤í‰“qÌʵÛdÏ'ÜW,[f¿ä5�“¸l€…xÜgèÛ´Z×ÝT.|�êØ¢6€/Äwuéy3cûl/n€XP8ý£Âºæ¼ÿíÈþÂC@ôØ‹ãøøÕs¼fÄr jçI³ïf – +••ôÚ÷‘¥g¹ÅÜçÆ€*¹úŒ ޝc¶ÿLh*��²ÈtR �°ê¦ß-+¨,Új �ºÛ[Þ¹{|m�!HS0Æ ´Þæcø@ÿ +èEÏpv�ºÑM­ ëò¬Œ9B2ÛÔŽ…‰?­$íJƒ12ÐA‚¶ÿÇ:m‹6EefPH€ §S?º¨˜ÝT‚A¹#ÌÌR\yV}C JçÅÛgÆ™A)¹÷F°7"~5tQÛ&Ò@,Ͷú³Ð?U±¢¢€tª”e™ôñçå\ø;&ÅŒ aeÚ¤�xŽ\"®˜žÛ›A/×AS^ß"¨Q�ë%ˆšò|?lâ}Ńkäãühí»sÛ&ÒÓÊ4æjÌ lO ®\®^ßÁ‘N—ÛÀtÝIûL޸܏ô>�dƒÏ¥Av±bX#b5oæç×ô¯NŠ+-�^7`ÈžRÇ‹¡G "·EQEk/�^7`ÈžuºZÑEQ@½&`‚X€9šb⊠Tqå9í ñ�ñ©cï íœL¡¶Ám£ê¦l`iƨ¹†öÎÜ}1?�HwŽ{â* êA28Zx^®™‰Ü»j?Ö¸ª@ +ÌULݘ)mä£å`lI$iåRîÜ”¸#i™h¢Mÿóªdî\ ]Ò ÔéŽ~4ýò˜·ä]°%€3�-<(\ÙdÔêyør­åÈq¬�&` +çÅÜæÉ$"hey ùxQýVyÄ KÎïWþ8ò¿/xû¦ÊAP +°\îÚÚ1"š6q’ûJ‘&÷Sȸë5Ê?¹±fôX3†Ý 2Ö^1aÆÕד6RÛq'Žâm>:ô¬dï=¼mšÇ¡rË}À ÖòëZÏÜfQÿ�tø×J}"¹»æ#°0FLw]Aø‹SL™h` màfüªŠrA˜›Ä +æ~ퟶ\‹÷GÚ`®áüQó­®3�›(–Ú#[-ÿq¬ç “aØ‚d ½:U‹Ü6Æ�ü¿eO»FλMø}&¨r7§Ð× =6ÔßÊÕ5Ç“w &lMý1c¦·©ûG.VS‹m y +=R7IˆZ:Y26Lqãgú�Á,Ë?îãÖ´}ÓÝ#{m´#�Òº¶Â-3öž§îv€]NàX³›Ióé4°îÂÀ0ÈÒÜvž }§¬éίÜc÷1•ÚT€wW V;|[z +É$îmÌÄó2|ô¶•¼Jı°Ô25׆µ/m‰Ú¯¨Ò"ÆL·—o�ðnApYÛv‘î;=…ôÝVõƒDO(ý·ð©(Ê33f=PA²uèk0¶Ý0¶=ê!o©Bí¸’/Êj™#™ x±& òµUKÛh‰ŽÄfp}#X³ZmzOp2éÂA½sN #°ŽtLÓ‰Éíì:6‹ùÏʶI'¥säïN©Œâs¾Á†Ý³ ÑvaO +¯õ%T›ÖAˆùVUÛ.Ö‚£¬Ü-ûElç�ÛV@͉¸�(½M»äB Ä‘&Hãð¬wì1 cö’c‰ô‘aÇZÆE7²z ?VÙ: +ÖE‡…]Õ›·ŒŠ¥Š‰èÝzMG´î±cgS¹€`Üc˜ž>zU—ºÇ�1[Ä�8©e#⦗o�»|g{¶¦t<âj,ßÔfVBÛQL˜…™SÆ9pÊ·ƒ£å‚O¸Uþ’6�Š‘?åšyßÜÇ•r±Aa¨ÓIçR=ÉWW˜,ÌT”øwyü©á¡\FØÛ‹H�G5B¹s÷j62¸ØxÚ,@2O�tãΙ>“$|Œ�ÐÓÕˆ~>5¹©'u�#mRN·ƒ0o¥1Ü!`¢LÍÀ$[[éFNádéÈML÷Ø@uŒÞöÛ¬òŽ3úU2÷8ð�Ý´LtñfLÂTÍÈóSyYû„Às©€"I'�YÎL¦Ì�AÃΎ߸ „9`ó¡ê´úGÌtç­lwx÷l›ðDÊMÄsëKr™#Q7†ÒG�¿G¹Pb“È~?U¯}R †õò¬6Pûv–¢,5Û32 ¾4e$ÀX¾žZ¢ãÐ*ˆÒEC¦v,FÖQ“f|Fß�¨wDäE+q¿.@Iø^»qý"*ö2ãv±'ý ?Zž\«•±²Ç-ËM2 É‘w ,`}ÐõãY»q ¹šIÑÝ”™¸ + Wk×%]Xs*ª'Õ÷Aað�3ÌSÌØ�£d0¥uú˜äH¿ç±÷OrÃrÌ4˜„ŸÊ¶Ùñ6/C,H‚"Ì+›+`Œm™¡=°fðM€õS§®ÎÍp>Â�¾ó{O�>àª:3‚oãi�cN~^5ȧ)o¶ÃEý†¹²¾îÕÔIb ;�ûs¦µÖr¯¸ a møú¦Þb³î+efFY ê6/6ó­ãö‰;W”˜±â ñ©÷y7m™R'Ûebäô¡¶æÐ‘éa"yô¿�£ÝT; 4Ìê¨õF¦ñmo] +�¸–ˆŸOJ¥"¡µ‘Æ­¨:SU +!@¥ ¡Ä0³±  …h*òÌ §…J8¢(£Z-HÁ¢9P4§Š(¤®CNh‘H0ç@`Ú¦LVUÕ´ Ð2+Xj{—Y©gÊȲ€YGú˜,ùLÖÑý ±щ¹‹ÌG*Ÿs•ñÚ»¥€7�ª~ê¡È«©ÓåF餹QŒøÑî¡1¸O) çÆiq<¦õœ�Æ,_[ªø�5ñ£/q‹Öá|LVŽEP "�|(Ç•3 Bæ Ô2÷¹ÇŒµ‘‰?vådQªdîðá0îªz�aÛ¡I6ˆ¹'Ng_:çÍ…qú@g*§i‰ x,òò«0EMì& à8ù©c;}ùW¹Èå¶‚Ñ­†±&—qˆäÈ20Ü€qí²IÜ~¡<9ècZ¶äpªÌ8úL^ ytd˜�*JÉf9~?ZŸkŒcÍ’.ãÀ0·uM²ýÆhY ‡Éºûºð�4®ŒxN<¤ï±L=MK7j§2¹$–`5�»C5‡ŒO€å[NÙqº€lE„m�VɈ¸Åc”_ã5�ÛDìHˆ&8yu£j1Ì3_]5’LJ¤Ý¢¹±±‘§ìêG…O/nqAÇ$$M”D,éøæM¶Ô¢ìf€tä/Ç�]b­ý2ÌË›Œ[˜ª•Ü*c¶P�e¬A�ÇuŒë3M1bÂo™Ò–L �‚IðáOź8™5Ľ¹ÊƒßÇ»%àí_H“¶5Ӈκñà…‚N³®�m±+O"þUÊÊB"‘¼Éa ‚³§&+£JÃaWm×Ò5 |+/ÚãÈ¡ +Ùt‹E¶ØŽ†‘í1u™†ò ÈÖ˜íqˆ¶šA"·í-í­õé±`L?H�žž5£�LÈÔƒ©áIñ&O¨NŸ+ŠÐ`iÐhÝâ½™õÄÄ1'A0cž.ëwtBIMl@Ô‹/pt­ãʹ”:H#ˆ_‹WJâÈ Ø~ŸßIûvr a#KuŸJÓÖVÛ¸ËGÜaGŠ+^Ñmh€áÀTÏlç mæ@Ž"DÏYüqX»VÇ•ò„îDKû«›7l0âTc* .ÑÐù‰:õŠ®792*¬²�Ia*!}g¦‘V³ÿ�ÄiIçãΚöÅYœ7©€ÇI Æž>ØaƸÐíU(Öˆ‹ëUUÚ5šŽNØ»®VDõ·ÂD‘ÎÛµö.r;žngä |«¡„ˆ5!€)�Ä€d rfe"™™ +ÛM”jWoµÐ�¶‘¶8›™ôªœyúvù͇(°®6Þuž¥hW>.ØâÊù?�·ÿ*¯/ä¶À=Ïquˆ¿/ƾ•c7lsãÈŒlêV ,oøñèYãYɈdxD¸ð¨.,ê [tú¹x��e{7�]·ÒMÄÚ#]¸ý·¡ûGÉ—Ü, ímDÏ^�i±w ¹„Ê4á#çKú|§8˽`+(]¦}[~éþ^U3�ðbÚÌ]">åž'Æ©‡VTÝ’À ÇsTör1;˜Eôz^jiÛæ |¾€d([Ç"Lü¢«„6ç“iµˆýkyqû‚$‹ƒoå3úT1ö›>òHÃN:ƒá]UÌ;B¸† ä`Ly;mù  ^‚ÜbûG +m·+:±Žæîh yè£Jè Ñ4…:)H4è¢�`t3(ãNŠLŠú€|hU )È¢Š&�¥c|Yäãum¦Ò V­ÑKp$O*A­5Í“3æÞ¸ÕNÙZ蘰<ê–\}¾%Æ (l¹•@™ íð5ҽà �]vΜIÖt´iy×ÊL7;ˆ#CyæÜAùU]Ìí]bo¥qaÛäl¶@ÛOÚÎÞ­Ö‹éTnäáTXPH33µ@™6ÔÇbŒ�Öe +.MÉ´NÕÒnÒ?o;®FÜA@Ó§‰åYP;u\h°*€ ûªkÜ;e|^’UQ‰‹C–^|6šÓfÈ®ˆ6’Äð?Jêuü×y�»|/‘@;˜ƒü š©Ý3"bÀ� eƒº^}*k�ãÍŸjÃ> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ (ØÿÄN!1AQ"a2q�‘±ð¡ÁÑBRbár‚ñ’¢²#3ÿÚ?ô_­w%U�$d|ÄHá¥YÜ�Bî,±7hŸ,EàO…L>lJ˜†ÙбÜ@Qí¹:ji׸lˆ¥`ï"ë&üùM+gΓ* m3'Y&Ö ;¬²§hÙ%X›uNѶüà{øEêï”íØ@ÝÍI�ãÔ=•<©—#ô²‚²¤›y¸� +Ï“)9€pÆEžvóùÕ�åóãÒ8�|^‘³¿¨n¶_ùü*Ø·þ¨65JÔ’+˜N]½’ˆ<ç”ÒbÏ“!{ùÈt«篅&6î%Ã…Üo ³hÿ"Õ»Œ¹7…6²ˆª&àÝ¿ÇÆŸ6wÊváÜJ˜m°?J¶­ý‡pýÆçl졌GRÛY¦Ä®Â8n�…uàf(a`Fá}³´<8xSçLžœc‚ÃMÄ�¤\�·Î¥ôÙŒ’çÌcîQÃ頻PÒ L~£Ìü* ÛdÉ>«u .’°fþ"©è»²î *Í�7:_N?*L’XÆá!O�ÿACŒ’X´’x~«Z¥�s0“*™¹e/o`eùÓbWDÈ,Ⱥõ۶Ɉä.êÛÚl¥b/î?¶‡ÓeSÑ�*’IÉã:LÉ6üÎúl²ôé, ’9‰�*�…Çÿ& ¤î´÷��#ö¯‘6œ“3r8Ä "¬S%º†¼ªiÛ66r�Œéú¢>@RNÇw/J€EÌÂǾ˜átÆŠŽÒI=[¦gwÇ„pájè`XXÆ•ÎÝ«8‚䃯ô®šÞ�#ã A4U… +azÓZkV¬kVáZhXV±µi 2)m²'XãLhnèÌÐ6£ZkW.G ”�²`E¯'w¦›êÈo2€HÈ�5Ž Ó&G,C$`ÏäjXûÆÊAØB˜‚g”òùÔû¢ùVWfå둺*D_O¾ªsd@ $˜Y0�Iƒ�tÃHé@Æñû­§ñÖ§õy‚Ϧ ¸‚ÚVSµêÙ»ƒ‰w&H‰Ö?©eïNu‰°˜°‰m&<¦í»³ŸvàhDßýÀSdÎû‚cÚKÚ¶#Ý5FÈȼ&¹�xB)é%Œ$©ÄOÛƒ3÷*�ºBÁè"$¼^Ÿ¸îŽ& +W¦e��@ŸÓ3i§_Uˆb@-Ì™™û¢§ÝwO�‚®°Iégå]¾¼©½v* @f07¥² [HS�N›ˆ<ŸOˆªzŒ:wbæ O²|+0a”¶Óƒþß)©yFwȇƈ9®Æy߆•p¯é­ �p/ðš_E†ÛÿqùëΓ»ÆÙYT)`AîÚ¢ßy¤Ê¹³=2!™„‘ɇÌý´®†W%X-qom¯œQvÅÄ1�}¢*y»RÛB‰ xb`ÌÎíg�f\¹�Z(YÒfHƒ< ý¹(Å—h,³,ƒÇ§¨ÅÀªb\¸Ì°žL‰¼�I©äL¬Cz`‘u“ sÖŸÒtmÂ倠‡U‹˜ȨNÓ3i#Ê4Ó[ðähYX+…�™�/³ÜOô ¸²¿p¹( +¬¢*L¬}Õ×Pʹ@ÊŠ`@ba€$nÞ�*à7˜2LI>Î,�¾W + vmgÍ»ÃùSeíò¹$¿”‘»m…¸ZDëIè@Ly*£œ yA Ϻ†l¬qãeÚ‹–�XûpÿÙendstream +endobj +201 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 16 /Subtype /Image /Width 400 /Length 720 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ �ÿÄN Q‘!1AÑBR’aqÒ“�¡Á"ÂCST‚¢3DÿÚ?ú� ¨…Z ˆ¥QªÐ¥V…*´J­D"Ð¥VÛHG1›ÂµsY¼+G5›Âµ»B•“1ƒhVŽt½öÖê% ¶Öêd�¸Î ¶\�ƒ5ƒhVŽ|½öÖ&5ƈç„Rçµ™ÈëÌÞd�¸Þ ³ënÿ•œCZ˱£sÏ”;ÞÝk¥põ¬?ö¤ù�Ö®·‡~Ôž6ëW[ÿnG˜ØWsõIö=§â» æ ñ¨êY7©tšŽ¥â1K¡Í4èê]EÀ,z‰zoé÷™WÙSÉ '&C[–Œ¡yËÄîÓ]e®1„rµÃ$#¡ºƒ u‚Ž+vGØ×‚-v^{¥¼ý(ê÷z&ù3< ¬—Cfäÿ)ƒL2|¹S+•9Á­lØše=‚·4ë.öÉ„´>f–�–H†œ”èZç‹E°1̱Óì\ý&íCüÇŸ©=*íºx�­yt;‘Øw˜ÿºËpñ¿Ä®…rüg�Þ$ô+�ãþÎÖ» ÝŽÎ"‡]e>1`ËZñ8]ÕÙÙòu á7CžP÷¬œâsÈaï]L»²[CZ €� \±ÛYM‘ÛYU‘ÛYU‘ÛZ,ÚÊÔ•ÌÛ…Õ¹¤ËÀj] <¦ ‘Rl6�R¬6�RƒCs¨ +˜»Ê ¨-r˜6EI°ÚJ @L R”¥!(J•" +RÿÙendstream +endobj +202 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 832 /Subtype /Image /Width 16 /Length 778 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ@"ÿÄ^q123�B1ÿÚ ?ú©5¼EÊI­â.J—“[Ä\¤šÞ"å¥Å$Öñ)&·ˆ¸¥RMor’kx‹’•I5¼EÊI­â.ZU$Öñ)&·ˆ¸¥Å$Öñ)&·ˆ¸¥Å$Öñ('·ˆ’—“[ü”ÛÄE*’kx‹”ÛÄE.('·ˆ”“[üŠU$Öÿ%$Öÿ"—“[ÄJ íâ"—ÛÄJI­â"—ÛÄJ íâ.)qA=¼#”oâ—¼#޼#ŠS�oTqÀµª8¥ÅZÑp-iôµiÀµ§ÑÀµ§ÑJp-iôp-iôRœZ}:}¦ΟFΟE)�³§Ñ�³Ïè¥06yý: +SgšŒ žj)L žj06y¨¥06y¨ÀÙæ ¥ +Ç5ÔÁXæ¢cš€¡Xæ¢cš€¡X梅cš€�Øæ¢…ïÎ@!�~r6cßœ€@ýùÉ„ÛI0cÛI1³ºI€Ù�]$ÆÌzi&f=4“3餘 ˜õÒLlǦ’`6cÓEcf}5VP4fz«)£3ÕY@љꬦŒÏU`:rz«)Ó“ÕXœžªÇNKU`4rXV:qp xò�<:ž8 tâàñéa@ñéaXñÏMU”™õÒLhǶ’`Ǫ`§¤ª˜C”•?ŸÂ'_ÿÙendstream +endobj +203 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 24 /Subtype /Image /Width 280 /Length 1040 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ"ÿÄ�  !1AQaÑ“�±Sq‘¡"2R’ÓTáÒdðÁñB¢â#CƒÃ4DQ!ÿÚ ?ú]|ôríŠ�BïìÀÎíx]•^+Ê¿*{–ôR§R§^oŒCE ÁþŒ÷'ŒGéó©/I§J�yž0>›1Ë*|_ðÙŽZô‘*tî¼ßü6c—ö­œ{ŸS~CÒ®D©Óº«‹ª2;zƒZCùr?ÞW"TéÖ/=…o„oZ±Ÿt®Ñ;ª«‹°ùŽå"¡:§r±p$Mã¯rœGWZ’YAœE®<êˆ&Zé-ù”T÷GÅö.Á{TFq›á ±bÅíA�f³'þY,á½ks©I,€ƒr +ø•;3çÐN§¹éV®HJ8„�ÞÄ[s)ÔAü¥·®eV¬CŠD—¹ã·j¸+‹©D¶Oò3-þ¿íÅG5ôã˜7-w$d$�|:jþá\ñûÇé¨óÏÊ^‚æSŒ”ˆ^J > +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ�"ÿÄy Q‘!1AÑBR’aqÒ“�¡Á"ÂCST‚¢3D!Q"ÿÚ ?õ;AH„ŸI»Pÿ1çêG¥]·Oµ©R›´ˆ¥sºÈì;̉N…rÜã8‚¹pBÁ· «sI–?€Ô˜€AS5ƒhV‡>^ûkò˜6EHØm¤LkŒÏ¢çµ™ÈêXm¥Csfo2GÜoUõ·ÊÎ!­n¤v#tnyò‡{Û­2³yCaµnSÈ©}ký©>cu©ÖðïÚ“ÆÝiÛ  T hºÞûr<ÆÂ¸ qÌ8Õ'ØöŸŠ~„Pfg0g�GR©½K¤Ôu-”@˜Å.‡4Ð{£©4\²ˆ2õô8 oé÷²0•}•<�Ârd1¹hÊrñ;´×YkŒa­pÉÇ(N �3ŠÝA…ºƒ�ÁCŠÝ†Ñö5Çà�A@‘Å®ÃKÏt·Ÿ¥¯w¢o“3ÀžE*R#’àHlÜ‚?å0i†O—*2±)SœÖ͉¦SØ+s@N¡ÖzVïl˜K@p�#æihùa¤ˆiÉN…nx´[ìË>Ū‰¬ô¯ÿÙendstream +endobj +205 0 obj +<< /BitsPerComponent 1 /DecodeParms << /Columns 1920 /K -1 >> /Filter /CCITTFaxDecode /Height 2944 /ImageMask true /Subtype /Image /Width 1920 /Length 79318 >> +stream +ÿü´ÒgyK@Öv)ê#±ÆU)7ía:·[ Óq„švžÓ S aZklB°ÈȦLt×N 1J­¤ÈyŠëJÕ6ö�lŽ0›AØIÚ¦šÛM'AÚPe]Èv„W ˆ�4Ó]Ûa]±L&FqAv�nhm‡âaÕ,�Œ•ÄÞóÂgɉð`†ÉÑ^Áw-Ô’“œDDQQsý^™9«ÐKªºéSizºH[Aut„2#IU´ Yˆì42"k„Gÿ–¡¨d´T nZ LÆGÃ\ŽÌÀ$·5i•Ê‘¸ � “��ä ��¬)ä + 8ÿÿÿÿÿÿÿÿÿÿÿü¦q¤A +[&±+3µ¨(M Õ™Q�šÒÕ°G�êÒ,š2/ia°o•Á½/ô‡ùÝHÉg%Sayc‘\¨þ£ï´UÊ|&ªA#±OøGØ¿]~¥-«Ç áªþ�‡Òß„K�Ïý}Vûÿÿ�™ä_Âýþªvëõó±Ðãªÿ‘XÖAsŒêE9).4 ”dn0Šs(a25‘ê^þ9ý?;'—F´GÔƒDyH#å!ç <‹B4åÁ°¡Ê®?æãj‹òúF#A‚.ò!�`Â6B5†ƒ"3< Ñ Cᦙ.,yɸ38Óm4ÈÈB>±ÿ_S±²:A"óc$ +I‘Á…†Ql4BUl!<ðO‚ ¡5†c l#`dòl�P@›4“AaT#8h(rcô{iÐN�m–ˆîË!6–™ÒÙg«iŸk¼Õs‘KÈŒŒYd9”=œ2 š²è\Ïl­„k #@~FÀÊy4Ð&è_ <˜ôÕ[ «™¶Yœ&ÐÃM0–×KLñ‹¤ÛC‹i6ºMº ›tµj�]ô¯õ�‚³¨Íq¡dH)@„èÜKæ26DQÑYá(Ï¢°Ê&§gŸóLþg&s¼ ˜iþ“¤Ý:OæmØLña&NË…¡LŽjëMmô­ÉÇ}-CUîÿúÚN·íz§^5ï·OßÍ‘ÑÈÖs!£Ù¦hø¤aÃÂ70�Г™Á&K ˜V –‰›[[Iµt¯JÐds]–‹a[}]&ÔRýµº¦öÓz %ëßé] }Vâ½v¤p¾é7ôûïëíWë¾÷ð�‚mY.M¢;i6¡¥}'I†¸T´Ï´›iý+­-'[ÖéÒ}+Úß½/õWkKûèkz}ÿwÛT½w~+ÿK[Ýý!ü¦ÿ‡ñumim´­t½-/•¯Ûmmt�u]|ÛqûŽÿÞ?}»ïqÿÿ[ïÇëúE§ú¿×ÿÿ¯ÿì?·ôë{¯†’õõW¯m/ÿZÔhcãj½/¾Ñ›ô[’õØ{ÿÿõïioÿÿúûÿý×ÿþÃþ©¯«ê®?Ö¤xÝv½¿õ”/¥EŽFŠ-É"?»ü9u‡ÿ�ôð|?^×ÿõÿÿÿÿÿ÷_ÿïÿ¥^�ïŽ>¾"ÃÿÒÿèÇÇ]oö0×ÿÿ á¿÷¯ÿÛï Fÿßÿÿÿûh-ÿÿÿþ¿ú‡ÿÿÿ­¯ÿ°ö/ÿþÞß�o´¿ÿêÔ _ÿÿÿßÿ÷ !ÿÿíÿÞ¿]VÝÿÿÿ¿ÿƒx6Š¿ÿþ àß Ÿ ׿~ÚºI}ÿÿýúÿøhuþë÷ÿV¿ø/øot¿ÿÿÿΩÿü=‡ ÿÚ‡ÃÞ—ãÿ¯ÔRZÿ÷û«ï_ý‚_þ¿žOþÞ¿ôUÿÃ{iÿä§ûÿ {Òû{¥ÿûïëè/÷­‡¯ÿÿ÷_þÚê¾Ýÿö ýá/ûÄ/¿ÿ^ûï_µýí×ýÿn¼§_ªáí}ÿoý»÷V÷Kþød{ÿuþëÿÿKýÃóWúÿ¿{Õýÿ_ïýNÿï[Õ¯í™ÿ·M«kÿ°Ï&AýÝÙu· ==/÷*§ï¯ß~÷ÿÝ{nöÿÞ½Ni6tõÿlÑ~õ××þÈ?ûÛK§Â8áíö»`“eý6Ò‘GÚI¦šl2:ca…¶ãM°•¦œ4¿á?ïýöΟÿkÿ~ÞÞßûimëMŸ]]ú¶ v­¥i6_Òa‘ôá°öôàí´�}CiȱM4بpÓm Ùˆ6Š;UNà A´í0Ä#ZFvD b¿··íúíÿ\‚S·K~ß¶Ã<¬÷¶sNØm—ÛK‹oc´› „;b“M6Ò´¢¡¥i»§wmÃuˆ´óÜ4Ò>rŽÃÐE\‘†!Båtì]¢¤/ûrìÍ{}„û¶îûaÞéwìz ‘\ó­�¾)´�lŽ,2:I¦ _¨Uaš£­îôÞ=¤Òßi[C¶­¥¸¯~£�ݾ¨T�@�ð§344Í0ƒ=žÊ<ŒÛL&–Fw…m5 2]lŒ›DpϘVÝÕÛ, MË�+uî÷Ô_m+ßu¿¿ÿ­w~õ#…kÝé&Ôu»Û¬z®þ•!‡n¥Š�#û¥¥w… ª°ÒÖÑ´µô�]i+Iá6é6ú‹º¶éké=;ïû·ŽÝ$ߺ‘´ý~÷u_ûý$0á¯íïÿë[ ‡ëÕ]-&Õ×t´µÐNºO®­Sö—Nýûú^¯_[ÿߺ«[Iõò0/�ûV�ÿ·«ûïõµ×aÿì6ÝuÅuñðÂízÚÒÿ­¡]WßÒo­ý¾±ñÿøxíûëþ�þ¿Ãn¡ÿÿúí°÷ÿÿÃøa†ÿï¯ mèUW­Ýv½­ýHéÿÿýýø~é~¿¿ÿÿᇤuÿÿøl7ÿùšÁ¿ü87ëû­#é^øÖ?ø®?ô"+ú¿ÿ¾¿ÿøaÿÿæÿÿò‹ü6ø7ÿÿþÿÿ þß÷†ßl¾#Òÿëõúÿÿÿÿ×ÿöÿÿúÿÿð‚ÿíCwÿÿømíé÷‡ûí߇}‡ôÃýuÿ_Û_ÿÿÿýÿÿÿÿñÿÿôþý?õëvïÿMªûÿ½»¾ÿoöþÿïûu‚)ÿÿÿækÉÿá¿ïÿõþÿ_÷a¾ÿë½>æ½zõ¯yUööuY�é¾ßàßþK¯üˆß4ßl °A ÿÿÿþÒÿ÷úúÛ[oýÿ×ÿ'_õÚÛgN¯µúu_}{¶í½.·lÍ\ûü%ýéz_H-/ý÷]¾½Wÿý_ÿú¿¿×ü«÷¿ÿzm¿éºí&êîíO×M« †znêÒOlÁðÿ‡ûo_ý}~Úÿ·õý×ëëÿ©Íþ¯KzÛKöÍþ¿õ]pÏ_v’¶“î´�$ô›JjÇm¥ìˆ9G™r½¤ÚÝ!UÛíýý½W× º¯ý_û¯k¯ÿÿW{fŠ×m-ÿÛ ¯"­¥é2/ŠO\% ´™B˜JM¤œyÚM<0Èám‹á°ÓlŽ„z1 /ÿýßþÿëýÿí¯ÝmöÿþÝÚ^“kÒv“"ûI‘óMˆJšpZi§{PÒ„ÂTî ˆé6A ‘ÐPbÖH1AˆDU‡+‹†ùϽ³§ûmúýÿëÈc™û¡ßî‚mtíÒM¾°í†ž›ºL ™p´†Ò„Ú «V£C'Ú #œª˜2uA°�Œ¥ƒ`E¸Ÿúoo®ìúo¶Õ[톰à 6Ø`”1m=6êBïƒ ¤›Óví*ví64Š8A¼„DÜF"8þÒolÚ´•Y@kmݰ}黦Û�ÓNÃa& +•6ƒ(@âB "½Ã]So`ö6ÐV˜a;M4©†é¦§²±Q<�H0B2�Å~•ˆ†„E¾n#®1~ºø*úÒ¿IéÛ!LFÃ,…Š 1�þ@`­)‚y”â6ÖZÉl›Â…4—„S²2=ý»Ë \vN;ŠÔ{ýëåp<Ê’…R ®×»þL.v³(U¯Ôzüªû¿ôwìšôÿïûN[ˆJ«þ¥*4ަDd[»ï¹¦:é©�è�ä9H‘—d1’• ÌDBjq£¸4 šA(‚ ‡žÉ×ÿ;ýuR§©Ý$Dx0eY!B-•äü!a™£Ñà�Ð�`Á(�ñ„l'‚9ýµP� $èCDWa+Où[ýó!ŒíJDJŽsÙ" +Ø Ðc‘ÏY‘&l5‡AàŸóøA6š ˜#ƒ “múºMÓ a«¤Ã¤é;- +ÓŽDèöi†ÎÊÓ©œÚ„Ô]&IÊ}ÉŽNKž“ËE& ãi¦’mßKIÕ¸'Å'ÒKJéok­Ûi¿Iþ¾E"DˆJ +Ы,¼¸§E �ˆê>`ÐB¤V  Ï”�*~M<ÓgVØa+IÂN´�]–B°™ãKA7,›m +Pé¥uÝU¸Mïí¿¤é:Oº­î½zõ½tûªýsdfŽ©™02Fs)¶QœdùÈ�óLöiÎw„4×L$ÃNÓP–§ØF¶ï²ÑÏ•àÚºû¥{¨ºW¶¢­ºÿëâ¾é[íô•þº�mwMíÖ—äp¯ão¿Š\„f™ìëG²|öOwh�—ƒi6­«a+ +Þ“iêÛ- †ÏšM¤êé=Þÿ®Öö×Å1í1õPÓv¯½>«»Âÿ}öÕ_úé'ûÿ\}!ÿÛÛKçY´¬þêÚV—ƒm4Ë;ma®“¤ÚW­«¥é7º¶­¯¿tï¾þúû×z¯}…Þê÷Qü}Öþú«ÿ׿`Õúÿÿ_ÿé:¶®´­¤ôwéÒÒÒÕ¥½Sh0¿_´ºèRÿÿz¿Z¶»½áÃÐCÜ5ÿúÿÿ÷µÿ××í‡ÿëÿÿÿ×]GUûÒ÷úÔhuÿúm­öÚßßÿýõdžÃHXpÿvÿÿ®¿¿ë_ÿÿÐoûóFGùC#¿ÿô:wk×»êG ^¨zAÿýqõ¯ÿÿëÕ‡à ?öÿûÖ ÿí¢¢¿ÿÿá¿ÿ…ÿèÿßT’»¡_½/ñ.Z~?«û~¿ÿÿÿú°ÛÃa¿ðßÿý¥¢¯ÿúßÿÿþÿ ïð—×WúŇýßý/¯õÿýÿÿÿ÷ÿðÛá¿ÿðÚ„¿×Ûô¯þûn»}~õÿúÿWúÓ †—ý�úë¿ÿÿÿßÿÿÿ™¬7†Ãáÿÿ¼t¿ÿé�¯ßõ÷o÷Òöÿ__»ú¶ÃÿókýÿüêŸÿüþÿÿÿÿøKl=‡ßO¯ÿ µýëØtëÿ»þsúÿÖÿõë¦Ûý†Á¿ýµÿ"ßÞ¾ÿÿT¿ÿÿõï×õvëÿl/¯Úþ÷Zí÷uþé{}®ÙŸýö•¤ÙôÝüýiwÿ¯ëôúýÿÿýoÖ®a;gU�‹ï·Ñïuÿ¾õïz÷§«ûM†éM¯°îE;a„—¹Þ–“�{·ÿÃý×Þû×Ûýnµÿÿÿ^õ\ò¯ÿ«o^®¿öÙýß¶—Ó¶¶§i¶ +2í´“[I´jÇ ØlR 4á]„­Ä&G »»wôÿÚ[Ûÿ_×Ö«íÿëýÖÝÖ¶·MÝ6–c³êáZN’i¦› �°mí·"óm$Óé°‚`õdXLBm$íƒ +Ø"‡\6G4Ó†=¹VÑWa B„GB"6ï÷õÿþÛ½¾×m/Vë]¼óý½oÒVôˆ8>­&ÅiZLS!çJöÒMnì0vƒÝ¥  ÄCˆè42ªB Õ„kB AÓØöΞc¦ïºÛµnÛÛ÷ÝnéҰöÁ~žœÜv•²› +Á5ii2ØJÐPƒ +ÒdQ@޲=²}l@ÂG;¯b" å�ÅÛ¾½¶ïJ›Õ†y[ †Ã<˜fý†bN6G6‚NÐM¤Þ›º§o¦× “ PÕ+SˆaˆÂ`„DE!§°Û<­+«8˜}¥Á­²#vBœ„8¤Ø¤÷h6�\£„ ª�5*Øqsµ–"4[ä"¾ÈS�žÒmò¡ M5i†M0�„REp%_ÿ˜A±hŽ„0�¡›•/úù�/ÿi&ž’þÒM:�ᑎPáP½`û»2[1Ö ˜ÌŠŒ&� t">?òšSå¶c"ñ–¹s0ˆæGÁe¨Žñ T©Q|³F ˜TxýÍÓøydI�ödž%r®—ý&ư jDEb3Édº‡Ô~’ÛÌ»;&¥$v/¸…5F‰X~BÓwûÿãÿ§P¡~«ôŸ¿üíOSµLŠ~8êvBZïê5ëõïëªÿœ�dE#HÔ2ˆˆ�ˆ‚.„|B +;ï¤?â>K<©_éš‘S«È(#ùÌÑb”#‘¤bð�‚.ÙI aF¶¨ÖÂ7Ùï¿�™¨úþTY +AHìÐh„â)¡Ï‡âœþaɨ&\‰@…†ˆO=‡ AÂ6…3ð"í…mþœ&ÕÚ<4› ì°4ÚMÓre'Uä ÷_ïï<”†y² �f~l4gÒ Ÿ0góÜaÑùž!b¢’=„ÖLxI¶XáÒÞtm0•IÕüÑ„¡¦ØºM­:OV®×ÿýJ¯œü‰‘›Î‘B0yÌ‘"'APWŸYÐ Ò.z8íÚi„°Éò¶š¥rhL9:&é¦�V¡èRaâ)?Z߯¥xÿí;÷Ž“JÞ=?OÔ—f¨�2#0œˆõ6¡š-ÒPŽvkÌäÂdö~°«ÉO&yó[Å&Öñ ¥„Ý/v’u•ºM´¶ï­îûn¾º¦þ“Zºé7zŠðúç¼Ù®`dg›"n$EÙ¤\Ï¢:SZlÓ ‚G3\™BaÁ©É³õŸÜ'`Þ 6Ú¦y™µéÐdsÞ«umÒÕ¯KÚ]Þ—Ú_ßTÛë\t¾½'�§QC¿÷ÿ¾©¸}Hö2|ÁŸG³C>f‘¸¿ àôÉöì0Òa ›»MÂá=&g�[e§.�ZN®–Þ•ÁªÞ–½>îþ—þ;ûC]ë^+ëz¶ªG +ú·�ú-É!¯RëôX·×ƒ×ØO +ÃwIŠÏœ´3ío ¤Úá]-'Pé{«nëkãÓl=§KÇÒ÷Uë­×{¡Úǯ–9NZJ?_ëãÖ´Áÿÿ»ý¼ [Vêé7ºU»úWN­¥ÓIk» om+õëýõPßûõµ¶¿è?ãõúúZ·â=­ëþÚú·ÿÿ†ÿÃþß]úûôßí¥Öâ¯]­{kê× ûña»ýãÿ_ãÿÿ·t¿þ•õÿÿÿ_†ÿÿðoü[ŠOûÿê¿¶?Xî�úþ¢ÿß¾Ýÿø#ü§_ÿþD,?þÿõ¥ÿÿ¥þ¿ñLRûúöë÷_ÿ·:í~ß¶êÝÿ÷Kÿÿ ü$ÿ÷¯a,?ýÿþ—ì?ÛÿõûÞµïzßkû­WmlÓknͧ?ìúýººÌmž›­&Ì/ÿûh/þÿTÞ—ßÿë¿×‘Eÿúÿÿëÿûû¯·Úöû}ºÝß{ /aœ˜`·Wé°`©é¶mX¦)´¥þµ_ýúõÿ_ýëß_×nÿÿUÿöû_õÛë»¶ÏöÝ[ åNÃ7yy¸R.G{I±LBm,  0Å*vÚ +ÐPƒ6Škþÿ¥ÿß·Kïë·ö¿kœÿ¯ëþþý£>ý³ÿ¿öiáîöÞÁ‚L‹:I†)éŠMˆM„š‚p¡’ˆ`žÁ„LŽŠWFV0`ŠÊ 0̆ÿÝ×¥ÿúºÿj¿~õíÿWk¶}­-{ûtý;.•Xa&E¶ÃL*w¦1ê�Ób +A&Â=°ÐbˆÊd¿Ý[[ûöÛîöÏ«ÛI´Øg°í%álwzvª»mØN�†¶Ä(]\4UÚjP‰Ø8AŠ,ÃPßþë¹ÿ®Ã<´›JEw°øm¦È}vÚPjÈOozpEô‚ 5A²ï[ïô{‹¶Ðˆ0BEªÚz†Ò`ö¦ÁÚl…Õ ƒ¤ÂÁÃv�0ÂL&A4à UbŠÈˆˆ0„hÈtâ#aéÃl ­ûN“à +U´ PššàâB Ê7ÅhQí„|aˆ@ÂRhUC;ÝJ7ÇI^—iU±?òÌ�Ò˜ÌîqÚ”ïYm˜‰àªV˜R$×-"ñ;2#ä[Ó;+j_µ–„™^ ƒE¡wwßÿ*yÚ®Ÿëçc¢:)Y\Žó†tß÷%_UüÜS’"üÙ�%áÎF‘#7L²S0r`ð˜FÀîûÿþªT‘)�ò>FÍHì—Ñ"¯6)¼æ^ü `‹¶žƒGæIÉ„Â.ÞÁ²^œÎH6ª�nMA3‘ÛI¿™_�¥ýçD]5#Ò'‘èEöD‘t|!Í�Va’3Ðgð��¦ƒd°Szû�æÙh„|i6¨3†‚opë…A6ƒ<Ònž ´®V®¿æ¬‹FlŒY‚3D�Hí˜ÙB0aÜZ„l #`hœx£Fé'(NLp‚M¤Èú©<š)6ƒ8naüCh+ï[T¤ûê4·_o_õÿ;*jAÞH#©É��cyÑìÚ1æÆCFìŸlŒÌà� dü¤n(Ï{ “™?“ &©7'Bè›IÙhÓIXI3íÅ-Z2;KiRaÂÿ§[éÕ=õkÿVéÒÝHáiùÙDÆ ÉJkF¡My²$@ÃD& Œ?øðÎxÂ=¶+iì#; 0ô›Us3 ç Ášg �Ž #t#``‘í*I‡¤ß¤Ãdü&•ÚX¶“zV6ÛWXJûo½/ºßúOúþþ «¸Õî•ïéß#'ùnI'×öWÿÿHaÌæäÃÒAzL9ÐI´›W“´˜iXI´ÃI¶ZêÛí%ýn¯­í>–“ª{ÿÇŠ©.;·JG +õÿø÷ûíþþéÞ?ÿßßÓÿð¬RMË +KÕ¶�¤�[ÝÒt�+ÞŸoKôŸmRݿҽHá_ßûUÛÿM䟒§}yOé½V¯ý¥ÿÿÿÿ°ÿïûÿM%ºÚ¾•¿¥¥j:ZÚøÓ¥õúÛ]õO·ûõ�ô?ÿ->Z~�×·¤?ÿ_ÿíÿÿÿÿþÿÿÿ®©ë¥êÞÝ(«wý7‘ÂÃ}[ÇúûHwµõô‡ýïý-/×ô¿ýµÿÿÂ;º×ýÿÿüÿïÿ½qèkõ·¯]뮣ëÿÛ¿[ëëÿ¿ÒKþ¿ÿoÿ÷…�{ÿûõßÿëÿýþº×ÿú!Ï–8/ÿ½%v_ÓÿýwºÝ5ÿÿýºÿÿÿÿëÿÛK þé:_ýÿÿ‡Û_ýÿ->†½^úûaÿ¿ÿÿh§¯£¾¾ÿÿvÒÿþîþïõ¿û¡Òý×ú�þ¿ïÿÿ»¯ûßê¿Û¶¿°ÿü0ÿò^ÿÝ^ˆ=ÛÝÿzÍõÿïûûÿî‚×ûý†×ú·ûþßyÏÞ½Òÿnõÿÿ`Š�~ ÿø?þ—ÿÕ¨A}_ÿßúô/×û÷ýý_ý§×{×ÿý_öN¿oþ¶Òû_½³ÖÒûÿßðýÿ†þýûÓkÒ[kcÿúúëzÿßû¿þ÷ëö’î×ö“gÕöõØg-³i&ÚI¨m$Ùá6![AרÛÓÿ­¿õ¯ö±LkÅ7ï[ÿª¥õþÞß¶h›¿lÏ¿áÈ?íý×ëÕU& EÆ›šaÅ'»í´“¶ÐI°¯ahowöÕµ‡Ú¿{~þë¯ï½*µý¯ÿmé_ÝŸ[gÿl+ ÿ›KL5ÓÛ/¶q0îÛd\m “Mé4Ó‚/ ƒ˜K†ÌðÁJ¶ dƒ†!ñ B_õíôs÷ô›:Ý÷Tÿ½íÖÙŸ÷ß!ŽwMªjØ]ŠTئ*EÆìBNÓŠ ˆz~°Ø#޼EVHB¢3&æuoïÝZÛt¿½é½/uõ÷Kì‡}jé&à 'ªvÃm‘*¦ƒ§¦˜b�l$la4ŠÆ!¤U³>V@ލ«eœ`o}¶N›^ë{oêÛ¶ÖÏ«¥¶é²üŠá§¶“Ó›kNÛIC•;WjÃr¬Bhh‘Ol0‘XÄQKèQ üÏÙ´Ø$Ýí¥Óg“iZL‹©=´™Í$Âm„Tšm¥O[´�˜dŒT#¾1›ªo¶*EñL˜tšÙ +v‚b˜L*mQWlSNHöÑ\QÄ"ß·«l0�…†VÍA(0„D0b æåïÕòÌÖ«é=¤Ø×Ò ?¶!¯A±ÚC´¡‘G + !�ò1HY@”¶•"¹^dQ'ËX–5Ço-ßËH“4aUNÊõòÍS�ðø�&Ê"lìí# ûÿ�;'˜ìœ®¥ ¶ÿ™_U +FÆp�™Æmö‚Ûÿ×&ê‹®õL([ÒBõÎÆÑP�Lèe êehÈ1š³q|ägæNGS#Äf``�’i‰ówÝëñH©äo¿ü‚#°ôDéÆtd|—Í‘­‚ #ÇY—@FôU†ìÇ5™rzž‡†¡±Q@�F·#ú?LåL#; ¥kßݵ¡Ê⺪·çfqOìêŽE9æ†3Tiüâ7‘Ñ8‰óÛ1ÏøÜP‚¨{á�tí2y0‚M ¬$é6“hZ„E†“mImBI¦x�t�Îô_ßYj’¦Iäx—›"åçe¹�„DÚ`�¦0�‡9» Â=³90‚(Y)¤›MjÓL#Û–‚;i6² 4Ò  �&ÕÕÒa¢p‚Á6—½%¿cí6ºð†¿½ëæEy”“"\Ò:#lé¦k�0�a’0�ØG°ýU4›BÂ"»I´½”�¥´í%¨t¬*�¼·‹Ó­«¯Ž)>Óïîßýnï¿__í´©sf@Å#è!HäqdthØ3^i h„ó ødÃÓSÛŠ;“ ÔM¨F†é:á3Æ}¥„GÎ6•¤ø¶½:^úþ·ïÓjžÞ*é`NÖÜvºý*Û[ëßä¶O6y²!¢^/#lÑojO¢'PhØFƒGê7d\ˆ@›?Z„grwL$ÃT{jÕ·Wp©0Ó{_Ýÿi½µ¿ô¼}¾’ñRáßøÚvªÕ J׿Žß�ðÿÿæ¢#ä=D'PeîíOÉZaA.Þ–Lóæ“an†”0Ô$�&ÔXm +I=½S¥z[é>Þ—õº[¶íÆ—½m%í­mkÿè±ÈÄ[׬aÃÛÿû­ºƒÿõèØ£»e¢fÒ¼‡K}B½ºMÂot�½-}ÿº×¿÷í÷¯ßÇßtXä_þ>»}¤?ÿ�û­0Økÿ«j«¤ÿõéÓûÕº ¤ÚWévÿÓ­µªêéc »w«{î¾×êõãÿÿþ?ëþš¯ÿÿÿû ‡ÿátwtÃü7ÿàŒþ•îûk}í׎ïi?ôÞê +¤p­Ò¢Ç¾õ¿]7�½_ßÿ®ÿÿÿ·(}ÿÿÿàØ7ÿà�v÷P‚ÛPoÿÂõnŸ¯]×J�.ÿý¡åqÎ@cXÿ«ÿþ¿ÿ¯ÿþÿø/úM¨"£ÿÿÿý‡ÿézWH/§ÿô¿[ÿ¤;u�ÿ×þÿ¤".µ¿÷þ¿ÿþãÿò�ÿÿôUÿ× ‚ÿÿÿïvÞ¿uÛ¨k°ßÿ×ÿÿÿ·zïkÿÿ[ÿÿÿÿÿ„Ÿÿ ÿøKýºu ÷ÿÿÚÿ¥ÆëÿÿªõoÿýuþÑÇ¥ÿÿÿÿÿù#}ôÿ¥ë¯õ¥ÿi{ÿýõÝ]îÿë푟ÿÿÿÿÿÌçýÒoÿÿ»¿ÿÿ½ý/î¾’ßý/þïõöö«ûÿ÷ÒÝ[léæ:ºÿ×}Zëÿì#Žÿÿÿú þÿÿÿðnÿ÷¯û­ÿUÿýzéßý{ö•vÿþÉÕýÓmŸÖ´�.ï°F>¤W´´ÓÓÛOÿÿþ—ûÿ¯îDv÷¯Úÿëëÿëë¥mþ·¾ýßgÿïØ`–•ºMœ› +Ú¶­¤š¦œBv¸[MéÞŸ{õÿþÝ%÷Ó_ï_wO_×¾Ýký××ÿ÷}jÃ=ß§`¶ÃéäAÚaƒ zpv¬U„‚a´˜¦!0a(`�1 +Óí¦„Z (d´“¢ +„FÚÿ÷Ö«ï¿ÿkí¶“{zûk÷ºÿ{¥ùúÁ5ÓÓa·a+A1L~É[M‘^ôÁ=± 4Õ ¶RƒÛ `�‚ B(4d+ˆˆúÿßW­{]ÿÞ¿³é+a¶}uÛ×¾Ý7 ‡"e´“T­’¶º§tú H4(ÃëG† æjFYêªÿÿwM­ûyþ«¿mua¶©Ûg“ -¤È¹mšz °‚†îÂM´®ë¯ +°«>°Â.t\ɰ•ÛKïÛÒê/níû`í6ÐIÛ"Q1AS IŠÂ +¶m´|ˆ½4(åW„"#Ž:í%NjÈU &ÐRyMƒ^�Z[m%L6EF ƒ +‹˜0Žˆ!Ì€§êI4ÛNÚ•ebU„î�l8æ_™1Kü,1G^U°aJd"Ú +¿ K(³a¤—ßÛ ~ESG·Å˜ŽË!¢Gì&"2ÊWÇþXKŒŒ8R_YkäßL‰Æ-:‚!d¤}‹²ÖÅ>òÍ2‚5ÎÍeÃm?ɺVFGoÁ54i=ÞEs36fæ|dù6Ö<›gqP§`ë^ž¨R ï ¦ÛÊ—òvN21ªÿ{ë´d�×¥í6Ó·ÿÂÛþõ»FB¾åSÕ'}¿½2TÉs#lŒ³l˜8¥8¤1I”2;ûÛ»¾#�ꪸþ-çÑV*"TXåÐÐF€ÉÛî<=(Â5†�”{aÃØÿ_þ«© ÈžS‘4BR³ÁrJïß'2æ|ª ´¤Èø4ÂA´Epð�l*M¤éiIÒoøÿå¸K*Fˆ”"ƒ"§"\œB¨„Nx"�Éx")Àe¦äæ\é“ݾúM²Æ-]Z +Ò\wª ÔUÒÒuÿÿçeQY�H�£†Tfãò00F¶KØÑí®�Á„kyéQݤÉkÎÒ ¦3ŽLgLû +ËOÿ¿uKQ§§^žŸWÒÒ®šü‡®r*R‘b+Tg‘SÚh2�S#þO*iCe¡0Òv]!&ÒÙg¦!Ö”CjÚP­­ÿéõßÿýwöûu­F†+ùÜdË4&Dˆ�¢9f!£q™¼^GQ 3�Dòeüˆ�µƒLñ¥j … ž4¯P™ãI½&×m'ýºh;¥~ÿÓoùïÿûë¿Çßú†>¨´þlÉAš™›R"02B6Ïì2]šg#5ažgÒ8A#Þ¡&ú]‘ó•¤é6™ö•ª%Ô›WJðß¶·«¿~é~“×ík{~í¿ë­¥ßðñØÿÖ¬5ªý Ê3ÑF4” ^M4›!í¤ÚºN¨‹m-^ϰ“oét-¥iu~·Ói>ßï´Ú®ôèzW_ö>ÿþ­ÿÿÿù_ûð}k¿û Wóƒè«jÃW ¤á3Æ¥a„´¯|V +Õ¬v÷ßIöýun›_¶µ#¥íÝãÿKñýÿöë¿ÿþ·ÆþÞ­¶¿ÿí¢‡ÿü[I´½Òé½Òtš]1OÞ¾´¯õ÷R9­k¿«ú¿øïú/ŽŽü¹Õ×÷_þ¿ýÿëýèðÞA²;Þ³®ÿþ ‚Oߎ›ßñ]ÛqíEW·k^ÿoúûñ^›ô‡ú¿Hwöñÿÿ_ÿýµ8?ÿÿÿ¼ü7 Xm´ÿý´÷[­ëß^¹Sÿø~¿ÿºCÿÿ¿ÿÿÿÿáÿæŸþð¿ÿÿïÿÿÃzXyt¿þÄ·ï÷XõÿÓj�°Ø?þ×úÿÿÿÿÿÿÿÿá/ü Ÿý´‡ÿÿÿÿë÷×tdô½{Ýþíþê믿þÃoöé‡ÿÿÿÿÿ_ÿÿÿÿè/õKÿ¡êÿ]ÿ÷ý}}/úë³§ª»wÿÿÿÿm‡û¨aÿÿÿÿÿÿýÿÕÿû¨Kÿ_ý-zÿÿÿïüçþsïU×öô¾ÛlÏÿïÿølþáÿ¿ÿßÿß}×ÿÿÿ}ÿíÖ¿ëÓ¯÷¯ýûÑšÛ]+שýß ½³éº°Ž;ažÛ8Û _ÿÿÿðØÛßßýÿý×ÿÿ¾¾¯ÿïJ¾ê¿ýêÝßþëÙ:ÓûºËÒ+‡i0í†Ý…Mv;JÆØ¦)ˆIÿϯÿïì;ÿOÿûý=úû}n¿}}_û}¯ýÖ¿ò¯V—{˜ó +Óö½6Õ-Y[IˆP»K Óät‚[ †˜¦œA‚ $V?¾¿~¿Vîÿ¥û×÷ëo½ëuíéz¶gÿ¶gœ›t¢jéHƒ†Ù}4öôm%M8¦?M;tÓ �{M24&ƒAŠ”vŠö#HB •~­Wßëu{:¬Çþ¤Ç_k®ÿM·¶¾ÝÞé{z] › .©°Ápa´%tÓ ¤Á;v›yt  ¹QF!5 l¡J©6") ªoŽ#Õë^ý{«oÿù'öêï´í&î¾ÚIìˆ9BIÚLRi¦›µ*F¹>ÅSL"iŠ=<a$—IÇÝZ÷¿ÖÚ·g•×W{ õº÷I°E=6[I�â°ƒašl…ÓMºM7n„0ˆ¶ ÂrÜ[|E´/ôž­öin“ òc´¤ª›m¤šm¥¦Á˜‘Ý ˜Aé°ŠrµìmÐЈºO¶‘I¥×´›A[i°w¤›pƒ"!ZM ®ûa “Á•š" hD1E½oÖ°Ã &•¥åEÚ_n¤ +VP0ŽôE 970úºÛJis#V""*ãë® ­‰&E/¯ôÚXˆ7­j,v¥� ú^ Š {iZb=´±á‘HLcÿ)�rSKaj2‚©OòW“Fº§-èʸ·JŽÞÓýÞYV°‘•W•?_øP‚óïNýªüì•NéÌ›-¿k÷¦±Ö/¨»ôW[ÄÓ52ž4ˆÔFÆk�2@ÍP!!r~õ�ÑfW¥™Du‘W” †Š‘)FmŽ2;DJ'Â2"F`Ñð0‹°Â6òù£óM:»Žºê™‘|”,Û5F02_"ˆØÁ,ß>ÌØ@°��¥3ƒ>z‚g¡¦g`‚d“šm0“ ´› >ˆí¤í0’Ùˆ +Óý_HXl?Øûí¥ÿÿ×ÿÿÿ‚ ÿü?ûk×ÿ¶¡ÂÿÿÿýØoßÿ¶·»ºöÿÿý‡Ó¯÷ývöÿøÿÿ¶—ÿÿýéÿ‡ûúm-Úþÿ¾Ûÿ}÷ÿ_­³§F×uô×ïÿoÿÿûa¿Ãÿæÿû¥ÿÿÿè/Ýé‡ßà—ÿï¿þjüÓîÿëuoÖéþÜ¡õÿþÃl ÿÿÿƒ†ÿÿý±û¿ûïþ¿½¿ÿÝwéÿ_Ûï¾Ûÿziëoý-¸M°ÏmÖ“i/I´¾¿ð ÷ÿÿØl=ûÿß{ÿ ¿ÿ×÷ÿÞ¿9ÿtþ•þÃ1/·öÞÙþÿ»K´›/°ÍÉéÚI¶�d-ZV“aƒ¶¿ÿþqÿÿ­»¿[ÿë¾ïÿ¯ïÿ_ßkö¿­{®×MŸÕy WUlå²,XئDšiÚ½¥Å*iØI6ÂM0™!ÑÒû�ÿöðßÿ×o{wußÿ¯îïÿ¿¿ô›[lÿá[·IuoÓm\0“v›iݱ[[#‹4obLS0GMŒ�B#ŒC„C!°áýÿï¿õõyÕeþë)úÿÒßm³DÞ¾È=]Xg¿ï»ËÌRr8 6ÐVƒM´“Mºz• J¹ ƒh«`Âõ"2üìïÿûeBÜ�{ëºM¶iÝ7N½¥ÿþ›g&$Ú~›llPNÓ ƒØ„M„Ó[ SFz+#¬¸r±†I,žìè•Öÿÿ·×umþõ·°Øa--&ëM>ÐIÕ±LS¦Ÿ~¬-Wª‹uhDDRzïÿ·÷i>•Ùäž� •´!æ!]CÛA á¤�ªzJáC0ƒ”èE‰Ú¤""ºútÙSƒTÃ"ŽUM*´˜a��Nð”6ÂL Ó YR $|²9ž… +!DDwúûÒm&­Zm¶4ØGD"‘V„DDGk,Bý¤—*ˆ4dj„Dqý I8Žù]l:Ât¿ºÃ"®–‡úá%,‹hix$ÃU\n¶�‚b:E&�ˆÿ 0©Êd/;UžS"x)‚™%|¶EÙ£UTëi,fO­fBr¯¾ë-˜U ’Nïõ&õä­…ÿÚÎÊ�ÆFõ™A’˜*’¸�Û¾íyÙBý?ùßH¡Ú�¨Ö¯ý¡ÓýrJ“5$ȬIÉ‘øP“Ònþþ?ù,ÈË9ƒ"2@Ñ ˆá�ÅEâ$Á¢%—2s=—Y°Ôî“_õYØVL—Ýy"C)Ì"Ìs†w1ùÌÞyš“HÄ �‚7‰q.5¿4l #gØöÝ'¦äÉøíy�éùÙxªã)â%ò@§LئÑâ¬$gˆù£aæh{ÉøMû«„›ÑXÂ¥tÒ ¶YÚ+)6“rιgº´“mu"k]5&qNóµ´¥â5Ädo$a#YœA“öi‚¦|l– £×¤Ý4‚mm²Ïu¿i„–“ØájÝ„­ø¶•âþÿŠ·ýoÓÎE*/¢tˆ“=’™C”ƒLˆ6W‡°É¨K 3ùþ~I’ê*Ú Î3æ“¥­¤í4ÒúM½%p_éªéVÛ®Ú¤¾ÿé{ö·ý:2Ddk,‰…:2C& „Í‘#7È�F{&Ÿ“ú„Æè$Ú"ÃK i_ªÒbáa[®­%j;ÿ¤®’®ßÿíõj5êG êG ú‘Âß_÷_ÕsdVQ²!3djGH2| a!¦uœòxüf’ØI’0Z2­¤ÝÝåœ3‡»0žÐ&Õ÷[Qé¯÷zëU¶ÛKüº |m�ý VïÈÏ©3ü�Àñÿ‡¿%D¤¢DD„Ni’è&™D𠆵öÐN–ƒÕ°¨Æ©Ÿ}=‹­¥{¼&ßûkKK^õ¶�úÒ׎ÿD9ô‹ƒŽsÿÿmuý!mf1ô…ƒ×öß5g³:Ê<�L6 +LôV0­©âTÃI´� +uÒzzêké?ßjßîßê»úù,7ÿwñýXmõü±�qÿþ—ÿëÿoÿ ?é6™ö®“tÖ-¥xma6ºôÚZø«ï½6¿Zªÿ»ÿ”/^ºÿÿ¿°û_ëëÿ_Òÿö×ÿ <èÈ÷á¿ë}¥í¿ÿ»»éÖÖ¯[U¿»ÿî�Ó÷úCõúÃúÿõºØm½wí¥ÿàŒ?ÛÉyý¯ü>�‡ëª{®—û©V¯«Cë_÷ÿÿÿýÿÿÿomýÝpÞ¨kÿÿþ/ôªýÿ[þÃxKý·ý«]{^#»ï-Kë×ÿÿ×ÿÿÿïÿàÞð¿ü¡w m®ô¯ÿKöÄ%ÿÛÿ¾—ûÚôÿ¯þ—ÿ¯ÿëÿí¯ÿÿÿÿÿ†öÒÿð–ã·Ó¥þÃÿô¿ºï]ûý·ÿó›½ׯÿþßÿÿ{ÿÞ¿ÿÿÿûï°ýÿ¥öì8¯ï¿ý?õßûiÿÊŽ½}zµÿþÿþÿÿýùÕþÚ ÿÿëÿÿ÷Ð_þ¸Iß÷ïÿ}[ý¾É×íš-+»»ÛIêÿÿÿÿþKÿþÿÇûºÿÿ¿ûÛôÿÿ^Οÿ·ßÿ¯÷Ù¢ý³ÖØ$ÙV%|‰dQ܉ÂíCi'ÿïÿÿü%ÿþ«ÿð¿õÿ_Ûö÷Û:þ«!èÍtíwmŸöÏW¶_o‘\;N­¶ »MSbLTR¦Å6aBvŽí„¥ÿýï_[_Ûïÿÿ¶߯Õ÷ýíÝŸúä1üÎÖûö † iVŸ±M1JœSÁiÛí†*îÚÁ5h¬a„¦„DD1Aƒÿ_{õõëþþ¿ÿÿ»Ó}éiíûvyÃl%i&ÚiéÚi± ¶ '«L&ÂÂ]„ðš "FP¨©#R&Ä÷ï·ýw¯«kûkÿÿ ãOXg«Jï´˜{ Ž™í6Ã"½Šl “tîÖþ¹S†VQ:$#%”#oïuïÛºúlýw÷mÝÝú¦žÃƒNØ„IƒØ=(oa„»tÐa0AŽVMfhŠsºÐqKû}Ò÷Ùõ¤ºV†Ú{"=mµ[ôí«ÃEªj„4Ân8�+öí>¦ +4ÒNÂAˆM:i†JÐj�m5w*Ê.RsÒdWо–¶Bý6 4ujÂÐ.!aÄo­$�pÑ#â3'„e·/~ÿHˆˆúþ�·_úÛI°A K 40Ä~ÚIˆ�Ùåï1a1„kcþ@eò™#+ŠK-³‚äc宑¿ÿåš•¨_ÿ–pHíRDmÆŒµÿÎárÊ4ÈIT#ßßó"Uü®9�(P×Õ¯ò]zx^) +j×½ùDµkë§œ�e23îµõ]|¤Š²"Hã:#†j"1¢„a–9ÞFѱÈ�"íÈd{I§ëõôÓ;h�‘ŒÕh‰Óc#"FbËŠH�œ¹ì3ffÓ4 #à2y<#`aˆ‚iò;h&íCÇuÉ„JÊ幩�á�K!“�HìÏ.ÔŽÌFÑö{6G[#áX3M]éŸ6 $ÞŽí&ÒA› ˆ°Òm –„ÚXTÏ6dt¯¶¾W/ú¯©Y�#µ!�ˆÛ3›x¾q™²ŒÓ0`�‡A¾¹„hq„¸ØéPa'DvÐ\´LÛ‡§Ä6•«‡tx Ú¶‰Ú¤®¾›ûîíä'ëéšµ!ÄtGó‘ djYʲüødÃ0�m4Òa AŠð’ªL4´�'“:m–uIŸ4­-mwÛ}Go¼}ÛwIÜ}WwúÐÿ­æF¹/’ÃTÌ%!´Bq !&…‡ eì§”ö?Y¥É�¦“iƒfm+CA6“»ª »JÒÒÒ¶’÷÷_ßKÿïmÿ½µ¿R8Uýýä)�UͲžÎ‘©ŸÌdFSæ¦`a$l3ä|Í4ÔˆÏHg_?·ÓÉŽ‚MàÚM…ÖÒtºMÕ†­¶–+KiÓ^—õÿõM©-{ÿ¿ÞýþÿOß%Eÿú,WȶuÉNOœÉ„ˆ•:e3U3˜fra&GÆæ“¡fm&pÚ"Ãua²Æ-vYöãMí­î•ý;¤ÒOýaÅU~Þ…Há}-/kÛWø!ýþ¢À�ÿÿ~�ÿÿýM3ÙG õ ñ™³þ“fº™rÏG¶­éh29¤Ò +ÖÑ? µmôNoI·WIé-Ö÷[ÇÒ×Ü{wt¾?ýä<×ããým¤?×ÿ°÷Ûý÷]ÿÿÿô“ $Ú[êëi[ø¶•û¤ÒÒÚ_é?ÿú_õé7·«ªÖ¿«þ;¢ë_ú.¾¿ûkúÿÿì?ØÿÿÿÿûIz}÷Å+ÛÿKhw^·iû÷}&ÿkÇ_ú„z÷«ÿõÿÿÿ_¯ÿÿü7ø7ÿÿÿÿÿÒ[ZKUIÿu6/[פÿÿéb¿«í®«ÿÿ¯ÿÿþã÷õü�Ïÿÿƒþÿÿîÿÿ¿z¤5ýæïÿ–ž?òÄ¿÷ÿ«ÿÿÿÿÿÿ‚0ÿÿÿü^tßoý/ïÿÛý¿ÿn—ÿÿþHqþ+ÿ¤:÷¥þ¿ÿÿ¯ÿÿ¿ÿþ/ÿÿÿAxA~?i_ÿþÿoúë«ïÿþÞ›Õ~TÿÿúëÿÿÿûçKÿÿÿÿô¿ÿû¿×ÕvO_ÿþú»ÿ]=}·ÿûûÿØÿÿ·[ÿÿÿþg¾‚ßÿò1wýÿ¯Ûûûz^¿ëkûþsú²O«õu¿Û4Wÿ ÿßÿ ÿÿäé÷K KÿÿÿïKÒÿûì/ÿ×é{ÿýßÿ×Më÷ßÞÝi6gëÞ–‚t•²û`“a}6EƘb½ûø7ßÿé{#£ ½¯¶½{ýþëÿöß¶Þ߯®ö•Ÿíý¿1ëiéZL0I´™;´¤IÅ2#ÓM8V¬.þF/Þÿþð¾Êk¿Úÿ÷÷ªéZ·Þ¯ý×ö»fjÿöÏí÷Ø#²üŠá·é0ÂVÞ›ÛÃJÒb4V•‘ÐAYKh0ƒ å]ܬdMþð¿‡}ßüKýÿÿ­ÿ¿Ýz}¿»÷_äQÃM°­« Çv› $ÈAáŽ!6ÅBáÖ‚ W¦›#‹Pöš ‘1@ÅÂ#”(¡r¸o¯zÿm×ýêºßÿuí¯ö¶ÝZPÏ[vÃoM[Ai§ Ób¬1Ó¶!0¶Jí;  Óñ@Á´Wcˆúmµüçî¿íÿÈ$ݪû¤ßíºI·vÃl¿"»²>ÚZLR²(å{pÈâšmÒv­4Šæ ¸;tÄäO3u¿ýþ×ÛºVþû½ƒažVÓVÒ†G¯N ´Á÷¶)†Añ †ëh·„Dkúi0áÝÝÝ0Ý+‘r›!õvÚm²Gié¶“©4ÚlC¤Ãpši§ ! T"o]ÿ´™B ç¶Û¶“!’m&¡„›ºs¼0š øŠ0„edCYU%þAŧj› BÂ$)[A–ae^²l>ø%ªukTÐwÕ=1A1•�¥>1 PC 1�ÿ– U ,Á�“r¨íCÞd û L­µ÷”Œ©Ëæwÿ»ú•Ô":þï¿™��ŽDK#Å;:  SA‚f·¿µça¯ólèd1’D +mF™áQdÇ.…Y‘ˆ eƒƒ ¬¹›GÆñ„ndòü|.ž{*‘3È­Â4ùØÂ>\$�•@ƒi¨F†…¡ ›I´›IÒt›W�ÿï=�\§Ö!hØÐ<2Fs"$ ¢.G³ÑašgÑžòVN“i6¯T“l´&Ó)*Ûÿªí㺊­î<4XäiÃûùUõÕ!a°å¢Ú·‹jÃJÒtµöÒ}ÕF›×o]-mÿÕ|^ýwé÷}Öë°ñ†Ý0zCÿôþÃoûúûi?á¥ÒÞݾ½%úmß§µ†ºB�¿úCýkP÷áÓVÿýÿðØaÿ÷×~ëq^¿]w½ñßà—ÿý0ëÿÿßߨgøo ôÃýÿÿÃaÿþ‡¶®?Xû×_þúÕÿý‡õÿÿÿáµóö°Ûx?ÿa°ßÿå¹!¯ÿÿý‡¾ºKÿÿì5ÿÿÿÿÇÒÁ¼>�oõõõ½ÞëÿCþºëëþÃý[ÿÿÃÿÿýý»éo» ÷ÿ­éÝÝÿÿºÿà¿ÿ†ÿÿÿþ÷ÿÿúÞë{}ûßþû³ªÌ.×ÿÿ™²;ý?ÿƒš{Ýÿÿïýë½=úKž[ù§ïþ–é;wWOYŸþÿÐ/ð‚ÿïßõá¿ëÿÛ¿þÿÚÛš—úõd'Muvhµívé†ÙÿKI´–ÿþøKïKöÿß]/ïzÿÛïvÿûëzn×Ò»´›>¿m,ÆÃ +½è$ÛI�ó}í¤ƒÿúÝW¾¿ÿï×ïoßÿå_·Û~gß·¥Ú¶ÝÒiCnÕŽOi0lB´Ó´­Ô4&Èè ›# ‚ Bžõþúu_ý~öüçëªíÞé}û}7¶z³Úéö›zI†á2d/´¥YV©ÛI„ØA$ÅPa"­Ê¹GEÌÕqÊgŸíëu®ßþÚÚí×]ÞÙé½µUÌz°Î+I†q[ÅZ{š°dA&H0ƒ ±„"1Ç û&„DßN·ö¶Þ­íý¥i'm´Å1¶‚»`Ði²;¦Bsa]ÚGŒú¼›�¾Û9i6”6íŽv›ìŠðƒÒ°’nîÂdqlC„ÚGy!3³\DEÄDG¯«m¸L2W¬.ôWaŒB„A”ª,®Zµív"¬bA¡Ÿ`Œ•±úäØÕ¥¯É"K¾«ÐOâ®v¥pI#òn Pt2mpÇÿË4N–RØì‰e¹\«ÎÆã¸ˆÆvkþUiÝú¾þdë»ïeuE’¯&0¿ÿ;W®ºå"É�‘šÑÌ¿ú¯é•¶K舞ª`�dø@ÌÆÇÿÔ™Å9¢'M‘ TDlšf$ Ñd@Ê *„Xh&Ð3fÓ_È]ÑÃ5dzä_3G4BLÔ9��ȸ ¬32>Ïç•è4{xAa+e� +éŸjÜ¡Ë.µm]ïS°‹6dºÔ—G2F�çxðƒ4î8 —¤,4,#ÃI‡ZPäÎ ãIå—ZOŠ]¶­‹¤êÚ_üè�渣0gDže33>y§„¡¦áí5h¬¤ì&‚PÙh ´Kt›v•¶¡6»î–õÖ•þ¯ôýo4ÛMUó6“núNmE½êÛ_éõnšt�é/ô½/ÿß}z¶·ÛZºM¨|oJ÷×ÛßÞµÛ¥OK~û¿^ž½v¼wÖú×úâ·ÕÓ«~륿¶;ת·O«é,ãþ?ýî¾Úôž†ÿÿ¯oñÛä8ŠÿÕ·ãÿÖºþúþ¿Öû{ôŸÿ_öÿÒ–c¿ÿ�~¿ÿÿÿ‡ÿÃ_‡ýþ½þ¿_ÿïÿþûþ¿ù¯ý´°{ì?ÿÿÿÛ¯ÿþÌ/÷ü�y ÿú_ã þßÿÿÿ¶ay:}ÿÿ¿Ì×Þ!ð¿ß·º¯ì8oðßÿÿÿãá-êÿÿÛõÿ_K÷¯îµþü7ÿÿßûú\Zÿuwúýúÿö½ï¯õÃý×ÿ¯ðýw½ë÷Wÿ×}_zÛ[Kýîë¿ÿíï_ÿ®÷kýÖÝÿÝÿwgïµ¶íÒ¶ß{¯÷_þ×÷õê÷¯Ývûí½»¶mÚi‡AA²+Û«ÓN¤�uÈ�û§]½ëúû·aÙy´­vÒi†cd[§m°l‹݇¾¶ÚM4ÂlZi”UÿW_]ºWk{ijŸ¦Ãn™ +0Bm$ÓM´ÅBµú 0©Ý¡r Â2GOt“M$Õ´˜ÓbÛI4íÓN�ÚiˆK*Ù>¡’ª¨m ÚI†ém´¤±a’°˜…*Û*Êž‘Xɾ‹‡ ”Ê’•!ˆˆ�K:RŠRßEÁFº�,,çoŸGéL £´fb�‚ŠIAã–ždgÊ3df Ú 0RÖQ�Œ�B¦ –äc88@ ÉP7a0¥¨³žìäÄA6ša¦¡3ÿ ��}x‡†J�¤ßþ•J› _ —· Ú^Qm:^»¥¦è™Ûi5K^’Kö’¥öõÛQ­«ê©R~¿þ•â�ú¯]ùº'ddCÌùg[ŽÖbIúIn—ؤ¿’D SVˆN™˜ ÒTD ã„Gi§,£¢²ÂªiÙÑy"öTfF CÚ!¬#qUÚ;¸ÔØü#ã jœ²Ätf‚©ÿò.ˆBÈ,D"~ñá͘ÉÌø„vxѰá—á½V#&„¡¤ØAÁ“BFzWé:N¡u%ÙYewÌ€«6{îõ¤~>Ê ¢s'd0‘¥£@~š¬¡ðD}B +£?ÕQá„Uè&ÐZ½h&Òt’Ü%„w¤÷Ó´¾þ)j¨ ØEô.�l0œ ›3f†¡áx†„B8ô›E=úT“¥þ¸[ÚÒKKôÅ-*ªš×õ^ãúJ¨ Ú î°‚Òúî’Ð^–m-/ªÒÂT’ZM¥¨úZ¯úŽ£QèȱVä·ÿÂ;ÑO XJ’Õ'¤´´´ºÒI$©--/×Ai/ézÚZZZIZ^•s%T*8¯’Å’’ºI,%¥i*](þ¿Ž–?_­$•ÚI.–º­¥W¤:¯Ú¤…r¨»O\äM#æ³RQ³TG3Ù\Zº>ù¸Ç?5 WŠºX®—ª^•*ê*•Ž—ªXKÒ¤ªµI¿#Ý$»t•uÔì‰yHï#4Bt dº=¨°ÌäG¥fmÜ—¬$ÚQJ“zU*ÒJ’ÖµUô©*¥Ö¿¨¥KýV’ÒˆI* +’µ USÎÊ¢XŽ˜L�d4p‰Ü¬2F25Ç”l91ü¨“Ë„›D[jé:‹´Ö“jÒ¯£[]t©j’¥T¿ë±KUAi*ëêMéxA{à‚òhÜBdÀÈ©’höH�2{' ÷rÍC`i„Ât˜hŽY0ª¶ã‹aUêà´µöÿî½&‘XT´´¿ê—V’꿚Ó¢ž—éUUyroø…íÄÑ&] ïÓ'ÏæoV†°ÓP•²ÑH6ƒ8jé6�:Mi[ïâ½?Öûii6»¨É¨KKé*ë„ý%Z¥Ö¯Õ%ëõ ›Z¨%Û“ÉÓ¡Éž}­®¬4Ã¥¨}õJÒuŸoý¿ßR8WÒë¯ÿÿ×é%úJ°A*I~¿¥éi*ÿ¥®-Ò¬±´“uWÝ‹[i^é=7ÞÂKý¶žû}ýø|ŒÿÇÝÇWþ«­zT½$Bj½%ê«ÇJÒ­uÿ¦ú¯ß_Þ?¯�nÚ«C^ë¿jõßÓ¼:]~Î/Û­WÖ‚«Zü�Êý/ª\TWUT’Z_úõÿ÷÷Õ¥w}qþŸáÕÿÿ°×ÿü×ô½e°GÕ%KI}/Z]$–f³~qiuºGIe SÛÙ:¯ÿøõ}¤:ÿ~ÃÿýöþþÙ…ûuÿU¥Ò_¯×¤—ZÖoký*­--lÓ7>½6®•úKÿý/÷ÿ×öïÿÿƒÿøþáéV´º¥›üߥéVmfüÚͧ¥¤¶©-U$’I'®®°‚¥Òººl%_ÿÿÿÁü7ÿ×ÿáÿò.¿o~‡o[­*6©$’ÊU¥“¯6–—I%T´©R­kKKKKA6¾57Bl$áo°—ÿÿÿü#ßÿÁ¿ÿÿý»ÿ^ûíRÿÒÒUÒÒm,$’Mªá*T•---/ UQÍ(¨8;A6•„›JXIŠm&ÐLUÿÿÿKÿ÷ÿýºûÝý½zÿ¤ûªt­------a*C⢠ᶒÅiT*ÈùFÂLS «ˆLb"†_ûÿ¿«Òýº÷ºÿõÿïÿ_}Öö×ÒŠŠŠB› E&m. (Pª›AT*ªˆL.¢!1LU A h§b?ÿïë_Uý}Ý÷¯ó�7í÷wûu!�¶}&“h&¡B¦*�„Ä.ºª¦Á*ÄFDÞÃÿßué½zó˺þû[ÿ«=wyç·­&ÚM«@öÐPª ª_�€ÂI¡i„"(ˆ�ÿþû¯þ×î�m|žÞ²úëxb“V7·M7ÛJì4�ÌC,#*؈�¿ý½×JîÂ(vÞô·¤Ü/Ù8a„©¦Á„ Ã%{iÆV„!°Š$tI²Ó«êÝ· +Òd?ì[ƒVÐI…†“ $L& a5+efVˆÉMŽõNí‘öÙr¦ÛKA0­Ý¨m¥vÅ1 Î{(ÙVºÓzM…ØnTDh»%Ñd TµÑR,ˆ�õ²¡+h"l¨’â X§_ ˆlJÒô Q¶4æI\|µ…Ôµ‘äqF3´a�ábÝŠˆHŽÂ¦ &îõ[JŠ[®î’ãË4;Õ-e”A“8¥²´Ô—¯­.WŒ®;4ƒ…Ìï_I-fI Švî�H§¾»üRDƒ.ÉãC3J¡+QÝßk¬ C + ë;´šëß"kt�&• ËÕiò´¿ÓzH$è§ ½.êvR‰uŽ’ÿ©Íl†Ž_H---BQÍ~«úz’·�|ÀÑ åYƒ« Bê’IRKH.ºiäÂ;y ©‘Ùš6ˆÆ¹²%VhŒãqùšpÎ÷Oiª3°­¢8~’ã¥Z_R³GA¢ dN›"…>lˆÁ#[ѭƘæwá²|þ–�:Ÿ=.š—á«,óæ-¥ MÚ¤–µ¬)XËçpj)ôD™ðÈ<ãÀ`ƒG‡øL"ñ¦ƒ'ƒÒL>žLá6‡VVÒ«¦Þ®õN¾ÿí÷I%T”Ô�³Ds 6]ffN�"äø?Á™ì=&ÓTEv� $Ü�dÎç¶‚ml‚‡„•é Kh”'ô­'ñiô¶ý·ýÒÝõUX_ +š`•„…OI´¶Z,6YÓj蟆þÓX½pƒ~’^ž“t=>¾þßú_ïãÓz)éV–½ &ÕÝÕZJ×ÒmÖ÷ûKþÕ6ŸoÈá÷ýUw†þ?í¿ÿî½*ZT•…õÿM.“¾ú¾.×_Ö…ví¤¿VßükáíêØÿþ¿¥­ö…SKýÅL úWÕµî?ï!Æ_aã°úÿÒ_aÿÿ×ë¾–’„Pô¼zÒþÿ¿ÿÿÿòÒ}ÒØÿÿ·þæ×ÿàŒ?ãbµkIoCÿø×«êÿÿëïþßÿÿá‡ûßÿúÿUI-uúÿÒÿÿÿ_ÿöü7ÿÿøÍ?ïð—õéf5£‹7úÿÿÿÿü�‘ßÿýÞÿþïÃõ¥°ÿÿ_^´’õ]/ÿÿÿÿþ�ÿè§ø~ÿ÷}uþ¿ýz¯KªÒI#ß¿ÿ¿ÿÿô¿ß×V߯îÿúÕ__ý{Z«JEí¥„“ýÿýû®ëþ¿ýõ¥wû¯þßœÿÿºÿízê*\Wÿÿïïÿ_õ}t›o=ûuþÝÿZ]Ýi+eõî ¹éWUÔ/Ý÷ýßõ½ëwöN®º|Í}]¥ß°ÎM¦·ÚIÛoi\Ri¦ÓØAU0ª5]·ÿÛm{KÿöÂZX[a…NÒWI6 5 Sé¶: +Ýôx•©VÉy„ÕȵG ûooöÛNÞ•Õ>Ö6EÐ�±VM4ؤÛTà $ém‚Âei¢ŽÀá¦Ùå»»dAÊ¡`Ãh$Ãh+MSÞ©;aD40EüÁ…*ØbéÄ#%=C!ÃÓMÅÚh2¬+ ¡O„0@Â!¡vˆ�É%öÂ}Ø!h-ú눎"#ëÿïù 5úzÚmJÇÂb"5Nƒÿü›�##Z[”d¦;:ÉùŽÕÇVvQ +j´ôËbó½*�¼¹R½ÿõ#>¿ûÿí•Ä’ï‡úýürÈRŠõeV;•ÿ×å/òÈ4�#/Atÿïþ?¯–CƒuOïó·_ûýr´Ê„pò È?þ¼ì"×ÿ�âÈ RB#Rc6H‰Ó$g2ž2BL Éë'“LŸçòþûãäW½:ç, >\dF@ð��ó–xÌØEä=„³^¡?>Òm0l(DXjÞ¨3†¬4·ÇýTÉ-Ñ‘:EÚ!2lŽ…:£–2ŒöhÌÏFÎÙFÙ®TÒ½ô•„œ* á²ÎÛJÔ66—ª ÒþÿòdnS ÈduE^o0ŽFâñáM:Äæ›1ÂÃaä?A„n:…}PÿA> 5µLñ„ŸwIÒºÕ'ë[vÝÝSÝýGÍH‡‘óVGóuˆñÁ‘äD™V_ž¢f¶­˜‹ŒûˆŠb‚=ÑòÁè'H[K#$ ã“83�+«âêÛ¾—‡Jõ}ÿ_Õݧ}Õiý»ÿu_;DtI¢\dè“s8‰Ñäõ… Ç ƒ3Ìl ”$/¦šO&=&ÒbƒM2~ƒ ]'pé:V–µµ ´¯ŽÚOúôßí:Cýj«»ÿä}_Aÿ�›"¤ld„`϶n%ó4��É̹ŸÉz ié6¹ÇŸ4›Ié¹g Žkn(+JOéj/¨­¥ôÿþÿ¿ÕûUw×ÿÆ¿ÿHGoÿý/MM44} 6í¤ûM% ¯Òt–ëij/ ¤½m]µÞ’ïíK„ý«÷R8]úÿ×¾?ÿ®—ÿÿþßÿðg ´ÃœRmÚT›¤µµª^Ú§¿¸×©/~Û­Ük¿ÿÈÉÃúoõý/ëÿ×ýÿÿÿ„ÚÜ&÷KïÓÛýVÔq~ã^÷úÿë¼x?a¢ë_ÿÐØÿÿÿÿÿÿÿÿÿÿú«»Ž½i7÷é/ÓÞ臢áøúCí«z[áÿÿëoÿÿßÿûÿÿÿýÿþúã«ÔŽWÿ¾úÑu†¿òêðÿþºÓ·ì?ÿÿ°ÿÿÿÿÿÿÿ¿úÿßÝ9;ø·Zý0{¤¾ÃÿÃÿt�[G�PÃðoÿÿàÿÿÿß÷ÿÝÿÿõë÷þ?Ö¾þßÿ°ÿÿÛóWûkuÓxFˆoÃÿpßßýúÿÿÞïÿûë­?ûÿï«uÿl=´¿ ÿÿƒ~]íÂÒ×I‡÷»ÿýïý~ÿ·ýý?wÿýõºßýš¿ÿýðÿÿÿé}à� ºzKÿþïî¿ÿ_í÷ÞÛÿþÝ¥}7¯l;ÿþßÿÃ{¯íÿýíú_¤<8×w¿ÿÞHÿº¿mm&ÿ¿M½¶ßv^í†nÒ[A2{µd,ÿÿö>¾üUö÷Ö¶ÿëí¤ïZž_žûÿï¥î·÷é6f•vöÛn‡¡êšÄ+ ±Z < T†ª Â¯ï]áïûôû»ÿOæ´×ÿ§ïÝÕ§Óf‰¿÷öÏVëÛI‡{"ÆÒd-NÓ Š9\Ø:`è4Ó¦šmsÜ0T#E�Ñÿ×oÝyÏÞû:®ÿ[mUoµÛ3Ù×`Œ<�i7é0Á&*i¬�©± ii¶‚n²:w• ahïL6CMBŒ‚¯öõÛ­ÖÿööÌû¦ûé³û}Ö^YÃl¾Ã˜uµ˜…`ø{˜3vÕ Eð¶""!¢lg¶h®»3ßn¯ëvÌ-°–“ æŸh&)‘^ÚLBAÁqAŠöžšdP‰¦EÔ Ñ*Ge¸�þØKAm‚ MÐL„i-1b¤¤Ó• ÓN"ðÜ0˜@ÁJ;Ës0ßÓL+aPaФØ`“°ÐPðÁ`ÂaÂ)ò¹4õðšpØTG$|†Ã„C G-Ég^¥–ЈёRë§c®•S õzÄm[A]&CŸÂƒ/UèFò¸¦jP�þSjYØÎSE‘Ù8 `²˜J¨Ï宣 ˆ'è'yj �‚gcëº� �T�Ýýúi;ÿçtÿ¨õ��ú¯"‹\Û5ä�š¬Ù�Fu®3¢ÉŽ`Ê‚iN `‚ ê5\¯Dk3ª#ÇRÍhÔÌÅ„˜#q!xMÃÐÍ š7t †š²Çò¡ ›úç"#$†|Èyx‘‘ÙÓ9‘: ¬$0Gçš(fraÞ“i§#€Â ´›OK“: …�‹­ËP�ò’A‘É@ˆ„HBd É ‰æpL&VKÖ‚t›IµoM´ÒÙhM„Þ ºa¥¨i't¯ßt¸#d­„hfˆ#XeóÐA„l¢­¤Ú Î0�m[WJÒÒt�+tºzwIºj›Wúi/߸é:M¤*Lh‹ Û,H³±m&Ö¢—T“k¥«­êž+ý¸î·[�é[_¢ÇKA]j° ž¯ëKöŸÕõ­F†5ö«×û¬wKÿÿN¶£Óî­þù.××èit¨‡=!Çé¿uý[ÿ¯ªÞ¶Ö¿úþ?ÈrºÔ´ÿ_ÿíÿÿ¯¿ý?ü²Ïÿ̧×ÿ×ðŠÿ÷ÿ­œÿßú_þ«þþCÿÿÂ_ÿÿïü?¯ÿÿÿn² +È÷ÿ‹ÿÿ¯ßõÿ×Ã{kÿÿÿ”-ÒÂþ¾t^úûÐKÿu¯ïøozÿÿ¿ð–Ø"‡W_x_º~­Wÿ¿ÿþÛAÿÿéj"évöÿ¯¯¯U÷ï_íï·í÷_ïþº +×{}½}¿é¿öþÖïÛ¿¿=ëÿþ¯«mÚÿî—jé_¶žè.Èò¦Á‘ßÝð¾õþßþ­›ìÓ»¶Û?l>Â8îËÍÒè&Ò†ÃM�6I± ; B·Ù×ûöÿûþíä1Á‚R(í†m°Ë›•�³v7›$^I´« ²8HÖQ< J­ŽöÍ\†?Ú[eý6všzÃm¶!BpÄ&!5a«i¦ƒ�x†!!ÕvÂl0]$ÛMCi'šaˆ_{O;°aA™9Ù1‘bÄ4“´í°’°¥[GÆ #±\¡ˆˆÃB b¥fR&ˆ¡©¡¸ˆˆ®"*Õ_ZÕ×­.¬4´ƒ#!†Hp‹pÐÈÇË4 ²ÌF¯&ÂÙfJ‘èì¹v�nMµ V«T² HÎÒd¨Îã­…½$ëÎê �0znýQšþh[¢«QÞ—UŽ8Ô ² wúÒÿd¢R:(d„'p‚¥ßÆ—ÕHè�ÄuŠˆþHˆý�œ�…†à0š,à½.’é~’#¡’�ffÔa”ù£@Ø3ì-„ +õÂ+BmQOG‰e­ˆä¦CU!_\˜H2:£ñB=ŠCf‘ Íêxð� #˜G>úÉûPæiÕô›mïWÒ°Ž='KDAá~•‘Ö¤=IóHêÂy”F2C<`†¡MUFÎÒl B3A×´­ý]Î~½¥ýiiRéeºÐ§H�r:#òÇ"eþ‘PÈùÔ�´¨Ï²Ž�TÒnN�‚l(Gvg£½t›](T�Aiêê‘ôá­ÂZY…Øãº[i>£KCÒÒ™³²V!ÃABÃAnùn©3ë–%I&Â[é;N“h§H/¤h§„qéZ*Jê“Òø¨Á…üRê´•¿«Z]* zÏí'Ië$‰:¥f{A-.©*ô­-/T´ºi&Òô½/I{–?mt’û×]±ûÖ“¨ì/.޹±�B`Žô¬5†vu_é®’mZ¥A.•*â´¸ëU®1Šâµô–«Ý¤-~µÕ¯ÒOíÕ©5;,)$0‰Ûh][IÒu}IZ#æ¢+(ÐSQ"‡RD'Ì WÅp•*þ•uhR¬V‚®–•RZ¤­ÿ¥ÒUn’IB ¾›U/èeý �Oßkçcdk,§F¡Q¿†r †a3ÄAá�ŒÒM0‹Éœéô—|BZIi%ÕzúZ]ŠõI»÷]B]Zþ‚õ¾!t“†÷ >:ºä"yLé—ÊxÍù��¼ƒÌ ‘˜0��„yÏ™Í�æ½PL4ÒUI†ˆìŽÜ+Ažl³¯÷u,t’¥KëIpª�Uþ—P¿+mG¯~’ÁÓ|º×ì‚×I-_ô•-×ÕAmº½*Um%¬}'¯J·è‰fàÉÃ'�† K¾ÂBñZ‹ËzVˆá„{~.•¢~Ô:M¯ºO[¥¥ÿ0½§t—~ÿ·÷„Z__®µ¥úÚJ•bíÿõMú﫯Z÷©/*h�“~ºé6í+â“h ¿mooÕ´¿V¼t×ýÅõ#…k邏~ê:ë­RUZ¥ýS «é·ô’ýê«"¿Óæ©fÞ’„ ¤ôÂ[ëÿÅÖúÿU§q[ÿ¡Ý +¯ÝÑ�ì‘þÃþÝ-õ_Zþµ_¤¡zDréw´‚)ßé)„aj_P–gë„�ý.f«¥ÿ Uúézÿî—êïÿïuZþ¿,sÿåŒúCü?í­=.“]WIRô—Z R–‰û3Ìy�òŒÆÌ-,ÍzIÿ¥¥×WÚM¤º„·Ïjí;¥Ö¤pº_÷÷¤�Oþ�ï«×ÿ¤?ÿÿþùÕi?ß×ùµëæa$»­%FÕõÓ¥}×J“ФØJ¡ÝCé°•¥ci\„�+î×wú×äi5ÿÝAøÿÿÿÿÿÿÿþÚO]_çaQÄ‘µfiRS J•it«IRÒ‡I*ÚWW¨X¨zVZn©²<,U¥¶‚¦«þ=ÿÒþÃÕ‡ÿÿÿÿÿÿÿÿ`Ý×SsªI;gÖ–:XéibÝ,TUBWJEÀm©¾µb›­‡O ˜® Æ˜„Á”0ØB"?/¿ú·úÿ¶Ý0ÿÿÿÿÿûÿÿÿ÷¶ºWØ÷¥ $ŒiC·J¡BSr[h*AAÕ ‚ƒFnÂÒ#Œ0†¡ÿÿëÐ_ᇨoÿÿÿïÿÿÿ¿ß÷ôÚ ´´ÛdIº†‚‘(©Â ꢫ 0šâ�Ljxˆ�ˆ×ïÿ”NÚ^“ï‡èýÿÿëÿéïÿÿ¿ÞjéZ OaU4Ó +¨a #,ƒfFr]bÿè-Ò¾®®ƒmíÿÿß[kÿoÿ·ÿù§ØdrƒÑËr¨6µ¯ÿ¥¶^—ûØ¿û¾¿Wûw·}þÿ·ÿPx!ž«öÿÂZ +é:º»ÿÿ÷Öû{jßvg·÷ðÏëÛ å}—ô¢;éidëÿð£z“ýtjë'ëoÿÛµÛI¿»=YlolÀ©¦Å&š±I¦Ã‡_S"É.µl‘ÿªíê­«ikõmþ}®­è$ÛI�‘Ä1LPA†!2+ÙSL0¿ =Ê6�’Wzr5ï·ÿݲÌôšÂzº{í‘)Mt¦È…è+m&Gh0˜RºA¬0†VJ’@ݺ¶‚ÒmUtäAÛaŠ]µm&Ò¦ Ûßm"¾�ÄË™­6ʈâ"6Ò+ÂÂHm„“M5a=°�tÇ3Ž#ÖfD�ˆ� 1‚Áˆ"Di“©XR³žd–±&õõ×ÿ_émv�* ýResðÈÝQ^¤0lDcå˜+K)+$²•yØÇ-ÖbºÇ©Õ>[�ds8D|*Oïô"=GúG¹x_ßv±‚]~W.Dþ,ÉNAo�‹¥­s°<‰F£ ³³Wøé¯©«#ä¼D,‹#dpd„ašò4 3g†d²á*¬}I.S¢>š!“—�‘ 0BÃ$a'Iå\ši„›4¤~ÓM&(²ä’§iR|äV™ÓD ÙŽ #À‚Øh„VW��n-91êÚ„hkz„²<×I ª|ÒaÅàR  ;ÒRªˆ’3yAx eþUÀƒSÝu¤6�»,xVäÕÞoa\Rm7WÖ·º¿ºæB2x”Á#³º¬'[ô‰l}Ÿ59#[¯ ØR>ôh­¢,4®Xm Ú·ŠL6’öý+ô¿zÒÒÝýÁB…'WÝG2'Ò*3ÚjŠwM¤rP敨vŒ÷í´® Ò·I¤¯þ½¿Véÿ}Þ¿÷¯þ¾¯×„®ƒ¥öM¾•¢ŸÖýkí¯««ú·þïÖøÿøÿÿ»º‹ã¯ÒI°Šy…¥î½icú�º«\„ÐÕÃëÇïÕýÕû_Ò̧õY ÈÂ%,ù�k0ˆBê¸ã�]7뤫äp¾ˆõªðõo÷þÿÿÕ´¿ëÿ_ΦuD»3Ž£5™ÔR@„ ‹€ÁÂ>f˜&üÍ0Oõ¥×¯Õ%ýþ£ð_»ýÿÿýÞ¿m/üì].m’gœ26GFc(FÚ!<ö˜3øA„ #C4‚ ÃÜÒÐM¤wDpÑXÒa„E¶Ë'Kz WKMVº¯úÿý‡ÿÿÿÿù¦ì4¿ ¥ú”ë$ ¤ÈÔ^E ø|!Pd�ÍÈA¦š ´Ó “ 5D¡£ÛI´Gl ›IÐZM ­ð�Cׂ¾µõ×õé*«ÿÿ†ÿÈÿÿæ›ÿëÄ/ôÙ)“ŒèD˜2Fašó��Ÿ çØA0Â?–øG¶+h¬©ãJ»,è6¡ÐM�è'Ý+WJÕ­ö›T÷ú÷Ij’ô¡8]Sÿÿ‡ÿ/ÿ¯Kÿt´dÿA#[xèØs›ª¹ªa+ÂM²|šIµm^XÜ[ZkÕ´¯j–ÿvÒÚÒkM/m!ö¾7ÿëëú®#ûßÿá¿­/¯m}ÿUýRa«úL4�–tØCIô›wÒi&ñ×ö›÷'ů¯u+Ò×Ýé9×úJ–ª¾«Õ&ÿþûu}µ××ÿÕõÿÓKIý--öäíW÷ºKïû½{»¡ÿmoŽýKŒgÛÿüÿÒëI}%[þÿý×õë׺_ÿëò?²²ÄÒ_ª¥n+é7B•ßúÿ·,rHëÿþ© k×ÿÿsªô½kéÿïÛ¶ÝNu¶¿zûuÝÿ§Û ‡é¶£_Æ—¯×ûÚKðÿÿý!ýýÿÿÿÿöºZUK¤µÒæ{þß··uÕ½]„qéÂÛ/¶’kl=5ÓmÛM5ºÑc’?é·WÿW‡þßçÿÿ¾¿ÿÿÿÿzÒ­L-&ëËùšZ[ÿ¿³êË«m+á‘öÐK » 'ÚIÛ´Ÿ`è¢#ÒK©XVíÅõý»£ãý‡ÿ×ÿÿÿ“ïÿßÿÿ×¥­%­$�¦Ò¬�äu}é°fjÈyŒ2í&I¶ÒA×*Ä${l Ä)XÌ�wŸ_ÿÿÿE=Á¿öÒñûÿÿKþÿ¯ÿÿ¶“iRÃÒt¸VX«ÐA4Ó i†š („Ä&ƒ ·�}ÿò®ÿmt‡ðßû¥ÿÿÿ„¿·ö×ÿïûjéuZM «`úÛA#ó²_X#ÿÿÐ'ÿÛÿ ÿãý?ëÿÿÝÿûÿ ¤IÕRˆˆ´h$uÖ'ÿÿÂ_«iuº¿ýß·_ëûnûÓzëßó±¨Dt­-/ÿîµöø¦;¿ÿ ^—î¿úûvN›ÛI³DßöÃ9^Ù…ÛI´­Wí¿××éé·£�ßûfŸwWþ¾Ùý† C¡Ûi0Á(dzÓµb“N¬L µýÿnµ÷Zví/²öAýö“ ÕÒTÓX`à  Ø¦! vÒ Sµ[ ,£apdjQoþÛ÷^ÓÛ§Û=:WYy=>Õ<$¤a†•ëm=á„ ˜À„el¶„[°Šû ÷M¸IÁ—4ÛKiŠ ¤ÚLBÓÓnø‚#¦ Ü«aˆF¬›V« Ý{zaŠbÓl$› Ó ¥TL4#!8ˆ£ž#1¹-±N.žÂ •„BaˆF¨’&NXÒ~´Ä2l6—â+þºéZ\[A' ˆXá‚â?,Áå£\0aNÊy7|ìx�3Lí?éÊâÑ”0P¹-¤×ÊâI’Ù§ÚëÅÚ™ˆ¬|;ûë™_õïŽT,“ÿÿY$_®ž™j +Z¥ýUó‘ëâODF˜Ù’³¾B5úçk^rÓ*ºh‰Ô †Ža.}9œ×ëçkKÎiç ‚Šu‰óc$&ÂHYGšöFl>Ló6 7Mž�]we²0¬4• \¯Ó2îò'�†DEÌð@ÏŒñ¢¡2Œö°3Õ¦˜WÏ]i¦‚M´ÕéZø¨ª‹“q‰.¿È�H¹ž2S‘¬"-${'CL· L5 „ÒmB46Zt›i„�ozI´»Ô?öÿúÿÿoÿßÍÿý/ÿÈÖáÃx>W¦A3ù«<‹åD^DI„Ë™ 2�|2Ñœ4¤$CI´�Ü*é6™â<Ò´Ûu¤¯¤¯µðÛVÿØÿ¯ÿþ?ù»Âÿû×ÿÚ[¾ÞdjGˆ£0ÉÙx‘Ê‚>gð��ÈÇ0ê( O Ÿ +m4{}‹¤ß¥h“ÒÂ_êé{·ßøêÚíý)*öú ÿøoÿÿÿý¿ý/T¿ÿ‡þ»¿çaYœ «h&GÊê–›hXM+rѶdi´ÛöÖÔ{¦»§ýÇVšÐÚ~ÔŽÒýc®Å¿ÿÿýÿÿÿöúÿÿëýµSžcó›áQ†y¥«I6í[~±t¿[ký{CqRá÷iHáßï‚n¶öé_ƒmƒÿøoÿ÷ûÿ¦÷ëÒýwîÚÿþÿ^•ð�´º~Û­/m~¿I½úã½ÖN‹ÿåUôXÏÁÐê¿®½öÿýÿÿ¿{¿_öÛ_U[_ïz[öÏÝ­ZKu˜þ¿]WR8Vþú÷÷ÿEÖ,[Cÿô?ÿ°×¯Û¯îÃ~ÿßÿÿí¶þ«ý¿êï¯ý´¯]††Ý¤ßm¤Å;O×ëÓò3í(xþ¿ÿ°ÿ_ýÿ í¯úÿ!§ßóËÿí[öíý^ý†Ý°ô¤AÝ “TÙ ´“`í0Ä'i±lU‘ /ñþX³]!oØûÿ¾ÃÿÿÿÿÃþõÿóN®ÿúÿûnög”;¸\‰od9rŸa&£»Im:à §¶ÑBžÊ8B""!ÿúúþé‡ÿÿþÿÿÿÿÃÛ¥×û¦­vÏÿö’iÝìl…ý²d)ÁÕÕ0I¦A…¼0�0‰’8‡&Õß«kºûh§¨o:ßÿÿ†ÿÿûÿý·Š‡wí/¨6)S´í%Ó „'v„Ã0ž+ +/ŽÊ!ÿaýwÿ·A¼ _ÿÿ‡ûÿ÷þÿ{j×w¥L0“L+ÂÛb�CÙXx‚(sä\ƒÌ©Ž¿áÛKÒïKPÞ—ÿö÷íÿ÷ûþþõ÷|6. B‰°Å×ú[#=±ö×§Òëuÿ÷}þÿïóM&û]¦Ìöøâ+¯úèÚ»Þ)�õþëÿlé÷Ûýš¶gýÝ6wA{ $áô½/õÒß·¢c¯ïuÿÛ3ÛI³?až›Ûûa‚VžÃ•9±TÚAiˆL1úVÿöýº}n×Û¯3»VÂ]0Á$ئ Càí4ꛓ¶›¡Ða3>4ª‚ÿþ²ìÏöÏïÝf9Ãl¾›i&žTبi1 0Âlw…Û�QXUÁ‚•\C‘ oTuwò+†Û $ÒlVÓi0p\;l�¤·Wsè:‚&Âá¸/+¦˜M8]± Óa4,0‚i¡ b!$WÖ¤"+ÁÁ¶š)ÌC+Š7«ËT=ÄGŠO×ý.Ò»h �ƒ ‘\>ZUÒȲdO$±Û³²Ü)¥&Áq‘CÂ…I5¹\m‚’ú“á'ÿS¬vñÚ¬Gg ¦©¤û½SU[#ƒûê.øãÖöÞ¶²a|:^øä'¯ùVd�ß÷ýU?Éj#çzÁ”fËl<Íl³LâŽÊ/Ž?©%Zç¼ášâ„aŸÔá#3Ã'ÌüöAÇØM5 äòWN©ÿòe"#%ÖlÝ0öWça†ˆAN‚HÏxL�XTýÞ”[OJÕÛEd&xð©6®[“Gf¿ùÞƒó†ð "ìŸ"AáOdõÇ�·ö}„®Ï°º Žio´–®“k ¶öú_;Y3²¨&JY:#s…z®q�Å:³9HD}™¢ìŸ0Â6?L£=›IІ‚nÎêË:i&ÙdÌ‹u{ÓÓ«ïþÒûÖÓ"Â8𺦗æSCÈáâi&–pg +�-ªi7Ùö“h'JÂ%íz ®»é7þ¿kâ–Þ’[Š«ï»î‹pÂNûÝ “tþ¹°“iè-§uÓt¯Û]t·m/þ»ýÕk­¯Û¡üûüaÓ_ÒæU/OúdsW~•Òk¿Õ4†ºzöß}µ_ÿ^õÿÿ¦‹øäšÉNšäÒ:£È�2�QW¶“°….߭ŧ�}ñÿ_úoý/^·OZKÿÿaçbŸêŸçtÈÛ c%!š Ô4DùÁŸdi„ ðäøØ><ÿ®¿ßI­ÿÑ`qöþÿúÿÿÿùCëÿÿü6¿úé‘(Íšˆê0ˆA…+,rΈèÖa`ÁÙæffrg»Øœšïª„[¶šI´�–ÇuûQ]¥þ¿÷ßÛ_ÿÿý´­"÷ÿÿØ>¿•äDä&L jGˆDh0�a„||Ÿ“˜'@™¦g„ƒÐotÔ!¤Ú ᢜÄZa*nô•ã_×­¾¿ÿUõÿþ¿ÿ÷ï÷ ïÿÿ|�‘Ïš"tÙÄËŠH�ÙB _A„{q„ÓÐÒa¤òjî“ ›A‘ÏÂ[é—h”RºqýWÿÓÿÿö«þ¾ÃýÿýµÿÿÌ×ûcŠ_ÿõû¢�üÖFMpš6=ÚMá4›“PY謤òÕ³Æé7»î¢·N£¾ì&°¾ŸÛÞŸ¤?ÿ¶Š}?ÿáüþÿÿ×ÿ߯ü6{ÿëÝúj‚mÃöÙhgÚ ¼Ci7ªM½bÚï]¤éŽýªãiâЩ+ÿÓ¾ÚÈZÿ4ÿõ|�ŸýûKô¾¿áÝ¿ª÷¾«Wÿ×¶tö].¬4 †ÛúûÒßú^í}ÿÜmZûüûkÿ¢Ó‡ÿ ?W„¾ÿ·_¥ÿýõÿ¿_uöÿõöÌþ«tŸÿmSÛ[øÿýÕïû�¨ÃÿÒþ¿m-‡çúÿl`×ÿûKÕW_ýºïÛÿÛß»¶ÿí/°•þ=»O×èVè±È´þ?ý[û‹a×ÿÿ¯ÿ°ÿú¯ðÚ×Wëúÿi×þþîîéäAÞÃ6•S»A&˜ba-¤¿ÿEŽF¯ËOñÿÿþíûÿÿÛ¯Þ°¯·µ¯ßíÝ®¿k¯}×eý6Î$îÛVDL' ²!wzà { ˆWíÿþ?ÿ߯ÿ†ÿoÃÿÿ¯ö»ÿïßöÌóßðØg©pí(l=û"¢IÅ&˜dA ]Ó 4"Â"0`„Df’¯_ÿýÿú÷ÿðßà߇ÿÿÿÿ«ÿ×nß¶¶M4íƒ.˜… ôÃH&šmSi+ Ü«†®•ÿÿÿÿæŸÿàßá¿ ßýÿ°ÿaïôûa¦ÁûW«¦š°ÃM5i4Ñ9#ã'D„8Â&Ã/ÿÿÿÿý/þ÷ýïýûÿý³ªïªnMºhZiÊÐR¹�–Gd¨zÿÿÿÿÿKÿéÿwÞí~ÿß÷~¿*؈ÊÉo;ÿ¯ÿ¿¿¿õÿÝÏ.ò�oý¿¿þ¡ž­~"#¯í¯ÿúÿ÷úÿÝþצöé¶ÿlõù…tšiìUÓ"ãô¿ÿþßMûýß«¯]ݤÙîô›9HŽÓMŠ ¦Æ›­ÛA„ÃA0¾·ï_ÿé7Ûfý‚0üǧ¶‚´™7±IÃH1Mi ØWÐ\�è¬døˆaˆ� ÞÚ_ß°ÎZM›~Á„•‘rœBmŠOM´­&[dvÂVF4a +>em"t=¶–šr.;b¡¤Å&›¡°“ëaJ¹BÃ@�†[‚u ÛI;M¤Â†«ƒ+ +8dìë–@j�e3‰šò®„ŠÆN¥cY;UB<¦Óð”.­Gùf$ŽÞ–@†U «-áÒãÂüƒÁ5%’O»Á¦F2 +Z:Ï´œ?ÑîTì—´íýG~“úÿõ�E�­ÿPþÿøë®RÖKb42Ó ¿XåB;IúÞ¤fk3ï02†Gж}©°Ð}‚]“åÉ,Ð&U¥'©cê¿•xD'M™d$n6�G³’"¬ Î „šÚi °É`T‚m7 7¦¿ýW9šÈ¤`Ž‚‘(£9�q½‰Â9xA“çóIMIäIäÇm3†fážkh29¥Ó´ººVZ'Ãûóž™XÍ’!2FÃ5½�Á”Dû ´˜zL94pÖÂᦷhR½¾´´I;ê“ì/&Ô¯ñ®UÄç„EAç(Ð3ƒ>Ê}B~�m+H7Ÿ0“aBN¬4˜l²öÝ'Jäïcê?Ó½=n?·×B¤p¦E‘Þ]cüÓ?²\Œìù®¬³ª +ƒ<Ùgm ›Jíêét´ŸIúqVÒ½AúõÛèwär +~MÅýmá.Ø\+»K_ë«TêßC¯ª÷­ß1ÿã½}ªéçih¯¦Ÿ�>Ö•½{~û{íí»ª‘Â¥éã°ú‡¤?ÿû}B*§gJu3©),d e²$fË*&š9Û_wÿIÚÿUú~±Ûöÿ®{ÿúëí¨Eó"Ä*dDAZ"P‹Qs" 4BLÐ #d“F˜A„hjPžO$ÚßÕ[í÷ÿÿå˜ÿz¥úÿ®ÃÅ¿ÿÁí‚;Òþ™\“#hŽˆòdx‰â$dtGŠˆ»'F Î 2-„„nf’hüFÇ ƒ¤áB"ÃA8Aœ0™ãÕjÿÆ¿ûiýWÿÿÿþlÂÿÿÿMé?©Sd/4gA�È� P�dxØÏÊ!‡=šI¦Bè'NÂ6T4Ñí²Ð›CIºvb¥¬¯ ½½U¤¿¤ÿÿãÿëÿÿÿÿàÞ!¿ÿÒö÷_KìÊè*!’A‡��4i„ Ñ¡„k ¼{3�4l$ !kIå�›DpÂ>4µ´ÒµQ¾­„¶£­¤þÝní7º�Ûÿý¿ÿÿÿÿÿï{ßþ—üS }Â5‘pÑÏÇØM!d‚Q4V0‚´˜¥D[i5ý(ºÚ ¿´]ûº¦Ð¯z— û_í»ïCÿÿÿÿþïÿï­ë÷Ý¿ý~úÕ{I¤›ež§ÚN¨>´¡,®¢ÿöÓº~â¤p®þ†ñßïã¿þ¿ûÿÿÿÿû®Þ×µþ÷ß¿ÿ÷ÝÿmZKëmkÚmuzï«Õzìw�§åŽFŠ&9*=Zÿ÷Ûýa¿ÿØþ÷úï¿ÿ’þäëÛÿí{¿ý³Ñê¿÷ëÚ~¾Ý­{moÅþý)ÿ…ƒÿý{ÿÔàÿ‘ýÿÿoïWm·]×íýU×g¯ÖðF¦Ø"‡½Ca¦Åk×¾û¿ãÿÿ¨z_°ÿ×°ÿÿÿÿgÿn›ÿýÿý»ûö÷Kt¿aœ»KÒa±I馱 íƒÞ�ÞØ/Çÿÿÿÿö«ÿm¿ü7ÿù'¿ÿáÇúMúÿÿþÙôß¶–Û òm-´™lRw½¥a„©ü§m9FWNÿ¿µÿúýºaÝ0ÿðÃãÿÿðÿÿ„µ×élÏ[ø_Ýw²/S†�L¦IY2H Øh&Û`Éh�„ aª—ÿ¯ýµýÒ ø7ÿ†Áúûðßßú_ÿÚôöÂKiÃTôàÝ4Ó«°Ä ´â¬0ƒ8²±¹ÚÞ#jÇÿ¶¿äþè/ÛHlCÿáÒþ¿û~ÿõÝu÷×aX «r�„ÃMª¾UØEF e7+M �ÿº ü$í×úû}þë÷ÿ~ûßþ½uö½pÂ@‘ñšB„ ò„¤ÜÍ1IìBÿ­¡ü8» ÿ÷_{ýöΟÛÿ÷¥¥í÷2+ÖqÁ%ÿ¢…ª„¿Ÿ4ßÏ÷ßÞÙ¢z¶Ìöÿì‡ÚV—l3u·­!ÿðŸúëú‘¾««o¿­vÌÿí³þØ%i9�†† ¦šÄ&ô´�i†)·à’kÿÿÿôA½Û^Ïëÿ"¸i°`—§ŠبiE10fw¸…¥C(É F’Ù�ÿÙWÿä1ûÃ!‚ô»I‘xz§ (-0Ä$ÓV˜I°˜¦0ƒC*©#˜¹¶Z´È>0M²ÿ¬4ÓO†Ãm5M»J®¡ ;Ù\Œƒ[‹ÜnG)4Ðm§j›MZw<4o†+M�¦ØNÒ=ìŸG<«Í1tDDPAÇ´ŠDî{ˆ¤û×Å]]~¿­-j�k«KªA§ÒºÒlªš=†KöÒÒa‹„m¤ÈŽ™E��›­�‰B2ÔUÄcå”™C�‰Òº¬K‘[*±B~v ú�!æå"'ýhìµkدݡHìbí:ämfC¡ÓS´™ÔŽ„#å¦K•ð×ëä“%ò�ãª1" 3Áô*ÈÉ•€ÁØF°âË:¸„EJ2 +Ô/ ‹=3ºµ#ÄFc:ƳD@3ÁœÎE@BÃ!aØA0ÓL+i6‚y6Al°Ç6È‘�S§ëžÍh‰™ó:ÔTDVAìäÁ”hƒL3êÌàMJyŽÂ<4F;WVäÂ&g�'I‡íê#·ÂgcZ…ÿß®w©§�Lý¢'AŽdšhød6Ìଗ]«'Ô›WD[l°t6.�ii;JÞéi:c–÷(UOßwþu$BdÀɈˆÌ>†²>=³H*_hÎé´ Û3i0ÒnL½ÂÕ" N–¼+ýý¿Z×§Ç¿;3Zïï¾?ÌàŸƒdùštÕ&ÒutÈæ–̈¸JÒm´›Wk_owIý§úÝÞµ›}Uï îîÓþEÖv#þˆ¶Ùg¶tÈæ•¬$´�/Ûî½[Çú߯¿Ýÿlzÿê­‡ÿä©ú}ÿ‚û}Fš^ŸñßÝHú»ÿ}ºõ¿¨ôÿÿë«úü=­ó²Ÿ_ÿ +u2Lfˆ”‹ŸEìÞo<þßOÞ*G +·[¥õÄ5¯Iáðÿÿëÿÿ×ÿÿaãúëåB!¢®Í¼�A™8gAšˆàäJ/l'„ü� scâ¶+í½µ×�ÿ豯öÃáïÿê¿ÿïÿÿàÞvÿyÈêˆú"VÃY@ùÔØÉðÁàŠøúì Â6g&ž&AÝÕ&ø[Mÿaô?ëÿÿì=‡Ýÿÿïÿÿ†õó™O�1ç¯<‰Å:³8Žˆò"t Á,LŸ}Ú„Õío[ežŠÊ °™â8lÈM„·uKëëÿ÷^—ÿÿý‡ƒ{¥ÿïÿÿŸÿÿ»ßL“" Èc)Æk2ð�”L¦`Â7d(ê ÙœšBܱú<5yiÉú /¥h3Í/ôø¶·Tý7_é5¥·ÿÿaûkÿßÿáðÞÚ_þFÿþ—úûôü‰2�k ¢0���lÎÐ^� �5­“ôÒZ Žh&ñ±m-ߥõºnºo_õݧ×_ÝGIô¿ÿ†ýÐD„ÿõ÷þ ïØÿö—_ÿª÷·þêq?&=4 ÛIµtE¶‚ñn´Ë´›~•ÐM.ûÿºþ»ëï©/¼ûuûú[kÿúýº ÿôø|÷_ÿþ½þ¾î—¶„*¶‚u¸+_צ—ÝRÜVúëÛ÷øéëÛúë�ôþ—ÿÖ—×ÿ÷ïRûÿÿ½ÿ<ÿûÖÿÿ]nÛKÛ}ºý'këÝozÜRÛúÞ?Çû§ô_üèE§ÿºÿ­®ÿÿ÷Ý+ïþßî§’ÿÿû¯ýõm°ÌÖé.Ã96Òd]”ß½ïÚëô_·Cè·$3þÞ¿ãëú÷ÿÿÿñ}¯ÿíû]{ïÿäoý³ý„S¿moí`ІÃ™†•¦¦ÐP +é;ðÇõü}võ_µû¯ÿ]ÿÿÿÿþ[¿KÿùÅï}î§þöÌ×í¥if;­‡é¦›"�±mnÕ4ð–81 +“@‹á„„ Pÿÿÿý:ÿÿÑO_ÿ4eïþ¿þÿÿïoÿÿupÏòÆûîËúl0]=Òµbœ$›a4í4Ø…é«V�QU¡ nÿ°×ÿ×öÑOPE?þ‰ÙÛW¯ÿ…ÿïþ¿û{÷ïl¿ý¥†Á&í»c¶)5bv›$:a šb�J+! +£G̬eÙ“ÿ …ÿòvGêÞýÿµÿð—ÿýÿûþÞôÖâ•4í$Ø…øM’°¶: +¨!!†RqFD�ÿÁ°Š¿ÿ ¿ÿH%ÿá/nŸþþ½wýÿÛ¯þöþ�«V�å\¤x`ÂG;åp“�ÿí„¿ÿA·O×ßõðáÿúýwßkû¤ß~ß•!+ÿÿ^/ÿÒ®øpÕwý}ÿÛýuÛý¿ïïÓÛÛV¢“×_ßúþßë﾿éûþÙ¢¿»­³ûûg¾Õ²ûi0ÁöBM�ù´ú×¥û¯œß_¿õïßöï»í­}°KYwi&ÅHù¦Å&©Å0ÂA†;¦W!áûH%i/Ý]ûÝÛ{]„qÞÙË// 6È£-&šlRw ÑÝ„­„ÐTØZ;´V6b>v'ô’dv“½ÒûJÁ·­Ã ìtÓch6)ˆV�pM‡ =M„" ©Íj¶�†DeA­¤šm¬Bm›ªu„Ù\wPÁ4ŠÂ� !‰²Ä¶B³IRm¤�¶‚§ì; +V…d0‰|²ªU2Uš! Ä#ZÁ–sIe6—é~8R PÇòÒ/ydF@¢–ÊÝ®~ +w+õ¯a×™køó"k%JžþÂìì4žŸóZñÕ5Öׯövk©ŒÚ!2pÉ¢¦Û2[^¾KtòœD„]0Ñ…qè{ XL#_Zz§œ2WÖUÇðˆÏ4¡œø9¹/Íà’m0lͲΠãJÙlª…ÈÒU×*“gÌŒF³>gTb5³žgLÜO˜#Y¡2ŒöC™ÇÓ¦žNÕ6®ÓImµa·ÂnŸ&âq[ÖùPˆ<ì4DÍ:lhÖzÌí2Bg¡Ü0˜I†hí­l(M'“>U´˜iaWSçÕþ£Õ�ßÿ¯™ +Gbíméå=Cl:8Î333‹‘ÎαœôwahŽF†l",Qí„›Oh4“¦x×jÇ]/QÛ×z»oõWiúzõ"Rþ=&ÐM…m·]-Tûež.“h&kpL6Òm'Ò]Ý'öÒUÞÝúõJýüßó%AÒtŸ}ñUn¶×¯[ëÝžºuúÕkî›ÇnеpÛáéÿ®þâê§f½m--ü0“ßþBݧէÖÚÒk~¿ñ_aÿë{ÿÿŽh¿*q©� ê2�Jqšˆée:0eÈÍša«ã�ão¿ºú�ôûxÿÿ×ðÿÛ©!ì6ͦÿ^ãÿ\ÊmJ ˆ"PgŒ†)¬‚! žð0EXa1„l F¶i  áíÛÕªûÛÿòÒ~¿ïÒ__ÿöÿèþØx†ÿÿÁõé�Ö‰J#¬…#ˆôp�³hÄÙÖm ló3f˜M��™Á<ë!aÚ¶“M¤éZ#ºZîèþ«öÿÿÿ¯â¿ÿÿ†ÿ'½iÁóÿÿKòH�-HùŒÖgA�ä …›çŒÎ$gð��Èñ4–‚mßhŽGºM Î-=ÀÝ-&V¢–�6—‡ýêê¿°ÿþ¿ÿý³ ÿÿÿÿAmŠØmÅÿÿÒìì,gQ�ÌCÍfGˆÌ4 Í™Ÿ„kf˜L#`a ™³3!Ý„©6Ó „‚um-Ým´­'~šmuþë|}ÿÿíÿýÿÿþT'ÿþÿÂ]îðÃ÷ÿúáÙœš:?Lô,#ÃþLêÐ3�&ÒmÝ_zõJß×Iµv¿kÝß®�ýÒÚýÿÿ†ÿÿÿÿ÷ ÿï¯[¥»ûÿ~¾–ƒ8h-\*'Ì]ßi-ÚV“~£ûÿíëö�ÿº¿×�ðPÇÿÿÿÿƒÿÿþÝp×÷ÿ¶ýú×û:/'þÿÿ]^�_wßýÿïïzéÔŽê´µÿä*?ÿú-8¯ÿþï÷ÿûþÿ×}~ÿßó‹µõ÷ëëlÏÿÖ ²é.�/Úÿú÷R8UþûV×ägzþßÿ¢ÆÿµØkÿÿÝwýÿÿýÿzõýûûoî¸]„SÜü•ÚM]6Ã.zi².;‘Æ:ßû}ÿñëäsMûë­!î•þ¿ÿÿÝ^¶Áÿÿºnÿÿ¿oûþ×õû_Û=_ÚZö7é§in¶Ä$õ…{ ¦‡ô¸ÿÿ¤?ð{jëíëÿÿÿÿäìŽí,6‚ÿÿû®Þ¹Gÿûkíß¶•µ"¦Ã +Ã#«Ø¦EŠ}Z.õ§¶8e@NH … DDöþÿÿÿ ý]~Ý×ÿÿÿÿ [i`ØAÿþé¾ÿ¥Õ²ë[<»Mƒ#µOnO`�›b½0ÂÖ ­P„qE-Ëuoý¿ÿõ¿ÿ ïëíïÿß¿ÿþ©n+uý¿ÿºL3m†Å§i]Üv˜d&­5bªaŽêªx¢±ƒFTcC@¿á¿ÿó¦ÿÿƒ}‹zV¿×ÿßÿéh!wKÿïøm&(2!É^ÛUixa„AQBÁW®Ô#Çü7ÿþþÿ߇Ûwßÿïÿúáoÿ¿ÿ†N`Îè·YZÒ¿Þÿý/û¯}ß{wÝoÿ¿ÿõ¶Î�Zûkmÿ^•ÿ¿ÿú_¾¿ÿÛö·Mßûf‹ïþÝ�g®°Ž8~Ýð`Ž;Ó¥¨UþÿÿÿþÛ«Î~Ó[{·ºMš&õöÁ%¼½Ú|6 е†é„Ø=75ö $«ï�?ÿ^ïöÝ_ëý³×M‚)Ûi0eÜ„ªi±I„Ø„šv›^Âa‚ ¦‘XÑ¡‡V1%ÿýë_Ûá?VÎM ¡‚)ݤ½&Ä&�ƒ¦Ò B`ªï "� ¤{¢®P¥œì¯0ß Ô+¶í¾Õx½‘àbÚi±M¤Ã´“¡ÃDCŠé7Ј²P“M�´“´ÓdqM¦�3Ãb8†ÐRªˆˆ«Z§Nwa“PKF2—ùlª­*ÚZm*²}I²Å¡¼|´–ùfª´å�C;;4—•Á2¡�¢+ú×k„„§µï;È �þÿõëkü¤*8ý­ýÿ9š™Y¦wTˆ/–àhä¤^B#)ü `�Í3�’ÍØ�®d–ŠŒ«2‘ª’h� Ïï”aS'™*¡Nš„–„¶vz?öE”‚‘„GE9a’µú!ÏÑc‘†+‡ÿÿ_ÿ«×úûïÿÿíßàßä3ðëíÙÕzœöÝ/׫»lÿo^¶’l3‹JÒM´œBtíƒi‡A„ÛI÷Îçw*¦!•ÌGùc>>ÃÿzýÿÿµýèßÿùŸïðoîÃþß·ÿ÷n鿦ÏM¤švwÃ#¦6(2m©Þ’l„ðÐMж7´ä"Á�‰¡ÿßaÿÚÿÿùE¼/ÛH%ÿþ¿ÿ‡ýÞýýý­°Ó¶Ï-);´˜¦ÒîöÒqdpƒL eZ†�ÑWÐ${`Â-Æ÷ÿÿÃï ÿô¶—í‚(p‚ ýKý}ÿÝýï}­·öÈO C¦ذ˜„ •{A Ø´ ©B"7ÿÿx?û /µÿð‚è@�!½zû_Þ¿þûóžÞOÕ~š•£1dØ;¯ÿÑPöÿñÿ×]/Óþ¿ÝWïóŸûgN›µÒlÏí)d{Kûû[ßýï_þª¿ª®º_î—ô{ý³×¶znÛ¦%¿í/ÿé÷ÿ_µÿÿ¿Øf/º´»a™«;/í¥­ö©ìU¤Ä(7´˜„ƒ†—loÛVó�}ÿo_¯÷!�ü†"¸xAijì)ÚI¦ÚZ Bl&è4ôÈêëƒ Á»öͶh’½º¿VAõí¥zziÃm´ÓM¶ÚV’v'i¬1Փ쎊W9Kõ�ö]°Im=d^÷i¦ÚI¦©Þï¯sóh=΋™DØ�7Ù0˜b­Ä �ݤÒi«w*,4Ö”\¢R�ÄEHb44#FÆÐNØAQ�†5 +É:ˆºމ’tëüµuFA{®­|RÖºúui_ÿzÂ~éX²2¦žH0ÁÓ¸dFöÈ5F<³RêŽå�#'“rë#.¥½"2*�]R\®üÍîþÿüWÿÿ¯Çò²gÙf"¸µõ"Ñ™”ñ d^D' èr Y�À¡M/ùØ$iÑÃ)ÙŽ™ò!A†OØFÂs?žeMNL0š<0�l´%°©+þK,—F3Í–PŒ3‘|ó"3ŒÓ9a4Ðdòg³ùýÏmšgô´ÔûIÒm+Wf=é¼Xyn—ÕÈ·{u™‘Œ“ŠDL#v|óƒ’ïþß°l¿úß°ÿÿ\ÈÍò òf²!ËeÅ33æ Ô<Ïa…GÈGÆ¡4Ðy¥­­h¯úÒô—áíþ:ÿÿ¶Ãÿÿt°oÿÿ\•":%LÍ‘†xˆq.`“ <#C4‚iq{i8T-*mm3ƧÏ_t?�÷ÿ­…ÛöÿVͯÿÿaƒÿ»p°ßÿårß#h�4{4Ñ¦Æ 2èk2 á„<i¤r3zMž’o¦Ñ´ž_°î“¤‰sHÎ9AE/ ïöõ]%__þ/ͯØ‚ÿÿÿƒ¿ÿæžØ ¬?ÿç`ƒ531IQá˜<á`�a I”áHã�þ�„i6ˆí„kh‹V4k �RõxN—·øôé^7]]7þëÿÿÿüÿÑuÿÿðØnïÿKqÿuü#Û4”"ñ�™œ †šA7úM„�“ôÐYh‹¤é0á_Ãu÷ +ú^—¾ôÿnüwû»ûÛG¿ïÿÿ3½»ðÿ »­ÿúíßýpA6ÿuúº&¢ÛÿþCÑõí×ÿ´’ûnªý¬im¾þê®ÿú,f¿^×ÿ‡ý0Økÿçé†5ý¯×þû~ßž__Õ¿þ»f‹Vé³Ekÿm°mŸV’i¶’iõ¸äp®×uWú,p_ÝÕ_ÿúëÿûøoü6Ø_ÿì=}Û×�½ï××ÕÛm+û…Ø$Ýi0`“všzvÛ ‘GzM0ØA^˜ú†MGõ_n±]µ_õÿÿÿÿÿü7ýƒ`Ø#GÿǺ¯zþßû}ôÝ÷W +äQÃØfæÒTý$ÃiCIˆAƒiU?ðØ„†V0Ñ©þ?·[ú×÷_ÿÿÿùFù ¿ÿø7þ6‚ÿÿÿ¶ÝßmíÞÃM´ö5´¬$œÐb›I=Â8áû m&BÓIT&Å6•¥è-¡>—["Ž uß÷uûo¿oKýv̰Ì4Ûû4Øå;A0°Ã ]ì&GAA¡ŠŠ K®T�A„#¯í×¶z¾�8dM�O $Õ4¦Ä ˜bï´Ò£Ä2cbƒCeÛ¼:A�„aÞÃ9w´Ú[LPcêÛ‡†`Š%½$ü«ƒë†zåºÕÖ“ÂÄ&Ób�i§†ÐV!„Élv""9dEÐxEí0Á"®Š¶ŠÆ,PˆˆþVJhEÄ~štÓ£ã�òÒ~Y(Ì–®WÕëó%¨Õ%ôÿÙ³ô÷®‚k}¬rÔZßr¾‹Ì3XËL£1">Öî)åtDùÞ¹ˆl��„ke¡LŽÖ#°ÔDkuÎëŒÙ*eg@ÂjdùÌÂ3Ïf{e'g·M=m Ù7@�u'“›‹ëüì¾Je'˜#<‰óBA@Ê3Ñ<™ìþIʘ6g:±„­-'[LñâJËs(&v·�Ä•þ•;üÙ&��@ÉöN Í0š5ѲiAö°ïSÆî“h29¥j™ãz´ª›±WK§íS +©é ý! ù‘Qœ"]у03ÏÓ'�îši¦ØW‹ '+ +Ë<ͤØMÕ¶ÕºuµÝ×]WHéò8S!¿w×hGj‚a2Œög(L£†éüùªZ áŸh+K„Þû~ú]?é]½}{ªß^ûh‡�«~‡ÉŸôGl"±¥h3„y¥k½vëb—­ý>*¿¾®.Ó請¾?ãj;ÿ.E½Ì”ÒZùÈŒ°­Öé­[Ýë§ö�×K~Ðß]W[zÿøuÿõ�ê´ü�D92LdA�ÇáCÃNëÖêøÿïo^G‚�¼9c‘Ÿþ?õëÿëL?ýó!¤d’ÓÖÊ�‘±’²!æË* Á‚]¢…ØDa>� $Ýý þ­¦Òÿ‡ýÿúÿÿÿW¥aÿþŸ®UäFE…(P2„lh„¨‚è=´{ 4Ô'“É6“l˜ð©6ˆî“}‹i7þXà¿ÿÿáþ«í¥þ¿ÿÿîÚX7ÿþwL™¢>¹ÆtÔÑ Ó(Ø3L a!Ÿ‚6šyêLsD$KTU†8Z¤é;B&ÐM«û¯þ‡õöÿì?ÿÿÿÿ']Õ‡²�ùÚPÊ  ‘FA¤ðO‚ ™Fæi'èÎÒtÂ3´ž›T›Aœ6dZ-_ÝõKýÖÚñë�úÿûf×øoü—Oá¿ÿÿÿÿ ´.úÿ­„haŸ‚6OÑúª­É³ÇV†ËD[JÓ ««ªWOûî—»¾Š¢—ôûßè/ÿÿãþÿ_Áïþÿïïþ´öŸý:A´­–ŠA´E¶–ƒ#šî4êÚ'kõëÅ&ŸéÿÒêöñz¯u¿‡ü±/ÿÿoü?ö_»ÿ¿ûÖÿë§{×úÚV“ëWâ“I?º[�½nö£¡¿¿¨ûÿ¨ÿ_°ÿ¯÷ÿÿûþëûßýÿÚ÷ÿêÙÓî×úlúI¤¿VéÓhkßCÿ¯îžCŸÿÒþÿ¯ïðÿÿ¿î¼?÷þÿßÿ÷­¿[½�}0íµXi1¤5î»öãÿÿŽûº,gÿýÿõÿðß÷ÿþëóËÿ×Îjßýš/ûKn×í¶Ù Í È£Ÿ-ÝØA4£ý?Ã×ù„þÿÿ„PÿÿÁÿþ ÿÿ¿ßëýÛ´õé³ÖÙØ`º¦›i&È£�^ÓO»i±mÚLŸ& ¯÷ì?ÿÿ_ ÿÿø …ÿÿA†ÿÿ·ý¥n~¾þ–Õ†sƒ.i1KšlBA§i¶•†åDŸ [¨¿ÿaëÿþÃüÿÿð—ÿøKý}ÿ¿íž¾Ý/Õ5ÛI4Ðl„ôá4ئµ¦GU>¹XÁƒ2´úÿöÁÿø@¿oÿÿºõÿ´¿ÿúzlRv¡´“­5´ì~x†˜MOnU°Ñ6íò]—¿ü7„ ÿ¿ô¿}ÿþ¿Zûÿ·^y·Tí…­†a—rÊ)U Zÿáô¿ÿô¿ßÿµ_ëï_t¿¯Û3ó³ªÒÒþëß_ûÿ_É„÷ßßíý¥¥í÷}ÿi“[a—9�…ik¿¯¾«ÿÿÿÓ{þÝ„PïKJí†r‘Gr&0ØKNý4Ób +­�ªûþsÿý¿^×í[?ížû²úi¦Ã0ì[´­$ÂlT'a&Ú =²:,•r°£²‡Ûoþëú9k¶VËýÈ®Õ=&)6)4ØjšlBw†LBGŒ«ƒÂaD<!s³@Þ…³E­î—éZvÃd\¦Å'špZw JÂÑâÑ J¼¬ƒFfn6e©°Á(a‡"óm$Ó‡é¾ÂM0¶Š2BheVÁÂWëÓí4›ažÈ´Ê¶!„(õɰUòÒb" Ñ­‡°„Gø¯êúV¨L'åœ' -Ì|®¼É Mvó¾“ü›¬ì«ÿë¯Ý¢ZµÔÖˆè§fq#YeY.DÉèqôóÑRÊ¢$H„ BÍCÀhž‚=†i¦ZPPŒ?�•xO2+ÍC5³æuÖÌF2RÊ3"teì§ó„ +s|$Úí¥já3ìA?_ÏeO4ÔGŒ†�dfl‚�lÒ4FÆNÓb�²mLìûI‡»´®ËBmàõt¾ËuœˆDGê×L…‘ )FÉ:F{#� Î „Öа‹„h3l#E&Ó#›´�m‹[®£Ö.¾Ói?»–å( @AA‚oÞ‡�†x�q˜‰3Áb ODþSá0ƒ“<Í«jÚNƒ8Â5°“hŸJÒa¶“tý-ÿÚ§¿ò{ú�~dÑvAÒoÔ­®j‚i“öi*rgNi&xÕ´°ª}µzV¢—LBo÷ûkÖè_WqëûÒ½8éúŸ; +´›Jÿ Ñ‘m¤ê™öÒZî–¿·í÷¯Ö©»N¤p»ONúUuî£ ¾�ÿçaC$F:‰Îô›VÕ³¾ÿó¼DfFGS!‘Ô° µ×ÿ÷í'ÿô;­§ãþ7õ½¿ÿê0úýWÎÊÈÁ1 |Bé?i~w¬u%S¡Œ"&È�!P@�”(f˜A‚4¬0�†Ýëz~½«MWv¾Ÿ†?è³EŒÿú«ßû °Ãÿÿè ¿h ãŽ“í©ØVt2®ÉÆj#YÙv�™Ía”ká4lf¨&MÑ4�&K“v½/ÿÿý�?ÿÿýöë¿ü7·ÿïî{¤ßúä¾F‘¢%ë'Ä�‘`ÖK�Á5aÂ=³M3H ÐAÂO ›BÙg á¤Ú áh+@›KV’ÿŽÿÿ ¿ÿöÿÿÿÿÿþ àßägþÞ*wh��ê?[«:ì3dgƒ Q¬38&™¨Ž¤Ý8@Íž®Ú"ÝilǰÑ'\'JéÛ_¯¿ÿúÿ¯ÿû`¿ÿÿÿ¯ÿîÛÿö—ûé¼ÀÎ …ƒG°Ì ��÷ôŸÒË@M¦y„|tÐiu¨MépWÚÚO¤ôÓïýu»Öº {ëÿýïþ „{ÿÿÿûu×þ݇ÿõÿ¿%õPŒð®�&ÿý'Kõ}ïÒN£·þÿÿöãú‘´ý~?¨ÿÿÿÿü:_ÿ÷þ½‹­nÿ·ÿ·¤p›®šJô¿ì^�öÖ»iú·ÚÐ×ÒþFŸãÿð_Â=ÿÈkÿÿÿÛ_ûÿýë{¯÷$Óå Ûý½ýi­uûëÕþ¯R<ý¾Ÿ¾ñé÷–9*/ïý!ÿõoΣë¥ÿ…ÿ»ÿþÝ/ÿ÷þÿþÖµ{Í÷wk¾I>·®´=*þÛ[ùÿÚŽÃ߯ô‡ÿÿÿ_]/þ—ÿ_Û¿ëû¾¿·ýþéyš´®õnÒ{¬¾ÃµÃ â¶ôûÂX»¾—òE/ø¡ý¿X¯ÿÿÿÿ“²;óF^n±þ¿úÿÝÿÿeGKÿf‹Õ³5ûkº Òì�§°eÑ:TØIŠ BNÓdO¸Oøÿñý%¯ømÓ_ûIX‚(}ÿÿÿÿèð·AõÿÓý·_ïVÌÖ•Ýû`—ì0«i¶’u†ÒA±V›Ã �3³E)!äOËïþ·úWûVÿ¢Ÿ‚0ðoôË¿ÿÿÿÿKð—�þïîïþØ}ßÞà {Ú¦›©¦Å&žÚ =è� ‘ò[5–ú?ÿõëÒ÷Po oÿm^‚á¿ÂÿÝÿÿßé~–‚¿ø*¯vÚi«!è5M6MˆM¥ íp¸"ú+A�:Á”ëMÊß�þÏt½/ðÛjÿÒµKúÿïý×ûþ¿ê›tí9+wjÞëvL•ïÚðÄEs%™]wþ[izZÞ¦ûý†Å.ýiÿî¿÷ÿÿÛÓ[kGŒ¨hðÝ¢Èj…ußý.Ð^“ïNÃ}ÿéW×ÿûoî¿Û4_ÚýÛ üîYVr…_·ÿZ7¥uþýþÿœþ½~öïÝ.ý°ºò+½80ÛlV„.—ÿ®›ôQº¶‘ÓÚ'ÒÛÿêÒï×VÎM‚¦ÚKi± +iÁi§]†(K¬Ól‘ÿëÞ¦u×_VÙé}êEpí-.oMSbƒ"½6H6‚¦@ò­“ h5)c"Œa/_û»dƒ?¦†ÚM­¥¶²/Š´Ó§…ÚZ ¬'݃ „(øÃ�hÉKZ I´®×‘]ÛšMÓi6“Ph&`²~¾"Ða —è› ^…0’ *i¦œ-°Â á°‚ B ž°Ã2„V£°d~k£<¡b(ç™U�òÖ$Þ¶Ò¯í¥õØdt/U`Øí UI' �Ödd ØˆÇË5*–f¬§eg ,¾ÎôK¦ò¸¬E}:… ï´ò¹ïÎóÎãï•–v‘¯wõõʼ�¦Z@Q”Rº…éë’<‹æó sdÃ%Ú!J'bÎÖÒúä*DJÍå{)hzÑ„”ˆ ìg¥íE³3·,‰h®i +¾T²Yˆ§ŒÙ*ŒgBD&L +Q‰ð�•~Èð`‘ý†ÁÞ–ÉøM+Ùö“nòÛŽuÒÙIoó²¯O9dR>!Œ ašadˆÛ'�28Ïi„¢8k&4êÞú_´¿íîá_Ã\ˆDtGDK h‰B2æ²+›õ!:<Ÿ9ú>Bš ´Ev�mÚÓL³Ï´�uiúJß÷{÷¦Ò¿Â=ɆýgbQfA Ó=ša� B7A + ™hgÞm'Pè–y¤Ú'áêÚ$éê¶ÿoöýÿKÝ'ýúüué6„4­ ²Ð› ;Kþ•¨ãM:þÚOA¯ý/ý½$¯õÛ×þ›ý!|u:ä¤ÃD½¥hœUô¯zWÛþ×î-ÚûqnºzÚßíúû¯ÿÿ®¤ˆè…žlŽƒ: +~6H„ðC}\;¯´–ú·ïתöÓëúOëøÿ÷Ò·ÿ·ÿÿù‘–¹�ØÍb” +P)ð„f`aÐa„lÚ žuo¥uk¸þ‡¶¯ÿŒ8ËOþöëõÿ{ÿÿÃkÿÿù]O#¼ž#ä�éZ +Õ´IÒ^+Ói=z^ÿþ¶ƒÿ_oUÿa·ÿÿý„øý¾ÿ ùÚÚ8gAQ0�æ¤À¨„w hØs›¦�I†“骶­¤Ã éixm^õºV­%tÒNš[þíuµÿõVØ{¯ønƒÿ‡ÿÿý×ýû~¸ãöÚ¾˜L#G?#uSÑ+höÒm+T�+ÕÐV‚t›§KQÝ/oKTU·î¿^¼ÿû°ÛÁ¾°ÿæÖ¿ö~¿÷®ö¿¾ÞÃa¾ýxDG &Ù‘J óe„ +ÇJÒuKKðë­~;ß~פґÂÕ}v>õþ¿ÿüÙÿíýøpÿßö¿ûëïõ÷Û©ÏäæÒúIé¿wT×ÒüTŽ!I·K½Çýá”E_öõïÿóbÿ²aa°ûþ—ß‹b—Þîÿÿõ¿ö¿œÒÝ_omºêÍ'¿Wö¾:ßý® ø}¯ë¤?ë°×ÿÿÿÿ…Ý÷ý}ö5]û:¬Âÿoö×ÿlÏÿº¶ëi³’l3siZL‹žëÝ¿ôXäsú�ô:¾»íÿÛÿüžÿÇûû¾ÿª÷î¿{wÞ¾ÙŸ~õjØJD4ÓõmÖÅ&¦Òa„˜^ãü±ÈÏÿñþ¿_ÿaÿñÿàØG¿ÿè'ÿÿkœY…ç?ÿÝ_×lëmŸúëµl%§¶’´šÛÁ:Ûcm‘ô„C +T0 B P�ÿCÿúÿÿøoÏßÌïÿü:]wû¥ÿïÛû«¯ÿÂ(wÃö¤AÃM†q^ÅXJÂVšlPMSm+ôxdø`ša´[�·_ÿÿÿ ïÿëÁ¿A?í÷ÿ{¥ûÿªÿÿnÂ(w¥i'h&œ1m0ȯ­„é²}„Ä&!GŒðÃ�l�#Ü2brnªð¿×ÿÿ„ ÿÿßÒÿ¶×}׿ÿ_ÿv¬…Õ‹wZKupÕÝ6š…Sà '®(áa(^ÑûÿþÒþ÷^÷éÛÛúï9úûÿö¶[i¦›Å”Œ–’B"+éÿÿîëûÝöûê«ýûn»þsÓû_\"‡}·ph›MéÿýßÚÿm½v§?¯ý½¶Íu°×¤äQÞ¬28ªŸ [M8>)V©ë¶þßû}¥·ôrÒ°Šý¶› ÜÃ0ÛI6;K„á4Ù)ªm>�šë×ûÿ·íë{g¦ýÒÛ»Jô¯m5îÃÅ6¶GE¦jx’2|Q];% ÒµµîÌûÿ¶Êá«g)ÃÓbƒIÁÓ`Šu ‹ät¡Âqtï• ­†!ˆ†ÎÆÐÇÐR(áÙ{löÈòz±LBMŠ…§l&:GÈvƒÈÄQ\KZP�ˆI†!&›“O ÉZ$a„2 B”lŽ‚M4Ò*Øa"­ÊÃÍynMVB&âZñ¤ºCÇÿNŽZB�9fä_Y7ÐÌÉ4ú8íýåpqØS'xÕuÕ¤‰º_ÎÇÿ&Ç×-A»½.Tó)ʹÈÔE§Íw�‰ãZé‘A‘$lh„ÈA„ke˜ k]uÔè2„l�I›‰ÑôFh„o>2"M?öÒl³‰áwß§’tD!r eYB°ÖGåáðØBy°4ÓL%k ÓäÂRuTV6YâÚ +n¦ûü“#YŸ2ž„HXB°ó"Y †¶¬=ØPš»Õ<šhŽÈñ¤ÚM«ºîª/úç`¤ +WýÉjù3ì—DcSL¹h Ó´Ê;ÏÄûaXrqÒm&äÔDyWi¥wJáBÒioÓÝK„ÎÆ­]Îý¿_e&˜A’2‰OG²×IÓÌÚ[-t­¡eÍ6“ºÜ+QôÇúwWIýì>ÿêâ¯c¯¯ïLóG¶†JÒ´•«m«ê–¿­¤úMï¶—©+ýw÷ÿê)?ú¦kZyÆu-ZØé>éZ¾ÿú_¤ÿñ¨ëµßßÁ~«ÁûÿéE¬É^¦F*Du’Q¢)ÈèD9ì‰ÔFÄWÝûÇëq­ß¯uˆá}kÛö¬�ÿïØÿåM -‘ì1ŸGÌÆDh‰à‚_Î +l‘í¦¡¨Gæ—,~ÖÐMëkÒmÕWÇü¬~]^¿ƒn¡ÿõá¿aÿÿ®eI2@¹¨dn02F\‚.ÜlQùŸƒ +û:NËBvY ´¼o[÷ÿøÖÿëë_ÿÞÞ!¿ÿð߃ÿªy##ä`ÈÄSŒáãˆ� h„óÛE;~ziè&ÚiR ¸z}ØJî–ëio¶©×ý_¯×ÿõÿÿÁ¶Ì ßÿ~ðûÿÞC3©)5£¦a”ù²$ +EÒ„ƒ6†°ÎœÌì&‚´Ó“�Ü ÎWJÝ¥[õU}}úãÅÿúÿÿÿÿÿá¿ ÷ÿ¨ÿtBaœ0�`âÍœ�ŸÔ&vF6ô›I·tÃ>ÂV™ãq]]GnšïUI·ïo¾¾4¿Ñc‘«‘�ûÿõ:²;÷ÿ¿ÿýÝ ÿÿïï¯ýéI¹:] +ƒ8tÐA:L0‚}éÛí'|jön(má×ûú¼}ä©ÿÆ�?ÿßè¬þi¿ßý÷øxo¿öÝ~sÿÿeÍi;Nè“¥§Iý'ëÿOwí^÷y½¿‡êÃÿÿýÿÿ{¯ú_ï÷ýýþÛ©Ïÿÿöÿô«ú =:é}¨ûOÇý÷ ïEŒ¯_°ö釯ÿþŸýwýÕ}ïݽµòŸÜŸöÿnë«úý²þ›a--G÷ÿõÒÿÑ~QÿØ=ýºÿØ~¬<"‡ÿÿÖÿoîý/õþÛûozÿú»=n•¥"§Ú]§šlW]¿úÝ7ÿøþÃBÛÿ×ÿ íÐ7„¿ÿþ¿®½ÿ_ÿÛ¿lýwi}ÕZL‹â“Ó Š9Hi7M&ÃA&©µ*Ú=°ac¯ÿÿëÿÿûqÉ�a¯í×þõ„¿ÿú·ûk·zßëÛ{ äÙ´GIì0“^dQ %NÒvÂL&§†ÃB,! 2¸«_ÿöÒÿÿÿðoõÿÃý>¿wÿûzÛnøméÜ6àÓb˜´Â ˆAŠa6¡Â»8cÂQ¿×ÿûëÿÿÿÃ¥a¾¿®ÿ}†ú_¿ûÓ´í[A&ÈPdX é´í]ÚÃ0ŽŠV2† ƒ"4"8#?ÿý´¿ÿÿý½ßûaý{ùÿ]»ÿº¦šÛ¥†i„-gð‚ÿÿÜC…íÿÿ½[ë¾í¯œýÿ^Û3ÛSýû ÷Y”È iÿô#úWÿÿºç?®ßzµn¿«°Ž;Ì+ 7w"[بˆ¯]ÿþ½öÿöÿ4ëmºÒÛ3ZÚWzKV”‹�Ûb˜í„ša…õÞÿÿ¾ëmlÏûÔ侕¤› 5a´™>H7n˜Tô žã+Œõ¾×þC‰½Òa÷~ØKNÈý¥¦�¥¤›¦Ø"‡L1H«á“ÙLF½Ûïï`ÛqÛi2 1ªi±IìS -v*ˆã5æ¬í-®E6ÍÌ‹Ä ôÓTíƒ¦Ò &J� ¡ +V! DDq^!Ðb¡0]ªs»ŸØqbnŠ’£[hA„ #´ø8޵ø%éW¥um$Çh"lŸƒ"3‡Ë5>I)f)J²Ð)ʤ¼¿ýþÿÈR£½#º¯Ü^¦z�ÌUÿúxaùj¤¿íÿœŠCÎF¡š™hE¸¯÷ñ_+Rá$ �gD a¤™hÈ dÍ�‚Iü;ü‰™)gTA³ñwç<ÊI$g²|þOú3°©2]E[A6ž¡=ÿó!<Â"�Sª6Š362‰†í›G㙤a#Ù¤š_Â¥>Ò†¶—bê°¬]m\· Šë iÿÿ�LùšâB7•²$fðA&lSÌçäxg�SA8V4˜j}¤ÃMÒoÃÒm«¥jûj“î©´!çiÞê/FBß%àR®3Í–N�Ç2èÒÍ4Âdý«#ãN HÒ'kWÅ+Aœ#Í]*KMµÕ¤¿ÞµMt¿~ë�;[ÎÆI?êVÖ?sLÍ6šxKbü&y£ÛV´©ž5i]¦î•Ó^;÷Z¦Ðÿ¶“ÿªõ¿ú,r4SÔqÿLÔºº«¢,=mëáéuK½x·¨ÿ索»Ãúÿ÷HTkÿÿè5éæIfKk$D¡ý,*Œz^þÓ~®ôÚ½ëz‚µ÷ꊻèô¿¯ÿ¯òq]¥;MIs‘¨e’jG>S„980�fAàŸ†ÃÌÎð�Ì%Òÿoý-¯¯Ýÿ»«ñþÐ�ãþßþ¿í¯ˆù_\�È“F4Bd höÑí„lqž3ôý‘bI´ÕRmaËBm.®öÓõ¶¿ã÷õðÝX=/àïÿ×ô¿ÿ÷Küë锈¾KÄ1JŒÒ/�ãy„s4Dž`Â@΃õB?OíH6�tm4% „i&‡T® Ý/õ¼>ñú÷þ¿é‡ÕÿíºZþÇûÿþÜ/ó#&D³Q¢4H2Ç(sqe!0Ê ƒGÆj‚ ¨˜àÙ:uI°“²Ïa ÈæÌˆºV®¶õ¤îúOŽ©íú¥ÿ‡¿·ÿ®¿¶¬6Ä0ÿðÛuÿ‚ ýïÿ̹#ƒ(1Ѧ0�È1äægh!½4›P�m'\$é4îG4®½&éý¾ñTÿÖô–ÝÐÚô5ëì?×_÷n¾ú àßþ ¶‚ßô¿ëûÿÒ¼ínM4Ñ­„™T"ݤÉjNwAœ4›–zMÛk¦×i{ôý¯ï�êG q·N¤p¯u_ËŒÿ–9×ü7ûÝ“­Òý´ƒïßáºÿKöÞÿé{êƒ63�-ZP›i4×Ó¤Óé7^4*šþô(izV×O¢Ç#_‘Ÿ®ßãþ?ü7ù:ßÿ lþÈÊ› ?þézÿþÝÿ§÷ªM6¯T¯¯ïN¾ýïn‡_î‚ÿÿÑuƒÇô…¿_×úÿá¿Â^?ëÂü_}ÿÕ¿oÿl�6ÚþÈ<ûgýZ~µw§ß÷è}-ûynTþ]_WÿØ{iiÿÿýûþ»ÿ óÌ‹{“¯¿Ïuÿúÿí„›nÓÓa¦¬R ?O_nÿÿëûâ5ÿÿÿþÿÛE?ÿÿïïïÖ¿þºÿ½wíÿòìÍ.ÃYpû­6*D£�ƒôýl0·üÿÿÿ×ö—ÿÿÿþÛ¯öÒÿþýùÍõÿÿÖ ºþAÒké¶Ï¥îé†Èi² åL8'»tÔ0�°ÁB"hQH9؈�úõþ¿ÿÿá¿ÿÿÿÿÃ~½¶—½{ÿý×êëÕ£?µö!ާ·i5iH¾BóM6ÂVM0ÚnÐ6 Ñ’žÿûkû×ýÿþ ÷ÿÿÿÿ‡Ø­ïb­~ÿ»÷ö–—l==mmÛ½;m-ºa0­3Ø…9åÚÊWÿ(÷¯ÛKÿÿý¿¿ÿý×þû®Û§¯Û~Æ›iZ]»áknÖ¨ðÊób4""0„DRqT«ýÚ öÒÿÿz÷ßÿîþÿ÷5'o{_¿¶ÌÓ|2QMÆ�$UŸTÔ­¹ÐÄDRŠõ¥þvFñÿÿµ÷îÿ÷zïíjÉÓù§[×°ÎWÙ~ÁX0Xˆ�ˆŽ"–“ë­×úèÉþ‚ÿïÿÏ'Ýý~ÛûKý†z´› VÃ�¦Ò[b•6b †bé+®—[cÿª_…õöýºõ®ÉÓ{¶~¿t­²úi±N¬S¦Ä*ÛJ†¨e@Ñ«éZ^�$Ã.ˆÿúéÿïûwº_i+ Û‡Ã#÷¦Ä&Dz 6’pÓV0�aD !Ä#%a¾¶×Jب6#ÿ« óû õ»»Û8äL¶’i¶¶Å6+NÃ4ÔÑ $gm2‚õ„›H0m +ö²+†ÃM4Øa6DMŠa&ÚK°ÐIƒ8ƒE—Ã|+ [ÁÆÓM6馟l&§Š=°`ƒ +UBˆlDGaC Ð…•m3æŠs•’~RvW©ÑÚª-!÷Iýˆ¤êüV´¾—W¾Ò[i6’vG0Ëœ¦Ra† ØŒG–�ª–hpN«ÞM¢2Ö;|È®)L-ïÈwz™ËþA2êŸtôÑÚÇë–¢×÷ÝÄWM\¨ ·úÎÑùS�H�æƒH‰© Ó„k ´+D^+ÿñÇ\®³U£ˆŠI‘Ÿ04 B’fg'ßE]&ɸÒ$°L-üî«üí:5‘.d Ÿ3[(„Â�a˜ÖÎösu(íA°� '—ÍÝ–\´1m&Âa}_þtȶ0³djdèØÈ<"4Ê0™Dg‚ Í6Â6ù¾ŒíX¤›¦—iXi°ÝzoÝýu"»_5%:¢t¤œ~0<�0gxÎ+�LÓÓMA8A´ÑXÔ",QY]Z ÞšZzÇKÚ|v÷úx³"Èž&m÷|yÔœR„pŠÌÑ"&OOæ‘õ÷…za+²Ðϵl"-´KªÚv°L6Òëéµñoý½ÿ_EŽ¿ÿú FÀÂa0–œ™ÓIj®M4ldì'Nm'é:«öûu[ÞýwWøÿëÿÿÿ·°úaÿì?ÿïüŠ# 6É4GDxÑ3¬k›%ýütüi¦BÓT›­& ›Aœjé:__#…ÞÿUøŽü?ÿýþÿWKþƒ µ ¿øoÿþõ h„ަL®300°ô $-¦A�Aš‹ i6“p›Aœ3î_´Ë´­]]U¸M¨¤ÿëJHþõ^ÃÛ×I‡úÿÿ×á}×í¤è7ߨ?ÿþv¶ˆDuG¬“@Ѽ�0�„h #ØfšhÜuxdòL�!)8Tx 'I´´�m'VÒýºuñÅÒ·ükÿ�°ý±ý‡ú·°ÿÿÿÿ m¥û¤Pÿû}þ&YÌàÓQ‚.ÃöÔü¹ªh'KOJÛ¤¶×Ä:ÚÚOêšN•´ï»Œw~ûÚ�ÿöæ×íþÏÄ7øF�ÿýþ‚vá‹lSïûÿÿV“jš õ„ÚNËE&ÐgšºººWúûãÚ¦«éq¨®ÿMèÃu¿`ëëþÿüý/0ƒþ—ÿÿþáôôýþúÿûa'Lñ©™ê®»­7Mâ—�Ó¾õÛMÇþ‹ŽŠ›ÿùuƒ‡×ì5\Ø¿ü?¶7áÿAmˆÒÿÝÿP¿…ÜŸÿó�u­ýÙŸôÚ¿¤Ò^ëoõ´¤p¿û÷º,sjÖ¾+ÿÿL6¿·ÿ¿ðßÿ¿Z]¿ëÿÝ?þ¿þRuþÙ:×¼åi7yŽË˶$·l=ú�~¯\1ùs¤ïÿø¯ýþú†Ãøo%÷Æýûûýõ×ÿÿuÿÿ�J?�ÅN´êØ`•û¥¦“"b¢i†*½÷އޯᮋþ¾xl?õÿÿÿðØ7ßàÞ_÷÷ýüâúõÉÿýÛ¥ÿì&ÃïoI¦Òƒb•4á„®w`”*„ÔðÑâ!ÿýWÿØþõêßÿïÿÿ°á¿_{_ß~s¯{ûô®íú¿ÁÝö•¦ªšØ7i¦›mÖØA4"¯'@Ä'`ŠâO}ÿÿý‡ÿö¿6¯ÿÿÿýwwÿÝÒû{fkõÛ¦Óî­.Eö”‹�dq°ši†ÒTîûiçv°¨5•…[G­?n®í+Ób“M;[a‚ +)‚`�£%ˆ½,2)TŠ8v‚m-0ÆÃ6Ø4Û$Õ°@·}‚ž¨déîUpÄ)¬ë«¬¢Þ¼F ì-„ í…[DŒ1 AÐ,ÊÓˆŽ=h'‹MD"9Ñnþ— °„e—ˆ­xÄGô»ý¯ßt¬'öIÊr³UØ�±A„èüÑ_ˆˆå¤)K1õ…;ù7„W'-ÇŽÍ`¥f_y‘«&„HFìÎ×̆.v–œ‚DáB>=ÃY׫…U}ÿh®%jŸQx$˜}c�©23¡"'MŒ‘w”3ãårØÓ5":@ÊÍ£™ä]" dËó Ð #X~CÒ9T¨‹GwNÃׯó±(§gDpÊx¨d†S¤@ eÌ0��j=‘âÔ ›A7&v} ›U4wÿ*ã©äâ›f3†Iä|�ö¤i„Ê4Ïg©‘ù0˜F†¢Üš{M2Ð� ©:¶ÖÚäÝnÿ§æio3�‘òtgÙè'£Ccs¬�ºNˆ®Tx ¤Ã‚Pˆð6×t¯ÿzÒuÿTËsÛýItGDx‰�I�HÄmè�~¡2x%…H:"ÃÒpÂiW[Dæñ“«½,/IÿÛKõ|`Èézã;*—ÜF¢3<ö]@ÍsVùu¥ Î¥ªŠÞ—¤¸¥ïÞ+v®îõêG õ¶ßª,î‹ãìµô�&¶Ë›uî¯ µÿvõÛß­íÛzmº~±þHö×oIëñÚ­­«½7¥ì?KvÝ/¶Ÿ…ôö>ûÒì1ß×H~½?Zÿ£°´FñÊ¿&2 �2$EêM+xëçAÿ»¿¼=¼v׃ÿýßÿÿü=zÿŠæTGwr>EÖD9H‰ƒÊœæpÊ#ðM&En�×zøø_õøýp×}ÿðŠûk¶§¯ÿé¦vã5HG àÈ< ÂL3xG°ÌàšZMéÈÝ¢#µD[i5Õ¸}7ûk×·×°ÿ]pßÿýÿ„Ÿý/VëïüÉ#$„ˆ”#¡¹ƒÁ‚ åù°4~i„чdú£8i1Ih� ' A´KÚµjµ°ÿýüðÿÿÛüºÛ)Ùÿÿáþõ·ëÛÿfCæÈ F"50EØv¡©ø#sTçý0ÒmpƒaPn“Jðµ}ÿmÛéëþÃÿ_ÿÿ þï®  _ÿá¿ô¾ø|6+{¿ÎÉ% ¤ÈÉ»„Ó:m9h¤ÚgÝRM«h*úö’öÒÒÚv�Ú×þßùÈï{ÿþüý-ë—úÞ¦{ýëï¾õßûj2ˆù�éúV•þvè�ªyÃ: �ÆqvO‚2„Ô9¦ša0“i„ga'T˜h‹ 'ªûÉqLÑÃÉÅ9›Ï ‚é„l —N“h�á+kª ái6›«…Vá>? K]u3Í’?IÒ=Ó=$ÃØ,ͤÚéh&i6–šþ›ÇIé»�†C†*d˜‹ï²Ðh2x%„ÂNfËA;M$Û-"·KQIá>º»û¦›öýµÜ¬5´| ažA××ZOGˆ*N¸Ðo_­·ûTïýõý¯B·½[øt›&Â[-BmÒ×KÃêÓén©_Ýoë–ûòÓø}“Ó¯ÿÿéÝ-ïo¯­¿Ý!†?øÿÿì?ý‡J—Ý[Òÿô¾õûüvõÿöþ’ÿÿ°ÿöê*Ýëõÿÿ»×°ÿô«ÿØÿÿþÿɪï¦ñÿõÿý‡¾­ÿÿ†ÉïÿÿÿÿÞ»Áÿ¯þx_ÿöàºÿþ „ÿÿÿ·Ý{õ¶ÿÿÿÿá¿Ñãÿÿº þÛÿïÝÿßøoýÿ~¿ûð loÿ·_÷ÿÿßuóËþÿ*ßxÿÿ¿épÿÿuÿ»ÿÛóš]×­~ƒÿ…þº¿¯÷×]Þ¿Û&ÿ¶ßëm™ÿÒº_ç÷î´½÷Wÿoþ½j×ý»­m´ÿìÓ¿m$î^ÛWõÿµ¾ý{óžë÷½w÷iHƒ†ºm²+ÓM4Ú°Á:M†‚°¬‹Eo£ËÛ­Wzz~ënþºìÛI8i¨d(ÏÚ{"+Mz4D0H÷$ Å“ˆöÕ}×»ÛI´˜pô·ö•„rVé´“{¶0š «–ÂØnÛÕÕ·\ˆ;Mé郡µMƒÂlŠz :ðÄ)öRDFÈ£—6‚Òƒl �l'M´ƒ*Âq¬B5°hD=ˆÐˆÃšV š BGÆÂ%(íED~ !r¹ˆuˆÿúø/ÒØO„Ó©n$‘Ó.#ÿ–’¾Yªå#t´ YR²!òo4WÉHÏÿ–ô3± Tÿ~Ž;UßÚÇ&ägcAE'pþÖ>[¨ÍhÐÎÃI0iÍC'�øþe0§f‚ÈgÝ#†¾«ÉWùÈþn̬†ôß 4¹ÿ”¼‰ÇFSä‹ ^ˆ¨*�‰žÓWDÎÛÿþ§jH�å ŠŒ,�# 0EXfŠÂ{Í3úA’óM¢¡§„ +½õÛkþžq� 5#Är8ˆñ˜Ê¼Û4l3FfxA##90�ÚÔ6­«¤Þ¶“®!°¸A~ÚéXý2´�‘ ÁQ¨0ŒàÐqFÀ¶‚nýêƒ8i6t­]ioJÖ–›ô´¾’ßæNÉ|Ø¥Ñfˆç"yøô'äç  Aü#;IÙb pL$›A:L7}-RtšÚí/O_wÝð’Z_ötÍY2þkÍpgŒþrG ïÛé?çf« ‰HïÁŠrh43™óOä郪i&ê4¬'°@ÓI[JÛ¼'Kö×wÿÇ¿Õßë¡í<~JŸßÒ;Q¥¤fŒâ …™;!„ÒÂ.<$Æ¡ßÕ·j’·a%tï×é?íÿõûi)*¯ýnúº,ž!ÿý"(Α9‚ ¢?^ÒÂi£``‹È]Û� ›'T˜'A?Õ·Ý_½Sûö´¿qöÿ‘ˆTßëÿú°ëõ÷óƒH#Ž 0P�aªa ¿¦¡éh§è'kÒ÷Gt“‚*)x×ÛIvÅUÛÒUÒÿÿû¤…ÿÿý¿Û¯ÿH$z +Œí' +¨ß]$PéRa ©*P¾––›Ik¥A%ôÛzÿ�ÚÐýÿ¯úíªÿÿÿþK Š þézøªZ ´­z)éURI:;×KK¤†½|ikú¬²+÷X·[}ÿÿÿ£»¯ÿÿÿÂBáïÛÿJÑâ––“„´½R]*JÂé/ú¥ã^*¿÷ý,â_¿ÿÿÿ'_úÿÿÿþ–ßÛ_úK¥IRé}µÒ¥A +OXÒ¤¾«},5ÿ·kÿÚ)ëÿÿÿ¤ûiÿÿÿÚï{‚__¥×Z]*B—X$8®’]-%UV¿×ÿE>¶ÇÝ[¯ÿýÿ ¶‚»ºý¿ûý_í}~’HUuI(ô¸‚ƒ­uZýRn½/þÚOýýßÿÿ¯°ãw×ÿý½µÏ*onw_뤕c -Q1Ë•RZÕu •úT—ÿìmý´œoëý¿ÿ÷»z×µý½³?×o³É�Çô–ÔèË’ÔV©i-b—Õ*UUX@�ÿ«�¼7ã‡î¿ÿú®ûm¶­ûözVÂR+‡tÃÃiÃI;â$—A$´¾«Uÿ]MÓi%ýêwÞû}Ö¾Úßë{Mž›>®®öôÓL1I±M;bÈDöš*Ä$ha +Ø\0”T’„ KT½~•})7ºZ_½÷vúvÍêß÷涇/{ÆA0xVU¶°Pš`¥  Ȩž!~G-VºúIZ×á6©‚ þéo}æsö &ÝE§±±öÄ'bT + +ÓHözFQ†dýA/Á%µê´¡}þ’Kz‚A%›_mza›DtÓgí1VØA28¦›#‹PÂtô" ‹·"wY`ÒXô§¯Òë÷þ—æÒŽ’ÓM´[á‘&ÖAðÄ&†VQU„YUý}*ô•=R TZ›]dèæê·]SM´œCBGY¢Ï’Wëë¥Y¿]zHÚ¥UÉúZIÖúJ× es”ž[ZÚN—¥úJmuÕÖ––‚Òm-% ZWXJê*"";h+ìÓ¯'U¥¤�I-Ò°–ºZZQZM„¯ŠƒÒì…’ŸÒ]°—¥¥„µÒŽ…6¤ÁÚ +š¤ ÒYi6•'a$¢�qIÓh& +˜P˜¨@„ ÂdT#XÆE½Šö+j¡›T*`š›È€’°Æ‚ 4š¦˜TÂa4�ìCWÒâ¦h›*O-C2ÛŽþ·î­¥ PÈVCQòÍ5u–ë1ØURÝ )…:·¯oòŸ+sOõÓÿs!ÖvIr&µ2TÉ�e*ãH�fÈ�Œöo¿átÎøŠtuÎg\„Š (aá5é„a¨M;A\Gü‰ÆfC ÍCD$ÉŽa†ƒ'5†c9 g”6Gè׸@˜i_M ô›Aœ4Òn@⸪È5›‘d] +ÂH,ré)0ƒL#CÖEã`z?4­&) v�-'Iím'Jé´Kó!¤l�q¨�%‡‚¨Ø 0š óTˆ®Â=´�&’m–„ÃIÖ‘'«½X¥×¥ãôÛ�˜ìË8)à +™?fm–u®J3™hM¢;i^ðÝ+ÚJé^ºz»üŽ¥#…wt,Œìº8GÙùü‹í†¡&xÕÔûA:O ¤Ú Òÿ«õõÒµ×zÞÔ}d†y$oËHÓ;5«BÓARµ½¥m/µ¿Ýßvº÷wë­ÛñøuÕ�ïÐP°¯Õ-öÚA¦ëÝt¾ý+wKúñþB§¯þ­œPjºÿù¨e .%õþß®ªÚ[û]m{¿þ5ÿ×¢ÉëW¯Éoïÿü(W{ø¾ªÂqñýqûõÿþÿßµ÷6°ÞKïÿý•Á3'õÿ·Ðаöÿõßûôÿûzÿ5[u½ˆƒxKïÿÊóÂ"í.vk;ýþ×oÓÿÿÿÁþN»Kü �ÐY x{Aß^eh(G¹ûó²´v.¿ùÅÿïþÿÿáÿð–Ú íRèuØo¯¾úöv–*¤÷ÖöŸý±þÿÿ5/ÿ¯Kÿׯþ’ÒÕ}½{ï­¶�!ݧÕs‘Ôy¤h!ìÆyÿ0¿ç¿ü%õïúÿúZ ÷õO÷%ýÿnÛ4ZíŸMkGaøù%26JG‰Æj#æˆN„6j ^8¯î=àŠ‡Ò^÷¯ÿkéÿ­Ýª÷¯õ Í]íŸöÁ+A&à øù^ˆÔÊxÔy‚ÉÅEXfÅ<Á°390Ÿ„hh+ØH&ÚkðþÒoUýÿÒ÷¯ÿÿ[6›4[uw!ŽÃ:´ƒ ¹ØE;V)6+I6+õÎÀÙÕ΄uˆñf#86O aè=ƒ ; +’y4&ÐgGÆËD[Jú­ëþÛ}õÿ~¿ö¿k÷öìƒû›/º ¶ÛMÁݺb/lR¸0^¤Ñ²:DN›"/�LÀÐ`“ #Xf0‚ 4i6�˜4žÃÒm'v±zºbŸÝ|$«k÷ý&õµÕ½;Ò»m%NE5ôÖ †ÅC 0»ÚÓÐdªvSæ¼”‡'G<Ïd‚`ÂFÿMa‘¹6Â4:´˜¤i6–�Òá7­Øêž½Wú‘Âõ×óþlÕ™Ì0½Õ·{eûl6šIÁ†ÐI§é¦[j°Âiˆ!tDGóH a¨ØãTÉäí) "Ðæ“aPL7IÕ¥´ª·oÕõ]ºõ#…wÿäbP‚XƵmáöÃ8“¶Bû½ºi±Uò¬« Zb§‡*- +>b""Š"")8ú„aÚN“l¹Ó>Õ3í&ž›[®­z×QþëÛã‡ðþIþ…×ëpëOd% x´â Ñ]WÿÓÒÒ¾½Õ]ß­xè}ÇýTjÁô?ñ{kWwEˆx¸ˆÐˆ®�{_¤ŸÓoN·ÓÇu¸þ‹)ÿïì>›×ëþþ¦QýiÅû¤èW¾ïÿ貿ëþ»ýûzA‡ÿþ³?t¤ÍM¤ +žÿËrGÿÿÿþ»uÿ“�üoÿÞß5Ú¶‚Óý|{ÿúÿýý/%Óú*ÛþÞ!¾ÿýöï®Á„d`ªVúÿý´¿ÿÉç ¥á/Â_øvïÿ÷Û¼¥ªÃ"2ÿÿÞ¿ÿÐ^¡Âô¿Kë·ßÿý÷¾KX��úÿÿ¶—ÿøK¡µõ_]÷ûÿû4[mŸŸ„ÿûÿÿïÿUwׯë²/ù?[f‹óók°Â­°ÂUÇÿÿÿ@ˆë÷ï×[¿Ö×]³5Õi6]0ÂëÜ‹t�†!ví½ÿþŸ÷ÿðËͶ˜EôÃí­…´žøØ„ƒM=… "*ŠaqÿÛÿþïÛ3ÿì"‡ �g&¶Þ´¢ÒMŠa¥²*a"®P‘îæ@kûkÿÈ`«a/M;mŠ BÇËé4Ò*Ä#R1T ØÏÿ{g/ôÓM¶ ;biû´� 0‰J¬Ëë´Ó [Mš§vÒ<2Œ;ÊŽ+IBi¦ÉXA‚•ÅaWö猪ÌQÑ�é|®dù:2P¿Ö�(ˆŠºuÐõ­%úM¥ã´˜i'RÎ¥ 6À£,¹ød#0‚ȱ)=àĮ̀®ž;ÎÒßøh}ÿæB1�š__Zï̆¿;êL2Ö?®AbƒÀ8ëçy)Dft³^�a”A0�†™� ›ÏÉ6�›9ÝH‰y–")�ãDB|„Í¢_4ˆ…ÏŒ�YþóM´hŽI´ÒÙh«h'¦¹Ù|“$HÀ2„ldWA©ž}y<‘ñý¡rj«i>•¤Ã@ƒi]=>©7½T“ʳ͑š6�²œÌÙŸšfraÈËšBÈFˆ°ÙhWê­+hŸßµõµwÅw~Úå^S£Q"$ʲæBL¤Mä‰a‡'4úMªŸ4šIÑ.ª'íêýj—ÛÓQ¯Uï´6«ô¿”ë'៥š-É¡„§Ï ôî¢7IÒÒoßU÷W¥µ¯Ý/y +ˆûí÷W 6˜‡uÝ*{zmß÷k],>îú¯þ«_t>�íú,eþ£ût—ëuï¥÷»ýÿ�¿ãû«ëïëÿå˜a“ýSýÕ·~Ûþßü}ÿÿþ¿oÿÿÑCÿÿOkUãý¾?ÿ¯ÿ×î¿ì=ÿÿÁÿòn’2I~ßûÿ·ì?ÛIýºÿÿÿü%ë×–é w{ÿõ¿ÿÃôÏÿÿöÐWø|§þÞ¾õþÿ20ŽþßȺï×ÿÿ6¼7ûi ¿ÿ¿ÜÞÿíu_uðžùn£Öÿ~ÿý±ðßìBKÿ÷ý¯÷uößêõþëÿý2·‘#ƒwù ?õÿøá%ÿýþ ^ÿzýÓ¤Ù¢þ÷K꼪é�KŠˆDä°ÖqÍá‰óÖá¿ð—ïÿ°ýÿ±¯ÿÿêßä'·ÞÛ¥«`•ȃ‡‘í´“ÌŒÑÝ©KD|îÈÖġ�CDO4Ê4|y fÆÆ‚ ¦¨&ÿÕ~×úüòÿ­ý¿Ù÷jßMž¤QÞÃm+A1I°[›iZj¾E‘R;%ã8ƃ4E›0�‡™�„Â0φ4|*»-: 0�V¡Ò¿¯ï_«ß×ò ßÿl3—«l3ÜŠ�¤ÅB}�„Ú .‚0‘áд�Ph#Z×6ά�’èášÙœb:Jyš0H0ÐθM ÏBüÜœƒT›AœaN‰u˜úÖ‡[Ú^jM7ÿý¯™÷U§i}°äQÞºiÁ±Pô튵aÄL!H·|§4D¡‚¬Ž²(à +'“& o&Ùc• ·uV’ºbž®›ñôën”¸G#…ªÙš¿ö÷„·z `ÞôÓM¸' ¦ž›A„â#>[ê„DG+­ÁÖ„ì#äצœ˜ù!&Ó•mG4˜i>éz't­Ú $ŸV©µ÷½ï®µÈå¥Ó`¾Ã¶àÔ6’kÚM7¶+z<ÛC=³*'í�lÑ„E¶Ë:l* óq—6•âÝ5Oþ“î?_øÆÓèW÷»îú!¶�bi¶ûVVðÑãb*v/‡w +M¥t£Öûÿt+i�©*þî‹rGü±Ï¯àþô¿!„�ìªvSêë[‹i_¿ôÿ©+Nûÿ¯ã_þ?Ðþß°öÕ™%*KéZ}Ûkíßÿ‘Œ·¥kýz_ÿ_ÿ††ýÝêÿµ¿~ÿ¤?ý¿þÿÿþðoouþd¶—I±OzÿØ?ÿÿßß_ÿÿþ÷Ã~þ•Õ÷m Ù\�ûÿ°ÿßÿÿÿÿ×ïÿðþûÃ}år“dc„#ÿþÿÿÿ¿ïîÿÿÿ÷÷ë¾ô…ÿþÿÿö¿ïïÿ÷ýþN¿<½Ýí¾?ÿíÿýõõÿþÿ·öµë_°Ï­³Ô~×ýÿýÿ}¿ßÛo¿ïöÌývÒ×Û/5L$›éëýÿþõí+õ¿ÌÓ{°ÎV»f =‘ãTÓm(…»l[_ìÏÿ×o…ºMÝÛ ú³ a„áð`ša6)m6!ZtÃA&QȨí}=·_wíŸí$Û¦6cƒA† ƒpk°ÂG†Oʸ0GT"b"#´­.Õ²þ•§ÁÚl…®©°ÂLŽ/†DDE?–@0ßH6’¦œT4–ÓipÔ2;)Ðmd^ØA0 +ôÚb‘XQ؈ˆÁˆøEÈ1E{¾#ÿÿË6¸ì-ÿ,ä’’òé„.¯¦2n^;& oá+ìb+qÛÆ_)£ßiìF +·á—O‘?O¯îû~¾Ýö±ëÔêD¼u/¾ãã•¢Ì “5²0�Öÿ�’Æ¢8ˆŽS9J¡Lå–¹‘™ýòÖWaÚoòÕ'ÏÆãÚ šú{ž�µ� Âüí:ùøù]O#æ¡�r‘™ç4˜3ƒ?K63µ‹üíZ"#\GÈyŒ‹Á’2:#Á&F¶Y¤��0ƒÐO]J§�©þRÍ2@ÈÈègˆ�Èñ>aÁ„˜f¸Î ¦I‘òm'TžÃÖÃÔ²W��¶v5iÿ�cΛ"à3LÁÈN5†Q‚g š8ì Mª*ÚM¤Ú©ò<Òua$ÚZJ0›Ò–é3µ6S°¤nÌïÿóH#aA4ÓA6‡,á0Â$=pÄ6–˜¶‚t­V´ºuÿ÷ëz•Ñ)Ø”à0F€ÿ_ÚÿTªÏ¼ù¤Ú$÷¦éá}~µîí?¯[Ý7�kðT›I·÷ÚÎÁÿê­mí¥ÐkWÇw^�ELkþ×Ú¿õêSþ&Òë2µøúÿx·+iëúÆPËøÿ-Zöýµß��µoaã�å"SQþûÓÓh‚Sÿÿê�ÿ¯Uû}zÿ¥¥þv§²> “dFƈI›?,‹ÿü´ý_ýÿÕµÿ þNÈíýy®ûïÉg“£Ê‘˜A„f?A„l §‚a=+ÿõÿ¯ïýÿÂ;Þ»ì7úö1ÿWWÍ3fED#qž�°ÎöÁÉù_?(A„˜Ñ#ÑYIµLóe &ÿû¯6.ÿÿÞÏÿÿÚ +ÿú]ò¦ð™Ð‰3êë*¨A”h,Î 8Nô�Úw]Q.ôÅ´­i·_ÿuÿÿÿ­ÿÿ ¹ÿ¾ºJÜîNgX�’�šË5åÁŸ@ÙGÁ„WDa¿û ¢;aRÕ_>z[¿ØôÚOÿ»ú— ÿ· Çïúÿ ßúì­]ûõ§ò(Gˆ)x#¸D} Î0ðO‹°Ìà™Gšm„Õ6[-Oúé: ½-qßüß_ÝHá}ýû/ÿßÿKûýA-üâíy™É„ +ÔY. ´4j|ÒÖÔ: _IµõÿÚߦúÿ·¯ÿäb?ãÿÐþ·ö¿úûßúöÛwÝuëP¨3„yÓ¥IZ'»uÒ½ÖÒßt¿ý-Ûuøoã·ðÿûô‡ý,wÒþ¿zû×ûo_ùö¿ÒÒNEpÿMk«÷ŠôëûŽl_Öëÿ×þ·‡·ÿÃýëÿÿÍ‹úý«k÷Û ³×Úr+†Ãb˜ÖÒ°‚N ¦½n—Z©+õ¨E×_¬þ½½}‡þß°ÿµÿÿÿù§é³?Þ½Ãã´Ô2bvžÂ{aJÕ±Q׈­ßëÿÇ×Äzõÿÿÿaþ¹µá¿Û¯ÿûÇ]‡®“Óm$ÓM7NÚ $ $ò*ÛC(ñ–Kÿ�è³úÒ×þÂÿç‡ÿþüÓÜýáÿúi„Øh4ì$Ä$a†Du¢±”"}¢#'Gkãÿ_õÿÿÿ]÷ÿÿðÿ®Ú^ÿãýÿ¾˜Oч¢¸ú"9ù«‚W1¾Iÿºÿÿÿü"¯ßÐßÿá¿Òáûþ?¿ýâ"ŠDDG­àŽ÷Kÿ¾ÿþ‚_ÕÿÖß¿Z[ûþyÿkûz¿Ö—ü ¶Òûÿû¿}/ÿ_÷×þÔòÿÿoû³þ¿k…ÿ„¼Wÿï¿ö«úºMýwç:ëÓkÖ¿�Ålõéåðà _TÚ KÿX�¿ß}ß½k·M÷ë·ÿivû}÷{pzlBM5b˜…†F:·ÿªŸm÷ï¾Ûk¯¥¤ßp­½;KK¶éƒÛÓM·‡†¥\�ƒëš• °Â;CÿÿÛöû3ûo³iêÑNÝé‘c…MƒÕ´ ·÷h�#NPI60•ˆÿîÙàÏ[kpÂ({ . @k"ûAX¸@ÛJÂOÙ@°äb¢:ÎÆÓ†D+{û‘GvÅ+!}¦1Ø„ƒi·a: tka“¬B„""4:x¢»M;N¶Pà Qâ `‘]Ré=-Ñã_'H«a„(ç“e«_�׿í¥_Òm/ø$Ú Ò§ˆí$}´ˆÙ +‚�þY¡l�ÒÌÈ6Tµ"%4rȳú¦÷õ·÷™EpwûNÂq‘�[zñÇ!8SK«õÖÑnX¿ôÌÑÄyÿ¯ä\¸º!,qW­<˜DN)È׌†21×(Kšg´k"ñ§GvOdô™Ó\ìfBùd,‰yhá*ðƒø¦˜FÀa3¤ç=Ø_I´š\Cap®õ×!¢:"y#X¥’ˆ"(CŽ!çxÂ5†‚|�é£s +ƒVÐzN‚m]¤›Iõµivÿÿ“§D|§”ŽÈ1’'axDT ùð0��£`a.òGÊšH6“ãgÚV¦f•¤é:Úô½z§[í¾ûuÈAIÃ4Ð40��ÃG·„†š¤ÃIÒm]'V•é+Q}´¬;ix¥®íú¯ßþÿúòx#amÃD”'&Ò}&åûPé6“iZŠ�5¾·ûªî¥Â>1¾+¯ ˆè}ûÿ몴“h‡]'_ý¾•Ö—»_ê;ÿ#…ýž¨±ÈÑ|kñÿö×õKíøô—ª{¸­Ðä}nûvÕôþY‹iXös¯û¯ÿúú¾`WûHkЪn«\F?ú—Xuéÿý/û¯ÿíýûH¾�ËþÞ“ ‡×®ÃÿÿýµÿÛ¯ÿ}/þ?Ã×ÿ^¶Øm®Ýmÿÿÿ¥wý„ ÿûõ_°ÿ«ý†zõÁ¿ÿ¾ýÿû¡úÿlÈ7ý×ü7‚8ÿÿüm¿ƒßßÿ|7ÿK×ÿb¿uþ ûÿï ¼Œ=ÖÝÓöÿmûkõþÐkí ¯ðÞ—ÿ·]»£'ÿöõ½ïvïÞ{Òþ÷ûh/ðú_ëënî–îjM_ý7Û~ÛwÃdöºò*4dôßïj½õ¾öuY�úµ_Û3ô›=ì3ÓgmCd ôÃ"ŽUÚ ;M¦´þ—ù¶×Û׺¶úêAçvtÙ�VKI�CÇá‘m؈£ÛEÎÂ�3³L�¯öÿT›ý³?«m&é»­&{!ú°i¦Åh&0 ¬DEˆˆ¯’ã?ˆùÌöG�qâ|ܰä#0ÿ þÏ÷íÓg¨apû¬ “�b™r½„綃 +A4�mØ0Yrzð��²<‚l$ÃIäÙšÚm°aWdTí&)ÅÓ BÒ»# “Ûb Š=¢2 +ÿ › 4Ò ´ƒxµNíˆ+M„ÅQBdfv±¸ý/«{ê×kÑá”f£'ލD3ìR"¯é%é[zI +O|•n":UÝ_¾ß÷¤ý¥¶?­·Ò®Ãë_àÛý}­nÃö–Ú ýÛZý¿û!ä(þŽíûi`É´Òûðß`ÈøACµot½_ƒ�ŒU½?Þ˜{Þq'íw·Jê÷½=7k¥Õ[J�†n  ¯dlÄC.6Òz Pm& …BƒŠ\": 1¦¡¿,ѶR©f27çÚɺ\vDv±”'ŒZ× +©6ÿò +Èœd+øZ¦ö¶žƒTüboxGºïô¿õ§*ÿï;"¡òs3G?ÅÇ×Ur­‚)çS%cÑ 5Dg£À8Á*^TÖ§TGD|�êÐB§ØL¢Fùœ‚tF;Òm¦¹Iår¤GE;!DS™Ð9@§Vf!E¢hXa"#„¦pÕªº êï]s±XÒ;r82@¡`�˜aša0�Ð�ŒÍÚ64¶Xô˜i7Ã].›U×½.ÖUé¢/Î3ª%¢6ÉÐA„!É<ÎM4ha z=„ÓA6N“iè&ÒñVÒøûn»í?[Ôˆ"ôˆ1á=•jÕ´ÓöÖÕÁÚ Òt­ZI¸&ëKIÖÒÝ'üê?Kiúø}ã럜˜é–€g¶®¸Lñ¶•…A0�u¤®�ouu·_ÖëÃûn»ÃßVê�n‡…¥j)mzûNéuª¸ÆÖ¼mF—Ö>þ¿ÿ°ÿ_­»íªw^îªÿÖ¼nˆsÞ´[’E«û~ßÿÿ°ÿãÛJ¯õÃïÞ¿wñý+–Ÿþ=/¯ïç‡ÿþü Ÿõèt0Çþ‡ýo×õÿÿʱ}ÿÿüô½*ÿø°ÿ×ý^¿ÿÿÿÑûÇÿý¿Â[¿þÃ_ÿðF{kÿÿÿú ë¯þýúõÿÿ†Íÿÿ ·Aýß·Kûíýoík®ÿÿÁ´ ÿÿKˆ[þß~ÿªúëú÷ç?¯ÿÿî—ýÿ„¹´}ÿ¾Ýû×ôÝ7Ýmþ•¤¶Cºëÿºÿ¿ÿ„Ÿ¾÷µ×KJý%lOV×K±mïÿÛ¯ýÿª÷Ù:öÕ³EÙš¾Þ¤QÞ�m&;A[§$8,Žˆè •§­×ûdkÿöÿý�~jà jÞØ$› +àà Ø@ ´2w�µ²c’«¯û}{g¥]9píƒ/[�±± +ÃÈâÐp‚ D�„Dfت[iv]_v•¶š¦Å&š{ ÛbL0‘á… špŽ‘ª2A«p‚qªa��O­ìEÞ¢­°…òt[¥!õ¶GÖÚG†!„WÍĆ,DDWðJ+ö¾“ Õ´“•Œv2²# 1kÈè�Fšaà�l#a�gaGàôm5¹i ^¹’¢È="œŽ‚)„h £.AŒA.“a[t˜i0ÂM¤Þ“jåœ^;Ò#S*zäR4ÈŒ‡òQ‘™¸��Î É #s�&G�ÒmªI ëÒm'“ŠM+zÞ7,ˆEf%¹¶«ŸoúdxœdaÈ0ˆ§=†L2ŒôÂM¦�íRH3�&Ù†&º»øÓ¯­÷ŠºO¤Û\&¥@7H™=ÿü΋Ö<Öó\¨ÏGŠN“%É´›I´Ã{× ´¯_¿µÖ4›j‡¿÷•À£²fi®ˆ8æþïé,²  Ï4ŸTØbÚêÒö)]¯íûo[uj—¢Ç"×õ_WùØqÝ]7çô.ûùÜ×ÚI:·_뻥ַíï·UºÿÐúáüUÿ¿•]Sëß×ò8¾•í¥ï_ZúÚ[þ¿ÓêÝCUÿÿÿéû»O¥½’Ÿôò’ãÚëÝüHooöÿ×ô¿Sà ?ÿÿþÿ�š~8Òç~”‘ä™’DN˜¡ƒ>ʲü?Vüÿþ úÿ÷¬Çõ·’ûÿÿý}¬}Ï£R#êF‡˜ôqD|ˆ�p‚S8Ï  ™}Ú +ý»ëõÿÕºØþ–ÿí¥„�µoKÿÿÿçc®³°$S¢>žm’Áø `‚Øh„Ôþ|v’ñ�ûAi>ˆí¤òÐÅÒoÛÿÿÿô°oÿoÿöÒ´ÓØKý{uÛ]iù­ìêD�äÁfò] @Ê!a¢¨Fr!áûÎÔnLxTžƒm4®––mZ}µú¿ÿ'¿ýÛK ÿøþÿA¤%°Ãº_mÿuõÕr(ŠDU‘ó(Í•“«k1Í`Â4<£3‚jÈôi„Òm“£ÛI†“ø†ÒwÇoªÕ×߯ø¿ÿ'ÿÍ=ÐXw¯ØÝiÿ¿[n»¯ÍHö]ŽD}™621Aš¤Ìó90šiá&éÒm/ +ˆî“A3Ã6i6ÐØêÚÿþ©í¶«Ö®û¯Ó¢Ç_ýþ—ÿ¥´6÷ÿߺ몹/íéöémÝmÕ¥�¦(õáØK§TGl#ãÏ,4�'IõA6µPŸ¿m'IýÒð÷¿Mk×ÿÿ�ÿþ—ÿ®ýßî®ý~¬Ñ_¶mm³Œ6’m¤Ÿ`šiYgbêêë +ü>–˜¥¯õûµ¢#úÖ×ü¾ÛÇ­ÿüúÿÿõM³§·_¿î¼†;awI¤Ã0ᶬSh ››I6Ò´¯Òû�Nýßê5îï_º¯õ×ÿì=õ_ÿÛ¯ý/m}Wÿ^ÛéÒþ›TۄȺ4â¸o U:†¥\AˆH®†! mÕÿK½þŸUºÿå§þßþ¾Ãû¯ÿ÷_ûûzÿÿ»m�w¶’iï§m„¡i°žƒ%P#$ˆE+ßôãÛÿ·âÁÿýÿÿ®¿ûì?tŸÿûAéy´ÚWȃ‡¦ž­¶ÛGÛI´–áí�4U°Ä!”†"8ˆ¥úøÿ¥ WÿÿÿÿüŸüýH…ßïí ¿í$ØÛI4Ø'†š§ü¯a±m"4â")j·¯ú°ÿÿÃþÚ_ÿÿþuÃûxKûÿ„?Ø! „¤xh¬mŠ ql+Ò Ýá‡ïÿ†ò"ÿÝ/ÿÿÿK}úµýÿ×þW„"" §B!^¯­+hã×ýÃÿØoIÿÛ/ÿÞ¯ý/Î'×ÖÿýoÛü7i(ô›¯óW‡ÿÿh/ßQþÿµÿûúuÛÛ_Ð2÷«fzÒ°ô‚VýÒßÿ÷w_ýûþõê¿ç_mÝÚê hË÷°dsé eoØ…ôÇþ»ÿõßzßëýßÚ¶¦kû»úNÒjÛd öEŠwm°ÓMˆM¤ +!‘A‡_þu_þ»d¶¿¯ õ}¿Û¦í4ôØ6äR0•ÁÒÛvaaQá£ÒÐʨÆÃLh ×kýU^뾬ú°O_aé¦Á˜Ù4Äšw Ø[‚(pœDs²]ÄDZ¿÷ÝõwÞ–ÙÎÒ l”4îÐm§i†Ø"‡A“°©Ìê‰Ý=\té¶_TÛm´•S[$Ã"T §õFy¨§²©•ŒEq^¿ÒõÞÇG‡n3ˆñ¼*OÿÿíÛȆþ�õëûú\7¯úîø¦;|ÿûuþ è/Ð^êû~¿ï®»Úÿ­ÞsÛ}„^§a¡ÿÿº ü=¥ö—ßuÿßœ_^´úýÓÕŸØi½ÿúýô¿Uú~þ·ûõýîÿÒlôÙ�m&$Çj:¯ï¿×ÿoö×ÝuoÒÛþºí½‡a½;IŠdqº BdpŸó±Ò”ˆ¾K²cÿ¿êßä ÛÓÛ×n›¦×JáëiZ ¶è0dÓYP ƒP�“NÊí#µº ý�” –…`4BL£„,2ˆ  +ÿ÷ýÙŸ¯ÕßÙèã‘m&ÐLv’aƒí°E´¡þ¦†R +n_äÏg²:=À°É@ó„}Ã#¶Nfv¹1áRa¢-´Ÿý·÷!Ži{eëI³”6ö+a8 m¤ÚLŽ:�)àÅÑP„q¼ÓØŒ{@�@›P‹ûL¹Ã¦}¤î!U¸/ŸeöÍÞ­±I§­ Ä*pƒ ¤]°Ä ÅЈˆqƽ%I°âÂa$ÃL_´¿I½´éé°Ø®í°Â»hCFP›2c®øT¯~›ÛÞ¿ßý®è|ÓF!¥3"ßþéýï]ÿ_ß]Õ¿¹ÚVéz[®‡º[uí×õ××ìþ÷�ç~¿úÿëÿì:Ò^ zZ,fê¿úÿúÿÃ}*Ó÷ý½O ÿ·ÿÿÿƒvèSºí/Â;ºÿý/ÿ¿ýö!1ÿoÔoý¿ÿ¿¿ÞØñþ“ÿcÿÿ×¼voõÿÿû~ÚùÅÇÞ)†õûÿïï_uû®×ÿ´þþÒý+íš'Û«÷ï¼0ÎL2>›¤šß­°»N—ô›!¦›i°Ò»dVTi± ­´“M«'‰(ÖQÂ¥c(f´K÷V¶ƒ$:Ef{(ï,æ�¹kš/ZRÒÖ#.Y« (PJYJ#·e*÷äߣ±³$R7ærïÔ·-‚�‡ÖqZþ2I™ap]+}÷…OÁi&ö¶¿þîvCGo~ÿÒ_çch�d�râ�ë�ÿ~A¢>PŽ<ëháGÌBfŒÌð‚Õ4Ž_õW* Ã"ÆGÔB½ óNÎöÈðt“wé>|ÐMó$¼–y,y´yËå8½ö�ÔÂe9œ®ˆ®ô·i¦šVÝô½µ¾eL2 CÎeãÍ$h>64h|ˆ…¥ª<©k\¿z¿»é^úûªÈ*ÎF¤A²Q˜#0gû<3ìÏF¶hr~~|zA°ˆ®ðÓ /ƒ]'ÅÖ½Go]êô¶ÿ_n9¬>x@œ�4Ïg¥A¦©Ú¥I‡º¾ÓI6�ý'ïÿoWïo¯IÛ×þ¿D;QnK5™´› ºM©òWJÝ ©6ÿ_¥oïUä1}/w]ï|vÿªoõ~åµ]Újôµuµuu¿Òo|wKm§õKÃôÛ×ßþ-ªÿÿ¿ßÛíÅpí´*¶¯ÿ¥þÞ>×ÿö}s‹º_ÿþýz‘ÒÖ»½«Ö­ü=ºÛÿIvÿÿ_aÿ¶-£�_ÿ_ûk\h¡ï�zC«×ðýWïëÿ½ ÒJô¾¿ðP”8cë{cú¢Ù.pƒ)£T±ÈÕ%&x´¦w’<¦5>­<¶T‘%�¾¼¶ M5§kÚÞZ«’ GˆR^TŸk¹j˜Dƒ/…T·WQÇúI{[ÿþ^×u¯Ê…�„$D¹Oánÿ‹©—çVE‚"ÌöHóLŽˆìà§ �fpOÏ-ý/ÊÔf΂šˆë°ÁÎ&nšAêž�¶ÂiQ99Ü?ïüŠy¶T#duŒf¦ˆO>ƒÁ?<höÌà˜ ˜i0ÒÕ ØLñk»Aamodz¢#²!fÈ$bÐ4ÓA6i'« =ÃEcKAži:M¤Úã¾—«ÓÿüïÙ¨Žƒ!ʈOƒ £<#Éä™B4Ua¤Ú Žl³¦ÕÐ&ÅÒzׯ×i¿Û÷ÿþldˆÞFðƒØs›/&ÕlCj­[x†Öéô¯µöé¥0ˆâ¥‡·~¾Ÿÿÿi6š=´i6–ÌtÚaýkÿTñöÜ_ëkQB+ø{xí¯ÿþÏšV›ki]xÓn¯O·!µ¥ôî?Ô²Žðÿúÿüز§{¥uª~¯¤íÿº,gßý}Ø®¿ÿ𿪻äpªG +¿ßïÿÿ­ÿÿÿ†ÿaí×ÿãýò8_IÓ#šíþ¿ÿÿÿü7ø@Ÿ_ÿïþ/â�ÿ¿þ¾p_ÿÿÉçÿü?º[ÿÿó°%ú_ëÿþÝw_ÿÿ ¿ÿÛýVÿýÿÿÿöÒñÿÿý/îÿ~¿ÿÿëÿÿÿÿ¸ÿþÝwëûíùäÖºïÿÚ}?ÿÿÿý/Öÿ_õ_¶ïÕz]»¶ù*²tw]ÿïûo­×úzÿÿm³=¿êÒì#&šªÁò!h% +{'ŽæfgûÊ+ÿûÛ¯ô¿[û_ý?m°“`švºW{§v¡Ý»Um.­'Ý^’oöÿ»÷_öôÙŸï ÓXa´Õ�ôÁ˜jÄ,ºm5ʪv 7]]m'}+t¿ÿm¶ûºÿ�Ç{Iƒ“MµA§¦ïva *B„F„iiikúþŸíûf}ŸNžéZzm¦žLBM6*{¢�UeDDGëäu×íz¯íŸ×l$à F›i&škðFÈ—¥e¥Æ©k­u_ÇñµMŠL Ø„ Èá&@‘VåqF†"9n,Äkÿ ši°§†�aã!TÿõÒÿ]gÆŠé!ôÿZÿÿ^""+^„qÿÿš'ý-:„¿ð¿vº}/ûý/vár—À½ïþ—ÛGÂV?~ÿÿÁŠ*�{ݾý;lGïÝÿo¶}¸EÛÛ=6¬0·r/‘^¶ÆÄ&Dû ¾îÉ\0ƒ[BЃB3³ˆÿÿ¦XT©”È$RÚÎÆ²Û‚üT‚ôÃï-wŽÒÿþZÅà©íÿ;Zÿ;«.»æF^¾r:¢ùP‹¢>o9˜ÏDvN�™èoæAh�ë“$BH‹ó†C0A 3H¹£dàÅ�Š&ÓT›úkšÑtEC“²è‘�‘âFiàš6„hjÚ“´Â % Èæ•òꦬ��Ùgˆ"a 4~ ™¦™Á!d}ðÙh óI¼[­t“¾’OA®úçeHº Yx阔ŽÑ 0Bû4‚ié6ti6ªÒa·­/סKÛë¡C–ª^kz‘ò:Î R#.`“0g A°‚oô›A6ƒ8Â>6Zik¨­5ý6©ï[®ßC¼…Z‹Dk#¨¤ã# Fêá4~jšÚL5IµmÅ–‹uÕî“~·ºôÿÇãõö«¢ÀÁ3‚a7‚äÏ>i6™ã2;I°«h/tµzwûWŽß·ÿE¹ ?þß_Õ´GmÚM¥¾ëtÜ'I·I5kòá+×­ä¨ÿþ>¿ö«ú¸N¿¯î’»n?Æ£ê�ÿM¯‹õÿÿÿaôÃþ—¶“JšWúú·¢‹ñ_ÿý½×ÿü�?ﺄ þ¤p­j(ü±ÈÀÿ_.¯×ÿÿ°û¯ÿð¿~•é}ùýK­?øïÿþ¿ÿþ†Ð_ÿé±Å/ú\~¿÷ÿÉ{ÿÿÃ|Œ?ýú_ôÒ®Ýÿÿÿÿí'ÿÿ·çOÿÿûßÿÿÿÿïÿþ‚ÿî¯ß íþ»}?íÿÿþÿ¿ïÝý_léúÿ홯·ÛW©ÃM‘G0Ëÿýþ»µ_öéµúÙ§¿µîÛ<.د÷þý뿽ûþë{ öÚK ;‘y¨b­:p›#‹ˆh4ŠR‡÷¶ÿþ»K¶û³5ÿÙ�¸LlwÛwmÓh‰"x0…•ŒÉÃ{ûoÿoI]-³ûmåðØ-¶ž›ØH2Q "‡žl#ã-Ɇíûy:oý³þ–Ýll‡ðlS›u½ Ä ЈŠAÄFÙÿÛ>˜a&Ù}Sb­$a,0ƒM4 ]>ø¤ö6BœÃ[ (`‚5áˆXˆˆ­C +Âa Óˆtzã#üµóª2Tb¶”G¦Çíüz^© ¨øvu‘ü€€ºSB÷-µ<£^[B°P¤_ùldv­…ôÜe­È/¿ðŸO»\´ŸWÿÉC$ ÌRލØá_ÈÄÿ�Ù¬Èc#á3dHFÙøøÑ­™áŒ†œ³­3ÿkùY�#©ÆtD PF³ Ö #`eM¡4ÓI´�ê“ 3Ç&åhÈOó±ÿO!Rå#h Ða¸ ¾öºN“i0Â"Å�ƒ“j™ãÒêÚº¦•+õ´ÛŠ— î•¿"dwˆØÉ[;{vˆžŸë•Ñ™Ðy8¦¦4BMɃÓüF¶UäЛ³ím6Ò}+Zÿ]$ÒõQJÝÝÝã¸ü ä«Õ/[k�´u3°FGe`Á„]½¤˜F·¤ÃCÑXM¥« �¤›ôŸÿ÷ÝëÞú‘Â×ÿ·¢ÓƒaêÿO¬Ÿh’yÙ­þ£ç`äDùÌ¡�Ë¡ì4¤ÚM ›Òa¡¥²Ð›DŸ‹jÝ>ëýÓ×N—¡»øþ¢¾+·ÿü6ÿAd«Â×K¯äˆ‰e>i„ù + :N–“ �+Òäá$úWOºV¾)^“~ûÿÁÿ +´µÿÿ °ïþZ{ô*ºYÙ•$3Åç ™ìþ³>Õ²-0’´´´µu½n‡ý·ozÚÿüW×Ñ`_×ZÿÿÿÃ`ßÿAuõùØN�¬Ó35:ÆlÔͳB +‘;ÜsßÐdsJö•´Åß}-1¯†>7¯Kß[_WÿëÿýëÿÿÿÃaÿúŽ–ªIR�³LôP2C4‚F3z„MÒ'ÛHá­„^]R¼WÒ§[Q_oÿô­VBž‹�_º×ÿÿÿÿòy¶Ò¿¿ÿþþëô‰n¾Nò^(>ÈD«G”&ša]&*“UwIº„á$N“`Žô½q^ôÚý´«±ªÑiøþ·ï¿ÿþãÿÿþ¶Ð]þõÿ^ïßôŠ‚D~Dª �”":HÌÔ#CDÏ4ŽjŽ÷ê¡Ú8õI…¢¯AÌ.—IÚGzTºè%UÒk]$¿üvµ¿¯ÿø#�ÿÿ_ïÿôºÞíý¿Þ¾�FàîÑ7­ › õI;ÐA6µH'GŽ:[K¥Õ'Î,uIVô…/ªÆ‚\BÒxÿõÁ„ÿü#�ÿÿ¿ÿö—ÿßúZW}»ÿéy×ÌiyŸI& Üi%Ð[ªMn¶qij©a ëAW]/ŠK¯Z’Ò­õRà°uþÚ«aÿ„ÿý¨_ÿýýÿ×W}»ºÿöÌþºÝ{¾•«U ’Ò¥ÔiRqÇôºQI±U_KKê’Ö–ºKµÇØÿAx6/½}/zúô¾ý×Ò_oïÿTí»¶Ý.ûA&à ZV’¶‚M>©>>‚U_ªZ«A­CÆ—êµI~µKª¥Uô¿ÃwþÞ' ¥ß½á/µõz׺ûþý³Eÿ{!Žv³sbm-BvL1 ´‚¶ ${) ô·j˜J´–•}z¥¥ªÒ]oõ]ªª×ý~ÿé °éWßú¿ýZ¯ßn—ëíÞØ[]8a†Û"P‚+Ã¦Ò ü„ ¬f¨2d2„D[ª]ð�%J©t©k¯KÕuzô–´!=iWT–¿·ÿ°Õ]víöõ÷¯ÞµÛöÕyÁ¦›lB[NëËB"žˆÍ }{ué$«IkJº×¥õZ¥_Ô—ª¯¥_oúÿíÞß®Ú]¤ÚVŠp톧²/¸V› …Û#…†= +‹ÄQÎÄDG¯KªO IkúúTµõ®ÚZú¬´ô’§þ¿ÝÿÿÎ}¦Ûm™ëg¾Epì¼ÚZh&Òl]60ƒi"­”m4T#/ß^»xéj•t—ê—¥ú +«J¿­j�ªÖ”Âû:ªoïhÏשÛ Û`ÌLRaŠA°¶!6’U²:  +ˆŒ-ç>—öë~º¯¯¥ªÒúqÒZ¥ôma!ýUt–—Û]¿ý9à +”†(1A…°‘�ÓM!ñ›(«ÒM¯tºú¯­}zJ‚ͤÅ*ÒS R»K8—Kzí.Ûm&E;VGÍ݂Ú ÁòÊjÒùÑ{é~ãÿ£j´¼ÂS $«­%Júú\÷±áÝ¥W 6B{p´º d™À©'uÒz1ïz +Œ*8¨Ú½wI%KK¥m--&ÒIj¶aÓêœ º•t{`Ì8GbØlD[A'½º9ÿÞ}k…T±x5ºáãz[¥ŒoJúâ:ªª ã„4W È’+ÒÒ¿ +¶”R¤\ ³‰+p•U,4©´ + AÔP(ÓA„k"ÜÉ(ˆÛWJÒˆKpi0U )‹lz¨QTÉ¡#Øge¨6µm[I´©;oi¦ƒ +¨E„v³Õ½a²>&A0ØE¹,C„’“yÍøQï}nº¤Ý[ØiX0‚Dm(cÊh’‚�mêŽçÕKb2¸àé¤d²Šš©Ø-'ÏUYj‚Þá†×iÔž÷ls.ÍH�©#£A” +¤w,ÞµÇóR#¢.Ï™Ðf³: +�ˆÂ6�n:‘¦ï“<�ûgu¢Rdš8f¡šÜ‹álÄ ñà4G¶i„64nM ´²Ä‹"ˆìvdaþ?ùVD4N‰q Ñ#Ö`l&°3Mm!tÕ6Â5µpˆ·IÂVé^5&ÉLÖf£ ïú¦Iäx—?=˜0�lðÁOÁ�“˜4�Ài6æ:`ÕÒaépM¤ý×§ÎÀ²Üˆ0�£Ùнc™Qd'"Lð\ÈAˆ�gUP‚mªXM»Ó A´¯~Ÿi§ußHUu0%Ü)–@¨Ø ´›w2ZYoÙÒɃ:(dxŸ60¹ GàôžLyé&Õž�dsJÞ•[}EßñÖèkß�ê<œß"4°¨&Õµ¼® +)"`Á圃ÖF6 ´Âiié7- hU&ÓoXA®ýÒ¿½µ#…kVÝüTX•!`ýû)éiZVú‘e•8Í‘‘!È„úM«êˆ±IÒÔù¥«JÛ¯ýµéb¤p­×¿ßòHõÿÿ_°ò�÷;53Ù �E÷Bé>û~vg�¤ˆ‚ÒY„ 'V’óùöV´¥xX&ÖÞém +W×é7¾ <‡=]+ø}¤?ÿëÿxoÿ°Úp“Ž:ëêAYÕ’¶Èú=™æ}©üþOänDq÷WKJñWKýÒzßÿ|}ýý¢Äý†ïþÿáüÆwªºa»¤ÿWW›"@¤èÛ4JxŽ ñžNi&{?”û¤ë¦–ËFÒ ˜m®­-¦�×»_i{®ëêÿ�Ý{ûÿÿðF�ÿ¿Ový'"±¨ÉJýÕð˜Fºi‚OPš[OJÒ¿W\zµ~«K­{Z÷ÿëëÿÿÿ_ü7ýÿþ—÷}¿_o"HÙ a'�ä4Ê(ëü3†–Ò÷i]]mtÇ=t·wz×Öÿÿÿ¾¿ÿûuÿƒý¯ú ÿÝù(h„ɲÛÒ ð¶Ží&Ò‘ö÷Ý:WA¤�ßKhW¯ßÕüŇÿïKÿþÿÿÿ^ÿÕÿÿ¯öý�WÈ4g¢�“çÿð©ƒbë¤ÂI½/úqþÒ¯Ö»‡Ãñ_ý&…ÿµaÿÿáÿÿí�×ßW÷¯þý¶öî¸TE‡&v-¥{zûm¥®·×ÿ׮ߎøŽÃ‡°ô«ÿVë áû ‚ ÿïÒ¯ÿþõç—Õý¯þ¾Ý™í¶zÒl¿X'j�oó꾺÷×KÿÇzûUÒá°öþ¿ºá¼ _ûi ¿¿×K÷_öþ×ïöýëþÂêÙɆ‘|Uñ_Ô�‚ý®í>?¢QKÿývúüÔ5a°öþÿ½ÖÒÿìRßýë_î¿Ý÷«¾´›=vÚI§§ ÙÚlPb˜L&EBíw¿úÿÿË ¥ÿëþšÿ¸6Á¿¿üÓÜmÝ/ý_ïí½×þÿÛIµÒ´˜¤Âm¤š§mPTk)¢h†ÿ_�ïÿú×_þN&ûhïIü�¬6‡ï×ô¿;TOkÿ§þþõvŸ·^g*l$Òm¥ë# A0­bÖ”¸ÿ¥ôÿú½z_×£ßþ›Ê?Òþÿûúè'½ÿÿ#¯·í¥È® �¦ÚI§ Ó B Bi d•„ˆDÛÿÿü�‘ݯ¥×ú_{¯I}®ï¾Ýÿú§}]¯÷!�x#ÕX0TÛIƒ‚îÛ /“™ûÿ_ÿ@œ6+Ò}ÿ_ø¦®ëœ_þÿúöG›4]0Îr+‡i¦­ÜBtÐl3a´MLB"#ÿÿý¿ô¸…éZÚú_ík÷þcóŸ¶Ýý÷lƒû¡¨c‚ÓNîݧG·*ÙFM•/ÿß_þª�«ÒzzÿÛ÷ý³Eku×Õ·~ºm†ØlS"èBŠÇ(Lè¹7J¿ÿë·þº^‘GúýªÚÿ{`•†í+K´ ÙsœŽ)¦�þEq ÿÿíéy úmñ¶“tzîÐ{a;z¶ÐlWwM„ +“lZ »ìŠô¿ÿúÍ6×ÿÙö}&®“ii­ƒ ØÞ�¶•„á„ �™î�wÿöÌÖ•í­Ú|8m±¦­¤õkm5=ÃDDe7úA?Þajà +˜IT6ªž›½°‚p˜„MpWN"4ÓV>ؤÈò 0PØÞ� Ÿ„Sу>ÖÙ§[¶‚e"/;KÜvÐA�¬Õ°£Êæ›Ób ìÐ1ZH2#T=%¤‚·Cl`ÜyM¹™rš*$qÛtS ØrÛSŠvv|$ëMËn¤F3ÐdÈ<š�n[5çe㤧„m&ý[–º² Ö(*éÒmªîZJ3#ES†‚!ëaú][;O®vŒèMË4/ +˜HCd&fŒ ÆOHù!šrSDcè—öÒµÊÆ§B# Ž  B}$@Á„|嚬f‚ž¾²œ™x+’¶¦·kÕ/ß:&4DVÔ¼¡9Í`ÉäÏA4ѱ¨#CH6“o, qÄw¬Ó +üwi§h0éõt¾½W yH‰ç°Ñ¬=0ƒJÂ$ÚLñ’Єékw,ƒÁWß§ÝÒz¶ëÖ®ªÊvÉÌÐÉí'&°�œ0‚m|³ Ú% +ªÒé´š]ûÿM]kk¶¿Ki{ºgÚË=Òmá7Ý4é[Bíuµ¨ÇÌ’2W�–_ãù\XÉs$Æ“kþ¯IÚ^´Ý~þ¯ŽþÚCÿî?Ò/�Vv%÷çcÿ”‘–£(ÍÀ�a’0˜G¶—ÿÕ¬¡î—Ò±JÿM¿i_¿é6ÿÿÐûúÿOÈBÎ&j3²˜ÎMY„ÃMÚN“×ÿé6Ãõ§ÿ}ûÿÑc?ÿ¯¯þŒ¦¿È\¤j#ÊF°ôFãÌÏTÃI„“j6¸@í¥n½þ–þÿøjþÿÿúÿúÈü•#1å&HÐ<Â3ÉöÉØ ü&“%ÌûAZ Žj“úM«Ö}~µª[~µ+úÿØ?ÿÿÿgÿñÕ2¶È7œgQ�:™ùsZ>@š?äfÃLÅRmoé+[ktîÓ«ø}-Ûkú[u·ÿ… ÿÿ†ÿÿÿü _÷ôÌ�© f¼»hð!„l­™µAyŸ ØI7¤Ú¶ÐUn »05ëõZúÕ½Ç@�ÿ#á/UìœJ“¿ÿá¿ÿÿÿKöÿ�4ÈÁ’ùäxS†g™÷"zp“i:¼¾i7N¡Ò}&÷_[ÛÝ+~+uéãþºñmºü`·®ïõ¥o_ÿÿßݯý¬¤3ÄC¨ˆ<ØÍ£Ìøy>O°Éàš³âi4�–té=4“Ói6¿¯®é-êÛ¿íï,�ÿË‚Ñþ×W8.¿�jÛ„x�ÒÓßÿá·__Ýõûn¤DL#Û3a2y0Ÿêð‚¤ÃLûJÃÂKQõö÷KÅ_�®›Ý¯ÿHÞ¿Á]ôM¥~µï_ÿßôßݯíÙšè3Œ#[IÓ<ÕO›ú[J¯¶ªÚéö—uî•ÖÕz‹i"Ç;�ÿ÷ÿ¦ÿÿí qlØMý/ýÿ曽zþÿýß¶zl-D-zµÛßýÒ·îí'¾ë±ûñõÿ\G_¯ÿÒÿý¸_z_ÿ­Zê×ÿú´¾›?Z¶’é«¶ž Ä*í={»·^ûu¨½pøcÃ÷W_Ïý=ÿÿý·_ÿ¸Úú ßûum&þ–Õé×ûm'[´˜¤á¶A§iïa0 %µþÖûþ?¯¼&Ø{ Xkÿþ?¿ÿþÿý°�¿�^½w[ÿMúïM¥vžœ‰m Ú'¤V¡ˆAÚ=Ê9[]ñÿÿÿ¯éöö°ÿóIÿÿKÿýÿïÇïüüÚþªÓ¯éZß}6‚n˜>ÓVa&!#C¢9ˆÂˆ¥ýúõýÿög†Ê}ÿÐ_ãÛkÿ¯ëÿ ^ÿêõý×u¶×ªi§Jà  à ŒDCb"8ˆ¥ÿÿßÿíºðè, ¿ô¿þ*ö×ÿ¯ý?¿öAË´¾ÁwÐm Ÿ¦™TSÂ>±ªDB+� ûÿÿßÿíáðÚ[i~øKïí¯ë¯µÿïÛ4Zªm†ÒL'›HC&:žÊb!•·B:_ÿþüÏþ×ðG}¾á-×ê×÷ÿo~Ò½ëÌÿÙþØ$ši­¶—´)0„EÄWA4_ÿúUÿ}¤ÞûùÍõÕéW¿oom-/m-4Ó]´ÂlRgjY:”ƒî¹-Ö?×ÿ_×÷¯Òo8¼ÓÕz_«]m¿mìåm¥¤ÃM´“ôÓNÂxaã-Œ4›úÿõÿý¯¶•÷ÛuÛka;´�hㇰÂ(~ȃ” U¶‚´{ „FVDQHˆˆ«Ø°ÿúÿ®¾�ï^ßú +ËúR îêÅ»H6“bá6øqÁb4]’}Ö…¢>ûÿ¦þßÛKVEr¿}ìU¤Â{IÞT2:(„á©VÃB"#B+é€/­Ûw§iA‚8ï¶Ø4ÛI4Øa; ¶-4GBÂdÛŒ­ZCNÓ·TýãîíŠ+2�Á[ÓitzŠÄDh²’»VADDGØ0‚ødV©&˜ôøúî2Îñ”ÉžR£¿Òå¶´jgi…E?þ¥±y’˜$ÿµË["©\ÖÔ+hzäY¯þ:ÙZDü´’¢y}ÿ¢Bõ%q¨ˆe" ¹‘t*„YÖ‘TgfpP¦I >×â«�žH2<‘aVKÖ#ãÎI£`0…„{rË™Y`™Oôv¦ÍÇÜ|f†øÿ¦T™Áð�dxü`x#@g§äÓG†‚m'—@Èæ‚ ¢|,�°UÒkw»ƒ_ùØ"#ä�Æ™RÙhV“ ŠNáw«ú}_.ºï#ëÞ:ëÿ½¥ÿ5Á·_ýÿù§¸ÛÿâÆ—¿ï¯ÿþÙÓÿKþ‚m¦’oõoþ–×Ú_t¯}ºÿT·#¾¿_þ¿ïÿ„þ—ÿÿú]nëì:_»óËë׿üÍu{iZý+ëõŸöõ÷q¯}ÚÛ×ÿüa¥ÿûÿ¶Žô¿ÿô»ÿÿÿýtŸºýõÛoîµîßÿa…´´ÛISO®Úª÷Þí}…ü}Öÿ½ÿß­Õ‡ÿÿÿõÿû¥û¾ûoÿÕ;*7·®û?·ßÚ †ÞÈù„Õ¦Ò ¦h":”ôV9Vú¡ö¯ÿÐÿý~Þ—ÿëî÷ÉïÿýµÒý¿ý÷ßÿûoI´¯§°Ž8{`¬kiZPéê—´g†b¥lK�èÔ·&Œ:¿ý-uÿý?ÿÿðßúNý¯ÿM�ïßê­ïß}·ÿݲìõjÚJȤjŤbd£lTBÚ®$ókC°ÿþþ¿ÿÝõÿýùïzè/ÿý‡û!­ëþÿlÏVí†ro^Ó¶Ûbté' ¡w(A‚g Ä«¯ûÿí®uÿÿºuÿÿô·ú×÷¯ý÷Û_]nÛéXa-�ŠdW§kïa„-NáJ’Ÿûixaÿÿ¼,$ÿÿ­ÿÿ¾©îÿªý¯û×í®ÚIûln›”2Pƒ ¢“Emâ"#¯ÿÃÿÿlŒŠ_ßì8ÿßUœ]éï_ôúá´‚ ƒI4ÛpÉF¥aHÈm?^Ý+Ãwÿú:z_õûÿþÞ¶·MÚ_wm¤šéúv˜b4C"“ˆˆŽ"+ëø¯~¿÷_ýµ÷ÿõìÿÂßI½$á·­¥i§µV‘ˆˆŠIÖ w«Ý×ÿµÕ}ëö¶ý²ÿm…°”6ï`Ë­%wi2'𔫓b•ëûvóßuÿ¶È?ì"‡vmm¥{éÁªqI¦…*M;"èG)L‰-ŠíþÚN—ÞÙ}†soonEÆÚI§M+WmdñCLt" ÐŽÚ5±Ûg§a›wÓi&šiÅ1VÅÚÁ•‘âQ–â°$(Ò±T„�‹ $�ò­°�‚”vh‰¾J; †:˜„v ¸íDDG|kWÒ]¤¶2›mŒy…µ}å´�–Á”U áð™ØÔ…~ùk ÍÅýë–¢ÐC±�F¶õ·–M fƒ(‡,)Þ£H7×庤D̆20Ž £6D4`ÏàØF¶ñ£`a.Y_ô›üs!XŒŽ†@²>{4ÏŠj0A�Á£àei¡ '„›A:ºM ¸@ÎËc±”žÉûÇÎÍb +Ï™Ð�CeÚ*Ã"8*6fô¤á&hðÑYD¹¯Wô5tònkÁþŠ)f¯’›gX¾HÈè�Јè�‘\ Óö6ðAÂ]“äÂA6º +MÓj-·OºÚbšëÿ¯ÓêÈZ#3©td}AJx@ÐL0‚HG*äG� 'I¤­;ë{®•+»OWB¤p½©*ó³H•^£•ôõ5¹)"ƒ$lF°Ê0šp�žG�&ÕÒa…A0Û]imGz_TVÿw~G0ÛÏuÎÊoúTBLÐèøÂ8H6M¢;h-&ø-+ƾ«K¯[oXÚR8Z§ÿoHXpt?ÿÎÓê[ŒI‘c�·ªC¥¯ÿûa¿õþ¹O’ÔGŠs%C83\a’3M4"§OGФØDXqÃÒ¿ít…'ßïþG@ùCÿHa÷_ÿÿøl7üÊFu3¨Ñaa’³ +Ã4ÂeFg*;³NÒd}LûI¤›v“}+‚i°oÛ¶ûÈá~ß^½ :õºÃG¿ÿÿø6ïùߣ°lŒd‡à�‚5˜æ¶¶¹¦¡èŽÚ ÎºêÂUÕ¬^±uO¬ìÈz_}òT¯õÃßVþ +ë¶Ý?ÿÿÿnïóµ¥’ !‘žqfóᬗG‘óÌÒLçú †‚n�– ÇM ÈçV�6´í¤ôþÝýí>ßu`Òßü0ÿÃøG»uƒzÚ_{×ýnïwÈD†fŽf�%„kxGÀØÈñlR6390“i&z·éjÚ‹ôÚM/ÿþ·¿öãHo[Ù,?ÿöÿÁ¿ý.Á°íÓÕïv¿ÿ~ïÉx erÖ@‘ý ›Òa´- ´Õ¶©-]/Òi+ým¡­ÝÚ}¯ÞŸáÜ?ýÿÈuÿÿÁ¿íïý,8ïöï_énuèßW}0Hh ÛL ©kI·ézj›o[hÔU»õÜÿÿýƒØ}ÿB ßÿÞýßÿ\O¿{ÝÿõÃ?ÿ¶znè Ú$é[ë]/WÝU:ú‘õýWMÿÿýtÛl?ýÿéûÿ÷þÞÿõ[:þíöi¶ékm„­+IŠ`ÂÚz %m®—— ­¶üo¶ê‹8þ»ÁÿëÿêÚþêÞÿýëW½×ÿÿ5-¿ÿ†a6hºklõl0A0ÍÍ¥¦°‚L1 °“ C Â>Üw÷õ^¾ÒE¹$Rî±ÿ×oÿÿü#�zþèpýþ½úN÷uíç“_¶¾iÿØEÙ p`•¥´Å&Å)´w_��• Õ†!b#wu¶ë_mµñ÷Ç×ÿaÿå$ÿþ'mûa ØþŸ^Š…Ûn¿zç—íž®˜`—¦�‹m±V•;†0AŠšZ÷ׯZZý×ûf×ÿøoÿKÿô#ð…á¿~õ½i]6h›ºöí´“MSb›H1I§~øa&ºÿý´S×ÿüÿAþº8Ï®ï¿ë¶•¥¤Ø$Ã7ÒM6;KM; dµ)$DB:"?ÿm/ÿõn¾÷0¼‡ÿ¾ÿu¥_ÿªþ¤ j‰ÿ¿T¬ºm$Ò½Š Sh%Ã%a1U*J·ÿÿ÷ÿþ¿­�¥ýÚ¿ºëÿú÷ýûé[Ÿh(ÛI0‚d]Bb‹p;ÿÞé{ÓtÇþÿ~Ÿî½?ÿù›µdc®ø6BûM=&ƒ‰F‚ëõëûö°á{tíëýºœÖ÷ûþíyÃm{nÂTØ´ÕûA"!/OûÓ]÷½;·º×ëí·]vÚIØECÓTí6ÞŸa±r½lBh$ú]¯¾ßkíö“°ÎW"°ÍÍ ˜jÁ„Û$ñÂw£ÄŸ•¢a#�ˆˆGDRE2‘ÚGÇýëÛìÿ½5¶rMÒØ œ ئÂV‚¤V0Ä"::æAï¾!ƒ¥¶“Û ŠÃh-¦)0ÃA4VÓAtV0`ƒ \ÆëãÒM´©6ExaC�¡ «aƒ&竤¹†A ¨a„" ÊdUitºƒ,ãV�/°Èè%]ƒ/ƒ5Ë8Ô"<}iî?ÿÿÿÿÿÿÿÿÿÿÿÿÿü€€°>–Ã&”ÈXÒ˜@oò5D\Ô¶ÆÃ 75ã-³PÐ#-p°>#‡#‚¨ËT,2i‡;? Xd!¨–—#¼ú#ŒÆG#ƒdƒ%Di–p°d4@s`x-B2Ê �š�á¤`)xN[\rn¼ƒUDl–éÁlFW5 �j5óX +ò Ècò¹M–åZ;)Mhˆ"FEàSX�JeÑß Ï Þ×-š‘ÙžvŸ6(L¤t…~×Rˆœ}‘�HÞNˆÊDwï>ÍU|µÂŒ–U}*M©ô¬aô}õŽ:II$Z¤¦fe<PɃ¤˜gÿÒÒºÛht†³½æ„QçÙ¶z8Ésá*¬$|%Õt“kýŠêHβG#Hã4ŠNds¬"ݨUMS }¡ñIEkþúÈ6t²C#¿x"9è5Pš<4 +´‚ †¾©º J^½™¤«_Òõs6r +˜ A RJÒ|(PŽ<"žt¿W}ÑÝ0ïZè'KIþŒY/zÒú^©á$õ¥„�)ÞŽ=/Õ –ºW­´5I|«0—]-©ü%©ÓÒªÿëwÒUét8AcxÒC¥UëXþ«Tµ=˜ÒJŸ#Ý%IV¿þ«¥ŠékK­úú^©t«ªUPõÐI½Ý%¥ç0’ÿî©õªÒ¤’^´©*þ¿IR¯×I&ðªú¶þ´´›[¯Ò×Z¯ÂZ]tµ¥ú¥ýKT´“­RÒI]*Òî›ú_¥¥^” —KUÕ-*ëª_K¯_¢¡íץЪþÃi*Òº×ZKÁuÕW_é(E^¿õ¤•âÚëª_éi +C×Õ •V¿iô¿ÕÈþ¾_¿©Ï_Jûtº0ˆúªK¥ét— ªþ¾–”�©³ÞîG©Ò†…U'WéÒIw¦ÇÄG®«ÒÕUqÈ莲þ^Èþ].}g¾¸¨„éA¥–ÐP¡{P¿¨7×÷­ik¤’U¥ ·¬U öÁ&ÂIÒXP˜ªªÃ„ºªÞý¶½-_­KI-PUwp¸A6)Šâ«ØM4Õì,7þ�/ëIjÌ/ô’T!T„šÚ„Ò60Â`„0ŽÅÌ}7é};¤s­†=Ú¤Ñø(er—þºÏÉ.ðµºé¡$DD#Ã+�:ûí¥Õ&"–Š�è$Ò÷ˆe´‰µp;üµ�4¾~Ò¼}­ ˜iw¡Ä/iÀÅÛ¡¦J­†Æ"<@endstream +endobj +206 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 100 /Subtype /Image /Width 8 /Length 225 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ dÿÄ4Q!1Aq‘3ÿÚ?êJ‚…¸Ì�ItæWQ9÷ñ,Aoçµqc^åÝuÓm‚аÌÒYOœq&×M4ø…5ÕÙèæÄÏÿÙendstream +endobj +207 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 32 /Subtype /Image /Width 124 /Length 875 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ  |ÿÄC!1Q"Aa‘q�2¡±BRb#ÿÚ?ôÿެºÀlÉÿfOîkj+-ÁŠÂLùsûŠÉÓl1ï/”€­‰˜½K¦×‚ºØBÜA¾J±éMýå ÷Q“Icü +˜ãýVš]‰*âòdƒ+áaëI×hÚθ )ÝM£éRShcûr$ˆ½ç­5×°|on +´�øëô¦u<¿‰ LÀX\šËØÜ¡¬àÀÙ£ù?¥^½N°1Œ]Ì͈3½3¥Úñ°%&8n:ÖšFÅ\v& ͤÇéT›`%n&&"®Š–lbÆæ-YéÔB‘=шþÓÄU�¨S0m8ÞלcÖƒ´�o#éM7Ø ›ôúMúTìÛŽ¿qF@ÄXž|€ í±.DÜä&�ÚÙAP;KLø)¦ì›¸�oÄ}¨m­�U8˜7æ¥!»½PÀÎqƒ2Ú…ÜÙ°*üŽ]b"TV;åìø¿7"«ù4�gñÝ»^’G˜Îk­"â.Zª* Ä3&&{bþ ×;ü1‚ª18¡Xˆ uí­×\kÇ(¼ýäQí©I Ì߯4>µ`¹Ùpf)á +¨¬T-­qãG¶�=°!b<ýi2k0ÆÀ l`ER Y"{Œ™$ßÊ�‚K•<�>(ö×ÌO™ð¡uª™?Rj6ü]ÓÛÚ¥“5Ù›òF§ŸÕëÆø�oxëWEFÉ s&9Šçme·*k.«‹Ç"?%àñZjVíȆS>fÕ +\feîZ"máҳܻ6ê +á aDËý§¥t°bËÇŸ*És d„“0¤ÞoÓ›ÒUmºQwȨÈß´Ðn‚Û ’ÆT@äI©×š|hÒ6˜_³ŸKÐçdƒ¬ìâò9/QÒi;ï Ä +Lfä0ôTNÝ�¥î�d¶²¥eJ’ŽX›§ë_ÿÙendstream +endobj +208 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 24 /Subtype /Image /Width 56 /Length 415 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ 8ÿÄB !1AQaq‘¡±ÁÑ"2B#ÿÚ?è@þÜm¡Mɉd×p“¦¿1Bü§FlpDÜ3):³ZÆbæ˜ç6Ä€Ûk 2€-j.;ã¡•ü¯àÍî¬ÍÈn6—r®Ì™7o˜ÙêÓ©·_ +Ñü츹%³!'|4ÁÛuQb@Ÿ¶ý‡^Ê.nqŒdU‚Û *%˜Ú֯µúI;«2ñ²c•FXbI%dϘ§aã¦/­3bé•“æV +™Óº*±qØdõ]¥¢ J§”™4ø¡\¨Ä€À‘¨¬²ƒŠ›Ôõ=ºT.«©«zë#³Z-Â&mB™S •`Gq¯ÿÙendstream +endobj +209 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 16 /Subtype /Image /Width 104 /Length 556 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ hÿÄC!1QA�"q‘2a¡±BÁÑRÿÚ?è�a’ðA+5%Ž_\Kö®r.ÅQ×qS¸è +ŠGßzÁs°V�³,TÓË"BγA™Â݃ñÁ]Ê&‚vôܹAì{Œ"å“p£K>ÙIÛ¦_×èÖí[’þLIÛ˜HbƒÓÔ÷5Æ¡lqÙBÏ“ÖIcñc™ž¸ÓŒ¡Éäºè¨zþÆçõ€ãÙ¨åš|Lú¨œ¨g®Ól°?4¯Z’�Lž§®Ê‹Ky×s°,w˜„ñø¯ÒFË +n©¸»–Dnò¤tõ÷š?çÚ€%ȱÐ�¸5÷Ï~2¸‰"Äí3JȯLCÇRÁªPšÍkŠ> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ÿÄ3!AQa"RÿÚ?§'3Kä€PKêTw Ũ×Îѱ±WŽw‘)ô'§šÿÙendstream +endobj +211 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 720 /Subtype /Image /Width 440 /Length 43775 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ иÿÄ` !1AQaq�‘"¡±2ðÁÑBáRb’#ñr‚¢²Ò3CSÓ”“Ts$D4„ÿÚ?ú�M)¢hšsJiÍHsDÐ(š §Jh¢�4æ�d°ZÕHQºœÒ‰¢h¢iÑYg r@ï¦:QNi@4R €A"™4N�`ÂAštMR&(‘@ ÜW*“€mœ’cqíÒ{<ûë¬`TL $kÀžåÝ[~«ÚÂr24…Ý´]¿»Ê|k^ùPK�  &yQî¶ã+ +/3˲*ÿÄ"$"D°*¢ä‘÷Úk¥H̦ö¸±ƒkæÇœº.Wm£ÛV&á‰n1[n«ÛÆ«k‘î0¢5ŸÛת÷UZñk|Ç("~u¼yZ?¨™‹õ�Xn¥Ñ¿Ùúf –½ iãnÅ!É1Rq°žQÏ�Ç1ÈWÚÍ‹qOêAõ¶Ñ *ðSé¯}eÇTv€˜õ½dDmè3ðüܪZU@¾Ò ·ªæÄ¿mû+�Fm˽Ó T¢º‰Ô<ê?w[×~,ìr²@ˆµAêá¨çò«dRê@$,DH> �…eÑ Ú¡ÍÊ‚vîï�º¥�M‰½Wr A1¸ºÇyV[vrM° É‘´ÈôÇßó¶×DÉ"Û'‡Ò6Äq7øbÈaµ˜A�¡wi:7ÛO' ]ÀRnB’Â` ¼p…k8ɹ0¦ &I´QL9±à!U@›VI+éúdíáOgQ‘}{ÔíÛi“ê‹ù +Þ$É�B“,Eà2&ՔÕ21ô•fÝÆG¤,|+VÜNÝÞˆ¹ƒ°îøÖÎ<Ä«zf:ñ�<ª€d giY¶ �×9é P°§h€MàEtlɼ˹ÿK‘B†8 3¹bÓ»»„UVp²)ÜÌÚ›p'O‡LØýȰ0fæ/Q8sˆ‚¦'[LžÍ"´FrA…±˜Ütˆå÷Rr/ÒÃé�"a†‡ËQONã1Êì.Фc°±›éõiñ§“WcbV ŸÊgHûê͸Hß�d ›[@o‘ò �>L€‹]\ߊm?»ü"–.Ÿ& i�cÑ�bÉðkéÙ[| î&"ðh•ˆÐÅi±å?IÚëþoí­m~cQåU®a�Ë+¶Ò@am6¹NvkL™€@þ.>QT‘Fá4·Š ¯1\ã¥éƒÚ³$ø›ÌU÷¯1OÞOÞuŸ{üÃÌQïã?�|ŨÄGÖ¾b�Õa�˜Qú¬?ñù…«Ã¯¸¿Ì(ýfþñ?˜QúÌýâ0«n¥7¤`Ú¤½>`ÞÚÈÐÀ‘*¡…¨.àæ(÷˜¤s'ï:C¨Çûëæ+'©ÄººùŠ_«Â?:ÿ0§ú¬'ýâÿ0£õx¹ù…/Öôÿñù‡ãHõý4ÿ¶Çüãñ¬Ÿñ”¾ÅüëøÒ?â] ÿ‹ù×ñ¤Å:1ÿôbþuüiÝz/þFýÅük°Û�¤$ð¢ Óò ŽÊRiß•ÙKweû•Ç#äh÷W·ÈÖ}Õž>Gð£ÞQÏÈþýõíþSøV}ôþ/åoÂ�Ô'ñ+~©ï+~‡R‡÷¿•¿ +­ùÒ¿:wçJüëÎê¿Áqõy[+gêT˜¶>£&4°‹*°£ÿŽáÿO[ÿU›ýzøîþGYÿU›ýz_øæ9úÃÿýY¿×£ÿÀuÏÕÿÕfÿ^˜ÿë�8ÿ}ÕÿÕfÿ^Ÿþ;ÓÿÆêÿ곯OÿéÈÿmÕÿÕgÿ™LõÞŸþ7WÿUŸþe?ü§ÿ‹ÕÿÕçÿ™Gþ?ÓÿÆêÿêú�ù”ÇøOÿªÿ«ê?æQÿaéÇûÞ«þ¯¨ÿ›Gý‡§ÿ‹ÕÕõóiÿØzø½Wý_Qÿ6�ûOÿªÿ«ê?æÓà}?üN«þ¯¨ÿ›OþÉ€¼êêº�ù´¿ì¸xdê?êsÿÌ­ð|:oê?êsÿ̧ÿgÃûýGýNù”ÿíx?ýFoù”Çøf!ùóÿïåÿ^™ÿ Åûù¿÷òÿ¯@ÿÆ¿Ÿ7þþ_õéÿÛñ[/þîOõéþƒüÙ÷²¯Gè1sÉÿ¹“ýj?AŒqýÇÿZŸè±Î¯ÿ¸ÿëV�JœßùÛñ¥údæßÎß�kÙQÅ¿˜þ5¯h'ÌÓöæ.|Í0±7>t¶‘ÄùÐó4Àí>tã¿Î”wѧΞÞÓç@õ«£ÃÖâl9Ð:4JµÔÁ‘núó¿ñ_ðþåþ©þ ÿâÃü‚Ÿþ+þÿÂÃü‚�ÿê¿àãÿâÁü‚˜ÿêßáÿâÁü‚�ü_ü#ÿ…ƒùzÑDS•EEN(¢�*š¢Št¢ŠtRè¥EÅ* QDPE!NŠ (¢ŠtSˆ£Z"�§DQE�R¢�QES¢Š(¢)S¥N�EQHëN�E©ÑE#@S¤oL +TéQLQEéQE¨¢ˆ§J�N) +|(¢(¢Š(¢Š(¢Š)ÒQEŠ(¢Š"ŠBƒN�h¥N‰¢ŠS¥ER£Jb•”Óè¤9¢Š袊 P(¢Št¨ÒŠ(QEQEEQE:\h¢Š)ÑEQY¢�Eƒ@¢�*tQEQE@¢Š(¢iS£… dS¢‚iS¢Š)Št(6¢h¢Št¨§E¨¥EräÏ™åQ·pd5Ú$V2çψ1!`DlßJ¶>¡FÔwMü�‚xHY&·—><1½‚Ï3°Á ŠuÕa$¨È„�Fáh­dêqa³º©Öä V›*$n`'I4ÕÕ‰‰öq¤3c&ZÐs"˜, ×…'Ï�ÔÀh.xÀó:TËå÷öÊì +‡qc»Ž‘j¼ÒgU‰:é\ø³»u91˜Ú¸Ñ…¢îÙÿDUW210¾�½Õ“Õb³xÜL¡3¨û|)¯S‰Ì]'^èn«¶ÒÂf \É;/TL‹•C)H�EÁÅDu8÷mÜ5�"±Õg8v�Ê‹ù™´»/WRJßZŽ~¯Jrž$ MøI“Õ¨`Û†È ºlAŸÂ­�2e�‚$‰–5�Õcf +IÓ‘ŽF­5—̸„±×ÇåLeR»�¶ž3çS^«GØÕÆ4˜4~¥7m¿|óÒ–N«&!�À“˜±¥I³ä^<`®ÆÅ‘�½[‘±�~PÇ…Uú¬hÛI’5€LO8ª>dB,`uŒ�BcÖ|?*ÖLÁV@“ÀqøÓlÈ€=•”ê%ÁŽÂùÒÇÖaÈÁUÁ&#¶Fáð½Zk*Ìq‚c»Z=åÛ»„N”—©ÆÁŒÆÏªAÇ�©Ç¸$Ái‰´Æ±:Òn¥¨$�Çh0`˜š°3X|ªšÖ�¦È?¼Ÿé +ÏU~›'÷åK4U�¯MG&5É�—Ê�ùH LI3cκzq‰P FTXA�6Ú+y #ÃÌü«“G*¾âª\ƒ&csXp™¬dLJ+²¾B„¨ ´íÄŽß•ucÇ‹ÛAP”@ÓKT°¸Ý�LmG€�Äš—Iƒ, ýS(³ ’b6Àã6ŠënŸHÜ ÄÇùZùñ®·*Õx«�s%ýIx@æ{ë¬fÆùA !búÛ!®½jrcÆÀ½½AAƒù»xI.ÊLë©´Í» ÿmC X±¢2¡T,Ü‹1éñ<ã*L•$ ^m;Æ¢#ˆ´ÖæÎv�§ +j=·e-:N¾®ûÕ 6"›Ê…©-rÓe†‘ÆGeg_Ôe�6ìXå;Ÿ||&»” @¼Û™½eÃmº�c¾ ¹1ã_Q}£N- +>T “Ô@$(‘õzÌwÅtEsæ!2+±i'OÊ~@Ô›&Ì„”7R’GÔW'ÓÛá5Ñ‘€±3~à}_}r¯é[ ;Ûy;‚û�q:…ÝužÈ¯@Šåê#ȳ@Akˆ�r/P=a–`Ûò¶½«àf)¾ly *\D¨ú€Öü¤i4ñ8€v÷ +Ùš>¦co· +añ�Û�À†l/xÓ\Í—u˜FèþŽ_¨Þï„ {jèØ‰e&ZÛµ´qŽçQËÔb\ø—p¢Äà õªud"�"àˆ‚ÄÈᶯî)÷ð©¶E ‡¶&ã�û_çX÷�ˆiA&NÀ=\~žÿì§Ðl(A”¢…g™,À$Þæ»"¤ù1£€Äƒ¬Jýñ\K—Äž¡(B–¶Ô`6Þcº·ØÜ#�gÛ¾}:¨’LÁùVÓ/M˜†B”•ô“#œÇw–7 ³Û3,ªþ�>­Ñ"Ã�¸ ½z1\}FeL¡"ål`™l<¯á]tTó`ÇÔ)LŠO$:Ïépû^ÖÅÙû°6ùiX?áý)AŒáB È]£h'�«{H @�Ýʶœ‹½Hæ9ÇÄW�‡¡uU_o€Næ·)Q­w7O�%Ùð¸ˆ?0)·O‰ÎâŠM®@›iBàÆ�¸(÷‹ßZ¦Ä®\"†:°O�i1" +-KÙÇ,v‰mL}]ô 8ÁúG´ªV2cL¢CDH£b©�šK‰’ª:ÀŠafÖ3të‘ +Äp±*cŒ Їé]ÚÆ¢d•¦óø×W´„m G(µh"‰�­>ꟳ�vý£w8çLáÆ[qPO8½lÖJ†ÔM#� �¢{©ûj …Â�ES =•ºÉUc$ UÐPW@fó ¨:Š{DéAQ Ñ´r¢2¥–Е¨¢ˆ  +(¢Š+3z˜Î_n ÄÏ·Û�RhšÃ¹Q n¸Þb“æ(•&H¼MRŠUœ�±|¾4ñ¾ôVÒ@>u©œÑ4M)šsK¾œÖYˆž�5b>¨žÊÖµ–m½çNúž<¬L:€`˜wÜ*Šá„Ö�š[€±¤X-Í=E€¤H˜š‚êb�žáÀÖ÷")ŒŠI$k}(„‚ç5 G: ½ÅÖDwÓÖ²r¢Ì°¶·Ò™a¬ÒLŠÿI¸Ò9RcpžSQN¥²äJ•ãy1ƒÝWLØÜ°'°Í3‘D‚@#¶�ê HçNG:Õ>¢}Ô $PZÀƒHåE;K å46EA$�\m„¢+Y‘LvÉóxGf•“?¬q†Æö›ö≬à_Ôôé˜ÈbªÐ>™ á<õê™”õ8Ô+ȱ7+v�¤[áZéðdőٲ A +mŽòuö5m›µ: +“t«‘‰fc3i€,¼£”øš‹doe!c—p0ÄmÜŒó3:ÛQYNŸ'OýPP›"Ýcüf®˜¯ªìSý_…o' +Á‰A +ÆFö�lgBfEÇÜ~u]:gw%¡¤O÷š<´®®?KžÃ(Lz�‘y«céñâbPf‚OÆ¥‹ +¾|�}¦D†kÁãBô˜r‡gõî$’MÖÑ +EÖ#‡ÚÎæpžâ›¯û) 3¶òwJˆ÷ãP}O¡ØWЙŽ-o®¤èð#&DP¤ WóâxÔzlIÔô˜·ØñÝš\ +~¡xÏ;×n …‘$ܨ4ò€ÂkHñ®Rωr«O¥ »[püÜ/~:òßRÛ_ +@‡ÈËÝï#¶V°`ÏèvŽ&ÿU¾>f¬¸1d$�ŸÌ@’#Ÿ*LŸÔV-6 rü¿kx�b] ‹p¤ø•An0Æjr3"Éú²dSýÕß!K¯¯ ¸„hh–ü¼IûH­uXpçÇ/�r&PÜt¹ÒÁÓc÷ÊúÎ…‚îÚA�·�¿²+«%A´ÛaruÓ�pdéñbɉb@†ßùG•_*ápº8FÖ`< EoÐ�Ñ%˜xÉ'åQe\ÝND`}¼f�NOõt­äéÇ­Ÿkî"QéV +¥{fþqW騶$'Š�•pôXS& I#&pã¹G»�:ŽCʬ†4`È-Ítû¦’âæs3J›ºsô¨¥Ñâ\ŠY¸dʶ²Â» ô‹X©à ý"rÊ$ÚL¯o3×NQ‰N#`d„€7 ÛnW´Ôð�Ô>tsdË i‚˜ßQS]Æ2å L™:Ü…û€®u¿L® Û&6>—dSð&º3 2d¡¾èX¾œ&±Ÿ tX ÿQÁãûÿ…t:"äB¢ Þ§^Ë!KúWÆÎ&Ö4Ÿ…Lnl�¸€‹¤•!`ŸÔt�*ãÆ�rz»E¢?�mðª1ÉrD›\Ü ²ÂÕËÐô>Òrò»fä)!@‘å]ω^5·.ÚÉé“[Ì‚H0NÝ&8V½‘çB5ç@ÅO� Ó¢®Ñ1u3nÝg¶²�.4 � �Ø;+: 9L°:͘‹‚6< G.uĪ›b#²°z|e‹íˆ‚bñn>ˋ͑‹+¬ÍÆä1¹µ+N¯¡qªH%¦Ò.êï&©‡§A Oñ3411ZÇÒãÄû×t�e™µ3¡4³ô˜º‰Þ ‘n È€`Šy:lyB«@ QãŽÊK�I kO #—…az)º&dÉ›’užÓ[ý2 Ý‰¸ï4Ó§LeHÒ \éç[|c †ÓÊ�Ä G3ÌÒ=:ÖàÍÏ?M�ví·µøúf>fƒÓ¡`Ñq1ã­�Àc^ËŠØ@¢OôèI™3À’G•&éqºí2A×Ôoß{Ón›ˆekq7ˆ¤Ý.2f ÷Ÿ�éþ™æKÒã ´¹üiþ�j"8ž¥Âªfþ$š™èð�Vx_—.îʡ‡‡t† v¶‘äéZ +µÁÒôPXfĦYØ›6Gu´ç]ωJ²‚¤Dje!„‚ Íär½#�éÕ¯o ÒNŸ-ÛT Ä“$�I¡:\8Ûz¢ƒÎ/zxúlXÙ™QAc,@±ÏÏé0o9=µÜÚ´ ǼÒN`Ä›u�£l÷VÇM„0`‹ m…ä*OÒapƤ Ç +¦ÄX9E,4$\xÖ†$¶Ñ&$ÅÌi4> yvïPv�D‰‚4"œÍ™‚)cÂö½öS¤MgA•C,Çh*mØo[Šž\ë€ ÀÜÀ�:ßuR�ƒPn¥S*ãƒ-Æ=:1×ü“W¢§—(Ä$ÞàpÔé¬VÁÜÒh¢Šb‰£Zt¦Š&�HÐÌ_ZsA1XÉ�c€D’`ODWûÀ¥•ý±17XÔÇÚ™� bí§A¢”Ó¥E$Ê®Ä)­Œp:Þ¥Ôç=:‚t’5ˆ…-(«Š,)ÒžæŠ@×rê×b¸ÕA™ :̘án#Sʺ0>ôS¯�X|.ìÓ�€E‚ÛoÎM.§>Ì‹ŒLµüU?éTq¯S‰X°[.ÃM (¾ºöQÓ–%Ègýß_@7C²×­õ›°a!ˆÔˆÜ`O@žêErâF $Ì�l.I¼ž¸Vpާ’ÛB½²ób ñ¿(ã88ËãÅ”»NïªT‚­n\yW¢L W2AÈHgž:íáÎÞT–z‡Ì»˜l}²?"?ïVOTrãn z}DnÛÏ–ï*M…pçÆeŒ°L€Bä½ùÍvd-³Òo\ý!ÛK?˜±:ù�mqþ�ÿòcÿMkKÆ8%®–ÚX‰ü±óYÎ̘Ô+0»,ƒ{Ô™åZÌ£œ…'‹6ïæÝßTÆ7·¥š.$’GÇ”TðàÏî«—ôÜ�ŽéìiÝutæ’† W?Mê-´¸ÜI´£oÆôúMÝF-ÌÄN‘3Çð¤ÄàɉCÜÅI'š»|Ö¶0–,rMâ .Ð{7=µÊÏ“fÛÀɉÜRd  ëWL²u gG&XÌ©@6¬és6ùÖNp€Ç#±]�ïmÚpð“+!ËæÃ?› ±¡±ÿ­] mPß\ù0©FbYàîR ˜o +ÆL�½ Kç`ê>"» Ú ®WPcs¼ ñh¨ædýFÖmäã•Ä,³_¸‡ìlaÆÓ¥þ5ÏŸ¡Æ²åA>‘¹‹âbtµn˜mÄ¢#Ò-£Ԗl©ˆŸK«2¥t#ûÕ·éÕq'óLÍï34ºcï&æC8ÊÄ€§1™Œp[ÿ5râÆS WK1õ_I:ó+há1jôˆ¯‘œ‹©* �0ªõ‹î SÄ‘cêÜ«A§¸-ÌÜúEAºfÏ�’ËÂew4koPŽZp®ä°ÖkƒÛ^§&\N “»ÔÍDz-ʳ™Û¦éò2¶ÿl$X�›¯Î÷´+©ð€ n ZnnIÐàppãEÀ·ŒhMkôÙGûÉ0•Ö'”kWÇŒcÒ{I¹>&²øIú¥æÀxê+ Ó³¬ƒ3m4ˆŽU5èÚ +¾WÉ º ZÚôÏ%™å¢€¶9ÖŸ§9Öi£²+~Ù K\qçáÛY\$f&ÑÄ�O/Fs9 m±¸Û5Ѳlš€é ‚r4Ä:Ú4Ó¶ß+V“¥öËä$±µÉAð +Î…é#(bÐí¶ÛH?¬„3«3¹ÚÁ€›X2ÿꮨåRÇÓ q Æós3ÂŽ§§ýJlÜÉpeb}&GÔSý +À–b`l‚ÌIXçY=1ýG€f$']GÊ(êlݸ‹‚B†:n½�.X¬àC—põ•0e†ÃÜ)´LÕz~‘z{b8)�¢äØmc¸ +³!e 1Rxˆ‘樎ˆ(r=„\ÌŸÞ25øvV±ô£ +¬Ð"Öà#•gô�Šv% ÛPåÄÓôÛŸw¸àTASæ¶ø&Ð̶€AõigãX‚Nà#u·__�ò­À“8þíg'H™ ˆÐ‹0 ʪ#Óz‰ÀVA^\A�¦ý0v1 ·Þ*ÑP~™Y·niÓê1å§Â±ÿoÂvÈ$(€ ™A’n|MPtà$ÜÜÛðŠÃt(B�Ïéþ#ê¸>®z}�­àéS§$ß™˜ìû|¨| +ìÌðì¼ýÔ7N ³EÆ¿½GéЫ'2Fš™>|yÖ¤E3-3?Qíá§(N‡�eŽÒHÜÅ žóTÜ´ñ§“ÊÍŒˆ1ò©§H˜ß|± D³·+÷SÉÒcÊe�:q< ÿo>5uP‚€8WÇïä`ÅÂÅ£rjLÎ�•ÑŸ¥Ç�7’¼Fâ&Ñx7­ *-ȤŸ=k8ºeÄdn=¬Å�ùÄÕ©Q@ Ñ5†ÊªÁI“s0OÜj•,yñå�Œ9y}ÕZ –È©ÄÀí5¡qE¨¢h¢ŠT·kSHN˜¤(ãLÖKRÇ@$Óh4QDÔófL +YÌ©åßÙΩEéV A'˜f0Òç@7Šu7Ì1� Éü@ûꢎQ4S¬Þ�9®Pù�‚ÛJ™˜·¶í¥CõYò†nÝAn|mz¦ÊùYJÀ;¦/&~ê³r¬ãX�:Z÷Ò¹Æ\˜]FF�ú (ôˆænjg¨Í—#Œ`€§oÒ 76–¸ˆ6ù×rjNGVÛ; .`ß�“÷UI( #Ÿ*šœ˜Ï©‹øájš6lÊ2®@C\¶ØMµ¾�¿…c;õ � s´�BÆïâ,Úw +ê…b71¡!H�ÊÿáÉ›¨ÈwâW*@*WÛ*f÷ÞÀüªí“¨%@I +H'‰ #CËíÇEòzw‘�œdò>áTÈŒà Ö6¹�8ó î69˜©û§ݹ "5ÝÄü¦³Ò>\«¸¶à”ÛmД0$þaké]SÜFM7)ÊEH®D2rH€\úg�»ë-ïfx ±¿ßkq×8–@ÛŠ˜=–Vì05<9»��¸"T˜‹¦Ð9Ñ‹6WÆrÉhK Ä€bÿ ÷Òëð>^Ÿ0ÜÆS …PÄʵ‚ÚO+×w ++‹L™�ˆh‘qi�+V³ç~Ÿa0e•LZw0^Þ¶¯÷7îµsï-‰ îØÏ™S“¼çD3êBóaAñßöš²¦MòHÚEæòOÝ\¸_>s™wÁB³qÆŒvò׎ï½õÎq:�ÊVAÒC Ñœu�ì&"À›IçéiûZ»–BÞ¹:ì®…!  +c]ÌÊ¢÷°“n5LxÛ b]˜‰çÄøùv<Þó+©Üʼn‰”Y*^úÞW—õ;!lavƒÈ­…̧K›o`<«'p@FP$j?,è‹öü8Ö½¬Šá¤Ú$ñ‰™·m°6F�H±7"8jh8ò”h` 6›€8ðû¼é”Ë·ÒÃtñ‰Óöü+#OS»ˆ€@09MïL?NA�Y˜sõ±cñ6ªƒ×7³œ��¬ÏÒg»_�Qñ½½²£œ‰›G1YLÔûŽàf XÌûsšˆé:„eotR(.Æ/b-m>5N“¦É� +»‡Ò]º·–nTýŒÅ@÷."I[5ø�ñðáLo\Š“ bGØI«�jäÃÒäûÖâOÓÄ’ÇóvÓÍÒ¾e¸ô°`vñV 8öVóbÊåv8P«Ó¸‘Ùp‘¬/JÊ» Èܤ[@±Gu6陊¾èeL~V ›OðŠ¡GêÒ/:ãéªùN8PÅI7;å\[…¹WFN˜¼vÆ�¤‚~U¯Ó°2'�\xö(RÄÇ©¯?üS6B³�>L„0UØxî;¼¶ÇƇϗq ŽÓbLLjm'»û&}F\Ž™A´)³DÛ�üEu=æ¹[«da¹FÖ  ŸQ ¤Gu·ê<*î’ Ä"'•C©ëÎ#h°›–¿pUjíFÜ»…û�CPù¤íkÌòîážn¥ÑÓ4°&æ^dëY=NEÅ‘›Ü€˜_^èýÑé“ý“TéÎH#$[C2XvØAî©3 ®Â ‹&-µ¤r0ßh,?â‘€öâIê�Ávü|j�Õä_PQ²H¼†´Íˆ«OÕ?¸ê ¶“7h ÈÌ8ÒsÑŠÜ�³:HÝkvsð®^‡~ë� `52!Yc�çVêQOQ‡!  +Ïalgî§Ôu¹1“µ #Òí=ûÅuâËî"¼¸AÀŠ—S�s(›Á„ðš˜e +ëŒ^WÓ0=Q ;;¹3F ûXB…±† }ÐDön¬™:…Y +’$‘&ñ§?Úo—z‰`É�DvÅP›ˆ&Lq1ÔæGPáaŽ‚en¹ç<«xó¾Lް=:sÕ…ÿ—ös�L»(H[’mk³žÎ5Ð*íRT“<9q×ìjÌNÓåeÍ“'A™æ?¤Í¸í“+®ÞËšë÷³).ÛBÞ� sy�<"³ÔuYS T"L)vA"Vm_¥Êù±+:b©àbãÃJ@eÆI�Â$ˆõþ0e•åY8HÈ3’,H˜1Ö?oûÒRýŸF•|Þã¡P¢Ha¯ƒ‡"ãdQûäÛw“­âç[Öÿ«û¢íÏ„wsûp®Tè2«nÜ,I2İa¸–'„}¢©ÓâΙ²3ª€ÀA KX“q´sçGO�6'ÈÙ:I:±¼�ÀÖŠœ)“(P†æ7 ç]‹65, � �p¿E”ôÙ0.Øt*'´mŸ*èþ¾ÑéY’~£ÃòÖ]:…bØý»�õLˆ i‰Žëë]H š‘\ìÎ=*±é ’Ó}G +çÁƒªÄ?Ý bH~¦Ý­§�Àõífâ÷ŸºªEE4XÉ�s)Wƒ¨:SÇÓ*D–hÓs-ÙW¢ŠDS¦i + :)S¥@§H›ÑNŠTG +N‘§J(QDE:FŠ8QEe†àG:j ùÞµJ€Aè¥44ê+Ô£¸ïR>tÏPƒ»Ÿ +Èêr¼4í›pñÏR‹q& €NšéCõ ’&×µsô_&òÍ»Ôc»s§d][Hbʼn˜p6ëLÑ HRVNŸÛ¥oßS I#‡ßIz…cÓ�­«‡+¨S1& w~4²uLf:Ø}æmr©+>ï¦dµ§Ž¼+Xò{ƒB;ê9z�Ë�%ÊHb…h›Üs­aɵîoSÄØž?�Q2‡$A }ÕÖ¬�µ¡Œb'ºgáZýZ‚À+¦ åÏ•ªÏ�cY=ƒÄØT­G*B°V‡0îÓŒñåT9Ä�£yS)17’8K6f}µÜXø©>ZvÕw šŽ<þá�}VGdÏþ¥„îÏšI³mú‰µB`}\*È£§H–nÒK1'íÜ;© ñR-"Jß³]i/X®›À$LE¤ˆ×�Ö“up¨ÃC¿ADþô›Ure„ž$ßI3f] +ê;çð¬äÎq�3Léñ"³�ª÷KmÆÞp']/ÙSÌK”ˤmI™’l 4žú¾<ò¤¸ØDÈ$º°�S2ï(ÁbÓõ.¿�aÛÿÙ^àu4·¨/aÚu�…`dÇ’ ÄÙº@>5.—ÿôe#B«§sîýµØÒ׹ˉY,e  Û#rñV@ùñ®…„qLr–ŠàÅîeÆê�sÁ€Ð¥ŸcÜ�p«a^™Y +–bßI,ïaʼnµ…û«¸‹×ãÄ’Î ³) @`QËÔtù À� 1™†ÚÈ£ïµTÎ�R(@$1Ü,!†èRÚò'NÑòeN¥ +â`¡ØÑ»náfåñ£v €«z¦A‘&âJöXéWl˜Ñ”1�Hž1÷T°Y²—ô €‚Æ|ˆò®~§&>³¡È0�Ûñ0MÈ` Šê9UZÛXT÷GçÇç\�FF=?VêXJ°ÆFé�€ÞÒ<5ªuErc…¹Üæ`i®ðA¨.=¹ ÜL�nPOÎ~¯w¶ÉË�CßNœ°ÈÑD‚“鹞_v•dy@`�H·*O‘rmu0ÅH`$H‡Ž8†ô•&DY6ƒþ‰ª«+áOQ°Êž*A"yƒMHWKzXwr�—ÄÖ˜«‡°‚ �¨°î¡2®,d·æÞ£O +Þf   î-¸\D‘k^¶™73.Ò6ÅΆÓjÖHÚg•í? +óÎå|LAh"vˆ²ÿû +éÇÔ�Ì@Ÿ¤ÁYh¼kÙ­Yq*h"4쬓 +±eEµ 3ÌÖñâL *(P4@£&$Ê¥\Ä Ö?K„=µ°€ Yy +~Æ=Û¶‰Öbó¥¦Å¿ÜØ»ˆ�Ð7G}R*OÓaÈNäV“7Õ6ˆŠÎ<ñIDU�`OÚ^CŸßKÙ@wmÎ/Zجd�H" +t¢ô¶€‹ (dV@5“‰ +í*#”ZŸ¶†ð<©„Qp•j+!T‹ÓÚ¼¨Ú£…: R +9Qi§‘…$îÛ­£€�T¤8¢”QYɉrA"ãCÄwV€�E8R¦"Š(¬.0¦u=µ �I7½:"�XÅ“ÜEm$õ£Q4R|Œ*¬‹É�4áÌÕE4´§6¢‰¥ š Z �eò*™ãÊ´X i’è(¨gÎq¨+ye[^7³¨ªãpà\LÛ"¦¤úd‰‰£pç\ý'PÝFýʈ~–eû©äê +ºªí ë{‹�÷Õr¹DfQ$@6©áÎ2/¨€w0‰äH*£ä\bX€9“ÕÃA"›0QsXF-&AH gÆí´:“È5¦Èª`�-7å΀À‰k)ŸC +ÊLp ÓÊåˆ@�9ù‘ó¬¦`QY Ó"jŠá¦1¯Î‚bõŒ}F<¦”�`¤ùñ¤îu¬‘kMü+{Ô.âDDÏ +ÊfL³±ƒG#4ß*bRÎÁ@Ô“R\¨ÄEçácY\¤äe%`i{Ç3ñ­ŒÈÀ0"ß"ãÄ +Žn©U«7ª¼`œùšÛdÚH’@ïî­¨&úkùwÖƒ$ÊæGm¡„ÄÇ®l8bVPu<oƵíãê ¸ HÐÏì®e˳Ü�Š©Têl»• �8’/UÆ›‹ãº©Qi‚7›Š1tÏ�î0Ûa‚“³qÛ¡×NÊªàÆ­¹@"ÖÔŠ¹Ò¸óô¸Ñ ,q‚Vä´í笟�é·N½ZËÌ ÝIÖAâd`ý²£ÛŒ70E¹]­Ùh­ö· dúˆ•‘é“——ìç2cép¤2¶è»e�ûëŸô‡>Wɹnm+»AÚm…«y�d}Ìö­í1?Ãö=ôÓÏobÿ³Pº–Ú-̉°×Z^Ê¢b) c„ 'hõ¨ãÝcZUÔäS§¶‡•Ù²}(Ž\*�B¨ +Ó‚¨›ðá¬ëž�ãf}ˆ˜‘3L)1VêWÜP=-{Gt×¾¹ïlû€/ŽxL8íÜÑ=õÓ‹ìFâGÃ…O +s#eQ2!­%buìb¶Ù"ˆ�Ú_Õ: …ê$hvùÃÏÝPĬW8S—ÛRÏÛ^uL��Û®ÓÉ­¦åã]Y~†þéùW6‡6ÈÅWÔû˜Æ›ÌÉ4Øneõ@öÏÓ?ßLžØ#Ü.fó¶Ýž�*™T�Ö¼yóñ©uíÂEÍï·Ó¸o ˆ¼O�4�mI�³üZvñš� +ÝRÍý.u´ÿK…Uºd\m� ¨¶ÑÈ‹ DVpcÇ„…÷KCmmåµEu2†×˜®�>—¦Ü°ë…ƒ � 5»+³K°0 ˜î…'âiu^ä.ȉ;¦M¶´DqÝ9S¶ ¼D{ƒòøMrbTýNPÑ +ŠÃ³sd“ã~¤©P7m–X»pï<;hÃí«€¹K& Üû« ¨v‰ƒ#°Ä}õÇ›Ñ�Ù…“˜¶ÙìÝ|¦²äc9ˆ<‹èv¦œ«£ VS¸ ˜28L_²*l!q¶S–�bÞ«À·; +ÏU·.1³Ô}ÜDÅþœŠNœ¸Õ‹b„ÈJÈìb¶žÒc–Ë”5€E¢WjG?Q7©tû“Ý&"ÇYÚ£��u&\N}-0H0xŽºt¬§H‰f�1ož¾5¼�8ÉÄŽpbidéqå@Œ$w>gº²:ó3jb 4áYn�€1¤TGhMÒc}²Û`+o+MÓ©ç ž�;xñÆ7{j¬uÛøÀ£>ÆÁA�;~®Ø?*ŸM€ýYqã& +ú­ÞTéd ¨¤Øq°‚ ŽDMdôø˜QmaajÐÁ�f ÖÚÒ\H …P'X �D:Æ\‹‰ØÀPI=‚š8pÒ8ÛçK܆Û™<Öæ‘1QRûà *ZxzvÏúB¯J‰£ZtRV $¢iš5¢h¢‰½:&•:&�¢�!X\›Ë#iŽ´ð?:ÜÑNjG,dÙ'¾Õª(š†¡³0!}nd4©�¤�¿ñ«È§"§›(ÂŒÜ�1ÝY™UK-Ëm�,Œ|â«4ZŠÎG\bXÅÀñ6êY3&=¶h§Œ9ømø×H2-HLMg6C�K,dXv˜Ÿ ka„M�6¤IÔi:Ö¤RÜ®#“" ŸQ"ä£Q%~­x ì¬6i\Ùª _R£ÕÎÞÍY0E IÙÎ.TØ�-6�*]T†é×sKe"A�÷y í}<àðªàÊNLŠdí1sØ­ÿª<*­Œ1Ý& ?³ízÆNœ;&I ¨e‘û­?ÍÎ:†ÊŒŠH%™™�»„ÌÝã>4úlYÑ�0ßÖÙ$AÓpf*ýI•T^v’ ¯ùoåYDÞ¶f×qðãz’ÏQ¹×++ ¶ ø¸7Ÿ•¦°“BÁÚ`–&ë7ô{çE�Çs0· ¡ßÃéŠÖŸ62Nñs,ÖƒQ±˜­t õ嘂cC¡³H™ûZ“nÁ“ÜNö Ï÷]¦Ýºrã÷†ÒHX$1q\έӅ`ÌÆÞñ»„pXÐöU2ôÌ÷¨´ëÇ[\Uý ŒX4H&Úðí¿ÚÕ,8²ªã%¥‚�ÄÏ©­¸À=ñʲvcpÇqÜfnÚ�-b#ä;)*ɺÇpbÆŽÂAÐø +i�:ÍìêÃE¢8LˆÐÉ‹r« LÀrv޼}µùÓÁ„tèTGi�øW2@pZòÒ ›±—ê‘sÝñ«ûîŸUÉ“ÝkÛNçá'&.›,•9‚’}"Ât‚¶½À1’U˜H�f#M~ß +Ž~œ`Äì¥ÉU°ú¢ûxÜóוlKä;‡åQá9+ ‰q€€¹‚ÿ-ïá]cÂÊ,�<«Œ \P¾’]®?ŸˆR9þ5|)Á2Ë,*ìÝ&§Òôe@vu-ÍDCMý[‰7í­e™S)p Úbv>³¹Ý…`ÙXì\ŒT¿Ä ¥IÜÄ$0r #ÄTúŽ›déÐPÿH°ú2XöU0ä%ó¨Ó”-µ ¦6¹ÿ(Ö0ôƒ ›ÔÁ:(Öoq~Ê¿ZÑŒqõ( èC°S>‘é1g*î²v�rb ÈŽÙ¿;rÏ�Ø`êJت1n7F½Âº›*’l ¹¿;ŸÛ´˜±‡.w�07GiåjáéHDÊRçiŽ?Õ*k¿Ú×NËiyV_§Œã´03Û»^5¥ÆÀD÷Û�×�apºþyÓQçBtå23ƒõ"5°à+Oˆ± Ùz˜›ü#JÆ>“``‰“mwZ|Í1�·î.O%^úyzq•Ãe?Š&Þ6Ž“z˜±7æÆ[„EPôáñŒo'BN†AÝ>˜ãBôѸ»Ü"úGpï¡:P€ú˜žsÇœið ôÂgsMâæöT±t-‰6 ¯¬Ï¦l">šÓtE›�ý2ún`­íÄ:íûT! û˜ô·¤:—¿÷AùQ‡¦äw�`H�%|j©„†Ü]޶´_§—¤wzÝCX…1#¿Qá_h +>ÝüëúoWf1LJ„Q‹¥Ä–b8}#�€•è•JÃ9UÑIô‹G Ц>™q€À¸g'MîL;,ë´�>1#´Ý8"2÷v÷ÍP, j#¤Çé™;NḖõsõO…?Ó Ó½üë?¤@¡A (�mÊ-h¦q gy,{&uì¬ K™É%ìE�”Ú«ì)3Ýþmg“•œˆô…~ú¦lc*•3AƒÌV[§G^ælH žD\xS^�ABtè§I¼ÞügSK'K�)õ ´kjÇèpí +7}†ºÉþ4ÇH�÷Ën‚'sq온dÿDXUf®âK2FÛ¹¶š÷V±ãwpv²®æÜg„]»f¯›§L˵¦; ÌA¬~‡ em·R +Á""G?â5Q…A‘UéŸi'næ`XÜGŒ'²ºq+*ÃS“\çeVÊ©:,³I夸Òn™ÙvÈsþ5¿k$†‘1}{4×—*®%e£'œEn¼ð¹3>aˆŒ`°õAbÞ…õ­ã³•ªù:YÛ’°,iAn@+{÷,ƒxçM0•P –âb/Î)¦7]^|#ʨ9×>l/‘Ô«(fWs_÷LÛÈÔü?#âlG †‘dˆóköŠè8³õ´O¤øþn53Ò2±Ê�Ü¥KžÝÿv–à+¥¨¹šÑ½sûYKHx ˾u¬/DP ß'I°"ýàÕstç.ŒWœjG)¦1=ýzöin{y-,'»…I:\˜Ôª¸Iúx–,ÇêâM/ѸTPâ#ÓËDz¶øò ÌÏh6Ûxð5,j¨Q`pP�ákW`ƧÔ`ЫhAb8EIºBànyƒ?åiÊ+C¦þ©É7m ŸáY�æÆ´�>Âaš2IåÄý»êÑI“p‰#º£�¦e`Í‘šüÀ‰5§ÃîjH•ƒÒ‚…w±?Ìd�ŒW?Pª…äaËO«êVâ±]X°”õ,OÞS=šÄ’DG¦cI8LùE ÒN!Œ;(bmxÒ>Щµ@9Ó+º¹ñtgÎGoQa$Z{€·}!Ð¨ÆØƒ6ÖÝ7¹ÞK5ûgð­þ˜A�“dÉ!TI �ÎÀÕƒF†õªBŠòqû@••‰›ª™Ü/À�­uõ=YÀT@õrmnàh^·r)U–}{¤Üoo +Ù͑ܣ²쬦|Ì\YÆæ&þžÑzÈêݺtÌŠ§~Óõ!â •ž<¨ÉÕ0�  - M­1yÑ—­8‚�¾¦EÛló '�WS�\FœÄÏ}2e,W[ õá¥C3þ£ÛKH€NÝÀHƒ¨ƒjèéÔªú•TòS#³€¥ýa’AA1´vZæ¢1~�Ül`0Í'éÚª–p [ÏÔ¶<{€¿âð`-Ím2îfC2±>–U¿"l| DÂõRåsasþÊ©ï8ÈѤˆR Lz¤êg—:Êõ9YØ•2F‡ºi­×Öв(wP¨ä~÷ÛJ›õ™}0"D“µž ­z×^�‘e„UËÔd†Úª$�­;І�Ò;/â8o1ÎLcØ$-&â"Â5¿æ=WR6·ôÀìX�Ä�"5½ÍudÊìÁ‚d‚tŽ¿˜¦®ÚX€{¯öó¬ôùŸ>,y,7"±Á0kNsï°M°x�Óo�ÿlÛ�ú„vαÊ&ûþUL>àP2-ÍAQñ-ó©¹ÌFðÊ£X*M»}B¹úŒ­•Ðc+ù¡µÚèÁM¼Æ£ã]9³~“hòΞuÏÔ¦]¨r0>´°XZöš¢e˼n…’@[n�>£s¬Ur¹’n`m£ù}¸Í³8'qس|Çßjé’GmC§—‘ Dìf�¬@%Kú´3x¥—3ôè2;‰kXÚx~u×Ä?ü˜ÿÓZÝÄæÝÜ6�¿†—¬eÉ�ŸÐ¬V-·f²u,ß!](ÎPÜGo™ùÔϾ�ˆ!¹p=Þ5~¡Þa€›ýH¯º—QÔ¶bÐDú$¾“Ul­—)Æ­u#]Ö0A^L Í.�}¶È&o©þóVºµ ¨;]díœvÔVñûÎÅ·�¢DV#[ò¡27R‹—˜ 0Fáõ ÐÖò{®°¬ƒ¬Lß¿�APrl÷míéÛð3‡cTÈÃÛÚêÜ +�|X“Ø{&¬åð �žü"Àÿy…Õ�Ûo:6á¬xÒ “"�ØÊˆÐ0Ýðüj]6Å`Y>¡3çÄÚ„é›,xôã\cq‹ûqö)‘‘@þ™,n$öö¡Äø×Ór.°Ûî­â9K¨[Ø>t½hæF³¸ùš‰ÂqlÚ“êf7âÛ§^Ö5Ö²@$GebrÂéîŽ7ÖgáXÉ¿66R¤nR5QYQ‘DíâÖã©�ì«cÞI-ZÙ©{ls{œe�ïm¿ùµ/Òpê &äÉîòçZÃ�&6,à ÒL.HïÖ£„n÷_Ò µ‹õ,†Ü¢ƒÀöWAYÃ)`ˆŽ3¯Ÿ�¢øÃ�ë žÁÍúl¸›v=„·Õ¸¾¾­`j…¸4ýHv”B/y� ¶æj Óu1²í@NDo¬‘Të³øyWG·˜p°X*I }`Ç`ÔyUr�ÅÊÌ� M»ùü*X0æéñcÄ¡HE +%¯@™ {öº¬i¸X¿=œ*X1æÂ„B“b.c@Ó²¯Œ¼zây �O*ee*»n“xåkÍg'NÄÊ…qÚI“>Ul˜ÆE‚ì7«•ðgËge€A6`Dž>UC�˃+úz‹A?²¶èåV6–¼r?j-Ñ¿ºÙîÁAŸà2#•‰í=(¬ÔdöT:~™ðbƒB¢R.Þ‘�£Â*žÓ +ä4’.møÑÕalØö©îR =,Kr¬cÜ‘½–à“çð½lãʤˆˆûsøU [^ÚÊ®Ii"€ ‹q5}>TP¾áÖI�'Ÿtÿ`ÿf÷¹g’NѸ’N§Œ)wq®ƒ…ÇÒÐMÉ�Z#íó¥Ótù13}òym�$ÇÆ�é²þ£ÜÞ±mÚfoæÝü<«X0åÄÆ\$Ø,\’u“ΆÒÁXmäD˜ï‘ZlYâÈ™? +ÇéòݸhxsŽÞÊé¢h¢‹R¢˜¢ŽQ4Å*)ÒÐÐh¨þ— ìY$ÏΪhÒS¢Š8Ñ@¥­�¢�Q¥QJ�gÜRÄ ŽT銔¨§HÑ¥ +ãê3ƒŒ•[– ‘eViLðªcêÕÛiV[À,6î±6žãMú��X‹I´\Ç9ª‡ ©�D‚9áéœô»ñW&Ö�ÌwéBd±Éå¬r®§Í´X<‡í£pò(GŽ=ÄŠXºƒ�ÁÆê±;`ùk:ÀŽ«±Îâ/h¿ŸÛIºƒ–v«( æôL1ÆÿêK\¿­Bv =ˆbäßT~£kì +ÆÓ?–G q­.`S|0´Átkôëá­s—wêp*6É`ÛH›÷ñáØ^+‹+¾VÆY +‰ê¼ºÁ×Ψ2mÌÓº6ÈýßN¢'_wÜÊ‹$N¦€cZ®7Þ8vÁžÚåÍŸ:g +ˆ +€8‰bÓå·oŒöVJœY˦0ÄÈ&ÀǤênu1]'4cÞcI±‘¤ØÔú~­³éõ)•E®ªçÌ0��æ"DÞüêxú†ØYÔ˜Úw™˜û«~æEelfH:|*KÕe$Šñ3é‰à5ì?ÛÏÿu¼ì°&G«|;@kÀÕúž°à`Û‚nOÉA§“ªq³n=Ŧ@ah [ž¾]¶ª¦Ym§[ýß�Vk�òç÷®ҤÛe¦üì#Ʀ±gÊq$ãCDz²vq½Yz°øFP ‰â9€'Q ×…>—¨|ÄÊÛžÖK÷7ηŸ1Å´ X�³Ä€Z<�¬®|ˆÑ‘@¸6“o!ãXC¼�Ðl-†Õ†„pš~öS¹Ô¦Õ$qbBë~Üko�½!’bó åöí©Œù±œƒ0PªV˜ cºgH�*ž·+¸Ò.J:6�¨_¶·‹ªÊä +&ûL«ç'R$O*ŽLáqc%^×0¥Í‘‰úgûm[ê[Ý~��L››±Y2(ø‘[Ç�p(V—'h$‰$¨Q?|×BÙt�Ë•rPCä*nTL~5G_e·�Ñ<77?Ê?½¬wÖ‹V;d ü¤Îœ8økSLù1\ŠÌÄJ©+¸QìõuÊ2’°Dº�>"õÎù§v2¬ÚÆŠê †Ú5Ñ…›&5fR¤�éh‘Ø`‘ñ¯?.LÙP�i표«�4'BÓÂõÞ3NªÂñ¥OúúUFŸÃ¶Ó&ÊÙ3£.,�)$m¹dæyk«¨Ä2¤ãaÈ‚§ç\y³äxŒ9 £@$o_UΑ'öÚªÎí�íF"H±�šy´Vút]Ìʬ Ô°‚`F¿›MoßTËc ú„ µ®sŒ¦Lq'kI€0o½¹Ö:¬M�ƒ é¼ßnŒ±´ÞF«ÔN@ˆwpÁ,"XÝʵ›&UÈ¢tÀ�4iÍÛÝrj®žøõ´&A}G3äȪ>¥$ŸNŒ¼ã„šéi@’8W.TÉÔ"#¤=P}"D ƒÇ•U7+ä;LÿÒ·øE.�n0Ãù@ŽûQ™\dWU-q?ÿª²§!ÊÄã ƒ#Õ!tüÍøÂúA>©ƒÊÔu;½0…ÄÜ¢H¨§H0¥`  °™·_Õ oñ¹­ãê34ïÂT ¹`KwŸ�m±ž§ãȰJ‘3¨ƒ¥ +r+2„ôê ñ7=ºÓæ"v®é?Ý€oÄ™½gnBÊåE•¬TÇÂ�\žöý¶¸Ö÷ �«#—x¨dÆã tPuLY£¿÷hLn¹Ÿ!StU‹~RÆu㺧ƒcÀ1Á”P Úû@¼æ4šèÀz‚ª¨¢?+“â«Pÿ,§@  ˜“íäãTPùØûˆ"òdáÜ)t¸›eaf,Ü?;�O:L™c�ÄÍö�­õmMëm�&0 +A:ŸËsÇço�<˜ŽqZŒð ê ‰±Œå@m£÷¸ù~0;ª_¥.×@²s»m!¢Âã]yö×lQ +"ˆJ�*,xQLŠ8PR¦)Ò"³‘K©PÅdj"G�g„AvnÖ‰ø*‚�MqC—“x·ª”Q­(4QE‘¦h¢Š(¢Š(4¤h¥Z,½6<ÄVbæÒ#åTQ¶ÔkN—)Ð*XóãËô™óœ}V,­ +Àö�<ô¦ÝN4}¥†è˜hîªÍs³#2Í�m�/i¦½N0B‰�nO‡V²õð�܉Ì|éþ¡6†›,xÐr€@½û SPÀ’ZA6 yÞ¡ú”ê%q¹Ô�Ê$HäÄ®¡Qf&;A& ¶È±õDZ¶ùÓ–1S|ã&'ldØ4¸â'QÛK`‰ëbÄn¼pS”U}ô/²óÜcÏJÆv8Ø9xQ#VfP/ðñ­cÏ� �xMÄyΕ•êñ±"öæ�t硤:ìD9ŽÃ�û_^· Žá iŽÛ[^5eȹT2�A¸#�e2—&ÖâH0mYýJ±…Á �,«ƒ5œpR{£ÎäRýRu€@’ I°u½­Tl€¿•IúÄÆ¥š`OfÑ?*g©€*×¾šwÔÿ_�rˆ`Š‚E¤{ƇQ].ÛDŠáê2eêz&|{•Ž"À-Éb¦"fü«±r† Aï‹VTªEŒI°š¨Œ›v›DéÄÎxrûê¬êŠYˆ $Ø+�«Èζ  q˜áØjÙº±‡ò3\ùŒ H§“8R q¼q#³Î³“ªØ$#1‰*#p칫&A�H¦ìKšåýp±(àI�!`I¾–áVɘ¡P±< G™©Ž°,§pX"ò[l÷Uñ³0õ ÖYˆúFãß =¬;ʱ0 ´Àç])�¬#^"žLƒ“à9Ô—ª îH¾=@¹Ð7ßX=iEÞq¶Ð%Œ¯§÷¸þ]OÂö6÷a ˆ$€/õZmäk›¶!=giÜc—|l ÷šy@ˉ}¶ŸP¸3`}^«Þ$O>5‘‡úë¼L©&Þ’ãdûZ¯˜l¬•Ð8¶µÉ�€¹pb1›ô‚"Ü@‘¥þ^±c¦Ì¨=E2@]K2±´q4[mîËê�§ŽØ_L÷†5lyU‹5ÀS™Ô6<; +†LÈ�¿§ê)5E0rN…­Ûé]<�5걨,Ì�$ÚÇžŸhªÎä�u®\¹ +tÙzXn +e$Æ;ÖÓ‡}íVn£21»¨fúT� ƒÀW 걜�J‹"m»A±>ù®ž•—&"lFæ:Ú ?q£¥F“‘ãsÄÁ$ºHã§Þn§Uv¶’bo\ÍŸê…k}ÝõÔ®gÓxe÷i£¨�Þ×…z§ Iá16Ž3Éû^¢rŽŸ19[ÒD,€$“c2f@�ᮜ%Ydþ©Ÿó¯XlÀ>ÂDÅ ËOa¥æ³—:€à�¦ñûÆÚ�©ªà'ªnI¾¢LÇ…rg!±æ"lD,údËνâ®�F0¿P¹1}oÃ�câÈìæÍøŸ8ðlbÇhÛ;ÍsâÂr«%� +·R. ©�y ÔSF…ÚÞà¸ã–?ÄÏ·êâfõè› å^k!?á§§Hfö1ÒÌ­�_3͉ÅÀS$HùW6S“%¶´I0 *zN¼ÌÚºYöe÷ +˜* 3ëáþUudC‘lJÝO€ ‘ã¥pçê@Æ1„ÈÆ²“¨0IððãZêIaöˆmª ÝZI#SááFRÈø2oJ:�™ôÝ4gÉ‘Œ*°·=R-&"5ŸÛ[é³nH*77Ô +jÖ³xÕz³ý€O¤è$é\½cØ"´�À ¦feP±Ç“yU�2;~‘uáo­¾3�6£Ô¦ä� +Ìs𦠇"‹¦¢>õ’ÞÓ±ÚÆÃ@#óúÎè4å2;*Ywõ9‘B6Õ2Ìe`©Rz¦;«· •Ö;kƒ3…r°Gþ¡& ÛéUæySÏ»/K—\dPvµ·î‰´ñå]Yä âÜ m0¦!¡G |). hŨc©�4 8÷nÚ'œ ó­•\R(¸†$‚6�*5a¶rŠ{@µ!�T@ÁOh(Ú éŨ k�¢(Ú9Tóâ9P¨$n± Á�#T€(Ú&hÛ§iÅ*"ôâ€) +qJ�N"‚&ƒHŠt¢ôè¤E8½ô¢²øÕãp˜2;Åj(¢€-@Eè"œRÖ�-*m„;«}<8O?�cl™¯ÐDê…XÑ"³îJ�GúÎfE9V ³;Liã[¨ïwl »g¶fßíá¤Ì¹”p�ˆ�G1ÛTŠ–Rá=Q#Q#¶n*ú¦$ŒyS϶´�Z"�™Ô7mÝç]37¡Œ žÁûk›/T?¤U­�À"å/å«�¨Ç”�Ž'Cʱ�©V\¨ØÄ2i=±TÅÔcÌX)�±=“Tš˜Ì…¶Íþ‡̉©Ši•2 u ©¸<çR^¡2° +Ú‰I½êôiQ^& ›Ä‹‰"Eµ£/W‹ ™¢ÿg:ÑΪ$ÍùO="�êq’¢nÂ@6&«5v9˜1{Z-´òí­·PŠ`ȹ-Û÷ÒÉÔ.+Çûª[å@ΙP66�DŽÑÙj:â s cá\Ýf ¨$Ï�®�m �33ÇB*mÑãf“:ƒß´ÈŸT +W!ýÝ«òÓ÷RqíË%fý¹rb=Bâ%¢Ê~�ÐH73j¢ôË�BCDˆÆò¯Té&$#Š��ÍW+ìRܵîãð®\x1äÄ…ÕTƒ¸íÒÿ›Ÿmë%~£&,ªc`¬˜äÿš*ÁÆì€Ø“ Û3¤È? +Ž.ŸÔr–Œ XGž@3¨×°Öpt¸›¨Ëh²´ƒµ‰,ú‘‹ Z™Ä¸Ú6ë�’X‚^V'»‡‡*ì”ú„^$ö^)ì ,‘-ǸZ¥‘Fln£_ Uú¸é­Aʶ|@‹29¸¿ÕŽî5Ò¶J«8›z¤j&‡�"œDc,»@Œ`Ç`ðÓN=÷®è®.Ÿ#3æ0�>�«=ÚÖcË„º�övÆOªX«}3¨7Ž¥«¥YW!P#µŽéùUΕgÉî�êºÌþöÙÿEj=1TÍÔ +“�'êþš [ Z8ÜêìVÞ$P¦¹ñåC‘Ô0�ÚMì©øŠG&0®7²7ƒ´:UÖµ€°Õ½KbX1,ŠjiL£0T4±ü»v=Ïeë¥ñ©È¬»AnT�KŒ¦Â-‡‡udôx6íÚ�Ö·¨q·²¨[ÿ:q5Ñâf VH2&àÁ¥@á-Ô³”b +ª� lÞgêŸÏW^,+…v ^öæ�e ›žòLw + +) 'ã­ +6£S4@ioTý”™Ž3ã5œ�>,Œ”9Ö› +4È™�†”�OŒ�Jƒýí|ëK‰TÌ^·SÉ…2Y”ñ4²tøs@tV@@"™éñ @H2 \U*~Æ=Û¶‰™˜¼é@Á�Y˜"†o¨€%»ëJ‹�B¨ E1KÛA¢ÆE¸Ö_§Äì‘Ks Mn) ‰Žm Ç1G³Œ™Ú'œP1"è w +h�(vS"—´»·mÎ/AE<@:PªASÇ�UÝø´Iì]ƪ)@åFÑʳ•\¯¢‘®‘7Tñ&Å™�©ã[¥DV6’T�=Ÿ´RÃÚ“$êcðªE袉¥4º§‹(Ì�×C[ Tòæ¢Ó'³”Õ´Ó�E—p€˜'º–,…æT¬¿#å[šsj&‘0iÍd8$¬Ü\ŽúÂAccÄÔß9\«�m˜ýSØÇOòjô�§EM2†f[úc�ü‰|+r(&¥—3#*ªÎíLÄ\~5iŠLÀ ¨áÌÙFâi¬§p*t«+½9¬>EBãSÉÌÉ`Töú·x~_·+qqH0b@"Õ¢b¹—©÷365‚TÏ÷·EÿÉ­ãÌY78 Íÿ­.T`HaS:SÞ ‰ÅGf|ÎŒ(Rí,?ôÕlfHu�­Åö0$²Ç9ò3m•"ä_]|Ega‘T’$¨$Ñ4.S» a´)d]`켊ÚeWq®¢4魯ñ¹Ú®¤ÄÀ"b´¹É�"&“Y÷ñîØw^Ò&Ý”6|i º�¢L‘a­ë“#¾/,ÐÊ 9‰h‰�ÚÒÄ™ñ±È`,l›®/ê„ùÕQRX—JÞWé;f'�È®LY]S£;‰9 +‡“;¿¥‘¾b½ €„ô˜0o¯Î¹zBÙ°™cgÈ5à¬À_–nŸ"c+�#z˜,O"óÿ G +ÖMø �¥Š¯¦I ì@6Më91„Ú ³~bI¬x×VVØ �ÞAæÀTN]ªÄn2ÒX’ ŽÓ¸mðò �ÓäPŠH"÷$#ãê™ì­uNCà�ÌäomÏÝCbLŒ‰‹�³¯? ü«dV($ ˆ#[:žsó¦º5ß…L²©>7Š—Qˆtç)iÜ«vDSK2�“æÜûÔ�œ'0B`dLaWòowz†¿Ôž#h�Y:wVF\‚@‰_SÄq©ÿ‰±^—+©‚ˆì4‰ +Úƒ­e±¯M‘r¬yzI Æ ü¡uã]Âz‰¾íj&C¸5ŒØñå¿ +^ß¹™…Ѝ¨O(áÎhÉè|q 0´ [V3¬–m¥æÐ <‡§÷>¢õÚaÀåc^gLàt�.øŒˆ’Y£s¾Û_RÒÆ»×<'СI<O|wV:l*ÃK©Ú é;¡®8™ã­c«TÉ•”À‚�a–>uƒƒN¥Ñ”öñzbW\¼*Ù$¸IúT�âaºÆyÀ¥Óô�ãÊ¢¬(ƒÃÓbo…uæ‹O—ˆ®u +�C(�éKpüü<*h cHfƒ±{s¥eò>=Þ�¤dÅ�Fp½ÓõiØ{¶zl=9WE˜h¹ämÚuäLÚk(7çΧŠ%­ûÙ9ÓÆû²u�µDL¯ç¶šó­û{ŠcÛ`A$’O¢"æçòß¾ºœB�Ú¿1\­Ó£"9ÊCº->'æ4$ÓïÔ+\.X°¦6?k9ŸK”±BJ¹}JVå5×Óúºƒvø´üê© + ™&-éßãSwQ‘$¨‹ ‰Û¹F�5Š YêYFÀŠË FòϾòÍt. ‚ÄÉ‘an? +ÈÀdbc·^ñ¥K6—÷ +‚A: ŽköÔÿÀÍÒ``Hþš‚4üº¨Š²ô…CqýB/žë|æ°� Æ›+�S4úfXî?—™«œD¨Ø>¡Êt�…%éÀ,Ic"56ŸŽµ!Ѐ »›“s¡bI‹[êŽêé(�µªC¥„Ú]É?ša¾>cé½¶,]Ü�¨ˆOã[|JÿWc²DH:ƒŒ�(É´îe+Ä›EøxŠOh À’ kM�t|+k€.0�ˆH‹vi–鯿cÜç— +L·n2-m{_N5¦éÔ’E¤Þ8ùÖŽ)3'»…�}¤ŽïÛY2 ìdq�y÷Ó8Ä’u±6;¹Ò2+ˆùRê}Ã�—œ«m$zU Á:ñ¡0#8ÊAÝnM„òÒ˜éÔ1yy1>¶‹rY�à*mþ�Ô/¨(®ÉfÔzH·eQºub ·I3ãßÛY=&'*`út† k7ÁÓ�hôÉ3s< ¾S¶]Öù¬�¹dNºëZöT¼ÄL’Dò<(Ç…1}",§†”>È!‡Æ>U�ÒbVÜ ®?†`w\ÖÆ qLˆ3y´ ­¸ óÔÖ™A¨'E‡”@¶ÖÒ@è°‚NÝL“&f"fyZ¥ÔtûqÄšäF0Gå`Äߺ«‡§E†ÚU¢.d�‰­ +9ñâxÓt¤Bnl~ݦµ“e]® `Ȥ0¢‘M;) H/DÇŽ¾t> yVPÀˆ ÜEMº�ÕU±! ô‚ …î+C¥Ä¸EÜD�W�/ÒaÚ¶°°@�h#¦:s“33‰RŠ¡L,Ië"{«¤°€Á„Š8ÑDÔÓ:dfU2WXï#æ iœ)ñ¬åÎ�:ïs@ñcw“¥l4‰§A¤8‘zzÓ¨·S�rŒDúˆ˜ƒ¥øø*­3QýV?{Ù“¸©m @ VœEªÓJB‚k)�8 â>×"³HÔwÿehS©äÊ1À‚w8ÄýÕ@f”Ó¥S|Ë�•LË ó#O¡¢³“ Ä¥ÚaA&Øv +‹u¸“ fbB¡`lgÐÅM»Åt7¢�Š(¢–”â‘Ö‚iÑEEQEy]K6LF7eoè¶àGïåc]X†iFÐZÜlZ öÚßG#çvT}¡{$žÝ �8Vz¼ù:|-�J«ø»�t‰¹žV®<;†lÁ�¢&Âw=[Ý8Î1�’ÙÑÓ¸+?þ“U2`v��q£eÅ�]°$L,p×…øéd<¹³6HExô”‹ž;ïÃ…uâ-°o×�ÚõÇï¶<;‰Û/�l�p¢ÀÓ÷µ­û™0åPÎX86° E½3Ç‹SWn¯qL¥@�¤ 0’ÊxLn÷wÕ 1Üôtï“ efº’$˜|…S»X‚ ´˜…î;>êçpS­ÃŸéf‰þöHýK9hb$Ä2m#€"'ﮀ™2ä$ä* P²nIŸº—BÊÝ>2«µv,,ÎÑÓQ÷òcÉÔI&5`"8äû”UK2#d“éÜbx,ÛÆ*½VC‹GªZ +Ñ0XØwÖ±cì,4€ŽUÌtùDäwßÀÀUˆ“§Q•ý'ÓÏvҽ˴ωײºÆà€1õF±ÇœW|ê3+0²A†<Œò¼vVú�Û�†"XEå‚ÞGo +ÑÆïq–óÀZŬAžã¥/yò ¡cŒÎ£h:߉‹Åg<ë»xÿ²s¿©EKC�§'_ÿaÔð³ædûë¨ãfemä óý•œ9uI�¤ &N¥xñ¨ô¸º“µØ…æ7Ý:ÈaéŽý¾€4MNh¬š{©q V©M“DÓšTHÍyùz,®¹ÊìFÈ›@¹Pn75‘ä/]*3…e‰¹ÐÌp¤0¾6,€KD‚OÃ_.óƇéƒâlfá·L“ù¦DëÆ…Là™*A6€D ñ“,]6TÊḭ̂À@‚6³7É€þÛ:l®Éu +2Ì VY™½Äêpû}16¹;yTXEfP"›[‰?}m±ä'ÒÝÖÒߢ«*ÜÉ�k�/C™±l\Šäy(O«VÓp±ÛΨý6L…°•…�Á<{*žË‰ÛG Lyü­R=.ouܱ ­Ú fÚò­7JòÅr ÀÚfLÞMoØÍíÀÈÞûNÓ?ÂXŸóª' gÌ2>BÁQÒ  +Ìÿ(øÕmăl…‡™¹-$_ûµ§Ã›w£ Qydß‘‘ßphéúoav†$~è|ë:"ûýP]v±ŽˆámÆ·ì1VBlwM¿z·—͉±ä¸u*xHa’aȤzäI$Àð¬?JìèÛǤôë$ײ´p4ʹ¶åT1�d˜ +.Iù“^o@‡¨Är  ,¨�‰íî®÷ÀZ ‹F¢tñ®\jÙAUË´±}.cs\p®¼˜EÚu�`LÆÙÒ4쬕¶Æöpž7™=õ„èBcØX°÷Kó/îE¢Àéñª®]\›‡ãKL“$ÌÌ÷ÈòšXú]� »CsÌÍâ,*˜°œe‰fibnf;eR)ÅŠFˆ ëDS"”q§K�8 ŠDM8‘H Š"�*(¥O�P(â�HÓš)NŠUªTP(¢‚HS¢Š(¢Š(¢ŠŠZÑ¥:)Ò¢�QJ�h¸Ó¥éQ@µ:(¢Š(¢Š(éQE:ÌÓ¢€hš(¢‰¢Š(4ME"iÑ¥DÑEQDÑ4QEQJŠt©Ò§E(¢Š(§JŠtViÑ1YŸ* é^�…:)P(áN”Þ•:tQE(¤Ä.¦€Àèf(¢Š*mŸ3êu¬‘[V pA§I².1,@¦4½0Ò'…NŠÊº´Á àkTQE"ÁA$Äk@`f�S¥Yw$ó�:jÁ®)ÖY ?OÊ…pú|¢µEë �)ƒÈŸ*Æ.¥2¶ÕÝ=ªËóZ[„Äß•j•Mc&AŽ&n@°'^êÕ:(¨eêñáWf>”»}°&ñÙV 8Ó ˜£Ztª �Yƒ¿©†„ð×AÃZld„¸’IÐxVƒ:‹€O¾¡‹.|€�q�n?+MÌñ�;ª¸U’y_Y™›êM¹ +±5Ë�";e0a=B=P“·�kp¿…c¾%+1†"Òxíä,;O§êÎEra¶± +WG�¯ƒ#ÂxÖƒäÞ�g@éþñÜyÏ¿X²e%‹€ª4GyÓðæxi²²!` ™ˆHç¨�n7¬�Ôê+MÄÙ¸zx�òªjÙÔ +8�¤ÞA7Ý:r<4¦ãXÄ¢Y¤–� ãÇM;¢Õ]ùq˜#}�Ä6¶¼gáYGË™l@ÓÔ/6Óö5t ´n2`Iˆ“FFØ¥‹I'@³\¸ñ G#b28´^aqðáiøÓL™+é2cóF ýÑÛG½‘ž^ò¤ØF† S~V`±.gCöìý¹9œnP &þž|tá[É™R“'@.`'ºãºhÈZ~¸p«ã."Î.vÛ+Ñ»*ºñ$ÄŸ +鬴Ÿ-+œáÆH¼ òò©bÉ�Ïæ ¶Õ-'Â’ŒÒ|ØÊÄO(ÿ}�úV|—/º$5¶©khûípfºªY îP ‚ÛöTqŒ¹b¶í½Ê ãœðÓ™92´!GÜÝHð#Æ�dd%ƒ6å§Ö´ˆ#M*92gQ�w@ C·Õ�¨�»B¬I´òáUEÊØÈRDñÉr$rißQÅïf\o‘›Ü.¼4cΪã+»’áE‚/Qˆ:öüè8²dÈ ™ u�4"ãÇíÇi»Õs"EÁ &‰û»xÔ+‹�smYÝ´Kn±›ð?·Ÿ^eS¸ÍíÌçÆõR@Ö¹ŽÞ�É&͈¢Ä(Òü…øE#»E%¬ÖŽÄÏù¿:Er’ž¸[î“6©û�#Ó«á +Ù �±º~¥a`Æž”+“¸f +ÛýG”÷Ž=�µŒžç¥CÚ¨–�GÔA½¸O;ªÃ#’^ÛIbLm ¥´çzÛ6h;T� 2DÈ×™¾B«�ÖÛ�`�à/ZɺÐ äL¾¥‹…!‚üÁýé°Öõ<øóº¨Z à ;ayvkZl9v[anÑé^DwrøŠÊô�înÜcSÜ�FÞVçY|FUpì ‘´Ê|]c^êOг¯©·0‚7} ©V_¦?2ƒ](¹.\‚ma û}…Múf8І“:·u´äoLàtØR†»¤O�ã^U¥ÂáX––i¿<�ÝçÕ +±X´‘s¥5M€ '¾Œ�ˆôëmj+Óz`±<çChÓ—eñe ¬ï0�¡˜2|­W°QÃH"8ƒ¯…côáP¢Úd˜$\êG#7ï¾µ,½fV ©ñHìÓË�@ã9_ÝÜ@ )×qÔjE¯ÎºŽ'Ê,Û0ÃB/¥S&BKÄöUf°UÉ$ZÓ~zŠˆé²NBr,}2¾”X�±7­ÈC?¨ñhð÷Ïm%ÀâìÀž`mq5¬82Y›q=€Ïέ\ã{¾á`lE–÷Û7$þí/Ñ�û÷4ÌýF.6é?:y1ª•¼\•cìhÁŒœbÆ;[ÄÉ¿:Ûá“*Jé§ga·a¡°‚›5fxδŸö’l@Ý?�dtÐG¨€€=ÿ²+k†s\ðî¬ãé½³v$pT?M/¼1ÀÐéøò«�+9äB¡ŠÏ¨ó©ä>×õL,8ááH Îûˆ0¤Gn¼ãPn¯ IØôZS…ËE…ùyÑ‹®÷€*„ÌA‘à1ÀM,¹:‡Ê¨…oß"D~oOhŽíjé™™È+Ñ>6ªÍ:ÆLc(*t:ˆ™¯\Ï�GR–Õ| +V‚™BâAÈhª °ðÓªf.»e•f˜˜åQé:̹€fX%v°eݥȆíå]Ói®eêr;0P=&àØí– õ‹|j§#¸ƒ1{Mõã­sáë&àA�A8ßÿ;ñ®Ž�™–æ`°“©ÚÄ}Õ¼�°v’ï=Õ-ù”‚FàOG2K|©ä|«,"’8‘ß }¼jMÕ3@Hâ ú¢  `Øò¦¹�¶n‹É•6 0ž ×H˜½O7¸@@¾¤M¼ÅOÜÊŠÛ¶±Pt•¼qá®�fð,XO1uo.GP6©2`›BŽfH¬`Î_+ãÔ*«n縸�ók}GûŸÝo•AW.$;H$3@ü¦ZÓimjþ²ÀÈj9ük*¬®ÌLÌ[”O쬙³±€³"8­§‡ØRËÔ:åDÜ ÓŠ•^ÏÞûq\˜ÁCëm¬x(%vþ5<”°êÆÓ¶6††˜ã»KRrÅLk6\‚µ„Ìê~Ʋr·º¸¦åX–·åÛÃüªÛ3•µ�möÈøÔú|å·Þ@˜i 6}=ô°;dÇ»ßL�À »…¬omQq²»¹ &Â5*4Ÿk9Kb]ÌíÔXÎB€g„š^þ스••$}7ˆ�où¹wê+'¨ÊªÿÑmÃvÐ.­®ßWm"�‡ r¥‰[‘Ù>u§1³mioÊ,7@1¸í·Úf›a¸PƒiÜZ ÍÌ~i“=±n Û“x68ˆ[pЛkÃNt˜±'ÆÄ–²®—í¹ìí¤þö<ŠÂY6�@vÿÞ$‘ðjŠr¦N€Fë÷˜åCá ³2Xèd›A&ñ~¼*Y°ä`¯¹:ßjð¯}¢«í64ƨ@7X6ßnbO‹!̪¨(�ÄOH™ .Úk‹7¼Í`42.ÀGa?°QÓãp±Ç²MÉ!‹kkL:ë5×õ ×)\�œ1R†â6Ã=šV�²Œ€•‘&F�xyTðàuÌïn +8~RÇ™×u<_¨j…Ú712djwW\W&,N™ÈúÀkm-ÛüUGFÊf"ãr,xv�ÒŒ�¬EçÌÑ�]G¨Ä€fŒ›ÚG€­ºÌ¨2*_Ö,¦8ëä9÷ü(8Ý`…‡¨Ÿ¦ÀÉÖk'§e (R°IzËLˆÔÖ½–;YŒ‘kwƒÇ_¤U”4z¢xÅc"¿åƒ ¾5k9G��›@ €ç‰ð}[2÷˜‹ÏÔgï¬uxrfM¨@æ„A¶³‹¦|yÛ)aêP¤Gî–#ý#>7Èžâ2óyÔŠeÐmd“~3 ŠÖÜ�€ɽh«îDq¬{OIgQöñ¬eéÎLˆâ=�2¤ðþÓbÈÍ»Ó`Ã�æ�¤:LŠÊTª�h:[´ýµ¶%ʬ©îq1Äðª�bÕ‚Ì¡Žú�éò{þáe° :4L™þŸOÓ䯻r2´DmR¶8³VLØ·ó36 +L€5DkQÆ]‚²åÆÓ B¤1?yŒyi]#rÄïX‹ ¦Þ;¯åK/M“.=…ÄîV/î�Ñ»9×9ÃŒdØU &@µåDÚw_»²½*Í:Uœ˜ýÀâ ÍŒvЉ툒{ëtQN•SQE#EkOJQE:)QN�E•éÑ4QJœÑE)§EgxݶDò§Fà8Ó¥DÓ¥ÛNi)ëQ^¥XÀ Àék˜±¤Ý@Ü‹U“Õ*°]­s�i/TöÁ2H°6‰®WçCuЬFÖ€`˜´øÜø +yzµÆ`«>•'_ì¤Ýn5-ÛuÚ'„�ÚO+¡ozã^±FL·f€„ño§÷´‹q|]G»bŒ¶‘1§�5ž¨°ÚUˆƒ&ÊÄ~ÚOÖ">Èb{:DùH¬Ž¹[¸G2È¥@õ§¸WêhÜ ì®%.r`pÙUH$«w18ýSØ$F—Ò½!œ2–˜›9Ç +?R…ds#ùL•c\®`©S� î$ˆ< ½º³š¦ËãY �xdÖòfe!U mÞ$|+#ªœeö4é¶Óç1ñøÓÜd‘ïŸ*‡[‘¡¶Ä Ç_H„cëqçx®Àkƒ¡ê`F`ZBÉ‹±!DˆùÝ]kŸq€§†¼�Þ<ŒÓ+PËÔºe‹»˜ÐÁ˜ “ «Êçrq¸´ B=¤ù×@Ï*NÒ;¿o¶µ—¯^¡¶ÊÃc‡ü+§#ìjOÔœFmÈ–²óôü+ú—g +Ê rMç„T‡Y‘÷mÄNÓ¡;LI<-άùJ­„· ó¨˜êÃcʃQ"eH›råqK§Ï“bo['ÔÖ�>4ÑAÍ–ßP¼�t‡ˆûkœÒ²€ÛåØþ³|*Ùº‡PƒÝ”0“ÝAß÷«g>ueS�`Å÷i>¬9²e-¹@ Û·G…¨Í™Õ‚¦Ù2}F,5�â*yº—Ã#äX(¬ÖõYþï—ÆµÒãd/¹UF悬Né:‘�fWÄ£oòöòåPÎ2oÄÄ(h6“´Ã,^>êëGp„äoe¾•ÆÄ\0”hÝÚÜ÷�¶¼k»&BˆÌ0 �©ì¤2Ëmî챟¹ñõY²m;T¾Ó*Á9ßS¤Ž/Q˜¼‚ZËpv[Õ&&Æà 5¤ÊeÈ[’?ÌËûjKÖdöò4¯¡ LL&tªôÅ4ÆwÆžCCnñ©/¬–+;¯ÂXñ��H¼$Ý`L O`:qç­ +¥2dÝĹ[±žëÓþ›)Ç—ËJY§A¡b5ŽUu,4¼xÄ×/Bë‰LÏ©”ègÔ W~2‘^kîe`ŒC=$øb;¦{xWGJw3mÜ@¾â6‚X“ Ž~w¬‰Ì1‡?J—?C Y\Áº£gѯ±‚蟚#‡:Ž,å}æöòz²¡cIP¸”˜Žhl°zhL–X>†ôÝ5µ¸×J’…Ы^nǨ³kãö‘3ņ1o!Œ C 3û‚W^ô“Ê«‹.6]ɉ”G(dðÚ@o„Vñ1PT«]Ÿ�´’Ôß!B­µˆˆ°3ê�”VYV ±+H`J™Ú?»cÕg£Ñˆ¥§Ô6z¹q=æ²�VP€>…€¼;fޣݭ¹Åë¬\^ÕÃÓ;àÁ�Ä嶨€ºH'é·}v:±Q¤�Gíïì­bÆ1"¨à¾µÏ™3 €�«°µù~jh¬¹È7ž’�ý4Ë;îmŽ hbZDÛÕ6¿í­âwxô@âL‹ök1u†EÜt‰‹'Ç•`äÊÖöøÏ@®|x2b`nÐD³4³Y¯êáW/µ›jîm£N7h€¬7Nq öæwb/´ LjXûÂɑɯÇ@+ ê1Ó¡¼ÇdÖ‚;¢á8ÎÝ»X’¢-´Ÿº€®™]½¶ Íä^Ê9öP0”ÄQU¯—}ÈüÏî6�æ(lY6âm„”"u^ØáVÊ›‚–ZHÖÜ5ªcMŠ�¨äÅ·(È«&o{íàmùG—mO©ÀýGO• º²ð;Cˆçã­tâ$‰+61÷TºÜG&8]o¤Á}O"æÈP”¸ Ø‚5ÜÇ.Ucî;mÛþ©‘jHÙËQBÞ2uå¿Ú³ÎÓLwW`Ë�åTGpDës3:Íðæ`Ô)�Y�Ææ‡o§ìd9U‚ªþù×xÀ™ñ§�U›Q2'†âyr?mh~Œå9&@d(ë Ö&<ì¼õ°$,HÖ³‡E†;Œ’LF¦kqAE#@§J�QHQ§E +T +t´£�a±npû�‡Óù{ê”�§EƒDÒ"Õ§&ˆ3°º~E­3©®ß}6—Ü$Ú<ébêS7Ó»ÅH*¤€$ÔWªÅ– +™Ciî:S=V%�V¦'„ÌDé­»éœèl™˜ÐêxwÿmgS�.!•O¥€ ÁKÞ±ú´tr»†Á7VY´Ø°ƒKU�‰MÒwã$Gx‹òãV/ýM³Âý•…·8{.àXú@d%[^ÑZ\§lñ:M¾êGªECëF?!Ù­hu +r{pÓô�±ýè��Q˜($Ô“¨V;n#Iƒ9³� G?£0@IÐTW7¾° \ÝLý&Ÿ�¨t[6+‘_w¶»‰ê€|k§'R¨v€XöGÞEU[ureÈS8³ÂOÕ»†œlõ˜‘# ¬�—>VãmkiÔ+ƒ ¬^ iàiŽ¡f öÅruýI~›+ uÛ�Èo¦ê§ÇZén­Tí +ÌÓDN„Íȵ«MÔ& @3Ø{édêJ)mŒÑ¨»çHõ (0föãcÊ¥ÿrAŒ;#‰;`�7$Ì{OfµN—®ÇÕU±CXðÄk¨­çÈh¼±�nT>r�´)=¼&�êUϤL¼Dòí£'P1•$‚bÓ8xŠc!pAI7Æqa8Ä�@Û Ç –™�Në›ÓR A"X’Úhýn8‰0&ÜÏÉM‚„$Æ®/ÞjYŽÓé Ênn@+ºò¬œÁòáPÀ«cb`Øílqþ‘§³gR²FЦÇê¾Ø2ʼQ�—'Q�©X#OK<Çuo{‡(@0 ³ý+sx×H6î§�>çu‚H ö©µçœž©`È3³m˜@YL‹oôø¯ì¬ôx±ŒnQ@&#Á WF<Ø£rÉM¤‹þ_å]„Åü¨¤ž5Ü:•×n×îŸéÇŽµ< ”*ĉgüÛ›c3m ®ƒHä;©cÇÓ.Dú÷�R«3±YL11iÙ”nR6‚ #¯Â£�Úlj +Ùl%`JÚWLchä AõO~¿ÀÊ‹ÔI00M„Â[¾ª0!U@›O¦d“añçP=A8²‡i³A +@�£NÍxÕß&8 Þ@±&áÂ�{\lUX�i¼ ¨ô™ñ¶<›Ê@g&6ÆÖv*}<Ç�;×RçÄØÙ÷� �I0�“6=Ëê#ÿI¶£C[Æ’u5>¡ +Ûˆ‰Žðoå4.d¤ÌkÃ�ê�ƒ0î­‘\=9:²6£#½�ˆÈìëxähëO»ím�®|Õ‡ßK¨\%‹æPê@(^.e†ºÈ›Z/jééScÞ=‹xXÛ𩵳ƒh°×�¯ñ§— t;H q‹Tq�&æÜd$û¼»©ôxÇ´q�AdG`µìj=S•èrâUÈíí¶1 »±‚ µ¦üLvézîf”†.<«œ`l^Þ$07sT’ÍÌ]¾Æ•LÛ½ÂÁ[ÂßwQôð6îçPHöþŒ†\Ÿ§"Û~î >z´Ò­Õ�X£0™!Fíú—SÙÛ¾˜¬�¸Šd“=•\™6 ±ÐVFpx6¼�*çèØ yF»)àUGÂ+92û8 O Ž?V#÷WVýÒÀŽF|©¶H?K�§Æ¹±ôë‹kmf*¤ÇEÂvøU2•T` #XacyÞCÒ`ÚÛHh�=”~—bÞÚÉIÚ$¯#ÙLtØT@EˆVßd]CDH¡QW@=Š&ÂúöÐ@€ráKÛCÀyP¸‘'j�70"hØ Ì §f)ÖF5S Ü(س0'º€Šº-Ê…E_¤Ü+T¶€d hÎp±Ëº ÌžqÂ;è(7¢-¢öÖæµEO"­ÅÅR"ŠBœQEQE!OJ(¥NŠF�ˆ¢ƒQÉÓûŽq—ùÀ«EQ\¯Ö aK/ÔHX¿¨ÐbÃé5ÔHMd¼uî®n£«É…“éb[hP$é}-o*ê�k˜õO±˜c2¯´vÏ«lÏ.=ݶ­¤œxßaõÄÇå‘?²ªr*°MjG:&xÖ=ÿnÛF¾U­Âuô¬û‚àj<¦’½½D‡ß[‰��Svf�oi“rxä5áZ¤Ä‰åM²"ê@ï4²>Á4d̘„»¦)ïX™ÎicÊ™D£9ƒ5¢@ÔÅa3&Q*ÀÇ#Xǘä¸*Aˆƒùj»‚Ü�++ŸUÜŒ�f¹zθáèóu·Ç�Ødã�øWPÈ¢a$Àí:Ç•,½F<0ÂÎ’ykLçÆªºÁÐȃ4ÑÕÄ©»Î²ÝF5}›„ò¤:œ[öo£vÙõm˜˜åAê±@;„ŽÙo +OÕ"¨a$ s3­7Sˆ(mÂÀóî­{‚&§úœ{Kn1=µLyW •3r'ºÆ¥ÔåÛÉßhˆÔ+=ç„-Qr+èf�ê¶ÛÏq�:g¨Ç;fúZú^±Ÿ8Ʀ&`‘itù½0ÌI–×RÇ +ßêqî 7i�¶¿:Êõ˜›FãqåßZ^¡ +–¸ƒo¥§^Îuœ]^,Å•I%u±ïŽú¢å 7ì¯/.DF]NVžØ\•ÑÔtÍÔdüº~uÞ/ÈHŽþÚyz\{@ciˆ‰àmyÒgöQ�UÕØ4‘¼8\é÷öÖ Ò²�7eâ«�¦ÃÑ–öÐr F¦ðOÆ¥�Ë£“Ã!xd#�eÞ0tݰ?Ìc? +Þ\)›©+�PÁ¸ÝýK÷Ú¨Ø1áfȸÁh$i&«ÓtËÓc + p ÄÔ +Ճőü¿§GJ£2’ÂI€{D |ë°}5�B˜žV®eÅ�©Ä�‘U‰Q$�ùÀÝçÆ¹ºcï§LÎ÷8Õ€ãôú›ºãQß�˜$öN—&kr°Ëµ€™'RK<=>uTTWb"N¿æ|k„¡Q·Ak,¼+x“Òç(¹Ÿ¦6‰×¶²):ÎÛ¸²«#iÜXâ8xZžì#(/„Á1+º, � +ž|xý¸GÚªwÝd +A72ŽGeo§Ã‰2–WÜä^âHá;@Ó‡yçTÌ_ÜO§mæ~­Ò±>�ÓMÊ ƒœ›Çî˜ì­ãØG¦-pµG8æ"F�ÙÇŸli ­°ÅͦÓköx}¯FC‹.ä`­6e0d¡¨…Æ`Á¹½”Ör¦ü£vF- Ä^òc�¢¬‰‹i È33¡�{*¸ñªNÑzçȺ±;@™´“¨â;¯ZÉý%Ü3@ŸQ· ûU.§€˜ÁÀz\�n{OØEª˜ñ¦lJ2d«XÛr�ö"'Ô9^–Q‹©(KH:ÛwXý%L�+Ðc�yc—>¦ko]Ñ$ÀÛ2¢ºÓn£Aû*=1œù/¨Û óK®¾Nœ�#3}¬‚OeégÍ„gLe×q¹YõíÚÜ5¥‡¨€7ÂÁxÔTîâJú¿²³ÒeÅ›?P…Õˆ{,É ³Àå»ãT.�>ðív¼k´FØ·2;*¸dÄH‚77qV$ðì®rr>Üáo¢‰XÛyõk üÛ Õz£�ÆÙ�À)7;›ÓaÎõÏÒfE¤‰ÞN„jíûÜOöZ+X6~…#‚B’Ê@‰Û¬©á¯�tc|.T-öÚ06óî­äé1ä4�gŒFáˆÐÁÔV›§F!˜Iôï�'¶²Ý6eoP+1 Ê/¬€`øÒý9&_Õ3ën:À›xQú[AÛ$Ábfff÷Ö¨0"’DÏ2Iù÷ÔW Â4?Sjî|ë¢Å±R +!@$m´Z;+OÓ¦HÜ ŽÓñçãYt÷r(dô©Üñ }ÿn7¨¿K�›q½øÞ&þ™éÒ‰°um �óšM�\ßçRÇÑaÄ»Q`ZÀŸËaòªbGÒd ÷Ñ‹>�vcEUä ÓtV�ÃM;+#ZFšs¤kH`Æ`ŽÁ¥lãV×¾“áGÀAGQLbQÐ@åƒ" î™Ötì�}( +¤_ê}I?�¹×G +ç(=в`†cÂêS�Û–•£³äbO¥€’‹ë5]¬É +th½ý! �*×OÓœEõ +!|¤Óêº�¢H�À˜µrþ�Fon[o¤ýlI�Ö¹ÓÒ><ë}fî›ÜS1eŽ�„h�fL՟ƶâT‰‹×²ÆÂ„©€Ž¢¾®îߺºJ!� VzOO‹wÕ±wN»¢óUdV`Z á#ιsÏõ”cQ%T)øáYêÈÃÓäu±Ì‹_Õ^…CÑêWüÜ#¨¬-²¨Ü6€BÞY§l\ë£Mé7µ„¾I"H,,ƒ´vM ñðŒJA!˜jT^/kxVòô¾ò•f•`A„EoÚh»òáËñªm´T×_Ìj9z” 9ŸÐA‘¶Z>¯Og¡º6vbÙœ«Ù ´›>fª˜JAf,@‰6ñ�Æžlg(Ú“µbmÞ È +M�ˆ´VLcqkGªâyÀ�à<"¹ð«*³ú—,íBÒdÉMùÕGF»·–iˆÖ9°~v­âé$Úà™6í4eéW+–V%Oã?byÓnž…&b×ã3óªªÀŠOˆ9“nÀ©þœ –c"/‡Î´0¥K3¬q숣Ť˜,Kï7¥“ËÌ"~“œnÝ&mˇ…5Â̱°<©Œ`>5ŸÒã‚"Ä’GI“5£�Y÷™˜�mO&1‘J™ƒk§Ì^²:tspÉÐTzŽ›ÝqiIõekFÒ ­3ùÒÇÒîëó¹Ë5Ä}E˜�Vý*Û/øÚ|æ~5“Ñc�}V=Mo�m/ÐàÚÉ´íyÜ74ēnjšÛt¸²&ÖYÔ’}B õãLtØÀ" É3&dò3"°:, ‚Ò-òîª{* ßYÔòŠ^ +D�Âj›DEDôxH�ƒ�ñXÚ{Ä ÑúTc n<,{¶¨‰&8“­k%Ç;Fºñ'Æ´ÊZDZŒ©M ©Ôs�f–^—pW"+‚fnFªª4Ÿmd˜¹×¶›"°‚¬ŒH¦ÑdE¯­4Ƙþ•¸V©hiÑE"hÔR,æÑH8p +�A¸#JÕêq¾SˆPÔAá]?0ó«P NŠ(šT«T…b‘©¾`Ž«Oeµ_¤ÅIú…Æê†e´µ¢@×ü¡V¢‘6¬6]¬«ÌÜ �Nœh\èîøÁ’7[´ª +&k�z´n¡ðw"«1‹å‚ùí>UriÐMO&EÆ¥›A¯`çzÞ´ + QIÝPK3ZŠ ¢‘ps ¨cêŽL®… +í1&=VS"8z¾uÑD×+dɈokƒm‡™�­kÜl°PÀ�«ÈØr½ÙB€±¸‘s¤HO…OªÍ—¤Á“,îöÑŸ€�¢bÕ¬¹_Ǹ†$íb="v–�/ËI©gËÔ>M˜ÂØ6¦ �‘ùZ>£ÀÑ›.Df-�"¨G/ÌZVôxÕº§DéÝÜnP„°Ü I×�aÓ"Š€-qÚ"ò~tç"»+¾è°´|;Ç•>¡¶eÃ7ÞûEÈÚv;Û¦ž5ÏÔ&_ÕcT`'Yh¼ÿJ iVÃÔ�—bNæPH‰MÀéoÊj‰î‡°&ò@Ú!´�Î+yX† + H'¾ }õѶ¶@Ò²=1`pU†V²k_hˆ¶ [çRÉ›7¹ˆqÄíf2H¸ôÚ"ªÁñ¬¶C¤Ú`9så4úmÏ.X�IÚîÍ��Ê¡—+oÄ0b6©•ˆ$M…øÁ«l™Ÿ�£H1g.#üÚÊdm¹ü³Ó¤�Owm´Øå™ŒA,fn·�<©ÿ‰[ò +dsôŸ*–|%}µÞÚØ˜'ê^ʾV="6RÌʪĈ–ô‰·‘ó®,Xºæ‹,îc»{( ÛÚDxø×§�úMâÚÔÆ­¼3i$­È¼êoQ–‘"ÛF–Öÿ}sáF*À;Dn2}BFèjiˆ(¹ÉRîcëÛ§ÇNìýVVˆ'�œÚÖ°ñ Ï%¥çÓ*Ñ·æ4á[ÊÊ?§¸î (½W˜:ö*êL~Ú…’{I“\}[f9Q€Œ¾©A’;k­"…qõÄ©‚Ø€O4´Ï8¹µ˜ð”ÈÎâ9³A�Åf;táY^�†9,Þ¢X®æb‚õh Uð¨"¢ðà8V3`%W±õiïõIñ5¼X%ÚH3¬“Q| ‰�Çv²Í:¨çÛò«tnwæ^ �(îØ�抦DPà�Òþ› yÚ¦q«ä ‰>A+8Ô¶gq EŽòÃq®ÓÃåZÅ�ÜWF"'l 1ôÓö2:{nAí16ñí�oU|l„ Aã˺“ãÈÂÍ >ÃZ‘éòæÆøó²�êT…R¿T‚~£Â›áÉ”_hƒ+rcQ:zG�ip¸É¼Æ§È�øVr`ÊI‚°Zn ��Ûç¼Ý0É�°èvŸî‘Æ)lË:¬A´™µæ…ÂÊå¤\é ;SÍӌΌIôWûÄmŸ"G�uCô™¿R2œŠUU”.Ûú¶Ü¶ïáåZéúL¸ƒu2ÌË ¹‹^æuìªcÑH/’cPŸœxÒÏ‹&LŠÊÊ»y‚ÄÉ¿Ê�ƒ7¹¼ºè@t˜þ.Êž‰±bö‹0Fƒ�üm¼xz…Q¿(f÷v©¾±?}eú6Ènk3™§·øªÁnÃ^\#JM€º²*mM¢/3>T7O¹•§éºö#ÆÆŽ¡„ µ‰u×”öU +8T_¦9o"ó`9ÌiáÎ’t¬�¿|˜˜¹ 1N§hrH˜ãÇo¯QÖ>¨ÜÆË2Bó1sÃIׯª™˜È imoYé³dÈÄ6ÝÓùO#TË�ã½¢T1ï¬åFBDì› $†ûëód +i$ËâMÇlW6Oñ'“í¡`í7†õ¨"ß²½ ÒçΠrgEÞUuúAÖö†0$üê·gÊ¥6›$!ƒvñŽUÜ"……pcfÊÏ»±Ç�Dú¡Š‹�¶ßQâk¥_"î.A‹ŽÍoQLù™ÖY Í ƒ +¶âxVºFÌçs*×î¹Fµ\Ç%†8©3a}:Â�…ï'uø_jÅG~¤¸Ü MÀF";~êèyÛÒB¨ì’4˜å`­i%I�/¯�ùVUˆc{€E¾Sz™Ë›ƒ�©2G¤BØ0dðçç­obs6"dª« õ–?”Ö1¶lÃr¸Q»7 DßNÏ�=õ/™6„+2&EŠÈ�lÒË“*( + =�OÆ�,oœ!߬HÝŽÆÛ#Ä}ךæÉí³+†$)]ÑwH6í¡soVÃúAƒéi¼(¸ñ½_3¥¹µÿÊ�YVlyB3îZ~­×#AùvÖÞ +ØpúovŽ'€&ÕÔ‡r+sמÙòâ�Æâê1ÝW¾`×d>á¿9:GßYÇ�¶ À�&NºyML¡Ç—æ.JŸQ�Y°~êèÎ[eŽÙãÈW&ä#¿¹¼@‡�±¹�X€uŠªcÊÁ2 �x%LD¢s?ºƒx’ä2Èô¨ ÖÒö½§¾®øXçL¢!S"žrçèšÆ‘Û & …¢ÒH‘oœÓé÷çÅ�(b²¡ˆú¦DÇÛöTrä%ß~VÇ´Z-Æ"[QçÍvà%×q37‹p¥“¹um„ˆ,Ü`Úü„Ÿ:Šg/�XØXÞàDZ÷1O§fb븛ƒ-¯©›î¤ˆÁC®]êTÃX‚"Ck qª‘³"ÍÎÖ3ÜV³Ô#åR¡u›øCŒÍ“iõXäyŸó¢¦½>RåÊÑ®âÒ}$‹�ÑñŠk‰Ãäb­ê3båT�{&­ýGIe Í€"`¶¦Ç«d'j+€°nw*#–•L8J<Ä!@6íû»¼j¹D�¤µÁ�Ì‘QÙ�o Fã?>êštï�dØ ’@o¬° ˆ�/:ëVUt�'KI:øëVá\Û3²m¥·I`!EäZýœ|jcdÌ6cOm@¼†€úvGuÚf k\]èrûªƒÜ`Þ–-ùUHº¯*KÒdÅ‘™0@� )%m¡ú�/ǃ)#xUбRNæ·`åÛ[Á�."Ó´ d–?_no.bXÛ„Â÷›poØFWFp +ZæèhÒ/ÙKuAœ9B³*×ÝPDÝ=kG\P$îc ÚÇŽ�–­2e + +•,#[/ßB¦c%¶É: °¶¤ê|c?O—0‰]IãÆGßIpä\͔ǩUMø&ãa·ø�ŸK½�Û´�}ÐD�§¤ÕJÊÝI…’L“ +"I6p Á‘1Ø{�DàÎD¶A3hVÜîM/c1YAÜ ÛGÛÈÖ“§q¸¶Ð[÷{£^>T~Ÿ&СöÃî·3´Ík,»‹;)1`‡y?²°½>U@›–È€l$\žU|8Î4U&bøi\ã¡#ÂÓpÒGæX!­˜[LYÃÉu+m!¿›wÝKJéŒãw hAH´piøÖW£Í([.â¼vÇ)ãÄŽÚèËŒä ‚ ÷ÇÆ’tÌ—Ð@�Ã¼Éø×EQ4ER§J�*&Š(4N•ë3Z¢”ÓhšD­OO‹û4Tþè òªÒÑ¥è¥A¢�—ȸı¾œÐ0�f‰¢‚(§J$ÓÒ³“"b]Î@Í=Â(›Ó¢¸ÿZl}¬€vÀ±$·ªÂÕ£Õ2º¡ÄðDî�´vëZN§sAÛ žÔתÅ@6âbÛ—eA¿Äñ«”°ƒ¦ +Iþ75ØãP=K!RËbI�*ª3éYS A:×áCõ ( I`[Aå6â8ÓÃÔ–e(×ôžÈ›èuáó‘TÉ”bY<Àñ6¨Œù7í(8\±žÁÊŒ]Kf6C# ›IUmcø©åÈT'¤Ý€;dÅþ_m&žL¯º1¨b9’£ý\Ý@\™1e ‚¤Ž Rð1çwÒër·QÒõk ðÁ¶“̤_íʺ}ÆOJ¥¢ÄLéÏíµ�3»°Ú!LLö˶¶ÌE– å1\”ãê#b +Ä5Õ·œ€ q¬EäG�é,ØWb[€ÐDŽC¶—êr”X€Aܰ`ÜÓ_:k�Á"í“ÌGeK<}å(±»k’K;=Χð‚º²þ` ò˜ø +ˆê³l‘7C“Âue_yé]r`T=ܦЈÕþÖ—½•ÉöÂ�¶’fH±Ó‘¶´~§r m'uçl áÌAî>?Ôõ¶@Ý„�˜3´rÓñªûÙe–垨¿„ü(L¹GûEpƒ$Úâ8|k/Ÿ(r`$ ˆ“ÇwÒ§›¬È¦mv6I<½U¨r«´I3"L NÐg—�ë?¨Ë±HÛ$™#Ô6Þ^òuN¸E‡&"$‚IûiZé²åu—éé*|Aš›û™6m°Z`û­ÄþÙ¸ðå8°†²†"×m»ô·1ZWêu„¸“cy¿�ßZýC3:�%b> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ8"ÿÄ\1qB2�Q3AÿÚ ?êsù÷^‡ôù÷^€O™kÑ?§Äµèõ÷ñ hfÇüý,ü~ĵñûµñû _°×Ï›×Ï›-|ù°µóæÀ-üù°·�6 [Ç› xób¢[Ç› xŽÄ)o xŽÀ¥¼GbZüþ#ùÿ@[xŽÂÞ#±BÞ#°·ˆì·ˆì-â;-â; xŽÁ xŽÂÞ#°)oØ[Äv)Kxˆ[ÄD xŽÂÞ#° xŽÂÞ#° xŽÂÞ#±T·ˆì-â"%-òñ)o |�K|…¾@K|‹o�ß"Ûäß!o�Þbù·˜‹k� |…¾@©o�·Èmòù–ù |€[ä-òo xˆ¼GaoؼGao·ˆ…¾@¥¾Bß ù |€[ä-òo�µÈ-ò³ YˆZÌ@-f!k1µ˜…¬ÄÞbùmòù–ñ·ˆì4-â;¥ÿÙendstream +endobj +213 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 16 /Subtype /Image /Width 312 /Length 835 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ8"ÿÄhÑ’S“TCQ‘R1B4D!ÿÚ ?ôýÃ_4û�å¢þé÷!ŸaÆgM0cøÛ3¦˜ R¬wl‘37l‘3Ž&ÇŽÔ‰€1V\v¤L•]ã1{oUž.ËŽÔ‰€1vEÿ;R&J¦öÞ¢& omê¢bÆYÐjDÀÁýM—õ/`¥cÍõܦ5³}w)�DÄmú‘ñ/`}hø�R±æúîS:‰ˆ3�w)�DÄlúÓèAýiô ¥`Îuܦuó½w)™Ó¸�ŸBèŸ@¥aÎõßÏú™ÔL@7þ…è¥ÿÙendstream +endobj +214 0 obj +<< /Filter /FlateDecode /Length 161 >> +stream +H‰t�Kà D÷9…/�Ûœ}.�3dQõC«ÜSlH«$°Æó4˜ppºÀéGè÷¢5D <ô°¤¬�ϺîZ-©[�¬Ô³§Ñ›WL +Õ'¾Âô‚ùÓÎL¢].š—f¿}ÛÉgW%�M–�4äþ3�ÏÚ%Wžâ›ýñ/¡[ÂH;�ÿJàh-Ìcr8”!)6ôYй{ 0‘±Kêendstream +endobj +215 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 640 /Subtype /Image /Width 8 /Length 431 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ €ÿÄ03q�2ÿÚ?Ó)D²Å–X£ËbÛ%¶Åö(G±F=±F-²Ñ‹l”bÛbÛ-¶Å¶Å¶ÉF-±F-±F-²Ñ‹lQ‹lQ‹lQ‹lQ‹lQ‰eŠ1,±F%–(IJÅ–X£ËbYbŒK,Q‰eŠQ,±J%–)D²Å(–X¥Ë¢Ye¥Ø¥Ø¥Ø¥Ø¥Ø¥Ø¥Ø¥Ø¥Ø¥Ø¥اâE§"¤\Š‘rZ±s�V.p*ÅÎX¹À«8¢ç´\àV‹œ´\àV‹œ +ñs�^.p+ÅÎx¹À¯8ãçð�œ!ã8CÆ>p‹åñÎòøçyüs„_?Žp‡ŸÏ8C�•„8ùXGÿÙendstream +endobj +216 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 48 /Subtype /Image /Width 32 /Length 250 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ 0 ÿÄ>qD!Ñ2‚â3ƒ“ÿÚ?úœ9U  ZxÂ4FÀ'aãn4E#–ô¡BÀÊm³ +à?¹žR +< àsïþÒvtéõ=ÇŽç�çoHŸ¹ÚEù.KF¾NÃÿÙendstream +endobj +217 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 832 /Subtype /Image /Width 13 /Length 553 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ @ ÿÄ:1A�!‘2ÿÚ?ýTBñä÷Ïôo_AóýÇ—Ðмy<Bñäð= Ç“Àô/OѼy<Bñäð= Ç“Àô/ß?Ѽy}= Ç“Àô/Oмy<Bñäð= Äð= Äðwï�ßý¬N zñ4-ëÄзoCݼLrñ0M»Ð±7/BÄÛ¼Kr¿±,MËı6ÿkBÅÚ§í +jô$m›Ð‘¶oBEÚ½ +nô,MËİ÷/ܼKrñ0=ÛÄÀ÷oݼLrñ,]«Ð¡¶¯BGÙ¥ˆc!±…ÐïÂèwát;ðº=ØYü,�u?h²=ØY.Ü*—nK· +¥Û…Rí©ö^Š%Ùz*—nbxm>Ì6ÇffTúÓ½f_fM3&“ìÂŒO §Ù…žO³ +'Ùz(ÄðÛ2i™V´i™WãLÊŸZf­9WY“NU×*ë•uʺå]q×q×qמyçžyçr¯™×ÿCçv]ˆWù_ý=iSí'J¿ÿÙendstream +endobj +218 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 4 /Subtype /Image /Width 200 /Length 333 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ÈÿÄ:¢ÒRS1Ñ¡BÿÚ?ô70Í9çv£•Ï–µsÎíßž†¾2Çw�ÛÊ‘ž¿ a¯ôáR$S…HA1õ8T„S…HA1õ8T„S…HA1õ8T„S…HA1õ8T„S…H�L}n!ÇÖáR$[…H@±õ¸T‰ÇÖáR$ѤH‡#…H�}aÈáR{aÊáR'^Ør¸T‰×–®!×–<®ÐÿÙendstream +endobj +219 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 4 /Subtype /Image /Width 13 /Length 188 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  ÿÄ2�¡ÑÿÚ?­ˆâæ¥&;tI¡ÚöÉÿÙendstream +endobj +220 0 obj +<< /BitsPerComponent 1 /DecodeParms << /Columns 2368 /K -1 >> /Filter /CCITTFaxDecode /Height 3127 /ImageMask true /Subtype /Image /Width 2368 /Length 79257 >> +stream +ÿùl£$¸È¹’;RαÈì/89k²ìø¤”ŽÉpPŽò¤ #²dÅ1 íeتúIÃ'ÍC†'ϰši\î%|Òê¯ÕkJ¿õï_ת\UUzªÖº×õXëU×õ¬ìòH�YÉ*ôtG3^PÒ'Fy!˜ŒóÙA"žt@Ê "‚4�DäGŽ3"qŸÑ g…$3mR4a3¡ž# US6xÏ™Ô!¤_: ©èäP3 �4ÐÔ7“@> †}¦»A4Ô$4F†¶¡„ha 4Õáz„xl�ôl V©p��B„]úP¡0‹ˆI’™­­*aa£CÐÑPÂ3°©„Â6n¦¸EåU„që„ ÕRm-'I´›ÒuP‚pË¢mU'):úAYgN¨ñA5Z)èÏGŠ Òa%t¾‚t�'Pè'z•¡j�\¡ê–•z +‘CÑÇIu¥¥„´’´qè§¥éZ8ôqûÐI´qè§áŽë Z;ÒtµÒT–ëKÒ§„qá+I •«[‚)áð–¯ô¨%£½*­'IRÒtµt…F½-*]*¤´M&+ÚT¤(W¦Ò]R]Rý*J–ÒÕ$µj›Q¯Å,zªè†¤µ¤*£úéRBºZ¤’ëUФ«V¨1ô´¼e¸}.4Òª¡ ’¤©-käqF! +é*WŠJ*¿¥ÒB’ëÒHb’Tº×I%½z«ÒÆóçJ—Õ*¯Ôz_ÒQ $½.ï¾—,ŠI $’¥UÖ–ª•%é*¥IcM¥ê­¯éª^©ÂKK¥JX…éimÕWþºÿÕU$�×P–©RZÿz¯OÒKô’U¥¤ºá%Õt‚ »U^ªªºJ’ªUXA-%„ ,^¿«}ué/Õ*ýz_HB¥­b›o÷]RZõÒZø#=>„. ´ª©w¯UÿÕU¤´�`ºú‚¶Òª´¿¥IuÒZ¨ïòzåÖ°«Õ6º×ÕkT�Eª©}ì ¥¤úòÄ7Õtªº(ê¾Cª¤¿¤½%ÿoë­V«ÿ_ª G@—IuîßTÄ-RIRàŠuék˜^—ÿú;ªÒIþ½s 6µILt–af–ª´�ÿ¥ï¥áÂþ–aV–aPI-/«3Uæ‹4VgåüÏKIL,ÇùGÖ©/KA+®’Ò¥¥K\ÂÐY…v÷ìÍfhÜæ7Ì$”¿c×IWÒUÑÞ–•$®«éZºUZ^–’¥¥W«¥ÒJ—N—„¬%¤©uZé*W¤©i:ë}Ö¿Ý}aÖŠÒÒÒM{I{ :V’„›J­(qM¤·^•*QPn’HThTR®ƒŠ‡ ´¿JÒm+Jø|8}bµŽ­+ E]1J›`“±U Ð]¥M •4¡U ¸P¡BOJ˜U ŠN›A1QOV’IT8M6*… +**+ iˆM4Õ0«lŽtÄ-´! +©†Uµá:êªA=°‚`˜M„˜„×H:>0�ŽªTÓ ¦†‘í�6a +ai„LPƒJ2§0„1CDeN""!¢©Å@Áˆ‹#`r™£-ë›+¢ é Ú½Uéõ¾ÿï”ÈúM×î›I´)†“ (a(2#t¢cñÿå¬, mþZ•Ð¥– *ƒ4È �œÔ ä Ã=Db?ÿÿÿÿÿÿÿÿÿÿÿ”ÈŸ,ÂzT‹8H“ŽÔÑn*© Çk1� ÎÖ ìA‘!p¡0œ·F_–vR•y˜Î¤k%"X@ ,ˆjW†°˜S"ÐD½B,v�„hzaí‹�'ÿ©÷¢ý¥¸A A´h&ß é6ÐA6“ï¿Ü¥ Ô)üÞ`Sb—Ø¡tŸI&ÕµoÒn½'K{î¼x ŠŽ5t‰Zô«I´›Å,}!K"Wó´" è''jl/œØ_Rt—ÒÿÒJ¿úøA: ½Ån�ÒúJ¶·ä)Q‰IêA–é³f§R%óQäd2"œtͲ$Èc'2¬‰x‰YDk.««jÿµêA ‚¤�ÄL†E;5“™šêºÉrSLÙ©H�³æGfyC4Œ vO˜F½‘sÖ™#6ˆÆ«HÑ 3Xe"!Ìàð‹€Â5†Q@Ô Ê"æøjØG°fxF°É@Á.ð�‚.•ЈÌÕ2ÊHêi� ÎÐ’‡qH¤ÌAãL�“À�¤¡1"g€Í0ƒ»„gi„Ѳ’ [WÝL Ê$“  MÉ{M4’mSIÕ I†áÔ&—#p×I´4ŸA6“ ]¢­…MU&ÂN®©0д›Â†K‚aÌ”Å!Ì´‚a”f #dÓ3‚ #@fôBLÖZpðL#aÓ¯ý5GààØjšè'p“¦Œíé:Aj—ö–Ø\&G$ƒaÝ3„, ÎA^‰=&ßSæ—4ØVZ æ“é:M ˜oŸ4Ë´¯tœ*M¢]KÒ¤›„kaØH0Òm5KTDpÒ S&„e¡Ïm&—ô™Ô6Ðg -[–}¦ÚZN(ï„ÿÒx ßTÒßÓ Òé÷ªi_wm/KÝ}unšöé×QÇIêÕýöéi:ZAµ“…D¾´ÒVøéj¿ªN•úN—‹Ö®®¾ét�ÿ¥´ßãMûM ý­/q«úzû}[iëèkkw|lŽ·ïzô´¾é6“¥{¥ïi>­ûj�WûŽß†›®úÃ]u¸®¡?ÿÝ÷_÷ ׺ùE­ûÚ^ÿ[õê­¿öèT;×k¯ýºZÒ´­â»Óÿ_\þÒ_î—xû®;UèÖÿ×{ò€½7ïhþÇÿä.iÿuûý¿¯ÿ~]aÃé¿õõ¤8Öõ»ÿ«¢Gÿ( ÿö¼?úý|CõïàÖ¿î-ÿø0¿ÿKß×õ×ÿý(l=_þ>’úÿÿÿËIÿÃZ·û¥°õõ×ýÿÿý¯÷÷ ÿ¿ÿùs_ÿÿÿÿöØúí¥åÅ­{ýu×ÿÿíþªÃÿõÿoýî¿ÿpFý×ÿòÁÿþÍ?ÿÿðà ÿàŒ?n¿ëÿÿ¶¿ÿÿîÿÿÄo:oþi?ûÿÿÿÿþ—ý?ÿùfÿô¯ÿÿöÿ'Û xÌ•ÿÿí¥ÿýß÷ÿþT}/ïIÿ÷§«×ßÿ_tÿþ?ýz_ÿøpÞßé|A|/ÿû »ÿ÷ÿþ¿Ü7„¿ô¾ÿµµ}ë¿n¿­ïþ¿¯¯m}/ÿ÷wúô½_Iÿ®ÿð�ý¿ûûkú[ëûéõÿ~»þ¿®¿Þߺþ¾¿þ«Ûi×g_6½×Õun©+Ûkÿé×ûgDÙÑ~ßÿþS¯¯ïUß}éëúÛöëúKý½þë^¾½ºÿÛëý-¿Zî¿ý×÷õ¿ö–ÚþÞ®¿ß½_Öµj¾ßý÷¶­«~¹ý¿u¾××ÛÛöÕ»µí{t–í>ÌÓkþ½Ÿî¯Û[í>CÒ®Ûn½ÿ§oWöÚÚþÚö—ék÷ûiØNÛ·K®›AÚ\6×m&ˉ¥R+‡§Ã[t£ÐJ¨+d_iZÁ—+ 0VÒNÓ´”1ZV•ºKÁ—-¶ë«m™¦ën×Ù W0­s Û=¶�oü7IºL2õÚJÚR%ƒaé±Ã0JÇtÚM¤Ç “Øh ƒmÈãh$¡h4Ã#„h$Øh&Giy �0ÒM6š ±A´j� �m1LRa†‚M6I¶`‚ȃ‡ Üà i+¦­ÆAFšlPa« $ši°ÒA†LBì$`ÒaS„ÓdpšiÈŽ�&)†dpRn…<0Å5QI4ÒM¥èi6…„{~òhA¿¾ö\$ØC +Ë@gš ái?gŒ*º¶§Í+K +—…¡¤�–zM¦y¥úM‡¦V–̉ó [é:M¤–‘{©™¶«Ó‹ Ü3†“kéh‹m'i6g ZI´�—BqI†‰pm¥ÛI7ÿé.­¢Qôº{Çß_mtŸKñUßVéµI÷ÒÕýûß´­Õì8PpA¶ŸÒ„Ú]:WOi<¥ÉBK§J—K÷K¯ÿ[ÿôÓn/´ßO}?�O¢ÿ½W½_ö÷Huþ¤p¿vG­õØïoKúuzý1t½÷hWkßM·wKúÿ§×öŸ¿Þá½­p»tš÷VÚÇõ÷Yc×éãûC¯®Ñ.&íûïÐî¤p·ÖÖ¿ ß´:÷Ký/Öÿü$ý]ÿýƒ‡¼º®?¨ÿÿý6ßJ5þ‹ðåŠ|{eAw׿¯ðWcýxÿòÜäÛþÿÿéz¿ÿü?øpý/ë¥úý}}5¯ÿö·®w ÷µÿëÔXzúÿúXÿ¯ú_ïÿÅÿ—ÿü0ÿÛ ?ü/¤¿÷¯ûoëÿûÿ„ƒmûÖ¿¯Óÿõÿ_ÿýÿÿÿÿÿÛÿ ·ÿ„wú‚3ÿü‡ÿáÚ_ÿøoü�.�w<.úžÿØx#�ÿ΢{uÿÿè.¿ÿå»ÿ¯ÿððlïÁßAýþOÿi}ÿÿ†ÿ½&ÿÛ¯ÿÿð‚ý>Ú_ÿþ–¿ý=wþ?ÿá¿÷ ÿ­~’_ÿ¥û{í¥ßýø­.¯�ê?ýý¾—ÿ¥û¿ÿý'ývÖ×oÛ¯×ýÿÿOzþ©þ—ýEG¿ÿïm®—ÿÛÿü>¿ß¥ú0á7¶—é_ÿÿ¿ëÿþÿçë~¿Ö¾Ú_¯êÕ7íùÍþ½ZßþþïI~þ—éýôQõ·[ÓÖß½ÿœÿûÈ>ºm¿ý#=ÿ_Û­í¾ÿ×Ûu×ÿ×ýwöuõUûý}[oöëõÝm×µµïíoÿ_Hçÿÿkgöý}jÓ½´¿_uzlÿ¯jÙžÞÚM™÷Wké-_ÿoÛüú×Û^ÿ�f{ýºþ†Ýv’½=mûuí—¾þêïO´®´› 0ÍÜŠáééȃ¼ŽÓn—‘\?m*vÂL0AÈ—¶%`�Ó m%ƒ.vÔæ—^Ÿ{fÙÿªNÂ{wÈ£‡ì6ÂPÁ5VÒôÕ´¤Nim¤ÚIÚi¶�M8«UM6Zi¦�Ó %h Å1H8Zi¡L'b¬6I¦ÂtÓa žƒȃ¦­6!0fÒbm$ ïI¥iUé­²(ëL1I¤·#„šlh8Oh6Ø„è4h$ÓN›I„A`Š6¡×i¨b®ØA4Ó½‘Òpç‡��¸�™jDB9å}Dè&Löt"@›’ãDJÒSˆi"Fl°@ÌÄD ÀdŒÀÈAÆC¬‘A¢ œ™ƒÁÈI“Ç3˜ƒ¹><DJB‘�#²30Âgù5Þ:‹û: ȬT›Î£ÍLƒ#¡)8pˆBäT䌙02@ ˆ‡ aÈG!0†|#ÃÀ3H¹‚5°�ÓMà +<#88Ï9 ç™�„5šf¿fpEÁ�Ð�FŠ Ó äò5†�o=#cTÑò©¤ÚA³×6u•=l$ÈðjÞ¹„ÂÏI¦±Ûiiw¤ß.)ñž5†¬ÕfpaÃ3äÍ�3�ì0�Ôl™Ùø#c'�~š6�•ò;A¥uM&Z¤èCÒv¹4Q4xaÚ ÷ $ÐVZÚM Í�Yà<(A:[.”ƒaq« ÎVN—8I„Ãe¡7M"CÒÙgM¥„°¡29¤îáYuû×ÅòoIºuÓIÓFúL=a®–‚ue¢“ nË9´›I´›eд&¡%hŒzV–]÷¤îÓ…A0ÝoTšÝ/K„Åý]_Ò¸M¨Âmm×éô­^�z_u~šKwëE;¾¯/ƒi„ËBµÂ„ϺUI|¤é8]uIூt¯¤›wßK„Òé?ŽÞ¿[»MÕ¦=ÿéuîîßÓUï¶þïKM?л^¥Â%ã_¦—Mm +Aýú]‡ï ïºê>øâ½ý®½?ë{ûªâ­û·ÖãDp«½´÷[¯×¡ß¿¿__m>ê5î¾÷ڑ¨þ»¿½zº‹º�ÿMÃÿÞ—í=ô‡´õÖ»ïM¿üi×÷¤—¯_oãõ»ü‚{÷ÿ~÷¡_§ø{ãOôÿ¢êø÷-Ê uÿú®ßß{õ·~Ý%üuë~—ÿÑ1É'¿½ãøûÃî¶×ÿE§ÿúÿïëúß°~’þºÿÿãëõÿøaÿíë—X?áéK(ÿëÿÿý oïIt—Ø{ë×ÿ·×þ¸]ÿ]üà­ïÿÿûikÿúÿñaÿï®”?Øý/ÿûÿýÿºÿ°þÕµÿöí¥àŒ?ïÿü‡ÿþÿÿÿÞ³£#¿ÿÿÿ ÿöëÛý‡¥þ ÿÿïþ ?ýôHdwÿ†ÿ4Ÿ¯ÿ ëº^‚| ¿ÿ ÿñ ÿÿÿì0—_ßÿÿ£û~ÿëàßá½°�ÿ¿ÿðÿíÖ¨ßáÿIõÿì­ˆ^—¥ÿý¥ÿø}nÿ¿þ!aÿßßÿ[ÿûû þ¯é/ÿëõþÃ}~­á/ïÃ¥±_þúèÂ𗯯þ—í¥ïïÿÿØeUKïÿ÷[÷¯½{þ´¯ô¿¿ýýÝ}Ž+÷}*K¯úlêžëH]~´½ÿÿß«oö÷÷5=½þÿïsŸ¶CKø{¿ï¯ö½ïþßÿ·ßôÒýßœÿÕ_ÿÿK_^õׯµýëÊ×ÿÿïÿmûöïý/ý~“öuOùÓé&ÿU~ÿ½/ÿ!:t¾½vÝ~ºÿÿÛ'Wér=ëÿV¾Þ¾Úÿ]6g°×ÛÿlÍH?õÛ?Z·÷¯oÝÖß_öïÿ®Œ×þ·¶¿½yûöÌÿºíßû?]÷V•Ú}˜_Û`•¤©&Ãó„aÁñKI=†r‘\;#ɶ–�¥¤Ã 6rÕ6É5M‘x0­ò+‡dzÂL0› å¦Ùɻ󯤡µ]¥Wg×_ÝZJÃ=ØM»nÕ²öÚ_m—´Øa+¦ÒO1õ"¸{ a‚§®’à 6˜ÓM5b´�f 6Ób˜…IÉ^ÂV‚MÅ5±I¶‚M;JIŠ R ˜b“A§LSa bƒ™áŠM0ÅAé±N�°ÒA°ÂUÒ|¼Ø[I4ÓÕUX­4Õ’¶Å1§­¤š|BM6)°�m$ئ¸XA† ™é±VM¦¶“OM„Å! �éµN›MDR4pÁBi¤k†)Ü÷b¡Æ Á#A+¢²"Ñž, Á#ЉšaaB`‘íÏÂi m„ÚhöؤhƒIPh*bb˜i&šl0A'aa;ºÃ% ’µl$¶íOx†ƒt˜B-¬a„ ++ Â„\ÑÅÊÉ:a¤Nga¾kÈ)™lµÅça<ö+h0AŠžäè¡*³Žìtd–åŽ""“Xã«¶”G&çõ_õÛK__þ�l%Tµëþ˜izÖÂ_¶�t!PI‘ØJš² Ì<2&ÌAƒ¤ÚW4\4W1Ò:aÄþZC6-ÉÇsGaÄñYŠæ´·/’HìùØ$e\ +W¸)/HgÂÂáB�üì–…R1…P¥R]uûýò!ëî®Öû'>ïïÿwÿÝÚw%©þ¿û»Y’ZXã¸ÿŽÂ6Q¬4 #aèwa!L Õà +\ Ѱ2žTÂhÑFÂ>BÚC¥èÖÒ 4ƒj› ƒi£Ãdö´´h'A6=Â"ÃC&Òup©Ðg .GmQÏêé?°šdÎæL6š +“a“àšIµG‡†˜Hi6‚wuCI‡‘\S¤6š¤ÞŒí4ƒ#Ê3½ªIÒl*;´›DpÒt›Aœ6L@M¢;l´y¤Ú Îæ“jé6“¤Û,ëKI´Ï2¦Ý$éZN­Âm¸A´I×i:º¥i:Oj�7¤°›K÷¦ªÿ¤’½é&ñoôFôµTFô» $›LŽh&ì6&†÷¤´¯ÚV‚m-+IÚÛA;Õ¥j“V—TºZ^ºN•ïªi;¯êé7^ÓtÒÝŽ*“nÚO¾ïÖ¿ÚûªoºïzÞûÕ4©¥ïÓJ�Þ’´�oõÿõt½µN�'ö½&Ý¿uWkuÕô×_­E[iøÃýhi +îÓûŠØkQ­Úo¯ßëCëÈáwªmÿV†:ýÚ÷ªî*´Ûý>ßZ¼o®‡¾»_\{ý~‡\/®«ýw×–:öÿß�ópÝ[úÿy}÷ô¿–äcº!Ðõ_û§EŽG?û¢÷¾6£ÿÿÒ^Xú´CÇëDÿ«ÿÑ_øÿ-É'ããªßòÓÿÒ¯þôN°Ø}~¿þßëíÿã×,fÿý×Çÿå›NúEŽFŠ-Ì9Äÿ¿ñÞZòÆ}_ÿ–ÿõÿßÿÿÕ÷êÿÿÿÿÿ×êÚûj‘áwÿ¯ÿüê-íqñÿ÷ªÒÿ×ÿÿÿÿ]/Âëÿÿÿÿÿøa†ÿÿûþ í¯ÿ_ßÿí¯ÿÿþ¿ÿÿ×ÿÿÿÿÿÿÁ[¯ÁpFÿÿýÿÿþ ÿÿÿ�áÿ¥ÿ¯Ú;Ò­ÿÿþ­£�_ÿm/Û¯ÿÿÿÿÿÿ÷m/çŽ_ÿÿýÿÿö?ÿÿú_ÿû¾Þ?þ—ÿþ=&ÿÿm/õ¾ïÿÿÿÿÿÒØ¯Â^“ÿÿÿößÿ^áÿûÿÿÖý‡ûÅw¥ÿûßÿÝ¿KÿØ…ÿ_ÿ÷ßíÿýÿ®‚{Òô»m/ïû÷Òý×mßëßÿÿJ¿þÚö*+ÿ¯¿ÿôÇ}þ�_Ø~ÿ~ÿþ—ÿÿ®�Sô½Wÿÿý»ÿÿΩÌ/m~ÿÒÿ×ÿÿoi´¿~ßÿ¼uÿéß}{¿ÿ·ÿëmúþÛ×Û·¶Ûuú¥·}ÿ^ß÷_ë~÷íýšo¿ÿ½ö¾öšooõýÛÛÕ¿~þî¾þÍþ² 9¢~×Õ»_Û3_f�¾Ïöf›^Öë³þ•ÖÚýŸ¿ÔÎ_[ ùûöÏí[a*{Ký[?·½ûgÿ¶f¶Ì×ò?ýÞ“gÿµlúý´¿½´¿ðŽ8l a§ì½Øg&ÒîDÀÂéÈ—‹a‚A†Òµ½+b®´“m$Ô1I§v‚[Mm†`­Z¹ÚlV¬SÓt·olmòz¦Çkµ»_ØziÓ &Ù»I†m† +Æšr%T“Y6ÈzÚv°Ý¶)ŽJìB‘ÅŠ  �a6ƒƒM¬28AˆLS 4ì$ E1I†ÐI¦ÂO äq¸M4tÐM?a'mRa…N„˜P�&Âcah4 ´ ˜b¬*mÚi»": U ˜„ša‘Å„šl ÃA&›I„ÃI¦ë°Â Žjša8a1Z46�ã Úa0@ÅJÆ��˜EÊW0ÁA¤W0Å"¹Êâ„Ec¤Ê,(W*¸paò„ ÅEcD0ŠtP‰ýÌ ÉÄ42²ŠÈ0­; 6ùòXÉùïA„!…Ds¬h¬†ˆ†Š­†(¤ììS'3"T[©2½pˆˆÖW B"97€Ü·%ÉÌDDq&Á'_êë¤ýÕ/Jªô½U/ëÝz¥û¯°—„’¾¶ÒMVµ± T2# #6†‚*AŒöÊãŒüâ3ã�ÿ�eË8Ñ�¬EW"ñTм·YŽÔâYÉ#(�DvEé^3‘nD3H(((P¡M"Y +)Ra&ÂÌ�D6I…;£ä*‘õï÷õ¯פÖû»»û¾úBù¸¾»ê.ôïýe ÷¥»Ó_�ùn_Ä|�ÿ“O#­¿¿ýtõýU×ÿÿêu•yfEYȶK<ŠÙRd¿Ž>vI𙬓ÊH<Û& 8ófC# ü S©žŽ#ñ ѶvV�‘Â!ŠP��D"IŒ àÂ!f "¦A‚N˰A’#u�O›" e�Ñ�ž"ŒÙ`ˆ–]ŸÍY g³ÌàdJŠN˜ Oœ3 È‘Ÿ3 ÈÆhDhR@¥92Fl¬œC‘´pˆ¦`Ž P EØF°äøEÃÐ �†ƒ…„#Ö „h "ó£XgƒDR5ÓL(L&��¦ƒòx&˜LŸÑ°4núhØÑ²‚mT64kjFèFƸ0š`š„ôlaŠ?q@¨øÿMÿ „]²O „Ѭ2‰0�‡H]†±“Á0ƒPž�Í�!%M5m Èù6º ´Èñ´haRnGoG¶“ ½ Û%Á4L44Gd[i6챸TGdy +É¡6“²ÐÏ´›IÒm&ÐfÈ ›KDxÒt›JÑ‘ä ÎM»+,é„ ²ÀË@g ˜~GmË Ú ††“ ÚL4G`Î0ˆ¶ð“o Îæ­«I6ËŸIµpíV-ªOvÚV“é[½n‰>i\&ýa4Ú´•¥¿i^):M ÷º +ÒÒt›„Ótßî‚÷ûúuipL;VÑ'¥¤é7 ¦á7®õÕiiRîÿxïþ—½kþ­½ê�º«_¿[ê«ûªÚ´­îª–·ÖÓz¦ßþ“{íéýÖút› ÂTÖ—ëi¿MÒv�×Þ/ô;vë}G÷ª_¯zCqkãÿw}ø÷ëŽèk{C­®º·}ßCtŸm%þ´?ñ»ë¸ÇCM»ûèmûü/×õ»×ß§ñëÕ¶õ–9�ôXäg¿ÿú-ÉQ¢Ç# WÞ[’)ÿ¯ÿß-ÈÐ+þ›ÿ–9¹/Z �þ½äj+ÿü±ÈÈþ?ËüºÁ½ÿ¥ÿkÿÝcÿ�¿ÿø¯þ0ý¿Å}}[ý_ůºÿüËþß�·ÿz‹_ëª_íÚ¥ÿþ—ÿj©wÿÿÿÿþßÿ¯ÿÿ¿«ûªÿëÿýÿýúõÿý†÷ÿÿ…ÿÝßÿÿÿÿÿøaÿ¾Ãÿÿÿÿþ¿ÿûÿÿÿÿýÿ‚3ÛJÿÃz;Òÿÿðÿûô¯ÿÿÿÿÿÁÿý'ÿÿÿûöÿ×ÿÿÿÿÿýïøAm¥ÿƒm×ÿëáûû¤ßÿÿÿÿÿû_ ¿ÿÿÿ”;ý/ßÿÿÿÿ_ÿ¢�ÿ¥±ÿo«iëßÿôý}ÿÿýßý‡·]l%ýöÚ_õ¶“ ¿ýÿßí×úÿÖêßýhÚÿÝŠ�ÿý*ÿبïÿÿÿýÿÿ¿¯_ÿõõoßKþÿÿëÝ·ÿ¯{ÿ®¿óR}¯Ûßõm-¯ý¿ÿþÛ¿öÈ®í½jÚÿ{o_õ¶“þßÿÿo÷öÛëþ¶ÒoýWoö×kþÿ׿zklÑÙšûÿý¶Öý³?JízlÏ×ÛÛµÿ^êýô»öÍûþÒóNÛKý{JÿíYægþÙžÚG-¯Û>µû¶ímv›^×muÌýÝœ›O1ý¥tÙé´´­+Ç{iÙé´¿´¶Ïaon›¯]µö­Ÿ_·[ &ÏN¿Ú[g%µ]9pí°I4öK«­SVTíSa°ØÓ ¤ûƒNÓb“N)5Pša6 1LqA˜b›H1A´¤¨…„Óc Sh$ÂiÚ X¤í9ÒNEƬU5¶C„¦›i Ø Å6‚Pšv‚MˆA4Ði¦›í†!&¡ÅCôši†)4ÓN�‘a&Ú +škTð»aZ÷L&JÂavŠ (¨¦OvÉXA„¥»Š†AVØMI6iµ ¦›I®Ã a„Á1W|R<0Âåd¤HÐÑíÊ»MO6HüU5°`ƒâ2±Ïr|Hè+²«�Ú B&ÂèÈZ—`ŽÓ£$G3±<1DDc)<ìce)—"h9Ø^Z\ÄqÆ"#¥ÿ]kõý%ÿ½/ {J•0» ‡i¥�S j^ŸEsˆÿü³Ì›•ÇaQÝ2¸q‘¬T’Hî9h-av*pR …'Éfw¨GxPY61™ÙZŠ«GÊ®Ÿ§iúOô×ô¿|;ÿêÖÿýGÿë}ñ¿M%æ\±ó°¤wWêv.¾Y*ÎÆÖ#�ŒýUúOúúúþŸÿõ*‰=I<Ö“òA�q¨ÍD™ÐŽÕG”  R Ι³Í™) ù�3!’"+&2&è)0gAHc!�S!‘,ìÔ”�YÈêd ³ª&"4S"Q’ —3솎26D�š +AŠF(gÅD@dR‚ÄJ4""x‰ƒ#²"/3D8#lý'CÙÈNœÂÂ5˜ƒÀ0�˜AÙ<\Ñ 3»F¶�lü¸"ò Ä3Ãi‚aS<Î4k ½è4kdDF¶v6Q ưer»r&4ByàŸ.ðA‚3†i0�“a á]šf #Xp� #Yˆ;°ƒL Ê"æ¬4{höÏÈÖ<™“F†§à��*��ô ÏÁ&GÔÉí&Òt†´˜hXI‹I†©ºBÃA:M¤Rt ÙÉC¦’aê(÷Pˆ°ÒvZ(‹ &*LôVB ´³H6‚m'dΛp˜a¨ZMȰÒ†–Èí’m IºA´ƒ ¶� *;´4› :AÕ&Ð3f†“²ÑA6‚Ù4ÃH7°TáRiÛ +Ë�-'DxÙhµZM¢~餭�–„ÚN“k­0’n6ô—…„Ãl,'Ku@�iíµ´›JÒ´¶’mx[xLºz\ihœRvƒTÑô›¥iZPßÚ$ô¯u¥IºtIÒ[ª¶®ÒºW¤£Ö‚Ò„þþ­î´— §VýSÇ^ŸwÕ=ëúm}'ë®�SôŸVö«n½ÒëýÒßë„ÒôšÛ¦›Û¦—QÅRn› Òû¥v:ÞÞ•º»Oú´–ÿõÖÿ¡¸õ¥¡ÛûýéG»µ»õîÓî†ïým +—ë´?º^+íþãQJßÝ·.ì:ín5þÝôÚúVþûþ5ÿÚêߥËêÚõï½ëÿ½cïÿÿëþ­¾­¥¸ÿ[×zH/]oOïÕß·øû¯^¯ACÿÿH÷¯÷õÿ—X?ÿ·JZÿÿÿþ‰�yuZúô†+ÿ]ï–ÜÑWÿùu‡õþ¿ì?Õõaÿÿëÿk×íõÿé7ÿï×ÿþ¿×_×úÿû_úÿ}/ýÿý&_ÿý‡ïúmí¥ÿëþõÿÿÿûëýµÿÿ×ýµÿÿÿý¿ ëûÚ®¿ÿߨmÿøEÿoÿö×ÿ‚3ÿõÿVÒÿþÃ{kÿÿÿù£/n—ÿÿÿÿ„wø"Çÿaô‡ÿÿÿÃa¿ÿŸüÿöÁöÒÿð‚ÿÛÿöÒ¿ÿÃí ¿ô¿ÿôþÃAÿÿß„¿ûÕ¨Aÿÿì8?ÿ ¿ðþ¿Øodaÿúÿúï݈/ÿðÞÄ/öÇÿÿJÿâÿ÷h¨~‚ý/ý_Aõÿ_Þßúÿïûu¶ýö¿ü?ýOýí¾ŽŸé]ÿÿ¥ÿ£}þ÷ÿõ¿_ÒûØâ—ÛÛÿþÛ¿×é~ûíúîøE§ÿéï½xI¿m'óR|/ûÿÿúÿ¯÷ûwî–ÚOëþ»ôÒÿî¿ëξm>ëú¯ÚG?Òl˜ý/ýµ_ÿµþÿïmk¿ëoÿý{ýoÛßïô¯ÿ×ï¯]»n¿ë·ê—uþ·½yÅoV—}l‡?ý»Oý­ëY tÎí´›Û?ÚòúÚ[gÿïï¿ý�qŸ³ÿ¶lϵ¶ÒÛÛý~ïoû3Vî­}.Ï÷WJÚWö™u˜]­¤ƒÛIºÛm%ƒ[ý†rÂ0áûeïÛKÛa‚\‰Úa‚8öKJÛ»ÒvKU[Mxl9jÃd\¦Ã­6V$ÃW¤Øfå¶EÇ"¸zr áí‚íH£‡¶Ã76’ÚÚJôµ·IU8f +0˜mÖÈæÒl%Ý¥ ´Â¦šlSšM8®¡°ÂA4lB6ƒ ˜{áÒm…N» S4ÓM4 ¦˜I¦�Õ¦¤ÓbȯL0 6!iÒp°šlAÆ× ÐlUŠ „“[´ ‚a¤Ã“ 4“´Úi«a„˜§„ÅNäZm8qvUÎûaCö ¥cž(ôa…+›1AÄ&,ë£Ð‰�)1 Ô¥qN~(òxÏGÇ+-4Ò+(÷(祄\R!‚Ec4Á„ 4(Öç† )µ°§†ÓHÖÉöžVC'hE¦¬0Pa!J¼«h¬pˆã•Ða„!ˆR¶¤!â@ЈƒQÑ2I�� åº ÁˆŽWÓrÍR ÊëKŠæhDUè.—JñÅRþºUýi/KIiuºJÒm/¯V�.•¤ 6—Á*b˜­�ìÒU A`Áá +�‚ È ¥†ò€RÿËh§–Š¢S™i�FC"¾3´F�Rm©-‘ÙzdeæP¦ˆ…°¡N¨U Ê Žò^ï TµOûßÞÒ}'þïîûï¾£j/wý÷­÷*K®—ÿŽwv1c™kÿâ�Ñ!Úÿëÿéþ«ÿõ×Óʼ”¿:K”™JGchšW¦¿!¢>S¢°ŠÒ/Ì�ÉIšŒ†y ‰k#¨²4Y)¢8y@É¢l‰5š"tÙ Bdp‰²ÉÄ'FØD%€s“ˆO˜CÉÄDN› B6!8„4l�Fl�lÌR�ˆKˆCÍ‘ +Éñ ȤЈr)‚,È–D¡¢Â~q�tS%F_PB ÈìœÈñ#00@Ê#(‹˜PÃk ì4{1Ë€aÂ5†Ð Ó0���“MÚa<#;6(,<&� Ò5ÓØÑ®g‚h5 èØÓMQ±é£[TÑ»£s[MEÛFÀÂa0š„ÉäѰ4|£dÎFÀÔ&��2¢?a!ȼlhöÂ4UQ±šI§‚ Ã8)ç¡Ñ¹ M L5TÕ=Rn�'Iá6“zM¥ fÍ'IÕ á`´�ªeœŽØI´Gm–‚;i6“…DXh÷‹&ÐÃ,„óí-ÛIô¡²ÐÆ“h&ÒmÙá!¡¤ÚºXT›DvÒa²i(‹[i6“I6“¤Û.„Иhl´Q¡¤Û]-(i6“h3„y ÎPé6®­«„�}&Òt�-,*ðƒzNõÂuÐNðM¥téA7pƒÉÅÒ}µtizï ´­'I¸L&à›D¢•¤;ªM �&ÚJ …k­%«_´–ˆÇ½ºM»T�-'Iºk„ß®£Ž*ézëÓii?ŽÞ»×½m®˜¿NÓz§C¥[ºÿ®¯¿[M¸¯j/¶î¾ý=i:§Š[ê�½µMú_­/îïŽ`Núô.¶µuÞݾ½zº÷ëŽ÷}Öë­®½Þ—é}ûë¥Å~ÿûÿÖÿþ—÷ïÿm×ývï·_¥ÿ„¸Cnÿÿv+ÿÿþáÝÝ}Òý÷÷ýzýÿý{÷¯×ÿ¿ß×ý}ß×Ûÿÿ]ÿïþë{vÝ×{ö¿zý÷ç7ëÕÿÿý²'ÿýmý¯¯íýßÛo_õ¶uY�Þ¿¯¯][:n¿ÿûßÛ×ývΞc¢%íþÚþûÿZëÿë÷홯ÿ׳?·¯×ßßöÛµÿ]»ÿµö×ÿÖòu¥ý·þß½³5m×ýv}~§/lÑkÙüã»ûNÓÛ]+°›ßá0¾ÖÒ¿í-´“Ì&Ò¾!ß l3–cÕ†s³ÓiwÝ]ží+Km%·I;¿ÂràÂÝ^»gõ¿lÿØaÃVÏN’¥¶Òº[J%"¸i†Á+†ÃMXØÓ´­°Ì2.5‘Ài§vÅZJ˜M;A+›i&œŽ)¦¥b˜¥MŠ Sh% Ý„aŠÒ´•´¦ÚVªšÈá¶Ä&ÖØw"p«‘q« +ÙÓ„i&špÂH6)´ $Û�b ´Ø§i¤ì28A‘ÂN!a$Ú}¤ÓaRi°“ †“[´*a\&)m„ël•„ƒ *AÛA„¤Š °˜¦)0ØPš±&�­´öŠz °šM¤ÓbCPƒ0™*¥+ŠÁŠÈ0ƒÄ'b0M ¬`Á8Š>2„" £†Dr¨¥ +JÊÉ!0„DeØFDˆ·/ˆŒÖˆ0@Âg3ì'1’ aQO�^Wp\·P…•eìœíW2cE½Pˆâ""“•Ƹ�ÿé½z­¥é%¥úIu_ý~’X$©¶‚¨ŠxA¦ª Âtš`Ë\Qes 'Pn#ÿòÜ-Ño¬v&Ãjˆs®heʉÖM9e T®$Îñ„ÎÇs%4�p§cƒ‘†0�  5#wúŸkA¤Ò‡ô~tæß;,Dºëß~�‡—?¥i6“~EC�œÀh.=ÝÿKï�…m «jÞÒ/˜Eó )nHs–ä‡;ÿöž?¿Ž–—Š6Aôqbqü—úøé×}á'I¾¶·ÿ×þw5�âQä ’Ö’º¹&y©%IW]~m� ú$Ë9ÌêE6úÛÿ—÷~ ÿ»Â ÿÿÿõú[ /ü7õè§¥ÿý¥ú¶-õÿã[¿þ—}ÿø}ÿÿ¥ý÷Ýÿð—A{û^Õ´¿õõÿÃé_×_¯ÿú[þþö¿ûú_¿ÿÿÿ\$7þû¥ÿí¥þ߯N®¯þÙlè¿ýi¾›¿:§Õîý~öß÷wþ—ûgUým¤Úÿé~¾–kþ›î®¯ÒßmõÞõ¶ÿÛÿöß_ßïû¿ÿ­·ûfŠýµÛß_úÛ3Ïv¿ßZF{fyË}ö׬ûm]ûOlúºnÏýÝ7¯ýŸWë÷¶g¶¾ÙšmL××öCÏÿØ]#–é]žÒ»Þ–ÚIápõKºÕm+I´›Iµ´“ÛI´¿Ó‘›´›76Mm&ÊEpõÓl&È8k¶l4›Õ²ójÞ�VÖ ¶)4± +Ò°›i&Å&œŽM4í ƒb›ˆN� í´“Èâ+¦Òm&; 'l4˜i +Óa4ìT§a&)ŠM=&*š 4؄Ȏ¡h0›":b˜î)ŠcöšÛO°“Ni°‚«ba„ m5´ôÐPšiÅ\l'H11 ‘ˆ$h‡!¥aæk8f‰Þ¸#ãF¼*ÂH1A„�th±A‚i©áÏhhÑ Ô&Îü50™+A6a28\®¥“˜ˆˆ‡„" ”Ù¼EÄDQ[,”ðHDF]¨Bâ"(!èaü‹L˜n“ˆŽ8½ ±¿JÈö7_ZÐþÒÒ].–•i[¥Q†B7* få§ê>8ˆˆÿù6~º+”EzœÉh"AJ¸Èœ¥rZ|Owð‚ ¥ûô´º¯¤ée{ñ¤5¯I,ì�s´èÈ@•HÛ4/�²HÜF„(†Œó(Î fbf)@… ‹£dp`�” +tQÞlh„É��!Lsx#Â3šÈ*ËòCš†¡ÍáÙ.Ùƒ<¶U䜘F°ÌÍ“› ª£XhØÂ¦L Ó „n£cØÑ± ƒ’ra0˜F¶�d~l 2, +zôÑ¢± L5L&©¡hÜÐBèŸh&Tô†‚ »¢,4´ƒ ›AœÛA› †”4�'&Òp¡3ƒ8i:N“lL ¬³†y¤ÚN‚mp�4à +“jÝ8I&Ðg¨“¥¿@›KKVÒ‚áäá+õ�¥ôÓ®­%{ëÖ––­ÓÝ7'iou&éý’ownµt­Ý÷ÇMGT÷Ý®´µVú~�t�/§i·q·Wkî?í:ZC»^öèw wþ¿�m_øZŽÛ_¾‡Þ¯~QµoûKÖÿß�I‡[’¢ÿqý�ÿñõÿþ^áÃ×þÅuþëÕþ‹N¤KÁs²ÉNÌÜñA�+ÒÒÒt´«KIjÖÒÒªV•%IZKÒVª¿Þÿ}'Gæ�̄JÒŠâ› jè,%¨,$éEa'JéBPëJû½;ïJ5ikÚI¥ØJÔIi´¢’ŠˆL0•&LSk aö¼s°µ�­-¬^œ¤dmU„¬ ˜LUT&!¶‚aT*b¡˜M ¡AÕqý=s°¸V‡×!Aa0« ÂŸì Ä*a5L*DàLSIõÿõÿ]sµ¶¢"*"" Á¸1‘,§’ç”<å”ddj\Ük$ó‘2¤Ô¤"(j•i�§+(CT"A¸A +„h Ï0<#À3ƒ8D˜h–þþ뮯ÚW^—Nï_¿Âi/Ò´¯@ÇöÒ}^ÿ~¯¯§´½øºéÕ¿u#…q½_ô·ý[VðƒAúN·Ò�Ï«ª_}-µß§}&·ëÿ÷º~œwzëÑpÂ-ß­ý•4›þðûÇé¿ÿ–[õÔ{×ÿÿVÖø Ü7ÿMé¤Ú +¿µí/õ_ïúÞÿõÿýñqÝxÂlSioð¯Mõÿ¯ÿÿ£�Kýuÿý·ÿûŸu„ÿƒ‚,~¸Gv¿ø#ÿÿÛ¯ÿ){:²;ÿÿ¿ÿ–T×ÿ5°‹±„k #@3øF€fz4Q„4w\0�Âa™æ ÿ„ Eð‹ÉO™æD&L +‡�™²!£ †s7›‹ä@¦q>H§ R¡…ÈÄ"PGB_#†“h'I°‚uA8Tm4xh'A:0ÐN“hk#†�0ÐZ¦Ÿi¤-¡aSFÆÆÆzF°Ø6OÍm5°��çà��”a„k > Ò´œ%i6]U´ÛWKKW&Ñ7…‚m+K +ˆòË;lÏ@�“"žs(EõD@2#²qhÀÈuàˆ¬©_{Ý÷Û_w÷Õß÷þÿ¸®ëÝ÷ýþ� 4Ô&ša"äü¡4懣qç‘ð­!˜@›FÆM!Â6wíû¼òüçÞÙÕ=ÿWÿú_úùÄîÝûíý-`0ˆ�ÂA°ðAPgq¤ì´+Úi$›JN“ 3Í-&ÿnöÛÖ¶ÒþŸÖ›ý[ÿÛý·Û¯òFûÿ_÷Òt à›’„•½$”--Ò½ÿ¤´�'«Kß^ÏíölÍv»×ßi¶gêÙš¿«?Ú®½í™ö—gêÝ~ý&ÉÕû¯í·×vݺßwwKÿé,}-+Ý{µb™;a„˜`©Ú[iZzL0V%i0¯i0ÂL0Ÿö_Õ†ÒM´�n›»Jé°I†z³ m/Û?¶žÓ´î·i;_^‡Úö†£¶×^i¦aPb˜¤Û Ø ©°è28±L:b�iØH1Lˆôh6(&ƒb­›VJE�¤Ú±LTjÚKvÅG¿ëb¿Çä9ïÔ9 Jþ¼1Ed£`�‚žàÄ)Xà +Wf‹#„&GPR²�UˆL Â…=ÑíϧŒñ (¤Ã Ó SÓÁ 6!&˜M Èã]öõm¯ÿEŒé,4]kÿàËXDs`„A„ !Áˆ¡˜0A¡ÿÿ¿úþÝSZÿÛË:pŠÿÿþ ÿ¨oÿü7ÂOÿýÿh«÷ë@ßÿø7 ÿü7þÿn•»»ÿÃ}/úÛ ECÿKþûÿÞý~µõWþ—ÛÝ'nÞ¿Ý:®¿½%úÿä¿_kíæý>·Z]­7þ«míW¶Û׿¥{OJën‚ÝýØGv]f6ËÖé†raž›Jø}ÑèpÌ¥„m„“Õ4Ób¡Å1_V“Ä&Ò ¦ÆÚ]§† A¥aŠ +ƒ´þši„t¬S W†JìW›MÁ\È¿ƒ@` oŽ#B?þ¿¯…¦¡vƒ¨L'Q–Ù*–È›D�Ì�]IkðÎÑúSµqV¿Âß¡ÿ-pkiýãŽvëú믕~Jz�LŠYÑ󵯮µ#°ƒ Î4ˆhÛ! Ä4— 0AÈ€ÈÈ*É‚òa‘�G¡=IhKBh’�gBÊHÖµú64klª�ÔlhÖÏÁȼ ÃÑá…2O4Âa4ghÐÌHÖ#@`‹€Â4ÖiÂ5†i0ŒàÑ 2à2F`òâ�ÄD9๘sÅ92@¡�ÔÙ4&AÝÂN“iUh"- ¹jhŽê=´i)&\ ÚA´›Òm IÝÃU‘ŽÑù£[TÒðƒF‡ÚIûÝŠZ_J“P¯o]ØX&®´“¥…´�+Ò´Ié;2aG8 l$ÃK29¥ÉœÆ“²Û¬Á3‘Øv&Ãh•Gdím&ýÇÕ<§I¾¶¿§KIÖÕÒi-/^šÿnŸou餶¡6–òº�N +ÉKÂ…!yHºmt´;uß_¯wÿŽº/CqKÒÜwJëqKý}ÿiëíþ¼±ÈèûÕãûÓãú޵,uý~Û[jÝt¿½~n/ï¿Nÿ_ÿŒ?ÿÿÿå•uÇ–ž>¿þ;ÿãú÷wßÿßþ¿aïúúÿÿ¥éiikÿõý¯Ko;N³³¬· ^Uø�ÿÿá½´¿ð_ÿ(¿_ÿýýýÿÿÚzëÿ_ÿ†ý/ýÿþ�ÒÈ®ÿþt¿ÿðFÿäâñÇ]=}ïÿðÞÚ ÿAþ–Ú W¾ûÒÿð‚ûÿG¿èá�@ƈ�0GAMz!2pÊxÐd�Hœh3¡åfƒ(FÈñ�k4ByC( :"PŒJN)Ðd¸¤!æCëÿß¿�·XKÿð—A¥ÿú_¯÷ ¿ÿKþ»aaÞƒ»f�M,&OÂ64l “Âa»'Äü>i&±ªh0��™Á¨Öð�l#uQ¬4l£cÖž�ŒÏÖ ¢ „h{~—ÿo ¿]ÿô†ÒÛ·ßKÿ××ÿõÿh¬h&&™è¬ ›OdÎGm &M„4›A;¸T4˜a6)¶“hŽÛ&pŸA6–Ë &A:L4›T�R „E†‚I¿ööΟ¯¿ÿÿ®“ªíß~»uû¤¿éÅ´µm«m+IÚ‚´Iéi\œR´ŸuDž—L&Ò´´¯«i>­úZN\*MÂm_n�&×o³?®A)í/_ÿøwíííëÞ¿Wþýú¯ÿ´Ÿ¯ö½é¥Oö½wÖƒ Skþ¾Ç[_IÒÕ4�ñû§ÆÝ+«¾öÒºØ=[¯ ÿ¬†9Ÿí6ÌÓ ú³ÿgîÓÛ¯IÒ׿ýoúÝî†ãÖ㑸©-~Æ=§Cwý½m^5Ý&ß¶ †�m&0˜cb­$ÛNÛJŽi¦©§ 0Ûcƒ.L0V°Áv%peÊDæ’v“u"mö_ÖEpÈë1ýÐ"ê¿ä9ÿº!鑤\ŽßEŽFËü>A?õÖ»Ãu÷†ÓÅ2V­’´LUá4à M4ÓO~ØL&˜ Å ‚ 1&Ó´ 'i6P]²{¦ÕÅzå‰[ý3ÿ.¤:Cëþ?¤?ÃåÕýµåÔ¸ü3'ÁŸja +9؈`ŽÇDÉŒ£ÉÑ%`Â× +V6 „„u¥ACi ˜atNšaÿÿÿÿ¯ÿÿý‡¥úÿûߨb"“ˆŠ¹f†ÿÿÿÿÿÿÿÿøaÿÿÿ†ÿöÖ•ýÿÿÿÿÿÿÿþÿÿü7ÿƒk¯ÿÿÿÿ»»ÿÿïðßÿþÿÃoZ_íëûÿïÿÿÿÃïû}ýïëïiiíÿýöïÿ¿ß÷îÿIûðû»h&Ð_ÛöÿöïßÿoûüÓýýÿm¼òþ¼òvB®4+ýÚ_·ßûf‹nû_ÿlÑ}·íšw÷M®Þ¾ëëE¹,W(?ížÞ¿³ßÞ¬3Ûimž›ûöïÖÒ[ô¶ÒnìÂm+†Ã=Ùûm-´¾ÔFš¦ÆÚL‹tØÕ‘å4ئ4ئ �4ؤӶ4Õ‘mÒ±Lln“Ƥí$ÛI4ÛJM0Âb¡&˜`�tŸa„ÂM‚dW²W» %M0ÁZp¤c¤Údvšbƒ"º &lRlB´âe'ˆaÄ2•&DB""ŠO%hD•’Baƒ(l¬††ˆ5,¦‘M™†ÿÿœ€�вš2IKmd)ÙQ‚d ¹‘"ù„œHÖÂËikôO˜Ê2臑ôm×@�´¾";ŽÄR„�[ KylŒÂ/ØEý¤]—Îl/)izºM}áÛÂâ·HkÒz©:OImz�i +ò×)Í™gA‘d�¨¤?µ�Ò%º�q.�g©Iú=ÎóP™<F°Ê0Mœhg¤¼qÔ“Ì4fGˆÎ @ˆæi¢´R#lù‘ãLÒ$fÉ$È6GŒ†2AƒN3 É#›¤û„qP´˜hl³„T¿¤4 êi$TÒPi L86 BiQO!a0Œì#YšÌœÙF°Ñì4h ž0ƒ«¿D½¤ØD£ï×ú¢qVßLñ…KLñ¤øCH6îg -B#°gN“„h'I°“ah�ØFŒ²e~2'ãû»i;Ó¦#¯ÿ¤Þûh5}ÒêJVïMÖ°š´�k°ºV“î�m¹^#²¦òHÓ +W[¯Ý¶�oZÿÅ_Úm[ZêÐíûM¯ôë¤ëÖºé[Oõ2æ‚�H#EJ«áþýÖ×ÿÉôõ¸N½ëõýÝ-Ýúý t:n·áôŸéÃü=ÿ}¿aÿüV¿ü¯cúù N¿í-ÿä=K–8%­ÿú‹ê?°ÿ¿_áÿøa{þض¿ûZ·û×þ¿2��/ÿØIm)H¶¶ÿÿ ÿÿÿû¯û†¿ÿTÿöÒ_Ivÿ>ùÝä'��.9ØøoÿÿÃo»ÿþàŒ?ÿÿÿˆà¿ÿÿèUÿ_°ëÿÃ{ÿÿøA÷ÿþÿáí¥ÿÿÿ*ÚÞr5Ve:" ÔÔ«e!dƒ!™VÈ4@‰4ó‘NgsE;5IšÌ×�:2ÔÔÛý}º÷¾ÿý§IÿßÿüƒélB¿»ÿÆd§y�„xÓ'Ñ © Ð�£CО"á„xh‘ÃÙÐF€a/0�£@9œ„è@ÁËŠl`¤v";Ð."]“²9‚�äð6Q˜a#´D dŒÁ¿ÿZû»ºïþº_ß~Ú_եͦ÷úÿMÄ4 “廬a œ&ƒA0ÂA†ž‚m' 6“Ÿ‚L�¡“{á4›"$-4A‘ò £[&Ð@ÃFàô›TÒoFÀÕNÅ¿^µÍ¶HòûuþºûïÿúëúªVý»ký^_´ƒaÝ–\´LØIµmOV–—:Z]7N©4ƒ<Ò É¨- ûIµ—y¤Ú´“ii6–•éCi7,„Ú Ž}~½]}ï·ÿ~êÚéRÿ}û×õÿ®½ýõý.›Jÿ}¿÷ ®“þ“«¥j+OV•´ûiZõ¥¥K«¤ÒN—¥ÉBKt›§ºoÒ´›JìÂÒ=Z¶—áºî¿¯_ooímuÿþtÛí¶ÚÿKõoÿÕ”±Ì9Ñä‘_!hTGa#ô0ƒ  Ä ÄöåfV0dZáˆMTBJSÃF‹L ıL•¨¥¾îžØA‘]0˜M‘ÒIÚuõoÿñaú_ÿì?ÿoÿÿúHV´„t‡_ñhÈ©Q”’B"0‰*`„fÚÑGˆ2‹œ`Aˆ…¿ˆé6Þ;Mo|$þv Ë`c!Å$v}UôŸÖZàódHÌ31 d4l�Q>HˆFÈ�2f¢¿è‰(#¨É#œtG"“‘Vd"&µ ªhüÑ®�lü��Sd¼ŸšæxP˜EÙ¦†g'ãª6B5† 0�a“Á52ŒÁ„k #@hЦdŒ0Fpy² ódQ�4l‘ 2"Ã"j[u ˆ�C 6“¤áRa„E¶Òp¨‹ 'IÑz„¤ÚA´ƒhZ3°…¡¤A6‚uFÀÓM Þf’a™®M£cÖEãdÒOòQüv•&à¯÷T øIpœ7}zM¥¥h—è—°‰=+WVÂ¤Ú ã'†y…YVõ‹y4&Òi&ÉN;W¨Ê"LÊÌ[‚ÎÛŠ¦ª.¾û¨»¶“¯M‘Ÿz¥®“[nÓ»{÷Ž*“p›^›ñm¥…n•«Ih“áB�1M„ +#» +‚"°šzC»zmÿ½¯ºÚöØ~®…¨¥×´í +î®ýû�Oªú§A…­ÒzÐiöòÇ"øl=Öÿ�õ°þ¹cªVßûu¸oWë[´Û¿Æ—�y¸¿»¨ïûø°àÿÿaÿÿ®~«ŠÿÞüºÃ‡¯½¿¾ˆyôA)¿[þõ_û ¿öúKý‡ÿKßÿøl?_ÿþ]^ZÒÿK2!¥,Gü6ÿý¿Û _C ÿÿý†ÿÿÿý¿þøÿªÿ¨6ÿüýµ÷ù·ÿÿÿü6ÿÿÿÿÒÿ�þšû†ýÃþÄ$¿Ÿíï÷ÿÿáÃÿÿÿÿ¶—ófuèD›3 ÈÛ:ŠC z"LŠ0Ã$�™çŒäNˆA�Å!Šˆ‰ ù=È$œ³É�ä‚$ ƒ" È:dcý¶ßÿ÷þqÁ%ú[÷ëÿøp߯ßÿÿ¶‚üCF¶œ3LÁ£g "ì2EÛÖÂ6Ѭ2y<#`lE$k±£ÛR" „Â5°� Ò!K—cÖ=³M1žÂe¦hÐŒœ3H ô½ßoÿŠÿ·ïíßÿ×m¾þ¿ÿÿt7åŽU´ èh'ävÐM¢,4i6“É�Ðô˜lŸ¦’m&AÙ0„pÑá¤Ú¶ˆ°Ù5a:M„œ(I�4Õ4ga&4›BÿléÑ�ô¿Îé*ÿœël‘¿í×úÿ÷^ßýéÕÒÑ8¯Ât® Ò´›IÚJÑô›} “¤ÚÓH&¤ÚZí$é^ê“ O˜UJZ%ý.Ì×õ½}ÿü3 _I¿þöÍ6ÝëléÑŽ·_ÿ×ýµoÓi_î—×û~©¯«m5þéU~;´ÚÚ[ÞºZ�ûû{¤ïv’¶·W[i{ÝÕÞÈ`6½vÒÃjÞÚM™«Kî×lÏÿí#÷®Ùš†^þêÚ[Šþèo¡¡××C«múŠ·{^‡ôýh]º[îú_Óð�lU„­$ÛI4Ùm ©«r8jºpÒØjÆÅ1·IÚè$Ø`•¥i+i{ åÿWý—­YàϺÇëþXà«–8)c„¾­¿_t•pÿèwõêÿ÷¯ÇzŠL0AˆLR±KuLUªÚtá„í†�V ‘ÓA²:$ÖìMŠaÓ“ ¤š 1AšvÓM6)ŠmŠOº·ëþ�úC�ÿêÝë«Ãÿ–¯ÿÌœ?ÿÿ_š³” ƒDDB"ŽxŒ¥80Ä„T!dàƒÖŠ?@‚5A‚dt# †McG¸`§Š=»ˆMý°ƒVWÿ_ÿÿÿÿ÷ºûaÿ¤¿úÃÛÿûþñIËr"½q¸8ˆˆ¢‘ÿÿÿþ¿ÿý¢ž¿·ÿ¢‡ÿøaú_û¤¿«øÐWÿŸ¿ÿÿÿÿ÷[ÿÿìÿüÛ¯ýº*çÿ¯_ÿ¤ÿÿÿÿÿº_†ÿôÿÛí¥ÿ¶’Oý¥ô¿Þ’êÿÿ·ÿÿ¦ë÷§ÿÒÿü?„ÿ—ý¥ë¥ûT¿ÿ{¿ÿma±Wjÿí¯ýÛo ¡èÃKõm/I´K­mÿïïm/ééú9¿þ¿ýg_ÔõUôšbÚî›UöÿÛöÛ¿zö×{mt¯öÉ×ý·¶h¿ÿÿý2¸³ ¦ÈCbz½]÷g¯ìÿö{lþÝÝ­ïMl3ûÕ×ûa+_Û»[®Cÿ�ÀÈ_- +��‚=¤ÚL6±éªlRjÆÅ1¦ISm-¦)´­dDîÕŠ°ÃMdAØ­%mm4Õ¹ÃMDG)Ú Š¦�a‘ºÓ´Ã ;  ‘ÀA6ÐH4Ø…Xa1LS 5M„îšl&G0˜¤ÛM;»m„é§Ã˜DUŒ 2²KQز B ¨0„D0@Â%hŠ&Qó* �„  Jâ°çr¸«+¤è„HôƒB�yXå¦#h™áÄDFºõ×õÕ´­-¤ÚPÈ]ÁÚ¬#³¸Ž[¨L�b¦v̇ªƒ;”ÒR" +djÿ×Þ·¬Ê‚žÎ"@¯¾ïÅ£µ��ñ{Ÿéþ6“†�OŽvH¿êøIý|­r×gR!Ù1™ 2�l“dB_Òr1‘;*Yõõ„h  EÞQ™áxŒ3æ ¢4Áx‡ Ÿãâ2ƒ#°@ò A•bfȃ͙!ƒ#$Eù²!Šu3QñÔò,juè'H6“xTÓ FÒpª˜I‘êƒjý$l M£[Ê ¡4k#Nk “ʃA„k ¢ §„Ѭ0ƒÖ#FpyO0Œ8h‰4Gup–—¤™æ”'é„ÃI¤�y÷ªM¤Ú^DvÒtƒÈí¨DGzA†Ù3¹á¤FÂ>L4-'д�‡ ¹nJË ²22ñ¦•õ«ÝÝGiëú°ŽîúôµõA6´— ÂÁô�‹XºV­$Ú%ÔŸD‡IÙgMÐeu˜È’ŽF¥©¢šÔkßt¿·ÛWKߨb­W»ºN“ÖáÛݯm[KVé¿éÒ½.Whñ2Ò"ì*£Ä)Ô([J½¶¿ûv¿­®›aë¤5î×ê;½:MÐõ×½o¥ø«ôžÿK|8wƒÅÿàÿñývÁãÿÿÿk¿êß«u×½z ê>ú‹ÿ·ÿ÷ûúÿ·ðÿÿëýÿÿþ¿×ǵ°š|�-Úý‡ÿî—°ÿm%ø°ß¶’ÿ·Kÿïÿú_ëûzÊâX©’–9—ú¥�Ἀ¿÷ü7ÿ@¿‡Ü7‚ÿëÿÿÿíÿzÿêlZþºÿáôŸýƒ/ þÚAþ�í¿ á?í¥ÿÿÿî—ø"ÇÿàŒÿd Ê^v,Ó!g�Ìí;^ïó¢Ãz_üBðÿ²0‹ô·ì7iìB¿ÿÿý´ø@¿þº™*ˆHŒ a�óD'˜r‡1Yz„]šfÆK™xÛ6Ž hˆ0ðFƒ;Â�2àæÅ)ÙvÄG‰"£Ù#Í";„âÈ„eÌ«%Ä’ȶ{#É�’bæÇ“ˆHö—ÿ2NÿÌ­Ûîî—ÿÿúÿüB¿ëþ°–4l SSò †©é i„ÒÓ  Nóò6sò¦�dzÐ&bƒH&Ò?tÂzMê�m4Ô&ˆßLžÖFÆ�×ÕÂ^y?á-sŸ¶tOþŒOÿOÿú(rµ×…ýµÒéÐfÉ–zM„E·&p›i6ˆò”7`‚ÓÉÒÚMh&Ù>L$›IµÙiÙÂÒvZ Ð ØCŽÈ·dü †yªO óÒl$çe>ßÿÿÿªþ—ש#íõ¿õºÿm$Ý~—ÿK÷6úMÂv•¹(Ip›Wt•E¥„ëZ·¾®“j=>–íw%L&ßêÕ'¦ô­}&õÿ�tí;ÿdª¶Ým¥Óÿý·ÿN¿þ�þ¿½zÒoݯJÚý7Iïv¿ÒßÒivõý&Úa=vþúOúô÷L3œŠáêžÃ°Gi*ðì#õívÖé†{´ï¾C¿í#:êïÛI�¥öŸÚ÷×{Ýo}~·Ðï{ßt¿om,i»Ú~ëã¾í¥[¨×Æ» &8Zi¦�±¥h4ÛˆTšv˜EI0ÚÚLvTÕ[a—5Mt­´–D··VÚ_\½´³z}þ¿öñþ[“ Wývý%áýãþßýÿÿè‚MlP`š{Ó¹žÉXLRzÛM-„ÓØ¥bN馚vÄ$ÓNÁ,6A°“L6m´i´Õ¦Ú ˆPÍŸ¿õoúÿñkaÿßÿi{°ýõúÿÝ4¿KùurºtPÄA„"2‘”¨ÁœL¡Á@ÊÛ”Aé%Ü®+~+$1ë5=Ñ�Äóla;¬&˜bšª¯ÿÿ¯«÷þÿö¹á~Øÿ¯ÿÿÿÿ…q +ås=Å!¡lìU$‰!Q°¿ÿÿÿ‚ÿá‡þé~èîëü7þãÿÿÛG—ÿÿúêãЮ#ÿÿÿð�ïÿm/Ãè'ÿÿÒoÿÿõú_TŸÿÿýú ü7·ÿh/Ý|~ƒÿ…ý¿ý¿ÿÿÿKK®´­×û×ÿ¯îDmáÿñÿØ«ÕÿÐ_ÿÿM¥ýÿw¶‚´´´®ºÿÚýu¯÷¿ÿ ·¦*¶÷ôµÿ¯øâ¿÷í&Òm/°•ý/éýµÿô¯7¿úö´íôsÿÕ}µÿiÿ¿Û¼1AŠd>ÎŃ#–Òêö×÷¯_m&þ¯øeíéöÛ_ô¿½ëÿÿoûu+ƒ�–Üà�0ĺÒÌ-Ò^í/ã‡ì3’ßifêÈ=VÒÚ³û¥iY…uØ#Žó +í/óóÒûgïÛ>¯\1ºV”i¶‚M0˜m$áºi±IÚm«Úl=´« SitÇ¥±L8¶’j�Ý:klU§±±ˆÃdsjÛ i¦Ø%m4¶ ª± +Mo6)é„Ä&E@V\ÂÓM Ãi¦Þ“L& ¦a„|0P’!GeHDB"(çˆaˆaC ""!„A‡$ªUrW”èÓ”ÙDDRqÄG)€Ã}ëõú×¶ë°ÒQ„Ø„ƒÙ6CN"9l‚ò×@¦JÙJŠýªƒÉv¦vv8q„D*–ñwÞöJú><.·zÃ™Ú +Ç–¸4niÒ Û¯.Éb{õÿõñþXÒøŽõžÿþC¨?¸·cúîº_•0úvȰ§Ã4* +Òµ†IŠxtîè&�ëöýÿ×I%özëOÿè²Ëë{¦òÓùiãò¸R¶šÞe¼�¤Ú¶“Õ5ÓÖßÿúÿÿ¯ÿ°÷Õºïÿ­¶ýª°Õ¿ÿ^»ebè;Sù¿Ó­­‡av#¿ÿ"“ÿÿ‚3ÛKü7ø"ÇëŽÚ_ûîŽî˜at¿]zíúõþ==;Öª8ýûé?ÿú m†ÿ×¶—ûƒ÷êñn¿ðF+ Ó:d…:¾��µµ¶Ò;šÉI§R"¨Ò*—äLúÒô¿µþÂ[»ðýim�± ûÃýî—‡ l0‚ÿÐ_2 3æ !&g¹:x†¤'™ÃÅþ¿Ý Ðlgó<0��EÀgÃAâD$ÌáòŒ¹ŸÁFi› @ˆçù�I<öÿKÿÿ][ûë¥Ãôjÿïÿí ƒ¥Ä+÷Â_ôƒé}…A2>t“z î½Ýd|ƒ…TÒt ‘â­!a¡hZj¡�oô„Ÿúõ_ú¬%wç“ÿïé~ÞÿÓ®�¯ï_‡[- ‡¸UiYg^®ëõº[i©„’ óK¦Úh4ËB°ˆÇ¢Xæ Ï4ŸìûJŸÛ_ÿ¿ýVÛ_KU¯_ú"?ÛZrõúÿ¨º¿ôþ—ã××üVÿM¥«o¥¥Âj�½«ÿÛU0­ésîÂw·ÿw²Ìýk·]vž~¾AèÖÛ4ÿ÷§ÿ^ý¿_÷Õû¯ÿí¯¯ûMéoî—·êG +âõ¾éïljÚVŸ Á*± 4õdQÃm† 0ÁS´­.D7ý‡v¬0’V—Ú[V—Ècƒ=ûgîÿ÷¯ïï�ÃÿK÷}½ý}¶ô¿é÷k¯ë{„›M¶šMÈAÂM4Ó‚{ BdW§a+ ÕaƒmƒÐlB­ š†Ò¯Ja¶Çi±W"Žø>›ÿÿáÝz_öß_Ö¿~£ÿøÿü1•X!%¼®`Ì�®ÏtWech0‘èÃ�l¨…<6«Ñ¢�ù»Xa$Ä+MŠzb«¶*l œ„Øÿ×û ×á~¯¦¿¯½õ×ÿëÿ°Ä\R;TÃ�«b"8ˆˆ¤v�0„CDB(Ô“æ­�`¥ch4�íÿûkë°î½/½6×ÿýÓ_ÿýöKé'´„Fœ›�þÿ]ëÈlŽðÛ¯¥ï£»åCKÿûGÿÿš2;ÿÃkÖ«L‹%»üÿ­´½áÿÒ×Òíÿ÷ÛK¿ÿÐOÿƒu×û ¿ò0ú ñ^—ý6û¥ýúéÿþ—ÿºVºWC¥÷úÒÑÆu÷¯IºzV⣿Øâ¿ÿô¿ýÆÒÁm+A|ò}×]?_!ÿôP¾Õ-ªÿÛªko¿ÿ_üòv!-2(á6–ÿîº×õýü*º½$Þÿ·º¿ßÿëÿþ $„Åtî­ÖÂ[ óÿõümÓj¶õý§uO·ÿý§Ÿ¿î…›;`¶–cm-› Yà 4íZM5t¸]Óªì=´ž™™»UÓOƒ.]¦Ÿv�ˆ�ƒ6äc¦ †‚BONÛ ¦ÛH6�M7¤ÓA°n SÓi¦ši„Úi¦ša;JÔ Å4…?G¼ôr±†ƒ0Š6(š$b€˜©XPqY•lž bD0ƒ*ܬfr=¹îŠÌ¬l*GÍ#[F†ŠÇ*ìT›i¹gIˆÕÄkô½[JÈp +9k—Œ‡P¤c*l…³ A‘8­³µqÝQ'T]|ÎE\*… +#õý¯ÓùØ'+uÝÞ”]÷íZ_ÿûïIÿˆÿím5ÿ×ÿ;,ò#œòA‘%yd$jdJ;îÿýUWaiÐ <ð¡! +0ƒ$f 2|ÀÎ"!È…ÈN›"–\gB:Šk�“S³Qy¶j%Õ3W‹Ò £sØI9¤�mȸÕÚ¨M¿ £f,"ìÈ43H&² 3H Â6p�„ðÐp‘ ‚üByXöJ„J¬K÷¤ÚWÂ,$Òi , Î +m¤Ü™2Ðà 0åóA0Òm 'K +š\‹nr< +Їú>J¹Bj�nZc­½+Iô•ÖµiнAi6×O^ÚM®‰:KIóí'‚m&NI–�ŸÙgº¢;lš ɺ¬vñ)‘±kЧöÕ­[¥û�m;¯½6©Ó{×N“¯¶—Z[úÓO¨ª Ú[–ö×ÑÞ½z%Þ´¶«¦ÿÐ÷[­ÅzßWÝ[·Iÿ÷iô›ÿ„š}úmzüÇÿõùc‘Rn±úÇ®¿­ï{þ÷õÿø¿ëøZõ¿_Õ¿üwVý×ý»Òÿá¿ûzý/ÿã_W­ÿõÿ_×ÿ×{ÿöýrnÿäž[ß‘/ÿûü×aÿÿÿþ ø_ÿýRÿØÿ¿Õuÿþgwáö–_ÿÿÿ£ÇðŒ?õÿnSÿü7ÿò¼ò3;üªJFü‘‘d4KþkȼvyUïöÿKa ´¿úÿÿÂ_áÿÿú·_øoÿæJ¨Û>) CÄO8ÌdŒÁ Ê3DE`ð@Á<‡„BPˆ6 Í26Á5DˆÁófu��´B"ˆ¬„ɳ: +Lfȧ�ýê÷K‚/ýßî’ûÒþÿöýðÿ÷Ó +��¢ìl—ƒ4ŒÚhØiÓMTÕÞ�tlFÆ�ýØFÀÙ9“›M³d§A¨A£[M=ÚøA„]´Ó(Ó»}zýßê_öÿûéÕ}ô¿ÿm(¦+ÿÿ„4›&ƒ¸UÒl ÎÃI´Gm“&½'I½& e  ÚM»¡¤î",0ˆ°Â6†Ë6É�9ÐM¢(á„4]ºooõÿÿëÿׯï×ßÿ¯ÿý,œRºÕÒº§Já;[êé>•ûö“o¢QÅø Ü ßh“õºx&Ò´N)7uº·¶Úúr N¿¶¿íÝ6ºíëýþÝ;_ù§ÿ·ñõÿqö�ÿoKñ[×KÒoi…þôé7A…¤ÛÿîÞ×év“ ä¶Ü;‘—LØ@×·I6Ìk¶Õëým;Û¿uÿ¿ÿíêêG +—îÒ‘Âþ¤p­}}Ó|kë­þ7ïok¸ÿû¡´î*Ú $  ˜¨vÅaCm9$ÓM´®*ÕŠMÚPØvÅÁ—5Ø`ºm¤×v_TÛ/ZJ�ö—ˆ/ÿ�¨ü…GÇᯢŸÛ¯Þï½7êßü±Áw×<[/ ”tÒ„ØNž¬B °‚i°§vG&*œ&ȱiÓMŠ ¦Ú i6)4â¥j²/´º.µï豟EŒúì?åÖ¾µoøýÿ×þ�ïJ؃(H#³LœÎÄš+a”ƒƒŠàаˆ�Œ2`fwÿÿÿðßÿÿÿÿÿÒþïÿ¿ïúðÿÝýÿøoÿ¯ûÿïÿ/ÿÿÿøKß_÷K÷ýuoÿÿÿé´»þëíÿ®íÿÿWþÿÿ¥ý¿[jÃA}¿þÿÿ_=ýmß¶½_”›ÿ]?í¯ýëûÛ3Wÿ·ûdëï_ÛKlÍ7ÛÓkþ•úZÝ{×ûdë­´‹q?°Óm[¡ßmžÿa‚Kæ;Ãí']µoÌm¤ÚMëuk¥¤Ú]˜V’Þ¶ ZVô4™{#Ša6)4ÂlU¦Å1 +»I†‚ +Å1Å6�mpÛI�ƒ»JÐM¤ƒc ¤›"ÞÃi+ivœ;×l.í‚NꞘ¨l ÉE ÅE=ã`ª*BÖ*ØL0’i°²è% ŠˆŽW1–÷ˆËÀ¥ä3ŽD1ïD0�‚#`¸Ž8ˆˆâ#ÿÿÿÿôþé„ 'M=8ˆ¢§ˆËf2lË]X¥<@ð§ó±1šŒÖaJóG)k§G;O³±’ Â40‘/àŠd;ƒ.�ÿeUÑáB7�Ôaô?á‡^å ¦d†¨&ÖÃù¸¿ÿl¬ûÓH˜ä#ÉÝi:Oå -ÿßᦡø¿}�ÏÇ$�ö×Kê¿WW]Uñþä:¾ŒÉº¬~®¬ŒdlÔ§ŠZ"žž?û4Â.¼ÿ!<Î�F€õ×\ F#4xˆIšÙ>`fÆKÐeÁ™‰›"PˆAˆG1ΜºEy³: „3©H†YA«áPLat›Åí×ÿè' i>“ 4ÓI°š£Xv™>¨ØÑ¬=’òs3°�� "í„x #@0�„\„\O˜0@‹¹iŒ[…XJË:õ}}-½Õ¶ƒJì´+LáihaðÎ0¬šiežèi7Èî‚a„›H6“h Þ‚m '–â% —moêþ7ÿë}i(ëÓZº%xM«IZ_è”R¾i_¤á&Ò½&Â#•Â’Vb; +f�•ga¢·™º#62>ô·ëíÒô¿Óÿ‹­ºÜi¯}U'v—ëô´­&»Ö餽1±i…µJ#ýÿÇïý/ûêõ­¥ß�Gö†?t:ÔhPøÜ~ämÃ2é¨E0ßEá>¿ßúðmþ—ûÖ–Ÿãéoè·%Oú!Åÿ,t>««H/šÄ�ý#Ÿ#c8 ·„¡;åPCÄlS`¿íÿì=/…ÿ 釥úÿþ5ÿ,é—->XÈü &·#HR Bi“ëgj×Eú÷aU?^—®Ýþ¾ønÕ¿ý_×ÿÿ^¿×·^*“´îí®’®û°ƒL¿ë¶—�÷Ãn— ºé†ôÿÁÿÿÿÿëþ¦Åî—¯iVµÒǺ­úÛAzø7þ–ºƒê ÷øAÿÿÿùŸÿÁüÉW6gQ�$ †>ÒÍFxˆdC#Qg\Õ"*ÐV Š‘rj¥âÙ ›dlÓ:NGBÒüäj'_⠽دKü=»ÿé?ÿ÷ÿÿh/¿ô±¨MÃG¶­„lù¤L#@hÐEóX{"âL#[Pš=³ðF°ÉM&ÿÔ Ê"ä¬Ô!&k #X0�é~0‹€ÛKô´h^¾õé7·»bûþ—ßýÿ÷þï¿Ð]G ÚN“i;ih3f� &ÂM›ÌÐv,„a6iT **ÞÚ^Ú"¸hi0ô˜i6�aÿáÚ »KõÔ}|†�þŠ>º:þNŸ¿õÛÿÛÿÿÿoï_VºM¤úZL7K¦ªõztºmiU¼[]/åûDž“l´&Òt›Ô�][¤Û¥ú]ÿë_®êëï~ßëÿûû¶»{¯§KÅS]ŠÝ§õ×�´µNŸ&÷¦+Ïw½4­ºM¥¥â5í­°ÈëÏ­.C³ +ÓíCn›¯úìýþ»Ûfi¿öÿoVÛöý{jÝ¡Öû__¡î—öþþ×ï¶ã_ê*ßõÇ~°ÐJÚlpôšMU´�+J­&ËÌ0’"l3•éö†{³v�žŽ?ìõ…³é³4ÙŸ¶ÿ½w,p—ÿÇùc‚—ûôXäg½êß­ñûêÞ­Õú¿‘Æ„›i´Ó[ %¦tØI†“ $ö”Bbi§ MŠ ¦›#˜¦*)‘_lVž›#pØaXaX`— *qêÜ>÷ÿøûÇàúÿ¾úú×oÿ–/ã;R)D’t,�ˆB��ŒC„Ä* S@ž(öÑâÂia]Ý0ƒL*¤ÃáL0©ÃÅ1 Ó’¿ý†¿ëénÿì?ÿ¾_}ÿ××ûþùyH9nj‰²š)Ð3„A‚Hù )á´×oôÿÁ^¼_ý½×ÿÿÿü×Ýu,„¨›-†ÿàßèïÿÑ´¾ÿÃþŽïßÿÿýÿÑÝø¯Cÿý7þ–Jûÿÿþ›ñÿ¿ÿÿúoô—«tÛú·þ–°¼#»ÿ}¿õþºÿoÿÿ[û…ÿW»ÒÿÒÐBÞ“}ûý{¤ß®¿ý[iuö“ûa KÓ羓þ¾P’󟶿i7ÿ[in­ÿÿMû½m%¦ÉÕôßý­·¯{××õ~h«]ëºÛ¯öÒ¿4Ì„tž®› 7kk÷„qìƒû?Ú¥va6Öëm}ÕýW®ÖÌ&Õ†}:J}ß¶Wô„v‚m+V)‹ úv°Øl6)5[�Š[mm´§am5ZÂIºQºM…m+Õ5a„–ÓUȃ¦)ˆL&G&a˜[¯a!„l ÂM8„ IÛ„L�¦†º +à  4b˜4“ 4Ø ƒ ¦‡–8„ 0„EÑ”ªâ(çf\�„!¹IÛr¹ˆŒ®&BË™O†!LB1H¬µ+™ÕJÆ öÑ­™Ò¹rºMÄDE±²šNëº_醗î›/éÒûa&Ð^Ã#Â`Ìm¨qË`� +v¡™D’;1k*à¡B•ÅÎÊ/®þ§eð·w}÷_ôû¿¼µÁþvO!þIåUgjKtºú¯ªéÿ“ +§SÎe9싞¦¬ˆýSÿKNˆIš”EÎÂ`�dèÛ>Ô eD]„Ba 0d13dt�”"¤"tÙ@†q@Â�H×DmšÏ$�§ëÒmVF8hÜÒtÂh,«‘²“~� "íá±£eB60ºamÚ"ñ<49 3[4‚0�`‹¸FÉ¢0gÈ� øE34"P�¹+-6¡à�´›JÂXT�-–‚Ð�ÝÊÊM„²hL9C“9´ $ᦒ&@L4-t›A:Zѹ£cFÍ#t#CL#C–Qý+Þ›JÒäí+ø«»¥¤øÚV»¤âÔ¥îõ[…¹> ´´´œ!¤ÚOO¤é6É�7&ÃÆV“`¸ËjÞ;í®ã[Ý~º¾ê´úߺÚ�¦={ZººO'i|TRKKiçb#¬ Öý¯ ×{¯ë¡®5úo®;oõ.·®¿ÇO½uúÿ�Ô2�ÿ«~ôØý|1üuôXät^¿è‚Fô¡ñ¿Öºî‡Ò®¾¾ùTù(W§ÿõÿöúÿŠÿÿ,P;á豟ëå¹*ññÿôHgGÿÿø]}µÿÿýÿáºL?ýk_Æ %ÿ•Ôüì×ÉG‡a>d±äÿÿà¿ì0FàŽ?ÿÿÿ ?oÿUÿÛaþZ÷®õëÿÿþqÿA~“ÿÿÿá¶èÿÁÿ†kápY\ ”êda� )�‹–Nk›�dëäm�L‰³ºišý3TDÿúýø_~ ?„ÿÿáõ ÿá÷ÿ‡¯E_GŒÉR02F\ “4Ð #Xx#Yð‰„ „¡¬£žÈÈ6B=†ˆ�F¶Ú^Ð #@d<Èñ #.gä!& ê!8˜D%”‚#dHË�'mº_t¿^þÿ×ûýþ—÷øl7ø_ uMSFç¤ÚM¤Þ“aªt4ÓIÒM&í/H0Òa¡hÜÕ5M oFÆ��ôlhØÂ„Ñ¡ÅèÙÿëT¾ýõô¿÷öÿ÷iÿô·ßì;¥z^—Aœ0ˆÇ¤Ãe¡ÂN“A[Á3m3Æ–®Ë<Í¥ ëÒÒ „F=&Ðg !¤Ãe¡ +Ò ìša¤Ú#¶—/ƒÂ ‡½z·ZÿœõýU¿nÿ¯Û#“§ÛýVûÿÒõôÜ&’}+¯o[n´¯uý-‡úN•Âká7% w[WJö•Ò°‚tŸûKºu¿m}-ní6þÌö×t¯ÿ{ûÿßý³§F=&ý´Û�z¶“¥ê®º«]j>ëß«[n*›½ +WÓi>ߥ~Š{kÓz¦Ù¶—iZR(áíÃ[©pócÂ0àìô»i]í¯ì3ÝÕu¶ÿ[¶×³?ÛK}>õï¯Ö¢­ñÚ\{¯äp¯ô)zn¾¾+¿Ú‘‹]{zB ¤ƒL$ABt ´¡qQLB Å&›ÆÈ¾Ò‘qÛ—i2/0I=9Ãa‚mÞÚW],;Âæ<'Í�F";D'«'‹™Ná¢a  FâˆÁQ˜#0af“|Èñ8ÈùE©Fx� d�ÁHbf ΂Šˆ�8gA”ñ³=Ìd#4û¥ýþzÿ{Òô¿ÿýzõþÿ z]ðœ&ðš«jH_H[ÕÞ“i7„ÂhCMQ¹Ó£õšC‘’i‚höѬ‹ÆÃLùF†vÕ0�†9²��< Â6ÄSìÒL#cëÏ'×ÿß´·ÛÝõ]/ý/ýµô¿ûÒð—–†}„›ežéa3Æ“²è¡…“l²á:M„G„¹„KšdsJÕÕÒm' +‘ã :M$ÚºN‚m &ZNÉœŽé6ÉøL ¨i0íoõý¿³?ísŸùBï_×ÿÿ¯ô¿Òõï·Þ®¾øº^é^º·U¸m'JÔ}t¾šV’´…-'D¢“x¨µÚVûJ‰:KëNóv¾ßíÖðËßÛf‹½¿õÿêÿW¯×ï_ÿ©±wÚïR> ŽßCVÓ¾î*ºŽšûNéuªÚêô+­ÿûkÐiS´›¡ö‚¹pþû²ý®Ã=²û­µ[HãmmnÓõ´µú´¼ŸµöÕ¾û×Ö‡µ[½ün¾«þÕµ‘ÂÝ¡ÖÿÖ¾G p¼^›¿ÝHá[÷qŽS°”Yép°ƒ † "‡…b­$ÃNÒ‘|UõÇ\ÙÁ—5[ÒcdU &ײòxGpõo¿ãÿÿ, �ðõ›ê›ÿlº¿Ö?¬•'^>¸‚í'Ñc‘v[ A0TÅ; ¯qxtÅa…¦Å4 ±NXNÓNšiÙt‘Þ¬$A Ø…qNšllpîEÀØÿý‡Ö¾¿ÿé0áÿþ·Ð°ÿ݇ú,iÿæD™’!sÄB" &Á‚a …+Šsãùˆ‚ BaD É ÎÚz®ÙC%zv·ÿÿì?ÿ×ÿý†Úÿú¿°Âÿl6û÷ºÿ“ˆ´d¶f""íQˆ4#ÿóUøoÿÿÿü6ÿü‡ºXl/øl0ÿíõõýGÇÿøA~ÿÿÿþÿÿIÛAa°�ðØ~½×¯Ò_úÿú_·ÞÿmÿÿaÃÿ »JÃ¥ÿAÃßM¯õÒ^¿ïÒýÿºþºÿÝÞÿð—Cº÷êØöÒŠ÷I´^—ÿ×ó›íúíºÿÖÛ÷ÿú„›t¿o÷�þÅ´…t¿·ÿÿÞÝ}×úù×ÌtÛúþuZ«~‘ÎŒoý½~ÈVþÔw홯ÕvÒÜÏÝvÝ{í+lÏëìÏïÖA&ÌÕúmí×é_¶h·öÍ2lgÐyÞÃl¾œŠáéô› %¶–Ã96—§¤¬0•¥tØ% ýdAÃ`ØkiH®g¥uN®»VÂU®ÃHesŸ6i± +)8ZiÚI±H6ÐA¦ÐI¦� �lU¤ÚLPdW¦špØNÛtÓ±H6ÐM¤ÚL�)±»V›"#h¢Ec &=¶ƒEA„­ƒ�l1 +W0Á)3É +ˆå*!„¦G &˜${höÑâ��ÂdQŠƒ +Ø„ÅGI¦Â¬'a…,³ŠéÑC`„DD fm¥á\Dõ¯¥ÛJ› Baˆ*5±ˆòšvv°ù/)ÚUïï¹2š8fˆê¬îùlb&Hí"ë"9ÄŽ„ºFÆtÍU5ÊÖBü"çdñ´ÓÒ£puUÕt»nÖ ܵÔBDIžÉ‰É4qš†¥##FD³L§ŽÇÈ„GJ¦´º]7ZT’MѬ¿%äú¡|�š!FA0� ‘—$B 3ƒ4‹˜@ŒD&0�‚]šFHÍ�A‘ðKRPH„˜h„É��ÉGþŒÇêÙPd£#3UA6ÙgÙ0‚A†ôƒ¡h&Ô(Mé¦ £s �qù= /ÓF³[ø„{zUaŸŒ ¢†H[÷’÷»H—4›DcÙ`ö‰Å&Âgˆó[Lá"-†• °’"Ûe¡7&pÎA7ÿ¤Õ´�SI´lhØår˜Ê“uHÈM$ÞøißÇI鮽¥úÒÒt¥jëzM½:Ú_ëõZOg 'I´›­%Q”âg©žUà¤mš%ÿïú¾Ú-Æ-§uÃM†›U­÷÷ëÿ_ÇUñ ß¤é_û´û¿OoýÿÝ[~½'ø[»¾G +»¿­û¡®¿}mÞékKßûߺÿïþëñùc¾ÖJ‹ÿ¯ù_uðõû«®‡#…äö©Þ½é÷ÿuýt¿]÷¡ÿõoôX+áÿÃÜuD9³ÿ�‡�¨Är �ÿÿÿúÿëÿ¯ÿÿü· Øz^ýyfÇ×ÕtÿÿÿÿücûüŸÿÿ_ÿý·þí~d±é”ùÙÿÍrëÿúÿþ/ÿAÿÿÿûþÒè7àŒ=y’ „ù²!ÅÆˆ” ¤Ó6@�Ù‚Ê"hÙBP:6ÏŠCšφþD(%Ĉ"�G©¨E¬ž•$ÆD&E;5U’’äßÿ_]7ú_þ—ÿw÷ÿýÿƒj þ�mBi¦��*F‡£ôƒ“Aᩦ� ÃÏìlhØÈ<ÎM4hhÖGæ¶AÈ4kf˜M&œ„óœ¸ ¢ £Àf�A„ B0à”�—úÿ¯^—·úýu¿×Ú_íþý>ô¾éapÐ[&„Ã&#Æ—/ð•…‹vY +CI°‚m–‹M › +ˆí„ki6p“hilÒu“EDWa&Õ H\&�×ÿÿý×ÿÿK×Vïÿöÿß]'ô¶úôêí$ë´žŸVøW…y(Ijø^—TBÒê6‰=,$ÚXW +“h~›i:XZî›_JÖô®½Woýzëÿþ¿Û!ýä4ý7DB~µýmizÞžë÷éí?I´+Óîú§»Múº§M*m:NÿÞé{®¯¨¶—wußÓkݯfkûõÕ³=µÿmlÓm-é}[Uõ]¶õî¿M¡µÂöô7ýHáúÔwÒ�ëëí Æ7ÿÝ[iëië­«m&D"õ&9cIÒM‘j\¶$ºpl;JÒa¤ÝÝöct¯Û 6·jÚ^éZWZÛqÿõåŽI}ùc’Qß�¨�^Þ‹�Eü–9?ußzü]w°ÚP¶¬Ž9Ú°�a “i„ÐA†)štö‚ÐLSªlSi2-´Ø¦Õ[Jé4›A]iXGpÛ=Yìóÿ_øúÿ�üÃ:þ–?ÿããõþ¿ÿõðà ! (H´é„Q„ŠÇM<ÎØHÑøç‹MEE0™$Ó¶˜I¦Â BL1VG;à &Ò°“†(1]ÿÿý×_ïÿ×I/õÿÛõúרb#ˆˆÍ%†„DFh +kìɈˆ3‰„tÃ1¤è1 Šˆ*v „ð_ÿÿqÿ×ÿ‚þõÿ…oÿÿÿõÿý†l_Ç&ÀPƒ5¡£ÇÿÿÐOÿÿè«ÿ¯þÑt¿ÿÿüŸÿømèq„¿¿ÿÂÿßýá/öëÿ­´ÿßÿú ûÿ 29ý/ÿÿÒÿÿ^ÿþ‚\ÿÿéz_ýøhÇÿß½_¥ÿíéÃÿ×G©÷ïþÿ¯þþþ¿_ÿµýWKÿÿVýÛÿ¬/ÿ÷ú_ß~y=ÞŸÿo·¦É×ýÖßûdë]¿ÿým½¿÷KÿßÿÂ`˜A§{Aûk˜V­‚WØ'¥¶õlÆØK·¿i³5ýÞÈ?³öÙÿ[_î¾×ïmnêV9ñÚw°é„ØØÃh&)VGÒV)5¸¦)6†CùÈq =a°ØlU°Á.ØaS‘1¶–œŠáé°Áà ­¤Zu‰i¤í‘Æ› pÚyP!&ÒØM¦Ó´ÂNƒI¦NŸaØ šaƒ1&Òa°’ 8Zi²#¦Dž�ËrøˆˆíˆGe¨â;BG;�`ÁJÆŠëE>Â$aˆHðÍ6šG·ã_mú:×vŸzÚÒû´ä›Í£vûÿË)ꉧ¢ÆýÕ±úøc¥¢Ü•†ˆz.ßIå�¿û¯uùÙ ø¦¿ëÿ^¿^¿ýuöõŒ]_Ûõüþ¤¿ä¯Á¦ã�Ž¿Âÿÿÿþ¿ì5×m‡øýt¿þ—ÿÕ}w¯_ðFÿ�'ÿÿgÿ†Áÿ†Ûýíÿü/üÉUòƒ%m5Îf³!®*™×*;£°%�=?íÿ}é}ÿú ÿ‚ÿÁ¿÷¯"/ÿm E�ÿ¦à3ƒ8AÁ¢2 �„h ":#Äða“åÌØÏH0ÉòçšfÉ:\P™u5FÅ8Ž Õ› @Ô3ñ²9ÌdÈ«*j$DEA £•2IÊØ_ð–÷þ—ÿþûðÚ_{aïý{IÿöÒAô/VðÒ‡ýÚM …ÐMªuI6©é„¦�6ÚLFÑíBhÝØLQèüÖFœÖ'‚5³8&¨ÐѬ38¹ák Ó?ß[ÛßKúý´—ßÝ{ì;÷«Òÿö ’ÿò|ô¶©+eŒ,ì6“u«a�v’l&\ôÏ6YçÍ&í Ëð˜AQ´´›dø&‚¢,4�'Õ&"ÃdÔé:M$Úký¯mýúí¯¥õÿžN—·îï�‹ý.ÿц—ÿ¦ô·¤·ëJÓ®š}zk«÷JÞ·Õé:Mï\&Ö’}RxNÒºM¢Ov’µûf‹Wm³E·¯oý7Z÷ëêÞÙÓs »Ó¯oWÿ /÷÷ÿUÿu#˪´=i¸ûþªÃo§kKÝÛút�'õN›ñTé¯_{ÖÂV6îÏí¯gþÂ}¥ÚºWí®ÚV­·fkJöÍk«í¯ÿûý¾¶ñÿâ;�íPý¯Þ?m]Ýt®ýßõÐÚûCqt�·šØb¤p˜ÃÅ(b“‘\9šIé6”CØaSºƒ.L3“ öÚÝZVoT¾Ïö›새¯Ýÿ¯ýL4XËòÓÿý97÷þö—ÿ¿,r-?XëúÓA¦ÓNM4ƒa&Âi„A à‹È&Ò“ÈA² ôí*v)Šb›] Å1Ú ¤Ø¨2äÇzw"¸zl4ÿö«ÿ°ÿKÿÿí/ëVïÿô¿áã¶”´òÞƒ9ÏÌ0… Ä$W4ƒ˜¦š™Øa½Ši Â S˜L•ÑàVƒ &LŽ*ƒM¸ZÙ:ï«Òÿì?o_ÿûµÿÿ{Kû¯Òü�L5ý,³û„Eà EsBhhÑžóm4¡C +¿“²;Ô#ÿÃ¥ÿÿÊèîÒÿÿE?ý×ÿôÛöëÄDhÊi äÜÔ7ýï ÿÃÿþ“}÷ûk¥ûiá¿×ÔB_ô·¿ûï_ÿú¶ÚõõÿÓ[ ÿøƒ÷×]uá×ÿ½ðÛÿþÒúcÿô›X¯á!_ÿ¿¶‚õÿZî¿û¿¿ÿþ“lu÷{|Sþ�¿·û·ÆúÝuþµÿ²£ÛöþÿÛ¦éÿ}ë¯Öÿü„ßÞð•„½z÷ßí™ý6gíYšÌÿÿmmëûíZí¿lÑ}ôßMêÄ-¥È®Ä<¼ÙÓa‚V“ $žØ^ÓöËÚ¶{^�Wmé|†+gåÛ_í[?ýŸö�‚ØI ©<±QI¦ÅZLRt¤šiÄ%MŠM馬m ž•SmŠ´Ø¤ÖDNÒb­Ø`–#„G9VÚkpÔ&3²B HÖÅ‚G½š*ûH=„žÓWi†Jb©¤wl$Ói;aX"‡Mè1AÄDG&΋qò†JP¥ˆ@Á± ¬~…\¦ Ã}ëô´¸-¥é´ ðÅesaËoW-‰ ��ë—"^„ÈFd¢G¸P ¤øS Wû 5êž¿ñw}ûD„Õ%îûÅDÇz¯ù�Ÿ™©•,ì£ÿ×NZéÃA±ž‹™ý“=hÄ@Ä?ÐB@DAr†Ó‚#AJh2ä(î«É=r>A¤-uTÒdj•M63ö±„ha¨Ý?Â.ØF¶�l#Xhöò�®–g 'IÒmp�4E¶ÐM¤é:M„ïÿêE?«ÿµWßÛ:¬Âìê¿ïK÷t¿½Ýÿú¦ÖÝ=’n›÷TÚéÒÒu´·mÛé]/Òv­E.�-&Ònžá7'i|UÒµÞ¾ÿ�Â�«fi¿ßM¾þþöÉÕÿ¶Þ¿W¯¾L/4ßoü®ãínü{í»õü~Ó´ûÐ׿{þÓk¥I};Mâ©ÝŠôôúåïM»JÐL5až´Õ†z°Œ>í»Û?Ú]XK­vÛ3ïýëû4û߯þ‹Œ÷º}[ÿÑ×ãú,xý÷ê?®×u¿ZŽÛ_»ÇÜk½ ŠM›v•¤Å1Jš Šb664Ø«JÒb­$ï¶JE=7m&Ìk°Òô©µÛ?÷ñ÷_¯ÿ–Ÿÿÿãï¿ÿÓ?Këÿú-ÉP8h‡¢Äeu0‘íÏŸÛ † +š �Ó#€�a…ÆLRi„튄é§M¥š±IÝv”‰Á®·ÿ¯ÿÿþÿúÿÿKõý‡ÿ×ÿߌ]|®¯r °Œ�qG}0ƒDkF‡3´U@šjx~Å0­¶)¨¦‚i¯ö×ÿÿÿÿV×_ÿ×ÿÛ_õßýý»×\rÉø0„DDJ Ð0§¶g#Cÿÿÿÿÿù<ïYŸÿò]‘ßÿ†Áÿÿÿ†ÃôŸ¡›êÿ¥÷ÿÿõú a„—ÿúÿø6_ÿÿÿ†Ãék[ö?ÿþÿÿKˆZ ÿûKÿ÷A÷¯ÿá°ý÷^¿ëúÿÿÿ×FÕ¯×^ëûi{¯÷¿ÿ¥Øp÷öÒíû^ÚÿíÿþºZúëö¿ÿºÿößÿþûì0KKû×ÿš/ÿý6ÿ®½¿öëÎû{z_õ¶tÜ¿·x1t l÷«ý¥ì5û0ŽWÿ²æ~ÂÚÚý™­}×ú×Ûíºÿ^ÌÖ“{m¨§ÕŠNè&ƒ ¤ª¡5b“N;UNá°Ûb¡ƒAh$ì0ÂÈ®"å´“í)ÃM6Á6Ïn’h-µºÒ³ÛvŽÉ5à MïlNÓì0´ÚtÓM_¶ðÂPÂI« «m˜Mº…¦›"º Pa¥¦�¤ƒb›JAŠcn^;,BåB'B"2�'„aʧ†Šâ� „A„CÃuç¶È˦§º+L ŠNî*à �ˆL&G +#ˆ…q¡¢l]›ÄC ˆýÿ-]Ö—ñmd)•>YA„AË)’ äkq¦V”¶Ì£Vo; YP¤Ë+ž†Ã Ý0»§÷¶ûýr7•_%YX¾wz¯¯��Ë]!"¦£Î¬èF¢"L×Ì×}ÁM¢+°�mÃC &� á FºA´˜{é7£c]4hzá0�Œ�fxL ÁÁ£8f0ŒáðFp»[ƒ4ƒy8…Û>(D%•–ÝH·$oš „é6‚b­¢1ÓÒò~Òt°—·iÙhM²g™´�–LävÒl*#†¢�p�cHXi6M ƒi0ôliª4=Ù<œÉQ-æŒ)ÝqØ”dQ4ÓªÓM¤ðŸñÛ]'«ÛÒ½+}´·j +ÒµA6ÚZP’´�&Òt¯I°ž[,€ƒht'S²¹BšAB’ûúõ·êݺÔTŽoVõ_×ý×ë×Ý-tš]}+§ß[DŸÒßÛéÿ,r-/×ëqÒ�¾¾?x_×»½ihu¨¤1zø¥ºMÐéEéßwÿQÿo¾ú-Núú&-ñÿÑüÚÒÒò8W¯]â¹—¯¯¯ëõ÷I‡ëû~ß_¯ü±ÿ¢ÁzRÓðËDoÖ§b��äËÇÿÿý¿ÿn¿ÿ_ÿý[õ­-!ׯý¯®¿ÿÿ¶�oÌï÷Oÿð_ýú×KUÿ×_•ìÏ™ d2:�< e‘¨…�H™.s)Ì‹ùH—&?þÿÿ oÒïÿýÿÿø#=ºÁÿ‚0ÿù’¤g¦G†¡˜Â5´A�„khöÂÞpC‘3A!$fˆL„ ¬250y!¦lh„W0) B@�ƒdü˜dzÎlÊ„pΣ%dHÿíü7ô¾ö+®ÿ ÿøAm¥a÷ßè/þ¡4U´{a&Ò i6ÉÇI´�&ÃV ô�mBÂi:Mäò?4Óôѱ£g*àƒ „haÁáO(L#[ÐF·ûénþ—~í¯ÿÿö¿ ¸=/¿½'ïëŒ;õ„“tfô›WJÂZÙ`i°ˆúË;>Ò†“xP“h3�–Ï´˜il° Î4{i6“Ã8Ô",4›I´Ÿÿ÷ü�oÖ¶Þÿ·ú_ÿþº6´¶÷ý}ÿí:ZN»¾·Š[tª4•µþ®“úð›öÒo~˜vºOM…‚m&ÒÿöÍ?í-úÒ]ïwKÿUÿoÿUo]»ÛÒ_K»ý}Åÿ¢#Ý'¿n›éðš×é¿úê?OZO[î©úŠöÃJ×nºµÖÓlÍ6=}ÖÙŸý­ß·þ¿k·ßëíÿßÒý:¹cÕ±{Òßý !Ýúé»Ú~µÝô:ûMX¥M[I>Ò´ Ë“ + íÛJÈó %eý`Ë–cÌ+ì÷ö·lƒó?Úm™¦Û?m™Þ¶éÿå‹ÿj#‡íÿòÅ,r3ßõáÿ�ÿ¼±ÐðÂzm'v«v* ¦ƒÅaá´˜¦)ŠA¦Õ1Qªli¦·ö%"ØaXg&ÂI°Òì#¸yŽëÿ®’ÿ°éö_ÿKüÿaÿéøðÌ�¡ ÐaB#“!‚ +‘òáŠaIÝ=0“°ÂO´ØM6Å0�Š S•ˆH6+Šm$õ_·ÿì=½¿ÿþ¿ÿ÷a÷ëÿé+ EG&Õ£±E�`˜T Á3°ÂZvb¡ÿÉçt¿ðßá¿ÿÿÿÿðß^¿ÿá¿IÊéÌwú `Ð_ø=Þ ÿÿÝÿÿømÿxÿý•MÛ­\á.ÿöôS½÷ÿÿÿýõþïÿÂX6ºÿÿFÕÿnêÞý¥ÿ½ÿÿû¯éÿ¥‡Këþ¸Kÿ5.éóÉÿÿïûÿÛßýwÿÛKÁ{KÿðÛýµ¦ÂMÿm×þÛ~ßÿ¤sÿþÿÿÎ'Õ´½þ¬ƒû?ë¶~¾Ï¥¾ëuÿìýzú½þ­ÿí“­o ƒd;(ªªk 0ØlRv¬V“ %´í&E&ÒMY)¶lå휽²÷¶·M˜í|#Ž õþ­„Ž;ô‹0¨éÚv×°‚iÛ † Dæšv¦ÐIÝ&˜bb“MŠMƒM´Š ¦œS±I¦ª›pØwC•±Îvv2!9‰a„„j‘XØHöÉà ${höÃ�nx°‚Û˜„ÂîØTI¦šØOOœ²‹fEˆ�œD«ˆ‹�¯i%Òì4’±IJä¬cÊ`IK\C ì;,U*¬…È«…Êéëê¾v�æF0¤›$Šõ¨¾éêƒí5½~ÿ-ÃÒ;*Xîï]uó¿ÇÇ’ §di’ÖFŒÔˆñ(×__áp‹ÁÃ!äð`ÉŒ‡ŽÂ0áØ-“æÈ�!B0ψˆJ�.„Täü˜#¬á�‰¢$yAMN§ý!a…K©Õ.�º6˜MØTÑ£„l 3’aF ¡ „k “Â3Â6B5†‡ (B0fhÀÎ ›"@¾HÔ‰‚•Í}&Ò¥I«¤á&Â"Øia &ÙhM²tL0ˆ°Ñí²ÐG Ý‚¥¤Úz7�…P™<¡4x~¬0‹vo?„ +d;+Þv«‘“Ú·¾—ã�\'^J+é[H”Rn ‡oé[Ò¤é6m–…„ôÁœjˆí„ŸÒ  ƒžŠ«R2%@Aèì\B*™ÅF·�Ó¥ê/v¥õiºÚÿÜWéýµ·ôµöô®š¦­PN¿¤ÚÒ¤ÿudyTk 5÷x]oß{¸�zÞ½Háv©¶¿®>µâÒõ\zw~¿í'Òîõ†ƒè&Úßÿô¸pÑc6>?!Fºûÿ«jõ®ß‘»_Ó×é7ú�¢4¶·i&ßzò¤!á›ÀÃûÿì6¿ú,£÷ÿòÊ5¯.¯òHþï�ÿïñ\wzò �-¦ªÎÓ¯öÒý†ÃýuÿÞÿþ×õý!ÿÿõÿK¯ˆÿ¨\<&ƒ4ëþÝ~ þÃðGÿ_ÿ½ÿÿþ¿¿_2X,�Db#m3¡`E?"ú~Ý>ëþÚ_‡ þ^ÿÿÿÿÿÿÿü/ûkð�cÖÉðDRƒ@4BL| …H4i›,�Œ‹#lÌO(FȨ�5(ˆ€É&7ͳQ:^@ÑäDÉN¦B#©þ°}á°ÿ¥è/¿úÿö×ÿûÿü£þÝ| �&iªMèiaT'šà�„vOÉѨFï… £ÃFê6M$Ïá ƒÃ�™F°ïôÁPg'æ4BLÐ èàÂ0áïôdÿw¾’õÿõÿþëÿÿÿô¿ö ô´­O˜P“²Ð¡¥ª áçÐUwpž•®ˆí„�-êŠrÑI´ ÙÉœ‹ &Ý/TÕ4�ZM ›HX~Ý.Þä"Uõöý¿ÿîûÛÿÿý/õ¾û¯·Óºé:¤úõ zt›®î“®�ÐT›I·‚t›m/Lñ¢1é0ÙhA´›I¿u_Ît»}ÿýû¾þÝmÿÿþÞŒŸÒè¸GwIÿ]ÚxÝ_ñÕ/m--'÷îŸõâ¼ÿMÂi_JÒt›ûI�yØ~­¤Ùš×_]³Eí¯ÿßÞÞ¿ÿúÿÒíý¯QÐëßÿ÷C­®¿]ý&Ýúx¶»Ýñ«öÕ¥ôÛ¦¶rNêê[JD4ì#Ž˜Û &®•¯~Ùù­¾ÌöëlÓÿÿýÕ~¼´÷—Ó¿Ëë÷ü±ÈÀ×ã¯þëÿé?Û¯¯CMé†ÂV›› %j«ABî)ئ=6ÐKk"ãØa-[Û�+/0Â_ê·§÷LƒÎÙ«ú_Ö�ÿûý~�¥ú×_ÿÿË}ïÓ}Z¯„k†!OJ=°ÁOv!1L(¦A6L&A Ø¤Ó¶“MˆT›"¼10ÒbƒM5NÖmSm&°ÎIÿýÿï×þ¿×_ýÿõùx¿ý_Ûá¤â ©9¬# #•\C +{¢¸£‚+3L +)¦ SîÓMÝ4Ãa+L1_ÿÿÿñÛ¯ô¿¡ÿÿÿÿ§Ó{ëÿþ*ã–Rèîxb +zeXa‚k÷}ÿþÚ_é~!ÿÿÿÿGwïÿÿþ¾")8ƒˆÿÿÿÿدí/Ò{ÿÿÿúüÿÿôµqûþûÿÿ8á¥øK~ÿõÿõoÿoÿëë_}õßwÿá!ý´¿×ßïÿm&ÿ_­º½vÂ^•½½vößÿ×þŠ?×¾ÿî¿ý+ÿõõÛö!'Õ»³÷]š+Í6ïïäívÂþÞßû¯þÝ?“­-¿zmÒÛilNÛ,$­‚Yy† C¡Ú®ªÁØEöË9'öm6Ó½m/>ÿlþ·Úõº]«wX¦Èsa ÁÐb­ƒ S˜„Á�&ƒ  Ómƒ6)-4ÖÁ¶65d\a´“Od\¦Ã +¶š­¥¶“eæÒaœ›K`­aQÊx0šxEGý­_è˜ä©ßýùc‘|8h±Èè¿ñÿî·R8WŽº÷mßéÐÜ;ºZZ§÷Ýi!¯èR¯ÿèXpñ_ÿõ1üt[’O_ªÿÿÿ¯ã•ï¼ìMgb‹;Nšÿ¯ÿÿVÿ­[醺^+þ­ÿü²�ãú-É7X_OU±ÎôÄuÿÿü6ÿýt¶×ýÿÿÒÿ_ÆdªjVü£Éš]uUÿÿ¯ðØoÿ¼žvë ‚,ø#?ÿÿÿÿVÒèvˆO3–sÙ Ø( gS?Ä5ˆq +h""tÙ�U (ENWIu ‚�A£:™ÕšÏ&’�(•]]ßÿö7ÿÖ“¶– „ ïÐ_ÿÿÿþÃúè'ÒmBht{foHñ™ÙÂ69ñÞaa‘¨Î5FÆiBa 0�„krf€Ê¼Ï Â0á‚^Ð ç8g‚=¢@d<Ù+Í–¿ÿÿ»÷ÿ¥Ä+t¿ô¿ÿÿûÿ'm.“²Î´Gm-]=,,þ’m'“8g Ú¢;l²hrtN�mÓ ØT-4ƒi2?A¸6NtÑùçôl BaÔ'Öß_Õm»ßÿ¥£kt½û í×ÿÿélWLuxN“¥¤é>4•¨¼'JÕî•¢1î–“¥nmQ. ñ¤é:VË¥Â"Û [,ô›‹m' +ˆ°ô›Û_õó¯˜ößÿUVΩõïõ¿õÿ÷úÒY‡ +ÿ^른¯ê¿ÿµê�µÒ×ûëuö’¿á:¾©7 ÕÕúM™¦Þ¿ºÛ4_Öh¯ÿþï_omwÿ¯ÿ¿ÿ ¾¶ºëzÝ,ŽýÔŽ÷ãhzÔPõovºÒÕk§Ýv»i¼$à +Ã96’÷¥°Öê醭ÿ}§!Žgý+O³öÙŸ­þÚÿûëíáãö¸ô¾’RTþ D:8éKÖþõü»¨ïMï{XB¦Ò†šØIÅZV“Æšªr í¶*êD5l$�„¬# �½}Ùÿíu�fjÁëþ¿þ,éü±ŸÒñýUÿK×øoò¼a0˜ ¶ƒˆJÁ2,ÆA‘Æí4ØNØaE0M Ó S¶B­6ÂJ�².5a‚ú܈8mØ[zÿ¯ú[ÿÿ¯ûëÿÿþß°ÿ+•Æáav¨„Qéi¦‰æ°©Ã +‚i±I¦›V˜biÚl.à àŒ?ü‡ÿ¥°ÿÿÿüÔ/æÅÿÛKÿÿÿoüDE'-êr«”a„\ç°ÃŠÆ�lgŒ&¦†Â†ð‚~½ÿëƒÿÿþQ_ÿå ÿÿÿaÿ«“e¤)¾PÆKÿKÿ¬7ýÿþ“ö?�êÛAÿÿá¿õÄUï¥ýá/¿[ý~ý/ý/ô¸…ÿýx?ÿKß×ÿ_ô·ý¿ÿÒíöÿô¹õÿ÷úûÿv—S ¿×öÿÛúléÿÿíþ­ß×ú¨VÿÿÛüòÕ´´½^½¾©ÛúF{m¥ûf‹ûÍ?_omÿûý¿ë×ýÅ6–ÒrôŠá¦°ÁdW{ Çz«g.¬¿ì0¿æ /°Ž;.˜gÕž·¯ýd1ÌÏývý´½¿ô[Êæ аÂLBa:i†E{Nƒb©<Ž#i1I¦Ä$í66( ÓaÃcb™ÚJ©ò+†Û -†^»M†r²òm¥­¥§ˆˆ`¡Šjš'„4ÂaR+­0‰Á1MZa…¦�iÓA„P›#’i¦› í�€A± M6)ˆI†ÒN¤šiŒ³…˜Êâ©(BÔôƒ íBEtž ¤hq +±'òÍ×"")2¶(Dkˆ�~—«iY™ +<µÄ3µqÚ*… +WeU÷Îñ„”·"¾ûÑ\–^þî¿öŒ“¯wþv3!çw÷™V«þª©ú�ÌÐS ÍLÐ)3Y�G‘L�*�IJyh¤õñhÖF†i&²� Ò0‹±šÃAÂ=˜3ú!0„™p¦l‘ 0ѧ�%˜"ÉÅ$ ¨¡ÉN¤SäùØë"~_M¤ÚNm] �’àšC_A6¡£sO £c‹ÐÑ­„lh÷83ÍÃD$Íaša)±‘¤â‚"+*Éù0ȵòfƦFŒÉ/Ý[]z_ AÒv¶‚#xVZ Bmy²Ð›dÎ ãI¹|Z Òa¤õ¤úM¡a: ’ØÔ ÂhØÍ4N¦AêM2l—¤‰|¦ë¦’t·ÿziÿ^­öÚ„ÚWºN®–­´Ò»- ´K<ÃM(KI´ƒa9á£ÛI†(öáÓÓ2;P¡WmzÜW®�-»\_â÷ҿצ×Åo”uéÛéiÒµ¼[´¸&ò·Íÿ¯½6?ã¾¾ûþ­zþñï]Çm­ño[jékÓ}:§ïØ I­éÝÿ_ëÿÛÒßå§ý7Öˆp› ‘¾¯JŸ÷_#…]ß�ÚæJž„8Žïÿ®ºÿéÿéÿË¿X6Õ‡ËOöÒýôMþ‹Žÿýë&Âßçqÿ࿯ûkT¿þ¿ÿ«o¨z_ÿ\ºÿø�ôòOtµýôxþÏÿåC_ÿÿÿðG{Ô0ÿþµõÿÿ8TDé�„EiR9žF3Z8gAå5Ìò& èd\e>væAQ”ŠúÿþÿAúÿýÿÿþwÃoA¿ýµÿÿÿÓ®ƒØß až(ô˜A£|#`gƒD—fv 3"í“à�ŸÂ3Í3 #6E g‡²9�†”#dtFÄ'Í™ y‚ÊHO8Î¥íé}á/ý¿Kÿý¿ÿÒÁ¼>¡ûÿÿÿÿþËFVPM¶“'Á4¨Žéi6> „ªŒí Å › +Œî�ST›Pš¦FÇièÐÓA£eA¡±F°Â5¹ �A„kô—ßÿ¾)ŠÿÿÿïÒÞÃm¸¿Òïÿÿñ¾6½Öô¨&ÒÒow +˜ma%i¶ì ªéÂ"ÛAœ#Ì ›3�–4›‹t�Ú#ºMÉÛ ´žLäXi7¤ý}ëûííÿ¥ÿéo½‹ïû¿m×ÿÿuM†÷íköö–úOÞïêé\'§oºmÒá6“®‚mxA½+÷‚t›ººµÛ]~ýÿÛý¿öôµ9»dÂÿºÿ½õþÿÿÛÓïZ·o½?hm}n*ÛO֪׮֖©µ×·ú�ëêÚ_ðõ[oz¿ìÍ}½_¶h®—ýiÉÿoö¿¶ÿßÿ臽¯ëÖö–ÿ®í«µ[ízõî¼{×¾‡ôñi ›Jب2åjÅÓ®Ùy²óa+ó¥˜V¶–•„Âi6gÝv~¿ööÌ×_ßÿå‚¿ÿ­_÷ÿ–ŸÿïÿËrG¾?ú!ÏÇýaþ³Ã#è Ø"‡[„Ã"½§ ¦ÈátƒAÄ(„Å&œPm&4í�âL�Ø·L0KZ´œ¼Ã *~­¦Úm¥ûgÿÿûz_ÿmõþ—ö—­ÿøÿýrÓÿ¾Zpÿ—µ±ˆB2¹†°†{døhì}-4A=„ÅR¦G†GÒ„ñLBb�†ã¦!1 5M«cbi*i±JŸÿE;ÑNÿÿôqÚþßûÿÿÿúÿþ»ü?Ô²1b!ƒ&ÅÐ0‘ï<4{ Sdpš 0’ií&šõÛ^¿ÿm.¿t¿ëÿÿÿÿü/øaÿ–uD"4""DD1 +QH)\U(¬úoÛ_ïÿmmûkÿÿþ¡?ÿ„xÿ‡ÿRÐÿjÛiEúM¥×ðwý_ÿú ûÿKÿ ÿÿô®)¯ý¾)�ôao°ýµÿïô¿ûð—ý‡ÿKûi?ÿ]~“ÿÿÿÿ¯÷þ¾—¿íûû3é¶¿ÛÛWîÿ÷¯ý¿õ÷Ûÿý³ªÿÁ.cöÒ[Úý¸oUëÈ8?û^Ú]þÙŸ®šý÷úõ¶h¯ýµ±AS RvÖ�¦Å6z Úl6+OÓ´“TþÂ^Ù{î­«g¿ÂÒí.¯Û?µ…a»Zi²8LU=„ÓÚ §A4Ãi'všaŠMÅ4šllRa9S +„™lPɸfL”¤ì�³ªžämAŠ:Æ™¤g#; GÇvk… +¶ã¥«m o´Þ–ë}kM?¯oëuÞ¿_]ª÷öý-~¾xí¯×ªw_º÷ר{ëÿ2ËÉžwZÉZÿÿöëiõ]õÿý¿Á{ó"@Bqfãy|ø¹@§DpÊs¿á¿ÒÛNM´ÂA^“ Àh3�V™tÃdÇ &Ò ¤BÂ3´-“ BhÑBÓ äðF°Ñ¡çà��”AƒÂ #@h„Nk ÁšaÂp—{~þýiwKïÕ½&à�(n“hn•Ð¥¥¤Ú'á¶. óH6g &Â"Øag€ð©I¹4Ra¢;l´9ᥲÁ¦ÂA´ÑáÃ6h&ßßë¿<½}zê›Ò§þ۴꛿¶êé:Wîíi]:\'Åý--Õ&ÐOâé>“®›p›I»K­×oÖº×}hz¡Ú·Mµèoé}j*ÛµÖêÛOîÛ·é?þï¾Úî“×OM®Ýo¶—ÿÚöžü±ÈÐùc‘Ÿ^ÿrÇ#?Õ¼z¯Ýþ·ëiÚou÷[iúëÔkx·I=;¤ØeÆ�¥ ¸2äé×ÇK[ÿ¬ÿUÿ_ÇïÿëÿÇñ÷íC�&$dqM†•„‚m5_û¥¯ÿ×ýõûõÿoý÷ô¿Vÿõëýåí()]ås BG¶)ö!E"¹°½¯î¿ÿÿÿëÿÿÿ¯ÿëÿÿú¯úB#™\"#�ÿÿÿÿÿ%ÙÿÿÿàŒ?ÿð_þÿ__þºþé_ÿÿè'ÿÿÿÐ/ÿð�ÿüÒgÿÚë¿�÷[ÿõÐ_×ÿõáÿ´¿þ¿Iýÿéi_º¾ú¯»ýý{mýµô¿ÿÒýëÿKì%ÿÿïmÛÞµÿþÒÕ_ÿÿý}.½µþ×ÿIw_ý°\ý™ªÍ>Öëöÿûm/ÿzýz×ÿ÷¯ý~ëþºM,;l+°Ò·KKöÏ_m¤¶C¶Þ¿ûm%ÿ[KÛ×íÿÛ×í[ ›Pȯb©ŠM´­ šjÅ*l‹[Jïm‘G.m-=u´­9ôºöîE;/î’ݘװŠÙ…gëÿ¦Ïã+V¡C X…‘ð•é†vÂmqpÅ6 ¦šiØm$Ó…è+$Ób¡;› kšÞÜaŠ‘\4Ó°”PˆËr†0„DeH£ AˆR°3D�…aᢸ«*áˆHÑG»MD(«Ã ¦šMŠ ¦ÕÛ‹°˜PµMÚ5¢¹jv6„FbæÀGbˆ¢;Ü"#A“ ˆ�”ÒØoÿÿûý¦œMgsÆ"#–ÀJZéb›²”øóµ&dU dQ�š�…ýôÌ€š;´‚0ì¨döÿ¤Ö‚|)4t·ëÔukï–õ¡i'Åþ8êW§�5¥»_9šÈï5]?ñø@Â^&3<@��y‚"B�ófjÕ 2L‰x‹³¡¼¨D}N²¯ÿÂhhXL#[4•�a¨A„lf’aÚ!&sšÃ$a#LÃÖ#62| L0B!<€È�8gA¦C/!™ØŽWJ‹qO³í&Ñ>q¥…‹p‚ ¢8i6ÒvY˜i£Ã„ÚL4Âi gälèÙF·®Ø!<Ö„h øh8GÑ:60�Â…""¹ëí6¯Âmnm+“ŠO…Iµ :M¦y«…IÙgM¤e¤&r;i6É�I‡é0Ù:tÓL#YºŸ©Ø¾wAœ§xÌ”]>zëÚéºuö—}&ö×W¦ñýý+Ú‚´®…&ý&Ù>M‹mZ¿¦‡æ�4¡[õ¾ëíÆã^þý [þ£â“¿º¿¤Û½p�&¹�qxàÎ Þl'óqÿÿ–-ñ_é¿DèVýU¿·µ¿ÿCêý}¿kÿ˜ÿ­þ¿ô¿ÿþ匯×õÿ°øjßÓú·ôÝé?¯ÃÂi—ÿ$¹Å/ö‰*Úÿý_ýZþïý/¯×{ýÿ½{ÿ¾>+�ÿàŒ?ÿÿ_ÿÿÃ{{ÿ_ÿÞÿÿ•Ð2@ÈaÈ‚%â¬í/"yZ½5×þÿ/ÿÿ:ïÿÿû á¿ÿÿÿtÒýù’‘Ÿ0�l#cFÈF°e@ÁÃ4Ì ø§ ëÈÁ™æ>l�Ë�'Œ(GB!r1ʳ:‘PYPI�–A?ÿÒÿý'ÿÿü á¿ÿÿÿ´w×í¥ô�&ZA´Ñá¤B  ÓkájÚ‚hÖô�”|j�©ùÃ(‚~ÖÂ5ƒÂ0à‹Æ™�¢ EÙ¤`e�åX€�þÿ¤¿·]^¿·ýßíáðÝÿÿÿïºþé]÷KIé´Ý-ëÕ¥éiaàiy󠆓²Ð�–ˆA0ÐfÏ‘a ˜i7š4…µOI´ÓTòx#[F‡ýÿÿ믥ÿ^ÿÿßëÕÿÄ/¨ö–·Mýoº^“ïN¾ßêí¤à› ¤ú¥apÙc™ÃAœ<*AÒïõÿ¦õ_uût½÷߯ÿëýŽ+ùmÌ¿C]-ô½¾˜¯=«InÝ{êž:þ“ÿ]Z^«Óº]7MúZ_홯õþë[ÿî½»üçç?4ö×ý½×Ûªkôáõí×[[jüxÖÓ×Þ‡}{­´þêG +£º 6Ÿö›i½Òuï¶Âÿ~­¥Óg»´ïuût¿¯þž»ûî¿V¿×ì4]]úý!û~XäiÃÇúÿøýãA{ÿ¨ÖL&Ä$ÂiÈá&�ºVcX2ç"óm%Û97_uÝ]Õ¯ÞÙõºûu¿òºÏÃÿ_µ¾_ußÿêßþ‹&¾Z�ÞÿŽ‹Œðç†KvÂuÓ Tˆ8A„ƒiÚM†‚M¦ÐA4ÛI6ÂR-´ƒh$ä\ÛeÍ6ÒM6ÒëÕ�vê¾ÿ¯½_æÅ××oV¿ÿÿú_û÷édØ\帄 è+¢Â �Ì0r±£Ü0Lh;b­ˆM1±I´šlB °ÐI¦I­4í‡ðÿÿ”æG¿Tqþ>Ãü‡ÿ†ðGÿÿÿÿ¯ïøS‚Žv­¬£4!‚ÂfC‡¢¹ƒ +V6*{Ï„íxOøoÿô öô›úÐ_ ¿ðÞOÿÿÿÿ�lŽÿÿ_-™;ø{ý}/úÛñÂ_„¿ðÞ¿ÿÿÿ¥ÿï‚4kIþýïú_ÃKûKô¾·}û×ÿwÿèý}¥Ž¿Î-·î¿ýÒoÉ×úKëÛëý¯ÿÿþ¿Zë¥ëþþ÷_Uý&ý[_¯ë²}WýÿÛoÛý/_öÒ÷JßÓ þßi}ßµßíëk®»šzWþÚ_ýþßúõ×ê·h,„ÚLSn“äAÚ~¿¤Ã9D=)pô¶Jë0¬ÇvaoKŸ¶oìý÷~º^ݦm`¶(0™[$Óa:a: ¦š%{ABá ¶)µ�ŠaÆ­¥iéé¶ 0ÍÚ¶M<½"Ž ­/ažà˲>,„n² h@І!J¶ŠÆÂW•�G¶CHöÑî&šŠa5)Ä,0¬ ˜TÓ +Ø šz &›­6!&› í+JlSQE¨5I²®dk–! #Z•�¤~r¸¬QY„ÓQQ@¶TÐë,ƒ¹vDDkøÿéÿIÿOã<0ƒ8Š6�n!Äc”ÀÈÈȈ)’œT®w9B3þþ“R×([ûÐטC­?OÌ�©kƒ(FAìž„b„a“.\Ì ÂDˆ,2zÔ¸ÿ­Tl4á­žaÃÖd2ˆ ɃÐÒ#°‚#Á#ÁÈÞ`g�)@§AJ°æƒ +tdXd Ž‘Oª‘½:N4&Â";A>“i0ÐÑá„!¦©t0Ò²2U £CEÙ›Eä#C�ž» ðŒ;#"æ¬0AØ •žU—0d<Á"Sˆ£/žN„S³ô²ŠGb’ÓIpAµé'I´KƒÑ.a]-t›JÒÕÙÚM¤é6‚t›“:m4�hZM ›'ÓMÃTÓF¶ˆ¼4kh„™¬3L®O»Ã医 -¿÷Ò6Xä©ÿÇùc‘—XøïzÖ¾ë¿úß×Q‹¯ê½‡ÿ_ÿö4‡ÿÿÅø>Z½·ü6øzï×RaØ,|7þÿÿöÛÿýt—Ö×aë¯õþÃê-?êL4Ej5z~õøoü7ÿÿá°ßÿà­×ÿíúÿÿðÛVÿD ƒ8dŒÙ"L‰ °Á‚T +P!!#ÄS™ó!ŒÖgQäãS¡Îf²u$Ñ;:ü7þÿÿðl7þ¢Ú_šo�çÃ~ÃÿÿðÃé¿ÿŸ’Ô äl„l²~60���a£[M4Éà˜L#C4‚ #`Â49 æ°r �„km¤-†NË¢>O˜f#y´c>!B6È€ä@†y²Í$g„F +kY³~úmÿÿnÿô¶Òü%éx7áÿÿáõ ÿöYé0Ñ.j“tîI´›H:6ˆà‹mq„ki6¨÷IÐAäÞ�oÑ�¤ÝÒ‹ÂTاFƘM&’5Ô'£C88Ñí›9.ÿ«¾—ý{»ÿú] Þ— ½ý.ÿ½ü6ÝýõzµõÒý-mÂzˆZé¶“­4)6˰ûÞ) ÔBb¨1LH;NÂI± +ÒºbdWWi¬•Ûb˜á°Ùà 4î¶ÂÈ®Ú_é5u¶ÿÿûmþÃÿÿÕúÛ÷ý+aãÝK¯aï÷ÃþÁ‚g Îa4 Ä$VQXÍ*#œöÃÅ2.�5A;îªØLˆúxO§ A†!VÆh0ÚIªv—k"pa%Oÿþoðßïÿ‚ÿ°ÿÿØ~ëýl?ÕÒaõ¹‚Ì�ÓäæJñ !-Ã�  ÉFì1]§LS ŠM4ÿÿƒ`ßá¿ÿýÿxoÿôS°ßÿþßëÓéú¹n4b" ,A„ )XÍ$V?ßûa¿Ãÿú _ÁÿþÒl?¶—߃‚3ÛPo¿¯IÄro¨oý~þÞïÿð—þ߯úá¿ûÿú ðßøþ•}×ýÿwÒÿõþ÷ßýöÞöþýa.ÿ_t¿ºüçF>öÎ�[ÿÿùäý×ö“oû}ûë®ïú¯¥[W_ÿKVÌÿmëÿõöõJÝm+)ý¿÷óŸ×ù¿úi°ÂKËÛi'­ÓtØE°•Ó ÷i/ÚúûwuÝgÒO¥f~í™®ïý}_J×Iaˆ@¶! ÛA&šm¥iA‹†!6“I5 ­¬0a¦›«"ûI‘r›aVî› 'L5ÛOººðµu}Ñnµ1²Ò´HØ„�tghÐÙÈÓ +(0ƒ·i„í¦“M‘Âb¡6G*M0Åm„ƒžÅ ÙÒv°‚N³íY;Òâ#B"�¤„eHà�„‚ $W…\0HÐÑá±0SÃaªØ… $ëiŠ`ªTGA!–žspB#ƒDCTG×_ôª AÔ'Äym)EuާhÁ#!j©¨[ï•úû�Œ3Do: þv­ó³¢H³±ô{7 xú꺤ÛH ßË\Äiˆ§È�ÏÕU}'h$øË\¼0ƒÂ/a60��òæ\C†BO›"!0G³qx¢DNgAšÚ�I<äF+ý'èŠð�m!m4Ði0ÕG#[Pš7H0ÎÅ“=*!&kf˜A¢f4Bt d‹#Ê£¤J� Æu dC>Èȉ™Ñ”HäÙS"úÅ6•…aG0“i:º¤ÃD[}×ûÿÕþ·m*Ú×vÒqBßêÿUÛ‡ªëÖ—NûÓ]â�ªO$±¼ñÌFób~öÿãÿþ?×ÿ_¯×ìU¡j*Û×M´*·n•ï+•,¨Þ*¢¢÷úÿKõoº_]Õ/ùiÿMþ‹rCKoת¯~;¿múþaƒ/ãŽ?ÿÿº¯ÿú_¯þ*Ûòê¯ÿn‹s7_éëºU¿çhÿÿÿ¤PÿöÑÇ¥ÿÿÿþÿKÛÿl?þdª3ˆ�‰ÅS¡ñœFÙÏO9‘‘KõþÿýµŸÿI¿þÿÿù!Øo¿ÿÿý¶ÿÖä|O “.4Á0FpÉð�„n¢¡PXáëKÁ3Í‘ÔB@¤ò SQ’¸Î5ÇS5yÔÖ¿ÿÿ¤ÿÿÿÿú0÷ÿÿÿ®mÿô�¦�AÙ4Ús;E[Iµ ¥ñp…·KѲ¡4|„]†~G‡”r3XaTf˜ Âv�‚5†ÄGfùåņc8GD%§<â[YÿôÚ\0—÷½6—ÿûýï÷ÿþø8?ÿ­év’mF¤è—RÙh/á&Ûý&Â"C 6‚mBMë?ÐM¤ê…£ÃI°‚d|›H\=Å£ô1T�œ#cT·ÿï¯üq_íÿ×÷M¿ýþÛý1üu½Û^­-û÷¯ø&Õ´�WÂ¥Ki8TKtµi&Ò|<¿kÐi]–„Ú#²-¿ï÷¯_ÛÚÿÿõÿ\ò÷½»mÒì8ÿmÕñ½uî¿N©ÁùïoMk¯ÅRÿ§m.�oöÔ]%}+AA¶þ×k_ýÿÛý¿öû¿l‘ÿÿÿù„ÿ_½o]ö¶ºÿC#ŽÚt:¯zBÒÝëõõ¿ÛïÇ÷wõm%í´¾Â~ݽ}ÝŸþÝ+öÌôŸ¯ÛÛmÒÿ­³¦Òûköð|´ÿ×þ[’ñÃîCÏ�ºT»Óõúþöõz^špؤÓM´|ŽjÇN·"ùƒ /—›K1ßiwim«}ŸÛ3Û¯ô–Ìýn·¯Ãt˜úÿÿ�ËÌ=Ñ:¿ê‰ÕÿÇùnPðõ‡Á~�o +I݆):iÓA²8] Ói Å&ƒb›A1A4ؤÖôÃi2và 0ÂÚJŸi[a+¦Õm/†úoÿÿÿï݇õëõ_ÿþ0ÿ¶{EŒù\&8Œ 0„FV4WXM¬h÷„Ç °ÂNÙl2c¦(16’i§i&Å6•¥a´•8mµÿòNÿÿÑNýÃÿéþ­¥†îÃÒaÿØäÜUˆb4 Áb�JxÏ*à +6!&Å'Ã~ÿÂOÿþ¿ˆoÿ'ß×ÿòvG}mÿ†îƒýŽB"2ÖÍ ! )FØÿè/ÿý&ü7÷éWÿè,0ÒÁÿÃn¡¿ýG»¿¥ýÿÚMûõøKô¿ÿApxoü?‡ïÿ™¯'Oÿëïÿ×ï«wÿ«ßþº6­ÿ§a¿þ÷ºÕ·úÿí«~i”ý~Þ¿¥oÿ®–ÿ«ï·ø_¥M®Ùšþ×ÛïÛ3ÒoÿÒný~ŒÓwÿúm�?¿£Ÿ“ÿÿ^Òî¤_!úŸ\ÓÛË˶[]$êÒaœ›=x_Ulþßÿ« þÏúZëïûfí]ŠjÈúM4ši°�4ÙìBA¦ÅÓ†Û h&(1IÈà5MUŠcM4ùÃa°ÂÝ6 Ú +Ò«I²ó %óð„á‚PbÁ„jÆVQ\Qp˜D„Q†…¢BG¶)På]yW BŠ`˜+a4ƒN6#Ši¦› ¶!0Ò‘ci]?Q Іš|®qɰ>lvR„A„2®O“è®+�a†LŒ0¡J±2=S"¡[ñ[ÆçfH¶ŒƒuÕ×ëÕ/I`¿^•´‚]È}¥ã<0ÁTDZŒµÂ($TÈùHï®Þž¡KtñÞF_ô�/P¡ANÌ]E!ßÎÈx_û»ÿ×ÊÒßÝý.¹oŸ�$?ÿO_ +v“þ`fq¤ˆH!8‰©b&ú=©fÌè2aˆ‘‘¨ˆl†ÿ×ñlº639=8£Í<&vÓD\Â4"æ¡„»lˆ!8„�I”æx¦AHò0�#ù˜…ušƒ{´éh”aޚŴ¯>hŒzM¥¥®®�l!ì´y ˜h' 7&„Ú¤þ𠆡4n„n£XaFiäyŽ2I–åOÿÕ7Û¯ÿnI:N•¨úW' §­tµÝ,/²ÎÏ´­pÒÒ†M¤Ã‹{wj™ûI•â]¿ô6»×Ý ÛqíEK„Ôvñ›Tþ½'ÔK§IÕÕÒn ‡wz÷×ÿùc‘OÞëÿ}[­nïú½}Óªí¯¦—¿OKß}ÿñý×ôX§ëU67ÿ,r5káÿ‘µևŠÛ¿¶Òü©¢¸²kÿÿþ¿ÿ_¦á¯ÿŠþ»õ^X䨫ÿýz©�ŸÿÿîÚÿïÿ°Ûÿÿ×ø×úC«Û´æãY_M5ÿÿûëÿÿðØoÿÿ¡úíÿÿÿþl^ÇèF¶O› Ad"(Šˆu2R�2�Hb¢%ÒNXQ~^¤´'Q"s©�Û_ÿÿõÿÿü6 ÿÿá¾CŸÿÿÿÿ籠gi0Ô&“²~|£c3xFº6t|hÖñ„x Î2c3‚ ÐF€Â5´BL¸ «Á‚^<!2lˆb! +5‘âÿûô˜¯ï]¿°áÿÿõIðß÷ÿÿ[~ÃiXAœ4­Ã¤é6ž“„ 6‚nLéÒtE†¨Šì#CIÒd|˜n‚aá£ò7#tÖá4l£XhÖÉäÓëÿþ¿ÿê÷mºõûÂ^‚ðÿÿÿÿ�ô«KiÒßQJéñý&»Jêè…@˜„éi4•³!6h*PÚ>m2ÐæL4ƒ ƒhŽ�õÿoéÿo­ÕÛ:§õÿ·×Õÿï{m/öþêG Oÿzãª~µø¥½«M?­%û}io×_¥­ ˜OtÚý™þ½ýëÝ_yŽž¿Ûµý|âÛÿ¿ÿ½¥þýjG +ö‡¡¨÷í8Ò½Ðô¶ÕÕmצÕ4�&ݧҰЧ¶’z_«gÖ–êÛ ÿ×¶¹¿Í7õÿ¿ûöûmëýÿããü4C¡C–9ò‹†?ïãü±ú·ï‘¿þ†£íw $ȯMÅ' Ó"ÞØí%m&¹°•¥iZZy�Øi_}Úý~Ùõíîݯÿý/ý‡,f:.¾Ã_ëñþÒù$m/åŽFN­ÿ*&š°¡…r W 4à .‚ ÃA)Š´› Ú ÅZ±Lvl‹`ËšÚL‹”ÛO»aœ¬ôÚZöí/ý}‡ì4¿áÿþº¥ûÖ�·ÿ╈0GkG”´ àH!SáˆA„&)‘ê!Ní¶M0 Ž-m0�6*“MŠM0ȃ¦(1M –ׄwÿø#ð߆ÿðÃqÿÿõûëý¥úÿôpQÌ‚³%´y˜H¬døaOa4L Å&�Þ­/¿á¿ ßø8AþP�µÿoûE?×ÿýW¢ÝUˆ†C�ŠÿÒü=áþý´Ÿÿ×mé{«uÿÿõZˆ�¯ß×÷ößï—ÿá+bëýþ¿÷â½wûõýß{Û÷Uÿõ¤z¿±^ØÅo¿ÿ®¶«Ûÿ¼òï):o4õÿþ”-íÕmÃkû~¿ iìúýtïlÍ_ÞÙ¢nÞ¿ÿ×¶íÕýÿÛ¶×ý1Óé¶4äW °Ši0Â÷L3•°ÖÏy…ka?Uû¶AùŸû¯lÍS™Úöf›zþ‚w šaŠM8\¾“ƒl$Å&Å6;JÁ´Õ;TØl6Ø`²'RtØa_¶ËÞÚ°Ïv’öM–”®‰àÁ)FOLB $g±0”0ƒ +˜„îšjÓ§°ÄA†¤Ø­®!&¬SI4Ôe”#+u1s°a0ƒC=ÃEÚ´a›Pé=8ˆ«™*gfhDF—Cé}VÒ]¥PÈV 0£Ëd¿ŽÀ¢Sß>(U+ë‹ÆB?ý'‚’ø$TÝÝßuÓ×þçc£P§$÷÷ÿ•µª>0ÐEóv�ßÿ­ÚNÒ>8ï-pˆã#C$@Èdt,‹žuE=éê­á&ÿáAQ—$ka£ÃÖEÜ#@2ˆ»3‹¼œB€LÁŽfÑ�93 þ´‰Iš™Óÿ¡haÃIÒ“h'I ´›Ñù£v!±M.»ñð�‚4w�y²$ ‰ ›"6d«6Τu,„#¡¬·RÌ‹‘6:D½„F=-'WJÒÒt›KÂM¤òý†šdÎ ãA7úII´¼žP˜EÙY­á2yBjhÎ@óÃô …!0E»4e¹ˆ geS·OÞ+¥«â“«þ—·ÓP›JÛ½W'I½Qºh ›‘ÃP…„, �žÒG°‚úh¤K%Ï +v†Ó´(wŠ— ]«UêšûºÿàŽø}(®—è'ZW‚u“÷%Ím/„•¥ßV¿Azš>ß»�{¡¯C¯¿÷CöôëûM¤õíûtÝi>‚JÕýP¿¨¿þ‹¬º¼5–ä÷ºë–>›aý¨µûþ£[»nÚZµ¤«_éýýý†ÃJ¶¾?Û¯é +íü:ô½÷Þº,Žç`ó%û¬/öÛý½÷ëÿ°ß°×ÿÿÿñ×®J‹ëªêv'x¯øl7ûaÿþÚÿÆöÿKÿý|*Có%LÙñ Ê3�3 RTÏ™Ñ�Hê?!™(jFõÿ×ü6¿ ÿþ¿ÑðþÂÿ·ÿþëÇý4Ê4Â6�mØFÀÂ7HHÏ „Â]£Ã¸hƒk`�Ñ 2¬¿¼P�‘ Cù²:ŠCFÚ!(F$ÆD3æ6ÍD@Ë*Í?ì8~öúÿ×ûŸÛ}†ôUÿÛKÿüŸßôE€ÂM¤é:M¥ªm£ÛI°�d¸&ý&ÈI'д­4Fʰ4ÓÂ6�˜g¢æ�a”Aƒ�™F°Â”`‹€Í3cD&Éuîÿ‡°—÷ôÅ¥û‡°¿û¿ÿÐ_3»¿è”Rºzt­-RaÚZÒM²çÒ†©;,äcÒl"-ÒtE€Òl!É¡6‚y3‹A0Ñáþ� &ѹê‚m4ývΩÌ'nÿ׿ֿû}/þqÁþ¡/Ûÿ¶ízb˜úO¥ºON·úZâðšK‚o&ÒnIÓ¥kº' [@˜m²ÎÝ+K¤Úg�—´­ßo‘-Û_m¿§ý½Î~Ùv×ÿ +7ÿú÷¿ö�ÅHá{R8_pí~¼¨+ߊ[÷¾ôý'ö’zõÒ[§ívÌû¯s:óö•ÿfiý{ûKë|ˆþ—ý&ÿëªý¶ïí×#˜wÁ/þ?¯ù+Þõï´ÚV㡯¸­¾ý:£ö\Gý› %iZL0“ îé³Õ‚¶·z_jÙÿ¶ÒÛ_nÿøúêªßÿHXl4†¿õùb_LJãü=ÿÑšþ¿ÿët=ü$›iZLBdAÖÚAŠ‘ÂV)ŽÐMH—¶Á%»öÒ´˜g–=Wd0 3ë×HÎêööÛ3M¯þÿÿÿÒØü?Vþ]öÿþX×å§üA#D0LSƒ4Âx ÂiÁ8a„)P"‡[ 4ؤӆ‚A°Òºc’¸Ní[cMnÒNÒˆl3’Û [¿øa°ÿÿÛKÿØ~Øÿ¯ëÿú_ÿÍ/ƒìÐðÔ¬h®ƒ�£JgÈ1 ‘t +ªí4ì4šiÚ ð“'–)lSü8oÿòw½øoÂ;¯ ÿÿÿÿÿÿþP/ˆÑØ"„d”‰Ì$|’:„G'�š&ƒ¸a28_ðØ{¿ýì4¿ïá/Á¿ÿÿÿ¯ÿÿÿÔD+ˆˆŽ/,ܧûÿôÿá¿Jý¿ÿÿÿÿïÿøZZ¿þ·wÿU•Sý÷ôáþÒêïöþÿÿÿÇÒ믯gU˜û¿ýpŸýç“úþý?ûÿ¥ÿïª Ò×Ýmßí·ÿþßíëþ¾sõë¶ï÷ÿþÿÿ±µÒúWg¾º³Ókÿ¬ƒû3_Ùõõé¯é]:ûf‰¿î¿ý¶ý¿ÂjÚ KÚJí+IŠlU>EpØl0UÓl*¶•—¼#¸zÝiKì- ýÒÿû?7ögër±´Å(¯# IÂb™è0™SM4ØNÛ“M6)iE ئ“M´­&| 6Eá1J­¥ªl‹”Û 0Î^ØKܼY… ƒÔAˆC8ƒ42¸§?|¬*i¤zC Ú3å\0‘Yb˜K_lT0I°• &G Ðm¤M:M6!1I¦ šqB�Ž{z2­¾æBhDD3†l#µD„kDè¡=²|0ƒŠÆŠÆÁLîØB"Zåà§al·EUS´ðR¸ÆTˆùwuÔ# w÷¤£FZëKßujš¯��gDwZüTkú¦Vìì/&K^ZâY²DJÏ„¸øQcd‡š ‚²!çªkú},µËÊTklG%ưÊ"ä²�lœ¦ŠA¢¤ +0)¼áÌ0ˆN"Šr°˜™äbœæk"Ri¯òºD¨ŽÛ,„dø&�L44œ$é:¦�ñªg-0��0šaÃ�™Eã3Ñg²B + „f <�P™’ÌdS* Ý+wi[Dž—ºNƒ<ÒpÉðM5e šam²hA¿ô �Áªa3FÉö,ÌÏš!,„ÃXdùs•ݪ•(/^­ïI=4“¨ýZ^õ' ]¤¸VÒM²ÎÁ´­&»,äH{²beóÝ“™7¤Úß÷wëoU·´½ÕÝ¿õM§ûë_}Þ ·wÛwiÅ&Â#÷·wõoº¯^ë~»Òãý&ýÒ.+ý¦ÿ¦ÿÖá5k$«§ ¢/ÿ½vúØcÿ½ûú,r3ßÿãWýßýÿãq޹ØR%«jÿ½ëëÃ_Uÿÿ×þYVÿïþÿ×þ«‡¯ÿ´qéᆵûj—ÿþÿÕïþÿòÆfJ¦UžQrgL‹f¼ŒôÓÞ¿ýëÿ÷gÿèîÿÿÿýÿïÿÿ„hf‚6BÞ#´D¡‚¬¿`ƒ!” ò<Žf2\e©Ð×9‰´ˆ6u"ª‹£´/ÿÕ´¿ðl »ý¿Kÿÿÿýÿÿÿÿ¤é¥¤Ø@�B74Ô#[]‘xüq†èFÀÝŠ?„k ‰3Y«!:0�aÞ#F¶PŒ�ž BB0gLÁ @Ê3xŽƒ)Ùtz8¿ýºöþ÷KÿÒoÿÿÿïÿÿÿÿé8T�+§e¡6KI •¥¤ÛM(A6“M0Ù1ú<4›t�N“a5v‘±„ÕS „l SL#`dîTÿ¨Ø­-ðé}øÿÿëÿÿ×ÿÿÇKJÔ]ouz®Òt­è*Z[JÛCbé6ÚJÚPÕÚi&ÐÑ‘ãI´Gd[i0Цkýµkþ󟯾ÅCÿ¿ßýý¯ÿÿöëë}7�jëiî­-é?¶¼V){ô•¢QA0­m I´J/_ÛÖÓu¿ëýôÿíÿuýõþ¿ÿýûëR8[×zýÔŽë¡�ï®-¯ñµUq}êÚiýÚµUó +Õ­Òí|ÛÓö÷þïûuþÛ_ÿý/ÿÃ×䓇Óxÿ,r-^Cž®¨‡Ž¯ú¼5#…wãi¯R8Wô›h_»N6ÒÝ´¶-¥È®¶ÚüÂØg¿î¿sMéµ½+Oºm}¾Ãý!aÿ¯¨Ö‹¯–“Wü±'ŸU¤‰ŽIâ õý ˜M6ƒh*¦AȃØuµI¦ÆÖƒN6Gâ“NDæ“eýXa&Ò°ŠæÕþ½ÞÙž¦u‡þÃ××J¿m×ý^C·Ðÿ¢Æ}¼· ! ˆb§¶AÙ'´Ù+ iSjšÓh6ŠMÄ&Ò`ÇcÂLlŠÐLj°Á+¸oý¿ðŽ=ºÿëÿÿÓ þ—ÿÿßÑd+)@ElÔ Ä Ù>AŠ~ ÂL•á#»JGšaˆIðÿØ?øA;i_úÿÿú;¶·ÿÿÿ¶´MÔ�ˆÌâDh143ãF†H¬Ô7þÿKb»öÿÿÿ¬ý/ÿÿþ”qˆŠB7ïwÛ¬$¨ýÅ}íÿºM‡ÿ¿ûÿ¯ZÄfAi÷ì¨Oëú/W{µßõý«nûÿÿë±K×ïm}º×K~ýÛÝÒûé¿öÿoê»imùšn­×Õ�´dêöþòuwWí¤Ù×ýÿÿþ·ÖØ&à ¥‘Ý×"¸ràÁ&Ó³Ó[ úa…ÛKöÌ×~Ùš½³5þßí¯®I6EtÅCIŠ „¶Ø¦0Åi±±L‹Ô¤KjÃ.Öí&U¦Tרg?·JóÍbðÃL ÂddÕ„ö&G „Òa„„4˜IÛMº R ؤᦛši¶‚ µ„äØ&PÌ‚ÌSÜ��‚•yYdz„�q $VBö¿`ҽƹet#�'é.ê¶’Û ,1%&Æ%‹RÙUò×Oœ"  ö Ï4‚‚�Ò% «dDUb§+'>—“&B¨P¦z$(cbîúNÿ¿é„x…î)};¾ï¤ÿéòš÷Ô_Šú�ÿŽü�™YiˆÝ’~Ÿÿä ù‚G� ùf F$”<ÀÁ8ÖKŽsá�™!å§W”Ôÿ:?UùšL ƒ%�ÐÒa¥HùTÑ­±ãF¶ 0��Œ8"ò!&g £Â.åÅÁj9˜‰€ä¸ÈfF̧Í",ÿ“píBÕ;„F='KW†pÂ6ÉøM$é:ZBt›  ›Aqz60�aìPEäÓFvfó‘sð¦4 ˆí…ÈN˜ I]X8RºHì®-Èíu§JÒ÷§[wªt´�+fB×I´ž_=&Aö +M£p¤,$èXL Mþš6l–AB•˲1‚Ç¥ûŠ­j4Ý7}&+¤ëzZëitÞ“¥é$ëëHœ%´KÑ¡¤ØBªL4Ðj,4l£sFê44k #`0��FÆO¦ 4BLÖ#.D@h60�ŒÈña\ÀÁ'Í—Í_úoöÒ— ¿ÿýo¿ÒÃh-ÿÿþÒJÒ×Ýt¶‡JÑ4Òm3Æ‚m&Òm'I´›I´›Òa„4¹2a¡Èø ia¸}é£ÛPƒð—ßÒb¢�/ï_îþ¿öÿAr2)ÿÿB½^¿±ïß¶›IÒn›Výt´°“¥¥zZ%�Õ°ˆÇ†ºI·ôžÏWD[ÿý÷ûôäëÕÿ_÷õÛÛÞýtjëþݾԎ†¿ÐÿRá+qWw_5þ�Z_[v’ô�Öú·¾“Ó×!�~Ùšÿ{Vïý»ÿÒöß×KKÿ_û˘|Žqþôñ»µWWMÚu¨ÐÇÆÐÿØqnÒ¯ÿô½ÓÛl½i°Â§i.Ú]uvݶgúûf{~–ôßwú§ëû×ý÷Hkørž‹·¯ºðåŽEþ=* ”¢ }}[ý}ë}0›lBÐlRv’jÚTö”6Ø`¬0JD²+‡ðÂM„ÓI[Vëm»ý�ßý¯~æŸoUöÿþ÷ü�ëËO–2½6íõ_õøÿ+5´yÚ…M¤Æ ßlÒm!thÖòy4F²-F°í2� ƒ¸ ù4B7JúR!…!"Ü› +e;­z×IÕ¥¿ÝÒýºkot¹;I~ÚÂP“ð�&éÒm/ +é4�yµZ6ûïö´vW4oµ×¶‡Z� z‘Âãú[C¶•þ+é7¿_¶ºŠN¿Âµi+‚°¨—´›Ã²Í�_w߯ÿñþ}QcøÚ…êÛî½o^º[¨ÿfµj¿§­Zßvû}ÿã´ï¿ÿú&'KÇEŒ�ÿûcÿÓÿ]hwC^ï¯CîÓ«ÿÈŸ�û_ºéRõÿÿ÷_¯­þ¿ËV�ûúÖý×ÿýÁ{u‚8ýÂÿïëÿíÿþÃÿÿ¯÷_ù‘ |œR2 òg5:™,YÙÿÿÒÛK/ÿÁÿÿà¿ÿ¥ÿì=Û×ÿÛþ��ØF°Ê žpSÇ‚HH„™ #6EEQ²<@�” è!@ÈÖlŽFѼø¤hˆg’’fJ Œò ‘Eþ‚Û Z¿z_ÿøG¿ÿ¶—ÿ†ðFúéÿþ|Z ôƒiÕïaT�ÃOIµ ¤ÞTA0˜&­£Y›GÇN�Œ#@aËò^N�‹±„h60�’(22.ò0Cˆ2`S<¡øK½.ÿôÿ÷¥ÿûh/ÿ áÿ¶—ÿÿý}+I´Ûݨ ØVZl Î^eYéi:M¤ìŸ ÒM„m Û¾‚t�4Òm Ùê›ÉìŽa5†Éy:úᦖíßëÿõë÷íñ ÿÃè/ý´ÿÿøÒ}SJéÕÿjêÒZ»ô•¥i[¾–“ ÎA6N¡'ÂÏé& °îÿ_]Vÿo_n½z_ÒFO¿ííúÿÒþ¿M»í¯~­µ×î×ZZ§Žô¶­m¿«ã ¾×_ú¤¯oäãÿ­˜Û'^Ûm÷ÿ¯Ók¯~úíÿ• õÿt›ßé¿ýz,r5þ·~½ëßúþ;oXèRë·tÖ�ÒüUU&÷Úûð›!Ža+Û?6f›?íŸï]ºõzýþêÿö×oÿ×ÿ^¿ÿŠÿ¶½ú»â¿ø¯¢Ç# }Ò Š+kÞÚ‹×½F¿âšaS‘]¶ÅHà6)�ŠVÁ%‘\9šIÚM¥øw¶“ ÿa�.öÌöé½XeöÿéÖׯûÿÖÿßÿÿø°ïYb_úø.µ�é"Ü’´ßµö`žØ&ša4ÒaŠAÂÚ „“´iI]Æ›¥jÈ'4׆ i0Îr(àÿÙ©Ÿ­VÒºîÿÿûkÿÿÿêÝpÞëKëaþºúâ¿â#(l畨ÖÍN{a‚:Í4ˆ)íʱ Ц°Èà+ Si†´í… &8MÓM6Ø¥»Òm&<½ÿÿúÿÿ(_þÃõÃvŠzÿÿì=ÿ_¯ÿrº®vVƒ# Á +?3¦ŠÈa2=A4Òi†jœ0�l%#»ÿÿõÿÿ ú m,6êßÿÿ†ÿðFé®–"4â")TŠˆŒ"9 ƒP˜[ÿ_دþ½ü$ìAa¿Òïÿ¼ÿ ýßéq +ô""7ûoþºö×Òÿô¸V±ÿ×ÿ}{Òþ¿þé÷ïÓûëÿëÿú„^·†Å[oÿï÷é~•·_ét¿m{4Ýú÷Kÿÿ_léïM÷_ÞA§ëo×××öM„]»Øi6’ÿi{t¾¿þ² 6gé÷ÛuµÛ×Õ¿_èÍ6þ¸d!¸í& ±¦Å6’i¦Ò¥²/4­9Ãý>!°í+«kažÛ3V—{vÚ]6g°ý}%lÏ´¯Á˜ßÈEšWdp¬0›AZiðEäNƒi*l-4ÓTäq°Å6·´ÆÆI‹NÁ;«I†l䜊àýVÒnžìA„ÈMÏ BUq Q­b49Vé¤xh«£Û•nxl'¶õ†4Ú ’ºaƒ0ì%a&(1IµI§b›&ExQAÄFŠå¹CϤDAš¡4ÁJÈhX…ŽA‚ ${p�49cØLl.i‘Õ\r¸›;E·XoKø×¤¿¥\m!ë .Ð2#q˜Š+G-°Ô¶®D†Í'37‹d6#à +v_ +WÎÒV�IìˆfZÁJ¼/z �ŠúªjKÇj|¶9®”ï}ö?É�!}…îøaÿÕ/"xçz.›–¸<Ù�h) dK$¯(dOR$½/]qn¡fr~Bq¡•DR„L%åÀx e ˆ„V3A„BP�'͘Rµk·2SÂ"ÃÞMÒAÓMZ… ¾|£ãTl„hxF†—„É„k%¤º$#BfÈŒgœf&K <äI™޹ª5W +v­�•ÄØ6îãZŸ0¡á›ÕÂA¶M N“rh ^FᮘM†�¨L¢d^HØòO3‚ �!h f‚ýT·Ò2 Y¦ßÔ]½ë½![u×uzæ› +Ë&ÎM„éa¨xI7ª#‹Èá…IѬ4hsãFÆß}u ¿÷_j«Ý7Ó×¥þþ“¥tèjô—…Aå …I Òt�&ûÿûÿÃvÝ´�û_^¾µû|4Ú®.ÞÚJŸ¾û~*ékIw÷wÚ%h¼Kä]ë¿áï±RÜ­pé¾±ñÿwÈá]§wJ=éÿ{§^ÅS‘/÷Ád€ç0 †�ÿaþÖ; }_ïûY${ØÐ"ëwúÞÔawõò±çc?¿h¿mK…ÿíþþÃÿ×ÿއ߅-?ÿøt<4Xäu>m”질Óÿ]}Ú ¶¡/³ñ}ÿÃ߆ÿð]ÿÿ÷ÿÿØj¬<~0F€e Ÿ0a5„¡¢P) R�HÃ>Èy¶DdäH"ƒ"坸IÂO¥±_ÿƒ߆ÿôxä9ÿÿÿöÿÿößänÒ Óiª7p��!FÀÑ­”A0ƒ FÖ=†ì4{ ‘›lSĈL˜ B( D$ȵ“Öh2=!H­úýÿE;ðÿú^“ÿÿÿÿÿþÞCÃðA´›IÕÒvZl �&Òta Í˜F†…¦¨&Òtœ$ÃL'‡kÓFÆ��¦ÙFpÍ2äv?Çk~µ{Ý¿¼%è/ÿþÿÓÿÿÁðIÃþ›J×Ý-ûô­-m&!:%íC­««¤Úg�i¦YÃ8i6–ËBpˆ°Òt„4¤—�ÿš'×Jýô·ÿUþ¿¯ýÝÿÿ†ô°ß÷VÒñ_I´�U'I¶šwotµvéþª¥{épM¥®ˆÇi?ÿ¥kÿZM·žöþõõß×õK¦ÿÿ÷´°÷û®·¯]xÔöŸ#…í-ýµ÷õ}Òtºa.«ÿ]æÕÕ¯¶Ùšýëu×ûúþ¯ý]¿ÿ÷t·ë¾ãÿÓu¢•mÿ¶¾«{ý~¤p·Öúõ´5Õi1±v––°½¥iw~a^›§kú·õ¥ÿùϵSžÚýmuÿ^]J¿÷ñaÃÿíˆ(xÿXî¿ÿa)áZV‚M4b“º ¤lpÃȶEwê‚Û/ZL3ŸijÛgíW¿ô›´ÛJÿúÿ¯ÿÿþ”6þõú,°?ÿÿÿáÈ50ƒ‘ì0Œô|°“dP1Xdpš¦ Û8i'­Å'„“ +›wiÈ–ôî˜g–Þ MžëþÏÿÿÿÿü0Øþ¿ì=}¯ÿÄDFm“È/•ÊUˆHöØQ „œ + ; ša4ÚM4Øi1±PÌJÅ%ÿ.¿ÿÿÿü6ÿÛ¯öð_òtÿÿÆÎÕ!�’Ô ¤íÖx“ì)â�nx±A…ME¿ô—þÿÿÿý‡ÿëþÑQÿL»ï¿õÛò¾˜ˆƒ)zmRûû«îïÿü8oÿ¿ûÂOþ‚ÿïÿoÄRëÿ¿êþýÖîÿûï¥ýá/÷ü0ý/N’¯~Ý^ݶ¿ëÙ×Í­ºÿý·×÷ÿ¾ïý[ô¶­ÕÝ·Û«jÙšmëþ¶ýi×÷¿ÉOê¿zÿ¹rúv\ ¶‚m)w¶ã¼½i7v­ÚKö•¶}uuiþßúûkû{jßúa1´Ò£»I´˜NlE16‚c S!èÒµOI6;KW­S«/êÃ9ÚM˜ì#¸?ní·mí¯çdŠV0šh-!!0ƒÏpÉØT¦G0ƒM‚(t·v &Âb™è0 4»šlzQLU&›‡M�ƒ¶ÂM¥øˆ£óN¥�¡„N„4 †!"¸£ÑW¦> +†Á1 …N¶Èá;A6 Á¤4‚a4ÄDtd¦„\DA‚;@Áb1莹õ, +ýuÿ B .êY qŽZë +*ŒÈS©Ô)SfKq�–E¿þDAB wß×;CR!„x�ƒû[»¿é:|¢&·}Gÿ�Ž×òP¿OÇ(ÎÁµë ‡ 00R;Í‘!:6ÌÄ ódt \¡ЕN¦v?ê«dx« “Áo £E4ѱªaØEÃÏ"í„l’ù¦l‚!&\DFÆo•»zVâ½�ã[¥¨þü“¥Õ¥ßJÑ'Uû_ÿEŽFc®”¿«w¥¶ÕÛ´ûÝ?í +§ú޽:�¿ý/üw_IZßÿ{×ׇð÷þýÿCK{зé¥ÿëÿ¥¿ý_ûá¿üÿËŽ¾XápíÊßø#ÿ¡ÿÿÿ¶«¿ðý‡þ“ÿñýƒñáõm/ÿþ ?3¿ÿÿGw_øaûkííÿþß°ô¶ÒÿïÒÿÐ]÷ÿÿ·ëÿ‡ðßú@ßÿî–ßíØØ¯ß×ï×}»¿þý&ý ø7û ÿþÒÃzÿ¿_úIooÿØâ¿ðþÿ± ÿÿm‡ï Þ¿¿ý½W÷nÿ÷ªië¿÷ý[ÿ÷C‡ýôÿ¿ëÝ×··oÿvµÚï›ßÎnþ IÿÿK}½ïZì3–²(áížô¬aŸûlÿiªÞÝ;½míÕ®—÷ÿ¶¹Ïü¡>�šaŠM á±V”Ž�±L0[µ‘:—M¤�Þ“Ýê» éõÿöf¡—ÿÛþ"ŒôWQí†vÓA0Šià l0ƒ#Ц›L0“[i&ÇjÇi]¦Ý¥§«eí°¬ƒþé³ ³ÿi¥´20ˆøˆˆƒVÑ£*Û„"ÅXd¬&*GÁ ©§pi&šh8„ƒb›OJ6);«åºÜ !!jU´j0Å#C•t{"Å« + ±M5r$×&ã[™jŠƒA�;k„�\DDKýW§uÕm&Ò Ù’v”¶” `ƒ!MÆÄCÿ”Àˆ©µÌaAI32[Dœv“ú4s³Çcx(E"S°ª›Ð½§�êi}^¿þëùU¿ÿ½uÿë�E!H"œ‰|�#©”ŸëùU¼h§hÖÂ40�a„h ¢Q2èaÂ#°@ÈŒàÎf™á lÐ9P*”„¥� ‹™ÛÿÿÝè é0Ò ªi6�º49pDqO62�0�ÔkrA²vˆO3† .!ÌÚ<@�åÍžPas‘¨ŠFkF¿­«®“i6ƒ8i=:NI0ÂZ ‡&¡:Mé6A´�1Ò=³KÎâ¬ÃD&A­‚ +G`�å!ûU´®ŸÔR÷¤›D¢“…mÒÒÙgN§I¶˜A-tžXå[ÒoÑnÒa£d M£ÛÉãí4k#n©OÝjÛN—k»zîÒõé:»þ¢–þë¤ø·¤Û,í´­'I°—…Txi=n5n·ë¸]õM´5«zõéokú_¯Mëþ¾)>úX¶µøpëWñáŽö«ë×Ö?[Ü.Ò­ú÷Ðúzµi/}éñ°Øß« ~·ý[ýqøcO�ã÷Ëú‘ÂÝ {µ¯DQØm¿ÿV¶«ÿþ¿®Ã^—×ñ†£ÿþyÃa¿ÿ!x6‡èîÿÿÿ]vÚ¯ÿI~“_ÿ¥a°nÿôߥÿÿ挎Ô‡á°GÐ#ðGÿþÃ×ýºøwþ½,:^“ÿÿ �ÂO‡ >¨'ð‚ÿÿÛÁþºom}-×¾+_Þ»Ð^‚ðÚ n’ý'þÿ°}'ï۪瓚Ӻ_úžN–ÅS}®ú®—ºWKô¿ÿöôþØAw]{§K×õZ~·ÿõýsÉÖš××ýÿpöÿáÖí&Òm[¥ôî­7Ý{ÛKm}W×U×õ].ÿ¿×¯Fnhšm ­'I´­9ÚiA—Ói[võß­Ú{u§ZÿÝmþÙI»kÿ­;‘�Š 4a%M§m& ­´M�´“c‘\6D‚ í;JEpÞÂö»gó�û?ZMëÿZå(bb­J»;Óˆ±V( Š †G°˜N�¤Â~G +ÂÈáZ b¶EÊm„Ó çû¾C ÕJaI”è0…‚a0˜MiŠv…§ Ãiå8„l&êÓ Si1È㦩· #ŠRrµ†Ec'à ‘ê „Ö·ÜDr¼"‡ ¯_ÒÕ-(¶–% BŒÈ�Ã/•ÂÁl3?ü…«äÛ×ÿ'$Ÿåºsÿÿÿÿò¹_?øR_%ݙڒÿ餲©Ùmÿ}ð‹÷DM…+óÿ¾îOþk¿ùØZ&KÒwßÿú¯ši6I=…¿ÿÓOÕ!\s$‹kþd–&lˆ<Ùƒ'Ê�ÑÆ¹ìÔõ:">«ë�ý'“M 2~OÈN‚ ù4Bk ‡DO°ibѲDM B2$aK£SÊ â2_þW óTE†“ ÞLâûÚiýú5µNÏA0�aè3L#;$aðB@Á'G è)©™�2΄¤YÅÿW­P&Ò}Ý÷¼±æ—²èŸH6™Æ�oGèP�dºH7£eȼli„5³IB3´BLÖFÉ�0@ȈÀÉÛþŸovûvß}Õÿ’n ·D¢“zº¥Ay¥é6“I6é0дžL„ÚNSTÓ „lþ£[´é7õOÿ×÷¥{î×z�»V¯ú´•Âm'D�$î•¥…3†ƒ8a &ÿéßþÿôõýûoô)?z]=}�ªµªtÒî–“ôôÜ�¤›ÿþû­ÿßþ?Ã×ýÖû~¾ë�t7ô?v¶›Çÿÿïþëþ¾Ãëÿý‡ÿŠðýçòÇ"Ò:Ë»»îëÿÿÿÿÿ ì?ÿ÷Ø}ÿì;å§ô:é ÿ_ÿõÿÿÿÔ#¿Ãmÿÿì=Òõ¦þ¿ëÿÞ­ÿÿÿ¯ÿÿ ?‡ÿÿðÞÝx#Ût¿ð¿ÿïùqÿïÿ×ÿÿÒü6÷×ÿ‡ÛK °vÒþðG�ÿÿÿÿÿé¿ý/ý/Þÿÿ\?½'ÃpÐ_ú¿ÿÿÿÛÿ^¿ÿýWÌ÷s®õ¿¾ŒŸ¥ïoý/ïÿ¯¡ÿ·ýÓ­­ôÚÿÿí­¯ýÖuý}WÒý½/wÿ×oÿ¶z_Òm+¾Òîÿ_nŽmï_î¿ÿþsuoýW»ÿÿ_ûšiÚM¤ÅÈ�IŽD ò+‡ÙzÒ¶Òm/»m.ë�Çý})›3^Ù¢õÛý-ëþI­Å1 ‘Å…a)ZM6›­,0Òm%M‘si'¤­§È®tÁÚêÃ^Ó»?ÚëõÚÿÊå*gÂCP‹˜i‚a>i¤V6˜­ŠlC¤î 6‚Nݦ…¦ÚM†)4ؤá˜&EáL0M;NÒÛKþ8ˆŽ"" £@D­�é†!JÆ B:sÓˆyÀsÁyOÿþº÷úª¾Þ»o×ô×íþÞ©w½ÞÇýýfžiýÞu´_¿Ã ´û½P|a?ÿþ¶ÏÚ¯¯ºPËûw­æŠŸÿÿÿö÷é§KÞÞߤÝÖ“wã£sš£QÚÍY½í§ Á&šªk"¸v’¶ H®܈8?ºdö}zøU§ý³5~Þ–­öÝïßßÑŸÿû£øMÚã¤Ýwýí6šO´Ó¸]„“ B­4ØTÒa´˜i†7O»éêÕ²ó .cöÏWW¶f¶Û3Môî–ßûýý/_þ›éÛý¾R"#+$%%+`˜M#ãF· ûb´Úm0�„5§M˜¦*Ób°”6ØîØ`­‚ôÝm¯¯ÿñJþ›�ßý¥þË~ÄQÏ'ŹB�à¨Eñh0¡jVGAM†‚Û˜3 ­´�l}×ëý~ÿ±ÿÿ× “Ž""‚+šÌˆ3P¤€�ÄE‘ ðÙ+_oK_ëý÷ÿýºÿé|6¹e 7ëŽ+õoÿmý‡ÝkézT»i}z¯ÿÿÿ‘PA:ä�m¤¯L0‚ÿsTj¿ÿûkáƒâ›®>Ô%a&Ð_�ÿBÿ]ÿ;&SU×ðdFÿa„¤½òÿ÷ø7SQüÕš|pÅç£ÿµ›þþÿ†úÞºoaAõÿý&þÒØdÿn×ßþÿí¥ÿüyó´ûÿÿãêÿÛTŸÛK~Í"©²|ðS\OžÎö¿±_ýÎiwí„·ÛÉó¦¿Õ}ÿÿÿO\xb«ö+ý%[¾y·^`­¥û_qƒì-ü5¾ÚJ«~í×ì“©ÏÈc?ËzÎð¡`ˆ÷íéu±^ÿÿÝ/K‚#Þí¯á„dHz:gO÷ûn¿ñþßÅý¯KÛÕÚïþ×ÿþüƒŠÿÿMíïÿÿO×ßõæ +åºOéü}ê·þd³…2KŠ™#²¿èÑûß}ß_j¡xPRKÄM•ÄïѧÛý/þßIÑ£JªvÁ~“¿¤“ôî�оºš<ˆ¾“~•îõßù\ÆBÖd*½}Ýþÿÿûê“ÿë�‹~¾ïûÿI¿Ûû +}ú®«ë��~ã×ëúé⩾Cœ®ƒ„¡%|äj"jŸúúþwŸÒšÚ…T׿KQžÂ.Ì\„è a‚4fgÍžh#™Ðs‘Ì Ï(H‰„O#¬Â ˆ5DcÔê~¿¯Êág¨DXl´ÃdÎ熂 ¤¶õNKÁ¬['äþ#c'ÓÎ ÒEØÑ 3@~ˆ�6D�AHc(LÐÈÛÎjk_ð”zMÖ.•¤Ã쳆pû,!|»'Bè˜a5H6© ŸI¿ðš64kaÃÐòxÎ „g  ه„ †ŒódˆI‘¬ÿ¾ÿ¾ÚÚ_¼&÷z»ZZ‡]3Æ–ËBoäÎÃI´¤ÚOª£;H1h&ð˜P˜OFÇÿwõo®5n½Ûÿ·ýmÚ¯u}+ö¡:VºN—ªm« '³ÆeXl´&ÿþ¿Ö¿÷ÿøÚÚzõ/¯ÿö)kûºZ½:âúOÿÿVÿ–oÿÿµýCÇõýýÔŽÔkÞŸzݦõ¿ÿÿÿ¯þßûÿËÿô‡ÿ� ÝÿëîïÓþ¿ÿÿÿÿÿýÿÿE�_ÿÿû×ÿÿÿÿÿÿûÿÿÿÿûzÿê—ûÿÿÿÿÿÿÿÿÿ)7ÿÿÿaáßÿÿÿ~õþÿýÿþ—ÿÿþ à�ûKÿÿùÍ#LÞxø?ÿÚÿv—úÿÿ÷„¿þÿû¥ÿ¶‚ÿÿÿzÝÿ×õûzÿýÿÿÿÿ½¥¯ìB¿ÿ×ú}MLòÿÛ_öëý-}Û×ûöÿöÝÒßô`/ýÿúoû¾ÌoWì3Ó¥}ôßwV¿~¾ßÿ“ ½ÂWþ»ÛêÿôÓMŠl%"ãV)´™Û—­+/^GzWiížïý´öÌýlÓ½¿ÿ¶ÿëÒþ�åÿõí„Å0“¶ &¶!XIˆ[ƒ 1ØMŠXl;M�‘x0«ÙM†´›°™t¿²!ÿk·_ëÿüDD!”baA5š„•b%h'a¤8M6Gb Å&›tÈ| Á&ši¶fŸ¥eçKÿÿþMõfEH‚r±ƒB@Á"}„�nx† ‘t +šOM;b“Tô˜i}ÕÒí+ü›�gu¢�ì$V2}n!4Ä/ß òŸÄE\îp�úÿÿKÿïóMÍ!Ÿëû¯^õÿ_ÿ^›ý;KýÓÿ¦Ú_ãÿý—Å'÷ªÿËM[ þŸÿÅþþšñ½WÄ?øˆ‹MÄ!�{IüãÿäØÔ2~<³år¬®“aÿRg“`+�_¦d•�`‘] ìjæAAÏ‚D™ü‰¡„SŸc;úyس+B›#†l.Ó†vƒ4ÿÿ …/=f›œôƒ’ ‹ö‹æ~ÿÌ„Ñ2GE»îôÖï¶‚o¦Òm&ÿÖìGi·¤¿ïûzO]7þª¸¾¾v1tÿÒ~›IÒõóuœdhÈ‘&Fj¥Jí¾µÎÊò—ÿþõñÛÿ0�”k"ñ¦g #Xfdx‘ æ€gÆx‚!8ˆ0öH€d6dFyFcÉÅ)èf§é.º¯×¤¿zKÿ>i0ÒuDwI†áäÇHCóò„Ѭ�D Éæ3„�aèÑÐF€Ì Fpʤ`mÅy²!ŠP�’"tÙ�FÉV¿®ýk¿ûijÂT¤Ûî(—7Ù�LôÃIѼ ‚oAÒt˜´›MSÚK „laBk„5†¬32˜N ƒ__ÿÿý¡®û­þíÿ»º]{õøúêý=ºP�mïn“i7ìºl7vMºÂÍQ§ÿÿÿyc‘ÿ_ûÿ»_»nÚJG Ý[µ½õûÛí­í»ð�Ýö•7ÿúÿøÿû÷ÿÿîìWØû×ïo[¡´ýq¥þÓÿõïrÿý[ÿ_ýÿÿÿÚHx?Çýí~ ÿEŽ•¿Ýÿþíþ¶›ÿïéÿÿÿí×ïì5Õ¾½3ÿ�ÿßôÿÒßû¯ÿm/ÿÿÿÿ]ÿÛýÓ_ÿõÿ÷ÿþßÚM¥kÿ»h/ÿÿÿü6—÷á²®vÒaÿ¶Žÿÿÿÿÿÿ÷im¯º_ëxþßÿ_ÿÄ/îðzÛAÿú_úÿÿÿô[¿Û v“ &Ò¿ýþ—úÿÿ3‚×EGÛ lBKýÒ�ïÿÿÿÿSÇö+ SÅH&ÿôÚÿÿÿÿá!ý[}×G­Å5ÿ¿¿ÿÿánÖáªašÿ^ÿn¿ÒÖïÿKJï=õ…Uýÿoÿ¿ÿ¯ã“r÷¤Ã=²ÿm&ûé¿ÿ�rzÒm²uô«ý5ÿÿ·_ëÿøh&)´ÓMÒ�ƒ¹šV\Iˆ˜ÓÛÒU¶Á.êöAò¿™ïûûn¶¿Wÿå@„I¦ša“0¶¬$ÈâÓI¦œ;JÓMŠNÕ†ÃnEpûNëÕ†r^Ì/lýiwÚéÿÊàñ”‰.Šb0˜ „G&˜L&÷ž!Å=„›Ol'M4×já± +ÓŽÕˆM¤Ø"Ÿ"u&Â(}—ÿˆW;%g`hh]„FeQ"ŽvÓ Ú43M¡¡C 5h&›A´Õ ¢ÈíŠÿø…|DE\®*¥'(Ti„ˆL5ý}},›„Gþ‚úúÿ¶—¥ÝØim¥éÃ"m)² é[Kþ)ƒŠ Š_äÞÐÏdÍ„ßñŸô~Äÿÿÿÿÿÿÿÿ+ꊢ$/à˜D~K`¤ŒAD¦iéþ� #Ã+PF ‚aé4­*Où6vV™–Ga¯î£CÐÿ¨POÿ««»ïÿÿÉJÝÝÿëþŸ�UÿüÝ©«&i}}ÿ„ ù4BA Æ€Éã Šˆˆ9ÎGDN›3©Œ‰™/ùÑëÿù7oÒm «‘³%>žÖ‚HË�F€Î°`Éö ÌÄ'ÖÈÛ4@Î�M <äS²±’•ÿà›ìºDÚ$<*M²éì™Èí¤ÚÓ †‚l$Ú60�”kdòe\˜FÆ�„l£Øh„êÐŒ3â#ddâY Èaÿíÿ¥tÿÿíBl%h—0®“a'I´žœ ƒha & IÒw‘ÃA6¡Q¹… „n£dÒL#[Gïý¿õ#…Åìþºè>ÖÚë⣶‰B“„–ºZ¼´p“jéCAži8A0ÐÒ 0—ÿøÚïÿ÷C{hRèbûJÚ4©¤é>/·Þéui~‰=-'ÿÿè±—‡ÿÿ,{»«j°í}Å¿¿Ó#„Ç]×TÚ %Oÿÿÿì?ÿõÿ©u‡mùc‘§¯}hn¤p­u¡ã_ýÿÿaÿÿÒ¿ºì6Š×ü²Ž>¼±È´¢Ç#§ÿÿÿ†ÿÿÿÿØl?õ_aÿéãâ¿ÿÿü?ÿÿÿûa¿ü#�]¿ÿÿ_ÿúÿ߆ÿÿíÿü7ÿ‚ ðßÿÿÿÿÿÿ÷ÿïþ½o ‡¿ú{Áÿûÿÿÿõþßÿÿî«ÿnÿîßoûÿÿÿþ·ÿç6»ÿûn›òûé}ëïÿ¿Þÿþ­}³>ýóÿíén­¶tëÛýµï9ÿ·ß¿}ÿûA2v¶Ã•;­´ý<Çözºí+lÿí¤é}û_û{{mÿÑà˜é… ÂlR 6H äX„Ó¶)4Ä“m&ͶJÒºn“Û9X m§u~Ùû³÷·ÙŸÙšý1&˜Á‚:HÐØ„Œí¨V˜zTØR(á&A)Šm+I†I Ø©&;JEÇl0I[ '·m„¶ÖÿäÜË+hfq§Ã�‚ &!2=Oà „ìŽÒjÄ$bi²+ؤÅÿÅK}Led¨¥c «Ê¶ÓVA’€¿ÖZZÿ¯ý/ýÇþïøÿÿÿÿÿÿÿÿÿÿÿòm^vü¯¦  ìZ*±R#äv…þð�«Ù2A³‰ÿõ^ââIG†v+Æd©ÝEô�Z +V™Ù,øézŠBÒCÿÿ&<ìoÿú÷ÿ®¾¿“$D±ÿ•ÆÌñÆC# É0¥gYHÛ_×TÔå}s8&š<0� Æ�‡l‚]¢ÌàÑ ç‚æ#03„ˆL›# óA¥ÉòVˆú�uÿª#¶¡„›I�+IÒoH>©£cM4„Â6=frs! „Âá“æD"r œÄ4D™d!r(Âb„eµ%¼(sÖgÿ +‚ˆNºL$›KIÙg[.�‘ÍÃDvE»,áœ4z*Û¼œè ÃCðš„l Q£Ÿ‚62ˆ È=Ù0�a„\]#æA£l†QGýݦë]uuÿzi[„Á_N·‹nîËšÑ7ì± Ži6É�6ËE&"à +“hZM ˜Ã¹¤šhüÒ<ö¾½´.ºô½¡K÷éÕ:oëïIÒm¤½RmuV‘'¤ØI÷P†m/ûþ?Ë.××¾Û_úßú>â¯ÿîÿ�4½oòv½'ÿÿþ5ŠãúûÿËrEïþ­{U}{­Ó½¸Å¯ûЦ¿ÿõÒI_ÿÿÇÿåŒÿøÿ[ýè±Õ~úrÝ)fÿÿoýuýÿý/ûÿõoý[÷ƒñ_þ[’ŸÞ—ÿ£=Ò¿4dw‚3ÿÿÿßÿÿýÿoÿÿƤÜþcÿ mÞ‚| ¿ÿÿ¿ÿÿÿÿý‡ÿÿý�‡©\Ì_ép¥é¯ÿÿÿÿþïÿø7ÿÿÿˆã_õÂ4&ßIt¿ÿÿ}ïÿ­/ÿÔ?ÿÿÿŠÿ¥Qï_×Û¯ÿ¿ÿÿÝuýÒý¿ÿÿí4ÿ÷Ûdé¿õÿ_ÿúÿoþý¿÷îÿû¿ÿþOd1Ì$ÚzݧíÖ¿íš+J×ÿ÷«ÿëóŸïÿÿú ¦špØm±QÈ®— Ë’iºIûeîØk¯~Ã=YŸý¥ëí¯ýmßkí·é§´þ½„XNÄ&„Ó ¥i¬Ri±V‚d íSb–ÓÓm+/È£‡eí´—î¶ÌöþþÌ÷Ï÷òÜù9“ Ð°˜M4Ò>9톂Ü6¨aJ€ÂLl$˜A¦IŠ„ìBPÚ +Ó»Jئöˈ�°ÂPÂ(z¤œ·AˆD­Jé!�j•”|sà Bi¦šN0ša6(&ÂdAò;ÚaˆAˆïM:¹h)Á¡0°Ô"Œì0™(OÒÎÊ?÷]}­/´ÖØK_áˆZ_hÙ™KMb˜ßÓý Õ8Åÿ̉l2±æE’þJÃ$ÿÿËo_ÿ'%¿ÿ“’Tímü'ÿõ&âlïKÿùn—*™ ¿ÿ½ú™+¿ÿÓïÿ;,²lu¿ÿÿÓ;?äÆV‘2O_ÿ œ�DEÑÄEYÍQ«×ÕW;+ÈÞ?ÿ�™0�mB# ð\Ìá„ 3A Å$ +SÅ">d4êDƒ\“½5ÕÿáÚL0„5M ØFÆ��Ú5°�lž Èhâ\w%çòf†‡ŽÑ¦È�!h0ˆJ� <äFe+Uÿû,í´­ã29¤ÃIÐM¤éÐÃ'ɤ0ºA´…ü&�Ì#t#CÂ4"LÖ!:2†…J‚~ “#¡\‘rmÖÿõééÒm-|WI´F?i ‰=YhWNË8g +IÒnM “ŠL?Na=P�?\(‚ÿéÐÚm¡KIÕ>Åm ÓéoéZ� ÖÒ×t�¡I¶Zöm &Ù3¦äÑAÕß$Èê2,D�™ËÿþX÷mEîºoh}K„¿Þ½/Û}¾äâ“n»…I†›|  ͒ ˆ þAý ÌÁÎÿÿÇ·_–䨫n÷Nþ·úõÿ¤ýj¸«õïûô^4^=fçt��„]¾ÿú[þ–0Ø?ýHaÿ,r15��­þ†Õ]Wº¶Óôh ÝôœùëO7=g£ÿÿÿߨm×·×ûô…_ÿ–åëÿ¶“û}6¿·ÿÿÿþaÿ£Ž×ý‡ÿëÿÿŽ­ÿ¯ý/}=ÿW§ÿÿþÿÿ ‡ý´´¿Ãþ ‚)þÿÿëû餮ÿÿöÿÿÿõ¼6 ßûø7ýúÂVéf/Í­ëþH®¯¯ßmÿÿÄDA”¦kA‚0Aˆ„kÄQ¡�æa21d¡C&¶˜N „˜«L1I¶“¡†¶•§ß׿ÿ×ÿ·)„DA‚ÂAˆP—a[©®lR§í'÷ÿóW˜ßÿÿ,àŒXB Ol0‘¡Îÿö—ÿ}ÿ_þZÀÃ}´›^¿ÿuõÿþÚV–ÿÞÚV¾—ÿö6+ÿä˜I´ƒà¯ý{0ª«ýŠbºÿÐ|ÉA�þŸÿÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿüƒG³¤@ÆPk"$_ÿN“°š„à\ ÍqÔBpÿÿ¢ñ̬»z.ݦƒÿÈyX/þš ºAÉäns½Üäÿç!“°ƒ4ÿk¤ß[¤ßv“kÿþ;uÿçv“ûé>èÃÒwÿíSAçØœ·fAqØëú¯ÿõ½?ÿÿMù\Õ©ÚL(&eàˆôïúÇ_êÔþÕééùßÊi¨gsWúm{öú_ÿÿîŸ÷÷ºõ;»þ–¿l^¿_ÿGç¨ù�¢a{ÿïï_ÌÊA*üU7È&¿þÕRÔìÌ…׿ýýÒoAØaÿ¯™‹ÿû×Ý^š÷äÆ8ï_ÝÞa ÿÿ¹•ÿÿëä`çjlÎ:š�¨5××ó´ù ë�:tùÎмé%ÿöº¾f'�–A0�Ñ 3Á?>p� ÄG‘ “dH eã†yÌ"œR@ÂæÙ¨‰3Ê%:Ä¡~©ÿmtÿo¿ÿÿzûÞ}‰ÐfÍNÉ�C +ì-!a®FÃQ«qg${aÜ„ÈA„ka �h‰0dlB\LƒÍ™6f¡�Ƥ¹’èÖZ¯ÿæ�µÊ�ô·›÷þE“æb3DDO’?ÿã³§é6.•´!z¼-&Ù3†pÒl!†O‚ % :A¹7ȰÒa¥¤ú5²"Fº5‡”Jjam(vi˜#dêÌ +b63èÃD&“" «&ÝgÖë§ÿöÿI·ÿ‡¦šwiÿë¯ûOÿ¾é4“mBt®Iû´»I[ŒiZN•²Î°©:Aõ‹ "#´ ''BÒØŠ Lôª�Œ(AÿcÖÛûý/ûUùæôosMë×ýüÓzÿºU´;xíÿôÓ¶¾*ŸZZZ^®©:W„¡àƒiZZè—RvOÓHaY9”å¡6ˆãÿþ×mv׺v÷ýúoo¶ÒÿzÒÛýü}Ý´’ýÐÜoÞã÷Ráþ·±V·iÝ¿W®›]úD¢®:V‚ ÿ®�°¶h­-´½nÂÿ·¯þßÿ·kÿÿ±_üö—i­h/­î‡öéÔŽ´·éíÕÅÿëþúá��ˆaŠØ¯öC¾Aôûûï£?Ký¯ßÿ×ö•¿Ñc7ü²Ÿ¨®>? w÷ã^¿]ïiý ߈ˆÐ°…¦ôá…_÷ãÿmÿþ–à ëÿÿûõ°×úÿ]‡_ßhºÖ?×õþˆ!ÿ+бþõÒÝ/ÿ§d+ä`ÿ‚,wûú)Ú»ÿ…×a¯ï¿ëë·¯ü±Ÿ�ïmÿö—‹BÓ¸aþ/ûÿýµÒÃÿ‚,~Ãöÿÿýwþëÿÿÿ²4Ré·üÉ(ÿKü#¿ÿ¿¦ü?ýú  Á¿ÿÿgÿ¶Šzÿÿÿè0qëÅú_ûm¥ÿ¶½a¿ÿÐ^“áïÿû ÿÕ¿ÿÿÿƒíÿþ•ÿíñL{·ÿzú^ÿõÕú_ÞߥÿÿÿÍNj½¿ÿªß¤Û×ÿÖsÿÛô¿]Ûýuý/_ºcÿµÿë¿¡ÿÿkúNgZþÞÿÓíúëç?ÿöïÿ~ëÿÿÿ·ý~žœr‘1ë{if=[?ôê�6=~Ùžýþ¿·ú][ê¿{µþßÿë9ÿ=úi¦Âv“L&ƒ¶ÐLRÛ¯Vêí‘r¬0”0N!Ù~àûI³5V“™ö·~ÚÿýÿýõÿÑñ¢¸ªZi…žÛþëÐ×÷m-(IZN‰E]¤­ŠºVâËGa$é‘Í&ÒÙ9“8M¡ �&þ—·¶“Úÿÿ¡îû_[ßN‡õÿ®»L'×ö”vÝ÷ý'JÒvšíŠ´•²Í�zo¦ÿÿ×þZMþøûÿ»O×¼uã·¡´6—ït–⪿¯µŠÿ ÄWïÕïÿýÿKÿÿå¤þ?¢?wêžÕ½wZÚŽ¿Cq´?øÿÕÎ=#ÿÿÿÿÿ®ÿ¥ÿë,ŸöÕ2Ãÿo¡ô[’ü±ÁUÿë}%÷¯ÿÿÿÿð_ÿÿ ÿÿ^ÃÿÓUñÿ'_ÿõ¿ÿÿÿ÷ÿøF�ÿÿ„aí×ÿ¯°÷ûÿ×ÒØuÿøÿ´¿ÿ×ÿÿ]/ÿ¿ð�m¥ÿ·^ýÑݤH¿ÿaùáÿûÿÿÿÿ_ú^¿ÿélB¿ý|7ÿiz ýðßÿþiÿ×ÿöëöõÿÒÿ÷ÿ^w ÿo½õ÷ô’ü/÷‡¼_þ›þëÿ÷_ÿÿõëûÿK Åxþ˜ÒûKÿ øþÉ¿®ÿÿ÷V»f~—§ëýÿú¶ÿÓ~Ý{/é~ÞÿÇ_Ý¿×ÿÙšYŽöIט_átŒïÛ>¿íd)Ù¢¿ßÈÏ×éÕvõÿÛû_¥ÿÿÐm&)BlU„Æ�« ÁZZé¶½¯"Ž!Œi7¯°Ïÿ·K½kÚþÞFuÒ×Ûö+ÿØR0�^R Rm&·Oh, ÓMŠM;XNÛiÓ`’v“¥m—©ì {gÑêÓîÏ÷îiýµÒöÒÿÿ+�²ª„Db"î� ž %Pœ6šÃ ‘ÂM7b�v“iâ¾G 6Cû‘iȼKtà Y{°ÒŠîÂ_ÿâ2äHR:£ãžØ†é1 жM4è0ÖÁ:  Å ÛIˆLBìUxb¶¿ÿW2+ŽÒ#Èôˆ¢¹´R®Èô ®A”’Ó ¯ÿ×ÎÁ1[ÖúÖ?ÿúÿÿ¶’_ÿ[I/ÿ Ã?ÿØÃÿøB?ÿÿÿÿÿÿÿÿÿÿÿÿ�Ƚ“ÿãÿñÿãÿ&Á`x4ùÚÚ2VÊUL(Sµl­FE´|4U24‰Ÿþ”,µË¡ÿ×)ÝL’ø¦·ù¦vaÔ�³«_õ\•þÕ¾zh ˜#Äi›$Däld�sfuÔÈÑäªÔ×'¯�“D!iID:ÓÓFÀðƒÖFpf™ƒÝŽz!(B6ÈfH(E Œœäk%$‹íD¾´øD‡*Ú)Ë83�&á›$ƒi:j–�oÂ74Ó6ÂhÐÕFØ@Â.!0‚Yð”Á’'FÈŠq�HêYZ{§ÝÄ65 ´®m&Òu–“ì´(a Qá¤ìš ‘ŽÐL>7GèFÆšaÁá�„kž#4O˜O½:ÿ¿ëí­¯º_úòP±m-¤µà�´­–‚|A(i6ÚMÈí„i7ÒaSØFÝSwÿÚýãÞ›¯Òÿº×Öñ¦ÒßzWK…i<“i?* á«_ÿý¾´C�õÇzëô7k¯Ž÷Rð]ÛôÕ6�/mm/®�*ÿÿÿòÅ÷þ¸ÿ,r->>°ûÐûé=Ôk�GKkÿûiúû¤?üºÃßõ–9ËŒþ½}ûÿýëÿÿý_ÿ_oÒû¤‡_—RÒÿÿö—ÿÿù›#¿ÁÿþÃÿmWÿÿ×ÿÿ±_ÿÿè'ý'ÿòðßþŽïÿÿâÿÿüî ÿûýRëÐ_ßá'ðoý¿Kÿÿÿzÿ…ëÿ¯KïKÿô¿¿I¾ÿÿå»þÒß뮾íêÝk¾«íþ—Ûÿÿ_ÿý_á’Ù0ý+ûéÕ~õÿÿ_5'齊†ÝýýÞßøäLi«vºí[>­+JÓ¶óþ¾Ù:ý{m}~Ÿoß÷·ü#°•;¶ >d}MŽÒn¤AÞÞœAí˜Û»îöÏÍ¥tÙ§¾Ù:þý»Ûý`Ò>FŠ·<ÛU¨'a…)ØH6L'6E{l”.)ŠMU†Ü‰Á„®´˜`•—¶›˜g½X~Ùý¾ÿD;u¢ØŒ8ŒÛ[ƒ˜&ðÃL'„ÖÂaZwNÂb‘Üx$Ä(„ÖÅ1KlzöV··ênH¯•Àó"hë�b0šƒ0�i†(&›ƒ‚všh6~‰²š +zÊ8 ÂGÖ�oþ—–P™9úÒ =´µêÈuV’ð`‚bÝFVt¢,0AC£ÿË\—‚’Fw­U +d­•">TSü©5ïï!H®"*qXã¿é:Nƒ +ïKïN¢£þ’¯;kúwþºæWé(û¿$õý~ŒŠÿÞZõÃcÌ �"!2`d1šàžm�KÿòUçn»#´ÓFÇé„]†i'!2a‘ž`RxÀÌò„ ¤Áh‰a”R2NO×O´Ug�&Ùg ãA6äÏG¶‚ 0©¦©Éy>ÅÁŸ4ä&ÍC95f€e<f™�œ"ˆÁBöP2IËÔ“ó™¯#˯~·JøM¥h”_KTÏ4Ãì±…ðnìœÉÑ6…�ÚN“hXAª6+'© 3H Â.ä0Ðx°�…„GÑ “dC©¢' †/o§UýwkÝo«„ß¾wiÒmt©:M¢Xç#†Ë8M$áQá œ2|«±ÚX~ „l ÎMpš5»}~G ÿîíÿ¿ô©ÓÖ+ÓÜmÞ’ñtŸpÕ†Ò¶YÙãI´6LäpÐMû_Y#ý*éÕÿ^ÿÐÜ{‹é÷ï_oßKÒýÒ´J-A6­Ûëè–3ü³ÿýÿåŽE¥»I¯ï~¶´»~�K„é×q÷[ö¿ÿÿÿ÷ÿÿãðrÓÿH]î¿_ãk®=„w×ÿÿ¯þÿ×þ—°Òÿöéï_Qý’?¢Ç}×ÿÿÿÿÿÿþ›ÿÿ_ýúúþ‡ÿ•ÿßÿÿÿÿ÷á»ÿûÁþšÿÿþ¶*+ÿÿûÿ¯ÿÿðoÿ÷H Ÿý´wÿÿÿý¯oÿÿÿ_ÿÿ÷ÿÿÒÿý´¾ÿÿûÿþßûõÿÿ·îßÿ°×ÿm/ÿûÿôþÙšý¿ÿý}í/ÿÏ'ÿëÒ_¾)Šÿÿýý*l0¶^Õ†n[/ÞÃ>»ú¾úµöÉ×®ßúúþû×·ûÿݧM6)ˆA4بlRvÆ«ÚM‘Ýåí+´Óa‚]¶•Ÿ¿êÞ×ïßïûïî#+< SÆÃ :P˜a&˜NÁ&!lBA¤ÆšlRktÅ'­¥—ª ¹^Ý×íŸÿl͹:–Òš JBV šžÉjJÔîì0“NF8A„šwa&)Ú¤ÓczM6)‘r› *v_]† De¯r’Gº+Š;�•P�<2P:¦¤íŠMŠA¦ÅrÜcÈ4 a"±“Á‚:l.à êZï¯úy8Nø‚uÿËt€ÁôvPEe¢& ¡tÂ,à€ƒ8dùo +ÉΨ¯a‚ "}Ó+èˆ* ëI·„-ð±DY4eHÌÌíG­¤­ÒKª$�uÂ0ì#Ð2­“ÜD^Ò-}|Í�W �' �GŽ¿t’¬iR¯Õ¤š´¿©«'HˆÓí$†•qªñÆ”Fh&�d|NlÎ8Â<“¤’šD2(Fp"œηª–æ™KõV¿ê©5éªMúK¨F†44 "ñ›93ù@Ìã�òŒôPt!繆¨³ÊÞ«Õ +ýRG°�ú(t¡+IŠªT›Tg`Ë|i0ôôÂ5µÒÓ°FpÔ ac»aÃ6ó4ŒÙ¶2¸2×ÿñ ©'ARIhï_¥PŽ<%„w ¿t�<(E?JÔ*ê'ÑÞ Ë:m Ø2ÝUP�l#Xf†x‚!<ÐJf9ÎB.3<¡'d‚!GþXô—½t´†´�,t´´ª—K¹P�-ôw¥¢žŽ='¤¬#�Òp‚ñG®•¤ÃÃêƒ`Ù>Ä6OÉù dL5†i˜3® †&tzŸÇ¥†)iét©-*دPÌõÒÒê’Ò餅PN—Ij¤R8éô´›weœ3†ÙiËæîÉк&Ф÷ú¤½%I%Jë¥Æ?ÒZHzXpÆ­aŠëŽ©- +¤ª–•%íûÓá½Ú¤­©<¹ßÿõ­h ’ú¤”.¯HzÒ@©zI*õ®¸ýF+¥ÿOþïú]:ã[ÿZ­BH$S½*ÂT’™æ6ÒJ—ÒI,k[Uô’ªHaRJßï÷þ¤p¸½ÿõIÒ_ˆ$Oë„úáõ„#~•Ö’Ijºª_þÿïÿîÕÿúí-R“I¡U[j *JƒKC_Òð‚_ZÂ_ÿßÿúC\?ÿ¥ ¨"�t‚[ÒJXʨ·�iPª=5¥ú"i%¨ ·ÿûÿûaÿõÐP• Ÿ:¯Ò÷®¸T“þ’IKÖ—¬Aÿþÿÿ°ÿýeû%1¥ ˆè�%v´mWÖÞ’¥õýýSêZé?ÿÿÿ÷†ÿÿI]%¥æi5W×4T¦OúZK¥ª_ú§_¯ÿ_ÿÿ‡ÿê©Z„¢©´�¤­´”%¶«ª„Ž®›3UU™ú_™õÕY:ÍZ M¯ÿõÿKþü7ÿÖàâ%�B[¬T;KŠÒ .´µëK¥/¨I°•ª„©,$–g·_õÿÿþÿü# ªi„¡4 aSUi6í&ÂIzÚIIiEi:Z­u¶–ºúßõþßG7ÿâ"ØØ" ˆF¸¾m‘ÇTÁp©†“LS„ÂtÅv”U1VˆR-†•„›I¾úÿ[_oÿ×éÄE”S ˆ‹X„C-8L$Â&î˜U¡SÄ*… b›«S»/é6›eí+¾ìýÛi[Ÿé6Yƒ0˜M4, ØA0{ %"Æ* ‹Ob¯]ßßrÒmB…š„•™+A0ÂA§ $lÿq{ð„DA„�™VÃ=Úk?~ZÀ�¿]´¸`ÒàÈÚzâ¸p±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™†Hjd 8òÜ, ªYj@j–e@j RÓ Pj–¸XƒT¶ÆÀÔ–*0f�P Ñÿå¹52 +�‘®&0RFuȯbÓ !‘²"Ì–Q�•vOŸ¼±Õy¬C±c%™|ÌÊx«"VŠ’íùç žaqT¡Ù0àÒ  „}‘¡’ ؆µJ«ªö«JÛh%'Ÿ#$khøt·¢N= +�_T—éSôØK +Z«q81ìÓ'3¢S¢ýzÒÇé.½×ÛrÕ%ð˜@‹�&˜$\Õ"qIƦٜqš2ƒ!ÅêÍ¿¦ú¡K¥´ºFÒÕ'Z u£CϤÓMB3†At‚�šæyœg³$29®‘óJ�ê1z]kxóM|#½*Ãé/ÂXI½v®OK ~&ꪡ×AÞ•^z/¥©®/þ½jâúUázUõ¥ZNÇzXIÒ×JÂ8õÔ(Gz +½$›Å^’ êÑôT´«úëãUŠÒZ¤ª¢ƒÇ¡T….’^ºãÂ<\jºº¤ÚE#íPZU¨Iô¿ÿZKýjµ¥UK]iW¥cJ65¤µ¤¾´úÝzP’_ýW¯Jꪕz„–«UUUÿú¤«é+P�ý%„•HäëI¿ë^µiuª¥ ©t«Jº×T½U}/¡moôQïô·VëúT®•tµè£éuKT´©kJº×UKn�R×é$—Û¦ÕtºÕ Ukèzªþ¿éWZTªkñ_"ŽÔUkI†¡‡Uý%#Ê4]Q�ãËùt—®µ@Š~¥Ò_Ó^µÿÓ«Z†Púªô±¡_J©uzéa W³Ýžé-Hò…ÏøGqåô´”¿—ÒªÂ8òéKªÒÿèF½%õ¯ö‚´ ;ªµm+ eú¨…›J)¥½iik—ð‚‡A}~Ÿ]RzÒ¥K¨BAûUA8¦*­.(¨U{¥uPâ’êž æ’ý%Y»Ëéô’õ™*1†!a0ƒ ˜a0UtûU¤ØAU}U]:P¿Ý{ûA^‚éR¥ê �¸¹† ˜T#M4ÕZ^’´ÚZk +±Ò zÔøèÈ/„_¬#C6º ¡$õÕÀ¤Šá$]# J³µL«ÞêÒ @„W¶–“#]Yµ3X»JÃJ(DSàÄaÒˆ�ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþMC$ÈÃv d +@ÔÕ�2‚ír`»p¹ÀÜ×ɵ@$ ŸùÃPÜ@endstream +endobj +221 0 obj +<< /Filter /FlateDecode /Length 4517 >> +stream +H‰ŒW[oÛÊ~ׯà[ âÙûåÑi4ÒžÚê)’¢ )Zb"‹97}Èoïì’;»¤(Ö@2¹x93;óÍ7ßþ±2"ÚR©d¶&9³ÂpÂ3’SF#:ã"—Ò*EmfHÎ¥²V¨LsÃsC8WYù¸úåÃ#ÉÞ5«¿¯þX%ç×Ñ x6TpN�Å-µðŸ”©\Sm55™J¸3Îñà’—VæÖZÂ�v.9—„k.‰äŠšQ yY#LfLN¥–œjpH œUŒ268dÁ¡†¸Ö2&|ŽLÁE¤u•&„òŒÚœZk(7.]©©`J€G!s&˜–ŒyðÈrá„sH(!RÊŒæÜr­àBÜZW:B˜É¤Q9¥Ö%œi¢xÙJ.ÅàR—àÇd»•�*·R +fi¶¦¹´B­2– % ÔÙù€Š3Ë\ZæÊD©Ì4%<ÖJ 1{ײwíz¡²Ô¶»Íêlõv³úeCÿM2šmVþ&àtSf$Û<ƒÉ6§ îþ7ãÙ¦Í,\[Âü�IW,*-ÄÖVä +ê”mWW‹]•½Þ|qWb’;‡ à>ÜlWW¿¶MY�Nõq÷¦?å@¥ÙpàÓÕoõ¶j²×’]mªö±>‡ý׿/«˜¢Î…»�÷X·ÑÍ ãª>vU’>…��̦*÷ÇæÐìêêä�¹‚о Þ�Â+k@·Ì˜„‚~Ã¥„Ò€)¸ô§«ÝÜܾ¿þÓMöz-4×Wo>þíöw÷/)øÕŸ¯oßýóúö&^Ã0_iè¥ÉÖk|Bw¿ßmn>Æë@4®sýîÝíÍÝ݇w×›ëp'H…c&gD ÇÞþã.)‡ÈYŸ?s¿¨‘ÒxFÈu¬óÇ)'a”»ª¦¹un—Oƒ_.Øì¡iñ¨ÑàŽ +�ø‰;êÇÀ“²áÉÿ»ž°¾'�"3–»Á‡8�ö½¸z_ïžÚ�êÛŸ†Q‚ÞÁyEØä<Ç ÕÝåx<'"à|sÆÖ­2[´}Œá¢ÜÑçð™%ë—¤€QvJ09‡ý“Úi H¸ e½­vmµ\¼!¿5UàŽ;Æg܆”ðMøžŠ,µ£dENpüŸ÷U[¡,œ»mí(ažÃ–é¿¢ò-“|™Í¢™3VÄNû,/—g�†ƒµ?|Xc‚ÄW­[Np›\ÕörËÖTC«ü¶d°½óãeç úâ!LA.d–ÚI‡ 7Ø]q{ Âçߊò+¬»%TK°vÚ×Ýåž³œòг¶ÚÕŽ9°”¾ìƒJ/ŒéKoBËî," +oê4Ð0•Є]¼c^à¡�¨ÅYQ©GD´£Pk¿oh +þ´Lø@hGáÔ; ö¶n�ŒyˆÊ½²Eë¾vª ]|õáfÉÏR;B=4K8¦)ÏÒ‰�05£a‰„•…ß!/Xš!åÄ ? U€²ëhÖ÷?Ö`S¼b¸LK{hʯ—/œ`†9�9Dl›� ¡„ž�õìíd<Šp âj´=ÈP>œ6&²ÔŽÚû™„¤»ú± +Xp×O­Ï�ãRØ$PµYjC)�Ø äþP·',½òEGë“¶‚ã´u/éÎD;­v¬H¬öyÖóÕ.ëÝ3¢Ž‡¢� L¼tÙqRE´£šº¥@• Þªò©«¿W—i9†¼:•ˆæyø q$”8”àPç'e=~M§û„Y� ´}„¡ÈVWX“mÝuÕr^Q=Ðð<(šÅHØ«Â]ª¤9s2eè‹11Æ¡þ^oŸŠÃå�±N ¸j<å»õs]ª—�½€åh¦K%L÷üí”î™>›!î±íDXE¡øØœ^Pì©Þë‡àÔ-&‡×’*ð|äÊMàıŒÚ_Ñ?1ññ2hÆ09Ÿ¯>Þ½ýüúE¢{�`¢ºµ^1º�•½ìFX~©†©Šr¾qÒ5±^p•Qm¦T3éæ¡6Yé§ÐåPf– æèA5åS@{&-?`ÏÿÑŽrIØëû¥á<Œ4«¢!prAq.Ïðð*°,¡öõbÒ8ŸÐaÁRþ|®·ñaà¥&Ú‰êðbzNkχ!Ü¿©H@~óÔ}{ꃡHŒZå[ÓâdJš¥v’ E­~(ºr�âK{Ù…vT‘TZ\_ž’Û(¢Û¦,÷§¦ þ¥÷Œ6w$¢±è…R?@ÑHÔ5(½¿p0æ¥;�<»µlʨ¹"ûÓh§Ë$ ¾këÝ.Î׌ðã}{G’É÷5±É$MdØÇ§CW«æ CH¯ÛÐŽ2“¹š{¸0êQ‰v<ö uhÀ>ÕÆr8G�^°ƒçÊlín »yÂRØ;âÑí”;åÌSÅ˦Áøç¥Í;'Ã;Ä¥ +L¢ Ä“¾•×Üh'Ó�Ã;åÓå¡Çé=5—‘€‰ߢ»<))|‘ÿ’šÍÎ:FQ<`äXý!âwM´“ +ÄWnÜÜ3D”hx 9ÀœšO‡—…Š¥ËÓ“~´ ' =„Æ\Ö‚£=—Èe–8ªÇæùeïÓ ãbü?øLØbA"Í SÞ)ZP"%LeFŦ çd´±˜öï%´žáˆ¥3:·@↞Žñîîæ-±ÄÇ uûe=!�ŸB~ª(¼3|ÊÁÒÚæ Q¦¯…÷õî©�i�UhM5ˆMø+‡úQ™RA4-˜…Ñ@8¹)_"d¦Ê•ZØšÔüØ×¶.vmñˆpV˜ @‡„5çÕ=`Z]M."lftu.¹Ig·¬Ûò©îÚ—‹Ô0W_žN ½œIo[�ʶ¾¯°¡3¼ŸPØ^,c�¸i+‚DÆ9q¹¯«ï8 Ì3Ú‰Þ‹´k�*…R·:-OÙ0+°¹¢`«Z˜°ÇâXVo�òü£…o%H›À+Ϙ5õJm¢¾YHé[ý­:ÔðˆòÀ‹ ´£¦¬©Ê�a) +#¾7}y¨Žç®y}]F c•¥ÍÄ"a+¹QïFjt OážtÆ%º ø•ÿ›î8©dæwÕ¦Þ×H-¦:ˆ¬žúßJ=3È<¤&3¿>ð[� Ûõƒà*m^„.²ËOç¦y™H•_SχPÇ]dZ�hÈæÙâë¢<�ÚãßðŸ¾ÂkñEí………ƒ‰ÈAì8Œ@PX\†XM2hrÎk|l_íJ#„–/ÔJγ1 ±ýŽ|ÛÆé^Ø;ƈÜO¾Há°¼JºúŸjÒZöxš&�§ÚW‹/U:âw÷õz€ü‘$‘sÆò ÕÞWûcó³€[iŽ4H‹°{Ôÿ|)4Ÿ#æ0çRú¾‹2Cë¾ûÞ6}_ÂL}¡’Ax‹ñLî^`&ïÑ"ÈbH­}¡‘l_ÌͶh~�¸N礃0òbåv[5U[öΓ}ñvZx˜*­Ïœ4+d§£Ÿ�›Ð)‹°;}z¨MÑûƈ¢ZÒì�´Ò�À´˜¾K%/Èwl›út +¹ˆ5ŸoæÌô¨7�$š·`‹f„“�N l©•3Ðõ3³*¾ƒU¤aßV�uwjÊ—èþ@)ã³>ëpgð§”kæ÷º[ÉrwòqÞM)UŒ�dÍT4wr­¥SžbÒÀ„ð7F¼Â!Mû˜÷`ÌMßã=jtê‰V‹SÙ–ûª¯Úî}¼`SXÜ.èÄ™k1ç¶š TÐ%r(Ûçò°«bQ ‘þÖ€ˆÛ6!ÈRdÜ•4ç|šÔÕÛ¿¢ÎÁíͧ¡«Ð²9¸ËŒ…� ºê :É�¯q¨É)'Ñþ/éƒYQád"Š‘ú“;óŽÆ^ß„/ ²c¥$ B>bÔO²Û#3 ˆ¾ßÊí_S+‘úe®=žwÏ“nK©§ü§‚ÉÌ]?;ÅÀBf®¢~Š…È܉€s²Î.dȰào»{÷Ó†ýÉ.€;OÎÜ¡åBó•ÃJ+/X‘º„«çð» +š¯_®¯¯îjÅP°k©ËìnuJ„d®ËÁI|[™·…³|L˜g5îE°Ã䙀Yá<ß§„ææ ^Ús +>8-Š”E§²™ÆIª. “Ì8ò�ç÷¿ßo®ns|±º¼¼»º¿__®6«À£˜¦�:rg_îI—XÆœI`{>$ƆÙ¢á £2x!q˜ûÝ$~€.D’3 *ŠÓúñöæfõùÒ{Ía£MA«: _%R,î7« †Œ)Aîfž›xÁ�CIÁ|ƒÃ/_¿‡qê£ß]ý¼†Bš¦C6ÏíÁ^sµy÷ï»×1endstream +endobj +222 0 obj +<< /BaseFont /Times-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +223 0 obj +<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +224 0 obj +<< /BaseFont /Times-BoldItalic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +225 0 obj +<< /BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +226 0 obj +<< /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +227 0 obj +<< /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +228 0 obj +<< /BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +229 0 obj +<< /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +230 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 36 /Subtype /Image /Width 88 /Length 752 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ $XÿÄB!1AaQq"‘¡Á2Bb±Ñ’ÿÚ?õJ–ÕfRª ‰àÄ¢”e02˜õ=z@±6¹‘Ó¥ÕµƒB¨,°FG™æq¦]'"\7†žAèG×ù¡eVÆ[) †&ö-ëNúÉÛäERJ2c­ºšèتaåm$`˜^mUt'Z¢ª˜‰ínÕ#õrdw™nfX=£Þ°û 7n°R¤Á¿õéT×·Ê ÊÛ!í4š÷3`°qš‘ã=ÏJeû +gâEÙGJ˜4�ö[¬¯Á˜’AŒbð Åꉷ%=2ìHŸÖ°ÚdŒHŽàþ´ºv�ň²•V[_ä&ô¾}ž$b ³(“‚ž=êžu¸BžÔƒ‰� Þþs­”ˆU�"å‹^{cL>¶ ÙA-k–'€@äÿcNHîmíéJ4j´1bëÀ5†�bàOSÉæ‡‡I8›°ù†·¬ÁŠq­,`Ø@¹ïþé|­ñ&8’Où=éµé×¦ÚÆ6“Àâ€Ñ¨(\l±IãÜÑñ븎DGjdäVüLž—¨3lVP|˜�Ì`AÀ´ÔÆæv)°5ÁCÐ?n8Çàf©¨ìf%ü‹\HR1ÛÖŸF~" rÂD¸‰=�©ª¿‘Ù•ÀdLÈžAi Ö‰]Å’îïü¯TÒQ²ÈžoÌÇ¥ë Õ,ɶQÏz:ÆÜ”ìƒ=¯i¿¥ožm|‰ÐX_ò¤_(U%vGÈÊê+¦”",<°4Õ«V­F…ÿÙendstream +endobj +231 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 168 /Subtype /Image /Width 72 /Length 2033 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ¨HÿÄL!1AQaq�‘"2ðB¡±ÁÑRá’ñbr¢ÒÿÚ?ú¦´ +(¢ƒKJš[¯Y¡uýä ee‡¬l�Œ+ò!x:ª�ºöú…»ë|Ù>lð[h&ÉŽ²ÇÔ³8FJƒ·n·ýM>gÊÍm r‚E¼«\¬R I$~¥,O¼àHòµeÕä|{ À,³i7eXÔsÖ³Èç~ë Æí/xÖ-â+£äÈ\�Œ€õ=Zèüë�>¡Xd8Ún¦r#rú˜i 6\q¯Açi�k‘1eVF ÄL·“͌֘q¾,Œ"A$ÏycúÖ�BR'°³ãʧ +º"ÆIï&mSÖá|ª6\†VþÒЬLNœ;ÌPz€ô´“·‡Õ©âÉò©0D ëcÄ~A“ cµ®@´mu°žÑõ5®.¡wdÉ ìi%K$û­ð®œ9—2îP@“îR§É€5Îî�Õ¡†•GYÚÛ}e»vý¿ËÀͧü€2d;^Á>Æ3êch×…OGŸáépWŸ�T�� �@­³d\.£6à}ªZ#ÕË�}íQÕ"äÛ¹X $ˆa§§kÛñŽ�mõ}~&µ¢Š(ÒŠ(šUŽ^³C¸$ö/3ÈV¿"�3jÉú¬{®D•dƒ´ÿºãó«ù€N°,)7P‚;xªl¨¢gÊôŽt ºmCfDY&?­©ãq’â|A�f1®E8Øj!ˆ•×[‹Šæf\,‡ÈÒY„.ífZû�ïÂxVÛöÆ7¢4ÔÇëYdÉ�‰tÈ¢ßuˆASqÇ‘šP~\¶W µÅÙ6›sjÑwgl�´ÛÑ êøØ.¦'ÜÌT¯ÂƒÄÄ«¼Ébûåر$Ø +¼Øp ›Ufܧh>¸7àf9^žl!‹™¬@,G$kãMy×IDr ‘¡"¡±´–miJœ]8RYÂ’LÙvýiZ…^ySeWÔßI”6¢ií¨Ú""Ô@ˆŠÀu óì µˆ3üvëð®€A©¬Lc•ÖbDò¦]A‚DÓš�à$P\4ä Mq²ƒÕ"Ŷd>_ýjpdgÄÛŒÎ\‹~Jîª8r¶«L½7¨²éíU Q°ìe,‹!‹ÇsNâ ÿ–‡ž¦›t£ª’ícîXVSÎIº»–¶•Ë“¢Ä7:ã¢mbÌëø�T¸ÆEõ8È:‰±›kƳl‰¸¤e_îñ0?×¶º?ÆÄvÛ‰ƒÄLLy +ãã!�ƒ!‰i4'O�Â�$“Þu¦¸Q �ø“RÝ.'`åA#Cåû +ÒÚTcÀ˜L¨á2cÆ�ññh‘$Ówº;øÖe3�bèñúýk¢�¥E¦“:­ÉŽuBŠåÊÑ÷z”1�cÛçTärÙS‘*æd�c*émwUaÜ™Ýw €ºwu¹É5Õ»¨P»®ÂHå ÏÈ5«‚DÜo/äÊé3ò, ‘¸¶ùI 3$vRêñ©Á“êÚ ™ê²³u­3ó¦ HVÆí ™[ŸÜJµP26-FÑÇùnà4Ó_Ú©º@ÇÞàL�¾:ùU¾Ä",$[Œ +§ÛäÌ’oÎ?aW‘A¥qmbʼn&5ŽÝõzdÊ3d}¾­dqñªÉÓ&EÚf$›7í…pç@�F19\l²™¥Ùõmaö™“^‚bU3Äñ5tT|ŠX¬ÜUÑHÓ QX6l»÷X”Ìñî¬�²¾M¨ÑhÖËÆüùTË.rv‚v�vÛ¶/¯ÜjsfleJä.r}1!Y¤zgíçTÇ3» å z`)Üfò°O#nu'.wRªI&à©Pv“é÷.¿Ðèo“‰:•õ vT̊ͼ�ÑÒB^ä{|d÷r£¥Èr3Ò°ú�`ÆGЮ‡F>ÓŠtùW9È]vžLè¿vîÎUž\Y1;gÜ6…oHSºàqÿã\�>Q´2äÆ\‹¢Î ûCn:ywU�ò7ÈØñ0Ð0–`-¸Üq˜ìﮓ‰ú„Ü 2„‚Ûm¬zor;µ­_ºFûîHà§v•cì°�lbÞSKŒÌÄN GÖ•µ�NƒjD�§Jk“§Ë“#1$B–Æ}%…®yS²©RàCE€2$�©ïå]M ­raê²eA’FPÁ—ˆ"t0xˆ·•BuYß m7ô°v?*×Q“1hÄ à§—tå³lkDÈ ˜#A¡ ÷T«#NÍ¢¬0â k> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  ÈÿÄE!1AQaq�"‘¡ðÁ2±BR¢ÿÚ?õ%Ø­$bÆø¤»µ¶Lv"¨ºÚâõ'g¸,f„ÞŽH[õûSü‹Ü}i~mq<„³jlФ‹Û­F¿�ŽrÂbDý�XÚ„�[7ÅHù˜�IMÅ…w¦õä¾6ê ÅÅ[:®HÏñ~IÝù9G±¢F*®Ñ£ïá[jß«tðuhìf„߯a!X ?®ÔȦ ðó¦v !K 7oY�¼˜ ‚²gïûQ«lÒTÜàhoA~µ«º¦LT¦äØ +‚{™®fùœ÷kØ*I x¨[ø‚k¶ŠâÙñõ…]dJ˜H ÞxÃXˆŸLt­¸kg€@hµøãÖ‘t6^$Ë ‹XÍCÛjÁË ^=+/†T¾ÀÙäÀNc“âº?¯©Ø˜œZLbÖÅI’üXLÄã?Ç^þUÐP[µK “nõÆÏÇfÒÌ@’Aì×>“3Lê%Â00U—”ûÔÞ'¬fk¯_öÚnc×5W›K{§��¤ýk‡Xäß!˜Øö"À)Ô€7•£Î·eÑ¢îå˜+þ[8ÿ°&-Ò­AS{µÊÚ@µïÓÈŸZ­dC.ȑĀDû`œ˜‰ŽµCV¨Ô U&´×ü@ý«�вîk7 ¶åQXXIúRãv %–¤[x½S„bÅIbc±YY+›gö¬þFíG~¢$> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ( ÿÄJ!1AQaq�"ð‘Ñ2¡±b’ÁBr‚Â#3ÿÚ?ô÷RË¥ÁÒzѵ��+u¾½<*±dÅ“.ÐsºIÝê +@�hPuÖi°Œ¨§Òoa1»û¯õª»dÜ­¸’jk� ,ÂÌE¦àcÀõ¥l93ª¦UR +�ü¤ˆ0/kž5mÙ'íИ¿Ö§Ùá| †ãÎ#ð§ÉŠx’<ÄnˆýƦØr3“`amo·éSNÓ&,£"í¸PG »ï­DÌþz\ME•œ³*‚hîD�éƒÓ+dÏ·" €ÑÅOyS&ÛÉ`§XmÞ­§�Gç[(šà3]š(¢»K1]áEQDÑEE»\.ûÛ–æ@'çV kX׿]™BÆ \:ÛÎ+¸»åÈå +°  ™N¶Im)›»\`3©PL ’Á€N¤ýb“r¯™Ô;d�ÀýÃçòdîÙÈÿST°&8E�ìoùÕC2!/x“éå¸û�ä�ÂEï¼yŠu¹Êí6¼˜ƒ?GO ;¿ù$ 3¤È×ME/¾B PX•�c€üjèÛÀnb³žô™ÙŒ´0E®D›óÕL™¶ô±,@€&4dVg$!*C-Á¼„úî–;�İ éIû´¿�º¾t@ddg’ 0ÈÅÈýDxÕ19�¾ÙôÀÝWNz;s9Ã\qR±êcÄ~ª~æè5û”Ø¡‡…föŽÐ­Œ±UAÙÏ]+rÌVL*Päb¨˜±æzu«{ŒÂBº ØÇ:C‹ßÊ®ÊÃÛ ‚b ÚËþt¿ù˜å7I,lw ¶óãå…í‡A'åË ªX™ü+a“1�‡iQ +NÝgvâ éhùðЮÅgaÓù„ý)2ûÌUÜ@ü|:f¸n+>>Ì +]ÙDB±Òñ'ÌšÓ4QEQEQEv¹ED×ÿÙendstream +endobj +234 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 832 /Subtype /Image /Width 6 /Length 633 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ@"ÿÄ^2B1q�rAQÿÚ ?ô‰Wð¯àD%ßÀJ¿€ Wð¯àUü«ø,«é°J¿€ Wð¯à•*þ WðoàP“&þ$ßÀI¿€ 7ðoà! 7ðoàMü‹À$_P‘}@$Þoà“&þ«øUüUü«©°»©°²î¦Àõ¦Á/^ õ KÖ€õ KÖ›KÖ�/ZKר²õêKרKÖ€õ Kר /^¡/^ ñ zõ—ˆKÄ^!/T—ˆ²ñ x„¼@%b±ÜV;„¬wec¸JÇpRN;„œwYî1ÜA}ñú|w÷ׯÐ{ãôûcõ@öÇꀇ¶?T\~¨ +¾¸ýP=qú ¡é�ÕÓª¾˜ï@ïüÞ€/oæâÖŸ J…@NßÍÿópÓè3íÛóüýÌŠþ�Æeb&Ÿµ éß§nÿðAÿÙendstream +endobj +235 0 obj +<< /BitsPerComponent 1 /DecodeParms << /Columns 1904 /K -1 >> /Filter /CCITTFaxDecode /Height 2944 /ImageMask true /Subtype /Image /Width 1904 /Length 40283 >> +stream +å¨&¤Þ™^¶v)ÆA97Á™` ¥hÎËPR¦rÞ†w™üú4:+#<Ë÷©8<ì Ï üÒ7•Ç%mâ5ìˆ9¼†ï؄ȶöUÍd¯îA·"jl>ý݇N×¥»_·W_ív¶A…×CûŠ¥¿�ÛÔzÇûQÇùÚ‹ÈKÇVt2C*·”"Èfuc’ ‹Æ‘ާ“™20ΡüÍf™­„ œˆhÛÉtq�Q²:(#©š‘ d�Ü¡Â!Œ `ƒó<Á‚A„@Éò|ÀÁÚJÂaÐer32ˆž x@ÂO Â&?ÓMMì&šxE¸hÎCM0�á‚.˜ÓÐÂ>>…„Áíä^.ߦš5†�l"í£cFƨZ5‘Iõ»„]†¸<"ì44FäHj´kxEä"âÚ?A QÜ• à‚ „ƒr#°ƒ0A Þ ¤Å ÕøDpE¶“aé7á &ÂN“k¤áB#Æ­]¤é6·¤ØP�0¬">…ýÒp�6“ê ¡wJ×[K‚p‚m+ÒµiRµú ¦Òö’¾‘Õ´´­C¨ªV»®ºZMéhŽ+O÷^¢–ºýIBzõä¡ki5Vî­êßêª?­-};Wi[WUÆÝÝ'÷KU_Tݧ÷iÒû« =v¸îß‘Âc¡¨ï]}~ù$>ï×èyK¼cƒ‡¿í¥ü{|S‹¾ï�Áо¼S¿ë¿_¾·­þ»ÿôE5ÚH‚L8?ÿô´CÏè‡Gÿ׆¿òp ÿÇäôÿïïý ?úü’²c;òUÃý½ÿä´ü•ÿØaþ?ýÿÿý{uü#ÿÿÛoý(¯ÿÿ_ôgá°“ÿÿ×ÿÿÿí¯mÿ n¿ûÃmþõ]ÿÿÿáî_ÿÿßÿßÿ½y?øKl%ÿø98ÿm'ÿÿÿý/!’×ßÿïößý×{‚(rƒ¸ú[#tßÚNáßýÿmý¿ÿ×Ý/ÿÿïÿý×t”G·ÿú/OýÛ‡þˆÄÖßÚ_ÿúù½Ì=}¿ÿÛöÛÿëº]²ÿ×Výé¶Ìó«ð¡÷ÙšzÛ3_úýíÕÜ÷þí³ß¶zlò×ÛÕød³Ý×Óì'eöÏi¦ÚVØJöýy ~­°V¶–ÃU´ÖÖD÷ñJ¬v©¦¬k±Lvš¦Ú [AHc˜b­*§§ Á2â½´ƒ!üV–’i¦ÝºlBb›H Ø„ši¦˜M6@ƒƒ.Gpœ6&š¦›A„˜A°MÓ°Ä(aŠm6AªvÕ[H4à „Ä&!_m‡¬2v0Aˆ,0¦‡xÀ._4�0ƒ'?“ÞƒµAÆãOÖÉ 4ÿù×z„O˜põônn¨ý$s×_ÿ¿Ïµ¿ûçzo@›¢{¯I»¤›ÿþÕ4¡ÿÿ÷^›ßKëmU¿µý~ÿûþýÒýÞ©ÿÿôg«ÿùÝÿÁê›ý/Æ×ÿí#õt?ÿôµWý/·Jþ�Aÿ�õúÿþÿëý/»¦ÿt’ÿõW¯ÿ¿ÿ×ékì«ßÿûiu|‚l+ÿ¾A¾ÿŽ? ЦEÓ �´¿ÿÿ4ÿÛýÒuý–ïÃx0ùª¿ÿéjý͵¯ýùÁÿþzkó³Sh—ºÿÿo®ó¯_þÿþ¿m[ðûÚ_ÿñÿÿßõÿþŸÛ§ýÿÿJÖÿç`c'$/ï÷Ûíw«òKÿÿÿíüôoÿAß±û×íÿåþ¿ÿëÚÿFç=þÿÕ¯ï÷ÿûÿÅVî¿Òoÿ÷ýÛKöýÒíÿ÷êá¯ôŸÿ]­´¿¿a¥¶— ùÿµÃ ,ƒìëÿýä0±_¿±[ýïTìˆÔÿÝé Âwvý„!„"">vcúÿò¹[Ä|ëÿÿþÿÿÿñ_ÿÿëÿÿüÕÿÿ_ÿÿ²Gÿÿý×ÿÿýý¯ÿý´·KüÈsó°Â”!h¡“‚~ÒáþJ3‘Fl0lð!˜!�Õý¥þ¾»½kOÿÿÛÿúºÿë÷ýõn¿êúý_ï_ÿïþ¿ÿý¥¯Óþ¾úý÷Kõÿ¿�~iH¿ ‚ß×�|·õÅE|kq_ÿO‚ +ûÿWÿßþ—ûÿ_î—÷ÿÿ¿š¼Õ~p¿½sUoïž�¯™š�ÿUç¦p_ÿoêsºOÿõëýýÿô.¿þ£Ûÿþÿÿÿ·ÿ¥ëÝûëí÷¿ÿûÿ~wÙ#ÿ×÷û­ÿùéþ˜|hÓÿÿ÷ÿõ4õÿëûýÿ[ÿŠéÿÿûÿVõþÇü{×ÿõþ–ëÿÿÿþ×ÿý­µÿý_õzÿÿþýþ­¶—ýwü4¿ÿ︪éû�q?ÿ~C¾¶*AÅ~ü†/Xb¿ÿ¯zßßÿÿÿ^ÐaTàûN§¢¾ò¹[Êåoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñóµ�<#�ÇÿÿÿüxŒe•´O-Àú–â¿ÿ^«îîëÿõê·Nïþ¿^šwÿªôîéÿýz¯Nîÿ¯TE|ÐwÑnwsAáÏw­¼-áo[cƒ)‘Ppã†St‘ÇŽ?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþwZÿÜ›‚÷_ûÿ–êoºå¸Íå¸?1^•Ôì¿›ïJô¢;­áb8�î±ïÝ_êëÕw]Ýî­uêª\:û¿tFöŸöéÖÝ/ªöém;¾Ý/úÛ¯Õ{tîût¶Ÿ÷¯õ[t¾¿n—»¾Ý-¯º_C·KÛ¥íÒɺ�CmºQ·Kn–Ý-ºR Ý Qè[¤Ü$äô›¤Þ›¤Ý&é7IºMÒn‘7gbÃ: † 9 Èc# A‚6Ñ31¤M�D?’0ƒ>6r!Äd0� i ÂeA�hÐw¦Ý$íQ­ýªrNæç4ÜÕ›š7>oyÖç£ôomÒFöÞ�l£ž¿ÏGAºzI麦Ӥÿé¶éSn’MýªííïÕ¤þßûúíÒÞê¿ùÝï¿ûí®èÏÑŸÿ»t±uÚûÿ¾ÿÇÿź]¥có�Aõ}÷þïßýÿÛn•½7ûÂK¿ÿíµõ}o_¶éA¶°ûÿ¯ÿJØ9kêú⽑M‹tƒd]2 ÛKWÿŽA(EAŸßßðÃZ†  Ãýþ¯ÿ˜ gC__[ž�Èd•ɱ›hˆ|õÿÿùèèëôývül7†ÿ´´/ÿ}¶ÿ��mm·_ïþºï¾º§£9Çí¥l›)¯'ßÿѧþ¿5y�ë©éèAÿÎzV×Ûÿÿo­ûýWÕþÿA[ÿÿbºôºþ÷Uëoï]m%·iv¿ú¾ºþÚV—­}w¶“zVÛöÒì»ÚûŠŠîAù¤ÃZŠ_WŠb˜¤­±[Èbÿ]WìPb +Ÿ­„Ó l0�§iE‘h[e¬,-´­ ­­´­¥´¡´­¥m-¥l³AAl* +-À€˜klƒ 5¥½(oJÜ�( ‚é[�ÉŠˆ.n_¥¹=˜)¢}+z–â¿¥oÿJßë¥o×Ò·§w¥oÿJߪé[îïJÞ¿Õ¿×Jß­é[Ó¿Jßë¥o׊¿wumWZ±ëÕîÕõ‘_W¹ îç»ÕÑ ñ­¡Û«ÖãŽ5qÇêÿÕÿ«þ7þÿÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–àk7–àüÇ,·çé^»ÂƱ#c{_úôöŸýz{¿¯õWw×þ»Okÿ^»»ëþ7å˜PAC$È d‚œ›Œ �S!A’ +ÿÿÿü†ÝD�¦Mr¬šå\šåYk•ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÈ%‡çbPN/üìÐü�(Dˆê)‚Ú !j¥cƒB"!‚/ +Ñp¨C�ˆˆ„ˆâ‘i‹åœx0ÄE!¤;CAU'ÂIwˆ_ÎêÐ[ËrÙ+u´˜VA ³òÿÿÿÿÿÿÿÿÿÿþ[J™2½#"Ê[@ØTÎõJLÚ“ÒÕŽùª„{§ÿ,�yÙò#;HÈ3"„EÚîé5¾üï\›j™°A‚ Bx3£ÛßßeQ3†]FD#°Œîíp�Á£ãp�áÐI¿ýNÅWЈôûßVÒoIú·ÿ×óq}þŸt›Jú¶]*ÞWÿÓÎÉQ_&Ôµ»í5ÿjÝ ‹Kzù’VkgBó™¬i�È��„Ȩ#¨’I��Ä(ˆì†‰Ñ±‚ fAðÞh’ò­›Gª[çfFKé?ÿOæ»7ù#e” è)@¥9"œÊv|B†GŒæD#g ܉æ°ÉƒØÊN‘¬0�lÎN-ƒH/iÚBá+¦ò{ÐÒcßý­�é‚)ú]•d¥!™“ŠC"Pñ#öˆ¤AœÁ²±„khø<šfŒ&Q…FæúM ˜ir7 &äΘhi0ÖL&Òt ã—á¤ÚM +|Òt�/TÝk�§�„D/\æj"ž5ÊHÓ‘¡ ѯ®²°0EÙàüg�Ì#`xHoE[@­é6�m Ú#²ÿVêG w{Ç«oÈÒz}åŽGO¾Ã¯ÿþ-„­2í&Uê“i:N»¯ÿëÓkê©ÿý:Z¯ú¸Æ‡«ö—¢ 4“ï\Ž�Á¢ëýÌ3^�úÿô?üÿ½îšW×ýÚú|Rýëk_U¶ÿ­þÒ¯^CÏè±ÈæXä{Õï,K˯ÿÿC ‡¯ºûÿáuºü6«ÿk÷UÅo¯t­Ý!Ý}úÇúün×Çõá/Ö‹¯øãÿ×ëÿï« ¿ÿÿÿãÿ÷KðÞK²;ÿt¯V«Çÿõëÿÿ×éƒlÂýÖ¿ýzÿÿÿÿÿ †ÿÿÿü$ÿûi?†ð�í×ô‡ßý_ÿ¯ÿ_ßVØ:óÃ_ôùázÿýÿÿÿü ÿÿ¯þ‚ÿïPá~Òÿèúßÿÿëÿëÿì0iãÿÒïÿm.ÿþÿÿÿíÃý÷÷ö—ú½¯»×þ‚#¯ÿÿÿûÿÿ‚3ÿüñÿ¥Z�í¥ÿÿÝÿ뻽ßÓýoúÿÕ…ÿµÿ´ÿÿÿÿÿÿø@¿þÃ¥Ò_úK÷Û�ßÖ»}¿_õÛ¾þ·º÷íëþÿä'·ýÿÿÉ ÿÿïÿÒÿýêÕ/þ©ëÜ »÷^¯ÞÝ×sRÌtÝý}Ößm¯ö•È<ÿÓÿ!�1ÿ½ëO÷ÿ÷ÿõþýÝ_×ÛÒ(K}ö»·ÝjÝ­¶Ýuvi­jÙšmt›3÷K³×¶}X#ít˜g&©ÚL3u·i§·ÿû_þ×ïïÿõ÷ûÒéõZtŸtûnÝn›?·mŸ›?饰ÂV­Óa[PîÒa‚I¶’aŠM‘T ˆM¦œ4ƒÚiÛ{zki·ÛúÒÿ¯oÞþýµÛ:zM®¾Þ†½0Ó†zdíŸÛ=åæáZ †�Šca¤Tí$ئêÒb˜²9¦�b‚l4­…p˜Uù00Á#Ó*ܬ+ +Æ*�%*¨¢‘þÚÞ¾Úû}ßÿÝûw·Ò\)pûa„PípÚLV)‡±LS› +Žì$Ä"º `ƒ‘ô»¸…†#¡ ƒŠ 0GH„wÈÈos!½ßûf~õÛݺK¶z]†rlONËé§ÚjÆ›!y¤‚ ¬,&›5¤ÃI³0´a0š Ab0B"!…Dfd5º_»VI¶“Û`Ô6‚´Ø¤ÐaŠ`Ƕ« ÓL2P“a6‚IˆL& ‹èÎhGbˆ’G;&è½:¨M4Ã"'m ·Ú¸ÂØaO !„ðˆ{D"”'Y‚;B")?×¥GÄK)Vɸ"IÒˆˆ„õÚV‚¥ilŽÂ 2>ÇJÁ‘dVÆÚ„Äa�†úÚ £ÿËÈ®9ÊhV‹¼6ÔÎ>[:0¡úO-a(í\P²gé5¤Y‹qÙÙ¤Jc²ËÓÓ�ê2º¼È$Lâ½YßÁ¿ÿ_…2ì !#¢:T÷þ¿Ú-ñy%Y*ùا…FàÒ¿ÿŽ)꺭<ǤI½ªÿ2_þŸ•DGþãÕ¤Û™ ¢%ˆÿ¯çbè˜Î±&gVS‘#(:l΂¢as#â<ÀÏÆò„™°ê!9­ÕûÕÓ5¢*ˆèO"†j2ƒÈ:\gAJ*±” +AˆfÌAÃhp#0Fv�• ‚ô?F68--&äÇʪ#xÿ¤ýù Dbò#ç_;32FGDy&‹åà¢8F€ÁÐ$#L Â5†^ÓÜѬ�Í6š>4kÂt� Ú †˜G†�m&Ùh%�Û.pž“²ÂD6Õ2Ð &�ÿÈÑ•R +t$D.EH°Á&ÆNÈìŸ ðHæÎËs8!}a„†Â A:Aºo +LV|é´�Q´�+KWA6�m0ÚZ¿ [¯ußÝtŸª‘¥œŽÑ’Þ¶B )B9„aÂ#ä4`ÏÆð�‡Vx'æ³P„óÃSðFÀÉà™'™¦ðš µM/JÒÓD[jÜ´&Òtµp‚×Ö Õ­ÖÕ¥A:ŠZŽ+uiixôêŸãûoúöò!�3\™V!NDS6p´ ‘œÉó}ÉÔ0�o´½¡&ÒG�Rm+MPL94&ÙhÐmyª¾fÒÓ>Ð^‚m-(&ñK¯Òÿn½´“­Ú{ûUmpï÷ü~ÕýÝjG +¯Èx Â6�™÷"yŽ~dðNK aÚM¦ªØWA?uºN•¤ÒºPÒmC¤Û«ê•ÖGm'õõý_õO×Òk^®5÷îwZ·ãßè‡Qø~úøÕôô›e¡<™é6ƒ<Ýë+PéZ^;iWN¶µº_¾¯¶÷ÿN—åÂ%‡Þø¦µíGßÿtCϿÿÿùcaþÝuëPé6ë´ªÝ{ûk}-ú{ë¯»Žª›�}{­µ½ýoþª¿ðôXäiõÃ×ÿþ]_öÆ·OêÃþ¿aûëÿñïKÝ+Ûw¯U¡U¯Ãúúý)*I>?Óÿ~?¯ã_ðüWàëÿzoý†¬6ÿýXÿ†ÿn¿ý$ÿþí}®ú¿�‡õ¤?ã,Oßÿ°~¿ý[×ÃzÿÚ_º_¶A²; ƒþÏÿÿ ÿ�ûß¼}Öý¾½!èv±ßþºU¯ÿíúÿÿþðFá¼—dwþÝ}Ý~�`Øoýð�aÿ¿Ãå×wýúÿµÿ^“~|ÿõúÿþÃðŽ?ÿÿðoÐOáµ@ŸýÐ_¸A~KpýZú[ÿ¿«úþúÿûÿὠ߯í×ÿä6Gÿƒø BÿúßÞþïiø Cþ?ºîíÿë¿÷ûß_n¿ÿÿü#»KÿÃ~þ×î—ßúÿÿ†ý/ÿ¿ýý/ÝÒ_ôëh/Ý-ý^¿ÎoûþH_«ïuÿßÿÛ¯ÿðÞ¾£û##Ö—÷_¿¯ÿ¿þýëiÿéôéþy~sÍ~õjº¯_ßÚ×Õvh�%ÿ’÷þ®—ßf¿Öýö�]þý×÷ý}¿»ÿ<ŸmwÈ·ÿþ·ÝZõö“×öÚ_¶¿m/K²û ºþºÿÿï¿¿÷_¥Ýúê¾ÿç—ëÿí¿~«Þ~é¿ÿ�À�6}2ÿÒ‘Jè6“ik"»µd^¦ÆšiÞÈÆ“±LBl(A÷õýëÚ¾×û§[Û_on¿û¯úý}¿¶ÿ[­†r°GpÛ¡öš¶r»ÓOnI�» §|m&ÐM„“A°žÂ „°Á,§vȨH« ©¢† �ºõû_ÿ÷Ô÷ïôÞÜ‚Q¶f›·KÖ÷KûI{îl0E?lÃ`ÁUm´˜6)·dGáºb­áÝÛr 4aZé²(4Ó"¨%©4â +V…c(’¡ !DGºëÞõç÷¯lÏìú»Ò[IµmläÁì0¶mí¤È¶aȽm$í;UMŠÂi†>b ÅÞÃ* +ƒA¡pÉT­!E" Á +9å�uÛJì"‡y�m+î�U†M‘GØnÒ¶Òmȯ Si±AˆI°h(Ní&Ãam¸R¬õ„Ô« Ÿa6Qñs²xˆ¤â“ôÛAH¸Ä6ÅXm$Ó·¨i± +د†‚`ÁÝØSõŒA„@ Åˆˆ1E‘>ºëL6“ é0à #Ä\¥D#:G\D""("DYÈÓ¥¯+!‚;[Ëp¿¯ðJ":é:M¤ºèla„VðÄdFRÚÂ!‹ ‚�þ@`)±´r;VÂŽå³C;-Îù–ü)�©ö“ËQ+¨… ã÷ÒyhÎþ2`§za'ùæŒ÷ÝFM�"*0H)ØË¤ñwýñçsŽÇ̹©/£¼ì½þúú[ÿ +#i5»ïµ�‹¯|}d‹ßô…wÎÝyFAå/Uñÿîþþ×�ê«§�$EVCŠtGΦKäùÈÙÆh) üÀÍB!æ"’Ñ ¯øâ¤„v[úúgbhŽ•<ŽÊ�‘xѧ��BF0A  F0�“ÈF`ÑðÓ5°�p�†Aœ�¯N BéfwÉ�õý<ʨ�äùy“0æ),s$³LÇ9ÈO=‘ ªâÏf (Âh>ÂhÝ'A6¡´m ÐдÔ$Ú è6“ ³íÛ]…eˆ)_¯é��i�L�žr4G:%ÅΩ�HŒEZ6D�Q¦ÆHÎa*W„ ²’¯ L6 ƒÐ°žËŒ™Ú¤ÃDvGvYÃ8iZZV•¤Ú'ᶉͨzo¤›Díø¯õüïò1ä^*¾l‘ÈŠ ¡XR e((pL4D™vRøö8Ï5‡„Í<ÒA“ò?<á�duðŒì$ÚZ¼™öªéû-ûpøº‡VÐP›¨N“téZM-þ¼USÅ[ǧû]ù“Í™ÐdžG”œh‰B0‡²D]‚=‡Ÿ3Di eÌ„Mé”z”òa&y©ª“Ú*ÛM$ÜŽÚ¶ˆí«APgšMKCJÒt¶’ÖÅoý¿i'ißßUý!WvŸzR8^×þëù  �A£aÁ¡Â=µöÔ&“„˜~ša;Y~ ãYt,Ò´šUyhM„Õñmé'‚ÒÐN•ujï·ß×ÿ«ÿ¿ûŠß_êG +º‘Âõuþü;§þÿ$JcäÐå[AZZNËBpƒ8iZOÁM´˜Jð¬+º%¾¼_á5�7éU?´êþõþ¤p©Ö÷Wý7ÿÖÿ×!ɯßý½!aÁ÷ÿðÿëa·ÇJÒuÝxM¥¥õÓ¯Žïî>¿é¦ãîÝ$?[ý»Zý<~>?ÿþ¶ÿý)Ò¥ÿÿa°ÿÿØ~ùá×Þ�uÒô·n¼t�ß{­ý¥§ïBžÞ¿�ÿÿþ‹Ú®ÿá¯ÿÿëÿÿÿÿÿ°ÃÿàßÿzÐ믯z×Kïÿñ÷ƒåŒÃþ—ÿëÿÿõü0ÿûÿÿÿÿÿÿÁÃÿá½ünÿðK��ãÖ—ÿ¿úV»ö¶¿¯ºû·_ýá?oÿÿÿÿÿþÿÿðØ?ÿøÿÿË0µ×}pºú°ÿÿý‡û~¾ßî¿t¿ý|Càßÿÿÿÿýßÿ×ow_þ÷ÿÿÒÿýx·}é¿ÿÛ¬?á¿m3_‡KÕ´¿ü%ááÿÿÿÞ¿ÿ÷ÝýÝÿÿ÷ÿÿÿ‚8üÞù£#¾gÿiÿÿt°ßàÿ×êÿuüBÿô½/Ý×ÿµÿöþîëý{Ý×þóŸkÿÿü$øKô öÿ Ð?ÿí Xo÷Öê¿Cøÿw¯¯½ÿõï_ßíûoÿÖÙÓ£}]ÿOÿÿîô ¿Kö×ñoÿî‡~÷÷¿¯Â_ž»ÿþsÞ¯ôµþÿÿlÓ½³4Ûi¥Ùÿ­'ILäÖÛí&E_ÿÿ¥é~—}þ‚ÿp–ÿýoëÿÿýß§zýZ]þß}ºK}—ïa„› °Â¶rm+Mt“ U«jÚIÚi¦Á÷°c¦ƒÿûw¯®ª»ï®ÿþ×9ÖÞQúOÃ1 â¶f›»§öý=ÒlǰÈý ¤ îD/VÒµMŠTÙìSÚIÚx@“a0ÐPh g¡Â¶§‡*ÙBx@É ÊtQÿÿ_W¯½¿òcKþö̓ӭ¶f¾¯¦÷òýíæ;V+6ÙM¦H0Ò`ÇŠÂL-„pÛ#è ¶›PÓa@ BEd£”D¹JȆ a²º°ßÿÛoUÿJÕ¾ÿd½k®c¶ÂL5ºÈí°Tíl%² �†Úi¶ƒM6šaˆA’�; ¦„2CbL aQs^Ä\®$„G-̃ívÏWv‡ËÖN¥"»aœ“oÓm´“M4b›¶Òb“a ‘Ý‚(p¨Ji¥¹­¢®i”$zCH¬eD[’1馜‹”ئD{�ˆV/¥aŠí4Ó»øá[ +w¦ÈÈA„t˜¡ D,ì(b")8ˆ�ÖÓa'l ÕW_Dq´A‚$d誙D&"("ƒ#ˆˆé:¿ÊL¥#³8íQ8ЏÒÿñ--}-þ–ÒÒÂþº i6—ÚV¡XbÈíÕ±`ÈåA‘T�Š+ßl1�¬! ÄDh¬qùL)f\Œ�ylþ†Ú« -EF‚=õ%W,ÃHìÇfTÑï•¶“X–`ÒÉ(¹/¤éïéï&ã�S–¹ö“éKãÉˆŠ¢;!LÈ-™ÁTî¦wrL=&ÔZñÿ…%à“yœw«Áþ“é?â¤o×ûé5Þ‚ß®›ûÈž§jÿü웊x��(êDI©@Σ(§3Å®½Ú;Žû#zþÿ©�µ§œ�dAYó: Ž£DÊœ R�C©Ÿ0A6KáF€Â B6ÖÑù“Á4ý.Ðûâ«ÿúySÈùO¦]¶R èÈù eGŠJ!:0�l˜ÌðšaÃÖŒ#`qáš5³6¨Üud¡Ófrh«aÉ+ Òtƒi6ƒ8Â>>9G�‡Ž:êS£TD«ó™©k›$DÙI ƳœîKÓdø@â „#Ø@˜4l7‚t�‡ú3´› +�›aÚZLRM²çÒ´�]pA´­T_i-+KVêÿ®¾w,4ÈX¨‰BG"P@Á'FÇ®ñŸwPÓ(ü ›\ M…öäÉ‘aªM¤è&é´m–dD6‚´�L6ÕÕ¤®½&ëW[ÛJõmuuM&’ºwëäÓL«~l�•f Ã3h„&qÈüÖÔ#ØaB70�Ôki§p¡œ:…iQãY{.jÐds«¶Ú‚l*ZZêëuúßÖ—_ÿªî:ö¥åÃõ¯øîÿ!‹›)È€Et—FÙ¢9’ ËÂe øDƒû(Ïá ÙøÍé6ù¤É�CI†ËBpËBm]-pØu ·Øu†Â½|&–ëöþÕÕ;ÿu.Ýß×CýHáki} ëúÒ#«Â6{'µ fši„›&Ùc šMÈáö}¥iXU ÝÕ¡Dž‚o]êèRéÙ +¢ï±UoêG Š‘Âï´î‡C•ÿÇ�ð_ò1O41ÒÿñªÿÓpÏ5—BÀÖ7JÒ|U&ÿ®“ûïÿM+º^©Þôï·¤ûÅ?¿í¼‡�ä¨ÿËÿú,Wé +ê;þ¾¿ùÁÖ©µwßI¥½ßWߦÕ5§Å!ÿq﯎ë}‡íð÷EŒ¤?þ‹­bÃWÿK¯W¯ýÿî¿ÿÿ�¿¥î*©ýµÿ}ÒûúO�¢�ŠùßHøÿÿÿÿöÿÿëkÿ‚0ÿÿ÷Kÿÿ×ÿ»ê¾—ÿ …~¿þÿ—X“oÛU Ÿÿÿûÿ·ÿÿù<ºÿÒÿöÒÿÿðýý/Òý¿ÿÿÿÿ^˜ké6xÑáRußÿÿÿðoÿÿôÚ þÐ_ýÿ¯îÿðÿÿÿõÿÿõïÿÿl‡úOÿêßÿÿÿýá¿ÿ¿ô¸;ÿ }õþ/Ûõý‡ÿÿëÿÿÿÿÿä;ðmþ®>â4ãÿëßnëÿÿ¯*¿ï®ú¿çŸ½ºÿ ÿÿÿÿÿÿÿÿè'ì8A¿ßëõÿ_{ßþßþ¡;þ×ï«ÿo¶î¿†ÿÿÿÿÿÿïÿý/Ýþ¡ÿÿïÿíí�Võÿÿ¯¿íþÞ­š/ä[VÌöÌÓ¥ü?ÿ÷»×ÿþÿýÖ¿o¯þ¯×_·ßú[¶ýkß¶f¿ôä1ÁŸïÛ=XEöÏV‚lïa°Â({à +ÚIéÛÿÿíþ×ÿ»ûÿÝ}|ÔµÿKªµ×í½³?îÒìÏnîÒnæ=Xa{U‘m† Tö*Å´­&)šm†ì Ä&ISï¿ÿïýþÛ~÷ÿu¯¶¿û}¤ïW]örM°’§—´“b™ñ^ØP›¦Å&ši°�¶!î Ý0Ò*Ä ÂE[4ÉôsÓ&"?ÿoûn¿ýû¿ïu½;lÿÕ„PïÝ--´¬ “‘6PÛ�± +ÈúJA„†GlB¶@‹Åa ¨“ò°® „�H0EeÍwšuÿßíš+ÕÒó÷ì3Ü3×°ÎM‚(}äw¶‚‘lŠîEñV•‹a4iZTÚ +S´“aà ÐÁ2Œ5HB”œ¥†Wȯº×ìÆÝÚ¶ +Ã9YÛT×M=Š Ri†*tؤi4Âv ƒVšÕ‘b¡ B•’º¤""—ÿOM8¦5†Ä Å1I¶‚NôÓL0ƒá„ãR¬6+bˆˆƒ Èž"#§]Ym4ÓaJ´h†a5*Øb¯‰NuFF¤"5þ”7)˜gÝ+J#ö‚dcœp©l`Æ0©ƒ$n´’cåfÂ�þ@eò›$Ê’:#xYmŒªŽÔ T"’–±lv†ªK%æâÿË,ó$³;�Wÿz÷–CáwØQ‡‘Dß}ô¶ù‘r)2¹+#³‚…÷T�»þ9:ßQTjÈJˆÕ'èwÿ;/Ö‡þ¡?7÷Qu¯ýWÔìÉ~{5ÄïCé{׎A¯ôò,²ɈÒÓ!™gAHb’ø"/Ïf3ÏÂoú½VÞ¤•d«]<™çU’èJEÌŒf än44"„a¥h ˆÂ33>|„ã@3H Ѱ0�ŒÑ²~~ñ_a ¿þL"i’T/�®¿•$d’"C'ÐRˆ�å"Ù¸¢`ÌÓ.��l"î�Í$ $žØ4kxFãQh'3•4x{ògMª44¤ÃwWÚkÅÐWÿïQõOSS) +'›0ˆBäT#ífD\Â5¹ñ„|„a¥¤é6¯ ›A:M¢,0‚p†�m™ e¡6‚uuLñ‹»í%¦ëi7øý}­þ—TÓ%Q¬üã:ŽBaZä^"W.)üÚ8ÁÎÖ!•ç9T5†cÐxFÀÑø2‰ˆá¡h ÚN“ ›--ézV–ºéh”R½'tµñ]ßÿÚÕ=ÿÛ_u.楑H�å@sCDI‘¨#¡aaaàŽÁ‚.ðƒØœ<\l»¤ÚMÉ�[ ¤ÅZ+, N“h3‡Ú% muuºuuõºt�¯wÿõK·¯ÿ­Þ4¯ïþ¸®l²@¦¬Žˆö|‚ †ˆDæÊ<T{aÞ­Ñœªš ¾ ãIÙs„4›e—/ÛM2Иi6ФÚíbÞ®­ ŸnšTñÇ×´†½K„^½ÒÚJúõ#…ûwüD=?ÃÛ¯Ñeá§„la!aô‚nLz ÂM²Ð­'–]lȦx�4›á6•üœWªmý-&õõÿKJßÛqŽí {ZýWÿ÷ÇùˆÜ?ÿÿåÕ‡ëÿ£Ç ˜aû &ÚºõuÝ'×i×ÿ·ñ±ûëË„[Õ^Ÿ½÷Ñ@ᢋ‡Cô5¯¯­ë¤5L?ÿÿÿöõÿ¦õoô–õuô´¿÷¯‹÷C÷ýÛ]¿ÿ¯Uÿùu†Ã—_a¯¯ÿÿëþßÿúÿþíûzºC ¶õë믯w}.¹ðý¿å˜·ãëýWûôÇû_õÿúÂ8ÿðÃÿΓÿþ ý÷ê×I/¬|qñÿùa_E�}‡ûu¤¾—뿜øl7øo%Ùÿ"ìŽÿÿÁÿx?ÿø@¿ÿÃî?ß¿ëKý}ÿÿöúÿÿ×ÿúÿa°ßàúèÿÿ¥÷íÿÿ¥þÿ¿ÿ¾¯Ú¯¯úëÿÿÿL?úÿý´¿ñÿ þÝ¥÷z_þþ—¿¿ÿÿýÚÿ¿íÿõ‹ÿÿqøGÿÿÿƒþÚÿ÷†ÒÿµÿöÞïwKß×öþ×Uí½ÿÿ×÷z¼òÿÿÿÿþg{¤ø@…ÿÿÿðßývõþ?ßþ½»þö¿wªÿï_ïä'^¾¿ÿzúןÿlÏÿü·ýyE„¥ÿÿ÷ûþÃÞ×}ÿzþ¼ë´mmÞD×ÿ¿þÚö·ýšmÞ¿÷÷°ÏMÂo¾Ú´ÓVKÿÝ_þúÒð¿ÿÿýÿ_Þþí]½n›|Í]7k¶h›³ÖCþïzìv^a„¡„Pû¥^ÙÚr%¶ÓMˆM¥m¤Ÿ§i†+ׯ¶Úíõë¯ëÿßíþPŸ×÷­¾ÿmëúÛ?·ZVza¦ž“ å"ްÁ+¸bÃM64ÛA2<#ŒSƒ;i'i§Ol/\0˜i;P‡õ+™×”œú~Ý>ÿúú®ºÿûÿõwMm¶—fkdßmŸ›K]-�_b˜>ï T&“bƒ)îÓ§a’´ƒbša4 â-J²°¬*©#%ñ”ªï‘Ùho¯÷¶õ¶¿ú÷÷þÙøçûgåûKÒÛ/0Íͤ˜`ÈïoMƒb›I;Íš ‚ƒ(`‚ v�‘u „E[8‹ˆÊÉB;äM–×­ÒnÛm+¾ÿ»¡ßaê·a+M4ؤÕ;Ùl%Q Šm$Ó°š´A¸F­< Š|Aáp„EÌŽ„DWim¤Ã9vÚJáݶȶÛl[‘u`ìvšaˆZi¨a'vȨD»@ B•ŒBŽy\Y™~µ´¶Òb–ÛI6×l'kvši¤w“óÃG¨+¦¥(¤ 8aæTßér¡‘ÐKa ƒ F…+97JKô¡*C–…ikKXŠ¿ˆÖ­-¨VÐX¶ ‰¿ö†?ùaFd Ë`Ó;-ŽÌ2|–ëËMÑÙ\w•XRx*¦˜~YÊc³Ù«!oTõwÿ–yáH$¦q—ÿýëÈ’–ÿ�#°‘ØŸµû];�…#³þ³²Ü)¤ƒý÷ý÷}5õ#:¾÷ëi¯ÿõÉ4GD·)ȇâ¢% }릈š—Cˆÿ™-¬©2SeC"T<˜3ì�™ PˆI‘PD!:`R†Ì${ÖÂ6^@Ýò½£¢Oü«DQ)-È‘¶U£dLR:T‚5†�Â6<£3‚aOÁ­èÜyŸ¿* ´Â44i7\²s±¤:ª•¯"«Í�)53ö§3`‡ŒEÙ:6`‹¶D ƒ$i¦°<ž3‚a˜PßN‚ ¤Þ¨ŽF¶¨3�-–„ÃWe¢.“j-«iZ[«uÓLÔ‹£±à§B C!˜$D'¡úkÌgŒ$§ŒÍšLºtf’¤<—&�M ÕÚ"ÃPˆ° ½B ãI´½'I´¯ +‚oP“tú^/ºþ•ö¾•ÔìU–@²œ‰#Bš³<ôo/4Dâbʱ‘< äJÁ„kdøEÀeý¥<~0–iÅQù/ ý”œ'¤îÕ.™Ò¸&ÂÁ_XM¥¨­÷í;á­_ø·xÐ×÷š‘NˆùO&F#ˆò0Œâù Ù"“¡R0rŠA­„|dF��‘�#�Œåg¯FÀÓL—•; Ò ªAІpÙeèÆ–¦•îõø¶½KIÐMw·ö©ûúi}¤è{¿¾õêG ¥è‚LÑf½nHeâxXdŒ0Ï33D$σŒ ˜h è Ú=³8'“ÊA6“…WhXA„†M &Ðg Pg›2iXZ¨OÔ&é÷õß_ô¼wÛëqR8V�ݸ÷Ý +¯¾ýÿßätùe~]Qþºè' 7{,‹M$ÚM¤ÚN‰sÕêWºÓ¿¢Q¦©m'ZþÖõÿß_ºÒ¿¯Þ·KoHw�·Ý9ÿËŒ¯°×EŒÿþ½ ?ëë_úºÃA[¾é-E]z¿¦ÖÓÇm'a~ªÓ½>“Æôûïºï«ÿ�øÿ÷®‹,¿øÿЯ¿ÿþ¯°ÿÿÿþ)jÖïÿzMW½ï©.öß´/ñ¾ïý¢ÿ×^Ýk_ÿÒÿ_ÿ¿ÿ®ßÿÿá†ÿßÿÿäp©îÝ)-¨¥µÓ×÷ßuÿ,rHÿëËÿÿÿ^¿OõýµUÿÿÿÁøoÿÿðA?ƒßßÿíÿY :ÿñ`ø~¿éÿïö¾ÿþÝÿà¿èîè‡ÿõÿú^ ÿÿþ—ØÿîþügÊ70“¦¡4xa&ÒbÐV’M¢,0ƒ8a ›Á¶–â•ï\•!ñÇMI4GΑ.m¦•ê;¶vY3a è0Ê3‚aúapEÙ™üVC0á0Œí&é°ˆí„kr8hi6“i6“¥…D°7KXJÞº'7 ºumÒ鮿ÿ믒fT#S5™ÐU*KŠS”‚è`‚#³MD%m(äDðèãÿéäǤÃAá'e�¢±¤Üº_ݧÓm'I¸Q ‚m�ZŠ�]?M?Ó¥ªXvÝñJïv·_CÞºfµ�êE@¨‰B4景60F†¦ƒ| r�ȉÍlÎF².<¨ØÐN˜MôUµ–§¥ß¶“´)6“Õø·VÿïîÓ««{OM´+úªî×¥¯˜«ßm­·A{ãèkͲ¯DCƒ5fÈän#Äe“Åò:!ƒ:á˜ÏèÖÔ#`f�L"¹öH6šaM¤!ä˧TšDXjËœ �+Ló–-«Õ·[zö:OŠßëÿú_½ +Û_¾¤p·hkûãö¡ÇïõØ?ÿ–ŸÖ Ï °�Ž(Ž6(ô–�Úvsm&)iÙd&ÐÕüûAZŸ7V‹T*­A6¯ú]6ôß­kÃÒ¿íÔŽ­Há}ý¿ßZ÷ûùÇ,r9¯ÿüußßýmrù´ÏÅ &'è4¨-aG5ºh*‹­¢N±öÖúm'ûëÝ÷Iªß÷úëaÚ]êõÈÓ÷à¿þ¿ë÷èXl<ýz¯ÿéßýëMý.ýikpšíÒèS÷ÕßîûkQKßÛý‡Áõ}ô=ÿ¯ú¯ÿêÃa×ÿí¯ÿÿßø#?÷û½k{®º‘ð®(u½èo}huëßÿô?ÿùÑk†æ÷°ÿµÿÿÛ¯ÿÿÿ ·ÿùBÞ�Sÿÿÿ„ þÇ·¯}:ünˆ$ÿ|‡Fÿ–únƒÿÿÿÿýºÃ}íÿþ¿ÿÿÿÿþ ßÿ¤ì4¯_ÿ½ïý/øoÑc‘ˆÚõÐòëü>aéì=¾ÿýWýÿõßo ÿÿÿûÿÿÿý†Á¾÷ü%Áú__ê“ë÷µÛëÅ¿ý~ý‡®ÃÿÿÛØ{¥ÿä»#¿ÿÿ|7·ƒÿ÷ÿÚ_öÿýnïÿúòªÚÿ®ô·ÿûÿÛ_:‹Ú_ÿÖÃý¿ûÿ àßuÿèÿÿl1ÿß¿¿þ—áÿ½¯ÿÿwÿøNõ].¶Õ'ÿUïõûh§ÿþÚNßÿÿðo¶_ý¥ÿÿuïêÿ[ÿû_÷×ú]�SFÓM¿ÿ®Ûÿé}mÿÝ홯ÿøû×ÿºX?xoûÿßýÒÿ×ýóËÿÝ{ýûÿ×ÛoÿöÍúæ�ÿöœƒû?ø]-m´’¾Õ9vȼ Ži×ÛÖ×¾þÇßÿû§ßAö¿ý{ÿ×TvSöÝmÿ{þíþÛ¥ý¥¶Jé†l&¶·"»a°a&áƒKA&ÚA4Ó[Ø'„‚¿÷ÛtÅö;÷¿íþêq?ëÿÿý¯ÿߪõévzý³ÒØEí>Ávšl3 ´“Tð’lB´­ Ä È¯M4ӂ݈Níeà‚s$�l1 +¾�™W'H­ÖU>Ÿá×íù©ÿå ÿþéjÈ�ìÂÿÛµûë¶ö½$ê­&Eæ–¦E·±H6GÖ˜=Sbi&�È£…m1LS ¨D¼ó+ +N£Ñƒb;y\×ëí¿·û~söûÿlÑ~é6¿[ þý5aœ¤W\Ží$äJéŠpÒÂ[ .dt•°˜,&$hm0‘\QÞ ç+ ÍQ:â3[#³MżzõÛtýí™ûlƒÿ«lôºG.Õ† §¶•¤Èê %l*ai†* +“A± ØI6 ´Ó RI11Éo2®�¿]¤ýžÞ•½†6Cûí(6*á¥ašlBOM´­*a…»‡ÅØa;£C(ÃB‚Èš ã„)�kA¿­¥LŽb©ÓdG± 6›M±v&Ä*šèøQØ0‚>JBb1AÄQH•ÁÂ#KÚMúå8`‚á0„e[ &�‚žÙ«G·M¤ßTÃ’ž«‚´£÷‹¤ôÞ"Ü”™ßÁGdj+¥ß¯ê£­¯· +“jd�îî%Ircî»ïl–Thé5ÿä©}úúJêä™fˆäRŒù�ÆP)Ñ‘âxÅdS@ôÓâõFE+#2 úúù#S«S¡YH2œdtt««ÙL dŒ«Ìà˜L#CFÀËá  �ʉ0�¢ë™cýåIù!ä|Ôóm(FaÌ‚!þ"ò!&xˆO>Q0Žð�lϲì#piwéaª Î0��'IŠI´Ÿ +›ÿ$×®¥:O)<ܧD]ä  @ÁÂL3h  g†}ª?˜A‡®VêúL4/ÐN³ý'IuÐO'íV˜­+é+±o¦ëë©ÚÖud5Œè0§B:’¢%‚${0)"Èþ3žƒza4Uµm&4ŸEci¦Y ´˜rjÂÒyh ežÚ' +¯£Uaþ¾ßôþ¯¯»ÿUÉj#æ¤GÉQÈ«D%ë5À‹sÁ‚b$f'ÁÖÂ5‡!<Øc›*�Î=ÚBÜ�à 3ñc„GI7…>bÚ +Òa%âÛÓ­¤ÛUû®é>êéºJšý'vý¯¯Ðîýå?•:3©fÙH,ˆœ‰Ó”#øAg@DÂ6Â5†­›Ï ��F°Í$Â>HÎaÝ0ÓM4gi6“rhM¤è¡ËBnZº +áþ„R¿õ½þ®×T÷×Këûq«·ÐÂÿéÝ÷ƾXätþ#!+A°FpÁ`ô #_ôí°•„�è4Òm&(&“²È ´-&Õ'I´ƒiž4ÛI´�Ò´œ^›}µ¸NÿÞí:—º^ïñ¥zõãé~÷¥,r1Gþ¿ÿÿÐÃÿ„è& é½Ú0å„- ûJ÷« +ÒM­.:V‰:W +¢“IZ¾ëi?ézßë÷Ö¤p¿úøû}h±ÈÕþ±ÿÛuØzX¿ÿïÿ®»þ�m–!ZZ]Ž·¾ÚÚŠÝ:ôúzô6/k¥†¶ž5õúò8]Û^Cí/úCÿ¶¾*ÿ®¿ñfcaý7þx_ÿÿzÁ¿úWK~“[¤Ûþ«j®1k¿©+ït;{¾•r¦ÿJPç ¾´\³ÿëýuÿ®ºþ¬=-ýúÿÿÊ6ÛK ÿöýkQ«ÿ§ûý/áòø}ªÿòêèº×ÿøŽö¿ÿº®úÿþÏÁ?ýn�ô½ÿÿü%½[ÿ×ÔŽ׫é 4‡—WØ|Ã,=ƒ­ÿÿÿÿÞ¼Ô?þè#¿Û¯ÿÐ^‚ÿ÷ßßu×ßÿ¥¸ï_éüG_¯ÿaÿÖÃׇ·ÿÿÿÿÿÿëÿ†ÐAþ—øKÐ^þ–ú_÷߯ÿXJßÿÞ’ÿÿûM®ß὿ÿÿÿÿÿm|îFBý‡ÿÞ—¥÷_o¥têêÿ_úá\ëëýÿÿü0ÿn°ßàÞ ÿÿÿÿÿ×ú5K×íµÿõ÷_r�~ÿ]ZëÿêÝõ_ÿÁÿÿ‡ûm†ûÃxnÿÿûþëûêÿ¶—ôÿÖÞ«ëÝi]úF}“ªn›I¿…ÿÛÈc™ëÿOþ_ÿÿ†ÿƒÃþûúÿÝïÿþú¾ßþž¶¾Û¯~·wºKýj“ WW¦Â(}¤šiªpÛmІ’I§ßì ¿ïÿ·¾çO}÷ÞÛ¯ýû¿m¾ªÿöÌöAùß]¶m+o´S‡—¤QÃM´­nÂIæ Š¦ÒmX1ð©®�´ø`™5*ò®ŠÒëzïúÿßð¿ÞP¼ç¶ëþÝí·ÛÕûfjÒ}³?õl+r(îÐMH¾)´M�ƒÛb„ÛI0ƒMƒA'a$A‚"xÑ¥c”QGCHDDzö»û¯ûgU··ç?oëz»¯öÏÌ35Ùé»í,Úµl.–Ã#ì0Iši± +àžS´¶ƒ °E:L0]U4"„Aq �‡ˆâ""–·«õ¿n»Õ»¦ÍÙš�yúÛ?ö—i6zt´Õ6A+"ð¦6G6“#Æ›�’« BÙ%\¨`Áf" ¢nwZ´‚¶»f}Ûi.m{g-&Á-°Vi2/Š»Tï S $Õ4ئ!4LŽ&Á: �yრ+ƒƒ@ÁÄ'†>©nà H®Ø2í5 ¥l�lU¤Å Ø…i±M0‚lBM‘T Qו«•�aW1ˆ«¨?t†Ò ± + RvÚA:¹á°˜ ÁpaOH†ˆ†stéj‡Ò@¡’¡í��¢:b #"MÄWUØh!“aö–˜d]ª®“iIŽèƒ#è"¦RåzT cˆÛJ„l�Â61ÿ�àŠŒµÕ2ß&ŽÖ£³¼µÂds8D|Nô†YB²m£B#ûõ–@DY¸¿»ÓGehéðš•Tõ¿ˆÿ;¸ÈÕ.½?éªÈ%¦ïzXù�®ªt­È„2!Y,##ïÖ…s"\èd†u#¡)-gÌè2‚5 263qæ0gôBa 3Xfp@Ôô¡ši£;ýèYûüÛ:Œ�ŠH§#„HÍ‘!gÙ¼#@`�f¡vÂ6JLÏÂaèÖh?$à�ÙTªD‡É &Ñ2gzM ÎzÊê¹K×ü®[šÑN¬ìµ3æt‹åÙ"‘â6ÈìÆxß@Â6¬0�Ìž +š„Ði ­ÚN‚m' E†�l%i1H&¤í4Ò Žj]+‚mÒM¥\s½r%úëäU3)È‹£¤P)NÈFf)DÌBUA Â †ši£ði¦\šð�m é6ƒ8Â>4à ¤Ú½uikÃouio±}aºþ·q[ißêšd)ƈ•ÉÆ‚/ÍŽÉ8¸¥ƒk #X3D3ìúp��“Éš¤Ñ¸þh-6Â+)6ƒ8Â>4ƒaZzí´›KVéŠá7†¿´ŸëK­Ûñý]ÿš‘,ÈògDGÓ*ÆD&):'JG�ÆÈÓ4‘aà=†Q˜5ÑááÃÓïTÐv“ &Õ´µm Ú Žh+KIÐL6Òº½owú×IÒ¾Ÿv…S»C÷wz×�í¾�þB£ý7×5#^]Ê«F $h„ôÁ¢g9¬2ˆ Â.Óò𜡠$MY`á&Ùa ö}ö™ãV’m'Jñ^®]ªu¿]ëúwß½ÔŽÚý½ï_üD&kþ‹ÿÿ“„#�‹=£|#qÄ=ܘô›D‘&Ðg Û½Aœ7Ì ŸºmC¾¾—¶“Óté6–ºx«x⪖—»©+úVí¯ñ«ÿ.°á¢ë_úü±\6úÿÿÿ¿'鄨-+]&ÜW’M¤ÚÞï ·ýµ½¯¯IÿÝ·QU»_j:ÿþFÿÒü±5_ÿì6_¯Û¯aé¯ßÿÿ÷}WJ÷[¤¿í­&ÿvÿiÒm¡úõz½õn´ +áÓú,r4õÿHWõý/÷}†ßÿàŽ=×Á»G}ÿÿý¾´¿Ço¯Õ½ÿ÷ûÿqúõÿ­hX8}þ+ÿÿþßþ¿÷þ ÿß„žÐ^}×ÿýÿþÚ¿©+IxûÖú·ÿÿºÿúü^ßú°ØkÿÿÿÿõÿþÿøpoÿôAx~¯ÿ¿û¯íþ¿1>ÿêÿ_ûþÿ¯üŒÿí†ÿò^ÿÿö×û»_ÿÃowÿ¥ †÷`د÷ÿuÿÚ]i·ÿßÿÿÿÿáÑçÿü6 ÿè/ÿÿÿ­ýÿý{wßëÕUÿ¯ûÿ¿ûkÿÿÿÿïÿÿÿ¨G�ÿÿ`í¿ö—ÿßî»÷Þ¾¿ÜÂvïÿ]o9ïÿ·þõÿG}ÿ�/ÿÿÿÿÿð—þ“õß{½×á/ÿï÷^î×þ¶Î�~ÿþ¶a7õOÿg¯Um%Óý¯þ‚ÿ¯õþ¿ýKïû×ëw}}ý¿ûýë¯Ûmë[ÒÛ4ZÝ0Ïí§w­¦È?³ß{Òi²/‘|Ri Ðm ­>ÚZ_ßÖ—ïýÿÿý?ÿïÿÖêÝ�|Æï_j·þßö–æzûgöÌöÒ¿´•³ÚV“ Fª�ÙÆÛ›iS§l& l˜H÷ ’F?b¿ö×_íKýÖëõûô›×n�¿Òm}³EvßêÙí}ÒôïMŠb›H*ié Ø… +H128IÞ¯¦Dk ’QEᣠ@݇÷·þ¿õíÿõ÷Ó¯ÿ·æõéC>›êêëM°JD¶CÕ;b“Mi'NNØ@ BF†O”*#‘©ƒ ˆ@ÉÖíW(dÚa¾ûï½_ûkïM­é]ö“i]˜û ¶^aœ­S[´¶A��¼Òm ØACMˆL°cßa„�l�#Ü1ëtE‘GkL®{Ößf}¶—÷oKÚW}¤Ù�l�i7 b»âšxA§i ÛI ÓbÅÐF¾w`ÂhƒŠä¸ˆ÷÷»ØaU´™ݲ.[A&˜m&`ð”¶Ä,mPm Úi a"¯<6‘¡¢¾ÈDðb74ZÕªL2 ö![iBvØVÚ]†!4ÓTM0ƒXAMs2C3 'ê.�@Â$ðÄ#±ÑÙœ"#B""«¶”›RúØ0—òÈRxdSm ƒü®uÓ¦�4Æ#ÿ)²”v2–(ÂòÚŒ´—øWùg,fIÙ'oü³Ä;Í)Ü.ÿË IIy *ïùÛ¯ä¤Éˆ›dÒjÝÒ,†‹×ò$ ¡HˆÈeïã^¹]Ñn<¾¹H‰u‘¶FÖÁQ<ߥiü—OzçoìÔÎ¥’�!(Fœµrâ�Ì�1Ïüÿð Ò0‚ÑíÒÿ4V9F?®§f™�fˆ§"�:lˆfGÁ.Ê `Á„|x#c'‹˜F€Ô#`dòlZ?‚´Õ,$Ú£Ý-'¯ˆÿ¯ªäš;Sˆùhˆr:‰ù1"¬–‘!£c0�’"æ`g�4|k Ð&N“iÒo¦ªNË &Ðæö“i:‡JëM´µþv²ˆ…®ªvky;D_›0@ÒaœÃöl„kf˜L&ši£qæÂ£ÃA­4Ë!0Ùhq¤ÚV“ ­+ÖÔ:[«rqÛVÿ×]¯ÒùꙑZÓ:225 èeŸ: Ö:8H„‚SÌöHaVÂ5†ˆB„FÀÐON“²È6+¢¬Æ‚´Ïi6¡Þ´›xM¥ik«Kz^ÕzWŠºZ^+׺]u\ì"MN˲`f±”âfxŒýžwi hÖÂ4“ò^|a'ýT&­úA¹4å 3Í&Õ·i_[‚aÚ‹M­õ­îû«ÿõФ)‘õÔŽÅv¶öëj±ß\yéæÙV3Vq�D5´B „ò¬´æ²ƒ=œc4ŒGÆ¡£\Ï3‚a9/'>�tÂi6‚ »¤é<ŽáYt.´ƒ<×ô›~º¼_ÅÒúwkúwWqë[éÔŽ׈ÿÇÖ÷×_ÿYÕ°Ñ ¡ ��”a„?2y?M3’R>²\ov©:MÐmPg6þË>Ó<ÐV“nêêðM«ýZ_öïN¿¥öG +ÿî¤p¯õ{k×ÿ=*,e!ÿþ÷_ÿþ&öXù!Ry4›O“¬³·Ui&’°¯½kKP^ý%ÓkkccïþõúOþ¤p°ï‡¢ Dÿü’?¿þßéµþ½?¿¯ÿÿI†Ë&Õ^iµmCMjÒÕ/Ý4˜¯�»ÿÖú‘«û¿»Z_÷ÿÈöZ¥–Ÿÿ¤?¯·Zÿëÿ×þµàŒÿÈÿ�9ôû×Xí¥m¸º½jlW»v¿ý/ã¯áÃÿÿ×ÿHX~Ãÿÿÿÿ_ÿÁÿš·ÿÿKü%ÿ ºßïÞûþÓÿûÃÿÿÇÝ]¿†Ãÿÿÿý¶é¿ÿÿÿú_ÿÿá÷ÿáÿ_ú]_ýïµ·ÿÿHvø?ÿÿõý‡ÿýÿö¡¿ÿÿÿÛ_ÿ´¾ï½]ýRû×û×Õÿð{×ÿýÿ·ÿþ¿ÿ†Ã¿ÿaÿÿø?A¿ÿûÿþ·¯ô»ÿ´½ÿW¯ß_ß×ÿûÿÿuëÛaÿÿ�'×ÿ ƒÿÿ„ ÿÿ°Ûÿÿþë°û_Ýw·Ûÿ´¾­U{ÿï_ÿøoÿÿºm/Â-ÿÿ×þ×÷ÿÿKöëþÎÔúÉÿoÿÛþÒÚ·K½°²(á°ÎMœ˜a%`ÂK܉í$ì$ÚM‹¦ÁŽôƒ°ÉG÷ÿïÿÿ¥W½oïÿ¥ûç“ÿÿÿû¥þßý[gÿý[=/n—²/´™Sb'b˜¦)… „ìm(sÃa„4� 8ˆÊÆN„D}ï×_ú@“å \è¿ï^ÿ÷«ún¿_û_½mm³ýÓV”‹â“OTíˆI¦˜a¤ƒ¦˜a +Õ„Ó@ `޹Du„D0Eº€Ý×þÎ'Õµïõï¿Uýwþ×Û3ÛJûõÿl½"¸k†ÐIÁÚ±M„¶ [L+Ó»P•lQá†!"±â QeS î¿õ®ž¿öAø†9Ÿ¾­Ó«þï²üŠáû m&Bí+I0šh8„š 8-›a$Ým„…†,…£%Œn½þÚé6’æ;0“NÛ`ÂIÚPØm¤©¦›¦ÅAa4b›Pé…L‹P…|m#Åz+C+†!Ëâ5n"å5´´›JÁ¦›m± 8aªÙŽýéÛ Ã +ghÖðÁa7Bí„‚ ¤Ó¶ÐYŒ ƒ`Š ¬&‘XÈÙʤ£5 c`‹Až¶!JæR�aŽ-v� â"4”DDqÂê Õ¯¯¥Õ~ûªÚ lXcÁÆcä ršAe´�¨‰l +e]Ë`Z;&ÁUMB?–h³;P�"â¦�£àa¥D˜M0�Z@ÈøÜuôéÚ ºmü·^TzëùÓ5ä|êdC3d4q‘œPDY‘PGŠ„{ #Ùs3‡„k #d#Û3i •XzhZ„I´µDvE¶“¤ÒV»«KjêñÉŒÈ×]Wõ k):F´GyÆv¥)9‘ØV #ØdŒ  0ƒ(‚ ˜GÊ>4…´‚p“h&ôi:N¨öÂN“áeûÌÍ--P(-u¤¯QÚTÒÒåW#©Ø²OMs™¬ˆ�<�#y„BW04B=—B8Bèx ‚ -èa&% ØTxk¤Ú†Òti:é:úV“¯�¥¥þÞý¤û»¥Ö¤}{qÈè-UÔí9’f™Ð‰�IqJD&L £.Ñ¢!Pl9s;»q±\Y=«zM«i>fÒÒ°“¤Ú ±ñm]+éEm-1IÒõÒÒ÷ßöûC÷þ¿ã{ÒDiëÕI„Gˆˆ�y¤G“5ÄÃ5 � a¢gãÐÎK�5¿L$ܘÿÑJÐg&ð™`Í0²Âf­-+ôµµt›§}¼Uí³?Û¶I†ntzv’lSiZLS5m„˜…Zl#„ôó»• 0„)XÇ.YvvP„FœDGþ¿õïªúíùζûô­/õ¿Û?ûg ¶Ù{…Ùy´•ŠÛb“Mƒ§LSƒdt’§pÁa‚‘hG¨ âáˆDfDЈ†Ì†1ÄBýº»ý×ïû[Û3ä1þ­³úõtÝYNEpäJȹMŠP›�Ä$ÒN!6’l&Ú -/ƒ’ø†*PMâ#_ýÒÿÛ¯m;㇗¤AÚm„›»YÅ'a'PÚ ŠM6�¦“M…vJ‹{SÁ +¶ B5"lìuþ»i6_¸l2>›h+MŽÇb˜N›Ú· ¦± +EÐSHöÊ +˜L"•’DJQduý¥A¶”=â­°ª¡’„íB„ä 9ç`à`‹9›T¿ª4CƒB Ábȵ8Ž’^ÈíKq;è|1þ!cêɹZ¥*ô�±�ü€€ˆîùby"6Âae0q‘¸(G‡¯-a¤I#²yHñ íaÞZŠy ¨R`0–H„¯ƒ'�¨úÿ&á3²- ûÓ~ùH¿–ày2aB™¨ÿ¶‘Iþ¿ÁU}#±¿ý½N‰…œ�yщgy—·wËy¯ÿÿ&'£:™Ô”„Š0„ɱ�Ì�h2„Á©ƒÙûùÙªÎÒfBh™w¯þHf³!²*) eX©‘àˆN›"¤|"°Ó<èk °è?B>úažà5mtŸûä¡+äoUU\äk<Ã5‘Ôf¸Ñ‚ê#F€`�ÏóG¶vÂ64/Âi «¬4›JÕÒ Ì ™Áœ4¼]t—Ç _ߪ§¬ˆAt8å†x#Â1„'B øã(F°hÎÍ$¤›IµwÒ‚m&Ù5¢fÐM«„ÏšM¤Ú Vö¡:W¶“ÂkyØŸ¯ª©ÙÒ�e)—É�“¤Byì”Ê £�•šÉh{8eA+!6S=&@ÃUÏ“ʆ“pÎ4ƒaÚj—¤M„Õ¸ut­&OëãN–¶®•ÿÿ׊]u#U™Ôò]…D^›3 ¤6ψˆI‚#š!&R a’0ˆ ÍaÉù?¦›'2}Âa&|˜ùgM În8¶·Ž›I¿Ã¤ö\}«¥þ+ûjžíäp±¯ÿº‘Âøî½HÄU&#QÈâ1çFˆC„bÍ�"à0��Žàä&�4kj| ôÒmB44ƒnòg á‡vX†xÒl+¸º'i[¦­÷_ñ^5Z¿¸Òoýß]>µoÿ °�•B z!&aÃ:˜ …ƒ)ð�£á¼TVgú ‡„6–�nLtË=Ú6ÂA¶YÖË=&�&÷tý6“{_ŠWïý‘Âm×[UË÷�öˆrÿþXäeÃý!ÿ®CÌüúÖGç™\ô�³7�dƒ¨G¸I¶O‚kVÙa®Ï´›I×qíÒ¹8÷«¾“Õ­¿»»}¸ûíµÿ¡[«cëí¢Üá¯áË1üaîºÿÿÿù±h;JÒuW“@M®«¦Ý7½ká_m+KKö�}¤›ëß¶ž¿Ú÷_ýÿ–ýÛÅWØûÿÿÿóGÿÒima*‹­î¸ö¶÷õôþª¯_úŠý~¿«íÿôßÿý}ÿ¿ÿûÿüÿÿÿý÷�iU'ï_¶�[·úõ㮿ø.›ÇúoÿÿÿµÿÿÿýüÇÿ¿’ìŽü7ÿþûÿÿïÐOýÅ/·¾6žþ·´±úô[•§þXõÿÿÿÿßÿûÿÿ/ÿô ðoÿü?ý÷ÿ¿¯ÿÈè½9ëlϽ´½ëûa¶ÙëÛ 6 È®"ÔEƬRa´B…±I¶’a6 ­…‘Ð ½ª#Œ1#ógX»gÔ†=éf6ÂJŸI«h'¥·ƒb“MŠc‚á0“M„›M5 Øb¬Ê⋃QB#ˆÐ�¶D6·±LUÜ0’vØJžÚi Â@‹å`ƒ&¡h‹r›Üqá6í6Å„GTж B*1 B,µ_E|e"YÕmx¯á“ú7ÝK«Äv�MÒ°�n؈�ƒ�ò¹âWÊm/ +¦rO-ƒåpVVÙÙdŸéTµŠ`‚#´ŒÚû¾£ +“ûîýT²ÔŒ�#*½'̆—ŠËuœ®œÂ¦ê;XßòŸ;¦�FÄ4ÎÊÂçÛÿŽ¿ÐDvbk[忯(üÈ "'M™Q*dzupËŸßÎÆò7�ê¥s¢1ä¹äæfŽ"tk#Yr82� +3y"7šƒAã?®ƒ,Ó‹¤ïïÌ 2_®wDGõ!f@ÆB +P3Qfˆ@ ¤éÍæ‚3Â4Œ#@frdFgÂhÖÂL—&#ÀšVZ2­ÖX…÷ ]T®#ämÑ&鈌Ä(†ˆH!0îD³ñ><i ��ÃöÌà™*74�4�zMµH'D[aQ‘å-i&Úz Øêûó³U�­þ>¹&ÈQ©ÒDBäb l°öA8Ÿ,¦`Á,5Ða' ¾KRMÞ“i6“¢,44­…WDýéoKÁZÂi´žŸ·ý÷KþºþJžB3©‘£#ó$ +ˆ�62� +D`ÁÃD'‚0ÔÏØD‘ò®ƒÕ¶Yè®u{i6Ë¡h†š\$ÒV“¯ÜœRµ}D8ý/¯×CÛß«]ú¯�¼Õ�Y.F̕Ƃ¨@‚“ �Â4c=˜0�`Í0A„Ñò¸Nl &©7&:I¹24ÃDXa®’Òt›ñÒm^¯ÿKÝm-}ñô¿Ûën«kÓí~­é?õÿ)ÒyÈÔDHΣ9 ˆ@eY~aÂ#¢>i°p…r3k Æ`ÌÌÎA£`r ÒtÒt˜Ðµpˆ±EcI¶Z<ÒmC¤ÛB»…I¸'Þ¿t¿ÕqVýÛªÜcQ­­¥#…÷¿ÇÔÿå�oÿÿ¢†H̉Ð�£áÔÃøÙšt#jØIó4ªÅ;¡¤Ü4°«i0‘8IpL;]é´¯t¯Iý_m½RÜlŽÝHámõ¯ZþJŸaíÿ_ÿ¯íõþ¿ž£ðiüŽØIµGºM‡a2Õ·I´´½BÓO¢QJá¤úZû¯ÓØþ«Š·×ºÛ^Þ>’ÿ›öïå“ÿ¤5ðíªÿú¶—¶¿×ÿe�6¼´Ò´ÛVÞµim_{#�^ö‡Ê±ú÷q­ßúãzìwëöúü¡aÿú_ëÿû¯_ÿ„qï[`Žô¿ßñêÞï·ÛZ¦ë´*µ¥Æõþ¤p ßº üzø~è·$Mmëû¦«¥ú°ÿÛõü"‡ÿþ þO;yÿþ»i}?ÿõñëCß.´¾6µäóþï!ÄÚøÿÿÃÿõý¹CëÿöÿðŽí"C#¿ÂOÿ~ýéÿú\Œýn¿¿ÿMµú]zRd4·E“ý?ÿ¢Ë®ºþÃÿÿÿÿIµTûÿÛýþ_÷øÂ]Š_ÿ®�«caÿÿõÿå‰|X¯Ö½ûÿßÿÿðßÿùÿÿ] Kïü7ÿ¤ÚH-}/ÿ÷ë­µÿÿTºÿïÿÿÿïúþ?Zÿù;#¶Òοø7ÿþ‚ÿoô¿ýÞëâ£K{µÿnÿ×_UÿõöÚÿÛÿïÿÿþÃÿÛKýÿ@°Ú '¿oÿëKöëá±×·ýúûM/ï¯ûùÏëÕÿÿþAý™û­ûiéÿÿÿ½p—¶—ÿú\—^ûÛ]×Þ—ÿò£iºÿý»Uý³Ewõ¥ÛÕ‚ëȃ†Û z¸4Õ�4ÿÿÿÊw¾‚üµý-=ÿÿõ_zý¥]¿Û'Zºûµ~ÙžÃ>­;톆ít¸l>Gm5MšllB§V» �„�  +¯×ÿý+ûKÿ…ûÕúá}9¿íï_ý¯¿w¶}¯Û®›­²ýwi±A�†`Õ0›ƒ"ºM°Š, ‚~Ó]ÃÑžŠÆiPjs²vdVÿÿjÿë…þÕÿ__þ¯VÌûm/ïzúvE«°zlSi6‚AÅ=m¦ÂaS§vM0‘í±yr5¡É=ºÿÒoÛ]ÿ¿Û„ßÞÈ?ì'~ÚYŽöI[I†GàØvGÕ´“O¨Oa„í'† ‘êHås !×""ªý×þýº½[4Z·gÿdo¶ÏiC †ÚÃ0jšv¬R¦Ä$iE4Ó› O+¼MÔT—î»öÏÞÙém²ýØ%"0TïnE†b‚†Et�= ÚtÓÛ'<0ÑÃ�„""Íh_[®é'dy=Š´Ø¤î)0Å0N3 §oV ÂV6…ìí7SúÒ„m+bi°•0ÂÚ�ႪhZ•ŒQÏAˆÓ�jÚY¢:MJÊ)9Ëc*IiÎõ0ºX+‚“e»¾�†5úAãêÕn�´›A °‚‘V(ÉLÆ ´À ÿÈ /î[:e¸ËQPŒ…>¤ñY® ŒõO[¢ÝII¹5M?ôÑ] +å¼GiiíÅÅ5…;¯UÎÒ,qUS«DO"YÝÇvé?U}5 Y (ÔD�fxd8¾ˆI„c'Ììäz õ§ï´úùÚtT)жh*!&E™ ¸‘„ „ 3H¹„h Ó4 ‡ ›½'Õ–Gû_©&ˆù«#ä5“¨ÉP¹/"D`jl`‹€ÌaÃ( ×&±áùù&ÕØMN†‚pˆ±ùA6Ë@VÿWøãz"yœäeÌÎjÉÒGa,@…ƒ#vP� �„h Äñäò ôÊ4Âi1¤CCI‡&ul³Òm1|[KDž¼ÚÞ·ºˆüíW;,ÿ°“ 5AÍ0œa' +Ø[ÓT{i) Þ¨3†®7ýz!_,á6†l g,ÒtŸ +›iB_XMÓkM¯ÛÓ°¿¯ûww­ám?ÇÛõ;0jBE2@§[03 Á÷JÑ;Õ½E/ý­]'ÝÝÛE=úÒèhRoýÒë¦ÇÇýÏLJò1ò +‘eYn{4Î$dD%fÉ>r3ì#`gôÏQa úøªnýâ—¾þ£ýî=~­»þ?íÿÿþ:[à“gšf úƒ8ÌÌÒTÐdq‚GXá°h'“XIÒt�¬¿ &áz‘º‘Ãÿk_¿Ýo¿ûÿú¿úÿë¯ÿì?„jž›vêË8„ÓJî­¸¤éCZJÒuÝ+WùüŒ÷î‡ßý÷þúÿÿÿ÷ÿÿðßÒp«¤ï¤òwõßÿÅZÚé¿KèzØ5_ý/÷ÿúßÿ:ßÿù¢ó¤ÿÿƒý/ÃIWþ.“ÿ¥ªÝ ‹ö¤p«ëÿ°õÿÿÿÛ_ÿ ÿÿ >‚ÿûÛþ/B£ï¿ÿëkûÈy¯ÿðÞÏÿm/ÿÿmþ—ý~©z_÷ûýw¯ýºþ]!ƒÿÑuÿÿÃz ÿmÿÿñ _×Köÿõõÿ÷ßõëÿëü5ý‡_úý÷ø|%ÿÐE +¿×ÿG*þߥþ¿×úþßy?ýÿÛ¯Ãáµýÿÿýí/ý/ÿ¯é·_Õÿ½~’®½û{{iûÿïþ¿·þÿÿß¿wÿNÿ®½w_uí}´¾Öï°ŠþÙɲé†nú´äNÿÿúüÿ ßýßÞÿ’ëµ]}6ÿKK¾Aæbí/m,ÚÁ[/m¤Ÿ ˜0ݶ!µM6*6)iZ°¿ÿûi~ûwýwöûþé¿ÿdË.Ï­t­+ö¶’i¶‚dxJÈI¶’iÚP´þû &0¥[ ’2Œ_úÿïÞïíþÙëaœµ²þ“ Û‘ m4Ø{v–’i¦ÞA Ðm‚(uM4Ò=°Ä$tŽˆäE‘’¼nýÿíïÙÕ?ýmé±I†)4⡤¦ ÕV÷ ¡bÆ�…AÐU´z\0d+ �‚!¡~ßÿúœþöÕ&þÒlÍ^M…l)Qž:�4”UGC"2ÄJÂâ"=[öÿ¿Ûú¶îî˜g¯Òa…m;,ÑeþõÚí·wïÙ~íYR{!+š±I§ &)�ƒð¯ÿÖ”0Ì;M�󫃭ŠÛ¦ +ƒv!‚¾UÐ Â  饯„©†Ô~¥[ðв0Ñj +´’ûI.dÄGJ¿HSÖÚCìŠá'Z „Ù„Y$Ræ^·Y¡£[¥ˆˆ�R„«¥„”Gùb3¿ŽÝ�ˆ¼|¡ +§ØKðå²5XíÚˆpo‚ÿ½_ÿÿù#ÃØƒ'ѺÅF{‡&> ãIºE[JÒ,.h&Ó#œ³¦DcÐL6ÕÐNÒß×iýµ÷§]_üŽýRÚßùûþXäj8úíõòƃHßÿþ«ÿ'¤ÃKIóì*PÝ¥m¡„ÚW‹k~ûktÒxMu¥´ôÖžßeÒ}¸iÔŽß�wõ‘¢‹ssÛ¥ñÿÑuƒþ‡×þÕ}‡õÿÿÿÿÿIµt½½_¥ÿî›KÇiµ\~Ü]úßQR8Vô�Šwûäg¿¢ 5ÿ�ˆúû¯õ°ÿýo¯Øÿÿÿþ=]-'ÿWôÿCÝ5½ß#…}_÷êCŠo–7¿zùuÒýºÿö×oÿÂ8ÿðŽíIø?ßÿÿÿÿõºñÝÐô•zoûä‘êÿ×Ö`G×½úÿÿÿþ¿“ß½`ß÷à� þéxKðÝÿÿÿÿýþ±×ùc‘¡ô?¢Æ½Aû¤?ÿÿ릿×ÿÿÿÿרA?¶‚Ãþ—ýî”/ßÿ­µÿ»ÿí­C¥ÿúL?ÿ÷ýíõÿÿÿÿßí�è/ð@†ßÿ×þ*)~Ýÿ×ëÿûúúþ­ÿÿá¿ÿÿò|?ûî¿ÿÿþýðïuþïýþ»{N•î@—~½oÿ·íš/ÿÿéÿ†ÿÿÿÒÿ½+þ¿ÿîÿïö¿×Âm�Sÿúýÿ¯wMïë¶—~Ùý°E;õl¿äBÿÿÿ°ÿßßþ—öìTUëôÿîÿþß·ªÿý~Ù:ýwÝ«}³ö“gû»´Ú\‹�b˜ôÓA±Iÿ^ÿ¶Çþýßëþ¿Uûïkÿ[ÿ»ÿoý¿ÿ�Ç3>×öÁ/‘Ø`Šw\;¶*öBÌ"¾Ò6Ò6i†i…“Åa"¸¢ûÒ_ûÝÿý¿«¯ú¯·µ·×ÓÛmÿ¶Øg½Û='ȃ‡{lUÓ"Ý6(&œ`éê�6dtM4ÕE#ó BGæ2«™ ûUVÿ·ÿo¬ëÿ_·Kÿûmšg=Û3ô®Òlõß¶zm4ôØ ˜b“¦)4Ø'Tì0 Â …v+(M5+q•‘ b"#6á�z_ýöïûI¿õlÑ{¯þC¿lôà &õfÒ]&)5MX„È�Tí…l/ ðÉúi…!ÏH0@Ù6‡ÚûÙŸ¶~ý³5«g««/Z † ¦Ú +ôî¶š±LSÓ†!XA^L+[°Â 0¥l²v¸�Þ¢Øg–¶ÃWl%"[M�â Št¢“�a6ÒL&š»¦ƒ Á8ˆ0PˆãŽDØé'é¶‚‘Ãcí6!S˜V¡©PÈæÂ‘P¢ƒ�tkaˆH®b"#+pÇ~›Dt¬' j�a0�¢BËâ ̹GÖ눈"‡M�W¥¥Äuý´‚¥à“#p‘­ú_ÄG�§CPšcA£ó"JMÄ�ˆÇþSen[eq$y Kk¥ ÝuêY•£‘Ø%àøÉ°Ú;+ФvìíM… +Òwù\Ë)â^ …UÍŸ÷ä©|“ŠS +¡rÿIÝÞ½r¹bȪ"¬èf¡Ô’ùØËëÝÞ¾Ñ_³!¿×;‘8ˆˆØÈdh)@Άª`g„k9¿I¯ýÿ¯ñU25ÈéI3:Oƒš 93 ¤ +#¢<#F`aQ„ £0hø#ãÙÜs›¥D¡0� m&K“ã»»‹øãùYÈ–Fdñ¨‘„iÍ25d]HÃT#ØaÃ4Â���ŽðƒÜÂXaÜXG¶G†š„›Iéºa¤áQ,WJMÝGüìÇÿä2©‘ãY¢ CÙ Á0dèÛ=0fšaÔ~= ì#ãG¶g&–“¤ÚlÒt�–pg &ÒÒl"~x¶¡êñQ].©¦Ò÷[��‡ÿ¯”µ’Ø�œd´R@¤âêle½ ša5P˜A:i¤è�ØF†‚¶Y +ÐÒt�y¤é: ´ ¼j¥i:Mÿ·Šéé_îýky-ÿ%ÍsfupÈdk`˜)¼Ø9ÂT'ÌEÙŸA”g°����„ky>©«%²ÄÚ#¶ËVÏÚ Žuha¶•éZ% é´žÅ}µtýõÇ·iÚwR8[¸Òw¯ÒDT'ªe&Gˆˆê^`²Aâ:#¼ù¢¬2—�0Eã #Øf’ Aä[N¡ÐÐWæm&6“i>3í&–Ð&úm-Òÿ®ëÓI¥ÿñµ¯©*KÿÝpW ôÿëø×6R‚ƒ+ 7(QÁ dŒ aâ°²·á.SÊœ˜ëF· ¸3�\!¤á„Ó l"1é7Þºé5ÿ¶ºI¾îÝn5»º‘ÂêG +ãÖÖ½¢Çýw×ÈÔi¿÷èXpåÕ_ÿ¯‘í2Œõ'6™FÜš*ÃDpÒ~_= ÚOÁ+¨Lñ¸Þ· ´´J){épš[éµ¼WK÷ë�÷qúúø.ÿ\<ؤ?ÿú°Øÿí¯ÆÏ´›—K¦xÖÚT›@�/¦ô­'Ò±WwÝ%õÑÇ�·u[Œ28•úÝ {ÿ¢÷_ÿ¡èvúðizì?ýÿØa¿ÿÉðŠð»[koû¤×ííÿ·î¾’½?\^ð±Ò÷T½ +ý!†£þÿ-?öÿýuØkþßþÃïÿÿüÿÿH]´¿ÿßN£éo¥ûët:Vïþ•c×·ãò¿Ã×ëÿÿõÿý†ßþÿÁÿÿÿü;ÿþ—‚ õªõ¿[íøÿ}:è&ÿËþ¿ioÿ°ÿþëÿÍ/aÿÿƒ„¿ðnÿÛþ÷ÿþÜ7ÿúð†þøÿëëÿï÷ëÿë×ö×KÿÃx#�ÿm/ÿ„ ÿï  ¿ðÿÞþî¿ëwí¿ýT+ÿKÿþ¿_õê-‡ÿÿ‚ÿ£» FÿàÞ'ûÝ/ߤ½/ûýÒþ÷}ÿmõÿ^óißÿÿ¿ÿÿûÿÿØoÿïÂ4´µ¿ûéø"‡ ÿÒô¿ßwuýþ÷ÿþÞŸúÛ:tµmÿÿ þÏÿþ¿þúÍ �ÿ3Ãÿú ý÷I-ÿðÞ—þÐ�ÿªúï÷ÞPµ_¼—öý¼çß¶N›mµ¶Ïÿi0Ïm÷kÈ®l_ÿÿÿúÿýí‡ÿÿÒûØqI_ßzÿ‚ÿõÿþÞß×ûkÕŸ_k×í‚Mž›A-§ •Š´›H1LŽ)§i°»b ÿÿÿþ—þõöÿÿ~¾þëýû”‰Ýý¿ô­{Uû?Ûg¥¾Â8îöûVÂÚ²(áÚL�lPb›I4Ó´�l&"‡Pi0œ‰Hú¹WÂG;÷ÿßÿ×õÚÞÛÿÿú÷þ»Ú¥ßÈ>ËYÿîÒ‘]§"»í6 %"ø¤í+ÓM�ƒÛ ÅÓ ˜˜ªÔ0L Å#L£¢9ø†12šïßÿ·W¯ë½7¹ÿÿöý}÷«Õ³ùëöÏ×L3Õ„qßêÃb•8=(+N M; Bi…m‘Ûþ,2Z„�l¡…£%(DE_ýÿíþ¿¯×kíõýöÙþû»†žò(áí®©ìBm ÅXÚi¦›l+Ú²:'h£hV²ŒDD`‰²Ôµ¿oÿnöë[¾ÒÞ˜g¥»Õ4òúìR¦Ã ¦Ú¨&�lBÐi„à +A„ï*2°£”v�HˆŒ"Ê¥uõ³Ò·kmÚn—r+´í$ÛH1IÛi&¶Å&i4ëM‘ÀT.èöà È×+ˆ6v(Ÿíl2:NØ«`ûVBÌ; „“X-4wam‘ô˜-¹CF9JÑ! `‰B&Â[ûh-¦¡„é; &ˆiˆ$VI ¢]4#–U‹ö �„ Â-!:´ÁŒcÒ¦;KGoŒ„Bƒbø�ÿ)°U)�Fv¡„ÉÔ¶ 2Yʤ¥ªrÔXeJ+q*‚…Zk~ZŠi³H*…_~¾YK î%p¾îÿŽ2o˜# +v©!w÷w;2ÁNÖj×Ýò4½…í&Ÿë|˜ýò•ˆŽò�Α~v½(ô?ÿ®v¨²�#Lè<Ù: êgå)ó ä ò„gH3n{íL–v&…\–d ³’yÆu"\gAI“„Á>`Â*ÃDI›'‹•¦�a„{foKB<¡“xTE‡ ÿ’è~õ¿0ι‹Ù<ˆ�6D„mŸ˜fy!#CˆN„#`aGư4nzAµUnLzMÇ¢°0‚ ¤ë œ"^©™¥zÁ:ݬìÓÕUtÎÕÄù©�u ¿Í#v0‘†  .L*L6N` ’ê<6]ð�Žƒi6“i:O ­G4¶…&Â%^­}×ôûúuN?ªyÕ®m�FIŒ¡$B *Ë¡XP™à@Á£[1„l~“rPÒm&øL´3ì&G4l;õbî7­Ö®–•ëi:ÿt4Ú·^)tÛí©.ïÇÓ*dt#©hˆr3¡¦n0åˆ!*!<Ð £0h„È@Ñð0��¦ÏI¦†DH�ØF‡M¤Æ‚mš�&àƒ´Ÿ§úu¿IöýÒMtšIõ×hkÒwít¶¿ïä=?¢Ç#Ú „D+yHGAQAVFA­„]�î¬2 eÑPH ²ÐM¦²c©ÂM¤Ú á²Ï ¸Iµ@˜zéB[ýuuÖ´M㿯_Wj**G Æãëo½8úû~Ú-?üf¡”#c$d 03¢9¤*OœˆyôÙÂ6„-Ú +Òå�m¡a0’l,˜2΃jÆ º´®ž–šïÚm'ÝSþBû­!×÷JÿÿôC“ÕrH¢ð ÿÿ÷õÿÿÿØi„Ž ô¡°“a¤ÚVÑÚMËK«i6“º·¾—µ­ïúÿO¾*»¿ZÞG ú,q qýÿ¿ÿÿ,N«Cãý?ºëÿÿÿô›Aœ5iSÒ´�&ÚŒ“oM¥k¯¥oþ“¸û©*‘¿»è¡ï^?¤ˆö ü]×ÿÿª_ÿ ÿþÿÿÿé]=Wë~®«íï¿‘å‹Kÿz­ÿºÿ‘—ÁºB?ëøÿíüÿí¥ÿïÿàŒÿÿðG¿ÿÿÿ§Wö×K[ûkJúÖ4¿VÛÔ÷ÿ¡Hÿÿëÿïÿýëþòþ‚ûÿô¿ÿêÿú‘¿۵á~´†ÿÿÆ]_¯ºÿ_ýÿÿV×ÿóÿÌÿÿí´¿ûKûýúú·Iõÿÿx‚ÿý!_~ÕÿJ¿öõ_ÿÿÿÿü�‘ÛÂÿü%ûÿñ ÿÒîþõÿÿUûõõ÷Ì3õÿZÝ7ÿïÿþÝÐGÿÿÿÿÿ NÚ_ÿIïüî ÿºÝï}}ºúzׯ«ÿn¾ëÿÿ†ÿýÿíú„ÿÿßÿÿéxÿÚõÞßõká!ÿõîß¿í×Öþöý/I³?þìõþëÿÿ ÿÿÿߤÞ_ÿÿßÿê¨ÿé.ÞÿïWßþÝ«mÞßkÜ.ÐN•‚0û»´½&+M4دûh/ûþÃÿÿþãÒ_î¿îÿÿþºoûþÝýÚüƒÏß¶í³é³û ål3rr+†È¾Õ;I´¢i²#ô“Ò $ÿ /~ãýûÖþÿ«ÝÿPØkÿuÿw÷íÿýßíé^ÃïýÐM‚¶ŸžÅC ±†)ˆAX¤à¸M¤š<a„©ÑáƒC‡.�d,¿�ÿÚÛý¯÷¿¶¿ÿºÿ¶ßþÙ¢ÿù s?¦žÃ1ZVØd>;`Ó´Ã & µMÕ6NL ÂG†R±´! É×Ä¢‡DDfˆïÏß¶Þõš—ï_»wÛÓ½¯}ÕþÙý³×y�VÁ%´øl6ؤôØ©PÁ:|0¶ô¾HF˜bL$z9Uɾ—þÿïµm´®û3Û?·ö—X ï1î–ȹMŠb“MŠ  Ø¨iªm5a„v +=gH!)n#öÍÈ<þÛ{Ó}^ë~Ãl+ãÙÚMrWMŠ0ÃIÒvÂa.Ò43FE\gÊ+:"""“ý°«m¦» ƒqí ™r¹¤©†ÐL4Ó A1áÐX´Ô¨°‘^ÑXëEp-×û­o´Ã"{¤âÈ¥ÞM"®Q†0„D0Œ‹¡Kºøa#ÃG†k4PB®CDk¡g�ZWÊÂrÍÒm ˜ êúLŒr‡£®!i±1�dœí[¼m¤;AJÞCÿÿÿÿÿÿÿÿÿÿÿË4,Ig �R“e É/ÿò‚•DÙ�–¹_-r¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæB@ÿò2§X¢'Èy×=ÿÎË£á òF`ðƒA¯ÿÏ¿òiž•¯óûFýß÷ÿïžoÉÿI´˜ÿÿÿÿÒÑÞŸéÿû÷ÿ÷ÚîwÏÿßÿþ4*ûÿÿýÿÿöµ{Ûÿ¿ÿû¯ÿûïþþ¿ødt¤û»ò•û߯þÁý÷þß_÷â¿ò&_ïÿ|ûÿöúÿȽh}ÿ¿ÿïž¿ý÷¿ëÿÿÝÉ4ûïÿûÿü“û÷ã¿cÿïÿÿëW¿ÿÿcïþéº_z÷ÿÿ×í«kO÷ï é_ï¶¿±LWï —ûÿ¾Ã ~Ó 'wíÿýŠü"¿>""Á�ÇÿÿÿÿÿÿÿÿÿÌ”ƒ™„ÿ“N¹DCŽ�LòŒð9°@˜Aüì¤Ø!àç�=�éýsVi¿“@çòF¸[ùÎýg£ùê>ªŸ÷ój}MYÎÿu¿ÿýÿ<ÿ_ÿÝë¿ÿÿÛÿ÷ýÑŸÿÿÿÿýÿÿ»Gÿÿÿÿÿõ§�÷ÿÿÿÿÿÿ¥þ®Òÿ½/õÿëúU~•1ü‡âˆ'ú_rˆuñþßÿÿøþCöãý_ýoç¨úš³Óûÿš¯ÍGÞÚôßýmþz?ž£ê§;úxþ½ÿýÿ¿ýúÿÿÿÿïÿßþz?ÿÿ¿þÿ÷ÿêûÿþ¿úëÿÿÕñ^¶¿ÿúº÷ÿï÷î›Kì¡wý[_ÿý_®6+ãÿÚ¶—È>o÷¯ök Áþ!1_ÿ•ÊߦœDGþ"?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ>d� þ?ÿã�È TAvÕEš,·,…+ªûßUþïõ]ßê¿ÝÕ»ªùûžïE¹â8áaøãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿå¹/›å�Kï_›â*ÃÕñ¦¯ÿ]Úÿí5ÿÚkÿ×v¿ßC-“†H)ËXÔ2´†ÀôRƒ$ùg �Sù7 ›ä×+ɱ0[ÿ“\«þMr¯ÿÿü�åQäÿü¶õÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÙR%h¾|B`1ÿò¹sòâ<h)!>HÌá3ù#ÿþUHÙ‘!¨Ô2|Ÿ=œŠ0ƒõ]ƒ÷™ÏÉïù�±y 9ÒC4aƒAëÞvþz³Ö_´i¿'è[úùÝfK"€„€¦ƒ$ è)8'•¡Hc:ÅÓ=á÷g[šuFç¥ú7ÿÂm&ÿßÿ�“ƒš +dñ!œ`¡0ƒ ß Â ?¶Â/ŸÏF´´Þ“z]é7ÿ«i?ýÿûÓAýÍ75fç?´os�ú?ѽÿè&ÿnûí4ŸK½'ÿÒz¿ÿÿÏ78ÃsF›µžŽƒt“i6“é6“ÚÓèñÑŸ¼ñ¯K�þ?ÿ{ÿÿÿaé6“kïý:é7¿ïNŽïïIÿêÿÔt¾úÿéÖÿëÿï¤Ú_þÿÓTÿþ¿üïÖ¿¾ÿõºÒ÷×ÿ^ŸýþßOMÚÿøØ­ÿãB¯ýÕî—¯¯ÿíõò²ÿÿÿÿQ^�Îÿ×·§ÿ¿¿ßÿ÷é»JŸ×ïÍ"ëÿÿþ¿þÿO]/õ°áþ—°Ö¿Û¿ýoø¥¾/ßЇók˜?ÿÍWÿýkëk ü ‘ŸÃ#µöGD¯ýù™þ¯_Ë�ß°Dë¯×úÿÿ ™ýþ*+ ˆ€ø`ú¿Ýø?ÿû™>ú¿ÿ~ÿÿÿÿÿ]rP6 ?üš¿÷çOý ã¤>›öûÿý^¿ÿÿͯöך£QÎašŸÎwáî?Ýõõä¯d�½×ÿºµ×íoÿ_ÿÕ7¶ÿþÛ�ûý¿ÿ©éç£ç£×oØïÿÝ[«¯zÿý�×ÿÿíÚïþ’5?ßúÞ¾»uß»¯þÃK +Úý¯ý}mvÒÿÍ[›þ¿É'ßßìoþ•?¿NÚïïÿi0Òm/`Â_úÛWÿÿïö×þ÷Zÿ{_Õo«Öô¶ÿl/þÅ)Šö*¿¯ö—þëi7ÿ½ZJÿí¯Å~¿ìW~ì…þL&ˆaô¶Òm-¯û´›ì%ßÚ¶—rû°ÂGþ©ú~œ5½ A„9Y\­ûJÛI´¯ÿ�~ &(1_ìPb«ÿ S~W*8?ñÈ<Å1Tÿ¾¦ kØMêC‘;Ø?ð°Ða9Ø25b#‘?ä&Ÿ–õ¸?`ýƒÿ°~Áüþä™Ëÿ`þÿò þ!ò10¿Äð¤ÿü˜© OÂÿ º€¾B‘Ñ©ÑÑàC€†ÁÏ~X¨/@²1•:ô »]{ÿ!ðX Í3À�i”g¿œ&y¿ŸSjtç;þ�elSL‘œÏÐ-oša£cü£ÇÛþ½þSŒ¡g³Áø-?n A7Ó¤ßÿïÿÿÐk÷ Z7?ç§&ýÒoÿÿÿÿ£sþz!à\Ø9È�Âh0ƒAá4k aç[›ß£{n�AÚ¢ÇußsÍÍîs¹ÓŸÚAºž�té¿§ ÒŸÛzüQÏ_öé¿Õ´¿nëßÒ»¤“zTßê»{{}=:ú3ôgÿîÝ%vé/ï�ßïÿïíÿßý‹Ò÷]¯‚#ëû}ÿ��}__þÝ,n¬¸">¯ÿýÚkíô�Öÿë«ß}.Ûÿ¼öHÜQR‡i7êëÿýÔ‚y‚*ÕõÇá‘MÀÕ&G«¦GVA;Ö­ÿdž 0××Õåûò%H0ll÷õÿó«gBÿoîŸÁ´©CS£XùëºëÿÍ7†ÁºøøêýÒá·%ßýqzëO¶ëªë¿¶»zïÿÿßþi¾i¿ó‹A[oo÷]~ºß5y�뤾¿ûÒ¶MÕ(ÿúöõ×ÿ½uý_[]%·ÿÿ_]tëéS~Ú·¥në´¿}}uýµ´ªÒ_KŠ´¡„’¶Úí¯­{qQ]È?1KOïAˆAŠA[°—¹»õ¯ؠ×_‹‹ ‚[aŠÃ^õÓLÛh5ÛCE˜d;b)[JÚÛJÚVÒ¶•Ò¶ZÅ@x"VËL¤Á°Ë0\ A¶Yp @ª•²ÝT  ´•³µ@:ÒVÈ09!\TÒ¼�( * ¾ÓŸf~­È†eDn§ô­È-„Ù™FâßJÜ�àY">ºVäÛÇý+~ŸzVÿý+ë¥oþô­ú¥oÿÒ·þºVý>ô­ÿúVÿÖÒ·÷ÜU¿_«ëV×û«~ŸÕ�þ¯ú-ÎÂÞ¯øãW惿êú[ÿ~Fà~¯Ž?_üoÿûÿßþÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäÜÿù¿ýëË@ºö#÷˜ºðãß±_þ¿ý÷õÿë¾þ¿ýwß×ÿ¯ïßýúïþ¾@�”£ãù6) �SòíÕ2ʤ ¥ÿË\¯ÿþMr¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù 2Vÿé„ÊÑ�º!¢B<Ñ¡£[ùAš2Dq’iÝú ºoè4¾�ó{ýÒ„_0‹÷ö¿Ó×$fkÿMÂnÿ»÷ÿµ¿é:O­ªð¿á„ÂÅ̃ÄDÿÿÿÿÿÿÿùÜÌë—.2ã5 +O’?ù30\Ҍރ‡ÿÓEØl¡ÊrôgK¿ó²‚3q“¢p\Ú$fbüè„6"Öü&ïùdñFp8AÆ×Aÿtßú¿ÿ¾Ñ¹”Vuýßî“èîý&ïÿ|ôi6ÿé?úßÿÜîÿ§ûtúÿ_ëO«ý>ÿç}ûÎïýÿ¯êÿöÿ­Îÿ|uÿ±û_÷õûÿ_ß¿÷ñ_¥^ÿ÷Ûþú¾öÿÿÿûþ·¿ì¿["�y¨ÿ_ïßý}þM7ø0Oü_¿·ÿ}ÿ ?ÿ ÿwÿëßõ½¿ÈG§÷šŸþº5?u·þ>ÿ ñ¿îõ÷î»×ÿüÞÿö½iæ›ïÔ‘¾�OÿþÚZ¿¶»þ½�«ú½Ö×ý†—ß± «ï®ºýíÿìW_†ºÿ¤Ú^ûi6—»†ˆˆƒ>éõïi7õ}„˜¯ú¾ñLWøbšÿ×ÓL!Âù\©ÿÿÿÿÿÿÿÿÎÅà†¬£ÿ�H‡F€¸LϵÿÚ§=õó²£#a…ÿξßkò4ÌœCL φ ƒ þÿßm/§„ô^Pæ¬ôª;¿÷¯Îw2sMè.«ïÿí·I7ÓuïðDyêÿï_ý/ßÿ÷ê¯×b¿¿¿�ÿÿÿ×ÿ^‡ÿÿÒÕøö¿ú÷úþßÕÿÿ®¶½/ÿþztÿa)¾Èºd‡ýÖ…ûzG¿š †0ä£þëþúMÿ›_�O¡éÿùçÿ§üçu�|?íÿú·þ·ýûöÿÿbºÿÒoÿëœÿßÿWÿ§ÿíÿÿþý_úßÿþÿÿëÿú÷¶»iÿNí?öØ^þCüDDòòûÿÿß !pÂqÿ•ÊŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæ@Àð1øÿóµ°<üò‚½Dk…ˆÿÿÿÿÿÿÿÿÿÿÿþ[k<¶‹YìÜ -j™ˆ„GŽÄÌìÐlB©i ²‘AL¿$oS™öO,Ѝ)«0† šaB?4ÕÎÞþ§iò[˜É<àBŸñd¼9/„_Ôì–Òm&Òo¥õ¤IAsBc —i Úh ¾‚×K^’J¤Ø°>‚A“çNÐ6«Mú Æ•´­mWòI©DF@ÞK©¥M½m×Þ!!.µ¥#¢:'~CeãñèO³I2p¦qÆìæÃM>‚ÿÛ¤·T½uÑO: ‰ÉJ2ù¤qšŒó6ŠÆ’@�›P�‰WFÈU _­/ªJÇJé#±™9šŠ’­-,#ÀaÃG°ð‚a®¹… BøARJÂ;ü ´qázW¡’ÿÌ•š‘ïÒ Ù›aÏOùýUB;Â;°–•$ßU¥Ó¥IRZ¥„w¢�%é6qtÔiiaZ Pªék ‡ùØÓH/TPd|é0è Òµ*6êa*ÞPÒm¡ôªœ#KAh-ZK¥UÕ-EE}Iit¡Š!�ÒJ+k¯UI.j�":#æ›4ŒÙÈ�¥¤–�0Ò|#;õA:L%ÒÂ;ÒÒ +ô½TŒôZZUZê—úé$—I(â•iX ¥‘Z´—ª­%ªAR-}R ¥ZJ“ ›TêÞ–º)áè----[ÿJ††‡ZK]%ÐU¥Ö«ª­i*ÿôº¤ª©%ÐKŸÝ& ×ãÒ´—ARM¨ÐKKA*UZQTµI%¥IuªªêGKJ’úÕ$µ¤’~’]*­RK¤’¤µ×Kê_×èÝV–—‘ÅÒ´º_IWB’�J’×¥ÓÒÝŽµKI(AkêG=$°‚¥.—ÿÒéURéx‚¡UWZ +Z +–wjº§õ¥Ö’^–:ë×õÕRô¡-/­cõ%È窯¥ÿÕV’ÒRÍŠåÝWU)U%¡ Ò]RZª¥®’XõÿãªZªºär¤%¥�þ>)UU%éU$¾½ÁúúªI/oõÒK¤¾µ×T–•$¿ZJºç„ú]W^¯þ– Š‚8õ¤°GWúÕ%Ô ’×Z]B ¥¥uJ—Zõ¯ë¥öÒ¡Ð]i/úõGýt’ý/ÖŒtéh-zB¯Z¥„‘ÅNº]. ]jÒÖ–—ý.Õ/­"è ]µIúè$ŒtcëëIkAig=,%—TÙïÖµ\ATÿ"(T•n‚þ¿JµIΊ´«SªÔ�:Z¥Ùš¾³5ë׺T’ék¥¥Ö•¥Â][I} ×KE¿Ké"9¥UIWZU’«Zá,ºNôÉþ›¯×>³þ_mjÂXA U¤¿"㨤ä[RI1T½éU%×ûzT¹„�ù宦7UÒÕºËëYu¥÷žé +ÒÒJÛI´›¡ØIbÂt&aVÂáA4Õ0½$Ts¯_Ìn—Y¿K1ç­Ö–_ÒÐZ^‚T�aÒÊLXm„•[I°‚A¬ˆr-*b5Pƒ;ªØ~?Ô!h²L7ÔÂHU,¯ÒTºlúVÛI% ic l$©W¤è*P–­­-T. ŠAí„h$(€˜L(L"Ðh¥¬=%]³ê’X­,%·éD(í‡QVµm¥¦la †]ªªš« )XÑF„f†ü6ô¢–ÂKiS¤ÅV!0ASU®ª¬C‚P�À‘^x2q î¼ñ�ØoÔ8p©�0„*mÖÃB¨Tt! ˆŽ4dWáH:­‚åp&a‡*âI6#ÓÑùÒ=†Ó·)ƒj¯‚lE'­é÷ï«ïN—{ÎÊ´›K»iZL[VÒŠI¤,Ý � �¡¶�c°ÈøA Dÿÿÿÿÿÿÿÿÿÿÿÿù`Í,T Ñ)€€h +?ÈdmD^¢Ù¨2F2Ö 0×–¡¨†æ ^Yµ˜.jÆZ*@\dÜi0h5ò½@ÔG ¢ä^.á Ú8 ¤jÆPa°roQبGþ@ag,�„Š„ )¯ÈhÕ‘²"Ì)Å岄vh�lî§ŠH\u_UR2®<É|1‚6A‹CUä8é_v¹k,¢_&2‰ Eàjê‚m+Y.ÏÔ�ˆZëùk°¡(pm%½f­$›§§nŸß¨í"JEò;ë~’§èuÒ¾¬EqÔîkSC$E> +stream +H‰œW[oÜÆ}ß_AÀ]&3÷ËS!Ëv¬Ö·Z �RÔj%±Õî*\*vòÐßÞ3œ ‡äÚVÛÕ&œ9ßý|g~]PYqEð?U�Š0aŒ¦E‰ŸD1&UÁ+íµŠÜêŠB$Ñ…¦TTV Í•-ÖÛÅç[R¼Ü/þ¶øuÁ*ƒSDXH„R–9@J µBšá¢³§ iLe9£ÒŠBsK+-¥6œD¿€¨ÑÞr++ÉœI^P +M4ìe*&!œ@©­¨uˆ½�œ«Åñ �'ˆåœ9bêH}ø¼o¯ãg�‡ûÌÀzƾ\®÷»®nvÅ Õ‰.w�Û«M;Ä + }bbÜû› &EzDøÈÃfýØ5¿%ÇBDþÓèØ]ÓmŽ–Ö¦Ò2U!lMÁ26XD÷AWé¦ð7uêbÕ'‹2í8«,ÈQ‘õDfQÅâ¼ šÉù/_·ÓwåLô=#_ïAFð·•§«ÓÕù‡÷¾yÐT"¨¾KÞè»@ibGþ´úøÓjÚtÂÀ\ñîtõéüï³öÅ9KôéÕ�ç«WŸ|=ŽE-(Jd]!pÆ”/~^Íš¿PqgM›þØ‹·ÎþšÒ"S«Û0÷Cñ\íQgp6–(Òãùç}zZ¥v+ +k]I‹²†¬úÁޱ`mk"}{ÿÞÇ€½YÓ†M0Å ÓP§– ˆµo;�©åaFg–…š[r€VJáÐ'[Gâs?Áº¿ž[±ç8ì;„:d�áÅÈ>1ëNf9Çàß³œâ§�Uþä¸�YÎ0Ä“-;ºæaõüOïMCÎLAä“Mcß&êx‚éÑ­‚HÛjj®ÄXr7ÄÜÐþÄÿ ­Ã7­¡Ëp¨Z]”ŽrU« ­ô|�J§�Yå$u¿°^ž_||{úsqÂÌÒS�ÛS^‰›†HzUB-¯”qËC‚©SjwÓ­ËÒÎ FÃE†”jͰøh¸w>¥ II¬ÂGK'Iü6ø6CRhØ1C}“µGBÅ4rI<î36•cü\”A$;ñ*€×Ííc�>}4¿ã’Ç5þØé=™¶ÎÄbž¹\~Úwu×ì‘q­–ïê®m¾ø’}=‹{?lü¯¦1ô‡‹˜_4å,ÅÏø±ŒQ¢Bô1Ú7ÆK*×BC·ÐÀÀ§çg©Ó‰×>Ì_c. +huÖ¯®Ñ­—›Cs»Kš‰¯ã¢ÅçuÛ<ø4=UJºB(„h‰í-­îÒ“€ +Åý Ù¤8Gî³0¨”GG®Ç~zmÇñ+pÚ®9t‡áÙÏ(m â0éQª#@=G£ ›¬¯÷Û‡ª?<5†àb�âs}×<<ŸÀ”ÔTî=Ó¿Ôd˜ë» ô#ç™5ÄO•‹@HdµLY'™;(ëèëæz!”ÜF%ÖøÎDz+•¢­»” H*_¨ø±ÛÏrH¢ãÍ—Í}®É:rèBçö[¦-�ªßÙF +]Ö»ëÀ É¦˜éx.r»<¬ëûþ%N†tò*Qü±¢`И�¯TCꡱ~۴ݼÆèi9¢uÔ”|ujn™rzÓî·3©NO¡_Óe³{xì²µ’ûphþ˜>jÀ<%ÖÕ Lë±Æi…+ÌfsÖæ�.ˆ©DušÃÃ}ý{qbeo°ó)L?“é°º^¢Ýõ.Ÿ®žü¨ô}kÒ›ö •|: Q‰íÌÚ¥ç!m&3�Tô�Òç¹^»rÇW&6àѸeñMq ÛÓãi®>Lçcâ—ríag×Ò-¡ý›Ößqµ +|:ºqvvþçU¶#§á“þ٨Ʒ.—WÍ®nQÁ*%ôå¸d% +r&j«ïjg~u7o;Ã"Q­cÉòÎ&<›­®nv‡ BIñ˜…àÍF¨»k7sâÈúÜßìÖÝ$ùÈ�Š´xèíaJØ!ñYy¹ ¤œ/ëv–Q):pÝÃÌG%áAqñn\k•Ú›:ÇŽ„�Øq»?t¹Œ2†·¹¹iÖÍf7�OÛ´62Úž³Èò¡Ý¯Ñì Ëj’í¨ØýãÕýÆåÀ¨åÕãÍͦMüZô‡a±Ò¼DÃvM;‰ÈÄ“�”j ã:V(ðÛ„'‡,¤˼Û�6Óѩ؉Íöá~³E�x Ò©cÛMÇnÝìê>5³ýĮ̂WÍöñ¾«w›ýã´³AgüÛÁšÔ<>ÚR‘åý¾¾î‹Pæk1ˆñÔßÇw«¦*ær¼žéÈñÞÆd–ŸoþT_jc}÷ëõc;m,æ$rˆæ,k¬H‹mnhØã“rND†KƬ†ØR<)ƒfç\-E¶ì£Hì±\Š ù�¯Â8*¾íS§…–_^ý>³jTtë˜$±5/ãô9>P±ÙþñönJ xÔè´k½¾¡ªL§¼Ëù3ªÑP�ð_9+¯šÔZi` Þ›²Ï€ð„°o»j”€ÔJoÐe‡»úßó†À°$µ òn÷÷saÝÿ�¤¨Ô�][ï1ÑAlÛí˜X'4ëåm9E]YîVàtOz#ÎI¬)gc†7bÐa!Û!QIj¿Ž&Ç š¾ÂàǪWžòss�Ð|eKª*%FÊqÿØÍY+KéÔª‡1Èñ‰Mã<0rLJ°d±¸IWO–%¥¹®®&ø¥íÙ: `•KcæäMÔ¼M{èfl5´v¿­§�¹|ãý*E+.Í<¸cbx¬ýJµß¸ôÐ^©“Ñìóv³`�<Øá�0òyxkœ�Q½*Úîºn3‘­ ¹b\o@>ÛzþÔµ2\ÿM’ÚHÿ*>–#ýAGdžíðag;·ž SÅt¦ŠZ ºwüé7d*%ÑÞ“ÛÓ H™/_þÞ{<!ׂÑÇ/˜»ÿ<6úvH.ÉraLK3Rá8 ãÚ#SBX:ç~:?z¶Å¸5ÚŸ¬Ê&ÐGŽCÄ¥5\#bï|ñÓ6~)é%àRÐ$fç‹rl®`jæ~¼•!ú!–V¤š_á�~p# >�ÌKXÍšI)¤”á×S‘ÚL¶Ü‚WÜGXŠÉ‹4œQ$sáÿ½)£à+ܹ‚XeeÕx‘è8ôaaÒ ;»6«Àùc�[âÊ ˆ¼õÞ†Ù:HDÉ jG¹úg]­ +…i†ó£Ól4*®§©.¯ ÙR²j¿cE}bÌ·ÎеùÖwU@æKn—œJ—ô6ìäkA�öÕ?YÑXïf-(øEqÓVȪ.e•=ùå`Ï4&2ÃXr[߬ ¯üDYÐIOd,hÜ‹#z²OÉÃ{½Òq@Ƀ$[‡îƒ’•ö­‚ ¸.ꢿ}¢õHI×áE·¿á²V!i)uðå?~û×ןù#îîÈ�/¶®:Ñœ^ÆÁËm?Mm —¨#ç:¶À8'£2P÷¾�SÖ[¿)ÞgA†O·;…A³Xñ&Ã'ØM:úÓ&/ëèuq`çUš¿ï=(ÓàRHoG¸T7„ÈYqzînÝÔ.Ýœ&¦¬ãq Ñec�øÔ,Š!¥O�[Bd¯aY¾¶Ã#�·ZaC6x�.Áˆ®XxG³Øîˆ‡Ž,€Jà,~üËA·ÃoÚ.XL3 þÔ˜-Pâp¨QÆŒ«„[¡q®Þ/ÝÀØ_>{”©«ß†öügŽb}Nw@1Œoû´ šUàÿ!°AX2ÊE;¢�·/Õ�òÖYà± dBØcõ%yÒVxÜï�‚ˆR\©eäj,óRC"8Ò&Žh˜5*ëmœÒBlÂ+ˆa–¶¿ÍÉTiI‡Ã@ÖðÂÁ÷4N#Öÿ”"�'T±ªvU7ûª@ÆÝ¶†lÌNÊVõZp±�”«Î}gªÊ–Æ6.ysIòPm±tmR8 +{5ô¥[/|  o!j½ù¢²'‘º>GÁ¿u–íVš�§„„gCí²(±î8-öB‰¨RppÈ|Y¥~¹¥Åö-s²9ª¶v~§Ã€Çïà\@W´”û”ÁÖå/uL²í%Ñ¢\M+·Ñ½i`£Mºöü›®ŠuÃgµ¬\¼å³¯[g¢N«út鼯/i·ë²¶�C0Ùqƒ™ÆxËÖ!X¶Ì]•UJ(1íðü²d‡U‚0`ÔKX�–÷n.÷ónGm4¢Ä¯í9Åm(j…5§÷Ä�UÐw—u–œC`;]Û�ppû›ÜéÅd}Jˆ¤I®›»×"ù"OEX¡)Ë·lu=y*YaAXÊñ@¨jõËi„ao‚Š ¡# N7„¡&=*Sÿ”8a•¥œñùy€¨ð)¹$C£Âlo·ôw“1$ ¬H|{¹0`͵¼Iù½ÚœÚóùq} í2¦ó'™žûéü@(s°65Þâ—æ¥@é-CÀvÄ=Ý~H¦_ µsèÞçlZ8ft‡â¶‰¸S´‡ 4xˆ6y´�â½uoY „ÂwóÍL¨kIâXóQ^t4›èhÜGI±ú¥T¼*\!IZáÍÏ™î e- ¸l­+„Úq_�,òÁÂÍçŸ6i˜ÿ·©_–î–ó•ÆJp¯¤€m �«÷´%4&OÇ:ˆ¨ ±©ïo绘ò"Ì{ÆC¢©Ešž^ZñA.‹£¶ÇÀ‰Ÿ_BÊýy‚„þL‹4Ì8NRd95%¿0 ÔY…)©Xèj]a×ûÔÍ3œ+«`lk¦zw%€t�(läQ¯Ý´ÌÌÞ‡ØùQ쪉Ì…¬sȘ‹§ÎHÝÑ1!¼™íÚŒ †$hÛzóôoÁé¹EMÉ8ß酪3´- •|”={a6ɰŠ3MÐK´¡¨`÷GÖ%6Õ„.ÍùésZÁûLi­¿%O{˜3óåÑ[5E�@Ô–ÍËãögž`$Z­§uï0&ÞØ$ÑÐü@rdŽKf$1¥t†�”<5âø`Ssÿœ¶J­9ÿ>Aµ.ý$éÏXKÿ:]6;îVÖœ6Mƒ*©^´À)~‘w÷%e¯Ã¿¼ŽTÌÈÓ¥]Ú} +¨B”€Å²…g)·‰=¸Õ˜Ÿ,ÈÒìþÍj¼N�¿ÛZd…²ü9wH€i¸3b�þ;>E^™ƒô}ê¯íô#“L­è/Ó}œ3 W¾pð‚—L-s/²…°$�íÏû†Wr“¾Ñ±Ü +®'Aþ¦{3—ªlÁÁøÁùú öøñÒ?¿àÿãð80@SZZà—`°»-AÙ`Áëu~îöù‡ë í¹¯'UUÙ)DÜ˽ÿúóÊ«— ¹–®K£•�ûk¶Å êz[ã”i8;_úù>´ÔâÒ0çcjK°(kO1h¯yí.ýãšo=[ÊÈé/Ýmî—™¡jÚY×ñÖ#Wû¦×fû¼XgjS=hÞJÿÎ4/ÁLm¥WÕ= ¬çá¤4Ú[·MžZ‹\&Ãk€Œ Ó�çqK L¢i‡xš#Ò "¼tEò]¯’>ÂTrS%�1ß®¬>š§}”EàÇÌ t•0�’öô2Ný_žº‡tE€ÜüûU‡…Òb0ã!µÏBÔ€ËqÛû©;û9šËÌ–�Sy™:JÊ£xÇBƒŒüÆ€kv:?€Ý%@8>/Ðù¦%?¨lš$<¨@]Vþȃp/# 0!§’Q ñÈ6ä±í²ûÝÆ¶Ã3tey¹f<®%ka»xnîtmïpš¢QѦ'—�2ÀùªÎ¸š÷lu®Ì›áã|oÏùXXô˜mÉ¢Š�²Ù4 ]qc,.]Y#\FgìDIm=C™ _à¿ß»[7ídQ0µ`àŽ7Y¼Šb‹Ïï¿ëic9'ʤ¾²†|_!öݧñµ¿„ÞÓ +FôðÌ6uD;o¬rÁÕ¼'jã�&ÚúŸTS™ÕÕþy@8‰/jpSÛx7�Þ€ñA€4P³X �1¦T$ë—pÛÒ=¯6}úÖ-o�'ÒØfl©ŸN�"…h¶3`‘÷=×ÅÌvÒ~ÊìÍ<î[é'àÃ!¥h|÷¥–6›))Üà5Š�{Ô\[ÛBþ¯ ~a`œz�Ð`°oüÁ°sL]R{ÅÖ^·7Ôï9 M®ŠPú)Övþq¤´ÂtSºšž¼á àúL¦§Öv+_]�n�ë·n +}ÚÅ g8ˆ‹i@„™*’xý(£Yµ?­¨ûYx‚WWøI”oµ�ÅìtÛ•ÿï*yiJ±¡ù礕YU4ø†ãgÅEb¯ŠUYUö¾Ø´*üü¼4tq¦Þ�|Gn› \Ü•€AÙ®óEu{¬ ²Ì´ÄßÞÁ¢þ œ/¨L‘“GÇ5Æã{{�C²* Þs§ßû×0<¸ÂæË[+ a?ß l–\*¢ûC%QÌÜÿå±Çî8ã´_Ôð¿,&‰j3%KgJ°™åÔªV|wú×J¯&,Y{î:Á²®�y‰ÜÂácßû[º/€oLŠ0Ì�‚:¯l« V¹¦lÄžK�Üu‘þñs½οÃò}µÏ�Ÿ@-!™J%�~þ?–L®Ô°eã7!Ü­5aðo/Çtž ó¸° Ú4®^&Ædû­›—l(+Gñ‹ HJFô]M\K’©(Þm³F(¹ÍSºí€Ppdý²ÛÍš–KòhÕ…µ>µ·Ø3?ô×~™©¼aäˆâ˜¿7 N”Sðç~‘ÀÖ+�…α½ßdŸÔ\µÊ„?Ææb‰£½Ã� éV‰óÇ3•h\*Àµìàm +u�K5N ì�×~|ÌCp5Ìqóâ-µÌ„ªŽ…öåå‘~ ô\xåq†b]l€¡ŸRþ�ò*ém܆Â÷þŠ 6¸/ÇííaÐCÐ<GÖØBË•ì ¦‡þö>JäÓ©d:·ŽH¾åÛpUŽÑ-Æ9;ë8ϱAàG¦Ylq@2³;aÁ[©%>ÐÒÐ )#ªT€—ÕÙG‡K®1&ïÀͰL;'fU;ÉE‚$n3Š  (�Ö`ëŒùFk,4mMÒMÁÓ ´fïà¬tËTsÑIDÉ%žWƒú¥+ž¿RÙŸ¯ŽAâÀ wShXf ÅCÖ°RÁÞH6YÄß]CHÒš"5�™dôŒOÃ-O£4�0ÈÙÕ“Ü×>V6�'·û1ƒ˜$WÆï r"x�À0¦U>¼Ô�/å9K¿§�©½É¾{:×t³ê¯Zì¤ÇN +;¾oºÂì&54jláâaí®Ä:œ X{�}¿ +'½h&éà~óåÐÞë!ø 9m(ÊÏ–Ø|GÑÓv’[gB)€¬×øÂëßw�Õ¹¹œÇ8Šk”G«+§f¸�‘’ˆ¥O›¶ùÜõE¤K¿»×K8«¹œ–6mË50MÂÇÊ9 üýOÙ嬃Ý.ÙéH–f­)ëe»EÙãS•„þŸš +)0öP÷'a¸õ�½&DÇ÷"¯ñYƒ…ÃÏí?r%,Î6›f [-Eô½Î]”.ðA]±3¥5—ª¯_€ A5H¤"tÅ»±PÂ9D¡³¹v°¯uŸ½Aî”ÑøCskºËŒy ¶3™‹¤¥ôBÉOõ¥îG?HW N‘hŸî·2±È@Þ‹0¸CVÐÔ_ï¤MÙvtç0QHA`{£¤ðÓwøû‘AY~B{¸Uç:¯Wî¤×o�+V¢`ÅRÃ�uÕ¬- ã’ölÀŽ“±q†a§î_�÷2R¥Ílò•“3j�4ÖâÌGËQ©{�Ù­ÞTmWý•;xБFS}­Ú”ö2Wü|æk¢’/¬D^bh„Ó†6b�0­Æõ�–³Àó.oÕ"I]np|!Hš(±…—;†V3‚ {3…ÌÈÑh`'ÕY3Â\-:ðç¹¾·O_Ax×’yÊöEtŠ`›O›×sÝç…�d¸ß|®_C–E –üË-6´/ùHᯫH‹&j±Yôâ£ÓD‘éx‰ÜÂyŸ,ž/jnÛ,ËL¾QLòÖŸ:_0(X¸Ô�qK¶‚¹Ä¶“µ3°G~a¼¿“kI1Î%ðFd¾U#^óuI¿ï¯[ÎÕæ9<DßCl[ŽÌ�’óàÖ¢…4Š˜¨~ é'å¥àG¥nçîõmï -ièjÑPÙžº¾¹�s–W#�Lÿór¸æ†Úœ£$R\޵GÚÓzì_œŒ·‘k�53L®ÿ67Jù,uÙÌrÔ-�ö†‹¼Ÿ,|ˆ$�Fn†Ã˵­K„*t£}}¼W�=ÈPoú}]G’÷ý:r¿ØÂuÙr IKÐ1/lžë³0‚t±~g¿÷ÐpÃDÚ@rvs¸‘�dàÐôæ¶> xU­PéçîRf–9í†I7qÒÁVZ´•†E†ˆTæ48Sï=°Cû¹957‚T`ÆÉ!¤BŸêê|iªù_â¹0S�Fò[wï/é?Â�v¤Ípëô7Aª_\ýG×N;â#Õ~æL¨ÛDÿSby@æc}�â,,ÍX é.Np6X'úýÇnöì’xv�Ÿº�~€÷•�T‰Q¹ÖnúÆZšà +Dž-/üpà<Ix²R.Ï +p˜�@Ä>«™{ÏW�‹“fÀTöõøí/O?ü'À øúlendstream +endobj +237 0 obj +<< /BaseFont /Times-Italic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +238 0 obj +<< /BaseFont /Courier-BoldOblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +239 0 obj +<< /BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +240 0 obj +<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +241 0 obj +<< /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +242 0 obj +<< /BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +243 0 obj +<< /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +244 0 obj +<< /BaseFont /Times-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +245 0 obj +<< /BaseFont /Times-BoldItalic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +246 0 obj +<< /BaseFont /Courier-Oblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +247 0 obj +<< /BaseFont /Courier-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +248 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 8 /Subtype /Image /Width 32 /Length 193 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  ÿÄ1“CSÑÿÚ?ÑÇVÁ–{ŸÊ¾kwOk�u­¦°§œ7Ma_ÿÙendstream +endobj +249 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 152 /Subtype /Image /Width 6 /Length 203 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ˜ÿÄ-AqBÿÚ?Ô5Tkæ—_4kæ�U*4Th¨ÑRè¨íQÚ£µGjŽÕª;T½*:TÿÙendstream +endobj +250 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 824 /Subtype /Image /Width 8 /Length 529 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ 8ÿÄ3q23�ÿÚ?ét5«¨¡­\”0W'?qÏÆN9øÉÇ?8çã'1“Ž~2qÏÆN(c'üd㟌œsñ“Ž~2qÏÆN9øÉÇ?8çã'üd㟌œsñ“Ž~2qÏÂN9øIÇ? 8çá'ü$㟄œsðWüËÏÁ\sðW'?rÐÁ\sðW0W0W5«ŠÕÅ j↵qCqCZ¹hkW% jå¡­\Q×õE_TQÕõKGWÕu}QGWÕu}QGR:Š:‘ÔRÔŽ¢–¤uµ#¨¥©E-HêZZ‘ÔRÔŸE=IôSÔ…§ª"¦¨Šš¢*j‰jê‹ +º¢Â¶¨±kj‹ +ڢ¾¨°¯ª,+ê‹ +ú⾸°¯®,_ qd:âÈ> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ (ÿÄ:1’ÒaqCSÿÚ?Ù+&ý¢zPE§n7mó0m³æ•Ts}ä‘Y•u…ÏØyBì1*ëô\¯�‰WXÿÙendstream +endobj +252 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 8 /Subtype /Image /Width 14 /Length 183 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ÿÄ0�2ÿÚ?¡3Ðó_ŽÌféÛÔÕp¨”ÿÙendstream +endobj +253 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 3 /Subtype /Image /Width 256 /Length 369 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ÿÄ7’SÑ1‘CÿÚ?ô•V| òGìbª/â_”³æ«•çâ7+£“üµaýFåtL­d&õt2•p›ÕÐÊUÂoWDÉÕÂoWC'W ½] •\&õtL•\&õt25P›ÕÐÈÕBoWDÈUBoWC!U½] }TFõtL}TFõt1ÕQÕÑ1µQ)êècjbSÕÑ1•1)êèc*bSÕÐÅÔħ«¢bªbSÕÐÅTħ«¡‰©‰OP˜š˜”õ&¦5=Aˆ¨�OP˜zˆÔõ¢5½A‡¨�oPÿÙendstream +endobj +254 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 3 /Subtype /Image /Width 14 /Length 185 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ÿÄ1‘2’ÿÚ?µ‹ÆêáÄ›§G£êÆÔ+¯ÿÙendstream +endobj +255 0 obj +<< /BitsPerComponent 1 /DecodeParms << /Columns 2352 /K -1 >> /Filter /CCITTFaxDecode /Height 3125 /ImageMask true /Subtype /Image /Width 2352 /Length 72610 >> +stream +ÿü¦m™æ¤v³ž9k‚£$¼!`¹Ó;HR&Ôˆ/µ“ ²¼ôr7L$v±�š’’§Ö’@Нýu¤¦›_ºõÕ)…F×ù´©f˜U¥FÖ’˜Xæz¥ÖgÙš7åç¥éo®’˜^’—Ô-iQ„–—š~g©~ÌÿJ—IÒH¢K×U i$¡,$«¯Z„´´�vµ¶•¤á+«¥KÂWJ´µ­*õKIW³ýv“Ÿî½ÒKK iiwíÒJ”Tm¥ÅZQPÕj+ CmÐKZN•­í¥’ü%A%°–Z;ÂV¶)8IwJÒp”;K� +†éSi%„½*„è*¦*´µ +T=°“Ä&Ò´¡p¡ÕcB¸Ðô´¢¯°’vÚM¥±U +Z ÒÃh*T*mÕT ƒúah0 Ó˜L&(0êH¨{N*aBb¢˜P©ˆA‘  +´Õ!S¶) �à©„Å & ©^ÄDEÃ`„A‚ +pM6šªj ªÂ^W&�¦�¡quB0ŠäàØŠA¼©Î¨›�ŠA´ƒÄGIÕõ»õ¾ý:]J`«¦Â[H0a…a†(QÿäÔ‚¤¦ @Ø’Ö mÿ ¶mG-!°6Ë@Ø-†l› �°3fIÐ Í@¾C ê ¸ ˆÿÿÿÿÿÿÿÿÿÿÿùf‰RÈ:;,4)8!8É ���Ã� .fË5Fveº)7*3¬QÄ<édú„OÿO»«,‚hÈ* +‡f@˜R_“z†ƒ4ïÿš²ñ¢ð9‚mUnuf›Î–M‰Á3²L* �7Nš74oýü&ÐAºþÒoÛ]USÝZ÷£cIÒnïÿÕÒý/Û�ß;½÷|Zz¥Ó~Œ>ÿ¿ý¿µFw¿ëºÿúFE(r'÷é'Ý�ßâ—üãý!öÿÛ|ìº;GúzþÇ®gÿûü]/ÿoòlBõÿ]zõýÿ·ì>ÿzöÿÒô´ýWʳ%-2ˆfAÇA’tôP‘Cáð¨?u+ˆðüqÍsdˆI‘¬·L5ýÿÛø:ä>Ÿÿ©ïí®R"—'�ŒèD¼§B F “dC.�‘øŸ!£dx²â„h Ÿ0a0Ñ YnF"ñ#=°‹°Â5‡'äúg±QHØV'´lv6GJMíÿüƒÌÿ®—™‰ý_Z!2lˆbš³bœFÆ#0 �Â4Q!<Î>g„ü&vh6Jl&‹IµT›ÐA†�°Ñ0“ ›I·vLöšI¶K‚jK²Ð›ìÿþ߃æ ïûù”uõ×MˆÝ–“iÕ=' +¹3‘ÛA6î";påði6dsH6Ë´›A7ºV“îÒ½%»Ô+]+¢âK�÷oÿæ&×½{Ù¯�‹dÎGm&Ù.0‚A°©8A:L4Ï,éÖK›Ât®¿ §§JéÒ·IöéÔ}]ý}mïß×ÂlнÿÛ\=ÿþ‡¿÷íAZ[¾·'i-t½Ý~Ÿ¯éýÝö×qVõ�ûC¡ü;uõïÇVÃä5÷þÛ÷×ö½ÿ¤‹þ�?º¦ýSx¯C¶Óõ»þêG +ÿõïUô·½Ë¿¾¨‚zÓ¾ˆvëi{iËîßÿçYõýëšv×úoÛë�mWzu]ý¯ÿâ ÿ´[’E}Øj?ýòÀ·_òÍŸÊ?ÐMñþÇûñéõ__è‡.þ›þ©¿ÇÿôY�ÿï�·ûü:Kýëµ_ÿ÷¶¿¿ï·Ú_¿¶Úú¯¯ü°-¥úê¿ëÿÿÿÿÿÿá‡ÿúîŽï×û{TÚ¿ÿ¤Ú_Ö–ÚÞÛöÿíuÿÿõÿÿÿÿÿÿðßÿ·]ú_ÿJÒa¤¾÷ï!Œ $ØKÿöB¾C +¯¯ýÑÝ×ÿÿä8?ÿÿÿÿÿÿ‡»ÿ×tŸÿ»Å1^ü‚G}Š WÓ];CÂIú{þë_ÿÿÒÿþÿÿÿëõðÿÿ}AÿöšaSáªk &e&ÿué¿ûoý/ÿÿÿú½µïýݾý­�ÿá¢Ì,w±ÿ{é~—ÿíÿ÷êÿûuç>ÿýºöãþÅV–ýÿúÿÿ÷ÿ÷½mºÿ¶Ý­îÛÿíÿn�¿µ¶ëíÿlÑÿi6gö–Ùšºû«?¶f¯ú³ÞÕêÙtÙïþhŸt¶öÝ%ûOöûmum?O¦I6ÒM†´´ô˜¦6BÙÆÖšiű^öí]m‚mœ›[ND€eÇkr.5b“¹)ªh0‚b�a´‚lPl$MŠ ˜U 7 ÒöÂaYé±Ma°’ Œ1L4i°˜L ©¦ÐM6j¸|ð!4Ct�‚ AJâ‘�‚j�E0ÞvTÐb +xl‘€AŠž3Û "²ŒŠ‘•HYL¤¥¦j”[ ÃrÐ6€³&Ã`J™�Akü� däÃÿ“�æ•ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“DtË‚æÁü³s±;B03p%¡OäŒÀ.` Ù_å�²"q�ðSVEò9œ/"Nôœk‘�¯áv¦�̉Ç}‚Ä%ŒÑ… +ªÃˆ×„¶¦g2JowšSQpóoµ^ŒjV`¡%_WaÍÅõú5¹¦îš­Û¥ü'Ý´¿õ×I÷wÃinþ›í×ô½Û_Õ÷×ü8p‚Ý÷Û­þ¾í×ûÿ_ÿ·_ÿ´é?’ÿ�ÓÛ¯ý¥ÿûiúÚ_ÿŽ–úúíŽ?ÿoÿ_ÿÝ}ÿÿúÿó¢%(�®y_œ�DBÑÈë›f±ûô­/Þ´›KûJÒt¶ÿó±5””ì�^P2Ô y²:Œ"$Y8¥²CD&AEÀda™šaPƒ»dùƒí¥¤ÿ|qL|ƒ§±ÇÈ ŽvZY³Êè.qˆÌÙälŒàƒÂ4‘Õ—0‹pü#cFÌ<&°àÏ ’òs3½P˜EÙôïÂ44o¡hCA0ÐûlW •߯ýÿÂ4Q,Â4vÒi”R&$�½'ÐA´úL4žLävÒl!‡tGoI´Gnše�ŸoÛ¤Ûº%Á¢\ÒÑ8õºý|Úæ£cšm­k¤ù(KA>ÂDX A¨I7¤Ú¤é~––ð�+D£¼'Ò´¯ýû}ý=?{ù¯4Ûó˜ÂlÙPmÿI³Mÿé0 ŽpMé:WÒÚô•ýR_ÿi?¶©»_·û¶“í7þ™q=ÛvÐñé6l·¯Õýºÿýÿôºk®­aï¶’®¢ª)~¤p«íq¸û^¤p­ûõ¡þû«]'ößô¬þ±ÿÿm¡ï®‡§mÛJ>þ¿Ž¿Ñc¯ÿägÿýÿ,kÿrÆcÿÿÿÿÿúþøë„©ÝŠ–9$XzCú.¿þ?þ�ÿÿÿþÞÿÿÿÿÿï×ÿ¦þõô¿t‡ƒõý×ÿÿm/ÿÿÿÿú_íúÿþ¿úþþ”_ïíúÿÿÿÿÿÿÿÿÿöÒÿý.¿ÛJˉòÿýÿÃ~±ÿÿÿÿþÚ ÿþÿÿö¶—È=VÒŠù Wb¢«ÿò}ùnÿ¿ ø@¿ÿÿÿïØ…ÿÿýub¢ºö)­ý¨'ÿÿW¾ÿNðo´¯îÿßÿÿ™Âþ¿¿×_ì&¨GhDGoÿK}¿Ñãïé¿ýÿû~×ÿÿÛøˆãÿ_Z]íÝi6ß»ÿ·ÿÿÿÿþßéiÿ××U÷×ïÏuv«ûÿ¶ií¯í™¯�ýÿlÏoë¦ÌÕÿöëëÕ½¾´›lÍ~ì;ý³5jÚí¥÷}°Ó½¶ËË­ª{ %dwv“i1¯ÿuí.ÂÃ=w¤«l0©Ým›pl4Ócc‘q¦Å&Æši± 4Øq �h4Ób».Va ÿûh+´¹X«»I0¶Å&ØI°Å0�4Ã28´š†lžVÔ4º?Úž!Z5´hʰÁ„`¢ + ˆ†�ŸþÃI9NÂAÓA„¸¨°¡…E‹!3høÿ·×úxÿÛuõoñÿ‡ü°/þ�ÿ覆××þ<ˆÍäþKæôõTÿ¦ÿÑ`oJ¾´«ýaÿÿÿýÿú×ëÿýßZ6?ï×ÿû×ÿÿ×öÿþx_ö×ÿÿÿÿúþ“Ó¿ÿÿhãëÿÿðF¾ÿýÿý´µÿÿïÿêÕ/Õÿÿýéµÿÿý'ü7ÿÿ�ûh-ÿÿïÿ뮾úvÿÿÿÿ¯ÿ}ßú ü?ÿÿßÐÿm×~ÿ{õL]xBÇÿûÿí½´›ÿÿð—ûÿþþ—߯×o_|!¾¢½%ú^õ÷ñQZ_¾—úþy?ÿÿ߯Óo[kö­í÷ðËuážKÿõÿm­¿¾Ûÿ_õÿo¿öÿþíw­·§óEÙ /j’ö—úíºïï~¶öÞ¿×]º¿lÏíW»?ü†9˜KmŸÛK´“až›Jl0—zÿKðßé{¯ûg·¦ÒVÐl3ݥ헤WÓ´²ò{ M�ƒ»MCš¶ÆšaŠm˜m+ Si6>¿®ÕCi'dy´®Dºltí¥lPbƒi*qTè4v“š ˆI°´ÓM„švÕ«AŽØ › Šdpaz¿Ô ´ÓþÒMŠmi4à è0i#„Âb�vÂaTñžäûÂ(ÑY $|a„Á"»=¹UœTçˆÊR!„"ÍŠðE/Á Aa •b‘¢Â TöØR±¢ºB!ˆE:&õxˆ��Ý,2ÝÿϺŠe¿e¿Ù $¶˜_â+÷`½é/íK×é«ÿuÿþA6•1^ØAÿÿkدÿᕱ¾á‚òÌ*?Ðâ#ˆ��ÿÿÿÿÿÿÿÿÿÿÿÿÿÿòÝ d„ÿ;Ð �µŒ²Š£°hîk™Çd‘_Y"; ‘Lí^dZ² »Aà +«ÂO¯dAòÊ#ÅH‹ +—®�<šbÉÚX{r0Uö� \Ø¥8Z•Ä´ &Ôzç�¾C&ç¿cÒI¿h�±ÿØwBÐMô½qO×÷ßÂOÕoÿαü‘jBxéÑô©ó¬A=N¤w‘&F³:‡äIƒ!£`°@É ƒÏŒ‚>f‘�Ý�0@ÿ"XF·ÕnDðf³ ÔÌœ\RB…™‡d¾`Ìâ4Â�šH0‹¿„liÚ=¸‡£[A7éØ{ÓtTP¿H*OëôldïÖÃZa7Hôš¸p…¤Ú"ÃA?,é†Â\¿zZO°AG7gûD»úÿ_–tÃCKdø&ž5e¡a]ù.¥ �'ô›“…¾Þ®—¥ ¯§uêóë]G×é6‰E}úuÒ½÷«Wjÿÿ %íõ¤úN>×{»ë×õVõÜk{¯zRá}Þ¶�I·÷ëQÒÿ~®¸ýáÿúmë·]ß�¯¬¯ÿñþ¿ýÿ‡éýzïþÑ0/úúþ­ëÞµ…ÿø¿›¿°ÿÿÿ××_ÿÿÿ®ú®¿ÿ#ÿû×ßVÕÿýÿðFø#ûÿôyÿðßúÿaú;ºûÿüˆßÿÿIÿIýÿÿ¿÷Á¿ÿú ¿_ÿÿWÿÿÐ_è.ößÿIÿýÿÿá't›ÿïÿKÿý,%õ„·ïÿûÿoë¥Çÿÿé·úëë{ýWÿ�üâ·[«M·ÿªûÿÖ¿Zíïßê­ÿ™íýýõúׯÿõÿûýµõ×Öö×_Ïÿí¯×·­µõý³>ÛÿOÛýëˆ;Ib ³×{~´šß§jÚ]¥ö×t® ö´û1°ÂK Ž"k"¸i«m¤œŽ –G Џh9=4Ò 2:  Óa†’m¥Ý¸VÚIÈá5Úi°lR ‘Å4ØM&›"<0MˆI´ò R § /¶ +­ߪ>º=ç¹0Ä${lWmŠØ„›OMTA…m2}Þÿÿÿ��{»Néõÿ×ú¯»áÒaú�QØ?Èh�šÙÔÊw”Ôò.“:0D¾kPiòÎ%‘—‘£%Òç#Qãâ“æÓ'H„‚Ȩ*ÌœŠsÁc ÂÁ@” Eà�r„ “ #@e@Â0å;†ˆFê™h4fb +¨„ò œÃ$aÙ ƒÖaŸ[‹ƒ“ŸØÓ „hªhÙÝFÆ��šZÚNSÊtn Ú„ÒÐA¿–…©4lhöÂ7t,#sP©ú-ÚMÿMÉXnÜ� ¢l!¤ØD[i:NM„¤ÚN“i8Pƒ8lÈM¤Úg�&Ò¶[u� ØKKeГÒa„ÏæË;m+ýxM»¾•ÉÅxN“¯Úëik¥ôþÚW¿{oÑ'¯ºOÓJý}kç¿=þÿÿµ[Z]:­=6¾šîÓéjÛN†¿é„©¥¯ãVÓ¿ºÿííÿ¡¸×¿¯Šõ¡×¿«u¾´ßÜcú÷_ÿê>?ßýCÇ}zÑnJŠ›^]]ÿý¿–“ÿEŽE®¿ÓoÿËÿÿü±Ÿë_ÿÿÿ×ÿø¯ÿÿúRûËïÿÿ¯ÿÿúÿÿÿÿÿZýÿÿÿßÿÁÿÿÿÿÿÿÿàŒ?ÿÿÿßÇK¿ßÑâ½ÿÿÿÿÿÿÿôžÿÿÿ¼~ÿÿð—ÿýßÿÿÿ_zÿÐ_ûÿÿ½uÿz_ý÷ýíßÿí¯ïýì%ÿÿÿ·þºÿ¾¿ÞþÞ“ûÿí×ÿuÿÖÿÒÿÿöë¯ûý÷»ÛÛïnÿïVëÛuþÚïûÿ·ûikkíúýí«mºMög·ýíÓ¥Ûf}Õþõ¿Ý%ÿìÿûiu~�ŸùpÖÛM»³Û òn›¶ÂM¦šk"u&ÒMX`“i/VÏv6Ð~ÚW¦È¹M†Tí´¬$ÈAÚj¤éì+":c Pcl ˜Ã™Òi¦Ða„›I4Ø„ ¶*G �ƒÂ Ú 4Ó¤aŠA¦›¥@„ š ‚M„ÐNÃTÉXL&cd¬&L$|£\ža ƒ‘£*Øa ¥sáM; +ØcžèöÍ6=ÉðÁJæ�tWA„!„wˆ²M \7ÿþY_Íû×Úþ×ö¿¾½ËlQhµAå½R$l—–rØ·(Ï )Ù^Lð¡7,á¥;%¤3•ÓOIú°dþÝG_Óîÿë­ó°$#ñ—ÎÓçdxë¯U_Oÿ•II›:<ƒf§žÉPÔ�Ԉؤ!ž"ÈaÉÆ@òFlÊ�Q ¡a”s·J-" ³f$ã1LòB„U’ !,ö{%DzZ/0àðF0�x dD\Ðff|ä'žfpÂ5†Fh÷5á4Â40�Ôk ÔpjhÖ����œã„keFvbÐrS;F°Ù/'ÓðPš6>(4˜MÚ@ùšH6“z<5Tn{rhª=ÒmRpœðÑXÒm, ›w3d‚ ÉÖ´›iªL0©"Ó4nì´Q´›e�PLá$ÚOé8A>-¨t›î6Òl*·‹ÒÒ~÷ ÚÛR´– �Ñõmü* ´­ß§Jñµ]_}Ò¿÷Öüz]iÒoQÿ¥é>ý’o÷w_ö›U㮇ÜU¿§§�íßK­ö×íê‡ý^ЯûµÇ¶“¼pú×~¿ÝôXéî¼uåŽ ßÛáÈTW,{ÿï·ÿè‡þÑ:ƒ—ñÿÕ¿ÿǃÿõ‹ª�ÿõÿü³Kzaíª_ÿÿû¯×ïûmO__ëÿÿ¿û¥ÿÿ¿ý‡ÿÿ¯ûKíµÿÿÿþ¿oFÿÿÿá¿Í'ÿÿðoÕþéÿÿûkø>Oÿÿÿàÿ¥ýÿþoí ¿ÿÿÿ¯°Þ—õÿþßéÿWïq_ƒÿoÿûáõ¾–ÿ¶¿ÿ{þ—{~륻µzF¯þ—ÿûêÛå·ÿÿÿœÿýÿúoÍ_~õëÛÿýµúΟÒíþÚWÿ·õý­í“¦×W¯Û3ÞÞ¿ýûf}µ«f~‘ÎÖÓo÷­}vÏÝÕþ½°—v•¥Ý6•lÿl†;w¶“i¶cï°®^í&Jêõ‘l3vš¶“!l‹ŽÓb“ÒTÓ†lØØ¦GH'i1]†VíYFÚR#â“M0Ä(®ÐLS %„6±Aš °“ ¤Âi°I°Á$Óº ÈÝ0ŸƒI°E­Š &¡ˆH; ¦ÐA†)…L%[a0ª! Š©X˜AÁ‚!èøåd10˜ `§Œè)9I ÅJ“š0„DAœØHøÑ©E~RÀFYÌÈb"1ôøˆÿ,Ò šæ‘ .o'Ò'Ä+�|²*»Aë¨Nï×å’ÆsM„_†QYÒѽþ—ôÑnéº}wH7A-hØáÝ&ø"=é7í¤4-oÒo¯þöC¯Z §Þ¿ý}Rnwx0´MÚ*oäŒÿÿ_·þ¾[c}moé_KßöûtÝ:V½ÿõíö7J*+ý¿ÿûkÿ¥ÿíô\b¦·4ßÿ÷¿ÐM´“tïñû~Ÿ{K_ýúWk}ÿ4þÚ]ÿ_öÒé¿ý�èðÿõ×öÒÞßÛ¥ì4¿öÒþ’O¶—Mû½†’ÛìV¿µö*�¡Âgd¡¤Hp#lû/jFd;B!„Y‘ +¡T)¥ ®¿}ÝûO»äY=s»Y*Gašÿüyì¬ú®¿¯ÕWU×ó¢LÕ’•ò"S®§T_:">¹ÌÔÓ*ÐÈ92ZæÈè2 R�2� lÖ) S¨rq„B¡‘Q Ѳ(г>CFÇ-~ÔÏ‹‚ˆO"L‰K †ˆL„ œ4BVhEâF4Byœ—Ãä&SØÂ.F·£['“» #cÝGê£ãF²/ÈúO Ídj˰rSiÑ­šI£Ãѯ£E4hØü&“j“h t4˜k&pgL4tƒzA´4i0ÒÂVŠ´ ÚM$øTGm'LŽaÄE½C >“É�6É�6“²ÎÏ´œ2ÆÚM„KìÇ$ô›ÞiiZW¥h”Rt�'VÅÖÕ¥¯¦Ö’‚nYˆÐÎ.D|ŽFò�“äŒÈÈCH£6 ˜=fÁu´Nþî–×xÿï´­½ôÒOþ¶­+zMÐô¶¾ŸMúOôé;�¿,Žqš_á?ïéSÃIz�úª½:^�×O¸öÿÇC_î�Óu¡ë¥þí~×þÂ/‡!Ž8Dñú/ß“ÓMùF†ã]ß^‡úõVßô¿§Dª·«n«¯,r4úoÿÿÿß5A²Gü Ýôßûÿ,r-#ðñùnJ�þ?ÿþßüµzúÿýG_ÿÿÿþôÞŸ¤ß¤þÿþ:ì?ñ‡úéWþ¿ÿ_ÿïõû{i¶—þxI¾aþ—zMÿ¿ék°õö××ÿÿÿõÿÿÿýÒÿþ¿õú__íÎïÿÿÿaøoaþoàŒÿÿÿÿïÿÿÿöÐM ¿ÛKÿkûêß×ý?úÿé> ð îÿÿÿûûÿ_¿í&!°Ð_øÿ¿ý_o[õ×ûÐ^A~ý/ÿý¿þßÿïýöê†ü!ÿúUõÿíÿý‚_¾÷×íÿKßÿô¿ûëëÛï¿T‚-?ð—ÿŠý[ÿÿýâ¿¿]õÿ_×¶Òÿý½µÛ]¾Ÿöõÿþÿÿÿþßÿ×þ¾Cÿí³§_¯·ÿ}×þÛÖõÛ¥{f�ºR„9ÿÈ%_ÿ4ßÿÿ¿ÿÍWÛ4_ÿëÙŸ÷ݧvÚ_î«ÞÃ=6gÚöªÙôÚ·l4³ +éƒ`×½†šm®½ïп׵n¿ÿm{ ‘×iYzE;/¶•Ó—µƒ.Yx0ÍÏIöG­´­‘n›ÅÐI†ÒM�´ÆÚL;MU;Ó‘a¦Ÿoÿßß×ÿö)8f º[IЧb˜¦ÒŠM6±LPa„i±I°h$é4ØA„ÚI¶$ÃL0“#°˜T®íŸomUßô´_þþßÿÿa&ÓŠ ˆL&MŠ0)á£C¦¡1ÔÍ6+˜b‘] )XÊB1Öƒ„C„DA‚E#)H†ÄDGíý7ú[i:ûkŒ¥¤WB)a=¸W¯éí®ö·ÿâ"+®ºýµÒoÛKÛI´½´µúëû /þ[±Q^Å}ii%íŠëðÅnA­ÚÛ&Ò´«MMxab ˆˆ¶•¤ÚC !h bƒ ÊY¡fêGü³H3'Ó4ø.`ð$²™ ëyÌŒd™rÿÿ¾—ûk›ÿü†È»\æL3©) ” e:)k3©d¸Èb�Å9“Ä<ÁøžÂ"Ì„¡2¬±A•f +Á›‰ôBx#D&„'B"�h #Xf™�B6}ú5ú·ÿ÷ÿàƒ'Ì EäBd")s8a!!lŸF†i„Â7Â44k #XlŸ’�4Ù/„hxFÀÓL MŸŒÚ › ¥¤è§{é¤ÚM¦š_cÿþ›ýµÿÿFÆ©„™äQÚM¤é: ††“a4xii8A6“¸pˆ°E¶ô�–„i8TÈæO‡VYÓîËZ&m&Òm3Í'õ¥ÿ¥þÚí¥ýé6g &™g–––•„J)vÚZZºNü&þ¾•ÉÚIô�wÕñ[ßm+^›Kÿ·÷«!Ž .ù gÒºzÿKWIýÿ§K^´ŸÚw߯ÛqKÜi¯~éÿÔ¸H·ÕûÿÿWO†D½1OþªÓ«ôÿZèx¥¿õ¨¨ÿÿ×¥ê.Ò�oÚßük]~ºúhDCD0„D|ŽÿüuëV‡ÝqÒÿÿÇÿþ¿áÿú,ÁiúñÊgQY$ÿ¯åŒÿ_¥ÿëú·×¯^Ã�ÿÿãÐ÷×Þºþ¿ëÿÿÿúÿþÿýoÿûkø_ÿ þCÿÿü¢ÿÿÿÃhóÿÿÿÿ¯ÁÿþÑÿŸÿÿ ÿÿÿWÿÿÿöÁ/¤»ÿÒþô¾ÿÿÐ_ýý÷áµÿïûýû¿KûïKÿK¿ÿß_m-ÿÿ}ÿöÿÿèÕý-÷ýô¯oßÿ_þý¿óMÒ¿÷ýþ߯ëß{}~­÷ÿ¯ûÖß÷ÿïÿmý¯ý÷ßý}½{oÿÿ^׿o^Û£Ÿ}ûf}Ÿ½¿·ìƒÿ½mmXgÕŸiþÜ; +Ùý³ózûa;äQÁ¶cm-³Ö› æßy�J×l½˜ý†m%Û Øg4Õ¶Èö²+†Ã6+ì6¦Å0ÌÅE¦¡6EMEÐH6)4ØäX« , Ðq Š4Ø Ä$ÓcÃb“Nâ¡§ Ãa²+ØH6éÂi²8Tá Âdp®îCa4Âb¬0IØa5A6讴•nxa‚aOm�’¼0¹ã<ÛA2±µA¦4 Â:ÎJ‘F \ ;„v™!ˆˆŠAÌ”e¨n¯U×¥^–ØI,0�ÃQÿù6Kd¡B"dJr6�‘„Õƒ]–¡Z+ªÔhj��£ ›$¢,¦¦v +vdˆ–M­uô•¤Ý…; ´ÓêàªÚ¶¾ô“÷ûêúëGB’‹ï¿\‰þ?ë¯YÙ„duéñÒK‘ѹ*ÎÅ1Õ?úJ—xAþºÿü$º/Z^§bH­ØÙ²É‚:¦tdj#qÔÂæÙ¨Šª"ð—[ ¹|òÈI“$ †.lˆ”h)"aVH2 ±Yì�f€Ïƒ„S†ƒ„œ2ˆ¹„l„[ƒ\(‚ˆIž“æ˜@Ê38a0¤&B #[*âæ`¤èxú@ÚXþ�F°Ñ ØÂ3°‹€ð™WÂ633dº~ +ƒFæ� ¤‘¹NªF9P© m IÐA¸A¼&á&Õ]ª"8i.Lô{aÃBöšÿ^ˆ¯‘CWÖ¾8]ãMþï¡ÂÚò8W½»ëתßÇv·ÿÿ÷¿¥«�ßZ·¢=}×ÿù[õKÒÛëUÿÿÿÿH_ÿiu¤Ú×òÕÿÿÿÑ5OÓ~Ýëëû¯ÿõÿÿÛù0Â[ +K¯Õ/÷ÿú_ôÒÕ/ÿÿ×ÿÛZÿÿ<.+Ø­Šb¿ôPÿÿÿü#ý¹OÛ”ÿÿÿðFÿº_ÿýCNÎR†ƒÁ/ÿÿþÂÿ«u«ÿÿè/ÿØaøË\wúOÿÿéwëu¥ýÿ_¥ÿüBÿÿÿè-ÿ×ÿõÿqbœX¦Òß¶×õÿýKÿÿþÕoöÿÿm/Û‡Ãÿ¿ëô¿ÿKöÿûiv¿ÿWÿÞ¿½=7[íºÿ¯ÿ§ý÷ÿ­É×·û¥¯ûšg=}³5ONëÚ·uÝßöÈ8O¶]~Ú«a+ ¶g÷¶·Ù{öWaý†÷ÛKl&Ã76’k"YÃTôÓV"å6Á+d ïNé[ Á1V©¶“!lRj›qN©±[[M �lˆ=Œ6’i°¡i¦š¦ŸI¦Å&ÂÓNh ƒi¦ƒ&˜A± ‚¦ðÁ=4�†ˆˆb‘W Â1GJU¶š¥\ÓEc'HÑ(ç£ $V2Œ�¢¹° ‘\R2Í,Ã``çÆRb Ê®Ja–äܳrÈ\7&Â@f å” Iÿ¯ô­/×^Oh¤ØK&mß!ÃÿÿÿùôÿéÿÑ­ó!1�ÆuŠ2Œé�s‘>xôŸ„îõï:�ú¾‹Æ��oûæVÿßÂt›»þúŸëõm'_ÿ×ÿÿ¤ó>ÿ¿¦ÿ¯ã¿hÎÿ�߯ÿÿ¿ÿÿÿþÃKöÿVû§ÿòlb;/Dv4<Mÿîß äïËx‚…+Z*'aYÛÇb#³2'WÛÿÿÿÿõM]>î ÿ·þß0Oûþîú�ùÙNlg³q Îƒ™Ÿßÿýúÿ¿¿D𦠨£�€�Æn¶ÐöÿÛÿþÿ;:ŽÊ³"Egb»/í2þ“vHÿÿ¿÷K×ÿMWwwH72ßY¦öÿïõþ+×ý5S_šÑÝët®»z^Çûÿá¯!™—=’q/šË ÈèY edÑdQ†™VK‰èGB!r=J²BD] dvk3�ÖBa FHÌ ‰#d B(@xø¤Ý´´»ß÷í/Á…á4Í‘C#´Bt0@‹™¦FÈEÀ0�aá”f Õ™Á¨Ö<M4F†§äk¨2#GÆÄSÉ3ׄl4é‘h=F‡ú¾öÕ'ÿûÿÇÂ Ô Ò ŽøM'BÒÐM¤ÃÐA´Ô*¢±ÉÐÑm¥²ÑH6áRvOÐa!…e ´&Ѱ¡QîËBl ¿û¶a¥ûÈ{ï!€Ã éCAžtì´êN‰u'IÒoI´ËµMÚJÑô ÒwT®j®ý"Qý+A?mêÞÿ¥Ø¦!S¿ûìWþ¯V­=6½6–“¤ßÝ>Öé6‚i§×Õ&ë{ÕÇÿ§Úúm/=ùïnA£/ÿý=Òúë}]Gô›q}ÿ>õáýßÛöŸÔŽ>ÿ¯]‚öG/ˆ�þ†×ÿ×]zúÿú¶ÿ�º·ï´¿ùÿ¿M�ÿùc’GÿÇõÒ¦ÿ¯úÿ×ëþÿúCÿë¬ÝåçÿúCÿúÿëûÿÿõÿÿ°Þëÿÿÿ_ºÿÿþÚ_¯ÿÿÿÿþãÿÿ Ú)ëÿÿÿ‚0ýýÿ•É�àË~õø#ÿÿÿÿÿ ÿÿ ºÝÿÿè'Ʊ´±ÿí¥øA?ÿÿÿ÷ýéá¾�ïÿý/÷ÿÿ¿Kûí¿×ÿÿõÿÿÚ_ÿÿîÝ/ßÖLÛ²{GE×ô¿ÿ­ÿÿ¯ô¿ë÷�ŠÿÿÕ/ö×ÿߥþ¾ûn½×þÚÿªûkùÏzÿ¿ÿzUýëÿßÿ¯ö·uºÿýýï_·[ÿ¶h¿þ×_í/þÙŸò7úÞÞÛiwWþÚÿØLºÌ.ÒÿV¿³ +Ì&Ò[õ³iXMu ¥ÿÛ '°ó|ˆ85ØdqXeÍÕ[InÓM´“MS†`£L6’¦�¥´jÆÆÈ_iªÜSh&Jª †—þ“NؤÂl&“MŒ10ÐH0ØI˜M2:A†ÐA5´Úi„›`Š&šlB®á°˜MÖ0›1Ó„Óÿá0ÂF‡sÏ +x£àpªU´V0É�ÅJÈb ¥Fh¥\ec B5ä]DˆR“Ä0ŠZ-ëÿâ""�q â")¨0ßý\D‘_ÿõý})�˜Î„jÊ2B:gT{$#Àÿ…ÛJƒ4í=;O#ë°`•.ßß0ýpÄ*M ›Nÿ¿_È¿�'Iÿÿ¥ÿûí£>ÿ¿ ÿñIû‚#ßÎïçÿ¼k¯ÿñÿûêÞßû}¿ÿd�¿ÿÛägÿ²'ëÛÿÿÿá½ooßo˜ÿÌŠOÿÿúÿø{�oý¿ÿûy#O÷õÿæ@óOÛëÛÿÿöÖ½�ö=ÿýú«{þÿøå‘.ÚM¥ÿÿùoR#äTÈ™Á*µ´˜i%ï ‘ÞC ÿáT(MB=ÂØ¦+ßÿÿÑFŒñÒ~a +ŸïOM$Ö¢ñýEEEëÿ¿åk×"kÿªëúÿÿ_]n!’ Hc„ÉÃ: !à­I†GI¬TD¡º³BGá39/! „Ãaèg&A ưÉâåá0�”3ðL#;Ñ­¨F†�d^6ù‡¿¥h\•mLàÎ4˜rs¢,4ŸA;&tÚM ›ò[>i°îË¡sM¢NšI´F=á6•¿é>®ÒZ´·“6ïïþ·O­Ó_¯ûi}Ž¿ªÿûÿ�Ç­¡÷�Úëï­.?þÿè±×«oú ‰ÿ�ÃÇôXälÕýÿãÿÿ-'õØøÿ÷ÿ_ßÿÿ]‡«ÿÿÿÿÿÿaûx+¥ÿÿÿÿúÿôàÞîÚ_ÿÿÿ×ÿÿKÃépÑGÿ"cÿýÿþûÿ {ëÂþŸ×ýÿÿÿúï¥Iѱúßÿ¶—ûëä?õVæBc:­dŒ‡�s‘Fpô¿¯öýëý¿ývêí9ögžè0ƒ Ã_¿:‹ý7ÚWûgÿµìÇ­žþû ‘×k˜ðŽá°í$èØÑvïÿæVÿý4™;TØ¤Ó ¤›¶ ši§#†¶“í†+¤ÚAµ¿ïççÿó»# “ÃM¤Âm‚(p‚ ¤Óa\{O ˆUU°«N•÷ýúÿ�Ðb! ‰VkÄ1Št2¤@B"Žx�zyÝÿþ“¥–…™øÓKÎïùÝÿþ—ûQ¯ÿÛö¿×_z··ÿø¥øA}X:ý¿öùü%¶²'ÿÿßÒýØ4 ÃÒooþù€×éa‘¥¦E'·þë¥úXÃ|ÿ~_×|‘§·þÛè/Óæ@~ÝÍ?¿íú_È8~•7±ÿ—ÿûU÷ýúü{i6—ýûëÿl$ÚI7¼‚_ä0‚ýŠbºß÷ÿû0Œ…Oø�ÿÿÿÿû<›tM® dZ;È·®ùnW‘ÈØ@ Œìª4wª…%ü™·döŒF¨ ê“ë§ÿ›‹û«N£»ÿô½èÝÿõ¾®‘_�ÿßòUkÿüq×ôÿÿù̧<¤�O$ÆègB:Œ��2>ˆL˜# ÈrqNƒ$ +CFÈñ�Ѳ)ãAJ3 dc*ÅÍ‘ ›26) ލÙü0F¶ˆ13À0FpxF·!<Î "à3FƬ4!ú "ì0‹Ê60�a£Xi¦ƒM2�4kaèöÂ.Á“É„]‡„Ê5 „\¬§ÿôaÚL= H>“ÉÅ'A1¤ÃH6ɘ&z=ÐM �&M ƒhŽ�Â"Àa ›IÒ‚m ß=°¡`4tƒaaÿ"eöKeΉu/÷�a%¤Ý5‹i]ii:Ú ‚t äã·º�6‰='ÇX ÚV“p›û§ôé_Õþ£¥ïßoÿ®©¤é6Ó»·´©¨êô]mþ­-ÓÿF·û©/»¥ÿéhi7û©*¼j?ûM¸¡Ý­¸¨û»t5¿2#¡4HGL뜊3ÀŸ¤ßÿýuðñÿ_ÿ‚­ô«oûòÇ"û‡^—¾ê­ü  †Ðw÷©Ô×þ£þ?ý%ÿÒåÔ«ÿõ·ÿýѱ¢íÿÿ2·ÿÿ×úì=o÷ïÿÿÿúa°ÿÿÝÍ‹I´ƒiß÷èØÿÿÿ]‡«¥ÿ_ÿÿÿí†ÿÿÿÿïM÷ýþßÿÿþhËØ|‡»iÿÿÿÿàØoÿÿÿúN—;¿¿úÿ ßú Á½]´ýýÿßÿö7ÿÿßøñÚ^�G¿ÿ ÿÿ¥ï¥Ã½ûîÿÿ÷vë¿õý¤?Oþß�ÿÿÿ¥ï¥£kýÿ~¿ý·}ÿ¿û}7ß_ÿù)¿Ûÿ× ÓêªÝ×ý··m¯ú^uó¿·ÿ[i}ƒ×Ûÿo�q ÷ÿÿ×ïÿÝÛu³Dß_Ýmš/Òºïý&޾Ȟ¿ÿïÂÿ홯ûOëÓ�Ç3>Ò¿ìÿ{i6~mWô¶Öêé´¶Ïþº¶gÚü0úooýù€¿ýé°Âú|r[I‘lŠí¶)ºVEÊlS!è)´j�¤¬V•«¤›©Ý ˜ ÚJœÈ¤õÿý¿"Wäð˜M6( Âi¦Âia*am°ƒap‚i†dq 0ƒ`Š]§—4 �Š U† Å`Š$îãÛ_ÿÿ¿žÚ5¹î$~£[G¶ŠÆÓ“ÁŠ &ƒ ’v„kƒ +V2Œ@Á2Š”èef’”PA„kC+$"–8BˆR“íä�=·¿oÛý´²Ë®å¸¬Wö"#2÷¹§ÿöÿþ×Wýö–ûñä'þÅký{Ò½ÿ~ëðÂô¾IÒÿýö×ñúý« %·¼‚_ä0Ký´¯±LR^ÿOÅyÙwì‡nRÓ†a¹Ø¹ûÁ‚ §ø?-*"½Ù +OˆþþtÃ/ÿ 3ã¯çaòY{Dï,™·aô ÿËÿÐ_üÿÿü²ÞWU2¸ßÿËr¸ìÎ +vœÊSEÁ"" �ù)^¡V”’°“�‚J¿ð¿ÿZµoÿÿÝÝô†Ÿy�¡YØ Ÿ¯»þ×ïÓ3£'dù:ç>p0DþW%Ⱥó¹ÿŽvS�ëÿ» Éþ¾©úÿªÿ¦Ñ¹÷ýð_èïõ_:"Q®DòV²Xó¢SRRa©©ÿ"IÒmï×ô¿24E8¦½I¢' †).�ÆÑ&Ž‹©"´!2l�'Ì †—x&GˆhÛ$ѱ¢äx†ŒôlŽ �*!CFÉ“òâäâ’Éí:OG¯ÿ×ÿó%¡ž4kf�AÈN5µÂhØÔ'%äæÂØÏ´Ñ¬ŽøL#[TѺ±£cÐ&L)ÒM=a„Õ4ÓG·Ÿ‘±„Ðz6„khÖ t¸"=üõý/餛C“8NÉœŽÚL0†îˆï¤Ú£ÃIÙg ᥢ;ii6“I´5‹nLé´0ƒ63†Ùg¤ÃD[²Ð›—ÏKA? b�ÿÿ·ó¿ô¿zI´Iî®ðV–‰Eôz^-­têáé:N“zM¢QXNé6‰Fš}ô’n ½&é½p¯¥ý½¿ÿÒÿÿ}nšì}Õ7jºÕSÝ'éë :Z´¾®âíz¾-;¥î»þû}tú K¦ÿÛíÒÿJ7ªãq÷w�¯ÿ¯×¡¦ú¶½ú°×õïMþ•ïÖ£Õ‘'ÿÿùѪ~Þ‹‹OôCˆ_ú-Éÿã¿ê¾¾ÿ¯õ�ëïÿxõ¥ >›¶ÿÛúÿˆÖ?ùf7ÿ�ÿëõÿíÿûÿ¯ÿêÞþ¸Y�¸õÿý¾e þ¾×öÿþx_öëõÿ÷ÿÿïï_ýýxàü{ÿÿä¢÷¥ðßÿÿÿëø#ÿÿÿÿÿÁÿÿø#îÞCW·þߪ×ëøoÿÿ¯öÐ_¤ÿÿÿþÿþ‚ÿÿÿ æw}4_ÿÿø‡ÿíÿ†ÿÿñÿm/Ð_ßÿ×ÿ×úOÿÿ_¥ûÌ€ý¾½�ö>¿ÿ§÷¿¿ÿ¿¡ü%ÿÞ¾¿û¯øKÿý×ô»ÛߥMïûänÿøwïÿÿÿ„¿×ïÛöÿõ¿ÿ_n¿¿­wï{j¿ÿõøûþhŸöÿý¿ÿ_ßoKëÿzú×ýz×ûÛºM¥Þÿ½ÿþ߯ÿÿù¢øeÿÿï·­µÿíõ÷¯ín½[Û±QTûÈ%÷�À�þÓgÿm/Û?Û« o�Ç3 » ‘ÒÛh6ÏM¥n•®»i_kapÛ/Ûi{eæÒÒ[ ò¾Ðau_Öÿÿ°ÂVȶé‘mÛ²,;NØ¥M¶4ÖÁ´ÓbƒÚI°ÐI¦� ÛI4Öâ¶’§ƒi&’r8Lan 2¤Qÿ¦(' +*i´ƒk ¦˜i;¶¦îš²8L&)X¤ïlB ö›NÂMŠAÛQ +x“a8a]ÄñÕ†�„ )XÊB” èŠ!”‰ÙЈˆ0ŽÌ³²\îñaqÃü²ÎZK!¿ÿÿý~dV×¥�í/í ²fÝ—´pÅð`¿øÿÿÿÿÿÿÿÿÿÈ�Oþ¿þbŸ2�)Ö'dù:ç>xèúú Ÿßúÿýš/Ýίÿô�ßÿzÌÿôû§ÿ_È‚|²%¢m;é<ï¿àˆ÷ÿ§å¾±�Aˆñ—˘S"«� +ó?ïoÿåãð¤C;Õ…B#É{;T‚‘WµÛïÿüÇû +ÿþl'Éí×ðúûÿot!þ/ïî“»ÖïØ=}ÿþAÿí=mù]itíC"wooý¿›ŸïùǯÎôÌŸRUãŒÿÿߘmÿíëŽ:®¿2*zû÷I?ëþv²EäK#¢”ÖŠ|§e!ªgIsȧÈùÑ�Lì[|^ÿíÿùÿ23ΈážG‘¿6A”"ƒ=’~=’˜<?62F†Ge<#È„ðPe ¢Dvffmžh#òèOÈOa¢ �‚ °F€ÁÃ%ãD3ˆÙ �æ†GˆÖ`wrE÷õöÿö—„]ƒ'“ˆ¸ð™=„li¦Q1Z6=>šÁ=¤ØI‘úf. ·½S oIý4˜h'HPdðdx‘±º?HÉS™ýèÔ{íÿûkè&ÐÙ>0˜g YhM¢,­A$Þ“~fÂI:»,ééÒm Û»,áœ7ÙgNË8gšM«iCAœ5i„“z¸Pƒ8{ô¿ج¨ÿØ…ôÚ$ëv©×JÐ&Õé+úöÕE!×V’´¯øMîøõ¯Ò¼&Õ´’¿ú·¥ÿßû^¯A§mi¿÷}´—ñýîúÒÕU¿Ý¿ï¦ôñÓÝÝ%õk¶­¥·¿ïv—ãën7þúM»iGß»Ýõüuÿ¿÷ú¡OoiGß½†”K÷�Kï áŠÿëÞÒÿ�àîìT…Fü8xþ‹rEÿÿü?åŽ}–9F/±H˜äȰÿ±1U××íû}ÿú,kþÃaëø«ÿì?Ò4‡÷¡áÿ �©ÿ¯½¤¿ÿ¿°ÿØl=[¯ï÷ý‡þßûûø�ÿý¢Ÿÿÿþÿl7‚0÷_ÿÿÛÿ ÿþÿÿþëÓÿÿ~ÿÃz ´þÿø?ö¿ïÃÿÿýµÿ¿Ó¼?øpøIدÿÿÃáÿÑNïÿÿn¶Ð]ÿ£ÇÛÿwÒæ¶—úþÿ»oú·ïÿãõãcÿo¯m÷ÿ<�ýBCÿ¯þNŸû{ëݽÿÇïï_þºWyî¿×:þ¾Û×ý~¿í�:½t¯Ïÿî½ÿÛ'WZM¶h¿ÿoÿYögÚÿ¤ÚÛif¿ZM·ÿþ^ÑÝ.µöÌm‚ZJ½ªÝ—[´­&Ìv‡ †ØI´›¡ÛeëJïé²÷¶ºaœ´“[lö·^¹3nþÚVôš§ÅZV¶«´¸aiÚZQQ ¶(6‚dqŠÒ`öG�bjÅXIŠ´°¶Å'a$Ó‡ÿØ4‚té§m0¬ŽA2:  ØA6+ àš±LBa4û Šj˜Q ¦˜LŒ"ž 0LB PB†± °¿ü1ì4B!AB,¥ B#) aŒ¤DDF]„" Â`†^Ô"?üDh·ÉñÇÿÿÿÿ_ÿÿ¥ÿþÛAò(°Âÿô„ ÿ£[ôÆW4\fB„t#Z$eÑsÙFxô›ñ„ ž�Ýæ¢þ¿¢ñ„^5¿ï˜›ýGè&é¿ÿéßõý´›NÿOÒÿÕ%Ì>ÿ¿¯ü¹ë™ÿÌÿQþ/÷B­÷ÿ_ËÇû_ÿöÿþ›û#>½¿ÿ�@åËÿû«{íü_ôÿ ?ÿÿ惧/ÿåtŠdRzûíô4ß÷ø,7Åïþßÿ»�ÿ»ÿúïð‚)3°ó»ÎôŽÔG`ˆìn2Dd¦@j�>ÿïÿû¥á H(P™>—Ôî¬ïÞÿÛãý�ÿâ¼®<‚R!ÿªzzköÒý¯þ×ðׂ¤þîï¿ïoµJ÷ýíºü|*^û¿ûý´›K�Kï ú0¿ù\Õ¤í~vBñqÅìS^ý~ÅúäOýû0©Ú;(?ÿK_×ÿ“a#ÿë7)HóqYD§ÎF¡”òçÔˆA�È�y0gC& 6Ê´r*ÈèE;5š ˆ"d‘©ÿÿ\ d„ˆA†€x@Ï‘ó4Ì œF°Î�¡’È@Â63Hh„èA„k #ãÖ #8<£3‚a1„h„ £L hÐF°Í0ƒÙG¶ 0� ÏÐŒô0�ÿÿ¤sˆié7£;¦žIÙ, ­L5M¬#CH6“¤ÚO…Txi1¤Ñ¡¨TU´i63f“„�'AT˜ÕMÿÿÂ"„/ØVYpžÃxtÏ Úv¬]-3Ç- Òµt�'Õ6ÒažÜ.-«¤Ý6—ºV®&m¯ÿþ‘áÓ~½oÓé(ï[ktï¶©â–¿Ó¯U·íâ·N“¨þ:ôé~8ýE¿~‡KnÖ¸ßëŽÔkÝßuÝÛ¸ß^ÒíöÝëÿû{~¿ÿ¥ÿ]ÿAC¡ÿûKßxh±È´õØðÿñÿ/hþÿÿþú †Þ—ËOÿ–�5ÿÿÿáãþèoÿù3nÿþþ—ÿë¿ÿÿaëÿ¥ÿì?×a«ÒõÿÿÙáÿÿ‹ Ú8úÿÿÃþÝîßþööëÿÿûÿÿÿÛoM¯ÿþÞD_û¯ÿ†ÿðÙ®po×É÷ÿÿãÿÿü·`ݯÿÿàÞ“ÿ¶_þÿ‡K á´¥ÿÿoÿ¿ÿÜ;ú_þÒÿôþ­ÿxt·â„¿ÿý¿ÿí¼Sÿÿ~—þ‚…û߾뾎Ÿÿÿýt¾ÿõìúÚý¿ýÉ4íëþ[ÿ£Rýï9ô§]ð¾¿ÿöëý¿µý»ö¿ÿïíûÿÒZoßÿë¿×þF�?mm/¿ïöúÛ3þý³ý¤Ýßû éÙšÿ[¦ÏúÚ}^Úìƒÿÿÿöõ¥²-A›´Ûÿ´©ÓØeÏNEǰÂWL36îí6"�MS´µc[c´¡°î“nÓ‘\4ÿ’«Â †‚A �t¤Óƒ6Âh0œ;K¤Óbi´˜MŠŠ SN˜L&ž¤ÓNÐL0I„ša‘Âb©äI»M6 Nd(GS;, ÿáÛ#V{‘òÐ`‘VÉàÔ)VÑ¢���Åœ��„uHù )âT@Ð0ˆ’$fœ¬hç`Á#äF�ˆFºR +è0„4" R9Ú+š=è0¥^ƒ3¤Qä8édð) úòÌÖqÊù¹6( Ñ­¢á§w÷Ìú^“á'¤Aÿÿ¢'þ—¥JÒnïûúý/ëë¾Ú0ôÿ¿Kÿí{]4•o3ÿ™ÿþ—¶‚ÛAlq«ïþý/×Ù ³Ù +l t¿÷ÿõàÁ Á‚°k·¿ûö—ëâ#dO¥íïíò3ý|ÿû}%ÿó"“ûÛ×þp?ëðÞ‡¿îþ—õ÷l‘ýÿßÿ¯Ì€÷Öo{ÿ·ëÿûý'ãý�¯ëî­¥ûÿÿÿﵦ÷ýõü~ÚM¤¾ò }ä_ÿb˜¯}ÿëÿ´TâÂeB#ÿɰ‘ÿÿÿþW*eqh›ÝÿÌ’¥?9Là¿ÿ«_~v¶ Ä~þÿ�þŸ¯øå/ì«2Oå'ÿ]W_ù-JU2O%hŽˆª#¬©F´HD}ML…F¨ÔjR™eCÊ55(ŽW ˆaÈAAfB'=’C ˆFØB<]‚XR#6D†f˜ ¡‚Xh„™ 2".Á‚a„h Ò04Bjx#²0Í’3y˜‚ ‚#š!<&["¼É/3‚hÙ4‚6¡©ýBh»#ÐÖÂj°4›H\ÎPœ&ÒWÒaÓa&Òa¤Ú§¦ši0ÓXM¥„ŸI¾¨ŽÚN&ÒvLðƒ8i4–†“i8AjØIµm'e &ÕÒm'&Ðg –�œ#Í&ÕÂM¤ôì³§áPN“¤“®ëN•n‰E+õu„ë}~­¥¤ÒOÝ7ÓZM«ö–•ºýÚmwZ¯v¿Kq].·iõQQÒÒÒuV›ëuwUÒúû¿[Ð×¾ûÖñÖ»¾‡ýºÔj7}þ­¨ë¯¯þ¾£ûþ="Ü’}Ës†®>¨±›ÿ_E«ããÿëÿÿUñ_ÿpÿZýÿ÷ÿK_ÿúÿúú¯þÛ~ê¿ÿÿþºÿÿÁÿíÐ#ðFÿá°ßàŒÿÿÿÿÁø#ÿßéí¤‚ýÿþ ƒ »ÿÿÿð‚½ÿÿð—þÄ “ö—øm¿P—÷ÿÿþ—„¿ÿú_ú2µøKûpÿ¥½ýëÝÿ¥ÿïíôµýoÿýºûß_öÿ}/×þþßÿªûk¿ûgNŒuêªÛw×û¥·z®¿þþõÿ�}k¶gëk÷fþÝZm¶ÙŸ¯÷u¶g·ßz™þý´¶{Âv^U¶„aÁÛ +îpí=°•ÕÕ—�(2åg¦Ɇ´—“öÒM°“vÈ£‡˜äWå¨kæÒ¦¬R†96!'a6âb¢¶(*a0Å6l$Ä ÃI„áŠb˜«IˆJša´�lS'bšxTÓM‘ÂM„Âv­>ÚjÚiÃ% +;aD(„ÔUP`ƒQMš=´{aˆHÑa2VMB…]ˆÊøŒ‘“™�Z•qg, ñIÄ}/߯õêÂ_m$îØÐÊÀø�þ¯õïõxÿÿÿÿ,–J"&d§#aHÙ‘ J 4Ð~ƒèÎéÚ5µ˜\ÐȽH8T›Iµ¤ž©XZë½']>¯èã×ùë*ªKøú\ˆ5ÿ¨I{Rä—ô‚×.ÃbÿzZðž^4¿„‰MXÝ6¿Â JÞºþ‚n/ßõ¥ßë¿HŠû>"cõ®½^5i_ßÕ´¶÷Iv— †ö†½Šö*˜¦*­<ÎP¸B !–ÙfMᑾZè"I�ƒÓ;˳†_L쮄 +"|áôDyÙ8#Ç +hèÜÝ0‰ö´^ëÚOü³˜ÒwºÓ_J.ÿKªKó7[í{µ÷Z-!Òß*?Ž)C�¯ûI-HïÎf² H¥Æ¸îÚs5Њ‚UÎe;! ÔΖT–M¹—#H";Í#Hñ ÚI#ÆNÖÂpÈŒ dŒÁšòâ„ "ìÒ.eÅ8GX3ä|�3z.("àG°Â.F€ä%D&BÖq‡°Á‚]åÓ6D‹#ÿ°� ´ši„]�p˜T�ÞA0Ó43� G†“j›´…†Ã¦¨]6“ ˜iÿÎÒm'I´ŸM4C#n©ö“„nK…GŠL*ÑâŠ÷Ùö•…EpþÒ²â'¤ÚM¤ØIµVÈö› $Ý6r‘GûaþÒŠ¨UUPÛ^*´‚ b‚M4ÓNƒ{ 28 íI‡AˆM �qI¦Å6 T¦ši·ø Âjªª¡†!T*B‘oGÌöà #Žxh¤&’46šF‡HA4ԨуÈõ2g5¶« á„Ä Âv‘¡Ïxs¾Wþ ؤx�‚pE"#Gk|´´d6¡ƒìMüRlhG߯õ ¯]ÿéý}kû×_¥ûIpUÛþÝZkjÃÛPMA4bÃ$naGÇ+ü1µVCÿåœeÿÿÇÿÿÿÿ�še¸y%ÎÁs'¾ï‘Ú´ +A P¤)ú’ì&ƒÓÕ™)¿¿ï»ïýéé÷ýùÙ©’8Íš"]ä<�þCË‚æÁüì)BÇÈšÉ^<¥‡°œ5 Úݯú¯á¢íè¼o}·ÍÍ´‰é·Sÿ×Ñ¥Âz´¨7õYØYç"M‰@Ó:d<ä¹Ã*Ë8d¬e” œÊL«.É€åSŒŒDDfΣ5µ%q¤j3¡šˆ�_½[ÛÓt½´¿\°�’PA•xG¶ˆIšËVyžP@Ï‘óD Æ(Â4^Âd\Â5´{„\=“ò\ByŽk ¢4l„k #XfÊN‡p #c4‚ …Ê™œ@ÁÐF¶¬?¿ÿÎöýÛÿA7£Ã +„5H;&8I¢+´,;²aíªAŠ‘ÛBÒl$è Þï&Š †ˆ°Â I†“náa£ÛI†¨öäžÃE[IÂL�“ 'û~?¯¥ú_¤öØTK˜UèR°’'ôKÞíAXU¨+Dá$Þé7»º«pOºM¤îðL;KNÚ¨&¥tÂJëÿÿí·êÚ_¯OÐVßm§ÿw§ßiUG¿ý'í-[Kÿ~éßv¿]-GþÞ½m¥ÿúCîö÷׿ßÿ¯î(]«î¶Ó¯Z�»Z¾õ½~¤p·÷àîµú°“ir[5õ¾ïVÛ¯éßëäÝýZ·Oþ¯îþ=ðÈ“í±ÆÇÈ"Õ-þøÿßÿÿòë­ÿê߯ëÿËÿÿÔaýpÝW_ÿï°ÿ¯ßÿúóƒÒoÿÿÿ¯ÿÿÿÖú`ÿçW5UÞj6¹÷ÿÛÿÿÿö×uöÿÿÿÿÿÿþ½mÿÃuÅÕþ¿á¿ÿÿÿn¿ðßÿÿÿÿÿÿþ±í®ÿßï¿ÿÿàß÷ÿÿí„£Ø?ÿÿÿÿÿ¯ÿ [h+ÿY½ýÿïþ·ÿþ¿þ!¿_ûu÷ßý¿ÿ„¶!oõïý¿ÿÿõßÿõÿôd÷Ûv×ÿ×ÿ¯ÿÿÿ]Kþ·KëõÿoóÉöÒÿÿýο×ÿþûjßþßÿô¡&Ωþ½ý¯ÚÿßúZöÿúM­ÿþß¶½þÝ}ýv¿ÿÿÿßâ¶K�G·Å|ƒ¬Ûµ»­´»Kþ»þä1ívÏý=wÙ…º^ÞÚ°Ï®ÿlÍ/Ýìƒó3úílW××ûfÚÚé'u"s¥O´˜äJÚjÚÚ±ÚM¥l„±í¤š±ºM…cTö-§"§ië"ްÂV—e °²¾¦¤ÓNÂIØA°‚M0�„¤qi5NÓMÂ`öÒ °¶“m$ÓpÃA*GtÓMˆI¦Òi¦œ¶ÅZ\DG ¬h®r±Â#Œ� b1 +Vg¹!B#�0„HøÑH+ô�| `�†!ˆF¼0L0Žˆ1 +{e„@ˆŒÓ(E Îx†&‰ùì£Ú‘¦Á‚ W̆Ù�;*ܲáĺ¸Kÿ¯×õë¯þ‚´¿í„­/ÚlPb¾L챆 ã+¢?ÿÿÿÿÿÿÿÿ–EÚEó³&KäfE£´¨ìˆ(D{52Y×c{óµ8 Σ +R7‚…Tx…3‚…3þE`høÂ@Ûì7ô�ÿOè “¤ÚWá½ÝG÷þ•6·Mømÿ}ÿé“kxß’ŸññúUêû~ºÿô•n¯lïBE:5yÕ/�¿çc¯ú +¿" ãd@¥Ù AP<œDDé²$O˜#ĈO0å`ʲӌˆÎ0Y8§#¦F +CÍ‘)Hğ) 9«'ÈÃ>I%m]ªƒ(�h4n„lhØÂ5½xMš¦Òa4n™´|jƒÑ¡±‚AP˜F¶FA0š60�Ó9“òt;°ŸÖ¿´�a„­&Â"Û-'I´¼ ›dÎÃJ ál³¦ÂN’Nˆ°ô�¦’mÛKDvÂ5´˜ijîF·ú?ô¸ ØWK„êø¤ûþð�-*ô›’„º¨Áô¿I´¯ ˆV–“®ðLBÿ ÿÿwµë®Õ¤½S¯ö�õzw·}-ÒÞžŸ§T×ÿ¦þ Ÿú»Ûõ¾½Ðסû¡¿õn»ß}~¶­¯C­ý¯þ�Ïþ½ßzíGå¹"ÿ–9$þ¾øíÕ~+¿,r/ÿ÷ÿ‹ëþÿü¾?¤?êÞ¾ÃýuVÿÿÿÿïÿûúúíëÿÿÿÿ{ëuþ¿ÿÿçËûÿþ þx#ÿÿÿÿ ?ÑCÝÂ8ÿÿÿôÿ¿õÿáÿáôÿÿÿÿ‡ü$ý„ÿûÿÿ÷­õKûÃz_ßßÿ_àßáºÿ¥ÿÿÿ�þÕ¾ý}|>ûÿÿm{÷×^)ºì%ëÿÿÿëýÿô¿þõÿÛÿýýÿK­ÿ»õÿÆÞôõ~—Zýæ­Û_oÿÿ®üçõª»×¯þÿÿþ­m]zÖÿoÒ½öÍ?ö×oÛ­/^×ÿöïÛ_û«ÓÔ;Òë «iÝ6°�ì3ßí¥÷º[iÞº]„Ýëí?Û?·ýßû¦ÒmÇi'Ã0Klm¨b¤p•Šdy ±A4Ó °ÐI±­¥i'#‡M¤šØm;V)�ƒ»cT׺M‚(tÆ+#’iSH4Ù(„ÂiÐa…IÛ +ý6)6G 8…`•´ûšnéöÓ +“‘Å4î-šI"`„a! +Eeƒí-4" ”h BˆàÂ5©KR(�„K a ªäý»HG&æÑeJ ÞDÚJZÛ`°—Øc ´¡‡„µ¾8J[iñ´ê"?ÿ–º|›ŒŽÂ£½s±fháKu$R¨‚‘|–Šld|(PƒA�’º�Ã2Õ…'‚0ì'Dm°Ð�r!£Ü#DîrßÂÌh n~~ÜÜ_ÃúÒOoþ•[Já‡[ÿC�öŠ6# ÚV¯‹i´ª×Ç-mooßÇ¡úª]=>ØãÿË^…’ ŒÎ¦™ZÍ#Yú�ëkdÀSVßœ�DDÞr#hŠ’ä2 líÑÈj²¸ Ò #@3=�DÂjà 2ˆ d�“4Q4¿ð‹¹œ2ø Â5†àd„i„F4{ ˜Eã[(F "ì“F™² +êŠÜÑ-Ú¦‚uØM*h«iðšÉ�H6©¯þ‚t!­ú3´› 7„{i¡a&ý&á:i„C£`t�&Óí$×l¼Ú[úN“ ×_Óa¤Ã9ëé6’vÃK´¿omlˆ=ˆH4Øa$اM0˜m$ÓN!Ò6ÂH6�`Ì=�ai†!1ô„›I0›�v©ªllT0š $x£EˆH®Â¢,‘¡£@aˆH¬Êº*ÛAŠF¾8 Šb�…!=´©à��!„ GÈGÆ�š#�‘лsà )Ü6!,;d­DPB")¨ˆˆ8¤w4-�hDFa4"40„DF„F�‚#¸É¸�n#ˆ‹cЈâ#¦ð—PÞ‚û pIúºŠbº  ã+œ¬qÿË`d32ŽÇŒ‹3°”()>w¦J^)‘;é§é­”°·wþûïý?*¾dó*~va×__ +ýuÿþZý›#¨ÉÙÁ +:’!ˆ„œŠy›"$pÑ “dCpÈb‘‘¬S §DpÐ2‚È™æu +EQÄm’“C>¡0‹°Â„Ѻ®i§£\#XhÐòyBa/­0ƒðš5‡„Ѱ2x&zR;F°Ô&ƒÎ�šA0�Ò8Â5†O—$BLç5ƒg¢+´hŽÚZA†˜˜N“iz¢,0�b‚¢;rg á„r;i6†³ý ØDXl´øIµE»K¦’ ¡ê“ièœÚW Òt¸&Ý]'Iõ@ž¡* Þ�n ´›D¢©i\z¿é¶–í%a�ež“×Ý¿ïÕ=û�k_këÿ[v±¥o}}-õwÖé¯]~î¤p­:Zý¨×¾ûo¿ºtÝ ¥[ý}tõõCºB—ûˆ/^XägýÐÿþïÿ,p^»ê­þ>;ëÚ«ÿW÷EŒÿ�ìÿÿÿéÿ×ïÿþõ,gÒÿþ¿Þ¿ú_ÿþþ—þ¿õëÿ¥ÿÿÿ <ýºÿÿÿ×ÿõÿn¿õÿÿÿ‡Â4ÝÿÿúÿÈw‘9ÿõÿÁßûÿÿ éì0‚ÿûý}/ý'Òþ÷ÿô¿ÿûþÒ¿ø…ÿÿÿ¯þ‚ôÿuÿh/é?ß¾•„h ÿßÿëÿ__þÿ¯É±"¿Iôja`þ] 3at0æN‚"yBäxá“Ù(g -%$8Û6ϳ33\Í*5Š +©¨A6ˆ†t‘²É:»@Ö© …Gwõ£]’¦©¯iu +“H§é*W $‚ °â‚ñ �RëI ‚pâ Aôw¯­RGt®•R8ôw¥·¤·IzB°Ñ£“ɦvF ÝFÀÑñ™èÖEÈLƒÌàƒ ¨AèÖÌà˜M„ð‹°Ñ°dDg„!:0�np¡ &ÒË= Ú á«ðÏ0‚m'H:MêÚN–“i8TšDv¢;„kal°‚mpSm&Â"Ãe�i:¢8l˜ù4›®J)XKô®›QêýD%¥ë úKJÔB­ �a1 +è7«u +Ò¸&õ´�PM´0N“zpí +­?íïôê�Óþíi:N½‡IÝ·éÚo×iÕ=ôµúmn¿Æ£ºíw~‡j5û¿¯þÖíè[_únÿ\zÝÑnJ‹êþòÇ#¿ÿ¢�ÿýýùc‘žú,r3þXéֿ⾯ì?ña¯ÿõËNÿÿïQÿÔÿå·4ÿÿÿaþ¬¿û}ƒ{_ÿýïÿÝÿÿÿïöëßöÞÒÿæI÷çOÿúÿÿÿÿþÿíþ¾ÿîéá/ß ÿúíÿ·ÿÞÿo÷¯9ÿ¶Iýëþ•í�?ÿÿ¯ÿÿÿÿí¯¶g·ö¿ç?ìýíßþÈ ‡¶Ýrÿ]³EûdëöÛÿ¿nÞ«i0Ï&ËÛi/i'ûiZL3ÜCÕnjÙï[�Çþ×´¶×]†í³û¯í™«"A Ãǘm '¥‚ &b¤ÅI\ ÓM[cc‡A6ÓL&�®‚ؤíX¥¶EñLj·"cØ`¶ŸFv &±A=ˆU§†ƒ +š[´²8°L‹=„ÖÕ8pa ƒa&�°“ ´ÂdqNÓaÓb¶JãµTv)”1ÊDì»A´vèDWXSÝÅ(Џ…|´+ Ò×ýuí-/i6—a‚PÐ\‚EÙ0â7ÿË]C-Ê"W�Gb"¹­R_!R…;Œ(P½;]?¢³_Ý÷õ^ï·ò¹®VW�Õç~²T¶º¯ýêeO2?Õ?]t×å¯13dAæÈ‹ŠUŒ“Í™ DBLŒ2¬•”"*š ê22DN›#YŸ0¹³!’‘¸Ò52#5æâœÓ£`xLžP™'#[öÔ Ñ££a§ ¦��(Î�a˜Â6Q¦\&O„NBd Â4ˆ@gpað ÒF°Ñ ��‚5²+˜D`ff~DFêi<3†"$éhŽMÉ¡6ˆí²hM„ ŸIŠI††–Š40œñG·&pÎ4�“PEvжmi<˜ëG†“d$¨5M¶ itü¤¢¯6–éZ ÚJ×WÖ’mн¾,;zm+iÃuÑ/~ÐâÚ +ÕyÃ8nì¶ë =xvÞÒéÿöŸ^�/§ý¯Ûéúÿi¦ëê>ëkWMîõÞ�ïû¯R8Wø×¯][q~·Ý/¯®¯ýU÷¦ÿÿ÷Øû�Äè‚Mcÿ^ÿ×þ>þ>÷ï‘»^ÿëýö {ôXÍòêëú·ÿÿÿÿöÁþ�ÿÿ×ÿÛ÷_ÿÿoÿÿÿ×ýw‡ÿßÿÿØa?Á¯ðŠéÿÿÿøoÿýÿÿþ ?„hÿÿ„½´¿ÿÿóIÿÉÙûuÿÿþÿü ¿Kïÿ öÐ_ÿÿú_úø7ÿÿÿÿýÒô’ÿû½/¤ ¯þ¿ô«ü%ûÿõý¿ô·_×ß¿}WH[_ÿÿ×ÿþŸÿýÿþsÕzþÿnõõëÿ¿þ¿ô½N'ý¿ÿûõ·ë®»dëîÝuíµÿÿýVÿ׫ïÿô¿°Ï_ÚW¥aw¥„Ø%ù½³êîÂ|†?ZÙ…ÿÿwÿ}¥×í™ÿôÚÝŠPšá$í(¦í#‹¤Ód~CÌr8{m¤·j©«"å6DídWJÒ²þ› $š}¥a>IÚ"‡JÄ&ž)…M0I­ƒ#„Ó„m‘É›I¦šwI§´ÂMn„­&(&›šié2+Ùu2×$à†CF[„w4v³šb +P˜DT&¡„k±ÐFÆiÂ5†i #@} ÿð‚mu­|$ßJ—Uô¡Bg‰ÖÒi+W“ö•¤é[ŠM²ÐÝ&ÒmÝ—L«xvY: àÎ4­'&Òpˆ¶Òm'IµI†ˆá¤ÚMùÏoÒ¬Ž6öÒê©HäßÖºÿ[µÖ´—Žß¥¥é_ÚûX‡Za6½W¨Âmt�+ÒÐM¤Ú$ô¾—¥ê„Ö’®±i*ôµJ»Öé~…Û¶–¢¤pº·ÓÅ¥¿µ¿õ«ªvÓu¤ê�-´ê�5ý'}ú“PÕºªêMCëIuê•ßëÞXê÷®¿¯õVÿwýÚ~¿C½ëQCãøÜkëýšÒ¥¾‚.?I-þ¾¿ëüÆÇ\uÿ–%ÿïÿñþ[’V�ËŒVPÎh‚Rè±È§�ë>µÖ—zJ %6´·ÒSkIMõ¤—þº¤ÃõÒöÿZþ÷ÿÿüX}éc±RÓü¥­SýeÞêc±éuʽò…Ò¥])�­Lëû{¯ÿÿÿÿÿëil=×ð×þ½ÛKIµ¿JëIRµ½µ­-i/uªÿÁí¥†üŸÿÿÿÿÿø#zÛð_¶¿ÿ¥ÚKªA,%}vºT‚p•úZ¥ÖKIp—øAm¥a¿/¿ÿïÿÿÿÚXoÑãÿÿ�wýõ¶º ´®¢ é +Òm+¦ÂK¡(¨m ´+ý-ˆ,>©õÿÿÿÿélVá/ßÿÒúki+j˜J*ÒA0Ö‚`‚Š´¢ª´*tªúZ=Wô»}µý¿ÿ¯ÿ×›Kô—}÷þø@Âl0�A†H‚ &) ƒªB`˜„Âê*©ˆ[_þÈÚ~½ïÿ÷¯õÿýp•‘´ú®öÿ÷¯Ñþ�6„�ì1�ä @�…"í‹ ÈE !a"n …A„0¿Õv×ÕVÛÞ¿n×þ¯ÿý&ÿ¯¾öÿë䨮 ™1þïd™úÒêöïm+û3MÕ§ëÿþ¬‡œÓ¿][lÓoý¿^�oM=Ypí†êÒ‘ †m¶a¶_´œ½{`®•öGv“i¶^»^Â8áÁ°Ò´­-KíŸM¤zoažý³òßÕ½4Ó¸'mˆL0•„˜'bƒJ!Ó Bm& "‡± AA„SâiÚqNÛiZ +1LlVIŠM6*á°úN¥ fi¢±¢±´ #у Š„G&ƒ@ÁAŠh£øØL�T-5ã ¥PžÂjà ˆPÒi„A…†Hr‡5i°IÓ„z,õáÄs Dv#(b ¾DDA‹%:$F¬F{ïP—ޏå”T7zúôŸ·K×õØa @í/´¸dWHžm/´¸bˆd)›M† qiƒH8Ên4hb�n""?ÿ–Òxí]$J²©Ke# +4ɦv±¨P¦J¯ôšiþ²Ï<²d¼v::eíÿýù’®m™�2eúÁ’B“8„Öîîï�¨ œ‰åé�Ø7U ‘�8#ÅB’ó Š}°ÐøˆþAdA±Uûµý}zÿÞ¶ØY¸¿¹Þ£9Èb½i »ýš»\ƒ_úÿ­ò—„|lP"xëßz„¡Ç5fÈŒgHÌL§�)8ò6D2"b‘ˆá”ñ Í2„c%ÉJêJKåó‹9ˆ�–¤FJKú[úN@Ÿ+ŠŽïѱ‚*(L¢ �’6=áÃÐò�Baȵf¶&Q&v�†Ù»1Í“ h¦¬�y4YŠ|ì EúJý«ø¾ô•é:Z^¨'ZU&Ñ(¤Û¸T´­-ݨ&Ò´IÒM®ºN§ÚN¶©i‘ÍßÍ‘ [ÇR,Èã(@„@¤ŒÙHÍ‘@„@¨„ðd ˆ„E&ÔœP@Ê!£dp‰²$#lÌC@‡Å(ÖÈAsdBfÍ.«Iº¼;{i*ö)?ûZNþÛµ¾–“úN÷Ö—N·ZJ¿i«¤ë „l¤‚Ø>Läk"ä&�a„ljGÉœó£åÂ4Qº��„laP˜A¨M4ѱϔ|hØÉäѬ< Éõ?__ê›wJ>ÔkÝßû§q[ouÐ×Þ·Cq�^ºÝצê·ü3†“}ú Iµp©4ˆñ¤éÐg \*NË=Òm– 6‚Òm&Òa¢;"Ü Í�CI´�]&ÐÐMÈî",5Ò_m[_ؤCŸ÷‡ÝWÓÿíëþ‹V•5×Nº×Qút¬#»½%t­]%j¬$ýÓ{¤£«¤ÞººV“¤Ü&ÐnJZŠN“h”B¼¬ Ýuõÿ¿RÓØißð÷Õ¶×­ZûþZ~+ª�ëíãº-É7Xëÿaú_âétôé7º‹ßŽßZ_­/Ó´Ý4©ÝŠÛ�>îÓ®´p_Î M×ïì=ô¶ÿÖ¾½éz_]kÿ]/�Ý®¾¤p¶þÖ¢»]½ö¿Zèt4ÛOûŒwtÛJ5ýú_ÿëû~Þ þ߆ÿýýïÿýuÿÝWÿÈrwaúòaÿõMü>¼D=+ÿ¾ˆz;_¯}ééé]ÿ¿ð�öÒÃûuÿöß_úéP#?ýoaÿý)ÃZ-8úÿ°öÃVþ¹u÷ÿ¾]`Ø?×þÖ=ãÁþ¾ÒÿÛAa¿ÿ^ÿßuûþ)B ÿñA?ÿêÃûm/×ö°öê¾½ÿ¿¶ßÿûÿý£Ã½ô¿ø@ƒÃþôÇýߥuÿÕiôà }ÿÐÃïøoÿÿÃ{xoðGÿÿþl?ÿþ©/¥~´¯Î©Ý/ü(ÿ]­oï±Pýû_Kû×Kÿüã–;oÿ ÛiþÁ¼7ú_ÿÿþ7ÿÿ¯í¯ZôÛßÿÖs}®öïßïê«ýýõÿ÷BïÝöa _áðøÂ]÷õÿøl?ÿÿ×oTýj÷Þݯúë­´Ÿ~ÛÚý½µÕWík_oþ»ïûÔ!ýº÷ßvëK}Òì8ïý$µí%í-+l÷ÚL3Ö_d1]µ´­ëVÓlôÚ{ýž¶Ïýv�íêú홯ííœý³¢½ß {ëïœO¾º÷·mÿÿîõÿúuȳi+ØI0š ŠOIˆR8 ;M[ ÚZI¶“WZm¥l0«\ˆ;öÓùpíµÿ¥õêý�þÛüçÿš{×ÿ·×ým�7/ö»ô˜‚m1H1Š‹ÃVÅ¡Ra4Ó»b‚I±Za‘Ä0ƒ#„Ó¦˜b“bba:i±­0œ&ÅlÍm·[i^ÙšþA)Ût¿ûÿµõolÍ[k¯zMï[êf†VÂͱ3ªQäb B"�ˆ0B ¡ˆ™©XÁ‚Es<üª‚jw£Û ˜À‹ã ¶ûaªö»jØA°ÖÒ¶ì3•Õö—iYzÒm.E¶ƒa«g§K^ÒÛ=ÝZM¥vz¾í$â!Cˆåš�7M0›iÚI†LˆéŠÒN¦ÅÂ&ž’é1 H6‚AÂm�ƒ¦(1M •4íƒb›KI´‚aŠ ¦´¯Ó¼4�†Gì15 „Ä$æw ÇìBA±M1 Œ+NTL&)4ø« &6!1V]òO×-Ã̹3°¨Aœ]e¥@ŽÉ[ú\B¸ˆŽ#ý¯_ôÛA'ëé0Å_KÕ2½0�´½!°`—Œ1a¸�þ[)"¹$d2%”µòP¤Tj¥-“ 2yà ªßªüÈHVŠqQ¸?ÿ+ÜTÙ*ŽÆGqÒã-b»þ‹ª ÿßêDZ¨U5êdˆ)–žJ±ò ¥rgCÿ’µ×ýSí}íü�ÿšß|;þý%×õÓÿ¿»Öv±›$D¡´" «/ȺÌÐa�k#A ©‘�D9XM\¨#Y�ÿ)Ñ­FÒæÚç#Y�…�Þ§O)•5ÇòKøäÆJqÎËu ª5Â5‘pØÓT|q #`{!Ÿ†±£cL'„h ÎA£`þ£�™@Ñ �A‚5°�“FbÑ áy��ì�¢„xVåùC•dmÉ×õ\*#¶Ë@L0“I6°“Ëæ“l³“ôI0Òl"-½-a¤þ¬— Ñê¡ú44›Iáý.F;HXjÈìmlhØÓO‘{"«"™N»ÌŒó¯�ÆkJ¾¨'u~’nIÖ8m+ßÒÒ¸W¤ðN“éS]`­Ùgm¥ ,%{,öà�†“aÌ„M$ÚM¢;s!¨ÙÍ,ÙfA‡( e�C” +N*"tÙÅ!(†�‘ã(�™ fcDðe’�$l� `��%Ã™Šˆ”#¬„¡ì�Âìþjží7é¤út>ÿÛ¤©®Óëí¯Òïï[Ö–¯ß¥Ó¥cý%iZ ì‹°™¤��é£t#`aÃØ?B60��p˜Fæ¬0��„Âa¡˜L#qæ|£\#cÝ5ɦG¶vGçê6Q¡¦¡áP™E +°=ßÐý ïµ#…Þøãþ¶ºõ¦í'÷÷R8ZÓ#„ô¾Õwoÿ®Âa5 áªO ᥤÚAÒ „�&ÒvZ<Ò†�tƒhŽÈ·D[a +WA:M¤ê¶Â]8JA:M²gM²Ð›‰ AØI7ÿÈ'ù +Œ=ø/ôXä¨Cžøþ¾’ï¿ÿƼ^ñ÷ґ©(w»Ô'T¸N“¥ikk¥x½k¥­Âa7 ¹8IZOºVºÂa>ëJë®Ò^“pM…xI_õ¢utXÌ?Hvô±–Ÿÿþ‚ÛÒÿýV´Z~?h±Í¥íd-T~ßî¯éj©=7N«û}¤ôß[MãÝŠb½>ÓºZO§O_ï»¶î¿ÿÖ—°ÿûÿõÿê´ÿÿëÿ]ñï¤]EŒûëwHw^5׎úÐÔWw÷t;¸×ëô5ëëÖÚwm%#…ÿöëÃ{ûhãÒÿÁô•´qõÿÿÿ¯û¦¿÷µÿÿDÇ%M7Z,r:ü‡O¦ÿþCÌ8h‡¢ßñþXä†,|~¾ø¨‚þûm/ ÿôßÿ¢¯ÿ¥]6¿ÿÿø"ÇÿòŸÿïÿ¯®…%ׯôMZ_þôZpØrêÿëê+ÿ«{í"Æö*ðßÞë¥ÿ„¿ý%µÿÿîÿÐ/ýµt¯ûÚ_¯ÿÿíÿ_ÿ¿°Øÿ®•zëÿïÿïûë÷Lw¥ÿéSí¥ÿÿ÷é~•ýþÑOÿÿÿÿ ÿÿÿûmÿþÃÛ¯Áp_ÿÿþÂ/W¿·Ã¯ý¿Ib¢¿ÿÿô¿öê+þë¥ýýÿÿ†ÿ¿ÿÿÁ¿ÿÐ[i_£ÇÑÿöÿÿKÉ÷ëÞ›oõ_¢�kÿý»ß×Ò~6›oþßÿÿw÷á¿ûÿÿ°áïÿÒv+ð— ¿ÿnÿí³NA&õKI¿{3Vf¿×ï×­ÿÿß¿×ïkÿ¶‚Šýÿýº~Ãþûuþ—»÷ÿ„¹œ.ô½}´¿wkì4˜6ïnµlÿf6¶ÕµÖí;Û½ O·®þý³>öÌÿ¾ÒlϽÛoñµýýîÞ¿ÿÛzÿûnûÿú„…·×ÒÿÒÒm¼&šÈ¾)¶)ÚPÐLS´Å1I¦°Ì«š×Nœ‹�9é°ÁX`¬0—eépúm/¦ͳÚ÷ÿoß½º½³§_··_õçU˜öïÿ]+¿ï]ëôŸûA°ƒ +ñR �PL&°Ði;N�²8 JÛÒmZl+L1 ƒ11 bÃ&)‘†¶)ŽÂzïïlÍ6êÚ¶gýþÛ¯ú[w^Ùšmõd<扵׵»[¯¶ñGDDB hFVÝ +N"�Œ0‚+œ¬°‚+Š<0@ÓA„ìþµ*Ä Âa8†˜A;õ­¶qé°Â°Â°Ï+I¾ÂWY{Øg&åiwÚì3•­¤ØVõõˆpl0“|Š8y‹îcm-,%mŸõɱ&Ñf Úî†!Z²#ئ0Ú Œ1M„˜ ˜MˆLa´aS´ ˆV–“Çv©ÈâÛÇ Ø…ñA´„“[b´œxˆP�†G�†°Âbƒ'v ˆP‘¡Ïl0ƒ1£YVî)CLBb˜LŽ!S‡l'°Ó%všª¦RÓa¥–R„#-l3Ès¢d+DµÚIGWÄm*é{ ÒÁˆ/u�´¾È®“„1 :6D'å¶O…„µÆG`ó²ú + ˆÁ–ê“Ç`Eý#¨p�TT2+ÝÝ*}Z¹n'N;)ÎÆ£°¬ªÅqŸºJFÈ�Nê<ÈSP¡I𤾗‚™¾w5¥9]-Òéú§ÚßþºI=ä_ü~ï¾öúKÿÿwÞ�Â"|Ù��™óÉÅ(ÌTóŒèF³Kò*E Â8ó^`Â5†i esÖGpÂ5†i›$Bx"í:`P¤`ddCFÈñæt®)Ç"T{&\¤gn•¯þ«²ÐG &DX£ÛÒ ¤'e¢� Ú"»HãD(¡OªMRm TÒm t›PƒÐAûL#a“Ó>la0ƒ‹Ø¤š5ƒU ’9?ÿÕ~ ÒxL6ô­u~Ýt>pÒ×PéZ%Í2æ“jé6ƒ<ÙgòÑ>ÒmÛwŽÈ·—Í&ÂA¶ZpÍ’» +dHgŒè2A*š "„bDuÖF ƒ dâäÁ�¤,á�™³ hû=g ¤,ã$Å$Ψ��2@ÓÎF¢öÕ:ýSÇm-ý�¿IwK¦é¥ñ^¯Q}´­ûÂa7M¥h”Ro„ØW©�¤gÐaF°ÌhØÂ6Qà<#ÃðÌäEåGƬ4hyFgF°ËÁÁá2�Bqxì&Q„h„40�e ðñœ ‹¶O—$By 4Bt4k>Ë5¡»_ß_Ó¥¶HzñR8wmÇ.Í‹¿þ»[ï^ßí-»‡Ý*¢8aéi1I0Òp“²Ð�]6h,$ÚºM¤ú¢,4˜¤›‘ÛT!²XR;j�nG ƒiÑ: ˜iî‚w¹á„ÿ,uþ‹ã¿�ƒu­?[èpÐÚûéãwýýÐÃ�?Û¶•PM¶“­%¥þ®“ÂtŸéÒt¯ +�:ÒOadù»Ô…Ià�+JÐM½%…yg¼´EÒoüñ‡ ÿýÝt¿åÖ´ÿ‡ú&9"ÿÿíC¥¿wzõétêšN“ë¥÷éiŠOþúN—¿A÷­Ý/mZVéß[Ýñ}µ¿×ÿa°ÿÿ¶þ—Kõ†—ì?èÿÞXÏýìÝÞµã^¾í:õÚ�{Óú�oÛ¶¿¨×C[ýFÐ÷×ÿþÛkëûõ¯ûøaÿ°ÿÿÿÿÿ}ÿãú!ïãã�õ�xû¿õï½ý;ת·½ª¿¯ÿþ †ÿ4ŸýׯÿÛÿ ÿÿÿÿÿù ¿õùiº¯¯°Òÿýíî¿_ÿÞ¥Œðÿ—²_ÿølý/ïø:ïüÿ ÿÿÿÿÿíÿþë]ÿXzÿéïªÿú_ö¿°ÿÿýÝýûõT¿¯·þûÿÿÿþ´ÇþãÝãýðÃÂÿ·ÿûhï¯ÿÿÞ¿aÿ¯ßý»þ¿õ¯ïûaß÷ÿÿÿïÿôwÿÐ[i~ò‘©ÿÈÍÃá?í¥ÿÿkÿÿþ¿†ÿÿÿó®æþ¿¶«×ß_ßïûÿÿ¤ûþºMþ°“°Ð_ ŸA: ÿÒÃz_ûh/ÿm/ÿûÿoü?ÿíÿ·×ÿÿÕW[zí�:oóOþÿÿûí/­+ÿ¯'w„½-/ü%‡°—ÿ¯þ½´÷ÿÿWá¿í³ vÏÿ홫[Jÿ_mR?-/gî»?}Ÿ¿ûöþ×þ›'[ׯMÿÒÒýuU_¿Ý×ÿF'ÿV*?ÿoþïÿ«©Ý²WR.>EpÓM¸I_Z¶´¶ÂV“i'ÙzÒÌv¬3šÝßö•‚Wj·V¿ýU[½}uýõÍKº_ð“õOû·^íù:ݤÓi4Ó ´ÚQM&ai¦I,&!4b„�aˆMÐbi± +éŠM6)0›§i¤¥ ¥xIVÿÿv߯®¿~··ÿößúÿÿ¶ëÿë_Ø0„A˜W(DFO�„ )XÊ0‘\åcd« ¤x ]†A#D0™¡"±£Ûh21 ݆¯d¯ 0œðÁÂA±'‚(p“#ˆŸíl&GRæm;M³¦yÚ~Ýë¥gÕ„qú®Èb¶}tg=Zì3ëÛ3V—´Ùÿ»[öÌÑ7;; +eºÂ„"FµAR²ð«+Ên¶�­Ã0m±QØ7 Á݃i«0aÚAާv›a�4ÓÒºu´Ø0©ì0VÒÓØaS‘"”‰oa‚“~ÎÆ 6a8Œ®Äò×';-ò2;0U"Rª©Ú¸ì-{ü#DŠ<9Kp†v&‹tŸ´D"þšô¸G‚…)LìY”Œ­Û\™×¨¾‚æBm'RÎÔÞ¤±ê}©ßX톌Šò/þ:Muh?ïÿ¯é*úçué¡ëßw÷2²vv w‘TR—ÿªÅq ¤Kµítd4ÆRfȈ‹²|Ù¨§Ñ­gÄ'Í‘ fbP)>`ažDЄɳ: +D#dgšdaŸ<ÁFEË"3l—F´NY9�„©s´ždøªøøã ½'5J4›Pš^úi£sBTѱ£d#cTôkøA„laBplœÌì'­šEÌ#Xr&�ƒ$r/B5‡£Ù†>Fmš"£6]uUÿÂMé8TK©h� [Pž•„Hr­¡„i6“am²Î�–pÎM¢,7tE†�n_�m A0å×MCÒMé8A6¿$J™£H×Y¬Ô�—9ˆ‹dR È„A’gCO9”ñPjPDƒ%lêò ò]äŒí×~+Wº +տ餭Űˆãý%p�÷éÒ´ Ýà˜w‡JÑ'Jߟ0¯ &õt˜nì´éPgd+™à� dó EàF¶ˆN3“ó@eq h„È@Â5²1a'�43æˆMf™øˆ9s5´BLÐ!2 F ��‹†"ìŒÌæbP���góà‚#³‚›#äyÔ&9öJ×·Ý-§K¦ëéʦ¢»^£Ö»·ý>Ú§M$þÞÚK~)?úÓÕ ÎÒl$Èù7ª ˜za>G &M BòcÒu™Ò¤Ü˜ô˜~š ´´Ÿ•PM¤éfr ÓOA7L$‡?j¹¡öíu¾µêù+½!ÞG +ïß¼m~×÷ŠÞí»ñ÷ßêôð¨Ÿôé4•²ét› ž3ÆË8'JÕö‰s}Åp¨!Ò†â�m–v}«i:V“…A‘Í&ÒÒpªê|õpÐuuŸé\´ø�þ­ÿ$�¼±Èè$�Ãýâ?ïîˆsë÷{A"Ç]¯þïýÛ^©+}Õ¿mÝÿQúKÒ·ô­]uŸÒuõ½/IEF–ý‡úÿ×éþ0ÒØË1ÿÿ–Ÿ·þÃLJMÿ_ÝëKWR8_¶Ÿë¢8^ž›ßÜRÈáu~�V½mñTÒéßw×oÝØ¯þÚ_þÃÿaÿÿÿºëÿ¿°ÿÿûï×ßï¶ÿú¾ïýê‡Õÿèw´†ºý÷Âú·¤?oðFþ¿ÿá¿ðßÿÿÿÿï¿°ÿÿÿøþ£ëÿü²ï]†õ,�Ñj×. þ]^¾øö°ô¥ŽKkôÿï÷þÿ ÿÿÿÿÿ÷á¿ÿÿþºUÿïú_ïü’^ÿëì?ý}‡ú½0õH|7øKÿ¨¯ÿ‡þÿÿÿÿôü?ÿÿÿVÿÿÿÿÿöõÿÿõaÿÿ°ÿ]X}w¿éÚ×ÿoþÿÿÿûíׯ)߆ïþÿÿ‚0þ¿ÿ_ÿÿðß_ÿÿ†ÿÿ·A½/ßý~ýöô½Ûýÿÿõ¿_ôž÷ëÿÿøA;iÿÿÿá½+ÿÿðßÿøoð�}CzÛyÏýÿöΟþiÿßÿý>ÿÖ­ùõºþÿÿëdtÿÿÿÿ‡×ÿþü?ÿ~úü?[f¥þ¿}>Ù¢´»3ý³?ïÿoíÖû¯]+oZºÿÿþ–�§ÿÿßþ¿~Ÿm·Ýþÿ÷ývé; %ÝwÈ®°Âkì0—I¶’tÚKyŽé²÷v}}ÝýÓgýÒô´›lý®êßßÿõUoÛ¯ÿ¿õýô¯ë÷¾ßûßß­%ß[b¶I„Ók „Ã"ºM¤a›ØIŠL'iD,(d.­65Ml ˜¤ÛK´“NØa-´›JËÖل馟ý~ý×ÿÛÿ¯Í_©ôÞëý¾ÙÓý¶ûóŸ®»”ÿÓ†#ÙðŽ³Û•mÜ'�Ü«µ 1L0¢¬0˜„W°™B‡a«¶Jé§w $Õ°iA&GJ›‚ ƒ¦ ˆ\i¦ŸþÓ�~™ÿt¿ýŸþô›þº»?ÝÕûfjÖÏ®½³óí¯×]ßÖ‘Ÿfyì› G3³<È%„ÊçDr)ô{(ˆ0Žˆ0aˆMA´VefUºéìsm†Om/ÙØ]5´¬½lІ’j­„²ó¥—´ØaXa[ ii¶”0ƒoí-.D:´“Ua„¯&ãLÈ’&ÊtÓM:{b­I4ÐtL1 4ÓÂLBé´–0Å10Òb¦Å2 ðÅZI¦Ä È®™zm¥a-‚w´“Œ1_·2‚5³IÛ ©èÁ‚ äVC'SGŒ«l)WEc +(÷(QA¨  Q4`š Bh#C•l ÂAŠ!謆L Ât{lTA{>*ÃŠÌ±Ó +½¹\Kr¸ÔMÔ˜ˆ�t« ×õökôöÿôšcëÕ�;a¸I!ja‚  ê(¯aj#F?ò×ãYÙòTP¦APPPŽó°—ý' ßwQaßý¹k÷•Ô¿R¤ƒºþ¯µ$Ÿúw„É�’D¡ �‚A•eù˲°§2sÁ.$Ad%¤Mbh.N*!8ŠAÈ”"ˆ*�é£sFЦ¨0˜TlqÆTÂhÐð��(ÙF¶�FÇ£Åôke îË8gšV“h3dˆ°ÐÒaƒPAPgq¤ì´&ÐN–“i>MÉÍ6“rhA††÷­+K ÜmŠM½*U¥éZû¤émzNÒVˆÇßi¿ö›wq]´žšußÒu�}SÒÒ}[„ÓÿC¯~Þ›ºpÿ Ð×µô>µ·¯!Rz]�ü~ áãòÇ"§�Z¶÷ßEŠ{ÿÚÿ]ZØi~>¿ÿýwßÝÿÿ]‡®—ýÿaÿÿÿàŽ?ý¼ð_ÿÿaÿÿ¿ð“ÿƒz*ÿ„xÿÿý/ÿôÿÐ_w‡Â_z_ßý}}-}eGý/ß{Kß wÿÿm/ÿoVÿ×Û÷uûÿúëÿ¯Z^’Wþ«÷�>õývíµ×~Ýúõo¤ßÿ퓦ÿm}¿ÛÞ¿˜ý³þÒ×m%»û».¬Âl$ÚwV~°žÙþõ³ëµèýŠM6*³ÐV‚M´“UM5a°ãb˜í Å0ÌÅ' 0ØäNi&½„š°UQQI±ÓONši„Èá1°©Â  ›á¦m�rØVÍÒÜ!©„vˆ– Ä#^“\rn“¥ð—Ð_Kè(A„ÒéŒGÿòn–Ê3µ¸šE¹È_6·p‡��Šp"ª–àB–XŽÍc²¨‰y<ÅvG×""ð2xÉÚ¤v•*�L(R•CFŒ [¬Ü_÷ôoïôüÎ Û;+H/ÉÒ[ïÐI¿ÿßÃÕ´Â]4�çeZNÓL*w}ÿMªT¢¯�úTM„±ññÿ¤>?ê�¯ÿò†jˆfTfš!DËAƒ/BEJ�£¦ˆS.l΃*ÉJt#¡}�ÑÆFÈ�Dâ’–6ÊŒã$ãY©ÐÔ¥‘ˆ"Y�q©šÍJ¢+ÿ[h ž`Â5�àhDœ™³Œœ9Á„ke Ù¤¡ ¢c‚#¿0‹°Â6B60‹€aÁ“Á0ƒL Ê3¬4{ ØF°Ér¸2F¡0@‹°EÀ4Byì:"b›EÀf˜ `Œá“á"™�„ "ì 0EÀdK62ŒÀÌâ}ƒ ºÈ–TÈÕƒ(ÌÐ9)VœR�I@ÈcÊ€¤¸ÍË$=i6“„›TqááŽRpŠÆí¤ÚªZ8íh[äw„Ú Òa ›H6ˆ®Ñá„- I´›H:L0†‚oG¶i6‚oWRM´A6…¤Ú„È6ši¤ÚL�‚l—“M4Ø8=sòDsFÃ44�hÙÑFÊ6�ŒÏ4‹˜F¶yÙ4Â=´Â‚3†pgô­'AXG–‚é´Pð©6®®´PõZIÑOß„Ø[]-'JÐ&ÉsDâ“jë¤Ú#“ãj‰{KIÙgMá'i&Ñ.iapÒSÄy¥«I6q„·eƒN³Í$ÚNáé6‚t›IÕ I´“ªA§¤Û†«®�«¥¤é~çxKWÚIµå:ÕÚUß]i:Úº¶í=7´¾8¤Ý4¯¾í¤êï�~·N®Ó®í¥ÖºÂn›Q]R´¸&×]tµp¨“¤›IÒ¯g�Ki­RZ¥iRKJºPÆ–ÇÐPÅ-t–¿t5ã¡­¯vÜbîý¡¡þŸè}]êÈí_®�úý_Mßi¿íÆ—KúzÒu¼zioÒwÆ›Õô¿IW�QõÒK]¯×ÿ–:­U[ÿ}+µm×w|uáåÍ>¨G½o»O×èoîÿÛ¬~úõ¯»ŒiÛ¿[UIRÓ¯InÒ±­U%ÿQùu¯ûþ]aÁ××ý¯ÃãÛ©iø¯ÿ�òÜé;÷ü=$C�w¬zÑ@ßEŽEŸ]ÒI%ú Wô›¿êu_Òúÿÿ¤Ãaþ¿ï¥°ðk×ÿ¿ÿ¬ßöRÊ>¾¼ºÃüW¯ƒßV×^ZK_UáÛk¯õ¯ÿÿÿ¿°ÛÿÿרnÖÝ~¿þ­¯ëÿ°ô°¿ëûÿ_aÿõÖ!~ºZª"jÞ’¯Õÿÿÿû †ÿÿòž ßëø#ÿðF×ÿþÞ¸"Çÿ‚;ÿ ÿÿ·~ZÔ‘¤µêX†ßúIu_ß÷ÿÿ‡ÿÿúïÿþ'ëýÛKÿÿúáëþÿÿ þÞÝi(^—Õ%îÞ«Ö–¿÷ßÿZømïïÿ ~múÿþb¿ÿðúV_ú ü7ÿþ þõëþ•/¥¶ýU�Z×îþÿÿí»õÿô–ûßÇ~—ÿésÀ+÷ë÷×_ï wØþýÿA;}k3^–¹„©{˜[¥º¤¹~—û½»m/¾¼Ô²ûºíÿª÷“­ýÿUÿõÂCÿ¯ïÓ¥~ÿ¿ÿw¿¿ëÞ’÷3O]RÕv7R¤ßÕ.—í¿¶ÿúí­}Ößý{zÓ·ÿÿþ­ÿ×äGé«×ï^öΛþýùäýj¿ 6°–’Z¤“¥÷è.ÒI%A*_ÙþÕ³ûfjÒÿKlýui6«ÚZÝûM™úëßþ¬ƒó3^ºÚ{u®Ú¯¶º¶­š.½»ß××÷¦‚Šl$ÚZT©lU¤Ü&Ò§\Þ‚½/MŠccdQí¤ž¶’°Á-[§AXa˜zk¥"¸a†nÌ+I´“v%܊ᦩ¦Ÿ"¸m¶ûJÂ(}—­%¥l÷aÃÕ¿ ·Ø[_lþßk¶–—¯Ba1M„ua*a0ÐQA°Aa‘º¨®ÐAL0ƒ" &!ÐI¦� �lBa¥#I±&šxI„ìSàÁ¤�1 4ØZi¦šiÂì1I¦ƒ´GlBµ†¤qا´ØäpØØ¦ÒM6)��;­.EpÚ¢¦a E¨E؆b�¦(A†0˜H"ç(Uˆ2�„kƒ�YÂ#”®`Áƒl+0¥c'�8„Ó&™€Ä=± ���$V4jrºŒí¦§› +=‡ÃI°‚ìû Ù$é6ˆí²gM¨D[i:N³ýÛ'á0�L4E†�wtžMA?¢;il³†pÒlOKIÑ4Ÿô�&Õ½&õm&í!m4Ð'ð˜F·ÒñW×ú~�.Ÿ×¯uiot­-n�+Iút­_¾m-mÛIk ñÝR¥ßix&íÝ'v´¤ý:MïéZÚ]7JáézPåÑi;- °†“²ÐÏ´¶[rUö÷Òñm'iÝ-/TµTž›KUqéÕi­ßtž›w×v»QÅU=µTú±÷k_­Ut—÷I×ÔUÒô·WKu¹(J/Ú¿…ÝuÿÛýmtïõúù*ŠëÆ×ù*�}ZŠí|/ß·¤;ô7ïýë÷Bþ©-ÿÝzÔŽ­!éº÷¯� ÿqö×ü–åë%M7è˜ä‘ýd“¯÷é¿Ç‡JXäQ]¥,r*…ÿ¾¿òÇ"“ZXû¯WPÔú×]﮾¬5ÿÿõúÿ_ƺúèèý%ÿÿ†Ã×üöÿÿñ]WúÿaÿŽ+ôßñú°×ÿÿ׿ý[KýWÿÿÿÿÿ û ‡Ö÷K÷ÿÿéWZúêÚÃKÒôµöëÂ;Ûa÷ÿÿ‚3÷_ðF×ÿÿÿÿÿÿá ·¥Ú8õÿì0ÿÿÿ]ÿðÞ¿¯þÃýxA`è'{ÿÿA~—ú m.ÿÿÿÿÿÿð�Ã`Þ»¥¥ÿáÿÿÿô¨«ßþžƒx#ü‡ÿá¿ÁKm/ÿô½¿ü$ìBþí¾ûÿ¿ÿ¿ý/ðØ~¿oÿðßÿÿÝE*ÿëxoÞOÿ†ÿA},8K¿ÿý~+ý.mïÿÿ÷ÿíÿ¯û¾–Ú +)ÿðÿÿÿõ¥_~Ã{_ô»ßÃþ“õý]³¢ÿ¯ÒúÿÔ%ÞÝé^ÿïÿÓz_¥þï­Æ÷ÿ¿ÿí¯¥ûþÒÿKû§Â_Ôæë¶HÛ_õýWõößí½ûÿ¶ÿ×oÿ_Înv/ý7×ÿœ_þÿýUßOÚû~­úïþ½SÒÕµ×û¯];õýd™š½³4ïW¶f¿Û3Ûþé½/»ÿÒý#?4Níšßÿí®º~úä·ÿ®ûu”ëûîEÔC|6—k¥ý„w{¯§"m…mÃVí´›A°Õ3îûm&Ïÿé0ÏMÕþÇ®�ÕÖªÃSÕm¥þº]ë·ßÙû®ÿµë«4Zí™÷­Ûªýÿö)‚´¤q 0“ Ba4 $ši±N�'i¦ÂíŠb˜ Å6“Å'„Ó ±LPM;´˜ ÚJ¬�a§{k¤¶\lU½1Jš²wtÈ£)Úl["å6)i`Øzl4Ò{VÁ)öIdAÃažòõ¥ÚY�ì&Ù�[#NAˆ b M3À…á:Óí~Ìì0ƒ%  Ðbƒ% …ok´W„âƒÅ&ƒª¤ÂiÅ1IÆéØIÜ6 +˜¦‚ 4ÓdpšM0Á&)ÂpšlˆôÝ*›ƒ…†*(6‚AÚQI§`ÜTDFX„DFuTv¡2mÑÌCvV`Áˆs"ìFVedA„!‚:)XÁ„Iá ¬höÉá”ìC%¨M4Џa#å„Ða0ƒ± ¤÷vDp¯ˆˆå˜_&á†ê¿�.ºúZ¶•¥ 21×\1 m,Gÿó ¶vSå‘T‹te!ôd‹…3ÉN +DALŸ$ŒŸ +¡I±vwqÙTw¬B†d}4ÃWÚ§Ï+—aB�H(TTL‹¥ïþºŽw_V�yÿý~ú_‡Ýèÿ2üŠçq’ÕŽ8ùÙªò”˜Gn·¯Jº¯®¿úýŠ�¯Çò§�’¬êŸú§ê¿þ©ðˆL›#\h2¤Àr PˆA…a=H¾DEâ%È#ÐŒ‚(\O�¬á”ƒÍ‘H2Ÿ4I›2£6f¡äÁ�Ft.É\Û5mšÈ�5&�y2°�#\™Ð“Ï""#vtɧþ¿Âdòaa£[Ý3‚6sòa0‹€Õ„ha^.Ã׈£ÇaOkM4Á4| Bd�B "ì<£3‚ FÊ!8¸ ¢.r!­àƒÖÂ44B<4‚Q ‘˜0@‹ÇÄ8Fyž@Á.Ñ 3Xa�ŒƒC)! +Od|�‘Ù�³1 +AHb“�("y„~BPŒa„ŠsÖUZ8ÈÕeœ3†ÐM„ij–ËEÛAe«NÉ�:N‚m'd¸&¤wT›‘ÛKC 6ÃP… ›Õ]„˜i<™Â 4.Lô{h&�ÃA0ÒA&д!¦¨ 5J…£;I½&ßÒa¥¤6'?&Gæ�Ô|aØF‡„l B40�aá(Ó*Aã=HL„#3ÂéÑ(¥{i:ïª +Ò·Zi+¦W»½A6 <¤áŠÜad½¥xT:V–é:$é«l-ÁÂÝl°�àÑ/a^›vTOƒm-–„Ü´3íÚNM¤êÂM¤é:M¤úM²è›I¶Z ’à©dÎGl$ˆáúݯTÿQö�Zñ×_Ô_¯z÷]Ú­§woýõÒþéúë¦ëQëß}Õ¶Ò÷uw]öÖÒûÄ,�¯KQ :W¥n–“é6‰ÅÝ¥jj‚»B††–÷¿Ð÷׺í¯ê5ÖСíôè{ÓÆ¯«n>ê\'©-ë´ÛVÐ¥¶–íuñªî«oЦ½Ó¯¯úOþÓÿ×Óù2Ç"ƒü?Ýxxÿ!æïéÞ¼~Xëw~½õ¯¯ÿ]ã¼}ÝßmÒë×®5ã·t:íF¾>µ[qÛ¯ýÿú.¸þÃÿøª-87ºýÒý´XËüºþ·þ£Ú.°~÷Þ¼Wøü±/¢Ü¡ÊH´[’ oËŽ~ h‡'ºûÕýÞ¿þ—ì?õØzþݪÿúþÿÿúþÿõ¾Ã×}ÿõ×üE|X�°×å‰õÕ½î¿ÿÿÿíÿûxVëaº;ºÿðŠÿÿÿÿÿÿíëÿîÿëÿÿ·ëì=?×ÿµ^ÿÿÿ†ÿüÁ.–ë_ÿÿÿÿÿÿÿþÁÿÿßø#ÿÿØûx/à¿û£»ÿÿÿÿàÿþKm+mÿÒ~ÿÿ_ÿÿûüÐ_ÿÿøA?ÿþÿƒz*ÿ£?ÿý/ÿÿ÷þÿï·¥¨ïí ¿¿Ký/«ÿ»þ¿ÿ·Â_ÿª*ú_ÿwá¿ü>ÿAûiÿÿöÛ¿ûßKA6ìTþ¾ÿëïûûkÿõ¿ú]~·þ—¿ÿÛûÞö—ÞïëöÒÿÿÿïç?ÿÈOõ\ëôÿ·ê½õ®ßûwý}mêÙÕ>—úíÒMÿª÷þþÿ~î¿ëûk±Q_ÿÿÛ4M“«ÿÿoêï†ß¿ýÿíšzî“þ»kß·Õþ«×[­?ÿíß·{gOöÛÈ…Þ»·õÓÿÿ¿¶Â¶ 7÷Vcõaž¬Çu˜XVAýž®Ž=«[oì¶ÒÒî¬úÕm†oÞ¾û?ÚNgÚ]ö•¥Ý-ÿëvgþÙžÚ¶gé}™§ïn×oÕ½µßÿþÁÚjÅ1Lié1IÚlTU¥3Ãb´ºûVA9§#†›i'„˜ôíX¦4ÛI9)±ZL0JêDNEpô´“m%¿O‘\<ŽÛ¬¿{a&ÖÂWK¶°×I³ÞßÙépŽ>Ï«t³ïkþï´4 „ÈálS [ &˜a&5°LS½ÂØh'm:l+Pá'"Žƒ ì&›28¦ØI6M0ÔyÅXI¨.ÂZI†Ò ¦M4 Ø Ä&(&›Æ¦ÒA ÃáÓSaC¡Å0Ã"û„·Z².SU庤v´"(çb gcˆˆÊèÂ"Ìâš)IÊ£ŒE> )Y`’b�‚(0šDqÄ#T„Šâ¬÷•�ŽUå[ªa Ôga‚ špLTñG»É]‘t +´A6˜LT½'&©¦œDRqhDqË 37[v+�•!b\FUañX+Šn¤´¿â".""Gÿþ>’ÿKa*ÿ« :ªðÈ�Èh;±ƒša0œE7+œ¬ráa¿ÿ–âæhFO“eœï"¦fl®Ÿ¢‡`�l·R)  Â™FD ín„�' O+„Žë k£Ä#Ü‹Á ¦Œ•Èñ +[‡U¥­îKÃ}Òii_í/+» +´…!úh0ßÔqÝýHÚrP�­ù\)yØÚÉ„;{úM{UÉOt•fï½}uÛÿÊô÷;Í]-¶…úª®žßëþ¿ýdË#2+fq¨gBL�“ä3*§“#Eš�È‹Dle9ÆP)¡¨û$sÉ›´Éw ?_¯õ^d)@Â.Ö! Ÿä$  ø#aèxˆEfèF€Ñ 3Àe$2ŒÁ£Xa»hÖÑì3LÏF€÷Ö™Ÿ,<#[Âfg‰�Bq­”fO›"FͰB'L +Hdv@Ìþ]“æÈ�) LƒFÈñ"Ȋȧ! B�‚šŒèÈ1” �243è¡D¹sÈ+S¬¦¥Ñ0� §“L9/'é Ú¤Ú#‡&´›dâm CA6�a ˜i8I¡a&F)´›män“pË� úL0¡3’„ÂL‹²�¦‚ ��BM¨L"ì�Í�'“L&OhùØŽ=z<39��EF‘á„kdeƒ»r>ŸÂ5†fGÌ#@<ا !<vˆI†GÉÐLBt›Wt¶�ÂZ¥h&Ý'KhWD½¢qVKJëÝQ?tÖé6ïÒ‡ìºEhŒxPƒ8j–‰óI´4´çA7…3c8aYgN“rcKª :lÒ~ð“i:"»CA0ÚiRa¾‚|;I>“z64ݯµ¿é­nŸÿëÞétר¨û­zWôú^ßî— ®ž�÷JÑ(«¤êÒßÂi×QI¶«]t¤ë¯î�Â#VíI·u~š§e�l´&ÂO­Ònô?Ô^7ôºúéñVÒ;÷ÿÕ¿ïR8]¿õ\]§_õÜkvÒÕ}ß~÷ý.·µöôµí´ÒúZ¾øï¨ëéZ½ÿïÿK_ü|~Ú­{†û×õþÿïÿ‘¾ÿûÆÕmþïÚW¯K[O]u]ÓЩ+{Õý÷ß^½×aè´ÿùiþ¿ûûz.°l?ÿÕ¿ïQïýGþ´LrDãÿ¢Ü‘?×ðÿ­,][Qï·þµoït¯¯ÈáWÿðÿÿÿõ×õëaÃþÿÿ߯ÿ¯ÿþ‡_üÿa«zß_ÿû}!µøÃÇù*/ÿ†ÿÿÿÿþ»a‡ÿ_ÿÿ¿ÿþÚ_úûiÿ·ÿI*ÿÓÖÃÿzëöÚL?Òÿá¿ÿÿüÓ|é?ÿá°ßí®¿ÿÿÿÿõßáÿÿûú×ÿûUaÿëÿ°ÿaëëÿðÿÿÿú^‚ÿûÁ°ÿ¶‚ëÿÿÿïý´ºüý´¿ÿÁÿ[K*÷ÿ_*÷ ÿ·_øoº àŒ?ÿÿ‡ïÿÿð—„¿ú{pÿ± úÿï¯ÿýŠþøOìBÿÿ ÿÅR_þÆ–ÿ¯þu áÿÿoþûþõÿëmowý*“ký~¿ÿüÛUÿ„¿›GÿûõÕ(Kÿª oýÿ†þƒè/»ÿôsöÿÿ÷ëÒõÿlêœÇþ×ÿ]¿ÿoü%ÿëá/ÿ÷muÿûÕýúö+ÿ}†úþÿ÷_ÿÛÛþõ[×­ºoÿÿéëúþ¯ÿýnöõÿoÿóEõõ¯ïô¹Ï×n·KÏ'ò­>¾ß×ÛK«aŸ_m™­³ÿÛ}ýö¶é6ÙŸi_ë!‰�# 6•ö»fkKý¿í�M–ý³5ëò ìÍ/ÿÞÚõ×ýôúÿ[¿~«ÿÿ÷íSº´™@ÓUa…V$¶Èª²(áÈ–I[I†na‚WZ_m¦¨+I²;µI6[I†]]¦Ã7j»ÖÖì#öký¯eí'JÖ–×Û×þ­.ÿVÒon•«¯]³Mµ3Tí0ØA1M0“NÛšm28PM5¼0‚A¶�b˜«˜h ˜M6ô(6“¸h$Ø«I� „ؤ †Èñ¦¤âÓ¶)4ÓTÕˆPÒa ‚kIØa¦¬]ðÃÒÒM°•[²=v•ö•—äQÃl¼Ã 7h9‘B(Døbh…3ªŸ +²“‚: `�IÌ0�¡ !C +¥c B bƒ+¬dò=HüH „Ô)àBG¶)VJ¥ +|sD0‘ï=Ñ£†×¡µñ×ü^Þ‡ÿÝo»NíþÝ®¿N—„Âþ¶�ué×±z *~­ÿ¦õ_ýô[• påÕÿÿë†ïýòÜ‘ÿ,r->ˆyý[D9î>üÿ }ß÷ÿ÷¯õoA ÿë~º×Ž÷Òëþ¿ïÿø°Øÿÿ¯þÃÿßÇõåÕúå§ÿè½™Øÿÿ·¥¯ÿä¤åü\zÑFú!éÕ¿ÿÿÿû †¿þÿúávÿëÿÿÿþ¿ÿû þÿïÿÿÛßÿÿ¯-8?—Wÿÿÿÿøm¿ÿÿü‡á~ßÿÿÿÿÿø/ÿþßÿïûhãÿÿßß_õý¿ÿÿÿÿÿáÁÿÿÿð�x@¼ÿÿÿÿÿÿ÷ÿÿÃeDÿÿÿÓi÷ý¿ôÃÿÁaÿÿù@·ÿ_ÿ°ØoÿÿûÒô¼?ÿÿÿÿ÷þ—ýÿàéÿ_Úÿÿþþº„þïø?ÿÿûK·ÿÿwoÿ×÷××ßÿ÷ýÿ»ÿ¿_ÿÿm/ÿÿßm/þµ÷ÿAéwíÿÿøÿî¿ëmß¿þ¿õô¼âý.ÿ¿ÿúý/öÿ÷_ÿ×ø¨®ÿÿ­÷×ÿ_ì?ßÿöëm×ý|éÑ�m¿ýoÛÿ×_ÿöÿoöÛíµoõÒÿüç×ÿõû^ÿí×÷WKýéoïýýt¶î¾í-³?[I³ûýý_Úëß¶–¿ivgÿšÙžþôÙšôÖëlÑý*ÿúë{÷þëé:ºÿ·ë{gOößm¶’°ÍͤžºI°ÂWWV†5^ÒlŽí²û`²+‡"Ypû¤ý=-°’~à 'Ù}´¡ öÒµ×î–Ã_Ûî¯ÿô›½ëo¾í--ºnµ÷ïm[3M×Û{ÓkvÒA±A´•;´lSm Å ÃM4ì$Ä.)ŽÔ'NÒM4ÓÐ[i¦ÅZlSÅ29´ƒšlSÃKb½9;´˜l=4Ó[IŽDH�XÙ½'TéiH®iÃSäQÃoµÒöÏwÚ_Ññƒ1뢸ªhŽF¨&!2=B 0‘è{£C„G&¡40ÓL&šEcb§¼ðÑíϨ#`‚Ï [h0ƒ%aPb˜J�T¨‚ „0ƒ¶ c¦‚ 4ÓOAHâÂzM‘Å«L0Â&’L4ƒiBÓL1ð�Œ1W„ Šc ¤ÅÈ�Ì‹s�[+•E¹$WdÍ ¬Ê!0a0„DÂöå ˆF¨˜I¤˜„Å4Ô÷•v˜M4;°™{ ÉE´¤qa,ä2º\’iË1 BüPÂB?÷øŽÿª§Ðh0šyXåsF¶� ÿùª|•Ö™n!�Î&q�ñ�ÈìDW%Éx¥0�L•™ØP¦pRžP¥p4 +&U™©’·�q‘i¤vÿßïÓð�0)˜t{aT#Âïïïï×NºWè' vºz§÷u¤›}ZKŽi•Åü˜üqó!d9¢ôtços²²$ + ú®·þžžµIeuEá¸J¼È]êjÉ\uÈù+줵5~B‘_ÿÿÚþ½pF€df\Sc33ç¢ÏÉódC˜a& ÌÌâ}†@ódQžQ„B8ð¦y†ˆO“™!ˆPK£dŠ ŠsÙ-$TÏ™ RA*” è)@¦ çd¨Û +EQ +9“ªªäD‘ÙšOÿK¤çåTöý[PšA´ƒw &Ír„Õ9/A!Õ½Þ�0Ñ£?M0¡4k#¬ÐÔ&ºFGàƒ £ÃÖ}FÈFÀÂ5†�a„^B gÈùÈBÂ=„]ä&AЄNï³\Á”# +GD|—Ì36Gdù²!£ ÌBqI“£„ˆ‡##˜#ùÌâ/”äSµ¢\•H”J_I„ÏööYÖƒ<Òm&úº Î3†Ù`Ó¥²Î½ ÚM„œ*#¶“¤è3†–¨‹[a'I�&N“iH6‚з|2XJ‚zчi0ùrëI°š †Ô&Aµ …M>0��0š„lh݈lTa4 8EÖ! @‹³HÙ¼ÿÕëJÒ¿éiá7îºþúV–º �Z]'IÂP˜VºÒZZV–•¤è—7vXÄíKež!´›“5ÒÓ#š °†‚l ÎM¤é6ˆí²ÈL4ž_6šK‹ OWI‡jrIµ  ½»NÿõÓj»~¢û{ÿO^—íý;»uÖÖ»Õ=i:¦“®®­øh;û½jþé6Õß«¤ërP»¦Ñ(¥j)Z Ý-/mé'‚¥I¶XHA¥ Î^÷ÿúß�·kïõëë×­wk^·zÝ߯ã^4†µûþõzëu|�P'Öâ»BªmÅ{UkÕ?¦ý~Ò×ÛtŒÍ.�_ ÿÿôN¤ß°ïýcãõc×ÿ�ëõãú!ï臥[¯Þé×þ¯"D ýmGÇ»QÜ{èi{ÝBÚªKöý®»ÿÿú_ïÿý]__ÿûÿÿå˜\º×¯ß÷¯ÿ¯¶ñôLrEè·$�臣D:?,r,ÿn£úé*·î‚÷^Ãÿÿ_ÿØÿþºþ¿ût¿ÿëÖ¾¿çÿ½ýï»úô>;òÓƒ–3ø¯¿Kþ¿ý�ÿoÿü‡ÿþÿü‡àŒ?ðFÿêÇÿ÷à­¯ÿþe?ûT¿ÿ÷_ÿû×ÿö×úëÿëƒÿÿ„ÿø7ÿÿáè'ü _þÚAÿõèÏm/ÿþ¿÷”ÿûÿÿÁ¿þÿÿ_«¥[þ¿ðßÿúO÷þÿÿþ‚ô¿Òïý´_ÿú mÿãÿêÝw×ÿíè'ÿÿ¿ÿí© ÿê¿ùNÈïþÿÿé·^ÿëûzøKÛ¥ÿú—ÿþè ®ûÿÿöë_ÿÿü%ö¿ø7ÿÿøIþ¢¿þëÿûÿ_o_úÿ×õõ]ÿÒÿ¿ÿÒý¿¿KøØ¯ÿuêºK÷¾»{ÿÿ†‚ýk×ð—÷̆ÿÿýÛ¯9ÿëýÿ¯½}ÿªþÿúêÝíí¤ÿþ×ßýÿºë·úûÿÝþëÿUûz_¿ºUûÿ_mÖÿÿ«íµ××µÕµþu¯ßÿ­íöÛ÷õµ·ßºZI]/û}m�=¿÷ôµ_­[¯¥þýÕÞ­—¯l¿"¸iì3u¤Ùzí$Óôœ"‡y�»‘G ²ôˆ8{i`Œ8mݧ²S‡íÝÚ÷Ècƒ=¶ƒlþÙúÒní->½ïû«I'õÛ3JÙŸ®ÛtÙšûl�7Ý?úÖë¶¿ïÛ &© Ø…§ÂÓ ±A´¶éS ØI‘ÅŠc„ñ …¦AD'c i°ì:jƪšvm±ÆÅ1M¤Ç¤Å²)~œ0NDÊm¤µM¥"¸i°Âö•¤�žô­WÌ&JïJ¬"‡ý¥½kö¶!#®ÄDf\Œ„B Ï!Åb"2¡£c B5AˆM4�l¡Jþ¯•ÊŒêxŠ–R@ß_ñ‚ëéic¯mií[AzPƒ Bb®Áh×ȤÁ0�PE™®Ÿÿùhˆ®dµ’¬í/-ΦB‘], PS²X(Tˆìì9å]B/�ùÚäÂNLDL…2YANÖ㲯„wÒÂúP[I?ÿù^hè‹Ê ³ùÿ+•é~LcûŠ.Lâ´UÒþ²¢5›’h†7ªCÿâ¥OÝ„£ûy]oÃ$�&uÊçZúþ«ßã�ï v2 +Í� a”"�‘j#Ð�Îdˆ¤gˆ�ŽO‘ S1JtI�4 §FJG’ Öf¢Ê Ôy,Ju5ÊDv«õþ¾½üÈRP˜EÙÊ5†��„l¬83æi§„k ž ¦ ”I„k #]Ú5†�”l£ÀrÁdž�o†œ0�cÖd¥Fg‚ˆIš¢'L ‘) ¡ ÞT +ˆ@/›# ÊA”fÌèŽ242O*ãHÕ&t#©ú•y+DuÿTGm'e�a&Òm&Ýд’ ¢8"ÛTw $ÚN�tƒ ´oA6©?6“h'I´µL'¤Ýé¤-£Û +SÔ#`é„la„PA“ÅÈ#[>!Â3Ìðƒ EÚ!&\ºá Aб‚XTSº)óhŸ><æL +N)VF¼œª‚z…«jÚZOº$ëJÐM:ˆtN5{­%««®Ë? +¯„­'WI´°©ž6Zm–yóJèŽÚ¾“rb~Gm&NBÐÒ 0Ô ¨�Ú-ÚMè&ÒðE=+M4…ÿŒñ„hnÉù*(öÂ<3H Â5‡w×Òn�ZIߦ´›¦�ÛÝmGN´ºô½GÛôµÒú}+÷KIá7WI6ÿiip›’öˆÇ¥o P ô�–„ÚX"žºM„E¸AjÚ´ÒO¸t˜i 6†“~Ÿo]n…GÜwqC»�uÒÿým-.Ev¾ÿ·ïÚ^ë®ßû­ûAÚnšÛoý××K]%K„Þÿ½%ï¥kú$ô›»ÿÕÖµþ­¿íõvµ× Çx}=k¡Öÿ¯úm{zÿ×Wß´)m¤î×_½u^Ö—O^¿ÿŠZ´·ÿýÕ½ëÿù“‡.®¸ÿ°õÇùu~›þXä¶KúúÿõwwVÞ¿zÝkô´ºëjÝV¾‡u††?úZÿÿÿÿêÃaÿëü?uõÿõÿHWöé[ÿå•{ïöü~]]_Qþ¿õôA&î¿Û¯ýÿÿý†ßÿápßëÿÿÿÿë¯ÿúï¿¿þº_Z_ÿMÕ÷üºÃùmÌÿm/ÿÿoÿÿ †ÿóFGx#?oó6^ÿÿÿüÇþÿÿÿÿûÿ¯ÿ¥…õ×WIØÿb¿ÿÿ¿ÿì8?þ�zOƒ ¿ÿÿÿ°“ýZ_ÿäRÿïõ'dwß®´‡ÿíþ þ_ÿ n›§¿Ûÿÿ÷ÿ„½/ê—ÿÿÿú õŠÿÿKÿÿÿKÿñP�õ‹t¡†ÈFGü"Æúëîu]ûn÷}ÿ¤»þ—íßþÝ~ëþí×ÿi}ª;¿ôÿÔ=¿aê—þ@¿þ–ûÕ·ý«kþ—�|Æîûézÿ·Zßÿþ¿ÚKõëÿëë¥úWþ—·zú_¾¼R · þÎ.êÕÛµßzÿ­²uý]÷ëþs÷UÛÛoÿn¿×ýÞ¿öéöé&ÿu_úªKû÷ioýÿ¾¶È`1¶“ÓÏ«¼Îmm%ývÂWV­Ÿ›Ûïõúî­[ìÏoõ·_Û××µÿí}.·ZÿÛo]uÿ¯×½³ªuþM[Šm&L‚Ll¸a…m+Tí¬V•¤Å1±EpÙÈ®k¶”sl°JÁrõ¥eí6ÊEpwôÝy;ïlú¾êÒí%¿×[³=¿®ÿo]Óÿµ¯Ûݧl Ø"‡M‚(tA§Ðxbm �§—ÒA°˜¦ÂL&GGAtÂp› a´švExbdW„ÓAÄ Ú ˆZlBj‹¤Ó +í„‚ký±°ØzZI·Kk§r áåæÁ&õ®E=[]ªÁz·¶zmuVÏÑGtlˆ�êKD$¼Ù…Ék�G”Е3£¼˜ÿþºi„‹ß ˜a5‹ S^š65 …M>0��Ï™ñ£ã'“\&O&±²~Jf°ËøMÞ’5†Q*´G!6SÖ Ds׸arc6H‰4^„é�’âfȃ͑! dâäâ•q ÉUŒ)ÐdÀÔ†D¨ò‚;øPƒ8iœ'Ùu—ïy9“šÓ#œ¿t쳆pÒl&x�ÂA°“i6tœ$l™Èí¡i0ÝÒcÑ¡„~m ˜hZú<5ô›AIÐL4k” ÕoÓFæ±á2yBh×Ö3½ÙO¦°0�a˜ÏA„™­šEÈ#[�žh ‘— ���aŸ ældæGŠ%ódH§I÷ößi¤®Ÿmë§J÷D£ÚN•⢷' ¨-„“nëQ ÿH jÚ$è$¸¶—°JL5´�+I Î- ¶Z<Òm&äv¢8i:M¤øA6Òm&=^M0ÐÒ| ˜iéi7 +­4~£XhÐò}BaÈ­Ô�¬oßoÿ\w¿§UÛŠM«K÷MãííoôôÚ_™š]:TßéiiijéSoÛÕ®“Á:Pƒ{¤é?¶‰E+VZwKDcéÙtM„Èæ“¤Û'ðÐAœ5l ƒ Ÿ +ˆí¨{ï¿ûÿ¡µÛ×ñÓ´½ píwëq[õë¯ÛVÜB -ßö×_/­o¾“}>š×ôÚŠN—ªn×þ˜ëpšLi[„ÒZVïTý.¾¨'¨_ûÿÿä*;ëú!Æo¦ÕôwMÿõÿøþõè¸ußëÂëT5ݯ_ô:Ãïj?¡¸¡¥¿Æãõ¸¯·zµ¨Ó¯»Zÿ÷ÿ¿ôXÏ·_ËIùuƒ`×ÿÕ¿ÿþöø Ú[ÿM޾5ÿÓË‹Wÿ‡CòÇ"§RÿW‡«}k½ÿj0¿wßÿÿ¿ÿíëÿÿûwÿÿý×þæf¾.—þºúKÿÿê?ý°×èt]_aòÆXºôߥ¼:ÿÿÿõÿ÷_ÿÿ†Ãÿÿ÷__ºEÿþ¿ÿúÿ×þì=uöþðúÿ]¿ö¯þ¿ÿÿÿÿuÿÿü6ÿÿöÒó\ÿÿÚ ÿüŸÿÿÿÿÿ·„Pÿþ°Ãü7ÿÿÚ^Ãÿÿÿÿÿýýuýÿ†Ãÿÿ¶‚ôøþéÿè/ïÿÿûÿðÞ ?ûiaÿoÿý´Sÿ à¿í×þ¿ÒÿýXýv;uÿõô/ ½t—þÞ—ýÿíÿÿþ¥÷á´°ßàßÿí׃xG¿û¥ÿ_ÿý¿ÿý}/ß_ýµô‡ÿoµô¿þ—¿ÿ¯ßÿ§´¿îÞÿßµ×ÞÒÿÛ ë_«þþ¿Ûý½¶Î›—÷ÿþ¯__ëþŠ>¿Õ/Ûÿý»ÿWt½¿ÉïûýwÝ=1ûéê?í[ïKOÜÍzOûfkKt­³5¥¥iwûk­ÿí«ii/kûtªßwÿm×í·ÿGOµ_Û\âöò…î»úÃ…îëÿ ©éè+/Þ^´›¡é¦ÃTí*l½«am%n›>›[«¦ëÌ%÷Jù w×nžºCÒýÖööÛ[ýÖ×ïý}½vöï¿ûû®öéÿ9ö«þ´Ðié1[iAŽš ŠNÒx„š Š´6ÂA�Šm&Òl$›j›h&BÛµ†i¶‚m%ÖÒ¶EÙM´™pìlÜà ëæ6ÒÌ~Ã96zû´­&ì#ŽöÏ÷g¦Aÿ¥¶g¯VÚ«{¥OþÞ¿ðËÓ"„�™ãÕB•dµµ=¹âSÕb©­á…bƒ0˜¦(1I»MŠ`ªÂi» Û`ÒA¥Êv‚N“má‘])‘¦ƒ ±M ˜« +Å)4Ó´“!ðSjÅ&Å6·L‹Â®ÒW«lm^µ´˜g»î×dº ˆˆÌ¾‘›JÚpA‚;Ub2�4R– Ä Ä)A4"„ŠæHÐÚi¦4ÂE^xÊÆÂc„†A‚Ó☠§Pá°“ +¶ U0“°’ 0 6)´:i¶“ÅR¦š ‡üDDB¹‘L‘e›�ŸbQE"!ŒA„ (`©XÂ60ɧ„eaP\8 Â§†˜&¿¯x¬DÜB",§v©“Ÿ]v[/ןþ�ë¯Â] ¾ºØ[m-´º‚tb»JÒ¢¹´� ·a +lHÐR˜ð€ÁB7%fëcÿäØœTD¢+ë•LÈA�†rß3UHÈ((G„ʆM‹mBÿ]'GŠ©¥ü8uiZÖÿý +Cü®+ÿæDü‹¬’¥ÿ¯þºëþ2¸õþHÿ×]~d+› @Ɇc“ŠP�‘Ð9˜™²(8Ž"!"‚’:#†CPŒ98ÓÎÐj@ÌŒŽ†™ ‰QeYäƒ5³¡ +#²k ÓFÆ©þ� *hÙFÎF‡¹ž&¬ŒA¬5† �ŸÓF°z=´Bt&±¢ÌäøÐ Óa¢�lž.aÃD"p”"ð#@4h ‘—ØÎÖÅ!£lž'É‚$HÐ\¤"B"@h&,K¤è‹l �.æ“{*#¶“¤è ØDXrh‚oI¶LäpÒa²g“¢+´é0ÐÒo@´ ´›&ÐÓÜa6 “ú áF‡“æpL#Xf<«ÉÅý. +×Þµô �i'[„Û¢N•½]¨&Òé�JÑ?jìº+Dž“ –]:M„¤ÃDøæ•„)Ýa¤éixTGl$Å]´¯4½éÔiºô�ÛIÒt›§é¤ŸÇß·„×ï‹¥Ó¥é}®®µ¤Ú%Ð&÷IÒ}POP­>Û_ï¯^–×ê>׸­÷Ö‡¸ÖýêG Žßº­ [Nûn>¯»¶¯í–D®�¤ÿú·ÿ_¯�½þëéhj¶þ»û·j5î×ßÿÿØééWÿ·ÃþXþ£ÓË­oýï‡ÿÿÿúúì?X¿ú×ÿ_aÿúû­}}ký[ÿØkÿÿÿüý¿ÿmÿý‡ÿëì?ÿÿÿÎ ÿû_ý/ÿú*ÿàߣÆ[¿ÛKÿÿÃþÏöÿÿÿÿ_ÿÛÿöÿÿø_ü?¥÷û ¿ÿü?ÿ ¿ÿÿÿý¯ÿÃyú_ÿô¿½ü%íÿmÿíøoûô¿ ÷ßÿwþ?ÿ‡ÒðÚ ¤ÿú_¾þ¾ÿ£˜õÿ¥¿ÿ¯ïû×}ÿû×þÒÿâí/ý~óŸÿßé¶ëÿÿýú_û~»ûz_Úÿï¥ÿ£5:zÿ_ÛÿõÛÿnëýºÏuûú¯œÿÛûÛÛÿþý#žÞ¿ém+[³åö.¿[¯ý¿äcmo÷_ïÛ3ïµþ•³Eº[kfi·¯ÛKþ¾×ÿOiÒXîÖ‚í�JÖEpûM5a¶mºK².[K´²÷°ÂY{‘[«a„»­½µlú´—·®ýznÓïÙ™Úšá&Á8VÕÐm4L2+Ø«N êšv¦ 4éÚ Û¦!lTR „é§iؤÛ$ÆJÓVÒVBí+I³n ¹êš¶žˆæˆF¼FW4|d "¹ƒ ÐEs'Ú\U«f™G=!‚!´hm"º4쌞3Ãa0‘�Õ]†*ØI†5dq Âb‚zm¤ƒ`»A0Ò SN4Ó¿E¸^æJ�¼wV""!„kD BŸ!¨(Dr P0L&¥aì÷4å[ž�®®Y‚±ÚVã×ÂOô¾¿^½´»¨M�ì§iPa‚V‡2)Bƒ ¥±V1ÿòÜJ"‘ÚvvY�òª‚;°P™n­&v«ÇŽúúOårÖ2;R";È)�¸¦Â +K£±Xí^.ê/èÜûô?A…4aJ¬ì­•Àëûî�mëy¸¿»ï÷çcRü˜ÔìU{¥õ¿þôý¯ú_}ò'Ž—ø¸õ½?Ó×Õ}ó"]ó´µÌ…sdkfb ÌR@ÈaÉ0æ‚¢%Ô„äTäüš·œgQ�!å:ЈˆÒ:#™#£$3¡$Oþ¸ÿëéõ “É£c®hÖÂ6�”n£;PŒï=„EÛ(Ó ¢ ƒØÂ/!ØF°aÃ(‚5Dh<òá‚=†Ð "Ü2F\èôÁÚåÆˆMOdx{3™<œ_6gA•Í™PŽ2 d2!žLF·’׌E=ÿÂ"@hi6®‚t›A:XA;- äè4 ",4{l™èÐÒaÂÒm&Òa¢+°�l!hh&N‚tmSvê!“Ë"8¦(ö�È#cðƒ» áQ¦aØEÀ0F€òŒÎ@ÁÑ 0‚/òˆŽˆñ×'D0€ƒ("¦C) Rqå&8ÈfR�OÁ:%­]E+]/wIÚD¢“pL;¨„éa]&Òt›@˜§D½¢1éZººL0ˆÇ«Ú +_°¨§,¸ ÐaKI¾ÃA6A¹…Gv“ ›IõPšL�XA0ÂL�¡0Ù?'æÊ6��ÓFç5Â5°�Ø„EÛЄg‚5†ˆO.ÎsÁ3‘x—r‡50í¸ªØÚé:N—¯¸ÿ»Óku­¥¤Ûµ‡n¯Ž)tÒBÅm¤4ý*N·Ó¥ipND7ZN•áSê)Z�OÝ:Z^•„Iám&UÙ�­^ƒ«þÝô!èµÇÇúÿýk]mþ­êí~ÛÝ÷½êÐýÐè}éíE/vŸ}-]Õ¯µï¦Õ4Å'ÿݪ×ñûÝÒKûòӆ×_­Õ¿ÿ–7åÔ©ÿß—Xpé¾ÿúZò #–8%ÿ¸xþÿz·ïC÷ú¨×©- +‘Âí½ê\&7¥ÿûaëÿ¯ÿÿÿëÿúPØkì0�Á÷{wþ‹�¿Òýá¥ïÿÿëðÑnJ€ÿ–9·�ðOþ÷ÆÓÕü0ÛÿÁ~ ÿÿÿÿÿþaþÃPç…Þ²�~¿ÿþÿaëÿ×_ÿ°ñaÿ‹—¤:Cü‹Ôþ ÿáú*ÿÿÿÿÿÿì6ÿ ¤ßÿ¶Šzýëÿ†ÿýµý´¿Ø{íëÿ¥°ÿn—ÿ†ÃÝ÷¥á/ÿÿÿÿÿûü7ã÷µ«iÿÿøo"ëý×øoaÿ°ð_öý¿õ\ؾ»wÿÂ^—î—ÿÝý·ÿþ6Þáéú¬[ÿûþÿü7 ¿ðÚ ½†‚ÿƒÿƒxF�û¥ƒÝ3ÿ¯š“˜Nïß®¿ßÿÿߥÿîïÖÿ¯ôÇûÿ¿_‡´¿ù?°á¼7þÒûí´ýÔ ¼}m¯÷{ëê¿×ÿ¶þÛÿéw¾¹­?ÿÃ…ß·ÿ¥_èæ?:}ûÛÿ¾—ÿ ·ïé/Úí¶•í™¦Öýo_m¿»Ûnëþ¶Îžc¦ëû®®ßßÿÿôŽ©Û×ývè%¿žO¿öî—¾éÿ°×ý'g+«A6­ÛiØ@ó„aÃNÝ/ó¶{nÛ?[i/Úö}]Zº­Ó®—ïÝ·ûdé¿î½¾ÿÓõO½Wléÿ¶T}ÿ}„³Éöþ¿„aŠ´­&)�ŽG +)ˆZa6 0šqI«ÆÅCΕªzJÃ×I´®Ò´¥Ù}®Ø`› å}¶ 0ÏýúV“gë×öAë¶“ ó¶ÞÚM™¦Ò×Í?n×onõïõ_�Ådì É@M4Õ=ÛÞÒv Žaƒ ¶� �aŠa¤Ã¦ÐIÚA†•¤b¶‚²#¦!Ô&Å1I­ÚV“ »´Óaî“ 6·`Ž;é°½6^öJÒaž¤Qäu¶z¶ÏL†>Ú[fjÞïÍXE’³”B.e> b2zˆF¼ Ä"4h°„Q¡†¡ÃØA„©„ìŽLBaS„Âa4ì&h-0Å0|4˜¨iD$Ób¤Ä(Lh6!&Å6�Ó"ðÖ ÛøˆÑhS�A„FdQŠV4sÈÄ…=«†  ÂbƒÅ4Q„{a„Ä Âi¥i6›iB $ݧOù–N"“™" +Œ‡ÉÎVC&öÅ„2°¦ë¤êâ)9d€ßþ’Õÿéiinû[®¡;¶á6‚´¨ÐÁ;d9!l�¥,ÈA3/0`ƒ[!ÿ帬viéUNÊ �-"¯ú"hJÁ~¦¥j2Œ…Q’»ÿû­¦B5•Óå+Îó%ŸŽ;ÿõ]WòÐ4ŠàH�-ªÝëÿúªy‘ØVe¢d.!ôQ"$Ïd¦pd sD#¨Â!(ENBdÙ�KŒ�)8ò`ÈdI–r*ÑÉ4ýUxFÆÉù.jdüŸbódæW<#cðƒØGƬ4xynáÚW&„ +¨ÐÒm &"¼#Ý&"»y1ÖŒ;I†TJMÁêGÆQ&ƒÑ±šI¨L#[ÖÌôBP£šÃ$a»4�F¾›ý¦÷÷üëûj¿§ô½½¦÷ÛÚi&Õ7IÑô°�0Û XD¾Ì‘!´­Pg pû,™ØH6¡QîË@V†I†‚udÑI†š<4›T ëÿ¿ýýé7î¤p½ {¾–£[Óú¦£­íipš[këï÷KZxMûÂmmm¿m| ÚM«…h*M¦éh3†—¦ÿýþ¿üްÔßë÷¿C¾·ÝEÆ7wR8VŸ÷R8W¦ÝÿiºokÕ:�&ìVé´º}ÿÿ÷ì?¿Òÿëþÿ,r/‡«{ék×ïÿþÿî»ï¡¾ßï½oûZ]÷ÿ‡îÿ°ÕÛÿÿÔX¿ü´ÿHýEÿþ›ÿ–9ÿVá¾êߎî¿ÿÿÿÃÿ†ÿÿKÿþ˜ÿÿÿÿ×ÿ¿ßÿã÷[úÿÿÿÿÿø7úþÈ�ÿÛ¯ÿý¿ÿÿÿÿÿÿý×ÿIwøÿÿ]ÿÿÿí¿¯ì7¥ÿ¶—ÿþÿÿÿÿÿú§ÿÿÿÿÃÿ…ÿÝ×ýx_ðîÿð�_ÿöÿÿÿÿÿÿÿ÷ÿ†ÿÿïÿëþ¿ëþßÿÚÿè*ÿë÷ÿû{ÿÿÿû_úÿÿûÃßáýöêÿ­~¼Þÿ_¶Boÿú‹ëí¿ÿÿÿÿÿÿþ­ÿïõáÿÿKÿºÿ­þ¶º[kû}7¯ýßý~uý´¿ooöÿý¿ú×ý/ûõéÿë×ÿ¶“`ŠeûI°Š¶^´¯ºlÆé7özm&ÿÖC3ëûHÒm[ûzþü�~ßÝûëÿMÿÿÓjq¶¾¿ßm¶ÅZ ƒ!Z �ƒÛJ)´„Ãj¨l=4Ól1ÚޒݰÎIÖÚªÛgõa…ï³ëÿìÿ÷Ó}é:_íú½_ÞõÿíðÆã ¨„Õ5*Å0[ Šk¶ +!0«‡}¶Â´ÂØK`ö)´™Ú +íClBMScMd@d[¦Ã“Mt¬½v_´›¯VËÌ3—iZZWö¿ªî±·2Š�,VPˆ£žEÐ�/† Ц(&šl ƒ v˜a&› +i†)SNIˆ[Òl “M8¦) ƒiZK"óm· ‡ià ÄDRq¡aaDv.�œ!\U "=Ã�eS+„­BjB§;ûaȃ¦Á:`ÐI°“ ¥kº¦3_-1V"2åYwì æ´I Ä!EžÊ<4=òË oéÕ´þí%þ Rù\N&ÃRk|³“H0˜AÊhÕJæ‹·þWÎÍy\ùÓ/‚„D^¢Bæß¸Ã¶Åb<#ä#Ä(P´^î­%ú‘ ²–"¨ÎÁ²dÉ$W°«t…EÝðš•�T)¥¿þþ÷»ÞBŸßÉ&A5#ãû¿¿u[¥ü›*gf2—޹^Öÿ7ç’†™juÊtGDº×õUï¿23ñø@ÁÚ ½øö!¢$Â.ÁÙ ¡“G‘ „ɲ!Œ�‚ +C R6Gˆ�ŽO �3AJTË8ÊŒÜELèDvff¢"ú•D¿ëëýÚL=5Iôé8HYšÃü&¸é Ð�Œ#cF°ÓM0˜L¢MÃÖÑ¡£XerÐF¡\G°É@Â3†pÉóddtHF ô]¢„Ç2‚$ÍBèBy •sœ„{$0¼*ÊræE¤œk“�SQg#QK&‹ý†Ð[/êêì²w–…jÒM¤Ü˜3†pÒ†“¤ÚV‚ ¢8"Û‘ÀhXA6“ ƒ¤ÃCH7£CTFîa&a4ƒ%á6¡4l !¤Þ�Í`êr^Oª(™#cÂ5´wxF€ä% ð�„]�É�3c:lºeùc”9ŽTñ"‡+ Є(нktêø¾.–•.“m<']-,$ëh&Á6‰Âïu¤›Džx„áaIÒmOšN”4æ“h�ô¶Zi6îË@fÈ;²Á‘!¨vL=ÿ¤òcÒ Èá ­-4Ó 6ƒM-„Óѱ¦xFèF¶¬Ÿ÷C÷¾½í5o÷ÿTéÒm§}ö–ÔqIºjºo§WV÷ZK«JéÕÝt›„÷‚m^’ýêô­Å'‚t›I¦xÒpºM©áœa&Â"Ý–¡8I†“aËíCïKí»ý - Eé·;µÜTk}ºßõ#…ÝHáq¯Ó_ýÿ 7¶’§¦*ÿé{}¥é:OA¥ö›«„Þ—Nuþ�ÿ‡�òÄÿü…IåŽGEMÿ¿,r/‡›Ò÷ÝU½ÿÚãj½›ÿ¿÷wJ>êô½GÐÕðúBãfzÕZõÕ:ÿûa뤪ßú,Oâ¿ÿé ÿÿUÿ¨ú&ž?-Ê'ÿßþö)9ö¾?U­oºè{è{õ¡¨¿ÿö°ý¿ÿÿýÿØl5ÿýµÿúú×Çÿÿ÷ëƒÿ×åÕÿùiÿ-ÉëËŽiÿÿ†ðÞtdw¥ÿÿÿÿÿ†ÃÿÿÿÏ ×þºïÿÿûûqzÿÿú_þ?þ?ÿü>@¶ÒÿþÿÿÿðØ?ÿÿÿÓkÿ‚0ÿÿÿÿÛö0å�ÿÿÿÿÿÿ_8?÷øo élA}ÿíÿÿaÛ÷ÿë¿Å´ÿ„ÿÿÿÿø7BÞi?ÿÿÿÿÿþ¿ÿÝß]VÚÿ½÷}þîßßúßû¿½/õÿÿýïÞ½/ÿÿïÿÿÿÿíþH^I§ÒÒÿþßß_úÛwÒÿýúô}é{ÿõÿÖ·xu}/¿»ÿÿÿÿü·úÖµz¦Û¥ÿw·mÿëç_1»~ßý[ká[öý{n¿ëýt›÷ïKÿÿ÷ïûþ÷¿ýž¯»«µïd™ùºÿlüÞÙžÛ¥ýÖßét·þ­½ëíºßëÿZNÞyi?®ß¶ßýÿÿïßÓTØ¥Mt¤Q¤K"¸m°ÂV’È™M°“`Ž;°“ äÝzél3•¥tÚ[g¥×I³õ®¬ƒó>½†}]§vº×º¾õöï¿¿ûý×ööÿoûÛo í0ÁÓA°Õ„ÚL(]†!ÒA´šlBb0Å1M„i ì$›­&Ò ¤ƒ Uªv‚b›InØ`©í…Yw—˜a'I°M²ö“eÕæ;K [g¾Ò8×ì#�Û>½†»ý½³ÿí™ÿ·æ›~W1•pe +9îO14 ˜i„Hça‚ BF¶ÂÐÉða2V ‚ ƾ “ &!E6¡Õ°‚i§`�aÁ8I¦Øb“MŠA°NÄ ÅLŽ1 +ÂLvÅZ SMŠ[KM5†Û"øÓV)�Óa›» *{ %¦Ùy»a„›=,›•n[šâ3%}’a „1ˆŽv Ó(Á‚GÍ0š Ä&¡5DqµaB�„ °Â†Ä-;N¸A¤ì0ƒ%h&šlR 1I¦›“N!1±LRp®8ˆâ"®WˆŒÛVÈèâe DI"¸¬=`ލGNU¹Và Ü÷i’°ƒIé/KòÒY úþ¿ký}´Ú_d+r×ÚWÁ„a0Åwž˜`‚ 'EuÎ�ˆÇÿ–…h‘Ë&Œ’EZ: ˆü’xìV*¹Ù™ü§ø�!*¤F +¡Ê“yÇgÊã9oZ;5DºøL%i/¨}¹Ù#2*‚…2&Â��EU�«¥¹ÉO‘€Ð\4xpø¨¿‡Vµ}}BÊàh#N~áKÈ.<‰ïú_Ö�ï»ûõI ø@Ëâ\_ý/÷za&ÒoKkuÿþü¯øäÇ¿üÈ·0ŒÅ5êC$…!ý¯)Í3£"3Y)DF�õ²�¡uªëÿó!±±„]³H&ˆO=‡øãŠ=›O3ƒ4²vO˜0�~pŒÚ!,„ùÈÈP�‘&!@‡@åH¨Ïèâ1ç ¤lŠ‚#9e�…2Lˆ=MFvad�ÿûMBmU“:t’ý'““¦IÒmUønýU4ha4E󯄼°Ó>XŠŠÂ žÖ˜F€Í A„l83Xh„ÙH# Ïx‘‚ˆIšÃ'Ë™üÀÍŠE&]fAÈ=’Иð@Â!(DD«��"ññšãy¼â1�ƒÉ5�(D™‘CÈg’Ü×�"Ÿz j¥kÿWqIÔûKK29¥û».„ýž#Í'Aœh&Ò „“jì—ÔŽê“r;i6†•¤Ã¤ªÃBôjš™ $á“ði„Ð áÞº�”lg°3I8¨ �aáØF°óÄÖ À§Œpk.)Faš68@B2¬R6?×µâ’ÿ޾ÚN—M/®î×Z\&Òt¯t­!w¨&Ô$ðV–‰:I´›eì²áRmë- —4Oƒ<Õ'w +x’t¶Z4�ÛM$ØCi¤›Ò 4›é&ÃU ½&ùÇ [A:74n„li§oR8Wúý>·×ö†¸ÿÚw]õkm-{{¯é÷úim&üun›Òé­Û\wpêêúN“­½%rqz >•¤ü$Ÿh$úMâ ¤é6“i:L0ˆ·ér3®ÿxÿXúòÇ"ÿ…ý +ëäp·ºîê?[Œköõ¿¡¸µ[ßÕ×_¦–«ÿ�׫i>‚IßW×Ý}×KI¸&íéÃÿØoÿïø¿ÿãîµ~²T ¿úªÇÑo½[¯ý÷¿vׯCøÛ¥#…véG­G¥ªºìt×]ÿ_°ÿóªaëëýÿú«×BÃî¿_ùfÁõÿ-?þýcò ý9+!ÏÖµoÂ[ªþõÚtÞý{ÛÿÍa¯þ¿ÿÿëÿ¯°íWÿ×רþ—þÃý×]_ÆôXÍÒþ—Iu\²Í�Xä©×ûi~»ÿ ä;ÿ4ŸÿÿücÿÿÛtwu÷ø"‡ÿíÿÿÿ°ÿý÷KÝ~¾=µ]-Ö?ÿûðwÿ}'ÿA}ÿÿø@¿ÿðnýý2ïÿ ÿÿÿ·ÿàŒ?ÿÿëÿ¿¯ýCïö+ö÷ýô¿½/ÿÿþ¿þûé?ÿáÿàÿÿø?ÿ ¾ÿm/mûõÿÁ{ÿý7îÛ¾—ï¯ÿÿþþÛIýþûô¿oÛïÿÿÃ÷„Ÿÿûÿïå¿o¾ü œÿÿù§ä?!ÿ�ë÷¯ßÿÿÿÿ{gTìWÿé}éoõûÿïÿé{ý±_ÿ½»±ÿÒÃë÷lÓï¦Õ¿ÿ×÷ÿoýõ_méÿéÿoõ÷ó²½÷_ïÿÒ}W»úoéööß~’Þïÿ턼ºn›Kû¦îþ×]¿Ûû_¿VíolÍ^nöþý»¯®ëöÿóŸ¯ßý¾ßûjÚßm÷ÞºûíÿiŠN;H0†[UÒ‘p6Û EpÓ°AëeëM}9pý³Ói6†Ò½­vÏÿ„qû öÚ]®Úßvÿô›í&×]ïlÏv÷ozom½½¾—9Ówé~˜I°› +0“dqé¦Å5MZ†G †4°ši¦›á4A2#Ø­.½4Ø«N 6)´“´­´Û"c i®�Õ—¦ø†Ùy†rlv•6zêÏý«gí»?4ßgóÖºý™íí×Ë}!p²†�0ˆÞŠâŽ„F|a¡Gæ��¡EsF†O£ÛEe¦¦w;Á‚ �k &)Úh ï ŸUl à &Ø#�†ÒMXAŠ4ÓM6LŽ8A2 ù,Ä&!2# ÅlRxb”6‚b¼0`–Á—{ª +DtØ$Þék,¥h·|®\ijª B•ŒC#RžóÙVV2£di,Ž0© Â Ba`“h0¡¶  Ãb1A.y& ¨i!0xa¤šqËAx®¯ PˆŽDB ' Ä&šdz„„„�nxÇrÈ(¥ÕU¨ý/•*j +” êª[s«ˆÿù]b%Ñ‘¬v·�ÐårpP™aNÕŒ(A�š²2;ÎËŹe½WF°yÑò¡UI–w¬IŒ)7œJnîîA¿Ißõn³"P§jfW µÿ¶úŽï„ �¢La´VÌÿçe ,;¢ÉZJñK­Ò>‘§.Á°÷Ýßÿ®»äOü'ö�A¶Ó;S[_ïýu__×Òwh �¹ÁW+ò‘y–*™ ¢ŒÆxS«#ÌN.N)­� <ãLèZæåRf«²B%zú[êí°ýuõò>ŒìÎLô�!èØôlf˜A„k ƈL‚ “5‡u„DAS!c¼KÍa‚´2>O› @Ñ “!'ê dâxéc² …ͳQh‰ +".Ôì­iúöšIÐÔ ¹”0ˆ¶Òi–pÎAi6N“i:þ¡íäÇÈíÂaªiªM£òM¾‚}ša4Ó £[TѺ¸A„l #ãÖG°ð�a“sÖF†CÂ5†ˆI—“åÌ—±‚”èÔ! Ÿ]ÃN—·ªz§½?^“lU7þôº^— ëá:ºM®•«þ’NûŒao>a]+ +“ õvZa 3ƒ8ÒÑ´´S–r;i6“¤ÚúA´-&ÂL—éôj�F·Ÿ6N†ê5íÕm ×ü|o¯ïûîÿ¶¹‰4»UvÕÿ§Û§^Ƴßã}}{{¥zZ¾øëÉÚ¦›]é8ðN•«¤é>•¢N’n¨*»- °ˆÇ» /wJA¾£øûè‡/D=ÿÿ×¾ÿÛIÿÈáZÿÝEuã×]oýÔ¸Jw.½êþý7ºÚׯüR×ÖéÖÕü]zk×÷WêÞ¾½òÀ²Óÿÿ¦Ñ =ÿØ©u~B£ÿéWZ “�áé¯mkÖ¯÷¡[¿[½~êG j5ñ¸Æ–ëÙm Õé¨ô—ýüê/ûúéÿý¥ý3ÿú¶¼ºÃÿ†é_¨ï¤:¿–9$×þC¤ !õ×øz^µþ‡Eð¿ÿþ—ÿ¤ð¿ÿþ`Zý´¿ÿö/¾ÃÒþ¿Û®¿aéÿÿú,T?å‹eÕö,e¼åŽE˜vðIüãÿ_í×ÿ«ÿ·ÿÿ×ÿþ÷öðAÿëÿ°ÿýïö¿íü=/Ký!‡ÒA~“ÿ�ûaÿôãÿéþïÛKÿÿ øîÇÿý¿÷Ãþïÿÿ ÿÿXoöÿý‡b—ð—×}ýûzÿÿ)ÿ�þÄ/ÿ¿ ÿ`ßýÿéwø7ßú_ÿøo"/ý´°ßúD;ÿ é/õ×ÿÒÿëÿý&Þúþg ûn¾Ãþî¿ÿßÿïÿá/ÿü7¤ÿî–ïð‚÷ì7Õ{_ûÛõÿuzÒÿ[¿Ûð�ÿêÿ¿ïÿõìWþûÿ¥ÿÿoiñ êÝ ¿ð÷ÿý-ÿïûºµÿô›m¿ý/Û~öΛ߶CF7ÿo]ºÝ/<Ÿ¿õþÿÝô¾û�=÷á¯û¾¬;ì'u¶~Û?ü†=ù÷¶¯V—f—¤ÝŸÛí³?ÙŸÛ´›VÌÖ—æ›kÒ_·×¿¯ßÿûÿÙݽÂÿ{¯¯ovJiÃ0vI± +Ø¥M¹|‹ôi* +Ù÷¦­„¬Øa%áÙ{Ví´›»[§í[[\óþÏö»f~­¥i·VÙŸÿ¯ßûfŸZû{~söÿÿοª}ZyPÂVA0ÂO¶‚¦íL0E ‹É'M„Ó† È®‚lR &Û“A±M ˜ÃÚ¶˜L(m[J¶Eºl0KA&ëz²=é9y°K×°Ž85¶ï1ûa&Õ†}XEöÏÛgù îÏÝkm«+™å:%He()AÁ„„ X†!~a„ò±¢¸• +æA¦-Øa#FV9æÚÑžA�‘ÀL(­8¦ ¡„O +Ó U„“b�Ã&+†“Ä$i§Òa6)ŠP›i;Û¶)66îÒ‘1„­äAÃîØg+£Ž""űsµ$#DRd‰±!$ Â$ð`¨ŽSÛg¶„a1P�„��ŒÓG¶Âi; •¦¡Ûšqp¡…l&°ÂL Ä$ê MƒØ« ¡ÄUű¡¢nªÎÒ¤zD10ƒ#óšEXm4 Ä&«ªIm¥ˆ¤DhDDDDzIV“a-qh$•:  µö�¤I†—Ô1BÈvC ´¤ÙJ Ú +" †B²ê Ëe?þM–s°¢“eU*Ù£&±’ˆÉ?2+“Â4|Ë#¼ˆ´EåS²ˆÚ7›Ï£1 �c± ì¥híYwÒkõ[Õ�ŠÍ ðÎÖ²¨ÿãþþí<)»úZ´ŸLÈ B/Új«ßëݠ讫årxŽvX»t¿'WöžŸë§½õú^?&( CÞR ��’!i@ÎŒÌRÔ�ÉR#ˆè2 +ÉkL‹úöé/é~e¦R¸tlhø6 “òt6&§ôxzgäѱ„l,#X~¬3á�’âí“æ —�ƒ4Dùƒ? áž$B HñÌ àÊ3eš'FÈñÆQ›$D9‹ÇæÈè3\B èd; Y¨ÊCÈoÊDºó"ŽÒp“ 'wI´Gm93ÂO²Ð4˜i7&tô ’ÄA0ÐÒl*ªA¼9¥‘?H94ÂjÑxÓ „Â6¡5ØÑ³l$´Â63L aØ#X0@‹¼£3�Ð#XÁž s04ŒÃ#cÍ‘ R„m™�œDA‡ò&¥ê{&\ªŠ9$ã#JŸ|WI­Ò¸N-.û¢OKJÝ+õm§¤´Ié:„Òw²ÂU°ªxgD[zM„Gd[i6ˆí²hM„¿Èí¤Ã‹ 'I´›ÕS 2=Bt›dvƒ Pjȶ)ð˜Fæš„lFÆlR8@Tlfrje‹���öÁÁšf #[G°Í ù¢Ïd¨OÉùÜ-+¾×ÿÛÝ/Ò %¿Õ¿I÷®é×Zt½÷÷ö›„ß]0�+„í%kÛ¥ipMÖ“¥áSûã½m7ªmzõêµ÷î·ºŠZOû­n•ïÕ«½v•Ó¥zïéh“á½%êé8Dž“i6û.„|Ü<¶äµpåŽEÿñû�îˆ$yŠÿ_ÿ»ÿü7ßwÐöž=ø×mÿ�ûQ¯v¿KVÝ¿~õßñ_Tíõ¶ƒ §ÛIoÅwim[ßi¿~\Hiú,f½—Rÿm½$XÊ^—¾ðÿûåŽF¢D=úU¢ÿ‡ýýzïI®žÿR8W�CvÒ�ݾ>롎¿÷þ†ß_ÿëÿÿë÷ÿÿþÃÿßÇùc?.®Ýÿ-?aªïÿë½ÿÞ—óŽd$[’–äŽý9;»¤ˆ$xcº«µçöÿß„qþ¿ÿûhãÒÿÿý‡ÿÿÿÿú¥ÿÃÿÿ¯nô¿{ý!M,~ö*Z|?–¯ÿ¿ôœïÿü ¿ÿÿý&ÿÿÿÛÿÿÿÿ÷Gÿøaëÿ×ûßÿÿÿÿûõì5úÿÿý†ÿûÿIÿî¿þÿÿÿüÿÿÿÿí'Kÿ‘ÿ¶¿øG}~Ú)é¶Ž=/ý¿ …ÿÿÿ¥»ÿÿá/ûÿöéöÒ¾þÿðßÿÿ÷ÿïÇÿ†ôŸý´þÝkþ­×ÿúMÿýøl£ÿÿÿß»ý¿ýûÿÖ*+ÿÿ÷ÿë¿ÿîø¦¾ü>‚ÿØ…ýjßû~¿}û_úøm/ÿÿÿÙí¿¯÷¯ûmí¥ïµ··íÿïÿ¯ÿÿ¿ÿûÚ¯ú:¾Ú±Q_qLWÿßM­ýr¡Þéÿý/«3ïolÑëßmš-ëí-ý¿õüç_ýmþßíÞÕ{~t[kÿ…¿ªkö¿ocŠýu¿t¾ÿÿþ�Ý6a÷l0UóÅù…mžÛKm}ºzaŸ]Ÿ^Ã>›¾ýõìÍz¶f¾Û3Û]ÿûïÿí½Õÿ}ÿïn�¿­&ÛÏ'×vÒÿKúi¶“˜Ø=ˆH4ؤäpö4ئBˆm ¯m*v5 0©¦Ø[."y�;¯O´¶Â÷°Õo°­í~Ã=þ“gÖ_d§·[_o^ÙšÛ3ûzlÍzé7zÒý½kõ}Ñí�&G A“»TS¾Ú¶ð°ÂjÛ‚… 0“TH6)4ÃÈâ›› C ˜M4‚ØMÅ&ds™~զƷi1È®v›l„6Òô÷§]†Xa-³•v«ik¶{í+öÏÖ­÷k§Êéq]a0„CŽÅ£®Šæ ÐÏm„­±høç¶g#F!>€‚>9ãl�\ÐÙµ!2`d¹‘â Bq �žŒG Rtm™ŠKŠtFÏ:d„P)F¦™«'ÍlˆE!�Œy ×Nú§¯I¼&“jKÐ&ü&i N±„lj›'ÆÆšaçäk (Aì�‰ñ±šEÃùó>r%�–x#8f�@Â40F¸@‹Ä».Í":#²F\Ñ “dH¬È�Íq˜¥I�óf®¹ÈÔY Šx‰i®�–„³í'Ažaé[,óæ©6“¤DvÚi& ÕDvóûM$ÃD<&¿~Lt…£;I¼&“hÜ ÐM ›H[Tü&¡ša0� Ò £c yœ5 ™‘óD!Ú!:0�aèÐ Eâ$L)Í‘ÐCDm™ˆN�‘Á�Å'G (FL„ɳ: ©GTrúWÿ^úþëºZÚ úK’zê¶‚é-�z÷ygB‰pm¥„Ã'I†–“i:A°™s“8g '‹m&ÐÒaª"ÃB»'§ÑVÒoI†d~Òl¤”&±¦š64ÓL#cL&¡„Â6@ó< aAhgÍ©jÝ:^Ú_wûؤôÛ[ê›Cc¤ÛÜo­ šû#ƒ¾ýn½:ºººVÖé§„ép­-�K äù»µl´1t›Â ºh(A8Pƒ8i6 °ƒ63�&ѶLéäÎÆ“aQ4!ÿëúÚ×Ю·µݽ$>ÝvŸºŒ8·Qÿ»]m= ]j´›Çõéþa*oWAÿmoÛW×éÒy(_ ¦Ò´´®Ô&Òµ@›“æáÙ›’ëøÿü²}ø}7íòÇ#>Þ›ù}uD/¬š?þ㾫¯‘¨®þõ¿[Œ{Oß÷×®—лZÕ +¦íkµøÿþôÿýý~½/øi/Ö–;ÿïòÆo¯ÿÿúnµ¦ÿÇñôC�ÿ׫÷_zC÷�~ýÔŽmÿÿÿÿþÿÛý½öÒ÷Kÿÿý/úUÿ×þYGûÿþYEë}^[’?Ñ�ÃþC�ÿÿù?ÿÿûÿëØþ=ÿÿëúëÿæbÿúÿûÿÿûþ¿þ?Ëø¢Ê?ßÿü+ýýÿƒÿúø7ÿúêÝÿäìŽÿÿÿÿÁ|ÿÿÿÿÛKõõÿÿaÿÿºÿ×Ð_ÿÿ†íÿm/ÿíÿ¥ÿÿ ¿þÿþ¿÷ð�ÿÿÿÿzÿÿÿü7ÿÿ¿öÿKÿÛíwî¾;ßoþ*øÿú ûo~íüKô¿ÿÿÿÿa¥ÿÿÿøoÿÿÿôþ¿ÿíëí{ú_µïÿÿ¯ï×ý×úWé}ÿ×ÿÿ¬Bïÿÿ¿Ãÿÿý××÷öÿÎu·_·”/oüŸÛÿÿý·[Ûo_õýÿ_ÿï~PÏý÷ÿøïþ¿Ût½ß¶Ÿgïÿm׺lÑv’º_ÿ¿ÚÿÿíÝ?Ûuþ«ÿ·ÿ_×ÿtÛÿÿßÿÿý²/4­8m¦°Â{a&EÎ�Ó äÚI«Ø%õÝ.~P­0Ï}wß~º­Ûki¶g¶ëÿkú÷þ®¶¿·ºÿû{ßæ›ß·ÿÿaÂJ›ºi†Et˜b&šl0�b›A'tŠᤘl$šèVÅ'¦¬iª§r+‡jfçI†a‚Mœ›K²ö¸Fá¶{þÒ»èý~Ùûº�ÇØ·ÙŸûfkï¯ÛÿJÖí ‘Xåe…R¯+a0‘XØL$V3JUØ„AŽw£ßý?_¯6–ðŸ„è”Rmô¡Sð�&ôIÒM¥îÖ.&íÂg$ÃPˆ¶ÙdÚDHi0ÒudÑIµG¶M°šI´,0© Þ�m Ãè ƒoH&ô…¸¸6O˜FÆ¡œF°ÌÎOˆFën({¶­Ó×zZ_µë¿¦î¿ýnÖÿõõ¯Ó­öïíé5ôû¬'uÑ(Á6“îÂI6›Õ»I6ˆÇ»¥zM¥ð’všIô®_îÉ“L4Go„ÂH6îÉ·3®õ¾½ûuþï_¡÷_¿»Šß¸Æ¤p·¥î£M´ÚWµê›´í­¨µ¿o¯zÜ&´’kJÒ}»ézWO»Ó Ÿ}+Ý®‹¬?ßþ¸ÿúÿ,r1ÿê¿ïÿ¯J7¿Ý/w]÷ãhZznßt›§LŽÒ�Ž!öÕ­*k¤Ÿý¿¥ºöëoÿ°ýoëaþ¿ÿþ?ÿþ­××ÿ-'—Qe/KÿûÛѵïÿ~?_¥×¡ÒQµQÔŽÕ·T¿þÞÿþßëÿÿ¯¯ÿÿúÿézïÿï_ü±�ý‡úÿ,c©iö¿M®•?òWÖÿz·ÿÁ¿õý‡ø#?ÿÿ÷ ÿÿÿ_ÿÿ­~½ÿÿü;ýý-}ú×ô—J´X%ÿ[ýÒÿþÿûÁÿAÿÿà�ÿÿÛ_þÿÛ”õÿÿÿÿÿ ?ÿû¥ô—þ/o_ÿ÷ÿÿÿo¯_á¿ÒÿÿÿÒÿÿÿmÿÿú¶—ÿÿÿþ¯ÿÝ}ºÿïëÿÿí/üø¿mßô¿ÿýõ_ÿþ¾!ÿößÿÿ÷ÿÿøÿïÿ[ÿ™ß¥ÿÿÿ¿ÿý³ª~ºûýºUÿïûô¿ÿÛ_FOÿoÛúcýúëÿÿü?úþÚ ÿÿßo¾ÿÿÿKÿkëêëïœêõ^ÿß÷Ò×ÿþ¯_ÿÿ‡ ûýzÿ¿Kßÿ÷�öí×·pÿÿúý±ÿǶf›KJëín´õý¾ÖÍWÿþÚýÿíûm»þßûkþßí¤q·_u~·ÞíïÒûkýÿôØ`·V“ii°ÂÚR'R‘\6ï^ûS¶],yµ÷öôÞÈ?ÿìÿ}ŸÛ3GÿþÿIëûþŸ¿÷_·ov÷¦öÛþõÿÿvëúlBº´m$Ó Šöé ÃI§‘bši±±iI]‘óM‘r𶔄·i².Sl$åý°“ *m~­ž»ºµ_Ì&Ïý¥iut»gîÏÿ}­îÝ7¶N®›[t¿õ×£ã2gŽaˆHöÉöLŒ¸AŠ„ÓP§‡v(²W (ªª +› +ÓA¶G& ½8V˜b˜¤b˜¯h Âi†*Âá Ú +ÓN6)=&Ò´–DÆÚZm„¶é³ÖÚMž»lþì3ÖØHã×½º_Û¦ûˆˆå½±—a¥ Ä0…ì"¸¤CAÅ0Á4�p lFxÏnÃpph&('i´AØH6‚a¤›I†ÂH4ÃAˆI¸b‚†ÐAŠ Ãb©ŠØ®ÐLr 6•§»¥a;ÌÄDUÎù–eqX¿0ˆPÍÌ11R±†¬aˆ$V4|††>: (lPam†°Â6r�‚(tÉ]„ÚJŸA†`Çb¿¥�fUÅuTdQˆˆq D Âa!|r®XsÚi…ÿ¥õñDGúÕ}U m$½UVª¶—úT•ƒ°Å +jÒò›é † ; + ,DD&uÔQK’*â"?þW&ÎÖ"¨Gf±�dUÕBVÿ¥çcÆ|Ûò Ùrp ÷ß}Sþ¾¸f�„O[zO‘=“ûHqkwÿæEJdè�¦@¿Õ}½'Õö‚ Êù��ê±}ú42|ÙB� ¶*"“Œ�*!‰ë!'R�<ã5žúO÷þúºúåq¿2Œ ›PšZ‹£CÂ5½ 3CÈŒÎA„^Là‹†�By¦x 3!r`�o!óc$ ù�„BŽ‘ ÚªS£$ó³ ×]iCAœ4´›Iå¨^“i<˜JlÐN¨ ØI¹4QØI�«Fv“ÿ £c´¢ÉïÒ"ØF†vWfGÍœhˆ ðF Á—2$æ¸ØÎfâþpÈb£†ˆ�6GB%‘¬ˆ,ÖJ¤;¥Ó¤Þ)n¯¥in°�-R¿u@›¦2i~—gÚM¶”ž5“WõAB§žÚi”R/$l{LxMa5ÂaÃ!3L aÌó­“åÅF°Í3cD!r1à��Å%ÆAˆCG (F&\ÌP[rE#…§^Òúõ×ßoõi/é×éÒ¼úÿm+‡P›Wõ +º%ÏË=ÂNñ… ÞÉú (3�&Â"Ûe¢� Ú fÍÚj“ A¤Úa:Fê60�aŸÂ>3ò5µ ¨EØf‘s?„@ÊŒ#Ù›©ûõÝ}|p¿k]èkÝýÿR8[]U Vßç¾¼wHoz_…ip›íÒ°¡é:ºV. óI´Ï6Z„è&Ò'Tƒaa²ÐhXDWhðÕ'ãëÃÑŸ¿¥ê?ïý¿º^ºMülWÿýÿÿïý÷{ÿÿÿ‡°Â§l0ŠÝXFæAíŸVÿoÛ×õ�À7{~­ÿäéë¯óM×_¯Í=WýÛÚý¿ÿýöÿ¿ßßÿýìRa6DtÚLBmŽG&È| Áªi«l3EpÙ½·˜ÕXfëµmN5öJÒ´¿´›ûK[OÿÒÒ¿Úÿÿoûÿÿïnó›í¥ýÿï $hÌì5LUp˜Oa¦�ši²+¥b¡t ¦Ûš Š  ÁCivšlSi&’lŠ2ªÃ +�Õ¥}—­+ÈýÖ­°Ï­¯Û?}ûfíí™ÿ¶iþë·õÿÿþsäÞÑäE¹U•©\QƒBR±ÊÆ�z6«sÄ0¡Æ§ §a Á‚S» 'I¡¶’m„­ÈAìB´™(a$¦È~îžÃ iåäû0i§°ÎI¶’öÃKîí³ûgÖÚí¥ö߯ü²šaËsŒCE> ®(ƒø b˜˜© P*iˆTÔB‹°Ô:¤ÐlBM6!& BMSb­Š´Ób“Mƒcca…Né7¥Ü¼Ã7iÿu e”–7ˆ0„f€ˆ<§@ÊNÄecEsÕm\4ha…=ç€Â.aÃ'jÂí Èá0˜¤í$à I Ø„¤i¦›izÄr¸ÒB"" §""Š”Ê +xƒ'2²„kÑíÓ ”Vg†�äVä�yf)=¯�KìBø`¯ˆ&Ú(ÿˆÿòmddüÞs#)¡mTçeäƒ�ãù2¯;ÒTÁ3²ìªD +%¹¤Ö­(o÷FŽDAT)n�•Æ ‚¨éAGÙš%^Ÿ½ +R¸ÞDjIZR ÙŰüT}ÝßÌŠƒÒ¥2z«J*I3¹¤™?µ'ð‹ó×éÝÿ‘�´Š“P¿Ö•R~ŸA0Ûé,ü4ginó!QJQ›0ˆB‡#Pa.iÙ)Õ4·}Ònÿ×ò¼ò–¼ƒ[ÒI|#cØ„aûD™œŸ¢¹T=‘˜ ½ð4 «>h‘^>;mæäìèÿõO×qH~•$Ú#».²hA´›Ð´é¦Õ9ó #`plŸRý&ïò>r%�˜keÛ)óc7`eX®l³dCPÐg`¦DŒé©©Òúâ¾T²÷JÐMî“il¹Ñ'JÓ,%3Ç.p†“É«L7vM?õÞ³®“a0²#Š}2x"ì<'„ѬyöÂ3²F`Á EÚ"PAš¤Däl‰šÌ“ŒÉq�H”=3©•h„ȯ¥êµkõµwéñ~�ÞJ*í$Þí.}w ¼;,åÍCLŽlh0¡œ0¨&ä­óÃA7 ´ƒ„ƒ%ÕA0ÒíœOA£;4‚hÖÊ ƒF°Â./›3æÎˆI—¢.0d„mŸ c%¨œtR?"º‘¿Ú‘Âÿ×_¸ß¿í Ž»ýkç´�ößzK§~©Õ'„øº¶©:õ Èæ–“l´&ÐÙ3‘Ý'‹ ÃCI°‚b·I¿„Ú‘ÍMQ°<§‘¬3ÙŸ#LamApüäiD!üD%¨"·S†²:_Õ±ÿ½ÿûé¿×ÿÿoÿ¼mÖ�Ö’om'ÿi'JÒé+D¢Ôi<«h“Òm'é{- ‡<ÒM„ô›Ï꓇h&’ ’÷°l—Ÿ9ëG·£[×°èý‡ÿï_þ>?½ÿÐÝÿÞ‡ýoKºÜ}}wa~¾ÚOM/_i{î*•¤é7ê´ú#Z ia}äì³�-–@M¤öÿÿì?ÿدõ×ÿÿ,rH]¥úÿ×ý®Ò‘Â×q´?ÖúÛŒZÿþ•ÒîÖñûý4·¢­«þú¾‰E_[Þßÿÿì<œ_ÿo(ù|ù|ÿÿô‡oþ¿ý½x?ÖI?D:=8õ×­~‚ýt£q[Ý/Ú.!ºÿûØIzê0oÿó_þÿÿaÿÿÿÿíÿÿiÿ¯ûÐü±ŸÿÛåÕüÛTC¡W/¿ûÇ·[ÿÞÐסwþÃãÿ¨7׿ûûßÿÿÚ)ÿÿÿþÃn½kÿ__¯ÿë©c*Þÿþ‹1q_þü~Xä_wÿý¯†ÿÿ�ÿãâéÿÛ­×Þÿÿá·_ÿ½õÿ þ—þýÿýÿûëâÿÿê¿¿ÿïëÿÿýßî¿_ÿþ´¼#ßþ°FÿÐFþ¿øî—þëÿ·þ”9�ß·þÚKÿ¯ÿ¾ßÿû}kÿí £ÿ_ÛßÃq ´¿ÿ/ÿÿÂÿ×ÿ·_þÃÿöþûï_ù?_ÿ“ÿ×ïþ’ÿû|mú]ï5}~ÿÒýëÿ×ûÒÿöÒÿôÿ‡ó­øoug­oµ×õïóÿíÕºV··__ý=þ¯¸Kt¿ÿKû]ÿÒÿÖþ¾!má/ÿ ú û ô˜¤í‘t"óJEpïVÒr÷ðÓ_\ÆÚ÷¾»iV•§í™¬Óß÷ÿn»Íõ÷®ßþ¿ý·ú_õ^Úú2ý%×øK÷°aZl*  ˜XM4tÄ$ÓO[‡i1M¤È¯‘kjÚKiXEM6v�}Û ÿëºíúÈ<íš+í³E߯ï[w߯¶©7ÿ¯íëÿûú®áàåM†!0ƒ +WQXÑñ²4${hñMá„ÂlB¦!5°�5L0 +­& tÓbOzµV*×VÐ[`·M¦ÚX\Çi_kiûivß§oJf¯m/ïöõïüßúý�W&â‰ÄD! !a7+N‰ðÄ$¥X§h'a«nžÓL0‚i Ó`ÒR:`Ì6L;d/lئCþEíÁ—4öÒÛ9_~?´©[?ÛÑûämº×ûVÿý»ãˆŽ""4ve’D" #¢”œ®Êâ¨!"±‡a2=‚BmUPa Ú ¦Ó¦›ibcc’¼9m%V)[KOa°Ëˆ› æéXOûô¿[³ÿöÒ¢ltPÄDDC •�@"_Ec B•m„ÈÞÉZi­„ÅFH6Èå¦m‘Å6)†”ަ›!wL‹ŽEpܼØ%iR ¤¡\·)gi ‰`ÊÚGç+=-B°Âb˜NŸlÅBM„ìB U ©6ÿ+¥îd)ƒCGÇM4&+L4Kêå L7ØJ´µâ"Ú ëuéC![‚[J M†ŠaˆQüÈ.2:…)m30 Ô#ÅL…Nî—å œv%ýGp §hŽÒ9�ªýÿ" §o…&ÄúùI©Z]E½é´d*ÎÒðZúéú¿µútW¨l΃! 'i�CFÒúçbÂéÿè< Â.ØFÈG€h„ó84DœPÉÛDN›"…8¤‚:Œ†D»:�)ÍMY­¸çu{ ß²ÎGmÃK ;¤öÓ øA£eØFÃÖF°Ê A„l=—d'ž‚ÄH²?¯®WXÇü'JÒu¹gO'DÃrg ó&N“i6‚a¢#´�'Õ°“#ä7›3¡ <‰²^ÈiuÈ”v£)Xúý.·ö·’„Õ_êÜŸÒÕÙgZ´“xL#XgÃAÂD&L ‘‚]„ è)Nѧ ��™ó$ãLÖÈ„j5õþèk¯¥é[CúºOÚ¾.¯Zú=´˜l– þXN­áøØ<§«Âj ”ø@ÂÎ<F€f¤i›"ˆÀϳMšÉŒ,3‘äâ…:&j¿å�® ë×úÐí ![ië¾µ};m&ݨL³³ì*º^­$ØCY3‘Û‹ Ú"¼#CI°¨4�4 Sa²} ždL„kF‡!<Ö#Xff|Ñ ç²S9ÊA£Ù2çÐÍÖÿHWÛÿ–9 ä<õú÷×èu«{ïúB¾•$ÜœB¼pL; ´µ>i8TÏ8g ;²ë"ÃPÔ$ƒz äǤÃI·oP›'äù¨A”r./þë¯_þ,4]koþå¹™ ¯[·ôý×þÞýÚô·o®ÁÕé+ÕÜRm&ÝÙtʰÝÙu†l‚µ ÿë¯ÿêÃÕöõü}[½/Þë÷]Åÿv·wúïßÿm%OÇÛJÿq}ÞƒjõÿÔŸ‚3ÿÿÛÿÿaêÚ_ûß÷Ãúÿ§ÿ®ïn×ßîÛºQ÷¥íÿ·ûM»uÿô„ÿþ ÿÿ†ðF×ÿz_[õVÿÿÿ¸ïþû^ýµÿwÿ}µÿw„½/¿ÿÿð| ¶Ò_÷¿ý†¿ÿÿÿþì?ÿÿ{–Ÿ^›ÿ¿ßw«þúú_ÿîí¿ûoIاÿÂ;ëü6ïÛ¯ÿÿü/°ÿÿ÷ߨ~ëÿ¿ýìöþ¿]Òÿ·wÒûßKEèÿÛ­~ðÚ^éÿÿàŒÿ ÿ¿ÿ·ì?ÿÿÿ$?÷z®¿d'Ý¿þúª_þ­¥þ%ìWÿÿþü7ÿÿÿàßÿÿÿû‚{öÏMí÷iÛ¥þþÙ¢nëÛÈ}~­ÿ±Q_î— M×ÿÿð¿ÿÿꟇÿÿÿÿ¿"ÛMŠa‚E;#ÐeÉ[®Ë÷°ÎWV³ó¥íö·« üÌóŸ·TÿYÄÿ£U_ÿÿ×éÿÖÿWGwíú¿ÿÿþ6•0Á1 + ئ�ØA Ø šlV“Å6’jÈAßY…"¸m¶¿uÿÿ_W¯ÿÿ×Ôâúÿún÷þëÿÿ­W5Á e†…„ÂhŒØç†×a„Å ’&› +˜i0l'†¯í'jûîµämÿÿþ—ÿ_ôµ>½ºÖÿKýu¹7%ÄAˆF¼A¡dd*©ç ©¶•r%×´¤Aö ´¿µÿým[®þ¿éRm½kun¿ÿúÒnZ pâ)ØmôÒ 4ï…„Û  “M‘æÕ;ÓNEpô¥¯¤Ý¶^ÒÖÛ?Ý×tëþ“kzé=^Rxb‹ Ú+¨¬`ÉTSÞwI„ÓL(M4áv°H&švdqˆV’aSb•Õ‘}¤ÚL„¶^Ò°Šæ;JÖë–ddæ û’DA…Dr(—Ñî�nˆäÔ&¢¢ì0“ЦÂM ˜\BÐLìV‚Táô‚N""4w«—½ Áb ’¬&5—MBŠC ë¯Êàá�‹Kÿû!Ùœëÿƒ +ÒÿâÈ£„¿ðb¬S0ƒ^(®sÝrMi­ÄGü®+`»•è!�‘ð¦E1�ƒ"YÝ0‚Äz„aØP¡Iª/‹è}ë‘ +“<-÷Vƒùo’Y+a3"¬ì¿¯ü-ÇA~�p¡L‚â;2øùJI¯iW½kÎÇŽügã8 +i�™äZ�ëKæFHì ¥ÑBñß~¥ß°�_œ�DB¯#¢(d³ÈM=|.–7¤þïM?„¿„ #Xhöc‚$2``ƒP@Ñ„a’Ð�Yç#Y“ ú×üw¤·ÐOð�m&Òt›FÆ��ªhÙGÆ¡F€ËèÖ4ˆZÈN„ #@`™æÈƒÍ‘VGA Ft�S©„zëþUwµüRýºM«¥ &Òl"-´�'dΛH1¤ØAßÓI´ ¼&O&˜F°ËèÙ4ÂhÖÍ"äœ9 3[G€ÁÃÒË�6²GI9©Ð‰NIþ¶ýz_íKIÒn¤êí.”$›ÛfPZ&l ›Iáœ0¨‹¤Æ“ fÍ&Р½&H:MüC'“»xF€h„ó@esvSˆf!:6Gˆ£6y@¥\hgP§%$Éô—Òý<„¨úµ¶Ö½�Zëi^û}¥Óè­%¤ÚM¢1þËB¿Iô�Ž_°“'µ ˜zO¤TÒÑò�Ó ¨Aᯠ„k1˼—8"í“)‹ÄŒÙ[ÑÂ$NŽ.2Ê HÔýÐèWÞ¿¯n5oýtžŸvÒuM§[¦’ôµýÞÚ´—¤ì³¦Ô:M«¤ØA›Û3e¤ÚM �Ýo +&„¥„ѱ¨L#[ÖFpy>g 3Y™³HÀÒ4ÍŒÜn/fȆ3\f?òÌ�´×ëÃÇôXê¿øÔ}Úoãw�¡¯Cëñowûñt¯¤µá0› Þ•¢OI´·t�—JM Ï6þGm&Â"ÃIÒm'ÕSI‘†íSXŠb°˜FÀÌàš5‡ÿ´]uoë‡ÿŠÿè·$#ÿúú¸ü±÷^“}¾‡ß·Šýoí?ôÒêû¯ûÕïPN— ½ÒtŸ +ƒ<Õ§tæOÐaHí¤ÚMÿVÿû]%ÛÿÅ/÷ùiü±ŸQ†?¾ÿ÷®ð»¯kïCqBëúÒ½Ý×ÖÚuµý­*øM«ü'JÑ'¤ßü7ÿþÂ({ÿÿÿõÿý0×ïýŸÓxðÇ÷ßK–:_×um®ÿxþÔkÞŸwíүݥ¿ø7ýá¼$î—ÿÿÿ¶¿úû }Ï ÿì=}XýòÒqÿ¯ÿ{KÑ¥î‡Ýÿþéÿu#…¡�û¿ÿøoKbÿÿÿ¶—þudwàØ#ÿßý¿õa¯ûþ•~¿_ßü´ý†¿ÿþëÚ_ÈÏ_öïm¥þ pŸ¯þÿöÐ_úöØA>ßÿøoüžaÿÿÿÿÿîš_û¯þ¿ûé-¹Ÿûßÿ{þz¶×þÿþßøKðé�ÿƒè,/ÿþÿÿÿ´wÿûÿÿ¿ÝÿÛ*þÛz÷Í_®—×þßýþÿ÷Kÿ_½÷ô·A~¿ÿÿÿ_øo"/ý´¿öÑO_ÿûgÿlÍ7k÷é^°ÛuÿnÿÕ[ÿ_lêŸ]ºÿ÷îµÝ~»ÿûÿ÷I�ÿÒöÐ_þ¶—ÿïa…´› +Ã96—¶ƒºÌ}²ìþÝ]ûf{Ý0ËÖf½¿öï_×®ÛÎo륺ÿëûïÿñU÷ïh/ýƒÿ{ßûø Âa6!7AˆLPm˜A±M« 6Ãb›Is Øa&ÎZ~”†9¯¶]nÏýZíÖ¾Oßûuêtÿÿ­¿¿ïÛKßÿß_ýŸÖÛ¦+ÿ•Â$|ÊÆL�@�‚ Rxd¡1 +šö›H Ø0ƒMŠb­4ì$Û˜MйÃd^¥"¶•¤ž›g½´·^ÿ××]½³M¿VÿþŸÛó§¶«þþ»¯~â"‘’Ì"(çb:Øh£Ec 0‚=¹ãq +ÃWa„atPÒa8@ÃiZ +ÙXû¤ÛA,ŠáÚR+ƒÓí.Ï{ $ÞÝÝí¥çç¯lÏÿo_ûýw½¸ŠNW®”ˆˆˆ°B ÁÂi!J±"Ý´ØavGa6H8.Ò…I¦� ”1H6)Ž0È'q¶’O§a-n›?Ø@ÿ¶AëOþÙšóEW¹n ˆƒ!ˆR²Ð4„ÓH¬sÆxqH6Âdqd®Âi0Ú 4÷ šaŠM<$Å2V•4Õ¹ݤÛ^­ª°×¥¯E¹£7  Ä)V+Šä"‹w=à é±0«´ÓNØ]„½¤ÐlT6+ué."""0Gugz¡G;†›G·¿G`~Ë�„ Ú_àó$ÿ¿+§²‚ÿ]ü%Ž>è,‰j×¼ÈR.fÌùšh¬3LÙ„É��ˆò0ŒË9”#PÓ C##Is™OméÿõËuL~…»¦áé6„0‹²;隇F€öOÉœØäN3’ã[(‚4Bd0R?Ž�ù³:$:)Ñ:4.»:ZæK9Û¬ìÕQ'î›zM¢]§eœ3ͦ’÷t®NƒH0ÑÚ*ߣ;Fçÿ„EØxF²øg#[(ËŸ.0ˆOD +ˆM–ùDÉI?Tõ2Ê_I§éõºµiëzIýÒm¤F=+@›ež-¥~— á ›Òm’àƒI0®ˆ@dc†ihØÂ6„]¹ãXf‘s.)ã*¦le²"$B(=’^Í2-$I!ˆ‘ÙÔ”ÖˆÚ]W‡�Ý/¦ý/}Sé¥mß÷Jóëút¯I·è%i—|8 mYgN“r{ †Ó &Õ7¤ÓM0ƒ>l—T&Q1@’6<“ #Xi„ ¢.aÈ#Xf™�¢Á‚ˆ@rqIHdhˆ<§=þµÿíÕ¡í =oî«®½¤Þýtü=µ|Rm¤·t­CM4m„·e“"CPÔ$˜zMªj©6‚t�SÑò¡ú60�„hh„&{ ‘‚ÖÈGDxÑAžk&\è"7Rÿùiÿýj?òÇ#u·ÿò8[#—^êG û¶’9 Mß÷ûÒKÝþÓ¿Á6¯IxD¢•ÙãPé6­¥ pÙgºMɤ¤ÃAh ì˜ð“ I´…‡%àü&hlŸÿÿÿt¿ãÿÿê1ÿü­ßËø7Ûö·hw¡ãÖÖÓ»{i-îétÞëô¯Mé +[éjëM +M¢I†�l;²ÎE€ÝÙmÉó‚ëí¥û¯úÿÿýKÏþ�õ½ê>‡^®”±îÚ¾îÿ´îéG¸©.øäpª:{÷þ©¥ãíí®•ûÂoßÿÿï¯ôãÿÿÿÿ§ÿÿõJ½ÿá«|±�Gÿûÿ½‡H‚G¯«t*Ц¾ëøë½-ú íÿA÷ÿøÿ¶‚ýµ/ÿÿÿÿïÿöÑÇÿßûýº®Òÿ÷îZ~£¿.°rÇ6Ÿ†?¢Ç=êß©:ÿ½ÿÿ÷ø…ÿ¤ÿÿÿÿxÿÿþÚ_¾þÿ×Þ¿ÿÿëô¡¤?°ÿÅ`ÿükÿÿÿ~HÿŠ ¿ÿÿþÿß{i}×ÿ†ÿÛKõÿÿý¿ÿöÿØkþßþ’·ÿÿÿÿÏ1ý­¿ÿÿ¿ÿý´¿¯ðßÿÞßÿÿÿÿþÿ ‚þ¬?ÿÿÿÿkûÿ¯ÿö—ÿ·ît_·õúëáÛK¾¿ÿÿÓþÿ°nÿ „{þDNÿÿßÿßퟯ�}¾½«dëßÿûóDÚÿí«Nß×ÿþÆü?úÿ­Ýÿþü:_è'ÿïÿÿöƶ¬0’ì7/}XFvØI5m/ÿs5êÚž_¶N·¯¿ô¼Ó§­º½ÿ×ýt›ýÿwÝ´¶ÿÿÿÿá6Jö¶Ä+M¶!&Ÿ©6b®ÛA&©²-Óa‚§jÚ§z¶ v¯MŸí4ºïí{vÿþ¯úé¶þúï¿Ý/õWÿWm/õþdPŽÏƒè‘XÑé¢� + íÜ0‚i¶’v�ZaŠM 6–NؤÃh*v)t­$òõÓi+gª³ëkû]}u{3^Ý¥¶töÿ4ÿö×9ûi}ÿý-Å72B„#)XD�Ø0ED�`ƒ\ÎÓ †¶¡ÓÐa ÁGvMŠa„ƒh$†5×OA6 ¶_´´­°½Ùë]³ÿV~ÿ«_³E¯Võí·_ë¯W,�K„"2Œð‚ Ä#®Âbb‘îM0¡Òi§i0fÎ+A&š ŠMCh%b­&$žÙ~Ò‘GËû`•„Âu˜V¿gÓ¥}ôßuË@‘�¬#"E‘TŠâ�ˆUÔB‹Ã +Ðl,Ž‚H6 Ä$ÂqV”'b“b¤pÆÒŒ6‚[cm&Èõæ=+¡Þcé#ˆˆÍ² "B•Ða(#§+1M4ÖM;Ói&˜i´˜®*ÂLñ[¡¯£²”d)b@Á)¨L*#�ªa]%ü²!ˆˆÙÓ(ÿÁ„—üAôšßÂh?Š5°˜ øˆ²¹§N?ÿÿÿÿÿÿÿÿÿÿÿÿÿüÈh2@ÐMš{òl6ÐÞZÀ”ËLl A¼¶ÀÚš@j�j¼þ[£!¢I�«S!0s«)$K s�ȼKÉò¾‹#Àõt#u£X‡bÄJ†|Šx«" )Ù¢-eNÓ}u>Å^Õ8kE[& $‘ ÙæD@‘xž6Ž™j­À¤{ÛN½í;U¤Û´“/>©Ò°‘j¬ o¶#J´*5úXúISÖ’ZMªI7K4D†tKBµ¤¯¥Þ—õ¤ßyj­É7Ü Á.Aƒ4 悚 œgÙ³3eHsC­-QO ‚Q_].¾ÿ¤ë£ERF†Œï +º„aÃϬ DvfGã6Î3dQ?Hñp»ÌÍ#Šº«ÿWêÇ«„qìK­-'I0 Œ<#�H8Iô‚6º„ÔÇ„½#áý$“¨F³«^u2=¥ú_ý,zÐU¥úêÖ�w´¤«Õ´S¥GŒtÇî½j“z]è--O �•×ý/¿¯Ž«^–�écJ+ŠZéZ^‚§«¤«Ò_•é[IuK®µÿÿÖ«Tª’J©ëé*Ò®+CB:¥¯IZIö©uQIz_OÿÒ_ªÒëÒ­j©jº¥¥_I}WÑV>¶—6i%×íWÿJꪩz–½WU_פ©j­*ñoê°’®½tÚ·U·õ«Auê”T•U$µ¯¥ë¯×¥­ß¥Ð¤º[tÃý¾´± +ºë“"«ÿÖ•-iV’¬5]öK‘Âý.£‡UïÒåÔúËù…å×ýV«×ý(]kªª¯¯¡qÒ¤µÒCU°it£N)RËÐòýgÖ}}Q~‹ö}`Œ<�$aoè㣠ÔOE.·Õ-_QÿÒõð~š +8PâCVÂVª’é!XJÒˆXT´´°µPx]rý=eÿúªÂ(uúIxô* êª©8ت/U\+ D$¢·Jâ¬(«B½.Ž.·K],¾‘.’J’ÒÁRšª › …± ÝŠj¡m ªªª …M¥bšJÖ‘É|% ´�zI}De;;шhaB *a5LBª¯jU «ÓvÒ׊»¥I%Ö ++‹�)� �"ø± +‚…TÒa ’zT�Šá5+“‚#µ­¥Ü®Ò´ ‚ +•+Q@�YÚÂA[IˆB"�Œ% APˆACB‚ŠãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäÔ |�07L…ÈÃv°\�h7f…È ÙBäÁ©½RàÈkäÜ,†ÿ–ÈØpendstream +endobj +256 0 obj +<< /Filter /FlateDecode /Length 4223 >> +stream +H‰”W[sÛ¸}ׯà£2cqq¿<ä!��­;»I6VÚNíNG¦i›­,*º¬7ùõ=$•ÔÝÌ Úøð]Îw¾ƒ/3^ri­&´X�’Pmµ°Ã/ΉÔתäT1nD!�.%RPUh¡h) ÑJ˜¢zšýtùDŠóvöÛìËŒJgÓàƒ3iUFø¥¨â„©5†±Â’æ¸ÀE†�uʬ +i4ÈKíU²3Ȉä†ý¯þ3®Å5Jk&a�XTÜh ²ÿßCüUjÉ­d…fp×H-¸¦Á Oû‹Þ~ xAm¡K¥­¥J\$×rü�‹V—Æ"t"ƒEÑÇ|².”#N +3Öbƒ"„Ôáhì�ˆš(V2&´bÁ¢L%/ê¥E± ¸–!Oû¨3nÆp‘ +­ò ªhÐ¥®x˜ ©J+¥`¾²R¡9rJm±„;ŸJ)™uÿªaMI}}\ŒJGGug—”Ì8·úu÷0£ESÌþ´œý´¤ÿ"-–÷3—¤¢XV)–ÏXŠå¾ Äýý­àÅr‡ÿAíð�@BahIQ£™¥¥B˧ÙüòiõP¯–ÿžgjþq×Võ~ßlÎü¿ºk„’î›.Q3캛ÍÿÚÜÕmúÎQ|GìR… Ëz÷ÔlVëýYoÛöÞpüb\” ÀC‡V›»d˜qîã`’�8w ϛ͡Þ¯¨"¸¿zÜ´ëö¡©÷Å«.ÿ‚¼ræ2گȫË'íòé]Ôþíý£RúEÍ4ÚJq)¼WoßürÑU¢qŠ~õy)ULÂù‡¿½;9-úÅo^¶wŸ>üš¶‰"_ýNÆxØIIܧ¼©´:ˆÀiö]¾ÿøy}œ¢ &¥[?^þýâ—«ï_ß5ŸË M¢#Ëé„)òÕ�è°¢˜Ì’ÉЯLO’)£™iiòR€Šá;£Ó>/û8ÑÞE¾ÂÄ(8 8_}pTƒùàï‚Q´sÌ>ð1ÞÌ}ý�7ïÏß¿^ß¼Š6¸.ú•§pV´s±Ð 3)5.=ýêO�*(h`yîö¾ýtñëÅûT2é|ìWìïÚ,wïüâíåÕå‡0í@×Î3Ÿ;x~b “¯×ß�$|³ ?_iéþ=ì_¬¿:ç_À†vLŽÐ ‰Ò´;Ó£·¤3šùÚ"ãwÏ$éë‘ÖîšèYß>ù-¾q Hç˜JÝCNäˈ"__ óhKëK‚±¾ Òú¢k8/ò5Á’›Ò]æ`ƒ±çN}ºøùòjyñéû€öÜ$|Þ ú ¥ëË‚aæ+ƒ)�‘êb +ô�\ÂLÈ×@¶,�-®èêC‰·G»‚1 Ó +ƒ‘öÎÜÍ|•š�„¥.!íóf_­ÖW ¤þÆ´þO’wÃÛbKüP#’�›± +ÁŒ¶~þ8Øç�ZÐ;‡Žì¼D¯Ìœ¯RGŽ`4•ÖžZݼÒe"P—MJ.·“»D*2(ÇwÇ.¸H·uc1vý‚šÒéÀ®=òž…Ì ++_D�‘½zH�(/]z>!¶}ÔIõ “A¿ëYádʤ™¾Ó7<~ÎÙkj:õé): n€O æ…¦È4Ò‘ØÄkÞ+©—N7ç¥ôõ4ßY S] +êô¾×S +:RÌ€Ÿ´…$¥µa¾Þ0&§Cßw²HîT‚Íú^û¸A8òQ²ƒ�ìûá D1ý]“³ãá¯)„µÓÒx*€üoæ*àrÈ-ô$·¸ç‹v­>°ñy›ÈâÔiw˜óÐVþE(C†Þ5Ç]�<àË  —7%J†gËÈ‚:á>“j¤—•§âòIGÞ>6ÛÃ�ñC ®®ƒ#WÆ$ý¤th»øcõ´];éœyd™w‘á¹ +u—å×1÷¶ù£†p:KäÝiy†Çª ·«>éTuä.Uì&§Þ«Éq*â÷öxØûFg�w˜ò;Vcó¤T6ˆäëÎCÇÄl^ÿ^ï¾BìØDE=¯ÖmõŸâ•œW_«u}Öm[PHRÌ!´ =v{ÙËë Òx³¡iƒ²E&ÁÈw˜ìÞÐâøÄ=Œš}î!ð˜€Û~(æG®ç»zå°Ð.†Õ&Žº˜XWUI©öccv“*ÖãÖ¹!oûÙ>�sgÝj¶žˆÆMp³"h(`³Ž7ÂCXc5À¸ò¸ÿáý»ü�Y ™�~8œÉA¹eìÆÁwœŽ­ØYúóaöÿ.YŽK¨•ׂ’û^ÔÄ›`´Q +…,ÚaØéÉ7QátR3%ðŠÕ«t#NI­ÈHÕj]( +0éíÇ¡Ï9R%à ©�Y8Ï�ýnðhá²!�²Õ�§ËK¤_v€çÌ”IVÎSO:x¢ŽZÕvÓ8ÏΫúž•õÝ‹�ȾóÐPC׆ÚóÂòžd¥ŽD˜9°¨N�ÏW>Û&¤ËÅš©r>AãØU/Aœ‡ÝRjÁ¢Zæ‰deÄKPãáF¸u¸ú`çËÐ~Ý�PÆôÁ[!*"ç„bj”cî§ç~¢0,Tü:ßÄd•ÏÀNŽýF‘gD +ü�ê8ü@‚U�3åVC¯_0÷!ÓÚO}6Üõá{É4—ë5Q=ÌhQÙ(´lBœ.íÕƒýüjñ½@+%=£¥Ê¡�ÿ9ÌQ黟�TÀ²®œtÎð_nH^µöO£bãÃ6·ó’ot`µˆ+tØ ‰•ZL™ªÙ7Û¨³ä8@HŽÉ±n°°àŠÙÖÞÌë`?Níôu¿uXÒŒ;�ýHŒ…®’5 ¹…ë^'ò#u+°—Ý{ÖÔ˜Ágɉ—>J×Ïü®½\lOEîçØô¨\®ÅW�DùiÌU† Ú ™‰<�[µç~~�Ÿ'dÙžyæ‰øµ”)µH¥�d�¶-õÛw}’-œ¹õÿ|²2ð�Í �Aå ÿÒw࣠72çχ-­ +]Îçk] B!ïî‰Ça¬YŸÅJÏy ;KÖÒ< ?ûéËô#L�&ÑàÌ$‰ZT†´¬c¡.C_lépÎÞI*�°6ïdU¡{Ø|@Q7NÇSù†ìË�áåeÜF†þlã›�jêˆô‡þÙv}aχþëÊ%:ßÏh¨h½¶nòº¯¢çõ×ÅË NН…�ÏÿwSûÀÛ5T«¦ÁgiBjæÌíÖ0jšæì‘TË6‹�¡›™Ù<‹¤ÚºÝñ+$µ,ñøÑ.T7ÙZ�Óxr‚`îÆËbOHî™LÂ<Ö4�ÿµ lå‰;/8]ˆäÍ͹e¡'.í´Øî:´ùY €4´ Ü~º±©¢.Œ-3«#[�ÜŒIŸ±ðJê`Õ#\šu4°ùQ†Cåýg��UîÞÖÏòF…ÏnXQp®)D  ÜM ‚c`´W©•?ÙóºKîÛÐ#‡Žµ^i² äÝç«í>åßVP–Ð6Ø¥�§R|O*à-Ä«¨µ +Yo»ìV�;B^[p‹˜³´èÓ9+zÂÿã®ã6]S柇ù©Â ¿Û§ëDÉ�EóƪWŠ× ?è…x´‘Æ)«^'ô›è  [èél�†ë †Äí Á¶��!&}FT˜”~Ý;C^Š £‘0¼¾3í5uG»ôÝ�)ÉF*´£N2Ç÷Ç=˜‚å à‘Á ¡Y6,¤öÀØAE¥Šá��à»ò•?ˆ +—ÈHU…ó'{¶§ëi·‰kê„}RQô˜ÅtœÀs�ãH N¯úò;ÑDßG°å¦¾9‹tKi?…u“ ‘‰r ^¨È�ãžÐð|ò´Í/ùì¨X|W¿¢ÐûãðÉî÷­ÓN˜á¢P'¦îŽöéðä�ªAˆ>Ð�|�„ é>Š ØÌ`;#©'¯bÅ^삸*á/çÃøßáŒÂ)R£$öÃx9­+{�Vâ“ßPŒé)³,l eµTnf_iSJÝèW�{pX ÂÀÙæU4+|=íJPí´v=¬qò…„î» Þ‡2^ÁâL®cTÑ0.¡@: @}zIù[¼Bù7¸ÃBÔ~…´˜~ýß¿Êü:>Z;qD®B¡JŽÊX7cøþµ�,ßú›1Ïi¡<È0¬iX˜)½fÀøKº +‰¯PÙ­oí“]ZÒ¹&ª²qVSÖÀLl—ûû¾;ž¡YÖ“&¾@ ìiUÁ7QÌ“3Œ×é> +endobj +258 0 obj +<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +259 0 obj +<< /BaseFont /Times-BoldItalic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +260 0 obj +<< /BaseFont /Times-Italic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +261 0 obj +<< /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +262 0 obj +<< /BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +263 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 784 /Subtype /Image /Width 7 /Length 621 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ"ÿÄZ2q�1BrÿÚ ?Ô¾ùøøÞý}¬Ÿ·¯õ�?|ü�€–=v}vYõØYõد]‰k×b¯Q-ùú€[óõßœüãAnXйcAnXйcAnXйcAnXйcAnXйcAnXÐ@·,hKRÆ‚µ,h-Ëå�¹cAÔ± ·,hܱ ·,h·,hKrÆ€[rƂܱ  rƂܱ ܱ ·,h [–4å�[–4§À�j| SàB§Àµ> 3à–gÀ�f| 3à@³>™ðÌøgÀ 3àYŸ,Ï�j|³>™ðµ>©ðÔø§À SÆ‚Ôñ  SƂԱ „-O Sà©ð-O�ÔøgÀ„,Ï‚YŸ³>™ð!Ìø%™ð! 3àYŸ³>‰ç@g�™ðÌø-™ðÌøgÀ„,Ï�j|ÿÙendstream +endobj +264 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 24 /Subtype /Image /Width 32 /Length 318 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  ÿÄ=!1AaQ2q"�¡±ÑÿÚ?êK‘_OÕ*çÆÂC½ö¶·¥Ëòðá0î Ä›è:ž)²|Œx€faMçÒ*™29RÂ]Äëeñƒ6­ÆF`o´�|¼¯´þi]p®BìÅt=ªHØóëAó£�1ºƒãºÝÊdJžïU¾ ÀÀÚñÒ§Çñr)Óõeò9°ÞªþIÐXGÒ‰E:�_ÿÙendstream +endobj +265 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 8 /Subtype /Image /Width 8 /Length 184 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ÿÄ0!1q3ÿÚ?H¿¸è=8®Q‰JÊn‚£AÛÿÙendstream +endobj +266 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 24 /Subtype /Image /Width 32 /Length 311 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  ÿÄ<!1AQaq‘¡±"2ÿÚ?꜉‰ÐäLI>5-zת–½kº‡Þ•Åëúå)jVµãу�Ä$»ÏžúG+@­ñ�W.?î$ܵé¾Ý“çMäâ�–¼&ýn±�ç[Z¥Ó“ 1ã¡?S«cõ0âySF"CxÛoÑ¢zøÃŒmâW´m ú˜Tx›nx³5{á¦DSs£ÑüšÿÙendstream +endobj +267 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 16 /Subtype /Image /Width 24 /Length 251 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ÿÄ7!1"AQa�ÿÚ?Ô…¨ËÊDi%õØ VVx ÆŠï®Ü#+G£:¤yÜ*qÆY”öÔƒ‚ÛÏ�?ऋ’'$cuX�N€ÕÜ€=Ndú‘�Èßß�ÿÙendstream +endobj +268 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 832 /Subtype /Image /Width 7 /Length 661 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ@"ÿÄ]q2B1A�rÁÿÚ ?é2³ð²¥„‰ YRÁ+*XV^VT°B²¥‚^T°B,¼©`—•,KÊ– yRÀ²¥‚VT°@••,²ð„¬ü¬ü!+?+?JÏÀJÏÀB³ð³ð„œüœü"IÏÀ²sð„œü¬ü!+/+*X!^T°KÊ–B^T°KÊ–—•,úÒÀúÒÁ/¯_^!/¯_Z¾´eõâúñ—׈KÔ—¨KëÄejµ¸)+[„­n(JÖá+[€JÖá+[‚,­n$­n +²µ¸JÖàu¸IÖâ!'[„�nÉÖâIÖâªÈÖá#[€HÖâýõ¸ ö×Ú�ö×Ú€/×_j×_j]}¨]}¨õ×Ú�ô×Ú€/Ó_jÓµèϵèû^‚‡>× síz¼û^�˵è˵è»^€-ШB  +€TN_è.× ŸJþ7  ý«ùüûPfF·$S÷ùåß.¿€�ÿÙendstream +endobj +269 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 16 /Subtype /Image /Width 736 /Length 1175 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀà"ÿÄy +‘Ñ’S“TQRÒ1Aaq�¡áB¢âCd£±Á²cD”!ÿÚ ?ú¨ò#³ a}àŽ#|âö;û”ššx Ý7pÍ1ƒ÷‡KÜ3lá'ÓT@�ÒÇæ™ÂN écói„ÍcUD ý$vm0™¬:Hìßñ3YE't‘Ù¿âdÔ„�ó‹¡Ó PGœ\6*Š38Ö¾(?¢ŒÎ·†ï„Å�‹Î¼°ë€ + yкÏ; o{–°:Ïa­ïëX+µÖ¾úÀè.Rï-+Y¼¥ÞZV°:Ï–«æ´­g­•ðÒ <+´_5¥O*åÍ«KX@â°è¿3v”ãÐ-ûëI€b¦‘ Zæb-§Ÿ+\ÌE¿´µþÌF'À +O•þÌF'À%±‰ð€åLæ"1Z S7ñ­@ ò–/â1›¬÷-fõþ+U€èå¯b1Þñ¡ÍäF;Þ0(>Nã}þ;Þ3dðÚßc½ãð^Ðã}ÿþ‡Ü`½¡Âø´ÿÕÔ>Ñþ`M ­ö;Þ0“C·ïŸ&…ÔóçIa7[ÅyÄæ“ä°{­b7ÄH=Ŷß(|Ò|’ímµÄH+µ´×¢€ä�WSU„– +ïêj±Cá¤BG¾.Q}jµ‚v8ü Š”øi'Èû~]ŠKÙ ZñpÂúÓH¥=¥ͦu «®Õá´mÛ–i<”DTòñå¢k¥EZݶu¥&sÞJMØOM!°šÖ‘FsXÞJMFÙ_Eö†Ï®�ÙOM*Z5ZDó<óXO™)7e=4› ”xç;O�šP:‡[ìÒ‡½£IA¤6“X¤ª ,ç š�RØ<»« Ô(cm”óJLæ±¼”¡Â] pêÃ5/…OÀîÃ5Ù—Œ6º¤_R™Ïv‹£m�:´¡Ê_ rîÂT5Ë» P ó´ùÙ¥} 5Ë» Q©Ÿ‰‹(¬S”ñxŤ3¬‡½bÒVoJá?PÞ™ÍÛPXËœFk2ošqˆÍc<‡iò3BÊa>T g ÿSŒFk2sÛó.m³XæÃ:’ƒvQ<�§=¿4ãšÂuÛóN}¯Oî<!;íù§6Ù¬']¿2êÒ€N 3íêýŠG� Ì ó>ú‚sz”-Cà˜+Ô¡ª‚s{ôµPø‚÷˜$ü¿KUâñlµÂ>ÿÙendstream +endobj +270 0 obj +<< /BitsPerComponent 1 /DecodeParms << /Columns 1904 /K -1 >> /Filter /CCITTFaxDecode /Height 2944 /ImageMask true /Subtype /Image /Width 1904 /Length 38912 >> +stream +äÝ]>v+•ÄGyKpÑØ² + „ÊÞd0gcŒªPƒ0¥g5çg<)Q Î +q—úNPì¨Îø!òø×rI"x�Ýp™ßMn‹²P½ØA¾k%—øvoi¯ªv½ÛhŠimw¶žšëqþÅißÇí‹j8ãû¨ãüíâ�ù0ȈÕY •GåAä6jyÑ�•Ù;#y, ÚdƒÉj<â*NyAšŒ�Ðù>\Sc$ +0ƒó<Á„ "!Ã@Í"|ÀÁ´‰à†0@ðA”fÙ sc$F‘qAÂ#™F\P¾~.fq¤\T Ê"ç Â‚"†w" 0�Ù0�ô"Â-ØEÁ��ÓTl "á„\�mÞ…¢ìŠO軣cFÇ£cBе‹F·„^0“hŒvyéSTFîJ…ãBð‹°Â.ñhXEãÂ/AGð‹Æ�ž‰Y4›IÕ¿,%i:M¤é8("-µk T´­XzØP‰a.aAm­ôé8 A´½A  ›Ò°]&Òy,`ˆú•é7áRµ~jÒÕ¤¯JEm¤éZº´´ÝSj©:Ú^•¢7«ÚÓ¥ê+ú¿ÈÝtïÜ�Ö–—¿jÞ¶“J¶£ßt¿Ué§K]{iÕúu×Võݦ·v´¾ëiºô�ßõÝõM^¶ž›éµßþÿ øìŽ‚Ð«t9$8oÿjõ¡Õèn?µ¸ü1_^ *C¡ã¡ÿ^—÷CƒÿŠúQ¿T*ß×�O¿ ‡¿þ¼…ÿÁ)ÿä‡&ŽˆyÿûûþA&þ¿&Lžÿ“¬6ÿ×òzþM?ûõÛ_üú’Óÿþí×'[ÿ‚3úñÿÛoöÕ�ÿÿÿóF\öÉ6]ÿÿÿÿïÿúûôÚßÿ»þõ_ÿÿÿ¥Ðmÿÿÿýÿÿí׆ÿá-ŠÿîÁ°oöÂOßw÷ÿú ÁÂ_ÿÿß¿ÿ×î—`ÿõØ'ÿðáÿˆ*ÿëÿ×Ã¥ýÿþÿmÿWö• ^þº/G÷M¶ïú,¯ÞÛ¯ÿ¯œß_ÿÿ¿ÿ÷­ôm�ÿõVýÖÛ$MÚ×S[}ò>Ûu¶ÿÿ[º6í?o×ý³éU³4ß­ëwJ;gÕ×[ðŽ;�ógµÛ¦ÎvsûûY›­´;9é[j©êºq{jœˆ;µlŽ—µNäLkvà +Ã7-Ú·[¥!�¶�þôáðaŠM6Òccm&ÒMm‡ºlB a´­ŠµM4ÓNE�ðž‘ÒÛ„ÓMSiŠM6)ŠL&M´L6“i± +Ò„T×vØWlB `¬ ¢i¦ßI²P „Ä M‚ ÚÇ{NŠv¨SV˜WþÓ PÁ0Wö«bvÂbWÄDFÉÑI’†D"Ÿ„ECˆˆˆ0ˆ’2Ü› „%¢(«•ôe¸ˆ¸Š5±¦Nh"sÒH ë«¥õêé$¯Ý:ÒV•´›A°Â +„ÈFe(4#ÿ,Ê€Ì æ€tÏ�YÇÿÿÿÿÿÿÿÿÿÿÿþY5gjDvª2F ê!©ðåXÍC.DäBÆPŠp\ØB`0tuÉør¬¤ÛQ �>u:žiÆ>t8f‘!‘ˆ�f¼ã'Á(а™þÔ)íA”â’>ì‘Úgû +惦õ†xÿö‹·ziÿ7?'ss»Y«£s# ‹Æš/äò/�äíÞß5P�Áѽ¢ùüÊÏF‚o^ùê9Ú7é#Cï ßµAºm}&ôn`aÿ¦ý¬7ºUÓéºm>¶Ò~êÿÐMê©?ÿÿ÷__MÒMûïÿ÷^­×I¹ÇÿÓo¯û«w…¦û÷ÿot½_Výÿßýö×éôôêßí«Ú;ø"=ÿZúüîÿÿöÒütµJÿÿÿm/±Ø¨×ßÕýôÿêðD}å?ß¿ÿþõ«~ÿÿ¯úýoÿõÿ®ÿ^öÿ§ûõÿK�{êäMSÿÿþÇ{Jßï»î»}­Wé/þßÿþÔƒõƒþþ¿Ký-©Ë`úùÓý¥ûò‡ÿÿÿÅú²!Í�ÿ�øÿÃ"³Ã«ÿÿ·÷ÿí¯ÿ·×õóO‘þ›ûø_×ÍTrl\þù•ÿ×­¾z�Oý?þüÕ~j©ãƒ‹üÕ~jéùVá¾?×ÿ_ý¿ÿÿï¯êçwáÿÿÿÿF}o{$kþêÿíÿÝzÿûÿþ½;}×kÿÿÕûɱ ¿šoþø¯ßÿ]ºý}¿ÿ¤›òúÿÿÿ«~C½îµÿ]lWíÿýÿêßþÞQí¥¯ëúOÿûÕÿVÕýýÛK�Þ½ý¯[­´­/oé¿õ¿uÚM¥ÝúM¥^ÿëµö¾ûkúMÞÚúMí¥¥ú_ÓwwÛ[I/í+Ký†—ûiÝ~·!‹ ˜Á-†´˜a&^Ã_Òä1dà X¦+y‚ Pbž·ýˆ[ûï±_ÓîÅaŠb˜¦+Ø…×OኰƒUïL*­ª§ 4"-ˆ†ÚÐÅ„A„ ­@`Xoÿ“jѸ‡ÜQ”g‚”ùFIUo%#»¸w’Þéjƒ[æ÷~ß½=ôÝëÒÖ›O÷ð­ÿW�÷íÞ¾¯¯mÿ£?ë8ô�Ž»ß¿{ÿz×öÿwöÿýS{ÿ·ý-´µ_¿ûÿÿ�Á_½~ù ÿ¯¥ß÷ÿöë‚Cßýñÿþ‚öï]»ÿߥ=÷ÿßÈ`ˆ%ö=-Œ� ÿŠõ¯~¶¿·øêßÚøÿÚäx­½ý?Âß«eq_ý+JÝDÿÿÿÿ&ÂÙèŸ=›È´OþÿÉoïÊ+×ßׯÿO ïùÝÿG‡þù-ûoÿûÿûÿßþÿÛÈ`ŸÛü§ßÿ¿ãÞ?ïýÿïß·ÿ�øÈÆGÿ½e8&ä0Oí{(%ÇÿãÿÛýÿM{´2Ãü› '9�Ñ٫3Š2V÷ý�pƒ¼ óxsU#%Ñ¡Þ�oM×Ú¤ô›ïõ…®úû£=Uàˆþ¯ÿêÈ}}õÿõñöñûÿ¾´úþA;uz]éõõÛ×óU÷Í@é~HA~¿O o—_¤:WI°šOTki}+Õ]XZxT›V×§ý_î»ÖŽýE/ó²r¼²©õc¤½%uß_ú]60÷_¯ã…§‡¦”S¯ý ’\Øä�ýÿÿ^žiO��þ�7X·Mé6É?þmWô•Çÿ„Ä>Ÿúïè/ýÝzGb~v$ÎÒ}õç`zÿÒÕ­']×®Òé_ßi-¤Úí¥é´¶ÂM¥±Q[LŽ+±LU4B^-„!„B"1hDcÿå›;nX-0ƒ+ôgiìLgb‚Ë*™�ŠŒ Ó;H( Ñ| Ârl|ã'Ï3Ê3`¸ Âh¿h¿  &ÓM?Ü>ôÓI´ƒ¦š ´ÓOß7¿'ÓM&Òní'Nïý?é§OVš{j«ïÛþÓI´�U.îüÿõÿÿoUûÿýôÞÝÝþÿÿµëÿÿíú_ÿÿÿÿê×ÿÿûÿû|Wý:V—Zîÿ»¯ë¿ëëªûó×ÿûÝÛÚwûûM6“¥MZMS_ëýÞÖÕªm&š¯¿þÓ ´›I¦›Vƒ0¾Çß´Ó &I ÂbMÿKa4Å!CB#÷Û\D0šÁ}öXˆÿØ…ÄDCCÿÿÿÿü›™dx‰*Æ\¤ØùèŸ3@C0s‘!‚œŠ4?è¸v·É¼ÑûÐA¹Î殳Ö÷÷¤Þßÿýzÿ¿¾¼ÕÿUçwÿàˆüïÿÿ}i}ÒûöÿßuïûüT‚gùÍÿï_íû7Ѫ½<ÕoÿýÿÖ¶×ûîC_÷þÿöûOtŸíÿßÿÿûö6Òÿ�÷þúÿ¿ÿý†—ß]ïýخٻòŸþ[ï_†¹�a¿ùl +Œì\!Ø€²Ì+ì¸C±`‡b�Š4ÈZ²iɱ“‘>h2|œR|£;À‡f ÈZ†M4 +VM; ¼2gÍí9æü< í„ïA�¥ ™òø5›ß7µžošož�v¶¹¹ÌœØônz/ƒ¾i´ç£Zo¦×mv×mwZp–Ø]é&é+ÐMû¶»k¸]°´ávÂÓ‚öl.ëÛÒ}'÷¿l/…Û ºí®ëߺü§öÿ}&ÓývýïµðýƒîK>ÊW¸¿¿oIüzæ¶Jï)_d¯ò•îßÿÿßÿŽÚ«÷ûïÿ¿ÿÿïÿÿÿ¿·ÿÿÿýÿÿÿþò)ÖÁõ÷î¿ÿÿýþHü†ò@ò �‘'ý¿ÿ$~Hü� ù ?© ò€òp†/´ÿÊÿƒýýJÿÿ_òp_õÿ'ÿQ�ñõüõsSÿ¿ÙCÿ"€¿Xú�øþ?×ãõøý{ß½_ñYA=~>—ÐúýzýòG·õßÓøö¿_úþCµêCú:õ!‚~½sŸºíúýÁ>ˆ`þ§@ÿD0O£ '¤…ý~©ú_×oÿ¿cèèºþ¿¤¾¾«==¤>£ÚCéÒô»Km-Õf§ÒH}!ì$=¤#éq\WúÛKoÛKô„^+Šãâ¶+Šáu׎Aü5Øa-’u¼W]p¸]SE˜&ÂØ…±NÅ>Õx¶ qÂÂÁÚPn"?ù6Y" ŒÈÀÏ>MŽffš0š‚/xöYÍQ¦óŸ:pƒ|'ªŸ¾•êßïÿ~«ûú¤×cÿ÷Çÿúõ·ú^¯àùäùÖ9¹˜ðȺc�ýàÃÿ4óëg~u|õšoM«‹á¿§ûßÿ¿ó{ÿÿm{ÿÿþëÿýµïÿ÷m…Û r›üƒÌ„‡±_ÿØB,!ˆˆÿÿÿÿÿ-q®Y¶DÞ±!2¿ ¯Ë*¤a>a96Ôe�Ž …3ÉØ.4_°š ´á5¾ži6�Ó£p~OMïÉäÐM¦•§I¿ª~ª÷éúO¯¿ê“i¯zoÿý?öÖ¯ÿÿÓõú¿ÿÿÿëïÿÿÿéÿµÿÿÿëÅÿt×ÿ¯û__ûóU¿÷o}ÿ×îÚUi5×ÿúµi´š½kÿ´ÚM6¬-­ÿûM¤Óƒ +ßÿu°˜ a†ÚM¥í®!„,-„›KÛ a™¬TÅE{Œ0ƒNì!ˆˆ�ùm–l_ˆ®²Ê§¦çeíø×ª¶®¼-ukÕ^´x¬²©õ�ò#)®:Ipú„—›½%­«éÒÅøH6½ð“Ú@¸¿¤Wÿzéy]]õõkÝuoÛ äqÅlWÚÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿü´ÇfI)f…W�\)¥r^þ‚ ´uÐMïð“¥xÒ½ê—Úò#1ÚY ¤6iÌãæP2�� �flÒ>dì¾b¤kdtôlaVÓ ¢¡„h`�c¥L&‚bªCþ“hãëTx„�&ÂNª’ò)Ç- h‰‘³:ŠNŠ|øsÈÖ!Ô0f)bdŒØ.`9ü‘›Á°¡T'&Õ èd(èˆhðSP9°ä1IâjˆÌäQ‚!üè=‹4ͼ-§ Â ?«úD­íóUFçMtdúÚß ¨@ûïä"s{Ýf¯?²2Fö˜Eûòzi¿'§§Ò®›£[»æWæ÷6¦›¿wß|ó~QÓ{ué^“hØé¿öýööÒõzA´kÿMÕ: ½Q±ÿ¿ÿëêúMӤ߿ÿýÿ]&÷¾¿ý¿½/¿÷ÛK÷ªÕ´žÿÿßt¿i6ŒÿýÿI¿§àˆÿÿþõøêÝ}ÿÿÚí×ßi'ïÿÿ§‚#È«ÿÿíu»¯ëõÿÿ�ïc�~¿ý-ýcû~¿ë±^ß¿«ÿ¥þ»W°{×ïõõõKßÿÿjÁÿkÿæÇµ ù ŠÍaÖß¿òšTþ–ïŠþ*¹ÈdRÿë⿯ðò-5ò§Šãþõ ï×õòðaÿkÿÁ5tç®T80zÿõ/O|›”8_ÍU9«•öFÿþj¿éûpoï™G™@SMÚý8¿·Áÿ\ï÷ü5ëï_ú4?x7Çÿ]?½ýûÿþ·íö£·ÿÿÿä=ïd�}ÿÿÝwûÿý&ü‡ÿýZþ½i7÷ɱ ¿šoÿ÷m/ÿÛÿþ¯_¦ÒW_ïÿÛ÷]ÿ÷Y#ý�µý_í/È}Z¶«¶½é}Úú¿þÿöÒØýÿô›öûm-[Jëî¿I»ÛKjÚ[¯ûi~Ú^ûiò²[% +LSìWõÈbÈ& +¶•¤—y±Xil0K®^ûúO¶ÅS˜ Âiè5µ«ÓL+òÆÅ±[ìWû éé±ÂaÄ-A Ý„Tû†ˆ‹DC¶JCrÃü›ˆqÝÅ>x)Oä¨Ìù6«µ%©>áú¥é÷ÏGz5¶õz÷÷zO×P’G¿«ëéûhðÿºV ôÜÎÿ»ÇÿGÝwýÿ¯ÎúúöÿÛÕ¿Úú¾ÿï‚]/¯ï¿ûÈŒÂÿ¿�Á?Ûÿ|† ÿµýSÿûÅ¿ïXñíúíïÿÿßýûÿ¯£Q÷õÅ‘_þß�Á?ØõÚ!‚]{â¾ëßKy÷^ÿ�+kÚ^#j¿ýã݈Uúúß„Ö×ò¹ŽØ¥ûuÖÚWÿÿÿÿü› g²B=›É$HdZ'·iÞJ½å+÷äðN××ßÒ7?½ÿýá}ÿMÚÎ?üîÿþqûyJÿÿ\_¿ûŠ[uïÿÿÿöÿíþ—¯¿ýÿ)Á]×ÞHÿéoå�ù@È/?ÛüB ×ûÇÿþ‚î±ßíþ–ÿÃ#ÿØü§K�ØÉÿßúÿyPbž¿Åv½Ä¿È%ÿÿõô×´÷)šãÿ–Q› '9�ÃŒ™‘ö¤¨xç\'¨O4ÜÕHÉ>|wÏÏW]j“~¿çx*útý¿µ¿{ÿÿù®�£¾¾ÿI>=~+ûþõÛÿò Û¯JõÒýú¾jJºÉ�/ÍWïÂ]þ—ë¨ñ-ׂëúè/­ÿæ›ÒïÒÿõéoä€Dº_«æ zãúëÿ{"Ev±]Õß^#!óòÙ)Š�|!éWï¯Âþ¾[ž‘�ÿäØ\B€sÈ� “äÐÌÙ"%FgÄË õtÉAøNõÍÁÍTŒ´Ñ¡ê�aÿ õé£cH7zOzöÿéºôé»×·ú3µÕïùߣ¿ÿý=pD~qÿß_ÿ¯Ç­,}½~ÿ«b«ß¥ú_ïþ’·ÿoÿÈ'z¯¥¥¾HKÿÒÚG@D¿Â]ù ÿ= *oÉÁp‚ß…þ4…/KÐ]åV#‰×ôÐAþ)mñÿù§ B»ôÆH ùõú\" -�]ìauÿmuë¯i_uãï¢ —ñR„uäT‚Zûÿ_TÿµLð„F@`Xoÿÿÿÿÿÿ–ÈÙÓ£C–rœ·YMôÒz£c®�ú¥c×u–rœp—Uôꄯ¤ü ¾EºÇôµð›K¥ì5ä§ÿËdhå¨(Â0œ³ŠŠƒNM†Ñð†y! Ó¹6>zMÞš§ï›ß“ɦ¿ªÓ¿ß·õÿ»ÿÕoÎúÿïÿÿÿßÿþ¿~—ûÿnâ¿é¯¿_µ¿ïš¯í5÷ëöša}¿ý¦šýþ»A¡û~Ðý÷¬ö¿ßa„¿ûÄDCcÿÿÿÿÿ–G«r“cç¢|œS@C0s‘86Éøÿ„áöµäïÞ‹ç53×çNú÷Ótßk§¿ô›ÿÿýõÿüîÿ£;Ô‚#È÷þÿ]{×÷ÿnýo×½ÿïö”‚w®Aòßþþ?¿ûÿ·üÕ]yª¿ÿùÎëºë¿û~C÷÷ÿû÷ÿëûøõÿÿãþí×ûûÿw_ÿ÷þðÒîö¹Ïÿb¾Cûßû†õ´ É6Ë ÿ-›ì@Rfå©1Ë„&l‰… �µa,ÂÁÅB¦BôÐvMÞÖy†�nMÔó±1ËC ÊPá“>n›ÃNy†�0×tžMŽœÐR|ÌSL†A÷a“NÈ/?´æ›è6´Ú?w]ÂíÕïO<'|Þùèü6�Ž›]µÝol.Úï¾odæàùæôi‡ôÚí®ôû‚ø]º}ÿ%ŸcéºIô½'¿l.à½÷ß¿ïùK÷ý{é7ïÓwî½ûÿ”¯²Yî?û¥ÛéÿÕÿ°}ÉgØûûþ¿ÿà¿Ô{®w¿û¥ÿþ +ÿÿßÿ_oßÿÒÿÿ_$~Hü�þ¶¿ÿÿáò@'ä€@wÿÿÈ .ßäû#F½¿ÿ*?É—ä€Oÿò€Ãz‘@_ñõßÿ†ýÿ$~HõÉÁr�ò€Ç¨þ;}Jryÿèͯýÿ“‚ÿ�ã·ãÿø¿ˆ�¯ä“ÿ^j»÷_ÿÇÔ~½}~Ž€ž‘Ðÿ÷·ëߨÿõÿ© è†LkÑÐ×õ^¾HÿoëÒ:…õ!‡&?H† õú_Z¿¤=¥uýüÞý¥±êt êúíz•‡(ê=¨ÚÙ²+ŠcõÚö»~ý~�úBÝXQ+Šb¢]Km-ýÒýG´¸Øâ¸\&4"";[mxipÒÞ+�„Ô'Tƒø­ŠÃð¨!Âà +ƒ ' Œ€À°ßÿ&Ä''Ÿ4ø`Ø9àðƒTôi¹“—ÏŸÙE5F§MÒMé7U·ß„ú¿ÿ}_ÿßý�ÿ]vÿ_W]÷Ö×6^ÈêÈ>Bâ¢óAáƒø¯]àÃæ©æ£ž©×ÍO©©×ß·ôßoýÿÿºç?ÿýÿýÿÛ^ÒÿýÚíýÿä1Á…Øa.Aòýðȗد®ø°„C"#ÿÿÿÿËdhrÖ˜ÎÊD3±§-%±B Ñ; pƒ;04/Ú6–r‚;Œ&‹›I´ å”�PƒMA¤Ý6­ðši¤Úi:OM§A¦šM§M¤Ú_ÓO}/÷NMµŸ(Í‚æÂ™å°]?K]éëá?Ð~é§íß}ÿFðü£g›ò{Ó¯¯ÿ¤ßûûÿÿÿ}'_ßÿÿ¾êê´ßÿÿÿþº½wÿÿûëKÛý?úÿíi;{ii5ÿÿÿÛêÒµmZÿö—í4Õ¤í«iZMø¯ö©µi´›I† 0¿ý~Õ4ÚL& $Å!ÿž¿´ 1A¦!kÿÿ°ša0„4 í_Á¡Â¿ÿøŽÒ×õí­ûÚû¦Òöë†)Šö+°˜]0†""?Ëoékª‚�AËPh!ØÑé£[–i;+Ò3°©W,«HìÓY¶*lt¯OTѱ­Sõ«uÖ~�¥õÖ�]ÿ…W­õ¥å>¬t´DØ7¤ÅZÅ÷_µ¿ÅRK—m‹Jkp×ÐUé¹¹é;#õºÅ÷ªlk¤—Õªãð“k­'‹þ½.‚ßþÔìÆ½#±/;(ŽÀ¾ën®º V­[T› +ÇÕ´¶Òb¶)…éµâšÂ›&)Ã0†ña„"1„1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüµùf¥³yJÏG¢ì%f¹Šb‚“Ð�ˆ6Á¬$íõ^Ýf—T©ýTivµð«t¨„ÐéÌ$ˆÞt-fÍý0ˆ§3†PLÌÍ aÈÚP•'­gš<4›FÅJ#½&ª¨ðî–žƒ¤éjÇHãÒu…­&ÿí]&‚^–‚ÒéëA/_ìTPUC­$«}GZªí%U¡Òªéªÿ^±K¯ý´•*Ð_]~ª’oKTºÖ•$–«·ëúº_õëm$ª©*m/KÕi_„Põ_MÖ’Õw饂R_T“úTc£jŒ%£i~•:ôrìÿ ´´•|%é-¥¥téZZJ–’HU÷J�%K¦ÂQ§+¦öI†•„˜iEBêT>ÈÓ¦*a†M +„0�°ÒDS´¸0ø¤4“ÛKÞØA.öÒ¯°Â·Qm(L0iQR˜¨�ÿÿÿÿÿÿÿÿÿÿ–hª‚dÜŸîóºâK�Ô3°³„íÄ3Á £'ɘ1Ë8¦@ˆá‚�r?0é²ygPD}ƒ< éÔ$õTÕZÐAÿÿ�¨kúIÕI}o_}BZ�� +BµQ’m|ŽJH2‚ÒIVG,ˆ#£/摤x‰ÇšŒÌÉŸgŒù)Ç‚=´qß q�ôPI$§ŒÑ‚@Ý‚3°F CH*ª5‘Õ3W„lª„wÓt­„_�XAˆñæ¡0ƒöõÂj7i è¡êŠˆI‚¤‘PÒJ‘OñA{ªZ½#=BQKK«iª‘âÇöÚZ ÂXGzO^«¢ž–––½zZcÒza;ÕðŽ=ᆪ‚m.�´….’¤ª¯‘ŧ K­/é%ú˜õëÒé¥Òa¥¯Zö©RŽ4—ZÌèbª©%I%Õ{©cU�$”1Uߤ±¯t•it«èv’\o¯¤›Ñÿ]}$¾éRU¥oJ–¢—ÿT“ªÖ•ß×ükI/º×m*]P^ªú_ªë—;¯Z¤–�Aé{ê¿×T>´½W ŸB¯Z®‚ý~’}-$µt½*é-kÿ¯U‚ý%Kÿ^—a%¿KÖ–›é: /Çîµéúúê ©?qúTmRæô»K¡ézYÑuÒþ§T´¦ŽQ¤æÖ–_KTº¥³4oý �XJ½÷T–Œ}5ÌÒ„³ L,ÂZ[èÄ•®‚ —ZªªZÝu/¨¤–myŸ¤ßÒ¤’]k¤©iixJÕT%ú­RÃÐQM¥}~ô”$–•Ö’H---&ÒŠ‡QPzÅ0â­kÒ…"M ¼6ô¢¶ÂN“k›û´­(¦ª¡p¡„:áuÂPE4Åzƒ‡ +˜¦Ò 0•I!) 1 „ª¡¤U†üîXš ˜ˆÂtƒª¨LPdu‚¨HA�‚H6"#CE{a#àe}aÛXˆ„j�~�zWª·¾½Öëß½'n‚l5n;1 †v#`ÒÐÁ’!ˆÿÿÿÿÿÿÿÿÿÿùMŸ;zXÑ‚¬¶ŒEp$¿-c,Še/TýB™ê»ï,ÜŽÉÆJýoz–UœÈDº{þ[ŠÂ…¯ßßþd’*±nXðþ׎w^IúùQ¢R5ŒÔÌÄ�˜fàªUoüÈ„?Úæ^Žðe#:˜D'L †&``аf™ƒÙ8Ï<3I4lr.ö¯þ¿ªyÈÖD˜É53 ÆqAGʶk36�lÑh0EÀf?L#sÓMÓM'’àš 6†‚oáßÇýL£É=Iqš#‡” ò8�"ù/äBVBt `‹¶­„lfŽØ§ÜÐi½¤á4E†“,áži=ŸiZ†’ÝétIëý†ûGj2ÿ;ÑgTˆ…ȉÉ" «#„³L#å0žíÉx �7É�Ñá ›A: ††a$à +îêê�]0ºêý/t�ï­¡Tã¶Dÿ\Ë‘É5�"ƒ9›Ž"ð",ääGÔÏF¶Q Ñí„Ó–©6Òwi.ZˆØºV¢¼œzK¦½GI×éÕ:zÜ~¾>ßë™AdÈ�¥Û.Ì#<‡£CF€óæ¬6*(#àz76Yl"-ÒtÏ4´µ^7¯ë»í÷jž6º¸þáú}ô?K×oHwD:7_!¢ ¸¤ ˆI•„Ëœä'‘AžÆ8œÍaáº\4¿ûï«ÿü/íÿï¿®ß÷ÿé/ÿÿý÷Ãa÷þ—Úÿûí�ßÿ¥ûïïúí/þä ;{ýç?ûÿû^ÓÚÛì÷ýÿÿý´¿ÿÿÁ°�ßßß×ßtÝÿ÷¯_ÿóËë××þÖ¿lÑ×샃}°Î_"¸{\6ÐaŠÿýÿ¶—ÿêî—ú)ßì7Øwôû{¾ßÚþ¾Þ߯¥¯ÝÝûgæÒažïa…ØeÅ´—M‡š±I à´dp¶�¥a¿ÿ¿â ÿýuúÒ{ß¿}Öûn¯ïzõOïµÛ­{ã·Áweü�'±V¬Rm1 Ã6ØiZií-† +xh«´ J¶Ge¿è§þýÔã;kÿ_º^º¶ý»ï}Ó{mííš#Þam¥­„aÞ­‚)ì0©ÚV‚ØmÔBvšl+AbSݨLÕ)YG;-Ü7ý'½¿Uï¯þüÓõëJïo²uÓ{kfjÞÏîÃ9l0•Æ›i'lBtÓcÙ=;#½ ƒ¯iÚh‘”!�ßZ·ÿþÝ.Û÷ö—ÿÞºM¶~Û=l0KØg-á °ÅSжlBÓ­ +Ãà !§ÁŠ¢æ"96Q}t­¾¿lÑn²{m¥÷¤ßfÕÔŠ;´´ö+bšb“v(+a&!]°°Â†N hÉU�uºÒvÌýO;]°½Ó¬3si1l‹Ô¤ îEÆ”è$ÕÂØ! )á¤FŒèƒˆŒDqq륭°Á.¸;V+ „h6)²92WjÈ䦊"ñ +U°�eYñ“±ÄDjµ´¶L ÐlBÕÚ[aaŠ•<ñ Ä&„0©!„f’¢×I´±Õ„\ecÂsµ¬;-„}d+yËÚ‹i~©%‚@Ái*Zÿ¥Ç —¯ Bƒ®¯ðº+Øô’´­:¡ BÈÇ Sâ‚3²J™6CG¶1Êlñ +rÛRÕe±èìœw)ÙV¼H؇Ys²ì�Nä”ffpgÕ3~÷$¨�ˆb…wá0¤ÿ-!‹ö·ä~Ne\èò)áëw“r¸®%™Iîÿ••»Cçf?Þ·xRe]Ûþ=ï^ºyM¯Œé¥ßÕgcÿëº^w2LèE9ÅѦCKáT…·ñÿ*Ñ\äj&ëÈ`d„m„k “5†¬EÛ×M›uÿß+â2OéšÖyˆ�ù�?Ï™¡ÃD&A¬=M0šMÉ�I†“p˜{-žh+m/»årk2«ML‹Oˆ†< f¶f4D 3¢0òâ‚C ‘0f‘†Cå?èy1ò,4›m/3†I†â“i:·½Zðüúù\žº©­èf£ +IŒˆ0�‚a„k�aèÖ¤#C´~ *r1ÃV ÓMáx$­¡‚m&Ý/„Þ né6–“þê›úòµ_&l�"GÍFIæÈ#@hð„™H>Q5´ƒi6“z ´4žY †ƒ#œ6“­ZWþ’¾´¸¯vÜR¿ÔVþ¸§ãë© “Î3¨ÈYg Ó„Hx"�l ‘™Á„ †ih4 †N}ÉÄ&mÝ'+IÒ½+Dâ–êé=6“¯A¤¿ÒÈá}ãßVõn©ÿÑnP³þ™YÜÔS«3ÔGˆèŒdùÂD'˜pˆò!:0�l�æpM0ƒdüŸSG¤Ú¢-¹4&Âô|éµuqI& µö’ÒõñKÒ¶‡~ëqýô—ý÷¯­{ÿÅù»ÌžˆC2Ã+ pgâc3ÓØø&��Ÿa0L þÂz]ôhiÕÛ†pÝÙcQ鵂Ý+ßuoþºÒ#…ÔŽÿÛ~ÒÇÒÿ cü²—ûÿÿþŸ¿M“™AÂ`žú¢;i6†“h‹[ ­3ÆË=Ù�Ý+ á7»í­ûuøÓi:þ“ník\ÈÏ_ßoÿõKúÿÿÿ_ÿGwãÑXòcI†™çµAPM¥¢N’à˜M­Ó¾>ÚÛíïþêÞש+ÿpß|}R!þ¿×ÿøÿÕ¿ÿÿÿÿKþ-îÒ·Mÿµ«TTÞµWÿ®=®¯ún·ÿ‘�m®Ãý_Ö¿õ÷ÿ÷ÿ¾ÿ¨ÿÿÿÿMÿwô·öé÷¡q�~=ø¢Ç"�ÿý_ý!ÿxÿ¯ÿ‚8þÿüýÿó;¿í/úïï¶ëþÒoýÿ·¿¯êè±ÈÏÝŸðÿÇêÿÿÿÿü7ÿø#ÿð‚ÿô¿ÿoÿVÿUëë×ý×òußõÿoßüÿ‡ÿþÿïÿÿþÿ„ ï¾ô¿_Þ’ûÿwý´›þ�×umëþÒo×ÿïÿ_Òÿÿ†ÿÿÿÿ÷ÿáÿÿ_¿ô¿ÿ¿ÿý»ÿKÿís5~ÙŸßiwÿÿ×ÿÿÿ ÿýÿÿÿ÷ÿ‡ÿ_K½öõ÷¯§UûóOí¿Û¦ýÒVÖÛJϧ­˜ïa‚Kzkÿÿöëÿÿÿÿÿÿ¯ÿÿN¯ûªíßúö¾•Ö»ûvý³ÒÚ}¥o +EúA�†�Ob‚i±&šhÿÿÒ¿ÿü?ÿúÿÓkþþ·_ý¶Û{võÚN–ûvy¦¶›m…a‘ý6('pÂÂI†I Åa+xSÝ0¥] ³ÿúÿÿÿ¿ßûÿ¯ÿ¯ûúu9ÿºþ­™«lõ¶zì‡y�´“´›J¦Ç¡¯lB´í„š‚Ü"8цA„D¥ˆs%¿ÿÿ¿÷ßÿÿíÿ®¾“¯ûfŠínºûm%¸a†Ã +Ã.ؤؤâ±M¤š;´›J�6JÓR¹#ÃUÁ„ ˆˆæJ×_Û¯ÿßÛüÓÿÿé¾í&ëû.›ô¥i+"å¸V®ìPb˜I†Ö B:„„M„Këýï²uû}_¶~ÿJÈîò=¤Ú 4Õ�ˆH;H0ÒaÕ¶*iÕ £²k­öݪíì0KÕ½>ÖEƬBM4í&!lU‘ô› wm!4ÓT„ ÄÚÄ"#¥´!±¶’knª˜aà +ÓÚ»¦Å¢•Ån¢àˆÐ�ŽS†‚ØLBG·>ºŸR‘RôC�ñ œº""? â¿…×ãûº_p¶a8PM£©M¡v†?�—’ŠSXŠª%Ù’ƒYm Gj0˜LŸ_á#°¤ùØ›Õ7wykGjxA5ß¿ÿ-$Zjÿ»»ÿ ô/Cãÿ&ã"¹&is±ÿüè¹�~Bâ®O̵_þJÑÙH/' ¬…AI/Ýù\K×É„™H2 )AyqIÛ>Èì� aÁ„{ÑøÔ ®ŸÓFJkôÍH‹d}2$D[#¢?�‘¸Ó04B5³Dú°ãRz-š ÂJ4m'ð“h'ÿÕæ5Êõé�Qhê‹ùd1‘„C‘ÑDJR<! Ô! žÃ!`òy'PƒÐNWA0ð³{ IZ´ÕBuÿÖîífC5\«ÈŒíO6F¶f""PdxèàÁ&Fà`Â6Q Â+¦pH^Á"á[“¸IõAZgÛ2¶ê–¿áº—OëI~škó½W»2>GÈÞ_$"P޲ê"tÀÊ& Ÿ‚dòhØ£ðh&Òaé:M Î5mRvdi&ÚKýVÿQÒuO~Ükqn”kô*¾¿�QDÂ/xR®•¿o}¤ýk¿¿ÃëEŽF%~ÿn•þr Ñ®DNœ3¡Tp�.̓ØzÁ„F¶i‚j¾��ú~Ÿa Ú„xrhM„4Â<Õ'I¤Ié6¾•ÉÝöÒiºŸKǾ‡o{¾ñëñýƒ×Ç÷ÿ_ÿä„pfó… d…f˜@ü&°ÅÍ6A6Ò´-ÚA°ˆ°ÙjÒm&Â¥¥M¦i+“�V¸¯M%¤ÿ¸õ× Ýß¿mUõ_áð|5ý}/Éoÿý¬ÿȶ(=„{a[MÜ™Áœi6)ö‚tIé6‰`zWÞºV“Zc­µÿ�;½îãz‘Âÿ¾ÿn¾½UõþÃØ{¾¿ÿ¨aÿÿ¹Õ{k„{ÿöP±n­6Ú„ÚWí«Ó¯M6©»º_«þ“núOï¢Ç?ÁŠþþýkÿ¿°ößá?ÿü7ÿÿ„¿¬%ÿ÷ÿ[¯õ]ô…Æ-ß�ÿR8Z·ÿÑ�ü?ñ^‡ÿÿÿßýkðÞÁ¿Á'ÿüCÿÿëì;Kû¿·[©+¿O‘¾ë¥^‹Œ÷Uä-;¯ü±Ÿö½.¿ëÿÿÿÿø>†ÿKþÿ~ûþ´¿}~ÞµòCÿõ’ ÿ–ŸøÿZ.¿ßïÿØo^ÃÿüÑ‘ßÿýÿ÷··¾º oß÷ßÿ_þ×öï÷úB/ÿCýuÿÿõ†ÿÿÿÁ¶×Òÿ@Ÿÿÿ[ºß_}÷^þÿûÛþ½wo_lüßoKÿÿÿÿÿý¿ÿÿðí »A}ÿ¥ÿ[¯ïý½{ï“§ºõoì„ýµlÍ}¤·ôÙêD?a„™?§ÿÿÿÿÿÿ÷ƒÿÿíãá/ÿ×ý{­º·]í|çç:µ§KÓ¿³ÿ÷[và +«¥pØvìS ÓMˆL/£½/ÿÿÿ¿ÿï¿ÿ÷ÿº]ë·þ«ýn»«w]½~—k¶­ªØFÃ9&›š²1Œ$›�h4¸‰ÓA: (A©VÑëtÿÿÿýÿÿþ÷¾ëÿÿœÝ/_ÿÿõî®Ò³éÒØg¶ÒÓn“zd[Óh$Bl1I¦IÝ1 d¬ Â×(…¤W2$”Ë@ß[¯¿þÿûþÿ¾ÿî¿oÿé=¿Û4]ÿ÷h$Ý)°˜0¬4°ÆÚI­¤°ê TuÓ† +V2|ÐRÀ!Ge}Їÿþÿßþßïíç?uý¿ýµd힬"‡ ²é†Ë×Ü4ÖÒL0ÂL Ã# �1LPA†1Õ¢ˆ#¡A“&1rn]iý¿þÿooÿûÛ3Mým׿g+O´úob¬^6! Ø„M°éÜR40Ä&ƒ—Á„kE Â¿íýûf‹ööÏ÷ì3Þ¶caì0¬3wi&ÚI¦ÆÅ&©¦°Ò´ ¦š $xµ*؈ÏqšÁ`ºí_kæ=[½XfíŠTÕŠ[ƒd ö)ŠM† &Ù“M„HîÑDr­Ê¼˜3�“¢ÜNú¦Èi±IÛši±H6ka«¶ƒ ÂøÃ+b ŠtPŒ’n8-ªµ %N… $}> + Â:£!¤W-Ÿ©TB ¦�MmDt±ÚIÛI;"Ž+œB�Äòš Khk;­…4‰¥-gGuÅV +¦—|›¬Å # )/…;Y}o\$M»; +iz¿íBWaI|/Óï¾ÖL±¤NÉS4¾ó$‘äy�æ#y±_wk;³!‹)nÓ,�Ê¿»"ø¦)ˆ{^?®R"èèˆéI1‘H“ B€†� #ôGÌS*›v—ÖïXi„Ó/øßçv²LÊyHÃ!æËá‚ÃDJƒØehùöÂ74lsóA:oÃ.}'Ýó°kúßü‰„Aµ("Á‘ì#Yèxˆ@g°Ó5 äòÃA7… Ð3m&ÕÒ´œ$Ú½WßKkÊ’*K_m/7”sÎ2�y²&3$#f +Ëò_3¡ 3ä$,<£+DpäÇ«„E†Þè-™mߥ¤éŠ�÷ÇÓOO"¨«YC5•¥þ2(Ù,‚ £Ø ¦škÛ´¨'A6“h'Â¤Ú ÜRàƒp›õ×Õn´Çö’Nï‘‹ýW>ŠtGDFy"' 8LºB¾¬7¯Í(f +GÉ©°©<3Ì)ãA‘Í ßAR×QWõé¿ÝÚoÒ÷IÝúÔV*ï®—äHh„ ¹‘ЉBÇ2 æª`PAlÞ3çá2Œ#ô$ú ‘òm´¿XA°ÖÔ©<-ÛA:ÛúºÝ¤ÿÿ^Û¾ë^ý¿ t©æ 8}MyRÈÙäh�2„S³10?8Fl#[ÏI„{za{Fv%É…&vŠÆªÚW¤ÒL7ÿ]½ÒÛ×Þ›qI¾�xüwJ¼ïèWöø°Ør]̾t"Ç¢$ÈDäK?‚ Ô<óXyO„k"Á?'3;FÇQ §¼;i<™Þ¯- µ|] Û^Ö-…Å/ZIá�ž÷§oëzwmzÑc‘Ð5ùiÿíïê¿ÿ uØa‡5™$#†vO‹™9žÃÕž ›NÒoTšwCIµ69~×ß§ui-ÿ¾÷ÿ~Ûãßoºé×ûÕÿüX:úý_ÿ×ÿÁ°_Ãaº?… ›A· {- ¹çIµi& +”-Ñ(¥èîé¿ý1¦…}Sý-¶Òéûký-ÿý½¯ßöë_oÿò/ÿà‹ÿá´xþ7 6'IZ[¾û¥b’û¤ñº¿´*� {ÿ÷íztêßÿ¼1_öþ_û®õÿÿ_ðÃÿýÿÿ _ÿ¶_xmûtë¯é·Qn=ÿ~ñ«~ÿ÷¸ü·8aýmé°ª÷ÿ¿ÿÿ½‡þÿKÿý/ÿÃ¥ÛÛ½-Æ.¿¯×T´ž__ÿE¹*ï·ÿ°ÿñaþúý¯þ\TPïÇýµÿÿûKü7þ—×_au÷_·s ûz éÒ–ŸÞÿÿ�ÿ°ýzaÿ·(z_á°F¶—Ò†ÿÿí/ïÿûûíûÿ×U×Û¯î¼òõm»:uÕ~]Kõþ×ÿKÿÿØ~ á¿ý&ÿðl O†Ð^)þØÇûÿ[jÞþ÷÷þ½uþ·ºÿ]¶Ûf}­¥§ëÿÿ¯üvëÿÿÿü#ß°ßûk¥þ/ƒz¦ÿõ†×÷úý}í�Vß·ÿºëì;OÛ¥í)vÃ9YɆ uÿüžÿÒÿ÷Kÿÿÿé~ízb¿Û_FÕª·ÿÓ×íÿ[«í«fjé¿lÿíØNÒ´½³nE².6ÂI§|±AŠb +-ýÿ Ÿý/ÿbûÿïé}¿½0ëÿUÒ}/Í?µßÿô¶ê¶í°ºMœ´ØÓNE·h+A&˜b¡<$ÛPái±[ƒ 0�“@¯ýþÿÿºùœ'ûë¯ýýþ×nÿ9×éÝS~—ôg5®¬3ßv’m¥Ûi1IÛ +öqQHöÑí† „ÐjVCD0FDúÿú_Ý%~¾Cûºÿ÷œûõÛ:½=ÿìƒý ·§i{Iªa�4ᤛaÒ²8 „ņ‰¶\ÖÍÁ^»ÿ×õKßõþî´¿ÿû»lÿÖ­¥OÚ­ÕÃM¶ÒA¦šM9NÂW_x`‰$|r­ˆb £%p�Ý-»õþÝR3Û>·HýòöC´Û9=h$Õ9;´¢“‚v›¤Ó ¤Ó´O£ÄŸbA¢}ì1®'ëívÏííÝ„qü¼ÚJ“¶–šm°cÛ˜0”y$í6 +˜0‚jx»´ Ɉ0Œ€“�ýêØ¦dA펬Bm‘Åi6Èé-4íÚL0ƒ!ˆR±�hD·%ž¿† “`Ÿ‚jš•ƒ†0B B;!–EJ’õ†!ŽWRý!Ðh8ê÷¦¿é´b>Ò`˹Xý¤ ˆ�lG† Çqù¨’pP²š'd¼²ÚKŠ÷©Û¿z§ï¼¶ß»írÌ-eº›Ý¬qåœÑ‘eþ?ɺH®Xôš¡ü”"?œrµåZú‹FDždJÊIIFâ`gAI‘¬Ø¦óÈ¿˜¨68S"‰=ü·¢ÊL�GR#HæaŒÖ  U·•x@É#cØFÇ"بí3InGn@ßøê™‘’Rè¾C"&E9�% †ˆ#Xdùr060��šÙ3‚]ÃZi0Òt› &˜Yœ©<ßk;4Ê_êkˆ,iLèGQ�6‹3ç!žÁ‚L0�l#@f�A¥„h'H6†ÓI6&Â¥ ›D½…KJÒ½þô«nûC‘O_5£¾2#3I“]‘\  #À0�a—Â6AÉ„l 0lŸOÈZM ´›Aœ4–­¥a{Õ\�ñÒu·oíZ]·­õã•ÖýUNÓ�'d� lÕ˜‚4à2|4A6THŠì#CIÒcI´Ò îË=æ“j)têëâ¶Ðk×qßÔŽÕ§t:޵­ëä·Ôì¿”5:&4Dóá9™„¨öF �‰ÌØð��GæO&´„­»öÙh6a¶®­%té[ïÓ­ÿN—]äp¸·JG Þ—í¼…¥d…Ÿþ¿\ì£"äE¢ É}*=’N„¦� äBLö 4ff0›'ÔÓ'¸I7¤ô“h29¤êé:~·×¥Ö¾;þïÇuÿ¥Ú ‡ëÈχú,KèºÕiýzlÍdx‰28@‚#²|Ùk §F˜@Éà™¡²}M2‰Š¤ +ð�Õ Òaîg"ØaÝ–2|‡¤¯ÅÒmÒø¯Óz¶îÓúñ´•úû¢ 6;ë�XϤ<=ÿÛ_ÿç\ÁŸIái&™NÂh0‚l&pœ*lÂ"Àn채X Aà‚Môá–tÚ¶ÿß¾ÞÚ]éën5Ým?×þ?¢_ÿ—X?ëØu·^N6ÿúú;´¿þ†›,áž‘‘a¢; óKYXÕÕ'‚ ûÁÕþõí'÷ßö�Þ�û÷Úìÿÿ_–%_ÿé‡ÿ«õõ ?ÿÿn¿ÿèœBõp ž¶®âÚcӻ﻽¤š÷¤Úßí_ýí¤ˆsï[qáÿêÿûuÿÿê"bÿ• �w·^ ÿÿ÷êõýÿkzéÝ뮟ھÿ«Ý(ûþŸ×÷xrÓØ>½Xkù±ÿqúÿÿþ ¢¯÷ Vô¯ ÷ÿÛÛÿî/îÿ»µ¿oûÿ»°h´öWïÿÿ÷öÿÕ†Cÿÿÿ'mÿÿöá/ü%†ý‡ï¿}oo¿íÿÿüWmƒÿÿýþÿþÿþ߆ø# „Ÿúÿý-°—ÿ¿î_ý*ïßÿo^Û·ÿoþ¿ÿÿ°ÿßÿßÃÿÿÿÿ‡ÿƒ„øÿþ—PW¶¿ÿzÿ»yÖßõ¶h­³4zÚ¾Ûÿÿÿÿ·ÿÿ¿~ÿÿÿÿoÃ}ú[ií¯úªBÿ_þç]¯öý23KÝ¿®Óaž­%lläà uªjÈ|kÿÿü¢ü7ÿÿýøoÿÿ_ÿxw¿ÖªëÿõþºÞëýês×Ûïºaœ“¦»µØØ«JØ Å1[Õ­°®ÿÿÿ„ üÿÿ×E;ðû­×¿ÿÖ•ûîºï¯û¯ÿÈ$Ù¢Û¯¿VÏWIÈ£†šm‘Ð,ŠíÕŠ·b�l0’a’´QA0 `ƒfVÿÿþ—ïþ¿þ“ÞýúÿÕþ½;yå÷_�t—ÿn¿[6`’m¤ÈAÜ‹ÞØ¦Òn ûbÌP¹@“ÂG¶Ä#ª Ë€B"/ÿÿý~Ÿÿÿ­[|ò÷§«ýëI¶û­ÿ¡÷VC¿ÙÚWi¦ÙÆÃb“m& a&žLŒðÐ4O“äŒDA„Wûÿÿªêqõ¯®“wÝv­«ý¤ßv’­¶rô“m$á‹ ´›Ó ¦Ó«Hôƒ +V0Ä#´¬›—ÿÿÿõúM÷ii[gï«t›AC»#Ú + Çr.´“M6+†’mÂM¦¢·¾ÃGd÷úÿÿúý¥¥¥`Ž;ËÚJ�±]¬mÚL=Š´œv_ jŠæB ˆŒ¬ˆƒ;q´õ¥ÖËúk¦©Ü6•Ò Ó´˜=ˆV‚MS ¬Š!1AˆAÄ0¨Žb#Yd)µÆšqI­§vš»Ù&ENþ!4MRLd„"B"#CŠÕ_žR­Ê¶i“¢|DDa8ƒ"2÷DGô…9’”#þÚA?þÈáÿ û±ýªTÓ„A„+£åce&E„D 0ê”Á*:åѶW k-r„„~ð™ß²~Xä^ç`}rÍK27.œ#íÜ…„KÙ@ä£{gf¼ƒ +¿urºÊ)ëåYºùH!@¦¦o1F3â’ƒ)0�„ ž°8S*4´Ù?»¿ê¾™2"RE¢$È¢|À¡ +Òôk£c4“Štn<Æj‘ØF†�›=&þ�îÿù'éùVdÂ#¬¨¬‘!s"�]�ÊâæZ ‡™ñ¨FÏi¥m¥ôé0ÐÚi+Dâa· ½+ôµ‡È"Ì“÷ªæUW“ŒèFi(FA¢¦º*!eü£ØœS\š7�1ö‚µvY×çÚ +úõ´JÒWý~Þ½Ç)xã§ß‘fIžcDNœ2¡Í„\aØF°r~OèØiŸ>šÌ!7…I´Ãe— Žh+IÝÒºmm†?ªmªâîÓ´ü}ó°¤GÂÑÆuO›G²ùæGyÄHÈlĬÔàš64›v &ÒmÞM6“l´3í&Ò}RéÝ&–×õÓýK„oÏv†íÔoÿÞˆ"Ra×›f²„É�‘¨éÅâxÂ#à‚Ø9 ��„l �ŠA7²s‚mÓPZí ›I°ô“i>í-¨¾ÚÚOëuí +›½ÔŽûéãøáË�e§ÿïËI�ÝfKêG#P¤â„Bd4p²®(Ì„ #X~™ °ÏvN�¶�¼™Ú+)6ÓI{ºM«oÁkj®’¦“Oëß\j;ǿƿò9¾è±_ÃÇn’ÿÿÍCš‘ÃÉÅ!²6)©„h £‚è5†�|ü��¦Í{h|«h&™Ã8a-'¦Òµv±m+ú}õÒ}éµN.Ò�GüŽÿJ½èû¢ë_¤,>ýòúï_ÿÿZa=hóMÒdxÂ3³G'ð‚p•²ÑH6ƒ8yý&Ñ'âÚ¶ôé:ê=ãÿ·Kÿßüi="Ç$uúRTùf;Ëÿ_öÃÿ¿ßõÿÿãTxI´K‡[V­µiÒ¿Õ+Iõ[¦©´Ÿ§Å.ÐïÝHáu¯ôXé/ý9ËK.ÿúÿÿÿì<7þŠ�†ïmÿÿˆoJé«KªIëÕ¤ŸöÚxÕ·ÖÿZï¿ù7CÿŽßþ4õÿ°ÿÿÿÿüÁ¿ô¯ÁÿïÿþûëûÖ®îÿC^ë¿×íÓÿCÃEÖé«ÿÿþÿþÿÿÿÿðøí[öý†ÿÿ[ûò8VŸ¯¿ýE~›ùÛÿ¿ÕX{þõÿÿÿßÿƒÿÿÿÝÿo·þ—ýý×þ½÷ÖHÇ÷ÿÿ_ý×ÿØ{ö¤;ÿÿþîÿöÿïïÿÝÿöé¿*Õ7»ÿ÷[fúý/þ—ÿ÷ÿÿpÞ ÿôOÿÿþÝ÷ý¿öÿÿ½÷Ù×óN¿Õ¿4×¾¡ŸWÿ¤­„»ÿêÞ¿øGÿøÿÿÿƒxíÒA÷_ý¤÷þæ¤ÿ½ûöþ­ÿÑïöÏÉ_¥tÙ¶žÃ +«i§a$دÿîé?þOÿÿÿÿå=½·ÿ ï_ûÒmÛþÖ¿¶ý¿½³>Õ»lõÓeûíSMŠ +©¡¶�bn¨v¿ H¬a…ÿüÑm ¿û ÿ½z·_Ú[ïû¾¿»ÿí·WmÚÛf{k~Ùù³Ò«g%YVÅ�ƒØ¨iE6–ƒMC +?‘ué0F¬DFd¿ïõñÿô¿n¿µú×÷Ôæí�Sÿzý÷uß¶h›=m†rlõweöJê =ˆLRi±IÃa&Mì ‘Pƒ%E>9W;XÄD~¿úé/ýëúþõêõýÿZÕûfk×Ólþéyy{6ؤÓb˜¦b˜…i:¦A…<9á†ÑÀÔöÄ\›©^·ý-/ýµýºþ׺mníµlüÚG¬Ç¦Ã ¼ŠáìŠö)´�q 4ÃK†aš a&ºßëßú§ÿúû¯™Û×¥tÙ{M†mÈ£»¦*ÖØ¤ö!S ÓiØLŠ{R¡£Û dJ¿[föOd1ÞïažäAÃl¿¶’ié¶’v�l ¢i†!B{Á6¡Ámea4v®-/¤¬0’i¬pÛ´ÓM0ÅAqI°ÐI§¦Å'*1Mr²BЈc,Ѫö’lU­Â|CÓŽØM4Ò=°Ä)ð«*í#ó #Z`Œ€¼'†&T0ÁyB'DXË'%¼Ú¢}1á]oô�ý!ö—m.Øá�n#ò)a-¬¦DÌÊžRï–ÝL.Ÿ¼´û­®ß„~«É"–gÇfG¿â>²n5Ô¿ëÿNd;;ÆvšêJ´ýI±Z!YIþdMd8—ÊqšÌêJP2„p”�NÀ¬Œ~K×§ý%ÿ$d¬ì Žˆ�c$ +D‘±’-A7“à�„lf˜L#d#`i„ã’‹)׆µê2“L…¢;Ê=œÌãÂaHñü#d#aòxÌð�a£c" ši“hZVš44�&Ðg —Oý¾Œ�Q4_çj‘¬‘Ž„AK5‘\Þ_Á‡£cb�$lxGêii[MI´aPgZV‰ûIµÒt®ž¾Bíó"zkùÚ©ŸgAJÄ™!1ÌœºÈÐx°È<ÈG·ì�h&‚¶ Þ–è'I·¥IÖÒ„ÚN•í­ú_Óú×ü‰í÷§•y|‚y*ÅDM•ØA£cPžú�Ó‡¦š“hrjÓËVY ÚVõoÖõ]wô�SwýHá]ãwõ#…Ž—ýÞv¦‚‘�D ¹æÆ­”ä|Â3‡Éù3›Gçh�ØGÆ“ "-¶Yí«»©óDýÓ {K»ï¤ú«zýŠ\_N£î¿Óh±×¯!Ïþ—ùÉNƒo0GAH4pŠ$Ì�3>D™à£3y®Ù�Π½¤{ºL4›—²ÐLV—oŽ/íí«¤ë÷Òï�J>ý:mzEŽF_õ¤?�Ö‹ÿæì¡š‹(ÉqJvH�ƒž< d�(hmé£[4“ £a!çpxDG&^“ËCÐVô¯»¥«o´ê›¿þîî¶t¿»ÕôXähz,rÃÃ_µÇÿþ¿ÿæ¤pÈŒò8ˆìÌ&–< EØF°vxÂ62ˆ+é…Â7Ã6IÔ"-Òp“ ó Ÿ·w\_u·×ým+Úø÷îþ›¦ëñÿÒ«ñÒÇaý6¿F¡_ßÿÿ¦e#áHÝ×G‡„›I¾’a„0Éòaff“2Ü ÚV µ­·ý¿ß÷Rð^«þ=¿}ä�øpþ¯ÿ·ôßì?úÿÿÿ¿ÿøAœ0¡ØI_X†øZOÂI¹(ïïý¾ê›¿º_í?ýÿ¡¶£þ‹°ŸûÇøl?ÿï×õKÿ¯ÿ×ìÿÿ¾ÿÂom$¯û×Iô·¡w­ýí ÷¯oþÿx¨ô¿xÿÿû ¿ßðGíÊ�ÿ¯†þÛÿþû×ÿÿ»î–GK®ßZŽ’Vý¯¿!o{ËrGÿ¯þÿìôÚÿôÿÿá¶ÿÿü$ÿ­¥ý·^ÿÃïýÿïý¿ûnÚK[ãÕ ¿o¯ôZ�ãý­ÿûý/×ÿ×ø6 ÿÿú öëî¾ï}¾÷{}?·ÿwøxÿÿª·ö¿ÿ½ûÿýøoÿÁ?ÿÿþáÿ]^½/á±_Û¾ïÿmþûÚW÷¶h»û{iê±¶¿ÿÿûiÿþÿmB_ý¯ÿøwÿê×Õ}é×~óß{u·f‹ûNõ¤Ã={i°Â§Ã#õ÷ÿÿôwiÿßî‚¿ÿÿ ÿx ¿ïÿ»ÿÿ¯zïÿ{®é³?èþÞÙýöϦÁ/VV=&!&›"b¦ßÿÿÉçå»ýºÿÿÿø…¯ÿ׿û öëý¿Í<Œû[[J×ÖîÚÛJØg'l%ÚI±lU+M6 à +#¤˜Z†˜A…(ç¸5þÿýõ}zº_÷ÿüæ?ý¿íê¿·¯ýš/¾ºïAi=v_†Çv_‘´-Ц);IÙÁ 0 £žB‰z�„v +„}h¨wÿ„»Ý×b¢¿úÖÿVëýÎu~ßýÛf‰ºõÛµË×Ú±éi6’lS‹°ØUÙAXaaðb¨"¼á¯ßÞ¿¾Ýý?ûkÓþ®·ßW¯öjÂ}í‚N’i¦¬RvÄ&Òn™+ÚVl� ­¦ƒMˆ1Dئþ“·¿Z÷¶õÿ÷úVN¿�ÀÆ–ŸiZ¶_Né²þ› v ì„Å6’iö+N™2Z!¢ç@‚,ºÞµoý}[î×v¿ØgªÒa‚^­¼&6Eæ“!Å+iC´ÃšwØ-„£®v +Œ†¡¡¥¥m™ýõûgÕ¶Ú]zi²/ +Xi);M°ØI’¼* 0[SœŒ"¬’0`‰¸%ûI5¶K{Apà �°Ú õ ;„ÁT¨„ U¬Ø„"4E”Ò不lB6å;Pëi Â¾*w•½æ�at„aÞã�¯#áж�Dø0޾!Âeu¸RÿAèìRIk»,ª_m.µLxmÖƒO°Òµås þØA0dtIˆ�Ct A§ÄDh9£ò›ŽÈÎâ”ЬYmŠÄÉ•4~[–3´âMÝÞZ¢ñ•cÿ–ogf5R¥n�æûÿ¿-±Ùx(/ÿ[î/•KäÜ[;" +¿¾ýoÿü· +¤*ýßkʦ8þR²PY ”æÚÉÅ>�瑞“’Χq}¿¿�ß’iN™&‰qI*“ŠOÒÈù¦la&ŒÄi„ãѰ8¨ �Ï©U¯·zÝÿÊRÉ Œ×Ì 2ÉðÍľ�l#c¼£óÓA ¡i: ´E†ËI·a$ßÿ¯híÖJ—þw™ÕâLÔ e³ ÖgIA^4Â"Ì„é„l °“}‚A´›A8I°ƒ8a&Ñ.¥¤Ú'ïÒßÿûŽJV7¯æA™Ng@ä¹)8‡³hàÈ̓†Á!„FÀÏÄp� M¨NLu°Ï4›KI·h*ZW_p›úm'[ßÕ>•>í§C�”zzé�%�Ñ‘PˆA”d@òqB<i„Ѳ²�Ž0Â3•µm'I°ˆ¶ÐM¢-´�&Ñ.´=iZZïêý«ªnê›ÿ¿Ç¬|Ô±];xÖ‹¤Dɳ!�HìY°Èl0yóøÎ óø��¤Ú#¶N“¤ÛT'AZZWÚðV–½7ôÿ¾oO§¡C]mÒ×ý9‹rG×\…‘“!Œè—D ‰¸«ÌüÏ@Á0Ìk„G·A Apƒ}›„Ò· ›]ߤé[ô–¶“­»ª{¯!oÿ©*èG«ª ƒ,r3ùiïòÓÿǬzyH‰dDHˆ0¬&°zHˆÀÑ 2g h„™¬0���ß`ÌÍT*a0“&pη&>­¥ð’méúÚ]i:Z¯ê*\"ñíÆ×Z_ÿ#N¹cu-'¡Ûýÿm~ˆ�6D3#¢'„D3335L&HÏŒá™íèXA6¨Ž&„ÚN“l°kéºIžjÓÂt¶‚¾•«è.›Uk^·uþ6éëZÑ~‹rGÿ-?ÿHW­uÍCÿúÿÿúýápÑøÂ âvX:<¦Þ‰sI†Ý%i=}?«]7ï½}­¤:I¨ù(ÿZè±ÈÑ]R–Ÿxúÿÿÿ·_¯ÿÿÿû¯äÎÄ:M…D»/ß¾!½ºJúm'Òw]-}hwÒÿýz×I[ªÒ’‘¯þ¼[¯ÈÉÿÿÿï_ëÿÿÿþëím­ôÞÞþû¥û·Û‡ô?¯_Ýéÿñú÷𗤾+ëÿ¯çQÿÿÿÿ÷®ñûë¾ÿþáßýWoþÞÒU÷_ß‚\~»ÿÿÿ]n¢ÿýÿëÿÿÿÿïûïõ¿~ÿ÷ÿ\o^ÿï°Çé¿ù«_ÿÿ·_¯ÿûkø#?ÿö×ñÿ¯ÿÿý¾áïoßÿ{ÿ··ÿE¹I?ÿþÚ^ßÿ¯®¿÷~¿“²;ÿù�ú_„¿¾ÿ¯¶ûûûïÿÛýûnöúoß¿öÌÓM™ÿüßý÷÷ÿÿðŽ?ÿÿm%ô÷Þõú ÷þØ}¿ú÷¿ýÿÞÝmæ›kf~“gï´Øg¯m[]†¿ÿÿÿÿÿÿ÷‚ ÿÿÃh/Ð_^ßûÿûßÛ»Û鿵oým¶Õ³óퟘi7m„­&Ai±± Bpi±TÄ$þÿÿÿ÷zÿÿ~—ßÿéëï¶·½ïºÿ{÷ûm«n“f·¶~¿'“ö¹°MŠÓb˜¦6*Òb“L28A«¶¬0ˆ¬Š¿ÿÿÿðoú¿ÿô½ÿÿKô¾þ½¶Þû×Û[Û3Ú¶õgöîÎV“a/aÛªÈúši±LŠé…I†a28) +0#¦PŒ„ÐÿÿÿõÉ +ßׯöï_¿ÿ×ÿÛÛVöïolÏ=áÛvÃØ`–¬&Å1†+IˆI¦Ã¦ ;ª»Gˆa„##±÷þ¿õ¤÷ôëÿ¿ûÿÿ ¿ý¯{Ógå¶ÏNÃ9+ NG±²#Ø„é†!#„ÂË ‚ $VeaG“dïûõÿêÛ{­×ûdêý{VÿÕ�qŒ¿§"»l¾fm¤Å'aЦ)6+a4�²84 ÂDF‰ºG¿ÿÕµ½-+¿¦×û1¶ 6œŠá¶^l'!iªÛqIÜÃb¶‚ .ØX`ˆx`š&ÃwõlÏïÒï´­m³É;IÐ^Šbƒ.!D0´îÖÚEc'Ú hµ‡ +„DqÙ~öE*ö‚`öISL2'¸ ÅÂvÂa2PM4"#Yމ\¥}†šlB»NÈäõTG<2_ #§E¹®ëö‘WžÊ ",†aŽv' +ô¡;$cë]ÊÇÿÁSú¶‚H›•_Û Pÿ йbúe¸ªÃLvw<ìQDGòšI•3”Á–´¡Ù‘6Jél)esX*=ÂOܵÁ`�…Òi&ºè«�Œo¤8ˆË7Qêþê¦Eùex�¡ê-?‘²ÈöU}¯ÎôGe>J½WÈiÎÈŽþ+ŠÞšC–ᢵU×;šÕHxˆÐ¤ˆÙBL£•„¤ºS´ñûJ¾§hüäj“ÌÔSQ _ˆBä' q¬2FL#`xOL&˜G¶hçAè?ÿiESò&ŽF±©xƒd�Q¨#À4B„5³8&¸ÿøzA†=´ƒapÙg¦xÛ]×ä_*ò)äØÕôÈcDN›"ŠGdxŸT C3Â5†QÂ6WðÕ¹1Õž4h�W'öZBéi+‚aõtÛõý®ºhUÊâ‚ʼÙ3c˜2ŒÁÈžk~š68ÃÁ¦á¤e‘AÂ"Û¦Ùhbé;ŽÚÜ-+i÷§Vúm[i½ÝÞ¾9Ù.>¾jD#Ä F3‚¢$È•—Yì‘r>'µCe“òs‚hZM¦²cÐO&r;i6ÍK¦á¸Un +Õßm-é´¯oÿÜiÚ}}ÿ­ù-ýrTYȆ""'"AÁ�“˜‰|¹ 30Ï�nÂ72y4Ðd÷ -Ü"< "^ÐAµv…]¨&Ò½úm_Ò½ñëÿu#…kR8_÷[þ›ïÿúùU”¤" È ¥@ÎD`yÁŸhÐÃ>y"5µ?+fz µÐA‡%Á5O- ´Ôù…XïNí­ïãúÿ¿C¾ïßãýò3þIúÿýÿüñsT¹¶UŒƒE0H�#l×!(‚ #\Ï3”&©ïH'ÞÈùƒ ì´YgnËBmQCÒmÞ”][I­½½}¦éÕ¼{ë�ý×u½áÿûãéÿ¿ëÿÿ¯4ˆL„ žøÂ/&™èÿ„li¦rBäÇžh Ú#¶‚p¨ŽÈ¶Ó<{M+oж´êþ먵Ûßé[C»ºWîïuµÃýæ?õõü?×ô¿ÿÿÿÿÿý§'y*“ �&ÕÒl'J‰pn)$ÃA:ŠÂ`ºoõöñßþD¸¥ïW®í^ÝCý½×øËÿ¯ÿ°ÿ_ÿÿÿÿÿÿDŽόkºZø¤ÕZ^»w}´¿Þÿý +um½o¦ýÞ ‡ÿûûßÿÿÿ þÏÿûÿíÿÿÓõéŽêž®âîßjÛ½»_·ü?îÿòÀÿÝAÿþì?ÿÿ ÿÿÿÿƒ„ þÿÿÿû®¿ÿ¿îúÿt;ï½oÃ÷ÿ´˜¼?ÿ¯ÛUaÿþ悆ÿÿüÿÿïïðßé¿ÿû×úëÿßßþi 5ÿõoØÿ¾ÃÿaÿÿïÊwA¿ÿü7ÿÿíÿÿÿïúÿWíÿö¿·O_ÿÿýƒ_`ÿÛÿö÷¿‹ü7ÿ÷ý®¡¿ÿìCÿþ¾ÿÿz÷ýWÕÿÿÞ¿uÒ¿¿ÿþßí×ÿÿ·ÿûa¿ðoÿÿWIðýÿè¨oýtÿþ¯ÿßÚùοþêý³:ÿVÖ×m+JDͪkÿý‡øaÿÿþ ÿÿ—Ãÿ·þÿÿÝ?×úÛþºÝy:ïµöïzýoôìÚÒaœ¯a„¦È Ý¶‚NÓma&kkÿÁ¿Ãßÿÿ‡ÿÿÃÿ¿ÿßÓ ÷_­&ÎÕ?^ºuï«öÌûïVÏÙ´­¥­Ô‹�†‘A´˜¤Ób“º „Ã`’§†!ÔBa"„Êÿü?á¿úþ½ÿõØoý?ÿûkNOýþºOíúÚM×ÚYŽöU`Á¶*EæÚI¦ÚM*nì$xƒ G¶ +™:¡!ˆŒÛÿýï·ÿ_m|˜Oÿ×’ëýMÿúíïOþév’÷iYzí-&ÒNEDZV›“¾Ô0˜J®xlŒ )FÁ?ÿÝÿ¿ë®¿ÿõÝ•>·]_möÙšív­$Û¤ô­nÒbh+I°’l(0‚„âQ†¬e•EÿüçÚ¶té¿×Û_3ïÿëÖ›ô®µËÖ§r'L6‚kzM°‚N Bi†!4ˆTG Ä¡9gëÿÿ·¶gû¥vé.� –×´V“i6“›˜=„Äm‚(uµ"¨aˆFª¥*BF.„D÷þ“}„®›9Zw ‘rÚ +Ó»Ði¦�¨A»a)+ʆM‚ +§†ÐhA£¬I Å™NZzl‹”Ö0xb˜i1I§"a&Æ7dY•tx“è«pˆèegˆ†q·W}ÓM6¬6E h0LŽ H®Ê¼A ªÁ‡­±¡ü'•ÌedDD#(b8ëú?8ˆˆõ×â=uÓO¥Òa4úX*epä{|u&ÉhDi„CNWFW[B1ù |¦–Ì,¦Gv"åµTwT¨¤÷ËX,fBZ…WHiåª-£Æ÷QVŽÔ,•tÒüïLWYdŽæõò—Uùn¨ÎÖpªi>d‘…¥;5Ô�ätyÃ!Œ"È®©ô¥�ÂÎÔ‹%$t…Á0dŒ Â44Bt&íð¾ïª§å 8„™9¦U‘á!c@dŒ¹" y)™Ú5¼üAµAÐvZí¥²è¯ûK�¥jRüŸÉÅ:™›'ð p�Œ¢M5 ¤C“¤: á„›ež“h3Í_‚Õûçeˆ|²“$È—jGfc#"!‘â¢02†ÁšfByÐ|Éù:Q홽zMÉ ™Âm p�4˜a{úN“úWV¢ûi+–¢#ÿ+ÚDK+�Ì„¡G.”aFÀÊ4ÐV… �É¢·|$ë¢~õÝ¥m�V“í~ÕÓþÞÿ]}È¢ +ºåmeI¬‰‘¬R� Åй*#š¶áPA´Ñ¡É�0ÂIÑ?ii;J“ïþûzOëxîý´?»¨î»\?Çúþ™yN2Ái ódQÉx"*üøF¶���Ð�Ôy¤žYéZvé=:^ßïõþ—�?_Óm5ë¿ÿ_Mûõú�šÇjŒ h‰“fC՘ΠôGDx�4D™Ð{/Ìàð�Œ#XaÞO(M&KZh=&A´5×ßÛ§ûÅwt¼}GúÚ{Çõÿé¿þ—×øüˆEüœ‘„T…û(Í‘#.fˆæu‰ó™¦p×4l6’нBM¤WI´½Q´šÏšN“ijûâ)%î–þ“o í­­Òü}_ÿõÿÿÿðßàŽ=à‚ð5Ø*6˜MlCg÷ 0ÓF‡&œ³ÑXÒm¦A6öcÒt¾�'ßT¯·ºé:¦¢©Wº·¿ô>ãÿþ¿ÿïÿÿýÿþü Ÿ«z»- °†“vp‚n¶ºZvýºVÿÂkÕÿLRt½ÚëÛÅ[Åïÿõo_[ÿÿÿÿÿÿþ¿ÿ þ—Ò¾�é¹8¥tôÒê=Óýkúi¸ïB—Ú�¿îõ¬·0æ˜pÒ_ÿÿ]ÿÿÊ/ÿ_ÿÿÿÿÿøIzúc«xëM¸þªïûÆÚH¨ü4‡ßÿõn±l4—÷ÿì“2=æŒ�þOþi¿ÿûÿß·^ÿÿ�½wR8]ô–P¿ý��-?zö¿÷íþ©0Øx#?ÿÿÐ/Âÿþ—þ—úÿõÿïúÿúý9÷Óø÷âÃHþ‡KýWoÿúÿü6H ¿ÿúëÕ/ÿô¿­ÿ_¿»öëÎúüvÞ–ýCÿÿoÿý‡‚8ÿöÒÿûÁ´’ÿ_õ¤¿Kþÿ××Uû¯öëÿÛ÷Kú³kí;/ëaëÿøoÿÿ¯ÿÁ¼$ÿî—ÿ{¾—ïþֿ߯·úÿ_û¥ýŸ�}½ví²öÚIö”‹ŽìŠûÿÿ ÿÿºÿäfø| ¿ö ­ëwtµû¯úµ]%ûÛm}{I}»m$ïöÒM8»MŠˆI¶’i°ÂMXWv¾ÿÿa¿ÿîëþ×ÞÒýôuí[·tŒÒþé~ÚýýÙuýž®ÖEpÓÒ퇛i&4í´i²8Iá„ÐE» B•lŸ Q*B";Ã÷þÿÿ‡º^þ¿á>¾¼ëæ=VÓ¾×]Òá„qÞƒa«"ã SÛN� “mÚM°‚´hdú9Ä#-�0ßßn¿¯ÿÝÿïó§¶¿¯ë¶­¶N¿Î/‘DÆÜ%µm›oh&š‡› ª ÂÑXèŽB""¡qïë¾½�VßÿÞß{j¿·ÿì‚W­é³ó`•Õ¤ƒC`ša& Zh6Á:M„ôG6/ƒR²v �óËßï­»ÿÿ¶¬Ïþîþ¬ú°Š;]8v–ÚLŠ:b´®¾©¢F„@Ѓb#FIWo¾í-½{é³5ýûg½°—eõlú†ßi1غÝÛzH6ÒbÁ„2,å‘•³òõ½v}Z[g•¤Ã]6EЋtØö)ÅXd''NA„íZ§�J!"¹†LAÄô Âëa.Ò‘9¤˜cÐI²´Å&�4ša…A…´ 4å3±¼<ºÑe4xØ„�¤Âm+aA„¬0˜bSÃ'ØL)\R0‹|߃‡†(AˆDšŸ›’ß§2Qÿ§úÂfF_´´k { ±¨|ÁŸ&";�È þ@Afb8D|,±tDk-¥ˆí囋ëËd ªénò×yHïUòÕ2·÷ÎÝVÿÿõû_§ç#V_ùÙg�™ +¢ŸÈf@‰Nƒ:#qðž0“:þKb6DLR@„� ì�à�lž.a‘&l 4çÍa ¿”ë!vm�P�³=NfÅ/ G€dùƒø¾Ãÿ¯º[õ»~G +ÿ¾‡[×ãõö£ø­i–—¾Ãÿ׊´þúôú,r-?-Èÿÿÿíúé*ÿëþÃÿŽÔ±ÈÆÿÿ�øÿ�ÿë¯ÚKÿÿ‚3ÿÁÿÿCÿ·¥ÿÿÿø_íüŸä®û ÿoþºÿÿÿÿÿþÑýÕ´‚÷]÷ú_®û­ÿÿÿÿÿÿ¥÷ÿ¯á/¿}/oßþÃëÿþÿÿÿÿA{í £KßÛÛïÿ¬ŸÿnOßÿ_ÿÿÿúÿÆÖ½¯·ïéÛ¯¤y~Ùš¥ÿþ»ÿÝÿþ½ïKíûm¶iðÌþý´¶é5MX29Ò÷ÿþÿÿmÿþýµ§Öìÿ„Øg•ž˜`‚M°Ar+†È¾á'iZ 4Ø‚ëßÖßíýäé¿ÿÂíÛÔˆ8{ c S›ƒ‚¨M¤�‚ +‘]5h㯷ÿ¥ÙŸ~ÙŸû $áÃM?N·ltì Ã ¦ƒA„H÷ ÌDC'°´=;³êõí-°ISؤӑ|S0“´í:Âl•„#BŠæ "lȃµcUM=+bj›¦Â 'a=tW.VK!HnÂta&ŸÅ"°ªCåPìëP©0B"2ì­ºˆˆŽ#ÿþ�8òÐgË ²JMê ¤�‹³0¤Ð§d3"ó¿b˜\¨A„]†“» §„lž‚ ¤ïUT›IÒÌ�$w¿¤êÂW;*¯ê[…K¢‡Ya?¥I*-P8#ÃZ]T¿òÒ2ˆ<)Ø%µÝ%ÅzÖˆæ´{" ”ž$fqЋƌó(´-çw($vPûQ¨õÈ•SS¡”ŠÈú™°Aù aLØA„(&B¦±“u˜ìµ‚…ýé/çbÕ‘tˆ9¢&†óY ‚yc„Gˆl È`øL#Xi$‹ºª7WÂ/¾•–ååÿý¯•HJG‹è„âÐiŸRNjÅœ<§"s8!ã<)ãEÛM?A i¨d�‚i?„ ¥P–Ý+ ´PôPôµ*qJ½ÝÜs±¼}‚ ÐÓT¦��ßSnqí„ °¡A“.Lè6’´¨ÑJý-w¥H/ÒÂXI¤µ[ÿýVÚ7°dÎNŸ¾ª¥m„Sñ§umèãü%h¨£¿ÐM¥ª¥¤©RZõ¥I}.ý;’E¿ê@ãQ�"‘"ÒoÂ<%ÐZ8ôqév4½í¥Õ$õKk¥]%¯ @é$—¦’ÒUuê’·Úõÿ#y1™¢YÄqá�!£m‰Ï`Á˜Á[­×^éR I¤¶ÉÒÒNºM¥õôé{KÖ—õJ)$5é(ô«ˆúù'‘w›y aA‘`�™B\ºa4l 4óòa4˜Ô6Ë�¤ý/ZZÒZí¥ÿZê¨!UJéRUÕd䣤¿I%H:¯Tò‚:#ÈÆ}‘üƒƒ(ƒÁpÐ<#óÖÂ/;i ›Ú +� &Â,ôÏ:a%}´¯ÒU×KÅ.Æ—ý+®ýqŠè%Õ%ITU*KªÒ¥™D:2B8ÍBšˆé);#¢>O˜!+„k ðâ‚ÃÒf�4›¤U½[H: øTŸ„¢ÚMÉ:Ö›_mí®ª5é(ÃUu¤¿ñŠª®–)%KõIëð‚-ë%$ôjD¤‚"há(©£Ô ѱši„‚TßH6ÓI7 ›Aœ4Ÿô¯¥Õô�½Ú=úÒûuÕuIRÒMëªJ’Òê©R^—¥é$´’¥Ya ‹·#éø#`a 0Óa0— †�›4¬",4�ÚgŽX:Vô•ëtëÓz§�w½‚vÒ¿ÿVû¯é.«KM××úZÿׂ %Uþ—­P„–“ ¦•'A6"-´´®i7Ýk{¾·ÿ¯O^ú¯úëOÿïÿîµ_ëð“ªUõý¯¨ ]U%Kô«É7ž·iRÖÖ ÷_mSÝ]VŸãºR8_#…~¾ùnJ�×ýh/Vÿûÿ¶«ê’J’Yoê©-/Õ$–’VG^¡?V•RÂ8ë¤�+×WUwÒÔÆt6µò8_ôXäS×’E)$q÷ñ‡ûëÿ×õýþª¾½WK×ô’ÿ×ÂÕüÇÕ-%¥ú{ÐÆû¯„:nXägõ¬’?ãÒCãëý0×ÿ½ÿÿm/ïÿªJ’*«_×ô¿õZIRI%Iz¤©fׯéj‹Œ¿ëQü}zýµÿÿðßÿßÿþéé%U¯GUx"ž’¤º_ZI-/úYµé$m*8úÒI*ÉÕh±Ÿ¬úúÿÿÿÿÊ?ü7ÿòßÿìBþÿÕiRëô—×^–oúèÞµ”/ÒU­-i©ij­¯íÓ®jëÿÿÿÿ_øIþì?ÿ{zõÿ„Y�ÿ¬âô•›^Rt©)µ¥®–´º×éZ¤–•%ÚZZ륥é/ëúÿÿÿÿþÚÿéí·þûu¶¿~•×$/KUPŠ}i$•dÿÒT©*UÕR[ׄS ¾ÒÒ\%¥ ®�tØKöëúÿÿ¿ÿÿÆûô¿íÿû﮿ýÒé¤ô´•$’]j­¥¥¥¥Ö“¥ákIcSzM…øâª)+I°V¶+ý{Çûïÿ¾ÿí‡ïúõæ¥ß®ÞÝ«kþ²!ªÿJ´´´°–•i_Šh--&ÒX…¶‚¨UiD$Â-…LTAST¾ÿï÷ÿ¿}ÿý¾ý}-µ¦ÿïoIë²ÿì6á'é´¸­l%¶–•‘ûT´´ª•°—\Baa6ª0˜L&¨EýŠßþöúþûÿooo½oÛ?]6­„PïlåÝ ›I6)4Ól6Oiip­' 0¡+h+«$Â0`‚ꘅT0ƒH¿l¦Oí×mþÿjߺ¶½í™íYélö¼ˆ8zJÄ-&6GÃ�ÚLB¶§z=²~U!ˆCt›A-0qUTÂm*¨¨EÅb°°Â-ßnÿ½³?¦Ïßwg¯ËÛ %±V«M‚t¼I´Ã +ÈßUa„�m "9ŽôN6)ˆUM0ša0„DQv [VÌý[l÷ûi°×I†IìaŠ´›š $ØA9ßUAˆF¤ 1\ìn +ð`ƒ +Õ»a„ªØfæ)m66!XIŠ´Ã%i‚ +Œö«ƒ¬f@—ñé�Štئ­S ”Q #¢E +~©/²VaEÄ#S;„Gí/KB#"?é~”~ØiRóµz†DZÕuÂh1•J•miÊÇÒ+š‡!‚Eb#´¥ã—Í„±DDQXá¡ÿå4©•ÉUGgb™°§ó±PÏ-°fd(ÂNŧRØ-3µ&Ýé;'?Ë\ +EÒkQiÚ;Tåš¶Œ–Ç“Á'Òüyf-éÚ*'c©¹üR–…9BN¯úùØŸë��d{–MbPý-GÚòc×O5ä^4y:'2x¹„ƒ…_Q¡ÈOïLêdÂ8ò�¢'“Á’ƒ?„'”ðFÂ;'6ª“iI™–åïýNôõ\‡…DI‘S–,#.BLÖa„{k„hZ�3J­;¨t›©ÑC½ßýuÈxŠˆÙf›!2�Œ¢Lôšl±é0£ÃÒvY�Â#‰pojµOúë{ $üíc×"ˆ˜“$Ì—"ôBY¬®2rŒäüøDO á'“»- †ž8GÞ)7‹]ô®UÞG«þ1ð“k_�Ÿ~LÚ ‡1c!áƒD$ÎsYh<0�o'¶KòcÓ´ƒ Ù0ƒ8}[C¤ÚµOºO¾—êÛ‹µÇÿ´‹Zz-ÇCë…ÎF¡¢s á•dašÍµ0E̓L&nLp• Ø@Î4ŸVZ8«JÚ + ½}Õ¶…Úþݾ¿¯¯—×ÿñªZ’þkÈž_)ìá�Æj#¤a“æé ��„l ¹ƒM4›E]!Ó<Òw©\+_WþƒI[Nîß_¯ûêôøÿ·ÿOÿé}õL”27æt 98¤€DD¤�˜fp@ðƒöÌäÐM„›“…h¬i7'K„ÃJÅþ›W}&÷Kßn·ÿ|¦ÿú¿××ýÿuÿ]ާ`òÉLuG¨dcDA#À2@ÁÃÖÂ7Q±£uB74›DXz+)hÆt›hqm+§I¯ß¡Ývºÿ×Òmÿ¿ÿÿ×ß_ÿü{Kþ¹ˆúhˆ¼öTÎåê\Ád| 3‘;4‚˜A„l ¢\ƒÂN…¤ÚA´�ÚNËBa¥pO‹jð¯ÿÿûkQþµÞ›ñ÷ïÿÿÿÿÿðE�ÿý}¸_Úì§l4B\àâœ%šI †ÐO +Žì*<4˜a;“Q§D¹¥iZZÚ[¤é{~—ºBƒ#‰î¤p¿î—ÿ_þ¿½ÿÿÿÿÿèÿÿìŒ?½mÃdæZãi&ÓÂM«aßÞ,4›¦šUtµ¿T×ûRá÷­­P¯ø/¯ÿõõÿÿKÿ÷òÿ÷ïÒÿ¯ÿFOû\4ƒtûÒZA¯Çöðûã½¾¤p±¯z¾��õ,Kéÿÿÿÿ“Ïûÿÿ„¿ÿþýp—í¯ÿ¥ÿVÛ︦GIß»oi[ï{ôˆ$Ö‹ŽŸ«¡ÿ__ÿÿ΢ÿÿÿ ¿ñÿÿ­/î¿þºõþ¿ýmvÖçûz¯ˆ«ý÷ÿáþ2êø¯úÿÿÿÿÿÿÿ¿é°þÿõÒÿ_ý×]uÿ]�yïlõÃk~ö£º,l?ÿVÿ`ý/ÿÿÿ'¿ÿÿÿþþëÒÿÿ¯úþöëÿºëµ½ºïÏ»VØÐlRPßÿ×ì?ßý¿ÿÿÿýÿÿßßûþÿ¯¯ÿí¯úúûªÿn–’ȃ‡—•´“TÓÐh;dól.ÿoUöÿÿá¿ÿÿûÿ ÿÿï~ÿªþþõÿ]·˜ÖêôÓ‘|4­$ìBA¶G$í5th”ò9؈�_Â;º á¿ÿÿÃÿßÿ×ï¿ÿÿíûi_w÷^ÚK§ipÛb�a°‚M;V›Pê)š¥ ŽÖS�ÿÛü"¯áÿÿ¯Ãÿw÷ý7þ«÷ßß·Úv­Ÿ¬Æ­×ȃ½9Ši¶’iÞWTÖ„kÑY[AkÕ{úM¨Kðß뫯ïíïÛû¯þ¿¶ßíÿí¦Ù[b¢­´i°œ*mwa†G^UÊA#²Ô#Z__nº_·ÿûÿ<Ÿöïnþé¿ý?¶Ïÿ¶zÛ0–ÓdQËÚ“ŠÓ°ÂiC�… öÊÆ4dk�Ô‡»ÿýÿ®ž»ÿÛß¶ûm&Ï_¬ˆ;½³mŠd}MŠ87TÑ­†ŽÀ�²‘_´ºV—Ö¾Ùêýt­ºöÏì3Ü;läÝÙt˜¤×M„馄«L0H× BEc•pamW¶—§ýß]³?]=-'®Ë÷¥¦Å1LlSLBm& ;‡<8T�…aVÁ„ "Ȳ»dnûK³R(á«a&é‘_h+I°‚MŠNI4Ú ÉXA„ì&ƒ†S@/Á±ÚN’qMp�Ä(dsiò:K# ‚c¶‘Wb‰Ž{eš§¨LlH0ÐI°�¦šžàÂbj! +¢j´Â4811ÖŒ…˜â©ÂˆûF^‡â?ÿê�ˆü¦•8R U9k¬æ@Œ�?•7娖Í%"yU娥*¹ØLæs/Fó?ùiiu¹ +ù�x¦(ñ1yÙ¯ª’L�K v·�‚^$Âiš�L–^q¢%¡‘|ˆæAÈ<èaÌ‘§ÎÞ¿¯*H©"µï_ÿäÆGΆUjgQJ¶ÐA”jvÂ6¬—ƒMPM ¤aB×´>šßzº^@Ë!PŽD!p˜aCÁ8#òøØ›´hhh&ì#ÛVZm'ežá29¤Ü#ÝUßõMs‘¬Ý*n¼#X<ŸØa='AZT“hi8L$øØW¦Òm÷„Òòúwñò�ÅD!ÌŽ„J´!20F°ÛI[_I½RmpÙjiZ'i+D¢•ÉÚßTÖ¿q‹ê;ùÙ®[™Ó4G‘�Ï—šÞzL#CP‘èþòcàÎ4›n«¯Ið©ZOدµ¯„SÆ·‡wÐèÑc­oý™-36t"@¤4RgŒ#C8"ŽÊ¯wIäÎ4›dΛWhai7ŽÚ^f’­ý­õ#…h[ÔŽZýk~CÏûã5¡H„ÿ2ò¤‚� ’‘ÌÏ'2|Á�ó8  #ØhÖGóù ¨ü‚ †O‚i}Þ�Ñ(Im~>ÚÛ X}ª�©.ýÿ¥É"?_óV¿úëùÙI$ y@Ê3y‘܉3Y�g$æg m“›MUÛÐÕÒt­ÚT¡ïKþ˜íêŸ××är­ø/àÔvô‡õÿ_ÿ¯yÈÔYÆC©™‡0Ì +oµ.zûÜ~†ø½_žÿßr�†ÿ_XÿÿïÿÈ“)°Ê0˜F¶��|#EÑÛ&ÐÒpÂi¤œ&éZN–“ké^é>·A„íi_¸ÿÂ×½µ}[×ÿ`ÿø?û[ªÿÿPß·^�ÿÿ–è& ¢;i:A¹eËCm+‚otN^ÿíwêëJŸ®?Ó¸ûïîïãúzÒÿþýz ÿ½ñÿüC¯¥÷þÿýñT›A^)[¿¯én;·Ò[Bª—CC¤p­­»¾·ÿÿþ¾Þ—þ~Ãû ÿ‚*š¶ÿÿð÷°ïKßþïÿ¿ÛOíý:‘Â×^—¶µ¼cª¢Ç#?’Eÿ¯ÿõn¶ÿÛÿðoÐ/ÃêÝ$Ýÿßîþúýÿíúí÷I¿µÿÿqÿo¡ôXž¼t‡úÿÿüÇëõöï¯ü?„¿ÿ__ß¿ýïíÿmÝ·í™ç/þ÷OÿCë¯Ú¯ª×úÿÿÿÿ �´ëïN¿ûú_¿ö“j­û�žß·Úíš/ó †rlõ˜ìº´Ø`‚þ¯ð}ÿ¯ÿÚÒÿÿàŒ?ÿÿÿü%¶‚î»Öëÿ_¿ý[¤¯É×íÿÖgÞÙêäQÃì´ÓcbƒÁ±é±_ÿØkÿþãÿtw¨ [ÿø@Ÿ×þÿÿÒáئ÷œ_þÙÓïÛJÖŸµoÛ=*ÙzÒa‚JÓœ ÃšiÂa0©ª(�„?ÿoÿÿ'ÿJëð—w÷¥÷ÿÿÿë­¾Ýýÿ}ß_¶Þ–ýX2íSb­8„Þ„�0­ÚG¸0H«hù'Êãa¿þ ßÿþ—êßäÿé¯õþõÿþªßïÿ_ÃÛ½²<�±KjM40ÅZlYVÚ –¡rlfÿøÿ¿KïŃþÒÞýõ]¿þ×_ý{¶¶ÌýîÓd îÒd|á»#òšQ 5aÂ}Ø"‡<4x !”Èeúîí×ûú®îÃÕwûÛ«þô¿Þ›ÿû¶Aùœ´Øa'¤ÓM…²CªMª„)BGÇ)P¤"Ðûþúÿ߯ߺýª¶ß¶h½vÕm.ÓMtÛ§vÅU± +�tx¢¼©„Á1E}?ÝyÏzÿÿ÷W­vÌÕ¦Ûl3ݶäW ²û´ÓM´™SÓOÅì0…pap?î¿ö½öÙŸý÷tövÃ.l3 �O›“…à 0’j¶aÓH¬dºtDDG{u¯OIäv» M8m¦È�é·MŠiØ„A…°­ ÓAˆSÞT‚¯‘2Ú nÒa„lBM0Å&®Òa¨M R*á‚ ɰØI¶µ` Žè£E\0DYD�A¢F„"YËQý„2#Xh³HãþSKjS&¦h`™ÙlFœ¶ËäCE;xëËd +O¨IÒÿ–ª®v‚áU0êÖ.ÐËUFG3„GÁsGjvRˆø¡\eš#£µJ"?ðåm˜Î ó>Ú×;\³h›‹èðÅ%Ü}SÌ„£H–ã–S Ȇ~ô·ö‰*ëiÿ×9Ì©™ó!±’:0ƒ4ffgÐrnXȦº ¾·ñ]ëwò´Iä�”èÐTDèA‚6¨ÎÂdòi¦ì#CÝÙ96OöøIñÿ^×ÇËŠ¬4Ba ŒÒFÏ„xiZ#¶­ª á…A ·ÐP¹’Ο»I?�”™&RPœ#¥ù=“ “K¢aÆ“l³Ä6“p˜…j“õþÓ¼î§ï”µ�šb�þr5 ‚‰�–GÉôD.k ÏÝFëuúÍÒÂ%_§v�ݧ÷þ­cë�£#gø@Â64ky<�¶©Ëz Õ-(n—ë¶­¿Û�ïÓûÿûÿìʘëä DSQ»'F nþGm&I½R°™ãqÅRm^ϯÛKô6¯ô¿ßÿøþž}²:#ä e:Š +#ÄŒ j¹™Á0‚ƒ´itú¥{ééz¿®ûíú ‡ÃþZ§ÿÿÿäK#z©YE9� I!"'A a6æÀóòBÚ„aßL4G�(a]/÷í&·Uiÿô?�ý–3úÿÿÿþ«f¶Kc6tÖi’hæHÌ +ÖÂ6H®gü#;I´�&ÒvZ)6˜=%ÂmzkÿÐÔ~7øn¼±ÈÔ¼ÃÿnŸý‡ÿÿÿ÷ÿ)ÍN²eXÈ‚Â*Á‘< Â��™Á�™Á+PšL4�Q¹hbéZŠV–ê•íª¦ÿ¸×õÈr¥º,gØ}i ùïÿÿÃÿÿÿÿÂ�"Ár$ÏC`eMì(tG é6ˆí²Ñ 0Ñ.¥iaa;í÷~“[í¿¡ú—þ‹Rÿü?öýÿÿü7¿þÿÿô~ÉŽMËF˜hŽÚ½h&iZ Ýw¦ÒÒÐô5^¼¢9Hs§–9ê�ûÿÿ” +ÿûÿÁÿÿÿÿÿ®â—ªMÂQ¯ö½Ò·òá=ÚúørŸ¦ÿb¥§é¿ÿÿô ÿ•�¿ÿ×ïoÿÿÿõÿŽ®ú½tÝ»N‡¿ïZªïÿ¢ÁEÖ½à +¿ÿ×ÿü[ïºo÷ëÿßûÿÿÿÿõî¶î½ÿ!Ï÷[ßÿÿ‡¯ÿ»¯ùÓÿûü?î—ÿ«uíåûþ½íßÞñþ¿î豟ëô¿ÿðßÿýÿú¿ýßÿ¿}«ý:ÿék¶~×M;µÓƒO\¿·ñ°ÿÿ÷ÿÿÿÿÿþþô¿ýý¿Ê…ï¶“~iþ·^Ã=]Óeý6!'iªiªv® &š;ì?õý6ÿÿÿÿÿ†û÷ý÷÷ÒÿÛ¿ÿý¿4I_®· ÒObm¥šl$×¹YE\Ÿ'Dèìá»zÿüó†ÿÿÿîÿÿ·¿î½¾þÿÿm¿lÏû´pØaS½4»°�a‚I„a\ŠZ#•paÂἇÿô°ÿû]ÿýݽõÿo×õ³Óg­Xa%NôØ„„šèaUbb¬�ñ`„DFÐ_ÿöß÷ÿ׿ÿûd­wûuíöN¯ÌÒÝýÛÅMˆI¦Ó ¬2Pš”ACGd(¥ûuôïûÿ¿½ßÿÿM·«¯¶¬0KV^EáPÁ+‡¶Pç²°¬ˆa–…€Ýõ_×ÖÏ'þÿí}¶ÿïÛ?ZV}0Î+/í¤žp˜¥MŠAÂpƒ•ÓVeRúþõû¯û{Õ­ŸÛ¿¼ÆžÁ¥xd)űI¶‚´Ã º ¹á†46ʸˆŒ‡ÿý¯­·_Úú¶—¶ 1„ÓMƒM0Ä&A0ƒ +‰b«Ã-a0߯ïzìý®’¦˜d/´Ø4Û &ƒ Bdp­=©âHDˆ0ËgÃtÒa‘ûaȽm$ÓÂw %v¬%N›b<2xE0�7 I¶Ý„›¾�l냋a¸bƒDË €ÜDù–¤$‚ršT—3¥´©œT_pˆ«¥ÿz£Ü­ß¾Ôµ K¥ñ–hDžv"H_ Ðü³ð§`Õ~:ämd–…U �ÚC®§i §f¢PAª �I±/�Ô) «Y�*†SƲTD.D ¬$wdøA„l„nšAù6™Ó¹UùÌ>Ts½æ¼ìxÒ:‘ÐŽ‚‘6¸dø@Â7M;?£cL& ¢8i: +¯;W§’ûûT8¾™\O%i& ÖȦ0�„h #Y›IA6…¥¬š)0Ñ´´¥«ÒŒ‡�†3nUQ®0�bù([ÂõSºdPΣ:2>HdvO˜Ž‘ýƒ4‹‘‚°�Ì�¦AÈ�á):N‚l&G4¡¢]K +ÐT›A?Ói:_vEÑï"òd¸<ì×ÓÛÿ=‘³:ˆˆ…ÉŽ`ʲ3žËPg #`a`ÐA°“žßn:©hM¦G5@˜m¥¥ n�'¦ÒwÝ]§K}{†öî~Ó ¦_ÎÆ}ëžÊtG�/DòS3†±çä~ 'iT{ ›I ´Ÿ×“§§VéÖ�ý]SÇ#…ßz·Ç§­}‡Ûݳ³OzÝÔ™-H¹©¤GD}:2ˆCm×ÉÎÛI¶Yé6™ãZMµÒÿºi¿Jè_úý ×§Kÿÿÿ¯‡üªûkº^vv§AšÅED�£Ã�Ü{Öèi½U´¼_^ô/ÿÿÿá¿ü64dwõÿþVÄ/þÿÝ}~ÿéS¤ÚOêïëxº½?Z¯Ç·«­kþ0ô¾¶ëÿÿþÿÁÃaü{ÿô´Påkßßþÿ×ï=ýqßþ‡øíûÝE×þ¯W¥}'ÿöÿÿÿÿàß÷¶/aÿÿ®�÷÷÷½zþÚ·w×I¤­_Ñ@ÿÿêù»ÿýÿíÿøaÿ„T?ÿÿÿ··ýëÿÕ6öõoþÒû êÝÃ[K_×õü´àþ¿þÿßÿÿÿþðÿêßÿ÷î¿ÿ{ëïÚ_ýì‚M™öÙþöÓ»#ɆÒM6·vÆÁ˜vÅ`˜Z¿úÿ·¶¿þÇÿÿÛÿðß÷Wÿÿ÷^smÛ:iÿý×ÿ‘G †Ø •Š[c ±I¶’iÖ0É +¢1ÿÿðÃúÿðECÿÿêþì7ßûþé?÷ûwºÿ^Ù¢†Ý× ¡ßI¶‚M4Õ8'¶* +²8 a#Ö!Nr®d(ÿÿþ¸}´ÿ¤ßëÝ+®ëND+ßïí[ÿý¿ní¤©¶m†ÎL‡æ¶°Å Óa¥j·»S̓› ÿÿÿÖÜûJÿý{îë´›ïß<ªý´›×mU6¹‘q¶4í$íˆLBjá6M?ÊÆ„kÎÒaÇÿß­¾—ÿïýo[Ón»jöß·j—«g¥¾ÂEŠi†*m¥¦Ø%<2„@ÂdÃ"#B")?Û_÷úwÒÿÛI¿4õÛ^ÒnêÛ?¥y�µN-ì‹nؤÓ0ƒÚ©á¢ºÂ¥d!‚2JÖ¿Õ÷ߥgUéýûi_ú_M—Ý&¹´Å'lS"ŽW¼2 öÐP¯`‚r®��Ùdµ×Ý_öõI¾¶AçÏ¿VÎKé­ “a¥i1A°’l%M„e$ZU¯¶êÕ½³ý—­&Ï«I6iìi± 4hV•¶&˜„AŠ,Ã-´©«i1Á‚8íŽ)L„ö’n©½[´ê‚5²‚¢9è´†é§m¤\i‚a „Ñc�C2b* 1¢½‘1FB‰Å­!ˆˆŠ¿µZ\v•}G¶‚NÈUáÁ‚þS+ïó»gbt¶Åˆùã¯-€Ddò²‡©þ¹kÇj�$Rž¢!ü>üµOÁœ2<ÈÆ½4�¿¾v ´á©4 ø}Ev¿NZ3´óq~ƒÿÿ�êIQÕË%á0FvýãëþI%c'H„U‘�GÌÐEXrlKP�kÒÛÊÊò%þ¹yÈÔ< gãhØÁ*2ä¬99—óðBÐ!»y]b +«N�ûﯮV@Ÿ‘ã1�!æ#µ„ #c4‹–¸øGéÃÐÒ ¾Ë=êV£ +û¨þ8êK®P2]óá2¯! XFÀÍ3]Ó'’cÂ44›CÒ°ÓI7„Ié6ïÕ6—ÿ}ͳ¨Ñ„Z� ~|Í!B6x£Fî“rt.‰°†­æl*L+t®N:Wë{Mwþüww|ªkçe¹²Í6!²ðƒF°íƒ oé98é7M%zM¾•ÉÅGõéµOVÒ�Å&ÿzÑc‚¿ä_ÿ;ìÒ%òµš":#Åò¨OFˆa5Ã8ÐMË!0ÒoáqÒ·I+Öëü}ß�­HázKÿß9‘JÍ®§ü†‹ä ‘9 È=™€h<D\�#4f°H],0–gI½®› [«i7õ¿ÿ®“~†Ô?ëôXähüÚµ–Ÿ«ÿúM׿!šyÃ: &U—äSžÎ ˜˜f‘a HAXA6…„ghŽC[Mé´›K¦ô·úÿKïÒR8VéHáù +�ÿýcéÿÿ÷ì9�D¤«Â�UŠj"@¹qpF·"t&±ªj� BžLt“hi7,Bm[D¹‹ A´IÒÞ*+im7×uî‡í¯é?òH¯6•EŒ°Úýdâÿ_ÿÿàÜ¨ÎˆŽˆùÈñ0ÈÌœTD¡1Í¢/#Ÿ"PøEÛ3‚aÜ^“|ŽÚM²Î4¢]IÚ›D�$Þ“I]mïA¥¿O÷}-×ø-zoÒý!oHÿo÷¯ÿÛ_ÿÿì<Œ˜aE†Q˜0�3§-Ã'‚ #cP�Íl$ÃäЛA6ˆí¤òü=lÈÚVòQ^­1Öè4¶êûnûÛŽ·q¥÷�ÿ¢Ä»ÿþ—ÿøaûÚÿ°¿Kÿÿ÷zL4›CJÑn‚m–„ÚV“{¤Ý7 þŸ[ýo¡Kßãq¦úºýô†4[œ?¿¶—ÿZýÿ¿ÿþü6‚îñíÿõÿýáé0Ñ'¤Ü{«n“i4·ýªí¥÷©/\{Ö×EŽE=}wÿ߆Áâ¿ë×ÿÿËÿÚ_ÿá¿ñÿÞ*ýºÿûêé=4¾Ý +Wö¢­úM¡µ×¿º,r1aøûúÿíû ¿ÉÙ·ÿ÷ÿO¯ýÿ÷¿è/¿ºÿ[ÿÛ:u¡íÆ6�öõê¿ø/oE˜þ>¿®¿ÿÿÃl?ÿ@¼¿Þ½½ûa¾ëï¿ázo÷oÛ­>õlõõKÑc‚Û×éµßÕæ×ÿÿÿ ÿÿÿÿƒ`ÿõ¥ßÿ­þßïßu÷”÷ÿ¶f¶Ï×n“{eýmІ–¶ü¯ýÿ×ÿÿηá¿ÿÿþ½Ãþ»¾Ýk÷ý»{¯¶h½/VAç¶ËM†¦)Sm(>('jÂa„¿õþÿÿþ¾ ÿÿè'ðo¾×ÿÿðïwë¥ÿß«uïûf‹Ìýº½°JÛ­=»V)›°“ ± ÚaOQ áWÿÿÿÿÿÑoÿÿð—ïÿöÚÿ¯{ïõûþÝ·N¾ÚÙ�l¦.Ú Sb“´‚Úvà +ç¸`„!a­ÿÿÿÿÿ÷áÿ¿[ô¿~÷¯ÿúÛ:ncÛµ×µ£?öÏY�ÒmÝÜVÅ;¡¶¬+d`ÊÞ�…aÎËs@ßþÿµÿÿ÷ô¾·÷ÿÿõµÛzÿ_×I³=¾Ð\ŠáéúlSI´‚ö¬ ¡„ Á† ˆÄ""�ˆŠO¾¿ÿî­µöÖÿ]{ý¿UóŸ·½m¶—ü%aÝ]6o´¸-§;Ø&…+ +n•{ßß[׫õý~¿_¯õmŸöÒM³Õ¤š}…¶D¯¤ÚLB`ø„âí-Jd>¶ëúö»un¾ÚMþ¶» ÿêÙêÍ®Â;‡}¤¬U¶•±6•ªxA&†,�PƒŒÐ„Dq+Ýmõ½[«w^ûg«äAÃá&Ø%"ã¶*EÆÅ:i¶’ „›a0ƒޏ�W†­vémŸí-´³tÃt¶Eö“©°´ÂÛšM0Á0“ªç†©XÁ‚5¡„"#�Ú +Ã96»at“m(¦ÐL…8i' ²: 0IðžUˆ ¡„Ô÷Es-ž¬‡6Æ)´ ˆV\“ ¤Â a„"�m ÄA$""!¢o� aC1 !…A(¼ …”ÐŽb"#B"#¨_ ëêü Äz?>#N�GË#¼¡0²˜ +Š4—–À”vÕ=ÞZ¦¹_’“Kýó,RÒ Â�©É÷¿^°¦‹þŸ&h}9hdE§ûµéù!2 Ï™ SQ"2ÈTõ%-÷£±¥�©HDDI‡'þb8ˆññ0‚1@�”a0š638'Ëp&v/ÿ™i¯�¾UädAÙV2�¢A¬2‰FÊ68¨Ñ±áÚˆá£ÛI´E¶Ì1Pm>ù‘¯’­W;Oõ'œ�£R<i eAåFÀaÃÏé6¡4�Ãi„Mé0Ñ.h Ò¸+æ­ÿqïR·”še&q$Dé²5ç2;7œ#^0A*>>LBh"¾Nˆ£´EpõI´¶Yé6™ö–»ÿ¤ôßV©ïï¯ð¹Ã$ +ˆ•‘œ‹ä"s@h„ gÌ÷z Š‚#�ÏH³§H6ÓL%ÖÐ Ã@ƒz¤Ò¿¥o¤êŸJŸÛ¶ÓèS_Ür_ó.Dµâž5’È� ¢Ý…ÐÑñÏÓò Ùcä¹4²Ð ãhCL ¨'KV÷ìRè8iýzý[§^=Pô½ÿ–9ÿÊæ§æ¬•3æt@§GA£l(3Ðð #tÓ“höÐXeŒN“¥ª¾.ô¯ ·ÿm]+nþ·½¿¡¯zß­9-Ë#·ÿãü|®è�êt03YË‹“Í�ˆÓ #ÛF²?˜A6ˆá µqÅ´ŸKQQ\]ÿÿn�õ÷Ý+­ß÷Qý_×Ǭu÷ÿþW)KœÍdEò|„�T +O› KYf°Â6gÂ5¹ïI´Ñn“¤JºV�6®¿¥½wo~ÚOÓ·¯OZÛ Ûú^ûÿ¦×ÿÿÿ�„Gc³Q!‚"ù9¡Pk § ŒôfÂaÖÔ&�úA´›Aœ4¹¦‚°¨&k®•Ó]î—û×ýÛÞßÿ÷þ½}Ô?oÿ_ÿÿ¯ÿÿþDˆñÆH�ÃÖ þ\aÃýGÏ„hiÙ. +• &Òtæ‚vd&Ò´�'ß[Ú­.½\PÝýÿ>Ýýû·« ÿaïÿýºÿÿÿó^g&˜G¶»#ò¦?Õ´›CAÒÔ<´7JÝÚTJ)_Õ¯÷íÞ¥Â>ï_©+þ¿_û ‡°öÕÛµÿÿîÒ ”ìŽÿÿõÿý×½ÿÝQ‘ãIé¤ïÒ D�+j>û}¿î>—ºW¤ê®õïè'ñÑiýë« ‡°þSºÿÂ;Òÿý¿Á´ ÿûKþ¾þ÷ëýÿ +ººV£ûTJï´=ºv”޶¿ûÇÇïÇÿô¿ÿ8;¯Áá°Þ úë·¿ÿÚé7N—×_¯ÛkïÛþ½~ß÷§tºÔÂ[KH\w»ý&õùõõÒõßK_[¯ÿîÿ'ß aÁ½öÒÿý+¯ïþ¡ºúë÷¯ÿÞÞÞÝkýš/ÉþÿZñ�ºÝÃþXÞëÑbÿÿÿÿðW_ÿúü ½,6øoöÆ¿aÃý÷¦º_õí¯ï^þNšlÏÝ.¿l½²ýßñýXzõ°pÿï_ÿþ¿ÿýý{AÿCú^–ï¾Ã‡ÿ¿}ö¾Oÿ×ÿ¯Ú_i°Á.Â[ki&žÅ*q_ýa¯ûl?÷¿ðGÿÿïÿþÛJÿïÿ_Kwßßýÿßzít´½†z´ì½¶’¦ÆÅaŠM´MS +Ú¯þÝl5ÿa†ÿðŽúü Ÿÿ¿ó?þÿÒñûÿûõüç˜^s­þÿí6ÒÚêEwiZI¦«âa´“°Èá°ˆxbÈÖŽÀÃý× ‚3ÿÆÿÛÝKÿõ¿_­ÿ×A>ÿúý¦Ý]zÞÕö½zlm¤× (Wa„¦ÂiÚ$aˆF´O™[ÿ½Ö‚þðl?þ•×Ú_þûþº÷ÿªß~ßÿwx#E–•·R …«#͵¦š†G6‚dTáPˆã ‘©ã¿ù§¶VÚ_û¿öÅC÷_Ûû«õúÿþìÆÙ¢Û3ý»¶EÊl6àâiCH' $ÂÚ¸V� Eã(¨ˆŽ8�ÿK¡Ü%Þôïÿ¿Ú¯ßn“ö»fz­öÃÙö +›ÓcNiÓ½;Å#Cb4[–_ÿ]'}_µ8³ký¶¿oý¿½¿¶øI°anÕ8„Û ˆI± ;dp°a ¬“p«ÿú­�V½ïWKß¶gívÙêNöí‘}„™ í6îÂI† •o®wƒ‚eœÖÿÿÈz;Jíµm-+¬Ž×a‚Mi¦Ä&ÌM6¡6�0–é¢qš°a„Ê�§ÿ¶Ù pf×M„S¶A9¶•ö“�i± kM…OªGô²üR‘ÒéZJ’Ü&ÂLT+Ü%]U5OKý/W¯\ßé^—¥áÃ…i¶ 1T^…ULT/ Ä&¨Fª +—×ýzIV—þIT ¡H”ÓTÐV)…±_L'a +°GbÁº^î–«¶‘Ïâ—±T’Ð…H:ª„ÂeyRP†‚Ö´“=ÖúZ¦Âú ‚!²¸Ü•'éºk¥Aböœ ‚]»­u¶T鈂*4=*W–°RHE]ˆTŸA¤ÞÕIý'A7CCn„C#wPÄ&Ò†PáDÿ€€endstream +endobj +271 0 obj +<< /Filter /FlateDecode /Length 6355 >> +stream +H‰ŒW]“Û¶}ׯà[å™C|�Ní¶n“Ú­5cw<�—â®ØR¢BR^¯}@!;É$£ì„ÀÅŹçž{ðËFšœcŒ Y‘B+.Y¶ÃŸ’„¨LÑÜÈ¢(¤Êˆ¹äT))2%¹Î¥2L�U§ÍoNEöªÛücóˆÌ~2†*Sk¸v1•(£™Ö9£ˆ©˜‹©³ÿf +±l2Lp:Ç$>&Ë5CDä†0£Rp‘hYˆ‚g;µFHn°@K! +ƒÔ¹È3ø¿bŽGCޏ¶±íú‚HD4.ÅB +VèL…|Ö¦2S…ä¹Ú Ã9óñdN9ŽÂå')ˆ ‡Ó¹¤,Cî9³02šçÒhC˜ ‰… Œ‘9$ÿ��EA ÎUFs ˆaÆT@“s�áf‚PÃç€"Ü™Ò$‚(\òo‡Ä¥)ªEm<Šl�¡ð JÏÖ6{Ü Â-X–iB¥ +™@öà +W�c´È)"sm¦ÐŠàbÒSHM¡�¥YüÛ?nHÖd›÷›öä?EF²ýÃÆ¦NQ¢}•Ùþ ?Ù~ÈHaÿû5cÙ¾Ïh�H‘‹ŒZà9Ø¢þâDÑlÚlÿRö‡§²¯³ûÿº�„p’ç¼AàÃfû²ªê¶î˱뇇®KçÓeÎ,¦né�ÍØ�Ë6,á@KP°zZòæT>.Ç1NìÀ,ý‚w}WÕÃМÝ*‹™Åvù2áPØýÊ]Tåè¥ÌH[t”44§}f/úêõ?¼ùû«·ÞÏQ™æYükQf¹AkÍyþüòϯ}ÌòpùÅÚá@j¶Ø;`ÇþíÛŸþöfÿ;ãÇ«wøÂèHX¨Ý÷WoÞ¿ûéå¿Üw{]:]W™\+á®+Xf°^0_¶vaïzõ)(™Å¿3p�Øøb¢€A9�˜h�\AšlÈ?5�×™%pR8¬§]a$h¼õ5§A¨¦v�ÉÃÔ%#\æD³Þôáã›×)ÃVé)‘C>Éz×˾:6c]�cã³Ì©ÒYü;ßžE·WŽ|ÚçYD^BY¹8C£»Æžp•à3ñ8¥34ÜÌ¢l¯%ê/åéÒ.ÌçZO­�zOŒèæÌCÜœ¹«Û�¥ÿƤt=ŸCCço}w›s�ìf¹s_~Ú–cöbG…ÜŽÇfÈ^ü{ÿשÛýR“ ÖÖŸë6 mÔþû©y<ŽI2VZçÏ÷Iv4ÆÊ!A¡ÕÒý¯šáÒ–Ïw> +å| ›9ÌÓ±©ŽK$Ìa¯F‡ióps[‰ñ2cuŽˆšSŸÛ§m3iÏŽ¹mÎ q§â3`XÆÈöÒן›Ý¼rºèAL|§î:´ÏÉ] hܧSõu9Ö‡ï—gûÔœÝS¾d m¾ò1dÉ)"7ÆëÉ¥ìËS=Öýst.€¾­Þ’«ñTjÎU{=Ä�N¢®Å_Ä1f»BeåU:vq;n“=e»uµºSÓËøÉ3ë‚9nB—�åØtç^• ¦c.”çǶ¾»i)Màæáæ %¤§]_?âˆ]÷°kΨe= X”ÓmÕuý¡9ƒGCž^� ý„o�Ç×è“3l¦ bezé»G0æ´ÌÙ’ЇŸ@Í}¸“Å„Î|²aÂØ�dRžCÍmñ �ãŠçå<ºïMù�,X² Ž]ÕµIvèR²R5bV©̕¹ïË>°H’ Øí ] +äWx=»®ý_3.µÇàå+ÉLÕ,*:½\Ú¦rô¬#çƒÝÔ]\¿u±=F}Þ÷õ¹~hÆ„L6ñ˜¨§úîts8 ‚éY�í-ݧ-Äd„—Ã>¶uL³™”÷MÛŒÏËx˜g”Í*èÌ2¥<ý`¹ù¯t�ÜF°†sö<Ö®ñ¸.‘‡²ªWJÈ©¿Éb—ø ”£jA¦l{ öÖJN͇tÛ]Ƶ¬«Ü¾ b¡üZ§�г<÷lùšªÞêK}>Ôç¥JuÛÁ¥ÍÝ�§¤�N)ÄJácÒ ÖIwX; n¼³êéÀ㨗²ê%ª‡ÛÞaß/•×’’•œ-¼ýC4W„3^ÉP¥…ñÃùVd)õÍžYâ•çjÑÉùîÖqMM�Ê%~•ºQl©ßªå�œ"¡á©TàÖ�À×èÝáÓB唼A�-&÷è�°ó‘ð¦(½“ÁÜgóóããëô6i�)úA*7Äâ�© +*¯²­8æàQ¬z«¿†E Ò<Û›«û¶cÐÏ‹ãªð ý±}½«ÊKyߦ\乘uÿ¹îóàŸã¬áóó>€:0P% *aìÈ<^Æýíß«FNçItàÝB±ì…PÛÖõg�ý}><(·ôPtzœ¸a˜�c™íž±tæÁ]àÚÛÅP)áí¼R±TâVD …Þ­³úø›ÖN‘ìƒØbú—ËäÒ‚O 1æ“~Š­àÒ€ÇòsZq˹båõK¼ÉÐs©ŠÆÞÖ)~Y�Ín¦0äù}‰Ë™ú_?-a�¬9º³†%ïëõºmõA\LA›%cÓ¾S}ê¬;Øit?ê³XÄð.ázyZ¤>>²oÖ=ÃëþÊÓ=)>X¸³\zÑ$ð�Í4vóeîκC7p6©šœÆÒ‡vÅx RÀ””Df`HQ„}dá)iAL[žZcçuùùF–… �7öåy¸tý8ÙnJÕiý~bÖ>º;¡“­�ÙêQÊÂähÚzX1‘.˜c]ÒÆÃ)Òã²X–)<�×Lj㘵áË¥ùR·iVX Èw³*X“•È@#�✠÷™6§K[ïn†›Æ³ˆÇæ†#šS0$÷RW ?_c* +ïV +<¶c§BU¦2Bƒ“ò,ÅÓMóÕÓg©ßÌ ŠÜ|Jß—?)<¹ù‹�lÀ;t¡�A^Ñx‡»„›hwžš©Qç¹Ð>�C=Ñ5Q6±6±¹p”uZ/iŸ™·ª!r.nT#íØà—’B²@ÂùÊ»øÎ˳DçbwÿŒbà¹XoÕ1@wߌ�ÓžÄ'à-±íCW]OÞÏîb‘„…–‹nCÜhš†”´CÊÆÄä&‚å& IËv3¡¨Yk�ãmc·œc‚Íš�aÈδxýÍQÈá² +;BãmÊ~> ѳþ*ôÂûkåzÁÎ(È—öU–šÏ-n[ÊÕ«²Éëzd ¿Ã¯€;ÿÏxÕô6�á¿’£‘+~ˆ’Žo ,vOŠ +äP(¶«¯-¹²œlö×÷¡$‡¤’Ý  ¦HÎÌóÕ|7ªRAÙ +ëò„¬!’Vcù´~ÉÇöu ãî[¦(n6x~¹À‰Ê,–êÔT% +HËø +MíÔ¯soT6ß±;ü†áÎÕÅ +*$UwÜ"퀰Õn]ÝgN4åÏ©øŠsÉ|mh¥,ø:ÿ²,ëä‹ö¶.7'e2�¥,Â×e M�¾;†Û£ç‹Ðºì!)ùFf*¬L FW˜ÐÜRR Î@iÅÜäæö“*:ŸBkø¤xftm©*~îupWö�n Þj�u©jÎ*¾JjÞâW×WÞÇWû¿2F åšñt¢Ñó¨”ÚÁ.ƒÌ¦Mr|M†™@é§yãêŒ]<ʯØ×gLY| š ä¨p÷Òš;Ù][;¾5Æ6"6‚Ö°±Õ×vÄHð<3Tß>Œ»íæl] A´œ_D+¶A¢„ë"x¿;:¿‰‡‹¾†õVKyîÄUô_ƒºq +Ä=9ÊUZÚð+v{EiЦ3÷Kc/ä×x ´�ñµ„žLk„sQ¦$jÛ¿ÚSXKI+¼{bH˵úýZºg/ApRI°ƒ[mЧO§ûíñ[þ!è½1c4²2œ¡Z±á’¶‚l�Ž()cø¾b÷Õý0qy-s7r§æ�J>‹�_—cÑá…<43swh ê—IüÍ5 êž§f5¤Õ—CÜêSÁgA£5‚šs¯ãpùæÈ]³&©”´2–%“–ýùíì¸by¾×-€„—b<6ÕLh´JI&›Ã8�[‹ÒÌ bÁ((¡ð$e›A§ ÖǾ�>†ñ')�¶ó+öüíIüªøðô:3C^Ïê CºÊ¥\¬Y]ìM•ÃÞ£1? +—¿Ü§ûè#¤,«Õgænþ~óPY1gÜS~ÀÆŸÛ±™Ö²g8À‡j`Âþâ_íÿîÝØÚü³Ê^V/—M]`mÀþ6�UBmK9_ñ×f<~4#¹eJ™RÔ ºÈÍ_µ•¹Éûè6ür% 4Ì]�9¤[D0\¥´påyI]¼áj~þ2Y6õjÜÝkÜóâV2‘û89çŠØGZºšSGPe½¶ )w<ÛÍî6¼NK¹ÂˆbkK lvk™6»ë8¼CéÇä±¥ü:¨lHCs‰û#1ŸŽ_^»®?L�}a7}F_+KH¿§¤I¾Ô[‰©¨Ýü +;e܈\ÛѪjÓZ>!%9üsûÞž÷ÉK+LIÁ}ɶ…#ºFf±M[E: Z;Üáè+«ÃÕ ™>• +áí'T5­¶‘’†ùr=·¿ûgjQ°QŠ¿m_ ;íûù¼»N@-®¨µ }S: µS‚çÝ®’¼Ào}Rj�ŒFŸÎVÉ/T/°™ÔÒý“Pí:a+�K®Óëã£;XûÌã–ö[Wîü• ¶½“S yÔŠtiåªh(ÂåÐ~�?— 2þo︆×ZÒ +¥âÐ:}Åôy©iÖªRì>Úó™fg-_¹ø¹eK×Û& a–„ƒŒÖd»g1Ü'èPû2`»â;c +@ò¢iCœuØ’#ß‹Âݘz‘‰ÝØæÓÂä6Qù1*®Ä_Ž‘ðüvÌV �å2” æ`q$îî��îÅõ4³Ï«Š!R9Üo†›‘i¹Ø9Ï2d⽜*é~aUgxLŠXm ž©ŽVšõ¡¹»aOS·Ž,O ?Ö2gÛ3뇒 /µØ‚}Ûw¹o?’ë{{|l¦&‘ Qm|^½ø2ä-ÇTë<˜ÞÚ8Ÿ?ÉX`ºYaìá™í{ëÞÛ¸ÊrEN`®sQSD�µkí~Uèµ±Ä5C<÷8“´ïØ_ ëž ½7ŠÛVþ��5=…RÉ8“硳ùI͈ôÂ�¬&Mîbâ„…%gÐø=9˜À]áÖ½õÝ+pÞO aÆý +ë` âÜÛòÿJ:Çór_±É §Þs~lûØ˜à•«Ô¯èá9µ‡pùZÿùËc«ÇU–„õËK×7ÜÐ�°ÿ…£%»6vEš…ˆÅBPš_ �có°%0Æ(7ª};» !+f/¸WWdÂ®í¡ƒ×ü£�mC�ß;ˆÆr³~ÁÂxkƒÖݦÅ5fƬÄJˆ�ìZ&nÓîKø/'Wýê‘´a;6­.<ì5µÍË9•ʪvEàjÆ2â‚ ,¹xè²—Qµy(µ²,¼ÆÃl�ýŒéze’ŠThΉIÈ[NÛJz•¢RC‘L��à´çÝß�_¥•«ˆÄÕÆ=sŠ cj“Må ×v¤ÓGNMû_ÎÍágÂÒEI,3FCËõáãÔMi⨠+¢�¸ýªVÛN€ÈM0E8\U1Š¢Âh@äkÊ«Œñƒ¶­:Öfä¹ ÜæªíPåz–騼ä9õâ4àR‰NiíØ´2ŒÇÙƒðwséßMc¤„ø†[*š²¾™îc2I@�_wkãã sܤÕ®~Ù°ÎDGà‡ß›Ëu6ΙRzwi�°2gub{«­[­ëê¡”B~ZÞÞ&žVKH¤²ž6øµõ´ .d.h†Öœ%CÈiªqU>uo§6žiVb=¶˜ T×åLæ­ö*=ûd¶ý Á5ÝpýÖÚÁG:¤ÈçGÖ¬˜(޼ºÄÓ÷µ­—-BO̤ª&GÆŸWPWzñ\¡á€$‘|kûvÌøDýŸð*Ùm"¢w¾ÂGçàaº{z;!!‰d"¡DB&™$–¼D_OõRÕÛ`.sšêîªzïÕ+Ó ’åC¶]f3}rþqsº÷ž�·ÛLõd‘`eg¨Agi�MÛoÛý˾Êä¢Ï¨9>Ÿ7?võ1("N™‡fÌu¼UùœE&¢îp?žPVù[’¿H4%ÕL>ª^BR’w»Í4µ�cº>7©±v³1oÀ*ׄ·fÇ‹VyìÔ°(¹ˆóïçíª䊉ã/ÃA"ê`æˆêŸÎ;Ä·Ûh%´Ñ€ýÒL ¬ràæø +ñ]Ä͹wƒ3…Ü{]úh|ªŒ_ΠñØàŸ +Õ‡ðÆ•Pou?�L7®Ü*X9Ñšw9‹T¿]~ûz]¥Ôƒ£à¡ñÕ¯×ì»\@äC¸ïuFã !üŽSFùø–‡~©²:ú~d‡ÜÄ=çöjq5ØPÇRs€ŸÛ°©šÞwJ"PÏÇstÄ%;- ް¢²%T/¡ÿ’3™Cˆ¦kæ<¥ +œtô +rªþá'ÖIˆJIwµ†q'¥ÕP¨±*ºjó`M�ü-}�ó¸éÉoŽúlë]c.F%}ÞÁósôU³Ëiû'„U!ÑI0·È'où‚yÜ« ñ$‹Ä!'0Pƒ:¬O>«ÖÍðÈdófyýZ{{VBCÀlÄ$Æ_Η֮CtšgÕœÆ\I5a#SÒU,,êDZ1¨É¾!ö¹{wö==zöD@l‚Ax˜…Ô��Î?õÆT´ÇÅ;Ø!Ïi‡ˆØ,ùz¼{:'ÙÐGKìæ|øçÓñå”m¢rPaÏE> +endobj +273 0 obj +<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +274 0 obj +<< /BaseFont /Courier /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +275 0 obj +<< /BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +276 0 obj +<< /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +277 0 obj +<< /BaseFont /Courier-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +278 0 obj +<< /BaseFont /Times-Italic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +279 0 obj +<< /BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +280 0 obj +<< /BaseFont /Times-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +281 0 obj +<< /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +282 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 76 /Subtype /Image /Width 72 /Length 729 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ LHÿÄU !1AQÓaq�‘¡Á2R’ÒS“UÑ"r¢²±3CsÔ5ƒ³EÿÚ?ú”úW4—=kòãû·_ì‚ÇûW]Hñ» :€$̪©òT‰ ¨‘9©nB0r,Õ¸± ¥Ù!…Emʸ|\ÅN°ì~åß×�XÉJF,—«œDcÝ’lЮ@üÔ��`+rpï+ Ð)9²Òœd%Vï% šŽòÛ•qßæ*oºã‡Õ�ˆ;ˆ#2Vi­M‰‡³6'+d̘ƒe§)ΈFÀ!ÝÉ;Î]Q©n›êo"g� 8.(p¼f^Ö‡—-*cfÌW{ÁÒ'†ËÅ“¤K /ù¿)阮�÷ÓÃ!–g—¼Œ2ì×9qžòöÊ@3¿'ðN´Ð…Ȉ}á#[(ËO2ê„/ ¶•Áè�t¼$(Ë‘�ÏV}™{‰]ueÄ{©bw}Iqê18ä»?7qN%ï.Þ-œ×ØO>Ì{‰brð‡jZ4bSðcÛ–�yRt$èM !"fİã>Ä£"M#…S¨‘�438­D/I‘ H¨µ«t¥~m΋RÏ_eÜ3: +™& 3!ƒ»$!vEˆæ +�…�‰ë~�´¼«½21=sÑv—•w¦F%®ø»KË»Ó#×þ—iñÝiÔ�«­‰Fcm)b,]9Ÿõ÷Sĵçþ—iyw:tbZ÷¢m.ÅÎ�Ž¿è›K±sü„ÆÑ×ýhïÙ¹þBÿÙendstream +endobj +283 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 92 /Subtype /Image /Width 108 /Length 1231 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ \lÿÄX + !1AQaq‘±Ñ"2’�Rr¢ÒâS4ÁáBb²Â3“³ð¡‚CsÿÚ?ý¼‹9k€*H%®$Y PœÀe–S#c‹Ã>*Rœ¦ddÀEƒ6˜ƒ…Q>a‘ÄÊ1ÆâGУɌL€•î×±c´ª ƒµI—Ùàm×±¦ä°kÁð&i˜¸à*æ/&f,öb8Ô�žcu…È]½ÙñÇüéqÕ\ò¥Vc)£"4I¿¼V}Úe�»—s¢¶7zÇýd9~Œ¬óVNëRl'Aظ2‰,z¥j[•IJ2•8™C¢Ldãg1HáJ”‹’# Iê!ÜgœT4 j\'–NÛr$· +•Δ$Ç0Ì b1¶;º¦sTR§ÚæÅχ"ß¹o.â0Õl½wW‘yB™µÃ“{3ô÷ ëŧÂ}Fὂâ4í¿œ}ѸîÕ¨W­: 4áLáâj½íãÞˆˆ‹2¾;~‚´ˆˆˆˆŠ*¢ÅXÆ`8'bÛ�è#�|3 |�$ Æ +¢""øõ¾"®Øþ/3(‚×nÖPä.âñkêY�9ƒ+Ë[¦Õ ¨ôKYe£@~"µÙÒ,rD¶ ��)Ç€b»»¶1‰ª" Ï}DD_·Ä×ò£üp^3�f`äF.1áY1 evÐæ b€|ÁÁsa|•rô€!äI° ŠØ�¹Ü­:ìîÞ�]�ãšúˆˆ¾-o‹Þ<¨ÿ5áR�©(Èž„�L ÆÛ[R�“ÉΗß—'¹ ±Ú묻b‘�‹_(}šVÀb»»»§[ɇ×ÐDDEÃW»ÍJ“¨*š„Í{€��¢+,—¶OY>Y/mæzÉòÉ{o3ÖO–OÛyž²|²^ÛÌõ“å’öþ`å]®ëîÆg>|à ™›6¿¼ºQÿÙendstream +endobj +284 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 456 /Subtype /Image /Width 8 /Length 350 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ÈÿÄ/q32ÿÚ?Ô3Õ3Õ3Õ3U3ULÕE µE µE µE ÕE ÕE ÕE ÕE5QDÍTPÍTPÍTPÍTQsU3U3U3U3U3U3U3Õ3U3U3U3U3Õ3Õ3Õ3Õ3Õ3Õ3Õ3Õ3Õ8W^ÅÅÅÅÅÅÅÅx8×àã\W…ãñàåñàçñàçñáyüEx9üÅx9üÅxÿÙendstream +endobj +285 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 16 /Subtype /Image /Width 40 /Length 236 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ (ÿÄ? D’ÒAq�Ñ2‚3ÿÚ?êQp7PN„!kÒùÙ;f€Ó`³JÆÏîÓBz ;J©&aÍ+O1Ü¡9•8¤mó…/Ó&m¾p¯ÿÙendstream +endobj +286 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 832 /Subtype /Image /Width 13 /Length 699 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ @ ÿÄ6q213�!ÿÚ?ê¡�þ˜A0ÎÿL ˜g¦L7¿Ó$aé„ °ô XzaÃ,=0‚a½þ˜A ËL ˜e‡¦L6ÃÓ$aé„ ïô wúaÃ;ý0‚a½þ˜A ÞÿL �m‡¦H6ÃÓ$aé„ °ô ØO$aé„ °žH6ÂxA Û áƒl'„ ±›PH6ÂxA Û áƒl&Ô °›PH6ÆmA ÛµƒlfÔ°›PD6ÂxA Û áƒl'„°›PD6ÂmA Û µƒl'„ °žH:ÆmAëµC¬dÔ°“P@:ÆMAë5C¬dÔ±“PD:ÆMAë5C¬dÔ±“PD:ÆMAë5C¬dÔ±“PD:ÆMAë5C¬dÔ±“P@:ÆMAû5ìdÔ±ÛP@>ÇmAûµìvÔ±“P@>ÆMAûµìvÔ°ÛP@>ÇmAûµìvÔ±ÛS"ö8üå¨ c¶¦D,6ߥäiy†Ûô¼‚Çmú^Ac¶ý/ °Û~—�Xm¥äoÒò ·éy†Ú^Cß¶ý.!ïÛKˆ{öߥÄ=ûiq~Ú\Eݶ–‘öãöÒÂNÍ´¬“³?¶•‘öí¦ ¹à|z?–QøÉ¯«³øÿOÆZüeÿÙendstream +endobj +287 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 5 /Subtype /Image /Width 13 /Length 187 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  ÿÄ3‘‚Â3ÿÚ?§Ûxž9×Ò2J·ÒÄ+_ÿÙendstream +endobj +288 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 5 /Subtype /Image /Width 256 /Length 527 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ"ÿÄe’âSR“T1B‘á!ÿÚ ?÷õ?Š•>u!ÉSÕéTùÔŸ€ÄiÕé´5}‘¿³ô�ºýѲRb`û~´l‰ƒmúѲRaƒmúÑ’& ·ëFÈI‰‚íî#d\oq Âb`›{ˆÙ oq Âb`”.#$0:’\&&Bâ2C¡u Âb`T.£$07Q’p˜˜¨É£y ćÒ¼Œ‘8þ•äd€"qõ+ÈÉ=¥y 'Ó¾Œ‘8ò�ôd€!Çtï£$N;§} uOÈN܉ÇZ<„íÌÂs£ÈNÜÉÇ:<”íÌÅ�ÿÙendstream +endobj +289 0 obj +<< /BitsPerComponent 1 /DecodeParms << /Columns 2352 /K -1 >> /Filter /CCITTFaxDecode /Height 3113 /ImageMask true /Subtype /Image /Width 2352 /Length 68865 >> +stream +ÊeÌÈ*5#ˆíQÚW-¢½J�.tÎÉŽ. îZÃQ+QÚÂ;5G‹#¶¡¦'Íe¬¬S1…M¤� ÞOþý„Ö®w�^½U×éu_®½ÇUõÒ⪫þ•ij¾ŽÆ•)ˆˆ‡ ¡’2thÊ úä‰J£Êƒ^iÐdäC�™ÔËÕš3†|ΤGfb˜Í8}Ž3J|‡C»A a0ƒMF䪥PÔ¨G³¦b4Da£�!Œ Rr ƒ3g"p€ˆ_" Ø_ƒ„Âá”0ƒÒ ¬5 +²ª0˜EÝaêª�¶“¤è¬h«j¡èÙÕŸfØ@”ÌÁS0™Æ XE»·aP�mS¸º6UB=Ùt µT’PÉÑ8Tx¥ô’;Ñ₤¡$éRªV“¥já]$qéi0¾wUARÖyP©=: ´¤úVª‚v]jªøI´Pôqü$SÚJå=-*­éiijéxIôw¤Ú´–¾Ò)éRZõT.Â;×Ah§£�J×KI¤®’ÑÞŽ:KÒ´SÑß¾•¯U•*M¥¥„µÒÒªÒÒ×Ò^©t….Ç´´ª¿Ihã Žô´«t©.©tµµKI!ÒªJתƫJ¨úZKJ’ëJ–’¯IT¸µ Ré~Æ…iWÆ––“IRKT’¬b––•-kù•w¨cj·\ŸµØÇÕU Rª´ºQ)v©%v¶?ôª¼iG].’¤«Õ%ªHb’ô±«ÒÆ©ºT¸T’¯P´—ÒJX„—é7}zÑ4UFׯT†—]$´•R¥K].¾·_éWÕ.ªºÒÿK+m-'õI*¤’¥¥Õ¤—¤©iRí¯ªÿëÒU]*«®G%Õuo¯¥úªÿ­UR× PAV¿íé-U¤’IU*¯KפˆªÕx¶ßTéuUÒZUJ¹!饈$¢ J¿Vþ¿ÿ×ÿ¤–›JY�NÚ_iV—úZ­jLšú—®]|-RUuê¿úZAê•/Â(|B×ÒößIP@‚×A:I/ÒIú¯úë×÷]*­*6´ºïZפ³#Õ¤Ÿ÷èÚèÇ�ÿðŠJ¸"�%¯úúH§æ•>ÿÖa*½R˜XA)…˜]RF=*[³5úYŸ�:1:¥ô�V’Ì/K0•RÒÌ/KÍ™ù…š*Ò¢ý/©EúIk®–«®–•.¾–Ò·^´´›=ß~’J“z­*T´©-uZJµ™év¶ë[UÂKé6—}ij’¥¥Åa(qK¥¥j…C´•[¦Ò°•ö”>?ØKK×KK k¤­¥î“¤ØJ)Â]¬8­$ºVÒ­(QM ’¨ª„µÅD(L6)=°”SaéUT:®¨UE ð•¥ØI{ 6 ESLBªm·[ °„* Ú\&RuPšá°H8L–¡0ƒÄ*j‚<M8… XUÂ…LPA„˜¦¡0ºªbšb©ˆU4Ó ˆCM0š*‹�ÇW 8M6©ª¦ +¨X$|r¹† D0B Ê[–õÁ°�|©²n­¤[ˆÖûÿÞ•ïR˜_V•:m&ÒÚA’´!ÕŠ P8ÄGÿ�j�\¦ÀØrÖN mÿ ¶Í5’Ò)`/-`¶$›�¨,L‰� �|†HѱÿÿÿÿÿÿÿÿÿÿÿòIÔ¦ELìÒ+šHŒÙAkŠeV+“‰äÂ…ñ… +d• +�Õ©h €n¤CÈ“ý'd5°8ÿÝÔ_K¾ÿùGtÿîÖd �¤¿ÿUÌŠ‘%ÍV¦¿!� ÔAyõ)? ‘ ¦HgCL¤d‚O8gAHÌ¡(­�b‚"œöI@3@™á¢Á0dŒÃÉ·-ç2YÆE†UŒ SAJQ›$DÍÆ3ÆÐEÜ„ÀDsÐ!ÃG°Ñ ИFË'ä¼×» ÒP��„hjžÚ6xZ µOäÞa Øðˆ¨: áà™W£Û»hÖÂ5Ѭ5 ¦zžß±T�t} Ú Ý&ÂNÉ�£ÃI†î“ ›BÒt�Û ¤ûL³ ØCý´Õ Þ� Rt é8A6ˆ°Ù3Â_»IZòsZ·,"÷¬]-ßt­„–º éñÐN·'k쟦¬û +“vØUtµ}ÖÐ'iwÿKQi_KQ}µ¿Qý¥zßK½.›qûô·¤×ø÷Š�oî—ï_õÿýqý¡¸Ð×O_¥¯þÝZwHiÞÐïCi¿¯ík¾¸xðÿ_¹c‚ÔwLJ¥Óßÿ_íaÖ8/Ü|xxðý‡ü±¾ÃQÿÖ¿ÿí/ørë †�ÿ¯él=aü?ÿaÖ’þÃ�_ûý~ÃØpÿõöõaêxPÃÿöëà¡»ÿÿuúþÃÛ ?ý?úaἇ·‚3ÛÿðßàŒÿñ ËÿÛE=ÿo †ÿðIÿP‚Ãz ÒÁÿü=ö‚IÃ}ïÿÕºþÿÁ°÷þ‚ýºK„œ7¥¿÷áýÂ_®oºÿ~¿ÿ†íÃÿá/᥽¥¾–ÿÝû×Òý¿_ïL¿ï»¿ÿû®þ¾¿û~sï×õS›ï·ÿ‡ ûüòÛ:§1÷þ«ÿœýs›þsÿïööÿÿKozþÿíþµÿ·÷ÿÖ¿ë¥zõ~ÙŸ}ÕŸ¶ÌûO»ÂuÚv—ýýoûØgûJêÏÿÝ‚ï"ޤ² âë/H®®cOa‚L„é1 b¬6š²PÅ´“´Ãi þÖŸmžôý&*ëH1I«"æG 4ú{A&“°Òb¡péŠM6!0¶(0‚ 0�ÓN��´Ø«þÒi¦¤ÓM†C ÔSÒiÂM§¾˜M1£[„Ó# &ƒ@É+£EqH0˜ hÓÈÖ#+""#»Cñâ�n{†42~xlX0@ Ñ­JØ8ˆ0EšVùfCÿëúø_„¿þ¾?ÿÿÿÿÿÿÿòÔŽò2¾YÕÆBR‘�Uù7PÎý•¶v¬Cb%õ)#´»ÿþ}ñéÿáÿÿ¢ø¾‡ßÿÿÿ }úkó!/ÿµ×ãˆþ¿+�DT²nGãøÿëò±3 +g�2qNŒÐ1¤O¿�™|SÙ)Ë¢´f£(nÉ›3¨Î¤H"!Å$ ™6gA}Ü5°Ÿè»w£c×$â(y.Ê$26^lˆAJAM3fu BEN “Œ #@0Œ8Dv™§„Ö»`‹€aÙó“™¡„l~ao¬Þæ÷è¾Ζ‚ úMè„ɲ$Ÿš �Ñ? x#8fÄ8að™F�m„64nie$�:¦�m.�в8zMÉ@h& ÂM» ƒ¤Ã“9ÐMûÛ§úuô›¾Ÿðš64‡M.˜Aé6¤ŸÑ¡…Pêáa¤ÚV–©: á¤ÚºéA7i7ÚZO^êéo ´¯û¯é7úM§«òg#¶“iaUÓ8Z]IûuJ’xA´­+I×M¥x¨®Þ¾µt·ñ[ëþŒÿÛÿFwÿ3üw„éZ_ôú[¥�·ãbÓkúïnûw½?Ú qû¡þÿý!ÿIûÿ¯×ÔZoûï­î÷�Hák{Û^á¿z[ê?ÃD=ÿ�íÖô¿ÿé¿ï½¿Ý·†ï ·Jïýô!çøMÇïËÚ.¿ðå‹}mþ—Òÿ^ü�Sü±Éû¼‡ÿ ƒî]E×ö®Ãaÿ®úKì?ÿÓzN¿ÿþÞ?ô‡ø{êÝ0ÿØmïÿ°÷öÿÿíÿýx¨¯éÿÿ ?ÿöÿ][ÿm‡ÿûá°ßÿþKÏàßÿþ«õ¿ý¼†_ÿá¿Á÷A¿ðØoÿððá¿ÿûKðßýþæ¬Úÿ ÿøÿðßén ßø6ûü7þÿz ÷¿þ‡¥÷÷ííÿßá¿Ð_Oþáú¿÷Õºwÿo­×÷ÿÿÿ’5þ·Íïÿþ­vÿ¿®Ýùäÿ«˜O]~­Úþy;·æ›ßõšmxÿý»ÿ]|�?ùÍÈ4ý7¿¯¤Ýûû]¾¶þÕûéíé7úïþßœë¯_ÿú¿VÍf�ûuÓ­¥÷×f}¤ÙžÞ½¶“gÿÛ>¿ÿÚ_í¥¾—ûf‰ÿõý«£—ý¯V•¤ÚMÃô­+JêÒ[KlÁé0Á&ºEpØî˜`¬‹”ØúMÿ¶¿í¥ì4»í†‡÷V—"¸}¥}ªwV–‚ … ¦( í- Ú ´®“´¬1 +LS äw‘GLB…i†ÿ�K°ÂI7ìVì{"ã ±±¦ØJÐ\-í,a;M‘Ž˜«I¦d¡lqAŠbƒ#óaXUˆH«a…* `�‚ 4 æ¶ !žàÁzzß BªiØM4ÂØ^A’°­ˆQ#Ùñ5AŠjWg‰�°Â„\ÄDDÆ‹Ýe4+Ì�™ ™eîïÓ¯ÿvÒÒÖÿÅu×tœ}E×Öݧ¡®·ÛqC»Ž½wwݯüŽîõ×¼uíG]~èvõ¡Þú«oûòÇ"øpÑc‘Ïõõÿÿ![¥{µãúCîˆ%uÛ®Bœ¼·+@ßê¿ÿŇÕ¿ÿÿE›Gÿÿ,«òÉÿ]œ?ñaþ¿ÿé0ØÿßÿÿÿõÒUý~ëÛÿaÿÿûûa¿ÿÿÿÿÿê߯à¾ëá¿öÿÿÿðØoÿÿÿþÿþÏÒÁÿ¢¯ýxoüÿÿþÆÿÿÿÿÿÿ¥†ÐXA…ýµì?øoû¿ý|;ÿ·_ÿÿÿü ¸…¥ý¥üW·ßoûÿÿ¶ïwúÿÿûÿômZÿ¥ß[o¿ÿÛ¥ÿ^uóÛû×ÿÿÿ÷× uûz¾þuë½³¦×íßþ–ßô÷ö¿ÿþÙšÿÿÛzýš%ïöÍíögëýŸÛKï]³ýÕ«göí[¯_½²÷l4ÿëêÈ?³5¶•„ »}†ël&ØJé4Óa«¤ž¶’±ZV“ƃt�i¦šjœBL&Ä/¦ŸÈ® �åÃa¦› Á1Ò ˆVMŒ1 †’i¦ ÃA&šz Ó �Ò†ÈúZÞš{W†¾�¦œ.Ú§M*h2P˜a1 %a#hšR® bñE ¢„A„ h˜oäßMyVÑXØC= ÁÊÉÙ<·)b#òÈyÄF¿«¯Ì’@7ªüv’_õûa¾Å`žAl�”2»,…¹Ùâe�§ÄDÿ_~Ÿï­þÕé׿§ûÕ?ß[ýªÙk–ÿÔ³ c±&dµ­ÞY•ˆlEÉ-®×ãõÃýSEá>õÿï…OïõOëó²þ9�þvïT÷}uÌ9o™ÌùœÎæsD}s³$DDΈ—ÈùÝ’ç#TE N§Iôõ‡„áË!¢;¨Ê™’…ç.Ž‚¢' è2+˜#ÄC d0�0E<œÈð,3A xÀÂ,pÑ2�‚]œó¸h„™ <,GÄrnª!@¦¨Þn1’'FÙ�‘â ”fla$EÈŽ,�Ó ùÉL÷ðƒ» „Õ4Â40‹‚/Ÿ¨è  £õSA~I¾�L=&Ñ®±šIÅ2\li¦˜L&��ª Òaª¸j°� Ü$òg#º °¨ŽØF†“i‚PÒÒm&Õ´E¶“ –¢fÒÃM%l´&ÿé:M„0Ði&ÐÂ#²-´›AœÆ“hŒtÕvîû¼&ÒµAD'KªWKIµú„ûûjý%é7ÿÝ+“�Ih“á0�+J´›§ÿQëýÚ_M}½5´¯úÛ]uú�í=*tOë»N¯CÕÓû©+µõí¡Öºúÿ×è}_ÿCqÕ ÇwÈáZú·mkþñOö?ËŠ_×,rG}¿Çº—‡Q_ÿXë¾Xähõ¢_ÿý‡ú,KõúCêÞ0þ¿ÕÕ!öÿì5ÒÇþXÏíö—×Ãÿÿ]/ýXÿ¯_ÿøuÿÿÿû×þÿêÝøoÿðFÚÿÿÃÛ­þÿûÿ ÿÿ‚3Ý/ÿ ÿþ_Wÿü7úïÿÿí¯þûÿAlWÿ‡ûÿIõþ¿áïëÿ¿®¾¿ðÿÿá.ÿn�ÿÿKbŸmáý´¿ÿ÷^ß¿ïþ¸F©ß­¿é¯ÿßã¿öþïßÿ<¿ïÿ×}é³§ûë´û×ü›©-½ÿÿ÷¯þõÿoýVf�ö¹§þõþ½™®ÒÿÞßMšíš/í-£òþ·Göþßd1Í&á¶“ $ëVÒl½ña¦ÙyµÿõgýØi/jØKö×ïµbõÙ)±I§k †ÛÅ7 Šm$í´¢A§#‹LBŠ  ¿ö“»ši¦ÅÓL6‚AúÓdqaÓtL0“MS¦­„Èá0ÂdPm0Å5Û Ä0˜LWþ(4ƒ Ò VÚ¿ŠN¨"î¡Ê¶Â‚ ‘á„HåcÚ¼œÄD!„XE‘ oþ )sµ¼DDUÄGþ"=$ÿú]/úÕ×ÿ])d_�‘æòÎTi6–óÝ®,V¿Ñn4ìGíPëñÿßÚ×ÿûû_ýõ¯ïÿö¿å¬™ Úü´3²Øïâ+AoîMÔ™ÚY„Â…3Âÿú]>Ÿ¾¿}ZwÝßÿ¾=~dOï·^‘Ø¿ã��fA?ÿ‘°É ¯×õ]yn!µÿÿ• R5œ‹Ä}N¤u<˜e; du2�®r5ÿ*Ì©Ò5–¤ ˆ†fÂçÔÈØpD_“å „„m¢% +‚| Ÿ6EŒ + ‘˜h„˜"ø"î"9‚43‹˜A„h¡¢¡Öÿ.(A“†`�Ì#X¤BqàŸšÃ(‚ ä&A¬Æ ÌÎ×Ï5´ÓL*£[Pš>U4 µO@˜h'H6“hZ74� þí¤ßþ-¦�� ÚOÚi0дgrg"ÃI´µIøH Ú&q¥¢;jðÎM„6Z¥¥„›DcÒa¤þËCt›ÿ&¸Ý—Í&ÂM¤élº�I´Kƒw‚t­']øKh”^N*è'Q¦Ö䣥î¯O ¥ñQ~×Ë\KÿM¥rQJý'zi[ëýuõ$›¡ñ­Ûéºm¡ý.´…Æ›¿§‹ÿþÚ«BºZûC[Ný:[Þ’ïµ[]î¿¡¯ZëÝþ¿ÿÞ>:ëõmÿú_½-¿ÇøM¿,rgâ¿MÁÁÿ,ÙÿýtC�QnI=oÿÿå‰ýƒÒ¯õöé zZí°ÿÿÿܱn+××ÿé~Ã�ר{¯ÿ¯û ¿ÿÿ»þ¿ÿÿßûwÿ…öÿÿðFþ ÿÿÿÿaýÿÿýõ†å»ÿÁ> ÿýøAwøl7ÿÿÿýÿ÷ÿÿø~ÿúïÿzOíáÃÿÿÿÿKÿÿÿÿ»á/ßJÿI_éßûÿÿWØKÿÿÿnï}½/õ÷ý/»×¿S{˜OÿÿýÖÿzÿë9ý¾þ¿œþ›þßööëïý¿ÿû{k¿ö¿þÝÿíÝÿúº^Ùþýoum.¯ìýÿõI³?lÍjÞ»i}Ùý¿ºÛm%³ +ì?´­&é6ËÍ« 9pÛ=í¥uieäöKÿ÷V’v¶Ü0�ÛÒzl‹�CºKm¤ƒcNG 5Ò´h$â˜áa�Ú +Ò´˜„šaˆ_ÿ°‚ RaŠb©‘Óa„iÝ&› ‘¶4ì0Â[ +Útá±QAŽÚ É@L&ƒñ†)Š �žáØaþw“ +ØTá¨S[G¶©á£Û4à ¬`ÁD!Ä#µš\‹Úšÿùo²ª1ÿ�ÿÿÿÿÿÿÿÿü¬G"Q…4•²3É|â=’3Á¢™äù¦|_þÕ0�÷ÈaIÁÂvfí8za;NÐÿáŽë $]‡ÿóxh¼ÒFçÿªóMͳ<ÜÉÂmô»öÐAÛôŸÿ»M[ÿ·«Úþ»«zôÿÿÌ='ÿ¿M÷÷íÓ}ÿÿÚ0ôºkþÞ“ó¾¸"<þ—ÎúÇÿëïÿâë¯Oíîë­ÿó?]Òÿÿ}ÿÕß}ÿý®—È>ëýúëý¿ÿ¯duÿ}¼Ì_þÈ&¯ÿýz ˆGÿׯ¿ÿßþû¨7ÿíÒ§üÛ1þ‹×}ÿ¯ý÷šŸÿÿçKþµõþß÷õíÿöÿßÿû$~ÿ¶ÿþôÿý'Z,r‡ÿÿ~+ÿKIŽ3ßÿïôiZÿëmcý�Ûë¿ÿãÒßòlgý§÷ÒÒßÿþ¾í|/ÒÛK¯õm.›_ÿwW`ÂÈcui]¤ÿ¼S +ì4¿ýëÙ +ÿüS þ*¿xLB§bûO\' ¿¬0¨ZÚ /ò¸Ù–åkåq#oð¿ÿÿÿå¾f²RYBÿù\ËF}�CfãXeƒÏŸÿÓM!aá’ÀšI´>¿þƒ8i[,éÚI†‰?…ÿút½Þ’éô¿þÖ«ÞªÞ:_ÿÞ=ï­ô¿ùÞ¬Œd¯'ËÆ ùuïI[ô¿ù$38é7Ä¥½ÿÚò€\ÌS¨¦™×'ÎFÃøA„zWÿöµü_ 'jºÿ”¡¢XÑxý,Ñÿï)Úÿó[EóEð~–O°PM¤ ú[ÿ~¯_Í´“h'ô¿ÿI´ŸÒÿý¿_ûý6“~—ÿêõ®—ÿñLSi{Iöý/ÿëÛô¿öö¿öÿ¶—éÿ¶—é÷í7^ÿKßÒÿý}þ¿öÏûî—ÙûÿWëÿý}ñêØI‘HNÚJ�ß÷_�ÿÿþÿMÅWM¤ƒNÿÿíÿÿýroü#ÛFˆa‹+3ÜŸÿòßÿÿÿMÿ@Êk”þ¿Óÿ¶º½_â?öý[ÿÿ«ýÿÿéuÿÿ{¯·ÿÛKý¿ÿÝn¾úÿí¥íÿÿi6¾ýÿm+_¿ÿÛI´¬Ü­ëýµm/ÿئ*!÷¿öIŠ�H·ÿûL-߯ìB /w¯ñ aˆ�Ä0�‚ñˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøñÿÿÿÿÿ™äÜ_ÿÿþëë¿ÿßþŸ¯ÿý××ÿ¿ý?_÷ÿ§ëÿÿtý9o,ÓXæÂv× Ãøå”«2ÎÄŠ�äÙT ™V½ÿéZÿL„š /;_÷r,:_ÿ×ëKÿê©ÿN«­ÔkS¼¨ë)ï üéŒÍ�E ÌÉÌÖeÈœB Taä`‡P�)BKÉ�AæÎ�N¦|¿ùN3B=¢™¡ „„Âa0†(!P[†‚Â,vnÂ.¢á¨L"o6Dð0šÿèÓOCOMB.Þª"wI µÂ °“a+ +× ÂMªÿÕB¨2,êB^èï :LK« :ZMÒØP¨,ªÿýý#ÇGt©]#=--*]-uÂM$¸K�èÏZÕ´wHïÿé%U¤•%£=-PI%®––ª–“I4Õ,%Õ$´•¥¤ÿô:×­k¦—ÿé$—ÒëHT~—­Z kõ­ñú*I*¤’Ö½uÖ’K¤…$†«IF(ò/¤µI$1UZ×Iii$ºUUT¢­}Òô¿…U¬BKýRõé.’Òô´¿ÿKI.¡פ¿ �ô•J—¤¿ÿ÷] +´µ§IJ¼BX‚I%õþIWÐézI!©iR¶”ô× „d:Õis$yŽó‘ú7ªKI/" ÕêEO¬�:DP‹UþMƼßXzÞ¾«­URZID*_ÿT‘Ç^•Xj¬FÄq¨Ã¯Gt´½%£¼ÆŒà´¿ÕkK1ÑÅ눪ÚJ�YŽŽ$’Ìu’—‚¥øåÙG’P«(^–ºõWÚýW×UûZúFJ’v’^“auÂ;×ÒZT�/¿Ö–––––é.’ ¬,iê·k¥au°’V”V–—ªÚX¨«X¨¤¬.—T) «Iwa&ÐQ ´¶*¢�$¯×p¡D(P¶!'Ô&H`�I¦ÅD&*˜ª¨TÚ îø uUUM+U + Âl ÂaS aS1 +¿ºÂ¨L* Â]ªj¬0¥½æ&a0ƒZa4!µUE –š€ßß�¾û¨7ªªH†%÷÷ï¾ú®›«ím×}ÛKþÁ¥ªª!_|´-½ˆÇ&á`j å¸PAGäÙ-rÜ|Ða�[VâÙäÛ‹öBØký¦ÜÉYiõÿ¶×ýq¯ÿÿ¥%Qü”¢ZÉ›5¢�N¥ýrp€ˆGž"r90ˆJòS# …8`ƒ9HY�F’¯ý"Ý„Nš„Ô&pÂa5Eà +œhœ?ô�A6Mª„›U +M¨GxdT ÿÕ –ÑÇÒ;ªXTw£Åp©n¯ÿIm*IÖšGŠ3Ò�Ž’ÒÂZ3¤º·ÿH$´´½U.©P_Z¤µé/_Õ©*ŠIWéRT…i~1_cþÁZUãB†*•iRI%÷þ5I--aURª´•_ý$•t½RÿAz·ýaéWªIa•$©~Ãÿ¼BT’ý_ÄISÿírëò ¥.B×Õ¿é<‹_T’©Ťˆ¥ÒíÿúÒ¥×ëúßÿ}.Žô�õתY…Fósÿ§²…ªIQ¿KÊ=$‚0ò�IW·þ·®Œ?K j•ª^–•~•ÿ÷p–•F…in‚ë« +ºZ][´¬$°¡! °ºÃmʺþ�±LBê©&!%Ó]7_Áà &ª©­…Õ0¶ ˆ_䟰˜JÂj†‹@ÂF²þ""9k †ÿ×ÿúÿÿ×õþŸôÿ‚äçþ#ÿÿÿÿÿÿÿÿæA…=�‚|ì+$#ÈÔŒÇ�‚³H䲃ý¦ªÚ�"M¿û‡öÒùxÁ-ƒuæ«Í?í/ à¼¥û]ýÿÛ; &Á½ïöÒÿØm¥úÿí/ð\"‡ ¹›ÿÿïÿGp�»ÿ¯Ø¯Öšÿ°K-5,ÈÑv¾Ò |ƒåâ²mñ‘,dµÀ¡?ü`È`\â¤1±ÿ÷–ãçóØP¦@Œ(S±+2v¿û; /!wžj¼Óy]lH®¿ýúüÔ`úŸéï†a?¿¿ôÿÁ½‹õ¾ßûµµí~g¶ËÙ ÿ¯Ýüì||ì¾v'ãô›ÿ[ïÿÿ_Uþ¿þ)7ÿÿúùQ)Ùõ5ù'´S³»2Ÿý7ú]?ë¥ù"#G�ˆ§21Œ—#©�.Hª3"P‰Y~D ®'Ǭª¸ dâÑÃDA‡²S(˜4BL\`ƒ"¶|Pƒ3Éâ£0aQ!ô®ÿÖû#²õ›®Eà�f‘s˜ ‡#83L Â.FpÂ3† 5ð�lÓMÚhÖÉäѯ¶rôkhØÔ'gõ Éù:��Ä4~a5FÀÂ/ á9ƒ4—FÆ‘ãêö{â´›â.!ñ_¥ê‚Ã%‰¤�5A6“„l �&&ÂA6É¡ÐÒpÉðL%ð‚m&DXrg¢;né6ËBn_°”44›A;º¡¤ÚO鸾ºÚ¯Òl&]¤ôÓI8WI´�'I´Ÿ[Dž»¥hŒ~û´¾®“Á6ê‚}Ò½&ö×D¢•¯ê‰E+KôæƒÇ-Å�Ò÷Kwÿ~×]Z[ëv«ÕºiEÛ_Ò¥½÷ÿ_Åzw÷Uøˆ�Çô+Þ’[Št41Ú— �}m~ÿCM¿í?©/Mö†5ýÞ:ÿõ½nß[KZªú´>­¼7´¿Uÿø‚×ÞXà©ô_ôˆyÿòÈ�¯}Ë×-=GÿØwÿÿÿþ‹Iß¼yu~]_ÿÿºj¾ª—Ö¿ðÞÿýÿÿÿ÷¯ÿÿÿø_ï¥ÿÿÿðÃÑOKÿÿÿÿýÿÿÿà‹û¢¡¨#òþuŸü6Úõ÷ÿÿÿÿÿÿÿÿôþ½úOßÞ‚ÿÃûkÿÿÿ÷ÿWßÿÿÿÐ_íú¥ú]ÿá/ü;uÿúÿÿþº¿ßÿwÿõûâ˜ÒûKw½ÿúÞý·ÿÿ··ýîÿþÿÿ_}ªÿU»û×Û\¡o_·×ÿÿõ×ÝÿíßÿõïÝWoÛm½³Eë½wïýºÿûjÙ:ÛKVöÛí}·ÿÿíïVžÙŸ§m¶íoËùµj·UþÙý´¾ï¾Û›0�t˜g»³Ûkv·g¸wýVE=´éäAÃM† Hƒ†Ã70ÍÌ0ªÃ–EqLm¥zOI¦¬Si-².SM�Š�´¡ ˜¤Ã!i¦¦?è4'A±ôÂiÄ&AŠb˜„˜b�l*„AتuM0Âl#¡„ØI‘ôÕ’» „Ø"‡ +THè$ÂM‚do`ªÓh2Võ™ÛM&ÉXB,&‰àÂa4 0@•Œ0HøÄA„„kÃGqÊ*Z±!›Œ ÿ-Q�ÿÿÿÿÿÿÐ×øÿÿÿÿÿÿÿÿÿÿÿÿå˜Te¹fI/å¸äU#µ(®IËqˆ„w…%õ##±‘Ù”¨÷ ÿôœ:Þµ¿ýGÿ¯ÿÿûZBÿÿ"~W1�”y)ÿ뮾ºÿÿÎÕË�lêj™ ˆ“ QÖ#2‘È™•2Ê s‘¨ÿ© gDn͘D%ºdˆ"ÒFѳ‹0‡ýõõë–ùfÃÿûúþ¿ÿ×ÿÿû¿o×õÿöÛ­ô¿¿ÿÿÿë¯í¥ÿûÿM/õÿÿ_ÿøÿÿÿ“ßþÃÛ¯úÿü7ÿhïÉ üˆÿû¯ÿÿÿÿøIÿð‚ÛKöÒÿü7þû¤ýÿÿºÿÿrÌSÿÿÿáú b¿bÿáïý+Ò~ô¿ÿ¯ïÿå’?×ÿn½ýt ù‡_ÿ¿ûR_Ú_õ¶¬Výþþ÷þ¿_Kÿ×Fð�ÿþkNé}4«¶Þµëõ]ï÷{ûK×ßõ_ÿUÿÿý{ýÿýëm_~ÿoûý×Ú_¯ÿòOÈ8†¿ûtÚKtúí™íÚwÚÛ×Ú¶gßÙõ×m+ÒÛ1·WØGpØjžÃ°Šûeï´ž¯/=Hƒ†› a›r í}%m*¶+ d\« �¦Ú m$âƒiÓb½0šiÉ]´§lá4BN“ ‚lU;é±AŠa:ià ´�6E‹š†˜bÂlRS°JÚb¾š4û¶š’v°îyÚjV4{´ŠÆŠ»#¨BEÃa´Ñ< `˜DdŠâ«„kƒ(®a¡#Û'A…ÔCD1" ©VtDE äÛÐÑd[ Ó±]\¤ëÿÒëëu¥Ó»I´¯ì0I‘º^¡ˆAˆ$;•�â=wuó9ž�}-ë…ˆãÿÿÿš²Fu ÍQ=ÚG RÔËÚí¯-’dä&m™º@fE‘ÝÝëµè#»;4•!BöÒÞ½/ý/ýûiz�û¨»÷K¿Ò§ÿûin—çzc�ˆì×!=/ÿ±_®ºÿö+¯_M?ÍQ—ù"ÿÚß�sbäÃ,a¨j‰’¨Ö0¤˜Èƒ:§L�ãDMH�6D1 qIÆj#ÆC—Í‘ÔBtm¢$ÁšÙž`� R„lŽ‚ „ æo<‹Ç„ÿþ‚/»'Â0‹€Ñ<”ÍÂ0áÈO9Ë€Ê ˜Fw“脹ãÐÖðš5Ñí„hfpL&��BhÙM;F¶O&©¦� &š5†��áR6?úó‚t›BÑá ›�‘uM#ÎMê‚ ª<4›Õ“¢i-– ™Ã8iÂAÒÑ(öÒm]„„93 ÃCDpE¶–¨ðÒ“zM´ÒMý>ý],"< Òm—K¦}¤î!Rm6Òð­=$îôé_¤ðL;K@ƒjÜ“¦’tJ(&¤ø¶–—¥ô—ô�hÎÿÕÚiµ¾ÿKþ÷Kßz_éÕ=cúMÿðëk×­úÞ¿~ñÿä8€ÇßD8=È%:ßøÿËŒ½èz,r3ú·¤ß°ÇþXý}ÿt¿ùf_å�ÝOëÿý,yc5�ëÖþþ¿÷þßÿô¿êÃëÿ¯ýýýµþ“}?†ÿÿÿÿ¯íÿþÿÿÿü"‡ÿÿ_Öô›ä0l"hÈïýïëÿòyÿÔƒÿý´UÿÿÿÿŸÿõÿOÖî  Ÿÿÿÿ¯KÿI_ÿ ÿú_ßí×ñDD:_ïÿëáþÅ%ÿnÚ÷÷ïÿþ—ý÷ÿt¿ïÿ¿oÿþ’ÿ«t—ÿ«÷¯ô¿Úÿúÿÿíÿ^¿ï¯þIúÿ·¯ö¿ê¿mííÿ&èõÿoÿý×ÿï_ý³O¯þÌ×Mû×þ¾Ý™®Ífþµý³4·û¶ëõï6žÂva_m¥uaýµ´›?éÚV¿ap~Ã=6»a&›K?~ÖD4ý† m‘ëM[6Ù6•§"¸5Xê‚�‘q«iC0eÒ¦›i1IØm �ªlB¢é4ئ)6*˜¤ïíÓ ÓM6!Ø­4é0ÚI¦Âi4Ø[M0šM6ÓŠiá…  + ¶VÓ§°Â + ' +¯²:Ô£™Ú3°ÂGÆÔ4ec žØdÐVec&õ�„å!UÄ`�B" Ö‹"€ßË1DDhDÿ;*ˆÈÖkòP�#Q‘‚4ÔŽ¢“¬ÖÌ9 S0\0A„¤—Í`�0ƒC  Ó¾Ða„Ðh?ýØDì2F‹ÀÂ.ØDì?›ÜÔh¾e á£sF÷‚þiç;„ÐM¤Aÿotm$é6“}Cû~“é7MÓþþ­ôÚN“ô ÿÛI½]-&ÿ÷§Ò÷ÛË5"ÿÿÓ{ÿÿ¤þÚB—�ÿI¿Ò›ÿ×½/Ûÿé~—ÿëÿï×ýzÿÿ¬%_ÿþ*:úŠŠÿÿýÿÿWÿÿùuúÿëóTjÿÿT¿þÿöïõÈ}ÿÿ÷\‘ÿû~º_÷zïozÿÛKööÿÿkéiZÿÿ¶––—ÿmvööÒÿÛK´›Iµÿö–ÚV•¯þÚ[jÚ¶•ÿ¶Òá„› 0Á)´¿¶ÅlSÅH#:³³ÿج1LPb×Ma„Âa9\-Šâ¬)o]ëà aCˆˆ0B íÆÈ™ +Kçd’Ÿjîß-Ëaô×ðÿÑ|__ßü-Ýýßaß;3Ç2+ü~?®¿ü%™)Dƒ\“Žý‘4J²ŸÉtv-¢"ÿœ2R�R@΃ˆ �2cr0@@Îe@ˆ8†� Ó ˜Í‘â#0ÁGÈØ„ò ‘˜#ƒ(Í�C8eó„I£LÀÎ 0‚/àÃÿ„Ê4hhÖÂ6pÏÈÖZí¦r6B6ÉÌ5Ñò��>š65 „ÑùªhØÂ64�µM4ÓѱÅRi¦F¶d|ð� PAÐN“h'e¢‚l'<4µKIÝÒut›IÙh ó&Ó•`Î0“ &Òp‚a„Â<ÐfËI°ðATðÎ4´�&ÿÄ' +®®•¤ú«xºN¸¥oâ�¥xõþ-6¸DqJÒ÷ªáô­ëÚmz¥ÿÓ~6+«¾“{kê­zê·Ój›×M‡Òt­§}õÛ]ë­_Oýo|ië¿[ÚC÷;ý}z�E[{ãm'߯Ðÿûƈ$ÿMÖ¾Ãý‡ ä¨òÜ�é·E¹B_þŸE¹IÅ�òܦæÿ ƒ—Zÿÿá×Á°ñaÿ�ÿâ•ÿ‹_ÿXóµ Á‘€Öv8iCT†GPÒ:†™Ð4Ρ¤u ÿì;××ÿØkí°öÿÿÿÿÿ÷ÿV×™)†‘Ô4Ž¡¤u 3 i�CHêgPÒS¨iúÿÿá°Ãÿÿü7øm½‡ÿÿÿÿÿßù;#¾¿ÿ×þý4Èc +rRþÿÿønü6ƒÿÿÿÿ÷ýÿ °ÚKþ™ ÇLŸ•¢-Ê¢n!þ ÷ïÿá¾ðØo ÿÿÝÿÿh§ér:e’ÿü8{þëÿwðïoýÿ×oÿÿ«ÿ¥£jÿÿ¾ßë÷ï—ß:ïÿû®öõÿ[i7þºÿÿ9¹/íþÿ¿œé¿9×·ÿ·ýý·kþ¾•ÿú·ÿþ›Û4Mý¥íÿßûtÙžÚ_¶gþém™öh›¯úÛ3öÿõdÙŸÿûKJÒaž¯n¯‡÷Mž›NëJ]6^^Â]íÒl0­‚N’zz[ $ý>EpØpÁ/„ÓM6ÖÒ … ©m$ÓcM´ƒÈâØJÒ T4¢“L1I„Ðm„lB S $Ó» M4ÓA°» Búié±LBaI±Ka’½Èº‚j¢Âd`aO ,=¹ã*áŽx†`�“Aâ� Ó¢9#aT +QÎghöÍ$hÓSÎ_&êЈ†FJ¬­ç\›hÌ’aÇå­m_úÿô¿õý´¾¬‡6#Ða…ô|cñÿÿÿÿÿÿÿ帿›äÜËÍ÷¤MÁc""¸È¤"¿ÅtºÃÕ½B… +Þ•Çc ¸ŠˆÿIþûîî¢ÕïÚÿêŸ[™§%^¸�ýuëîÖ¿ÿònšžr5O³Q <ã:še!”ñ Ê�¥�â$ȉÌ’ræG‡ÃáPRr)h"ÒP)FÈñ�Å("@ÈÊÃ:’ëÐ  0‹€Í0ƒ0E»Ð!:`Œí…ÏšA0‹¶K‘óF†��6�l£L#XeóÒa>B.Á£CÑ­•a0ƒÐѬ‹ÆòÝ£YsCL Â6nè'I‡¢­ ›BÑ� �´�„{i7&¡6†‚a‡tt˜aÉ�ÂLhi6ÓA+A8AxA6,ñGºN“AQN“an“úWIÓI´Oƒm+IÃ�º[ú#—ººZ»I6‰EiŽ—zÝ+ûÛ¬Xm®µPM­/ ´½x¤ý­îýâûi>—M-þ+uënÒO5_â­$ú§õÖ“ûÓÖÖ“ÝíFž7kR8[믭¡�î5ún‡Ükn®†½ Ýúýß^¿ÿV—¯èpÿKÇuøh‚F½w÷Xj?,r*�ãÿ_�ºúáïËOùu‡ø¯òļ9uÿþ¡ëãÿÿÿýwØÿì?ýØûúZ¶§†Ã×Ký[KöéûL?ÿöÿ_ÿ ÿþß‚ô¡µãÿü‡ÿú‚úÿ ÿÿ†ÿ4Ÿ)7ÿ ÿþÚ QâÚ¸o÷þ‚ÛA~ÚA?úÃÿÿƒ¥éá¿ýw a/¡ õÿøKb¿m—÷ÝÃÿÛþ^û÷»ÿèt¸ná/ô¹«þ)~ÿ§¿¿÷ÿÿÿ}ýü+®ïz÷ÿá/ ¾Zã¯ÿöΩÿ__oÎnßö—_ä¾í¯ÿë¥ÿÿõi¿oÿÿÿ^ÝzÛ÷®«é¶N¿õdnt~C„¯·í[3^Ùšý†´¯õ¿Û?ÝÚ°Ï«»µ¹ w WL3Õ¦G[ ¿ì r÷{‚VÓ–SP6:a…Oa‚ª{`•Ô‹�dW ‘S†i±Lm¤Èy�0ÚJÝÈà>ÕŠ°Ú±IªiÈá6©¦Ü•Ó¶9� CI†b“ ± 4ÐlU‚ „šl'kÂlŽ1A ÉZ ¶‚AØM…´Åºl-4öÚki´Õ¦Èáv!+>R±Êº+0AŠ Oy\V!Á 9r„‚a(`DU!êQâ" Í!B‘H“x ñ‹ óâ¿z_ÿK¤¾Y¹Q�Á:_Z_ô’´›Aa¤ +ÚV—ðÈBÔ Å TÄDÿÿÿÿɵä¦"kù ÆH�äã':g"Œàs@ÁÀçÃâxàs@Á¶O" jV'�ɘÿÃI>Â[[Ó«ïýaí­ÿ½þ]¹‡&ëùpå¹ )mþAòëÿשó;4“b¸kÿoý½ßþ+Û_öÿÿÿïµkßÿëþ­¿õïÿÿþ›þõÓµ×ÿEŒuèµµù«5FªßóUmô¿¿Úý¢¨‡;KGc¢)äM?ÿþëWÿþßþÿýÿšcŽ+ÚúÿÒÿrGûõïÿ¿ú_¯®ªºýÛ¯_÷Òÿ�KØöÿI¿Ôìb#¬¨ÉLKVR2L“":žkÉY�—”�2A&™Ð³mN†A³¡ÿÿ^ÿØÿýÿßõÕüì“0GˆüOêGdf`� @K +DviD‰PŠs ”(à‹ÄŒ aæ�@ÁÂ3„G‰@Ñ ç‚|g�Ñ�„™¬< ɉ3x‘„Fpô¸÷_ß]}ô¿þ´­uL&Éy9üü¡0š74…Í)í¥¦ša„ÐA´k¸T †˜Mú¦‚m!aªzj“ �“&=&Ž ¤,4Ñݤÿ¥µ¶•ÿ¥ßúû¿dté¿‹[aßq +ƒ8iXAaBºM¦p“8Z¤é<³ÒmãWÐg 'I´æË;#šN¯Bâ“pN“2j!µÿÅHbž*Ar;ÅHbò‹Ä) ^¾"µzá0Ÿÿ¦�+WZÒéÒ}%ýý¸O�NºOMô|]Ò}¿ÛÞ¿þÖÓ»¼-¯z÷ÞºµÚwÿÚw^·KKi°Ó{¤){¥¿{]oø×Þߥ¾—÷…âT4,90(h¨ÊŒŽ„FÄD}ÿýÿÈáWzëwwÛëÝ[û÷Uÿh{õ½ßVüäØn¯ÿÿþJ‹Ç¾ý!ÿ÷‡ýSüÓ÷ÿÿ÷_ÿÿô‡õ]÷ýý‡ú¯þ­ÿÿÿ¯û¯ÿÿý}Wÿõÿöÿÿ«ÿß×û¯ÿÿÿø#<Ÿÿø"ÇÿøoÿÿÁxoÿÿüŸýëÿÿÿü ´ÿø@¿ÿÿÿááÿÿÿtüGÿÿþïÒÒÿÿKÿðßößþ–ûúý|%ÿÿÿÿßÒ×믴¿ÿ߯ô·þµ¿ýÿÿÿíßú^ºûíמOýºÿªœßÝÛ¯ÿÿÿÿûú®½uú¯ëë_·uÿý}×]ºþ¿ÿÿÿÛ3í}o×_nîöë]N_Û¯÷kkvÚé}¥¯ÿ×¶Â{eïÓa¤Ü>Epr(áÚV—°ÎR áȘÝ.î»Óa››IvË9êD0DêV’²/:îEp×úi¦È¯â“M=Šd é6PžÐZ(MŠ`ši0à Óa¥„Ði†)†‚MH6 … �¤Âa +I: „M8Zúz¨l+»L0ƒ +¶šŠ�ˆ=žÏŒ&ƒ°§‹HÐÉöGD�”hÏ`ƒ�z+aæL[M!‘ÊÆAˆF½–…ôT‰b"3`S\FŽÅf« ÿÇÿÿÿÿÿþ©ü‰, Â|›½ÁóCEÛ່ˆð^à–Áü`þM”À‰ƒe�!ÿù6T¸9†GŒ Àgø<â¤Ù+ɲØM¦Æž è/ƒòfýàú ãŽZCòÜZ2ÊúeLÈ;$GeÐPR|šGj¸()Ø´¡ÿÓOÓ´þôŸÿ»þïº�ÿ­Þ¿çiYDq …3<Ï$FÁÎm +-Éž#æB^¿µO ÜëõõÿÝt‹wIÿëëëÿmy•£îjŒ~”º�G™~iãS#q¨ÓÎ3©C" ‰¶tÍžUŒ h„.EL‚.¥q,?Wʶf! ShÆK¡"&è234Èb’!DFêžõêÿ·ÖùÙ&i„ `�`�’3L `Œ;7¢¡¬4h #XaØH „òx"à4xyùÙDhÖâ8³—‘’hØÑvO Ì� 3CØjú "ì86KÍl#cØï™Ùª3‹‘Àý¥õûþ¨Z<4›I‘õ Sƒð� &ÐN“i6…¡z › 7&ˆA0ÑÚN> „¾†“aÝPÒnLáœ4né:M¤Ã“n±™~O„˜9ÀsÚ‚=µýÿm+ü*%�ºZ´">¥ –†é6®“ih—´KÞ©:î[@ƒ¥ïKèŒzV–ú¢7¥oN•»®•¤Û^ÓFÇW|‹ +i½ëì}}¯úvÒÒö¯wÛ[Åm'vÝ¿W¯zÞì^ÿÚ %ëý¡þ¿üWÿ·I75F;Özíñ^ß×ÿ¿_îû¥õÇqûNÓïC_«tý¾ÿCþí)/ºÜjßô’n½¿ß7H¨ ùVÒ�|¥»^?»_þ°Ò¾ýGÞ·á½¥û¢ 5ÿ¬ŒGà¾Ð*þÚÿ¿_ír¨|Wñ_¿ÿÿüºÃ–+߯տ`ïÿåÕÿèE�öZKn¶¿×ÿöëßþ½ÿì?ÿõ_ÿ·´¿ÿÿÿý¿ÿ¥�íÿéó ‡5Mºš£\?ÿmm/öõÿüÿÃE?ÿþÿÿý‡ÿئýzÿ_ ¬Çýbÿ'dw¥ûuþÈÔÿÿ£?ÿö½ÿÿÿøþðw¤ëzZ-ßÿéÿ Xní ¿Á½ÿý ¿ÿ ôÚÿÿÿÿ~ÿô„|‚p®¯ÈIßßOÿð—#ðï„¿ÿÂ_½xvׯû¿þÿü=º_Ãúý_ÿûÿÿý?ÑŠo×^ëý¯¼Sþÿûþß¿ì¤sT_Ýg¬Ó}7í­|Wÿúé~¿ç]õõ×ïýëÎ-ëý»ÿïÿÎ-·¯¦ÝSwûêßÝ}»ÿÿéÿþßMÿW^Þ¿k÷ÓÿÛûf‹öÍ;ïlÑZýíûõíé_!€Ã Hbÿ!‹ÿkêÈ<÷ÈcÌ1ûgûVÌÖ¶–¾ÙšûÞ¿KÿÛ=··öÚWÛa+]+IÒ¿¶uß÷_úc÷kïMo‘\6k·r.5b›I�õ\=+A&›0Ãd\¶’ki=&ši±²#ä íSd(Â-µb™;´™!¤½+_ûÿÒ÷ammU馩ÂôÓM½¤Ój)¦Ø%`’i°½¤Ù!Òi± +�4ÓA† …°©4ÚaZlLB 1 úNßüWù’ÞWR3µ�äú+5<Ú=Ñí“èô¸a#ä��‚¯ @¡�h�‰ 0B"„2ƒì³Ì–!ý½/ßüs%\8ˆˆ¤îe¬9n±ô­´¯º�|þ®¯ÿÒv*Cwëô©tºý;UUSH“ë¥ÿɹ_Ýt—ÿÛ&ÒJïþÅ2F*ø`�‚0ƒAÿ&ê2ñÿÿÿÿÿÿÿÿÿÿþYÕbJÎÕc·Œ‰b¸ñ<'òàh �B… +ÔÕ?Ý÷÷I¯ f��ËÓs9˱ÍgÑ÷ßu1¹mýö‘5ÿòinUrYúÿÿõ]oþU¬–äQÇ””êdm•‚ò,”èK›�g…*¥ÿ62q ѶfÄlSˆàÁHF ø…<]�Ù“„'ˆùÂdùƒ»D$Ì8Dx‘˜0��ÃAÂÂ/yN�0@Ñ 3@h„È@Ág¨ƒ/È�KÉÐðO‹€ÿá4hi¦º�¤h &¨Øé°�6��7£piªMé U²< +’ý5 áÃôá7!_rcßCAÿæm'i<— :M„´�&ÂMéZº[- °ƒ#ší4I¿ +ƒ<ÙgM²Ï>am—K´.è›Ò¿ûkÉB]ß­ŠWºZOÞ–®¾“tê/¤¿ôß·ïWÿº¿þ¶†�ýwT´�iWÕÆ½-¡öø¿ßÒÿLŽý÷Èá?ýzûiBÚŽµ…Cj¿mí¾—ßõoÝÿÚCÿãõ·ãz-É$ü·+\±Êª>¾Áö²ÓÿÿþZOÿËdÿý~ÒKÅRñÒÿ†ß¥ÿÿÿÿÿÿ×ö×_^¿×ßo´¿ÿßÿÿÿÿš2;ÿGv�"Çø/ÿ‚0ÿðÛaÿÿÿÿÿÿÿÐ_ö—„ ð�~þð‚ÿÁ¿m+ÿÿÿÿÿÿé?{î’_¥ßþ‚ýp÷_ÿþ¿ßÿ÷ÿÒÿº�/´·»ß_ÿcb›ÿÿÿÿÿùؼw锸§ÌE^_1F¤|gAMýW}Ž¿}oû×Û¬¡=Wÿí×íÿþÿ)š E¸f€ç@¦�ƒ`‡ÁÎ3Hàs@Á¶ODF ƒàÔÇÿ÷Óªö»m··þëÞûþëÿßv½þÿÂztÞ½íúPáºWþ»jõw¶gëm¶gö½{¯ªvÏÿÿuûfÿvÙš=~[¹ Î¿Dì9¬¡†ƒ¸sMMî^�åøsWÍ.os{µâß¼ˆ8i°ÂR àÛ90ÍÌ0Kl$²+†È˜ÒNÒz†WöDÆ“"å6%l„Èœ5a‚ßèÍâ-¥ ŸCãOMôú~¸|;uz 9Plml'A±L&ƒÆÅb�p¸A´“‡TáˆH4a4 ØJ“MŠ °¶¤qA± þßý7÷«~»ÝwÛ«ël&¬2wj¦xaBp `¥aè+-4 �L25€ˆz44{sÛF†Aˆ ÂG¶Oƒ>0Â`ƒ4D@Âkû÷Z¿¿wýî»ïi^["A¿÷ºô×·¿Ì=öù�õ÷Û×ÿõÿöëÿúßv)ÿÿÿÿK÷ÿÞ«ÿWÿäÚ]H8~Aù¥ ù×ä-ÿþÿÿÿÿãöïýû¯_ÿþÚÿü*ßÿ¾¿}?ÿÌ3_2�5dô5VëæªÞÿúÿÿþÉÿ íÿß_õ™Ûÿë×}ÿýÿûÿ^’¿þ»uëékñz^ýý~ßÿøöëýýÿØß×T�éoÚú_íi{Õõ¤·ÿÒëm/_÷ÂYuÿ›RMÿâ¤1O!‚) b�Åøä1wWŠªýml.¿§…ÿÕz_ÈÐÙC“pšÑÒ0ÍpÑÎÔáù6#¯úÿ¿û¥ýëý�ñÊ茮+¢'Šä_Ì…E +Ò&™Úœ)جwÐS —ð‹âÕý;õ¾ÿ ›÷úA‡¿ÿÓ×ô›'^L±Ì’¿ëiÿúÿIÿ_×ÿasfu",DŒÙ�óg•c(D 2ud�D ®%†³Áõäb7 †)´jÈÔh2M�cÍ‘ C«*Ñ R@§VD�”"ê[t¿Òy �˜F°Í"æ 55<ŸÖF‡Ÿ‚5–xMñŽBaa¢ìŸòt5 ì"ì2žLô¬<&�“I2‚“™ñ„lšI�#8'„lfš|ÈÐ @ÓܙȰÒmU&д/T›Ke¢“h‹ 'd¸&—Âz ´»¨UA6†©7sÛI††Òt­ B"ÓBl!ãÝåÍ„­C¥¢\äùáBN“ê“h'ÝÞ—Ô:V“úáÒ´Fð¡'ÆÒÑÿQI´IÐX&Ý+D£×þ½¯pÞz×}&Úµÿö½}ý¯h^½Õ6ƒ }S Óïû°¿û¡¸¥×Wê0½×iýº*G +—îâ¤p´ê5ÇCö†âïêG +ÐÿþXüw}÷H«ømëÿÈçÿø'ÒôXähü9c‘iÿYù �Ê7R1°WýGûïõýý‡ÝI éÿ�ðñÿèy7»ÿëU}ÿU×ømªÿÿÿÿÿì5ÿüÐuÿÂÿþÇ¿þ|§ÿÿÿÿþÿÿ_Ýá/ÿè/ÿÁ»]/ÿÿ¯ÿÿ ÿÿ¿ÿûÂ_ÿá'ÿ÷t›ÿïÿïÿÿ ÿÿ�Ý/ý/®¿_Ûü?õÿßýÿ»ÿ÷ý¿÷×U×í/ô½Ø¨ïÿíÿÿïÿÿKûëþ½µ_Î/ûoÿý¿oó›ÿûÛ¯Û'Z®–¿ÿÝ}íí“«í}¿oýצÍ?ý²uý´¿°—jÝ]{ ú´ÈêÌ-´¯ºÚþìo{öÏÿgÿažûí&Òÿ³ +ÂWðà 2.Sb•ƒ.ZZJ›rŽÛIWI­SMCÁ‚({jÅ&˜b“MŠM‹mX¤ÕScb—ì0‚ ša„ƒ§°•„“L4Âi ˜lM6+i4ôÄr8è6 ZNÃH6J1L+M;aàÄ Â•ŽV0•Ì0C¹Â#”¬r“‚Ó BÞ"$�‚*â"hÔ‰…( ¬’1aʈ3§ü²Öê±g ÿÿÿýÿÿõ_÷kð˜L •ÎW2Ü—øˆˆÿÿÿÿÿÿÿÿɶŸÐDvdDZ ³³+á'25‚šE$e\WŒ„ä‚ý_ínýþ�ïýoÿújºþMË�­ã™æC1“c?1CËʺ¯Øzßë©Ù•JM;žkdUdN%,üE1!8ŠäC‘*(!<Œ¨Í‘ R�R�hÙ"aVKÌsè Î'ÁD$È�žÃÈ’03ƒD@d€€ˆŠÏg²1cÉÄ 2„lŽ�ýhÐÑ­£cF¼Ÿ“æÉìŽg¥ „]‘ˆ5†�Œ(O?Ðl'C`l—“ógFÀÕ4ldDB£D"ì��Í1A£ò7Q±£[F†A£öü�M¤Ú ÝÙ3ð¨ßTGn�' ѹ3Õ.éúM²Ð›‹l › +ˆì‹m&Òi&Òl;J–“aIÑá'ÓºN®•«îÒëT¨'Z :Ü&Ý,[}+þ´›„ý¥ …iuKõê“¥{ipV¿­t©{÷Ú¶´žž›ß}ÿoÔuÚÕ_§õ}<]'Kô­}éïõÐǾêîþ¢»^Ûþ¿ßMî†í}}¡ßºêG +¼-õôøêˆzÿôÿõMÿÿÓ~Ã×ùnH|–9n¿ä©l¯ÿËNÿ¥ÿ¯ÿÿ¯ð~ßãÿõŒ½i këÞ°¾ÃÿõþÒ×ÿÿÿlÌ_ÿÿ]U»¯ÿ_þø/·ÿõû×ÿÿÿá¿ÿÿÁ[¬6ëÿà‹ÿ¯F�ƒþ—í¥ÿÿÿøn¿ÿü#E´°oûïÐ/þõ¥øÿ_Ø«ÿÿü8ýþ‚Ø­¶Òÿ½/ïï¥Ý¿ÿ×óÝÿ·^߯ßúó8'ûúÿúô½ÍIÿý/°“ëÿÿ¯¾ßÿúá!¿ï·¤¿~õª·÷ö§ÿÒ¶ëÿïzó�o^ßþ©6té÷ûU_¿¿«mš+íëý�A ×ÿþÿþÒöÏßþÈ??9×vÙ¢z=Z~Úÿ°Œ;#özl%i]æ$ýRUá°Ïv•ö^ý»l$ÝÝYyÒîÒ»^E;låt›Û &à 6•Á—/nõ¦Ä( Å1ZLlBTÕÓM¶(6‚ ¦Ä ©¦ÈâA28¶ba¤šaŠPšiÂvئҺM‘LSim:i±Þ‚tÓ ¦)’»W ð�§a„ÇvÔ>ê˜ê˜„ÔU« >öš›aE8¨i Âbž«¶G ¸ˆˆƒÈfPÌ„áÂ2XʃDD3Õ&ã†ô"®"¸ãÅ-'¯¥¤µ-Õ 5Jå¡’WWI/í+I$¾ÚM„„~ Ä/ƒ,Ý9™Adä“!¬9 1ÈA˘æ·3�w"DsXå¹ Îh* sÁVh< +®#ù5Æÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ-ÈŽÁ2ªDJ+£&ã¢ÿ…3ÎÄ0¡B…ÌÏÿ¦v>ª�ÿû÷é ýÿwÝÝÿø¯äÂòŠ—ÿþýW×ÿÿþ¾«ÿòº†JO!ü�§œgR$ +H"*Σ:ì‹'$Èd#yÆk"@ÊB C#Fj2�š†@Ÿ’ü EÙâ>A&˜F³ü#@ra ЃÖ0åÂ.$àƒ»gƒ9⼄gDó8r¼O!¬4{hð¤\Ѭ0�˜Â5šf€alŸ0a.üà§Ÿó²c%£ÒmÝ-Ra„wú7&÷ÑVÒ  „:0дK‚i¤òОLé¤-&ÂNm I´˜Òm A0ÐÒoÚÿ‘¸ã$2x&iœdúzXwI¤ß~­¸ËCJ×KD¾•»´–“é;ô‰{I½×D�$ÚL$®Oéh›Òý¦¿ú¦û=_ÒõnŸÒ½öÖñ[{÷´•×ßv×Q®�uÒûït¾úÿõ¢|ûÑ|úýw­oÕ¿øî6�ß®½/ºiл­Æ/t=Ðñÿmé§tßzAúþ½[§úþµ†¿½¤¸øÞëÝXú]ËÖ­×_ÿTßÓx¯¯úþ¯ÿ.°åŠôXÏÿÿ[ˬ?–'¬~XÏí¯þù‡ÿG•/ÿúâÿ¿ý‡þßU®»kéC_Õ/ÿúÿèÃÕ´‡íÔuÿÿÿÿÛÿÑÇkë××á‡û×þ¾Úÿàˆýuõ¿Y\##¿ÿÑæÿÿðßûiiy¤ùý •{ý¯þuŸúÿ÷ÿWÝz ÿÞÿÿÿÁ¿ÿo½'Ò}¿ì:_†ÐWþ—úÿýt­H¿™åÞ—ÿý7ýïý·_éz_cøp—ñ ûÒýŠÿïûæbý§¡éÒþÚÿÛßðدKÒöúm×ì#UÿKúÿö¿÷íûê¾þë¿õþæ¤ïíõz¯ÿ®uÿõ¿o_ßÿõ¡yÒ­ß!¿ï¿ºJý׿µ«û}¿õ_é¿×nÛÿÿÿõë·¯~þº·«jyÿ·_í™ö­™¯lÿNÝÚwwµiYû¯Û?²Ìýí™÷¯"fƒ'g‘>Cÿ»®þ÷[ùpÙ;a‚véiÞ­¤²%½†n˜eÍ5bž˜àË”‹€ØlŠŽ�a‚V”ŠáÛ m† &¬0IdWZððƒAéÃ_÷MÑ©ÿl�il-…°ÈèŽÓ 4BÓm$ 4¬C¦!&˜j�‘Ŧš„Ó +¬b ’BÂlU†!'lR „á4ßÍÏEó›ßn¿ñKí«ñ¶»4‚SÁˆM+‰c•Œ1HøÚGº+0˜°a¬£ ˆhDCD5Ð �„Å0ƒ +{`Á#ц颱ƒ+5=¹XÿA¾¯n¿ÝÒ»_vü³OÑ�Ì9•¯·¤ûzz_õîÚÖí§Ö×ÿÿÎöÿ÷×d8ûé�ãõúþß�ëé{õÖ×î¯ú¯ÿþÛˆ´"  —j¿}‡ÿ¶—ˆŽ ÚþÁéi}I†*¿ì‰1^ÛøA† ÿƒ¿kòÍ„çSšªõøýpÿÿÿo÷ÿþnýÿ¥ÿíÿÿÛë¯ÿéz]­þFòFQ…3Í#LÒ$üVà r÷þím;Ó´ïõ±__ý]ßzßösˆ�úÍG4Þµs1Gˆÿßíßýÿý>ŸmíSßÿú,ï£>¦ÿýª¿ÿ_õÿÿö¿÷¥}y\N-ÂÙn´ÿåó¯Öö“ûÚäp˜S¾ŽÊõ2[jWÏüGMÅ{ú_ÚIÿÿ¿ý&ÿ}ÿòè׺]oû˜£ÓÓïþš‹šŸo~9�ü˜ÎÈÇÿßõ¤Ÿþ«ÿõD ýÿØærßÿªÿþ曯Xüoü®¬9˜¨‰B1rT!(E9XL‚(3ÙàþE"œöH92AQ²’¿�ÂJë‹®°MºV�:êí%~‚tœ$êÜ&pƒh“Òö’ÛA>Ü“¤�m-'A0�D:%­-'T® ÿë_Âkß®¾¿}wì}}'õë¦ê¶› ÂTñô›vÒnƒKÖ­-»Ní»_�Ž“{éý§ªj�ÿW®«wøé÷oC­§­Eww;·]­wÔŽ†›¯vÜTŽ÷÷ÿ•ÆÎ±ñÿÑ?†úPC¾½WÿòÇ"Ì8}7õëÄ®ÿO\ŽaÃun¿úÿÿËàûÑ`¿íU¿öüaÁëþßèºÿÿé Áõÿÿ×SbÿþÞõ¯ÿÿÿ°Ûÿ×ÿKÿîÿ¿ÿàºÿÿ†®Ãÿÿÿü6ÿÿÿÿÿà 0ÿÿÿ£ÆÁÿÿáöÒÐ_ÿÿÿ†Ãÿÿÿÿø8oÿÿøK ‚Çÿðßö“ÿÿûþ ÿÿýßÿý¶¾¿ýéz_ýø}ŠÂ_ý·_õîoöëýõÿü8ÿþúúÿÿ¿úýþ¿ªöÿ¥ú÷·mÿõ»¿×ÿïûÿöüçôÚþûoÿþuèÆûþþÿõþ½�<ÂöÖÿû®¾¿íš/oÝ¿ûÛ´¿ÒÛ4ÿ®ëí.öÛuþëlPêýëÿ÷›Z—ÿ³ +Ò_IjÏg�¦GKmöÝu°ÖêÒÛKÛ­¸6Ïì3ûi}é]„µÒíþÇ 0Øáƒª›iÚI»\íX°Èy´•;ÒMˆV“j›i&­¤›Å1M¤ški+i]&ÚJŸü2 ëátšv $ÓŠO l' ¦Èà&ƒšiÙ+a1QV¤ì1 +Ù &Á8I÷ƒ (¨¤Ãh$ïþ ú‚”g® Â:¡ ÄYY*ˆaJ®P˜HB"ˆÔƒD4""!ˆ„kB2Ç Ï @Â:áƒ)ò�þYÌŠbmqd7ÿ¯ÿ¯ÿÒÿýüVÿé¯ýƒÿˆÿÿÿ�ÿÿŒ~ZãFWã Q]d‹p¿a0¡0°�xça#± ªÁ¹[êêÖ½ šúCBÿÐÿ]¦©ZþBxˆçc1뮫Ë\öIçgd±�=W)#¿džL2OÉ8é)ÝļkÍQ*!+O›#<Þl`ƒ!æ2"!5!2`d� ó8@ƒ")02BD@0@Éódˆƒ deÌ d☠òã4Í3¢6áÑ­¨N(4��ªhØÑ±þš75P™#cžÚ63ò6õ4ôlhÖÔ&ªši£[F¶��(ØÏʘF²-t'F´›eˆZ#¶Õ$ØD[h&Ò ²Ë–r;iCDvE¶©8KI«Am…“úM¥¢;l™r,0†A°‚m&ÒÒp¡n­g‰Ü!t›÷A;ÒMÂuµ¿‚uÐL+\wÇJ¡:»¤êè'jnNjé^8ð›I¬6ï' ·¥»w®Ö«MÿûÓ½¥ß»[úÕnÞÓx¤Ý?ªí¿ã_­­ê›wC_÷Ckþ½ÿwúÚÿuÔTŽíÿû÷×�ú¯òÇ#.›ÿ‚ýàLJÿþ£ÿ¿¶”‡˜l?ßú·¯·[�ÿ¢Æ†°~¿þ¿÷×¢Ó‡ÿÿÿ×õÿ×ÿÿÛVÿÿõÿý†ßÿÿ™‹ü‡ÿ_ÿÿÿá°FÛ¯ýAÿÿ†Ã¶–ÿÿÐ_¶¿ÿÿÿá´ÛKÿÐ_ÿÿ†Ãº_ýIÿ¯ýÿûÿ ¤á½Šÿð“ÿ×aÃÚ ÿu„¿aé}ßÿÿºï¢êÿº_úÿ{¿ú¯ý}oÿKý¿÷K}ÿÞ¿ÿ¥¶ïúûÖ¿ý{mÿÿùÍÕJ×ÿmúÛÛξc¯×¯ö¾¾í¯ÙžõþÙ¢ÿÒ×®AçÿÿïKzm³Eÿü2þ¶½ºì N’ÛiZ]—½†¿­Õ„qȺ:Øzý°ÏV?Ìv½¥gÓkuuêÈ8ÊW}°’r8I«¶’jÅÒA± 0›M;mbšm$ÛNÓM0ÅX4š±Z H1±ZV’iÛÐLiÃiÓ‡LB´Ã °’´¶Â»ÂlBi¨ï°œZ°�ÓAÔ0Kbš`™c[O•™+Ü0B""¤Ja1`…ìì) CD¤BŽv!„"1ÄDRqÄDE'/­W­}]}WKm(+im¥¦BÉ#d)º2lXÓ +"#ÿùk×™çe1]�/[Kýomoõµ¶ÌÕ§vëûNì0M°JÓ[àØzl0·é¶È·M† 'ªiì0­¥§v’i¬ŠáȘÝ%þØ`š°Âȃ‡˜Øa+YéÁ—,½ �ìRi¸L á8M0Á˜i„ÂiÝ&˜b“NÓL&¦ ši£»A'i°�„˜a “NÂi†EzaŠa4Á†)† 5i´Ó 0H¬£Þ§Ç>6ƒ +|+Т¹“äêx£�†¬sÄ0SÝÅ=åc(@ B5©Vç½!OsNV0hC Ì1 +V4W]£ñGa„(øÃ ‚a4LBa2}„…-¢¹ËMT7Kõëim(b¡‚�ÿå®322ß^ÊfE1ß°Hìs&Êâ{¨F‰•%4j¹�Û2*aBý*ýßÿï�û¿¸¥[_M4üµóüqüÈϯÿëõÉŒ’dº5½NÞ&q0²!y×#¯<Н�L‰¢>@£VCY«&wÑ “$Uæ<%‘&D ðX€FüØÎ†G�ƒAå ôà k„Fs9h* ú8 ŒDvQ—3á4""r&“P�‘Ô@@ȈØÎ#ˆßÿMƒT6�Í/ÜÕ4�4Ð&ѱž’o\ M¤>I°š¤�&¦�ÍÚ6B6OÈÙÑí… „khüØ�£×Ùg™´­y¤é6—,é†zt²& Õ/ ?Òm'³í-29¥²~ƒ$ÚM¥¤ÚN&ÙgNˆñ¤$Û'Á4ÿ¥Õ¥k¤î¯´£7ÚꯨÒé{jé:Nï×'iuúÇéþ„¿w¯þ껯¦¿VÐÛº­ ׺Zkýn)]é/Ž�j6ê:^ôêžßü›(FFQÈæn5FóÑÄmœG²��×ÿ^G +‡^­½ö†¯^ê‡]uµîß t*»¾úÚÔPÛéÿ ÇbDTÅ+ÔQà`«È)÷òÇ8çIÔ¨[œ�ÿyu¬©u^ú–ä†ì8{�ü·$Oký’¦ “þÿéý +Cý{õ×Òÿ×÷MWQàØ|=},oÿ´þô“×´´¦‘ +¿ÿÿý‡ÿ¯¯þ¿WÒô­°öõÿ{Kÿ[#åi/UZî«ÿÿÿá½ÿ'dwõÿš2;ýÑÞ Œÿaá¶ðÃÁý¢ŸÿW§ªt¼V‡ÿ¿ïÿÃú ý/ýÿé^‚û,6ƒáÿîº_èjÒJÒÖÖ«ÿïþü>½é~¿ú_íúI~–7·×÷ûüìoWI]% ¤KÔé©Z¿ïÿï÷éW¥ÿƾéaß„¿öÐQ_ÔêÉÆHf‘›9 -*´«”òvm‚DwGŒ�‚!|"ñF]‚!xºåá¨wß·wî–U§ëo×Òßõ^ö©/µÿÿöî7ÿFiB.úª¡ÞÚI:Z™¤µMªaC¤ØI°á}0“ûý¶þý}[õýOíßÿ¿º®ßœóç:Õmëþª“"Ÿºi6”RPÖ’WUI¼#ÛE>]ÒåÌãÒETŸöÌÿnÌöýÒÛ®›3ÛõúÛ3Ûÿ]»z¿³?_´¿»_nÌÕ?õÂ;ÒuðGz)Ò_JõªZ8ôwI5IiV¶“Z ÂZ)Ò[eí6Á$ö¹°“`©·IÚZPÂL3’r+ƒõXa&ÁSâÃë‘l%îºî³Üì3“kÖ¾)*KJ’I-×Iëò8µ¥NÒC¥�¥¨ÐÕ% WˆZlB´Ø¦!2+Ól “´¬$¦)6«N0Å1¦›%˜dW[LH6*G 6’m„¢˜ª ¦Å1Mi¯–iÃ…TIl£ðj‹†�„%°�‰èÙÂj˜L*…C +"! ؈�B)ÙJ,( ÐA±M¯x_Õº¶”0Á(h#€ÒBÙ¡“H’ Ëâ_%E-„ðGv ¡ûI­Zõ~¢ê.é’Ò–ÀRÊ×ÿ‘5]Õi¯©¯ý9kò6GQJ¸ø„`¨‰¡dZË „É��Ç"L2ž4œR@¥‹˜N"!Ô ÊN]­ A4Ñ­¦œøÏÈøÕB62y?L#`j±”I„lhøÂ6Q±£;BôlÈ1äúÉy9™ØFÍ`0‚l*„œ*Nɧ,醆Ë8g &ÙgL0ª“i:L4›'“ç¤Ã“�ÙgºL:ÚÞ­v´›D£Ât­ÒmC¥jéi^ôÞ–û¿¢7¥ÝÿkÇuÜ}ÿÝÅ{MU/oTÿ÷a +§i´7Þþ›kõ#…ÖÞ=:÷ÐÿÿCï!Θ|?_þ ºôCз%2?ùc‘Œÿï,r6ƒ/DÓàöíÿ¢ÌU¾Zpñ–¯ß�ÿøþ¶øÿÿÿ~»ÿÿÿü7†ÿÿÿü0ü‡ÿÿÿÿÃxÿÿÿôÿÿÿûÃxoúÿ¿ûoÒÿÿÿûáÿ_ÿt«vúÿÿÿMïœOíÿí÷îjOúëßÿ÷×Ê?_úÿ÷®×mµúÛÿ×otÙ¢úÛJö×ý³EÚÛf›umû¯{kmþiô˜kw_Zn•¶cöI7Kl%¤ÙîÏr C­³—wö› #ÖÂLPNÒNÕ‘�ÛAâ“6)6&Ä+V(1R8I„lRlr/‘_lWˆL+cت¶*ØK´›l&(0˜L&î*Ã&Éå„Õà Í�ƒ ÁLínDDC8è³S†ùk•ÿþ�8O)®?ÿÿÿÿÿü› gh"Ý\w‘ÝÇcQ$pH#¼ÈðR^ +šAVdUªNºúÿu÷}ÜÈltß}ýüÈÀs´ùoaýL­–äoqñÉ–4دҪÿ®&•‚§éÿçz_„vkfFÈ8‹P�ÖgÌ�ŽP2&*"$#* ¡2�DU’Њ4E™ „é²!ÉÄ9œDùá2�™â`aŠåÆt µ®¨ã²F¶pSÆ�šA0ša<"í„kz40©„k Ìäòg… „lhÎýBdò=½,g�&™<‹²<§Ä4liRºúÕRa¼$›DpÑá…OA0Ò É˜ +ÐÒ »Ê™èŽÚM¤ì°2ÎGmBAô˜m4“z ãG¶©<ŽÛ, ¾i6’ã_tÏJÃÒZ †ê|ô´›kÑ'¥{�* Ò´�ö¯é}%~õª„þKHkZÛ½m¤®í>ßßzZL$›÷Þý/öüuMõú§Õé·ÝSH�µ;&ÔÔʯGb"ÓÓ©+¥[^ô4›ë?ûÓ©-[Þ‡Ô{^ÿÿq¤2ŸðsÆhfdNDì2²�Àp@ÈlÌ�ÉÙ™™Œ§"ì`ƒ(¶ÿÞ?õzþ>­þ﬌_þðùc‘¡ª ”ï¿ÿº,r=… ‹Æ«AT&Eã „hz7T&vð¡5·AB'dSšÚ3¿úBÃÿß–-ÿ¯ÿèWÿ‡ãÔ´ÿÿÿñP‚mQáƒ'J£Å%&ÑÇKN š Q¢‚´•èðÂiáh Þ?Ýÿßÿÿýö­¯ÿéëI6Žô½èïKGŽ•¥êô•„w ´›ÑÞ“¥ �X%m^Ÿíÿÿþ¿ÿþŠÿ·ýûuþú¥iit•%¥¤´“¥Ò¾“¥¥¯¥¥¥A.´½¬ÿÿ:_ÿÿ‘¹ÿÿü%ÿàßëÿí¥ÿôºI%]*I%UJ•Ö¸ªWZJ’ªT’Ii$¶–£¦þÓIÿÿý÷ÿþü?·ÿûa/ýÖ´´•GKK—«×ªJª•-%K­Vëÿ)Ú ÿû× ÿý ¿ý½â¯ÿ„ÿ[ÖÇKª•Vµ[¤µ ªã×T«õWßÝ'_ÿ÷ÿúÿýW×ß¶¿ü(ÿúIhUk«^½~)t–Uª¤Ý+ûVÕÒÛº×Û_ÿmüç÷·ÿ¥ÿMÿJ´’ª^©6iô¸T’T”%IzH%}ý´¯ÿºÛuõÞ›[ý³Eÿÿ[íÿò OzÙšþª–¿Iumµ_AuT©k„u¿³ú·iýëÙí´“þ×¼ÂþÒ°LެÂlÇëu°ÏmYïµÕƒüÇi6ºJ¿õKõÚKô± õ­ê!7ÓM6IS°ÃNÖÐI±¶‚á†a´"½�4Ô2™8â“TÛI6+b“NÓ¶ÓX«A1_T«Jª—ªM¯_HJº®” L1-»IªzI†`�A¿m¤× 4Óa4í0­;ŽÃM­Bzvšm#À ÂëZ­}z¶5¤’É�ê«wIPæB’?ÆUà +¾ŠèŒñê„EOˆˆbˆˆÊ�",ŒƒÉÌDD0†ÍkI.¿¤½$‘Ç·ÿ_ë@Št…Srܱe Äã¯êm)ÅI)´©/éQÄë¥^©%ZYµ*Á|t�÷K¥ÕM®—J�úZZ—Þ�þªcëÔÞªª˜ïô­zKJ’Ö´©.ž©%JëÝ.¶Í>«KJªÛ'Fß«§§KT´©%T•% ZJ–•ú]V––«Iia+Â[_IµÒ¨â¢ª=-]-(Ib›Ij°•„£†ÚV»a¤Ú¶’Â… aED&ÒŠ…k ÐUQKªÅ ˜qMÕX ØI´UUT*l ¡BmL0— „uL(Tƒi°‚„hlBbÕP´Ô& ˜T…LA ‘ýˆÓL �a†es-'#!T[‡6# éôý÷úßm(a¥ Bƒ +9dî[ŒŽç*l‚²•L†„; ¥È‰TÎ +elíV2páx5ûwW×°� ßôÿïý†×þÓµCöÇÇÇûÿß$�h�äˆÉmˆïLïÏ“£dxÈb” ê/d`†y²Á0ö{* øGgÂY6EX™�JL�¨!6X fÄ8G%âìŸ02MfÈñEØRñfPzÕ„G2£6DŒÁ„g ðÎ úé¦hÎѬ�Í�Ìäli§£F)â7Âdò5‡¦ÎFÊh=Øi¤l¤Ú Ó´Âi6“#ôÚªi8PƒUH7´Ÿ‹ áé:L>Õ'TxI¶š ŸÔŽØP‚|ͤꓠ͖–ÓI6–ƒ<„±œ4´�&Ô"-´›Aœ †“m4Âm¿ZKÝqQ}w­êª¾ÚZã7ï×[ÕôÓî­%k Òé䢕½}¯IÒuOýÛë½î«jšÿ{ý-µQKßiô´µÝ§ö›q^÷ûõü~öÓõ½n»º�¯í7×÷[[ôõünýníFõÿÇôC£¼=¼}[ÿëëx=ñí&ÿþ?¢c’WñûÑnIÿëòÆ~ûuÝ}¯¯°ÿWá¯ÿ¯Ðÿïâßÿöëý‡úêÚ¯ÿïßëÓ ý[¯ð¿úY±K"ÞwHïòlkÿÊ/_U þ u£»ÿÿðÃü‡¶¡°FÿàŒ=×üÿ¯;#²¦Hˆ)ÚÛ ýÂ[i}8oôxº·éÿàÿ Ÿ ØA?ÿ �´üñÿmz;( <¨Šâ²ë©/øNÚ ü7øKý&ÿïÿ þÝC¥ÿøKŠ¿Â_÷ø†OƒûPÿ‡ÿêèoKú[þ¿þýÿK†éþ—3…þ—×±]7ôÿÿÿ}B^¿Ö¾ÅCýýýúõß_ÿÔ$/úúï_c‹D…ÿ×ÿ_o¬çëÿOýýùÏ×]Éýÿ_¿õë¿Üˆ±_ü‰çyÿÿ�óf~úºõsûÿ·í¯¥uëþ¿úë þÌÿÿ]·ÿ×ÿ×þ¶6 ´­%ºÒäQäöµVåíëu¤² á½¥"ÿ¾D6 %[ˆv’l3u~§S ó]’ÌÒ5³«5 Ƀ#DFÚyì§³~HŠw’§¦udnR©t­ÈãlPL “m+ p�Ûk´íŒ Óc¶VA°º´˜M&šiª …¶Å&ƒ É_A&Å:Í4BLÐ" EÞIæx@ÂÎ#@a„h Ds4‹˜EÀ`�‰ôBt0@ŒDùƒÂ"ÒvÐíŽWÿ¯ûÓÿ½fBäE‹8�"P3Z' ”†)Ð)Qœ3Ù>BÐ98Íâ9y¨Ï™ d2:žä¸¦y²ÉÅ9›È®lΣ5FbšŒñˆ‡#¬Ó"¶A„h Ì�=‡Æy„\g„EØaÑ(|a1|ÏfpM(Ö"�iÂaF‚/šÍM™ÈùPž�Ï50ŒìÎ £C3‚i„kj±šA0�zA·p“ì-Ú ´ƒrhL4�’äÒ fÌ � Û%Á5¢8aM„ƒ ›ÝBVˆ®ð“l*DWi:AhŽF†“ –Ba¡¤ô˜nûîÂIÑ8¥im%¥µÐXNºVïZ ˆN—P–û]¤7®í A´� ˜„é;¥¢1ûÒýGµWÿým'ÞŸnµmïݧõÖÿQvúí]´· $·iµOTØA¥·÷¿CŠ‘Âׯ»m®úõï[^—¶‡»ÛOÖûOô5µè|xÞ¿¿¥kÇÐ"ê¿ÞºÕ¶õÿäÿ¾ñô»ÇþXäZQc§‡ÛöÚúCòêíé~¿÷_ÿH˜Ï°{ûuºÿøøì:ÿé/_ý?ÿûUÿ]k]‡úëë¯ëûðÃíÿÛG_ÿº;¿üºúÛýÑCðFÿû ®ZËsäÝbÿ†÷¯È‹ÿéµÿþý/ôgºÿ†ÿ4eÛuà—¥ÿþ2W‚“çf¹’žŒðþ·é?ûk×ÿî—ÿ„ØA^¸7ü/KÐO Ÿÿð{Õ4ï[uáö+í/»ýµÿÿÛA¥ÄÖÿ„¶„¼%þÿ¾ÿwëïÓî¿¿ýý1Qÿ®¡7®ýõ¯¯÷Þõ»×÷üçï}ÒíÞÓþûk¿ý*�Ösõ×õ__ûü£ÌŒ¼‚ù3ɱ_¾ëÿÛÛû·^¿ozkÿømá/®½_¯ÿ÷4í³Eúë¯÷I¾ëÛ?]Ÿíói³é‡oÝ÷v–Ñ¥kÝ„qì†9ŸÕ.êÒîZV>Áý´¶­ÒêVÑØ—ëöÒ�ƒ½$Úb”1Pá²?!è:uTØÃi5éÚ¬8m±I “´°’ví+�r8I¦›"ø¨v‘Ùl`Ž‚²D!DÀÍ2}ȈCFÈñ ¡2D`²¬CAB! ‘t*É ˆ,jC#¡Îq³LŠ&EÔŸ“ÐŽ²HyÇ�jÙI‚ؤðÂA°©ª 2+§¤Ó°Èà&!mi„í:jØHB¶*ÈãMÚìŽNá6œ'¨a0ƒA6)PhØD¡>!ÁÁ¦�p��¦˜MG¶ ª'‚60�?#XaBh×#RhÖÂ.Éa?&sÐÎѱ£[?ÂhÐF°ä&Aœã†"4 ÔªàÁJuÈFGÉÌex!A�B@„Y]el´)4› +ˆí²ËKæîŠrÆÐm& ØÎ4› j�Èáꓤì´B ´E†“ªi0ÐNî¨i0ÐNˆ®Ñá„a¤Ã“9;MDDhDE'¡‚ ¤ÚÓ~û�Ò· ¦Ò½Ô[‚oTµõVÐ'ÝCIjû…D�%« L7WI·‚oê«ÿ¾ïOÓoøÓo륇}ý^¿¦öÔv–Òß饻iêÒ~½ýu×ÚÛ¿íÿkîñ×··½ {®íÅ¿wö½[ïߺ­Ö¾õõûÿ¾´C•÷ßuêþ,r/ÿ}A ÿ­÷_¥¯êßÿÿ [þZ—ÿÿ÷ö£ÿòʃýzoþù\¬ÛIA$ÿûÿý‡ÿëÿé/¯íõÿü?ö×ÿt»}ïÿÿøoÿÁ~ûþïÿöÿþÿÿÿíp£6‚ÿÿøoÿÐ_ÿéþïÿðßÿÿíÔDE?ÿÿþÿôž—þÒÿü?ÿþÿÿÿXŽ­¥×ÿîÝa/õ÷ ~ßáÿÿ÷ÿ¦ÿþ¿ÿý~úÿëuÿú^ûwÿÛþÚõþÃõ×þ¿‘¯ÿÛ_^¿_ßó‹÷ÿì‹§ÿ§_ÿ¤Úÿ“÷V¿M¥ûf‹^µöÿî¾ý»í}ÿ÷[¯ÿ¤Ú]öa^•Þm]7]­¥a2:ÒÐZ¶gêÙ…¶—Ú[göþý³ý×ÛtëþÖÒm©¦Çv“#HÒm$ÓM�àDpí-$튑\8ÕÒMzV)†ãØÓ¶JÒOVÒm&EÊiø ÆšÛ G�L•éŠ R­†O—,Á& &°¡†LtšlR „ÇÈîšlTRiÛÃABMS|±Â ˆˆw`„DA‚•±4‚ÐF´w¦Øˆ4EѪ !ž%Ö§Š+Š; Ä Ò+Š;4«ˆâ"#ŽWUet¿ÿý/ë×ëÿù\[2™>M‹øþWX8S±f)ØTvK„Âzò½µ ¯Ô)£ ™&˜ Ðuß÷ýÔDe2™ïþûî6±ÿì 9Ø"J£’ÿþº¨ûÿ×^dV‰KÎJK/äTò‚)fFF²ÊË5³¥�,ÔeMäTÈf¹ÈÔD°“:0™Hd2Â#²2 +8D{"*‡€d9ƒÎóÝÖÈC3apfš²K³8 F#@0@ˆç”fx a%Æp`ŒáçŒù„h #@4Bt a/™sAäBL!|è4H‚P©¦‚ �xUM&î–“ 5H:„ÒÓÒtƒ Þ©¦“#ªI7í ›Iü"Ý M­„n×uA0Õ:%€Ï0©V}É—„E¶“îéi\§ªNƒ<ÒtSô�-/ +ˆñ«MRO»„›IÙhN“a7I¶Yï,õmpõ^­mµÂtŸ}-t›GÕ¥¥ø¤êÿ Ò§×ßï¦ûÚÛzßIº};õþíj?¥¤¾�¥»«¤ý¨×ïïõþ«¦­ +^—º[]ý×ß÷¯×ŒXªë¬zºkßý´«ýúÐõo¯}½ÿÿû¾¿ü±P‡õþ�ûÿ�üºÃþXßñýÿßÿÿþ–¿ý0õÿ×IØýzÿÿýëÿÿÿuÿÕ‡ÿþßÿ°ÿÿ×÷ó´¸·,Exÿí¯ÿÿÿ”ŒŽÿü7’ÿþÚ^Pÿðßÿø"Çÿú•6JÙ, +dQ”ø_û ¿ÿÿîÐOÿ¤ÂOþÚ ´�OþÿïÐ/ÿõ_ Üjvýâÿÿþ©ýÒÿØ…Ò_øÿð—úþïú/�ÞÿüÕÿûþ÷Òþý'´¿ôa Òÿ·þ×õÿÿ~·Wÿ ÿÿØGw¯¿©.Ÿ×ü$úþæ¤ÿûuÒûuÿûU¿×ÿûý¾Õ½²¯K0—û]%Û_ÿ×ïµÿo×^÷_ÿÅ-òÜ·ü†>º®ßÛ}ŸI¤ëiÞߥi6f­ÙV­}[3Û£•ûf~Ý]§÷_ÿŽ:ÓÓÛîD­é°ÍÛeÄlÇm…ŠŠ‘ vÁb®˜adAÁþ›|ˆ8=�ƒ¶%i^^Oa‚Véf9päLm¥¦vZ<äj�D¤ƒ:žI‘RgBÈfDÌêyÝ3QšŒÕù&ÎŒêÎÃE>JÓNÓl&›JƒMŠäw`è1TÓ «MŽ˜a&)„Ò 0šwL&�l-Š´¶!&›˜a¤Å0M4˜m$ÓGáv²¸ #d"à2Fa‚4"=„h ‘0A„k•Ò0GL ÉÄód0A‚E3dp`ˆ¨ ê)8¤ §Vh*! ¬>ç²fÁÏghñEcG¥Ù¤ÂF†�|A +¢„Á0¶H«hÐÃ&b0˜M#ÝÜ«sÅlXMl( Á1NÔïEc 3°ÉêTÂ$l’ +·=Ò=áí&ÒÐL4´ Bi6�ÏI†©£sIÓÓL#[FÂ^lhùðš?4lÏÌ„”&˜F†�d^6B5Ñ¡™Ö��]ƒPƒ(å}S–ëlÊ0æO“m'¶ÒÒt�'I°ˆÇ„�&“i—4›K +gá«¥¤Ú¿ ó 6“a&¢;"Ý'I¤˜iÐZI¶N‰Â";XW —¯éjý¥íÓIjúMí.“õOZ´•¨õkúëL&×ZKõtJ+nõ ôº¬iþµ.]-¡¡«Õº&–í;¥ú¯Óéã¦õ]i:§ŠîÕ{ÓNõªéaü-xëVÝVúÝ úÒã¿Ðí ÝúýëqR8_^ý¤•¤“Ç­_ÿ§×åŽb?øþ‰ŽJ�ÿ-Èæ·#Qü–9a�Q·î÷H·UTÚUõõëÒÿoQÿõ¾…‡þ0xÿÿŒ5Ñb].û#&“-öÿÿÿÿÿÕý‡ú¶µúél?êë|àáˆ)ˆðE�ÿÿÿÿÿðVÒÃá¿ü‡·á°Gûÿ¬a7è/ÿÿÿÿÿÂ5Ý,7þïôÚXmÿz_ñ~�]÷}ýßõÿÿ\B°ÿá¿ü%¶Xl/Þÿã]ÿÿÛ]ÿü/6—ýÝÿÒáéÁõË]Óö¿ïº]º_÷ý(I·þÞÿ× n—¿ZûÿïnûöïÞ¶Ûÿ×ó¯þÙÓÛÿô›:z¯{õÿõm[3ÛW®Ý.ÒìÏÿNCüçý™ýfŸþ¬…§¯Ûý}¥¬Šá°Â°Á&Á[I6ÎM¥¶»`”0Aþœˆ;m†s´“ý´®˜iØ@ä1Ážî¬;³þ÷W´§ cb˜Û &¦ÐAA ؄Ȏ“M=‚vØ®°A„Ób›IŠU §#„ÛiHá(b™ ,1AŒ£i Éä0A“I½W�Ç;/ã~¾J·úªêÝÕkó¦EÖJQO‘¨­z”è‰þ»ªúÌ…(Ì x ÁN{$ˆFÙñ6EXˆ„H{%B%�Lø¥B " ‰©2¬¹ÉtlˆcDC‘NEÇY²!Š “dCêèÐÂI„k"åG¶¡4n¦¨ØÑ¬�ÍC`jFÀó¬¡=›Tl ú5†��M4lšaBaa>;a.»~Fɤ�&ѵ„› hŽÚXCI´œ*M¢;i6ËDväЛCI´�– I†m œ*"ÃIÙ4&Òwøg Û,ävÒa¡Òá6“Zß �'“ŠÚÖ“h'VõA;I\œR½ô­'VÑ'K¬'Ki-^Ý(N•ð�-éÿô�õñôŸöºowõ\}GV–éºw¦×Õ<{ÿýµO -o¥èuÓÖè~êÞëûOÆÒ‘ÂÞ�Ókºîü/Žo[©/ZCÿ�¥×åŽG?×õïú!ш(~½}}cè‚Mö¿_Ër3ÿߢ¿úCú·êßÿ,eœ>½[×ÿå§ßú-?ñëïúÿûiç…üð¿ÿ°õÿÿõûÕ/ÿ\®KÁ}ÒðFÿýÿÿÿá¿ÿÿðŠá†Ú8ïÿÿ2 Á;.á>Ú^_ÿ¶—ÿ_×ÿá¿ÿÿðIü?º_ÿáB£ÅL’ò¸A»Kÿíˆ_^?�ýö¿ÿÿKðÛ¥ßÿét�×ù‡ Òÿþëí×ÿûïí×è/°ñMûîê/ô«ÂC·ÿ~ØE§ßúÿþÛöõ®ÿëû¿íÿûýí¿z÷¯ûoοݫ×ê»gOªÿöÿK)ó$™�Ì·u´þAçsD{×î÷3R=¯¶¿ûf~ßîõk¶¿ëvg¶‘äïíš/ìÏÿ×UáÃö°ÂIÄ5M°Šì4ÛÛK[KU»m$Øg;I²ó ôÚM¥·}ö‡1¶—I׫ &Ì~ÚJvKW”ªÎˆª"Ÿó\Ar“O\S¦›a6)¹Pi²#¤¬&A á†ÐH4Ó °lU±ZQLSiÐH6DTØ…lSk{Kl…˜«MŠA‚f'›Œg™­gÄDN" ð_�Éù�„BP.! „@…�ód0öKÊ ªˆ³) Š „¡B¬ž„Qb~L20ÉÔF‚0"C'R"q¥j»FŠa„ì&¼5 C +~w§z†(*wm†˜A‚b˜í„´úi Âb©¡A„Úað´l{˜Tni£sTÕ4n£gF¶�khÖÂ6¡<ü¡6OÉœÖ伜Ï�»aB ™Á0˜Fv 3F¶­„g “5²x¹ŸÐ0�ÄDh�ˆ¹Ù¦PÊâÑÙª2(‹q« øi †”6NjCi0ÒvZ ¤ÚMi6ˆí²g¢;néúO&€˜h‹ &¢8hðÒ „˜Òm'H>“ G‡ >®"*ôÿè”RÚ^IÔ”%ÒwÛ_t›A;J‚}Ò½Ô]&Ð'K +‚aº]0‚Wé[- +Ñ!èŸÿ¥é¤¿tœî…¡ÓKÒºÕ'ö¿kô›ÿ÷Õ7vŸ×­Gôº}®´½(×þèzè¯]â“{￯÷«tñíw_¡éz‘Âã[ô’ÒHn¹|±ÈÏäÿ¶<4½ÿöþ_¢Ç"Œþ?ðÇýßí¥M¥¯ë¢ÆRDê_^ÃÕ¿ßþ¿‡«�õú'Xuãÿl+_ºÿúÿÕ‡ÿÿÿû Ì_ßÿ×êéà ÷_ÿÿðVÿÿÿÿ ÿÿþ½aµÿøŽ�ëûþÿÂ4A¿ÿÿÿÃuÿÿàŒöÒÃ`Œÿÿá/Û^ÿïûÒÃýÿÿ†ÇÿÿÐ[a+ „ßþÒþ+}ýÿô··_ÿûýþ¿ÿ qXt¿ÿ¾¿]÷÷Òïßÿÿ×¾Úýÿ®�UÒ÷ÿÚþÿÿ¿¶¾sÛëÿýµó›ýýÖ¶u_÷ÿo_öÍÙ§íšwÛÖ¾Ûk÷ûjõk¥¶¾ßú­·z®ßý†yX@ýöTØi{ &Ð{ia;«?ºKz­÷j÷ufÒíŸÿïd™ÿ£•ÝÙûþÇ#ŠiÒlRlR Å1R,ÚR8v�b›AZr/4Õ�´"½µcm+MŠM=Xl6Ø«JÙpÙ˜ •=8a4Õ…Ó ˜a'†d¡0˜¦±A¦(&¬ �¦É\0ÂMqM6G šm&šwOa¨® Ú R S¸ˆˆÐ‹(¨­‰„"  Gj¦" † ˆ$)ôˆˆ£�ƒ 8a0GX‡£Û4ùhJœEɸPn©ZªWK +é%,€Q ‹tguÅc%ä›HdØ +;‚… +)>b·¾º§Ð`¾îUìÒ1”#„îûˆÿâ�# ÈKÿ,•yöši“éÚ}ÉZ*÷ÇúïM4þ«ý=vëÚ]?ù�¦l�lÌBÊv|R„lÏ6gˆ„G †2G3hÞˆ�8h„É��Åt¼�f̧f„ˆ‡#¬�daÈBDDäN›"¾lÈÌÐf´Aª¦O&��ÈøÎÑ¡¦ƒA¨M2y0˜F²:Å9ípOÓF¶Ú^¡O&¬„k #X4kЮF·“Ø&QF†iqO]¡¤ÃIÐÒl Í´{¢8"CPˆ¶ÕÙ?A„–‚;l³†p »ü",44ƒrHM¤Ú ‡¥É—&‚8i²8 +BÃMP Ú%�it— ‡h& Ö¤Óú¼}:¶é| Ú$ô›i&ÒuoIÚx'KÖ ´NN‰:êí» m' Òý;Ný?ÛÓÿ׫Ïí=Û¤ÚZOÿíª‡ßé§í= 7î5»ÿ»þö¿þèoÚöãM먭é\ný¸¥¸Ý{uýÇýÿßþŸ§þXä`O�}nªñÿ×÷ÇÝ{ÿÿÿÿûzÿþ¢ü±Îë·þµßÿå�þÿëþíÖ¿ÿÿ÷_ÿÕô/¿¾¾¾¿ÿï®Úÿýp_ÿýºmzÿÿß߯ÿÿïÿþèí*;"2XŽÂ²nOÿí¥„{ÿÿîÒoÿÿïñÿÿÿ ÿÿÿÁ=®¦F% +WY‚ÿ÷-/ÿÿ´›ô¿ÿ´›ÿÛÿÕ¿ÿÿKßûý뎿ÿÿŒSÿïWýzÿmÖ•ßõ¥ö;ÿ‡émá-/ÿÿA5_ÿÚ¿ë¿õë¥ÿÿ®¾ß×ÿý/×ÿÿ]¯ÿô›òu×im«oúßíÿõùØ_’¯;!�ûKn¤›_ÿõ�r½lÓI¿]w«znÒÖÿìÍ/×®þº¯ù-ý&ë <#¸}ëßì6»Ìw¶^í†[ím%m{I³ût¶ +]f;]µûK°½'úkþ»+mÚqN˜Tí0©¦›{A6)4âa6)5A¡è$h&G6“Ú[%±R-µb´ì$œ3žˆ�6D�B!JHFÈè*"Pˆr)r2ä&LЊvD \ R2#Dda2!¢tS‘ÔΖH"*eY’UœÈƸ¤Ø…vÕ-ØO¿»hxKmxa&Uж¡0Ò  éªaZ 0‚çpÂIÓI´¸A£ÛѺ°0¡0��Q±£ãؤº ÍC;Ö #cѬ2x&°2Œ&¡˜ÏEÌ#@gxÑì0EÀ0@‹¼#[Öræ€Élá$A†ˆI˜r‡1°ó`B )H™k“™\É›„4"0„0ÎËQSB!ˆ)EUdÎæÙ`Ö“hŽÚL6M ´�&Õ“=áÚI´˜zA´4˜hi1¡itÐIÐM¤Þ“ &LŒ^žiô…‡ÄBºO“s]ª½Ý'JÐN“m%¨¥jöÚÚ' 'I½+DcÒtN*ÂD�$ÛÖé:^•„­ZAœ;>Òa²Ð›ë­uî—¯îÚú§õ×µUúMÐk½ÒéýéE]/K­*„ßjúMý/×®¾µ#…k¦øõ#…t7oö…&ÜvÜRõºô5#…ÝÛ§«ÕÿW_øúñëè±Èè‡?ø-*õmÿüi¾Ô~Xÿïý~¯¶–ÒýzÑc>þ0Ñc?¢Æuo¯_ÿé‡úŠ�ïûÓ†`ÐX/ëÿýûÿÿõý¿KNÔͰÒ^«Kþ½[¦ ‹ „Fî~Ãÿÿü0ÿÿÿÿöÿzØû~ÿÿ—1ÿKïÿü?ÿÿÿþég_× ä»#¿ô¿ÿþŠj }ÿßõá»ÿ¿ýÿöÐXIÛ¡hݶ—ÿýqü%ÿþ½¿ÿû×¥Ä-.Ä>ÿb þÿÇþ½íû»í÷kõ·á]jÝÿ}N¿ÖÚÿ_þ¶Î›ÿþß[kõ¥Öä¿Úý¶ëõÿ÷{~ÚÝôßû~Úï[kÞ«^ßíÝëíû¥ï°@óh6ïÝ,ÆÙîÒlÿþÙÿaŸO]ª½lƒþíý³5¯góÓgóÓ ó<ËO¯t»«#朎SM´˜¦)µb“d\¦Å&ÛKm›i+Øl>ÐL0YÃÛVÁvÓí/n›/6–»iØLŽaZm¢´A…ÂM„i°“a1AI6ÈäƒÂtÕ2C¦*aˆM†!w·a ƒM°‚ˆA´¥²6„A‚;G�†§AˆB‚•Ôs³LG("$�‚pÁR5OHñEc m*SD³Ž""â4âòÔÊ6*W¬+Ö:Ij’_uIu_IVÕyn®4Žâ;¸ì®2XŽó2xí ÛH&ÐIuR# +)>M ¡T#Ãb¨X¡Zé×§ë¤àÉ…Cƒ»þý»é4"(øïî×׺ˆŒ®ùÿ&xþ¤B¯¯ë¿I×ÿÿþd.DDˆJ¬ŠG(Â! ÊCÍ£™ñä¬e³!çUŒ aI1‘H‰P2#’—f² CͳYìÔI…„k ¢ ¨F°hÖüù™Þ�aœ �oG†¡¡“ÁÃÐä'�€Ê ƒF¶²­žã»xFx‘„F°Í"ä�n Â5²}D}cVÈ„˜hhã–„A0þ–LjM°šI¼$Ú…ê“i7&†A´Ev“¥¤ÝR ‡¤,0…¤Üa'“¶“ 0š7½&Ñ'C¤Ú·ð•þݤ›×D|Ñ/z¤ë¸I[@ƒÓ¤é6í%j“h—´›ŒÐm+LóKeÎËl«IÒk[Iý/׺[ëi·oÕëÞ­õµ·ÿÛÛ^šQ¦ÒêÒ·ê¶zµ¿Iý Õ®�§Ý!¯Õº{^>”¸GKiж‡ÝK„ÝHáwÿêõú_ËÔ;ß�½oí[Xõmî¸}Æ×ÿé¿õoÒýEµ–Ÿï¿×êßÃ^X΋ýå§°÷DÓõëÿÿõékÿê¿þÃþÒÿô¸__ÿ÷þÿí/ÿÿÿý¿ßÿÿoÿþÌŒ¢¹.W%ÿÿü±ßû÷’½ÿÿ%çÿðoþ¿þðoÿÿ + Hž;�ú#0—ÿÿ§þô½/ÿôÿá¿Û_ÿÜ7÷ÿþUP¤®T5-ï·_«uíÿ±¾ÿþÂ_é{ßõÿ¿ÿÿ÷ÖŸ__¿Û«¿ë¯uûo÷ûaÿûjßÿܬ<7ÝéѼ¿¿îŸöÿÚé}uû¯úóÉß}½ºÒÜ£ú¿oükißëÿi{­¥íþÙ¢Û4ýzëÛ×Û_¾ûïué¿õoïýád_ÛÊâ27�ºói´›¥·ì¶×m+<þÒ´½³êÿz[é½³ûMŸÖÒµ³úõiYÿÛ?ªûÖ¿Ž:öÒM�´¤šÚljÅ4Å-Ãaéi&› †È¹m+[I‹a„¶%mÖ‚a„®ÒM&I=°JîDÙi1½e¢r!•¤KdV"2œò¡¯“/"Wë U°›Pè0a+M=„˜a;I»OeÐJÈã»aSÂM²9&›"��ƒ¦*ƒ˜l ¡‚AŠMƒJwh Å&b‚i´œ3höa#šA‚ ¾TEÌœÁœ F€Á#™¦0�pF"<ˆ”*œÖ)ã"$3@€�ù²!ˆBf˜„ù²5³1 (Ÿ6a2Ó*ÆK¸a†"b­VœFB +¡ÑWŒªÄ+¥p`„! +!ˆP�A‚Ec U!éOl0SÛF†Â 44ƒa Ñ�¤í¤©¤øi'IÓL �!}?k?$xѹ£cðƒFÆ©£cP™<š69ñ£e œ„óCD$ÎsX2ˆ â""øÑn³B" ©¨H�ô´K݆éÛI�IÚ¤›I´E¶–“l³ýØARÒm&%”›CI°ƒ6Hi6“¤Ã³e¡lš)6©ÿÄUéÕ÷ê7Pš÷ñK„êýú¤ë¤ü&Ò´IétDž–®—Mé;ARmOº_¥ã^ôöÛŠ_V»]x¿ïN¾šßë´*˜i¼VñTéÝVöÿþÓ_oÖÚÜ/uáïú½htß\|{µÆÿ^õ¿KÿÇßàï¨cÿÃÿo×–9ÿº!ÔQc‘£nˆ$ÃD=÷ÇÝ[®’ö߯ûÖÕ†¾—ÿKõþXßåÖ´ÿþ¿Õ¦½aÛ½^˜kþßûþÿÿ¿°ÿ×ÿâam¥‚3ÿÃh㼟í‚,øoÿ¯ÿÿÿðßúÿý6AåºÌÚZOþ§Â mAÐ_øoÿ_ÿÿÿðßù ‘ßÿÄDb—_‡I½/ Ú ûÃí¥ÿ¯ÿÿ†ÿÐO÷þjéî·¥Ãuý÷ÿŠïþûë·¿ÒÿþÕzóÉÒWÒþ÷ÿíëÿõ÷ÿKþ¿ÿk÷¤Þ¾iúûå?_þÞݯííþÙÓvÿ×Ý!�zé~‘˾Ók£•ÿßõ¿š'¯VÍz]õþ¿Ý}µ‘­;«[àË—t±M´ÖcÕ_‡ †­©û¾ÂJÙîé6Ïm« ÷öaZv­­öÐl.ÂH4í,&š „ôà 7%tÓb› E&št¬SÚ 4Ób“cÂJÇi1VœpeÊDÆé/G¤Î„ÕÆŒòyŠu!óÃj¶)ÚjðÉ@LBawnƒ Ž &+U°Òa…`’a‚Š šl&ša&h$Ó«ˆŽ"".v7‹�ŠFF3$’ ÊÔ e'dè $WC�R=ºOõˆå”0ßýRëZ_ÛKI$¹‘A�‹gffMÕ«K TºaNÑ&[ÖÈ܉—)˜”Û*�ÑUG‰Ø6¤C +h“ïú_â�n�|_Qß}EÝÄFS*uÜ�­¢&¶·ó¼^:;ýTW!5*ÿÿ~¿ë®¿R4dº\äFzyÐÓ:ä|�¢>KQÿ]?Èžx.a’0ˆìŒa¡$PdD`y¤]¢ˆ“ ‘gó6)Ì (,£0ÁdˆÁʆ|L¸¸D%žÎE9 Y “dCŒ&EAXH98ÍQ z¨MUOÓHTô›ôl B¨U"%MQ°5M Ñ±…MY=“ÜQãØÿ £^|j� 0š7B43H&»eÐŒzM Î ã“<Í¤Ú áé;,‚ΛWD°æ Î&„ÚL4E†M¡¤òxÂêË:i&˜2g#¶L4�“:l"-´´°†“ÞšI´«km+„ßï¤ÞéWÓ´•¢QI¸ ߢQ^~»ÒM»Â}ÕÚ^¤é:%¾â»´ÿª»é~¯‹Nîþªâ¾ê›�{ÿõÖ©ãÖÖºî×ú¦Úÿãï¯êÝÿ§ãj›{Cª÷}öé[ýÐï¯zëq_ºÿþˆr÷ÇõÿÝýä‘_yc‘¢?~þµÿËŠœ<\~¿ÿÿËúþßÿþ>ÿ�ïþÞ­ÿ¨Ãÿ¯×ÿÿÿ¾¿ÿÿÿûúÿþ—ßû_]ÿÿÿø#ÿþÿÿÿÁÿõÿøoÿ ù�”dUó")ñÿÿÿü Ÿÿÿÿÿü ¿ÿmÿ èñÿh×…;‚™ +i…%ðŸÿÿïô¿ëÿÿÿý/õÿúÿ á/ïKÿ^Ñã¦K �#[ÿÿþº_ëýß®·¥ÿû ëýÃé~ú_{ï¨iý.þÝû}zûÿÿ·õëéoý¯ýúÿz]¿þ�»øÿ×ÿýuýÒÿÿoÒÕ¿ÿÿzÿʽÿÿUÿrâ)WÛ¯ïÛ3úõ¾ëûþÛ3öë«3ýzõÞÖÿlÑuzûíÿþvU�4ÛI=;/û %i'"1«iké­åëI7KI´“°ƒ´µÛ1Ó×fm­¥˜°¾ÚvC¾ï*K×ÖšaÒTö( ÐlV’l&˜¤m ƒA¦šØV(1VÚV“r8¦NÓŠvÂA64ÕŠm&!C6v›6±�–Œ¡"!31I˜ÌdŒ�ƃ:)3dSÆ„SŒ†2�MR3¡BM<ã*È‚æ™OYNju3¼ò[Ñ¢p⧇<4xl)áÏÂ�¨�‘â("T›s1ÕÊ0PÑCe….Áˆˆ2‡"#ƒ"" Áˆˆ0B#+§T)hŽÚ CI°‚iÝP°‚m'XCH6‚tƒ é:„-†‘çú*Ú œ*jŒí]&GÆçÏÍU0˜MÞUÈøùo«&ô�é:%®·uDá-¤ò^Ñô›IÒÒÒp¨�« &Ùi D\*º…XÏ«ÿÞ—Ë +úëÿÿ×ÿ×IWýuÿÿ­ïKI÷ïÿÿ„PÿÿoÿýB(ÿ¯öµÿÿûö`B»‘Ú¼’åA™™Ú‘�•g`hˆ_ÿÁ'ÿð�ÒÉTÿû„ÿþhÈï÷”íIä¯ÿÿú£µ¼’ Fv ¦ +‰hÎÔ¿ÿè/¿ô·Aiþ£ÿú÷êô~ÕÿÿüSA ƒ®}Ïx„h¤â¤D—¿÷ëÿú^.—ß¾þ¿Ký¿T¿KûÞºÿZßV•ªwW{×ÿú]¿úá+K·¾õö×õÿŠb’½´¿û]¤…ý!ÅEÒÿû~ªÝÿúMª·mÿÿ_¯Þ×þ«ïÿ^#�Œ]—’µôP�ÿÛféÛf‹ÿV ½šzÛ~Ù§ë¶¿þß´«·ÿjÝkê¾¹Ú¹#±+_ǯ˜í$û +GÛ=6?-þ�Ç•„˦Ïퟛ?í¤¿fÖ¾»vý®ÙþÓö÷K®õÿÿ×^�«ÅZ ’�AŠb•5 ¬ŽlS%†)Šb•ŠNa±¶’ÚÈ® 6.�ƒ.JÅA—/a‚ ´­&EÉÙ ¤�3f¥�Dƒ#y¦H"dd©‘¦Kæ’éú”ÿM4è0“Zi„Âtîí„ö¦š &m'\&Èè$ƒM6I²8UTÒ ¦A4›JÂP“EŽÌð�˜Ò ”R œ¸œ3HD'Î +pÂ.ÆO¢N3„GÉâæEãMD%d' ù‡�0� h„É�J2ì"¹1Ìr©�¢%!£dH"hÁ"É: +P,›¡G<ÈKÄA +(aEÏlÁx0A¢#EcYH¨‚ JÆ�… 1¦šÉýé6…¾ÓH' è!aªhi„ý !a¦˜O´Òo@ƒÂdò£cM�—‚¦˜F†pEó[׊¹eTb"ºÓ 3ÆÝ&ÒÑ.rȵ¥«.…Ïj&Ó<Ùa ¡!é6§†pÙgŸ5vZ„Û,¼ù…dИan“z¢;aM¤áÚOIüuéßÕ¤½ßÚßÞ½¥êúIÒoiýÒÝ+öÕÒxM¯ª +!:]0–÷õÛîÿô5´þÚ¥¿©.1{ûжõþ—íûo­µ×»´ë¯ZŽÒáÿ»úŽÿô·ÿºµûUïûׯîý7½~××èw´¸ÿÿÿkÿ¨òÓÿ×ÿ¬~›þ©Çø+¶–ÃõÿÒÿÞ¿úÒÿöÿýuþÿÿÿÿE§¥oëÿ×ÿ_ÿÿÿÿï_ýÿ_ýaÁ–ʶom/ÿ%çÿn¿ÿ¿ÿÿücÿþÿð_üºØqGÈ7†Òÿí/ÿ_ÿÿÿÿü _ÿÿú<ôUô°ÜEø…ÿáÿÝ÷ÿÿ_ÿ^ÿ×ëá/ÿ a´¬øFOÿÿnëÿý×úð¿uÿÿ¥ÿë¡ yk¾úÿö¿ÿÿ·ßÿÿ×ëëïúÿúèÕ_×û÷»þßþõýú®õõÝ¥ÿÿÒ­�k²ÿöÌÖ¿ûwêÃ>»?}¥ÿúvÚúû×ëÿ¯ ³EûJÛÓUM†EpÓNDÇM‚zÛavIí—Õ6Òײö¶Ü<ÇuÚ^bm-pƒÿ»vAù­ÑÇb‚všhZlT-4ÚMØ3 4MŠ0Ä$ÓŠA Ãi&ƒMˆI Ø§bƒaƒ´MˆM¤�Èâ˜M4Õ‡ †­. #®ŽvŠâ°ñ'ÈìÞ�Œ ÐiÙ¦H÷ Ð£á©ªm/ºz×ß×±ëÓ¿º­u¥ï\käp½¡úñïý‘ÉECQÞú\wî‡ÿ©uuåŒuª�ã¼´÷­Üÿo�*my^?ú “ùc‘[*?Ò_õ×ëÒÿסþ^uëE•ÿÿ–œ?Ôëÿí×çQßÿÿ¾Ÿÿÿ_oØÿúÿýÿÿÿGãÿÿ“ߺ[æEEÿKÿÿì~ÿÿÿ¦ÿÿ¿Ò´°oüÜs7™z—²Ã72ÿWÿÛAþ¿ß¤ßÿ~‚ý†‚°ÿáçiªÿú»ïn>ÿ¿ý¶ëÿ×øC¿î�÷þ–ûûûww×þßé7ï­í¿¤¾“¿öz}ÿúŸÛ¾öý»ooVþÿô›òuoO÷ëúÙ×ÿµrI™W‹ÿý%lþÞÞÙú¶ÌÓgöû=i6fµm[3×¾ý[µ»m¿µùöh¿÷4Òɹ'ý=?ئBÙ;a‚N› +`“eëmm&/¶a„­9é« äÝ6› äÃ<µÂ0àý†ØJÒl½Û *Õ¦šiÆÓ +˜TÄ*L1AŠb1 +ÐLBMÆÅ&›I ÐhlPl ˜¦!1¦›�4ÛbºˆI„Ø¥*Ä!æÈ"A)”‚ª"ùÐpÈ£JFÔŒh¬/ÉèH‚=IF0’r�H ’s ’ –„†D§Î¦¿•’„NŠ¡ 4 Á ñ `ƒB )0$V9â4à‘îO°‚hÑš3 &0É@A Â[ªNÑà ‘ERxasàjÏÇàœŸ’¡­²^OÍ�ÙDa¨A Â4� Ĭ0�l#8f˜A‚.Ù0�lÒF`Â5†�a„hf� h„™¬è¹�žeóÆuÌâ#.Y+e�×hDE “am²ÏDvÝÒ ‡t¶Zaª=´˜jˆ®Â4RÒ RM¤éMPL4-&i¡¤ÚN�mSÒa ¸¶:TÂgÍ’Ÿ„œunê‚}¤¯÷Õ´Ý,*ÛikI^éa]-t•©ó“Òm]+Aœ6Z“ËàÚh",m¸ÿMµîí¾“{¨½;êŸ^®“®£îºt·}¥ñJéô­z~¡0�ÿ¯¯¾íÿzÝ:»½~…éx©+Š6ã!j¥õkÕiöÝZÿ¥×ÿþ­ü>·åŽF#øÿ,u v£å�}¤8zþG +¾ÿïÿm-[ÿþëö­þ?ëø°ýb£ß.°ÔYÃ_m¤ÿý[/ÿÿ¯ö˜ÿÿÿé(iÿ[ü:þ…}ÿÿè0ÅÿÿþÚÿëþ­®iÿ·ÿÿÝù±r±ƒ;tïÿÿÿÃÿÿ“îõ‡gÿÿ†ÿÿ÷Uÿøˆÿÿÿƒ�ÿÿ«¶¡Â°Ú þÿÁ¿ÿÿ§ÿû·_ÿÿï·^ÿéqxp—ßÿ½ÿwûkÿãlêµÿÿëß×ïý-[¯ûõØýÿŠÿý«ÿÿí¯œÿÿÿU[:®½¾õý¿Ûþ«ÿî¶—ÿÚoZþÚ^Ù:ÿõnõ_ï­³§ÿ÷êÿßÛÛ¯lÂþûVû«0ž—l/ý«!Œgî­;lÏÛ?Úí™þßí™í­×ÿðØI´“N5MY;m¥iZlRz§\Ûa„­)pÕ†Û´“a„­&»VËÌ4›ô�}µì�è1V› 4ÐlÒdqb˜M¤šl$ 4Úì1 † 0M&Å “btÅ&ƒˆLSiRi„ä ï–ºÏ!” ¢‘DÄ#ZžÙCEs4åc'B(Ô†1M0Rº (…<0‘t +xsÃh0ƒ%àŽ­ö ƒ”ȦæEã#?;.¡_ëÒÿZR¸´[¬E.2²22›K +i6IbS)œ#¼+!ä­¥ÿ^ôŸOµ÷¿«N(øëôú|\Dy3ÇuÈ*ë_Zò ëþ³!AJ3$fË*Ä "¹B¬’ñH¾lÏ R@΃#aÈ�M3g“‘ ¢¯8Íd™ ˆ´iLŒŠvu,æ™23£CTÔ'”hÖÑíçä| (LQñ•r„ÓF†¬‹æ°Ñ²i#[Pžœ3ƒ�Òl",0ˆ°ð¡Úì³ÂM¢,0“ª#‚$4�\ ›IÕ'CÒ ÓHZM¡zL4Õ ·¤é„ÒmˆaÝÒmB—77ªºOêÜâ¨& Òºav–§’祽"^Ò´IòΛWD¸A6“iž0“i\¾nòÌ-yý¦Úot©/é½»Úw]uÕÝ1h?ï»itÓ«{½OMwA÷uz½{ï½ {®×¿õ®‡]ýõõN¤p®=xÓº[é +dp�ÿ^ñÿýGúoá»ø×Ëï|vÕÿõm§úýP÷þ¶¿ß¯¯ðÿÿQ¯a÷ým¨ÿÿ�,/�ð»ïúÿûý_¯áï«kõÿþ¾—¿ëð_ÿÁ{ÿá¿ðW¯ðÃÿëÿÿõÿÿ×Ê色ª£Gÿð‚ÿü7þ£i‡üŸõÿÿüŸÿÿ‘¦G~d‘…+–ÄK)óm�à젉ÿ¤ÿþÿK „®ú þvëïÿü ¯ïÿÐOçkMr"2‚ƤCðÁAizZ_ik·^ÿéqþ­.ÿÿéßþ—þþè˜äWúµõÿÿ×õ÷ÿKÕ?·×]úÿô½ßëô¿§ÿ„}žŸH]ô½uí¯ïù#ýW¿8¾ºýoÛ¯þ¾Û×õ_h�©ë}¯öºë÷¯Ú_¥þ�Ã0›oï××é¿uÿUöþµÿÎË//Ç;*÷+Ö¸Gpí+Jí³Õ„f=ºOºUü+ þÏí ý--=«JÏßiZý§­™¦Ìó•«}ëÿ®8꾸§´ “L1R8Å&ÚJ­¤ši¦Ã0L6)Š[JÐJÃaúL0Ai½-éÁ—.à + ½+äBäW =H”nL†eeÿÿ]TTR« §aa†•§Þ�5°™$Ø«TéêÁ ÅA†A ÓM6A4ئ+A ˜3ÓNšh„™S4Â5‡„ �‘ æ€eFl�&Ê2æAæÆFpŒÄüÀÈ1 ä@ʲæU’ÂA‘ЄPGNP)šø#EÿÑÞ�l¨dvÝyÈïÞ"=õá¿ýtïÿÿøKÒþöÿ�m ½ÿÿ®õ÷÷ÿG‡÷û{¥þ—¥ÿé7AÂ\¥ïÿ_ÿ'O¥^íÿïßþ¾–¿LT7ôdûKïÿ[}zý_®•ÿùη¯ÿõ}µ§'õ×}÷kÙÿK¶êÕÍ?­&Û3ó?ÿû_ýuýéÿ×í}¾È¹Ð[ %i'dzÒÒa‚^’kl4•5þëzí| ì°™t«kµuòûf}§vg®v’ 1V‚MŠ´­Ä$„¬'lUé¦M´‚ °‚M;YXØf ;m×¥ †Úl0JDæ6%pÔ¬q �Â#CG» Š�‰ÂG·‚-Æ7†m'wq[š§l&˜TÒa0Ø"‡]0Á'vÓb Ø0Ä$â#4‚g.ÁEs ÄB)‚zec ¦ƒ òÈ—¹7&þ¯ýúR¸¾d5ò;W™'ÿê +i�šáAB‚E¹ií¥í:II“P¡˜A²Ük¿ß~V4hghÁ…zÝßr¨Íäù¤b0+–Иo“,aâÃ|ÏýEvš¦Oçc?¯ëºM;¯2FlÈy³Ê±”d™ì�’ ÍÑ™d2:ggRÈQ�£¼˜M×GdJS¢ÈÎÔ&¡<ŸÐFpÑ æ9 2Fa!Í„yÖj†³ Ù)Èñh ÑfÆ�„BtØÉZ^F£CFØ h„ 3P…åX„ã(FÊ�l! z¤IäÑH0“¤Û†’oF橤ÚXpÚNši¤}4ln—ª 0š5½»a�l#; +¯%Íç… i;ªMÉý-+i¤›Òa ÎV“î–q¤Ó- ûI¶ÿTxa ƒl´&ÐM¤Ã ´�aëpîé¥ý'í]/¥ô¸M¥io¨ð›Z}´¯Ź'Kz¶“¤Þ®“Âo]]^ê5î¶ïZk«nÚ—×÷ÿõØ}ž÷¡¦úmk~©.ž>ûî�ÿõ¯,Iuï¯öûÿ\oà®Û¯¯B•ê>ÿï¿×é¿õYiû~‹­~Áÿþè˜ä†Ÿý7Õ¯é]wßÿ×úéõ×ï_áÿÿÐü¼þ¾¯«~¿ÿýÿý/ýÿöÿÿûéÿÿÿõòº§G�ÿäFÿÿûÿÿá¿ÛKýïÇÿÿÑCýGef;NGe±�.UhKÿý_ÿï½/ÿÿÁ¿ÛK×_ÿÿÿðIü$áB0ì)XÊ£ +t¾ºý/Û¯ý¿ßêï÷þÞÒoÿÿþ½ú^“Zj¤½•8*××_´¿×ýâ›í-wü?¬Ã_ÒoõÛ­ºÝ{ ú‹Ð¾ï¾ïþ¿ÛU÷þû¯þ›ÿ8¿Â_¿ÿ^¾·×þ®ûÿýut¿ÿºööÍ7onµï¾ÿÿí&üŸ×oßo­µ_ÿŸ;_ººí†´Û0·KÛNÒÛ?Û¯M™¦×úþAÁ¿lÏI¾þ·K´­µï__ÿ¼6ÒUcƒ.QÛi&­‚°Á&˜a%m+I†°›fµý‡˜íXa%»ÒÒî›n›=:[gûã²êó#K×ÿ×Oa$Ó &L%m$í‘Ä1 b“ma&)�‘Æé4Ðm±A4ؤÕ0‡i ÃiH¾ÂAŠm$ÃÃTÎÂÌø¤ù²$ d"¹\Tˆ´žÉÑÔR�dZS˜a ÉhG9à ÑÈ•#Aùì�þ§”e^±c‚AÊV4tà„A¡ BžÙ>a0ˆpb¢ É�(L‹2±£Û +�6» $о)X4˜AŠa1 6ši;;*”#CP˜EÁ�mËœê8Ñ¡ðrT64|i„\2�0�a„xarœ<&˜@ÉÁ5¼« �!L`f¡O20Lœ8d4m™ŠN*"‹©mÔ±Ëq¦duNd4ÍäYƒ(°ˆŒ­¥ '‹m ÐA6MÉ—L$·wI†äÎa¦©6m!nG *jÕ ˜{%ʰ˜T›Âmg¤nz7QòvGÍ0��²i'üBOˆˆŠ%á=B[VÝé'ÝÒö�' —i7é<vx‡‚ ïMfl*MÙöí*W¤êé4Òm&äИhúÜkk_é¿×ýSÇí§UKKÞ›Ûêýý½&¿Õ+ÒÒ©'IZ[IhŒþ¶«ßm }¾µøïVÜPºÔ}ÝÝ%#…ݺ÷Q§t�{W¡õõNký¯ŽÿÁWéú!è_Cõöí¥ëî—ûäpº÷Û©+_�ý/ÿÑdíþ¿Ë¬=~Zº_¿ žßÿûuòH×ø‚D:4ÓVƒõý/öÒÿØ~Þ’ÿûÿiþºC®ÃýO˦š 1 <vëÿÁûÿý{~ÚÿþÝì=/_ò‚ÜL¬bÑãí¥þÝ¿ðßõdDÿÿþŽí/ÿ×ÿmºð_â"#„¿p•ÿªOþÿ ¿ÿ¿´¿ÿúÿÁ¶Òð�ú_âí×—ý·éxK¿ý÷Ý/ÿm{ü;Ú_ÿü ¯]¤¿÷ÛöÿÿÖþ*?ÿŠþ÷œp½~þ¿®ÿªþÙÓþ½vÿ­'ozþý­½ó‰ÂŽÚUÿ×á—6Í¥¿÷ýn»z·ö½7ôÿ·ÿ÷ú_®ßNàûb µn–¬Çe×jÃ=ÝmÕ¶Ô¿g×ékm™ùùëöÿÛ4öÖù�³M;»3^ì4˜M¶)°•ìS Y;b­$ÛI683à +�é&¶Ã®é×M†sÓtØ`’¶�¤ÃÛKaù�µZm4Ÿlb‚mSH6 +ƒLPM°’lPb“NÐI‚i± =é�±I§I± Ç¤Ú Šb Šb“ˆˆŠ9â ”ÌCE:*â+#åŽˆæŠÆÏ2¹ƒ#óqWEc4Á„�mÑY -’°˜…j*ª $\› +GsBâ)ˆŒ |î©n¬7IñÄF…~—ªOºÒô¸KI+©dJdDÃJèÒ¨PȆÅQ¦%wƒÁˆRlP!â0)ÀÃåª$˜C…MHAûˆÃÂi—?ÞŸ™¢7›2 ˆ†B2#oò$Η�Ñ&ŽÃS!L ÌâH& 2Œ Â\Ìà�Ÿñ¶—‚4?0Éã(‹¼ÀðDDäDU–æ³ÙHFêjîš;´ƒi¦“ªmV—¤ÚMªi7£cFÊ?4ÂlSHØM:‡wL6“iž4�pݦÒð‚t�pÒy|“i6l!†ƒI0Ðûý:WN»NôÅyô¿Âoè>•®’äãq÷Õ·ë§Ö½hRÝ´¾õìtèmû×ã¿{ìk^õïÇhnú‘¿ÿ_ÿt›úÇïE¹$áËŒý(‚¯ÿ·ëÿ|ÝUíwña¨í豟ÿÿût¿›]×ýºúÿÿþSßêŽïÇÁþÏÿ ?m|³ +ïÿþ“þ•7ã„áÿ‡¿ü³‰ ¤ØÐ‰Uÿô½/Øký¥ô—þý+ÓËz Žð§ehìE¯öÿKý&õt½Rÿ·}Šû{Iô0Âÿþ½WÞ¯ï_ׯ{öúõ÷ÿî¿ÿ«ù¦ÚúKë¶B}í{E-=o_¶ý[¯µý&ÿ»O­n¶ÌÖ“š/lÑb¹\K#xäUm4õ²ýöÚ]ȃ†šn¶�«g(2åiHƒ†©-­Ó /¶¶}®ª«ˆô Óm šl'M:A¦šb˜O¤Â{ &¦Òb“iŠ\² ²�š™%Š}rN)ZúþVCL+4C§†ŠÌ*�äþ¨öE¼ðƒ ¨ªåX…l(à 7`�n"9”2æÐ áŸ#L¹‚]”2ìØ§Œ•æÉ™00@Ȧ`ψO›#Y™Œ B�”fÉ(GFIŒˆd¨´ó‘¬ÉQòÞˆï3!Ù¼”â Á‹�I¿TÒáY” ÷Mª65LžP‹°Ñ®�a¨M4grÌs[(‚ #ŽÑ�„è@Â4dŒÃ#"ñQ˜ ^5ˆŽÚXIÜ8L¹¤ØKvTE»-œ0‚m &ÑÚ ´œ ›DXl™ÂnM›BÒÞú3´›FÆ©ž’d~iÓÑ륤éoí%«¾°¯§ôJ)ZD¢•ïÚ ßÝRmúM²Ä̆.“i0ФêÚMú×V¨?´+ÓôÕ?¶©»^í»^¢–Õé~•¾•þÚV“¢QUiakõáx¨ÿZ�«¿Ö†â†Óâ‡jG O×êÝ:·þª¶âõí=|.:_ã¤ÿÿÈ ¢®Ú–>ýü}ë~¿®:m§]þ¾–º_þ—ÿË-¢Æ_HXj?ÿ·ßÿ¢Ü�Ÿÿ÷á5ÿ×oºÿ_ÿ‡_þ¿«øÿÿÿ« ÿ‚ýWÿÿøaÿ¯ÿÿÿþßúñ�ü#G׿ÿÿÃä6Gÿÿÿþ—ëÐ_ ½´¯ÿûÿ ¿þ¿ÿÿm/Áý{׸¯ÿþÃÿ„ÿýÿí ¿A}/¿Ò÷ªÿ½úÝßÿöÒö×þÿè }U¶ïõn¿ÿï^ο¯ÿÿÿ½xKõýíß÷¶÷~»f‹lÓºÛ'^ßúûuí×ûv¿ÿý‘G †m¶rl¸K‘G †r×Û/{ -¶Ò¶Á+¦Ïÿýî—n—~ÙžÝ|ƒÏúø' Pb™S„ìUZiÄ+MˆI±V�MŠÒb“VE°Øl‹–ÒM[IdKvà :IíúÄ>Ð4 Á0¡#ãi `´ghñ¶‚pÃI°¢­„Å0“NNÒm‘É4Ãi ØI¦Å6’a6iÜ•ÂrÙ•ÉÇ1aU+aˆH®ÊÆÄ$|a¤{£C 0§‡GÏ¤Ý j–“¿«¤êË=&Ó>Òý¦’´›'ÌÚ á…x “zM¤èŽÚ Ò „ Ù¤áRvLºÛ&= ðÝúMíêš^“Ö¿é[Ú¿¾––¾Ý6“×ÒZè'JÒn›QUi¤®…ÀÝþ¾ï�Úõ¿«{×ý)p‹ÐûM»j©êÕo«Km?ãí½;nÿo½9OZþõµ�í®°µýÝÒCèkièi¿·½'Þ¿õïâºÚÿú·ëýb:_ÞÅKrG¨þ«ï áë~ÿõÿþ?ëÿÿíR_÷ëÿÿ‡Ãÿÿÿþ¿ÿÿþ¾õ¯ÿºé/ûûaÿÿÿÿýoÿÿðGë‚3ÿý¿Áþ¿á½¿ÿÍ‹ÿ÷ÿÿü$þßh/ÿïì%ÿþÁ¿ÿÿ÷þ÷Õÿÿ×¥ÿXK¿ëE?ô¿õðÞõÿüz]wëßí¯¥ü7ÿõÕ¶÷K÷ÿ}ÿÿþß®Û~Ûïÿþ«ïk·ÿ¥}ÚÿmþûíÿÿÝ+®Ìöô»ïý´¿þ›×þ´›ooý½/9¾sý/ÿ÷Z[iYþÌ#’ÛpÛ‡Ù…½}¯¹÷gïaþ–—fzý·_¥­[ÿö¼6M-Š SžÅ1¦Æ­¤šÁ—/öJEpÛ9/i&¶Ø%¶{‘ m³Ó®·JÝfi_ýðÄ)àŒˆa˜ZaÓ"¸I´ƒb“M„ÐL éà°Å Ó´“ à PL1ÂÐa0Å6‚M6ÒM´£m%TÕ�9kŠy�Ò "–‰á‚hC*è¬pˆäŠÁ£ä0Høa0š[ ÛÆÓ‚ 4í’ºqÄDvÄDE!Îæƒ�͈†A‚ÂUÄDª¡Ë0˜oªÿ®’Iz•\·>WÒÂs%œî‚ GÅŠÜ(æä!•έDFy^aœïADF¡Ã%á¤á‘,0ÿ;ÒÝZa6õ¥Û¡§¢Uë^õ®¾’ëÖ«úéhï)z�|×%¯õ¬ê! !8”H�žd‚.Ιˆu�ÞfDˆü`ÌS¬~3flœÈˆÜPŠNÍO¢ƒ:j¤7]44lz65P‡¢ñ… ê¬iè» 4Ô&˜!„L†Ë˜ Ò (Mу„•„a'JÕ+ +¡È4ÃUZI°ª ™Âl*…PŽôn…ÏA6��é#cÖ¯£Û¥«¤á.‚Z;Â;Ð^•£�GIµ ¤Ú8ð¨ïGŠNZ ­,%ô´„aúƒ&tßÒa$×éiRXK¤�-&´«G„� ]5;ÒÒÒÂTŽé-'KT’÷…Õjô´…!K_¯i*ÖÒý ’é/]:ZTI-%KKJ”Ré$´Ú R­+DØ.&Æ�-U/K!B…%Tº¤‡I%­!TµT†´´´•-%I| ’ñ¯²l +ÈPeb;QRê•iRZªÇJ!- --ÔcÒIRÐÕkJ„-oZ^òmmBM¤«¶ºéKø. U_Ö %ÒZªú]]¡ ¾ºmu_üzO\•jLBßש1ëÖ‚(u×"�ùG Jè„N{$y8„ ¥�Ѳ8DŒÙ�E" è3Y© dhÊEeÎF£&#®ue>¤��1úÿKô§UT—õúK­‘Ú_¯&­¤Ž=vóò„ôlaØFÀÕ4„5†QѬ38 ä'#;G¶Sæx@Ñ Ð�„ÄKÁƒ3˜0F€f�@›%Â"82q0@ÈhÛèá�$Ìͳ>õÿ@Š}*Y´¦þ¿KÒK¤´ëõ{éWM²Ï‰á& ´›‹[„Dv�l",0‚maÉœ áØI¦Ÿ„{h&Òa¤ÚN�°çç„lhØ��¦Ÿ„5²Ÿ Éy9™ØAÒìŸÉü¡k“뤒ô륔-^ºój’£j¨ß”/~é,ßG›ý`›ëWVà˜MÁÒ¸&ÖÐ'uÜ*Ÿl´7I´�'IÒl$ÃeˆM¤ÞM„>Gp‚l fÍô,#F—¥íª¤ßát©t«Ö½iR¥ÒÕtµÉõ¼Ÿ7º¤µ¥¤b}ÝõM'§ëvÒozÞüRÔZÛ~ÖÒuñ_wIÒoîI×ÚWM»¢\!7^Òl °––­-,%t»a.�.µJªZ¥¤ÚU¶·ZTªµWîÓz+nûOï¡m?uûý<„£]é¥zÒúMÐÿôþõôÛJÒm(¦ÒX¤*)Ò¥´’ô—K iiW¶•¥¾‚¿K iazÿå¹j¿ûVþXäZ~ðÛÿÐê»C[èi½w÷CéÞƒV)ŠŠ…L(P›AjÅjÚ +—ŠŠŠXvt–Û u„(¨…uûøêßû×éÔ=‡ÿòÉLJ-É'¾«ôßü‡ýþa6A‚¦UM„¨6M º¨L*ªb˜ œ6!6•T*m/ÿÿÿÿÿa¬?ÿõaã_ïÿú,ÇÿæEHŒA Âš´ÓA“,5v! ÕBªa0‚m°˜… ª¦+ÿÿÿÿÿÃjÿÿVÿ÷¯ÿÿÿRàÂÁ„WÁ ÁB !ÿÿÿÿÿ†Áá¿ÿðFßÿÿÿûÿæÅˆ¤YÅ_ÿÿÿßá´°ÝþX?ÿÿÿÿÿÿÿ»n¿ëÿý ÿþ“†ûÿ¯ÿÿÿÇÿ_ëþ½{¿¿ÿÝ¥»î»uÿÿÒývÛzÿÛ_ÿ4Ýs‹¿ÿõ÷K»ýÿÿÿÚ]™íÚÿ¤õíš/¶ýoÿöÛ\çMß¶õ·ÿ·ÿü² é²÷ÖÚVm/í+_mÒ9x@ºþý³ófž¿f{¤­Ú[¥š/Û4_ÿí( �„lPbƒh$ÂiÚ6‚TؤՑmÕÈ®ÚJ·"ãVI† Hƒ‘Žé°“umž›^ëAúÚZ·¯í&a„LRÝÅ1IÛ 4áElši´�± ˆL † Bl$bƒh$Ãh$ka�µnBïO„fÀGc1šÂ #±³ÂhecEsjVQXÁ„ &šba ¦ˆaE(cº´ÓjÓ`µ §kÄG25FSGkHíaˆÊÌ- °ßÿ¥ô©¨ÓAÑ¡§ÿ+Še*™瑼ÞyFˆ*–p^ÈðP,�µÌ¹™dP)ÐgQ™¢«2RgbÄDFF+µL-ü(DÜ4hhöÓ +¸G†—‚Ýê·ÎÍA +‚@˜*?´a&ÈÚ<�#}»êÖ¹7º÷©.²´Kƒ| eE&Õ½¸â«ßÛ¥®¸pÃeü œzt›JÚh‰bþ“µ÷ô“×ÛÝ'Æ×Wx_þDü“ý±Zç <äj-¼R;PÉuýöÝ/þ¾W™vdŸ½fš!:D&B¬=½" FàÊ"ì d�>ºÝQäu‡²ü˜zD¥" \öjD|м“D|ªkúªût•“991ðfÍ&öý5 §M£aŸJêí¤¡¤ƒH  Ÿ4‚ #@y) ˆ"ï‚ Aœ±‚4— !>a’b"ÀÂ!&E(2*¡‘�DT()ˆ+ $A- HÜE¥[øV ›q„é7úASÝKÙ%å¹+ý¿áÈ'ÿm©cêÚ¨rǵõâ»^íMýþ/ÿÿûÿ_ô¿íWÿ­vÿõ×üzýþl4N¯×¨ïˬ<*oÿý‡«uËtwÿÿÿ�þ±í¥õþÿÿýí/ÕºûÿÿØ~ï×ëô¡¥úëÿÿïì>¿H}6—ÿþ–ÿáÛAz_Ð"¡ÿÿæ“í¯þï×ÿÿü7íÿÿÿ†úÿÿÿß°ÌǯýŽ+ÿïþÿÒØ;ÒzuVßÿý/é´¿ ?ý/ÿøoÁ¿ÿÿðßø#ÿÿÿýµÿýïÓz[ÿ¥£iÒµ½/ÿÒ÷_ý-´ûßÿ†ü=ÿýÿaïð‚ÿÿÿÿÿÿïÿÿû�þ¡&ôŠô“}ÿþ¿~—ÖÿÿïïþßÿáÿÒÿÿúðãßýªïÿoK4í×ý%z~¯ÿÿ¥Ú¯õí^¾—vïúß­ÝÿK¶Òÿÿ×ß￘_}¶~ÒÕµÿ´ä1ÌÏÐÛI´•öÍÿëû·ëíÚMö¾¯š}ç?uï^οª¿ÿÿ·ûú_ßN4Ó‘q«•$Õµ½S‘ ¶KúÒ[³ ~Öï·ÏºÛ?ý§MŸú³?zöÍ;û­³EÖß·ÿÛu÷ýý^söÿoT›Iì+M¤ÈèŽhP`ÒTí6M±A¡´ƒiÓŠb�j¶ª›ïLR§\݆I°•¶•é-˜î›N醓wfi]­¥mŸî¬ÿþ­º_ÿ«iköõíš(ˆŒ¬“%*°R¨@ÄGÆi¢­šL Ò=0‚69ÐlRv +´ÓM;§7§i4Úzb0�b“m ši'ÚR,m&)Ž6ÒL1ZJÅi)5dRäW †m¶©­—ÓOnÝ&Â(}¥˜í+í)7Go9nh„YAÎþžÚ+¢" )V! +{lކ¼«­…ôÅ27  Å&²:�l&)¤Ó¦�ŠmšlRÚrxa¥G}1A´‚¦ +ÝTRq&å¨D!`„DCŠ¡¨„E4 öåqTÊ*…<4V6_E]Ø`¡D& +™XM‚(u{ Ö""4[�¼" !DF´¸ˆ�´’ö•pÅ q¸N?þWœvW–à¼)/‚E"6 ôô̽£Ä)ØÆ[–Er¼ÈžWWÿKó²Èín +ÎD… 6îþ£ÿ÷„x¯™£µi­ßßÝ_új)Æ×µ[Ó¤/ýuñ;.ŠÂÎÊ—Ì…FtlбžÉ�) jA §S lÖÓ!GgTGÓÿU× ÐÂ5‡¦Q„]†ÈøŸm%&gByvsž ð"æ# “>á/5²b6GH�‘ò„`Ñb 3ù‚82ÊÃ:ŠH"4�³1¢!ÈÈ#,5Ã#EH†2ÔìÏ'Íq©šÌ‚þ«¦«Òm&àÎ0¨&ÚiÚN¨‹Lt‚a¡¤é6êáÒa¦i v�Œ&ªšaa°0�†HÓÐÔ#`aÙ‚aa£tá0�Â.Ú6NËsL0@Á.Á\J& �æÈ� !8„ù�‘¡Hb(‡˜f„¥!’rCO9ˆ‹ÇSRHDLµë¤ð­R·¤­,,¸¥h›Òp“lÇ´ÒV™ÂKrt ††ˆì�M„EºM¤ØCIÙ4&ÐN†‚m-ÝA0ÒuBÓI´™ÙI$èxMùFÆ©£C»aÚ5†©„lšFxMÈ¡!Á¢¡Öœ! —“¡œŸ— #@hˆ„ɲ$ ­/ÿÒ¿ðëÓ_¤½:W% ­´J((Z\&ÒÒ¹'I[IZŠ$ô­-ðºV–ÀÏ4µi&Ö�&ážiÒt›‹m-é6A´4�B"ÃI©2l™áA´-'wÕPL4ƒ„Ѱ=j>èmè~îú‘ÂãZC»zDp­6«C¥¸´î»Z´½—×· zOºMzOÓM¥¥KªŠMV¶¢•Ât�,$ëh“¤°”jÓ¤ÝD'JÑ.¤ìº]]+I¶Y‚ÎGm&ãÕo!ÏJXéw¯�Ç_ê7|Žý¶Ÿá{ÐÆã_B†¿â¤p«¿ÿ¼okÓÓvªÖ–¯OMÐi'}ýÒm鵺oë}×[ø'Júþ‹ô†¿ôXÏïk,[jsõÿÇõD8}I†òÇ_éGî×�Ú½¤>½Ç½t*+¸¯¾—¯×é{øÑ}i¿õZÿïZÿþ¿¾–ô?ÿÿòÅ¿.°õÿEÖ¿ÿå‹áÿMÃE¹#ñÕ*o÷¯ýÿZëýÕ Þ8/ÿ¯ÿý*þ—ÿÿø_KÂû¥ÿ×ÿ]%Ø®ÃÇ××ëÿú¿å‹ñÿñ¦ÿÑÝaÿûuÿÿ‚0ÿÛÿÿÿÂÿá|0ÿÿÿýØi°ÿT¿×ïo×ÿ½Ò_þ[sDÿëßÿáÿé_ÿÿèñûð�ÿÿÿàŒöëÃû‚0ÿÿÿÒÿÿÿÿÿøK¿íº¿ÿ½/ÿþÿÿ ÿÒü7Ýþ¿ÿ¥¶ðÝÿƒþ“ÿÿûuÿÿšÿÿÿßþ=ÿÿKoاëÿÿ_Þõûÿ{¿ý± ÃþÞýßýÿ¶_ÿÖ¯ÿÿ׿ۦïÿoUþ¯Výëý¿Kðû¿÷¿þº6½ßú{õÞÛ­ÿÞßÿéûÿ÷Õ¿ÛvÍ6ÿû4_·îß_ÚÿÒûmúí�?»ÿnÿõÖóÉïõ8Ÿô»õÿ¬ ‡ëû½/ýî¿ÿ¶þÏý„›Aÿ¶·i·kÙûVÌïzÿUý½>ìÑu¶N›õm·ÿõVõÛöÿoÕ[mþÿ×uÿýï_öðà ŠM4ÃAŠb“MY™sYpØfë#×M„­&Ai¶’kÝ„wVêÏ~Çæ6Òµ9vmݰìÿiÿû üÏûu}ºV“fë·imÿÃ0»¯Ûõî×mºÿím'¦Âi‚dp“M8AˆH6LS“pÄ-Å Ðl4“M0›é Ã¤ †Å2šV˜b˜ãdÅ1¦�¬Šá°Øa$í ÙËVÒº†–¶‡eÓ ôÙýºÛAÝ샤f6Ò¿lý÷}ŸN¿í™òܶ|“å@ž؈0M|bQ0‘í£D¤hwôÕá„ÒÕPj+A°™Èâ Èá&šÜ/ Rv“�¶‚Ò RpØ… 1LPmƒb•4ØqN”‹�6)nDá«a[I[/i°ÂRÈͳÅr4„!ƒ éÂ;%å^Veca§› ${aŠ ${a!Šbƒ +ÂÓL Â`ÖÙ$Ööa¤ÂO`“MÚjGxaŠmƒˆI¦ÅGɶ¸s!¨ÈŒíFNb„3Û(@ÁJÆŠè`„0ƒBŠÆA“9îÂG·� ŽUç‹ ¤†@‹ ÁLôåAÓaU& i´Õ°½WËpTvIƒˆˆ ŠØÞd„eN†«â®¯ˆW¥®½+Òé.º_…m$´´«ARl$-¤ÚAm.Å1LPVÒÑÙ<0A‚ ÅDDh(�ÿËuÙVAbºµ2‰óˆÁ›0¤º +W.ì�íU'êW*Ëu<ØÌŒã'ŠTM–rKõM{Z…3‚–ö‚‚÷ªwÙ9ÕïA©/w½qÈ—îûôä Íû«íÒï\È�;|È&;»üS$½iþ÷¥Zëªã㆘C�¶+>!# ódUŒ‡“£1�Ç®lΤH#¡‰MFC=HÞv1ï_z¤laÖL£F°Î ñka”Bä&¬4{ #["™ƒ»D$Á‚�f7›$BLð_ƒ'Í‘@†y²:kaƒdƒ$TEA‚~NB’ ŠÉXˆDþH3°kïýº¤ØAi<ŽÚaÛ´“h-“9´a'I†š¤Ú M O ÖÔ&�”ÂhØÉäóò„ÁdQ²à4kOÂxF€Ê"æpÁMŠviG`Ê3á#² ˜âE Ï!'é¶f3™Äy͈J#A�hŠDã"ï9‡œ¯é_¤ðV[i¤›IÞaot¬+¥†Zi<¾ ¨L³�-ÛW œ4˜hl´Q´šAH6ƒ6aÞ Ú¦‚mà &Ô*h^‚ ¦˜MHÒFÆ¡í¤E¤Â468©í‘¨&°0‹²xOÉô<v#8< e#@xAíÒUIÕ÷zÛ¥M~ºÔWÝ__ ¿¢QW„Þ4ÚNˆßª øIiZLSú¶¡¤›xIiž#Ì"^ð“hŽÁœ4›,(AZOÝ4¶šH:M„wp¨p›Iôxi¤Èò‡w¾:ÒÔŽT:ýÔŽÐÜkâÿýƽզÖÚÚÒuumÚn j÷[t’úݾ®N•«¤®—ºRp’~”Q'¥¥»ª'¶“ظUjÁ½ôˆrÏ»ò3¾Xä_ÿýí¥m´·­®Ýé¶·wí!¦ÚøÕ·ÛKÚwwÔ¸G}V·¦’ö+¿´KuÿµZûzUÿYjt¿Qt±ÿÔX4L²¼ºÃÿè‡Úÿÿëÿ/µêÞ;ý_Oî£^ï Ò¼c_ß:ë}éí§ëÿ^¿ý]~”=í/_aïÿÿ×ÿºü²áÿï¢É~‹rg^�ýã·ÃtA'ÿjXñÿïü§¥‚ÿí¥ÿøaúøoßõöÿÿ¤¿ùáwÛ÷ÿÿÿï]ÿJ.¥ÿ¨þÿ÷[ôgÿÿÿøoÁ·ýx#ðßÿþÝÿ�þÿÿýtð·L?ÿú_ô¿{ ¿ûÒÿûxA}ƒ~Úú ðßÿþÚ_ÿ_û`ŒÿÿÿÿÁyCõ|7ÿÿ¯ÿö+°—íïÿáýøëÂOáÿýýŠ¿üôÒÿÿÿÿFŽ“x#GH7ÿÿ�F^ý´¿Uû×·wþîúû¿°ý/߯ÿà¿ÿÒôw ¿ÿ¿îÿAz· ¶ðßÿý ¿ÛA}ݵïý­ÿìë÷¯Ù×ô¿×ßW¯ü"ÊŸÿ·÷M¯ÿÿûý¯¥zðß»ÿô¿Ø…ú¦Ì×·ûf‹lÓ¿öý¿öÿÿ_ÎV¿ú[iõëkÿÖßíþé}>–Óûÿî—ú5½­ mŸ­mµÛI¿û?ÝYÿÖìÿö“]ëÿ«×kò&Þ¿ÝvÒoÿ×ÿÛûUÕ½W'ßnûþõü%ö°ÅXiŠTÕŠiŠbÙé±ZLRr+†È¼ÂV—[eåˆwÚV“i'˜õ¶ †zmÛ­³ú^¿ÚJÙžqþÙŸ~ݧ¥~Ÿ¥Ù¢oÿmÿ»M;A„�¦Âv#€¡Za„Å“a=)ºA„�l”BiéZ ´®)4¶Å6‚ Ú¦ÚJà +·"¸z§¥l0—¦¬0“`žÃ9A—¿aä}î•°­íý¶}]ú²þMÌÑÌZ£]=¶š  �‘V!SS>û¢˜ › +î†al&Å Ø„N�§h$Ø­4ÐlSMŠi„˜M4ÅSiCb˜0E>-UŽ †šÛvœ³”çjTÛ) #Z•ÐaOW6a#ÛEc4¨ŽF¨0NŠÇ)ˆ`ƒ'aOaBí9�õ\PL0›ÙSA°˜M&švš|p¹7$„D6[¤Á‚…¡R + çh®h÷Ö¯Õ8«ˆˆ×ÒÕqK¥õ¥ýAVÒé/¯l0K½¥ ˜bim¥\1< Ø©m +Ô˜2fÕˆˆÿùndQ™ ä°ÍY^(EC +UPU +dU‚"PÛ*6¦Ù!R.yMªŒ$ú B +¿ø(Ãù$úÕ¿ÿã«wJ?ô;­Ý}úv½§ãô4¶†8Öúµq­Eµ¥wÕV¿Ußÿ­·ñ_imiÒ÷ÿ‹ †�¯úCøzB«ÿÿè™;ìR-Ê×ü±ÉP1þ¿µÿï‚]/uZñÒ¯jºë«ûÈáWô6»Û­w~êÜcÝHáwCÇú°áÿþÃý‡ÿÿÿõÿ�úBÃ__·¯ï}³%Ë«òê,�¿×ñÕµ×݃Y*/å¹#úõtü1ÚD?_,{ÿÛ ÿþý¿¡ÿÿ¯×ûÿû ÷×ÿüê/íÿ¯¯þ¿W·ðèWüî´»ø,�QiúCÿÁ°ßÿá¿Á¿ ÿûkÿþaÿþßÿÿÿ¥ÿëÿ¯kÿ·ÿÿî½oì5ÿÿÍ þØnÿû þ ÿÿöÐ_ÿÿa ÿý/ÿúýºÿðE�ÿÁûÿøoÿÿúÒÿ ‚^õÿ…þáýÿáÿml%ßÿ¾á¢¡ÿøm'ûÿÿÿÆý°‚ÿô ÿÐ_¤ÿàßÿÿ¶º_á´Uý´¿ÿ×gTý¿ûᆵ¿ÿ„‡ë[¿÷t¿I‡ÿ×xý·XKïð—·ß^ïÿÿ­/ðáb¿º»~_®ÿó§þoû^ûKÿI½t›û:§×ÿÿýwýß­/ëݹ©:ûïýÿ°Õ.½´¾á_ÿ®ÏÖ—¶g·þÙšn¿ëlÍ{jõý¬;ë§¿öï_ízþ»omvÛ¥m¿é[Û[¯<¶ÿÿÿH¡kî—¸F«íßI6ÂWWL0“aU=†­>é²óalmí¥¯vÈ?3Ý¥…¶ÏßöÒµ]¾ÒÿívÌûÛ3HƒÓš&ÌÕ¥m¶¿îÚºúí·Þßßé/^iÒ¯køa$ìC„ÃH1Liû $ÓM´¢fÍ�´‚ 4Ùí±V’jƒb©áŠ´ Ë�¦Æ©Vžº[ $ڰ† 6[ +Ý-‚ ³Õž»[ ÿžm«ikugö×VÏßíz—wm™©ögûfŸ„G)YÈõ2b +¶i„{*�2:�yWG9a4ÐdÕŠTÕ§°ÖGÂH^4aŠa:¦à‹Á' ¦�è ƒb˜Ø¦Ó Pbƒaœ•æG•ÃÖi6‚[Ò S#‹!lR{"÷Ó[I91jà +Ãa„´Ø`—¢nµ“˜Â³¹¡`„QÐV2ŒEˆ\£•”|(üŽr® dÓ„�J5°Â Å#Ci Â &ªê˜[± ŠL&ÆÁ>ÁPa&p‚ §AÔ0’l& )< Ø¦Ø¤Ób¤ùnHDDh¯=±@Œ…ò.Œ`ʈ3‚ÄFVH²Ü¤ÉHåj�ƒÑD (ìHöÉàa"»ÖµZDU²½0äßÃúýz —îµÖ«×­á/ô—Zê­ ¬ÛUéo Ãš¦Á �%;1´²™1Ci0È‹šob¥¨/ A: +""?ÿ&ëYÝ2lYÊæq’¼)>“Â�¼WÊ3!*ÎÕûO¾Ëwa ¡B… + +MŒâ ";ëÿûê¿�¤ˆÜ# ­÷ýÝýÿTòº–#Ž->îïûº´õñÿ÷éß¿ÿçhòl5úGn¹�ª6gˆ†!¨Ñ0¬&AÙg²ut$Œò S¨ÈaÉliÙÕšˆì莉Zÿõ×ð¼(L&�“8ÏÁA4k#V{jƒF¶¬ùQäs» %&i„ `Œá‚0á„k ˜Ì +Q0I—¡‡(rÎD¡1Ëò ƒÁ`sc(êgÁ Ær8Œ#ã$# Ðgkcò�$PD25Dh²A JFC5É6¿ýÙØA0Ñ™è‹ ' :"ÃI°‚mBMáQ¿ ´�B� &ÒGÉ´ÓUI´…´lpN�Ó9S»#Q £C3•¦ÃDaTÂ60�Î & ÎF°Â4c»4‹˜FÈF¶ºÎF€h„é�J ¼Iæñy±�y‚L5FÀôlj™ÒM0š=´k#ócG·fÆxÔ Ê/º‘Âý¥¿ÿ½§ÿôëïA¥M-~ƒIo¨Ó¤û^éi:MÓM¤éZ ÒëD¢”&Õ„“aÚ‚°©:Mé_«¤Ü°p™âum&’½&ôƒa (A›Û i:M¨y3¦�µÿÇ»^‚ûCÒÿQ…¾ãuí töíöÐéjGj¢»ÖãîÚê�0ŸI¿ÝqV¿QQÛ®µ¤´’o[’� „ÞëIi ô‰{ ý/ÿü–YKþ‡ý9zûŽü=×õøê›ßu#…kô7kKÿð÷C×é>í;¥ÿêý6Ðïétë~û¶ÿÿ—Ÿýt—AªÿŠÿÿé·ýEWÿägõËŠþ­ýo qî~ÿ^êG ÕëïµÖ¼wéWÿþŸÿWþ¿ÿýkÿØ}¯õ׿úCëãÿõÿðÿƒa¯¿ãÿ)Ì_¦ß÷ÑŒ=½Ýÿÿ�þßuéáÑCÿ×Ûß×_ûüØ¿ÿÿ·ÿþÃKV=ÿõÕ!oÿý~]aÖ—ÿûÿ-´½/ü£þÿάŽü7ÿÿÿÿ_ÿÿ¥ÿû~­·ÿúþßëÿû~ÃïÞ¿Þ–ÿélBô›¦ëAá÷úøoÿïÿþ¿ÿÿn¿ÿ ø"džÃÿ‚3Û¯ÿÿÿKot¿8?ÿÿúèîzZëkÿ¯þü?Oû÷õø÷ÿÿ¶_ÿ†ü X6 ÿþ‚Û _ÿÿåÝ`ßÿÿÛÒÛ:/ôµH¡>û¥ÿiÿï­×ÿzÿÿÿ ¯ÿÃÞ–ï¯þ–Ä-¾·ÿð“¶Xooüÿ“¦×ÿUoIzêÕÕoõüæýk÷··ÿ·ÿè!ëÿwÒÜ?ÿ룺÷ÿá÷»®¯ûf~–®¿÷²ÌÏXÛIµoÿoÛïÿý[¯mÒÿý¾ÿÕµÿÏ'¿Î'0¶ëÿKH[s¯¥ÿú6·ïZ¦©°Á$ 5m$Óùpí°–­ïMŸìý³þ›pÎ?×Û®�|ž½³9»¯ö;ÿ÷×þ´Þ«}î¿úªíýmÿúª¶uO¿ôÓMŠL$†ÃI4ÓN¶Å [I´ÉXjšlTa±ò&9ÃM;JÒm+l¿l0A°ÂPÎm¥¯m¯Ü6Ïë!ŠÚ÷ý«fkµë«¯þÖAýš#ÛjÚ[×ÿ÷­u×GÇ+< 4)á§Œñž=¶šžl0K²ZŒ5Uwl&šdp¶p´Ó´¬$Ú 8­‘11‡H*i¦Å&¬Sjš¶é'"[´î˜aVD;JÒt“UÓÂ;¶ mµuí%ýnä1Ìÿk½¥rlg‡; +ÎÉ«‡ J¶Ði«aŠˆ&)í8jaT;´Ø$ÐlŽA4Ó¶Ã › 5M°“ƒ`ŸJðÚI¦ši±M¶Åa†“h$ÛJÕ4î ¶JÒdTt–¸ˆ‹gjlDEÎÆâ¹Ñ*F¹$ùBG¤1 +W6‘î� Ób`‘í´ÓÈ Å#;ïÚ« Ä&)0à ïM6š¶)ºªÒN•%äÜ&ÈÂ2KÉ̬0„1DeWž’x2ár·ÿ¥Å'œDy�‹Ý%ªëJõí*Òë×^È!¹]&Òºê¸0”m,%i/ÚN�*Ññ–As ˆ¸Ù¾Wa ÄXHØâ#ÿɰÌì"Ü(PSDT£!òHÌ‹ÄVþS´©ƒ)©$Α… +KçjÙ�Èž+“e»™ÚŸÝý Ú¸([ôÔ(S´¨¥ˆ¤FWÖL-ýÝ&ü÷ßí¤Ì‚0¡)¹`yÇÌ?w÷} ßî­õt |Š/é+wú•õ�Wýuÿ…üUò(šuæB™²!£0A™ˆDÅ$ +P< RPF³:�& %Ì¡ûÿÿÿ½Gúi…Tl 5Ñ­£XaÞvÂ3†g Ѭa&˜F€ÂhŒóH»=˜Ï2 R|Ùzæú<Ž~J™¬³o7)ÔÈDSùÚ¦uÿõü®)ôx &Òt�'I´ŸA6“¡aéj‚oOI¸¬#EBv”Š`C�“«�™¦`‹€ðƒÂHÑ 0dŒ e�…˜�ç‘„T3A�Å6�H‰"‚ë9&C2¡(ì§×^.‰E+_}ÒtŸJÒÑ/«¤áUáœ=-ÚI°ˆ¶Û¨9xÃMz¡h&ôgpÌ tljI¼#cG·ìh&±¢à–òG=‚.Ýö2BD'š©²:Јñ>a‘™²"#Èüf&ˆI‘t* .FA„©8dÀÈdD3<êŽda�M{nÂûŸÿW{­/Æ~þ¼'†•Ðo¯ +R{nƒaYhA´Gm'Òl%øh:L0‚î5A0í)°ºNš -ªi„Ê)(Øýà +š5†¡„ka0‰ŽF°Ê ƒ„E Ð"02A°Í3dˆFêTí +‘Â÷j)^¤pµîºï{én•mlSw¯Úµééý+A?é{ÿH“ÒÒÝÂA]-¸PA°¬³§TU°“hk<¡¨$›Ùh ´4i6“z<46“Tgi¦“ S@›Pƒýè‚L;¼kŒvºë﾿¯pÙ.Þ¾ûÐþßí»iz´—ï[Kuÿ¿l{{ãˆoÑ(¨¶¯I_«hœ%µÒ|[IÒl&x› *ÚM¢-´›DX²Û’ïËN †—¢É~ºï|vè°þßîÖ»îúíuô5þ­ kû¸©}^�ûÝSÅßm%÷I½ÒëKÝu~·ÚMÂuà›ÿðá°õõÿý‡úëú=†ïKÿ¯ïé¿QþëZýÚˆÛïí«Ci§vøýw#…KQú¶�÷]¯Oþ °ÿ×ÿ}‡¾½/„ƒæe½ÿúþþ¿¯¯ºòêÿè±7»ð÷–ägöî’ ‡õþ?Z«oí]7èoÿðØl7‘ä-‘ßÿíþÃÛP_PÛ„ýèð¾f/ÿÿÿÿÿ_ÿøFÇÿñ÷Ø©c>ߎ–õÿî¾òÇ"ÓÿðØl>“ú ÿÿýýhý?_¯ÿÿÿÿ“‹ä¸¾ÚÿÿéÿÃÿ×ëé/ë_ÿÿ�ÿì8pö—Ú_ÿá½p–Ú¥úø®Ý�ÿÿÿ£ßÑŸý?ÿú¿ûßÿoÿÿÿÿýýõû¾—é}®ÿ¥Ú_ÿö?ýÿÿú_ ŸõÿÿÒðÿïÿò_ÿÿÿÿúí�70²¶õÛUÿ~½uÿéÒ¿ÿþ½´¼%øKö)ÿ½ÿÃuÿëý¥ÿÿÿÿ×î¶ÍuyÅ{}íÿ·ßœýußÿÿý¿×ÿõï_®ïÿÿýõÿÑáþÝxK¿»ÿýÿ¤¶–¶’Ò³êòë³ùǧííý¥×këïI-Wþßõï^¾Úþû¿þßõïÕý{ëºþ¯ÿÿûßì% 2šZZÐc†ÃMŠäWi«`Ž;lO­$äAÃypþÒ8Ò´�?ûû^Û_×ÿþï¿÷]|Óõo×JÛ÷ûö÷·Kþ›¯¿ñA6˜„Å8`ÂAªi0Âv¦›LRl0•„“a=B{ †ÒÒ´½4ÓÛ6ôÕ-ËÖ’|ˆ8=†z°�ÿ¶f›õöÌû«®í+«3û­&Ûû­½[öïÿW_oüËa8pbˆÊÈ2µˆÏrŒɧ± + �\/i �°ÁÂS¸aAi¦ PM;A âƒh% °�0ÅX4šµl‡˜0GÈAÚi°Ë›iZIåî´› '¤«¶{Um-³ÿÙõ}¶’ý¥uögÿÄq20ÄFŽÖ؆!¢’#+Š@)Xåc•bGË1 +xsÛ… +ØNêž =…¦˜bƒ ‘Ý„“b˜iXH1IØI0¶Çh6ÒMŠ†Ã *¦fçJôút´Û {eïþvJEeŠB)Q"-ëÄA‚Á‚ ò| Ä* A¦Dr 48…aPÅ[ +šb“MˆA†‚M4ì ƒ $aˆA4⤵¡ÊúB"3m`¡ÁˆŒ¬’0a!OmÅDq†!#C4à +Uç†×Uª×òmTMʃ}*Õ*ÿØ�‚J¿ðž¡%ÿ™ AÖïã+›Uª§qA ÐkGÆ�ÔDFV8�þd TÈ•fIâÖøLª°�©T_VR¢oSKà¨Ø£à3³&§à¦J�&dq™È!¤FWp¨&Ý'ûÒF‰Ù\� &F+�ÜÉ^w[ I/W¦·#™dC<ŒÑØ�NV´h„ h—Œªa­7Ö; JFr ä’È&¡™‚(°ÒI¤~iõì}G'—‰›jG„orVöý!A6“ûÌ…ƒ” +jôNŽ¨ÙŸ2¤„lÓ%¶èYW’‹þ�ªw Óa&Ú 4ŽÊðÞv"Ÿ«¥‘E]!F°äü�(460¡4B<Íù†€è,�„  S¢6G@æbYÕ#X΄t"@Í‚<ƒË¬‘«¤ûû¤ïëkþ6–£Â Òa¤Û¸DX"Ý&£;e“¢#¾Lz ‡¨¼üѬ4k (M(×¹?$sXa„ka=†iœÁ‚.×'Aa™æËÎF3dp"M×ù.[i{vt3¼Õ½Wôµë¤é;¼ ´´Ûp¨—÷­ªM„›' Ú#¶N“°ÝÒm ØA0Ò“…¦ ÃIÓ@œ&Òx§Ÿ+kö�F€Ê3é¢Í’303c¢%!&E «/R-d%§"Ž’\“èÃÎI�̪gbËÓ­¤ÿúÝ?¿Õ7Xú¿p�}Ụá-nµuv‚éaU´E°ô›h4¯N—¾A´?ÿA0ÕUSI´ßØj�F°ì#CÂ5ƒD K°�”h„óØf¸ÀΓd„`ι²# ‚"Ï^›Q÷k�ßzWJÕ:i&öëQaú]5ZŠŽýZMýB}-ÒHUºû¥m¥Ô�- ÈægóI¶OFË:l!i6Ë!6ËBôƒl±:ò7k¤êšL0š¦(ƒ#ä±ú×ÿôCß÷êêÐÔWkW¶ýEEHáoýK„KÔZoûïµ÷Zº}/V©´ž«Kiô›“„—¤Þ“é^©pA°¬³ÝpÒm ,ðW„“ý/þZÿë¥[’¢Ûúá†ÿJ8pÝ´£]íß­êéÒÿVÜz[KKqiÝ~õñ÷I½}[zK¦÷Å&Ò´J8¾ô—×ßÿÿÿït¡âµúì0ߥ¢ë ‡ú,o[Þ>°ÕŠöÒ¯Ò¨¯m§ø_ôÛׯ×פ—»øiµÜ]½´•?ÿÿÿÿÿ¤ÿÿa†ÿ­‡´ºø{û{¯õø®Xï_ü×Çöñõoªû~ñ´Ó»¥ÿÿÿÿÿé‡ÿþÛÿí†ÿÞßë¤Ãßî¶ùoÉÄ£ïÿõßÛþ¿ëÒ_‡Ú&9${ؤCŸ¿ï¿ÿÿÿHÿüü6úÿ ?Éĺoý×ýðkoßýý×ý$¿öô>ûRÓïëÿ÷ÿÿè ßwÿ‡ïÃí¯~üñu÷ÿÿo­¿ÿÁÿ‚ÿ‚8ÿô¬Žh?öÿÿÿíï×ÿÿûª½ÿ÷¹_ßnêÿoð—ÐöÇþÛÿý'ÿð�ð‚ÿÐQþÃÿý¿ß¥ûÿ÷H"B}½/}ÿÞðï°ÿÃõ¥°Ýÿ‡×¿ÿ¯ú ×ëAêýúD!ÿƒÿÿoonÓþþÿ÷UR3ÛÛþóŸ}öí�<Âý»ÿ]|�=þí¯Ýÿÿúÿë¯ß¥ÿ¤ÿá¿¿ôqÿm[I†{¿öÏýýÒ•™íš'KÛ_ºöí¶ûÿoÎu×ïÿ×»ÿ·_é}mú_¥¥ýiï¥ýi]ö0Ú Šd õM6)4äQ 5VEæ—tà 0ÂmÒ{}¤qé6­Ÿ˜gû=i]m0ÏíÿëëÝŸt©µöÛÿuÿU¿zõÛõ]µè£úòuûúé7ðÉF(0˜.ØjÓa&ša ØIXa Å!6•¦Çim¥!lSÅ]i.Ø$Ùq;JÒäQëJíow¯¶ÖÒ»¯ûõí.ûzõÞµ__Zz¿úm¾M‚‘Å(âÁ! ƒA’C¶JìBv)‚ Â ŠcM¦)‘ÂM‡V‚ ÂwÒÝ6Ò¦ÒUvõI[I4ôâ˜U¶—‚;‡˜í&ÌvíU´»ºÒlÍv–®ÙŸ™©hˆƒA„"" ­P0ލA‚ +=¶FqHÖÚj˜§m0Å;ƒNd $ �a´“M;dòÁª 6�AÅ? £c%à˜FÇ„hh…óaãXar�šr0Â4ˆDæ"; Ÿ6Gˆ£6X@Á*"# –¤sœwChkt½é×hU}Ò½Öý¯T饼hi]&÷o„ÚµÝpM´¡6“ ^aé7¤ðÎM²~ƒ ]–‡=´›CI½-“E¦A6�¸Yº�Í&�º44Ó ¨OÙÖÂ5†¡l#@a~Xà�[ÇÝÿãý[~›ßøÚïJ­[zßz÷_zw§þ½þÒÆ¤Ûô�¾:Z#zW¤î½-î’ I´›e—N“h3c8Â"CÒa¤é7&&ZA¼#Cê?ÿÿº,séßýßEŽ�oUn½÷k_n·ßßKÒöôÈú÷êû¯íªm5úï¿ZŠŠK¤Ûâ— ¦à›Òö’mÒ´œ%vþ¿×ÿ¯ëÿÿñåÖª×ÿÿ§÷zÿ}Ò½êÛø}qСõïz‘ÂïQkö»Öíêž)7úô×ÿÿþÛ_ÿüð÷Ï þ¾ÃÒý¿ÿÿ_ÿÿÿ–P¡úý¥¢EQýÒŽ¤´ßp½öŸCµô:Òÿ�?ýëÛKÿOÿÿöõÿÿöë×ÿöý{ô÷¿`ÿ–7–ž¿è± õ–øcÿß,r:MøëþÿÂOþÚ^Ú_û_ÿÿƒ}ÿû¯¢‡ÿÿ¥®ÿL?íî¯ÿÿÛ®I~Ãÿ߯è²ÿþ•ÿÄ/b�ãÿøoKÿÿÛAx$õÿíÖÏÿI¿ûG¡‡ÿúþ»z^û %ÿû ]~ßú_ú1nÑ“ÿõÿß·Öþ¿þ!z ÿü6‚Ð_ú@ÿî•ÐÿÉ÷^ÒÃzÿ¶ÿöÿ×ÿí×ÿëéo^ßÿß¿]6¿þC¯ ßÿ xKëÒ ÿ^êÿ÷W÷ðo«ü#ßÿðoüˆeíþÞëëûkÚþ—ÿí�Sé:ÿÿžcÕuÿèп״Ÿõmÿ½/ú·ÒõÃi_ÿáÿÐ_û?6=}¥v¿òå„¶gÈ=/^õÿ·ëÚŸî�/ÿõUÿýGKÿH¡÷öøÜ�?÷ú[ì{êÿºÿõí·ö—ýv+´Û©Á—)jÃÓl$ÃVÒöÕ?ìÂlþ¬3Ý¥¥ºÝüƒÌêkÿü?^¶õÿééÛÛÕ~›&õmÖéëÛéz]ý=­Ó „ +´©Ý¶›Ú ´“M´ªiÆÇm‚ÝH‰êÚM¥®š{ô¬#GoÖïdj[ô¶Ìô6ÒöÒÝ´¯þÿ÷»ôŒöõÈ�Uÿ­³§¿·¯ó!tA¡tV0Ä ÓA„Â$h¬“ÓÎóÄ0§ê±Km‚A8v› „››I¨ÛAÒ  ÓTÓní&!Q&švª›iÄ¥°ÒU­]ZúÌ/ažöÏK­˜]6ë^Ïí×¥¯úù¢êëmvþ"æZaÜDRÄ3¥…(ªEó^ dÓbƒ‘ñÏáý^*š» ¦�Úrx­$°ÒN µki±I±W"¸qû`•¤ž­„�$î¬#¸Ú[ ;¦Òìÿi¶g­é^’rl;졼»#)V"�J>6�©VHçˆ`©ŠL+ÕE0“ÃH0ÂM„ì$Ü1V’hPbƒ $ÛIŠuM;A+­'I6*D6K^º­ +¿B"�rºÌ" !`†VDÀ Áqhè„0AŠ!Æ‚0˜¥bª¡§v ÃLPa¤˜a0šb“N–—ëÖ¹hB!‚aˆŒ$P¢ B”$ˆ0HöÉúô•×®¸ˆå�Ð7ÒK h*úìP°Òm$¶Òá„Ý#†í."ÅXd+4& ˜0IÄS§ü·KRÜ)$ŒªfŒÉb; ]íTËØP§ió ÙnN2ï»þ;%Œ°-íþŸÝÎÐ&¿©Ø·È�Úù‡»ÍÅýë³ ßÿìþ/Õo»üÈ^#DvjˆöžL/×ñKü�¯à�dùsÖ¡ž#LÙuDN› BPG†) Ž£"ƒò ˆÃ:¼�αÓ_ëL®Äi6…¤ÞBiºhØÉxüMF°ËáØFwáà FÃ3dùƒ Y�á 4BdÙPŽIŠHÔ΄KƳQÿ^–ô˜o¢;i;&z+)6¨ŽèöÂN“A´ŸÒa£sI¶íT×*z64k£ãð˜F†¡=F§`‹€apÉ@¦O˜#ÄC gA|Ù�H•F²:Ôµ:³³$½.šßxN–Ö-¥k ‡~´•¤ß¤ÚN“nè29…3‡„iÒy3†pÒl!z:BA6‘æšh,ì–TÂaEÁÍo #Xdo"ÇaØF±¢%‘P†Ù¼ÙÍ‘ �(øˆ‰Óft d2*¹¤k�LÖd<�ý¡JÿmÕ~�'IÖÿö×I¯Iúýw§K’箕¤é6™æ“ª#²-´›H4Mò;i6*ü“ ŸFÀѺ­4M4| èÖï4k ØF°ÈÞi‚0@‹°�‚5††Jó"ƒ�«~×_ñ»¿ÿ~—B£î;^©ã�Zôþ+k«tÚº ¡iu]ð�+Lñ¥¥il³„ÚL7`�fÉ<$ÚN�y3‘Ü › :MªŒí&ÂL�“h�9SöÿÿëþˆpŸÇôXà‡õmRöŸ}áûÖÿqÐÖýní7ë­õ¥»ö—½m®éBn�o|^k{¥aQ, ÒÕ¤›W +ØKýÿü±¯ëøÿé¿òÇ# wøûöª­úû_^Úº6¦%UK×ÓzßÔ~ºÔWé¦ÒÒ¥ÿ„ûÂÿÿÿÿÿZý}ÿŒ8ÿ×Zÿ­þ‡ùRü±ïÄq¯Óhm«Mºߺ¡¿ÿ¾šŽÖ—Ãßÿÿÿý[U_ý_öõý‡­~¿ÿòÖÿ�¢ë,rTúòÇ" :ß�ópÿ–>÷kÐ_hvÿð�ÿÿÿù>ïX#?ÿÿÿÛ þ¿°ÿÿÿ×I/Òý!¯ü[ýœ?ÔXrÊ¿�òÇ"Ì?qékÿÿÿ®Ú Aýÿÿƒmþ±ÿ†ÿÿÿ½ÿÿÿýÕÿÛaÿPÒÿúHaþµßÿïþÿÒäg„¿¿ÿÿÄ ü?ÿÿù>í¥ÿÿÿÿþÃoü0ÿ}uØõþ¿ÿÿý-§ÿöÿÿí¿é†û¿ïÿKmß÷ýÿƒa¿öÿðVë þ¿Û_÷ýÛÿ]=/Þžÿÿ·Òÿ{ÿÿ x@¿ÿ¿ý{þÜû¿\"ÞÚVü�ï×zm}¾ÿÿõo_µ¶ÿÿξ_ÿ÷íëßÿ\ …¿ß÷ÿÝü;áÿô b°ÿ¤ùpÓm,"‡wßêÃ?ÿêÈ?³ùêÿznÿÿo¯ýWòÛn×ïÿ­ïû¿zµ~¶ÝÿwõæpNÿ¯„öÚLŽ*¬l�6Å*¦²+†Ãa„®E5VÒaœÛ=6CïïlÿtÚ_ßý¤Ùš·¯mOßúÛß·¿v¶•ëç_1ÿÙ×ïßK!·ý.ÓA0Å5Ü0ÈßH4ÚiÛ íŠà�ƒm&0Å28a4ÓUcµ´™é°l=5醳“i{w÷²æ=~ÙûÛ3M™«÷§¦î¶É×õû~ßþ«gOýV[¬¢�)AG)†Šâ°&ô†´4§‹#¬&Uwi¦Á1Q +§  šaà 1AŠm šlzi¦°ØmÅw¦ØIvVl0ƒ²ói0ÏaoKl%uuýŸî¬ýëÞÈ'ÿÿ“u)ÅË} GE=ÄecF†�͈A‚ &F�²8 ÓOº{ a0šlBA„ئ!2#¦!6“�ÚI±ZV“"Ý6%¤ØI4þE8l3’uë`Ÿ|²­fU¡sÉæ‘­£ã•paOXÃ0ƒPšbaÖ “a1LmZaŠc BNÓN¶Ä&ÂI§r8uüUÄDhì"2Æ +„A„ Á ¬`Á0¥[E\ŸG†ÓS͆» ´ý$´±¢Ü£Rb"#ÐI%Ö“�´ª®µ«!Y½KÖ &Òî¢Å'iKb�n–(Ñ Dÿÿÿÿÿÿÿÿÿÿÿÿþd>@Ð3¦Í?2F°%T²��,¥¥PAyl �0¥€°3ãÿü·FwÚ´e +d&jd›"äP3b²"ñ,3Vì;‹`Ádpê+]‘6,‰XÌÌÖÁ@‘F_A§ÏÄlÈdgZÐoÏ7žÉe¯k V�n ŠH‚™`’‘�F³œÐÉ?2qöëô¿ê½…¥m´•Ÿ +“i6©ZÒq'¡QëÖ…ý-®�-&ô›(~È6¸õõ¥÷Iz]-¥ÒOüù‚ º>Ó' © ¥›flÛ4eH‹Éf‡õ¤ߤaPÿ_xÿÕcOFŠÒ40MSTÔ#Â.�Aã3<σ8Í™@UÔôGÒKµ>H$ó\_Ò×K_¥„qëAu%Ö–�zG«é8Iü M®ª¡Q¯N�A « �m%PG*ZUýëKAzU믥„qÁàŽð“¥®¶ǨTÂ(z;ÂUô–´¯¤ÚUGµ_ÿKø×�Ij’ZB…=Ah%QIkK§rP•½T› ^Õ+KÒIzÿÖºKÖº­i$”%†©*ÒJõ„u¥].ðƒ§ý-Hä•%«úÒÿWZZ¯ÒZõUU_륤ªºKRû¤´’ÎizÕ«u×ê®–•t”ú_ªë]RëUô¾�]}.´—­‡Mê—UW WZ\AR]U*¥¥]k­kª¯}éjG;Ǥµaí­%긄º¥òduÕý%ZJ•*‡T¯MüiªK­ +CZ_J‹¤meõ/î_ëꪫ­/úþ¿Öµ½F +ºëUÐ_IWŠ ¹~)Húö{T—/åÿw‘ü¾“¥Ay~©HþÇ‘Ò×_¿^ºZÒJ—T®BŠ…¹ÎÒ¢ýR Rlçž—Ò„´•b¬%é}VºÐ#�.²þ]RUIt!hBk…lSéuqUWºWuˆIB®“=¤»Â9¥Z K¤—I-.�„ª +=Bp›MSµMBúl žºêª›J¯Wt­VGƤ’ÑBèˆFvdd„TLE¦˜M ž’±´ªíªªM ’ªñ ÆŠãp†DD0„XEF F³µVóC+�ôWQ „DBB:}Ó[¢¸2!µ»u œDDm¤Ä!†!Rº1�ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþMAl²°dMÈÁ©­T�l7fÈ Ùä©z¤Á�×&á`47ÿü€¸Xn endstream +endobj +290 0 obj +<< /Filter /FlateDecode /Length 7427 >> +stream +H‰ŒWKoÜȾϯ ö’`Òý~DA‰7»ë“ƒ r±³ ŠCièpÈY’cY{ðoO5Ù/6e)0 Avu=¾úê«ßw²RkMd†à-…'A3¬I&¥þuuÞ½ý匲wýßwáËõ9¢±ÿ-ãÖæAÛóØ�'¢P +!Äôl ¸�9Ü /�À`€‹BxÀÄ ÎÛÚWd¶€µ¿ +“pJJ¬ +l R &H�ŒXÍ&à‘0xä�´@æ2ºT z$”ù8$£Ò;µX�Þyì/Z—€!êÃ’’éR±P¯ ðÆ0Ö\*úUÐaÒB¾b&âÀ…r�~­}:¹ +ЕHpÿš@÷b'hßà8E²G"Q*Åp,ðŸ'ñc�@Ÿe;0w™-!§IßÖ”…"’àEôwxØá¬Év;ìÞðoÐ Ùá~‡²CáOv3ŒÌÿd4; ðP>;  ¿¤2^P`QP@Óá¼Ûÿr.êìæðÙÜI3Á[l|8îö†¾ªÇ±éÞÌ_åð&Ä|Æ Ä•ýìßͱî�ûžœûþPç¦+Ûñ�ûˆ +a>b€F{×Ç}Ù³ÅàÒ¦›ê!»ùÏá}|#ôÃÞbuêÇsh`�H–ÓBêÅdÕŸ/Pƒåœ`±¿ï‡s9ÓÖÈ�‹¥“@+ÎÃþîKÓ_Gc ©ýýПKÁ�(q–¦S½1¥ˆKí8õÃ6ù9–…†”ä`F–/ee?³yÕÚÚ†ú÷k3Ô纛·9Þ¾œÓ¹2Ž (þÖ9ë:´¯po«+˜î¦Ä}à7IžsyI8·/Ïõ±)ÀaS5‡Ãäü®mÎÍ4Ö´†ö‰b=´ÍK9›ËYûÎÃQR Gî?ëï� m:Û@ԛ覦»öÍ·1Ÿú®Na $äAÖ ]ùP�qŒˆ¸—UÙ%žü1…ãxî¢aH„;\V&”¶!ÞªMÊ$€G<»Øڶ鯿ÔÃm³�SÿX>Ùäš €ZfÈíâÿ¹º··‰÷0f„sïÜ�S¸×ÔPÁh�ŠØo)$ŽÓB;¿Ë DW•T*í'€(g¾çÈPαÜwýd~Q´¯Ú~nXÛYÖ8 R႟Ʃ>�·±�²`$N}ÓÕ_š©¼kŸÞl"eˆ8ê²:e7TX›Ë­ t¤KhW×Ç1ièAéÀ6õq…�”®7»²k.×ö¶�°B¹w&}õ¸i}U ½Jót*Ó„vÐr�="–ä9N³ ‡±¯Ø¦#¼‚=Ʀ4>x+X–Û³�)ÐI³ËA¥ü/! ÎC�+Gÿè‡Íí{ÚŸN†rs&÷C]ަ³mám�7‡í*.8Œ5½ªx À¹Lõ1 Æ(P±e=&Å+%—1©æ1‰)*(K! o@/΃òý‡JÙ4°˜C^¸æÉÉq".‡ã…ˆ¸$>¶§¦j¿Í_`p�óK]5÷Íš‚¤ Ÿ„º¿ýÖ>ôù†— H¼ÖÐL§sãƒäݦ߹ç*�ÆSS¶¹ˆ'½ÑÇuW=mÖ.bM :°óšt©—ô:úжÕ&�žÇë9-A<C <™Rì÷ hžÑ@W²9A aªøÂ@Ø%(# +ÛÞã +ÀÂ-ëä8ǶK“З’K“7’@�}sŒ +Ó9lÕ_ËjjŸ’¼ƒœð0ô�®›†kå×ãôš-ãB=‹g˜t8…sTƒ‹B)²jöŸûG#|�­5ÞOó²°V‰3¥›·ßV=²�A�®p Ó&�C�Ž#Þ/l/ ðã¾m¦Éàó}ÝÕÃÃS°d¯*ñ²ˆ`£Ï!Àê1P(d»x`âõ¿‡€—ÝÇy:.0 ºÛW 7lNÍÃ)ÿƒ˜Q#­*dô>‹Û)ÓA Jgª®Z·d­�V·gâû[÷¹®¦´8À굪)I E?]ŒHDNžtÓÐÜ]͈çe1%,•Ê̘C4¸»’¯dÒP|šÉ4 F¼žv)X«ð2UªËB-¯/€ÿh _Ž~(3ÆÖKm&TÍÝZë% ¨ï„‹j‰kšÞË °§ðp]È´3w½¤Y‚ñ¥Ó,…Â# 稀G­\2zwjêTSÁþJB‰ËЉ~ béú$pN,†Y ò!êEØÚ¼¨…½éx�¥6Rk �3ˆXÁ^"™Pfí•3é¶OÙnU˜Fx¬ÎæÑ›øÂð~Î_¬Ø+šLpýzq…û¦éªözŒ—�M÷yBŒÔaÏŒ¶À‡vøiÉ@ÿG(U“üMbŸ‚¤‘/ØKD(e´DHσeU]‡rJ-À”Ã~ÊÍäÄcP*³ºX‹�Ã8fÎ;³¢Ô–bóØ<Ö.=‡òÎ*§·üΠeîF¢ù�™ŒÍ ¢0S$[ÂüIdO~¯äÄ'¨Ïµ…ñÔ?Ž› i¯ÜFˆ`#(9ñº¼<_"姸±~;zÿáÇŸâf"aõ1 —Žl¤ôŠÈ JcE‡–ŽSœJž¢HdÚNP`É€5ˆi_6˜jýZüš‚$I�’…bs~‘2§ñÒ€�·?ð!#ܑإ¿\ÛÛiØ@Ö�¼K9<£�^PŠ4•ýfÅ38¿–Ho²y̸3=‚üŸZ�é`1­‡€æâ-`>¡tÿÃ]9ÖmÓÕ?xÔ‡YAÝÝçz:ý�ñjí�·¢ÅߪU’R ÀÂYtd›Å&]p°…¢áØ4£YIcÇûë{H‰W9qû)�G¢xï=÷9ŸÍ±Ï™“>.ˆ‘+ûÃô m» nè+Ú¡Ž›gˆ!Ý@‡h ‚ðòˆi˜Òà#&—bc?MC _2úoPß·A¶0º±Y&*@+Cnà:ΗDúîKòï¿ü�,ËTefZ¯ÖÝC?´Óãq“f usÅÌ…ëÀWOO}4ëámZ(P4lùJútÚª9âáX�`ïè&m|F)Í�Ë/"'®:¬“¢ws£ùCÿ�Gbl³ƒØ`¶„´ƒï>ý!Ñôt㪑3ÏcX Þý%öo¤ü·ßµÔØÛ6¬Ã· çöÜtþâ]S½zÀ 'Xó‹…&¬�åB»,3Ú8AM#¿ejÎ7Z>¾ŒSÃN±×´)¯Ö¥�_ûýŒ¨Vk¹>¸$uÐ�ÝutÔ弜¯®ñÆ{Yïl¼p "_„-šº`>‘mã +fwÅuì7n¿r,uÛÓCœ­�³`ÂHz>KúÜS{ó*užbµ „£w<nŠeOW?‘opc#2\³ªdðÒl#6§³6Š!llž¼O>¿œÛÆ8à"¹ó…ÙÅ-éµfˆ_jl�žôàM¾œ!’¡}–â˜Ê·¸,1< ÛÖì|‡Ä +h¸@ú*òn“CZM™w¡“ ˜©”›bî?ÃóèNV2ùUŸö\ûÐ÷Fôò~µ4NU™]ûlYû_�±ŸL~¶êìÆòÐ|6ˆïüruºù<\(g�šRư�¦æüí âˆæQøöÉý8v(9\dï÷ÉOÐm–}ÇDò¢î³[•yÙëu­™È–Ý?õá*ya_OuÄW&=º¬:®µ”× +Ž”1o9¬†5£š¹Ú=ë}½ þ[¦ /¯ô ùñ[£»2žÍSrõkg +øuV×’ö´oÇ ŒpiÇG_SH5Ö.æËv ý1΃<ŒZÞÅÁ‡Â± ôû¡=¹ô + +•öpôÚÙþ£7øÛ‰"ìzZF÷g¬ÿÔŽ‡º™úÁƒ¤ÄÃ$¶Ë2ûª Òª,ü6�‰ö‡o’Ä„c׊LèD(¨¤ábì>“ÜX¡9ß°�ÿOl^Û¢ *Tˆ‚ýstjZVÅ÷0ÿŒç+cÛñÌ€xøpjÿ¼:ûù[pšÈªó÷Ü…¼á*µêFÂ\.pÖ—Ñ# ÏK'õ)z?U%9íæ±>îRIlŠ=g�h˜@Z(ÂÃu=&üé§¾{j»ö!2…p—\4{°ÅÎjôÆ@]1Õ,d_PˆðN,Ñß&}ZÅÊk6¤q*‹‘í/�³ Ki9ÑŸñ±fA\Þpªç  . [ ýþÒ踌VmŒÑâzðV†MôÝ9LçbÓàlSæºGWºrø<Ôã¤×Å£2÷Äýj·ÝòíTil¡gw,O9ü±WK Û¨Ÿ<‡¾\ôÆ}ûkÔ|�4žuÓÖÝî|Îý–`2]Ð%§›7y…ï‚•õPƒ�Æ4Œ1%zëÁç³Ç•Ëz£ÃÒá�ìÆ†iÉBo{³‚ ¹²q×7ã÷ϸ‡&N6ˆ‚þ¸´ƒŽp ®d®i�ÆÈî",•Ƥùý_³hŽ^S�Þ. +åkãî +|~T­‚ |»œK»á"ä„Ãs3@Žnºš~8í‚kزÊMYç®™t·2òÒÿCkî#‹áÁª?LÞÆ,¤Fãs׆½€ák¸õIÕ—§Ã’$+B×�òÌ�¨†½ôr“b®öÎÕϽabò˜.9Ö{v“'ó}¥+yIIPÛÙÔ§fiÌÆòäqÉ6T°Ìj'þ +ñ¥ÄsXK3Õ%É«–à16Ml’à:›¡ýª ÇðŒcsÚR;&±;ÜÃÄ=öf!XdM:NÃ¥™÷q—«dÔS¨cUZ–Œ€w<·Ý¤‡�0"îø%yÿ¯Ow_Þ¼"wç¡oàšWx<_¡3Þ ½v߆í–�rÍŒže‹Ç¶ë6fˆÖø¹Å颡gÒ�ÞŸ MÒë Û¿#‚µâN~F—ÓÂð€k–mà ,Ýyüòæ6’yQVÄ}ZïçÉ1fõRbZùÔî£Ñi)DÈY˪)º“Ñ�CÉ-l·,ÂÊ#¾Q`Å�<Ô¡4bçW… uó|Wz76uö +â V.œôƒ·µ)˪r¦Ì fb»R%w»»‹gÒE*ñ® 0•H~n›¡_Ž£éÚ);5)6x8^F³X 2_c¨‹ÜíÒhÈȹe�ÌO>þ»œÑ.ziä¼bs—¨*ƒE«Á¦·”u#ÐÜÙ^H(ã¶¹7Äú¿§¿‡¬H2\žWUpÆ�OzEdÔ*µQ¾6d¤ŽŠˆE/þ[‘7s + • ×=HvÈ÷™ý#ôÃ}2ò�\µ{•(è*¡/‰dÌd­¢ˆj~(mK«Lèáó ¤‘_QÙ&þðéý]p¡h? ÄEe™Eà:l&ŠÍâ.-"Þ‘4!eÉÈ0xfJæDç6ÈùÈömìûÔ={\N]ÈŠ5Xt3ÅÙ?ÿõ3û»Á 3Êì÷°,³pç©­±ÀRYò`v„-òCû´‰­ÿo¾‹Xêãdc듬0üŒ¶gy�å2¹ƒ× ‹äWÌ=3ïžß¡+‡¨J°Œ”¹êæBÔrYÉ4õyº fbåÜÿ\$§ª»�iplî9éºåê‚/î˜å¯è·SÃã4�ÁJ@rgœµ¶œ[mÛØ¾8- Ò~}zj‡þtÄ'Bo«@ 2˜È·ܕ¥\�eA3›œ˜Γ¹±š¦_P:Ê”ÔÈÐ\;’ßBÂH»X¼íBSúph›U„×öswÈsýµÂÝáÞò6/L†:^NÖn¤ádáÿ +åž¿CÚjŒùS29˜°Äx¢¿ÕÇ]˜ÑÒJøfBÐwò<ßÖã¨�_»—ÐPcY3ñ +tˆ)ê Þ ¸&ž)<×GƵ¼U�2›¤ÙŸ 0Ñ$Y%OK ÞêiA Ž[oýÙÖa^QNï“ú›Ýwlž +Zæ{«MË|ûµvl1ÔÁFmJF€¦¾•Jù@Q,ûçÐÅòTrzÍWmZC®9K«�G«Xî—ÿê$Ï�ý*©Ï�c85 ¯ðÊÔ˜pDñÝ 6�v§*©€%7&Ò´Îòúâ¸DEÑiÒçè–Æ[”�M�™®L¼aÖéU†¼ì$SÎsþ0ú%ù»°•κI ÔqÚ'øz¾†Ý¦[e�ü÷jVš+äZèg„Ö¼„%ÙXókj¾º–º™.ŽÿËxµì¸mCÑ}¾¢»º@¤èEJB·M€tÑèì  mÙÃT–¦zx:YôÛ{(Š—©L»cóuï¹ç¡O¯Xù_X·†ÆÅú>)j�í»YF�'8PwªÆ®ßc´‰ìäøïdÈyÀ>öÓá÷ù8©p”3x  Á0 †–¯à™ âTŽšÌ,¡ÓÛ³5üÐÕÞO5 1H¬/燡Ÿ»=†©B騿…‹TEU+|onZ»£’i¬D_Â…ëù‰˜61íÌcšîSßÝ›—= [Ðð=ËéÑ…KFÎ{j¥�4Eœo…IœÏ*ߤõá,q}k°œÁîÑ0íMqFV[ÄŽrkuÐÿëñ.ûyl_Þ(æ–Je§B“ÐÑ"KŒ¨{š›i¯cr±ÒO!ާºïÛ=#îѬ߰±h¥.gðiwž›q8nx6­‰OD;‹cÛü¸|�¨›œƒ)àóZóEM4Êk'ámD7y¢é³cŽmoBðqá G›©œÖ?›¬rfVÐ&g8`Ù]ƒ[PnødÊei¥ Q”eéao°"–#² Q4ãé¹’�y²qˆŽeœäæ‚sW™€®uêöêƒÆÉp\š…‘ùr—SûZò8ˆ§§V¹QÍ>f †”E¬h�ê-ËôXg™áñA¨Jã»ÄñOnE«zSÑï}j`+óžqêqõëE› 1‰£låôûØ+à w£ I¬9z= |é€öj@‘h�w¡ °`_'@p´ˆp +�~ñpQš$ªz�¸<è Oªìô€¹1<3˜.šú®q_¤¬éÆÊ +;EsƒÁ{qzôÑæRý'c&-ÜGç™}tÐö4µãA§ÀÝÁQPG=¨Š’7­ÿ¦,ÎÉtƒ#¯Óïp˜íÍhÀÊ„Â�§{y‘¿œ%˜i¶“d“QÀ´�Æ2² 7ñ§Ã}ëz7 ÎO…Ø,ÕP»érg.uY‚^Ãcffñ‡Þ'?Wj6JFÜféÃd*�wÀjâ¾²Úen[Ÿ A¦qÍåÒœ”Uî ¸¾J³¸¶Z¿G£© ²m·ý-ò"Ä}À(iN^ô6�‹!Kjk¢˜rfô]¹ôÒ̼«™d”„T'c~ÃØV brÓ²5uúch ¬_½‰îËeÅb@¾™ú“ƒÉÃÙ…��ª¼�Öd¹†Ÿ¿ÀÍ<÷zŽ£a¤=A½(Î?ÿ´ÖgÒ4䉡ˆ¡�£8Ï'Ÿ[‹ØüâÖk3¶–ÂNñ¿´$ÁJ¶\#‰«R�{¢>r¸—<åqY£%e–ƒßRÄž‡Û›Cžøô•Ä™^Xëuy¦fÀ_wÄÍQ;B|]“M²>‚*œ·��béöíêÁJJyÏ�r�_—YN}mD’¦ý~zÓöRàêÄ|Kr°‘ï"Ýpß â1‡°ÿeÃçNñ›±Ì›‡pŒá™øÐÿ|`i_¢¢J¼>mX~ô�µäÀ²p=™)ˆö즵hlÆ�y´5Q–¬XÚŠg,“€ žÀtÛ_åä_ÀÕ Â€—õÕ?ÿX[ƒç~nÏ€ªÜàD‰ã| =‘uóH„îé˜Pz>u,ו÷ t÷õ 2x` hû㫼ŠãKå‹ßøâWMÂêï²sYöãëyá,‰"6> +endobj +292 0 obj +<< /BaseFont /Times-Italic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +293 0 obj +<< /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +294 0 obj +<< /BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +295 0 obj +<< /BaseFont /Times-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +296 0 obj +<< /BaseFont /Times-BoldItalic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +297 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 4 /Subtype /Image /Width 8 /Length 172 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ ÿÄ-!1AÿÚ?Mç»Ü–‰ ÄÿÙendstream +endobj +298 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 4 /Subtype /Image /Width 4 /Length 170 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ ÿÄ+1‘ÿÚ?S™&I8ó?ÿÙendstream +endobj +299 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 16 /Subtype /Image /Width 24 /Length 255 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ÿÄ;!1q’AQ2DTÿÚ?Òní]Q6Ë)„¤î¦kˆÿ·ýjùLbíÏÆ«”ÅŽ¢‚ìÙÙ(Ä6Œšø¬¢Ž$ç\OT´ Ù{�5Ûmpë[0TruW/Mƒn.~XÿÙendstream +endobj +300 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 832 /Subtype /Image /Width 15 /Length 751 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ@"ÿÄ]q2B1ArÁÿÚ ?ú¨vöÄ%½± R–%½±‰olAJXvöĽ±)‚[ÛX–öÄ¥‰olAb[ÛR–%½±‰olAJX–öÄ%½±)b[ÛX–öÄ¥‰klAbZÛR–%­±‰klAJX–¶Ä%­±)bZÛXv¶Ä¦ klAbZÛR–­±‹klAJP–¶Ä-­±)BÚÛP¶öÄ¥‰olABÛÛR”-¿œAb[ùÄ¥‰oç‰oç)bÛùñ([>%)CZä‘­rU¤‹kçÄ¡­rR’5®I×2R’=®d�ìó+J@öy’³Ì”¤g™ {<ÉJB9•б̔«¡c™] <ÉJº9•г̔«¡c‰] IJº9•б̔«¡cçÂWBÇR®…Žet}üÉJª^þeT½üÉES÷sú©{¹ý`¢©ûyýaDý¼þ°Q¶=¼þ°£ÎX™ösúÃl{9œl{9ýa¦}œÎ¶=ŸS†ØóúœlùýNgËêp 3åõ8iŸ/©À4Ï—û†žy õæ^¼È=sœsœsœsœsœxõŸ,ÿ?’ 1ìο¬6—»:ÉEQ÷s*g_Lyxyù}áÿÙendstream +endobj +301 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 8 /Subtype /Image /Width 424 /Length 743 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ¨"ÿÄmT’S“Ó‘Òâ¢CDу£A�3!ÿÚ ?ô•‘y4ñŠkÉ,¿Ä"ŸÝ|}»ú™2zÀ"ÝýL™=c¶U&WXHév÷,©µKvó,©µ…ÛÌTòã¨K§˜ÉåÇPBéæ2yqÔO1“Ë�8…ËÌy2ãÎK—¸òeõ€! ‡¸òeu‹‡•eõ€!áíD¹}EŠ*%ËêB ò¼‘ü}f¢‹¼i2ãÎ"Eqõ¤Ë�8ºwÿ´‘üqçB5Ýb§—AvëÇÆõ<¸ó€! §Qõd±ÖK—XÒØêB±ábQpëÉ!Û¹�¯ä�;w5±(íÜÔFÄ£¶sS5‰~€DíÕObNS‹ªÕ,%È„gnw^µ„t†Üê¹k(é! ¹ÍröQÒkšå죤˜kšçÒkŠçÒL!¶¸®qÁ!¶/\ã‚:@bõÎ8#¤Xüs�ù{(é!mq|âÊ:EÛœCß/eÁvõëWà–��Ç­X¿´€6åkýZe‡Ç«v¼rôÀ»z•Kù9 mŠÖ8ýz` ¶©XãŠzcmR­ÇôÀ,SmR­Ç9ÿÙendstream +endobj +302 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 16 /Subtype /Image /Width 600 /Length 1080 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀX"ÿÄs +Q‘ÑR’S“ÒT”1ÓDqB¢�¡ÁC2c!ÿÚ ?õ>6g*Du´TޤzŒZ*AÕbÑR:�8ë'mšHtí³IäÀÌÀ9ë§mšHF¡+lÒC¾˜%0 ”�(Vä_+ŒÔ&瀕Æj¦xŠqlÎAxk¦W¨çLî3PÇQ›EHޣБL=×;…P Á×;…Pi¬™}ìÒBYQ†ÿÅ¢?¡Ê)Ð:à§pª¡vÁNéW›D^¦9ë&G'4�«Bí‚�Ò¨lî•@UÆÛ,ú™ê9ë&_s4�¯Bí‚�Ò£w/êbé]j¶Í$ Þ‘/U¼@Ò!†ÅÒ•6.�´ ûX¼@Ö»c'x«i‘Ãf‚�+ Ð@Ug¸:—ªÉßf±'>á+ìÖ-Ó¥ašOA; Ð@R‘Í´¾c¾kˆŽí…óóX¬;ÒbÉP“J€)öÙÞ!šÍ`�í�âŒÖ$Ù˜„ð31Yñý¯¼C1šÁÛ;Ä3¬hp31„¦ +?þƒkïÌf±%¿m‡óÌf°ÿL˜ +D·Ý´þZŒÖ&7¶ŸËC5ŠÃÜ%08J`)ÞÜ~�HÑFOùÛû”o³Xw„¦„%p?�•âaǸNñd€´„soîS¼@�íýÂwƒò$�ŽmýÂ6áŽÀ~@H U“Ê'÷³IP�¢H*½Bv�¨NØÅ’@)Ó–)PÕ@Œ¹bþ-T)Ë–/âÕ@�9bþ-T fÒZ )s¶ÕÆùCâToL«�T9Ö'3ymò‹ä€•F±9›Ëo”s¯Je2”å €³£®ŸîñÖöÀ{ë¤Ëøë{cH3#®Ö^> /Filter /CCITTFaxDecode /Height 2928 /ImageMask true /Subtype /Image /Width 1904 /Length 79100 >> +stream +&þÊõÇbŒ®2;Îe‘�æv$`¦A()ZfIÆv9LÂ�• +wÙ¶|·+˜dsOÈyÂLì Ï2ÿ•3†"Ãâ«àˆâ¾ï Ák%w~ÖÛOU׿Om=-ý¯¸øén?M�]{ �¬§Š{È"#Tu޽Ö8þê8øòŒ¸Î "!Á‚Í3 a"Ì!2@,f‚y¨,3ɰXsº€”#Çÿÿÿÿÿÿÿÿÿÿÿü®¶‰²JW.Â#_Ë‘Ã;‹q(®§•ÃGuª£<Éå%2d�Q 03èâ8�àˆ¥Î‡,™‚õ)9/&Dé²: ��“"'5 G©Á& Ô3¡�3¡Œ§Š‘ç#TK£VGÍiMkÊEå";Å�ÚOèa&ÓM4,žLö@ž~£cÝѰÇ-Úi„Ñ¡Ù'„|„~qq´~ØÍ'áLä™î<˜MtÂ6ñèØÊ$Â4�a˜Â.ÃÐhÖÐ# ìöf`��„k`�“èñO0F€ð�‚]“ �„›DJHñdt Ó!ˆN�´Dé��Ä%Ä9›Íæ#‚gÄo1ÑÂ(ƒ(F‚°ž¤‡š ד…¤á&Ðgá„KšWM¥¤ÚNË:a®ˆì‹m'“¤ÚMËàÚa*L7t›“;t›LóG¶ÉœŽÚM¤òhL5ÐZLR ¹+ ›&Õÿt›VÕ6´ƒG¤é„Òd|nzÚÍ3L#sM5í¡¬S��D|(ô˜MȺŸ„hjÙG†iFÍ/´©Ý´JÚŠŠZ^“jð ´¶•][þ©7ý][Ø{PM¥j.“«««I\iZN–î“ ­'AžnÒ\0t¬ ÎM%l´ÃIµe 3Í&Â- û 6“mL<4J¨÷PêògM fÍ' 6†OHRm§é¶…~Õ=ÿÆ�ëß®¯ý÷Çqï¦ÿû®ö—ÿßµôÅmzßIöÒéÖ’ºWJÕëù;Oëu~“ª‹u +…¤´›K]…]WéÝÞ;¸×Òl4ÿÿ{îÝ:ßÞÒM´ÿN‡é6ã KR8^ÔŽ†¿Ô¸JéúQ…û^ÿ¥k¿Mª¸ôúª·[íÖúéþÓ¤õí+ý·þôCÐ8h±Èè¿ÿÇÞÞÞ½ÿÿ!Ìýü�`—�GûÕ­öÖ¾·zÔŽÞ7ýý T¯Õ÷§¾¿^·õ_ûòÓ†ÃÅ}_ÿøÿ«ëÿú,\=_ý!ô]köˆÿÒøÿü�ŠÚ'fGêXå9gÿ-ÊXàºÿ§ÿ¼}뮿ÿû ‡ÿÿéû¿m/ý‡ûÿÿý[ýõ_ƒ¥ý×µHzèèGþ†…µWÛ_ýƒÿÿ_ÿÿí·ÿÿàŽ:ðßÿ_ûÿ_á¿õëÿü7¯·_¯ÿÿÿÿªõÿ_Ú·¯¯ÿÿÿðlÿÿÕü¿ÝðoÿÿðßøvÒÿÉvG¼7‚0ÿÿÁ¶—ÿÿÿûkûkûÓx/úÿ¿_ÿl7ÿÿáý¿ûÿðÿÿÿƒçOt¿ð�~ ýµü ¿tÿÿÿÿÿÿ¶�7£?üÎïuÿ]‡{¿×ýoÃÿØï^ÿ¯ÿÛÿ¥ØE!ÿi~Ð_õú öHï¿ÿ¿û½/ô¿l$Ð_ýí×ýwßoÿKýë¦û]_ßûÿ}µ×@‡ût¿w_á߯èÚ¿ÿýÝŠuدÖá/ï }þÿúìé¹…·×ÿùäöºûÕç—÷_þÙ_Öª›z½ÿþ¾ïé~“{ÓÿßýÝ_×è!}}}ûo_ë¶gõtÛ®éÚÞ´õtþ¾¿ºÿû}[¯û}[zÞsí«ÿõû[ÿÿw­ÿRM}ÿlúm/[¥m&ÒÒ³ÛöÖÿÿm&×J¶é¿¯m/ïìõ~Ý_lƒó?é6gÙ¢»¦Ìý{vþ×äÙ§oM÷öN¿Ûl�zÿ÷}Úûúí¬2(é´“A§ ¡±V•¨b˜Âm ”'ià ²*‡«h+KM´„ÚA4ÛA&«"ãMŠÒd_i,6탓I† 0J »qݤà "û 伊8~Ãa„³i6qúÛ ím³Ó`–Ü/_dZ ÿ´÷ï†Å#¯ð� +m6,Ba2V“a„�xTë„°h Ø"‡R¡Âkl�¤ÂÙ#L6�ÒiÛ 4à +*aƒwl1 +¾]$Ä&*²8¶“˜Z :b�a8'L&Û˜¦Òbpi¦Å àÓV)Ši°’µv›v¬‹a†˜c‡vÈŽçj!`„DCŒ�†!aˆbÄA„da3‰¡ B•ŒFQå1ˆÈ!Ó `¡‘í£ÃÁ…+3Ûv‘¡Á΃ &ƒƒ 6¼0¶» `…†C«ª�Ä(U„Ódp· µ\³oÉ´ge˜6" 6Ó'`ÑKGj}^’qI±¾´µúU×ýSu×l „I´©†¤Ã&ÒØ7†D7 TF�œÜarTÿ–@ù7)aI½yn ’X·[åt5 ¦˜P¥¾‘Ôíb2kG[R7káÕ4aa„˜i¨FÀèñ°ffiI£c3“L#d(Oý Zi„nøL#`aÛ'2si¦š6¡5øð‹¶˜LçaȾ™Æ0˜MÝ4‚40�`Ê3à4{h„ó@fš #t#ØdùƒFÊ43‚ ˆJ4‚ ‹ ‡˜VXfyG‚ +¹��Ý‚¶OÃÑÌâÓO®ßkµ¯ÿ¤ÿ‹ŠÞ†—]U§tµÿ[Å/ýÒuðÒý¶–· ñöá:ZWú]:V•®¢¿­;I:M¯ék¥í§­Eº‘¯îèoêG +×õï_êG �¿÷­¸ÂëUC­ë®¾úßø^)ho\nöéo¨íþ¿y*‘àT»}Òz}ÅzHU5ðû‚‚ÿêXägÿ#?áŽúý>É ûº,r3߇Óãþ?ÈyüumǼ}×¥ÖÇ_·V÷¥ÿ¯uøë·ýßÚ¦×õ޼=Ö½!®ÿH¡ýƒþ¿ÒÿÇö·÷¥üÕÿýaÿÖ¿Ë.-?‡ÿ­7úûj)ðûn¿õëýä§ì?Uÿÿÿ×öÿÿ¯ÿûýýëö__ÿö_ëÿÿZ°úÒÿ÷_ÒÇàß‚0ÿÿÿÿÿ …ÿÿÿÿÃîõÿþQ{àŽ<7ÿëþÿì?ÿÿÿÿaýÿÿÿÿÃ~�ÿ¯ÿßá°F�ÿÿÿþ ÿ�VÚ_ÿè/ð‚pÞtßüÒ÷ßø7ÿÿÿÿ‘Gƒ~éÿÿÿ w÷ýÿþ/ïÿ¿ÿ÷ÿ m„ +ÿ¿Â]®–/ýÿ§þÿÿÿÿ@°oõÿÿÿþ¥þ¿ÿÿÝ/ÿûÿï÷Û­-Gÿý/ô¶õþô¿«”ïý¾ÿÞ¿ÿ»Kn¿ÿÿ¿þ¾Ýíÿûßî¿ßû·ÿþþºè'ý»õÞµWÒýõûô›ïßëî×ûúúßïÿÖÿ{ùŸô¾ß·ÿÿÿšûÿß·ùûÖª·þÿöºæ´þ¿z®ûjÿç7Û_¿VÝsÉÿÿÛ§þöÿë«}·û¶N¿ë_¾ý³D߯fkÿí}a—›4_¶h¯õzýRÿßþý+¶ÿ¯¯¶ëûú{UÿýÖÿvïÝZR+†Ù釰Ï&öï¶Ïö%}—ú´PõÛO1êØVí¿V×[0ºmÒì#Ù sI}µo÷m.Â(wuvC²ëV×OnÛ?$ÞÙŸíª¶¾Û¥~ßiYžÙŸwiwÿ}ÓkðÛ4OÛKAVÅ28lIƒVGÐli¦ƒb“V)5±a¦›¦Ä&9= 1IÜpÒƒa “bm±¦šlSÃm´“±mÖEǰÖã†M‹b“¹ƒ´ú·…« Ûm&Ë×¶Cô˜aXa)wtžÒªy�7I°ŠÃ¡íœ¬†ãò4E„Ð0ƒ !°ÞÔ$w¨`“'ÑžK  È£Wa’€˜W†`˜.Âa…a6"¡1 ëØ$û ÉD+Xm›¼Š€±jÔ28»¦ÈáTØLBM8i&i&˜bi1 Ø1àŒi1 Ša=¤�éö)0ÃI�`ÆÃ Åq£$F@‘n±ˆˆŠ9äÙÙÙ^ 0§²‹„ #ª(Ùl2u´|(AˆE>! +DRˆE;)ˆ1Rªò­šH«°ˆxbƒZ„A„a|E'-1\H7õëë¯úKí¥Õ[´Ó`Ò²¡¦5£ÿòFZ£q4"½2eBšd³PŽìȵ˜*d•VíB Ðð�²H)‘:þé5/ ÷V¿ÿ¨Â­èwùÝ¢ÓH½-õªú©Sõ÷ò •,s²Ì‰!êªô8ú¯¯)#6š‘ sÈŒD;-DRòMÒäbõ^O™ÁA’9"f°Ñ Ð@ÉÃD¡à¹•d°��d\+ q‚æÌ äR QúGf„C&K ù’3g”EóY3 ¤èá¢%èÉ1Hhá’&ª:}d¢f²Ñ}&ým!oTÓM6G„F†©„n~˜FマìÏ¿ÜyŸ¹'™ÁjzAžfvaa¡Ú!&s›a4{d&Ù¦™é‡Â„ µÕÙhM²ÑÒnOè29„Πᆚa œ.“|3†•²ém]Å+] ©žh¬„ÃÐM¦y™´›Dwe¡;-›T{i a &ÿ_ºŽ•þ»N“[O¾¾_„é[¥ã¥xþÃn›ÖöÛKA6é;ªM¨ÚÒO'¯»»ÿíº½§î-;·Ò^:~ÿúþ¿ÖÓêŸê›^¾ënø¥ãýÞ·áëþ‚#‡ö¿ÛZÝõ#…ë½÷iý½ ß�~¿¦þë¥ ÿý‡Ó{øÿ×}ËrEŸädãß,pWÿÿ-Éè±ÈÏñ÷_xc¿>ŸÿÃ×ÿÿ÷MWÇô‡Ø=!`ÿÿñÿÿÿ†ºCþÿ ÿÿÿ÷ë¯þ¬?aÿûzÿþ¿þÃÿÿø7ÿÿÿº;´�?ÿ÷ øoÿÿÿü"‡ÿøoÿõûªÿÿéz ÿü�°ß†ÿÿÿÿÁ'ÿðÙQÿÿü;ÿÿÿ·é ¿þð–°ÿÿ_ÿú ÿðáÿÿýöëÿÿúc_ýw÷ÿõÿïõÿý´¾ÿÿš/Õþÿý‡I}þÞ»í¿ÿûÿ¥û׺¯ÿÿ½[¯Ûÿý¥Ooÿ¬âüëÿÿ_^ßê¿kç=}¿­ýôrݳ5ÿïëæˆúý²t¶·íÿÿ¥·þN¿Ö÷¯ëöú~©Ùui[eæáY{¶Â¦©ö´ö‡°Õ?Û½úm¾›»_]»öKì°ŸÚZÝXOºjšiÛbÝS›IˆI¦¤á¦˜TLBiÈY°ƒL&Å á·iA² ås AªÚv‚A² å}5b”'%EæI;m+Ód9LDDZ ‹Â �(Ñðª Rd1”.2�šÌì,d1s†T †Žf˜ÈaófŽ"tuÑf¡�¨<—GUÎF´GyȧJH�¢1‘¢ Ù¨d25ù@ɃS¡»é“Ìâ�™ì2x&TÉäÏló5ϬÎØ„É|ö �a„l2 á Ìã<&|ÌÌ ƒ “™~~r$Ï�“Á0‘ì§�É„Â44l<�†™ñ„k #Û3‚aØF·„Ê4k àØÂ60‹ÎƒŒñ£Û +aØF€gàFpð¡3C>fqsPƒ�†Oœ‰óž3N Ó0gµ8 �Í"æ¬0�Â40‹pf˜gœ"ášf # “4Q˜0G³ìñ¥i6¬4Gl#Û@Íšé6�l+j“h3Í&“i0Ѷ BhöÝÒmýäЃh‹ +TÆfÒt¢’m'IµtE†®�nGmPM´ÒM ¸fͦAдƒiÕ'Іî�¡›Ü$ß**骼– ÂVд�&Ò  ƒa+ÐA¸v�| ˜pí'ôéXWIÐQN‚m0ë}t©6•­ºOMÂz\mô›wQin Òµ«´­ZJÔRt¸&ÒÒà› +¶í%i<&ßWD½¥a-R}÷º´‰{VÕÒ¼[K +énúZ#% t­-&ô¬+I;,é°­+ýþší¦�Û¡TñÇït›ÒuzßßûÿI½¿÷uÿô�}ý_õí{ý¿±vû¦µý¿§iÒµÿ餟zIá:éi4“]ýÓ¯íÓãýUE&ßÚwÂ(}Û¤Ûÿ¨­»îÿ¤ßßíh»_ZZ­¨Ö×]¼o¡¯¾–Ó¡¨½{Oî=«z®én>í¯¸Çê** ©pŽ5én7ÿ_þÝ!pÿÝ[úÿ÷õþ­ú�¾?¨Ã¡üu­Ñc‘ŸRkÛo‡ÚÖ>ÿîõÃV¼w_ñôXñê–¸Üo¿é/ÿ¿Ã‡¯õé+ÿÿðúþY�ÿÔ5ÿÿŵEÕÿ¨{Ë«þß¿k°èëoI|uZ3ëðÿþÿÿ°Ø~ÿÿÿÿûû Ìÿþ­û_T¿úÿÛVþ¿ÿ¾ì?×_Oô¿ÿ^½‡ÿÿÿðØoÿÿÿÿÿðoÿÿð^°ßÿÿëÿôÿ×0`‚>6A„ BEcdt\UÄGDhrl„DE!ëר�]ýWý´—úÚú `•Óºb4˜L'E5– +ù3Qÿ”"¸.Yªt&W¸ª³%¸ËÑìþs&ï‘Ìá—•ëŠål·goT)¥©Ö**"<ÉS"r•Åå[öïá„ÂFâ}{í÷û×[ïM>BÙ7†! %={¿Úñý/ØÙ+gÃÍ­®¿ãÿ•Á|0š ²þ‚ls²¼‰!Î̱ÿÿê*>÷¸Iý=�§DXÊ’ò‘žv6‹£º,ìIï!³!l§DB_<ˆÄGý¼R¢6´×:çdõ&‘ßYQü¸¤<æI£qDn5°E¸d„l�›,ˆˆè½˜"RÒ†“…3†®“m4“h29«{NÒNí%ú ¶ƒA„“m4mp™â ¤Ú[.@{ÚMÿ¤Øg˜Aœ-&Ñ‘m ›Aœ6Zl³ÒmpÒt›JéÔûH6Ë0‚m'páPdsI»>ÒÐÐ_oÒÒÛéÚªCé:_OŠýzM%ÿ_ö>­¾«¿Þý>é�úþ¿Âvéõá0�m't¿IºtºmmGm+äíz[ê“I_ih”%~Ú§^) +VÓ½^öÓê–ík«j¶Ð×»ª[¥Æ¯·éô«‹M:Wý=‚(ùïÞ¶›ôÞµVŸ¯÷§]m{oqT×÷hUiý¡Kî½j«½nûß¡ÿ½¤G ê–?wCõ}[}-Zª({_íßúúQ¤ûîúï‘¿þé[õ¯­úþ‡_»Çõºÿ¡*¦ÿïØ?–9*Ø{>®¨_ï]µ‡,Šý­ Õÿ®ÁÿËØKÿûå§úRªøÿ¿¯M¤0÷¦þ]_ýåY~?_××÷øk¤?ûC¯ûúõû·×¯ÿ\?ôº#Ž_rs/×ûÿøÿúßÿì?ÿÿÿÿÿëÿÿûÿí÷^¾šJÞÿÓ]ºÿü7ÿøþÿÿ¯ÿ×ÿÿö¯ÿÿþ¿›ùdwÿÿø7ÿþÝ}öå?aú†ÿÛ”úõÿý½üpÂÿÿÿü‡ÿÿþÿÿÿÿaÿÿÂÿ¿ÿ†þÿðm=/:«i ú ÿé?·ÿþ ÿßíÿÿßÿáÿÿÿÿÿÿÿ/öV¿×Ýÿÿ‡ÿÿ}ÿKÛý-¼?þ·øÿ÷¿ÿÿÿÿÿ¯ýþß¿ÿÿþ‚ûÇ­¥Ûô¿×¿¿þïô¿){÷V*Ü;ÿ÷ÿÛÿúïÿô¿m««ºûÿûõÿþ»Û«þ¾ywÿÛúûµî·ÝÿÛ§ÿ¿ÿÿ_ýÿ_ÿÛõwýoÿý~ÿMëouÿ_þÛÿ’þÞßþëäÿî­mÕÿêsÿÛüÓoÿëoûÿýëîÛ«:¯Û¯oïöÿ÷úM™÷· ×ý~ëìþÝÿÓfkoµÚõú=ýÖí»y§û×_öf¿Ûïý{3ÿoï_´½÷Û3ú÷_lÏoÿlÏý{ö“`”Š;ažA³é¸Kkh.í-[ +Ãýo°WlòNÑNÓêEpÚ´“NÝ'¦Ï-†q&žªÚV“eûÓl[I×Óí¶ÕXfå¼Ç"Žeët–Øa;m&ÂV–­Âl¿ØI‡¶¡ê¬4—‘ÛOh&!A8`ÂL …°’i í$Âv’h0Ä&EziÛb…L„÷�Ó°Ÿm-0˜a„©Ùd'·N °‚´¢‚iØbƒC`Ò ¦šv’aˆI Ób�a6* âa†•¦Á�6LU¤šm„¢�aŠdAð{ÚlR 8,&È�ʶ ÂhC`Øb>IG§†�l1R°ð{` F¬«edªA„jA¡Eld2gR¹Êèbˆa0޾ЯжO†!Ð1A¤|sÙGƒ "Šä A#Ý5å[ˆH¬a„ñʈF†H÷ž,' 4Q!hÖPË1ŽƒÑ +: 1 „B& …´5**ÊÐ$g„km5;°Ô)�Ä"3IÖQ\&M©ˆÐˆÂ¬$„hDaqÙ‘(n8õB8ˆ�ÕõDÚÚ ú¥ø$,/§Š|'A0ƒ¢áŠ69Xä†ÿþ[ªWZɲÜw\ +vDvŽÍØ%'ŽÆJOMrn2¬î%ÎÒ· ×Óûûô�ÿÿÿþ?k¦½…õêñ™åuµç`Y7ÏÎë_ýW×ôýy—Þvtd“*k"Ë%qóZ$šúþuŽÌ,�©HĞ2@Ê„p“%¢”fÈ‘›,«œTD.DNH€d¨f¦|RD1R( !8„�à�˜Ž#Là�”"¨#ÂH þvUœÈè�œÏ"ùñš™˜…,DDé±�È��'ÐC[D&L ¡3ÄF„'B8y²!ŠLfÈ”5 d�ž2 †LP)NG +Q™É„Â5°�„|i°™£64hjPžQ„]†� OÁ<øÂ=³MQ¸å†��áxçê64o£eŒGî¹…M>;b…ŠŠöÍ5Ý"Ò?5ÓØef‡„l#ó['“=úi„Ó»aØPNhØh2Fz3“Ì ��¦§¥4l #t"í„l žM +ˆí£ÛJÕ¥NUºtœ",0ƒ8z œ ¶Z4DXi:NzV�œiäÊÓz ´´h-&à ¥ÙhM Î4VR}¦šIÂzL5I¶Zœi6“z´‚ ¡…ež|Ðgq ›KD[t}¤Úg�&Ów›h3�è&Òti6(÷ð›.©T](IpƒtÞ&÷u[‚|W§«…i[I5Ój+kãøº]0ÛQiÞ—Ý-%ÞiZ_T­¢QýÒ…¤êðWV•Ók«ZMÉÞ˜m®–“¤Þ,6ÿ·ë»Zº[NÓî´—é7¶š^+ï¾¾·k¥í¥ú}v7ª^:ëýzºVãû´ï´—¾ß»ªm¾=jžýníwkë§ÝÿöݽèkßÚî¶”Ž­+èuî5ï«ÐÚ~ݼwR8W�§CKývŸ÷ô†¶½ÔޝýmÚ~5Ò¿¾?¿øïÿ¨þ“ ™ÎUÿ^›†‰ŽJ‹†ß–9ÿëù½䔿,rBŸöþ¿õûÁ–’é õÿ¢Ü•µÿÿïÿþûýwÿa®��«ÿì:àô¡ô?°ÛU]!¼Hëÿÿ×÷Hõoÿõoÿúëþ¡U÷ýý‡ÿÿþÃý¿aÿì>éÿ××ÿÿÿÿßÿÿÿÿÎþ +Ý~Ýÿü‡ÿølOÿÿü7ø6Ú@ßþmõÃÿÿÁvëÿÿðGÿÿÿÿÿÿ¯ü#EÒýÒÑÿýÿþ ?ÿÿá¿Ã~ïðn‚×ÿáûiÿþÿÿÿÿÿüè-†�~Ä$õ×á/_ðé}ÿÿáûÃn“ÿíºêûÿí}Šÿÿü ¿ûÿúÿÿÿÿë �Gô`¿ÿú_Ý{¥ÿºÿtöûÃýî˜du^ýÿ¥ó¸+ÿÿô¿ÿ[öÿû¾Þ¿ÿ¥¤?¤—®¿¾¾ëíýýú»ûïßîÃÅ~ÿ÷KÂBõÿÿý?_ëÿ¿Úÿÿõÿ×®½µ_Î~¿ï[{tsîò+Ó“þßç?}wÛþÿ[_¿ýµ_ÖõoÞ¿Û½·¯ÿúÃ/ÿ Çúëíþ­×õ®ßÚVÞûÓfi¿_¯4ÿz=ú÷f¯3Vh�#Ný½y¦¿ÿÛ×únëû_û3Ý[µÿëØG6Açù +°FÚV—ÙêÂ(wf×iV‡vÙëÝ,ÆÙë´­+Vû¦¾Ìl0•ý¥mpÂ{g«ÓlAÃÌ-[=Ø#Á¶—v_ÿÛ?Ú8ïí&ÏZL5Þûa&ÙéëúiÚÃvi¦ÜB‡ ­¦ÅX·"õ´“NÖ!6›šm¤Å1Xm+H1Lm¥ÃJ)ŠPšv•í6m¦ÅZ{ìpíŽ!>ÛilVšj›ØÚiÚLU¤r¦Â 0ÂH4M0Å1±L0‚TÂ{µ¶«T怜ŽV `Âwa`Š+Û# ‚®Ã +ì1L ÂØ¦)„ÉZ‘G슀ƒ +ýŠqxN� 0O*8aS´&&š; UíU¼0·½bƒDq¸§.22+ì&JÐa1Ý󳢃s±P ‚ŽÁ"n¯5£²éÊ÷ˆˆ‹™äæÂ+¨C@Â+‰â#WIñÄGý'ÄkJþµê×ÚëÒT«_ú_Õ%×°•¤¸Q´»bÃKT˜a$რ„Ji¤„œŒƒL4 ÍÅ n@`Xoÿó'ŽÒ¢¹nYD#³Te¡ÆF­GqB‘Œ(S"yX3¿Âa2 „w™@Î +‡¨S!NOÍÒ_zj©¤èz ¯¿¾þÖï¨ÍÅýÔv¾ÖÿõíUnôÿ;^çcD±È9X©!$þ¾Woûÿ×ÕñÿZþºë¯¨ÿë YNjtyÏ!Dt�EœˆB#H�)ÔÊxÓ y¬Ž¨ŽÎ�"žf4Èd@ã8êdc*Ç’gB"ìû:ÐΣ$Ø"8é ÎÍb42@ÓL§�dèÌÈüÛ5"A’Hdxгft"âDb'd1™ŠD +œƒÂ¬üKË™S!8ÐÂ"ÒpSd­‚]„k„ #Xf8A ÃD$Â1™á„ #X` ØA +£CD$Ífx vi Ê4ÐfŒÌðG°h„™¬233Á4F€Á˜Â60��4'ϬÏ=çxÈLÎGƬ4BY F€Í3�aê�„k p#ØaØFǬ2F`ôG€Í3»!Ÿá4ÂaØ#80�m5¹ ByS+ôú}ßM$ÃI´›Â4iݤŸ@­4UÑáª<�mÚ ÐA¶]ÐM¦� #CA6˜F†¨Šï}]–@M…D­„{i6““ &Ñ¥rÈMí0•a¤éÙ9“¡. ¤´Õ&ý ´jè'I¹3„ÃU‘ÛIÓT¶OÓI:a4ƒi:AÒsò äáU3í&Úh+,ûÄ7†šI´´žÛIÃM+²Ð´ØbÚbéZV–¾)6¢Ãn´íeûKÒ´�L=.šKZDæõ·[ü*ø¤ÛMv’u‚oqum'K]+i[29Ájé—i;ô•¨i+I×Q +¢Ðÿ_¯K¦ÿ]-*Ý1ü]+ký~×ÅÕ¿×iý¿×uþ›õûÄ;ëzÞõµ¦·ûi%⿺Z_ãÞ“°‡m.ƒ_¿ûKkãoþž-µ~½öê.µû«ÔŽwiâÐ×½mÚz÷öÿ¯Cm§ë­öýxý_~ŸÛÿu#…ÿ#…Q®ÔŽ﮺¶Ý*Üc®þû¾—^?~©_n·ûÿ¥×}�ï¿ãð_ãü‡�ý$:,r3Û§~ß÷C×úT=ò4•müw_¼}A=Ãxùc¿ïüµuö¨~?üº‹«Ãöÿÿÿ¿–‘ú.°{ãëûý½~‡ùb]ƒHzÿ_ÛÒùe˜6ÿÿ¯í×ÿ µaéÿì=ÿÿõÒÿ[öõÿ_çþéuþµ‡ÿÿ×§¥êǰÿÿ_ïë¯á¾˜ÿþá‡ÿëþÿ_ÿýa¿¿öÿÃü¡ëÿëá¿ÿÁí£½/öÃxoÿ¶¾Cdwûu‘ Žÿ =C×ÿá¿ÿ4�ÿÿÿ'Ý´°ßÿú_ƒ턺!ÿÿä¼á¿ÿ ûú¼‘7äZÁ°Þÿú^/ý-ÿn�ÿÿÿÿéÿæŸÝþÃa,þÿt¿nÿéµ ?ÿx@°oÿô¿Û^‚ ô‡ á¿þõéã¥þø·ßÿú·½~—ÿþ—ÿéhB¿¯þáõö×Ð_½®÷ßú_ý6©~–Ø}ÿü?¯]‡kß» ÷ÿîï~×ÿÿ_×ßý-[ÿ}ÿïÿÃ_}}Òßúý~퇿k»ïÿ¿×ëÝ-ÿþûÿwÍï¿úëý¯þ­�7Ò¯}ÿ!Ý{ê½ÿw©ÏouýWzÞ½ÕNmüòûoúë½ýù×óM­ÿöîþ»¯ÿý+õöÿõ·ëöûÿút¿Ûý¶ÿ§î¿þþµïõzÖ¯ûßuÑžÙŸjßôÖ•Ã?ÿퟛ?7é[¥ÿÿÓwmŸÿïdƒ?¶–•·mŸ÷þûK¶½;lú?/¶³ýÛu õº_ÝíÛ]åÖÙúÓn¯ÛKëm›šVE²+»I=6Á)à 3’Þ—~cl*ê¶Ã¦Míò/´´Ó»ÓO !i¶Ü‹â´Óá°Û`Á+ô¶BÌI¦�¤¤äPíHƒµcïMƒƒ ,nÕŠM´“O¶ÓcÞ 6* ¹ÚÚIÞÈ´NÓb´ê +ÑÝ„“iØ… b 6TÃIƒ BM44Ù� ƒá¤Ói&šÛiªz …§» „MS¦¬1 ´´a¦ƒž«lSaBmVÁ: …„ÓMˆLB…°Á$Øi&šné²8´Õ4› „÷ +ÒM°E**Ú*Ú*ØaT Ä×W &4D�Œ1Xd´A…+ +>V2�"C5ƬA“ƒh",¥: +«—3µxŒ¢²‘(A†9ضVÐa ŽÒ#‘«W²aˆ†(D0fD¨DA“A:�ŌȣlìÓ&ÀlDUÄz,Ô�½Ukÿ_ýkKõ×Zí-`’GfGØà•F°ßë1DQFÅÊiø�ÿËg^TEqR+¨Œ•"É924DfS²"&h–g`lìÅ +žSêFgtŒÉx·3Ô©áèxRªNÆ_Òî“ý5´È$ué}pô?ËŸðúŒÿÃÿý}­ý®´·ôe]%K"þ;•…ˆãÿãŽwZå¦_¯â¾£�ú}u]}ü©¯^¹ÌÔÓ! �3©)&Z�ÆB(D6@Ùöj<¡o*'œ2b*Ù˜¥�Y«" ŒÍ‘ôd®"c8D1IÉÅ%¨ØÈ–lŽ¢šš!&ENXdü˜dh*Èô"Š¥!�.<�—JA|¢#²ˆ¼HÑv\gA ÅD&MŒ†:!:0�ä%@‹³LÁ„l8ƒÛÖ!ÃD!sù ÆÆ¬ð ùžÂ —‚ h>f™œ�“ç3û1Ìí�A“æiÈÉ4l žæ› ž Ègò|n>ËMçéÓA„khßFÀÈšj˜Fæi'„lež‚a0� 4Â64n8T#ÛÐz ˜Š.°‚A8FÆšg¨†�Œ#côÂ7†XëÐÂO& &Ðv•¦í¤Ã“$Ó+,uZA¹.M";hŽÚ<4Ÿ¥Sæ¬Vf’nÃ2öªÚn“i:N“h‹l2ý0’µK3�”´“jƒ8h‹ &ÐÙgL0ƒÑ°�m&Ñ´›Jõ|ùè&àÐZM¤é6†—ì ›§ežfÒ¾6Ú[U«I6›i6â“m\UÒ·z@¸V.— +›¥Z«i?¶E]+KQVà¯wJÖÆ˜mÓ®•­:ÝZ#uI=<&!ih'I¤¯KÛÖízñIÑ(K·ê>ÚWzÿ^šKkI·IýñI·ýºwý-­^þñÿ·Òô¯vô¿ÞµÒÿ§vÕXC­ãÓû_ÿ^ú©mWZh^�Sÿÿ½}n1{þ·¿{íÓïõé;¿ê“mtáí¨ë½ßÛUW½úýHá]ö�Há~›i¯­Ý!R8]/oŒ7ZÐïÚû©/ññôA õo¯~ÖÛÖ¿ÇÅÿ÷_ÿ½JðÖëo¬x~ã¥ìâ¿Ûähëûãúò5(ÿ¢Ç#+¯,rÈ _Þ[’ ìž¿þòÀý~ßðëî¿ÿ1ÿôÿÿ°|²v¿íRáþ¾�ÿô?¿ÿúCÿâÿBÃÿñ`ÿH¯õÿ¯ûvÕõµÿ_ßÿoÕ¿ýaÿÿÿÿÿÿþ»ý×°ÿßoÿÿÿÿÿì?å;¯ü"‡ÅþÝc_þÃðVûhãºðߨ#�ÿÿÿÿÁþC¿ÛÿöÿòvG²¡ÿÿàßë®ÿ…yc¿Ý/ÿð÷ýúuðßáÿÿÿÿø CÿèÑÿï°oÿÁÿÿ„ ×ïÿÿÃÞÚ_ÿ„ §ýÇ¿ÿ úXoýµêðõá.ûÿïÿý/ûÐ_ý~ÿðß÷ý/ ÷ï_¾¾ØÿëíÿúÿïÚ[ßý6>ÿ¥ÿÿÿ¯úÿú_÷þÿëo^ÿÒÿ[þ»_ߦ=KÛý-ëÿ]úÕ‡o¿úûÿÕûÿémë뺷ßûÿÿKÝwÿÛ]ÿÿïõíóËÛÔòÛ_ÞóËývûÿ_î¿ÿÛÿëºöΛMÿM�WÿÖÿoÍ=éÿÿ]¿Ó·®ÿëlÑO^ûz÷úÞÙ¢ÿ¦ýÒÿµöÛ5¯OKm&ü�jßÚMš%Kö÷÷}ûg׺Vé_}Z[_ý·oû ó0‹kúö—iX&i6•ôíž»¯ì ÛÛ +¿i0ÎKm¥zûûgöÏIöÃô¶ÎI0ö%tÙé}+›¦ËþÃ6öGôäWr&ŽÓ`ÁSM´¤Tí%ND†�m&´í=;o†©¦ÃÂm “d|Õ;Ó …âVŽ´“O¦)=©§fÍ�ˆI„ÐxIŠA¦ÚI„ÓAÃa„Ób˜¬ âpib’dAìSi1H44ƒiEC ± +ÅÓ…°�ÂlR¦ÃI¦Ò5a0i9%MZj�ø]5ú¶A[WvÚ ­‘t؈`ƒ´GB�í¦ƒ%Âíbaa6);ÑÞÓ]†`ªWZO„× ‚a0�‚dz…;¼ l#@ðEðÂŒ¤¹Ÿ&¬eV!b+˜ˆa†!$dŒœÊâ°ar˜æw4[‚Ÿ�nYFn#ˆ‚;qekûKévÐIÃ!ÊÜÙÁJwÿÌ”ò¸’$¨™ÅR2r;4Ez£±””³±F®a0¡NÂðá0ªS£#幚;Òª®¹i“a[»NîöúBïú˜Î#C5Œ7­ÈP†Á‚䀟¤ïûѱ„{ #`6ðÓ'a‡ÞÿWó¼GgGd¨Èf“BÛI6A¶ùYYOí8n\á'"¿ÿújž»m$é;õ×é·tkþ¿êª–ߊ[sª5žH$È«ü«â¤O#êEã^GòFF¿9�4G³l”£‘N¤-•QUœA*É“1æBÑA�žEÖ2@Î�H¡‘DÔõ•QÁ•" ƒ ‘0ŠA!ù2„èQ ‰B-FÕ¤6D#†S³1MC!Œ SA’S¸ ™h6B £64D9XQÈD'L +¿ß �l4BLÎcž„…Læ Ó0a$аÐ}რdfrP�…9”gù Óg¡\Â3³IFl<Î7èícA�0�Ù?&ƒXhÖFéO™ÉšmæxLÁIœ¸ ÏÁÙ# „|„l7B5°�€ÉàƒA¦eÌŸQ­šH?ûVÂa2�B.ÃGÀaGÈGư2y8A:Z74ÓÁ(io¦‚¿õQ| ­SK'OK –XF†hÒo•m'MM«k'é[]&Ô#ÛKÒdºÚyÎNî‚l ›KTE†“²ÐðrÑI†E[IÒnLº ¤DvÂ>9»,€›O_õôx ! ƒa'I´›IÐM¡ÒÐN“vxå¡6‚yhgÚMÿ¤“²Î�3íék žž±m$žÇQÅ´­ê¤éº¾´“jWKÜ$éZZÁ>:¾é8º¤Þ-«¥n–· +ø ïêÚµ]wWˆnN5i6•¨¨«h”k®•Óoë¾Úþ¿bõúÿ†—ý*Û½µµ¯µ½-­/§ïOßëÒm?k×ô›ÞÇôšIºwïwIZþûâ­­i^:Òö÷Õ4¾¸ÿÏkë»k¥â—·îê5ûÃUë[¯zõÒmòáý!R8Uö»Ú¡ßÚô=Gÿ¦ÿCý-†·VëЩ-ÞØj—étÞ¤t¿úúQÔ•·ýÿ–95‘ð‚ØuïTëÉP8kñÖ÷þ„WþY�‘Åøëúýÿ¯ÁüÿÁ¯ÿ«ø¯ê�ÿìÿÿì4Zz×ÿÿ�ìxoÿïHX6}zïÿÿ®!MÜ�L=×龿ý‡õ¿ì?×zóëÿ×ý¿úÿöÿÿÿ_¾ýÿ­¶ÿõ÷ëÿù“ߨzÿ¯ûkÿá½ÿü6¡ÿö¾¿ÿÿûÿÿöÿÿ÷ÿý¼6ßÿû 7ü‘?ÿÿÿþ8h7‚0ÿðFÛ`Žúÿðßÿøl …üŒO· ß¿ÿÿÁ¿ÿÿÁ¾¿ÿÿÿ÷ÿÿÁÃÿKÿþÿûý¼ÿ„ÿOÿøoïÿ¯ëî—�ÿÿþþÿü7ÿÿÿßíïÿýá°Ý¯A~õÿÿÿûééºÚ_þ_ÿp—é}¿ÿÝÿ¿ÿ÷ûßw_ëÿß~߯uÛ¿ô¿¿^ÿÿö÷×ûÒûâ˜ßý]ÿoþ¾¯÷Û¿ûÿßõîûÿý¾ýuënîõ×oׯoþÿ'_úûúï×ûùÕ?íþú¯ªëu»þÝßùÅÿ¿ºùÕwvëþ¶»ïÞ{I²ÿz{:¬Âí~·½imßû«y×õþÿïûõ­&ÿìéÿÿî—wÚ»oÿëuý7¶Ý×÷Þÿº¥iwÛdë«§¯vöÚWÛf{Ýûgï÷Ö¯ý¾ý¼óÚý¿o´›?°Ï¯¶Ì×X_Â(wÈcÚ[gÓpϦÏL4ÿêí½³5{¥ö•ž¶Ïú_ÚMöÙé_½:m}+t˜g¦Á+K¦Òò(퇶ºY„Ø$ÃòòöTši0ÒoËÒ áÞØ#�‘GÛqû^�°f$ý.˜Ø0UU`ÈîÒ† 4Ó†-í¶•±±²8±±Li¦¶“"ãbØä^m¤šÞÅ2-Cm$ôí(0GȾ)?tÃjÃIm$ÛH1LUö­¤Á;¶‚´˜6!0{�i†+M †“i1 ‚tÓ`ø'MƒßtÓL1I§ a&¤Ó¶!6“M&›ºm†Â„à ‘ÅÜ0˜&G 4íƒ 0“‘Äi6IÝ ƒ „Âm%OÐN4Ða[a6-‘u¡eÐA[ C„ &ÁØ ƒa8WiÜC¨� Mqh¢Öà •nV B �a4(«a!¡Ec ˆŒ 0R±ˆ�0ƒ"" ¥RŒã[Š! B hì5¡Oc�¨DD[Z;PƒÂ#£°T#FU!lDFŠàiËBT"éPˆˆñHkWí/™ZëXmôÐUÝl4¿ }pØKÝU¶8�ñ‡w0˜„O=²Û.†"?ÿ-P¦MÔ9$Îègqg#!¨ì;EË}"yMê¥"PFw•Æà�U 9’¬v‡…4a&OtMzOúOø}Zÿ¨÷Žú�ÿCúÒéÚkØJ×%+ÉšÇÿñÎÒñëëÿ¯ÿO×_ HŒYÓÍHîhš/S²Ý2�ˆ§Š‘’PgR5ÇC óZ#¾¹ÈˆŒÚ�Æ™ÎÐe É"ó#SÍ—D ȆLDFœ¹‘l¤åVE ö} ¤œR1£c!‡*Å(D¬½•ÉhaʪËÉŸ2 �åÒã·N—ß÷§ÖÜzãQÿÚv•nÝ&Ýÿ_­ººô:ß®†›×öã~­§ôºÕ ÚßÿuÚí_]ÝHáq÷ÛÞümZJ–ÿÚýÿëÿD84®õ÷ãwÿ¤ÿ¸úÃQùnHkëªý6þ‹²Ñ×ÿùvq/ÿÿMü:¾›ïõþ¤<9u­¿_ÿÿíÿËÕÿ¾“ ‡«ÿêÝ0õñ_úßÿñýÿ×ëÿÿ_ØþékûûoØz¯õÿÿõÿÿÿÿa°ÿÿÛ¯ÔðØt½/ÿÿûÿÿëëÿÿÿöÃÿÿ×ÿÛØÿÿÿÿÿÿÿÿa°ÿÿõÁ[{ûÿÿÿÿÿø"Çÿÿÿÿø7ÿÿ‚3ÿü0ÿÃÿÿÿÿÿÿÿÿÿÿÛAa¼Cy.Ÿ²$ŸÿÿÿÿÿÐ_ÿÿÿÿ†ÿÿð‚ÿüüÿïÿÿÿÿÿßþÿþè,%â ØKð¿ýÿÿÿÿè/ïÿÿ÷ýïÿï¯õöÖ¯oÞ¿ÿÿû×ÿw_ÿnûÿuÐë°ß_Òÿ÷^ëÖý×ý/Þÿÿþëß®ë§Òÿýõ÷»µÿÿÿö¿öúõõ»¿kúë¯÷¯zý÷uëõýÿëýÿÿÿ¯œNÿ®·¯ï^ý>ûÿßÿÿÞ¿Þßÿ^Ϋ0¿¯_ò_w_m}¿Û¯Û÷¯ý}Ûÿÿ÷¯¾×nº_µó�}ägMÛ׿ûÿûÿí»¯úÛº¿uöëÿ}+ÿ×ÛÝÒßô›4_i÷öÙÖÿÿö×úzW]+4]Ýï_¥¤ÙûÕ³=¶Òöÿÿúº]ûgæÝ.ûK½.¶á~’ÈcøEéºaÝì3êÛûá¶–ÚK¤Ø$žé&¿ ïaœ¬å¯ÿ¶‚ý&ÒÛ…i0Áyw˜Õ´µ¾Òa¤�Ó aœ›IVZi°õÓNÛId^{Á—›I5OI0È^zi&ÚI¦ÚI¶ƒ†-½¤sãodAÂm4Ã"� „ém¤ƒ´˜¤Â 6•¦švm¦˜bƒ„ 4ÓM0¡Sm šw¶‚A¶–‚b°h6ÒNÛJÂAŠM†“ƒÚH4a‡§|4Óµ ºPØA4à Šd‡ m=› ´mm…[a„“µiªdz6žm¦“M áƒ ¬ 0”öá„a"¼¯>6!"±£Û(HðÚtx”a„'•|£Ec•t¾2¬è:dÈ*Ú3¶E3¬ Å#cajU°Ä$VJ0É ƒ�m‘Ô`ƒ¥^UÃŽP’;B" Á5B‰„4vVd +(舎&ÀŒ®/•ÉÌP”Ù_ƒrm¤"):�Ž?úÿéÒéÒ®¿½.?ì „^˜c¤ éƒ0]Œ²æd§È ÿü¦–)\ÌŽÌ‘d+96%‘lU �’ºdL�2Í ™n²‚…;TGb°U2S.‚+ªe:O£Ø3º4lªª~¿ýVµ¦�}*­ÎÔ½Ým>þ�ýÒê…ß+Älfy�a?I¿÷ivµ¶Òû•2’°Ø†|n¶½&üŒC’…��¥!ŠÐþA}¦›fšA¿I¿O_׊úï·ºZú·þº’hŒYQ�Õ§)k!hÂ)ü–^¹'ŠD\ˆc"3FCG@¦ƒ!—2Ï™ÐaHþlÎ¥¤Fó: èŽÐm‘S: è3 R�HaB!(F ¬&œºÌøzDœi‘ìÙÅ Æi›3TGˆb"ç80MA$ftNˆ…ȉÉjA£dp`ˆ¨&9Ã=eY‰²Ÿ00AÙ`Í ¹Ž]ùâ>Ñ Óûz„k (ƒMQ0��GÆh�"ì£ ’øA¦±Ä< Â>C×$A0˜FÀÓ „|y‚  Bì0�Ћ¶³„]†˜A“É„k Š“h“¥oÕ*Ýá6•«Âm+I××KVÒm+“ºî»p®µ_«¯‹ 4ëi5Ö“IÓúÿYšIZïÛw§[Å?½ÿï§WKZwßo§õ×U_ßz­ýu_þÇuÕÿ[ô¬4߸¥î•»Þ�ÒÒÖî6ª£ú�~ÚôðÈé}uÔRw·ïÒm÷iÐÿ[ú[îÝô5#…­HákÒ¾ßôº´B�éÔŽÛŽ…ý /}ÔŽ¯×®ïõþ¸aïOô?õúGéZZ]×ï¢ 7 ÿä=?ZÿõÓÃýIäsüŽýõm½×–9Ç(ÿžáú'Wùuõ¾ùaÇÞ›ÿÖ?¤0aû—Wõýµÿµõÿ÷—X6¯ÿ¢Óÿn¿õ‡üº�Ö£^¯ý}B#úBÁïUþ½{¤:ÿÿýa†÷J»ëþ¿¯@¨>P?÷öÿÿýÿýØÿ×ÿ¿í¯ëþßÿõÿþ¿ÿÿVÒÛoõÿ_¿ÿǽªÿÿÃmÿÿÿÿÿÿ†ÿÿÿÿÿ¯ÿðÃýÿÿÁÿÿÁ{ÖoÿþK²;÷_ïñßÿÿÃa¿ÿÿÿÿÿðoÿÿÿÿÿÿü?ÿ]ÿÿ Ÿÿÿáí¥‡ÿíëÿÿ¿ÿü6ÿÿëþÿÿöÿîû¿ÿý´¾¯ü7ýÿÿýá/ÿÿéq ¿Û}z_¸ÿþßÿÿî×ÿ¿Û¯÷ßÔ:ýÿþÿ÷Ãýÿ·ûÿ¿¯Kû¯ÿ¥£8+rúÿíWáÿÿöëþ½»ïÿÿúýÿk×þÝïý®¿Oß»ëß÷{Ö¯ëúÿïô…ÿÕ»ÿ_ÿï÷û¯úÜÔœÂû¯ý»÷«ýw¯9½{{ößõÖÚûßý•ké·ïwíz½n¿þ«vtÚë­¿ÛÿÛü�^Û¯ÿßWî—ÿÞÞÿëiuûm“«Û'Wî––õ]íß·Ö“f}ÿdé½ëVÌ×­î¿ÿÖA&üæÚZ¶f›4]íëùûöÏËêÞÝ×ú[v½wÿíž¿t›ïöë¦ÒHûû=6 6›`“w·Z]¤û{g¯VÏV–­¤Ã=}°Á&öÒ´ {ÃÌjÝ}}dAÃa¶Ý]ö‚a…l%öÃ9È®ÛWeå»KÓPÚL3pm$Óô“d?jÒL6–š¦¬S"Ý6ÒaÛ§¦ÚXJ×ÓMŠb˜¶)�‘}¥iXm*M�Šdx튾ÐLPb“M6)�´­&)Ä*`ÓmštÓNØ'm�žÂ\0‚Òb˜¤Âi±P°˜OØ„ƒL1 +‚hl4ØI5O &Õ ­$Û Ó»L0¡Zm ˜tÚݶGA+#á(h$�l0L&G0A’„Âc²; ¶‚tÃ%0Uj&E „ ^ &JÐb¢ƒ iéCwEcG‡*(ðê‘æØM�*(0ƒ ¸U•l0š J¶‹w¸h‘š`ÂÑñÊÀ@Á @Á!"»)D¹�Š4Gvƒ#ˆˆãQ �9�YÂR�(eKŽvÈ¢2H�Óvêi +§£!hDD[IÇz¸þ»z_ô½zÃzKþëJŽê�[ %ÿKÒ‡· Im,(Ö6#ý†:CÝØAØa@ƒÂ`�mÜQ¡´Šlƒÿùm‚™Øƒ-ÒéKŽÔGj‘�ÞW5Ê£"¨’2È•l§Dy55ª¨SLì£RP�†§Ù6 +gdÞ�A„ƒa×Íúw…FÆôšGÀÒm'ʵÿÐH+$ ‡ûºŠN•âë}ýëI&ÏÆÞÑØ„d¡ýjÚõ;(YØëÒ§i†dzµ_;ñÖÿø]?QðÝꫪÕ?¥ÿý-ÛoLËõ)HæPˆ‰JDGgTyŽYÒ:‘ ÔÕ‘ò‘ý%µ fSÆ‘¨ˆfUæÙ¬d¤R@Σ$ ˆ3¨^A–`ˆdS¢$”Š ˆ4Eé³: "!9‰’,y.�‘ã: ¡##²#² É Žõö쉲8¤`„†GfˆÛ>dvˆ‡+ŠÙiì‘ÙÑP�‚Cà ‚‰B#.E²1†É£ 0‹pÉ<ÁžØ4BM0Á&!×Èœg'ç€Í ƒ0�‡™ð4‚ #[4‹’>0��‚.F°Ê0˜FèÊ0�aé£8fi2|æÖÉM< Ѭ;6ϘGã“ÒT #`i¦A³òeMý{n‚3‘²&ÓM à’{Æ�Ú�„›ÏÈ&Ô'L#9'„AÕU½Ú ½/Ö¶ˆá„hi^á6i6†®“h ÚA´Ñá¥�j´ð͘A6®a¥¤Ã £ÃežŠÆ“rg'é„”4µ@Íš=ÒmpÒuI°ƒ8Ò½RûI¤ÚN¤›–„ÚVË´Oƒza²ÏI†™öÐp©a+I´ÒÙhM¤Û,oO.�‘Ü-a¶‚m'„ÚM¢N¨R´­&Ô[KáUá{¥¥¤Þ-øºM»ú¶“ª ¶Ò´�EU¸M¥õîé~)<�ýû^•÷m]ôŸmÒÒ~Òºi'uÒ½íá—]1Û[ ÒµÞé:_×L{IÒot¾Þ’m}ëö½Ò·ëÖ»µßH\SO^¾·­+ß·ïL¼»t5ñ«xO÷÷u.iò8WHáR›wþ÷Ýz¯ûÿ¡îÚýo»¡»ß·º_¥ý}®‡¨E‡Ç§Õý^·­x�wZô|ãÿPûIO‡Á/úé{Üxx®­×ü±Á«kÿ¢Æxn¿�Ò_®ð->„þ¯êÿW­Zo^XÕ½ÿÿ™8{ã°Ò¯ðÿa¥]þ;v•ÿûÿþ—¿ðëýuÿÿýº××ý%ñoÿëVÖÃëô»}‡ÿÿézþpÿû}?¯¥ÿáµÿõÿÿÿUÿõÿÞëÿöÿÛÿÿÃóKoÿÿý´qéÿÿ†þ ð¿ý‡ÿ�¬²=‚0ÿÿÿúÿü‡ÿÿîuÿðßÞÿÿá¿ `ßÿÿÿMþ?ÿø_÷ôº_Áÿð�x@Ÿÿÿö×ÿð�}þúøKÿÿÁ¾ÿÿƒú oÿÿïmt¿ÿÿ ÷ú_ikþ¿úô¿ïûÿ¯íëK÷¯ÿKþßýï×ïïéaîûÿ÷úqºÿû÷ÿ×ô¿ýß¾×µÿëúößÚëïkïZ¥þïÕîöÿýß_wþ¿ûØpzßÿûï^—ºZUßúWëû¯ºÿûþ¿÷ÿÿgUëåBïºûùåô¹ÅÝî¿ÿí=?þßž_kúú”}+~si½½¿×þëî½öûn¿ÛzÒt¿_Û¿¦ûÛmÒöþ¾ºÞÛ{uÿ·ûkûÖõÿÚ¥¾º·¶h­³>××÷[Ý~»VÌ÷K×lÏm.ž—¿½³ë«I³òõg¦ÌÓkí©ú½uý[ki^ß¶¶¾›þÕµí%m-l‡{øJ˜a{¦Î[`–^n¤QÛ �È®§· /mÂOö°ÂM¤œŠáÙzÁ&ÒÖÒ¾Ewªlv–“v“È£ÛAi±þÒ´0ôƒ!h (m%X=6)‘H´h&5ÖÙ 6�Õ¶’iÄ'ÛI0‚I‘^›i1H6!1L„ÙXOl'OM°““l$šnƒ Š<1M¤œ-ˆAˆM¤tÂÓ½„ÚV‚`“m Á)º «#�Mƒ":• ª›A0›16’vÕ¦L&�Ò ”l'xi`‹íŠ*ØbkDs¡ßФH—pSÐ^åh!àÍ†ŽŸ`䦘`™¶¯ÅBF†pÂ7‡G†ß·‚'Á„76ÝèY¨6“ A„ë­Ã '­¿ÚoVÂO¯ý' „ž¾ãÓa'§ÿ÷]"$ŒµDO&5\“D|Õ™'¬§ù[ʪL�d¡©¯]´„qoÎF´_Û¡�'ÐgB:#Œù’3lÖ3 É$ ¨­ù SùäGÏäùáO¢ˆ¼xf¶UŠtÔD1 +¶K‹·â’œ3YŸOÑ(!‘óLŽˆñFd4m„ #ä¹äB'!:`dˆXaGDxѶöo5’ÐGÊ#q<¦yºtÈè�òÃ"3:#š"L«/ʲÎU‘œÐ!<HFÙüÀÎ .ë¿$ÃÛ\#uûð4 ¡ÖF¶°0�Œ#C4ÂÑñ²7‘Æ|Ѱ6K„ ��šI£a™œš64Ôþ°?ý0™=£ad6¸ó>0‚  4ÂFѹþŒ;I°‚ Î1:„ÒI´´ž!aŸØa&Ïʘ †ôÓ\&šO ›MT&ö×~Ï´ƒ~––“tØI†ˆâîˆ°Ò ¤é6“¥„ ãôƒ ¡i„“tI´5t­m¤ÚTŸÖÒÏI´›JÒum ÚªºM²Ô†!´˜u¥kÙãA6“ijÝ'VÒuLñ«rÏumq¤Û,è6mÀÏ5õïô¯oT�&ÒzmÃmm&éÒ¼RxWªÛ¾•½%h”*„“pV•¢qT¯®×zt›IÒ»Rµ”i¿ýÔR´‡mm/|k¥xªºïm%ÂoJéªiºÛ­ý¾ý'ô´©v¼4ÚÚc鯽‘ÄÒm¿û_hW×ÅÔ5®ÃöñÝZõöÜmoéÒ»R:#‰tÚ®GaRýÝ»]˜ÓÚ§ÿmÅýþ´?ô´-E[Ú}éíHánüzûi)+êG î†ú‘»ÐÚ aÕ;­Ð©-Ú_kÿ¯|w¼kðê½îèGé_§ÿ^ÿD:»úò 5_ý­ß#›´Mnÿ‘ŸXdÏùc‘�|®–Ãûª×‘Ì8{ðé¿únŒ?EׇªnòÆøÞðúÿÿþX—ÿ—U[ÿ`Òí?½¤�¶´?ãéø]¿}[Ò5½‡ÿþæoJ¶Waÿúû[ÿÿÿÿ×Òÿÿ­½†¿ÿký/ª_ú[àßÿû 0ÿa¯ÿì=¿ÿaÿmÿõöÿÿÿÿÿÿÿÿ°öÿîŽúí}ºÿþ½ÿÿÃa¿Ãÿá¼7ÿàßðÃÿðE�öÿÿýÿÿ[ÿÿÿðÞ ’óÿ¯Õ®é{¥ÿþÞÝÿþ †ÿ ÿÿƒx7ÿïü?þèàÿÿÿÿÿÿßÿýàöÿûkÕý»`•ýýíîÿõÛ†ÿÿýïoÕÝá½¾ÿô¿ ýúMÿÿOûï_õïº_®Ý{imþ�ÿûþÿí¯»º[Ýôûë¿¿ºï×÷Û_ÿþ¿½[ﻵÿ^�ÝýXq¼Sj“~ßÞÞymõý»÷ï¯þ§¶I§÷»ûëÿê—ïÿûé6C_ÿ¥�ýýúÿ¦ÔçÙ×ÕßÚ¶½ÿýiÈ~»Óvuó=e n½véú»|ç[nŽm~ßëç:Þ¿ïI×_ÛöþöíµÿW¯oÿýºööÉÖh¬ÚlÑ{~ÞÞÝ7õÚ¶Ù¢ëí.é×ýÕºlϺÒlÏnþ­ºê«ÙŸ}ÿª¶—ûôßÑûöÌýémíŸØg÷¯î­t¬õÕ„þÓÒiÛ=m‚Zl†9­íŸ^Ã=_êÚV–è+?¶Òºuô›…¶_í¸ZL0–•¤Ã 6nm;íÚW^­„²÷"ŽõºÛKµôÂMªö©ì$˜I†»`­¤©…Ò  ®ƒi6 §i¦itÅ4Å í¶(&›a0Å&ÃNM…°‚A¶�b˜…}¤A í&ÂAšm„¡¤ÅCJÒb˜¦Bm+"Žs´i&š 1LR ÓM´‚ ´�a4ÓmL �a¤ƒKA¦›“ a I²8L&!6G+N‘ð‚m&EÐ& ½¯viØX`·Ø^ÂAØa,m„*/¤� Ç(tA¦A ƒ;„�mŠ BFÆÂ!¢B Bdz‚b¡Æ#Qƒ!’Ô1AˆL�J++`˜EAÑð£¶G3[ BF†ŠÇ+ + z5ˆ&!#Ý!Ÿ¬dè‡ÊDD"3 B&G AˆA¡ 2‹q) ®&ËlDDe¹*m"#DÛ!Õþ-Š^­}´º×á°–—_mö—Øh,[ñ›‚aA“uD�nW9�a¿ÿ,ã a¢Ê#$ãµLìœvœÎÅ"S•Ò ij¿ؤ‚H��¤[š ªDAI Î �¨#;U3ÂÉ©J£Ã%º’ÌìH fC½?]úkï£`yUØ~Òj�¤’6?ÿæâÿ¤?½Þ“Hwô’@¬ _ÿzßW«z¾­mRT“fÅ6c•ÊÐÿ¥ÿå/é^“gi׎w¦v:U  ìŸßä®Çõûþ¾ê©%»k¯ÿëÿÿ×_LëÒF/l�D§R³µ¤GÈѸÖJI‘y9æ(�k,¡y¶k2éd„ˆÅ˹8ÎŒŽ2e¢%ˆ‘QOe†.üü– è*"P�a0É'D|&\­ ™òqH²8a“! +IƒT—Û‹Çã$h!&U àðAl2x¹„l8CÀ0�¢Aà3ƒ<`�Éü#@=„lh„óXa ‚0Ï÷è#ñèg%ÁÕ ƒ9.6‚Tl1Â4Â6F†¨ÙFèEØlŸ“óg¥ gÈûÒ$ó¸è>„hjØx+¨Øs°ÕBe�’6„~•raÏ̘°ŠçG$¿à�4Ô“�Ô[]+Txiäâ“m4“®“pÍž“rc¤ƒi:MÕr,5m &- †º ´¤Ú T›Al´ÚZ ·tŸih«uPÒMR°“ËBpˆ¶Ö=+H6Ë&E†¯ &õÕQXÙhM…“=Õ­-µtÎ[ˆP—¥«¤Úbé6â»ÒX].zVâ“ik»\¥hŒz^­ Èæºék…IÕþÒtšÿ°ëݦéCÕ¥n—tÖ“i^�6¯I_Ѝ¿ÞÒŽŠ†—^£º_ÿû¯¶•éÿûzßÚN“Úõ¯0–ôža-¤ëi;­%êšëþ6+nÕŠÚ]Z×Ý}m&÷om/×I¿´…´µÛØM×õén1¾­õú[õíñé6½oû¡¸Ç­¸Æ¼kô5èuÐýÃÓ½qR<´=o× kûNî’‘Âöûë¿{k¥÷»û��¢Ç×^;iøûëýcõü±Á:!ϯEŽF&´Xät[¨ü±Èç×áÐ{z ëÅqÿùcÅ[ûvë’Fý7ð÷K…ìcÿþ>­ÿÿÿ,n¿«kþ<´ý·Çñÿ_þß·£cÔûük÷ØiÃÿÿaúZ_×]/ÿn—×ÿݯÒý__ׯý†ptƒÑ!$ÝÕkÿ×ÿ¿°ÿ×ö~—·ëþx_ÿÿ_ýÿÿV×ÿÿÿÿÂ8ýðmi6p_µ<4ƒ~¸E÷¯ÿûðßÿøot Òè7àŒ?ÉÙó²»ÿü“¾ˆ{ôQ¿ÿþhÈï¯ÿÿÿÿ'ÿý±«þþ¿ø …þÒÿÿ¿ÿÿÁ¿>– ß„ ô Ä Ÿ¿ý-µ ~—ÿÿ O¯÷ÿÿÿá/¿ü?qý!ß»Ò÷mßþ¨§êÿïû·�Z^ý%ú^‚ÿúÐ_I~ÿýoKoÿïzûîÿKßÿo_±Uûëû�wÿ«w¿ý׿Z]>«øK×ßÛ]v_­R÷·¾«·ý¯oï÷ýß~×þ¾žô¿# ¾¾º·wÿ×ß]"…«úÿÿ÷ÿ¯ÿ×ÖÿW¯ÿ�íߺ«ï¿œýýw]þ¾£í¯®­Þ{ÿÛ®ÌýºõÒ*?¯õ]WoÛ¯]WÕ;^÷Wýÿo¾ë·W½vÉÕ÷ýzÒÛoÿ½·¯­'oÿ÷_n�-K­-~ïÓÛ?û¥îÕßßÖÙšÛ«_Ïß¶Û?n’¶=7Ã=6» ÿh˜Û›†m°ÏM÷ÛKZm+lúnîõdíÚ]¥­¶z[¯Û/]y�IºUÒµ´¤W ²÷""»Û +žÚL‹[‡Á¶žÁ°í-† +ȾÐLl6´ôؤإ ¤›±±Li†*Á¨¦)ŠÃÁÝ¥t¡ �ÒV %`˹a­·²#I;IU6)m$Ó ÅÐI±V“iô +ÐV”.!&Âh+ ÐlBM6Ò…nÓN°á<§a ¬B¦Ô0ݿӻa&Pía‚pÉÜ0L•Õ„ÓL ÁJÂl0ž™@a ¥;K 4 +¦4šØA†h$èº C Û a„OÛ2FÈÓ›¢°Aš˜AQXiQƒ0CŽÆÐˆˆbDAˆ@ЈÑD ;t �‹•û`¡ƒ":Îñ•äìDE („v�lb#E”Iˆô1›Äq]jµõú_Õ$«×é%ÛKËEF#;smØb6­ +£óˆ�ÿ,Ñx—P’‘iªÓ«,˜ŽFE£"°J‰±,d-Àó¹ÁJŸã²n ‘ÈØ@¨ñ +‚R`ERJÌ¦Ò =:Oén’Aa¯é6ý'›‹õ㤔&Éÿ¤pe±Hqãà ýE-·WI$Ÿ#¸ŠAö�BÛMãɸê¿È¤’W@Ã; ^vO;W¥ÓTí;õ}õõH] Ú¾ª“úü>ª8úéQ¿Øi‘E�ò7‘&ˆùO�<ê”ך¢)©I—ÉyÇl”(ìâ'DÈdH#H��šä¥•C:™Žî)ò:)äÈh¿ÑìªFÌù�1¢!¦È†)@¤�i%ýHìÑ©�œ"¨‰<Ã/ÏPŒ Pd80È‹a”L ‹¼œËÄUfD$äx FòF`Ï& “) †H“iwØFÈFÆÆxÌð�a„l<ÍnˆDôÈ(r¬ô(™ðô4è»63ì#@0�’3@Éââ�ó‘# BÏCØ4Bz Âü2=„k6ä§A Ñ¬=pš6����URÛð�Õ0Œ8dl�³ùýS U(I°ªGá7Bé6“zÚi§£s +ÉsÕ½4˜hŽïÛMI´Óó�I°›'äè›å;&Ú¤›I†…„gjšMª)Ú·a7Iû>Á+A>èŽ!è&,Áh óA6“i7›$¿|PL áv’´Ý­-G5h$ÚáézM…Lñ²Ð›¦—]–zM N·]ö–•ô©:Ú�—N‚´»¥aE´›v’mDø7³Æ¬4ÄiŸrϯm-EÝa¶“{ÖººZAv—]´­ÓM»­Óþ“¤ûö¢º^—î믆’wÒ}ºuáî–¶þ“¥ÿuµým·I¯I¥½Û¦Ò~Öýñÿ¿ßÕþ›[ÅoÝkúÿé*âéu´)i‘Òô5êG +í|Z^5ïÛ_ûÕãéÔPïâ½~ µ¨·¨«»^ßtêG Oߺ÷ûN·ÿǶ––ý6Ó÷û_ûúÚ×ÿ¾‹{Cú¿«il>ëEŽE;^¥ŽGGÚÈáWÿÝ-*«ÿuß÷ûÿÿëÿE¹*‹rJ6— õÿt’´±_å�ÇñÿÇõú¿ÿo×ǯÆø×éíê¿ÿMúCü?ÒƒÿÕ¿üX›?õöïöý½»¯ô�/lÏûÔçýÚ_û¥ß°ÖÒažÛ­ÒÌm¥¯Ø%oÈ®·a+I†r‘\;a‚úåë 0Ó‘\<½¶‚Oû[I4˜Ø­C +i{lòonÛÕ³é¦Ïn–½¤ÚIì0’®^º´Õ6µì„¦›i'"ãV)µb�$ô Šn“µ Å-' ¶«Ã MˆI¦ƒbÚ …± 6Ò»n�ÛPé<2 è0©6)„Ù¡›"Ž˜=‘Å‘G+Úl…"Æi&ƒOA6’i±  ˆM¥§i†6ÐL�«i&ÂNÚƒH0ƒ $ЄÂlކSåGÁJ‡ÛMO m„Ⱥ„ÓH÷)Dò=è†hô™Àа§²Ž!ñleaÜ1rµA˜¸B Áb!{ ‡Ú„ž†&!"«£Û¤b«Ecˆz*á¦GE+™1”GiІ#ZYÄ0ɱF"")2(B"4æZb"#B"1ìQ–2Ò-I8…{Kú¯á°—K®–›A[KI†]um&ÒRæ˜%„˜a&F9ÇCצD\Tc ÐN„ghA¡�ÿË?¢n �Eq#;Eò*ŒdIÌ“æF¹n¢+$ƒ2W(S±QI’–#; +CʠΤ~+¢�¥aBåQ˜z>Ê´¸((F°Ê¹IÂ.`Â.aáºÛ’rzè ݘn“ºªM‘A7B‚t{¥†þï¤Þ“x$ù[Ï3ƒ…“s�VÕ' ?}0ýWîén¶‘ÓœgJð“¤?™vñíKÌ’gsȲÕõÎçõ�ëh'j©+÷\WÕ[ÿªþºþ“ÿ¾·¥TŠvŽó±Ь§Êª‡×R¶”Ô—ÿÈ©”ú�Q*YH‡—ˆ®G³Œ�$Eù¶uGCª­õÈ„ä†âEêK¢u˜Ñ‘ýõ*:ñ G�æóÆp@ˆJƒ'FpeGžH2‘’¥šEó³Xè4òYL†DA”ú"h:P4BxPh„ɱßeÆz6ŽšÑ¶ÖÉ'd'„a“æÆ ³C1¤lá™°�`ô™ª=o@Õ”_ÉhFÕÔôaÁ“ɧԟ“ñ „;¬Ÿ»gåFÀÐ'b©®‚ÂÙ¸#XfˆÏA™³3†ižÉ:P‚l§ÎFÅ�E †ð2ˆ ͧôÙ9“9°=ôÉóý¥ØÝ´“M&A·VÔ&“#ê};é7™µ³þË<#CVtë�´!iÿ“8ÐA´GdxÒWy~ ½Ò ›A‘Í&ÒmÚVå¡6‰ðg�;é¦íùíÒ†¡zÂNWH;-$Ô+a[V£ÛWe a·I¶YÓ²Ï34­¸Rý´Ô: +é6—,éÓ>Õ­&Õ_têê=ºWðá×öèœ%´/÷ÛÿßIÒt›Ç¬_÷mFé:Ûnû«j“«¥ é, ·Ú¥•¥¤ÝºŽ‰ÇÒõu¶ %M¾Åm.“N¿Õiu‹êÖÚ_ÓªûmïÿŠM´ïÿN©ö¿´â¯ºúÛµÛÓý1Iº_n¿oÇÕÒz÷QÝ&¿õØ÷è4ã Ž"�[M«ù*ߨýw¿zY2ÿýÿÿþÐ÷íÔZ«¿½ÞÿÓÿï]ª¸J´‡ô�V…mÞðþ£ß¾CÛíµ‡¡Ö?÷¯ß×�¨øpÿÿ«oÿûËÎp›¯¯á¶”>Zü7á«z÷�ˆëíþ+Oðÿþê"ŒáïÒ47—Wÿüj¯¬?á{mÿÿ_þÿâ;¯®­°}Aÿì>ÃÿØuõÃI‡ÿŽ•wì?ô¶úAþÕ ß^¿ÒÖÃÿöé{¾¦eÿÿùP?÷¯ÿý¶öÿöaÿì?ýƒÝÎ*Õaÿûêð¾ôxT›××Û_Øú°ÿÿü/ÿÿÿþ½ ¿ü0üÿÃ}¿ý¿ý½úöÇÿöÿü7þ“þ¯þÃýëðßþàßû{÷ÿ_ÿ¶/ÿ{ÿ‡Ô7ÿƒðßþÿÃ}�ÿ˜_ÿƒþÿWmFŸ¿'øh.ìÿ"7ýÿøÿÿÿÿÿøm± ÿíÔ7ÿ†ÿ¼?a.ÿ¿ðßÿ†ÿëþ•ÿÒýƒýÿô·ÿ½w÷_¿÷Õ÷ûޞ߿߇ÿÃßø{ ¯û½º÷ÿ½ÿ¿ø½é~�_wûõßöߪëºþ¿lê¬éÿÝW¿jïÿî·ÿ߯ß#7K¿íß_÷ß÷þŸûý}.÷÷õ_ýÈ~N¾×ÝÕÿé¿ûÞŽu“ímþsÿýçëÞsÛ¦ýýû·üçþ·™ÿ÷u®ë¶Þ¿§·dúëç?öïÕ$ž½}ºýµmmm/oµ×^Û3ÿnªÿûÛ­½öÒ½oý¶Û¯ëý¿¯ÛtºjélÏnõöAþÙøäý^ßÿV»aµ´’I´•¸_¥øn›ûÒaœ––Û=[¥tí¥˜Û vºKëöþµ¶õ«>•´í»þϦô¾Ò½½³ý—M¤Þ­·V–Ú[`“g¼ŽäWööKíXvfåí‡i2.Sa˜›IU$ž­´“L0ÒOM†0ÂLŽ0Òb�cjÅà ÚTØIŠb“M8iVÒM4îí&ÐJÈAö“!û°Øl3œ‹Ö”2 é†q6’iºÈ¸ÙvÆÇiAöÈDì%iPmƒ Bb˜„Ó¦�«¶Û«v)m¶˜i0“MˆA´Ah ÛH'vTðÄ ÄMJ±0­S + Bdz؄ )VÑðª6)+i.›mÝ[ m ÐL'N�+Ãm�‡ —`ÐL+aPa4à 4"ò*-!"°¢¡0šHð牬Ñ\Q§+xˆˆ`É";é$¡¼•ñ!ˆf*)t“²^©XU•…"v"H«†VëDÆv7Òó!tâ"-–ôf¦Y$¥¸š¥{ ‚ÒúÐlEB +’éS1Q/Jñ +‚¨VÒH`’L2:# ‚¯ƒ‹ZaÄþ[K ì+-èå~E�;‹uFeŒ&ÉWöu²d̉"¿¥] �4›‹Ÿ�çãz…"²ô×¥ƒ.{Åo»¨¿~öš~·ÎÊVd.…ünû´W^[—ü˜Ò^á×ó"~vUã~¾ºêÈÌ~¿¯ùØDJ0E=Mhº&jÎ¨Žˆ¼i§œf³"DKÅ9#D@dÁ“A§’±š‹þžd—D—'ަ�‘¡©%�ft‘!ŠS™ó;2#ƒ?<"D¸¤2#å^Q‚—‰Þ-Q 0†Ì ÆPŒ!:ÍY?<@ä&P`�l"àF0�ašEÉ.ÔÏøb èöóQ`‹¶gþPDù´UÄa ÔÂ!2lˆyd8Œ”׿H5D ò—GŠk¤ØxJa‹júZ]:ÚZN“ÔBé¦þÇÛJÿ´ŸJÚ“Ðj¶÷Ýýµº½µ¶¤þ“tÞ;ÆÚ¥tßÒmúJßJÑ(OºV“®“ºõÕJ){tÞmºV½-ûW]ôž«ºiÞ¿_o_õK}º½\t¼kÿR8Uzxú÷÷ïKøÚò=_mÿ×hzhU=­/m_Uî¶{â–êû¿ê«×ºê)6ÿ»ýû©/Ú…ý-ÝHám§þŸÖöÑc‘OÕº{ù}éJ|RÝé*·Y/úáR¶¿Õ^ëwÛkm´�ëƱþºÿÿø{&áâºïÞÎ9Ñ×ÿý!ÿÇWzþ ´·me§ùdk{\uY$–9JéO>?÷Ô¡˜cÿëÃÿ]/_õWÿÿaû¤?«ûÝ!§ÿÿ§ÿÿý†Xõ_ïoé.¨Ò_ëÇaûÿ»ÿþ¿ëÿùÁÿì?ÿa¯ëÿÿÿÿûÿÿá±Û_þ»zí¯ÿÿþëÖÚþýmÿ¯ùàÓ_ÿÿÿðßÿ†ÿÿÿÿÿÿÿ:ÿÿ†ÿ¿ÿè§ÿÿÿý×á†ÃÿÿÿÃÿæ‰ÿÿßüÿðnÿÿ¿¿ÿþÿð“ÿø}ëÿûjõ¶—ÿÿ�Óûh.ðáÿûïüÓÿÅ_ÿÿÿ÷þü?~ÿÿ¯ÿ÷®¾—÷û|ÿý+[ÿþÿÂþãøm/ÿÕïý/»Â_ßÿÿûý~ïïuÓÿÿþïõ~¿×¿WÿnŸëaßÿ÷×í~ëªëú·þ¾ïëïÛkÿþÿ¿÷®·ï_ÿÝ×úþëç“Y>ïÿÖ)†ÞÿïÛëø%Þé}u·I?þ½úÿ{}ýç?Ò»Î{¿½tþÚÿþîºMÿíתÿ÷¦¿¿ûÛ½WÕ[ο®ê“zûm¯ûíºÿÿõûfõ ÏoÛ]+3_×ýý™ö•¤Ùÿû]+ú=k¶zÿÚîÛ·™ÿ·ÙšnÿÙKVº]}wÿ÷gû»_m;?¶‚ÿÕ¿¦Ëö‚m&ÿl% ì¼Ú +é†M´“]8d}5a‚A´“pØr/[ISa¥„V˜¤Ö»×MÓg¾ìÂöÏ­µlõÛØ>Ï«m)ô´“m$­5ӆò:b˜ì0ôØÃÚI…M4Óaö±Vb˜=†�bdWQ ´°�b�i¶’i§mÚaˆM¥h&m4Òm‘Ò +ÖÂ\P†ÝBm šÙ +EŠ;� ²¦Å1LnšÚaƒ§iAzVM†@ƒTÓOwl4+NÒi²8A Å-Áå]/£CºhŽ…¤UˆA…Ðl ˜MBh1 @ƒ Í�†*U¹XVr|$r“”.P਼vUƒ DDpìÞ톻 ì0“ a5‡‚/£Ã5*¦T&)¡¢:#ŽU°Ä)Y•ÅjVÐRtdM–Ah·¤"3!l®k‡rÍ2¾“ÿéúéêëþ.’éÃÁ ½> ‹²€Â F(ý èˆÿùM”)f…™)ÌŒŠä‘7'Ë|ŽÊbÎò;(‚‚™�~dk�˜ÔÈ$W¹Vd§…%õU3”ÎGŽƒIôï_yؼŸߤ5ÐþþîwP§ˆ†ï»OO«Òí{CäËýÂ4ßwÿúìr­gjˆG;(FSò'÷M´“ÄqïÈÇ‘¿U×U××t›ý~¿§®š�¬×‘ó¼#©kœ�ej:Cÿ%«;ZD|ÖÓ#e§G³Ydv¤{8É+>gQ¦IŒˆ2 �Hؤm™�”#"� „¡�¹ÈøPÏY�R³Ás5°FÁ¢¨F†¾²Jd6H2¬È<–f¢ÎE Ï¢„m"ód}„¤¸ÁNGQs6H„pˆyx�æÈàÁX0F€Ñ™c†ˆEd&B­�‚èqáHÏd&h4{ “9Ía”a9“ó�f‘ì#c*äÂ=¼#`d$úKÁ�Ï"P�Á ˜Ø83ISI´�ðE» ÛÞ”Ÿ6F³{a‚5†h‚4(Â@�F°ÁÁ„\ÂQ„lr>g³ØFͧ#ùWæ�F¶­„{f’„³94ÂL�D(MIô7É�°� &ÂɃ&z+JÑB4BA¶Z( ØML%KJÐMª«É¡6ªèÆ“lµI´œ;ª Žh+KfCt®Ûúh3G¤ § +“i„giÓ¤Þ­ªL6˜IZO¢±µKª Ò «¡ µLñ¤è3„y¤ÚM³&ÙcHm´«¾-Õ ˜m¤ÛªÞ-½IÒµmA¤¶’µÆtß½iÓ­ïíöO½j|×JéÒuAÓl*ºZOxT·i&Ò|[zIÒÅ--½:î­SN•ã¥Zß÷®×÷é7»jé~•ã_þúÛ⪿ô*G +—Ö™"¶Ãë·ºÚŠŽ·Oãé{zª¥Õú^šMWŠïO_ÞÝûº‘¿[¯´é>þ×ÿªûþ†÷ºûHuû¼kûÇ\?»â Šw«»¾–£[©+zÿ»uï¨û®ï®Óéw¯ÿÿþ?÷º·ý:ø«n?!Ôaý7òêÿèº×ú,Vá‡ú¶²8[·«}á�^ÿÖ�/·ªü:¯ÿÿx}7õ¨ÿé~¿×í¯ZUþ‹ÃÿúÿÿÿÖÃÿl=áëúBÚã_·UÛÿÿÿ[aÿÿ_ÿý?ÿõÿúþÿÿÿÿñ†ÿúL8~ÿ°×ÿé/"©~¿°ÕýºÿØzÿÿÿÿþî¿þ¿íÿÿÿÿÿ¦ßöÿØÿ¯çÃO~¿aÿÿºÿá¿ÿÿÿÿÿþÿÿλþÿÿÿÿÿŸï¿ü6 ÿøl“Oÿ·_×·þ’ûëÿh/ü?ÿÿÿÿÿéwÿ„øÿ¿ÿïÿ­ÿþ7ÿàáÿ[¼Jü7„ÿí„ ÿ ïýwÿßúýþÃþï×í_î¿ÿûÿí[öÿØmÿý´¿ûÿl{KïþþÝ?uþÿûþÿõÿïÖ—¾ÿÿmÿïïç•yÿ»î¿º]ÿÃÖþ�×ßýÕýï¯ïû¯u÷ï¶×þóË÷Kßÿíÿoõ»¿uÿïû}ßÖß÷ýÿ¯ïG?zÿþý¿Ý~ëý½·¯NÛ×öÿ²tßwí™÷Ÿ¯V×ëm.½�Vc÷ÿ9µ­ÿ»oÚ½ùïo]ÿïû]+m{½³5ßö}u{®¾ÞÙþÒíöÏ_ZÚWl0I½µí°“kyzö¹nÕCkºÛºë´—ô¯oöÌ×mß +›»é³ý¶]l4þÙW÷¦ë1Ü/1ûa}²þ›atÓt¤^m “ÚMŽ(6’vÛ#˜«´–ÃiA¦Å2+äX¦b˜ö!Ób“M´ ´º[g–––éj·Ä 溰´ÙÄÃívõ´˜í†›i¦Úa5a„¤ÅÂAÅ&b“8v›�¨a„JÃI4ôÙC ´ý0•²>‚µ „š°Âkj–xa„;»R¸£°Á#Õl2Z°Ä-¤›!=¥t˜m$Ði¶”•à 4b€z;²æÓI°a Át›#…ié§Øb™ ІÂGŠ40aNì#[ Vec(‰N!ˆB!ˆF¼FRX¢6ŽÀ³"ìì£2 + á VlXbŠ·§‡*äÂb˜A Â•{dè0„A¡Å(ˆ†2°„DEÁ�h›|ÒUW2Ä|GøÒO¥ôë^½cé×à°Â é¤Ô³öžW>#•lF#ÿÈ:"2ÖEÙª+‡�„ -JA@ÁLº +2Ñ�^H· +GbyFwTWÎà•,#ÃñS±Úª÷$‹t‚Œ ¤+ +Lã"òúi4­~ïúI +?Öé§ñ¡w~•MëÝß§ö•qßÈ’IVí~#øù%ü‚§IJ⪱ÎÅÿýÿ¤’�úþª¹&³¦žr5¬†ˆ#ä Ì— ³È"¹9)QR_ÎÑä&S¢>k‰ INI%¨Ìò�È�)Ø)©QÙ$‰dN&9ê,‚&HˆdxŒÍ‘Á“ÆË'²>NŽH„Ò2y—CÁ?+çƒæ 0f™ƒLÜ\Â5‡Éù.ŸÂ>2y:Iˆ¨ÉDã# ÔD»:ŠNŽ"LŠ :¢tH"�eùÌé“’¤dÁ‚°ÉàÚ˜‰ È�O#Xy&3æà<ù²g6‡¸FèAgˆÎ?lhg˜A´~j¨ ͧé£`as9 MBzBØIý!éª|ŸªIÓ µtpòh¤D[z¬#CG°eh2x&¬2ˆ Â64 B6rr�I”A„{û%ð�mærNL4˜jÔ&O<$›Ú„“{ºM¤IêÚ¥I´›IÒm—Bèjì³ÌÚ ºl*%Áž4Ï‚¿fÒÔ: ßi-]+QI½é«p]N4´ƒa ØDXh¬aQà4 a¤Ú£Ûe¡7Öˆ¶¤êß´ÒN–©Z ÐM¢]e�³íCÒMîêþéZÒZ·Ò¥¥j*ÛºÚ¿ëj=n­ëj>ÿ†—Þ¿Õ¿÷Jöú p‚Òn ‡âI¸'JÓwQÞ ›T�/ô½]Rë^›Úot’öé/}oI]t‡[JýUÇÝWwk 7©-ÿ[Š[nµ´¦Å¿ÿ÷kÑ£Kß¾›wWßÚÿl]Ý^¿oKKzÔ`Èâ¿÷ÝGë_ñÚZ‘ÂÝ:©-íüm?Ýßûüzþñø9“´›ÿu¿«ii +M´ÿkmh{÷çÕ_Bÿõ_õª{»¸®øÿ¢Ç#£þF×#˜kú&9UE“ÿ½!‡ÿ®ß^‹HÿúÿÚZÿûÓú ‡ü?÷uÛQ×qêZ÷°rÓî—ü`סmuHXuýþÃ÷öëþš¯Ãÿëßûׯÿ÷òÆ~Ú_×ý-~µþûׯþÃõëöÿÿì?ÿöÿ퇯Ãÿÿýzßý×ÿöŽÿÿ¯ëÿþþÝ/øo÷_Ûÿÿðßÿø7ù;#ßàŠ†¤�üÿÿÿºÿÿÿá½ÿÁ¶�Gø#ÿÿ¿Ò!²÷ø7ýÓùPWÿÿƒ¯ÿáÿû¯AûÿßÿÿÿÿÿÁ¾ÿÁþ¡ÿ„ ÿÿ»ß@¿÷û×íÿÿûoÿ®Ûý/ûÝRû×ÿ¯üêïÿÿÿ÷ÿíûÐK¿K»ÿ¬?ÿöýØ®ÝõûÿßÿýÿKïþõö÷õÿÞ¾ÿoaëëü4¿×ÿõÉ ¿×þÞû­íÞ½ÿÝÿõÛÿ}ÚþÊ…ºÿö»õíÿõµÿ÷þ»_ÿ¿]ïþ´®÷Uÿw÷ï:®×ïþÈOÿëΟþ½ÿ®ëW]Ýï_zÞëþŸöÿ4Úß]ÿÝUÿí¿ÿI¶ÿûVÎ�7·«m“«§¯oý³?¯ý-·«û½½û¾ý´�/þÒÔý¿·_ô®¿ÿÿ®õÿïõo4ÿÒÕÛ?oÿ¶gé^Ùê¶Ïí‚ZM¤ªÙÇm—½´›Kõ´­³•¥˜ÖäQÚmôò(í6%{i&ÈA싌6’i÷KmºÿÝ/až¾ÛHôµil3ë«ã†Ú|Šá¶za‚^Ù~ÒMm°’u ‡l[i1lSìlUí¤ƒ†Ä œBL&ÅZI¦šzA6*Ò`ÓNÛÕA=†!Ydt’°[ +ì ­{t¬3si&Ÿa&ÒM6)4ä\¥ÛÚI±Ãa¦›¶;†)ˆH4â­ši± +÷täwa6�d¡„Ã0™…… +iÞLP„kh}ŽˆãG¸0™jV…cEdÕ�ò5 bÃÎá!¶‚6)°‚MSÐM “L0•64°ƒªA(0šk@‹ý4+ vƒHùVØPˆðˆˆ0GTv”e�$YI†á’N~dM†!¹AƒkEa0b=‹!ìÊæJ\%ÿô—ÿ×è¯ëKþº¥®ÂáiB© é ƒEÛ Ü'I#ó™erhDF#ÿòÍ[2NÁ3±ò±×¬ÅR2@�´ÁB©Ø†Ò +ƒß®ÿþ�½ß}÷iOµŽ[«Y¿’Õ�âÇ ò®Ÿõ×õÕë§�š­5Èh�•5Å; DAäQ”†x΂ƈ‰ÈÐD¨‰“dC�‰Ñó#YV.P3<Ü_9Ìy¸Þˆ�6GÑ#(™625£lùÁ�&G´D¦�°ÁÍ4 °ô<Ã[1ѠΑže<A£[øÔ#XaW „lxgŒ#@3L¸.y„|áb˜¦+b�µÂlœÁÏ�Âa#úi A³T_ÉþL~“«i„xiZj“->ˆí¢;aÚA´œ36eË<ù¤Ý¦’mðšIô˜m0šÃM2ÐÏ·m'e�Ÿa+29¤ØU|+2#¥ j- ­2íka@­n“xêßî•Þ«D�zŽ“{×Óí¾£[ ¤½G÷Òu½×¦©Û_v�ÖÓÒ·_ëн~îß¶¿ýþ¶ã«ßÿ‘Í_RáW÷únýÿxýVúÝ-ý}uýô꺑Â÷¿è±ü{éWôôïÿzßü‡j*6£íðúvõõÿïúÙC˜fÿ�ÐþÚÿúì>¿ô[Q/¯Òaë}ÖÝìÿB;ÿ¥õúëÿ÷aûÿ÷_n˜·¯ÿûÿ]‡ÿ¯þÚ¶—ÿûÿÿtãÿoýïÛKÿ ÿþ ÿÿþð¿ÿüÿÿ¨%ú@Ýûjõzÿáÿÿ ÿ÷ÿ¶–—ÿøoÿþú ßoý-w¯ü7ÿÞÿÿ~°ÿÿWíïb—Ãôôü:¨ûÿï¿þïïÂÿß}ëýì:÷ûXmÿþÿß{ÿ½ßÞÿº8¾×þúþF'Þ¿ï7÷íïœ_þÛûÿû¥uo_íê×Ö»W?ßûuû}š}×ݯfÙõrEoýµëm%¿l÷}÷m+zë«Ì~ߥ˜õ³Ú°Á/K¼½—öƒa‚Zl0»mziÚm ­XdtÚW¦ÅjkV©¶Mh7¶)4ä îÕŠM0Å Ã�¤šlBb“ B BMC“oM4Õl6�2)Øl"‡i0¡…v�± c½ØIÛLBa Eôxa„��Áˆ•mm¦> �…)'Ô‘éÎÖØŠ–µq0DiÓ“p{ÐŽ„WI×ú×Z«Òé$ét‚Œ4%‚²ëÑ7+~šˆÿþvf‰Z5ÅV"…"& +—AQÇÔýúxH=íÝíè}N¼&Ä¿ÿÿþ¤Ú¤GI�è²]šŒ�ÈÑet%ͲL³g"zèGB’ÖKB2r«,s ˆAVKÐx#Ð˜æ «# #™¦`h‰æ€à–øcšÃhi˜0���a„lè> 2þƒSÐL#`a á?'Bì38&�`Í‘ö&?4ÓFªaši¥jƒÐOIO´�&é´0“¤ÚO„{ªA�ÖäÏT› ;¼&Ѱ‚z¤�&Ðg8Lñ¤Ú á¤ÚgÛ1íÒuô­-|-&Ò{mVî¡Ò´·u¸N“½$êÚ +¯m&éÿoÆ—IŠM/M.–—^“Óøý?¥Ó®ÞºVîí7Ý:¦ÿuwÔkqWR8_Ýûý¥#…_Ðß¡ê‡~·ußB«ï_t?_¿ÿÿ!æ¿�ç몭¿÷Mü´ÿ†Y‚3ºË­°këÐ×ÿÿ¢êÿ0Ï·]ïÿþÃ&ÕGÙØÄ~4G¢%™QΙöifÑP’’ß_¿ýþ¼óÿý~¾¿ÿÿÿa±�h¨Ì2 �ŠŠAÆŸÓï°õÿÿÛ_Aÿÿþéÿÿÿ†Ã#Ø@Áo†-¯èÈ�ÿÿ÷Aÿÿýÿÿÿÿàí+T»Oô_ü7¥ÿû /ÿïï¿þ¿ÿÛëJ«Ò­,ì6×÷Òý{ÿˆ_÷ÿ°ÿÿî¿ýëéôº¬%ã¾Þ×ïý?÷ßï·¯õ×ï÷QÔWÒ’þq;¯¿wþ—ýÿß»·kÿO^ßæ�}Wú v¿ß÷¶ÿéÿ¶ßjß·ï_êÚûfÞ§=´µÒ#~¤o�åGÔ½ �˜.JmýÓzííŸÛÿd1ÿìþÚöÙÿáž©†zm%µ´p–ìüŽÛJÒ"ˆ¤="xÖ†F¡‘"/Äæk¤hÍ@„�N‚$L:334$MÃ'gŒœDD 3C»d3;¤Ã7H®öD{ cÓMµMSb¡‚8ö6)4ÃáŠm$Õ;I°’ 0ÅlB†—”æ38¬? +v‚4vCL"qo +;AEóIØTÂ;ÔûO¼aGÆÚ£°a=8i)‚ ­Šdq ¦žvƒLA‡²Vƒ ; * b49NÑXâdÈ*(øU#CG¶Ð1 +°«i7¤é6M„_B£;A>’ N• ­RmB=WPA>ª¸ ¾¾µéW +¾¿]|ŽM¶µüDDz¤¢—ªUJ«¥ZÕ*!¥éRý%‹mÖ•tµJLYÕW%]tPê’Ö+V¤ÓÿÖ©%ûm}Rë× T#º¯ ¿Ò)ô¸#�úʪׯ~´«õKÕi+é,-%ÒªªKõnµT«T·|ÚõÍ®HZ׿úKúÕ#‹­%6¼ß¤‘µ”}kÕy½*ò|Þæ7UÒÒZJ‘¾’ÉÕ*ZIVi륥Yµ®•*ZZ¶–“k¥Ò¥¥Z§ßI=V—K­-zJÒÂZOZXIp––µIiii:]:J´—JÚ +êëKItºà–“iV–”U¥¥¤©R­„�®*ÂQM¥ÓjéUE*Ua'[X¦ÐU¼U„› T8¤› 6‚ŠŠX…ª¡D$¢› ÖÐ_ lU ¸P�.¨T&)ŠªaSØIªªjSP˜M ˜a.�UU„0A‘ Š„Ü(U¦ ‚zi„ A0˜BÕPÓM8�1 ˆ¡A!hÕ`„e¶h‡�,ÌK-ÐȬW*ÉÈc2.êBÑN�GcL*`™”ïèXUGŽDI®Xä;ÝÒi÷kwªûQÿ¬‚­uï^wEçe˜ù,È'–pT=Púëþ«òñÇÿ_]3R#êkD}<äS¢>#ò´ˆèׂ)åkgFUžTn*M2A†J¨f¼Ð~KHèŽ"L«.¹�’ú!&›D$Â"u(¶Ì †!/l¢|#x@ŒA¢"s@< d&s‡"yì"à2B?™ÈFÆO Â4?ÝoVÌÿÜ3=³=½�g×W[u×f{w¤È??lýëû ôÚZæ=t®óa,¼Ü)ê»`•„˜a6ÛNöÒMÒ´¶ &ºD‡¶8“MŠN0ÓM Å6’i±H40“±LBba&M6!SM0Å)ƒ [˜iÒM†”¨h�L& +dOv(m5w°ƒ»…*謢¬A4Âaš B|sÙÎ +R³VHL`œ¨  ’± +U°Ä!ΑNÄ0hç�¡ˆå¬hs"¼9–°ˆ¤ãE˜d/„qæSé>º“u4PˆÓ + +dU$éÖ¾¨›‚NËõH~’úÓ^îë[êÒIéÿì¥ ´6!_;KGb^v½lŠ:H2$¹]këªÁÅ ÁS®šéçb2)Q$">I™/”‡�†fв)Í&E%Pˆ�åB/©F_:dx¤"’ƤxÔˆÐʄɂ: “"Ñ *Ëò-%>l�lÎ#¢=‘òB6ÁGD|a„°aÃ$aKšÍB£Y°�‰q¬Ó4¡Ù¯?'Ò'@—¤Ñ 4höa`äèx'æ°Ññú #`e<ƒÐù9—J„kz¦OZBÃ4bÉsM6‚l(sðIµE[I´HBm¦ ´ ٲМ*"þšp“aÃ&ÕÂ";“¥ÓTi;,áœ4›Aœi7'Nz_g‰ ›­G4jõ…I´ÅÒa‡A[ºV‚wQX'Þt­ ÚN—'í­Ô:V¯Ó¥i6–Ó½:OïN­«H&–ñQÕ½´Ÿ_¥ÿý»¥¥­ö–¾ÞþÒö=~×ÿãõ·Šº[Škvõo÷©+j¤p¡§íÚ÷º¼ixÖíÿŠ‘ÂþêG ½½};UÇÛ«Ö¿ÁuÈÏûÿ×Z “¶£ïû\ŽaÿÁxÿÐÿzþèºÁÃêþ›ñmRàÿºÿ.®—ÿé ô‡ÿõ½ýÿØl?ÿôºÿaÿº×÷×ÿøþ¿ÿÿ¶—¶Ãÿÿõÿoû¯ÿë¿þÿÿ‚8ÿÿzðà ÿÿíÿàßûßÿÁÿÿƒÿù>ÿáÿÿixpoÿÿÒÿýëÿð�ÿmÿ~ÿÂ_ÿº ÃoßÿÛ÷ûÿ‡ÿ­¯ÿøÿKÿKÿÕ!íßëî·†ÿ¿ÿo¿Òõÿwýýý~¶é/s ÷_uï¿É×ü²•\]¿îÝ7ýÙÕßÿúþ–ë{gN¿ºû­·oõÿšEV"ƒgk[}º·®·k¶N®¿oõ»[þ׺�J[3õ´·_t»?öz^Í®¿©h¨Ó�ÃÝm[3í&Ï÷z îÛ´›öÏ_o›W}„qÃøIºL4Û®ºVÐIí¤¬SAŠ´ä[i*iÿV”wö-Šn ½&Eá¦Å_"ãMŠÂvÃd~4ìtð°ÃiZlBm(a$ÛI4Øh$aS 4Ú` +ïþ�¥ô˜dn˜@Ú± +žÈøJ%tØLŠ ˜L0‚Úi¦O<6š• �S$èÍ0aIú“ «ˆb‘_;­!(Døâ  ˆÔB+C®5¤äØ7ÇRlgøŽ":¿õòaDDÿKþD‘O’Ü–ç`YFK25¢:#æ½2Afˆƒ ',T«%Äô#AB(ð–f¹��Ä'Ì31 4"?ö—0EYfdvPÌÆ3ˆÄˆr°–€Í²ùä_%Ù“²ñ#Dx ž02n$a[4Ñœk #Y©öœdšh0�mÈüØä[ i„nª„nhÖÑûýt>¬�­ÆrM Bñ0ff�Í0˜FÀØâ‚ÚÃTÂ<4-&Õl ›L#;—zmÃe—Z"ÃUGˆG¶“¤é6a0¡œ4¬!¤ÚZ·í °Î0©>fæ8ÐM œ;¥h3†“´ÒM¤Úg‰Ñ?i6˜¶•¨·Š´­êðN©°Ýui+ß„é\�ÒÒ|{dv°›Ö¿“ŠÚ¿¥té;é4­í>ÚWýîø¤Û¥ïµéuû·ïøë^¡0l¤û~*µúôê=$)uîÚ¶Ó©#Šïßõµo´õ®¤p¿^¤p®†ý„6Œ{¿þÖG +¿äp¯íªí¿ï_ÄÚ·�ÿãÿ#v¿ÈÏ–9x1ÿþ²T_òHéu¯ÿïè´ÿ‡^¿ÿúCõéCÃÿÿô+úCþµ¿û­ÿûÿÿÕ¿mWýT7ýºóbÿÿþÝÿÿÿ°ÿúÿqî—£»¯ü‡·ÿ_ÿÿÿ×ýÿÿÿÿ*?ÿ í-¿_ûƒÛAxÿÿþýÿÿÿþð‚ÿKb +ô›þý,?öÂÿÿß÷^¿ÿ_þ÷é}ÿ¥Í¥ë÷]ÿÂûoÿîÿú¶¿¿ZÿþºO ‡íö«ÿ_÷ÿoÝîëþ¿ßý×UÿõU¿ÿoÎíîûÿºm×_W¯¿Í>ëÿÿûlÑßöÍ?'ZõÿÿlÏoöý·¾¾úm/lÏûéÕnÿþÁ6Aý¤ž×°Â[ ‘\;ÿ²ÿÛVÕ½†s]†rÃg¦Ò_Ò´“M†Ó²=i6‚»m5´Ði²PÛd/ÚÓA± ¨.Â[M;Ó†lBcdpØÓ0ÅSÚI¦¶A´“°Ä$Ób`�S wNÂýÓÛM‹I£<4��Á8h1 ý„‚vÂdojƒ¶ Ä${b4Gb¯4Èr+ŠÂ±ˆbÁ´�h•£±¬�ˆr׈Š:'bÑØ¦"#–æ›Ñgüí$wYÁ^ýkáB„x¯_]iIº,˜t“ýkÿIŧéim¤“½:ýÒÁv †Œ‚,ïEæ@Ÿá “¬1Bºê¿ „ÙS o_;JIFÙšÚÈV�lQ^Ë2ˆî„v‚)õ%¦FF²RR4ÈölŽ„Ff„¤v|S¢6ÌÆG@‚e�„�XåÌ„sÄ ðEÞÎ>0�,µ b:·Ð¯¯úëëÿKÛÿÿÿõõøú_꾿ë¯ÿÿúÿ¿ÿÿÿ ?ÿÿ°FàŒ?ü‡àŒÿø/þÚÿ×ëþA_áÿÿÿA~Oþ//þÑÿúÿÿÿ¿þ ÿ÷õá/Ð_¾—¥ýô¿¿×ïÿïô¿¾Ÿû·ÿt¿_ý}/ߥûûý¿ú_¿¿ïÞÚ÷ÿ¯úÿÿË0¶2¨—ûú÷_ýÿ×ÿ<¿ïþ½_×ýWVù ™jJßëþÿÿkû}û{{k·ÿ¯þ½ßÚ“(#ÇIõöÍ?ýëÿlÍwš;¿µ¾³kìõ¶Þ¶ÏV5¹òóvœŠá܈;öEú¯¨íû %{K¶•újà +¾cäAÝì0Š­¥i±I±I¶I±VlÓ Ââ§ M‚tÐlYý ðÛM6)SÓA¶’i¦š ŠA„ئØNš 0ö“l ˆé…i††L0Â(ua„ÓSÞ-4ÓÂ!í4�´Ò*ØGæ!»®­5<4Á„�U±žÊ; ’y«f˜`Ž”ðà ÄQXÑ\Ê1WCT‘EºD"#B2uù7ï¢n#-Aºú¯Öÿ-Ô‘ÔèÈ“#DEÙœu#©)@ÊÆlȨÑn¹ÈÔ<�E>9È„„PÈÊë'©¹ÀȨ"VÂ4ÉhD «# �3dˆN>Áà¦`Â6 î@Ñà0���Œ¤#æ¡°>¨„È@Ñ­èö øgdõžÓ»ad°Ÿ“9±ša0�lá„lhüÓ ¦¡4~i¦&Ô'î“ݤÚ#†� $ÚN“ Ý]¤Ü³të&>Ñí„xH6ÉðMI�ª ´»¤ØD[ié„“i6ƒ6höÓ•a¤ÃAœ4›Lûe�iXWJÐ(oéio ƒi6ãqÇJô›Þ�Cí¤û¥pV–úZÚ ·ÅÕÐOýéŠûK{M¥¤ë~ÂmoÖßo´’­>©î“úM$Û»í¥oª{ýn1µõ¯ûÓõ#…ÒnßÜTŽ¿CéEÚ}½Ðßì}-ñëD¾¿ëˆ/ÞÒþG?òýu­·þ×ùi×°þYGÿ–Qöÿþ‹(«ÿéü´þ›¥¯ýÿÿà×ÿUÿýÿÿíé¿ÿ×u×ÿÿÿü7ÿÿÿÿÿÿÑNóÂÿÿÿ×ÿÿÿøl�2;ÿÉ÷ÿÿÿÿí¯_ÿþ»kÿÿÿþAú_ÿÿïÿýµ¿ÿï«¿ÿÿÿtÿ„»ï^µÿßî—_ÿ¿ì?ÿÿûý×ïÿý_õþÚÅ1ûwýûï¥þ“×ÿºÿú÷·ÿiÛúj¿{ÿï¶õþ­}¿Í?öÿÕÿôž½ÿºÿ¶h¯µoÛvÞ¿µzû3_õ®Ùÿ_íÃ?·Ý6•ÿlÿ·[ûjßÛgÿlýMŸV—ý6–­­í—í)Þà '|6ÅHAÞM¤�†GÓØaSm'¤ÕŠ`ÁXØ¥MŠv0ÚIªxA6’i†)4â­(-Å&¶Ó†G0˜^�m$öšlBM°•:pÚdAì•ÃV¡…A Ú  Eýa„«4ƒ  +; bƒec )W•'EÐ@ƒ(pC‰«åc A$CB v(„BT¢l•ɢиåq&£åsš$Ê9 ºE}W‚3³˜r“`X"ü4õ®¿M$éáÞê?ô…GÒw륪¥DÜQ%Ž»Nüìk;)Õ!øZLõU_;tEú;Xå.zå))®#h×òLéÕ„K²¤!)@Ê}“#NXÀÏG¤B6GŠZ€¥‘ÞG#h e@¦£DEãÙDP{<2a’b ‘›#ƒ$f dDHÍ‘  �²ô‰DÊ„k ‘ Ññ™á!ašA<#Xdòac8A (L'Ö ¹Í€ÏÁæ˜MNƒÉñâplV��„]°��¨M5L&fl„P�Á ¯&c˜i„xi:¤è&Ðå¡ÐÒl4ÁS Î 㤓™?Óª6ˆí²Ä!a4m¦™hA´i6ˆí£Ýp�7tæ©i<´&ÒH6¢ÚáRÒ´N.•¢P’·I.˜MÒ·w Z­ WïK½iZN“p›m*÷«Tš÷[ûßIÿ&Ú´’ÿ­ÿµ­ï½õßííoµ´ïûºŠ_–ýþ¤p¯¯©+iVïãý!xß÷ªÞµÔR·÷ÿ}è}uo{uùþÛÈr_DŸ]ç»·¨úõ¥ÿÿõëòÅÿðúÒ¯DË×ü´ÿùiÿß·Z·«ÿÿÿ¯ÿìÿ¯Ó¯æÅÿÿûz_ÿÿÿÿÿÿøoÿÿð¿ýÿÿðÞH»_ÿÿÿÿ%ïÛÿoÿÿì#GóEÿÿöÌ} ·Kÿÿÿÿ ÿÿÿ÷û  ¿Ç¯ÿÿMª__ÿÿÿþ—ïþß}ýþ¨¥ßÿÿÿ^‚[n­×ÿÿûKîΫýÿzúÛV×ÿß~¬T?ý{ÿÿÿõ÷Û¯<Ÿ¾ý×Òµ_åq|›ÅI“ÅaÉòùƒÿÿuý龿ÿÿm}¶ÕÒõ­öýºÛ4I7¯ð«ª“Þßí~ý«m¯ÿ¶¿·­¶gœ›[õ´¶v³ïÒVÒ[°Œ8?æ™Ù\T_òì–C¶~ý³?lýí›[WÓfÓ¤ÙýÒ×_°E;OM†r‘\;#Í„¬6®’ߦÆ¥Ðl4¡²*Ä&”&�=wøM>Á„­S %± S‘A¯a¼°ÐAŠ  “M4ÓA°zi¦Å0�ˆLB Á ƒ ­X`Š%dp˜H6Âm„‚a„�×xF·ÿý-ðÄ švÅØWm;NûLp¢“žðÑ¡£ÛF{L)VÉùXÁ„Ѓ@Âh0h aƒˆˆÊÖd6†ÓMd«ÿüQ_•\ÈIELd·;�ˆÿñÇ^ºéå&VQˆùT—+ze#:5Îf¹2–Žõ�#Q¼ŽÈ±�1�55ä1|Üo3¼À¤‚#äK00@ÁXdŒÁž™›™R’èá¢$ÈÈ=’D�¢ €EÑ]¢!UƒD!2^O�A“æCì�AF°Éƒ  ¬2ñȹ#à g�“™íû zhØÐ°˜@›U¦úšI„£qç £ã?)ù6‚é«ý$Ú¦`«FxFŠL4Õ&Òb­ÂM¥»„¿i…ÙóA6‰`gšL0®m!ª ãe¡Z á¤êËEu²Ï3kl±»IaG6š °ÛIµt­ZWôŸ÷ÿ÷[§m'Úì¨&Ý+§QWUµÒ뤸Mj×íãõâ–—º_½~»×ÛŠ‘Â×ý»}ÕoÞ½×wýÝ/R8Uê¿úþ×§�}w�ニ×où-þ—û[õÖ­µÈÆ»Ž¿�ï_¢ð¦ô[Q-ßåŽFÝd¨ãíÐûjÿúCÿ^«úÿ�ÿÿúaÿBÃÿõ_¯ëöëÿ×Û¯ÿÿÿëì?öávé}ÿ×_ôPÿ×ÿÿÿÿá¿ðßá}A~Ý·Y×Üëÿÿÿÿá¿ðßá?A_ÿÝ¥ÿ¥û÷ÿÿþü?öôº¥ï_ÿt¡ÂÒïôðÿÿºïþý?ûþ¿¿ÿú×ÿ_Úýÿ×ÿ÷ïû¿é{J¾¾Ým„õïÕWÿïöëoÿùåÿgOÿïýÿ×ÿßÿÿöÌ×î»fý¿¿½³DÝkúÿï[f|†?ííöC¿s÷«iÿp“l%Uí³ÿz^am…Õ²ÿàŒ8v]=„aÃV»M´“a‚M§ †Ç!v-ýaØ„˜M0ØI6*�§Å&�Òq„Ø«¨¬'�ޝA馛a˜b¦ÖÈâÂÝÿð˜M„Œø"ù>„GG\0]m¦ì‹K +Ø&E\}¦šƒH¬•…RQ†!J¶D™f[†çbèDD# ¥FJþ‰¸¦d«3'o1b"ªù6”)ÑÇh¨„NÒê¡UB ÕÂ5¯U¸wQQH7Ý%ÿ­+‚V�$ïº�¨IÁé7VF9C…åOÿOUoFCp�kþ¹ +Gu¢Ôèu�Y¨ˆª# +"9©yVeC:2A�§Í,ÛÈ4Fd�b’ˆA„S�‰È¨"'%„h=’ÖGˆhá+�Cá)�žh [?„FÃÕ¿l=m¯ÿýXa¿ÿúßÃÿÿÿÿømÿðECR‰úÿÿ‚3Ãmÿÿäá¿ÿÿÿßÿúõ[ÿÿô ÿþé_„°ßÿÿÿ¯ÿ†Ý/ÛÝB\1ÿÿ„¶Ãßýx륽úû×ýz÷ûÿÜTRÿûÿ­ßß×a¿¥¿¿Ý¯þÝû¶—íUo,äŸ[ÿkœßoÿû¯Í[¿u¶õþ–¾ßæ�6—·¾¼è‹!\KbPÁL’ý{ýµ_1þ¿[ºê½]º[v¿é={fÞ§'…í™íwoD�ÂŽ© +¤›ÓºÛ4G»öÌþÛK¦Ìÿôº´»¶ÒaŸöÒ[=aÃ6)ãh�”a0ƒM�a’4 3�qa'&»|œÁ °�Á¥¦˜MðF†“i6�›4 Ù¦©0ÃÁ.©`½5@…ÂAŽí&Ô#»I†Ó áDpÑí¢+†“ ",4›DXrÐ�Pg Þè' +™ãfCt­-Ú µM½è:˧JN˜6“¾•Óh&¢si7é\ºê“¤ûéiZý?¶¶»¶íì%ÝU1¤ëáÒZ÷_Ò§Òin·wIöþ¿§Úý}5Ýþ¸ëiÚzm´ƒ§–â˜ü}/Ô¸Ju%›v¾ûkR8W~Ýô‡úЪ¿ÔíëéÑð1êG +¿êý7Uõîé?ð_Ûúþ¼±Îÿù`�½õmƒÄ�þ>ºª¿ÿߤ?°ÿýÿþ¿ÿ¾fïÕ~—ýú·ÿÿÿÿ_ÿÿÿýóbýÿÛÿÿÿÿÃÿÿÿÿ’™ÿÿ¿ÿÿÿ¥ÿÿÿþÿÿïÿÿ/ÿûÇÿÿû¯ÿõÿþ ÿÿÿÿÿ_þôÝÿ»þÿ‡ÿÿßÿÿþÿÿö¿]v©?÷ÿ¾Ýׯßûþûºÿý/]~’oý·ýû»ÝÓ¯ßäéÿo÷ÛÿÛ×®·Z¾»«}ºÿ÷^ßÚ×íö›~h›¿ïÛ3VúV–Ý-ÿÌÓ{íš'lÍ7_ºN—Ùõý¥ýŸöû¶[ýròì2祤›i.ŸØao²õ°ÍËl0Za…´­{I´“Ãi²-Ô*i†*àðÅ1A‘¦š ˆH4Ø…¾Vm„'kA Ø ÆÄ,1H0˜b Ø$A¦˜@›#¤a6w + ka„›»%a „ÂVå\0‘YEqH0†‹•ˆb¦j—GÆ��aN-B )VÉÐa`Á1 +Vec ÄT¬’ÄP„dØR- ZwÑØ¢; +e�^ɸ6d‘‘’ÞȪÿꪛß_÷þº_´îÓµÿÿ+�¬x%„Âez##Eú}=Pi¦·þL"dŠDGÈÄK2>tD~�CÓ£²ÔG^JQì‰eâ1ó¡4"„P†s|á�Ä?¸Ú1‚"ˆ a“°‚²ŒÁ‚L0A ޹Šd1’c?�#ù³##B$ +h462@¤¸†lŽˆñó#À†GÉódpyqsƒ>Ó ¢.A&Î�°aÃF¶ñšà�|#`aø&��‘ا¸j.‚©éÚOD'›Ü|#ä¡OÂ6gÆñÞš6�BèýFàÓ „âÿT¤ÃI´›A:OӲЛI»>ÐM´MS¤ÚM Èæ&Õòd&Ò·„ˆí®‚m'IäÎ ãI´�-]&Ó8GœÓ 0“臣¿åŽHÆ·+Uýí¯ÿRë ƒàõnÿצÛHX­¾ZpØ?Ò‡÷úß§]†ÃÛý‡û·j7þß_ÿØmÿ…a·_ÿ¯ÿá†Û°ÿ ÿè§à¡¿ðÃÿ·þà ?ð¡°ßÿíÿÿ†Ãx7ø7þÚ]#Ü7ýƒÿÿðpß^¢ ƒwÿýþ6¡ÿý[T°ßûÿÓÿ ‡ÿAnÿÿ¶¿ÚÞá÷ÞŸõn¢—÷ïV�®ÝÿµÝÿúï_ÞÝ÷í_Þ£i/¿¿Ú½^¾ïÞén÷þ¿ÖÝ^æ×œýèÔ¿µkU5m7í�>d”‰²]½Z¿[gU˜_÷ç<Ç·ÿ[þêÛgOºÿµ_Þ·ý[3]ÙûªaJã³°îöÒoKo««öͽušëú^‚³4ÙÿKKéÞºöÒêÁpî¬=°•ó½0µ­ºVzJïì÷ik˜Z¶Eë{ %iö‚N­$Û Ã +Çk÷iHæÒ†�M6Òkb¶�b“L1 ´©þì‹í&);ÂI±ßtÆ�±Pž6�bi§i&øI6V! ƒAA„°aÐ` ‘fU¹á†!´ì�PS»E\0ƒÝÚi„ÚA„;$à ‘fE.´Ø&�‘N(0‘VådŸEY#ŸD)XÁˆ"!0Á† çsEpPÞœ·SE)e¾b!†‚Hˆ`�‚;Ã+aòÙ �š£²ßUÔG-Ö?k­åu[ H�’÷]HòO;«;Õâ*‹ä‘¦t"dÙEÆQœ2Fl�lÑFlÚ8E>lŽ a‚#¼ÔÏ™ hˆ\ D'L ¨–� ��³3#Á[!Æ ¬Ã3f™ƒ{D™­­ Â6­¨MlžL%áI„ÂaÛŸ’mBÍ0A¦nÔü±¦Ÿ¦ºE ˜Mši M„aØA7骷,„“8gM¥iž4Á´5mÚTÎ ãI墓h—pK¢8„{p›e¢“ pÙh á¤Ã œÆ“h29 ›­+Iú‡Kt­¨M¥ijÚ¶‰E&Ý%¦›÷]ºmW L6Õô’n�é릛¦ÐM-®“Iºúßÿí6Ómî“»N—ºVútw­/÷¯§Uvµ·ÒÔq÷_º‘ÂÖîîé[uÿ_«×c+Ÿ~½Ò·Ðý×xë¥ü}AM|Œ³ßÁÿ�½_ˆ�Üÿ_�⿦ô[’-­òË~�ûï«¿úÿÿõí_ÿ–[ÿñ]_ÿÿÿõÿÿÿÿ¿×ÿÿÿÿøEÿýÿÁÿÿÿÿÿÿò +ßÿ:ßÿ�\ÿÓÿA?ÿÿ'ÿÿ_ÿÿ…ÿáÿþ—ÿü§á/ÿÿ¤ÿþÿÿ„¿ýÿö¿]n©_ú_Ýô¾¿ÿÿºî¾ÿ_¿Ýþõý}×ÿ¯í¯ÿëëÛÿûÿ®¿I7þ¿Ýõ_ëÿÛ­µVÛýW»öõë­´’¿ýouÿÿî—ÿdë÷­³?Vîïûlÿûg¬"ŸiZ[¤·úȃ‡˜Õ¸_õû¶ÿ>ív%êÚ«a+î äÃ96¼ˆ8r' +ȶӊ±aéZ ÚIÚi„l'`Ðm„�iÕ;†Ãd\¶‚ §È¶Ób“ ¦ØIÅ1NÄ ÅAº ‚v¡Z†µ„V‰a´ Wå] ª! Ä#U+ +j]«´Â¶ÈúöÛZa‚»°Ä#¬MކA¢_;,B"44[��Â"²å“c̆£ºŒŒD¼W Çð˜UðÂëzð�öŸúúMzCÿKñõ-ÅúJ«’ÕåGù[Ö)ßßÿ®RÔ6ß®«�Ñy+Ô„d Î„t@¦bš‘ìÖ).(D%Ð|&�Îf²S©šÌ�2"£†C.9²'M‘ R\PDY‘PD9XOé0.s/™³ªˆMO†ÂæM°aÁ„kaèù4Úñûà’ïéþ¡ÃÿÑcAõÿËÅW”g?ÿñö‹­Uÿ‹^üÃkaÿmêÁÃWÿa¯û}s@-ø¯õt¾úÿéC×õ]‡ÿ§M†ÿ·ÿÿãŽ_àŒ>ëÿÿøo_ô!°ÿÛG¡†ßÿ†œÿÿúïþ–éÿÿoaÿíƒúMáÁ¿ÿ¯ÿïöÿð‚vÐ_ÿÿÁ»ÿd©‡_ßÒ ‡ÿöÂ_ýÿþ—�þïþÃéûýÕÓ»î¿Û×þ½þßÿªWê߯ÝõúßwõaÃ{¯Ý×ÿ¯ÿÿ×I¾¯n¿ßë¯ïîP³_¿ý“kÿíþh›ÿþ‹õouÖÙÓõúÛÉ~—º®´¿lÏ×ïô¶Ïÿ«þC¹ pg/Mš+zþÏý»NÒÛ?ÿî•v—M¥k¶º‘GMm$Ø­;à $ša5†-¶Åm[˜g&Õm6ÂV•¬s´“b–ÒÓ 4ÕðÕ´“´Ø¦Ò„á;O &Öl4wÃi« *aÅ)°‚M5b­, Útwi&ÂØ`�RÜŽ”Eƒ&A0 äù> É Dh¹ˆ¤tB 3°,¡–˜W•b`ƒ„kDè¡0dÁb"…+#0ÄD6!„®4"“–T™\…–„»\È!’°SµXìnþVä´‚<5%qÚ�ïÒM~ý`›Kïh~µ C„¹B¹¦v“؃ýëü&>¿¦BÑ¡åu2$2‚)̤8gALóc7ÌqR6²A¦I‘.óPÉ3)̤ B:Ëò¬‘ŽjšžÄúÌ4GĦs‚P�a„|1ƒXa4Âhù #cˆ¦*Z€‚"$�5‘Á“Æ‚.ÏäA°e °�lœ3L&�aøFÀÍ% +šyê*�&Ü4'H6­¤ÚNˆí¤ÜÆ“ “ðƒT|z?0�ÌÑ„ÑÝá=yù&Ó±Ø#½'A8D[i{- °†�œi;,öšI·¤�ZV‚m'K@›W„ÚM¿P�m–­ZM¦xŰ™âÒm˜ôƒi·Wм¯é\�áZô¿ïë­«i~þ?¾Úé·IÒºÝßÿî�]WÛKÿqÞ½ÛI2øO­^5µ÷½Ò¶ú­øí»OMêG ºNïWuµ×êG µ�¿¡êõ¢ 5Ðÿ¿íkê¿îú¿½�ãÿ#?ÿn¥‚:×—]×ø~®ßZoªûå§ëúì?uô‡õý}Öõöÿký{ÿú‹a¯ÿþ¿Õ7_ÿþÿÑOÿëÿÿÿûðE?ÿÂ;ýµÿÿò" ÿ¶º_ÿÿÿÿÑçÈOÔ%ÿøAÕºÿþ‚ü?ÿMÿÿÿÿïú°á'ôŸïô¿t»÷­oÝ[ïÿÿúú» ¿Kÿô¿�‡ÚÝ­¥ûýöÃÝwuÿ]ÿÿn¿¯ïúþÕ¾ÿÓÿ’éÿ§äØ]k¾¿ëþÝ~þ¾«÷þ¿·]í¾Þ¾©{¥¼$õÛ×ýmû¯¥g=ÿoÿ¿lÍžÛÛ?6”3êïî½´ž¡Þ­¶¿ém™÷õærýXOì'¶]6zï†Ç1«M‚Þ¬ˆö)´ƒŠîÓm$Âm¥O2RŽÔ¤­-³ÕÂõ´¶%"cm-5îÒnS´ûî6)šx¶Á ö!uaªaÂA¨,*aŠObŽôƒ¤ƒbƒi&ƒNÐI± „› $M ƒ ±âö›º´R²�HA Ò>1�´",BDu¨`ˆéà •eYVÉÔR=Á„R±ƒC=ÅÌêƒ[§ÄFÐÑfÒ,ŸËuFÿ®ÃÒ–óJR©íéHb” +S™ó(έš#ˆ×™£™/›Èy�’èÁ‚"Ì„| "ï|aØFÆOÂj'“ C?á,ÏI†©„Ô#[ÏJÃAþ‚ ¤ÃDvÌÚg‰QCÒm'W +“iŸhŒzNË=&è}:é7 ¿›¯cŽ­÷ ÒõÛ_N“[Öý´*Ÿé6îãû¥ÝãQJßÚw‡WoÝ{^ûvþ¿o@†=ÇõàÛJªÿÿÃëý~¶Ýÿÿö~ÿ¯îÃÿÿøl7ßø#ÿ ÿÿüÿü Oþÿÿ÷_ÒþÕ½¿ÿøpÿþ¿ûÞ×þ»ýëý}èâ}½kë¶uYµö¿¯í¤µn×þ¶Ö–·¯õÿo9Û?½i-ŸWßm¥üŠá¶_VÒÒ»h$í;I0ÈOi6’m¤šh6Å ÛJÒËl´‰• eXZÁT‚•…2µ(2 6)l£Fxi Ò=°ÉhE©\\ÁÙùÙxìi‘¬d¯""º7IÓø… êÒCÿß¡V¾îúãÿüíc!yÿ–˜Å�‰¯õµ^šzþdY©EÑDMõ:µS©dr6ެ¨8tý2-dk!™!�LŒÍ,Ý�h«G¬d1’‰åYsdŒÀ ØBLvi˜4DBLÖ ¼Í“È÷Âs²h"&è)ÐTB9Žbå$Á„h#A�0� x@óƒPƒ(Ì5†�`Â6ñ„lªi£óP¡ÃIð‚tÖL|™7'ôE†©äv㺠"í„|`‹·°l0�oA=A:Ú„Â<9‡µA¡ ˜a&Òm'IÙgzL4Kº»,ëL»h]&N�:¯Ý–€Î ÚÚ ¶Yí¥éi:ºM¢XÌ8A½Ú“ö‰Å&éÒ¼qu +ÓO‹ý5êþïãþ­¥«ÿO®£Š]4ø¿®ÞWJ½?hRºïÒÜ}oÚÞëû¥ý5úýwáZý½ºwq[HTŽïöÝûǯ¯ýáï×CªQþ½.íHáwÿÖ›ªuÃ'0áî¿ðú·ÿÃÿòÇ=~><8<ïþô…‡éÿ‡¯ÿÿ°ÿþ:þº°Øuþý×ëû ‡ÿøo[ÿÿÃþ—ý}†ßÿúïÿ¶ÿü7�Ùz¿ÿðßÿÁÂ8ü˜œ6þÿn¿ÿÁ¿ÿÃz ÿÿðÿÿÐÿÁÐXl7ÿ�ïøwû_Ãé½íÿûAézXpÿÿ¾¿]»ÿþú_ö¿ûÿý{ý}-ßÿ®]­»¿½úÿ×þy?ÿ´·ÿ]wïýíöìëæ×ö¿�Ÿÿ{ÿú×Ë(ƒ"ù]a•Wÿ÷Þ¿©å˜öÿë{KºvúZ÷¯ú»»öÒ¿¾ÒÔû�ž-ÏwaWý½[ÿ^îë«?¥Ö–éC?¶zêõVÒUí+#ò(ïdP„_i*iªm¥wÈP†Tšßlõ`Œ8mŸÛ/·Èƒ‡È£½+PØA&½¥¾’m¤¦*Õ´�h6Ò´Ón˜¨'8L& ‚ 4íYÚÖ?H\¥æãC'ÍŠt ¼‹tب„ÓÁì àžL0G1I¦šb ƒìI°ÂA„&E8¤|ebו…Yî Â#pˆb„DD0„G?—××b޶É8aŸ°¯ &œ0šzªGÂ�¡)‹ )Y•…YXÆ*V: HCAV²n$¥»¹Ù’ÈÚØM6Ñø$…¯,�ªÿ™S×]ݽÐM§ëÇ-tÿ|UÈ”¦¬•<‘‘»KúyÜò2²*hˆ „ɲ!™ûÒ�h„ðL>l`�ˆÍ°f™ƒ æÈ’#dxˆbÑĈ€G²Zh#Ló¬O˜2NCašf † `×Ðhÿ‡ÒmBih'AÚZ_Âeé4ÂhØÂIÚ„Â75LÌÃyŸj¨Z Ðäâ�m–Lí”›ÿIvYÓ¦} ž´Èí,-ýÚNƒ6gÚ ´�–ÃI´Ãw×A‘Í÷Z$ö…&ݬ[Jÿõ/Öׄé:§ï[A6Ú¶£Óutßé:N­¯Mi_ÿýg´¯®�z·h'öÕ7iÒ»Úm[i·ÿhC·[�¿î¤p¾¹K¼wëK,ŠŸ¯ß÷¿uÝÿk}Çõ¿¯‘�ô¢>úÿãý!ýnôßþ?ÿ×þ�ñRó“³_úÿÿýl?ßõ÷_ßÿæp[xb_ðºÿÿ÷aïÿþ¿¯ÿÿãŽÐoaÿàŒÿÿÿûÿþÿ™²÷ÿÿý¸7„ ÿÐWÿÿÿÿÿü�?ð¿ÿÿ÷ßKÿ }ÿÿïÿÿá/ð—ö¿÷ÿ¾¿ßU¿ÿÿWþé×õ¯úÿÛßU÷×ÿýþôþºëþ¿Kûkÿš'ÊEÿ÷þßýÿµ8¿§®¿_ý}ë¿oû¾ë×¶ûO¼ýþ×Þ™S^“~•¯þ—}Ú_{g­t›]&Ëò áûa>Eì'Û>¿m%ÛÒ´�+µ¶ÚR(ïdT”“dyMŠí 0ÐPÒŠ`´lðNƒ 2ïª{šm¥iAÚA°•¤ÁöÞºPœ'áêÕ‚I0�pb Ò*Ú+hDec…è;L0‚v¡±a šˆAŠˆA¦†ƒH¬(iÈŠâ!¢º^MŒâÜ^“,ꌊ¡›aQó"ñÚ¼î’@˜RºÃˆÿ¤v‹ÁH› +LõE\/×Êé*ÂA‡®ž´ëüŠNîþ¢î=v’oöž‰5æTÊ^D¿ì%÷Èo×_ã¾KþŸ¥äS;‰IQ„Ά¤˜Éxè,  ñ×ü†ŠK\«3·2^!¢ì SA‘"‚æ8¤b8@�“£m••düЉ38h„h ¢F¾åcGçæäò�•JDJE +!:laDfÆQ˜0Aã£a¨6�l"á„|g™„lzhöÂ6S £]4ôÕ&“yæ�m‚xˆˆÙÔÌÞ4Bt"í„n„ljì3KÙFƾFÆšiª74l$ÃA<'I÷I¸g˜K¦Ðg +Ceˆ ¶d-–z †‰{ýþ� —}Ú I¹4-zm&Ùa C>ÐMÃ8j& +ÒñQÅôº÷Q„ÚZ'iÑ(JÞ—Ò»Zc`þ-ã¥k¥n®ºŠM»í­Âot�Zí=?IéÒýýÇhR~½Ö÷ì?Ûwí'ý-}+ÿ_wÒ#…ïß®öë}ûÇî·áÛý¿Cõ#…ëÞßÓÇW®±Ã¸~¾r6ŒG"ñª&5'Ïi‘Âa»hÙTkA£`a44 3¸¯è‰Ó"?ÁÑì2|÷”fp@Â.I, ÐeË #cÝŠŠi&ÌÓ®•çÚ`ÐM¤ì²nÃA6“h'§]¦¿é”v##v�m'JõP‹z6"ˆá„{„›e�¢²“ °ƒ „•®‚um¬ ƒiZ[¤Ã„Úék¨¯ÕÃË@g˜I¸ ÃKWI¼*m¥h&ÛKñm&Õ÷ÒÔWKݯ´ŸWÝmSKßmBe¸½_Ó«â¿¿Û_ßû¥»u]¥ëû¡¯­÷ußõ*úßuúîÓ¡í:¯ºV¿­wê¾ü‡šú÷DÇ$�±ÈÓῨ�¯]dž«¿«þ=[~<5ñÿE×õ¡ÅX?n¿¤=ðñÿ–±ô¿Wþëaýëÿ¿íþ¿ýÕ†—ÿÿßþÚª°ÿÿÿÿý¿n¿þ­ÿÿÿ_þŽî‚†ÿÿÿÿò!87úÿüQ ÿÿÿÿíú‚4A¿¿ÿÿ¯× ÿ_ÿ 8nÿÿÿý}'Ð[ÿÿß¿ý¥¿°ÿþ–ÿÿ¿ß½êÅwÿþßímo_ÿýô»¿ýÿÿjü6[·ßûÿ×NÚ©äþÿýU{ÿÛýêÿó‹÷ÿ¶ý×[oúÿû}yÏoþÿõozÖ黿öÌûNÛ®˜g»>­»Izß·¯õ퟿†÷·M©û{aúL=†ši¦Ã˜0YÚVb™Îí$Ó~cû´6¤Ùäši¦Ã *i°Ìr.Sm&;j¢pö0Ã#éÞ›ƒfM‘ÎT  *vÒž0Eú-I«L2µ Nì ÍSMˆIÚaƒaÓdZ‰EÄZvE$œQRÊ8ˆb…„e4Y«QÙ8'®TCª!¦ƒB" Â*ˆíÑ!sº‘62Ë ”v|šJM^MÅñ£"¨(_ÿêþûú_ý§é·;È—Ä+ÿ®¾²¼þ¹V‹«ZþBó©�yôq£2:…)3™|äm‚!:`h„É�„ 㔸‹²ȧԆ2 ‰Sž`Ž£$ÅÉŠN�¼æq‰yƒÐ"ñŸan3ưÇ7X¦)£×§é„nrÔ-¬Î’‘Ù"#™èâ8@�‡¡àŽÁ‚5³L h„ðDx#X0�ša8†°0��èÝ×M=’úM„aáR ¶šI´¶˜M+-žl³ÌÚMÂ=³8&Zi„ÐA¶Gá%­£ÃI´Â3¶?Rm'M¾i6“éZVƒ#ŸT‚t›L6õVô•¥ïJõþ—IÓG¶–ƒ8Ñ\Ò †�(iž'I´Û‚WIҵ鴭/I´´šßWî·ÖÿÒw¿éýõ¯�¥ÓzWÒO´ëÓ¾)?¿·é?¯´?¤)>ý)+t¤p«ïOÿêG Kßzßw\ŽK_ïÚ�{î¤pª:‘ÂÖût½¾Úõ¬B­½ÿäuVúïé]ÒÆï¯÷�ýð_Èëþºÿé¢ëý×ÿô1ë¯ýõÇùiÿ¿Ý!®‡öê·öënµÛ×ÿÿúÿ­·IþÃUÿ×_õ_ý}ÑNÿÿúÿÿÿýÿ°ð¿ÿäû×ÿÖÝ~ÚôÿÿÂÿÿí¯õþ à�ÿð�þÚú_ôÚÿÿpF�ÿÿ¥ÿþý÷ö—úWÿÕØÝî½ÿÒÿÿëïÿðö¯ëouý†î¾ÃÛߊaÿÿt÷þû ÿ¿Ý×ÿµÿ»¯ÛÛ½­ýºþÿö½ÿþ÷_ëwÿîÛ¯îí¾f·ÿÿ4RÜÑ(2¹+;w¯ßûÓ·ûšjÞŸôÛ{fž¿MÝ{V~«=0Õ>»/®Ù{Ø`³-`ˆåY᪪ûö—fköÌÿ¾›·ûI³û òÛ H£†Ÿ¶rtiáŠØ¦E}µ§„B 1 +¤nGˆIÝíwí—I§Øm&›Mmƒ#žœ‹mY�†©ÚLPcA± +¦m1A†TÚa4Nî-l œ«´Q£D0¾“н6- Ób ŽûM´°Ä$ÓMˆA4ØLBk¤ÓGvGAÂi Ð4(®r±àÁ +UqD\ÉH7}E/óL£ Š"x1A‚•ŽQ€DÂÑØº2/ˆˆ¯ë_,Â}|îÖP¿®ºªy•H’¢?•K �ªôÎêµ!h�‘¶™,gãLæGÏæâqš˜ adŒÛÍŒ"9“æ Æp40�Í3°ìïêu3æC"œÎˆÙ’’Ôp‘ B¬âåY�D¡æq±KÇ̆PŒ FôA‰™ÉqÝ lDS�a™Ö°0��ë„Ò ª„Èø*IÓT›Œ¸Æi¦· ÒA… ‚G²"Ziá&IÂ6:ÙÇP› ª +Ù8)ë¢8aÛ'á’ÓTi³í, ÈçNÚKPéZUDpÑí ›DWhŠí+K +™ãe¡0ÕÒ °NM4Ó.Òn…Õ¤ ±wé_¶•Óí¤ðš_~½¥_ L>´6�ÒµzVñJúßút·ð×ÞÚ¥Ðú¾?î)mºK¸Æ#éµÝ¶›ô¾Ÿ_ÛöúKÇ#˜_qwÛúÝ­ªÚßûÇÑc‘µ úÚwu_wún×ýµ­Ð�wÿº� ŸñõÛëñþ?÷Š_úðéûo¡ùd¿¯õ]«ׯMW¯þÞéþ즫IûwKÿúÿaëÿÿÿÿþÚÿõÿÿè§«ÿþÃÿpECRFÿ¯qÿÿÿûí¢¢‘ÿö×H‘?ÿá~ýz }ÿ/ÿÿ¿Á¿ëïA}ëÿíè/ÿô¿Û§TÿÒÿûÿü6ÿ¶8¥ÿÿ·]¾Ý_øqK÷ü%õÕÿû«Ý}°Â]¿ÿÃaþ÷þ«Þÿÿÿý_ÿî½koþÿýõ^Þ¿ýý¥]¿ëëÕ·ÿz�-§®÷×oÿéÿlÑ6—úì;~ÓÛ>�ßõëÛ¿ýºÕµ½ûO³ùëû÷«¡Ý¶<ô­yÃM°Zv ¹ì0¿ýí+I¶Óÿ1:W]m—éàËžØ]=5OÞÅ´Ø­´“A¦ÂtØ3 ê„ÓO†ÃÒÒdAÊ Âh4Ø„ÚM¤h ƒŠê�…i¦�éÕ4öÂ„Šº=ÑíÓHøÃB"#+˜0CµMý œY+í Ä&F ${°„XBŠÆumdA£/Ë3DDhh›Äh›ˆˆŒ”ÄÄ ýÔ(Pªg�‹ÈÑ Oã_éÝ5ü›JÖûÒ�|RÞžšÇãþ"‘QõÿÖšçb¨˜D•Ú�<Ò5�0ÁE¦�㥒%(%•dpd�MdN &GˆhØÁ¢Rg™Ü@ÁÈLDA,0‚P‚P�Ì ƒ„~™Æri£`fpM&rà ¦�oD‡…TXíÚMÒÒÐN“ii>ƒ6)³I°¨¬¤ØT›Aœi6Ì)!ÃÒººNºÚN¸T Ò»o&á6•ïÓM¯]t�S]'ww]¯ÕßÛýþ<.µã­ø÷·«Ý/Û§Ñc‚޽h·%?[ÿ,rGðõÿ¯ñõþ>¿úCð~þ·ÿõ__ÿÿü7ÿÿÿõÿÿÿÿ ÿÿÿüŸÿÿý†ÿÿÿû„ ¿ÿÿÿÛ¯þ¿ÿ¥ýÿßÿ~uö×ÿîY†hŽ—÷î÷ÿßû¿ÿÿùd[̆ã½FÁ�Šúßîýÿ÷ç6·¯zÿöç`‘*3µ¨ìÓ +¨ñ9‡ pUÛÛî÷_öÍëÚ^Ú]ÿ¶f�RB/…§…S¸©R¤ŸîÛ»M³óvÿ½°–·[¥­¤žcM5Ùø …†Vì$ÿöNØØØ„ÆÈ¯ ¦¡6);m$à $Ða´“`ÓM4Ø]&Ô:‹“ ‹£WÿUD•;‹†Jd­4Èá4ÂûPÂG¶ds<„�lÒ BØÅ+œ¦C-ßò\§�ÁN[D…º¨ù6YB"#²™†éc¥Í0Òö¼õÄyä¿ûa ío¯úýuü6�¥ÞE’y1f£)�dcÌÔR¬T 3™|�)D„lh„éÌÞzÚ�2ÎIåmEùã@ûi@²öh,2B6Ñ “c' `��„kì¦qa6ƒB0�až‚6m?ŠöˆI•üÎÊéi7¤Õ6ƒ#˜VdE°™ãn�'K‚}´´­ßWÒºwõÖtéaRa[½+i»»Ixt¾ý/é[I¯Þ½1K_ou¿þš×§öû ö¿_ý&é­Ò_õëÕÒ¶‡ýÝõßî5#…ýGÈá_þ¬=Å-÷§ÿqoZÝ/zÒÿ]ßß®èz÷D8Bÿ§Y$ÖßÖýÿ«o·C×ÿ�ý7ý°kÿË,gסÿn ß�ÿý{zúÿÿÿÿÿzþÿÿÿúÛõô¿ÿÓ×ÿÿ×ÿÿáþ¿ÿÿûuë¿ÿûk_ÿä ]ºÿÿöð—ÿÿÿÿ­ýûKÿþT5$oþ·„hî—ÿÿƒxA?ÿýÿõoΉðÜ/ÿõÒ/ÿ}í _ÿþú_¿÷ÿì?áûöéõÿë×ñºÿÿ{_õßÿþþ—¥ÿ×_~­éxAkÿþïÿÓwû}ÿ¼÷_®—û®þ»ý9ÿVÿÿóßj¿û·¶h¾ÿ¯¯¯ý׺ýúWúöozûÿúnïÕ&ÏͪíŸ]…_ºÝ_~È<ýî»÷vߤK·Ù sIoµít˜fÜiö“ȃ•í5c0Ä$ ƒ ¿K/vÃ[Ó{m$éᶬxIµá·¶I›i¦špÒ Ba=§*# ‚ &Âa8a­«™ï=è´Äë &! Ýí°�°a6ÐIÕ4è6Gƒ#Œ6�NxlEsG†ÐGÂŽåaVUL¢ÄDD„W­adv PîÅ4CM…•8‹GD#=³µ´vVŠ ²Fd”Šè%)ã³V$òB! ˆˆŠ½ +¢9„ÎÔÙÑPή÷I¨««J0Ô•ZjÒÿ¨ÖµÂn¾£ô×õèH7»ÒMb.»«I$˜xã�•cþÐMŽ“®§HÔó¡‘hÒ†Äb¿®vMœ‰‘ ÉÅ$Dx‡dTмÚ/òš`Ê Ð œk ‘˜3Ð@ÂÅ&ò²D\yÄq¢Tr-©Ë — ‹2¹ƒÙC[<)Ã?EAàŸk AA)�f±¹ø ´á¤Þ“ 5Txa1ü¸§Æp‘ì32>aã!#<&˜FÆQ&{L&­çà�ÍBi7P“�Ú}6‚t�&ÒuD[´ÂT�ÚA¶]i‘Í6Û­èðá4~ 0ÝÒ}¦” fÍ–tÃC³Ee-–ŠM Ï40õ‹k­îºZZÁ[ê—ÚW[išO‹nÐT›wßv–}6‰:„Û{ºíÓk·íᤴÇOýý÷MU½'h}ÿ·×¶ú�¯»«t=i{¥~¦%tš|T¸NãWwÛ­-¿·þÛjé{{¿®îý~»^ÛK¶´G7h±Èè¾½—W×ÿþý:·÷é{õ¿¸ÿMúC~…ƒƒÅ~µýýÿÿúÿð}ÿêßúÿþÿ« ¿ÿmÿÿÿí·]~ÃÞ¿ý_ÿÛÿl0ÿÿ¯ÿÿÿÿ¯þ߯ÿþ¡ÿÿøl7ÿî¿ÿÿþÿoÿÁ½ºÿÿð‚ÿïüÿ÷_ÿëÿt¿Kÿ ÿÿÿéÿh§Û·ßü>ûuÿÿ_ßïé·OøKû¯Õ¾·w·ý_¿n¿î—°þ½öþ¿¾¿¯¶“ëÙÕfÓ¿ÿ÷¶én¿òÌ4È?õ÷_<Ÿÿß_×öëô›ënõJÛ_ÚÛVÌû«ºÿ–æ„dXˆì´º~û×ßþÒÿ×Ý}³5Þ—gþ®›?_ßí­„�%tiéÎõÌ‚AvBý7 KÝ-6ë£;Õ^¿[ Ù�n¯a…[´“`Á+KV!1ª§I±†(0ÒL0Õ5Næˆ +UÁwÉ* „­*Vá6G}¤Ÿj·m¥i§r8qI¶‚M6(*z 0Ä&ÂL42Wï%‰’N1 +U°ÉÖåU(è=ô©EÜ‚™<ÃJÒtÛ » +›÷h[‚zaXNÂ$a’A¬£°ÂG†HX%(!Z ‡–éA¿ýò\ #ódð0b«ˆ² AB AJÍ9gÐh쑘„DGNí/íÒv›-ÖSˆˆñÎË:_·ûiO\Ë‘Dj Ѥk³�$Þ?×ÎÄ%\–F‘RD|�dvgò"*3†S³8¼C²>k3ü>`aHÁ EÞGÖwº¯)ã!æÏ HÙ%6H‰BNR 9ÞE³D¡àŸž„˜g<ÏC Ò.`�‡V0‚ È<4Âe„ !‘pÏ 6ªši¦“r7I½¿ô¹>g„ÐjÍ#Úi¦OÔ&š64‡$åOOUG‡%‹I×A\™Óh=O] ÚM Èæ–ƒ8Gšž#Æ—ÐMýùn¤i' +ˆá£ÛA›-+DvGm+DvÙ4&Òp’ óeκg‰¶ƒMV®­´“i>û¥jÕ:N“^î¯MëýëŠu@›zW +¥p�¤­-jÿu¯õ÷_ï¼w¯kw®½õ#…Û`ôªQ¸·¿ôïûzþûþ-;¶ÝVã¤í4î¶»U¿ï×ÿûÄ{¿·ª¿ªµñ«»_´ÿê>‹Š’·íÕ�ÿã÷¨ønË•ÿßÇüEŽHëÿÿÛêüÿVÿ_ÿ]úöé/ÿé~—ø¯ÿÿö©iÿíÖ¿þ¿þÇÿ¿ÿÿÿÿþßKþÿþë„qÿþÃÿü?ÿÿÿÿÿÿÿîÔ¡—¿ÿÿm‚ ÿü _÷¥ÿÿÿþ¿ÿ¯ý´¾ßÿÿaÒÿý'ÿ÷ÿÿß÷ÿÿÿÿºA/_öê‡KÿõúßKÿúÿÿ}ßÿÿãÿת^¿þ«¯~sÿÿïûïÿÿì6—ïn½w¥×ÿÿëoK¯ÿ×ýmßÿÿô«·º_]¬2÷¯ÿëkÙÿJÿÿ¥·ûmºÿÿïÝí™®×´­é�vÜ?½>EpÕ› 'I?ÿ÷û}æžáýéöºtìŠïa‚I†ÐIé&ØI°œVši¦šmpEä“ A"‡ + :ªk„“ ˆ9^Õ6BûM�Š ˆ;M4ÓA¦ši½B ŠL6’vG +w`Ò4;a4�eQ¢±¢±£ã•‡°ƒBÄ)U„D؃ Ö‹=y�%ý¦·„m­¦Âµ a0˜I£ÃGº5´x£CF†Q£Û&X3+!”8!¡„PË<àDI(‚�¬ÑGAA!kEq8DDPBæFpW&êQÚˆ…2$‰$ŠÍkÄDGð¡p½¨Vž¿­Oô;µý'v¾š_¶—ïˆçiÿöÚ_ú¯™$]0Ȇä¿ýI<‰6y@Êøӫíùp�ª—ö뵿¨×¿V×÷ò:~ÇÞRUÐÖÿq¾‚ÿ¯¿#…ú¶úUýáÿÿãÿ¾¾úBþÁþÃÆ£×º,r4úñ÷ù .¿k‹i$5ÿþ¿ÿßÿö×V¯ÿ×ÿý!ý»é/öÝê¿ÿÿÿ°ÂøoªþÿKúÿÿºkéxo×ÿÉq?ÿÿÿÁ> ÿÿVÔð_ÿûG}mþÛAuþ�ÿÿÿÃ¥îÿÿÿÑü#ßÿýéÖú¼7ºÿÚ_ÿëýþé~÷ÈÍÿý$ú_÷ýk~Ú^ýº_ÿ¿ÿû¯îû_ýÛÖ¿_ÿÛV8§�÷×ÿµÿëºëoóËÿ9÷-*'Kýn)-ý/­ÿé«jò¯õÿßÿµÝm-¿îµ×¦ÌùeKÊÿœ‰(—¯õµ¯úëߺMmíýva}Úÿ¥ÚZöz_Ö!ý¤ØJe4vµ™ÇdJd¦ +-¯ú·é­­÷[fhõ÷[Ùÿlú³îëdÿì3ÊE=6Ëú 0Ú +ÐI†*ÓNÒ‘Å�ìT˜‚©+E*R +KÞ“·wý6ì#¿»Á~’°Âßn“Ó¦5í$í4ÓMá4šÅZI¶¡Ô§`‚¶áX„Âi'M‘t +D?OÓÃóqÔ[m´ÖA1ME7lE>!6ƒ Ø­ 4©ÃNÂA» »T|*„vÑá†Qíʦ9@Þ !ì7ÿÿõ¾‘%Ùïw* ƒ §MÆšyìA#Ü0›Es4ƒЦV“ƒ(è™Wðÿþב<’$¿òlµ™ ¡WûYÙjÄqý:ÇÖ•/ã“)×RV•{¯ýùUYZD9&t#©D(äQ^lˆe!`ô<Æ€h„6TIi|ìmäP”èAsŒª£^lʌٚ‡�há�E”ñvO˜a&O¨FˆI›ƒX<ÙŸ#8 hØü&°Õ S úTÚW$2ö`dl‰ä,ᙘF°Ñ åÀ9 �ƒ$g2|Ò Ê5 „l'“0�KIµL$Â<5eºJÒnN—CI¾ÃI¶\ꊖËhCK„é“É ÕÒÛÒoAäÏG·L5]0JÃI½QÒ†––›¥âëŠM¤îî‰:JøN•¾¢ÒŽ ‰"ï ¸gš©âWKpé6ËBmñl°©º6°›Jõ@®�-'V’}µuÒè4©ûÿ¸Þ æâA^µÃx¥¾¾·WûдûOþî©¥ûB£ïŨþãêG ý㦩¿u_ãÒu]û~Ôº#‹¾êGõ¿ï¥_è·$-þF#ðú�»Wuúýÿ‹¾þê2éÿ–9çÇÒÿ—WÿÒØ}/÷a®¼´•ÿKûû¡ÿ¡_ÿúÿÿý‡ÿþú_ÿþþÿúúÿúÿÿÿá¿ÿì?ÿßÿÿÿÿðŽ?ÿÿÿÿüÿþÿÿÿÿÿÿ¿'ÿÿÿÿ¿ßÿø7ïßÿÿÿÿÿ„¿ÿ{ÿÿÿÿïÿúÿ×Õÿ¿¥÷ÿýþÿ”'÷ÿ¿ûïÿþ¾¿ýß®ÿûÿ÷úÿÿ§¿ïºý¿ëé¿÷}~ÿÛîý¿Ûýºíÿ©ÏÛÝoÿ×Õ¿û'WþßöÙý†f¿Û?ž¿lô¿¥eûÝtroµ³ëºý†þ½+>¿VÁ&ùÃÛ8ý<ŽÛ 6 +ȼB튿 ±I¦ƒµb­ÿ¥}Ã;¶Â¶_t™)°Á$Ó´“´d/Ó[bƒ, Ãi¦Ä&(1 + +‚l*AÛžìBaYÊæ©ÚV–Ó±QA†•ZaˆI§„xA5†¡‚d­4Ò,v${sÙVV0Â0@Ða—ËE; oÐ&E¥¦L a0ƒ&  ŠO>J:HDr,ÁÑ’Ü8ˆŒ!år–8„Ì„°¨«™ÿå¡I©Ù«½kÿïí(å¸"éÿDØé>—µˆê¿*¿¦jEQ‘"S Ílù�Ê�®¾kGcLªd\d�‘†|ɲ"5#°@Èys†`CÌ#Xh„òíša˜F°øMYÌ­HÖj2‰p¤�’DI‘*Ë+Bc˜áÈ4‚ð0��”a0š„ÌÍ“ñ£a§è8j’zA6�›aÚOE[-5Dpˆ¬Ji‰ãdˆI•CØ0�˜ÈB>gð�Ð�mÃT|i¦A›'æÊ ´Ô#ÃI´›ŽÚ+A›'vZmtºªÙgV“ ºyjɄɊÐXAZ„Õ4Âi1ì%KI†�m–tCw§AXUÂZMÂlnƒ{ÒÞê/¨ýצ5Aœ4�m'Aœ0Ë=OšL'¤é:M¿h”-ÔV÷}®ýÚmýWº½K„vŸª ý'ôºïºêšÞ“mÚïºB“m~ÿäp¯n·Qÿ¾–ºXvýýú뎛×þãß_ßÿÒ’B‡ðôZ°ï½u×¾ûûj뢦ÿ†‹s‰ÿ_ý¿ñØmÓÿaÿhÿþ¿—Wýý‡�þÿÿþÃÒaÿì?ëë¿þºÿ[ÿûÿÿßÿÃ~ÿÃþÿÿéºÿÿÿ ÿÿÿÿàÛj ÿàÿßÍÿí¯ÿÿÿ‡ÿÿÿÿß§ï÷þ@×êÿþ'_ïÿü7ÿëÿ_Þì7ÿßø ‡ð‚ÿÿA]ëÝo½ÿoþ«ûä >NŸoóËþ¿¯¯úa÷Ûׯç7û¯úû¿ßïþÿÿuý…}þ×oÿïöÝ/Ý+]³>îªÒØg®þŽ9d4‰$@â7~ªþºÿõݶi½o]«i6gþÙùµ×´®ì¾ØK´¾™…*§irÜvV"¨jªg;,êÝÝõþÈ8ßom&ÒM´–ï¦KTÃÚ 4ÓÒ`ö)ŠAÚU  ÂNÕ‘g¤µþ×éØa°Â(|Š;´™ºl:M�Šm$ÛIÁðÂLBM›6¡×ñ Úa ƒàÄ"7’hCCÿßÜ™‘ã€é¦› Ø1á>Tšiî˜d¡0ƒ`Š&!ÔöÃB B5² “£²†eøˆ�Ý÷üB"óA †O•?*Øa4"4\�hDQÎɹ[¯ÿ�*a¥Ó ®HÄR}dÑ�¯%wŸøí«¯õ_½ÉtGDttgb#©mã¶h~Ö•SÉ;\äjF"Ó5¢1�Cš ÔÌØ"‡’ò�r„†@ŒDAŸ3<ägšaÖÍ­¿Î ߥ‚ÍFÉ2,gÌ�*!&DVx: +²\J“Bh~›�ç ™@Ô6 0Ðfœ2| Â/!¤š:Y¦–“ ˜~“ª„{i1ýú‡í.¨ø±ž0G·’3èÓL&�šFÆ ói„aÜZ64¶)ûÎÒm'‚JÑ4¤ÚZ +‚ÕÒ ¸u„Ýknýkm$Wi„�zJÓ<ÌÚMÉ &Ò°ƒ66åøiÂXj2"ØJéÝ]zÒÑéu}_¿Ç}'öúÆÙ +nHÇ[ëºÚ·jí+i\&ž›J÷ÿ~ÓKÛ_á +N—¥ª¿ÛÓÿÁëa0ffrcøë~øéZîÓï¶–ßî¤xCþ¶µëu׺¿·÷oJ+Øû«õwïÛ‘GÿÚëéuÄG GúÇë¯]†¿Ãÿü0á‚PÄpÝoH‡®‚÷¦ëÿÑf×Õÿÿ®ï°ÿëÃp‚Á0ì> ÿø}p_úþÝÃÿõ×ÿÃý‡ûkáñÞ{^Ãÿÿÿõÿ ÿë¿ÿíÿƒº VðnÒ ?ü7ÿÿÿ·_àßÿšoÿ÷ƒ~»þÚ^ûÃo†þüÿÿÿÿý¼‘¿øAßûÿ†ÿˆZO· ؇ÿÛïÿÿ¿ì>—þºßÿ‡u÷ý œ^ðûøïÿm/aÿ¾¿·¥ïÿy©w^y?éi-gT÷a¿¾ôÿõ÷ÿ¶U¯Uÿ÷½¿~÷]V¿O¦ýRž^NŸzóŸÚßú½>÷ýÿû~»k~ßÕÓvÚþÈ8Æ–—tqïuK¿ô­é¿î›Júý³?«×ï·Ví»¸pí'JÈ÷Òi¦ÃP•¥¶“ú®­»öë0›JÏ®ý«iö_µa„­&0ÃOc†ÚlŠöDzaƒ«Ã &+†‚TÓ´ ˜4‚ °‚½¥°ÖEòÚ}«iBóTí Äȱvh6!6“»I¦(µ¦a$x»- ЃbŠâ€Š<ˆ`Ù­‡-²¼{zá0šTÓbLBa-Ù¦‚ 1 ÐG¼¬dì1@Ñ6#q¢¸žV3°I8em…'‰›ˆâ ˆˆ`‰nd¡s)õ +ìžr+ñ©NÊóaOAWµiõ¤”{ïл¾ÕKrÕ}\÷»ê>Lñûiôþ?ô‚²q—*¹ÿ&?È.¤ +%F@³¤FP¡C�þ«�52ÈhäuGUŒ hˆ\  L„˜0@ˆæi t¨u\¤YÞ">@š”JuŠA”ùšÈ¤ˆ`§8ƒdžÁg 4 4Q£X0�mOÈü„6Rm'L#;ï�¡¢(§ ¼ÀÈÆH‹À“ ²vˆO]„kf|YÂ>ñ©Ô¢�È-& ´›PŽì(Fê“i;-›DyI ÒtÞ#‘™¦`Â5´× „lzg͆“#ôÚZMé6‚uŸêÚ†,BiRÒ´˜i:ˆoÞ뺭¼WK¦ùš +šÓ²Ä‹CEcA7g�äè&Òt¶YÓ«…J’´¯zUt¯uöö÷Z_Òo~š­þ©+«ï޾ï«Kiizøâ’ZMö®—é]nîߨÂ÷ö»QK߯†±mnŸëUÞ¾»}Háõ#…Wk¦÷Þ‡Ý[øt?ãèoë�ýxÒÒúíÒà•¿§_dé±ÿý¯xkþ�ïýá?ú&9 ||xzT5í¯ZCZþÿ¯ÿ°õü¿þX×ÿ¡_Õ‡ëÿ_ÿïÿ„Pÿÿ à¿ÿaÿÿí×áuaéºÿù/ÿ‚Oÿ¨7„{ÿaþÿþ¿„wàŒ<Òÿ´¿ü Ÿÿô¿ÿ{Kþ> ÿÿí ¿/†õÿþû½ëÿ ¿¿ÝÒÿø×ÿdg~—¥‡êïØ¿Kþ¿kû×½¯ÿßþÿæÓzúþ“õýöê«×^Ú¯ÚùÏ}ûÿÿá&ß_U#ëm®ûïuö–—·­«×õïÿ’þßßíÿú×Fi·¯ï³=ÖÓÒ×ìÿh§/m¥}¨a˜pÛÓþ¾P¯Û4_܆9™ö¿v›ij­ž›K¤Ø`аÁ&ÐV´­˜L1M‹± 6ÂA4Øh Ä*pšûî­û`–›`ŠÛ bî"Û Ú¦‘qX¦ÒAºa†-)²:IÚ†Q °Âª¢F‚5r°®B";T¥°i¦Å&œí±LŠêݧ{Pá.¬ à #ã ˜6"†#2×3¿a„NÒ_(Á…*ò±†…„�I;ŽëŠæw-T¬Ê{ˆ�õëý.¯Ö—Å´M;##CG·-ŠB"#ÿ)±^S+L�ÇzäFZÊIHˆ)¥"žm¬2$¿¶ƒ yj–ݾôþýß­¯ïŽB'KŽv§åkôï娕�‹KêôB( dTRqšÊ·ªšy©ȦtÈù­â(2q”g è<¸ôBYœøLm©¤���Œ"ì0�l#C4‚|‰"$—9šÌ�Œ§Éƈ”"ÔK !L +ˆ“pɃ=C 0ÁC °4{ 0˜G·Í,žâƒ¾¨'I´ ÚM„Ç-BÁQeYs –\«ˆL„ #Y’ÙÁÁ„|jxÌੈFÈFÎ�ÕRm ÉpA´�-OO/ÚáYgÖ’¥¥i6–— ¸Gîš„šI§&?ÐÒnžJì´hŽØF·M¤òИh29¥­%i:¾_oꟿW[Ý&«~¯-KT϶‡Òµj…é¸LBmGÝ&’zuµÒ÷®Ÿÿ§§^5µ½øº†—_ý/mS×ë¿JÚ׎†¶¬}·ßmmzÑc‘Ñt?ýÆ·§÷R8[ûÐÚ~áêÛ�è±ÈÌGßÿþžµñW_÷énÿüé_,p_þ½ÿý+_ÿ×ðüÿH`Û¦¡ý†Áÿýuî»ÿ·¿ÿø#ü?_ÿØ~ÃÿØl?ýµÿÁÿÿ¥¥ÿø@¿†ÿÿ†ÛPßþ ÿ�}áy/?„ÿïÅý¥ü7çC#ßÿ†ú ÿáÃÿ¤í¥ØA~ÿþ¿}¾é üÿø|C÷øl7ߥãõë^¿ïïö¶¿ÃøKÿûvÿîÿZ¨Jí~—ëÿk½·§ÿ¿×ÿîù:~ÿwÝuéÛU×[ÿ¿Ý[4V•ÚÿõÿþÈ¢Þý¿ÉAõÝßî¿KýÏß}‚N¬3”Š;ÖZ…úÿ~Úÿ^N¿m-+t¿�Ç{†‘ACã‡i'¦È¨[JÃh ÅA:iú¾ïÿÛ=-eæ%kõ|‰Í$á°ÛbƒØKG†]§p¿†Èâ Ä Âhe[•…iH™‘Gi¦›#ÊlPa¤Õ¥ƒM8i0Á&’m5a„&š¢94"ÄTª¤„9\X7n˜H8'[¶­6‹ªdT •’|Ÿd`B„1Ö„QÑ£µ… ž¨‡™"¸¶ÿ__×ZÒÖ¶– B°ÒO¤ °Ž´WÎıЌü¦Jh@ˆîZ…h¬s±g ‚™U-Wêô†¿êv6Œ„wvœÊ>×çch\×’Âúê¤Mó©’ðR28³ù¦3l� €äü6p�Ú„7&É™,Ý�VdVÏf¦@Èè*"•eÖEÐ5#áI9ƒ ÊÁañgâ䱄{fpTGç M¤ÃMš#¶Û¤w¦ÙhA´æ•Éâà„!‘vX +Y’S ödsÈâg �ÁƒÂö Ó0aÃF°ì#a¦hg¤‹´l $:N‚t›§–Ž“ih3�”˜rÌ'V‹º Mý^ê.“u¥s€£Ê¡þƒáò7iaÝ„hjèiaòÈ ´5Ÿè&ÒtN–®è2;JÕé†Ú»¥¤û~þêßßÝ:‘Âÿ_Óþi´¤ø¶–‰Å]&ÝtJ*4ºZê)xì ÒÚ_ZWãÛûïëýë¿õý1’£öÖÕÿðÒýkn>©ï]×~1ÖÓûz¯_ÿÓýôßhµøè‹ýþÕhw­Æ�ñ´éFº]�{¢Ç#Oý~©¿ÿþýƒÿù ~¥(¸Mí®ñ¯�Žº!ÑÒE¹*,x|?ů_ÿÿ_Û3ÿízú·åAÆ‚‘ƒ<3 ˆ…¡åá|BHWh±Eÿü±ŸÅ}ƒØÿïÿÿÿþÿÿ\•äm”çÓ”Gȧ +tHfd� +±|ø!¡…£M4§jƒß_]ký/¶¬?ÿÿÿÿÿü8ÿÿ: ›, ]Ï¡žahLàÊ4°�“šh3æ30¡ áiúz§iá=Sÿÿ¡ÿú_‚3Á²M‘Ø7ù/¿ÿÿ¿ÿ¿á¿þø'„ô-ÿØOM?žšqz¦šzq~œh�ÜZzq¢Xÿü�‘ì+ÿëú +ÃaÃþ_÷ÿÿÿÝ>ý׿AÄ<&–¯Åé§éÄwh–4K‰[½Q.è ò;"eÆ • óªÿùÂßý~–õ·ú_ú÷uÿÿ¯¾ë÷ÑïM~ÖD‡¢XäûÔ–9È–ä\|Ÿ:z}'‘÷ªyié­úO"Ïýߥé~•Þ•:ïö¿ï[ºëÿï^sû¯ý7"ç“ç_Ô&ô›Wô›¦žžE¢þ›¯_¯ÝöÝ&ë·­}{ÿ]õÏ']ý½µÛºÿý[ízÝ}³?ÓÓzN—¿O×_¤õ½7I]�ޝ¼Pô=V¿õz·¯«íý7~¿ä'^꿽véûwiYum¥dvÚ =Šã×í¯ß¾®?÷µÿÿÕ×K¯ÿÚòEÛõÿ»lÍzF{fiµ»ºý+ážíw®ÚI°fi'².T&Áá°“ &!6’i†]ô´½Ò«ñ_§ÿz¾ßèÔ5…þ/Ž™�›I³=³5}ßa;aŸój×Õ[ +Ø'"»Ò¶ÛVGÌ1M‹iÚm¤˜bdr´ØW{ A˜LŒÂ B•’„ ZûZÿþ�ÿ¯��y�IÿáÃt þÞ“ $ǦØECNŰÅ29Š4ãb™:‚á„ò*l/G†Oʸd�P¹UˆE½a¾ußÛÚ[ù ÷ÿým°ÿù |/ÿàÚcA!0“\{Ü0¡òÇA„!1h²ù@/ÿ÷ÿÂùо¿üÿýs¢>ÿ$&"KŠ2B‘@o…ÿµÿôEÏÿÿò`Lè/ÿ ^‚ÿ¯Ãˆù/ÿ&Ý/ø^ßÿßáÃúÿ_ÿßÿKëþ={44¿K_õ÷~ëÿëýÍlÑäæþ»û%¿uý{kuÿíš3g˜?×ý}µí{_®»š6Ö»¯ðÒuþÒõµµÛÿ¿µýº‘1®Ýµíµí+]ŽÒþýµn›öÒÿ ÚþÅlWÖëuþ+a«k´ÇüWÆÅq_±ì´ím{X®+Ú­Š�i…ýa¦šÃ öB?d#¿Ã[Xav? &ëa2øa5üœ-„Âam~Ða Gña0DWì„|›…°½­¬4Óá„B#°„0Šv[J¡¸°„ZÐ�ƒ*KqˆŠãëåtá?_¯×ÄG,¨D{2Q‚Á)‘<·UÂ=ȼ–ºÄ˜)Ù>ú·å¬³› +#ß½F¾Z…N7Zkè†]=•ÕRü· φ °�ÝÖÅ•Ç�è1ÿ$ý2 +³±Èš>}{ÂxýæCh”DÂ#£¦^"ÐR0DBLŒäJÍd†8—›jó@‹¾»z!<‹k›�dH d �™".ÁC4†³Y¨ƒ ¢GÉž�œ#ãFÇj(ƒÂI½¨H&ýw¢&K:Œž:‘ Ž£$ —³„h ƒ�ˆƒXaØEØd¾g  &Â6ðM¥Ói6¨ÑIÕ'“:tX€ÎPð’·wKð\™ò@Âl³Õ„ Â=†¬2ðFÀÂ><#Ûz3°‚aòcôh¤ÚN‚mPg+){¤Ý:V“i¶¸Uv±Wz}뽺Wþ·¤åŸ$ ÛÐÒt˜¤›Ió4“¥v/M²Õ¡¶Òn†­i†ÚN­zŠMw]‹ã¦·´ßj‡ë_]ßI°¨&k«I^:®“í«oÖ—ký~–©ÚŠM»ý÷MîîÚ_ãüè2÷ëúÒÿÓ²8ÒÕªÒÿxíHá]§ëø«¯~Ãí½†‹n—‚ “ œÂÿâîï]jG q×CûèÈpÇô]aªþÃØ{¿¾ÿ¯ž.ƒ×ý/ñÿ‚¹}ùu‡0×õý‡[û‡·ÿïíÒë¤ãõÿÿÒëý?úL5ÿVÒØûxo ?ÿ¿Ô‘‡ø0‘,úò3þ·[ÿÿØøGÖÿÁ¼Ãÿýû¤—Ž’nDéÿ®y/?ÿÿƒø �´°{ÿoo ÿú)ßžôð¶?4þO;u†ôÿÿØ{ÿKtßþ¾¿ZO}Öë¯ÿÐ[ °ú_÷ÿïÿ¥ÐÛÛ¯ûîÝzêÛî«úªÿô¶†ßKÿ_÷vÿõ »ÝyäùåÙ¢ßúÒ»ÿÿ×RC?úá'|�—¿n¿ïÿ×Û:un¿ÖµÝizZM¶~ßÿÿ Î¥þª��W®­û¯~ÙÓÛÿùög·M· î¶ÒÌzM¤�¥­±KPØpÿä»äÁÛÿþÛºÒöþëý³×Mž¿äAÃm†Õƒ.ÛI4íS´˜«I´“°•‘ðƒM„¢íûÿÿîÙözÒ<ídQÃl令›"å6*Òb“A¦œlT0EƒØ"‡®ÙìSLPb>8Dqˆf¹QˆÿÿíWM6ÛmЇèp�ŠA¦a œ$Ó &EÐ+4Â41hžŒ�ƒ@�0¬D1!Ÿe1këïÚwÓ¦Á2-V„"žbîhA£²ÝÊæ—¿íK1ò†MŒ÷ý¥ëÈlð×uþßÅ{÷_ŠßÝkKá­¯d=6’}…µáªl$È®N!„ Â;"‡@ØŒDCŒü€Á”¦Œ ²Ù>Œ¹k³ºØR¤ßyk”ŠYœ@ï÷ÿûý}÷ýñþÖ#åuËXUcúåm”¨�Œ�GQçŸù•¢)Ñ|§‘d`dü˜dtœËÄb8E ÆU™â3‚vÂ=†¬<–eA� +K�´U–VG”èè<¤ B03ƒ(Í‘ÒÈñ#@Á&¦5ØÈ8&Öö(ÎL&“$" A0×I½Ü›��¨i©£PÊFgˆò'Ñ ˆØÔØÂ6IÑÁN> ñÉÌÐð‹°Ñ±„ÓMBi 0šM¢8l´-ÛÖÒ½„¨3Κ}›KI ï›h3‹œ™ÏÌ#ãd[#ôzð™Q!i8VGà“î“è'I†™ÆŠÈLñ ›Sæ“hê0¢—¤µ¯»·ÚýS÷t­'a4 +Ë8gÚ¢]K +íIÝÒô›Iºa·¶­î¾ßí=zOM×îèmiu»~ª¾›Iû­ýkw­¦Òß�þÚÿéß_ûÇ_þ—·×ï¿îêõý} +WNîû{¢ÇOÞøøKÿýÑdÿä2@±˜UÔŽöÕÿzußÝ_ÿµÿáÿéÿúÿÿ‚†ßÿÿ^Ýuÿêþ»×õûõ‹ýºÿÿãô0ûKÿõýõëÿýÿý‡ø/û¥ÿ’ûÿý‡¯ÿÿï_ÿÿÿÿÿƒ£Æ[¿ÛKÿ/ÿ¨m´w×ÿÿÚÿäéûÿÿþÿøA}ÿ¿íÿ†úµÿÿý/ß ÿÿö¿þÿ¯·øe þ´»ÿØvׯÿÿqïô¿u÷ëÿýÿKßèûý_Wÿ»ôÁÿþßÃÿÒû¿ý[¯¿ÿÿoÿúµïÿnÃÿÿýöÿý·¯^µöÿ4ë^×oùP×I†z°Š°ÿù©{÷ÿ·ÿö¶žö—úO^ÙþÕ¿þE>õ¶28šLS{a�øÓº¶»×ÿöŸì;ýË®ýÒµí&ÒÓc^E¶’vœIÚpÓm‘ÇA0±v—ݶêžÛ/éÝ« *m&ÆÅÃa¦ ÚIÚv“i&¬i°›#è,-´äD� mtzI!@C@§Ù8CF\ ÍiÚv4Ó°�§á;M ;TÐø‡iªe¡Z;0ÉØ)Ùt-D'jˆz¦ON.…8‹‹ðšiéÅúqjœhœ9(ñÉãD®‰ã,а@ÊHž¨nVµAþ“ˆî4îôïNä[qÉÛ—Íç¢XäwÒ—ÎG™>¢|à’  Ÿ’Â<¤ôé9\2­¨G†(K9é¿ýÇ#‚-¹tO'ÍçhŸ9ôOœ–æÈæ›Wþ›§´•ëIöáS«õ\“Õ™êLd5Õ­Õ¤‡zþ“tÓÓr:&÷ý&éýê½é'Ç/â’ºKÖéýÜW×MC$çŽý ø«Yß¡ÿõõÒOŽ?פÞïM×w~Ý?ÿOõÿÕZÓÇ»BþëþTó!OOúMí>Û÷wÓïýWþ¬>¿¸ÿãã¯üÌî¿ìÕ~ézÿÿ¯úCd,Èyûþ¿þ£d,Èÿrtÿ_ÿAõS°¤GÉç#PÈA…#ßëÿý†ÿÿÿ°Øõ¿ÿÿÿ¢Y¾MuŸ®v:]SÈ�¨‰¡ê+Ȉ*Ã!(°ÁÌ`‰Ô #cGÀã3¿�ÿë¶Ýä3ÿÿ�M8Oÿ¹4ûù4ùißý ½ óº�'Бäj' �)äHEóâH"Ž@©äxú=„lj~dFæ4n¤é?‚44›We£û_ÿÞH#(ÿ¿ÿþZIпýÿ¿ÿÿÿÌ‹Ã"#Vf/‚»$#lè3„ÙF°Ñì„k £Û’ñAš]™Ÿ’é¹:D$ÃI¶Z-4• Ï4­'WfCm+¡×ïßÿôL=ÿºßÿûoÚ_ÿë’zÿÖÚ¶fÓA”L‹Éð‚m4ÚhÎKI°�m–B Ú+[M$Û.—õ¶µÒõzIºÒ»}ûOÿkÿþîý¥÷_þ—dù¶æÿþæoïlûÛ>Ûÿ­mt‘‡‚A7çôƒaiÚ +‚t›¦Ý&ñm_Òßý[I§õ×mHáô?·M×ö—flÛÌÿ¶­¥ýûan“ö×þÿu¿Ö×þÕ�µ@›W¥ÿJðÿ®¶·­ú[ikï꿪ŽíґµýßO!Äÿµ×ÿÛ[WöÒö*×û_]]{®ý†ØØö)�þ6DÅ4ÞÚª|{n>êñ¤ßO]~‡ÿãê>úòÃøÃƒý¯±M¥ü4–Ò¾þ?iŠþ+b˜Ø­Šÿb¿am?û†�§wt£é/nºÑŸÖü~¥Á0Ÿßú¯oH}(6ûö˜ÿ�b˜¦+kÚkúÚi­¯Ý…á‘Ä5†#¿û#Èá…û‹úåûß×^]Wëõmhô¿_ëü6ÃÿaÿÃL/äÜ-¦šÃ Ã0¿— Âa8aSDÑ„CB#!6;{Xþ··_ÿïÿ_ÿÿû¯øl7þÿa5ýSA„ ÂЋA„"97Xkÿûÿ¯ÿÿàŽ=µÿÿÿî¿Á°ðß· ïý¿Ç÷Kÿÿð“õëÿ¥nßöÿûíÿþÿÿïð‚ÝÿûoØoîïþÿÿbá¿Þ¾¿ßõô¸¯ýßÿûûßöÊEÿý®²„Ýý®ÃÛî×zÿ«ïûöÛ÷oÜëæ:ý»¯ÿ†ºßÿÿ¶õÚú«·ëíûfŠÿ³5ögõ¤qßÙë¦ÿô=i6ß½o¶½­½í™êß«~Ø$ÙþËËM‚§°ÂV•«È–ÂlU¬×§lÏÏÛiuݶzÌm¥ö6˜`•Ã#‰ìˆ9^Óbƒ“pÄ+MˆL0E˜p­…xa2*0ÂGBEvµ–E~f`Úéqòn­™geŸÈ)•ô�)+™¿Ô�?ÈÓÕvFŸëþ:}_ÿäÚžJoütÿÿ¯ÝoòO#%ͱ dã$ ÁœfÙ¶3lÐþN5*©  ˆ|˜ @AøM0˜Më§ ¶N�ÂÂh4>-Ðhqíuðšè;“›Æšû ¼�ü0M¯TJØk -érxÃ'B;hž9>òXØI6�yýS°\Ÿ=ëKéÒt¾�鿯ëiVúM÷é?^Þÿë¤õí®(ÿ_¿t´¾¿ÿÿÿ¤ÿúÿ¾ÿñý[: ÿ·\ÿÿÿû®JlÌÿ×ÿÿÿ�H_ýÑf£°XȲ7i×ÿcä;‚ÿÿþN¯ûå•$W0ÎÔkíÿÿ\˜Íÿûküa{Á…Ý/ÿÿ÷V×ÿ4¿ú-Ôº}ÿÿ¶»ù?ýÿý¶¶¿n›ÿÿ[ÿ­°·ö“kü;V?‡þ9Ø·ÿ_m/ÛX~ÚV ý±OíÓY’—’¯_ö°{¿ß±Lí28û¹e‹]s²úš™Ðó\FÌû: Öfy¼ò.¾ÇíuµûL‹Ü4?½yÚÂ#‘ $ôDX>J"ñ#²4ÏÌ!&ÞÖi ƒ‚aíšaÅGÝ‘û[á„4!„+‹˜ˆäÙi��<Ò"©Í‘ÐR¡2�™ŒŽ�'N��“5²‰ItÃSQ3øK ØA „“I½tú"ÅlÂ45pš+.ÔE„"!‚,¢uå¹¢6Gˆ‡—Š#Øfp³<@ÌÌÍ£[Bá¦�l&(Ô#u(Ü„ô›K[e—L%AiZL4Ý-–€›WÐ&ÒmÒñ¾¢1j‘n«&šai2>BôèŒvíúO& 4›‘Àa=&Òt›Ažl´ijûꮓjêÒNëãµ´î»»ûA¡pÏ´�& +N�ô/¶“pMî•â—MëjénÝiz¥m |„~ïõþ•Ž•/]u{›ôúmo޾¿¨-uúþ‡¶ïªïþ>íö;NéuáUßÿÝ­Ðí ¯ÈáWé×–9þ+ˬ?ÿÿXhëÝHán¿ïÛ–9ùc‘Ð9c’Gñ­v×®†¿ÒaÿúÿQwñÿþÁÿ�ô0ÒÒÿÿ×}}¿ÿ íÿõÕ(ü?ÒýXÿ®ÝþÃü7ÿá?¥ÿ[­‡ÿ†ÿ÷ðßÿàŒÿ_ÿÂý†ÿü%ûüžÚàßþÿÿÿÿº]÷k¥øoÿÒþÇþ–è,7ÿ†ÿ¿íïû½/‡ûþ¾ïÿé~ÿô aÿðÿ¾»‡ß×ÿíëU{ÿÿÿÿ¥°Bïÿ¿÷×}ÿwªï·½¯ûgN¿ÿOÿúáoÿÏ/ë×s¯·û¿ÿßdéë׳5Ñïÿì‡ê×ÿUs¯ÿ}ý¤Ù:ºì�ušÃ?·}ß¶›`“i,ŠáÃ#ᆠki¦˜MSˆMÝÿõÙçÕþ½zM‚Z[ ½† '°Èû $ÇmÁ´›ÚH8[Ä&#ްšwúÂaz®œ0Ž8vfäÒÓØ»I‘ki1V’ Šm Ä$Óbƒƒ%ݧÃ%a1�b" Á‹RÍ;NÜ]¶(7A5M’» ÂG€ÁQHñ1@ÂG9ñˆ0‰¹’Ê×*Ù>Уž ɉˆŒͲ”LŠòÕ*ÛEkõëõ¥-*�JÒêYMAlô­©Ù¨ ˆd  ƒƒb�"?ÿ-”´wY•é +çg¥¬S"AE¨’lÑéÜ(G‰*H˯7È… (E&BPˆ`„â)r'AD™9öGȨ‚ #a§ ”A4nilŸƒA0Òm]„{i0Ùh ƒj� *½4ÿþö²¸‘ãH»†O a&e&Bð2c0hÐÔ#cÑñèÐÍ/Îä+ÿ¦“T›DX +¤Ú péh&Ñ>I½VñoƃÿÇñÐ& Ð'Iºy1ú=´›MB +ÙhM²Ðƒlº'Vd1v]/ïJ+‚}ÒµßI×Ý´›}&÷Ö‰åÿÒu´´­]¡Å°•…»¥oÞ–¾ßþû�íã¶—ê9+×û®Ö÷¦ÍBþ©iiŠW�þãOþ“z[ÿÿõJG +Óºÿô½>­ý7ü:ZÿäR‘qè.’ü�ªû©-W©.¿[õÿí«ò3Ûªuýqþ¿ÿØ}ü„f¸Ôòr!Œ�?<ÍbÌ �!8@�‚ »90ƒÏI˜`«]¬wÿ#�ò@zmÇÿÿúÒÖÿô¿ÿ_öȃÁ'h „„ÖÐi§¡ú·ã°ñ`ÿHuÒõÿÿí/ÿÿÿÿÿü7¬á¾šh=ƒAþ‰Øä®‰ÛD톑<ú'�Ã¥\4¡ÿëÿªÿÿïÿÿÿÿÿÿàÜWôNÚ'm΋Ƌê/ºôôÚ ºv?Óý^ªÃÃ}~Çÿø#?ÿÿ×ÿÿþÿÿoü?ýÝ7Mé?ï“ÓíÐ}'úw¬Qðßþ ?ÿ„ÿÿ·]þÿÿÿõÿKõoǦñÇ÷ô»üõÂX7a¿ý÷þ—ûÿö?ý¥ÿoÿ_¯ïH~ŸWÿKÿ½'õý¼Þc0eÅ?Z[áÿ½%ߺt¿ÿý÷ë~ÿnÿm}ºüç×þïî9aÿ¯#½‘ÿ4 ÿHDEºîïûë÷ºúþ½ÿ÷¥Ý7ÞÛ½{¯ýRúvBP„¦6BP…–}â6ÿÿ^×9öuÿïý¾ë_¿ÿßlϵ·I¿M³ûgû]´—¶ÐIëiB ü0Ãà 7ÿü7ÿ¢ýº�PäY =}¾®öÍ­Ùõn’Ûûé°ih%m&6E{Å'i¶ˆI¶‚M4Ø`Š* ü0Ö0aÿ¯ËHÿô¿õlÿ¿Mž¯õl9Ñ9‚ȾÒM¶ÓdxÓA°ziÒa‘)A[dt‚dqa4A‚G‰>i ƒ +VqF´"¸KüègCò�ίÿýÿúÿ}Žv“i0i Ø„› a1M0Ò út™@Î'¢*ÞE³RÄFËp Ý/µvýïûÿ'Œ'Û_¥þ(0švEÐ"�¤t�Â#t! `„1 +T�Ähh/ó˜n¹8�zjV…„xa&ÒtEv‚m 'I´i6ƒ8i?µc… xð˜m®¿x×ÿÛZ§Ý'§Û¼·ËÙt:%�ºVº�P¥i:M¤énþßMmõ­¥»þéV“{¡ëÿ]t¸p¯ÉÝzvûÅÛ^…?V·i×½*Ý!­¯Žºáõ�ûòÜ•_ONH: û!fB®¶üRúÔŽÚt7µ#…¡Jß­î½×÷Ñc‘§ü?ý_ñÿùð|œݶÂ÷­§Ðï¹c‘Ÿ|ŽõýÿüWáþ¿ÿÿôG|";þ ƒW¿ñÿ—X{ã°i­ÿ·ÿÿ¯†ûÿÿÿú.}?© ކ/þ¿ì?KoÿÿT¿ÿü#�öÿ42;ÿÿßj¿ýáÛoÿÿaÿ°ÿÿÛ”ÿÿÿ üë@¿ÿþ¿U¥ï˜NÿùÖðoüÿÿöëÿÿÒü?éW¯ÿýuÿÒƒÌ=Ûýÿ‡ûÃßÿí®¿ÿý„¿Òöÿ¿¶“}®ÚÚÚ_øKÿoýýÒÿŠb¿¿ÿ×ÿõúöÿkkkz}ÓjÚýz_öý7»Ýÿ{ +¿ýµüçþ½º_f‹ìS ‹Ø¦)ŠÝÿλëäMvÛ׿¿÷ÿÙŸÿÕßw·K¶øa2ì„Û"Fƒ „«¯Uý¾ºo½³M»KÛÏÿûf붆N÷È—Nr(Û a6*ûA…L' šh4@§ÿ_Û3Û[I³ÿÓiYéÕm†C´Ý¤ôؤÕ;L1N.šm¤ÂµiÚmà +Z„›¥ò áÚì0K­&);IŠ PmšlÓuªi†»@‹äøƒ +ƒHøV…a¸ˆÒm$ ‚tÓMІXH0“`ÂL  ã¤k+ 8¸Œ 2�–Ò ã �l£h4Š·*Ú=Á‚*�;3Äe¨S$W<#[K[ º‡c¥Æœ ãÿ– iWÊi*Hèf¶ZéòÜ6vjÎþ(>P.‘C7=†Bß@Ô•=#áÓAé ˜i7òÍOepTã^‚£ÃGðúIµo唨3�ŽÏ^ƒIßÂR:zO®écÎÌÌÈ»õ*wŸzŽ:Hâ)^’^ß;+‚ «ºõþ¿I.ŸKÖú„ד޿Ç-À´¾¼}#þ@‘UN?.Úõ¿ÿæ¬é—×üÙG39%úr" ‡œñ„kxGÇT›_ÿÖÎÐΦKæ‘Ó6ÈÞkÕCd}J|â6DE“턘iCøiÅ«´–І¯IõyØ Es _üîíJÿ“änDJ9‰‘NBhR Aì�@EØF€e@¨2ˆ¹Žaí0�� ‡‘ú3’Òm&ù*é-é�÷ÉqI”z(²œÂ„OÓ´ÕÓÿTÑVÂ45MÛ»,„ÚL92ðá3Æ“jÚ%�¶�Ñôµ|R´�ý/´ž›ÒïÒØ¯jÞê?�•?8É „N×zM? Ň_DnýïQa¶;}ÖÒm§÷I¤®�ë„ÒÞ)ú_û©tG×µ"ÖíÒ[ÝöÒD9ðý Ó¿íeãEó®_9>²Ó“ï Mø`Ÿÿ§ýSÿÚÔUÝ­Ûqƒ[ÔŽÛ§_B5ðÞ—zÖŸ÷°å§°ø¯èŸeõÎêA�ÒM¥ú][Óý?úNÓïÿMýî•_î½i 7¾–íÒ\¯¾þÃÿôÞûºí¤“Ó{ÓjúOãÿïÿ¢Ç#þ¿_þùiÃa¤5·ZúûzEÿ<5·ÿ¿°úOëxãûŠ¿«×ÿÿ½_þ+ÿþÿ«ü6úÿþú +ÿK�ÏÿïÁú�Óý×ýÿÿ…ÿS«ÿ¿þÿÿÿÿ†Øõÿÿ¥ ÛÄ4“õýû}/û†ë,"¨þ?éüÌöÿÿÿÿÿÿ÷ü þÚÿÿô?¤FŸ¿ÖŠwáøKéÙä%?ÿÿÿ¯ýßÿÿÿÿÿíƒ÷ÿöÿé{Þ×ôž÷è/ö †Ýß!\©ÿü"]ÿSR3_ÿ¿ÿÿÿývïØ}ý×Z]õ®­¾y}/ðl7®Ÿ-:å§ÿü/öñÿÿ×ÿõýWÝÞÿ}õuÔ¡kú¿Ö•ßKü†D2ÿÿÿµô¿úÿÿí¿ÿ¶ëÿÜÔ³oýöÝ]i/O·M¥¥¤ÛgÿK„Ú‡ ½h·vhÿÿýøÿÿ_ëÿm×þ»ëÛ½öÕ³=Òt®;J·K«K]†ºõþïk­ûfoÛ3Úþ¿¿ÿþÛ¯iýÝ¥·Mž›N¶í°“ii*ÚXM´ƒiZI„ÐlBÛ.—êaæÓ¶—ÿýºÚÚÿ_ú·ÛgöêïÔ6{tµí$Øg¥i1Ln›ÚM„• ŽmMìBd‰„G+Ž8#‘“± W_n­m'�Ïi»VÒöÒøpÕµm?ƒ~Óû�ƒ¹Å6A6BNa¤š ; &Ú ´2P†xl’pƒ�"!†±ì7èÖù1¤Þßé[Å{öÇ_·I§¦š°¶˜M‚8êØ/ +AŠ:è¬düBGÆjEuF!ú Æ~)Šbš÷i¯kÝ‘bȱdHûòµh¬(¼¨EpF"-¨×ÿÚi­ªà ¦š !²ˆÖ„DrÈQÅü‡ÑadØ­¿“`Gû¿ªƒ+`téu�þwPïEÓb‘ôZ6=ˆÇùfЏ‹²2–R–JÙè‹Ë÷ü“—þÿnÿÇGòÔ+¿ù\Ó_ÿ•ÁQØTF2ÜdJßÔ‚eH³fC`³A¤k‚f𪠼²ª#„Cz4 g#ѱ‚ ÄqšG˜'„ÂAá2½cIHˆÈ;aô¹e)i¦Ÿa½„ÐÿAÄ4âô /÷w-Æ1ÉRñhzoÅ¢OýÇ%tO�‰ãFçÿ†m‰÷×ÉcDûËè`¹> OýtÝ=7Óh+KëoþïOO¥¿º¿ûÓÓÓéi6–D±ßòM<Ž�Vr%Ò� úþ?]?øøÿÓfD�i~ß’Ôv"4�DA‘©Ì#1šžН ˆïÁd™¬?OOßïÿÝkM먽kÙ$, y2¤a”8‰ÑÓ@°ã Ï�Œ#c4“Ѭ�Íá2> ¹í Ítƒÿoý'ý‡ëý¯¤aæäÉF#ŒÔ3\uÍ™Î#Ÿ"?¶C #Xf†|ð�Ô|±“Á�Ù?'8Txh+ ÛM ˜hzN&•à�·¦d+ÿ^ȨÿÿÈYó@¿Æd(4DWKˆN5†¡v¤š„G"`HØû‘l é0ÿK 6“h‹uÝÓÞòÓþÒÿÿߨÿï_Ú]Ð"ÇÿÿûýoöÖ××ím-½t^ß°ýßö×ÿÿûÃÿÿûim¤_¿ÿÛ]¿þW^ë솻 %é%íÿÿò�×ÿÿø7ÿß¶¿¶�lB…ý�ÿcâ ÿd øö+ظ®(ÇéD?ðoÿûý´µÿÿúßÿÿá=kø}ÿd ú ?á„싯dXÍaPaéAÿÛÿý?õz¿ÿõÕÿ÷uaß®~Ÿýa„ÖÂÁ¡`„A„"")zECëÃýýr£z·Ç×ÿo[¿ÿw[úú®•[rÎIŠúU¯¿Oë¤Ûý´ëû{ÚùÏ×öÝ{ù +Œ‚s»§Û3UKÒÿÍ?[úÖï§îµï·­zoþÏíÓL3Þ¬ƒûaȃµ Èœ –r‡ªé_ý7ë¤Ûzí:MûvÃ=6•÷Vã´ôà $Ú +˜ ƒ†ØNØO^AS1 +ÚZÜ~—}ZMž®ë[låÕm¥!{b›I4ÛVTíˆA°�† £ûF°ól!!dMb¬#¸yyS´“‘!¥i1Iá˜TØ«Ié´ A†JaA#Ä£ �he ­d„!HE â40ÓìBÂpFs¶ Eð‚ q îÑU„ â!Š&Å3«ö4Уc£RÛj®–²×ÖÒëA%ô•ÿÒm&Ò¾dAÂd:—è'ÁVÔDF˜AË4ÎNkrÊÎÆã°q0ÔDaù؋ߠ^#ÿõï_2üÖýš²vS™â`d1•“ÆÙˆœŒ3Œô0A¬ g §‚I ÓÓL'®ýÕ¼XA âµã“·Ú�Ç%d[a‚“ì¼hŸ`´O¼Ÿ4Ÿ°RSOM;]¤é]tþôïzI½¯§IºzÒúÇËL*—þ·ÿöëßõË4Y¨_I7ÿ_¥ý}8\²ÿÿÿ�ÿÿ> •쌋cr©œT[µëÿÿÿÿ×ñb¿ßÿÿÿ"úÿÿÑ?éa„ïÿÿÿþdŸïýøÿÑ–¿ÿÿÿïÿÿõüƒGa?ó¸ˆÿô¿þÉçKíÕrYþš©%ÎȲAãHêda�™‰“ˆN�³ÆGÂMý¿ÿô¯÷_ÿUýHLÔÈÙ"%Æ0d��)!P�lÓ@Ñচ6Q¯£E0¨#à›ý¥ýûjé}¯öŸå:"¹ÕšË524G@¥Ñ  $BLÖ#ãT| ¢L#CØGÆæ–“i£<#D$èŽOAôœ!¤ÒPþÚÿ~Ú°×Øÿbó"ÑÈ€Î9C›ˆ”"U—å ƒˆ#Xy¤0� #e¦�èÙL&é0ÕäИhi:´“¥„Û ´´ ´�}+“ºÒOö+ø~Å1^ȱýð��¨H]B74ÓQt™&õE½[IÐXY3ÐLAœ9hMÓ½6‰:KªJÒ~÷ýÝ/·ð¿k÷ö +°ÿìŽí$ÓP�–„ÚºÚM$Þ›i:Nº´ªÜ'um1uzÕõõ.·¯þô¿ÔŽÓA„" Ј0„Dr¸¾ÛûÓjÒ_Kíiii;î®ÿ_­¼/Ð×�ü}ׇ�þ1Õüu·Õã÷¯×}ê÷Õ¸k^?Ër‡-ZÑc?ýpúïJYŠ’K}ëãú¯ýl=[ÿ¡ÿ×ý‡…ú÷×Ãé·þX/Ö¿ÿý‡þº¯ÿÿá¼.ÚûKo‡ÿýúÿÿþßø+uÿùFÿá¼#ßtØ¥ðÃÿWUýÿÿü諺 +ÿü ¿ðú^Ä.×íÿ�YÜ/òMTÿÿü?øKl ¿ÿ_ï}/½qüÿJÿQïÿÿûßzÒÐBí÷ú_ûëé_÷ÿ®‡ü%ýÿëÿOÚë­ûÿ¯·œÿ_{ÖºÒÐOþ¾ÿí×÷¯]¶ûý¿Î}ß!Ž ÿµý×];ývûÿuýº¿µ×�Oš+VÏߨGûiÝ'È£½¶Á+ÖBuúmÿ­íý÷_z]6ð¸aw † +áÛ"Ž—M†Ý„ØÛKAÁ8A¶…µú·^Õ�gó×ú—ÛM´ï1¦ék"sJÒ‘}„�n-¶„cLBM;­pÉ@LŽ�C>Qéáwåæá,Ší¶ ´Ó† SlRa´i°ƒ›Pé„a:÷•FAÉtJQÚ¼DDh8Û &ØIˆM„�pWlBÂi¦ÓLŽ �„¢ÂEe’ «dø0ƒ&S±ˆ8ˆ�ᆂÖbAˆF¼FQØ0BŠ6)ëòÖUœEZúÓé%iV¯KK¥¤!ŠÚ²(ç Á[AŽÄe¬²£å•LÎÎŽÓǨ i÷;*3©a?ÏÐA Ê»DpµÓ ®�üz'n]µÒôé6¦ÿ¤ÚN ¤ù“Â")¬[ûù٪ܜS „1rœCÈž>=)¶ +ZŠ‘ëÿ"(hôQ(„ ÐùfÎњļ ¶ºÎ2CÐi§kHœ4NÚ'tO>‰÷ÃÑ7ZeO +¤«Uø¥_è“´NÚ'�ôƒi6�z¯ÚmAvÓ÷zŠþ�麶ÒééëIþŸÿ-ë©×÷‚I¾ûþhI6“i>þ?úZNîíõI¼qþBgÿ¯×öò�ú‹øæý/û¶Òúz}ÿÉÿæWòa�¿;i}l"£çSÿ¯üø'ï^½þ¹ì¬d'6Y8¦¢82ti~ì„ 7­ÿÿýßû_õ2‘Ör:‘NgF¦ó™xÜo1‘š¢!%°@É Â68ièØø&žáþa‡kÿ¯è¹ÿès-!D¤ää‚ȧ"§0eŽdï #@f˜M±AŠb�I}„hhˆ8hi7H«I´ÁœkÛKü$ßýmÒûß+¬£2Ê|Œ3æC�¢„n{ …&ÈG‡aÃØF¹ó`Áà�·#†“„E¶‚Úa•-–vÚ%ì"1é7ˆoK¦›Q�‰Ú_¨86õkk·ëýv¥r�ž0�açÍ“™�„ÐP¶�n’p“l´-'JÜ?ÕÁ6—k¾’«Õm;CÞúÛµÞôÞý«¯ÿë~¿±M4�aîèŽÚ+MÓJÛ,±«¥¥¾¢•Óuî“íî—ï·I7ß½ý/ó Ì7ŽöÒm&Öý{ûúJýá66ºŠMÒN—¥¤ÿö¥à»¥¾»}kþûþî‹rGü;k^ÚW·´ÚÚÚV­«ka~úMÿî·÷¯_Z�zcÓ×Ú¿ÿ·«ÿ�ì?Jk|‡sãW]-�Šccc�‹ûk¯ý§ã´¾±ññþŽÿÿýÿûÿì;iH/ž-ŠŠbšd-0™=‘ȯdH~ûj­ÿú.°{ÿý~ï_]»¯ÿÿÿÿ Ø¥ý„¬5A„ kh4¦„ú¯ÿöݯ꿰ÿ¡÷þŠzÿÿÿÿø7kü4Ð5•ÇÎËÙvÚÿÿíÿë®A߆ÿ +ÿí®—ÿÿÿÿ¼0ŠæŒ¯ÿü7õ挎òøA~ þ_ÿMý÷ÿ¿ýþñôŸÿÿÃúú íûß ¿½´¡ÿÿ]®¿ùäÿõ¿ÿðÛ×á/Kuýþ—÷ã~ÿõúëoûéguëÿþÞý¿]{_Ýÿþ÷÷ÿëu×lÑÑî Ó ëÿ÷Öý}UÿÎ}ékïÓíÿÚ[uÂ[ ë¤�'®×ÿÛ:{ÖßÿßÞÝ7j�û 7û¶Ëýé&ÚV°Ä$ÓNèGzÛ_ÛÒm{\"‡Ý‚l3ÊÁÚzMœ­ØE;TÙôÒlˆø¤Ó´ °‚•„‚°–öE¢‹M¥÷ýŸMÓh-ŽÃd[#†ìÙÁö“‘Ý¥‹¦­0œP"øhXR­¢±Ñ¥!ˆ#° ßm-�4Ó Š8Ci6�A†GšiÃM4ÓLP4 ÁÕÂ"6›J'›÷F!JÆE“J ÊgU¢?òÐhÌ�I9haU9hy +¨´ÉWÐZÒÊãŽÈòh®i6“¾9Ø*Ãÿïÿ[oëmpãKIµ—D)zô›[Ý.Ón¶Òßm.ƒm u~«ëa¬\=�bب8¯Ø¯³²”:·êžL"dy Ž„L‘DSw°½§ ml/{¯RÝ/ÍQä‚™8d1HÌÆpa!B40Œ8aÃ3)?à ‘nûXdwiÚA¡õIo;5�DC.Ž3YñN)DGކGŠ$h@—ÖÂhØa„g$.�m~I†äÔaK)Ö:¢;5Ȉ¬ž„€Õ:!OÊ‚Îx#ÀaCÛL Â6†v²�3 #sPš å�ƒrgh¬i6Õ*Z +Õ´›Ýª^}0@‹Æ�a‚†Í0�æyžö~—Î<+hXFv“i +Œí&ÓÒmÚ Òm3í-Ò¶±m+}Ru´­&ÿþ�„ ´ ›Dpå‘Dv†5í—N“¢|¥j8¶•¦GÑEMý}Ì5ÿÅoÿµuÇÅoÿèØÿÇýX�]_ÝÿVë_ÿüø±Èâº,r:‹O÷ÿþÿý‡þÃÿÿÿÿWÿÿÿA‚ñ`ÿÿÕþµÿaïá‡ÿÿÿûuÿÿøñöÿÿzoüÇÿ†ÿÃÿÿÿéõÿÃÿûIÿ ÿÁÿÃÿÿ÷ÿl=¾Ûúþÿøm-êô¿öõ÷îëÛþ¿÷Õÿïíÿÿ„P¾ÿ ÛýïoÿûÿßßoV–¿íïÿÒ×ÿ÷~¼ƒ[Û®­ý¥~Û««fŠÒt¯¿ïÿøKzõ_ìéÖ“zöÛuö¶é~Ùê¶¶ 6“tÈ®Ùaf"=&»gN›ÿþ›Kõý³?[VÏßMŸÛ?Ú^Ø#ŽäNi2-´Ø­6Bbƒi6ž¿ÛÕ³?ïöAÀ×]ȃƒ¿a„›­Á„–Òb˜ é Ó Ya6GA(W°‡a0ƒ11Sâ2ЩùR½[6î› iÙ]6Pšl&“ ¦Ä(ai! Ø`ŠaaÁJ†Nƒ" B-Á†÷Ö(4b›&!&›š~”B´á:<`‹ò­ƒ1ÑŽÍrnHøèøÈŒ0AŠ5±•ŒDEìë$dÿ&ù½ ¿ª»"ÉSL„ÉxŒ<ˆ hˆœŠsá$[¥è.YBˆàÉ3PCH f’= M´ì&ÒYJ¤Ó „ô\Côu„ZÒñœœ6‘<ÈíÈïèž4OarùÉó—ÖÁ$òxKœ¾h ÛMÂnoÒtž´Ÿzv ‚Né?º^ß]o¤Ýy6<>´›ÇžŸè4?þö:ÿ¿ÿõþ¸?û°ð´ôÿ•}?²ªcúÙ I ÿùÿì?þÃ×ÿôE�ÿ” ÿÊÑÿýÿÿ�OýçSÒï¿ò…_ÚûÿÕúõ×ôÒÿüÜÿüÝÿ}þÚÿ¶—ßý´¯ít´¾û[ïû_í®•ëkkí¤ØNØKØa/ñLpqqQ^Å1w±^Å 0��Žåº–ëÚdX¾Âö‹I=úa4á„ô¦ˆ0ƒ-0ØS²ÚYÀ¡É¹¦I#²÷íBîÿɸ¥ÿ°¿áÿÿ•ËWü›©/Âù’§è› +þJÎÖr?’‘,œd1MF@Ìø„À‘ ¯�ò)yDx§ŒÙÔh‰B:Ë™ð� +Â_`ÌÌÍᤞ0��£a>.dèi™èÜÑ­ËPµw®r5 ��0GAÆ#<ÌRb02†Á“£†i„ ÃTk Ò „~²;io½'CI°“îG4­.¦Ì"! du:lh„è@Â60�M +±ªp�;'DpÂ40‚m–Bm vƒ +”6õÑ'¥¥¿TéZ½PfŒÍä¸Î £×„g~¡¤ÚO Ù ›i„‚m3Æ–«A0Û«Òmu�é_étKtÿã­tE‡»-"h4²Ñe¡ºV—:·ëtÚøuë×t¶‡võ×q�m¤1ðM¿»ÖûoºßÓi[ê®õ¸¥»Z‘Âé¯UÓº “_ü±É {Þ¿ýq×ÞúQí¥ãûò:h^Ûµÿ×åÕÿÒ´ýîÞþÿ¢)Ým½9ÇÿÒ¸?¥ÿÿÿ_ýÿ,·õõ�úÿþÃmWÿÿÿü‡÷ý´×ÿýwݵ÷]ßÃz;ºÿÿÿÿÿÿ¯ÿð_þ¿4d{gÿþ ·ºÿÿÿÿiý´S×ÿü#Gý×ô  ÿï}+ÿÿîÿ÷_ÿûÿÞ‚þÖëð— ¿ï÷aÃuþÿþÕûiiýiðïZõÿ~÷Þë÷öþÿÿ×ñ±_ÿÚú½?Òÿÿ{åû÷ö»f‰¿ý³Eÿý¯ÿ÷û«]½uõý¾þ·m/Ûû˜jØEûa‚PØ}/ö¿þïOIé¦ÍÕÞ›¶z¶ÏKM¤ÈAÞÅ ÃÆÈâ˜L1Nÿ¿¿¿lú°FGô›KlÒ‘]í¶©«Å ÛA4í¤Ái†JÂPÂdo¨Hô=°`„v‚lOl¿Zr&S‘y«Bb¡¤ÚTÄ+-÷¦&�‚:á’ÛœpŒ©­øJ xªi6= ¶TÔ«„!ª#�Š>2lK9’?eÍé¢iˆ9\±ˆ�,¥M;¢l²ùÙS5³ oó÷ó°pA‚ “¿«ëªi¯ãúÕw.ÿöƒª6�mõFw;Ô'¥š‚~º F©7ºù2&�b˜ÏDñ˜Lô3lž9Xÿöù.) R�E>Ϙ*iú}úâ3±OYÆHzh4ítè~Ÿ¿�ý_ðƒM?Ñ<·Ò'ßDûìuÿÿ—Ô_Q|Ûô›íiþŸß_ÿúMï¾—Më¥ýÿÿý+ÇÒß­üÛ®·ãûûuïs?ÿ_õ6Ÿÿþáë×Õ­?“„ýõïÿÓ²!ÈJÝzÿþëýûm×ÿÿáïúÈ55…?ÿðl0õþýá½ÿÿ!‘Ðßï÷õô¿ïúºþ¡Ûºõb¢¯µÿã÷ß÷¹„úíÿ¯ëûE§ïÿ^é|Çé{}®ŸùeÐ̈ŽÓÅ9/m-~öÕ¾¤Ʈի« 'ðnM„ÉB‚!Pÿm#ï�cWÚ]±U±Ç½x„xn�Ì"ð?°ÂLÅ1LS[ Ù,‹E¿^–�é6�7’¥Ø¦¿ 4Ö „CX4kÄD|UÒzí0¼CA„tF�HÜhΣ##A¢'M�")ÏbÜ„Â�£aèk ÂöôÏ ‚T›IÑÚM ô›I´Ÿçu H#Ädu)ÉVZBæaÍB% ¬4B<ÖD˜FÀ× „kjšZ#ˆGº +ÒcVóæÓA–€¯¤6•¤ÒºZ\›�¤ByàŸ,3H `��B6fvDABݤÃI½4xaAµT›e¡Ÿih3ÏIa¶Ò¤½·ém1vÒñÅm!ÓU¦©·£ÃW“ M ÈæÒå�i0Ùa"Ãm&‡Jßoz´¿ëWý¾µ#ší:‘½ƼE–v]¤é‹âëÓÉÝw[IßþÜô½é'iÔŽÐ^í¯Ç}ð\4[’¢�B—¿­Ðã^¤x½Útž”Ž®¶´¡žüëHX=ñØÿúþûÿîëÿkßëúS?lÑH?5Ò~Ï]Z † m¤Ãƒ Ã�ú¯œþýVîëýëlÑ_ÿ¡¡þÃaÈ®il‹â­,+�pÒbb¿ÿým™ÿw°ÏN’þÚI°Á)ß"~’i¦…ÂàŒ"<‚¨L"«DtGT �A íÝ„qßß¶ '²(îEñM¥Ða6ÒL1L+M‚{Oȶ� 0‰sŠÄC4«,È<Ùäå"ãlm4í ƒb­ Úa0Á: +íˆR®ÂiŒÉ+q¡å”«6ÏŒè) RÌG#™³Á€@ðƒÂ …{ EòBJf† +ŠeK"l› +oûT Ðí?N/L´º×úi¦²8}"xäxôOÕx‚EóEó—ÍøAó¡SÓôÞ’øIi:N­ÿTôÞ–Ú@’~›Ý&ë§èé¶ Þ•Òßô–›×ÐOÿ½¨_ãEõÿéÿÿý%ÿòëÿþ’.åµ’ÿþ¿¤¿ÿå­¯é~»ü�œ/ÿéRÝviw½µµý~××ÝZÝ6Ÿý§u°Òí«i6“è‚ð.+cìSÅ2,{öB>[­…ØA„ uO´âÓA¨ˆˆå°TòÐK$Z kjZdŒÚDÜÏ;,Êéå;"ìQ7�4Ô©Þö°�÷ê:Oþ9Ø^L¾£æE+õùØšÎæ³²M}5ÿ§ªy&ˆù2H d R_DIžÉPœËò¾©ùÙѳ¢#åZ!:eôD9Ç&„É�‚Xd@Ï?B?0��„~fgš„ÿ"Q“뜎£*Å„¡2¬¿" L�z“ÂÃØ`“I²{ØJÒd ö*Ò`Áâ¹°&ƒ5׿ö¿ÿgþ·®Â²àÂPö¹Óa˜lT‹6“ª…¦Â¦ƒ`Š Ø"‡ ‚¨R»0šî•ì?·KÕ²þ› ´™ÚJÃ6ÛbdAኤØL Ø"‡ ©OGÔ"¥’1ÙÚ¸DG mn‘¤»A¦h$Ó¸v˜b˜¦›$xh0„0ˆ® 6/vÒ´Ù)VÑá†L "ùB t�`ƒC¥ +œìDDxˆ"‡Mƒßˆ­~¿§´“°Â²á‘E��”¨ÿÿÿÿÿÿÿÿÿÿå6j¯)Š€Ðå® ¹Ù¨/-J€ðÜìÔ5á¸Ë8XdƒWòoP-ƒPˆÈXƒW�ÿÊlo2”ÐùFTÈ‹ä´�YÌ,¶c2­Dx�l¤‰AÉaJ�1ò6ËXÒ!Z’Àr ždD~7‚FòEzñµ»U5A-U³4ˆÉ†L �A—ŸT›Iµd¹ùûGÂ}þ½¢¼:ðÛ´•=iSiu·N�}b—ÛJÞ¾ô·é×﫬qKH¢;"/.Ò}/Õ%ÖÒußTˆœÊxž(C#¿43Ìó6fÌÙ„:¸ß¥¢�éZZUývfÌÆPh2vGuš2ð jg�0¡;C\ ›UU\"ï÷Ò>´·£3H-L�iúXP‰¹.¨@—ÐV�n•}á'­&Â8úUpŠz_þ�#k¥ð�‡V¼ò@¿_¥_tšv ']-*Â40Ž;Áé4•i-¥áèîˆýФ©t´’´�]ªºZª K­~¼ÇÖo¬%ÒK¨õ�Ž¢–ºXÒ�ˆÕ%^½Ro§¤¤¹$—¥õã®:ª^’I'Õ*Jµú×ê½kª¿[ÖÐUZ¤’êûª¤µZÕ¯K­-V’]*ëZém%Ò =Õtµ^ºa­ÕzëZJ©(A/^ºªúý%J•RKI}ºê´—t—K : ?ëzUT«ˆ*KJª«ÿUþ¿P�kßnõS¡ëñQIRT›K¯ùaõÕuJ–º¤©}a$´½+XiU=%KJ–ºª«­Rúªª÷ëIA~´_Â(y¢=I(­/§ò‘¯éiW¥¤*_Ì/.¨¿ö}-._ÈõŸY{#Ê_úˆYU*R+Šü$ªºÿZ¬"‡_ªJ©)½%\½û9ëKZ kJ!\5m*Oî¡]$½%¥Þ¿KHºË¤�IV”B»‡¡X«a`–_Awl„ŧJU<*éUuûZFå\%zV:Ij„ˆJ&/ ±LB¦*¶˜L(Maˆ&š;¤•8JÏI%¶–«®• ’Ìâ ‡TÔ!Á°ŽÊˆÔ�$P»Jº†.‚­ÎuM4ìç ""¡•Ê%UÎ8!iAÌ’ ‚I²¸ÕT42ÖÐEplèÔW¬4„píÂõ ¾DE´†4 + Çendstream +endobj +304 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 16 /Subtype /Image /Width 56 /Length 388 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ 8ÿÄ>!1AQa"¡‚ðÁ2RrÿÚ?ôœ9ÝÐÌHkI÷�º}o­ã6gĹ ¹U€¶Óµg¸ïé×C&_!ò²!P-6�‰‹jXÝûmn®\žA0¡�ñlÓ�ô®›æÊ +P 3uÄ]É@‰Y$óÔÉŸ$!Xžé£A°$�õ2dq†íà$A ‘#·Yq*f;˜ø–ž]t<5Ë“*…PªDTÄ~&žºïð7ÊœG´ÛëÛ¥c#–P Æô4ž0dWA±f ­ ‚Gš+ãdݤ E‚h)À +}ù£ã1B’* Å*E½uÿÙendstream +endobj +305 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 40 /Subtype /Image /Width 304 /Length 2362 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ (0ÿÄM!1AQaq‘"�ð¡±Á2#ÑáBRb’²‚¢ÂÿÚ?ô´É“ˆc`ý7ÚÕ3Üel…T)‰n ˆé2©2w=Ã< �!~@|È#î«áý¡�SÄD›˜6ßÛ¸¤|ùˆRÄÈ ’\omëW&Gt²ñ ’ÀÎâóëáT“(bžØž$ƒr µ¶ÔT߸ÌêF…� É0=¼—ÖG”ï»®W øÉ7t3Çð?ËJnë?À€ˆ’@þD.Þ$V)Ê�ïe ÄBñ?‰¥\/òÅXje}ܤ‘tk}jÎÍ , ÜÔÙ³"¼b¶}£Mȟ´»ãaÈÈ#e¼Èt¿J’wr;ˆݼ%†½m:Tß¼çŒÝß‹XË ÞÞÃ]–‘©£^“ùÖ“›”ŽÛ3).ŒÌŽp=×÷"öúWo'F¹@Ú ý¢¥‹>LŒòŽƒÓS­ÁéTÈù 7éÄÔû\Ù2HÈ„¡OÌÕO3“`ë3o¥«‘û¬ˆ29ePŠX’ á6ýQÄ�¦ÚUñ6v +[€½À–·A¦ûýÔŲ @‹úø}¦µ²·µt&?B*‰Í›â猎#ˆ'ÔÑÛ÷Zyƒà8¿œšnÝr:ãåÄ»fÃËÇ­f.ß"ew$lL ‡Qçúiþ<ˆ@H�/ÓÈt¬|y`Y\Íù� Ò �@P¬y<‰€ÄÉ#õoNËœ�u�ØÝ¤O�­ȩÙăԟoÒ/ê(Ã…°¢©âOÉ€ãÉ€`yR|Y9‡´ûm=9OûªÙqüƒA ƒq:/Z@¹L +#`I¶ü*‹ÈêµàÍë2#)ãÖ—†F Ì�$zšeoÖZ=¤ÿ +Š`Ë�œˆ<†� “¯Ö•»"1•]²;‰;ääLÛ«®�òÅ“CÊ·÷u…Ðï¾Õ,=§Ã„aUT*ɹxÜ�Z<ŽE"Ò øïéZ똃‹im¼Æþ·ð¤ÉÚºœl„U+, ̬æ.xÖ¯ná‹vÖ-²‹¦›'äÅ•T�&|tA�HE =â¡‹µdĈBþØP¬¦×�Ðm­YS#7&€:Oð©bÁ“b`ò7ð¹?�Q—'øë§Q·‘õ­Ä2ë�®š/_3K›G ƒH L±7…çÌ +çnÍò&ThŒªU Á‹L[£WDdˆÅ÷Ûj�ìò­�0¢N¦ÏooC¯ÐÒüY²°L„Æål9NÀÎÚÏ…> \Tâ@¼RÖ€61í�Aéo£'q‘,¨H` +ûˆ'CxÒºB…+h&5¢�j(ÖŠÈ­Š(¢Š(Š MQAMèQEŠ(5•´T²öø³ÇÈŠÞ`ƨ.‚¶+›6 ¸Î,kÄ8€›îû�L÷¡~4X,È1o8×ñ¿CT9�:ÈýÆR@¿éR³¯‹ +1w,Y—"ñ"ö<�û‡†ÛÒžöJØØuµ‘?-k_3e C ƒx�Œ}mYÿ^i¬eÌ(�‘À°ªç–(u“:È?Æ•²ä B = 1'ÐÕqeDÛÆ<¦³6Q…Kt°›�ªx{†È +¦�d4ô¥Nò_‰È�A•Ô&7ŸÆµ{¦nr‘Á€™�ÖV×Ö<äRæï ²IŸÔÜE£K_ZcÞ +À~­�Žœ¢ûÆÕ‡»ojð<˜˜ MÌS;3ã!×�¹t2‘ö¸£±Ûa1¯à)ß)FŽ$ØÞ>‘öÞ�‘çôˆó¿áùÔÇrÙµG"˜±ëj\=ãfÄ2Òe´´ëFÎRI]#C¯/çGoÜœÇA¨3ûMµ«Ô3âW2Gô‘¾”gEu�™™� +«6Ô˜[Ÿº•s–Ø u%o05]úÐÝÁaò h “éêEoÊÒe äA¨aïþ[B’`,XIÜð¥t>R¢xȶðoç\Ù¿ì>&àTÔÜVz }"­“¹øÀ‘s´ÛP"z™µY´È‹Ó¹þ\œK|M2=²³ëÊ>ú’âÈ!åí +CÆê5ÖþDzÓâl¸ÕPã'rA^+&bðLyV>7|ŒTEˆÁÁv�=·ÒŸlkñ®2ª¾Õ’ €< ¶×½!9�°ÁP_v¿o±;oe‰±¡ —wƒûŒ^ -1­S+¶?ÒŒþP?ÜE*drÐq°¿·øÍO±GD`èVâ$ƒý#ûIªw+Ìg!7Ÿ1$iPÿ‡ò« T€¼XÉ#ܬd’­3jèÆù\ N7‹�L ý¶½k#³­ÈQ}½Þ{RŸ“€˜åI2yi2Lÿ)×jçî—>C„üDñvb� +:jÜo-OÝüÎ1üjðO¸ÿåÈ‹u‹é­ +s(p‘Æ †4¤�†ÿ~µ^ÍY0cVR¥T l#j¦Y*`O‡Q¸¨, +LA6‘0Mí÷�+{��:*#3È‚­·¼›ô>ÙbeȑĂ9òPkx�?*©ÆÃ�y2`ÅÁ:mµLbus•CHB³;ŧ}Λjk­ * bâ§›#!ö£5¶+ÿÑ™²:Ùq3J™‚¢?ÔE ΄¬À͇m‡R)pöê99R �7¸»4XìXéH1»†g[(ðúÆ·MéÛ·…ÇýE ëH*O£lo•˜JykúGçëYñ±ÊŠ‘¯"M¯¨‹úÒÃábKÈê5™ó“>^Uísd\qŒ’X…"WVÕˆØWRäc“‰[A3ÓK}çҨ犒' Ô×ÿÙendstream +endobj +306 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 88 /Subtype /Image /Width 296 /Length 4478 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ X(ÿÄS!1AQ"aqð�‘¡2±ÁBRbÑár’#ñ‚²¢Ò3s$ÿÚ?úNdÝ•:›êæ@‚ Ðx¯°5—Ç•²�¸¼ÆÞ®d‘©µ'VDX“¸j ºƒÕ6ÖÝSKÐUÏ´�1$<Ÿ²­û\~Ÿ¥/ ú�¿û÷nùÔ{¬M—ÓUxƒL�Ö&ðA:s«ãÁ¶Å‰1'ïá\à×**É9,Ä’eJ¿J¦lÍ�¸a1´>’£ð�/"ü¨É„'§;Ì4�¤ÜÄ_ôñ¹à55¾Ñzw™ë’?J“ UrÄHâHý<=õ“„ @ Üñ©;q˜‚éêÖ ··º°Ÿþ…ÄùÂôò%I øZŽÖ3n@G`�¶f]&4\�¹r¤änŸéê!”ÉéÖÑngÂ0SÑÌ +Xh ;ŒÙL‘7›RLJU²ä�À´’Húm#wÒ M¿�.æwãRMí:~%8Þº!ÛKßNf¡‹´`·rX fuãzXÔÏžI³l™?NÅam?áçQÉ�žÞt‚bæ.„éÊúëîV` ñ \�ýBÃ�k³*Pí?ˆÍÉ�È€›ü4áÑQî#Òqú[ìªWâ^Ùðí�EÉ<Õ~ÃíóvÏÜä%Yb#©K ´†X®ÌJê ;n$ £á&¡Ü†go8{ïóƒ\àª#0DO0¬ {¯¯ïÚŧ•pd#g“:«é³…É2²»à‰µümº~Œ¡@Ö ñ¸yÿˆ­œ¶é3b<#ýMpŒ±$�41¥ �Qv¬ùÎã}~©®Œáå`U�Ì’¾¤ßOÄ&»Oh¥·KI2zŒk:V›a¶N‘­e;aŒ¬À“$Îâºk_·V‰›hx‹Î¾áLàS0X\›×_o~µ,€(L+ºñ~£e7–|ÏÆºyPÈ^¦�º$ÝŒð$�<«µP +Ë3*NàwLë~4Î }ÁØLZÛmî¤�¨Y!ÚÿÒ9ž ãSÍ�a?ÈI¾åRÄ|Ц.Ù1±y,Ì,b`h-£Ûƒ`H@öšn¤‹�@û(LX�ÌfðM¨ºî&Zþ$•¶™·4¶ºÀx +Èí·¿——Ùj Àª“n2gãI{tP÷“º~5jž\C.¤�‡ßCã•HŠÁíƒY‰�/>Uœ½’e`Åœ#¥ŠýŸ>v�Y1Œjlc.Tƒ¹„N†&yÒ=²T^�ºGó¬ŽÑ3À‘{ø>v›µ¥X’ ÜDDi¿Û�ۤ;_ë[lŠ�Äé[Š)S¥j DÀšÆ,˘Jéo˜ ö¥QEV Éq>ñmhÓš(¢Š)ÑJf�#EPk92 bO09ÝŒ +Ïo�{œI•>—PÂy0‘Tš+Îl�·P~¨ÜGTîx[S5eÈùŸ"£ÁFÚdJÎÐÈ:0š–,ù¶õ \!< ôîžÂ»`ƒ3¯Ê¸q¾FȤæo¨îRªÓºÛpó˜1ãTÆÍÝÎDÈÊ@Û¯¹fóO¼Êpª’è§�—uPFºn­Oî£#(^@DÉ_Ä…jý\h@i õf!Âl$óò®žÔ:©ů#tn‘Ûj†sÜ>N�ácð”Mú�­Í�7äc6•©ˆ»êþ«s¦¾®ÂåÈ™×h؇MEe3” Þ&N³*ƒŽîU¼,ùñ «“vðLBí75Ó�¬vã#åb\Ø™°êê`€Ó•XÁRDF‘÷ƒ\Éê¾TQ”•Eë°êi·5níÎ5~ÀHw3Qï&¹ò¿qŒ™,lT€l?PãÖ½\Øp³2´¨&å[슨ŕ\0ÊÄ^Tíƒòm$ÞèͼÈfÐeb" òãò©äϘäŌ–˜;„©U"âãªFš{«~®L~ Æˆ�ÂÀ>'ùsc|¬ŒÞ«HÆÒ,FøA€Dr yZºð# p­X^ú1æu¡pçÐå°ãq¸×‡úéK¸vÄp®âw¹RmÁäÛôðŠØbù7D*›Xõû©cÃ�*Œ�¸Ž$ '�€*Ÿq“"fU¾Í¼ã¨�þéÂø¥±,±'h’DyÇ*xñ„�9ùkzó?ër·oØve®[1kÿﺺ»ƒ—#F2L €Bù‚xë@U@bL LIñµ«‘û&;¸`ý:�G"9SÃÚåÅ“#ïSêÑ·CµT~/ÓFÍða8÷©´VÚEÆëüE4Áœ¼¡º`ôí¿5½¾t×·rÀäehÐ�wT~ÝÐ��f2CnsÊw[ËJ3v§*@!® ëV Šñ[ô]L«:ôÿ1ãPNÏ6;ŒÒÓ2Ë Ø €G)þV®¬x¶É&Ið‹ŠdÞ¥X¼‚ cäw[áQn×#2–ÈT̹·1ò¤ý¦GÇ´äX=&æ"OTßΘíýÅÉ�A÷Æ—°µ$ís¦B}s°™Û¶HŸÔI·¶–­Œ®J° +xEæIÖ|yS“Û‚Ùae3ºcÇ[QÛ! ¸ê×?w>¬ØŽQ1⻺��uàhË…òUö°›Äƒn#ÀߨÒ\Ngs™<€y ü沘2+_)* —häM3‡ 0§‘·Æ~êÎNÔ¾UpÐT~b¤ÏöÓý³–-¸^xsˆãáZ^Ü™.A‘¶Â$xüMð:ZM£™“Æ©µ ‚|ŒiQ=³78$IS´t“"G¸Åm°³Áâ<&ke 5ù‘53�¯Õ!„4�~U š‘Ã’ñ�ûÀ�o}A{˜qa#% .Ѥ^*ǶmÛ—!] #ÇQÆ«�ÄÚIndêk[�ãL^Š( ‹P(Š"(¢k •І�@7ηE#OJP¢ˆ§@¥N“2 – `ÍéÒ@:kEéS¥JDÄß•:ãîFA“à.%wCJ€xé:ðªúŒ\¢@€ ëí¥&F�Œ�~ÿcñ©¦\Å ìàd~S><Å6î[3±@…3 Ç;øV1wYrH“¨' ÿËøÕr>`!vÜçOtð¿ËÆ“w [é�´Ï•'îrn@© Äð7 xÇåŠéBYdˆð?Êk�²±ÎØÄtª¶œxÖO/¶Ô!–65™ñ©ïv ê¦HÒ4´è&|…·pù 0÷ìlò­wß +€D€xÜv¢¥›¼t;@ ˆ“±Ÿ]'Îü¹ÕFl›í– } ÄÇ:Îüéõ6&@°÷¿¶•ŒY³zNÀ ¸PI’Uˆ»{¹[Ƶ‹>A“Ó}¤•$môíæOæ¦ræ{ãØc�‘$‰áð5FÊI +¤�o¬øøWuÜ6E´®ÌØt'{ã&<6´|E[7tq�«Â&ä÷BmyÕðe9VJ‘¨‰°6øÔ1dÛŸ8#iZI$m%”`}&Ãí6ßo—#®€ÚÄ{s§›+®í¥T(�Ì:~êyslÚ¤€ÌÅWS,ou”ÿ:C+ãp2ƒ1 s¯…"{‚A± ‚`q7"‘îça�3+¹ˆ +-ù§ZØÊ󵀋']~zŽÂÊZÆ4±žàoKÕÊÍD‰4°Öõ•¶v073þ¼íÇÛ„ÿw“ÑýÄãy=G§nëX|¶öèuf`@Ðñ&?…&Ã�EïqÊ>u¤Ä@`Iê'ý¾_mE{b¨HUDk¢òÇÆ¬øÈÇ +,À‘¥àñð¡=Ro¯?M†$‹p¼ÌÔÑ2£0GÏÌpᦾy7±6÷Æïý«x]ß~â¶brþ<êo�†c•"YU`éÒ[ÿj l�:G?Î�¾LXŠ®ÒDDØš.å#BÜ LJ˜Öú +æîNmݱp¡½g€ +ÿÅ–: }•Ò¸ß+†ÈmлÇ�âª}I;@ˆ±<ü«›7hÃcÂ�Ü�1²˜ÐðX®‡ÆÒDò:|uçñ¬ìÊw0Tß >I16“RL}Â…c´°S"aK’ ¥X�jÐǘdõ!t"'žßÓRNË'í?jÐAÇé’ tìÙ#¤Þ½ +t¨¢Št¨£JE©ÑE*(‡Ã�%ÙA15ŠÒ¢ … +Ô^Š(ÒŠžL —êï5 ‚6ðÒ’bLpEnŠ(¢ŠŽ<å‹R6Ÿãk +Î.ëÔ$la$ÅùDçXÅÿ`™fljµ‰ÛUÉœ© )1n}ÔŸ¹Åv’@<˜Èw¶^裤¯Ž½Bñïµ­ëÚv˜˜¤ÝÊJmêßq}?›Ä\|kXrúš€ÔHb¦ƒoT&s&p‹¹í$�$\3©à*¸ò$ˆˆ<浓"â]Ì`Hò`|êKÜ“Óa‚EæBÄÿÈSýÀ#p&'•àÏ·�@eeÍ�…,A€¶ñŽf©Ü>ìPIRJèbò-6×JÑΩ´q?Â�îI ÐÃlˆ:˜Ò8ö½kÖ``©ÒMr/ý¾ê®Ê»˜¨—·r i¥vdrÊÀþÓSìoŒÿödÿ›WMÌXâÊð²6©1rÀžfÂ…î‹ `†ö‚nά®ÌÄ€8Íi˜ $è5¯?þÃ#·m—¦kAž¯¤ð�¾ºÎAê(6¼y˜'î©áïx*¶˜¼‡k÷ÖÛ¸={vÃ7i1üâ’wM•• •«t•ÐÁ¶·¦ýÌ(!K\ƒ¦Çìµ$îƒOI�"7F±íÂt½K úḭ̂`èg‚U'©/µ€SinZñ¬v¨v²º0a¢. i×# &y@¹ã<ªY7»AWWÝåÛ$nʃýE'wV'f¤GAýS}±76>v§ÖÝÒ�­KGL·§a«d'.6ÆÈA`E¹7ˆÄ韵öãpÐ ß##[[tž<ª¸�ÜÁê30GáQÇúk¥Œk‡ +îÇé²¼ L'§U6#•_¶»¤ZlLi¼�cXªå, uâ@'Ü+‹Ðs™\OÐàÉi—)Ïújþ®@OøÉ¹ˆ�™0+÷&Wm§¨“¡üª>ê]ËzÉ7Ô‡éoÂÁ� +a™vL“lE´ó·€ñ«_2›‘cmÑ‚‘K’“±µ·=ji•’1¦&‹WÎü*Jrv­‘ 0 Àƒ¹£oÀ*ÿ5¾ß¶Ü‘‘‘#ó±mÖõQÙâü‹ý«ü+KÚâRQc6iä+!Ž÷`­ Q#]²gç”ÂS=S!µº@›uÏ^5|I±nL›™ñ£*—BƒÃÌ^¸38n˜ž== þb’}¹×Se{BùØž—�K"YkD™Ž“Ó#Sh VÕÎeØ×¸‹ƒh�XqùÖ;Ÿ]œmYékI ºÛKÓYª`fU`TýL¹‰ûè̽I‘RLŽ1½�>ú8rû óÑ…ÿÙendstream +endobj +307 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 8 /Subtype /Image /Width 40 /Length 197 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ (ÿÄ/S“ÑÒÿÚ?¡ã&õ™Ôôɽbu=9±1úä~ÄÇèc‘û3£ÿÙendstream +endobj +308 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 800 /Subtype /Image /Width 7 /Length 641 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ "ÿÄ\q2�1BArÿÚ ?ê~ÿ‹€=ÿ ÿ¬ÿ×ö€gýüú~ÀÇÍ‚3ó`€×Í‚5ó`_6S�oϨ ùõ"7æoÌ ùнE#zнE½EÞ¢€„ÔP ê( ê(õµzŠoQ@7¨ !õzŠkQ@5¨ !õzŠzнE½EÞ¢€€Þ¢�[ÔPÞ¢�ÔPÔP ê(A½EÞ¢€„ÔP ê(A½EÖ ßk|k|­ðßg|ßg|;à ï€;à ï€;à ï€;à ï€;à o€[à o€[à+[àÖø[ŠÔP j(kQ@5¨ ­EÖ¢€µ[àƒ[à o€B o€Œï€B ï€3¾3¾Îø Îø;àßg|ßZß·ÀÔPÞ¢�[ÔPÿÙendstream +endobj +309 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 48 /Subtype /Image /Width 48 /Length 592 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ 00ÿÄF!1AQaq�‘"2±ÁÑñBR²s4ÿÚ?õ™ €Â|è™Õ"H¥R:¸• � +�Ñ®>´>&~Ô°ÔHŸj¿¿ŽcšÏ˜¬¸qáÆ¥˜ .ÊI¼òx�^”9p®l¸C¬Ü ÿ†MzÑäã}(ÊHˆX…;ïoZ¼8U�™o¯ úŽîgÛj™Šâİù(¹â.À"ý> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ÿÄ9!Aa‘1Q±"RÿÚ?Ñuñ_@|Ý +´ UN¸éo¹¿Š]‚+ ¢ �³ÐLeöŸ6¦âëþ2U ••�É„výªp5"•94ÅÜ—62=}¨¯X’ÒÄ€%®`Š}\uÖI–bDÆmñ_ÿÙendstream +endobj +311 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 16 /Subtype /Image /Width 24 /Length 264 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ÿÄ:!1AQa�‘2R#ÿÚ?ÑðDÌð-y•R¨-ڵѲr䔲âkQ¶ÙÎ�¤GOúl ãSnV¶ôÔ×8pÚU‘íª+½óЦTÌvd_ǬºKÇWíX=©ìÉw�9Ë_ÿÙendstream +endobj +312 0 obj +<< /Filter /FlateDecode /Length 6703 >> +stream +H‰ŒWÛrÛÈ}çWà-PÊœ�ûå!ëÝÍÆ[ëŠã0Ƀ”JA$$!K4JÞ|}z0 �ír•,‘Ó=}9}ú̧ Cšc$+0ü£„ bìßþRT0$(Ƙ³bÚ|÷î„‹ÛÍß6Ÿ6D &á,GC…¤3ªìïXN_:3Ì$¢>b´‚›ãA¡Yô±â�®{ ÈØx5Íí§?œ=‹�CäSŠ©¼fǃFX�!5b¶$ÊUL Œ¸µªHj²âI8OàGé"ýÙ=nHÑ›·»Íw;ò©Ø=Øs„Òb·‡Kv/ð£ØõÁöÿÿ¬Øu𢮠+)QP ‰Q, +¥´DبbwÚ”©ºÃKÕÕÅÍî¿lÝqĹM}wØÜ–ßï÷õ±îª¡íúâ†rR>´]qóïÝ/I)©œEù¶ÚsuœÜ1ĸö_¾;U�î&Š fþÓ]»¯û¾9?Ž_ÙIÌ‘Ii½¤¹hHFH$9dÂ5’BºTvÕý1ɃPä1€múòÒcö©�pç¡w‚¯ÝC0A˜cjÍ "Ljkv;‹ÙàòcýéÚtõ©>½«ŽÍ‚N�bÖ¹ArÖ*#FÌ}»/ê ÉZx”3DˆÑ™‹#Ô9”ÓbˆQ×XLC›þ|==÷áL¨³@«b ¨ç<íŽj¬ì–)$Äx +á³i™ œð¤ 6y"’® Ä n|ÀêÛ;O PÇ$ó�… ©rž¡¹üëÅ"9Íژ̇ÊÀ™ñÛíô5„Ldkó¹>þ1ÏÓŽóª š &îkÉúhód9ÔëÌþÕ4ƾ0>ö…±µ>{†éþXW‡âf˰Æå¿ºf¨W±Ë…5Ó¼z/004Ò6ˆEÆØ¾ÿõCžÞöõü%¡B‰—Ûòýõ84—ãï68Jh¹kË)žv¬¤®/Õ»¦´ò_“x”RP¸ÒdW• ‡"r­W[ ¹µ3™ÝÃ¥Ï�F��iw婽ôw71&ï|Ë l‡qr´æ rÄQ˜å�Ù©}®cIùTR”k'‰}'L*D2Ò`d˜§9›R¸‚ª1\�´¡vÃÀa{M8‚£îw¾…ªOÇݧß�ÜQäR™ OÄ*Â|åä®–¤T +`ï+þ¡mÎÃ"…^ï½ ‘×iY꼪‘]À+M€N²#>gÆ>| ©^A")†û²˜€·+=‡íOÆÖKâZÏb¸ÂÓ%ŽC赿”Q«ZI€aßçežL…µÒ?þ°ËÓ1Xš/åIÐØ»dãÊ“Î�&µ$µ<ªÙÍÍx$;W3h×¹¬÷l™°ƒ‡·] ÎÒˆPX##FŒ'eýF„3 ¬龂ð×Êœšé5–ye÷h·Zgö÷Çvÿ[~õ¸v +ÆGPo)1aRxILM¾µ­ÛrÍT�¸�‚†žžÁöŒ$¸d–<üÃ}+ ¼!¾6É@¡pÊÎ#UÓ8UÃþ)•iÉ:a‚¸Þ†%šQ1D€…W øøîï?D*áøØÄ•u bìM +šÔ/!Ü>‹Tæ˜xúôGáÉD´×ȳsïãöI}‚žæVÌÏ^ì‚íßÒ‰žá Ù¥§'=àóÊ/�±Š;5»-ºêTƒ$Øæ$¤×*¾¬rªÓ×À¨‡ô…¤p ®;+,înÞdù©‚21ËBèµBPX5Jä1–÷ÍУØúDàé�vˆÌ¶0dà=k�  ð2ׇ ( 6685ÿS|o¬ÂM3ÿÚšU MŸNõÐì³Þ€n×"ˆÙcûhl).¯çf˜¤ìWU¶“é€!)Œ¢£ìÛr÷tµ°!eW®ûqlBS¥¯˜Œ·OµZ^V§özö·'ÊO ûLórå!î T¹ +žÕPYaU^ûú�_Ê¡M�”‡v¡A‰ +0ëêKWo³÷Ý–Ø5©-CSÐdã…}mãÜåàoó‘1XæA=7‡:¿žw‚\]]�²ÔlCyHí¥½íƒC¨²:ëç¦ê•¢Òpã};<-.$q›÷CÛU�uþ +"#ãÍR¬ì¼1^ÞÃ//ÍÁzõ·z·~f¦s_wg?+[‹ÆŒÞ˜qÞv¶N®¯ºa ód¨Ée­‰¸4tðaz°†÷â±¢cC²Kfbœ'èpßÝ;C›ŒÒ{ m‹Žnç�u–Ô¯lú Fð´ ÁÿK35)fH# û¡9S5cí¿jNнÜ5CDÆGÝù�l»¯Ã¬úW“‚š<7íµ·¯Ç™gÐ&"}ÌCÝjïKì‹'M9)=—Ô\|NZõ{þØÒóÔ/~ú9+£{Y[Ù23¬Ž�íÈqY·­Æ XØWçYUHåÞ +bS„Áp¼1KžÂÕ_ �¨.ª²DRÚIZš Æ +*§9±sãq…Vl(u*°‰Äé@³¦tù¶ÞW{NB)ó8f/ÍÊ’ A†ñ»‹TjÉp›Ï¼:�EÒuH€á‹—hGXÑ\. ç¿„aСÕbP$‹üXºÖ@-ù°r÷˜ «¸à¸|Í·ÂìMž�Ý…jɱ(‚†8æh³Ð7À8Iöަ§¹38ÛÌq$Îêr96ò$q¥“t¹¯¢5Ç uµ"Ù2"\¶È§ègW…ìvO >tóH¹V|®Ýr/ØÕÂS„¾L‰&üƒO°øs +fHÇB/Û­‰ùj»Y„ÄÄÍqiÓ0‰SE}&°`‚ìI)Üò¶$i#�(}³H@“�kwz¹Ì¦MÒœõ¥†~¥ÍŽ¡9†£è²1KhÆ…gd¨'ìûº[ô „:väÌ“´ò½0�6ËyQ×d–Æ áÐ!”ÎÖ©–¤’»§:«CŸÛãó¨Æ"¾o‡qÏ*È ”çC³tFØ jôÓgxA 9ÍîdèÄÏ]{½Léä]jõ¬†M #«`¸@M¸·ß]ùÖÓÝÍ×¶Ó!f¶–}`WÝÁªá¡úÍŸ�†;W÷Ç23'V¸25ƒÝ©íf¸*ÜR?<4û¦žÄå´© Ë$Ä”A4ž–Å´BcÊ“~[Ó ðPJ)_ +Ôò-ųõºÂ ”¬,-†ukxޝ4@&“Æš‰oÕ\>ÐÊä– Ñ¥˜G�x¨Ž \Ð?óòq$t8rjû¼ðˆd�Ÿûf¸Žå™h8ÝG|îWàà—SQ95F²I´bÊ,OÍãòAE#sêÇ®NæÊw<è|cå²ÑÏåv‘$<ÆÈL]4C.Ìa?аôîëáÿ”WËŽãÆý/5@Sa=XdÁ«Á$H1²é¶D�hK¢BRÝî,üí9EVÝzqìx×h±È[÷ž{o]—6\ ÑQŠl�?·‡ùpv̪Á>õC@‹SR›Ø +%ã•HH Ö¼ª3Îrá%B„æÄ•bPœ|çbK T°8¦X ‡Ñßc×N�á$r’ø—¼_\2â’Ãp̹ùD¹–á5•õ«5wû‹æÝ"†©™ûé1¹×. +,¢!·,^…ñlË€*zó±?�À‘È–¼ L§q¸æ”ä2Ã&%Ušzï 4jÇ>55jßï&ƒû›#ÀHÞk\ÛŸ K¼§‚‰".Þ8r» P ï ›RÅ(ár ;l_;›ÆÆP[Wi<ëŽßûwB©)œ�‡·‚¦¦qß`jÝk7>å�¥ý_jÍøA)2o@ m‹Í?mè43¯žH–»&J,öËP»ŠheÌZÈH‚@iÇÞ_J4QÌ\ÊI)+„ËÖx*ªµûu»«�‰×M÷f=ë̶5_Ò éæÄaÂÕ¯óã>D¥ä¾0�X0É4Û4â¡°ËRûÝ^‰Ñ´ªVóo:Z†ås€]/½5ô§�QÉÚU†I|kCÓ1ˆwòÙ�(+÷DŸ20+ì}?…5×z|±M_‹\á~îÓžÂh?�\´°92êÖ½»Ƕ§��Ý‚éwLW—o�dDLì3/wVÁ–ï5牋;.[ –¶ƒÌÀcòBTª8�¢ZV".†Šü”1Fœ—6(pi~ +ÿüñoŸnIÝ—|Ï*ã¦ÂCÇî0Œ·MõoâF††‘ÆÍ¶�ÃÉ–µ»ƒ(³p%#„»Ö;¢ÚaõîÃ$�¢ÞMbÉœ¯˜ß†Çå˜ ÔÓ÷;Ö¬~m"™± ÿ2]•Åu¸§p¬pˆå} ŒÓ0î�6h±njš'ÉÜì¦ 7yÎ&ψ~?.)Mànß� +!y�W1¥7Ø�€r†¶�´àÉÈ.y¯®uÅI8,Ù„10Ÿþ^¡1ŒF½éÿYã¢)g¨¿†üÆ`­¥ ^Ù¡Ï×%µ&=in>­í$ü¯u8Ç Q±R;Á!ŠüÑLð73ÁßBŽ/‰å>^æóððVœ4Tr×Jv…(%–ëµ?t9O¡ÝÓÇÁìì ß݆9Ð%3ÊRG¾õÚþ’ß�h +³Ü˜Ù«ß7;ýmîÆe+óĤܴmT€�ð»kï$±žõåßy&ãlhTYO× b"t +÷8qâä¤O§þÐÕ¾¯ÞfåH%€Ê‘¾3H¨Y­ˆùÚ´Ì4}V°”*:óL-B½_à@n«cЇ¬÷5Yý`‰X…t`ýª‚u¦ûÐw6ÝZ ×9ˆÆí•^°%Ç¥Ù‰º_ï—¡Ÿ“A‰½T�Ÿr@ÕrcÜ^?iJj��ŒÉ¦Œ*©-4s2Z0øçUG¡Û:µpÔG)èÆ‚u·©5bÖEx¹€b5sWð†Î¾Îô]˘÷û0ÎÞ;q-Ws¶`¨¬  É’0ô}?›Â`Øâ^½#/«"åQf²hm†E—§äåäæYÑ3�çªv²gæXÕM¸mZ•±Ø8 •�üå'öo,Ûw?�V„èU±%»† ¡ï¸V°¸¸J])n\ëÚ���c?„!K‘´VãÃw"溟ýIó±¹"³b@ÄaÊdk™Û’£«=×�4SŸXêûWìüWH!iIBc[y®ºÇôh/—÷l ¼$O}0pno}ç¯igæÆ—ô¡�jMö™~×�£l + ÁqjPë;ã¬D„‚Å\$®¡Ùd‹Å–tçœ r|â¤$Xž”¼5d¤DsÔÐÆ}ñ-;Åñ—¤OÂÆ»ÔôA&¤{äËî­ŸÏY¯¼ášÏ).,Í£ÐújððåÃSòž0NøœE×Î%ºëqÀ5:Œr/QÄó qíõw¤+–p½"’'[¯Scé^ ØeéÓ8\׊ÊPEƒf0< ÔɨB²U¢D.jJƒœu÷vlçn‚j7 �ñ°a—½ž}SÎiŽ ênSwŽ©‘§ebÅÉ×,{xH­¶„ïs§�ýtð½jö¢ööVjXÁOq_¾ì>ýõËÛÇ”h¨“¥1p˜‰9q¿´ïÝøåCºÏ�l +½ù>‡[à:t²ëÇv¦héáê-2 Ýá±;Q„0Gum «h:4%-üý~éíì˜84v¯¬:7å͆óèh1ÚçSÆ<¼iòÞjOR†oR…y¸ƒ¶’·¨ÝUñs¨Ã†;+qçÀýýüžË1y¯çµÔÞÀM-]UŠ!C¸%Qºÿ#S““ë‰}C=˜³9±š"¬½Z¡Ë�ÙÍ)ucfp¬ŽìSHª9FÐ9uÔ¬`&>`¾ô3õZ1«ñ4‹{—s©OŸëeó. ê\ľ¿¤õ]×Q +M4 …ñìµP6dt’¬±” ˆ2;7w—î~nÊÕµ47-Ü æ#øüÜ›à'àdÜ ôº$ƒG³G‚ÒË )L‹¹ÊÁÈð9µdjY èŸÒKÝÍ]D.ÔrÝðØ/ýe8wãüßìº^kœ“[ka”ÏL5R9cýçªA*kš’'ÇB8ɦ±†GŠOÔtÁ›(,}ô‰Ç›iê†ô5ÁGžCž™–¨(,½…9Ñá÷"¸Ÿû¯çÂ’Gê 1T ”/…J+ˆ¤0ánñš4ÏËS¶œ:&‹œêTí6l�œçE,ü-{ëWonéRš Ý–'¢ª´IÏÁ=Q܌ث‘IÉ+CA1>õÍÈ%µ¹D#>b0Zl$AVEv ƾ6…qpUC>´”RUé]üÿKs„'%t4¦}òö¢Õ?ï>ßæî+˜eAYU9]�¬ºo�g¿ "·º›‡pÎ 'ܲ˜¬7€þÝ-v‡±óªQ0�ëˆÎ¦{wèÛ‹¡(­LŒ|¹tW£÷±Ì4@½k:9«,ôõý9[CL¿”®ºÃó0wc?ÍýÁ¸bQAv‰›�J…Z*åµ5|§S7ÂŒôë…¢¯`]¾e¹2/Ö(« ¿BlU ‡¨?§ú‡Rnldç¶ÝÜi¯íœ_°ÈcÁeŸ1ˆnÂ]íP|ÖJM`kø>·Ü}nµ »êdÑ*Îi,ºz{ �i *bwkçÇØí¹BmÜÛ>n4Ø(¥¬Bôï®�iqÂ)Ž�`jrS¨I>n@7Ž�ûæUµ/iïO‰Nò†®›E‹Z»ý‰÷ª¬ë  ¯ÝûJ,þ|wíÚ[‘î©§ÒMÀûØïLœB"úœÒnôa›û +Qî¦÷iÆú=¥ës®uŠP;GµµðàE_Éh§¬ +2šX‹öjתmj)%mw(´r ˜‚™|^21âqxC/ +Å0å£Y%i²ý•$ííÚ×Ô²ùE~¶Í2ÞXÂ&·Çu +iãQ§¼µE“Ýì(Ê2Á¾y}s?®et¿[÷j^£ªÝmÅy{hçÃF‰¡ŸÉ 8"Tì†1�¦•—Bë¬]ÂwÇ Ç)…K2&·ÛðäIkq Ð)äãç̯Ü>Z+rÅ“�˜�Ù— ”�‘mЮ<.èÊo¥© 7RÊB,žoµgº‰[2·ïç4÷lGCköÃ¥T2‡†a¹ñ�í4Üžn”ûF;]Úñk·Á�Zò'/£f†oñP”#lir¯Yí¡yLD³›S2Oè3«ç•EábŲ>©‡®óµ{瞣YɽôÌz¶²ï®—Jƒ©zà¶èÈaÎ6TVT¯Uv]bp*ÇÇÁ”Ë™Oü!Jµ—�±«¼Æ¨«zõžÿ Èf¤&>ô¼»fH\Üô?ÆËž·mÃ{EÆt°+J$%ím‡íР P$9`K†e#h}�"yw$•¢[`„Ôñ>Þ{ÞÛóõ˜?˜lá'ÛaTª¦ÖtÜÀ8ìym+3î`…ÞŸ +�³™â÷¶¬‡¢�/ƒ ¢…IÿQWh‚6"¦6[~Oíp™§ñOãjâ+\î ”�-r`îéiÇ=ÏeŸ}~ž�µYåDÔbËaÒjü8µÇ[— ¯K„ˆnM×%Ï'»ÐL[dæ‹Þ6žúiY±<ÜÐTÆ�€ßÐ ¿M0ª»èûFVʲ +�Ë�?_*|ŒI)°¾´®[ëá!0Á+Õ^¢my‚áhzðŽ÷‚Jô½ç¾o‡§÷ûä�å^cpéü9^‡ùB±“å=ô‹(Óà§Ž`Â¥LKVE©ÝX§Ô»l|Ü@¥ ¢ÍZ :yŒSÒÚÒ Š(Þ¯ íFl•�kžÒï‘äVcg–+ˆÈ)¨’Üëx<¦7—~gw—ñ4çó5ùa³D°Lã 0Ø=ÍÏ’Äuˆ·¹IR”{£+ò>ZC]#Àµ|›ú„'aº´ÏØë6Uu<ø¬+S[‰)>ÍK +S´K‰Ÿ¢;8Ížšv§~IdÙ@]´«¹’lçÓùÒ/vÓùatÇ@Ë¥þ•` Â9Aa^PÀö)Ò sg¡‡PÐEûïqÝPy}ßc;öÓ5‰ßÈ“*o¶&./W�ˆQ)Ih)¨G¢D +\'.×÷Ž,BÚ”�-gƒG�ÌäX°0"ƒ†Î}ßAÙRÍ� +íC’I­˜ \ÇÆ­‰‡Ê$ª†x¢ÎÐq�g|±U«ÞÒ>†@�f–,ËÜ÷‡/zÁªØt(Ãø2ã% +€vµëÏýÔ­µ�lr„�—âWv�w°¤¥,og$Ê=øè«àÛ€‰ÀŠ%übÜÇÇñe¼RÆŠ¬r”–ùz> +M˜Uó%m¿´¾UTv”ŒS1ŸªîD‹(þÌ—ùv™Ø]!`îWøX5D-tV b¯ù1Ó%]¡íj=ºFa,”(áÎ�7¼cWlE¡¥²QÐ;* � µ�eDNÿ½/à/Q×[AK—\!J'ÉEéßjþÊÁ:i™ûÜÕưÙáSŸ!\åmÑ1$S•‰´9žTöd��R¯�bŒj–ʼn³yûôðî¯`Ú Bendstream +endobj +313 0 obj +<< /BaseFont /Times-BoldItalic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +314 0 obj +<< /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +315 0 obj +<< /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +316 0 obj +<< /BaseFont /Courier-Oblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +317 0 obj +<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +318 0 obj +<< /BaseFont /Times-Italic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +319 0 obj +<< /BaseFont /Courier-BoldOblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +320 0 obj +<< /BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +321 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 440 /Subtype /Image /Width 8 /Length 353 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ¸ÿÄ/q32ÿÚ?ÔtW4WNzâ‡=QCž¨¡ÍTPæª(sU9ªŠõEz¢‡=QCš¨¡ÏTPçª(sU9ªŠÕEj¢‡=QCž¨¡ÏTPçª(sÕ9ëŠõEz¢‡=QCž¸¡Ï\QtW�¢¸¡¢¸¬ Å`h®+EqX+ŠÀÑ\VŠâ°4×�¦¸¬ 5Å`i®+EqXkŠÁt×�§ÄVŸX¼E`jñ�«ÄV¯XüE`ºüE`kó…ƒÿÙendstream +endobj +322 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 16 /Subtype /Image /Width 32 /Length 226 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  ÿÄ=aqÑ‚D’ÒCÿÚ?êqšµ·¤!gå÷²xí€ Udÿk,=†œÅD—pæ�JÓ˜à™;•0Ò7œô¯ÿÙendstream +endobj +323 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 832 /Subtype /Image /Width 13 /Length 849 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ@ "ÿÄ\q21�BA"ÿÚ ?ê¡¶ ØOJ °žH6ÂxABA¶ ØO(H6ÂxA Û á ØO$a< ¡ Û µƒl'„$aŸûj‡XM¨(D6ÆmA ë µ†ØÍ¨$c6 ¡ ë µC¬&Ô"c6 ˆuŒÚ‚„C¬fÔ±›PPˆuŒÚ‚!Ö3j +±›PD6ÆmABAÖ3j‡Xͨ(D:ÆmAÛµ Xͨ"c6 ¡ëµC¬fÔ"c6 ˆuŒÚ‚„C¬fÔ±›PPˆuŒÚ‚!Ö3j +±›PD:ÆmAB!Ö3j‡Xͨ(D:ÆMAë5‡ØÉ¨ c& ¡ë5CìdÔ c& €}Œš‚„ìdÔ±“PP€uŒš‚!ö2j +±“P@>ÆMABö2jØÉ¨(@>ÆMAë5‡ØÉ¨ c¶ ¡ûµìvÔ c¶ €}ŽÚ™ Ac¶ú^c¶¦EØí©‘û·ÑBö;jd@>ÇmLбÛ} °Û}^Aa¶ú^Ca¶ú(¸†Ãmô¸†ÃmôQq~Ûéq~Ûè¢âý´¸‡¿môQq~Ú\Eß¶ú(´‹»mô´‹»môQivÛéioÏ¢‹ûvßK ;~}VIÙóéY'gÈ¢²^¿’¢^¿ŸKED½>•õüŠ*&êþ“ôÿôÿ ÙyÁúG£óÊ;ý»ÓüË_Œ¡-ÿÙendstream +endobj +324 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 4 /Subtype /Image /Width 13 /Length 185 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  ÿÄ1�Ñ2ÿÚ?±ŒÔ×âBV,�J!´6Y/ÿÙendstream +endobj +325 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 4 /Subtype /Image /Width 240 /Length 520 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀð"ÿÄe¢ÒRS1QA¡Ñ!ÿÚ ?ô8ìÔjy×Sš?˜âTó¬_¯à²ÓÇðbó¬iiŽ¿À×óZ© à{�-&o÷Z¤0‹¸ÒÒ`öÿq¥  „0{|Ñ¥£·ÍQ-\"`Öùª%£·ÍQ-·`Öùª%¤ÁmóTK@`–ùª%£·ÍQ-—˜%¾z‰hÀíóÔK@˜¾z‰hÀ­óÔK@˜ ¾z‰hÀmóÕK@˜¿rªZ0 ~åT´p‰×ü Ê©hëîåT´pN¾ànUKG^ð7*¥  �×¼ Ú©i:÷�»U-pÿÙendstream +endobj +326 0 obj +<< /BitsPerComponent 1 /DecodeParms << /Columns 2368 /K -1 >> /Filter /CCITTFaxDecode /Height 3127 /ImageMask true /Subtype /Image /Width 2368 /Length 69614 >> +stream +ÿå7NS" ¬Œì$A³µ ÁÚ×-¤¨)SÉf±Y4å¬Wg#™%3²\#E“ç» +o± Šíªò¯¨a0�s¸–¯NºlKªø¥ÿJ•j©}UÖºÕd­k¢tgEDNf³¤�G²A†N2q™ŒÒ4gŒœ_ça4Pò',‘�hH3ñèJ²'‘�~5z4g‚Ÿ¡„ èA4°šh2p�s4?TÂ5†�„kavŒ;MSEÙuES¢7šgÑ@CFiŸÉ^3ŽF‚¤ä1M& Dw@�ŒÙ³4 + +»jš8ì(FÆšj�VHz65L"óªhã°ŽôlA'IµJÕ'H:V‚‚ …TTRaj� L&q +šhUMÚáM ƒj“j¡eœ&ÓP‚ †\Õ…ZICŠM¢‡¢®‚ê‘N�ZZZP’éQC¤qá&ÒÒ÷ZGtŽ=.«á*˜AR8ú ÕRÒÒt°•é6êô­:Gµ ›”ôqÖ‚G}$ÚºZTºZZXK§KÒ iiZBºcŠJ‚¥×ª¥H¡é ´µt©ôqé]i4“KÒX"£)Ò ÕÒÒñ¥Ò¤ž:¥]­%ê:ÒZTºK„«HkZûp•%ú iR;×J½-/i-t…FµIV„V©+KHuKIRLsÅt½$•%é$º¤—×BÅ-¤©_QKøÒ×HRªT©%J®–©*ZÕ*JµŒUýŒUo®ÇKT’ñA­tºRD—¥Ýª ü±éPúJ?¥ZT•u¥ÒJ7^½^—]¤©wUýÖ©zIK½p‚vú§Z”-ýzJ4©.©i.–©RªM×êÿꪺ­$—¥„ý(A7ikÖ©URIR¥ô’Cô‚  RÖ¾×U«ªIzJ’ª_W¥]%Ä&Û×uúUI~´’àŒ ÃÒð‚¥kþÞ•WªõK¯ý%V–:_ɈmÕV‚ªëëKKÔT"w¥Šã¥^©=ÿëÓê•.Cá„«ÿ§uÕ +Õ%ý-.–“ÿÒá>ª¶ýR]*ÒªPGUkÒòœB×Òû},ž¡ÒIPúé%ô¿ëª\Â_Ýzê³i_ý˜×ê•,ÂQ³5Iuš,ÑܼõÒ¨õ×õÌ% +º;¤º¿×ô©s’D…î•k„³’J_ÒT²þ–¥ý*¡ºþºV·W©~•(ué,¿éRúZJayž¾h¬Íf~_³úZ]RMÖ›×JµU¥×ÖºUIiui+Þ’Ó¥a' _¥ÒÅ7ªÒ­--*E=--*ºK´�m.�/IBXKJ­%t½% E:U**®bÃl%«h&ÕŠÒn¬z‡ûK xIRÂZXJ¸Iw ZN”;J¢¢¢�.ëm*T®› -T(H5ª­Å6‚b ˆLWTƒªÅ! +¢¢­,%[šllSLW +¡6’LVØKBxA‚j˜U@‹· ¨L*•°¥s Â ÓL!��Ó Õl*b˜„ªa Õ‚a0©…MU1CUBÊàB0Œ’A²¹tl+‹†ÂhZa4Âi„[«b")Ò ÊgÚN¯­÷ÿô¯n¥0iStÚ[VÒ`Ò±A’ È�ÒØ q�ÿ)³P3–ÐXƒ6Z rßåª!žY¡`jå– 6æ ^[…�¨2�q™�˜h5ã�< * ¸ šˆÿÿÿÿÿÿÿÿÿÿÿùkåÑØ¡KI`ÊÑ�™ÜŽZ4ͳÚƒ ùØeɰ¸9•f„AæTkÿÌ‹@¹Da°]Ï ÷¦¿ãÿ¾þ Éÿ÷Øõ×ýldŽõÿü……%G¿çd".ÍG•A�D.AàŠ‚ª,dª?“3¾æ@YÈBR@ªtèŽ<ù›ÁIɘ3Æx &`òœÍ á„ *„ƒAßýÌ€Ù¨ü f±˜�™;>g™³3 Ì + e 0ˆ&0ˆ$Ã×Âi¦‡é¡ÿƒôã_çE^Cf‚„:CPÌÏ0ƒ ˜?0œ==5Aé ÐvƒÐzzñšñký¯§h–>H ˜N'æÍBaƒ4ûL!úhêˆÓ�ON>Ñ,hŠþÑÿ‘nˆñƒ%:#Ç#í7ÐzA¯êƒL&š|_¤šÆ�¢VäXa‘ù,ƒ%B\þE²&Rt~GÔž@ŽôôßÓ÷¿ Åá<¸¿i§%ŽOŸhŽþ‰c’åÿ%ÙÈ™Iè;¤úW" Ó^ôýtÿÖ—é7Ocä³ò7q¢]’Ì–R×ä}Iô’m/öEšºk¦ëðþõÖã¥ÿ_ûàÿÿ}+‘qè Ýë"NÚM¤ÞûõÓÅSïýSÓN¯ýޓ׵¯ôêÿ×CôõÈV©OOO¥Ý˜ '§§Çë×Iÿ¥¿þŸaý×ø]ÿù_ÿÿ²Õá{}<—bºµ»¾�_ïÿÿø¿ä¾¿û4ÿþ ûÿý¾+_Ý7T¿«!!Ïÿ¸ÿú�ÿöÿø/ÿÿÿÿàß]ôñëÞ£d�ÿòTõÿÿÿ†ÿú!ÇÿÿÿÿþC�Áëãz¯öÿÛÿÿþ¿ÿþ‘ÿÿÿ¯ÿÁø/ÿ#ÿ †ÿýä†ù!“/òœ}ÿýn¿¶¾¿f‡ö¾ýúÿ’0Èbÿý÷ÿÿÿ¿×þ—ÿÿzÿù‚ú#íü‘oÝoýµßûÿþÈkóÆû¯ÿ­¯ö½¯·^Ú_ýÿ�#ÿóCwõ÷'m®¾æ‡ûš÷÷ÿß¶ö>ÿµƒí/m}zïk÷N¹¡›<Áÿßöºß÷ÿi®Ú_ûkïÇìS{±_ïìÌõöÖûï¿ö?m&íµöÒý†ä$4¸¯þ7ý��ßÚö½¯k¥·Ú_¤ÚM„´´¿Ž8ý�ö+Ý�kÿpȱý¯d#ý§Ã ÚúÃ^Òb½ŠŠcccý��ö�ý¯Ú÷aa¯ý‘" /ñö½ Â!„" / b¶6½¦˜M0¿kðÓ!È‘öì/vša4""ÄG-€°ßc­„×´i„×ãî mˆa¸®¦_d$dáa¦�Ã0�„ #QˆŽ"#“b‚ÉQ.}‹BD –ç/JÒ–R’öÕµÚ[Å[]„± h0­b0Âÿü€À°È ÙLTÀZ–½@M©iš�ØZÀ¨²l@Í™�Ýü�)¦jò�X «ãÿÿå6ªˆ.Êe{ÉÓßÙRÊxÔD2:‘w0ͳâ Ašÿ +aA¦ƒ×¬i¦šh“´ãõÉã“Ç/œžPAÑ,Yî“®“ïO#7ŠªoÒnÆÅ&ÿ¥¤?wõªþ6BÐ…Ÿð½ý†ÃúÉ'ÿ°ÃýÉ„`ÿÿ_)è_ÿó3Ýÿû{}ŸfÏ0}¥þÒµý×ûjÚL0­¥i0ÒþÅ1QQ±±_Úh4ÓMa4ÐaO 8jÿþSkb–¹m$ËUÅ;-3"๙�SL ÎÒ,Ô ÀAðÿOð í!÷ú#ÇŒ·™Úo›òòAù�QöˆGxÉNf0{®ÚÝZÿ}¯þ­¯êí¯µ{=Šö?ú^¿ºÿukÿ÷[jëëm/ma¥ý[ì*kßa{_ýoþ×öÕ´˜a&Õ´˜®¢˜®6ö+⢟ô›kÃRnaa‘^ÖöÿÛ_Û_ئ)Šb£k S[~×µL/ÕÚð`°a;-ö±ÿì&šh0šØRnšÙ/†A…&è4""!„8â?ö7ý‘ûL Âaa0°Â5æB Dÿ²+ÿ yd1ÿì‹qþ‡ýù\JDÇ•ÉE�ÿ•Ô‹µün®£Ö!D!L(a¢<€Õ ìQÊd˜l+LÉdR¤|µ…3"ã!ŠLɃìÈkA„Õ&嚦Š9”ædª2AšÌ –׿!M4×墀ÁØìOÿÿÏéÜ%¹n1ßzçÎÿïÿÿD²‰åO2 +.­zÿzøæJeý^Þ¿;ÃýïüÀýý5t¿;'_ù)¿ý?ûÿΆ¤�s#ˆ�×¶†`R€”y˜±J2â“…þ4ýëÿŸ=N3G„BÙxNç6f�D?< Â�}Å„ûM4âo’Ý}ýh‡) rcÿ…úëÚ~º=7ZêÓX‹ONõù8Èb½çf i¤ßýÿü_úmIGD²Â_ ‹nO<Ž‘D±ÈíÉãùÜ5*Œ"�}4kþ½„ÿÉ�Dßø`¹ÞÚZ%Œ0H&ú¶%ïMíôÓi]7¿ÍFfÎ3‚ "ÉÌ3F?0šËzÇ´ŸÿÿµÓÿÓûôïÿO�UÓÓãÿ‹?N-=S“Ê¿ÕlžUÿöÿÿ«ÿJññ__ÿÝûûÿÚu§rvú“ÊV‰w[äsºM×ÿõÿûí×¾¿ƒ××ÓÓrüŽòy “Ç%”ž4›Þ›ÿ¯§ïþµÿúýÁs$ÛÿvC×ý`ü‚ùëVý'ßIcÿZ×­¤ÿû×ÿíÿדƒà»ÿíÿÿ°ÿôõþÝv?®î¯_Çÿ÷ÿþÝ…×mÿÃÿüÿúCé|Y8DªÿÿBÿøÿÿýÑ.èŸóQ÷þCÿù ýÿúÙ +º©)¼àc㎿ÿ÷ÿÿúïÒô¿ô»Wÿo´ƒù:¿ýoì:o^é¯ä¤ÿ×ÿélõÿêßùƒý/0ÿÿÿ ?“¬—}ÿé>éÿ¿ûÿ´½}nÒþ×ÿímÿÿþä�wëoÿù#ýG_õÚÝõ¶ûKÒoÿn­&úÿÿzø7ú^¿ûfn®Û^»ûƒµía±L|v“þÅEE_Íÿ¿¶|õºªÿUäÁ_ÇÁñþÅ6DZí5Óµ´¿ýµö×Í¿þ÷Wƒa¥Oµ¾ûímmo²#Ý„ÂäÜ&¿Ú—¿k÷ý×Úû $ëý±K{]l‹åºü4ìŽûBA¡Á adÏ£_^ïÝ(=µû¯b£÷kðÕMƒC†å�lÄ\q±^Å^Å{¶Ó²#ÚkÚhDA‚k½{ûO°½­Ã ‘Ö‹:[÷ë²8ûOMxhDDr`OÖ[B·×¯ÿB"1ÿü¦M@Ø-sP9Ë4, `É,�`JI‘h@�Ô äÀ’¢ €ÃQÿü€Üˆ`’Ö9ÉE-ô^ZE#%ôÓÕeŸÅ( “‚ÓU–nRdhÈ$ƒTˆ‰Û–ÜkÐ~ž‰çH7Oõ¿EöZþ›–½:M×äæÇVô½&ÿ-ÅÚè7×[×Ö¾cïî¾µ¯—.A Æÿþ½[Þ/¿�òŒÐ³VlŽ �)›'�‹KM.\¿»ïæÚ (A馘Aêƒ#Š<_üž=ÿöÒNâ-;Óâßý7´ß÷T_>K sDù¾‹æ’¤‰cÿÇëÝ$ßOÓzI:ÉóJ›þ½ö–é~û«·í¥M¤/þßãØÒoªëé,$.—ÿþ¶¿ÿo_Aa'ýÂê?ÿo�'AoMå¿¿'k“þ¾°–—kú_ëN¿ÿY6à¡ißÿi–Ÿýíô‘ÒT¾ÚEsFém¯Óÿôºz½}´µá®Å}ïÿ¿ìÒ-ÂK¤d¦{iZ±[µý¶Ìßû««M¯ ņbšØ[_Iïÿ´©¿DÁZ±M4 Ð�Ò¶Òÿm'b½¯ ŽõmŠÿb¶¼0„CNÕ~T†ˆ†ˆˆ0B1ÿÿþ@l †9myÖnR 9kõM-C+¤­¼¼¢w•À³!VU—mB¥tÜÈ(OOT�Kq »¥ï Lì•Ò'l)]d'~“{{l¯PD’tgÿöYØúOþ¹nRý/ÿÿ½}{öÿr¸6W2:´¼Rÿ”")e9�HÖÏ + fAç²9*¯×_ÿçÄ4�AAšAƒ3jƒ[ ¦ž¿õéÂ}§„XOÂ~ƒ‹ý/_ú|ŠíÑ+r;hž8©} œèŸdº¿ëé©|øN(OMÓpA[~›î¿ëÂ_Õ&ú}&éÒé¯Òºt¿Òôä[Jý?ôÝ7Cþõ„¿ÿKñ×þ“úúþ—üAá-p¶ÿÿÐk@¿Oé{uz ¿_ÿôñä€Oÿ ~µ×å§ÿÿþÿÐ_åu3ÒÒÿÿÿ']ÿë鵫ÿÿµ®¿oô½´¾A~i}/ûý½/ÿëí~Øýÿî•ù¥ÿéz^Å~×uÿµÒµí}µø2ïÚý…î¿Û«V×táö—¡á¡ÅÅE1\[b¿Ä{_¶Õ5²þ׸ð×îÔ·A„,,8ƒDb ˆˆäÄãÿþ£ÿÿ 0dP¥µäWø0:°œµ¨(A§h=-#+˜�i„ù;¬»Ì‰s»#³)¦‰Û—Ž�V&à�„ôÕÊN“šÞçü Ðz'miºom*}&ö‰ÃÐNW¬%~—_ýÒ1ôŸÛ÷¦ý/(?¥i­>—ÿúÚé?w¤›÷+ƒv«�M¥÷öÒò0gA”#„~(ŒÅͲxø½ÿé-¯úÛIð˜M4íB~©þÚM®“üU†�¤ƒAÅú}è=v+Òÿôé*'�Ç#·i"|íôO?öª’øI´‚Té<'~¯Ò„Ûk¦Ú„‹ûü´‚I7Mÿ¤ÞޭߢxØÒI&ÿìWŠ]=¥¿õ¶I¶Ez_kÕ¶˜imûé~’ì}8k tû|Élì‹ÿÿ·ÆÈ㥎‚Kýn›ÿí×ÿƒUïIw¿ÛG†ßÿ¯ýH"çþW-K^—ý'*?ÿÿÝe®3¶°zK~ÚS W¤ÚþÝ7÷å¿í%¦Òí~“~Ù£Òýé³JÒí&ÖA�±ìVô˜zZ·üU¥±ÿí«ì-«¤“m«ui{ºôÚ¶–Å5ím[TžêÕµý†–ì4˜­„ÂRM±±LWÔW±Ma¡´.Âi…î馄l! hDCD0†@pÔ7ÿÿþS Œ·2¨Rqe²J�B„89o\f€éËUf"M0ƒÕ=9n°! l+’ŠSÅrmWNõDñòíÌ•&‚€¸Aá5UÕ¶‹ì¶ê4òêOM;OM=T�+¢Ü¸EºVè44KƒåãÁJâa&ö—§ZèžeöYÚ É 'P]}¤‡ÿý6k�Z^é7í¯Ì=Ò‹sýº[®ÞÝ>–Œü®Pieq'ù¿ú0Uý´¿uÿòºƒu0èÀâî/þÚ_Ýé_ ôÓý?ûh.¿Ç_Òø‡{k%�{i6“kºéWë÷%ŽOŸkOöö×KëT·Òù.ÓÓìcŠm&+þ—úú½±owû¶—þ’_¯Ó×ì�ÿÕŠAÿ„«úÿÿߢø=çþ’þ©ÿÿ÷T�iþð—üCÿÿ7zöÐ"úWîuz + ÿÿÌ?(ªÿ¥Ó{ë®—í~ÞÚ]®­¯ÒoúºÒ¯%íµ×ý+®¾“«úE[ÿºm&ÒÛVÒm/¤ßëk×þÚÅGÅ1±ÛÒnÒÒm-ö)¦°Ó …´’mÖÂM¥È1§ý„ !aVÒI¶QLWÿˆhDDlu±T×Ј�„"Ôab0Â;¼Db?ÿÿåµFW9FCnœR¤�HbËT�SZA„Ó4 9h.GA•ÌEq 0ši¦ši¦œÈ�Î܈ˆŒd)•Æ ƒ ª§¦‰ÛDí¢íËì¼ËÊ'Žaú¦šª'meå'§IÒ´›Iº¸M?Õ¶‰ãUIÁRn­&ö÷KýòpÑ;­=Y^°…pÂÓ`¿¿¥¤ø¤éte:)Õ?åp�Rm']/VÒ×Ûïïo½ªMÿÿþïXõÿ¥ÿ§m/ý×ò¸3+Œ>Éߤ×ÿ˜/¯í¥ù²Í: ŸeqŽ¿ÿQëµÓÿûi~Âa?ßoý}ÂI{ñtÿµm'J!è4–;¥íÿ…_µ‘ÛÿºM¥|—y|åóÒÒŠýÒöÖ›ÿÃVÒbªô�'ÒÕþÿÊô4½Žžÿ±M¥ÓzÚúZKì†Â^ȯï_ìW¿OC¥¤‰à~È�ÿA{]?ü"7DñÿüzI?µú¶•ãÿß‚ ›¯§ü%Møÿ™ØKéÿê“h¿ÿ½—é|.–÷õúM¤ÿÿ&ïKöÿKRÜïÒ´›ôé7ÿßï ¿ÉïÒµI¿Jÿ×é7÷úäõ7¥¯Ú_º]¤Ú¶“i7[Òoÿý{Òoû]´›IcšÅ1ÇÕ&ÛívÕ¿´·m-Ž+bši¦¶©7¥iv•¥·¢ c_b¶kh0˜A„ÕºI¶Ú[i6½ûím0„0„DlROÅ1[~ÂÄ0„DmbS@[L/ !ahXB@ˆˆÿÿ-ù”ïò¹Cÿ�ÿ^d°gˆ�*f.`�ìØÉaÌ‚àša5 éö˜Aø‹OAÅñhy+"ÛDù† +_d±ò|Ñ>é§­Òºz}WO«ÿZýñúéýkÿ×ÿÉÂuÿÿð_ÿÿøDGÿÿÿåÏßÿÿÒü£ÿÿÿø_þ×þ»þëÿO´¿ö×ïk µÿãþÅÛÿ²#ÿ²$]…ÿ†¸ˆµƒ†ŽÐâ"<·J]­ˆV�ÿÿÿü´µF¬ó"Y0f¬ëJé ÔÌ–â#YȹNÓUl ü÷2SÏ‚�a2,Ó^Ða5ô­ïÿxA„Ó¿Ñnæ€ë¨OAñàŠy½ÍÆ–£Ðtžµí+ÓÄsQÿ °_Ò¿__|ßš;_Ó«wy[Y�é6™FxÎŒã(2s5#NFhÜH"r( Ìѳ'.�f3h?[év·ý,Ödˆñ9 Ìfƒ4F"]êCËŒôn=‚¿³raz „L дíPi¦š†¼XM¶ê/ÓßøåXsÚ„Ði¦ši¯0ù‡Åö©é�}E'¦‹‡% áÆ�má¢á¢áÉÛEßjNÜÖýeãØHÙ£Ç^\h¸  5´\4]¸¯n¹x÷I‹¶Ú…69x^4^:zm ðJéIÒn�'Ú¦Õö+}÷Ðõ°|ž8*‚u «Ó¤Ü/×ßn’¾ƒI{Õ?½xÓÕÖ5tôÿ_ï�Õþ1ŠÙ ÚzJþ¼q«¯¿«â·ìèVŸVï½éµt…o÷ú¶ô\=þÃ~é +¶Ý«×½{ïû`ßÿÿÁÓ¯ÁÁ…éëKýÙè&ëöDmòtõþ¿õÿidQ§ý„þ0Áõ8ÿÿÿ =_ü7šoÿÿ�ƒ ÿÿíÿá�þƒ†à¿ÿÿúÿÉßòEÿðE ÿï_éËÒPÈÏÿE÷ù�¾åé!°ÿÿú†ÿ¿ÃûÍÏkÿò˰oÿ�ý7Û¿þ¿íí_w³ûkí¯Ýßo×Î~÷«_ìõ»¶¿¿¯3óöbm/×÷?›þ³þuüüë×ÿëÎzÝ}æýmzí_sч—»¬úúî´›¿ÔÅkÿÿÚÚÚÚö­¥jÚûk÷M®›iZ÷kÿom+]Òµ½Òm]tÿíu¶ÒØi+i0Âý§ûkiE1ñQLTWÇñÅ|TWlWýŠb¢¶)Šb£Šb¿ßŠéØ­Šv)ˆU±þÄ&*Xé…M4Ða>(·Ìè0’pÑtá„×öU´ÓA ÂaVý<Ξ�ªam5ˆeÜDCA…A„jFS‡òÛ Å¡ ÖÙž"#�‘™$„j"8ýmé/K_é/õ¿�ˆÇù\i3ºf¬î"xšs%< Íkg»+_ùëÿ×Ûãõ_ÇñÇ„þ¿ÝæýäF!ÉšÞfe ¡×3ÉÍ; /ò)üÄcAäqžÂ a™¸ ðš �&�Ù°§´ï·úqß§éè4=áü¸v×_ó 0‹½l)y—dí£c -�Eå�ðû Õ¿ôÜ÷Té_×Õ×ÿ×ÿÄjŸQÒtŸHÿ¥þµÿÿý}ÿú_þÿ!b}ýzþÿÿÿãüè ÿÿÿÿÿÿúÿ£wëÿ—¯ÿÿÿÿŠÿýûþgúWùû_ø¢éíiÿóÿÚ÷º÷õÿ«Ûÿïÿ´ýýµµÛ[_"[ Zýÿí¥a„¶Òcئ/ö}Šbþþ½ŠmØ­ŠdŸµ#ýzðÓ%§ªêš}¡a!„ ˆŒDA�r¨Œ²wá¥c°£ÿÿ”Å@lyi�ØdÜÔ �‰�( ¿òЩ¯ãÿÿÿÿÿÿÿÿÿÿÿÿÿþ[™—gcYÜÂË\³+C(ŽÕF²´2ˆ&K.ººº„N•¨ku| ¾¿]h$ŽôªY�ëZôוÈËr$F�¹'-¸¾¡*¨¥ã2 Ê|)“™TJ⪸ÒÒCã]«[ªë¤ˆ]ª�¡˜äW)û_BÓ£¼�F³¢B5�ÅœÊpòžue Ôž:�")Õ™²sƒ(g™@É“ŠPÈb¡áBïî¾B$²Á0‘0L&[ +¡&¼ ‹Æ¡0™ñOµP�a„XáÎ8aQ±¨'­üímfJŸ“¾� áB7°‹ÊhÃѺ“®Nê‚l*8ôw£l*¤Ü á(I°¨Ï¤ïë¯ú¥hïP–ªÚ ¤qÒ ÂZXG}%£½aÐJ;Òtœjç©i:NŒ=&ÑÞ‚xãéê¤Ç’4ÍHª³[:š©Ôˆ)3Œ� -*Ò¤x„› iiiUiR¥IPIÕ'J’Ò÷AhñKWWARV–—ò’R:–EŒ˜�F¹²: “#Yž# ¦™B# €È”! Œ4D˜L±¡:0ÁÝD$Ía•qsÖ„Ê"ä±úKA-%­--%K].‚ZKV’ÚJ–‚UÖ’¥ìlkIÒÒ_›#<Ÿ(²`�šfx@Â4a"©„la3‚i£XlŸ“™�èÖônhÐÕ-ƒ ¤é6’é7¦“hCCI†—ZÒÕ%i$–––—K¤µI}iikU¤¸¥øªÝ%Uðœ¡PL4¾�aªhðÒbÙ3‘ÛI†–ˆí£ÛA6äÔe¨ZNËBmôœ ›IÙhL0™sI´Kš#––5¥B«¥ŠIRIV4µC¯®=$—ã Vî’Ç_Ã8n]]+ néaSm&PM¥¤ôõoxM¿zN–é{ãÚ[«ÓKtô×~´¾–«Ò®¿®µi%iÕWé+µø¥ôï¤8t½÷I¯uÿíz§I¿§Òm×Kÿí}ú·ݶ… /T–¾ª’¥ªI-/ÿQ +©iR¶ôº¯O÷Ž©~¢í{þ¤pµ»ëû^¿]}hkëêîꆒÒKêµ^‡K¤¿×t¾–‚nëT—ÿÛ©*ÿ^ÿÓÄõôßÿMªããü9nV‹é¾XÍòåÞ—¤•%IRK]/KÕU~µm¯Õø~>úÿÿ¢Êÿÿÿÿìnsªét¿ý÷ÿ¿Ð_ëÿ¥ÿëÞ—¯îÿºÿí¥ÒZZZJ––©%T–Ò^’¤­.´´›í/ÒI-´—¾’z­/þý·ûþöÕÿoß×ÿ9÷u·×®©*M¤«¤ÝXKItµ×ô´´µTž�]*IRÒ­&먫IP¯÷žý»Ýoû¿o_Û¦×÷KoM;Õµ´›3Û[uÛ?él3þœTTT8­ÅE ׊B¢¡ÃmÚ¶’ñZJÅZV´è*…ÿO£—gÓwvÙšý�rû[>¬'iw}—›«† „w1È£‡`Ž;za‚L0œ‰Í+dQÕ¤›iÕUBl% +S +‚ ' +šªl$ÚM ª¡&¦›I°‚„ uO¶Â(}¥{`­—­�ƒ Úl6G› …JÚa5 ¤È¯ +›› ˜dW±NÅBv†“™{ ´lU„“ $M‚„ÕSdrjª©¤Ó¦*iˆAˆLUAT"â‹Å1 +˜‚¨4Âp{ÚZ 1LB©C˜TúM6«[†Å5ÃÚ vÓ ¦˜M4Ó ‘êaa!"¹�\"9ù�²a D1®*Á‚ ˆá‚a 2­£Ü40ƒè¬`ÁB �Œ¬£�•$v(ˆ"&ÁQhK1n|ÈÆâ#×_ÿZÒë­ZKÅ´­aŠ § ›A«- +`‘ˆÿùi§E¹&d³“Źâ1�•Gió‘Ù]-Á¢l¥Ê3³(®gžŒÑ¼â‰¦)\jUS8ªpªgS;j(R§V)ÓÓ]µû…;�¯ª¾L%÷}Ú~n/îÿ]ß~�ÿê·ú»¿»´äd-7Ž>?Š[øúÎõ_çiÿï¯ÿ~WRÉ}Ç_õÓÒuÿòMUõÿõÈšL’3«5�ä!d‚:"2$? ÑN)Ðd1’# ñ3t¬Ê±Ió!æy34LE(æC)ü¤A‰UÎÕù ΦIš‘¢!²1™Ä<Š3ÃÊ #åœÎfÑÄF + B"yqHb"'#„D¢f¡ÌAàŸpÂ^ÐÑ>wÖÂ5†TaÙ¬Ï�F¶pϘF‡æÅa5†sÄp™™žº¡ú5¶7?£Ûѳ��§„Ð'T…†ª�l$ÈýíUé0ÒaªM»¤þ—á¦’Ò  ›I´³ÐÐ3IÂ"à +‚m._ÓI6î–©7Ã8aÚM»¤ê“®�lÎ §é£sŠhý I´ƒ þ˜A6“h”4xr\˜H ÛúZMøA6  l²aËæ“l™Áœ:vM ´4ž�+ð©iZM…Ww÷tŸúIÂN“¤ÚLBtt¸&Õ+I÷v—Ý'T›á:Ú^é:¤Ý ØA6ˆ°ÑNXÂÎG�(a ÐP–•¤Ú»,äcÒm'A0ÝÝé·}'Kô­éwué´›j�E¤›D£êÒVéjéjß�¨î¿½}RºM»Ní¯ºúôÞµú_¿ÿþ¿þ¶á65°µú÷JÒ¼^Kkí6úKÿÿÝiz§·¿]êî)ij·½jG [ßÿ_úZŠCõîõ¾½¶ê¿]ÖýÐëúÝ[â«OôþÚéj»~ã"ƺû}[ý.¿R8WW¯CÝ+÷¾­ëøÞ�Vûø~?¶£¥«oôØþòÇ#ŸýGÿëþXà‡õúö†×þ‡î¾G +¼?BšßÞê¿×ä9ôãòÇ#¿þ½è˜å^ÔÚþ£ïØÿ^•ÿúC^÷ÿ^­þ�ÿ^¯‡,r3ÿùc‘ˆtþ² £¦áü²ýWÿÿEˆk¯Žêßì?o_¡ëªöÃõöÕÿõÿÿt—ÿÿõÿûÃÇÿÒ^º]‡úï·Ößþ¿õÿÿûý[­Òÿý‡á¿ ýÿøEÿÿÿÿÿð_ÿì4¿ÿëÿدú)ÚÿÿþÚåÿÿ·þÃÝ{ÿÿ û~‡ÿ�Ÿÿÿ‚ÿöè„oÿÿú3ÿÿ†ÿÿÛ_ÿ þD2;×oÿÿÊyÿý/ÿÿÿ ÛAlW}þàß„ ý´•þÿý_û¿õA×ö‚þÿ¨nþÿ¿ï¿ýûú¶—ÿézZOÿÿ‡úÒâÿ÷íø_ìRûÿý/ÿý†—ÿ·þá/ÿÖúûÝ/÷ÛýþÚ_×þ—ûÿÝ/ßuÒæÒ×ÿ[ûú_¶—o×ý%þÝýi¯ö¿ß·Ûÿx¯û§û_^)Šm½/Û¯^ô¯üÔŸ¿Ô$ßÞÛ®y?œ_ªÿ«vÚÿ®¿ïëÿ¿½ÿ¿õ{ÿû®öÝN«ýW÷®¯ßÿÚ×Û÷«õíÒ×ÿonëT¯¿_ú^ÛzþéoöÉÕ÷OjÚßÚŸ_¶NµmoÛY�_MýþÛï÷K^ßÿ»¯÷Úûf‹õ»3úµýºî®ÖAý™ím§gö׺צîÓ÷°›mŸ­/½+.¿lm¥XE>í´öé?Ø`–ÇöÚt¿šÿfÞÙžëÕퟴÿ­ºoÛ¼/¶¯Ø@öÂV“iY]+/¶—" †Ã i±l0IÒOVBí(àË•§°Ì “ÚI¦�¤É@ki±LU¤ðØllj-šlT6›h-Ó %~ÙyvÁ'M†a…m+Y %"»OW¦Ò�ƒµc†lÓ ±T‘‘|RaA1I á¤ÅÒ6ÛÒlŽbƒ ›$:alS%vš §TÐa`Ò ý‘ΚL*l#„�¶šdòÈá ãÓÓ M2W ”-ж“šlŽ¡H4Ø…I†E{›A0é„›˜NšwNØA0ªÃ%U'l'¶� Âž(„ÂGÃÙâÅ0ƒ¦|&= Á ªÐƒÄ"�±ÑYD…ˆˆ†!Œ$Œ�]äŠÈô =¦+¨«` �a0A“FH®š˜Œ­§‹uDv§¹7¼q`‹J¹ë¨®´¾¿é%„­¤ alUê-7ˆˆÿþ[Ñ‘Tv"-Ö"S‰²©I¸œ(S²% +Fâ-aer˜ÕÑ“6ÿ +þ¡T”Ë»¿º ß»«ôÿë_wÎɯA¯"û÷ëÿ_U×þ9ŸþŸ¤¿ÿ×,ņtˆ�9”äBˆ†ŽDlf²R(2Î…’c(HÑŸG‘@Ê#Q¡E$ +SÆ�Ê$HÏ8G£ˆÆˆL›4Eù²:åZÊÕ®s&Ј<§3¡&CeKdr»4ÂaH5†ReÈ"à0¡(ÌEÀa' ùMÃÖFÊ3†�l¨Ñ +0r|gh÷*ôÂ.̃XaFš6B5Â/;QG¯4ð˜F·2$¨Ž„¹qJ'FȇÐ)ˆØ¥Ù±žÉàáQ ��‚4Ö#"ÜF¶O˜3˜A£C„ ¥¦‘»I´4m MPA´·t ´�¤é:lš²\AØIÂj‚l ›I†š„¤h-Y. ¥“=–Z [I¸F†g&»� 4B‘lSªBþI´›Pš6“ 5DpÐNt›LñÁÒl"1éZ%ì+Õ¤îé:M…tµh$Ó½~ê+]'P륤ôïJø·Ât›¥¢,4¹|Òp¨÷IØMT¶YÙö“¤ÃAži:V´ µmtºzmzk½½Õ´ŸÕÖëIñ}ïKQv½&»Ú­Sõÿ}µZOé=6¾6–ïêÿ¤êõiinÂßßÞ-¡CkhRm¡�zï÷ë·#…¡VÜUãKöéýúÐëí¥íÖïíé=}:CWºŠ‘Ââýª_ö“«»ý~«XöûzCÝpK]V‹Žž›×ÿùc‚Ö×û×é{{¯ú®×^Ö÷Cï¼±\±›×_ê]]`ÿ¿`ô‡_UÅ¿ÿücúý�¿ß]ôߪ�ðÕ×÷÷ÿ_öý½%oý¿ÿíRÿý/õïúîšëÿ_ý~Ã×ÿÿÿÿýX·ì?ÿÿ÷¿ÿþ¿þ¿÷×ÿ¯ÿþÃÁÿÿÿÿÿäœàߨ#¾‰†ÿÿý¿ÿá?ÿÁÝíÿÿðÞ‚ÿÿÿÿÿÐNßuKïÿÿÛ_ÿþà“ÿú3ÿõzÿûÿïð{ ÿëßémþ•ÐKô»ÿ¿lÿz_ßáþíú÷ÿßÿûÿ·ýo¿ïw®þÅGï½·Û÷~ÅCÿþéþ—÷ôÇ¿ûõöÿ»i×·¯u÷Þú©Ïý¥Îo×{o½?ÿý/ïé}‡_ÿn¾÷ùÍý~Õ¿ëuoöÛ¿úí¯ÿlÑ[kº÷ïÿþÙ:ëïëÿkµÞ¾Ý×Ûé0ïþ¬ÿ¶gÚ÷V·Ùšlþߨ@®¯ÚÔ WVÚ°Ïï]ì3Ó}íwöa.ØKÿ~–º·¿¶·íš'_nÏÿÝ›9H£‡§iI6% “m&VBà †c‘\z«"˜ðà t“bƒÚJÆÅ1½jȹN;V+a;ÛAÝXG?néÕ°›—´Û›I=†nlOOU TI¦�à“›a$m Á˜˜[˜ ÉPö †‚N4îÅ&ÂiŠA†ExaJ-½& ¦Òi°°Íš«˜JÝ4ØúA² ø„šaŠmšaŠ R &›œ0štghÐÚ AFÆ BF†„Â`�„ hDD©XÄDD•ÑÁJ興¸Œ¢ØÊÌ£b*“†ÈáOM]²VŒñ ÂiÚ=¶b«Ec Á#Û!¤|ƒ&tYÖ�ŒÌ¢LDDe»¢Ö‰¸íðßaðôÆÍ#ÿùi™2e•â-ÆFCqÙx’Ge1Ý +W%Ëu£;y0S"Ô‚çeS°=JT)ÝPP�\žSáJë8#;R¸ÜâE-°ÓÓUÿKÆË$é­R{}Ø{îîöê4NÉõ×Qõë þûõøU»ºNÖÖ;g`¾9ÝJ|~–ùÚÊ2Y2X¨û®¾ºß;ÍW^½µôÿøã­¦©å¹j²—gTjÈù�3ÊèY+ ¤HeS¼Ù�"†|Ê|˜Ð)ž3Ù¼ÚDN› ˆ�6D1‘´O‘Êè4D Ô"§'äÛ’ù'�e#HÖÉ<æS™—:¢'M‘Ðd˜ÈdtG ñF̆�³1 Å3ƒ‡˜Pdy4<‰yH0õ4lÈL3²Ñœ#<#\#XhÐapEâF`ÈJB Ã4 £c) ˜Lžd^'3cÙb)Œöºw„Ѭ2 gŒü�Ð�a„kÏi„leL'ódH—ÂĘ";'‹š"Lô=ƒhŠA¬Ážf€h„¨„óXeL.˜FÀÂ5†¬a4Ô&šhÙÙGÆ~FÆ’hㄚC ›I‡A¤é6‚aÚBÃU]˜A6š3¹“jж� CÂI†“²~šVZíÉœŽØA6ÓJÒm ܙƓ 9Ý£ÛøMš‹è&ÕuPƒI‘Ö-&¨E»dÄ8L4.Fr;i6“iÑ!¢, ´´�Rl"-ÒnLbh*N“i6ð•'IµmÒl Èæ¬°$먷éZm‹«ÒZ[íx+xOßA%t›I·”iµáœ4­&Ùh¶¡Ùg Ï5ióI°©»M+hœ j ´­'JÐL'‚nNx¨…I¸&Òm¯TµÒmõK]&ýºW¯}µ·m%´Ÿ÷ë]÷­Sïv—ÚoÓ¥xº^ôµÖÓ{{þ“ïÿ«¤ÛM>ûJšî•¾¾û¯¦¯Ó¯“Ú[‹ô)oíÆÖîéF»zO×î‡ÖºMø«oþŸï_öÕéÒw¦ýmÇõ#…H}ýÛqC»}¿¦ûIëC«m^µïVÚõ…ïºÿÞµ÷¿ÿÁ6¯\±Èçö«ßþ¤p·Âßv¿{íßúþ�Aoýùc‘f7_u÷õå¹Ç4ÿëË«¿ÿCÿËþ×WoKÿùbÚ×Çý_ÿü‘pñÿÿÝÿoþX¯ÿñ†Ãëýþ¿Ävô¿÷ÿõ_ÿýÿïÿý&×ÿïÿé _ÿ¯ßÿ_ÿ_ÿô˜l?ÿö×ÿÛÿÿÿÿ÷ÿÛý´qéÿõÿÿÿÿÛ×ÿmÿÿÿÿÿ °ûÿþ¿ÿ¯ÿÿü—dwÿÿÿôßÿýëÿÿÿÿÃgÿï_ÿÿÿÿÿýƒ`ÿÿî¿þëÿÿÿ„ ÿÿÓÿ]/ÿöÿÿÿÿý‡Òÿö ÿÿÿþïÿýÃÿö—ÿW_ú¯ÿi÷ÿ)ÝÞÝÿüW¯½Ãz ÿàÿ_ý¿þÿÿ]Ýÿýx®ûmX}öÿÿº_ëÿ¤Þü6+ÿöÚþÛþ×ÿîúÿú8Ö¿ÿÒÿ߯ÿ·}ëÛ÷ßÿßþÿúoý]»Þ¿ÿýÿ¯ëÿöú_þº·_ûÿíÛkþ–ÙÓÌkï_ÞÛ¥÷¶ëºþÞ¿¯þ“vþýÿ퓯olÓuö×úþIõëß÷Ó¯÷Ýwíš&Þ¿ëÍ?ëzûJÚÛÛ3îšÛÛ?Ý)çiwÿL3ëïJÛ=ÃM¯ý³ ¶ÂM]Ûi6—o_ÿlÏÖïÿäCJëÿt¾ÖÒlüÚ_z[ $é´•´µmWÛNÂM¥í„Øa&Ò­ºOdUa› Øzv“vª�±±í'"ã¸íX­Xئé4ÛA*~ôØa+¬½"Ž"cOaéÒM5d][i&Èò›!ËŠm š§i&Å6•¥ ´“°Ú I±†(6•&ȃ¦(6VÃaƒ Ó ÂiÊ€ÂÂMSL& Èá5¦Òa6i°šL274Ä$ÓlŽI¦œ&šlS &*  ¤Ó Ý„› &šp“`ÒºNÃA‚l$œ5ŠL0™‚‚±JˆHýV0ÉØ&1FSÃA‚ B§ BžÙ@Á,L¢‘Db"¨Dg¹!”¢­ŒÊf2º‚•\sEÜ«a„ÈÈ  ÂžØa#ä�sÓDr AJ̤(P�ï�ˆxB#,sŽˆ0A‚&å»–© nMÀ÷¢Ýmˆˆ­Uý%­xAW_I/^‚ixÙ]„àÁrÉpÇÿÊeo-Ò©n­êY\+‰E‘F)ØÌª¨S°âxÈO +eÐP’Ñ› s%Hïà§cÁB’öšîA0þÿ«[úïI” +Þÿw÷÷\·©bAÌáa½S×µ‹�­c–õék¤‚ ´mËsùUÇ¡õÕ-zIðÝýÔ�,ío"l¥DnS®E Ö‰š5´Ž¬‹žr"‘ÐÈÔELèd¾O�Q̧f¶™,—3[U§¶éä]/�“3Q ¤ˆŒÖY"‚*ѳ"8Ï£Z%È‹�8ŽgP�‘ã: §4B"†{$‰Ù(€�š'Ì 2|ÃŽh„™Á‡�ÌÔ'2Îx'0Pdð0ðF€Í‘óXàð�‚]„{ "ìn #@2�¢4ÃhˆBeÜŸG³ Ð $‡næF‚³„z1˜Ñ¦È¨ˆJùP�3pd„GDv�„khöbà‹³H hÙÎÑì0©’0ƒ»r>ŸÂ5†fGÌ#Cã“ÓA„]†gyü#cPš64lÍ 3cM4kjšA½BÚL;µTƒ &ÒA8{„ é¤ÚN“h ÚA´Âa0…¤ÚMè'T�&ô¶Þd«#]ˆ¦3ÚéÏœõØUM0¢ÚA’ôÚN“za¤ÚN„4ÕÃi„©0ú>ÂiÄ#ÛA6ˆ°äÑI†ˆí¤ØA:ON“aOXA‘Í-–„ÚN�l;„0‚t›Uo{>ÒÕÒÒt›SæxÑ.ii;, aW'_î¨'dü  +ɜƓ²ÏéPgó§IÒµÒ ᥥ«h—°®–î&÷WÞ�L7JÐ'p©6‚tµÒÔR½µzt½+Å+ù(®¿‹ëí¥¨¥®•ûáÕÒwßQ^—mê¢ï«P›Q×Õ*×ZJÔRé÷WÅÛÚïKI¿Çö¿Ý¿÷Õ:t»UiºÜ_ÛÝÆ‡N¿¡ÿý!ÛwÚºÒ/èV¾ý·Óÿ{û´î—ê½m:]w[B†Þÿ÷·[N¤p­{¤ÝôX†¯_Ãïý!ÿVÿÕ‡ŽëúB0×ÿHvÿÃõÿÝRëØkÿö´¿Øÿë}AÿêÃßúÿØ{¥ÿÿÿþÃýuðßÿûÿVÂÿÿ¯þßÿöíöÿúõ†×ÿaÿëÿ†þ¿ÿÿÿ;Y¶ÿaø#öÿøoÿaá°Fÿù›#¿ü7÷ÿaº;´¿ÃÿàŒö× �lŽÿÈ¥†ÿÛ¯ü7·ÿÿÿþ‚p  ìõûÃÿáÁ´ÿþ‚þüÿ¯ƒéøoÿü ·Aa´ ÿ'ÿ×ÿ úÿýéa¿Òôá¿þ÷ ýúXt»zÿÐOï{ëðÛ~—øÿô¶!Xp—þ‚Ûþßïðü?ÿý~ïK{é/_ݺÿoýw_µÿ¥ßýý¿ôý1ÿ¿ÿúZ6—ÿõßKâ¾½÷ýÿÛÿ}r­?ªúû~¿¿oíúç»þª·ßœNÛçE¥]ØëüŒOÿÿá&õþõSÉÿn·_9ÿýÿõíÞª»}þD¶›¯í¼Ÿ«ÿûÿn¿ëÛÛûîÛ]%ç>Ÿýÿõ_:ÿûª]výÓkÖÿ·þÚûfiµ?êÝ6g믮Ù�««~ÝŸß]X¯Z°Ý/íulÑ[wôÞÚªU¶éë¿n¿µþí�~fZûvzÓº´¶Ïz¶—mª×{gÿ³ +Ý%í[»°Žì�é0Ò´¤AÃNEpÛ/°ÂWV•„Pí6ɰ­Ý6 ¶rO‘\;JEpÛ96–šz +EpØ`–^°O´›9;kiZ{ïÒ²ú®² áÛ %iH®i¶ ÜŠàõÒM�«t˜í$ôÕ6)4ØÓ ¥h0Å1ÛÅZLV‚…§ �ˆM„ƒh& tbƒ¶JE„¤Ðp»J¦ÒNÓÒa;Ä Á˜a;H1M† 0‚J�×A6Gm8i1I¦šh4á°M6Å6”-4Ãa»L&+ &ZaƒI’¼BM­4ØIÛ †‚ « ‘ÀOM1A‚Ša5<6šaƒÓ‘a6Ä Â„${£ãh4¦ƒA‚ R+¦QÅS@Âh4•Œ1A‚Ñ BªlŠKjUÑí±L$WQð«=²4ÉôU¶…v bƒQòPš1QL1DF¥™šJÁˆ‹–ê#%˜DR“bÔ‘ÚDíidS�‹{k ý{{h/Kª[ ¥ê¾¶öKi%¤8otHT1LFÅ'¦ƒ�]¹íÅñ‚ˆÿù`KTÂ$fW™ŽÂ£¿Œ®‹±Ì½­˜Ü,®l³dt‰À™‚_wª!&  ## '‚HËš40�höF°ä$Ïü&xFvpq„]²}?ÂhÖF‡'äŽlšaÃØ0� B42OF¶���� ü „l °Ó��!PaBnOk #;C3Ѭ2Œ'D'B�aûéxz5†cØÊ$Ï^˜P˜L#cÖÔ'±�fÁ N‚a„‡Ñ±¤Ú@ÃTÂjƒ[&ÐNtŸ è^‚m¦�L4Õ½a¤Ú[¸A8Tƒi:NËBmPNN“rDXi6—fÉ„ÐI´Evˆ®õI´ƒ²h¤ ¢­äÇáA¿ý_IŠI†Õ–pÎ#¶­¤éhŽÜ¾ &Ü=:M¤ì´ ÚM¤Ú áh3†dsIµ­–¢^õÞ’°¡þ Òm'wõJÒt·K +®ºVï Ò´¸Níz@ƒz¤é[AR¼[¸Û¥é$úÒO'éá1 +Ò×A=JýE+KÒ´šIºvéºk¼TTöô¿÷jýÖÒý/V×_÷ƵOé¿Ié½RÝ·oÒý½ï¶·ëŸZ_OÞ?OÓ«Óµ÷ÿkïí«¯ÖÓm +— }ÿ´ýmêG ‹õÇþ®ôõ××ÚñûZ‘ÂþÛu[NÓî£^é6ÿ®?UUýt›wý¯¡­ßmHá~ã_]!¦ÚwC»½ýïJ6½ôXà‡úÝmqñÞh±ÈÏþCÏï¨ý÷øû¯ÿÑc®ê:ÿ§ÿ}Gýù"~&9*/§×ÿ¾]aÁÁÿï÷¢Æñýÿþøÿ¢ë_·^ûú_þÿñðKÿ×ÿÿ×ý!}‡B¾·ïþþÁ°Øÿî—ÿëÿýk®Ãÿÿÿ×ÿýÿÿè&nä�®Ýo¯ÿ¤¿ÿ°ÿýÿöÛoÿõÿþõÿÿÂ(~¸oÿÿÿ×ÿÿ÷ÿÿC¾ÐEõûÿÁÿá¿ÿÿÿðØl7ÿù<í×ßùßÿûÁ>ÏÃÿÿíÑ1¿úù/¿ÿÿÿÚ {uÿÿú ÿü7ÿÿÿþÁ¿ÿÒõÿý_ÿÿW Ãÿ÷þ’OÿøKÿÿÿþO¶_ÿÿa/þü=ßÿ¯ÿØwÿ êúúÒþÿý/KÃßÿßû %ÿ¿i¯ÿÿô¾ õ¯ÿÝ/ÿ÷ÿm'ÿô½Ýÿúý‡ëý¥ÿÿz^—ÿïÿë×^é~ÿÿ¿ÛÕuÿÿû_úoÏ'wÿ¶ëÿóRs ÈÄÿúëíÿú­íûi?¯ùÍßÿîþµõ×ïþëÿÿ“§×ׯÿöÿõý{¿zm×þ¶×¾ÿþ¿vúý¿÷]êõï_¦öÿÛo´Ÿ^®½½ot¿û­úöa6ºÿÿ¯Ý6iÚmÓf{k¶­™«¯ô¶ÌöÒë¯û_Z³êÔüšÛgûNû¾Õ»°žm_ÚW †{ûìôÚz×ÚZKÙúÿmuß¶õVûO�ÇÒ½³ ½vê ûÒa„¯Òl$ØM²õ¤ØWI4ûI6K«JÒd\þ‚¹ÃØÖµµb Ë“!li†Òc†`¤\ †›jÅ1¦ª¡Šc´à ;JÒµ T6"ãm·‘q«§xa¥ Ám¶’iÇjši†*G&´˜„ÁðÒb˜âmÅI¦�¤›¡¥iCJ“ „á„•…¸iè0šl&š`°È®­´d¡4ÓTÒlB Šé„šiÃa28R VÓà–\ӆ§„›iZv“M­0…0Á8M5Û ®ØA4Óí‚a4�Ê‚:“M1A„<  Åb=Â.èÐä* +ÆLŒâƒR²�ÅY^VÊ‚#‘­0C@ÁJ†W3ª•²XbÙ’ !•²» +„a +’5¢OUˆDƒD„T\¤€�‹H†!â‘�*u£µD"8Ј¨ŠE”SÆ‹$Ãq„"+ˆŽ">—úWúJ¾W$õýB `‚úKø¦ëÊ‘ �+½XJÓÇU‹: ƒ96[sã-ê‹3¤ Cÿ-³6B¹fªÆOBDaL§DñÙm,‚ˆÈ1L…p¡KrÖdd"lŽÌŒø ƒ1›Ê2„4Ì á"«#™ áè„!:`aˆsÙ"&Ë@Á&BLè"†x#)"Ó“„=Þp� ‚ Ï63q±‚ Ÿ0æK M’!•d|] !0Íòh ” ‘„ #Xdfg„E°Á.ÁÖ=½B5†pG€ÏóF†�aÈø—…åØF°a£ÃP� Ñ±”úhØÔ&vK*6‹±²~ Ò3i£uSA£c +ž��ý4lhÖÓ4Â'‚64háB7©£Ûônaˆ§GÎ��ÄSHØÕ:5´ljžz ¦6°ì:Náš„ÒmSP‹v“i2>M„Ÿ¤ƒh&Õ÷AH6Ó PZ ´h ØI°�œvl’l!¤ØDXhi6M;…BÒa¢;£Ü ›D[²ÎŸe‹€Ï0‚m,,«aO… :MÉ�%apÒI¶O“ _I¶OÐh ›p‚m&"Û“=m»¤ÛºMËBa„ÃI°©ž&ÒÕ¤›ßI+IÒp½*N¶­¥ý\ ÚZ%¸A´J)]>üœ%á0ïà›úÝêû_Ü7éin©7N¿÷¾�é6ý|”jé<´°ŸÒo÷tžŸ¿­]']FÈâ­¥¯ø­ÿëi7´–Ó»knÒÛM¸úÿã§ÓªoøÿN«[¿¯Oû«µ¥úM¿ß½ºªmš[ßÚýwì~Útˈí;×ñ|q¨×÷{¥¡K¤5ï¼n1îÒ_»¡µèßþ‡[NÓnê5ïVï_¯¶•é[úQ¦ß·ß鿽wÐßñý:‡/Ã\†ˆ{ékËm¨þº ƒ ”ü‡Ÿÿ–9ïËŒ÷áÿòÜ�/½ÿ×ñÿm¿‡ÿiK�KþÿZÿ¦þY�ëø°ðܺ—ðå�ñ¯ÿ¹f2ÓÛÑu¯ÿñþÿ�¿ú_íúý}¤ÃÕ¶ÿÿÿÿ®Ã×ÿÿéa÷ëÛºý%õýÿòâúÿéþÃÿõÿü/ÿ¯ý®Ãÿºÿÿ_þþÙ˜ÿÿý[\0÷ÿÛõÿü#�ÿÿ×ÿÿÿü7ÿàŒ?ÿð¿þÃÿÝÚA¿íõÿÿÿ¾kÿÿàŒ=ë ÷äGø7·_ÿ‚_ÿÿ_ÿ÷ÿøo_ð‚ÿÿÑÿôÿÝxo÷VÒÿÿÿÿáÇÿÿ ÛAaÿÕü7ëýÿ ÷ÿ|{¿ÿÿü7¿ú ÿûA}õé{¯Aþ¿ÿÿÿþ¾ßÿý.GHí/ßzÿoÂ_õ}õïÿ¿÷ûÿö¿ÿëû¯„¿þ˜7Ý[¨¯ßÿÿÿ¿u÷þ–�«½/ÞãïoJÿõÿ]ÿþÿÿÿ_®½µú¿ÿÝ&<�?|7¾í×ÿûuþëÿúªY×úvÕ|Þ÷[ûî¿û{}vßÿ·ù¦×þßë¯ô¾õê¿}?ïOMû×ïÿuÔç]×·ÿößëmýþïÞÙ¢º½¬Ñmš-vÍö¾æŸögëês×öÌým+¥Û¿»Kõ÷§«®Ò§ûm×ÿýÕÿn¾ÙšÿÖAýŸú9]6³êÓÕºlÿíÛjÚL3ÿúi0Öì%i[ &÷OØiZí¥í˜î¯ìƽ¥"Z^Ã=È£‡eíµ[°Žàý´·µMµ}†r[g§Kìº]XvéX"�ÝY}´•6*z§"¸6 %iZ¤ÅÂpeÉ�ƒ»IŠ¥cb�&*a¦�„˜¤Ø­d-ȯMÅÓL1I§ØKA â“L1P]„¬$šlp�ˆA0Ú 4ئ“M°“]Òm ¶˜¤Š 4‚i±¦š ƒÃ &m&)´ 6!iÚl&­Ša¥¡ ¦!4Ó +¢štÙ&dÇA§tÓ•„ƒI†¬Ž‚VÂdWµV¡…§l%¶A4ØI¦Âi¨…§‡a‚i¦¦|Ri×hÐØ¡i‘ElSTW &!Oᰉϡ14Âdd B5R­ƒ¨Aв±ÊÆ ôƒ¡GðDdB Á0�„k„DD1ìtP„2Ô£ +!Žvˆˆ`ŠéãœÖ_T" Áu°Ü¯ª&ÕîYáÄqÄF*ÿõÿú_þ¿í¤©­ÙÈ(îpÂL&N(í�±ÿùhŠáY�ª-Ò㰼ʑ’¼”òløA•Xž +w)\›(AALð ¡NèáQâJ¥S«ÔíÚ¨Oï­zZ¯þïî¡ýÿßß}ßû^Öì"Bò¡•ãùNd­KrëR'�™$üWÕ?ü.µÿ×ÿ_ÿõ¯§çc漌—*2Me‹éä D]ê¹ÈÔD ȹä!2!²1æÙ¨dÁÙNÌã¢9dƒ:–LK’˜DAM3¡ÎWò$ �)©¦t# Rœd⚆D +P2¦yFt¡# ¥Èšñ?)3dp`ˆˆ DBdÙB'"Ò1…a�у>‚!:ldø gD|¾l�#87(Ñ K$L„È Â5°Fv|ÌÌ#d�\�Â<4Â0‹¶��Áša4Ð<#YŽ]Á.ÑpðÐp‚5†i2.g¦OÈI—„hd«0�a„|aæ˜A¢f°Â7B40�th #\#`hØO ø4kaBaa£cGÀð��?yªPšhÐÂ5‘xØçτѺ­éH¼˜a5OÂi¦¾‡Iõà ¯F†“ &ý,* †M„�4ä 4 t�»G†…é6‚t›ô ‘Úi&еTŸA6‚z¦“i:M…·lšiii:ZN“a'w&Ñ´i6n]IäÏð¨Žáé:†’m'eœ3Í(izM$Úds +É�ŸiœÆ•>“¨VYí2ÏÒ´œ;¤áRm'[SçÚZºN�0Ýàô­--–“M´i&Ñ'¨t�–„Ú½2í+WI¸‚v’m'I÷IèR´½öá:N•«z»Kü&!6ºT•¨½iiz´“i>ÖÝ4ÚO¿þÿékú_¶½{áûQ_véôµt¿Vßצ¿ÝÓ¯ŠÝ^¶ºZŠé¯[êžÚÒôßcÿõ×ëßOÿ×¶ãÿ×_¥ïÝ{©-~®ét5¿Údp�}nÞ‡]~—·ÆãŠ_�Åãiô:ëºï#…Wô6ºŽ~÷÷iúëŽÿR8ZõÒÚ~·}¯÷_ü­Õµ}ã†;_¿,zãþÛzK½zÃü4Xëùc‘� {D=òÇ#?U’­?ÿüDÜ�ÿ”9Ìÿÿÿñÿúõ×ý/ûE‰‡ÿþ?úýòÓñùu‡åÔ?ãZ°Õƒ—Wü¡[Ø{ÿÿ} ô„~õoÿþ¿_ÛKú_ÿõýöÿ·¥_ÿzIzü>“ÿý½¿ý/ÿØÿëûü.õÿÿÿÿÿÿþúÿì?ÿ×÷tÿ×Ãá¿ÿÂ({ Ö+ÿÿÿoÿü‡¶–ÿÃö×ÿÿÿÉÿþ«ò-ÿà‹ÿ†Í?ÿÿ$çÿ´wÿ‚3ýþßúø%ƒh÷ÿÿÿðoÿü ·K ÿaî‚ÿÿÿð“þÚÿi?ÿø@¿ü8Iõÿ»ÒÿÞ�+ð—àß°oÿ½'–ÿ¿ÿ ÿÿè-ˆ+þ‚ø…ÿý}þ—ÿ_é­¥ÿØt½þ¿Ð_ë­ÿ ¿ ü?ÿén»ÝþÿÛu¿ÿúèúß÷_›V—ÿÿú_ì?Ý/ÿý/úÝ/ývýö*)¿Kíû}þÝén–tO¿÷öúÛÿÿ®³ªí|%ÿýýÿ¯ÿ÷¯¿·MÿêÙõ_úû×öëký|ëÿ:oÿ¾ªsÕ}¿ÿÛ·¬éÿÿÿëþßû×ßþþ«þ÷í¯}®êÞ¿Õÿÿ®Ûû«[~¾ß]·¦þÛ4WëúÞÙ¢oµlÓöÛmvê×ÿõ�fstr¿³þ¼ƒûJÿÿooµû£;û?Úûi]ÿi9ŸÕ§ÿ]ŸÛ]oºÝ³÷ÚvÙÿ®ÙþöÏÿ¶­ ì'ua>¬$Ã[¶KìôÙïK×ÿµäQÃa°Ò´—/vØJE=†Ú_"[ôøkeÄ‘îGz².Slƒ.L[ 7¦Í¸6ž“ ´ Ëši­¤› l,Šá²)vÚ]C |ˆ;ÌpÂÚ[`Á+ 1I«"ð¦9=&J´˜¦#�bØ š†)Ša ®é‘ãôÖÓ§mˆV“lT0›  °ÚAi4ÓM0ÆÈâÂiƒb·A4ÃÓLŽ,„˜a„b¡8M8"ì$Å0Òa:wvL1 ƒ10¶“ „šÃ�aÂv(1 ¾b¬$Òw ¦G4ìU4Å›Ù+L+†M1‚lŠu„ Â{ ©ñ†ì)Q•l0šjg£Ò„�yXØR²� Ž{£Ûd¢Ó „Ô«höØI8aJÆ!‚aa0@Á +5Ã�‚ ®*Êè±§lPŒ¬”fœAÐ0ƒB"SÜ1"#¬@¶L ÂdmÉ b®•“±s !È¢2´Pb �‚'+‚Ç`{“qvYì7,”b®8WÿëUý%ÿU­ký%¥ëûASigjÍ/°Á!a„“Æé†(2*ꎂtŠ41”ÏAÿ–Á.v.‰±u-³$¼ÈDd'œÌ’⸔���2¹T;)Š¥+¬E9…2v +í›4d CbÐ)/+ü#ÅH†T,/©£ôõŒ{ïK×õû¿¼Ü_ß}Ô_iÝîîõNîé{×E ý¢…îÿñÈ’Éš­¼qÿÎÿó(ÿø]ÿ]uõõÿþ¾8ú¦w”f¯*‘)ò§æ¿ù__$?$ÌŠ³¢9š‘Ï*êz�H” �GRÎ2*4ÿÎP27›223Ô2@¤0æò„DF‚�•fÈöi"'M’!8‰f²;5˜syåYdL &E¨ÐKR!φD˜2|Á"ŒÙdâ Õš„Ì ˆÌ D%哿Ë02¤<ÙŸ�ç‘|ŒgÅ„¡äVéfK¶¦hX@—.(#[ð *¡Ê0�a‚/(„™ 0‹¶ 0�ðƒG·"Lóþ(‚5µ2x&�l#XhØÂ/,Ÿ’™�„lq$z\&¨Ùb)�iœɣãT?T*5Ñ­ªa5 Ú60�ŒÙ²g.Þ˜FŒùÂ6<#cPž˜FÀÒ68£¤š3¼#cG·F°ÐL80Þ—#4›I´Â ! +“h+Tƒh&N�oÐÒnMävÕ'DWhiÒm& ÝÐÒl2|JËA´qË L6OÐaa_“:uG††´ƒia`‹l&x©&éÝÐMÃ8i6®ËBoI°ƒ8pÎM„ÑîM4²Ð›H< � ØwÂ\6”5Ó8H—½Rm' ´&ZZ]º»A‚l.èmzM¤éinè“Ò÷ ¯c…ßþNÕ>ÒŽ-«ÉÂé^ ÷Òµtž�-!Öô®›§I»o©8JúV£WJÿ§¦ÒÒè6íúßé}úMmãÿû¨´ÚB¶®©ÿ¤+oïïéÛ¤©ã·÷‡ÓÇÚwi¿ïÖ©þßõV›¦÷kmqKÿÐíþ—º˜¶žŸã_VÔŽ-F»ßýßwM¤1¯áãÛIúô7½ ÷{C{¯÷}Háoè~»Ðø÷õ¿÷¯Cº¯úýáG}ïtXé/­ t¾ÿ_Û¯¢Ç#¢ýÑc‘ì)ÿÿ-ÈéêXäg÷ð{Ë’0ÇïäiõñáòÇ¢ÿëÞÒÇä<Ã¥Oÿï�·¿ãú·,Ÿø{ÿûÒÅñî¿ü[µÇߨ~�ðkþö�°ÿý‡¤<´ûõoß×EÖ[þ¿Iý/ÿ_Øÿíÿ¿ÿûj¿ÿõÿì?ö×ÿöþ‡ÿ¿ÿõ¯°ÿÿÿÿÿÿøEý¿ÿöÿÿÿ£»¯ÿmõÿö÷ðØ#ÿý¿ü+ÿÿí¥‚0ÿ ÿÿÿ%¬ŽÿþÿüBÿƒÿàßÿÿþ߯ÿêÝø?Þ „ÿöÿ„hƒ÷ÿÿúè'ðßÿïû@¿ÿÿýÃÿÿ‡ÿ[ÿÿI¿ÿÛõÿðßûi?ÿá¿ý†ÿúÿþ´¾Ã{zÿÿ þÿ·V—ûÿï×ýßý·õÿý1ßþú¾/þ½ÿõß~ÿÛKØxK÷ö¿ÿOýu÷®—~ÿÿï®ûÿÅ0ÿûa×õäéú¿×ývÈš¿K~ÿ_ÿývÞÿýÿkë¯ïþÞ­ù1¿ÿùÏþÒÛ~ýºÿöö›õí}o5ô¿ýzþßêoÿo¯z÷×ó¦ûn¯Ûõo^ºöïÛIµ¿ô¯ÿÿÒÞ›¶ÿìÏ¿ìÏû3û¯Òé³?ý×lÑ›«M¿¾êÛ4[f~¿kÿ®Ù§ÑÎÛ¥~ÝÚV}}¥i{göûz³Õ„qì3ÿÝfù÷Ú÷V’¶“gæÏpÓµM´¶¿öÒkm/KÌMÖ“a.ê ×í-†Õ&û=iàŒ9zY�†m+IvÒÓûf6ÂV’vÉ´œ»¾Á;A6Epô´•X¦-‘}¤Å0á±I§ki„ôÕ5ÂZ +i1LPcd í0Å5¦Èí¦ƒb¶˜¤i&Ä+JÂLR °”Ži„‚Mˆ[iHAáŠNâ +Òb˜« U ¬&A'´ƒ‘Šb›^¦Òb˜`Ì4wi*‚VM6ƒ%4Ù$TÐi=°A0­;pšiÛ¢‚m‚(tA„Èà& +­„-'Wa0a†Ï´ÅDa'˜M&�ŠGˆa6Å0T${aZiŠ„ › +('lU„ý§a0LBn Å5ŠÆ BGÌ–A¡ÄB•‘(”£µ:gC² råÆ$•Æ1¡ údÞá¢ÈN¯ÿ®µÿþ—ÿ¥ª_ý-kééŽ 4ì Ó> „Ñ¢xS|3¶¤Þz+؈ÁˆÄDþY•™\Iþd±\®B%QÚ”Fò5 ÄΖñ‘ؤ˜& +¤º …; E#0ª“-T(FŽA*Єlk£`<ˆtšuü>éÃþÒM‡ûøÓ¿þ“úMÿÝqñü‚.ñò”µ|×ÿÚÿ§×‘?ÿÿëÿÿëó¼²-Ѽ�¢1y)É¢#¢')ΦA¢‘DLÈfH3¡K&f¤‚:r& 8ÈÑ‘ˆ ˆÊÏ™#8ò‚:–R5ü¡d‚͙ԓä^"#Ywç5!‘ȇ2 ÎèØÏK¬�«Í‘ a:‡7À�‚`�„EAŽÌ#q>‚0ÈCŒ�‚b‘„¼C@�œ„ ‘˜0�g¡ G°Â^Ö2\Sc?‚.áØF°ÎËAÁàƒ$a.ðƒÎ Ó0�l#Cvi„jÂ5†²à!:Ï¢Â5‡¦¬Ô3“£“»4‚ v;\2FˆO=†TAh Ÿ0v"�™ÉNºšaSØÑ²Á°hÖ64ha!� l'C`jš7�Á¤j�a ˜a4Âi„ªM¤é:Ú è4¨'I†“ ‘ÚahРMèðÒtÕ&AÒm #CB�m,+{imÒoÐÒmSѾ“jš î¢é:¦“i­“à˜I0Ü>–ˆ°L0‚pî�p‚m'Iºm'wI°ƒ8iiZVËH´ƒjxg )âA‘Ítêé6 4-+I¶ƒAîÕ'Å´�]+KKD¸6Ñ/zV“ÖË&p‚é0ñm+Pìº*KAœ4¶ÐRù…eŸ ÎA6™îí$ÛúN�:%›_Òý/­wÒºt�-&Ý'JöŸt�mGºÕÒÕ·Ò§×Ý}ÒñK¯võ´´½ŠÒô¿KÚÅ$�§ÝŽŸÔi¾Ò~ÚÿénÛ�Óúº¦½ª¤þªÖ­*«êÒ»ÖÓn*¶¸M-´žµ#…¯oßH~¼Pî·w§ãW¯¤ú·ºŽ¿N–Ößí6ªãoÕ¿ý¦ÚIµý!C…ñÿǽG WÐÕîîíGpÐ¥ý×õm½/v¶¥�±úÞõ¬~ôŸ¯å�úõØ{¿{¡µí*ÿ_ÿ¯ùc‘‰àÑnJkô[’G^c_ÿ½Xl9uvÒÿïý/H`ÿÿ—WôkKöÿIÑí÷ìË·êßõï«kßXì<ñý!Ûõoýýƒ†—ÿZUß_þ¾Ã_÷ÿ]&õõý/_ëPÞÿoý¥ÿÿÿõ®‡ÿÿÿÿÿûa¿î¿ýÓ_ÿ_mÿõÒÿÿAÒoý¿ý¢Ÿÿÿÿÿø(oÿÿÿÿÿðm‡û¯ÿÚ;ÿÿ$ÙølŸßÿàŒý[¿ÿý ŽÿôŸü7ÿuëÿÿÿÿÑîÿÿÿÿÿðØ=÷×}Þû¥ÿè'ðmÿÿè/K™ßÿߨIþõðoÿÓk×÷ÿÕÿzXoÿ¿ï¯ëÿíÃþÚ_ÿ¥uýú_nÿÿ¼%ûíûÿH/ÿÿ߯¶”SkÿþÚýïk½ßÿÛ¶½¶¿õîïñþþÇÿ¥îëÿ×ÿïú^þ’¯ÿõï­øßÿ¿¯ßûÒßÛþÿÿ]³ª~ï~ûm*köÿ^ÈÚÿ_}/ëoßûõ_ïý|Ñ?ýéêýýw«ý¶ÕH?nûÿnÝ.Þ¿ëï1í·ÖÞßM·ëíš/×þ¶íuÛ^þëÛú3_íïõ÷ôßÞ×ûî»V×í³õÞ“f{kí™ë¶ÝÖÝ¥ëk¶gõÕŸÛý»³ók¿÷ö�Úv—ÿimŸÛïÞ¶ýÒû?úK¯·wV½õ¤ÙŸÚÛI¿m¤›i7¶C¶Ïv”ˆ8wM„›Û¶KM†rlÜé&Ã96–Ÿ¤› %iZ¶°MÓ°M°IéëMCfÞœsV ®¤WTô¶)ˆpØlŠ ¥vžÚZa†Ùë"¸i¦Ø&ØKKr;´­&I>Ðm(½�ƒ« &A1²8†(1L¶“ÆÈâÅ Ób˜ ÃI ÚI¦ƒ´ 1V“ƒ™Õ&3 1aNM6( ÓiÐaІ(XM4ì$a Èƒ…½0a i…a¤MˆA8YFšl†AA�H8…iXIŠNÕD&G + 0¡D+ Pd¡50˜&šdz‚d¢Ô a"»*àÁb‘¢ Ä �mäüB5A‚(2Z„+(4!„ÁˆÊ⬮£ñH��Ñ|ƒ PŒøU•Žt\�X0ƒ2À Å$N§Œ¬9ÅJâ°«ƒjÁ¡‚¡FŒ¬a¡ BH2h+! b¢`§‡-Õcˆ®§ŠFAHDFce´W.„rȦ„FY°®8Ž#�×ÿÿÿÿý;M;Úa0ƒ Â-Ú+œ¬ ´ÓÛ�5 ÿü²b&åòŽË2ÒÅ2Y"¸p@Ì…ÙÙk@ÂaJëL™gŒÉ)Ugb\#; +W;Y•BëkûÔŽ¦Þ¾ûô†½×k¶²8Uýßwî·úÿëßzøÿ¢ 0ù$úýÇþXàŸ×–9�èëËŒÿ¦ÿåŽF*›þ[’E†?ûüã˜,¾KÐûï¾+ôßÃÔ2éÿ§ÿÿþ¾Çß×ÿòë !×ýHü{–3úCúÿéÿ�¿þ�ŽÞúÿÿúþÁô5ÿÿ×ÿëÿû×ý‡¯þ¿ÿú[ÿÿÿÿ¯ÿ¶¿{ÿþ¿¿¤¿þ߯ÿþ¿éy±×þ¾CÿÃx/þÃÿÿÿÿÿÿÿÿÿ š2;ÿÿÁÿàŒ?ÿÁ¿ÿïöëöëÿð_í~!ðo÷ÿÒÿÿûÿþÿÿÿÿðmÿÿxþOÿö_ÿ·ÿÿûio¶—×øF�î—×ÿnÒÿôÿÿÿÿÿößÿº_ÿþº_ÿé?¿áû¿ÿö+ö+Çýÿ×Òÿ°ú÷þÿýú¿éÿn¿ßÿ½Òÿ×ÿÒÿ_t¿º÷÷ÿÿœp_Î8/¿×ý‡ô¯ýÝ/ÿ×ûþû×ûïýïKÿ}ëon½zëíWõ÷Û¿ÿð�þ}ÿ_ÿúþÙÓïVÿ×ÿýöúo߿޿í¿öó°O_ý{Ýuõ×Ûÿn¼çûúÿëú_}úÿý?ûÒ9¶h½¿ýlÓý¾ÏÚ¶gûvæ‹ö×ý³=ÒþÌÿõÿ­³<çÝ^Ÿ]}ëî¿ÖÙŸ{þÈ8—Ù§o×þÞ¾öÏmÒm¥a{gÿO°�ý¶_‡m¥iCI{M†û/]m—»l$Ý6^]°’v”ŠáßÚI¶ ZºK"»´­$Ó 3œŠá¶^ÛI>Õ6I†¶ã¿U[µá®Þß"Ž®cªi°Ìa=е¶Bðl6)5°ƒ‘ÂM4Ø« …cb ƒ˜A±±A4Ø„ ƒˆI„Ø„ØAD$ÂaŠNé¬&švMˆZ 0ÒAµØJÂI¦ÅBâ“mšmÒ Šc`ô 4 µL ÛM6D!ÂtÓŠzwM- ÃM„°šh4œ0�°�;à ;†Ša'†J ÛAŠM«™Øa6§‡+�à‘¡²-jx£ÛEcˆHøaR60Ä$xÂjqëÏpa4Ó l1Ï{lŒlÑ ÉE¨SÕyì«Èháå(“¯4¨Eè2$^P‰Òd2È2)â6Õ#Fï!žDó¹>0á“à�„E9p#Ø3Vg!2ƒÖF°Â5°‹pÂG Í„k Ó0F°`‹¶—í„ggÎLåØÌà�a£[ÎÍ ˜A… º5´haÙ¤F·'ä¼ÖÍ‘âΜãD'šÏF°Í0�„»D"´ª¹âÂ�U H6šk ´�U:Â<4›§ 0ÐA�´›PšM ˜j–ݤÞè'T˜i8I´Ev¡¡xA0Ò�m H6tŸé¦LzOÂIµG†“rcëKèÎРòèF=,&p�5m\*g�–v.“jéZNî“h—Rzë÷KwIÕ&ÒzÐ&!:%ïKIÒÑ'I[¾ï¤þôЭí$Ú ÒÜWKØAt®ðšÝªÒ¼}ýµµÒw׫K[×oKô›Å-Úwo[Ç饿QݯIn›KÒëÒô›î)tî¥Â[µÿ¤p«ü[ºŠ‘­}×én½×^ÓñÝn(ý×^‚�úô´½'Õ¿Öÿ¾ýkÿÒ®£ÿÇõý¸c¿÷¬1ùc¯‡¨þÚãá$¼}-/Iúþ?èºÃÿùdÃQ¯å§ê‹h_¿ÿÖÃÿß—X�°ÿþ¿©iÿ¥¯ ½¯ûÿö/ëÿÿÿúðÿÿØk×Ãõû]uýzë×öþ¿ì?ÿØÿÿÿ…ÿü0Âÿþ×ÃÂûÖ±®¶«þ\_�ÿƒÿ†ÿÿÿ¿Áÿÿ‡gÿþG�~Ücÿ\Ÿ‚3ø‡!œ»ÿ_ Ÿü?ÿàÿÿÿoÒ ŸÿðÚ ÿü6ÿÁü ŸÛ­Ëwú È¡šŒ�Kô?KþÛÿýîÿ»ýp—ÿ·‡ ÿaÒ÷÷úÿ%ïøKéÇoÿº_ûÿý• ÷þÿöúõûý/ÿëõû÷ô¿aëíßÿû~Úÿ_Û:oÿï{ÿ¶Ûä?Z_ßß#I×ÿ]³ªz_ó‹ýëïÝûÿúÿýýý·Þß÷m®’ý­ýÕúÿ×}/·}ú¯õë¶ßÿû~éuµý³=µÿöÏý6µÕ³ÿ°Ï¦Ïç·ªU©¶ý´�Ýj_þ×lÿk~Ùÿ^›îýîýÛ?ë¯ûýÕ;‘ =6K¤ôÙÞà i0`“ "‡²vÅ.ØV ðÃJÂ\b˜¶-7Jì%"¸¤Õ=›i0ØvÆÈAÝ¥!pØÈ–Epûa…[‘\6EkÚi¶•4ØNšvÅA‚ B :M6!6“Áì-¤aŠ S¶ØH&GM4ÉZ �ÂL0ÒìaPNÓ²:‚a…MØL-Š`¶š40 °œ6!&œ.‚aœ5L6•Ú46R³=•ed&(„HøÉÐaJÊ+Š8AŠ53U†ƒ*ä„ `…°dÄHì´Ãƒ„YYD(„k@ÊÔ#¸„C@Ñ)Ê<B2«`ÁtW1ÂEsFÊ+&”ð熅,•Å™˜�"#E¹òÐJí¯×mëÛ %ý†IipÝ ‚ÔEjaË!|F?ü¶…(JWXE¦7 ˆŽWI”úfF±—£³$}–æC2®Wc +¤ +; ޤKh†NÎÌ�€Aù DAköÚJÉ`=’èEÍù4µóqzv›Úp‚mÝRw}o½_[mn“ùׯ[øêFñÜ‹ùÙV“åoô²%ýÇ÷_]Tuú×��úÑC°Ž<èò»\îrÖUµ%¨•þº�Âþ`d�A0ö~%ÄDNf3ȼS£dHË¿""U‘Šr DBAÐpÊ‚~D�Y¼ÙŒÐ!>a¢ȃR“0ÌÄ4Í Ÿ6Y²2„`Ñ „QÉê 'Ì ‡8],¸ÈižXåÔh#Ð2>N�³ †qvO˜#ÄQ›,ÐO¦��£ób©Qù45‘F¶–��OÈØÂa?9l|—ƒ +¨ØðÅjƒŸš§£e% £cƒ ¡ „la5×H6© ‡ø†@�SGæšhØÒmSM0ž�ÏÃ8i6mØA ÞÓ(D[i¿ÐL6Z)0ÑýIÙgº Ži7ŸÝ‚A› “hl³¦ð†L7p‰s†pÒm —CÍ%„E¶}#c—ì+,÷D[a&ÂN–gq…žÒ‡éÒ¿ý½õ„ë[Ö­º¤ðM륾é:Wî” ß¢Q}ù;[þ„é\œqUxO¿£»ÛõMü�¬w¨^/¥úTÞ’¿Ý¯ûW_t­ý- ÿ¸ªÆÝ;ªn>4â•ûûªãÕmi} {¿´Ú¦ãim;»ÿCCÕ~Ò¯¦ÿoìuÚ�uí ®«~ÓZU»¯«}ýî‡Ýoí>‡þB‰–ä�ëoßûK_uþÐ_þ‰ŽHX¿°tòܰü< /ÿ¿¢ÜÃ�Gúý÷~ËrHÃý¾B³ú,®:×é÷ÿ_Â/úÿ‡ƒ]ÿˆý/ÿßû·� ýÌOÿ·þßÿ[׿ÿÿÿîöÿ†í¯ÿÿô—×÷ßÛÿ 5ÿÿÿé×í¯kÿßÿÿø·ÿ†_ÿÿêK²;ÿÿü7þØ#ÿÿÿÿ b¿ÿÿÿý?ü;ÿÿÿô‚ý¿üÿ ?ÿßûÛJþÒþFP¿_ýþÿïG~¿†ïïÿûô’þÿÿ߯  ¿ÿÿ½ÅuÅ~‹,ÿÿÿ¿ÿíýû¿ÿÿþ©~ÿÖ¾úÞéþÿïw]ÿKkn½ëþÿÛÊW×ÿï_¥íúJ¿~ßþhŸÿ×ý.ÿí÷ÿÿúý¯ýúþ©7«~iÓkýôf¿ßõëïé¼§Ú_þ»¯¶f­§Kkù¾Ý^Ýkíš+oÛ3õKêÌþý¿n›[_lÏõ]~ýºÒï­&Ìõ×_ívÏÇ=é°Â¶rÛ¥ýXwJéf4Ý/½°K/YzÓa„“Öô˜a$òõÓ~éX"�éi°ÂI¶^IdW Sa‚ [JÒW/ZV•„®êD4ûÒÛJášlPb6H:M4h1A†LRl4“A„aŠb˜…¦Å!¦�„ƒ›ÚAƒAl$Áö‚M6)‘ÄiÐi² è m¥i Ø…iZAŠM°“ M0� “bš(öÑY &†!aEcG·;ѧYîÄ&÷ BEc•yî�l0¡5‘> ³Þˆä#¦ÂdedD�ˆM5Dq£Û4ƒÒûMªzMô)8i§þ·­_i/}µuÿþ×_Iÿt�'þ©öý&’VûK„Òén–£¯¯K_¾·×kq¯¯AGu®ë[ý{hk~ãXkÐÿÞ¿Ð÷}Há{q¯Ã_uú[¤Ýuõ»O­ÖÓ¥»nߨþõÓ¨¸Ñ*_‚ßí}(÷‡�õ�¯�¤ˆz=wCï�òÇ#N¿ÇþXäeêߎÿ,r9(¿Äãïþ?¯úãã»ýc¾7¾ûÐû«mu¡�¡ßßâ¥�Í~Ãÿ_ÿ\%.°Õw_õõoõÿ¿_Òô]_ÿÿõýuÿÛ_ûÿUúý^Z¿. ÿ¥Ì8Yï(Ã×ýø½†¿ÒþºUÿ¯é…üàýÿý-ô‚ÿûúëþ¿ë¿ÿÿÿ¤ºLÛüwÚÛÁÁÂÞãýµü‡·_þŠÿþ¾ÃÿÿöëaÿíÐ_ÿü‡àŒ?ÿ×Á×ÿõ×Ûë×ã¾ á?áßø#Fgxl ¿ð�ÒÛ_ÿ ?ý~þ‚ÿÿöÒÐ_û¤ïÿÿ¤ú_ÿ�gôxÿþDOÿÿ‚3ü7öÿ‡Òÿ×ÿKß ¤÷é%þ‚w+ÿ þǼ}'þÿí´´Ÿý†_ÿÿAz ÿýþÿÿKûÿí*ì7¿úoWÒþô¿ô¾ì8K}�/ð—P�ºý/÷ÿ —ÿÿÐá/þ �_ÿ¯¯„¿öè%ú_Zþ‚ÿþß/Ãÿÿ÷×÷Òêý/oõú_ýBCzþ¾ýý~¿·þØAzÿ„eïÛïI}õÿJµÿµÿ¯÷[Ýï¿ä龎Ÿÿß®þ«¶ÙÓuïkÿ]w¯Õö××ÿÿ×_ýUoéõõÿßUýzëÛ_Û_mn¾Î©ÿ_{þ¾ê¿}ë»fkKÛýù›µÿ]vÉÕ½w¯íÿmÈ%?ÿ ů߶·ëëÿuþ·®¿ÿõþÞ»wïÕº[¬Å„qþðŠ‚0ûnó +Â;¾ín¬6ÓðŽ;ÖÌv�°l3ÛiZö‡û Ì+Kîí³Ú­ì3ÛØ m˜Wì†a2éµn÷I¾Âvaaý˜M¥„׿­/aŸZûkì3ë³ý÷gî®�&L+iU„˜… †©±‹˜i±LlU„á†)µ‘ÂcjzlU†›b›A&ƒN!Ri«ÆI�†“TØÓL'"ø¦Ó‘Â�SM¶J‹cVÐLr8 ŽGÓN7J7i°Øv´«Šá².7I5l-¶‘G/0ÂV•»ÐÃ’bM4ƒ¶G4ÐL2P¡SÛ°¢NÈá;TvÂiì0ƒM4Útîà +˜a©»„á« ;ØL(¶�„™"wM2Vƒ#€�lS#„ÓM4Òi¦Â S¸M:k# E�M0Ó é0Á “L1I†* Ø„…i\DDÓ aÊ‘ŒœÄ#"Ó&Éòs; “™ØÄGkD0„YY‹¢9Ѓ" )í†!#æV0`‚?0Á4 4&+cB*â*é960Ç2!P&àÃvÒIÒul/ZZ_a ­+«¯‡-+KKâ,4›I´¾ÊHBl „6iÁ‚m‹ §_!Dþ[š¢ÜÖ-õŽÈŽÕ"-Áçf"_2œWª•ò%˜),ŠŒ¥Gbš… +'Êå˜(PS°AN +vI…+™½¦¶žŸú¦ŸñžeTJ —ß{÷wÝѸŸ_îß[×Nîîîí};îþñ­!ËwÿĪñÎÆ“ …õÿÿ×S°ó·òUôõÿü×ÖdJ2LÏžH3^¥X¥%R.Ždè—%(Љ�’t´m!šÙ¨d�§œ2¥:'lΈ�c5™Ð³g�&CÚ™g¬ÍC! "Hã"8óg” £6Ï™ ~q�H”³8×dVO9šâ%šà™®%MHžUü#[3Œð˜L£Á3‚ ôˆIž…ÛÖÉ|ÎA„g3„Ù»aÃÖÂ.ûk%äÎkfpA„k ÃD'BhÖÉðA„]¼ Ï ñ„]³H Â3‡„Q™ÀƒA—‚4¡¬È0åž�áB £0‹pðžc´‚a0Œ8"=á‡^#xA„ "9“ápEâF`Â4ÂÍ# õ E܉2à2|Ã3AD!ph‰Óc "¸ZN¡]¢­®–†¬š(&ÒuDGiØM*N‚a¤ÃIÐM ˜ÝÒm I´˜h’!M„4JR †¨ðÒy(zªhÜ)èZM¤!µ&ô-5ApÍ–‚дhi øF†�¶©£ÃH6© 5I½ÚN¡Rmß µM4|çäk pš=¿¸Jbát��V‚¥tádþ–íKJÒn�+I§ÒnK©:NÝ&Ñô­ »IZn—¢>­+H—´›IÂþ‰{ +é7 ½&Ñ? ¿íÒl"< Ò¤ØW =‹a&ÕÒt›–‹haUÙg„²g%�–ËnH¢ôíú[A¯ý1ûûIRI´Ç×Ýz´�oÛTè5û¿û¤ûzµtø»j©z^ííw¾·ú�ë´Óiz·º]=xIÞ­Ž£êíBowÞþýt>è{´éo‡] }HáRý wQ�®6…½$6ž½ðôëÛN…¨½{Nâ“{|nÿÓÅ×Öõ´4;¯ŠZµª¸ÿÓ_¥ûzÇwÞXêø×_¢ áÄü±Â¯_ÑcßwoWÇïwþûªqþÚýõéáþ“øî­ºøï]O{¨õרï¯úBÃÿm^¹uÛa¢ë_¨úRÊÿŽ‹O½)c:ÿÿÁï.¯ûëÿ-?ØË*ÿÿ_㮋rœÈðþ¿°ÿÿÿáþ½kë°õþ¿ÿÿ{õýÿý‡éÿ·ßÿõýzõõ×ñaúþ½‡ÿëÿ†ûkÿì?ÿÿÿÞ¿_ÿm&ÿõÿýÿöÿÿ_ÿ×_ý‡ÿëÃþO?þòÿðÿÿÿÿÿ¯äûÿûtûòyÿÿÿðoÿðFÿàŒüŸÿ†ÿü‡ðÿþ“ÿàßé^—ÿ†ÿûÿÿÿn¿Iÿý°‚ÿÐ_ÿÿþÿýÿþ‚ð‚ÿðßÿ Ÿ‡ÿô¿ûÒÛûí¼=·ÿ÷¯ýÿߥÿüBoûÂ_þ—_øÿÒûûô½/ÿÿé}ÿý%ÿwýx­ÿIÿöýíþÿ¨ªõþ�³/Mÿýmú÷ÿû¯þþ¾—}ûýþù’šÿýû:¯úë½·Êu·ÿþޮ߯¯ú�ª§×o_×ëÿóÉÿÿKÞ»ô¿ÿ÷÷ÿ_ÿÿÞÝÿª¾ýÝ_oêß¶ßíÿUÿõÿ­tßÿÖ륷ýÿ·þ½®ß몷·ç?ïõÿ_ëëÿgþ¿µûMÌ÷K¦Ïííöûlþz¿lÿ¶g¦“¶gþ¶¿òÙEmlþÃõí{®¶Ì×ýï»3ÿ¿zïí}[¶Ì×ÿ·þÒM4×NEpÓYeÎÒM5`Ë“I°ÁX`“iZM„¡­—í†Oläà ^a'°Õ6%¥°ÂZr+†¨$ÓM[n´˜a&Í´äWô“m+Ka…ÓNÒMul$ŸÈ£‡¶’mž»Â0áöÜŽÙëµO´›Û?æØ'fŠM5´Óai¦ÒaˆR1Òi§ ôÃ#{ÚPi(0jÅaŠM0Å1[˜MˆI±PÒ¦)› †’i¦›l4­¦)8XNÐH0ÚV’ ŠM4ô´ 0Å&špŸm$ÓN!: Š Å29еêEÆÅ1§r8qÃD=å �ÅRÐiܬa„��a*{“¢Œ4"²"b�Š iÃPA‚:H¬a‚ 'i>HÐÁ‚•b 43Nš•b«¢²�VÑédgDs `‘¡´Ò48„�Ä)VHæx`‚>9WžáŠi订±°SŨ ¦¶FvÂÕ¦®šaSA4ÂPÕ&iØRÈ.ŒµŽÉ3 óµ¤"")8ÑØ¢›`ˆì±ƒ)`ˆ8ŽWYÄDedDF?B¯Ž""8ˆúUýzý}t’ÒÿÐ+izTÆ™tšu áˆ$A¥FÆ"��¤ Cÿ-ÌÑ"„ dÙj;ŽÌò¹$B™Öã³R;-ŽÆ£°™ØÃ„x„|�8®gPR|šJg"¡„w��áLð‹B„éjê¿§jªé:zp¿T{ÔR}ýÝEG}GÝkîÿõëþ“þ=NÆ‘n]guû“<\iNÕä·Ç;YØÅéV•=}~µôõò’ÎÊ¿¦¿ÿëëëþ³"TlÏ™ÐR7 +@Å@Ñç Œ! +ÂT"# ‰Y/&AìšræEA„`Èõ+ ¤!2`ˆc(G "'M™ÐR2B6DŒáåX¤ã„.F –ԈǢ%�žGY¨F‚°™Á�c +t dÁÔ<„,�‘Ìà¹ÈÔDl—9šÌ©Q)©)®;½N´(L&°4ÓF¶�ŽaÃ3Â6˜OØ <˜MBehØÑî\Ìôl2!?A„hj¼ Ñ­£Ã +PžO\�o?#XeM&šá¤ØÔ' ü�BLÖÂ5°� ùÉœ¼™ÁÃD' ù¬2Œ Â!2aØF°Ñ �ˆ¨5˜çrj˸ EÚ!<ˆ¬„ðÉÛ?˜âD™ àèŽØF¶“a< ›(rs.t› +“hŽÜ˜t›DvÑí…G€ÂL0�m\*M„E·&pÎM„E·&pÎA6m] fª8JäÑ&"ÃIÕ—BtL44˜i¢­ËD$Üšm'VÝÐZ¤Ã“;M&FŒ™áL4˜~¢“kh-&ôkz74ÓM0MÞ�œ&!ZMÓ«{»é:¥h'i+I¸PüCrN’úQT›„Ûӥ·§V×@ƒh ê©k¸Ump–ÚKDž–¢Ûªî•î—ºN©6êI´OÃmñm+I¶YÛi6dsIÒÙg[,é°†§†q¥²ÏO¾:ª~é;ûO«K{O½ +§�­µõ¯O×­nÛ¶ú½{Ó¿Oú§B¶ïõþ¢–úúMûI?ÿ¥¤ÿ¯M%¥êî·'kiµõO­ºê:‘¿ÐÓm{ۡݽ7þõ¿î‡[NÓ{Ð׺ÛN»úǾõèw_Öëî=»¿º}<[B¯__M¸½uÿúùc‘“,rHý•†IŠ;ªÒ;ˆ+2Õ…3ê.vJˆóï¤ì/w¿-Ê==e`S`†a‚€¿¿nþõêýI…°™<K(Þóº·÷Ì–QXE¹¢öškþwm áßÿçiRªù�žvK•óOý6ÿª¯ªÿ2Y$Ây³:—ø¤JÏ(3¨×9†}�3ÈdK³¨ïÍyÉóYF¤ ©4ÊC!ÔÎ֑̉‘ ΄D$ÍLê~U™"jt2Q©Ú4ï„kˆA„&B #aÕ÷Òh\cGÀÊ"æD'BO¦ƒG€xF€Ê ˜F¶ßša)0�‚¬0�m€Áfz!�ÉÌÃD% +9p".(F€aP2F`Â40�Ѭô4D% „læÆ 2|Á„ka�4ˆO4FÛNdx‘›!üé“2‚(ÑVH‚-�`"s"…È4kB&Ù5œ‹ +ÿÒôI´-aaMG¶o Ú„A¶×L#;BÑ�¤ÃIô®ÒáPL5M'L ÕR 4�j›„ivI´Õ&ÈIÓÒth ByùSdü� �ƒ>aPš4=ƒ>fv±‡(6HæÉ¦¬&ë‚t¯ý$ŸXJÃD�`­ñ‡kûiŸiXúm¢Xi7ìµw +Ë?IÙ�H6™ãIÓi6®”4©Â²Î�'I´E»,ðˆ¶ÝÒ »¤èŽÚO,÷CI²[Û¸A8T›«oÖ¿®}kû×M~Þï^•¿Ýtôøï¿ÿtø´Ý:W�];­¥î•«¥ª�ⓤÜ ÷[ßM¥¾è”R½ÝÒÕ&õþè~º­zZ¶âýo]z·N¤p©o»_oú^é6ïm;Š‘ÂÚ—ÓöG¿©+Š—öú¤)oû_Ó{¥ÿ�¥}~“uoþXäi7QÐÿ×ÿÓãõ¾†—¿êÜ>ßñ÷_ïÚŽútñµ«ßÃ]¿ß_í®¿ÃJG ¿®ëëÿHx…ä„q/êÞÿÿêßË_ÿ[ƒÿÿþoEÖ±Ÿ—WôXÊ�ì=}ÿþ›ø~?ÿ#_××ÿÿš›¼~ÝÿúÿøKÿׇ°ÿ×÷öûÿÿúØ /ÿÿÿaúÿ¤+}®ûÿüw¶‚(¯ÿÿ…ÿôÿøaíÿÿþßøoÿÿÿoÃ~ÿÿëû×ÿ‘�ÿ×ÿÿø»@“í¥þÿøG�ÿ ¿ÿÃàßù¥ÿøoý¿ÿÿü7íÿ¯ÿÿ†ü‡ÿóûÿÿýÿé{h/ÿÿKÿÿÿü7†ÿÒÿÿÁ¿ÿÿüðnÿÿÿü?„ÿé?ÿÿÿÿô¾õÿþþ¾ÇÿÛÃïþ—úûÿoÿ÷Þþ×ÿý¿Ã_ýÿÿ÷¯öÿoKÕµÿÿ_mÿþŸô¿߯û¿ý÷÷ßÿú÷õÿú¿¿n¶¿ÿäéõ]zÿÿÿ¯oÿÝN/*7ÿ×î¼æúí�7oýÿo¼ò4ûn¿ÿõóÉý/ýµÿ[×ûfŸêßý¶ºÿþ»k÷ÿ÷_õö«ÞëýuÛûwÿßÿíëÿþÝzתÿýÞß¿m%o¶Â]¦­ö ìƒý/³ {ÿÞ½³Ùçÿí­×j¶÷wí×¶¦Ý¥¶ÒlÏûlÏoÕ†¶Ï÷uý6f›­oöÕÕµm[mvÍZ_¿Ý[I9êÅRÚ°ÂR8 m¸IÜiª¦°Ã 6ÒM6=5MS·AZLŠ!¥r/�†Ã‘1¶–�¥zI°Á+¦ M9ƒ˜dq¶ÂJØIm-²ý¤Ã +é{—½;qÛiX#Žú¾Epó„PîØg+îÖí[Ja› +°´Bƒ C¦š¶ØÓ µi¦œ:ÓlŽI¦N´ÓM0ÃAA„ ¨¤Ú‘Æ�„›a ƒN '°I0ÅXH1I¦Óȃ¤Ób�aŠNÂIÅ0ö(0ÂA4BM4Ø=´ÚA4ÚmŠ`Ç ± M6BcM´¬Pˆˆâ!ŒDEðÁJ ʪ""!ˆ"�“E¡J®Q±@Æ ÁB ÂÂGÆ‚)ùXÁˆO@‚že†(2èQ»u`ÂXÑ\Á‚:Á‚•Œ¤WaHX Ä)�£D4�…A¡”&šci¦*xs¾Pš« alaŠŠBrÐ[ÑhW–ú½ˆËrÍ%ëÚ]/Šm—aZIq …f82ÙƒN#ÿù\J&âq$Šš22ldØ+ŸU + �˜‚!Û¬˜¸:jM‚š’ö¨÷"l•Ê�“²X(G†T®û«º×z½º´¿Ýþ‡ôª¼x¸âú°˜^þ“\›iˆåq;̉ça�öK¯ÿúúú¬ÉI‚R��Æ@…$ è2.2�šˆèD�“t"^ +udmg"aç"$y �#S!™%&!å×ÈmMhŽ—UO#â^s›!EÀhÖÂ.ØEÛ/œgÈ"íš@˜F€aØF¶¬F°É@ä'™Ã(Ìà@ð�’ Eì a&ŒÄ"ñ#0aÙD 0�Ñ 4B4i™æpd…šL>a�ªåÆpgÈüO0h„ „ˆ g㘎#(D<ÀÉžl‚!& ÉѶ}f#$fÉ“""ˆO"VZ²2!ȪÃ"Œ'ç³ÙÈ%稪ˆÐV™\U +\Í©fscVšT�& ÚO †‚b·A0ÕÚA°“ 'I´›TgzMª§„{aPL�¡ÚZ °�dxÕ&M¤áÃÐN©¦OIµMSL<?èØäXÉy9ÓU óóM4Ó’ðjѱ£wFÆO&tµÖѬFÆQ„â™>.Í„}G†¡8ÁN¸A„ #c»4�»*ZZ·NÒÝÒ´Ãii]i:L4ÅÙgXTϸUjÝ'Iº„®•¤ÚN“lµ +§†pÂéaG0ˆðç‡WeŒ.tƒl Ðapƒ8a$Gm–„ØCaÜ Î-6“²Î˜hk&œšl ›I°ˆ°ÚiÛM›M +‘B4Ra¤Ú£;ë¤ëiZ�j÷ûé5ZŠZO·¤ý>Þ—ÚZÚººZø«¿ûNº]5 +·ÒÖ߯§Tºòv¤¡oMëin“h”UÚJÕÒn ·i+z]6ݤ ´´´Û·ºñ«v¤p©~¤p´ê*G j+oõ»õ¾ôëÆ–â¤p±wW¨»¾ÿ´.ï÷ý7n¾ÖîߦãCí7ªï®ãúMÕ-ï¯ým=­zÚO¿®´A#\>¾¾ŸK‘Ì>ºñýýÿë_kÖÕ¾Ó¾Öÿý×®÷þîסïûñ¯Óm?ú�6ûz‘ÂÚUîû»Ç[]µ×—Wa¤5úCú‹ -¿×ÿÿ×—WÔeÖ{ÿÇßþôߥÿÿ-Éÿz&9*/_ý[IÒàŸôºÔ}ýí°õÿþ¡ëÿÿÿ_ýýl?áÿÿÿì?×oÿÿñÿß¡]wÿ¯ÿ½!ëöÿå«ÿ_ÿoÿÿÃþ¿þÚÿî—«ðÃÿõÉÅÿØÿuÿþ¿ÿþýÿÿ¿½mªþ—ÿöëÿÁ¿ÿÿ ÿø#ÿ÷¯ýºü7ûþNÈï¥ÿ ÿí¢ž¿ÿÿûÿÿÿÿÿ¯Ò(ݯ›¯ÿ·ÿÿØoÿ ÿý´þÚ]àÿƒÿú Çÿ ýþ­×ÿÿÿÿÿÿÿþÚ^ —ïÿ‘ÿb»ïH=·ßáíëôÿò0ÿñ Ý»ðßÿ ¿ÿôû~¿ÿÿÿÿýßÿý·H/õÿIü~þÞïþÿnïkú¯ÿ£'÷ÜéïoÖÿþ¿ÿ¿÷]1^ÿûÿõÝþ¿ÿzû†ýŠþÐ_ë½¾‰uÝÿ~Ý�Woþ¿ÿ¥ïá{Ý×!?ÿ×ÿó‰ÿÖÿßþ»¿·ÿ½mÿ»¯õþ«÷ÝvÖößöÿnöî¿ÿÿOïoÛléÕ××ÿÿýÿ~Ý;ÿÿ·ÿ×wï_ö­õýÿÿí¯ÿ½†}=i6a«}ž—aŸìúé·Kýý�yööÏòýŸÛ?êëõÿúÿëuöë÷¯ýÙŸí®»f{j¶—öôÛi{·ZûÿÿÚ°ÆÈz4¤Å0Â(|„±V›¤Á—›I=‘lŠáúié°ÓVÁXa[M°“ %tÝ'k馼Šá§é¶ ÚV_Um&¶Ë×ö½—Û }ݤÙy†“~é'Ù�0›I³û¥õgÓëõÞÃ=ëú ²8†˜Ø¦`°ÂM0 &ÈíŠlŽ’L' „馚a4ôÓ`Ì6!6˜b˜¦M„Mº §iÞÂÓM4Ùm&)›h-¦!h0ƒ +ƒ ±AŠA„Ú +!1LaJÓb˜ÛIŠm%Mà v›ê› 0ôå}ˆ†0„ÊÂ(@ÁbˆžˆRŒ"#+2“•gº9Ü÷(ÁÄHô£Û 0�“¥sds++§=´V0ŠãÚ ÈÐÉóI…¦>e[ P‹P§º-èö=åci…sE¦¢šaJ±IÛ +ƒ“ ƒI;¦4ÐTðši†�ÂiÄD\›¸ˆˆ¤å˜®7Š£*±ÊÚ¢¨�„#>g¿ :¾"8äܬ7ú_¥ú]k^êÒéjØIÒUðئ*ÁNÜá0dö(M˜4눈GÇMhDcÿåu(¯Ù–3!¼›b,©|È‘LÊŒüoD›èeÊ̲ ¾v*DÓóð#E�JâPG†v-øBe(P�c +‡et�nëO/ õíZP×êóÅë¯uU¾�ì-Ý&’j¥wNJÖv-éoÖÿ¾ë‹×__ñÇíW;)_étôõÇõ]êuDë6gQ©HŽ#ˆÌgB)ògRÉvj3¡òä#Qy'‘$F"¸_Tÿ_™©'� „gG¤L¸F¶»f� a„^M#8`‹€ašh!�œx'À‹²|ÀÂQ$ËæH²>I„'2!.!6E ˆ„Ú©àŒ‚19>lÊŒÞo" Jê2CÌâ/ž”#AXO‰E&Dé²: HöP3DxÏ#ÈÚ" L�Ädiˆ�DÂ4�Q +òGP²t +¤ 4„0äDzX˜I6‚aª-ÚZ +“h&ÐM¦ôô›Pši6“úi hØÐ&a0š„Õ4l (ý3‘°5 £óÎÊeL"ìŒÅ ƒ5 Š?„l„l1Ía£]Š�Ú„]†˜M4{®˜FÇ£X8Ž0�a¢9Ïøvi aÚ4SåÅ@‹™Áœ#VÁá3<Ø9¸¿ +ÓµKhiÝ&ÒÓm'IÕ-'I´Ï-Atéiž#Í&Ò3iCI´›LàÎ0ƒ8AG4›§\*M„E¶m—²Ú#¶“XD[´ARt›H6‚všA<¡Ë@M¢8"C ;-vÒaÉΓl– ÒL91Ô˜õ +“jŒíL4¡hðÕö’£`rïio¤Û½$Û‹Bô´ÛJÕÑ, Òm¦—Òm¦kúö‡·ñ¡Ó¥¯ý oþ5×Ù%ûª¨«}m6ЪÞêí=7½:Oµ¶“¥úMØý�í;¨û­úMïI?ÓInúZ�4Ú[ê:M¾•û­Ð"ëî—|t·RßÚkC¿ò8T«wÝÞ;·«}ýÿ]HáW¶ëÐßï®?÷mVý¡®·Cëëºõ}¿î½ËO½eÔXÏÿÔ´ÿñÿ—Xã¯ÿz-ÊÐ8zÿ·¿ÿ÷Oòvá낇ú ‚:·_¸ïòÇÃ~’Ýo«o¯õ¿½×úÿ¯ÿ¯ûô½¿÷ña°ý¿¯ûÿÝzÑu­‡{¢Æ}‡ü°/[õ·ÿú‹ñý‡¯Úý¿þÑǯÿúÿ¿¯ûÿúÿöÿÿöÒÿ¯ÿaºMÿì?ÿý5_ÿú‡ú¶”¶ß_×ýÒÿòÿ4Ÿÿó«#¿ðßÿÿÿ†ÃÿÿõûkÿíôÃÿÛÿÿm}ÿøoõöÿí~éûi¤ÿ ¿õôÿƒÿÿÿølÿÿý´¿ÿÿÛÃÿá¿ÿÿmó­ÿ†ÿgô ÿh§ÿŠêöÒþý/ô»ÿôþß÷õý‡¯¿ýŠÿK¾ï¨7ßàÿÿ{iþ‚ÿ°ßÚ mCº·_­~)Š¿Òï×{ÿ×þß÷¶×þ½ß×ÿþgûÿ¼7ÿßûÿöÐO_„¿ðÿ„¾Ÿëõû®Þôíþ¯ëßÿªÿ�wþÿÿ_5'}¿ô¿ÂCýw·Ó¿¿ïÿýEGkÿþïÿ°ßm[AE{ú»ÞÛõïý¶ÿÿý¾¿¶Þ¿ëms½{ú_µ¿¶§Uæ›÷ùïý¿mZkÿ_û:¯ô½ÿ�¯ö“g¾¶ÌÕŸþÓoõm³þ·Þ¿¶g¶§/ÜÍ7i®ÙžÝi{¥þÈ!Êÿ½·«ÝºÛÿïïúöëý»ÿ×"?z~›"¡i1È„Za‚¶\ÓN ¹6^¾EpÛ0l0¾ååYÃOÛ uÞ¬0­ž›K^ÒM†–•ÖÚ­·Z®ÃO×ÛA¶{´®«[0¬ú_º8ÿl÷Ûi>éÿ¶ëûÚë´©éÂà‹Á ÂaVÄ Ä$Ói¦!VÂv)ˆA4�h6ši±PÒÂi Ø¦(6�M� “b¡¥¤  ¡…mƒM0·„i´cc ¥„»IŒ1Úiér.5cM[J�´•4äW =6ÂV’"Ži&ÚOYXÁ…Ðb0@Â*P0‘](B Ðð„ a2y…+=@ÔðÑ¡£Û #¥èöÑY`¢¥^xÏ!O 0˜¦E™ã‚à i§pïNÓÙÁ)ŠiˆL&OMŠm¤Ða‚ ¦Ié´�a› M4ÃÃI4Ó‚zºL6•äx_ûïÐÿ‡ù~×µý.ïï¢úããøãÿµ ÿþ¿™þ>ü®‘gLﬤ_ÿ¯¥�2 á–¤öGÊ �fG`�“æË.) !G†!:6ÌÅ(ÐB� +2ã=Í20BtpŽ¢” +j%%ÑÃ!Œ«„2:‰ù0ȃ +AZ¤&-ª’P2“! ­æ²R�ç#QÙÝ™552çG•%_ *?$8Hma M£[Pžš72"L&��¦š6­£\"ñ£v!±@’64ÂaÚ5†²i(L"àŠœÐóÚ„{f˜L&�ŽOÉÌÖÌóL&�˜Â6B0å8gÃ9â9È2>f˜ a(ÖÉó‚ #[ð àÎF€f8A¢f³œðKà�’"ì‘)˜EcæÈ†)Èc$ +ue!ž"@§#á ©: ´›I´°ƒ8yóI°¡m¤ØC&ÒÒ‚m'—ì4ÒM¢;h& ´�B"ÃIÒäÎ-pœðÑí¤ÛºN¡6aÆ“¤!¹. ¥Fvîši: †šèÐÒa„› Íj’¤ž’a… §¤ÃI´³8*jÈÅøA£`d¹Á„|aœ™ÓF†Èø›p§KKí&Òiz}µø'Iäíz¿¥¥íô• œ+«i:Ân˜I;¢p’|Xm¥»¤áRua%¤Û» 6úŸ4°–¡í´­w­ªé¤�–…¦x�=&Òt°¨‹m'ó6“né:M¡¢;aÚM´Âû«ª««ÖÓïiï­b©Ö£¦¾íªõÓÓkôë¥øi~µ¿±v›ôŸ·µwýÒ~÷­.·ßQJúô›ôŸ‚t¡{i[ºŠV‰EéoÛ¯ÐêÒßÛAþô.‡]¡×߯ÔW­ß޽Ʒ~?÷Ò×I»~Ÿßõ#…qÝHákêêî¯R8V�õm-}ýÿ_íwiÿúõËrƒøÿùËõåŽG]‡,r9ýí$C£¥V¿þ?�ú!Âxo_úïiî¼øí«¬7[ãÿ®ºßþ?¸Úkê­+u¯ŽÿýãÿãÁ¨ÿ¿,gÕëÿ_ÿå�vÿ¯ÿÿúÑc>£ÿÃø=Ÿúã¯ÿþ‹rDü4C£øïõÿú_Ýý[ÿ}/ÿÿ__ÿoöõ÷nëÿ×ÿ¥´›I†ÚL?ÿÛ_ÿÿÇØrƽ+uÿø#ÿÿü‡ƒûÿÿíÑ/�oÿØé觯ÿÿÿ¿íôßÿúÿî¿þÃÿ·õÿû/úÿü °ßÿ¥ÿÿû¤�Iÿü7ûi¶½ÿÿä¾ý7A½A¿ÿðFÿÚ_þßþ¯÷ÿ ¿ÿÿÐNÿêÿûÿb�_ ¿ÿý´ÿí¯ÿÿý¥¶ºƒmá¿ÿð‚ý¸_þÿ¢¯kb¿¶×_õoÿµÛÕ‡ý·_ú0ô¿ïßüWK¯ÿ¾ÿÂ_]?OÛÿÒ_þÈÁ?~ÿÂïZßþ×ÿÿ¿Uí¿÷ÿ[ÿI%õÿýÿA>ßÇÿïÿºðØnÃÿuK¿ôe?þ÷þ—ýíºMÿôßííùΛ¿§¿méÿÕUý¿9ÿ­ýuÿ÷·ýÖùVŸ4ßoþý_ý/ßßÿK¶­™÷MëúVgþßfk_³4þ–Ùšöíoþ ǯëýÚ·ÿmî®ÿ¿·¯ÿÕÿî’÷þ¿ßœöÿõõ¶ +à 6“g)pÓNÒlôÛ=í…ˆwM…a®–ÃU¶ÏMÓpýY TÂ;²?ö‡e×ížîô¿de�[J¿ÓöÕ³ëû?ÞÓWMZí™ëýÕ¦ßû ó8Ûµm&ÿ﫦ÈAìPm&* M; !&šlR 1R8ÚLS"�†“LU„ئ ŠU¶Ø¨ šlB‹L&›"»´‚i¦Ûh'¤Ód ïN!±®› ‡ö–ÝHœJôöÒƒ.m‚úvŸížîú³Ú¯xGñF†! b0š ò®AŠH«hÎÍ aOm‚a4€šaJ± aì0ƒd¡C†ºjÓ¦îà ¦˜…i§lŽ-‚Té¦ÁRiƒ% &˜kz{Pé«I¦)SL Ãi4ìŠôÐi·…4ئ "‡ÃH1PÓMaÃå•<""4dY“™Ø""!„"(爆!4wL4 Áù\VŒ! b)X¦0H¬h¬r¯É.5FF>Õ¥i&»FŒG–ê±[’ +©`·ß¡Æ…ôšEá>½ÛúeOϾûJ’þ0š~·w÷ù)ü;ñÒ÷i…îéõÿõ]|rÜ£;/•õÿ&ŒÉoÓõS¸DÂ×Ç×_ÿ‚"U’<æP‹è‰Ódt„¢ȳ# «.dSÍ�"*‡"ÖB\È¡•„ø�‚&Ìè2¡29š è�£ˆ—�6S™öu/9ˆì—5‘"Z�d¤Ã:šdZ;#;濪}PŸ#á®ØÑºgi„l 5GÆ¡0��á9éQ¬4ÂiøA„]†&¡4k ஸ ÌÏ�F·!8ðOŒàÍ0˜A„\x@Â6`‡°až±„k Ò.g\ hy‚a„ ��³®`g3‘Œñ�s!4˜ d¤èáfȆ)øÞqÌÆC˜#¦y*<„8H6ˆñí0™3³í&Ò²è]a $Ú#¶•„ -—AaÚ#†íÉžŠÆ‚m0I¨A6ÂiPA·tžLíRtFí7áV¡4t&ôÔ&&óÍÚL3]„ni¦ªƒF†ÇJš6>- Y¡¦Pš5†ÅF±„nÚ à§ ÕÁ£ŽÉÈñlša÷ +÷ÚÛJÒt®N*Ü' :¾üœ-´nöéZ6?nÐT›wÝÓ.Òt Òº·I°ƒ<ÒmØI6ðƒ<Òa²Î’m' +ËM„4Áœi;M";h&,a|M¤ám„E¶M´Ò †—g „Y1Dîè,*A‡I½þ¿U_õñ×nŸMGÅ&Úwë÷oi.ëïÔzué¦Öýµ¶µ·×„Ó^ú¤ÒV®­ÉÚI­/ÐN¯Ðt­xO öÞ—Iá6øW]Ü+ªM×kÛ^¸ë�ÐÚÔPïuÿ÷R8V�Å ÕÒoýƶ¾>¸éãêˆáÜiÒ½ÔU_«qzmwI§Jþþ�­­&ýS_{Kûúô¯Mÿÿ¢Ü��ú!Ñ–9ýKŽ�ý6ÿÿ#¶ ½×ø~>úþ“ëªÖú·ºQ¾¾×Âýõýµ#…¯}×n£¯·ß§õÝ[ÿö—øÿòÆR\aÿÿúC¾‹ÒÿØ~¿Ë ü½’ùccÿþ‹1é¿ñÛ¯ÛþC¤ÿÓz¢Ç#Ÿß§Öþ¾¿þÿÿÿÿé0ýÿÿú÷øÿÿÿª_×ÿÿþºý~è±OÿÝcý¶¿þ¾¿ÿëÿ¯ÿÿ ÿÿÿþÚÿá‡ëÿúþÝÿÿ¯þ·_ÿëþ»¯ûõñþÿýµÿÿÿþÃÿÿÿÿþó¦ÿÿÿëÿÿÿø+¯ÿø#ÿþ¿ö×Ñÿûÿëÿ¿ï¿ðþÿÿß÷×þÕÿÿÿÿÿÿÿÿF�]ÿú ÿö×ÿëçŸÿÿ_Ãþÿÿ·¿ÿÿö××Ãô—ýþÿ¶—ýÿß·ÿ ¶×ïþÂOÿÿÿëé_ÿýû¯ß¿{ÒÿöúÞ+ßÒÿÿ¿¸¦ÿÿ¿ÿýx¯ÿô¿}º‡ÿLWÿÿöëÿößþÿï:ÿ¿ÿþ½µÝyÅö«ÿÿûÿº_·ú_éu×_O¯þ¯wë_·÷í­×ö¯Û3Û¿ÛÛ4^ÛdëþëÿÛ4úÛ÷[ïÿý¿Ûööÿ¿ÛýºÿUm}m÷öß÷ô¿êÝ_ùŽûJ~›g½†¾Ùý† ]{i/þÚV•Ùÿí-zûO]³4y§íŸûlÍUŸþÞ»m³?³I×þÓûzî›4Zú÷O“«Ö¿ßïÝm„i§±I¦¦)4lRlPMX¦*ÒM6ÒMSd[¦Åi(bšL7 �ƒ»IV ¹'{ ¹ú{ $š°Á]°–žÚM—¶͆ì¿mÖ¿„w ý´›1é6•„ÿÛJ˜a[í/³Im½¿º<áŠO�ÝR;í„(V¡á6†à ÂdQ 0à 'i°“M…`Š ØN›a& b‚ Âi4ÐlB 0›šlU)˜M°”PM�Š ±[aƒ†šlSÒjÚQI¤È]Há¦�¦élBbí&“d\éÈAÛ`žÚ\DDrÜD"„JQ C@„)A +(aˆA¦4IóÜFVJF Dj:©XÁ‚¸e0BHðÑ®�Œ1 …*Ø`ƒ ö†)0·uXM¦ð $Ó ÓLŽ‚i†) Â ”;²9iµ„l-‘]&I½ˆÑ]Mˆ¤#,­ƒîÐŒ‹�­b!„"Ú„Pƒ  B¡ R­�p‚ +=°Å?Ë0ýËqÌ‚ºúÒÖ´¿X_IR¨]©k¤Ä$ + % ƒéFYšõµÿù62¾”®VˆZS$EpX¤Œ–"Ð,©§Éu×–å+÷ü8pÿUÎÌ¿òÜbéöºúÿ®e?;5ñæIQ¤u2¬”—Dda™Ð‰C!™Q�l˜ÊˆªëþžºüÈ“@Â3ƒ'Â5†HË‘ôˆK#ÂuÈ�žÃ'fF°Í3dH�†ì2ž’˜"ìÓ6<¸¤†ƒÈhÃ34BtÄqˆù¬R� ‚82ŒÙÙ˜†‚ŠP3¡)šÍ™ÐSèñÏ,á�I¢„fgTF +"A”ñÍIw’­‘*JjDu�rü"8hðÒp©0× +´ÃÒti6¡4›IÒÒm4ôÐ@ØFÂ<¦��„k~ÆÅk ÚI¦¡2y4l£\#\#`a)á±±ÉmJÖφsĬÝ8AÃ4‹˜F0Œáša'‚ 4Bjàøg´ÂÕ¯ž}®È?3?=´We\0MaˆHøÎˆ0°Ä$|a’ÔaôVC �4Ò=¹ã*Ä&ü-… ¦† ЇÞ]‚ 4Å1L&G†›dr§ „ÛK¦*ƒƒmŠ…¦˜A Ãi1PÒÛAm6H6ÒŠ ¥a,&ÚH6+Óm%d>\;H6‚M~ ¹¦Û %+•B"#–ë9CA�I0„A„ !r6ƒB2²!ˆB ÂaJÆàÂh4ŠÆ� Òx2z„ż„"ÅO ‘ &!D˜b¶‚ î)a4ÈÇM¤�¶l'NØ…é.‡&ÂYn5ˆÍˆ™¡Š„" â…(�Š44z0auW_Ç-Ë15­*ÒKÒô½/Ö—\ÂK¤½uJ˜a IRJÖÒ¥† ´Š¥iPB-Ðtu{ˆqÐŒü´$ÉTv·õ#!ò§”rÈ)¤¤S +#\¹¶cŸb m(는l7wýê}èññ +&‡•† +ÿûþ“«_¤ëGzÄ­®©÷Ý÷Q¡zªÿ“~ÎÅqÇ Ðû^»ºïïUõñÿ*ï´×2[D¢;I’¯#zú¯¯¯�…gbþJ¸"'Êâ~ �eX„�J'FÈ0ˆ@ËðeÙˆBäPÊÂd@¤ó†¤tL3¡"ÎF¨ˆ�Fu""¤A êÊ„S¿ÔÔŽÅÖŸþ«¬#s�FÆšhýÖ?0¡0��?*=°¡4k™Ùü#cL Ñ­äú5†^Âq3‚ "à3F°x@Á.Éð�‚5°‹³Ð†�’3�`�ˆx a +h²âŸ‰ôBA ÀʸÌR R„a™ŠAÄù B� ÑäSgä�OçŒäm)4äƒ)ÙÔ”…+jR*×*5¤ÛL “hk¤$Ú#Æ“l³Œ%¢,4�dÏI†ˆî‚}Rb¤väÑDXh&4›Â44›Pš²\i8A0ÓP‚n˜jšNœ[èØÂa0��ØTѰ6KÉù®���ÕÖÂ4?»lE2C„]†Q„ð�`ŒàÂ.ä@ÏG€Í"æaÃD$ÊAœ2F`dá “d4ïÕ¢QÅ/áZWÉÇxOŠº¤Ú µ|*Ôm‚u„“Û¥¦}¥IZN“jé6�l Ï4°²ý¸m—Bè›WIÂZM‡tœ ¡¥²ÈA´›ô “ôÔ™Âm5ÐA´�îÒMéªA½4�µAÏß „hpêŸJ­ +¤êžÿâ—M¯¿µØî“ÿíÓ¥í¤ýÓ÷ŽÚºM%u¤þÛþ•«ãº%¯ñWIÝ+_Òmö�&Ô>•¥¥´Òá� +“²ÏI†ƒ8k²ÎGm&äÛª¡ÚÆö¢†ú‘Âï[]¾é7¿ÿû¾º�u´ë¡Ú[ŠŠ¶Ó¥ôÿê®6–â¿úké7_þé}íjÚº¿ItÖ¿¯M¨ð�-¬·;�9c�|·$uò2üaÿïÃßé÷¯ëÇÿ[VÚJ·ýûÿ�úÚÈá~Ðëþ¿VÛý[që®¶Ö¶…ëw¦÷úøŽ–#°ÒÇÒ_‡ú·ìÿÿúúÿˬúþ¿¿ú-É!A�¢Ÿ‡,r9ý[ëîºý[~‡Þ¿]®ÿ¯íþÃÿý}‡ÿû~õÿíÿÿûÿoÿ¿ÿ†¼±?ÿõnõÕÿÿµü¦þãÿ¯ ÿþÃü7ÿûíÿKõöÒÛÿÿüØ¿ÿí¯û ­Þÿ¿õ­é}ýƒÿ¾ëàßß~‚ÿÿý´¿ýºüÓn°oÿÿÿÿa‚0ÿðßÿ‚ÿÚ)éþ¿ªÿÿíþ÷^÷ÿé~ÿõáý†‚ÿö ôŸÛAa¿ÿÿÇÿA?øoÿÂ4Ýn¿ÿ3ŸÛÁþP¿ÿ þÜ;Ýïÿ ~ÿëïð‚ÿ¿_àíÿô¿ÿÿ½°—߇ÿ½/ÿÝÿIïÒA~ÿü7øG¿ßÞÿoõ÷ý¿ßÒÿF0ý/Ñê¿öÿßëÿØt¿ößÿK÷¦ëþ«ôï¥ú_ßáÿKííä öÿõüçÿלÿ_ÿVýWÓsRvëïÿÿÿ¯]ýîÿ¯ûXlVÚÿ¯ñKú_õïúþÌÓM™ù�íÙŸíþ¿ÿ¶¾Ý_ýÿÿÿÚúíº^ßõ·”n¿~s­ýµ_úzúöéVú_õý}ÿKí…ì$�Ý0Ïm¥ì3“faû®÷I}P!�¯ü†ý~CÌöèäÝmÝ-·ú_«fkÒ×lѶh¯·­}µßu÷_oõýºóŸþ¼1T¤ü$Å1I¦Ä(Ðl”$ÚJÁ ÛJÓ´µM´í‘q§¶ØTùÃM[a‚V•ºI¶rm+[ý&×Û[º°�Ûa&Óºa«w˜V¿vô×·WÚZ·~¿­î¿ÿßÃ,$gnÄ Â $ðÂa-:ÃdY†Ò±&›é§i§ 4Âm†!&a:iÛia†’ Š ¤ša‘]' ) Ø ›iHá&Å2+í&)Ž0Ú +aª¶–Ò¶’¦ÝH®`�H®§"¸yí¥}¤Ù{¼‡æ8ˆ‹ƒÉaˆˆ0Št!‚qH�hR²O”$sÁ‚•Œ¡CXHÐÃŒíÜðÁ„Bhöå]Ša#EŠ�Ý݆h2PšlC©PÂA„Ða¤M;$L:aÂa2 øW $ÓM‚z­0›¨…%vGÅ&Ú Åa+m&!2+¶*5  •nYƒLC"„JUÊQ@1N @Á†1HöÍ4xm5°šG·+aM4Õ2V0Ä$ØQ&Ä ÉBk  6ÒNDDh›k•ùŒØ†ŽÁ D}"=~—ÿ`¼'IÑáÐN"(¸#ÿåqLì;ÐæJ¸PPRÔïçˆ)ŽÅâ^Þé9f‰iP§ḩ™]§Ôwý4š2gGʪÓwv½ÿê¿ûUÿ×òü¯<\FWã:’” £6f¢)ãQdã)õÈ#3HÔD3O_×&|È“3‚ #d#c +˜FÃÐð "òvÍ @Ñ Ç‚|»4Â0�a„{"™¤k2$D™ë�s¼ÿÖ¨‹ 'I‡Òl fÍ ˜j‹wÒª ´-ÚM¤è㲓 a”EÌ#X`ƒ8Ï•—!:N!!`ˆ‡˜P!Ô�G ˜ë �0ˆEdÃ$M9‹˜9HÈf¤Ã…@�-+“ö•Ât�+NÙc  ds ¢~i6¯N©£ÃI´-&ç퇑Ž„njši£ó‹Ñúfd˜A„kfzaa„hyøÏ £@f0FvO„ £Q“³ #¸h„h ‘›û¨º{¾—]=>ô5î–ÿÿýÿÿÿ_öþ­òÀÃýþX×é¿åŽFÿò¿ïã÷ߨûíïÿÿÿÿÿþËÿô¡ÿú]ÿ¾�ÿúZ,Ÿÿ×}þ¿_áÿÿÿÿÿ:ïþ ¢(ÿÿÃÿïÿÿÿþ¿íÿÿªÿûýÿÿÿþ—þyÿþÃÿÿÿÿþ þô¿ÿÿ¿°ÿýõÿßþÿ¶êÿÿ ÿÿÿÿÿøF�ý¤Toþ¾Kïÿá¿÷úßÞïþ¿û«ÿׇÿÿ®ÿÿÿ¾ÒÿÛ$Ÿÿô¿ÿýöúoß¿ÿÿléýþÚí¿ÿ·¯×ïÿþéø„¿ÿ°—úøoýíëš{f‹ÿÿþ’ÿëÉ…ÿ_õºõßÿ·Úÿè-zé÷_ß÷ßm§g»I†—·mªí˜_ÿ¶f®Ž=¿Û]»õ×Û׺×oÿÿÿõ_]~ÿî¼ò馛b­Å&¬lRiÆ©ÃaªvÈ|¥¯ûÖÙÿ¦ûKÛ?õºÝv~¿ý½³E¯ý›_Õ×·¯ºúÕSPÉBaCH0“A†J $Óh ÐmU¦­0éÕ4í[Ka‚ÚQv“"öJÒÛ­+l%¯é°Ï[ %„qò÷« éà�¥¤»fkþëþ[š°XGe(‚"KQƒ&Ϊi­¶�A± ƒI‘ÅÚ +‚aа’ °‚A„‚aˆA4ÓM4ÃlpÝŠUM‡#‡iZIÛ"�†Ãd\a´µºå¦´ˆ" B"pbƒCA“¨)XÁ…H¬aˆR°A"±†-Ú44{höÑâ� M0“†žÓYyVb©á&ØH&ƒa¥Ëcš@ÊJ(¸!„W¯'1Pª!ÑWˆƒ +Ub§SÛMº¯ˆˆˆIñ¢È7þ¿ëÿúü=´Á=†•ÜB 2­„ò��”Xî"#ÿåp´r25ˆB*±Ý©] † +Œ=A2Ü8²“Šê^?AZæ@QRaIxíf-ý +[”Gt¨Þ_Cºˆz¼?h<û*L•µ;-LõÖþ–õÿ¿áÕ3³Ú�ëkÿöšú¯ÿÕ÷_�þd•�߈Ž!¦×ûñý}̳qÈ›# Éƒ:Œ�) =’›gVF‹%†F̤GVHe\©þ«á~ÖÈŒ&­£cFÊ!8ØF`ô #À3H¹]΃„œ¦`ÁÃ"(0F€`�Êy¢<ˆ@#Ù!&M‘Œ¡fbŠFÄ ÆHŒ#ÆvHбJFu2&ÉIä!Ó*H‰™2òY�Ïïÿ£C 6ˆí¤ÚL0‚y*&м#C +Ú ä|I:M¤Ú è9ö�ù®PšáhçÊ=´Õ¡#å£`dðL äæOÍlÏ4 #8f0�Ïó]Í0�a‘­Ì�ª„hlgölˆs˜#.fb3dKŠD!r eY Y>Q�C�b‘@¥ )ÔÉYûzmi6–»I0Ñ'Võ¢1é8ki'Dž“i:ºéS²ÄB á²g™´’p“„0“ ' +®t˜h‹V_IÓ³ 5l; �RaªNš¦“í(M&ƒ[ÜÔ&O)Â5¼ü�l(Mí’òg6M4k #dœ9 æ†@°�aýµV�S[¯úkm.a/¿ôëþ**£ôím…Qù8®¿ŠM¤Ü&nû„¡6“ /tœ*M…W +ƒ8i;MÃIó6Òmy…ži-–xAѵÝÂ Õ ÚNMÉ¡Z¤ß­Ðã_VÜk­Æ¶í$·-.÷½ÚÃÚ^:uê´½Wê/¿¥¿úO¨é>/Ó¤ýÐi+«Åwºow× +“i~éaUÿËòÇ#™Eõþ;¯¾?Cݽÿþ÷[¡Ö÷CM»ÿnú]~–ý¾á§¾šÔwÇow¤¿Iºz¿§u´�/IüãøË«êßÿíé|±l6ƒÿÿ†?,r:ü5_ÿ¿ü__‡ýÚî—ºízUî»Z¿¯Ók×Ö÷ý/_ÿ_ôõÒVÃÿÿa®�ûßÿ`ÿ¿ÿ齇ü×ÿÓ~ê?ÓWõºõ�Ž÷ÿÿÿÿaÿ¶Ž=/Õ°Þÿÿa¯®ÃKÿ6/°ÿÿר°õÿõÿIýK‰ëþ¿¯þÿÿÿÐ_ý7”OàŒðl7†ÿÿÃ`Œÿaø7ÿÿ·ûÐ/ÿûöÛ¯ÿÿëÿøÿýýuØÿÿÿð—û®’_a†ÃxoÿÂ ì ¼7û>Á87ûixÿÿƒƒzÿÿþ‘Ñÿ?¿ÿüaøoûûÝû×éÝ7¥î‚Ü>ßÿt¿A{ÿøøÛ —ÿþðÛÿÿêÿý'ÿÿÑã¥á¿÷÷¿ÚÿýñÅ%ö»¾ÿÿî—ºû¾¿ûþ¢—ÿ·[þö?þÿô—÷ÿþ¾— Ÿ ÿvïÞ¿_}ª×õ9¹…ç—¯ÿžOý¯½·×ûþ‚ÿ¿×Þþÿºý$¿ëÿïþð—„½ÿßÙ¢lÍ:ö¿ëߺûkõÿ÷ú껜öÝ/ï9ÿªþþþsÿ*7ÿuýU}×ÒoßÛ§ÿ×ì3–¬0¶¬?t¿ÓVáµØOlÿa;^»Kÿýºµìÿ¯ÕÝ_ÿÿ ¿ö·÷_ÿÕ{ÝFkþëÿïõ½}|æðƒ ¦Å&ƒbƒƃ 4a4áƒh6+i†`“b¡˜6êÒNé‘5jœ‰�;J ¹m„¤W´ƒg¥®ÚÝ_²¡ îÛöÒî¿m_Ûý×ô—[Ý|ü—í®ôÚÿ¯¥FŠ49VaJ¶�Âa28 8«½¦“ ”&žš °š{#è&Á$Û#ÔÂTmiÚM4aŠ…¦ÚLB 4“A§";°’i¦Ã°ìljÚK¤�§u¦›bÕ[I=5YpòöÝ'÷m„Pí½[I¾ÓlÇi÷QˆqAàhDA‹ B: Æ!„E9Y ¬h®*�b˜C+a4 "±†L˜LBG9W•m…LB[½¦™+†J0Ø46 -4ìCªM0Åh6ÐI„ÓÈâ0NÄ$ašxM6G4i1Øn*Á°›k-�$PgehDd bò�"+"!“ ñ(Éñ‚¦šG¶4èö�a£ójdíO(2wi¦Om„\DDr¸*rÜ…Z¡Òþ­„–ÃH¼Ôj?þM‹3²¸íMJãlž;«#‘Ã#ÁHˆ‚ÁBdÙNáMDj‹…Ô®ðRÜZ'ŽÒD±’ˆìÄDG`qØq_C+ß›‹äî¿xP¤Uªªª©žvP“Ný%»ôï�ú5²t~%ÑtÓÿÿé Â=ΰG¿q­ý·Ô�È.ŠßßýZµ¯×ïYد’œˆÎÄñi“°Ù>„_½öŸr�{»Ö5�QÇýuUz » Ÿñþüí:ñi)‘*9åäÄt,èóvPJF�9šÌ©">¾½;{„›ÿô½?¡é„ #X~PŒàƒF€ðFpð�áð�fè@Â4|4 Al4BdÀʆA 2 ‚%�AI‘REWüR"ƒÊt gLÛ3Œ«2+yZDcÉG‘¿LÕžuY.—þˆ®MøO· &F5I»�ÃÒnBO„gi0ä[T�¿¦­ú64l²~OÍ�¤~Mþ°aa„\�`Ò0@ÎÕ ù„hlϘ Eß›ñ�Q:  p�™E©¤GÈøH& 2@Ôœç²A‘NDé²: ÔÊrRLÏÐf³$ +AŒˆeY&Jµ:m&ýBn¬-/Þ“pë¶Òl4a.Ë;2u”‰IwdU™Ú R�=M}äǪ^ÝPhZM¤é: ƒjI¾j©¤Ú¦š74~¦hØÓM!» #cPƒFåQAÓòS„]Œ—ÌF°ÑptpÏ™>O— DÝ„qÃ;Á6( DsD ƒ!æÉ( "¦È†!*Ÿ6DŒÙe@„ãD!rEÉ–Hc"¥œˆ)�Ì–2QÿtÏ#$Úº¸Ul&xÒÙi+²ÎÒ áiC]g†M¡«¤Ú ´˜hŽÚ[%Á4�mßA:j“aÆîª¨l$©¦�o?$,5 ª6?4lhÑPš§“ÈÖF†§ð�†Aœ4‘íœ3æ 0ŒàÂ4öižô—Ê �0É ½›ÚxN¾8é[ºúî“¥ÕixâôJŠV“¤Ú ÒmÞ’mßIÔ:M¤û…ŒzWÚ áil³Ò „ÃE9ˆL6Z&mÚM„D†ˆ°õH:M²h¤ÃT{j“úA¼#CIÐN“„-a¤-„ ‡‚wÛq‹½öéëÂö‡ÚwÕ}ShZöµÞþÿ_t´·úk´ºi´½RºqÒmöÖׂmoT´· +“¦ô®î—n“««¢\V“iv}¿}:¸z[ãáwûÖþ¤p¶Óh}©- +Mï^é$ßõ¸©/û´(u¿×º¶Óé¯[¶íúOû÷꣺Mm¯Ž.-u}»ÿŒ8~ßú<ßøÿòµynPå£ d©]õÛõÿ_à’ýÝG¯zßöÿ޶�§ÝF½Òm§ïÒë¾­L fH}ûé0Ø=úÿô†ñ‡Cíÿ÷ÿÿãÿòÅûÿ÷úÿ¢ì¥_}þ?ÿðý|{†ï…Bª¿þÃoÿ\[ÿ_ðßûÿýµKÿKÿõý}_ÿÿ}ý/Õþ˜ÿµu~ÿØlÿÁ~ÿçVGíÿ†ÿÿôwÿÿÿúþ¿ÿïþÿð¿ÛûÿVzÿÿáÃÿáÐ/ûÿÃwÿû~—ÿÿÿø#?ðFÿÿþÿð¿ÿ·ÿí°ÿÿÿ¸v÷¯Kû¯KÿþúÿÒoÿÿ¿ÿ ýÿÿÿá?ÿ„{ÿ¯ƒù*ðlÿÿëÛ¿këþ¾¿îÿ{û¯ÿ]kÿÿÿÚ_á/úÿ_ôÿö—ý}‡ÿÂNþÿÿ^uó½z¯O^¿÷õîÝß÷±Ãoþý»ÿô¿ÿ¦×ÿþ×ëÿ_õýÿô¶Ãÿßý-¿ëµÿöÿÿÛ:~­äí½{ôý_¿ïÿ·úëÿþÝ~ëë¥í¥ûï÷éný=þ—]³ýÕÖõúÚZ_ÿÙÿ«I³÷Óf{v’÷¾é~Ýö¿j¿ëï_n¿Þ½uþ¿×¹Gû~ªsr'úÞßûA&ÅiZI¶‚M9ÃdS ´“N4ôÛ ZZL0’v“ $ÙéÒí´ö›IµÛ‡¶oïVÏ«ãÿþÛKû«öÌÿµµöí}´¾ýµÿô¿¦Ûþ±I°™lPÆšl'i&è ÓÝSL1M¥h&!'i1LPa¤šlˆé­´¤ ïcMŠd öEvM�éÆ�¬0Ãd\¶’iÈ�JDÎà H£‡¥¥ì3Þv^·_{®Øgÿ°NêêÒ³ûgæçì·§B !„kGgÒ ˜(Äg²¬¬r² b¨ŽA„� 1@ B¸i†¨ZbAC%&Âam5pà +šMoé6ÒM6ƒ $Â4بOh+Ah0ÅI]ˆA0Ú 0�ÚLaŠ §#€Û]-& bfëÒù] #%8ÈF"" Ê—Jú£Z`„1 +{ÊÈa š•m0M5!4ìø{†M5qWnȤˆa'´ÔS *ÂAŠh1A4ÿÈ’Uˆå”jšFl#'`Æ4\Á‚5ÀÁOtW5]…þâ#�–ãÇý‡„¿øoKÿ· ©§û Ba0šiŠŒE0˜NQñ£câ"#ÿår7Gù’ZEÔˆA#a3Ž_—H·¼Ëâ¸q‘¤vVÎÄ”ÖÁB48ˆÔ(S)Æóy¼ö8‚…$¦a2»ÇbqÙ'H7H&æâúþÅE@©×£ÅNÓ²N +v|(Z;öà•´·}Ã´Ó +þ•¯¾ébéZ:tÝ~þétîé ûîý^¾·òu½ôK¬ïûUÿêÕlqõíÒTõ;-¿Ì‰?ÿܤ3ÆuÑgA‘Dq‘ ÈÁ’H¡ËÎDdJsW®÷ë¯ë§ÿÞF²2  Â5† Ñí¦eA„k6††vÂ5´{ "àF`ü dˆ8)3Ÿ03„CŠ£q Ê8´D" Ž¢B“tÞ’\á�¤›#Y>k%ͳQ‘…•g”ž¿ûà×DpÂ=´ƒhq„œ*;´Õ&A´ 'IÐM¦¾nÐLÂGê5µPƒGæL#`hדòtª5†¡šiÚ ÃÍ9 Œ&�™™™¢9œ/„ 0EÛD&Pa„k"Ç�"³@fÅ<Ï£c:2;Ì ��³1Hy�’âœE:6D�Q “dCŽf™ gA’dS³Qáú ·I´7ºˆmC¤ØJÒëWH6¡ûp“k¥ Îæm &Òw}–,i8DXyÂA0íÒNLôha~Lt“¢+´gp˜~�¤'A z ë ¦&ôÂj°5LžR9ž•�d]xL#`q‚ŸÑºvF°Â4i„FÏðaý;­»j.ÞÒOMv¢£Þþßj*é5kÉÅ+Ç}ÕÒá7Aµÿ >7°ÝÜRtOÃl.Ë; ¤ÚZL6X‹‡i3Í'†y¡¤Ú á…ŸÐPˆ·I¤S–z+M°˜ARÐM¤K‹ 'íä1ûý6ÓÛNâ¶�©-ÚMãÖ™¯[[éãëÿM%Óî©·¤þé¯ïWÖ•««øý6“×'›Iñ® µh{t­õIÒ´­'„é}µïë÷¾µäsýÿB;kCiHáoýF·û�÷Vÿ­ÚÔŽÝ[®¯Ý'Ò|vÚwÿþ¿n�/Òmzm/Ù�oÿýØ{ûzBÃ`×ÿ–X Wùe¼3 úCþè±Èö¦ïz®¿Ç÷�ú×Vøëí%¿¤ï×î¤pºþ¤p¿[êü1_ç…ÿaþ¿Ãoþÿi ?ýñô¿Õ¿ÿÑiþ­ý|6ÒÿþÿKßÿä`Ý:ü•-�õða$ÿÿþÿü6Ãÿü6¿þßþ¿¾÷ýÿúÿÿõþÃÿKõ×ûÿH]zÒÿ_�¿_ÿ†ÿÿ †ÿÿ š2;ÿ¬7ÿ‚0ÿþÑOKÿÿqÿÿÿþÃn¿ÿÿ¯úÿëÿ×ÿ¥ÝúøÿÃ`ÿÿ†ÐOÿØ7ÿ Ÿÿuþÿÿ/ÿÿÿÃz[ÿÿé~Úÿ¶¿þÿõÿÿ¿ÓuØw×þÃ¥ÿøý/ÿ´›KëÿÒ[ÿïü>¿ÿzþÚ ûþÿÁ?ý-×öþŸ¯[wvÿýÒ_ïwÿ°¿ý±Åuý~¿ÿí×߆Ûþúþ¿`ÿÝ/îôÿÒK¯ôµ9úï·gU˜þ¿Ü•-þÿþ¿×§ÿmK÷ÿ×úÞýþ›_Òý üWÿ¯÷ô’mzëî®ÒÛ¿Ýîÿý¾ÎŸþÚ­}6ÿ~õ~«û¿{®D'}oÿë_Â_·÷·¤—ïÕ*nêÚV•Ö–ôÃ=ÙÿJé´³;öÌ×ZþÙš¶Ï¯m{o_ÖÌú¯û_ÿöÿ´›îµKöÿn¿£5ÿþÖþÞ«÷Ðh “iZi¶•„­+I6Òcb­-&ÐKª{ Ò‘\4ý°Ul-Õ‚)ÚÙ}†r‘\Žßh&Òßí]+VÌ+¡ß­ž¯Þ›Mµî¿lÍ}º]é/òöÌ×ÞÙ¦õ§í¬&�IŠ Ý± +M‚ + “a„ƒ0˜¦ TÚH< Ó ± †“ Õ4Ø„ƒb›IƒÐlSÕ*v“Ö›#Çm ™;Žj�±L‹�6ÒbÝz´¶Ã ¦­¤šê¾­Ù{VWM°ƒa„›JÂ;Èÿ·q$ˆˆgLhkAˆ!Â1 ®ˆÊÉPà 0‘í„~*ÊÈa#ÜA’ 0¥]„PšAÎîUˆA„í&Ò¦Á« +˜M:i¦MÓl�¤ÈáA6Hu¦›špÛI4ÓÈâ&š ¶!&ƒb©YÓÚLTRi±ÂF³òlˆÑ\ Åá•\¡”ˆB!ˆRŒ\¬h¬`Á#áXVIàÅr}ØÒ+(öÉôi¶‘áʸ0…Œ50AЦ»d­PP¼µÀÑ_Tå”(7A¨W�ý}%ªÞÚTLÒ£ÛÐö+CC@ÁDDþW;;YŒ´¹$”¥Êv.2ÉKLíQGid[ª3%ynQ’‚;22Qêÿ;f#@dœ 8³µ‚#¢9©ø)\•“Át™'¿ù4D~©Ù.4› !º¼®XõÈFâ�íf éü­“|�I+aRlˆÀCÀÁ &Nûÿé:O¯È›6“%i á¤6ØIˆTé± Ó«™9F„C)jâ"�ˆŒÍÉÌ–s ¼De D1DLB•Î�h£b�„Vö‰ ¹"ìªÁb“�–‚ñd, ú+­A-/úP}ivÒ«KK±A„Ú]pÁ ˜ÜA—#VœµÐN#ÿòÜB–*ÚN«v•¸ÒWûi_¤ÿîö+­¾éijékxÓí»úZM½Zòv«‚´¯z]÷VÕêþéik]A6“ÁZ†’m6ÒªKež“h3Ì*NËBo ê߆GÖ¢‡v­´–úÖ¿ý}oÖ‡¥¨©-jÜvÓ¥ý:ª¿O§�îªíõÿM»éWé:§‹û«ï´“ë·Wâé7aëü(UüºÃ‡úUôßÿÿÃ^XäS½ë‚^´­õoþ:¿Ð§÷㾫m-wiè^;Ò}!­Åm§ê½ÒÝÞõnÃ÷üun¶½$?ÿÿÿöñÒÕ!­[—Xÿèš¿ü´ÿô^¾Ôé¿×úÑc‘§ ¿ÿë}Òun·¾»ÿÿ]†„½ÿý´¿ý‡Z_ÿþÁÿÿÖßëßøß÷Zÿÿ¯‹¥é·úKÿü=x7ÿÿø6üeMÿÿ½øoöÒÿÿoÿÿÿÿ¯Ý4•ÒÿÿÿØmÿþ¿ëÿþÃöáÿÿûÃwêúÿûh/ÿï¿ÿÿ! ×ÿÿßþÑß”2;ÿÿÿü7×ÿÿôC¿ÿØß×ýÒí·ÿ¿ûþÐ_þÿ¶—Ýÿ·ÿÿ}ö¿¾é ¶ÒÿÿÿÃv¿ÿÿ¤_ÿàß÷Û×ûÛÝúÒþ½?þþñ]¿·Xýÿ×ÿzûÒº.ýëþ¾ü;×ßÿúI?ÿáþ¦Jº_ï[gMËûk÷þëéùä÷Ûýß­þõþÛí÷UìTk·Úÿ¿oÿÛ¯Õ/ÿ÷ÝÝÚ·zMïZÿ÷N©ÿÿ··íÛïM�:û_ÿ¯ý×ÛÚÿÿÿÿ*Ó¿·þ«õ¯½~ýû­ÒþÝ&é³ÝÖ•¥™º½³ vÖí�ÇûþéîÌÕm¶f¯µ³?ýëý¶Öý³Om/³Dׯ·_·ë{k×ßï_¤f—û_ÎÖÂJÚI„ 6ÐLSëiÒOO¸í]&FÓózv”0M°“Û öØVÐn“i]{iYŽÌ~ÙýëöÒÌæÐW¶»ûVé~Ý·¶­™íÓû¶—ëëï_þÚØ„›`‚»TØ4ƒ5LSi'„Ñ +;i4Ãh)m4šiÚA‘]1T›Ä&)†‚b›JÓm(¨¤Ób›JEƬW¶’ìSÔŠáù�´“M6»²ý¶C¸a-/Û=ÿk÷¬AÙ�m+ÖêÌ'©’ÂhDD!1ìü¯Fx£ÜX„éGº+,)WF†ŠëÓ0…Øad¡0‘@ÚlSM&› °“ 4Ú<26ƒ *x]0m¤ši±I±[¨kA4Ãi Ãh$ Päp˜¤ÛIVô£m)hÜì¡Õ1Â2*Aˆ Ñ&Š#V!åcEs !ƒ[LBGŠ+2­†F†Ó0˜A‚bÛ íŽû“Âvl0‚NÓbšl�¥W- ,íe¤ò¹ƒ*hÅ×ÄhDGÕ}%[aIYtZ@GÃ�QøÔü®Y™jŽÊTEØ¡)™�m$ðG†v«¹IfTeš”çehÈkõJ­-é¦v6ɸ¬ ¦xR–Îá˜Jê:Cÿÿ§‘{C +KÄJé5½tïï÷ÉÙ}«òIâ9YGx‡Ýúx[_ýWU,–ŽÊQ‘bñÚÐ[{OÊ´BÑ•}U5_Çÿ™fldŒ»Ï ÌC®O”N!.,ˆ¬«#™ 2&¥á‚æE9VK‰èF0ŠLŸ'$ʱ’ 3¡¤FDlΙÓ#¢ +•5ÿzª &ö‘±ÁÁ£e˜FƤ94ôlfryÉ0� 4ÐaF¶g™Á4=„h Ó0g¤BLô5°�Ñ 3XdFg„™ ¿. ˆì$Ë¡!Ì!‘Ù8„„l�Ú¦Q’'‰Ïdø�dQ„^"PŽ¢~LƒÙ0ÈË‘ˆ,g9Œ¨‰A)E\K¢�ä—#ùò+ÐgóWá$Û‡I´­&.¸D[l´&ÐÙtNˆá„{i6“ª Ù„{k¥¦ªê�múM®š65  ›I´�šÚ?4Ó ²~KÏ”lyýBi„]´kj¡™Á0š„Ñí„keA¢!Ödà‹³Äx‚6M0Œ8a'Â,èËæÆŒ2C#Þl`�“šódCªÓZ^‚JßÝ+I· ô­�'ÐMºWN&Ýtœ+«1éZ»- † ÎM«¥i:N“i8I†fÆpÜ:N“rg¢8"CA6“²gNˆá£ÃXIÒa¨M…„hi6“n-R=kjKŠ ’FÆ&¦ilgX#]SÐÍ0ŸÝ/I±õ÷k×ÇÆº}tÇiÿ]ÚýoIútšÃIZ^+¥ï §}E-ÕÁ:V–Ò\&Éø{¤ÚgܺV–úN&Nƒ8imPT´›I¾ ãT©RtEv“h]¯¯J?Ðé½÷ò8PÖõ¾ù.þÿ^>ñßÛµ¨âª—zi:Vïýª{´ïö:ûMïŠNûÖ–—ºO¥¯N–ô©:V“|&Ââ» AµÑ'_ÇÒEáÄx9c–9êûþ²Hô?ZÉVþøí>ëzþé>G ]¡¨¯ÓýÇÿ©/Ö×»i­Óû©-~»í×M¥û¥ªíþëâí×A¯ë®>ÃHGÿúÿèXÿÿˬ>›õáËÃWÛÿí9Ë¿ðPñ÷÷¾ßÿÇúõÇ}vé×�~··ºzܬ·ïÿÿ¯ûÿ×ÿaëÿ]+«ÿØ<ô…ƒÿýƒ§ÿÔ÷¦ÿýE¹*/÷a¼7±ÿàŒûü0ÿÿÿÁÿì?ÿÿöÿ¯« üؾÃÿý½öÿý/¯®¿[u׊·ÿ‡¿ÿ.g‡¿ÿÿÒÿÁÿüÓÿðßÿþÏ ÿÿøoÿöýÛÿÿÿÿ^¿_ÿÿaì?\ÌëÛü7ëÿÿ„¿öÿý_ÿÿûí‡ÿþ·×þ à�üÿÿ lŽÿÿaÿýÿøooÂ÷ü/½û¿ÿ÷ú_öô¿ûo÷ð–îÿÇÁÿþßKÿÃÿÿ _ÿáÿ{kßÿøoü#ǯõí¿ößÿ¿ëÿ¿ÿ¥ÿïÚ_þ–í¿ÿïþKÿVÛÿû ~Þ—ÿÿßÿ‡ÃøKÇú¯wç:mÒÿïÿý²õÿ×ý³ª}ÿïoß½/ýÿýßKÿßKÿ÷þ’ÿØí¥þûô—ÿïm³5kù§u¯í™¯õý¶ÿÿ_ïÖ»¯ÛíTç··ÿy¿nÿì¨ÿ_ú9Óÿý¯ÿºë÷ýïÿᆱôôäAÝÛ -„Pîé†t“õl¼Úßv}ö{Òÿû»ý³5¥n¿¶f¶Ï×zV~mÒÿÛïÿoïÿÒû¯ý¿Öþéß·¯óŸœÿþšvÁ8Nئ vÂAˆM¤šiÊb‚a4äqÔ&í$íS]†ÃU‘1°ÁoÌm “Óa…Û Hƒ‹¦ÒažÛ®ÕµÒl÷f¾ÙÿK6¬'¯­Ó¥ÝýŸõomw]{o~öÌÕ©ïÿÿë_<9VÅ óÞV šiˆL Å#C\+ «´ØMvÁ1Iªi¦šA¦ÂMˆL2>“ÚJƒMŠA± ‚eÛH11M„kr,;IŠcNÕ6*éŽFá§kh-&ÒMdK¦Ã H®‘Â0ôÛJD?†:Ø`ƒa…m+ï[¥º´¿–�XˆÊÈ¢…\¬ H®ƒÅ´Ä �m’xA!„Ó±L Âb�h4Þ˜„L$Ó´ØLT(M&�é2C¦I¦Â†˜b¡lŽ,›h&a6Dté²#¦(6‚Â(pí4í$í+Ja§,Ä#µT" Ê.„DA‚;&ŠˆƒÊ DeW.`Å 2±†'A‚aA¡ +3Ø„ÂjgÊÆa +pûãéŠ�þ·ïµ­ÓÓZK¥öþýPQ +àƒzW +!Z\ Ûª Ò…Û¥²Ï'wÒÂ#½>“„›eÒü¾ $ØA6“»¤ØA0ÐO&tè‹ -'BÒy4P3mÚ †�m Ú Òa¤éjšíº‘Âݺ¶ÓÇúBñ¾�·Öº¯ôSwi÷ÿiÖÚý­wÛ[}_ôºk|{ÿÃk«¥¿ë«ºè¤éh�Ò[ª †ÚZN“iiZé6ô¡éë‚»ë}HþºîºMu¡·N¢†íz‘µñþûíõǽþÐý}ªÿÓéÓ¥þ:v=;Z뤟ÿí-+Ý-E.šWþ�°l­ü´ÿùiÿxëËsë_–ä…{ûñ¾ˆsßÿÿ__Ð_¶¿hý¡¨×ö‡}nõÖâ¾îÖ¤pª;ij¿ÐéÿÛaÿÿõÿOKøÝicÿú,gå§ÿÿü½’ÿñÿþ·(rÏÿyc‘}ðåŽEVñýqúÿÞ=uò8[An‡ÿa·ÿÿ¯úëþëÿ¯¿ÿÿÿ_þ—ÿÚ^ÃÄÿ~,=ÿÿôXš¦ÿcòÇ#n«þ ƒÿÿÿ·Dµõÿÿÿÿûí¯ÿÿ…÷ý¿ÿ×_a«ÿ×_ÿõý&ñÿaÃÿÿ÷ÿz„Ÿö×ÿÿÿÿÿt¿ÿücÿ¯aÿÿëXoaçAÿÿÿÿÛ]îû×ßïÿÝ/ÿ÷ûÿßÿÿ¶‚ÿÿôí¯ƒÿÿà� áôxÿ™ïÿÿÿøl‡ÿ­Ýû_ÿ¾ý¶Ò︯¿ýûÿø…ýýþ‚ÿ¯ ÿÿè/ÃxoIÿ×ÿÿÿûÂÿ^Ϋ1ÿ^ÿÿÿ«û[¯ûÿþŒYÿßõý‡ïþö¿»‡Â_~•÷ÿ÷û¥þënÿÛ_¿ÛÛöÝ{Ûý¿þ¿öÿý/ÿ¿×ÿßÿûÒýïõûÖ·ÿÿn¿u÷é[g­.·¥Û?÷·¶öÍ~Õ½³=öïÿKoÿÿÓý¿nÿ_üç·ßõ·­ç7È’}~Ÿ¯¿ÿm½om×ïi&Å]ZJÚV› *j› ݰÂêØ%W"iÚU°Ïmžÿõ¶Ïúì3ßÞ» âOÛ3ïÿÿiµÒ³5ÿi6i¶¿é7ÿýúïÿþôþuú_á› ƒ 0a˜l$šlBM4Ø ›“A±O°¶0Åi±LPM;]¬Rv¬zr/tØr.=† eí†{m>E=~î›]¿Òm+>¬&Þ�6´½{o»íöÌöÛ[Û4_~Ù:Ð DBÄ Å �|¬‘g(‚±ÊÉ åc+<Tì&™+0‡ ´Öòè$› 4ì0‚i°“A§´šlSƒ S#Špž{i1H9ÚÚLPc†`¤ íÕŠºd["¸i«`œŠ8{i¶^ôÕ†aœí&Ðl4®°Ž?a„´W%B)Žå¼ÜB5¢„A‚&V‰ùâk0Â$H¬a‚…Ni‘j$ò(JI‘”¸ˆÿi¥Ó¤ð› ®‰Å-Þ’mßKI°ð�gI°¬±¢Ðæ“i:M¤é„E†�mt›T¹ù&O%çÊ64nšõ ”òi£[F½¨Lž £Xh×8gÌp!&zÊ0�‘™�œ EÙ"ƒÍŒƒÌ �ÐNÿ¥ŸZŽ—OO^I>ú·¾®»¥ ½&÷z´­i/p”&…´µ f=-páÒt›I¢;hŽØF†�m'“N- ØA>è&á„Úa4Ó ¤ÚA¼&iM¨ý÷^¶G%¾·×­Åwm*ÿ®Ìi¶“¾¿ûªâ¶¢õ¿þÿ¥j>¢•¥ª ÐQ Òn�Ñ/h�éZNúNÁ(PÚŸ5qCÿ_ëoKÿ®Yp{ëÿè±Èè!Àß^øûïýÇ[»¿ÓwM;CZ_ÐúNûµý»úý´¹n }�‡¯úëéõþ¿ÿ¿ÿŒ9eÿÿþ‰Ôá¢Ü”ÿÿ¯n­¯ë¿îÖ¿î‡üh7„Pÿð_ÛZÿÿ}ÿÿöÃÿõÿ¦°ñÿÿößÿýuÿñëßåŽG0ëø»†ðIÿÂ4åC_ÿöÿÿÿ ì?ÿÿöý‡ÿÿîßÿÿ¥ÿÿëÿ¤,>×þAé¶½ÿ®¿ÿøo ÿù>ÿøoÃÿÿ°ÿÿÿýÿõÿý‡þ¶÷×ûÒûýÖÿïÑÝÿÿþÃÿøKÿÁ¿ ÿÿþÿÿÿÿÿ'dwÿøo¿þú_¾¾ûÿ¿uëÿÛØÿKÿ·ðÿÿþ¡ÿÿÿÿÿÒÿÿ ÿòtÞIþ«ÿ_}n—÷êß[ÿ¾ÿþ—ÿ¿½ßÿþÿÿïõÿÐ]ÿö×êÿúûk®þ÷ë¾ÚO¯¥ÿ¶uNÙ_ÿÿûgTþÿÿÿ¿×ÿïÿ¿éÿ¿~õºº»Nûïí^�&þÖÒ¾¶ë¿òtµßÿúÿ÷ÞoÛÿÛ£‹õÛ«þýºÿ×oÿméŠÜ5 4­)Ã0J¬C†Ã¶:vêÈõí휖ô·_0¬Âö[Võ×÷ýí™ýý½³4ßÿî·ß[«~­û¯ÿÿÿ�WO „(0Èè"‡ †‚i¦“°Èà*h&^›&+6D„šv–Ú&ǦÅ7L‡HÒMSÓäQÃÓËɰÂV’m®•­ÿÚ]v—i7·Ý÷Zÿ«~¾Ýòܱ�´w«Ä Ó +U°Â ‚sC�¨ ˆWMÔ0VGÒ H“vši„á4i±I±V—!v“Æšjš¦JÒd])&Ý6\[#„ 3s—•ÒþÖE åÿ°ÏzG)göv²„A‹yYWEqG£†g¶�m„® Å4ÁS •ÓM4í6ÐLT+ &&GG)ŠL0ÒM4ÂiÓLPTí4Ø««äر-gf+AˆA„0‹’+˜bhCB *Øb‘í“è¬sÆxl&ƒ +¸L0L‹5Ë1R-3@ßÿúôÂ68xBˆÿù’š#3Y‘Ø´v•Pð¤((P¥”˲X½|ËX·Õ2UDb9æg„Ó»îöƒÐ°¡3·ŽÍbºÉ“�-þIJþõ•ÀšÜ'K×}-R´µwK]à�&Ú´°•²è\é6 ›D[²Ûªÿø·ëïaþ?ý7ôߪõÿÈÏá�õ¿¥î‡× m~ÛŒ_n–þßOëºM¤ézú�÷þ=¿¤×Ü_÷aÿÚ¤Ãý×õÿÛÿ´‡Øíÿ·òä/ôCŒ«ï¥Ý[õúþ½uëë{i´›ÒíK„ýEÓWß�Ùÿá¿÷Gw°ÿ_ÿÿÿÿßøkëþ¿ÿËH¿ÿåÖûÓxþ»íøøü?üxqÿZýÿðßýú@ßæ“ÿÿÿÿÿþkÿÿïÿ¯ÿ·ì6þ¾¿ýu¯ì?_á¢Æ}yiî½/ÿ÷º^ÿ¤ÿÿÿÿÿÿ‡gÿÿÿÿÿÿêÃoÿýÿ]p»÷Õ‡ÿÿýkÿÿm ÿ ¿÷ÿÿëÿ¿  ¿ÿÿÿÿÿÿ ƒÿä»#¾ÿÿaúá¿ÿ ÿÿÿKþéÿ¦*)ÿ_þÒöëýëðá/ÛÿÿûÿúðpßÿúOÿÿ ¼£†ÿòÃÿÿõ´¶Ô„ÿmw'ÿÕÿõûoÿ_ßÿKû­oûÿ]Ûýýõý÷„ŸKÃÿôá¿ÿÿé§×f}½5ÿÿþÝ{×¶õÿMùå¯ïÿ¯ÿöÿÿÛ¿ÿu¥ýÿ¾—¥ïÖ¸K{ÿÿë„wKm$®½´¶º¿Öÿuö×Û´¯õlÑ}úý×í×Mþßi×�|¾ûi~º¯¿é_®—¿·ë¿ý÷ýÅ<4“b’m šm¤×iH¸ùÑAµÛI²öÚIözuþÒ´—Òû0·KÏÖë¤ÙšþÛzÿ]¾ºÿÛ¯ï¿o}uUÎõҜݿÿþdg4Ñ8Ñí† ¬¼6‚éƒ 0“ °�¤ÓM´BM´i†(6‚L&ž‚ …ö�Ô0ÃcVÒMm‘9¥i6WlöÃ=Zÿ¥¶ê×m-]}tÛ÷«õ»ÿ÷[_ÿÛÛþ[‹Â",PˆbÊÝ +¼öU•Œ2u� 1Õ£Û („·Á¤ÐM6HtÖÕ¶’iì&ÐV“ ¬SI;]$Ø«Vé7¯m+‘ °ŠÚjÚM§o‚}×m¥Ý¶“gåöÌÖÙŸ¯-Ä̲pŠ¢ ˆˆ†!JÌ®+¬ Ä"&0Áᆃ ´kz +Úa¥i&aA¶‚ ÂâÈí�ØIŽG +EÂVÓÒM[AHºúa„­=†a‚^Ùz�fAy6 +3Z˲3:ÀÄ dæW0Ä#^O1  „`¨2v +x†)‘ÀL'aWlA&›i0¶¬bM4ؤؤÐq +>#“tŒD0b" B$Ü®r¹¢±ƒ Ø`‘VѮ׬´!†�\Dz_®cïˆAËhIGÿɰœv Ñ)DÔG‰6£&ãÇi.��„kjÖv·*@ãµÞ¹ÙÒt›Ç¼#D(P¡vdËs§ÛKô¨? œ¬ödˆ,·$ò¥Ž“^;ºŠOÝõíWñÒßÒù‘(ÊttFÌèŽ3Q)ÔŽŒOZ«\›*Y)²¯ÎÑùI•¯ Up�láÉ΃ +ÖD\‘ 3[ä h„ äO*Ë™ +²\H24FŠÂuR# •Dô$Tk“4K¯õ××U2‘¼”ãÒwtEv„4˜hrcÒa¥¯¤®©¦¡¦˜L#`høÂ„Â5†i${aÃh 2F`a’¤m™ˆHÆc(ˆh)8„ gafH ¹ÈêÂ’mW$Òú몯ßÐ Ú%í&Ñ'¸¥ijÛ,WÛ,ãI°ˆ° á¤ÚN�˜$›C :M¤H6©¥¦FƸS'0f‘œØÑ®¡„x #Xr!ðB'4"VBtØÁ‘(BtÀÈbYNœh‰B1„I‘ˆ6…̽ ¡�ÞEÑ.ˆÌ“E"U^£»M´Ú·Mik¥ÒÝ„— §JÕÐA´›Dc÷JÒÒl&}¥„0‚m'áPÒm'I°“i<˜ü#E[Òa¯„ѱ£ãôѲi&��ŒíB45F°dðLöaœ!<‡e>gt™g4D2;#D$ȳ!‘0„Fr-;÷wzÜu#…®¼´>Óÿbí­Â´�+}.N×kþ‰E+WK_wm-–]6ËZ&l › -žaÃCIÒvZl´C@Ͱ��“‚vÕS&Òm£cÂ4sò5óðF°Ñ�öÿ«oúãè?ôÓ©-´èo©*Š·N»Šj“þãøýj?¥é6ï·Ú¾–º% 'IÝ-ÖÑô˜m¤ô*ð¦xÒm&Òm'e�6Ë='e¢“i?‡û{uúCþ�7û�úÈæܱȧÃà’­úô?÷iHánºï§¯IÿÓ1­_Mé´+¥ÿ¤Ü!k×|X?tšJÒñ¤¿Hu :OØÿÿÖ¸¿ÿý ñØ4‡Vý~]KÿÃ'0Çÿ[ÿB5ÿCzëë×}Þ¾Ûv´…Hák¿þþ�/†ÿÿÿÿð¿ì?öÿÿÿÿÒ°ÿÿËH›þ[”9h®>?¶ýcö~ëãß^÷º�|ÿÿÿÈýÿ‚3ÿÃì?ÿÿÿý†[ý}ÿÿýD_ëÿø0ÿéáô�ýÿþÿ»ë߯/ü7þ ÿÿÿÿá° ¬?×ÿÿÿÿ]ÿ]†ÿÕ‡þÃý{ÿ]þýµúÿ°ÿáïÿÿÿûÂ4B4C‚3ÿÿÿÿðF‚ÿþãößõÕ‡¯°ÿûþº½{w¯×úÿïþþõÿÿÿº Kýÿÿþÿú ôUÿÿ/ÛÿÁ<7‚0ÿ ÷„Pþd§ÿ×V¿¿_½j—ûgTý^íݯßÛþ륿á/×þïÿý/ ÿþ“á·ÿÐ,>/ÂOýµ×W¯nýoÿ×þý[ÈÒöú÷ÿÿÛtµßõ÷ÿþ¿oð—¥÷ÿ¯¿ÿa,7¥øÒý¥wutÚVÙ�³ÓpïÒm%ïý³5ÕÕ™ýí“«m~ý»ïû:~¾sÿ¯ºÿÝûÿKúÿKÜ„ßöÿ}´¾Ý0~VM¤œSÇ †È¢É´®äWÚ°Âë¤ÚKtØI³û×·ž{gö×ûs?«]û]×ý»¯ÛßUõÛ_õ\Ó}/öÒÍIõüâÒüŠE¨¬C¦I°ƒ ‘ÀTð’m špTši±PêÂLRIŠb›I4Ù?¶Vöq5a„­,#.¯õî»öÌ÷]{3ûõ»÷¯ÿúºý¿Uïÿýµ^"3 Ä#!- Ä$|eB�m3ÙT ‘F„ ÂØ0‚`ƒ °�M6ÚlBdAìŽ!4ñ äp4™)È®"ÔÒNDÎà 6“eïl$¬5‘]—Y�aÃNÒ^û ݤzÿÛlϽºõûý½ˆÚE{„AÄD12±ƒ‹¢±†amB•ŽVC ‘@•0¶EÐM8.ƒaalBm“MŠA†DÔ6*!=†ÒAª§ ÁH¸þÒ]6¹†‘GJËò(áÙ{´¬½¶z°Žïü0‚ÄDEÄDr¹¤"2²" b¯ ${£áèbHÎÑXÃ<6MBi ›`Š,;M¦˜VGÒáÂM4Ã…ðÒb¡;“ºb±LUÿlzË5YˆbÅÅaYA„LPa4ÓAÛ"¡ à +œ/Ç\µMQ7ÿXÓ].š 1óÃF†�ÄDQí„è!•Î"?ò¸JP‚„¦K �duH#ÛG¶Z¥$ÚIÒlȈÊ#±¸’çzý°’Ú·…3‚™ÄR_")ÙmIé&Ò·}ôûÖ—Ú]«ÿÿ¿õu_·ëª}ÝÿioY.�™ó!ŠCÍ‘ e:8db'Nd1’  Î§‘;GßýZ¸P˜MTÂ>4ÂeA„l ¬EÛøn=ƒk ¢.ÿùUþ‘±¯Ú ãG¶“ a«ª<š¤ÚMÂa¤éIµL´ˆO›"FlŠxÌC¡GœaN¤Fã©ç�¬�,“_úÿGwÿL;IÐ&Ò|]C¤ØIÂÚºé0Ô4� ¨Lž £cÐF°ðƒ�“4†¬0�“LÓ00A�aŸfqR B*&lвÎPˆ�RAȧ"ž5–Cj@û~!¿þ�m¦ìvöÝuãŠOºM„D†ÚL4´›Â491ÒA´i0ÒÕS 21–î ,ÎFÆTH×Ó(Â5‘rÎ ñ„n„k 0�„k ÓFÉ£1æÉ€Á�²úWþ×ÓnþÛ�:Š— v¶â—'7D¢“i8IíÜRl$é6“…3†“IaäêL0©<Æ&¤vö˜Ii6©¤Úi¥ÂmBxFà„íÖÿûë÷z[­Íïðí‡mØ^½VÞ•«í¥ôõïék¾¯ µZ‚¿Òt›ÏšM©ö“…l Î-Bmpìˆþÿÿßvþª0pöú÷§hUºÔkÕºµÝ§WKýÝ+ñ÷I÷ß]}µöÒzºw½ÿÎ ÿûýúa°×Çï½,t¿­UºÝÿ¯×}Þëþ¿J´=¸·ýU¯I½â¿ÿÿþÃßÿm¿ý÷ÿÿVÿ_ÿëÖø~ÿûzýizñï®×¦ÿëÿüÿðl7úÿûkÿéÿëëõì?ÿý/–žòÓúÑiÿ·úöéÔÿo__ ƒ‚ÿÿÿÿ¿þÚKÿþÃÿ¯ï­/ýúþ¿­ÿëáÿþÝßÂ4ÿ?ÿÿÿÐ#ÿÿoö×÷¯ïÿÿÿé7Oõû~“þýîö–—ÿô“ÿýÿþÚH'ÿÿÿm/õÿÿÿÿúZôþ¿^oúî›lé¹}ÿKëýRÿúõÿØ —ÿ߇ý´íÕ÷ÿÿÿý&é´›K÷K¦ëKt»ëÛ­}zÛÒïöÕþßù€—÷ÿ¿ðÿ±ÿÿ¿þÿÓi7õûkik¯jÙšlþÚ¶“®g×úýkÿöÝ?øK_ëÑ“þýë¿ûÿþm&ÐM¤�«ii]Z 6醰—]6–ž½uº®ßïMëkú¯}ûkœ_ëûß}~ÿþ—ÐM„a Ã":Mm´‘ÐJÒÒL6AŠb¡¥ &ÐA÷éZ[ui·ûi[tßû!Ë×Ýw®ÿÿé½½[ûÛý¿á!â"":Aƒ&1ÊU°Ä ÁÈèG¨„�z†ÃÒÒM´¤AÃa›—l½i6{t›MU`ì mðï´»¯ä1ÿw»?]_¶­™¯Þ¾B4#–n¦øJÂI¶a4Å Âq6�b›I�4ÐmÈáE†4Ãi.’v›iÿ &ØKI³—·v½ÙŽÒú ÄrçDrGÆ‚a0‰5¶ƒAŠd¬+¾ÚvG ’´›h$Ø0�iªvšiÐdWLB°�b‚i±†)5Š ¤šÐ/Æ‹p4PÎÅLCÊsÓ=Ñ\SŸaQ˜)íÎí‘ÀL$í„ÚIÜzð®""“’ÜG2f´?õÕë÷úK¯ ÿÖ•{¶–‚^" m ^�‚aˆ ÅW_e… ƒˆˆÊÇÿÿÿÿÿÿÿÿÿÿÿÿ2 @Ïþ@Ø °jMÆÀ” ’Ì5h2KZ &ƒ$¦FÀÔ¤…�á¥ÿËp4wÉl�l¤ˆ¹3ª"Dv2Œ¯¢™*†5Ðè‹°S\b;"U˜�¢ùOl‚¥-ƒ’Ésö¦{üU1 +)B*&*‚‚qöF³h¢/„\�íÖyè&K?MnÖnÚJ_|Œ–Ò è3UTi7ìZתVºôª·Â[ô©6•ªM‹Òlzh~´±úK¯Ò´Ÿ§þfÍ �Ó(dwåÑç‘:*¹ä–OÐGw¥B—I}Ðõõ¹*„!ªA. Afùš ô�hg™ær<Í™A—k¤x’¯S6‘‹ÒýJ—¤× '¬$ØF·J¨¡ê�‹�„N]SU@–´‘íéUá1¥©äfdyu^µëàŽúÁøKõ×ÑPÂ8ãÂ8ô�']'ãÕB„PðŽô«è$Þ‚W¤i%J³]WõKñ×–´’ÒP´¢—J•¥Ò8ôwªëªV�^Ô% ¾’]/ÿP—T«^•t’Zƨi$’é,iF(}%§­ð�?ÚZTº¿ªÒK_¥K¯T«×UUûúªJ½$­QVû¤´’—”ºêÕº¥ úÛUÕ/P‚ú]jº×T½U}/¤­_].©%ÒÛßÐHøúÓ¥Õj”AR]U*¥¥KZýkª¥‹~µ¯ý.¬0ÕRÝ*X…^µË¥ªõ¯Ò­%J•iV¯Q_¢’×B£UO×.§pJ¦×ýu×õýW­|WÖ­jB#¿K¥Ò¾•QÈý.ÃÈò—Ò³êÕ%¢=‘ï§‘üÂKKãÒ¯Ò­/ï¡­i-R¥Iê’ÕÅa-(…égºõ¥¦Îx$…awÔ%‘ýh�`Žáåÿò릵U Gô©R]PVˆ‡ +!D*„›a[²úUw„¢¡D/AD+ªBZTé$¦õ÷ª¬%åÒEþ—KÄ*‡TÕ4ˆLB¦!mlT.’m*¯jªéÒ‡Ò¾‚=ý¥púT�J‘:¨Š ïD Âa0MB¬1 ªª¦©®ÐU¤´ÚZi± *±P’_ð�l®,ÃÈmˆÔ"ø±X@‹Ák¯A$¨}LË+„ÒçiP …RîW’M!AuÞé†A£5µ=VëA–Љ+ &1´ Ä!`ÆWCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿù5°dÈÁtÐ\�ÜkÈÃvi¬€Àddª@XØ\€ànk“q° _ùÃPÜ@endstream +endobj +327 0 obj +<< /Filter /FlateDecode /Length 6033 >> +stream +H‰ŒW]�Ûº}÷¯îK¼@¬ˆßRö©mP` \ Å5ú’- +EÖ®y¯,9’¼iò�ßÞ!E)Ú›[ØØ–8äœ9sæðˆð*W¢ª*.²þqšS^…ƒGÜ|¦ÖéáHŽóø�âo0Ï{=_WãH…òÆ%ëmÃrér‡‰@ +iôª�æ´š@5BÍp:�í´»*©ñ�2.éäEÏ•«â³Æ¥KÀ¡TX#ûÓ¶nŽº}i(pÌË%„¯{áå˜Í.íµÄ˜yÅr0Ìé%:™§Bùzr:ú´Ý h¹íôIÏõ"åQ_&� +` ì~@>‚¶á”Öái)ÀøŠÆé/—PÐEü€ýT¬)ÔÕukDÞ£PjUìefTÙCšV´Q…|�6”xá>êçãîÉ pèÕ…õ`|=Ó›.Ñç@ŽŠ­Èñðð^�‡ÇÇ—{0�%�ná�«Á�NsrP^êSF‹å,‰\çLŒG]† +ºTš" c¥¾Òp"xØèTÏá”qsÕÝ2MQ]M]Žçqø\Ãt@U)% Ýt%x�b!~RU¶îàÒ甆à¥Ôÿ¥Çz<|­MvRØ��J9©|²çv\6³ù*¤•Ž=]úÆôÇ”dWõ–«„É'ƒÚÕ±jà ⻔r�]¢ì�ª„6¥\œóPv(+YÀµOà3îÄøŽßÀ·ý‰ñ¨àr#*±^ C¹{F=O“i_!é\F3r ´c„o¡KkðÉV³Þ¦ü±Ã¾í .ŠT™ËråöÆöpi\°u‡C…�ôÎÞßwýáŠqªðžÎmƒ~{¡j!Ñ‚ h¼m_ÉA�}"ÖHYý'ôh,›PÑ]î× Á<¾`R¿@‡Ž•†«•³î¿· {°Ø„’ê3cþ’‹¼8쿤ºOrFò�õ¼Òå‚úǵ¼øfPACɘ+At0yŠçÇ䘂ZÙ6pr˜åð´·Ô`¹8bèí=\¦+¯}5Å…ÌMV›[/ÐÖ¹ +—Q…CMƒ�JéO¡=p|.À:^NC€`GŒ„¨Xø¿cÚà°Û~øI;NëÇ�Nõüf(Îé<Œ Dó ŸŒv__ÛI4+C¢˜} êùCÏíç<Y O«7Ý¿ˆ‚¶¦F�³Ï>ÂàX§÷ËXL?£÷àg«£ UpÓ Ç8¥¡ž¿í£~i�29ÀûâÕ½ 6ÖÃ5E%^ .ÍñÊã‚JÈËŸêfÆ)í5P´àbÒJC- +_‹®nþÀ简S•Œîõjâ4ƒÒ‚åN ±™ðö¡éš—¶ÎÞ—[¹¨¨ C‹rÞÚ TA$ÔOÛ3ï·�w«6]Qáo «eM�Úxm2&A”+Wsôòô¤Ýö©¹‰B}œ¾Ms{J +<ÀÜ>×ýá«>ÌÇ·1g õ]¶Ü(£Ì1FåÛùÕ«V%H6hü]²Þ^^i³ÀhÃÕHRãÍ ib�.-`xþ¼ÔÁßp%õi¸DZ€æ�¡Üâ`!§ái^ÌŸb¨û‹…ò~Òx +¯DTÈOÛ‡ÙøkVYÁZ{’øˆÍe¡ÖW>˜ç„óa}jÚô¬›4ÃÝ�!‚K +_ÁCû'Y¤'Eå_èÇc<©³Î•?üü 6÷feå� +µR‚ËÔ:ð’†7@¼"¬ðQXs›²· åËh\;µmýYwzþ–9Á*a4o¶š±½×sóö†aŠu:P€x¹ÎçajÓyeבÜõ­WKðÿ¯–ݸ‘+ºÏW³ÒnšE_²0FÄHlcc6  Ø”ÄL7Ù!)ÉÊÂßžSdÕ­[U”œ m¨ÉzÜ{îyH¢¨�®yvª�Áñê +�Õ®´�±+ö„Ü­LÃÃØ„-©uÌ&½>°]¸aùÛð´Ól¤ϱ´íc;¾ Ž/Ë„I¿jL%@(Só° j�>lå‹§‡Q•SÓ�D°q¯ºï,ß�1K*•ÉœµB RÞåB&§�¹)QSûŠŸ £š_o¸ÛBrK¸Ïmg»¯�$•�µn�t’†/-ÉÊ= Ú¨¿P^|Ÿ•\Úé]0:9FÃQ„úa¾,Sk3Có_o¤‰JÒô¨ÁSÆLÄÉù{»ù³Bm­—Û[šRî¼L€Ú´’Š »3/íw[ÍŠ”rÃý:º-öcÿîÅpoçÚàÞì% +‹•ÀŠ­B¿½œ�5ù8¸²_¯"J` ³é\؈9bUbÀ œVêêZ¿èÜ~Ï÷½6ŽS-Õà—°ŒÌ2‘ߎâþ\Ε%k°?êp†¹ú‘謎³,t"�—pZ*yPÖ(-‘#Rm�Ö^û>ªBb„�òÞÕiö�/�¨!²>!6Ë™}ƒ* )íëYï ÿjª~;G®W‰�ç5pÕƒÒwijû¯ �ò^Ž�ò-ð&Y¦Ù¯¦0)]ë ‰)‚õ­b©]’ÇË�šÑB…4 ¹l—’Œì»; ñ¿šìv‹q&B²! ;7ã0M4 (�=Ç;Ð}YÉ3‰W™å›¶oÚ½gUh÷S•¦ï§`Ï”ÒâN¯°yZù­UKCܲý Jö͵‚ãk÷ÌD£µ”‚:ÓT¡ {â¶vG,*RG5ü‰/¸¿³Çh†£©©P²Âžë7<~•ˆ‹y—°#¬Ë)T=�§Òh92çgöá†Û�UuèÞŠ¸ØÓ¹wå±Ù‹lßK‡·]Cî)B<$±zÙ>Õ'ë…2 Ù‹îtÑiÿøì¤&$Ä'[k"³0-ƒ�™yË$§ÊÎ�~ÝVõØ}Ó£¯Ï»ùÐJ¸×v¸BF ™›úaß œª²Ê4òSßêÂé€$]È¥‘ô´å"1¼k ï+ׇÓB®p¶/#E¹Ï…�Sª7X>7tÉc¬o�þÐ6`ßMþñ³¯b8ÅTïé¾kîýžƒ023[2Oç†ï,)8âX÷õí#eÞ<ÊÑ,ÖózÃ\›¢œêqi�Tײͽ°ùËäQï"Ðq륾ª2¡e�^ÕÇBÀ¤yo†~ËX«�ç(ï¾À”˜sŸÚÃ_7;- Ž¥#l@5 ±IfºuóÜ?EÈŠ4¾™4Ÿ™7Ct¥ÃGm䣈K÷Ó}ëSO‘»ÔÀbJ^xǶLí¡mæÉ/³BH;2éRMnÁ±¸Ö€jòÂ7­¾hÝ„VNæÇ±=êgÊr¬ÿÖKo)NIv’ÕÖ[#‹±ÉÔö{?±.º!œÜ8ÖìM}b_Š—äÍ äÆQ­×¤N.¬£hƒ9cô_»»­ß-Æ_ã³ +ÿÊ““bN‹¬‹§Yzöõø—óÒG"•ù(Çÿdé±o¡óÄyMJ3'uï×'QÿwØÃJ¸WI,²òüò�€N|ÏÎIE¦P[⸸jUA8Õq}hLP½j© ÿŒ4Æ•ö_�õ&À/)LÑ(Y¤OÝ|O&9;ãO¯ ›\cîõæ×[1Úê%+s½r¹^š¡ùÑ©Í�MÕõÄÛ˜ šW’´�Q.cé}ÓÔ§ú¦;tósô²güˆORøÔ|›wwmߎΠm\fåù*6ÄxDìÀ¬]`¦¬ÌL�fEÀŸ Q ª¼ö«˜{# H4Z«Ë&ºÔ�5¼ŽoC#�i²)Ô<û³=íè éì‘îfm¼4 ¸2¾a”³ÄƒMª¯öÝÀÈð3%úz8Ìÿ#ý펠A•ÓR›îÅ[�ßEš†®Ïá€L$~¥�œè3¹ ê›CH{•±Æ× eî² +dß´Ý#³}ºà2J *Aß +ÑÏóX÷Ó±óM)"¡8Ç–PbÉKàÀ‘&½Ú’”ÉGe±mæ†G-+º÷¾žk~ŠâÉq =NJæ¢oç§aüsr”Ãÿr÷×`e†u€ Ÿ1¡È_ªÈx�ͽÝ ÇáÑWn†ŒÒ˽ƒ'k—ÚÛÛ®éÚ¾yöýg>šJªDÎç2þ¬ÇSÅNuïJb}ùZïõÍáÚò@Ï6•~5µÓF¶²³öë0¾pýoõq§C°‹-vO‡ö5³¸Ø¼qè»Æ?L yT¦†ŸI¨<·Ak•/¯'6°éžl¥;ÆQØ3øæ +F©,”¹’)†/ËÄÂZÞ~^�†ï«*\t±àÎëzÉTù¼¹¯û»–q:÷›_†£ƒÞÍør±|i‘™¥‡Ì@ï³­æä 0^A³ÜolÿóÐ�-?{[öƒ[öS“Ðk̀ȞɪJ·uÓñ³ˆ„‰NzŒE0÷`°Ã;ë`ò„sÄfç-{Úº¹Ø½ÖåØIy~ê½ÏtidÉa#Å© vëÏ�9)®Bïu5²,?±ÖþòE$sòƒ¿2)âv޾\&¨µÌzò¹‚¸" æâ»—/›Wlpeª²Ë£¬ä͹ª›{‡ÿßJÛ¼ +E*ý’k�)ÑE}šcÁ®#kiw‰Ì�º©»›vo©T´Œdl€ßõA{ÓÔ²�µZL§$L>wÑ�Y +Bë™ÒÄ,q_ûôÆ#ž»]tÀ>0O-q(׎݄¾Lo8•ªL÷²)ÉŶ¦NIÓOb‡·_Å¿ÄíÖla¬a±¤[‘)¹…­-`”‹�+UŠ˜v/+sKÓ—÷Ÿ.•¥ˆ‹óË«ß?üreGžu©i”ç‹cSÉQ�ç—ÏŸ¾þöùÞšñòŠªÐ¥zåã?»úòåÃçOf½Þ+¾Üå{Û[¨-�WÄÜS¨ÞþýÃåÕçË_þ¾¼Yþ�ôjÙi‚w¾¢?@{�8æVµ>P‰‚ÒΨBÐK"åúíÌú��—(’5öx=»³ëÂøØ8Sâå³>^{¿ˆv·EQAz +!7Àå;Ðá†ÀD¼åËÛþ0äåluU[ ‰rÄÿn$™¯b¾MH³’P¾WËïÄÌ4ÉÙa¹Øa°9ýÊ8õˆS´}X%6êô¥ÝüíôAAlnäóIãƒÖw°_¸%o„ТºTFw24:JŒðGJÁúV¼OYŸr¡O�ÜaŽ2[ó]�¸ñ`ÎV6³/äM-È×õúôóT¥ Úât“‡î0yp§·Dç»çÈ)˜„‹\`�¦‚°ON ¬}ºß‹ÔT™= Êì; m@u¨…Kü³1);´QÞhs¼ñ£Îèðû¨ÍHÕƒZYéõYÃ×õç6ß®£G÷"b6 ž¦q?“×@ˆå7(N¤k ’b«.‘á~‰N¶°`Oñߺ¤kòù(·ê’OVW‘6«Œ~ÿ¶uÃendstream +endobj +328 0 obj +<< /BaseFont /Times-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +329 0 obj +<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +330 0 obj +<< /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +331 0 obj +<< /BaseFont /Times-Italic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +332 0 obj +<< /BaseFont /Times-BoldItalic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +333 0 obj +<< /BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +334 0 obj +<< /BaseFont /Courier-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +335 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 44 /Subtype /Image /Width 156 /Length 1618 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ ,œÿÄF!1AQaq"�2B‘Á¡±áR¢²#ÿÚ?ô×;ë+�qÞókxw¤_|*’’«î ó>¬dˆ£©6/Æ(ªQ²r¡®`±"a¿zÊ»ƒµŒ0NOK† Í0ËäyøÔÝ6XœÙJ�Â}D‘h ×Bº„©•Q#¯TÎpVd<€DܼÒ"íº±XÙi˜’ +õíCâ¦Ýz“^ÐðªƒÆÊ&qñíLlKg!bçéáçLÏaFÉÊ}X“Äó{ñK†Ì˜xGê…)bÍ:Ã�¹+­ç"—¯�]Ù\<9L�P™ÿ•WZ8Úå™ÈµˆôñÒ¤ÈÙ–ò Ä7oLŸ¢®Ã´1fèƒ7â—ipím…€%0Ž"jeœzϸ ÌÀ’LAç˜õWP߬‘�@!£ÒA¿V‚XœŠ'r ,ÇÜàÁ°ñíE_[úÇA÷úÒ� ¨RÍ +A<…Ô‹äÄ• x€kRû ‚ëÈâ„ÇC#§…7°ìØB �OãQ? Üú§.$‚dŽ8§m*ÊU‰ ÷‹Áâ‰×(P±¿åiþÑH~2”(] ¨^‚ÃŽ™t…+…K…Ú—ø«%³i&zXÌ�Ç¥Ðb®ËrIµËO õ5½… TÞà,Þçñïzg*†òn±$T›áë%Hf\>Ð"Ö+ÛÆ˜|e1v$qöøöQަߤbþ•’&,eH°ª�Œ3!m�½5›P!‘‡^Ðh Arƒ&1�aÐZ)v³¨gax6›óR;·EŽlªL(‰´¯Ü?­gØv ÈWR†;¯ù®�Œùj@Í“â T6ϳ°#ˆf$7bLv¦Ù»bWÕ +Ä­„Db>´Ùí ªv´�OÝ3ÄyŠ#c™*K¨ƒÄ=/JvlW`\ Vq+çÖ©¥óX-“@&ÑÒ¡·hÖŒë°6ÄCÌKjÈîÛMÆ7Áž¥Üκ÷dÒXÿ­ˆµÅéa÷5’L+Õ#mçMîì…%áXZ8 úÕ7>Å×+÷GHçëSܰ9$€™fýiõël²& ·8¤M¬ÄäÄH’~•&Øì5„­Ô•îLÈ>UÛ’™-Ï…*ìFñÏ$\¶4s×YcŽE0*x ùTýô˜"âôÈBÁ@7ën;óTÍ?Ø_‹ö v뺋Ç#š!”’ ‚G#Αvë;*³t†˜ÿ­6zú0?QYv) +f2€y½s\NKäQ, Á Ò†JD‚ï4Ä(˜Và›sG4K7ïÅlÐðÂü^‘¶êRCº®<É<èûº�ƒ¬Ìr9íA5` c7‚s~ô£ã�¨jh!D¦öÜäIÜ↭M­J–ÊÀO�—ØÙ*ÁÀÄ‚@ )XçÆiŸ^ÇB¬VOX·èf‡ñ×"`AÓÐ$‘ç7¡ürB®$’äã�êƒY–˜õ(ð©�Žá‹’¤�‹HôÏROz Ô… (°ý*Zþ;kA®AP2$ú@Q¥oã¹ÆJ‚§ñ‘aõ½;ëØY™ +Œ£‘ýâ‚êÚ¡ ©&1™ä+-íkÖ �enÝ–�Ó°ŸÅDD ´™4>::‘©”ã¡Tˆ b=>B˜i#c1ăyëJ~1$7¤ž¤‚oáq_ÿÙendstream +endobj +336 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 64 /Subtype /Image /Width 76 /Length 932 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ @LÿÄE!1AQq‘"�2a¡R#ð±ÑBÿÚ?ôï)¸“ +Go”�~•-•–evÀMîLSó4nØÛM”ȹ˜Ò´Æþ@uL{ëYH¤‰Û‰&vý$Ôää¶ÖÄdU,Ct‹}k\™J0P¥¤I‹{Mª“ã_’�çíMIÓ´÷ª\¬àFÓå6 ú®^wò'ˆ£�#&,¬†>!±ã9.»¦-]žq ›E67@5=)ø±ÌÅýOáþ(Q[r‚ ΦókÒlØîa'ÔÓðã‚#[››Ó8Ô�bà@>šTŒà†&fOå{S8�™ˆ1$VY¸NAS›ò»¶’L�ÊQ†½CWES¢Š(¢Šç\£!7Ä™"Ö ï�wu’ ê=íHeË= D–¤Ú†ÎÃiÕLiÔÞbHí@˾XfR`‰�ýAÊÉ + ` ¹$ë]4©ÑRŠ ïFÄ?ê4�:”ŽØ7ú{UCmÂf"o4Ÿ&4#{ª“ $ ¤ràÆ œˆªI‚Hžµ Çf‚JˆbÖ;�[ûÖ˜±Œs +¢bv�b×5̘&Œ�%€‘q&Gå[Χ r¨H‹•˜�ÓU°�"æþ�…-™aJˆ,ŽÝê!H#ã>ÆL~uj¬rK·¶…�§ÚŒØÎUÚ _­Œ×'3øÃËåaä9ÄË�L/‡6?*2e8ØÀ,°n¿ÿÙendstream +endobj +337 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 176 /Subtype /Image /Width 72 /Length 1691 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ °HÿÄO!1AQ"aq2�‘ÁB“Tð¡±Ñ’âRbÒ#ãÓÿÚ?ú'Ì#ô¶¾9ÿÊŸÌ!ô¶þ7üé|ÇòKoãΟÌïþ•>7ì£æwÿJŸöQó;ÿ¥O�û(ù�ÿÒ§Æý•§]ÿèOÖ©l¹ñ(Æ}‚º§E*t©ÑE*tR§J�QE*t©ÑE©Ò§JŠ)ÑJ�*(¢Š)ÔÙôg÷c]ÐMŠS�Ñ&�g¼Œú`€“„˜Žª;�ušë$ˆ]!zN'QÕâî­K1œÖPNëQK¬ºp…@aâSÀŽÊ°é$À«©Ÿ±ÃŽ5¬ëRåȉáƒ�ðá\;\F·þÖëb€R5 v$å˜^c¶¨ÛƒaÕ\–¤ z4 +Ì“«‡ª´X¾»…Ôš êVCê` tTÎP;k²tÜ€Æ[ ì铇«Û7TŒ€�Sk U£�O>ØãJå‡!t¿Rña3Þš_)…Σ73’HQ +&çI¶…´É ̦2fN|˜×_,MÕº[ "=ÖÓþ5¢”Ñ5;·íØ»ªÉI‰'†5Bk“qbIS€Ar4äS‘DÖ½¸yq£DæÕ§—wçÙV¼× �œ±’£ õÖ7Õ¸±e¯(qðøY�Ì�­žc£Ã,ƒ€ŒcßpËbM³-ÔcÀɇO÷M[ȸ7êÇR*™þÂÇÕ÷U.[Wa"MXa\-µBHç]ÑE…2iÏuÃ8PXœ& »¦p'I$>32=„úª{�ÿ�@*£P&] èÎMQï]!Mµž$HDz}µbì-êÓŒN™ãÊk=§káƒb¡ˆÔ0’­iÏ#¶§ü}æKÀ +ԲݎâsÊ©ºÞ�±‚‰ ¸@c€ÌÏ¢µ[qqAã"¦úm[bÄ$œ¹™¬6fî$‘«J¯ï´×V÷ pÄÊDNyOq¡÷J„J�'ÞÃNSÎk¿:O„Ñbúî:‚ÊDUd{ßîXF"@$ Kñ£o +׬ƒÔgÔÇò¢õÁ¸ mu©aŒ RDbF‰çà +Úí¤r“`|›Ví°!€ŽÝ#�\=ël2R ô«¨ûÍAµ:¸‚  (•âyÉ5§rÚ‚…%MÌŒD‰>˜kR "2¦hŠTñ¥⊚Û`å‹H9ËÓUTubá…u$å>êguh6�cTÄN3¢;±ªÖM¶è\�ÍŒ‘Å£9MiÖ LçM.+Γ0`öqƸkšn*ó—O²ƒ¹´'¬a3ŽQœ÷Ufk º´ùºµ-¨KC£V šK(ÕA˜'¤wº•`t�`œ¹ÍcÚj˵Á¦é$á æ9Õ�žg–ncxë#†®Þ{"Ö§(ÒI“ŒðÑ�®¼´WgÀ1Ø&?Yvzn=à`鸠q€-Û"=&kx3•r-ªär6ÖDÂ.9à1®‘Ø…Êå¶ö˜‚QLe Wl¡†"…P¢Šå¬Ûc¨ '™-‹k’(ô +ì(\„WÿÙendstream +endobj +338 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 216 /Subtype /Image /Width 120 /Length 4116 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ØxÿÄL!1AQaq�‘"¡±Á2ðÑáBRb’#ñrÿÚ?ú¥)]O8®lÊ_6õ®¼˜W(¾£Co­2c ¦¼éràL¥Y–JÎÓÄHƒƒ§P¥Ak™7ŸŸ +lX†@$É&ý·¬Í„fY†¿i+¨ŽôVH­˜¬ [¸T¿°žç·>«Hå3p|ª“Z DÐMFêL¹“ +3¹€ ’yO\]cnåFÛû˜‰žÚTÛ3û2îqÛ +Z>UÖ¸ŠÛ�õ4®¯�‹é$@‹kk›6Cœ¢‚VKA�¹N6 #p:ɭˉ›8PäB¬µ·<&º +>âMŒwþ_�*=.>¥Zr5£MÁ÷jÄvRôã?PY½Âr6Àý�´Þ4!tá:›UúÆdA´‘{ÄM�E'k€¦=%t·øÍºownÖ*WB ›�N²8RS Ì2{¦!ARöîãÛ»áT² öáøš›�9 k´ÇŸÆŽŸaŸP‚I€ KÄÜž$ÑÔálë´6ÞØ˜´Z›ÛÉo^�•,=+b,Yæo¤A’~´éÓ²•œ� Ã�¸“'ãIýBUrˆ�xGê¥lˆŸsÞk*dûXã4Û„ÄÞ³zƒzÌy“!!X çNh¬Ñ6¢k7‰‰ʉ¤”¶ÀÀ°¹p*”RfEe¸êÔ‚*yp†d76¢ÇKÏ0b?P)×q3¥LÉe ékÛBÂLiüµ®ë2û8sRÙ‚• +¤²©àßÕÙ�>VK©ÝþJR/ÌøR`겺‡ 2¼e¶ä`0ÆG~¦ŽŸ¨Ìí븡OŒ·Æª0>½€ii7h��»uµ3+ä†V€"Ü ï>}j$•λ”L"dÙŽžüKãÊå€f@MÂÇ«h±ã̋Dž.ç~Â~*†Ÿ¨9Ã(ƪDK¼‹@A7ìí®š›‡2/Çò¨®<ù2nr¡vÆÕ–;§]Æ8vU_ÜÒ^'‡•O,˜ËFÓ¸©:ð•"t�ƒHî0y6ÚQQíûfŸ¥Ý‹'¶h�¡‹Qaê‹ð«€Q-r§�E +68ɸW?‰¥ê·çÂøÕ ¶=¢t–‘~î42±¶’U¬Í¯ã÷mÓó¤DŇ#˜2ì&ÄÅ»—SÞO³eÅ„A…“§y©õðe@F¢VE¸q¿gm¸×7ZqåémpÙ}Œ nˆ®áŸ�ºæ#¶¥½:bÀÌ»I×QO Ò“.ÅètáTƒìBŽßhÒÑÞ5áW­¬¢(Š"ˆŠÊ-[¥d +j(¬¬wTÔ×IÕäê2ç’Œ«6÷º�ÆOñ«·V«Œ1 H$Fßånʤz°˜Ã>\`³’ ‹éÛø½[ûXñ€¹­"tŸ*¦\Øð‰vUL’†§Â‘ºœJªåÖí2!¦öç[ïã)¿rí ™z•`ň#vY$rš§VÅÕ’}áà«•O” +îôÉÓ‡Ö¡��csê€Lzn5#_ÝÂMc*œŠ¿´�Û6~QK—¸ Y@0¬§±`17¹˜áãU\X×)mËѤD +Á —b¯¤ØD’~BŸÙpÆÓkðO‘ššR!,­€XAï¼pñ®Œ ‹_[yX +æ…=Q.劓¢dh,vï 1ß]ô¹1&aµÔ0ä@#ãXq!ý£Ë•3'bÞÆÂõ£ !G•+`ÆÎ¢’40$xÓHnTj8rÒ—. y„dEaÉ€?:ßi?ˆ°�(qÿÇ-+§Å‘ƒ²)a¡ ;�3bL€P`‚$L¡§ +@*MÓabIE$ê`qµoõ±DlX™ˆ4ô§*+„'ÔÀ�;§ãJ¹eöü#óªÑ4³C°Q&¹úž¤áÙC0é$­tLŠ&€kA­š&‰¬©äÂŽÁ™A=¾?™¨².LÛH‘sþ¾Ý/R1âÂîQ´ wB�8Iî¤Äˆª€ °$eÎéÔ^+�€^Ÿ§ê‡œ"u¶WÆ^ËW¬T1ê �(¯;­Âª¸Ñd é¡3÷§êS§RÂׇֹƹS ;‹;A&bµÒ½ ¡Äƒ¨jA©·E‰�\–”ÓÔÐ5Lq5«Ñb÷ ú™˜H;„&/ʰôxÄ0Yd¤’N‘©çÇÕs¯H螉V ,͈\OüÙÈŽÁÝ5èÑR~§<‰�Œ6IÚ9íÖ«EVQ4 +žl˃di!A&cn@kM� ʳ¥Èò1OE +äê7{‹vˆ"�:ê8Û�ŒÓâCµX³Q„4óm/[í³É$ÈÒ ÊÕÏý¥| ’\8À0t Yáû¯ã]ñ>&Ü,¦lÑ<"‹kÏ]mY›1¨I"HY döz|ã�)ÄøÁÚæ?È–ýhÂ@Sµ›Kn$žûޥѣf]Ç&OKäC$ÞÛ2IôöM¾UÖÿaî®|8˜©*ì²ÍkîïÄÔú�3§·¦Ö•ÞqßÓQ<뫦÷BÔdØ1{w•_•r®F\ƒÖ ,Á�'lNÔ°�S^…M±’I›DRŒ,,Ú"o§çFLÃäMfnœgX<#±”†ÌS o¸üf iZÜø½Õ‰"âã°Òœ,Â퇔ԦDFC1 I‘úU1ôÇ…073DqrXêy™§8˜â(XÉXÝtÖ4¤(Ù°±#ÀûEé› -¹ox‘øðçM‡¶°Y˜ñ'SåʤzV2w�|#ÏåÓER¾TÄfHx–°ªÁ€"àÖšRÁu1x­š(­¢³p’¸­¢ ìFU� …â,ÄÛŽŸŽ1ê3å‘í‚ÂãÒ\Z䑯j¯“%�@'÷D¯Ì\ŠW’H1ÆG×ñÈé†PªK)]«#MuŸ…S/¸ÆÀƒß>F¸³çl� r¤LÜ)Lƾ¡Ã„ñãÓ�äxTm§Y‰°©ãË—8}Œ †€JÈô’¦@a:sF|ƒ"(`‘¶I‚¢Çp�yçÏÔuÈÆ hI;¤‹î+kxó®äf N¾U4\€»è.c´ßå5�.GÈf "dMÿ�1]5 Ø]ÙMäM ‹yÖYP�Œ  ïÝ¡ëçàÙq;­ˆÜ. …Mñu”7SF†u½hLÈŠ )€$‘§d�Pû‚ ¿.ÇýŸ×PíË ´OÛ'ʺY2+¶cŒÀ®n‹scr°~A{�Ã#‰ái«cÁ‘bvúA ®’5ò¦8²«nB·ÖdÚÿZ²+(Œž&"¥—gXRªyÜñ·/1`e}æuUПäl/_ÿÙendstream +endobj +339 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 24 /Subtype /Image /Width 24 /Length 284 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ÿÄ8!A1Q"q2rÿÚ?êBÅcìq‰_ê¦Óêu:> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ"ÿÄ\q2�1BrÿÚ ?ê_Ò}>?¨´ú|PŸßϳôÄú|,úØ }lkë`�}lkêߟh 7çÚ~} DFüÀ ùŠÔP ê(oQ@7¨  �ê(õ7¨ ÔPÞ¢€oQ@@oQ@7¨  7¨ ÔPÔP ê( j(õµZŠzнEoQ@�ê(+zŠoQ@zнE½EÞ¢€„ÔP ê(A­EÖø Öø[àƒ[à o€ßg|ßg|g|�ðg|�ðg|�ðg|�Í ï€3¾ ï€3¾ ï€3¾ o€5¾ o€5¾ ï€3¾3¾Îø Îø;àƒ;à ï€B ï€1¹ !w4;šcs@3¹ !74šƒš�Í nhw43¾Îø o€5¾æ�ÿÙendstream +endobj +341 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 8 /Subtype /Image /Width 80 /Length 368 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀP"ÿÄbS“ÓQ‘ÑR’¢Ò$ÿÚ ?é?·¤/‘-}vÎ*ÈD…¯®ÙÅY _Ý³Š²E†§ý»>Jú˜×ÉÃo1tÀM|œ6óLºù8Mæ®�³“„Þjég'¼ÕÒ°ÿÙendstream +endobj +342 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 96 /Subtype /Image /Width 72 /Length 1180 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ `HÿÄF!1AQ"aq�‘¡Á2±BRðÑ#3ÿÚ?õ3BñF³(aLÒbÁ�‘Ug�¨kPáF“Mó ˆçLX +‚çyYH ¡}íj¹fxÛnsé§:Vï:È !LßI·­î�™—´,v©Ý::Eé¹òaÅ•NÕȤ‰üÊ…Xñݯ +=ÃuãÔCik†1Ë…Tæv$"ÈI€|¢j‹:›[JÌ`Ms`Ëœ"+ã½ÃB˜$þZÅã�/k¼äÉ»(:¶ ÏñbxÓ£åBWa`õ%΄À�l<*y3<•·ƒBÄ/¹™‹{R`íö˜qWãÀ˜“ñkíb/·™ªç2:F3k“"ÔÆ³Ã•X»¥‚ÐEü.j³zÔh +"…aFµrãîÓâÆä–Ü�…®Eº¶úÓí6Ò@z¯¦¢ßZcÜ(BÌ�F§éG_’AR¤p1ö&�˜/ú®l.Ù3¹k« +IÝ'tÚb, óš8³¤oýÁw�¯9·œT2;"—ê8Ä °'ÏÌè8Uñ8À +‚îd´$n3Bl9W*.Ü=º�AÆ‹¸Ll)"Þ^¼+§¹Ä™JïPˬ ,= éÇ�?ç„¢†•]¼x¹ý=*½¨YF‚ � +mííj¦Wøã¤´ÚÑjæF?Ùwƒ �±¶Âó'OÜ8×ÌnãfKeÄó}Ä)Ç'nÙá]Æ|o‹+’ç@G‘±Õ¯ѧôÖ®ˆqägb͸XL€$·õF·WMz5«q¡F+Eh¤l¨54ÇJCŸ ®”?µˆĨ–Ä^çÚ³w8Ѷ’|`q['u‹äÀ[qðQ©>rfTÜÌð<9Ñ9 ¯Ú‹eUçè ý+ƒ<9†QÕwê‚PÈ üL�¤ùWlŒ1jf<õšžSŒmäX´Fæ&Ö×ýQdØ`­r@0n¦þÆ¥ŒcFÈ 7‰Vü�™šçî² hJ‚U±±¸vv�ø�Â|éòß �™œµ�†Ì£î+¬dF;�ás¥‡: “H$$Éò½WhÜ £­m«¬ +Á@à(Y’/Fµ¶ˆˆ¡´r¢TEbÊ€x  Î«©Óz!�ˆ"úVÜ9Š&ê{÷4ÿ“J3°¸0?—-c_ðÔþ|¡ (³º}ãíVÄìÓ¼~˜3"ýæ¸; •2C’Í�²&#ÃéVÝ»º 2 +»z�ŒÔ×Cc·LH ê¼Dë÷¥Â„€ûxŸÜx _��;Ý€:kê+ Šmb“áLz%”’,IÒO3M‹5Y@#€Ž>•Ìý¢3(ã#pB‘·R˜�`WÿÙendstream +endobj +343 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 24 /Subtype /Image /Width 160 /Length 786 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  ÿÄN!1AQÒ“�‘"2RSaqÑ’cðÁB#CÓ”ÿÚ?úWØZoœÑöÕ›ç5šxõfæÍ9‡ùfæ»ãK¥Gêæ9òqQ¤Åêf9òñѤÅêOÏ—Ž·J‡Ç?>^:4˜|ssåã¬Ò ñMÏ—Ž·IËï›�/f‘–ß/>^:Ý*ÿè›û(ÒrûæçËÇF•ŠôMý”i9}ósåã£IËï—Ÿ/F[êó¥ã£HË}Ntœu)ÿàdsL,–7=¦öºI,öס#žÑØjŸzšÈdóXe·![6S›«š,Ä“C�k¼$”ëÃùS³2Å {Ø`-T'fʽsgsmÉÆ^zÏt{IÝ]P-mG5?ÛÆ^­ âvô»eJ≮ÒF±­Â®pwtØ�ÛUû–¼µÀá•°y¥2H@À’T[af!oQ«8�®s˜{p±Á‚G“…¸¬!¦Ô$HÝñ­fg´öÚ`�r9PŽªv>Pâ"‚ÝÉNÂãÞSÑP•ð¿s²Ò´m +(Ê:—ÒBá Õý=›,©çœ|°À×n (OhžŠÙ2ãÌ� .*ò–»±ORTåŒf#ò°žòÚ£‰¤´ uÆó#C‹KWa¾¸_ãÄÜnv$S„­¤Q¸«Ñ¢¡3šmÍ.l$!³rR:'Dáå‚EÉRgšÝå¡rZƒ8Tu*Ý¿5 v7bl¾ûºvU&y` *. K �äXK›rw‚ÙH��©+œâJ�ölGãjÑ‘­ÄðëJÞE»SÙ] v&‚„.Ã}5+Ý„*î¯ÿÙendstream +endobj +344 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 40 /Subtype /Image /Width 96 /Length 835 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ (`ÿÄG!1AaQÁ"q�‘2#ð¡±ÑBRb3ÿÚ?ô^ÕÝÊdfoº�øÈâºX[ý~UD.s:—1p­e3¦¾¯Èu—íC ul�“‹G&…?Ä(ß¹D¨ì÷å ãöݤuô×C+.lf΂à©7÷®Õ,™Ãò’UÕuþÁ Ú?µ_dXv~D¨›Bí0?y¥nyÖÌT�`©Òt7ý¨ºär‘P5"%¿{o­GúGº>3¹ûxÍçáLAʼnT¹ X1ƒ`�Ò*Ý¡% ,ÔÚш‹î7ë54í°ô:|zSdí�Ÿ’ä+ÐïÔoåA;Lˆ¥FR eb`ã/:Å÷öSߊcI€±"úq‘àhœž\®4¶›~ô£´à=LØê#¯ADáÉhÉ´ +Û‘ÿ2fHõŸ opiޤÜEÚ[ÌTqö_Oê}Æbä–˜ƒ*«´lµVíÝ„s‹ì4£‡ cf<Éjâ±­Zµ ½Z´Q­\ì{„ÆH +Ì…9°’mz'#–€FÄÛc=zT۸ȆüL´ �OˆÞ•^nŽz§Áb=¦}Ÿ�-Z£Ï#ò+-Mâ|zô©œÙef@™þLbË*¦LlàDAE¦?¡¨çÍ›¢‹±Ô…$o¢Ï�3eÌ1°@ �”¸*žøò¤9òâÈ™Hù‰Ž>€ Ÿ›cíÔºÉă""Ä{ê_ùÂò`°ÌosúÑ~ÙN0£Uˆ:\GË�4s;N@ªÑX·’×E j> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ@"ÿÄ]q2�B1ArÁÿÚ ?é2³Ð%g ˆJÏ@•ž€³ÐIYè+=••,/*X%åKKÊ– yRÀ³Ð%åKKÊ– YèJÏ@•ž€³Ð$ç œô 9脜ôNz 9èsÐNzœô“ž�'=%g JÏ@ YRÁ+*X^T°²ò¥€%åK¼©` ~i`—æ€üÐ%ù ¿4 ~h/Í_� ,¿;B_� üí |B„¾"Êãp \BW€Jãp•Æà¸„®7•Æá+�ÁI\n¸Ü•Ä%q¸®7W€Jãp“ÆàxÜ$ñ¸*ȧïóp‘Æà/‡€wqú wñú^î?Tî?T;¸ýP;¸ýPíãõ@íãõ@C³�Õìãõ@S³Õèý^€ý^�¿Õè«Ð7z½7z½w«Ðw«Ð7´MÞ¯@Ýêôßêô«Ð«ÐNÊþ?Tžúþ7“Æâš~Öƒ{ú÷oóøÿÙendstream +endobj +346 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 8 /Subtype /Image /Width 424 /Length 750 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ¨"ÿÄv ‘’SÓTÑÒ“!¡â1�±á2R£DðAaqÁ‚3C4ÿÚ ?ôub{1+Æaeç¢]�L¯‰Iiäúˆ9^2ôó™ˆy~ !ÓNfS–›ÇM9™NZoB*KÍ'–aö&ó‘Z˜XQ-Q?ƒ·½v!ÍûÈjøŠ�¼‰ï¥_X}‡~4«ënü}ÀD³vó¸¶nÞw ,�¼Z¶N^- ¸Y9x´&âX¹{îB +Ë‹ý±Qâ£NlþE¡7!�ݾúQÙé ¿thž`"ûüPÕ^"Y¸¾W?$O×hU¸×³Ûó¢&ß·˜–QÞÅD< BÆ;ب‡„–_GD< ±:w/㢭ÐÎgcå·Â„:¼ì|¶øGA7�s–ß +²3Y×*5ÀN‚kgû]¨Ö éÓY÷ª3„]:g<ýVp€‹§Ì/Ö½U¬2éïç_¡¬0 =üãô5†4çó�ÐÖžúy'_¡•ô´4÷ó¯ÕgÀÓžÎ?CxcO˜Î¿Uœ =åú×èkiÏgùX@s¹É�•†4×s“/ 6’æ^¦ÐG™z˜xÐE·ýS z¿z²n ЭóÕ½@?ÿÙendstream +endobj +347 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 16 /Subtype /Image /Width 88 /Length 368 >> +stream +ÿØÿîAdobed€ ÿÛC   %((((%46664<<<<<<<<<<ÿÀ XÿÄ>!1AqÑñQa�±"#ÿÚ?éÒ& *¡H½ÉlU®ö;8G$ÏFŸJúØVÄßïSýF[õž!‚+|In=b¶òsÒ-Þ³VÏ"+Œ0«™šo³‚ò‰À@’L Ô.öfâb P7:˜*X ,Ø‹UxµDqGjJêv-bVÆø�zÕ'V¶™=A â3GƒIñ¹L™6Œ×ÿÙendstream +endobj +348 0 obj +<< /BitsPerComponent 1 /DecodeParms << /Columns 1904 /K -1 >> /Filter /CCITTFaxDecode /Height 2944 /ImageMask true /Subtype /Image /Width 1904 /Length 60004 >> +stream +äß©o6v'•êgb±\FwÊ|!ÙX:�ä{O+9¯;;S±±•¦dœ`¶¤AÁìQ™/Ÿ’#Í3°™xó/êU¦oi§t\ÇÝ�`ž"0ú}Ûݯ¦�­Ã%�šÉ_ÿ¸ô=o öÚ"z[ûòšîÛ\qìzëë“ÅÆl`ˆˆCˆ÷š#lÒ#Ʊ” Š(F³:D„HDu’êó¥û¨ããÐeÂÈ"nÂ.¼ƒÂaB † 0‹phÖ_í3@p�‡96¡B„ÁÁ(ͳL¸¦ÆHÊ3$ “åÑ!�Ñ‚:y×&4D¡2™ šžTì‡p‚aÐN“¥}-&IÒ ¤è Ú„Dv¡�Ô"òxÑv;hZM ·xI†·ah·ùø&gAg2xÁàƒ`d<ÀÁÁ!Œé �>­_jÒMꈣ¥m'JÕÕ ¨¥ +ÒWJÒoAXPDxGŒ$�Mé:M¢8aÐÕ»’¡xí=»qhZ5‡£Xa_¢à5ƒïº_ªõN–ºö6?®û¥­¥hŽ=kº^­+„þ¡A ‚oJÁVÒy,`ˆ¶ÂMé6“¨A6“÷ñý´*Ý wnÓ{}êúïM;oZ_c]jýHÞôî·#u¥¥ÓÓ«z¶•¿kþ¿ ‰Ú õX8?ýµt´4¯Cqÿ~Ü%wKÒhý¦µUk«Òµw[LëòdÂ~N áÿÖ¿ÈZ_�Cßßq^B ÿâ·CÇÈá(u}_ô;ÿ‚,_ÿ°Øº½'¯äÓÿývÿÉX_ü�壢Ÿþÿ÷ä#5Wü ¶×ÿðáÿºŠÿÿ¯ÿgí¿¯�ÿCòZ×ûþN°ÿè-ˆWÿv þÚ_ÿ÷ÿøA{•wÿÿÿÿÿþÝ{õäÜ/ßðpØ„ý÷ÿ_¥àØIÿÿþÿÿÿ÷Kßþ’Ò ¿½¶Ýÿ–T¿~¿_ý|:_ÿÿÿßÿ_¶—`ßþõýÒ·!íÚý#[}¾Ývÿÿ_}}¾¿÷ößýÿ¨?×Yvˆc™Évéìõ}ÿ­×pmŸÛ­³ëÿýs›FÚÿkÿ÷ýÿßß2{�SÂvš ¶Ãšn“ œ)´­$íd1ý66$é'j�é®±½m¦ýéþclúöÏíÿº[Ð^ö¶· 4í°®ÛAaE1I„Ðmí&Âb›„˜b“TÓM4äG[h+l:{zÜSa}µ³—v›u¶”‚¶{¾I��” `ƒG\Ÿ(Ûóå’ƒèd”0ÂîâÖØ'.)ö­6EM4Óa1H8lPb‚a0©¶�VÒ`ÕŽÒŠ’Ý!Mk·Hßö‡Úw×oºiµuºt�-']]¨&Ò´�-ª×©‹¤é6ds—íÚé;- ´�Ya)a'I´E†Xý|�?·ÈÄ¿ëIµÛuŠÿZ÷Þÿÿ]¯wÀš«ŠôûZ¥Õãÿ÷^½'úZMÂkuouÝ--*\R´›‚‡ÿHvÎ/¡Wß÷ÿåªõúE•á¾?ü=ýÿ‚ÿÐøÚ�õ?W¿u#…Kþ¿z|{q¦Ò|kô×ý=®öŸÿÿ¯ÿÿ_ïTÿÿì_ü?ÿÒþZz,fXä‘Ò–9ÿpúù>>;Û¾«ÿÛUèu¾ö�¤Û_ÿô¿ÿÿÿû_×ÿÛ×ÿaÿÿÿÿéé uÃý!_ý‡ýSo¶¾?,r9ÿíÿ·ÿÿÿÿýÿøoÈ4CÿÃÿÿýÿúaÿúÿúÿûëÐÿì¿ÿÿ¿ÿÿÿmÿü7áGÿÿÿÿßÿÿù°ßÿúá¿ÿÿõÿý‡[þ{÷ÞÃýýÿ¿ê׿ÿ ö‚ÿÃÿßÿÿ÷£ÒÿóIó£#¼7ÿÿþÃÿÿoÿÑ?é»_þ¿ûaþ÷ÿ¾ëÿ¿ÿÿÿÿßûþ/†ÿÿÿ ÿÿÿÿÿ¯×þ¿¿ï]ÿûö¿ÿÿûþ«÷ÿoý‡þý/KÃÿÿÿ¥÷ÿ‡¿ü·¿Mºÿõ{}®íÿ©ÏßÿÎo÷ÿ×{ïýÞ“ÿ½ëõïýÝ}:éÿ¿¯÷0µlõf:´›=7^¾—{çæÌó‘œÓ×m™ç/ßÒï_ý+ÿöÿöûïÛßìæÿÛÿ¯ÿ»¯­×¯mÿ½¿þ5MŠŠ}&)´}§¤ÈAÛ"Õö%ÞÚJÃ96¿»¶éXg¼‡ýºÌ{j¿g—êyíííûmÞ“õ~Ýúßç¿ûºú_oÿ8·ºþÕì +²>a64Õ<$Âé°žÄ/¦ÒL1LVM6Di&Ç�5Tí&)87½0Æš°Èê½³ÞÙÉ6ÎKmž˜g&Ó<ûm/ìôßwÚý~ÛªéZ^¾N›Ïý÷Vé¡ÄˆŽ\„A…�vƒ §!#Û ÂyVÉÒÐAºÝ&ÓtÂmXmfl$ÚXUl! ›A;º¡¤Ú –„UI“ð†#†•§œŸNyÁ&Í<§‚i¦›'Ò„é„<=žÍŸìÒ „l‚44‚ì„ð[1‚~Ù#ì¡Ȅɱ�Ù)Ùó#å[3Ðeb:¥ÎUDV"mëÿ[}¿Iª­-ÿm' +£'´½ÕŠM¥ºVdsZVÐN“i½xWT­p¨3†§‰ÝÕ Ù!¤Ú¶“¤ÃIéµÎÒÒ¨°ÕRÂXG|ŸƒôÂ?OGÆSÊxs—„ðœË9ègg¨h„èL‘œˆ>žašHGBÑ d~bݵÕ7w×ÛJÒÃøª­Šýé6Â�n›^š_Æ»IøO‡þÆm„¶¢¢––ºa´µÙ�›A‘Í+K­ÃÉžfÕ°†“¡ ›A;êž‚m“=Œ$ØI´›PÚW#†žOº¿×wõýíÔŽ¿wCKÿïWõq¯u_Ýúoýß $Ÿ­¤éoþ>Ý:Wë~ÖÚMÉÝE�Z[¸UuÚź´µÓ «Á6VZ_úü¦×x|…§÷åŽ õmý$ê¸ÿZ¯îÿ÷Û�Ýà«×N—z] +ª^ïþ¯�¸ª¯ïA„·úêé;¶—Oêÿ_ßÿþ¿úöšµÿâ¿_øþ?ºI íÿ}Fá¬ÓXï¯z¶ù*õïV÷¡×î㯺­ tÿ¶ûï_ÿÿýÿÛ×ÿëÿúý-}-ÿøðl:ÿáõê5¯ÿÿ|±Èçÿt‡ý‚QÞÇÿû_ÿÿÿÿÿ·ÿÿÿûkÿÿÿÿþÃߦ=ëaÿ×Çÿ«ì>‡ÿÿÒ]ý¿äéÿÿÿÿþüÿÿÿýëÿKÿÿðßûa¿ÿöÿò1ßÿû_ÿÿÿ×ÿÛ¨_ÿÿþÿÿÛîÿûÿöÐ_Þt_¯ÿÿàßø6üˆø7ïþ�:ÿþÃÿÿÿÕ}ÿZ_ºÿïý×á÷ÿÿûúü/õßÿþÿØpßè÷‡ÿÿ¿ÿðÿÿÿÿzÿÝÿßúßýÿýßõ­Öú_¥oÿ×ﯻ÷„¿öû^ïIÿÿ ßÿÿäGùýÿþÖ«î¿·ÿþûùäþßÿ¿ºéúOÿëûÿnöÿÿ¿ÿÿÿë¾ÿÿÿv—éÿ×_º¿oý¿Û«þ¶ÉÕî¾ÝýÖ­û~¿Ûý~N¾¼Ô�ßÒþ÷Þ·þÿöýêïÿ¿Ý×é~¿ØypÓÝ,ºû>•}‡i6«im‚M÷®Ùý¿uÙö~¾Ïýߤg·úß­im®mU·ÿ¾jëµí½'ÿÞ¬Ÿýÿöÿ»KÕWÿûúa´˜ôÃ!<4Õ6B̨m&D}Ú«Á‚±v¬S!¦Ú 6Øa%VÂöÞª­¶¾· ½»Î=vÏö•Ógë[ý¿[zÛ3W™ý¶·ö–Ý[mö¿ß¶Þ½~—ÿƒDøˆ´D¨GM•”ðÂil6�5¦Ü$ ‘É]8l&`ÒNØ…i† �{ªz²àôÓOJƒÒí¬S¯°`“"�‡ Sa‚ÝY}´“l&Þ«÷›Zº^–Ùêë¿lýýž›·ÒûKý©7¸ìx Xb¡fQ–ŠæB"" â#*-SM‹VG8a… †BÄ ÙŠšM6 Äà 0Û &Ä&EŽšlŽ,�©†ÒNôئ6BM6)‘r¬S â‡Ò¶—­—¾dZœ®WˆŒ$Štwð4BÔ¬†…ˆ@ÐbŽŽ�0�§r_5&©¨vÄ+dQ� ”X-4à +A Ã2'§ÐM¼y$í6!WWòÊW­dŒ�&â †!#Ã!kë_ˆˆÐŠD×ø×µÿöØÿ¬&ÚûÂw�©³T¤ÂiÔFÓå6,†?ü¬£�ò£wœÜìiŒìvvÎÊÙ‹u‚™‚é«¥§ª¨RW�þeFy\�‰FAæFk'@ú§­5;)Ó­O°¥W&˜Sµ#ɶ®íëîîï ˆÞo0ƒ(%!NúÏ´» |íBý¤ŒÈŽŽ&* 2³ƒKïîïýÕoÿ&1J†L2y¶é±ÊÓµ_»öýý'ol$úÞ™‘?%üGñý¢$W"F¤x¨ò1²dgC)ÉJòe‘ Ó Ii‡é¶ºëþWŽË¢ }ÌîDãñèxg³Ù¤C3Í=4 ÌÌÏ4ÎdùÌp #@0�•˜Â!ˆg2�:Hˆ\3¢64·ÛI·lŠ¢\¤H‘yN¤I¢è§D_õM?ÚÉÌ�§« Oš*Þ¡·ô­& ´ƒia&Ô(Mš7Y?™÷Ÿ‚6M?¿Ýòž?¦ð4A½ +ãÐð “3„G‚œÂB¨„¨ˆsÙ"ò�3ÄFgF¦´CPȃ:Ä":&�„T#™¬Èc'2kd]&«÷Wh%jéi¶ê¿†Ýõim'I´�&ÂgˆóI†‚ÝôžZ)6ƒ8imúW¶©:°äèZiž=!m+ fv�p�LžÓ „Éé‘Ð�¢>g“¬Ó†�€ÂašAB¡É̳›¦ˆ#Xi„EA F¶Ö A–€Eã¢9šFô ¡E@Õs…ÿÿéý/Ûÿµ´­'÷kWWß]Õ&Òÿsë×›}m[e¡0ÒmáYc gZgš>5MOVÒ ¤Ú£Ý-&ßIÓI†…¤é=:¶L�•¥Á Â6ò¦~ú8ìŸ?ýýwUë÷þסVý4ët­/ú÷Ý­I½4›éo}']K„Ú¿«ïJ“¥ku¦ÚN®î–&åûKªWIÕÒm'h$ÚN¶ïbëëÆ±ßqý¿ï +µ¥¡Oûú_­»ÖßÓin÷ÿ«ÿr#µßª~ºiöÒot¿IµvµÒÿÕ'ÛõRé¯ÇÛZ[ëm+ÿéiÿÿßå˜úëþ>õÿú_ÿjߤ;ºè±ÅWé{®þî–ºê«×½uúX~öë¿×Tý.µÿ×ÿÿÿÿþÃIV×ÿ®¿×Õ¿ÿ#‹¶¿°ëÿúoüoëýØ>ŸùSN;ë�ÿ«î=Øþ�J·úý>½ÿý}ÿaÿÿÿÿÿÿÿ°__°ÿÿ×ÿt¿ÿݱëH{_õõÞ¯ø8?ñ‡¯ê?ê>¾ÿÿÿ ÿÿÿÿïÿÿãÿì?ÿÿ¯ÿ×ÿ|âÿÿëÿÿÝXl5ý‡Óý×þ¯ÿÍ?ÿÃßÿÿ÷þiÿÿévãø?ÿÿÿ¨#ÿÿ¶×ÿÁúÿÿûm«il?îºÿé÷þý öõýÿú_õÿïðßÿÿßø@¯ÿþÿÿÂOþFAÿÿóMÁ°Û½a¿Ýÿÿ¿ÿÿÿ»½«÷ÿÿé~ë÷×ÿ½ÿú½º_ÿúéwþ_Þ‚ÿ×ü%†Ãg÷m‡ïmÿý/ïoý¯Ï®ïÿýêÿ×ûÿ×lˆO®ý}ÿï¯íÿèðØÝÒKþ—ÿßén.FxoÖ!ÿKö÷ÿÿ[õ¦÷«ÛþÕÿõ÷¯}-²Gýgëíÿ­·ê—ÿþ“ï¯ÿ¯÷ýj–î¸Ûÿ6�þö—vÝÞ¿ÿ_õgöi6­Ÿ¿zouÖím~ô·÷þû®ÿÞ›¿õöÿú·ï·×öõ_uëÏ'ÕO¿Û “ÿ½B U6Bûd?m†GIÃ´ì ™;NÕ°VÎV“a6Ò][J;½¶óôªö–Ú]ZúN—·«¶“mëßö¿ª¿··uÿßuª¯˜ÿÛ:mn½ß÷´UL�¦› +VÓi´ô M´bbm&6!&œ6Ò ŠéƒÓ·b“  “½PI¶©ŠÖšM¤¬�È~Üi6y6C½²ôŠ8z·kÞ•ûi¶zm.×nðŠÛ~éuwu×È?½o©öh»öæJhF„0˜!tàƒ12xaO ÚêA%;‰fTANÆÙÚ«;¥÷Üì¾BѵáûÚÿdz,ì÷æwúÎÃ$ÌYxH?ý(¿áÐZÿóW㔜Ÿ‡'� Néy^){ÿ»ÿ×õpÛ†ÂNßëþ>N¯2Xÿõ2¼�ù'ý0ý&ÿ×ÿ×[ÿö|�£Ñ>s(ôD9VpeUž†‚= +²ÐU˜49:9‘Ä4ŽˆŽ”ƒ—4 êÿm!ò\dRÎÆZy¶j-M¹Ç¯þÝ7 6—&„Á¦ßa&Á&ái°Á+ƒ`ÓÌäkhÝÐÐf‰½¿Û +¬3<ôY¦z3G£Z=’0�çyÈ�@Â6aÿ"mTÙ$#h�Œ">U³AIÉ8é’3¤|Ž‚*)d�‘¼¾uÈùH�">¹ÈÖe+#ù šÑu÷J×t›JÂg�'I°–‚m-ݪ6“¤ì´}ý Š|ãÒum-[W +ÃSç×&xFŠV–fäö° 3Í9ži&±£tˆÓ?†y¦Îóâ8}a(ÌI†`ÏŒñ„W2|Á¢!Ö¯7œ �…h ¢á•Ã'Ì †<—YD �²ž9œþ£Ú]+¥{«¥~·¾êê¶––é?}-·XAZV—ÞéZo¸i«m&ÒÖ‚ZV“…OI°‚ÂJÒw~LMZé6ƒÒl ƒtÒ¶šÉ�Â44ž)£òN�m!l+jš7Â43æ|ÂY¦Oà ä Ÿ¶(ýýU~­v´‡m-U-ô·I¿_Kýk×ÚVý-1Vö÷Kõ×Ý]+QU %'¿ßi_Òm'I´›zJÔ;Ž-¤Øi ©h+I´´ÃKIÝÂZ« O³6®Õ~õ¯W×u]u _®ë¥××·ÿî�Ö–¿[ÿôñ¥ýkÛЮ“â«‹ÿÚ_{KöúÞÿ¥zZN·MïN–—¿ªOw¥ÿØ4…¼¦ë¡ëö×ô½ºÕ[_‚µn¿Kõ]õò8[w�wP·ÿ¿¤ÛŠ‘Â$ý)p˜ûät\V÷õU´ºoÒý/î�ýëðÿëKÒÿ×ÿ¯ÿüŽ/ZÿúCÿ¶¿ËQë­F臢ú#�ÿýT’Ûk«_¬}käp«Öú_úî“oõëöÿÿýuõõÿõ×ø]·]Wû¿úý/ÿ¦Ë«øÃÿíuüÒüuzÖJ‰±ÿÇúÿüvëàßÿÿÿïÿÿ‚ÿãÖ¿ÿ·¿íÿùáWØþ“ÿz½ô·ÒÿÒoþ‡×¥ÿý_ÿþÿÿÿü�'_ÿôUó§éwÿÿàßÿ¥ÿÿþßÿì?ÿ_ÿÛÿÿK_õÿ__ÿ׿ý÷öýøKÿÿÂøA?ï±]ßøo_õþÿÇðÿÃüÿéûÿ‚0ÿð_ÿÿÛûÝÿ_½Óöý¿¿Òô¾¿¯ÿ·¿öÿÿûì7ÿöÿµÿ~ÿÿéúOþïÿÿï˜_}ýÕ¿½×ÿêô½}v×ïýßÿ¿ßýýþïÝÿÿÿÖêÿï¯ÿA}úÿÿþií�Î{wÿ½^Úÿ~êþº¯^C÷öҾΩ޿îÿ÷ßíÿ÷Ýwøû°öûº z_ßëú_¦Û÷¦ý»VûöÕµî¯_ý-¿öÞ›Ûû_ÿÛﳪý»üëÿýw]½;ÿßûë¯O¥ûûëÞÌWi7²ûi0Ï-XmÓ{gÕÙvß¶“}ÝÚgëKm-­½_ûû3ÛýµnÿßÛ^ÿuÛm{ÿwï·×ÿ×ïúÿW± Òd!ÁìSi2�²”¬‡ ¶ÈâÆ›¤ÇmȶÃz„”6¾› ¸L0ŠÃÒt“ö²÷¶ \;M½¾½†mvÖ®üŸI®êþšlÏÍ?ïÛÛnµöþõoÝ/ÿµ6,'„ Paa0Âm&Ü0�ý‘Å0ÃI‘ÅÝ„ï¦I¶’ T2" 0c²ÚM ­?bM6!G 4Ø=‘+šI¦Å1¦Á—í&È–íÕÐJÃ0ÛAm‚I¦ÙM†n¥m[8ÛJ nûãÛÛöëû·�’"º™�…£˜A˜bÊ&z„"3"1ÉUEe…ÑF�eP'„�{KnÛh$Ó#�±MÔ< ØZb˜m+ SkLBMâ­6)ÓdG± ´¤qMC6ض Sl$ž�†êY‹›æ" ‹ Ñ«2BÁ'a{h¬a„3à a„„Âi4%zäqmí±Tÿ~YŲn–«Ž¨›¥ª¤°IRézJ×�ÿ�ÈÊú…+�Òe¸žMÖÔ#G +g; ÁKu���Ðf�Mn½“Gó7™)²bGŠ™åœ›;RfJfd–ê/þ•ïÚ^�=5•+R¤þí;«×ê>�¤/nýrWçbÿøíVí*õÿ×_S²¯-é¥��«X»�;Ÿ®¿®¿éÿDN?†rt+CÙeah+ž`d4}"&°~'3áZg9ì�2)y! B� Fˆ‰È´#¬Ÿ öMqIadb5#XìŠÆ²:ç#Q~«ÿ“•Ý‚Vš*VÁ+°mnLä°S¥ mBaÚ@ær4Q°0�“8°�tx Î ¦¡=:ŒûÐx¤Î�aÝ“@Â.„k ™0�a�‚³ e<^*²$ + B4ä'eÌŠVK‰¨;äK‘Ùñ�")à¦2œ”�EB ÈèD�‘Œ—F²R±÷l+¤Ú‹¤é7°Öݧi&Ò´Gm, µI´“h‹Lbp“¢;aÚ£ÀzMµ¤Þî´�³«@Íš ´›“„hi6‚a¦ô“#ó}4hxFÀôÓGÀÓMiªFÆi �‡¡àa ‹¶x�™ž¬0FÆ¢Ð Ó #dטÂT<3ÆjG³ÙB/G¬³!ŠE�¯M/ÚëÐt¯ß[JÐN¾úXWI¸M¾ûˆ^/¥nÒ^ÿ{ÃIé:M¸âÚM¤ØW +“…D[h-–„Ü��mQâî‚u“¡tM§¤ÚgŽLBtnÐT›¦ÐA´�0šZ¦jÝRmÈøPJø'm£`f¸üñ¸é»ÐëÚôßJ¾ÓÖ—¯O­>¢—´ûõþéj,?´�ÒÒ½õk‚µ}+it¶¢Ãmp¯¥jéZ»Ii_I%a+^­3Í'Aœ#Í]ÚA[L$›@Î<A6¨‹o¢Çé-j¤|.ùpŸk‘¿N¾Ö¢†×Ým~Þ†Ú×ú‘ÿaí>1~ù.Þ=uº_ý +M¿¤ÿ­Ða-íêý¿¤×x¯M¥ÓZ_Knëºmu‚¿��Õö�÷Ò-ÉS$Ž=xéAcÿ¿!Ähýa†ßÕ:ýt·uÝ®½Háw_i×�Æ7úÐúÔTŽë}^·Ku_ISwÛ[}ú_ëïïkŠCëÿ¢Æ}ƒ_ÿE�µÿHE†þ±ÿÿü‘Œôßõþ‹ŒôXäg^¼‡‹jõö?Öÿ_ØVõÿxö¿ëú_ÿ_ê¾ÿoÿÿ¯ý†ýÒVëÿ×Hÿ÷ü_ëEŒÖ© ?uÿ´�R‘Zíä†_ÿÿ¶Šzÿ‚0ÿÂÿì0Gþÿ¯þÛÿÿÿí×ÿúÿ¯ÿÿÿ¯ì5ÿýzǯ÷ÇÿýÿêÝ„þïÿƒaÿÿ·’?üÿÿý×ðGÿÿÿÿÿûì?ÿõoÛ_ÿÿûýÿ{÷éwé}þ/ÿý —þÛÿÿßûh/ ÿÿÿÿÿÿëðlÖÈî¿üŸ¯×ÿÿ߿߯é¾ÿI_׿÷ ëÛn—ý‡ÿ¿ÿ¯ˆ_¥÷ÿÿÿÿ÷í¯áÐ/ÿð‚úÛÿÿÿíÞ¯°ìvýÒöÿ}ÿ±_÷r¡÷ûºüÕü%ÿ·_ßÿÿýõöØKÿý-µñÿÿû{·Õû·ÿßêßùOëÿÖß_öu_þßýßá/ÿ×÷ÿ¾ÿý‡Þõßéwpÿv~Ûöý[¿lÍ7ú·éí·ÿÿú^úú·}×îßöõÿê½û×ÿûÿ÷·ûºõ¿ÿ»¿úÿÕ°—g’{ †yZMŸY�®Â°Ï%â ´üvlõù…×él3×o·ßG¥ü6ÌÿÜÍZß óÿíýÿ·ÿjßÛÿ·gNµû_Õ{Û¿¦ÿ¦„ƒ JÓ`Èød%mÈ£¦+h1L…öƒ‘ÂcÙ+†)ŠMX»JiéÚJÅ5vœ#ŽÛ8®»ÓMXfæ$ÙM†´½»û ³ ³Ò{i~ÚkퟶÏß·m™ím¶gë·ÿÞÛMë«f‹ú=°ÂGÈ6tHöÁ°Â”pƒl! +Õ„Ó#…Õ0˜$í„È£Úi4ÓÐH0Â÷M¼2$ØKlnì1LBŠNØ Ú › &ƒNG +6)4Ãi&šl~›lR{"ê6+M†a°a+¨mÚ¶ ¯r í¦»oÓ…`—òl*Îù†„FVE#‘¯(Ì’²Œ‘0‘ð¤0`›UÑí£Ï*è϶°ƒ +îÁ8]¦Èá Èè Ó $Ø+N#„T˜bƒ˜iS„Ób�i¦Á>ÅS!=§a Å&ƒOˆˆôY�s*D Ø’2:dàƒ$0!•™õ,›4ÑWhpÁh«å ÂG9ßñ¹hUEzƒ_ÿKý*¶ÒXA[ J�PÈ��ÔZ�ÿ’ùVÉÙnO©œîÎy•çiÚ–ãÆ@±F"vG‰„CD|�žE"3òB8‹Ù@„ùàD]‚ÑÈN"ÖR ',ï:ÉóZSª#ôµ“œVÓÒa„ϰ“jÃTE‡M+û¤ß*Mì– ›I´Âi:Zi¦¡< › ¦újr~†äüœÏoÎ+Ý!t|„^LëÑ­ša¬38 Ñ æ€eƒ=„E°`‚È휰éjÓ¤Úºý¥¥…@�é/wI¼Ci[-a% &Ó<éÒmpŽg‹I´œ*û¤îé?´ÂÒmt›A:ÉÌ�m IµöÙ1òc„‚ ªÚ8ôxj-ôõÿ[¡[Ý]SýôŸõöÒýôµéµ¸Tøññ}1õýý+Å^µwJÑé&íÚmG0˜0Å´¶Yׯøß +ý nÓõÿÅî¤p»·JºoÝn×Wªw¯û¥ÿú®+þ· ¥ÿt®�¯WÓíz,r-)J?TC—¾Ú�ú]ÿzäp¨i~îú÷÷õûihwk¿ÆãOêÛŽï_ëÿÇz–þ—ùf/Ž÷¬­ °ü1ÿï–ä¨áøëÿ,r9‡¿Ñc‘iEŽE§úëñûÿÿúÿëþ—¥úT8û ßŃØ~ÃõKHXp×ÿõ¯Ø¿_ÿýº_ÿöÿ_aÿÿ·°ý‡ëíþÃaÿÿ_ýÿ¯ÿÿÿþ Š�÷ÿ„wi†Íÿý¼ðß„wÿ^ ÿþ¿ÿþ»}ÿï„¿ÿ½ºÿðÚ=ÿÿð߆ü%þ½†Ãÿÿÿ÷‚0üÿïÿÿÝ%ÿÿêé_áÒÿÿ ïáýûixpßÿ÷ÿÿáá¿ÿ}ûßð×ý¿}Š�Û÷_þ»}ýý-x­Ýÿ¯ßõëI÷·ÿïöÿºÿý_Uš“¯þ¿ïïëûöîßýÿûkþ—¾ÿÛ4]“¯nÿ¯ÛVõoÝÛõéël鵜ÿ9úªýy×Ìoýÿ¿_^¹¢{}ÞÚ«aum³÷ï¯ÝŸº³öíYš³5íÕþºögëõþ¾û¤ßû{îºúýö USb­Š[dÅ&š|Šáí—†Òl$Ùz¶VÂþ”Š8>ûKl%uÚ¶º »´S¿öÏ]]_ûgí³ëí[¯ÿú9[{M0Òa‚µ &ÝÓ äq B„^ Ä(„ôÅ!Ó†” 4ÓÐXb›I;¨>Áí‹[ 'V4Õ6!l0ªœˆm$ôÖEpÛ/éq^VÂ�J©ˆÂ ŠÃÑ0A‚H2iÂhDA…*Ú46)ÝÚÒm6Á´¬+#êf•Û#cFÀÿ „l #\#CTÂjÂ6IÁ4Â>0°‚<�Â5ƒØ<a¨>`Â64{xGxRr#È‚ô=’ÐŒ‚C”<—ˆö\g\ŽÍ!�ÅמÊ#¢ßþé6“­®“÷NîûKxÓâ®»ôëii{j߯ººÚº×âëpL6ÔRt›·I¶…6’l$îêdsJýcUþ«ý¿úèkêG uïÿò,n”U·ý·#…µ½/OéÕw¯t­éSüU7]%Ò¾½uí饺ýa5ßÿÿÇñÿßúåŽGRÿùA�ÿ|‡1õmtXñ¿¯÷þG7OÒ#…÷ã]/¿Ö?¸Ú¿µR8w~ë[iÒoq‘¯îâ¥Â_ý/ׯÿWHU¿ô†þú,[õ׋IûÒkÃ_‘Ÿú,r:,}Õ¶ô[’SðÑnIº¾A(¾ôÿþ…WîèWõÿÿÕµÿÿÿÿa¯ÿÿÿì?ßýý‡î‡ÿþ½,~<«ó û¾ý—Wÿ–¯ðFwÿÿ‚3ÞµÿÿÿöÁÿÿÿaÿÿþÃ<.ß­®»¯uûØ}7¯ðýßÿÿÿ„ÿßè.Òÿÿ¿ÿÁ´xÿÿÿþÿÿø7£Í†ÿÿü—ýÿÃ~mXøoÿÿÿÿÿ¥ÿÿélŒ‹ÿÿÿö%ÿýïßûÿÿ¸ønûþÿF�þ¿ƒ~ ô ÿá¿ÿÿÿÿÿUÿ¿ésUÿïvÒÿÝ/ÿÿþü?n¿õØzpÿÿþ‚ý½ºý¿} ë†ïÿÿÿÿþ¿ÿ®ÿ÷ïÿÝÿþ·ÿ¯·ÞÿõÝÖßßþÛÒõøwáïvïøn¿_ÿÿÿ¯þßúÿÿ{½Ùëÿ¯¶·¹×ûëþ»:¯~ûþŸ×÷¦¿ýòtýÿþ¾ÿÝÿ÷þï¿ó?ûäëö­­™«^ý³?ÿþ¶õÞ›ïí·_õÝt¬ç¾ßý߯V»~svò_w¿ÿ9»{ÿuûÿïl¿|Š;Ol¾žÃ kÄ6ý[/]·l5t—1ûku¯úVÙèåý¤ÚmŸúÛ?·_õÃ?ÝMÞißÛm¯é=nNŽn½dë×ý¿ú¾ëÝ}»ïûÃM8'´áÚlRvœ•í4î!0{ÃA ؤÓb†ÓOIX«OL:LlU¤Èº ´zzI±N’ݤöIS]³“wa~“i<0Jݤû¯¦Í¦ÏWíÓvé{u{gæþý³>E] +´жлEƒAæ™>ÂjsôÚi¦G˜¤á'´Á Ÿ ¯‚(ul'îÛ#¤™+L&AA`Чy| °Â†�A§{AˆI§ 6)ŽpÒm* VÁí¤Å ÛI«JEñJŸjŶ’i¶“#­°i0ö Ž*i°ÂR½X9\;ÄEÄDaˆˆlDA²SðȪ >0ÈÔ&aOnWeaIByVÂ6‚Âw¦(0–EÖȨ0­Bm‘Û#€›I; „©6!EÙ¶šaˆUqÇË.¹’|ìW B&±L°ÂÃB2‚J½z&ñÚZ^¿úé.ØAc�Ù¯!¡.2± ÒXŠ)œVƒˆ¢½Äòo¯Y�Üv;(¨ìW&À|«ÕI}J‰"/‘! ‘ +T ¦E¿lýÙõkæ—Gïó5ÿý­í¥íý_È%oþ­}ëþý}¿ºóŸþ¿ßý×þFº¢~»ü÷ý»÷I[Iv*Ãi­¤r´klBi�†GµÓõ]†µï²üŠ;ÕµTû´¿aë­¥„qþÚK~Ã=íþÛ{¥ý_Ûÿßî¿ìƒˆ«ý¶gÿ×¶h¬Ñ7ã¶Èè “L0¾ì 6áÃIÚm8h27á„Z Sb•4ÓM6'`ÓmžÁíêƒNØ=4Ûá°Ô+i'šlPM‹MYä^¶’}¤È¹Ní‘S¶!².Sm$Óµ»­´³i/wû`“ +vyÁ‚ÅÊÙ`„w÷!0`„0A¡m�#cI¤kr¬üx`•g­£Û'åC4M0ƒA¢ AØB(}Ú0†Ò*ÏÅ\Ÿ –ËU á†Á8Iºá…r8§m0­²:JÓd‡ „�ï ¶˜-¤í´i¦›l4ª"‡LS!=¦m ƒMŠb#�&Ë0ˆˆÑ6+ÓpÑÄ"" B5¡VЈ4""2«aˆDµOeaé –¶"ƒ:)Q•�É4J0aAØM]$œ³jÃŽW, ÛIuêà izÛJÒë†ÐM¥¤”E‘\+HÈ£ªˆq¨�ÿÉŸR¸»;,ŽÊYOHŠ‘\Ö-Â*’Øì¼EeS8í^êKáAêWVÂe�ˆ®þÖ½-Sé­T¯ñßÇiL)Qk‚WýßQwuw_uOí0šÿzëÿùŸ•ɯ\�'ŪÚi÷§ëþ¾#�…!êJ<äVRÿþ¿¯D% +ÆU‡ dù²*(f¼î‘Í’"tØÉ$Ä'ê“"@¤˜¨„8e@óD@ÌFfOR0Ïg“’f¸í,‰w�h“,†ˆè§D|ÔˆùΨ®R�yþF,ï]~ XI‡„gi Í$˜6OÉÐÜqòºSÊí4l03[FÀѺi™Á4k#]‡à™F�a—ôóÐLö{ØO‹™:�3@a›FXG°Ð3>Â5†HÂ<@ ‹É¥³`ÁXd„`a +pŠ3Cf‘¼‡qˆ‘›"[hÃ3":YÄo"èÛ>! ”Š£„"YìÓ?É$"œŒò(ˆb’fBl$ö.§Ú¤îè+ +®¨3‡&pÎ4aÚM µD[i: ¹5lû +“3‡,ý&AÝ[Sî›i¤´¶Z.“ Ãê«H[am4Ó°šj{  ³Û™ÁÚ‚ «�í…M�Bñ0ffi&¨Ü7J‰0˜F·lP$©”AØF‡�ŽOÍ��rx¹ÿ_omWõ½EiÚ„ÚÚN“já`­Z¦ßÕ(Tîƒ#šë¾•¦ØIý'Wt´›A>ô“¤ÚN“iž3ï>j[WWT›Dº» Èæ‚´»¨OIÒuAœ4¶dÒ"ÃTƒi7ïN‚a¯Õ:}é÷_·ßÿÚÝ-÷­_ÛÕéö÷_û_N’Z_é=7úZéi7_·º^8®Ý7¨Ó­«î´­-POOúÚ¥¥ï¨«jýu¯ÝÕïk÷CQ[]Ú×[ëÿU_ÕwQÿ¯¯·öéx¼{Ý÷Ç Û¥o÷Š­~î*šîúûtÓzMúK�¡¯ß¯ñá¿õË�…_ÿõþÿû¤5þ/¤Ý.>:½~µ¢ÇJ®õÕº­ú½omF¿ú{½~®î£_ö†ÿ_ýKaÿúC«uÿêÝëþ¿¥þµ¯ÕÿëãUïXÃz¿áè¸,ÿþXäsÿ�·_Ðÿ܇?ÿÿÿì?ûÿ×ýºÿý|àÿÿÿëýöëõÿÿJýö�ô>þ¾»zÿÁÌ3ÿÿÿðßÿÿÿúýþÝÿÿûkÿÿúÿÿÿì6ÿý¿ÿÿÿ÷¯ÿöÿÿÿü7ÿÿÿûh/ÿt¿ÿÿÿ¯|èŸÿn¿ÿÿðl7ÿá‡ÿÿúùI}�ø/á¿ÿÿý~þ¿ÿý´¿ý´¼ÿÿt¯3ü%ÿúÿÿÿá°ßÿƒÿÿÿú üÂÿñü7þïÿoûßÿîÞ›ÿ„BzÿÇþÿïø~—¥ÿýÿÿØpßÿ·ÿÿøKßÿ ‡¿ïÿýï¿ÿ¿kÿ¨Ú×è/ý¿ÿ¿×׺ý‡}Ý×ÿ¾ýÿ¿wÿþþ—ûKýÿ·û~·œ_ÿÛoWþ¯_áÛÿoÝïUõuÿ}ë·}ë÷ßï~ÛÿýõÝ/÷ý¶g·ÿßí÷_ß¶h›µoþíïÿo½¿½ÿþë÷½»n–ýw:ùŽ»KóŸÛ~¾ÿú¯õßÿßÌvoõÛVí³‹Ò^óí…³ûÓiþÈ8Í_ìƒÿöÏÖ·ÙévͰîîÓ³ó¯ôÞÙžÛ¯÷ ¾µWÿzÛ4W¾½·ÿ­ÿ·kÞsÛìPb™Êæši¦ÃÙXµ¾ÓMŠL&Ä Å6‚cM>ÛA&ž›M4ÃÁ„PöØ«L2 ƒí¹{h$õÛS¶Á&ɸ^ºI°úºÛJ×´•°I¾ïØg&õ^ÂæÚ[z—[MŸû „r¡ŽÊ�†ö¨0­‘Fok¶ƒ �‘ÀIØM¶(&šié¦M‚ ûÐa*l-ºwao¶•¦ƒiƒ¦!)°’iÝ…¶ Ž¡«i&ÚI¦�¥ Š`ÕƒÓA±Lka9ÇXI6Cãrwi1\Ê#²�¡•T@Øh׈Š9ØÊÉ.¥Ç;„9\!ò…=µ„@Á!J©„|>#T ˆˆ Ž˜b‘á“èöV + PaÝ©áʈa2V¡­°�¯Aa®­…L4a-Ò¼E'hDDs ‘nÈb‘q�wT²©‘—ÕÓÂ[´Òz µt�*<˜ü ƒj¾� è+{AaBBÃHxO ŸAÓU £ÃVöK M½1Ålª638&`ŠŠáøôlEéž��Oæ˜L#Xf99—3ã» Ó0�–GÐ�Ž0�Ç™�„=Èȹ„ladø¿$\ðOÍfg,ç‚)sAŽxHÛúZºN×I:'´�_u]¡e�6ƒ#›,í´¡¤îé:¤Ú Ò¶dm–{jÀÝ-–M;A/¦Úi'e &Â#°g×A´�– 6 RvZ(Æ“úO ´4�¦NËB´GmÚN…¤Ú ÷3j©6“jŽí+TÂMík÷¥ö’×Å1\}nŸ­'ÿK]×_KÒ½é§K÷ÿQøM7ÚêÚŽ•½.: ¯iß•¢q]õ}+…c«¢N’´�Ý$v‚m'LC¤éŸiKhRÛu­ÅHák½ïÕ¼}ò8T¿Wt­zúõwëÛzÿëÕ7¯zÒ»þëOÝ×ôÿ Xý�ôï�4¶—ý4ª—é^œû¡þ÷ ïëkõÚþ·Û¬|~¯iñþÕþÝo�w[_ýHùm'÷úµ#…qÛ¯R8Wûq�w#…­§­§_þ»zþ<ƒõÿñÿ]ÿÿöúþê‹rGþþ“pÿàœx¿ýð\=a×#?ïJ¿ëÇ÷ü¯útºJÜ=‡ûÿ¤¾¿_ÿ«ÿÿkûVÇÿ¯ØzB"ÃØúû !Ø}CÒἺ¿úCøÿÿý¹Cþ½†Þßÿþ¿þþºÿý®Ú×í·Mÿý¯ì?ö×°þjÃÿØÿúúúýÿÒm'ò-a°ÞÿÿÁÿÿù£#¼èÈïÿðFè¨kûÛÿ÷ÿ û{ï^ÃðßA¿ý‡ÿÿþ¿œÍ?÷ü£ûA887‡ÿÿÐ_ÿþ�z ÿü _ÿø;¨7ÿðÿ ýàßý¥àþq ÿàßÿþD¿Á”_õÿ±q_×mðßÿý¥ÿö¾•h/ÿé/m]/Ûº¯ßðßøoýÒð߃vÿÃÿÿáþOáãô¾ê4½ÒÝ÷÷_÷ þ—¯ºÿ¯ÃŠü<0ßÿýÓöЇ¿ý„ Þ÷°ýþßÿý¥ú ô¿ë¾þ½êss ÷û¯ûÿzo_Kï¯×ßÿ¿ÿ÷Ý+ßþû¾íûþý·ÿºþ¿¥ý~ý×Û_¥ó�{¯ûªßkï_ÿïùÙNôPšßý­ÔâûVóËÿ ýäºòtýþûÿýëúþ¿»Ûß»»>¯Òn½oºÿ³E¯¶»Óö·i_Þ»×úN«ßÿ·]m¤ÿ_ýç½½i¥«Ïivߺþ¿¯M;m6:jÛÛƒaߤ›ud{t­²÷l0¶Ü6öí[I‡È£·‘G{¥Úò(á¶_§þ뺳 ÷zŸ{úV–Ùé+íÙ¾›?í®ÚðÏÿõ¶gÚÿÙ¢ÿÿúi»Û#�ná¦�‘Ž¢“†GÒb‚ 0Ò Ä$ÂlBb�ƒØ:M´˜>ÁÁ: ´“ +špOÒ 4ÛJ›IŠb“M=1M´¯dT⓴۶“¶—¤È¼)=;TØ`‚a섦› ‘\4îEpþEpò·hDC—ƒÂi°ÑbØHý BF†ÑF�pÂa4ôQí†A8°…¦…,BG·<2^h4œvh…ŠÙ0¿i4à $Á„ „šÛaZknì0‚#¦84A ¡�¶’aŠcav˜b˜Oi°�4 å¨VðÂ;ZLB PŒ£ä­ +)ÃoD¥!0�Q† "]J¶j…„ŠÆO†˜H¬=°£DÚ½Äs ¸®`7UëëKÒúêÚJ°“h _²fkÐ0XAËøÿüîâ/è®|¬Ú‘”ùÛ¢º³¨P™–¸(#;E;‚i™³°¨·ˆšDZ;1XÈj;W}o¦‚Oáêv¢R¾‘IªšAN¸R_R)¨[»î�¤>µúIú» íSÿûû½ î[¿·ï»ÿ2KZ¯¯ZM{XméÚÿëÿ�”û�Cã·Ž?ýõýoþhŽO6d1æ (G) Év|΃"Æžq�IN„EcH˜—=u ™VtËåUäÈdE³K!™©�ç�ÑtFeU´F$uY ÷ÿL&Q¦¬;A£Ãï8RušØF³ îaÙ™ÉÈ�0�‡¨„âì2ŒÁžÂ2" 4B'„"�‰òæ~S�œá˜3LÁŸí&˜d¾`PH0Í3"y¬2ŒÁŸÁ@ðŒ8hvAŠld@Ôƒ'IŠHÑhÛE š#ˆÓ%å( SV¡}F&ÈÒ9—ÎFâþl‰1sdE…!à ÑlˆdQ‘v B£Àa5H7ž0“x0úi Ú †ˆâí¤UÐäÏÐÒ¾›MQB=Òaö¡¦6¶“ÉpA¤�=[“$Úhã´›O“$Újªâ¡ „ƒ#­�ÈÝFìüÑñ„~rs.�B6°>0§à‚Â7†À 4‚?v¸¦)� “Èø*ð�tÂf‡'CÁ?.ÓЛÉóÚ?äÝ7ø}ÚKVÐ&iXTÛjÝ&ÙgM« ˜m¤e„‹¤áG4·z­t´)0ÔA´›W¡Iµ™ãô˜jÐi¥AiXI´�&ß ¤é6“T©iZAµÕ.ØM´A… óP“Éc +“…G€÷MPMÁœh'A:M„ݼVöÒööÕ]'zÖÝÿmwJ÷iþßµá4“¿¯ºÞ“í¯»¥{ïûÕtªé^ÚŠ¶ïºN•ïKZWV“­Ž–ýV©<-iñwu“Âmu­/·Tû×ßô=ïÇÓõÅêÞ>é?õ¸þÝWŠ— ö¸ÖúV®Úº_¥v•þ+®¿«úº_ÒW¶´ÿÓö;°’KÖÿ»­øûý*¿ºNÿéu´ÿßN;¥·¨ík«Õ¯×Oú¿û®¤p«Þþô1Ótë¡­ûÞ“·þé½´þШ×]Ú¥ÿý¿öÖªÿ–cÿË1ßýÿÿüz½å§ûÿ½_éuò9¦íoéd8>½pTë÷¥÷^ëýíÿ[�i÷éÿßéÿÿë_þŸõ×í%ÒÿëÖÿÿöÿÒ`ëþ‘cVÿÑuî¾Òß_ÿàÿõþ¿ÿÿöÒÿÿÿÿÿÿõý¿ÿý×ÿýwuëÿÛßÿúuõÿn>v÷¯ýXëÿϯÿÿÿÿÿþ»ÿaÿáÚD‰ÿÿÿÿÿºmý¿ÿ÷_ÿý‡~ŠzÿþÃÿÿPêÿßééÿÿ÷ÿÿþ_í¥è/ÿûÿÿýÒëÿÁ¿ÿû¯ÿü–ïm^¿ÿÿÿÁá¿úúôý‡w_ÿÿÿÿ¯é?þôûÿ_úÿíY.ÿÃwÿ¥ÿ÷áêþ¯þýCÿÿ„ wÿzÿÖ·ÿïÿïmÿô½½‡^ý׿¶¿ÿHÂ�ÿwO¯ýì>ûzý÷Ýt»ÿß_ïÒÛÿ×~«õ½ºþÿÿÿþݯû¯ÞëÕÿÿï¥þú»×ö÷ッﶱL}wûõûúï´·K¯×Ûºþÿý½ëý×õö÷ÿû­[÷¯þÕ_o·¢!v¿½»÷ÛÓ~söéªýÿþþÿS›íý.ÖÒþ¯mÒý³÷÷ퟶÒÿºÿ^×jÓÛ3Vëuš/m/ýé�DžöÛúz¿¶ý][µ¿ë¿ï󟥮߯¤ÝûI0è-+nÐJÓ Ãm%MX¤ÓYØA&ÚI­«¤šk"·uØGÛ .^n‚a‚é¶’k®ÚPé[¶ÏV•¤ÚZvÃ?¶zºØvÙéé»þÛSÍëöÍÿV“~ߨEÛ¦Û¾GA$ØiAÐNܧi^¦Ò»M„š Ý4Ø ›i&ši†Ò ¦›è6ž±tئ!6•„ƒ“M´­4á¦ÚMºl„Ä ÚV“i28¦¦!;¦ÁìBmƶ’õÓ…L&È%Ó»KJBÓa˜“[ÛT˜l„¤!JÆ„wªÃ/QFU@¥TVpÁôV0`¥s B•lê�2y’¡±£ã(@Ó Ì8ˆ´FGVÐd�¢9 ŒêƒޱӕtU´{aˆD@¢ŠvL  „›Pè6“½†a8΄ 0‚ ”l‹3»†“ˆÃ¼WaX4‘Ð ˜T˜bi¸¸bƒ" *ЈˆÑh‹ph�ËtFKxlÈi�E�„E„"=-vÒÆ„Gú´J¾¾“i/þöA%ìôa—UMƒ# HDzm&ˆAE3 +ÊÆ7,¨ÿù" ˆì®!�¨‹5(Ɉ·‰Ÿ 9ØÉT®—�ˆË‚<âíI�£;ñMŒ�…+ŠZ¯îF=4¿4iÄ}&¦ª£»á£;QѼ¾»ÿÚúÝ­Ýê·}§ªGzfF¾v�ìÉä‹ ÿëó%%�UÿUKòeÖ?~ÎÍR�4K2'®U¤ò¯ÎÂÒ“=uõ×¢ƒ�{% &n!ƒ!£†HØdÁäBdÀÁ#£SDN› @ÉÑÂ"B”S‘ã$f§fbšó¦AˆFF ŒdU"q 2-D´ �3µ±M5æÌè3^™5�4ófu"##äDtG¼“ÈèèˆòfPÈ‹ÎF¢ Ç�Ì…™ÐˆB:/)²ˆè…A‰ƒP˜A0óÍ ÃL ÂN��ÓFæi\ Â5´Âaa£c'‚„ÕO&�ŒÍgÖg#c'‚xFÀÊ0¥D˜M8GɤØFÀÂ5´kjƒÐÍ0œhø‰© ÔF°Â ƒ4‚ 0@òŒ-—á Í@Ã(Ð?FÃŒ?A�İ�Ê Ð #XaÁ„{ ‘ h„óÁ>.Á³jh#ÐÖs•e—“ŸAži;,éØAœi:A¶YçÍ+l´y¥ Î ´˜hŽÚ+A›$4iº¶¨&Ð3�?¤ÃjˆïMÉŸh3�&Òn´�]¤Ú±‰‡& ´Qí¤Ú¶„4D<*‹jì´0‚mÛð� &ÂZÝ“&Òm'I†…éª ‡š¤…ô +ÓNÖõ¥ú· ¼R¿t®J/Mé7 †ðƒh”%¼UÕ[…zI7'u@›Qi-&Òi+W¡@ƒihœ^›k±ÐMÖ‰{DçÕ'KÖ›@¯·A]: ·aIÒm&Ò ¢]ežé7ª¸LûIµE:ÿ¾>»þß¿´?¥»­VîЪ~.•»Ç¾;ÿíévÓ†µ}é×]§{ô�-éou×_]'KJ–é¿ Szâíö£ÿk]é·{_ô?®¶º›iþø}ß¿ÚÛ¾÷׺B¤pµÛ½n:ßú— _{{¨×ºM»õÆ——Þøäpª);ý +ûõjÇÿuÿðéÿ�çþ?¯ÿ¾�C­ÓËå_üÿEŒþ¿«ÿþ0Ø}·¿ûÿHVn¿oþ‡ÿÞ¿Wÿñ[Å׬U­/àý3ÿÿÿaÿÿúýûôÃaûÿ¯ÿþ½¿ýõ÷ßÕÿú­+õ¯ýý‡·ÿÿÿöÿÿü‡ÿÿÿ†Ûÿ÷ÿðßÿ„Pö‚ÿÿê¿þ¿ÿúÿ¥ëÿÿûæbÿÿÿÁ¿ÿÿA?ÿÿølÿñÿðo:Þ a¿ñÿÿÈ#¿ÿÁÿÿþÝÿßþÿÿÿÿïÿßú_ßÿý‡ úÿÿíáÿ œÒÿý| _þ¸A?ÿÿßëÿÿÿá¿ñÿ÷úønë÷ÿ ºÿþïßûÿáõÿ°–ý¿zÿºÿþÐ_ÿþßÛ�wÿ×káúÿþþݯ÷ÿÿþ½»ï_Ú×þ—öþþ¿ÚÿºÖºþ¿ºÿÿ¼=ÞÝÿßïÿ÷ÿç7zÿÿU÷ºÿ­ÍK6¾×÷¯ó›ÿïj§¥_½Ú_]{zý×ÿm÷÷ouþõþ¯ö×ÛöÒý&×öÍ>ÿ_·_õí}-ëû_ý+×í¿¿Õ?×ý½7õ÷þÝöïm÷nÝ~ûKÎWÓïÛ=6_WK[««/ûa/1ý„Øm¥þ‚ÛººÛKSöõ~·YŽÁzì3ûg£�ú´›ûn»öÏöú\/†f®ïn¼ýk¶olÿðÛ3MݺÿZM™ý6GÕŠŠ¶ÒM6Ò  ˜« ±I±Iò8I¦6‚M4í+dAÊúV¡6ÒMm6 5´ÛIŠˆMªaŠb¸l;K(m«ÚIÁé±VÝ¥j¸a‚Ûr/[Aië¦Á‚L#�†iCg&ÁXfçJÕ²úmÂU´­&I:+T�ì0š(ý‘�‘è–ÃuaÂh&˜`˜ šö ˜n¶8lÇ +áÒaŽív*\4Ø& Úv ˆêÈé&�¶‚MÓ¶Þ 4Ø…»I¶MpšvÄ&è1 +“b˜„ ÚI§›aPi¶–LBNM‘Iˆˆq}ˆ>Ô¢ Å („E�ƒF¤TЈ¤] +‹œ¡¢”àÐÊßIWˆ0…œ0@Âd«’a#àaˆ#_+ +áT\ˆÆuâ8ˆŽ8ˆˆâ9e„G¯×ÿþ—ÿKïâ¾´ïúa0ƒ4QKŒ+Ú+Ùeä†ÿþv¤ŽÀ²º£,¢ìÉÔ +2%�3²Ø&LÙÙ$[»+‰U;‹GŠ“Å-™eTÑ(D|ÕÏ%Ñ”¤#±&L3©æ¿ÿü舄Ÿo쓘<#@a’3DN‚ ¡ aÌkœ2}�ÈôœÉѶˆO°Íf0Ar>�GžH˜xDK?Ë™ Î$fK3h è�Á„hh„ó@d4`Ï£dpd€…åÅ=Îa�02#ĸÊ3HŒUÄtG�2ò""VF°XåŸàÖE¹��Å52�ä1J53PÉP@Èb"%õÿÒoI‘ðMª…íM4S´�&ÒmA4,%i§ ˜f�TÂh!Ð ÆÛ‚o'¦ I&óò[TÕ4 *AÒ û+¤Ã +©¦š7B Ób˜?°�Â=µAè<ž!°“ OÁ%dîG‚˜Zhüø&­Á²~|„nf�P�Œ#`xGàÑñØF·Û¿KÕ„“ G4™g‹¦xħIÒtK¨—4›Ce�6º ái6}Òõ¡ÒÙg«iŸh3Í Úú +Ùg ´0ƒ8Gš †—Ÿ6še¢fÒm'3†gT�-–ŠA†ƒ8j‚¶˜A¨gšNˆ¶Ò·u ¤Ú“¤Û«jÛ,á?Ø~“õïOÖÛ^˜¥ý]7è�­&÷¦´®©õõ’wÒoýoQ[¥tJ5Zôû}?¥kÂnz¤ôî©]:­¿U­ÁZ_ÐÕ¢v±Jô´ž”{ÃÒý]+¡ý÷}E-ÝÝmÇIñ­õ_ë߯~éá:OÚ— ¥n-;ê¾í¯¾µ»»îºÿ½;þÚÓ¤›¿ýª¸¦º­¤×aéö­»õ¿ÝW]Zý´þ¤pµú ô‡õß·¸ý¶žµ#…_o¯ÔŽ/ooz÷JßÔŽ¿øë¯íHá{��GþÛ—ÿÿÿ°ÔÞ[Ÿ^¿þÉOøû¤¿Mÿ¯ÃEì–¿ÿ- öÿöI'ÿÔßßdŠ÷^ˆs܇ÈÏ´A)E¹*.ÃzKõ_ÿü=ñýÿèkõÿõÿ÷ØOþ�ÿëý¾ÿ¯¯úBÞ¿-?þÁËOÅvÃj+ºïÿþÃ×÷ÿÿÿÿÒ_ÿÿØÿÿï×úÿýßÿuõé{ vÿöÃàŒ?n¿ÿü7‚ÿÿÿÿø#ô‚8ÿÿÿÃÿÿûcþ§ÿÿÿÿº)ëÿ…ð߆ÿ·Õ¼ Ÿ´ÿý`Þ�ÿÿÿÿø BÿÿÿƒÿÿÿÿøIÿÿ%ÿÿþÕÒûðF‡à߇ÿÁ¿ú ÙÚÿÿ¾ÿÿÿû¿Â_¤—ïÿþßÚÿÝþÿÚ ÿû ?õÿÕÿú ÷¼7ÿ†úO¯£kÿÿÞÒÿ[÷_ÿþ¿IºÿuÞÿÿøëë¯é~ÿöÁ°ÿô¿ûßw¿£Ê½tž¿ÿÝõþ¿ºÿ¶ÿ_õ_×þë8�÷¯ûý_û_¯û×íûõÿ½ßß~¿¯Ý¯ßþ{ïÿVý×ýÿõô¿Þ¿Ý{ïµÿvþ½w×úö×÷¯íÿoÿΑ‹½»É×´­/ùýýý6N­~é³?î¿Û4Mö·~‘Ÿ¯¶—™ÿu·M™û×ýšwéßéi{ÿÚùŸ¶kF}?úÚßí÷M«mÝ×A_Á°í¶ÐIÛeûUÖÒa‚Qýa%Ý$׸aX{wavª«"¸v_ÛI;µ·I=&ÂI¶’kjà 6ž“Va{ å #Žô´¯až¤WËûÂûSí³ÒpÞ–Øg/Áy7Ý6ô›=ížÛ?æ=*a&A Útí°’iÅ&ši§i*Já4ì(b�aIši†!1Áööž\X[›i*vša†’ÃIŠM´“M;b4¸4á†*Û´­šlSÅ&a šObô馤q �‘]¶“�ìRlSÅZTUˆ Å¢±ƒL!eQ†!¤Uà rŒÓGÕƒÁ0ªUÑíÑÃ=´k±H¬£Û'‚4C2q `ˆ4HCÂù B•…aWjVgÈb­'P)ð¤ +:GLÒ4�„$‚Ò+8`˜O QG]`¶š!#CG†è¬mb(ö턘Vš„Ô‹ VȺ<6a4ÅR;TBåuˆì·â"9ÚR&x�a¤vÆ\€Øˆˆ‡;R›ÌUñqÿ±×Òý%Òõ¯Zßé/¤•°‚ñ }-°’i¯ˆÁ±A§AŒ«r­Ò5´|@`XoÿòKâ2%f|‹4V+ž*±6êv>§bx(#Ä#=NÖZ©Ù£'Gf¸/ON’Òõô“N¯¾ê4;_ûöºõ}Ýö¾UPãùRÿòh‡éú®Y†·ä£õúÿ¯úúò3†â(ȉ2¨dZ5•š8dº#" y.4DÂ'C"û#Æc,…‚‘¬Ù�P2q“‘ ÍCDS‘�̨Š�ÊÃÊú8‰óã!�Q§ÔdlŠs!£‡’c($É2%Ù"Ífu`Ž<œsõ£cÝdü™Ï�ätg粈 Èfr £ÍZ¦d��pgà�ØõF¶°8Â5´hjaF¶í„{ ÍóXi£àz`�Œ�EÈ#cM<#@qž0��+‚ #cö¤L'”aÃÐÑ 3œÖ £0�a£aæh AÂ>hi6–î­´*a ÎZŸk¤áa¤Ú¶©=¤ÜœÉÑ6“Ë:tœ",4›IÒ®b‚ ¶ZpÎM¡¤Ú"¸zNÓI6‚vZ(ÖÒm'Tx "#‡ªM¥l»…H6¡N‚µGŠZMäÞ•¤õ¤ôµtêé¶“ã[ +ê—¥nÒM¤ÛÐ¥pƒu⢗µWÓp�+D�%hoJÞ’´·½+]D<œÞ �'qT›MèR»Òu*šû¤þ¯Z[Z]»ªuZú߯֟´ë®–ºú·¶·A¥¶Ÿÿ[WöûKÛwߤ¿JöÓ_ÿÔuÞ£ºÛ½{ý÷ê/_Z�÷^ÝwuÖ¤pºÞÞ\#Œ{}mÔkõ¡Ö÷ߨ׿¿©+N—wEŽG?õ½?Žú÷ºHª,}çòÇ"ÿ±ßìä`Zý ˆÆ¨‡GÇÕ9ký!÷ßt‡Ý^¸}߯¿_ï×ëƒüWêZ�°ýöúÇ–3õÖ?ü°_ÿÿÕû‡×ƒÿÿÿÿû{þ¿õì5ïm†·®¾ÿíê߯þ´ûþ¿þÃ_­¿ÿþ¿ÿì?¯¡ÿÿ°×Õ†W¯õÿÿÒÿÿÿýý¿ü0ÿÿÿÿþûðAÿø6Ïó=Ãa°F}¥ÿÿþO;ÿÿ’™ÿÿgÿø7ÿ†ÿ}/ÿäÆÿàÿúOÿ~ ¿K-ÒÿÿÿK±ÿýÿþ/ÿÃÞÿ÷í×¥ýïÿ¥ÿþé}·m.Æ÷ÿþ´¿¿ý/ÿô¿¿ÞÿÛ÷¿ëëÿ¾·zýõwºU¯»®‚~×[ï]-‡oÿkë¯Úÿ×»ÿ¿wï¿Õ~ÿ§]ÿþ’óê·õÓï×ûÿï­×^úû¯÷íç“û¿Û¾ëÿÛΟ¥w¯ß·y§éëç?¥í½ÿ¾ÿÕ«oþ×Ò×ín¼«öþõ®ÙôÝ·¶÷IsîÓöÓëÛ?°û»lývÙôÝôr·êÂ(M¥a6Aýž�´´›3[gý.ïlüÚg«öÏÝëÂöîïÒþ›?ûvÚTØØàÁvÆÈù†ÒM>Ãi¦ÇiXA1A�ýa¶¬BMXÙàv•Ça(bô­Xf ¶*Eö•¤Æ˜c°’r+½Šc¸4튆ނ°’i°eÝ·"óm$ôÒb“M�é†#„ãA‚ib¦îáSdp˜ôŽƒL �=†“A°ƒNÁ„SV�4Ó‚ B§°Âa0 +U•a°²>‚¸.ƒ ‘Âß +NöGIiZaŠwi[JÓ ‚(pˆè0–Ã% +ALŽˆð‹�¤¨Êh†„D1B#¹ˆ†Eˆˆb†Lt"5 §B8ˆ‡;Jpt]§Gd؈bÎõqDqWGèrÜÀn¾¿_ëÖµ¯¯ÿ¥ôµm-!øû ”¾šl…\>šp˜Lkê È ÿþZõ¨Lì­�‹²fÈ«%¨ðÎÖ†J_Îõ~gTAžhø*¯ÿÞ?á ßÝéÞºz¦Ýþ>>د�%YTÿñVó²ÿ[ÿÿYj �D¾iñ¤kˆÈÖÔ‡©­Ð\äSä|ì×R#æ¶SžA—‘³"è§="`²A]N™tUx"á£Ø2Œ a(Â2y†O aSóD�˜™ ” l„#8$¦�°Ê a„k“à�o>xF€ÍæòSÖá!Ù¤`d4HL!8(eD]“á ƒa Ú#£ÃM!)ÓÎÒzy1èLuaÃó9'H6‚l œ*OùO$Å6ê©6ÚI:M¡ 4Ûzt›TaÞ­&Ð aº‹ ´´Ý-'hRm¡Å´· ©iZM¥¥CÁgð©0°è2íÛt–‚¹?aPO,÷KA†ê×~ÛÿÓi=�OúÛô—ëi>ŸWëý:«“­ï…wÅ'®�¤î×»Öÿúߺ—kÓ«¡jßþ”oOø©Õ¯R8V›z®ž½×¿�Z\=[ëÐÛ[­:­w‡¥/¿û\pÒÿõáŽÿ_þ¿‡×þ?þ;uì=-ÿÿhÒ·®úßÿ××aÿúMÖ¾¿ðì.ý¯é$ÿë°×ýÿÿ·ÿþ¿ÿøn/¯ô›_ÿÛ_ÿÿåÿ†ÿÿëÿÿ Ëí¥þ¯ÿþ 0Fû¿ÿÂ_ø7ÿûkÿÿƒtߺ_ôßÿøp�?ýý/ï~ÿï¯÷«÷ÛûAkßÞéßÿô¿}þ¿vßv¿¿ ûûÿ[î¿îëÿõÿ÷_ïýú¿÷ð£ýõíëßëöÝ/ÿ_ÛÎu~ß¶¶ûùïÛÿ]ÛV÷ëo4ݶf¯ý~ïíz·_ìúk½³=´›ï­³?Ù›øg÷«XgûKnô»û"� „“OÓMƒnÔ1ÚR'8L‹m0Á‚û!±M¤Æ©¥wií±i†)°“¤› Ñm¬0Šv�Ãh$Õ4í8NM‘Ű‚a0ÂP“MˆM&ØM ™l0ÁG]ÒiÜ•Óa6‚ Ž!… ”1M6ã§´àÁ1 +VDDedDDÆ Á�µ+ÚÛ¡ Q&‰Bs± ÁžG"6…‹*he2'¸ˆ�ˆÖº×þÚ]´»œr+r›H§j#´¬gVb5FÄ YØB(á�Òzpðƒïô¨‡u×Öºëô½QÇK� Òé.â’ùÚ" Ô•/ÖPdíLÁ²vffc0…³P&µ ½aU5ÖEä(Eâ®–‡Kƒ,õïGŠN‚ Ÿú º\#¼#½'K XJ‘ž–Y¢™f…-ii/J•%¥ ´´¸J’AI·ÄÚpNºUT½%¥IRéicA-JSP§f’ëñé,Tt•%Õ$´·úÞºJ«­*ãIRë¤ôï¿ÒëZâ=R¥¤¼}¯_ªU­*ÒKJ’–hO2Jò¸…™õÒ¯Ö’…JI.©/ë¯ô–•i}bµZä›;äwD¥:;Å�“Db; &j_êýj¿^ +©UK0gÙ¦ˆN˜ ÍlŒÍ‘@¤hSqŒò/œ(D¨ž�Èñ¬Î’”‘’h¨²9 "¹èØi¦�}˜TѬŒ¡b�#Òá?UI‘߯¯Aþ´œ;²ÐÏ´ G0¡n“TÛ´­Ë@M¢,4VRÐ3Œ%¥»«h&ÐdsIÚi]–„Ú àÎ4¯I´ ãIÚi¥e¡ŸtµTJmWIW§®gëûö®“ðM­(õ‹üm¯ ´žŸ|kA4¢ú�%u IúºµiúWß×¥œT¹¾�ëæ× ’7Ñ´©$q%ÿN•¸ïþÿªoZ[þ¿ê›�ÿ¯Nÿ«m={«õé,%¤©*UJ¹?¥¥®–•þÛO½=ë|{½u¯_ÚmÔ>7úõëöýÿ¥Iii*ZZZÒM ´´•-,$?þ¿ÿÃn¡è±ÈÏñ÷¬‡,r4o[åŽI¦ÿû¯ÿZ¤…EEE%QX[ !QVŠ_þ¿ýaëÇÿý~;Ó¤?¯ÿíëÿON*ª«éŠˆU ŠA/ÿ¿ýì6é‡ÿ¯¯û¶ÛVÿõ×û®ëþ Èp¡UB¤¡0š® ÿÿûÐ7¨oÿÿ&/Ã~Ãé‡ÿ„qÿû«h§¯þLxËË +˜L*¦B„ÓH·ÿÿ×¶�oÁ¿ü#Gýþ Þø?þOÿ· Û¯ùjÿÿkþØ"‡Ûtÿ^—þýü7iÿð—ÿØA:ZÿÒÿÿÿ¡ö!ÿôíé~݆ýþ—·^#{¿ýýë¿ o÷úÿúÿ{ï¿ê¾¾~‡ ê·ÿkþ¤Ok(^ÿë÷¯jy;å'æŸwÿï^®ÿý÷¯øf?×¶ïÕuoÿU²u·M7[f‹ó?öÿ†]×ÿ°Œ;o³ ÛKõd0 ¤÷YŽËÖÂ;»ÛNÂ8á·wL0It½,ÆÃ +¿qw¥ìA¿ßØ„Ûq„Óm ƒU¶ÛJ›IŠb•;b›TØìvm&*õ{Ä+TîG 6H5oh&Á¦ž·¦Ûawk¶ìC…A…xZåCÃ%4ÓÓ#Ð%d],Š„AnÝ„Ö Röž¿H–¹ª(b96Îų±tPÎÔÃuz¬+×ÿëªÒÕé-/ÚJ�¶•´Hm(a‘ζBí`GÊâ8ˆÿþvB-�.+�FHŽÅ6£4‹pØH�Ó¦¦J ¦�!,Î;3äC +ipëú÷ÿáýë÷:æ3¢'úß[XkhƒP�Áã� žIqÇ4Ç2ÎÕþWðúA¿ ú®¾º¯¯ª ‡þ×<¬Ôˆèì¯ÊHèˆÿåZ ™ØÉH¡‘¦§Ró°A‘35NÈm2�/JÙ+D¯Í½>tDx�" �‘˜D%1ʲüðG„b‡r<Q˜P‰àØdk6Gg“ž0îG„a“è7Iy˜!à�’3â>È„i i’è#C$f #À4BLØpg‚éÑí›#æ 0EÀe6¬ˆIšÌswTœˆÍ³ó.†‚4Áá(YBD%’òÙ NÓFvO°Ü ›M4ÓðÈ9SMzi6“¦ Áþ~TÓÜë4’´ÓGv¾“L&Ñ#°‚dº©7&=+I¿I°úL�%ɵé6—ÒØI´�Bjò8iá91×]Òm–ˆ¶·- °ƒ#šg ¦x�0‰Uµ +“i:gópû,ôÏæ”0–ê|Å´�§ +§Ï[éG5ÜRmW䦪ז„Ú^µ¤õ©óK‚l.­ MWÅýw^š§oëqýãO¾µ¤ûÒþé}{ºÚ½4“éi?ãë®·‹¯¿[i:ûMý«ýëí6…ÚÞ�é½Õw§ݧ}RúݧöÕßõK¡¯C¯ïöëRá/�/Uñ­ÛKÝÿmjðÿR8]ýßßô8tÿû¿ª®Ú_í}{ê—¸þ?ßÿÇz¯þ©{×Þ¯õîøòÆÿÛùnJ�ýÿã^?ã¶¿ô?¯,_ðßÿEÖ.¯×Ðþ>ÿí®6õÿÿÿøÃÿÿý/¥ýzÿÿô¿aþ•ûJ½}Wuÿþ»¯ÿÿÿá¿¿ÿÿÿõ×ÿm/õö¿ÖÃÿëõõÿ¿Z?°ßÿÿÿÿíÿÿÿþPÈ÷á{þõ�_äM‘߆״›K ÿëø#?Áÿõ·Zpßÿÿÿÿàßÿÿ÷úþ¾—þÚ @Ÿ´ ü?¶‚m,¿éºÂ ð‚ÿÿZØoûÿÿÿü7õÿÿßi¥·_þé~—á¿bB¶þýu´¿Kÿ÷®î¾ÿÿÿ×Ûþ¿ÿ¿á/õïþÄu]Õ}ßF¾ÿÓtéz¥õÿ•ÿßÿúÿýÿÿÝõÿëÿ槯Úþþ5¶Î›÷~ºßõÿÿüæ×ííÿÿõí�:ÿÿý·õ_×öÿöÿÎʺ×þ¶ßéº}}WKýÿ¯ý¶g¯ÿúûfkÎzí¯û}Ýÿ¯ý· óÿfkÿ[¶Aø†9™¦Ò»oÕÒ‡w¥witgÖî›/öÃ7dw`—®«§uöé4þïËʺl3Ê×l#ŽôÖEpëÓ‘9¶œ6 �°Á(pþÒlºÛm† ò&ba‚û féwi2(ïKÓ‘N�¶”PTئ!! Ó†ši§ØA*aŠm&ÓM66! ÓOd-ºvéÚl'tÓM„ÈJ4ßbƒ�ølQöÛ¡¤Â Sb: 0�b'ÂPO^I5¶ôxgI‘¨E<0a4ÂGÊ>²~pÚ=Æ�${>Œ0LŒôVQ¡£Àm5Ëá2Ê;g}qÙ•q>wŽŽì)’0¦T”¨‘WB#S%A�È®ƒ³íRs.‚…é5§¯«Ë²]Ãl/¿Òuþ¢ûþ£ ­Û¯¯Ô]ÝéoÓú[û´íl' KùI¸çiXâ‘ÙWþÞTÑ•Xæ˜ãßÿýpŽïMÕªÿÙÚ„Ÿ’~Þª@Ö™2Í_�õΆF‘DÈÄEVU©8äAN›2¦�‘OŠ}²MåX¹Äs7—ŠCòqD9‚¡‘(|&åY~E™ HÌ “#„g­&UxF€Fð–D# Œ�–ˆL!<Ð!j`g[Hf//S80R=ž™‘èF°Õ„F{ +™Fš6#ô~'LÓ'äæ||SAÈ4Â65 ©ø#`dð&±£d«ÌàL&VÖGç㨣ó'“Pša»H[ôѰÒ/}#Å£a/65 £cM4{yý mS)à¡N}5P�›K3•¼'„›ô›M5 „aépÉ`¦�^©„g ¯h#s¤e«Œ3†•ÈÝ¡¤ÛTªÛºO´Â +Šº=´˜a4xl´Rma¤Ú Õa„|i6“„›“:mG4Ï9VÒyhOçÍ&öônÂe„N‚mm ›il³Â ´ÃAœ&Ýùg ÎiZXTœ ΖËAg †Ñ, 6»NÐ_Aœ&ÐOÁ$Ý+úu¸ Ú'­ÚU½Ô}ñaÚ^-ëMÁ:VºÁ1V–”.ÚVéÖÅ×ut¯n×zÖ—‚µäí+ëÝ=5þý5¥izð›Õý^NÕ5¦;ÿÓN¾—Õ·é×ÛÚýt›ÿtºuMÝõ~ý'úWTô¯�Òû÷ý½mÖ½mÝSqKÝ&éýÿÿ}wt·o¯Ò·ßoIýûKÒ[׿¡ÓЪ·Oÿ~®üºÛN†»´ý}¡ûµý}þ¤p¿êÚ_Çñõî»í?þíz‘Â¥õ»õ×·Ó÷·ÿ¿^’VÿåŽF“oŽº·ðöëôºßëôA&¿ñþXäRu½ü~ÿär oH[¯Ñc‘Ÿ¢Ü‘ãþßÿÿÿ³‘ñÿõßø~“ýxúRÇ,s§ÿ_ô¯ëøÿ-?ý¿—_ÿÿ¿õØ?Ò¿‡þ?Ž¿_ÿÿþ�¯®ßß_û µÿýt±zú_ïZþÃí/ÿõÿ_ÿÒ¯ÿý¿ý¿| }uÿÿÿÿÿÿ¯ëûÿ°û¯þ½?ÿÿþ¿øoqÿÿÿÿüÇ·_ÖïØÿïïÿàŽ?ÿÿÿÿÿaÿ“²;ÿÿÛE=ü¢ÿÿ¿ÿ¶—þó ÿÿÿÿð–éÿ„ƒÿíúx¶ÿ ÿÿÿÿÿôÿÿÿá½[KÿÐO·ïÿ¿ÿÿÃ{cÿÿÿÿøAlWÿú^þö+”ïmßéÿÿÿ¥þþ×ýÛÿÿÒöÿÿÿÝŽßïßÿûu÷ú\$?ÿz^ÿûÚW¤7]é×ÿÿÿߥõªÿÿ¿LWÿ„½¿Òë·Öíý{ÿ÷ÿ¯ïÿ®£{×úÿû{êúOþ¿ºÿÿÿí¿ªë¯ïKû°ëÿÿ»¶¿þ½û¯žO¿ïþÿ·ÿ¥ö¿ê¹¦ÿû¶“v·íê¿uÿßÿý®¿_ý¯ùïßÿÕwnõþß[oÝjµÿÙ:ÿºöÛÿþÛÞ¿ío£ËöͶ•òŒÑ^Ù¢õ÷ÿÿÿöÍ®—¯½ôÿÿë¶ÙŸµÛí³ý¥ß¶“}¥¿ì0¿{¥özm?_ä1Ìþ›i&ºz)ÞÚIþØ-»gÒÞÁ¶ }‚]£ŽeÒ¶’­­¶ãÖËÚ}¶ 6Ÿ"¸v’r+‡˜öÒõ»J�~Öíá­¶ ]œ‹•b´“ ˆ9D+m&.ÒZTÓb•9-¤š†)ƒÓNÖØm±I¶•¦»bÛk Ó ± 7dQÂÓdbb“L1H6Ç�6ÒNÕ5`ÇMˆIö›Å&Â{I8[m¤ƒ4Ó´ºM0ƒM4ÛN¡†’l$ÓaYrMÅ¥ 0”•ÛJš{ +ÓjØ4“¶´�­»VÂÃ`Š'Ýý2:Q�£Þà 7m;™íOï°ÂžôÓR­†@¥['ÑáŠ<7¤{t�…M“èøTÂd­J¶ÕB#ŒÔši©]böå^xhÎØ¡ášhÐÑðª0��´Ÿ3à +„"2²0ŒŠ‘ز"ìÖŒ´É̲dì›Ò-ëAÄ\F"8ˆŠºOˆ�2)I:ÿ].¿]uõ´­W‚M¤Ã/{Ü0á:-Ö``‘íÈ ÿþYfŠê¹\‰„Q�ª&Œ‚gjqßÇeã#TwU;Q+¨�xR aáB„aØ)¢#H–2P•TÏ!b‘Ñ€™/‘L)?ò!¨ŒDDE’]’õ›5TéõA5¦žŸéñöŸS‹¿_§púC‡Wÿÿæâýÿ¡ßßÒÿ_¡(_û¥·ÿÿ8ƒ½4v«hì­Vøþ¸Šã¾5øŽwk%__¡+Ýø©%Çÿÿÿ}u÷~«z®:ÿ¯ÿéü–¢:"v’JFÒ®v*ùÈ«ÈÑß䬈c! 2#êAšfµ‘¤K°E< gB*�Ž3¨r0ŒÑ0<ƒœ2RŽ3æHÍžT  U#äu›"@‘ܟ/œÏ"ð!HFØ]òtlŽ ¢.ÎfódAsÌâ(Í‘ÐÈñ#0Ñ 39�64BÉ!2`Rb ã=‘ò`h„¡\|#âVB ð�’4|  ¤\Â5†à Ç“§:™™„k =†ˆJ‚i„h †‘ æ€ò§Œü‚Ö<¡���ÉÌ� ÓMÃð™F�lרA„Õ”aF·é„hqÍ�ŠŠGæšhÓA0šiÚºþ–?Ö?×Óôï»ûÈy¾±ûMõþ?¼?¯µ÷ýÿøzÿâÃþâ¿ÿ°Ñd××ÿÿþ£·úÿ®ýÿÁÿ÷èºÁþ¿´¿ÿû­ƒÿßýÿý‡_úWÿ°×_ÿøëú^»iuÒÿúÿëÿ°ÿ÷ý‡ÿí×ý]vÿÿýÿý†»ÿ¿þÃú_¿öÿÿzÿÿÿ÷ÿÿÿöÿÿöÿû£»¯ÿðFÖßÿÿ‚,}ÿá¿ÿïÿÈɯaÿÿƒÿÚ^t¿¯ÿ5¯üŒßÿÿðoÿÿ! óOÿ¯¿þ‚ÛðoÿÿÐ_ÿÿƒßÿþKì Oõþïÿ ׄí¯á/ü ¿ÿÿÃÿÿïúOÛK¯ïü ½,7ÿÿè/ÿÿÛõÿÿ÷Jý/ÿ÷¿ïð‚ô¿¯íº_ï_õÞ¿Ûÿëí¿Â_öÖë~½vÿ_ª_ÿÿ»ÿîK«ÿÞ«mWÿðÿïé¥ì?ßT¿}/ïíßÿ_ßý{ªÿëûýz½z¯ÿÿ½·_ÚOÿžN¿¯ÿùÅ»×~—ªÿ}¿ÿÿ{ûÿç“ÿ­{gMÿ_Ó·÷ÿþs¯ÿµõÿÿüòÛ×öÒoÿ_]¿ïûþÛKÿÿ}»­}µUûû¯õ¯ýêÿîôémÿêׯþ“×Úÿýÿum×Ý­ä÷®ÚW{gÖ¾ŸýÓf­¯ óÞ»VÃìþé_÷Ý··«¤~ÿµÿëØgöÒÿþ÷[}¯"Ž·_ki6’m˜ðŒ8;Û/*ÞcÕ= Û¥®m6m­¶_ÿO©w°ÂÈ®Ø_a—Òa‚M ­†CÓm;/ȃ‡êÃS†ÃI´­µM�ƒnBØí´¾ÓM´—M;-6*Õ‘q­°Ù: ÚH64ÓNé¶’i­Ú ´“Šb*q +Ó ±PÓí&BѤšl†!ÓŠÂa�á8A±P°ƒ`Á Ùa¤Ä&H&{§i°Ø'ÚM‡2"[Ú†GNÂÃ#z¶–a5NÂI¦šéa„Ú +Û¼+NØ"‡VÉ]>ÓTŠvØýô :I°©ÐvÒÏeaâÂh�{Dt!„Er„Ða#( +ˆ’:r°«(1 „2¹ƒ4SÛ B!óÛ (@Řb8FV4s¹íƒB"2’šÈ,„ed„@Ä!Y.ÊtHB2.„DfK9Ù¤Á‘žå‘VŠþ¾–¿_îº[ipUdQÒé0xH>ƒE~"#ÿùüìùn/ FDFK1n•”e¦¡Ìƒ9É•…9æx8C¹g+ lA“*Ëó¹g=‘œ‰B¬—.B'*Éarˆ¢ ¦`e –r‡‚"†™Ð�æ˜@Èa$l2B3�£‚žreUœƒ8< dñ�„k2(ÐF€ÌÆ}„©œ\Ïç~'G3L a2s&r¸Ê!GÆlÌÌ#XxL#\ØÁ$kxFÀÌà˜MÔŠ=}¦�Œ#[‹Â ‡£ó äÂöCaèlQ„˜aé„ÒôÕ&ÓM)¦'°¡4ÌÜŸºk„þFá¤Ú +Õ5L#à XU ít›ið� ¤ÃÒ „™,P’uµjÁ6ˆá �ð­É�˜i;é7#¶“µI;- ´Æ¡¤ò\š_ÑV ´¹|ô›–Bl.•¤ÚV­0�M­ Î[,âÒuGºM„Â8aYb8gÞü´v}«kÁ6•¤ÚgØLñ†Òp©ž=¦™hVOm„ÏMé7MzZ´®Ò¶�:îén­¨»¤ðMÓ»TúV”Bu§z_¡n®ž›Ò·V÷«IÒµ}m-'IÞNÒø·Œ*zªvßÝ~–£AÒµûÿýþ´­z÷ÛÒµÞ’}×¥ûKþÝ'ý'ôÆÕ1ý¦Ÿ¿ýµ×ÛÿJñ]kÿ^¶µ÷·÷w÷ÿ÷Ó×}ªë»Nén×¶º­í:^­×¯¸»kJî¯ê¿wê;ïú‘Âÿ{Óþèuï©/»©- +‘¿Qþõý}oÓÿïô»ß#…Ckë¯wúã_}[ë]º_~•k¯ñÕáÿ\=(ÿmëþÜýü·\ò3ÛTC�__ÇÞÿÿÿñá÷Œ·+_øïûk¢ëÿþ¯ÿ_¶¸ÿú]\?¯a·°ô‡ø>ÿþX¯}!ëÒ!®¥‹ÿøÿÿÿöé$?úÿõé×öߤ¿õ^¿úì?_aôÃÿØmééÿÿí®¿ß…ðÃÿÿÿÎêÃÿÿÿîÿÿ÷ÿ¦óÂÿúÿÿûûÕ‡ÿ·¢�ÿþãÿÿÿúÁÿ„aþÿÿÿ×à¡¿ÿÿþ�/ÿÿöÒÇÿm/ÿÿÁ¿üzÿðn×Kÿ ÿÿÿÝtÿáü7ÿÿÿ�Â=Ãÿù:ÿÿþÿÛIÇÿïÿýðßþø¿‡tŸÿí/ûïï¾ë/ÿÒü7ÿÿÿý,7÷ÿáöÇ»ÿ×ê!]þãÿý÷¿ß‡a‡ÿÛû¯ýÒÿÿßøv¿ÿ¥ûÿÿÿÿ]úßÿKÿ¿ÿÛTbíÿ†þßÿÓûùÙR}÷ýØpÿêÕzÛÞ»·ÝÒþÿ_ÿÿÿÿégêÝÿÿÿíßûuô¯÷ÿíî¤"¿¿'_ŸO¿úëëý¯·ïþ¾s¯ÿÿÿúÿ[ÿê¿ïíÿë¿ïû·í­ÿtµ{ï~ßê“ÿôßõ·o[{{·k÷ú¯ÿýÿkßûîµlÍY§~«÷홫ÿn¶Ò�Á_Ûóõ÷¶}[¥i^ÝýWWg¯î¶½m&Ï÷v–Ùÿm-³Ó ôÙêé³ÞÆ»w|Šàõºï¼Ç¯vžcZÜŠ;Ò¸L0¬0A~«a‡ª{L‹Á… œµTÝ%´›Øw¦Óg}²(åÙ;c‘}¤Ú²vÈ|§a'°“¤ôí&´Ó[IŠÛ´“b™ÚH6(1LRtÅD'Mȃ©M*m¤š„Ób�i¦ÁêÁ§M`žI„˜ Å&šv›nšjŸLSš ˜a„�a´› ÃÐiì‰í=Ƙ* 4ÃJ ‚ÚM6+bša&¶Â[J°å;Aº<4¬0¨6§V &,&šðÓL+§‡²=<},$x¢±‹B�Åz•nŠÆ� ÝŠ•ba9Ïl¤É~š(Í2|�l ÁFÃÎcÉö �Xb‘épäftÄ#®ŠD! ÂÌ•ƒ©" „DE `„Dh2‡+aË-†å¸¢s±½Ì”dØ/-%0ÝE_ô¹¢ªýjµÒª 6‘›,‰gV+ô*jÿü·Ë4ù6W‘l·ŽÁÒƒ2ˆ,���Ä’+ÝåwaNÖ¥ ”¡œ¤¿gk„xªª•‡�¶¦pSFLïÓÓÓ^“ÿþê¿æóê?‹»ùÙ®tÿ÷K~·Þ—¯ûE,”ÑñpÖ#ú_�*kò+ÿ‹T 0ürgù1™-ûãõÿÿuI‡úú®?Uõ_þ’o!ÅW5çVdˆè§^¥aˆ�"#LjNÔÕ³ ÑЊœjš³L�–P� Î2]”Бä`dcÐGTœgAåN,‰QN_,åa- ‰ §V¤6@¥*3y f¸‘œ26D1ê®DY£#™ÌÞxȉƒ4Ž`�a�’fpëR!‘Ù'dù²$fË(DˆÃ3FÚ!&sšÌAà>Ì# ŸŠBÂJÐ ž{ #Ø3ãdüÖ¦`Éx høÑ c8AÃ(Œ|Â>?<�ŽˆL=†�ÓÖF`Â5°� "¹áF°óæ�a¨AmOí¦ŒìÎLö§÷K'G¦(ùžÃ'ÛP™D©„k#«Õ¥ �¶*�É6•¤ê˜N…´ 3�M¤é ÓAé¤Ú·…IµE;WVÔ"Ý¥¤ôܘõ´ƒm:M íB40“rg%Á’ 4>_#º¤öN| ›e¡Âj“¤Ú¾“i7ÂAäÓÝ–…¢;iaèi:N‚¶ì$›Õ†ˆ°¢-´šé]-&ÚiPN“jè3„y„›IÕ-+SæùáPN»,é&Ón�'B ÒÒ×qIÒmØI6­&é[µÒV‰?¥~kŽ’tŸI»#žéjúé?Kn¢êè'I÷D�/Šé{¯¤Ü¬«ëÚZþ«þ4íúZ«¥í»~®—é_¨×M¥¥¥ë­ê—Nÿ{½$ÛC¥�^Ÿ]_îšQüzÒ}“¥¾º]’tÒu·IS×Û÷¯ªÿVÒt…SúÖ÷zÿz}Òý[§µßõzúÕ¶üŽŧR8^Û_ô¯Ýÿ]“t7]õ¨é}m=u¸¯k뮦Úwk_UÒÐúÕÚ} /¬v­ïÔ}ë~Ç­zÇǯ¥ÿ�ý[}+ÿ‡q×÷±áãÖ’·ÃÇõÇzî´…ºJsÿoÿëþXæÑ«òëùnPåÓ¸þûÿþÿúÿõ}qýžßUú +ûõ¯°ø~ºUðõú×öýqÕÿÿ×סzÒàÿÄW×ÿúýoØkë¯ëíÒ_þšÿi°ÿØ}Wßa«^/öÿúí¯·ÿÿí×ÿ¯þßÿê¿þ«ÿì?ÿ×_×ÿÛ”>¿�‡þÃëÿ·†ð½þßÿ„PÿØõÿÿºé7þÚþ ÿþÃÁÿàŒ?ÿÁ²®ÿüÑ‘ÞÏöëÿô›_åŽÁ¿ð~ÃÿðÙ­¸oñæá¼éÿà—ø7þ¿ÿý ¿ÿÒü7ÿú Âÿþ/ÿÃaÿþ/úßþÚÿõaÿÃ| Oÿƒh,7¥ýþ„ýè'ü?í×ÿþÃ@ºëíþ÷ÿü ´¿ÿ´¿ëÝ/ïúô¿ëþÿtþÛÿ¿^ýwK„»Û¿oKÿKïvÿ×ÿ‚[_x{áÿ»õUúëÝm}Òýû××ua¿þÃ�¯mÿߥ¾þëÿû}o¯þ¾ûý·{_¨õÓ}ýßþþº_ÿÚ_õç“ÿûé~·]þþî¾ækÿ8¿­÷YBë7¾»{ºæµê¿z¯yÅÞݿֿ®­¥îû¶tÿÛµÿô´½ÿßÿUöû_×uvÿ¿¦ëÛ_þë®Þë߯^¯·u­íÿ·ÞßÕš{¥×öbéºo³E÷fk£—í™íþ¶·ëðí~Òû¯ûÛíºìúý³?w×ï£×ÿÖÕ¾éz¾×øg×m¥Ý]§íúí¯G&Õ†ì4¶ÖÒïdªºL=†Õ†rl-­ëØI½dAÑGJá{g)Ãl¿n’§¥"íí‚)ò+†Ù~EpÃ¥M…ÓM† 2) nwv–CôÖÒ܈8l3s �¶•ÚR+¶ë†aŽíÒ[JE¶M6D|0ÃMŽÒ¶E{!CLVÚ +ÒUM»Ã &E{I±AŠºÐi¦„ÆœöÂ…L1P\Ra†’w & ÓMƒÃÁpØNÃI Å ÓL1Tôà &تˆa4í‘S¦Á;¬6N¡v�ZÚ aƒIÚ „îšmné²8¶‚ÝÃN†*@®ôÕ!„0DSÈ´­Û ’ „ÓNԄЄ¬èa„àÐa"¸£ˆF¬žLšUå[ƒ4Ó1CjÑó*á— B Ä#_("!IJ�ƒAˆ#^ 1OeB­�¢P„D\íePˆŒ¤G2YÊëtÌãqdP‡ +õøÒý/þ´5ô½%øí¥_Xb)§°dl‚˜Ê¹P¢"?ÿ) <í œŒ„Žv]”E¹¬vFv¢)qVÌÈí+;Nˆì›–25…Dø*(vE„ŽÁ#˜PHš0¡Lò†GhãȾ$æEã/Ôˆ”ž; +ktl#ä�A ó�'A OÉUÖœ&‚ ïIôÿ[ÿI¤šÒT—¿ûê*;ãïý;½EGßwÚKõë§iý­v»I$>9¢ñÔr²¹ª; Ž9 ‹æAKÒ>v5�§ÿ_ë]W×Óý~«úÿê«þ¹�=r¯ Irc*Ñ%™D{’´ªRd™¦@Œ�š’”OæãS%Ñ­åeiç²[ýS;5ޤD’“’fºDò ÃË Ð‰B-EÌŒ2/‘Š™!æAì�ds—sáNcšÈìÖT®@Ѳ82ŒÙ¶gÌþq @Ñ “c —ÁD$]˜0LÆi› °fÆp�P¶ˆ@ÊtlaMæ¥"A ƒG€Éѱ¢ "ñÂ>ÁÃD$ÏÅð < aš@�„)Áœã?… "t4…M4BYŠóÐðOÏ3@0�a—ÂáÃ@ÌûTleLíO3‚j�ŒÒL#Û»? MFÀa+P˜G· Í,žÍŽ)‘ŽŽ+ž¼§“M5 ¦šd¾¹ö@›FÃwg¨V˜MÝ’~zM4pÙ9½Ùø ¦ž�?ÓéZi§#v“jšNôê“É�£CIÖJdⶃµ@ÍšLiil¼™Ó Q,„Úº å¢ì$i:M„E¶­çÍue�0šÂaõ œÃ3††“m0’m–yóJÐM²èiÒuI´Ï4½$Á²Ó¨Aœjîòè\é6¬ Î,�Úi]–Œ5ï¿ÓzÿÿÞ»uÈÆkE¹$å¹$~´[’?®—ÿÃÿ×EŽm µaøÿãý}¯_ëÿ�ÿ×þ­ÿøýX×ßÿú÷_ÿï×­øãúøúº×ÿ‡ÿþ?°úƒÒÿÿöúÿÿý/þ½uÿÿ­ÖµÝwÿn›×ÿÿ÷zÿÿÿþëÿì?ÿõöí[ÿ÷ ÿ¦¿ÿÿÿí¯ÿþf/ÿëí×ÿÿÿáÝÿÿÚÿÿÿÿÿÿ ÿÿþ|7ÿø"Çÿ·)õÿÿÿþð½÷ÿ¯ýN“ÿ¥ä¾þ~ÿunµÿÿÿûÿÿÿöÒÿø7ÿÿøoHÿýßý]ÿÿ¿öÒ¼ÏòGÿ�ýè.ýÓ»/¤ÿ÷Z·ÿÿý« ¿ïþÿïÿïÿÿøw§ïÿKûÛJþÿÿÿþ‡Òô½ëÿô·ø¯_××þö?ÿõüýþýû°úÿ‡ÿþÿxa÷ÿUÿ☯ÿoýÿ×××íû׿a]¥ê—ÿï ¿ÿõÞš¿Ýÿ½þ÷_ÿÿÞÿï÷ÿ¥ýï]ÿÿ÷þ“~¿ýïêÿ»ÿ_uÿ_ÿÿ]®ÿÝþýûÓuÿ9ÿû}þUþOûõªïï¿ýÿ·ÿw¯éí¯ýÙ:׿îõ×]/÷wÿÿKzìÓý³=³D¿{fÃ}WÿM¯íí™ÿ}}]ÿ¥·×·ßŸ›õÛÿ�‡wwo½æ`—a6Ï×» öÃ=X#ÐVÃô—VËÿWÿ­êÚNà 6^µa„˜`–š°ÎJà j9mÂþ·Ø"�§íž¶ÂZåëÚ´²óg’kv”Š8zÃMé8iÙtšÛ!ki°Í­4Óm‡ÛpvÚm¤©¦›› Á±PiÓÅD&”BnÒM;Ц©SM4Ðh;$iPb¢h6)ˆAš 1H6)4©²: 4Óm&L&››š Šm.ÕˆL…æšv”'M6 éÓ 7aÚ{ +“M6DðÓNí‡Nízl0‚†šw …tàÂkÂMf4 §' TÚÄS•…fUå](®Ä)í†! ÂG‰FA¤l”${ƒ‘† ÙFXb!#óüðÙ +§¼¬höÃCÇ“ì&G­ˆP�„tDú)Â:f�™³äi„E#™Æ"| ɶSì4Ñ ðH0aÃC?£@eA„la4Ða!¡Ž3øEØaGÎø2y0�†Â>AÙœ9ì h+ˆN5†# ÓFÈF€gQž4xð<#@f˜L&HÙ¦OÉÐðÕÂ=Â69ž ñ„{fra Y¼Ð§ôl#Ã;9¾~@›Pšªa[PƒpÒ�ØuP–•ª)ÚM„�.H^hÒm&Ùh„mÛ­&Ñ´¥¤ÛM*M¤ÚMçô›CI·„®ˆ°Â>:"»ðÐNËS¤ÚhÎÐOM´ÒM¤òiÓ„GmŒ$Û¸@Íš(rcN´I‡.… ŸÂIÐdsA6¨ÆËB´¡!­ËE&Ðg &x�4�3íªDø7wLû­'LA´›K@ƒhŸ½RtŸT›@­F´jé:[ÒÓ¥j>­¢QKzK‚bž‰û¯uÓmuú_wK„ÃÒmÞ‹[m-$Û¾úé:ë ½m^N)n©]>×ý¿´ßúëúÿ··éio÷¾»ZZ_¤×ñUm +Û­}_Û]ñIéÒt·ÒtÇþ›ïöôŸÇýþ·½ýzèkßn�­Ò÷éÿéÒátñu»nÞê5î“»Ý>ÿêG Ó¨©-êÛÆÚ^Ó÷~¿­õëê¿­§ÒoÚõ¾ÒoöÒö£}û_zýwßëkmiÿÇ}:}þ‡þþÇôµä9Úõ!澯¢C¡ÿ× ¾ûÖ;j<<ÿÿ¯‡þß�¢gôãïMÿãÿ_ÿ¯þ?ÿ¯ëü5ëEŒÖ¨´áíÿ,¸ÿÇá¯ÿÒ°ÿõÿo†¯ý×Ë1ÿÿÿý}×ÿú×õß×éý‡ÿþÚÿéý×ócß®Ãý}µáëÿÿëì?öÕWÿûõõÿõû¯ÿýÿÿ_ÿa‚)þ¿ý~ßýÁÿûÿÒ†ÿÿÿÿ ÿèîëÿýÒÁÿðFÿÿþÃÿ L�þÏÿðØAÿûÿƒxÿÚ*ÿ�óC#Øl¤ùOþHÜ7¿ÿÿþÿëWÿý´×ÿÿÐ_¶¿ÿÞ'ü _ÿáþÿKÿ¿µü7ßí„¿ÿ ^AémªN ägÿÿÿáÿÛW¢�õÿ´_¿ÿ„¿ëÿÿKý/ÿô¿×Ü/íÿq_oëØ"¡¥ÿý/‚þð—Ò[ëÿÿûÖÛ¯õi%÷ÿp‡Kû¯ý/Ø_þ¿Ýzëö¿¿ïÿþívï½n®¿ÿÒ÷_ßöï¥þÚÿö»ßì8×ßý×_õÿÿÿÿÛõý~º÷Uû¯×ûï¿nΫïí&ÿÿÿëýëê§ÿýïY«~¿}{ÿµÿÛ¯ýWëý~õý½u×ïý×Îûíí¾Û}n–Ý^ŸÿõÍ?ýÿþýWöÖ×î×Òm}ëöÍûrû[Ý|ÏÿýþÛý¿_lýwÂá{}ßuý`Šzì5o³ÕmŸMž­#ÖÚ[g°·a~¿û»èåÿkía?®ï]Òïó ëºt“½í½°KÕ²ûlÈ£¼ÚVÒM4×ND;ô×°M;lÇȃ†šlR(îÂVðÁ˜­¹l •;JÅ´Ócc U ØØ«K6ÒA±IÜ6ÓM:§È£¹W›6ê°í&E!†îÕ¸L„š±†Ò7I´Õ[h6)4ÓŠd%XNÁŠm –ôÓM‚pštši°f 4Ø0»éÛ Ÿ#Éa ©±M´Â°ÚV›î¶ÈâÈâ„ÁEva$à Ú=ÚtxhöÊÕ8NÂ`Ð[´š†J-[»LŠ€¼&¶Ø-;…"�àÅ&Ð�á„2£*ÛA„�Fh˜NÑ# B5dóFE<«r¸¬A¤hh¬|«déT3ÛE\4" öÉѤèC…+c@ˆÒ®Ÿ+Ö„}ðn#)l“2RˆS®rlRŠáå¢Ãz-sõÇõýuýzKõa Jø¶:§ûN"(¯qÿ–ÝæBY*ÎÑ�Ÿ; ¥’²)2’;Y‰,d©Dvñ\V +)R•D,‚#È®GB…25‚…S´¸ìœ¿§§øÈܦP õßý÷{_¨îþío»ïOý­úwÞ½ÚkÎÌ/&kíb¾J–J¼ï1ü©!ÿÿšfKwÿ÷¯þŸ§á?ý¯¯ëçO"’‘4VQJYQ�ÑÍÅ9•§R5ƲÉt%#Is†D‘.< d2!k3 ~¤Uòaó¾5ÉY©©’ù2L“R�æÌèI”è¤�äcÍ™Ðh‰Ó†tÉvˆ�UeqðšB)È´�–æË'h„ Ÿƒ)Æ +Gf¬ÀÎ ¼ŒlV Ó6;@Â5™9pÁŸh„™­šhEܱ„l�Ã9â>¤N„΂ž34°a>9­ša0‹ÏD [ ƒ6 ÜNf™ƒ>Œ"à3LÀ¨„éÁžaÁ¢%a’4 †�Ñìˆ0ÙØð˜G†�šlÉÇ„EØk„ÂG3I5dL&HÂ6­êÂ7Áxôl #`yéQù“ÉšAmBav�ŒÒÐM �4ôT‚toRcÒm0š Òm'‘àL Y1øF¶h*N“a&ÒÑ´ü×…Ð&Ø7MBj‚uOëIäИi„h&ÂA¹1ÂIÒo>i7&„Û'Á4Ã8h&ÙhgÚ ´6YÕHà5IÒðˆ�ô®z ´�–pÈæ“ yªN‰`a×]'JÓ<ñ ¥ &ÞœPV™ãKJÒÚv•¡·éRt­&êÐ+KìÀûi;º‡DcÒ†ƒ<Ùh»I;¤ØSæ'I¶…-+Û]ê÷¨OVþ¶‰=Þ ƒj“ïÁ7¥këi}:½6©tÓiZé:ôÝ:¿m¥­´é?i;Úÿoé}ö»¿ÿQKá:OMû×ÖØvõ~ôŸ½Ò}woõúmSh{÷×KÃMþ’zé5╾éõ¾�ÖþÚ—†ÚZ— ¿¡¯¾ý}~†“uú¿ûÇñqÕÿô½.�èRÔ¸NëÔŽÖëÿûÕ_C_¾¤p¨|j;[tú´úTÿ^ÿªO\o¯ÖÞ—îÚºò|}ëûÚûê¿Ò¯Ûý{×ýÇýÞ«ãú‹úîê?ßRôXäY¯_ßüQÿoeÃ3Ö‹¯÷ÿõÖ‹ªýkÿ‡_øÿ·�¯·Òýi¯B=ÿ_ËÛÿ¥÷Ñb¥§ãý×ÿ×þ–ßÿë·×û¯ÿÿÿØkÿ_úKÓþ»ÿíú·×¯ÿõ¿ÿýzþÿ¯ÿÿÿÿÿþšÿÝÿÿaÿ_ý7¯ÿÿ¯úþÚÿÿî¿àŽ?ÿÿÿÿü¢ÿ ÐE¯ÿÿÿÛG}ÿÿ�oÿøoÿÿòaÿÿÿüû#¿mëßÿî¿Â_ÿÿÿÿø@¿ÂCÿýÿÿý:ÿºÿú_ÿðÿÿý¿ÿÿÿþ�?æÿÿ¥ý Ÿþïÿ¿ûý/í/þôT?^ÿÝn¿ì{íô¿¿øoÿ¿û ö¿Þ½÷Ò_n6?ÿû_ _ößëûþ—ú_ûß}ÿÛ|Sý‡ÿk_¿ýïÿÿ´¿úÝýÿÕ]á°ÿþÿë¿ÿn÷ýëûýµÿ«Òo½þ¿ÿ½¾—¯ÿ»ÿßûþõýÝw·ªýÿßïÿî«é{÷kûÿþßþ»i?~ý·¿ßû{ºZûküçßûþ·k¥»®ÿ×í¿íÿ~ö—þÙ:<¯lÏoÞ¯ïûOÛµû¦ÍfiolÏûÛ3ív¿ÚÛ¸g¦û{ï÷½7kþýíեúïlÏÒþö½»öÏ¥ºÒØg«¡ßi[`�M†rÛVeäÛKUažõäQÚ«g)Ý®“ lm²û Õ²îØ`“ײ-µ¤ØØ¦ÐPÛTÃói0Û¿a›¯l¿ðÛlºt´¶ÎN’l0EØa+JpÈø`Ì&µM‘*`ÓVD\ÚI†*Å´ð’± b‚lBd?ˆI¶’i¦¤w î ¦�‚LS‚iÃbh0Ä-ˆL‹ pœ$ÓÓdpƒ °“OjÉZ„ƒ´™r¨M šqIÖðÛJÒL1A†A0Ã݈HB{mƒÚM6ÚNÛMªŠM„Ó\BM§ +aš°Ã$xóà $x¢±‹A¤U²t &jUÉCDc=²} aQFD¼k„DFVJªÄ#°0ßa#ÅŠÚ©PöñG¶Â•i¦�…‘í†1£[qa aBåÀB"#1#--Cq`Œ�PˆŒÆåZ�×¥_ÿZ^•uô – xû«>p�á#ãˆÿùM+Ì«rÒ[Ì„ð©�–Òl;È�ÁB™%eqN‚ÿ«âÓº›ÿŠ_ã½Mv“þÓ]ûki>ßÿZV“Xýzßêîîûv¤sUuý-Õ´¶�«I¿÷[ÞÖÝýHácßzíF¶¾ÔŽq÷µ«iëÁRûêG +ãmêþ⚯ý +¿Ç^ï¾Úû¨´ª—ë]ÕÕí¯quÿõ�ÿøûÖü:ÿùÈsßþûò1Ÿøzÿøÿáý^Þþê•~ï¯è‡¸ÿÿúÝx�¤#Ãýþž.¾?kûÿêÿû~ÃÛ¯Òiÿß Wý!ÿØ7ßý%ÿz_ð‡ÿÑ`_–+Ûÿë­t¿Xjÿël=uÿÖ×ÿõõý‡ÿýêÃ×÷ý}¿ÿÿû -‡§ÿëÿÿÿÿ¶¾ÿ¯á‡ûïì?ÿÿÿÿÿÿoÿÿýè7„qÿÿ‚0ÿ ÿÿÿÛöj—ÿÿÿø"‡ÿÿ_þþK,7ÿ_†ÿ;ÿÿÍ{ÿþtd{ÿÁ¿ÿÿöÒð‚ÿÂø7ÿÿÿ øo•ÿÿÿü ·ÿ÷_ÿ%×áá¿ÿðÿ„ÿþÿÿùÿðßÿÝÿ²4ý/þý/ßÿû¿á»Áõ´¿ÿÿÿÔÿºí~ÂAaÿ_z þ—ÿ½%ÿþ¿½{õÿÿè¡ÊQ°—ú¿¯î®¿îÿÃûm×ÿÿÿá/¯ø߯ÚîëúÚ½Þ¿ßÚ¥ÿºéký¯ûßúnÿ×Wé~ý×ýÿÝ÷†Ãÿ¶ÿ÷þÿ_÷ÞŸu÷׺ë¯}ý}ÿ­î¿÷¯<�ëþßýM_j¿«ÿùÏßÿvÿ÷’¿þßÿßí¯ÿÿk}ëÚç=ýuz9Óv«ß~ÿÿºúýÿÕÿíÝÿ!çÛþî¬Ó¾×ô»Kþþþ§=½ký¾ÿnÿþµö­é½¾í³­¯V•ÕÓiZ¶g·Ýû~ÚWíÕ§wº_tzt¯öÏMž³û!‹Óg©pÿI†'1¬Šáë~JÖÓa¤È··õgûmZÿÛµoûý†{°Ši~ߘM¤Ý·míÜŠî÷KAh&Òé† 6§ØE;d í�m(6ÓTöÒ‘p0܋ʹ“NÖÛI4ôئ)Š´ÂmÃIŠa:iÃIŠŠAÁi¦ÚAH&švØ#Ží&$½m'é² áòvšl‚'#ÊlU‹Ò]8=�´™Í�¼°l…û +ÛH6•…°­¤Ã 1 ƒÜ]‚ÙSm(N�¦˜l ˜U´­‘ôÛ[ µ ÁÃ0¡ùÞÈ¡…H|£EX„L"†á„Q“á’™ù±Õ�Q¦Q”@ÐØ=ƒ !Cƒ S¨AÃM„{¦˜aRÃOH¨®µM ÂG†M;A„ôlC6¨ŽT\Ã�„ÂЃQUˆEe¡bˆˆ†"„C‹Œ© PdØÌ7 b�„u�ˆGy”dFuCˆÊ�0„Ds%”"#CE•«Êà��K_^ºýuÒ2Y^6½G¶AT$š†D7ÄôÓt[ƒ¥cˆˆ�ÿËd-•ÃÎÆFB£–ldØm��A3 ± +NóGŒì^+‚GbŒ·‚‘¡OˆdYŠÊ¡çbÎ=SIê¤%™µè4»ê×7÷}Gëõ†šÿÇAµ÷w­ý¦·¡÷ò±�|rºšÊõc“5¨ãúÏ~iëÿ§ÿ¯ýuýr(”ŒYÝk5ämÑŒ�ÇSóŒê2 Î�ÊCÎ""§$¬‰BaT丑…+ ;WêFѦF3ZSʼ˜DxêeiâÈÓ3gSL�DK�ò@§ó‘9žEã³$p‘äDç¨qï'�*!&NÌd<ÜOˆx h„ÃXdèÁŸ6R`ÁÌ0öF€ü Ñ®öFèF°Ô&¦xF¶Q¦³„l��“ɧDJCG9’Èñ#¢­÷ºßþ«ÿÖé÷î½EEBÜ6ŸÿßÔŽwK‡_½p_�¤/�Ë#OÝ­·ëËŽÁ™Uñå§ÿÿú,Z½{ý~¯Öÿúu¿õª†ÿïþ5ØðÕÿT‡ÿÿÿ¶Õ_úúþ‡}!Ò­ÿKþ¿×ýÿ÷ÿÿüàÿûuªì6ÿÿé~¬?ÿÿ_õý~èøÿýµÿ¯ÿÿÿÿ÷¯ÿ_ÿÿÿÿþ¾ÿê¿¶ßÿÿÿûÿþCÿÿý´qëÿÿ_ÿÿÿÿÿûi‘´ÿÿÿÿÿøÿÿÞ�l0ÿÿÿþ‰Ì�ÿÿü ·ÿ'ßÿé¼ý×ûÿûÿïþÿm/ð—ÿÿÿÿÿþð�Á°ÿÿÿÿ XoÿÿÂCÿ„ûîº_ÿuÿ}ÿÿÿÿ�ö—½ý~¾ÿëÿ_ô’ûÃa¿ÿÿîûKÿ÷ú_~¿÷WL2:ÿº‡þë¾öëû÷ÿè/Ý{úÿzû^Þ¿÷_û .ÞÝÿÿÿÒݵþßõÿÒÿÕ‡�ûï·Ý×}÷_Þÿ…þõuu×í}ëvÿþ¯_ë½ûÿÿÿwÿõûwþ»ÿ½oÿk÷¶ë¾íºþß~ß÷û~ÞÝuï_­Þ—ýê×÷Öݳ¦Ñ�ÿÿý¶ÿR#Ýoöÿû´ÿµõûzk}³?®û3Ûºý½³÷·û ó9?ÙêÂwv•¥f=´½¸[ ôÚZÞÛW¯ë¶í½[Hçý¯ùš{îúnŸØvzþÛážÿaù÷ïMz®cm.Øwa&Òl¾Ã7&à +Ã6䩦Ã7ìKMƒ.ý6í4Ó T3mŒ6–”PM´”&ØH&¦ÒA¦Ÿ1Ý6–«Ûmž˜g+>®º»]»O/*é°Âà ȣ»I´¤ í0Á‘Ûž�¶Èüi¬Bm< Ða†‚ÚM4ÚT›"¼1M¥¤Ø„„ÃI;MŠA±š†)4ÓºM5aV( +ÐPÁÕ†!CÈêVLBF�l¡bƒh&ÒM;{vE1A�žÒ†•¦špv¬Ri§aŠ tá;i6“¦Ä ÂTÿ Á]µí|"9…ž1Qâ B ÂGÆ „@´P€F¬Õ�T¡‡(hçd]JÉØª‚„" ì à 1 ž<:w B ‘ÐŒé,¥i‚:&#4å\ž hQY PdÅ +›„E�&â"8ŒC�˜FA¢×$ŸŠ�^Œ´Z]FÒù�i´¸HY PáA‚OB7�ÿ–ÊZ&ãhîºZƹSŽÁÄ +Ø$v(Îâ)I2�’Ùd¸ìU�—Œ�eS<�ê¡AÙœ5O„ÔÓ;²ÌïôÓôšíðÿô{ZÿþûãÿÿÒïßýÚ¯]­¬\îÖJ—ê²t8ÿ’OÉ…æ˜ãë§\Gü�y1÷ÿéÿôþÿ××Ó&Ft`ŠyQ•o' ‰Li*P*!2lˆdˆš~¤4ŠtGÊ}JŒ–ùA#çdˆáå¢)ÈÏ9�QNƒ$D¡#ÉxŽ3AQdQ„_!*ËG„c D"9ì–�ka"&  ­„{ —Ìð�„ Ÿ<£ØÑ£é„{ ed|œŠÁ)/›E>}fGGLƒŒ")›#<�3ѳ%ò/’4•fÈàÌâu¢ ÃÀ4 ¡°Ê1R!0dJ 8´ÐxFÆš5‡Èúºg| ¾zP�aá­¨F·£cMN’av|Ø=ÏÈZ*ÚM¥™´›Iúp�mSE]!6xT›AäÎ ãK“~9ž#æyÑÌŸ.QaÃ(‹�FɤLŸaÉ̹Ÿí³9DP›'äègáQ0„lhÙ´ÌÛÏÈXG†‚ ¤ær¶�˜-'“Ù)ßM²Ð{M$êŠVZêél³®c Ú™âáùh¢~¶‚´´’t½!I°¶Ãá7ªV¢Ô&ÕÞ“}(¶¼™Âa¡¤ê“«né:ê“ Û ž7p†8I7N‚m&Ÿ;wÙg¢X¥k…]ÒÚ@ƒx[ê÷ªÖ©]}'§éô­µ´ÿºþ·¾¿é÷Ӿ߭ÿ¥½+v– Žm+h“¤�hRßÇ’mû{ÉÆƒiZŠøûÿ]4ßi>“´ÿí?[¯ú¾¿¥ékºþÛ�ÛþîÓ©t +—ÂÒý'Ú}㾞¿ïK -' ×é¤þŸîÓ´ßâï·­îÓÿízïýõîÞ¤pº‘ÂíÒïNý×ׯ´ÿÿþ†»Ž?·ÛôXät�пÓqûqK{Çût­÷}µï#…¿û÷ߪÜw|þF#?Zßß\u§ÿÿÿÆ¿ö¿ÿþ0¯I´’G?Wuû_‡ÿ÷ëé¸iIPÿÿèºþ¿þúC¤?K÷ÿÖºýÿÿÿ¥ú®Ãÿ¯ÿaÿùc>?WþÁ×l8z·ûÿ°x°ÿëÿõÿo_¿ýµÿ__÷]ÿÿÿõöÿïøoÿøÿý{kì6ÿëû®Þßÿÿÿëÿ™�ÿþ¿zðGø#�Â8ÿÿÿÿÿÉÙxˆßÿÿüüÒ¶mÿì?Øa¿¯ÿÿà ?ÿÿÿÑCÿ(ßÿÿmm/'ü Ÿ¿ÿÿÿÿèöÿÿ÷Ãþ—ÿÿÿÁ¿ÁÃÿÿþÿÿÿüÓü%ãÿß×ï^—ÞÔ%ÿÿÿÿwéh/ÿúÿþ‚þØÿýø Øÿ¯ýðÞßÿÿÿé}h/ëµöú��¥þ—¯·_ÿÿïúëîëÿ×Ûþ¿ÿïÿ{÷}ÿÿõº{ÿÿí¿U×_×}ýý?_ý___ÿÿû¿×þëÿõwýWÜ;þ»÷wí_úÕ÷ÿÿýÿ_¯þ»ïÿ_UÛ××Þ¿õÿ÷]W=î¿ú_gMoÿ»¿ºïç>üòÌ~õýïG–ÙÓ¯ïïþÛÿ×ÖõÛÛÚm{ÿïÿö×þþÿìÏoû»únßi{gû¬ÚÖÂwº¿ºïý»î¿µý&×Òmt›4ZœÿïÿÛµÿ®ïámž›lõì?d1û°žÚØG;/ȃ‡¶‚ívÁ?#¿M6 %"�NEvÃo´›T×NÒ ±M¤Ç{`ܳó·™Ûi+¤Ûié][×ÚWw¥i]6 7W¦› vEÆš{"y‘bœ6 ¸a¶GµFب6(+±„Û Á¶qìm�ÁaÝ ÓM83l+“NÓ B ˜“a>áÅ6GA�§t\¡„Ã0 …h:v¬U2ݦÚVÈ�Xi2`Û½´“mšzL�¤AZLB°•§« á´Õ6ÝÕ¦²:‚º²: ƒa4PÒ �®wÁÚ§ÉZ¦˜T%ðɬd¼N‘õDº ${£ë(Ã4(¤¢±†ƒ©"…T",QØ nNW„Û$ÚíˆA„ôÚ +E�´iÄ&©:„GM ƒ ˆM"²"%ðh‘šgf”AèDaEˆŽ")™7tdQÄDCˆ1B" ÂaˆŒÖ„DhìS-ÞÇIǸˆãÿJ×þ½tº^¿ÿIt—JÒãã¨$ÃIôÓÃ!A\ Âi„ðgf ]¢š¦B#ÿòÖJ2½yY¥\2"Y–Qfw\™^Ð$h™C#¸AØ)Ø)*DÚ©B„{§ú¤ú”¸£|'oí~é=-ý'úwS±¸ÆtÉÂnî½G}Eßúb°�ì§+¬ÿÚ¬ì„wÈ<®µùÔ: ›þÅk⺦—ëÕ›ÿ+’,ï½®šä�’%Ê|©zíùr:K%ÆFã: ¨D˜¥”#lƒÞo=‘Ð"/(EÔ�Ðäš#åIü莆HEÒ•NˆöVå:’š#ÆyT…:H3TCFÑÔS["(þˆL› ÊLÙ`�¢ˆO ��³4l‚ÒVDs3ð�<4‚ #[1™£Ý„l £M°99—3ä#sM0�Ö*0�œ#pgÚh¨hüè‰BC П Šjj$U.(!„ ò~ Á89Ï1¨…%HÓ@Ñ 2à4DÁóÖEÃ?Ü380ÂPÂ?2zÏHØ>mpš6¡=þ�Í4ÓM=U°Éf�^�oÐÒmB44˜ÂMÃI†ˆâî“né:VU¶šIå¡6™Áº_ÖD™ì&®’šÂ5³8'¦�†+6<$Ú6P'?* °“¦˜MÐL4J,–& †‚ «rh µd¹6šª ´›Ùh%”›¹V•²È1Óhh3„yõ];A}+·KMµ„¶ÃI´ †ÚVþ)^ cø½tÓj93„habŠÆ®“ihŽÞ| ´ŸIéºue΂´°©ž9hM‡ŸVÒÒÝm(JÚ‡UÕéá6•âúOûh”$«×wëôšÝv´�m‡»µÿ§î;iz۵ݥ´IÔbÚºO¼'Ûô¿ÔTUÝm_ÝÒzIÒý]+v©â?¯Mÿé[BÓ¿­î¯é uïÞ¬4¯ÝHá~ÔŽ¿½¾úOA¯ñZKßuM&´¾ßÕkvŸïm×¼kÔ÷¡xï§ÈáwÚÿwzúöú_ÿHCÿ#'áð\6ê,r3þíÅߺÚû�G®¿äp«ïêÿzN£üÓÚÛÒ-ÉP?ÖFOx¯­ÿëý¯ÿÿøm_ô‡Øt<=(?vWá¨ÿº-É,xpÿJJ‹êöúî½!ê¿Æô;ÿ×ÿ×·×õÿõ¿ÿûk°ü7×ì?WþÃ×ÿVüÿý5õÿ_ý‡ÿúþÿúÿkÿÿ¶¸oÿü0ü6Ú†ÿÔ7ÿý‡ÿ¾º°Øÿÿû}ûuýá¿ÿÁÿÿ]6ßÿù?û ·ÿÿ ø7Ðo¿Áÿÿ·ÿÿ‚†Ãÿÿþ ¯ÿº_øoÿð�ÿú¶¾Ú_ß„¿m¯ÿÿáÜCÿíÿëÁ¼—Oÿú=Çÿÿÿ߯ÈÏöÆÿÁÿÿKû_þ½ÿÿô¿Çwÿ¿v÷†ÿûÿÿ á/ÿ½,6ÿ¿þþÝzµû¯ý¿ï­ëÿW¨6ÿ×è’ÅÚþþÿÿ¿¿¿|%ÿï„·ïÿúáÅ^ÿ»½}ÿ¾ºþÿÿV¿ýúþu§¯ïÏ}äšw'ý¿Ïëýï_ÖïÕß÷ÿ÷]éÖ×ìµéλÿ}ö¿þÜ&Ÿöÿ_»ë_Û¿¦ÉÖ«õmÿ×uÿ<¶×þ›}s�_ößÿuïtÞ»võ÷¥~Þ¿û×þ®¿û}Ûû þÏÇ+VëÕ³Õ§í‚]ÓWör×Òí×ý×ÿ«fjýuºý³>õ^ÝwÝ&÷Û�Ç´»aœ›£öcµlõp»eäÛI5µºmôši°ÍÉ­¶šl6*ÛI´•;b™>LRm¥¶“¤iÚ^Ò_ô˜w}éXV"u¥¦¬0­§éÈœÐL2?NÚL‡ÆÛ"ùr¦ÛH&¬V–ÅMˆXI;6q 6ÒM4ì&¬J�m6)oÕ=…LI²9ÚjÂ`¶)‚°ÉkdhA„� Œ�TÃ¥jŸxdAÊÆÚiÃA(2Û í+Iš ˆLi Óa6•½74û ¼6•Û ++…vŠÚi©�†!¹á£Ä¡#aP�’4=”w*äÅ>Èb ؆!‚b#GfAºpÂIڦȥ±i¤ùP)„Òp¶ †‚ƒÃ�á„<–ó¾U¶˜„ ›„Páˆ3¯†’œ®(œD|¡‚­ˆar½ÄDzWXˆŠ¿­W¬t¾—t m-±[cmÕ‡`Ã#ªˆ"݈ŒGÿå5Y•̹h,‰¸¾[”gs“ &hÉ/22‚Gji ë•(­A+ … +R䜮®2Ja?OþšR•)—z¤þ?ÿ¨ðûáõö½¦¨¯RÿßY\bó³T>eV«ñu%+î¯õÿ^BÿµÒÓõó°šf§�"��†d’ÌÔd¼¤lúþ¾jI”è”än:">¥!ùQæ¤\gB;q‘)ÙÐò@΃*< dˆÞ^"":#Äâ�4lh‰2ê*ËÂ'.Ê `Â5†Ö#Xeƒ:Á—CXdŒ r�üø~ùäF">w ‰²]ÉJ˜Èd©ç èD¾F#†Cfb¢�š™ñ€È–Ã:ø0`¬4B4CFÆvV òó^�‚4ˆMOüøÂ6Âs,硜ŸŸÐÍ ƒhøF°Ëá„l àØ£øA hدM=M=&Òm&Òt›MRm&¢­ÉŽ�z°þy‘ã4ˆ� †HÌ2Ÿ00�ÂGdø a$!™°�l#['Ì¡ÙAŸ4Bt&¬F=*hö|¨‚„nz6g&�ݘ ˜gž‚ ¼ô‚a¦›#ÄÒ~¡;H6éá&Nú®m&Ô#E'Ò ¨b’Òm¦¥h& Ï9hVds—E¤é7N“j'I´ÅÚ�ßÐ+“ò}Ój™ÉS&H Aµ ¥úN“ =_Ù1øF¶�m5TGl(b“#šMÉÐ&ÐדBm']mvYé6ù´Ðaô ›fOt°—¸UzºÔ[KÕº¥Ò·Õ&–úÝ.N–––¢“{«¤ûøi_¶îËDÍ¤Ú Žjƒ<úKLûIÝéÐZõní éZ‡T +ê•êÚ]µ‹JÚû¥iu«{¾ºôÚßµÝoø®»õéZékþ¢¿Oé¸õ¨äp·Û�m{�}/wý´šZµÛK}Eou÷öÕ¼5î½ +§ªn>•Ðâ«_¥¿·¿¾­î*G +¯îêG ^ÿý?ÆÝ=dp®þ†ÿÒö—J¯þ—ÿý´­¡}ÒÒßWûR8Zë§¡wéÝ�¿Õ¬Ž/}½Ûëúzúäs_¿!ÕßVý-e¢ºÔ�ÏòÆq×oª¿ý¿_þ»»_×]q¾ßþ¶þÿËŒôXähÃÕºÒ¿_û_ý_ÒÿÑbúïüzõúÿJúÿúüþ›ÿñÿþ 2¿ÿ_ý¯��­}/ßÛëûÿÿÿÿÿ×ö×ÿÿÿ ÿÿÿÿÿÿÿ__Øþûÿþ—ì?ÿÿÿG¯ÿÿÿÿÿû×ÿÿÿ䇸oÿÿÿ¯ÿÿí¥ÿøoÿÿÿÞ¿ðßÿ¿ÿ¶—_ÿÿÿùÿ'ÿÛKöÒÿþü _a¿ÿÿþ ÿÿûÑÿÿoÑçÿ_ÿmÿƒþD/ÿý×ÿÿÿþÂOáþØ"‡×ÿÿ×áÞ»ÿöë„{ÿ×ÿ°ÐA'ÿðoûÿíÛ^ÿ~ÿ°¿ëî•ÿÿýÿõ¥ú_{ˆýÃûÿý{wµÞëÿ^—ÿßÿ—ÿïzOÿÿúŽÿ¿Õï_ÿÅ0ÿö×Ý¿ýõõ¿ A~ý¿ýú[ÙÕoöëþõÒÿþ¿å +/Ûü?÷ÿ½ »ï}Õû_Û¯ÿëëïÿíýµVöý»ÿoþÛ¿­»¯ûúÿû¯øOÿüòÛëÿ{_õßo(þûýouö¿ý×ݾÿoÿ]êÍ«Û}¶ÍöÙ¢ûVìúé´¶Ý/½ÒÏÝuþëÿUû[ïõ}oÞ¿á˜]ßõoM홫¿ºýÿ½º¾ê×O¶Ï÷ý„SûI�zžÙÇVÙé°JÖòõ›i§"¸l3m†I´“a˜m¤šr&6Ò ïo¾Ýä#Nöý>˜gÕ™Ëmß«kú²®Ùëaœ–ý´˜i°ÂÛËêéjõú¦ÚR! Ša‚8ö4ÕŠ¶M;ðé0ØØ…¦Å1IÚlPb“N Pb¡¤ÚV¦Ò»a&Ú_‘GxEò÷·I¦žÃƒ.k¶ +Á‚ÚM—5ôØä^{h$ÕSa¦Åؤ„˜6Ò ¶+i‡ 6’iÓ¦°í6Òa&L{%u†Âi¯w†Ç(p¤Þ(†£Ã ÂFvжл#¯<0 Á Pb©b­"ML¶ ÙX„6ÐIú{Oi²{fÝ‚(tÄ$ðƒ¹Z´ÛI;¿°Â°aOpa š 0�6 Á4-6!#áH*^~)Î-•Œ1‹¡…#+E ²ÀnîÓT�ÑðªªtÅóѰˆÌ��‚ÓŠ×XÄ"hC""Žvv +‰±Z2b¯21¹6-ÜG^®µýúõ×it­-°‚¶‚m¬ˆÊvÅ�­AŒ6 ¶qÊf"?þXÌ•)iDO å¸L�Gd˜(YeVŽÑA#´S"¤hÍ©… + +i:¹gtŽÅYn6‚aNÅå3‚ —þÚZOúé{{~“Kþôûú­º‘ÑGÔŽm´»qê¶è&oí/ KIôµ÷W]zÝw^Ÿ__ Ò§_ø¯{¿ªm^\'ÚŽÞÿ¥Ö¿º‘Â×¾û¨×ºVúVÝFýq?ÿ«úT›ßÿÞ�õ_®Ò¿q¡Èá]®¾7¾V–ãÿµ®¿èèi;}«c×ÿ$cß~�ÿÿ¾¨±ŸÑf=ßU~—ý¯ÿPZÝ.×ö• +÷k×qñßý9ï¤0ë–ä‘þY�XÏkÿ_ÿ¤+¾ÿ¯«~¶Ýÿ¯¦¿ÚÕ¿ÿ÷ÿñáÓÔ°?�ËOý}ÿö ñÿ¯aû}þ¿ÿÿúÿÿëÿÿíÊ_Åëÿÿÿ¯Õ‡ÿ¯úézÿÿÿþßÿY˜¿þÃþ×ÿ×ÿÂ(ÿázÿÿ×ÿÿêÚÿ,wÿÿÿõ¯Øÿÿÿ®Cÿÿÿöÿÿ÷á¿l#¾¿üÍ‘ßÿ‚OÿøA;×ÿ¶¿ÿ÷¶—ÿ¿ÿÿÿÿÉÓ†ÿÿü¢÷ðF~ÿÿÿðû¼üÿuÿô ÿýÿþÿ¯ë«ÿ¿ÿt®ºoÿÿÿýúáÿÿü Oß„ Âÿÿÿá¿ÿÿýÿJëþô»ÿ´¿ÿ´¾ßööÿûì8¯öÿÿÿÿ¥†ïþÿ×ÿ_Kÿÿÿ·¿ÿþýïb¡ÿôªÿ[ªõ×úý¯ë¿ûýûN¿{¯ÿÿ÷ýwëÿý/ý%Õ~þÛÿ÷êÿÿ<Ÿ÷ÿu^ÿí}uö×÷¯zï¿¿oû®ßÿÿÿ÷~–F'×öïý{õõýýÿý³ªïý¿öï]½¯ýº÷ÿoúëÛÿµûI¦Íûfkìþín—·mÿÿÝýUvë_oõöÿÿûû'M÷~Ýӯݙýûf~›i6gûZþ¾Ú}íž®ô´»nÂ8îË­Ò[t¶$›"ãM†5 %"‘vÒÖï_÷÷ÿf›wöÚN­ûv~ÿ[lÏý?¿oÛ _ki·¤ÃµUl$¹§Ø$Ø/M‚I¿ú¶‚¶"Ý6*ÛÒÒMYln4à ša†“±H:M6!&ƒbMSi{KþÓ½W¶JÁï†ßM¥eëM†ra„»ND9�‚ZpÃ}¶š±Ûȱd õÙsóI�4lR ˆI¦…mà 1 :tÐi Øi>Èá0­XNùŒ%—‚SÆÃ §i +¡*ܨaˆB «l$VecÁ‚ !aÐŒ6’jšlG¬Úi±1ÒnðÒmÄ-0Å!&šl°˜„ƒMÝ6ÚNÙBa„`»M¶)’ ¬`‰ÞU°ÁSH¯*Í 0ƒL&! +{gqŒ¬`Á™„rÈ4¶¡ÒÝí�‘ãr®�Âi„Ž„ì�Q ¨)W a#ÛE['Ú ӦwèìY–gÜ„YÌ?�ÿÿÿá¸QÿüµREºŒ‹rˬdW\’P³ ‘GeQ’¤A;G ¦G‚=Êñy÷U"0¦‘Q…ThÅwµÿôûL?NAõßïÿ¨ýQ‘šý5þJ–veŠÿÊšÇ!Þ/&5ïõþ¾©úú둼íQ'äF]u)kÓ_ó®EãHë‘üÕ'œŽ£!3«&  ‘èVÚ‘²Ã!8«.dB +‚<#g1Ïd‹ÈñDl‘ Öi•eÒF,ÑŽyó‘)3”ùÈê<Áh„bæÐ‰ÓdP!:63VP‰ˆPŒÓ6Y ¡œDðF∹ŸÂ�‚°óL h„È@Â6aŸÈã?žÂ=†§à��¨A£c'“I4Â70ši„¨Mš„óÒV­ë§_Sùìή6Ϩ0¡G‡¦QäözHä{í)¦Éù?>Q±…TÐz>?I½UB<`ŸDpÙg"Æ›IÑ1á+IÙh¤ÃÆ‚a¡²èÒmO ãIÓ»´“ﻨûoOZµ�¥ÿ¾•´;ŽÛµ¥´ël&÷Hk×éVÿKKÛKÛþµOkÝU\{ëþÜký¯õ#…¡u#…¯t›ý·õÿ­õ}÷QúøzXéõiëí÷ß#ýÿ^ÿq´Óz_¯¿ÃÿþG_äuÿ÷_úoñþ¯¿ý~•8'ú±÷Ý,aþ?û ’;ãý7þÃÿô‡Òõoëý×ÿIØv¼Ußÿÿÿðè××ÿaÿþ—ÿÿ¿ÿúÿÿÿîËÿÿÿÿì?×ý‡ÿ¯ÿûÿÿÿýÿýx#ÿÿÉ}ÿÁ¹nÿÿà»ÿøoðFþ ÿàŒÿÿðoÿÿßÿÿÿü Oÿÿiáÿÿ’ÿà�ÿðßáÿÃøAÿíÿýße?ÿ_¯ïþ¿ß×á/¿zoÿ„ú_ÿøÒÿÞÿÒý¿ü?ÿïé¯ÿ÷WéÖ¾ëïï·ÿ´¾’õÿí¿×ÿëKþ¿Ï'ÿ÷½×öÿn¿×ý}ׯºÿSŸÞÿ××ÿÿßõÿÝý÷_ÿÿûûU÷¯×öëõþë[Ûý¿ýïûj¾¿_ÞÙÓ¯ÿõ9÷õªý×ýÿþÛ{zý¥ï_ºÿ¯ºõíßßõ¶}ïöÿK]öþÿ_oöû^î÷Kÿ£—÷Ûg¦ëlò°Ýî–­¤š{iiò áªm¥i2.X3ÞÇÚW}¾í»»«}%üÂ[>®³È£‡­‚8îÒa›“Ð\ˆ;‘1¶–ž�¥zk"ãV)ŠMŽÛƒM´“M´“MÚ 4Ó`�›h,�„$báSl� »jÈ_k"ÔCÛoA[ÐW«†BãIŠ´á:i°}Ó�¥°�„›i Õ;nªÛ l0�…a„ûX0‘íÏ 1#[G¶ŠÆ„ŠÊ+œöUI„�nU°É†�¢5ƒ8©JQIÛ „ï¤ÓR¬ª°î•„Ú „Úiݵ ´`‘ïDr¬>!…*ØdÓ¹ÒC& &ÂèPB‘‘†""3°H› ‹0•ÿÿÿÿú¦{ £³’&‹Â›e#ÿÈ$屈¯†d)�2I–iR*ÌÌÊë,ï=NÓʤR!È–W#-Ô3º&Qd²Í„I¤Ò 7Ûûô�‰ÁMØ»'ɦ¡}„³žÅêïiïíBNƒ´ôÓUiý¤„2sê/Jí>ÑZN4Ÿõü=¨«»ÖùÙRÇÅz‹îïô¸ý>¤KÇ¿×ûXäÍL~¾?úþ½sL}õýu:¢:%¤j“$P2@Èc5Y‚:Œ�jJÑÂD'L ��3w××U2´wÙü�Y.3 ó†E…D"²'NÐd#ƒ$dtGŠ#7¢ÂYA?<@»D'š£eÃùÖž™ëA„l HÖ˜NLz¦šOÈE©�"*JA²­‘‘Õò¬e™&DA‘1©9"%Ó‘<«.dc aƒÁ,# 1Ï^"á4èTÑ"žWçrRIÐÂ5‡„Â5½p˜FÀÈÔši„†Òd¼&õ §hŒví¤Û,z:NN“i6š®ŠÆ“a' +ƒ<Üs6y˜‰”ó,aì–Ìô(:!�Á ÉÌ#d#À0FpÍ ƒ +’�Ð!<Ç5†Q7B3†¡Ú¦¡šA4Õ4ÂVªÒÓ“(A[OÌô�&àÎ4ƒrÆ‹C>ÒmB ÛEe-*JÙgM…izOŠè-+]'Pë‹iu­{þ4kzM¨PŒ> “žLyé #ÃI´œÎI´›B¨A6“²g¤Ú£ÛKIäж]:M Îöƒ8GšNƒ<餜+‹ + +÷¥i<&Òmß´µ„Ãn�]oJ÷§m-ñWîÅ'ÇÛí_Û÷~‚ ÒZ áÝ÷Dø1ma¥…]-æ‰s¤ét©0Ót�'ut›§º¯êßKÿºk#�ÒJÿu½ë^µWVÜ^ºû]Qi÷C\;_ýÖÝz{ßÿÒÕô´µzW÷Ò]-Òüw÷§t½ú]ýUÆ.µöþ¸ßw­|ޝ§Çî´A&¢ 5ÿÿ“}}?ÿNÿ[ýa¦Ý½èR÷[i믯t­¯­­µ¯õW—ÈzÝôXçs ÒßýxkËNÿrëÿëðuúÚÿ÷U]ÇßQþ·×ÿßüéèzo_ÿüGýÖÿý‡ûýõÿÿ öñ÷ÿÿñ¯þÞ÷¯öÿ×_Vÿý}µÿÿ×úÿÿõn·ÿÿaþÃÿÿÿü7¯ÿÿÿI]÷õ__ÿþ¿ÿÿëÿó1qÿÿÿü‡º_ÿäïÁ¿Áÿ_ÿÿÁ¿ëÿÿÿúÿÿÿÿàŽ?qÿÿþQÿÿù?ÿÿÿ„Ú_ÿèáÿ ÿýÿÿ¿ðŽ?ÿÿÿòvGdc#¿ýr"ÿð‚ð‚uÿÿ ýµÿüt¿ïÿÿÒ~ý¥íßoÕ¿ÿûÿ_ÿÿûýt õÿ¯ÿý'Òÿ¯ÿKþ¿ÿÒïÿþÿÒÒmÕwwý_ÿÿÿ¥ÿÿÿߥ¥ôõ½„¿n¿×Â[í¯ÿ¥ûÿï×ýëÿÿÕ]ý|�?¶u]ûÕßÿùÏÝj¿ÿÿ»úªúëî¿ë÷¥úÿÿþ¿¿×ùG[kþßúýï_ÿªM÷Ó«f‰µÿÿ«¯úÿÿ÷~ºþµ÷Kï^úª®»×ÿ¯ýÿ·ß«~õþÙ¢ÿÖAý™ûiýõi¶z´›>½aXVïöËÿÚ[­õÿößÿúÿoþ×ÌÕÞ¿÷iþ¾Ó{f~©_g×¶—f?°—ëa†Ãl%¶–š|ŠáȶÕ�еcA§ $¦0šiÅ&ƒM¾ëëûÿÙþ×ým--lþ�Ù…½.ƒo´ ³„Páû¥®ºr+‡~Ø#Žõ¶ “U†Ã i¦ÚA8¤Ó Ri¦�í±H6ÒAÚ¦Âv›„ ˆA„�ʆL#€¥[@‹åR­¢­Ê¶!�ÒØaßÙzöˤÓÓl»N; =+I; 0¬6jÚVžÇ ÁÅXºi¶’i¦švÓ¦�0tƒL&Å&‡M4šl0‚M„�°‘ï*è|Ÿi¤zC‹aˆH®d>VHH\ˆ0„DA„W¶‚NõM6!iÃôíˆL®÷é:I¦Ä*i…m¤šn(M; ÚNØi EôV2„ŠÆPŠ&‘ᢱáÅ ã•Ð`§�™S$* Ñ R*K Ë)0Ü1�SM#Ã}6‰@Á ÓAª@¨ SÝŒB ÑÑ!Ô¬¹n-³Ã;qxæ@J¾?ë_UÒúTÚ_¢Üa°Á8UQ Æ;¼a0˜Äü°�é�ÉékGzÅA™‘Ùœªv;ÖMôÎôŽþ2;Ö-Â’…3ÁØG~e["ï_çf º™äiz¨OÓ¦’kü?ð¥JþÓ¿÷ÒkÚÿÿû»ûKY�R¿ÿþ[‰!ñÔìŸ��kÿÿrJ‡×ý}åMc’¯¯¯åZLÕ³RÉ"LŒf¢ÈA’ê<á”™žy¾¾¾¾D‘YÈqÚ[5ªL“"ͳ¡̨"[#ÇÆSäã5š"#œÙ" ði–9ƒ8å_)#åÁ„{ “: Â5°FpÉðƒßØG°Â5‡‚dAÙqG¯§–ãæ¦u=N§›ˆ†FÉH2L�Å:Œé”™x¡Ñ‚�##³D`ÌÅ!Ì0H�xÖ»‘&sšÃ$aÐak ¦šÅ„^†pÂ?3H&¡ÃÐhö„Ð+ z?°ªzIÝR Ó¤ØThii:º ¾V?¯_ÁÆ‹¯õÿì5ÿH|_]ö¤Ã]×Ö½µëè±Áô-¥¥Œ?Çëñ—W×ÛHÿÒHkß­um†Ã`úÿÿVÿÿÿÿ_íþßÿ„Pÿôwuÿ×ÿÒaÿãéÿëý~—ÿÿûl3â·¯ÿý°ÿÿÿüžóUÿá¿ÃdküBÿ·ZÿK¯Õ´¿aþ­›_ÿÿÿ¶¿_äÅÿÿ†oÿÿ4ðßÿÿÐO žÿÁ¿°ØK×ô»ý^¿ÿÿÿ†ÿ¯ÿÿÿté~_ßþßõú¸oÿ¿ÿð—„¿ýÿ‚þûKÿ«ÿúþòu¶?ÿÿí×ëÞ–¿ÿA·{þÿô©ÿ÷ÿïÒô¿¿w_ß׿aÃÿþõöý~ÿÿþïñþ¯Òÿïuw}ÿ­}-ïþûýÿýoÿûõÿoVÿïýïcÞÿ¥Ãþïÿ§A~“ÿ¿{÷¹}ÎÕ·~ëÿç–þ¿¿÷êºííùÏöΞ¿·¶h•_Þ¿ßïÛ~ïúï[{ûu­þ¿¥w¯ïÞôs¯ý¿ºÿU½¿öû'_·úþݶh¿«ÛèåwíöÂ0îÿº{ÿÿ¿·gUþ«þÝöëÖÚ÷ß™¦ÛõûÛí-[«¦ÌÓwºßößWþÙëa‚ZÛg­l#Ãã†Ùå—›6Óíròl3Ò¸l4ÓŒ1LBl1ASzOíý·Ûí·uþ›W¶f›3Ûû«I†¿�Çý%³Ó~Æ»{ ån•Ö•¤Ã +Ã7eäÛK½6áÚL„�¦ÅXb“¸6*lBt‹±± ŠM6)ˆI†)²9»M&˜d®ÁVPF5+(Ñ³×æí™®ìôÙõ¥÷a‡û -„¬-—Ý-&ÒdG¦Úl‹�T1Lq ÓM�ƒÃ ¤ØJV Pb˜„› L&žÓZ„Âa„› +xjÐaxÏ#ƨM +V4VCGL0AŠl•"¸�nÅ&¬a‘^ȃ„4¡Šd/4“M[j“MŠ B v(0ÂPEädC ON <Ž#É]¦» -…*Øa1 Š(0A‚ Ol1×”!•‘Â&æˆlw ª#a„L1O·Ýg†A„ì&bC ")Œ¤ìÑ©øÊo9n“qâ;¥Z©n´‡ÝA[J�d+d£ †?ÿÿÿÿÿÿÿÿÿÿü¦ÀðIl«°Ñ,�`x*rm@[ ÿü†Hk•|¶är¢¢ íGòÛ£ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÙ›ÿ�ŠÅ@ÌÁÏý‹·ó±DDÈê),úMÏZ'¾V"Œ‘˜ÍåA‚ ür(Ðôß_ïÚô^ˆÇ}áÏý'íþ¾Oú ¹Ñýßÿ_þÿôŸ·¾›ÿ±ÿèÏÿé½ûÕÿÛÝ_þ“ÿGô‡þ×ûÿû׫ÿðÁÈ'ëÿëõï×û"}¯Óÿõê½ÿùÐæ¬Óïø÷Šöÿü7Tÿ_ÿÿ3ýþÿÿÎ�Í7ö»~ûÿý¿þú:ç?ßèþ»ýÿÿÿÿÿß÷ß¿ímüôzÿi°Èûþé=õïýÿ^;_´¡…�~ÿ§ÒþÒïÝÿbƒ¥ÿ¶ÿÛKýá…ði„"?]°—ì0—þ‚/ø�騝û[L*ÿˆ°„E—¾?ñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÿ�ÿøòÒõ,‰ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ�‹Ølå�,2[ù\´2•Æ�l4|®j­�ŠØhþv�Ã?ÿÿäÛ‘ÿ&Ýÿ-º?þC äÿþ[tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ�«3Q!�ÈœØ`¸.pÿÿçL‘œÎ4  †Ðaúÿÿÿ^è"ð0‹·£eœàÏQÐr~v®%ò(gC;¼Ž/ä³:g2Fpÿ랎q�„´›I¿ÿ�2Fs<œ gAN°A„˜9°Áp\ÿýWÿ¿ÛÒm[T›§ÿÿö¡š£[FÇõ5˜uÿß4”ÿî¾ýZO;ºÿý¯<ÜÉÍ0Ѹ;H6“s6§Bÿú¯þëÛÒzÇÿ¿íé:N©:MÕþëÿïÿö©=ÿÿºöúm&ç}tÿÿýÿÿ¯þõÛpÿÿ¯½+Ó¥xãÿÿ½ÿ_Ú_쌂2"<‚kï_õj?wÿÿëÿíÿl‚_Òv ?ÿß÷ïîÛÿý÷ÿÿëÿd1†àüäÿ_{^–ààïïÿz‘G'"�ý¥õ=_\ÖÍWÿÞ¿�{_[" ‹B šÿõ�ÿý¿�Ûÿÿÿÿ¸0Á‡Wÿûu4”ÿÿÿ­’;ÿö¿Í«õ³©�\Åüäÿÿ_ý¥ÿÓèÔœó{ÿýëבG†Ãuÿÿÿ™a�ÆT —ÿÒío¯ÿÿúÿZÙ#‹vúÿÿKò·’3™à¤àá�“é™ëü~»téw{kÿû¯®÷ѧ7¹¿ÿÿÛÿþA�¢ì<"ñõû^–ÚÃT�ÖÒÿûþ¾•­wÿÿÿú\ôÌœ Ý|&ô¿øä1á„› vÁ„˜iH9üƒéñýmþ­ºõÿÿµûÞ“nÞ¯„¿®†(1]11_ÿkU¶Òm/¾×ÿÿïÿÛë[ëÿÄDX Á†aˆÿâ¬�—›I†•;a&R ú~Cß�Ä…ý¥ï«{øé~"#ÿaDA±LUlSÿøˆ�¿¯×ýéñÁˆ`ƒDGÿ×{}êöÕ/þ"#ÿÝ{ÿû#=ÿþÿò Ÿ|0lÿÿ×ÿÿå»ÿÿý×óÕõÍN›ÿÿûþ¿þôÿÿÿ×ë×­ûÿÿûuúÝk›ý¿ÿÿÿ¥ºÝwïùÔ9 99E'3 +Nx?ÿøý{ª]µÛþiÝè?þw1� +”"\BŒœ_kéÛ[Kt»þj9ÆŒ"ùÎw<Üõ˜ÿ‘‚“‚‘¨‰IÄ(<òW”G0™ 8A�Ñ›RFxOþ*AüTW¿ôú ´}¾¯çPuA„ °ÿþi¹†ƒ_æ÷¢ø?k¬0˜XaSÿM¤ýíûþi¹“—Œ"ñÍ7?¹«5÷]C¤ŸOè7 ›òÝÿW¦ÿÿMÒ ´nŸ ½ëï¤Ý¿OÿÿC¿÷ÿ÷éºo}ýÿzöô›Yßýêßÿú¥õ¿¯ÿ]'þ×ÿ¿þŸ[ýúÿúï_úÿô+¿ÿëï­Õ?þ¿ÿ¥ ™ûKä_ýwþÿýëþµ_ÿ«ÿãýãþ?õõë»ëýÿÞý_ÿÿÿ6¿þjŸídÝ|‚s¯Ý�{õ¿÷ïÿÍG^³�ýMOâ¯øÿ�þ¿›_­ÿÿÿ×ÿÿÓÿ—§ÿž¿÷ÿ^¿ÿëÿïÙ#ºß_¿Í7 ù¦ÿš�÷UÿZ�úúÿÿ}×ú÷ý?O¯_ýÝiÿ÷ÿÿÚÝ~¿ÿ$wïþÿßë¾³Oúî¿ÿïM¯õÿÿ_ëÿßúí*§¿®ëÿý†­¥Þ—ÿþÕºýþ)õÛ]m×]µÿþAæ)Šø©ÏÿÛÛ_Òÿ÷í-´–»JÒÛKÿÛØL-¨_ÿ¿KK¾—¿þ*CT®ÅElWþ[�ÿÈ?†a„¾*Cÿ¤«bºÃL*aÿß PbÓÿåºÿâ" "½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿüʰ<¿þdH†\̇ €~?ñÿÿü®¬ÿÈdbà_ò‚³( d2ipårô·é‚Þ‚ á+xAPÞ“+ ‚†ôaá+ à+Þ è(oAVaá(oA‚°ð�o+z0ð”7„˜xAXz0ô7„aá+xH0ð‚†‚ áo ÃÐV“ CxH0ð‚°ð‚ < ¡½z +ÃÂ7„¡½ à+à‡„¼$z +ÐA‡„¬<$z +ÐA‡„‡„o CxI‡„‡ ƒACxH0ð‚· ƒ XxAð‚†ô˜z +ÃÂ0ð‚†ôƒ XxAá_ ÄB†"aXA… /þM¹>[uÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò¾‡ÿ5å8¥DQ”g‚”áIÁÍäŒæ4ÿæ˜A­÷~º5‡ÿýîïžny‡=N´ƒs-õMÿ·¿úO_ýRm#Éû{{®•ÿÿIë‚#Þû÷]?ÿëµz¾ÿÔþ´õ}ÿû¯_ÿ×ýý÷î¾ÿýz¾ßÿ Ÿ_�p_ý~¯¿ÿÿÿÿïþ³Œuó-õè}úþÿ×ÿW[ßÿõì‘ÿÿ½}¿®»­ÿȺ;#¨r.D€ÿëKo�]wû_Ι¬B¢(‰óÁÂ!é7’3˜L/õo¯~ºâ·¯óMp׿Ç79êú62_ûi/¾º[ö¿é @Ýß@Ýû]'¯õa-¿ŠŽAØa) I¿÷ßzÒoþ¡Š¯z…u†+ÿ§Gz}ÿÓÿqa N Ápˆ°CúK}Áï}û]Gùn¬ÿ§W§ûïzëÿúÝ_~ûÿÿÿªßÿ¶ÒùSÿÿIöÿùÿÿÿ_ï¿þ¿äÖÿÿÿþq /‚ÿõè}ÿÿÿÿÖÖíýuÛü‡ÿþž‘§¦þºô»_ÿö»ñÿÿ½;3?Õê¯}--�µþKŒè!¤Q›  “ÿö«ï®½m¥ü ÂwðÂþ“ *ŠŠ�söR¥è¾hÓ~OMJ4ÿøb¿z«kb¿¤ÚMßTé7û‹ÈHÇõÓwýÓˆ�Òuÿõÿ�7;¿ú¿ÿKïý/ÿÿïô·ÿý>ßÇ_ÿÿÿÿÿßÍ?ÿþ×ué»ÿþCÿoÿ_ÿ{×oîõù.ˆˆïBþ¶»ö¿šÅ!„4Š3¹°@™§öÒoßöëôMÃDÝÞȇ7xö×KþÛ_Ð Ú ù?@è'ÿi0Òßû H}št›I»ýÒ ÿb˜¯ü1Wõ¤ÿ÷Wü0ƒ ݄׫Upˆÿú¿òÝYô;ÕÿÕÿýoëþ´ýþ¿ÿëöþ+ÿÿûþ¿ÿÿ¿šŸÿ÷®ÿWÿýÈ}û»¯ÿÒzïþÿÿ}®Çû¥üƒ3Q¼Žd0†ƒ!‘D„H^êéoý×ðƒ3FPÎÁ4A™á�š/´­ö×ú..Ãû‡HØÑ¹èÜëì4˜h-þØa)“ú6‚óO9óÖ�&ô›ÿïýˆ_Òm&ívÿIºôžúöƒDDA„?Ý&ÿ÷÷ßI»×ÄGéûÿŽ=:3ÿÿ�7G�"?ÿ÷­½­é}ë×]‡íëÿ÷õõéX6FFŸÿõ÷\Tr@aƒÿ¾¿ÿïðº 0Ãÿ}ýþ¼Õšy‰†u÷ÿÿ^ëé·ßk¿_ü‡þÿþÛÿ·¯þÕë×÷Í^c÷®ÿÊQšÌ‹4 +PÌR@È1IòBÿÚýÿk±×�“ƒ„ Í"M0ƒ3Âïí¤Úì}uûin¿ "í¢ð=g›šŽjÍînz7»þÚÚ_ÿ¶­¥¶—ÿ= + ´nýºnªÐMé¿ðÒa¥µý¢Æa¥±[×û¤ÚMþÿ¤ûôßü1AŠÿ÷ SµµþßO^Ÿïíþ•ßöv&0Â`„G÷ÕÕ¸"=Gÿüq÷�ßñþú÷A/ëÝëÿ÷ýÿ­zÛ¾½¿ÿë¯ßý¥ þEA÷ÿÿ ùý׊� 0Ãÿ¿ÿÿÿ\.e�ý¿ÿ¬Õ¿ž³QÐ6õßÿÿ¿ºý>í÷ö¿þ¼‡ëõÿ»ýoÿÿ¾ëoÿÍ^o÷]�ÿ®êëÿÿ÷_ò[›ÉÌÔ2,)8S@s1�Æi“ŠO×i_Å{­ÖÚïóXRppƒ š2Dh=zÿÒÛVÒßÿm&×m-ÿ‘v.ÃÖosMÍY¹£wF÷ÿ†=¤Ã ü†0S±_ùèçNh ßÓtô“i7¤Ýÿ Ø„Ä.¿|4 ÂÚÿzN“wþß]>“â! Â+Ûûûï®ÿïú]þ#ý½&Ò{ÿüqöçÿÿ¹Ç D}îúûÿÿÒ¾õë¥Û~ûÿÿýn¤!ÁÈȯ¿ÿùÏí®ÅGȈ"OýÿÿÿúºàŽ£:¿öÿÿ£Uþþj�7:Fÿÿ«ÿ¿UO¶ß¯kÿþɯ¥ûïïïÿúõºï×óW˜ßºØÿúíî»®ÿßk¶¿ÿÒô­.+ÿÒoÛKþ’°Òm-ÿöé´»KüT†Ã}°øK ôÃá,7Ð[¥†øKaôá-‡Ð[|%†Aa¾Ø}·ÂXaôßK ð–Ãè,7Â[ °ß l>–è-‡ÂXo ¶ mô¹ €Th'È »��‚Øhçjl4ÿÿþMº>M¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ�ã5Þ¦h2ãÿøMiã�ÈpAÇÿðƒ·v°ÓEÛ!ÿÿFö‚3¾iôÿÒm&õÛé¿ÿõÓwú;´Ÿÿúºÿ¿«ÿñ§‚#Èõ|ÿÒßׯuÿýuú¯ÿÿÓý.ªÿÿÿûøª¿ÿÿû«Âÿÿÿ¯×5oÿÿ÷÷ü_ÿýÉïÿd�ÿýî—¥èÔzÿÌ ÉiÕýý{ÿò³’3™Àæ€á2pæ’ þO~Ú¶–ÇõÚ_ý{Â&áÞvõý´›_õm´¿÷óMÌœ74ß ½/í&Òëëb¿ÿíé7·¤ý~¦!oþ×ýÒöúooÞÒý„Gz˜ÿ¿ýÿKñëÿ¿MÓö4—ÿÞ¾õûý/ÿÚÿ×û_ÿÿòwý‘h×ÿï_ÿøaÇÿû_æ×þ 9pÿÿÿ÷þj¶ÿþõÿ­ûuÿÿ_¯úý¿ÿßë·T¹½÷ÿû×þ½i¯“@¤ù˜¦™?þ?Km-wöÿ½¯ö¾¶ÖÒÛKç›Ñ½éøä1Á„¢¶Òïý¾½/ÿ UlU?ûz·¥üDE‚aÿý?_ÄÛìuÿÿþ—ÿ÷ØxKÿÿ°ÿÿÿ²$ÇÿÿÁ¹nÿÿùÕíÿÿ\7Oÿÿî¯ÿýf÷Ûÿþ½ûÿÿ­ë¿ÿëÚíÿþ+m-ÿÿ[ßÿÁ”`!ÿˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó%€< ü¯x~?ÿÿÿÇÈdƒd«ñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿÿ�ùm­ !¥´g� ‚åóHÓ „ÌõÞ½ú64Þ¿˜éµH7Méo­×I½ô¤ÞqB>l/šdù˜¥Ìòÿé'ý-Úý¨A õ‚/÷ÜêÿKó5è¿sS¯éj¯ú[÷î¡7· ·ß}úÿKõú¤Ýzíÿý~’®ÿu×ß®ùGÛþ6<îÿçMþ–ÿÚZÿ-ßï½}p–ÞŒÿüçïï¿W­îºïÿëû¦ûò‹Öµ¶¶»õûïWÛÿÿâ¢öÿ´¾×öýóûu÷.±Æõû÷ýµÖÕú}ÿj×ûíõõÿß{ßí¥û~ÿÿ~ºoý­†—{öÿ�Š´·ßy áŠþû¾õý‹A‘äDXB"?¾»_Ûïû°Òý¿È`þƒûöžƒM0…Ç�ÿÿÿÿÿÿÿÿÿÿÿÿùlC–jtv$ŽÆ³²œª£bš"; Ë0â”± ‰ŒèD ЏÒ’€â‚•-oK­-×Iii*ªZõ¥ª R¥¥lh$#¨¯D øUZ +±Â´–Ói(ëH%­WõÆ–±Qê‚ZªJ4’ÅRþ–µÃïªâ«Âm´«A}}RJé$º­X𪒪U©c‚éi~Ö^_úê­*5G µU_Z®ºKÕ+UIV©qT’]%ý[¥Uª®¡% º^½RÐK×^ªµð‚KUT©~¾µ¦þ½j–‚A6Ý%ÕkJ%ÒõU^’PAiiWÒUúô·Æ�j¼Ž××KUø…QIR_¥öGÒëõ_ZKKß®’úÁS¾ºõK,žµê«Z„>µ¥^µõ¥MÒÛAj•é5T–µÿ„qê«T¾ãªÁ/®½%­_ÕÒMùï_Zú®–�ª6ºZÌ~–_Í¥Gyµ®{¬Â^µª7‘ï¨HENù ^—IU$¥ýt•…Ö�¬ÇKI6Òõ h-*£ AeÒ®ëT¸KªY~ôa$Ùÿ®´—Ô¿­v{ªð’Ö–T—P––’¥„“ÖÂJ±Uh%ZˆW^’ºUKÒ´­--j)j ÒZX¨qQPê¢a(¨QLVœ8«…º +«A6¾)‡a(tØIÒ´¢ºXXJ˜¤ðœ*… +º¨¦B…ATÕ(eZ¦…¦!S…álPa„¬ºA0ºªÈò +˜AÁŒ¯+ªª Âj¨42½ˆˆÓ;9B+ŠÑ¨XAˆ@ÄPhDE.ne Z 2¸Ô"+H7Õ'_½%ü›+ën¶¶ÒAÄ+¤� †M³aƒ�ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊhléL€¢S gñ–•@f„zYFÁ¨®j€¸ÎËsbˆà„p[a CÿüŠd%|¦BdŒ’d¡VT`³í"Ø0ŽÌÑNŽøÊx˜ˆ°ä¬ˆ%A©¬J„ "Ö‰�"�2>É|$qGDKC +¡¤+]…Ѭ4‹UlÍà Q¤0wÐH%h/d±ù¢çÂyª§è&Òv¶íÝýRÖÖ˜o@½cµÒTžº§ü¦ÒýÄt…,uôÚë÷I%Òý×käŒë¤JQ É ¼–fE ü}›gÆH ÇIÒÒE?ô¿KÒsHÌd‡ex$G‚"ôã>Í�&‡ H"à5UUP‹z]"ï£í*[RT�ù©«Z__ ¢àŸÐD|qT�V£„×Tœ ŸÒoÕpF‚kÒ^�G³Î•>–�A½ׄSÒpŠ~)u¥i:H¨„qàŽéÂNºZMºAÈÝqÄ-/­z¤ÞCÑÈö+žÂÖ—ÿ×ÒëÒUéië’’émq„#ZªZKÒI´“oI¿.‚I-k=bº_KKÖ?éz¥Ò¤©%]Rú_½RéEÒÖ©µn«ÿ­%IRI$õUI%K×úÕzIzI^ºõ®’׺¿­-U.¿K¯ª^ºKT¿­p—ÿIÝRR1x®—†ðÚª®õZ¯¨ —KUÕuúÒ¤•*¤—„•{·ý5It’†«¥´¾´’Ç®ªºÿIW_ú×Ví��}~©zÐbê—úÒÿéMU.ý„8^—zUU×Ö©R„z’F=úúZRéKùšÂ(t_Ëé:Y/ü<¿‘ÒEúAëKßýu¤’J´´òþ–_ÈêŒ%Ïyï®6ÂX%Kz‡ V¡Ü= Þ¾©*\Ú¬¾ºIzWiŒTUÁí¤ØI#K +¢¢]h*ªªjš¥Öª§m#šö·cj’J¨*‘)„¨A6)Šâ«¦Ua°�UÕB…H¡i6—©V¾µVǪ´‚ BC¦ª©l0ƒ!„v.ÃíP7UßA?B!•aaÊ’êš*0‚HîЦW)cCÄ0„R+¨‚B5²¸Õ]KYKH!HÐí*IÚwÒˆá+Ø…z¬�Â1 +?þ endstream +endobj +349 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 16 /Subtype /Image /Width 16 /Length 238 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ÿÄ8!1A2QÁ"BÿÚ?Ó±öñdnD<¤ +ÛŸ°»‰ÙT xÜÚüIÞ§‹¶<ŠŽËmž±Ü^ò±>Ô�Èìf]$cê ÛŠÿÙendstream +endobj +350 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 104 /Subtype /Image /Width 64 /Length 1216 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ h@ÿÄH!1AQ"aqð�‘2¡±ÁÑáBRb‚#ÿÚ?õ@hQš ^jxü|8™�1ª³}Ä {�굫�[ÇñЫ™�òZ:¨?§Å�|Êá’dÏ",®¦t÷£ü—*X*‘mÍÁßí¡“>`;Q Ë‘}‡Újˆí.N24#KÛÞ§‘²2¼cq1¡^FÑnïÖ¢1åÆmŒÝû�‰‹\ÿOZ¯ˆŽ¸Ù]8žlEõ‹ +eËœca�å$�{Ç]ãåôªeÇÌOp1§IÞöµGøìr"�×»XîØ@9šÙÑß$bÒv´r¹¶àZî­Z‡ZÀQ‰¬+T¿� €À‰Ð�6ýë›R™Ü1f"/ǹºi·ÓÞº›(P,dí½`F`T†¾«´ØŠšy8تÜ aÄûÁ¾ôËÿ†¥šI¹ÚI�ÒÚP_)HRÑëV&räa�WŒêv*n¬»�§ãJ–!1åpÒ/AÄï½È@W„žÞÐ\ÿ#$íéhštóW ‡•{I2I múéG3� ªãrI&$Z +™"Ö™£ç] ”;ÜAë[%¦m¤zïKåŽÀ×í`ÒcÚdØ^âÖëW¡F„ +4;L´x,SR&dsûzŽ£­+ù8±}Îk}=蜠·'©ØzR®Br²€$^ÿÓ.dcÏåÓZ|œX>÷U±k˜í]OÊ�r+gMfѽè.T{×ð¥!ö¼^ "œ@•0 ^æ >✺.àh~¶^ò¸–W‚6û.&F¾”îÉãâ•‹*“bv + Å*‡,ft :jj(¶E‰™þLE­jo<¬¥¹»ýÊ 09@‘ïy® Š4é[Šë‰U;RŒH„� ©·ýI<¸‰ëx)› Þ·1am-Yq®1 + {¤>B¬Ha ƒ¿ëU"�µbhûÅOÄÏüœ8òÇh­Ç!1V¡3FEsÇ�ÊÀð ÝÄÁ w=¢~qVƃ…@°ùT¼ˆíòt�¥OÄPÚ%ÞÜByØ~{ë\¾#*øÞ"´q%Œ�O� >5lhÙ•¹´ª…D,G @ù×Cã™N4I’X'­í³RÄeÍ�´˜ˆ›Á ÷WV, †BÏÌ–üæ«RÏ�3… Ë´‚!ŠÜuâDû�ð0¬…I˜ @Öm{_¥sdñN@ˆí�ˆUh‰õ,¦ÑÔþÓãàe,X€’ÏÖí'}:~ÓÄÄŒ* I�é5±x˜ð¹uå'YfmçBOZÿÙendstream +endobj +351 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 16 /Subtype /Image /Width 24 /Length 280 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ÿÄ7!A1Qa‘"�ÿÚ?Ñóý9±•P¢LɽE“Ó¾—õdT±°iaEä!yÐ ÂíÜ ö‰œ²�¨eª,W~SëÏ�]ñ·0êkµb‚ñI­/o3eú=‚5Iõ‹‰ Ï� ¿6\kê«`1ÉZH=lMµÿÙendstream +endobj +352 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 192 /Subtype /Image /Width 352 /Length 10478 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ À`ÿÄT!1AQ"aq�‘¡±2ðÁBÑáR’#ñbr‚²3¢$ÂC4ÿÚ?ún ã1an›k¯òáUÞ¬bG•em1@²“$^)·uÉÝw/€€˜÷ÈhƒJ&!ãÎ+¡ÜPÃB&à�| .<Œ]”©hªÂ˜2µ�œÎÛF”K*ê@ó¡î ¨_KëD°]HYJ½Áʆå�¤‰åLXsJÙU"x˜�'ãʉu[’°ei‚ r ™æ8*LÙÝ«ºLÆÑÿ•;:�Hz*C •ó"8RnÚÄøx×?î];Ÿi‚…*ìoÑíü>óðñµò9YccðšË� ý2� +qâ�eK’�Í`C hˆ„�/Y²*�§S§Ö³:¥ÉΰqÌQÞ£ˆ¥Ç‘r¬���ÀÓf¸�užÌ1¬0•ÜÅMv˜¨çﻬ)lH.éÜH6cÈrÖkÓÜ ¤MKWlެ ˆ3;§Â-óªÈ&&õ3…1«”P¤�@í®,ÁpŒK‡¥[#©’¦KzåWqP¢d�o:[ƹñ¢+Ž�ú®Æ^ 1¯Lü-YpáíòŠªr@0É’dZçY¿ +éPÚ ¢÷×Z +ó‰ÿ&r6«,¨b&l®7q 4{<>Ë `%h:Y£úzL•ä4®Ì¨¹0Ú)d!˜MÇËO…rã}Ï”•YÇ‘1‚öä�¾%¨f>ãvû¿RßÎRºÜ–Q&>:˜›Òûx� é¸|d¯3ñ¨‚_*0ÁlIÒ2`ètš³+ãÊ¡Tl*w6�¿rí²Ü*9�{¯´1cŠÓlk´Ú�ž_‘Ù1áN™Â0|ªƒûfÕèl&g‰:ÖP§çá\òZáärA +0ø2‚)—>g•ªo{ ÆW] òóÖ�a‘²{²fö)úš^äíφ-¹àø€™ ZžLaÿä0´žœY­6¹ÃGµ'6<›‰3•Á¿ÊÈ–Õ|u5Øíûmª“ +â,&˜æ+Ñíò ¸Ã,Ęž7×SøÖ�bWv,´I7ò1öê»TUt%·LÌÍs°D 0ަˆˆæ /LJwþÞ¦ dÄ3ª‘EX¶A$ÆÔ>§ð¨æíŽ|äïBÂ�ªX÷YM¾Øõðªd\iŒ€wL,}Ň۶æ}I£Ûª°3;�T•Ýh± DE¸ÕÐ"içNs�<Ò6£ÈþUËÿ07vY–Hœn$"Q†´{]ÖN•)‘È–VÆ žvsø§‹ÛÅÜ÷ØŽI:’ù ~_*éíqìc!CmP`\ ÇWê¼Æ•wƹT«\h{AS$'JÞÊøë:úV8‹ÏÄÑBÄ�@A™6ÚѩݲuâxÒãÀ˜‰"dñ$±ùÍP c'‡çH;t/c:Ÿ*Ç·K6ˆ¹ý:W.~ØÊ”VÚ€ˆS{,ÅÆ€ +ì\j‚G!­ÏΗöø÷Lj"NÛÿ·J£ >´2c\£k\P81± ÅÄ�úZ±À’Lj Ñ—ÇY×�‰U·x�J/�\™ô5?Úã  €@2t:Óãĸçl�S2áLËF�íqo6õAçôÊ”ö˜ÌýßÜÜ=hÏ `È´É õšº¨@�ÛcÈÛ™A<ãñÎ�í±”ö€£@-Ê(®Vðy’OÇZ÷H‹ÿqŸŒÒžÓ (R€…@"zlcä)ß<Ÿrƒ`>Gƒ`F"Aç©áAp"¶á>¤�|&˜`Aºßq’y›ÈS¶Â§›¶Çžî&Åu?iÔQËÛbînE ·t‚ üŒVnÝ$G•»LNYdA’ ëj¢bD$€:Ó�Z´V6­Z¶•ªxò.e ¦ÇĘš¥OBäô‘L_àiÈ­¤M`(šGr¬ÏÀE8­Zƒ€žU>ß0î°u2ÁÖQŠ�'ˆªšQ­@Ôñef8}t#Ò)²:ãRÌ` h«ïPyŽ64b°¢ Õ©÷‰‚<éæ„^´V'h½ÑZ+•CöêÒÄño¦€šØ°åÆIÜ Ä‰f�»Iñ"‡j¥Á–c 5> +ß_ÄZº†‚§ŸÊ3,^ÜmÇëü«œ‚½ÀǽÿȬó»íöýµ€#Žê³ŸÛÝ�HÄ’ßh$Í'hc&EVx?ÖYˆ€±÷ùÖí󜽶'¸9T5ÌÁdß­§åU�ƒ2€Xï=RÌÃíc`L·…5ÎV›*�&ËëçI…IÛ�²dQ¼ÉMôŒ~UÛ?l-ÄêO�rÛ6bIr¼Š³[�…–Þ#ήUŸ"˘È[zu:ÓcÄØÕ—y:í&IQÔ™®|xÎä€îC^‹[q´éöÚ<|!pã9Ô³»ž¥#¬¬J¬Î³©ðð¦Á™û¬X '­šaºÌ�/çO»ÛwÆ‘¶dÉ^­Ö O¿˜©öÀœ ÿ6K�ö·�ª¶ìY”%Y ‹X#˜ŸÕΑZÛ˜¶éÐÊ.³Ï•?ÿ̲ìÄX’I´kéR\ç·Pveɼ’#«jðqÐÃÜ0M¹¥†±çPíSpul9ãÓêyÓ �KŒÄíMµÃAè?�l +îä ªÌw@é¹åëSÊÇÛl¸ØõnƒºT ˜Ü,Há{ðá\¾lw/È,öé¸ë1IÙb.Š]Ü•‰;�Q;X›xðôÒÕÞ+W8&f—&tƒa%¯ü+›¹ÊëÚ �Û7XÆ©5ݰNë͸˜øi\M‡>gÜ#Õ�|tð®ì{¶�ÚÅÿ>•ÏÜ(9Pž‘áÔ¢ÃN:ÑdgÊ –ÚBm¯=måð|A•ØH+ÊI`u¼ùØpõµ\�¦) MÌž:Ç”Òbí½¤ +ŽÐ$É·ÂjiÙ¾bÎSê$´€—&gQo¨®ÊŽnßÞ*C²Á'¦é{R/g²B» 3hç<¿�Pöäã ½¬GU·ZüD|¨¦-˜Â66ŸáDâ‹DDZ"¢�¡RXåÈÇ„› F‘?J#¶Ø»C°Òö›zSª2rÖ»üªµ#�K ™ˆHI×A@v‹±�’C3Ô"#Cj Û0 œ®HÖvõyÂý"³öåò‡`D °G�§çUE¡F‚Ô¹pû£î*FŒ'ÿ�4· ¶ä˜ ž2/Ï^4رûcRIÔšÙ±/p��Ä«¤sÆ©Z+V4¨ê÷S €gÀÓV©cÏ�+0V®±æGÔ¡©]Õ±HæipåLê �GÈÕ+p¬(ЊDÍ�Ý‘L•‘æHú©ªV©ä̘.cý'òªkXЧî£döÁêcÊ?ˆªE( +LýÆ>Ùwä`¢÷òŸ�&œ^�­bE­XPÜ9Ö&� oF-Z"“eλÐÈ:"|§…8j¾Bå�bc�Úž=(¾FíˆÓ®§Ü>D(@¼ÀŒ �=4¯Œ’¢nxÖv) úXs½"1wnøkIö‘ºD¨0¢÷ƒ˜ +ä\ãWE=lmýÏ­Œôq† +1s\ør?tEq¶FЪ@7Ÿ>WA�‚bTÚG­3J)ÛåóŠå-›7%÷„‚@Ö8@ˆ¢Ã>íC0-´ºÛ¯Ã�nß;)¿}‰ÝmzyyÐÁ›&eÇ”?C;Jõâ×Ñ"¨;‘�•f]ÖÊ~‡Æ¹f׸öáßbAk»%ÌEvãÌÌì³17þßãSÁÜdΉ‘(à0,a€` +ÙTŽ7¿Æ¡”>L+‘Ü�ÂB€%O™ÿåUÉ›*ç ° +Ú««sß+1$}¾µÚ&/QÎì¥m¹ ˜˜±<Ç/*çöù‹30ÚÀ'ÿ_(‰“»ÔŽÂNžÚãŽ7®³¼×{�¿®g~çnѸ�Fí»7\NѼ¨µ¯š^õ²~Ï8Ⱥ+€L\C^ÞÖêù,®SÄOÎ~”‡¸;Š ügä§�³+”1}ȬhY´Þü|ì|*á''¹b‹íÖçÎ�ŒÙK„É·k@é ª‚'ÈŸ +9]˪‡Úá÷Ió´[ñƘ˜¹7�-§êãzålÛ¼ÞQd*Þ/?ä®–Ü_’ˆ¿9·âÕ]¾,øÕòb]ÌÀX28U°+aQŒ±mª·:›F¼í4~BD•""ô!Á�C4ž�Z>æ$.ƒI&¦ŸºÜëúmµŽÙž©Ó‡Û´éî¬y;›†«}¼9DøÓàÀq&.ID-þ´¯‡#;Ú‹O - Zuâh YXå ͈‘aãj¶48Ð,– jxÔra|À®@¥H ‘¸�Aÿiµ½ ƒYqf€†— EüŒÓªf¸%o¡?í�Π�¾e“"IáÿTý WN0ÀA¤]w ¤ ­£Ä|¨{y•«FÞ¦1÷HX֬˸G•sœ“pÉ´)Bë{NãááGÚvR®�·ô´ë6ùT—·Ì�¹YtÒ=#ÊÃñ£âí[%Æ"oÂG‡…6DÍ +Q”÷ 5¾T6LK2ýEC°\™pà!À@Š`\°Û`NŸ]l2p+¯tŠ �ñ³1Çíò®\Ëîd(Ùtøn±¤Dk_Â*�‘mÎÝ�ôEø  X~ àÙqäW9VäÓÌ(hrÚÿ­W ¨DDÉ"Ú�f*M‹?PWP„©%~wªvøn�AfæXËA°¶òá¢DDáxáæ}&½¶]¤¾@Í'i "à4ŸŽ¼­WDpzš~Ê‚aÙ�µŒéo¶uÕEjÕ«q­Z±¡¥Õ¨ÚЊ$‰‰£zkR©ˆ1­0¬t ´¥Ô6Ùxq¢[h¬ éÆšµJÀ4hcJ¦.K'ÀI4Û€1"ySRÄê(ŠÑZ-ZµmË1"yV:VÖˆµI²=Ê�8E͸TÕŸ#ãr»zo:�Ñm]¡d„ÝúDyÝ¥ÛRgîo_»kT7eÒW}¼íC?Ü€s�bÒ?8®vžë&D*¬ªÛZD[j8ç?w‡ñLYØœŽÁ@V½öÃlS'ájnßþEò:+£‚ã†7 +¦Ö,º\äÙJñà~ïQëSíò*‡*±/~{‹m3ä•7î]w�ŒP)'yUÊçÆ¨ù™KXB‰ñ‹ÿÇÄÌâX| ÿ +Îûm O?…s�Ë‘7ÜÌÈ>Öá&ôùeeVÚ Ik�Æ?¨p¥GÈÙ›iûHR¤[ƒJÇn?êïÜ:©Ém Ö½.5ÍÛ ˆ�”XuFÕçøŠ³;¾Ù#‰‘Y¥_yºuby@ãÆŸ{Ìl6ã"ç\©‡ \�&ìXL î/'Ê~U×€2¨V禆—¸Çî.Ò¡ÔÈe1AçãSí»iŸ%Æø�Në‚ÝS®†<€¦À„c0å‰$Ï t[ÿ* 6€Ò||G/õ¡…scP4Ì‘ah?/ +¹1lÇ�EK1$m/<8ÿ9œNNcµºÐ/éÿv�_îð§w&2…#~ào;CLå]JL HÎÂa �‰®|½£eWÚ}·y–]D€-ö¯òª„|fTL›ü*^ÞOeRíÙv!œì Ë\\ÅeÁ‘ +äU€ ƒ1¥ï6’«}§Êôݲe÷[#€7(®„‘û¨û“<'i1:øE´Y¦öÊâ`%§”ÞÞížÕAe-÷K°c¡ÔŒE¦AAܾUgEP#FÝý@ðÇ +8Ó. ÊTñž©ûtô�k:d +6¤�ÎÐHpkf÷Bªî�éŽf~µ}j?äK[I$�>QüªY—1!•A#„Å‹)×À +^ßLo•Šÿì}Ñn˜THÿã5°öïŒe¼Ì6‡¥T©×Xþ\ݸ.AE4bÒÍÿh>5Uw:¬Xq›×6,�XA;›w u�keÂí…1ÇÚPÍ¿ýL­¦:£nØ[é7¯N…j±­XTóaLé±Á‚A±*dEõ§P8Q kkiB-D­DУZ€­ÆµZµ5¶‰&ˆ­¥n4­@Њ5í1d;™A5X DQ­fµj–,þè'iX$\ƒ0cô“A{‚Ämàƒ&бÎÿI¦9z¶bbf-ñ©ö„”’d˜ú +ß»V.YÊ0VˆlQø5g}ŠZ ðÒ6b¿¡�âÑËΤ{ôêÚ¬v2«]GSEº˜P§ËÜ{z)c´´¾Ø°’/z'9€B˜‰ˆê6ÓXª>@‚OÃ�K÷1V[w9]9Z¦{ôQ%X Ü Ã¦w]d[iŸ†¶«&mú« ‘ãø½M»‚0AX¿ýÓÆ‰îÔdL{[©w @37â�îæR¬6‚t™4‰çJ�Øy!ZÚèt0E¤HãM“¸(ÀN¶‹µ¦Õb`MHfÛ†ÐN¤Ž$lj5>þr¦zB�î̤ŸÓ·|+£.aŒªÄ–>ƒÎ”w+¶a„±P½ŽÙòñª{„ ­þ¾Uæ¦FÜÙB»C„mðBÁ&Ÿéø�z±÷nP1Ä÷1m··Ü%´ó¿…Pw&@ll»€2JÇ—Ý­.Nôb,�¼lwÓ›÷@Ü#h$ñ°Ö¶>érp ÉnÊ~U“ºÜW¤ÃÊlbHåø4Ùçaåcñ‘õ¥nà#ªm&x�ÓÊxßÊŽ<þè$cxÇ£îœi¹ï0?*Žù2î˜P w)Ö…S÷Û€ŒL‹�p¨gÅûb™aÜ)yoòº·éT9IÈÄ£ �d$DyVìIÄ…YXs'¡v`~¶L�x²ms1`¦tmykƺ;…gÄÁEʘ‘:�1õ©û�“gI’pˆ"Gúüêx'÷9© +è€8©yòÔS÷d}ñÀ -r¸#ÌOŽ@ƒ„IËñj›ÆL�ʼ$0�ÔaÖ"<~”¸0²böΣaž�áTíåñe"S‡¥O6b]ËÂ3mA‰?Ó÷^œi‚ç[Ü7cë§ËçPPé$£™VcuÂë·Ê¯„:ãa´†Äiê,/â)±ä÷ DpΛºTÈ€>è�Ò 3�ƒ�â+.pc¥¿´Šž([¥�ÜEˆ™fn1ΙÙÜSA‘2!4ŒUÃ'³‚ m<"53QÄr îh’WnÐg[�òõ¦íònÎçc€Í • ”çäjÁ²n¸´ü.G.6¤É½Ž,¾ÛZåm»FXÖ'«Ÿ:ÛIî Ã".†Û}ÉÔGêE%Q”)’[[‰$Ÿ ^¥™Y»Œo¥Xýű¤×pÖµz5¨Q­C�ÄPãB/ZÕ­MJ(ŠÂˆ¡[�i¢+ik +&ôhZ´Íh½hÒäEÈ +ž5Î;$Ñ‹2Û¤ž›xWDV4Ƈ +"´VÒ¦½Â4ÄÛÀÍo}˜À‘¶çA~u²wñ&÷`$“ Í+wX‘ ³¢d›�g•Üã"A�tzLkc­fîqª,Í¢ý/Cw‹+²)2 cÚAˆ>•±ç÷  óçó¢¿ã0ÌX¶–ÒÞë[÷ #[écT'mÍOtÈYDÈÖA]u£—'¶, `¯ +OÜã)¼�'áEÊ® Hó~µÎ¿ò]»íÚY·Qšm<‘yªäɵ�©¿8ø>Tù3.!&}oüA¦F$Rd̸¾éôýO/r£d î7€m:߀¦íذc»p&Ö‚< ™—¯ÆáKGÀL9¶YæÚñ"Ât©÷=Ú®¬¤†TfˆÚNÑ6Ü?*¦>å¤2G=?…Q³*˜½„˜Òdî2,Lܘ0üXkD÷(ªçv€)'áDpâDúˆúÒꤩ™ÐÒŽë’È‘´ƒÓ—÷ÚyQ1¢L�ƶõ«&A’âtNt£¹ÆÑA1 né@gVb˜0yƒoã\ý¿v !É’ì£�ÚXM……¿-k¥ó¢m$ýÆâM..ëbÊ$‰DéO‹2æ³êúÒfî=–UÚIcÃ@-$Ï�cÝ"¶Ò‡é$_Æ"�ïq*Ĭ%”¢–c +˜dò4ýÉ +²D�ÀxÚ“qÛçd*Ab»”Åö7#ÏÛ�µÃˆŽ¥\`�ú6îøE#÷xÐöËî ,FàJ†dØÑf¹ê�+µ½ XtÈE¾ÛÄøk\Ù°+dÌ/éÄÈmêéêþï +—|Ø;n×3!ÙµZí†`ÚÆ[âk°÷Xªï@\ ¢D°ðçNs p¤Üƒþ�~¢¥ÛæÇÜû…3&N¡`ûv0y‚oC¶ã±UéC;‰Óuüí{ÚŸ»Ì¸q–>šž¨°·=3jæí»”Éš7Ðx,^ ¤“¶ÆúUûõ/ÛfEY@ÔÃhùšL¹•Êj¡!¤@"ò:¢ ÁŸãT ï9Úò˜3Q\½»âíûk¨ U7Q´(µíj¹î0âØr²£>�ˆßÔE©ýôÂO¸BÈ&&zTž¯Ÿ¥[P°‚Ð øÑÈhV>Rñþ±\=Û. › ÚìvØ(ê @ø[Ò½E`Ë ‚„W?¸�³ìI<Æ’Æ>Ñã¹06<ý°c;@꿤q´qáTï²cÉÚw +“>Óð:í<üë£+« °2ÑqulL¸sf `¾@TjHÙ�f<Á¥ìrcÛ�’»ü ´^Ù³ªÎS,«¨íƒãén<¾Ðíò® aÚdÆâ:v“mk·Æ–L�L_Z—vB2;Q©žejŽÊÊqP.m4¼�_åERW¨y¸ã2>ZChÖ+¨€9V n(@šÛEhAÕ£¢'ƶg*’X�ru'�Ö°XVµh�Òå\Ý–ÁŒ.M¥€V`˜ƒ¦•ÕŒ +ÚP±­¨ +Q�BŒQŠPÀH¬l(Å#J4H"hÖ©eÄÙ]!¡A$�êå~_�ÙB¶@ê’'¤�F£�‘nw kzÏ”*±XfÀ�Há\Ù{œ¸ñãp‹ÔÈúouKXQ>ž4ç6Aœ&Ѳ4Ü’›p�£ãá]$�­(ui‚ k}(«6 úÐÞ³'ΰum>µ‹ ¤‹ùV +î›VÜY]\J�G0f•ò®8ž$�E³� ]ºúA33á]2 *äF;A�DÓXT;¼í‹\˜‚»*˜‰â&©�$ˆb7x[å@¹Þ A?J_uŽ"軎ÙQ¤Ú@ð¬;�1ãl�%à™ê"`s�çL¹±ÇÜ·ñÁÑ›h`Há7¥É�12+.`y€OåG&lxij*ƒÄ�)õ ù— dÅ ë"9Í1uqkÒcÍ�0èehÖ5“6<„…ub5ƒYs#1PDýuþŽ|A¶o]ܤMR•ÙPI GAr&Eܬ]gê+£&0X 7¾§ÀV‹Œ�îohÔÆâ'ŽÐ4ò¥îGRy‰øŠ–DÇ—24x®�mqÀU X[åSÕŸ{„m'§¦ 6½‰·�ªçPÀ'¨@µüç…qg +˜;—$nÉ�޲E�ªmaõ&ºÛ9 î“r9™o§ÊŸ“ýDO§ۤâEkB¥¼@V*5"L�? +R¡„¤/Ó>1ãG ßž04úÔ; Fl$h^ËkÄúÇ­*ÙÌì0ƒl}ÀgþÝ#Æiûtö÷DA3oÇ(­�…ʬl Žr#Ëñá\}æ;|çQ»{0Ar¦dié]9»t)@𾜅ôà*aqª™ÌrJIŠ*]®tÍí:„U„0¦J©WÛ¸úÚ¬�S#˜]ñÓ:êÚq¤ý¶ æ*¦Lª:ø‚7¬× 5<§©m7øx×&‘¸]­»tõ5­ åý>•N×pÈÁ€˜´ÛœyÚÃ�¹ÝÕK)a$i#I‘­s¾!‘ß Œ¯¸^I;b8TøúÑELjo;ŽB²zgsÄzüÍ6ÅS��Af€OB±´úÒ#Kº©R‹*`Ýl¶¶‘'ò®¯i:„¿»ÆÑJÃìÛD[O*‘ìp7Ü€Þo{î7ÿp�í0ûžàAºÝ\zf>~5FÆ2Dð¾±Yqª.Õ°“AÇÔ“õ®<݆=Áñ®Öܤ²ò½†£î¼ùšéØ3(Þ¤Â�¦\(¬ëA»lm25™¹ã­‰l"Â#ÓO…2 M>f~´®�µŸCJSÛã$42< E7¶«8G¥dĘD(€4r(° )µÂó¹È#N$zÀ¦PGHéÓÃÊ�ÀŒn¼gÖ"‚v˜qY(µ€�Òr|)Î0D~t¬¬Ç…ª¦•”1§“·Åš7(1¥ª�…P  øÕà‘1qáÂÔ™{\9×nDW0À0Ÿ#LpãdØTˆÚDˆåŽ%e!„ƒb äV8RCm8Åîgê(Œ(~Ñ»œ^ñü€ċ$(Œ˜âyŸ…‹ü¥ÉárçNT1¸¤=®¸ì^£&ÂäZMĸ@Ž@E˜×$ÞoIí®#€9¸0Ê$1 ñê$þq[63•Ó¦B´ð�üêÈŠ¢Ê�-XV­BըУZ…¦µmj+ŸvSމ¹ð +mýÕOqH, 홋Üp­‹ Ì�€"xåjakkI‘ö :T׸ qÊž±<-i½\ÅaB�Fµ£KGZ"±¬)U× •29ŠaB”6âG*j—m›ßRv•ƒ¡ò‡�Z¤ù +‘ÒncùÔ0bdè%¦fI'„q-ðò®°»DW›Ÿ#cÆ�¸q©`³ä@`à…uçy´�$[Kó¸ èÃÛPÄõuG(c}m>_•3a"B³â~‹ky*�iÛdÀ:˜ÄÉ3âwIùÒm!Ô�ŘÉ+0c‰$Dò¿†´($4»Ù�´ ®l~>&½*çïÄ-àméQ +wÅúB£‹ow1ÓUË�f=²H%Wú`1clG?:Ÿp6¶" ¸é¹5¦[çaà~‰KÛ¹~ßÝ'«lù� Òe'Ä “9nIàçò®¤Â¸À×øù×#“ÚʈÑ@2dJ´ø�9i]#àRú•íIê1ë5“ä˜uLIÿi‰©$ö®õ…ºG¶ÿw„ÅïxçK•?Æåœ»©'péÙj-ÊÞc[W¢+ÍÍ�âÜÙ Ôº–<ÿHfµèœjÇuäGâ.8ëøŠæÇÛŒŒÎYµ6™©+#tò‚eñã’X°$MõY +Q™ñ®ïÒÓbAˆô›þ/TíñäÇ¿{†¥@]»úu3Îi;¢Áñ€ÄI¿©yŽR=i‡j�=»ÇýFºgçP\¤áÉ… a´rŽ7¡‰‹fÌ—ÚCAc��!OÙ(öÍ®_ 1oÖܼªx; ˜ +7¸–Ö†o6.gÖhcíÆl„–iF>;ºŽ³<†ž‘]l¥ßÖ.o\˜²öñªô©Å�‘k�qA·�®ŽÃÿ_¨ÿÄWUK %’ \ý+ÿÙendstream +endobj +353 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 88 /Subtype /Image /Width 336 /Length 4552 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ XPÿÄR!1AQa"q�‘¡2ð±ÁÑBáñRb‚r’¢Ò#CÂcÿÚ?ú.Dî2°À�¾ -1óñÚ“7q›6ƒ� @…n,8�bû‰ð®•/’y [Y�$üm¶•žÓµ=¹ÈÅùŒ¬LEÂ"ó5<Êï˜(xЂ‘!ç_ekSÝœŽ(07Uq¯ø¼)w™]„h%£Oå-oÚ/�2"�ìX͉�=ʵϛ0RHÍÆA_-¹ÜML·rØÐäãëâÉ"mÊ­…sð+‘¯60$/ÜO»ó¡Y±çTg'’³Œ!P|gÎ+Ÿ.Në+¸ÂD©� Uh�nmu®Ì‹•Ôñ`‡krø×6S—•ò…†òòc&ÐFÂ4©¶C—·îFL‰;�…Ò}¤ +éËÅ»ŒJ@žÂÀèQMöú©ÆT2ÍËÍ`‚ý7©g9Ì bA*TLGñO�TzÞŸ0Çq´Ÿ•ãàFÕÒ8¢”S�J*Y—!+À€“"ç ðñ?¼Hd|.#)‘ €DÞ ¢ßRïL¶lrÍĬK\Ž:ÌXÎÝ7®5î{¬òøÕà4@øùL0<˜EŽÝ+§+æõ,Ð"“kµæ/£&L�€ &À6ÔkÚ©›#ð&ÓÇŒ‹Oë�TDÈ™�_âk†^Ml|.5Ón›mã[|O#‹@‚&mùчcžMËÝ3Ûä9½Nb-n; Þš¨ø²r,¯‚$›ˆƒ¿Z†^É�QFC*KaȳAtë·ºu‰MÎõä« |…Ÿ?"@»´‰’ço +èL}ÆlCún@'’†ø…ãx¶ÞÊ·qÛ6|MŒ°!ÁV�n¤FÄV´Èùqåæ ¢•Ž6<Š–ý_Ëj©Å�7•ÀX6‰3=IÓÂ(|YK®“ã~Cî©çí²eÈrqX‚"N÷S67¼ƒî©7þ~R…*¯™˜y ŽSüÝLÕ2vÙ_6<¡ÔFXã¯2¥¿U¾šG¶îy3 ©&@ÿŒ˜úëMÚ¿4eÈ@‰ŸdøÇ_�höìTK’Óõii-?9¬§k”fõYGéåþª¶uÌÀzLªwä¥þæZÀÇŸœ—N=8™ÿ7/ �¶L +ü˜0gäX‰nGs5¼8r:*³/0Dy��3ñµS.g�Å€‹‰Håkkí®ñ¦A<˜·Mg¬û«/�!º°�duùEdvù.y€Æ$¨� +f ÏÛ¥tÑ@¢Š)3 Æ•>ˆcÄÀµ©…sgâG6ßu`&`Íætê=ÛüG³¬³vÙ²ò@à+åQdA*zôÒ*ØäÄ�‹€…B¬Ï,p¼|µÔØH‚¤“mLL{£åVQY9HR@'A75ªL꺘¢�"Eb•9JFŠ:T‰´)M1Yt\‚5„î Í8‘6�d ÅKxÙDúL›Èo¤�G”µíøkUl`7¨&miÓ¤ÍèÉÜpRÄ×7ð‰­6B7$�Ç#*äæÝÂâgR/6>Wò1ë¦âk«×•Xqäx¬‘$Áo¸p"bÓ:ØÈ¥@eH�Eäkh¯;¼Èù±«N¼ÂÐ�€:tÖðkª[×$ )eåb5:ø�ÖMO¶_S+4; �çŒÀÔDô2kºˆ¦*(¬>NËÈôñ½ra%»’X 6¦DF=+ß žŒ‘È•Lؙڷ“¹d01³D|†ñYõ×û‚²ßKü>^?7Ïšw¨æ`v‘Ù¬Á¼mT\ü�Ò@˜Eí6 …ó%]z ‹ÎÌ|<Æ—oÏ·EP–E‡,ƒÙµ««4” tŠåoPap‰É‹5‰â!Ø�`ìzU¸ž 8älL Lͧ¦Õ¬¸C�øøˆ?*M“'§*žh°cz9VìJ1ˆ"DEŠž'Ù÷ÒLm‰×RU&.c•ì#õVûŒrUÀ-ÆÐ •iñ‚£çY_<�M–/'Ê DoêÖ7dUQ�ºj!c©šÉ-ÛØ+0ð¹û¾¹û|y]»¢ÈQrdy’!�àËUþç.@@ÂÀ�«@RbÑ¿ÈR혻ƒé²Ê’K�03 OKŸÂ­•!ÕÄ›��o÷TØ—õ£,¢O˜²ÌjOÚ+=¬öé.æÀèìÌ6ñªŒç’¯¦÷‹Å…�ÛßM‡,œ ÀóNÞÍg_­e¥¶ƒð3\cž$§0'De›lk©™K/$& ©ã0×ëJÇ#�i¹â ú�ÝTÌŒøàkb/Æêf ƒc½ræË—."¾‹‚À�­ÉO�»ö^™Vné2q0¨ë§ñœzmú .Ó8‚À¨b&Ñú×»”@�²v¦mA®|ã�WâL°�~v¨NGË*Œ9ó…>H‘3xüâ¨ô–c¥DIÜ“¶ñRÌÙñ"·=”2•>^RÀ�û´:ù—¹TÀWŸOý¦µÚ«GSÄ_M@Ðõ­óVb‡hÒWÊ}äE\ +tµ1E(P(¢³½Ðt§YŠ"³‡Æ,ZwhŸe€­íLSÖˆ¢Š(¢Š)F´"Ô¸Á§NŠ(©&u}ÒnÛÝMry¸‘s$EÄ}2 \“Ð}¢�Yfd¾šÖGp…KÞ� ˜è5>®Ô‡wˆ�9\Ìe6îq"3³TĘÊw˜²IØlmr¿"/ÓzVõÛØoósþ𝍦î1‚ÇAï©y�Œùˆ’,¬n<­7pŠo;h úŒ >¡ÜduÏ„  ˆò¹öì4®�U`›ÛÀÐÙÑ‘>økKeÊ ˆ1pW蓮•Ì ¸›ˆµl×ÎÏ�|€y3ãìªú¿ó›qÓ¡ñ·ãI»ì)«n±3$/­_˜µÅôñ¬'p�ÈÉu�WißÛB÷8Ù‚Éé ‰öMk#”Nƒó5‚á€~P vÛ©£s�+Sq6 �¤Á×í§Zu‰bZÄ�;In>R5âWáÊõ?Yq."äIˆ-via÷éP9ÐTžL×�Sm�Œ�«»|ar/ιW‹wÁ‚ +€6hl³÷Þº3÷J‹ä–`G‘ ¹¸‘+�^åб'Òļ´—¬û÷ª¡À' ‹x‰ð? +íÕÏ…@vEQÅLÿQ¿KÌÌɼ×0͉2º¡ ³ˆ申™Þ¡ó&\Ø5¤ó.@*ÝÞla_!Í‘¡g͡ڲî™P1+éÉbÄÀXñë5„ÍÚœe°Ì>eëÐ�k]¾UJ:”U¼}"ztŸ†ýŠC€ÀÈ:W É…üÎÜH)Êy^>�uµŽ£â+M”.dWeä �êâûV?órc3X9̈úGÝVÍ—•ÊO•d–‘ÄE ßßý>Êm—œ©~'ÎBÉ!fÚM�úíEâ  )ÑDQEC1 +èHÞ$˜×o1öŠ›åÆáز” s"435žÑ—>&É�£Kd†Xz|Ø-ž�?ÏsÜàË�\dÆW�<¤•óËAæ÷Ò^çlo�äÆË 0Á�@¥´Ò5ýܸsã=¡epyfÏúß$|Iî¯\²‘ ˆ¯ÿÙendstream +endobj +354 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 56 /Subtype /Image /Width 296 /Length 2097 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ 8(ÿÄM!1AQaq�"‘¡±Ñ2BðÁRár‚b’¢$ÿÚ?ú¥(¢Šè¥E•LP(§JƒEh§EQE¨¢•=k ]Zå,*WPÑûSù©* 1€L\÷LðùÓËÔ¸"³5ÄÅsâv^Ÿë3êd¹–ò«·Fƒ™®‡ëY‘U��Á@¶í.Hú×UÌŠë£Gq©ËŸÓûYµ€"ä^.Eg�®LŠVá"+º 5ì`Ö¹3lˆRÄè~ñQ�«\˜Æ@­wp�&5Ö¬föA˜² .¡Ê%¦I@&þ|h|ã@Aóñ‰ý¨õÀV'Ë·Y#OåiµFç 2¬$i¿¶ô`êÆr|¤@ñǸšc«ØÐ&öáÙ3î¨n½ŒaX±RÐNÙÔ�ä+Gê‚L)h�˜ûˆ£6WM»A"{´·ëJoÔ*R ´ÀîíÒž éÔ.åàXuISï–^¡q°H%˜q ñ©·W�PÂ|¬.þH{xϪC»‡aFÐaLº øOeû«®�QEfr€v€IÅ —, ûj%Hm|¢H‹êGíQù‹å•a¸bßlÏ6§ù*gh-n|gõ:Rj0X–ƒ4½û«˜d-› U3xܬ¨lŸvØáW‹_N?Imª¹–˜?:þ¯¨6»†$ “-B�Þ+<O¡2)gÉ ù™¡´%uâ+fÊí‘ °#ˬ\�×·š"ÆAÖ¯ÿ:Ý6%‚6¢­Á_¤FŒ«=J ›!¤qÚÛÝï®-±2’¯|ÈÃÈÒ@øDð­ÎbN0ªÂEü·�ÀΗýEéô&qm*FØrì˜`|­ÊºP@¿èp¥›0 žà[à eù*v�­æÿIµ¸ò®6 ™z”PÀº0RÊTçâGmu4äÃp +ÛˆˆÜS>r¡;S X¹%v(¶·ùwÖXã�¹Šîc#tɉaÏ´{-W‹(n 0 ¦.³²«¨irªAVhRÅLî�1ŽöV�Մ¹=<—*…%ÄÆ£„q§‘ö°fV�™,@¸ÐG9çZâpãpR³ˆ>ÊêÊS*(V%�ª{îú-GOŸÐĈUŽÀF2 •HP,-ÝÊŽ£¨Ýé…G;Š´í6‡C~\kº�QEqus8*tL Žso�âÈÂÁ†£†Ýƶß8”äýlޏ‹«�ÔhkLyNð\B‘¡61>b£Hñí¡gª�´‘ô©†±z~¦5Up…¯°»ŠßiÒë{ÅvÑÆŠt‡èãQ‘Kˆ>U@ZƒG +qRu¢-\ã£3|®Vgi"9ðûë¦)ÅŠ( QNŠ(¢Š)Vy± Ë´ÏnÊÅ:8�ù$¶ÄÿŠŠ×ѹ;šæcÂ#º´ +ª_2c±L âOúÇW|Ħ �ãýk šÇpP³c•øOë²�Õá’7‰½¸ùbcÚ*ñæL •`@ײÓMs+¼u¸#õ­N>§S +Ór$¶WQ:S9�q›M¯o +¬y2‡B:S™Ê‹jt´ézÏODCäÜX�²/Ü+UÊ­¡Ò$qHfB&`^æÑê?/í»¯ll3­2®IÛ6ì" u˜Y¶«Mâ@;d‰ÓZTƒ/§Æ»o ~áUù8÷H0`& wÖµKm;Dž�Øü*NõÚ “˲²EÊ»[.Ch�Ž�¦9 ®„È®»„Çh+ñ©Ð�'] öÖ´QEQEK 0k r5²€$Ûêþµ)™‘²zŽãI€ Þ|+a�™·85ϱq¶0… 1ú™‰6i»Ikð'„�)ãʯ™¡†¤x€µÒðAN3^V}Ã¥Êmä±;÷z\8Ív¾½ˆ€ß¾´ÈèA ±y›ixšËSŒYœK ¶ðLF¼°×3õ^©ôŸPc\lÊAavèy×R£.B]‰@FÓ$É#šÀÿÚÛ§\iŒ.9Ú4’OƲë†ä ÆÿAu–Xù�Ûo&œãQ~#^<3ê‘Jäd×Óan-öAï˜ïí½²G!o‡ýטò2ª“* +–7ÑlLžBõ¯ä–AT;=CúåÎvª� ”4(f‘ê+n˜ï'ƺI Ôo:m?òÙíƒPr. +¼©V_4Èæ²¶ÆÑ]É•\²‰•‰�F¿Ò¹ÏS„åîñr²7Ç�<½Fn¸ÝÐ3}*H»�Ö¹“o­˜f$ÿt.0{ùV¸Æ@$´pO™¦ú|>U×EQER&šÇÓT‰‚$0ÀÄê&¹·‡õb ^ë¹`T˜"Æ|i épdNá;3mç&¢» +ƒb-FÐ )‘"*J,Ìe=ª-–ÑÈSdF–¬?½3�t"E˜åÊ8VûA±¿}U"/H¨"ʈiL¨åH�4¶ˆÒ¨P@ÔÒÚ7L çL)Ò XQô€©íâ�:(¢Š(¤DëDQ¶ŽB¿ÿÙendstream +endobj +355 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 104 /Subtype /Image /Width 64 /Length 1299 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ h@ÿÄK!1AQa"q�‘¡±2ðÁáBRÑ¢#r²Ò“ÿÚ?ôÑ⪶ù3`O0&¥êoˆa^ÝÄ–ü¤““ÀñQT«�>-á}@¬“ô€¢ µ0~ÖÏ�3”€¦"eˆÑ•¿‰å@bϹƒ"á^{À<ÙUVÇ‘I)´’5nš-¸u½XƧ·"“´€ kyù~t¬™A4Bv�$ö©ÝÀsõÓÛ1Åà焎q•$$©`v±U�ÎLz™¿­wx¾Pò-(ÒÛÇÈVò|–À  ,Ä’»@¿bmT9H`ëÀ<:ŠÈÿ/Û�ÚLÏñ�ùW.\ïäbVû{PºŽïª7EÓi×®œb¬¬ãQ6yFÖþŸ*XlŠ¡i"’O!Çõ&§â`É�TäH*€dwÝËB+¯30íF·™ôЇ—�³Hùv±H\ÛSëU2;¶\H„ÏåP³»] �³…½Á·�º˜ïÉŒ+)r±´Ä>ílÏ¥ c!dfB $ñ¼0:rÝ]�hŠÃZÑFµj¤¹Ô¨0o ƒ~Ÿ:˜ó1“1¼HS·õõÒŸ'�¸ÈXbH&Âtë§ åc`°gtÀ‹ö˜28AÖ›uÍ "Ò$E©ß A$ °�k ƒl›tã\>G’ÌØöŠð±ÒóèTDlûÚÀ€Q ‰€'û­)qåÆÝ¥\1“Ö5Ó‡?KEÅ‹VvPÛ�æM½ÕÍ�Î2‰Üd³'qþú¡#ÿj¦Ì‹1i'‰öWN`€©h‘0OJåÆ<91† �ìJƒ¹K–i€I™>ý#J\Ù“6Ò†v0˜½Õ–G¿ÿÙendstream +endobj +356 0 obj +<< /Filter /FlateDecode /Length 5580 >> +stream +H‰ŒWÛŽãÆ}×WðQ Œzû~AžloàužX@Œƒ#rFÌJ¢–¤v2þzW“ìêfS³ ´µ#uu]Ï9õu#ˆÎ9-Š%”Q«¥((1Ü2*tÁ•!ÜÀ¬õ?0\rk]a85DJJ)—Åá¼ùøË™ŸÚÍ?6_7špÿ…R“E£•”#LPFà1"4|Ou¡,'J Íœ, Õ‚j™£n¶È‚E.õNŠÉI­8¥¶ˆîƘcðWi×…aL#´po²ÈƒE¦Ð oQ +i¸› +®Á4cÄ¿/và9×€ p1^› Šï Ÿ¨6Žò‚ï nŠYÅ”óá!i™5ÁC‰:ÂüíF‹J +¡Õ]‹ÞCÁ¥ãlJb¸6TÁ \µÅËFiK„�ÍŒ±A´BqæWœAÅ�¢Äù µ) �œÃ¬šM+Ƚ4³i=™¦„C,éÙ½lXÑ›÷›�{ö;-X±Þø0¸°ÅþPÐbÿ +G±ï Fýÿÿ(D±ïàb„ÿàøSp«ˆ•3VëÀçýy³ý|ºêµìêâÃþ?ê-J(Œöv«Íãö‡Ã¡>Õ]9´]ÿÜvÅF·?6C{)OŇïÿ6ºÂ˜ó�7.þr._À(Ûþ½kuß7——é%‚ùŽ‹'ÄèccSlÞçÞó)Hc€‚î4‚4Ä ÃÆžfß wÞb<Á®Ït�7F$U“sÛkW÷õe¨«pꓞpчåÓ0æC31ßl.óá=KÎé-iíô–ÃéÆpü¾{ó#Œ5'}[ŸŸÚª9ƒ‡á1’ôœý›#SÄ íó|%†Í%›¿<ßN˜­š’ÃÂOj<½KþÖ†ÚAü<@ÃúË?7ßêËûùŠ‘p¢¥^¯E‘žÓ•Ph˜ÜP›¾ù£~@÷L‘ž‹‚r@/†�=ö^®ÀTHSW½5]íSÜcA]‘žÓ[ð”a®þ¶=´gß@!Ñs ;¦áWÖ§ŒìN¡´˜1Ë‹ôôc žm–—êýJ°Ø�Ϫž÷¦ûòÄG³ó±H’!Ô°Õ+÷ë‡Å0àÈSyÚùžyß½øP‡èèž 9âÞ‡ä\ö/ܳ&ï_ÀÊ"=/í8àôCÒžåõzjåyé1-lL ž‹0ô\óX¦ 3:Šg˜ + Ü�É„ôa>Ù8@ñ„ |·ñ·¯Íé~9öW<ÇúZê‹PÆäø <³ +q´]bŠU‘žÁgJ´mv©Ç!ÞÈûó•� D˜ùøñW[�2LÛ½�Ïe÷6ÚLp|�Þh“÷k#`('ôžˆb\˜ ±múÀ!Z +i²hC#½è{ÜÞ.Í×$ºCo«r(ÑÒ ËPrtx»†\GàJK6³·8‘,d²¿Ö‡¦$ci¯õy…ÒNÞæ©P»‚&Œ…Ü·ÙûŒ‹ýy86õ·:{Gbx.€ØCã¶z ,_÷‘ÕB˜Vùx"êÁ$R—‚ÞSAN€àt ßœT�´Ûªé¯§ò kÉL„j_ë$É¡Æ<àôêP‹¡­Ê·‡Ì¯”„²éFaÓ IÄNÖ +€gneËkÜ8euUWÉîCæEdÅrX•ÎbkË~m¹â©FMÁ'hÍ7¹¬Ð]»GÕǯ½ÈŽñ?·‡[Ÿ·ô½x·þ^ÑG¥Ó¬�\r-¡žkëÙí—Ëê:Å郾y¾ ·Î+„%¤Óï¢DÄÀ—ú>í®·îÚös_�6gvÑų ð‚w/ˆx�#~lo§*6:'.È_äåÓ)G‰Ùj¿ìÈÓßÖzŠ{Œuz_±�Ð&gB°²EY´[u=ìŒlA�>ÐRœÂØ«èè�fÃ~ÐÂá xË¡ÝR=-ª½+L˪) OQr˜…YQ˜æ·UM̲ 9zg ì3—$r>þ…GÄI Ÿ¤Ì«�]‘ì�Ûò­š:C±q›X¶1ÀŒC€†>¶z{j_w‡Ök Fe„Wl‰ð´v6­è{�¡]¨ аIQ:âÓçö¨£{øNÝîÁL\`�T5ÒcH“,8± ¢™½S�u8 çq^Ô¾Ô`ŒóYl-ë, ®c—vÈÂJññµlDîIû§ª r¢ Np7ìc:¿¬8Lú=¨Â,›—c–Âtçé kôh‰Ó R»³R…ùÒµ¯^ê@æÆýÀË€I€D!6'Ê�ú>¥0\z£Ž…¢U·Ã�ïH  ¹ /Ÿš/~ +²în=ž^¤›´�™wi £h^`m"Å9¢éþX÷‹$i‡ÑÕe>F©Þ»Ÿ}š-(øœÐIu3Å j~šŠ%)ÁLØnï™a)ï9µëÞöóéÌÌŒö‡<ØY‚º|Œ¹?æÆ›AÁK4jøb@Æž’2 öpºUÓUèç!ïGœ +y«ÿ{-ï(ŽC2¬·+Ìê¡ýVwYÖÓÎ>·Ý¢œ{ˆj—ÙõŠ –Ødæ€Êú‡ ]ÿ—Æ×[_oå©rÑ•†V_Ž~§šadáŒ&Âݤʸ¥äËYÛéØ=Õ—ÃÑSôAêõsyÃeµôÛ*Z‰Bf½²-×ÃÇi?ô .“Kq€²Æ1ƒÝ½V$t†[èå[?´çØh'*Dè®ú0L¨IV)¦((ã{˜P(Äé-¯¸)¢loy»¥X䚦ñ;Q +}ÆJ~GÞÙJsÎF턜 Äq‡±¹GöÝ)<Û7/O³ËT'êöÞ|1‰Õu.Óà!¤·!âåBù˜å:»®ÂÇ=û� ëžÇf£³uúà ˜2U(BšÊ®`2 ;r¾\Ú×S]½Ä¹ñæØd.ê�Œæ(a“=+`34ÂRè%ÿ«3$kï§x'™Ø–·á8¶o»ÜÜxmúã*!&ʱõ2©âyèÆo'õÒíò%>6©\؃øº28öšé{¦[lÕM‘BÛ1XE H(†€}Ègî_y¡ói•[]ûgs©ÚDD ‚Òq_wçf\0ôösÙU¯eWçÙ³€ (&F(É÷kû<Ä':>…£Oc÷Þi/ÆEÚ^?wííÚ§"K>·ëyuÚÄ6]6íPM¤ØÛõÚv«UÑá"²V*q‰™UîzÚ‘(CCÌõP§9KCüôן/÷E2 ûPÊÌ—/ß·ÉÊEý§m5T‡TƒrÃqµ9Ÿû'†ÝïDZÙÅÄYÁW‰‡V{4`Ns4DÅy™Ý%sd¯F +„Üêÿ4CÎbPÃé;6¹•§…üΘqoÌô�-ć™N•~Ô€ó×éí1MóŸ@ Á‹ø")óú»dÊû1\¸¢×µ¥Ç­ðbÿüÙ•ðynjêNÑ [�ºÞ�ý‰ú†ö··Ðq_¯a>íŠ%ŽŸ�Ì�27�Ö3énúË+•Atõz_mLzé“”uœ0«‚ÊÜ×m›Ôlmöû®Î;ôæôæÆLô;2K‹!ÐRä¹ +žñ~º=æ�¡ñX}‚ì°õgÓìãy$GRìUZà±@b1 pÊÝ}†æ°kM™kB]ž,ܽ°š÷èïp—[ $*]uF‚�`°À�ôD +â!Œð¯>4j +Á6�Ã>\XK˜ å ’�Ü+ç•HaM ±­!È¡,q¶ËÛ~jr31ýL¬qöˆë[a ¿©za43XjTÙ=’-H ç+H·¸šàF æíWmÙ‚<™)€w½¾õ�i�(ˆ'­ËŽàÚî +HŸOIéúŸO‚Ê-×MiYH©;­pÖÛ±íÚ½òsˆ�ÕÙÃ˭jÚ‰UW8$bž�ÔrcÊb·µÀú”rÑo¿í_Á†Æ‰{=®»v¡‰§KO[‰e£J%Ž×$R)űóóÍõõÌÁˆ$a|h¶}Þxg ÷iîd„×�ýþØ5–Aݵ÷ë_êqÛn÷ÁoXŽ{FýÚ <öifU�À,înZ�ïqÓIyÉÔÒªH†ƒH°ID '¯@Ìá©u¾t©•NvóVÂð_µ2Ùåó +ìqùùy1ó^èš._õ_•�Ë“ˆà +”À�é„ÐÇEƒéæRjéŒîy¿s&qŠpOrµ½oº&8&¬÷`óúŸù¶¿;C*æNC¿·®˜©„ÂS‚އ­žš“ç´4ÓïÅ\˜CžEOà;î= 1�K©Y—s8A¹nÕ +úCp#^’uË-ôþSA]Ãø§€¦�« +i¥özfQ*ø1¼°÷¼Öå¢ù´€5燔¹��ýéÍo@GÞ¿/m$’¥§íë‚çeƒŠ—®(�êБJ cº••k£PJÄ-sx;‰Ìƒ‘âG/ä'^wÑÞµ“so¦]%�†¹;­)õä9ˆº™{"ÍA±Beت˜õ3¥tèsfºPF¨2á+ˆ»H®Q\"ÒcémÿØt_š!ß‚‚§vŒª +Åx#o¦Q±2*¼AºäÐ%Õ/·ÖÌZä­žÓ²Ó(pP$]~³zë×­.ëãПPUÞ²™A#Š(5©'Gÿ‘Å êàœe9?scò$…Õ«ÿNÍÁàzgâ"‘"p쓚«5¦«�ÍÖèYµ ^³Ôþ[‘ -¡�‚1¬&PŽçn≦aZ¤{-ÿ¼:¯»/C»»k^ºçE”c•ÀÁØç½Ü\‡é…®§º20ò\è¡�¶þ#›Þ¹IØ2®œM¼ Ú3öÃÔ;¯FNârÞ#®òBB(öÓ(eì�’yS‘Ï Èà•P_ +!ÆÚeûRT,]vá— ä¯ÿ¹£háY‘‰"'œIùõx{ÛêƒçW$Ja݃é³³XÂâËfºïwÙî@>¾SQ>°¨F‘»žî›ü!zDú2NÃq›f,kC‘*Ïx3Õ™LaîüÈe{h»c— Þ»çþÐìŽ@b‡íßqL F$xúÙOØ\Ê*›=VWF<Þý¶i”ÞŽ ¬‰ŒØˆ“ùÈ,+µ™I�›¯Ü#&, »RzøÒÂ�ï¾Íb6H”XŸž,¥eîÕPˆ{7ÚqüùùKÅXˆ)âÞG%*gQdNľVsß@Ú‚qÒÆV¬O{Ò¤&ë^á-+”A€ÐUe+~3+æÛbß2ùüS½ß×Û&÷› {nðž]߱зfî÷7ï_½Ž O0ª‘Š-½™ßn§ãÐdG;ï·ÎV®¡×,Iœ£C”·Z®¦³ý]?´Ó}7÷ïøT Ö¡Ò ÐkÂ¥¥Ú®;Úmm“{FDͬ2Á2è"™óƒž#\2î ­Ê¥sÏÎ/g¦ê)¥wÈ¢°£À¦U÷±ßÃ0`¼"ô4(§ 'ˆ;ú;ôsf ìFs¬@µ˜¬œ= í^!…rëo^Úà aîæ�”k¹ê=„Jð?!dP +êQYç!–ì哨ýˆ÷¸®¿Ä±Ò™-ëP)‰KÖ°ÜÍ-P µ"—,lÇÙà—27«zW?LÍNw�®n‡¾ Ì"Ü„Ä䩜?3è�Où—8šë/¬!0à Ж®ù­íÒ¼�ù �Ð~#^u³zæ=F +ë|¢æ¦úá8¹L�ªòL›Æ�µ0Bk÷µ*¿äJ›‰ì�š¼ò#LèþêÝÐ5’«Ëã~jm©Š@  +]!Çz¿T¬Î” +,�L}"ÆÞÇ_º-Äž9½ÌH¥R´­Û‰Yw.¡Qèç%Û2J,Ñ…Špæ×Wûf; =p“ù +ÁD#†Toæž@1üÂñ©§%p=åGá@þzÞ¡Ÿ~ª<¤p�°Vùü…Ÿ0kÐeª‹–Ð%õ� �ƒ«H!+{I Er&¨áëß+—nÄie@â¨Wšmù%UŒ“lãeíÿ³J¬– + É.4A£*|¡–¹1¶…vsV¸�ôœŒcÿ—þ†ýMHbÍ$ xõþØ´rßv`ЇÈ‚ßdŽ÷/ê©Î�†+Ýáÿìû/5ò)*¤ÊciîVR +LîÒÓU}ÈØ~ÆÞ@ôcl;¡ÈÖA}§Î^ÎÈ´r�8_Ÿ¿D-^#0`°·B¹ Ö:o‡~ü{œšnÌÀÎ +éÆssاñS•.�®Þö�M÷¥ì#°(AUeœ ¼­'“ª!¤þ°*~f–JÇ"E[#²‹±l ™�éàô*×çÛËþÑó±¥?�Ö‹CO¢÷¦Ì–„Ú<8ÕŽ‰g…BÙÿLÊàn3Ûå Æ~ÛÖZ&-»•œÄìvvܵýÜ#}O«KwU ÑÆåðÚij¢)‚³¤‡ÉPßN¹ ‚B KÛî|ucs5Õ�Ç,‘VÙƒ�7÷Øe=’ª6W!¥p´ 8) ¤–$[‰ôð¥G6mWô@�by¸z÷âÒñ\„l +×t—¨Ê*÷å".™ûàóê¢ÙxD=¢Eå3F +8.u�èïp—Ytð¦UÎÐÈ&,(ÊJn²èE{×Nu7e©�ÊOL�dœ#�¨"éd�ëf{¯ þlhƒŸ’ªó«•-~Ó‡ƒ]*m©ˆ»Ø™|ú±8ú3x†Ëz9WáA¥«—Mvh?ö�HDrU;B¯®ÜD%«é(­ëÛÿØ#PÝî\¢˜àVš“ƒn?(‰¸jE2ÀÈè4í ¼64;¼ :ÙÔÀŦhºŒ �p×.ø® endstream +endobj +357 0 obj +<< /BaseFont /Times-BoldItalic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +358 0 obj +<< /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +359 0 obj +<< /BaseFont /Courier-BoldOblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +360 0 obj +<< /BaseFont /Times-Italic /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +361 0 obj +<< /BaseFont /Times-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +362 0 obj +<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +363 0 obj +<< /BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +364 0 obj +<< /BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +365 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 536 /Subtype /Image /Width 8 /Length 388 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ ÿÄ/q32ÿÚ?Ô|+Šàð®(™ëŠêŠêŠªŠªŠêŠêŠêŠêŠªŠªŠªŠªŠ&j¢†Z¢†Z¢†Z¢†Z¢†j¢†j¢†j¢†j¢‹š¨¢fª(¹ªŠªŠªŠªŠªŠêŠêŠêŠêŠêŠêŠêŠêŠëŠÅ õE õÅ õE õE õÅ õE õŸ¡á\W�q\5Åp¾5Åpx×ÁåñÁåñÁåñÁåñÁåñÁåñÁåñÁçñÁçñÂùüEpyüñpyüÅpC狇ÿÙendstream +endobj +366 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 832 /Subtype /Image /Width 13 /Length 700 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ @ ÿÄ;q12�3A!ÑB‚#ÿÚ?õPÍþÎÃ7û8 ßìàL3³�0ÍþÎÃ7û8 ßì¢ oöQÃ7û(‚a›ý”A0ÝþÊ �nÿeH7²ˆ$!ÙD ßì¢ †HvQÃd)þ”A ÙÊ �l‡eH6C: �l†tA Ù è‚A²Ñƒd3j È~D ‘ͨ$#›PH6G6 �lŽmA Ù è‚A²9µƒdsj HæÔ‘ͨ"#›PH:G6 ˆlŽmA éÚ‚!²9µƒ¤3j‡HfÔ �ͨ$!›PD:C6 ˆt†mAé Ú‚!Ò95Cä2jHäÔ‘ɨ"!“P@:G& ˆtŽMAéš‚!Ò95C¤rj‡HäÔ‘ɨ #“PD:G& ˆtŽMAéš‚!Ò95CärjÈݨ #v €|�Ú‚ò7jT@>FíJˆHݼ—�H]¼—�H]¼—�H]¼—�H]¼—�H]¼—�H]¼—�H]¼—�H]¼—�H]¼—�H]¼—�H]¼—�H]¼—�ïÝ¥Ä[ÔóVòZE½v–‘o]¥¤[×o%¤[×iií<Õ¥„»ŸÇ’¢]ºbTMµè¤ŸgÑA>Ç¢‚}ŸE�Ì6=˜ýý}}™ý)çÁ¡ŸÓÑ¡Ãý}+ãÁ�$5�o³+ý©û9úm|]ãÃÛT©ÿÙendstream +endobj +367 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 8 /Subtype /Image /Width 48 /Length 213 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ 0ÿÄ5Ò“Q1ARÿÚ?Ðôtþ|å#Õ¢§×Ô’‘éçðéóØ“èÑÓÁ&+Ó£§‚LW£EO˜¯_ÿÙendstream +endobj +368 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 24 /Subtype /Image /Width 32 /Length 232 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  ÿÄ<!1qÑ¢A�ÒCÿÚ?êQ^Æä„ÀSß2A *y¶S1æ*Øœ +’û�48Å'+5+?èQã »u¿G NÌÛz�ÿÙendstream +endobj +369 0 obj +<< /BitsPerComponent 8 /ColorSpace 30 0 R /Filter /DCTDecode /Height 5 /Subtype /Image /Width 13 /Length 187 >> +stream +ÿØÿîAdobed€ ÿÛC ""!!#(((((#,0000,8<<<8<<<<<<<<<<ÿÀ  ÿÄ2�‚ÂÿÚ?¥¶ñ »>qÒ›¡j}L–qÂ?ÿÙendstream +endobj +370 0 obj +<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter /DCTDecode /Height 5 /Subtype /Image /Width 40 /Length 332 >> +stream +ÿØÿîAdobed€ ÿÛ„ ""!!#(((((#,0000,8<<<8<<<<<<<<<<  &&#)))))#.2222.8<<<8<<<<<<<<<<ÿÀ("ÿÄ_1’â‘áCS!ÿÚ ?ïðz±™00»Ôdv.%9€3OÑŸu(¸­}|Òï%#óÖ¹’‹€�ÿÙendstream +endobj +371 0 obj +<< /BitsPerComponent 1 /DecodeParms << /Columns 2368 /K -1 >> /Filter /CCITTFaxDecode /Height 3129 /ImageMask true /Subtype /Image /Width 2368 /Length 57745 >> +stream +ÿùMÓ2¦pgij[FHȹ�MYÚB5 +Är×3FK#ÎÊ�Èâ§°™>k-bÑOŠV ì–“M{^þšú;‰!î�UmXM:ÿO_î?¥Õ|j¿ªª×Kªª©Dc:Dƒ(dŒˆeªõÔ‘ÒPf„tFŒƒº4g™ó5xÐÍCª=f�#ἃLͦ�dmÕ>ŽÂh§š³«:YAdA—Ž �™Œ�ÎFc„â* ÂêÑ£<"á„S£PúÕ4Â5Âl‘ð=SÐBÚ=Òm�Ú…ïI®¤8Ägž‰Â3HöH2ñœq™Ì4²DÁ‚3ƒ½AfÍ ¨aoP�‘±ë¤ Ë8Mª;°‚UB;ÑQ RP‚ZÒARl$é6¯º8ôqék +•…M0�•[AUIµÒm'A6©Z¨"ó)ÉÐ&ªN˘Mª­qúM£Ž’Ð_AÒZZ I×¥GŽô­ZK]ZAR +’Òþ�ÕT¨#�¬ Nª•¥¥¤á+ÒtSåJ…¤®PôqêÖ¶Šz;ómzJÒÐZUZZZéu¥è$º¥èR[RUÒëúTŠ|¡á-®–Šz;ÒëI¤©zK]&�Z«iR^:ZZU*UÇZIW®©-*^—ª¥j¿cCÕ/UKKJ’Uü%IuIk¨¨Ö©*QŠÕ%¥¤7IZHb‰ðbºV©*^¢ƒÒ¥Z×B×¥I]ªb¿ŠIRAŠUUT’¬1]-*ZÖ©$•k­|amõñZ¤•R©zÒRÄRõI»ÿ\±éWI(ªõÒT•z¤´’Œ*õêôº§IRáR_Õz](AuéaÛiU?RƒIF¾½RT—I-%ÒÕ/Òn¿ïýW]V’KuÁ¾º‚ +ßUÒÕ/¤’¥I~Cô‚  RÒIv×Õ_¥^’ªª_]%AR¥^-·Õ:_¤•]UA)ëär¤ «_öúJ«Ij«Õ¤©´±ëúvÒýõZ¥¥Òª‘T"wK##']*ý/ÿÿÕiý*\"‡¤G*ý/mô• AUõë^ZMõׄPú¤¶ëÒU­ÒªÁuIkÒæ•?š-ú6º1¨ê’¡Ò¤Ç]%A¥ÿZZæþë¥Õ)…F×ù´©f˜_TmiR§f~ºZÙüß—�Rú¿êõ¥˜Uª­%×ú‚)þ—æ;J‰ þ½uUÒIRÐJºéj´´­Òþ´�+«ô’T˜u]%0½%U +–‚Ì/3׳4Ùšô¬ÿZT–“Ò ÿI.ºÒzô´´¢—J+ *L;Ii´›JÂWV”>ê´´’ÒªÑÇ¥¤©Si%ºZMžô�%ÒP”V—Õ6–©C‡a*‡×]E\6*Õ´¢˜¦ÂM ªªúPûK iiZPÖÒO°“a+ Cm*ЏN¦ÒWJ“.�(TÚ „ÁT ŸP˜\6 Údz„Âbb¨h#ÛªÅU1VÅE1U±I„ب؅Q[ ¦+DÅl0•#Xˆ*h1iØTŠ)�Ç2¤X˜pƒ6p¸L(UM'+› ‚ * !hD0b *-Óá± £sGöÓCBÑ65‚‡Pܦ}Óï¯ÿ{¥IêêS•ZL4¶�aÐa‘Îà ˆ¸„0ÐŒòMC SF j -�°%†lµ…@ä ¿ h#Haj��¨$´ª �^ZÀÐ$Ü, sP/+…�˜2�q™H)š�qÈ)ÔAp5ÿÿÿÿÿÿÿÿÿÿü¦ +¹l(2ÞðXAÆjÌ2@IkŒEoj-ò + +•¸l0VBàkîäT¡¦Òêé{jÒªÔµÿ¡î¹fšÞ°)ŸZ׬´ åfÃÂ�wk©o?”ï:k97/“‚©›IêÝ~�YS�h¢5ŒÖ3¨„ Ë‘¡ž¨0® ƒ'ä*Ì‚à¥Dô…ëzR�0ˆB ù2C†0ƒXá‚&8`†0‰ßè"XEÃ…«}ÿ¬z¸gÁÂ.P˜EÛU¸iÒ‰ÝT%[xJÁ‘HMéýú;P—'ÇUI· 6ºVxIÂZ¶TéizM´—úõú Xd޵P–Ž=--+WKGzZ^ÚI^ï�éÿú“6u<„:A%éhïGzÚN–®—´½RZUúëK̉?ü™$È”¤Â6gÌÑú!|Hƒ@a$èœ5IUURÒ¤¿KHW±J—é%ÛÒ½~ºäÐÈÄOæÌÔF°¤º6GC"Fl‘˜#B Âr~J|ü0M&Ò¤øA%éuî© +¤’V’ŒR®–¿J—2Ñ)ÔŽ…‘tpÑæÈ† "à3L0�á¬0�“ISL#qç éäÇHŽ(¬nû,ôGdyA6“…Ið‚U¥QŠé%]µëKÛ¤µKç2œˆ6ddf)@ ˆ§=‘Ì„™­„l”š„ÓÂhØá6ša;¹á ˜i:„EŠ+Vˆí²Ì+q@˜vïéBiµ´Ÿ]©j’T¿¤­-$´¿ÿ.0�a…A“Á4l (Ø„ô˜i8Pˆ°Ùh óA6m3Æŵm'X&¥h'¤›¯÷ë_Þ½RÕ*I%¤” ›Òô•'ékK#pÒm CI´›A6ˆòËB´µ‚më[î¾›I×ßý§Õ½Úþ÷wã]ÚäX¨AV^‚¥ð“i/¯Æ¾„6•¢^Ñôµuá^—¿¿¶ªªîû­ÖûN¤p¯õÿÿßè·)ÍEãÕÄ%BDª!„ïé--¯Y +ÌRÛ\;l Â[±T÷ò8T·®4>¾ë_ÿ’FõÿÿÿñõW‚äº!ëIr#T—¥¯^FÌ$§C§Æ= ýuÿý䉖ŸûíÿúC×·ÿÿÿþ½È¢20™Gäf4µª«UUûýÑc‘Ð9nHÿÇÿÿÿ^¿ÿÿ¿ÿÿÿÉÙïUÕWǥ£¼Çý)¿ï,Vß‹�éWÿÿÿÿÿÿÿÿÿÿú Òõ×Ò +Hì¡o¤–– +•$®ë¥”Ký¿ÿÿÿÿÿ¿þûÿÿÿþïÒûÊ?(êÉô´qé:Ûéit�µ¯­m/ÿì?þÿÿÿÿÿÿÿ¯ÿÿýý.ŸJ­-×Òl%¥úÅjŽ+i´ºl%ÿüþÿÿÿ¿ÛÿÿýµÿÿÿõîÒW +•¥ÅiZWQ +’Š… =ÐQM„¿á¿ÿÿþïþ´¯ÿoþ«ûÿþÛõÓvÂö‚Û U1LmÕWUI»iBb¿õÛßïÿÿþûÿÿÛ¯ÿÿûf}¯iŸ–Ø­Š¦!-0˜M¤Ô*iª Óša}õÿþÿÿÛoûJêÿöÌïÛ«ýµÛ/°ÂL0špeÏ6 &Âé„LBaT§TÕO‘ „D^¯­³¦íþÛ÷í™í™ÿêé6ƒûVI{/¶’ªiŬBM0ƒMŠdAé´ý¸k !REJ-K í[ý½&ÌÿìúnÿÌ~ØI† j� ›IŠ[TØ„ƒMŠm$iÛ%iÒù> a +=Ì’Æ"#é³ý¤¶{º°—²&0¬#�U¶( Ób˜„�¦Ží Á¤(PÖçvD=Û1 +W2P‰°m Ò†Å6�b“A°ƒßv˜`ƒ#aGʈ!1²šŽì(b¬º &LSŠÆiB;-B0‹>ƒ@ÁBA˜ƒZz¾"8ˆ¦—ÿÂú]ÒìBØ0 ƒ]O�ÿ->RÌQ…–áQnžL%2[%;wz +˜àÉïÜí-%�B©B ëhW¤ÛGcÐI±V•¿ïÿlÑk¤­™£Ö½¥g¦ÎÒ´¾íX¦ Xí¤ÓA±I¦ÂlÇN&+´â‘¢ Å[ö›3W¶avà ]j¬0[´a´ƒÅZWA4Ón ·d­ö=¹âOƒŠæN�„ [d_“„"6ÕvCõ8í6)´“Èâ1 Èé+lC Â Å2/Ÿ(¬U´s±Êó‡`ÐIÓWl š†#ÑŒ0ƒÔBxB"4"E_~‚•��8ÉUb""—·–˜²ˆ‡úØyh³"¦v–dQ#²DfEeGúÃ&ÈDË ‘ @ƒ�\ÐÀ®–—im&W-ïQ•£4ŽîGˆ"_Esdÿ«®»JÅ3%¹kÕZ@©&ëúS¤SÑÃ!vîx‚¤ÞùUzBYÚ!÷¦½z`Á&"*3ºúÂ_¨ˆªý2ÌÕÖ•ªA +ÕiäyKÑ褲;\˜GX¢*ÑœiÕ8ô�5AšÙ{Ý-/&2¯"Æ�¤Iç¢�’ ͤ�Ò‘„'Ø0�™°ša0MB4–ô‘æ×ú—D4s4ÌÙÔ!ÐËÇãÑ S6|”œ)Àç žÈùC@Ág£TÔ#c]O4á•tV0ªŠz;µÒm,5nØJ½…LÓL"â¯jwT $k²CÕ!°¡z ¶Y„Rl#Ž©ÞºAi:º)áá-¢ŸI]>ß ¿n!�¡(' aUJ…‡Ž: 6Ž=¥(z8ô­-jÂXT©!V’ÐZZZT©k¯N—Û¤Ž=-*AR8ôqéaò°˜é*¤´´´µ}$©'IºõÈ!¤«b5¤–• +ëIu®•vô©¤¡--*KªÉô•kI´©-+ô´…q¤«9~’ªÔt•WI%¯ýWÝ$«It«UŠÐ®’^5ã¥IuCikú??U[¬oKÒ]zT»º®=Ré(ÚKŠJ•*\Rúä�?ÕqµÒÒmS¤½RCª_Hཽ*±T’KÒÒI-K¥öI*UTÝ»~½%AŒ?Z¤—íô«¥é%¥¥¥¤’Õ/[ÿ®¯¤–ÝWKà� ‰ÚúýKT¤÷IV«T—It’ëý}zÿ×ÿÛU¥ü~©t¨e¤©ªÁ=½*ׯý$µZô½J’H"‡UZIS÷ét’Òõë¡òÎô*=ÿô´‚(zT•V’Aýi.ª»_õõýk´ºK0½-j—K/Ë@Ì(R&÷ZÞ«ëü"Ÿ¨GI}ëôõéRTm-~’˜Y¡¾a%æ´mJ©iW-Öb‘•îo÷ñéTNµ0´«IL/A)}KézJaQµZIf’Þ•ê–´ºék¢�Ö––µZV{JôºÂXJv¿ºYüÂÒÌ$µÒÌ%J•-*ý/KUIKí×I6–ߺZZZIVа“ðë†�ÁºKªZQ¡ +Wý‡íéRá%^« *N–—„´¨$ˆ�µÒÂéiR„ºÝiÐXI +Òî*a+J–¸TÅ Ó´…]Þƒ~KãúdÿÅZÅ$�ë +…Th8 ‡¢›Ibœ ©‡[iD*TØTÅ0ÐU\.šMb�¦šý úúéÚP˜… ¨…Q +°ªEÀL(UN•S % U1 +¡dq¤±´!„¦‹DDf€¦ÀB:öÿ&l„< �f|Èc(G èÐSY‘ée�öªª¦©¦ši®ƒUMP`… ÁàÁˆÐ¤WTcŒ~ÈÓ"3Yd&h2@ðˆDç²XF€Eà�Ô{ Ó ¦� BhÙù@˜k+@Ä ÓC·"%T¿"ˆ§È“!ç262�LÅ Ä!£dØGpf˜ a&¬&vF†ùùBa8&ÒP“hŒvá„›³'IÒm–ÈÓ |È•™PЏŒ3¨RœjP) ÈìÒÈñFl�j2ˆ¹£XhÖÑ­™èÖ„ì$êšZ‚m'Ùg Î ã 6“¤Ú0Û^~¢“n´ÄÔÉIÁ‘‘âF0@‹³L&²�Ð��n…´Ó ¡ I´�' +�mã}´æ“¢NªÒ½Öšo´�n�ëÝ'µ~”-hŸ¨[PšM¦Š¶t´›IÂL4Ïæ‰sDá%tôê“p®Òé´ºu×ôqýj¿×[ëõzâ½]BL4æ–›ii6•¤ûÕ{îºb˜ºW¿[븩+Zã»èk®øû×òÈQÒ„Â|WzÒéë_×JÝݦÜPûý÷Kúþÿ–å\´ÿýv [íšEØut¯oßW­HáR~½ùc‚‡n­þ?¯¨ÿÿŠýzÿ·üR>"#·VÚÇÞµä<ýÿß‹ ƒëýúWØîƒ “ßÚÿû÷¶h­ë¿­´´®¶Ò½S‘G¶ÂvÅCa¦Æša4Ãȯbi§MÓdp™@«þõúý¦Ý¶­ž›KÓm+b“­$ÛIS®  š±A6ª“…÷l Ða +V9YÂ"hDB;JÛKäWM��Š Si&šv °ƒÉm‚(p“ÒmÞ{hÐÁ–‘ƒ)4UiÛH Âp´Ó Žd &1R­£êáÆjްhèFƒ”Ø0݈VÈÐgʶ $|+s#�Ž ÁúI)j‰e?%–ac;'H¶MÑÚÞJî’A3½ˆ�52È� ’G†/ ‹åçeA� Àh.8еM™ UõAŒ#{…Èw)ÖË4²HvÕ$ºÂ6M¼ü_è¼ún¼DRu}-­èüÕ/ÇHRö¾#êÙÚ¦ªEQ¼Œdƒ4�³æQ‘92‚!³Ä’Xã�RAÖNF¡š3HÒ>Ï™ SFx�¢Dqš3i ÓM5ÆŽ;P‹³žºÿ-�ŽE^8ó4�Bñ¬è6 Â.ÎA¡ª„ÓîÑ­Úa“uª„]„g„VT#½áPAÂ6Ú¢¢•TÂ5Ù!áUØeºJÓ_A6“~Ž:ïKI°’<\U=PN¨-\#’ÒÑÇî´Ž:JÑÞ—ÿÕBNQÇè'Ä$Ú(t«¥i`Žý----é}%£½*GzZ´‚ëKKQÅ-[IWUþŽ=z +¨ ©%kKKG}ij)RIiUi*ZUZZB’¥I-�iRXÕØéuA.«ú ÚIV—±Òm-!Õ[J—¥­uéRUÆÒÇJ¬Pô©oªÇªÿêƒñþ«¥ÒñÒkIRCëªHRð�¥ûUÓ_ÿT’T’V«Õ~’]Xê•URIp¶ê´˜mÿ_Ç­}½U.’_ZªÂ +•^›ZKvÒIz¿ý*úWUúúÕ.ªKë¥Z·KÓmÿ«¿ý*¤•µý*úU¥áÕU%ªíý+w^•òÌJ’Õ}ÿKZKߤ µ_§ªµ¥Ý×KÛoùf$�%+�i·Ò__Ð"�%ú_êã­^—«|ÂúS :,è·äÝ#;2'�Õ/WáuIS¦ëõ]-WÒ£kèÚÌ$’ÒÌ$³~¨ÚSÆåç¥t–•µm•Õ:Tïý-,ÂSkIM­t’¤¿4ZJc­VÌÕ*T¿ •zA'¥¨K[«Ô%¥á#sjÚëÔÑ“+ÿöŠ •t©-"óï^“iZÒé/¤á%ÕRêÂPén´¢¡ß¯OI!VÞÞ¿ûý¯ÆëZKIR •×iR ´�, ¢´¢­.R¬U-iWUi7 +Û p°ØH0ÂH4Э̉qýWI +‡"ئҧIp“ ˜¨… +ºbª˜AMUSºªb¶�S¸b29šðÑŸÚk×õâ¡UB´•´„ÃA0¡UT&U#ó¡ M°L hÂrÉa¾L±ÿóqND¹“tÐR@ÉÄ>""YÈ×V˜OL&˜¬0ŽÐ(`ɸ_×ÉlFˆ—"@ÌÅ"„Að—2õö�„ka”øL"ì0�a„l èÙ3º a¨D~L#RR�ÉvClˆc'FÙ›#ŒælfóÄ«iaØF€Â>4|gà�~E±„ûâL4�4gh&Ò“iI°¬³¦´¦J¤Oœ2Fl² @DY�“(æ°É ÞƒöÓM‘بIº…I†“¤é:¤ì´é„á~_´­+M´­+KÿZéR‚45 ¨O'‘¬0�o ¤ÃL#; <Žéha- Ðt­ +JÕÔWzþ›KôŸÕ¥O_mj©hXA›-B ÒÙgÓi·¼jè”%ý$¹;¥þ7®íÿî¦Å¬>¤p´1Ý¿Ö4�÷A½U÷é[§Qôºwo­ÅHák½ïôŸûÁGߑ΋rTm©6'¥]Ûv÷¡Kô·ïëuïI/ñáÃáíßþê?¤>0àÿ«K iÚZ÷ÛûÜw­ïQá°Ý‡ýô¿¥°ÛûX…¾þ‡í}Ø~º÷Òô¬6ÃÛUÿÿÿ †¿UßUaÿû¦¿á¶ôwuÿä +ü6úC_ÿÿÿaù=ÿ£¿(dwä +pØ:†öýûKû¼7í�?ÿ|—_ÿƒ~‚ÛÝ$ í,6Û†ý&ÿÿKýíßîÿ¿ÿ‡ô¾ý+Â_¥‡¾ßÿº_·ÿ/ÿôµõÕü%ï±Å~ë»ïÅ5ÿWÿ¶ÙÓÌm{Òÿ¯´·ßÝÿ_餾éMùÎuµÿjÞ¾Ù¢¶Ìÿ×óõ~µ÷×î¼çúû{^»Óuÿ¿úV¿VÕ³Õ¥uuȈKUׯµý×üâý{]ïÛ?ØGD}-Vé²÷_Ú1PØklPbƒØI´‚mîµÕ½;í-n�zȃ†›R+‡lT6­Õ¶”BkO¡Ã”í&<4à(„ÈæU¶5°@ô­/aœ¤A܉pÚKv—vÂtÙ-<ØUQ ‘yȨB(¬a‡= ÉŒ¯hr8V´4b˜'a&Ú +Óa„ØXU=°Ñß!)÷Z-ëí’A½ÝØ3Œ ›¿ô½Òt’}-ÿ ô’m&Òl ÍŒãDvG�&ÐgšN–Ë=&%ýÛÒ¿xL&ýëÕ'Å_KÕ=/Aý+ :MÂi´-z´´¿K}GÒoÿÕ;^?N‡Qãoðƒé-×»ÖÓ¾žêõú·Mî—þÓèoòyÕëD8¦½Ÿ# ‚CQ[ÝßЦºÇÞ·áÞ­ÿü¸0µ.�X:×–X×Ä?jXä_Uÿü´ÿÿVýƒÒ¯ÿño÷Û_÷ý¾Þ:·ëú^ºÿûmÿÿÿYðÓõaÿú^ý´¿÷ÿÿ_ÿaõÿÿÚþkœ7ÿ·ÿÿÿÿïðFÿƒºÿÿï㥇»ÿ¯ûÿÿéþÜwÿÿè,?ßlþÿÿÿïA~Ýxv¿ûûk×vëúÿ¶öÝûÿ¯úûï_ÿþ¹Ïööÿ®÷ëÿ÷ï¯ÿçV¿þÛÿû}öÿœýí½ûûu÷œNõ¶¿¶g×éÝ6f­³ël÷^}Ô>íšwkëýŸýµ×Ý/éV—w¯a/NEpzLjÇlnšé~ÛI³ûiw¯m„—a„äW ‘rÚI­¥¸m ƒdW­¦„è4ØL&$L4˜`«AºOM¶)ŠxI¦�¦b“A±Âé6I¦ÅtÚ[M&F†ÂkhüÄX `„#ª;(’xNØA„Õl'á„�W ˜i¦¬aˆF´HA„â""0‰²F—-„e�`‹wÄE‘tÄDpÁW©t†?ÿÊdV”¶ÔI‘GQNƒ?Ka IU„< 4k n[ô’>4ƒ I¶’Àß&DpD�J“jÚM·ß¡¤‘ î•í†ûäÆ3a}I]ot»÷­;Ò]?ö߯HÞ–·êíü†ÍhŒ‰tO¤j#Y�Bš + ˆœ’¸¤¿ö•]üeGdða”@�„#@Â5†gFê3¼þ�ŒžAë¥ý׿Â74 ´jšjš<4›DXii;,ô˜h‹}/ý†’÷ÒI´›Vgˆó�t­t�/Tž +ôµÛدý.“¤ß[M:[Úé>ë{õ×ïïÒÓV’Úw¯C§®¿¦ßÒý½‡÷ŠC¡Û–=õÇÝ×^ôU¿òß-ÉN¿ÿãþ¿ÿ¥û"ECðøÿÿé}kõþ•øi ¡ÿ™kÿÿøGÿüCñÒoù’Ð&ÿÿÿÿ„¿ÿÃýnßÑ,¿ÿÿ¿½ÿåYú××IöÿÿÿÿKÿßiô¿ê—ïÿïתÿ_÷׺­'Û½ºÿûû×ö×ÿÒººÿöÞ¿þß·ÿ½k”-ô�]*?V¶ÜÓ·¯ÿ³ÿm®CîÛ_TÓµJÐMÒû+�»a¤Ùé´—M?l$š±ÆÃd\¶’§zn4ƒ &Ò¯‘†U³34"AŸ#1�AÍñ ìPb›I4ÓM4ÚlŽ,'i6ÐIØOVì$„¤«aM&Pª¡xUMB°Ã0˜«G·+(ùž<0Â!ò±†…‚G¬BPB4; ꩨP¨ êšå¦¤ŽÎ„D[$­ªª;Â;Õèï j¨îñ -£ÇG––Žô´µ¤x£¸ü6!+iU$ÒZT–—ZJ•$Ó» oUIUu¤=tº^\û¥l|b©,kI$¨t‡¡¤•EU!ê±_oÒ¥áu¤õo]t´•/Jé}%úKÿÒKé$½-n’õ¯ëõ}iRªÒGV”È+ôw]z¤CÒÌ~•i$³^au¡¤ª—ÿIWªT½éuÚ[K^µT´´­b¸¯Q +).*¸¦!BJ¶•Bê—ª®­¥U]uMUv!0«„ЋP˜CS"B248Ö«ª +M�ÓAb­X(ÿÿ)°D@Ȉv Ëlˆ‚çz‘ÁB ”¦ ‚Ëhb/ „ ÉðŒ8eA�ïaëË4–2QÜBV H‚Ñ‚%�4�NáªP�d–å¢â¹t§kODÇGÕW@·ÒzÐKá]B ÿGöÓýT¿A/ $ª²l#2ÿÒoª­KTú¥T) s  ‡uIï[]tâ8KÇÒIjÿ+‰¬q|i!«SºòEQ”çIdk +iGŒ ic$GÌ fÂÎEFÂê²aM?Ôì¯RCH«"œ!¤i2‚Êq3ÆPÈñ›˜¯û½{©*é}{×h~¯ý¾ˆzqø•RZß§é$––’J«Ó¤IR¨A^µJºªKZ_úëúþºÕßuû¯ÚÝúÇÇõÞ[”*úÿ`û—_ö ºa¥­%·UZ^‚þ¾©ÕÒIr9kÄ&Ò¥^ºýWtºZ¯¤¾ï×ÛµûØÿý~¢¿ûuøé¯û{éavõløµŠªMªé~G?UT¾Ò©¾¤“õ­/ô«ª´¾µÒúÿ�ÿþÃÿõþ½uõßmÿöþ †îƒzJ—ßKÕ(õ_ªº_\T°›I®¾Î«K¡õ«œê½-/Iÿ_õ°×ÿÿüãöëü#»Kü7ÿÏ6ê ŠUÖÚ]R­9ÕzA.©Oª^¾ø#�Ö�é×õ¥Kö®—FÖm˜_ýµýµØ`Ž?ÿýF~_¯í¥ÿáþï x~�/¡ûékþºZ8ó /•këê’6³Dú 0’£kK/é:ZY…—ú6¬^ºô¨$–•/ü¢úýë ÿÿÿ ÒÿÿÛKü?[é{°Ý"}i,ÂÞ�­,ªT;ÿK\ÂIL$Æ×4]fzúZ˜½%_[Ivþ´µ¤¼%zºI*]oZ_ôÚ_°Ð[¥ÿ÷ï~—„½‡­ÅE¾½éyVŸ'N—ZT¹¢/j•tª_T³4éiiPKKÖú´’JÒÒÒ´¯ÂZI&–†ÚºXI +T’B­µ´¸pui!_ð–Ä/àðëÿïûÞ—ÿõ´ÿåZý¶ýB» h+Jý%Õ¥¥„›VÒ´º‡PØzM„³}:UÃl$ÚQÅwN•¥ +úƒm'Jª•°“ þ—5œZq:_ÿÿoþ¾ú·ÿ÷ôßßÝwYƺ¡¶ê”qPØa[WA1IÒðí&*•&)j˜«I… +©ªa…l ˜UÕC 28ÜŽ‚ +ªšbÿ\%øKýöý[¿[ÿé³=ëÿ«JÏì3ׂ0áö•ZKñ +ÚUU +16“h(]p�lS\ +S ŠªªƒAŠi ÂÂk`İDÝ@oÿëý÷®Úÿ{}ŸÛïï³ +´­*}‘r�¥¤¦)bö“én6©„ÅUUU0˜„Å4¡„» 0Œ�ÆA±þ¬‚Sò“Õ„Pï»öû¡Ûa&Ë‹"¸l‹m‡ÚAŠz զȧa&aCi ƒb©Š•8ˆƒWÃb)ÿ÷k°ûI½¶4Ó66 pÅ28Âá;MqL!|l �nVCÂ#‘‘ÐˆŠ‡Þš¦�‡m8i¶n±vJÿ†IíB hDA„"5/iÚˆU&÷§iîó;•sMdzÒ�Œ2rápW— @‹¹ åÛžØEØkFh-ÃÒ ²éI°¨ÎÂ8eÌ+UI„�úi´½$´ŸpŒ=\% °ŽúK¯±Ý*w¢� ¿j¥~Èj"�¦Ct¤‹Ä†GD{!5³ä|Â5†UêѬ3I4hhØ~Œ5M§¤Ü˜á ˜a'A0Ù9 UõG‚Â^ŠxI¹OAkêÚ)èãèß)ÒV•/¥Æ•$)Š +’ëKJ•u×­%J„V¨i%�§g̉dã!Šaò­gÛ Ó00�„]ž†pÑ ç·„liZXzaRo¤› +�›6Zm & ežÔ$› +én)^é6Òª^––�éRV–•cIii4©P´“i.®’I$«ÒÒIiP®–—_¯J’ªíÑeÙèx &UÁ±£`Τšp›M0Œîj‹w$tA0Òt»>Â¥m4“j‚oít–¯ï¥{I¨ÿ5IR]RKZKKªV1CÒ‘ññª­._ÒêÇ$õI%úé$7_÷ÐM¢7£ÛCA6NáÔ!„›Lñ¶´í¥]-'ÛÒ¾—÷ÖèW¦¿ÕZõ#…µo–9žª=R¨ëcKßéQF} RZ®¨/Õ%ê*´•RõékÕ*¤®Ì…ha¶‰=mwÖJÖý»¿­®­{©p�¬[¿¡½j;ÚQ¸üw_‹ú Ré.*®’ëcÿ×IWKVÕI~’WªªZª¿ïúa*i~í +¦ï©-?}7 ¡­ãô½ùxõï¢ðÄþ‹N·­RUô¿JßþÂA$´—¯CKMúõJHÃõ]*­o¦Gín1ÿ¿Oü=q×ôLcJX—ôM?_ÒÇ_aÿZ­V¿ »_]ÿU¤¢õ­ºýV ¡µêµÒ­*o¡ûº,r:/÷E¹#ý3ðÿ_úúÿ­oÿØãú¥¤’]7ÒU×þ¹ë¶«I|²�U­?õ„Pöü´ÿñ_ÿÿØ~ëÿõÿø/ýyՑ߆ÿT©ÿW¯ïô¨"‡]v©?ô½V—ªÒ‚8é*që¥ÿÿÿõÿÿoðŒ?ÿmoÿp�Ý}ö®¾«ªô¶×TµJµW¥ë=ÖÚ]$«Õ­Rè%0µ\¿˜I-Oÿÿûÿÿðoð�ÿ_ýéÝz ðÿø"Ÿ®«¥Ñ´ÿ[×¥¤¦>¿K0³D_|ÂKÌy{0³=z^´µ­IRè-#ÿÿúÿÿðߪWÿm¥ÿú÷ðï_ݵô–�¤¨Úó /½R¤GDtþ—}7ÒT’J’é*ê�iiiURMÒ^’¥¬RÚKXK (Jèãÿÿÿ¿ýþÿ­_üwþÞ–þþ¾Ù×ú×AixJÏôµêºMõÕ7®’¥„´ºÂQVMðëŠ@àì$Ÿ¥¥TÅCŠŠŠ¿÷ÿÿýÿþûÒ_ûÿÿ·ÿf‹Û^°’­-:QJN—¤­¤­®Ú +) +Ò´â¡6–•-T*b“M4j +¡T& ÿý·ÿÿ·ù¦ý®­ÿ´ßûdëµoݳ?ÖÛO§«Xá¬; BŠ´TÝn•ê�(P•M…LSª¸OM&�) +…M5U +ƒýÿÛûý¿ÿúÞ»oööÏß¶a6\+gû/tÚIÈ®"``‚´›I4áUSªƒip¢©†-Ц!4ÔPFæD“L ˜F_K’ïÿoïÛ3ý[3_v§-´¬‡ ³Òé°ÍÏ %éÆÅ\3fÅ1 :b“…°˜¦)°�MŠÔ(CMS ˆC@Ögf¦"#3rÝ/lÏý[?ßk­„»¶TÓ‘-¥ ÛJ!;ƒM6*ƒ“M6˜A6¨0š†!…=¶ƒL `ƒAˆ"�a6"µÖDæ i§lSãÙ=ƒ Ri¦Å&› +Á-0à Uïž÷ ! !üR%œ½ê•¦!'j˜h7°ZÛ ÚÃEkâ#è:Çþ@H’”ÍQ–¹(Œ–Y€¤ÊYm°¤ª;H!¡+¼´´Ê\v–×ùgS%óH—�#QìêÐh„D ¬$‚(Ó£3#ÙÂ>f˜@ vÞ¿ÐÑ®�a™áÑøíÉ:ÇWóºšB�ãŽ>iò>v¸ ‘„ e@¬38a��?£cL&�—T ‡‡´Óîá7¯çô›IÒl*O„¯‘5þehŒÔêe9äî�‘ gVfÜpÎf™è»'Ì3ôÿé!´p˜hZ<4Ô#EÚ"ÃAi<™é0Â"Ý&ïI¿™ã …¶ÿõéÒuJõ¾ŸäŒ©daë!ŒŒŒÑ²ˆO5†ºΠاž˜F†g&�™pEÅKTÒIé6“„›Dø7Lñ¶·é:Vê“Âm}$›ß]êúøªÓ�Õ¯ú“/"‘¤jgC5 ƒF +g›,EÙÁž3®3[' œl ž ªa�mBhhØô˜a-'apg CA8hXM$ØOJÕÒJÒ}½¦ëÒÿ×Ým®Å½_ðÓê\%¯õÚ�C¡ódˆ”"x#@<ŒFp@ œ0�gƒù­„n™ÈøÓAé}-&™ÓièŽ+KAœ4›&ÙgMÖ“» m]ŠûÒ^KªþÒ]!KýÝÔ¸Jtº÷¦÷¾ªÿéãåô{Ýyc‘·X‹'•¦�o £<#CI´˜Òm'T�l´›i¤KÚV‰ÅÒm2íÛ×~ÚZö°´ºa$ï´?ÿÄ(×m§ÿÕÿ×ûu_ÿÑbt¿o`ÒýG/š²h ´ÃKÔ&Ãm'XI6–ª0ƒz[îÚ__mš}-­uôµëzÜW·ªõ#…ÿäÞ‰ŽJ•ÿýG×ÿýƒ¿oÿöÿõoþ»jÒÝ:¾¿®“­ÿ{ÿÓN¤p´:MÐû×½ +­Ö?^;Öö£ü¨<€ÿôÝ ÿ×úþþÛ¥ÿÿõçÃOp¬?ÿMúMí×»Nõö†–öÕè-µïß]úÇõ–ä†}}µõÿÿHGÿß_ÿÿýý¿ÿÿÛ_ñh†ÿï»þ×^ïãü‚Wûß­Òÿõÿ¿^½uÛÒ_ÿÞÿÿÿïÁÿþ¿ÿïÿǬ?ÿïÕ¿ÿÿ–¯ìþ¿þÿëëÿý¯¢‡ÿ¢�àŒ?îÿÛÿÿûÿ/ÿÃlW_õÜWá,=þýþ¿ÿõéoõn¿ÿÿaÿÿù�½xKý´º/Ýÿû¿ÿÿý/õðôëÿû_®ïßïýýµÿaß‚0ÿÿÿýïÿ¤úøA?¶¨/¿ÿoÿ÷ûÒý¿÷¿þöÿüâïoÿÿàŒ?ÿ'{×ø?èÚÿÿþ—ÿÿ¥¶õ¯ûkÒû¶ßþÝ·_ÿ~ÿÿ^s}ë¿ýÿÖöÿl�ÿÐ_þ‚v!†ÿ õ÷úÿ„¿{þô»Kߊa¯ÞC܇ÿ··¯ÿ·÷ëî¿Ñέ/_Û3UÿÝ6}l3þÿ÷øIÿô ÿÒáõûÿúýûÓú¿ª÷µÿ·Úÿ¶Ùš¶ë_û?û}þÚ]¶•»k¶Cý6_øl=&4Ø­Šÿÿ¥ÿë£jïÞ«]ý¿ºû×öÛío_ÿÛ]õÛ4M«÷°Â¶rt“¿TÛ &¬pØl‹�´“ ktAp{¦šlS]‚�‘CI†^½ëõÿÕRßÍþ¿úMû¯þ¿m™ûtßwŸ¯°žßÕ„qÃØ`¡†�a¥¦˜M†Å(0ÒM4ӴÓ¶DO 6A]Å8ÅCq©VÑíš`ÁEqGd“ ˆ�_µõÿÿ¶ÛöêëÕ«[?ûuÿa]³Óa&ËΓ`Ž>D6¯NƒM�®)ÐlBl$dt0šiá„LR+$ò44{h¬dè0§¶Oƒ9,1" –u€ÞëÞ¿_þÓ�Ç3ýþ–—"¸~‚lM[ 'jœŽh0Å1Q †“°šûM§ ²8»L&¬0�“7Uô¼ÆÚ_"šéÁ—6ئ4ï´¸]ZAˆI ÛI0¶›Nš† „*âÂÆVDY[)¡O´“b›H&›Ã[M6žØA‘¿dZPF6šèŽA…+®† ® +œDE,¨ ¶˜«G·MUå['DêUÄe""2É4[™}D":2[߯¡ˆ«ë¤µ¯ôºZX$=,í¥Òu „Ø@ôÁ‚GèÊÇå�s²¥ +°‚J‚JS , ˆO“ˆC žå¤“z†LF¤¥¤‚ +�mÚL9hZ‰¤vjÂ�˜A8ƒòd�zA#â¤I´˜rÊ6ÉC +U4~a“Æú’ =&ÖÒ Ëw•{+ªŒÐ0p©ºmɄԻ/*�ý¤é<.îïÕKŎ蘒·IuI¾þû‹µµ÷§[¤—Wôo‡ÉRó±¯öºÜʤJ‰J%$È—Ÿ_ïH+ó±×�/OÕ^½/'�!@¤4lŽ ‘˜#ƒÈñ¦la �h„™Îk ¢ u¯{I{ëë¯�©\äj"6dB*ÌñÅ:²ñ¼æ_m}ª>4k  „ÓTÓ@›M4´›uI†©ù¶¿Ý%¿R¹ª)ÖCgW®r:‘ìá�ÆN.`Ž‚O˜!:0�a¨L¢èüMœ›þ·A&Òp“h‹[„E°g &Ðg 'Kf=&Ó>ô�:îØh$»çDE��.dfh2�ˆy¼† $¦”"<%?"!Ð^ÐÑóÑú��Sð�m&І†¨‹ ØIÐà «¯^’´�[‚a7 +�+„éi~“¿è«kû[Ì•Ft B�3@„èÁŸá¢$Ía’3�a„gi„Â.Ã)àš°Ñú–�¶–¾¡¤Ü˜‚;h-&åû CI°ƒ8l´7I´OÚ$ð”(wè”zuð�ézOMõ´ú«ûþýÓø·íáºøF†¬4k �Íi7¤ÃUIÒš ›DvÒl% ¤ÚNì³·Kx&Õ×ÛÝ+§ýmÃí=4ém kþqHj+»þñî¸û«¿Ó×iZ]Òm&ÒMÒM…×–„ØA‘Í]-CÕÂt­]]t±÷ÿÒñ§TÕZ~›�¶‡¯é´½·HWÿè¾9ýÕÿß¶§£ài}-'Ký|4–ûtÖ+í/¶¾šúkõ××]ö‡ÿ¥»·OŽö¿ân]I_ÿñõÿ_ýü28„ƒ¯ý'WTý6…/Khn·6¸ÐëB«üqáÛËrS&9$wùf7×þý×·¿ÿÿÿáÿÿ $­Ä­F…Ðúõmì~Cˆè˜ä¨Xäsòêÿÿ¬?Ƈÿ÷ÿ×Òuÿ¿ÿÿÿÁÿÿßã¤áøô²Ü‘òÇ#<ø~‹ô8úÿëþÃÝÿÿü‡íÿï¿ÿÿÿè/ÿÿúó«úÖ>:õì5ÿ×ÿÿüdžÿÿÿÿôý6—ýÿÿÿ÷¥ûÿzÿU×ýØÿÿÿ“ïøA8oÿÿÿÿKô¢¿Û»n¿þýõÿ¯Ûý/Ö ÿàŒÿðl×?ÿÿÿ¥þ–¯¿ÿëÿ .Ãÿ÷}ÿÿ_Ýéô¿á?þ‚ûðé}ýÿÿá/ð–Wÿû׿ÿßëníëÿÛûþû¯ÛJôžº?ëïý/ý´½ÿnÿ×ÿÿ·ÿÿÿ×Þ¿öÍv¿þÙûÛ]}Òï'Ÿ}+K[„»{ï_ýÒû÷»÷ÿ¯õS›Ý7ûz_ÿûù�G·i0Ïm¥ßé°ÒÕ°œŠáȘÛT×VÐZiÒ ×÷¿ô½ºÉ ×þÛonÿõÿ]-+3Û3þý³?¥õì&¯¦ž•í†BÐSh$ÓM4Ób“M�ƒám&ÃA&˜Mئ Ã šõí¶öýw]i}²u홫3ßlÏo<ï»ók[ ‚u¤ØI†Tòòì0IÒµM4ìAÕ&º¸AÛA Æ«wsÄ0Höç†&A¦" BžÜ¢Pœ—A"]ÐõnìÏï»»®êÂeÖØ%í«a&#ŽìlÇ{"ãXa†Æ�ÈàSiCIˆLR 6! ÓbM4ïwO|hàÏ4ò¾M‰aA + ¦Ùý³Óimœ¹päNi'« Á&Å&›Ä&*ƒ˜:m¤Ók„˜M¦¢¥@„A…=ÑYh¢'Á‚Ë™O�:G„E4ˆ¶K† ±AŠ RaˆH8&˜A°‚M†TÒa„�†4 † +V3²ŒÉ.† mŠ +Õ`˜${a„tšh1 +PÁ®¯×ƒ %- +CA´uH2™ÄV¥¬~8Qÿå¢"Je¿ÒÜ–#Z„që2X ƒ +d.“ðŒ<#ÝH‡Z¿IÖŸ i¡Çÿ"kªN9*ý�Ÿ®¶d¶²“&LÔGAI®¿åZ#Ú•Q‘¡‘‚�'Ì †!>aŸˆï# �Ÿâ4Ë‘È Â5†�l#cëyÈ“2­�‘›3PÍO'G"& Ñ8—�ŽKÉÐðO�Œ#CEÙ¦��SI½SU I†‚t˜|†3Y™ BœY ¡ Ð�” F°Î°A£ÀjƒØœž˜OÓI¹ Ý;¡¤ÃIÒt›Dv °†“è3†øDcÑ4›WK¢�a„kpÙ??B6¾Œ;M'DWa&ÑÚM§ám²Îæ”6].Ë¥Â$ô´º„“h'ù(I|&÷¦šm&ñ[¢GA´›Ý- Û& ´D8_@ƒ~�ÒÕøNõ¥ÿþ×~¾­j›B¾íûBÓýÇ•„�õ­§ïQvÒݾè0¶¾ŸÿýÅ /mHáwCá~þý«pÑ�VëûÛýß§®�Há\}ÿR8_ëÚÆþCŸËŒñÿÿzáËl‰u¨ý¯ÿÛ㾆ÿÿÉ ÿú,豟öÿÿaý[¯ºÿø{~ܱŸÿHÿÒÒÿ×8/ÿë·ÿ_aíÿì?ÿÿÿÿÿVëÿÿÿü7ÿý†¿þÃð¿ÿÿÿÿ‚3õÿÂ=ÿÿÿ ÿÿaÿþðŽÿÿÿÿÿ  ¯ý|zÿÛÃÿÿÿøo ÿÿûÿþÒâû¥ÿÿ]=ÿü7ÿøKûÿÿþÿÒѵýé~¿êêq?ÿðí×þý/×ÿûÿ¿„¯ï×ëþ¯]¿÷ï¯þú¯«ÿýÿÿÞ¶ß¾¿«kÚºMÓfyh2ZŽÅƒn›ó‹ÿ9ýWÿû}ûk¶f�Wlƒó>½³úØO´®ïIºÒa‚E¸)–æ2¬!#L#;»ëýö—ý®º¶gæwöa{g­µ²õÚl0·"Ž † +šlRl3è&OA6‚†“ŽÂŒ–ç#D´ÂdNK4©8"|þÝ6f›úz¼ÂÿKAH® ˜a$í;N;V)!lB`ôÁ>¤Ói:h á‚(tõqAŠdz„#àÓOOªèúB�4I/ºL0²wi6’lj©ÃJÒ…ÚLRzi¦Õ¦ÂV +M5—ÒCªYÚÅKKÇÛé!ÈñØ’;("¬�a #Lù”VHE@Éó<ã3�™£4Š(36?Õþ’YÍI!£¤U™ žfm$ Ò=Šh)ñLØ"* âA_/‰\p�l"â¡4Â.ë.ÏJAa6Hz¦]è«ü[-8^fÁ/ÁBšX]B5š”ÓSÒj�l#;Fv„aáiB0ôI$Ú Âª*)4‚m—U&ÒGˆq¡ê�P‚múVþÅ ÓK¤ ¬š½RO£¼#Æ­U.ƒ ž‚ µA: T¥ªM¥H§‡KI¤®©+ﮕ Žé,ßëiR«TÓ „®Š”$S骄˜aè-/tqè§¥jÒ´Ç­¢ž––â–’ÒV–•éKÕ[K RÖ––•$–’øÓLDP:Òj´½*ê´’]/Ò ´—Ž#¥¯ª]-*Z®ª=iijÚÒXô¸¨õB½Xõyᢹ§ã­�i-*]i--u´+ÝÕ]RZT4Z¤­*QÒ¯KÖ´\5õÒ[ˆˆ„õZÖ—]lz µØØÒ]ªã¥I/T’¯¤´šÒýkÕ*It•Ñý¥×ê’]}� VµJÿâ•{Zô¿Z¯¥ÿ¥ú¥×Òlð±o¥é.ºT´¯­-&Û¤´I%ª_¤¿ºK®’¯U®¾’·ß_^•Wýk]B ¶×úUé/Ò굺ÿú¥UªªKÛ«­$õJ•~—J¿múZþºõ¥ªU¥­¯Ö¡~‚(tØú_I§­/¤’–!¶•iRT•tÿ…õŠªW:­$«­tqú®ýú«#—×çUúI¿ÿá?è#�Ξ–Št•r -/_ú7ªTmRѵ֒˜ßê°�*¬N–×I/Z÷zÒÔÂÂTmR˜ Kíýifa-I�Õ¤éja*YÕPZéRT‘yúÖa(©„¦¥˜Tm?×ÑŽ•,Ñœ¼êat•.–«R¢•V–ºJ´¾¶ÒßÒK]* R¥ª¤ô©i_J’¥½uÒUÂV–ºJ–—a+ïÒm/KKAx%a-[VÒÂPí$�¦úVÒzâ¡¡K„U¥„¢´¹Ï *P⢬%©:ºIzJ•:ZM¬=*B£AÒ6÷AER}A¶[jØAUT*…¡6”R †–“T8uLp¢›VÐZQZ X¦ëASi,(T°¡Sa&Òjšª†Ú +ƒ$é´ …OUTÄ&LB¥„ ¸ê(P© Ã 6UÔU0˜¦!S¡4ÓPšjƒ˜„ÕBEc ‚ ApܳƒÎÑåJI¤\M#ÀtÓP¨1ÅŠ-Â*±n2 1Q6YŽÕÇXìs# ¡B©RŽÓÅqi!�lÈÃIê§cµZU¥×°’AºH7×ÿwàÒÖÿ»¿»T;­µWwü‹,Géµ&*ÿùÿ^õº´¿þ¿§�‰Æ¦D‘¨ÈDr%Ñ97 I‡ÿò.”Õg³S#Ô~P4Dé²!ˆ@‘²80@ÂGdŒÓ #@f„ £F°l5¸a‘²Ü)Ñ)<äj, >`Ž£"˜h„˜# œœa„lw Ñ±š¤ÓMØH2>ªi1hZA°ÈF·*æÌ§�k evG�&Yra•�áÖ™™ž�˜†°0�!èØm)7hÎÒuÐÒ}&™Áœi6¡lg -&” Ï5aKöô¬®3¨L¢L"ì0�a„l é“jš·„hi0ßÒy|Òm&åûÒm–€ƒvÚN›¤ú[P›KZiÕëZÒöÚi["¸hZ †�t›IÒtƒa2æ¯n“nú]6•¥íé[­Ó®úú§ú§´ýjîÓï¾5Ð Ú$ê›KJÔTUºk´ŸôŸmzéõ][úéëxúãzýßú¶•»OA¥tŸîêÜn¾ÿ_xÿ¾>½Ç}}9~è·$3Ö?ÿûÿíÅmEí~ýëíäûèžeþ¿ü×ÿ×ÿ.-߯–9ÇMðþ›ÿ÷–'þ‡Ûõÿú×ÿVÒÿÿß÷«i$,6ì?_õÿ_ÿýÿÿü‡õûiÿý†Ãý‡ÿÿþ@„ÿÿÍ{»×÷þô¶—í ¿ñÿþ þÿÿÿG¿ÿõ ¿ÿÿÿ lWìBÿ_ÿàØ7øÿÿô¿ïëÒÿÿûÿK˜p_£ÿÿû·{ðß·ÿÚÿûkz_ßßÿרH u·^·­Ýúßúýþ�/­ÿý}÷{öÿ×_ý-ׯjöuNa>»û¯÷ëzëÞõëýý“¯óEÿ« óöÈ=MnÒ,àYÂ&Æ¥ëz¾ÿn³__u~ßÓfŠû­³5v—Úûw¶Õ†«ÚÄ6Ó^ô•º2)Ê|ì˜È¢1“ÄÆm™ 1w­]{VÛ4]]:úû­ûiÚVaÃÒ¶\¼éiȃ†š±i±L‹m6*ínGMn ( ‹°ÈG+#ÆÉóWõ½6à ­¤Ú]Ò{h&BÓcM Ä(„ðÒ ±LPa¤�°�4Ù$ØP“L0‚…†a<þÑ£i„ {i6‚µ$ ‡"@ì�óéBh0ƒh�‚-Ü>‚4 T"Cý �l ˜×UP“jŠÞ‚mB3Á—B±¤.¡è'ìŠéŠè"ðô¨EÃl2oT–‚„w£»¼ šA6YÔ$ú‡$’´qéqê©6Þ“¥„­P^®‚ÑÇ¥„«†`‚Aj�wBÇþŽô´´”$­]$�XGßIt––‚ô´SÑÞ––––¸GŠ]+IR KIj#+¤Ú;ÒÒÛÒúÒÒÐZTºêÖ’T—ÒøI--z­zi%­tºé*U±IV’Òö#Ki*J½ét©RÖ´—õØá––�úa´´)(ÐÃÅ –•-ô±Òª¨OKªK¥z_ +©*­kV…*ŒUTBIR_Z¤ºB•%áUZ¤…*¬©iµ^¸…¥úKÈJ*A*Ë~•t–’¥ué&ªÚ\-.©]Ф“}RªUT–ºMËÕ/û¨A*K¥á•$¡ûzõ¥¯_ŸUê©U}B ½Wô®ÂIzúµäMSiV©/Ij´i}zõºQÚ¥]V÷­U,�~¤ÓÕoT«ëÖ¨A}Rý$µ¥,»¬"‡¤«ÜJCÖ©*ZJ· Šík×–¥Õt’ÿÒÿÿ×Ò ¯þ¿ôm:Ýj§@ŠÒªúúôª�ô�ô’ú6ªŸÖ’£}WT‘µšt¦¾‚ÌiPKK/ÿÔO"ʔڪ6—­M¥JŒ,sDq:ZTa$ª½æ~Œ=RÒS lü¾ÒZU ¼$©zJZ¤é%¥fi}%0•,ÂIk k­Ú§›ü$«égíí-ZJ––éijÚ\V¿iE$©6”?פék¥¥®—Ki!Vé]&¶ºUÚÛi1K„¢¡¤ØAW¬J¢¤ÅB⢪­¥Pì- ¡Ã‡צ* Ø­+¶!ZÒéÛ\B…\WTÄ.6‚ªªj©¸IiˆM¥UTª… +¡Âbœ'UP“p­°˜UUBB0ƒi„Å4Âe›8íb"‘ÚH'h*¦¢ªª‚.Ø�5#Øa„M"‰¡RÐnYÂG`ડeN ˆƒFDàØŽ"—&Ø×ýÄDR ýWßõt’^þûî’]¯|ƒòU‘Oô©úëíÕ-Àò­þ©åY¶�‚u_"¹+ÁüÜk#ª8gRPˆL˜ hˆD鱄h †’6>��•f£$9ÈÍ3fu�) ( ‹²|Ù| alà§Œ#XjÙôÂ4;\&‚l1B3%¦t"” „$ ™6gAHLá$L#CÖEÀa“æ ÀÏGÆ¡4laFÊZ„Ò¸fÍØi¤˜i£ÃIÙg á¤Ü˜‘h™´›&á\ 4ì0�l#CAøA„lxMšA´ƒi<'VÓZa$á`4›I´�& ᠸL4¯¤›Qm/§KwÛ[M„i6�t²Á“8gM„EºV• ®µt�C¾¯KI´�.�}û}[Ý'÷ÿõXA:M«­/¼&Ò¸&Ò´š[QQ_iêÅÝoT¿i×ÛLŽªß_®¿øþ¾8¤ï_ïꢦ%¾¼uû�Há~¿¯t6Õ[ßÿýöU¤1wuþêG êG XC¸c´ÝCÝ929ñß_¹c5ÿ_ÿý R¸c¯ò%ùZR6êÃÿ}µ¯×ýkßԺÇÿ¢ÆúCì8kõõ_ÿëÿÿÿë°Økÿÿ톷†ÿ‚0ÿÿõÿÿÑãÿa¶¿ÿþ ™¿Ô?ÿ„ ÿý¾ÿÿÂ_ýü6 ’óÿÿ~ ‡A>ôþïKÿûëþÿ´¿ÿàá´ÿßý¸t¾‡êß×ÿëaÿ¿úÿíïmÒßÿûÝÒÿ×»×ûõ}ºûÿÿþöî¿û~ÞÙÕ?®åB~›ßÿoê÷_ýr~ý³4Yš‘n{{—ÝW¿ÿo¼Ç¯ÿ­š&Íçí}ý[3Ú´µm­˜Iú°Â–õdÙ,PŒ<•Æ#*Am¶të¯ÿlÑ{f{m™®º´÷´´› +Ú·ðF>á‚)Úh&Kz[b™Ãl�(6(È´)KÁ"„M‡‰@0‚x«­¶Õµ°ŠÙµûaua« Ûa…´­`Ëšuuh&)Šb¸„é„ÃZLUAZlŽZmS iPÂ2+ȉ²œ•2Ý,l”ÃQ oläà ]u ¹aØMˆI¦Ä&)Š´˜i4è>F:Ò &d¡;M#Cž!¦«$œ„S¢„ ؾ"":-­NÅQÌÌÍc*"ñÌÀ‡@„HSa œ(V›ê¸b˜¦PÈúM; …ØjÑ¡†0@Â(1‰X7EÌDĔb"8Auµ´ 2†qšö8°Eó¡ì�öD…‘<í&< a&�fEó!˜âõH/ÕªA6‚ « —:<)üÝA7ﮫÄDFµU PÖ.“¤Ã­Ü%½n“ûzz”éH%—^ºHV½Òm_ÒÅGìé ,ˆ'(FÉ( êÏ£c(‚Èñ00@úZ¤)á䆤ù>fÈdP]Š·øøé{™á0�× +Tlfri¦�?$,5Mßô�R$Ù£3aP#;Âa4Ñœ0Œ8Z^—¥öÒ¶] ”Q&„ÚD[i;,ôƒh3†—Á,j–•é0è*„w„ÂÚ·úÿî‰=-Úà�¤­Œ'_Ò´�_è=B8õãÂZN²ž-&ÕûúúõýÃI?ûzî-uþÛO_ ¢’^–•%éQÎ’ÕS‡ëç¿ëúõkãkz÷K~¾#�$•%¤´’Ö–—ðÒzìŽ?ÿÜÿD:>?ÿŠýqT•uz­+Ø~¼Wÿúÿü±Ÿý[ÿ¤Q¿J’KI1T¶ðßü¼ÿÿÿÿþ¿þ¿b©*×Jºð—‡½.Ÿÿý}ÿÿwÿø#¾Jª’áµÒ„ ¼6ëøÿ~¹Öÿ÷Â_ÿ„ÿÿB UX„Þþ—߿֓ÿÿú_ÿ¤ýé*I*“ÕuR˽ÿ÷ÿ×Aÿ¥ûiz_µÿéRý¿m*ÿÛú×ÿ÷ýÿ×þ§ÖãÿI<Ÿ¥öÈçEéj¿ýßÿï^¿zI*6—JŒ.Œy£k4F÷×mkÉÓþÚú_÷þÙ¢××í_~–¹K[?­Wé6·›þ›¥õµö×´½}?» _Ø@Û/m¤�ȃƒí®’ ¬t�§KIB $Jé>Õ´¶¡´´ÛUT“†4äQ&š²/ +NÐr8Q 0Ú Bp©;u;Ц*ôÅZV¬4ƒi%a †ºa†‚4 ŽH7h ÚM;a“MXM5±Iì&®Zd‘Ø^|*„„ÕuLè6(2-!0�1”ï Œƒs•Ø)áˆÌªtòÊá¹d)Gt33$‘Q †**jƒÓXA„ B âˆelòÌ$ ɲÔvñÓMTŒ2)ȇ™ ³%Fá…dЃh‹ üÉW6D4a‚‘ã¤Á£ØaÃöF°e Â>< ѱÉù:Q»¦Õ¿I´ÓAi<¾zMª"à zM´p“¤Wq‚ «I\«ôÂaSH[I°“i:N�m='†q¤Û¾“çÍ&ÒÙt,醡¥t¯oJÂÁ>úMúK¥xôß«{i}g€ÐÂL4›Iµm]&¾ð›I½ô½µÕÝÒ÷Kúoÿm/]ÛèU¿ÝúÚëøº% tšï{v“[ý}½:ÿmÅz÷ÔŽÚëé»ék‡÷êß�öÜRµ×Òzzoú÷Ckô¾±ûù�®ö©mÃ÷úý{NÒô‡pûx~¿ëü·;œŸöõýô‡õ÷¿×‡ÿÿ­ûöÖ]`ᯰÿÿÿÄW×ýÿ_Ý4� øaÿÿè¡ÿ~¿a°÷Ø¿ÿºÿÿÿÿ„qÿòŸ_íÿÿà—ÿÿa°ÿaÿÿÿ�/ÿüÎÿ ýµuÁÿûýÿÿðØoðoÿÿü$ÿÿ¥ÿþ“ÿÕÿA¿ÿýÿø8Ãÿ¿ÿº_¿ú_÷øKõm(«m_ëúô—ÿ¸o]ÿ_ïûKû®Ý/÷ÿ]¾6Ÿÿ_m}ÿöÛ¿”éýÿÿ__×úïõþšíèç_]½þ·«þë¿í/Ûúmn»]mvÿ×m-Ûm.»_µûòÑ[;ÍdIý{VÛ:tc§_ýê×JÏÚû¥·ß¥vz»ì vëÓ åiZ²(tȼÒMdpÔÈS; •VEÈê2`B‘<Ä]S¿�Ð"ou½6ÙŸ×Ý}{kÚûI´¤AÃM6×bá°í¡ŠTÓ‘ÂL6‚iÃIº¤¼‚   “¶�3#R £ØaÃ(hØ&“ÃAÎài0Ò Ÿ¤›i6rlÁÚÚM¤�¤©¶‚cL1ÚAˆL¦›h ƒdp©¤wh$Ø$ûa4œB Å22 ÅÐ0ƒ¥dDF�½ÊqRm Ø*A°P“µªM¤Ú†ÂVØIŠb˜pƒa$Ø0‚´Ãi2V­‘ÀR¬B *iÚ5°Ä)] Qe)ÝÝRm+ +•£½Ûç|ÒmlÒo‚-Øb@Âdg%¨‚”¬QH„ EwB""¿�m}¹WÜ]+ÿzoo3V¤æëkŽ·ª;¿Ö×Ûê+õOMÿ¥ßõïß»+vHÈÑ/ßýk¾NF¤OžêG‹02òt`ýûߨD'™Ë9àŒ0Jg0dùs»ÚÿßÖÞ°¾ž4lgà˜N-w÷ýöô›T I´-ÿ¾ÚZíé6ÓI6ˆ° ã›ØA6ûÿ –u„ÃKKŒzOï[zM½%pM7·Ü”/ÿºl7W§WW¦’¿ØõïßÕzöÕZöÿÃaõ´õÖÐÿö¸ß[º�ßÝßoÞ¾·×¯_÷ûëo­Õä�þå¹#öÒÿˆoëëý¿GÀÿoVúÇýñöD{":øo^ÿ×ý‘c…sãý¿Û_ÿý…†÷××_ÿ %ÐnÿÿÿÿüRøoaÿæ“ÿô>­×íþÚ_ÿþ¿| Ÿý/ÿZÒÇö?ÿÿý*ÿ¥ýé?~úû÷»ÔUÿÕý.²ØÄú_¾—¿ô—×íZµÿ¯ê—î½~õ_ûëýÿ­¿úoÒK®ºþÿíûª[kû¶¯ëf¥V§ýÕë÷ëÚíÒ_]Û½Sg¿î›KÒIi=®c°�û dAÁí‚8õt’M´“uvÐ[šiØA)4H ×·QR8Ad øTƒcÂÃH$aƒ ›h=� ÂTîSŠaC¼¤‚Eæ¥�K+qÚ–EæD@M?a„Ó ¤|a„(»± �Ì0h©Û:! �$B) (U^؈ˆâ! %,…¼üoò!ø„l* )’ª;ÆÇ¿è&ÄPTÓaôî,4¾ÿ‘5æDöÂ]üÈ_õõ Œ›ÏõôüíU(××*Ï7)Љs:“ÊkæO�óxˆqˆÓ64B6Fe¶§H�ù¥ä��sDyz8Ž"ùñIÁ¢&Ö9†€eL#;Ѻ°FÆÉù9Ó  ›PŸ+ó>΃!‘"¡MæóÆîD$Ðaša@ü#`gÃ;%ÆÆÈøhØUôÒ}£ÐA´Ñ� ›ÐZM¤îè3‚›a&Ðg›-² ÈÓ F†c?™É„k#l±ÒBúM¦˜Fwé7%Á0’a´ÂI´6YçÍ(x¶“1 ´Û_WI´¯Ò‚׫æJ� G†m&5P� '¦Úi[e¡6™ÂI·v’ý+D£î“íúÚº^—ºµí;éïÒDø7]&TÝa+þ.½;v^./nÚªo®ãï®ß«†Ÿÿ[¡÷ô7úí7Zûé>.•ö›×¤Ýü}F×è{¿WãëÖ¿ü·$Ýþ½ÞŸ»ÿCß–GÞÒD:¢åŽHÇõÿëVÿûÇûÓãû¿ðÛ¨|¸8ký{ùc5,gô‡ÿõþ¿õÿÿÿþÃÕƒñÿöß­µÿý¿ÿÿõÿÿÿë¯úPÛ«ÿÿôSµúÿÿÿò‹ÿÿÿ¯ÿï_·A½A¿ÿýµë×ÿ¿ÿð‚ûþÿÿÿù<ö—í¨7Ðoÿþ½µÛÿÿ¯ÿA{ïOÿ½ÿý†ÒýÐ ÛjûÿÕÒþÆÿßý××þÖÿûÿþð‚þ…âŸÿ÷☫oÿ½~ë×ïÿÿoÿÿ ‡õv¾ÿû§¦öÿþ½×ÿom&ÿü�ÿK úDOò~¶ÿ÷]÷lÑfŸí™ú]Ý~»h7¦ÌÓì0KÛ/õ¿áõý·ùŸíÕmŸêÂé¶c톕¥y�ÒÓ‘\=�´˜ä ì&šlRiÄ/ýìƒÏ܆4žë/6rÓÓM6Òzb°Å ø5 ±V’lPa¤�°�6G0i ¿ $í­¦šÃa°ÓM[´©´˜„Å&šzi¶•8i¦ 6Ú‡†«‘í°ƒ‘í“ì!Ec„1¶ÄÃtÓ[¦´îíŠÙ�W•m¤~hüÃ'µ™a`7E]óÙH)AÎå +ˆá‚-ÃRºžâèzëëëIRÝt’]+H(ÛI´’±AŠàɪ¢#ÿ-qEZE¢ÆãA•…->Š­DµyVŒ”FÙÚ vS±M' +H¨’.–!IÎõEú Bå�xì®4fGÉlFâ$ò"Òa£µ”Pƒ ¡ra�…:®[¥ §`l*¦¿î“¶‘Ú˜§Ïß ‚ÎÕßUOÿýý*ö$–”R®µû»MSX¹ DI$þõÐÒBªÚ_%(|ìtv_%¸�ª¥·¶—ªEZ#¢ Ü…AˤhF™ôhDñ ˆqó޾WÕ:7á<#¼†É)i)¤yšF¶^'3Q)­š@ˆY‘œÜHät1dÄ� ¦ò†x�ÐDÇ3†p:áaŽ8j°ç…ëשGwg2aç*dtP4D¡jI{.}‚3†x�™¦`Â5†ÚT©‚`�ÖJf€èÑ&®­…PжØPŒ=RmB;Â5´›qlt+:I6ª‚%…FwʵùVgR +jÏäF "B"=‘ˆ]à�‚^6°ƒF†„0� Q±®¯Ö“aÝ5I½,*;Ñ� œ%¤úH§«,êÕ6 “è.’Õ-'Ký_I-ùCÕÑOI†Žô+�ÄA��DäR d"6GH�y̼fò<A K�ü§‚aÃ�„ϘF†ivSÙÖFÉ®M4›Ñ‡f�Ç„hh ì™Ó²h †—«®—º‡I†éhãÒÐZUL$¯Umý-ék‚;Ò´SÒu 6ⓤ)]=+]%®“J)R]iTÉV02B6Á1h¬0�a£ØfyœƒF°Ë馘F¶š{!odv¡/j� &-9>M%«,õeŒ¤ØTÃK°ÚJÕº»K´º_Ýioî“Å$––––ºZiV––—ˆ­6•RÕ]%J«úØê’ŒccÖ—KÓ …I†“i6“¤ê�›4˜Â"ÃGºZÁ›eŒA¦‚úm¤ÞïI:úë¿N—Nµíãתuþ¿û�u¥I-$Tµè]!¥é$–éq×UÇ IRK÷¤´•ªØªðƒ8jé Òoup°�jm®‰BÒ÷ýô›÷×ñ÷ÅÚÿwW®ô¾4¿oÇý-ñê—ªúJ_á­$:þ—Z\Bõªëê–IwZot­uÔT_m'jºèt•?oþŸöÝ([ï¼?zýÿáãè±Èö ÿ¯ÿoTÇJ’ZUIT®­}µé*TÕ[ÕRÛ_¥´øïCDs ÷µþï[é!÷¤þú·÷Žûý¿�ÿü>üRý×ÿ^ê“Uý$ªš­%Vé%ªéjµA/¶éa­þ•{t­V*¿ÿã¾”·(rÏ{ÿúöô¿þÿþ½‡¯Ò¿~¿úÿÒOXAcª‘Ê©µýuÿÈçU·Ò‚M¥I}zņÃÿÿý,G¾¿ÿôõÿÛým}¿ô ýÇ'dwÿ¢¡¯¤»i`�wÄßëþª–:Óqã·þ¿÷T¡°ÿëõâýÓ_ÿöÑÇÐ/þü‡þõἇ?‡øz ÿפ«ÂëŠõ-=]-j½*¯]xUõéW¿ °ÿmaýþŽÿÿÿ¦Õüü _í ¼ÒüìÌÿÐ_íÒ_¥I#Ž“J½S_gEÿô–ߤÚéÿí°ßî—è'å¿ÛÝ/ÿ÷^‚ÿøoô¿äa÷Òý¯}õI½-t¸P¼�‘NÿÞ´’S ×I%0¿èÚ~Ìü£|Âê”Âÿþ ƒþÚ ð—íþ•ÿýýÓªZÿ¿ëþŒŸ¾—ßõ¯ÿ¥¥Öai)„£™¥HÚW6¨ÚÌô”Â/ja?ÒÞÿJÙšÌÒ¤©³Š�*ºÒÕuýuxwÿ…ú_Ýìq_ÿ\8¤·ÿ×ý/:§õß÷ÿöé&ýuÒÒ½iBi~•¥é~–•i:ZU„°•„´°•ÐN­%¾h.]µwwý!ÿ_oé¯ý×w×ÿ9ÿÿéúÕýÞgçÿõ´÷Hü—¥¡XJ ´µÒ‘à6Ò¨wPݨSjè%B› 6ºQZW±U¤“¤•zþìê¿ô¿_ݽ¯ÿºú_ÊúKúý²>Ú÷ì3ÚÞšÒr+†Ø.ÚV5Ò¨¨Pâ�eÄŠj˜¥¦Ò¦Òá¶–Šb ¡1OL-ˆMwO]w¦Û¼Çÿÿ¶Ýïúí­¿a2é[0“Û1÷^œŠáé« >êD°Ør' +=t§ ‘bƒa¥…L ë„ÂÐmªa5LB¦!BiˆA„4A…Dr B"„#êí+lÿÕ×ò«­„ {³–Go_éºLŠ!<3œvŠ ¶’i§ M;Ó ØA0©ØA«­©á‘A Â„ŠÆ§EcE{Gö" F°ÆRú°$"8ŽÒÛI³“ %ii&š¶šw`Ò ; SNši Ó 4 ªi¤ØN› +ؤhsÞ-4�U´V9èåc•�ƒ !a�'̇ƒb=m$m Å1LS *M;¾Ói¤ðl0˜Ea#áHsÛ•�Ä#µLDC<�Sˆ¤D} Ú®Bœù BA Æ2²N†R$Ø—œE*Ié,ºÑ�Ï¥ËyÔ»ª\UÖÒ´W]uªê6©�ÒI´šÒ öÒE!`è›^ÒÈ�!d +0f $kcÿËag2 +Ë-du¨f|¶+Ô•‘3aL’šGa;IhaØ ¹hÌ‘��¢^25`ˆƒH«Š(‹XEðk&L4›aɱã±(PR|*„kh ‚¹¾ó³LˆAÞà©6“i6r¾ƒ +ìWý?A6’ ýgp3¡œ°ÐCùƒ´ÑØI½÷z˜FÀÂ.Éñ?'CQ¦�ÔløM[Âh5Tƒi>éÙhO…ØI6‚Òl ´›¤›ŒzÚIu¥ÂiðÜ”%KJ—hQÿaé>Úb¶ì/÷®ýý>÷tlz5‘rš66GƒeÞÑ�¤ÚlÐZM �ÝBI†“l³³Æ­²ÆOš Ži6–î·Wׄ•«¤êëétÒ^–¿»ôí ¯¼X÷_úÛ]Ómÿ¿þè{íßI‡&��Òa´ÂpË<[KIÕÂ%­'Ýdí^éu·N•«ý5ãøItµªkNôÚ´’KëéûÞ¾×Öýúþ×÷ÿÿùnPÝ´‘¡£@oIÚZ“ŠM¿Uº½6–ízÿâ©ãÓ¥ôø«uúCÞúQ×B¢…h}h$¿ýß_å”ÛÿoÛöÿÿÿéÈ�H6�ßø¯·ÿ[ëâ¤pµûºÿ^öÕkúð÷ÒD9ŠÔ±ÈÏ–9C–Dt�]ÿÿ×õýëûÿÿÿØZM¤é7ÖÕ6ß^íuÖ×#Ÿ÷åŽG@ÿßW¯þéKëŽ�Ž¡$—×ÿÿÕ}_ý‡ÿÿÿûâ’º¿ÿõû_Çõô†¿üaþ—ÿõ°þ/_Kõ6* Hâß‚ÿÿí×·_£»ÿÃÿÿÿߤõ}_¿ÞúýÿÿöëÿÿþßøUÿÂ;ôG¶£ÿÿ¶—Çý6ßøÿÿÿý-Õ×ßÿ½¯ÿÿÿþüc¿ÿÿðoå»Á?}áŠDPïKÿÿدkõ÷¯¯ÿÿÿõÿÿzþÑO¯È…ÿÿÿá¿Ð/ÿïûÃÞ—ÿéh*Ý/ÿûÙôÿé6æ¥kîÿÿÿÿzÿUý´¿uuü$ÿÿþô«ÿ¯ÿÛ´··ß\%í�R_ý‚ +ÿú¶×üâî¿ÿûý½'V×õ¶_õëþýÿþýö×þ÷ýô–ÞûÒÌ•ö¿þ¾Þ­í~®Ú·_{¯}¯ækÓû3ô®ºSÿõVÒŠý/ïßÿïý/ÒþÿóMÿmµÛ»ÿS!hŽ•+~×û¯}�~fyËÿI¶÷Kú´¯0»¿Ðu~­„•&Òm*»k ¶øÚÿ_»ÿÜë×úß[Óú·}wöÛš{}èFzݵ׵ÒO‡¶ØJö´Õm´›I5´ƒi,i²z§~ÈAéÛ¡ ƒiÒUõ¯Ó]úÿk¶Þë÷ÿ¦Ÿk¶•Û{{kûmŸì.›=6a¥°ÎKÒTðà C§v•¦íŠÐbšh0ƒL0a&ÒNÙ6‚A°“`»M]X*Âa M Ä&!SV׳Ú[ÿ¯·ÝŸÛï]³ýÕ—½Â0áÙI6Òa‚vGÃ0äKtšwlS%†)Šd/¶! 䮸&ÛTNT + «%yí† +´hh«�$khöÃA“ ÷(ÃAƒ•Ììk£²Ö"�Þ­�n“Õ—ôäAý²â(b˜jŦ›ÚLBL â±V‚M´ƒ"ºdqb˜V’i…°Â¦˜A„L0­¦……?ÛÊyC&ʾ�%m$Øa0ÃJ¶)5`�4Ù$ ‘²W» &F]J·´Ó +*U°Ä ÂÑÁ„ šT›«Å_ A%l$ÓŠa#ÖV©¤UÑ\QÐÊÆjÍkÁ”E «K¢” ‚† QHeuXvJšB”Uý»I(¤kÃv‡þ,A¯!m¦6I§ „]d0�aÁ™½•%0†"?ÿ,‰L®œrÜx™Gw�„a3µmõP¸G¾“_õkQÿâéwɧÿÒ;"×™ÿùØÚ*g_Éžjzd2% r‚!‘@¡•k"q�„ðô5 …q#äù†O˜aéÔÈÐólÔD!)8‡3™Ä_>&H‘›#¡ð‚YÍa”f #À4BiØišG·£ÅQ°9Æ 1è [TÒz!<ÖD\Â>< Â5†²��Š�¸FÆ¡4nh/I‡Õ¹1ÂÒm- òiÓrtM†˜MH&Ò Žjþ˜}«Èà4›A:M´Â 7 ˜apÒ´žYÓa29¥¸éZN´ëºW½zÞôê6ZaG:x'AZéÞ¯M¥in¯ ¥õñëuݽ´•RÜ~­ÓJ;k¤ëoªzÛMª«õn5ú‘Â×}|w×Ç]_KhomHá~=$>›wÈákÕ¼Œ{ÇÑ�«i"Ü’{Ãû}ïÒè‚òÇ"Ò¿k%O×þ‰«Áÿ,gÿØ}wƒük–3Xÿ½ +ÿëô¬?öôºý‡ÿaú_¶©{ÿÿÿûx/è§tÚä½á¿¾Þÿýÿÿä%þKî á>ÚÿZOƒðßÿëÿÿáÿ„°î—ý6®º ßþ ýß·þ¿ߥý¥·„¾ÝlaØKßë¿ÿqOÿ]ÿé~én¿¼S{ë¿ýõÚ½ëVßÝ/_½No¯ß½¯”n²„ý]íÿk×u¯í¯¥þÙžÓí™­9–E6hep(¬ÅA¼LÇÝÕ¶öÍ6N·­[3M®ëÚßgû°�]7„Õ¿§mdAûI2Ü-B>Ž©™’„UÁB„w…NÉÈ ³a.ëºé³ûh; +ì0JÛJ醴Ón®D6E ±L6öÖE 0n!C]1L' Ýe¸¸R*JøÏˆââvP�ä>G¢ôœ8@Ÿ¶_t“´¬ ˜¦)ŠØ¥m, ˜¦)6 6 ÚL0©Æ)„íØNÖPªx†GD’#Àö ZV’¬7;¨éëa$ì%)ÚL&G0BI±R8A“{aˆH®ˆŒ¬ˆˆ0B"ŠÝrl¶0�†¡Ý!Å%O_ôœï‘ÙÐÃ1 1CŒ€âl¤‹mÝ>—ï�5êRý!P²nU,¥+ýëj¿úWúKm}{‡~¿§©HÊ„u0¥`”¤"^ë{wúšò|ŒÈÊýï$"tá�Æk"̈V^¤&MŒ�d~‚b!áÐD™à»'2h4D$ÎsXe@ø_ÿ8GÍ�Baà e¦:iwèïØ~àš6ƒvѱ„ÕpšÃT˜aBi>š~MáRmB}$E-Ú)߇oÓMÚN…ˆ×·éCe£=´›Iå�0ÐÙh™´›ÒmpÒvcÜ;¤ì³Òm3þîË¡sž&Òp‰}^ô´�ñ´›KÒm‹í¥zMÓãïëúVý:‡Þö¿¾î»ßtþ©û­þ»�뤭´÷¸ý«tùÝ‹Wûµ×½?u¡ÿZ_M¿ñõ¿{^»ÖüµÀ‡êÿÿõµ­úõú·úõî‹rB?ðÿëûøoû–GÿñÿöþZúÿÿã«~Ãÿ_Wûÿÿÿëñ®–—õÿ¿þßûÿÿû~‡ÿÿ¯§¿ÿÿÿÿûÿÿþ§˜ïÿÿaÿ<ü}ÿÿÿþÿàÿÿÿßè_ÿÿ/êúÿïÿëþúðßýûÿ­VÿÿôŸ×ßÿýíÛ_÷ûKÿ_ÿÿ¥þýwÿÛí÷ÿgOüòûÿúé$ÿÿþ¾•ïÿ·Oý¶ûׯ}ïí×ë^þÿýßöïÝmw^ý³DÚÚûiߺýt•Íÿÿ¯Ÿ–ö¶Ìÿí&ý´¼ÂÖ¶­¤�õeôÛM†rl½ÚI§„gi» êÝééò àï½4þA<‹Û ¤Ç¶‚MŽ„iÐJ†“›#‹“  “N °˜O4#ˆA„ÓTØTO4Óƒ 0‚ 6ÐA’¸ ؤè* „…{S;j0MgaˆSÃ4å¤ wvýn*„ß¡XA?™$O“¡Å*NW?…ôú¤wŸþ§uÀŠyQ�µÎÄ"|Ôdd¤2%S™Ð9+3æh‰Öˆƒ|HƒPæ@B¤FÁÒR4‰I’� e:fÈè))dq“™:ÄtGfÈÍ“à�‚¬Ô=ƒD'žÃΦFÉ ''äéLþª „…´³9[©VÈè�3dˆ“=_'äÎÄhgÌ#ãA£X5 „lh t †�¶Õ4Òm0š¤é:lÒpˆ±G¶ï²g Î ãA6“ª_A jÕSÝÃÝ'e�›DXi6–�m&ÝÐgóIµ>a–{¤é:\&»í*L+ôµW¤“h3Í–z ówI·u}&á:V“¥i5ôÖ¾úŠôÚ]Sÿﺧ»×û®–·ößÅÒn›ô½µÿßMÿ­õwü;_ý}&ö÷Ûô¿¿ßR8_KH}¯Cþõ×ÿÿ¾‹Ž‹qúí{µþßÃÕºø%ÿÿå§¾ÃÿÿÿÿÅ}}7ÿþ¿Ãëô†µo·ÿþúÿÿÿÿ¯ÿ¿ÿý‡ÿÿéëømÿÿÿÿaÿÿÿ÷öÏ‹ÿÿÿýÿ¶ÃÿÿþÿÿÐ]ÿÿÿü7ÿÿÿÿÿƒaÿÿÿÿÿ„ŸõÿÿƒcÿÝÿõþ/ïÿÿþïÒïÿÿúû÷ÿïO¯ïû¥ûÿÿÿïúû¯ÿÿ÷ú÷¾Öÿîÿõÿÿÿý»õí�V¿ÿíמOºý¾ôÿûšzþßýÿÿf{kêYÌÕµoûÿõ¾þëÛ¾Öÿû?ÕßÚÿ§}Úí¤Ýö3"S-ѼvH2Ê’8ˆpgd¨ÇÕëÿí6ëO«t½³Óh6Òaž›¿ÛKM²õ¬ˆ;½‘G SM�ƒµd\­¨b˜Âr8I‘ˆ«D±’G*‚ åTÐlAÆiC}¥}—ÕvÂ({¤Ø-¥"ûI5b˜ Ú1LM0Ä$ÓˆMÓ ÓM³iì*¸I¦œ6#€­„ÐG¼�Iø&È£‡è¹ûÙ>m-† ¤©±I Óƒ ¤Á›vi†’v ”]Aç‡;¶‘íÊËLŒX!E[EqGEmŒE¸Š�/anáÛ»ïðÄb{ +U¹WFv„ÉT˜@Å1 +VDDA”8"ή­Ý¿I÷}¾ ÎÔ%W´=úOýt1õý!ê½{s�ÿ+Z•[!™!®¹ÈŒé£Qäk!‘ÑËcF®–LDi™Ä°ÏŸ“ŠCo'G\ÙÚ +P�� g3y²É6G�PF¶EÚA*Hôqš6Óƒx"ðFQ™Ÿ4 ¼Ð!é)B4Ð2ŒÎ0�Ÿ#Äi„Â~�Œ"òÉù)ÂhÝF†&¬8 é †–“pƒˆúj‚ ¤á&Òm uPŽôš÷¤ÃÞü*„ÕSE[pá»G‡ÒL4îÚZZ#¶“µ H6Ò´½$•&ÂN•„„°’8é-&·I¶XõAžaS–‹ßô¶ßoo×úýƒ¿ÿ]m/ÿ_ÿýý†ÃýÒ¯ÿëëûoiúúÿÿë’öÚ_ÿþ þÝÿÿÿaÚ)ÿÿ‚0ÿ#LŽÿëýôŸÿÿü8oöÒ™,/ÿò"ÿüuëÿÂú ÿmýº]ÿëxl?ñ +ÿý'ÿðý6¿þ—z ÿ«ÿµâ·úýíßùÛ#I?ÿÚ_·û¶±_õ®ö¿ÛÿÒþývê÷0Ÿð¤Ü*¤½uú_é{Å5þº÷ªûíÿ¶ª×ýz¶ÙÓ«ÿÉ·á*úëíëïùÏþ¿m¿ûvÿÛ×Û4^»um™úõü†¥ ‚ÿ]{ký×ý?ö¾¶Ùÿ_lÍUŸ]ëg»òéí†í$Ý&ÎM„®­$ÓÛ-ëÒ;CAs¹™©šÌî…ÖÒ´¾Ï«ìÂÛKúz]=.EpÃg&JEpÓVC‘cMS°ÆÄ(t›ƒ´a†�b˜¦V’v›`©ÆLdð Â@ˆN1YÈ40�‚5–*m ƒC!¼ŠáéijÙ(4ÃipÒ§L ÓÐ\Å1L'NÃMi¦`©¡L5q#ä1A‚ #8¢йF�N�F¶ +���l0È©$Ú †�l� œi6 a=„¬$Ú¦š¶Á:í‘UngʼR+h4 0„edì Ù�Œ9�8�#†kËáé&Ð@©0ÒA6ØT¡«i6*M…Ó +ˆå¹…!`ŽÊ"oð¯Aš5¦ÒE]'IØl‹I:N•‘¶C{dî#Cˆ�®Ó'ŽOúKa!ûQÛû[ßÒÿþ•U½i+úºOzOMÿ÷ÿî½ëÒ1Õ¥ÕÖßßßêÿýÒëRc8�#á4“]/׳ö¿ëýÿÕ�òKìqHÖú÷_zÞÿÞëëþš /ªi¤ƒz_uަƕ׽ì4¯ÓM4|cê¯I^¿ÿáÞï÷ìWÿ0ƒ»b4•gפޗëúBÚV7þÿü®ˆƒÄWK[¯Òþ¶ý´¿ÛVÿð’ê­õÿÚï_íèðÿýXAKõéí—¾ÒÙêÿê‚!g¶ÒýðÅ~—û ͆?ÿ½ü†wþ [¤¿B•?ïþ­Eºýúñýÿ«�ßé_ÖüŠ¿ô›ÒýRÿþ¿õþÚßõ^ý½m&_þ—¤Q×t¿úþ¼ŸÛ_z}&ÕuK¯nºK}Nõö—¤ô…)õÝ$Úÿä÷Þ•:µÏ½öô›Ii®’ ëÛI~¶ªžÚ^  °©0Ò×A†ÒI†Ah �òÓ”a4ØhS´Aá„›@ÐLWTœB !#ub‘¹¼³Õ�Q„m•ÕáANÄä|a Áž7Ä#ZS†!6! gB"‚S0´È’&Q_^#TײºÆ""8A +A0ªv´Ó—d²û¿†Â —ýÓïô“p’…ëwƘbCÜ›_]þ�n¾£�âM1ü–3©�Œ�‘Ò!—‘ˆÜf2¦Ñ¼•³1äTâgšGR:gB Å7œÌó„BP�‚\HW˜¢7xœ0FpÉóvz.Ð"ñ 4#ß… £Xh»™šFrhÙå�Å$ ‘› @‹²tldB4Â4x #@f3ùžaÃ1£[b�Qï„l SOÓI´ƒ¤ ¤Ú¬+I´ Ã%‰¥ô4›A4î¨i0ú5†� ¨ØÔ Òl(M4-M¤Æª� &4�¦‚M²Ð›DpE·Ã<Òmt­'A‘Ì$ÚN®Ó´Ñ'IZNøIz_&ÐZ A0ÐgšZ ñ…D°7]&T¬*w­­+A0Ÿ¦×QJý'í|w¯éÒ×÷ ÂTþÚºº½Zôý;ikôÞé�X¿´ïþžª–â¥ÒÖ­êþâ‡]í¸¡ô�tµ½ë}ÞºýßKï½HáëC¸ëj#®þ¿ï,r6ÈMnµé·ëßßÿøn°ø‚þXäs ä’tY; ½'ý«ÿãë×ñÿÿÿý‡Ô=3ÿ¤,›kÞÝé:V“¥zW'}&äí(ºÜ�¥¯i.Ÿÿízkuë§Iö¿Ki¶›õ´›î߯ëQCëB?J5 ?ø¯ýÑ_ýùc’ uÒi/ÿÅ/ßé·UµR8W¾éHákqº»w~¿}þ·w}ñûʾÞÒÇ©c‘­þXÞÁ.ƒïòà-/ù`_ÿüXzÔTTŽR8V«ÖÞõû�ëú÷XÇáîÃëÅÿ¾ý/}Ž[»õýhúJnå†ÿñÿý½ÿý&±miTA|Œñúø}7ÃDÓ×Ñdü5¸ÿÿþûþ½á…·ªKë¯ÿŽû¿ÿÿÿÿïá¾>¨±”‡][Øì:n’×m-vl?õm/ü/ÿêp]ÝöÛGw‚0ÿaÿÿøØi½ÿÿÿÿ°ÝWÿ×ý‡¯°ýÿ¡ønEßø#ÿÛHŸÿø#?ûöúÒA?„ ïÿ÷ßÿÿýÿÿðãÿü#�ÿ ÿ†öÿ:§Û¬Cá´y°oý¶‚ý¸P¿ÿ ÿÝÖ4¿Kÿïÿÿþûû½~µÝæK ÿð‚ÿÃÿ†ý+Â_®¯†éÃ÷á-ˆ_±A/ÿí/ßÛŠh%úöÿÿ·”ûïþÿû�vÿÿ·…¿ÒðÞþÿ×î­/¶ÿép¿Fýuú_Wí¿¯®÷û“¯ëÿïý¶ý/ô»:}/¿¼%íÖýÖûú^Þ—¿¿ÿ„Z¤—®¾Þ­«~Ý4¿ëmÿÿ·ÚÿûöÚ½}õ¹:ú]ïþ¾¹B\„NÝ_¯·®Pºs߯þºõ×ÿÓûoëþÝ™ç/Û3ÿVþ­Û?¶ß¶zm&×ý-† ]uÛ½½}ë_n¿Ý½}í¥¿ÿÖAçù ~¶¾Ã»m#Ójr»>þÂò(á°ÎM„µOa„´ÓVÒ´¤Li¦š±È¼BÓb˜jÚ 4ÖÒA± WnÛÛ4^½®Ýn½Ófk¾ï¦Ï«¾Ôä·uÿ"¸6ý[‘GÐZ^ÙÊ †ÚXaÕ§¦¤p®á;Ä+A¦›´Ðà ÈDši á°M0©AˆAŠO¸¥ 1 i¶f›>¬úí+°¥öÌ&ëÒ[¯I†¦ÍÜØá¶¶—wi&˜M:«M4pOih(i†*AºÃ"Ž +‚i»BÓÝ´Ða£Fx„ka…”E8 Ä pÂEtŸ•tdB(Ä"`˜B#. ¹0°`¬{!ýÈàTm„„l �pÒb°Å Úh Ü0št‹HL+"—÷°š™Úüüݨ…‚+(öÃÐh2al®) B#F‘ª-èÄl&ƒ Pai6ša1[¦†Ñí±A‚ÁfÏn�”¦„D#²yCŠŒÅÌÈ+¡â ÁùDØkp—ùØ_ñ¥úô¬ ‡ýuéCë¥uéWI´µ^„'a„˜3Ó|2(P‚ „ÇDÙE+DGÿå¶–™6.DO–Ê[;Œ)J�Àƒ2'�ÆÞ &÷ó; +Œ“²ÊÊ"Èf^„óH3y3‘˜#90„Éã5HCµOÿ;‰R#­N„L3¡R)ÑgÙÔˆˆÐd™ž"@§V.!#6?ÎF€Ê"æf‘ Ѓ'ÐiÒT­¦ ¦©¦˜Pš„ga ¸P�a¨MpÂ5¾L~Öí,"ŸRc%H��Ý‘BÊHêY‚„¡2°˜dt�1 ³hâ/Í�@Éód jˆ”;†Ð #@gÆpaÙ>gL&hÐ £L"ì3\MÙœš6OÈØí4S½ ÈùôÂøF††¡ˆ¤M…GŽõG„w„©QÞ©¾²éIµGŠ:A¶Z¸Ò3Ò´SÒS×¢AƒÙ#ØdÂ3�� Fp�š6M3L a�L£Â.Ú„Â4=,q¦ÖÔ&�øHI´ƒnI†ª‰CG¶A´ÕÚ"»ÐÒt:u&D[«é4“a� +ËCmàíVÑÞ“ °Œ:AihãÕôœ#�KAVŠzM¢ž–®¿ÐN–—®’óÒ5µ  œ*„ÒoÚ +ÓP� Ç Ù¬šl",4ŸA0ðK<–ˆí„Ë:a„¤Ãi¤´ÂL?l(t´ ˆN“¢OQ]à›íÖ’ºk}ëzI´´´´––‚õÒT´…%ÒÒÒëÆº¥K]t«ªÉž‚ ¢;i6¨3†“îêê„'Z„ØWI¸M¥ë½(¶º ÷÷][é+§i¦Ò½ûi§^ƒVé[õÿ¶Ð¿îÖ©i$–µZT–4’T–‚¥^†–ÒÒ«VõªÒÒ×׺­ Ÿp´é?éWWO·ýÓ¯ªn®ôíizWC[j¦ÇõmÅHá­Çöý_K_~¿Ǥ)E¥K�Э$’ªX ÖÒ×ÂúIt½/t›k±Ö�þ—»¯NúM¿_¤Óu»¯Jê¯Ôm4ým!¿Žðn¾õÓÿú\:é +_±]kÿ¯þ–•*¯Ý/ëïû¯ý½·ÿ¸ú,r2n?ÿWÕꉧþ·Ë1ÿaõþG ·¯ÿÿ^°’ªé%ÒÕt’ê›IioÂKõ­wÛ~ÿúÿÿ¾¿þ-zý¥íõÿ¿þ¹ ïÿBÿÿÿý%„ºÒJµZIR_ª·ëú„£UÒÿ_Áÿ_ÿýïëïëÿþ—ÿÿúêüÿÝ/ÿÿúÿõýzúïý%ˆ%ë¥ÿû¯ÿûk¿ÿ…ÿÂ8ÿÿÿoÿÿÿ'dwáûþŸm/ÿÿýiit©t´½i.›¤ºêLHóü?ÿá¿ÿÿ÷¯ÿð�¿'ÿÿþ¿ÿÿÐOˆoÿ[â ÿÿý*]*Kê¿¡Õ~ªÿK]%ºõÿðßÿÿûh/ÿð—á¿ }ß­ÿõßè/ÿî³jëÿþ΋úKüOÖ½u­*£iô—I-/!®¿ÿƒßÿüŒ¿ý}/°ECô¿ÿߨ¯ýµÿ×ßzô¯ kÿþ뤗˜ô¨Æ’Ñ´•Jaf‹K0³ L/ð¥÷þ�®³?Ýk_ßïûÿÿ£¯·ú_«õ¯ß½[¥Mÿþß깑Gö¿þÝÿ·½ii%ªZ K×]-*J’ÒÒIi=Ò¬%«t—tµŸ¿¥ÿ÷ýÿ¥×õú»i^«ûý«Þÿûד¯ÿm-ë÷äuû×óïKJ´+KK t�Ãl%„°”pÛKŠu´‘¾„–Û_ÓûœÚý¾öÿÓµ÷_[ÿ»Þ­ÒÛ»öÒ¶ÿwõ¶–«{ÒÓËÉúií«i-UqQÒ×Rp©ÐU +á6’×i1V­… A½~§?ìÑ~ßû õk¶ëïSóg°·¥`Ÿm§eöÒaœ›§a›•SÛI[“Óƒa§jƒm$ÓM4Û  �i±I¦�¦Øa„�*Ø]TUBa0ž©´LSaÕE4L6¡ÕŠoûI{¤ÓÕ°I6ÌVØ'§°í›"ûISa°îØ«»JG &›!LSi)°‚¦)š¦ÚH6)SM„ÒlBV)l&…ÏÐÅ\ñ…*ò­£CE\žv!�Âi„,(A„Ћ Š4…GbÈC"Õ‘q†Ò°ƒm-4ÐaŠMˆ["ºM4îS°©´ÚWtÐ\0‚¬0I§´Ã +š ‘0˜¡=É|ŸG¶©XÁ‚EqVWv#=°ÂÎ8B")a‚;$ɹ¬#ØI±A=‘Ñ¢³*Ù>H«° ƒQY•tV9éÄ¡¢`q"3`"¨Œ†Ñdœij" ˆa2ÜDGÄG¥¥ˆêÿÕiizíU$«¤—¥DÙn¡¥×°Á6•&ÂCaŠc‹‚b(`“�þSdÔ¶U3±}HϪòÓ×JŽÁ"QŒï"2¤¥”"-ÉÈ6ˆÑ¤‘'�ô¤& Èq¤AÒJdK�–ÇkXL(GޱÃI%!÷‚£[FÆ +Ú>4¤”(PRÒô6’A¾ +�m&PÃIµm$«ét’]s½+IåE´´­*‡ÿT’±ÅÕ¾Çluz_ífD«úJ’_­_o«T¹)Eay éëé*Wêõ{t®‘‰#Uõÿ&à I#3 Ò1yÕ2žþÿÌä»IR^šþIÊ„Kc©‘™¤j"ž +C&e;:�*3fj©¢dZÉÌ«'ă#AXKB!È’&Eâ\hA$¤ÆF°ÒT‘O „Éà™ëÿ}½*ÒÒùJCy³:Œ¤Ï(GAá–s’!“£cÌ žeœöF"ì#@f˜@ #Xf˜@ä'žØ#8fp Â/!Ba¤ž±”XPšaa0��j‚ ‡¤–�›0‚a¥ªÚ Ù!…ÿ¿½/K¯Ÿ0‹³ù ǶˆN„F¶‹²XOÉÌÐò{‘òFÆ'¦“i„ÐM¤L*<4›DWrgN‚tE†‚І‚a¡É�0Â#¶­¤ØAœ4›I·i&õ­Þéuº Ñ(¯ßÿI¯Zþ�MÉŽ’ËA4h îé7«,é ´çŸ=Ó<Òm+Lñ‹i6‰ý÷W@�'D¾º#é6‰FBÒéÒt¯koû¥uõnÛ´þÿî!ô´¿ +hUø'VÒ÷KÕÞ¾›Ý.›I¤¯ô¾õ·¿vÕ8A…®íSMûZÒíª^io«kª»¶Ð¿ÞߨO×Kéwâôëkÿÿê›û¥¾¢¥Â4î¤p®ÿ[N»O�M¸¿×½ }mèÖÒþ´¿÷ÿ~×ÑýúZ_I28NÿC¯ëßn�ÿëô£úøcý{h±ÈÑþ¿ÖXä¤7Uôm/Õ´¾¯ÿØeÖßâß×_J>ÿ–9ñ÷õ–9ÿ�¾‹üa¯¯øúßÿúBÝO_ýzìZA‘Çßή¿IŸþ=ûu�úý¥ü?ÿÿßýõßÔŽßÔŽäQÞÿàÂÁ„—»üAÄ_aþ—¾¿ëÿ¯¯ÿøa¯ÿÿÿà¿í×üñèôßþ4?÷î�ÛûÿÁºÿÁÿÿÿ‡!7ÿÿÿü#Gÿ_ÜèÿÈÛûÿõKßÈ£5½ø7ýÿ„{þëÿ¥ýÿßá´Ÿÿÿëý/ûýþ¿õÿKëëó;ðßÿk¥ÿÿøA~÷ÿøuÿÿýÒþö+ÿö×tŸ¯úK÷_íÞ÷÷×ý‡ÿÿûþéWíÿëþÝ7]×÷¯ú¥®Ýÿ»¯KÿÿÒþÛþÿ4Z¯¿«ÿ_ÿíîëÿ¶½¯×úItf’ÿ3ûmäéÿßývÿÕ}¿öÿ¿ý¾êÉ×¶¿úûmš.ë>ÒϽ^�ÛÕé_¦‚Jôé´•S÷ß_¶N¯µ¿ý³?þïÛlÏþÏÿõ„þý&IwJÿ‘GVÏL0Zt¾¯[m-;M;I5ÓIii6�L þÛfkµ9Y…í‚MÝÞÇ­—ªÂ_¦È£‡« ÜÕSb“VE†”ƒM6;IІm˜NÖÜ6)ˆNa ƒÒÝ4ج&áqI§ &H-j¤]¹ó[¶sd[i\v›ÈAìq §áŠM>àšMÅ1IÚa„�ÐdcÚtÔ2+ò8Ã&›�„á´ÐMCB‚•v�ZL®m‘´BŠHÈxË€„DPA))YÊCp¶Ä(Q[A=„[%vš†� …A‚G¶� Eây t{dð0Ž­Å …=±â#+2”ÔÜòl¤ÒhD\hB –Ò™-"tQN""9Ø&ÆpŒR°ð’IAŒDD_]‚Û±AÿX¤Þ) -z è/ø·�,%a”Më +⫸ÄþZCqØ\Q̉s±Ù8Ède¤ì[ +  +¡BÒ×Ýîþï_Ýß2XùÞÎÔ—��¯ëý}Wõþžd?�Ù”êDh”êF²Rr!¢(�eó™Ì½äld�¢#e>T‘�9 Í� ŒYB3Š™ó!Šˆ†&z8�0) BˆŽˆìžaà�“æ "í“5†H˘F°Ñ 3Xa!83Î")Š=xGư;åÅÖ¦2C0ð�“á0L#8dø óæ�l�a0š6±l�’44k !m&ô›UI½&Öéô›IÕéÙ.M/¤é7&Ù“i„ÐMÚ3´- ´>’pˆ°ÑXÒm91²ù´ÒNN“¤Þ‚mG4¶Z Èæ®ËBa¤é;Ó½õt­¬¿i6™æ“âÚ'á¶®þµ ‡ibÕ6úV®“¥zÚN¯¤ôÒŽ“®»ïïö+ýµêÖ÷ý- Ö–5N©û}%ÓKªê®5ý´?ÝuémÓïÇ}ì&ïCî×]‚·~?}kQ¡��ªõøzZã·Þ¿ÃD9þÐëZqßX¢ÿn‡¥E¹ô¢ÆGé·a¾ßúOuêÁËOï-?¯ý}(ËOÛ×ZÇõ×áëÖ¿ªÿõõÿþÕ‡ÿûtºÿ¯øoÿÛ¦ÑÝ×á¿ÿÿþ¼[ÿê ûø#ÛÿÍ?_×ðß÷ÿÿÉçå�ÿÿè#ß¿ð‚ðoûÕÛI´¿ðßÿÿÿA?M‡ÿýµKû_KÛðûþ—~Ú_‡¿_÷¯émÿQIvÿz_Öý¥é{ûÿVýÿõý·ÿõiw·ßUW\¡{÷êÝ?å'·úþÿõ_l÷þß×­·}ÿÝw÷MëÓÿ·M™¯jß·ÿëï×í™÷¯{m¶g홯VÝ~­´›» ¾×úV¶_,‚Y"o¦G½6ûÿ[Nîî¿°–œ'‘G †rläà l0©È®‹íšiH¿IŽ‚¦´í;PÅ1FJòŸ)ÙS;aB3ÎÉÇ3B*ÂþwLÞxC´°M¤Ã +žf$íS»ÕnÒL&˜b™F¨' SÄ$Óa; ´“ SAƒI‘Âi¯iS¶!0š;) ñ… +Bƒ’oÒâ°á¤ÒJ‘~öLBM6)4í5wA§lRöÂaJ²UÜ4@¬(á#Û„4„kÃB„"#–ã:&9NO.ÿé4ÂaAiPh žd´@ÁJÆP�…(L¬ˆŒ®b Áɰ·P†�úÝþž«ZIå•Z­-ÝÑö¥*«Vü$?¤õRÜS­þ´úm-/Ò–8ÿ¯½h+‡©0éuš¿:5*ƒ Q¨”¡�ómNƒ:¢ƒPŠœ—k¤@‘Ã`� R@ÈbP É‚|Ý--Ñ(íÁ0ÛµÕa4Þ‚‚ÒÒi+I&Ò®ÂW§ÒïQWW_oí'ݤŸöÒ�iýÝ×ÿ×wx¥×·¨)0#õ×^Þ†¾â¶ílU¿¾×ÂýHázm¯ý{ù).ë�¿ÿUÿWõÿ�ò�éb½ê-ì5¯ýZý[ýå»ÿÿ_E‰ÿÿûôü?×ýzÿÿÿõý½ÿ8.µÿ|0××zÿÿÿoÿücÛKÿú®Ãÿü6U²;óMÿÿÿÿoÿýÝ/ÿëXAþ÷«×÷ÿÿíÿÿ¥± +ß_ƺ_÷áÐ_ ½{û·¯þÿÿÂèÚoÿÖ—×Öëúÿïý¯þßÿý*M¹×n¿®¾»kœõ[Õz¶ïþ¿öÿÿ×]µ×ÿÿ]×þßö–Ù¢oö×ü�mÿ™ÿúrìÏon¿ÑŸzÚíŸI}a<¾Úvž–mZM§î—úkj�®œŠàØl0­¤ÚI÷TùÃÐI°ÁRí(6)ŽÃÒcd=M´ ÓAðàÓM4ôÐiÛL&Ø„a ÚI¦œµ: ÒMŠI6 $ÓLŽ.Ö” Âdp“M‡¦¶¸N?¶Ñnç�Âyý†1ÅO{r£-‚•ù£½ZF»U*ÉÑ ‘\V +ˆÑs`‹t™Ùn›…†å–p"N RjŒ€ØˆŽ#A'è6DA×®O¤?Ô²%*Ỉ?"~•òº¢+Šø¤?úV•uUõÅ‘*ªtLD¨Î¦u"Re;\ƒDhdè¤FôC è"AÐpʲæFnÃde‘V§S%ãHê2Ÿ*Æ{:Çódu TE9…È�•„ŽLs Á73cÐ"à0‹†a3ĸ Ó4B|àÁB5‡'ä§4@�'Ù/š£X`˜Ì–f ó>AÍ„$ÍfAàA„ldøL#`r&% „l ¦¡©ùa4 ô›L&‚th&<6‚ ¦Œí…µIÝÐÙt»'K„0‚a� ݺNé0ÑB44˜iªM†¡E†“i;- Ù3Òa„E¶“i$ÃLóVÒl$îéZ‹p[ÒM»¢NŸv·“Šô­Ý^Zh&iZ‡JÞ¡Ò´­ÒÚ +“pŸzoë½ßþþƒ_ÿ�Òk|]'¯ý¯m&›õk_»]é[÷¿¡»ût“~ãÿî‡Qûûwu#…qR8WKu#…¡áMïz·ö•~¿úÿÿÿ˾õÿŠ®FC§ø%Ç݇ÿ×WùiÿÞ¿ÿÿ¤5ø}7ú,e!aí¤?þþÃëöÿÿ½oÿÿÿöýÿÖÿÛÿØkÿÿëÿÿÿÿaÿÿíÿáÿþÃoü7ÿÿí×ÿÿýÿ ÿÿÿþ_ÿƒÿáÿÿÿKÿÿÿþÿï´þïKý|6÷ømÿïþ¿ÿþÿÃ}ÿþ�¯×ÿ÷³ªýÞïÿýÛÿÿþ÷ïõûî•êÝé~Ý{¾éyäûþßÿ×ÿÿ÷óËݾöúÛõ÷_9Ók­7}ÿûºßí­¶»f‹z­w_·¶h’}[»TïºýNM«ik«gæý[3_}Í¥k¯}Þà +YFˆìÖ;:%Ñ]N¶ßum¥ßg«´–í&Ïmž³„w1«¥§u¶¯KwL0“`Š{!li§"óí´™;Mȯd~A±·IœgiÒ;°¥m‹©Ë!ŸeȺ’�u†n²=zÈ¿I5L1J Û´b˜¦)ؤm$Óa¥† ØA&¬4˜„ǰ¨0•6o¶‚`ªÓaT'k À© l6“Y$$kaF·‡  »†)ŠØ„ 4–ÓaCaa8 Á0P𦫆޼÷dtAˆ&!JÇ=•„u°Âa" 80B"Š6ˆeóÔCªA´˜i6á—;ïÃB AˆDÂ(B"#1¶‘W~ô°�¯t›»®Ô›ƒºël¯E•¿…«i_ûßšcý"n¯×ñëVÒµÇ]~´¾ª¿¿ïDþœ§ëô…2¤ü Ž¤q!šÙó: Öi�Ç‘òq‘�D'M‘ Mouµi0�ŒÓ0˜FÆiÑ æ†„4k ¢AøM?÷è$kÞ¶��¦˜OuÃ'äçÏÕ]Sdü~P˜I‘ÕÐ(h&+m8´›CF†“ SdÎy4ÃCe •´˜ÿŠOçð…›3c8îëwÙgÐh:D[nì³Ðg &´’p“»„‚#•¢~iiž6–�[Dáp�/¿×Æ´¤â­ÓMî¾ÿÓ”È&{¿O_]ÖÿMwÿ{øé>ÓÓjžýõ¨Ç�6Ó_ÿÄZo÷§WÐHkû´(nî†Ó÷­¸þ‡ÞÿÞëûýïß÷ã_÷uëÿ‡×ÿ-ÈÕßoørûÓî¿ÿÿÿùq—Rÿå§ú-?áêßþ;ffÕ{}êÿÿíÿÿ[ÿÿÿ°ÿÿ­‹I‘c{¿ÿÝ/ÿ6/ÿýµÿÿÿ÷öÿÿða`Öøoÿ_ÿÿÿÿÖßÿÿÿá¿ÿïRöñÿþ+ÿëÿþÚ_ÿÿÿø7ÿÿ¥ø?ÿûÿ¾>¿ý‘„·ÿýÿ¾Ýý$ôþÝÿÿÿÿœÅîÿÿÿ÷õÿ½R÷ýÚÿþ¿þïýÿoóMÿÿôªÔ‘þÿÿÿþ¿ývÛ¾ÿ¿ÿ¾¶ëý²u¤“×ûuÿ[kÿVÖÿd?lÏoÿlÏõaŸ×íwK¿l%¤“iZGŸÚ]­¿wÙ{ÚWy�4í»m† 7±i¦Ã´í† Zr%ºM´“‘y«¤“i]v›i&©¦(6X¤å¨)Z �Š´Âv¶)ŽEŠi±I¦˜b“M…› +aÓaáA&)† NÃ`Šwv›ðØ\´3±ã,‚Å2Vš ;ùæç¶O2q (R­š@Á"±“©VÃ`�Ñ ç¶Fa0ƒ399Ÿ¦°0�Ð��„W3ð"ì�¡0�Ž~èØÔ*i6“7|#ÛAZ ÒnÆW9‘,g„ÂhÐÑvGç�0‹²4íºM¤þ�y!éDnÑí»¤òeè« ÚN“jê“¢;i6vZa¢X óJ ¶`e�ºM«¤Ù�š¨DX¢²“¤ÐTçNƒ8ié0ÒÜ:VÐ&º»âÚéij+P�N––û¥ZN·þ¾+�`˜v½RÕ«P›§WßÒkÇi·ì|:§ºÞêíjžúVÓ¾ª¿Oq§­]÷KwÆ­/Ô{kÿû�xïïx×ÕßÐãÿ[Jîý}»_Õºëú]ïü?tXäeÖˆzþú,r:/ïùc”9Ð[”æ?ùu‡-²þ?ÿûôßÿÁÿðÿÅyu‡ÿâ¿_éâ?ûÿýÿ¯_ûÿa×ÿ°ý/ÿÿÿûØkÿW_ÛKÿÿöÿöýÿÃn¿ÿÿÿë ÿðFuû×ÿÿá¿ü¿ÿ¶—ÿÿ÷ÿáÿøAm¥ý¥÷ÿƒøoÿðÞÅýÿÿþú[û«ßÿ÷ÿÃ×÷Ø~x îÿÿ{þíïþ—:Ìû¯ûßÿ[|$?¿½¿š—ÿ× ~ëÖÿóMÿóŸôÝí�?_nþ×öÛ¿ÛZoÿëÿk·OêÝõý¯W®hŸ³4õ²�³=µ·¯ìþÙŸÚíŸý³ùf�¯þ¬‚Sò#[«vݶh¶×þÛ_I†¬4Û[I`þÒnói/m„˜a+/¹{VJÒa„ŠãQ‘k2š8GiX@ʱ”_ø†Ã»ÛÒÛI†§ll3EÇI¦¬v“"ÔÐLSb­m´Â 1LlSi&šlSÅ1 lS Å)œv)Ô”û&"µ¢ íT� Žòœ +veUBiÉ^Âi¦Ã°�A¶‚`êGÅ5i&¶É]†“ +T2:H0™+L&!í;aJa1¤Ñí£h`˜MDø0˜0`¼: ívO›J“Lœúáý¦§›•txr­£ÓDr•Œ14!„ Á1dDD0ÄCp„DC:ƒ¢Y@ÞÚ¿Oíú�ѹ\“E÷ɽ'ö°áºúK­j–¯¥åe}õÝCãW_ÒÕµÕWUê½uÝiþwZª¬�äFuˆ«Îâ"^ªHf­HžU¢%í-.Ò,… ù�C’â¢%† +vŽòq LƒˆÍ‘ T‡£ÑÆh aP(!FŒÍž2xŽˆùˆ d˜¦�kî LD%—eÐÄ_(4 ÐÊ(}&ÒÛ A, Âa6M4hj�oþ|hÝ3‘¬3ú„Ѱ1ÕUF¶­£[FÈU ¨±H«£`l’Iš �l$Û'õH[PŽíRnÁ‚L�Ò†Dd"½ÚL4œ*[&„Þ°“ ,*A¢;i6´ª“¤éZ t)0•´›ª¥¥ÒZM¢� ´S¤¸b1ƒ&áè ´­-Rv’mmutŸKXM¥t’)èãÒm*K h*ãÑÝ%¥«I7J––�kE=ô­t´´†#+¥þ“ºúW¿é¯¤ïºúItÒÚŠ]j£¥¥_Šë.�ë„…qÖ’T¢!ÚÐ×á~ý¥¡Öê.ב¨$0Å.–’I.©kK´¾Xå�T•R¤­ +Q¥û׸úßü±È¿ÿù +¨!$–©*éR�Šý¥Ò‹úU×ÖµýZõÿzÒÒý”X…õ¥IkÕk~µT’K¤— +µÿ¯ý}¯ÿÿÿª„„J–¯·¯ë„—ê©ÿÂ(ûÿÿþ–’øKZúN—ãà‚KõªÒÿþø¯ÿÿÒô¬qKª§I¿¤’Qôªµÿ÷~_]ÿßÿ ®¶‚o×ë¯ÒÒÿïéï¿ÿúú_èã­- +ú_^¾—F×ÿÿ_zþïÛýºIëúK0«£kê’$,NóE˜Uþ•ÿíߪö»]¿ßÿêÙšó5 •T¿J²ú®ªsý­*é$ª©Yÿûf‰¿ÖÞ¿sDß·ûfhþµ¥¤ÙîÂVJ)t®×AzéZN”6—)Òö¶“iÝ„aÁæ6Ò^ØaaÞÙÉ;ØaSÕ´`•‚M…ŠŠ®* ¸M¥ªQLSa*WAWLU5L2ƒMˆTÅ6’ Sbƒ"ºL1I¦›ØAÓ¤Å1 ˆP¡BªAÃH6•:aD*Ý„ÂéÛLŽÓÓi† ¦=°ÂFŠzH6¡4œF“aá Í’M¤ì³«“¥&Ðg ^•½Bm+KÒÚÒº|~Ú[úOþût÷R8WI¦ÐÔzýwï!C¼±ÉS�½7ðè²ëÒ¿ÿØ}ÿõõý‡ÛÿÁÿ†ÿÿ„ ÿðûE;û½/Ûü7Öÿ}ëÞÚMôÝëû¯¿I½wþû¯9Õ³E½Ófj¯ºý©ÈµÇ‰B!"O¶+Òa…läÙzEpì¾›i&›ÖYªHôv¡L Û8e/!¢³d$#Ä:nÄ$Ðvbƒ¡lRm “N[I´õ$«…�³1°ì OˆA„M4a Ä${r² � ]ª ‚¿Iµl+q™¨[ý,‹4·È6®•š0ÃôÓé%I&?V­ï¼wÒZý[¯¿øK×ÿWÛêhŒÑFD#q¡�Q>fÉÄ$�™ Žhˆ„™Ó6DŒÃýûÛôhC# ¦#ô‚4N)QÞ¡5LåýÿTÂ;ѱ œ*„w ˜_I8GÆ ½Wa!¡¯ÿï5E:EE, µ„Šz8ô´©éRµë® ´J+ÿýѳIiiiiiRZZ÷¤¾:«´ÛBÿ{ÄqÖ’Ö«IR¤ºþ’ík½ÿßýú¥Õ$«Ž=Rþº_Ó½»ûtßõ¤�j—ô˜¯é¤—u­ïþڰ˯õuÒZ¯ë­aÚñÿû#‹_ú¥ßêŸÑÞªWÿÿ†¨þ«®®’Zº]iD&ëG›ÿñQ¯Õ.•iiV–½K_ÿ¥ÿÒXE´«íÅCÛí+ÿõK^—Òè F"ª‚{×ú_éW×J�¥J±ËõFÏ™¨ÈìÌgQ©P2}Ÿ5ƒ4g#A“�Ì´$3Ç磌ÐP@Í&DY‘œÃ˜2ìµ=`�©XK ŒõïJÂ3ýBZZÁ*––“¥êÕ¤—K¤ºJó¼%I4‚m$h§£½;zpŸ  �BMª—®¸Û­%ÿõ »Õ/ª_¯ê½QÇÄ*Tª½ÿÖ«ën–¿ú#•YÓÒÒúªvÿU_KÝúúõè�Ùº½.wKK¥FÔÀõ®‘´¦ó{ÿZºZúÖ•RZL-ëëHÚ¥÷t´ª�ªIü�f‰ß­%Í|�»½#Tª–¥–ª—„qÙ>–ºI¿¶HJ•t–‘?~–¦JŒv7«¤¾–•Yžbs˜]z_¤ÚZ›óê—ÚÒíiúé×Ai*8ít´—J’uô©oº×3éuëß^´x„´­Ïí®––’Òé_u¤ÚI*KZZM¥}úYû§Kú[nº]iii:QHpëP•¥Åi^é›ZÒI´ºM¥ÒÅZHT;Iºt’áéSiZWÃt¸z¶“a+ ZWM ªÕ[ VÛ /ñN‚� E6“P¤.ž)ÂUQMÓim¤©$‚Ò«UoU銨lSa[AUVâ�&ÐTÚUAN‚�Š´�è/:ŠªlVÝT&Ò… +!UH`ú¦!-BmÃK ªI6’„Â`Ò ÕBj „¦Â ªB©„Å1TÄ*©_ Â 1 Š ¢íˆ` ƒ °©Šé +¡4M5¶ +©¦(1 ¦ ‘\ ‚TuB1a¸àÄ0A‚°£kB#½„Á4- ˜L&ƒL*LE£\!•¨"0Ë9)�8ˆ¤Ç–å‘ÚÁ—Ë5LB@©$ëQH62–»ëH´–d·¤ªCÒõK»®±ï ´‚Þ!†�E礥XaÐÃPÄ(ÿä¤d¦"N[fD¨à§bÈñ¼©gÆwFbB�ƒYlDñâ ƒ k о "æëé²sr~Ý$†ŽÂ‘„t½¥öžð‚W P`Èi' ?ú§Õé-ð‚tÒÒµ[kZ¥øA>�ãèEÿ&õK­7ý%’ñ¹AHèT)ÒæÌê,µQæ‘gS/ÇÆiù ËÁ”$æ¤P3¨ªp’°@‹²}Â5†�a„kk�å¢\�œCEÖC8·dΤ¦šjH*ªkáè�ôkÒA‡ Øè/i6 ƒÒa„�&_Jï/˜@›•県�eP©(UG�ª��ÕÑÇÚá'!\$„z<5†“¢]Òot¯Gë¿·ÜÉT¨S ß‘Ç ´´qè§¥¥¢žǤýh*¤µA$ÚÚ¤ôÃ^¯ÛQKZÇ÷¦Òë¿»½% ©---.´©}ªºô•Rã].°ëßKÔŽ•¾¿u#…ÍÅÿëûZÇZIF’Ö’ZŠÝU}*–8iuzJÝmz·ÿÿ­÷’¢¹bó»Îãñ­--E +T´’­*¥\ùöº Ãcÿì=?þê4¿;TýSõ^•8¤ºÕ!­.©U-]-/K ¯ÿ /¾ÿêøë꾫’zô—P©.¿U^’«ÿ –Ý¿Cr_ÿ�ùHˆ¢#ça 9&t"¤23Í™‰ÆP) Ñ “fCB6YÄn>4BPŠVBdÀÁHþ—Tªºý.•Rû¤¿ ¶Áþîïÿÿ˜"¤´gðˆN˜‘d|‡˜0@•†ECAÂ>‚5‡„‰3X0�Œà ª™D0��GÇᡦžÐF·„lÓÜýuê’¥Ö«UÕ~©Q^áÿø7º?ñoþþƒFÀÂ46OÉ÷T°ÕT]’Àœ&“á˜ô›I·„3†“ 'IäÎÃIÂ"ÛØH'e¡ÙgŸ4­*¥ÒýkKJŸJ«þ¥Žò…¥ÿ«ßïÿþÃI´�Ý–†}„˜h29«¸v×m´)Ò°õ ´Iéjê/N— +ôŽ•û¥zô–«Aÿ¥UqׄSÿKÒ~Ý/ÿ}´›³ªsRÿ Ò´¯wïtšÇý1ýmm´šA„·�õ¯O¥~ßúÖa%õT©ÒZUZY…ZJakú]›OÖ¿·G·�½¶¿ÕýÿÿÝ+hwn¾Ÿ§�ÒíÆ;ýëJõýÔŽ1ÒéQ´¦˜Z 0½t´•TÇ¥J•:]owªÿë}¶´ÛjÚëjßô4ý{o~¯­¢ ôA&?ÇßACéÿçsÈ +’¥Z®©*é*Uu¥¥Ö–Ò×IÒJ÷º×öë¦Î³j¹ù´›Ûô¬ÿþXäj_ý~ »­ƒÿå—¾]a°ÿÿV·úB1QKXJiCZIBZPâµB•&ÐV–ï¶²+†ŸºV“få ¤·†¶“i+úCÿõðýx×¾þÃaþâØÿÕRÄ.©Š¯ÐQPª!B³b¶“im¤Ü4NšjiCIŠm´“O  ƒ]¤qGv‚a×ÿü6ßá¿÷Ûÿ °ÿ øoÿú…ÕBáBªÐ„¨M4A11 + °ÅB©âŒ;Ã�І!J²ƒ´„ˆ a !ÿÿÿ áÚXoÿÿðØ?áÿ-Øoÿì0šˆˆåK+�Çcpˆ¹e ÿÂ4ÿÃm¥øoû]?ðØoô¿ì?ÿâ"�·_ûKÿïÃûiaÿûGw×aßõÿmöëþ›J¿éÿí±Qïÿé>¾ïú_îfŸ×öè6v]ëýÒÿ÷¯¦³‹ýºoo­³§˜_úþßï_é0ô_ï]µÊ:¿íÒÒ½«ÿ[ý»û_Û3Òxinöû÷¯®¾¿µlÍ$ß[ úmt¿°º÷¤ÙtÚV^Õ†‘n7P´?Û=àŒ8wyŽöÒNú~ÒÓ‘9¤Æ�ØJØí+I‘n› Á-§wQa´“†ÅXHh<&ÅD'`ö(&›i&ÚOI¶•¦Â  ƒ(OH&Q ŠaCNšL'Û"–XP‡N°šiª…£Û B»a’Þ¡†*U•…\ B4\ÄZ„#³£¿Ë'òl–„C™%2€ÜGÿút圩GËél +Et™¸ïHëÔC §AOòØ9yÅ24;ÃF¶�a£]‡¸Xià H6‚m&ÿM¾©6­¥a»«GkK¿;çÚO»{Æðoõ~Ò¶î«�Œÿê×ݸEçRDެ��S Íq›:j3PöòqO¢FP)¨Ïž`Ž£5ßí­òÍÄvj÷¬�6 Ï.añO=‡!<»f˜A„F€y¤˜F‡·„ll�‰ñ±šI„í±šA?öå¹dv­šgi ™@™Ù(ÊÂÝtÐAµM&ѱµI= ›M4gh ú¦�ooI¶šI°ƒ6ÑíÙ²I´?þ¾WžDùÈþ§v!±é:Šf*¨F°ç‰ØP…Év–'ŒzL4�ÚWe�Zg µôϰ•÷¤ßI\& ¥h“®ÿ^ì��HÃãöŸti;Íôÿ¯M+ãÒ�Ý;ã¿Moöúß¾ê�¿¿Þõ …èÞ_}¦é:‹†ßé CWn¾¤p®×}:C·«}Fí}Æã·¿÷2Uà®ý4õ¾ÿÿ”&›K}ÕïáèÞúíõ¶©º,r3ý[ÿÐa?¨ÿ�þ®«·¿éupÛI‡ËOøoþÞ­ü´ÿïom/áá[ixãÿã¯}×úì?‡ÿ°ÿûý´¿÷_dX²8ÿ}ý/ÿ%¹ʼ•Ý�gÙ ˆÑnP2A�„D5uÿötßþÃ_÷ÿÿÿði&ý´­´²Mš‰JшÅ�jfhÙ"6D�'¡fq(yÌØÍç"ø"!ʲüG�]šfÆH¡-‚4ˆH"a øG€‹³H¹„k°‹¶ìžpŒä|þÒ ÿá·ÿoþ¿ÿñÅ'ý×DùžƒÙÖ†á4í4Ó'Ô&­þ�l*iò;�m H[KM4‡´ƒ#ÄÂI¸´›ÝÚNÅ",>¿üÔÿÃÿïûkÿÿ¥ßÝ[uTE†“¤Ãdù5¤ØA莶¢;i„� ´ %…I´›Aœ4�†“lº  éazMö•«Jµû_{{·Aûü7ÿ±õuÿÓþ—]ºü*ii6ïZWN‚a>‚uÿôJ*ïÒ\�¥Òá:[ &ýô’é¥ÿ¼zÿþžßÿïiµnÿÖý*~¬été:Mî—ø´þÓׯ–â—n¾ãiÖú»¿ÛýÆ.ô;uÚ}ý½ÔâvÍ?oóÉÿÿ­ÿöý%µ][îúþßêG +×Nï×õ´»õ^‚#‡KúÛ_ÛÒKÖÿÿÿº^¿ÿZý½Ý^ÿëô�O]ÞÒ}ëVûKägÿøü²#õö£ø�ºáºoûþY�.°ÿW·º¶—u¶gÿjŸ¶f�GÝ»uMŸ¿´˜g¯I&Ò£õ»ÿþ¶ÿHÿÿ_ÛÿKÿ ¯íõé~ÃÛ¯·öÉ6ÒºkI‘x0’§m¥¦›«¶–Ä%O°““M$›¥½½ÿ¯ý×ÿÿþºý¤¾ü?þÚ¯õ†ý{ ˆM¤ÛAZ a‚(uLB´ÓŠ „Ó m ö) Òi åCA‚ lCª¯h¡éþÚ8õÿÿÊ/ðFí¢Ÿ‚0ÿgÿ¿û`Žú$Oßíí×ʃ.40Á#C BdzÃA„ #ª'ÉðaJæN„!qÂ;&b2«H!Å!„wn¯ÿÿÓÿþ_éêÝÚ ÿÿmP_ëƒí„–ê2¹®"!B•/¦Òÿÿ].ÿÿKü ¾ÿÕú_ß·þ—¥ïÕ·Ä/ªA ’ÓqÅ}íÓÿÿú_é{틾ëÿ�×±±K÷®ú2~º ’«m¿Ô8­ÿÿ_ý{áÒý¥ûþëõKÿM�7תHh ©{ÿ{jõßß÷ÿ¯¾ÿíÿÚÝ]vÿíéz_ê£T›j¿ozßlÑÿÿëÝÓë¶gÚû}¤ëôúíŸð“ ÿuÈcö +�Ö÷_m6ÒkV[õ¿ˆww"¸vØ&õ"¸}‚R+‡«`�í¤²!‘\;a„“A1Mª¶šÐûk½66ÒÚ¶!&ši¦šr8¦M§ †EuO A†!BÓA±M ›A Ú§aa6(!0¬%m„Ó¨M>“A¦Èá6‚iÓ ^¾šl&‚-ò¹„*Âç‹P„Zia4Ò=²x2jÉj!JÆB,!Ÿ0D˜Á„ BsÆSd!’Ò•µ¤v´ŽÁQdñˆˆŠ½]+h+!Û% ÁGÿòÕ=&ÃDv&‘ÝÁesQª’¬®S*•‡ÁpÑâ©úï0Òýþ‚uv½Úá'ÎÓ¬®/�™Wô‡]}~«•á/��%ÎE;¤AL–æ¢ÈcO8gA�,”Šo$ÑÃ!æÌ2¬¼!IÉÄ9G‘xð™@„ŒÙ²G‘ �ƒ$3JLÃk Ì�™¦æ°Ñ çÀÊ3ˆN‚a>i‚ 쟓› ¨A„l 4òQ™É£uR6=MO(L(²1nA7Õ4˜o„-'“›MYh£[I°¨a Ûº"Àaa¤ØCe•ÑÚNM´ÂI½Úž ¡pÒi–v}¤Ý ƒ#šM»¢^÷qIµ÷¥j‰Âëx&àƒi7% X+Kíô¯VðßN•~¿¦¶÷vÔ~ö½µMñÅý÷Û¡ß}Õ}W]ÝÚ}úx¾Ð¥ûOêÛ�\{ß»ok¾íkÆÚQôÝ^ÿ¯(F{«Ü>¿ôXähðÿ}ëÿëE¹C–މŽI÷ÿå¶@¸¯ÿv½�Ãÿõoÿ_ê‡ßÿëÿ†¿ÿ‡íÿþÃÿßÿÿÛ_ÿ_uÿ2X3"‚+ù•År¸�µÿøoÿÿÃOÿÿÿ×ÿÿuþv´( ȸÍ0¤À„1•\î°Á"+èD·; ‚Ýÿÿ ÿÿø7ÿÿÿþÚÿûûh/ð�l"yhÑ¥dùí*~ÿÿÃ_ÿ¿ëÿÿÿÕÿÿ²0OéÂÒ¤.‚öÔ˜¾ˆ”×ÿÿëÿû~­×ÿ}°ÿ_ýOö•„þ½oë¯ÿéöÿû÷ú¯×ÿÛÛ®¿KïÛK¦’^¼V”imûi~§õþß’¾¿^ž¿ûÛý×_ÓýµÂCЇHW¥Ö·ïM¯Wî¿ù:ÿµºÒµÿÛVÌö›3]Õ¤«²SöÌÕ6’àŠz8úÉ4§gÎÆ½N™#tÍmm¯kÝ¥ÖÝ]˜^à }ÕÞ–“iv^»ÛM°–à +®–—i¶È¹V$ºEYÂF‘›(,ée(gâxÍž"‚óìˆN'2æn5èE*!&_’)èŽdS… êŒ3ìèDx å@aXn“t˜ô­%mœi«NÒc´­ Ú Ä%M66*˜¤a¥h$ÓNé›ô»hÑM0š.ÅMl"C׬#cO +ª°�¥T#[×L(F¶� *Š‚Ò°� #Û à +Ú„ke¼(a„PÉXI† +GI‘JClŽi´�† +í‘H%x¨¨í¤Ñá£Ûd¬ Áab¨Žf¸Î•nz0ÂG·+0½$aáU‚h ›>©›ã­U+ +«KeÌãª]&ÒO¤á«¤û¤ÚNŠ|RÒá‘Pkaˆ@ÐуD-!*â2Ä´²¤P„DA• Êã½R´´wHãÒê·IiiZ^Šz;ÐZO¤î’kKTqè§¥øK¨¤éR^êÒM¥Ih*ÒÂKB¿Ò¶•$¨*]t¯úë­Ò¤•U/ %¨õéPJ—LR¥T´ºÓRÔRÒéU*ÿ×z¥¤µŽªÒÖµÖÆ±Z¤¿P�­PÕ%â’é(ЪJ¿kÐÒª×_ÿIþµÆ¢—ÿ]%I×ÇJ«ˆ*UUêëÈýUWwZªUªJ¿û¦ú]$•ú]SÕÔRë,E/Õ$›T¢•Uvõ×¥¤©*ÿ¶“#¿é}V¾¾ºJ’J‚ú_ªJ°“ih--ÛúIUp–»ôÙºZKªZô’ë¥ÿý:ÒZªø ›×­$aí¶’ýW’XPƒ4`‡þ«]×ë�kÒK[KÒÿDZšUªZ�¶ß¥Jµ#GÕy]žØ¥úõU¥ëP«I*ÒÝ.ºH"‡IK/Â¥ákvÿ]ÖmE¥®)YÑi`Ž=ub–¿ú×IÍW]n‘OëIvßKèN¿^®¿ÕfTmrßõéRK©„�Ö_ó–c­Õ:0©L-y}-÷î�¥K/ѵzY~—ºXK/ÒúÛ¥IkÒÖa%K}vf©$’¤•³4nô«K —K9eçÒs4¡-%ô³þ•U&ÒÒÒZT©R½%ê�,%@�%éCUIÒÂXK xK« -xK ußWéXJ*ÂQHv•¥¥Hûm](¨zK ºÖ–Òt¢ê)‡Å6*) +¦ÂWLT4¢¢¬Um&ÒmØ%Q„ØIŠLh-µmUuPÛ*Aé¶”T%…  +!B… X¦P¡p˜Ti·Q Òb¡0ª˜¨]' Spšª¨PØ…¦(6!0U +‚ "à6˜TÕ 1MPÕT¨hüØ0Ða0©ªh0šaBB Â;¤p…L�Lj–¢Ì Â"�oI±„’n’uß½}ò÷î­&êZ3‘7m ­&Ò•Ì‘”Æje;;Q� +™Ø`ÕˆL29S;Z�0�f öm—~¸25ÉÆ ¨üÒm&ù¸¿¾v0dŒ†ÄfKb’r@WïA6­«t–ûGo£Û¶´ºõöÿIZÒT±¯×¯ëþ ¥ŽEQܯoüw¯aÿë^ºKô©RÿÿÿÑuÇÿÕ¼>¾¿þÿôÒô:J—÷ßÿÿÿ×ÿ ÿúëá¿ý%¶––ºªI-ýÿÿþ¸/þø/ø#ÿÿAX¤ÒES¯_ÿ_ÿÿÖ�ýðF¿î_øoKúJ œ„Ü%z¤º÷ÿÿþÿÂ_þýé}þßú¥µ¡øE]+×ÿÿý-/Þ²]zÿz^þýIRõõ¯Üë¿ÿÿ½þ¿Úëé/¾¿ùå¶¿ªE ô–ah,£“}Õÿÿߥÿ½mÖ¿ßýÿO_úÒÕIi*ªOG»W_ÿý³DÙ§¥ëݯÿûk®ßÝZ^©!Ÿëá% …ŠÒÒL6¶—ýþmfÓjÃJÂ^Ç®a:]¤Ý‚}ø Õ½mCiªuN8…¡E6–ÚAºTûTÕ��Šb“ ƒ†Ã†ÆÚ' (9"é4Õá±Ã´˜iAÁ¥ôpTÕSia†“aša5M4á0˜&BµA8M…L1M4â»#‹M&Èâ1AˆA0˜/µž>Z…U2dCAˆR«ˆÊÙ¡’؃ ÎT ûB2Ù$EªpÝ}*T¥˜–c+­ÇÂ㻎Ô4æK©Â…P� êo½=ýýõÿÿŒ®¼wÒ§ÿõò½¬†ˆè‹ù©‘&Fª“:RGÑ2d\ˆq‘¡ÊðŽ!13 ¤l” e’ã!æIçò8�猎ˆè¡fn �Ê!gò9›ÁjJ&b&È#XdídO5†H̘¢.`�ažãÐ ÌÌÍÃP™#0aÌ–% øA„la¡GÆg„]‘õ6GciM0�ÒÂL:T›Òa¦i7W¤ÃU ¦©¤ÝQö�mô�iª7T ãeœÆ“ii6“…I¤Ãh0šJªM¤é6ð�Mé6ù¤ÚO,é°ƒ#ž|Ô4“nÒI6{ +ôÝjøM¥i:V¢ª�úI¼ô¿}oI·mt·W§ÛÝw­+õmÚ[ôÿú_Øuzöý\U5Õ>—Ò÷£ú·w½uoú|Rl›™«ÿº‘Âú‘ÂßÛ½é).‡Z®G íµh«mmé{×ðÞÚòn¶þÿòF:ÉP7ÿ{ù$e¹Üé<·>½!×Þ]_¯þXÇZþÃß\ ¿þ�×BÃÿþ’ß/ßÒÿÿë[Ûøí™È#!¯ÿÿì=ÒöÕý¿ÿÿÿßVê¿Ãÿ6)6")ð‚%p)Ùr5™¬Ìÿõÿí÷_£»¯ÿëÿÿÿþõÿÃþDZ΃á(ˆ8£¿‚4 0� ‡ÿÿðom/oÿÿuÿûÿÿ÷ïü?ý +64kj|´‚Ép< ÚM¤Ûÿ»ì>ØA~“kýÕÿÿ÷úý¥õáÿó!du3Qy3LØÍCI´›Âéƒn©6“iXoýÿûð«Û¨§ûîëïÿï¶¾ým¬�Ïa„kkÙ Éáb x +I´§}%TÞÚM¤ÛÿïîøQøÚ¾ßݽºêßÞ¾»zëÎ/_¦’p‚ «¤Ó —ô›VûÅÈ� –Þé:ÞÛÿ¶û:ÿý~Ýíÿ®“wö¾»~ë}ýn­$ÚL=½§Ýõ«¥ÒûÝ:íÿý³E{f‹û1û»f‹³=µlÏi³?z¾Ì÷÷¯®Ïí]ÕýZ[u®“i~Þá'Þ¯Õ$»!¬“J¯Ý_ÿöÒm[ ¥Èc÷Ó -´›ì%°ÒVÒÒl$ÃÓm$ô¶Â^ÚM—ÒÒNÒñI¿]ñ¡[]/¤·D Š‚!Ï°Ž“DAPM?µ×n�¦È¸Ód)�± +è&ØM6¶BølSb©ŠVÒ°�b"ºA¶’vA†*“ ¤Èâßi&Kצ×õÿú]í5†��SN!£c +¯ÿ½Ó +› M¦GÂ` +í=Ú ,0™+L! (lTBa4•Ö!z#’+¡„EpÅ5 $G#T…Ý6¡ùÇþ—ïë›$·A6M¤Ú#²ûëÒÖ¯ôºî¾5#…ï#…kö×ߥþÃô©µícßÿ]ÿE¹*)îˆtvûÿõþßÿ¾G^rFoa—_¥Ößøª,gþXÎȶ™ÿö—øoÒÛ¯`·â˜Ò×ÿÿÿü:†_ÛA&©áÿõèwÚ%ÿÒÿúÿÿüqþá��ˆƒ á½*ãüm¡úúÿ_¿ÿô¾¹7ŽUåc2-ý½v¿}-}ë¿ÿ¿Òu©l"~µ¯þŸK«ïïÿô’½yå¶©oûzÝz½z[ßý7é}~þ¿÷'ßIôº}ô›¿ý¤�kôÚIoúW¤Ú]­¥i¤ÙžÛfŸ÷M™úa$uŸöšA´¾»M[T’K¶“é0ÂL3“ ^í&I>’t’N ¤ÃI$„ÓC 4A´´M¥ eÉŠ S�i§a&)0ƒ $ÃKû…êšAˆA&)$ðÄ&Ñ B &aô{hðÑìB )ã+š$„“Q â¨DDPC� ²¹‰) T ”EÂAZ Sh ‚ Di†"‚ˆa„­¥-A™C;:“bñŒ’âÝ*@Ðgvu +‚aB 3L Â6W0��£ÛØq“��ŠF¶º�‡¡ògl#æi£cG¶&Ÿ(öÂI„ni7£õØïHl(TniuJÒnLzN“¦Š¶“²g£ÛI†�t›eœ—Ò6“„ &ÕZDwEY6Ñ‘m„›IÐÒµ}t›H6Ë¡tM«¤ØAp©6“¸î–¢Ú[ÛÓkI^ïJÚ_¨­R ±uë„Á7ºòqJÒüRm+Ý+ï¿[KÓWIúÕñTÝïJýSÝ]¯TÒÿ±KÇÒõWÛõ\pš]ãQúÃëû­Ü~õºZÿ¿m?uº‘Â×ÝZÿ¡¯t«†>õÿ\4Xä`íê·òÇ# þ‹rIÿù!¯ zoÑc2êþ]]‡ÿþ­ÃÇî«_?ÿÅa®�®ÃÝô«ÿÃ__ÿaîÚ¯þ߯ÿû®Ãïÿÿÿ†ÿÿü7ú;ºÿÃnÝ’âþd½øG~ÿÿÿþ#[ÿÿá½[õÿÃ{¥þ‹áÐOáá¿ÿþÿøl%ÿÿá¿Ò~ÿÃ{a/ô ý´¾Òðý?÷ßþðéïO¿Ú ÿ¤?Úÿ‡Kô½Ýn¿ßýû¯ïÿj÷±Q½7Ûª_é/î¾Úû߯·ÝýÛÍ_ßûÑÍÛéí}³§ºþÚÿœõ_UÏ{Ó×ûoûÿU÷ÿµëßzoÍ=.CŸÝ™úÿ¥§m™úÚM¯¶f»>›ûgötr»öÓýêÒlÿ{M¥vÃJéY wÌ&Ò°Œ9µÛ«ǰҰŽá÷M¥ii°×m8`ƒì0­›™ÚVÃaé±²-Óm&ÕŠ‘C[i1±M¥mÚllSšM5´˜„ÒlSÕØH6�mƒ ±H6!EuØ„ª°K¦‚i²8MZm‘ÒVA¦¶›AJ ( ž: *¥á±UØaVbPc +‹†I†P¸0@Á åa1•�ÄB(DD1B" !G;,%†øˆŽMŠ7ú½~´•¥ÒÒ¤,0–ƒ©Gé þ[¨Gf¹\R&q]ó¿Ì€¨L)ÞÙd¹ØR>5!a…ø#X3º?Ø<< Óÿ†\ú;ý'¯÷ÂOÿWÿI¿–çÿ¼�^Vlu¯ãÿý}|„òf¦IÚç#©‘žD�K"¬ŒyBK(#L—® Dk3¨ù’Іqhö!&k)ó"ìÒ|×ÐÑr~ldúa¤a´l ’ði§é¥aB}ƒÚ„Òm&Ó ?áÚM¨O¤�BMçð†“hŽß^‚¹æ’a¦¡&Ñ´ºM‡t6YÃ8i6™÷°«a Î + °½ì³¶×Lñð•Ã- ¿DcÒÐO­zT°¡ýé=&ý…Ó¥íé(ç]ZÒÿÒ÷ÒÇJíh4–þ’é8ÒÛ´“¾¿n¶‡§]ýl6›R<©_ÓÖÓé.­ÆÐ×O¥éiFÐÖÓ×_ßøUúØmß�\ñÿJ\¾¸ïéeËQŽ?¯§ÿñÿAC ö�ÿÿþ“WßÿKbµ©c+ÿ[ÿõýXa½ú×ÿýX{ÿdž½/_ÿÿúü[ ¿×_õøØþ¿nÖ«àŒ?ÿÿþ‡{á·ÿÁÿäìŽþÃã�gùcïÉç¯Kÿÿÿ„ ùnÁ·þð‚ÿÐ_Ìì?þ‚¦ÿA:^‚ÿÿú_öï÷õÿ ¿Ü?×¥ÿoékxKÿ·_þµûnEÖø_ýÛ}µõ_Û¿U¯×»úÿú_îf�}[¾¿ô¿Û?ÿúÿ»úé7¯ïÞ¯ÿ×ö×ë­¿_ÿþÿm/ÿÛoÿ3_ÿ~×ÿÓO]¶è÷ii6f›4]ÿö¿·Õ½~½Ý·ú¤¬3Ýëíöé»M²÷¸F?ïI[[I†°K‘Gl¿§"¸zwv¬‰Í+NEpÓ^ÛK‘\5V)dW 5c¶LœB´Bi4îá¥pÐV“Å'áiÂÐjØh&iÓa:i„ì2VA°Ÿ#ˆA°�4ÙÕŠêÚÕ§žÊ³C÷4ت TB 0‚5¶†U¶G°«´F‰?*Ù¦ Â ˜‘\ç†Â%ÐÊÉ> B)ЈÁ+Š>ec“nHؼ#€ÊÃqþœ'FÇÿùf$E¸_-ÌòŒì¨g|ÌŠ ˆÉšJ µ,ÉTC‚œEn.ÌóPP�%1*ˆ\¡áB®4kízÞµ»æâÿ°˜Nê/âîúúwÿ¦©Òó±uÒÛ}#·Xˆäþýuÿ§éþ¼qÿ×Õs±{%�r¬ùgÏÊçCÐM„Ãež|Ò‡Õa·é_âÃmxNéZ% ¨N•Ò%IÔRV¶÷ß“´¾+«¢Q_m[§­Òÿüýi?é6Ðÿû‹´öõÿþã§éÖãMzíª÷v½Há}ß­§ÿ÷R8Wk~ÝzÿC´:ÚQ®›ßß#…ÿòÈ¢øÿ«oÿ#?‡ÿÿ-ʺ–9~—¯ÿãÿþXÏúÿ_úCÿ°ÿÿÿÄaâ¿ûÿéÿÿõÿÿÿý‡M×ÿþÚ¯ÿýÿÿÿÿÂ8ÿÿÿÿ°Þëÿÿ†ÃÿÿÿÿÿÿøAÿÿÿ†îÐ_ÿø>_ÿÿ÷ÿÿÿÒÿþÿðûÿÿ†ôŸÿÿÿÿýÿá/ûÿÿýù«ÿÿ»¥÷úÿÿÿÿÿÿúÿýô¿ÿï½wݺÿÛÿþßþ«ûkßßþqzÿëí�:m~ý×ÿÿÿ·ÿëû×ûf‹ÿ¿�Joû3þÏúíëuÿ¶iÿõìú_ûOµ´—1ûao_Ð[[/§„PïÛ ]6±Øg+Ý-;Óa‚TÕSôÙîÕ;°m5†J˜MˆI„i§V 6)6GÐaŠm&*G›L0ÒNØ4Ób;´Ó0˜h(TÓWtÓ †Â']µÞš²,ÃOM ›T�°L�@˜M&Vq 0­Nôh†W1Y+(D‘”QÈ—tEhVàØ’3BŠÛ„#,á', þµÒ¶¶Â +…v‡ÿù6s%‰IcÿßûQÇó"h•":•á#ÄH�GB)#Ašˆ†N!Õ”èÙ%ãk3âD'ž#¢<~#¢=2YÓM4x`‹‚/fNwa3“Fê6M%=* Èõ Í%FÆ�a£s@‡A ÕÃöÂN�ta ØTxi8A6Pˆ·IÐfÉ & ÒµuáPM¿Ô$®N+âÚ_{¬«Pƒh”Rl+¥j47§Òuÿ½ýSÇÞ·|W¦¾Óï½{hoë¡»¾¿aéµ#…»»øÿ,r1‰JzåŽE§ß÷¥ê ¡Ãÿ¯ÐòÓõñÿÿ÷TZpØÿIý/öëÿöØõn¿ÿÿõßÿa†ÿàŽ÷_ÿïýÒÿü ÿ ÛA_ÿÿí ¿þÇÿ¥ã÷÷¿ü¾¶îÿõP“ÿýÿ£$û{ÙÕ9„ÿõÒ½¿}ÿ×KêûÿÿðÛÿo²uÿf[i6ßWœ]~ÓTÇ3Õ°Ïa‚_«zVé6zaœô­$;M; 6Ø¤Ø¤Ó Eb“M4Û´“ 4˜¦*itý7jØI†¸á…kvœBN!a2)Ä*•Érs2YEX I¿W_éuî´¾“ivD&)`Ä `�rÈ%Gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2$@#ü�°6ÓCyØØª2pØÜ°€À°È Xÿÿ $¦dAÂP[‰d4uÈ®v£2|®�Í)’ÆpÊvRDXhãÈÙfK ¨ŽÅH•#ˆú1⬈$¤µ\üFˆèi_d1¥0èE?šÄ§a**0 &9:‘5œæ³ ÍUDèíÒ™>£î§²Y¯a;M:M·I4z¬*M¥ªW]½×§þŸëô·èÇ¥¤ßO÷­R—T»ÒQñûJèuöB-!ëZtµIR]$ÿðéfl2D™C#¿'"�ç#6lÌÙA2ís2(f¸ã=d6G~‘óX@ŠwšI½/×Ò��Õ|*-ÉsP‚]Qœ4wxMUB0í°�”óMU0�5è#YSI+¨#ÙÉ­N±ï_­.ÑǤû ­t“ÑÇé 5¤‚muP ŽôžµJô«¥m%£ØA—T¿¤Ý-¤íiu®¯¢®îï i~­„w¨G|¡áqt¯I&Ô$· ›AW¥éýGñ_ÕkÒÒ.©GÅ--+¡±j—ô•Ò{ªéqI%ë{ª¤ÿªÒZ¤’Jž)RI$–’ÿˆêªºKà뤭%Eå-.µº¤ž’×Uª×¤•/ê¿ÒÒ¤•UVµ«ïú]R®–Ý7é?¥×T’õ¾µZ¥]uKõ_¯«[ÕTŽˆïÆ©|0xaª ŸôÚK_¥ÁiiUj•%]~µ¬®ûª"5IkHTj’ô’ÐAWZ^>¾¿þ’…I*T©ª¤ºü¤uú].—Uª0¼"‡—_õT´au—KþŽ:ÿËÿ¯«éVµ^’K_K#ˤ¥Ö_K=ç×KD{[=àŒ=h¿ºTËõJGðF–_§¬¿þºàŽ<ºRþ]$•RE *¤„(v0âCÛJÁ$‹éq ¥¯I'¨¨j·h?KAúiáKè-zT´’Õzš‘(¡UPMŠb»Jª˜ªJû Bªª…°©´­R]µOVìmRIPÒ£ø*AÓµT› …LBªi‚a4ôAUo°¡bè*ª±ÐT…UI¤OJ"(ò¸¹†Êéñ ã„(­©žØ ‚ +UµJ Ñ\& „D ©\«H® ‚-¬*Ž»ªR6Òs·Kot„m¥¡ˆC ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ& fä@ÈÛª@¨ ´Âäí²€Ô¸Ü€ànjjpdÿü€á¨n endstream +endobj +372 0 obj +null +endobj +373 0 obj +<< /D [ 379 0 R /Fit ] /S /GoTo >> +endobj +374 0 obj +<< /A 380 0 R /Next 381 0 R /Parent 4 0 R /Prev 26 0 R /Title (Editor's Introduction) >> +endobj +375 0 obj +null +endobj +376 0 obj +<< /D [ 382 0 R /Fit ] /S /GoTo >> +endobj +377 0 obj +<< /A 383 0 R /Next 28 0 R /Parent 4 0 R /Prev 384 0 R /Title (Design of the Turbo PrintServer 20 Controller) >> +endobj +378 0 obj +<< /Length 779 /Filter /FlateDecode >> +stream +xœÿü + + +  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€���‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒ���ŽŽŽ������‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœ���žžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ™b~�endstream +endobj +379 0 obj +null +endobj +380 0 obj +<< /D [ 385 0 R /Fit ] /S /GoTo >> +endobj +381 0 obj +<< /A 386 0 R /Next 387 0 R /Parent 4 0 R /Prev 374 0 R /Title (Biographies) >> +endobj +382 0 obj +null +endobj +383 0 obj +<< /D [ 388 0 R /Fit ] /S /GoTo >> +endobj +384 0 obj +<< /A 389 0 R /Next 377 0 R /Parent 4 0 R /Prev 390 0 R /Title (The Common Printer Access Protocol) >> +endobj +385 0 obj +null +endobj +386 0 obj +<< /D [ 391 0 R /Fit ] /S /GoTo >> +endobj +387 0 obj +<< /A 392 0 R /Next 393 0 R /Parent 4 0 R /Prev 381 0 R /Title (Foreword) >> +endobj +388 0 obj +null +endobj +389 0 obj +<< /D [ 394 0 R /Fit ] /S /GoTo >> +endobj +390 0 obj +<< /A 395 0 R /Next 384 0 R /Parent 4 0 R /Prev 396 0 R /Title (Design of the DECprint Common Printer Supervisor for VMS Systems) >> +endobj +391 0 obj +null +endobj +392 0 obj +<< /D [ 397 0 R /Fit ] /S /GoTo >> +endobj +393 0 obj +<< /A 398 0 R /Next 399 0 R /Parent 4 0 R /Prev 387 0 R /Title (Hardware Accelerators for Bitonal Image Processing) >> +endobj +394 0 obj +null +endobj +395 0 obj +<< /D [ 400 0 R /Fit ] /S /GoTo >> +endobj +396 0 obj +<< /A 401 0 R /Next 390 0 R /Parent 4 0 R /Prev 399 0 R /Title (ACCESS.bus, an Open Desktop Bus) >> +endobj +397 0 obj +null +endobj +398 0 obj +<< /D [ 8 0 R /Fit ] /S /GoTo >> +endobj +399 0 obj +<< /A 402 0 R /Next 396 0 R /Parent 4 0 R /Prev 393 0 R /Title (X Window Terminals) >> +endobj +400 0 obj +null +endobj +401 0 obj +<< /D [ 403 0 R /Fit ] /S /GoTo >> +endobj +402 0 obj +<< /D [ 404 0 R /Fit ] /S /GoTo >> +endobj +403 0 obj +null +endobj +404 0 obj +null +endobj +xref +0 405 +0000000000 65535 f +0000000015 00000 n +0000000190 00000 n +0000000485 00000 n +0000004216 00000 n +0000004288 00000 n +0000004459 00000 n +0000004538 00000 n +0000004616 00000 n +0000005007 00000 n +0000005460 00000 n +0000005853 00000 n +0000006505 00000 n +0000007144 00000 n +0000007909 00000 n +0000008383 00000 n +0000008994 00000 n +0000009295 00000 n +0000009742 00000 n +0000010258 00000 n +0000010703 00000 n +0000011204 00000 n +0000011745 00000 n +0000012192 00000 n +0000012831 00000 n +0000013291 00000 n +0000013342 00000 n +0000013433 00000 n +0000013484 00000 n +0000013583 00000 n +0000019315 00000 n +0000019367 00000 n +0000019472 00000 n +0000019573 00000 n +0000019673 00000 n +0000019771 00000 n +0000020320 00000 n +0000020891 00000 n +0000021564 00000 n +0000021925 00000 n +0000022284 00000 n +0000023061 00000 n +0000097142 00000 n +0000105526 00000 n +0000105625 00000 n +0000105725 00000 n +0000105831 00000 n +0000105936 00000 n +0000106044 00000 n +0000106154 00000 n +0000106655 00000 n +0000107055 00000 n +0000107702 00000 n +0000109200 00000 n +0000109592 00000 n +0000110659 00000 n +0000110982 00000 n +0000112097 00000 n +0000112597 00000 n +0000199412 00000 n +0000207397 00000 n +0000207498 00000 n +0000207598 00000 n +0000207697 00000 n +0000207807 00000 n +0000207912 00000 n +0000208452 00000 n +0000208915 00000 n +0000209446 00000 n +0000210121 00000 n +0000210971 00000 n +0000301625 00000 n +0000309206 00000 n +0000309305 00000 n +0000309405 00000 n +0000309510 00000 n +0000309620 00000 n +0000309728 00000 n +0000309831 00000 n +0000309929 00000 n +0000310025 00000 n +0000310126 00000 n +0000310232 00000 n +0000310788 00000 n +0000314565 00000 n +0000314952 00000 n +0000316004 00000 n +0000336544 00000 n +0000338108 00000 n +0000340028 00000 n +0000341172 00000 n +0000341816 00000 n +0000342269 00000 n +0000342986 00000 n +0000343583 00000 n +0000343924 00000 n +0000409852 00000 n +0000410947 00000 n +0000411397 00000 n +0000412810 00000 n +0000413683 00000 n +0000414160 00000 n +0000427041 00000 n +0000427577 00000 n +0000433790 00000 n +0000433896 00000 n +0000433998 00000 n +0000434102 00000 n +0000434201 00000 n +0000434302 00000 n +0000434402 00000 n +0000434513 00000 n +0000434908 00000 n +0000435356 00000 n +0000435890 00000 n +0000436275 00000 n +0000436667 00000 n +0000437571 00000 n +0000438103 00000 n +0000438459 00000 n +0000439191 00000 n +0000439865 00000 n +0000440537 00000 n +0000441235 00000 n +0000442470 00000 n +0000498987 00000 n +0000499433 00000 n +0000501044 00000 n +0000501830 00000 n +0000502280 00000 n +0000502722 00000 n +0000503591 00000 n +0000504075 00000 n +0000512077 00000 n +0000512177 00000 n +0000512278 00000 n +0000512382 00000 n +0000512484 00000 n +0000512590 00000 n +0000512695 00000 n +0000512804 00000 n +0000512915 00000 n +0000513410 00000 n +0000513806 00000 n +0000515028 00000 n +0000530346 00000 n +0000531396 00000 n +0000532056 00000 n +0000533816 00000 n +0000535384 00000 n +0000536464 00000 n +0000537293 00000 n +0000538807 00000 n +0000539408 00000 n +0000539865 00000 n +0000540436 00000 n +0000540858 00000 n +0000549371 00000 n +0000550367 00000 n +0000551009 00000 n +0000553186 00000 n +0000553770 00000 n +0000554319 00000 n +0000625595 00000 n +0000626060 00000 n +0000626557 00000 n +0000630580 00000 n +0000631479 00000 n +0000632301 00000 n +0000640240 00000 n +0000641554 00000 n +0000650066 00000 n +0000650168 00000 n +0000650269 00000 n +0000650368 00000 n +0000650474 00000 n +0000650583 00000 n +0000650683 00000 n +0000650787 00000 n +0000650894 00000 n +0000651005 00000 n +0000651575 00000 n +0000652141 00000 n +0000652593 00000 n +0000653172 00000 n +0000653528 00000 n +0000654173 00000 n +0000738932 00000 n +0000746983 00000 n +0000747083 00000 n +0000747184 00000 n +0000747286 00000 n +0000747392 00000 n +0000747491 00000 n +0000747595 00000 n +0000747706 00000 n +0000747813 00000 n +0000748195 00000 n +0000748526 00000 n +0000764578 00000 n +0000776534 00000 n +0000778413 00000 n +0000779281 00000 n +0000780211 00000 n +0000781404 00000 n +0000782434 00000 n +0000861946 00000 n +0000862318 00000 n +0000863341 00000 n +0000863903 00000 n +0000864607 00000 n +0000864954 00000 n +0000908880 00000 n +0000909660 00000 n +0000910647 00000 n +0000910881 00000 n +0000911459 00000 n +0000911856 00000 n +0000912557 00000 n +0000913037 00000 n +0000913371 00000 n +0000992822 00000 n +0000997413 00000 n +0000997513 00000 n +0000997612 00000 n +0000997718 00000 n +0000997825 00000 n +0000997926 00000 n +0000998030 00000 n +0000998141 00000 n +0000998238 00000 n +0000999137 00000 n +0001001319 00000 n +0001002558 00000 n +0001003780 00000 n +0001004564 00000 n +0001045041 00000 n +0001052289 00000 n +0001052391 00000 n +0001052500 00000 n +0001052611 00000 n +0001052710 00000 n +0001052811 00000 n +0001052918 00000 n +0001053022 00000 n +0001053122 00000 n +0001053228 00000 n +0001053333 00000 n +0001053435 00000 n +0001053774 00000 n +0001054124 00000 n +0001054800 00000 n +0001055170 00000 n +0001055499 00000 n +0001056015 00000 n +0001056346 00000 n +0001129150 00000 n +0001133447 00000 n +0001133547 00000 n +0001133646 00000 n +0001133752 00000 n +0001133854 00000 n +0001133955 00000 n +0001134066 00000 n +0001134838 00000 n +0001135303 00000 n +0001135632 00000 n +0001136090 00000 n +0001136488 00000 n +0001137300 00000 n +0001138628 00000 n +0001177734 00000 n +0001184163 00000 n +0001184269 00000 n +0001184368 00000 n +0001184465 00000 n +0001184576 00000 n +0001184677 00000 n +0001184779 00000 n +0001184881 00000 n +0001184988 00000 n +0001185088 00000 n +0001185192 00000 n +0001186068 00000 n +0001187448 00000 n +0001187945 00000 n +0001188328 00000 n +0001189175 00000 n +0001189508 00000 n +0001190186 00000 n +0001259245 00000 n +0001266746 00000 n +0001266847 00000 n +0001266949 00000 n +0001267053 00000 n +0001267160 00000 n +0001267260 00000 n +0001267366 00000 n +0001267683 00000 n +0001267998 00000 n +0001268400 00000 n +0001269303 00000 n +0001270197 00000 n +0001271430 00000 n +0001350724 00000 n +0001351259 00000 n +0001353770 00000 n +0001358397 00000 n +0001358740 00000 n +0001359532 00000 n +0001360271 00000 n +0001360687 00000 n +0001361098 00000 n +0001367875 00000 n +0001367981 00000 n +0001368082 00000 n +0001368186 00000 n +0001368291 00000 n +0001368390 00000 n +0001368492 00000 n +0001368601 00000 n +0001368712 00000 n +0001369212 00000 n +0001369585 00000 n +0001370586 00000 n +0001370917 00000 n +0001371588 00000 n +0001441396 00000 n +0001447503 00000 n +0001447603 00000 n +0001447702 00000 n +0001447803 00000 n +0001447905 00000 n +0001448011 00000 n +0001448118 00000 n +0001448220 00000 n +0001449987 00000 n +0001451066 00000 n +0001452906 00000 n +0001457172 00000 n +0001457603 00000 n +0001458388 00000 n +0001458906 00000 n +0001460234 00000 n +0001461168 00000 n +0001462150 00000 n +0001462962 00000 n +0001463863 00000 n +0001464378 00000 n +0001524576 00000 n +0001524961 00000 n +0001526326 00000 n +0001526753 00000 n +0001537382 00000 n +0001542083 00000 n +0001544329 00000 n +0001545777 00000 n +0001551431 00000 n +0001551537 00000 n +0001551638 00000 n +0001551747 00000 n +0001551849 00000 n +0001551949 00000 n +0001552048 00000 n +0001552159 00000 n +0001552266 00000 n +0001552801 00000 n +0001553649 00000 n +0001554008 00000 n +0001554387 00000 n +0001554720 00000 n +0001555202 00000 n +0001613141 00000 n +0001613163 00000 n +0001613215 00000 n +0001613321 00000 n +0001613343 00000 n +0001613395 00000 n +0001613525 00000 n +0001614377 00000 n +0001614399 00000 n +0001614451 00000 n +0001614548 00000 n +0001614570 00000 n +0001614622 00000 n +0001614742 00000 n +0001614764 00000 n +0001614816 00000 n +0001614910 00000 n +0001614932 00000 n +0001614984 00000 n +0001615134 00000 n +0001615156 00000 n +0001615208 00000 n +0001615344 00000 n +0001615366 00000 n +0001615418 00000 n +0001615535 00000 n +0001615557 00000 n +0001615607 00000 n +0001615711 00000 n +0001615733 00000 n +0001615785 00000 n +0001615837 00000 n +0001615859 00000 n +trailer << /Info 2 0 R /Root 1 0 R /Size 405 /ID [<7d59b2834acec846baaab856a0f1604a><4edb0ad02f205be71f73d3135a023ab6>] >> +startxref +1615881 +%%EOF diff --git a/xie/docs/dec/DTJ-1991-v03-04-bitonal-image-accelerators.txt b/xie/docs/dec/DTJ-1991-v03-04-bitonal-image-accelerators.txt new file mode 100644 index 0000000..0db7dd4 --- /dev/null +++ b/xie/docs/dec/DTJ-1991-v03-04-bitonal-image-accelerators.txt @@ -0,0 +1,1029 @@ + ChristopherJ.Payson + ChristopherJ.Cianciolo + Robert N Crouse + Catherine E Winsor + + +Hardware Accelerators for +Bitonal Image Processing + Electronic imaging systemns transfer viezus of real-world scenes or objects into + digital bits for storage, manipulation, and viewing. In the area of bitonal images, + a large market exists in docz~rnentmanagement, which coizsists of scanning vol- + umes of papers for storage and retrieval. Hozuevel; high scan densities produce + huge volz~mesof data, requiring compression and decoml~ressiontechniques topre- + serve system memnory and imnprove systmz throughput. These tech~ziques,as well as + general image processing algorithms, are conzpute-intensive and require high + memory bandwidth. To address the nzemory issues, and to achieve interactive + image display performancq Digital has designed a series of bitonal image hard- + ware accelerators. The intent was to create interactive media view stations, with + inzaging applications alongside other applications, In addition to achieuiilg rnem- + ory, performance, and versatility goals, the hclrdware accelerators have signifi- + cantly improvedjnal image legibility + + +Bitonal image technology, which can be viewed as should come of age in the 1990s. Digital imaging +the electronic version of today's microfil~nmethod, is already in use in many areas and new applica- +is experiencing a high rate of growth. However, the tions are being created for both commercial and +electronic image data objects generatecl and manip- scientific markets. The emergence of digital images +ulated in this technology are very large and require as standard data types supported by the majority +intensive processing. In a generic system, these of systems (like text and graphics of today) seems +requirements can result in poor image processing assured. For a greater understanding of specific +performance or reduced application performance. imaging applications, this section presents general +To address these needs, Digital has designed a series imaging concepts and terms used throughout the +of imaging hardware accelerators for use in the doc- paper. +ument management market. + This paper provides a brief tutorial on electronic Concepts and Terms +imaging. It begins with a general description of the In its simplest form, imaging is the digital repre- +imaging data type and compares this type to the sentation of real-world scenes or objects. Just as a +standard text and graphics data types. It continues camera transfers a view of the real world onto a +with a discussion of specific issues in bitonal imag- chemical film, an electronic imaging systenl trans- +ing, such as image data size, network transport fers the same view into digital bits for storage, +method, rendering speed, and end-user legibility. manipulation, and viewing. In this paper, the term +The paper then focuses on Digital's DECimage 1200 image refers to the digital bits and bytes that repre- +hardware accelerator for the VT1200 X window sent the real-world view. +terminal developed by the Video, Image and Print The process of digitizing the view may be done +Systems Group. It concludes with future image through various methods, e.g., an image scanner +accelerator demands for the processing of multi- or image camera. A scanner is the conceptual +media applications and continuous-tone images. inverse of a normal printer. A printer accepts an + electronic stream of bits that describe how to +Introduction t o Imaging place the ink on the paper to create the desired +Just as graphics technology blossomed in the 1980s, picture. Conversely, optical sensors in the scanner +electronic imaging and its associatecl technologies transfor~nlight intensity values reflected from a + + +Digilnl ~ & c ~ ? z ~ c L z ~ J o .u? ~No. + Vol. FctlI 19'11 + ? ~4 ~ ~ 9 + Image Processing, Video Terminals, and Printer Technologies + + +sheet of paper and create a stream of electronic bits media density. Scaling an image may be as simple as +to describe the picture. Similar sensors in the focal replicating and dropping pixels, or it may involve +plane of a camera produce the other common digi- Interpolation and other algorithms that take neigh- +tization method, the electronic image camera. boring pixels into account. Generally, the more + The format of a digitized image has many param- complex scaling algorithms require more process- +eters. A pixel is the common name for a group of ing power but yield higher-quality images, where +digitized image bits that all correspond to the sane quality refers to how well the original scene is rep- +location in the image. This pixel contains informa- resented in the resulting image. +tion about the intensity and color of the image at Before an image can be displayed, its pixel values +one location, in a format that can be interpreted often require conversion to account for the charac- +and transformed into a visible dot on a display teristics of the display device. As a simple example, +device such as a printer or screen. The amount of a color image cannot retain its color when output +information in the pixel classifies the image into to a black-and-white video monitor or printer. In +one of three basic types. general, when a device can display fewer colors + than an image contains, the image pixel values must + A bitonal image has only one bit in each pixel; + be quantized. Simple quantizing, or thresholding, + the bit is either a one or a zero, representing one + can be used to reduce the number of image colors + of two possible colors (usually black and white). + to the number of display colors, but can result in + A gray-scale image Iias multiple bits in each pixel, loss of image quality. Dithering is a more sophisti- + where each pixel represents an intensity value cated method of quantizing, which produces the + between one color (all zeros) and another color illusion of true gray scale or color. Although dither- + (all ones). Since the two colors are usually black ing need use no more colors than simple quantiz- + and white, they produce a range of gray-scale ing, it results in displayed images of much higher + values to represent the image. quality. + Image compression is a transforn~ationprocess + A color image has multiple components per + used to reduce the amount of memory required to + pixel, wherc each component is a group of + store the information that represents the image. + bits representing a value within a given range. + Different compression methods are used for bitonal + Each component of a color image corresponds + images than those used for gray-scale and color + to a part of the color space in which it is repre- + images. These methods are stantlardized to speclfy + sented. Color spaces may be thought of as dif- + exactly how to compress and decompress each + ferent ways of representing the analog, visible + type of image. For bitonal images, the most corn- + range of colors in a digitized, numeric form. The + moll standards are the ones ~ ~ s eind facsimile + most popular color spaces are television's YUV + machines, i.e., Recommendations ~ . 4 and ~ . of6 the + format (one gray-scale and two color compo- + Comite Consultatif Internationale cle TkICgraphique + nents) and the bit-mapped computer display's + et Telkphonique (CCITT).l.~ommonlyknown as + RGB format (red, green, and blue components). + the Group 3 and Group 4 standards, the desig- + The resolution of an image is simply the density nations are often shortened to G3-ID, G3-2D, and +of pixels per unit distance; the most common den- ~ 4 - 2 ~ . + referring to the particular standard group +sities are measurecl in dots per inch (dpi), where and to the coding method, which may be either +a pixel is called a dot. For example, a facsimile one- or two-climensional. For gray-scale and color +machine (which is nothing more than a scannel; images, the Joint Photographic Experts Group +printer, and phone modem in the same unit) typi- (JPEG) standard is now emerging as a joint effort of +cally scans and prints at 100 dpi, although newer the International Standards Organization (ISO) and +models are capable of up to 400 dpi. As another CCITT.3 Whichever format or process is used, com- +example, most workstation display monitors are pression is a compute-intensive task that involves +capable of 75- to 100-dpi resolution, and some high- mathematically removing redundancy from the +end monitors achieve u p to 300-clpi resolution. pixel data. + To display an image at a density different from A typical compression method creates an +its scanned density, without altering the image's encoded bit stream which cannot be displayed +original size, requires the image to be scaled, so directly; the compressed bits must be decom- +that the new image density matches the output pressed before anything recognizable may be + + + +10 Vol. 3 No.4 Fh11 1991 Digital TecbvzicalJournal + Hardzuare Accelerators for Bitonal Image Processing + + +displayed. The term compression ratio represents The major drawback in the imaging process is +the size of the original image divided by the size of increased data size, which results in storage mern- +the compressed form. For bitonal images using ory and network transport problems. High scan +the CCITT standards, the ratio is commonly 20:l on densities and color information components create +normal paper documents, but can vary widely with large volumes of data for each image; a bitonal +the actual content of the image. The CCITT stan- image scanned at 300 dpi from an 8.5-by-11-inch +dards are also "lossless" methods, which means that sheet of paper requires over 1 megabyte of mem- +the decompressed image is guaranteed to be iden- ory in its original pixel form. Therefore, compres- +tical to the original image (not one bit different). sion and decompression are integral parts of any +In contrast, many "lossy" compression methods imaging system. Even in compressed form, a bitonal +allow the user to vary the compression ratio such image of a text page requires about 50 kilobytes +that a low ratio yields a nearly perfect image repro- of storage, whereas its American standard code +duction and a high ratio yields a visible degradation for information interchange (ASCII) text equivalent +in image quality. This trade-off between compres- requires only 4 to 5 kilobytes. Similarly, a graphics +sion and image quality is very useful because of the file to describe a simple block diagram is much +wide range of applications in imaging. An applica- smaller than its scanned image equivalent. +tion need pay no more in memory space and band- Based on these advantages and limitations, sev- +width than necessary to meet image quality eral applications have emerged as perfect matches +requirements. for imaging technology. Bitonal images are used + in the expanding market of document manage- +A Nezu Data Type and Its Features ment, which consists of scanning volumes of +The image data type is fundamentally different papers into images. These images are stored and +from text and graphics. When a user views charac- indexed for later searching and viewing. Basically +ters or pictures on a display device, the source of an electronic file cabinet, this system results in +that view is usually not important. A sheet of text large savings in physical cabinet space, extremely +from a printer may have come from either a text file fast document access, and the ability for multiple +where the printer's own fonts were used, a graph- users to access the same document simultaneously. +ics file where the characters were drawn with line Gray-scale imaging is often used in medical appli- +primitives, or an image file where the original text cations. Electronic versions of x rays can be sent +document was scanned into the system. In any instantly to any specialist in the world for diagno- +case, the same letters and words present the user sis, and the ordering of sequential computer-aided +with approximately the same information; the dif- testing (CAT)-scan images into a "volume" can pro- +ferences are mostly in character quality and format. vide valuable three-dimensional views. The appli- + In spite of their large storage space require- cations for color imaging are relatively new and +ments, images have several advantages over graph- still emerging, but some are already in use commer- +ics or text. First, consider the process of getting cially, e.g.,license and conference registration pho- +the information into the computer. With the imag- tographs. A further extension to still imaging is +ing process, documents may be scanned automati- digital video, which can be considerecl as a stream +cally in a few seconds or less, compared to the time of still images. In conjunction with audio, digital +required for someone to type the information cor- video is commonly known as multimedia, applica- +rectly (absolutely no errors) into a text file. Also, tions for which range from promotional presenta- +even though the software exists to convert elec- tions to a manufacturing assembly process tutorial. +tronic raster images into graphic primitive files, the In this paper, we focus on the static bitonal imag- +process loses detail from the original image and is ing method of representing real-world data inside +relatively slow. Next, consider the variety of infor- computers. Static imaging is a simpler method of +mation possible on a sheet of paper: a user can- representing a broader range of information than +not easily reproduce a diagram or a signature on a the text and graphics media types, but it carries +document. A scanned image preserves not only the a greater requirement for processing power and +characters, but their font, size, boldness, relative memory space. In addition, static imaging can be +position, any pictures on the page, and even viewed as one part of true multimedia, as can text, +smudges or tears depending on the quality of the graphics, audio, video, and any other media for- +image scan. mats. Yet static imaging does not have the system + + +Digital Technical Journal Vo1.3 No. 4 Fa11 1991 11 + Image Processing, Video Terminals, and Printer Technologies + + + +speed requirements of a motion video and audio mately 3 kilobytes of memory. If the same shcct of +system. which must prescnt data at rcal-time rates. paper is digitized by scantling at various dot tlcn- +As long as the user can dcal with static images at sities, the resulting data files art. huge, ;IS sho\vn +an interactive rate, i.e., being able to view the by the decompressed bitonal image sizes in 'Inable1. +images in thc format of choice ;IS F~stas the user Note that l'iible 2 includes the size of thc scanned +c;un select them, thcn static imaging is ;I powcrhl image if scanned in way-scale and color motles, +rnctli;~presentation tool. l'hc next section presents although using these modes woultl not makc sense +the importi~ntissues concerning bitonal imaging in on a black-and-white sheet of paper. The image +a document management environment. sizcs are included for comparison and are discussed + in the section Future Image Accelerator Require- +Bitonal Imaging Issues ments. The data presented in Tables 1 and 2 illus- +As previously mentioned, bitonal electronic imag- trates that the size of the original ASCII file is much +ing as an dtcmativc to paper documents offers smalkr than any of the scilru~edversions. The data +many benefits, such as retluccd physic11 storage also gives evidence that scxnned Images, in gencr;~l, +space, instant and simultaneous access of scanned require considcrablc memory. +images, and in general a more accessible media. Since the typical use for bitonal images is for +Serious issues need to be resolved before a produc- volume document archival, an imaging application +tive imaging operation can be implemented. The must include a compression process to reduce mem- +chief issues are the irnage data size, transport ory usage. This process must transform the original +method, perceived rendering speed, and final legi- scanned image file to a much smaller file without +bility. In the following sections, we examine each losing the content of the original scanned data. +issue and present solutions. Compression algorithms may takc different paths + to achieve the same result, but they share one basic +Digitized Image Data Size process, the removal of redundant information to +The most important issue concerns irnage data sirs. reduce the object size. A common compression +Images are typically documents, drawings, or pic- routine searclies the pixel data for groupings, or +tures that have been digitized into a computer- "run lengths," of black or white pixels. Each run +readable form for storage and retrieval. Depending length is assigned a code significantly shorter than +on the dot density of the scanner, a single image the run length itself. The cotles are assigned by +can be 1 to 30 megabytes o r more in size. However, statistics, where the most frequent run lengths +storing a single irnage in its scanned form is not the are assigned the shortcst corles; statistics have been +typical usage model. Instead, a company may have amassed on a variety of document types for differ- +tens of thousands of scanned documents. Clearly, ent scan densities and document sizcs. A compres- +with today's storage technologies, a company can- sion proccss parses through the original image +not afford to store such a large volume of images file, generating another file that contains the codes +in that format. representing the original image. Figure 1, a sample + A typical ASCII file representing the text on an bitonal imagc compression, illustrates these com- +8.5-by-11-inch sheet of paper requires approxi- pressed codes in a serial bit stream. + + +Table 1 Sample Bitonal Image Sizes + Scan I Kilobytes of Data I +Document Type Density Pixel Form Typical +(Paper Size) (dpi) (Decompressed) Compressed + +A size +(8.5 x 11 inch) + +E size 100 1826 106 +(44 x 34 inch) 200 7305 114 + 300 16436 127 + + + + +12 Vol. .3 /Vo. 4 FLI// 1991 Digital Technical Jourrrnl + Hardware Acceleratorsfir BiLonnl Image Pro~essfn~q + + +Table 2 Sample Gray-scale and Color Network Transport Constraints + l mage Sizes The network transport performance for an image + Kilobytes of Data is important, because i1n;lgc.s arc rnost often stored +Document Type in Pixel Form on a remote system and vicwctl on a widespread +and Size (Decompressed) group of display stations. For example, onc group in + an insurance company receives and scans claim +128 x 128 pixel, 12 bits per pixel 24 +gray-scale image + papers to create a centralized image database, + while users in another group acccss the tlocuments +512 x 512 pixel, 8 bits per pixel +color image simultaneously to proccss claims. For thc imaging +512 x 512 pixel, 24 bits per pixel system to be productive, this image d;~taneeds +color image to be transported quickly from one group to the +8.5 x 11 inch, 100 dpi, 24 bits 2740 other: telephone attendants answering calls must +per pixel, color image have immediate access to the data. + Scanned image documents take a long time to + transport between systems, simply because they are + Several algorithms for bitomal compression are so large. When compression techniques arc used, a +widely used totl;ty. As mentioned in the previous typical uncompressed image stored in 1 megabyte +section, the most common for bitonal images are can be reduced to approximately 50 kilobytes. +the CCII?' standards G3-1l3, <;3-2D, and ( ; 4 - 2 D , which Since transport time is proportional to the number +all use the approach just described. For the one- of packets that must be sent across the network, +dimensional method, the algorithm creates run reducing the data size to 5 percent of its original +lengths from all pixels on the same scan line. In the size also reduces the transport time to 5 percent +two-dimensional methods, the algorithm some- of the original time. Tliercfore, you can now send +times creates run lengths the same way, but the twenty compressed images in the same time previ- +previous scan line is also examined. Some codes ously spent sending one uncompressed image. +represent run lengths and even whole scan lines Even with compression techniques, the image +as "the same as the one in the previous scan line, files are still larger than their text file equivalents. +csccpt offset by .V pixels," where N is a small inte- Moreover, most network protocols limit their +ger. Tlic two-climensional method takcs advan- packet size to a maximum number of bytes, i.e., an +tage of most of the recluntlancy in an image and image file larger than the maximum packet size +returns the smallc5t compressed file. In addition to gets divided over multiple packets. If the protocol +prcscrving system memory, these compression requires an acknowledgment between packets, then +methods significantly Improve network transport the transport of a large file over a busy network +performance. becomes a lengthy operation. + + IMAGE PIXELS + m + ONE SCAN LINE OF PIXELS + + ' I + + + + + 600 WHITE 250 WHITE 845 WHITE + / 30 BLACK / 30BLACK \ + + + + + COMPRESSED CODES IN A CONTINUOUS BIT STREAM + + + + Figure I Bitonal Image Compression + + +Digitul Technical Journal Wtl, .? No. 4 Fa11 1991 13 + Image Processing,Video Terminals, and Printer Technologies + + + The platform for our most recent accelerator is them. The disk access time data from the DECimage +the VT1200 X window terminal, which uses the project analysis shown in Table 3 demonstrates that +local area transport (LAT) network protocol. We the disk file read time is a significant portion of the +soon realized that the X server packet size was overall response time. Thus, the display station +limited to 16 kilobytes and the typical A-size render time is the only area of the display response +compressed document was approximately 50 kilo- time which can be clearly intluencetl and is, there- +bytes. With this arrangement, each image transport fore, the main focus of our image accclcrators. The +would have required four large data packets and local processing that must occur a t the display sta- +four acknowledgment packets. Working with the tion is not a trivial task; an image must be tlecom- +X Window Terminal Base System Software Group, pressed, scaled, ant1 clipped to fit the user's current +we were able to raise the packet size limit to window size, and optionally rotated. +64 kilobytes. The base system group also imple- The decompression procedure inverts the com- +mented a delayed acknowledgment scheme, which pression process; both are computationally com- +eliminates the need for the client to wait for an plex. Input to the procedure is compressed data, +acknowledgment packet before sending the next and output is the original scan line pixel data, +data packet. Table 3 shows compressed image data which can be written to a display device. Scaling +taken during the DECimage 1200 dmiopment the data to fit the current window or fill a region +cycle. Notice that the network transport times of interest is not trivial either: a huge input data +for Digital document interchange format (DDIF) stream must be processed (the decompressed, orig- +decrease sharply aftcr the pacltct changes. inal file), and a moderate output data stream must + be created (the viewable image to be displayed). +Perceived Rendering Speed While simple pixel replicate and drop algorithms +Because the image scanning and compression may be used to scale the data, a more sophisticated +operations occur only once, they are not as scaling algorithm has been shown to greatly +performance-critical as the decompression and enhance the output image quality. +rendering for display operations, which are done In addition to scaling and clipping, the orthogo- +many times. Decompression and rendering are part nal rotation of images (in 90-degree increments) +of the system's display response time, which is a is a usefill function on a display station. Some docu- +critical factor in a system designed for high-volume ments may have words running in one direction +applications that access thousands of images daily while pictures are oriented another way, or the user +This time is measured from the instant the user may wish to view a portrait-mode image in land- +presses the key to select an image to view, to the scape mode. In either case, orthogonal rotation +moment the image is displayed completely on the can help the user understand the information; i.e., +screen. The display response time is a function of the increased time to rotate the view is warrantecl. +the disk read t h e , network transport time, and dis- When an image is scanned, particularly with a +play station render time. hand-held scanner, the paper is never perfectly + Although network transport time and disk file aligned. Thus, the image often requires a rotation of +read time have a direct effect on the response time, 1 to 10 degrees to make the view appear straight +accelerator developers rarely have any control over in the image file. However, multiple users want the + + +Table 3 DDlF lmage File Read Time and File Transport Performance + Network Transport Time + (milliseconds) + 7Disk Read Time 7 After Before +lmage Size (milliseconds) Packet Packet +(kilobytes) MicroVAX II VAX 8800 VAX 6440 Change Change + + + + + Vol. 3 No.4 Fa11 1991 Digital Tecl~tticalJozrr~rrrl + Hardware Acceleratorsfor Bitonal Image Processing + + +information from the document as quickly as pos- General Design Strategy +sible, and should not have to rotate the image by The number of applications using bitonal image +a few degrees to make it perfectly straight on the data continues to increase. In general, these appli- +screen. Therefore, this minimal rotation should cations attempt to offer low cost while achieving +be done after the initial scanning process; i.e., an interactive level of performance, defined as +only once, prior to indexing the material into no more than 1 second from point of request to +the database, and not by every user in a distributed complete image display. Ultimately, software may +environment. Because any form of rotation is provide this fi~nctionalitywithout hardware accel- +compute-intensive, allowing the user to perform eration, but today's software cannot. Moreover, the +minimal rotations at a high-volume view station parameters of image systems are not static; scan +would reduce the application's perceived ren- densities, overall image size, and the number of +dering speed and add little value to the station's images per database will all increase. These +function. increases will provide the most incentive for hard- + ware assist at the low end of the X window ter- +Final Legibility minals market, because software alone cannot +While the primary issue facing imaging applica- perform the amount of processing that users will +tions is data size, image viewing issues must also be expect for their investment. +addressed. In short, an effective bitonal imaging + The User Model Although a single model cannot +display system must be responsive to overall image + suit every application, imaging is centered on cer- +display performance and the resulting quality of + tain functions. Therefore, a user model built on +the image displayed. To enhance our products, we + these functions would be very useful in mapping +optimized the display performance parameters as + individual steps to the hardware: hardware versus +best we could, given that some parameters are not + software performance, the function's frequency of +under our control. Improvements to monitor reso- + use, and the cost of implementation. +lution and scanner densities continue to increase + The general user model for bitonal imaging sys- +the legibility of images. An affordable image system + tems is relatively simple. A small market exists for +should increase the image legibility by rendering + image entry stations, in which documents are +a bitonal image into a gray-scale image using stan- + scanned, edited, and indexed into a database. Wllile +dard image processing techniques. We discuss the + a high throughput rate is important at these sta- +method used in our accelerators, i.e., an intelligent +scale operation in the hardware pipeline, in the tions, a general-purpose image accelerator is not + the solution-dedicated entry stations already +next section. + exist in the market. Instead, we designed a general- + purpose platform, or versatile media view station, +Hardware Accelerator Design to be used for imaging applications alongside other +As explained in the previous section, transforming applications. The user model for this larger market +documents into a stream of electronic bits is not is a set of operations for viewing and manipulating +the demanding part of a bitonal imaging process images already entered into a database. The most +for document management. Also, scanners and common operations in this model are decompres- +dedicated image data-entry stations abound in the sion, scaling, clipping, orthogonal rotation, and +marketplace already. Instead, the challenge lies in: region-of-interest zooming. +(1) managing the image clata size to control +memory costs and reduce network slowdown; Display Performance and Quality Optimiz~~tion +(2) increasing the image rendering speed, i.e., The main thrust of the DECimage accelerator is to +decompress the image, scale it, and clip it to fit achieve interactive performance for the operations +the window size with optional rotation; and defined in the user model. A secondary goal is to +(3) increasing the quality of the displayed images. bring added value to the system by increasing the +This section describes the way our strategy quality of the displayed image compared to tlie +influenced the design of DECimage products. We quality of the scanned image. A side effect of maxi- +also discuss the chips used for decompression and mizing performance in hardware is that the main +scaling, and how Digital's existing client-server pro- system processor has work off-loaded from it, free- +tocols support these imaging hardware accelerators. ing it for other tasks. + + + +Digital TechnicalJozrmal 1'01.3 No. 4 Full 1991 15 + Image Processing, Video Terminals,and Printer Technologies + + + The general design of the accelerator uses a The most straightforwartl method of intcgr;ition is +pipelined approach. Since maximum performance to relocate the hardware from the prcscnt option +Is desired and a large amount of &ita must be p r o to the main system processor board; successive +cessed by the accelerator board, multiple passes steps of ititcgration would consolidate mapped +through the board are not feasible. Similarly, the tar- hardware to fewer total devices. The most cost- +geted low cost does not aIlow a whole image buffer effective integration will be the inclusion of the +on the board. With one exception (rotation), all mapped hardware in the processor in a way similar +board processing should be done in one pipeline, to a floating-point unit (1:1'1'). Just as graphics accel- +with the system processor simply feeding the input eration is now being incli~dedin system processor +end of the pipe and draining the output end. design, images will eventually achieve the status of +Because of the large amount of data to be read from a required data type and thus be supported in the +the board and displayed on the screen, the proees base system processor. +sor should onIy have to move that data, not do any +further operations o n it. To this end, any logic Product DeBnition- What Does the User +required to format the pixels for the display bitmap Want? +should be included in the pipeline. The previously clescribecl strategy was used in the + design of the image accelerator board for the +Cost Reduction through Less Expensive System DECimage 1200 systcm. Thc product requirements +Components The net cost of a bitonal imaging called for a low-cost, high-performance document +system is influenced by the capability of the assist image view station These reqi~irementsevolved +hardwdre. The capability of the hardware implies from the belief that most users currently investi- +flexibility in the choice of other system hardware. gating imaging systems are interested in applica- +In this regard, the most significant impact on cost tions and hardware that will enable them to quickly +occurs in the memory and the display. A system that and simultaneously view clocument images ant1 run +makes use of fast decompression and scaling hard- their existing no~~imagingapplications.These users +ware can quickly display compressed images from are involved with commercial and business appli- +memory. This means either more images can be cations, rather than scientific applications. The +maintained in the same memory, or the system can DECimage 1200 system was planned for the manage- +operate with less memory than it would without ment of insurance claims processing, hospital +the assist hardware; less memory means lower cost. patient medical recortls, bank records, and manu- + A more dramatic effect on system cost is in the facturing documents. As previously stated, the +display. Imaging systems generally need higher- imaging functions required for these view-oriented +density displays than nonimaging systems, but the applications are high-speed decompression, seal- +cost of a 150-dpl display is approximately twice the ing, rotation, zooming, and clipping. +cost of a 100-dpi display of the same dimensions. +However, we found that we could increase legibil- General Product Design +ity, i.e., expand a bitonal image to a gray-scale repre- In defining the image capable system, the key +sentation, by using an intelligent scale operation points in the product requirements list were +In the hardware pipeline. For example, a bitonal +image rendered to a 100-dpi display using the intel- High-performance image display +ligent scale process gives the perceived legibility Low cost +of the same image rendered to a 150-dpi clisplay +with a simple scaling method. That is, by adding the Bitonal images only (not gray-scale or color) +intelligent scale, a 100-dpi clisplay can be used View-only functions +where previously only a 150-dpi display would be +adequate. The need for high-performance display influ- + encecl the project team to design the hardware +Cost Reduction through Integration Presently, as accelerator board to handle imagc decompression, +in the L>E(:itnage 1200, hardware-assisted imagc scaling, and rotation. Previous performance test- +manipulation exists as a board-lcvel option. Higher ing on a 3-WJP (VAX-11/780 units of performance) +levels of integration with the base platlorm will CYU had yieldccl irn;tge software display times from +provide lower overall cost for an imaging system. 5 to 19 seconds. These images were compressetl + + + +16 Vr,I.3 No. 4 Fall 1991 Digital TechnicalJournc~l + Image Processing, Video Terminals, and Printer Technologies + + + + + INTERFACE MEMORY HARDWARE + + + + + SYSTEM ADDRESSIDATA BUS + + t t t + MEMORY MEMORY + + + + + Figure 3 VT1200 3j)sternArcbilect~~re + + + The rotillion circuit handles 90- and 270-degree to be decompressed before it can begin scaling; +rotation, whereas 180-dcgree rotation is hanclled instead, scaling begins as soon as the first byte of +in the data packing shift registers by changing the data is output from the decompressor Thus tlif- +shift direction. 'I'he circuit rotates an 8-by-8-bit ferent pieces of the image file are b e ~ n gdecom- +block of data at a time. The first byte of cight con- pressed, scaled, and rotatecl siniultaneousl~~. The +secutive scan lines is written into eight intlividual hardware pipeline also eliminates the need to +byte-wicle registers. The most significant bit (MSB) store the fully uncompressed image (approximately +of each of these registers is connected to the byte- 1 megabyte of clata for A-size 300-dpi images) in +wide rotation output port latch. A procchsor reatl memoly. The compressed image is wrltten from +of this port triggers a simultaneous shift in all of the system memory to the accelerator board and a +rotation data registers so that the next bit of each tleconipressetl, scaled, and clipped image is read +register is now latched at the rotation output port from the board. Because of the speed of the hard- +for the next read. Figure 5 diagrams the rotation ware, the software can redisplay an image with dif- +circuitry just described. ferent scaling, clipping, or rotation parameters; it + To achieve the best performance, we pipelinecl merely changes the harclware setup for the differ- +the h~nctionalblocks in the hardware. 'l'hc scaling ent parameters and sends the compressetl image +engine docs not need to wait for the entire image file back through the accelerator board pipeline. + + + + BUFFER RAM BUFFER + + + + + J- 4 + SYSTEM ADDRESSIDATA BUS + + t t + I COMMAND + AND STATUS + REGISTER I ROTATION + MATRIX + + + + + Figure 4 Block Diagram of DECint~~ge + 1200 Accelerator Hardtoare + + + +18 Ihl. .I IVO. 4 Fall I991 Digital TechnicalJournal + Hardware Acceleratorsfor Bitonal Image Processing + + + 8 SCAN LINES OF IMAGE DATA + 8-BYTE 8-BYTE 8-BYTE + . the word contain the number of consecutive white + or black pixels (called the run length). The upper + BLOCK BLOCK BLOCK + #1 #2 #3 bit of the word contains the run-length color code + I (0for a white run and 1 for a black run). An FLC is + read from the FIFO buffer and decoded into one of + elght routine types. Each routine is made up of sev- + 8x8 ROTATION + ROTATION OUTPUT eral states that control the color code toggling, run- + MATRIX REGISTER length adder, and accumulator circuits. At tlie end + of each routine, a new word containing the run- +SCAN LlNE 0 length and color information is written into a FIFO +SCAN LlNE 1 +SCAN LlNE 2 + buffer for the h a 1 stage. +SCAN LlNE 3 The final stage of the decompressor chip con- +SCAN LlNE 4 verts the run-length and color information to black +SCAN LlNE 5 or white pixels. This stage outputs these pixels in +SCAN LlNE 6 + 16-bit chunks when the scaling chip sends a signal +SCAN LlNE 7 + indicating a readiness to accept more data. + + + + n + 0 1 2 3 4 5 6 7 + Scaling Chip The primary purpose of the scaling + DISPLAY BYTE chip is to input high-resolution document images + (300 dpi) and scale them for display on a medium- + density monitor (100 dpi). The chip offers inde- + pendent scaling in the horizontal and vertical + Figure 5 Rotation Matrix + directions. The scaling design implemented in the + chip is a patented algorithm that maps the input +ASIC Design Description image space to the output image space. General +The ASIC design consists of a decompressor chip, 1v1-to-Npixel scaling is provided where M and N are +which decodes the compressed image data to pixel integers between 1 and 127, with the delta between +image data, and a scaling chip, which converts the them less than 65. IM represents the number of pix- +image from the input size to the desired display size. els in and N represents the number of pixels out (in + the approximated scale factor). +Deco7npressor Chip The decompressor chip acts Given an image input size and a desired display +as a CCI?T binary image decoder. The chip contains size, we must find the M and N scale Fdctors that +three distinct stages, which are pipelined for the best approximate the desired scale factor, within +most efficient data processing. Double buffering the range limits of M and N as previously stated. +of compressed input data is implemented to enable Thus an input width of 3300 and a desired out- +simultaneous input data loading and image decod- put width of 550 are represented by an PI of 6 and +ing to occur. Compressed data is loaded into the an N of 1. The approximatecl 1l.I and N values are +input buffer by the processor through a 16-or 32-bit loaded into the chip scale registers for downscaling +port. Handshaking controls the transfer of decom- or upscaling. +pressed data from the decompressor's 8-bit-wide The chip scaling logic uses the scale register val- +output bus to the scaling chip. ues to increment the input pointer position and + The first stage of the decompressor chip con- generate output pixels. A latched increment deci- +verts CC17T-standard Huffman codes, which are of sion term is updated every clock cycle, based on +variable-length, to 8-bit, fixed-length codes (FLCS).~ the previous term and the scale register values. +A sequential tree follower circuit is implemented When scaling down (where fewer pixels are output +to handle this conversion. Every Huffman code cor- than are input), tlie logic increments the input +responds to a unique path through the tree, which pointer position every clock cycle, but only out- +ends at a leaf indicating the FLC. The 8-bit FLC is puts a pixel when the increment decision term is +sent to a first-in, first-out (FIFO) buffer, which holds greater than or equal to zero. Figure 6a illustrates +the data for the second stage. how this algorithm maps input pixels to o u t p ~ i tpix- + The second stage of the chip generates a 16-bit, els for a sample reduction. When scaling up (where +run-length value from the FLC. The lower 15 bits of every input pixel represents at least one outpiit + + + +Digital Technical Journal Vol. 3 No. 4 Fa11 1991 19 + Image Processing,Video Terminals, and Printer Technologies + + + SCALE DOWN FROM 10 INPUT PIXELS TO 5 OUTPUT PIXELS + (M=ZANDN=l) + + + + + INPUT + + INCREMENT + DECISION D=l D=-l D = 1 D=-1 D = l D=-1 D = l D=-1 D = l D=-1 + REGISTER + + OUTPUT + 1 + + + + + (a) Downscaling + + + + SCALE UP FROM 3 INPUT PIXELS TO 9 OUTPUT PIXELS + (M=lANDN=3) + + + + + INPUT + + INCREMENT + DECISION D=-1 D = l D=-3 D=-1 D = l D=-3 D=-1 D=l D = 3 + REGISTER + + OUTPUT • + 1 2 + + + + + (6) Upscaling + + Figure 6 Chip Scaling Examples + +pixel), thc logic outputs a pixel every clock cycle, tion ancl display at the server using the hardware +but only increments the input pointer position accelerator board. Like the X I 1 protocol, the XIE +when the increment decision tern1 is greater than protocol consists of a client-side library called +or equal to zero. Figure 6b illustrates how this algo- XIElib, which provides client applications access +rithm maps input pixels to output pixels for a sam- to image routines, and a server-side piece, which +ple magnification. For both cases, the value of the executes the client requests. The xrE server imple- +pixel (black or white) being output is the value of ments support at two levels: device-independent +the input pixel pointed at during that clock cycle. and device-dependent. The device-dependent level +In this dcscription, simply substitute rows for pix- supports the functions that benefit from optimi- +els to reprcscnt the vertical scaling process. zation for a particular platform, or functions that + are implemented in hardware accelerators. The +Software Sz,lpportfor the Hardware device-independent level enables quick porting of +Software support is needed to enhance the func- functionality from platforrn to platform. Figure 7 +tions of the hardware accelerator in our imagc view illustrates the S/XIE client-server architecture. +station. As mentioned in the section General The client-side XlElib offers the minimum +Product Design, thc XIE protocol extends the X l l functions necessary for image rendition and dis- +core protocol to enable the transfer of compressetl play The toolkit level offers higher-level routines +images across the wire ant1 to cnable image rendi- that assist with windows application development. + + + +20 Ihl. .? IVO. 4 R111 1991 Digital Technical Journrrl + Hardware Acceleratorsfor Bitonal Image Processing + + + which is essentially as fast as the user can ask for + the displays. This speed is possible because the + image already resides in compressed form in the + server memory. Thus, the image does not have to + be read from the disk or transported across the + DECWINDOWS IMAGE + TOOLKIT TOOLKIT network. + + Future Image Accelerator + Requirements + Hardware accelerators will continue to be required + for bitonal imaging until software can provide the + same fiinctionality at the same performance level. + This section discusses the more complex image + schemes that are used for gray-scale imaging and + multimedia applications. In contrast to bitonal + imaging, these applications will require the use of + hardware accelerators well into the future. + Other applications will require richer user inter- + faces utilizing continuous-tone images, video, and + + uDISPLAY + audio. All of these new data types are generally + data-intensive, and compression or decompression + of any one of them is a significant processing bur- + den. Handling them in combination indicates that + Figure 7 W X I EArchitecttire the need for specialized hardware assistance will + persist for the foreseeable future. + +An example of a routine at this level might be Continuous-toneImages +ImageDisplay, which displays an image in a previ- Bitonal images are either black or white at each +ously created window. ImageDisplay parameters point, but some applications require smoothly +might include x and y scaling values, the rotation shaded or colored images. These images are typi- +angle, and region-of-interest coordinates. Whether cally referred to as continuous-tone images, a term +programming with the XIE protocol at the library that denotes either color or gray-scale, e.g., photo- +or toolkit level, applications developers benefit graphs, X rays, and still video. The representation +from the platform interoperability of the standard and required processing of this image format is +interface. Image accelerator hardware and opti- significantly different from that of bitonal images. +mized device-dependent XIE code changes the Continuous-tone images are represented by mul- +application's image display performance, but an tiple bits per pixel. This format allows a greater +application developed using the X E protocol can range of values for each pixel, which yields greater +run on any XlE-capable server. accuracy in the representation of the original + object. Additionally, each pixel can consist of mul- +Accelerator Performance Results tiple components, as in the case of color. The num- +With the DECimage 1200 X terminal, we have ber of bits used to represent a continuous-tone +achieved interactive performance rates, reduced image is chosen according to the nature of the +memory usage, and increased final image legibility. image. +We achieved these rates by transporting com- For example, medical X rays require a high +pressed files instead of huge pixel files and by imple- degree of accuracy. Consequently, 12 bits are gener- +menting specialized image processing hardware. ally regarded as the minimum acceptable for the +The DECimage 1200 can read, transport, decom- rendering of this class of image. Color images typi- +press, scale, and display an 8.5-by-11-inch bitonal cally require 8 bits per pixel for each component +document in 1 to 2 seconds. Successive displays, (YUV or RGB format) for a total of 24 bits per pixel. +i.e., rotating, region-of-interest zooming, panning Table 2 shows the relative size of samples of each +around the image, all occur in less than 1 second, image. The need to express these images in a + + +Digital Technical Journal Vol. .? No. 4 Full 1991 21 + Image Processing, Video Terminals, and Printer Techn + + +compressed format is obvious from the storage because any change to either the evolvilig standard +space rrequirements and the current storage media or a standard extension coulcl be easily introduced +limits. to the firmware. The fastest implementations arc + Tlie comprcssion of continuoi~s-toneirnagcs can achieved by special-purpose hardware accelerators. +be accomplisliecl in sever;il ways. Hornrevel; most The JPEG implementation tlocs not require harcl- +imaging applications are not closed systems; ware, i.e., the algorithm can be pcrformed corn- +inevitably, each system needs to rnanipul;lte images plctely in software. Tlie case for hardware assist +that are not of its own making. For this reason wc is made in performance. Table 5 clescribes tlie +aclopted the JPEG standard, wlhicl~specifics an ;~lgo- reduced instruction set compilter (IUSC) processor +rithm for the comprcssion of gray-scale and color performance, in millions of operations per second +images. Specifically, the JPEG compression methotl (mops), needed to provide the specified operation +is based 011 the two-dimensional (2D) discretc at a motion video rate of 30 frames per second.: +cosine transform (DCT). The D<:T decomposes an However, generic NSC processors of those speeds +8-by-8 rectangle of pixels into its 64 2D spatial- are not available today. Therefore, dedicated, cus- +frequency components. Tllc sum of these 64 2 D tom very large-scale integration (VLSI) devices +sinusoids exactly reconstructs the 8-by-8rectangle. (such ;I> the (:L550-10 from C-Cube Microsystems) +However, tlie rect;~ngleis approximated-and com- must be used to perform the operation^.^ Even +pression is achieved-by tliscarding most of the if the motion vidco rate is not required, the ASIC +64 components. 7'>,pically adjacent pixel values devices offer the simplest hartlware solution. +vary slowly, thus there is little energy in most of the +discarded high-frequency components. Live Video and Video Compression + The eclges of objects generally contribute to the + Video captures the natural progression of events in +high-frequency components of an image, whereas + an environment, and is therefore a natural and +the low-frequency components are made up of + efficient way to communicate. Consider, for exam- +intensities that vary more gradual ly. Tlie more + ple, the assembly of a set of components. One way +frequency components included in the approxi- + to express the assembly process is to show a series +mation, the more accurate the approximation + of photographs of the assembly at successive steps +becomes. Table 4 shows some sample JPEG image + of completion. As an alternative, vicleo can show +compression ratio^.^ + the actual assembly process from start to finish. + The most popul;tr part of the JPEG stantlard, + Subtle details of the process such as part rotations +the "baseline" method, was defined to be easily + and movements can be clearly conveyed, with tlie +mapped into software, firmware, or hardware. + added dimension of time. +Straightforward D(X' algorithms can be efficiently + Obviously, information expressed in video form +implemented in firmware for programmable DSP + can be valuable; howevel; significant problems arise +chips, due to their pipclined architecture. The first + in adapting video for use in computer systems. +systc1ns to embody the standarcl clitl so using DSPs, + First, the huge data size of vitleo applications can + strain the system's storage capability. Video can +Table 4 Typical Compression Parameters be characterized as a stream of continuous-tone + for JPEG images. Each of these images consists of pixel val- + ues with individual components making up each +Compression Compression Rendered Image pixel. For video to have full effectiveness, the still +Ratio Method Integrity images must be presented at video rates. In manjf + 2:l Lossless Highest quality- cases the rate to f a i t l ~ ~ l l y + reproduce motion is + no data loss 30 frames per secontl, which means that one + 12:l Lossy Excellent quality- minute of uncompressed video (512-by-480pixels + indistinguishable at 24 bits per pixel) would consume over 1 gigabyte + from the original of storage. In addition to storage demands, large + Lossy Good quality- volumes of data cause banclwiclth problems. + satisfactory for Presenting 30 frames per second to tlie video out- + most applications + put with the above parameters would require a + 1OO:l Lossy Low quality- + recognizable transfer rate of more than 22 megabytes per sec- + ond from the storage device to tlie video output. + + +22 1/01 .j No. 4 Fu/l I991 Digital Techlcical Jourrinl + Hardware Acceleratorsfor Bitonal Image Processing + + +Table 5 Processing Requirements for lmaging Functions + Processor +Imaging 7Processor Operations per Pixel* 7Operations +Functions Read Write ALUt Multiply Total at 30 fps (mops) +Pixel move .25 .25 0 0 .5 15 +Point operation 2 1 1 0 4 120 +3 x 3 convolve 9 1 8 9 27 810 +8 x 8DCT 24 1 14 16 65 1950 +8 x 8 block 128 1 191 0 320 9600 +matching +'RISC processor, 1M pixels, 30 frames per second (fps), 8 bits. +tALU = arithmetic logic unit + + + + +Thus, reducing the amount of data used to repre- Audio and Audio Compression +sent the video stream would alleviate both storage Video is usually accompanied by audio. The audio +and bandwidth concerns. can be reproduced as it was recorded (with the + The starting point for the compression of video video), or it can be mixed with the video from +is with still images and, as previously mentioned, a separate source (such as a compact disc (CD) +the JPEG algorithm can be used to compress still player). The audio data is defined by application +continuous-tone images. Because video can be rep- requirements. If the application allows lower +resented as a sequence of still images, the algorithm quality, the audio can be sampled at lower rates +could be applied to each still. This procedure with fewer bits per sample, such as telephony rates, +would produce a sequence of compressed video which are sampled at 8 kilohertz and 8 bits per +frames, each frame independent of the other sample. For applications requiring high-quality +frames in the sequence. (CD) audio, samples are usually taken at 44 kilo- + The evolving Motion Picture Experts Group hertz and 16 bits per sample. +(MPEG) standard takes advantage of frame-to-frame Integrating audio data into an application creates +similarities in a video sequence, thereby enabling special problems. The major characteristic that +more efficient compression than the application differentiates audio from the other data formats +of the JPEG algorithm alone.Vn most situations, presented here is its continuous nature. Audio +video sequences contain high degrees of similar- must flow uninterrupted for it to convey any mean- +ity between adjacent frames. The compression of ing. In video systems, the flow of frames may slow +video can be increased by encoding a frane using down under heavy system loading. The user may +only the differences from the previous frame. The never notice it, or may not be annoyed by it. Audio, +majority of scenes can be greatly compressed; how- however, cannot slow or stop. For this reason, large +ever, scene transitions, lighting changes, or condi- buffers are used to allow for load variations that +tions of extreme motion need to be compressed as may affect audio reproduction. +independent frames. A more subtle problem in creating applications + The need for hardware assist in this area is com- using audio is in synchronization. Audio data is +pelling. Table 5 shows that to sustain a SPEC; decorn- usually included to add another dimension of infor- +pression at 30 frames per second would require a mation to the application (such as speech). +1950-mops processor. The same result can be Without a method of synchronizing the video and +obtained using the CL550-10 JPEG Image Compres- audio, one data stream will drift out of phase with +sion P r o c e ~ s o r . ~ + Although this device does not the other. One way to include synchronization is to +make use of interframe similarities to increase com- use time stamps on the audio and video. This is par- +pression efficiency, a device implementing the ticularly useful because standard time codes are +MPEC standard would exploit these similarities. used in most production machines. +Table 5 shows that motion compensation, to be The compression of audio data is not as efficient +supported ;it 30 frames per seconcl, requires a as that of the other data formats. Since a statistical +9600-mops processor. approach to coding audio is highly dependent on + + +Digital Technical Journal Vol -3 No 4 F a l l 1991 23 + Image Processing, Video Terminals, and Printer Technologies + - + + + + +the t).pe of input (i.e.,voice, musical instrument), referenced. As the data is incorporated, it is com- +another method is requireel for gcncr;ilizetl inputs. pressed and storecl. Authors require the c;ip;ibility +Differential pulse code modu1;ition (t)I-'(:kl) is oftcn to edit anti mix vitleo and audio passages to get the +usecl to encocle ;iudio dat;~.DPCM cotles only the clz- desired result. Moreover, the video and auclio m;ijr +ference betm~eenadjacent sample values. Since the originate from different devices and may even be in +difference in value between samples is usually less different formats. +than the magnitude of the sample, modest compres- As clefined above, " t ~ s e rsystems" do not require +sion can be achieved ( 4 : l ) .The limitation using this all of the functions that authoring systems neecl: +technique is in the coding of high-frequency clat;~. only decompression is required in a typical user + II:ird\v;ire assist for the audio data format will system. Most existing user systems require at1 ana- +probahly come in the form of hardware to perform log video source (vitleodisk), which is purchased +functions other than compression. For instance, as part of the application. The device control is pel= +DSI-' algorithms can perform equalization, noise formed by the application, i.e., when a user selects +reduction, ;lnd special effects. a passage to be replayed, the application sends + commands to the videodisk. Figure 8 depicts an +Mu1tinzedin authoring system and a user system, along with +As the term implies, multimctlia may integrate all suggested 1/0 capability. +of the previously mentioned image formats. The Ncxt-generation multimedia platforms will make +word "may" is important in this co~itext.'l'his area fill1 use of digital vitleo and audio. This implies that +has been mainly technology-driven, due to such systems will be able to receive ancl transmit multi- +factors as lack of st;lnclards, clcveloping I/() clevices, media applications ant1 data over networks. This +insufficient system bandwidth, differing clat;~for- interactive capability miill improve the efficiency of +mats, and a vast amount of software integration. many munclane applications and devices. For exam- + It is currently a topic of debate nrhcther typical ple, electronic mail can be extended with video and +users will require the ability to cre;itc, as opposed audio annotations, or meetings can be transformecl +to only access. multimeclia source material. How- into vicleo teleconferencing. The adoption of com- +ever, for discussion purposes, multimedi;~plat- pletely digital data for multimedia also implies that +forms can be classified into two c;~tcgories: the platform I/O will change. Some user systems +authoring and user. Authoring refers to creation will not require analog device interfaces or control: +of multirneclia source material i111d requires differ- the user will load the ;ipplication over the network +ent c;~pabilitiesthan user platforms. In the creation or from at1 optic;~ldisk. +of a multirncdia application, data from many differ- Each of the image formats described in this +ent devices may need to be digitized and cross- section has different characteristics, and each will + + + + + VIDEOCASSETTE + VIDEODISK + RECORDER + + + I10 AND DEVICE 110 AND DEVICE + CONTROL + CONTROL + COMPRESSION1 + DECOMPRESSION + DECOMPRESSION + + + COMPACT + VIDEODISK + DISK + + + + NETWORK NETWORK + + + + +24 Vol .J No. 4 E:~~ll + I991 Digital Techiricnl Jonrnal + Hctrdware Acceleratorsfor Bitonal Image Processing + + +be presented in the embodiment of multimedia. References and Note +Given the size, processing requirements (compres +sion and decompression), and real-time demands of 1. Standardization of Group 3 Facsimile Appa- +applications, hardware assist will be a necessity. ratus for Doc~lnzent Transmission, CCITT + Recommendations, Volume vl-Fascicle VI1.3, +Summary Recommendation ~ . 4 + (1980). +Imaging is a unique data type with special sys- 2. Facsimile Coding Schemes and Coding Control +tem requirements. To achieve interactive rates of Functions for Group 4 Facsimile Apparatus, +bitonal image display performance today, hardware CCITT Recommendations, Volume Wl-Fascicle +accelerators are needed; that has been the primary WJ.3, Recommendation T.6 (1984). +focus of this paper, In the future, a general-purpose + 3. Digital Compression and Coding of Continuous- +processor should be able to handle the imaging pro- + Tone Still Images, Part I, Requirements and +cess at the necessary speed, ancl beyond that, the + Guidelines, ISO/IEC JTCl Draft International +processor should be affordable in a low-cost bitonal + Standard 10918-1(November 1991). +imaging system. However, the bitonal document +processing market will not wait; it is in a high state 4. J. Mauro, X Image Extension Concepts, Version +of growth and requires that products like accelera- 2.4 (Cambridge: MIT X Consortium, June 1988). +tors be developed for at least a few years. + 5. D. A. Huffinan, "A Method for the Construction + Continuous-tone documents and multimedia + of Minimum Redundancy Codes," Proceedings +applications will place an even heavier processing + IRE, V O ~ .40 (1962): 1098-1101. +load on an imaging system. These areas will require +accelerators for several years. As imaging applica- 6. G. K. Wallace, "The JPEG Still Picture Compres- +tions, including bitonal, expand to cover more mar- sion Algorithm," Communications of the ACM, +kets, the quality enhancements and performance vol. 34, no. 4 (April 1991): 30-44. +benchmarks met by accelerators today will set + 7 Table 5 is adapted from Y. Kim, "Image Com- +customer expectations. Consequently, our fiiture + puting Requirements for the 1990's: From Multi- +imaging products must be designed to meet these + media to Medicine," Proceedings of Electronic +expectations. + Imaging West (April 1991). +Acknowledgments 8. CL550JPEG Image Compression Processoq Pre- +The authors wish to express thanks to the liminary Data Book (San Jose, CA: C-Cube +X Window Terminal Hardware and Software Design Microsystems Inc., November 1990). +Groups for their support in developing the 9. Coding of fMoving Pictures ancl Associated +DECimage 1200 option. The two major ASICs used Audio, Committee Draft of Standard I S 0 11172: +in the design were developed for previous pro- ISO/MPEG 90/176 (December 1990). +jects, and those two design teams are also offered +our thanks. Special thanks to Frank Glazer and +Tim Hellman for their insightful research on the +image rendering process. + + + + +Digital TechnicalJournal Vo1.3 iVo. 4 Full 1991 25 + \ No newline at end of file diff --git a/xie/docs/dec/README.md b/xie/docs/dec/README.md new file mode 100644 index 0000000..106d6f0 --- /dev/null +++ b/xie/docs/dec/README.md @@ -0,0 +1,126 @@ +# DEC documentation relevant to the VT1200's XIE server + +Downloaded 2026-11-01. These are DEC's own documents, not the X Consortium +XIE 5.0 specification (that one is in `../../xc/doc/hardcopy/XIE/`). + +| file | what it is | XIE content | +|---|---|---| +| `DECimage-1200-install-use-EK-V120I-IN-001.pdf` | *Installing and Using the DECimage 1200 Video Terminal*, EK-V120I-IN-001, February 1991 | **The key document.** Appendix C ("X Window Image Extensions") states the terminal's XIE server "uses a subset of the XIE protocol", lists the supported functions (Table C–1) and the pipeline/scaling restrictions | +| `VT1200-user-guide-EK-V1200-UG-001.pdf` | *VT1200 Video Terminal User Guide*, EK-V1200-UG-001 | No XIE mention (checked: zero matches for `XIE` / `image extension`) | +| `VT1200-release-notes-V2.0-EK-V1200-RN-001.pdf` | *VT1200 Video Terminal V2.0 Release Notes*, EK-V1200-RN-001, July 1990 | No XIE mention | +| `DTJ-1991-v03-04-bitonal-image-accelerators.pdf` | Digital Technical Journal **Vol. 3 No. 4 (1991)**, article *Hardware Accelerators for Bitonal Image Processing* (pp. 11–27) | Describes the DECimage accelerator and the S/XIE client–server split; cites *X Image Extension Concepts, Version 2.4* (J. Mauro) in its references | +| `VXT2000-user-information-XIE3.0.pdf` | *VXT 2000+ / VXT 2000 Windowing Terminal User Information*, Appendix C | Later DEC terminal; says "The terminal supports Version 3.0 of the XIE protocol" and gives the XIE pipeline constraints for the accelerator | +| `DECwindows-Motif-OpenVMS-XIE-support.pdf` | *HP DECwindows Motif for OpenVMS New Features* (Alpha V8.3 documentation set) | States that DECwindows Motif shipped XIE from Motif V1.1, includes `XIE$SHRLIB.EXE` and C headers, and supports **XIE 3.0, "not the adopted standard of V5.0"** | + +Only PDFs and their `pdftotext -layout` renderings are kept; the renderings are +searchable and are what the quotes below come from. + +## What the DECimage 1200 manual says + +Appendix C, opening paragraph: + +> The DECimage 1200 terminal includes X window image extensions (XIE), an +> extension to the DECwindows server. […] The XIE server for the terminal uses +> a subset of the XIE protocol to display document-size, bitonal images only. + +The supported function list in Table C–1 is grouped as: + +- **Session services:** `XIEP_INIT_SESSION`, `XIEP_SET_OP_DEFAULTS`, + `XIEP_QUERY_OP_DEFAULTS`, `XIEP_TERM_SESSION` +- **Resource services:** `XIEP_CREATE_BY_VALUE`, `XIEP_CREATE_BY_REFERENCE`, + `XIEP_DELETE_RESOURCE`, `XIEP_QUERY_RESOURCE`, `XIEP_EXPORT`, + `XIEP_FREE_EXPORT`, `XIEP_QUERY_EXPORT` +- **Transport services:** `XIEP_SET_TRANSPORT`, `XIEP_ABORT_TRANSPORT`, + `XIEP_PUT_TILE`, `XIEP_PUT_STREAM` +- **Geometric:** `XIEP_SCALE`, `XIEP_ROTATE`, `XIEP_MIRROR`, `XIEP_CROP` +- **Process control:** `XIEP_EXECUTE_PHOTOFLO`, `XIEP_ABORT_PHOTOFLO`, + `XIEP_BIND_PHOTOFLO`, `XIEP_TAP_PHOTOFLO`, `XIEP_SELECT_EVENTS`, + `XIEP_QUERY_EVENTS` + +Restrictions stated there: pipelines may use only scale, crop, rotate, mirror +and export, at most one of each, must end with export, and are limited to 15 +definitions; decompression is CCITT Group 3/4 with scaled width ≤ 32768; +rotation is 0/90/180/270 only; `SET_OP_DEFAULTS` bits/pixel must be 1. This +matches the 1-bit StaticGray VT1200 server we are talking to. + +## What the DEC documents do **not** give us + +DEC's XIE protocol encoding — request numbers, request lengths, reply layouts — +is not in these manuals. The DECimage manual documents the *supported subset +and restrictions*, not the wire format. No public copy of the DECimage +"X Programmer's Reference Manual" / XIE 2.3 protocol specification was found +(the manual list names it, but the document itself is not online in the +collections searched). + +So the 2.3 wire differences currently come from two sources: + +- raw probes against the live server (`../../evidence/xie_wire_probe.txt`); +- the ROM's own dispatcher, recovered with Ghidra (`../../GHIDRA_XIE.md`). + +## Surviving software media (checked) + +DEC software media do survive, but the ones checked do **not** contain a 2.3 +client kit: + +- **ULTRIX 4.0 UWS tape** (`archive.org`, item `dec-ultrix-vax-4.0-tapes`, + `UWS_4.0A.tap`, 7.6 MB): the setld inventory lists DECwindows X servers, + fonts and applications — no `XIEproto.h`, `libXIE`, `XieInitialize` or + `xieperf`. +- **ULTRIX 4.2 unsupported tape** (`dec-ultrix-4.2-unsupported-tape`): no XIE + strings in the inventory. +- **ULTRIX VAX 4.2 unsupported CONDIST, August 1992** + (`dec-ultrix-vax-condist-1992-08`): its `cd_contents.dat` lists unsupported + layered products only — no DECwindows or DECimage. +- **DECwindows Motif for OpenVMS** is the product that did ship XIE on the + client side, but it is 3.0: "DECwindows Motif includes the XIE client side + shareable library (`XIE$SHRLIB.EXE`) and C language header files", and it + "supports V3.0 and not the adopted standard of V5.0". Surviving OpenVMS + CONDIST CDs and the Tru64/Digital UNIX Software Product Library (Jan 1999) + are therefore 3.0/5.0-era, not 2.3. +- **DECUS tapes** in the bitsavers archive are user-contributed software, not + DEC's XIE product kit. + +So the answer to "do DEC tape archives survive?" is: media survive, in some +quantity, but no archived kit found so far carries the VT1200's XIE 2.3 client +library or headers. The 2.3 protocol evidence therefore comes from the ROM and +from live probes, not from a recovered DEC SDK. + +## The closest surviving source: DEC/AGE's server implementation + +The X11R6.1 tree in this directory is not just the 5.0 client. It also contains +the server-side XIE implementation: + +``` +xc/programs/Xserver/XIE/dixie/request/session.c +xc/programs/Xserver/XIE/dixie/request/tables.c +xc/programs/Xserver/XIE/dixie/request/*.c +``` + +`session.c` says "Dean Verheiden -- AGE Logic, Inc March, 1993" and calls +`AddExtension(xieExtName, ...)` from `XieInit()`. This is the direct descendant +of the code in the VT1200 ROM, at protocol 5.0 rather than 2.3. It is the best +structural map for the Ghidra analysis: the 26-entry `ProcTable5_00[]`, the +`ProcQueryImageExtension` reply (8 preferred levels, matching the VT1200's +reply length), and the `REQUEST_SIZE_MATCH` length checks all have 2.3 +counterparts in ROM. The differences are what the Ghidra report is recovering. + +## Provenance + +- +- +- +- +- +- +- +- + +The DECimage and VT1200 files were fetched from the DECdocument mirror at +`decdoc.itsx.net`; the DTJ issue from the mirror at `mrynet.com`; the VXT 2000 +manual from `filibeto.org`. + +## Related DEC-derived material already in this tree + +`../../xc/doc/hardcopy/XIE/SI/xieSIarch.txt` — *XIE Sample Implementation +Architecture*, credited to DEC and AGE Logic, describing the sample +implementation (the one that became XIE 5.0, not the VT1200's 2.3 server). diff --git a/xie/docs/dec/VT1200-release-notes-V2.0-EK-V1200-RN-001.pdf b/xie/docs/dec/VT1200-release-notes-V2.0-EK-V1200-RN-001.pdf new file mode 100644 index 0000000..60bfedd Binary files /dev/null and b/xie/docs/dec/VT1200-release-notes-V2.0-EK-V1200-RN-001.pdf differ diff --git a/xie/docs/dec/VT1200-release-notes-V2.0-EK-V1200-RN-001.txt b/xie/docs/dec/VT1200-release-notes-V2.0-EK-V1200-RN-001.txt new file mode 100644 index 0000000..e5bdd8e --- /dev/null +++ b/xie/docs/dec/VT1200-release-notes-V2.0-EK-V1200-RN-001.txt @@ -0,0 +1,222 @@ + EK-V1200-RN-001 + + + + +VT1200 VIDEO TERMINAL V2.0 +RELEASE NOTES + + + + +This document describes problems, corrections, and restrictions that pertain +to V2.0 of the VT1200 Video Terminal firmware. + + + + +Digital Equipment Corporation + July 1990 +The information in this document is subject to change without notice and should +not be construed as a commitment by Digital Equipment Corporation. Digital +Equipment Corporation assumes no responsibility for any errors that may appear +in this document. +The software described in this document is furnished under a license and may +be used or copied only in accordance with the terms of such license. +No responsibility is assumed for the use or reliability of software on equipment +that is not supplied by Digital Equipment Corporation or its affiliated companies. +Restricted Rights: Use, duplication, or disclosure by the U. S. Government is +subject to restrictions as set forth in subparagraph ( c ) ( 1 ) ( ii ) of the Rights +in Technical Data and Computer Software clause at DFARS 252.227–7013. +Copyright © by Digital Equipment Corporation 1990 +All Rights Reserved. + + +FCC NOTICE: The equipment described in this manual generates, uses, and +may emit radio frequency energy. The equipment has been type tested and found +to comply with the limits for a Class A computing device pursuant to Subpart +J of Part 15 of FCC Rules, which are designed to provide reasonable protec- +tion against such radio frequency interference when operated in a commercial +environment. Operation of this equipment in a residential area may cause in- +terference, in which case the user at his own expense may be required to take +measures to correct the interference. +AT&T and UNIX are trademarks of American Telephone and Telegraph Com- +pany. +X Window System is a trademark of the Massachusetts Institute of Technology. +The following are trademarks of Digital Equipment Corporation: +DEC LA12, LA34, LA35 PDP ThinWire +DECconnect LA36, LA38, LA50 P/OS ULTRIX +DECmailer LA75 Companion Professional ULTRIX-32 +DECmate LA100, LA210 Q-bus UNIBUS +DECnet LJ250, LJ251 Q22-bus VAX +DECserver 200 LN01, LN03 Rainbow VAXstation +DECservice LN03 Plus ReGIS VMS +DECterm LQP02, LQP03 RSTS VT, VT52, VT100 +DECUS LQP45 RSX VT220, VT320, + VT420 +DECwindows MASSBUS RT VT1000, VT1200 +DECwriter MicroPDP Scholar +DIBOL MicroVAX SERVIcenter + + + +This document was prepared using VAX DOCUMENT, Version 1.2 + Contents +Chapter 1 Terminal Manager and VTE Windows +1.1 QUIT ENDS ALL CONNECTIONS . . . . . . . . . . . . . . . . . . . . . . . . 1–1 +1.2 TERMINAL MANAGER - CREATE . . . . . . . . . . . . . . . . . . . . . . . . 1–1 + 1.2.1 CREATE LAT X SESSION . . . . . . . . . . . . . . . . . . . . . . . . 1–1 + 1.2.2 TCP/IP X SESSION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1–2 +1.3 TERMINAL MANAGER - CUSTOMIZE . . . . . . . . . . . . . . . . . . . . 1–2 + 1.3.1 CUSTOMIZE SECURITY . . . . . . . . . . . . . . . . . . . . . . . . 1–2 + 1.3.2 CUSTOMIZE HOST AND PRINTER PORTS . . . . . . . . . 1–2 + 1.3.3 CUSTOMIZE LAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1–2 + 1.3.4 CUSTOMIZE FONT PATH . . . . . . . . . . . . . . . . . . . . . . . 1–3 +1.4 VTE - CUSTOMIZE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1–4 + 1.4.1 CUSTOMIZE GENERAL . . . . . . . . . . . . . . . . . . . . . . . . . 1–4 + 1.4.2 CUSTOMIZE 7-BIT NRCS . . . . . . . . . . . . . . . . . . . . . . . . 1–4 + 1.4.3 CUSTOMIZE PRINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1–4 + + + + + iii + Chapter 1 +Terminal Manager and VTE Windows + +1.1 QUIT ENDS ALL CONNECTIONS + Complete your work before using either the Terminal Manager Quit or + Remote Session Manager Quit. Both Quits are intended to return the + terminal to its initial state at the end of a work session. + +1.2 TERMINAL MANAGER - CREATE +1.2.1 CREATE LAT X SESSION + Session Manager and VMS + A problem can occur where a user cannot log into an X session on a host. + The terminal can still open VTE windows and pull down menus. The + watch cursor replaces the pointer. + If you have this problem, enter the command: + $ SHOW DEVICE TWA + If the host show a device number over 999, reboot the host. This action + will restore the VT1200’s ability to create X sessions. + To obtain a patch that permanently corrects this problem, contact your + Digital representative. + + + + + Terminal Manager and VTE Windows 1–1 + 1.2.2 TCP/IP X SESSION + Remote Pause Unsupported in UWS V2.1 + A difference between UWS V2.1 and UWS V2.2 prevents the successful + return from a Remote Session Manager Pause state in UWS V2.1. + +1.3 TERMINAL MANAGER - CUSTOMIZE +1.3.1 CUSTOMIZE SECURITY + TCP/IP BIND Name Service needs Names in Security + The Security authorization for TCP/IP requires that you only use decimal + dot notation (123.45.67.89) for the IP address of a remote system needing + access. However, if a BIND Name Server is available on the network and + it knows about the remote system, then you must use the name of the + remote system (eg, node.building.institution.area). + +1.3.2 CUSTOMIZE HOST AND PRINTER PORTS + Use Speed 19200 or 38400, not both + Due to a hardware limitation in the communications circuits, the speeds + 38.4Kbaud and 19.2Kbaud are mutually exclusive. All other speeds may + be mixed between the two serial ports, but only one or the other of the + two top speeds is available at one time. + + Diagnostic Port supported on Printer Port + When this mode is enabled, a printer attached to the printer port will + print out all messages that are displayed in the Terminal Manager + Message Region as they are received. You can control the messages that + are printed by selecting the appropriate message types in the Customize + Terminal Manager dialog box. + +1.3.3 CUSTOMIZE LAT + Software Update required for multiple Ethernet adaptors + If your system has multiple Ethernet adaptors to allow simultaneous + access to separate LANs, contact your Digital representative for an up- + dated copy of DECW$LAT_TRANSPORT.EXE. The new version provides + support for multiple link definitions. + + + + +1–2 Terminal Manager and VTE Windows + 1.3.4 CUSTOMIZE FONT PATH + Must Quit to Reset Font Path + Once a session makes use of the fonts, you can view the font path, but + you can’t change it until you quit out of the Terminal Manager. This + applies to all sessions including VTEs. The VTE does not require a font + path but will use host-based fonts for character and line attributes if + available. + + Link lost to font server requires quit to reset font path + If your link to the font service is disconnected, perhaps due to the font + server node shutting down, or due to a network problem, you will get + a message in the Terminal Manager window message area stating (for + example): + Session n to NODENAME terminated. Link lost with remote node. + Font path to node NODENAME lost. Reestablish font path before + starting X sessions. + Even if your other sessions to other nodes are still active, you need to + reset your font path to continue working. This is because the behaviors of + applications running on the terminal are not predictable when a request + for a new glyph or font fails. Therefore, you should close all sessions + and quit the terminal manager to restart the terminal and reset the font + path. + + Font compiler needed for non-DECwindows environments + If your VT1200 application requires fonts that are not in the DECwin- + dows library, you will need to get a font compiler to convert the fonts you + have to a format the VT1200 can use. A compiler is available through + the Internet that will convert the standard .BDF interchange format of + most fonts to the .DWF format of the VT1200. + The pcf font compiler is available on gatekeeper.dec.com in the + /pub/DEC/VT1000 directory. There are two files in that directory: + README pcf.tar.Z + The README file contains: + + + + + Terminal Manager and VTE Windows 1–3 + The file pcf.tar.Z in this directory contains the contents of + the contrib/server/pcf directory that is on tape4 of the MIT + X11R4 distribution. This code should allow you to build a + bdf->pcf compiler so that fonts can be generated that are + compatible with the VT1000 series terminals. + (Note that DEC’s .dwf format is also supported by the VT1000.) + and the pcf.tar.Z file is a compressed tar file containing the source code. + To retreive it via the internet, copy the files from: + gatekeeper.dec.com:~ftp/pub/DEC/VT1000 + If you cannot copy from the internet, contact your Digital representative. + +1.4 VTE - CUSTOMIZE +1.4.1 CUSTOMIZE GENERAL + Answerback only supports printable characters + Unlike the VT320, you cannot put control characters like CR or ESC into + the VTE answerback message. + +1.4.2 CUSTOMIZE 7-BIT NRCS + Choose NRCS to Match Keyboard + When using a VTE with a non-US Keyboard and 7-bit NRCS character + sets, you must manually use the VTE Customize 7-bit NRCS Selection to + choose an NRCS set to match the current keyboard language. Select the + corresponding language if you use a typewriter layout. Data Processing + keyboards in any language require the ASCII (North American) NRCS + set. This is a 7-bit issue only. + +1.4.3 CUSTOMIZE PRINT + VTE Printer Modes are user settable + Printer Modes are user settable from the Customize dialog box as well as + host settable by control functions. The buttons in the dialog box display + the mode that was set from either source. + + + + +1–4 Terminal Manager and VTE Windows + \ No newline at end of file diff --git a/xie/docs/dec/VT1200-user-guide-EK-V1200-UG-001.pdf b/xie/docs/dec/VT1200-user-guide-EK-V1200-UG-001.pdf new file mode 100644 index 0000000..98c391a Binary files /dev/null and b/xie/docs/dec/VT1200-user-guide-EK-V1200-UG-001.pdf differ diff --git a/xie/docs/dec/VT1200-user-guide-EK-V1200-UG-001.txt b/xie/docs/dec/VT1200-user-guide-EK-V1200-UG-001.txt new file mode 100644 index 0000000..993656a --- /dev/null +++ b/xie/docs/dec/VT1200-user-guide-EK-V1200-UG-001.txt @@ -0,0 +1,1491 @@ + USER’S INFORMATION MAP + + + + + Install and set up the terminal. Chapter 2 + + + + Install optional memory. Chapter 2 + + + + Start a session with your host. Chapter 3 + + + + Use a mouse and windows. Chapter 4 + + + + Use video terminal (VTE) windows. Chapter 5 + + + + Use the Terminal Manager. Chapter 6 + + + + Change operating settings. Chapter 7 + + + + Type additional characters. Chapter 9 + + + + Solve problems and get service. Chapter 11 + + + + Order options, cables, and documentation. Appendix B + + + + Perform system management tasks. Appendix D + + MA-0670-90A.DG + + + + +This document was prepared and published by Educational Services Development and +Publishing, Digital Equipment Corporation. + Installing and Using +The VT1200 Video Terminal +Order Number EK–V1200–UG–001 + + + + +Digital Equipment Corporation + First Edition, July 1990 + +The information in this document is subject to change without notice and should not +be construed as a commitment by Digital Equipment Corporation. Digital Equipment +Corporation assumes no responsibility for any errors that may appear in this document. + +The software described in this document is furnished under a license and may be used or +copied only in accordance with the terms of such license. + +No responsibility is assumed for the use or reliability of software on equipment that is not +supplied by Digital Equipment Corporation or its affiliated companies. + +Restricted Rights: Use, duplication, or disclosure by the U. S. Government is subject to +restrictions as set forth in subparagraph ( c ) ( 1 ) ( ii ) of the Rights in Technical Data +and Computer Software clause at DFARS 252.227–7013. + +Copyright © by Digital Equipment Corporation 1990 + +All Rights Reserved. +Printed in Taiwan. + +FCC NOTICE: The equipment described in this manual generates, uses, and may emit +radio frequency energy. The equipment has been type tested and found to comply with +the limits for a Class A computing device pursuant to Subpart J of Part 15 of FCC +Rules, which are designed to provide reasonable protection against such radio frequency +interference when operated in a commercial environment. Operation of this equipment in +a residential area may cause interference, in which case the user at his own expense may +be required to take measures to correct the interference. + +AT&T and UNIX are trademarks of the American Telephone and Telegraph Company. + +X Window System is a trademark of the Massachusetts Institute of Technology. + +The following are trademarks of Digital Equipment Corporation: +DEC DECwindows PDP ThinWire +DECall DECwriter P/OS ULTRIX +DECconnect DIBOL Professional ULTRIX-32 +DECmailer LA Q-bus UNIBUS +DECmate LA50 Q22-bus VAX +DECnet LA75 Companion Rainbow VAXstation +DECserver LN01, LN03 ReGIS VMS +DECservice LN03 PLUS RSTS VR150 +DECstation LQP02 RSX VT, VT52, VT100 +DECsupport MASSBUS RT VT220, VT320, VT420 +DECterm MicroPDP Scholar VT1200 +DECUS MicroVAX SERVIcenter + Contents + +About This Guide xi + + +1 A Look at the Terminal +VT1200 Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 + System Box . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 + Monitor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 + Keyboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 + Mouse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 +X Window Sessions and Video Terminal Sessions . . . . . . . . . . . . . . 3 + X Window System and DECwindows . . . . . . . . . . . . . . . . . . . . . . 3 +System Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 + VMS Systems: LAT Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 + UNIX and ULTRIX Systems: TCP/IP TELNET Protocol . . . . . . . 4 +How the Terminal Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 +Terminal Highlights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 + Customizing Your Terminal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 + Compatibility with VT Series Terminals . . . . . . . . . . . . . . . . . . . 7 + Character Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 +Programming the Terminal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 + + + + + iii + iv Contents + + + +Installing Your Terminal + +2 Installing Your Terminal +Site Preparation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 + Selecting a Location . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 +Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 +Installing Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 + Installing RAM Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 + Installing the ROM Board . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 + + +3 Getting Started +Terminal Manager Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 +Choosing the Display Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 +Choosing the Correct Keyboard Type . . . . . . . . . . . . . . . . . . . . . . . . 34 +Starting a Session on Your Host System . . . . . . . . . . . . . . . . . . . . . 35 + Starting a Video Terminal or X Window Session + on a VMS System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 + Starting a Video Terminal or X Window Session + on an ULTRIX or UNIX System . . . . . . . . . . . . . . . . . . . . . . . . . . 41 + Starting a Video Terminal Session on the Serial Host Port . . . . . 47 +Ending a Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 + + +Using Your Terminal + +4 Using Windows +DECwindows Differences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 +Before You Start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 + Using the Mouse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 + What Are Windows? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 +Using Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 + Selecting Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 + Moving Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 + Changing the Size of Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 + Shrinking Windows to Icons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 + Expanding Icons to Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 + Contents v + + + + Stacking Overlapping Windows . . . . . . . . . . . . . . . . . . . . . . . . . . 59 +Choosing Items from Pull-Down Menus . . . . . . . . . . . . . . . . . . . . . . 60 +Supplying Information in Dialog Boxes . . . . . . . . . . . . . . . . . . . . . . 61 + Moving and Changing Settings in a Dialog Box . . . . . . . . . . . . . . 63 +Using Scroll Bars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 + + +5 Using Video Terminal (VTE) Windows +VTE Window Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 +Clearing, Resetting, or Leaving the Session . . . . . . . . . . . . . . . . . . . 68 +Copying and Pasting Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 + Host Synchronization Required . . . . . . . . . . . . . . . . . . . . . . . . . . 70 + Selecting Text to Copy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 + Pasting Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 + Using QuickCopy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 +Customizing the VTE Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 + Displaying the Customize Menu . . . . . . . . . . . . . . . . . . . . . . . . . 74 + Saving and Recalling Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 + Changing Your VTE Window Settings . . . . . . . . . . . . . . . . . . . . . 76 + Changing Your VTE Display Settings . . . . . . . . . . . . . . . . . . . . . 78 + Changing Your VTE General Operating Features . . . . . . . . . . . . 80 + Changing Your VTE Keyboard Features . . . . . . . . . . . . . . . . . . . 84 + Choosing National Replacement Character Sets . . . . . . . . . . . . . 86 + Printing from a Video Terminal Window . . . . . . . . . . . . . . . . . . . 88 + + +6 Using the Terminal Manager +Terminal Manager Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 +Creating Sessions on a Host System . . . . . . . . . . . . . . . . . . . . . . . . 93 + Creating a Video Terminal Window on a VMS System . . . . . . . . . 95 + Creating an X Window Session on a VMS System . . . . . . . . . . . . 99 + Creating a Video Terminal Window or X Window Session on an + ULTRIX or UNIX System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 + Creating a Video Terminal Window on the Host or Printer Port + (VMS, ULTRIX, or UNIX) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 + Creating a TCP/IP X Window Session . . . . . . . . . . . . . . . . . . . . . 104 +Pausing or Ending Sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 + Pausing a Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 + vi Contents + + + + Ending a Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 +Customizing Your Terminal’s Environment . . . . . . . . . . . . . . . . . . . 109 +Printing the Screen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 + + +7 Customizing the Terminal Manager +Displaying the Customize Menu . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 +Saving and Recalling Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 +Changing Your Keyboard Settings . . . . . . . . . . . . . . . . . . . . . . . . . . 114 +Choosing the Display Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 +Changing Your Pointer and Mouse Settings . . . . . . . . . . . . . . . . . . . 118 +Changing Your Print Screen Settings . . . . . . . . . . . . . . . . . . . . . . . . 120 +Changing Your Security Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 +Locking Your Customize Dialog Boxes . . . . . . . . . . . . . . . . . . . . . . . 125 +Activating Customize Password Security . . . . . . . . . . . . . . . . . . . . 127 +Changing Your Window Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 +Controlling the Display of Messages . . . . . . . . . . . . . . . . . . . . . . . . 132 +Changing Your Host Port or Printer Port Settings . . . . . . . . . . . . . . 134 +Changing Your LAT Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 +Changing Your TCP/IP Settings +(ULTRIX and UNIX Systems) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 +Changing Your TCP/IP Name Server Settings . . . . . . . . . . . . . . . . . 144 +Changing Your TCP/IP Routing Table Settings . . . . . . . . . . . . . . . . 145 +Changing Your Font Path Settings . . . . . . . . . . . . . . . . . . . . . . . . . 147 + + +8 The Keyboard +LK401 Keyboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 + Keyboard Dialect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 + Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 +Main Keypad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 +Editing Keypad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 +Numeric Keypad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 +Top-Row Function Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 + Data Processing Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 + Compose Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 +Indicator Lights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 + Contents vii + + + +Audible Indicators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 + Keyclick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 + Bell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 + + +9 Typing Additional Characters +What Characters Can I Type? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 +Key Sequences with Nonspacing Diacritical Keys . . . . . . . . . . . . . . 162 +How to Type a Character Using the Compose Character Key . . . . . 163 +How to Type a Character Using the Group Shift Key . . . . . . . . . . . 163 +Invalid Sequences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 + Canceling or Restarting a Key Sequence . . . . . . . . . . . . . . . . . . . 164 +Hexadecimal Key Sequences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 + + +10 VTE Programming Summary +Locator Device Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 + Enable Filter Rectangle (DECEFR) . . . . . . . . . . . . . . . . . . . . . . . 171 + Enable Locator Reports (DECELR) . . . . . . . . . . . . . . . . . . . . . . . 172 + Locator Report (DECLRP) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 + Request Locator Position (DECRQLP) . . . . . . . . . . . . . . . . . . . . 175 + Select Locator Events (DECSLE) . . . . . . . . . . . . . . . . . . . . . . . . 176 +Programming Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 + + +11 Solving Problems and Getting Service +Operating Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 +Power-Up Self-Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 + Screen Error Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 +Digital Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 +How To Get Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 + viii Contents + + + +A Specifications +Site Planning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 +Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 +Electrical . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 +Display (Monochrome Monitors) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 +LK401 Keyboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 + + +B Options and Documentation +Optional Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 +Modems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 +Cables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 +Related Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 +Ordering Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 + + +C Communication +Network Protocols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 +Serial Communication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 + Serial Communication Cables . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 + Serial XON/XOFF Flow Control . . . . . . . . . . . . . . . . . . . . . . . . . . 200 +Modems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 + Modem Connections and Disconnections . . . . . . . . . . . . . . . . . . . 201 +Break Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 +Communication Connector Signals . . . . . . . . . . . . . . . . . . . . . . . . . . 202 +Pin Signals for the Pointing Device Connector . . . . . . . . . . . . . . . . . 204 +Standards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 + + +D System Management Tasks +Preparing the LAT Environment (VMS Systems) . . . . . . . . . . . . . . . 205 +Preparing the TCP/IP Environment (ULTRIX and UNIX Systems) . 206 +Running a Remote X Window Session on a VMS System . . . . . . . . . 215 + + +Glossary + Contents ix + + + +Tables +9–1 Keyboards with Diacritical Marks . . . . . . . . . . . . . . . . . . . . . 162 +9–2 Key Sequences for Additional Characters . . . . . . . . . . . . . . . 167 +10–1 Primary DA Alias Responses from the Terminal . . . . . . . . . . 183 +10–2 Control Function Requests (non-VT320) . . . . . . . . . . . . . . . . 183 +11–1 Operating Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 +C–1 6-Pin DEC-423 Communication and Printer Interface Signals 203 +C–2 Pin Assignments for the Pointing Device Connector . . . . . . . 204 + About This Guide + + +This guide is designed to help you install, operate, and maintain your +VT1200 video terminal. The guide provides information on how to open X +window or video terminal sessions on a VMS, ULTRIX, or UNIX system. + +Who Should Use This Guide +This guide is for the installer and general user of the VT1200 video +terminal. The guide also provides programmers with a summary of +control functions they can use when writing applications for video +terminal (VTE) windows. + +Organization +This guide contains the following chapters and appendices: +• Chapter 1, ‘‘A Look at the Terminal,’’ provides an overview of the + terminal and its features. +• Chapter 2, ‘‘Installing Your Terminal,’’ describes how to install your + terminal and connect it to a host computer system. The chapter also + describes how to install optional RAM and ROM boards. +• Chapter 3, ‘‘Getting Started,’’ describes how to start a session on your + host system. You can use the terminal with VMS, ULTRIX, or UNIX + systems. +• Chapter 4, ‘‘Using Windows,’’ describes how to to manipulate windows, + choose menu items, and edit text. The chapter also shows how to use + the mouse. +• Chapter 5, ‘‘Using Video Terminal (VTE) Windows,’’ describes how to + use video terminal (VTE) windows. VTE windows let you emulate + Digital’s VT series of text terminals. + + + xi + xii About This Guide + + + +• Chapter 6, ‘‘Using the Terminal Manager,’’ describes how to use the + Terminal Manager window. You use this window to begin and end + sessions with a host system. +• Chapter 7, ‘‘Customizing the Terminal Manager,’’ describes how + to customize the terminal’s operating settings for your computing + environment and personal preference. +• Chapter 8, ‘‘The Keyboard,’’ describes the function of the keyboard’s + keys, bells, and indicator lights. +• Chapter 9, ‘‘Typing Additional Characters,’’ describes how to enter + characters that do not appear as standard characters on your + keyboard (for example, accented letters). +• Chapter 10, ‘‘VTE Programming Summary,’’ provides programmers + with a quick-reference summary of VT1200 programming control + functions for video terminal (VTE) window applications. +• Chapter 11, ‘‘Solving Problems and Getting Service,’’ describes how to + solve typical operating problems and directs you where to get more + help. +• Appendix A, ‘‘Specifications,’’ lists the terminal’s specifications. +• Appendix B, ‘‘Options and Documentation,’’ lists options, related + documentation, and ordering information. +• Appendix C, ‘‘Communication,’’ provides technical information on + communication with a host computer system. The appendix describes + network protocols for LAT and TCP/IP connections, as well as serial + communication. +• Appendix D, ‘‘System Management Tasks,’’ describes tasks for system + managers to perform before installing and running the terminal. The + appendix also describes how to run a remote X window session on a + VMS system. +• The glossary defines new terms introduced in the text. + About This Guide xiii + + + +Conventions +The following conventions are used in this manual: + + +Mouse Refers to any pointing device, such as a mouse, a puck, or a + stylus. +MB1, MB2, and MB1 indicates the left mouse button. MB2 indicates the +MB3 middle mouse button. MB3 indicates the right mouse + button. (The buttons can be redefined by the user.) +Keyboard keys Keys or switches that are labeled appear in a box . + Example: Press the Return key. +Ctrl key For Ctrl key sequences, hold down Ctrl and press the other + key. +Warnings Provide information to prevent personal injury. +Cautions Provide information to prevent damage to equipment or + software. +Notes Provide general information about the current topic. +Glossary entries Appear in italics when first used in text. + +Note to the Reader +The screens and windows shown in this guide represent the latest +information available at the time of publication. Some screens and +windows may not exactly match those that appear on your terminal. + 1 + 1 + A Look at the Terminal + + +This chapter introduces you to the VT1200 video display terminal. The +chapter provides an overview of the terminal and its basic operating +features. The chapter also tells you where to look in this manual for more +information about each feature. +The VT1200 lets you run X window applications on your computer system, +including Digital’s DECwindows software. The VT1200 also provides +video terminal (VTE) windows that are compatible with VT series text +terminals. +You can use the terminal with one or more computer systems. The +VT1200 can work with computers that use the VMS, UNIX, or ULTRIX +operating systems. You have several options for connecting your terminal +to a computer. +You can use a mouse or keyboard to send information to the host system. +You can print data displayed on the screen by connecting a printer to the +terminal’s system box or by using printers connected to your host system. + + + + +Chapter 1 1 + 2 A Look at the Terminal + + + +VT1200 Components +The terminal has four main components: a system box, monitor, keyboard, +and mouse. + + + + + MA-0811-90.DG + + + + +System Box +The system box contains the terminal’s logic and memory boards. It also +provides the connectors for power, system communication, and other +devices. A cover panel attaches to the rear of the system box to conceal +the connectors and cables. The system box is 368 mm deep 394 mm +wide 57 mm high (14.5 inches 15.5 inches 2.25 inches). + +Monitor +The terminal comes with one of the following monochrome monitors: + VR315 (380 mm/15 inch) with tilt-swivel stand + VR319 (480 mm/19 inch) with tilt-swivel stand + VRE01 (480 mm/19 inch) flat panel display +When connected to a host system, the monitor displays information you +send to the host system and information the host system sends to you. +For more information about your monitor, see your monitor’s installation +guide. + +Chapter 1 + A Look at the Terminal 3 + + + +Keyboard +The keyboard has four groups of keys and two indicator lights. The +keyboard cable connects to the system box. Chapter 8 describes the +keyboard. + +Mouse +The mouse is a three-button pointing device. You use the mouse to make +selections from screen menus, enter data for graphics, or select points on +the screen. The mouse connects to the system box. Chapter 4 describes +how to use the mouse. + +X Window Sessions and Video Terminal Sessions +You can use two types of sessions on your host computers: + X Window Session + To use an X window session, you log in to a host and use that host’s + X window software. In an X window session, you can use all the + applications and utilities provided in the X Window System. For more + information about Digital’s X applications, see the VMS or ULTRIX + version of the DECwindows User’s Guide. + Video Terminal Session + You can use your VT1200 as a video text terminal. The VT1200 + has a video terminal (VTE) window that lets you log in to a host + as you would on a conventional video terminal. The VTE window + offers most of the features of Digital’s VT320 text terminal with some + enhancements. +You can open one X window session and several VTE sessions at the same +time. + +X Window System and DECwindows +The X Window System is a graphically oriented user interface that +lets you display one or more windows on the screen. Each window can +represent a different software application running on its own host system. +For example, you could run a word processing application in one window +and a spreadsheet application in another window. With windows, you can +perform many tasks in an easy and efficient manner. +The X Window System was designed at the Massachusetts Institute +of Technology. Digital’s DECwindows software is based on and fully +compatible with the X Window System. + + + Chapter 1 + 4 A Look at the Terminal + + + +System Requirements +You can use your terminal with the VMS, ULTRIX, and UNIX based +systems. + +VMS Systems: LAT Protocol +The VMS operating system is one of Digital’s operating systems. To make +network connections to a VMS host system, use the local area transport +(LAT) protocol. LAT is a communications protocol for connecting to VMS +host systems. +To open a video terminal (VTE) session: You can use any version of the +VMS operating system. +To open an X window session: You must have VMS Version 5.3-1 or higher +installed on your system, and your system manager must enable certain +options (Appendix D). + +UNIX and ULTRIX Systems: TCP/IP TELNET Protocol +The UNIX operating system was created by AT&T and is used throughout +the computer industry. The ULTRIX operating system created by Digitial +is based on the UNIX operating system. To make network connections +to a UNIX or ULTRIX host, you normally use the transmission control +program/Internet protocol (TCP/IP) networking software. TCP/IP is the +preferred communication protocol for UNIX-based systems. +The VT1200 uses the TCP/IP TELNET protocol to make network +connections to UNIX-based host systems. TELNET is the TCP/IP protocol +that lets terminals connect to host systems in a wide-area network. +To open a video terminal session: You can use any version of UNIX or +ULTRIX. +To open an X window session: You can use any version of UNIX to open +an X window session, as long as any X11R3 client is installed on that +host. ULTRIX workstation (UWS) versions 2.1 and higher include an +X11R3 client. + + + + +Chapter 1 + A Look at the Terminal 5 + + + +How the Terminal Works +You can use the VT1200 with one or more computer systems. You have +several options for connecting your terminal to a computer. You can +connect the terminal directly to a computer through one of two serial +ports, or you can connect the terminal indirectly through an Ethernet +network using the ThinWire port. +The computer system you connect to is called the host. You can connect +several VT1200 terminals to a single host or connect one VT1200 terminal +to several hosts. +You use the keyboard and mouse to interact with applications on your +system. You send data to the application by typing on the keyboard or +selecting window options with the mouse. Data sent by the application +appears as text or graphics on the screen. You can print text or graphics +from the terminal. + + + + VMS ULTRIX UNIX Other + System System System Hosts + + + + + Ethernet + + + + + Video Terminal + + Other Hosts + U L TR IX Serial Local + Order + Processing DECwindows Host + + + + + VMS U N IX Local + Serial + Customer Printer + ALL-IN-1 + Inquiry or Host + + + MA-0763-90A.DG + + + + + Chapter 1 + 6 A Look at the Terminal + + + +You can use a variety of host software applications on the terminal. For +example, your host may have applications for word processing, data entry, +programming, or business graphics. Most applications involve interactive +processing. This means the terminal immediately sends the information +you enter from the mouse or keyboard to the host. +Applications use programming functions to perform many operations. The +terminal can work with standard American National Standards Institute +(ANSI) functions. See Chapter 10. + +Terminal Highlights +The VT1200 terminal is a four-piece desktop unit that provides many +of the features of a workstation. The terminal provides you with the +following features: +• A workstation-style display, resolution, keyboard, and mouse +• An X Window System desktop server for efficient interaction with + DECwindows and X window applications +• A local window manager that lets you move and resize windows +• A local terminal manager that lets you create, manage, and delete + connections to hosts +• A local video terminal (VTE) window that lets you use the VT1200 as + a conventional video terminal +• Access to VMS, ULTRIX, and UNIX operating system software at the + same time +• Serial interfaces for a keyboard and a mouse or tablet +• Two serial lines with DEC-423 connectors for serial host + communication and printer support, like a traditional terminal +• A ThinWire Ethernet port to connect to an Ethernet network +• Two megabytes of RAM memory, with the option to add two more + megabytes + The RAM board is user installable. + + + + +Chapter 1 + A Look at the Terminal 7 + + + +Customizing Your Terminal +You can check and control the settings of the terminal’s operating +features. You can +• Change individual feature settings. +• Recall factory-default settings or your own stored settings from + memory. +• Make temporary changes for the current session or store new settings + for all future sessions. +Chapter 7 describes how to customize your terminal settings. + +Compatibility with VT Series Terminals +The VT1200 can operate as a video text terminal when you want to log +in to a host system as you would with a conventional video terminal. You +can use the terminal as one of Digital’s VT320, VT220, VT102, VT101, +or VT100 text terminals. Chapter 5 describes the video terminal (VTE) +window and how to use it. + +Character Sets +When you use video terminal (VTE) windows, you can choose different +character sets to match your computer system or software application +requirements. You can choose from: +• Two 8-bit multinational character sets—DEC Multinational or the + the ISO Latin Alphabet No. 1 set of the International Standards + Organization +• Several 7-bit national replacement character sets (NRCs) for Western + European languages +Chapter 5 describes how to choose characters sets. + +Programming the Terminal +The VT1200 video terminal (VTE) windows emulate Digital’s VT320 text +terminal. The VT320 Programmer Reference Manual explains the control +functions used to access the terminal’s video terminal (VTE) window +features. Chapter 10 of this user guide is a summary of VT1200 specific +control functions and commands. Programmers use these functions in +their applications. + + + + + Chapter 1 + Installing Your Terminal + 22 + Installing Your Terminal + + +This chapter provides step-by-step instructions on how to: + Prepare for installation. + Unpack, inspect, and check the terminal’s components. + Connect your terminal to a monitor, mouse, and keyboard. + Connect your terminal to a network. + Turn on your terminal. + Connect an optional printer, modem, or tablet. + Install an optional memory board. +Carefully read all installation instructions before you turn on the power. + +Site Preparation +Before you install your terminal, make sure your computer system has +the necessary network hardware and system software to support the +terminal. See your system manager to make sure these requirements are +met. + +For System Managers +System managers need to prepare the system for use with the terminal. +Appendix D describes the required tasks. + + + + +Chapter 2 11 + 12 Installing Your Terminal + + + +Network Hardware Support +The terminal requires one of the following physical connections to connect +to a host computer system: + +ThinWire Lets the terminal operate with X window applications and +connector multiple text terminal sessions, using either the LAT or TCP/IP + network protocol. You must use the ThinWire connector to operate + with X window or DECwindows software. +Serial Lets the terminal connect to a single host or terminal server as a +line traditional text terminal. + +System Software Support +The following table summarizes the system resources needed to open X +window sessions or video terminal (VTE) sessions: + + Operating Communication +Operation System Protocol + +Video terminal session VMS Version 4.0 LAT + + + UNIX (any version) TELNET (TCP/IP) + + + ULTRIX (any version) TELNET (TCP/IP) + UWS Version 2.2 LAT + + +X window session VMS Version 5.3-1 LAT + or higher + + + UNIX (any version) TCP/IP + TFTP (UDP) for font + service + + + UWS Version 2.1 TCP/IP + (includes ULTRIX TFTP (UDP) for font + Version 3.1) or higher service + + + + +Chapter 2 + Installing Your Terminal 13 + + + +Selecting a Location +Use the following guidelines to select a good location for your terminal: +• Select a surface area that is large enough to hold your system box, + monitor, keyboard, and mouse. +• Select a location near ac power outlets and communication connectors. +• Keep your terminal away from heaters, photocopiers, direct sunlight, + and abrasive particles. +• Do not block the air vents on the sides of the system box or place the + system box on its side. Blocking the air vents can cause the system to + overheat. +• To avoid screen glare, select a place where bright light will not reflect + off the monitor. +• Place your monitor so that the top line of the monitor display is at eye + level. +• Keep the air well circulated, to prevent excess heat and dust from + accumulating. +• Keep the temperature between 10° and 40° C (50° and 104° F), and + the relative humidity between 10% and 95%. +• Keep the area clean. Do not place food or liquid on or near your + terminal. + + + + + Chapter 2 + 14 Installing Your Terminal + + + +Installation + +Unpack and check the contents of each carton. +1. Look for external damage on the shipping cartons, such as dents, + holes or crushed corners. +2. Unpack the shipping cartons. + + WARNING + If necessary, use two people to lift or move the monitor out of + the shipping carton. The approximate weight of the monitor + is + • VR315 monitor (380 mm/15 inch): 13 kg (29 lb) + • VR319 monitor (480 mm/19 inch): 27 kg (60 lb) + • VRE01 monitor (480 mm/19 inch): 8 kg (15 lb) +3. Make sure you have all the items shown in the following figure. + Carefully inspect the components for shipping damage. If you have + missing or damaged items, contact your sales representative and + delivery agent. + + CAUTION + If you received optional memory boards, do not remove them + from the antistatic bag at this time. Static electricity can + damage memory boards. +4. Save the empty shipping cartons and packing material for repacking, + in case you move or relocate your terminal. + +Install any optional memory first. +If you ordered additional memory for your terminal, go to the ‘‘Installing +Memory ’’ section at the end of this chapter. You should install memory +boards in the system box before proceeding. + + + + +Chapter 2 + Installing Your Terminal 15 + + + + + 1 2 3 + + + TM + + + + + 4 5 + TM + + + + + i t al + di g + + + + +6 7 8 9 + + + + +10 11 12 13 + + + + + MA-0812-90.DG + + + + + Chapter 2 + 16 Installing Your Terminal + + + +Parts Checklist + +1 Monitor: VR315, VR319, or VRE01 +2 System box power cord +3 Monitor installation guide +4 System box +5 Mouse +6 DEC-423 communication cable +7 Monitor cable +8 Monitor power cord +9 Keyboard and legend strip +10 Ethernet cable and connector +11 EIA adapter (DEC-423 6-pin to 25-pin) +12 Installing and Using the VT1200 Video Terminal +13 Rear dress panel +Options (See ‘‘Installing Memory ’’ ) + SIMM card(s) + +NOTE +If you receive three power cords (a short one and two long ones), +the second long power cord is not needed for this installation. + +Place the system box on a level surface. Place the monitor +on top of the system box. +Leave enough room at the rear of the system box and monitor for +connecting cables. + +WARNING +If necessary, use two people to lift or move the monitor. + + + + +Chapter 2 + Installing Your Terminal 17 + + + +Connect the cables to the system box. +Perform the following steps to connect cables and prepare the system box +for use. The steps are keyed to the figures. + + + + 1 + + 2 + 3 + 4 + 234 + 1 + 5 + 5 + 6 6 + 7 + + + + + MA-0667-90.DG + + + + +1 Connect one end of the monitor cable to the monitor and the other end + to the system box. + If you have a VRE01 monitor, attach the cable-holding fixture to the + rear of the monitor before connecting the cable. +2 Set the monitor selection switch to match your monitor. + + Monitor Switch Position + + VR315 5 + VR319 2 + VRE01 3 + + + + + Chapter 2 + 18 Installing Your Terminal + + + + + 1 + + 2 + 3 + 4 + 234 + 1 + 5 + 5 + 6 6 + 7 + + + + + MA-0667-90.DG + + + + +3 Connect the mouse or graphics tablet to the system box. +4 Connect the keyboard to the system box. Lower the keyboard’s legs + and install the legend strip for the top-row keys. +5 Serial printer port: If you have a printer or secondary host computer, + connect the printer or host to the system box. +6 Serial host port: If you have a primary host computer or terminal + server, connect the host or server to the system box. +7 Connect the ThinWire Ethernet cable’s T-connector to the system box. + Connect the other end of the cable to your local area network. +Serial Baud Rate For serial communication, the terminal is initially set +to a baud rate of 9600. Use the setting that matches your host system. +To set the serial baud rate, see ‘‘Changing Your Host Port or Printer Port +Settings’’ in Chapter 7. + + + + +Chapter 2 + Installing Your Terminal 19 + + + + + 234 + 1 5 + 6 + + + + + 8 + 9 + 11 + + + + + 10 + + + MA-0668-90.DG + + + + +8 Make sure the | /O power switches on the system box and monitor + are off (O). Then connect the long power cord to the system box and a + grounded electrical outlet. +9 Connect the short power cord to the monitor and the system box. +10 Route all cables under the dress panel. Then push the dress panel + onto the rear of the system box. +11 Turn the monitor’s | /O power switch on by pressing ( | ). Turn the + system box’s | /O power switch on by pressing ( | ). + The keyboard sounds a bell tone, and a pie graph gradually fills in as + the terminal performs its self-tests. + When the tests are done, the keyboard bell tone sounds again and the + Terminal Manager window appears. + + + + + Chapter 2 + 20 Installing Your Terminal + + + +Final steps . . . +• If you had problems with the installation, review the installation steps + carefully. If the problem continues, refer to Chapter 11. +• This is a good time to set the brightness, contrast, and viewing angle + of your monitor. See your monitor’s installation guide for instructions. +• If you installed optional RAM memory, use the procedure at the end + of this chapter to verify that the system recognizes the additional + memory. +Otherwise, the installation procedure is complete. You can go to Chapter 3 +to begin using your terminal. + + + + +Chapter 2 + Installing Your Terminal 21 + + + +Installing Memory +This section describes how to install memory boards in the system box. +You can install +• Additional random access memory (RAM) +• A new read-only memory (ROM) board containing updated firmware +The terminal comes with 2 megabytes of RAM memory. You can add +1 or 2 more megabytes of optional RAM memory, for a total of up to 4 +megabytes. +Optional memory comes on 1-megabyte single in-line memory module +(SIMM) cards. You install the SIMM cards on the RAM memory controller +board. + +Unpack and check the contents of the box. +• If you are installing additional RAM memory + You receive one or two SIMM cards. +• If you are installing a ROM board + You receive a ROM board. +Carefully inspect the components for shipping damage. If you have any +missing or damaged items, contact your sales representative and delivery +agent. + +CAUTION +The memory boards and the SIMM cards can be damaged by +electrostatic discharge. Handle the memory board by its cover or +strap. Handle the SIMM card by the side edges of the card. + + + + + Chapter 2 + 22 Installing Your Terminal + + + +Remove the system box cover. +1. Use a grounding wrist strap and an antistatic mat to perform the + installation, if available. Otherwise, frequently touch the metal + chassis of the system box during installation, to neutralize any + existing static charges. +2. Turn the system box’s | /O power switch off (O). +3. Turn the monitor’s | /O power switch off (O). +4. Disconnect the two power cords from the rear of the system box. +5. Disconnect the monitor video cable from the rear of the monitor. +6. Remove the monitor from the top of the system box. You may need + two people. +7. Release the top cover of the system box by pressing in the two push + tabs on the side of the box with the power switch, as shown. +8. Slowly lift the top cover until you release the hinges on the other side + of the box. Then lift the top cover completely off the system box. + + + + + 234 + 1 5 + 6 + + + + + 22% + + + + GSF_0839_89.DG + + + + +Chapter 2 + Installing Your Terminal 23 + + + +Identify the components in the system box. +There are four major components in the system box. The memory +controller board is shown installed. SIMM cards install on the other +side of the memory controller board. +If you are installing optional RAM memory, go to the next section. +If you are installing a ROM board, go to the section ‘‘Installing the +ROM Board.’’ + +System Box Components + +1 System logic board +2 RAM memory controller board +3 ROM board +4 Power supply + + + + 2 + + + 3 + 1 + 4 + + + + + 234 + 1 5 + 6 + + + + + 22% + + + GSF_1362_89.DG + + + + + Chapter 2 + 24 Installing Your Terminal + + + +Installing RAM Memory +CAUTION +The memory controller board and the SIMM cards can be +damaged by electrostatic discharge. Handle the memory +controller board by its cover or strap. Avoid contact with any +components or circuitry within the system box. + +Remove the memory controller board. +1. Release the standoff clips by gently pushing each clip away from the + board and lifting up on the edges of the board. +2. Grasp the strap of the memory controller board and pull up firmly to + release the memory controller board connector from the system logic + board. +3. Place the board on top of the power supply’s metal cover, with the + strap side down. This prevents electrostatic damage. + + + + + 38% + + + + + GSF_0957_89.DG + + + + +Chapter 2 + Installing Your Terminal 25 + + + +Install the SIMM cards on the memory controller board. +1. Remove the SIMM cards from the shipping bag. +2. Place the SIMM cards on top of the power supply’s metal cover. Use + the metal cover as a work surface to install the SIMM cards on the + memory controller board. This prevents electrostatic damage. +3. The memory controller board already has one SIMM card installed + in the connector labeled 2MB. Install the next SIMM card in the + connector labeled 3MB and the last SIMM card in the connector + labeled 4MB, as follows: + + CAUTION + SIMM cards can be damaged by electrostatic discharge. + Handle the SIMM card by the side edges of the card. Avoid + contact with the gold contact fingers on the card. + a. Insert the SIMM card into the connector at a 45-degree angle. + Face the components on the SIMM card toward the components + on the memory controller board. Line up the center key slot on + the SIMM card with the connector key on the memory controller + board. + b. Push down on the top of the SIMM card to securely seat the card + in the connector. + c. Raise the SIMM card into a standup position, until both sides of + the card lock into the connector tabs. + + + + + Chapter 2 + 26 Installing Your Terminal + + + + + 4M + B + 3M + B + 2M + B + + + + % + 70 + at + DG + T. + DI + _E + RD + OA + _B + M + RA + + + + + 3M + B + + + + + 3M + B + + GSF_0840_89.DG + + + + +To remove the SIMM card: Gently push outward on the tabs at the +sides of the connector. Tilt the SIMM card forward at a 45-degree angle, +toward the edge of the RAM board. Grasp the edges of the SIMM card +firmly and lift the card out of the connector. + + + + +Chapter 2 + Installing Your Terminal 27 + + + +Install the memory controller board into the system box. +1. Grasp the strap of the memory controller board. +2. Carefully place the board on top of its connector and standoffs in the + system box. Use the standoffs as guides to align the connector on the + board with the connector in the system box. +3. Press down firmly on the board and its edges to seat the connector + and lock each of the four standoff clips. +4. Go to the section ‘‘Replace the system box cover.’’ + + NOTE + If you have problems, recheck the installation procedures + carefully. If the problem continues, contact Digital Customer + Services. + + + + + GSF_0842_89.DG + + + + + Chapter 2 + 28 Installing Your Terminal + + + +Installing the ROM Board +CAUTION +The ROM board can be damaged by electrostatic discharge. +Handle the ROM board by its cover or strap. Also avoid contact +with any components or circuitry in the system box. + +Remove the old ROM board from your system box. +1. Release the standoff clips by gently pushing each clip away from the + board and lifting up on the edges of the board. +2. Grasp the strap of the ROM board and pull up firmly to release the + ROM board connector from the system logic board. + Set the old ROM board aside. + + + + + 38% + + + + + 22% of full size + then imod scaled at 1.5 + + Use REMOVE_ROM_BASE.DG for fixes + + GSF_0958_89.DG + + + + +Chapter 2 + Installing Your Terminal 29 + + + +Install the new ROM board into the system box. +1. Remove the new ROM board from the box and shipping bag. +2. Grasp the strap of the new ROM board. +3. Carefully place the board on top of the ROM connector and standoffs + in the system box. Use the standoffs as guides to align the connector + on the board with the connector in the system box. +4. Press down firmly on the board and its edges to seat the connector + and lock each of the four standoff clips. +5. Continue to the next section to replace the system box cover. + +Replace the system box cover. +1. From the rear of the system box, place the left side of the top cover + onto the hinge tabs in the left side of the system box. +2. Gently lower the right side of the top cover onto the system box. Make + sure the power connector frame slides into the slot behind the power + connectors. +3. Push down on the right side of the top cover until it snaps into the + two push tabs, locking it in place. + +After Installing the Memory Controller Board or ROM Board... +If you are installing the terminal, go back to the beginning of this chapter +and continue the installation procedure. +If not, perform the following steps: +1. Place the monitor on top of the system box. Leave enough room to + connect cables on the rear of the system box and monitor. +2. Connect the two power cords to the rear of the system box. +3. Connect the monitor video cable to the rear of monitor. +4. Turn on the system box’s | /O power switch by pressing ( | ). +5. Turn on the monitor’s | /O power switch by pressing ( | ). + + + + + Chapter 2 + 30 Installing Your Terminal + + + +Verifying the Installation of Optional RAM Memory +The Terminal Manager window should be displayed on your screen. +Verify that the number on the right side of the Memory Remaining scale +displays the correct number of total megabytes in your system. + + +Standard + Optional = Number Displayed +2 megabytes 1 megabyte 3M + 2 megabytes 4M + +NOTE +If you have problems, recheck the installation procedures +carefully. If the problem continues, contact Digital Customer +Services. + + The installation procedure for optional memory is complete. + + + + +Chapter 2 + 33 + Getting Started + + +This chapter provides step-by-step procedures on how to begin using your +terminal with a host computer. The chapter also introduces some of the +terminal’s screens and menus. +If you are unfamiliar with using windows and a mouse, you may want to +read the information in Chapter 4 before continuing. +Before you start, you should set the terminal to use the desired display +language and keyboard type. By default, the terminal uses the English +language and the North American keyboard type. +You can use your terminal with the VMS, ULTRIX, or UNIX operating +systems. You can open two types of sessions on these systems—a video +terminal session or X window session. +The chapter includes sections on: +• Terminal Manager window +• Choosing the correct display language +• Choosing the correct keyboard type +• Opening a session on a VMS host system +• Opening a session on a UNIX or ULTRIX host system +• Ending a session + + + + +Chapter 3 31 + \ No newline at end of file diff --git a/xie/docs/dec/VXT2000-user-information-XIE3.0.pdf b/xie/docs/dec/VXT2000-user-information-XIE3.0.pdf new file mode 100644 index 0000000..5707daa Binary files /dev/null and b/xie/docs/dec/VXT2000-user-information-XIE3.0.pdf differ diff --git a/xie/docs/dec/VXT2000-user-information-XIE3.0.txt b/xie/docs/dec/VXT2000-user-information-XIE3.0.txt new file mode 100644 index 0000000..86a2646 --- /dev/null +++ b/xie/docs/dec/VXT2000-user-information-XIE3.0.txt @@ -0,0 +1,15164 @@ +VXT 2000+/VXT 2000 +Windowing Terminal +User Information +Order Number: EK–VXT20–UG. E01 + + +January, 1994 + +This document describes how to use the VXT 2000+ /VXT 2000 windowing +terminal with VXT Version 2.1 software. +Topics include +• Creating X window and terminal window sessions on a host system +• Customizing the terminal’s screens and operating features +• Using VXT software or VXT EX (essential X server) software +• Programming with the X windows image extension (XIE) +Internet Address for Reader Comments +You can send your comments and suggestions about this guide and other +VXT manuals by electronic mail to the following Internet address: +docteam@gwen.enet.dec.com + + + + +Revision/Update Information This is a revised document. +Operating System & Version: InfoServer Version 2.2 + OpenVMS VAX Version 5.4–2 + OpenVMS AXP Version 1.5 + ULTRIX Version 4.2 + DEC OSF/1 AXP Version 1.2 + SunOS Version 4.1.2 + HP–UX Version 8.05 + IBM AIX Version 3.1 + SCO ODT Version 1.1 +Software Version: VXT Version 2.1 +Digital Equipment Corporation +Maynard, Massachusetts + First Edition, January 1992 +Fifth Edition, January 1994 +Possession, use, or copying of the software described in this publication is authorized only +pursuant to a valid written license from Digital or an authorized sublicensor. +© Digital Equipment Corporation 1992, 1994. All Rights Reserved. +The following are trademarks of Digital Equipment Corporation: AXP, DEC, DECconnect, +DECdirect, DECimage, DEClaser, DECnet, DECserver, DECterm, DECwindows, Digital, LA, +LA50, LA75 Companion, LA324, LAT, LN03, OpenVMS, ReGIS, Scholar, ThinWire, ULTRIX, +VAX DOCUMENT, VMS, VT, VT52, VT100, VT300, VT320, VXT 2000, and the DIGITAL logo. +AT&T is a trademark of American Telephone & Telegraph Co. +HP and LaserJet are registered trademarks of Hewlett-Packard Company. Domain is a +registered trademark of Apollo Computer, Inc., a subsidiary of Hewlett-Packard Company +IBM is a registered trademark of International Business Machines Corporation. +MS–DOS is a registered trademark of Microsoft Corporation. +POSTSCRIPT is a registered trademark of Adobe Systems, Inc. +UNIX is a registered trademark licensed exclusively by X/Open Co. Ltd. +Open Look is a registered trademark of UNIX System Laboratories, Inc. +OSF, OSF/1, and Motif are trademarks of The Open Software Foundation, Inc. +Sun, Solaris, and NFS are trademarks of Sun Microsystems, Inc. + + + +This document was prepared using VAX DOCUMENT Version 2.1. + Contents + +About This Guide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii + +1 A Look at the Terminal + 1.1 Terminal Highlights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 + 1.2 How the Terminal Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 + 1.3 VXT Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 + 1.4 VXT EX Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 + 1.5 Memory Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 + 1.5.1 Monitoring Memory Use (Host-Based Terminals) . . . . . . . . . . 6 + 1.6 X Window Sessions and Terminal Window Sessions . . . . . . . . . . . 6 + 1.7 Customizing Your Terminal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 + 1.8 Compatibility with VT Series and 3270 Terminals . . . . . . . . . . . . 9 + 1.8.1 Character Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 + +2 Using the Terminal + 2.1 Terminal Manager Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 + 2.1.1 VXT Message Box . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 + 2.1.2 Closing the Terminal Manager Window and VXT Message + Box . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 + 2.2 Creating Sessions and VXT Applications . . . . . . . . . . . . . . . . . . . 14 + 2.2.1 Displaying the Create Dialog Box . . . . . . . . . . . . . . . . . . . . . 14 + 2.2.2 Starting LAT or Serial Sessions . . . . . . . . . . . . . . . . . . . . . . . 15 + 2.2.3 Starting a DECnet Session . . . . . . . . . . . . . . . . . . . . . . . . . . 16 + 2.2.4 Starting an IP Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 + 2.2.4.1 Optional Buttons for Specifying IP Hosts . . . . . . . . . . . . . 18 + 2.2.5 Starting VXT Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 + 2.2.6 Starting Remote Applications . . . . . . . . . . . . . . . . . . . . . . . . 21 + 2.2.7 Preferred Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 + 2.2.8 Creating Sessions from a Menu: Preferred Services . . . . . . . 23 + 2.3 Autostarting, Pausing, or Ending Sessions . . . . . . . . . . . . . . . . . 24 + 2.3.1 Autostarting a Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 + + + iii + 2.3.2 Pausing a Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 + 2.3.3 Ending All Sessions and Restarting VXT Software . . . . . . . . 27 + 2.3.4 Ending Individual Sessions . . . . . . . . . . . . . . . . . . . . . . . . . . 27 + 2.4 Checking Network and Terminal Status . . . . . . . . . . . . . . . . . . . 28 + 2.5 Working with Multiple Remote X Session Managers . . . . . . . . . . 28 + 2.6 Using the Open Look Window Manager from Sun Systems . . . . . 29 + 2.7 Customizing Your Terminal’s Environment . . . . . . . . . . . . . . . . . 32 + 2.8 Printing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 + 2.8.1 Printing the Screen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 + 2.8.2 Printing from a Host System . . . . . . . . . . . . . . . . . . . . . . . . . 34 + 2.9 Getting Started Menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 + +3 Customizing the Terminal + 3.1 Displaying the Customize Menu . . . . . . . . . . . . . . . . . . . . . . . . . 39 + 3.2 Saving and Restoring Terminal Manager Settings . . . . . . . . . . . . 40 + 3.3 Changing Your Keyboard Settings . . . . . . . . . . . . . . . . . . . . . . . . 41 + 3.4 Choosing the Display Language . . . . . . . . . . . . . . . . . . . . . . . . . . 44 + 3.5 Changing Your Pointer and Mouse Settings . . . . . . . . . . . . . . . . . 45 + 3.6 Changing Your Print Screen Settings . . . . . . . . . . . . . . . . . . . . . . 48 + 3.7 Changing Your Security Settings . . . . . . . . . . . . . . . . . . . . . . . . . 50 + 3.8 Changing Your Screen Background . . . . . . . . . . . . . . . . . . . . . . . 52 + 3.9 Changing Your Window Colors . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 + 3.10 Changing Your Terminal Manager Settings . . . . . . . . . . . . . . . . . 56 + 3.11 Changing Your Video Alignment Settings (VX227 Models) . . . . . . 60 + 3.12 Saving the Terminal Manager Window’s Position and Size . . . . . 61 + 3.13 Customizing the VXT Message Box . . . . . . . . . . . . . . . . . . . . . . . 61 + 3.13.1 Saving the VXT Message Box’s Position and Size . . . . . . . . . 63 + +4 Customizing Communications + 4.1 Displaying the Communications Submenu . . . . . . . . . . . . . . . . . . 65 + 4.2 Changing Your Serial and Parallel Port Settings . . . . . . . . . . . . . 66 + 4.3 Changing Your LAT Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 + 4.4 Changing Your LASTport Group Code Settings (InfoServer + Systems) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 + 4.5 Changing Your TCP/IP IP Address Settings . . . . . . . . . . . . . . . . 73 + 4.6 Changing Your TCP/IP Name Server Settings . . . . . . . . . . . . . . . 74 + 4.7 Changing Your TCP/IP Routing Table Settings . . . . . . . . . . . . . . 76 + 4.8 Changing Your NFS Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 + 4.9 Changing Your DECnet Address Settings . . . . . . . . . . . . . . . . . . 81 + 4.10 Changing Your DECnet Name Translator Settings . . . . . . . . . . . 82 + + + +iv + 5 Customizing Fonts and Startup Settings + 5.1 Displaying the Customize Menu . . . . . . . . . . . . . . . . . . . . . . . . . 85 + 5.2 Changing Your Configuration Manager Settings . . . . . . . . . . . . . 85 + 5.3 Changing Your Font Path Settings . . . . . . . . . . . . . . . . . . . . . . . 86 + 5.3.1 Entering a Font Path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 + 5.4 Changing Your X Server Settings . . . . . . . . . . . . . . . . . . . . . . . . . 93 + 5.5 Changing Your Startup Settings . . . . . . . . . . . . . . . . . . . . . . . . . 94 + 5.6 Specifying Your AutoStart Settings . . . . . . . . . . . . . . . . . . . . . . . 95 + 5.7 Changing Your Boot Settings for VXT Software . . . . . . . . . . . . . . 98 + 5.7.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 + 5.7.2 Using Host-Based Operation . . . . . . . . . . . . . . . . . . . . . . . . . 100 + 5.7.3 Using Server-Based Operation . . . . . . . . . . . . . . . . . . . . . . . . 102 + 5.7.4 Customize Boot Dialog Box Description . . . . . . . . . . . . . . . . . 105 + 5.7.5 Entering Boot Commands to Load VXT Software . . . . . . . . . 108 + 5.8 Changing Your Software Options Settings . . . . . . . . . . . . . . . . . . 110 + 5.9 Using Customized Resource Files . . . . . . . . . . . . . . . . . . . . . . . . 113 + +6 Checking the Terminal’s Status + 6.1 Displaying the Status Submenu . . . . . . . . . . . . . . . . . . . . . . . . . . 115 + 6.2 Checking a TCP/IP Host System . . . . . . . . . . . . . . . . . . . . . . . . . 115 + 6.3 TCP/IP Routes Dialog Box . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 + 6.4 Displaying LAT and Ethernet Counters . . . . . . . . . . . . . . . . . . . . 118 + 6.5 Monitoring the Terminal’s Memory and Network Use . . . . . . . . . 123 + 6.6 Checking the Terminal’s System Configuration . . . . . . . . . . . . . . 124 + +7 Using VXT DECterm Windows + 7.1 The VXT DECterm Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 + 7.2 Copying and Pasting Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 + 7.2.1 Host Synchronization Required . . . . . . . . . . . . . . . . . . . . . . . 130 + 7.2.2 Selecting Text to Copy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 + 7.2.3 Pasting Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 + 7.2.4 Using Quick Copy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 + 7.2.5 Extending Your Selected Text . . . . . . . . . . . . . . . . . . . . . . . . . 132 + 7.3 Clearing or Resetting the Window . . . . . . . . . . . . . . . . . . . . . . . . 133 + 7.4 Using Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 + 7.5 Printing the DECterm Window . . . . . . . . . . . . . . . . . . . . . . . . . . 135 + 7.6 Exiting from a VXT DECterm Window . . . . . . . . . . . . . . . . . . . . 137 + + + + + v + 8 Customizing VXT DECterm Windows + 8.1 Displaying the Options Menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 + 8.2 Saving and Restoring VXT DECterm Option Settings . . . . . . . . . 140 + 8.3 Changing Your Window Settings . . . . . . . . . . . . . . . . . . . . . . . . . 142 + 8.3.1 Using Fonts on Your Host System or InfoServer . . . . . . . . . . 146 + 8.4 Changing Your Display Settings . . . . . . . . . . . . . . . . . . . . . . . . . 148 + 8.5 Changing Your General Operating Features . . . . . . . . . . . . . . . . 150 + 8.6 Changing Your Keyboard Features . . . . . . . . . . . . . . . . . . . . . . . 154 + 8.7 Choosing National Replacement Character Sets . . . . . . . . . . . . . 156 + 8.8 Changing Your Graphics Display Settings . . . . . . . . . . . . . . . . . . 157 + 8.9 Changing Your Printer Settings . . . . . . . . . . . . . . . . . . . . . . . . . . 158 + +9 Using VXT 3270 Windows + 9.1 VXT 3270 Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 + 9.2 Before You Start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 + 9.3 Creating a VXT 3270 Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 + 9.4 Entering 3270 TE Connection Parameters . . . . . . . . . . . . . . . . . . 163 + 9.5 Using the VXT 3270 Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 + 9.5.1 Using the VXT 3270 Window Work Area . . . . . . . . . . . . . . . . 167 + 9.5.2 Working in the Display Area . . . . . . . . . . . . . . . . . . . . . . . . . 168 + 9.5.3 Understanding Operator Information . . . . . . . . . . . . . . . . . . 169 + 9.5.4 Entering Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 + 9.5.5 Editing Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 + 9.5.6 Printing Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 + 9.5.7 Copying and Pasting Text . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 + 9.5.8 Selecting Text to Copy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 + 9.5.9 Pasting Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 + 9.5.10 Using Quick Copy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 + 9.5.11 Extending Your Selected Text . . . . . . . . . . . . . . . . . . . . . . . . . 173 + 9.5.12 Copying and Pasting With the Keyboard Only . . . . . . . . . . . . 173 + 9.5.13 Recording and Playing Back Key Sequences . . . . . . . . . . . . . 174 + 9.5.14 Using the Numeric Keypad to Enter Numbers . . . . . . . . . . . 175 + 9.5.15 Saving Current Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 + 9.5.16 Viewing Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 + 9.5.17 Viewing Keyboard Layout Maps . . . . . . . . . . . . . . . . . . . . . . . 176 + 9.5.18 Viewing the Function List . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 + 9.5.19 Viewing Your Connection Parameters . . . . . . . . . . . . . . . . . . 177 + 9.5.20 Viewing Field Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 + 9.5.21 Using the MB3 Pop-Up Menu . . . . . . . . . . . . . . . . . . . . . . . . 178 + 9.5.22 Exiting from a VXT 3270 Window . . . . . . . . . . . . . . . . . . . . . 179 + + + + +vi + 10 Customizing VXT 3270 Windows + 10.1 Customizing the VXT 3270 Window . . . . . . . . . . . . . . . . . . . . . . . 180 + 10.1.1 Customizing Key Definitions . . . . . . . . . . . . . . . . . . . . . . . . . 180 + 10.1.2 Saving and Loading Custom Key Definitions . . . . . . . . . . . . . 182 + 10.1.3 Modifying VXT 3270 Window Options . . . . . . . . . . . . . . . . . . 183 + 10.1.4 Using the Selector Mouse Function . . . . . . . . . . . . . . . . . . . . 184 + 10.2 Using VXT 3270 Keyboard Functions . . . . . . . . . . . . . . . . . . . . . 184 + 10.2.1 Key Functions Defined . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 + 10.3 Translation Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 + +11 Using Windows + 11.1 Using the Mouse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 + 11.1.1 Pointer Shapes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 + 11.2 Working with Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 + 11.2.1 What Are Windows? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 + 11.2.2 Selecting the Active Window . . . . . . . . . . . . . . . . . . . . . . . . . 199 + 11.2.3 Moving Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 + 11.2.4 Changing the Size of Windows . . . . . . . . . . . . . . . . . . . . . . . . 200 + 11.2.5 Reducing Windows to Icons . . . . . . . . . . . . . . . . . . . . . . . . . . 201 + 11.2.6 Raising and Lowering Stacked Windows . . . . . . . . . . . . . . . . 202 + 11.3 The Window Menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 + 11.3.1 Using the Workspace Submenu . . . . . . . . . . . . . . . . . . . . . . . 204 + 11.4 Working With Menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 + 11.4.1 Choosing Items from Pull-Down Menus . . . . . . . . . . . . . . . . . 206 + 11.4.2 Choosing Items from Pop-Up Menus . . . . . . . . . . . . . . . . . . . 207 + 11.4.3 Choosing Items from Options Menus in Dialog Boxes . . . . . . 208 + 11.5 Supplying Information in Dialog Boxes . . . . . . . . . . . . . . . . . . . . 208 + 11.5.1 Dimmed Items in Menus and Dialog Boxes . . . . . . . . . . . . . . 210 + 11.5.2 Moving and Changing Settings in a Dialog Box . . . . . . . . . . . 210 + 11.6 Using Scroll Bars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 + +12 Customizing Windows + 12.1 Displaying the Options Submenu . . . . . . . . . . . . . . . . . . . . . . . . . 214 + 12.2 Saving and Restoring Window Option Settings . . . . . . . . . . . . . . 215 + 12.3 Changing Your Workspace Settings . . . . . . . . . . . . . . . . . . . . . . . 216 + 12.4 Changing Your Border Settings . . . . . . . . . . . . . . . . . . . . . . . . . . 218 + 12.5 Changing Your Border Color Settings . . . . . . . . . . . . . . . . . . . . . 220 + 12.6 Changing Your Icon Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 + 12.7 Changing Your Icon Color Settings . . . . . . . . . . . . . . . . . . . . . . . 223 + 12.8 Changing Your Matte Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 + + + vii + 12.9 Changing Menu, Button, and Key Bindings . . . . . . . . . . . . . . . . . 226 + +13 Launching Applications + 13.1 Launching Sessions and Applications . . . . . . . . . . . . . . . . . . . . . 232 + 13.2 Launching Sessions and VXT Applications with the Window + Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 + 13.2.1 Defining Menu Items to Launch Sessions and Local VXT + Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 + 13.2.2 Defining Keys to Launch Sessions and Local VXT + Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 + 13.3 Launching Remote Applications . . . . . . . . . . . . . . . . . . . . . . . . . . 236 + 13.3.1 Running the Application Launcher . . . . . . . . . . . . . . . . . . . . 237 + 13.3.2 Launch Command Arguments . . . . . . . . . . . . . . . . . . . . . . . . 238 + 13.3.3 Defining Menu Items or Keys to Launch Remote + Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 + 13.4 Launching Sessions and VXT Applications Using rsh . . . . . . . . . 241 + +14 Using VXT EX Software + 14.1 VXT EX Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 + 14.2 Loading VXT EX Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 + 14.3 Creating a Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 + 14.4 VXT EX Options Dialog Box . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 + +15 Using Your Keyboard + 15.1 ANSI Keyboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 + 15.1.1 Keyboard Dialect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 + 15.1.2 Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 + 15.1.3 Main Keypad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 + 15.1.4 Editing Keypad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250 + 15.1.5 Numeric Keypad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 + 15.1.6 Top-Row Function Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 + 15.1.7 Data Processing Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 + 15.1.8 Compose Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 + 15.1.9 Text-Editing Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 + 15.1.10 Indicator Lights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 + 15.1.11 Audible Indicators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 + 15.1.12 Keyclick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 + 15.1.13 Bell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 + 15.2 Short ANSI Keyboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 + 15.2.1 Main Keypad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 + + +viii + 15.2.2 Using Extend Key Sequences for Keypad and Function + Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 +15.2.3 Arrow Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 +15.2.4 Top-Row Function Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 +15.2.5 Compose Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 +15.2.6 Indicator Lights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 +15.2.7 Audible Indicators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 +15.3 The PC Keyboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 +15.3.1 PC Keyboard Models—Setting the Keyboard Type . . . . . . . . . 260 +15.3.2 Using the ANSI Keyboard Layout . . . . . . . . . . . . . . . . . . . . . 260 +15.3.3 Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 +15.3.4 Main Keypad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 +15.3.5 Janus-Faced and Front-Faced Character Keys . . . . . . . . . . . . 263 +15.3.6 Editing Keypad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 +15.3.7 Numeric Keypad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 +15.3.8 Top-Row Function Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 +15.3.9 Audible Indicators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 +15.3.10 Keyclick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 +15.3.11 Bell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 +15.3.12 Redefining Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 +15.3.13 PC Keyboard Keycodes and Symbol Assignments . . . . . . . . . 266 +15.4 The Sun Style Keyboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 +15.4.1 Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 +15.4.2 Main Keypad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 +15.4.3 Editing Keypad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 +15.4.4 Numeric Keypad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 +15.4.5 Top-Row Function Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 +15.4.6 Audible Indicators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 +15.4.7 Keyclick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 +15.4.8 Bell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 +15.4.9 Redefining Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 +15.4.10 Sun Keyboard Keycodes and Symbol Assignments . . . . . . . . . 274 +15.5 Using the Keyboard Instead of the Mouse . . . . . . . . . . . . . . . . . . 278 +15.5.1 Using the Editing Keypad to Perform Mouse Functions . . . . 278 +15.5.2 Using Menu Bars and Pull-Down Menus . . . . . . . . . . . . . . . . 278 +15.5.3 Using Pop-Up Menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 +15.5.4 Using Submenus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 +15.5.5 Navigating Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 +15.5.6 Miscellaneous . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 +15.5.7 Using Dialog Boxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282 +15.6 Typing Additional Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . 282 +15.6.1 What Characters Can I Type? . . . . . . . . . . . . . . . . . . . . . . . . 283 +15.6.2 Key Sequences with Nonspacing Diacritical Keys . . . . . . . . . 283 + + + ix + 15.6.3 How to Type a Character Using the Compose Character + Key . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 + 15.6.4 How to Type a Character Using the Group Shift Key . . . . . . 285 + 15.6.5 Invalid Sequences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 + 15.6.6 Canceling or Restarting a Key Sequence . . . . . . . . . . . . . . . . 286 + 15.6.7 Hexadecimal Key Sequences . . . . . . . . . . . . . . . . . . . . . . . . . 286 + +A Solving Problems and Getting Service + A.1 Operating Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 + A.1.1 NFS Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 + A.2 Power-Up Self-Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 + A.2.1 Error Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 + A.3 Restoring the Terminal to Factory-Default Settings . . . . . . . . . . . 303 + A.4 Digital Service Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304 + A.4.1 How to Get Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304 + +B Mixing Colors + B.1 What Color Settings Can I Customize? . . . . . . . . . . . . . . . . . . . . 306 + B.2 Color Mixing Dialog Box . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307 + B.2.1 Picker Color Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307 + B.2.2 Hue, Lightness, Saturation (HLS) Color Model . . . . . . . . . . . 310 + B.2.3 Red, Green, Blue (RGB) Color Model . . . . . . . . . . . . . . . . . . . 312 + B.2.4 Browser Color Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 + B.2.5 Grayscale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 + +C Programming with the X Windows Image Extension + C.1 Checking the Terminal’s Imaging Capabilities . . . . . . . . . . . . . . . 317 + C.2 Hardware Accelerated XIE Functions . . . . . . . . . . . . . . . . . . . . . 317 + C.3 XIE Pipeline Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317 + C.3.1 XIE Pipeline Constraints . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318 + C.3.2 XIE Pipeline Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319 + +D Related Documentation + D.1 Ordering Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322 + + + + +x + E Options + E.1 Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 + +F Specifications + +G Setting Up the Work Environment + G.1 Proper Setup and Use . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 + +Glossary + +Index + +Tables + 6–1 LAT Counters Display Fields . . . . . . . . . . . . . . . . . . . . . . . . . 118 + 6–2 Ethernet Counters Display Fields . . . . . . . . . . . . . . . . . . . . . 121 + 6–3 System Configuration Display Fields . . . . . . . . . . . . . . . . . . . 125 + 9–1 Status Indicators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 + 9–2 Keyboard Copy and Paste Keys . . . . . . . . . . . . . . . . . . . . . . . 173 + 9–3 Field Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 + 9–4 Quick Access to Functions: MB3 Pop-Up Menu . . . . . . . . . . . 178 + 10–1 VXT 3270 Window — Default Key Functions . . . . . . . . . . . . . 184 + 13–1 Application Names and Arguments . . . . . . . . . . . . . . . . . . . . 234 + 15–1 PC Keyboard Keycodes and Symbol Assignments . . . . . . . . . 266 + 15–2 Sun Keyboard Keycodes and Symbol Assignments . . . . . . . . . 275 + 15–3 Keyboards with Diacritical Marks . . . . . . . . . . . . . . . . . . . . . 284 + 15–4 Key Sequences for Additional Characters . . . . . . . . . . . . . . . 288 + A–1 System Box, Monitor, Keyboard, Mouse, and Printer + Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 + A–2 Booting, Server, and Network Problems . . . . . . . . . . . . . . . . . 296 + A–3 Session, Application, and Dialog Box Problems . . . . . . . . . . . 298 + A–4 NFS Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 + G–1 Recommendations for Proper Setup and Use . . . . . . . . . . . . . 332 + + + + + xi + About This Guide + + + This guide describes how to use VXT software on a VXT 2000 windowing + terminal. The terminal makes use of the open windowing environment. The + guide describes how to create X window or terminal window sessions on a wide + variety of operating systems. + +Who Should Use This Guide + This guide is for the general user of the VXT 2000 windowing terminal. + • If you are new to windows or the Motif windows environment, the guide + provides basic information on how to use windows and the mouse pointing + device. + • If you are familiar with windows, you can use the guide to learn about VXT + software features and customize your terminal’s operating features. + +Organization + This guide contains the following chapters and appendices: + • Chapter 1, ‘‘A Look at the Terminal,’’ provides an overview of the terminal + and its features. + Terminal Manager Window + • Chapter 2, ‘‘Using the Terminal,’’ describes the basic features of the + Terminal Manager window. The chapter describes how to create sessions, + print the screen, and view online VXT 2000 documentation. + • Chapter 3, ‘‘Customizing the Terminal,’’ describes how to customize basic + terminal settings for your language, personal preference, and system + security. + • Chapter 4, ‘‘Customizing Communications,’’ describes how to customize + terminal settings that affect communications with host computer systems. + + + xiii + • Chapter 5, ‘‘Customizing Fonts and Startup Settings,’’ describes how to + customize more advanced settings. Topics include autostarting sessions + and applications, changing font paths, booting VXT software, and loading + or unloading VXT software features. + • Chapter 6, ‘‘Checking the Terminal’s Status,’’ describes how to use the + Terminal Manager window’s Status menu to monitor memory use, network + use, network counters, and the terminal’s system configuration. You can + also view TCP/IP routes and use ping to determine the availability of hosts. + VXT DECterm Windows + • Chapter 7, ‘‘Using VXT DECterm Windows,’’ describes how to use DECterm + windows, which emulate a VT300 series terminal. + • Chapter 8, ‘‘Customizing VXT DECterm Windows,’’ describes how to + customize your DECterm windows for your computing environment and + personal preference. + VXT 3270 Windows + • Chapter 9, ‘‘Using VXT 3270 Windows,’’ describes how to use the VXT 3270 + terminal emulator to run applications on an IBM SNA host system through + a DECnet/SNA gateway. + • Chapter 10, ‘‘Customizing VXT 3270 Windows,’’ describes how to customize + the VXT 3270 terminal emulator window. + Window Manager + • Chapter 11, ‘‘Using Windows,’’ describes how to manage windows and use + menus, dialog boxes, and scroll boxes. The chapter also shows how to use + the mouse. + • Chapter 12, ‘‘Customizing Windows,’’ describes how to check and control + the settings for many of the window manager’s features. You can make + changes to the settings and save them for all future sessions. + • Chapter 13, ‘‘Launching Applications,’’ describes how to launch sessions, + local VXT applications or remote host applications from your terminal. + VXT EX Software + • Chapter 14, ‘‘Using VXT EX Software,’’ describes how to use VXT EX + software. VXT EX software is a minimal version of VXT software without + a terminal manager and other local clients. + + + + +xiv + Keyboards + • Chapter 15, ‘‘Using Your Keyboard,’’ describes the keys and indicator lights + on the terminal’s ANSI, short ANSI (UNIX), PC, and Sun style keyboards. + It also describes how to type additional characters not listed on your + keyboard keys and how to use the keyboard in place of the mouse. + Appendixes + • Appendix A, ‘‘Solving Problems and Getting Service,’’ describes how to solve + typical operating problems and how to get service. + • Appendix B, ‘‘Mixing Colors,’’ describes how to use the Color Mixing dialog + box that lets you change the color of windows and the screen. + • Appendix C, ‘‘Programming with the X Windows Image Extension,’’ + provides guidelines for programming with XIE protocol functions. + • Appendix D, ‘‘Related Documentation,’’ lists related documentation. + • Appendix E, ‘‘Options,’’ lists available hardware options. + • Appendix F, ‘‘Specifications,’’ lists the general, environmental, and electrical + specifications for the terminal. + • Appendix G, ‘‘Setting Up the Work Environment,’’ lists recommendations + for your health and safety while using the terminal. + • The glossary defines new terms introduced in the text and other relevant + terms. + +Comments? + Please send us your comments and suggestions about this guide or other VXT + manuals. You can use the Reader’s Comments form at the end of this guide, or + you can send electronic mail to the following Internet address: + docteam@gwen.enet.dec.com + When making comments, please include the manual title and part number + listed on the front cover. For specific comments, please include a page number, + section number, or section title for reference. + + + + + xv + Conventions + This guide uses the following conventions: + + Convention Meaning + VXT 2000 windowing Refers to all models of the VXT 2000 windowing terminal. + terminal + InfoServer system Refers to a disk server that downloads a VXT system image to + the terminal. + Mouse Refers to any pointing device, such as a mouse, a puck, or a + stylus. + MB1, MB2, and MB3 Represent the three mouse buttons: left (MB1), middle (MB2), + and right (MB3). Lefthanded users can exchange the MB1 and + MB3 button assignments if desired. + key Keys or switches that are labeled appear in a box . + Example: Press the Return key. + Alt Represents the Alt or Alt Function key on your keyboard. + Ctrl key key For Ctrl key sequences, press and hold each key in order until + you complete the sequence. + Ctrl +left Alt If a key sequence includes descriptive words, the keys are + joined by a plus (+) symbol for clarity. + Caution Provides information to prevent damage to equipment or + software. + Note Provides general information about the current topic. + Menu item . . . Menu items followed by . . . display a dialog box when chosen. + Menu item Menu items followed by display a submenu when chosen. + Glossary entries Appear in bold when first used in text. + Index entries The following abbreviations are used in the index: + (TM) for Terminal Manager + (WM) for Window Manager + + +Notes to the Reader + The screens and windows shown in this guide represent the latest information + available at the time of publication. Some screens and windows may not + exactly match those that appear on your terminal or reflect the system-default + settings. + + + + +xvi + 11 + A Look at the Terminal + + + This chapter provides an overview of the VXT 2000 windowing terminal and + its basic operating features. The chapter tells you where to look in this guide + for more information about each feature. + +1.1 Terminal Highlights + The VXT 2000 windowing terminal lets you access X window applications and + traditional terminal applications on computer systems in your network. You + can open several windows on the terminal, to display multiple applications + from different systems at the same time. + The VXT 2000 terminal provides many features of a workstation without the + need for workstation management. Here are some of the terminal’s main + features: + Hardware + • A workstation-style display, a keyboard, and a mouse. + • A monochrome, gray scale, or color monitor. + • A choice of Ethernet network connectors: ThinWire, thickwire, or twisted + pair. + • A 25-pin RS-232 serial printer/communications port with full modem + control. + • A 25-pin parallel printer port. + • Serial interfaces for a keyboard and a mouse or tablet. + • Expandable memory (user installable). + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 1 + A Look at the Terminal +1.1 Terminal Highlights + + Software + • The ability to access several computer systems at the same time, using the + TCP/IP, LAT, or DECnet transports. + • A choice of VXT software or VXT EX software, downloaded from a host + computer system or an InfoServer system. + • VXT software provides local applications and features such as + A local Terminal Manager window that lets you create and manage + connections to computer systems. You can connect to systems using the + TCP/IP, LAT, or DECnet transport. See Chapter 2. + VXT DECterm windows that let you access VT video terminal + applications on computer systems. VXT DECterm windows emulate + VT300 series video terminals. See Chapter 7. + VXT 3270 windows that let you access applications on an IBM SNA + system. See Chapter 9. + A local Motif window manager that lets you easily move and resize + windows, using a mouse or keyboard for navigation. See Chapter 11. + An AutoStart feature to automatically start your selected computer + sessions and local terminal applications when you start work, or at any + other time. See Section 5.6. + A Customize Boot dialog box for choosing the VXT software version you + want your terminal to load. See Section 5.7. + A Customize Font Path dialog box that lets you access fonts from host + systems and font servers on your network. See Section 5.3. + Configuration Manager windows that let a system manager configure + individual terminals or groups of terminals to share customized + settings and fonts. See VXT Software Version 2.1 Installation and + System Management. + • VXT EX (essential X server) software is a clientless version of VXT + software, without local applications. You can use VXT EX software to + access X applications on computer systems with minimal memory installed + in the terminal. When you use VXT EX software, the system you connect + to must provide all window and session management features. + + + + +2 Chapter 1 + A Look at the Terminal + 1.2 How the Terminal Works + +1.2 How the Terminal Works + The VXT software and fonts for your terminal are installed on a host computer + system or an InfoServer system. An InfoServer system is a high-performance + virtual disk server that can efficiently download software to many terminals. + You can use the terminal with one or more computer systems. You can connect + the terminal to + • An Ethernet network, using the ThinWire, thickwire, or twisted-pair port + • A computer, using the serial port + The computer system you connect to is called the host. You can connect your + terminal to several hosts. + You use the keyboard, mouse and monitor to interact with applications on your + host. You send data to the application by typing on the keyboard or selecting + window options with the mouse. Data sent by the application appears as + text or graphics on the terminal’s screen. You can print text or graphics on a + printer connected to the terminal’s printer port or on any networked printer. + You can use a variety of host software applications on the terminal. For + example, your host may have applications for word processing, data entry, + programming, or business graphics. Most applications involve interactive + processing. This means the terminal immediately sends the information you + enter from the keyboard or mouse to the host. + +1.3 VXT Software + Each time you start up the terminal, it sends out a network request for a host + or InfoServer system to download VXT software and fonts to the terminal. + This process of starting up the software and bringing it to an operable state is + also known as booting. + Knowledgeable users can customize the terminal’s boot settings to load a + particular VXT software version. See Section 5.7 for details. + There are some differences between host-based and server-based operation. + VXT Host-Based Software + If your terminal downloads VXT software from a host system, the terminal + always uses its own physical memory to display applications and store your + customized terminal settings. Host-based operation provides + • A Terminal Manager window + • VXT DECterm and VXT 3270 windows + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 3 + A Look at the Terminal +1.3 VXT Software + + • A local Motif window manager + • A configuration manager—Your system manager can use the Configuration + Manager dialog boxes to customize and manage individual terminals from + a central terminal. + VXT Server-Based Software + If your terminal downloads VXT software from an InfoServer system, the + terminal typically operates in server-based mode. In server-based mode, the + terminal saves your customized terminal settings on an InfoServer system. + Server-based mode provides all the features of the host-based operation, plus + • Virtual memory capability—The InfoServer system provides the terminal + with additional memory as needed to display more applications. As a + result, the terminal needs less installed memory than when you use + host-based operation. + • More configuration manager features—Your system manager can use the + Configuration Manager dialog boxes to customize and manage groups of + terminals, as well as the fonts they use. + • InfoReader library—You can access this library of online VXT documenta- + tion from the Getting Started menu in the Terminal Manager window. The + library includes this user guide. + You can also choose the host-based mode of operation when downloading from + an InfoServer system. In this case, your customized settings are stored in the + terminal’s memory, and the terminal cannot use the InfoServer system for + memory services. You still have access to the InfoReader library. Your boot + settings determine the mode of operation. See Section 5.7. + +1.4 VXT EX Software + VXT EX (essential X server) software is a clientless version of VXT software, + which means it does not include any local applications such as the Terminal + Manager window, VXT DECterm and VXT 3270 windows, or the Motif window + manager. + VXT EX software lets you use a VXT 2000 windowing terminal as a + workstation companion, relying on the host system to provide a session + manager, window manager, and other applications. You can use VXT EX + software with minimal memory installed in the terminal. + VXT EX software provides a single dialog box for starting an X session on + a host system. You can start a session on a system that supports the LAT + or TCP/IP transports and access that system’s X window applications. See + Chapter 14. + + +4 Chapter 1 + A Look at the Terminal + 1.5 Memory Requirements + +1.5 Memory Requirements + When you turn on the terminal, the VXT software is loaded into the terminal + from an InfoServer system or from a host computer system. There are + different memory requirements for using server-based or host-based software. + The optional image accelerator board for some VXT 2000 models also requires + extra memory. + + Your Terminal Needs At + If You Use VXT Software... And... Least... + Server-based – 4 megabytes of memory + Server-based Image accelerator board 6 megabytes + Host-based – 10 megabytes + Host-based Image accelerator board 12 megabytes + + + + If You Use VXT EX Your Terminal Needs At + Software... And... Least... + Host- or server-based – 4 megabytes of memory + Host- or server-based Image accelerator board 6 megabytes + + Standard Terminal (4 MB) + The standard terminal comes with 4 megabytes of memory. You can expand + memory up to 18 megabytes by installing memory modules in the terminal. To + expand memory on system box models, you must install a memory controller + board. + Optional Memory (To 18 MB) + • 2-megabyte memory controller board (for system box models) + • One to three 2-megabyte or 4-megabyte memory modules + To install memory, see VXT 2000+ /VXT 2000 Windowing Terminal Installing + and Getting Started. To order memory, see Appendix E. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 5 + A Look at the Terminal +1.5 Memory Requirements + +1.5.1 Monitoring Memory Use (Host-Based Terminals) + If your terminal uses host-based VXT software, the number of applications + and windows you can display is limited by the amount of physical memory in + the terminal. The amount of memory in use changes as you open and close + windows and applications. If you run out of memory, the terminal may quit all + current X sessions and terminal window sessions and reboot itself. + When the amount of available memory is low, the Terminal Manager window + displays a warning message. You can also monitor memory use by checking the + System Monitor dialog box (Section 6.5). + To regain memory, you can + • Close or quit from any unused applications, windows, or sessions. + • Decrease the number of lines the terminal saves when you scroll them off + the top of a VXT DECterm window. See Section 8.4. + • Limit the software options you load to only those you need. See Section 5.8. + • End all current sessions by rebooting the terminal’s software. To reboot the + terminal’s software: + – Choose Reset, Reboot, or Shutdown from the Terminal Manager + window’s Session menu. + – Press the reboot key sequence for your keyboard: + ANSI (LK401) keyboard Press Ctrl Alt . , using the left Alt key and the + period key on the numeric keypad. + PC (LK443/LK444) Press Ctrl Alt . , using the period key on the + keyboard numeric keypad. + Short ANSI (LK421) Press Ctrl Alt Extend . . + keyboard + Sun style (LK460) Press Ctrl Del . + keyboard + To install more memory in the terminal, see Appendix E. + +1.6 X Window Sessions and Terminal Window Sessions + You can use two types of sessions on your host computers: an X window + session or a VXT terminal window session. You can open X window + sessions and VXT terminal window sessions at the same time. + + + + +6 Chapter 1 + A Look at the Terminal + 1.6 X Window Sessions and Terminal Window Sessions + + X Window and DECwindows Sessions + The X Window System is a graphically oriented user interface that lets you + display one or more windows on the screen. Each window can represent a + different software application running on its own host system. For example, + you could run a word processing application in one window and a spreadsheet + application in another window. With multiple windows, you can perform many + tasks in an easy and efficient manner. + The X Window System was designed at the Massachusetts Institute of + Technology. Digital’s DECwindows Motif software is based on the X Window + System and the Open Software Foundation’s Motif standard. + To use an X window session, you log in to a host that has X window + applications. In an X window session, you can use all the applications and + utilities provided in the X Window System. For more information about + Digital’s X applications, see the DECwindows Motif User’s Guide for your + operating system. + Terminal Window Sessions + You can create terminal windows to access video text terminal applications on + host systems. The terminal lets you create multiple VXT DECterm or VXT + 3270 terminal windows. When you open a terminal window, you log in to a + host as you would on a conventional video terminal. + +1.7 Customizing Your Terminal + VXT software provides menus and dialog boxes that let you customize the + operating settings for your terminal’s window manager, terminal manager, + VXT DECterm windows, and VXT 3270 windows. You can save your own + settings or use factory-default settings from memory. + When you save customized settings in dialog boxes, the terminal stores + your settings in a native resource file. Whenever you turn on or reset the + terminal, it reads the settings in the native resource file. + If you use host-based operation, the terminal stores the native resource file + in the terminal’s nonvolatile memory. If you use server-based operation, the + terminal stores the native resource file on an InfoServer system. + If you want central management, you or your system manager can use the + configuration manager on any VXT 2000 windowing terminal in your network. + The configuration manager lets you customize settings for individual terminals + or groups of terminals. Configuration manager settings are stored in the native + resource files. Alternatively, you can create your own host-based resource + files and store them on a host system. + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 7 + A Look at the Terminal +1.7 Customizing Your Terminal + + Using Menus + You can use the following menus to customize settings: + • Terminal Manager—Customize menu + You use the Customize menu in the Terminal Manager window to view and + change the settings for most of the terminal’s operating features. + – For user-preference features, see Chapter 3. + – For communication settings, see Chapter 4. + – For startup settings and fonts, see Chapter 5. + • Window manager—Options submenu + The window manager provides an Options submenu that lets you customize + window features such as border colors. You can access the Options + submenu from the window menu button (Section 11.3) or from the + Workspace pop-up menu (Chapter 12). + Advanced users can customize window manager menus, mouse buttons, + or keyboard keys (Section 12.9). For example, you can define menu + items, buttons, or keys to launch local VXT applications or remote host + applications (Chapter 13). + • VXT DECterm Options menu + Each VXT DECterm terminal window you create includes an Options + menu. This menu lets you change many DECterm operating features for + that window while an application is running in the window. However, + many applications handle the customization of the VXT DECterm window + on their own. Chapter 8 describes how to use the VXT DECterm Options + menu. + • VXT 3270 Options menu + Each VXT 3270 terminal window you create includes an Options menu. + This menu lets you change certain VXT 3270 operating features while an + application is running. However, many applications handle customization + of the VXT 3270 window on their own. Chapters 9 and 10 describe how to + use the VXT 3270 Options menu. + Central Management + VXT Software Version 2.1 Installation and System Management describes how + to centrally manage terminals, using the configuration manager or your own + host-based resource files. + • Configuration Manager + When you click on Configuration . . . in the Terminal Manager window’s + Customize menu, the terminal displays the Configuration submenu. From + + + +8 Chapter 1 + A Look at the Terminal + 1.7 Customizing Your Terminal + + the Configuration submenu you can display a Resource Management or + Font Management dialog box. + The Resource Management dialog box lets a system manager centrally + manage VXT 2000 windowing terminals from one terminal. The system + manager can control the customizable features of these menus: + • Terminal Manager window’s Customize menu + • Terminal Manager window’s Create menu + • Window manager’s Options menu + • VXT DECterm window’s Options menu + The Font Management dialog box lets a system manager customize and + configure font support for terminals on multiple InfoServer systems. + • Host-based resource files + You can create your own host-based resource files to store the customized + settings for terminals. You edit these files directly. Host-based resource + files provide a way for host-based terminals to share the same settings. + Other Features on Host Systems + Host systems can also customize certain features of your terminal: + • Host-based control functions + Applications can control many terminal features from the host system by + using control functions. + • Client Customize + The X window or DECwindows software package includes its own + Customize utility, not described here. For more information, see the + DECwindows Motif User’s Guide for your operating system. + +1.8 Compatibility with VT Series and 3270 Terminals + The terminal can operate as a video text terminal when you want to log in to a + host system and use applications designed for conventional video terminals. + You can use VXT DECterm windows to emulate VT300 series video terminals. + See Chapters 7 and 8. + You can use VXT 3270 windows to access applications on an IBM SNA system. + See Chapters 9 and 10. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 9 + A Look at the Terminal +1.8 Compatibility with VT Series and 3270 Terminals + +1.8.1 Character Sets + VXT DECterm Windows + When you use VXT DECterm terminal windows, you can choose different + character sets to match your computer system or software application + requirements. You can choose from + • Two 8-bit multinational character sets—DEC Multinational or the ISO + Latin Alphabet No. 1 set of the International Standards Organization + • Several 7-bit national replacement character sets (NRCs) for Western + European languages + Chapter 3 describes how to choose characters sets. + VXT 3270 Windows + VXT 3270 windows use a translation table to translate the characters + generated by the terminal into EBCDIC characters that your IBM application + uses. See Section 10.3. + + + + +10 Chapter 1 + 22 + Using the Terminal + + +This chapter describes how to start using the terminal with VXT software. +When you turn on the terminal, it normally displays the Terminal Manager +window after loading VXT software. This window acts as a control panel for +creating sessions and customizing terminal settings. +VXT 2000+ /VXT 2000 Windowing Terminal Installing and Getting Started +provides step-by-step instructions to start creating sessions with the Terminal +Manager window. This chapter provides more details and describes other basic +functions you can perform from the Terminal Manager window. The chapter +covers the following major topics: +• Terminal Manager Window +• VXT Message Box +• Creating Sessions and VXT Applications +• Autostarting, Pausing, or Ending Sessions +• Checking Network and Terminal Status +• Working with Multiple Remote X Session Managers +• Using the Open Look Window Manager from Sun Systems +• Printing +• Getting Started Menu +If you want to use VXT EX software, see Chapter 14. When you use VXT EX +software, the terminal displays a VXT EX connection window instead of the +Terminal Manager window. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 11 + Using the Terminal +2.1 Terminal Manager Window + +2.1 Terminal Manager Window + When you turn on the terminal, it normally displays the Terminal Manager + window and VXT Message Box. Here is the Terminal Manager window: + + VXT V2.1 Terminal Manager + + + + + Ethernet Active Address LAT Host Name IP Address DECnet Address + + 08−00−2B−11−CD−46 LAT_08002B11CD46 12.122.123.123 12.123 + + + + LJ−01140C−RAGS + + + + + • The title bar displays the window title and VXT software version. + • The menu bar provides access to the following menus: + Session To end, pause, or autostart a session, or to display network and + terminal status information (Chapter 6) + Create To start X sessions, terminal windows, and local terminal + applications + Customize To customize terminal manager features and access the + Configuration Manager dialog boxes + Print Screen To print all or part of the screen on a local printer, or to cancel a + LAT print job + Getting Started To get help on creating sessions and entering your terminal’s IP + or DECnet address + To access the InfoReader library of online VXT documentation + (server-based terminals) + • The address region shows the terminal’s Ethernet, LAT, IP, and DECnet + addresses. These addresses define the terminal’s location on a network for + LAT, TCP/IP, and DECnet communications. + Initially, the IP and DECnet addresses are blank. To use TCP/IP or + DECnet communications, you must enter and save the terminal’s IP or + DECnet address in the appropriate Customize Communications dialog box. + Initially, the Ethernet Active Address field displays the terminal’s Ethernet + hardware address. If you enable DECnet communications, the displayed + Ethernet address is converted to a global network address in the network + service access point (NSAP) format. In this case, you can still view the + Ethernet hardware address in the System Configuration dialog box. + + + + +12 Chapter 2 + Using the Terminal + 2.1 Terminal Manager Window + +2.1.1 VXT Message Box + The VXT Message Box lets you monitor system messages that affect the + terminal’s operating status. + The VXT Message Box provides a Customize menu that lets you choose + the category of messages displayed and change the box’s position and size + (Section 3.13). + Normally, the terminal starts the Terminal Manager window and the VXT + Message Box as a single application. You can start them as separate + applications if you want to control them separately (Section 5.6). In this + case, the VXT Message Box also includes a File menu with an Exit item that + lets you close the box. + + + + + TI−03010−RAGS + +2.1.2 Closing the Terminal Manager Window and VXT Message Box + The Terminal Manager window and Message box are local VXT applications. + You can close these applications without closing your other open sessions. + Closing the Terminal Manager window can free the terminal’s memory to + perform other tasks. You can restart the Terminal Manager window and VXT + Message Box if needed. + To close the Terminal Manager window and VXT Message Box: + • Click on the Session menu in the Terminal Manager window. + • Click on the Close menu item. + If you have customized settings in the Customize AutoStart dialog box to run + the Terminal Manager window and VXT Message Box as separate applications, + the VXT Message Box remains open. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 13 + Using the Terminal +2.1 Terminal Manager Window + + To restart the Terminal Manager window and VXT Message Box: + 1. Click and hold MB2 anywhere on the screen background, outside your + windows. The terminal displays the pop-up VXT Create menu. + 2. Click on the Term Mgr + Msg Box menu item. + Hiding the Terminal Manager Window + You can also hide the Terminal Manager window and Message Box applications + without stopping them. You can choose to hide these applications each time + you start the terminal or hide them during operation. You can enable the F3 + key to act as a toggle switch for hiding or displaying these applications. See + Section 3.10. + +2.2 Creating Sessions and VXT Applications + You can open two types of sessions on host systems—an X session or a terminal + window session. X sessions let you access X window applications on your host. + Terminal window sessions provide a VXT DECterm or VXT 3270 terminal + emulator for accessing traditional video terminal applications on your host. + You can open multiple sessions. + You can also start or stop three VXT applications: + Terminal Manager window + VXT Message Box + Motif window manager + By default, the terminal starts all three applications when you turn on or reset + the terminal. + Initially, you use a Create dialog box to start sessions or change VXT + applications. After you save a list of preferred services in the dialog box, you + can quickly start sessions and VXT applications from the Create pull-down + menu or VXT Create pop-up menu (Section 2.2.8). + +2.2.1 Displaying the Create Dialog Box + To display the Create dialog box: + 1. Click on the Create menu in the Terminal Manager window. + 2. Click on Other... menu item to display the Create dialog box. + + Note + Your system manager can use the terminal’s configuration manager to + prevent users from accessing the Create dialog box. In this case, the + + + +14 Chapter 2 + Using the Terminal + 2.2 Creating Sessions and VXT Applications + + Other... menu item is dimmed. + + + + + TI−3009A−RAGS + + + You can connect to hosts or services on a network supporting the TCP/IP, LAT, + or DECnet protocol. + +2.2.2 Starting LAT or Serial Sessions + To start a LAT or serial session from the Create dialog box: + 1. In the Application box, click on the type of session you want to start: + X Session, DECterm, or 3270. + 2. In the Transport box, click on the communication method to use for the + session: LAT or Serial. + If you choose the Serial transport, skip the next step. + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 15 + Using the Terminal +2.2 Creating Sessions and VXT Applications + + 3. Click on the Host Name or Address box and enter the name or address of + the host you want to connect to. + 4. Click on the button to add your session settings to the Preferred + Services scroll box. + 5. Click on the Save button to save your Preferred Services list for future + use. The terminal adds your services to the Create menu and VXT Create + pop-up menu for quick access. + 6. Click on the Start button to connect to the host. The terminal displays a + login window. + 7. Log in to the session. + If the Start button is dimmed: + If you are trying to start a serial DECterm window, see Section 4.2 to change + the Port Usage feature to set the serial port to work as a host port. + +2.2.3 Starting a DECnet Session + Before you create your initial DECnet session, you must enter and save your + terminal’s DECnet address (Section 4.9). + Your host system must have the VXT$SERVER DECnet object installed. + For more information, see the section on the OpenVMS operating system in + VXT Software Version 2.1 Installation and System Management. + To start a DECnet session from the Create dialog box: + 1. In the Application box, click on the type of session you want to start: + X Session, DECterm, or 3270. + 2. In the Transport box, click on the DECnet button. + 3. Click on the Host Name or Address box and enter the DECnet host address + or name (up to 6 characters). Host names require at least one alphabetic + character. + You can specify DECnet addresses in two forms: + • The long form uses a period to separate the area number and node + number. For example: 61.513. + • The short form collapses the area and node numbers into a single deci- + mal value, using the formula (area_number 1024) + node_number. +  + + + + + For example: 62977 = (61 1024) + 513. +  + + + + + If you want to use host names instead of addresses, you first must + enter and save the address of your network’s DECnet name translator + (Section 4.10). + + +16 Chapter 2 + Using the Terminal + 2.2 Creating Sessions and VXT Applications + + 4. Click on the button to add your session settings to the Preferred + Services scroll box. + 5. Click on the Save button to save your Preferred Services list for future use. + The terminal adds your list to the Create menu and VXT Create pop-up + menu for quick access. + 6. Click on the Start button to connect to the host. The terminal displays a + login window. + 7. Log in to the session. + +2.2.4 Starting an IP Session + Before you create your initial session, you must enter and save your terminal’s + TCP/IP address (Section 4.5). + + Note + You can create only one IP X session to a given host. If you try to + create a second IP X session to the same host, the X display manager + (XDM) closes the first IP X session while creating the second IP X + session. + + + To start an IP session from the Create dialog box: + 1. In the Application box, click on the type of session you want to start: + X Session, DECterm, or 3270. + 2. In the Transport box, click on the TCP/IP button. + 3. Click on the Host Name or Address box and enter the IP host address or + name (up to 30 characters). + If you want to use host names instead of addresses, you first must enter + and save the address of your network’s TCP/IP name server (Section 4.6). + Options: + • Use the Any Host button if you want to use the first available IP host. + • Use the Any Host Indirect button to specify a host that will act as a + pathway to find the first available IP host. Specify the host in the Host + Name or Address box. + • Use the Comment box to enter optional text comments. For example, + if you entered a host name, you may want to enter the IP address as a + comment. + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 17 + Using the Terminal +2.2 Creating Sessions and VXT Applications + + • Use the List Known Hosts... button to display a dialog box that lets + you list available IP hosts. + See Section 2.2.4.1 for button descriptions. + You can enter a host IP address in one of the following formats: + Format Example + Decimal whole number 215279382 + Decimal dot notation 12.212.231.22 + Hexadecimal 0xcd4e716 + Hexadecimal dot notation 0xc.d4.e7.16 + Octal dot notation 01465163426 + Octal whole number 014.324.347.26 + For DECterm windows, you can specify the port for Telnet to connect on. + Simply append a comma to the host name or IP address followed by the + port number. + Format Example + Host_Name,Port market,24 + IP_Address,Port 12.212.231.22,24 + 4. Click on the button to add your session settings to the Preferred + Services scroll box. + 5. Click on the Save button to save your Preferred Services list for future use. + The terminal adds your list to the Create menu and VXT Create pop-up + menu for quick access. + 6. Click on the Start button to connect to the host. The terminal displays a + login window. + 7. Log in to the session. + HP–UX Systems: Reset Required if You Cannot Log In + When creating X IP sessions to the HP–UX system, you may have to reset the + terminal if you are unable to log in. This is because the HP–UX system does + not issue a server reset after closing the login box. +2.2.4.1 Optional Buttons for Specifying IP Hosts + Any Host + Use the Any Host button if you want to connect to first available IP host on the + network. When you click on the Any Host button, an asterisk appears in the + Host Name or IP Address box. + + + +18 Chapter 2 + Using the Terminal + 2.2 Creating Sessions and VXT Applications + + Any Host Indirect +Use the Any Host Indirect button if you want to enter a host to use as a path +to your destination host. When you click on the Any Host Indirect button, the +title of the Host Name or IP Address box changes to Through Host Name or IP +Address. You can then enter the host name or IP address of the host to use as +a pathway. + Optional Comment for Host +You can store optional text comments with your host name or IP address. For +example, if you entered a host name in the Host Name or IP Address box, you +may want to store the IP address as a comment. + List Known Hosts... +You can choose from a list of hosts on your local subnet or on other subnets, +by using on the List Known Hosts... button. Click on the button to display the +Known Hosts dialog box: + + + + + LJ−1147A−RAGS + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 19 + Using the Terminal +2.2 Creating Sessions and VXT Applications + + The Known Hosts dialog box lists the available TCP/IP hosts and services on + the network. If the host you want is not listed, it may be currently unavailable. + Click on the List button to update the list. You may have to click on this + button several times before the host you want is listed. Sometimes it takes + a few minutes for the terminal to establish communication with hosts on the + network. + If the Known Hosts box displays IP addresses with question marks (?) where + host names should appear, you need to enter your TCP/IP Name Server address + in the TCP/IP Name Server dialog box (Section 4.6). + To view hosts on the local subnet: + Click on the Local button. The dialog box lists known hosts in the terminal’s + local subnet. In the following example, 135 represents the local subnet of the + terminal. + Subnet example: + 16.122.135.222 + To view hosts on other subnets: + Click on the Indirect button. Then click on the Indirect Host Name box and + enter the name of a host to use as a source for subnet information. + To connect to a Host in the Known Hosts scroll box: + There are two ways to connect to a host from the Known Hosts scroll box. + • Double click on the host in the Known Hosts scroll box. + • Click on the host name or address in the Known Hosts scroll box. The + name or address appears in the Host Name or IP Address box of the Create + Session dialog box. + Click on the Connect button in the Create dialog box. + To add a host from the Known Hosts scroll box to the Preferred + Services scroll box: + 1. Click on the host name in the Known Hosts scroll box. The host name + appears in the Host Name or IP Address box of the Create dialog box. + 2. Click on the button in the Create dialog box. The host appears in the + Preferred Services scroll box. + 3. Click on the Save button in the Create dialog box. + To update the Known Hosts scroll box list: + Click on the List button. The terminal updates the list of available hosts. + + +20 Chapter 2 + Using the Terminal + 2.2 Creating Sessions and VXT Applications + + To close the Known Hosts dialog box: + Click on the Close button. + +2.2.5 Starting VXT Applications + To start a VXT application from the Create dialog box: + 1. In the Application box, click on the type of local application you want + to start: Motif Window Manager, Terminal Manager, Message Box, or + Terminal Manager + Message Box. + By default, the terminal runs the Terminal Manager window and VXT + Message Box as a single application. + 2. Click on the button to add the application to the Preferred Services + scroll box. + 3. Click on the Save button to save your Preferred Services list for future use. + The terminal adds your list to the Create menu and VXT Create pop-up + menu for quick access. + 4. Click on the Start button if you wish to start the application. + If the application is already running, it will not start again. Only one copy + of an application can run at a time. + +2.2.6 Starting Remote Applications + You can start a remote application on a host system that you are currently + connected to. Before you start a remote application, you must run the VXT + application launcher on the host system. For instructions, see Section 13.3. + To start a remote application from the Create dialog box: + 1. In the Application box, click on the Remote Application button. + 2. In the Name box, enter the name of the VXT launcher. The default name + is VXT. + If you plan to launch applications from several host systems, you must + specify a unique name for the VXT launcher on each system. You can + specify a name when you run the VXT launcher. See Chapter 13. + 3. In the Command box, enter the host system command to start the + application. + For example, the following command starts a clock: + OpenVMS system MCR DECW$CLOCK + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 21 + Using the Terminal +2.2 Creating Sessions and VXT Applications + + ULTRIX, DEC OSF/1 /usr/bin/dxclock + AXP, or UNIX system + 4. Click on the button to add your remote application settings to the + Preferred Services scroll box. + 5. Click on the Save button to save your Preferred Services list for future use. + The terminal adds your list to the Create menu and VXT Create pop-up + menu for quick access. + 6. Click on the Start button to start the remote application. The terminal + displays the application. + +2.2.7 Preferred Services + You can add, move, and delete services from your Preferred Services list in the + Create dialog box. + To add a service to the Preferred Services scroll box: + 1. Use the Application, Transport, and Host Name or Address boxes to specify + the service you want to add. + 2. Click on the button to add the service to the Preferred Services scroll + box. + 3. Click on the Save button to save your service’s name so you do not have to + enter it each time you turn on the terminal. + To start a session or application from the Preferred Services scroll + box: + • Double click on a service in the Preferred Services scroll box. + • Click on a service in the Preferred Services scroll box. The service name + appears in the Service or Host Name box. Click on the Connect button. + To move a service in the Preferred Services scroll box: + You can move a service up or down in the list. The terminal will display the + services in the same order on the Create pull-down submenus and the VXT + Create pop-up menu. + 1. Click on the service name you want to move. + 2. Click on the or  button to move the service one place up or down in + the list. + To remove a service from the Preferred Services scroll box: + 1. Click on the service name you want to remove. + + + +22 Chapter 2 + Using the Terminal + 2.2 Creating Sessions and VXT Applications + + 2. Click on the trash can button. + +2.2.8 Creating Sessions from a Menu: Preferred Services + After you save preferred services in the Create dialog box, the terminal adds + them to + • The Create menu, as submenus + • The VXT Create pop-up menu (after you restart the window manager) + You can quickly start a preferred service (a session or VXT application) by + choosing the service name from these menus. + Create Menu + The Create menu adds a menu item for each type of session you have saved – + DECterm, X Session, and so on. When you choose one of these menu items, the + terminal displays a submenu that lists all of your preferred services for that + type of session. + + VXT V2.1 Terminal Manager + + + + + LJ−01145C−RAGS + + VXT Create Pop-Up Menu + After you restart the window manager, the VXT Create pop-up menu also lists + all preferred services. + To restart the window manager and view the VXT Create pop-up menu: + 1. Click and hold mouse button 1 (MB1) anywhere on the screen background, + outside the Terminal Manager window and other windows. + The terminal displays a Workspace pop-up menu. + 2. Drag the pointer to the Restart... menu item, then release MB1. + The terminal displays a confirmation box asking if you really want to + restart the window manager. + 3. Click on the OK button to restart the window manager. + The borders around the windows on the screen disappear while the window + manager is being restarted. + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 23 + Using the Terminal +2.2 Creating Sessions and VXT Applications + + 4. After the window borders reappear, click and hold MB2 anywhere on the + screen background. + The terminal displays the VXT Create pop-up menu, listing your preferred + services. The default VXT Create pop-up menu lists the combined Terminal + Manager and VXT Message Box applications: + + VXT Create + Term Mgr + Msg Box + LJ−03026−RAGS + + + +2.3 Autostarting, Pausing, or Ending Sessions + The Terminal Manager window’s Session menu lets you automatically start or + pause a session. You can also end all sessions by using the Reset, Reboot, or + Shutdown items to reset the terminal’s VXT software. + VXT V2.1 Terminal Manager + + + + VXT V2.1 Terminal Manager + + + + + LJ−01141C−RAGS + + +2.3.1 Autostarting a Session + The AutoStart menu item lets you quickly start the list of sessions and VXT + applications that you saved in the Customize AutoStart dialog box. The + terminal also autostarts this list when you perform any action that restarts the + terminal, such as + • Turning the terminal on + • Choosing the Reset, Reboot or Shutdown menu items from the Session + menu + To enter your AutoStart settings, see Section 5.6. + To autostart your applications: + 1. Click on the Session menu in the Terminal Manager window. + + + + +24 Chapter 2 + Using the Terminal + 2.3 Autostarting, Pausing, or Ending Sessions + + 2. Click on AutoStart. The terminal starts up the sessions and applications in + the order you listed them in the Customize AutoStart dialog box. + +2.3.2 Pausing a Session + If you want to interrupt your work without ending your session, you can + pause a session. When you pause a session, the terminal displays the Pause + Password dialog box. After you enter and verify a pause password, the + terminal clears the screen and displays the Enter Password to Resume prompt. + Any applications you started continue to run. When you resume your session, + you can continue work where you left off. + The pause password is valid for the current terminal session only. The + password is not saved when you reboot or reset the terminal. + To pause your session: + 1. Click on the Session menu in the Terminal Manager window. + 2. Click on Pause to display the Pause Password dialog box. + + + + + LJ−01142−RAGS + + 3. You can enter a new pause password or use a previous pause password + that you saved during the current terminal session. + To enter a new pause password: + a. Enter the password in the Enter Pause Password box. The password + may be from 1 to 127 characters. Blank spaces are not allowed. + b. Click on the Verify Password box and enter the same password. If you + make a mistake, click on the Clear button to start over. + c. Click on the OK button to save the password and exit the dialog box. + To use your previous pause password: + Click on the Use Previous Password button. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 25 + Using the Terminal +2.3 Autostarting, Pausing, or Ending Sessions + + When you click on the OK or Use Previous Password button, the terminal + clears the screen and displays the Enter Password to Resume prompt. + + + + + LJ−01143A−RAGS + + To resume your session : + Enter your password into the Password box and click on the OK button. + If you forget the password, you can click on the Reset button to end all sessions + and restart the terminal. + If you choose... The terminal... + OK Verifies that your password is correct. + Clear Clears the password box. + Reset Ends all sessions on the terminal. Resets the X server and restarts + applications listed in the Customize AutoStart dialog box. + + Note: Serial Window Not Closed + The Reset button does not end a terminal window created on the serial + port. To close a session on the serial port, choose the Exit menu item + from the terminal window’s File menu. + + + + +26 Chapter 2 + Using the Terminal + 2.3 Autostarting, Pausing, or Ending Sessions + +2.3.3 Ending All Sessions and Restarting VXT Software + You can use the Reset, Reboot, or Shutdown menu items on the Session menu + to end all active sessions on the terminal. If you choose Reboot or Shutdown, + the terminal also reloads the VXT software from a host system or InfoServer + system. You must reload VXT software to activate changes you make in some + Customize dialog boxes (Language, Boot, Communications, Software Options, + Resource Files). + If you choose... The terminal... + Reset Ends all sessions on the terminal. + Resolicits the network for the terminal’s resource file. + Restarts your AutoStart sessions and clients. + Resets the X server. + Reboot Ends all sessions on the terminal. + Resolicits the network for the terminal’s resource file. + Reloads VXT software. + Restarts your AutoStart sessions and clients. + Resets the X server. + Shutdown Ends all sessions on the terminal and displays the message + Press RETURN to restart VXT + After you press Return , the terminal + Resolicits the network for the terminal’s resource file. + Reloads VXT software. + Restarts your AutoStart sessions and clients. + Resets the X server. + When you choose the Reset, Reboot, or Shutdown menu item, the terminal + displays a confirmation box. To confirm your choice, click on Yes. To remain in + the session, click on No. To bypass this confirmation box, see Confirm Reset + Session in Section 3.10. + You can also reboot the terminal by pressing Ctrl +left Alt +keypad . . + +2.3.4 Ending Individual Sessions + If you have multiple sessions open, you can end individual sessions. The effect + of ending a session depends on the type of session. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 27 + Using the Terminal +2.3 Autostarting, Pausing, or Ending Sessions + + Ending an IP X Session + You can end an IP X session by using the quit function in the remote session + manager for that session. Quitting from the remote session manager (xsession) + on a UNIX, ULTRIX, or DEC OSF/1 AXP system ends the xsession and the + window manager (xwm). + Ending a LAT X or DECnet X Session + You can end a LAT X or DECnet X session by using the End Session function + in the remote session manager for that session. + By default, using the End Session function from an OpenVMS remote session + manager restarts the terminal, ending all sessions on the terminal. If your + terminal is using VXT server-based software, you can customize the terminal + so it only ends the LAT X window session without restarting the terminal. See + Section 5.4. + Ending Terminal Window Sessions + You can end a Telnet, LAT, DECnet, or Serial terminal window session by using + the Exit menu item in the window’s File menu. + +2.4 Checking Network and Terminal Status + You can use the Status menu item on the Session menu to access screens that + help you identify network problems. You can + • View the terminal’s configuration—software version, font path, network + addresses, memory, installed options, and work group + • View TCP/IP routes and ping hosts to determine their availability + • Monitor and reset LAT and Ethernet counters + • Monitor memory and network utilization + Chapter 6 describes the Status submenu. + +2.5 Working with Multiple Remote X Session Managers + Each X session you create has its own session manager on the host system. + Each session manager expects to have complete control of your terminal. + To maintain a consistent user interface when using multiple remote session + managers, you should consider the effects on the terminal’s feature settings + and the Motif window manager. + + + + +28 Chapter 2 + Using the Terminal + 2.5 Working with Multiple Remote X Session Managers + + Feature Settings + The host session manager changes any settable features of your terminal, such + as screen background, security, and keyboard selection. + If you run multiple session managers, each one sets up the terminal according + to the terminal’s saved settings at the time the session manager starts up. To + keep the settings from changing unexpectedly, be sure to change and save all + your preferences in all of your session managers. + When you quit from a remote session manager, the system may ask you if you + want to save customized settings before quitting. This question refers only to + the remote session manager’s settings. + Security Settings with OpenVMS DECwindows Session Manager The + DECwindows session manager overrides the terminal manager’s Customize + Security settings. Every time you log into a new OpenVMS host and run its + DECwindows session manager, the security settings on the new node override + the current settings. To maintain security, enter your settings on each host. + Remote Window Managers + You can choose whether or not a host-based window manager can take over + windowing operations on the screen. The terminal’s local window manager + provides you with quicker response time and overall higher performance. + However, a host-based window manager may offer more features. To let the + host control windowing operations, click on the Allow Remote Window Manager + button in the Customize Terminal Manager dialog box (Section 3.10). + +2.6 Using the Open Look Window Manager from Sun + Systems + If your host system has the Open Look window manager, you can perform the + following steps to use this window manager on the terminal: + 1. Load the fonts for the Sun Open Look cursor in the /vxt/fonts/misc + directory on the host system. + 2. In the Customize Terminal Manager dialog box, click on the Allow Remote + Window Manager button (Section 3.10). + 3. In the Customize Security dialog box, click on the All button to allow all + connections for TCP/IP (Section 3.7). + 4. In the Customize X Server dialog box, set the X Session Reset Server + Action to Ignore Reset Server. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 29 + Using the Terminal +2.6 Using the Open Look Window Manager from Sun Systems + + 5. In the Create dialog box, create a session on your Sun system. The Sun + system must have the X display manager (XDM) installed to be able to + display the username and password banner on the terminal. + 6. Use the env command to verify the following symbol definitions on the Sun + system: + OPENWINHOME=/usr/openwin + DISPLAY=vxt-ip:0 + LD_LIBRARY_PATH=/usr/openwin/lib + If the symbols are not defined, apply them manually. For example: + # setenv OPENWINHOME /usr/openwin + # setenv DISPLAY vxt_ip_address:0.0 + # setenv LD_LIBRARY_PATH /usr/openwin/lib + 7. To complete the initialization of the window manager, enter the following + commands: + # xrdb .Xdefaults (or .OWdefaults for Solaris 2.n systems) + # /usr/openwin/lib/openwin-sys + This is the OpenWindows X11/NeWS Server system + initialization file) + # olwm & + After you complete these steps, the Open Look window manager + environment should appear after a short time. + If the system displays errors about elements not found, you may need to modify + your path in .cshrc to access those elements. + 1. Use the find command to find the elements’ location. + 2. Modify the .cshrc file to include the correct path to the elements. + 3. Enter the following command to have the system read the updated .cshrc + file. + # source .cshrc + The following example uses the find command to locate the executable + code named xrdb: + # find / -name xrdb -print + + + + +30 Chapter 2 + Using the Terminal + 2.6 Using the Open Look Window Manager from Sun Systems + +Using Sun Open Look Fonts from the Host System +You use the Customize Font Path dialog box (Section 5.3) to enter the path to +the Sun Open Look fonts on your host system. By default, the VXT software +installation places font directories in the following path: +/tftpboot/vxt/fonts or /usr/tftpboot/vxt/fonts +The fonts you need are in the 100dpi and misc directories. +Specify the following two font paths in the Customize Font Path dialog box. +You need both font paths to access the fonts for various Sun applications. The +font paths you specify depend on whether your host system uses restricted or +unrestricted TFTP access. Digital recommends using restricted TFTP access, +for security reasons. +Restricted TFTP Systems +/vxt/fonts/misc/fonts.dir +/vxt/fonts/100dpi/fonts.dir +Unrestricted TFTP Systems +/tftpboot/vxt/fonts/misc/fonts.dir +(or /usr/tftpboot/vxt/fonts/misc/fonts.dir) +/tftpboot/vxt/fonts/100dpi/fonts.dir +(or /usr/tftpboot/vxt/fonts/100dpi/fonts.dir) +Using Sun Open Look Fonts from an InfoServer +Server-based terminals can use an InfoServer system to provide the Sun Open +Look fonts. VXT Software Version 2.1 Installation and System Management +describes how to use the terminal’s font manager to copy host fonts to +InfoServer font sets. +Converting Sun Fonts +The VXT 2000 windowing terminal uses fonts in the portable compiled font +(PCF) format. You can convert Sun fonts into PCF format, using conversion +utilities provided with the VXT software installation kit. See VXT Software +Version 2.1 Installation and System Management. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 31 + Using the Terminal +2.7 Customizing Your Terminal’s Environment + +2.7 Customizing Your Terminal’s Environment + The Customize menu in the Terminal Manager window lets you check + and control the settings for many features—from the keyboard to host + communications. See the following chapters for details on the Customize + menu: + Chapter 3 Describes user-preference and security settings (top half of the + Customize menu). + Chapter 4 Describes settings that affect communication with host systems + (Communications submenu). + Chapter 5 Describes advanced settings for autostarting sessions, entering font + paths, booting VXT software, and turning VXT software options on or + off (bottom half of Customize menu). + + +2.8 Printing + This section describes how to + • Print the screen from the Print Screen menu + • Send printing jobs from a host system to the terminal’s printer + You can also perform printing operations from the Print menu in VXT + DECterm windows (Section 7.5). + Supported Printers + The terminal supports level 1 and level 2 Digital printers. + • Level 1 printers include the LA50 and LA70 dot matrix printers. + • Level 2 printers include the LA75 and LA324 dot-matrix printers; LJ250 + (serial) and LJ252 (parallel) color ink-jet printers; and LN03, LN05, and + LN06 laser printers. + The terminal also supports PostScript printers, including Digital’s and + ScriptPrinter and DEClaser family, the HP LaserJet II and HP LaserJet III + printers, and the IBM 4019 laser printer. + +2.8.1 Printing the Screen + The Print Screen menu in the Terminal Manager window lets you print all or + part of the screen display, using a serial or parallel printer connected to the + rear of the terminal. Depending on your printer, you can print monochrome, + gray scale, or color displays in sixel or PostScript format. + You can also cancel a current printing job sent from a remote host system to + the terminal’s printer. + + + +32 Chapter 2 + Using the Terminal + 2.8 Printing + +Before printing, you should customize the print screen settings and select the +port you are using (serial or parallel). Normally, the print screen function +is set to print a monochrome image in sixel format on the parallel port. To +customize the print screen settings, see Section 3.6. To choose the printer port, +see Section 4.2. +The Print Screen menu looks like this: + + VXT V2.1 Terminal Manager + + + + + LJ−01153C−RAGS + +To print the complete screen image: +Choose the Local Print Entire Screen menu item. +If you are printing from a VR319 monitor to an LA50 printer, the image may +be too large for the page. Click on the Rotate/Scale Picture button in the +Terminal Manager window’s Customize Print Screen dialog box to print the +image on the page. +To print a portion of the screen image: +1. Choose the Local Print Portion of Screen menu item. The pointer turns + into a cross. +2. Wait for terminal to redisplay the Print Screen menu. +3. Move the pointer to one corner of the area you want to print. Hold down + MB1 and drag the pointer to the opposite corner of the desired area. As + you drag the pointer, a rectangular outline is displayed. +4. Release MB1 to send the selected image to the printer. +To cancel a remote printing job that is currently printing: +Choose the Cancel Current Remote Print Job menu item. The remote print job +currently printing stops. +Normally, the terminal can accept printing jobs from systems using the TCP/IP +or LAT transport. To change this setting, see Section 4.2. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 33 + Using the Terminal +2.8 Printing + + Printer Status + When you send a job to the printer, the terminal displays printer status + messages in the VXT Message Box. + Printer Offline Indicates that the printer is turned off or not + connected. The printer did not assert its DTR signal + within 2 seconds after the print request. + Printer Busy Indicates the printer is printing another job. + In both cases, your print request is canceled. + Canceling a Print Screen Operation + During large printing jobs, the terminal displays a Print Cancel dialog box to + let you cancel the print operation. To cancel the print operation, click on the + Click Here to Cancel Print button. Printing stops when the printer empties its + input buffer. The Print Cancel dialog box is not printed. + +2.8.2 Printing from a Host System + VXT Software Version 2.1 Installation and System Management describes how + to set up the terminal’s printer port for printing from a host system. After + the host is set up, you can send printing jobs from the host to the terminal’s + printer. + You can print from hosts that use the TCP/IP or LAT transport. + Printing from Hosts that Use TCP/IP + To use TCP/IP for printing: + • The terminal’s TCP/IP or Ethernet address must be displayed in the + Terminal Manager window + • The Host Accessible Printer Port button must be enabled in the Customize + Serial and Parallel Ports dialog box (Section 4.2). This is the default + setting. + • The VXT printer support utilities provided with the VXT software + installation kit must be installed on your host system. + The terminal accepts only one TCP/IP printing job at a time. If a second job is + sent while the first job is printing, the second job is ignored and no notification + is sent to the requester. The requester must wait until the first job completes, + then submit the second job again. + + + + +34 Chapter 2 + Using the Terminal + 2.8 Printing + +Printing from ULTRIX, DEC OSF/1 AXP, SunOS, or IBM AIX Hosts Use the +lpr command to submit printing jobs to the terminal’s printer. Ask your +system manager for the printer name to specify. +lpr -Pvxt_printer [-Dpostscript] printfile +• vxt_printer is the name of the printer connected to the terminal. +• printfile is the file to print. +• The -Dpostscript option is for printing PostScript files from ULTRIX + systems. You can use this option if your printer supports PostScript + printing. +For more information, see the lpr man page. +Printing from an HP–UX or SCO ODT Host Use the lp command to submit +printing jobs to the terminal’s printer. Ask your system manager for the +printer name to specify. +lp -dvxt_printer printfile +• vxt_printer is the name of the printer connected to the terminal. +• printfile is the file to print. +Printing from an OpenVMS Host +To print from an OpenVMS system to a VXT 2000 windowing terminal’s +printer, use the DCL PRINT command. Ask your system manager for the +printer’s queue. +$ PRINT/QUEUE=vxt_printer myfile.EXT +• vxt_printer is the name of the terminal’s printer queue. Use the queue + name that was created when initializing the printer port. +• myfile.ext is the file you wish to print. +Canceling a Remote Printing Job +To cancel a printing job from a host that is currently printing, choose the +Cancel Current Remote Print Job menu item from the Print Screen menu in +the Terminal Manager window. The terminal stops printing the current job. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 35 + Using the Terminal +2.9 Getting Started Menu + +2.9 Getting Started Menu + The Getting Started menu in the Terminal Manager window provides help + on choosing your keyboard type, entering an IP or DECnet address, and + creating sessions. If you have a server-based terminal, you can also acess + the InfoReader library of online VXT documentation. To display the Getting + Started menu, click on the Getting Started menu in the menu bar. The Getting + Started menu looks like this: + + VXT V2.1 Terminal Manager + + + + + LJ−01144D−RAGS + + InfoReader—Viewing Online VXT Documentation + To view online VXT documentation, choose the InfoReader... menu item. + The documentation is an optional part of the VXT software installation. The + InfoReader utility is similar to the Bookreader utility on DECwindows systems. + When you choose the InfoReader... menu item, the terminal displays a new + window that lists the available VXT document titles. If you are unfamiliar + with Bookreader or InfoReader, double click on the Using InfoReader selection. + For VXT Version 2.1 software, the following titles are available: + • VXT 2000+ /VXT 2000 Windowing Terminal Installing and Getting Started + (in six languages) + • VXT 2000+ /VXT 2000 Windowing Terminal User Information + • VXT Software Version 2.1 Release Notes + • VXT Software Version 2.1 Installation and System Management + Each section of this document is a separate online book that covers the use + of VXT software on different operating systems. + + + + +36 Chapter 2 + Using the Terminal + 2.9 Getting Started Menu + +• InfoServer System Operations Guide + + + + + LJ−03013A−RAGS + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 37 + 33 + Customizing the Terminal + + + This chapter describes how you can customize basic terminal feature settings, + using the top half of the Customize menu in the Terminal Manager window. + The chapter also describes how to customize the VXT Message Box. + Initially, the terminal uses factory-default settings that work with many + host systems. You can make changes to suit your personal preference and + computing environment. After you make changes, you can save your settings + for all future sessions. + The chapter covers the following major topics: + • Displaying the Customize Menu + • Saving and Restoring Terminal Manager Settings + • Changing Your Keyboard Settings + • Choosing the Display Language + • Changing Your Pointer and Mouse Settings + • Changing Your Print Screen Settings + • Changing Your Security Settings + • Changing Your Screen Background + • Changing Your Window Colors + • Changing Your Terminal Manager Settings + • Changing Your Video Alignment Settings (VX227 Models) + • Saving the Terminal Manager Window’s Position and Size + • Customizing the VXT Message Box + + + + +38 Chapter 3 + Customizing the Terminal + 3.1 Displaying the Customize Menu + +3.1 Displaying the Customize Menu + To display the Customize menu, click on Customize in the Terminal Manager + window’s menu bar. This chapter describes the menu items highlighted in + gray: + + VXT V2.1 Terminal Manager + + + + + LJ−01157D−RAGS + + + When you choose one of the highlighted menu items from the Customize menu, + the terminal displays a dialog box with the feature settings for that topic. In + dialog boxes, shaded buttons indicate the current settings. You can examine + the settings and change them if desired. You can use the last three menu items + to save and restore the Terminal Manager window’s position and size. + + Note + A system manager can customize settings for terminals and work + groups. The system manager can also lock or unlock access to one or + more of the Customize menu items. Locked menu items are dimmed. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 39 + Customizing the Terminal +3.2 Saving and Restoring Terminal Manager Settings + +3.2 Saving and Restoring Terminal Manager Settings + Each dialog box has a set of push buttons for saving and restoring settings. + After you make changes in a dialog box, you can save your settings for future + sessions by clicking on the OK button or Apply button. If you do not want to + save your changes, click on the Cancel button. Some new settings do not take + effect until you end your current session and begin another one. + + Click on ... To ... + OK Apply and save new settings and dismiss the dialog box. + Apply Apply and save new settings without dismissing the dialog box. + System Defaults Apply and save the factory-default settings, clearing all text and + scroll boxes. + If your terminal is in a work group: Clicking on the System + Defaults button applies and saves the work group’s customized + settings. + Cancel Dismiss the dialog box without changing any settings. If you made + any changes without applying them, clicking on the Cancel push + button cancels those changes. + + + + +40 Chapter 3 + Customizing the Terminal + 3.3 Changing Your Keyboard Settings + +3.3 Changing Your Keyboard Settings + You can control general keyboard settings from the Terminal Manager window, + such as your keyboard type and keyclick volume. The keyboard type setting + should match the keyboard you are using. To view or change your keyboard + settings, choose Keyboard... from the Terminal Manager window’s Customize + menu. The Customize Keyboard dialog box looks like this: + + Note + You can also customize some keyboard settings for individual VXT + DECterm windows. See Chapter 7. + + + + + LJ−01158−RAGS + + + From the Customize Keyboard dialog box, you can change any of the following + settings: + Keyboard Type + The keyboard comes in various models for different languages and dialects. + The location of some keyboard characters varies, depending on the keyboard + model. Make sure the Keyboard Type setting in the dialog box matches your + keyboard model number, so the system will send the correct characters when + you use the keyboard. + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 41 + Customizing the Terminal +3.3 Changing Your Keyboard Settings + + The System Default setting is the North American model of your standard + (LK401), short UNIX style (LK421), PC style (LK443 or LK444), or Sun style + (LK460) keyboard. If you are using a keyboard for another language or dialect, + you must choose the matching keyboard type. + To find your keyboard model number: Look on the bottom of the keyboard + for the label that specifies the model number. The model number should be in + a format similar to LK4nn-xx or nn-nnnnn-xx. Use the xx value to choose your + keyboard type from the Keyboard Type scroll box. + For example, if you have a British keyboard and the model number is LK401- + AA, you choose British_LK401AA_TW or British_LK401AA_DP. + Typewriter (TW) or data processing (DP) keys + You also use the keyboard type setting to specify whether you want your + keyboard to act as a typewriter (TW) or data processing (DP) keyboard. + This setting affects keys with three or more characters. If you choose data + processing, these keys send the characters on the right half of their keycaps. + If you choose the typewriter setting, these keys send the characters on the left + half of their keycaps. + Typewriter and data processing settings are identical for these keyboard types: + • North American and Dutch + • When using 8-bit multinational characters: British, German, and + Portuguese + When using DECwindows: The DECwindows host session manager has a + similar Keyboard Type option. Digital recommends that you leave the host + setting at System Default to avoid having the host session manager and local + terminal manager compete to set the keyboard. + Bell Volume + The keyboard’s warning bell alerts you to system messages. To adjust the bell + volume, either drag the Percent Volume slider to the right or left, or point to + a new location on the scale and click MB1. To disable the bell, click on the + Disable button. + Keyclick Volume + When you press a keyboard key, the keyboard makes a clicking sound. To + adjust the keyclick volume, either drag the Percent Volume slider to the right + or left, or point to a new location on the scale and click MB1. To disable + keyclicks, click on the Disable button. + + + + +42 Chapter 3 + Customizing the Terminal + 3.3 Changing Your Keyboard Settings + + Cursor Blink +Normally, the text input cursor blinks. To adjust the rate of blinking, either +drag the Milliseconds slider to the right or left, or point to a new location on +the scale and click MB1. To disable blinking, click on the Disable button. Your +new setting takes effect when you restart the terminal. +VXT DECterm windows also have a Cursor Blink feature, controlling the text +cursor in the VXT DECterm terminal window. The Cursor Blink setting in +the Customize Keyboard dialog box has no effect on the VXT DECterm Cursor +Blink setting. + Auto Repeat +When you press a key longer than normal, it repeats until you release it. To +disable this feature, click on the Disable button. The Help and Return keys +never autorepeat. +VXT DECterm windows also have an Auto Repeat feature. When you create +a VXT DECterm window, its Auto Repeat setting works independently of the +Terminal Manager window’s setting. To disable Auto Repeat for the Terminal +Manager and VXT DECterm windows, disable both settings. + Lock Key State +Normally when you press the lock key, the alphabetic keys send uppercase +letters; the number keys and nonalphabetic character keys do not send their +shifted character. +When you click on the Shift Lock button, all keys send their shifted character. +The new setting takes effect when you restart the terminal. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 43 + Customizing the Terminal +3.4 Choosing the Display Language + +3.4 Choosing the Display Language + The terminal supports different display languages for VXT screens. To change + your display language setting, choose Language... from the Terminal Manager + window’s Customize menu. The Customize Language dialog box looks like this: + + + + + LJ−01159A−RAGS + + To choose a new language: + 1. Click on the language in the Session Language scroll box. + 2. Click on OK to save the setting and dismiss the Customize Language dialog + box. + 3. Display the Session menu from the Terminal Manager window’s menu bar. + 4. Click on Reboot to restart the terminal and display the new language. + Hebrew Language for VXT DECterm Windows Only + The Hebrew language setting only affects VXT DECterm windows. All other + VXT windows are displayed in English. You may also wish to select the + Hebrew keyboard type. + Reenter Your AutoStart Settings + If you have customized AutoStart settings, you must reenter the settings after + you change your display language (Section 5.6). + + + + +44 Chapter 3 + Customizing the Terminal + 3.5 Changing Your Pointer and Mouse Settings + +3.5 Changing Your Pointer and Mouse Settings + You can change the shape, color, and speed of the screen pointer for the mouse + or other input device. You can set the mouse buttons for a left-handed or + right-handed user. You can also set the time limit for performing the second + click in a double-click sequence. To change your mouse and pointer settings, + choose Pointer... from the Terminal Manager window’s Customize menu. The + Customize Pointer dialog box looks like this: + Customize Pointer Dialog Box (Monochrome) + + + + + LJ−01160−RAGS + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 45 + Customizing the Terminal +3.5 Changing Your Pointer and Mouse Settings + + Customize Pointer Dialog Box (Gray Scale or Color) + + + + + LJ−01150−RAGS + + + From the Customize Pointer dialog box, you can change any of the following + settings: + Pointer Acceleration + Click on one of the four options to vary the rate at which the pointer moves in + relation to the mouse. The None setting keeps the pointer speed constant. The + Fast setting makes the pointer move farther as you move the mouse faster. + The default setting is Medium. + Button Arrangement + The default mouse button arrangement is for a right-handed user—MB1 on the + left of the mouse and MB3 on the right. If you are left-handed, you can click + on the Left Handed button. This makes MB1 the right mouse button and MB3 + the left mouse button. MB2 is always the middle button. + + + + +46 Chapter 3 + Customizing the Terminal + 3.5 Changing Your Pointer and Mouse Settings + + Pointer Foreground Color +The pointer consists of an outline and filled center. +On a monochrome terminal: Normally, the pointer’s filled area is black with +a white outline. To reverse the fill and outline colors, click on the White On +Black button. +On gray scale and color terminals: Normally, the pointer’s filled area +(foreground) is black. To change this setting, click on the Pointer Foreground +Color button. The terminal displays a Color Mixing dialog box (Appendix B). +To see your changes, click on Apply or OK in the dialog box. + Pointer Background Color +This button is only on gray scale and color terminals. To change the default +color, click on the Pointer Background Color button. The terminal displays a +Color Mixing dialog box (Appendix B). +To see your changes, click on Apply or OK in the dialog box. + Pointer Shape +To change the pointer shape, scroll through the list of shapes and choose the +one you want. + Mouse Double Click Timeout +Some applications can tell two single clicks from a double click, based on the +speed at which buttons are clicked. To change the time allowed for making the +second click in a double-click sequence, drag the slider to the right or left, or +move the pointer to a location on the scale and click MB1. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 47 + Customizing the Terminal +3.6 Changing Your Print Screen Settings + +3.6 Changing Your Print Screen Settings + Print screen settings affect a printer connected locally to the serial or parallel + port on the rear of the terminal. You can control certain printing features for + print screen operations, such as the output format and the ability to center or + rotate the image. To view the print screen settings, choose Print Screen... from + the Terminal Manager window’s Customize menu. The Customize Print Screen + dialog box looks like this: + + + + + LJ−01161−RAGS + + + From the Customize Print Screen dialog box, you can change the following + settings: + Output Format + You can choose the output format to match your printer’s data format, sixel or + POSTSCRIPT. + + + + +48 Chapter 3 + Customizing the Terminal + 3.6 Changing Your Print Screen Settings + + Pixel Aspect Ratio +You can choose the pixel aspect ratio to match the dot density of the printer +you are using. A pixel aspect ratio of 1 to 1 is appropriate for most printers. +• For level 2 printers such as the LA75 or LN03, use a pixel aspect ratio of + 1 to 1. +• For level 1 printers such as the LA50, use a pixel aspect ratio of 2 to 1. + Print FF Mode +The terminal can send a form feed (FF) character to the printer port at the end +of a print screen operation. If you want to send a form feed, click on the Form +Feed button. + Ribbon or Toner Saver +Normally, you print dark images on a light background. However, a large +image may consume a great deal of printer ribbon or toner. To save ribbon or +toner, you can click on the Negative Image button; this reverses the dark and +light portions of the printed output. + Output Color Mode +Window snapshots are usually printed or captured in black and white. +Click on the Color option if you want to print color pictures. Click on the +Grayscale option to print black and white images in various gray tones. The +Grayscale setting also makes screen colors easier to distinguish in black and +white print. +You may want to use the Dithered Color or Dithered Grayscale buttons when +you are printing continuous tone images, such as photographic images. + Center Image +Use the Center Image button to automatically center the screen image on the +printed page. + Rotate/Scale Picture +For wide images, you can use the Rotate/Scale button to automatically rotate +and scale images so they fit on the printed page. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 49 + Customizing the Terminal +3.7 Changing Your Security Settings + +3.7 Changing Your Security Settings + Initially, you cannot connect to your terminal from another system (unless + your system manager has customized your security settings). This means you + cannot log in from another system and use your terminal until you authorize + yourself to do so. + You can choose which hosts and users can connect to your terminal. Only + authorized hosts and users can make connections to the terminal to display + applications on your screen or request data from your screen. To change your + security settings, choose Security... from the Terminal Manager window’s + Customize menu. The Customize Security dialog box looks like this: + + + + + LJ−01162B−RAGS + + Connections Allowed + Normally, only those users listed in the Authorized Users scroll box can connect + to the terminal. To allow any user on the network to connect to the terminal, + click on the All button. + To prevent any X connection to your terminals, click on the Listed Users Only + button and leave the Authorized Users scroll box empty. + + + +50 Chapter 3 + Customizing the Terminal + 3.7 Changing Your Security Settings + +Listed Users Only When you choose this setting, only the systems and users +entered in the Authorized Users scroll box can establish X connections to +your terminal. This setting requires that you authorize your own account in +addition to any others that need access to your display. +All When you choose this setting, any system on the Ethernet can establish +an X connection to your terminal. Use this setting if you are part of a small +group running interactive applications that require sharing of information in +real time. + Authorized Users +The Authorized Users scroll box contains the names of those users you allow +to have access to your terminal. When you add a user, you associate the user +with their communication transport, address, node name, and username, if +applicable. +To add users to the Authorized Users List: +1. In the Transport box, click on the type of transport of the user (TCP/IP, + LAT, or DECnet). +2. Enter an address or node name in the Node box, then press the Return + key. + • TCP/IP example: market or 12.345.123.45 + • LAT example: MARKET + • DECnet example: MARKET or 61.513 +3. For LAT and DECnet, enter a username in the Username box, then press + the Return key. You can use the asterisk (*) wildcard character to specify + all users. + • Example: CAROLYN or * +4. Click on the button to enter the user in the Authorized Users scroll + box. +5. Repeat the previous steps for each user you want to add to the Authorized + Users scroll box. +6. Click on Apply or OK to save your security settings. +To remove an authorized user: +1. In the Authorized Users scroll box, click on the username you want to + remove. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 51 + Customizing the Terminal +3.7 Changing Your Security Settings + + 2. Click on the trash can button. + + Caution + If you click on System Defaults, you clear the Authorized Users scroll + box. If you belong to a work group, System Defaults recalls your work + group settings. + + + +3.8 Changing Your Screen Background + You can change the look of your terminal’s screen display. For example, you + can change the screen’s background color or select the default screen pattern. + To change your screen settings, choose Screen Background... from the Terminal + Manager window’s Customize menu. The Customize Screen Background dialog + box is displayed: + Customize Screen Background Dialog Box (Monochrome) + + + + + LJ−01163A−RAGS + + + + +52 Chapter 3 + Customizing the Terminal + 3.8 Changing Your Screen Background + +Customize Screen Background Dialog Box (Gray Scale or Color) + + + + + LJ−01177−RAGS + + +From the Customize Screen Background dialog box, you can change the +following settings: + Screen Saver +The Screen Saver extends the life of your monitor by shutting off the display if +the terminal is inactive for a specified time. Normally, the terminal shuts off +its display after 10 minutes of keyboard or mouse inactivity. You can use the +sliding scale to vary the time, from 1 to 60 minutes. + Screen Background +The default screen background pattern is a tight, gray crossweave. To change +the screen background to a solid color: +On a monochrome terminal: Click on the Black or White radio button. +On gray scale and color terminals: Click on the Solid Color button. Then +click on the Screen Color button. The terminal displays a Color Mixing dialog +box (Appendix B). +To see your new setting in effect, click on Apply or OK. +To display the default pattern, click on the Default Pattern button. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 53 + Customizing the Terminal +3.8 Changing Your Screen Background + + DECwindows Session Manager Sets the Screen Background + On host systems that use DECwindows software, the session manager has a + similar Screen Background option. If you create an X session to the system, + the screen background setting on the host system takes effect. For a consistent + screen background, use the same setting on the terminal and the host. + +3.9 Changing Your Window Colors + You can change the window colors of your local VXT windows. On monochrome + terminals, you can use the default black text on a white background or change + to white text on a black background. On gray scale and color terminals, you + can change foreground, background, and highlight colors. You can also change + the shadow colors that produce the three-dimensional look. + If you have VXT Version 2.1 software, your color settings also affect local VXT + DECterm windows. + Your window color settings do not affect windows that you open through a + remote session manager. For example, if you open DECterm windows through + a remote session manager on a host system, you can set the colors for those + windows in the remote session manager. + To change your window color settings, choose Window Color... from the + Terminal Manager window’s Customize menu. The terminal displays the + Customize Window Color dialog box for a monochrome or color terminal. + Customize Window Color Dialog Box (Monochrome) + + + + + LJ−01164−RAGS + + From the Customize Window Color dialog box, you can change the following + settings on monochrome terminals: + + + + +54 Chapter 3 + Customizing the Terminal + 3.9 Changing Your Window Colors + +On Monochrome Terminals + Window Color +The window color is normally black on white. Click on the White On Black +radio button to reverse the colors. +To see your new setting in effect, click on Apply or OK. +Customize Window Color Dialog Box (Color) + + + + + LJ−01165−RAGS + + +From the Customize Window Color dialog box, you can change the following +settings on gray scale or color terminals: +On Gray Scale or Color Terminals + Top Shadow Color +Top and bottom shadow colors must be well matched to present a three- +dimensional look. Normally, the terminal automatically determines top and +bottom shadow colors when you change the window color. When you use +automatic shadowing, the Top Shadow Color and Bottom Shadow Color labels +are dimmed. +To choose your own top shadow color: +1. Click on the Manual Shadowing button to disable automatic shadowing. +2. Click on the Top Shadow Color button to display the Color Mixing dialog + box (Appendix B). + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 55 + Customizing the Terminal +3.9 Changing Your Window Colors + + Window Background Color + The window background color is normally white. To change this setting, click + on the Window Background Color button to display the Color Mixing dialog box + (Appendix B). + If you save your changes by clicking on Apply or OK in the Color Mixing dialog + box, your new settings take effect when you start your next session. + Bottom Shadow Color + The Bottom Shadow button works like the Top Shadow button. + Window Foreground Color + The Window Foreground Color setting changes the color of text and graphics in + the window. + To change the window foreground color, click on the Window Foreground Color + button to display the Color Mixing dialog box (Appendix B). + If you save your changes by clicking on Apply or OK in the Color Mixing dialog + box, your new settings take effect when you start your next session. + Highlight Color + The Highlight Color setting controls the color of screen objects with input focus + such as text-entry boxes and check and radio buttons. The highlight color is + normally black. To change the highlight color, click on the Highlight Color + button to display the Color Mixing dialog box (Appendix B). + If you save your changes by clicking on Apply or OK in the color mixer, your + new settings take effect when you start your next session. + +3.10 Changing Your Terminal Manager Settings + The Customize Terminal Manager dialog box lets you choose various settings + that affect the terminal manager and window management. You can + • Choose to use the terminal’s window manager or a window manager on a + host system + • Choose the Terminal Manager window’s startup state (normal, icon, or + hidden) + • Use the F3 toggle key to hide or display the Terminal Manager window + • Disable the confirmation box displayed when resetting the terminal + • Enter a tag to identify your terminal in the configuration manager + • Enter the text to display when you pause a session + + + +56 Chapter 3 + Customizing the Terminal + 3.10 Changing Your Terminal Manager Settings + +• Specify how frequently to update the status boxes in the Session menu +To change your Terminal Manager window settings, choose Terminal Manager... +from the Terminal Manager window’s Customize menu. The Customize +Terminal Manager dialog box looks like this: + + + + + LJ−01166C−RAGS + + +From the Customize Terminal Manager dialog box, you can change the +following settings: + Allow Remote Window Manager +You can choose whether or not a host-based window manager can take over +windowing operations on the screen. The terminal’s local window manager +provides you with quicker response time and overall higher performance. +However, a host-based window manager may offer more features. To let the +host control windowing operations, click on the Allow Remote Window Manager +button. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 57 + Customizing the Terminal +3.10 Changing Your Terminal Manager Settings + + Confirm Reset Session + When you choose Reset, Reboot, or Shutdown from the Session menu, the + terminal normally asks for confirmation. You can turn this feature on or + off by clicking on the Confirm Reset Session button. When this feature + is off, choosing Reset, Reboot, or Shutdown from the Session menu will + immediately end the current session, without displaying the confirmation + box. See Section 2.3.3 for details on the Session menu. + Confirm Close Terminal Manager + When you choose Close from the Session menu, the terminal normally asks you + to confirm that you want to close the Terminal Manager window. You can turn + this confirmation feature on or off by clicking on the Confirm Close Terminal + Manager button. When this feature is off, choosing Close from the Session + menu immediately closes the Terminal Manager window, without displaying + the confirmation box. Closing the Terminal Manager window also closes the + VXT Message Box, unless you have customized the terminal to start the VXT + Message Box as a separate application. + Disable F3 Key (For Hiding the Terminal Manager Window) + You can choose to use the F3 key as a toggle key for hiding and displaying the + Terminal Manager window, VXT Message Box, and their icons. This feature + allows you to hide these applications while you are working in other windows, + then redisplay them when needed. Normally, the F3 key function is disabled. + When you redisplay the Terminal Manager window and VXT Message Box, the + message box receives input focus. + If you have customized the AutoStart dialog box to start the Terminal Manager + window and VXT Message Box as separate applications, then the F3 key + cannot hide the message box. In this case, the Terminal Manager window + receives input focus when you redisplay it. + When you use the F3 key to hide and redisplay the Terminal Manager and + VXT Message Box, you lose any customized window size settings for those + applications. If you maximize the windows before hiding them, you cannot use + the maximize button to return them to their normal size. + Startup State + Normally when you restart the terminal, it displays the Terminal Manager + window and VXT Message Box. You can choose to hide the Terminal Manager + window and VXT Message Box at startup, or to display them as icons. To + change the current setting, click on the appropriate button. + + + + +58 Chapter 3 + Customizing the Terminal + 3.10 Changing Your Terminal Manager Settings + +If you have changed the Customize AutoStart dialog box settings to start the +Terminal Manager window and VXT Message Box as separate applications, the +Startup State only affects the Terminal Manager window. + + Caution + Before you change the Startup State to Hidden, decide whether or + not you need to make the Terminal Manager window viewable after + startup. If you want the window to be viewable, make sure the F3 key + is enabled to display the Terminal Manager window. See the Disable + F3 Key button in this dialog box. If you forget to enable the F3 key, + see your system manager to change the setting from the Configuration + Manager: Resource Management dialog box. + + + Terminal Tag +You can specify a name to identify your terminal in the configuration manager +(server-based systems only). To enter a name, click on the Terminal Tag box. +Your name can have up to 31 characters. After you click on Apply or OK in the +Customize Terminal Manager dialog box, your system manager can display the +new terminal tag in the Configuration Manager: Resource Management dialog +box. +Your system manager can also create a name for your terminal by using the +Optional Name field in the configuration manager’s Create Terminal dialog box. +The terminal uses the most recently entered name (Terminal Tag or Optional +Name). + Pause Prompt +You can specify the text displayed in the pause prompt box when you pause +your terminal session. Click on the Pause Prompt box and enter a prompt of +up to 80 characters. + Status Update Frequency (seconds) +You can specify how frequently the terminal updates the information in the +status dialog boxes displayed from the Session menu. The normal setting is 5 +seconds. Click on the Status Update Frequency (seconds) slider to specify an +interval from 0 to 60 seconds. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 59 + Customizing the Terminal +3.11 Changing Your Video Alignment Settings (VX227 Models) + +3.11 Changing Your Video Alignment Settings (VX227 + Models) + If you have a VXT 2000 model VX227 windowing terminal, you adjust your + video alignment from a Customize dialog box rather than using physical + controls on the terminal. The video alignment dialog box is only for VX227 + terminals. + To adjust your video alignment settings, choose Video Alignment... from the + Terminal Manager window’s Customize menu. The Customize Video Alignment + dialog box looks like this: + + + + + 7 9 + + + + 8 + + + + + LJ−01139−RAGS + + From the video alignment dialog box, you can change the following settings. + Your new settings take effect when you click on OK. + Adjust Video Centering + You use the four Adjust Video Centering buttons to center the display on the + screen. Each time you click on an button, the display shifts in the arrow’s + direction. + Adjust Video Rotation + You use the two Adjust Video Rotation buttons to rotate the display on the + screen. Each time you click on one of the buttons, the display rotates in the + arrow’s direction. + + + + +60 Chapter 3 + Customizing the Terminal + 3.12 Saving the Terminal Manager Window’s Position and Size + +3.12 Saving the Terminal Manager Window’s Position and + Size + You can make changes to the Terminal Manager window’s position and size on + the screen, then save the changes for use in all future sessions. You can also + recall the factory-default position and size for the Terminal Manager window, + or recall the last position and size you saved. + To save or restore the Terminal Manager window’s position and size on the + screen, use the following menu items from the Customize menu: + + Choose... To... + Save Terminal Manager Window Save the Terminal Manager window’s + current position and size for use in all + future sessions. + Restore Terminal Manager Window Restore the last position and size you + saved. Choose this menu item if you want + to reset features you changed temporarily, + but did not save. + Default Terminal Manager Window Recall the factory-default position and size + for the Terminal Manager window. + + +3.13 Customizing the VXT Message Box + The VXT Message Box displays system status and error messages. You can + choose the categories of messages displayed. You can also set the number + of message lines saved in the scroll box. To change your VXT Message Box + settings: + 1. Click on the Customize menu in the VXT Message Box. + + + + + TI−03011−RAGS + + 2. Choose Message Box... to display the Customize Message dialog box. + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 61 + Customizing the Terminal +3.13 Customizing the VXT Message Box + + + + + TI−03012−RAGS + + From the Customize Message dialog box, you can change the following settings: + Message Region + You can scroll through text in the VXT Message Box. The Scroll Lines Saved + slider lets you specify how many message lines to save when they are scrolled + out of the region. Any extra lines are discarded. + This feature does not affect the size of the Messages region. You can change + the size of the scroll box by changing the size of the VXT Message Box window. + Messages Displayed + Normally, the terminal displays all informational, warning, and error messages + in the Messages scroll box. You can choose to display warning and error + messages only, or error messages only. + Header Text + Normally, the title of the Messages scroll box in the VXT Message Box is + Messages. To change the title, click on the Header Text box and enter a new + title. + + + + +62 Chapter 3 + Customizing the Terminal + 3.13 Customizing the VXT Message Box + +3.13.1 Saving the VXT Message Box’s Position and Size + You can make changes to the VXT Message Box’s position and size on the + screen, then save the changes for use in all future sessions. You can also recall + the factory-default position and size, or recall the last position and size you + saved. + To save or restore the VXT Message Box’s position and size on the screen, use + the following menu items from the Customize menu: + + Choose... To... + Message Box... Display the Customize Message Box. + Save Message Box Window Save the VXT Message Box’s current position and + size for use in all future sessions. + Restore Message Box Window Restore the last position and size you saved. Choose + this menu item if you want to reset features you + changed temporarily, but did not save. + Default Message Box Window Recall the factory-default position and size for the + VXT Message Box. + + Closing the VXT Message Box: + Normally, the VXT Message Box runs together with the Terminal Manager + window. To close the Terminal Manager window and VXT Message Box, click + on the Session menu in the Terminal Manager window and choose Close. + If you customize your AutoStart settings to run the VXT Message Box as a + separate application, the VXT Message Box has a separate File menu. In this + case, you can close the VXT Message Box alone by clicking on the File menu + and choosing Exit. See Section 5.6. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 63 + 44 + Customizing Communications + + + This chapter describes how to customize communication between the terminal + and host systems. Your terminal can use several communication protocols to + communicate with host systems: TCP/IP, NFS, LAT, LASTport, and DECnet. + You can also choose to use a serial or parallel port for a local printer or host + system. After you make changes, you can save your settings for all future + sessions. + The chapter covers the following major topics: + • Changing Your Serial and Parallel Port Settings + These settings affect your local printer or serial host. + • Changing Your LAT Settings + These settings let a system manager fine-tune communication in a LAT + network. + • Changing Your LASTport Group Code Settings (InfoServer Systems) + The group code determines which InfoServer systems your terminal can + communicate with. + • Changing Your TCP/IP IP Address Settings + You must enter an IP address to communicate with systems that use the + TCP/IP transport. + • Changing Your TCP/IP Name Server Settings + You must specify a name server if you want to identify TCP/IP systems by + name in other dialog boxes. + • Changing Your TCP/IP Routing Table Settings + You can specify routing information for communicating with TCP/IP + systems. + + + +64 Chapter 4 + Customizing Communications + + + • Changing Your NFS Settings + You must enter NFS Mount Points to communicate with systems that use + the NFS transport. + • Changing Your DECnet Name Translator Settings + You must specify a name translator if you want to identify DECnet systems + by name in other dialog boxes. + To customize communications, you use the Communications submenu on the + Terminal Manager window’s Customize menu. + +4.1 Displaying the Communications Submenu + To display the Communications submenu, first click on the Customize + menu in the Terminal Manager window and choose Communications. The + Communications submenu looks like this: + + VXT V2.1 Terminal Manager + + + + + .12.123.123 12.123 + + + + + LJ−03540−RAGS + + + When you choose a menu item from the Commmunications submenu, the + terminal displays a dialog box with the feature settings for that topic. In + dialog boxes, shaded buttons indicate the current settings. You can examine + the settings and change them if desired. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 65 + Customizing Communications +4.1 Displaying the Communications Submenu + + Note + A system manager can customize settings for terminals and work + groups. The VXT manager can also lock or unlock access to one or + more of the Customize menu items. Locked menu items are dimmed. + + + +4.2 Changing Your Serial and Parallel Port Settings + You can specify the communication settings of the terminal’s serial and parallel + ports to make them compatible with a serial host system or a local printer. + The default settings work with most Digital systems. Make sure the settings + you use match your host system. + The serial port is for connecting a host system or a local serial printer. The + parallel port is for connecting a local parallel printer. Each port has one 25-pin + connector on the rear of the system box. + When you connect to a host system through the serial port, you use the 25-pin, + RS–232 serial port connector on the rear of the terminal. The serial port + connector is above the parallel port connector. + To change the port settings, choose the Communications submenu from the + Terminal Manager window’s Customize menu. Then choose Serial and Parallel + Ports... to display the Customize Serial and Parallel Ports dialog box: + + + + +66 Chapter 4 + Customizing Communications + 4.2 Changing Your Serial and Parallel Port Settings + + + + + LJ−01168B−RAGS + +From the Customize Serial and Parallel Ports dialog box, you can change the +following settings: + Port Usage +By default, the parallel port acts as a printer port and the serial port acts as a +host port. You can set the serial port to act as the printer port. You can choose +one of two functions for the serial port: + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 67 + Customizing Communications +4.2 Changing Your Serial and Parallel Port Settings + + Choose... To... + Parallel Port: Printer, Use the parallel port for a parallel printer, and the serial + Serial Port: Host port for a host system. + Serial Port: Printer Use the serial port for a serial printer. + + Transmit + You can change the speed the terminal uses to send data, to match your host + system or printer. Normally, the serial port uses a speed of 9600 baud, which + works with most Digital systems. To choose another speed, click on the button + in the Transmit box and make a choice from the pop-up menu. Your new speed + appears in the Transmit box. + The terminal does not support speeds lower than 300 baud. + Receive + You can change the speed the terminal uses to receive data from the host + system or printer. Make sure you choose a receive speed that matches your + host’s or printer’s transmit speed. Normally, the terminal’s receive speed + matches its transmit speed (rx = tx setting). However, the terminal can + transmit at one speed and receive at another. + To choose another speed, click on the button in the Receive box and make a + choice from the pop-up menu. Your new speed appears in the Receive box. + Character Format + You can choose the word size and number of parity bits used to communicate + with the host system or printer. The terminal uses a default word size of 8 bits + and no parity. This setting works with most of today’s computer systems. + To choose another setting, click on the button in the Character Format box + and make a choice from the pop-up menu. Your new setting appears in the + Character Format box. + Parity Check + Normally, the terminal performs a parity check on bytes of data. To turn this + feature on or off, click on the Parity Check button. + Host Accessible Printer Port + Normally, the terminal can accept remote printing jobs sent from host systems + that use the TCP/IP or LAT transport. To turn this feature on or off, click on + the Host Accessible Printer Port button. To send printing jobs from a host, see + Section 2.8.2. + + + + +68 Chapter 4 + Customizing Communications + 4.2 Changing Your Serial and Parallel Port Settings + + Stop Bits + You can choose the number of stop bits used in the character format. Digital + recommends using one stop bit for most applications. To select two stop bits, + click on the Two button. + XOFF At + You can choose how many characters the terminal stores in its receive buffer + before sending the host or printer an XOFF signal to stop sending data. + Normally, the terminal sends XOFF to the host when the input buffer contains + 64 characters. To choose 128 characters or no XOFF, click on the appropriate + button. + Modem Control + You can choose Modem Control if you are communicating with a host system + and need to use extended modem features. Otherwise, use Data Leads Only. + Data Leads Only Choose Data Leads only if you do not plan to use modem + control features or your modem (or modem cable) is not configured for modem + control. The terminal uses pin 2 to transmit data and pin 3 to receive data. + The terminal asserts the data terminal ready (DTR) signal on pin 20 whenever + the terminal is on. + The terminal receives the data set ready (DSR) signal on pin 6. The terminal + uses DSR to detect the status of the connected printer or host system modem + and display status messages about the device. Note that in Data Leads Only + mode data is always transmitted, regardless of the state of the DSR signal. + Modem Control Choose Modem Control if you plan to use modem features + that require additional signals beyond data leads only, such as call origination + and dialing from the keyboard. The control lines follow the CCITT V.24 and + V.28 and EIA RS–232–C designations and control the flow of data based on the + state of various signals. + +4.3 Changing Your LAT Settings + OpenVMS systems typically use the local area transport (LAT) to connect to + the terminal. The terminal connects to all LAT group codes (0 to 255); you + cannot select group codes. + Your system manager can fine-tune the characteristics of your LAT + environment by adjusting the three slide bars in the Customize LAT dialog + box. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 69 + Customizing Communications +4.3 Changing Your LAT Settings + + Note + These settings directly affect the performance of your local area + network. Do not try to adjust these settings yourself; they should be + adjusted only by system managers. Incorrect adjustments can produce + poor network and terminal performance. + + + To change LAT settings and adjust performance, choose the Communications + submenu from the Terminal Manager window’s Customize menu. Then choose + LAT... to display the Customize LAT dialog box: + + + + + LJ−01169A−RAGS + + + From the Customize LAT dialog box, you can change the following settings: + LAT Circuit Timer + You set the LAT Circuit Timer to tune the network for the best response time + and network performance when running an X window or DECterm terminal + window session. The optimum setting depends on the number of users on + the local area network and the typical network traffic conditions. The normal + setting of 30 milliseconds produces the best performance for most systems. + + + + +70 Chapter 4 + Customizing Communications + 4.3 Changing Your LAT Settings + + LAT circuit timer settings takes effect when the first LAT circuit is created. If + you change the setting while LAT circuits are running, it does not take effect + until you exit all existing LAT circuits. + Retransmit Limit + To make a LAT connection to a host system, the terminal sends out a request- + to-connect message, then waits for an acknowledgement. If the host does not + acknowledge the request, the terminal resends the message a specified number + of times. + The Retransmit Limit setting tells the terminal how many times to resend the + message. If the terminal does not receive an acknowledgement after sending + the message the specified number of times, the terminal stops requesting a + connection and indicates it could not connect to that host. + Normally, the terminal resends the message 40 times before it stops trying to + connect to the host. This setting works well with most Digital systems. + Keep Alive Timer + When the terminal is inactive, it sends certain LAT messages out on the + network every few seconds to keep the LAT connection alive. Normally, the + terminal sends messages out every 40 seconds. This setting works well with + most Digital systems. + +4.4 Changing Your LASTport Group Code Settings + (InfoServer Systems) + Server-based terminals use an InfoServer system for downloading and booting + VXT software, configuration management, access to the InfoReader library, + virtual memory, and other services. To communicate with a particular + InfoServer system, your terminal must have the same group code as the + InfoServer. On large local area networks, group codes can help reduce + the number of InfoServer systems that your terminal must identify and + communicate with. + By default, the LASTport group code on InfoServer systems and VXT 2000 + windowing terminals is set to 0. If the InfoServer system’s group code is not 0, + you or your system manager must change the terminal’s default group code to + match the InfoServer’s group code. + The LASTport Group Code dialog box lets you change the terminal’s group + code setting to match the servers that you want to access. Ask your system + manager for your server’s group code. New group code settings take effect + when you restart the terminal. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 71 + Customizing Communications +4.4 Changing Your LASTport Group Code Settings (InfoServer Systems) + + If you cannot boot your terminal from an InfoServer system because your + terminal has a different group code: + 1. Quickly press and release the halt button on the rear of the terminal. + • If your terminal has a system box, the halt button is next to the + indicator lights on the rear of the system box. + • If your terminal does not have a system box, the halt button is below + the keyboard connector on the rear of the monitor. + 2. At the >>> prompt, enter the command b/100000. + 3. At the LASTport group code (0-1023)> prompt, enter the group code of the + server you want to connect to. See your system manager for the correct + group code. + 4. After the Terminal Manager window appears, enter the group code in the + Customize LASTport dialog box. + To enter or change LASTport group code address settings, choose the + Communications submenu from the Terminal Manager window’s Customize + menu. Then choose LASTport... to display the Customize LASTport dialog box: + + + + + LJ−01117−RAGS + + To enter a LASTport group code: + 1. Enter the LASTport group code (from 0 to 1023) in the text-entry box. + Examples: 34 or 567. + 2. Press Return or click on OK or Apply. + 3. Restart the terminal. + + + + +72 Chapter 4 + Customizing Communications + 4.5 Changing Your TCP/IP IP Address Settings + +4.5 Changing Your TCP/IP IP Address Settings + UNIX, ULTRIX, and DEC OSF/1 AXP systems typically use the TCP/IP + transport to connect to the terminal. To communicate with systems using + TCP/IP, you must enter an IP address and subnet mask for the terminal. You + use the Customize TCP/IP dialog box to enable or disable TCP/IP and enter + the terminal’s IP address and subnet mask. After you enter and save the IP + address, it appears at the bottom of the Terminal Manager window. + To enter or change TCP/IP address settings, choose the Communications + submenu from the Terminal Manager window’s Customize menu. Then choose + TCP/IP... to display the Customize TCP/IP dialog box: + + + + + LJ−01170C−RAGS + + From the Customize TCP/IP dialog box, you can change the following settings: + TCPIP + You can choose to enter an IP address yourself or to have the terminal + automatically determine its address from a file set up by your system manager. + Normally, the User Specified IP Address button is on. You can disable the use + of TCP/IP by clicking on the Disable button. + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 73 + Customizing Communications +4.5 Changing Your TCP/IP IP Address Settings + + Determine IP Address Use this setting if you want the terminal to + automatically determine its IP address, subnet mask, and the IP address + of an optional name server by reading a host system file created by your + system manager. + After you reboot the terminal, the terminal’s IP address appears in the + Terminal Manager window. + + Note + Your system manager must enter your terminal’s information in the + BOOTP daemon’s configuration file. + + + User Specified IP Address Use this setting if you want to enter your + terminal’s IP address in this dialog box. After you enter the address and reboot + the terminal, the terminal’s IP address appears in the Terminal Manager + window. + Disable Use this setting to disable TCP/IP. + Terminal’s IP Address + After you click on the User Specified Address button, you can enter an IP + address for your terminal. See your system manager for an address to use. + After you enter the IP address and subnet mask, click on OK to save the + address and dismiss the dialog box. Then reboot the terminal. + IP Subnet Mask + After you click on the User Specified Address button, you can enter the IP + subnet mask for your terminal. An IP subnet mask acts as a filter for your + TCP/IP network. Using the subnet mask makes the terminal ignore certain + traffic on the network. + See your system manager for a subnet mask to use. After you enter the IP + subnet mask, click on the OK button to save the setting and dismiss the dialog + box. Then reboot the terminal. + +4.6 Changing Your TCP/IP Name Server Settings + If your network has a name server, you can specify host systems by their + names instead of addresses when making entries in the Create and Customize + AutoStart dialog boxes. A name server stores host names and addresses, so it + can determine a host’s address from the name you enter. + You can specify a primary and secondary name server. See your system + manager for your name server’s IP address. + + +74 Chapter 4 + Customizing Communications + 4.6 Changing Your TCP/IP Name Server Settings + +To enter your name server, choose the Communications submenu from the +Terminal Manager window’s Customize menu. Then choose TCP/IP Name +Server... to display the Customize TCP/IP Name Server dialog box: + + + + + LJ−01171B−RAGS + +From the Customize TCP/IP Name Server dialog box, you can change the +following settings: + Primary Name Server IP Address +The terminal first attempts to use the primary name server to resolve names +entered into fields requiring a host name or IP address. If the terminal cannot +find the primary name server specified, you need to enter your terminal’s +domain name. +To enter or change the primary name server, click on the Primary Name Server +IP Address box and enter the primary name server’s IP address. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 75 + Customizing Communications +4.6 Changing Your TCP/IP Name Server Settings + + Secondary Name Server IP Address + If the terminal cannot resolve a host name or IP address with the primary + name server, the terminal queries the secondary name server. + If the Automatic button for Determine Domain Name is selected and the + primary name server is unavailable, the terminal uses the secondary name + server to provide translations from names to IP addresses for connections. + However, the secondary name server does not return the terminal’s domain + name, because it customarily resides within a second domain. + To enter or change the secondary name server, click on the Secondary Name + Server IP Address box and enter the secondary name server’s IP address. + Determine Domain Name + The terminal displays its domain name in the Domain Name box if the primary + name server finds it available on the network. The terminal attempts to + resolve a domain name only if a primary name server is specified. + To enter a domain name: + 1. Click on the User Specified button in the Determine Domain Name box. + 2. Enter a domain name in the Domain Name box. + 3. Click on Apply or OK. + If you choose the System Defaults button or clear the name server fields and + choose OK or Apply, the terminal’s Name Server capability is turned off and + the terminal no longer has a domain name. The Domain Name field is not + cleared, even though there is no domain name. + When you reboot the terminal, the domain name is determined and maintained + in the name server. If you change your primary name server, the domain of the + terminal does not change unless you change the domain name for the subnet + and reboot the terminal. + If the primary name server is on a different subnet than the terminal, the + domain name may not be available when you reboot the terminal. In this case, + the domain name is resolved the next time it is needed. + +4.7 Changing Your TCP/IP Routing Table Settings + You can enter TCP/IP routes from your network to hosts on other networks. + You can also enable or disable dynamic routing to automatically update the + network routing table. After you save your settings, you can view these and + other TCP/IP routes in the TCP/IP Routes dialog box (Section 6.3). + + + + +76 Chapter 4 + Customizing Communications + 4.7 Changing Your TCP/IP Routing Table Settings + +To enter your routes, choose the Communications submenu from the Terminal +Manager window’s Customize menu. Then choose TCP/IP Routing Tables... to +display the TCP/IP Routing Tables dialog box: + + + + + LJ−01172A−RAGS + +From the Customize TCP/IP Routing Tables dialog box, you can change the +following settings: + Dynamic Routing button +The Dynamic Routing button lets you enable or disable the VXT software’s +routing daemon. This daemon listens for routing information protocol (RIP) +packets and uses the packets to automatically enter, update, or delete TCP/IP +routes in the TCP/IP Routes dialog box (Section 6.3). + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 77 + Customizing Communications +4.7 Changing Your TCP/IP Routing Table Settings + + User Defined Routes scroll box + The User Defined Routes scroll box lists the route destination for each entry. + The gateway for each entry is stored, but not displayed. + To add a route to the User Defined Routes scroll box: + 1. Specify whether the route applies to either a host or a network, by clicking + on the Host, Network, or Default button. If you click on the Default button, + the terminal tries to determine if the route is for a host or a network. + 2. Click on the Destination box and enter the route’s destination. + 3. Click on the Gateway box and enter the route’s gateway. + 4. Click on the button to add your route to the Routes scroll box. + To remove a route: + 1. In the Routes scroll box, click on the route you want to remove. + 2. Click on the trash can button. + Metric button + RIP packets contain a metric that helps to determine which gateway to use. + Metric values range from 1 to 15, with smaller metrics indicating preferred + paths. A 0 metric affects only the system routing table and tells the system the + route is locally reachable. + +4.8 Changing Your NFS Settings + You can use the NFS transport to load fonts or read your customized terminal + resource files from host systems that use an NFS server. + The NFS transport uses mount points to identify locations where files can + be accessed. You can define up to 10 mount points in the Customize NFS + dialog box. You use these mount points when making entries in the Customize + Font Path dialog box (Section 5.3) or Customize Resource Files dialog box + (Section 5.9). + To enter your mount points, choose the Communications submenu from the + Terminal Manager window’s Customize menu. Then choose NFS... to display + the Customize NFS dialog box: + + + + +78 Chapter 4 + Customizing Communications + 4.8 Changing Your NFS Settings + + + + + LJ−03534−RAGS + +From the Customize NFS dialog box, you can change the following settings: + NFS Mount Points +The NFS Mount Points scroll box lists the currently entered mount points. +Each entry lists the full mount point name on the host and an equivalent name +that you define for local use on the terminal. + Host:RemoteName LocalName +You use the Host:RemoteName LocalName box to add a new mount point in +the scroll box. +To add a mount point to the NFS Mount Points scroll box: +1. Click on the Host:RemoteName LocalName box. Enter the mount point in + the following format: + Host:RemoteName LocalName + • Host is the name or IP address of the host with the NFS server. + • RemoteName is the directory path for the NFS server to export. + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 79 + Customizing Communications +4.8 Changing Your NFS Settings + + • LocalName is a local name you want to use for this mount point. You + use the local name when making entries in the Customize Font Path or + Customize Resource Files dialog box. + Examples + + Host:RemoteName LocalName + 16.122.128.224:/usr/lib/X11/fonts/decwin/75dpi nfs_fonts + mynode:/usr/users/resource resource + + To load fonts from the first sample mount point, you would use the local + name nfs_fonts when entering the font path in the Customize Font Paths + dialog box. + To load a terminal resource file from the second sample mount point, you + would use the local name resource when entering the path to the file in + the Customize Resource Files dialog box. + 2. Click on the button to add your mount point to the NFS Mount Points + scroll box. + To apply your mount points: + Click on OK or Apply. The terminal saves the listed mount points and tries to + mount any remote file systems you added. + To remove a mount point: + 1. In the NFS Mount Points scroll box, click on the mount point you want to + remove. + 2. Click on the trash can button. + Notes on Using NFS + For more information about using NFS, refer to your host system’s NFS + documentation. + • If an error occurs when mounting or accessing file systems, the VXT + Message Box displays an NFS error code. See Section A.1.1 for a list of + error codes. + • Some NFS mount daemons require name service to honor mount requests + that use an address instead of a name. + • Files on the NFS server must be world-readable. The terminal implements + NFS for clients only, so the NFS server must provide open file access. + + + + +80 Chapter 4 + Customizing Communications + 4.8 Changing Your NFS Settings + + • The NFS server must export remote file systems before the terminal can + mount them. The exported file system should include the areas holding the + desired fonts or terminal resource files. + +4.9 Changing Your DECnet Address Settings + To communicate with other DECnet nodes, your terminal must have a unique + DECnet address. From the Customize DECnet dialog box, you can enable + or disable the use of the DECnet transport and enter the terminal’s DECnet + address. + See your system manager for your terminal’s DECnet address. The new setting + takes effect when you reboot the terminal. + To enter or change your terminal’s DECnet address settings, choose the + Communications submenu from the Terminal Manager window’s Customize + menu. Then choose DECnet... to display the Customize DECnet dialog box: + + + + + LJ−01118−RAGS + + From the Customize DECnet dialog box, you can change the following settings: + DECnet + Before you can enter an address, you must click on the User Specified DECnet + Address button. You can disable the use of the DECnet transport by clicking + on the Disable button. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 81 + Customizing Communications +4.9 Changing Your DECnet Address Settings + + Terminal’s DECnet Address + After you click on the User Specified DECnet address button, you can enter + your terminal’s DECnet address in the Terminal’s DECnet Address box. Click + on OK to save the address and dismiss the dialog box. + You can enter your DECnet address in the long or short form: + • The long form uses a period to separate the area number and node number. + Example: 61.513. + • The short form collapses the area number and node number into a single + decimal value, using the formula (area_number 1024) + node_number. +  + + + + + Example: (61  1024) + 513) = 62977. + Network Buffer Size + The system manager chooses a DECnet network buffer size to optimize the + traffic flow on a wide area network, minimizing retransmission costs while + maximizing throughput. The default network buffer size 576 bytes. + You enter your network buffer size in the Network Buffer Size box. See your + VXT manager for the correct size. The buffer size value must be consistent + throughout your network. Click on OK to save the size and dismiss the dialog + box. + +4.10 Changing Your DECnet Name Translator Settings + You can use DECnet node names instead of DECnet addresses to specify host + systems in the Create and Customize AutoStart dialog boxes. + The terminal can check the DECnet node names you use without maintaining + a local node name database. To do this, the terminal uses the DECnet Network + Management Listener (NML) object (object 19) on a host system as its name + translator. You specify the host system in the Customize DECnet Name + Translator dialog box. + When resolving a DECnet address, the terminal connects to the NML object + and issues a Network Information and Control Exchange (NICE) protocol + message. This message conveys the NCP command SHOW NODE nodename + to the host. The host responds with the DECnet address associated with the + supplied node name. + Your terminal first attempts to connect to the primary name translator. If + the primary name translator is unavailable, the terminal attempts to use the + secondary name translator. + See your system manager for the addresses of primary and secondary DECnet + name translator nodes. Settings take effect immediately. + + +82 Chapter 4 + Customizing Communications + 4.10 Changing Your DECnet Name Translator Settings + +To enter or change DECnet name translator addresses, choose the +Communications submenu from the Terminal Manager window’s Customize +menu. Then choose DECnet Name Translator... to display the Customize +DECnet Name Translator dialog box: + + + + + LJ−01119−RAGS + +From the Customize DECnet Name Translator dialog box, you can change the +following settings: + Primary Name Translator’s DECnet Address +Use this box to enter the address of the host that serves as the primary name +translator for DECnet addresses. Click on OK to save the address and dismiss +the dialog box. You can enter your DECnet address in the long or short form +(Section 4.9). + Secondary Name Translator’s DECnet Address +Use this box to enter the address of a secondary host for DECnet name +translation, if you have one. Click on OK to save the address and dismiss +the dialog box. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 83 + 5 + 5 + Customizing Fonts and Startup Settings + + + This chapter describes how you can customize more advanced system settings + to autostart sessions and applications, change font paths, boot VXT software, + and load or unload VXT software features. To customize these settings, you + use the bottom half of the Customize menu in the Terminal Manager window. + Initially, the terminal uses factory-default settings that work with many + host systems. You can make changes to suit your personal preference and + computing environment. After you make changes, you can save your settings + for all future sessions. + The chapter covers the following major topics: + • Changing Your Font Path Settings + • Changing Your X Server Settings + • Specifying Your AutoStart Settings + • Changing Your Boot Settings for VXT Software + • Changing Your Software Options Settings + + + + +84 Chapter 5 + Customizing Fonts and Startup Settings + 5.1 Displaying the Customize Menu + +5.1 Displaying the Customize Menu + To display the Customize menu, click on Customize in the Terminal Manager + window’s menu bar. This chapter describes the menu items highlighted in + gray: + + VXT V2.1 Terminal Manager + + + + + LJ−03541−RAGS + + + + Note + A VXT manager can customize settings for terminals and work groups. + The VXT manager can also lock or unlock access to one or more of the + Customize menu items. Locked menu items are dimmed. + + + +5.2 Changing Your Configuration Manager Settings + The configuration manager lets you centrally manage and customize the + VXT 2000 windowing terminals on your local network from a single terminal. + You also have the alternative of creating your own terminal resource files + and storing them on a host system. Typically, these are system management + functions. The VXT Software Version 2.1 Installation and System Management + guide describes the configuration manager, host-based resource files, and how + to use them. + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 85 + Customizing Fonts and Startup Settings +5.2 Changing Your Configuration Manager Settings + + From the configuration manager, a system manager can access the Customize + dialog boxes for each terminal and lock or unlock customized settings. If you + customize settings at your terminal, they override terminal or work group + settings entered in the configuration manager. + For host-based terminals, the system manager can customize individual + terminals in the configuration manager. The customized settings are written + directly to your terminal. The settings take effect the next time you reboot + your terminal. + For server-based terminals, the system manager can customize individual + terminals or set up terminal work groups to share the same settings. Your + terminal stores its customized settings on an InfoServer system rather than in + the terminal. The system manager can also set up font sets on an InfoServer + system for work groups to share. + To display the Configuration submenu, choose Configuration... from the + Terminal Manager window’s Customize menu. + +5.3 Changing Your Font Path Settings + VXT software provides 23 local fonts for use with the terminal. If you have + a server-based terminal, the VXT software on an InfoServer system provides + 1166 fonts. You can also access fonts on host systems or font servers in your + network. To access fonts from network devices, you enter a font path in the + Customize Font Path dialog box. + A font is a set of character images in a particular typeface and style. The + font defines how characters look. The terminal displays characters as they are + defined in the selected font. A font path points to the network location of a + set of fonts residing on a host or server. + Font Formats and Communication Protocols + The terminal supports the industry-standard X11R5 server for accessing fonts. + You can access fonts from multiple sources, in any supported format, using + different communication methods. For each font source you want to use, you + enter a font path element in the Customize Font Path dialog box. The terminal + can use any fonts in the active font path, plus the 23 local fonts. + + + + +86 Chapter 5 + Customizing Fonts and Startup Settings + 5.3 Changing Your Font Path Settings + +The terminal can access fonts from the following systems: + +System Communication Method +X11R5 font server TCP/IP +InfoServer system LASTport +UNIX host NFS or TFTP +OpenVMS host LAT + +Fonts can be in any of the following formats: +• Portable compiled format (PCF) (compressed and uncompressed) +• Server natural format (SNF) (Version 1 and Version 4) +• Bitmap distribution format (BDF) +• Speedo outline format +• PostScript Type 1 format (ASCII or binary form) +VXT Software Version 2.1 Installation and System Management also provides +information on converting fonts for use on your terminal. +Activating the Font Path +The terminal tries to set a font path when you +• Turn on the terminal +• Reset or Reboot the terminal from the Session menu +• Click on OK, Apply, or System Defaults in the Customize Font Path dialog + box +You can make changes to the font path while you are using the terminal. +After you apply your changes in the Customize Font Path dialog box, any +applications you start use the fonts from the new font path. Applications that +were already running continue to use the same fonts; one exception is VXT +DECterm windows, which use the new fonts. See Section 8.3.1 for information +on using fonts in VXT DECterm windows. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 87 + Customizing Fonts and Startup Settings +5.3 Changing Your Font Path Settings + + Customize Font Path Dialog Box + To customize the font path, choose Font Path... from the Terminal Manager + window’s Customize menu. The Customize Font Path dialog box looks like this: + + + + + LJ−01175B−RAGS + + + +5.3.1 Entering a Font Path + The Active Font Path Elements scroll box lists the font paths the terminal uses + to find fonts. The font server searches for font paths in the order listed in the + scroll box. + To enter a font path into the Active Font Path Elements scroll box: + 1. In the Font Source box, choose the type of device supplying your fonts: + InfoServer, host, or font server. + + + + +88 Chapter 5 + Customizing Fonts and Startup Settings + 5.3 Changing Your Font Path Settings + +2. In the Transport box, choose the protocol used to communicate with the + font source. The choices available depend on the font source you chose. + The titles of the two text-entry boxes also depend on the type of font source + you chose. + + Font Source Transport Server/Host/Mountpoint Font Sets/Path/Catalogs + InfoServer LASTport Server Font Sets + Host NFS Mount Point Path + Host TFTP Host Path + Host LAT Host Path + Font Server TCP/IP Host Catalogs + +3. In the Server/Mount Point/Host box, enter the host name or address of + the font source (font server, InfoServer system, host, or NFS mount point) + where the fonts reside. +4. In the Font Sets/Path/Catalogs box, enter the path to the directory where + the fonts reside. +5. Click on the button to add the font path to the Active Font Path + Elements scroll box. +6. Click on Apply or OK. The terminal tries to set a new font path to each + element listed in the scroll box. +To remove a font path: +1. In the Font Paths scroll box, click on the font path element you want to + remove. +2. Click on the trash can button. +The following sections provide more detailed examples for each type of font +source and transport. +InfoServer Font Path +To enter a font path to fonts on an InfoServer system: +1. Click on the InfoServer button in the Font Source box. The LASTport + transport is automatically selected. +2. In the Server box, click on Any if you want to use any InfoServer on your + network. + Click on Other if you want to specify a particular InfoServer. Enter the + name of the InfoServer in the Server box. + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 89 + Customizing Fonts and Startup Settings +5.3 Changing Your Font Path Settings + + 3. In the Font Sets box, click on Default if you want to use the default font + set on the InfoServer. + Click on Other if you want to specify a particular font set. Enter the font + set name in the Font Sets box. + 4. Click on the button to add your font path to the scroll box. + Examples +//lastport Solicits any InfoServer and its default font set. +//lastport/InfoServer_1 Solicits for InfoServer_1 and its default font set. +//lastport//v2_1 Solicits for any InfoServer with font set V2_1. +//lastport/InfoServer_1/V2_1 Solicits for InfoServer_1 and font set V2_1. + + Host System Font Path (NFS) + To set an NFS font path, you must first enter the NFS mount point in the + Customize NFS dialog box (Section 4.8). + To enter a font path to a host system using NFS: + 1. In the Font Source box, click on the Host button. The NFS transport is + automatically selected. + 2. In the Host box, enter the local name of the NFS mount point. You define + the local name in the Customize NFS dialog box. + Example: fonts + 3. In the Path box, click on Default if you want to use the default path. + Click on Other if you want to specify a particular font path. Enter the path + in the Path box. + Example: /vxt/fonts/vxt-decwin/100dpi + 4. Click on the button to add your path to the scroll box. + Example: //nfs/fonts/vxt/fonts/vxt-decwin/100dpi + Host System Font Path (TFTP) + To enter a font path to a host system using TFTP: + 1. In the Font Source box, click on the Host button. + 2. In the Transport box, click on the TFTP button. + 3. In the Host box, enter the name or IP address of the host where the fonts + reside. + Example: market or 12.345.678.901 + 4. In the Path Box, enter the path to the fonts. + + +90 Chapter 5 + Customizing Fonts and Startup Settings + 5.3 Changing Your Font Path Settings + + Example: /usr/lib/fonts/100dpi + 5. Click on the button to add your font path to the scroll box. + Example + //tftp/12.123.123.122/usr/lib/fonts/100dpi + Host System Font Path (LAT) + To enter a font path to a host system using the LAT transport: + 1. In the Font Source box, click on the Host button. + 2. In the Transport box, click on the LAT button. + 3. In the Host box, enter the name of the host where the fonts reside. + Example: MARKET + 4. In the Path Box, click on Default if you want to use the default font + directory search list on the host. + Click on Other if you want to specify a particular font path. Enter the path + into the Path text entry box. + Example: fonts$disk:[user_fonts.100dpi] + 5. Click on the button to add your font path to the scroll box. + Examples +lat/market Specifies the default font directory search list + on host MARKET. +lat/market/fonts$disk:[user_fonts.100dpi] Specifies a particular font path on host + MARKET. + + Font Server Font Path (TCP/IP) + To enter a font path to a font server using TCP/IP: + 1. In the Font Source box, click on the Font Server button. The TCP/IP + transport is automatically selected. + 2. In the Host box, enter the name or IP address of the host where the fonts + reside. + Example: expo + 3. If you want to specify a particular port, click on the Port box and enter a + port address. The default port address is 7000. + 4. In the Catalogs box, click on Default if you want to use the default font + catalog on the font server. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 91 + Customizing Fonts and Startup Settings +5.3 Changing Your Font Path Settings + + Click on Other if you want to specify a catalog. Enter the catalog name in + the Catalogs box. + Example: available + 5. Click on the button to add your font path to the scroll box. + Examples + tcp/expo:7000/available + tcp/18.30.0.212:7890 + Font Path Errors + If a font source is unavailable: The VXT Message Box displays a message + indicating the terminal could not set a font path to that source. + Backup font services: If a font source fails while in use, the terminal can + automatically access the same font from a second source if available. The + second source must be listed somewhere after the first source in the Active + Font Path Elements scroll box. If the terminal does not find the font on + another font source, the terminal sends an error to the client that was using + the font. + If no fonts are found in a valid LAT font path: The VXT Message box + displays a message indicating that the set font path action succeeded and the + number of fonts which are available. + Tips on Setting Font Paths + • If host applications need fonts, use the fonts from the host supplying the + application. + • Include backup font sources in your font path. If the primary font source is + unavailable, the terminal can find the same fonts on the backup source. + • Use an InfoServer system to supply fonts, if available. If your network has + multiple InfoServers, the terminal provides automiatic font failover service + to backup InfoServers. You can also use the Font Management dialog + box to create and manage font sets on an InfoServer; you can copy fonts + from host systems. VXT Software Version 2.1 Installation and System + Management describes how to use the Font Management dialog box. + • To reduce the time for setting the font path, make sure your font path + includes only fonts required for your applications. + + + + +92 Chapter 5 + Customizing Fonts and Startup Settings + 5.4 Changing Your X Server Settings + +5.4 Changing Your X Server Settings + The Customize X Server dialog box lets you + • Choose whether or not to reset the X server or reboot the terminal’s + software when you end an X session. + • Scale display fonts to emulate a 75/dots inch display on a 100 dots/inch + monitor, or a 100 dots/inch display on a 75 dots/inch monitor + • Set an 8-plane terminal to use color or gray scale settings. + When you end an X session on an OpenVMS system, resetting the server will + end all open sessions on the terminal. If you do not reset the server, you can + end an X session without affecting other open sessions. + To change your X server settings, choose X Server... from the Terminal + Manager window’s Customize menu. The Customize X Server dialog box looks + like this: + + + + + LJ−01174B−RAGS + + Backing Store + The backing store function improves the time needed to restore a window from + an icon, by having the terminal perform the restore instead of the remote + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 93 + Customizing Fonts and Startup Settings +5.4 Changing Your X Server Settings + + application. The Graphics Option dialog box in VXT DECterm windows also + has a Backing Store button (Section 8.8). + The Disabled setting causes the terminal to ignore application requests for + backing store, and not to save the contents of an obscured window. The + terminal informs the client when its window is uncovered, and should be + redrawn. Use this setting to conserve the terminal’s memory. + The When Requested setting causes the terminal to save the contents of an + obscured window, or a portion of that window, when requested by the client. + If you select When Requested, the terminal can display an iconified or covered + window without waiting for the client to redraw it. + Display Scaling + The display scaling option lets you adjust the font size displayed on your + terminal to resemble a 75 dots/inch or 100 dots/inch display. Use the 75% + button if you have a 100 dots/inch monitor and want your display to look like + a 75 dots/inch monitor. Use the 133% button to make a 75 dots/inch monitor + display look like a 100 dots/inch monitor display. Your new setting takes effect + when you restart the terminal. + X Session Reset Server Action + Normally, the terminal restarts the X server when you quit from an X session. + If you end an X session on an OpenVMS system, restarting the X server causes + the terminal to end all open sessions. + If you click on the Ignore Reset Server button, you can end an OpenVMS X + session without ending other open sessions. + If you click on the Reboot Terminal button, the terminal reloads the VXT + software when you end an X session. + Your new setting takes effect when you click on Apply or OK. + Monitor + You can choose a gray scale or color setting for an 8-plane terminal. These + buttons are dimmed on monochrome terminals. Your new setting takes effect + when you restart the terminal. + +5.5 Changing Your Startup Settings + You can customize the terminal to automatically start up the applications you + frequently use. You can also customize the terminal to load a particular VXT + system image or turn off individual VXT software options. + + + + +94 Chapter 5 + Customizing Fonts and Startup Settings + 5.5 Changing Your Startup Settings + + To customize startup settings, you use the Startup submenu on the Terminal + Manager window’s Customize menu. The following sections describe the + functions you can perform from the Startup submenu: + • Specifying Your AutoStart Settings + The AutoStart dialog box lets you enter a list of host sessions and VXT + applications to automatically start each time you turn on, autostart, or + reboot the terminal. + • Changing Your Boot Settings for VXT Software + The Customize Boot dialog box lets you customize the VXT software + loading process to match your system environment. + • Changing Your Software Options Settings + The Customize Software Options dialog box lets you turn VXT software + options options on or off. Host-based terminals can use this feature to + improve memory use. + +5.6 Specifying Your AutoStart Settings + The AutoStart dialog box lets you enter a list of host sessions and VXT + applications to automatically start each time you + • Turn on the terminal + • Choose the AutoStart menu item from the Session menu + • Choose the Reset, Reboot, or Shutdown menu item from the Session menu + By default, the terminal autostarts the Terminal Manager window, VXT + Message Box, and local Motif window manager. + The format of the AutoStart dialog box is the same as the Create dialog box. + To display the AutoStart dialog box, choose AutoStart... from the Terminal + Manager window’s Customize menu. The Customize AutoStart dialog box looks + like this: + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 95 + Customizing Fonts and Startup Settings +5.6 Specifying Your AutoStart Settings + + + + + LJ−01167D−RAGS + + + AutoStart List + The terminal starts applications in the order you list them in the AutoStart + List. The default entries in the Customize AutoStart dialog box are + • Terminal Manager window and VXT Message Box + • Motif Window Manager + By default, the terminal starts the Terminal Manager window and VXT + Message Box as a single application. You can choose to start them as separate + applications. + To add a session or application to the AutoStart list: + + + + +96 Chapter 5 + Customizing Fonts and Startup Settings + 5.6 Specifying Your AutoStart Settings + +Use the following steps. The AutoStart dialog box controls operate the same as +the Create dialog box controls. See Section 2.2 for syntax rules and details on +buttons. +1. In the Application box, click on the type of session (X Session, DECterm, + 3270) or VXT application you want to autostart. For VXT applications, skip + steps 2 and 3. +2. In the Transport box, click on the communication method to use for the + session. If you choose Serial, skip step 3. +3. In the Host Name or Address box, enter the name or address of the host + system. If you make a typing mistake, you can use the Clear button to + clear the box. + For IP sessions: + • Use the Any Host button if you want to use the first available IP host. + • Use the Any Host Indirect button to specify a host that will act as a + pathway to find the first available IP host. + • Use the Comment box to enter optional text comments. For example, + if you entered a host name, you may want to enter the IP address as a + comment. + • Use the List Known Hosts... button to display a dialog box that lets + you list available IP hosts. +4. Click on to add your entry to the AutoStart List. + To delete entries, select the entry in the list and click on the trash can + button. + To move entries, select the entry in the list and click on the or  button. +5. Click on the OK button to save your settings. +The AutoStart dialog box saves your settings when you click on the OK button. +The Create dialog box contains a Save button for saving settings. +Reenter AutoStart Settings After Changing the Display Language +If you change your display language, you must reenter your AutoStart settings. +User Tip: Remove Unused Applications to Start the Terminal Faster +Normally, the terminal autostarts the local Motif window manager and the +combined Terminal Manager window + VXT Message Box applications. If you +no longer need to use an application, you should remove it from your AutoStart +list. The fewer applications listed in the AutoStart List, the faster the terminal +can start up and connect to your host sessions. + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 97 + Customizing Fonts and Startup Settings +5.6 Specifying Your AutoStart Settings + + If you use the remote window manager on a host system, you may want to + remove the local Motif window manager application from the AutoStart list. + You can enable the use of remote window managers in the Customize Terminal + manager dialog box (Section 3.10). + If you remove the combined Terminal Manager window + VXT Message Box + applications, you can restart them from the VXT Create pop-up menu. To + display the pop-up menu, click MB2 anywhere on the screen workspace. + + Caution + If you remove the combined Terminal Manager window + VXT Message + Box applications from the Preferred Services list in the Create dialog + box, they will not appear on the VXT Create pop-up menu the next + time you reset the terminal. + + + +5.7 Changing Your Boot Settings for VXT Software + The Customize Boot dialog box lets you specify a VXT software image and how + to load it. You can specify + • VXT software or VXT EX software + • Host-based or server-based mode of operation + You can also turn the following options on or off: + • X image extension, for working with XIE software to display graphics + • MOP trigger feature, for booting the terminal from a remote system + Your new Customize Boot settings take effect when you reboot the terminal. + When a loading process succeeds, the terminal saves the successful method in + local memory. The next time you reboot the terminal, it attempts to use the + same method. When you save your settings in the Customize Boot dialog box, + they override any previously saved settings. + Your booting options depend on what type of systems in your network have + VXT software and how your system manager has configured them to work with + VXT 2000 windowing terminals. For example, your system manager can enter + boot settings for your terminal in a file stored on a host system. + + + + +98 Chapter 5 + Customizing Fonts and Startup Settings + 5.7 Changing Your Boot Settings for VXT Software + + You can also enter boot commands at the terminal’s >>> prompt. See + Section 5.7.5. + + Caution + Before you change settings in the Customize Boot box, you should + understand how and when the terminal loads its software. + + + +5.7.1 Overview + How Does the Terminal Load VXT Software? + Your terminal operates in a computer network. The terminal loads its VXT + software from a host computer system or InfoServer system in the network. + To begin the loading process, the terminal sends out a sequence of requests on + the network for the first available host system or InfoServer system that has + VXT software or the VXT loader file. The VXT loader file is for server-based + operation only. + The terminal sends each request by using a communication transport. The + terminal can communicate with systems that use the maintenance operations + protocol (MOP) or the Internet protocol (IP) transport. + By default, the terminal loads its software from one of these systems: + • A host system that your system manager has preconfigured + VXT Software Version 2.1 Installation and System Management provides + instructions to configure systems. + • An InfoServer system + If your network has an InfoServer system with VXT software, you can use + your terminal without a system manager having to configure a host system. + When Does the Terminal Load VXT Software? + Booting is the process of loading a system’s software and bringing it to an + operable state. The terminal tries to boot after you + • Turn on the terminal and the terminal’s self-test succeeds + • Restart the terminal by choosing the Reboot or Shutdown menu item from + the Session menu + • Press one of these key sequences to reboot the terminal: + ANSI (LK401) keyboard Ctrl +left Alt +keypad . + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 99 + Customizing Fonts and Startup Settings +5.7 Changing Your Boot Settings for VXT Software + + PC (LK443/LK444) keyboard Ctrl + Alt +keypad . + Short ANSI (LK421) keyboard Ctrl Alt Function Extend . + +5.7.2 Using Host-Based Operation + The terminal can load a VXT or VXT EX software image directly from a host + system, using the MOP or IP protocol. You can also load a VXT or VXT EX + software image in host-based mode from an InfoServer system; however, the + terminal does not make use of the InfoServer’s memory services in host-based + mode. + When you load a VXT or VXT EX software image in host-based mode, the + terminal stores all of your customizations in its nonvolatile memory. For + host-based operation, the terminal needs at least 10 megabytes of memory + installed. + + Host System InfoServer + + VXT or VXT EX VXT or VXT EX + Software Image Software Image + + + + + VXT VXT VXT VXT + + Customizations Customizations Customizations Customizations + 10 MB 10 MB 10 MB 10 MB + + + LJ−03032−RAGS + + Setting Up a Host System + Your system manager can preconfigure a host system that uses MOP or IP + to load a host-based VXT software image into your terminal. VXT Software + Version 2.1 Installation and System Management describes how to preconfigure + systems. + If you use IP The system manager must preconfigure the host system. + VXT Software Version 2.1 Installation and System Management describes how + to add a line item to the /etc/bootptab file listing each terminal’s Ethernet + address, IP address, and the VXT software image file or VXT loader file (for + server-based operation). + If you use MOP The system manager can preconfigure the host system or + InfoServer system, or you can enter the name of a VXT software image file in + the Customize Boot dialog box. + + +100 Chapter 5 + Customizing Fonts and Startup Settings + 5.7 Changing Your Boot Settings for VXT Software + +Specifying a Host-Based Image in the Customize Boot Dialog Box +If your system manager has not preconfigured a host system or InfoServer +system to load your terminal, you can specify a host-based VXT or VXT EX +software image in the Customize Boot dialog box. Your system must support +the MOP transport. To specify a host-based image: +1. Display the Customize Boot dialog box (Section 5.7.4). +2. In the Primary Boot box, click on the MOP button. +3. In the MOP Boot File box, click on the Other button. Enter the name of + the VXT or VXT EX software image file. + + Enter... To load this image... + VXT Version 2.1 software provides two VXT software image files: + VXT VXT software image + VXTEX VXT EX software image + VXT Version 2.0 software included version numbers in the software image files: + VXT020 VXT software image + VXTEX020 VXT EX software image + Earlier versions of VXT software used separate software images to support + monochrome and color/gray scale terminals: + VXTMP00nn0 VXT host-based, monochrome image + VXTSP00nn0 VXT host-based, color or gray scale image + VXTMPI0nn0 VXT host-based, monochrome image with XIE support + VXTSPI0nn0 VXT host-based, color or gray scale image with XIE support + + nn is the version number. For example, 12 is Version 1.2. + + +4. Click on the OK button to save your setting and dismiss the dialog box. +5. In the Terminal Manager window, click on the Session menu. +6. In the Session menu, click on the Reboot menu item to reboot the terminal. + The terminal loads the specified VXT or VXT EX software image from the + first available host system or InfoServer system that has the software. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 101 + Customizing Fonts and Startup Settings +5.7 Changing Your Boot Settings for VXT Software + +5.7.3 Using Server-Based Operation + When you load a VXT software image file from an InfoServer system, you can + choose to operate in server-based mode or host-based mode (Section 5.7.2). + In server-based mode, the terminal stores its customizations on an InfoServer + system. The InfoServer system also performs certain memory functions for the + terminal, so the terminal needs only 4 megabytes of installed memory. + In server-based mode, the terminal takes two steps to load a VXT or VXT EX + software image: + 1. The terminal loads a VXT loader file from an InfoServer system or host + system, using the MOP or IP protocol. + 2. The VXT loader file loads the VXT software image file from an InfoServer + system, using the LASTport Version 3.1 protocol. + + InfoServer InfoServer + + VXT Loader VXT Loader + VXT or VXT EX VXT or VXT EX + Software Image Software Image + Customizations Customizations + + + + + VXT VXT VXT VXT + + 4 MB 4 MB 4 MB 4 MB + + + + LJ−03325−RAGS + + Plug and Play Operation + If you have an InfoServer with VXT software, the terminal can normally load + the software without any need to configure a host system or use the Customize + Boot dialog box. By default, the terminal looks for a VXT loader file named + VXTLDR, which is supplied with VXT software kits for InfoServer systems. + By default, the VXT loader first solicits the network for the full-function VXT + software image; if the VXT software image is not available, the VXT loader + solicits for the VXT EX image. + + Network Bridges May Affect the VXT Loader + If your InfoServer system is on the other side of a network bridge that + filters MOP messages, your system manager must install the VXT + + +102 Chapter 5 + Customizing Fonts and Startup Settings + 5.7 Changing Your Boot Settings for VXT Software + + loader file on a host system. Your system manager can preconfigure the + host to load the file into the terminal. After the terminal loads the VXT + loader file, the VXT loader file loads the VXT software image from the + InfoServer system. + + +Specifying a Server-Based Image in the Customize Boot Dialog Box +If you want to load a particular VXT or VXT EX software version in server- +based mode, you can use the Customize Boot dialog box. +1. Display the Customize Boot dialog box (Section 5.7.4). +2. In the Primary Boot box, click on the MOP button. +3. In the MOP Boot File box, click on the Other button. + Enter the name of the VXT loader file. The default name is VXTLDR. + If needed, you can specify the loader supplied with a particular VXT + software version. Normally you do not need to specify a version, unless + you are loading a new version of VXT software that has not been made the + default on your network yet. For example, if VXT Version 1.3 is the default + version and you want to load VXT Version 2.1, you would specify the loader + for VXT Version 2.1. + + Enter... To use this loader... + VXTLDR Default version on your network + VXTLDR_NODENAME Default version on nodename + VXTLDR021 VXT Version 2.1 loader + VXTLDR020 VXT Version 2.0 loader + VXTLDR0130 VXT Version 1.3 loader + VXTLDR1 VXT Version 1.3 loader (for VXT 2000+ terminals) + VXTLDR0120 VXT Version 1.2 loader + + + VXT Loader Requirements + To load the VXT Version 2.1 software image, you must use the VXT + Version 2.1 loader file. + To load the VXT EX software image, you must use the VXT Version 2.0 + or 2.1 loader file. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 103 + Customizing Fonts and Startup Settings +5.7 Changing Your Boot Settings for VXT Software + + 4. In the Secondary Boot box, choose the type of VXT software you want to + use. Click on the VXT Software button or the VXT EX button. + 5. In the Version box, click on the Default button if you want to load the + default version of VXT or VXT EX software on your network. + Click on the Other button if you want to specify a VXT or VXT EX version + other than the default. The terminal displays the letters VXT or VXT EX + in front of the box. Enter the value for the version number (three digits for + Version 2.0 and Version 2.1, four digits for earlier versions). + + Enter... To load this version... + VXT VXT EX + 021 2.1 2.0 + 020 2.0 2.0 + 0130 1.3 – + 0120 1.2 – + 0110 1.1 – + 0100 1.0 – + + 6. Click on the OK button to save your setting and dismiss the dialog box. + 7. In the Terminal Manager window, click on the Session menu. + 8. In the Session menu, click on the Reboot menu item to reboot the terminal. + The terminal loads the VXT loader file from the first available system. + + Server-Based Customizations and Loading + If you have several InfoServer systems with VXT software, your + terminal always loads the VXT software from the first available + InfoServer system that has the same LASTport group code. However, + your terminal’s customized settings are always stored on a specific + InfoServer system; therefore, your terminal does not necessarily use + the same system to load software and store customizations. + + + + +104 Chapter 5 + Customizing Fonts and Startup Settings + 5.7 Changing Your Boot Settings for VXT Software + +5.7.4 Customize Boot Dialog Box Description + To view or change your boot settings, choose Boot... from the Terminal + Manager window’s Customize menu. The Customize Boot dialog box looks like + this: + + + + + LJ−00176D−RAGS + + From the Customize Boot dialog box, you can change the following settings: + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 105 + Customizing Fonts and Startup Settings +5.7 Changing Your Boot Settings for VXT Software + + Primary Boot + Normally, the terminal alternates between using MOP and IP on attempts to + boot the VXT software image file (host-based mode) or VXT loader file (server- + based mode). To use IP only, click on the IP button. To use MOP only, click on + the MOP button. + MOP Boot File + If you use MOP, the MOP Boot File box lets you specify a host-based VXT + software image file (from a host or InfoServer system) or a VXT loader file. + The VXT loader file is for loading a server-based VXT software image. + Default By default, the terminal looks for the VXT loader file on an InfoServer + system or host. The terminal repeats this sequence using different versions of + the MOP protocol. + Host Preconfigured The terminal first looks for any host system using MOP + that has been preconfigured to load the terminal with VXT software. If it does + not find a host, the terminal looks for the VXT loader file on an InfoServer + system or host. The terminal repeats this sequence using different versions of + the MOP protocol. + VXT Software Version 2.1 Installation and System Management describes how + your system manager can add your terminal’s Ethernet address and the desired + host-based VXT software image file or VXT loader file to a system database. + If you use MOP: OpenVMS system managers use the Network Control Program + (NCP), and ULTRIX system managers use the addnode utility. + Other This setting lets you specify a host-based VXT software image file or + VXT loader file. The image or loader file can be on a host or InfoServer system. + Omit the .SYS file extension. + The file should be in a default MOP directory. For example: + • OpenVMS systems—Use VXT$LIBRARY or MOM$SYSTEM. To use + VXT$LIBRARY, the system manager must add it to the MOM$LOAD + search list. See the OpenVMS section in VXT Software Version 2.1 + Installation and System Management. + • ULTRIX systems—Use /usr/lib/mop on the local subnet. + VXTLDR is the default name of the VXT loader file. If you enter the file name + VXTLDR, any MOP service with the load file can respond and supply the file to + the terminal. The VXT loader uses the LASTport Version 3.1 protocol to load + the system image specified in the Secondary Boot and Version fields. + + + + +106 Chapter 5 + Customizing Fonts and Startup Settings + 5.7 Changing Your Boot Settings for VXT Software + +Typically, the terminal uses the VXT loader file from the InfoServer system +that supplies the VXT software image. However, if there is a bridge that +filters MOP requests between the terminal and InfoServer system, the system +manager should make sure the VXT loader file is available on a host system in +the same network segment as the terminal. + Secondary Boot +When you load a server-based VXT software image from an InfoServer system, +you use the Secondary Boot box to choose VXT software or VXT EX software. +Version You can use the default version of your Secondary Boot choice (VXT +Software or VXT EX) or specify a version in the Other box. If you specify a +version, make sure a VXT software image file with that name is available on +an InfoServer system. + Options: X Image Extension +VXT software images include an X image extension (XIE) capability that allows +server-based and host-based terminals to work with XIE software. The VXT +EX software image does not include XIE capability. +Normally, the terminal’s XIE capability is turned on. If you turn this feature +off and on, you must reboot the terminal before your new setting takes effect. +Appendix C describes how to use the terminal with XIE. +VXT 2000 terminals with a system box and 17-inch VX227 models without a +system box can use an optional image accelerator board to increase the speed +at which the terminal displays XIE bitonal images. However, you do not need +the image accelerator board to use the terminal’s XIE capability. + Reboot Options +The MOP protocol provides a trigger mechanism for rebooting a remote node. +If you enable the MOP trigger feature, your terminal can be rebooted from a +remote node. +Allow MOP Trigger Normally, the terminal ignores MOP trigger messages. To +enable MOP triggering, click on the Allow MOP Trigger button. +Trigger Password You can also supply a password to restrict rebooting from +a remote node. The MOP trigger password can be from 1 to 16 hexadecimal +characters (0–9 and A–F characters). If you do not supply a password, a +default value of 0 is used (equivalent to no password). +See your host system’s network control program (NCP) manual or online help +for more information on the syntax for triggering remote nodes. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 107 + Customizing Fonts and Startup Settings +5.7 Changing Your Boot Settings for VXT Software + +5.7.5 Entering Boot Commands to Load VXT Software + In addition to the Customize Boot dialog box, you can load VXT software from + the terminal’s >>> prompt. + Displaying the >>> Prompt + To display the >>> prompt, you must halt your terminal. There are two ways + to halt the terminal; you can use the keyboard, or you can use the halt button. + + Caution + Halting the terminal closes any currently open sessions. + + + To display the >>> prompt from the keyboard: + Press Ctrl +left Alt +keypad . . The terminal ends all sessions and begins to + boot VXT software. Immediately press Ctrl C to halt the booting sequence and + display the >>> prompt. + To display the >>> prompt using the halt button: + Quickly press and release the halt button on the rear of the terminal. The + terminal halts all activity and displays a >>> prompt. + • For terminals with a system box: The halt button is next to the indicator + lights on the rear of the system box. + • For terminals without a system box: The halt button is below the keyboard + connector on the rear of the monitor. + Loading VXT Version 2.0 or 2.1 Software + To load VXT Version 2.0 or 2.1 software, enter the command sequence for + host-based or server-based operation. + + To load... In this mode... Enter... + VXT Version Host + 2.1 + >>> B/100 Return + Bootfile: VXT Return + Server + >>> B/101 Return + Bootfile: VXTLDR Return + VXTLDR> VXT.SYS or VXT021.SYS Return + + + + +108 Chapter 5 + Customizing Fonts and Startup Settings + 5.7 Changing Your Boot Settings for VXT Software + +To load... In this mode... Enter... +VXT EX Host + >>> B/100 Return + Bootfile: VXTEX or VXTEX020 Return + + Server + >>> B/101 Return + Bootfile: VXTLDR Return + VXTLDR> VXTEX020.SYS Return +VXT Version Host +2.0 + >>> B/100 Return + Bootfile: VXT020 Return + + Server + >>> B/101 Return + Bootfile: VXTLDR Return + VXTLDR> VXT020.SYS Return + If you have VXT Version 2.1 software, you can omit the version number when specifying VXT EX +software. + + +Loading Earlier VXT Software Versions +Earlier versions of VXT software used separate software images to support +monochrome and color/gray scale terminals. Enter the command sequence for +host-based or server-based operation. +Host-Based Mode +>>> B/100 Return +Bootfile: host_image Return + + + + +Enter host_image... To load this image... +VXTMP00nn0 VXT host-based, monochrome image +VXTSP00nn0 VXT host-based, color or gray scale image +VXTMPI0nn0 VXT host-based, monochrome image with XIE support +VXTSPI0nn0 VXT host-based, color or gray scale image with XIE support + +nn is the version number. For example, 12 is Version 1.2. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 109 + Customizing Fonts and Startup Settings +5.7 Changing Your Boot Settings for VXT Software + + Server-Based Mode + >>> B/101 Return + Bootfile: VXTLDR Return + VXTLDR> server_image Return + + + Enter server_image... To load this image... + VXTMV00nn0.SYS VXT server-based, monochrome image + VXTSV00nn0.SYS VXT server-based, color or gray scale image + + nn is the version number. For example, 12 is Version 1.2. + + + +5.8 Changing Your Software Options Settings + The Customize Software Options dialog box lets you turn certain VXT software + features on or off at startup. By default all options are turned on. + If you have a host-based terminal, you can conserve memory by selecting only + those options you need to use. You can monitor your terminal’s memory use + by checking the Memory Remaining scale in the System Monitor dialog box + (Section 6.5). + The following table lists the approximate memory saved for each option + unloaded. + + If You Unload This Option... You Save This Much Memory (Kilobytes)... + DECterm 235 KB + Motif WM 617 KB + Terminal Manager 1422 KB + Print Screen 19 KB + Message Box 116 KB + Net Print 8 KB + 3270 233 KB + X Image Extension 194 KB + Font Manager 37 KB + InfoReader 33 KB + + Total 2914 KB + + + + +110 Chapter 5 + Customizing Fonts and Startup Settings + 5.8 Changing Your Software Options Settings + +If you try to use a disabled option, the VXT Message Box displays the following +message: +Software option is disabled. +To view or change your software option settings, choose the Startup submenu +from the Terminal Manager window’s Customize menu. Then choose Software +Options... to display the Customize Software Options dialog box: + + + + + LJ−03539−RAGS + +From the Customize Software Options dialog box, you can turn the following +options on or off as startup: + DECterm Terminal Windows +This setting affects your ability to create VXT DECterm windows. + Motif Window Manager +This setting affects your ability to use the terminal’s Motif window manager. +If you disable this option, you cannot restart the window manager using the +Create dialog box or any other method. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 111 + Customizing Fonts and Startup Settings +5.8 Changing Your Software Options Settings + + Terminal Manager + This setting affects your ability to use the Terminal Manager window. This + setting also affects the VXT Message Box, unless you autostart the message + box as a separate application from the the Terminal Manager window. + + Caution + The Software Options dialog box is part of the Terminal Manager + window. If you turn off the Terminal Manager window and reboot the + terminal, you cannot access the Software Option dialog box to enable + the Terminal Manager window again. See your system manager to + reenable the Terminal Manager window. + + + Print Screen + This setting affects your ability to use the Print Screen menu item in the VXT’s + Terminal Manager window. + Message Box + This setting affects your ability to use the VXT Message Box. + Network Printing + This setting affects your ability to print from a host system to a local printer + attached to the terminal. If this setting is disabled, you cannot use the Host + Accessible Printer Port setting in the Customize Serial and Parallel Ports + dialog box. + VXT 3270 Terminal Windows + This setting affects your ability to create VXT 3270 terminal windows. VXT + 3270 terminal windows also require a separate software license and access to a + DECnet/SNA gateway. + X Image Extension + This setting affects the terminal’s ability to work with X image extension (XIE) + software (Appendix C). VXT EX software does not include XIE capability. + Font Manager + This setting affects your ability to use the Font Management dialog box for + server-based terminals, described in VXT Software Version 2.1 Installation and + System Management. + InfoReader + This setting affects your ability to display the InfoReader library of VXT + documentation from the Getting Started menu. + + + +112 Chapter 5 + Customizing Fonts and Startup Settings + 5.9 Using Customized Resource Files + +5.9 Using Customized Resource Files + VXT software provides two methods for remotely managing terminal settings— + the configuration manager or your own host-based resource files. If you use + your own host-based resource files, you can create individual terminal resource + files and group resource files. You enter the network location of a terminal’s + individual and group resource file in the Customize Resource Files dialog box. + To display the Customize Resource Files dialog box, choose Resource Files... + from the Terminal Manager window’s Customize menu. VXT Software + Version 2.1 Installation and System Management describes the configuration + manager, resource files, and how to use the Customize Resource Files dialog + box. + You can use the TFTP or NFS transport to access your resource files on + the host. If you use NFS, you must first enter the NFS mount point in the + Customize NFS dialog box. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 113 + 66 + Checking the Terminal’s Status + + + This chapter describes how to monitor the operating status of your terminal + and of network communication. To monitor the terminal’s status, you use the + Status submenu accessed from the Session menu in the Terminal Manager + window. This chapter covers the following topics: + • Displaying the Status Submenu + • Checking a TCP/IP Host System + • TCP/IP Routes Dialog Box + • Displaying LAT and Ethernet Counters + • Monitoring the Terminal’s Memory and Network Use + • Checking the Terminal’s System Configuration + + + + +114 Chapter 6 + Checking the Terminal’s Status + 6.1 Displaying the Status Submenu + +6.1 Displaying the Status Submenu + To display the Status submenu, choose the Status menu item from the Session + menu in the Terminal Manager window. + + VXT V2.1 Terminal Manager + + + + + LJ−01154D−RAGS + + + When you choose a menu item from the Status submenu, the terminal displays + a dialog box for that topic. + +6.2 Checking a TCP/IP Host System + You can check if a TCP/IP host is available by using the TCP/IP Network Test + (ping) dialog box. You specify a host name or IP address and a timeout period + for the test. The terminal sends a ping (Packet InterNet Groper) packet once + every second for the time you enter in the Timeout box. If you are testing the + availability of a remote host on another network, you may want to increase the + timeout value. + To display the TCP/IP Network Test (ping) dialog box, choose TCP/IP Network + Test (ping)... from the Status submenu. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 115 + Checking the Terminal’s Status +6.2 Checking a TCP/IP Host System + + + + + LJ−01112−RAGS + + To run the test: + 1. Click on the Host Name or IP Address box and enter a host name or + address. Use the < x key if you make a mistake. + Examples + market + 12.212.231.22 + 2. Click on the Test button. The terminal displays the status of the host on + the Status line: + • Host name or IP Address is alive + • No answer from Host name or IP Address + • Trying... + To change the timeout period for performing the test: + Click on the Timeout (seconds) box and enter a new timeout value from 1 to 99 + seconds. Use the < x key if you make a mistake. + To dismiss the dialog box: + Click on the Close button. + + + + +116 Chapter 6 + Checking the Terminal’s Status + 6.3 TCP/IP Routes Dialog Box + +6.3 TCP/IP Routes Dialog Box + You can display a list of TCP/IP routes from your network to hosts on other + networks. To display the TCP/IP Routes dialog box, choose TCP/IP Routes... + from the Status menu. + + + + + LJ−01113−RAGS + + + The dialog box lists routes from four sources: + • Static routes you enter in the Customize TCP/IP Routing Tables dialog box + • Interface routes added by interface initialization (NID startup) + • Internet control message protocol (ICMP) redirects + • Dynamic routes added by RIP packets (Normally dynamic routing is + enabled. See Section 4.7 to enable or disable.) + To enter your own routes into the TCP/IP Routes dialog box: + See Section 4.7. + To update the list: + Click on the Update Routes button. The terminal displays the current list of + static and dynamic routes. + To dismiss the dialog box: + Click on the Close button. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 117 + Checking the Terminal’s Status +6.4 Displaying LAT and Ethernet Counters + +6.4 Displaying LAT and Ethernet Counters + You can check the status of the terminal’s LAT and Ethernet counters. + Normally, the terminal updates the information in these dialog boxes every 5 + seconds. You can set the update frequency time from 1 to 60 seconds, using the + Customize Terminal Manager dialog box (Section 3.10). + LAT Counters Dialog Box + To display the LAT Counters dialog box, choose LAT Counters... from the + Status submenu. Table 6–1 describes each counter. + + + + + LJ−01155A−RAGS + + To set all counters to 0: + Click on the Zero Counters button. All counters in the list are set to 0. + To dismiss the dialog box: + Click on the Close button. + + Table 6–1 LAT Counters Display Fields + Field Description + Seconds Since Zeroed The number of seconds since these counters were set to 0. + (continued on next page) + + + + +118 Chapter 6 + Checking the Terminal’s Status + 6.4 Displaying LAT and Ethernet Counters + + +Table 6–1 (Cont.) LAT Counters Display Fields +Field Description + +Messages Received The number of LAT protocol messages successfully received + by the terminal. +Messages Transmitted The number of LAT protocol messages successfully + transmitted by the terminal. +Slots Received The number of LAT slots received by the terminal. A slot + represents a message segment for a particular LAT session. +Slots Transmitted The number of LAT slots transmitted by the terminal. A + slot represents a message segment for a particular LAT + session. +Bytes Received The number of data bytes received by the terminal over the + LAT protocol. +Bytes Transmitted The number of data bytes sent by the terminal over the LAT + protocol. +Duplicates Received The number of virtual circuit messages the terminal + received that were not in the correct sequence. +Messages Retransmitted The number of virtual circuit messages that the terminal + resent to remote nodes. +Illegal Messages The number of incorrectly formatted LAT messages the + terminal has received. +Illegal Slots The number of incorrectly formatted slots of data in a LAT + message that the terminal has received. +Virtual Circuit Timeouts The number of times that the terminal terminated a LAT + connection because the remote node did not respond within + the time allowed by the LAT protocol. +Protocol Errors The number of times that the terminal determined that the + LAT protocol has been violated by a remote node. See the + Protocol Error Mask field for more information. +Protocol Error Mask A bit mask providing information about the LAT protocol + errors detected by the terminal. The bits in the mask are + numbered from right to left, starting with bit 0 on the right. + The following bits are defined in the mask: + 0 An unknown LAT message type was received. + 1 An invalid LAT START message was received. + 2 A zero-valued virtual circuit reference was + received. + (continued on next page) + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 119 + Checking the Terminal’s Status +6.4 Displaying LAT and Ethernet Counters + + + Table 6–1 (Cont.) LAT Counters Display Fields + Field Description + + 3 An out-of-range virtual circuit reference was + received. + 4 A reference to a nonexistent virtual circuit was + received. + 5 A reference to a virtual circuit no longer in use + was received. + 6 An invalid LAT STOP message was received. + 7 An invalid reference to a remote slot was received. + 8 A reference to a nonexistent slot was received. + 9 A credit violation was detected. + 10 A repeated creation of a slot was detected. + 11 An invalid sequence number was received. + 12 A repeated disconnect of a slot was detected. + + + Ethernet Counters Dialog Box + To display the Ethernet Counters dialog box, choose Ethernet Counters... from + the Status submenu. Table 6–2 describes each counter. + + + + + LJ−01156A−RAGS + + + + +120 Chapter 6 + Checking the Terminal’s Status + 6.4 Displaying LAT and Ethernet Counters + +To set all counters to 0: +Click on the Zero Counters button. All counters in the list are set to 0. +To dismiss the dialog box: +Click on the Close button. + +Table 6–2 Ethernet Counters Display Fields +Field Description +Seconds Since Zeroed The number of seconds since these counters were set to + 0. +Bytes Received The number of bytes contained in datagrams successfully + received by the terminal, excluding Ethernet header and + CRC data. +Bytes Sent The number of bytes contained in datagrams successfully + sent by the terminal, excluding Ethernet header and + CRC data. +Frames Received The number of datagrams successfully received by the + terminal, including multicast frames. +Frames Sent The number of datagrams successfully sent by the + terminal, including multicast frames. +Multicast Bytes Received The number of bytes received by the terminal in + multicast frames, excluding Ethernet header and CRC + data. +Multicast Bytes Sent The number of bytes sent by the terminal in multicast + frames, excluding Ethernet header and CRC data. +Multicast Frames Received The number of multicast frames received by the + terminal. +Multicast Frames Sent The number of multicast frames sent by the terminal. +Frames Sent, Deferred The number of times that the terminal deferred a frame + transmission because the datalink was in use. +Frames Sent, 1 Collision The number of times the terminal sent a frame on the + second attempt after a collision occurred on the first + attempt. +Frames Sent, 2+ Collisions The number of times the terminal successfully sent + a frame after collisions during the first two or more + attempts. + (continued on next page) + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 121 + Checking the Terminal’s Status +6.4 Displaying LAT and Ethernet Counters + + + Table 6–2 (Cont.) Ethernet Counters Display Fields + Field Description + + Send Failures The number of times the Ethernet interface aborted a + transmission request. If this count is not 0, see the Send + Failure Reasons field for more information. + Send Failure Reasons A bit mask providing information about the reason for + a send failure if the Send Failures counter is not 0. + The bits in the mask are numbered from right to left, + starting with bit 0 on the right. The following bits are + defined in the mask: + 0 A transmission failed to complete after 16 retries, + usually due to excessive collisions. + 1 A loss of carrier occurred on the Ethernet during a + transmission. + 2 A short circuit occurred on the Ethernet during a + transmission. + 3 An open circuit occurred on the Ethernet during a + transmission. + 4 Heartbeat error. + 5 Data underflow. + Receive Failures The number of frames received with an error condition. + For more information, see the Receive Failure Reasons + field. + Receive Failure Reasons A bit mask providing information about the type of + receive failures encountered if the Receive Failures + counter is not 0. The bits in the mask are numbered + from right to left, starting with bit 0 on the right. The + following bits are defined in the mask: + 0 A block check error. The received frame did not + pass the cyclical redundancy check (CRC). + 1 A framing error. The received packet did not + contain an integral number of 8-bit bytes. + Unrecognized Destination The number of frames received by the terminal that + did not contain a multicast address or protocol type + recognized by the terminal. These frames are discarded. + Data Overrun The number of times that the terminal’s hardware lost + an incoming frame because it was unable to keep up + with the data rate. + (continued on next page) + + + + +122 Chapter 6 + Checking the Terminal’s Status + 6.4 Displaying LAT and Ethernet Counters + + + Table 6–2 (Cont.) Ethernet Counters Display Fields + Field Description + + User Buffer Unavailable Currently unused. Should always be 0. + System Buffer Unavailable The number of times that the terminal’s software did + not have a buffer available to receive an incoming frame + (MISS error). + + + +6.5 Monitoring the Terminal’s Memory and Network Use + You can use the System Monitor dialog box to monitor the amount of local + memory available for use by the terminal. You can also monitor the percent of + the terminal’s network capacity currently being used. Normally, the terminal + updates this information every 5 seconds. You can set the update frequency + time from 1 to 60 seconds, using the Customize Terminal Manager dialog + box (Section 3.10). To display the System Monitor dialog box, choose System + Monitor from the Status submenu. + + + + + LJ−0111A−RAGS + + Memory Remaining: Indicates how much of the local memory installed in + the terminal is currently available for use. + Network Utilization: Indicates what percent of the network capacity of the + terminal is currently being used. + Uptime: Indicates how long the terminal has been running since being booted. + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 123 + Checking the Terminal’s Status +6.5 Monitoring the Terminal’s Memory and Network Use + + Pagefile Reads: Indicates the number of blocks of memory read by the + terminal since being booted. + Pagefile Writes: Indicates the number of blocks of memory written by the + terminal since being booted. + To dismiss the dialog box: + Click on the Close button. + +6.6 Checking the Terminal’s System Configuration + You can use the System Configuration dialog box to check the terminal’s + software version, network addresses, work group, active font path, installed + options, and amount of installed memory. + To display the System Configuration dialog box, choose System Configuration... + from the Status submenu. + + System Configuration + + VXT Software: Monochrome Host Based VXT V2.1 + System Image: VXT.SYS on server ROM + Pagefile: N/A + Active Font Path: Local Fonts + Software Options: Terminal Manager, Message Box, Motif WM, DECterm, Print Screen, + X Image Extension, Net Print + + Ethernet Hardware Address: 08−00−2B−25−3C−36 + Ethernet Active Address: 08−00−2B−25−3C−36 + IP Address: 16.122.123.122 + DECnet Address: 55.123 + Total Memory: 10 Megabytes + Hardware Options: None + Diagnostic Revision: V1.4 + + Terminal 08002B253C36 on server Local Terminals + Work Group Local on server Local Terminals + + + Resource files currently in use + + + + Update Close + + + LJ−0110C−RAGS + + + Table 6–3 describes the System Configuration fields: + + + + +124 Chapter 6 + Checking the Terminal’s Status + 6.6 Checking the Terminal’s System Configuration + + +Table 6–3 System Configuration Display Fields +Field Description +VXT Software: Lists the VXT software version and type: + {Monochrome, Color} {Host-Based, Server-Based} VXT Vn.n + A plus symbol (+) after the word Monochrome or Color indicates + the terminal has a VXT 2000+ video board installed. +System Image: Lists the system image name of the VXT software in use and + the name of the server supplying the software. The default + system image name for VXT Version 2.0 software is VXT or + VXT021. + For host-based software: the displayed server name is + always ROM, because VXT host-based software is loaded into + the terminal’s ROM memory and does not use an InfoServer for + memory services. + For server-based software: the server name is the name of + the InfoServer system from where the software was loaded. + If you have several InfoServer systems with VXT software on + your network, the terminal may use different servers to load + software, provide fonts, and store terminal and work group + customizations. +Pagefile: For server-based software: this field lists the name of the + InfoServer pagefile the terminal is using for memory paging + services. The pagefile resides on the InfoServer that loaded the + terminal’s VXT software. + If a pagefile has not been opened yet, this field displays No + Pagefile. + For host-based software: this field lists N/A for not + applicable. + (continued on next page) + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 125 + Checking the Terminal’s Status +6.6 Checking the Terminal’s System Configuration + + + Table 6–3 (Cont.) System Configuration Display Fields + Field Description + + Active Font Path: Lists the location of the fonts currently in use. Font path + elements are separated by commas. To change the font path, + use the Customize Font Path dialog box (Section 5.3). Font + path elements are listed in the order entered in the Customize + Font Path dialog box. + For host-based software: by default, the terminal uses the + Local Fonts set loaded with VXT software into the terminal’s + local memory. + Local Fonts + For server-based software: by default, the terminal uses the + Local Fonts set and the VXT fonts on an InfoServer. The font + path indicates the name of the InfoServer system supplying + fonts: + //lastport/server_name/VXT, Local Fonts + Software Options: Lists the VXT software options available for use. By default, + all options are available. You can turn options on and off in + the Customize Software Options dialog box (Section 5.8). Host- + based terminals can conserve memory by turning off unused + options. + Terminal Manager, Message Box, Motif WM, DECterm, Print Screen, + X Image Extension, Net Print, 3270, Font manager, InfoReader + Ethernet Hardware Lists the terminal’s Ethernet physical address, set at the + Address: factory. + Ethernet Active If you use DECnet: this field lists the terminal’s global + Address: network address, in the network service access point (NSAP) + format. DECnet derives this address from the Ethernet + hardware address. + If you use TCP/IP or LAT: this field lists the same address as + the Ethernet Address field. + IP Address Lists the terminal’s Internet protocol address, for communicat- + ing with systems that use the TCP/IP protocol. If you have not + entered an IP address in the Customize TCP/IP dialog box, this + field is empty. + (continued on next page) + + + + +126 Chapter 6 + Checking the Terminal’s Status + 6.6 Checking the Terminal’s System Configuration + + +Table 6–3 (Cont.) System Configuration Display Fields +Field Description + +DECnet Address Lists the terminal’s DECnet address, for communicating with + systems on a wide area network that use the DECnet protocol. + If you have not enabled the DECnet protocol and entered an + DECnet address in Customize DECnet dialog box, this field is + empty. +Total Memory: Lists the amount of memory installed in the terminal, from 4 + megabytes to 18 megabytes. +Hardware Options: Lists any option boards installed in the terminal: + Image VXT image accelerator board +Diagnostic Revision: Lists the terminal’s ROM revision level. +Resource files Lists the name and location of the terminal and work group +currently in use: resource files that store the terminal’s customizations. + For host-based software: the terminal and work group + resource files are always listed on the Local Terminals server. + For server-based software: the terminal and work group + resource files reside on the same InfoServer system. This + system may be a different InfoServer system than the one that + loads the terminal’s VXT software. + The system manager may have new terminals join the + Unregistered Terminals work group. + + +To display updated information: +Click on the Update button. The terminal displays updates any information +that has changed since you opened the dialog box. +To dismiss the dialog box: +Click on the Close button. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 127 + 77 + Using VXT DECterm Windows + + + This chapter describes how to use VXT DECterm windows, also known as + terminal windows. The chapter covers the following major topics: + • The VXT DECterm Window + • Copying and Pasting Text + • Clearing or Resetting the Window + • Printing the DECterm Window + • Exiting from a VXT DECterm Window + +7.1 The VXT DECterm Window + The VXT DECterm window is a VT300 series terminal emulator. You can open + several VXT DECterm windows on the screen and run different applications in + each window. You can use your mouse to move between windows. + Chapter 2 describes how to create a terminal window session on your host, + using the Create menu and dialog box. When you create the session, the + terminal displays a VXT DECterm window. + 1 + + + Host Telnet VXT DECterm 1 + + File Edit Commands Options Print 2 + + + + 3 + + + + + LJ−01636C−RAGS + LJ−0163C−RAGS + + + +128 Chapter 7 + Using VXT DECterm Windows + 7.1 The VXT DECterm Window + + Chapter 11 describes the basic features of windows. For VXT DECterm + windows: + The window title uses the following format: + Transport VXT DECterm on Host n + Transport is the method used to connect to the host system —Telnet, LAT, + DECnet, or Serial. The Host system is identified by a host name, service + name, or IP address. VXT DECterm windows are numbered sequentially + (n) in the order you open them during a session. The name VXT DECterm + lets you distinguish the terminal’s DECterm windows from any remote + DECterm windows you create using a host system’s session manager. You + can change the title by choosing the Window... menu item from the Options + menu. + The menu bar displays the names of the five pull-down menus available + + + + + + from the window: + File Edit Commands Options Print + You can use your mouse or keyboard to display menus and choose menu + items. To display a menu from the keyboard, press the Alt key and the key + for the underlined letter in the menu name at the same time. After that, + you can use the arrow keys to navigate to different menu items and menus. + You choose a menu item the same way you choose a menu: Alt + underlined + letter. + The work area is where you enter text and commands and interact with + + + + + + host applications, similar to a video terminal screen. By default, the size of + this area is 24 lines by 80 columns. You can change the terminal size by + selecting the Window... menu item from the Options menu. + The Terminal Size setting in the Window Options dialog box should match + the host system’s row and page settings, to ensure the proper display of + applications such as editors and mail. + Window Colors + VXT DECterm windows use the same color scheme as other VXT windows. You + choose the colors in the Terminal Manager’s Customize Window Color dialog + box (Section 3.9). You can also use the Display Options dialog box in the VXT + DECterm window to choose dark text on a light background or light text on a + dark background (Section 8.4). + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 129 + Using VXT DECterm Windows +7.2 Copying and Pasting Text + +7.2 Copying and Pasting Text + You can copy and paste text in a DECterm window. You can also copy text from + one window and paste the text into another window. To copy and paste text, + you use the DECterm window’s Edit menu. The Edit menu looks like this: + + + + + LJ−01181A−RAGS + + From the Edit menu, you can perform the following functions: + Copy + Choosing this item places the currently selected text into the terminal’s copy + buffer. You can also use the Select All menu item to select the complete + window. + Paste + Choosing this item sends the contents of the terminal’s copy buffer to the + cursor location in the window as if it were typed on the keyboard. + Select All + Choosing this item places all of the window’s text into the terminal’s copy + buffer. You can also use the Copy menu item to place selected text from the + window into the copy buffer. + +7.2.1 Host Synchronization Required + To prevent loss of data when the contents of the paste buffer is sent to the host, + set the host to send XON and XOFF synchronization characters as follows: + On a UNIX or ULTRIX system + % stty ixoff ixon + On an OpenVMS system + $ SET TERMINAL/HOSTSYNC + + + + +130 Chapter 7 + Using VXT DECterm Windows + 7.2 Copying and Pasting Text + +7.2.2 Selecting Text to Copy + You can select a word, a line, or a block of text at a time. A block can be a + single character or any number of contiguous characters, up to the complete + window. You can also use the Select All menu item in the Edit menu to select + the complete window. + To select a block of text: + 1. Point to the start of the block. + 2. Press and hold MB1, then drag the pointer to the end of the block. + 3. Release MB1 to indicate the end of the block. The selected text is + highlighted. + 4. In the Edit menu, click on the Copy menu item. + To select a single word: + 1. Point to the word. + 2. Double click MB1 to select the word. The selected word is highlighted. + 3. In the Edit menu, click on the Copy menu item. + To select a line of text: + 1. Point to the line. + 2. Triple click MB1 to select the line. The selected line is highlighted. + 3. In the Edit menu, click on the Copy menu item. + +7.2.3 Pasting Text + After you select text and store it in the copy buffer, you can paste the text to + the text cursor location in the same window or in a different window. + To paste text: + 1. Place the text cursor where you want to copy the text. + 2. Choose the Paste menu item from the Edit menu of the window that will + receive the copied text. The terminal copies the text to the cursor position. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 131 + Using VXT DECterm Windows +7.2 Copying and Pasting Text + +7.2.4 Using Quick Copy + The quick copy feature lets you paste text without storing it in the copy buffer + or using the Edit menu. There are two ways to perform a quick copy: + Method 1 + 1. Select the text as described in Section 7.2.2. + 2. Place the text cursor where you want to paste the text. + 3. Press and release MB2. If you accidentally move the mouse before + releasing MB2, method 2 is activated. + You can use this method to copy text from one window to another. Move the + input focus to the other window before clicking MB2. To paste into remote + DECterm windows, use MB3. + Method 2 + 1. Place the text cursor where you want to paste the text. + 2. Point to the start of the text you want to copy. + 3. Press and hold MB2. Drag the pointer to the end of the text to be copied. + Release MB2 to copy the selected text to the cursor position. + Copy and Paste Functions Disabled by Some Applications + If you are running an application that provides support for positioning its + pointer or cursor from the mouse, the copy and paste functions may not work. + See your application’s documentation. + +7.2.5 Extending Your Selected Text + After you select an area of text to copy, you may decide that you wanted to + copy a larger area. Before you paste text, you can use the mouse or the arrow + keys to extend the area you have selected. + To extend your selection with the mouse: + 1. After selecting text with MB1, move the mouse cursor to the position that + marks the boundary of the area you would like to have selected. + 2. Press the Shift key and click MB1. This extends the initially selected area + up to the present position of your mouse cursor. + To extend your selection with the arrow keys: + After selecting text with MB1, press the Shift key and any arrow key to extend + your selected text in the direction of the arrow. + + + + +132 Chapter 7 + Using VXT DECterm Windows + 7.3 Clearing or Resetting the Window + +7.3 Clearing or Resetting the Window + The Commands menu in a VXT DECterm window lets you clear, reset, or + resize the window. To display the Commands menu, click on Commands in the + VXT DECterm window’s menu bar. The Commands menu looks like this: + + Host Telnet VXT DECterm 1 + + + + + LJ−01182B−RAGS + + + + From the Commands menu, you can perform the following functions: + Clear Lines Off Top + Choosing this item clears the information stored in the transcript. The + transcript is an area of memory that contains the last saved lines of your + screen display. You can read the transcript by using the scroll bars. The + transcript exists as long as the Record Lines Off Top option in the Display + dialog box is enabled. To change the size of the transcript, use the Display + Options dialog box from the Options menu. + Clear Display + Choosing this item clears the contents of the current window. + Resize Window + Choosing this item resizes the window to match the size (number of rows and + columns) of your DECterm terminal. + Clear Communications + Choosing this item performs the following actions: + • Cancels any print operation in progress. + • Cancels any escape sequence, control sequence, control string, or character + string processing in progress. + • Clears the keyboard buffer. + • Clears the receive buffer. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 133 + Using VXT DECterm Windows +7.3 Clearing or Resetting the Window + + Reset Terminal + Choosing this item sets several terminal operating features to their default + settings. + + Resets... To... + Color map Default. + Cursor mode Visible. + Insert/replace mode Replace. + Origin mode Upper left of window, independent of margins. + Autowrap mode Off. + Keyboard action mode Unlocked. + Keypad mode Numeric. + Cursor key mode Normal. + Top margin Line 1. + Bottom margin The bottom line in the window. + + + + +134 Chapter 7 + Using VXT DECterm Windows + 7.4 Using Options + +7.4 Using Options + The Options menu in a VXT DECterm window lets you customize the settings + for many VXT DECterm features–from window settings to printing. Chapter 8 + describes the Options menu and how to use it. + + Host Telnet VXT DECterm 1 + + + + + LJ−01185B−RAGS + + + + Note + Your VXT manager may choose to restrict your access to the Options + menu or certain menu items. In this case, the items are dimmed. + + + +7.5 Printing the DECterm Window + You can print the contents of the DECterm window on a serial or parallel + printer connected to the rear of the terminal. See Section 4.2 to activate the + serial or parallel printer port. You can print all or part of the window. You can + print the window as text, sixel graphics, or PostScript if your printer supports + the format. To display the Print menu, click on Print in the DECterm window’s + menu bar. The Print menu looks like this: + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 135 + Using VXT DECterm Windows +7.5 Printing the DECterm Window + + + + Host Telnet VXT DECterm 1 + + + + + LJ−01183B−RAGS + + + From the Print menu, you can perform the following functions: + Print Text Page + This option sends the contents of the page to the printer as text. The page + size is set by the Terminal Size option in the Window Options dialog box. You + can choose the Window Options dialog box from the Options menu in the VXT + DECterm window. The default size is 24 lines. + Print Selected Text + This option sends text you select on the screen to the printer. + Print All Text + This option sends the contents of the page and the transcript to the printer as + text. The transcript contains the lines that were saved after they were scrolled + off the top of the screen. You can control the number of lines saved. + Print Graphics + This option sends the contents of the page to the printer in text, PostScript, or + sixel format. + Finish Printing + This option stops the printing after the current contents of the buffer are + printed. + Cancel Printing + This option stops the printing immediately. + + + + +136 Chapter 7 + Using VXT DECterm Windows + 7.6 Exiting from a VXT DECterm Window + +7.6 Exiting from a VXT DECterm Window + There are two ways to exit from a VXT DECterm window: + • Log out from the window as you normally log out from your host system. + This action closes the window and stops all applications in the window. + • Click on the File menu in the Terminal Manager’s menu bar and choose + Exit. + This action closes the window, but may leave applications running. + Depending on your operating system, you may be able to create another + DECterm window and reconnect to the application. + + + Host Telnet VXT DECterm 1 + + + + LJ−01184B−RAGS + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 137 + 8 + 8 + Customizing VXT DECterm Windows + + + This chapter describes how to set many VXT DECterm window features to + suit your personal preference, by using the Options menu in a VXT DECterm + window. Initially, the features use factory-default settings that work with + many host systems. You can make changes to the settings and save them for + all future sessions. + The chapter covers the following major topics: + • Displaying the Options Menu + • Saving and Restoring VXT DECterm Option Settings + • Changing Your Window Settings + • Changing Your Display Settings + • Changing Your General Operating Features + • Changing Your Keyboard Features + • Choosing National Replacement Character Sets + • Changing Your Graphics Display Settings + • Changing Your Printer Settings + + + + +138 Chapter 8 + Customizing VXT DECterm Windows + 8.1 Displaying the Options Menu + +8.1 Displaying the Options Menu + To display the Options menu, click on Options in the VXT DECterm window’s + menu bar. The Options menu looks like this: + + Host Telnet VXT DECterm 1 + + + + + LJ−01185B−RAGS + + + When you choose a menu item from the Options menu, the terminal displays + a dialog box with the feature settings for that topic. In dialog boxes, shaded + buttons indicate the current settings. You can examine the settings and change + them if desired. You can use the last three menu items to save your settings, + restore your last saved settings, or restore the system-default settings. + + Note + A system manager can customize settings for terminals and work + groups. The system manager can also lock or unlock access to menu + items on the Options menu. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 139 + Customizing VXT DECterm Windows +8.2 Saving and Restoring VXT DECterm Option Settings + +8.2 Saving and Restoring VXT DECterm Option Settings + Initially, the terminal uses the system-default settings for each VXT DECterm + window you create. If you make changes to option settings and save them, the + terminal applies your saved settings to each new VXT DECterm window you + create. To make changes to VXT DECterm settings and save them: + 1. Make your changes in a VXT DECterm Options dialog box, then click + on the OK or Apply button. The changes are applied to the current VXT + DECterm window. + 2. Click on Save Options in the Options menu. The settings are saved for + future VXT DECterm windows. + Applying Changes in a Dialog Box + Each VXT DECterm Options dialog box has three push buttons for applying or + dismissing new settings in that box: + + Click + on . . . To . . . + OK Apply new settings for the current session and dismiss the dialog box. + Apply Apply new settings for the current session without dismissing the dialog + box. + Cancel Dismiss the dialog box without changing any settings. If you made any + changes without applying them, clicking on the Cancel button cancels + those changes. + + Some option settings do not take effect until you open a new VXT DECterm + window. + OK and Apply Do Not Save VXT DECterm Options + Note that the OK and Apply buttons work differently in VXT DECterm Options + dialog boxes than in the Terminal Manager window’s Customize dialog boxes. + In the Customize dialog boxes, the OK and Apply buttons save the feature + settings for future use. + + + + +140 Chapter 8 + Customizing VXT DECterm Windows + 8.2 Saving and Restoring VXT DECterm Option Settings + +Saving or Restoring Option Settings +To save or restore settings for future sessions, choose from the following menu +items on the Options menu: + +Choose . . . To . . . +Save Options Save your current option settings for use in all future + sessions. +Restore Options Recall the last option settings you saved with the Save + Options menu item. Choose the Restore Options menu item + if you want to reset any option settings that you changed + temporarily, but did not save. To see changes to specific + settings, display the dialog box for those settings. +Restore System Options Restore the terminal’s default option settings. To see + changes to specific settings, display the dialog box for + those settings. + +If you have changed some settings and want to use or view the factory-default +settings for your VXT DECterm Option dialog boxes, click on Restore System +Options in the Options menu. If you saved some customized settings but decide +you want to return to the factory-default settings for future sessions, click on +Restore System Options and Save Options; remember that this clears the +customized settings you saved. +Applications May Customize Some Settings +Some application software that you use may also set certain window features. +Programmers can use control sequences in their applications to customize +most DECwindows features from the host system. This provides the individual +application with more control. +ReGIS and Sixel Graphics +VXT DECterm windows emulate the VT300 series terminal, so you can display +ReGIS and sixel graphics on the terminal. You can also use the remote +DECterm application available under a host session manager to display ReGIS +and sixel graphics. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 141 + Customizing VXT DECterm Windows +8.3 Changing Your Window Settings + +8.3 Changing Your Window Settings + You can use the Window Options dialog box to control the size of the VXT + DECterm window, by choosing the number of rows and columns displayed. + You can also control such features as the window title and the font size (big or + small) used to display characters. You can use an alternative font on your host + system or InfoServer system, if the font meets certain requirements. + Before your resize a VXT DECterm window in the Window Options dialog box, + you should understand how host system and window manager settings also + affect the window’s operation. + Factors Affecting the VXT DECterm Window Size + Three factors affect the display of a VXT DECterm window: + • The Terminal Size setting in the Window Options dialog box + • The host’s settings for the DECterm terminal size + • Any adjustments you make to the window size, using a local or remote + window manager (such as maximizing the window or using the window + border to stretch the window) + The normal Terminal Size in the Window Options dialog box is 24 rows by + 80 columns. Keeping the Terminal Size matched with the host’s setting + ensures the proper display of applications such as editors and mail. If you + use unmatched settings, be aware that some application displays may be + affected. + If you change the Terminal Size, you can make the same adjustments on the + host. The commands for setting the DECterm window size on the host depend + on the operating system. + For example, on OpenVMS hosts you can enter the SHOW TERMINAL + command to check the Page and Width settings. These settings should match + the Terminal Size row and column settings. You can adjust the host settings + with the SET TERM/PAGE=n and SET TERM/WIDTH=n commands. + The Auto Resize Terminal feature in the Window Options dialog box + determines whether or not the Terminal Size automatically changes when + you adjust the window with a window manager. Normally this feature is off, + so the Terminal Size remains matched with the host’s settings. For example, + when you click on the window border and stretch the window, the number of + rows and columns within the window does not change. + + + + +142 Chapter 8 + Customizing VXT DECterm Windows + 8.3 Changing Your Window Settings + +Using the Window Options Dialog Box +To view or change your VXT DECterm window settings, choose Window... from +the Options menu. The terminal displays the Window Options dialog box: + + + + + LJ−01186B−RAGS + + +From the Window Options dialog box, you can change the following features: + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 143 + Customizing VXT DECterm Windows +8.3 Changing Your Window Settings + + Auto Resize Terminal + Normally, changing the window size does not change the number of rows + and columns displayed. If you click on Auto Resize Terminal, the terminal + automatically adjusts the number of display rows and columns when you or + your application software changes the window size. + Auto Resize Window + Normally, the terminal automatically resizes the window when the number of + rows and columns changes. You can turn this feature on or off by clicking on + Auto Resize Window. If you display a large number of rows and columns when + this feature is off, some information may be outside the window boundary. + Terminal Size + The default size of the VXT DECterm window is 24 rows and 80 columns. You + can choose from standard values or enter your own value: + • Standard values: Choose 24, 48, or 72 rows and 80 or 132 columns. + • Your own value: Click on the Rows box and enter a number from 1 to 99. + Click on the Columns box and enter a number from 9 to 254. + Normal Font, Condensed Font + Normally, the terminal displays characters in a font suitable for the display + width—a normal font for 80 columns, a condensed font for 132 columns. You + can also choose to use the normal font or condensed font at all times, by + clicking on the Normal Font (80 Columns) button or Condensed Font (132 + Columns) button. The condensed font lets you display more characters in a + small window. + Window Title + You can choose a window title of up to 30 characters for each window you open. + The default title is + Host Transport VXT DECterm n + • Host is the host name, service name, or IP address of the host system. + • Transport is the method used to connect to the host system —Telnet, LAT, + DECnet, or Serial. + • n is the number of the window. VXT DECterm windows are numbered + sequentially in the order you open them during a session. + Programmers can change the title by using the following command: + 21;title_string + + + + +144 Chapter 8 + Customizing VXT DECterm Windows + 8.3 Changing Your Window Settings + +If you change the title, the terminal stops numbering windows in the session. +The only way to restart numbering is to choose Restore Systems Options from +the Options menu. In doing so, all VXT DECterm settings are restored to their +system-default settings. + Icon Name +You can choose an icon name to identify each window you reduce to an icon. +This option works the same as the Window Title option. +Programmers can change the icon name with the following command: +2L;icon_string + Big Font, Little Font, German Standard Font +You can display characters in a little font, big font, or German standard font. +Normally, the terminal displays characters in its little font, which is a 14-point +font (10-point font on 100 dots/inch monitors). The big font is an 18-point font. +As an alternative, you can specify a suitable font on your host system or +InfoServer system. In any case, you can display only one font in a window at a +time. You may use a different font in each VXT DECterm window. +To choose one of the terminal’s default fonts: +1. Click on the Big Font, Little Font, or German Standard Font button. +2. Click on the Default button next to the font you chose. +3. Click on OK or Apply to see the new font in the VXT DECterm window. +To save a font selection for future use: +Click on Save Options in the Options menu. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 145 + Customizing VXT DECterm Windows +8.3 Changing Your Window Settings + +8.3.1 Using Fonts on Your Host System or InfoServer + If you have suitable fonts on your host or InfoServer system, you can use those + fonts instead of the terminal’s fonts in your VXT DECterm windows. In each + VXT DECterm window, you can specify an alternative big font, little font, and + German standard font. You can specify fonts from different hosts or InfoServer + systems. + To use alternative fonts on a host or InfoServer system, you must specify a font + path and font name. + + Note + VXT DECterm windows require specific fonts and sizes to run and + display properly. Most fonts do not meet these requirements. Problems + and error messages will occur if VXT DECterm cannot find the proper + fonts. + + + Step 1: Specify a Font Path + Use the Customize Font Path dialog box in the Terminal Manager window + (Section 5.3). + You can set only one font path at a time. You can change font paths while a + VXT DECterm window is running. Applications currently running continue to + use the old font path. + Step 2: Enter the Font Name in the Window Options Dialog Box + You can specify an alternative font for each of the standard font choices: big + font, little font, and German standard font. You can specify different fonts in + each VXT DECterm window you create. You can also change fonts while a VXT + DECterm window is displayed. + To save your font settings, click on Save Options in the Options menu. New + applications will use the new font. Applications currently running will continue + to use the same font. + 1. Click on the Big Font, Little Font, or German Standard Font button. + 2. Click on the Other button next to font you chose in step 1. + 3. Clear the text in the box next to the Other button. Double-click on the box. + All text in the box is highlighted. Press the Remove key to erase all the + text. + 4. Enter the name of your font in the box. See your system manager if you + need help. + + + +146 Chapter 8 + Customizing VXT DECterm Windows + 8.3 Changing Your Window Settings + + Use the following steps if your font is on an InfoServer system. +To use a font on an InfoServer system: +After you set the font path, you can use the terminal’s Configuration Manager: +Font Management dialog box to list the available fonts on your InfoServer +system. You can cut and paste the font name into the DECterm Window +Options dialog box. +1. In the Terminal Manager window, click on Customize in the menu bar to + display the Customize menu. +2. In the Customize menu, click on Configuration... to display the + Configuration submenu. +3. Click on the Font Management... menu item to display the Configuration + Manger: Font Management dialog box. +4. Click on the name of the font set you want. The font set name appears + highlighted in the scroll box. +5. Click on the List Contents... button to display the List Font Set Contents + box. +6. In the List Font Set Contents scroll box, find the font you want. Triple + click on the font. +7. Click on the DECterm Window Options dialog box. The input cursor should + be blinking in the Other box that you cleared. If not, click on the Other + box. +8. Click on MB2. The font name is copied to the Other box. +9. Click on Apply or OK. The terminal applies the new font to the VXT + DECterm window. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 147 + Customizing VXT DECterm Windows +8.4 Changing Your Display Settings + +8.4 Changing Your Display Settings + You can control display features such as the type of cursor, use of scroll bars, + and appearance of text (light or dark). You can also specify how many lines to + save when text is scrolled off the top of the window. To view or change your + display settings, choose Display... in the Options menu. The terminal displays + the Display Options dialog box: + + + + + LJ−01187A−RAGS + + From the Display Options dialog box, you can change the following settings: + Record Lines Off Top + Normally, the terminal saves lines that are scrolled off the top of the VXT + DECterm window. To view these lines, use the vertical scroll bar. If you do not + want to save lines that are scrolled from the display, click on the Record Lines + Off Top button to turn it off. To specify the number of lines to save, use the + Record 100 Lines Off Top box in this display box. + Vertical Scroll Bar + Normally, the VXT DECterm window has a vertical scroll bar. To remove the + scroll bar, click on the Vertical Scroll Bar button to turn it off. + + + + +148 Chapter 8 + Customizing VXT DECterm Windows + 8.4 Changing Your Display Settings + + Horizontal Scroll Bar +Normally, the VXT DECterm window does not have a horizontal scroll bar. To +add a horizontal scroll bar to the bottom of the window, click on the Horizontal +Scroll Bar button. + Vertical Cursor Coupling +Normally, the cursor automatically returns to the cursor position in the +DECterm window to display text when it comes from your host system. For +example, if you scroll back into transcript and output from the host occurs, the +cursor returns to display the output text. Click on the Vertical Cursor Coupling +button if you wish to turn vertical cursor coupling off. + Horizontal Cursor Coupling +Normally, the cursor does not return to display text from a host system if you +are scrolling horizontally. For example, if you scroll horizontally into transcript +and output from the host occurs, the cursor will not return to display the +output text. Click on the Horizontal Cursor Coupling button if you wish to +turn horizontal cursor coupling on. + Auto Wrap +Normally, text does not automatically wrap to the next line when the cursor +reaches the right margin in the window. To have text automatically wrap to +the next line, click on the Auto Wrap button. + Display Cursor +Normally, the terminal displays the text cursor, which is a block or underline +character. To turn the text cursor off, click on the Display Cursor button. + Cursor Blink +Normally, the text cursor blinks. To have the cursor appear steady, click on the +Cursor Blink button. The terminal manager also has a Cursor Blink feature, +in the Customize Keyboard dialog box. The two settings have no effect upon +each other. + Text and Window Background +VXT DECterm windows use the same color scheme as other VXT windows. You +choose the colors in the Terminal Manager’s Customize Window Color dialog +box (Section 3.9). To swap the text and background colors, you can use the +Dark Text, Light Background or Light Text, Dark Background buttons. + Status Display +If you want to display a host status line, click on the Host Status Display +button. The host status line is a line at the bottom of the window where your +host application software can display messages. + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 149 + Customizing VXT DECterm Windows +8.4 Changing Your Display Settings + + Cursor Style + Normally, the terminal uses a solid block cursor to indicate the active position. + To use an underline character for the cursor, click on the Underline Cursor + button. + Batch Scroll 0 Lines + You can specify the speed at which the terminal displays text from your + host during scrolling. The slowest settings of 0 or 1 line display every line + during scrolling. Faster settings greater than 1 line cause multiple lines to be + displayed quickly from the host. + Record 100 Lines Off Top + Normally, the terminal saves up to 100 lines that are scrolled off the top of the + display. You can specify the number of lines to save (0 to 999) by using the + Record 500 Lines Off Top box. Increasing the number of lines saved increases + the terminal’s memory usage. + +8.5 Changing Your General Operating Features + You can set general operating features to match your computing environment + and application software. For example, you choose which of the terminal’s + character sets to use. To view or change general operating settings, click on + General... in the Options menu. The terminal displays the General Options + dialog box: + + + + +150 Chapter 8 + Customizing VXT DECterm Windows + 8.5 Changing Your General Operating Features + + + + + LJ−01188−RAGS + +From the General Options dialog box, you can change the following settings: + Newline +Normally when you press the Return key, the cursor moves to a new line +because the terminal sends a carriage return (CR) character and a line feed +(LF) character. Similarly, when the terminal receives a line feed, form feed +(FF), or vertical tab (VT) character, the cursor moves to the first column of the +next line. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 151 + Customizing VXT DECterm Windows +8.5 Changing Your General Operating Features + + If you click on the Newline button, pressing Return sends only a carriage + return, so the cursor does not move to a new line. When the terminal receives + a LF, FF, or VT character, the cursor moves to the current column of the next + line. + Lock UDKs + Your keyboard contains keys you can define for your own use (Chapter 15). + Normally, the host system can change the function of these user-defined keys + (UDKs). If you click on the Lock UDKs button, the host system cannot change + your definitions. + Lock User Features + There is a set of VXT DECterm option features that users often set to their + own preference, including the terminal size (in Window Options), text and + background color (in Display Options), and auto repeat feature for keys (in + Keyboard Options). Your host applications can override these option settings + unless you click on the Lock User Features button. + Local Echo + Normally, the terminal sends data entered at the keyboard to your host system, + which may send it back to the terminal for display after processing. This is + called a remote echo. + If you want to send keyboard data to both the host system and the terminal + (local echo), click on the Local Echo button. + Cursor Keys + Normally, the arrow keys move the cursor by sending standard ANSI cursor + control sequences. Clicking on the Application Cursor Keys button lets the + arrow keys send application-specific control sequences. + Keypad + Normally, numeric keypad keys send the character shown on the key (using + ASCII codes). If you click on the Application Keypad button, the numeric + keypad keys send control sequences used with some applications. + User-Preferred Supplemental Set (UPSS) + If you click on the 8-Bit Multinational Characters button in this dialog box, you + can choose one of two supplemental character sets to use—DEC Supplemental + or ISO Latin 1 Supplemental. Both character sets feature special characters + used in the major Western European languages. The ISO Latin-1 set includes + a few more characters that are not included in the DEC Supplemental set. + Normally, the terminal uses the UPSS DEC Supplemental set. Click on the + UPSS ISO Latin 1 button to use the UPSS ISO Latin 1 Supplemental set. + + + +152 Chapter 8 + Customizing VXT DECterm Windows + 8.5 Changing Your General Operating Features + + 8-Bit Multinational or 7-Bit NRCS Characters +You can select the type of characters the terminal uses, 8-bit multinational or +7-bit national replacement characters. +Normally, the terminal uses 8-bit multinational characters. This setting +supports most of today’s computing environments. There are two multinational +character sets available—the DEC Multinational character set and the ISO +Latin Alphabet No. 1 character set. Both sets consist of the ASCII character +set and their own supplemental set. To choose one of the multinational +character sets, you choose their supplemental set by using the UPSS buttons +in this dialog box. +Clicking on the 7-Bit NRCS Characters button lets the terminal use one +of several national replacement character sets. This setting is useful in +computing environments that are restricted to 7 bits. The 7-bit NRC character +sets are for the major Western European languages. When you choose this +setting, the terminal uses the NRC set that matches the current Keyboard +Type chosen in the Terminal Manager’s Customize Keyboard dialog box +(Section 3.3). You can also choose the individual NRC set by using the 7-Bit +NRCS Selection menu item from the Options menu. + VT Emulation Mode +The terminal can emulate the responses of VT300 series, VT200 series, VT100 +series, or VT52 text terminals to text and control functions sent from the host +system. If you have application software developed for one of these terminals, +you can choose the appropriate operating mode to run that software. +Normally, the terminal uses VT300 7-bit controls. In 7-bit controls mode, the +terminal sends 7-bit controls and 8-bit character codes to the host. Use this +mode with VT300 and VT200 applications that use 7-bit control characters. +In 8-bit controls mode, the terminal can send 8-bit controls and 8-bit character +codes to the host. This mode supports VT300 and VT200 8-bit text applications. +In either VT300 mode, the terminal accepts both 7-bit and 8-bit controls from +the host. +VT100 mode lets the terminal run applications that require VT100 +compatibility. +VT52 mode lets the terminal run VT52 applications. + Terminal ID +The terminal sends the host system a terminal identification (ID) message to +let the system know the terminal’s specific operating characteristics. You can +choose another terminal ID if needed. The terminal ID is also called the device +attributes response. + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 153 + Customizing VXT DECterm Windows +8.5 Changing Your General Operating Features + + Answerback Message + The terminal sends an answerback message to the host system when (1) + you press Ctrl F5 , or (2) the host requests the message by sending an ENQ + character. Host requests do not affect screen data or require a user response. + To enter an answerback message, click on the Answerback Message box. Your + message can have up to 30 characters. + Conceal Answerback Message + You can conceal your answerback message by clicking on the Conceal + Answerback Message button. Your answerback message is replaced with + the text in the Answerback Message box. + If you conceal the message, you can never redisplay it. If you click on the + Answerback Message box, your concealed message is erased; you can enter a + new message and conceal it by clicking on the Conceal button. + +8.6 Changing Your Keyboard Features + You can turn the keyboard’s warning bell and margin bell on and off. You can + also control the function of the key to send the accent mark +( ` ) and tilde ( ~ ) characters. If you click on the Angle Brackets Key Sends `~ +button, the < > key sends the accent mark ( ` ) when unshifted and the tilde ( +~ ) when shifted. + Auto Repeat +Most keys on the keyboard automatically repeat when you hold them down. +You can turn this feature off or on by clicking on the Auto Repeat button. The +Return and Help keys never autorepeat. + +The Terminal Manager window’s Customize Keyboard dialog box also has an +Auto Repeat feature. The two settings do not affect each other. To disable +autorepeating in both the Terminal Manager and VXT DECterm windows, +disable both settings. + Ctrl-Q, Ctrl-S = Hold +Normally, pressing Ctrl S prevents data from the host appearing on the +screen. Pressing Ctrl Q allows data to display. +You can turn this feature off or on by clicking on the Ctrl-Q, Ctrl-S = Hold +button. If you turn the feature off, pressing Ctrl S or Ctrl Q have no effect on +the display of text. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 155 + Customizing VXT DECterm Windows +8.6 Changing Your Keyboard Features + + < x Delete / Backspace Key + Normally, pressing the key sends a + period. If you want to use these keys to send angle brackets in the shifted + position, click on the Comma Key Sends ,< button. + +8.7 Choosing National Replacement Character Sets + You can use 8-bit multinational character sets or 7-bit national replacement + character (NRC) sets with VXT DECterm windows. You should use the type of + character set that matches your computing environment. To choose the type of + character set, select the General... menu item from the Options menu. + When you choose to use 7-bit character sets, the terminal automatically uses + the NRC set that matches the current Keyboard Type chosen in the Terminal + Manager’s Customize Keyboard dialog box (Section 3.3). You can also choose + an NRC set by using the Options menu. Choose 7-Bit NRCS Selection... to + display the 7-Bit NRCS Selection Options dialog box: + + + + + LJ−01190−RAGS + + + + +156 Chapter 8 + Customizing VXT DECterm Windows + 8.7 Choosing National Replacement Character Sets + + The scroll box lists the available NRC sets. To choose an NRC set for the + current window, click on a set in the scroll box. Then click on the OK button. + +8.8 Changing Your Graphics Display Settings + You can control some features that affect the display of graphics, such as color + map entries. To view or change the graphic settings used with VXT DECterm + windows, choose Graphics... from the Options menu. The terminal displays the + Graphics Options dialog box: + + + + + LJ−01191−RAGS + + + From the Graphics Options dialog box, you can change the following settings: + Share Color Map Entries + Normally, color map entries are shared. This prevents the VXT DECterm + window from allocating color map entries for its exclusive use. Instead, + DECterm allocates shared, read-only colors out of a default color map. This + means that DECterm does not need to create a private color map, which would + prevent the windows from displaying in their true colors. However, it also + means that DECterm colors may not match the colors used on a VT terminal. + Enable Backing Store + The backing store feature enables the terminal to redisplay DECterm graphics + after they are covered by another window or iconified. The Customize X Server + dialog box in the Terminal Manager window also has a Backing Store button + (Section 5.4). + Report Macrograph Contents + The VXT DECterm window does not respond to a request by an application to + report macrograph contents. Clicking on this option enables ReGIS commands + to report macrograph contents. When reporting is complete, disable this + feature to reduce any security risks. + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 157 + Customizing VXT DECterm Windows +8.8 Changing Your Graphics Display Settings + + Number of Bit Planes + The number of bit planes supported by your system determines the number of + colors available for ReGIS and sixel graphics. With 2-bit planes, the DECterm + emulator can display four different colors at the same time. With 4-bit planes, + the DECterm emulator can display 16 colors. + The DECterm emulator uses 2-bit planes on 4-plane systems; it uses 4-bit + planes on all other systems. This reduces the probability that the DECterm + emulator must create a private color map. You can choose the number of + colors available in ReGIS and sixel graphics by entering the number of planes + supported by your system. + +8.9 Changing Your Printer Settings + You can control print settings used with VXT DECterm windows, such as + what area of the window to print. To view or change printer settings, choose + Printer... from the Options menu. The terminal displays the Printer Options + dialog box: + + + + + LJ−01192A−RAGS + + From the Printer Options dialog box, you can change the following settings: + Form Feed Terminator + Normally, the terminal sends a form feed (FF) character to the printer port + at the end of any printing operation started from the VXT DECterm window’s + Print menu. + + +158 Chapter 8 + Customizing VXT DECterm Windows + 8.9 Changing Your Printer Settings + + Printer to Host +If you use a serial input device connected to the terminal’s serial port, the +terminal can accept input data from the device and send the data to the host +application. By default, the serial port does not work as a printer port, so the +Printer to Host button is dimmed. To use the serial port to receive data, change +the Port Usage setting to Serial Port: Printer (Section 4.2). Then choose the +Printer to Host button. + Graphics Printing +Normally the terminal supports graphics printing operations in addition to text +printing. +Printing Modes +You can choose from three printing modes: +• Normal Print Mode +• Auto Print Mode +• Printer Controller Mode + Normal Print Mode +Normally, you can send all or part of the text displayed in a window to a local +printer. To print the window’s text, press the F2 (Print) key. + Auto Print Mode +Auto print mode immediately sends each line of text received from the host +system to your local printer. The terminal sends the current display line to +the printer when the cursor moves to the next line after a line feed, form feed, +vertical tab, or autowrap. +To turn auto print mode on or off, press Alt A . You return to normal print +mode when you leave auto print mode. +You can perform normal printing functions in auto print mode. + Print Controller Mode +Printer controller mode lets a host system send text directly to the local printer, +without displaying the text in the VXT DECterm window. You cannot select +this mode from the keyboard. Applications select this mode by using VT320 +programming functions. +The F2 (Print) key does not work in printer controller mode. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 159 + Customizing VXT DECterm Windows +8.9 Changing Your Printer Settings + + Printing All or Part of the Window + You can print all or part of the VXT DECterm window. You can also choose to + print selected characters. To print the window’s text, press the F2 (Print) key. + You can choose from the following options. + Print Full Page + Normally when you print a VXT DECterm window, the terminal sends the text + in the main display to the printer. + Print Full Page + Transcript + This option prints the text in the transcript (the lines saved off the top of the + scrolling region), followed by the text in the main display. You can specify the + number of lines saved by using the Display Options dialog box. + Print Scroll Region Only + This option prints the text in the scrolling region of the main display. + Print Selection Only + This option prints text that you have selected in the main display. + Matching Your Printer’s Capabilities + You can print from character sets that match the capability of your printer. + Print National Characters Only + This option prints national replacement characters (NRC) only. Other + characters are converted to the corresponding national characters, if any; + otherwise they are not sent. + Print National + Line Drawing + This option prints national replacement characters and line-drawing + characters. + Print All Characters + This option prints all characters, including multinational and technical + characters. + + + + +160 Chapter 8 + 99 + Using VXT 3270 Windows + + + This chapter describes how to create and use VXT 3270 windows. The chapter + covers the following major topics: + • VXT 3270 Windows + • Before You Start + • Creating a VXT 3270 Session + • Entering 3270 TE Connection Parameters + • Using the VXT 3270 Window + +9.1 VXT 3270 Windows + VXT 3270 windows emulate IBM graphic display terminals. The windows let + you access application programs on an IBM Systems Network Architecture + (SNA) host system through a DECnet/SNA gateway. You can have several VXT + 3270 windows displayed at the same time, running different applications. You + can use your mouse to move between windows. + All VXT 3270 terminal emulation tasks are performed by the VXT 2000 + windowing terminal, significantly decreasing the load on the host system and + on the network. + VXT 3270 windows provide functions similar to the following IBM terminal + models: + IBM 3178 + IBM 3179–G and 3192–G + IBM 3180 models 1–5 + IBM 3270 + IBM 3270–S3G + IBM 3278 models 1–5 + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 161 + Using VXT 3270 Windows +9.1 VXT 3270 Windows + + IBM 3279–S3G + Common features supported by the VXT 3270 include + • Active and passive connects + • Protected and unprotected fields + • Alphanumeric and numeric data + • Audible alarm + • Intensified display, normal display, and nondisplay characters + • Alphanumeric cursor (block cursor) + +9.2 Before You Start + Before you create a VXT 3270 window, you need the following: + A VXT 3270 software license + A DECnet address for your terminal, displayed in the Terminal Manager + window (Section 4.9) + A DECnet name server address entered in the DECnet Name Translator + dialog box (Section 4.10) + A gateway name to enter in the Connection Parameters dialog box + An access name to enter in the Connection Parameters dialog box + +9.3 Creating a VXT 3270 Session + To create a VXT 3270 session: + 1. Display the Create dialog box (Section 2.2.1). + a. In the Application box, click on the 3270 button. + b. In the Transport box, click on the DECnet button. + c. In the Host Name or Address box, enter the name or address of the + DECnet host to use for the connection. + d. Click on the button to save your settings in the Preferred Services + list. + e. Click on Start to start the session. + 2. Enter connection information in the 3270 TE Enter Connection Parameters + dialog box (Section 9.4). + + + +162 Chapter 9 + Using VXT 3270 Windows + 9.4 Entering 3270 TE Connection Parameters + +9.4 Entering 3270 TE Connection Parameters + When you create a VXT 3270 session from the Create dialog box, the terminal + displays a Connection Parameters dialog box for establishing a connection with + an IBM host: + + + + + TI−03014−RAGS + + To connect to an IBM host, you need to specify a gateway name and one of the + following: + • An access name + • A PU name and the Wait button + • A PU name and an application name + For example: + 1. Click on the Gateway box and enter your gateway name. + 2. Click on the Access Name box and enter your access name. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 163 + Using VXT 3270 Windows +9.4 Entering 3270 TE Connection Parameters + + 3. Click on the Save button to save your connection parameters for future + sessions. + 4. Click on the OK button to establish connection with your host. + 5. A login box appears. Log in to your host system. + From the Connection Parameters dialog box, you can enter the following + settings: + + Gateway + Identifies the name of the DECnet node that is defined as the host node for the + gateway. + Example: MARKET + + Access Name + Identifies the name of the entry in the gateway access name table to use when + connecting to the SNA network. Access names are set up on the host DECnet + node for the gateway. The name can be 1 to 16 characters from the set of A to + Z, 0 to 9, period (.), dollar sign ($), at sign (@), and pound sign (#). + Example: PAYROLL + An access name can provide values for the following parameters: + Application name + Data + Logon mode + PU + Session address + If you specify these parameters with the Access Name parameter, they override + any existing values in the access name table you specified. + + PU Name + Identifies the name of a particular physical link from the gateway to the IBM + host. Ask the gateway manager for the appropriate PU value. + Example: SNA-1 + + Session Address + Identifies the IBM session address used to communicate with the IBM host. + The gateway manager receives this value from the IBM systems programmer. + The value is defined by the LOCADDR operand on the ACF/NCP LU macro or + the VTAM LU macro. + The address is a decimal number from 0 to 255. You can specify 0 to let the + gateway select the next available session address. + + +164 Chapter 9 + Using VXT 3270 Windows + 9.4 Entering 3270 TE Connection Parameters + +Example: 42 + + Application Name +Identifies the IBM application that will be the primary logical unit (PLU). The +gateway manager receives this value from the IBM VTAM programmer. The +value is defined in the VTAM APPL statement. The application name can be 1 +to 8 characters from the set of A to Z, 0 to 9, period (.), dollar sign ($), at sign +(@), and pound sign (#). +Example: CICS + + Logon Mode +Identifies the name of an entry in the logon mode table defined by the host +IBM system. This entry specifies a selected set of SNA protocol parameters. +The gateway manager receives this value from the IBM VTAM programmer. +The value is defined in the VTAM MODEENT macro. The Logon Mode entry +can be 1 to 8 characters from the set of A to Z, 0 to 9, period (.), dollar sign ($), +at sign (@), and pound sign (#). +Example: T3279M3 + + Data +Identifies user data to send to the IBM system as part of the logon request. +The data can be a string of up to 110 ASCII characters. +Some IBM subsystems use values for the Data parameter at VXT 3270 window +startup time to speed the logon process. +Example: JOE + + Authorization Password +Allows access to secured logical units (LUs). Ask your gateway manager for +the value of an authorization password if you need to specify this parameter. +It is relevant only if your version of the DECnet/SNA gateway or VMS/SNA +Gateway supports LU security. The value can be 1 to 32 characters from the +set of A to Z, 0 to 9, period (.), dollar sign ($), at sign (@), and pound sign (#). +Example: 645312 + + Terminal Type +Identifies the IBM display station to emulate. The value can be 3192G +(default), 3279S3G, or 3270. +If you specify 3270, the VXT 3270 window emulates a generic 3270 display +station. Graphics will not be displayed, and a smaller font and window size +may be used. Use 3270 to emulate an IBM Model 4 (43 80 window) terminal +  + + + + +or an IBM Model 5 (27 132 window) terminal. +  + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 165 + Using VXT 3270 Windows +9.4 Entering 3270 TE Connection Parameters + + Example: 3192G + + [No]Wait + Causes the VXT 3270 window to wait for an IBM application (PLU) to initiate + a session. Nowait is the default. The Unformatted Systems Services (USS) + window may appear when the session is established, depending on the version + of the gateway or VMS/SNA gateway you are using. + Wait does not have a value as the other parameters do. If you use the Wait + parameter, you cannot specify values for the following parameters: + Application Name + Data + Logon Mode + +9.5 Using the VXT 3270 Window + After you establish a session establish a session with the IBM host, the + terminal displays a VXT 3270 TE dialog box. The dialog box provides the + work area for your session. This section describes how to use the work area to + perform different tasks. The section covers the following major topics: + • Using the VXT 3270 Window Work Area + • Entering Data + • Editing Data + • Printing Text + • Copying and Pasting Text + • Recording and Playing Back Key Sequences + • Using the Numeric Keypad to Enter Numbers + • Saving Current Settings + • Viewing Your Connection Parameters + • Using the MB3 Pop-Up Menu + Chapter 11 describes the basic features of windows and how to use menus. + + + + +166 Chapter 9 + Using VXT 3270 Windows + 9.5 Using the VXT 3270 Window + +9.5.1 Using the VXT 3270 Window Work Area + The VXT 3270 work area has two sections — the display area and the operator + information area. + + + + + TI−03015−RAGS + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 167 + Using VXT 3270 Windows +9.5 Using the VXT 3270 Window + +9.5.2 Working in the Display Area + The display area is where you perform most application-related duties, such as + entering data and receiving output. The following sections explain some of the + characteristics of the display area. + The window + The VXT 3270 window lets you display different window sizes, which are + controlled by the IBM host. + The VXT 3270 window can be unformatted or formatted. An unformatted + window has no fields. How you enter data in an unformatted window depends + on the application program you are using. Your IBM application program + user’s guide gives you instructions for using an unformatted window. + A formatted window contains two types of fields: + • Protected fields prompt you for required data. You cannot alter or add + to the text in a protected field. If you try to enter data in a protected field, + the keyboard locks, the terminal bell rings, and the word Inhib appears on + the status line. To free the keyboard, press Reset. + • Unprotected fields are the spaces where you can enter data. When + displaying a formatted window, the program normally places the cursor + under the first empty position in an unprotected field. You can enter data + until the field is full or use the Tab function to move to the start of the next + unprotected field. + The Cursor + The cursor in the display area can take three forms: + • The default text cursor is a blinking block. You can use the CrBlnk + (Cursor Blinking) parameter to select a nonblinking cursor. See + Section 10.2 to use VXT 3270 parameters. + • The selector mouse cursor is a small hand with a pointing finger that + appears when you use the Selector Mouse function (Section 10.1.4). + • A small cross cursor appears for certain graphics applications. + + + + +168 Chapter 9 + Using VXT 3270 Windows + 9.5 Using the VXT 3270 Window + +9.5.3 Understanding Operator Information + The operator information area displays status indicators that let you monitor + the current status of your session. Table 9–1 lists possible status indicators. + + Table 9–1 Status Indicators + Status + Indicator Meaning + Appl You are in a session with an application program (an LU–LU session). + Ext You are using the Ext function. + Insert You are in insert mode. + Inhib The software suspended input from your keyboard. This occurs when + You try to enter data in a protected field + You enter the wrong type of data in a field + The VXT 3270 window is communicating with the IBM software after + you press a key such as Enter + + O You are using the numeric lock override function. This indicator is turned + off when you press the NumOvr function again. + P You are in play mode. A key sequence is being recalled by the Play + function. + Print The contents of your window are being copied to the printer you specified + at startup. The indicator remains displayed until the process is complete. + The window is refreshed when the process is complete. + R You are in record mode. A key sequence is being recorded. + SSCP You are in a session with the IBM control program (an SSCP–LU session). + SysAvl You are successfully communicating with the IBM system and can initiate + transmission. SysAvl turns off while the VXT 3270 window transmits data + to the IBM host. + Wait The IBM system is not available for input. + + +9.5.4 Entering Data + Unformatted windows + If your IBM application displays an unformatted window, use the FM key to + separate entries. Your application guide explains how and when to use this + key. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 169 + Using VXT 3270 Windows +9.5 Using the VXT 3270 Window + + Improper use of some keys causes the keyboard to lock in order to prevent + input to protected fields. If the keyboard locks, the Inhib status indicator + appears and you cannot use any keys to enter data. Use the Reset function to + unlock the keyboard and continue entering data. + Formatted windows + When the IBM application displays a formatted window, enter and edit data + in the unprotected fields only. After you fill an unprotected field with data, + the application may move the cursor to the start of the next protected or + unprotected field. You can also move the cursor by using the arrow keys or the + Tab, BckTab, Home, and Newlin functions (Section 10.2). + +9.5.5 Editing Data + You can edit data in unprotected fields by typing new data over the old data + (normal mode) or inserting new data into partially filled fields (insert mode). + You can also use the Delete, ErEof, ErInp, and RubOut functions to change the + contents of unprotected fields (Section 10.2). + Using Normal Mode + Normal mode lets you enter new data or edit existing data. When you enter + data, the character you type either fills in an empty position or replaces a + character previously displayed in that position. The cursor then moves to the + next position. Remember that a space or a blank is a character. + Using Insert Mode + Insert mode lets you enter new characters between existing characters in an + unprotected field. + Use the Insert function to activate insert mode. Place the cursor under the + character where you want to insert text. When you insert text, characters + starting from the cursor position move right. + You can insert characters in an unprotected field until it is full. If you try to + insert text after the field is full, the keyboard locks, and Inhib is displayed + on the Status line. Use the Reset function to exit insert mode and return + to normal mode. Insert mode is also ended by any Enter, Clear, PA, or PF + function. + + Note + Some fields that appear to have room for more data may contain one or + more trailing blank characters that cause the field to fill. + + + + +170 Chapter 9 + Using VXT 3270 Windows + 9.5 Using the VXT 3270 Window + +9.5.6 Printing Text + The VXT 3270 Print... function lets you print text from the VXT 3270 window + to a printer connected to the terminal’s printer port. + To Print from the File Menu + To print the contents of an application window, pull down the File Menu and + choose Print. The VXT 3270 window send the text from the active window to + the terminal’s printer. + +9.5.7 Copying and Pasting Text + You can copy and paste text in a VXT 3270 window. You can also copy text + from one window and paste the text into another window. To copy and paste + text, you use the VXT 3270 window’s Edit menu. + From the Edit menu, you can perform the following functions: + Copy + Choosing this item places the currently selected text into the terminal’s copy + buffer. You can also use the Select All menu item to select the complete + window. + Paste + Choosing this item sends the contents of the terminal’s copy buffer to the + cursor location in the window as if it were typed on the keyboard. + Select All + Choosing this item places all of the window’s text into the terminal’s copy + buffer. You can also use the Copy menu item to place selected text from the + window into the copy buffer. + +9.5.8 Selecting Text to Copy + You can select text a word, a line, or a block at a time. A block can be a single + character or any number of contiguous characters, up to the complete window. + You can also use the Select All menu item in the Edit menu to select the + complete window. + To select a block of text: + 1. Point to the start of the block. + 2. Press and hold MB1, then drag the pointer to the end of the block. + 3. Release MB1 to indicate the end of the block. The selected text is + highlighted. + 4. In the Edit menu, click on the Copy menu item. + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 171 + Using VXT 3270 Windows +9.5 Using the VXT 3270 Window + + To select a single word: + 1. Point to the word. + 2. Double click MB1 to select the word. The selected word is highlighted. + 3. In the Edit menu, click on the Copy menu item. + To select a line of text: + 1. Point to the line. + 2. Triple click MB1 to select the line. The selected line is highlighted. + 3. In the Edit menu, click on the Copy menu item. + +9.5.9 Pasting Text + After you select text and store it in the copy buffer, you can paste the text to + the text cursor location in the same window or in a different window. + To paste text: + 1. Place the text cursor where you want to copy the text. + 2. Choose the Paste menu item from the Edit menu of the window that will + receive the copied text. The terminal copies the text to the cursor position. + +9.5.10 Using Quick Copy + The quick copy feature lets you paste text without storing it in the copy buffer + or using the Edit menu. There are two ways to perform a quick copy: + Method 1 + 1. Select the text as described in Section 9.5.8. + 2. Place the text cursor where you want to paste the text. + 3. Press and release MB2. If you accidentally move the mouse before + releasing MB2, method 2 is activated. + You can use this method to copy text from one window to another. Move the + input focus to the other window before clicking MB2. To paste into remote + DECterm windows, use MB3. + Method 2 + 1. Place the text cursor where you want to paste the text. + 2. Point to the start of the text you want to copy. + 3. Press and hold MB2. Drag the pointer to the end of the text to be copied. + Release MB2 to copy the selected text to the cursor position. + + +172 Chapter 9 + Using VXT 3270 Windows + 9.5 Using the VXT 3270 Window + +9.5.11 Extending Your Selected Text + After you select an area of text to copy, you may decide that you wanted to + copy a larger area. Before you paste text, you can use the mouse or the arrow + keys to extend the area you have selected. + To extend your selection with the mouse: + 1. After selecting text with MB1, move the mouse cursor to the position that + marks the boundary of the area you would like to have selected. + 2. Press the Shift key and click MB1. This extends the initially selected area + up to the present position of your mouse cursor. + To extend your selection with the arrow keys: + After selecting text with MB1, press the Shift key and any arrow key to extend + your selected text in the direction of the arrow. + +9.5.12 Copying and Pasting With the Keyboard Only + If your mouse is not operating, you can use the keyboard to copy and paste + text. Table 9–2 lists the keys to use. + + Table 9–2 Keyboard Copy and Paste Keys + Press... To... + Select Define the starting point for selected text. + Shift Select Select the range between the starting point and the current + cursor position. This sequence also deselects any previous + selection. + Shift F8 Toggle between add mode and normal mode. The default + mode is normal. + Shift , , +   ,  Extend the current selection. + Ctrl / Select all. + Ctrl \ Deselect all. + F14 Paste. + Ctrl Insert Here Do a clipboard copy. + Shift Insert Here Do a clipboard paste. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 173 + Using VXT 3270 Windows +9.5 Using the VXT 3270 Window + +9.5.13 Recording and Playing Back Key Sequences + You can save frequently used text and commands, then recall them when + needed. The VXT 3270 lets you record up to 127 keystrokes on a PF key, then + play them back using the Playback... function. + Recording Key Sequences + To record a key sequence: + 1. Pull down the Commands menu and choose Record... to display the Record + dialog box. + + + + + TI−03016−RAGS + + 2. Click on the PF key that you want to store your key sequence. + 3. Click on OK. The window displays an R in the operator information area, + and a message box pops up requesting the key sequence. + 4. Click on OK to dismiss the message box. + 5. Enter the key sequence you want to save. + 6. To record your keystrokes, pull down the Commands menu and choose + Record... again. Click on OK. + + + +174 Chapter 9 + Using VXT 3270 Windows + 9.5 Using the VXT 3270 Window + + Canceling a Key Sequence While Recording + You can cancel a key recording in progress at any time up until you choose + Record Key a second time. To cancel a recording in progress: + 1. Pull down the Commands menu and choose Cancel Recording. The Cancel + Recording dialog box appears. + 2. Click on Yes to cancel the Record function. + Viewing Recorded Key Sequences + To view currently recorded keystrokes: + 1. Pull down the View menu and choose Recorded Key Sequences. The + Recorded Key Sequences dialog box appears. + 2. Click on the PF key that contains the keystrokes you want to see. The key + sequence appears. Items enclosed in angle brackets are function keys. + 3. Click on the Dismiss button to close the dialog box. + Playing Back Recorded Key Sequences + Before playing back a recorded key sequence, be sure your cursor is at the + right place on the application window. If your cursor was in a specific field + when you recorded a sequence of text and commands, you must be in the same + field for the playback sequence to work properly. To play back a recorded key + sequence: + 1. Pull down the Commands menu and choose Playback... to see which PF + keys have key sequences. The VXT 3270 displays the Playback dialog box. + 2. Click on the PF key that stores the keystrokes you want to play back. + Then click on OK. The letter P appears in the operator information area + while the VXT 3270 plays back the key sequence you have chosen. + +9.5.14 Using the Numeric Keypad to Enter Numbers + When you use a VXT 3270 window, the numeric keypad keys have default + functions assigned. If you want to use the keypad to enter numbers, pull down + the Options menu and select Numeric Keypad. This menu selection is a toggle + that lets you switch back and forth between entering numbers and functions. + The toggle indicator next to the Numeric Keypad selection is darkened when + the keypad’s numeric values are in effect. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 175 + Using VXT 3270 Windows +9.5 Using the VXT 3270 Window + +9.5.15 Saving Current Settings + To save your current settings, choose Save Current Settings from the Options + pull-down menu. + When you save the current settings, the terminal saves the settings in your + terminal’s resource file for future sessions. + +9.5.16 Viewing Settings + The following sections describe how to view + • Keyboard layout maps + • Function list + • Connection parameters + • Field attributes + +9.5.17 Viewing Keyboard Layout Maps + Supported Keyboards + The VXT 3270 supports key function definitions and keyboard layout maps for + the LK401 keyboard. By default, the VXT 3270 functions map to the LK401- + style keyboard, and the LK401 layout is the default keyboard map. This + section explains how to enable key function definitions and access keyboard + layout maps. + Interpreting Keyboard Layout Maps + The left half of the layout map lists function keys and their functions. + • A shaded key means you press the Ext key then the character key. The Ext + key is the period key on the numeric keypad. + • The caret (^) symbol in front of a key means you must press the Ctrl key + along with that key to access the associated function. + The top and right area of the layout map shows the functions assigned to + keypad keys. For shaded functions, press the Ext key first. + Viewing Your Keyboard Layout Map + To view the keyboard layout map for your LK401 keyboard, pull down the View + menu and choose Key Definitions. + + + + +176 Chapter 9 + Using VXT 3270 Windows + 9.5 Using the VXT 3270 Window + +9.5.18 Viewing the Function List + Many of the VXT 3270’s keys have default function definitions. Section 10.2 + provides detailed explanations of VXT 3270 functions and their default + mappings. You can redefine these functions so that they more closely match + your particular needs. To see how VXT 3270 functions are mapped, you can + check the VXT 3270 Function List. + To view the Function List, pull down the View menu and choose the Function + List menu item. The 3270 TE Function List dialog box appears. The Function + List dialog box displays how functions map to the keys on your keyboard. + If you change any key definitions during a session, those changes are + automatically reflected in the function list when you click on the Update + button. + The Dismiss button closes the dialog box. + +9.5.19 Viewing Your Connection Parameters + You can check current connection parameters at any time by pulling down the + View menu and choosing Connection Parameters. The Connection Parameters + dialog box appears, showing the parameters as they are currently set. Click on + Dismiss when you finish viewing the parameters. + +9.5.20 Viewing Field Attributes + Field attributes are characters that appear at the start of a field to indicate + how the field displays on the window: at normal intensity, at high intensity, or + invisibly. You can display field attributes three ways: + • Choose the Field Attributes menu item from the View menu. + • Choose the View Attributes menu item from the MB3 pop-up menu. + • Define a key to enable or disable the DspAtt function. + Table 9–3 describes the attribute characters. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 177 + Using VXT 3270 Windows +9.5 Using the VXT 3270 Window + + + Table 9–3 Field Attributes + Field Attribute Meaning + n Unprotected field with normal intensity + N Protected field with normal intensity + d Unprotected field, detectable with a light pen + D Protected field, detectable with a light pen + h Unprotected field with high intensity + H Protected field with high intensity + i Unprotected nondisplay field + I Protected nondisplay field + + + To remove the field attributes from your window, display the MB3 pop-up menu + again. The View Attributes selection has a toggle indicator next to it, showing + that field attributes are turned on. Choose View Attributes again to turn them + off. + +9.5.21 Using the MB3 Pop-Up Menu + The MB3 pop-up menu provides you with quick access to certain functions also + found on pull-down menus. Table 9–4 lists the MB3 pop-up menu items and + their corresponding location on the main menus: + + Table 9–4 Quick Access to Functions: MB3 Pop-Up Menu + MB3 Pop-Up Menu Main Menu + Key Definitions View menu + View Attributes View menu + Numeric Keypad Options menu + Print File menu + Record... Commands menu + Playback... Commands menu + Cancel Recording Commands menu + + + + +178 Chapter 9 + Using VXT 3270 Windows + 9.5 Using the VXT 3270 Window + +9.5.22 Exiting from a VXT 3270 Window + To exit the VXT 3270 window, pull down the File menu and choose Exit. You + can also press Ctrl Z to exit your session. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 179 + 10 + 10 + Customizing VXT 3270 Windows + + + This chapter describes how to customize VXT 3270 windows and use keyboard + functions. The chapter covers the following major topics: + • Customizing the VXT 3270 Window + • Using VXT 3270 Keyboard Functions + • Translation Table + +10.1 Customizing the VXT 3270 Window + The VXT 3270 window lets you define keys and customize certain display + features such as the font size and window title. You can also set the mouse to + perform certain light pen functions. This section describes the following topics: + • Customizing Key Definitions + • Saving and Loading Custom Key Definitions + • Modifying VXT 3270 Window Options + • Using the Selector Mouse Function + +10.1.1 Customizing Key Definitions + When you use a VXT 3270 window, certain keys perform specific IBM 3270 + functions. You can customize key definitions to suit your needs. This section + describes how to assign and delete custom key definitions. + + + + +180 Chapter 10 + Customizing VXT 3270 Windows + 10.1 Customizing the VXT 3270 Window + +Assigning Custom Key Definitions +To assign your own key definitions, pull down the Options menu and choose +the Define Key... menu item. The Define Key dialog box looks like this: + + + + + TI−03017−RAGS + +This figure shows an example of the Dup function being assigned to the Ctrl Y +key sequence. +To Assign a Key Definitions +1. In the Key Name list box, click on the key you want to define. To define Ctrl + key or extend+ key sequences, click on the Extend or Control option button + first. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 181 + Customizing VXT 3270 Windows +10.1 Customizing the VXT 3270 Window + + 2. The Function or Character box contains a list of functions (left) and + characters (right). Click on the name of the function or character that + you want to assign to the key you just selected. Click on Apply to assign + the function or character to the key. + 3. Repeat this procedure to create as many custom key definitions as you + want. + 4. Click on OK to dismiss the dialog box. + Your new key definitions remain in effect for the current session. to create a + permanent file of your key definitions, choose the Save Key Definitions... menu + item from the File menu. + Deleting Custom Key Definitions + To delete custom key definitions: + 1. Pull down the Options menu and choose Delete Key... to display the Delete + Key dialog box. + 2. Click on the key whose function you want to delete. Click on the Extend or + Control button if you are deleting a Ctrl key or extend+ key function. + 3. Click on Apply to delete the key definition. + 4. Repeat this procedure for each key function you want to delete. + 5. Click on OK to dismiss the dialog box. + +10.1.2 Saving and Loading Custom Key Definitions + You can save your customized key definitions for future sessions. The terminal + loads your saved key definitions when you start a new VXT 3270 window or + choose the Last Saved Key Definitions menu item from the File menu. You can + also return to the default key definitions at any time. + Saving Key Definitions + To save your customized key definitions: + From the VXT 3270 window, pull down the File menu and choose the Save + Key Definitions menu item. Your customized key definitions are saved in the + terminal’s resource file. + Loading Customized or Default Key Definitions + You can recall the last set of key definitions you saved whenever you need + them. You can also recall the system-default key definitions when needed. For + example, you may want to use the default key definitions for some tasks, then + switch to your customized definitions for other tasks. + + +182 Chapter 10 + Customizing VXT 3270 Windows + 10.1 Customizing the VXT 3270 Window + + To load customized or default key definitions: + 1. In the VXT 3270 dialog box, pull down the File menu and choose Load Key + Definitions. + 2. To use customized keys, choose Last Saved Key Definitions. + To use system-default keys, choose Default Key Definitions. + If the definitions cannot be loaded, the session continues with the previous + definitions still in use. + +10.1.3 Modifying VXT 3270 Window Options + The Window Options dialog box lets you change the font size used in + application windows. You can also change the window title and icon name + of the VXT 3270 dialog box. + To view the Window Options dialog box, pull down the Options menu and + choose the Window... menu item. The Window Options dialog box looks like + this: + + + + + TI−03018−RAGS + + If you are running in 3270 emulation mode, you can change any of the settings + listed in the dialog box. You cannot change the font height in 3279S3G or + 3192G emulation mode. + To change the font height or width: + Click on the button in the Font Height or Font Width box to display a pop-up + menu of choices. + To change the Window Title or Icon Name: + Click on the Window Title or Icon Name box and enter your text. + To apply your changes, click on Apply. + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 183 + Customizing VXT 3270 Windows +10.1 Customizing the VXT 3270 Window + + To apply your choices and dismiss the dialog box, click on OK. + +10.1.4 Using the Selector Mouse Function + The Selector Mouse function lets you use your mouse to perform selection and + attention operations provided by a selector light pen. When you use Selector + Mouse, the mouse pointer appears as a small hand with a pointing finger. + To use the Selector Mouse function, pull down the Options menu and choose + Selector Mouse. This menu selection is a toggle switch that lets you go back + and forth between Selector Mouse and normal mouse operation. A toggle + indicator appears next to the Selector Mouse selection when it is in use. + + Note + You cannot access the MB3 pop-up menu within the display area while + you are using the Selector Mouse function. To access the MB3 pop-up + menu, move the mouse pointer to the operator information area. + + + +10.2 Using VXT 3270 Keyboard Functions + This section describes available VXT 3270 keyboard functions and the + default keys that perform these functions. To customize key functions, see + Section 10.1. + The VXT Terminal Manager’s Customize Keyboard dialog box contains a + Keyboard Type scroll box. The Keyboard Type setting has no effect on the key + definitions used in the VXT 3270 window. + Table 10–1 lists default key functions on the standard LK401 ANSI keyboard. + + Table 10–1 VXT 3270 Window — Default Key Functions + Function Default Key or Key Combination + Attn F19 or Ext+ A + BckTab F12 or Ctrl H + Clear Ext+ F20 or Ext+ Enter + CrBlnk F17 + + + Ext = the period key on the numeric keypad. + KP = keypad. + + (continued on next page) + + + +184 Chapter 10 + Customizing VXT 3270 Windows + 10.2 Using VXT 3270 Keyboard Functions + + +Table 10–1 (Cont.) VXT 3270 Window — Default Key Functions +Function Default Key or Key Combination +Defkey Ctrl K +Delete Next Screen +DspAtt Ext+ F17 or Ctrl V +DUP Ext+ F12 or Ext+ * +DvCncl Ext+ Remove +Enter Do or Enter +ErEof F18 +ErInp Ext+ F18 or Ext+KP - +Exit F10 or Ctrl Z +Ext KP . +FM Ext+ F13 or Ext+ ; +Help Help or Ext+ H +Home F13 or Ext+ B +Horizontal Control  and  + + + + +Insert Ext+ PF4 +Logical NOT Ext+ N +Logical OR Ext+ O +Newlin Return or Ctrl M +NumOvr Remove or Ext+ J +PA1 PF4 +PA2 KP - +PA3 KP , +PF1 PF1 +PF2 PF2 +PF3 PF3 +PF4 KP 7 +PF5 KP 8 +PF6 KP 9 + +Ext = the period key on the numeric keypad. +KP = keypad. + + (continued on next page) + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 185 + Customizing VXT 3270 Windows +10.2 Using VXT 3270 Keyboard Functions + + + Table 10–1 (Cont.) VXT 3270 Window — Default Key Functions + Function Default Key or Key Combination + PF7 KP 4 + PF8 KP 5 + PF9 KP 6 + PF10 KP 1 + PF11 KP 2 + PF12 KP 3 + PF13 Ext+ PF1 + PF14 Ext+ PF2 + PF15 Ext+ PF3 + PF16 Ext+KP 7 + PF17 Ext+KP 8 + PF18 Ext+KP 9 + PF19 Ext+KP 4 + PF20 Ext+KP 5 + PF21 Ext+KP 6 + PF22 Ext+KP 1 + PF23 Ext+KP 2 + PF24 Ext+KP 3 + Play Insert Here + Print F11 or Ext+ P + Record Ext+ Insert Here + Reset KP 0 + RubOut + decterm [-ip],[-lat],[-dnet] + decterm [-serial] + mwm none + term_mgr [-msgbox] + msgbox none + font_mgr none + 3270 [-dnet] + + + <> indicates a required argument. + [ ] indicates an optional argument. Commas separate choices. + IP is the default transport for DECterm and X sessions. + DECnet is the default transport for the VXT 3270 application. + You cannot launch the configuration manager as a separate application. + + + + +234 Chapter 13 + Launching Applications + 13.2 Launching Sessions and VXT Applications with the Window Manager + +13.2.2 Defining Keys to Launch Sessions and Local VXT Applications + You can define keys to start local VXT applications or sessions. + 1. Click and hold MB1 anywhere on the screen’s workspace to display + the Workspace submenu. Choose the Options submenu, then choose + Resource configuration... to display the Workspace: Customize Resource + Configuration dialog box. + 2. In the Binding Sets box, click on the Keys DefaultKeyBindings binding set. + 3. Enter your new key definitions at the bottom of the list. + • Use the following syntax to define a key to launch a session: + key root | window f.exec "session transport host" + Examples + F18 root|window f.exec "decterm -lat market" + F19 root|window f.exec "x -ip market" + F20 root|window f.exec "decterm -serial" + • Use the following syntax to define a key to launch a local VXT + application: + key root | window f.exec "application" + Example + F17 root | window f.exec "term_mgr -msgbox" + Table 13–1 lists all possible session and application functions. + 4. Click on Apply. + 5. Click on OK. + 6. Restart the window manager. + a. Click and hold MB1 anywhere on the screen’s workspace to display the + Workspace submenu. + b. Click on Restart... in the Workspace menu. + The window manager updates your key definitions. + After you restart the window manager, you can use your new key definitions to + launch the sessions or local VXT applications you defined. + 1. Click and hold MB1 anywhere on the screen’s workspace to display the + Workspace submenu. + 2. Press the key you defined to launch your session or local VXT application. + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 235 + Launching Applications +13.3 Launching Remote Applications + +13.3 Launching Remote Applications + You can launch applications on your host system from the terminal. For + example, you may want to run your host’s clock or calendar program on your + terminal. + There are two basic steps in launching a remote application: + 1. Before you launch remote applications, you must run the VXT launcher in + a host session on the terminal (Section 13.3.1). + 2. Launch the remote application from the Terminal Manager window or the + window manager. This step is similar to launching sessions or local VXT + applications. + • If you use the Terminal Manager window, you can enter and launch + applications in the Create dialog box (Section 2.2.6). After you save + your settings and restart the window manager, your applications are + also listed on the Create menu and VXT Create pop-up menu. + • You can also use the terminal’s local window manager to define keys + or menu items on the Workspace submenu for launching remote + applications (Section 13.3.3). This feature is provided for users who + may want to run sessions or applications without running the Terminal + Manager window or a remote session manager. + Launching Remote Applications from Several Systems + You can launch remote applications from several systems and display those + applications concurrently on your terminal. However, you must define a unique + name for the launcher on each system. + One VXT Application Launcher Connection + TCP/IP, DECnet, or LAT Session + + 1. Connect to the host and start the application launcher. + + 2. Launch the host application. + + 3. The host displays the application on the terminal. + + LJ−03535−RAGS + + + + +236 Chapter 13 + Launching Applications + 13.3 Launching Remote Applications + + Two VXT Application Launcher Connections + Launcher 1 + Application 1 + Connect to host 1 and start launcher 1. + Launch application 1. + The host displays application 1. + + Connect to host 2 and start launcher 2. + Launch application 2. + The host displays application 2. + Launcher 2 + Application 2 + + + LJ−03536−RAGS + + + +13.3.1 Running the Application Launcher + VXT Version 2.1 and later software provides the application launcher. Check + with your system manager for the name and location of the application + launcher file on your host system. VXT Software Version 2.1 Installation and + System Management describes the installation and setup of the launcher. + The launcher establishes a display connection with the terminal. This allows + you to send launch commands from the terminal to the launcher, which relays + the commands to the host system. + The following sections describe methods to run the application launcher on + UNIX or OpenVMS systems. Section 13.3.2 describes the command syntax in + detail. + UNIX, ULTRIX, and DEC OSF/1 Systems + The default name of the application launcher file is vxtlaunch. The default file + location is in the /usr/local/bin path. + You can use the following commands to run the launcher. Make sure the + launcher is in your current path. + % setenv DISPLAY terminal’s_IP_address:0 + % vxtlaunch arguments & + Section 13.3.2 describes possible command arguments. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 237 + Launching Applications +13.3 Launching Remote Applications + + Example + The following commands starts the launcher with a process name of launch1, + to connect to a terminal with a TCP/IP address of 16.122.144.56: + % setenv DISPLAY 16.122.144.56:0 + % vxtlaunch -name launch1 & + If you do not specify a process name, the default is vxt. + OpenVMS Systems + The default name of the application launcher file is VXT$LAUNCH.EXE. The + default file location is VXT$LIBRARY. The following commands shows one + possible method for invoking the launcher: + $ SET DISPLAY/CREATE/NODE=terminal’s_DECnet_address + $ MCR VXT$LIBRARY:VXT$LAUNCH arguments + Section 13.3.2 describes possible command arguments. + Example + The following command starts the launcher with the name LAUNCH1 to connect + to a terminal with a DECnet address of 3456: + $ SET DISPLAY/CREATE/NODE=3456 + $ MCR VXT$LIBRARY:VXT$LAUNCH -NAME LAUNCH1 + If you do not specify a process name, the default is VXT. + +13.3.2 Launch Command Arguments + This section lists the arguments you can use with the command that runs + the application launcher. On UNIX systems, the command is vxtlaunch. On + OpenVMS systems, the system manager must define a foreign command name. + This section assumes the command is vxtlaunch. + vxtlaunch arguments + Standard vxtlaunch Arguments + The application launcher supports the following arguments: + + Argument Description + -help Provides help information on arguments. + + + + +238 Chapter 13 + Launching Applications + 13.3 Launching Remote Applications + +Argument Description + +-display name Enter the name of the display to connect to. + IP Enter terminal’s_IP_address:0. + DECnet Enter terminal’s_DECnet_address::0 +-name name Specifies a name to use for the launcher on this host system. + If you launch applications from multiple systems for display + on the same terminal, you must specify a unique name for the + launcher on each system. You use this name when entering + launch commands for applications. The default name is VXT. +-kill Stops a VXT launcher process on the host system. You must + specify the -name argument if the launcher has a name other + than the default (VXT). + +Examples +Here are some vxtlaunch command examples using the supported arguments: + +Argument Example Description +vxtlaunch Starts a launch process with the default name VXT. +vxtlaunch -name LCH1 Starts a launch process with the name LCH1. +vxtlaunch -kill Stops a launch process with the default name VXT. +vxtlaunch -kill -name LCH1 Stops a launch process with the name LCH1. + +Other vxtlaunch Arguments +The following vxtlaunch arguments may present security implications on your +system: + +Argument Description +-retry interval:number If the launcher fails to make an X connection with the + terminal, this argument specifies how often (interval) + and how many times (number) the launcher should + retry to make a connection. The default interval is 1 + second. The default duration is forever. +-reconnect If the launcher receives a fatal error after a + successful X connection, this argument tells the + launcher to try to reestablish the connection. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 239 + Launching Applications +13.3 Launching Remote Applications + + Examples + Here are some vxtlaunch command examples using the -retry and + -reconnect arguments: + + Argument Example Description + vxtlaunch -retry -reconnect Retry to make a connection every 1 second, forever. + If an existing connection fails, try to reconnect. + vxtlaunch -retry 3 Retry to make a connection every 3 seconds, forever. + vxtlaunch -retry :3 Retry to make a connection every 1 second, for 3 + times. + vxtlaunch -retry 3:3 Retry to make a connection every 3 seconds, for 3 + times. + + +13.3.3 Defining Menu Items or Keys to Launch Remote Applications + You can define keys or menu items on the Workspace submenu to launch + remote applications. + To define a menu item to launch a remote application: + Follow the same steps used to define menu items for local applications or + sessions (Section 13.2.1), but use the following command syntax: + "menu item" root | window f.exec "rexec launcher command" + The launcher is the name of the application launcher. Default name: VXT. + The command is the host system command to launch the desired application. + Examples + The following examples show typical commands to start a clock on a UNIX + system or OpenVMS system. + UNIX system: + "xclock" root|window f.exec "rexec launch1 /usr/bin/X11/xclock" + OpenVMS system: + "Clock" root|window f.exec "rexec vxt run @sys$system:decw$clock" + To define a key to launch a remote application: + Follow the same steps used to define keys for local applications or sessions + (Section 13.2.2), but use the following command syntax: + "key" f.exec "rexec launcher command" + + + +240 Chapter 13 + Launching Applications + 13.3 Launching Remote Applications + + The key is the key you want to define. + The launcher is the name of the application launcher. Default name: VXT. + The command is the host system command to launch the desired application. + Examples + The following examples show typical commands to start a clock on a UNIX + system or OpenVMS system. + UNIX system: + "F17" f.exec "rexec launch1 /usr/bin/X11/xclock" + OpenVMS system: + "F17" f.exec "rexec vxt run @sys$system:decw$clock" + +13.4 Launching Sessions and VXT Applications Using rsh + On UNIX systems, you can use the rsh (r shell) application to launch sessions + and local VXT applications over the IP transport. The rsh commands contain + the host name, user name, and the command to launch the application. + The terminal checks the host name and user name for authorization in the + terminal’s Customize Security list. + rsh vxt_name application -ip node + vxt_name is the terminal’s IP host name, as listed in the host system’s + /etc/hosts file. You cannot use IP addresses with rsh. + application is the session or local VXT application to start. + node is the host system you are connected to. + Example + The following example starts a VXT DECterm window on the terminal myvxt + from the host system market. + csh>rsh myvxt decterm -ip market + + TCP/IP Session + + 1. Connect to the host. + 2. Use an r shell command to start a VXT application. + + 3. The host passes the command to the terminal’s + window manager, which displays the application. + + LJ−03537−RAGS + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 241 + 14 + 14 + Using VXT EX Software + + + This chapter describes how to load and use VXT EX software with the + terminal. The chapter covers the following major topics: + • VXT EX Software + • Loading VXT EX Software + • Creating a Session + • VXT EX Options Dialog Box + +14.1 VXT EX Software + VXT EX (essential X server) software is a minimal version of VXT software, + without any local applications such as the Terminal Manager window, VXT + DECterm and VXT 3270 windows, and the Motif window manager. VXT EX + software lets you create X sessions with minimal memory installed in the + terminal. The system you connect to must provide all window management + and terminal emulation features. + VXT EX software provides a single dialog box for creating an X session. You + can create an X session to systems that support the TCP/IP or LAT transports. + VXT EX software + • Requires only the minimum 4 megabytes of installed memory + • Requires host-based clients for window management and terminal + emulation + • Does not support printing to locally attached printers + • Requires a mouse or pointing device + + + + +242 Chapter 14 + Using VXT EX Software + 14.2 Loading VXT EX Software + +14.2 Loading VXT EX Software + When you turn or reboot the terminal, it normally loads full-function VXT + software. There are two ways to load VXT EX software instead of VXT + software: + • Specify VXT EX software in the Customize Boot dialog box and reboot the + terminal. To specify host-based operation, see Section 5.7.2. To specify + server-based operation, see Section 5.7.3. + • Enter a BOOT command that specifies VXT EX software (Section 5.7.5). + +14.3 Creating a Session + When you reboot the terminal with VXT EX software, the terminal displays + the VXT EX connection dialog box. You use the dialog box to create an X + session to a host system. You can create multiple X sessions. + + VXT EX V2.0 + + + + + LJ−03007−RAGS + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 243 + Using VXT EX Software +14.3 Creating a Session + + The Video Alignment button is for VXT 2000 model VX227 windowing + terminals only. This button provides centering and rotation controls to align + the screen display if necessary. See Section 3.11. + To connect to a host system: + 1. Choose your display language. The default is English. + 2. Choose the communication transport to use for the X session—LAT or IP. + 3. For LAT: Enter your LAT Service Name. By default, the host system you + connect to supplies your fonts. + For IP: Enter your Host IP Address, TFTP Font Path, and IP Name + Server. + Your terminal’s IP address and name server must be defined on a host + system by your system manager. See Section 4.5. + 4. Click on the Save button if you want to save your host settings. + If you save your host settings, the terminal automatically tries to establish + a connection to that host whenever you turn on or reboot the terminal. The + terminal does not display the VXT EX dialog box. + If you do not save your settings, the terminal uses these settings for the + current session only. The next time you turn on or reboot the terminal, it + will display the VXT EX dialog box again. + 5. Click on the Connect button. If a connection is made, the terminal displays + your host system’s login prompt. + If a connection is not made, the terminal redisplays the VXT EX dialog box. + 6. Log in to your host system. + To redisplay the VXT EX dialog box: + Press the F3 key. + You can change your settings or create a second X session. + To switch from VXT EX to VXT software: + If you are using host-based operation, you must halt the terminal and enter a + BOOT command that specifies VXT software. See Section 5.7.5. + If you are using server-based operation, you can choose VXT software from the + VXT EX options box (Section 14.4). + + + + +244 Chapter 14 + Using VXT EX Software + 14.4 VXT EX Options Dialog Box + +14.4 VXT EX Options Dialog Box + You can specify VXT EX option settings by choosing the Options... button in + the VXT EX dialog box. When you click on Options, the terminal displays the + VXT EX options dialog box: + + + VXT EX V2.0 + + + + + LJ−03025−RAGS + + From the VXT EX options dialog box, you can change the following settings: + Setup Key + Normally, you use the F3 key to display the VXT EX dialog box. You can choose + to use the Ctrl Alt F3 key sequence instead. + Allow All Connections + Normally, other systems and users cannot connect to your terminal when you + are using VXT EX software. If you click on the Allow All Connections button, + any system on the Ethernet can establish an X connection to your terminal. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 245 + Using VXT EX Software +14.4 VXT EX Options Dialog Box + + Secondary Boot VXT Software + If your terminal operates in server-based mode, you can use this button to + switch from VXT EX software to full-function VXT software. The VXT software + image must be available on an InfoServer system in your network. Your new + setting takes effect the next time you turn on or reboot the terminal. You can + reboot the terminal by pressing the Ctrl +left Alt +keypad . sequence. + Host-based terminals and server-based terminals operating in host-based mode + cannot use this option. However, you can switch to VXT software by entering a + boot command (Section 5.7.5). + To close the Options dialog box: + Click on the Cancel button. + + + + +246 Chapter 14 + 15 + 15 + Using Your Keyboard + + + You can use one of the following keyboards with your terminal: + • ANSI Keyboard + • Short ANSI Keyboard + • The PC Keyboard + • The Sun Style Keyboard + This chapter describes the basic functions of the keys and indicators on each + keyboard. The chapter also describes how to use the keyboard instead of the + mouse to navigate through windows and to choose items from menus and + dialog boxes. Finally, the chapter describes how to type additional characters + not shown on the keyboard keys. + + VXT 3270 Keyboard Functions + For keyboard functions in VXT 3270 windows, see Chapter 9. + + + +15.1 ANSI Keyboard + The ANSI keyboard comes in many versions for use with different languages + and dialects. The only physical difference between these keyboards are the + legends on the keys. + +15.1.1 Keyboard Dialect + The terminal is initially set to work with the North American/United Kingdom + keyboard. If you have a keyboard for a different language or you want to + use the British dialect, you must change the Keyboard Type setting in the + Customize Keyboard dialog box (Section 3.3). + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 247 + Using Your Keyboard +15.1 ANSI Keyboard + +15.1.2 Layout + The keyboard has four groups of keys and two visual indicators. The keys are + grouped by function. + Main keypad + Editing keypad + Numeric keypad + Top-row function keys + The keyboard also has two audible indicators, a keyclick and bell. + The following figure shows the North American/United Kingdom keyboard: + + + Top-Row Function Keys + + Visual Indicators + + di gi tal + + + F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 Help Do F17 F18 F19 F20 + + + + + Hold Print Break F6 F7 F8 F9 F10 (ESC) (BS) (LF) F14 F17 F18 F19 F20 + + + _ + ~ ! a # $ % ^ & * ( ) + X Insert Re- PF1 PF2 PF3 PF4 + + 1 2 3 4 5 6 7 8 9 0 - = + Find + Here move + + Tab Return + 7 8 9 _ + Q W E R T Y U I O P } } Select Prev Next + ] ] + + : 4 5 , + Ctrl + A S D F G H J K L " 6 + ; ’ \ + Shift + > Z X C V B N M < > ? Shift + 1 2 3 Enter + + < , . / + Compose Alt Alt Compose + 0 . + Character Function Function Character + + + + + Main Keypad Editing Numeric + Keypad Keypad + + GSF_1436_89.DG + + +15.1.3 Main Keypad + The main keypad is similar to a typewriter keyboard with alphanumeric + characters, punctuation marks, and Shift keys. The main keypad also has a + number of keys not found on a standard typewriter, such as the Ctrl modifier + key and the Compose Character and Alt prefix keys. The German keyboard has + a Group Shift key and Alternate Shift key instead of Compose Character keys. + Modifier keys are pressed in combination with another key, to modify the + code sent by that key. Prefix keys are pressed and released before pressing + another key, to change the function of one or more keystrokes. + + + + +248 Chapter 15 + Using Your Keyboard + 15.1 ANSI Keyboard + +Special-Function Keys +The main keypad has the following special-function keys: + + +Tab In VXT DECterm windows, pressing Tab sends a horizontal tab, + which normally moves the cursor to the next tab stop. Applications + can change tab stops. In the Terminal Manager window screens + and in some DECwindows menus, Tab moves the cursor to the next + text-entry box. +Ctrl Holding down Ctrl and pressing another key sends a control code to + the host. + For example, Ctrl Z means to hold down Ctrl and press the Z key. +Shift There are left and right Shift keys. Holding down Shift and pressing + a standard key sends the shifted (top) character on the key. + Holding down Shift and pressing a special-function key starts a + predefined control function. For example, Shift F2 (Print) means to + hold down Shift while pressing the F2 (Print) key. + Pressing the lock key down puts the keyboard in caps lock mode or + shift lock mode. You can set the mode from the Customize Keyboard + dialog box (Section 3.3). The default setting is Caps Lock. + • In caps lock mode, the alphabetic keys send their uppercase or + shifted character when pressed alone. You can use a Shift key + to send the shifted character on other keys. You turn caps lock + mode on and off by pressing and releasing the lock key. + • In shift lock mode, all keys on the main keypad send their + shifted character. You can turn shift lock mode on or off by + pressing the Lock key. + When the lock key is down, the lock indicator on the keyboard turns + on. +Return Pressing Return sends either a carriage return or a carriage return + and a line feed (newline). You can choose the function of the + Return key from the VXT DECterm General Options dialog box + (Section 8.5). +< x Backarrow Pressing the < x key normally sends a delete (DEL) character. +key Many applications use DEL to erase one character to the left of the + cursor. + You can make the < x key send a backspace (BS) character instead + of DEL. You can select the function of the ~ + ] ] \ < + 7 8 9 - Select Prev Next + + Control + A S D F G H J K L : " + Return + + ; ’ + 4 5 6 7 ,, Enter + + Shift + Z X C V B N M < > ? Shift + + , . / + 1 2 3 .. Lock + + Extend Com- Alt Alt Compose + 4 pose Function Function Character + + + 0 + + + 1 + LJ-01101-TI0 + + + Main keypad Top-row function keys +  + + + + + Arrow keys Extend key +  + + + + +15.2.1 Main Keypad + The layout of the main keypad is similar to the ANSI keyboard, but includes + an Extend key. The Extend key lets you enter the same keystrokes as the + keypad and function keys found on the longer ANSI keyboard. + +15.2.2 Using Extend Key Sequences for Keypad and Function Keys + You can use two-stroke Extend key sequences to perform the same functions as + the following keys that are on the longer ANSI keyboard: + • F11 to F20 + + • Editing keypad + • Numeric keypad + These functions are printed on the front of certain keys on the short ANSI + keyboard. For example, the P key also serves as the Select editing key. To + access this second function, you press the Extend key first. The following table + lists all the two-stroke Extend key sequences: + + + + +256 Chapter 15 + Using Your Keyboard + 15.2 Short ANSI Keyboard + +To Select ... Press ... To Select ... Press ... +Top-Row Function Keys +F11 to Extend F1 to +F20 Extend F10 + + +Editing Keypad Keys +Find Extend 0 Select Extend P +Insert Extend - Prev Extend { +Remove Extend = Next Extend } + + +Numeric Keypad Keys +PF1 Extend 6 4 Extend H +PF2 Extend 7 5 Extend J +PF3 Extend 8 6 Extend K +PF4 Extend 9 , Extend L +7 Extend Y 1 Extend N +8 Extend U 2 Extend M +9 Extend I 3 Extend , + - Extend O . Extend . + 0 Extend space + bar + +Special-Function Keys +The main keypad has the same special-function keys as the ANSI keyboard. +The only difference from the ANSI keyboard is the Extend key. +Extend front Pressing a two-stroke Extend sequence lets you perform the same + functions as the following keys on the longer ANSI keyboard: F11 to + F20 , editing keypad, and numeric keypad. Functions are printed on + the front of short ANSI keys. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 257 + Using Your Keyboard +15.2 Short ANSI Keyboard + + Extend Pressing the Extend and right Shift keys puts the keyboard in caps + right Shift lock mode or shift lock mode. You can select the mode from the + Customize Keyboard dialog box (Section 3.3). The default setting is + Caps Lock. + • In caps lock mode, the alphabetic keys send their uppercase or + shifted character when pressed alone. You can use a Shift key to + send the shifted character on other keys. You turn Caps Lock + mode on and off by pressing the Extend and right Shift keys. + • In shift lock mode, all keys on the main keypad send their + shifted character. You can turn shift lock mode on by pressing + the Extend and right Shift keys. You can turn it off by pressing + either the Extend and right Shift keys or the Shift key. + + The ` ~ key and < > key work the same way as on the ANSI keyboard, but the + keycap legends are slightly different. + ~ ESC Pressing this key normally sends the ` or ~ character. + You can also use this key to send the escape (ESC) control character, + LJ-01471-TI0 + + + + + by choosing the Tilde Key Sends ESC button in the VXT DECterm + Keyboard Options dialog box (Section 8.6). + >~ If you use the ` ~ key to send the ESC character, you may want to + LJ-01473-TI0 + < + use the <> key to send the ` and ~ characters. To do this, choose the + Angle Bracket Key Sends ‘~ in the VXT DECterm Keyboard Options + dialog box (Section 8.6). + +15.2.3 Arrow Keys + The four arrow keys work the same as on the ANSI keyboard. + If you press Ctrl Shift F3 , you can use the editing keypad to perform some + mouse functions. In this mode, the arrow keys move the mouse pointer. The + Select , Prev , and Next keys correspond to the three mouse buttons. The mouse + continues to operate. There is no indication the mode is on, but the arrow keys + will not work for normal editing functions. + To turn this mode off, press Ctrl Shift F3 again. + +15.2.4 Top-Row Function Keys + Predefined Keys + The first five top-row keys, F1 to F5 , have the same predefined functions as on + the ANSI keyboard. + + + + +258 Chapter 15 + Using Your Keyboard + 15.2 Short ANSI Keyboard + + User-Defined Keys and Application-Specific Keys + As on the ANSI keyboard, the function of the remaining top-row keys, F6 to + F10 and Extend F1 to Extend F10 , often depends on your application software. + Refer to your application software manuals for a description of key functions. + You can also define the function of these keys yourself. + F6 to F10 When pressed, these keys send predefined programming + and sequences to the host system. Applications that recognize + Extend F1 to these sequences can use the keys to perform various + Extend F10 functions. + In VT100 and VT52 modes + Keys Extend F1 , Extend F2 , and Extend F3 send control + characters ESC, BS, and LF respectively. Keys F6 to F10 and + Extend F4 to Extend F10 do not function. + + + Note + You can use the ` ~ key to send + the ESC character. See the VXT + DECterm Keyboard Options dialog + box in Section 8.6. + + + Shift F6 User-defined keys (UDKs) + to Pressing Shift and one of these key sequences sends the + Shift F10 user-defined function for that key. You can define keys F6 to + and Extend F10 by using programming sequences. You can use + Shift Extend F1 any sequence of characters in your definitions. Definitions are + to loaded from the host system. + Shift Extend F10 + + # £ Key + This key works the same way as on the ANSI keyboard. + To use the £ symbol, you select the British Keyboard setting in the Customize + Keyboard dialog box (Section 3.3). To use the # symbol, you select the North + American Keyboard setting. +15.2.5 Compose Characters + The Compose keys work the same as the Compose Character keys on the ANSI + keyboard. + You can type compose sequences to display many more characters than those + shown on the keycaps. For example, you can display accented letters. See + Section 15.6. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 259 + Using Your Keyboard +15.2 Short ANSI Keyboard + +15.2.6 Indicator Lights + The short ANSI keyboard does not have indicator lights. + +15.2.7 Audible Indicators + The short ANSI keyboard has the same two audible indicators as the ANSI + keyboard, a keyclick and a bell. You can use the bell as a margin bell, warning + bell, or both. You can turn off the keyclick and bell, or adjust their volume. + See the Customize Keyboard dialog box (Section 3.3). + +15.3 The PC Keyboard + You can use Digital’s LK443 or LK444 PC keyboards with a VXT 2000 + windowing terminal. The terminal does not support other PC keyboards. + You can operate the PC keyboard as a PC keyboard or as an ANSI keyboard + (Section 15.1). This chapter describes using the PC keyboard keys in both + modes. + +15.3.1 PC Keyboard Models—Setting the Keyboard Type + There are two PC keyboards, a worldwide model (LK443) and a North + American model (LK444). This section shows the North American model. + • The North American model has 101 keys. + • The worldwide model has 102 keys. The worldwide model comes in the + following versions, for use in different countries. + Belgium Germany Portugal Switzerland + Denmark Italy Spain United Kingdom + France Norway Sweden + When you start up the terminal with a PC keyboard connected, the terminal + uses the North American PC keymap by default. To choose the keymap for + one of the worldwide models, change the Customize Keyboard Type to the + appropriate country (Section 3.3). + +15.3.2 Using the ANSI Keyboard Layout + To switch from a PC keymap to an ANSI keymap, select one of the LK401 + keyboard types (Section 3.3). When you switch to an ANSI keymap, the + keyboard keys work like the keys on that ANSI keyboard. For example, + if you have the LK443 North American PC keyboard, you might switch to + the NORTH_AMERICAN_LK401AA keymap. To switch back to the North + American PC keymap, you would choose the PC_US_LK443AA keymap. + + + + +260 Chapter 15 + Using Your Keyboard + 15.3 The PC Keyboard + + The PC keyboard does not have the following keys, which appear on the ANSI + keyboard: F16 Do, F17 , F18 , F19 , F20 , and the - hyphen key on the numeric + keypad. Applications that use these keys may not work properly with the PC + keyboard, unless the applications provide alternate keystrokes. + +15.3.3 Layout + The PC keyboard has four groups of keys and three indicator lights. The keys + are grouped by function. The PC keyboard also has two audible indicators, a + keyclick and bell. + + 5 4 6 + + di gi tal North American + Print Scroll Pause + Esc F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 + Screen Lock + + SetUp Break + Num Lock Caps Lock Scroll Lock + + + + + _ _ + ~ ! a # $ % ^ & * ( ) + Insert Home Page Num / * + 1 2 3 4 5 6 7 8 9 0 - = + BackSpace + Up Lock + + + + + } } | Delete End Page 7 8 9 + Q W E R T Y U I O P ] ] Down + Tab \ Home PgUp + + + + Caps : " Enter 4 5 6 + Lock A S D F G H J K L ; ’ + + + Z X C V B N M < > ? 1 2 3 + Shift + , . / + Shift + End PgDn + Enter + + 0 . + Ctrl Alt Altl Ctrl + Ins Del + + + + + GSF-MK2510-29-DG + + 1 2 3 + + LJ-00226-TI0 + + + + + Main keypad  Top-row function keys + Editing keypad Escape key +  + + + + +  + Numeric keypad Indicator lights +  + + + + +15.3.4 Main Keypad + The layout of the main keypad is similar to a typewriter keyboard, with + alphanumeric characters, punctuation marks, and Shift keys. The main keypad + also has a number of keys not found on a typewriter, such as the Ctrl and Alt + modifier keys. + Modifier keys are pressed in combination with another key, to modify the + code sent by that key. Prefix keys are pressed and released before pressing + another key, to change the function of one or more keystrokes. + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 261 + Using Your Keyboard +15.3 The PC Keyboard + + Special-Function Keys + The main keypad and top row have the following special-function keys: + Tab Pressing Tab moves the cursor to the next tab stop. + Ctrl Holding down Ctrl and pressing another key sends a control code to + the host. + For example, Ctrl Z means to hold down Ctrl and press the Z key. + Caps Lock Pressing the Caps Lock key puts the keyboard in caps lock mode + or shift lock mode. You can select the mode from the Customize + Keyboard dialog box (Section 3.3). The default setting is Caps Lock + mode. + • In Caps Lock mode, the alphabetic keys send their uppercase or + shifted character when pressed alone. You can use a Shift key to + send the shifted characters on other keys. You turn Caps Lock + mode on and off by pressing the Caps Lock key. + • In Shift Lock mode, all keys on the main keypad send their + shifted character. You can turn Shift Lock mode on by pressing + the Caps Lock key. You can turn it off by pressing either the + Caps Lock key or the Shift key. + + Shift Holding down a Shift key and pressing a standard key generates the + uppercase character on the key. + Enter Pressing Enter sends a carriage return to the host, which usually + puts the cursor either at the beginning of the next line or at the + beginning of the same line. + Pressing Enter normally moves the cursor to the beginning of the + next line. +  + Backspace Pressing  + Backspace deletes one character to the left of the + cursor. + Space bar Pressing the space bar adds a space character. You use spaces to + separate words or move the cursor forward. + Alt Alt is used to generate characters or alternate functions that do not + appear as standard keys on your PC keyboard. You can use Alt with + another key to generate additional codes, or with the function keys + to generate a third-level function for the key. See Section 15.1.8. + When you select the North American keyboard type, both Alt keys + work the same. + AltGr You use AltGr with Janus-faced or front-faced keys to generate the + (right) third character on a keycap. The North American PC keyboard does + not have an AltGr key. + + + + +262 Chapter 15 + Using Your Keyboard + 15.3 The PC Keyboard + +15.3.5 Janus-Faced and Front-Faced Character Keys + All PC keyboards, except the North American and United Kingdom, have + keycaps with more than two characters. In most cases, the third character + is on the top of the keycap, to the right of the first character. These keys are + called Janus-faced character keys. In other cases the extra characters are on + the front of the keycap. These keys are called front-faced character keys. + To display the third character on a Janus-faced or front-faced key: + • Press AltGr and the selected key. + +15.3.6 Editing Keypad + The editing keypad has four arrow keys and six editing keys. + Pressing an arrow key normally moves the cursor in the direction of the arrow. + For example, pressing the key moves the cursor down one line. + You can use the editing keys in several ways: + • For panning up or down a page, or for changing the size of a window on + the screen. + • For special functions defined by the application software. + +15.3.7 Numeric Keypad + You can use the numeric keypad to enter numbers and arithmetic operators. + If you use an MS–DOS emulator, you can also use the numeric keypad as a + cursor keypad. You press the Num Lock key to change from a numeric to a + cursor keypad and back. In cursor keypad mode, the arrow keys and the Home + key work exactly like the arrow keys on the editing keypad. + +15.3.8 Top-Row Function Keys + The top-row keys perform the following functions: + F1 to F5 These keys perform the same functions as on the ANSI keyboard + (Predefined Keys). + F6 to F12 Your application software defines the functions of these keys. See + your application manual for details. + Esc Pressing Esc begins a control sequence. + The function of the Print Screen , Scroll Lock , and Pause keys depends on your + operating system environment and the keyboard type selected in the Customize + Keyboard dialog box. In an MS–DOS environment (MS–DOS emulation): + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 263 + Using Your Keyboard +15.3 The PC Keyboard + + Print Screen Prints the screen. + Scroll Lock Stops the screen from scrolling. + Pause Stops or cancels a command. + In a non MS–DOS environment, the function of Print Screen , Scroll Lock , and + Pause is application-specific. + + When you change the keyboard type to an LK401 ANSI keymap: + • F13 becomes the Print Screen key. + + • F14 becomes the Scroll Lock key. + + • Help (F15) becomes the the Pause key. + +15.3.9 Audible Indicators + The PC keyboard has two audible indicators, a keyclick and a bell. You can use + a margin bell, warning bell, or both. See Section 3.3. + +15.3.10 Keyclick + You hear the keyclick sound each time you press a key that sends a code or + causes the terminal to take some immediate action. If a key is autorepeating, + the keyclick will repeat once for each character or key sequence sent. Keys do + not click under the following conditions: + • You press Shift , Ctrl , or Alt . These keys never click except when Shift is + leaving the shift-lock state. + • You disable the Keyclick Volume in the Customize Keyboard dialog box + (Section 3.3). + • You press a key or key combination that does not have a function under the + current operating conditions. + +15.3.11 Bell + The bell tone is a beeping sound. You can use the bell as a margin bell, + warning bell, or both. + Margin Bell + This bell sounds when the cursor is eight characters from the right margin. + + + + +264 Chapter 15 + Using Your Keyboard + 15.3 The PC Keyboard + + Warning Bell + This bell sounds for any of the following conditions: + • During the power-up self-test + • When the terminal receives a bell (BEL) character from the host system + • After a compose character error + +15.3.12 Redefining Keys + You can use the X application xmodmap to modify key definitions. + Section 15.3.13 lists the default key definitions. Each key on the keyboard + sends a unique keycode to the terminal, and each keycode is assigned a key + symbol. The applications that you use perform actions based on key symbols. + To change a key’s function, you redefine the key by changing the key symbol. + For example, if you wanted to redefine the Insert key to work like the Find key, + you would look up the keycode for the Insert key in the Section 15.3.13. Then + you would assign the key symbol Find to that keycode by using the xmodmap + program. + For UNIX, ULTRIX, and DEC OSF/1 AXP systems + Here is the command format for redefining a key: + % xmodmap -e "keycode 0x keycode = key_symbol" + Examples + • To define the Insert key to work like the Find key: + % xmodmap -e "keycode 0x8A = Find" + • To make the Insert key work normally again: + % xmodmap -e "keycode 0x8A = Insert" + For OpenVMS systems + + Note + The xmodmap program is available for systems using a DECwindows + Motif version later than Version 1.1. + + + First, define a logical name (like xmodmap) pointing to the xmodmap + executable image on your system. For example: + $ xmodmap:==$DECW$UTILS:XMODMAP.EXE + + + + VXT 2000+/VXT 2000 Windowing Terminal User Information 265 + Using Your Keyboard +15.3 The PC Keyboard + + Here is the command format for redefining a key: + $ xmodmap -e "keycode 0xkeycode = key_symbol" + Examples + • To define the Insert key to work like the Find key: + $ xmodmap -e "keycode 0x8A = Find" + • To make the Insert key work normally again: + $ xmodmap -e "keycode 0x8A = Insert" + +15.3.13 PC Keyboard Keycodes and Symbol Assignments + Table 15–1 lists the key labels, keycodes, and key symbols for each key on the + North American PC keyboard. + + Table 15–1 PC Keyboard Keycodes and Symbol Assignments + Key Key Key Shifted Key + Label Code Symbol Symbol + Main Keypad Keys + Shift AB Shift_R + Alt AC Alt_L + Ctrl AD Control_R + Shift AE Shift_L + Ctrl AF Control_L + Caps Lock B0 Caps_Lock + Alt Gr B2 Alt_R +  + Backspace BC Delete + Enter BD Return + Tab BE Tab + ‘~ BF quoteleft asciitilde + 1! C0 1 exclam + Q C1 Q + A C2 A + Z C3 Z + 2@ C5 2 at + W C6 W + S C7 S + X C8 X + 3# CB 3 numbersign + (continued on next page) + + + + +266 Chapter 15 + Using Your Keyboard + 15.3 The PC Keyboard + + +Table 15–1 (Cont.) PC Keyboard Keycodes and Symbol Assignments +Key Key Key Shifted Key +Label Code Symbol Symbol +Main Keypad Keys +E CC E +D CD D +C CE C +4$ D0 4 dollar +R D1 R +F D2 F +V D3 V +Spacebar D4 Space +5% D6 5 percent +T D7 T +G D8 G +B D9 B +6^ DB 6 asciicircum +Y DC Y +H DD H +N DE N +7& E0 7 ampersand +U E1 U +J E2 J +M E3 M +8* E5 8 asterisk +K E7 K +,< E8 comma less +9( EA 9 parenleft +O EB O +L EC L +. > ED period greater +0) EF 0 parenright +P F0 P +;: F2 semicolon colon +/? F3 slash question +=+ F5 equal plus +]} F6 bracketright braceright +\ | F7 backslash bar + (continued on next page) + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 267 + Using Your Keyboard +15.3 The PC Keyboard + + + Table 15–1 (Cont.) PC Keyboard Keycodes and Symbol Assignments + Key Key Key Shifted Key + Label Code Symbol Symbol + Main Keypad Keys + -_ F9 minus underscore + [{ FA bracketleft braceleft + ’" FB quoteright quotedbl + + + Editing and Arrow Keypad Keys + Insert 8A Insert + Home 8B Home + Page Up 8C Prior + Delete 8D Delete + End 8E End + Page Down 8F Next +  + A7 Left +  + A8 Right +  + A9 Down + AA Up + + + Top-Row Function Keys + Esc 55 Escape + F1 56 F1 + F2 57 F2 + F3 58 F3 + F4 59 F4 + F5 5A F5 + F6 64 F6 + F7 65 F7 + F8 66 F8 + F9 67 F9 + F10 68 F10 + F11 71 F11 + F12 72 F12 + Print Screen 73 Print + Scroll Lock 74 Scroll_Lock + Pause 7C Pause + + (continued on next page) + + + + +268 Chapter 15 + Using Your Keyboard + 15.3 The PC Keyboard + + +Table 15–1 (Cont.) PC Keyboard Keycodes and Symbol Assignments +Key Key Key Shifted Key +Label Code Symbol Symbol +Numeric Keypad Keys +0 92 KP_0 +. 94 KP_Decimal +Enter 95 KP_Enter +1 96 KP_1 +2 97 KP_2 +3 98 KP_3 +4 99 KP_4 +5 9A KP_5 +6 9B KP_6 ++ 9C KP_Add +7 9D KP_7 +8 9E KP_8 +9 9F KP_9 +Num Lock A1 Num_Lock +/ A2 KP_Divide +* A3 KP_Multiply +- A4 KP_Subtract + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 269 + Using Your Keyboard +15.4 The Sun Style Keyboard + +15.4 The Sun Style Keyboard + This section describes the Sun style keyboard (LK460) for the VXT 2000 + windowing terminal. The Sun style keyboard comes in a North American + model (101 keys) only. + When you start up the terminal with a Sun style keyboard connected, the + terminal automatically chooses the Sun style keyboard map. To choose + the keymap for another keyboard model, change the Keyboard Type in the + Customize Keyboard dialog box (Section 3.3). + +15.4.1 Layout + The Sun style keyboard has four groups of keys and four indicator lights. The + keys are grouped by function. The Sun style keyboard also has two audible + indicators, a keyclick and bell. + + + + + 4 6 + F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 | Delete Caps Scroll Num + \ Lock Compose Lock Lock + + + 5 Scroll +Stop Again Pause PrSc Num + Lock Lock + Break +Props Undo Esc ! @ # $ % ^ & * ( ) _ = Back Space + = / * - + 1 2 3 4 5 6 7 8 9 0 - + + +Front Copy Tab Q W E R T Y U I O P { } Return 7 8 9 + [ ] Home Pg Up + + +Open Paste Control A B D F G H J K L : " ~ 4 5 6 + ; ’ ‘ + +Find Cut Shift Z X C V B N M < > ? Shift Line 1 2 3 Enter + , . / Feed End Pg Dn + +Help Caps Alt Com Alt 0 . + Lock pose Graph Ins Del + + + 2 1 3 + LJ-03682-TI0 + + Main keypad  Top-row function keys + Editing keypad Escape key +  + + + + +  + Numeric keypad Indicator lights +  + + + + +270 Chapter 15 + Using Your Keyboard + 15.4 The Sun Style Keyboard + + +15.4.2 Main Keypad + The layout of the main keypad is similar to a typewriter keyboard, with + alphanumeric characters, punctuation marks, and Shift keys. The main keypad + also has a number of keys not found on a typewriter, such as the Control and + Alt modifier keys. + + Modifier keys are pressed in combination with another key, to modify the + code sent by that key. Prefix keys are pressed and released before pressing + another key, to change the function of one or more keystrokes. + Special-Function Keys + The main keypad and top row have the following special-function keys: + Esc Pressing Esc begins a control sequence. + Tab Pressing Tab moves the cursor to the next tab stop. + Control Holding down Control and pressing another key sends a control code + to the host. + For example, Control Z means to hold down Control and press the + Z key. + Shift Holding down a Shift key and pressing a standard key generates the + uppercase character on the key. + Caps Lock Pressing the Caps Lock key puts the keyboard in caps lock mode + or shift lock mode. You can select the mode from the Customize + Keyboard dialog box (Section 3.3). The default setting is Caps Lock + mode. + • In Caps Lock mode, the alphabetic keys send their uppercase or + shifted character when pressed alone. You can use a Shift key to + send the shifted characters on other keys. You turn Caps Lock + mode on and off by pressing the Caps Lock key. + • In Shift Lock mode, all keys on the main keypad send their + shifted character. You can turn Shift Lock mode on by pressing + the Caps Lock key. You can turn it off by pressing either the + Caps Lock key or the Shift key. + + Return Pressing Return sends a carriage return to the host, which usually + puts the cursor either at the beginning of the next line or at the + beginning of the same line. + Pressing Return normally moves the cursor to the beginning of the + next line. +  + Backspace Pressing  + Backspace moves the cursor one character to the left. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 271 + Using Your Keyboard +15.4 The Sun Style Keyboard + + Space bar Pressing the space bar adds a space character. You use spaces to + separate words or move the cursor forward. + You use instead of Alt in key sequences for VXT 2000 functions. + For example, you press Ctrl Del to reboot the terminal. If you + use the keyboard instead of the mouse to navigate windows, use + instead of Alt in key sequences (Section 15.5). + Alt You use Alt key sequences to generate added characters or functions. + To compose added characters, see Section 15.1.8. When you use Alt + with certain function keys, you generate a third-level function for + the key. + Alt Graph You use Alt Graph with Janus-faced or front-faced keys to generate + the third character on a keycap. + +15.4.3 Editing Keypad + The 11 editing keys generally perform functions defined by application + software. See your Sun system documentation. + +15.4.4 Numeric Keypad + You can use the numeric keypad to enter numbers and arithmetic operators. + You can also use the numeric keypad as a cursor keypad. You press the + Num Lock key to change from a numeric to a cursor keypad and back. + + In cursor keypad mode, you can use arrow key functions. Pressing an arrow + key normally moves the cursor in the direction of the arrow. For example, + pressing the key moves the cursor down one line. Other keys let you + • Pan up or down a page + • Change the size of a window on the screen + • Perform functions defined by your application software + The numeric keypad also includes special-function keys. The function of + the PrSc , Scroll Lock , and Pause keys depends on your operating system + environment and the keyboard type selected. When using the Open Look + window manager: + PrSc Prints the screen. + Scroll Lock Stops the screen from scrolling. + Pause Stops or cancels a command. + Num Lock Changes numeric keypad to a cursor keypad. + + + + +272 Chapter 15 + Using Your Keyboard + 15.4 The Sun Style Keyboard + +15.4.5 Top-Row Function Keys + The top-row keys perform the following functions: + Delete Pressing Delete deletes one character to the left of the cursor. + +15.4.6 Audible Indicators + The Sun style keyboard has two audible indicators, a keyclick and a bell. You + can use a margin bell, warning bell, or both. + +15.4.7 Keyclick + You hear the keyclick sound each time you press a key that sends a code or + causes the terminal to take some immediate action. If a key is autorepeating, + the keyclick will repeat once for each character or key sequence sent. Keys do + not click under the following conditions: + • You press Shift , Control , or Alt . These keys never click except when Shift is + leaving the shift-lock state. + • You disable the Keyclick Volume in the Customize Keyboard dialog box + (Section 3.3). + • You press a key or key combination that does not have a function under the + current operating conditions. + +15.4.8 Bell + The bell tone is a beeping sound. You can use the bell as a margin bell, + warning bell, or both. + Margin Bell + This bell sounds when the cursor is eight characters from the right margin. + Warning Bell + This bell sounds for any of the following conditions: + • During the power-up self-test + • When the terminal receives a bell (BEL) character from the host system + • After a compose character error + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 273 + Using Your Keyboard +15.4 The Sun Style Keyboard + +15.4.9 Redefining Keys + You can use the X application xmodmap to modify key definitions. + Section 15.4.10 lists the default key definitions. Each key on the keyboard + sends a unique keycode to the terminal, and each keycode is assigned a key + symbol. The applications that you use perform actions based on key symbols. + To change a key’s function, you redefine the key by changing the key symbol. + For example, if you wanted to redefine the Insert key to work like the Find key, + you would look up the keycode for the Insert key in the Section 15.4.10. Then + you would assign the key symbol Find to that keycode by using the xmodmap + program. + Here is the command format for redefining a key using its keycode: + % xmodmap -e "keycode 0x keycode = key_symbol" + Examples + • To define the Insert key to work like the Find key: + % xmodmap -e "keycode 0x8A = Find" + • To make the Insert key work normally again: + % xmodmap -e "keycode 0x8A = Insert" + You can also redefine a key by looking up its key symbol and assigning a new + key symbol. However, make sure the key symbol you choose performs the + expected function. In other words, make sure that a new keycode was not + assigned to the key symbol. Here is the format for assigning a new key symbol: + % xmodmap -e "keysym old_key_symbol = new_key_symbol" + Example + To define the Backspace key to work like the Del key: + % xmodmap -e "keysym BackSpace = Delete" + +15.4.10 Sun Keyboard Keycodes and Symbol Assignments + Table 15–2 lists the keycodes and key symbols for each key on the Sun style + keyboard. There are up to four key symbols for each keycode. + + + + +274 Chapter 15 + Using Your Keyboard + 15.4 The Sun Style Keyboard + + +Table 15–2 Sun Keyboard Keycodes and Symbol Assignments +Key +Code Key Symbols Key Symbol Valuess + +8 F11 F11 Cancel ffc8 ffc8 ff69 +a F12 F12 Redo ffc9 ffc9 ff66 +c F1 ffbe ffbe +d F2 ffbf ffbf +e F10 ffc7 ffc7 +f F3 ffc0 ffc0 +10 SunXK_F36 1005ff10 1005ff10 +11 F4 ffc1 ffc1 +12 SunXK_F37 1005ff11 1005ff11 +13 F5 ffc2 ffc2 +14 Mode_switch ff7e ff7e +15 F6 ffc3 ffc3 +17 F7 ffc4 ffc4 +18 F8 ffc5 ffc5 +19 F9 ffc6 ffc6 +1a Alt_L ffe9 ffe9 +1c F21 F21 Pause ffd2 ffd2 ff13 +1d F22 F22 Print ffd3 ffd3 ff61 +1e F23 F23 Scroll_Lock Break ffd4 ffd4 ff14 ff6b +20 F13 F13 SunXK_Props ffca ffca 1005ff70 +21 F14 F14 Undo ffcb ffcb ff65 +24 Escape ff1b ff1b +25 1 exclam 31 21 31 21 +26 2 at 32 40 32 40 +27 3 numbersign 33 23 33 23 +28 4 dollar 34 24 34 24 +29 5 percent 35 25 35 25 +2a 6 asciicircum 36 5e 36 5e +2b 7 ampersand 37 26 37 26 +2c 8 asterisk 38 2a 38 2a +2d 9 parenleft 39 28 39 28 +2e 0 parenright 30 29 30 29 +2f minus underscore 2d 5f 2d 5f +30 equal plus 3d 2b 3d 2b +31 grave asciitilde 60 7e 60 7e +32 BackSpace ff08 ff08 +34 F24 F24 KP_Equal ffd5 ffd5 ffbd +35 F25 F25 KP_Divide ffd6 ffd6 ffaf + (continued on next page) + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 275 + Using Your Keyboard +15.4 The Sun Style Keyboard + + + Table 15–2 (Cont.) Sun Keyboard Keycodes and Symbol Assignments + Key + Code Key Symbols Key Symbol Valuess + + 36 F26 F26 KP_Multiply ffd7 ffd7 ffaa + 38 F15 F15 SunXK_Front ffcc ffcc 1005ff71 + 39 Delete Delete KP_Decimal ffff ffff ffae + 3a F16 F16 SunXK_Copy ffcd ffcd 1005ff72 + 3c Tab ff09 ff09 + 3d Q 71 51 71 51 + 3e W 77 57 77 57 + 3f E 65 45 65 45 + 40 R 72 52 72 52 + 41 T 74 54 74 54 + 42 Y 79 59 79 59 + 43 U 75 55 75 55 + 44 I 69 49 69 49 + 45 O 6f 4f 6f 4f + 46 P 70 50 70 50 + 47 bracketleft braceleft 5b 7b 5b 7b + 48 bracketright braceright 5d 7d 5d 7d + 49 Delete ffff ffff + 4a Multi_key ff20 ff20 + 4b F27 F27 KP_7 Home ffd8 ffd8 ffb7 ff50 + 4c Up F28 KP_8 ff52 ffd9 ffb8 + 4d F29 F29 KP_9 Prior ffda ffda ffb9 ff55 + 4e KP_Subtract ffad ffad + 4f F17 F17 SunXK_Open ffce ffce 1005ff73 + 50 F18 F18 SunXK_Paste ffcf ffcf 1005ff74 + 53 Control_L ffe3 ffe3 + 54 A 61 41 61 41 + 55 S 73 53 73 53 + 56 D 64 44 64 44 + 57 F 66 46 66 46 + 58 G 67 47 67 47 + 59 H 68 48 68 48 + 5a J 6a 4a 6a 4a + 5b K 6b 4b 6b 4b + 5c L 6c 4c 6c 4c + 5d semicolon colon 3b 3a 3b 3a + 5e apostrophe quotedbl 27 22 27 22 + 5f backslash bar brokenbar 5c 7c a6 + (continued on next page) + + + + +276 Chapter 15 + Using Your Keyboard + 15.4 The Sun Style Keyboard + + +Table 15–2 (Cont.) Sun Keyboard Keycodes and Symbol Assignments +Key +Code Key Symbols Key Symbol Valuess + +60 Return ff0d ff0d +61 KP_Enter ff8d ff8d +62 Left F30 KP_4 ff51 ffdb ffb4 +63 F31 F31 KP_5 ffdc ffdc ffb5 +64 Right F32 KP_6 ff53 ffdd ffb6 +65 Insert Insert KP_0 ff63 ff63 ffb0 +66 F19 F19 Find ffd0 ffd0 ff68 +68 F20 F20 SunXK_Cut ffd1 ffd1 1005ff75 +69 Num_Lock ff7f ff7f +6a Shift_L ffe1 ffe1 +6b Z 7a 5a 7a 5a +6c X 78 58 78 58 +6d C 63 43 63 43 +6e V 76 56 76 56 +6f B 62 42 62 42 +70 N 6e 4e 6e 4e +71 M 6d 4d 6d 4d +72 comma less 2c 3c 2c 3c +73 period greater 2e 3e 2e 3e +74 slash question 2f 3f 2f 3f +75 Shift_R ffe2 ffe2 +76 Linefeed ff0a ff0a +77 R13 R13 KP_1 End ffde ffde ffb1 ff57 +78 Down F34 KP_2 ff54 ffdf ffb2 +79 F35 F35 KP_3 Next ffe0 ffe0 ffb3 ff56 +7d Help ff6a ff6a +7e Caps_Lock ffe5 ffe5 +7f Meta_L ffe7 ffe7 +80 space 20 20 +81 Meta_R ffe8 ffe8 +84 KP_Add ffab ffab + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 277 + Using Your Keyboard +15.5 Using the Keyboard Instead of the Mouse + +15.5 Using the Keyboard Instead of the Mouse + This section describes how to use the keyboard to navigate through windows + and choose items from menus and dialog boxes. You will find this section + useful if you prefer using the keyboard rather than the mouse, or if your mouse + is not working. + Sun Style Keyboard: Use Instead of Alt + On the Sun style keyboard, use instead of Alt in keyboard navigation + sequences. + +15.5.1 Using the Editing Keypad to Perform Mouse Functions + When you enable the editing keypad to perform mouse functions, you can still + use your mouse. There is no indication the mode is on, but you cannot use the + arrow keys for normal editing functions. + + To... Press... + Enable the editing keypad to perform mouse Ctrl Shift F3 + functions. + Move the mouse pointer ,  ,  ,  + + + + + Perform MB1 functions Select + Perform MB2 functions Prev + Perform MB3 functions Next + Disable the editing keypad from performing Ctrl Shift F3 again + mouse functions. + + +15.5.2 Using Menu Bars and Pull-Down Menus + + To... Press... + Move to the first menu in a menu bar F10 + Pull down a menu from the menu bar Alt mnemonic + Move to the next menu item in a pull-down menu or  + + + + + Move to another menu in the menu bar  or  + + + + + Move from one pull-down menu to the preceding  , Ctrl  , or Ctrl + menu on the left in the menu bar + + The underlined character in the menu name + + + + +278 Chapter 15 + Using Your Keyboard + 15.5 Using the Keyboard Instead of the Mouse + + To... Press... + Move from one pull-down menu to the next menu  , Ctrl  , or Ctrl  + + + + + on the right in the menu bar + Choose a menu item Return , Ctrl Return , or Enter + Remove a menu, leaving the cursor on the menu F11 (ESC) + name + Move the cursor from the menu bar to where F11 (ESC) + it was before you started using the menu bar + (explicit focus policy), or + Move the cursor from the menu bar to wherever + the pointer is located (implicit focus policy) + Remove all displayed menus F10 + + +15.5.3 Using Pop-Up Menus + To... Press... + Display a pop-up menu F4 + Move to the next menu item in a pop-up menu or  + + + + + Display a submenu from a pop-up menu item  + + + + + Choose a menu item Return , Ctrl Return , or Enter + Remove the displayed menu F11 (ESC) + Dismiss the menu F4 + + +15.5.4 Using Submenus + + To... Press... + Display a submenu Any of these: + Arrow key (in direction of + submenu), Ctrl arrow key, Return , + Ctrl Return , or Enter + Choose a menu item Return , Ctrl Return , or Enter + Choose the default entry in a submenu Alt mnemonic + Move to another menu item in a submenu or  + + + + + Remove the submenu and move back to the  + + + + + parent menu + + The underlined character in the menu name + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 279 + Using Your Keyboard +15.5 Using the Keyboard Instead of the Mouse + + To... Press... + From the submenu to the parent menu  , Ctrl  , or Ctrl + Move from the parent menu to the default menu  , Ctrl  , or Ctrl  + + + + + item in the associated submenu + + +15.5.5 Navigating Windows + This section describes how to use your keyboard to move between and within + windows. + Moving Between Windows + To move between groups of windows: + + To move... Press... + From one group of windows to another Alt Tab or Alt F11 + From one minimized window to another when the Alt Tab or Alt F11 + minimized windows are not in an icon box + From one minimized window to another in an Arrow keys + icon box + Within a group of windows Alt F6 + To the previous group of windows Alt Shift F11 or Alt Shift Tab + To move between minimized windows in an icon Arrow keys + box + + If you use the mouse pointer to make windows active (Section 12.3), you cannot use the Alt Tab + or Alt F11 functions. + + +15.5.6 Miscellaneous + + + To ... Press... + Pop up the window menu of a minimized window F4 + when that window is in an icon box. + Restore a minimized icon box Alt F5 or Return + + + Moving Within Windows + To move within menus: + + + + +280 Chapter 15 + Using Your Keyboard + 15.5 Using the Keyboard Instead of the Mouse + +To ... Press... +Focus on the menu bar F10 +Pull down the window menu Alt +space bar or Shift F11 +Move from one tab group to another Tab + + +To choose items in the window menu: + +To ... Press... +Lower a window to the bottom of the window Alt F3 +stack +Close (not minimize) a window Alt F4 +Restore a minimized window Alt F5 +Move a window Alt F7 +Size a window Alt F8 +Minimize a window Alt F9 +Maximize a window Alt F10 + + +To move a window around the screen: +1. Press Alt F7 . +2. Use the arrow keys to move the window in the desired direction. You can + also press Ctrl + arrow keys to move the window several pixels at a time. +3. Press Return or Ctrl Return to finish the operation. +To size a window: +1. Press Alt F8 . +2. Press one arrow key to indicate which side of the window to size. For + example, press for the top of the window. + You can also press two arrow keys in a row to indicate which corner to size. + For example, press to indicate the upper-left corner. +3. Press the arrow keys to size the window in the desired direction. You can + also press Ctrl arrow keys to size the window several pixels at a time. +4. Press Return or Ctrl Return to finish the operation. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 281 + Using Your Keyboard +15.5 Using the Keyboard Instead of the Mouse + +15.5.7 Using Dialog Boxes + + + To move... Press... + Forward from tab group to tab group (field to Tab or Ctrl Tab + field) + Backward from tab group to tab group Shift Tab or Ctrl Shift Tab + From button to button in a tab group Arrow keys + To a pop-up Options menu Select , space bar, or Ctrl +space bar + + + + + To activate... Press... + The default selection in the dialog box Return , Ctrl Return , or Enter + A check or radio button in a group Select , space bar, or Ctrl +space bar + A push button in a group Select , space bar, Ctrl +space bar, + Return + A push button in a group Ctrl Return or Enter + An item in an Options menu Return , Ctrl Return , or Enter + + + + + To cancel... Press... + A dialog box or an Options menu Alt F4 + + + +15.6 Typing Additional Characters + The terminal lets you type more characters than appear on your keyboard. For + example, you can type accented characters or a © symbol. This chapter lists + the available characters and shows you how to select them. + To enter one of these characters, you type a sequence of keys. Most sequences + begin with one of the Compose Character keys. If you use the German + keyboard, you use the Group Shift key instead of Compose Character . + This chapter describes the following types of key sequences: + • Three-stroke Compose Character sequences (with all LK401 keyboards) + • Group Shift sequences (with the German keyboard) + + + + +282 Chapter 15 + Using Your Keyboard + 15.6 Typing Additional Characters + + • Two-stroke key sequences (with keyboards that have nonspacing diacritical + keys) + • Hexadecimal key sequences (for programmers) + Two basic factors determine the key sequences you can use. + • The Keyboard Type setting, which should match your keyboard type + (Section 3.3). + • The character set the terminal is currently using (Chapter 8). + +15.6.1 What Characters Can I Type? + You can type any of the characters in the character set the terminal is + currently using. You can select from two 8-bit multinational sets (DEC + Multinational or ISO Latin Alphabet No. 1) or many 7-bit national + replacement character sets (NRCs). + + To choose ... Use... + The use of 8-bit multinational sets or 7-bit NRC The VXT DECterm General + sets Options dialog box (Section 8.5). + An 8-bit multinational set The VXT DECterm General + Options dialog box. + A 7-bit NRC set The 7-Bit NRCS Selection dialog + box (Section 8.7). + + By default, the terminal uses the DEC Multinational character set. Section 8.5 + describes multinational and national character sets. + +15.6.2 Key Sequences with Nonspacing Diacritical Keys + Table 15–3 lists the keyboards that have keys with diacritical marks. + Table 15–4 lists all the additional characters for all character sets in the + terminal. Many of these characters include a diacritical mark. For example, Ã� + includes an acute accent. + To enter a character that has a diacritical mark, you press the diacritical key + followed by the character. If your keyboard does not have the diacritical key, + you must press the Compose Character key followed by the correct key sequence + listed in Table 15–4. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 283 + Using Your Keyboard +15.6 Typing Additional Characters + + To use diacritical keys, you must be using a multinational character set. + + Table 15–3 Keyboards with Diacritical Marks + Grave Acute Circumflex Tilde + Keyboard Accent Accent Accent Mark Umlaut + + Finnish yes no yes yes no + Flemish yes no yes yes yes + French/Belgian yes no yes yes yes + French Canadian yes no yes yes no + German yes yes yes yes yes + Portuguese no no no yes no + Spanish yes yes yes yes yes + Swedish yes no yes yes no + Swiss (French) yes no yes yes yes + Swiss (German) yes no yes yes yes + + +15.6.3 How to Type a Character Using the Compose Character Key + To enter a Compose Character key sequence: + 1. Find the character you want to type in Table 15–4. + 2. Press the Compose Character key. + 3. Type the sequence in Table 15–4 for the character you want. + Example + To type an é: + 1. Find the é character in Table 15–4. + 2. Press Compose Character . + 3. Type e and ’ (apostrophe). + + Note + If you try to enter a character that is not available in the current + character set, a warning bell sounds. See Section 15.6.5. + + + + +284 Chapter 15 + Using Your Keyboard + 15.6 Typing Additional Characters + +15.6.4 How to Type a Character Using the Group Shift Key + If you select the Austrian-German keyboard type in the Customize Keyboard + dialog box (Chapter 3), the Group Shift key replaces the Compose Character key. + Many keys on the German keyboard have a second group of legends on the + right half of their keycap. These legends are called Group-2. + To enter a single character from Group-2: + 1. Press and release the Group Shift key. + 2. Type the key that has the desired character on the right half of the keycap. + The character appears on the screen. + Example + To type an ø: + 1. Press Group Shift . + + 2. Type the key that has the ø character on the right half of the keycap: O ø . + To enter a series of characters from Group-2: + 1. Hold down the Group Shift key. + 2. Type the series of keys that have the desired characters on the right half of + their keycaps. The characters appear on the screen. + 3. When you are done typing characters from Group-2, release the Group Shift + key. + +15.6.5 Invalid Sequences + When you complete a valid compose or group-shift sequence, the character + appears on the screen. If you use an invalid sequence, the terminal cancels the + sequence and sounds the warning bell. + Some compose characters require that you type the key sequence in the order + listed in Table 15–4. If you do not follow the order, the sequence is invalid and + the warning bell sounds. If the terminal does not display the character, repeat + the sequence exactly as shown in Table 15–4. + + Note + Pressing a function key cancels a compose or group-shift sequence + without sounding the bell. + You can turn the warning bell on or off from the Customize Keyboard + dialog box (Chapter 3). + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 285 + Using Your Keyboard +15.6 Typing Additional Characters + +15.6.6 Canceling or Restarting a Key Sequence + If you accidentally start a key sequence by pressing Compose Character , + Group Shift , or a nonspacing diacritical key, press the > + brackets +¼ fraction one- 14 + quarter +½ fraction one-half 12 +¿ inverted ? ?? +À A grave `A +Ã� A acute ’A + A circumflex ^A +à A tilde ~A +Ä A umlaut ¨A or "A +Ã… A ring °A or *A + (degree sign) +Æ A E diphthong AE +Ç C cedilla C, +È E grave `E +É E acute ’E +Ê E circumflex ^E +Ë E umlaut ¨E or "E +ÃŒ I grave `I +Ã� I acute ’I +ÃŽ I circumflex ^I +Ã� I umlaut ¨I or "I +Ñ N tilde ~N +Ã’ O grave `O +Ó O acute ’O + + +Most sequences that include diacritical marks can also be typed in reverse order. + + (continued on next page) + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 289 + Using Your Keyboard +15.6 Typing Additional Characters + + + Table 15–4 (Cont.) Key Sequences for Additional Characters + Character Sequence + Ô O circumflex ^O + Õ O tilde ~O + Ö O umlaut ¨O or "O + Å’ O E diphthong OE + Ø O slash o/ + Ù U grave `U + Ú U acute ’U + Û U circumflex ^U + Ü U umlaut ¨U or "U + Ÿ Y umlaut ¨Y or "Y + ß German small ss + sharp s + à a grave `a + á a acute ’a + â a circumflex ^a + ã a tilde ~a + ä a umlaut ¨a or "a + Ã¥ a ring °a or a* + (degree sign) + æ a e diphthong ae + ç c cedilla c , (comma) + è e grave `e + á e acute ’e + ê e circumflex ^e + ë e umlaut ¨e or "e + ì i grave `i + í i acute ’i + î i circumflex ^i + + This character is only available when you use the DEC Multinational character set. See the VXT + DECterm General Options dialog box (Section 8.5). + + (continued on next page) + + + + +290 Chapter 15 + Using Your Keyboard + 15.6 Typing Additional Characters + + +Table 15–4 (Cont.) Key Sequences for Additional Characters +Character Sequence +ï i umlaut ¨i or "i +ñ n tilde ~n +ò o grave `o +ó o acute ’o +ô o circumflex ^o +õ o tilde ~o +ö o umlaut ¨o or "o +Å“ o e diphthong oe +ø o slash o/ +ù u grave `u +ú u acute ’u +û u circumflex ^u +ü u umlaut ¨u or "u +ÿ y umlaut ¨y or "y + + This character is only available when you use the DEC Multinational character set. See the VXT +DECterm General Options dialog box (Section 8.5). + + (continued on next page) + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 291 + Using Your Keyboard +15.6 Typing Additional Characters + + + Table 15–4 (Cont.) Key Sequences for Additional Characters + Character Sequence + + + ISO Characters† + no break space sp sp + ¦ broken vertical bar | | or ! ^ + ¬ logical not -, + - soft (syllable) -- + hyphen + ® registered trade- RO + mark + ¯ macron -^ + ¾ three quarters 34 + ÷ division sign -: + multiplication sign xx + ´ acute accent ’’ + ¸ cedilla ,, + ¨ diaeresis ¨ (sp) or " " + Ã� Y acute ’Y + ý y acute ’y + Þ capital Icelandic TH + thorn + þ small Icelandic th + thorn + Ã� capital Icelandic -D + Eth + ð small Icelandic Eth -d + + †These characters are only available when you use the ISO Latin Alphabet No. 1 character set. + See the VXT DECterm General Options dialog box (Section 8.5). + + + + +292 Chapter 15 + A + A + Solving Problems and Getting Service + + + This appendix describes some simple operating problems you can solve + yourself. The appendix covers the following major topics: + • Operating Problems + • Power-Up Self-Test + • Digital Service Overview + +A.1 Operating Problems + The following tables list some possible operating problems and suggested + solutions. If you have a problem with your terminal, check this list before + calling for service. If the problem persists and you need service, see Section A.4 + in this appendix. + Table A–1, System Box, Monitor, Keyboard, Mouse, and Printer Problems + Table A–2, Booting, Server, and Network Problems + Table A–3, Session, Application, and Dialog Box Problems + + Table A–1 System Box, Monitor, Keyboard, Mouse, and Printer Problems + Symptom Suggested Solution + System Box Problems + The system box fan is off. Check the power source. Make sure the power cord is + plugged in. Turn the system box’s power switch on ( | ). + Note: The VX225 and VX227 terminals do not have a + system box. + + (continued on next page) + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 293 + Solving Problems and Getting Service +A.1 Operating Problems + + + Table A–1 (Cont.) System Box, Monitor, Keyboard, Mouse, and Printer + Problems + Symptom Suggested Solution + Monitor Problems + When you turn the terminal Make sure the monitor’s power switch is on ( | ). + on, the monitor does not System box models: Check the monitor cable connections + display the Terminal at the system box and monitor. + Manager window after + 45 seconds. Adjust the monitor’s brightness and contrast controls. + See the monitor’s installation guide. + If you have a VRM17 monitor, set the scan switch to + High. + If you have customized the terminal to hide the Terminal + Manager window at startup, you can press F3 to + redisplay the Terminal Manager window. + If you have customized the terminal to not run the + terminal manager, you can start the Terminal Manager + window from the VXT Create pop-up menu. Press MB2 + anywhere on the screen background to display the menu. + Check the keyboard cable connections at the terminal + and keyboard + The screen is blank, but the Check if the two keyboard lights are blinking, which + terminal is on. may indicate the CRT saver is on. If the CRT saver is + on, press any key to reactivate the screen. + Check if brightness and contrast controls are set + correctly. + System box models: On a Check the monitor’s cable connection at the back of the + color terminal, the window system box. The cable may be plugged in upside down. + colors look wrong. The red + and blue colors appear to be + swapped. + (continued on next page) + + + + +294 Appendix A + Solving Problems and Getting Service + A.1 Operating Problems + + +Table A–1 (Cont.) System Box, Monitor, Keyboard, Mouse, and Printer + Problems +Symptom Suggested Solution +Keyboard Problems +The bell tone does not Check the keyboard cable connection to the system box. +sound when you turn the +terminal on. All keyboard +indicator lights are off. +The information you type is Check the hold indicator to see if the keyboard is on +not displayed. hold. If the keyboard is on hold, press the F1 (Hold) key + to release the screen. + The current window may not accept input, or you may + not have activated the window. Check the window’s title + bar to see if the window has input focus. + + +Mouse Problems +The pointer for the mouse Turn the system box’s l O power switch off (O), then +or tablet does not appear on disconnect and reconnect the mouse or tablet cable. Turn +the screen, or the pointer the system box’s l O power switch on ( | ). +does not respond to the Replace the mouse. Until you get a new mouse, press +pointing device commands. Ctrl Shift F3 to use the editing keypad to perform mouse + functions. See Chapter 15. + + +Printer Problems +The printer does not print. Turn the printer’s power switch on ( | ). + Check the printer cable connections. + Check the settings in the Customize Serial and Parallel + Ports dialog box (Section 4.2). Check that the correct + port is enabled (serial or parallel). Check that the + transmit rate, baud rate, and parity setting in the dialog + box match the printer’s settings. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 295 + Solving Problems and Getting Service +A.1 Operating Problems + + + Table A–2 Booting, Server, and Network Problems + Symptom Suggested Solution + Booting Problems or Operating Failure + The monitor displays a >>> The >>> prompt appears when the terminal fails + prompt. operation or when you halt the terminal (by pressing the + halt button, or by pressing Ctrl C before the terminal + boots its VXT software). + Turn the terminal’s l O power switch off (O) and on + ( | ) again. (On system box models, this is the switch on + the system box.) + If the terminal fails to load its software or fails operation + again, keep notes of any error messages and the + terminal’s operating state when the failure occurred. + For host-based terminals, see Section 1.5.1 to monitor + memory use. + You can also enter boot commands at the >>> prompt, to + load a specific version of VXT software (Section 5.7.5). + If you cannot correct the problem, call your Digital + Service representative with any error messages you + noted. + (continued on next page) + + + + +296 Appendix A + Solving Problems and Getting Service + A.1 Operating Problems + + +Table A–2 (Cont.) Booting, Server, and Network Problems +Symptom Suggested Solution +Server-Based Terminals: Problems with Server Connections +The first time you start The terminal does not have the same LASTport group +the terminal, it fails to code as the InfoServer system. See your system manager +load its VXT software for the correct code. See Section 4.4 to enter a LASTport +from an InfoServer system code. +and displays the following +message four times: +LASTport... Group code 0 +The terminal stops The terminal may have lost its connection to the +operating correctly and InfoServer system. Wait for the connection to be +displays a message on the reestablished. When the connection resumes, the +top line of the screen. message is erased, the screen is restored, and the + terminal returns to normal functions. + Contact your system manager if these messages appear + too frequently or for longer than a few seconds. If the + terminal does not recover, turn the terminal’s l O + power switch off (O) and on ( | ) again to restart the + terminal. On system box models, this is the switch on + the system box. +The terminal’s software Reboot the terminal by pressing the following key +seems to be hanging in a sequence: +suspended state. ANSI keyboard – Press Ctrl +left Alt +keypad . . + PC keyboard – Press Ctrl + Alt +keypad . . + Short ANSI keyboard – Press Ctrl Alt Extend . . + Sun style keyboard – Press Ctrl Del . + (continued on next page) + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 297 + Solving Problems and Getting Service +A.1 Operating Problems + + + Table A–2 (Cont.) Booting, Server, and Network Problems + Symptom Suggested Solution + Network Problems + The host system and termi- Check that the Ethernet cable is securely connected to + nal do not communicate. the terminal. + Make sure the port that your system cable is connected + to is active by trying a working system in the port. + If you are using a ThinWire Ethernet cable, make sure + the cable is attached to the system box by a T-connector. + Make sure there is no ThinWire segment between the + system box and the T-connector. Check if a terminator + has been removed or is connected to an active ThinWire + segment. + Server-based terminals: the Communication between the InfoServer system and + InfoServer system displays terminal may have been interrupted. Wait to see if + messages at the top of the the InfoServer system can reconnect to the terminal. + terminal’s screen. If normal operation does not resume, you may need to + reboot the terminal: + ANSI keyboard – Press Ctrl +left Alt +keypad . . + PC keyboard – Press Ctrl + Alt +keypad . . + Short ANSI keyboard – Press Ctrl Alt Extend . . + Sun style keyboard – Press Ctrl Del . + + + + Table A–3 Session, Application, and Dialog Box Problems + Symptom Suggested Solution + Problems Creating Sessions and VXT Applications + You cannot view the If you have customized the terminal to hide the Terminal + Terminal Manager window. Manager window, you can press F3 to redisplay the + Terminal Manager window. + If you have customized the terminal to not run the + terminal manager, you can start the Terminal Manager + window from the VXT Create pop-up menu. Press MB2 + anywhere on the screen background to display the menu. + (continued on next page) + + + + +298 Appendix A + Solving Problems and Getting Service + A.1 Operating Problems + + +Table A–3 (Cont.) Session, Application, and Dialog Box Problems +Symptom Suggested Solution +Problems Creating Sessions and VXT Applications + +You cannot create sessions Make sure your terminal’s IP address is entered in the +with the TCP/IP transport Customize TCP/IP dialog box and appears at the bottom +in the Create dialog box. of the Terminal Manager window. See Section 4.5. +The TCP/IP button is Also, your system manager may have restricted access +dimmed. to the Create menu settings by using the terminal’s + configuration manager. Ask your system manager which + of your terminal’s create and customize features are + restricted. +You cannot use the DECnet Make sure your terminal’s DECnet address is entered +transport to create sessions in the Customize DECnet dialog box and appears at +in the Create dialog box. the bottom of the Terminal Manager window. See +The DECnet button is Section 4.9. +dimmed. Also, your system manager may have restricted access + to the Create menu settings by using the terminal’s + configuration manager. Ask your system manager which + of your terminal’s create and customize features are + restricted. +You cannot create a DECnet Make sure your system manager installed the network +X session to an OpenVMS object VXT$SERVER.COM on the OpenVMS host. +host from the Create dialog See VXT Software Version 2.1 Installation and System +box. Management. + + +Font Problems +Your host application fonts Set the font path in the Customize Font Path dialog +display incorrectly on the box to access the fonts from your host system. List the +terminal. font path to your host system as the first entry in the + Customize Font Path dialog box (Section 5.3). +The terminal cannot access Include backup font sources in the Customize Font Path +fonts on your host system dialog box. If the primary font source is unavailable, the +or InfoServer system. The terminal can find the same fonts on the backup source. +VXT Message Box displays +Font not found error +messages. + (continued on next page) + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 299 + Solving Problems and Getting Service +A.1 Operating Problems + + + Table A–3 (Cont.) Session, Application, and Dialog Box Problems + Symptom Suggested Solution + Problems with Customize Dialog Boxes + You cannot change settings Your system manager may have restricted access to + in Customize dialog boxes. some Customize dialog boxes by using the terminal’s + configuration manager. Ask your system manager which + of your terminal’s customize features are restricted. + Some buttons are dimmed if they do not apply to the + action you are currently performing. + + + VXT DECterm Window Problems + The DECterm window is too Adjust the terminal size in the DECterm Window + high on the screen. Options dialog box. You can also use the window menu + to move the window. To display the menu, click MB3 + anywhere on the window frame. + + +A.1.1 NFS Error Codes + If an error occurs when mounting or accessing file systems, the VXT Message + Box displays an NFS error code. Table A–4 lists NFS numeric error codes. + + Table A–4 NFS Error Codes + Error Code Meaning + 0 NFS$_NORMAL + -1 NFS$_ERROR + 10001 NFS$_NOMOREMNT + 10002 NFS$_CANTMPGBL + 10003 NFS$_NOTMOUNTED + 10004 NFS$_INVPARAM + 10005 NFS$_ALRDYMOUNTED + 10006 NFS$_NOHOSTNAME + 10007 NFS$_INVHOSTNAME + 10008 NFS$_CANTGETHNAM + 10009 NFS$_CANTGETIP + (continued on next page) + + + + +300 Appendix A + Solving Problems and Getting Service + A.1 Operating Problems + + +Table A–4 (Cont.) NFS Error Codes +Error Code Meaning + +10010 NFS$_DQUOTA +10011 NFS$_NFSDQUOTA +10020 NFS$_QUEERR +10021 NFS$_NOREQQUE +10022 NFS$_NOTOPENED + + +20001 NFS$_CANTENCODE +20002 NFS$_CANTDECODE +20003 NFS$_RPCTIMEDOUT +20004 NFS$_PROGUNAVAIL +20005 NFS$_PROCUNAVAIL +20006 NFS$_CANTDECODE +20007 NFS$_CANTSEND +20008 NFS$_CANTRECV +20009 NFS$_VERSMISMATCH +20010 NFS$_AUTHERR +20011 NFS$_PRGVERMISMATCH +20012 NFS$_ATHERERR +20013 NFS$_PMAPFAILURE +20014 NFS$_RPCSYSERR +20015 NFS$_RPCPROGNOTREG + + +30001 NFS$_NFS_PERM +30002 NFS$_NFS_NOENT +30003 NFS$_NFS_IO +30004 NFS$_NFS_NXIO +30005 NFS$_NFS_ACCES +30006 NFS$_NFS_EXIST +30007 NFS$_NFS_NODEV + (continued on next page) + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 301 + Solving Problems and Getting Service +A.1 Operating Problems + + + Table A–4 (Cont.) NFS Error Codes + Error Code Meaning + + 30008 NFS$_NFS_NOTDIR + 30009 NFS$_NFS_ISDIR + 30010 NFS$_NFS_FBIG + 30011 NFS$_NFS_NOSPC + 30012 NFS$_NFS_ROFS + 30013 NFS$_NFS_NAMTOOLNG + 30014 NFS$_NFS_NOTEMPTY + 30015 NFS$_NFS_DQUOT + 30016 NFS$_NFS_STALE + 30017 NFS$_NFS_WFLUSH + + + +A.2 Power-Up Self-Test + Every time your turn the terminal on, it automatically runs a power-up + self-test. This test checks the operating status of many internal parts in the + terminal. During the test, the keyboard lights turn on and off. The power-up + self-test should not take more than 45 seconds to complete. + If the test is successful: + The terminal downloads the VXT system image software, performs its boot + procedure, and displays the Terminal Manager window or a login prompt for + your host system. + If there were any test errors: + The terminal displays a diagnostic error message. + +A.2.1 Error Messages + If the terminal fails the power-up self-test, the terminal may display an error + message and >>> prompt. The following table lists error messages for some + simple problems that you can correct yourself. If you see other error messages, + note the error messages and call your Digital service representative; only + qualified service personnel should try to correct these problems. + + + + +302 Appendix A + Solving Problems and Getting Service + A.2 Power-Up Self-Test + + Error Message Reason + ?? 002 3 QDZ 0080 The keyboard failed the self-test. Check that the keyboard is + plugged in correctly. + ?? 001 9 VNI 0132 The Ethernet failed the self-test. Check that your network + cable is plugged in correctly. + ?? 020 12 IMG 0016 The image accelerator option board failed the self-test. Check + that the board is installed correctly. For VXT 2000 system + box models, see VXT 2000 Windowing Terminal Installation + Information. For other models, see instructions supplied with + the image accelerator board. + ?MOP 1 Transmit error. MOP was unable to transmit due to a system + board error. + ?MOP 255 Not enough space in memory to load the image. + ?IP 2 An ICMP Protocol Unreachable message was received. The + TFTP host listed in the BOOTP response does not understand + the user datagram protocol (UDP) that TFTP runs over. The IP + download stops. + ?IP 3 An ICMP Port Unreachable message was received. The remote + TFTP daemon has either never been started or is not running + on the load host. The IP download stops. + ?TFTP 1 A TFTP error message was received while sending a TFTP + Read Request packet. The TFTP load stops. This error usually + means a file was not found or you do not have access to the file. + ?TFTP 3 A TFTP error message was received while sending a TFTP + Acknowledgment packet. The TFTP load stops. + ?TFTP 5 A TFTP error message was received while sending a TFTP + Error packet. The TFTP load stops. + ?TFTP 255 Not enough space in memory to load the image. + + +A.3 Restoring the Terminal to Factory-Default Settings + You can reset the VXT 2000 windowing terminal’s nonvolatile RAM (NVRAM) + to the factory-default settings by entering a console command. + 1. Place the terminal in console mode by pressing Ctrl Alt keypad . or + pressing the halt button on the rear of the terminal. + 2. At the >>> console prompt, enter the following command: + >>> T/UTIL 1 + + + + + VXT 2000+/VXT 2000 Windowing Terminal User Information 303 + Solving Problems and Getting Service +A.3 Restoring the Terminal to Factory-Default Settings + + When you boot the terminal successfully it saves a record of the successful + booting method used. When you reboot the terminal, it tries using this saved + method first. You can clear this saved state while booting the terminal: + >>> B/10000 + +A.4 Digital Service Overview + As a full-service vendor, Digital provides hardware, software, network, and + operations support to a diverse, worldwide customer base. Digital offers one + of the most comprehensive portfolios of service in the industry, designed to + support customers throughout the computing life cycle—planning, design, + implementation and ongoing management. + Customers tailor the type and level of support to meet their individual + business needs. Regardless of the service solution, customers benefit from + Digital’s single-source support strategy. + Digital’s commitment to be the Best in Class service provider means that there + is a force of 40,000 service professionals operating from 450 locations in over + 80 countries dedicated to support our customers. + Digital believes in backing its products with meaningful warranties. This + product may be covered by the Standard Product Warranty, which is + entitlement to one year of hardware Basic Service with priority response + time Monday through Friday, 8 AM to 5 PM. Where applicable, entitlement to + the Product Foundation Warranty for the kernel software is provided. This + Standard Warranty is further proof of Digital’s commitment to the customer. + Digital provides on-site and off-site remedial services. + Digital offers fast, competitively priced, quality maintenance performed at your + site by Digital trained Service Specialists. There are several on-site services + available. + +A.4.1 How to Get Service + Digital has a central service center in your area to help you keep your system + running at peak efficiency. To find out more about Digital’s hardware and + software service offerings + In the United States + For customers who purchased standard warranty (on-site) support, have your + system manager call for remedial service at 1–800–354–9000. + Other customers may call 1–800–225–5385 for return to Digital Service. + For general information, call 1–800–DEC–INFO. + + +304 Appendix A + Solving Problems and Getting Service + A.4 Digital Service Overview + +For ordering and ordering support, call 1–800–DIGITAL. +Outside the United States +Contact your local Digital Customer Services Office. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 305 + BB + Mixing Colors + + + This appendix describes how to use the Color Mixing dialog box on VXT 2000 + color and gray scale terminals. You can choose and mix your own colors for + windows, window borders, and certain other customizable features. When you + choose a feature that has customizable colors, the terminal displays a Color + Mixing dialog box. + The VXT 2000 color and gray scale terminals use 8-plane displays. The color + terminal lets you display 256 colors from a palette of 16.7 million colors. The + gray scale terminals provide 256 levels of gray. + + + +B.1 What Color Settings Can I Customize? + Here is a list of VXT 2000 color settings you can change, using the Terminal + Manager window and workspace Options submenu. + + To change this feature’s color... Use this dialog box... + Terminal Manager (Customize Menu) + Pointer Customize Pointer + Window Customize Window Color + Screen Customize Screen Background + + + + +306 Appendix B + Mixing Colors + B.1 What Color Settings Can I Customize? + + To change this feature’s color... Use this dialog box... + Window Manager (Workspace Options Submenu) + Border for active windows Border Color Options + Border for inactive windows Border Color Options + Window manager menu colors Border Color Options + Icons Icon Color Options + Window matte Matte Options + + +B.2 Color Mixing Dialog Box + The Color Mixing dialog box offers different methods for mixing colors, based + on different color models: + • Picker + • Hue, Lightness, Saturation (HLS) + • Red, Green, Blue (RGB) + • Browser + • Gray scale + The default model is the Picker model. You can use one model or a combination + of models. For example, you can use any color model to select a color, then use + the Picker color model to blend the selected color. When you choose a color + model in the dialog box, the terminal displays the set of controls for that model + in the dialog box. + The following sections describe how to use each of the color models to choose + your own colors. + +B.2.1 Picker Color Model + When you click on a button in a dialog box to change a color, the terminal + displays the Picker version of the Color Mixing dialog box: + + Note + The title of the dialog box may be Color Mixing or Highlight Color, + depending on what feature you are customizing. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 307 + Mixing Colors +B.2 Color Mixing Dialog Box + + + + Highlight Color + + + + + Color Display +Current Color Box + + New Color + + + + + Color Model: Picker + + + + Spectrum Spectrum Label + + + Color Spectrum + + + Paint Bucket + Lighter Interpolator Warmer +Lightness +Arrow Buttons Warmth + Arrow Buttons + + Darker Cooler + Smear Interpolator + Push Button + Smear Undo + Undo + Push Button + + Scratch Pad... + + + + OK Apply Reset Cancel + + + + + LJ−03030−RAGS + + + + + The color spectrum is a static collection of colors. The spectrum options + menu lets you set the spectrum to one of the following common color palettes: + • Rainbow spectrum (white, red, orange, yellow, green, blue, blue-violet, + violet, brown and black) + • Pastels + • Vivids + + + +308 Appendix B + Mixing Colors + B.2 Color Mixing Dialog Box + +• Earthtones +• Any application-specific palettes +When you click MB1 on a spectrum tile or interpolator tile, that color becomes +the new color. The tile is highlighted to identify it as the currently selected +color. +You can use the selected color without modification, or you can do on or more +of the following tasks: +• Use the interpolator to smear (blend) the selected color into various shades. +• Use the arrow buttons to make the color lighter or darker, warmer or + cooler. +• Switch to another color model and use the features of that model to modify + the current selection. +To smear colors, use the two paint buckets to load the interpolator with the +colors: +1. Click MB1 on a spectrum tile or interpolator tile. The color display box + displays the color of that tile. +2. Click on a paint bucket, which fills the interpolator end tile below it with + the selected color. +3. Fill both interpolator end tiles or one. If you only fill one end tile, the color + of the empty interpolator end tile is white. +As an alternative to the paint buckets, you can use an eyedropper pointer to +load the interpolator. If you click and hold MB1 on a spectrum or interpolator +tile, the pointer becomes an eyedropper filled with the color of the tile. +You can use the eyedropper to fill one of the interpolator’s two end tiles, by +moving the eyedropper to the tile and clicking on MB1. If you do not position +the eyedropper directly on one of the two end tiles, the closest end tile is filled +with the eyedropper color. The cursor must be inside the interpolator. +Use the Undo button to reverse the last interpolator action, which can be +a smear, the filling of an end tile, or the activation of one of the warmth or +lightness adjustment buttons. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 309 + Mixing Colors +B.2 Color Mixing Dialog Box + +B.2.2 Hue, Lightness, Saturation (HLS) Color Model + When you choose HLS from the pop-up Color Model menu, the Color Mixing + dialog box displays the controls for the HLS color model. + + Highlight Color + + + + + Color Model: HLS + + + + 220 + Hue: + + + + Black White + 62 + Lightness: + + + + Gray Full + 68 + Saturation: + + + + + Scratch Pad... + + + + OK Apply Reset Cancel + + + + LJ−03027−RAGS + + + + +310 Appendix B + Mixing Colors + B.2 Color Mixing Dialog Box + +In the HLS color model, you specify a color by three characteristics: hue, +lightness, and saturation. +• Hue is color, such as red or blue. +• Lightness is color intensity, the amount of color. +• Saturation is the purity of the color, or how much the color is diluted by + white. +The HLS color model contains three scales that represent the ranges of hue, +lightness, and saturation. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 311 + Mixing Colors +B.2 Color Mixing Dialog Box + +B.2.3 Red, Green, Blue (RGB) Color Model + In the RGB color model, you mix a color by adding different intensities of + the primary colors red, green, and blue. A primary color is a basic color that + cannot be created by mixing other colors. + The RGB color model contains three scales that represent the of red, green and + blue. + + Color Mixing + + + + + Color Model: RGB + + + + Percentage Value + + Red + 24672 + + Green + 35209 RGB Values + + + Blue + 57825 + + + + Scratch Pad... + + + + OK Apply Reset Cancel + + + + + LJ−03028−RAGS + + + + +312 Appendix B + Mixing Colors + B.2 Color Mixing Dialog Box + +B.2.4 Browser Color Model + The browser color model is a scrolled window that displays a list of X11 named + colors. Each button in the scrolled window shows the name of an X11 color. + Use the scroll bar to scroll through this color list. When you click MB1 on a + color in the list, the color display box becomes filled with that color. The color + browser is available on all systems. + + Color Mixing + + + + + Color Model: Browser + + + + Aquamarine + + MediumAquamarine + + Black + + Blue + + CadetBlue + + + + + Scratch Pad... + + + + OK Apply Reset Cancel + + + + + LJ−03029−RAGS + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 313 + Mixing Colors +B.2 Color Mixing Dialog Box + +B.2.5 Grayscale + The grayscale color model contains a scale that lets you mix gray shades + ranging from black to white. Note that when you switch to the grayscale color + model, the current new color becomes a shade of gray. + + Color Mixing + + + + + Color Model: Greyscale + + + 59 + + + + + Scratch Pad... + + + + OK Apply Reset Cancel + + + + + LJ−03031−RAGS + + + + Scratch Pad + The scratch pad lets you store intermediate colors for later use in color mixing. + + + + +314 Appendix B + Mixing Colors + B.2 Color Mixing Dialog Box + +To access the scratch pad, click on the Scratch Pad button in any of the +color models. + + Scratch Pad... + + Save colors here... + + Paint Bucket to + Load Scratch Pad + + + + + Clear Cancel + + + ZK−2577A−GE + + + + +To store the currently selected color in the scratch pad, click on the +paint bucket above the scratch pad color tile. The scratch pad adds that color +to its stored colors, which you can scroll through with the scroll bar. +To clear the scratch pad list, use the Clear button. +On the picker model, the currently selected color can be one of many color tiles. +On other color models, you can select only the new and original color tiles. +To set the new color tile to a scratch pad, scroll to that color and click on the +scratch pad color tile. The new color tile changes and the scratch pad tile +becomes highlighted. If you are in the picker model, you now have the option +to dump the highlighted scratch pad color into one of the interpolator end tiles +by using the paint bucket buttons. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 315 + CC + Programming with the X Windows Image + Extension + + + This appendix is for programmers using X windows image extension (XIE) + software for applications on the terminal. The appendix briefly covers the + following topics: + • Checking the Terminal’s Imaging Capabilities + • Hardware Accelerated XIE Functions + • XIE Pipeline Definitions + • XIE Pipeline Constraints + • XIE Pipeline Examples + The terminal includes the X windows image extension (XIE) to the X windows + server. The terminal supports Version 3.0 of the XIE protocol. With XIE: + • The server can save resources by managing images in compressed form + • The server can manipulate the images while accepting user input from + client-based application programs + The terminal supports all XIE protocol functions. Many VXT 2000 models have + an optional image accelerator board available. You do not need the optional + image accelerator board to use XIE functions, but the board accelerates certain + bitonal XIE functions to help display images faster. + All full function VXT system images include XIE support. The VXT EX system + image does not support XIE. To use XIE, make sure the X Image Extension + button in the Customize Boot dialog box is on. See Section 5.7. + For more information on XIE: Appendix D lists some available + documentation on XIE and Digital’s image application toolkit products that + support XIE, such as DECimage Application Services. + + +316 Appendix C + Programming with the X Windows Image Extension + C.1 Checking the Terminal’s Imaging Capabilities + +C.1 Checking the Terminal’s Imaging Capabilities + If the terminal is using a VXT software image that supports XIE, you can + have your application use the following query to determine if the bitonal image + accelerator is present: + status = XInternAtom(display, "_DEC_XIE_ACCEL_TYPE_A", True); + The presence of the _DEC_XIE_ACCEL_TYPE_A atom indicates that the + bitonal image accelerator board is present in the terminal. This board + accelerates the following functions: + • CCITT Group 3 and Group 4 image data decompression + • Scaling range from 1/64 to 64 times the original size + • Orthogonal rotation (0°, 90°, 180°, and 270°) + • Cropping + • Convolution using a 3 3 or 5 5 kernel, with kernel values between 0 and +   + + + + + 255 + +C.2 Hardware Accelerated XIE Functions + To take maximum advantage of the bitonal image accelerator, you must follow + these general rules: + • Use the XIE pipeline method of processing to display images (instead of + atomic XIE processing). + • Group all accelerated XIE functions together. + • Transport and work from compressed bitonal images whenever possible. + +C.3 XIE Pipeline Definitions + Always use XIE pipelines to display images on the terminal. + XIE uses process control services, known as pipelines, to allow a client + to create and execute linear, macro-like assemblies of protocol requests. A + pipeline is a single threaded list of XIE protocol functions through which image + data flows sequentially. + When you construct pipelines for processing images in the terminal, use the + following guidelines for the best image display performance: + • Group all accelerated XIE functions together. That is, do not mix + nonaccelerated functions with accelerated functions. Accelerated XIE + functions include crop, area-constrain, scale, rotate, and mirror. + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 317 + Programming with the X Windows Image Extension +C.3 XIE Pipeline Definitions + + • When using any accelerated functions, observe the following order: crop, + area-constrain, scale, rotate, mirror. + • If you use the area function, it must be followed by the constrain function. + • Do not include more than one instance of an accelerated XIE function in + the pipe. Do not use two scale functions in a single pipeline. + • End the pipeline with the export function. + • Do not use phototaps in the pipeline. + +C.3.1 XIE Pipeline Constraints + Some accelerated XIE functions have associated constraints, to ensure that the + bitonal image accelerator option can handle the request. By following these + constraints, you ensure that the hardware accelerator is used to process XIE + requests, rather than the XIE software alone. + Following is a list of the hardware accelerated XIE constraints: + • The bitonal image accelerator supports CCITT Group 3 and Group 4 + compressed image formats and Pulse Code Modulated (PCM) data. CCITT + is the Comitè Consultatif International de Télégraphique et Téléphonique, + a standards committee for the communication industry in Europe. + • Specify kernel values in the area request as follows: + Each value must be between 0 and 255. + The kernel size must be either 3 3 or 5 5. +   + + + + + The sum of all values must be between 224 and 255. + • Specify the IDC parameter as null in an area request. + • Specify the parameters op1 and op2 as mult and sum, respectively, in the + area request. + • Images may not be scaled to a size greater than 64 times or less than 1/64 + of the original in the scale request. + • For data alignment purposes, the server may slightly adjust the output + scanline length from that specified in the scale request. Any adjustment + will be close to the specified scale, and will always be equal to or greater + than the specified scale. + • Specify a rotation request of 0°, 90°, 180°, or 270° only. + + + + +318 Appendix C + Programming with the X Windows Image Extension + C.3 XIE Pipeline Definitions + + • The constrain function immediately following the area function determines + the number of levels for a given output pixel. + Specifying two levels in the constrain function produces a bitonal + output on any display. In this case, the export function parameters + (lut_id, colormap_id, match, and grey) should all be null in the + export request. + In a gray scale or color system, specifying up to 256 levels in the + constrain function produces a multibit output. In this case, the export + function parameters colormap_id, match, and grey should be null + in the export request. The lut_id parameter should be specified as a + previously created server image resource. + Digital suggests that an application allocate a fixed number of gray + scale colormap entries at initialization time and always use these + entries to display the enhanced bitonal images. This is accomplished by + allocating the colors (actually gray scales) from the default colormap, + and creating a one-scanline image with these colormap entry pixel + values to use as the lut_id in all XIE export calls. + Digital recommends using from 8 to 32 gray scale values. Fewer values + introduce artifacts in the displayed image, and more values are a waste + of server resources. See the XIE documentation for details on creating + a LUT image. + +C.3.2 XIE Pipeline Examples + The following examples show sample pipelines that illustrate how functions are + mapped either to the image accelerator board or to the XIE software routines. + The examples illustrate the difference in image display performance when you + program with the image accelerator board in mind. + 1. All Accelerated Functions (Best Performance) + Crop + Area-Constrain + Scale + Rotate + Mirror + In this pipeline, all XIE routines are mapped to the image accelerator + board. Thus, this pipeline requires only one pass through the image + accelerator board, resulting in the best image display performance. + 2. Interspersed Software Functions (Poorer Performance) + Crop + Scale + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 319 + Programming with the X Windows Image Extension +C.3 XIE Pipeline Definitions + + Translate + Rotate + In this pipeline, the Crop and Scale XIE routines are first mapped to + the image accelerator board. The Translate routine is then mapped to + the XIE software. Finally, the Rotate routine is mapped to the image + accelerator board. Thus, this pipeline requires two passes through the + image accelerator board, resulting in degraded image display performance. + + + + +320 Appendix C + DD + Related Documentation + + +This document is part of your terminal’s user documentation kit. + +Document Part Number + +VXT 2000+ /VXT 2000 Windowing Terminal User Documentation Kit EK–VXT20–DK + VXT 2000+ /VXT 2000 Windowing Terminal Installing and EK–VXT20–IN +Getting Started + VXT 2000+ /VXT 2000 Windowing Terminal User Information EK–VXT20–UG + VXT 2000+ /VXT 2000 Windowing Terminal Release Notes EK–VXT20–RN + +You can also order the following related documents from Digital. Check with +your Digital sales representative for availability in your country. + +Software and Service Documentation Part Number + +VXT Software Version 2.1 Installation and System Management AA–PJHFE–TE +VXT Software Version 2.1 Release Notes AA–PKWSG–TE +VT320 Programmer Reference Manual EK–VT320–RM +DECimage Application Services for VMS + X Image Extension Programmer’s Reference Manual AA–PH7XA–TE + Image Display Services Programmer’s Reference Manual AA–LE73C–TE + Programmer’s Overview AA–LE65C–TE +ULTRIX DECwindows Motif User’s Guide AA–MA87B–TE +VMS DECwindows Motif User’s Guide AA–PGZ5A–TE +VXT 2000 Windowing Terminal and DECimage 2000 Option Service EK–VXT20–SV +Information + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 321 + Related Documentation + + + + Software and Service Documentation Part Number + + VXT 2000 Model VX225 Windowing Terminal Service Information EK–VXT15–SV + VXT 2000 Model VX227 Windowing Terminal Service Information EK–VXT17–SV + VRM17 Monitor Service Guide EK–VRM17–SV + VR315 Monitor Service Guide EK–VR315–SV + VR319 Monitor Service Guide EK–VR319–SV + VR320 Monitor Service Guide EK–VR320–SV + VR326 Monitor Service Guide EK–VR326–SV + + + +D.1 Ordering Information + You can order options and documentation by mail, phone, or electronically. For + a list of options, see Appendix E. + Need Help? + If you need help deciding which documentation best meets your needs, please + call 800–DIGITAL (800–344–4825) and press 2 for technical assistance. + Electronic Orders + To place an order through your account at the Electronic Store, dial 800– + 234–1998, using a modem set to 2400 or 9600 baud. You must be using a VT + terminal or terminal emulator set at 8 bits, no parity. If you need help, call + 800–DIGITAL (800–344–4825) and ask for an Electronic Store specialist. + + + + +322 Appendix D + Related Documentation + D.1 Ordering Information + +Telephone or Direct Mail Orders +If You Are +From . . . Call . . . Or Write . . . +U.S.A. DECdirect Digital Equipment Corporation + Phone: 800–DIGITAL P.O. Box CS2008 + (800–344–4825) Nashua, New Hampshire 03061 + FAX: (603) 884–5597 +Puerto Rico Phone: (809) 781–0505 Digital Equipment Caribbean, Inc. + FAX: (809) 749–8377 3 Digital Plaza, 1st Street + Suite 200 + Metro Office Park + San Juan, Puerto Rico 00920 +Canada Phone: 800–267–6215 Digital Equipment of Canada Ltd. + FAX: (613) 592–1946 100 Herzberg Road + Kanata, Ontario, Canada K2K 2A6 + Attn: DECdirect Sales +International – Local Digital subsidiary or approved + distributor + +Digital Personnel +To order hardware or software documentation, contact the U.S. Software +Supply Business group for instructions. For software documentation, request +an Internal Software Order Form (EN–01740–07). + U.S. Software Supply Business + Digital Equipment Corporation + 10 Cotton Road + Nashua, NH, 03063–1260 + DTN: 264–3030 + (603) 884–3030 + FAX: (603) 884–3960 + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 323 + EE + Options + + + This appendix lists the options available from Digital for the VXT 2000 + windowing terminal. For ordering information, see Section D.1. + +E.1 Options + Boards + + Board Part Number + 2 MB memory controller board VX20X–MA + 2 MB memory module MS200–AA + 4 MB memory module MS200–BA + Network board with ThinWire and thickwire connectors VX20D–AA + Network board with twisted-pair and thickwire connectors VX20D–BA + Image board VX20A–OP + + Modems + + Model Description + DF242 Scholar Plus 300, 1200, and 2400 baud, full-duplex asynchronous + DF224 300, 1200, and 2400 baud, full-duplex asynchronous + DF124 300, 600, and 1200 baud, full-duplex asynchronous + + + + +324 Appendix E + Options + E.1 Options + +Cables + +Cable Length Part Number +Network Cables +Thickwire 2 m (6.5 ft) BNE4C–02 +Twisted pair, uncrossed ( | | ) 3 m (10 ft) BN24G–03 +Twisted pair, crossed (x) 3 m (10 ft) BN24F–03 +ThinWire 3.6 m (12 ft) BC16M–12 + 9 m (30 ft) BC16M–30 + T-connector – H8223 + Terminator – H8225 + LAN kit Includes 3.6 m (12 ft) cable, BC16T–12 + T-connector, and terminator + + +Video Cables +Monochrome M–17–02441–01 +Color C–17–02906–02 +Gray scale G–17–02878–01 + + +AC Power Cables +Australia, New Zealand BN20V–2E +Austria, Belgium, Finland, France, Germany, Netherlands, Norway, BN20S–2E +Portugal, Spain, Sweden +Canada BN20P–2E +Denmark BN20U–2E +Ireland, United Kingdom BN20R–2E +Israel BN19U–2E +Italy BN20W–2E +Switzerland BN20T–2E + +For parallel and serial port cables and adapters, contact your Digital sales +representative. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 325 + FF + Specifications + + + This appendix lists general, environmental, and electrical specifications for the + terminal. + Site Planning + Weight Height Width Depth + System box 9 kg 57 mm 394 mm 360 mm + (20 lb) (2.25 in) (15.5 in) (14.17 in) + VRC16 monitor 22.5 kg 432 mm 411 mm 434 mm + (49.6 lb) (17 in) (16.2 in) (17.1 in) + VRM17 monitor 27.2 kg 457 mm 495 mm 452 mm + (60 lb) (18 in) (19.5 in) (17.8 in) + VR315 monitor 13 kg 400 mm 400 mm 391 mm + (29 lb) (15.7 in) (15.7 in) (15.4 in) + VR319 monitor 27.2 kg 457 mm 495 mm 452 mm + (60 lb) (18 in) (19.5 in) (17.8 in) + VR320 monitor 29 kg 457 mm 495 mm 452 mm + (63 lb) (18 in) (19.9 in) (17.8 in) + VR326 monitor 17.2 kg 381 mm 381 mm 396 mm + (38 lb) (15 in) (15 in) (15.6 in) + LK401/LK402 ANSI keyboard 1.4 kg 45 mm 478 mm 191 mm + (3.1 lb) (1.75 in) (18.8 in) (7.5 in) + LK421 Short ANSI keyboard 1.0 kg 51 mm 335 mm 165 mm + (2.2 lb) (2.0 in) (13.5 in) (6.5 in) + + + + +326 Appendix F + Specifications + + +LK443/LK444 PC keyboard 1.4 kg 50 mm 450 mm 180 mm + (3.1 lb) (2.0 in) (18.25 in) (7.25 in) +Mouse Weight Height Width Length + 97 g 32.5 mm 60.9 mm 99.1 mm + (3.4 oz) (1.28 in) (2.4 in) (3.4 in) + +Environment + Operating Storage +Temperature 10° to 40° C –40° to 66° C + (50° to 104° F) (–40° to 151° F) +Relative humidity 10% to 90% 0% to 95% +Maximum wet bulb 28° C (82° F) +Minimum dew point 2° C (36° F) +Maximum altitude 4.9 km (16,000 ft) 9.1 km (30,000 ft) +Electrical +Line voltage (U.S.) 100 V to 120 V ac nominal + 88 V to 132 V rms operating range + single-phase, 3-wire +Line voltage (Europe) 220 V to 240 V ac nominal + 176 V to 264 V rms operating range + single phase, 3-wire +Line frequency 50 Hz to 60 Hz +Input power 80 W maximum +Power cord Detachable, 3-conductor, grounded +Power cord receptacle EIA specified, CEE22-6A +Monitors (Screen Size and Resolution) +Monitor Screen Size Resolution +VRC16 CRT 425 mm (17 in) 100 dots/in +VRM17 CRT 425 mm (17 in) 100 dots/in +VR315 CRT 380 mm (15 in) 108 dots/in +VR319 CRT 495 mm (19 in) 95 dots/in +VR320 CRT 495 mm (19 in) 100 dots/in + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 327 + Specifications + + + + Monitor Screen Size Resolution + + VR326 CRT 381 mm (15 in) 100 dots/in + + LK401 or LK402 ANSI Keyboard + + Item Description + Number of keys 108 sculptured keys with matte finish + Models Available in many language dialects, including English. + Cord 1.8 m (6 ft) coiled cord with a 4-pin telephone-type + modular connector + Indicator lights 2 keyboard indicators: + + Hold + + + Lock + + + + + Keys (Approximate Size) + Home row 30 mm (1.18 in) above desktop + Key size (top) 13 mm (0.50 in) square + Key spacing 19 mm (0.75 in) center to center + (for single-width keys) + Numeric keypad 18 keys + Function keys 5 predefined keys, 15 user-definable keys + + + + Audible Indicators If enabled . . . + Keyclick Sounds after each keystroke. + Margin bell Rings once when cursor approaches right margin + Warning bell Rings for compose errors and certain system messages. + + + + +328 Appendix F + Specifications + + +LK421 Short ANSI Keyboard (UNIX Style) +Item Description +General 74 sculptured keys with matte finish + Available in North American/UK version only +Cord 1.8 m (6 ft) coiled cord with a 4-pin telephone-type + modular connector + + + +Keys Approximate Size or Number +Home row 30 mm (1.18 in) above desktop +Key size (top) 13 mm (0.50 in) square +Key spacing 19 mm (0.75 in) center to center (for single-width keys) +Function keys 5 predefined keys, 15 user-definable keys (including 10 + Extend key sequences, to emulate the full set of ANSI + keyboard keys) + + + +Audible Indicators If enabled . . . +Keyclick Sounds after each keystroke. +Margin bell Rings once when cursor approaches right margin. +Warning bell Rings for compose errors and certain system messages. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 329 + Specifications + + + LK443 or LK444 PC Keyboard + Item Description + Number of keys 101 or 102 sculptured keys with matte finish + Models Available in many language dialects, including English + Cord 1.8 m (6 ft) coiled cord with a 4-pin telephone-type + modular connector + Indicator lights 3 keyboard indicators: + Num Caps Scroll + Lock Lock Lock + + + + Keys Approximate Size + Home row 30 mm (1.18 in) above desktop + Key size (top) 13 mm (0.50 in) square + Key spacing 19 mm (0.75 in) center to center (for single-width keys) + Numeric keypad 17 keys + Function keys 3 predefined key, 16 user-definable keys + + + + Audible Indicators + Keyclick Sounds after each keystroke. + Margin bell Rings once when cursor approaches right margin. + Warning bell Rings for compose errors and certain system messages. + + Mouse + Item Description + Switches Three tactile-feel type switches with an actuating force + of 85 grams (3 ounces) 25% + Surface Nonglare textured finish + Cable 1.5 m (5 ft) round, 0.375 cm (0.15 in) diameter + 6-conductor, number 26 stranded, shielded, high- + flexibility design + Connector 7-pin micro-DIN type (male) + + + + +330 Appendix F + G + G + Setting Up the Work Environment + + + This appendix contains recommendations to protect your health and safety. + +G.1 Proper Setup and Use + Certain recent scientific literature suggests that poor posture, work habits, or + office equipment setup may cause injuries. Other literature suggests that there + is no cause and effect. Because the safety of our users is a great concern, it is + important to take the precautions described in Table G–1. + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 331 + Setting Up the Work Environment +G.1 Proper Setup and Use + + +Table G–1 Recommendations for Proper Setup and Use +Adjust So that . . . +Chair 1 Feet are flat on the floor or footrest, if needed. + 2 Legs are vertical forming a right angle to the floor. + 3 Your weight is off your thighs and your thighs are in a + horizontal position. Keep the back of your knees away + from the seat so you do not compress the area behind + them, which could restrict the blood flow. + 4 Your upper body is erect and your lower back is supported + with a backrest. +Keyboard 5 Your wrists are straight and do not flex more than 15°. + They may be supported but should not rest on sharp + edges. +If you use a mouse, rest your hand on the mouse so your wrist is not on the work surface. Operate +the mouse close to your body’s centerline. + 6 Upper arms are straight down at your sides, elbows + are close to your sides and support your arm weight. + Forearms are at a 70° to 90° angle. +Head 7 Your neck is not strained. Your head should incline + downward, but no more than 15° to 20°. +Terminal 8 The terminal is at eye level and at the correct distance for proper vision. +Eyes 9 You avoid eye fatigue, which can be caused by glare, image quality, + uncomfortable furniture, eye height, and uncorrected vision. If you cannot + read the screen at different distances, you may need special glasses. Relax + your eyes periodically by looking at distant objects. + (continued on next page) + + + + +332 Appendix G + Setting Up the Work Environment + G.1 Proper Setup and Use + + +Table G–1 (Cont.) Recommendations for Proper Setup and Use + + + + + MA–0069–93.IL + + + + + (continued on next page) + + + + + VXT 2000+ /VXT 2000 Windowing Terminal User Information 333 + Setting Up the Work Environment +G.1 Proper Setup and Use + + +Table G–1 (Cont.) Recommendations for Proper Setup and Use + + +Adjust To . . . +Work Take periodic work breaks. Morning, lunch, and afternoon breaks meet +Breaks most recommendations. Take advantage of work breaks to move around + and do other movements. +Lighting Avoid direct lighting or sunlight on the screen, which causes glare and + reflections. Place lighting behind or to the side of your work area, and + distribute the lighting evenly on your work area. Adjust the terminal + brightness and the contrast controls as needed. +Noise Keep background noise at a minimum. Background noise above 65 dBA is + tiring. Sound-absorbing materials, such as curtains, carpeting, and acoustic + tile, can help reduce background noise. +Temperature 20°C to 23°C (68°F to 74°F) + +Humidity 30% to 70% +Ventilation Provide adequate air ventilation for equipment operation and to avoid + fatigue. +Space More than 70 cm (28 in) center to center, preferably more than 152 cm (60 +between in). +terminals + + + Warning + If you experience pain or discomfort while using the terminal, take a + substantial break and review the instructions for posture and work + habits. If the pain or discomfort continues after resuming use of the + terminal, then discontinue use and report the condition to your job + supervisor or physician. + + + + +334 Appendix G + Glossary + + +Accelerator +A key or sequence of keys that provides an alternative to using the mouse. You +can perform all mouse actions from the keyboard, such as displaying menus +and choosing menu items. + +Active window +The terminal window that is ready to accept input. This window displays the +information you type (if the window accepts user input). Only one terminal +window can be active at a time. + +ANSI +American National Standards Institute + +ANSI keyboard +Digital’s standard keyboard, with a main keypad, editing keypad, numeric +keypad, and top-row function keys. Compare to Short ANSI keyboard. + +Application launcher +In VXT software, a utility that allows terminal users to start applications +residing on a host system, for display on the terminal. The terminal user +connects to the host system, runs the application launcher, then enters a +command to launch the desired host application. + +ASCII +American Standard Code for Information Interchange. A set of 7- or 8-bit +binary numbers representing the alphabet, punctuation, numerals, and other +special symbols used in text representation and communications protocol. + + + + + Glossary 335 + Application + A program that performs a specific task. + + Background process + A process that does not require the total attention of the computer for + operation. Background processing enables the operating system to execute + more than one program or command at a time. As a general rule, all clients + should run as background processes. + + BDF + Bitmap distribution font format + + Boot + To bring a device or system to a defined state where it can operate on its own. + + CCITT + Comite Consultatif International de Telegraphique et Telephonique + (International Telegraph and Telephone Consultative Committee). A standards + committee for the communication industry in Europe. + + Configuration manager + In VXT software, a set of windows and dialog boxes that system managers use + to centrally manage terminals and InfoServer font sets for terminals. System + managers can place server-based terminals in work groups that share settings. + + Character set + A group of graphic characters and control characters stored as a unit in the + terminal. Graphic characters are characters you can display on the screen. + Control characters perform special functions. + + Check buttons + A group of square toggle buttons that provide different settings for an option. + You choose one button from the group. + + Click + To press and release a mouse button. The term comes from the fact that + pressing and releasing the buttons of most mice makes a clicking sound. + + Client + A program written specifically for X windows. Clients make their own windows + and know how to resize and minimize themselves. + + +336 Glossary + Compose character +A character produced by pressing two or three keys in sequence, starting with +the Compose Character key or a diacritical mark key. You can use compose +sequences to produce characters that do not appear as standard keys on your +keyboard. + +Computer system +A combination of system hardware, software, and external devices that +performs operations and tasks. + +Cursor +A blinking line or block on the screen that indicates the active position. + +Customizations +In VXT software, the set of customized operating settings for a terminal or +work group. Customizations are stored in a resource file. + +Data processing keys +Keys that have three or four characters on the top of their keycap. The +characters on the right half of the keycap are data processing characters. To +use data processing characters, you must choose the data processing version of +your keyboard in the Customize Keyboard dialog box. + +DECconnect cabling +Digital’s cabling system for extending Ethernet and terminal interconnections +into offices and work areas. + +DEC Multinational character set +The default character set for the terminal. The DEC Multinational set is one +of two 8-bit sets built into the terminal. The other set is ISO Latin-1. Both +8-bit sets include the standard ASCII character set and a supplemental set. +For 7-bit environments, see National replacement character sets. + +DECnet software +Digital’s networking software that runs on nodes in both local and wide area +networks. + +DEC OSF/1 operating system +Digital’s implementation of the Open Software Foundation technology, with the +Motif graphical user interface and programming environment. + + + + + Glossary 337 + DECterm + Digital’s VT series terminal emulator. VXT 2000 windowing terminals let + users create DECterm sessions on host systems. + + Default option + A push button with a double outline, indicating the most frequently used + setting for a window. You can choose a default option by pressing Return or + clicking on the push button. + + Default setting + A standard setting for one of the terminal’s operating features, set at the + factory. The terminal uses factory-default settings, unless you choose a new + setting. + + Device icon + An icon on the back of the system box that identifies the device that can be + plugged into the connector. + + Diacritical marks + Marks or symbols that indicate a change in the standard pronunciation of a + letter. Examples of diacritics are acute accent (’), grave accent (‘), and tilde (~). + On the terminal, you can use diacritical marks (if available on your keyboard) + to start two-stroke compose sequences. + + Double click + To press and release a mouse button twice in rapid succession. + + Drag + To press and hold down a mouse button while moving the mouse on the + desktop and the pointer on the screen. Typically, dragging is used with menu + selecting, and window moving and resizing. + + Ethernet + A type of local area network, based on Carrier Sense Multiple Access + with Collision Detection (CSMA/CD). A communication concept for local + communication networks that use coaxial cable. + + + + +338 Glossary + Filter rectangle +A bounded area used defined on the screen. To activate the filter, you define its +coordinates with a control function. If the terminal detects that the locator is +outside the filter rectangle, the terminal sends an outside rectangle event and +disables the rectangle. + +Font +A font is a set of character images in a particular typeface and style. For +example, Times Roman bold is a font. + +Font path +A logical file that lets a device access alternate character fonts for certain X +window applications. + +Full-duplex modem +A modem that can handle simultaneous, two-way communications. + +Graphics +The use of lines, figures, shapes, and shaded areas to display information. + +Graphics tablet +An optional device used to move the graphics input cursor on the screen and to +enter data to an application program. Most tablets have three parts: a tablet, +stylus, and puck. To move the cursor you move the puck or stylus across the +tablet. Also known as a locator device. + +Group code +A number that represents a host or group of hosts on a LAT network. + +Hardware +The physical equipment—mechanical and electrical—that make up a system. +Compare to Software. + +Hardware Ethernet address +The unique Ethernet physical address associated with a particular Ethernet +communications controller. + +Host-based terminal +A terminal that uses its own memory to operate VXT software. By default, +host-based terminals also use their own memory to store their customizations +in a native resource file. Compare to server-based terminal. + + + Glossary 339 + Host-based resource file + A file created by a system manager or user to store customizations for a + terminal or group of terminals. The file is stored on a host system; terminals + can access the file using the NFS or TFTP protocols. Compare to native + resource file. + + Host system + A computer system that has an active connection to your terminal. The + primary or controlling computer in a multiple-computer network. + + Icon + A small graphic representation of an object, usually an application. A window + can be shrunk to an icon (or minimized) to save room on the workspace. + + InfoReader + A library of online documentation provided with VXT software kits for + InfoServer systems. VXT 2000 windowing terminal users access the library + from the Getting Started menu in the Terminal Manager window. + + InfoServer + A high-performance virtual disk server that can efficiently download the VXT + system image software to many terminals. + + Internet + A collection of networks that includes the ARPAnet, a number of local networks + at universities and research institutions, and many military networks. See + TCP/IP. + + IP address + A unique network address that identifies a device on the TCP/IP network. + + ISO + International Standards Organization. ISO Latin-1 is one of the two 8-bit + multinational character sets built into the terminal. The other set is the DEC + Multinational set. For 7-bit environments, see National replacement character + sets. + + Kilobyte (KB) + When referring to memory, 1024 bytes. + + + + +340 Glossary + LASTport group code +A number from 0 to 1023 assigned to an InfoServer system. The InfoServer +only communicates with systems that belong to the same group code. + +LAT protocol +A network protocol created by Digital for local area network communication. + +LAT address +A network address that identifies the location of a device on the LAT network. + +LED +Light-emitting diode. LEDs are used as indicators on the keyboard. + +Local area network (LAN) +A high-speed communications network that covers a limited geographical area, +such as a section of a building, an entire building, or a cluster of buildings. + +Locator device +See pointing device. + +Local terminal +A terminal from which the configuration manager is being used to manage +other terminals and work groups. + +Matte +An optional decorative border between the window frame and the work area. + +Maximize button +A button that lets you increase the size of the window to its maximum +allowable size. The maximize button is at the right edge of a window’s title +bar. + +Megabyte (MB) +When referring to memory, 1024 kilobytes or 1,048,576 bytes. + +Menu bar +The area below a window’s title bar that lists the names of pull-down menus +for the window’s application. + + + + + Glossary 341 + Minimize button + A window button that lets you shrink a window to an icon. The minimize + button is to the left of the maximize button. + + Mnemonic + An underlined character in a menu. Mnemonics allow you to display menus + and choose functions by typing letters on your keyboard. + + Modem + Modulator - demodulator. A device that converts data from a computer or + terminal into signals that can be sent over a telephone line and back again. + + Modifier key + A key pressed in combination with another key, to modify the code sent by that + key. Ctrl is a modifier key. + + Monochrome monitor + A video screen that displays images in shades of one color. + + MOP + Maintenance operation protocol. A network management protocol within + DECnet software that handles tasks such as downloading, upline dumping, + and circuit testing. + + Mouse + A handheld pointing device used to select menu options and draw graphics. + Moving the mouse across the desktop moves the pointer or mouse cursor on + the screen. The mouse has three buttons that serve as function keys. + + National replacement character sets (NRCs) + Seven-bit character sets for many Western European languages. Each set + has 94 characters. NRC sets are similar to the ASCII set, except for a few + characters. + + Native resource file + In VXT software, the file that stores a terminal’s customized settings, entered + from the terminal’s dialog boxes or from the configuration manager of another + terminal. Host-based terminals store their native resource file in the terminal’s + nonvolatile memory. Server-based terminals store their native resource file on + an InfoServer system. Compare to Host-based resource file. + + + + +342 Glossary + Network +Two or more computers linked by communication lines to share information or +resources. + +NFS +A network protocol developed by Sun Microsystems, Inc. The VXT 2000 +windowing terminal can use NFS to access fonts or host-based resource files on +host systems. + +Node +A computer, workstation, or peripheral device that is connected to a network +and can communicate with other members of the network. + +Nonvolatile memory +Random access memory (RAM) that does not lose its contents when you turn +the terminal off. The terminal uses this memory to store your saved customize +settings. + +OpenVMS operating system +Digital’s proprietary operating system. + +PC keyboard +Digital’s LK443 or LK444 PC keyboard. The LK443 is a worldwide model, with +102 keys. The LK444 is a North American model, with 102 keys. + +Pixel +Picture elements. The smallest displayable unit on a video screen. To display +a character, the terminal turns on a series of pixels. + +Pointer +A graphic symbol indicating a screen position. You control the pointer location +by moving the mouse. You can change the pointer shape; an application may +also change the pointer’s shape to indicate the type or state of an action. + +Port +A means for connecting one device to another. Usually, each port has an +associated connector. + +Prefix key +A key that you press and release before pressing another key, to change the +function of one or more keystrokes. Compose Character is a prefix key. + + + Glossary 343 + Pull-down menu + A menu accessed by pointing to the menu bar and pulling down with the + mouse. Pull-down menus are generally organized by the types of functions + they contain. + + Push button + A control that causes an immediate action. To press a push button on the + screen, point to it then click the select button. + + Radio buttons + A group of option buttons that allow you to select only one of the selections at + a time. Radio buttons may appear in a menu or in a program’s window. Radio + buttons are usually displayed as small diamond-shaped buttons. + + Random access memory (RAM) + Memory that can be read from and written to. The terminal uses this memory + to store instructions of programs currently being run. + + Read-only memory (ROM) + Memory that can be read from, but not modified. The terminal uses ROM + memory to store its operating code. + + Read-only terminal + A terminal that cannot save new customized settings. It belongs to a work + group that does not allow the saving of new settings. + + ReGIS software + A serial geometric graphics display protocol created by Digital. + + Resize border + The resize border surrounds a window and is divided into eight handles—one + for each side, and one for each corner. + + Restore + To change an icon back into its original window. + + Resource file + In VXT software, the file that stores the customizations for a terminal or work + group. See Host-based resource file and Native resource file. + + + + +344 Glossary + Scroll bar +A vertical or horizontal bar that lets you control what portion of a larger object +is displayed within a window. The slider represents the relative position in +the list. The size of the slider represents the relative portion of the list that is +currently visible. + +Scrolling +Moving information on the screen upward or downward to display more data. + +Select button +The mouse button used for most operations, also known as mouse button 1 +(MB1). By default, the select button is the left mouse button. + +Server +Hardware or software that provides a specific set of services to a client. + +Server-based terminal +In VXT software, a terminal that uses an InfoServer system to load its VXT +software and provide memory paging services. By default, a server-based +terminal also stores its customizations on the InfoServer, in a native resource +file. Compare to host-based terminal. + +Service +A name that represents a host or cluster of hosts that provides access to that +host or cluster. + +Session +An active connection between the terminal and the host system. + +Short ANSI keyboard +A compact version of Digital’s ANSI keyboard, for those who make little use of +auxiliary editing and numeric keypads. An Extend key allows users to perform +keypad keystrokes when needed. + +Sixel +A vertical column of six pixels. Screen displays can be printed in the form of +sixel graphics. + + + + + Glossary 345 + Slider + Part of a scroll bar that lets you scroll through information in a window. The + size of the slider indicates how much of a file is currently displayed. The + smaller the slider, the larger the file. The location of the slider in the scroll + region indicates your relative position in the file. + + Software + Programs that perform a chosen or required function. Compare to Hardware. + + Stepping arrow + Part of a scroll bar that lets you move incrementally through information in a + window. + + Submenu + A menu associated with a menu item on a pull-down or pop-up menu. When + you choose the menu item, you display the submenu. + + Sun style keyboard + Digital’s LK460 keyboard. The Sun style keyboard comes in a North American + model only. + + System + A combination of hardware, software, and peripheral devices that perform + specific processing operations. + + System image + The VXT software, downloaded from a host system or server. + + System manager + A person who performs tasks necessary to operate and maintain the system. + See VXT manager. + + TCP/IP + Transmission control protocol/Internet protocol. The standard wide area + networking software for the ULTRIX and UNIX operating systems. TCP/IP + is a set of protocols developed by researchers centered around the Advanced + Research Projects Administration Network (ARPAnet). + + Terminal Manager window + In VXT software, the window for creating and managing sessions, customizing + terminal settings, and performing local printing functions. + + +346 Glossary + Terminal server +An intelligent unit that can connect a number of asynchronous devices +(terminals and printers) to a host system. For example, Digital’s DECserver +200 can link eight terminals to a system in a local area network (LAN), using +a high-speed Ethernet cable. + +Terminal window +A window that emulates a video terminal. Terminal windows allow you to use +applications that were designed for the video terminal they emulate. + +Terminator +A connector used on one or both ends of an Ethernet segment that provides the +50-ohm termination resistance needed for the cable. + +TFTP +Trivial file transfer protocol. The Internet standard protocol for file transfer +with minimal capability and minimal overhead. TFTP is intended for use +in application environments that do not require complex interaction among +clients and servers. + +ThinWire Ethernet network +A term to describe Digital’s 10base2 (IEEE standard 802.3 compliant) Ethernet +products used for local distribution of data. + +Title bar +An area at the top of the window frame that displays the name of the +application and provides window management buttons. + +Toggle buttons +See Check buttons. + +Transcript +An area of memory that contains the last saved lines of your screen display. + +transport +The network software that routes user data to its destination and controls the +flow of data. + +ULTRIX operating system +A UNIX based operating system created by Digital. + + + + Glossary 347 + UNIX operating system + An operating system created by AT&T and in wide use. + + Unregistered Terminals work group + A work group supplied on a newly installed InfoServer, to let terminals operate + until they are registered (created) in a work group you have created. The + Unregistered Terminals work group is preconfigured with factory-default + settings that are read-only. + + User-defined keys (UDKs) + Keyboard keys that a user can define to perform specific functions. + + Visual character attribute + A quality of a display character that highlights the character, such as bolding + and underlining. + + VXT launcher + See Application launcher. + + VXT manager + The person who manages the VXT system, work groups and the network. This + person assigns unique node names and addresses for each terminal on the + network, and provides administrative assistance to network users. + + Window + An area on your monitor screen that represents all or part of an application. + + Window frame + The resize border and title bar surrounding a window. + + Window manager + The window manager controls the size, placement, and operation of windows + in the workspace. The terminal’s Motif window manager includes the window + frames that surround each window object as well as the workspace menu. The + Motif window manager is a client program of the X Window System. + + Window menu + A menu that lets you control the size, shape, and position of a window. To + display the menu, you use the window menu button. + + + + +348 Glossary + Window menu button +The button at the left corner of a window’s title bar. Clicking MB1 on the +window menu button displays the window menu. + +Window system +A windowing architecture that allows the execution and display of applications +to be independent. Specific components of the architecture control the display +of applications and determine how applications run. Since its introduction by +MIT, the X Window System has become an industry standard. + +Work area +The area in a window where you can perform user tasks. + +Work group +A customization file and a set of terminals that share the file. Each work +group is assigned to a particular support server. + +Workspace +The monitor screen, where all windows are displayed. + +Workspace menu +A pop-up menu with items for arranging windows and customizing the window +manager. To display the workspace menu, point to anywhere in the workspace +and click MB1 or MB3. You can also display the workspace menu from the +window menu. + +XIE +X image extension. An extension to the X core protocol that handles image +functions. XIE enables compressed image data to be sent across the X wire +and image processing to be handled at the X server. + + + + + Glossary 349 + Index + +8-Bit Multinational Characters button ANSI keyboard, 247 to 255 + (DECterm), 153 editing keypad, 250 +7-Bit NRC Characters button (DECterm), figure, 248 + 153 function keys, 249, 251 +7-Bit NRCS Selection Options dialog box main keypad, 248 + (DECterm), 156 numeric keypad, 251 + Answerback message +A sending, 252 + Answerback Message box (DECterm), 154 +Accelerator keys, 206 + Any Host button (TM), 18 +Additional characters, 282 to 292 + Any Host Indirect button (TM), 19 + canceling a sequence, 286 + Application + hexadecimal sequences, 286 + font problems, 299 + invalid sequences, 285 + moving between applications, 199 + table, 288 + starting, 14 +Address + Application Cursor Keys button (DECterm), + Ethernet, 126 + 152 +Adjust Video Centering (TM) + Application Keypad button (DECterm), 152 + VX227 terminal, 60 + Application launcher, 237 +Adjust Video Rotation (TM) + command arguments, 238 + VX227 terminal, 60 + running +Allow All Connections button + OpenVMS systems, 238 + VXT EX, 245 + UNIX systems, 237 +Alt key, 218 + Application launching, 232 to 241 + Alt A key, 159 + host application, 236 + Alt Graph key (Sun), 272 + remote application, 240 +Alt key (PC), 262 + rsh commands, 241 + North American model, 262 + VXT application, 233, 241 +Alt key (Sun), 272 + Apply button, 40 + Alternate Shift key (German), 250 + VXT DECterm options, 140 +AltGr key (PC), 262 + Arrow keys, 250 +< > keys, 155 + function, 152 + ,< . > keys, 156 + PC keyboard, 263 + short ANSI keyboard, 258 + Sun style keyboard, 272 + + + + + Index–1 + Arrow keys (cont’d) Booting the terminal (cont’d) + to move pointer, 206 reboot commands, 99 +Audible indicators, 254 secondary boot file, 107 + PC keyboard, 264 using the XIE option, 107 + short ANSI keyboard, 260 VXT software + Sun style keyboard, 273 from VXT EX Options dialog box, +Authorizing hosts 246 + TCP/IP, LAT, or DECnet connections, 50 Bootstrap history +Authorizing users, 50 clearing, 303 +Auto print mode Border color settings + selecting, 251 window manager, 220 to 221 +Auto Print Mode button (DECterm), 159 Border settings +Auto Repeat button (DECterm), 155 window manager, 218 to 219 +Auto Repeat button (TM), 43 Break key +Auto Resize Terminal button (DECterm), See F5 key + 144 Browser color model, 313 +Auto Resize Window button (DECterm), 144 +Auto Wrap button (DECterm), 149 +Autostart feature C + Customize AutoStart dialog box (TM), 95 Cables +AutoStart feature, 24 part numbers, 325 + entering settings, 95 Cancel button, 40, 216 + VXT DECterm options, 140 +B Cancel Printing (DECterm), 136 + Caps Lock key (PC), 262 +Backarrow key (PC), 262 Caps Lock key (Sun), 271 +Background color (WM), 221 Center Image button (TM), 49 +Backing Store button (DECterm), 157 Character format +Backing Store button (TM), 93 serial communication, 68 +< x Backspace button (DECterm), 156 Character sets + Backspace key (PC), 262 +  + + + + + overview, 10 + Backspace key (Sun), 271 +  + + + + + typing additional characters, 283 +Batch Scroll Lines box (DECterm), 150 VXT 3270 window +Baud rate translation table, 193 + serial communication, 68 VXT DECterm window +Bell, 254, 255, 264, 273 7-bit NRC sets, 156 +Bell volume, 42 choosing a multinational set, 152 +Big Font button (DECterm), 145 selecting 8-bit or 7-bit, 153 +BIND name servers, 74 Check button +Booting the terminal, 98 to 110 defined, 209 + BOOT commands, 108 Clear Communications menu item + Customize Boot dialog box (TM), 105 (DECterm), 133 + error codes, 302 Clear Display menu item (DECterm), 133 + from a remote node, 107 + MOP trigger, 107 + primary boot file, 106 + + + +Index–2 + Clear Lines Off Top menu item (DECterm), Compose Character key (ANSI), 250, 284 + 133 Compose sequences, 284 +Clicking Composing characters + defined, 196 See Additional characters +Clientless VXT software, 4, 242 Conceal Answerback Message button +Close button (WM) (DECterm), 154 + using, 204 Condensed font setting (DECterm), 144 +Color Configuration manager, 85 + customizable features, 306 customizing the terminal, 8 + eyedropper, 309 identifying terminals, 59 + interpolator, 309 Confirm Close Terminal Manager button + mixing colors, 306 (TM), 58 + monitor setting, 94 Confirm Reset Session button (TM), 58 + paint buckets, 309 Connections Allowed button (TM), 50 + printing, 49 Control key (Sun), 271 + smearing colors, 309 Copy menu item + tiles, 309 VXT 3270 window, 171 +Color map entries, 157 VXT DECterm window, 130 +Color mixing Copying text + scratch pad, 314 disabled by some applications, 132 +Color Mixing dialog box, 307 extending selected text, 132, 173 +Color models, 307 host synchronization, 130 + browser, 313 selecting text + grayscale, 314 VXT 3270 window, 171 + HLS, 310 VXT DECterm window, 131 + picker, 307 using the keyboard only, 173 + RGB, 312 VXT 3270 window, 171 +Color systems VXT DECterm window, 130 + customizing window colors, 221 Create dialog box, 14 +Comma key, 156 Create menu (TM), 14, 23 +Commands menu (DECterm), 133 Creating sessions +Communication problems, 298 + See also Serial communication Creating sessions and applications, 14 to 24 + breaking serial, 252 Getting Started menu, 36 + DECnet settings, 81, 82 Ctrl key (ANSI), 249 + font problems, 299 Ctrl key (PC), 262 + InfoServer systems, 71 Cursor + LAT settings, 69 blinking or steady, 149 + network problems, 298 block or underline, 150 + NFS mount points, 78 text, 149 + serial and parallel ports, 66 VXT 3270 window, 168 + TCP/IP settings, 73, 74, 76 Cursor Blink button (DECterm), 149 +Communications submenu (TM), 65 Cursor Blink button (TM), 43 + + + + + Index–3 + Cursor keypad mode (PC), 263 Customize menu (TM) (cont’d) + font path, 86 +Customer service + keyboard settings, 41 + See Service + LASTport group code settings, 71 +Customize Font Path dialog box (TM), 88 + LAT settings, 69 +Customize menu (message box), 61 + NFS mount points, 78 +Customize menu (TM), 39, 85 + parallel port settings, 66 + AutoStart settings, 95 + pointer and mouse settings, 45 + basic settings, 38 to 61 + resource files, 113 + communication settings, 64 to 83 + Resource files, 113 + configuration management, 85 + saving the Terminal Manager window, 61 + Configuration submenu, 86 + screen background settings, 52 + Customize AutoStart dialog box, 95 + security settings, 50 + Customize Boot dialog box, 98, 105 + serial port settings, 66 + Customize DECnet dialog box, 81 + system settings, 84 to 113 + Customize DECnet Name Translator + TCP/IP Name Server settings, 74 + dialog box, 83 + TCP/IP routing table settings, 76 + Customize Font Path dialog box, 88 + TCP/IP settings, 73 + Customize Keyboard dialog box, 41 + video alignment, 60 + Customize Language dialog box, 44 + video alignment dialog box, 60 + Customize LASTport dialog box, 72 + window color settings, 54 + Customize LAT dialog box, 70 + X server, 93 + Customize NFS dialog box, 78 + Customize Message Box (TM), 63 + Customize Pointer dialog box, 45 + Customize Message dialog box (TM), 61 + Customize Print Screen dialog box, 48 + Customize NFS dialog box (TM), 78 + Customize Screen Background dialog box, + Customize Software Options (TM), 111 + 52 + Customized settings + Customize Security dialog box, 50 + DECwindows Customize utility, 9 + Customize Serial and Parallel Ports dialog + from a host system, 9 + box, 66 + overview, 7 + Customize Software Options dialog box, + problems + 110, 111 + cannot change settings, 300 + Customize TCP/IP dialog box, 73 + resource file, 7 + Customize TCP/IP Name Server dialog + terminal manager, 38, 64, 84 + box, 75 + VXT 3270 windows, 180 + Customize TCP/IP Routing Tables dialog + VXT DECterm windows, 138 + box, 77 + window manager, 213 + Customize Terminal Manager dialog box, + 57 + Customize Window Color dialog box D + color, 55 Data processing keys, 42 + monochrome, 54 ANSI keyboard, 253 + Customize X Server dialog box, 93 DEC OSF/1 AXP operating system + DECnet Name Translator settings, 82 NFS mount points, 78 + DECnet settings, 81 + display language, 44 + + + + +Index–4 + DEC OSF/1 AXP system Default Message Box Window (TM), 63 + print command, 35 Default options + quitting a remote session manager, 28 choosing, 210 + TCP/IP Name Server settings, 74 Default Terminal Manager Window (TM), 61 + TCP/IP printer port setup, 68 < x Delete button (DECterm), 156 + TCP/IP routing table settings, 76 < x delete key, 156 + TCP/IP settings, 73 < x delete key (ANSI), 249 +DECnet address, 16 Delete key (Sun), 273 + checking, 127 Determine IP Address (TM), 74 + entering, 82 Diacritical keys, 283 +DECnet session Diagnostic messages + entering a host name or DECnet address, VXT Message Box, 13 + 16 Dialog boxes + starting, 16 description, 208 +DECnet terminal window making changes, 210 + AutoStart, 95 options menus, 208 + ending, 28 Digital manuals +DECnet transport See Related documentation + Customize DECnet dialog box (TM), 81 Dimmed items, 210 + Customize DECnet Name Translator Disable F3 Key (TM), 58 + dialog box (TM), 83 Display Cursor button (DECterm), 149 + enabling, 81 Display Options dialog box (DECterm), 148 + name translator address Display Scaling (TM), 94 + primary, 83 Dithering, 49 + secondary, 83 Documentation, 321 + Name Translator settings, 82 online, 4, 36 + network buffer size ordering, 322 + entering, 82 Domain name, 76 + security, 50, 51 Double clicking + settings, 81 defined, 196 + terminal’s DECnet address, 12 Dragging +DECnet X session + See also Pointer shapes + AutoStart, 95 + defined, 196 + ending, 28 + Dynamic Routing button (TM), 77 +DECnet/SNA gateway, 161 +DECterm window + customizing, 8 E +DECterm windows EBCDIC translation table, 193 + See VXT DECterm windows Echoing data, 152 +DECwindows Edit menu + keyboard setting, 42 VXT 3270 window + overview, 7 format, 171 +Default button, 216 Select All, 171 + VXT DECterm window + format, 130 + + + + + Index–5 + Edit menu + VXT DECterm window (cont’d) + Select All, 131 F +Editing F1 (Hold) key (ANSI), 251 + VXT 3270 window, 170 F2 (Print) key (ANSI), 251 +Editing keypad F3 key + ANSI keyboard, 250 hiding the Terminal Manager window, 58 + used as a mouse, 250 F5 (Break) key, 154 +Electrical specifications, 327 F5 (Break) key (ANSI), 252 +Ending a session, 27 Factory-default settings +Enet address, 126 restoring, 303 +Enter Connection Parameters dialog box File menu (DECterm), 137 + (3270), 163 Finish Printing (DECterm), 136 +Enter key (ANSI), 251 Font +Enter key (PC), 262 problems, 299 +Return key (Sun), 271 scaling the display of, 94 +Environmental specifications, 327 VXT DECterm window, 144, 145 +Error codes custom fonts, 146 + booting, 302 Font manager + NFS, 300 enabling or disabling use of, 112 +Error messages, 302 Font path + See Diagnostic messages activating, 87 + displaying, 62 checking, 126 +Errors directory, 89 + Ethernet, 121 entering, 88 + LASTport protocol, 121 errors, 92 + LAT protocol, 118 font source, 88 +ESC character, 155 NFS, 90 +Esc key (PC), 263 removing, 89 +Esc key (Sun), 271 TCP/IP, 91 +Escape key, 155 TFTP, 90 +Ethernet transport, 88 + displaying errors and counters, 121 Font server +Ethernet address, 126 TCP/IP font path, 91 + hardware address, 12 Fonts + when using DECnet, 12 font path settings, 86 to 92 +Ethernet Counters dialog box (TM), 120 Foreground color (WM), 221 +Ethernet problems, 298 Form Feed Terminator button (DECterm), +Ext key 158 + location, 176 Function keys, 258 +Extend key (short ANSI), 256, 257 ANSI keyboard, 249, 251 + PC keyboard, 263 + + + + +Index–6 + Host-based terminals + loading VXT software, 100 +G Host-based window manager, 57 +General Options dialog box (DECterm), 150 HP–UX operating system +German Standard Font button (DECterm), IP X session, 18 + 145 print command, 35 +Getting Started menu + figure, 36 +Getting Started menu (TM), 36 I +Graphics Options dialog box (DECterm), 157 IBM AIX operating system +Graphics printing button (DECterm), 159 print command, 35 +Gray scale Icon box + monitor setting, 94 saving the size and location of, 222 + printing, 49 Icon color settings +Grayscale color model, 314 window manager, 223 to 224 +Group code Icon Name button (DECterm), 145 + entering, 71 Icon settings + Group Shift key (German), 250, 285 window manager, 221 to 223 + Icons, 201 + customizing colors of, 224 +H displaying the icon box, 222 +Hebrew keyboard labels and images, 223 + Customize Keyboard Type (TM), 41 location of, 222 +Hebrew language making a window active, 218 + Customize Language dialog box (TM), 44 rearranging, 202 +Hexadecimal key sequences, 286 restoring, 93, 157 +Hiding restoring windows, 203 + Terminal Manager window, 58 size, 222 + VXT Message box, 58 stacking, 205 +HLS color model, 310 Icons (DECterm) +Hold key selecting icon names, 145 + See F1 key Image accelerator board +Horizontal Cursor Coupling button functions, 317 + (DECterm), 149 Indicator lights, 254 +Horizontal Scroll Bar button (DECterm), InfoReader library, 4 + 149 accessing, 36 +Host applications enabling or disabling use of, 112 + See Remote applications InfoReader Library dialog box, 37 +Host Preconfigured button (TM), 106 InfoServer system, 3 +Host status line, 149 defined, 3 +Host-based software, 3 font path, 89 + font path fonts + checking, 126 for VXT DECterm window, 146, 147 + monitoring memory usage, 6 LASTport group codes, 71 + name, 125 + + + + + Index–7 + Input focus Keyboard (cont’d) + giving a window, 199 VXT 3270 window, 184 +IP address, 17 warning bell, 155 + checking, 126 Keyboard model + domain name, 76 setting, 41 + entering, 73, 74 Keyboard Options dialog box (DECterm), + entering an indirect address, 19 154 + formats, 18 Keyboard settings (TM), 41 to 43 + primary name server, 75 Keyclick, 254, 255, 264, 273 + reading from a host, 74 volume slide bar, 42 + secondary name server, 76 Keys +IP subnet mask repeating, 43 + entering, 74 +IP transport L + for loading VXT software, 100 +IP X session LA printers + AutoStart, 95 print settings for, 49 + limit, 17 Language + quitting, 28 Customize Language dialog box (TM), 44 + display, 44 + keyboard, 41 +J LASTport group code +Janus-faced keys, 263 entering, 72 + LASTport transport + Customize LASTport dialog box (TM), 72 +K displaying errors and counters, 121 +# £ key (short ANSI), 259 font path, 89 +Key bindings, 227 group code settings, 71 +Keyboard LAT Counters dialog box (TM), 118 + ANSI keyboard, 247, 248 LAT session + auto repeat feature, 155 starting, 15 + Customize Keyboard dialog box (TM), 41 LAT terminal window + indicator lights, 254 AutoStart, 95 + launching applications creating, 28 + local, 235 LAT transport + remote, 240 circuit timer, 70 + local echo, 152 Customize LAT dialog box (TM), 70 + PC keyboard, 260 displaying errors and counters, 118 + PC keycodes, 266 to 269 font path, 91 + problems, 295 font paths, 88 + short ANSI keyboard, 255 keep alive timer, 71 + specifications, 326, 328, 329, 330 printing from a host, 68 + Sun keycodes, 274 to 277 retransmit timer, 71 + Sun style keyboard, 270 security, 50, 51 + UNIX keyboard, 255 settings, 69 + terminal’s LAT address, 12 + + + +Index–8 + LAT transport (cont’d) Menu bindings, 227 + tuning performance, 69 changing or adding, 229 + VXT EX security, 245 Menus +LAT X session displaying from the keyboard, 206 + AutoStart, 95 overview, 206 + ending, 28 pop-up menus, 207 +Launching pull-down menu, 206 + applications, 232 Message Box, 13 + sessions, 232 AutoStart, 95 +Lights Customize menu, 61 + See Indicator lights displaying, 63 +List Known Hosts button (TM), 19 Message Box (TM) +Listed Users Only button (TM), 51 booting software option, 112 +Little Font button (DECterm), 145 Message region +Local Echo button (DECterm), 152 scroll lines saved, 62 +Lock key (ANSI), 249 title, 62 +Lock key (short ANSI), 257 Messages +Lock Key State (TM), 43 controlling displays, 61 +Lock UDKs button (DECterm), 152 displaying, 62 +Lock User Features button (DECterm), 152 pause prompt box, 59 +Lower button (WM) Metric button(TM), 78 + using, 204 Minimize button (WM) +lp command, 35 using, 201 +lpr command, 35 Mnemonic, 206 + Modem Control buttons (TM), 69 + Modems +M breaking communication, 252 +Managing terminals, 85 part numbers, 324 +Margin bell, 255, 264, 273 Modified ISO-Latin Character Set +Margin Bell button (DECterm), 155 figure, 193 +Matte Monitor + customizing, 225 color, 94 +Matte settings gray scale, 94 + window manager, 225 to 226 problems, 294 +Maximize button (WM) Monitors + using, 200 specifications, 326, 327 +MB3 pop-up menu (3270), 178 MOP Boot File box (TM), 106 +Memory MOP transport + clearing, 6 for loading VXT software, 100 + controller board, 5 MOP trigger + memory modules, 5 for rebooting the terminal, 107 + monitoring the use of, 123 Motif window manager + monitoring usage, 6 AutoStart, 95 + requirements, 5 restarting, 23 + size, 127 + + + + + Index–9 + Motif Window Manager (TM) No Form Feed button, 49 + booting software option, 111 Nonselectable items, 210 +Mounting files Normal Cursor Keys button (DECterm), 152 + errors, 300 Normal font setting (DECterm), 144 +Mouse Normal Print Mode button (DECterm), 159 + See also Using scroll bars Num Lock key (Sun), 272 + button layout, 46 Number generator mode (PC), 263 + buttons defined, 195 Number generator mode (Sun), 272 + double click timeout, 47 Number of Bit Planes button (DECterm), + editing keypad, 250 158 + figure, 196 Numeric keypad + pointer acceleration, 46 ANSI keyboard, 251 + problems, 295 PC keyboard, 263 + settings, 45 Sun style keyboard, 272 + specifications, 327, 330 VXT 3270 window, 175 + using, 195 Numeric Keypad button (DECterm), 152 + using the editing keypad as a mouse, 252 +Mouse button bindings, 227 +Move button (WM) + O + using, 203 OK button, 40, 216 +Multinational character sets, 152 VXT DECterm options, 140 +Multiple VXT Launchers, 237 Online documentation, 4, 36 + Open Look window manager, 29 + fonts +N host system, 31 +Name server, 74 InfoServer system, 31 +National replacement character sets, 156 setup, 29 +Network OpenVMS operating system + monitoring network utilization, 123 DECnet Name Translator settings, 82 + problems, 298 DECnet settings, 81 + routes LAT settings, 69 + TCP/IP, 117 print command, 35 + status, 28, 114 Option settings + TCP/IP routing tables, 77 VXT DECterm +Network address, 12 recalling, 141 +Network buffer size Options + DECnet, 82 ordering, 322 +Newline button (DECterm), 151 part numbers, 324 to 325 +NFS mount points scroll box (TM), 79 viewing installed options, 127 +NFS transport VXT DECterm window, 138 to 160 + error codes, 300 Options button (TM), 245 + font path, 90 Options menu (DECterm), 135, 139 + mount points, 78 7-BIT NRCS Selection Options dialog box, + 156 + Display Options dialog box, 148 to 150 + + + + +Index–10 + Options menu (DECterm) (cont’d) Pasting text + General Options dialog box, 150 to 154 host synchronization, 130 + Graphic Options dialog box, 157 to 158 Quick Copy, 132, 172 + Graphics Options dialog box, 157 remote DECterm windows, 132, 172 + Keyboard Options dialog box, 154 to 156 VXT 3270 window, 171, 172 + Printer Options dialog box:, 158 to 160 VXT DECterm window, 130, 131 + saving and restoring settings, 140 Pause key (PC), 264 + Window Options dialog box, 142 to 147 Pause key (Sun), 272 +Options menus, 208 Pausing a session, 25 +Options submenu (WM), 213 to 231 resuming the session, 26 + border colors, 220 PC keyboard, 260 to 269 + border settings, 218 ANSI keyboard option, 260 + icon, 221 editing keypad, 263 + icon color, 223 figure, 261 + list of window manager functions, 228 function keys, 263 + matte, 225 Janus-faced keys, 263 + resource configuration, 226 main keypad, 261 + Workspace: Border Color Options dialog models, 260 + box, 220 numeric keypad, 263 + Workspace: Border Options dialog box, redefining keys, 265 + 218 special-function keys, 262 + Workspace: Customize Resource dialog PF keys (3270), 174 + box, 227 PF1 to PF4 keys, 251 + Workspace: Icon Color Options dialog box, Photographic images + 223 printing, 49 + Workspace: Icon Options dialog box, 221 Picker color model, 307 + Workspace: Matte Options dialog box, ping + 225 definition, 115 + Workspace: Options dialog box, 216 Pointer +Output Color Mode buttons (TM), 49 settings, 45 + shapes, 197, 201 +P Pointing + defined, 196 +Pagefile, 125 Pop-up menus, 207 +Parallel communication Port number + settings, 66 specifying for Telnet, 18 +Parallel port Port usage + customizing, 66 serial or parallel, 67 + for printing, 67 # £ pound key (ANSI), 253 +Parity, 68 Power-up self-test, 302 +Parity Check button (TM), 68 Preferred Services scroll box, 14 +Paste menu item entries added to menus, 23 + VXT 3270 window, 171 managing, 22 + VXT DECterm window, 130 + + + + + Index–11 + Printing +Pressing + from a host system (cont’d) + defined, 196 +Print All Characters button (DECterm), 160 HP–UX or SCO ODT, 35 +Print All Text (DECterm), 136 OpenVMS, 35 +PRINT command, 35 ULTRIX, DEC OSF/1 AXP, SunOS, or +Print Full Page + Transcript button IBM AIX, 35 + (DECterm), 160 from a TCP/IP or LAT host, 68 +Print Full Page button (DECterm), 160 from DECterm windows, 158 to 160 +Print Graphics (DECterm), 136 from the host system, 159 + F2 (Print) key, 159 gray scale or color, 49 + LAT print jobs +Print key + canceling, 33 + See F2 key network +Print menu (DECterm), 135 enabling or disabling, 112 +Print National Characters + Line Drawing output format, 48 + button (DECterm), 160 pixel aspect ratio, 49 +Print National Characters Only button Print Screen menu, 32 + (DECterm), 160 printer status, 34 +Print Screen (TM) ribbon or toner saver, 49 + booting software option, 112 rotated image, 49 + Print Screen key (PC), 264 + TCP/IP print jobs +PrSc key (Sun), 272 + canceling, 33 +Print screen settings, 48 the screen, 159 +Print Scroll Region Only button (DECterm), under host control, 159 + 160 using TCP/IP, 34 +Print Selected Text (DECterm), 136 VXT 3270 window, 171 +Print Selection Only button (DECterm), 160 Problems, 293 +Print Text Page (DECterm), 136 Pull-down menu +Printer controller mode, 159 displaying, 206 +Printer Options dialog box (DECterm), 158 Push button +Printer port defined, 210 + choosing serial or parallel, 67 +Printer Port button (TM), 68 +Printer to Host button (DECterm), 159 Q +Printers, 32 Quick Copy, 132, 172 + baud rate, 68 Quitting + problems, 295 a remote session manager, 29 +Printing, 32 + canceling, 34 + center image, 49 R + Customize Print Screen dialog box (TM), Radio button + 48 defined, 210 + dithering, 49 Reboot menu item, 27 + form feed character, 49 + from a host system, 34 + canceling, 35 + + + + +Index–12 + Reboot Options box (TM), 107 RGB color model, 312 +Record dialog box (3270) Rotate/Scale Picture button (TM), 49 + figure, 174 Routes scroll box (TM), 78 +Record Lines Off Top box (DECterm), 150 Rows and columns (DECterm), 144 +Record Lines Off Top button (DECterm), 148 rsh commands +Recording key sequences (3270), 174 launching applications, 241 +ReGIS graphics, 157, 158 + VXT DECterm window, 141 +Related documentation, 321 + S +Remote application Save Message Box Window(TM), 63 + entering the VXT launcher name, 21 Save Terminal Manager Window (TM), 61 +Remote applications Saving feature settings + starting terminal manager settings, 40 + Create dialog box, 21 window manager settings, 215 +Remote session managers, 28 Saving settings +Remote window manager, 57 VXT DECterm windows, 140 +Report Macrograph Contents button Scale + (DECterm), 157 defined, 209 +Reset button, 216 SCO ODT operating system +Reset menu item, 27 print command, 35 +Reset Terminal menu item (DECterm), 134 Scratch pad, for color, 314 +Resize border Screen + customizing, 219 Customize Screen Background dialog box +Resize cursor, 201 (TM), 52 +Resize Window menu item (DECterm), 133 Screen background, 53 +Resizing Screen color (TM), 52 + VXT DECterm windows, 144 Screen Saver button (TM), 53 +Resource file, 7 Screen settings (TM), 52 + specifying, 113 Scroll bar, 211 +Resource settings Scroll region, 211 + window manager, 226 to 231 Scrolling methods, 211 +Restore button (WM) Scroll Lock key (PC), 264 + using, 203 Scroll Lock key (Sun), 272 +Restore Message Box Window(TM), 63 Scrolling +Restore Terminal Manager Window (TM), 61 controlling, 155 +Restoring feature settings Seating, 332 + terminal manager settings, 40 Secondary Boot button (TM), 107 + window manager settings, 215 Security +Restoring settings Customize Security dialog box (TM), 50 + VXT DECterm windows, 140 OpenVMS sessions, 29 +Return key Security settings, 50 + selecting the function of, 151 adding authorized users, 51 +Return key (ANSI), 249 authorizing TCP/IP, LAT, or DECnet + connections, 50 + removing authorized users, 51 + + + + + Index–13 + Security settings (cont’d) Session Status menu (TM) + VXT EX, 245 TCP/IP Network Test (ping) dialog box, +Select All menu item 115 + VXT 3270 window, 171 TCP/IP Routes dialog box, 117 + VXT DECterm window, 130 Setup +Serial communication + See Customize menu, Options submenu + baud rate, 68 + Setup Key (VXT EX), 245 + settings, 66 + Shadow colors (TM), 55 +Serial port + Shadow colors (WM), 221 + customizing, 66 + Share Color Map Entries button (DECterm), + for printing, 67 + 157 +Serial printer + Shift clicking + setup, 159 + defined, 196 +Serial session + Shift key (ANSI), 249 + starting, 15 + Shift key (short ANSI), 258 +Serial terminal window + Shift key (PC), 262 + AutoStart, 95 + Shift key (Sun), 271 + ending, 28 + Short ANSI keyboard, 255 to 260 +Server-based software, 4 + arrow keys, 258 + font path + extended ANSI layout, 256 + checking, 126 + figure, 255 + pagefile, 125 + main keypad, 256 +Server-based terminals + predefined keys, 258 + loading VXT software, 102 + special-function keys, 257 +Service, 304 to 305 + top-row function keys, 258 +Session + user-defined keys, 259 + AutoStart, 24 + Shutdown menu item, 27 + AutoStart settings, 95 + Site preparation, 326 + creating + Sixel graphics, 158 + VXT Create pop-up menu, 23 + VXT DECterm window, 141 + ending, 27 + Size button (WM) + help on creating, 36 + using, 203 + pausing, 25 + Slider + quitting from a remote session manager, + in scroll bar, 211 + 29 + Software options + starting, 14 + turning off, 110 + DECnet session, 16 + Solving problems, 293 + IP session, 17 + Specifications, 326 to 330 + LAT session, 15 + Startup State (TM), 58 + serial session, 15 + Status Display button (DECterm), 149 + using preferred services, 23 + Status indicators (VXT 3270), 169 +Session menu (TM), 24, 25, 27 + Status line, 149 + Status submenu, 115 + Status submenu (TM), 115 + Ethernet Counters dialog box, 120 + figure, 115 + + + + +Index–14 + Status submenu (TM) (cont’d) TCP/IP session + LAT Counters dialog box, 118 preferred services (cont’d) + System Configuration dialog box, 124 adding from the Known Hosts dialog + System Monitor dialog box, 123 box, 20 + using, 114 to 127 starting, 17 +Status update frequency TCP/IP transport + seconds, 59 Customize TCP/IP dialog box (TM), 73 +Stepping arrow, 211 Customize TCP/IP Name Server dialog +Sun style keyboard, 270 to 277 box (TM), 75 + editing keypad, 272 Customize TCP/IP Routing Tables dialog + figure, 270 box (TM), 77 + function keys, 271, 273 enabling, 73 + main keypad, 271 font path, 91 + numeric keypad, 272 Name Server settings, 74 + redefinding keys, 274 printing from a host, 68 +Sun system routing table settings, 76 + font conversion, 31 security, 50, 51 +Sun systems terminal settings, 73 + Open Look window manager, 29 terminal’s IP address, 12 +SunOS operating system VXT EX security, 245 + print command, 35 Telnet terminal window +System box AutoStart, 95 + problems, 293 ending, 28 + specifications, 326 Terminal +System Configuration dialog box (TM), 124 LASTport group codes, 71 +System Defaults button, 40 network addresses, 12 +System Monitor dialog box (TM), 123 overview, 1 to 10 +System-default settings problems, 296 + VXT DECterm resource file name, 127 + recalling, 141 status, 28, 114 + system configuration, 124 + TCP/IP address, 73 +T Terminal address, 126 +Tab key (ANSI), 249 Terminal ID button (DECterm), 153 +Tab key (PC), 262 Terminal Manager window, 11 to 37 +Tab key (Sun), 271 AutoStart, 95 +TCP/IP Network Test (ping) dialog box (TM), closing, 13 + 115, 116 controlling display of, 58 +TCP/IP Routes dialog box (TM), 117 Create dialog box, 14 +TCP/IP session Create menu, 14 + displaying available hosts, 19 Customize menu, 84 + entering a host name or IP address, 17 communications, 64 + options, 18 user preferences, 38 + entering an indirect host name or IP customizing, 8 + address, 19 features, 12 + preferred services + + + + Index–15 + Terminal Manager window (cont’d) UNIX operating system + figure, 12 NFS mount points, 78 + Getting Started menu, 36 quitting a remote session manager, 28 + hiding, 14, 58 TCP/IP Name Server settings, 74 + icon, 58 TCP/IP printer port setup, 68 + option settings TCP/IP routing table settings, 76 + saving and recalling, 40 TCP/IP settings, 73 + Print Screen menu, 32 UPSS DEC Supplemental button (DECterm), + saving the size and position of, 61 152 + Session menu, 24, 25 UPSS ISO Latin 1 Supplemental button + starting, 21 (DECterm), 152 + using, 11 to 37 User-defined keys +Terminal Size box (DECterm), 144 ANSI keyboard, 252 +Terminal Tag (TM), 59 locking, 152 +Terminal window short ANSI keyboard, 259 + on the serial port User-preferred settings, 38 + AutoStart, 95 User-preferred supplemental sets, 152 +Test + power-up self-test, 302 +Text-entry boxes V + typing in, 209 Vertical Cursor Coupling button (DECterm), +TFTP 149 + font path, 90 Vertical Scroll Bar button (DECterm), 148 +Tilde key, 155 Video alignment +Title bar Customize video alignment dialog box + moving a window with, 200 (TM), 60 +Translation table, 193 VX227 terminal, 60 +Troubleshooting VRM17 monitor settings, 294 + boot error codes, 302 VT emulation mode (DECterm), 153 +Troubleshooting problems, 293 VX227 terminal +Typewriter keys, 42 video alignment controls, 60 + VXT 2000 windowing terminal + overview, 1 to 10 +U VXT 3270 window +ULTRIX operating system Access Name, 164 + DECnet Name Translator settings, 82 Application Name, 165 + DECnet settings, 81 Authorization Password, 165 + NFS mount points, 78 AutoStart, 95 + print command, 35 character set + quitting a remote session manager, 28 translation table, 193 + TCP/IP Name Server settings, 74 character sets, 10 + TCP/IP printer port setup, 68 checklist, 162 + TCP/IP routing table settings, 76 connection parameters, 177 + TCP/IP settings, 73 creating a session, 162 + cursor + + + + +Index–16 + VXT 3270 window VXT 3270 window (cont’d) + cursor (cont’d) Wait parameter, 166 + moving, 170 Window Options dialog box + customizing, 8, 180 to 194 figure, 183 + Data parameter, 165 work area, 167 + Define Key dialog box format, 168 + figure, 181 VXT application + display starting, 21 + customizing, 183 VXT application launcher + Edit menu, 171 See Application launcher + editing data, 170 VXT Create pop-up menu (WM), 23, 24 + enabling or disabling use of, 112 VXT DECterm window + Enter Connection Parameters dialog box, answerback message, 154 + 163 character set selection, 152, 153 + entering data, 169 character sets, 10 + exiting, 179 choosing a 7-bit NRC character set, 156 + field attributes, 177 clearing, resetting, or resizing, 133 + function list, 177 color, 149 + Gateway, 164 Commands menu, 133 + key functions, 187 cursor, 150 + keyboard functions, 184 cursor key functions, 152 + keyboard layout map, 176 customizing, 8 + Logon Mode, 165 display settings, 148 to 150 + mouse, 184 Edit menu, 130 + numeric keypad exiting, 137 + entering numbers, 175 font size, 145 + overview, 161 format, 128 + pop-up menu, 178 general settings, 150 to 154 + printing, 171 graphics settings, 157 to 158 + protected and unprotected fields, 168 icon name, 145 + PU Name, 164 keyboard settings, 154 to 156 + recording key sequences, 174 locking UDKs, 152 + canceling, 175 numeric keypad function, 152 + playing back, 175 options, 138 to 160 + viewing, 175 saving and restoring, 141 + Selector Mouse, 184 saving and restoring settings, 140 + Session Address, 164 Options menu, 135, 139 + status indicators, 169 Print menu, 135 + Terminal Type, 165 printer settings, 158 to 160 + user-defined keys, 180 printing, 135 to 136 + deleting, 182 problems, 300 + saving and loading, 182 resizing, 144 + using, 161 to 179 rows and columns, 144 + VXT 3270 TE dialog box scrolling speed, 150 + figure, 167 using, 128 to 137 + + + + + Index–17 + VXT DECterm window (cont’d) + window settings, 142 to 147 + window title, 144 W +VXT DECterm windows Warning bell, 255, 265, 273 + enabling and disabling, 111 volume slide bar, 42 +VXT EX button (TM), 107 Warning Bell button (DECterm), 155 +VXT EX software 3270 window + loading, 243 See VXT 3270 window + overview, 4 customizing, 8 + security, 245 Window borders + specifying, 98 customizing, 219 + switching to VXT software, 246 Window colors (TM), 54, 55 + using, 242 color, 55 +VXT loader file (VXTLDR), 106 monochrome, 54 +VXT Message Box, 13 Window manager + closing, 13 border colors, 220 + controlling display of, 58 border settings, 218 + Customize menu customizing, 8 + Customize Message dialog box, 61 defining + customizing, 61 button, 226, 230 + figure, 13 key, 226, 230 + hiding, 14, 58 menu, 226 + icon, 58 menu item, 229 + saving the size and position of, 63 icon colors, 223 + starting, 21 icon settings, 221 +VXT software launching applications, 232 + boot commands, 108 local, 233 + booting remote, 236 + from VXT EX Options dialog box, list of functions, 228 + 246 matte, 225 + loading option settings + from an InfoServer system, 102 saving and restoring, 215 + host-based operation, 100 Options submenu, 214 + loading process, 99 remote, 29 + overview, 3 Open Look window manager, 29 + restarting, 27 starting, 21 + software options, 126 workspace settings, 216 + specifying a version, 98 Window manager menu + system image names, 101, 103 customizing colors, 221 + turning off options, 110 Window menu (WM) + version number, 125 moving a window with, 203 +VXT Software button (TM), 107 using, 200 + Window Options dialog box (DECterm), 143 + + + + +Index–18 + Window size Workspace: Border Options dialog box (WM), + when moving or resizing, 218 218 +Window Title button (DECterm), 144 Workspace: Customize Resource dialog box +Windows, 195 to 212 (WM), 227 + See also Pointer shapes Workspace: Icon Color Options dialog box + action when removed, 218 (WM), 223 + activating, 217, 218 Workspace: Icon Options dialog box (WM), + background color, 56 221 + changing input focus, 205 Workspace: Matte Options dialog box (WM), + changing the size of, 200 225 + closing with the window menu button, + 219 X + customizing + colors, 221 X image extension (XIE) software, 316 to + defined, 197 320 + foreground color, 56 bitonal images, 317 + highlight color, 56 enabling, 107 + lowering to the bottom of the stack, 202 pipeline constraints, 318 + moving, 199, 218 pipeline examples, 319 + Options submenu, 213 pipelines, 317 + popping to the top of the stack, 202 X Image Extension (XIE) software + reducing to icons, 201 enabling or disabling use of, 112 + resizing, 203, 204 X Image Extension button (TM), 107 + restacking, 205 X server, 93 to 94 + restoring from icons, 203 checking for XIE capability, 317 + saving window settings, 215 Customize X Server dialog box (TM), 93 + selecting, 199 Monitor, 94 + settings scaling the display, 94 + VXT DECterm windows, 142 X Session Reset Server Action (TM), 94 + shadow colors, 55, 56 X Window System, 7 + stacking, 202, 217 X11 colors, 313 +Work environment, 331 XOFF signal, 69 +Work group + resource file name, 127 +Workspace button (WM) + using, 204 +Workspace settings + window manager, 216 to 218 +Workspace submenu (WM), 204 + launching applications, 233 +Workspace: Border Color Options dialog box + (WM), 220 + + + + + Index–19 + \ No newline at end of file diff --git a/xie/docs/dec/XIEProto.TXT b/xie/docs/dec/XIEProto.TXT new file mode 100644 index 0000000..b5757b3 --- /dev/null +++ b/xie/docs/dec/XIEProto.TXT @@ -0,0 +1,6614 @@ + + + + + + +X Image Extension Protocol + + + + +Publication Description: + +This document describes the protocol of the X WINDOW SYSTEM IMAGE EXTENSION. + + + + + + + + + + + + + + +Version 5.02 + +X Consortium Standard + +X Version 11, Release 6.3 + +December 16, 1996 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Copyright © 1988, 1989, 1990, 1991, 1992 Digital Equipment Corporation + +Copyright © 1990, 1991, 1992, 1993, 1994 X Consortium, Inc. + +Copyright © 1992, 1993, 1994 AGE Logic, Inc. + + +Permission to use, copy, modify, distribute, and sell this documentation for any purpose +is hereby granted without fee, provided that the above copyright notices and this permis- +sion notice appear in all copies. Digital, the X Consortium, and AGE Logic make no +representations about the suitability for any purpose of the information in this document. +This documentation is provided as is without express or implied warranty. + + + +Contents +Contents iii +Preface x +Related Documents x +Participants xi +Authors: xi +Contributors: xi +Revision History xi +Organization xii +Introduction xii +Protocol Parameter Types and Syntax xii +Protocol Requests and Replies xii +Pipeline Elements xii +Events and Errors xii +Techniques xii +Service Classes xii +Protocol Encodings xii +Acknowledgments xiii +Introduction 1-1 +Scope and Purpose 1-1 +Terminology 1-1 +Techniques 1-1 +Service Classes 1-1 +Specification Syntax 2-1 +General Syntax 2-1 +Request Syntax 2-2 +Requests without a Reply: 2-2 +Requests with a Reply: 2-2 +Syntax of Photo Elements 2-3 +Photo Elements: 2-3 +Syntax of Events 2-4 +Events generated by Photo Elements: 2-4 +Syntax of Errors 2-4 +Core X errors 2-4 +XIE non-Photoflo errors: 2-4 +XIE Photoflo related errors: 2-4 +Syntax of Protocol Encodings 2-5 +Requests 2-5 +Replies 2-5 +PhotoElements 2-5 +Events 2-6 +Errors 2-6 +Parameter Types 3-1 +XIE and Core X Types 3-1 +Techniques 3-1 +Definitions 3-2 +XieTypAlignment 3-2 +XieTypArithmeticOp 3-2 +XieTypColorAllocTechnique 3-3 +XieTypColorList 3-3 +XieTypCompareOp 3-3 +XieTypConstant 3-4 +XieTypConstrainTechnique 3-5 +XieTypConvertFromRGBTechnique 3-5 +XieTypConvertToRGBTechnique 3-5 +XieTypConvolveTechnique 3-6 +XieTypDataClass 3-6 +XieTypDataStream 3-6 +XieTypDataType 3-6 +XieTypDecodeTechnique 3-7 +XieTypDitherTechnique 3-7 +XieTypEncodeTechnique 3-8 +XieTypExecutable 3-8 +XieTypExportNotify 3-9 +XieTypExportState 3-9 +XieTypFloat 3-9 +XieTypGamutTechnique 3-10 +XieTypGeometryTechnique 3-10 +XieTypHistogramData 3-11 +XieTypHistogramShape 3-11 +XieTypInterleave 3-11 +XieTypLevels 3-12 +XieTypLUT 3-12 +XieTypMathOp 3-12 +XieTypMatrix 3-12 +XieTypOrientation 3-13 +XieTypPhotoElement 3-14 +XieTypPhotoflo 3-14 +XieTypPhotofloOutcome 3-14 +XieTypPhotofloState 3-15 +XieTypPhotomap 3-15 +XieTypPhotospace 3-15 +XieTypPhototag 3-15 +XieTypProcessDomain 3-16 +XieTypRectangle 3-16 +XieTypROI 3-16 +XieTypServiceClass 3-17 +XieTypTechniqueGroup 3-17 +XieTypTechniqueRec 3-18 +XieTypTile 3-18 +XieTypTripletoftype 3-18 +XieTypWhiteAdjustTechnique 3-19 +Resources 4-1 +Overview 4-1 +Binding Resources to Photoflos 4-1 +ColorList resources 4-1 +LUT, Photomap, and ROI resources 4-1 +Resource destruction 4-2 +Synchronizing resource access 4-2 +Capability Acquisition 4-3 +QueryImageExtension 4-3 +Technique Acquisition 4-4 +QueryTechniques 4-4 +ColorList 4-5 +CreateColorList 4-5 +DestroyColorList 4-5 +PurgeColorList 4-6 +QueryColorList 4-6 +LUT 4-7 +CreateLUT 4-7 +DestroyLUT 4-7 +Photomap 4-8 +CreatePhotomap 4-8 +DestroyPhotomap 4-8 +QueryPhotomap 4-9 +ROI 4-10 +CreateROI 4-10 +DestroyROI 4-10 +Pipelined Processing 5-1 +What is a Photoflo? 5-1 +Two kinds of Photoflos 5-2 +Multi-client Photoflos 5-2 +Photoflo States 5-3 +Flo'ing Data to a Resource 5-3 +Name space 5-4 +CreatePhotospace 5-4 +DestroyPhotospace 5-4 +Immediate Photoflos 5-5 +ExecuteImmediate 5-5 +Stored Photoflos 5-6 +CreatePhotoflo 5-6 +DestroyPhotoflo 5-6 +ExecutePhotoflo 5-7 +ModifyPhotoflo 5-8 +RedefinePhotoflo 5-8 +Sending Data to the Server 5-9 +PutClientData 5-9 +Retrieving Data from the Server 5-10 +GetClientData 5-10 +Status 5-11 +QueryPhotoflo 5-11 +Synchronization 5-12 +Await 5-12 +Termination 5-12 +Abort 5-12 +Import Elements 6-1 +Overview 6-1 +Element categories 6-1 +Multi-source images 6-1 +Events generated 6-1 +Import from Client 6-1 +ImportClientLUT 6-2 +ImportClientPhoto 6-3 +ImportClientROI 6-4 +Import from Resource 6-5 +ImportDrawable 6-5 +ImportDrawablePlane 6-6 +ImportLUT 6-7 +ImportPhotomap 6-8 +ImportROI 6-9 +Process Elements 7-1 +Overview 7-1 +Limiting the Process 7-1 +Process Selected Bands 7-1 +Process Intersecting Pixels 7-1 +Process Selected Pixels 7-2 +Data Types 7-2 +Process Categories 7-3 +Process Definitions 7-3 +Arithmetic 7-4 +BandCombine 7-5 +BandExtract 7-6 +BandSelect 7-7 +Blend 7-8 +Compare 7-9 +Constrain 7-11 +ConvertFromIndex 7-12 +ConvertFromRGB 7-13 +ConvertToIndex 7-14 +ConvertToRGB 7-15 +Convolve 7-16 +Dither 7-17 +Geometry 7-18 +Logical 7-20 +MatchHistogram 7-22 +Math 7-23 +PasteUp 7-24 +Point 7-25 +Unconstrain 7-26 +Export Elements 8-1 +Element categories 8-1 +Export to Client 8-1 +Events generated 8-1 +ExportClientHistogram 8-2 +ExportClientLUT 8-3 +ExportClientPhoto 8-4 +ExportClientROI 8-5 +Export to Resource 8-6 +ExportDrawable 8-6 +ExportDrawablePlane 8-7 +ExportLUT 8-8 +ExportPhotomap 8-9 +ExportROI 8-10 +Events and Errors 9-1 +Events 9-1 +ColorAlloc 9-1 +DecodeNotify 9-2 +ExportAvailable 9-2 +ImportObscured 9-3 +PhotofloDone 9-3 +Resource Errors 9-4 +Photoflo errors 9-5 +Techniques A-1 +Standard and Private Techniques A-1 +Technique numbers A-1 +Technique names A-1 +Default Techniques A-2 +Technique parameters A-2 +Technique information A-2 +Color Allocation Techniques A-3 +Constrain Techniques A-4 +Convert From RGB A-5 +Convert To RGB A-6 +Convolution Edge Techniques A-8 +Decode Techniques A-9 +Dithering Techniques A-13 +Encode Techniques A-14 +Gamut Compression Techniques A-18 +Geometry Techniques A-19 +Histogram Shapes A-27 +White Point Adjustment Techniques A-28 +Service Class B-1 +Full B-1 +DIS B-1 +Service Class Summary B-2 +Protocol Encodings C-1 +Extension Name C-1 +Types C-1 +Requests and Replies C-9 +Import Elements C-15 +Process Elements C-17 +Export Elements C-22 +Technique Parameters C-24 +Events C-32 +Errors C-34 +Figures and Tables +Figure 1-1 Service Classes defined in this document 1-2 +Figure 4-1 Creating and populating a new Photomap 4-1 +Figure 4-2 Process image from Photomap a, place result into Photomap b 4-2 +Figure 4-3 Process image from Photomap a "in-place\ 4-2 +Figure 5-1 Photoflo element input and output connections 5-1 +Figure 5-2 Example Photoflo 5-2 +Figure 5-3 Photoflo states 5-3 +Figure 7-1 Combining two sources using a control plane Logical: NoOp 7-2 +Figure 7-2 A sample geometric transform: crop and scale 7-18 +Figure 7-3 Background fill used for pixels beyond the edge 7-19 +Figure 7-4 Point's algorithm for computing combined LUT indices 7-25 +Figure A-1 Diagram of the ErrorDiffusion algorithm A-13 +Figure A-2 Effect of sampling technique when scaling to a lower pixel density A-20 +Figure A-3 Illustration of an output pixel mapping back to the input image A-21 +Figure A-4 Sequence producing an antialiased image using a low-pass filter A-22 +Figure B-1 DIS sources, operators, and destinations B-1 + +Table 3-1 Technique naming and numbering conventions 3-1 +Table 3-2 Treatment of floating point parameters passed through the protocol 3-4 +Table 5-1 Examples of two element Photoflo usage 5-3 +Table 6-1 Relationship between LUT class and image class 6-2 +Table 7-1 Compare parameter and DataClass dependencies 7-9 +Table 9-1 XIE Error codes 9-4 +Table 9-2 Photoflo error subcodes 9-5 +Table B-1 Types itemized by ServiceClass B-2 +Table B-2 Techniques itemized by ServiceClass B-4 +Table B-3 Requests itemized by ServiceClass B-5 +Table B-4 Import elements itemized by ServiceClass B-6 +Table B-5 Process elements itemized by ServiceClass B-6 +Table B-6 Export elements itemized by ServiceClass B-6 +Table B-7 Events itemized by ServiceClass B-7 +Table B-8 Errors itemized by ServiceClass B-7 + + + +Preface +The X architecture was a major step towards defining open, interactive application display services. X +pried apart the tightly coupled, private interconnect that has existed between application and display +subsystem by specifying a minimal, structured service set. +To retain a consistent, minimal core service set and yet accommodate evolving application require- +ments, X provides a method for extending the core protocol with additional domain specific requests. +This document defines an X extension for the imaging domain. It is the fifth version of the X Image +Extension Protocol proposal and, as prior readers will immediately recognize, it is a lineal descendent +of the other four. +Because the purpose of this document is to provide a clear, concise articulation of the protocol, ex- +pository materials have been pared to a bare minimum. It is assumed that the reader has a measure of +conceptual knowledge about imaging. +Readers who lack familiarity with the X Window System are encouraged to begin with a selection +from the related documents given below. +Related Documents + X Window System (Scheifler & Gettys) +The complete reference to Xlib, X protocol (and extension conventions), ICCCM, XLFD. +Digital Press + X Protocol Reference Manual (Nye, editor) +The Definitive Guides to the X Window System, Volume 0. +OReilly & Associates, Inc. + The X Window System Server (Israel & Fortune) +Guide to the X sample server: architecture, porting and tuning, writing extensions. +Digital Press + XIE Sample Implementation Architecture (Shelley, Verheiden & Fahy) +An overview of the architecture of the XIE sample implementation. +AGE Logic, Inc. + XIElib Specification (Rogers) +Reference pages for the XIE client library functions. +AGE Logic, Inc. + +Participants +Authors: +Robert NC Shelley Digital Equipment Corporation +Robert W. Scheifler X Consortium, Inc. +Ben Fahy Visionary Software, Inc. +Jim Fulton Network Computing Devices, Inc. +Keith Packard Network Computing Devices, Inc. +Joe Mauro Digital Equipment Corporation +Richard Hennessy Avid Technology, Inc. +Tom Vaughan Digital Equipment Corporation +Contributors: +Gary Grebus Digital Equipment Corporation +Larry Hare NetManage, Inc. +Peter Kaczowka Hewlett-Packard Co. +Jeffrey Siegal Congruent Corporation +Al Tabayoyon North Valley Research, Inc. +John Weber Big Time Software, Inc. +Revision History +rev v1.0 August 1, 1988 first protocol draft +rev v2.0 April 12, 1989 major changes based upon consortia review +rev v2.1 November 1, 1989 changes based upon FT1 implementation +rev v2.2 March 15, 1990 changes based upon FT2 implementation (pipes) +rev v3.0 October 1, 1990 changes in preparation for consortia review +rev v4.0 June 1, 1991 changes based upon consortia technical review +rev v4.08 May 29, 1992 preliminary imagework review copy +rev v4.09 June 9, 1992 imagework review copy for meeting at San Jose +rev v4.10 September 10, 1992 pre-review of encodings and contributions +rev v4.11 October 31, 1992 imagework review with initial definition of DIS +rev v4.12 December 23, 1992 initial Public Review copy +rev v4.13 May 19, 1993 changes made during Alpha phase of sample implementation +rev v4.14 October 20, 1993 changes made during Beta phase of sample implementation +rev v4.15 December 15, 1993 changes made prior to final release of sample implementation +rev V5.0 January 10, 1994 final draft +rev V5.0 April 18, 1994 cosmetic cleanup prior to releasing X11 R6 +rev v5.01 July 5,1996 incorporate Digital Press edits +rev v5.02 December 16, 1996, incorporate additional Digital Press edits and X11 R6.3 + +Organization +This document is organized into the following chapters and appendices: +Introduction +Chapter 1 Explains the purpose of the X Image Extension (XIE). +Protocol Parameter Types and Syntax +Chapter 2 Defines protocol syntax (how the protocol is encoded on the wire). +Chapter 3 Defines types for protocol parameters. +Protocol Requests and Replies +Chapter 4 Describes the resources used by the XIE protocol and library. +Chapter 5 Describes pipelines, client data transport, and pipeline utility requests. +Pipeline Elements +Chapter 6 Describes pipeline elements used for data import. +Chapter 7 Describes the general processing elements used in pipelines. +Chapter 8 Describes pipeline elements used for data export. +Events and Errors +Chapter 9 Describes events and errors returned from XIE. +Techniques +Appendix A Describes the XIE standard techniques and their parameters. +Service Classes +Appendix B Summarizes required, optional, and excluded items for each XIE service class. +Protocol Encodings +Appendix C Provides the complete protocol encoding for all XIE: types, requests, replies, ele- +ments, techniques, events, and errors. + +Acknowledgments +We are all indebted to Digital Equipment Corporation where the X Image Extension was originally +conceived. They persevered through numerous protocol reviews and revisions and provided the ini- +tial sample implementations. Their efforts contributed greatly towards promoting XIE into the Public +Review process. +This document evolved from original specifications authored by Joe Mauro. We hope that it still +shows some of his architectural strength and elegance. The majority of the current document +(through version 4.11) was authored by Bob Shelley while employed at Digital. Subsequent revisions +were made at AGE Logic. +The current view of pipelines emerged almost completely intact from a single, terse email message +from Bob Scheifler and Keith Packard. +The need for robust geometric transforms was first promoted by Ben Fahy. We are grateful that he +has provided us with detailed documentation for the basic geometry element and several retrospective +sampling algorithms. +While one could debate that XIE is too big or too small, we can thank Jim Fulton for spearheading +the effort to define a smaller gentler XIE, the Document Imaging Subset. + + + + + + + + + + + + + + + + + + + + + + + +almost blank + + + + + +xiv + + + +1 +Introduction +Scope and Purpose +This document specifies the X wire protocol for the X Image Extension (XIE). It defines the syntax, +structure, and semantics of XIE protocol elements. It does not contain background material on im- +aging concepts that the protocol extension enables, nor does it contain any language specific bindings. +Terminology +This specification contains a certain amount of descriptive terminology that is commonly used within +the image processing community. There is also parametric terminology that is used to describe the +parameter types recognized by the core X protocol and the image extension protocol. The image ex- +tension protocol types are defined in this document. +Techniques +For some XIE operations, there are several recognized algorithms or techniques that offer varying +tradeoffs between quality of results and performance. Also, in some cases, different techniques are +required due to an image's class or content. To accommodate some flexibility in this area, such XIE +operations accept a technique parameter. A description of the techniques specified in this document +can be found in Appendix A. Individual implementations may extend XIE's capabilities by providing +additional techniques to provide for particular market needs. +Service Classes +For some environments, such as simple document image viewing, the full set of services provided by +XIE may include features that are not needed by the target applications. In such situations +(particularly for entry-level monochrome displays), server implementors may wish to provide only a +subset of the full XIE protocol. +Subsets are arranged in a nested hierarchy of service classes. Each service class includes all of the +features of any subsets that it surrounds (similar to the layers of an onion). Thus, applications written +to use a given subset of the protocol will function correctly when running on servers that implement +an enveloping service class. + +This version of the XIE protocol defines two class: the full protocol (Full), and a document imaging +subset (DIS). Future versions of the XIE protocol may define additional service classes. + +Figure 1-1 Service Classes defined in this document +For a complete list of types, techniques, protocol requests, pipeline elements, events, and errors that +are included in DIS, see Appendix B. + +Introduction 1-1 + + +2 +Specification Syntax +This section presents syntactic conventions that are adhered to throughout this specification. +General Syntax +In general, the extension package follows the X11 protocol syntax conventions. Additions to this +syntax are as follows: +* The syntax ( . . . ) encloses a set of alternative values. +* The syntax [ . . . ] encloses a set of structure components. +* Within definitions the following prefixes are used: + XieReq: Protocol request/reply (for example, XieReqCreatePhotoflo) + XieFlo: Photoflo element (for example, XieFloConvolve) + XieEvn: Protocol event (for example, XieEvnPhotofloDone) + XieErr: Protocol error (for example, XieErrPhotospace) + XieTyp: Protocol type (for example, XieTypProcessDomain) + XieVal: Alternative value (for example, XieValBandByPixel) +* Outside of definitions the prefixes are generally not used: + Alternative values are italicized and bold (for example, BandByPixel) + All others are capitalized and bold (for example, CreatePhotoflo) +* Core X types are displayed in upper-case (for example, COLORMAP, WINDOW) + +Request Syntax +Requests without a Reply: +XieReqRequestName +arg-1: type-1 1st argument for RequestName + . . . +arg-N: type-N N-th argument for RequestName +Errors: none or list of errors specific to RequestName (for example, FloID) +Events: none or list of events generated by RequestName (for example, PhotofloDone) +Overview Describes the basic function of the request. +Parameters Lists the parameters and gives a brief description of each. +Semantics Interrelationships between input data, parameters, and output results. +Errors Table of errors that can be generated and their causes, for example: +Error Cause +error-1 Circumstances that generate error-1 +. . . +error-N Circumstances that generate error-N +Requests with a Reply: +XieReqRequestName +arg-1: type-1 1st argument for RequestName + . . . +arg-N: type-N N-th argument for RequestName +* +result-1: type-1 1st reply result from RequestName + . . . +result-M: type-M M-th reply result from RequestName +Errors: none or list of errors specific to RequestName (for example, Photomap) +Events: none or list of events generated by RequestName (for example, EventName) +Overview Describes the basic function of the request. +Parameters Lists the parameters and gives a brief description of each. +Reply data Lists the parameters and gives a brief description of each. +Semantics Interrelationships between input data, parameters, and output results. +Errors Table of errors that can be generated and their causes, for example: +Error Cause +error-1 Circumstances that generate error-1 +. . . +error-N Circumstances that generate error-N +Syntax of Photo Elements +PhotoElements occur within XIE pipelines (see following chapters for clarification). The syntax of +these elements is as follows: +Photo Elements: +XieFloElementName +src-1: src-type-1 1st source for ElementName (if required) + . . . +src-N: src-type-N N-th source for ElementName (if required) +param-1: param-type-1 1st parameter for ElementName + . . . +param-M: param-type-M M-th parameter for ElementName +Errors: none or list of errors specific to ElementName (for example, FloAlloc) +Events: none or list of events generated by ElementName (for example, ExportAvail + able) +Attributes Table of PhotoElement output attributes, for example: +Attribute Value +class DataClass of output data + SingleBand achromatic or index + TripleBand trichromatic +type DataType: + Constrained quantization levels is levels (integer data) + Unconstrained quantization levels is unknown (may be float data) +width Width of output data (in pixels per band) +height Height of output data (in pixels per band) +levels Depends on type: + Constrained number of quantization levels (per band) + Unconstrained unknown +Overview Describes the basic function of the photo element. +Parameters Lists the parameters and gives a brief description of each. +Semantics Interrelationships between input data, parameters, and output results. +Errors Table of errors that can be generated and their causes, for example: +Error Cause +error-1 Circumstances that generate error-1 +. . . +error-N Circumstances that generate error-N + +Syntax of Events +Events generated by Photo Elements: +XieEvnEventName +instance: XieTypExecutable < Photoflo instance generating EventName > +phototag: XieTypPhototag < event Phototag (0 for general Photoflo event) > +type: CARD16 < element type (0 for general Photoflo +event) > +value-1: type-1 < 1st value returned by EventName > + . . . +value-N: type-N < N-th value returned by EventName > +Overview Description of the event. +Values returned Description of the values returned. +Syntax of Errors +Errors can be associated with core X11 resources or XIE resources. In the case of XIE specific error +conditions, a distinction is made between errors related to a Photoflo and those that are not. +Core X errors +Normal X errors (with XIE major/minor opcodes) are used where appropriate (for example, Alloc). +XIE non-Photoflo errors: +XieErrName +xie-error: XieErrName < error code of Name, offset from first-error > +resource-id: XID < resource to blame, for example, Photomap > +detail < 21 bytes available for additional error detail > +Overview Description of the error. +Values returned Description of the values returned. +XIE Photoflo related errors: +XieErrFloName +flo-error: XieErrName < error code for Flo, offset from first-error > +flo-id:CARD32 < executable flo-id> +flo-code: XieErrFloName < specific error type > +name-space: CARD32 < executable name-space> +phototag: CARD16 < erring Phototag (0 for general Photoflo error) > +type: CARD16 < element type (0 for general Photoflo er- +ror) > +detail < 12 bytes available for additional error detail > + +Overview Description of the error. +Values returned Description of the values returned. +Syntax of Protocol Encodings +Requests +# of Bytes Value Description +1 CARD8 XIE major opcode +1 CARD8 XIE minor opcode +2 CARD16 Request length (total bytes divided by 4) +N Parameters required by the minor opcode +< 4 Pad (if required) +Requests consist of four (4) bytes of header followed by zero (0) or more additional bytes of data. If +additional bytes of data are needed the entire request is padded to a multiple of four (4) bytes. The +common fields (major/minor opcode and length) are not included in XieReq request definitions. +Bytes not used by a specific minor opcode are not guaranteed to be zero. +Replies +# of Bytes Value Description +1 1 Reply +1 Available for reply data +2 CARD16 Sequence number of corresponding request +4 CARD32 Reply length (extra data bytes divided by 4) +24 Available for reply data +N Extra data beyond standard reply packet +< 4 Pad (if required) +Replies consist of thirty-two (32) bytes followed by zero (0) or more extra bytes of data. If extra bytes +of data are needed the entire reply is padded to a multiple of four (4) bytes. The common fields +(Reply, sequence number, and length) are not included in XieReq reply definitions. Bytes not used by +the reply from a specific request are not guaranteed to be zero. +PhotoElements +# of Bytes Value Description +2 CARD16 Element type +2 CARD16 Element length (bytes divided by 4) +multiple of 2 XieTyp(Phototag|Tile) Element's data source(s) (if required) +N Parameters as required by element type +< 4 Pad (if required) +A photo element consists of four (4) bytes of header followed by zero (0) or more bytes of element in- +put connection definitions and by zero (0) or more bytes or additional data. The entire element defi- +nition is padded to a multiple of four (4) bytes. The common fields (element type and element length) +are not included in XieFlo element definitions. Bytes not used by a specific element type are not +guaranteed to be zero. +Note: PhotoElements are not protocol requests but, rather, subpackets within another protocol request (that is, ExecuteImmediate, +CreatePhotoflo, ModifyPhotoflo, or RedefinePhotoflo). +Events +# of Bytes Value Description +1 CARD8 XIE event code +1 +2 CARD16 Sequence number +4 TIMESTAMP Time +24 +Events consist of thirty-two (32) bytes. The common fields (event code, sequence number, and time) +are not included in XieEvn definitions. Bytes not used by a specific event code are not guaranteed to +be zero. +Errors +# of Bytes Value Description +1 0 Error +1 CARD8 XIE error code +2 CARD16 Sequence number +4 +2 CARD16 Minor opcode +1 CARD8 Major opcode +21 +Errors consist of thirty-two (32) bytes. Bytes not used by the specific error code are not guaranteed to +be zero. + +Protocol Specification Syntax 2-1 + + +3 +Parameter Types +XIE and Core X Types +X Image Extension types are defined in this section. All XIE parameters are defined as being either one +of the extension types or one of the core protocol types. XIE makes use of the following core protocol +types (defined in the X11 core protocol specification): +BITMAP BOOL CARD8 CARD16 +CARD32 CHAR2B COLORMAP DRAWABLE +EVENT GCONTEXT INT8 INT16 +INT32 PIXMAP STRING8 TIMESTAMP +VISUAL WINDOW XID* +* XID is used to refer to the core X11 type defined as the identifier for a resource. +Techniques +Several standard techniques are defined in this document. Each is assigned a technique number and a de- +scriptive name string. XIE can also be extended with private techniques that are implementation depend- +ent. Private technique numbers are generated dynamically. Private technique name strings include the +name of the organization that defined the technique. The organization name is encompassed by _ +(underscore) characters. Technique naming and numbering conventions are summarized in Table 3-1. + + +standard technique +private technique +name + +example: ERROR-DIFFUSION +__ +example: _PHOTOCO_SQUASH-BITS +number +MS bit is zero (range: 0 - 32767) +MS bit is one (range: 32768 - 65535) +Table 3-1 Technique naming and numbering conventions +The technique number is supplied to pipeline elements to specify the desired technique. Numbers for +standard techniques can be hard-coded, whereas numbers for private techniques must be obtained using +the QueryTechniques protocol request. + +For more information on techniques and a description of the techniques defined in this document, see Appendix A. For a list of techniques +itemized by ServiceClass, see Appendix B. Numbers assigned to standard techniques are encoded in Appendix C. +Definitions +XieTypAlignment +Alignment defines the valid pixel and scanline alignments allowed for image data transported through the +protocol stream. The server's Alignment attribute is returned by the QueryImageExtension protocol re- +quest. +XieTypAlignment { XieValAlignable, XieValArbitrary } +* Alignable Specifies data units must fit evenly within a byte, or they must fill a byte, or fill a multiple + of bytes (that is, pixels may be 1, 2, 4, 8, 16, 24*, or 32* bits in the protocol stream). +* Arbitrary Specifies data units may fall at any bit address (that is, 10 bit packed pixels are acceptable in + the protocol stream). +* XIE supports pixels up to sixteen (16) bits per band for both SingleBand and TripleBand data. In addition, SingleBand data are +supported up to the depth of the deepest DRAWABLE supported by the server. + + +XieTypArithmeticOp +ArithmeticOp defines the valid operations for the Arithmetic process element. +XieTypArithmeticOp { XieValAdd, + XieValSub, XieValSubRev, + XieValMul, + XieValDiv, XieValDivRev, + XieValMin, XieValMax, + XieValGamma } + Monadic Dyadic +* Add src1 + constant src1 + src2 +* Sub src1 - constant src1 - src2 +* SubRev constant - src1 src2 - src1 +* Mul src1 * constant +* Div src1 / constant +* DivRev constant / src1 +* Min minimum( src1, constant ) minimum( src1, src2 ) +* Max maximum( src1, constant ) maximum( src1, src2 ) +* Gamma If src1 is Constrained: + (levels - 1) * ((src1 / (levels - 1))constant) + If src1 is Unconstrained: + src1constant + + +XieTypColorAllocTechnique +ColorAllocTechnique defines the recognized color allocation techniques used by the ConvertToIndex +element. +XieTypColorAllocTechnique { XieValDefault, +XieValColorAlloc_AllocAll, +XieValColorAlloc_Match, +XieValColorAlloc_Requantize } +* Default +ColorAlloc_AllocAll ALLOC-ALL +ColorAlloc_Match MATCH +ColorAlloc_Requantize REQUANTIZE +private-technique-number private-name-string +* The server is required to support the Default technique that is bound to one of the standard techniques defined above or a private tech- +nique. + +XieTypColorList +ColorList is the type for the XIE resource used to store COLORMAP allocations made by the ConvertTo- +Index element. A ColorList is a permanent resource and, as such, must be created and destroyed by the +client. A ColorList contains a counted list of the pixel indices that were allocated and the resource-id of +the COLORMAP from which they were allocated. +XieTypColorList XID + +XieTypCompareOp +CompareOp defines the operators for the Compare element. +XieTypCompareOp { XieValLT, XieValLE, +XieValEQ, XieValNE, +XieValGT, XieValGE } +* LT src1 < src2 or src1 < constant +* LE src1 £ src2 or src1 £ constant +* EQ src1 = src2 or src1 = constant +* NE src1 ¹ src2 or src1 ¹ constant +* GT src1 > src2 or src1 > constant +* GE src1 ³ src2 or src1 ³ constant + +XieTypConstant +Constant is typically used to supply per-band constant values. All constants are passed as floats. When a +constant is to be used as a substitute for a Constrained image pixel, the constant is rounded to the nearest +integer, and then hard-clipped to the range of levels that applies to the pixel for which it is a substitute. In +most other cases the constant is used as is (that is, as a float). +XieTypConstant XieTypTripletofXieTypFloat + +Element Op/arg/Tech Type Usage If Constrained ¼ + +Arithmetic Add Constant Pixel value when monadic round/hard-clip + Sub Constant Pixel value when monadic round/hard-clip + SubRev Constant Pixel value when monadic round/hard-clip + Min Constant Pixel value when monadic round/hard-clip + Max Constant Pixel value when monadic round/hard-clip + Mul Constant Multiplicand Use as is + Div Constant Divisor Use as is + DivRev Constant Dividend Use as is + Gamma Constant Exponent Use as is + +BandExtract coefficients Constant Multipliers Use as is + bias Float Final offset Use as is + +Blend constant Constant Pixel value when monadic round/hard-clip + alpha-constant Float Constant alpha value Use as is + +Compare constant Constant Pixel value when monadic round/hard-clip + +Constrain ClipScale Constant Scale src levels to dst levels Use as is + +Convert From/To RGB CIElab Matrix Conversion matrix Use as is + CIElabShift Constant White-point Use as is + CIEXYZ Matrix Conversion matrix Use as is + YCbCr Constant Luma values and bias Use as is + YCC Constant Luma values Use as is + YCC Float Scale Use as is + +ConvertToIndex Match Float Match-limit, gray-limit Use as is + +Convolve kernel LISTofFloat Convolution kernel Use as is + Constant Constant Edge pixel value round/hard-clip + +Geometry a,b,c,d,tx,ty Float Coefficients [6] Use as is + constant Constant Fill pixel value round/hard-clip + Gaussian Float Sigma, normalize Use as is + +Logical constant Constant Pixel value when monadic round/hard-clip + +MatchHistogram Gaussian Float Mean, sigma Use as is + Hyperbolic Float Constant Use as is + +PasteUp constant Constant Fill pixel value round/hard-clip + +Table 3-2 Treatment of floating point parameters passed through the protocol + +XieTypConstrainTechnique +ConstrainTechnique defines various methods of constraining data. These techniques are applied by the +Constrain element. +XieTypConstrainTechnique { XieValConstrain_ClipScale, +XieValConstrain_HardClip } +Constrain_ClipScale CLIP-SCALE +Constrain_HardClip HARD-CLIP +private-technique-number private-name-string + +XieTypConvertFromRGBTechnique +ConvertFromRGBTechnique defines the trichromatic colorspaces known to the ConvertFromRGB +element. +XieTypConvertFromRGBTechnique { XieValConvertFromRGB_CIELab, +XieValConvertFromRGB_CIEXYZ, +XieValConvertFromRGB_YCbCr, +XieValConvertFromRGB_YCC } +ConvertFromRGB_CIELab CIELAB +ConvertFromRGB_CIEXYZ CIEXYZ +ConvertFromRGB_YCbCr YCbCr +ConvertFromRGB_YCC YCC +private-technique-number private-name-string + +XieTypConvertToRGBTechnique +ConvertToRGBTechnque defines the trichromatic colorspaces known to the ConvertToRGB element. +XieTypConvertToRGBTechnique { XieValConvertToRGB_CIELab, +XieValConvertToRGB_CIEXYZ, +XieValConvertToRGB_YCbCr, +XieValConvertToRGB_YCC } +ConvertToRGB_CIELab CIELAB +ConvertToRGB_CIEXYZ CIEXYZ +ConvertToRGB_YCbCr YCbCr +ConvertToRGB_YCC YCC +private-technique-number private-name-string + +XieTypConvolveTechnique +ConvolveTechnique provides various methods of handling edge conditions in the Convolve element. +This technique determines what pixel values are used when Convolve requires data beyond the image +bounds. +XieTypConvolveTechnique { XieValDefault, +XieValConvolve_Constant, +XieValConvolve_Replicate } +* Default +Convolve_Constant CONSTANT +Convolve_Replicate REPLICATE +private-technique-number private-name-string +* The server is required to support the Default technique that is bound to one of the standard techniques defined above or a private tech- +nique. + +XieTypDataClass +DataClass defines the class of data being transported over the wire. +XieTypDataClass { XieValSingleBand, +XieValTripleBand } +* SingleBand Specifies index data (for example, ZPixmap format COLORMAP indices) or +achromatic data (bitonal or gray-scale). +* TripleBand Specifies nonindex trichromatic data (RGB or other supported colorspaces). + +XieTypDataStream +DataStream is a segmented stream of data units that are transported in either direction through the proto- +col stream. Segments of image data are transported as an arbitrary number of unsigned bytes, whereas all +other types of data (for example, lookup table entries, rectangles, histogram counts, and so on) must be +transported as one or more complete aggregates. The status, indicating the eventual end of data, is sup- +plied in the associated protocol request or reply. The interpretation of the data stream is determined by +parameters specified to the PhotoElement accepting or generating the data. +XieTypDataStream LISTofCARD8 + +XieTypDataType +DataType defines the limits and processing model for the data. +XieTypDataType { XieValConstrained, +XieValUnconstrained } +* Constrained Specifies pixels are integer values and are limited to the range [0, levels-1]. +* Unconstrained Specifies pixels may be any arbitrary value. + +XieTypDecodeTechnique +DecodeTechnique defines the techniques that can be used to interpret uncompressed image data or decode +compressed images. +XieTypDecodeTechnique { XieValDecode_UncompressedSingle, +XieValDecode_UncompressedTriple, +XieValDecode_CCITT-G31D, +XieValDecode_CCITT-G32D, +XieValDecode_CCITT-G42D, +XieValDecode_JPEG-Baseline, +XieValDecode_JPEG-Lossless, +XieValDecode_TIFF-2, +XieValDecode_TIFF-PackBits } +Decode_UncompressedSingle UNCOMPRESSED-SINGLE +Decode_UncompressedTriple UNCOMPRESSED-TRIPLE +Decode_CCITT-G31D CCITT-G31D +Decode_CCITT-G32D CCITT-G32D +Decode_CCITT-G42D CCITT-G42D +Decode_JPEG-Baseline JPEG-BASELINE +Decode_JPEG-Lossless JPEG-LOSSLESS +Decode_TIFF-2 TIFF-2 +Decode_TIFF-PackBits TIFF-PACKBITS +private-technique-number private-name-string + +XieTypDitherTechnique +DitherTechnique defines the techniques that can be used to dither an image. +XieTypDitherTechnique { XieValDefault, +XieValDither_ErrorDiffusion, +XieValDither_Ordered } +* Default +Dither_ErrorDiffusion ERROR-DIFFUSION +Dither_Ordered ORDERED +private-technique-number private-name-string +* The server is required to support the Default technique that is bound to one of the standard techniques defined above or a private tech- +nique. + +XieTypEncodeTechnique +EncodeTechnique defines the techniques that can be used to compress an image or format it as uncom- +pressed data. +XieTypEncodeTechnique { XieValEncode_ServerChoice, +XieValEncode_UncompressedSingle, +XieValEncode_UncompressedTriple, +XieValEncode_CCITT-G31D, +XieValEncode_CCITT-G32D, +XieValEncode_CCITT-G42D, +XieValEncode_JPEG-Baseline, +XieValEncode_JPEG-Lossless, +XieValEncode_TIFF-2, +XieValEncode_TIFF-PackBits } +Encode_ServerChoice (not returned by QueryTechniques) +Encode_UncompressedSingle UNCOMPRESSED-SINGLE +Encode_UncompressedTriple UNCOMPRESSED-TRIPLE +Encode_CCITT-G31D CCITT-G31D +Encode_CCITT-G32D CCITT-G32D +Encode_CCITT-G42D CCITT-G42D +Encode_JPEG-Baseline JPEG-BASELINE +Encode_JPEG-Lossless JPEG-LOSSLESS +Encode_TIFF-2 TIFF-2 +Encode_TIFF-PackBits TIFF-PACKBITS +private-technique-number private-name-string + +XieTypExecutable +Executable is the type used to identify a specific Photoflo instance. +XieTypExecutable +[ name-space ServerIDSpace or XieTypPhotospace + flo-id XieTypPhotoflo or CARD32 +] +Name-space identifies the execution domain used for a Photoflo. Flo-id identifies a particular instance of +a Photoflo. +For stored Photoflos name-space is always ServerIDSpace (the value zero) and flo-id is the Photo- +flo's resource-id. +For immediate Photoflos name-space is a Photospace resource-id and flo-id is a 32-bit value that +uniquely identifies the instance of the Photoflo within name-space. + +XieTypExportNotify +ExportNotify is used by ExportClient elements to control how ExportAvailable events are sent to +the client. +XieTypExportNotify { XieValDisable +XieValFirstData +XieValNewData } +* Disable Specifies no events are sent. +* FirstData Specifies a single event is sent when the first data is available. +* NewData Specifies an event is sent each time the amount of available data changes from zero to nonz- +ero. + +The end of data is signaled by a final flag in the GetClientData reply that is returned when the last segment of data is retrieved. + +XieTypExportState +ExportState is a status value returned from an ExportClient element in a reply to the corresponding +GetClientData protocol request. +XieTypExportState { XieValExportDone, +XieValExportMore, +XieValExportEmpty, +XieValExportError } +* ExportDone Specifies all data has been retrieved. +* ExportMore Specifies more data currently is available. +* ExportEmpty Specifies no more data is available at this time. +* ExportError Specifies an error condition prevents data availability. + +XieTypFloat +Float specifies data is in the IEEE single-precision format as described in ANSI/IEEE Standard 754- +1985, IEEE Standard for Binary Floating-Point Arithmetic. Float is used only for constant parameter +values, matrix coefficients, and so on but never for transported image data. The byte order of each Float +is dealt with in the same manner as other numeric values; it is determined at core protocol connection +setup time. + +XieTypGamutTechnique +GamutTechnique defines the gamut compression techniques used by ConvertToRGB to deal with con- +verted colors that lie outside the gamut of the RGB space. +XieTypGamutTechnique { XieValDefault, +XieValGamut_None, +XieValGamut_ClipRGB } +* Default +Gamut_None NONE +Gamut_ClipRGB CLIP-RGB +private-technique-number private-name-string +* The server is required to support the Default technique that is bound to one of the standard techniques defined above or a private tech- +nique. + +XieTypGeometryTechnique +GeometryTechnique defines the retrospective image resampling techniques used by the Geometry ele- +ment. +XieTypGeometryTechnique { XieValDefault, +XieValGeometry_Antialias, +XieValGeometry_AntialiasByArea, +XieValGeometry_AntialiasByLowpass, +XieValGeometry_BilinearInterpolation, +XieValGeometry_Gaussian, +XieValGeometry_NearestNeighbor } +* Default +Geometry_Antialias ANTIALIAS +Geometry_AntialiasByArea ANTIALIAS-BY-AREA +Geometry_AntialiasByLowpass ANTIALIAS-BY-LOWPASS +Geometry_BilinearInterpolation BILINEAR-INTERPOLATION +Geometry_Gaussian GAUSSIAN +Geometry_NearestNeighbor NEAREST-NEIGHBOR +private-technique-number private-name-string +* The server is required to support the Default technique that is bound to one of the standard techniques defined above or a private tech- +nique. + +XieTypHistogramData +HistogramData defines the organization of histogram entries created by the ExportClientHistogram +element. +XieTypHistogramData +[ value CARD32 + count CARD32 +] + +XieTypHistogramShape +HistogramShape defines the various match-histogram shape techniques that can be requested in the +MatchHistogram element. +XieTypHistogramShape { XieValHistogram_Flat, +XieValHistogram_Gaussian, +XieValHistogram_Hyperbolic } +Histogram_Flat FLAT +Histogram_Gaussian GAUSSIAN +Histogram_Hyperbolic HYPERBOLIC +private-technique-number private-name-string + +XieTypInterleave +Interleave defines the way in which bands of TripleBand data may be interleaved. +XieTypInterleave { XieValBandByPixel, +XieValBandByPlane } +* BandByPixel Specifies the data for all bands are interleaved on a per-pixel basis and transmitted as a sin- +gle data plane (for example, for RGB data red, green, and blue values for a given pixel are +immediately followed by the red, green, and blue values for the next pixel). BandByPixel is +similar to the core protocol ZPixmap format. +* BandByPlane Specifies the data for each band are transmitted as separate data planes (for example, for +RGB data all red data are transmitted in one plane, all green data in a separate plane, and all +blue data in another plane). + +Interleave is generally used in conjunction with Orientation, which would define the order of the interleaved bands. + +XieTypLevels +Levels describes the potential dynamic range for the quantization levels associated with each band of an +image. +XieTypLevels XieTypTripletofCARD32 + Note: for Constrained image data a value of zero (0) represents 232 (4,294,967,296) levels. + +XieTypLUT +LUT is the type for the XIE server resource used to hold arrays that map one set of values to another. The +arrays are one-dimensional, and the resource holds either one or three arrays. The ImportClientLUT and +ImportLUT elements are used to import LUT data into a Photoflo, the Point element uses the data, the +ExportLUT element is used to (re)populate the LUT resource, and the ExportClientLUT element is pro- +vided to facilitate sending the LUT data back to the client. +XieTypLUT XID + +XieTypMathOp +MathOp defines the valid mathematical operations that can be invoked through the Math element. The +MathOp is applied to each input pixel value to determine the output pixel value. +XieTypMathOp { XieValExp, XieValLn, +XieValLog2, XieValLog10, +XieValSquare, XieValSqrt } +* Exp Exponential +* Ln Natural logarithm +* Log2 Logarithm base 2 +* Log10 Logarithm base 10 +* Square Square +* Sqrt Square root + +XieTypMatrix +Matrix is a 3 x 3 matrix of floats that is used by some of the colorspace conversion techniques (for exam- +ple, conversion between RGB and CIE colorspaces). +XieTypMatrix XieTypTripletofXieTypConstant + +XieTypOrientation +Orientation defines the transmission order of image data units through the protocol stream. +XieTypOrientation { XieValLSFirst, XieValMSFirst } +Note: in the examples that follow, the order of bytes in the DataStream should be read from left to right. + +encoded-order Specifies the order of bits within bytes of encoded (compressed) data. +Example: Showing 2 bytes (within each byte the first encoded bit is 0, last is bit 7) + +LSFirst +MSFirst + +76543210 76543210 +01234567 01234567 +fill-order When multiple pixels are put in the same byte, or a pixel spans multiple bytes, fill- +order specifies whether the pixels (or parts of a pixel) are packed into the most or least +significant bits of a byte first. +Example: Showing 8 2-bit pixels (aa, bb, cc, and so on), and 2 10-bit pixels: aaaaaaaaaa and +bbbbbbbbbb) + +LSFirst +MSFirst + +ddccbbaa hhggffee +aabbccdd eeffgghh + +aaaaaaaa bbbbbbaa xxxxbbbb +aaaaaaaa aabbbbbb bbbbxxxx +pixel-order For pixels that span a byte boundary, pixel-order specifies whether the most or least +significant bits of the pixel are put into the DataStream first. Any pad bits that are +present between pixels always follow the pixel data (that is, pad bits are not considered +to be either LS-bits or MS-bits of the pixel data). +Example: Showing 2 10-bit pixels, each with 2 bits of pad (within each pixel the LS-bits are 0 and +a, the MS-bits are 9 and j, the pad bits are p) +fill-order +LSFirst (pixel-order) +MSFirst (pixel-order) +LSFirst +76543210 dcbapp98 ppjihgfe +98765432 jihgpp10 ppfedcba +MSFirst +76543210 98ppdcba jihgfepp +98765432 10ppjihg fedcbapp +band-order Definition: at the protocol level, the least significant band of trichromatic data is the +first band mentioned in the common name of the colorspace (for example, red is the +least significant band of RGB data). + For BandByPixel data, band-order specifies whether this band is put in the least or +most significant bits of a pixel. + +LSFirst +MSFirst + +B1B0G2G1G0R2R1R0 +R2R1R0G2G1G0B1B0 + For BandByPlane data, band-order specifies whether this band corresponds with the +least significant or most significant image plane. Each plane is transported as a sepa- +rate DataStream. +band +LSFirst +MSFirst +0 +R7R6R5R4R3R2R1R0 +B7B6B5B4B3B2B1B0 +1 +G7G6G5G4G3G2G1G0 +G7G6G5G4G3G2G1G0 +2 +B7B6B5B4B3B2B1B0 +R7R6R5R4R3R2R1R0 + For all other instances where a triplet of per-band information is conveyed through the +protocol (levels, constants, and so on), the first element of the triplet corresponds with +the least significant band as defined above. +XieTypPhotoElement +PhotoElement, or just element, is a generic type used for import, process, or export elements in a Pho- +toflo. The syntax of a generic element was described in Chapter 2. The actual element definitions are +found in Chapters 6, 7, and 8. + +XieTypPhotoflo +Photoflo is the type for the XIE server resource that is used to represent a sequence of image processing +operations. Stored Photoflos are permanent resources. As such, they must be created and destroyed by +the client. +XieTypPhotoflo XID +For immediate Photoflos, see type Photospace and the ExecuteImmediate protocol request. + +XieTypPhotofloOutcome +PhotofloOutcome is returned by the PhotofloDone event and indicates the reason why the Photoflo left +the Active state. +XieTypPhotofloOutcome { XieValFloSuccess, +XieValFloError, +XieValFloAbort } +* FloSuccess Specifies the Photoflo completed normally. +* FloError Specifies the Photoflo terminated due to an error condition. +* FloAbort Specifies the Photoflo was aborted by the client. + +XieTypPhotofloState +PhotofloState identifies the current execution state of a Photoflo. +XieTypPhotofloState { XieValInactive, +XieValActive, +XieValNonexistent } +* Inactive Specifies the state of a stored Photoflo prior to execution, after an error or abort, or after +execution completes. Inactive stored Photoflos can be modified and redefined. +* Active Specifies the state of a stored or immediate Photoflo during execution. + Specifies a Photoflo remains Active until: + All export elements have finished their task, and + All data exported for the client have been retrieved, or + An error prevents further progress, or + The client issues an abort request +* Nonexistent Specifies the state of a Photoflo that does not exist (never existed or has been destroyed). + +XieTypPhotomap +Photomap is the type for the XIE resource used to store image data in the server. A Photomap is a per- +manent resource that can be created and destroyed by the client. ImportPhotomap is used to import per- +manent image data into a Photoflo. ExportPhotomap is used to (re)populate the resource. +XieTypPhotomap XID + +XieTypPhotospace +Photospace is the type for the XIE resource used to define a XIE name space within which immediate +Photoflos may be executed. A Photospace is a permanent resource and as such must be created and de- +stroyed by the client. +XieTypPhotospace XID + +XieTypPhototag +Phototag is the position or index of a PhotoElement within a list of elements used to specify a Photoflo. +The first element in the list has a Phototag value of one (1). A Phototag value of zero (0) is reserved for +special purposes, such as, indicating an optional element input that is not connected or indicating Photo- +flo errors that are not specific to an element. +XieTypPhototag CARD16 +XieTypProcessDomain +ProcessDomain is a substructure inserted in many PhotoElement definitions. It is used to restrict the +element's processing to a subset of the source data pixels. A ProcessDomain can be either a list-of- +rectangles or a control-plane. +XieTypProcessDomain +[ offset-x INT32 +offset-y INT32 +domain XieTypPhototag +] +Offset-x and offset-y specifies the spatial registration between the element's data source(s) and the +ProcessDomain (that is, offset relative to the origin of the source(s)). Domain is the Phototag of the ele- +ment providing the ProcessDomain data. +If the value zero (0) is specified for domain, processing is not restricted by the processing domain; other- +wise, domain references an element outputting a list-of-rectangles or image data that is used as a control- +plane. +If domain is a list-of-rectangles, processing is restricted to the intersection of the data source(s) and any +rectangle within the list (offset-x and offset-y are added to the x and y of each rectangle). +If domain is a source of Constrained, SingleBand, bi-level image data (that is, a control-plane), process- +ing is restricted to the intersection of the data source(s) and nonzero locations within domain. +ProcessDomain is not supported by DIS but is included in the subset because the Point element takes a +ProcessDomain as a parameter (in this case domain must be zero). + +XieTypRectangle +Rectangle describes a rectangle used in XieTypROI. +XieTypRectangle +[ x INT32 +y INT32 +width CARD32 +height CARD32 +] +X and y are the coordinates of the upper left hand corner of the rectangle within the ProcessDomain (the +domains x,y offset is also added to these coordinates to position the rectangle relative to the image being +processed). Width and height are the extent of the rectangle. + +XieTypROI +ROI (Rectangles-Of-Interest) is the XIE resource used to contain a list-of-rectangles (input for a +ProcessDomain). A ROI resource is a permanent resource and, as such, must be created and destroyed +by the client. ImportClientROI and ImportROI elements are used to import a list-of-rectangles into a +Photoflo, the ExportROI element is used to (re)populate an ROI resource, and the ExportClientROI +element is provided to facilitate sending rectangles back to the client *. +XieTypROI XID +* The list-of-rectangles that can be retrieved by the client need not be identical to the original list that was received from the client, but it +must be logically equivalent. +XieTypServiceClass +ServiceClass defines the recognized image processing service sets supported by this X Image Extension +standard. +XieTypServiceClass { XieValFull, XieValDIS } +* Full Specifies supports the entire XIE protocol as defined in this document. +* DIS Specifies upports the Document Image Subset, a proper subset of Full XIE. +An itemized list of XIE types, techniques, protocol requests, elements, events, and errors that are included in each ServiceClass can be +found in Appendix B. + +XieTypTechniqueGroup +TechniqueGroup defines the standard technique group names that can be queried using the QueryTech- +niques protocol request. +XieTypTechniqueGroup { XieValDefault, +XieValAll, +XieValColorAlloc, +XieValConstrain, +XieValConvertFromRGB, +XieValConvertToRGB, +XieValConvolve, +XieValDecode, +XieValDither, +XieValEncode, +XieValGamut, +XieValGeometry, +XieValHistogram, +XieValWhiteAdjust } +* Default Specifies select all default techniques. +* ColorAlloc Specifies select color allocation techniques. +* Constrain Specifies select techniques for constraining data. +* ConvertFromRGB Specifies select colorspace conversion techniques (for conversion from the RGB color- +space). +* ConvertToRGB Specifies elect colorspace conversion techniques (for conversion to the RGB colorspace). +* Convolve Specifies select techniques for handling convolution edge conditions. +* Decode Specifies select image decoding (decompression) techniques. +* Dither Specifies select dithering techniques. +* Encode Specifies select image encoding (compression) techniques. +* Gamut Specifies select colorspace conversion gamut compression techniques. +* Geometry Specifies select geometric sampling techniques. +* Histogram Specifies select match-histogram shapes. +* WhiteAdjust Specifies select colorspace conversion white point adjustment techniques. + +If a vendor defined an additional private technique group, it could be discovered by querying for All groups. +XieTypTechniqueRec +TechniqueRec defines the information that is returned for each technique in the reply to a QueryTech- +niques protocol request. +XieTypTechniqueRec +[ needs-parameters BOOL +group XieTypTechniqueGroup +number CARD16 +speed CARD8 +name STRING8 +] +Needs-parameters indicates that a technique requires additional parameters; or if false, the technique ei- +ther takes no parameters or its parameters are optional. Group identifies which group the technique be- +longs to. Number is the numeric identifier assigned to the technique *. Speed represents the server's view +of the speed of this technique relative to the other techniques in the same group (0 is the slowest, and 255 +is the fastest). Name is the XIE compliant technique name string. +* Numbers assigned to standard techniques are encoded in Appendix C. + +XieTypTile +Tile defines a source data tile for the PasteUp element. +XieTypTile +[ src XieTypPhototag +dst-x INT32 +dst-y INT32 +] +Src is the Phototag of the element supplying source data. Dst_x, dst_y specify the coordinates where the +tile belongs in the output data. + +XieTypTripletoftype +Tripletof is a generic type used to define a fixed sized array of 3 items* of the specified type. +XieTypTripletof [ v0, v1, v2 : (of type) ] +* Tripletof is usually used to describe per-band attributes and parameters. When dealing with SingleBand images, the value zero must +be used for the nonexistent bands. +XieTypWhiteAdjustTechnique +WhiteAdjustTechnique defines the white point adjustment techniques that can be used when converting +to or from the RGB colorspace. +XieTypWhiteAdjustTechnique { XieValDefault, +XieValWhiteAdjust_None, +XieValWhiteAdjust_CIELabShift } +* Default +WhiteAdjust_None NONE +WhiteAdjust_CIELabShift CIELAB-SHIFT +private-technique-number private-name-string +* The server is required to support the Default technique that is bound to one of the standard techniques defined above or a private tech- +nique. + + + + + + + + + + + + + + + + + + + + + + +almost blank + +Protocol Parameter Types 3-17 + + +4 +Resources +Overview +XIE resources are extension server objects created by the client that contain information used by the +extension in carrying out various protocol requests. There are protocol requests to create and destroy +each resource type. Resource identifiers are generated by the client as defined by the core protocol. +All XIE resources are reference counted. +Binding Resources to Photoflos +Each resource that is referenced from a Photoflo is bound to the Photoflo (and its reference count is +incremented) when the Photoflo becomes Active. +ColorList resources +A ColorList is purged of previous allocations when a Photoflo begins execution and is populated +with new allocations (via ConvertToIndex) as the Photoflo proceeds. A ColorList can only be refer- +enced by one Active Photoflo at a time. The ColorList's reference count is decremented when the +Photoflo is no longer Active. +LUT, Photomap, and ROI resources +These XIE resources consist of two parts: one part contains the resource-id; the other part holds at- +tributes and data. Figure 4-1 pictures the first part as a handle and the second part as a bucket. Upon +resource creation only the handle exists. The bucket is created when the Photoflo (referencing the +handle via an ExportResource element) becomes Active. The handle and bucket are joined when +the Photoflo successfully completes. Conceptually each part contains a separate reference count. + +Figure 4-1 Creating and populating a new Photomap +In the case of ImportResource elements, the handle and bucket are both bound to the Photoflo +when it first becomes Active (initialization). For ExportResource elements, only the handle is +bound at this time, and a new bucket is created to hold the forthcoming data. This buckets attributes +are derived from the ExportResource element. +If an export handle is already connected to a bucket, the old bucket remains with its handle until suc- +cessful Photoflo completion. Thus, the old bucket is preserved if the Photoflo terminates due to an +error condition or if an Abort request is received from the client. +The new bucket is filled with data as the Photoflo proceeds. When the Photoflo successfully com- +pletes, old buckets can be freed if they have no other references, and the waiting handle is joined to +the new bucket. This is illustrated in figure 4-2. + +Figure 4-2 Process image from Photomap a, place result into Photomap b +This model also allows pseudo in-place operations, such as, that illustrated in figure 4-3. Here an im- +age is imported from a Photomap, processed, and then the result is exported back to the same Pho- +tomap. Note that upon completion the old handle is moved to the new bucket, and the old bucket is +destroyed. +irs +Figure 4-3 Process image from Photomap a in-place +Resource destruction +When a destroy request is received the resource-id is immediately disassociated from the resource and +the resource's reference count(s) is(are) decremented. For each reference count that goes to zero, the +associated resources are freed (for example, memory or colors). +Synchronizing resource access +If multiple Photoflos reference the same resource, the client must synchronize access to the resource +(for example, Await completion of the Photoflo writing the resource before beginning execution of a +Photoflo reading from the resource). Core resources can be volatile, requiring the client to maintain +the data integrity of the resource while the Photoflo is active. +Capability Acquisition +QueryImageExtension +XieReqQueryImageExtension +client-major-version: CARD16 +client-minor-version: CARD16 +* +server-major-version: CARD16 +server-minor-version; CARD16 +service-class: XieTypServiceClass +alignment: XieTypAlignment +unconstrained-mantissa: CARD16 +unconstrained-max-exp: INT32 +unconstrained-min-exp: INT32 +constrained-levels: LISTofCARD32 +Errors: Alloc +Events: none +QueryImageExtension returns information about the XIE server's capabilities. Each client should +use QueryImageExtension to establish version compatibility between client and server prior to +making any other XIE request. If a client fails first to establish the desired version using Query- +ImageExtension, the behavior of other requests is undefined (which generally means that the server +will use the version number of its own choice). +Client-major-version and client-minor-version specify which version of the XIE protocol the client +would like to use. If the client can support multiple versions, the highest version should be given. +The server-major-version and server-minor-version specify the version of the XIE protocol that the +server expects from the client. If the server supports the version requested by the client, this version +number will be returned. If the client has requested a higher version than is supported by the server, +the server's highest version will be returned. Otherwise, if the client has requested a lower version +than is supported by the server, the server's lowest version will be returned. It is the client's responsi- +bility to decide whether or not it can match the servers version of the protocol. +Service-class specifies the ServiceClass supported by the XIE server . Alignment specifies the image +data alignment restrictions of the server (that is, the alignment of pixels and scanlines). +The following parameters convey the approximate range and granularity of Unconstrained data in +the XIE server. For servers that represent Unconstrained data using floating point, unconstrained- +mantissa returns the number of bits in the servers floating point format (including the sign bit). If +the server uses fixed point, unconstrained-mantissa is zero. Unconstrained-max-exp returns the larg- +est value n such that 2n - 1 is representable in the servers Unconstrained data format. Uncon- +strained-min-exp returns the smallest (most negative) value n such that 2n is representable in the +servers Unconstrained data format. +Constrained-levels provides a hint about how the XIE server might process Constrained data most +efficiently. Constrained-levels returns a list of levels that are recommended for Constrained data +by the server. (a value of zero means 232 levels). +Error Cause +Alloc Insufficient resources + +Technique Acquisition +QueryTechniques +XieReqQueryTechniques +technique-group: XieTypTechniqueGroup +* +technique-information: ListofXieTypTechniqueRec +Errors: Alloc, Value +Events: none +QueryTechniques returns information about the standard and private techniques that are supported +by the server. The server may be queried for All techniques, all Default techniques, or a group of +techniques that are functionally similar (for example, all Geometry techniques). +Technique-group specifies the group of techniques for which the server is to return information. +Technique-information is a list of TechniqueRec entries that are returned in arbitrary order. Each +entry contains the following information: +needs-parameters If true, indicates that the technique requires additional parameters; if +false, the technique takes no parameters, or it has parameters that +are optional. If parameters are optional, they must be totally omit- +ted, or they must all be supplied. +group Identifies which group the technique belongs to. +number The numeric identifier assigned to the technique (MS bit is zero for +standard techniques or one for private techniques). +speed The server's assessment of the speed of this technique relative to +other techniques in the same group (0 :== slowest, 255 :== fastest). +name The XIE compliant technique name string of the form: + or +__ +The technique number is supplied to pipeline elements to specify a desired algorithm or technique. +While numbers for standard techniques can be hard-coded (for example, defined in an include file), +numbers for private techniques must be obtained using the QueryTechniques protocol request prior +to their use. +Error Cause +Alloc Insufficient resources +Value Unknown technique-group +A complete description of each technique and its parameters is given in Appendix A. A summary of standard techniques itemized by +service class can be found in Appendix B. Numbers assigned to standard techniques are encoded in Appendix C. + +ColorList +CreateColorList +XieReqCreateColorList +color-list: XieTypColorList +Errors: Alloc, IDChoice +Events: none +CreateColorList creates an unpopulated server resource that can be used to store the list of colors +allocated by a ConvertToIndex element. The COLORMAP allocations that are recorded in a Col- +orList belong to the client that executed the Photoflo that populated the resource (this is not neces- +sarily the same client that created the ColorList). A ColorList cannot be the target of more than one +Active Photoflo at a time. +Color-list is the client supplied ColorList identifier to be assigned to this resource. +Color-list is populated (or repopulated) with new COLORMAP allocations via a ConvertToIndex ele- +ment as the Photoflo executes. The contents of color-list may be queried using QueryColorList. +The client may explicitly purge all allocated cells from color-list using PurgeColorList. The client +may cause an implicit deallocation of cells from color-list by making it the target of a Photoflo and +commencing its execution. An implicit purge also takes place if the COLORMAP referenced by color- +list is freed or if the client that owns the cells exits (that is, the client that populated color-list). +Color-list can be destroyed using DestroyColorList. +Error Cause +Alloc Insufficient resources +IDChoice Invalid color-list + + +DestroyColorList +XieReqDestroyColorList +color-list: XieTypColorList +Errors: ColorList +Events: none +DestroyColorList disassociates the resource-id from color-list and decrements its reference count. If +there are no other references, it frees colors held in color-list and, then, destroys the ColorList iden- +tified by color-list. +Error Cause +ColorList Invalid color-list + +PurgeColorList +XieReqPurgeColorList +color-list: XieTypColorList +Errors: Access, ColorList +Events: none +PurgeColorList frees the colors from the ColorList identified by color-list. +Error Cause +Access Attempt to purge colors when color-list is being written by a Photoflo +ColorList Invalid color-list + + +QueryColorList +XieReqQueryColorList +color-list: XieTypColorList +* +colormap: COLORMAP +colors: LISTofCARD32 +Errors: Alloc, ColorList +Events: none +QueryColorList returns a list of colors allocated by a ConvertToIndex element. +Color-list is the ColorList resource to be queried. Colormap is the COLORMAP from which the col- +ors were allocated. Colors is the list of allocated COLORMAP indices. When there are no colors in +color-list, the value zero (0) is returned for colormap, and the list of colors is of length zero. +Error Cause +Alloc Insufficient resources +ColorList Invalid color-list +Notes: +* The COLORMAP was originally supplied by the client as a ConvertToIndex parameter. +* The returned colors are owned by the server and, therefore, should not be freed via core X protocol requests (for example, +FreeColors) +* The allocated colors can be freed by: + Issuing a PurgeColorList or DestroyColorList request + Commencing execution of a Photoflo that targets color-list + Freeing colormap + Shutting down the client that populated color-list + +LUT +CreateLUT +XieReqCreateLUT +lut: XieTypLUT +Errors:: Alloc, IDChoice +Events: none +CreateLUT creates a server resource that is used as a lookup table by the Point element. A lookup +table consists of one or three single dimension arrays, each long enough to contain an entry for all +possible pixels values in the image data to which the Point element will be applied. +Lut is the client supplied LUT identifier to be assigned to this resource. +The LUT is populated (or repopulated) with lookup table entries after the successful execution of a +Photoflo containing an ExportLUT element that targets lut. Lookup table data can be imported into +a Photoflo using an ImportLUT element. These data can be used by Point, and they can be exported +to the client with the aid of an ExportClientLUT element. +Lut can be destroyed using DestroyLUT. +Error Cause +Alloc Insufficient resources +IDChoice Invalid lut +A LUT can be populated with a simple ExecuteImmediate( ImportClientLUT, ExportLUT ) Photoflo. PutClientData is then +used to transport the lookup table entries. See ImportClientLUT and Point for further information on LUTs + + +DestroyLUT +XieReqDestroyLUT +lut: XieTypLUT +Errors: LUT +Events: none +DestroyLUT disassociates the resource-id from lut and decrements its reference count. If there are +no other references, it destroys the LUT identified by lut. +Error Cause +LUT Invalid lut + +Photomap +CreatePhotomap +XieReqCreatePhotomap +photomap: XieTypPhotomap +Errors: Alloc, IDChoice +Events: none +Attribute Value +class Undefined (see text) +type Undefined (see text) +width Undefined (see text) +height Undefined (see text) +levels Undefined (see text) +CreatePhotomap creates a server resource that is used to store image data. Photomap data may be +rendered for display or used as input to control or modify the rendition of another image. +Photomap is the client supplied Photomap identifier to be assigned to this resource. Photomap at- +tributes are defined when a Photoflo containing an ExportPhotomap element populates photomap +with data. +The Photomap is populated (or repopulated) with image data after the successful execution of a Pho- +toflo containing an ExportPhotomap element that targets photomap. Photomap data can be im- +ported into a Photoflo for rendition or control purposes using an ImportPhotomap element. It can +also be exported back to the client with the aid of an ExportClientPhoto element. Photomap attrib- +utes can be queried using QueryPhotomap. Photomap can be destroyed using DestroyPhotomap. +Error Cause +Alloc Insufficient resources +IDChoice Invalid photomap +A Photomap can be populated with a simple ExecuteImmediate(ImportClientPhoto, ExportPhotomap) Photoflo. PutClient- +Data is then used to transport the image data. See ImportClientPhoto and ExportPhotomap and their associated techniques for +more information regarding the format of image data. +DestroyPhotomap +XieReqDestroyPhotomap +photomap: XieTypPhotomap +Errors: Photomap +Events: none +DestroyPhotomap disassociates the resource-id from photomap and decrements its reference count. +If there are no other references, it destroys the Photomap identified by photomap. +Error Cause +Photomap Invalid photomap +QueryPhotomap +XieReqQueryPhotomap +photomap: XieTypPhotomap +* +populated: BOOL +data-type: XieTypDataType +data-class: XieTypDataClass +width: XieTypTripletofCARD32 +height: XieTypTripletofCARD32 +levels: XieTypLevels +decode: XieTypDecodeTechnique +Errors: Alloc, Photomap +Events: none +QueryPhotomap returns the queriable attributes of a Photomap. +Photomap is the Photomap to be queried. +Populated is a Boolean that indicates that photomap has been populated with attributes and data. If +populated is false, all remaining fields contain zeros. Data-type shows whether the number of quan- +tization levels is valid (Constrained) or unknown (Unconstrained). Data-class is the class of image +data (that is, SingleBand or TripleBand). Width and height are the dimensions of the image data in +pixels (per band). Levels is the potential dynamic range or number of quantization levels (per band). +Decode is the DecodeTechnique that will be required to interpret or decompress the data. +If data-type is Unconstrained, the returned values for levels are zeros. If data-class is SingleBand, +width, height, and levels for unused bands are returned as zeros. +Error Cause +FloAlloc Insufficient resources +Photomap Invalid photomap + +ROI +CreateROI +XieReqCreateROI +roi: XieTypROI +Errors: Alloc, IDChoice +Events: none +CreateROI creates a server ROI (Rectangles-Of-Interest) resource. A ROI resource may be im- +ported into a Photoflo and used in conjunction with a ProcessDomain specification to restrict proc- +essing to a subset of image data. The ROI, when populated, will contain a list-of-rectangles (of type +Rectangle). +Roi is the client supplied ROI identifier to be assigned to this resource. +The ROI is populated (or re-populated) with a list-of-rectangles after the successful execution of a +Photoflo containing an ExportROI element that targets roi. An ROI resource does not have any +queriable attributes. +ROI data can be imported into a Photoflo using an ImportROI element. This data, which is used +by several of the PhotoElements defined in chapters 7 and 8, can also be exported back to the client +with the aid of an ExportClientROI element. +Roi can be destroyed using DestroyROI. +Error Cause +Alloc Insufficient resources +IDChoice Invalid roi +An ROI can be populated with a simple ExecuteImmediate ( ImportClientROI, ExportROI ) Photoflo. PutClientData is then +used to transport the list-of-rectangles. +If the client uses ExportClientROI to retrieve a list-of-rectangles from the server, the number of rectangles and the content of the +list that is returned may differ from original list that was obtained from the client, but its contents will be logically equivalent. + + +DestroyROI +XieReqDestroyROI +roi: XieTypROI +Errors: ROI +Events: none +DestroyROI disassociates the resource-id from roi and decrements its reference count. If there are no +other references, it destroys the ROI identified by roi. +Error Cause +ROI Invalid roi + + + ServiceClasses defined in this document include: Full XIE and DIS. + + +Resources 4-10 + + +5 +Pipelined Processing +What is a Photoflo? +A Photoflo is a directed acyclic graph. Each node has zero or more input connections and zero or one +output connection. A node specifies the source for an input by identifying another upstream node. A +node's output connection can be used as a source for any number of downstream input connections. A +Photoflo is permitted to have taps and multiple final destinations. +The protocol representation of a Photoflo is a list of elements. Because the entire list is sent to the +server as a single protocol request, the total length of the list, including its protocol header, must fit +within a maximum size protocol message (see, maximum-request-length, established by X11 connec- +tion setup). +Each element of the Photoflo is identified by its position in the list. This position, or index, is called a +Phototag. The first element in the list is index one (1). The order of elements in the list does not +have to match the Photoflo topology because there is no implicit coupling of output N to input N+1. +The source for each element's input connections are explicitly specified using the Phototags of up- +stream elements. +There are three types of elements. Import elements bring data into the Photoflo from external re- +sources or the client, have one output connection, and no input connections. Process elements per- +form some operation on the data (for example, convolution), have one or more input connections, and +exactly one output connection. Export elements emit data from the Photoflo to external resources or +to the client, have one input connection, and no output connections. A Photoflo should include at +least one import element and one export element to be useful. + + +Import +Process +Export +Number of input connections +none +one or more +one +Number of output connections +one +one +none + + + + + +Figure 5-1 Photoflo element input and output connections +All data external to the Photoflo (internal server data and client data) are accessed through import +and export elements. Therefore, for purposes of Photoflo definition and modification, X and XIE re- +source-ids are considered element parameters rather than element sources or destinations. No element +is permitted to reference a Photoflo for any reason. It is also an error to specify an export element as +an input to any element. +Figure 5-2 illustrates several capabilities of Photoflo construction. An RGB image is imported from +the client. This image is saved in a Photomap for later reuse. The blue band is selected and trans- +lated (to correct registration). This result is exported back to the client. A BandCombine element +associates a single band imported from a Photomap (the red band), with the green band selected from +the initial RGB image, and the reregistered blue band. The combined image is then converted to in- +dex data and exported to a PIXMAP and to a WINDOW. The color allocation results are saved in a +ColorList. + +Figure 5-2 Example Photoflo +Two kinds of Photoflos +There are stored Photoflos and immediate Photoflos. Stored Photoflos persist beyond execu- +tion and may be modified or totally redefined prior to subsequent executions. Immediate Photoflos +are ephemeral a single protocol request defines and begins its execution; then, it is automatically +destroyed upon completion. Services common to both types of Photoflos are: +* Event notification +* Error notification +* Put data: send data from the client into a Photoflo +* Get data: return data exported from a Photoflo back to the client +* Query: return information about the Photoflo +* Await: block future client requests until the Photoflo completes +* Abort: terminate Photoflo execution prematurely +Multi-client Photoflos +A stored Photoflo can be executed by a client other than the client that created it. It is also possi- +ble that the Photoflo may reference resources that belong to other clients, and data may be supplied +and retrieved by various clients. The following rules apply when multiple clients are involved in the +execution of a Photoflo: +* Errors that stem from executing Photoflo elements are sent to the client executing the Photoflo. +* Errors that stem from executing client data put or get requests go to the client executing the request. +* Colors recorded in a ColorList resource belong to the client executing the Photoflo. +* PhotofloDone events are sent to the client executing the Photoflo. +* Multiple clients can Await completion of a given Photoflo. +Photoflo States +Stored Photoflos enter the Inactive state upon creation and transition to the Active state when exe- +cution is requested. Immediate Photoflos are both created and made Active by the execute request. +A Photoflo remains Active until all ImportClient elements have received a final flag, all export +elements have finished their task, and all data exported for the client have been retrieved, or an error +prevents further progress, or the client issues an Abort request. After execution stored Photoflos +return to the Inactive state, whereas immediate Photoflos are destroyed (become Nonexistent). +The client may destroy a stored Photoflo at any time. + Stored Photoflo Immediate Photoflo + +Figure 5-3 Photoflo states +Flo'ing Data to a Resource +Besides image rendition and display, immediate or stored Photoflos are also used to populate +XIE resources with data and attributes. Some form of processing may be applied to the data, but in +the simplest case, a two element import/export Photoflo is generally sufficient. +Also all types of ephemeral client data may be imported and used directly by a Photoflo, without the +necessity of first storing it in an XIE resource. For example, simple transport of an image +(compressed or uncompressed) to a WINDOW is expected. +Import element Export element purpose +ImportClientPhoto ExportPhotomap Populate a Photomap resource +ImportClientLUT ExportLUT Populate a LUT resource (lookup table) +ImportClientROI ExportROI Populate a ROI resource (list-of-rectangles) +ImportClientPhoto ExportDrawablePlane Display a bitonal image in a WINDOW +ImportClientPhoto ExportDrawable Display a COLORMAP index image in a WINDOW +ImportPhotomap ExportDrawablePlane Copy an existing bitonal image to a PIXMAP +Table 5-1 Examples of two element Photoflo usage +Name space +For requests that only apply to stored Photoflos (Create, Modify, Redefine, Execute, and Destroy), +the Photoflo is identified solely by its resource-id. For all other requests, events, and errors that ref- +erence a Photoflo, the Photoflo is identified using type Executable, which is a tupple identifying the +name-space and flo-id of the Photoflo. +Name-space for stored Photoflos is always ServerIDSpace (the value zero), and flo-id is the +Photoflo's resource-id. +Name-space for immediate Photoflos is a Photospace resource-id, and flo-id is a 32-bit value that +uniquely identifies the instance of this Photoflo. +CreatePhotospace +XieReqCreatePhotospace +name-space: XieTypPhotospace +Errors: Alloc, IDChoice +Events: none +CreatePhotospace defines a name-space in which immediate Photoflos may be executed. Any +client that needs to instantiate immediate Photoflos must create at least one Photospace. +Name-space is the resource-id for a new Photospace that can be used to accommodate immediate +Photoflos instantiated by this client. +Error Cause +Alloc Insufficient resources +IDChoice Invalid name-space +DestroyPhotospace +XieReqDestroyPhotospace +name-space: XieTypPhotospace +Errors: Photospace +Events: none +DestroyPhotospace will destroy a Photospace. Prior to destroying the Photospace, all Photoflos that +are currently Active in the Photospace will be aborted, exported data pending client retrieval will be +freed, and the Photoflos will be destroyed. +Name-space is the Photospace to be destroyed. +Error Cause +Photospace Invalid name-space + +Immediate Photoflos +ExecuteImmediate +XieReqExecuteImmediate +instance: XieTypExecutable +notify: BOOL +element-list: LISTofXieTypPhotoElement +Errors: FloAlloc, FloID, FloElement, Flo . . . +Events: PhotofloDone +ExecuteImmediate defines and begins execution of an immediate Photoflo. Execution is asyn- +chronous. The Photoflo is destroyed after execution completes and all data exported for the client +have been retrieved. It is legal to have multiple unique instances of immediate Photoflos (and +stored Photoflos) Active concurrently. +Instance specifies the Photospace/flo-id tupple by which this Photoflo will be identified in other re- +quests, events, or errors. Notify specifies whether a PhotofloDone event should be sent upon comple- +tion. Element-list defines the import, process, and export elements to be executed. +If any clients have blocked themselves during the execution of the Photoflo (see Await), they will be- +come unblocked when photoflo's state changes from Active to Nonexistent. If notify is true, a Photo- +floDone event is also generated by this transition. Finally, this instance is destroyed. +Error Cause +FloAlloc Insufficient resources +FloID Invalid Executable instance +FloElement Invalid element-type(s) in element-list +Flo . . . See element descriptions for errors detected by elements in element-list + +See ExecutePhotoflo for a general outline of the execution phases of a Photoflo. + +Stored Photoflos +The following requests are used to: create, modify, redefine, execute, and destroy stored Photoflos. +In these requests the Photoflo instance is identified only by its resource-id. However, errors and +events generated due to these requests identify the instance using type Executable (the name-space is +ServerIDSpace and the flo-id is the Photoflo's resource-id). +CreatePhotoflo +XieReqCreatePhotoflo +photoflo: XieTypPhotoflo +element-list: LISTofXieTypPhotoElement +Errors: Alloc, IDChoice, FloAlloc, FloElement, Flo . . . +Events: none +CreatePhotoflo creates a stored Photoflo resource, defines its complete contents, and sets it in the +Inactive state. +Photoflo is a new resource-id by which this Photoflo will be identified in other requests, events, or er- +rors. Element-list defines the import, process, and export elements to be stored for execution. +Although resources and parameters are specified at creation, no action is taken to validate them at +that time. CreatePhotoflo will only store the Photoflo's definition and parameter validation is de- +layed until an execute request is received. +Error Cause +Alloc Insufficient resources for photoflo +IDChoice Invalid photoflo +FloAlloc Insufficient resources for element-list +FloElement Invalid element-type(s) in element-list +Flo . . . See element descriptions for errors detected by elements in element-list +DestroyPhotoflo +XieReqDestroyPhotoflo +photoflo: XieTypPhotoflo +Errors: Photoflo +Events: none +DestroyPhotoflo will destroy a stored Photoflo. If photoflo was Active, it is aborted, and all ex- +ported data that are pending client retrieval are freed prior to destroying photoflo. +Photoflo is the Photoflo to be destroyed. +Error Cause +Photoflo Invalid photoflo +See also Abort, which terminates a Photoflos execution without destroying it. +ExecutePhotoflo +XieReqExecutePhotoflo +photoflo: XieTypPhotoflo +notify: BOOL +Errors: Photoflo, FloAccess, FloAlloc +Events: PhotofloDone +ExecutePhotoflo changes a stored Photoflo to the Active state. Execution is asynchronous. The +Photoflo returns to the Inactive state when execution completes and all data exported for the client +have been retrieved. It is legal to have multiple stored Photoflos (and immediate Photoflos) +Active concurrently. +Photoflo is the Photoflo to be executed. Notify specifies whether a PhotofloDone event should be +sent upon completion. +Conceptually, Photoflo execution is broken into at least three phases : +1. Initialization: +a. The Photoflo state is set Active. +b. Bind external inputs (XIE reference counts are incremented). +c. Imported attributes are propagated downstream. +d. Attributes and element parameter values are validated. +e. Lookup external destinations. +f. Create receptors for data to be exported to XIE resources.2 +2. Execution: +a. Data from server resources, if any, is pulled into the Photoflo. +b. Data from the client, if any, is pushed into the Photoflo (PutClientData). +c. Processed data is exported to server resources as required.2 +d. Processed data is made available for client retrieval (GetClientData). +3. Completion: +a. Unbind external inputs. +b. Join exported data with associated XIE resources2 and unbind remaining resources. +c. Report any error that occurred. +d. If notify is true, send a PhotofloDone event. +e. If Await has been requested, unblock client execution. +f. The Photoflo state is set Inactive. +If an error occurs during any phase, the client is notified and the Photoflo is terminated. Other +events can be sent by individual elements as specified in their descriptions. +Error Cause +Photoflo Invalid photoflo +FloAccess Attempt to execute photoflo when it is already Active +FloAlloc Insufficient resources +Flo . . . See element descriptions for errors detected by photoflo elements +ModifyPhotoflo +XieReqModifyPhotoflo +photoflo: XieTypPhotoflo +start: XieTypPhototag +element-list: LISTofXieTypPhotoElement +Errors: Photoflo, FloAlloc, FloElement, FloSource, Flo . . . +Events: none +ModifyPhotoflo allows element parameters of a stored Photoflo to be modified. +Photoflo is the Photoflo to be modified. Start specifies the Phototag where element replacement is to +begin. Element-list is a sequential list of elements that will replace existing elements. +ModifyPhotoflo allows parameter modification only. No topological changes are allowed. Elements +cannot be deleted, inserted, or appended. +Error Cause +Photoflo Invalid photoflo +FloAccess Attempt to change photoflo while it is Active +FloAlloc Insufficient resources +FloElement Attempt to change element-type(s) in element-list +Attempt to append additional element(s) to photoflo +FloSource Invalid start +Attempt to change Phototag input connections in element-list +Flo . . . See element descriptions for errors detected by elements in element-list +Multiple ModifyPhotoflo requests can be sent in order to edit individual elements, but, for greater efficiency and particularly when +repetitive modify/execute requests are expected, elements can be grouped such that a single ModifyPhotoflo can perform multiple +element modifications. +RedefinePhotoflo +XieReqRedefinePhotoflo +photoflo: XieTypPhotoflo +element-list: LISTofXieTypPhotoElement +Errors: FloAccess, Photoflo. FloAlloc, FloElement, Flo . . . +Events: none +RedefinePhotoflo allows all elements of a stored Photoflo to be removed and replaced with a new +list. There are no restrictions on changing element types, Phototag sources, or the list's size. +Photoflo is the Photoflo to be redefined. Element-list is a sequential list of elements that will replace +all existing elements. +Error Cause +Photoflo Invalid photoflo +FloAccess Attempt to change photoflo while it is Active +FloAlloc Insufficient resources +FloElement Invalid element-type(s) in element-list +Flo . . . See element descriptions for errors detected by elements in element-list +RedefinePhotoflo may be considered a hint that the new list of elements is in some way similar to those being replaced. Rede- +finePhotoflo can also be used as a means to conserve resource-ids. +Sending Data to the Server +PutClientData +XieReqPutClientData +instance: XieTypExecutable +element: XieTypPhototag +final: BOOL +band-number: CARD8 +data: XieTypDataStream +Errors: FloAlloc, FloAccess, FloID, FloElement, FloValue +Events: none +PutClientData sends a stream of data to an Active Photoflo. Because the complete data object may +be larger than can fit in a single protocol request, XIE allows the stream to be segmented; the last +segment is signaled with a final flag. +Instance and element identify the Photoflo and specific ImportClient element to receive the data. +Final specifies that this is the last (or only) segment of data to be sent. +If element is a band oriented element, band-number specifies which client band of data is being sent +(interleave and band-order specified for the ImportClient element or technique determine how +client bands are mapped to server bands). +Data is a counted list of bytes that comprises the data stream. The organization and contents of the +stream must match the parameters given to the ImportClient element or the results are unde- +fined. +An arbitrary amount of image data can be sent per request, whereas for nonimage data one or more +complete aggregates must be sent per request (for example, one or more LUT array entries). +If too many data are sent (for example, too many rectangles, or too many scanlines), the unwanted +data are discarded. It is an error, however, to send too few data prior to signaling final. +Error Cause +FloAlloc Insufficient resources +FloAccess Executable instance not Active +FloID Invalid Executable instance +FloElement Invalid Phototag or element-type specified by element +FloValue Invalid band-number +For nonimage data, data contains a partial aggregate +All types of client data (list-of-rectangles, lookup tables, and images) are transported to the server using PutClientData. Tiled im- +ages can be transported using multiple ImportClientPhoto elements, which in turn feed a PasteUp element. + +Retrieving Data from the Server +GetClientData +XieReqGetClientData +instance: XieTypExecutable +element: XieTypPhototag +max-bytes: CARD32 +terminate: BOOL +band-number: CARD8 +* +new-state: XieTypExportState +data: XieTypDataStream +Errors: FloAlloc, FloAccess, FloID, FloElement, FloValue +Events: none +GetClientData retrieves data from an ExportClient element within an Active Photoflo. Data are +returned in a contiguous read-once byte stream, which can be requested in segments that are limited +in size by the amount the client desires or the amount available. The format of the data depends on +the parameters given to the ExportClient element from which the data are requested. +Instance and element identify the Photoflo and specific ExportClient element from which to re- +trieve data. Max-bytes specifies the maximum number of data bytes that can be sent to the client. +Terminate is a Boolean that can be used to indicate that no more data are wanted after this request has +been satisfied. Band-number specifies which client band is to be retrieved (interleave and band- +order parameters specified for the ExportClient element technique determine how server bands +are mapped to client bands). +New-state indicates the data availability status of the ExportClient element after satisfying the +current request. Data is the counted list of bytes that is returned. +If terminate is true, new-state will be ExportDone (the ExportClient element will discard any +remaining data and stop producing additional data). +If new-state is ExportEmpty and notify (for the ExportClient element) was specified as +NewData, another ExportAvailable event will be sent when additional data become availabile. +If the request is sent to an ExportClient element that either does not have any data, was termi- +nated by a previous GetClientData request, or has already returned all its data (ExportDone sent), +the request will return a zero length data stream. +Image data are always retrieved from the server as a byte stream, whereas nonimage data are always +returned by the server as one or more complete aggregates (that is, max-bytes is effectively rounded +down by the server to the match the nearest aggregate size). + +Error Cause +FloAlloc Insufficient resources +FloAccess Executable instance not Active +FloID Invalid Executable instance +FloElement Invalid Phototag or element-type specified by element +FloValue Invalid band-number +Servers are required to buffer a nonzero amount of data per ExportClient element. Beyond that point execution may be sus- +pended until the client retrieves sufficient data. +Terminate may be used to prematurely terminate output from an ExportClient element. If terminate is not used, all data pro- +duced by the ExportClient element must be retrieved before the Photoflo can leave the Active state. + +Status +QueryPhotoflo +XieReqQueryPhotoflo +instance: XieTypExecutable +* +state: XieTypPhotofloState +data-expected: LISTofXieTypPhototag +data-available: LISTofXieTypPhototag +Errors: FloAlloc +Events: none +QueryPhotoflo will return the current status of a Photoflo. +Instance identifies the Photoflo that is being queried. State indicates the state of the Photoflo. Data- +expected is a list of ImportClient elements that are expecting data from the protocol stream. +Data-available is a list of ExportClient elements from which data for the protocol stream are +available. Either or both of these lists may be of length zero. +Specifying an unknown or invalid instance will result in a reply state of nonexistent and zero length +data-expected and data-available lists. +Error Cause +FloAlloc Insufficient resources + +Synchronization +Await +XieReqAwait +instance: XieTypExecutable +Errors: FloAlloc +Events: none +Await blocks all further requests for this client connection from being honored by the server while the +Photoflo is Active. When the Photoflo transitions from the Active state, blocked requests are allowed +to be processed in the order received. +Instance identifies the Active Photoflo that is to block requests from the client issuing the Await. If +instance is invalid or the Photoflo is not Active no action is taken; it is not an error, and the client is +not blocked. +Error Cause +FloAlloc Insufficient resources +If a Photoflo has no ExportClient elements, the client can call Await. If a Photoflo has exactly one ExportClient ele- +ment, the client can just read bytes or be event-driven. If a Photoflo has multiple ExportClient elements, the client should be +event-driven. +Warning: Calling Await before sending all import data (including a final flag) or before retrieving all export data will block the cli- +ent from sending or retrieving the remaining data. This will also prevent completion of the Photoflo and prevent any and +all protocol requests from this client from being honored. This deadlock can only be broken by another client completing +or aborting the Photoflo (to release the Await) or by breaking the client connection. + +Termination +Abort +XieReqAbort +instance: XieTypExecutable +Errors: none +Events: none +Abort will prematurely terminate execution of a Photoflo. +Instance identifies the Photoflo that is to be aborted. Any output from the Photoflo that is pending +client retrieval is freed. If instance is a stored Photoflo it will return to the Inactive state. Imme- +diate Photoflos are destroyed. +If instance is invalid or the Photoflo is not Active no action is taken; it is not an error, and nothing is +destroyed. + + Optimization, an additional phase, would be roughly associated with the initialization phase. + For LUT, Photomap, and ROI resources refer to page 4-1 Binding Resources to Photoflos. + Completion is contingent upon all such data being retrieved by the client. + + +Pipelined Processing 5-1 + + +6 +Import Elements +Overview +Element categories +Import elements are used to bring external image data into a Photoflo. Import elements have no Pho- +totag sources and have one output connection. There are two types of import elements: +* ImportResource Elements obtain data from a server resource (DRAWABLE, LUT, Photomap, or ROI). +* ImportClient Elements require data from the client. This data is transported to the server via the PutClient- +Data protocol request. +Multi-source images +Multiple source images (for example, tiled images, multi-client transport, and so on) require a sepa- +rate import element to describe each segment of the image. The composite image can then be assem- +bled using process elements (for example, BandCombine, Blend, and PasteUp). +Events generated +Certain import elements can generate events to notify the client about abnormal behavior. Two such +events are defined: +* DecodeNotify Notifies the client when anomalies are encountered while decoding a compressed image. It can +also be returned if less data are sent than are required to complete an uncompressed image. +* ImportObscured Notifies the client that one or more regions to be imported from a WINDOW are obscured and un- +available from BACKINGSTORE. +Import from Client +ImportClient elements require data from the client. Element parameters fully specify all the at- +tributes of the client data and describe the format or organization the data will have as it is trans- +ported through the protocol stream. Data is sent to the ImportClient element via the PutClient- +Data protocol request after the Photoflo becomes Active. + +ImportClientLUT +XieFloImportClientLUT +class: XieTypDataClass +band-order: XieTypOrientation +length: XieTypTripletofCARD32 +levels: XieTypLevels +Errors: FloAlloc, FloMatch, FloValue +Events: none +ImportClientLUT accepts lookup table data from the protocol stream. The transport of data through +the protocol stream is accomplished using PutClientData. These data are accepted by the Point, Ex- +portLUT, and ExportClientLUT elements. +Class indicates the number of lookup arrays to expect. Length specifies the number of entries per ar- +ray. Levels is the number of quantization levels represented per array. Band-order declares the order +of TripleBand arrays, or the order in which pixels from a TripleBand image should be combined to +form indices for a SingleBand array . +The length of each array should match the number of source image levels that will be remapped +through the array. When a TripleBand image is to be remapped through a SingleBand array, the +length of the array should match the product of the source image levels of all three bands1. Table 6-1 +summarizes the class of output data to expect from Point, based on the class of LUT and the class of +image provided to Point. +Table 6-1 Relationship between LUT class and image class +LUT class +Source image: SingleBand +Source image: TripleBand +SingleBand +( 1 array ) +Output image: SingleBand +the single image band is re-mapped +through the single array +Usage examples: +achromatic --> achromatic +achromatic --> index +Output image: SingleBand +pixels from each image band are combined1 and then re- +mapped through the single array +Usage examples: +trichromatic --> index +trichromatic --> achromatic +TripleBand +( 3 arrays ) +Output image: TripleBand +the single image band is re-mapped +through each array separately +Usage examples: +achromatic --> false-color +index----------> trichromatic +Output image: TripleBand +each image band is re-mapped through the corresponding +array +Usage examples: +trichromatic --> trichromatic +The size of each array entry is either 1, 2, or 4 bytes; the smallest size into which the output quanti- +zation levels can be stored. When array entries require multiple bytes, the byte order per entry is de- +termined in the same manner as other numeric data: it is the byte orientation established at core X +connection setup time. +Error Cause +FloAlloc Insufficient resources +FloMatch levels is incompatible with the server's depth handling capabilities +FloValue Invalid class or band-order +When the client targets data at ImportClientLUT, one or more complete array entries must be sent per protocol request (see PutCli- +entData). +ImportClientPhoto +XieFloImportClientPhoto +notify: BOOL +class: XieTypDataClass +width: XieTypTripletofCARD32 +height: XieTypTripletofCARD32 +levels: XieTypLevels +decode: XieTypDecodeTechnique +decode-params: +Errors: FloAlloc, FloMatch, FloValue, FloTechnique +Events: DecodeNotify +Attribute Value +class class of imported image +type Constrained +width width of imported image (in pixels) +height height of imported image (in pixels) +levels levels of imported image +ImportClientPhoto accepts image data from the protocol stream. This data may be processed for +display or used as ProcessDomain data. The attributes and organization of the expected data stream +are fully specified by the parameters. The actual transport of image data through the protocol stream +is requested using the PutClientData protocol request. +Notify enables DecodeNotify events to be sent if anomalies are encountered while interpreting the +imported image data (see DecodeNotify and DecodeTechnique descriptions). Class specifies the +DataClass of the data being imported. Width and height are the per-band image dimensions in pix- +els. Levels is the number of quantization levels per band. Decode is the DecodeTechnique that will +be required to decompress the image. Decode-params is the list of additional parameters required by +decode. +Only Constrained data can be sent through the protocol stream; therefore, levels must be valid. +Error Cause +FloAlloc Insufficient resources +FloMatch levels is incompatible with the server's depth handling capabilities +FloValue Invalid width, height, levels (zero) +Invalid class +FloTechnique Invalid decode technique or decode-params +If the imported client data is compressed, ImportClientPhoto is generally responsible for decoding the data prior to forwarding the +data to downstream elements. An exception to this would be when an export element is a direct recipient of the data and the element +desires data that are encoded using the same technique as decode. +If individual bands of TripleBand data have different widths or heights (for example, down-sampled YCbCr data), it is generally the +client's responsibility to make inter-band dimensions match to render the image (for example, use Geometry with appropriate band- +mask and sample technique). The JPEGBaseline technique that is described in Appendix A, includes a Boolean flag that allows an +image that is interleaved BandByPixel to be up-sampled as part of the decode function. +All data and a final indication must be sent for each band before the Photoflo can leave the Active state. The input data are sent by +the client using the PutClientData protocol request. If a subset of client bands are desired, the bands should be imported as individ- +ual SingleBand images. + +ImportClientROI +XieFloImportClientROI +rectangles: CARD32 +Errors: FloAlloc +Events: none +ImportClientROI accepts a list-of-rectangles from the protocol stream. These data can be used as +input to a ProcessDomain or an ExportROI or ExportClientROI element. The actual transport of +data through the protocol stream is accomplished using the PutClientData protocol request (the +band-number parameter of PutClientData is ignored). +Rectangles specifies the number of rectangles expected. +Each rectangle is described using numeric values (see Rectangle); as such, the byte order of such data +is determined at core protocol connection setup time. +Error Cause +FloAlloc Insufficient resources +When the client targets data at ImportClientROI, one or more complete Rectangles must be sent per protocol request (see PutCli- +entData). + +Import from Resource +ImportResource elements obtain data from server resources: core DRAWABLEs, and XIE LUT, +Photomap, and ROI resources. +The attributes and data of XIE resources are bound to ImportResource elements when the Photo- +flo becomes Active. The same resource may also be the target of an ExportResource element in +the same Photoflo. However, the association between the resource's identifier (XID) and the new at- +tributes and data does not occur until the Photoflo successfully completes (that is, leaves the Active +state). (See Binding Resources to Photoflos in Chapter 4.) +ImportDrawable +XieFloImportDrawable +notify: BOOL +drawable: DRAWABLE +src-x: INT16 +src-y: INT16 +width: CARD16 +height: CARD16 +fill: CARD32 +Errors: FloAlloc, FloDrawable, FloValue +Events: ImportObscured +Attribute Value +class SingleBand +type Constrained +width width +height height +levels 2depth (that is, drawable depth) +ImportDrawable allows access to data existing in a DRAWABLE. This data may be processed for +display or, if drawable is a BITMAP, used as ProcessDomain data. +Notify enables ImportObscured events to be sent if data for one or more regions of a WINDOW are +obscured and unavailable from BACKINGSTORE (see ImportObscured). Drawable is the +DRAWABLE resource supplying the data. Src-x, src-y, width, and height specify the region of data to +be imported from drawable. Fill is the COLORMAP index to use for all regions that are obscured. +Error Cause +FloAlloc Insufficient resources +FloDrawable Invalid drawable +FloValue Invalid region (src-x, src-y, width, height) +The data are imported as ZPixmap format COLORMAP indices (that is, SingleBand index data). Index data are appropriate for +only a few process elements (for example, where a nearest-neighbor technique is used). ConvertFromIndex can be used to convert +index data prior to feeding it to other process elements. Compare can also be used to produce bitonal data from index data. + +ImportDrawablePlane +XieFloImportDrawablePlane +notify: BOOL +drawable: DRAWABLE +src-x: INT16 +src-y: INT16 +width: CARD16 +height: CARD16 +fill: CARD32 +bit-plane: CARD32 +Errors: FloAlloc, FloDrawable, FloValue +Events: ImportObscured +Attribute Value +class SingleBand +type Constrained +width width +height height +levels 2 +ImportDrawablePlane allows access to a single plane of data existing in a DRAWABLE. This data +may be processed for display or used as ProcessDomain data. +Notify enables ImportObscured events to be sent if data for one or more regions of a WINDOW are +obscured and unavailable from BACKINGSTORE (see ImportObscured). Drawable is the +DRAWABLE resource supplying the data. Src-x, src-y, width, and height specify the region of data to +be imported from drawable. Fill is the value to substitute for all regions that are obscured. Bit-plane +specifies the plane to be imported from drawable. +Bit-plane must have exactly one bit set to one (1), and the value of bit-plane must be less than 2n, +where n is the depth of drawable. This single bit selects the corresponding bit to be extracted from +pixels within drawable. +Error Cause +FloAlloc Insufficient resources +FloDrawable Invalid drawable +FloValue Invalid bit-plane or region (src-x, src-y, width, height) + +ImportLUT +XieFloImportLUT +lut: XieTypLUT +Errors: FloAlloc, FloAccess, FloLUT +Events: none +ImportLUT allows access to lookup table data existing in a LUT resource. These data are accepted +by the Point, ExportLUT, and ExportLUT elements. +Lut is the LUT resource supplying the lookup table. Attributes of the lookup table data are inherited +from lut. +Error Cause +FloAlloc Insufficient resources +FloAccess Attempting to import from lut before it has been populated +FloLUT Invalid lut + +ImportPhotomap +XieFloImportPhotomap +notify: BOOL +photomap: XieTypPhotomap +Errors: FloAlloc, FloAccess, FloPhotomap +Events: DecodeNotify +Attribute Value +class Same as photomap +type Same as photomap +width Same as photomap +height Same as photomap +levels Same as photomap +ImportPhotomap allows access to image data existing in a Photomap. This data may be processed +for display or used as ProcessDomain data. +Notify enables DecodeNotify events to be sent if anomalies are encountered while decoding com- +pressed data (see DecodeNotify and the DecodeTechnique descriptions). Photomap is the Photomap +resource supplying image data. +Attributes of the source data are inherited from photomap. +Error Cause +FloAlloc Insufficient resources +FloAccess Attempting to import from photomap before it has been populated +FloPhotomap Invalid photomap +If the data imported from photomap are compressed, ImportPhotomap is generally responsible for decoding the data prior to for- +warding the data to downstream elements. An exception to this would be when an export element is a direct recipient of the data and +the data are already encoded using the technique desired by the export element. +If individual bands of TripleBand, BandByPlane data have different widths or heights (for example, down-sampled YCbCr data), it +is generally the client's responsibility to make inter-band dimensions match to render the image (for example, use Geometry with ap- +propriate band-mask and sample technique). If ImportPhotomaps input data are TripleBand, BandByPixel, the dimensions of +the output bands will match even if the encoded input data are down-sampled. + + +ImportROI +XieFloImportROI +roi: XieTypROI +Errors: FloAlloc, FloAccess, FloROI +Events: none +ImportROI allows access to a list-of-rectangles existing in a ROI resource. This data may be refer- +enced by a ProcessDomain. +Roi is the ROI resource supplying the list-of-rectangles. +Error Cause +FloAlloc Insufficient resources +FloAccess Attempting to import from roi before it has been populated +FloROI Invalid roi + + + + + + + + + + + + + + + + + + + + + + +almost blank + + For SingleBand LUTs, Point combines TripleBand src pixel values to provide a compact array indexing scheme. The algorithm +is presented in Figure 7-4. + + +Import Elements 6-9 + + +7 +Process Elements +Overview +Process elements have one or more Phototag sources and have one output connection. Each process +element applies a specific operation to image data within an Active Photoflo. Some process elements +perform their operation on a single source of image data (for example, Geometry). Others, operate +on either a pair of image sources or an image and a constant (for example, Logical). BandCombine +associates bands from three SingleBand image sources to form a TripleBand image. PasteUp can +combine multiple images (tiles) to form a composite image. +The ConvertToIndex element can generate an event to notify the client about color allocation results. +A process element will not be involved in the execution of a Photoflo if there is no eventual consumer +of its output (that is, no terminating export element). +Limiting the Process +Processing may be limited to a subset of the bands present and a subset of pixels within the processed +bands. Data falling outside the selection criteria are passed through unaffected by the element's proc- +ess. +Process Selected Bands +Some process elements accept a band-mask to restrict processing to a subset of the source data bands. +Only bands selected by the band-mask are subject to processing. Other bands present in the image are +passed through to the output. For example: a band-mask of 0012 indicates that only the least signifi- +cant band would be processed (see Orientation for a definition of band ordering). +Process Intersecting Pixels +Dyadic process elements can accept a pair of data sources. These sources are spatially registered at +their origins (upper left corners). Their class and type must match, but their dimensions (width and +height) need not match. The dimensions of the output are determined by src-1. Processing is spa- +tially restricted to the intersection of the sources on a per-band basis. Data from src-1 that do not in- +tersect with src-2 are passed through to the output. +Process Selected Pixels +Some process elements accept a processing domain (ProcessDomain) to restrict processing to a subset +of the source data pixels. The processing domain represents either a list-of-rectangles or a bi-level +SingleBand control-plane. +A processing domain contains an x,y coordinate pair to spatially position the overall processing do- +main relative to the origin of the source(s). It also contains a Phototag that references the import or +process element that supplies the processing domain data. The element referenced by the Phototag +may provide the following: +* list-of-rectangles Imported using ImportROI or ImportClientROI. Processing is restricted to the intersection of +the data source(s) and any rectangle within the list. +* control-plane Imported using ImportDrawable, ImportDrawablePlane, ImportPhotomap, or ImportCli- +entPhoto; or the output of an upstream process element (for example, Compare). Processing is +restricted to the intersection of the data source(s) and nonzero locations within the control-plane. +Processing is not restricted if Phototag zero (0) is specified as the process domains data source. + +Figure 7-1 Combining two sources using a control plane Logical: Copy +Data Types +In XIE, an image consists of one or three arrays of pixels, each of which is measured in terms of its +width, height, and depth. Each array, which represents a chromatic band of image data, is dimen- +sioned independently. The depth component of each array is expressed in quantization levels or the +potential dynamic range of the pixels. All process elements within XIE are capable of operating on +image data that have a fixed number of quantization levels. These data are said to be Constrained +such that the minimum possible intensity value of a pixel is zero (0), and the maximum possible in- +tensity level is the number of quantization levels minus one. +With the exception of operations that specifically change the number of quantization levels (for ex- +ample, Dither) all other operations that are performed on Constrained data will maintain the levels +attribute from input to output. An operation that computes a negative pixel value will set the result- +ing pixel to zero. Likewise, an operation that computes a pixel value that would exceed the levels at- +tribute of the data will saturate the resulting pixel at its maximum allowable value (that is, levels-1). +This method of constraining image data is equivalent to the HardClip Constrain technique. +For some operations (for example, Arithmetic operations), it is desirable to allow pixel values to +stray beyond their Constrained values. Such data are said to be Unconstrained and may contain +negative values, fractional values, or other values that might be beyond the normal display capabili- +ties of a frame buffer. Performing a sequence of image operations on Unconstrained image data al- +lows the maximum degree of precision to be maintained throughout the process (although there may +be a cost in performance, depending on the server's capabilities). Several XIE process elements are +capable of operating on either Constrained or Unconstrained data. These elements always output the +same DataType as they are fed at their inputs. An exception to this rule is that certain colorspace +conversion techniques can accept either DataType but are only capable of outputting Unconstrained +data. + +XIE provides a complementary pair of elements for converting image data between these two proc- +essing styles. The Unconstrain element simply removes the normal levels restrictions from the data. +The Constrain element provides a means of bringing the data back into a Constrained range. A va- +riety of techniques are available for this purpose that allow the pixel values to be level-shifted, scaled, +clipped, rounded, and so on +Process Categories +* Area elements + Convolve Specifies an area of input pixels is involved in producing each output +pixel (controlled by a convolution kernel). +* Format conversion elements + ConvertFromIndex Specifies convert index data to achromatic or trichromatic data. + ConvertFromRGB Specifies convert RGB data to another trichromatic colorspace. + ConvertToIndex Specifies convert achromatic or trichromatic data to index data. + ConvertToRGB Specifies convert non-RGB trichromatic data to RGB data. +* Dyadic elements: process either two images or an image and a constant + Arithmetic Specifies an arithmetic operation is performed between two images or +an image and a constant. + Blend Specifies combine two images or an image and a constant. + Compare Specifies two images or an image and a constant are compared to +generate a Boolean bitmap result. + Logical Specifies perform logical bit-wise operations on an image, between +two images, or between an image and a constant. +* Geometric elements + Geometry Specifies general affine transform (provides crop, mirror, scale, shear, +rotate, translate, and combinations thereof). + PasteUp Specifies an N-input translate operation that reconstructs an image +from various source tiles. +* Point elements + Math Specifies apply a mathematical operation to each pixel. + Point Specifies remap each pixel value through a lookup table. +* Radiometric elements + BandCombine Specifies merge three SingleBand images. + BandExtract Specifies extract SingleBand data from a trichromatic source. + BandSelect Specifies select a single band of data from a trichromatic source. + Constrain Specifies constrain an image to a fixed number of quantization levels. + Dither Specifies reduce image quantization levels through an area technique. + MatchHistogram Specifies transform an image to have a specific histogram shape. + Unconstrain Specifies remove the normal levels restrictions from the image data. +Process Definitions +The complete list of process PhotoElements follows in alphabetical order. +Arithmetic +XieFloArithmetic +src-1: XieTypPhototag +src-2: XieTypPhototag +domain: XieTypProcessDomain +constant: XieTypConstant +operator: XieTypArithmeticOp +band-mask: CARD8 +Errors: FloAlloc, FloSource, FloDomain, FloMatch, FloOperator, FloValue +Events: none +Attribute Value +class Same as src-1 +type Same as src-1 +width Same as src-1 +height Same as src-1 +levels Same as src-1 +Arithmetic produces output data by performing an addition, subtraction, minimum, or maximum op- +eration between two data sources or between a single data source and a constant. Furthermore, multi- +plication, division, or gamma correction may by applied to a single data source. +When two sources are involved, src-1 and src-2 are the Phototags of the elements supplying source +data (constant is ignored). If the operation is to involve a constant, src-1 is one operand, src-2 must be +zero, and constant is used as the other operand. Domain may control the subset of source data that +will be operated upon. Operator is the arithmetic operation to be performed. Band-mask specifies +which bands are to be operated upon. +When two sources are involved, all attributes, other than width and height, must match; all output at- +tributes are inherited from src-1. +Pixel computations that would lead to errors will yield valid server-dependent values (for example, +dividing by a Constrained pixel value of zero might result in a value of levels-1) . Using band-mask +to select source data that have two (2) or less levels is not permitted. +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src-1 or src-2 +src-2 has been specified with a monadic operator (for example, Div or Gamma) +FloDomain Invalid domain +FloMatch class, type, or levels differs between src-1 and src-2 +Selected source data are bitonal (that is, 2 or less levels) +FloOperator Invalid operator + +BandCombine +XieFloBandCombine +src-1: XieTypPhototag +src-2: XieTypPhototag +src-3: XieTypPhototag +Errors: FloAlloc, FloSource, FloMatch +Events: none +Attribute Value +class TripleBand +type Same as src-1 +width Same as srcs +height Same as srcs +levels Same as srcs +BandCombine merges three SingleBand data sources to produce a TripleBand result. +Src-1, src-2, and src-3 are the Phototags of the elements supplying source data. All three sources +must be of the same type, and each source must be SingleBand. Other attributes that are taken from +the individual sources may differ. The output will be TripleBand. +No subsetting by ProcessDomain is provided. +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src-1, src-2, or src-3 +FloMatch A source has more than one band +type differs between sources + +BandExtract +XieFloBandExtract +src: XieTypPhototag +coefficients: XieTypConstant +bias: XieTypFloat +levels: CARD32 +Errors: FloAlloc, FloSource, FloMatch +Events: none +Attribute Value +class SingleBand +type Same as src +width Same as src +height Same as src +levels levels or unknown (see text) +BandExtract produces SingleBand output data from a TripleBand source by multiplying a pixel +value from each source band by its corresponding coefficient and then summing the results with the +bias value. +Src is the Phototag of the element supplying source data. Coefficients is a three (3) element array +that determines the proportion of each source band pixel that is used to form the output. The bias +value is added to each output pixel. Levels is used as the levels attribute of the output data if the src +data are Constrained; otherwise, it is ignored. +The source data must be TripleBand, and all bands must have equal dimensions. The output data will +be SingleBand with levels taken from the levels parameter if type is Constrained. All other attrib- +utes are inherited from src. +No subsetting by ProcessDomain is provided (the entire image is processed). +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloMatch src is not TripleBand +Unequal inter-band dimensions (width or height) +BandExtract can be used to extract a band of luminance data from an RGB image. It can also be used to compute COLORMAP in- +dices in cases where the contents of the COLORMAP is well ordered (for example, a Standard-COLORMAP or a TrueColor +visual). + +BandSelect +XieFloBandSelect +src: XieTypPhototag +band-number: CARD8 +Errors: FloAlloc, FloSource, FloMatch, FloValue +Events: none +Attribute Value +class SingleBand +type Same as src +width Same as band selected from src +height Same as band selected from src +levels Same as band selected from src +BandSelect produces SingleBand output data by selecting a single band from a TripleBand source. +Src is the Phototag of the element supplying source data. Band-number specifies which src band is to +be selected to provide the output data. +No subsetting by ProcessDomain is provided. +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloMatch src is not TripleBand +FloValue Invalid band-number + +Blend +XieFloBlend +src-1: XieTypPhototag +src-2: XieTypPhototag +alpha: XieTypPhototag +constant: XieTypConstant +alpha-const: XieTypFloat +domain: XieTypProcessDomain +band-mask: CARD8 +Errors: FloAlloc, FloSource, FloDomain, FloMatch, FloValue +Events: none +Attribute Value +class Same as src-1 +type Same as src-1 +width Same as src-1 +height Same as src-1 +levels Same as src-1 +Blend produces output data from two data sources or a single data source and a constant. Each out- +put pixel is a percentage combination of the source values, as controlled by the alpha input or the al- +pha constant. +When two sources are involved, src-1 and src-2 are the Phototags of the elements supplying source +data (constant is ignored). If the operation is to involve a constant, src-1 is one operand, src-2 must +be zero, and constant is used as the other operand. If alpha is nonzero, it controls the blend propor- +tion for each pixel that is processed; otherwise, alpha-const provides this control. Domain may con- +trol the subset of source data that will be operated upon. Band-mask specifies which bands are to be +operated upon. +When two sources are involved, all attributes, other that width and height, must match. If alpha is +nonzero, it must be a source of Constrained data. Using band-mask to select source data that have +two (2) or less levels is not permitted. +Within the intersection of the source(s) and domain, each output pixel is a blend of the corresponding +pixels from src-1 and src-2 (or src-1 pixels blended with constant). The degree of blend is deter- +mined by the corresponding value taken from alpha or the value of alpha-const. If alpha is nonzero, +the proportion of blend is further scaled by alpha-const: + output = src-1 * (1 - alpha / alpha-const) + src-2 * (alpha / alpha-const) + (where alpha-const is greater than 0.0). +If alpha is zero: + output = src-1 * (1 - alpha-const) + src-2 * alpha-const + (where alpha-const is in the range [0.0, 1.0]). +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src-1, src-2, or alpha +FloDomain Invalid domain +FloMatch Incompatible attributes between src-1 and src-2 +alpha is Unconstrained +Selected source data are bitonal (that is, 2 or less levels) +FloValue alpha is zero and alpha-const is outside the range [0.0, 1.0] +alpha is nonzero and alpha-const is zero or negative +Compare +XieFloCompare +src-1: XieTypPhototag +src-2: XieTypPhototag +domain: XieTypProcessDomain +constant: XieTypConstant +operator: XieTypCompareOp +combine: BOOL +band-mask: CARD8 +Errors: FloAlloc, FloSource, FloDomain, FloMatch, FloOperator +Events: none +Attribute Value +class See text +type Constrained +width Same as src-1 +height Same as src-1 +levels 2 per band (see text) +Compare takes two data sources or a single data source and a constant and generates a Boolean bit- +map output that reflects the results of a point-wise comparison. The output data has a value of one +(1) wherever the comparison is true, and a value of zero (0) everywhere else (that is, comparison false +or comparison not performed). Compare may be requested on a per-band basis, or for all bands +taken together. +When two sources are involved, src-1 and src-2 are the Phototags of the elements supplying source +data (constant is ignored). If the operation is to involve a constant, src-1 is one operand, src-2 must be +zero, and constant is used as the other operand. Domain may control the subset of source data that +will be compared. Operator is the logical predicate operator used in the comparison. Combine is a +Boolean that determines if the comparison should be done on a per-band basis or on an all bands ba- +sis. Band-mask specifies which bands are to be involved. +If combine is true or src-1 is SingleBand, the output data will form a single Boolean bitmap. If src-1 +is TripleBand and combine is false, the output data will yield three separate Boolean bitmaps (for this +case band-mask must specify all bands). +If src-1 is TripleBand and combine is true, only the EQ and NE operators are allowed; equality is +established for each band selected by band-mask, and then the result is logically ANDed to derive +equality (inequality is a logical NOT of this result). For this case, width and height must match for all +bands selected by band-mask. +combine +input class +band-mask +output class +True +SingleBand +TripleBand +n/a +selected bands +SingleBand +SingleBand +False +SingleBand +TripleBand +n/a +all bands +SingleBand +TripleBand +Table 7-1 Compare parameter and DataClass dependencies +When two sources are involved, all attributes, other than width and height, must match. The com- +parison is performed over the intersect of the source(s) as restricted by domain. All points not com- +pared are given the value zero (0). +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src-1 or src-2 +FloDomain Invalid domain +FloOperator Invalid operator +FloMatch Class differs between src-1 and src-2 +Invalid combination of operator and combine +TripleBand, and combine is false, and band-mask incomplete +Compare does not support inter-band distance metrics therefore, combined LT, LE, GT, and GE operators are not supported. Cli- +ents may implement these using other elements in concert with Compare. +Typical uses for Compare include: creating data to be used as a control-plane for a ProcessDomain and converting index data into +bitonal image data. + +Constrain +XieFloConstrain +src: XieTypPhototag +levels: XieTypLevels +constrain: XieTypConstrainTechnique +constrain-params: +Errors:: FloAlloc, FloSource, FloTechnique +Events: none +Attribute Value +class Same as src +type Constrained +width Same as src +height Same as src +levels levels +Constrain applies a quantization model to the image data to convert the data to a fixed number of +quantization levels. Application of the quantization model may involve steps such as range shifting, +scaling, clipping, and rounding. +Src is the Phototag of the element supplying source data. Levels is the number of quantization levels +desired in the output data. Constrain specifies the ConstrainTechnique to be used when constraining +the data. Constrain-params is the list of additional parameters required by constrain. +If the input image is already Constrained the data will be re-Constrained. +No subsetting by band mask or ProcessDomain is provided (the entire image is Constrained). +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloTechnique Invalid constrain technique or constrain-params + +ConvertFromIndex +XieFloConvertFromIndex +src: XieTypPhototag +colormap: COLORMAP +class: XieTypDataClass +precision: CARD8 +Errors: FloAlloc, FloSource, FloColormap, FloMatch, FloValue +Events: none +Attribute Value +class class +type Constrained +width Same as src +height Same as src +levels 2precision (per band) +ConvertFromIndex converts COLORMAP index data into achromatic or trichromatic data. +Src is the Phototag of the element supplying source data. Colormap is the COLORMAP from which to +obtain the value for each output pixel. Class specifies the DataClass of the desired output data. Pre- +cision specifies how many bits (most significant) are to be used from the red, green, and blue values +found in colormap. +If class is SingleBand and a trichromatic colormap is specified (StaticColor, PseudoColor, +TrueColor, or DirectColor), the gray shade for each pixel is taken from the red values in col- +ormap. If class is TripleBand and an achromatic colormap is specified (StaticGray or Gray- +Scale), the red band will be replicated to populate the green and blue output bands. +The depth of colormap must match the levels attribute of src (that is, 2depth must equal levels). +No subsetting by band mask or ProcessDomain is provided (the entire image is converted). +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloColormap Invalid colormap +FloMatch levels of src do not match depth of colormap +FloValue Invalid class or precision +To achieve predictable results, the client should not modify colormap cells referenced by the source data while the Photoflo is Active +(see Await for synchronization help). +A value of bitsPerRGBValue or less (defined in the VISUAL of colormap) is usually appropriate for precision. +Compare can be used to convert index data into bitonal data. Use ConvertFromIndex followed by BandExtract to convert col- +ored index data into full fidelity achromatic data. + +ConvertFromRGB +XieFloConvertFromRGB +src: XieTypPhototag +convert: XieTypConvertFromRGBTechnique +convert-params: +Errors:: FloAlloc, FloSource, FloMatch, FloTechnique +Events: none +Attribute Value +class TripleBand +type convert technique dependent +width Same as src +height Same as src +levels convert technique dependent +ConvertFromRGB converts RGB source data to an alternate colorspace. +Src is the Phototag of the element supplying source data (RGB assumed). Convert is the Convert- +FromRGBTechnique that will be used in the conversion to the destination colorspace. Convert- +params is the list of additional parameters required by convert. +In addition to colorspace conversion, some techniques allow for adjusting the white point of the out- +put data (see Appendix A, Convert From RGB Technique, for more information on conversion +techniques). +The source data must be TripleBand, and all bands must have equal dimensions. The type and levels +of the output data are determined by convert technique parameters. All other attributes are inherited +from src. +No subsetting by ProcessDomain is provided (the entire image is processed). +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloMatch src is not TripleBand +Unequal inter-band dimensions (width or height) +FloTechnique Invalid convert or convert-params + +ConvertToIndex +XieFloConvertToIndex +notify: BOOL +src: XieTypPhototag +colormap: COLORMAP +color-list: XieTypColorList +color-alloc: XieTypColorAllocTechnique +color-alloc-params: +Errors: FloAlloc, FloSource, FloColormap, FloColorList, FloMatch, FloValue +Events: none +Attribute Value +class SingleBand +type Constrained +width Same as src +height Same as src +levels 2depth (that is, colormap depth) +ConvertToIndex allocates and/or matches colors or gray shades, as required, from a COLORMAP. It +produces pixel indices as output data, and records indices that it allocates in a ColorList. The speci- +fied color-alloc technique may generate a ColorAlloc event to warn the client that results are of +lesser fidelity than desired. +Notify allows the client to be notified about inferior results from color allocation or matching. Src is +the Phototag of the element supplying Constrained source data. Colormap is the COLORMAP from +which colors or gray shades are allocated and/or matched. Color-list is the ColorList where allocated +COLORMAP indices are to be stored. Color-alloc specifies the desired ColorAllocTechnique. Color- +alloc-params is the list of additional parameters required by color-alloc. +Color-list is purged of any colors it already contains when Photoflo execution begins. Allocated +COLORMAP indices can be freed using PurgeColorList, DestroyColorList, or by making color-list +the target of an Active Photoflo. +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloColormap Invalid colormap +FloColorList Invalid color-list +FloAccess color-list is already being used by another Active Photoflo +FloMatch Unequal inter-band dimensions (width or height) or Unconstrained src data +FloTechnique Invalid color-alloc technique or color-alloc-params +ConvertToIndex is usually a preparatory step for an ExportDrawable element. Alternatively, continuous-tone data can be con- +verted to a fixed palette of COLORMAP index entries using Point. Or BandExtract can be used if the COLORMAP contains a ramp +of colors or gray shades (for example, a Standard-COLORMAP or a TrueColor visual). Bitonal image data can be pre- +sented directly to ExportDrawablePlane, allowing the GCONTEXT mechanism to translate ones and zeros in the image into fore- +ground and background colors in the DRAWABLE. +If colormap is static, image colors or gray shades must be matched to those available in colormap. Because no cells are actually +allocated, color-list can be specified as zero (0). Of the three standard techniques defined in this document only, ColorAlloc_Match +is appropriate for static COLORMAPs. If colormap is dynamic, image colors or gray shades may be matched or allocated from +colormap depending on the color-alloc technique; colormap and the list of cells actually allocated are stored in color-list. +Although the three standard techniques defined in this document allocate read-only cells, ConvertToIndex could be extended with +private techniques that allocate, match, or write into read-write cells. + +ConvertToRGB +XieFloConvertToRGB +src: XieTypPhototag +convert: XieTypConvertToRGBTechnique +convert-params: +Errors: FloAlloc, FloSource, FloTechnique +Events: none +Attribute Value +class TripleBand +type convert technique dependent +width Same as src +height Same as src +levels convert technique dependent +ConvertToRGB converts alternate colorspace source data into RGB data. +Src is the Phototag of the element supplying source data. Convert is the ConvertFromRGBTech- +nique that will be used in the conversion from the source colorspace. Convert-params is the list of +additional parameters required by convert. +In addition to colorspace conversion, some techniques allow for adjusting the white point of the +source data prior to conversion and compressing the gamut of the output data (see Appendix A, +Convert To RGB Technique, for more information on conversion techniques). +The source data must be TripleBand, and all bands must have equal dimensions. The type and levels +of the output data are determined by convert technique parameters. All other attributes are inherited +from src. +No subsetting by band mask or ProcessDomain is provided (the entire image is converted). +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloMatch src is not TripleBand +Unequal inter-band dimensions (width or height) +FloTechnique Invalid convert or convert-params +Arithmetic or Point can be used to gamma-correct the resulting data prior to displaying it. + +Convolve +XieFloConvolve +src: XieTypPhototag +domain: XieTypProcessDomain +kernel: LISTofXieTypFloat +kernel-size: CARD8 +band-mask: CARD8 +convolve: XieTypConvolveTechnique +convolve-params: +Errors: FloAlloc, FloSource, FloDomain, FloMatch, FloValue, FloTechnique +Events: none +Attribute Value +class Same as src +type Same as src +width Same as src +height Same as src +levels same as src +Convolve produces output data by convolving each input pixel value (and surrounding area) with the +specified convolution kernel. +Src is the Phototag of the element supplying source data. Domain may control the subset of the im- +age that will be operated upon. Kernel contains the coefficients used in the convolution process. +Kernel-size specifies the dimension of kernel. Band-mask specifies which bands are to be operated +upon. Convolve specifies the ConvolveTechnique for handling edge conditions (when kernel re- +quires data outside of src). Convolve-params is the list of additional parameters required by con- +volve. Kernel represents a square array of float data that has odd dimensions. Thus, a single dimen- +sion is used to specify, kernel-size. +Using band-mask to select source data that have two (2) or less levels is not permitted. +All output data attributes are inherited from the source data. +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloDomain Invalid domain +FloMatch Selected source data are bitonal (that is, 2 or less levels) +FloValue Invalid kernel-size (for example, not odd) +FloTechnique Invalid convolve edge handling technique or convolve-params +For TripleBand data, convolution using the same kernel is permuted over all three bands. + +Dither +XieFloDither +src: XieTypPhototag +levels: XieTypLevels +band-mask: CARD8 +dither: XieTypDitherTechnique +dither-params: +Errors: FloAlloc, FloSource, FloValue, FloMatch, FloTechnique +Events: none +Attribute Value +class Same as src +type Constrained +width Same as src +height same as src +levels levels +Dither is used to reduce the number of quantization levels in an image. It accomplishes this by af- +fecting adjacent pixels (area affect) to make up for the lack of depth resolution. +Src is the Phototag of the element supplying source data. Levels is the number of levels desired in +the output data. Band-mask specifies which bands are to be operated upon. Dither specifies the de- +sired DitherTechnique. Dither-params is the list of additional parameters required by dither. +The source data must be Constrained. Using band-mask to select source data that have two (2) or +less levels is not permitted. +No subsetting by band mask or ProcessDomain is provided (the entire image is processed). +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloMatch Unconstrained src data +Selected source data are bitonal (that is, 2 or less levels) +FloValue Invalid output levels: less than two, or greater than src levels +FloTechnique Invalid dither technique or dither-params + +Geometry +XieFloGeometry +src: XieTypPhototag +width: CARD32 +height: CARD32 +coefficients: XieTypFloat[6] +constant: XieTypConstant +band-mask: CARD8 +sample: XieTypGeometryTechnique +sample-params: +Errors: FloAlloc, FloSource, FloValue, FloTechnique +Events: none +Attribute Value +class Same as src +type Same as src +width width +height height +levels Same as src +Geometry is used to perform geometric transformations on image data. Linear geometric resampling +operations are implemented, such as, crop, mirror, scale, shear, rotate, translate, and combinations +thereof. +Src is the Phototag of the element supplying source data. Width and height specify the dimensions of +the output data. Coefficients is a list of values (a,b,c,d,tx,ty) that control the geometric transforma- +tion. Constant is a fill value used for output pixels that do not map back to a src pixel. Band-mask +specifies which bands are to be operated upon. Sample is the GeometryTechnique to be used for ret- +rospectively resampling src. Sample-params is the list of additional parameters required by sample. +Figure 7-2 shows a combined crop and scale for a src with dimensions w and h, and output width w +and height h. The mapping between the coordinate systems is specified from output back to src; that +is, for each output pixel (x,y), the coordinate location (x,y) at which to sample src is given by: + + +Geometry can be visualized as stepping through each possible output pixel location in turn and com- +puting the location from which to obtain each input pixel value. Often a given output pixel location +(x,y) will not correspond exactly to a single pixel in the input image. The sample technique is +used to determine how the input data will be interpolated to produce each output pixel value. + +Figure 7-2 A sample geometric transform: crop and scale +The region to be cropped in the input image is implicitly defined by the dimensions of the output im- +age and the mapping from output to input coordinates. Depending on the size of the input and output +images, the amount of scaling specified, and the amount of translation in the mapping, the shadow +of the output image may extend beyond the boundaries of the input image, as in Figure 7-3. Pixels in +the output image that map off the edge of the input image will be assigned the constant value. + +Figure 7-3 Background fill used for pixels beyond the edge +Transformation Coefficients +The coordinate mapping (a,b,c,d,tx,ty), together with the output width and height, fully specify the +geometric transformation. To aid in computing the desired transform, one might: +* Draw a picture of the input and output images. Label the corners of the output image A,B,C,D. They will have coordinates +x,y at (0,0), (width-1,0), (0,height-1), and (width-1,height-1), +* Next compute or deduce the coordinates (x,y) of A,B,C,D in the input coordinate space, +* For three corners (preferably those with a 0 for either x or y), write down the basic mapping equation with known (x,y) +and (x,y) specified. Each corner will give two equations, and simultaneously solving the six equations for the three corners +will allow (a,b,c,d,tx,ty) to be deduced. The remaining corner may be used to check that these parameters have been derived +correctly. +The following briefly (and approximately) summarizes the intuitive role of each parameter: +a,d Scaling parameters. Increasing a and d will make the output image appear smaller, whereas +decreasing them will make the output pixels appear larger. +b,c Rotation/skew parameters. If b and c are zero, the output image will be a rectangular scal- +ing of the input image. If a and d are both zero, b is one and c is negative one, the image +will appear rotated. The magnitude of b and c will affect scaling as well, if a and d are +zero. If more than two of (a,b,c,d) are nonzero, the effect is complicated. The image may +appear skewed and scaled. +tx,ty Translation parameters. Used to specify the offset between input and output coordinate sys- +tems. +width,height These specify the output image dimensions of the selected band(s). Note that increasing the +output image height and width over the input image size will not by itself cause magnifica- +tion ¾ if a and d are one (1) and b and c are zero (0), the output image will have the same +appearance as the input, except that the borders will shrink or expand (as determined by +width and height) and new areas of the image will be filled with constant. + +Trichromatic image bands can be operate individually, all together or in any combination using band- +mask. Because applying the same (a,b,c,d,tx,ty) mapping to inputs with diverse sizes will specify +different transformations, operating on all bands in unison (band-mask of 1112) is most appropriate if +the dimensions of all bands are equal. No subsetting by ProcessDomain is provided (selected bands +are processed in their entirety). +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloValue Invalid coefficients, width, or height +FloTechnique Invalid sample technique or sample-params +Logical +XieFloLogical +src-1: XieTypPhototag +src-2: XieTypPhototag +domain: XieTypProcessDomain +constant: XieTypConstant +operator: GCfunction* +band-mask: CARD8 +Errors: FloAlloc, FloSource, FloDomain, FloMatch, FloOperator, FloValue +Events: none +Attribute Value +class Same as src-1 +type Constrained +width Same as src-1 +height Same as src-1 +levels Same as src-1 +Logical performs per-pixel bit-wise operations on a single data source, or between two data sources, +or between a single data source and a constant. +When two sources are involved, src-1 and src-2 are the Phototags of the elements supplying source +data (constant is ignored). If the operation is to involve a constant, src-1 is one operand, src-2 must be +zero, and constant is used as the other operand. Domain may control the subset of source data that +will be operated upon. Operator is the logical operator to be used. Band-mask specifies which bands +are to be operated upon. +The value of operator matches the GC-function values defined by the core protocol specification +for CreateGC. The output of Logical is determined by the number of data sources and operator: +GC-function1 monadic operation dyadic operation +Clear 0 0 +And constant AND src-1 src-2 AND src-1 +AndReverse constant AND (NOT src-1) src-2 AND (NOT src-1) +Copy constant src-2 +AndInverted (NOT constant) AND src-1 (NOT src-2) AND src-1 +NoOp src-1 src-1 +Xor constant XOR src-1 src-2 XOR src-1 +Or constant OR src-1 src-2 OR src-1 +Nor (NOT constant) AND (NOT src-1) (NOT src-2) AND (NOT src-1) +Equiv (NOT constant) XOR src-1 (NOT src-2) XOR src-1 +Invert NOT src-1 NOT src-1 +OrReverse constant OR (NOT src-1) src-2 OR (NOT src-1) +CopyInverted NOT constant NOT src-2 +OrInverted (NOT constant) OR src-1 (NOT src-2) OR src-1 +Nand (NOT constant) OR (NOT src-1) (NOT src-2) OR (NOT src-1) +Set 1 1 +When two sources are involved, all attributes, other than width and height, must match. All source +data must be Constrained, and levels must be a power of two. Output attributes are inherited from +src-1. +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src-1 or src-2 +FloDomain Invalid domain +FloOperator Invalid operator +FloMatch src-1 or src-2 is not Constrained +levels or class differs between src-1 and src-2 +levels is not a power of 2 + +MatchHistogram +XieFloMatchHistogram +src: XieTypPhototag +domain: XieTypProcessDomain +shape: XieTypHistogramShape +tech-params: +Errors: FloSource, FloDomain, FloAlloc, FloMatch, FloTechnique +Events: none +Attribute Value +class SingleBand +type Constrained +width Same as src +height Same as src +levels Same as src +MatchHistogram produces output data that differs from the source data in terms of its pixel value +distribution or histogram. It allows the client to specify the desired state of the resulting data's histo- +gram (algorithmic description of resulting histogram shape). +Src is the Phototag of the element supplying source data. Domain may control the subset of the +source data to operated upon. Shape is a HistogramShape that specifies the form of the desired out- +put data histogram. Shape-params is the list of additional parameters required by shape. +The source data must be Constrained and SingleBand, and it must have three (3) or more levels. +When a ProcessDomain is used, only data that intersects with domain is included in the histogram, +and only that data will be affected in the result of the histogram matching operation (all other data +will pass-through unchanged). +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloDomain Invalid domain +FloMatch Invalid src data: Unconstrained or TripleBand or bitonal +FloTechnique Invalid histogram shape or shape-params +The Point element can also be used to reshape an image's histogram using an appropriate LUT. + +Math +XieFloMath +src: XieTypPhototag +domain: XieTypProcessDomain +operator: XieTypMathOp +band-mask: CARD8 +Errors: FloAlloc, FloSource, FloDomain, FloMatch, FloOperator, FloValue +Events: none +Attribute Value +class Same as src +type Same as src +width Same as src +height Same as src +levels Same as src +Math applies a single operand mathematical operation to the source data on a point-wise basis. +Src is the Phototag of the element supplying source data. Domain may control the subset of the im- +age that will be operated upon. Operator is the mathematical operation to be applied. Band-mask +specifies which bands are to be operated upon. +Pixel computations that would lead to errors will yield valid server-dependent values (for example, +the log of a Constrained pixel value of zero might result in a value of zero). Using band-mask to se- +lect source data that have two (2) or less levels is not permitted. +All output data attributes are inherited from the source data. +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloDomain Invalid domain +FloMatch Selected source data are bitonal (that is, 2 or less levels) +FloOperator Invalid operator + +PasteUp +XieFloPasteUp +tiles: LISTofXieTypTile +width: CARD32 +height: CARD32 +constant: XieTypConstant +Errors: FloAlloc, FloSource, FloMatch +Events: none +Attribute Value +class Same as tiles +type Same as tiles +width width +height height +levels Same as tiles +PasteUp is an N-input translate operation that outputs data constructed from various source data tiles +or a constant value. +Each of the tiles specifies a src (the Phototag of the element supplying source data) and the coordi- +nates, dst-x and dst-y, where the tile belongs in the output data. Width and height specify the full ex- +tent of the output data. Constant is the fill value to as the output data for any region that is not speci- +fied as a tile. +Each region of the output data is defined by a tile's destination coordinates, dst-x and dst-y, and its src +dimensions. For output regions where no tile provides input, the value of constant is used. If tiles +overlap, a stacking order rule defines which pixel value will be output; the last tile (involved in the +overlap) in the list of tiles will provide the output pixel. +At least one tile must be supplied. Except for width and height, all attributes of each source tile must +match. In addition, for TripleBand input, inter-band dimensions within each tile must match. +No subsetting by band mask or ProcessDomain is provided. +Error Cause +FloAlloc Insufficient resources +FloSource Invalid source tiles +No tiles were specified +FloMatch Incompatible attributes between tiles +Unequal inter-band dimensions within a tile (width or height) + +Point +XieFloPoint +src: XieTypPhototag +lut: XieTypPhototag +domain: XieTypProcessDomain +band-mask: CARD8 +Errors: FloAlloc, FloSource, FloDomain, FloMatch +Events: none +Attribute Value +class Same as lut +type Constrained +width Same as src +height Same as src +levels Same as lut +Point maps source pixel values to output pixel values using a lookup table (LUT) . +Src is the Phototag of the element supplying Constrained source data. Lut is the Phototag of the +element supplying the lookup table array(s). Domain may control the subset of source data that will +be operated upon. Band-mask specifies which bands are to be operated upon (all bands must be +specified if lut is SingleBand and src is TripleBand). +The output is Constrained with the width and height taken from src and class and levels taken from +lut. When src is SingleBand and lut is TripleBand, for the bands that are indicated by band-mask, +the output bands are remapped through their respective lut bands, whereas the other bands are just +replications of the single src band. If domain is used, the class and levels of lut must match those of +src. +Each lut array must contain sufficient entries so that all potential pixel values found in src can form a +valid index into the array. Generally each src pixel value is used directly as an index into a lut array. +When TripleBand src data are remapped through a SingleBand lut; however, pixel values from all +three src bands are combined to form an array index (for this case, width and height must match for +all bands). Figure 7-4 presents the algorithm for computing combined array indices. + +LUT band-order +LUT indexing algorithm for combining pixel values from TripleBand data +LSFirst +index = value[0] + value[1] x levels[0] + value[2] x levels[0] x levels[1] +MSFirst +index = value[2] + value[1] x levels[2] + value[0] x levels[2] x levels[1] +Figure 7-4 Point's algorithm for computing combined LUT indices +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src or lut +FloDomain Invalid domain (for example, attempting to use domain with ServiceClass DIS) +FloMatch Unconstrained src data + domain is being used, but lut class or levels do not match those of src +lut does not contain enough entries (that is, length less than src levels) +lut is SingleBand and src is TripleBand, but band-mask is incomplete or inter-band +dimensions dont match +Unconstrain +XieFloUnconstrain +src: XieTypPhototag +Errors: FloAlloc, FloSource, FloMatch +Events: none +Attribute Value +class Same as src +type Unconstrained +width Same as src +height Same as src +levels Unknown +Unconstrain takes Constrained source data and produces Unconstrained data. +Src is the Phototag of the element supplying Constrained source data. +No subsetting by band mask or ProcessDomain is provided (the entire image is Unconstrained). +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloMatch Unconstrained src + + GC-function is not a defined type in the core X protocol documentation. This table is taken from the list of alternative func- +tion values defined for the CreateCG protocol request. + Figure 6-1 illustrates the relationship between LUT class and image class and presents some usage examples. + + +Process Elements 7-3 + + +8 +Export Elements +Element categories +Export elements are used to send image data out of a Photoflo. Each export element has a single +Phototag source but does not provide an output connection. There are two types of export elements: + ExportResource elements export data to a server resource (DRAWABLE, LUT, Photomap, or ROI). + ExportClient elements produce data for client retrieval. They provide the input data for the GetCli- +entData protocol request. +Export to Client +ExportClient elements provide data for the client. Element parameters fully describe the format +or organization the data is to have as it is transported through the protocol stream. The data itself +must be retrieved using the GetClientData protocol request while the Photoflo is Active. +Servers are required to buffer a nonzero amount of data per ExportClient element. Beyond that +point execution may be suspended until the client retrieves sufficient data. +Events generated +ExportClient elements can generate ExportAvailable events to notify the client when the data is +available for retrieval. ExportAvailable events may be: + Disabled (that is, no event is sent) + Enabled only when data first becomes available from the element + Enabled each time the element's data buffer transitions from empty to nonempty + +ExportClientHistogram +XieFloExportClientHistogram +notify: XieTypExportNotify +src: XieTypPhototag +domain: XieTypProcessDomain +Errors: FloAlloc, FloSource, FloDomain, FloMatch, FloValue +Events: none +ExportClientHistogram generates a histogram of the pixel values found in the source data. It pre- +pares histogram data that can be retrieved by the client using the GetClientData protocol request. +An event can be requested that will notify the client when histogram data becomes available. +Notify allows the client to be notified when the histogram data becomes available. Src is the Photo- +tag of the element supplying SingleBand Constrained source data. Domain may control the subset of +the source data from which the distribution will be generated. +The data generated for the client is a list of HistogramData where each entry consists of an value +(that is, a pixel value) followed by the count of pixels found with that value. If the number of pixels +for a given value exceeds the capacity of count (type CARD32), that count will be returned at the +maximum value (that is, 232-1). Pixel values that are not found in the data are not included in the +histogram data (that is, no entries are returned where count is zero). +If notify is true, the total number of histogram entries are reported in the data field of the Expor- +tAvailable event. +The histogram is returned as numeric values (see HistogramData), as such, the byte order of the data +is determined at core protocol connection setup time. +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloDomain Invalid domain +FloMatch Unconstrained src data +TripleBand src data +FloValue Invalid notify +All data that are generated by ExportClientHistogram must be retrieved by the client using GetClientData before the Photoflo +can exit from the Active state. +Histograms of TripleBand images are not supported directly. However, BandSelect may be used to choose a single band of data, or +BandExtract may be used to combine data from multiple bands into a single band of data. A histogram of this single band of data +could then be generated using ExportClientHistogram. + +ExportClientLUT +XieFloExportClientLUT +notify: XieTypExportNotify +src: XieTypPhototag +band-order: XieTypOrientation +start: XieTypTripletofCARD32 +length: XieTypTripletofCARD32 +Errors: FloAlloc, FloSource, FloValue +Events: none +ExportClientLUT allows data imported from an ImportLUT or ImportClientLUT element to be +retrieved by the client. The actual transport of lookup table data through the protocol stream is re- +quested using the GetClientData protocol request. +Notify allows the client to be notified when data become available. Src is the Phototag of the element +supplying lookup table data. Band-order is the order in which TripleBand arrays are transmitted +through the protocol stream. Start is the index of the first array entry that should be returned. Length +is the number of array entries that should be returned. +If notify is requested, the ExportAvailable event's data field will report the total number of array en- +tries that can be retrieved from the band specified by the event. +The size of each array entry is either 1, 2, or 4 bytes; the smallest size into which the output quanti- +zation levels can be stored. When array entries require multiple bytes, the byte order per entry is de- +termined in the same manner as other numeric data; it is the byte orientation established at core X +connection setup time. +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloMatch start + length exceeds number of entries in an array +FloValue Invalid notify or band-order +When the client attempts to retrieve data from an ExportClientLUT element, the server responds with one or more complete array +entries per protocol reply (see GetClientData). All data must be retrieved by the client before the Photoflo can leave the Active +state. + +ExportClientPhoto +XieFloExportClientPhoto +notify: XieTypExportNotify +src: XieTypPhototag +encode: XieTypEncodeTechnique +encode-params: +Errors: FloAlloc, FloSource, FloMatch, FloValue, FloTechnique +Events: none +ExportClientPhoto makes image data available to the protocol stream. The attributes of the exported +data are determined by the attributes of the source data. The format of the data is specified by the en- +code technique and encode-params. The actual transport of image data through the protocol stream +is requested using the GetClientData protocol request. +Notify allows the client to be notified when image data become available. Src is the Phototag of the +element supplying Constrained data. Encode is the EncodeTechnique that will be used to compress +of format the exported data. Encode-params is the list of additional parameters required by encode. +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloMatch Unconstrained src data +FloValue Invalid notify +FloTechnique Invalid encode technique or encode-params +ServerChoice is not a valid encode technique for ExportClientPhoto. +Depending on encode, the export process may cause the data to be decoded, encoded, or, otherwise, reformatted by the server. If Ex- +portClientPhoto is fed directly from an ImportClientPhoto or ImportPhotomap element and the attributes of the raw data that +are given to the import element match the requirements of the encode technique, the raw data can bypass the normal decode function +of the import element and be forwarded directly to ExportClientPhoto (this is an implementation-specific optimization). +If TripleBand data are given to an encode technique that will interleave the output data BandByPixel, the dimensions of each src +band must match. +All data must be retrieved by the client, using the GetClientData protocol request, before the Photoflo can exit from the Active +state. + + +ExportClientROI +XieFloExportClientROI +notify: XieTypExportNotify +src: XieTypPhototag +Errors: FloAlloc, FloSource, FloValue +Events: none +ExportClientROI allows a list-of-rectangles, imported from an ImportROI or ImportClientROI +element, to be retrieved by the client. The actual transport of lookup table data through the protocol +stream is requested using the GetClientData protocol request. +Notify allows the client to be notified when data become available. Src is the Phototag of the element +supplying the list-of-rectangles. If notify is requested, the ExportAvailable event's data field will re- +port the total number of rectangles that can be retrieved. +Each rectangle is described using numeric values (see Rectangle), as such, the byte order of the data +is determined at core protocol connection setup time. +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloValue Invalid notify +When the client attempts to retrieve data from an ExportClientROI element, the server responds with one or more complete Rec- +tangles per protocol reply (see GetClientData). All data must be retrieved by the client before the Photoflo can leave the Active +state. + +Export to Resource +ExportResource elements emit data to server resources: either core X DRAWABLEs, or XIE LUT, +Photomap, or ROI resources. +For ExportResource elements that assign attributes to XIE resources, the association between the +resource identifier (XID) and the new attributes and data does not occur until the Photoflo success- +fully completes (that is, leaves the Active state). (See LUT, Photomap, and ROI resources in +Chapter 4.) +ExportDrawable +XieFloExportDrawable +src: XieTypPhototag +drawable: DRAWABLE +gc: GCONTEXT +dst-x: INT16 +dst-y: INT16 +Errors: FloAlloc, FloSource, FloDrawable, FloGC, FloMatch, FloValue +Events: none +ExportDrawable allows COLORMAP index data to be exported to a WINDOW or PIXMAP. +Src is the Phototag of the element supplying Constrained source data (index data assumed). +Drawable is the WINDOW or PIXMAP into which the data will be written. Gc is the GCONTEXT to be +used when transferring pixels to drawable. Dst-x and dst-y specify where the data should be placed in +drawable. +The following components are used from gc: function, plane-mask, subwindow-mode, +clip-x-origin, clip-y-origin, and clip-mask. +The levels of src must exactly match the depth of drawable and gc (that is, levels must be 2depth). +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloDrawable Invalid drawable +FloGC Invalid gc +FloMatch Invalid src data (TripleBand, levels does not match depth, or Unconstrained) +ExportDrawable assumes its input is COLORMAP index data. Sources of such data include: ImportClientPhoto, Import- +Drawable, ImportPhotomap, BandExtract, ConvertToIndex, Point, and elements that have processed index data. + +ExportDrawablePlane +XieFloExportDrawablePlane +src: XieTypPhototag +drawable: DRAWABLE +gc: GCONTEXT +dst-x: INT16 +dst-y: INT16 +Errors: FloAlloc, FloSource, FloDrawable, FloGC, FloMatch, FloValue +Events: none +ExportDrawablePlane allows SingleBand single bit (bitonal) data to be exported to a WINDOW, +PIXMAP, or BITMAP. +Src is the Phototag of the element supplying Constrained bitonal source data. Drawable is the WIN- +DOW, PIXMAP, or BITMAP into which the data will be written. Gc is the GCONTEXT to be used +when transferring pixels to drawable. Dst-x and dst-y specify where the data should be placed in +drawable. +The following components are used from gc: function, plane-mask, foreground, back- +ground, fill-style, subwindow-mode, clip-x-origin, clip-y-origin, and clip- +mask. For the fill-style component of gc, values of FillSolid and FillTiled are treated +as synonyms for FillOpaqueStippled. +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloDrawable Invalid drawable +FloGC Invalid gc +FloMatch Invalid src data (TripleBand, levels > 2, or not Constrained) +Bitonal data can be exported to a DRAWABLE of any depth if an appropriate GCONTEXT is supplied. The foreground and +background pixel values of gc can be used to map image pixels to COLORMAP colors during the export process. + +ExportLUT +XieFloExportLUT +src: XieTypLUT +merge: BOOL +start: XieTypTripletofCARD32 +Errors: FloAlloc, FloSource +Events: none +ExportLUT allows data imported from an ImportLUT or ImportClientLUT element to be saved in +an existing LUT resource. +Src is the Phototag of the element supplying lookup table data. Lut is the LUT to receive the data. +Merge specifies that new array entries from src should replace entries that already exist within lut. +Start is the index of the first array entry that should be written in lut. +If merge is false, start must be zero (0) for each band. In this case, lut will inherit the attributes of src +and be populated with its data. The previous attributes and data of lut are overwritten when the pho- +toflo completes. +If merge is true and lut has existing attributes, the data from src will replace the data from lut, begin- +ning at position start. The attributes of src must match those of lut, and the combination of start and +the length of src must specify a valid subrange existing within lut. If merge is true but lut has not yet +been populated, it is an error. +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloLUT Invalid lut +FloMatch merge true and attributes do not match between src and lut +merge true and start + src length is not a subrange of lut +FloValue merge false and start is nonzero + +ExportPhotomap +XieFloExportPhotomap +src: XieTypPhototag +photomap: XieTypPhotomap +encode: XieTypEncodeTechnique +encode-params: +Errors: FloAlloc, FloSource, FloPhotomap, FloTechnique +Events: none +ExportPhotomap allows data resulting from Photoflo operations to be saved in an existing Pho- +tomap. +Src is the Phototag of the element supplying source data. Photomap is the Photomap to receive the +data. Encode is the EncodeTechnique by which the image is to be compressed or formatted. Encode- +params is the list of additional parameters required by encode. +Photomap will inherit the attributes of src and be populated with its data. The previous attributes and +data of photomap are overwritten when the Photoflo completes. +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloPhotomap Invalid photomap +FloTechnique Invalid encode technique or encode-params +Depending on encode, the export process may cause the data to be decoded, encoded, or, otherwise, reformatted by the server. If Ex- +portPhotomap is fed directly from an ImportClientPhoto or ImportPhotomap element and the attributes of the raw data that are +given to the import element match the requirements of the encode technique, the raw data can bypass the normal decode function of +the import element and be forwarded directly to ExportPhotomap (this is an implementation-specific optimization). +If encode is ServerChoice, the server is free to choose an encode technique for the exported data. An optional hint can be provided +to help the server make its choice, but the server can ignore the hint. PreferTime hints that retrieval performance is the desired metric, +whereas PreferSpace indicates that frugal use of storage space is more important. If ExportPhotomap is receiving data from an +adjacent upstream import element, ServerChoice may choose to pass the import elements input data directly to the Photomap; oth- +erwise, a lossless technique will be chosen. The actual technique chosen by the server can be obtained using QueryPhotomap after +the Photoflo completes. +If TripleBand data are given to an encode technique that will interleave the output data BandByPixel, the dimensions of each src +band must match. + +ExportROI +XieFloExportROI +src: XieTypPhototag +roi: XieTypROI +Errors: FloAlloc, FloSource, FloROI +Events: none +ExportROI allows data imported from an ImportROI or ImportClientROI element to be saved in +an existing ROI. +Src is the Phototag of the element supplying a list-of-rectangles. Roi is the ROI to receive the data. +Roi will be populated with new data. The previous data of roi are overwritten after the Photoflo com- +pletes. +Error Cause +FloAlloc Insufficient resources +FloSource Invalid src +FloROI Invalid roi + +Export Elements 8-1 + + +9 +Events and Errors +Events +ColorAlloc +XieEvnColorAlloc +instance: XieTypExecutable +src: XieTypPhototag +type: ConvertToIndex +color-list: XieTypColorList +color-alloc: XieTypColorAllocTechnique +data: CARD32 +A ColorAlloc event notifies the client that a ConvertToIndex element has completed color allocation +but has produced a result of lesser fidelity than was requested using the technique that was specified +for the ConvertToIndex element. +Instance, src, and type identify the Photoflo and specific ConvertToIndex element from which the +ColorAlloc event originated. Color-list is the ColorList resource that received the allocated colors. +Color-alloc is the ColorAllocTechnique specified to the ConvertToIndex element. Data can be used +for other information that is specific to color-alloc. + +DecodeNotify +XieEvnDecodeNotify +instance: XieTypExecutable +src: XieTypPhototag +type: { ImportClientPhoto, ImportPhotomap } +decode: XieTypDecodeTechnique +data-width: CARD32 +data-height: CARD32 +band-number: CARD8 +aborted: BOOL +A DecodeNotify event notifies the client that anomalies were encountered while decoding a com- +pressed image (see the notify parameters of ImportClientPhoto and ImportPhotomap). Either an er- +ror has been encountered while decoding an image, or the image data received does not satisfy the +expected dimensions. +Instance, src, and type identify the Photoflo and element from which the DecodeNotify event origi- +nated. Decode is the DecodeTechnique being used. Data-width and data-height are the dimensions +discovered while decoding the data. Band-number associates the event with the band of the image +where the problem was encountered. Aborted is true if decoding was aborted or false if recovery was +possible. +Recovery from a decode error may result in some missing or garbled image data. This may also cause +the height of the decoded data to be less than was expected. If data-width or data-height do not +match the width and height specified to ImportClientPhoto, the image data is clipped or padded +(with zeros), as required, to enforce the ImportClientPhoto specified dimensions. +ExportAvailable +XieEvnExportAvailable +instance: XieTypExecutable +src: XieTypPhototag +type:{ ExportClientHistogram, ExportClientLUT, ExportClientPhoto ExportClientROI } +band-number: CARD8 +data; LISTofCARD32 +An ExportAvailable event notifies the client that an ExportClient element has data available +(see the notify parameter of the applicable ExportClient element). If notify was specified as +FirstData, this event will only be sent the first time data become available from the ExportClient +element. Otherwise (that is, NewData was specified) this event will be generated each time the +amount of data available changes from zero to nonzero. +Instance, src, and type identify the Photoflo and specific ExportClient element from which the +ExportAvailable event originated. Band-number associates the event with a specific band of the im- +age or LUT. Data is information specific to type (for example, the number of LUT entries or ROI +rectangles available). +Where there is a single ExportClient element, the client can just read bytes or be event-driven. For Photoflos containing multi- +ple ExportClient elements, the client should be event-driven. + +ImportObscured +XieEvnImportObscured +instance: XieTypExecutable +src: XieTypPhototag +type: { ImportDrawable, ImportDrawablePlane } +window: WINDOW +x: INT16 +y: INT16 +width: CARD16 +height: CARD16 +An ImportObscured event notifies the client an ImportDrawable or ImportDrawablePlane ele- +ment has encountered obscured regions in a WINDOW that cannot be retrieved from BACKINGSTORE +(see the notify parameter of the import element). A separate ImportObscured event is returned for +each affected region. +Instance and src identify the Photoflo and the specific import element from which the ImportOb- +scured event originated. Window identifies the WINDOW. The obscured region of the window is +specified by x, y, width, and height. +Note: image data within obscured regions will be populated with the fill value supplied to the import element. +PhotofloDone +XieEvnPhotofloDone +instance: XieTypExecutable +outcome: XieTypPhotofloOutcome +A PhotofloDone event notifies the client that a Photoflo has left the Active state. It is enabled by the +notify parameter of the ExecutePhotoflo and ExecuteImmediate requests. +Instance identifies the Photoflo from which the PhotofloDone event originated. Outcome indicates +the reason the Photoflo left the Active state. +If the Photoflo terminated due to an error condition, the details concerning the error have preceded this event in an error message. + +Resource Errors +The following error-codes are allocated from the extension error space to provide for the errors re- +turned by XIE: +Table 9-1 XIE Error codes +Error Cause +XieErrColorList The value for a color-list argument does not name a defined ColorList. +XieErrFlo . . . An error has been detected while defining, executing, or accessing a Photoflo. +See Table 9-2 for additional detail. +XieErrLUT The value for a lut argument does not name a defined LUT. +XieErrPhotoflo The value for a photoflo argument does not name a defined Photoflo. +XieErrPhotomap The value for a photomap argument does not name a defined Photomap. +XieErrPhotospace The value for a photospace argument does not name a defined Photospace. +XieErrROI The value for a roi argument does not name a defined ROI. +XIE also uses the core protocol errors: Access, Alloc, IDChoice, Length, Request, and Value. + +Photoflo errors +If an error is detected while defining, executing, or accessing a Photoflo, a Flo-error is returned. +This single error-code is allocated from the extension error space for all Photoflo related errors. The +following subcodes are defined to provide the details of the error: +Table 9-2 Photoflo error subcodes +Error Cause +XieErrFloAccess Attempt to execute, modify, or redefine an Active Photoflo +Attempt to Get/Put client data from/to an Inactive Photoflo +XieErrFloAlloc Insufficient resources (for example, memory) +XieErrFloColormap An unknown COLORMAP has been specified +XieErrFloColorList An unknown ColorList has been specified +XieErrFloDomain Invalid domain Phototag: + source data is not a list-of-rectangles or control-plane + specified nonzero on a DIS server +XieErrFloDrawable An unknown DRAWABLE has been specified +XieErrFloElement An unknown PhotoElement type has been specified +Invalid PhotoElement type for request (for example, GetClientData from +Math) +Attempt to change or add a PhotoElement type using ModifyPhotoflo +XieErrFloGC An unknown GCONTEXT has been specified +XieErrFloID Invalid Executable: + an unknown Photoflo has been specified + an unknown Photospace has been specified +XieErrFloLength A PhotoElement was received with the incorrect number of bytes +XieErrFloLUT An unknown LUT has been specified +XieErrFloMatch Some parameter or pair of parameters has the correct type and range, but it +fails to match in some other way required by the PhotoElement +XieErrFloOperator An unknown operator has been specified (for example, ArithmeticOp, +MathOp, and so on) +XieErrFloPhotomap An unknown Photomap has been specified +XieErrFloROI An unknown ROI has been specified +XieErrFloSource An invalid Phototag has been specified: + zero, but a Phototag is required + downstream from the particular PhotoElement + beyond the bounds of the Photoflo +XieErrFloTechnique An unknown technique has been specified +The wrong number of technique specific parameters have been supplied +Invalid technique specific parameters have been specified +XieErrFloValue Some numeric value falls outside of the range of values accepted by the Pho- +toElement +XieErrFloImplementation + + + + + + + + + + + + + + + + + + + + + + +almost blank + +Events and Errors 9-1 + + +A +Techniques +Standard and Private Techniques +For some XIE operations, several recognized algorithms or techniques offer varying tradeoffs between +quality of results and performance. Also, in some cases, different techniques are required due to an +image's class or content. In general, techniques that are specified for import and export elements +identify image compression schemes, and techniques that are specified for process elements identify +various image processing or enhancement algorithms. +Several standard techniques are defined in this appendix. Standard techniques are those that are well +known to the image processing community. They are further categorized in this document as re- +quired, optional, or excluded (see Table B-2). While required techniques must be implemented in all +servers, it is expected that most optional techniques will also be widely available. Some techniques +are excluded from certain subsets. +Vendors may choose to extend XIE with their own private techniques to provide for their particular +needs. Therefore, private techniques are likely to be available only on a particular vendor's platforms. +Technique numbers +Standard and private techniques can be differentiated by their technique numbers. The most signifi- +cant bit of the technique number is zero (0) for standard techniques and one (1) for private tech- +niques. Standard technique numbers are defined in this document (see Appendix C). Private tech- +nique numbers are assigned dynamically (the method for generating private technique numbers is +chosen by the server implementor). Because private technique numbers are not statically defined, the +number to name-string mapping must be obtained on a per-server basis via the QueryTechniques +protocol request. +Technique names +The name string for standard techniques contains only the name of the algorithm or compression +scheme (for example, ERROR-DIFFUSION or CCITT-G32D). Private technique name strings +also include the name of the vendor that owns the rights to the technique (for example, +_PHOTOCO_SQUASH-BITS). Because the organization name is encompassed by _ +(underscore) characters, the leading underscore provides another means by which standard techniques +can be can differentiated from private techniques. +Default Techniques +In some cases, it is appropriate to assign a default technique. A default technique is a synonym that +must be bound to a standard or private technique. Where there is no required standard technique, a +default technique must be defined that is bound to an optional or a private technique. No default is +defined in cases where it would be inappropriate (for example, decode techniques describing client +data). +Technique parameters +For each occurrence of a technique within an element definition, allowance is made to pass parame- +ters that are specific to the technique. Some techniques have defined parameters, and others have +none. For techniques that do have defined parameters, the QueryTechniques request can be invoked +to determine if the parameters must be supplied. If the parameters are optional and they are omitted +by the client, the server will supply implementation specific default values in their place. +If the default technique is requested, no additional parameters are accepted (implementation specific +default values will be provided for parameters defined for the technique to which Default is bound). +Technique information +The QueryTechniques request returns information about All techniques, all Default techniques, or a +group of techniques that are functionally similar (for example, Dither, Encode, Geometry, and so +on). The following information is returned about the selected techniques: +needs-parameters Indicates that the technique requires additional parameters; if false, the technique takes no +parameters, or its parameters are optional. If the parameters are optional, they can be totally +omitted, otherwise they must all be supplied. +group Identifies which group the technique belongs to. +number Specifies the numeric identifier assigned to the technique (MS bit is zero for standard tech- +niques, or one for private techniques). +speed Specifies the server's assessment of the speed of this technique relative to other techniques in +the same group (where 0 is the slowest, and 255 is the fastest). +name Identifies the technique name string in the form: + or +__ +The remainder of this appendix provides a complete description of each technique and its parameters. + +Color Allocation Techniques +Color allocation techniques allocate or match colors or gray shades from a COLORMAP. Cells allo- +cated from a dynamic COLORMAP are recorded in a ColorList. If the COLORMAP is static, im- +age pixels can only be matched to existing COLORMAP entries; no allocations are made and no Col- +orList needs to be specified. +AllocAll +Parameters +fill: CARD32 +AllocAll allocates a read-only COLORMAP cell for each new pixel found. If the COLORMAP runs out +of cells, the remaining new pixels are mapped to fill. A ColorAlloc event can be sent if it is neces- +sary to use fill. AllocAll is only appropriate for dynamic COLORMAPs and requires that the number +of discrete image pixels fit within the size of the COLORMAP to avoid running out of cells. +Match +Parameters +match-limit: XieTypFloat +gray-limit: XieTypFloat +Match allows a trade-off between image fidelity and COLORMAP usage via a pair of granularity pa- +rameters [ ]. The highest priority is given to allocating read-only cells in a sequence that provides an +even distribution of pixels throughout the colorspace. Secondary priority is given to the frequency of +usage of image pixels. Any image pixel that is a close enough match to an existing read-only cell will +share that cell (where close is determined by the granularity controls). For other image pixels, new +read-only allocations are made. When no more cells are available, each remaining image pixel is +matched to the closest read-only cell. Match is appropriate for both static and dynamic COL- +ORMAPs. For the sake of computational efficiency, the number of discrete image pixels should not +exceed the size of the COLORMAP. +Match-limit and gray-match control the allocation of colors and gray shades, respectively. The mini- +mum value (0.0) specifies exact matches (within the limits of the COLORMAP). The maximum value +(1.0) encompasses the entire colorspace within which no new cells are allocated. A ColorAlloc event +can be sent if the COLORMAP runs out of cells. +Requantize +Parameters +max-cells: CARD32 +Requantize first reduces the total number of discrete pixels values in the image to be no more than a +specified number and, then, allocates the resulting pixels values as read-only cells from the COLOR- +MAP. One method of accomplishing this reduction process can be found in [ ]. +Max-cells specifies the maximum number of COLORMAP allocations to allow. If max-cells is zero or +greater than the number of unallocated COLORMAP cells, the reduction algorithm will restrict its out- +put to the number of free cells. A ColorAlloc event can be sent if the number of pixels had to be re- +stricted to a lesser number than max-cells due to a lack of free COLORMAP cells. Requantize is only +appropriate for dynamic COLORMAPs. + + Constrain Techniques +ClipScale +Parameters +input-low: XieTypConstant +input-high: XieTypConstant +output-low: XieTypLevels +output-high: XieTypLevels +For each band, output pixels will be clipped to the range [output-low, output-high]. +If input-low is less than input-high, then all pixels less than or equal to input-low will map to output- +low, and all pixels that are greater than or equal to input-high will map to output-high. All interme- +diate pixel values are scaled proportionately to the output range. Nonintegral output values are +rounded to the nearest integer. +If input-low is greater than input-high then all pixels that are greater than or equal to input-low will +map to output-low, and all pixels that are less than or equal to input-high will map to output-high. +All intermediate pixel values will be linearly mapped to the output range such that input-low maps to +output-low, and input-high maps to output-high. Nonintegral output values are rounded to the near- +est integer. +If input-low equals input-high, or if output-low or output-high exceeds levels-1, a FloTechnique error +is generated. + +HardClip +Parameters +< none > +HardClip constrains the data such that all negative pixels are set to zero, and all pixels greater than +levels-1 are set to levels-1. All other pixels are rounded to the nearest integer value. + +Convert From RGB +CIELab +Parameters +matrix: XieTypMatrix +white-adjust: XieTypWhiteAdjustTechnique +white-params: +Matrix is a 3x3 RGB to CIEXYZ conversion matrix (the source white point is also encoded in ma- +trix). White-adjust is the WhiteAdjustTechnique that can be used to shift the white point of the out- +put data. White-params is the list of parameters required by white-adjust. +The input DataType can be Constrained or Unconstrained; the output DataType is always Uncon- +strained. When the input is Constrained, the data are normalized to the range [0, 1] (that is, scaled +by 1/(levels - 1) prior to the conversion. +CIEXYZ +Parameters +matrix: XieTypMatrix +white-adjust: XieTypWhiteAdjustTechnique +white-params: +Matrix is a 3x3 RGB to CIEXYZ conversion matrix (the source white point is also encoded in ma- +trix). White-adjust is the WhiteAdjustTechnique that can be used to shift the white point of the out- +put data. White-params is the list of parameters required by white-adjust. +The input DataType can be Constrained or Unconstrained; the output DataType is always Uncon- +strained. When the input is Constrained, the data are normalized to the range [0, 1] (that is, scaled +by 1/(levels - 1) prior to the conversion. +YCbCr +Parameters +luma: XieTypConstant +levels: XieTypLevels +bias: XieTypConstant +Luma represents the proportions of red, green, and blue in the luminance band, Y. Levels determines +the output levels if src is Constrained (otherwise, levels is ignored). Bias is used to add an offset to +the output pixels values. +Source data may be Constrained or Unconstrained; the output type will match. +YCC +Parameters +luma: XieTypConstant +levels: XieTypLevels +scale: XieTypFloat +Luma represents the proportions of red, green, and blue in the luminance band, Y. Levels determines +the output levels if src is Constrained (otherwise, levels is ignored). Scale is used to compress the +output pixels (a typical value is about 1.35 to 1.4 in the literature). + +Convert To RGB +CIELab +Parameters +matrix: XieTypMatrix +white-adjust: XieTypWhiteAdjustTechnique +white-params: +gamut-compress: XieTypGamutTechnique +gamut-params: +Matrix is a 3x3 CIEXYZ to RGB conversion matrix (the target white point is also encoded in matrix). +White-adjust is the WhiteAdjustTechnique that can be used to shift the white point of the source data +prior to conversion. White-params is the list of parameters required by white-adjust. Gamut- +compress is the GamutTechnique that can be used to keep the output pixels within the bounds of the +RGB colorspace. Gamut-params is the list of parameters required by gamut-compress. +The input DataType must be Unconstrained; the output DataType is also Unconstrained. + +CIEXYZ +Parameters +matrix: XieTypMatrix +white-adjust: XieTypWhiteAdjustTechnique +white-params: +gamut-compress: XieTypGamutTechnique +gamut-params: +Matrix is a 3x3 CIEXYZ to RGB conversion matrix (the target white point is also encoded in matrix). +White-adjust is the WhiteAdjustTechnique that can be used to shift the white point of the source data +prior to conversion. White-params is the list of parameters required by white-adjust. Gamut- +compress is the GamutTechnique that can be used to keep the output pixels within the bounds of the +RGB colorspace. Gamut-params is the list of parameters required by gamut-compress. +The input DataType must be Unconstrained; the output DataType is also Unconstrained. + + +YCbCr +Parameters +luma: XieTypConstant +levels: XieTypLevels +bias: XieTypConstant +gamut-compress: XieTypGamutTechnique +gamut-params: +Luma represents the proportions of red, green, and blue in the luminance band, Y. Levels determines +the output levels if src is Constrained (otherwise, levels is ignored). Bias is used to remove any offset +from the source pixels values. Gamut-compress is the GamutTechnique that can be used to keep the +output pixels within the bounds of the RGB colorspace. Gamut-params is the list of parameters re- +quired by gamut-compress. +Source data may be Constrained or Unconstrained; the output type will match. + +YCC +Parameters +luma: XieTypConstant +levels: XieTypLevels +scale: XieTypFloat +gamut-compress: XieTypGamutTechnique +gamut-params: +Luma represents the proportions of red, green, and blue in luminance Y. Levels determines the output +if src is Constrained (otherwise, levels is ignored). Scale is used to expand the source pixels (a typical +value is about 1.35 to 1.4 in the literature). Gamut-compress is the GamutTechnique that can be +used to keep the output pixels within the bounds of the RGB colorspace. Gamut-params is the list of +parameters required by gamut-compress. +Source data may be Constrained or Unconstrained; the output type will match. + +Convolution Edge Techniques +Various methods of handling edge conditions are provided for Convolve. These techniques determine +what pixel values are used when Convolve requires data beyond the image bounds. ConvolveTech- +niques only come into play when the kernel is positioned partially off the edge of the image. Data +around the edges of a ProcessDomain are convolved with adjacent image pixels wherever possible. +Constant +Parameters +constant: XieTypConstant +Constant uses the value specified by constant if pixels are required from beyond the edge of the im- +age. +Replicate +Parameters +< none > +Replicate uses the nearest edge pixel value if pixels are required from beyond the edge of the image. + +Decode Techniques +UncompressedSingle +Parameters +fill-order: XieTypOrientation +pixel-order: XieTypOrientation +pixel-stride: CARD8 +left-pad: CARD8 +scanline-pad: CARD8 +UncompressedTriple +Parameters +fill-order: XieTypOrientation +pixel-order: XieTypOrientation +band-order: XieTypOrientation +interleave: XieTypInterleave +pixel-stride: XieTypTripletofCARD8 +left-pad: XieTypTripletofCARD8 +scanline-pad: XieTypTripletofCARD8 +These techniques are used when no compression scheme has been applied to the image data. They are +used for SingleBand and TripleBand data, respectively. Their parameters define the format of the +DataStream of uncompressed data (the server may reformat the data as it chooses prior to processing +or storage). +The following parameters are common to both techniques: +* When multiple pixels are put in the same byte or a pixel spans multiple bytes, fill-order specifies +whether the pixels (or parts of pixels) are packed into the most or least significant bits of a byte +first. +* For pixels that span a byte boundary, pixel-order defines whether the most or least significant bits +of the pixel are transported first within the DataStream. +* Pixel-stride is the number of bits between the start of consecutive pixels within a scanline. It +must be at least enough bits to contain the number of input levels. +* Left-pad is the number of pad bits preceding the first image pixel in each scanline. If the server's +Alignment attribute is Alignable or pixel-stride fits the definition of Alignable, the value of left- +pad must be a multiple of pixel-stride or a multiple of 8; otherwise, left-pad may be any arbitrary +value. +* Scanline-pad defines a multiple of bytes to which each scanline is padded; valid values are: 0 +(not aligned), 1, 2, 4, 8, and 16. The total number of bits-per-scanline in the DataStream in- +cludes: left-pad, the image data (width x pixel-stride), and sufficient additional bits to satisfy +scanline-pad. +The following parameters are only used by UncompressedTriple: +* Band-order is the order of the image bands or image planes as they are transmitted through the +protocol stream. +* Interleave describes how the image bands are interleaved (per pixel within a single plane, or sent +as three separate planes). If interleave is BandByPixel, inter-band dimensions must match (that +is, the widths and the heights of all bands must match). + +CCITT-G31D +Parameters +encoded-order: XieTypOrientation +radiometric: BOOL +normal: BOOL +CCITT-G31D is the CCITT group 3 one dimensional encoding technique as defined by [ ]. +Encoded-order specifies the bit-order of the encoded data. Radiometric specifies that white runs in +the encoded data should be represented as image ones upon decode (maximum intensity), or, con- +versely, they will be decoded as image zeros if radiometric is false. Normal specifies that the data +was processed according to its normal fill-order when it was originally encoded . + + +CCITT-G32D +Parameters +encoded-order: XieTypOrientation +radiometric: BOOL +normal: BOOL +CCITT-G32D is the CCITT group 3 two dimensional encoding technique as defined by [1]. +Encoded-order specifies the bit-order of the encoded data. Radiometric specifies that white runs in +the encoded data should be represented as image ones upon decode (maximum intensity), or, con- +versely, they will be decoded as image zeros if radiometric is false. Normal specifies that the data +was processed according to its normal fill-order when it was originally encoded 2. + + +CCITT-G42D +Parameters +encoded-order: XieTypOrientation +radiometric: BOOL +normal: BOOL +CCITT-G42D is the CCITT group 4 two dimensional encoding technique as defined by [ ]. +Encoded-order specifies the bit-order of the encoded data. Radiometric specifies that white runs in +the encoded data should be represented as image ones upon decode (maximum intensity), or, con- +versely, they will be decoded as image zeros if radiometric is false. Normal specifies that the data +was processed according to its normal fill-order when it was originally encoded 2. + +JPEG-Baseline +Parameters +interleave: XieTypInterleave +band-order: XieTypOrientation +up-sample: BOOL +JPEG-Baseline is the baseline Huffman DCT encoding technique that is defined in [ ]. Only JPEG +Interchange Format (JIF) is supported (that is, all tables, compressed data, and so on are embedded in +the data stream, all delineated by markers). +Interleave determines if all bands of a TripleBand image will be interleaved within a single encoded +stream or if three separate encoded streams are expected. Band-order specifies the order in which the +image bands were originally encoded. Up-sample specifies that, if any bands in an interleaved en- +coded data stream are down-sampled, they should be up-sampled by the JPEG decoder. +Interleave, band-order, and up-sample are ignored for SingleBand images, and up-sample is always +ignored if interleave is BandByPlane. If up-sample is false and some of the encoded bands of an in- +terleaved image were down-sampled, an alternative method for up-sampling the image would be to +use a Geometry element with appropriate band-mask and sample technique parameters. + + +JPEG-Lossless +Parameters +interleave: XieTypInterleave +band-order: XieTypOrientation +JPEG-Lossless is the Huffman predictive sequential lossless encoding technique that is defined in [1]. +Interleave describes how the bands of TripleBand data are interleaved; either all bands are inter- +leaved within a single encoded stream, or three separate encoded streams are expected. Band-order +specifies the order in which the image bands were originally encoded. +Interleave and band-order are ignored for SingleBand images. + +TIFF-2 +Parameters +encoded-order: XieTypOrientation +radiometric: BOOL +normal: BOOL +TIFF-2 is modified Huffman encoding as described in [ ]. (TIFF compression scheme 2). +Encoded-order specifies the bit-order of the encoded data. Radiometric specifies that white runs in +the encoded data should be represented as image ones upon decode (maximum intensity), or, con- +versely, they will be decoded as image zeros if radiometric is false. Normal specifies that the data +was processed according to its normal fill-order when it was originally encoded . + + +TIFF-PackBits +Parameters +encoded-order: XieTypOrientation +normal: BOOL +TIFF-PackBits is byte-oriented run-length encoding as described in [1] (TIFF compression scheme +32773). +Encoded-order specifies the bit-order of the encoded data. Normal specifies that the data was proc- +essed according to its normal fill-order when it was originally encoded 2. + +Dithering Techniques +Dithering reduces the z-resolution or number of quantization levels in a continuous tone image. It +simulates the visual appearance of the original image by substituting the original continuous tone data +with patterns of lower z-resolution data. In ordered dither, fixed patterns are used. In error-diffusion +dither, the patterns are somewhat random and generally less distracting to the eye. A thorough treat- +ment of dithering techniques can be found in [ ]. +ErrorDiffusion +Parameters +< none > +ErrorDiffusion dither is an image level reduction process where the difference (error) between output +pixel values and input pixel values is fed back through a filter to be applied to future input pixels. +Thus, past quantization errors are negatively distributed or diffused into the yet to be requantized im- +age. + +Figure A-1 Diagram of the ErrorDiffusion algorithm +An analysis of various error filters is presented in chapter 8 of [1]. One popular error filter is de- +scribed in [ ]. + + +Ordered +Parameters +threshold-order: CARD8 +Dispersed-dot Ordered dither replaces a matrix, or block, of pixels with a patterned matrix of pixels. +This patterned matrix of pixels is applied across the entire image. Because these patterns may intro- +duce artifacts that are distracting to the eye, the threshold-order parameter is available to determine +the size of the dither matrix, and, therefore, the number of levels that can be simulated. If the value of +threshold-order is M, the threshold matrix can simulate 2M+1 levels. +For more information refer to [ ], and chapter 6 of [ ]. + +Encode Techniques +ServerChoice (only valid for ExportPhotomap) +Parameters +preference: CARD8 { PreferDefault, PreferSpace, PreferTime } +ServerChoice allows the server to choose an encode technique. An optional hint can be provided to +help the server make its choice, but the server is not obligated to obey the hint. PreferTime hints that +retrieval performance is the desired metric; PreferSpace indicates that frugal use of storage space is +more important. Normally, ServerChoice must choose a lossless encode technique, but when data is +received from an adjacent upstream import element, it may choose to pass the import elements input +data directly to the Photomap. + +UncompressedSingle +Parameters +fill-order: XieTypOrientation +pixel-order: XieTypOrientation +pixel-stride: CARD8 +scanline-pad: CARD8 +UncompressedTriple +Parameters +fill-order: XieTypOrientation +pixel-order: XieTypOrientation +band-order: XieTypOrientation +interleave: XieTypInterleave +pixel-stride: XieTypTripletofCARD8 +scanline-pad: XieTypTripletofCARD8 +UncompressedSingle and UncompressedTriple specify that no compression scheme is to be applied +to the image data. They are used for SingleBand and TripleBand data, respectively. Their parameters +define the format of the DataStream of uncompressed data that is made available for client retrieval +via GetClientData. +The following parameters are common to both techniques: +* When multiple pixels are put in the same byte or a pixel spans multiple bytes, fill-order specifies whether +the pixels (or parts of pixels) are packed into the most or least significant bits of a byte first. +* For pixels that span a byte boundary, pixel-order defines whether the most or least significant bits of the +pixel are put first within the DataStream. +* Pixel-stride is the number of bits between the start of consecutive pixels within a scanline. It must be at +least enough bits to contain the number of src levels. +* Scanline-pad defines a multiple of bytes to which each scanline is padded; valid values are: 0 (not aligned), +1, 2, 4, 8, and 16. +The following parameters are only used by UncompressedTriple: +* Band-order is the order of the image bands or image planes as they are transmitted through the protocol +stream. +* Interleave describes how the bands are interleaved (per pixel within a single plane, or sent as three separate +planes). Export of down-sampled BandByPixel data is not supported (that is, all bands must have equal +widths and equal heights). + +CCITT-G31D +Parameters +align-eol: BOOL +radiometric: BOOL +encoded-order: XieTypOrientation +CCITT-G31D is the CCITT group 3 one dimensional encoding technique as defined by [ ]. +Align-eol, if true, specifies that sufficient fill bits must precede EOL codes to guarantee that each +EOL will end on a byte boundary (thus EOL will be a nibble of 0 followed by a byte of 1: xxxx,00002 +0000,00012). Radiometric specifies that image ones will be encoded as white runs, or, conversely, +image zeros will be encoded as white runs if radiometric is false. Encoded-order specifies the bit- +order for the encoded data. + + +CCITT-G32D +Parameters +uncompressed: BOOL +align-eol: BOOL +radiometric: BOOL +encoded-order: XieTypOrientation +k-factor: CARD32 +CCITT-G32D is the CCITT group 3 two dimensional encoding technique as defined by [1]. +Uncompressed, if true, will enable the use of the uncompressed-mode CCITT extension. If true, +align-eol specifies that sufficient fill bits must precede EOL codes to guarantee that each EOL will +end on a byte boundary (thus EOL will be a nibble of 0 followed by a byte of 1: xxxx,00002 +0000,00012). Radiometric specifies that image ones will be encoded as white runs, or, conversely, +image zeros will be encoded as white runs if radiometric is false. Encoded-order specifies the bit- +order for the encoded data. K-factor specifies the number of 2D scanlines to produce for each 1D +scanline. + + +CCITT-G42D +Parameters +uncompressed: BOOL +radiometric: BOOL +encoded-order: XieTypOrientation +CCITT-G42D is the CCITT group 4 two dimensional encoding technique as defined by [ ]. +If true, uncompressed will enable the use of the uncompressed-mode CCITT extension. Radio- +metric specifies that image ones will be encoded as white runs, or, conversely, image zeros will be +encoded as white runs if radiometric is false. Encoded-order specifies the bit-order for the encoded +data. + +JPEG-Baseline +Parameters +interleave: XieTypInterleave +band-order: XieTypOrientation +horizontal-samples: XieTypTripletofCARD8 +vertical-samples: XieTypTripletofCARD8 +q-table: LISTofCARD8 +ac-table: LISTofCARD8 +dc-table: LISTofCARD8 +JPEG-Baseline is baseline Huffman DCT encoding as defined by [ ]. A stream of JPEG Interchange +Format (JIF) data is produced (that is, all tables, compressed data, and so on, delineated by markers). +Interleave determines if all bands of a TripleBand image will be interleaved within a single encoded +stream or if three separate encoded streams will be produced. Band-order specifies the order in which +the bands are encoded. Horizontal-samples and vertical-samples are the horizontal and vertical sam- +pling factors. Q-table is the quantization table. Ac-table specifies the AC Huffman table and dc- +table specifies the DC Huffman table. +One q-table per band or a single q-table may be shared between all bands. Generally, there is a single +AC/DC pair of Huffman tables, but, for TripleBand BandByPixel data, there may be two pairs of ta- +bles (one for the luminance band and the other for the chromanance bands). If any table is specified +with zero length, it indicates that the server implementor is to supply that table (for example, the ex- +ample tables defined in [1]). +Interleave, band-order, horizontal-samples, and vertical-samples are ignored for SingleBand images, +and horizontal-samples and vertical-samples are always ignored if interleave is BandByPlane. Horizon- +tal-samples and vertical-samples share the definitions and restrictions stipulated for parameters Hi and Vi, +respectively, that are specified in annexes A and B of [1]. + +JPEG-Lossless +Parameters +interleave: XieTypInterleave +band-order: XieTypOrientation +predictor: { PredictorNone None + PredictorA A + PredictorB B + PredictorC C + PredictorABC A+B-C + PredictorABC2 A+((B-C)/2) + PredictorBAC2 B+((A-C)/2) + PredictorAB2 } (A+B)/2 +table: LISTofCARD8 +JPEG-Lossless, corresponds to frames encoded using Huffman, predictive sequential lossless encod- +ing as defined by [1]. A DataStream of JPEG Interchange Format (JIF) data is returned (that is, all +tables, compressed data, and so on, delineated by markers). +Interleave determines if all bands of a TripleBand image will be interleaved within a single encoded +stream or if three separate encoded streams will be produced. Band-order specifies the order in which +the bands are encoded. Interleave and band-order are ignored for SingleBand images. +Predictor is the predictor selection value (one per band). Table is the lossless entropy encoding table +(up to one per band). Specifying a table of length zero indicates that the server implementor should +supply a table (for example, the example tables defined in [1]). +TIFF-2 +Parameters +radiometric: BOOL +encoded-order: XieTypOrientation +TIFF-2 is modified Huffman compression as described in [ ] (TIFF compression scheme 2). +Radiometric specifies that image ones will be encoded as white runs, or, conversely, image zeros +will be encoded as white runs if radiometric is false. Encoded-order specifies the bit-order for the +encoded data. + + +TIFF-PackBits +Parameters +encoded-order: XieTypOrientation +TIFF-PackBits is byte-oriented run-length encoding as described in [1] (TIFF compression scheme +32773). +Encoded-order specifies the bit-order of the encoded data. + +Gamut Compression Techniques +GamutTechnique defines the gamut compression techniques used by the ConvertToRGB element. +It deals with converted colors that fall outside the gamut of the RGB colorspace. +None +Parameters +< none > +None specifies that no gamut compression is required. + +ClipRGB +Parameters +< none > +ClipRGB ensures that Unconstrained output pixel values remain within the implicit range [0.0, 1.0]. +Note that Constrained data are clipped to the range [0, levels-1] by definition. + +Geometry Techniques +Antialias +Parameters +< none > +Some Geometry techniques produce artifacts when replicating pixels or sampling the input image at +distinct intervals. One example are the jaggies that one often sees along diagonal lines and curved +objects in an image. Another indication is that some techniques, such as, nearest neighbor, seem to +drop image detail. For example, one could scale down an image by four simply by selecting every +fourth row and column in the input image. Given an image with a set of randomly placed vertical +lines, each line will have a 75% chance of being dropped in the output image. As a result, the output +image in the worst case may have little resemblance to the input image. +Antialiasing techniques incorporate information from an area of pixels in the input image in order +to produce each output pixel. This implies that line dropouts and other artifacts will occur less often, +and the output image may have markedly better resemblance to the input image. +The techniques AntialiasByArea and AntialiasByLowpass are two examples of specific antialiasing +algorithms. Antialias may be mapped to either of them or to a vendor-private algorithm. All pa- +rameters for the specific algorithm employed are defaulted by the server. + +AntialiasByArea +Parameters +simple: INT16 +Geometry may be used to scale an image down from a larger size to a smaller size. This will decrease +the density of pixels per unit area in the image. In Figure A-2(a), an input image at the original +resolution is displayed. It is to be reduced to the grid shown in Figure A-2(b), where the original im- +age is superimposed on the new, lower density grid. Figure A-2(c) shows a possible result of using +nearest-neighbor sampling to fill the output grid. Specifically, the output pixel's upper-left corner is +matched against the nearest upper-left corner of pixels in the input image. If the nearest input pixel +is black, the output pixel is filled with black. Otherwise, it is filled with white. While the pixel in- +tensities (in this case, pure black and pure white) are preserved by this operation, the overall image +shape is changed. + + +Figure A-2 Effect of sampling technique when scaling to a lower pixel density +In Figure A-2(d), the output image is computed by assigning to each output pixel the weighted aver- +age of the intensity values of input pixels that fall within its area. That is, the four corners of the out- +put pixel are projected back onto the input image. The input pixels that lie within this area contribute +according to the following: + + + is the intensity of output pixel . stands for the projection of into the input image +space. is the area of in the input image space. is the area of the intersection +of with the rectangular locus of . The sum progresses over all pixels in the input image (note +that for most such pixels, the area of intersection will be zero). + +Figure A-3 illustrates the calculation for a single output pixel, P, whose projection intersects nine +input pixels to various degrees. Note that the number of pixels intersected depends on the degree of +scaling involved. A greater reduction in producing the output image will cause more input pixels to +be intersected per output pixel. Also, in case of nonorthogonal rotation of the image, the areas of +intersection will not be rectangular in general. + + +Figure A-3 Illustration of an output pixel mapping back to the input image +Because of the computational complexity of this method, two approximations are supported. If sim- +ple is nonzero, the pixels covered by the projected area will be averaged without regard to the relative +amount of gray area that they contain: if they are touched by the area, they are included in a simple +average. If simple is set to N, with N odd and greater than one (3,5,7, ...), then only the center point +of the output pixel is projected, and a simple average is taken of an N by N window centered on the +projection. For best results, N should correspond roughly to the amount of scaling that will be done. + +AntialiasByLowpass +Parameters +kernel-size: INT16 +Geometry may be used to scale an image down from a larger size to a smaller size. This will decrease +the density of pixels per unit area in the image. Figure A-2 demonstrates the difference between +scaling an image down using nearest-neighbor vs. antialias techniques. AntialiasByArea preserves +shape, as in Figure A-2 (d) but can be very slow computationally. The method presented here repre- +sents an approximation to AntialiasByArea , which can be faster, yet provides similar results. +Figure A-4 demonstrates how antialiasing can be produced using a low-pass filter. A 3x3 boxcar ker- +nel is passed over the original input image, in Figure A-4 (b). This image is shown superimposed on +the lower density grid in Figure A-4 (c). Nearest neighbor sampling by selecting the value of the in- +put pixel in the upper-left corner of the output pixel area results in the image in Figure +A-4(d). As was the case with AntialiasByArea, the overall structure of the input image is main- +tained. + +Figure A-4 Sequence producing an antialiased image using a low-pass filter +The user is allowed to select the size of the image kernel via the kernel-size parameter. For best re- +sults, kernel-size should be chosen to correspond roughly to the amount of scaling that will be done. +Note that the server chooses the best kernel for the appropriate size; the values used in the kernel are +not alterable by the client application. Clients wishing to specify the kernel in more detail should use +Convolve directly. + +BilinearInterpolation + Parameters +< none > + +Geometry maps each pixel (x',y') in the output image to the coordinate location (x,y) in the input +image by: + (1) + +It is not unusual that the input location (x,y), so derived will be nonintegral and will not correspond +exactly to a single pixel in the input image. In this case, we can obtain an interpolated value by first +interpolating its neighbors in the X direction followed by an interpolation in the Y direction, as de- +picted below. + +Pixel grid locations P, Q, R, and S are integral. Pixel location X = (x,y)T, obtained from the map- +ping equation above, differs from P by fractional amounts s in the x direction and t in the y direc- +tion. Point pq is the projection of X on line PQ, and point sr is the projection of X on line SR. +Let I(P) be the value of the input image at coordinate P, if P is within the image extent. Otherwise, +let I(P) be constant, where constant is the pixel value passed to the Geometry element. A value of +I(X)must be estimated from I(P), I(Q), I(R), and I(S). We may obtain estimates of I(pq) +and I(sr) by: +I(pq) = (1 - s) * I(P) + s * I(Q) +I(sr) = (1 - s) * I(S) + s * I(R) +Given values for I(pq) and I(sr), I(X) is obtained by interpolating in the y direction: +I(X) = (1 - t) * I(pq) + t * I(sr) +Thus +I(X) = (1 - s) * (1 - t) * I(P) + (1 - s) * t * I(S) + s * (1 - t) * I(Q) + s * t * I(R) +Note that I(X) provides sensible values for the extreme values of s and t (0 and 1) and for +s = t = 1/2. + +Gaussian +Parameters +sigma: XieTypFloat +normalize: XieTypFloat +radius: CARD8 +simple: BOOL +Sigma is the drop-off rate; normalize is a normalization constant; radius defines the extent of com- +putation; and, simple allows the use of an approximate form. + +Geometry maps each pixel (x',y') in the output image to the coordinate location (x,y) in the input +image by: + (1) + +It is not unusual that the input location (x,y), so derived will be nonintegral and will not correspond +exactly to a single pixel in the input image. The situation is depicted below: + +Pixel grid locations P, Q, R, and S are integral. Pixel location X = (x,y)T, obtained from the map- +ping equation above, differs from P by fractional amounts s (horizontally) and t (vertically). +Let I(P) be the value of the input image at coordinate P, if P is within the image extent. Otherwise, +let I(P) be constant, where constant is the pixel value passed to the Geometry element. A value of +I(X) must be estimated from I(P), I(Q), I(R), and I(S). From sampling theory, a band width lim- +ited continuous input image can be recovered perfectly (under certain conditions) from its sampled +output by computing the convolution: + +I(x,y) is the continuous image, i(m,n) the discrete sampled image, and h(u,v) the impulse response +function for an appropriate low pass filter. Note that both nearest-neighbor and bilinear interpolation +resampling techniques may be cast in this form [ ]. +A Gaussian impulse response function has the quality that its Fourier transform has the same bell +curve shape. For certain kinds of images, this provides a better approximation to an ideal low-pass +filter than is represented by either bilinear or nearest-neighbor interpolation. The specific form of +h(u,v) is given by: + +The term is called the normalization constant and may be altered using the normalize pa- +rameter. The suggested value for s is 1. Note that all technique parameters must be chosen in con- +cert. +As an example of Gaussian interpolation, assume s = 1 and that point P in the above figure has coor- +dinates (m',n'). Then x = m'+ s and y = n'+ t, and the basic interpolation equation at (x,y) be- +comes: + +The contribution from point P in this equation is represented by the summation value for m = m', +n = n'. Identifying this term in Eq (4), the contribution is: + +Or: + +Similar calculations reveal: + (7) + (8) + (9) +A suggested value for radius is one, that is, only pixels within a distance of one in either the x or y +direction are involved in the calculation. Thus, I(x,y) is given by the sum of Eqs. 6-9. Choosing a +larger radius would bring in more terms. +For computational convenience, a simplified form of Gaussian interpolation is provided. If simple is +true, the impulse-response function of Equation 3a is replaced by: + (3b) +The normalization factor N is defined by normalize. As with true Gaussian interpolation, the radius +parameter is used to determine the number of pixels involved in the computation. + +NearestNeighbor +Parameters +modify: CARD8 { FavorDown, FavorUp, +RoundNW, RoundNE, +RoundSW, RoundSE } + (1) + +Geometry maps each pixel (x',y') in the output image to the coordinate location (x,y) in the input +image by: +It is not unusual that the input location (x,y), so derived will be nonintegral and will not correspond +exactly to a single pixel in the input image. The situation is depicted below: + +Pixel grid locations P, Q, R, and S are integral. Pixel location X = (x,y)T, obtained from the map- +ping equation above, differs from P by fractional amounts s in the x direction and t in the y direc- +tion. +Let I(P) be the value of the input image at coordinate P if P is within the image extent. Otherwise, +let I(P) be constant, where constant is the pixel value passed to the Geometry element. A value of +I(X) must be estimated from I(P), I(Q), I(R), and I(S). In nearest-neighbor sampling, we +simply choose the image value from the discrete location closest to X. Thus, +if s < 1/2, t < 1/2, set I(X) = I(P), +if s > 1/2, t < 1/2, set I(X) = I(Q), +if s > 1/2, t > 1/2, set I(X) = I(R), +if s < 1/2, t > 1/2, set I(X) = I(S). +The behavior on even boundaries (s = 1/2 or t = 1/2) is determined by the modify parameter. If +modify is FavorDown, all less than signs in the above are replaced with less than or equal signs. +Thus, P would win all ties; S and Q would lose to P but win over R; and, R would lose all ties. If +modify is FavorUp , then all greater than signs would be replaced with greater than or equals, and +the opposite behavior would occur. +Four additional options are provided. The RoundNW option will always choose P; RoundNE will al- +ways choose Q; RoundSE will always choose R; and, RoundSW will always choose S. These are not +strictly nearest neighbor algorithms but are available for computational/filtering convenience. + +Histogram Shapes +MatchHistogram matches the histogram of a source image to a specific shape represented by a prob- +ability density function. HistogramShape defines various shapes that can be requested. +Flat +Parameters +< none > +Flat specifies that the output image is to have a histogram that approximates a uniform density +(histogram equalization). No additional parameters are required. + +Gaussian +Parameters +mean: XieTypFloat +sigma: XieTypFloat +Gaussian specifies that the output image is to have histogram that approximates a Gaussian probabil- +ity density. The supplied parameters are used to generate a Gaussian probability density function +centered around the mean level with a spread specified by sigma: + + +Hyperbolic +Parameters +constant: XieTypFloat +shape-factor: BOOL +Hyperbolic specifies that the output image is to have histogram that approximates a hyperbolic prob- +ability density. +Constant is used to generate a hyperbolic probability density function: + +Shape-factor should be specified as false if the histogram shape represents decreasing values for +higher levels or true if the shape represents increasing values for higher levels. + +White Point Adjustment Techniques +WhiteAdjustTechnique defines the white point adjustment techniques that can be used when con- +verting to or from the RGB colorspace. White point correction can be used to ensure that white looks +white, or it can be used to change the overall tint of an image. +None +Parameters +< none > +None specifies that no white point correction is desired. +CIELabShift +Parameters +white-point: XieTypConstant +CIELabShift specifies that white point correction is to be accomplished by adding the white point +displacement to the a*b* plane in the CIELab colorspace. The white-point is specified using +CIEXYZ encodings. +If WhiteAdjustTechnique is used with ConvertFromRGB, white-point specifies the desired white +point of the output data. If WhiteAdjustTechnique is used with ConvertToRGB, white-point speci- +fies the white point of the source data. + + A full description of the color matching algorithm is available upon request from author Shelley. + "Color image quantization for frame buffer display", by P. S. Heckbert, Computer Graphics (ACM SIGGRAPH '82 Conf. Proc.), +vol. 16, no. 3, page 297. + CCITT T.4, "Standardization of Group 3 Facsimile Apparatus for Document Transmission" + Image compression generally starts with the least significant pixel in the image (at coordinate 0,0) and proceeds in raster order to +the end of the image. This would be the normal order. Some encoders read pixels in reversed order within each byte (that is, start +reading at bit 7 and proceed down through 0, then 15 through 8, and so on). Specifying normal as false can correct for this situa- +tion upon decode (that is, the bit order within each byte of decoded data is reversed before the data are forwarded to downstream +elements). + CCITT T.6, "Facsimile Coding Schemes and Coding Control Functions for Group 4 Facsimile Apparatus" + ISO DIS 10918-1 "Digital Compression and Coding of Continuous-tone Still Images" + "TIFF Tag Image File Format", revision 6.0, draft 2, by Aldus Corporation + Image compression generally starts with the least significant pixel in the image (at coordinate 0,0) and proceeds in raster order to +the end of the image. This would be the normal order. Some encoders read pixels in reversed order within each byte (that is, start +reading at bit 7 and proceed down through 0, then 15 through 8, and so on). Specifying normal as false can correct for this situa- +tion upon decode (that is, the bit order within each byte of decoded data is reversed before the data are forwarded to downstream +elements). + "Digital Halftoning", by R. A. Ulichney, Cambridge, MA: The MIT Press + "Adaptive algorithm for spatial grey scale", by R. W. Floyd and L. Steinberg, SID Int. Sym. Digest of Tech. Papers, page 36 + "An optimum method for two level rendition of continuous-tone pictures", by B. E. Bayer, Proc. IEEE Int. Conf. Commun., +Conference Record, page 26-11 + "Digital Halftoning", by R. A. Ulichney, Cambridge, MA: The MIT Press + CCITT T.4, "Standardization of Group 3 Facsimile Apparatus for Document Transmission" + CCITT T.6 "Facsimile Coding Schemes and Coding Control Functions for Group 4 Facsimile Apparatus" + ISO DIS 10918-1 "Digital Compression and Coding of Continuous-tone Still Images" + "TIFF Tag Image File Format", revision 6.0, draft 2, by Aldus Corporation + A. Jain. Fundamentals of Digital Image Processing. Englewood Cliffs, J.J.: Prentice-Hall, 1989 + + +Techniques A-28 + + +B +Service Class +Full +The full XIE protocol is deemed sufficient to rendering and displaying bitonal, gray-scale, and color +images on an X server. Full XIE encompasses everything in this document. +DIS +The Document Imaging Subsets (DIS) targeted at the viewing of compressed, bitonal documents on +displays that might not otherwise have the resources for the full XIE protocol. DIS provides a mini- +mal set of primitives for manipulating Constrained, SingleBand data and differs from Full XIE in +the following ways: +* Only LUT, Photomap, Photoflo, and Photospace resources are supported. +* ColorList and ROI resources are not supported. +* Only Geometry and Point process elements are supported. +* Restricting processing via a ProcessDomain is not supported. +* TripleBand data is not supported. +* Image data is always Constrained and is limited to 2max-depth levels, where max-depth is the depth +of the deepest DRAWABLE supported by the server. +* The Decode_JPEG-Baseline technique is optional (rather than required). +Typical DIS applications will use relatively simple Photoflos that import image data, apply a geomet- +ric transformation, and export the result to a DRAWABLE for display. Figure B-1 summarizes the im- +port, process, and export elements that are provided in DIS: +Sources Operators Destinations +ImportDrawable Geometry ExportDrawable +ImportDrawablePlane Point ExportDrawablePlane +ImportLUT ExportLUT +ImportClientLUT ExportClientLUT +ImportPhotomap ExportPhotomap +ImportClientPhoto ExportClientPhoto +Figure B-1 DIS sources, operators, and destinations +Service Class Summary +The following tables summarize the service classes to which each item in the XIE protocol belongs. +For some XIE types, where a list of alternative values is defined, some of the alternative values are +required for a particular service class, while others are not. In these cases, the alternative values are +itemized. If all items of a type are required or none are, the type itself is either required or excluded. +Alternative techniques are listed separately in Table B-2. + +Table B-1 Types itemized by ServiceClass +Type Full DIS +XieTypAlignment required required +XieTypArithmeticOp required excluded +XieTypColorAllocTechnique required excluded +XieTypColorList required excluded +XieTypCompareOp required excluded +XieTypConstant required required +XieTypConstrainTechnique required excluded +XieTypCovertFromRGBTechnique required excluded +XieTypCovertToRGBTechnique required excluded +XieTypConvolveTechnique required excluded +XieTypDataClass required required +XieValSingleBand required required +XieValTripleBand required excluded +XieTypDataStream required required +XieTypDataType required required +XieTypDecodeTechnique required required +XieTypDitherTechnique required excluded +XieTypEncodeTechnique required required +XieTypExecutable required required +XieTypExportNotify required required +XieTypExportState required required +XieTypFloat required required +XieTypGamutTechnique required excluded +XieTypGeometryTechnique required required +XieTypHistogramData required excluded +XieTypHistogramShape required excluded +XieTypInterleave required required +XieTypLevels required required +XieTypLUT required required +XieTypMathOp required excluded +XieTypMatrix required excluded +XieTypOrientation required required +XieTypPhotoElement required required +XieTypPhotoflo required required +XieTypPhotofloOutcome required required +XieTypPhotofloState required required +XieTypPhotomap required required +XieTypPhotospace required required +XieTypPhototag required required +XieTypProcessDomain required required +XieTypRectangle required excluded +XieTypROI required excluded + +Table B-1 Types itemized by ServiceClass (continued) +Type Full DIS +XieTypServiceClass required required +XieValFull required excluded +XieValDIS required required +XieTypTechniqueGroup required required +XieValDefault required required +XieValAll required required +XieValColorAlloc required excluded +XieValConstrain required excluded +XieValConvertFromRGB required excluded +XieValConvertToRGB required excluded +XieValConvolve required excluded +XieValDecode required required +XieValDither required excluded +XieValEncode required required +XieValGamut required excluded +XieValGeometry required required +XieValHistogram required excluded +XieValWhiteAdjust required excluded +XieTypTechniqueRec required required +XieTypTile required excluded +XieTypTripletof required required +XieTypWhiteAdjustTechnique required excluded + +Table B-2 Techniques itemized by ServiceClass +Technique Full DIS +XieValColorAlloc_AllocAll optional excluded +XieValColorAlloc_Match optional excluded +XieValColorAlloc_Requantize optional excluded +XieValConstrain_ClipScale required excluded +XieValConstrain_HardClip required excluded +XieValConvertFromRGB_CIELab required excluded +XieValConvertFromRGB_CIEXYZ required excluded +XieValConvertFromRGB_YCbCr required excluded +XieValConvertFromRGB_YCC required excluded +XieValConvertToRGB_CIELab required excluded +XieValConvertToRGB_CIEXYZ required excluded +XieValConvertToRGB_YCbCr required excluded +XieValConvertToRGB_YCC required excluded +XieValConvolve_Constant required excluded +XieValConvolve_Replicate optional excluded +XieValDecode_UncompressedSingle required required +XieValDecode_UncompressedTriple required excluded +XieValDecode_CCITT-G31D required required +XieValDecode_CCITT-G32D required required +XieValDecode_CCITT-G42D required required +XieValDecode_JPEG-Baseline required optional +XieValDecode_JPEG-Lossless optional optional +XieValDecode_TIFF-2 optional optional +XieValDecode_TIFF-PackBits optional optional +XieValDither_ErrorDiffusion optional excluded +XieValDither_Ordered optional excluded +XieValEncode_ServerChoice required required +XieValEncode_UncompressedSingle required required +XieValEncode_UncompressedTriple required excluded +XieValEncode_CCITT-G31D optional optional +XieValEncode_CCITT-G32D optional optional +XieValEncode_CCITT-G42D optional optional +XieValEncode_JPEG-Baseline optional optional +XieValEncode_JPEG-Lossless optional optional +XieValEncode_TIFF-2 optional optional +XieValEncode_TIFF-PackBits optional optional +XieValGamut_None required excluded +XieValGamut_ClipRGB required excluded +XieValGeometry_Antialias required required +XieValGeometry_AntialiasByArea optional optional +XieValGeometry_AntialiasByLowpass optional optional +XieValGeometry_BilinearInterpolation optional optional +XieValGeometry_Gaussian optional optional +XieValGeometry_NearestNeighbor required required +XieValHistogram_Flat required excluded +XieValHistogram_Gaussian required excluded +XieValHistogram_Hyperbolic required excluded +XieValWhiteAdjust_None required excluded +XieValWhiteAdjust_CIELabShift optional excluded + +Table B-3 Requests itemized by ServiceClass +Requests Full DIS +XieReqQueryImageExtension required required +XieReqQueryTechniques required required +XieReqCreateColorList required excluded +XieReqDestroyColorList required excluded +XieReqPurgeColorList required excluded +XieReqQueryColorList required excluded +XieReqCreateLUT required required +XieReqDestroyLUT required required +XieReqCreatePhotomap required required +XieReqDestroyPhotomap required required +XieReqQueryPhotomap required required +XieReqCreateROI required excluded +XieReqDestroyROI required excluded +XieReqCreatePhotospace required required +XieReqDestroyPhotospace required required +XieReqExecuteImmediate required required +XieReqCreatePhotoflo required required +XieReqDestroyPhotoflo required required +XieReqExecutePhotoflo required required +XieReqModifyPhotoflo required required +XieReqRedefinePhotoflo required required +XieReqPutClientData required required +XieReqGetClientData required required +XieReqQueryPhotoflo required required +XieReqAwait required required +XieReqAbort required required + +Table B-4 Import elements itemized by ServiceClass +Import Element Full DIS +XieFloImportClientLUT required required +XieFloImportClientPhoto required required +XieFloImportClientROI required excluded +XieFloImportDrawable required required +XieFloImportDrawablePlane required required +XieFloImportLUT required required +XieFloImportPhotomap required required +XieFloImportROI required excluded + +Table B-5 Process elements itemized by ServiceClass +Process Element Full DIS +XieFloArithmetic required excluded +XieFloBandCombine required excluded +XieFloBandExtract required excluded +XieFloBandSelect required excluded +XieFloBlend required excluded +XieFloCompare required excluded +XieFloConstrain required excluded +XieFloConvertFromIndex required excluded +XieFloConvertFromRGB required excluded +XieFloConvertToIndex required excluded +XieFloConvertToRGB required excluded +XieFloConvolve required excluded +XieFloDither required excluded +XieFloGeometry required required +XieFloLogical required excluded +XieFloMatchHistogram required excluded +XieFloMath required excluded +XieFloPasteUp required excluded +XieFloPoint required required +XieFloUnconstrain required excluded + +Table B-6 Export elements itemized by ServiceClass +Export Element Full DIS +XieFloExportClientHistogram required excluded +XieFloExportClientLUT required required +XieFloExportClientPhoto required required +XieFloExportClientROI required excluded +XieFloExportDrawable required required +XieFloExportDrawablePlane required required +XieFloExportLUT required required +XieFloExportPhotomap required required +XieFloExportROI required excluded + +Table B-7 Events itemized by ServiceClass +Event Full DIS +XieEvnColorAlloc required excluded +XieEvnDecodeNotify required required +XieEvnExportAvailable required required +XieEvnImportObscured required required +XieEvnPhotofloDone required required +Table B-8 Errors itemized by ServiceClass +Error Full DIS +XieErrColorList required excluded +XieErrLUT required required +XieErrPhotoflo required required +XieErrPhotomap required required +XieErrPhotospace required required +XieErrROI required excluded +XieErrFloAccess required required +XieErrFloAlloc required required +XieErrFloColormap required excluded +XieErrFloColorList required excluded +XieErrFloDomain required required +XieErrFloDrawable required required +XieErrFloElement required required +XieErrFloGC required required +XieErrFloID required required +XieErrFloLength required required +XieErrFloLUT required required +XieErrFloMatch required required +XieErrFloOperator required excluded +XieErrFloPhotomap required required +XieErrFloROI required excluded +XieErrFloSource required required +XieErrFloTechnique required required +XieErrFloValue required required +XieErrFloImplementation required required + + + + + + + + + + + + + + + + + + + + + + +almost blank +Service Class B-8 + + +C +Protocol Encodings +Extension Name +# of Bytes Value Description +3 upper-case ASCII string "XIE" + 88 X + 73 I + 69 E +Types +Alignment +# of Bytes Value Description +1 alignment: + 1 Alignable + 2 Arbitrary +ArithmeticOp +# of Bytes Value Description +1 operator: + 1 Add + 2 Sub + 3 SubRev + 4 Mul + 5 Div + 6 DivRev + 7 Min + 8 Max + 9 Gamma +ColorAllocTechnique +# of Bytes Value Description +2 number: + 0 Default + 2 ColorAlloc_AllocAll + 4 ColorAlloc_Match + 6 ColorAlloc_Requantize +ColorList +# of Bytes Value Description +4 CARD32 color-list id (top 3 bits guaranteed to be zero) +CompareOp +# of Bytes Value Description +1 operator: + 1 LT + 2 LE + 3 EQ + 4 NE + 5 GT + 6 GE +Constant +# of Bytes Value Description +4 Float constant[0] +4 Float constant[1] +4 Float constant[2] +ConstrainTechnique +# of Bytes Value Description +2 number: + 2 Constrain_ClipScale + 4 Constrain_HardClip +ConvertFromRGBTechnique +# of Bytes Value Description +2 number: + 2 ConvertFrom_CIELab + 4 ConvertFrom_CIEXYZ + 6 ConvertFrom_YCbC + 8 ConvertFrom_YCC +ConvertToRGBTechnique +# of Bytes Value Description +2 number: + 2 ConvertTo_CIELab + 4 ConvertTo_CIEXYZ + 6 ConvertTo_YCbC + 8 ConvertTo_YCC +ConvolveTechnique +# of Bytes Value Description +2 number: + 0 Default + 2 Convolve_Constant + 4 Convolve_Replicate +DataClass +# of Bytes Value Description +1 data-class: + 1 SingleBand + 2 TripleBand +DataStream +# of Bytes Value Description +n LISTofCARD8 data +DataType +# of Bytes Value Description +1 data-type: + 1 Constrained + 2 Unconstrained +DecodeTechnique +# of Bytes Value Description +2 number: + 2 Decode_UncompressedSingle + 3 Decode_UncompressedTriple + 4 Decode_CCITT-G31D + 6 Decode_CCITT-G32D + 8 Decode_CCITT-G42D + 10 Decode_JPEG-Baseline + 12 Decode_JPEG-Lossless + 14 Decode_TIFF-2 + 16 Decode_TIFF-PackBits +DitherTechnique +# of Bytes Value Description +2 number: + 0 Default + 2 Dither_ErrorDiffusion + 4 Dither_Ordered +EncodeTechnique +# of Bytes Value Description +2 number: + 1 Encode_ServerChoice + 2 Encode_UncompressedSingle + 3 Encode_UncompressedTriple + 4 Encode_CCITT-G31D + 6 Encode_CCITT-G32D + 8 Encode_CCITT-G42D + 10 Encode_JPEG-Baseline + 12 Encode_JPEG-Lossless + 14 Encode_TIFF-2 + 16 Encode_TIFF-PackBits +Executable +# of Bytes Value Description +4 name-space: + Photospace if immediate Photoflo + 0 if stored Photoflo +4 flo-id: + CARD32 if immediate Photoflo + Photoflo if stored Photoflo +ExportNotify +# of Bytes Value Description +1 notify: + 1 Disable + 2 FirstData + 3 NewData +ExportState +# of Bytes Value Description +1 state: + 1 ExportDone + 2 ExportMore + 3 ExportEmpty + 4 ExportError +Float +# of Bytes Value Description +4 <32-bits> IEEE single-precision float +GamutTechnique +# of Bytes Value Description +2 number: + 0 Default + 1 Gamut_None + 2 Gamut_ClipRGB +GeometryTechnique +# of Bytes Value Description +2 number: + 0 Default + 2 Geometry_Antialias + 4 Geometry_AntialiasByArea + 6 Geometry_AntialiasByLowpass + 8 Geometry_BilinearInterpolation + 10 Geometry_Gaussian + 12 Geometry_NearestNeighbor +HistogramData +# of Bytes Value Description +4 CARD32 value +4 CARD32 count +HistogramShape +# of Bytes Value Description +2 number: + 2 Histogram_Flat + 4 Histogram_Gaussian + 6 Histogram_Hyperbolic +Interleave +# of Bytes Value Description +1 interleave: + 1 BandByPixel + 2 BandByPlane +Levels +# of Bytes Value Description +4 CARD32 levels[0] +4 CARD32 levels[1] +4 CARD32 levels[2] +LUT +# of Bytes Value Description +4 CARD32 lut id (top 3 bits guaranteed to be zero) +MathOp +# of Bytes Value Description +1 operator: + 1 Exp + 2 Ln + 3 Log2 + 4 Log10 + 5 Square + 6 Sqrt +Matrix +# of Bytes Value Description +4 Float matrix[0,0] +4 Float matrix[0,1] +4 Float matrix[0,2] +4 Float matrix[1,0] +4 Float matrix[1,1] +4 Float matrix[1,2] +4 Float matrix[2,0] +4 Float matrix[2,1] +4 Float matrix[2,2] +Orientation +# of Bytes Value Description +1 order: + 1 LSFirst + 2 MSFirst +PhotoElement + Refer to the individual Import, Process, and Export encodings. + +Photoflo +# of Bytes Value Description +4 CARD32 stored photoflo id (top 3 bits guaranteed to be zero) +PhotofloOutcome +# of Bytes Value Description +1 outcome: + 1 FloSuccess + 2 FloAbort + 3 FloError +PhotofloState +# of Bytes Value Description +1 state: + 1 Inactive + 2 Active + 3 Nonexistent +Photomap +# of Bytes Value Description +4 CARD32 photomap id (top 3 bits guaranteed to be zero) +Photospace +# of Bytes Value Description +4 CARD32 photospace id (top 3 bits guaranteed to be zero) +Phototag +# of Bytes Value Description +2 CARD16 phototag (index within PhotoElement list) +ProcessDomain +# of Bytes Value Description +4 INT32 offset-x +4 INT32 offset-y +2 Phototag domain +Rectangle +# of Bytes Value Description +4 INT32 x +4 INT32 y +4 CARD32 width +4 CARD32 height +ROI +# of Bytes Value Description +4 CARD32 roi id (top 3 bits guaranteed to be zero) +ServiceClass +# of Bytes Value Description +1 class: + 1 Full + 2 DIS +TechniqueGroup +# of Bytes Value Description +1 group: + 0 Default + 1 All + 2 ColorAlloc + 4 Constrain + 6 ConvertFromRGB + 8 ConvertToRGB + 10 Convolve + 12 Decode + 14 Dither + 16 Encode + 18 Gamut + 20 Geometry + 22 Histogram + 24 WhiteAdjust +TechniqueRec +# of Bytes Value Description +1 BOOL needs-parameters +1 TechniqueGroup group +2 CARD16 number +1 CARD8 speed (0: slowest, 255: fastest) +1 n length of name +2 unused +n LISTofCARD8 name (ASCII string) +p unused, p=pad(n) +Tile +# of Bytes Value Description +2 Phototag src +2 unused +4 INT32 dst-x +4 INT32 dst-y +Tripletoftype +# of Bytes Value Description +size of type value[0] +size of type value[1] +size of type value[2] +WhiteAdjustTechnique +# of Bytes Value Description +2 number: + 0 Default + 1 WhiteAdjust_None + 2 WhiteAdjust_CIELabShift + +Requests and Replies +QueryImageExtension request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 1 XIE minor opcode +2 2 request length +2 CARD16 client-major-version +2 CARD16 client-minor-version +QueryImageExtension reply +# of Bytes Value Description +1 1 reply +1 unused +2 CARD16 sequence number +4 n reply length (length of constrained-levels) +2 CARD16 server-major-version +2 CARD16 server-minor-version +1 ServiceClass service-class +1 Alignment alignment +2 CARD16 unconstrained-mantissa +4 INT32 unconstrained-max-exp +4 INT32 unconstrained-min-exp +8 unused +4n LISTofCARD32 constrained-levels +QueryTechniques request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 2 XIE minor opcode +2 2 request length +1 TechniqueGroup technique-group +3 unused +QueryTechniques reply +# of Bytes Value Description +1 1 reply +1 unused +2 CARD16 sequence number +4 n/4 reply length +2 CARD16 number of techniques +22 unused +n LISTofTechniqueRec techniques +CreateColorList request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 3 XIE minor opcode +2 2 request length +4 ColorList color-list +DestroyColorList request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 4 XIE minor opcode +2 2 request length +4 ColorList color-list +PurgeColorList request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 5 XIE minor opcode +2 2 request length +4 ColorList color-list +QueryColorList request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 6 XIE minor opcode +2 2 request length +4 ColorList color-list +QueryColorList reply +# of Bytes Value Description +1 1 reply +1 unused +2 CARD16 sequence number +4 n reply length (number of colors) +4 COLORMAP colormap +20 unused +4n LISTofCARD32 list of colors +CreateLUT request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 7 XIE minor opcode +2 2 request length +4 LUT lut +DestroyLUT request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 8 XIE minor opcode +2 2 request length +4 LUT lut +CreatePhotomap request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 9 XIE minor opcode +2 2 request length +4 Photomap photomap +DestroyPhotomap request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 10 XIE minor opcode +2 2 request length +4 Photomap photomap +QueryPhotomap request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 11 XIE minor opcode +2 2 request length +4 Photomap photomap +QueryPhotomap reply +# of Bytes Value Description +1 1 reply +1 BOOL populated +2 CARD16 sequence number +4 4 reply length +1 DataClass data-class +1 DataType data-type +2 DecodeTechnique +12 TripletofCARD32 width +12 TripletofCARD32 height +12 Levels levels +CreateROI request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 12 XIE minor opcode +2 2 request length +4 ROI roi +DestroyROI request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 13 XIE minor opcode +2 2 request length +4 ROI roi +CreatePhotospace request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 14 XIE minor opcode +2 2 request length +4 Photospace name-space +DestroyPhotospace request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 15 XIE minor opcode +2 2 request length +4 Photospace name-space +ExecuteImmediate request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 16 XIE minor opcode +2 4+n/4 request length +8 Executable instance +2 CARD16 number of elements in element-list +1 BOOL notify +1 unused +n LISTofPhotoElement element-list +CreatePhotoflo request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 17 XIE minor opcode +2 3+n/4 request length +4 Photoflo photoflo +2 CARD16 number of elements in element-list +2 unused +n LISTofPhotoElement element-list +DestroyPhotoflo request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 18 XIE minor opcode +2 2 request length +4 Photoflo photoflo +ExecutePhotoflo request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 19 XIE minor opcode +2 3 request length +4 Photoflo photoflo +1 BOOL notify +3 unused +ModifyPhotoflo request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 20 XIE minor opcode +2 3+n/4 request length +4 Photoflo photoflo +2 Phototag start +2 CARD16 number of elements in element-list +n LISTofPhotoElement element-list +RedefinePhotoflo request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 21 XIE minor opcode +2 3+n/4 request length +4 Photoflo photoflo +2 CARD16 number of elements in element-list +2 unused +n LISTofPhotoElement element-list +PutClientData request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 22 XIE minor opcode +2 5+(n+p)/4 request length +8 Executable instance +2 Phototag element +1 BOOL final +1 CARD8 band-number +4 n byte-count (length of data in bytes) +n LISTofCARD8 data +p unused, p=pad(n) +GetClientData request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 23 XIE minor opcode +2 5 request length +8 Executable instance +4 CARD32 max-bytes +2 Phototag element +1 BOOL terminate +1 CARD8 band-number +GetClientData reply +# of Bytes Value Description +1 1 reply +1 ExportState new-state +2 CARD16 sequence number +4 (n+p)/4 reply length +4 n byte-count (length of data in bytes) +20 unused +n LISTofCARD8 data +p unused, p=pad(n) +QueryPhotoflo request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 24 XIE minor opcode +2 3 request length +8 Executable instance +QueryPhotoflo reply +# of Bytes Value Description +1 1 reply +1 PhotofloState state +2 CARD16 sequence number +4 (e+a)/2+(ep+ap)/4 reply length +2 e data-expected count +2 a data-available count +20 unused +2e LISTofPhototag data-expected +ep unused, ep=pad(e) +2a LISTofPhototag data-available +ap unused, ap=pad(a) +Await request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 25 XIE minor opcode +2 3 request length +8 Executable instance +Abort request +# of Bytes Value Description +1 CARD8 XIE major opcode +1 26 XIE minor opcode +2 3 request length +8 Executable instance + +Import Elements +ImportClientLUT +# of Bytes Value Description +2 1 element type +2 8 element length +1 DataClass class +1 Orientation band-order +2 unused +12 TripletofCARD32 length +12 Levels levels +ImportClientPhoto +# of Bytes Value Description +2 2 element type +2 12+n element length +1 BOOL notify +1 DataClass class +2 unused +12 TripletofCARD32 width +12 TripletofCARD32 height +12 Levels levels +2 DecodeTechnique decode +2 n length of decode-params +4n decode-params +ImportClientROI +# of Bytes Value Description +2 3 element type +2 2 element length +4 CARD32 rectangles +ImportDrawable +# of Bytes Value Description +2 4 element type +2 6 element length +4 DRAWABLE drawable +2 INT16 src-x +2 INT16 src-y +2 CARD16 width +2 CARD16 height +4 CARD32 fill +1 BOOL notify +3 unused +ImportDrawablePlane +# of Bytes Value Description +2 5 element type +2 7 element length +4 DRAWABLE drawable +2 INT16 src-x +2 INT16 src-y +2 CARD16 width +2 CARD16 height +4 CARD32 fill +4 CARD32 bit-plane +1 BOOL notify +3 unused +ImportLUT +# of Bytes Value Description +2 6 element type +2 2 element length +4 LUT lut +ImportPhotomap +# of Bytes Value Description +2 7 element type +2 3 element length +4 Photomap photomap +1 BOOL notify +3 unused +ImportROI +# of Bytes Value Description +2 8 element type +2 2 element length +4 ROI roi + +Process Elements +Arithmetic +# of Bytes Value Description +2 9 element type +2 8 element length +2 Phototag src-1 +2 Phototag src-2 +10 ProcessDomain domain +1 ArithmeticOp operator +1 CARD8 band-mask +12 Constant constant +BandCombine +# of Bytes Value Description +2 10 element type +2 3 element length +2 Phototag src-1 +2 Phototag src-2 +2 Phototag src-3 +2 unused +BandExtract +# of Bytes Value Description +2 11 element type +2 7 element length +2 Phototag src +2 unused +4 CARD32 levels +4 Float bias +12 Constant coefficients +BandSelect +# of Bytes Value Description +2 12 element type +2 2 element length +2 Phototag src +1 CARD8 band-number +1 unused +Blend +# of Bytes Value Description +2 13 element type +2 10 element length +2 Phototag src-1 +2 Phototag src-2 +2 Phototag alpha +2 unused +10 ProcessDomain domain +1 CARD8 band-mask +1 unused +12 Constant constant +4 Float alpha-const +Compare +# of Bytes Value Description +2 14 element type +2 9 element length +2 Phototag src-1 +2 Phototag src-2 +10 ProcessDomain domain +1 CompareOp operator +1 BOOL combine +12 Constant constant +1 CARD8 band-mask +3 unused +Constrain +# of Bytes Value Description +2 15 element type +2 6+n element length +2 Phototag src +2 unused +12 Levels levels +2 ConstrainTechnique constrain +2 n length of constrain-params +4n constrain-params +ConvertFromIndex +# of Bytes Value Description +2 16 element type +2 3 element length +2 Phototag src +1 DataClass class +1 CARD8 precision (valid range 1..16) +4 COLORMAP colormap +ConvertFromRGB +# of Bytes Value Description +2 17 element type +2 3+n element length +2 Phototag src +2 unused +2 ConvertFromRGBTechnique convert +2 n length of convert-params +4n convert-params +ConvertToIndex +# of Bytes Value Description +2 18 element type +2 5+n element length +2 Phototag src +1 BOOL notify +1 unused +4 COLORMAP colormap +4 ColorList color-list +2 ColorAllocTechnique color-alloc +2 n length of color-alloc-params +4n color-alloc-params +ConvertToRGB +# of Bytes Value Description +2 19 element type +2 3+n element length +2 Phototag src +2 unused +2 ConvertToRGBTechnique convert +2 n length of convert-params +4n convert-params +Convolve +# of Bytes Value Description +2 20 element type +2 6+n2+m element length +2 Phototag src +2 unused +10 ProcessDomain domain +1 CARD8 band-mask +1 n kernel-size +2 ConvolveTechnique convolve +2 m length of convolve-params +4n2 LISTofFloat kernel +4m convolve-params +Dither +# of Bytes Value Description +2 21 element type +2 6+n element length +2 Phototag src +1 CARD8 band-mask +1 unused +12 Levels levels +2 DitherTechnique dither +2 n length of dither-params +4n dither-params +Geometry +# of Bytes Value Description +2 22 element type +2 14+n element length +2 Phototag src +1 CARD8 band-mask +1 unused +4 CARD32 width +4 CARD32 height +4 Float coefficients: a +4 Float coefficients: b +4 Float coefficients: c +4 Float coefficients: d +4 Float coefficients: tx +4 Float coefficients: ty +12 Constant constant +2 GeometryTechnique sample +2 n length of sample-params +4n sample-params +Logical +# of Bytes Value Description +2 23 element type +2 8 element length +2 Phototag src-1 +2 Phototag src-2 +10 ProcessDomain domain +1 GCfunction* operator +1 CARD8 band-mask +12 Constant constant +(* see note on page 7-20) +MatchHistogram +# of Bytes Value Description +2 24 element type +2 6+n element length +2 Phototag src +2 unused +10 ProcessDomain domain +2 unused +2 HistogramShape shape +2 n length of shape-params +4n shape-params +Math +# of Bytes Value Description +2 25 element type +2 5 element length +2 Phototag src +2 unused +10 ProcessDomain domain +1 MathOp operator +1 CARD8 band-mask +PasteUp +# of Bytes Value Description +2 26 element type +2 7+3n element length +2 n number of tiles +2 unused +4 CARD32 width +4 CARD32 height +12 Constant constant +12n LISTofTile tiles +Point +# of Bytes Value Description +2 27 element type +2 5 element length +2 Phototag src +2 Phototag lut +10 ProcessDomain domain +1 CARD8 band-mask +1 unused +Unconstrain +# of Bytes Value Description +2 28 element type +2 2 element length +2 Phototag src +2 unused + +Export Elements +ExportClientHistogram +# of Bytes Value Description +2 29 element type +2 5 element length +2 Phototag src +1 ExportNotify notify +1 unused +10 ProcessDomain domain +2 unused +ExportClientLUT +# of Bytes Value Description +2 30 element type +2 8 element length +2 Phototag src +1 ExportNotify notify +1 Orientation band-order +12 TripletofCARD32 start +12 TripletofCARD32 length +ExportClientPhoto +# of Bytes Value Description +2 31 element type +2 3+n element length +2 Phototag src +1 ExportNotify notify +1 unused +2 EncodeTechnique encode (any except Encode_ServerChoice) +2 n length of encode-params +4n encode-params +ExportClientROI +# of Bytes Value Description +2 32 element type +2 2 element length +2 Phototag src +1 ExportNotify notify +1 unused +ExportDrawable +# of Bytes Value Description +2 33 element type +2 5 element length +2 Phototag src +2 INT16 dst-x +2 INT16 dst-y +2 unused +4 DRAWABLE drawable +4 GCONTEXT gc +ExportDrawablePlane +# of Bytes Value Description +2 34 element type +2 5 element length +2 Phototag src +2 INT16 dst-x +2 INT16 dst-y +2 unused +4 DRAWABLE drawable +4 GCONTEXT gc +ExportLUT +# of Bytes Value Description +2 35 element type +2 6 element length +2 Phototag src +1 BOOL merge +1 unused +4 LUT lut +12 TripletofCARD32 start +ExportPhotomap +# of Bytes Value Description +2 36 element type +2 4+n element length +2 Phototag src +2 unused +4 Photomap photomap +2 EncodeTechnique encode +2 n length of encode-params +4n encode-params +ExportROI +# of Bytes Value Description +2 37 element type +2 3 element length +2 Phototag src +2 unused +4 ROI roi + +Technique Parameters +ColorAlloc +Default +# of Bytes Value Description +0 +AllocAll +# of Bytes Value Description +4 CARD32 fill +Match +# of Bytes Value Description +4 Float match-limit +4 Float gray-limit +Requantize +# of Bytes Value Description +4 CARD32 max-cells +Constrain +ClipScale +# of Bytes Value Description +12 Constant input-low +12 Constant input-high +12 Levels output-low +12 Levels output - high +HardClip +# of Bytes Value Description +0 +ConvertFromRGB +CIELab +# of Bytes Value Description +36 Matrix matrix +2 WhiteAdjustTechnique white-adjust +2 w length of white-params +4w white-params +CIEXYZ +# of Bytes Value Description +36 Matrix matrix +2 WhiteAdjustTechnique white-adjust +2 w length of white-params +4w white-params +YCbCr +# of Bytes Value Description +12 Levels levels +12 Constant luma { red, green, blue } +12 Constant bias +YCC +# of Bytes Value Description +12 Levels levels +12 Constant luma { red, green, blue } +4 Float scale +ConvertToRGB +CIELab +# of Bytes Value Description +36 Matrix matrix +2 WhiteAdjustTechnique white-adjust +2 w length of white-params +2 GamutTechnique gamut-compress +2 g length of gamut-params +4w white-params +4g gamut-params +CIEXYZ +# of Bytes Value Description +36 Matrix matrix +2 WhiteAdjustTechnique white-adjust +2 w length of white-params +2 GamutTechnique gamut-compress +2 g length of gamut-params +4w white-params +4g gamut-params +YCbCr +# of Bytes Value Description +12 Levels levels +12 Constant luma { red, green, blue } +12 Constant bias +2 GamutTechnique gamut-compress +2 g length of gamut-params +4g gamut-params +YCC +# of Bytes Value Description +12 Levels levels +12 Constant luma { red, green, blue } +4 Float scale +2 GamutTechnique gamut-compress +2 g length of gamut-params +4g gamut-params +Convolve +Default +# of Bytes Value Description +0 +Constant +# of Bytes Value Description +12 Constant constant +Replicate +# of Bytes Value Description +0 +Decode +UncompressedSingle +# of Bytes Value Description +1 Orientation fill-order +1 Orientation pixel-order +1 CARD8 pixel-stride +1 CARD8 left-pad +1 CARD8 scanline-pad +3 unused +UncompressedTriple +# of Bytes Value Description +3 TripletofCARD8 left-pad +1 Orientation fill-order +3 TripletofCARD8 pixel-stride +1 Orientation pixel-order +3 TripletofCARD8 scanline-pad +1 Orientation band-order +1 Interleave interleave +3 unused +CITT-G31D +# of Bytes Value Description +1 Orientation encoded-order +1 BOOL normal +1 BOOL radiometric +1 unused +CCITT-G32D +# of Bytes Value Description +1 Orientation encoded-order +1 BOOL normal +1 BOOL radiometric +1 unused +CCITT-G42D +# of Bytes Value Description +1 Orientation encoded-order +1 BOOL normal +1 BOOL radiometric +1 unused +JPEG-Baseline +# of Bytes Value Description +1 Interleave interleave +1 Orientation band-order +1 BOOL up-sample +1 unused +JPEG-Lossless +# of Bytes Value Description +1 Interleave interleave +1 Orientation band-order +2 unused +TIFF-2 +# of Bytes Value Description +1 Orientation encoded-order +1 BOOL normal +1 BOOL radiometric +1 unused +TIFF-PackBits +# of Bytes Value Description +1 Orientation encoded-order +1 BOOL normal +2 unused +Dither +Default +# of Bytes Value Description +0 +ErrorDiffusion +# of Bytes Value Description +0 +Ordered +# of Bytes Value Description +1 CARD8 threshold-order +3 unused +Encode +ServerChoice +# of Bytes Value Description +1 CARD8 preference: + 0 PreferDefault + 1 PreferSpace + 2 PreferTime +3 unused +UncompressedSingle +# of Bytes Value Description +1 Orientation fill-order +1 Orientation pixel-order +1 CARD8 pixel-stride +1 CARD8 scanline-pad +UncompressedTriple +# of Bytes Value Description +3 TripletofCARD8 pixel-stride +1 Orientation pixel-order +3 TripletofCARD8 scanline-pad +1 Orientation fill-order +1 Orientation band-order +1 Interleave interleave +2 unused +CCITT-G31D +# of Bytes Value Description +1 Orientation encoded-order +1 BOOL align-eol +1 BOOL radiometric +1 unused +CCITT-G32D +# of Bytes Value Description +1 Orientation encoded-order +1 BOOL align-eol +1 BOOL radiometric +1 BOOL uncompressed +4 CARD32 k-factor +CCITT-G42D +# of Bytes Value Description +1 Orientation encoded-order +1 BOOL radiometric +1 BOOL uncompressed +1 unused +JPEG-Baseline +# of Bytes Value Description +1 Interleave interleave +1 Orientation band-order +3 TripletofCARD8 horizontal-samples[0..2] +3 TripletofCARD8 vertical-samples[0..2] +2 q length of q-table (multiple of 4) +2 a length of ac-table (multiple of 4) +2 d length of dc-table (multiple of 4) +2 unused +q LISTofCARD8 q-table +a LISTofCARD8 ac-table +d LISTofCARD8 dc-table +JPEG-Lossless +# of Bytes Value Description +1 Interleave interleave +1 Orientation band-order +2 t length of table (multiple of 4) +3 TripletofCARD8 predictor[0..2]: + 0 PredictorNone + 1 PredictorA + 2 PredictorB + 3 PredictorC + 4 PredictorABC + 5 PredictorABC2 + 6 PredictorBAC2 + 7 PredictorAB2 +1 unused +t LISTofCARD8 table +TIFF-2 +# of Bytes Value Description +1 Orientation encoded-order +1 BOOL radiometric +2 unused +TIFF-PackBits +# of Bytes Value Description +1 Orientation encoded-order +3 unused +Gamut +Default +# of Bytes Value Description +0 +None +# of Bytes Value Description +0 +ClipRGB +# of Bytes Value Description +0 +Geometry +Default +# of Bytes Value Description +0 +Antialias +# of Bytes Value Description +0 +AntialiasByArea +# of Bytes Value Description +2 INT16 simple +2 unused +AntialiasByLowpass +# of Bytes Value Description +2 INT16 kernel-size +2 unused +BilinearInterpolation +# of Bytes Value Description +0 +Gaussian +# of Bytes Value Description +1 CARD8 radius +1 BOOL simple +2 unused +4 Float sigma +4 Float normalize +NearestNeighbor +# of Bytes Value Description +1 CARD8 modify: + 1 FavorDown + 2 FavorUp + 3 RoundNW + 4 RoundNE + 5 RoundSE + 6 RoundSW +3 unused +Histogram +Flat +# of Bytes Value Description +0 +Gaussian +# of Bytes Value Description +4 Float mean +4 Float sigma +Hyperbolic +# of Bytes Value Description +1 BOOL shape-factor +3 unused +4 Float constant +WhiteAdjust +Default +# of Bytes Value Description +0 +None +# of Bytes Value Description +0 +CIELabShift +# of Bytes Value Description +12 Constant white-point + +Events +ColorAlloc +# of Bytes Value Description +1 0 XIE event code: ColorAlloc +1 unused +2 CARD16 sequence-number +4 TIMESTAMP time +8 Executable instance +2 Phototag src +2 type: + 18 ConvertToIndex +4 ColorList color-list +2 ColorAllocTechnique color-alloc technique +2 unused +4 CARD32 color-alloc specific data +DecodeNotify +# of Bytes Value Description +1 1 XIE event code: DecodeNotify +1 CARD8 band-number +2 CARD16 sequence-number +4 TIMESTAMP time +8 Executable instance +2 Phototag src +2 type: + 2 ImportClientPhoto + 7 ImportPhotomap +2 DecodeTechnique decode technique +1 BOOL aborted +1 unused +4 CARD32 data-width +4 CARD32 data-height +ExportAvailable +# of Bytes Value Description +1 2 XIE event code: ExportAvailable +1 CARD8 band-number +2 CARD16 sequence-number +4 TIMESTAMP time +8 Executable instance +2 Phototag src +2 type: + 29 ExportClientHistogram + 30 ExportClientLUT + 31 ExportClientPhoto + 32 ExportClientROI +12 TripletofCARD32 data[0..2] +ImportObscured +# of Bytes Value Description +1 3 XIE event code: ImportObscured +1 unused +2 CARD16 sequence-number +4 TIMESTAMP time +8 Executable instance +2 Phototag src +2 type: + 4 ImportDrawable + 5 ImportDrawablePlane +4 WINDOW window +2 INT16 x +2 INT16 y +2 CARD16 width +2 CARD16 height +PhotofloDone +# of Bytes Value Description +1 4 XIE event code: PhotofloDone +1 PhotofloOutcome outcome +2 CARD16 sequence-number +4 TIMESTAMP time +8 Executable instance +16 unused + +Errors +ColorList +# of Bytes Value Description +1 0 Error +1 0 XIE error code: ColorList +2 CARD16 sequence-number +4 ColorList color-list id +2 CARD16 minor-opcode +1 CARD8 major-opcode +21 unused +LUT +# of Bytes Value Description +1 0 Error +1 1 XIE error code: LUT +2 CARD16 sequence-number +4 LUT lut id +2 CARD16 minor-opcode +1 CARD8 major-opcode +21 unused +Photoflo +# of Bytes Value Description +1 0 Error +1 2 XIE error code: Photoflo +2 CARD16 sequence-number +4 Photoflo photoflo id +2 CARD16 minor-opcode +1 CARD8 major-opcode +21 unused +Photomap +# of Bytes Value Description +1 0 Error +1 3 XIE error code: Photomap +2 CARD16 sequence-number +4 Photomap photomap id +2 CARD16 minor-opcode +1 CARD8 major-opcode +21 unused +Photospace +# of Bytes Value Description +1 0 Error +1 4 XIE error code: Photospace +2 CARD16 sequence-number +4 Photospace photospace id +2 CARD16 minor-opcode +1 CARD8 major-opcode +21 unused +ROI +# of Bytes Value Description +1 0 Error +1 5 XIE error code: ROI +2 CARD16 sequence-number +4 ROI roi id +2 CARD16 minor-opcode +1 CARD8 major-opcode +21 unused +FloAccess +# of Bytes Value Description +1 0 Error +1 6 XIE error code: Flo... +2 CARD16 sequence-number +4 CARD32 executable flo-id +2 CARD16 minor-opcode +1 CARD8 major-opcode +1 1 flo-error-code: FloAccess +4 CARD32 executable name-space +2 Phototag phototag +2 CARD16 type +12 unused +FloAlloc +# of Bytes Value Description +1 0 Error +1 6 XIE error code: Flo... +2 CARD16 sequence-number +4 CARD32 executable flo-id +2 CARD16 minor-opcode +1 CARD8 major-opcode +1 2 flo-error-code: FloAlloc +4 CARD32 executable name-space +2 Phototag phototag +2 CARD16 type +12 unused +FloColormap +# of Bytes Value Description +1 0 Error +1 6 XIE error code: Flo... +2 CARD16 sequence-number +4 CARD32 executable flo-id +2 CARD16 minor-opcode +1 CARD8 major-opcode +1 3 flo-error-code: FloColormap +4 CARD32 executable name-space +2 Phototag phototag +2 CARD16 type +4 COLORMAP colormap id +8 unused +FloColorList +# of Bytes Value Description +1 0 Error +1 6 XIE error code: Flo... +2 CARD16 sequence-number +4 CARD32 executable flo-id +2 CARD16 minor-opcode +1 CARD8 major-opcode +1 4 flo-error-code: FloColorList +4 CARD32 executable name-space +2 Phototag phototag +2 CARD16 type +4 ColorList color-list id +8 unused +FloDomain +# of Bytes Value Description +1 0 Error +1 6 XIE error code: Flo... +2 CARD16 sequence-number +4 CARD32 executable flo-id +2 CARD16 minor-opcode +1 CARD8 major-opcode +1 5 flo-error-code: FloDomain +4 CARD32 executable name-space +2 Phototag phototag +2 CARD16 type +2 Phototag domain source +10 unused +FloDrawable +# of Bytes Value Description +1 0 Error +1 6 XIE error code: Flo... +2 CARD16 sequence-number +4 CARD32 executable flo-id +2 CARD16 minor-opcode +1 CARD8 major-opcode +1 6 flo-error-code: FloDrawable +4 CARD32 executable name-space +2 Phototag phototag +2 CARD16 type +4 DRAWABLE drawable id +8 unused +FloElement +# of Bytes Value Description +1 0 Error +1 6 XIE error code: Flo... +2 CARD16 sequence-number +4 CARD32 executable flo-id +2 CARD16 minor-opcode +1 CARD8 major-opcode +1 7 flo-error-code: FloElement +4 CARD32 executable name-space +2 Phototag phototag +2 CARD16 type +12 unused +FloGC +# of Bytes Value Description +1 0 Error +1 6 XIE error code: Flo... +2 CARD16 sequence-number +4 CARD32 executable flo-id +2 CARD16 minor-opcode +1 CARD8 major-opcode +1 8 flo-error-code: FloGC +4 CARD32 executable name-space +2 Phototag phototag +2 CARD16 type +4 GCONTEXT gc id +8 unused +FloID +# of Bytes Value Description +1 0 Error +1 6 XIE error code: Flo... +2 CARD16 sequence-number +4 CARD32 executable flo-id +2 CARD16 minor-opcode +1 CARD8 major-opcode +1 9 flo-error-code: FloID +4 CARD32 executable name-space +16 unused +FloLength +# of Bytes Value Description +1 0 Error +1 6 XIE error code: Flo... +2 CARD16 sequence-number +4 CARD32 executable flo-id +2 CARD16 minor-opcode +1 CARD8 major-opcode +1 10 flo-error-code: FloLength +4 CARD32 executable name-space +2 Phototag phototag +2 CARD16 type +12 unused +FloLUT +# of Bytes Value Description +1 0 Error +1 6 XIE error code: Flo... +2 CARD16 sequence-number +4 CARD32 executable flo-id +2 CARD16 minor-opcode +1 CARD8 major-opcode +1 11 flo-error-code: FloLUT +4 CARD32 executable name-space +2 Phototag phototag +2 CARD16 type +4 LUT lut id +8 unused +FloMatch +# of Bytes Value Description +1 0 Error +1 6 XIE error code: Flo... +2 CARD16 sequence-number +4 CARD32 executable flo-id +2 CARD16 minor-opcode +1 CARD8 major-opcode +1 12 flo-error-code: FloMatch +4 CARD32 executable name-space +2 Phototag phototag +2 CARD16 type +12 unused +FloOperator +# of Bytes Value Description +1 0 Error +1 6 XIE error code: Flo... +2 CARD16 sequence-number +4 CARD32 executable flo-id +2 CARD16 minor-opcode +1 CARD8 major-opcode +1 13 flo-error-code: FloOperator +4 CARD32 executable name-space +2 Phototag phototag +2 CARD16 type +1 CARD8 operator +11 unused +FloPhotomap +# of Bytes Value Description +1 0 Error +1 6 XIE error code: Flo... +2 CARD16 sequence-number +4 CARD32 executable flo-id +2 CARD16 minor-opcode +1 CARD8 major-opcode +1 14 flo-error-code: FloPhotomap +4 CARD32 executable name-space +2 Phototag phototag +2 CARD16 type +4 Photomap photomap id +8 unused +FloROI +# of Bytes Value Description +1 0 Error +1 6 XIE error code: Flo... +2 CARD16 sequence-number +4 CARD32 executable flo-id +2 CARD16 minor-opcode +1 CARD8 major-opcode +1 15 flo-error-code: FloROI +4 CARD32 executable name-space +2 Phototag phototag +2 CARD16 type +4 ROI roi id +8 unused +FloSource +# of Bytes Value Description +1 0 Error +1 6 XIE error code: Flo... +2 CARD16 sequence-number +4 CARD32 executable flo-id +2 CARD16 minor-opcode +1 CARD8 major-opcode +1 16 flo-error-code: FloSource +4 CARD32 executable name-space +2 Phototag phototag +2 CARD16 type +12 unused +FloTechnique +# of Bytes Value Description +1 0 Error +1 6 XIE error code: Flo... +2 CARD16 sequence-number +4 CARD32 executable flo-id +2 CARD16 minor-opcode +1 CARD8 major-opcode +1 17 flo-error-code: FloTechnique +4 CARD32 executable name-space +2 Phototag phototag +2 CARD16 type +2 CARD16 technique-number +2 CARD16 length of tech-params that were supplied +1 TechniqueGroup technique-group +7 unused +FloValue +# of Bytes Value Description +1 0 Error +1 6 XIE error code: Flo... +2 CARD16 sequence-number +4 CARD32 executable flo-id +2 CARD16 minor-opcode +1 CARD8 major-opcode +1 18 flo-error-code: FloValue +4 CARD32 executable name-space +2 Phototag phototag +2 CARD16 type +4 <32-bits> bad-value +8 unused +FloImplementation +# of Bytes Value Description +1 0 Error +1 6 XIE error code: Flo... +2 CARD16 sequence-number +4 CARD32 executable flo-id +2 CARD16 minor-opcode +1 CARD8 major-opcode +1 19 flo-error-code: FloImplementation +4 CARD32 executable name-space +2 Phototag phototag +2 CARD16 type +12 unused + +Protocol Endings C-40 + + diff --git a/xie/docs/dec/overview_xie.TXT b/xie/docs/dec/overview_xie.TXT new file mode 100644 index 0000000..aed8d4e --- /dev/null +++ b/xie/docs/dec/overview_xie.TXT @@ -0,0 +1,354 @@ +X Image Extension Overview +J. Ben Fahy, Ph.D. + + +& +Robert N.C. Shelley + +Abstract +The X Image Extension provides a powerful mechanism for the transfer and display of +virtually any image on any X-capable hardware. While not intended for use as a general +purpose image-processing engine, XIE does provide a robust set of image rendition and +enhancement primitives that can be combined into arbitrarily complex expressions. XIE +also provides import and export facilities for moving images between client and server +or core X and XIE and for accessing images as resources. + XIE Design Goals +The X Image Extension (XIE) was designed to facilitate efficient and robust image display on X Window +System servers. XIE provides tools for rapidly transferring an image from client to server and for con- +verting the image format to match the server's hardware characteristics. XIE does not attempt to provide +tools for general-purpose image processing. However, simple image enhancement and filtering operations +such as contrast enhancement and convolution are available, as well as dithering, geometric transforma- +tions, histogram generation, and so on. +The X Window client-server architecture was based on the assumption that data on the wire would be of a +relatively high level. Therefore, a high-bandwidth connection is not an absolute requirement for X. How- +ever, image transfer requires sending large amounts of low-level data, which may take an unacceptable +amount of time on slow or heavily loaded networks. This image transport bottleneck makes the X Window +System less than optimal for supporting image-intensive applications. +XIE solves the image transport problem by supporting the transmission of compressed images across the +wire and providing image decompression facilities in the server. Compression ratios on the order of 20:1 +or more are common for bitonal images. The client can send a relatively modest amount of data to the +server where it is decompressed into a much larger data structure. Since the image may not fit completely +on the server's display monitor at full resolution, XIE supports geometric operations, such as scale and +rotation, to allow an image to be transformed to fit in a reasonable window size as is depicted in Figure 1. +Rendition in XIE is defined as the process of changing the format of an image in order to make it com- +patible with the server's frame buffer, its associated lookup table(s), and other limitations. Once an image +has been rendered, it may be transferred directly to the hardware and viewed on the screen. Rendering a +complicated image to be compatible with highly limited hardware can be quite challenging and may re- +quire a series of manipulations to be performed on the image. It may be necessary to convert the image +from trichromatic to monochromatic (gray scale or bitonal). A scaling operation can be used to reduce the +image's size to fit the screen dimensions. Convolution provides a means for sharpening the image or per- +forming other general filtering operations. Dithering may be used to reduce the number of quantization +levels to comply with the number of colormap entries available, and so on. + + +Figure 1. Compressed transport from client to server, followed by decompression, scaling, and display. +The primitives of XIE that are needed to support image transfer and rendition define a new class of virtual +display hardware. In some cases, it may be possible for server implementors to map these functions di- +rectly onto physical hardware accelerators. For example, the Convolution operator in XIE might be im- +plemented directly using a convolution board or chip. Providing a vehicle for hardware vendors to up- +grade the performance of X servers for image-specific operations was an explicit design goal of XIE. +To summarize the main goals of XIE: +* Display any image on any server +* Reduce the time it takes to move images from client to server +* Support the development and utilization of image-specific hardware +* Do not cover all of image processing + XIE Historical Summary +The XIE project was initiated in 1988 by Joe Mauro of Digital Equipment Corporation. The first formal +proposal was submitted to the X Consortium in 1990. At that time, it was voted not to proceed to technical +review, because of a lack of sufficient resources to review the proposal. Digital continued to work with +interested Consortium members in revising the protocol and produced a portable sample implementation +of XIE (Version 3) to demonstrate proof of concept. In March 1991, XIE was officially moved into tech- +nical review. After more than a year and a half of discussion by many interested companies, a substantially +modified XIE (version 4) was promoted from technical review to public review at the end of 1992. In +January 1993 AGE Logic was contracted to produce a new sample implementation that was completed in +January 1994. Several more enhancements were made to the protocol during the public review and sample +implementation period; the final release of the XIE-SI was version 5. The major changes to the XIE pro- +tocol between versions 3 and 5 included: +* More direct control over server behavior given to the client +* Generalization and refinement of the computational model +* Elements that do not perform implicit data type conversions +* Tools for creating a processing engine moved to the client side +* Unification of all geometric operators into a single transformation +* Enhanced support for color spaces and color operations +* Cleaner interface to Core X +* Support for more compression techniques +* Identification of a Document Imaging Subset +XIE Architecture +The image extension is designed to add new functionality to X, but, at the same time, it avoids making +any fundamental changes to the X architecture. XIE receives requests and sends errors, replies, and events +through the standard mechanisms defined for extensions. XIE resources must be registered with the Core +X resource manager so that at client shutdown all XIE resources can be cleanly deallocated. All data in +and out of XIE must pass through X, either by the standard extension mechanism or by explicit import +and export. Note in Figure 2 that all utilization of resources in XIE must go through a Photoflo Manager. +Data is imported into the Photoflo Manager and exported out from it. The Photoflo Manager, which also +runs the computational engine of XIE, is discussed in the next section. + + + +Figure 2. High-level view of an X server containing XIE support. + + XIE's Computational Model +Typical XIE processing employs a sequence of operations. For example: +* Transport an image from client to server +* Decompress the image +* Scale the image +* Render and enhance the image +* Display (export image data to a Core X drawable) + +A client could ask the server to perform each of these operations one step at a time send the complete +image to the server, then decompress it, then scale it, and so on, and finally display the result. One disad- +vantage of this approach is that the user may have to wait a long time before seeing the image on the +screen. Furthermore, the memory requirements of holding the full decompressed image in the server may +be severe. The necessity of producing full intermediate images between steps further aggravates this situa- +tion. Consider the simple sequence of operations {transfer image, decompress, scale, export to X} that is +depicted in Figure 3: + +Figure 3. Processing each step completely before moving data to the next element in + the sequence requires allocating a large amount of buffer space in the server. +When the image is processed one step at a time, large buffers must be allocated to hold the decompressed +image in the server. This may require more memory than is available in the server, in which case XIE +would have to return an allocation error, thereby preventing the user from viewing the image. +Suppose instead that the client could specify all operations in the sequence to the server at once. The +server could then choose to perform only part of each operation before passing the output data to the next +processing step in the sequence. For example, it might decompress half of the incoming image, scale that +half, and export it to Core X. At that point the user would see the top of the image displayed on the screen +(Figure 4): + + +Figure 4. Processing only half of each step before moving data to the next element. +After the top half of the image has been displayed, the server could decompress the remainder of the im- +age, scale it, and export the result to Core X, thus completing the display of the whole image (Figure 5). +Two benefits have been realized. First, the user was able to see something appear on the screen in roughly +half the time. Second, the server did not have to allocate as much buffer space. In fact, the amount of +buffer space required will be inversely proportional to the number of steps into which the process is subdi- +vided (until some minimum level is reached). + + +Figure 5. Processing the second half of each step. +In XIE, the ability to define a sequence of operations to be performed is referred to as constructing a Pho- +toflo. Photoflos are so named because the image data (sometimes photographic) is viewed as flowing +through the sequence of elements. The Photoflo Manager depicted in Figure 2 obtains data via import +elements, processes the data using process elements, and outputs the final result via export elements. A +Photoflo for the sequence just discussed would look like: + + + +No explicit decompression step is required. The Import element describes the format of the data to be +transferred, and the server knows it must implicitly decompress the image data prior to passing it to the +Geometry element. Similarly, the client may specify that an image is to be compressed before it is stored +in a Photomap or returned to the client. +Photoflos do not have to be linear. The client is allowed to construct any Directed Acyclic Graph (DAG) +as long as the way the elements are connected makes sense. For example, the Photoflo in Figure 6 com- +putes an unsharp masked enhancement of the input image by first blurring a subregion of the image, using +a convolution operation, and then adding the difference to the original image: + + +Figure 6. Photoflo to compute unsharp masked enhancement with rectangles of interest. +The client can specify this DAG to the server all at once, with either CreatePhotoflo (to create a perma- +nent Photoflo that can be reused) or ExecuteImmediate (to create a temporary Photoflo that will be de- +stroyed immediately upon completion). The Photoflo Manager creates the Photoflo and then waits for +further instruction. Once the Photoflo is activated (performed by ExecutePhotoflo for permanent Photo- +flos, or performed implicitly for temporary Photoflos), the Photoflo Manager will asynchronously execute +the Photoflo, processing input as it becomes available. The client pushes data into the Photoflo by using a +PutClientData request, specifying the Photoflo and the appropriate Import element. The client reads data +out of the Photoflo by sending a GetClientData request, specifying the Photoflo and the appropriate Ex- +port element. It is not unusual for the Photoflo to block further processing pending either additional input +from the client or retrieval of available data by the client. +Several operations in XIE permit control over the image processing domain by specifying a control-plane +or a set of rectangles-of-interest (ROI). This allows portions of the image to be included or excluded from +the rendition or enhancement operation. In Figure 6, the Convolve operation is restricted to a subset of the +pixels in the image by importing a set of ROI)s to modify the processing domain of the Convolve element. +Pixels that fall within the area described by the set of rectangles are processed; those which do not are +passed through unchanged. This allows the user to reduce the computation time in areas of the image that +are not interesting. + XIE Resources +XIE defines six permanent resources that can be created and destroyed: ColorLists, LUTs, Photoflos, +Photomaps, Photospaces, and ROIs. Some of these have already been introduced. +A Photoflo is a computational engine that the client specifies using either a CreatePhotoflo or an Exe- +cuteImmediate request. A Photoflo created by CreatePhotoflo is considered permanent and exists until +an explicit DestroyPhotoflo request or client shutdown. The resource ID specified at Photoflo creation +time is a normal core X resource ID. A Photoflo created by ExecuteImmediate is a temporary resource +that is created in a separate resource ID space, called a Photospace. Before creating the first temporary +Photoflo, a Photospace must be created to hold it using the CreatePhotospace request. If this Photospace +is destroyed, all Photoflos in the space are immediately destroyed along with it. +LUTs, ROIs, and Photomaps are used as Photoflo inputs by using ImportLUT, ImportROI, and Import- +Photomap elements, respectively. A Photomap is a handle for image data stored in the server. Photomaps +are created with no attributes: they inherit data and descriptive information from ExportPhotomap ele- +ments in Photoflos. The attributes of a Photomap may be queried by using the QueryPhotomap request. A +LUT is a handle for lookup table data for the Point operation. A LUT resource receives data and attributes +from an ExportLUT element in a Photoflo. A ROI resource is a handle for a set of rectangles-of-interest. It +is populated using the ExportROI element. +ColorLists are used to store colors allocated from a colormap. When a colormap and a color or gray scale +image is passed to the ConvertToIndex element, the colormap identifier and the index of each colormap +cell allocated by ConvertToIndex are stored in the ColorList. The contents of a ColorList can be queried +using the QueryColorList request. + Element Definitions +This section briefly discusses the elements with which one can create computational engines (Photoflos). +The number of individual Photoflo elements listed below is deceptively modest, in that there are many +different ways in which several of the elements could have been specified. For example, in defining a +geometric transformation for an image, it is quite simple to specify the transform in idealized coordinates, +but impossible to choose one optimal resampling method. This is because evaluation of the algorithm's +performance depends on factors that are largely subjective, and processor or data dependent. It is unrea- +sonable to pick a single algorithm for a given element when clearly dozens of other algorithms are avail- +able of equal or better quality. It was decided to build flexibility into XIE's basic element definitions, giv- +ing both server implementors and client writers leeway in selecting the algorithms that best meet their +needs. +The XIE protocol incorporates this flexibility by defining a technique parameter for several of its elements +that acts as a modifier of the those elements behavior. The techniques that are supplied to import and ex- +port elements generally identify image-compression schemes, whereas the techniques specified for proc- +essing elements identify various image-processing algorithms that provide slightly different methods for +doing the same basic operation. In some cases techniques offer a trade-off between execution time and the +fidelity of the results, while in other cases different techniques are desirable because of the image class or +content, or to achieve a special effect. +For some techniques the server implementor is required to provide a default algorithm. This allows an ap- +plication to select an operation in a generic way without concerning itself with the details of the particular +algorithm being used. The protocol document specifies that some techniques must be implemented in all +servers, whereas other techniques are considered optional. The server implementor is also permitted to +extend XIE with additional proprietary techniques as is seen fit. XIE includes a query request to determine +what techniques are supported by a particular implementation and to determine what algorithms are being +used as defaults. + Import Elements +Import elements may be classified according to the source of their data, which must be either the client, +Core X, or XIE resources. +Client Import Elements +ImportClientLut reads in lookup table data from the client. Since the client will send raw data us- +ing PutClientData, this element is used to specify the format of the expected data stream. +ImportClientPhoto reads in image data from the client. Since the client will be sending raw image +data using PutClientData, this element is provided to specify the format of the data stream. A decode +technique, and its associated arguments, are used to specify which compression algorithm has been +applied to the input data. +ImportClientROI used to read in a list of rectangles for process domain control. Since a fixed for- +mat is defined, only the number of rectangles needs to be provided. +Core X Resource Import Elements +ImportDrawable reads in image data from a window or pixmap. +ImportDrawablePlane reads in a selected image bitplane from a window or pixmap. +XIE Resource Import Elements +ImportLUT import existing lookup table data, typically to be used by the Point processing element. +ImportPhotomap import previously stored image data. Since the Photomap maintains the attributes +of the stored image, no decoding parameters are required (as was the case with ImportClientPhoto). +ImportROI import a list of rectangles that was previously stored in the server, typically used for +process domain control. + Process Elements +Processing elements can be roughly grouped by their complexity, functionality, or the aspect of the image +that they work with. One such grouping follows. +Simple Algebraic Processing Elements +Arithmetic allows arithmetic operations, such as addition or subtraction, to be performed between +a pair of images or an image and a constant value. Other operations, such as multiplication or divi- +sion, can only be performed between an image and a constant value. +Blend allows an alpha-blend operation between two images or an image and a constant value. The +weights for the blend operation can be determined by a constant value or on a per-pixel basis through +the use of an alpha-plane. +Compare compares two images or an image and a constant value to produce a bit plane with ones +where the comparison is satisfied. +Logical performs per-pixel bit-wise operations on images, or between an image and a constant. +Math performs mathematical operations, such as square root or natural logarithm, on a single +source image. + +Format Conversion Elements +BandCombine accepts three SingleBand images and merges them to form one TripleBand image. +BandExtract produces a SingleBand image from a TripleBand image by summing a percentage of +the pixel values from each input band with a bias value. +BandSelect selects a single image band from a TripleBand image. +Constrain converts unconstrained pixel values into integer pixel values (certain operations in XIE +can be performed using unconstrained pixel values which are represented within the server as either +floating-point or fixed-point values). +ConvertFromIndex takes a colormap and an image as input and produces a new image whose pixel +values are taken from the colormap. +ConvertFromRGB converts RGB image data to another colorspace. +ConvertToIndex allocates image colors from a colormap or matches colors in the image against +those already existing in the colormap. Each pixel in the output image is the colormap index of the +colormap cell that most closely represents the corresponding input image pixel. The action taken +(allocate, match, and so on) is dependent on the color allocation technique given to ConvertToIndex. +Each colormap cell that is allocated by ConvertToIndex is stored in a ColorList resource. +ConvertToRGB converts non-RGB image data to RGB (from another color space). +Dither reduces the number of quantization levels in an image by spreading the information con- +tained in a pixel over the surrounding area. +Unconstrain converts integer pixel values into unconstrained pixel values (certain operations in +XIE can be performed using unconstrained pixel values which are represented within the server as +either floating-point or fixed-point values.) +Simple Enhancement and Filtering Elements +Convolve performs a convolution on an image; each output pixel is computed from an area of in- +put pixels, as determined by the size and contents of a convolution kernel. +MatchHistogram computes the histogram of the input image and remaps pixel data so as to +match, as closely as possible, the specified histogram shape. +Point applies a lookup table operation to each pixel in the source image. Point is so named because +the output pixel value depends only on the input value at that point. +Domain-Based Operations +Geometry performs a geometric transformation on image data. Special cases include scale, crop, +mirror, shear, rotate, and translate. The operation is specified as a mapping of the coordinates of the +output image back to the coordinate space of the input image. Resampling and anti-aliasing algo- +rithms can be specified by using technique parameters. +PasteUp allows multiple image tiles to be combined into a single image. A tile is an image with +an offset attached that specifies where the tile is to be placed in the output image. Overlapping tiles +are resolved by a defined stacking order. If the tiles do not completely cover the output image, uncov- +ered regions are filled by a constant pixel value. + + Export Elements +As with import elements, export elements may be classified according to the destination of their data, +which must be either the client, Core X, or XIE resources. +Client Export Elements +ExportClientHistogram computes the histogram of an image and makes it available to the client +via the GetClientData request. +ExportClientLUT makes lookup table data available to the client. The client can specify the entire +LUT or a subrange of the LUT. +ExportClientPhoto makes image data available to the client. The client can specify the format it +wants by using an encode technique and its associated parameters. +ExportClientROI makes rectangle-of-interest data available to the client. +Core X Resource Export Elements +ExportDrawable writes image data into a pixmap or window. The client must provide a graphics +context to direct the insertion of data. +ExportDrawablePlane writes a bitonal image into a pixmap or window. A client-specified graphics +context is used to convert the pixels to foreground and background colors and to perform optional +stippling. +XIE Resource Export Elements +ExportLUT exports lookup table data to a LUT resource. ExportLUT obtains its input from a pre- +vious element such as ImportClientLUT or ImportLUT. +ExportPhotomap stores an image in a Photomap resource. Encoding parameters can be supplied to +tell the server what format to store the data in. Alternatively, the client can allow the server to choose +the most efficient format for image storage; the client can hint as to whether image storage space or +image retrieval time is the desired efficiency metric. +ExportROI stores a list of rectangles in an ROI resource. The exported data must come from either +ImportClientROI or ImportROI. +Subsetting +The full XIE protocol defines a very powerful flexible system. It is recognized, however, that many appli- +cation writers will wish to use XIE features to perform relatively simple tasks on simple (for example, bi- +tonal) images. They may never deal with color spaces or processing domains or want to do anything more +complex than simply import, scale, and export. They will be interested in using a server that is tuned spe- +cifically for the needs of document imaging, ignoring all other concerns. In fact, they can do without +many of XIE's capabilities, as long as the server provides the simple operations they require and it obeys +the same protocol as the full XIE specification for those operations. +The XIE Document Imaging Subset (DIS) was designed to respond to this demand. DIS drops the con- +cepts of Color Lists and processing domains completely and supports only two processing elements: Ge- +ometry and Point. Geometry is required in order to do scaling and rotation. Since the DIS client is respon- +sible for managing the colormap, Point is needed to convert pixel values into colormap indexes. +The only required image-compression schemes are those associated with bitonal images. DIS also pro- +vides the ability to import a full-depth drawable, scale it using Geometry, and then export the result back +to Core X. This functionality may be useful for those who want to be able to scale images produced by +other applications. One could imagine using this feature to resize a drawing in order to include it in a +document. +Summary +The X Window System defines a standard architecture that has provided a stable platform-independent +display environment for application developers to build upon. By adhering to the same basic principles, +XIE enhances the image display capabilities of the core protocol by providing: +* Efficient image transport between client and server +* Efficient caching of images on the server +* Image rendition and enhancement capabilities on the server +* Support for the development and utilization of image-specific hardware +* Consistent policy-free support for image display across all platforms + References +1. X Window System, Scheifler, Gettys, Digital Press. +2. X Image Extension Protocol, Shelley et al., Digital Equipment Corporation and AGE Logic, Inc. +3. X Image Extension Library, Rogers AGE Logic, Inc. +4. XIE Sample Implementation Architecture, Shelley, Verheiden & Fahy, AGE Logic, Inc. +5. X Image Extension Overview, Fahy & Shelley, The X Resource Special Issue C, 1/93 +OReilly & Associates, Inc. + + +Copyright © 1994 AGE Logic, Inc. +Permission to use, copy, modify, distribute, and sell this article for any purpose is hereby granted without fee, provided that the above copy- +right notice and this permission notice appear in all copies. AGE Logic, Inc. makes no representations about the suitability for any purpose +of the information in this paper. This material summarizes a standard of the X Consortium and is provided as is without express or im- +plied warranty. +1 + + diff --git a/xie/docs/dec/xie23-src/include/Imakefile b/xie/docs/dec/xie23-src/include/Imakefile new file mode 100644 index 0000000..5419149 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/Imakefile @@ -0,0 +1,71 @@ +XCOMM +XCOMM ***************************************************************** +XCOMM * * +XCOMM * Copyright (c) Digital Equipment Corporation, 1991, 1994 * +XCOMM * * +XCOMM * All Rights Reserved. Unpublished rights reserved under * +XCOMM * the copyright laws of the United States. * +XCOMM * * +XCOMM * The software contained on this media is proprietary to * +XCOMM * and embodies the confidential technology of Digital * +XCOMM * Equipment Corporation. Possession, use, duplication or * +XCOMM * dissemination of the software and media is authorized only * +XCOMM * pursuant to a valid written license from Digital Equipment * +XCOMM * Corporation. * +XCOMM * * +XCOMM * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * +XCOMM * by the U.S. Government is subject to restrictions as set * +XCOMM * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * +XCOMM * or in FAR 52.227-19, as applicable. * +XCOMM * * +XCOMM ***************************************************************** +XCOMM +XCOMM HISTORY +XCOMM +XCOMM $XConsortium: Imakefile,v 1.26 92/01/25 16:33:13 rws Exp $ +#if BuildPexClients || BuildPexExt +#define IHaveSubdirs + PEXDIRS = PEX +#endif +#if BuildLGI +#define IHaveSubdirs + GLDIRS = gl pex +#endif + +#ifdef IHaveSubdirs +#define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' +#endif +#if BuildXTrapExt || BuildXTrapLib + XTRAPHEADERS = xtrapddmi.h xtrapdi.h xtraplib.h xtraplibp.h xtrapproto.h +#else + XTRAPHEADERS = +#endif +#if BuildSMTExt || BuildSMTLib + SMTHEADERS = smt.h smtstr.h +#else + SMTHEADERS = +#endif +#if BuildXieExt || BuildXieLib + XIEHEADERS = XieAppl.h XieFloat.h XieLib.h XieProto.h XieUdpDef.h +#else + XIEHEADERS = +#endif + +SUBDIRS = $(PEXDIRS) $(GLDIRS) + +HEADERS = Xext.h multibuf.h shape.h XShm.h MITMisc.h XI.h XInput.h XIproto.h \ + XTest.h xteststr.h xtestext1.h $(XTRAPHEADERS) $(SMTHEADERS) \ + xkmeproto_include.h multibufst.h +INSTALLFLAGS = $(INSTINCFLAGS) + +all:: + +BuildIncludes($(HEADERS) $(XIEHEADERS),extensions,..) +InstallMultiple($(HEADERS),$(INCDIR)/extensions) + +depend:: + +#ifdef IHaveSubdirs +MakeSubdirs($(SUBDIRS)) +DependSubdirs($(SUBDIRS)) +#endif diff --git a/xie/docs/dec/xie23-src/include/MITMisc.h b/xie/docs/dec/xie23-src/include/MITMisc.h new file mode 100644 index 0000000..8374c32 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/MITMisc.h @@ -0,0 +1,88 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/************************************************************ +Copyright 1989 by The Massachusetts Institute of Technology + +Permission to use, copy, modify, and distribute this +software and its documentation for any purpose and without +fee is hereby granted, provided that the above copyright +no- tice appear in all copies and that both that copyright +no- tice and this permission notice appear in supporting +docu- mentation, and that the name of MIT not be used in +advertising or publicity pertaining to distribution of the +software without specific prior written permission. +M.I.T. makes no representation about the suitability of +this software for any purpose. It is provided "as is" +without any express or implied warranty. + +********************************************************/ + +/* RANDOM CRUFT! THIS HAS NO OFFICIAL X CONSORTIUM BLESSING */ + +/* $XConsortium: MITMisc.h,v 1.4 91/07/12 10:06:43 rws Exp $ */ + +#ifndef _XMITMISC_H_ +#define _XMITMISC_H_ + +#include + +#define X_MITSetBugMode 0 +#define X_MITGetBugMode 1 + +#define MITMiscNumberEvents 0 + +#define MITMiscNumberErrors 0 + +#ifndef _MITMISC_SERVER_ + +_XFUNCPROTOBEGIN + +Bool XMITMiscQueryExtension( +#if NeedFunctionPrototypes + Display* /* dpy */, + int* /* event_basep */, + int* /* error_basep */ +#endif +); + +Status XMITMiscSetBugMode( +#if NeedFunctionPrototypes + Display* /* dpy */, + Bool /* onOff */ +#endif +); + +Bool XMITMiscGetBugMode( +#if NeedFunctionPrototypes + Display* /* dpy */ +#endif +); + +_XFUNCPROTOEND + +#endif + +#endif diff --git a/xie/docs/dec/xie23-src/include/PEX/Imakefile b/xie/docs/dec/xie23-src/include/PEX/Imakefile new file mode 100644 index 0000000..7ae99dd --- /dev/null +++ b/xie/docs/dec/xie23-src/include/PEX/Imakefile @@ -0,0 +1,61 @@ +XCOMM +XCOMM ***************************************************************** +XCOMM * * +XCOMM * Copyright (c) Digital Equipment Corporation, 1991, 1994 * +XCOMM * * +XCOMM * All Rights Reserved. Unpublished rights reserved under * +XCOMM * the copyright laws of the United States. * +XCOMM * * +XCOMM * The software contained on this media is proprietary to * +XCOMM * and embodies the confidential technology of Digital * +XCOMM * Equipment Corporation. Possession, use, duplication or * +XCOMM * dissemination of the software and media is authorized only * +XCOMM * pursuant to a valid written license from Digital Equipment * +XCOMM * Corporation. * +XCOMM * * +XCOMM * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * +XCOMM * by the U.S. Government is subject to restrictions as set * +XCOMM * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * +XCOMM * or in FAR 52.227-19, as applicable. * +XCOMM * * +XCOMM ***************************************************************** +XCOMM +XCOMM HISTORY +XCOMM +XCOMM +XCOMM $XConsortium: Imakefile,v 5.7 91/07/12 17:35:23 rws Exp $ +XCOMM +XCOMM +XCOMM Copyright 1989, 1990, 1991 by Sun Microsystems, Inc. and the X Consortium +XCOMM +XCOMM All Rights Reserved +XCOMM +XCOMM Permission to use, copy, modify, and distribute this software and its +XCOMM documentation for any purpose and without fee is hereby granted, +XCOMM provided that the above copyright notice appear in all copies and that +XCOMM both that copyright notice and this permission notice appear in +XCOMM supporting documentation, and that the names of Sun Microsystems, +XCOMM the X Consortium, and MIT not be used in advertising or publicity +XCOMM pertaining to distribution of the software without specific, written +XCOMM prior permission. +XCOMM +XCOMM SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +XCOMM INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +XCOMM EVENT SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR +XCOMM CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF +XCOMM USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +XCOMM OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +XCOMM PERFORMANCE OF THIS SOFTWARE. + + + HEADERS = PEX.h PEXproto.h PEXErr.h PEXprotost.h + + INSTALLFLAGS = -m 0444 + +all:: + +BuildIncludes($(HEADERS),extensions,..) +InstallMultiple($(HEADERS),$(INCDIR)/extensions) + +depend:: + diff --git a/xie/docs/dec/xie23-src/include/PEX/PEX.h b/xie/docs/dec/xie23-src/include/PEX/PEX.h new file mode 100644 index 0000000..d6c0af9 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/PEX/PEX.h @@ -0,0 +1,946 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* $XConsortium: PEX.h,v 5.3 91/08/26 12:29:34 rws Exp $ */ + +/*********************************************************** +Copyright 1989, 1990, 1991 by Sun Microsystems, Inc. and the X Consortium. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Sun Microsystems, +the X Consortium, and MIT not be used in advertising or publicity +pertaining to distribution of the software without specific, written +prior permission. + +SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT +SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL +DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + + +#ifndef PEX_H +#define PEX_H + +#ifdef LOCAL_PEX_NAME +#define PEX_NAME_STRING LOCAL_PEX_NAME +#else +#define PEX_NAME_STRING "X3D-PEX" +#endif + +/* Matches revision 5.0P */ + +#define PEX_PROTO_MAJOR 5 /* current protocol version */ +#define PEX_PROTO_MINOR 0 /* current minor version */ + +/* Subsets */ +#define PEXCompleteImplementation 0 +#define PEXImmediateModeOnly 1 +#define PEXPhigsWksOnly 2 + +/* Resources */ +#define PEXAlreadyFreed 1 + +/* Asf Attributes */ + +/* Masks for setting Asf's */ +#define PEXMarkerTypeAsf (1L<<0) +#define PEXMarkerScaleAsf (1L<<1) +#define PEXMarkerColourAsf (1L<<2) +#define PEXTextFontIndexAsf (1L<<3) +#define PEXTextPrecAsf (1L<<4) +#define PEXCharExpansionAsf (1L<<5) +#define PEXCharSpacingAsf (1L<<6) +#define PEXTextColourAsf (1L<<7) +#define PEXLineTypeAsf (1L<<8) +#define PEXLineWidthAsf (1L<<9) +#define PEXLineColourAsf (1L<<10) +#define PEXCurveApproxAsf (1L<<11) +#define PEXPolylineInterpAsf (1L<<12) +#define PEXInteriorStyleAsf (1L<<13) +#define PEXInteriorStyleIndexAsf (1L<<14) +#define PEXSurfaceColourAsf (1L<<15) +#define PEXSurfaceInterpAsf (1L<<16) +#define PEXReflectionModelAsf (1L<<17) +#define PEXReflectionAttrAsf (1L<<18) +#define PEXBfInteriorStyleAsf (1L<<19) +#define PEXBfInteriorStyleIndexAsf (1L<<20) +#define PEXBfSurfaceColourAsf (1L<<21) +#define PEXBfSurfaceInterpAsf (1L<<22) +#define PEXBfReflectionModelAsf (1L<<23) +#define PEXBfReflectionAttrAsf (1L<<24) +#define PEXSurfaceApproxAsf (1L<<25) +#define PEXSurfaceEdgesAsf (1L<<26) +#define PEXSurfaceEdgeTypeAsf (1L<<27) +#define PEXSurfaceEdgeWidthAsf (1L<<28) +#define PEXSurfaceEdgeColourAsf (1L<<29) +#define PEXMaxAsfShift 29 + +/* Asf Values */ +#define PEXBundled 0 +#define PEXIndividual 1 + +/* Composition */ +#define PEXPreConcatenate 0 +#define PEXPostConcatenate 1 +#define PEXReplace 2 + +/* Cull mode */ +/* 0 None */ +#define PEXBackFaces 1 +#define PEXFrontFaces 2 + +/* Curve Type and Surface Type */ +#define PEXRational 0 +#define PEXNonRational 1 + +/* Edit Mode */ +#define PEXStructureInsert 0 +#define PEXStructureReplace 1 + +/* Whence values */ +#define PEXBeginning 0 +#define PEXCurrent 1 +#define PEXEnd 2 + +/* Element Search */ +#define PEXNotFound 1 +#define PEXFound 2 + +/* GetEnumeratedType return format */ +#define PEXETIndex 1 +#define PEXETMnemonic 2 +#define PEXETBoth 3 + +/* Enum Types */ +#define PEXETMarkerType 1 +#define PEXETATextStyle 2 +#define PEXETInteriorStyle 3 +#define PEXETHatchStyle 4 +#define PEXETLineType 5 +#define PEXETSurfaceEdgeType 6 +#define PEXETPickDeviceType 7 +#define PEXETPolylineInterpMethod 8 +#define PEXETCurveApproxMethod 9 +#define PEXETReflectionModel 10 +#define PEXETSurfaceInterpMethod 11 +#define PEXETSurfaceApproxMethod 12 +#define PEXETModelClipOperator 13 +#define PEXETLightType 14 +#define PEXETColourType 15 +#define PEXETFloatFormat 16 +#define PEXETHlhsrMode 17 +#define PEXETPromptEchoType 18 +#define PEXETDisplayUpdateMode 19 +#define PEXETColourApproxType 20 +#define PEXETColourApproxModel 21 +#define PEXETGDP 22 +#define PEXETGDP3 23 +#define PEXETGSE 24 +#define PEXETTrimCurveApproxMethod 25 +#define PEXETRenderingColourModel 26 +#define PEXETParaSurfCharacteristics 27 + +/* Renderer state */ +#define PEXIdle 0 +#define PEXRendering 1 + +/* Flags (e.g., Switches, Visibility, and Edges) */ +#define PEXOff 0 +#define PEXOn 1 + +/* Shape hints */ +/* Complex, Nonconvex, Convex, are defined as 0, 1, 2 in X.h */ +#define PEXComplex 0 +#define PEXNonconvex 1 +#define PEXConvex 2 +#define PEXUnknownShape 3 + +/* Contour hints */ +#define PEXDisjoint 0 +#define PEXNested 1 +#define PEXIntersecting 2 +#define PEXUnknownContour 3 + +/* Table Type */ +#define PEXLineBundleLUT 1 +#define PEXMarkerBundleLUT 2 +#define PEXTextBundleLUT 3 +#define PEXInteriorBundleLUT 4 +#define PEXEdgeBundleLUT 5 +#define PEXPatternLUT 6 +#define PEXTextFontLUT 7 +#define PEXColourLUT 8 +#define PEXViewLUT 9 +#define PEXLightLUT 10 +#define PEXDepthCueLUT 11 +#define PEXColourApproxLUT 12 +#define PEXMaxTableType 12 + +/* Status in GetTableEntry */ +#define PEXDefaultEntry 0 +#define PEXDefinedEntry 1 + +/* ValueType in GetTableEntr{y|ies} */ +#define PEXSetValue 0 +#define PEXRealizedValue 1 + +/* Constants for Path and Vertical and Horizontal alignment */ +#define PEXPathRight 0 +#define PEXPathLeft 1 +#define PEXPathUp 2 +#define PEXPathDown 3 +#define PEXValignNormal 0 +#define PEXValignTop 1 +#define PEXValignCap 2 +#define PEXValignHalf 3 +#define PEXValignBase 4 +#define PEXValignBottom 5 +#define PEXHalignNormal 0 +#define PEXHalignLeft 1 +#define PEXHalignCenter 2 +#define PEXHalignRight 3 + +/* Text precision */ +#define PEXStringPrecision 0 +#define PEXCharPrecision 1 +#define PEXStrokePrecision 2 + +/* Character Set Widths */ +#define PEXCSByte 0 +#define PEXCSShort 1 +#define PEXCSLong 2 + +/* Update State */ +#define PEXNotPending 0 +#define PEXPending 1 + +/* Visual State */ +#define PEXCorrect 0 +#define PEXDeferred 1 +#define PEXSimulated 2 + +/* Display State */ +#define PEXEmpty 0 +#define PEXNotEmpty 1 + +/* Buffer Mode */ +#define PEXSingleBuffered 0 +#define PEXDoubleBuffered 1 + +/* Dynamic types */ +#define PEXIMM 0 +#define PEXIRG 1 +#define PEXCBS 2 + +/* Geometric attributes (Vertex, Facet) */ +#define PEXGAColour 0x0001 +#define PEXGANormal 0x0002 +#define PEXGAEdges 0x0004 + +/* Pick Status */ +#define PEXNoPick 0 +#define PEXOk 1 + +/* Pick Echo Switch */ +#define PEXNoEcho 0 +#define PEXEcho 1 + +/* Pick Path Order */ +#define PEXTopFirst 0 +#define PEXBottomFirst 1 + +/* Items for GetStructureInfo */ +#define PEXElementPtr 0x0001 +#define PEXNumElements 0x0002 +#define PEXLengthStructure 0x0004 +#define PEXHasRefs 0x0008 +#define PEXEditMode 0x0010 + +/* Flags for GetStructuresInNetwork */ +#define PEXAll 0 +#define PEXOrphans 1 + +/* Path part for GetAncestors */ +#define PEXTopPart 0 +#define PEXBottomPart 1 + +/* Direction for ElementSearch */ +#define PEXForward 0 +#define PEXBackward 1 + +/* Nameset changes */ +#define PEXNSAdd 0 +#define PEXNSRemove 1 +#define PEXNSReplace 2 + +/* Priorities */ +#define PEXHigher 0 +#define PEXLower 1 + +/* Enumerated Type Descriptors */ + +/* Marker Type */ +#define PEXMarkerDot 1 +#define PEXMarkerCross 2 +#define PEXMarkerAsterisk 3 +#define PEXMarkerCircle 4 +#define PEXMarkerX 5 +/* ATextStyle */ +#define PEXATextNotConnected 1 +#define PEXATextConnected 2 +/* InteriorStyle */ +#define PEXInteriorStyleHollow 1 +#define PEXInteriorStyleSolid 2 +#define PEXInteriorStylePattern 3 +#define PEXInteriorStyleHatch 4 +#define PEXInteriorStyleEmpty 5 +/* HatchStyle */ +/* LineType */ +#define PEXLineTypeSolid 1 +#define PEXLineTypeDashed 2 +#define PEXLineTypeDotted 3 +#define PEXLineTypeDashDot 4 +/* SurfaceEdgeType */ +#define PEXSurfaceEdgeSolid 1 +#define PEXSurfaceEdgeDashed 2 +#define PEXSurfaceEdgeDotted 3 +#define PEXSurfaceEdgeDashDot 4 +/* PickDeviceType */ +#define PEXPickDeviceDC_HitBox 1 +#define PEXPickDeviceNPC_HitVolume 2 +/* PolylineInterpMethod */ +#define PEXPolylineInterpNone 1 +#define PEXPolylineInterpColour 2 +/* Curve(and Surface)(and Trim Curve)ApproxMethods */ +#define PEXApproxImpDep 1 +#define PEXApproxConstantBetweenKnots 2 +#define PEXApproxWcsChordalSize 3 +#define PEXApproxNpcChordalSize 4 +#define PEXApproxDcChordalSize 5 +#define PEXCurveApproxWcsChordalDev 6 +#define PEXCurveApproxNpcChordalDev 7 +#define PEXCurveApproxDcChordalDev 8 +#define PEXSurfaceApproxWcsPlanarDev 6 +#define PEXSurfaceApproxNpcPlanarDev 7 +#define PEXSurfaceApproxDcPlanarDev 8 +#define PEXApproxWcsRelative 9 +#define PEXApproxNpcRelative 10 +#define PEXApproxDcRelative 11 +/* ReflectionModel */ +#define PEXReflectionNoShading 1 +#define PEXReflectionAmbient 2 +#define PEXReflectionDiffuse 3 +#define PEXReflectionSpecular 4 +/* SurfaceInterpMethod */ +#define PEXSurfaceInterpNone 1 +#define PEXSurfaceInterpColour 2 +#define PEXSurfaceInterpDotProduct 3 +#define PEXSurfaceInterpNormal 4 +/* ModelClipOperator */ +#define PEXModelClipReplace 1 +#define PEXModelClipIntersection 2 +/* LightType */ +#define PEXLightAmbient 1 +#define PEXLightWcsVector 2 +#define PEXLightWcsPoint 3 +#define PEXLightWcsSpot 4 +/* ColourType */ +#define PEXIndexedColour 0 +#define PEXRgbFloatColour 1 +#define PEXCieFloatColour 2 +#define PEXHsvFloatColour 3 +#define PEXHlsFloatColour 4 +#define PEXRgb8Colour 5 +#define PEXRgb16Colour 6 +#define PEXMaxColour 6 +/* FloatFormat */ +#define PEXIeee_754_32 1 +#define PEXDEC_F_Floating 2 +#define PEXIeee_754_64 3 +#define PEXDEC_D_Floating 4 +/* HlhsrMode */ +#define PEXHlhsrOff 1 +#define PEXHlhsrZBuffer 2 +#define PEXHlhsrPainters 3 +#define PEXHlhsrScanline 4 +#define PEXHlhsrHiddenLineOnly 5 +/* PromptEchoType */ +#define PEXEchoPrimitive 1 +#define PEXEchoStructure 2 +#define PEXEchoNetwork 3 +/* DisplayUpdateMethod */ +#define PEXVisualizeEach 1 +#define PEXVisualizeEasy 2 +#define PEXVisualizeNone 3 +#define PEXSimulateSome 4 +#define PEXVisualizeWhenever 5 +/* ColourApproxType */ +#define PEXColourSpace 1 +#define PEXColourRange 2 +/* ColourApproxMethod */ +#define PEXColourApproxRGB 1 +#define PEXColourApproxCIE 2 +#define PEXColourApproxHSV 3 +#define PEXColourApproxHLS 4 +#define PEXColourApproxYIQ 5 +/* RenderingColourModel */ +#define PEXRdrColourModelImpDep 0 +#define PEXRdrColourModelRGB 1 +#define PEXRdrColourModelCIE 2 +#define PEXRdrColourModelHSV 3 +#define PEXRdrColourModelHLS 4 +/* ParametricSurfaceCharacteristics */ +#define PEXPSCNone 1 +#define PEXPSCImpDep 2 +#define PEXPSCIsoCurves 3 +#define PEXPSCMcLevelCurves 4 +#define PEXPSCWcLevelCurves 5 +/* Isoparametric Curves */ +#define PEXICUniformPlacement 0 +#define PEXICNonuniformPlacement 1 + +/* Clipping */ +#define PEXClipXY 0x0001 +#define PEXClipBack 0x0002 +#define PEXClipFront 0x0004 + +#define PEXClip 0 +#define PEXNoClip 1 + +/* Implementation Dependent Constant Names */ +#define PEXIDDitheringSupported 1 +#define PEXIDMaxEdgeWidth 2 +#define PEXIDMaxLineWidth 3 +#define PEXIDMaxMarkerSize 4 +#define PEXIDMaxModelClipPlanes 5 +#define PEXIDMaxNameSetNames 6 +#define PEXIDMaxNonAmbientLights 7 +#define PEXIDMaxNURBOrder 8 +#define PEXIDMaxTrimCurveOrder 9 +#define PEXIDMinEdgeWidth 10 +#define PEXIDMinLineWidth 11 +#define PEXIDMinMarkerSize 12 +#define PEXIDNominalEdgeWidth 13 +#define PEXIDNominalLineWidth 14 +#define PEXIDNominalMarkerSize 15 +#define PEXIDNumSupportedEdgeWidths 16 +#define PEXIDNumSupportedLineWidths 17 +#define PEXIDNumSupportedMarkerSizes 18 +#define PEXIDBestColourApproximation 19 +#define PEXIDTransparencySupported 20 +#define PEXIDDoubleBufferingSupported 21 +#define PEXIDChromaticityRedU 22 +#define PEXIDChromaticityRedV 23 +#define PEXIDLuminanceRed 24 +#define PEXIDChromaticityGreenU 25 +#define PEXIDChromaticityGreenV 26 +#define PEXIDLuminanceGreen 27 +#define PEXIDChromaticityBlueU 28 +#define PEXIDChromaticityBlueV 29 +#define PEXIDLuminanceBlue 30 +#define PEXIDChromaticityWhiteU 31 +#define PEXIDChromaticityWhiteV 32 +#define PEXIDLuminanceWhite 33 + +/* Constants for IDRgbBestApproximation */ +#define PEXColourApproxAnyValues 0 +#define PEXColourApproxPowersOf2 1 + +/** To convert a bit index to a mask number and a mask value, assuming + ** 32 bit wide words. For example, a bitIndex of 5 will return + ** maskNum == 0 and maskValue == (1 << 5) = 32, while a bitIndex of 39 + ** will return maskNum == 1 and maskValue == (1 << 7) == 128 + **/ +#define PEX_BITNUM_TO_BITMASK(bitIndex, maskNum, maskValue) \ + maskNum = (bitIndex) / 32; \ + maskValue = ((unsigned)1L << ((bitIndex) % 32)); + +#define CHECK_BITMASK_ARRAY(mask,bitIndex) \ + if (mask[((bitIndex)/32)] & ((unsigned)1L << ((bitIndex) % 32))) + +#define PEX_BITMASK(i) ((unsigned)1 << ((i) & 31)) +#define PEX_MASKIDX(i) ((i) >> 5) +#define PEX_MASKWORD(buf, i) buf[PEX_MASKIDX(i)] +#define PEX_BITSET(buf, i) PEX_MASKWORD(buf, i) |= PEX_BITMASK(i) +#define PEX_BITCLEAR(buf, i) PEX_MASKWORD(buf, i) &= ~PEX_BITMASK(i) +#define PEX_GETBIT(buf, i) (PEX_MASKWORD(buf, i) & PEX_BITMASK(i)) + +#define PEXMSGetWksInfo 2 +#define PEXMSPipeline 3 + +/* Pipeline Context */ +#define PEXPCMarkerType 0 +#define PEXPCMarkerScale 1 +#define PEXPCMarkerColour 2 +#define PEXPCMarkerBundleIndex 3 +#define PEXPCTextFont 4 +#define PEXPCTextPrecision 5 +#define PEXPCCharExpansion 6 +#define PEXPCCharSpacing 7 +#define PEXPCTextColour 8 +#define PEXPCCharHeight 9 +#define PEXPCCharUpVector 10 +#define PEXPCTextPath 11 +#define PEXPCTextAlignment 12 +#define PEXPCAtextHeight 13 +#define PEXPCAtextUpVector 14 +#define PEXPCAtextPath 15 +#define PEXPCAtextAlignment 16 +#define PEXPCAtextStyle 17 +#define PEXPCTextBundleIndex 18 +#define PEXPCLineType 19 +#define PEXPCLineWidth 20 +#define PEXPCLineColour 21 +#define PEXPCCurveApproximation 22 +#define PEXPCPolylineInterp 23 +#define PEXPCLineBundleIndex 24 +#define PEXPCInteriorStyle 25 +#define PEXPCInteriorStyleIndex 26 +#define PEXPCSurfaceColour 27 +#define PEXPCSurfaceReflAttr 28 +#define PEXPCSurfaceReflModel 29 +#define PEXPCSurfaceInterp 30 +#define PEXPCBfInteriorStyle 31 + +#define PEXPCBfInteriorStyleIndex 32 +#define PEXPCBfSurfaceColour 33 +#define PEXPCBfSurfaceReflAttr 34 +#define PEXPCBfSurfaceReflModel 35 +#define PEXPCBfSurfaceInterp 36 +#define PEXPCSurfaceApproximation 37 +#define PEXPCCullingMode 38 +#define PEXPCDistinguishFlag 39 +#define PEXPCPatternSize 40 +#define PEXPCPatternRefPt 41 +#define PEXPCPatternRefVec1 42 +#define PEXPCPatternRefVec2 43 +#define PEXPCInteriorBundleIndex 44 +#define PEXPCSurfaceEdgeFlag 45 +#define PEXPCSurfaceEdgeType 46 +#define PEXPCSurfaceEdgeWidth 47 +#define PEXPCSurfaceEdgeColour 48 +#define PEXPCEdgeBundleIndex 49 +#define PEXPCLocalTransform 50 +#define PEXPCGlobalTransform 51 +#define PEXPCModelClip 52 +#define PEXPCModelClipVolume 53 +#define PEXPCViewIndex 54 +#define PEXPCLightState 55 +#define PEXPCDepthCueIndex 56 +#define PEXPCSetAsfValues 57 +#define PEXPCPickId 58 +#define PEXPCHlhsrIdentifier 59 +#define PEXPCNameSet 60 +#define PEXPCColourApproxIndex 61 +#define PEXPCRenderingColourModel 62 +#define PEXPCParaSurfCharacteristics 63 +#define PEXMaxPCIndex 63 + +/* Renderer Bitmasks */ +#define PEXRDPipelineContext (1L<<0) +#define PEXRDCurrentPath (1L<<1) +#define PEXRDMarkerBundle (1L<<2) +#define PEXRDTextBundle (1L<<3) +#define PEXRDLineBundle (1L<<4) +#define PEXRDInteriorBundle (1L<<5) +#define PEXRDEdgeBundle (1L<<6) +#define PEXRDViewTable (1L<<7) +#define PEXRDColourTable (1L<<8) +#define PEXRDDepthCueTable (1L<<9) +#define PEXRDLightTable (1L<<10) +#define PEXRDColourApproxTable (1L<<11) +#define PEXRDPatternTable (1L<<12) +#define PEXRDTextFontTable (1L<<13) +#define PEXRDHighlightIncl (1L<<14) +#define PEXRDHighlightExcl (1L<<15) +#define PEXRDInvisibilityIncl (1L<<16) +#define PEXRDInvisibilityExcl (1L<<17) +#define PEXRDRendererState (1L<<18) +#define PEXRDHlhsrMode (1L<<19) +#define PEXRDNpcSubvolume (1L<<20) +#define PEXRDViewport (1L<<21) +#define PEXRDClipList (1L<<22) +#define PEXMaxRDShift 22 + +/* Renderer Dynamics Bitmasks */ +/* tables */ +#define PEXDynMarkerBundle (1L<<0) +#define PEXDynTextBundle (1L<<1) +#define PEXDynLineBundle (1L<<2) +#define PEXDynInteriorBundle (1L<<3) +#define PEXDynEdgeBundle (1L<<4) +#define PEXDynViewTable (1L<<5) +#define PEXDynColourTable (1L<<6) +#define PEXDynDepthCueTable (1L<<7) +#define PEXDynLightTable (1L<<8) +#define PEXDynColourApproxTable (1L<<9) +#define PEXDynPatternTable (1L<<10) +#define PEXDynTextFontTable (1L<<11) +#define PEXDynMarkerBundleContents (1L<<12) +#define PEXDynTextBundleContents (1L<<13) +#define PEXDynLineBundleContents (1L<<14) +#define PEXDynInteriorBundleContents (1L<<15) +#define PEXDynEdgeBundleContents (1L<<16) +#define PEXDynViewTableContents (1L<<17) +#define PEXDynColourTableContents (1L<<18) +#define PEXDynDepthCueTableContents (1L<<19) +#define PEXDynLightTableContents (1L<<20) +#define PEXDynColourApproxContents (1L<<21) +#define PEXDynPatternTableContents (1L<<22) +#define PEXDynTextFontTableContents (1L<<23) +/* namesets */ +#define PEXDynHighlightNameset (1L<<0) +#define PEXDynInvisibilityNameset (1L<<1) +#define PEXDynHighlightNamesetContents (1L<<12) +#define PEXDynInvisibilityNamesetContents (1L<<13) +/* attributes */ +#define PEXDynHlhsrMode (1L<<0) +#define PEXDynNpcSubvolume (1L<<1) +#define PEXDynViewport (1L<<2) +#define PEXDynClipList (1L<<3) + +#define PEXElementType (1L<<0) +#define PEXElementSize (1L<<1) +#define PEXElementData (1L<<2) + +/* Search Context Bitmasks */ +#define PEXSCPosition (1L<<0) +#define PEXSCDistance (1L<<1) +#define PEXSCCeiling (1L<<2) +#define PEXSCModelClipFlag (1L<<3) +#define PEXSCStartPath (1L<<4) +#define PEXSCNormalList (1L<<5) +#define PEXSCInvertedList (1L<<6) + +/* Phigs Workstation Attribute Bitmasks */ +#define PEXPWDisplayUpdate 0 +#define PEXPWVisualState 1 +#define PEXPWDisplaySurface 2 +#define PEXPWViewUpdate 3 +#define PEXPWDefinedViews 4 +#define PEXPWWksUpdate 5 +#define PEXPWReqNpcSubvolume 6 +#define PEXPWCurNpcSubvolume 7 +#define PEXPWReqWksViewport 8 +#define PEXPWCurWksViewport 9 +#define PEXPWHlhsrUpdate 10 +#define PEXPWReqHlhsrMode 11 +#define PEXPWCurHlhsrMode 12 +#define PEXPWDrawable 13 +#define PEXPWMarkerBundle 14 +#define PEXPWTextBundle 15 +#define PEXPWLineBundle 16 +#define PEXPWInteriorBundle 17 +#define PEXPWEdgeBundle 18 +#define PEXPWColourTable 19 +#define PEXPWDepthCueTable 20 +#define PEXPWLightTable 21 +#define PEXPWColourApproxTable 22 +#define PEXPWPatternTable 23 +#define PEXPWTextFontTable 24 +#define PEXPWHighlightIncl 25 +#define PEXPWHighlightExcl 26 +#define PEXPWInvisibilityIncl 27 +#define PEXPWInvisibilityExcl 28 +#define PEXPWPostedStructures 29 +#define PEXPWNumPriorities 30 +#define PEXPWBufferUpdate 31 + +#define PEXPWReqBufferMode 32 +#define PEXPWCurBufferMode 33 + +/* Indices for GetDynamics */ +#define PEXPWDViewRep 0 +#define PEXPWDMarkerBundle 1 +#define PEXPWDTextBundle 2 +#define PEXPWDLineBundle 3 +#define PEXPWDInteriorBundle 4 +#define PEXPWDEdgeBundle 5 +#define PEXPWDColourTable 6 +#define PEXPWDPatternTable 7 +#define PEXPWDWksTransform 8 +#define PEXPWDHighlightFilter 9 +#define PEXPWDInvisibilityFilter 10 +#define PEXPWDHlhsrMode 11 +#define PEXPWDStructureModify 12 +#define PEXPWDPostStructure 13 +#define PEXPWDUnpostStructure 14 +#define PEXPWDDeleteStructure 15 +#define PEXPWDReferenceModify 16 +#define PEXPWDBufferModify 17 +#define PEXPWDLightTable 18 +#define PEXPWDDepthCueTable 19 +#define PEXPWDColourApproxTable 20 + +/* Pick Device Bitmasks */ +#define PEXPDPickStatus (1L<<0) +#define PEXPDPickPath (1L<<1) +#define PEXPDPickPathOrder (1L<<2) +#define PEXPDPickIncl (1L<<3) +#define PEXPDPickExcl (1L<<4) +#define PEXPDPickDataRec (1L<<5) +#define PEXPDPickPromptEchoType (1L<<6) +#define PEXPDPickEchoVolume (1L<<7) +#define PEXPDPickEchoSwitch (1L<<8) + +/* Pick Measure Bitmasks */ +#define PEXPMStatus (1L<<0) +#define PEXPMPath (1L<<1) + +/* Errors */ +#define PEXColourTypeError 0 +#define PEXRendererStateError 1 +#define PEXFloatingPointFormatError 2 +#define PEXLabelError 3 +#define PEXLookupTableError 4 +#define PEXNameSetError 5 +#define PEXPathError 6 +#define PEXFontError 7 +#define PEXPhigsWksError 8 +#define PEXPickMeasureError 9 +#define PEXPipelineContextError 10 +#define PEXRendererError 11 +#define PEXSearchContextError 12 +#define PEXStructureError 13 +#define PEXOutputCommandError 14 +#define PEXMaxError 14 + +/* Requests */ +#define PEX_GetExtensionInfo 1 +#define PEX_GetEnumeratedTypeInfo 2 +#define PEX_GetImpDepConstants 3 +#define PEX_CreateLookupTable 4 +#define PEX_CopyLookupTable 5 +#define PEX_FreeLookupTable 6 +#define PEX_GetTableInfo 7 +#define PEX_GetPredefinedEntries 8 +#define PEX_GetDefinedIndices 9 +#define PEX_GetTableEntry 10 +#define PEX_GetTableEntries 11 +#define PEX_SetTableEntries 12 +#define PEX_DeleteTableEntries 13 +#define PEX_CreatePipelineContext 14 +#define PEX_CopyPipelineContext 15 +#define PEX_FreePipelineContext 16 +#define PEX_GetPipelineContext 17 +#define PEX_ChangePipelineContext 18 +#define PEX_CreateRenderer 19 +#define PEX_FreeRenderer 20 +#define PEX_ChangeRenderer 21 +#define PEX_GetRendererAttributes 22 +#define PEX_GetRendererDynamics 23 +#define PEX_BeginRendering 24 +#define PEX_EndRendering 25 +#define PEX_BeginStructure 26 +#define PEX_EndStructure 27 +#define PEX_RenderOutputCommands 28 +#define PEX_RenderNetwork 29 +#define PEX_CreateStructure 30 +#define PEX_CopyStructure 31 +#define PEX_DestroyStructures 32 +#define PEX_GetStructureInfo 33 +#define PEX_GetElementInfo 34 +#define PEX_GetStructuresInNetwork 35 +#define PEX_GetAncestors 36 +#define PEX_GetDescendants 37 +#define PEX_FetchElements 38 +#define PEX_SetEditingMode 39 +#define PEX_SetElementPointer 40 +#define PEX_SetElementPointerAtLabel 41 +#define PEX_ElementSearch 42 +#define PEX_StoreElements 43 +#define PEX_DeleteElements 44 +#define PEX_DeleteElementsToLabel 45 +#define PEX_DeleteBetweenLabels 46 +#define PEX_CopyElements 47 +#define PEX_ChangeStructureRefs 48 +#define PEX_CreateNameSet 49 +#define PEX_CopyNameSet 50 +#define PEX_FreeNameSet 51 +#define PEX_GetNameSet 52 +#define PEX_ChangeNameSet 53 +#define PEX_CreateSearchContext 54 +#define PEX_CopySearchContext 55 +#define PEX_FreeSearchContext 56 +#define PEX_GetSearchContext 57 +#define PEX_ChangeSearchContext 58 +#define PEX_SearchNetwork 59 +#define PEX_CreatePhigsWks 60 +#define PEX_FreePhigsWks 61 +#define PEX_GetWksInfo 62 +#define PEX_GetDynamics 63 +#define PEX_GetViewRep 64 +#define PEX_RedrawAllStructures 65 +#define PEX_UpdateWorkstation 66 +#define PEX_RedrawClipRegion 67 +#define PEX_ExecuteDeferredActions 68 +#define PEX_SetViewPriority 69 +#define PEX_SetDisplayUpdateMode 70 +#define PEX_MapDCtoWC 71 +#define PEX_MapWCtoDC 72 +#define PEX_SetViewRep 73 +#define PEX_SetWksWindow 74 +#define PEX_SetWksViewport 75 +#define PEX_SetHlhsrMode 76 +#define PEX_SetWksBufferMode 77 +#define PEX_PostStructure 78 +#define PEX_UnpostStructure 79 +#define PEX_UnpostAllStructures 80 +#define PEX_GetWksPostings 81 +#define PEX_GetPickDevice 82 +#define PEX_ChangePickDevice 83 +#define PEX_CreatePickMeasure 84 +#define PEX_FreePickMeasure 85 +#define PEX_GetPickMeasure 86 +#define PEX_UpdatePickMeasure 87 +#define PEX_OpenFont 88 +#define PEX_CloseFont 89 +#define PEX_QueryFont 90 +#define PEX_ListFonts 91 +#define PEX_ListFontsWithInfo 92 +#define PEX_QueryTextExtents 93 +#define PEXMaxRequest 93 + +/* Output Commands */ +#define PEXOCAll 0 +#define PEXOCMarkerType 1 +#define PEXOCMarkerScale 2 +#define PEXOCMarkerColourIndex 3 +#define PEXOCMarkerColour 4 +#define PEXOCMarkerBundleIndex 5 +#define PEXOCTextFontIndex 6 +#define PEXOCTextPrecision 7 +#define PEXOCCharExpansion 8 +#define PEXOCCharSpacing 9 +#define PEXOCTextColourIndex 10 +#define PEXOCTextColour 11 +#define PEXOCCharHeight 12 +#define PEXOCCharUpVector 13 +#define PEXOCTextPath 14 +#define PEXOCTextAlignment 15 +#define PEXOCAtextHeight 16 +#define PEXOCAtextUpVector 17 +#define PEXOCAtextPath 18 +#define PEXOCAtextAlignment 19 +#define PEXOCAtextStyle 20 +#define PEXOCTextBundleIndex 21 +#define PEXOCLineType 22 +#define PEXOCLineWidth 23 +#define PEXOCLineColourIndex 24 +#define PEXOCLineColour 25 +#define PEXOCCurveApproximation 26 +#define PEXOCPolylineInterp 27 +#define PEXOCLineBundleIndex 28 +#define PEXOCInteriorStyle 29 +#define PEXOCInteriorStyleIndex 30 +#define PEXOCSurfaceColourIndex 31 +#define PEXOCSurfaceColour 32 +#define PEXOCSurfaceReflAttr 33 +#define PEXOCSurfaceReflModel 34 +#define PEXOCSurfaceInterp 35 +#define PEXOCBfInteriorStyle 36 +#define PEXOCBfInteriorStyleIndex 37 +#define PEXOCBfSurfaceColourIndex 38 +#define PEXOCBfSurfaceColour 39 +#define PEXOCBfSurfaceReflAttr 40 +#define PEXOCBfSurfaceReflModel 41 +#define PEXOCBfSurfaceInterp 42 +#define PEXOCSurfaceApproximation 43 +#define PEXOCCullingMode 44 +#define PEXOCDistinguishFlag 45 +#define PEXOCPatternSize 46 +#define PEXOCPatternRefPt 47 +#define PEXOCPatternAttr 48 +#define PEXOCInteriorBundleIndex 49 +#define PEXOCSurfaceEdgeFlag 50 +#define PEXOCSurfaceEdgeType 51 +#define PEXOCSurfaceEdgeWidth 52 +#define PEXOCSurfaceEdgeColourIndex 53 +#define PEXOCSurfaceEdgeColour 54 +#define PEXOCEdgeBundleIndex 55 +#define PEXOCSetAsfValues 56 +#define PEXOCLocalTransform 57 +#define PEXOCLocalTransform2D 58 +#define PEXOCGlobalTransform 59 +#define PEXOCGlobalTransform2D 60 +#define PEXOCModelClip 61 +#define PEXOCModelClipVolume 62 +#define PEXOCModelClipVolume2D 63 +#define PEXOCRestoreModelClip 64 +#define PEXOCViewIndex 65 +#define PEXOCLightState 66 +#define PEXOCDepthCueIndex 67 +#define PEXOCPickId 68 +#define PEXOCHlhsrIdentifier 69 +#define PEXOCColourApproxIndex 70 +#define PEXOCRenderingColourModel 71 +#define PEXOCParaSurfCharacteristics 72 +#define PEXOCAddToNameSet 73 +#define PEXOCRemoveFromNameSet 74 +#define PEXOCExecuteStructure 75 +#define PEXOCLabel 76 +#define PEXOCApplicationData 77 +#define PEXOCGse 78 +#define PEXOCMarker 79 +#define PEXOCMarker2D 80 +#define PEXOCText 81 +#define PEXOCText2D 82 +#define PEXOCAnnotationText 83 +#define PEXOCAnnotationText2D 84 +#define PEXOCPolyline 85 +#define PEXOCPolyline2D 86 +#define PEXOCPolylineSet 87 +#define PEXOCNurbCurve 88 +#define PEXOCFillArea 89 +#define PEXOCFillArea2D 90 +#define PEXOCExtFillArea 91 +#define PEXOCFillAreaSet 92 +#define PEXOCFillAreaSet2D 93 +#define PEXOCExtFillAreaSet 94 +#define PEXOCTriangleStrip 95 +#define PEXOCQuadrilateralMesh 96 +#define PEXOCSOFAS 97 +#define PEXOCNurbSurface 98 +#define PEXOCCellArray 99 +#define PEXOCCellArray2D 100 +#define PEXOCExtCellArray 101 +#define PEXOCGdp 102 +#define PEXOCGdp2D 103 +#define PEXMaxOC 103 + +#define PEXOCNil 0xffff + +#endif /* PEX.h */ + diff --git a/xie/docs/dec/xie23-src/include/PEX/PEXErr.h b/xie/docs/dec/xie23-src/include/PEX/PEXErr.h new file mode 100644 index 0000000..d12e9cf --- /dev/null +++ b/xie/docs/dec/xie23-src/include/PEX/PEXErr.h @@ -0,0 +1,69 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* $XConsortium: PEXErr.h,v 5.1 91/02/16 09:47:05 rws Exp $ */ + +/*********************************************************** +Copyright (c) 1988,1989,1990, 1991 by Sun Microsystems, Inc. and the X Consortium. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Sun Microsystems, +the X Consortium, and MIT not be used in advertising or publicity +pertaining to distribution of the software without specific, written +prior permission. + +SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT +SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL +DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + + +#ifndef PEXERRS_H +#define PEXERRS_H + +typedef int ErrorCode; + +#define PEXNOERR 0 + +#ifndef Success +#define Success PEXNOERR +#endif /* Success */ + +#ifndef PEXNYI +#define PEXNYI BadImplementation +#endif /* PEXNYI */ + +#endif /* PEXERRS_H */ + diff --git a/xie/docs/dec/xie23-src/include/PEX/PEXOCs.h b/xie/docs/dec/xie23-src/include/PEX/PEXOCs.h new file mode 100644 index 0000000..6d644b6 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/PEX/PEXOCs.h @@ -0,0 +1,164 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* $XConsortium: PEXOCs.h,v 5.2 91/02/16 09:47:07 rws Exp $ */ + +/*********************************************************** +Copyright 1989, 1990, 1991 by Sun Microsystems, Inc. and the X Consortium. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Sun Microsystems, +the X Consortium, and MIT not be used in advertising or publicity +pertaining to distribution of the software without specific, written +prior permission. + +SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT +SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL +DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + + + +#ifndef OCDEFS_H +#define OCDEFS_H + +#define OC_MARKER_TYPE 1L +#define OC_MARKER_SCALE 2L +#define OC_MARKER_COLOR_INDEX 3L +#define OC_MARKER_COLOR 4L +#define OC_MARKER_BUNDLEINDEX 5L +#define OC_TEXT_FONT 6L +#define OC_TEXT_PRECISION 7L +#define OC_CHARACTER_EXPANSION 8L +#define OC_CHARACTER_SPACING 9L +#define OC_TEXT_COLOR_INDEX 10L +#define OC_TEXT_COLOR 11L +#define OC_CHARACTER_HEIGHT 12L +#define OC_CHARACTER_UP_VECTOR 13L +#define OC_TEXT_PATH 14L +#define OC_TEXT_ALIGNMENT 15L +#define OC_ANNOTATION_TEXT_HEIGHT 16L +#define OC_ANNOTATION_TEXT_UP_VECTOR 17L +#define OC_ANNOTATION_TEXT_PATH 18L +#define OC_ANNOTATION_TEXT_ALIGNMENT 19L +#define OC_ANNOTATION_TEXT_STYLE 20L +#define OC_TEXT_BUNDLE_INDEX 21L +#define OC_LINE_TYPE 22L +#define OC_LINE_WIDTH 23L +#define OC_LINE_COLOR_INDEX 24L +#define OC_LINE_COLOR 25L +#define OC_CURVE_APPROXIMATION_METHOD 26L +#define OC_POLYLINE_INTERPOLATION_METHOD 27L +#define OC_LINE_BUNDLE_INDEX 28L +#define OC_SURFACE_INTERIOR_STYLE 29L +#define OC_SURFACE_INTERIOR_STYLE_INDEX 30L +#define OC_SURFACE_COLOR_INDEX 31L +#define OC_SURFACE_COLOR 32L +#define OC_SURFACE_REFLECTION_ATTRIBUTES 33L +#define OC_SURFACE_REFLECTION_MODEL 34L +#define OC_SURFACE_INTERPOLATION_METHOD 35L +#define OC_BACKFACE_SURFACE_INTERIOR_STYLE 36L +#define OC_BACKFACE_SURFACE_INTERIOR_STYLE_INDEX 37L +#define OC_BACKFACE_SURFACE_COLOR_INDEX 38L +#define OC_BACKFACE_SURFACE_COLOR 39L +#define OC_BACKFACE_SURFACE_REFLECTION_ATTRIBUTES 40L +#define OC_BACKFACE_SURFACE_REFLECTION_MODEL 41L +#define OC_BACKFACE_SURFACE_INTERPOLATION_METHOD 42L +#define OC_SURFACE_APPROXIMATION_METHOD 43L +#define OC_TRIM_CURVE_APPROXIMATION_METHOD 44L +#define OC_FACET_CULLING_MODE 45L +#define OC_FACET_DISTINGUISH_FLAG 46L +#define OC_NORMAL_REORIENTATION_MODE 47L +#define OC_PATTERN_SIZE 48L +#define OC_PATTERN_REFERENCE_POINT 49L +#define OC_PATTERN_ATTRIBUTES 50L +#define OC_INTERIOR_BUNDLE_INDEX 51L +#define OC_SURFACE_EDGE_FLAG 52L +#define OC_SURFACE_EDGE_TYPE 53L +#define OC_SURFACE_EDGE_WIDTH 54L +#define OC_SURFACE_EDGE_COLOR_INDEX 55L +#define OC_SURFACE_EDGE_COLOR 56L +#define OC_EDGE_BUNDLE_INDEX 57L +#define OC_SET_INDIVIDUAL_ASF 58L +#define OC_LOCAL_TRANSFORM_3D 59L +#define OC_LOCAL_TRANSFORM_2D 60L +#define OC_GLOBAL_TRANSFORM_3D 61L +#define OC_GLOBAL_TRANSFORM_2D 62L +#define OC_MODEL_CLIP 63L +#define OC_SET_MODEL_CLIP_VOLUME_3D 64L +#define OC_SET_MODEL_CLIP_VOLUME_2D 65L +#define OC_RESTORE_MODEL_CLIP_VOLUME 66L +#define OC_VIEW_INDEX 67L +#define OC_LIGHTSOURCE_STATE 68L +#define OC_DEPTH_CUE_INDEX 69L +#define OC_PICK_ID 70L +#define OC_HLHSR_IDENTIFIER 71L +#define OC_ADD_NAMES_TO_NAME_SET 72L +#define OC_REMOVE_NAMES_TO_NAME_SET 73L +#define OC_EXECUTE_STRUCTURE 74L +#define OC_LABEL 75L +#define OC_APPLICATION_DATA 76L +#define OC_GSE 77L +#define OC_MARKER_3D 78L +#define OC_MARKER_2D 79L +#define OC_TEXT_3D 80L +#define OC_TEXT_2D 81L +#define OC_ANNOTATION_TEXT_3D 82L +#define OC_ANNOTATION_TEXT_2D 83L +#define OC_POLYLINE_3D 84L +#define OC_POLYLINE_2D 85L +#define OC_POLYLINE_SET_3D_WITH_DATA 86L +#define OC_PARAMETRIC_CURVE 87L +#define OC_NURB 88L +#define OC_FILL_AREA_3D 89L +#define OC_FILL_AREA_2D 90L +#define OC_FILL_AREA_3D_WITH_DATA 91L +#define OC_FILL_AREA_SET_3D 92L +#define OC_FILL_AREA_SET_2D 93L +#define OC_FILL_AREA_SET_3D_WITH_DATA 94L +#define OC_TRIANGLE_STRIP 95L +#define OC_QUADRILATERAL_MESH 96L +#define OC_INDEXED_POLYGON 97L +#define OC_PARAMETRIC_POLYNOMIAL_SURFACE 98L +#define OC_NURB_SURFACE 99L +#define OC_CELL_ARRAY_3D 100L +#define OC_CELL_ARRAY_2D 101L +#define OC_EXTENDED_CELL_ARRAY_3D 102L +#define OC_GDP_3D 103L +#define OC_GDP_2D 104L +#define MAXOUTCMDS 105 + +#endif /* OCDEFS_H */ + diff --git a/xie/docs/dec/xie23-src/include/PEX/PEXfuncs.h b/xie/docs/dec/xie23-src/include/PEX/PEXfuncs.h new file mode 100644 index 0000000..f3a58c1 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/PEX/PEXfuncs.h @@ -0,0 +1,148 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* $XConsortium: PEXfuncs.h,v 5.2 91/02/16 09:47:08 rws Exp $ */ + +/*********************************************************** +Copyright 1989, 1990, 1991 by Sun Microsystems, Inc. and the X Consortium. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Sun Microsystems, +the X Consortium, and MIT not be used in advertising or publicity +pertaining to distribution of the software without specific, written +prior permission. + +SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT +SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL +DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. +******************************************************************/ + +#ifndef PEX_FUNCS_H +#define PEX_FUNCS_H + +/* PEX Function Declarations, in alphabetic order. */ + +extern int PEXBeginRendering(); /* in file pex/pex_rend.c */ +extern int PEXBeginStructure(); /* in file pex/pex_rend.c */ +extern int PEXChangeNameSet(); /* in file pex/pex_ns.c */ +extern int PEXChangePickDevice(); /* in file pex/pex_pick.c */ +extern int PEXChangePipelineContext(); /* in file pex/pex_pipe.c */ +extern int PEXChangeRenderer(); /* in file pex/pex_rend.c */ +extern int PEXChangeSearchContext(); /* in file pex/pex_srch.c */ +extern int PEXChangeStructureRefs(); /* in file pex/pex_stru.c */ +extern int PEXCloseFont(); /* in file pex/pex_font.c */ +extern int PEXCopyElements(); /* in file pex/pex_stru.c */ +extern int PEXCopyLookupTable(); /* in file pex/pex_lut.c */ +extern int PEXCopyNameSet(); /* in file pex/pex_ns.c */ +extern int PEXCopyPipelineContext(); /* in file pex/pex_pipe.c */ +extern int PEXCopySearchContext(); /* in file pex/pex_srch.c */ +extern int PEXCopyStructure(); /* in file pex/pex_stru.c */ +extern int PEXCreateLookupTable(); /* in file pex/pex_lut.c */ +extern int PEXCreateNameSet(); /* in file pex/pex_ns.c */ +extern int PEXCreatePhigsWks(); /* in file pex/pex_ws.c */ +extern int PEXCreatePickMeasure(); /* in file pex/pex_pick.c */ +extern int PEXCreatePipelineContext(); /* in file pex/pex_pipe.c */ +extern int PEXCreateRenderer(); /* in file pex/pex_rend.c */ +extern int PEXCreateSearchContext(); /* in file pex/pex_srch.c */ +extern int PEXCreateStructure(); /* in file pex/pex_stru.c */ +extern int PEXDeleteBetweenLabels(); /* in file pex/pex_stru.c */ +extern int PEXDeleteElements(); /* in file pex/pex_stru.c */ +extern int PEXDeleteElementsToLabel(); /* in file pex/pex_stru.c */ +extern int PEXDeleteTableEntries(); /* in file pex/pex_lut.c */ +extern int PEXDestroyLookupTable(); /* in file pex/pex_lut.c */ +extern int PEXDestroyNameSet(); /* in file pex/pex_ns.c */ +extern int PEXDestroyPhigsWks(); /* in file pex/pex_ws.c */ +extern int PEXDestroyPickMeasure(); /* in file pex/pex_pick.c */ +extern int PEXDestroyPipelineContext(); /* in file pex/pex_pipe.c */ +extern int PEXDestroyRenderer(); /* in file pex/pex_rend.c */ +extern int PEXDestroySearchContext(); /* in file pex/pex_srch.c */ +extern int PEXDestroyStructures(); /* in file pex/pex_stru.c */ +extern int PEXElementSearch(); /* in file pex/pex_stru.c */ +extern int PEXEndRendering(); /* in file pex/pex_rend.c */ +extern int PEXEndStructure(); /* in file pex/pex_rend.c */ +extern int PEXExecuteDeferredActions(); /* in file pex/pex_ws.c */ +extern int PEXFetchElements(); /* in file pex/pex_stru.c */ +extern int PEXGetAncestors(); /* in file pex/pex_stru.c */ +extern int PEXGetDefinedIndices(); /* in file pex/pex_lut.c */ +extern int PEXGetDescendants(); /* in file pex/pex_stru.c */ +extern int PEXGetDynamics(); /* in file pex/pex_ws.c */ +extern int PEXGetElementInfo(); /* in file pex/pex_stru.c */ +extern int PEXGetEnumeratedTypeInfo(); /* in file pex/pex_info.c */ +extern int PEXGetExtensionInfo(); /* in file pex/pex_info.c */ +extern int PEXGetImpDepConstants(); /* in file pex/pex_info.c */ +extern int PEXGetNameSet(); /* in file pex/pex_ns.c */ +extern int PEXGetPickDevice(); /* in file pex/pex_pick.c */ +extern int PEXGetPickMeasure(); /* in file pex/pex_pick.c */ +extern int PEXGetPipelineContext(); /* in file pex/pex_pipe.c */ +extern int PEXGetPredefinedEntries(); /* in file pex/pex_lut.c */ +extern int PEXGetRendererAttributes(); /* in file pex/pex_rend.c */ +extern int PEXGetRendererDynamics(); /* in file pex/pex_rend.c */ +extern int PEXGetSearchContext(); /* in file pex/pex_srch.c */ +extern int PEXGetStructureInfo(); /* in file pex/pex_stru.c */ +extern int PEXGetStructuresInNetwork(); /* in file pex/pex_stru.c */ +extern int PEXGetTableEntries(); /* in file pex/pex_lut.c */ +extern int PEXGetTableEntry(); /* in file pex/pex_lut.c */ +extern int PEXGetTableInfo(); /* in file pex/pex_lut.c */ +extern int PEXGetViewRep(); /* in file pex/pex_ws.c */ +extern int PEXGetWksInfo(); /* in file pex/pex_ws.c */ +extern int PEXGetWksPostings(); /* in file pex/pex_ws.c */ +extern int PEXListFonts(); /* in file pex/pex_font.c */ +extern int PEXListFontsWithInfo(); /* in file pex/pex_font.c */ +extern int PEXMapDCtoWC(); /* in file pex/pex_ws.c */ +extern int PEXMapWCtoDC(); /* in file pex/pex_ws.c */ +extern int PEXOpenFont(); /* in file pex/pex_font.c */ +extern int PEXPostStructure(); /* in file pex/pex_ws.c */ +extern int PEXQueryFont(); /* in file pex/pex_font.c */ +extern int PEXQueryTextExtents(); /* in file pex/pex_font.c */ +extern int PEXRedrawAllStructures(); /* in file pex/pex_ws.c */ +extern int PEXRenderNetwork(); /* in file pex/pex_rend.c */ +extern int PEXRenderOutputCommands(); /* in file pex/pex_rend.c */ +extern int PEXSearchNetwork(); /* in file pex/pex_srch.c */ +extern int PEXSetDisplayUpdateMode(); /* in file pex/pex_ws.c */ +extern int PEXSetEditingMode(); /* in file pex/pex_stru.c */ +extern int PEXSetElementPointer(); /* in file pex/pex_stru.c */ +extern int PEXSetElementPointerAtLabel(); /* in file pex/pex_stru.c */ +extern int PEXSetHlhsrMode(); /* in file pex/pex_ws.c */ +extern int PEXSetTableEntries(); /* in file pex/pex_lut.c */ +extern int PEXSetViewPriority(); /* in file pex/pex_ws.c */ +extern int PEXSetViewRep(); /* in file pex/pex_ws.c */ +extern int PEXSetWksViewport(); /* in file pex/pex_ws.c */ +extern int PEXSetWksWindow(); /* in file pex/pex_ws.c */ +extern int PEXStoreElements(); /* in file pex/pex_stru.c */ +extern int PEXUnpostAllStructures(); /* in file pex/pex_ws.c */ +extern int PEXUnpostStructure(); /* in file pex/pex_ws.c */ +extern int PEXUpdatePickMeasure(); /* in file pex/pex_pick.c */ +extern int PEXUpdateWorkstation(); /* in file pex/pex_ws.c */ + +#endif /* PEX_FUNCS_H */ diff --git a/xie/docs/dec/xie23-src/include/PEX/PEXmacs.h b/xie/docs/dec/xie23-src/include/PEX/PEXmacs.h new file mode 100644 index 0000000..aaa7a04 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/PEX/PEXmacs.h @@ -0,0 +1,58 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* $XConsortium: PEXmacs.h,v 5.2 91/02/16 09:46:58 rws Exp $ */ + +/*********************************************************** +Copyright 1989, 1990, 1991 by Sun Microsystems, Inc. and the X Consortium. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Sun Microsystems, +the X Consortium, and MIT not be used in advertising or publicity +pertaining to distribution of the software without specific, written +prior permission. + +SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT +SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL +DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. +******************************************************************/ + +#ifndef PEX_MACS_H +#define PEX_MACS_H + +/* Useful macros. */ +#define PEX_SUPPORTS_WS(si) \ + ( !(si) || (si) & 0x2 ) + +#endif /* PEX_MACS_H */ diff --git a/xie/docs/dec/xie23-src/include/PEX/PEXproto.h b/xie/docs/dec/xie23-src/include/PEX/PEXproto.h new file mode 100644 index 0000000..bfcfb69 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/PEX/PEXproto.h @@ -0,0 +1,1856 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* $XConsortium: PEXproto.h,v 5.3 91/07/01 16:19:18 hersh Exp $ */ + +/*********************************************************** +Copyright 1989, 1990, 1991 by Sun Microsystems, Inc. and the X Consortium. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Sun Microsystems, +the X Consortium, and MIT not be used in advertising or publicity +pertaining to distribution of the software without specific, written +prior permission. + +SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT +SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL +DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/* Definitions for the PEX used by server and c bindings */ + +/* + * This packet-construction scheme makes the following assumptions: + * + * 1. The compiler is able to generate code which addresses one- and two-byte + * quantities. In the worst case, this would be done with bit-fields. If + * bit-fields are used it may be necessary to reorder the request fields in + * this file, depending on the order in which the machine assigns bit fields + * to machine words. There may also be a problem with sign extension, as K+R + * specify that bitfields are always unsigned. + * + * 2. 2- and 4-byte fields in packet structures must be ordered by hand such + * that they are naturally-aligned, so that no compiler will ever insert + * padding bytes. + * + * 3. All packets are hand-padded to a multiple of 4 bytes, for the same reason. + */ + +#ifndef PEXPROTO_H +#define PEXPROTO_H + +/* In the following typedefs, comments appear that say "LISTof Foo( numItems )", + * "CLIST of Foo()", and "SINGLE Foo()". These are used when the protocol + * specifies that a request or reply contains a variable length list of + * (possibly variable types of) objects. + * + * A LISTof list is one for which we have already been given the length. + * The items in the list are of type "Foo". The number of items in the list + * appears parenthetically after the type. ("numItems" in our example.) + * Any other information needed to parse the list is also passed in the + * parentheses. (E.g., "tableType" in a list of table entries.) + * + * A CLISTof list is the same, except that the first 4 bytes of the list + * indicate the number of items in the list. The length may need to be + * byte-swapped. + * + * A SINGLE item of an indeterminate length is indicated in the same + * manner. (E.g., a "SINGLE TableEntry()".) Any other information + * needed to parse the item is also passed in the parentheses. + * (E.g., "itemMask" in a set of pipeline context attributes.) + * + * If no information is given in the parentheses, then the size is + * implicit. + * + * Variable length padding is noted with a comment, with the number + * of bytes of padding required as calculated from the value in + * the parentheses. (number of bytes of padding = n?(3-((n-1)%4):0 , where + * n is the parenthetical value.) + */ +#include + +/* Matches revision 5.0P */ + +/**************************************************************** + * REPLIES * + ****************************************************************/ +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + CARD16 majorVersion B16; + CARD16 minorVersion B16; + CARD32 release B32; + CARD32 lengthName B32; + CARD32 subsetInfo B32; + BYTE pad[8]; + /* LISTof CARD8 follows -- Don't swap */ + /* pad */ + } pexGetExtensionInfoReply; + + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* NOT 0; this is an extra-large reply*/ + CARD32 numLists B32; + BYTE pad[20]; /* lists of lists begin afterwards */ + /* LISTof CLISTof pexEnumTypeDesc( numLists ) */ + /* pad */ + } pexGetEnumeratedTypeInfoReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + BYTE pad[24]; + /* LISTof VALUE() */ + } pexGetImpDepConstantsReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* 0 */ + CARD16 unused B16; + CARD16 definableEntries B16; + CARD16 numPredefined B16; + CARD16 predefinedMin B16; + CARD16 predefinedMax B16; + BYTE pad[14]; + } pexGetTableInfoReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + CARD32 unused B32; + CARD32 numEntries B32; + BYTE pad[16]; + /* LISTof TableEntry( numEntries, tableType ) */ + } pexGetPredefinedEntriesReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + CARD32 numIndices B32; + BYTE pad[20]; + /* LISTof pexTableIndex( numIndices ) */ + /* pad( numIndices ) */ + } pexGetDefinedIndicesReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + CARD16 status B16; + CARD16 tableType B16; + BYTE pad[20]; + /* SINGLE TableEntry( tableType ) */ + } pexGetTableEntryReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + CARD16 tableType B16; + CARD16 unused B16; + CARD32 numEntries B32; + BYTE pad[16]; + /* LISTof TableEntry( numEntries, tableType ) */ + } pexGetTableEntriesReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + BYTE pad[24]; + /* SINGLE PipelineContextAttributes( itemMask ) */ + } pexGetPipelineContextReply; + + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + BYTE pad[24]; + /* SINGLE RendererAttributes( itemMask ) */ + } pexGetRendererAttributesReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* 0 */ + pexBitmask tables B32; + pexBitmask namesets B32; + pexBitmask attributes B32; + BYTE pad[12]; +} pexGetRendererDynamicsReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* 0 */ + CARD16 editMode B16; + CARD16 unused B16; + CARD32 elementPtr B32; + CARD32 numElements B32; + CARD32 lengthStructure B32; + CARD16 hasRefs B16; + BYTE pad[6]; + } pexGetStructureInfoReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + CARD32 numInfo B32; + BYTE pad[20]; + /* LISTof pexElementInfo( numInfo ) */ + } pexGetElementInfoReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + CARD8 unused[8]; + CARD32 numStructures B32; + BYTE pad[12]; + /* LISTof pexStructure( numStructures ) */ + } pexGetStructuresInNetworkReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + CARD8 unused[12]; + CARD32 numPaths B32; + BYTE pad[8]; + /* LISTof CLISTof pexElementRef( numPaths ) */ + } pexGetAncestorsReply; + +typedef pexGetAncestorsReply pexGetDescendantsReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + CARD32 numElements B32; + BYTE pad[20]; + /* LISTof OutputCommand( numElements ) */ + } pexFetchElementsReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* 0 */ + CARD16 status B16; + CARD16 unused B16; + CARD32 foundOffset B32; + BYTE pad[16]; + } pexElementSearchReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + CARD32 numNames B32; + BYTE pad[20]; + /* LISTof pexName( numNames ) */ + } pexGetNameSetReply; + + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + BYTE pad[24]; + /* SINGLE SearchContextAttributes( itemMask ) */ + } pexGetSearchContextReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + CARD32 unused B32; + CARD32 numItems B32; + BYTE pad[16]; + /* LISTof pexElementRef( numItems ) */ + } pexSearchNetworkReply; + + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + BYTE pad[24]; + /* SINGLE WksInfo( itemMask ) */ + } pexGetWksInfoReply; + + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* 0 */ + pexDynamicType viewRep; + pexDynamicType markerBundle; + pexDynamicType textBundle; + pexDynamicType lineBundle; + pexDynamicType interiorBundle; + pexDynamicType edgeBundle; + pexDynamicType colourTable; + pexDynamicType patternTable; + pexDynamicType wksTransform; + pexDynamicType highlightFilter; + pexDynamicType invisibilityFilter; + pexDynamicType HlhsrMode; + pexDynamicType structureModify; + pexDynamicType postStructure; + pexDynamicType unpostStructure; + pexDynamicType deleteStructure; + pexDynamicType referenceModify; + pexDynamicType bufferModify; + pexDynamicType lightTable; + pexDynamicType depthCueTable; + pexDynamicType colourApproxTable; + CARD8 pad[3]; + } pexGetDynamicsReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* 4 + 76*fp/4 */ + CARD16 viewUpdate B16; /* Pending, NotPending */ + BYTE pad[22]; + /* SINGLE pexViewRep() requested */ + /* SINGLE pexViewRep() current */ + } pexGetViewRepReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + CARD16 viewIndex B16; + CARD16 unused B16; + CARD32 numCoords B32; + BYTE pad[16]; + /* LISTof pexCoord3D( numCoords ) */ + } pexMapDCtoWCReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + CARD32 unused B32; + CARD32 numCoords B32; + BYTE pad[16]; + /* LISTof pexDeviceCoord( numCoords ) */ + } pexMapWCtoDCReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + BYTE pad[24]; + /* LISTof pexPhigsWksID() */ + } pexGetWksPostingsReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + BYTE pad[24]; + /* SINGLE PickDeviceAttributes( itemMask ) */ + } pexGetPickDeviceReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + BYTE pad[24]; + /* SINGLE pexPickMeasureAttributes( itemMask ) */ + } pexGetPickMeasureReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + CARD32 lengthFontInfo B32; + CARD8 pad[20]; + /* SINGLE pexFontInfo() */ + } pexQueryFontReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + CARD32 numStrings B32; + BYTE pad[20]; + /* LISTof pexString( numStrings ) */ + } pexListFontsReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + CARD32 numStrings B32; + BYTE pad[20]; + /* LISTof pexString( numStrings ) */ + /* CLISTof pexFontInfo() */ + } pexListFontsWithInfoReply; + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 what; /* unused */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not 0 */ + BYTE pad[24]; + /* LISTof ExtentInfo() */ + } pexQueryTextExtentsReply; + +/**************************************************************** + * REQUESTS * + ****************************************************************/ +/* Request structure */ + +typedef struct { + CARD8 reqType; + CARD8 opcode; /* meaning depends on request type */ + CARD16 length B16; + /* length in 4 bytes quantities */ + /* of whole request, including this header */ +} pexReq; + +/***************************************************************** + * structures that follow request. + *****************************************************************/ + +/* ResourceReq is used for any request which has a resource ID + ( or Atom or Time ) as its one and only argument. */ + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 2 */ + CARD32 id B32; /* a Structure, Renderer, Font, LUT, etc. */ + } pexResourceReq; + + +/***************************************************************** + * Specific Requests + *****************************************************************/ + + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 2 */ + CARD16 clientProtocolMajor B16; + CARD16 clientProtocolMinor B16; +} pexGetExtensionInfoReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + Drawable drawable B32; + pexBitmask itemMask B32; + CARD32 numEnums B32; + /* LISTof CARD16( numEnums ) */ + /* pad( numEnums*2 ) */ +} pexGetEnumeratedTypeInfoReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + Drawable drawable B32; + CARD32 numNames B32; + /* LISTof pexImpDepConstantNames ( numNames ) */ + /* pad */ +} pexGetImpDepConstantsReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 4 */ + Drawable drawableExample B32; + pexLookupTable lut B32; + pexTableType tableType B16; + CARD16 unused B16; +} pexCreateLookupTableReq; + + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 3 */ + pexLookupTable src B32; + pexLookupTable dst B32; +} pexCopyLookupTableReq; + +typedef pexResourceReq pexFreeLookupTableReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 3 */ + Drawable drawableExample B32; + pexTableType tableType B16; + CARD16 unused B16; +} pexGetTableInfoReq; + + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 5 */ + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + Drawable drawableExample B32; + pexTableType tableType B16; + pexTableIndex start B16; + CARD16 count B16; + CARD16 pad B16; +} pexGetPredefinedEntriesReq; + +typedef pexResourceReq pexGetDefinedIndicesReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 4 */ + pexEnumTypeIndex fpFormat B16; + CARD16 valueType B16; + pexLookupTable lut B32; + pexTableIndex index B16; + CARD16 pad B16; +} pexGetTableEntryReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 4 */ + pexEnumTypeIndex fpFormat B16; + CARD16 valueType B16; + pexLookupTable lut B32; + pexTableIndex start B16; + CARD16 count B16; +} pexGetTableEntriesReq; + + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexLookupTable lut B32; + pexTableIndex start B16; + CARD16 count B16; +/* LISTof TableEntry( count ) */ +} pexSetTableEntriesReq; + + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 3 */ + pexLookupTable lut B32; + pexTableIndex start B16; + CARD16 count B16; +} pexDeleteTableEntriesReq; + + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 6 */ + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexPC pc B32; + pexBitmask itemMask[3]; /* pexBitmask Array */ + /* SINGLE PipelineContextAttributes( itemMask ) */ +} pexCreatePipelineContextReq; + + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 6 */ + pexPC src B32; + pexPC dst B32; + pexBitmask itemMask[3]; /* pexBitmask Array */ +} pexCopyPipelineContextReq; + +typedef pexResourceReq pexFreePipelineContextReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 6 */ + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexPC pc B32; + pexBitmask itemMask[3]; /* pexBitmask Array */ +} pexGetPipelineContextReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexPC pc B32; + pexBitmask itemMask[3]; /* pexBitmask Array */ + /* SINGLE PipelineContextAttributes( itemMask ) */ +} pexChangePipelineContextReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexRenderer rdr B32; + Drawable drawable B32; + pexBitmask itemMask B32; + /* SINGLE RendererAttributes( itemMask ) */ +} pexCreateRendererReq; + +typedef pexResourceReq pexFreeRendererReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexRenderer rdr B32; + pexBitmask itemMask B32; + /* SINGLE RendererAttributes( itemMask ) */ +} pexChangeRendererReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 4 */ + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexRenderer rdr B32; + pexBitmask itemMask B32; +} pexGetRendererAttributesReq; + +typedef pexResourceReq pexGetRendererDynamicsReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 3 */ + pexRenderer rdr B32; + Drawable drawable B32; +} pexBeginRenderingReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 3 */ + pexRenderer rdr B32; + pexSwitch flushFlag; + BYTE pad[3]; +} pexEndRenderingReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 3 */ + pexRenderer rdr B32; + pexStructure sid B32; +} pexBeginStructureReq; + +typedef pexResourceReq pexEndStructureReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexRenderer rdr B32; + CARD32 numCommands B32; + /* LISTof OutputCommand( numCommands ) */ +} pexRenderOutputCommandsReq; +/* individual output commands may be found in the section "Output Commands" */ + + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 4 */ + pexRenderer rdr B32; + Drawable drawable B32; + pexStructure sid B32; +} pexRenderNetworkReq; + +typedef pexResourceReq pexCreateStructureReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 3 */ + pexStructure src B32; + pexStructure dst B32; +} pexCopyStructureReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + CARD32 numStructures B32; + /* LISTof pexStructure( numStructures ) */ +} pexDestroyStructuresReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 3 */ + pexEnumTypeIndex fpFormat B16; + CARD16 itemMask B16; + pexStructure sid B32; +} pexGetStructureInfoReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 7 */ + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexStructure sid B32; + pexElementRange range; +} pexGetElementInfoReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 3 */ + pexStructure sid B32; + CARD16 which B16; + CARD16 pad B16; +} pexGetStructuresInNetworkReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 4 */ + pexStructure sid B32; + CARD16 pathOrder B16; + CARD16 unused B16; + CARD32 pathDepth B32; +} pexGetAncestorsReq; + +typedef pexGetAncestorsReq pexGetDescendantsReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 7 */ + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexStructure sid B32; + pexElementRange range; +} pexFetchElementsReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 3 */ + pexStructure sid B32; + CARD16 mode B16; + CARD16 pad B16; +} pexSetEditingModeReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 4 */ + pexStructure sid B32; + pexElementPos position; +} pexSetElementPointerReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 4 */ + pexStructure sid B32; + INT32 label B32; + INT32 offset B32; +} pexSetElementPointerAtLabelReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + pexStructure sid B32; + pexElementPos position; + CARD32 direction B32; + CARD32 numIncls B32; + CARD32 numExcls B32; + /* LISTof CARD16( numIncls ) */ + /* pad( numIncls*2 ) */ + /* LISTof CARD16( numExcls ) */ + /* pad( numExcls*2 ) */ +} pexElementSearchReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexStructure sid B32; + CARD32 numCommands B32; + /* LISTof OutputCommand( numCommands ) */ +} pexStoreElementsReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 6 */ + pexStructure sid B32; + pexElementRange range; +} pexDeleteElementsReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 5 */ + pexStructure sid B32; + pexElementPos position; + INT32 label B32; +} pexDeleteElementsToLabelReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 4 */ + pexStructure sid B32; + INT32 label1 B32; + INT32 label2 B32; +} pexDeleteBetweenLabelsReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 9 */ + pexStructure src B32; + pexElementRange srcRange; + pexStructure dst B32; + pexElementPos dstPosition; +} pexCopyElementsReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 3 */ + pexStructure old_id B32; + pexStructure new_id B32; +} pexChangeStructureRefsReq; + +typedef pexResourceReq pexCreateNameSetReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 3 */ + pexNameSet src B32; + pexNameSet dst B32; +} pexCopyNameSetReq; + +typedef pexResourceReq pexFreeNameSetReq; + +typedef pexResourceReq pexGetNameSetReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + pexNameSet ns B32; + CARD16 action B16; + CARD16 unused B16; + /* LISTof pexName() */ +} pexChangeNameSetReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexSC sc B32; + pexBitmask itemMask B32; + /* SINGLE SearchContextAttributes( itemMask ) */ +} pexCreateSearchContextReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 4 */ + pexSC src B32; + pexSC dst B32; + pexBitmask itemMask B32; +} pexCopySearchContextReq; + +typedef pexResourceReq pexFreeSearchContextReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 4 */ + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexSC sc B32; + pexBitmask itemMask B32; +} pexGetSearchContextReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexSC sc B32; + pexBitmask itemMask B32; + /* SINGLE SearchContextAttributes( itemMask ) */ +} pexChangeSearchContextReq; + +typedef pexResourceReq pexSearchNetworkReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 19 */ + pexPhigsWks wks B32; + Drawable drawable B32; + pexLookupTable markerBundle B32; + pexLookupTable textBundle B32; + pexLookupTable lineBundle B32; + pexLookupTable interiorBundle B32; + pexLookupTable edgeBundle B32; + pexLookupTable colourTable B32; + pexLookupTable depthCueTable B32; + pexLookupTable lightTable B32; + pexLookupTable colourApproxTable B32; + pexLookupTable patternTable B32; + pexLookupTable textFontTable B32; + pexNameSet highlightIncl B32; + pexNameSet highlightExcl B32; + pexNameSet invisIncl B32; + pexNameSet invisExcl B32; + CARD16 bufferMode B16; + CARD16 pad B16; +} pexCreatePhigsWksReq; + +typedef pexResourceReq pexFreePhigsWksReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 5 */ + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexPhigsWks wks B32; + pexBitmask itemMask[2] B32; +} pexGetWksInfoReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 2 */ + Drawable drawable B32; +} pexGetDynamicsReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 3 */ + pexEnumTypeIndex fpFormat B16; + pexTableIndex index B16; + pexPhigsWks wks B32; +} pexGetViewRepReq; + +typedef pexResourceReq pexRedrawAllStructuresReq; + +typedef pexResourceReq pexUpdateWorkstationReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + pexPhigsWks wks B32; + CARD32 numRects B32; + /* LISTof pexDeviceRect( numRects ) */ +} pexRedrawClipRegionReq; + +typedef pexResourceReq pexExecuteDeferredActionsReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 4 */ + pexPhigsWks wks B32; + pexTableIndex index1 B16; + pexTableIndex index2 B16; + CARD16 priority B16; + CARD16 pad B16; +} pexSetViewPriorityReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 3 */ + pexPhigsWks wks B32; + pexEnumTypeIndex displayUpdate B16; + CARD16 pad B16; +} pexSetDisplayUpdateModeReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexPhigsWks wks B32; + CARD32 numCoords B32; + /* LISTof pexDeviceCoord( numCoords ) */ +} pexMapDCtoWCReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + pexEnumTypeIndex fpFormat B16; + CARD16 index B16; + pexPhigsWks wks B32; + CARD32 numCoords B32; + /* LISTof pexCoord3D( numCoords ) */ +} pexMapWCtoDCReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 43 */ + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexPhigsWks wks B32; + pexViewRep viewRep; +} pexSetViewRepReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 9 */ + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexPhigsWks wks B32; + pexNpcSubvolume npcSubvolume; +} pexSetWksWindowReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 8 */ + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexPhigsWks wks B32; + pexViewport viewport; +} pexSetWksViewportReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 3 */ + pexPhigsWks wks B32; + pexEnumTypeIndex mode B16; + CARD16 pad B16; +} pexSetHlhsrModeReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 3 */ + pexPhigsWks wks B32; + CARD16 bufferMode B16; + CARD16 pad B16; +} pexSetWksBufferModeReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 5 */ + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexPhigsWks wks B32; + pexStructure sid B32; + PEXFLOAT priority; +} pexPostStructureReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 3 */ + pexPhigsWks wks B32; + pexStructure sid B32; +} pexUnpostStructureReq; + +typedef pexResourceReq pexUnpostAllStructuresReq; + +typedef pexResourceReq pexGetWksPostingsReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 4 */ + pexEnumTypeIndex fpFormat B16; + pexEnumTypeIndex devType B16; + pexPhigsWks wks B32; + pexBitmask itemMask B32; +} pexGetPickDeviceReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + pexEnumTypeIndex fpFormat B16; + CARD16 unused B16; + pexPhigsWks wks B32; + pexEnumTypeIndex devType B16; + CARD16 unused2 B16; + pexBitmask itemMask B32; + /* SINGLE PickDeviceAttributes( itemMask ) */ +} pexChangePickDeviceReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 4 */ + pexPhigsWks wks B32; + pexPickMeasure pm; + pexEnumTypeIndex devType B16; + CARD16 pad B16; +} pexCreatePickMeasureReq; + +typedef pexResourceReq pexFreePickMeasureReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; /* 3 */ + pexPickMeasure pm B32; + pexBitmask itemMask B32; +} pexGetPickMeasureReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + pexPickMeasure pm B32; + CARD32 numBytes B32; + /* LISTof CARD8( numBytes ) -- don't swap */ + /* pad( numBytes ) */ +} pexUpdatePickMeasureReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + pexFont font B32; + CARD32 numBytes B32; + /* LISTof CARD8( numBytes ) -- don't swap */ + /* pad( numBytes ) */ +} pexOpenFontReq; + +typedef pexResourceReq pexCloseFontReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + pexFont font B32; +} pexQueryFontReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + CARD16 maxNames B16; + CARD16 numChars B16; + /* LISTof CARD8( numChars ) -- don't swap */ + /* pad( numBytes ) */ +} pexListFontsReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + CARD16 unused B16; + CARD16 maxNames B16; + CARD16 numChars B16; + CARD16 pad B16; + /* LISTof CARD8( numChars ) */ + /* pad( numBytes ) */ +} pexListFontsWithInfoReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + pexEnumTypeIndex fpFormat B16; + CARD16 textPath B16; + pexTableIndex fontGroupIndex B16; + CARD16 unused B16; + XID id B32; /* renderer, wks, or text font lut */ + PEXFLOAT charExpansion; + PEXFLOAT charSpacing; + PEXFLOAT charHeight; + pexTextAlignmentData textAlignment; + CARD32 numStrings B32; + /* LISTof LISTof MONO_ENCODINGS() */ + /* pad() */ +} pexQueryTextExtentsReq; + +/***************************************************************** + * Output Commands + *****************************************************************/ + +typedef struct { + pexElementInfo head; + pexEnumTypeIndex markerType B16; + CARD16 pad B16; +} pexMarkerType; + +typedef struct { + pexElementInfo head; + PEXFLOAT scale; +} pexMarkerScale; + +typedef struct { + pexElementInfo head; + pexTableIndex index B16; + CARD16 pad B16; +} pexMarkerBundleIndex; + +typedef pexMarkerBundleIndex pexMarkerColourIndex; +typedef pexMarkerBundleIndex pexTextColourIndex; +typedef pexMarkerBundleIndex pexLineColourIndex; +typedef pexMarkerBundleIndex pexSurfaceColourIndex; +typedef pexMarkerBundleIndex pexBfSurfaceColourIndex; +typedef pexMarkerBundleIndex pexSurfaceEdgeColourIndex; + +typedef pexMarkerBundleIndex pexTextFontIndex; + +typedef struct { + pexElementInfo head; + pexColourSpecifier colourSpec; + /* SINGLE COLOUR() */ +} pexMarkerColour; + +typedef pexMarkerColour pexTextColour; +typedef pexMarkerColour pexLineColour; +typedef pexMarkerColour pexSurfaceColour; +typedef pexMarkerColour pexBfSurfaceColour; +typedef pexMarkerColour pexSurfaceEdgeColour; + +typedef struct { + pexElementInfo head; + pexEnumTypeIndex style B16; + CARD16 pad B16; +} pexAtextStyle; + +typedef pexMarkerBundleIndex pexTextBundleIndex; +typedef pexMarkerBundleIndex pexLineBundleIndex; +typedef pexMarkerBundleIndex pexInteriorBundleIndex; +typedef pexMarkerBundleIndex pexInteriorStyleIndex; +typedef pexMarkerBundleIndex pexBfInteriorStyleIndex; +typedef pexMarkerBundleIndex pexEdgeBundleIndex; +typedef pexMarkerBundleIndex pexViewIndex; +typedef pexMarkerBundleIndex pexDepthCueIndex; +typedef pexMarkerBundleIndex pexColourApproxIndex; + +typedef struct { + pexElementInfo head; + CARD16 precision B16; + CARD16 pad B16; +} pexTextPrecision; + +typedef struct { + pexElementInfo head; + PEXFLOAT expansion; +} pexCharExpansion; + +typedef struct { + pexElementInfo head; + PEXFLOAT spacing; +} pexCharSpacing; + +typedef struct { + pexElementInfo head; + PEXFLOAT height; +} pexCharHeight; +typedef pexCharHeight pexAtextHeight; + +typedef struct { + pexElementInfo head; + pexVector2D up; +} pexCharUpVector; +typedef pexCharUpVector pexAtextUpVector; + +typedef struct { + pexElementInfo head; + CARD16 path B16; + CARD16 pad B16; +} pexTextPath; +typedef pexTextPath pexAtextPath; + +typedef struct { + pexElementInfo head; + pexTextAlignmentData alignment; +} pexTextAlignment; +typedef pexTextAlignment pexAtextAlignment; + +typedef struct { + pexElementInfo head; + pexEnumTypeIndex lineType B16; + CARD16 pad B16; +} pexLineType; + +typedef struct { + pexElementInfo head; + PEXFLOAT width; +} pexLineWidth; +typedef pexLineWidth pexSurfaceEdgeWidth; + +typedef struct { + pexElementInfo head; + pexCurveApprox approx; +} pexCurveApproximation; + +typedef struct { + pexElementInfo head; + pexEnumTypeIndex polylineInterp B16; + CARD16 pad B16; +} pexPolylineInterp; + +typedef struct { + pexElementInfo head; + pexEnumTypeIndex interiorStyle B16; + CARD16 pad B16; +} pexInteriorStyle; +typedef pexInteriorStyle pexBfInteriorStyle; + +typedef struct { + pexElementInfo head; + pexReflectionAttr reflectionAttr; +} pexSurfaceReflAttr; +typedef pexSurfaceReflAttr pexBfSurfaceReflAttr; + +typedef struct { + pexElementInfo head; + pexEnumTypeIndex reflectionModel B16; + CARD16 pad B16; +} pexSurfaceReflModel; +typedef pexSurfaceReflModel pexBfSurfaceReflModel; + +typedef struct { + pexElementInfo head; + pexEnumTypeIndex surfaceInterp B16; + CARD16 pad B16; +} pexSurfaceInterp; +typedef pexSurfaceInterp pexBfSurfaceInterp; + +typedef struct { + pexElementInfo head; + pexSurfaceApprox approx; +} pexSurfaceApproximation; + +typedef struct { + pexElementInfo head; + pexCullMode cullMode B16; + CARD16 pad B16; +} pexCullingMode; + +typedef struct { + pexElementInfo head; + pexSwitch distinguish; + BYTE pad[3]; +} pexDistinguishFlag; + +typedef struct { + pexElementInfo head; + pexVector2D size; +} pexPatternSize; + +typedef struct { + pexElementInfo head; + pexCoord2D point; +} pexPatternRefPt; + +typedef struct { + pexElementInfo head; + pexCoord3D refPt; + pexVector3D vector1; + pexVector3D vector2; +} pexPatternAttr; + +typedef struct { + pexElementInfo head; + pexSwitch onoff; + BYTE pad[3]; +} pexSurfaceEdgeFlag; + +typedef struct { + pexElementInfo head; + pexEnumTypeIndex edgeType B16; + CARD16 pad B16; +} pexSurfaceEdgeType; + +typedef struct { + pexElementInfo head; + pexAsfAttribute attribute B32; + pexAsfValue source; + BYTE pad[3]; +} pexSetAsfValues; + +typedef struct { + pexElementInfo head; + pexComposition compType; + CARD16 unused B16; + pexMatrix matrix; +} pexLocalTransform; + +typedef struct { + pexElementInfo head; + pexComposition compType; + CARD16 unused B16; + pexMatrix3X3 matrix3X3; +} pexLocalTransform2D; + +typedef struct { + pexElementInfo head; + pexMatrix matrix; +} pexGlobalTransform; + +typedef struct { + pexElementInfo head; + pexMatrix3X3 matrix3X3; +} pexGlobalTransform2D; + +typedef struct { + pexElementInfo head; + pexSwitch onoff; + BYTE pad[3]; +} pexModelClip; + +typedef struct { + pexElementInfo head; + pexEnumTypeIndex modelClipOperator B16; + CARD16 numHalfSpaces B16; + /* LISTof pexHalfSpace( numHalfSpaces ) */ +} pexModelClipVolume; + +typedef struct { + pexElementInfo head; + pexEnumTypeIndex modelClipOperator B16; + CARD16 numHalfSpaces B16; + /* LISTof pexHalfSpace2D( numHalfSpaces ) */ +} pexModelClipVolume2D; + +typedef struct { + pexElementInfo head; +} pexRestoreModelClip; + +typedef struct { + pexElementInfo head; + CARD16 numEnable B16; + CARD16 numDisable B16; + /* LISTof pexTableIndex( numEnable ) */ + /* pad( ( numEnable )*2 ) */ + /* LISTof pexTableIndex( numDisable ) */ + /* pad( ( numDisable )*2 ) */ +} pexLightState; + +typedef struct { + pexElementInfo head; + CARD32 pickId B32; +} pexPickId; + +typedef struct { + pexElementInfo head; + CARD32 hlhsrID B32; +} pexHlhsrIdentifier; + +typedef struct { + pexElementInfo head; + pexEnumTypeIndex model B16; + CARD16 pad B16; +} pexRenderingColourModel; + +typedef struct { + pexElementInfo head; + pexEnumTypeIndex characteristics B16; + CARD16 length B16; + /* SINGLEof PARAMETRIC_SURFACE_CHARACTERISTICS */ +} pexParaSurfCharacteristics; + +typedef struct { + pexElementInfo head; + /* LISTof pexName() */ +} pexAddToNameSet; +typedef pexAddToNameSet pexRemoveFromNameSet; + +typedef struct { + pexElementInfo head; + pexStructure id B32; +} pexExecuteStructure; + +typedef struct { + pexElementInfo head; + INT32 label B32; +} pexLabel; + +typedef struct { + pexElementInfo head; + CARD16 numElements B16; + CARD16 unused B16; + /* LISTof CARD8( numElements ) -- don't swap */ + /* pad( numElements ) */ +} pexApplicationData; + +typedef struct { + pexElementInfo head; + CARD32 id B32; + CARD16 numElements B16; + CARD16 unused B16; + /* LISTof CARD8( numElements ) -- don't swap */ + /* pad( numElements ) */ +} pexGse; + +typedef struct { + pexElementInfo head; + /* LISTof pexCoord3D() */ +} pexMarker; + +typedef struct { + pexElementInfo head; + /* LISTof pexCoord2D() */ +} pexMarker2D; + +typedef struct { + pexElementInfo head; + pexCoord3D origin; + pexVector3D vector1; + pexVector3D vector2; + CARD16 numEncodings B16; + CARD16 unused B16; + /* LISTof pexMonoEncoding( numEncodings ) */ +} pexText; + +typedef struct { + pexElementInfo head; + pexCoord2D origin; + CARD16 numEncodings B16; + CARD16 unused B16; + /* LISTof pexMonoEncoding( numEncodings ) */ +} pexText2D; + +typedef struct { + pexElementInfo head; + pexCoord3D origin; + pexCoord3D offset; + CARD16 numEncodings B16; + CARD16 unused B16; + /* LISTof pexMonoEncoding( numEncodings ) */ +} pexAnnotationText; + +typedef struct { + pexElementInfo head; + pexCoord2D origin; + pexCoord2D offset; + CARD16 numEncodings B16; + CARD16 unused B16; + /* LISTof pexMonoEncoding( numEncodings ) */ +} pexAnnotationText2D; + +typedef struct { + pexElementInfo head; + /* LISTof pexCoord3D() */ +} pexPolyline; + +typedef struct { + pexElementInfo head; + /* LISTof pexCoord2D() */ +} pexPolyline2D; + +typedef struct { + pexElementInfo head; + pexColourType colourType B16; + pexBitmaskShort vertexAttribs B16; + CARD32 numLists B32; + /* LISTof CLISTof pexVertex( numLists, vertexAttribs, colourType ) */ +} pexPolylineSet; + +typedef struct { + pexElementInfo head; + CARD16 curveOrder B16; + pexCoordType coordType B16; + PEXFLOAT tmin; + PEXFLOAT tmax; + CARD32 numKnots B32; + CARD32 numPoints B32; + /* LISTof FLOAT( numKnots ) */ + /* LISTof {pexCoord3D|pexCoord4D}( numPoints, coordType ) */ +} pexNurbCurve; + +typedef struct { + pexElementInfo head; + CARD16 shape B16; + pexSwitch ignoreEdges; + CARD8 pad; + /* LISTof pexCoord3D() */ +} pexFillArea; + +typedef struct { + pexElementInfo head; + CARD16 shape B16; + pexSwitch ignoreEdges; + CARD8 unused; + /* LISTof pexCoord2D() */ +} pexFillArea2D; + +typedef struct { + pexElementInfo head; + CARD16 shape B16; + pexSwitch ignoreEdges; + CARD8 unused; + pexColourType colourType B16; + pexBitmaskShort facetAttribs B16; + pexBitmaskShort vertexAttribs B16; + CARD16 unused2 B16; + /* SINGLE Facet( facetAttribs, vertexAttribs, colourType ) */ +} pexExtFillArea; + +typedef struct { + pexElementInfo head; + CARD16 shape B16; + pexSwitch ignoreEdges; + CARD8 contourHint; + CARD32 numLists B32; + /* LISTof CLISTof Coord3D( numLists ) */ +} pexFillAreaSet; + +typedef struct { + pexElementInfo head; + CARD16 shape B16; + pexSwitch ignoreEdges; + CARD8 contourHint; + CARD32 numLists B32; + /* LISTof CLISTof Coord2D( numLists ) */ +} pexFillAreaSet2D; + + +typedef struct { + pexElementInfo head; + CARD16 shape B16; + pexSwitch ignoreEdges; + CARD8 contourHint; + pexColourType colourType B16; + pexBitmaskShort facetAttribs B16; + pexBitmaskShort vertexAttribs B16; + CARD16 unused2 B16; + CARD32 numLists B32; + /* pexOptData( facetAttribs ) */ + /* LISTof CLISTof pexVertex( numLists, vertexAttribs, colourType ) */ +} pexExtFillAreaSet; + +typedef struct { + pexElementInfo head; + pexColourType colourType B16; + pexBitmaskShort facetAttribs B16; + pexBitmaskShort vertexAttribs B16; + CARD16 unused B16; + CARD32 numVertices B32; + /* number of OptData is numVert - 2 */ + /* LISTof pexOptData( facetAttribs, colourType ) */ + /* LISTof pexVertex( numVertices, vertexAttribs, colourType ) */ +} pexTriangleStrip; + +typedef struct { + pexElementInfo head; + pexColourType colourType B16; + CARD16 mPts B16; + CARD16 nPts B16; + pexBitmaskShort facetAttribs B16; + pexBitmaskShort vertexAttribs B16; + CARD16 shape B16; + /* actually, there are (mPts-1)*(nPts-1) opt data entries */ + /* LISTof pexOptData( facetAttribs, colourType ) */ + /* LISTof pexVertex( mPts, nPts, vertexAttribs, colourType ) */ +} pexQuadrilateralMesh; + +typedef struct { + pexElementInfo head; + CARD16 shape B16; + pexColourType colourType B16; + CARD16 FAS_Attributes B16; + CARD16 vertexAttributes B16; + CARD16 edgeAttributes B16; + CARD8 contourHint; + pexSwitch contourCountsFlag; + CARD16 numFAS B16; + CARD16 numVertices B16; + CARD16 numEdges B16; + CARD16 numContours B16; + /* LISTof OPT_DATA( numFAS ) */ + /* LISTof pexVertex( numVertices ) */ + /* LISTof CARD8( numEdges ) */ + /* pad( numEdges ) */ + /* LISTof CLISTof CLISTof CARD16( numFAS, numContours, numEdges ) */ + /* pad */ +} pexSOFAS; + +typedef struct { + pexElementInfo head; + pexCoordType type B16; + CARD16 uOrder B16; + CARD16 vOrder B16; + CARD16 unused B16; + CARD32 numUknots B32; + CARD32 numVknots B32; + CARD16 mPts B16; + CARD16 nPts B16; + CARD32 numLists B32; + /* LISTof FLOAT( numUknots ) */ + /* LISTof FLOAT( numVKnots ) */ + /* LISTof {pexCoord3D|pexCoord4D}( mPts, nPts, surfaceType ) */ + /* LISTof CLISTof pexTrimCurve( numLists ) */ +} pexNurbSurface; + +typedef struct { + pexElementInfo head; + pexCoord3D point1; + pexCoord3D point2; + pexCoord3D point3; + CARD32 dx B32; + CARD32 dy B32; + /* LISTof pexTableIndex( dx, dy ) */ + /* pad( 2*dx*dy ) */ +} pexCellArray; + +typedef struct { + pexElementInfo head; + pexCoord2D point1; + pexCoord2D point2; + CARD32 dx B32; + CARD32 dy B32; + /* LISTof pexTableIndex( dx, dy ) */ + /* pad( 2*dx*dy ) */ +} pexCellArray2D; + +typedef struct { + pexElementInfo head; + pexColourType colourType B16; + CARD16 unused B16; + pexCoord3D point1; + pexCoord3D point2; + pexCoord3D point3; + CARD32 dx B32; + CARD32 dy B32; + /* LISTof pexColourSpecifier( dx, dy ) */ +} pexExtCellArray; + +typedef struct { + pexElementInfo head; + INT32 gdpId B32; + CARD32 numPoints B32; + CARD32 numBytes B32; + /* LISTof pexCoord3D( numPoints ) */ + /* LISTof CARD8( numBytes ) -- don't swap */ + /* pad( numBytes ) */ +} pexGdp; + +typedef struct { + pexElementInfo head; + INT32 gdpId B32; + CARD32 numPoints B32; + CARD32 numBytes B32; + /* LISTof pexCoord2D( numPoints ) */ + /* LISTof CARD8( numBytes ) -- don't swap */ + /* pad( numBytes ) */ +} pexGdp2D; + +#endif /* PEXPROTO_H */ + diff --git a/xie/docs/dec/xie23-src/include/PEX/PEXprotost.h b/xie/docs/dec/xie23-src/include/PEX/PEXprotost.h new file mode 100644 index 0000000..cc107cc --- /dev/null +++ b/xie/docs/dec/xie23-src/include/PEX/PEXprotost.h @@ -0,0 +1,586 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* $XConsortium: PEXprotost.h,v 5.3 91/07/01 16:19:04 hersh Exp $ */ + + +/*********************************************************** +Copyright 1989, 1990, 1991 by Sun Microsystems, Inc. and the X Consortium. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Sun Microsystems, +the X Consortium, and MIT not be used in advertising or publicity +pertaining to distribution of the software without specific, written +prior permission. + +SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT +SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL +DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +#ifndef PEXPROTOSTR_H +#define PEXPROTOSTR_H + +/* Matches revision 5.0P */ + +#include /* defines things like CARD32 */ + + +/* This is FLOAT as defined and used by the Protocol Encoding */ +typedef float PEXFLOAT; + + +typedef CARD32 pexAsfAttribute; +typedef CARD8 pexAsfValue; +typedef CARD32 pexBitmask; +typedef CARD16 pexBitmaskShort; +typedef CARD16 pexCoordType; /* rational, nonrational */ +typedef CARD16 pexComposition; +typedef CARD16 pexCullMode; +typedef BYTE pexDynamicType; +typedef INT16 pexEnumTypeIndex; +typedef XID pexLookupTable; +typedef CARD32 pexName; +typedef XID pexNameSet; +typedef XID pexPC; +typedef XID pexFont; +typedef PEXFLOAT pexMatrix[4][4]; +typedef PEXFLOAT pexMatrix3X3[3][3]; +typedef XID pexPhigsWks; +typedef XID pexPickMeasure; +typedef XID pexRenderer; +typedef XID pexSC; +typedef XID pexStructure; +typedef CARD8 pexSwitch; +typedef CARD16 pexTableIndex; +typedef CARD16 pexTableType; /* could be smaller if it ever helps */ +typedef CARD16 pexTextHAlignment; +typedef CARD16 pexTextVAlignment; +typedef CARD16 pexTypeOrTableIndex; +typedef pexEnumTypeIndex pexColourType; /* ColourType */ + +/* included in others */ +typedef struct { + CARD16 length B16; + /* list of CARD8 -- don't swap */ +} pexString; + +typedef struct { + pexStructure sid B32; + PEXFLOAT priority; +} pexStructureInfo; + +typedef struct { + PEXFLOAT x; + PEXFLOAT y; +} pexVector2D; + +typedef struct { + PEXFLOAT x; + PEXFLOAT y; + PEXFLOAT z; +} pexVector3D; + +/* Coord structures */ + +typedef struct { + PEXFLOAT x; + PEXFLOAT y; +} pexCoord2D; + +typedef struct { + PEXFLOAT x; + PEXFLOAT y; + PEXFLOAT z; +} pexCoord3D; + +typedef struct { + PEXFLOAT x; + PEXFLOAT y; + PEXFLOAT z; + PEXFLOAT w; +} pexCoord4D; + + +/* Colour structures */ +typedef struct { + PEXFLOAT red; + PEXFLOAT green; + PEXFLOAT blue; +} pexRgbFloatColour; + +typedef struct { + PEXFLOAT hue; + PEXFLOAT saturation; + PEXFLOAT value; +} pexHsvColour; + +typedef struct { + PEXFLOAT hue; + PEXFLOAT lightness; + PEXFLOAT saturation; +} pexHlsColour; + +typedef struct { + PEXFLOAT x; + PEXFLOAT y; + PEXFLOAT z; +} pexCieColour; + +typedef struct { + CARD8 red; + CARD8 green; + CARD8 blue; + CARD8 pad; +} pexRgb8Colour; + +typedef struct { + CARD16 red B16; + CARD16 green B16; + CARD16 blue B16; + CARD16 pad B16; +} pexRgb16Colour; + +typedef struct { + pexTableIndex index B16; + CARD16 pad B16; +} pexIndexedColour; + +typedef struct { + union { + pexIndexedColour indexed; + pexRgb8Colour rgb8; + pexRgb16Colour rgb16; + pexRgbFloatColour rgbFloat; + pexHsvColour hsvFloat; + pexHlsColour hlsFloat; + pexCieColour cieFloat; + } format; +} pexColour; + +typedef struct { + PEXFLOAT first; + PEXFLOAT second; + PEXFLOAT third; +} pexFloatColour; + +typedef struct { + pexColourType colourType B16; /* ColourType enumerated type */ + CARD16 unused B16; + /* SINGLE COLOUR(colourType) */ +} pexColourSpecifier; + + +typedef struct { + pexEnumTypeIndex approxMethod B16; + CARD16 unused B16; + PEXFLOAT tolerance; +} pexCurveApprox; + +typedef struct { + INT16 x B16; + INT16 y B16; + PEXFLOAT z; +} pexDeviceCoord; + +typedef struct { + INT16 x B16; + INT16 y B16; +} pexDeviceCoord2D; + +typedef struct { + INT16 xmin B16; + INT16 ymin B16; + INT16 xmax B16; + INT16 ymax B16; +} pexDeviceRect; + +typedef struct { + CARD16 elementType B16; + CARD16 length B16; +} pexElementInfo; + +typedef struct { + CARD16 whence B16; + CARD16 unused B16; + INT32 offset B32; +} pexElementPos; + +typedef struct { + pexElementPos position1; + pexElementPos position2; +} pexElementRange; + +typedef struct { + pexStructure structure B32; + CARD32 offset B32; +} pexElementRef; + +typedef struct { + pexCoord2D lowerLeft; + pexCoord2D upperRight; + pexCoord2D concatpoint; +} pexExtentInfo; + +typedef struct { + pexEnumTypeIndex index B16; + pexString descriptor; +} pexEnumTypeDesc; + +typedef struct { + pexCoord3D point; + pexVector3D vector; +} pexHalfSpace; + +typedef struct { + pexNameSet incl; + pexNameSet excl; +} pexNameSetPair; + +typedef struct { + pexCoord2D point; + pexVector2D vector; +} pexHalfSpace2D; + +typedef struct { + CARD16 composition B16; + CARD16 unused B16; + pexMatrix matrix; +} pexLocalTransform3DData; + +typedef struct { + CARD16 composition B16; + CARD16 unused B16; + pexMatrix3X3 matrix; +} pexLocalTransform2DData; + +typedef struct { + pexCoord3D minval; + pexCoord3D maxval; +} pexNpcSubvolume; + +/* an OPT_DATA structure cannot be defined because it has variable content + * and size. An union structure could be used to define a template for + * the data. However, since unions pad to a fixed amount of space and the + * protocol uses variable lengths, this is not appropriate for protocol + * data types. The most correct way of defining this data is to define + * one data structure for every possible combination of color, normal and + * edge data that could be given with a vertex or facet. + */ + +typedef struct { + pexStructure sid B32; + CARD32 offset B32; + CARD32 pickid B32; +} pexPickPath; + +typedef struct { + pexTextVAlignment vertical B16; + pexTextHAlignment horizontal B16; +} pexTextAlignmentData; + +typedef struct { + pexSwitch visibility; + CARD8 unused; + CARD16 order B16; + pexCoordType type B16; + INT16 approxMethod B16; + PEXFLOAT tolerance; + PEXFLOAT tMin; + PEXFLOAT tMax; + CARD32 numKnots B32; + CARD32 numCoord B32; + /* LISTof FLOAT(numKnots) -- length = order + number of coords */ + /* LISTof {pexCoord3D|pexCoord4D}(numCoord) */ +} pexTrimCurve; + +typedef struct { + PEXFLOAT ambient; + PEXFLOAT diffuse; + PEXFLOAT specular; + PEXFLOAT specularConc; + PEXFLOAT transmission; /* 0.0 = opaque, 1.0 = transparent */ + pexColourSpecifier specularColour; + /* SINGLE COLOUR() */ +} pexReflectionAttr; + +typedef struct { + pexEnumTypeIndex approxMethod B16; + CARD16 unused B16; + PEXFLOAT uTolerance; + PEXFLOAT vTolerance; +} pexSurfaceApprox; + + +typedef struct { + pexCoord3D point; + /* SINGLE OPT_DATA() */ +} pexVertex; + + +typedef struct { + pexDeviceCoord minval; + pexDeviceCoord maxval; + pexSwitch useDrawable; + BYTE pad[3]; +} pexViewport; + +typedef struct { + CARD16 clipFlags B16; + CARD16 unused B16; + pexNpcSubvolume clipLimits; + pexMatrix orientation; + pexMatrix mapping; +} pexViewEntry; + +typedef struct { + pexTableIndex index B16; + CARD16 unused B16; + pexViewEntry view; +} pexViewRep; + +/* + * typedefs for lookup tables + */ + +typedef struct { + CARD16 definableEntries B16; + CARD16 numPredefined B16; + CARD16 predefinedMin B16; + CARD16 predefinedMax B16; +} pexTableInfo; + +typedef struct { + pexEnumTypeIndex lineType B16; + pexEnumTypeIndex polylineInterp B16; + pexCurveApprox curveApprox; + PEXFLOAT lineWidth; + pexColourSpecifier lineColour; + /* SINGLE COLOUR() */ +} pexLineBundleEntry; + +typedef struct { + pexEnumTypeIndex markerType B16; + INT16 unused B16; + PEXFLOAT markerScale; + pexColourSpecifier markerColour; + /* SINGLE COLOUR() */ +} pexMarkerBundleEntry; + +typedef struct { + CARD16 textFontIndex B16; + CARD16 textPrecision B16; + PEXFLOAT charExpansion; + PEXFLOAT charSpacing; + pexColourSpecifier textColour; + /* SINGLE COLOUR() */ +} pexTextBundleEntry; + + +/* + Note that since an InteriorBundleEntry contains 4 embedded instances of + pexColourSpecifier, a variable-sized item, a data structure cannot be + defined for it. +*/ +typedef struct { + pexEnumTypeIndex interiorStyle B16; + INT16 interiorStyleIndex B16; + pexEnumTypeIndex reflectionModel B16; + pexEnumTypeIndex surfaceInterp B16; + pexEnumTypeIndex bfInteriorStyle B16; + INT16 bfInteriorStyleIndex B16; + pexEnumTypeIndex bfReflectionModel B16; + pexEnumTypeIndex bfSurfaceInterp B16; + pexSurfaceApprox surfaceApprox; + /* SINGLE pexColourSpecifier surfaceColour */ + /* SINGLE pexReflectionAttr reflectionAttr */ + /* SINGLE pexColourSpecifier bfSurfaceColour */ + /* SINGLE pexReflectionAttr bfReflectionAttr */ +} pexInteriorBundleEntry; + +typedef struct { + pexSwitch edges; + CARD8 unused; + pexEnumTypeIndex edgeType B16; + PEXFLOAT edgeWidth; + pexColourSpecifier edgeColour; + /* SINGLE COLOUR() */ +} pexEdgeBundleEntry; + +typedef struct { + pexColourType colourType B16; + CARD16 numx B16; + CARD16 numy B16; + CARD16 unused B16; + /* LISTof Colour(numx, numy) 2D array of colours */ +} pexPatternEntry; + +/* a pexColourEntry is just a pexColourSpecifier +*/ + +typedef struct { + CARD32 numFonts B32; + /* LISTof pexFont( numFonts ) */ +} pexTextFontEntry; + +/* a pexViewEntry is defined above */ + +typedef struct { + pexEnumTypeIndex lightType B16; + INT16 unused B16; + pexVector3D direction; + pexCoord3D point; + PEXFLOAT concentration; + PEXFLOAT spreadAngle; + PEXFLOAT attenuation1; + PEXFLOAT attenuation2; + pexColourSpecifier lightColour; + /* SINGLE COLOUR() */ +} pexLightEntry; + +typedef struct { + pexSwitch mode; + CARD8 unused; + CARD16 unused2 B16; + PEXFLOAT frontPlane; + PEXFLOAT backPlane; + PEXFLOAT frontScaling; + PEXFLOAT backScaling; + pexColourSpecifier depthCueColour; + /* SINGLE COLOUR() */ +} pexDepthCueEntry; + +typedef struct { + INT16 approxType; + INT16 approxModel; + CARD16 max1 B16; + CARD16 max2 B16; + CARD16 max3 B16; + CARD8 dither; + CARD8 unused; + CARD32 mult1 B32; + CARD32 mult2 B32; + CARD32 mult3 B32; + PEXFLOAT weight1; + PEXFLOAT weight2; + PEXFLOAT weight3; + CARD32 basePixel B32; +} pexColourApproxEntry; + + +/* Font structures */ + +typedef struct { + Atom name B32; + CARD32 value B32; +} pexFontProp; + +typedef struct { + CARD32 firstGlyph B32; + CARD32 lastGlyph B32; + CARD32 defaultGlyph B32; + pexSwitch allExist; + pexSwitch strokeFont; + CARD16 unused B16; + CARD32 numProps B32; + /* LISTof pexFontProp(numProps) */ +} pexFontInfo; + + +/* Text Structures */ + +typedef struct { + INT16 characterSet B16; + CARD8 characterSetWidth; + CARD8 encodingState; + CARD16 unused B16; + CARD16 numChars; + /* LISTof CHARACTER( numChars ) */ + /* pad */ +} pexMonoEncoding; + +/* CHARACTER is either a CARD8, a CARD16, or a CARD32 */ + + +/* Parametric Surface Characteristics types */ + +/* type 1 None */ + +/* type 2 Implementation Dependent */ + +typedef struct { + CARD16 placementType B16; + CARD16 unused B16; + CARD16 numUcurves B16; + CARD16 numVcurves B16; +} pexPSC_IsoparametricCurves; /* type 3 */ + +typedef struct { + pexCoord3D origin; + pexVector3D direction; + CARD16 numberIntersections B16; + CARD16 pad B16; + /* LISTof pexCoord3D( numIntersections ) */ +} pexPSC_LevelCurves; /* type 4: MC + type 5: WC */ + +/* Pick Device data records */ + +typedef struct { + pexDeviceCoord2D position; + PEXFLOAT distance; +} pexPD_DC_HitBox; /* pick device 1 */ + +typedef pexNpcSubvolume pexPD_NPC_HitVolume; /* pick device 2 */ + + +/* Output Command errors */ + +typedef struct { + CARD8 type; /* 0 */ + CARD8 errorCode; /* 14 */ + CARD16 sequenceNumber B16; + CARD32 resourceId B32; /* renderer or structure */ + CARD16 minorCode B16; + CARD8 majorCode; + CARD8 unused; + CARD16 opcode B16; /* opcode of failed output command */ + CARD16 numCommands B16; /* number successfully done before error */ + BYTE pad[16]; +} pexOutputCommandError; + + + +#endif /* PEXPROTOSTR_H */ diff --git a/xie/docs/dec/xie23-src/include/PEX/pexSwap.h b/xie/docs/dec/xie23-src/include/PEX/pexSwap.h new file mode 100644 index 0000000..77ebbcc --- /dev/null +++ b/xie/docs/dec/xie23-src/include/PEX/pexSwap.h @@ -0,0 +1,79 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* $XConsortium: pexSwap.h,v 5.3 91/07/01 16:19:41 hersh Exp $ */ + +/*********************************************************** +Copyright 1989, 1990, 1991 by Sun Microsystems, Inc. and the X Consortium. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Sun Microsystems, +the X Consortium, and MIT not be used in advertising or publicity +pertaining to distribution of the software without specific, written +prior permission. + +SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT +SHALL SUN MICROSYSTEMS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL +DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/* + * Swapping information used by both the dipex portions of the + * server and by the archive sections of the api. + */ + +#ifndef PEXSWAP_H +#define PEXSWAP_H 1 + +#include + +typedef PEXFLOAT (*ConvFunction)(); +typedef CARD16 (*SwapShortFunction)(); +typedef CARD32 (*SwapLongFunction)(); +typedef ErrorCode (*OCFunction)(); + +typedef struct { + SwapShortFunction ConvertCARD16; + SwapLongFunction ConvertCARD32; + ConvFunction ConvertFLOAT; +} pexSwap; + +extern CARD16 SwapCARD16(); +extern CARD32 SwapCARD32(); +extern PEXFLOAT SwapFLOAT(); +extern PEXFLOAT ConvertFLOAT(); + + +#endif diff --git a/xie/docs/dec/xie23-src/include/XI.h b/xie/docs/dec/xie23-src/include/XI.h new file mode 100644 index 0000000..0c4c44b --- /dev/null +++ b/xie/docs/dec/xie23-src/include/XI.h @@ -0,0 +1,263 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* $Header: /usr/sde/x11/rcs/x11/src/./extensions/include/XI.h,v 1.2 91/12/15 12:42:16 devrcs Exp $ */ + +/************************************************************ +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, California, and the +Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Hewlett-Packard or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +********************************************************/ + +/* Definitions used by the server, library and client */ + +#ifndef _XI_H_ + +#define _XI_H_ + +#define sz_xGetExtensionVersionReq 8 +#define sz_xGetExtensionVersionReply 32 +#define sz_xListInputDevicesReq 4 +#define sz_xListInputDevicesReply 32 +#define sz_xOpenDeviceReq 8 +#define sz_xOpenDeviceReply 32 +#define sz_xCloseDeviceReq 8 +#define sz_xSetDeviceModeReq 8 +#define sz_xSetDeviceModeReply 32 +#define sz_xSelectExtensionEventReq 12 +#define sz_xGetSelectedExtensionEventsReq 8 +#define sz_xGetSelectedExtensionEventsReply 32 +#define sz_xChangeDeviceDontPropagateListReq 12 +#define sz_xGetDeviceDontPropagateListReq 8 +#define sz_xGetDeviceDontPropagateListReply 32 +#define sz_xGetDeviceMotionEventsReq 16 +#define sz_xGetDeviceMotionEventsReply 32 +#define sz_xChangeKeyboardDeviceReq 8 +#define sz_xChangeKeyboardDeviceReply 32 +#define sz_xChangePointerDeviceReq 8 +#define sz_xChangePointerDeviceReply 32 +#define sz_xGrabDeviceReq 20 +#define sz_xGrabDeviceReply 32 +#define sz_xUngrabDeviceReq 12 +#define sz_xGrabDeviceKeyReq 20 +#define sz_xGrabDeviceKeyReply 32 +#define sz_xUngrabDeviceKeyReq 16 +#define sz_xGrabDeviceButtonReq 20 +#define sz_xGrabDeviceButtonReply 32 +#define sz_xUngrabDeviceButtonReq 16 +#define sz_xAllowDeviceEventsReq 12 +#define sz_xGetDeviceFocusReq 8 +#define sz_xGetDeviceFocusReply 32 +#define sz_xSetDeviceFocusReq 16 +#define sz_xGetFeedbackControlReq 8 +#define sz_xGetFeedbackControlReply 32 +#define sz_xChangeFeedbackControlReq 12 +#define sz_xGetDeviceKeyMappingReq 8 +#define sz_xGetDeviceKeyMappingReply 32 +#define sz_xChangeDeviceKeyMappingReq 8 +#define sz_xGetDeviceModifierMappingReq 8 +#define sz_xSetDeviceModifierMappingReq 8 +#define sz_xSetDeviceModifierMappingReply 32 +#define sz_xGetDeviceButtonMappingReq 8 +#define sz_xGetDeviceButtonMappingReply 32 +#define sz_xSetDeviceButtonMappingReq 8 +#define sz_xSetDeviceButtonMappingReply 32 +#define sz_xQueryDeviceStateReq 8 +#define sz_xQueryDeviceStateReply 32 +#define sz_xSendExtensionEventReq 16 +#define sz_xDeviceBellReq 8 +#define sz_xSetDeviceValuatorsReq 8 +#define sz_xSetDeviceValuatorsReply 32 +#define sz_xGetDeviceControlReq 8 +#define sz_xGetDeviceControlReply 32 +#define sz_xChangeDeviceControlReq 8 +#define sz_xChangeDeviceControlReply 32 + +#define INAME "XInputExtension" + +#define XI_KEYBOARD "KEYBOARD" +#define XI_MOUSE "MOUSE" +#define XI_TABLET "TABLET" +#define XI_TOUCHSCREEN "TOUCHSCREEN" +#define XI_TOUCHPAD "TOUCHPAD" +#define XI_BARCODE "BARCODE" +#define XI_BUTTONBOX "BUTTONBOX" +#define XI_KNOB_BOX "KNOB_BOX" +#define XI_ONE_KNOB "ONE_KNOB" +#define XI_NINE_KNOB "NINE_KNOB" +#define XI_TRACKBALL "TRACKBALL" +#define XI_QUADRATURE "QUADRATURE" +#define XI_ID_MODULE "ID_MODULE" +#define XI_SPACEBALL "SPACEBALL" +#define XI_DATAGLOVE "DATAGLOVE" +#define XI_EYETRACKER "EYETRACKER" +#define XI_CURSORKEYS "CURSORKEYS" +#define XI_FOOTMOUSE "FOOTMOUSE" + +#define Dont_Check 0 +#define XInput_Initial_Release 1 +#define XInput_Add_XDeviceBell 2 +#define XInput_Add_XSetDeviceValuators 3 +#define XInput_Add_XChangeDeviceControl 4 + +#define XI_Absent 0 +#define XI_Present 1 + +#define XI_Initial_Release_Major 1 +#define XI_Initial_Release_Minor 0 + +#define XI_Add_XDeviceBell_Major 1 +#define XI_Add_XDeviceBell_Minor 1 + +#define XI_Add_XSetDeviceValuators_Major 1 +#define XI_Add_XSetDeviceValuators_Minor 2 + +#define XI_Add_XChangeDeviceControl_Major 1 +#define XI_Add_XChangeDeviceControl_Minor 3 + +#define DEVICE_RESOLUTION 1 + +#define NoSuchExtension 1 + +#define COUNT 0 +#define CREATE 1 + +#define NewPointer 0 +#define NewKeyboard 1 + +#define XPOINTER 0 +#define XKEYBOARD 1 + +#define UseXKeyboard 0xFF + +#define IsXPointer 0 +#define IsXKeyboard 1 +#define IsXExtensionDevice 2 + +#define AsyncThisDevice 0 +#define SyncThisDevice 1 +#define ReplayThisDevice 2 +#define AsyncOtherDevices 3 +#define AsyncAll 4 +#define SyncAll 5 + +#define FollowKeyboard 3 +#ifndef RevertToFollowKeyboard +#define RevertToFollowKeyboard 3 +#endif + +#define DvAccelNum (1L << 0) +#define DvAccelDenom (1L << 1) +#define DvThreshold (1L << 2) + +#define DvKeyClickPercent (1L<<0) +#define DvPercent (1L<<1) +#define DvPitch (1L<<2) +#define DvDuration (1L<<3) +#define DvLed (1L<<4) +#define DvLedMode (1L<<5) +#define DvKey (1L<<6) +#define DvAutoRepeatMode (1L<<7) + +#define DvString (1L << 0) + +#define DvInteger (1L << 0) + +#define DeviceMode (1L << 0) +#define Relative 0 +#define Absolute 1 + +#define ProximityState (1L << 1) +#define InProximity (0L << 1) +#define OutOfProximity (1L << 1) + +#define AddToList 0 +#define DeleteFromList 1 + +#define KeyClass 0 +#define ButtonClass 1 +#define ValuatorClass 2 +#define FeedbackClass 3 +#define ProximityClass 4 +#define FocusClass 5 +#define OtherClass 6 + +#define KbdFeedbackClass 0 +#define PtrFeedbackClass 1 +#define StringFeedbackClass 2 +#define IntegerFeedbackClass 3 +#define LedFeedbackClass 4 +#define BellFeedbackClass 5 + +#define _devicePointerMotionHint 0 +#define _deviceButton1Motion 1 +#define _deviceButton2Motion 2 +#define _deviceButton3Motion 3 +#define _deviceButton4Motion 4 +#define _deviceButton5Motion 5 +#define _deviceButtonMotion 6 +#define _deviceButtonGrab 7 +#define _deviceOwnerGrabButton 8 +#define _noExtensionEvent 9 + +#define XI_BadDevice 0 +#define XI_BadEvent 1 +#define XI_BadMode 2 +#define XI_DeviceBusy 3 +#define XI_BadClass 4 + +typedef unsigned long XEventClass; + +/******************************************************************* + * + * Extension version structure. + * + */ + +typedef struct { + int present; + short major_version; + short minor_version; +} XExtensionVersion; + +#endif /* _XI_H_ */ diff --git a/xie/docs/dec/xie23-src/include/XInput.h b/xie/docs/dec/xie23-src/include/XInput.h new file mode 100644 index 0000000..a897842 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/XInput.h @@ -0,0 +1,849 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* $Header: /usr/sde/x11/rcs/x11/src/./extensions/include/XInput.h,v 1.2 91/12/15 12:42:16 devrcs Exp $ */ + +/************************************************************ +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, California, and the +Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Hewlett-Packard or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +********************************************************/ + +/* Definitions used by the library and client */ + +#ifndef _XINPUT_H_ +#define _XINPUT_H_ + +#ifndef _XLIB_H_ +#include +#endif + +#ifndef _XI_H_ +#include "XI.h" +#endif + +#define _deviceKeyPress 0 +#define _deviceKeyRelease 1 + +#define _deviceButtonPress 0 +#define _deviceButtonRelease 1 + +#define _deviceMotionNotify 0 + +#define _deviceFocusIn 0 +#define _deviceFocusOut 1 + +#define _proximityIn 0 +#define _proximityOut 1 + +#define _deviceStateNotify 0 +#define _deviceMappingNotify 1 +#define _changeDeviceNotify 2 + +#define FindTypeAndClass(d,type,_class,classid,offset) \ + { int i; XInputClassInfo *ip; \ + type = 0; _class = 0; \ + for (i=0, ip= ((XDevice *) d)->classes; \ + i< ((XDevice *) d)->num_classes; \ + i++, ip++) \ + if (ip->input_class == classid) \ + {type = ip->event_type_base + offset; \ + _class = ((XDevice *) d)->device_id << 8 | type;}} + +#define DeviceKeyPress(d,type,_class) \ + FindTypeAndClass(d, type, _class, KeyClass, _deviceKeyPress) + +#define DeviceKeyRelease(d,type,_class) \ + FindTypeAndClass(d, type, _class, KeyClass, _deviceKeyRelease) + +#define DeviceButtonPress(d,type,_class) \ + FindTypeAndClass(d, type, _class, ButtonClass, _deviceButtonPress) + +#define DeviceButtonRelease(d,type,_class) \ + FindTypeAndClass(d, type, _class, ButtonClass, _deviceButtonRelease) + +#define DeviceMotionNotify(d,type,_class) \ + FindTypeAndClass(d, type, _class, ValuatorClass, _deviceMotionNotify) + +#define DeviceFocusIn(d,type,_class) \ + FindTypeAndClass(d, type, _class, FocusClass, _deviceFocusIn) + +#define DeviceFocusOut(d,type,_class) \ + FindTypeAndClass(d, type, _class, FocusClass, _deviceFocusOut) + +#define ProximityIn(d,type,_class) \ + FindTypeAndClass(d, type, _class, ProximityClass, _proximityIn) + +#define ProximityOut(d,type,_class) \ + FindTypeAndClass(d, type, _class, ProximityClass, _proximityOut) + +#define DeviceStateNotify(d,type,_class) \ + FindTypeAndClass(d, type, _class, OtherClass, _deviceStateNotify) + +#define DeviceMappingNotify(d,type,_class) \ + FindTypeAndClass(d, type, _class, OtherClass, _deviceMappingNotify) + +#define ChangeDeviceNotify(d,type,_class) \ + FindTypeAndClass(d, type, _class, OtherClass, _changeDeviceNotify) + +#define DevicePointerMotionHint(d,type,_class) \ + { _class = ((XDevice *) d)->device_id << 8 | _devicePointerMotionHint;} + +#define DeviceButton1Motion(d,type,_class) \ + { _class = ((XDevice *) d)->device_id << 8 | _deviceButton1Motion;} + +#define DeviceButton2Motion(d,type,_class) \ + { _class = ((XDevice *) d)->device_id << 8 | _deviceButton2Motion;} + +#define DeviceButton3Motion(d,type,_class) \ + { _class = ((XDevice *) d)->device_id << 8 | _deviceButton3Motion;} + +#define DeviceButton4Motion(d,type,class) \ + { _class = ((XDevice *) d)->device_id << 8 | _deviceButton4Motion;} + +#define DeviceButton5Motion(d,type,_class) \ + { _class = ((XDevice *) d)->device_id << 8 | _deviceButton5Motion;} + +#define DeviceButtonMotion(d,type,class) \ + { _class = ((XDevice *) d)->device_id << 8 | _deviceButtonMotion;} + +#define DeviceOwnerGrabButton(d,type,_class) \ + { _class = ((XDevice *) d)->device_id << 8 | _deviceOwnerGrabButton;} + +#define DeviceButtonPressGrab(d,type,_class) \ + { _class = ((XDevice *) d)->device_id << 8 | _deviceButtonGrab;} + +#define NoExtensionEvent(d,type,_class) \ + { _class = ((XDevice *) d)->device_id << 8 | _noExtensionEvent;} + +#define BadDevice(dpy,error) _xibaddevice(dpy, &error) + +#define BadClass(dpy,error) _xibadclass(dpy, &error) + +#define BadEvent(dpy,error) _xibadevent(dpy, &error) + +#define BadMode(dpy,error) _xibadmode(dpy, &error) + +#define DeviceBusy(dpy,error) _xidevicebusy(dpy, &error) + +/*************************************************************** + * + * DeviceKey events. These events are sent by input devices that + * support input class Keys. + * The location of the X pointer is reported in the coordinate + * fields of the x,y and x_root,y_root fields. + * + */ + +typedef struct + { + int type; /* of event */ + unsigned long serial; /* # of last request processed */ + Bool send_event; /* true if from SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window reported relative to */ + XID deviceid; + Window root; /* root window event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* x, y coordinates in event window */ + int x_root; /* coordinates relative to root */ + int y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + unsigned int keycode; /* detail */ + Bool same_screen; /* same screen flag */ + unsigned int device_state; /* device key or button mask */ + unsigned char axes_count; + unsigned char first_axis; + int axis_data[6]; + } XDeviceKeyEvent; + +typedef XDeviceKeyEvent XDeviceKeyPressedEvent; +typedef XDeviceKeyEvent XDeviceKeyReleasedEvent; + +/******************************************************************* + * + * DeviceButton events. These events are sent by extension devices + * that support input class Buttons. + * + */ + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window reported relative to */ + XID deviceid; + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* x, y coordinates in event window */ + int x_root; /* coordinates relative to root */ + int y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + unsigned int button; /* detail */ + Bool same_screen; /* same screen flag */ + unsigned int device_state; /* device key or button mask */ + unsigned char axes_count; + unsigned char first_axis; + int axis_data[6]; + } XDeviceButtonEvent; + +typedef XDeviceButtonEvent XDeviceButtonPressedEvent; +typedef XDeviceButtonEvent XDeviceButtonReleasedEvent; + +/******************************************************************* + * + * DeviceMotionNotify event. These events are sent by extension devices + * that support input class Valuators. + * + */ + +typedef struct + { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window reported relative to */ + XID deviceid; + Window root; /* root window that the event occured on */ + Window subwindow; /* child window */ + Time time; /* milliseconds */ + int x, y; /* x, y coordinates in event window */ + int x_root; /* coordinates relative to root */ + int y_root; /* coordinates relative to root */ + unsigned int state; /* key or button mask */ + char is_hint; /* detail */ + Bool same_screen; /* same screen flag */ + unsigned int device_state; /* device key or button mask */ + unsigned char axes_count; + unsigned char first_axis; + int axis_data[6]; + } XDeviceMotionEvent; + +/******************************************************************* + * + * DeviceFocusChange events. These events are sent when the focus + * of an extension device that can be focused is changed. + * + */ + +typedef struct + { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* "event" window reported relative to */ + XID deviceid; + int mode; /* NotifyNormal, NotifyGrab, NotifyUngrab */ + int detail; + /* + * NotifyAncestor, NotifyVirtual, NotifyInferior, + * NotifyNonLinear,NotifyNonLinearVirtual, NotifyPointer, + * NotifyPointerRoot, NotifyDetailNone + */ + Time time; + } XDeviceFocusChangeEvent; + +typedef XDeviceFocusChangeEvent XDeviceFocusInEvent; +typedef XDeviceFocusChangeEvent XDeviceFocusOutEvent; + +/******************************************************************* + * + * ProximityNotify events. These events are sent by those absolute + * positioning devices that are capable of generating proximity information. + * + */ + +typedef struct + { + int type; /* ProximityIn or ProximityOut */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + XID deviceid; + Window root; + Window subwindow; + Time time; + int x, y; + int x_root, y_root; + unsigned int state; + Bool same_screen; + unsigned int device_state; /* device key or button mask */ + unsigned char axes_count; + unsigned char first_axis; + int axis_data[6]; + } XProximityNotifyEvent; +typedef XProximityNotifyEvent XProximityInEvent; +typedef XProximityNotifyEvent XProximityOutEvent; + +/******************************************************************* + * + * DeviceStateNotify events are generated on EnterWindow and FocusIn + * for those clients who have selected DeviceState. + * + */ + +typedef struct + { +#if defined(__cplusplus) || defined(c_plusplus) + unsigned char c_class; +#else + unsigned char class; +#endif + unsigned char length; + } XInputClass; + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; + XID deviceid; + Time time; + int num_classes; + char data[64]; +} XDeviceStateNotifyEvent; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + unsigned char c_class; +#else + unsigned char class; +#endif + unsigned char length; + unsigned char num_valuators; + unsigned char mode; + int valuators[6]; +} XValuatorStatus; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + unsigned char c_class; +#else + unsigned char class; +#endif + unsigned char length; + short num_keys; + char keys[32]; +} XKeyStatus; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + unsigned char c_class; +#else + unsigned char class; +#endif + unsigned char length; + short num_buttons; + char buttons[32]; +} XButtonStatus; + +/******************************************************************* + * + * DeviceMappingNotify event. This event is sent when the key mapping, + * modifier mapping, or button mapping of an extension device is changed. + * + */ + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* unused */ + XID deviceid; + Time time; + int request; /* one of MappingModifier, MappingKeyboard, + MappingPointer */ + int first_keycode;/* first keycode */ + int count; /* defines range of change w. first_keycode*/ +} XDeviceMappingEvent; + +/******************************************************************* + * + * ChangeDeviceNotify event. This event is sent when an + * XChangeKeyboard or XChangePointer request is made. + * + */ + +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* unused */ + XID deviceid; + Time time; + int request; /* NewPointer or NewKeyboard */ +} XChangeDeviceNotifyEvent; + +/******************************************************************* + * + * Control structures for input devices that support input class + * Feedback. These are used by the XGetFeedbackControl and + * XChangeFeedbackControl functions. + * + */ + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; +} XFeedbackState; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int click; + int percent; + int pitch; + int duration; + int led_mask; + int global_auto_repeat; + char auto_repeats[32]; +} XKbdFeedbackState; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int accelNum; + int accelDenom; + int threshold; +} XPtrFeedbackState; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int resolution; + int minVal; + int maxVal; +} XIntegerFeedbackState; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int max_symbols; + int num_syms_supported; + KeySym *syms_supported; +} XStringFeedbackState; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int percent; + int pitch; + int duration; +} XBellFeedbackState; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int led_values; + int led_mask; +} XLedFeedbackState; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; +} XFeedbackControl; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int accelNum; + int accelDenom; + int threshold; +} XPtrFeedbackControl; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int click; + int percent; + int pitch; + int duration; + int led_mask; + int led_value; + int key; + int auto_repeat_mode; +} XKbdFeedbackControl; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int num_keysyms; + KeySym *syms_to_display; +} XStringFeedbackControl; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int int_to_display; +} XIntegerFeedbackControl; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int percent; + int pitch; + int duration; +} XBellFeedbackControl; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + XID id; + int led_mask; + int led_values; +} XLedFeedbackControl; + +/******************************************************************* + * + * Device control structures. + * + */ + +typedef struct { + XID control; + int length; +} XDeviceControl; + +typedef struct { + XID control; + int length; + int first_valuator; + int num_valuators; + int *resolutions; +} XDeviceResolutionControl; + +typedef struct { + XID control; + int length; + int num_valuators; + int *resolutions; + int *min_resolutions; + int *max_resolutions; +} XDeviceResolutionState; + +/******************************************************************* + * + * An array of XDeviceList structures is returned by the + * XListInputDevices function. Each entry contains information + * about one input device. Among that information is an array of + * pointers to structures that describe the characteristics of + * the input device. + * + */ + +typedef struct _XAnyClassinfo *XAnyClassPtr; + +typedef struct _XAnyClassinfo { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + } XAnyClassInfo; + +typedef struct _XDeviceInfo *XDeviceInfoPtr; + +typedef struct _XDeviceInfo + { + XID id; + Atom type; + char *name; + int num_classes; + int use; + XAnyClassPtr inputclassinfo; + } XDeviceInfo; + +typedef struct _XKeyInfo *XKeyInfoPtr; + +typedef struct _XKeyInfo + { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + unsigned short min_keycode; + unsigned short max_keycode; + unsigned short num_keys; + } XKeyInfo; + +typedef struct _XButtonInfo *XButtonInfoPtr; + +typedef struct _XButtonInfo { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + short num_buttons; + } XButtonInfo; + +typedef struct _XAxisInfo *XAxisInfoPtr; + +typedef struct _XAxisInfo { + int resolution; + int min_value; + int max_value; + } XAxisInfo; + +typedef struct _XValuatorInfo *XValuatorInfoPtr; + +typedef struct _XValuatorInfo + { +#if defined(__cplusplus) || defined(c_plusplus) + XID c_class; +#else + XID class; +#endif + int length; + unsigned char num_axes; + unsigned char mode; + unsigned long motion_buffer; + XAxisInfoPtr axes; + } XValuatorInfo; + + +/******************************************************************* + * + * An XDevice structure is returned by the XOpenDevice function. + * It contains an array of pointers to XInputClassInfo structures. + * Each contains information about a class of input supported by the + * device, including a pointer to an array of data for each type of event + * the device reports. + * + */ + + +typedef struct { + unsigned char input_class; + unsigned char event_type_base; +} XInputClassInfo; + +typedef struct { + XID device_id; + int num_classes; + XInputClassInfo *classes; +} XDevice; + + +/******************************************************************* + * + * The following structure is used to return information for the + * XGetSelectedExtensionEvents function. + * + */ + +typedef struct { + XEventClass event_type; + XID device; +} XEventList; + +/******************************************************************* + * + * The following structure is used to return motion history data from + * an input device that supports the input class Valuators. + * This information is returned by the XGetDeviceMotionEvents function. + * + */ + +typedef struct { + Time time; + int *data; +} XDeviceTimeCoord; + + +/******************************************************************* + * + * Device state structure. + * This is returned by the XQueryDeviceState request. + * + */ + +typedef struct { + XID device_id; + int num_classes; + XInputClass *data; +} XDeviceState; + +/******************************************************************* + * + * Note that the mode field is a bitfield that reports the Proximity + * status of the device as well as the mode. The mode field should + * be OR'd with the mask DeviceMode and compared with the values + * Absolute and Relative to determine the mode, and should be OR'd + * with the mask ProximityState and compared with the values InProximity + * and OutOfProximity to determine the proximity state. + * + */ + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + unsigned char c_class; +#else + unsigned char class; +#endif + unsigned char length; + unsigned char num_valuators; + unsigned char mode; + int *valuators; +} XValuatorState; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + unsigned char c_class; +#else + unsigned char class; +#endif + unsigned char length; + short num_keys; + char keys[32]; +} XKeyState; + +typedef struct { +#if defined(__cplusplus) || defined(c_plusplus) + unsigned char c_class; +#else + unsigned char class; +#endif + unsigned char length; + short num_buttons; + char buttons[32]; +} XButtonState; + +/******************************************************************* + * + * Function definitions. + * + */ + +XDevice *XOpenDevice(); +XDeviceInfo *XListInputDevices(); +XDeviceTimeCoord *XGetDeviceMotionEvents(); +KeySym *XGetDeviceKeyMapping(); +XModifierKeymap *XGetDeviceModifierMapping(); +XFeedbackState *XGetFeedbackControl(); +XExtensionVersion *XGetExtensionVersion(); +XDeviceState *XQueryDeviceState(); +XEventClass *XGetDeviceDontPropagateList(); +#endif /* _XINPUT_H_ */ diff --git a/xie/docs/dec/xie23-src/include/XIproto.h b/xie/docs/dec/xie23-src/include/XIproto.h new file mode 100644 index 0000000..ac4dd00 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/XIproto.h @@ -0,0 +1,1425 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* $Header: /usr/sde/x11/rcs/x11/src/./extensions/include/XIproto.h,v 1.2 91/12/15 12:42:16 devrcs Exp $ */ + +/************************************************************ +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, California, and the +Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Hewlett-Packard or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +HEWLETT-PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +HEWLETT-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +********************************************************/ + +#ifndef _XIPROTO_H +#define _XIPROTO_H + +#ifndef NEED_EVENTS +#define NEED_EVENTS +#endif +#ifndef NEED_REPLIES +#define NEED_REPLIES +#endif +#include +#include + +/********************************************************* + * + * number of events, errors, and extension name. + * + */ + +#define MORE_EVENTS 0x80 +#define DEVICE_BITS 0x7F + +#define InputClassBits 0x3F /* bits in mode field for input classes */ +#define ModeBitsShift 6 /* amount to shift the remaining bits */ + +#define numInputClasses 7 + +#define IEVENTS 15 +#define IERRORS 5 + +#define CLIENT_REQ 1 + +typedef struct _XExtEventInfo + { + Mask mask; + BYTE type; + BYTE word; + } XExtEventInfo; + +typedef unsigned char *Pointer; + +struct tmask + { + Mask mask; + Pointer dev; + }; + +/********************************************************* + * + * Event constants used by library. + * + */ + +#define XI_DeviceValuator 0 +#define XI_DeviceKeyPress 1 +#define XI_DeviceKeyRelease 2 +#define XI_DeviceButtonPress 3 +#define XI_DeviceButtonRelease 4 +#define XI_DeviceMotionNotify 5 +#define XI_DeviceFocusIn 6 +#define XI_DeviceFocusOut 7 +#define XI_ProximityIn 8 +#define XI_ProximityOut 9 +#define XI_DeviceStateNotify 10 +#define XI_DeviceMappingNotify 11 +#define XI_ChangeDeviceNotify 12 +#define XI_DeviceKeystateNotify 13 +#define XI_DeviceButtonstateNotify 14 + +/********************************************************* + * + * Protocol request constants + * + */ + +#define X_GetExtensionVersion 1 +#define X_ListInputDevices 2 +#define X_OpenDevice 3 +#define X_CloseDevice 4 +#define X_SetDeviceMode 5 +#define X_SelectExtensionEvent 6 +#define X_GetSelectedExtensionEvents 7 +#define X_ChangeDeviceDontPropagateList 8 +#define X_GetDeviceDontPropagateList 9 +#define X_GetDeviceMotionEvents 10 +#define X_ChangeKeyboardDevice 11 +#define X_ChangePointerDevice 12 +#define X_GrabDevice 13 +#define X_UngrabDevice 14 +#define X_GrabDeviceKey 15 +#define X_UngrabDeviceKey 16 +#define X_GrabDeviceButton 17 +#define X_UngrabDeviceButton 18 +#define X_AllowDeviceEvents 19 +#define X_GetDeviceFocus 20 +#define X_SetDeviceFocus 21 +#define X_GetFeedbackControl 22 +#define X_ChangeFeedbackControl 23 +#define X_GetDeviceKeyMapping 24 +#define X_ChangeDeviceKeyMapping 25 +#define X_GetDeviceModifierMapping 26 +#define X_SetDeviceModifierMapping 27 +#define X_GetDeviceButtonMapping 28 +#define X_SetDeviceButtonMapping 29 +#define X_QueryDeviceState 30 +#define X_SendExtensionEvent 31 +#define X_DeviceBell 32 +#define X_SetDeviceValuators 33 +#define X_GetDeviceControl 34 +#define X_ChangeDeviceControl 35 + +/********************************************************* + * + * Protocol request and reply structures. + * + * GetExtensionVersion. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_GetExtensionVersion */ + CARD16 length B16; + CARD16 nbytes B16; + CARD8 pad1, pad2; +} xGetExtensionVersionReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_GetExtensionVersion */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 major_version B16; + CARD16 minor_version B16; + BOOL present; + CARD8 pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; +} xGetExtensionVersionReply; + +/********************************************************* + * + * ListInputDevices. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_ListInputDevices */ + CARD16 length B16; +} xListInputDevicesReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_ListInputDevices */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 ndevices B32; + CARD8 pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; +} xListInputDevicesReply; + +typedef struct _xDeviceInfo *xDeviceInfoPtr; + +typedef struct _xAnyClassinfo *xAnyClassPtr; + +typedef struct _xAnyClassinfo { + CARD8 class; + CARD8 length; + } xAnyClassInfo; + +typedef struct _xDeviceInfo { + CARD32 type B32; + CARD8 id; + CARD8 num_classes; + CARD8 use; + CARD8 pad1; + } xDeviceInfo; + +typedef struct _xKeyInfo *xKeyInfoPtr; + +typedef struct _xKeyInfo { + CARD8 class; + CARD8 length; + KeyCode min_keycode; + KeyCode max_keycode; + CARD16 num_keys B16; + CARD8 pad1,pad2; + } xKeyInfo; + +typedef struct _xButtonInfo *xButtonInfoPtr; + +typedef struct _xButtonInfo { + CARD8 class; + CARD8 length; + CARD16 num_buttons B16; + } xButtonInfo; + +typedef struct _xValuatorInfo *xValuatorInfoPtr; + +typedef struct _xValuatorInfo { + CARD8 class; + CARD8 length; + CARD8 num_axes; + CARD8 mode; + CARD32 motion_buffer_size B32; + } xValuatorInfo; + +typedef struct _xAxisInfo *xAxisInfoPtr; + +typedef struct _xAxisInfo { + CARD32 resolution B32; + CARD32 min_value B32; + CARD32 max_value B32; + } xAxisInfo; + +/********************************************************* + * + * OpenDevice. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_OpenDevice */ + CARD16 length B16; + CARD8 deviceid; + BYTE pad1, pad2, pad3; +} xOpenDeviceReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_OpenDevice */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 num_classes; + BYTE pad1, pad2, pad3; + CARD32 pad00 B32; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + } xOpenDeviceReply; + +typedef struct { + CARD8 class; + CARD8 event_type_base; + } xInputClassInfo; + +/********************************************************* + * + * CloseDevice. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_CloseDevice */ + CARD16 length B16; + CARD8 deviceid; + BYTE pad1, pad2, pad3; +} xCloseDeviceReq; + +/********************************************************* + * + * SetDeviceMode. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_SetDeviceMode */ + CARD16 length B16; + CARD8 deviceid; + CARD8 mode; + BYTE pad1, pad2; +} xSetDeviceModeReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_SetDeviceMode */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 status; + BYTE pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; +} xSetDeviceModeReply; + +/********************************************************* + * + * SelectExtensionEvent. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_SelectExtensionEvent */ + CARD16 length B16; + Window window B32; + CARD16 count B16; + CARD16 pad00 B16; +} xSelectExtensionEventReq; + +/********************************************************* + * + * GetSelectedExtensionEvent. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* X_GetSelectedExtensionEvents */ + CARD16 length B16; + Window window B32; +} xGetSelectedExtensionEventsReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* GetSelectedExtensionEvents */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 this_client_count B16; + CARD16 all_clients_count B16; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; +} xGetSelectedExtensionEventsReply; + +/********************************************************* + * + * ChangeDeviceDontPropagateList. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* X_ChangeDeviceDontPropagateList */ + CARD16 length B16; + Window window B32; + CARD16 count B16; + CARD8 mode; + BYTE pad; +} xChangeDeviceDontPropagateListReq; + +/********************************************************* + * + * GetDeviceDontPropagateList. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* X_GetDeviceDontPropagateList */ + CARD16 length B16; + Window window B32; +} xGetDeviceDontPropagateListReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* GetDeviceDontPropagateList */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 count B16; + CARD16 pad00 B16; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; + } xGetDeviceDontPropagateListReply; + +/********************************************************* + * + * GetDeviceMotionEvents. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_GetDeviceMotionEvents*/ + CARD16 length B16; + Time start B32; + Time stop B32; + CARD8 deviceid; + BYTE pad1, pad2, pad3; +} xGetDeviceMotionEventsReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_GetDeviceMotionEvents */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 nEvents B32; + CARD8 axes; + CARD8 mode; + BYTE pad1, pad2; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; +} xGetDeviceMotionEventsReply; + +/********************************************************* + * + * ChangeKeyboardDevice. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* X_ChangeKeyboardDevice */ + CARD16 length B16; + CARD8 deviceid; + BYTE pad1, pad2, pad3; +} xChangeKeyboardDeviceReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_ChangeKeyboardDevice*/ + CARD16 sequenceNumber B16; + CARD32 length B32; /* 0 */ + CARD8 status; + BYTE pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; + } xChangeKeyboardDeviceReply; + +/********************************************************* + * + * ChangePointerDevice. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* X_ChangePointerDevice */ + CARD16 length B16; + CARD8 xaxis; + CARD8 yaxis; + CARD8 deviceid; + BYTE pad1; +} xChangePointerDeviceReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_ChangePointerDevice */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* 0 */ + CARD8 status; + BYTE pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; + } xChangePointerDeviceReply; + +/********************************************************* + * + * GrabDevice. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_GrabDevice */ + CARD16 length B16; + Window grabWindow B32; + Time time B32; + CARD16 event_count B16; + CARD8 this_device_mode; + CARD8 other_devices_mode; + BOOL ownerEvents; + CARD8 deviceid; + CARD16 pad01 B16; +} xGrabDeviceReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_GrabDevice */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* 0 */ + CARD8 status; + BYTE pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; + } xGrabDeviceReply; + +/********************************************************* + * + * UngrabDevice. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_UnGrabDevice */ + CARD16 length B16; + Time time B32; + CARD8 deviceid; + BYTE pad1, pad2, pad3; +} xUngrabDeviceReq; + +/********************************************************* + * + * GrabDeviceKey. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_GrabDeviceKey */ + CARD16 length B16; + Window grabWindow B32; + CARD16 event_count B16; + CARD16 modifiers B16; + CARD8 modifier_device; + CARD8 grabbed_device; + CARD8 key; + BYTE this_device_mode; + BYTE other_devices_mode; + BOOL ownerEvents; + BYTE pad1, pad2; +} xGrabDeviceKeyReq; + +/********************************************************* + * + * UngrabDeviceKey. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_UngrabDeviceKey */ + CARD16 length B16; + Window grabWindow B32; + CARD16 modifiers B16; + CARD8 modifier_device; + CARD8 key; + CARD8 grabbed_device; + BYTE pad1, pad2, pad3; +} xUngrabDeviceKeyReq; + +/********************************************************* + * + * GrabDeviceButton. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_GrabDeviceButton */ + CARD16 length B16; + Window grabWindow B32; + CARD8 grabbed_device; + CARD8 modifier_device; + CARD16 event_count B16; + CARD16 modifiers B16; + BYTE this_device_mode; + BYTE other_devices_mode; + CARD8 button; + BOOL ownerEvents; + BYTE pad1, pad2; +} xGrabDeviceButtonReq; + +/********************************************************* + * + * UngrabDeviceButton. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_UngrabDeviceButton */ + CARD16 length B16; + Window grabWindow B32; + CARD16 modifiers B16; + CARD8 modifier_device; + CARD8 button; + CARD8 grabbed_device; + BYTE pad1, pad2, pad3; +} xUngrabDeviceButtonReq; + +/********************************************************* + * + * AllowDeviceEvents. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_AllowDeviceEvents */ + CARD16 length B16; + Time time B32; + CARD8 mode; + CARD8 deviceid; + BYTE pad1, pad2; +} xAllowDeviceEventsReq; + +/********************************************************* + * + * GetDeviceFocus. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_GetDeviceFocus */ + CARD16 length B16; + CARD8 deviceid; + BYTE pad1, pad2, pad3; +} xGetDeviceFocusReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_GetDeviceFocus */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 focus B32; + Time time B32; + CARD8 revertTo; + BYTE pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + } xGetDeviceFocusReply; + +/********************************************************* + * + * SetDeviceFocus. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_SetDeviceFocus */ + CARD16 length B16; + Window focus B32; + Time time B32; + CARD8 revertTo; + CARD8 device; + CARD16 pad01 B16; +} xSetDeviceFocusReq; + +/********************************************************* + * + * GetFeedbackControl. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* X_GetFeedbackControl */ + CARD16 length B16; + CARD8 deviceid; + BYTE pad1, pad2, pad3; +} xGetFeedbackControlReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_GetFeedbackControl */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 num_feedbacks B16; + CARD16 pad01 B16; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; + CARD32 pad06 B32; +} xGetFeedbackControlReply; + +typedef struct { + CARD8 class; /* feedback class */ + CARD8 id; /* feedback id */ + CARD16 length B16; /* feedback length */ +} xFeedbackState; + +typedef struct { + CARD8 class; + CARD8 id; + CARD16 length B16; + CARD16 pitch B16; + CARD16 duration B16; + CARD32 led_mask B32; + CARD32 led_values B32; + BOOL global_auto_repeat; + CARD8 click; + CARD8 percent; + BYTE pad; + BYTE auto_repeats[32]; +} xKbdFeedbackState; + +typedef struct { + CARD8 class; + CARD8 id; + CARD16 length B16; + CARD8 pad1,pad2; + CARD16 accelNum B16; + CARD16 accelDenom B16; + CARD16 threshold B16; +} xPtrFeedbackState; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; + CARD16 length B16; /* feedback length */ + CARD32 resolution B32; + INT32 min_value B32; + INT32 max_value B32; +} xIntegerFeedbackState; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; + CARD16 length B16; /* feedback length */ + CARD16 max_symbols B16; + CARD16 num_syms_supported B16; +} xStringFeedbackState; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; + CARD16 length B16; /* feedback length */ + CARD8 percent; + BYTE pad1, pad2, pad3; + CARD16 pitch B16; + CARD16 duration B16; +} xBellFeedbackState; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; + CARD16 length B16; /* feedback length */ + CARD32 led_mask B32; + CARD32 led_values B32; +} xLedFeedbackState; + +/********************************************************* + * + * ChangeFeedbackControl. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* X_ChangeFeedbackControl */ + CARD16 length B16; + CARD32 mask B32; + CARD8 deviceid; + CARD8 feedbackid; + BYTE pad1, pad2; +} xChangeFeedbackControlReq; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; /* feedback id */ + CARD16 length B16; /* feedback length */ +} xFeedbackCtl; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; /* feedback length */ + CARD16 length B16; /* feedback length */ + KeyCode key; + CARD8 auto_repeat_mode; + INT8 click; + INT8 percent; + INT16 pitch B16; + INT16 duration B16; + CARD32 led_mask B32; + CARD32 led_values B32; +} xKbdFeedbackCtl; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; /* feedback id */ + CARD16 length B16; /* feedback length */ + CARD8 pad1,pad2; + INT16 num B16; + INT16 denom B16; + INT16 thresh B16; +} xPtrFeedbackCtl; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; /* feedback id */ + CARD16 length B16; /* feedback length */ + INT32 int_to_display B32; +} xIntegerFeedbackCtl; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; /* feedback id */ + CARD16 length B16; /* feedback length */ + CARD8 pad1,pad2; + CARD16 num_keysyms B16; +} xStringFeedbackCtl; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; /* feedback id */ + CARD16 length B16; /* feedback length */ + INT8 percent; + BYTE pad1, pad2, pad3; + INT16 pitch B16; + INT16 duration B16; +} xBellFeedbackCtl; + +typedef struct { + CARD8 class; /* feedback class id */ + CARD8 id; /* feedback id */ + CARD16 length B16; /* feedback length */ + CARD32 led_mask B32; + CARD32 led_values B32; +} xLedFeedbackCtl; + +/********************************************************* + * + * GetDeviceKeyMapping. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_GetDeviceKeyMapping */ + CARD16 length B16; + CARD8 deviceid; + KeyCode firstKeyCode; + CARD8 count; + BYTE pad1; +} xGetDeviceKeyMappingReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_GetDeviceKeyMapping */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 keySymsPerKeyCode; + CARD8 pad0; + CARD16 pad1 B16; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xGetDeviceKeyMappingReply; + +/********************************************************* + * + * ChangeDeviceKeyMapping. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_ChangeDeviceKeyMapping */ + CARD16 length B16; + CARD8 deviceid; + KeyCode firstKeyCode; + CARD8 keySymsPerKeyCode; + CARD8 keyCodes; +} xChangeDeviceKeyMappingReq; + +/********************************************************* + * + * GetDeviceModifierMapping. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_GetDeviceModifierMapping */ + CARD16 length B16; + CARD8 deviceid; + BYTE pad1, pad2, pad3; +} xGetDeviceModifierMappingReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_GetDeviceModifierMapping */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 numKeyPerModifier; + CARD8 pad0; + CARD16 pad1 B16; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xGetDeviceModifierMappingReply; + +/********************************************************* + * + * SetDeviceModifierMapping. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_SetDeviceModifierMapping */ + CARD16 length B16; + CARD8 deviceid; + CARD8 numKeyPerModifier; + CARD16 pad1 B16; +} xSetDeviceModifierMappingReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_SetDeviceModifierMapping */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 success; + CARD8 pad0; + CARD16 pad1 B16; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xSetDeviceModifierMappingReply; + +/********************************************************* + * + * GetDeviceButtonMapping. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* X_GetDeviceButtonMapping */ + CARD16 length B16; + CARD8 deviceid; + BYTE pad1, pad2, pad3; +} xGetDeviceButtonMappingReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_GetDeviceButtonMapping */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 nElts; + BYTE pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; +} xGetDeviceButtonMappingReply; + +/********************************************************* + * + * SetDeviceButtonMapping. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* X_SetDeviceButtonMapping */ + CARD16 length B16; + CARD8 deviceid; + CARD8 map_length; + BYTE pad1, pad2; +} xSetDeviceButtonMappingReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_SetDeviceButtonMapping */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 status; + BYTE pad0; + CARD16 pad1 B16; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xSetDeviceButtonMappingReply; + +/********************************************************* + * + * QueryDeviceState. + * + */ + +typedef struct { + CARD8 reqType; + CARD8 ReqType; /* always X_QueryDeviceState */ + CARD16 length B16; + CARD8 deviceid; + BYTE pad1, pad2, pad3; +} xQueryDeviceStateReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_QueryDeviceState */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 num_classes; + BYTE pad0; + CARD16 pad1 B16; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xQueryDeviceStateReply; + +typedef struct { + CARD8 class; + CARD8 length; + CARD8 num_keys; + BYTE pad1; + CARD8 keys[32]; +} xKeyState; + +typedef struct { + CARD8 class; + CARD8 length; + CARD8 num_buttons; + BYTE pad1; + CARD8 buttons[32]; +} xButtonState; + +typedef struct { + CARD8 class; + CARD8 length; + CARD8 num_valuators; + CARD8 mode; +} xValuatorState; + +/********************************************************* + * + * SendExtensionEvent. + * THIS REQUEST MUST BE KEPT A MULTIPLE OF 8 BYTES IN LENGTH! + * MORE EVENTS MAY FOLLOW AND THEY MUST BE QUAD-ALIGNED! + * + */ + +typedef struct { + CARD8 reqType; + CARD8 ReqType; /* always X_SendExtensionEvent */ + CARD16 length B16; + Window destination B32; + CARD8 deviceid; + BOOL propagate; + CARD16 count B16; + CARD8 num_events; + BYTE pad1,pad2,pad3; +} xSendExtensionEventReq; + +/********************************************************* + * + * DeviceBell. + * + */ + +typedef struct { + CARD8 reqType; + CARD8 ReqType; /* always X_DeviceBell */ + CARD16 length B16; + CARD8 deviceid; + CARD8 feedbackid; + CARD8 feedbackclass; + INT8 percent; +} xDeviceBellReq; + +/********************************************************* + * + * SetDeviceValuators. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_SetDeviceValuators */ + CARD16 length B16; + CARD8 deviceid; + CARD8 first_valuator; + CARD8 num_valuators; + BYTE pad1; +} xSetDeviceValuatorsReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_SetDeviceValuators */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 status; + BYTE pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; +} xSetDeviceValuatorsReply; + +/********************************************************* + * + * GetDeviceControl. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_GetDeviceControl */ + CARD16 length B16; + CARD16 control B16; + CARD8 deviceid; + BYTE pad2; +} xGetDeviceControlReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_GetDeviceControl */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 status; + BYTE pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; +} xGetDeviceControlReply; + +typedef struct { + CARD16 control B16; /* control type */ + CARD16 length B16; /* control length */ +} xDeviceState; + +typedef struct { + CARD16 control B16; /* control type */ + CARD16 length B16; /* control length */ + CARD32 num_valuators B32; /* number of valuators */ +} xDeviceResolutionState; + +/********************************************************* + * + * ChangeDeviceControl. + * + */ + +typedef struct { + CARD8 reqType; /* input extension major code */ + CARD8 ReqType; /* always X_ChangeDeviceControl */ + CARD16 length B16; + CARD16 control B16; + CARD8 deviceid; + CARD8 num_valuators; +} xChangeDeviceControlReq; + +typedef struct { + CARD8 repType; /* X_Reply */ + CARD8 RepType; /* always X_ChangeDeviceControl */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 status; + BYTE pad1, pad2, pad3; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; +} xChangeDeviceControlReply; + +typedef struct { + CARD16 control B16; /* control type */ + CARD16 length B16; /* control length */ +} xDeviceCtl; + +typedef struct { + CARD16 control B16; /* control type */ + CARD16 length B16; /* control length */ + CARD8 first_valuator; /* first valuator to change */ + CARD8 num_valuators; /* number of valuators to change*/ + CARD8 pad1,pad2; +} xDeviceResolutionCtl; + +/********************************************************** + * + * Input extension events. + * + * DeviceValuator + * + */ + +typedef struct + { + BYTE type; + CARD8 deviceid; + CARD16 sequenceNumber B16; + KeyButMask device_state B16; + CARD8 num_valuators; + CARD8 first_valuator; + INT32 valuator0 B32; + INT32 valuator1 B32; + INT32 valuator2 B32; + INT32 valuator3 B32; + INT32 valuator4 B32; + INT32 valuator5 B32; + } deviceValuator; + +/********************************************************** + * + * DeviceKeyButtonPointer. + * + * Used for: DeviceKeyPress, DeviceKeyRelease, + * DeviceButtonPress, DeviceButtonRelease, + * ProximityIn, ProximityOut + * DeviceMotionNotify, + * + */ + +typedef struct + { + BYTE type; + BYTE detail; + CARD16 sequenceNumber B16; + Time time B32; + Window root B32; + Window event B32; + Window child B32; + INT16 root_x B16; + INT16 root_y B16; + INT16 event_x B16; + INT16 event_y B16; + KeyButMask state B16; + BOOL same_screen; + CARD8 deviceid; + } deviceKeyButtonPointer; + +/********************************************************** + * + * DeviceFocus. + * + */ + +typedef struct + { + BYTE type; + BYTE detail; + CARD16 sequenceNumber B16; + Time time B32; + Window window B32; + BYTE mode; + CARD8 deviceid; + BYTE pad1, pad2; + CARD32 pad00 B32; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + } deviceFocus; + +/********************************************************** + * + * DeviceStateNotify. + * + * Note that the two high-order bits in the classes_reported + * field are the proximity state (InProximity or OutOfProximity), + * and the device mode (Absolute or Relative), respectively. + * + */ + +typedef struct + { + BYTE type; + BYTE deviceid; + CARD16 sequenceNumber B16; + Time time B32; + CARD8 num_keys; + CARD8 num_buttons; + CARD8 num_valuators; + CARD8 classes_reported; + CARD8 buttons[4]; + CARD8 keys[4]; + INT32 valuator0 B32; + INT32 valuator1 B32; + INT32 valuator2 B32; + } deviceStateNotify; + +/********************************************************** + * + * DeviceKeyStateNotify. + * + */ + +typedef struct + { + BYTE type; + BYTE deviceid; + CARD16 sequenceNumber B16; + CARD8 keys[28]; + } deviceKeyStateNotify; + +/********************************************************** + * + * DeviceButtonStateNotify. + * + */ + +typedef struct + { + BYTE type; + BYTE deviceid; + CARD16 sequenceNumber B16; + CARD8 buttons[28]; + } deviceButtonStateNotify; + +/********************************************************** + * + * DeviceMappingNotify. + * Fields must be kept in sync with core mappingnotify event. + * + */ + +typedef struct + { + BYTE type; + BYTE deviceid; + CARD16 sequenceNumber B16; + CARD8 request; + KeyCode firstKeyCode; + CARD8 count; + BYTE pad1; + Time time B32; + CARD32 pad00 B32; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + } deviceMappingNotify; + +/********************************************************** + * + * ChangeDeviceNotify. + * + */ + +typedef struct + { + BYTE type; + BYTE deviceid; + CARD16 sequenceNumber B16; + Time time B32; + CARD8 request; + BYTE pad1, pad2, pad3; + CARD32 pad00 B32; + CARD32 pad01 B32; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + } changeDeviceNotify; + +#endif diff --git a/xie/docs/dec/xie23-src/include/XShm.h b/xie/docs/dec/xie23-src/include/XShm.h new file mode 100644 index 0000000..485fb87 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/XShm.h @@ -0,0 +1,174 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/************************************************************ +Copyright 1989 by The Massachusetts Institute of Technology + +Permission to use, copy, modify, and distribute this +software and its documentation for any purpose and without +fee is hereby granted, provided that the above copyright +no- tice appear in all copies and that both that copyright +no- tice and this permission notice appear in supporting +docu- mentation, and that the name of MIT not be used in +advertising or publicity pertaining to distribution of the +software without specific prior written permission. +M.I.T. makes no representation about the suitability of +this software for any purpose. It is provided "as is" +without any express or implied warranty. + +********************************************************/ + +/* THIS IS NOT AN X CONSORTIUM STANDARD */ + +/* $XConsortium: XShm.h,v 1.5 91/07/12 09:54:34 rws Exp $ */ + +#ifndef _XSHM_H_ +#define _XSHM_H_ + +#include + +#define X_ShmQueryVersion 0 +#define X_ShmAttach 1 +#define X_ShmDetach 2 +#define X_ShmPutImage 3 +#define X_ShmGetImage 4 +#define X_ShmCreatePixmap 5 + +#define ShmCompletion 0 +#define ShmNumberEvents (ShmCompletion + 1) + +#define BadShmSeg 0 +#define ShmNumberErrors (BadShmSeg + 1) + +typedef unsigned int ShmSeg; + +#ifndef _XSHM_SERVER_ +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came frome a SendEvent request */ + Display *display; /* Display the event was read from */ + Drawable drawable; /* drawable of request */ + int major_code; /* ShmReqCode */ + int minor_code; /* X_ShmPutImage */ + ShmSeg shmseg; /* the ShmSeg used in the request */ + unsigned long offset; /* the offset into ShmSeg used in the request */ +} XShmCompletionEvent; + +typedef struct { + ShmSeg shmseg; /* resource id */ + int shmid; /* kernel id */ + char *shmaddr; /* address in client */ + Bool readOnly; /* how the server should attach it */ +} XShmSegmentInfo; + +_XFUNCPROTOBEGIN + +Bool XShmQueryVersion( +#if NeedFunctionPrototypes + Display* /* dpy */, + int* /* majorVersion */, + int* /* minorVersion */, + Bool* /* sharedPixmaps */ +#endif +); + +int XShmPixmapFormat( +#if NeedFunctionPrototypes + Display* /* dpy */ +#endif +); + +Status XShmAttach( +#if NeedFunctionPrototypes + Display* /* dpy */, + XShmSegmentInfo* /* shminfo */ +#endif +); + +Status XShmDetach( +#if NeedFunctionPrototypes + Display* /* dpy */, + XShmSegmentInfo* /* shminfo */ +#endif +); + +Status XShmPutImage( +#if NeedFunctionPrototypes + Display* /* dpy */, + Drawable /* d */, + GC /* gc */, + XImage* /* image */, + int /* src_x */, + int /* src_y */, + int /* dst_x */, + int /* dst_y */, + unsigned int /* src_width */, + unsigned int /* src_height */, + Bool /* send_event */ +#endif +); + +Status XShmGetImage( +#if NeedFunctionPrototypes + Display* /* dpy */, + Drawable /* d */, + XImage* /* image */, + int /* x */, + int /* y */, + unsigned long /* plane_mask */ +#endif +); + +XImage *XShmCreateImage( +#if NeedFunctionPrototypes + Display* /* dpy */, + Visual* /* visual */, + unsigned int /* depth */, + int /* format */, + char* /* data */, + XShmSegmentInfo* /* shminfo */, + unsigned int /* width */, + unsigned int /* height */ +#endif +); + +Pixmap XShmCreatePixmap( +#if NeedFunctionPrototypes + Display* /* dpy */, + Drawable /* d */, + char* /* data */, + XShmSegmentInfo* /* shminfo */, + unsigned int /* width */, + unsigned int /* height */, + unsigned int /* depth */ +#endif +); + +_XFUNCPROTOEND + +#endif + +#endif diff --git a/xie/docs/dec/xie23-src/include/XTest.h b/xie/docs/dec/xie23-src/include/XTest.h new file mode 100644 index 0000000..0e7a71f --- /dev/null +++ b/xie/docs/dec/xie23-src/include/XTest.h @@ -0,0 +1,151 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* $XConsortium: XTest.h,v 1.4 92/04/20 13:13:54 rws Exp $ */ +/* + +Copyright 1992 by the Massachusetts Institute of Technology + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation, and that the name of M.I.T. not be used in advertising or +publicity pertaining to distribution of the software without specific, +written prior permission. M.I.T. makes no representations about the +suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +*/ + +#ifndef _XTEST_H_ +#define _XTEST_H_ + +#include + +#define X_XTestGetVersion 0 +#define X_XTestCompareCursor 1 +#define X_XTestFakeInput 2 + +#define XTestNumberEvents 0 + +#define XTestNumberErrors 0 + +#define XTestMajorVersion 2 +#define XTestMinorVersion 1 + +#define XTestExtensionName "XTEST" + +#ifndef _XTEST_SERVER_ + +_XFUNCPROTOBEGIN + +Bool XTestQueryExtension( +#if NeedFunctionPrototypes + Display* /* dpy */, + int* /* event_basep */, + int* /* error_basep */, + int* /* majorp */, + int* /* minorp */ +#endif +); + +Bool XTestCompareCursorWithWindow( +#if NeedFunctionPrototypes + Display* /* dpy */, + Window /* window */, + Cursor /* cursor */ +#endif +); + +Bool XTestCompareCurrentCursorWithWindow( +#if NeedFunctionPrototypes + Display* /* dpy */, + Window /* window */ +#endif +); + +extern XTestFakeKeyEvent( +#if NeedFunctionPrototypes + Display* /* dpy */, + unsigned int /* keycode */, + Bool /* is_press */, + unsigned long /* delay */ +#endif +); + +extern XTestFakeButtonEvent( +#if NeedFunctionPrototypes + Display* /* dpy */, + unsigned int /* button */, + Bool /* is_press */, + unsigned long /* delay */ +#endif +); + +extern XTestFakeMotionEvent( +#if NeedFunctionPrototypes + Display* /* dpy */, + int /* screen */, + int /* x */, + int /* y */, + unsigned long /* delay */ +#endif +); + +extern XTestFakeRelativeMotionEvent( +#if NeedFunctionPrototypes + Display* /* dpy */, + int /* x */, + int /* y */, + unsigned long /* delay */ +#endif +); + +void XTestSetGContextOfGC( +#if NeedFunctionPrototypes + GC /* gc */, + GContext /* gid */ +#endif +); + +void XTestSetVisualIDOfVisual( +#if NeedFunctionPrototypes + Visual* /* visual */, + VisualID /* visualid */ +#endif +); + +Status XTestDiscard( +#if NeedFunctionPrototypes + Display* /* dpy */ +#endif +); + +_XFUNCPROTOEND + +#endif /* _XTEST_SERVER_ */ + +#endif diff --git a/xie/docs/dec/xie23-src/include/Xext.h b/xie/docs/dec/xie23-src/include/Xext.h new file mode 100644 index 0000000..0e277f2 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/Xext.h @@ -0,0 +1,74 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* + * $XConsortium: Xext.h,v 1.2 91/07/12 10:28:17 rws Exp $ + * + * Copyright 1989 Massachusetts Institute of Technology + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _XEXT_H_ +#define _XEXT_H_ + +#include + +_XFUNCPROTOBEGIN + +extern int (*XSetExtensionErrorHandler())( +#if NeedFunctionPrototypes + int (*handler)() +#endif +); + +extern int XMissingExtension( +#if NeedFunctionPrototypes + Display* /* dpy */, + _Xconst char* /* ext_name */ +#endif +); + +_XFUNCPROTOEND + +#define X_EXTENSION_UNKNOWN "unknown" +#define X_EXTENSION_MISSING "missing" + +#endif /* _XEXT_H_ */ diff --git a/xie/docs/dec/xie23-src/include/XieAppl.h b/xie/docs/dec/xie23-src/include/XieAppl.h new file mode 100644 index 0000000..1908e40 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/XieAppl.h @@ -0,0 +1,295 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/******************************************************************************* +** Copyright 1989-1991 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Image Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** The Xie module contains definitions used by all of the XIE layers +** -- from the applications level through the XIE server levels. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Richard J. Piccolo +** Robert NC Shelley +** +** CREATION DATE: +** +** April 20, 1989 +** +************************************************************************/ + + /* + ** Symbol XIEAPPL allows XieAppl.h to be included multiple times. + */ +#ifndef XIEAPPL +#define XIEAPPL /* The "endif" MUST be the last line of this file. */ + +/***************************************************************************** +** Constants +*****************************************************************************/ + /* + ** X Image Extension name string + */ +#define XieS_Name "Xie" + + /* + ** Number of supported Events and Errors + */ +#define XieK_NumErrors 0 +#define XieK_NumEvents 3 + /* + ** Xie Event constants + */ +#define XieK_ComputationEvent 0 +#define XieK_PhotofloEvent 1 +#define XieK_DisplayEvent 2 + /* + ** Xie Event masks + */ +#define XieM_ComputationEvent (1< +#else +#include +#endif +#endif /* XIEAPPL */ + +/* +** MACRO definitions +*/ + /* + ** Return the minimum number of bits required to contain the specified + ** number of levels. Levels == 0 indicates unconstrained data of type + ** float. <<<< remember to include math.h >>>> + */ +#define BitsFromLevels_(levels) \ + ((levels) > 2 ? ((int)(ceil(log10((double)levels)/log10(2.0)))) : \ + (levels) > 0 ? 1 : sizeof(float) * 8) + /* + ** Determine if a value is a valid pointer or an error code. + ** <<<< remember to include X.h >>>> + */ +#ifdef BadImplementation +#define IsPointer_(ptr) (((unsigned long)(ptr)) > BadImplementation) +#endif + /* + ** Convenience macros for accessing generic UdpPtr fields. + */ +#define upPxlLen_(udp) ((udp)->UdpW_PixelLength) +#define upDType_(udp) ((udp)->UdpB_DType) +#define upClass_(udp) ((udp)->UdpB_Class) +#define upBase_(udp) ((udp)->UdpA_Base) +#define upArSize_(udp) ((udp)->UdpL_ArSize) +#define upPxlStr_(udp) ((udp)->UdpL_PxlStride) +#define upScnStr_(udp) ((udp)->UdpL_ScnStride) +#define upX1_(udp) ((udp)->UdpL_X1) +#define upX2_(udp) ((udp)->UdpL_X2) +#define upY1_(udp) ((udp)->UdpL_Y1) +#define upY2_(udp) ((udp)->UdpL_Y2) +#define upWidth_(udp) ((udp)->UdpL_PxlPerScn) +#define upHeight_(udp) ((udp)->UdpL_ScnCnt) +#define upPos_(udp) ((udp)->UdpL_Pos) +#define upCmpIdx_(udp) ((udp)->UdpL_CompIdx) +#define upLvl_(udp) ((udp)->UdpL_Levels) + /* + ** Convenience macros for accessing generic UdpRec fields. + */ +#define urPxlLen_(udp) ((udp).UdpW_PixelLength) +#define urDType_(udp) ((udp).UdpB_DType) +#define urClass_(udp) ((udp).UdpB_Class) +#define urBase_(udp) ((udp).UdpA_Base) +#define urArSize_(udp) ((udp).UdpL_ArSize) +#define urPxlStr_(udp) ((udp).UdpL_PxlStride) +#define urScnStr_(udp) ((udp).UdpL_ScnStride) +#define urX1_(udp) ((udp).UdpL_X1) +#define urX2_(udp) ((udp).UdpL_X2) +#define urY1_(udp) ((udp).UdpL_Y1) +#define urY2_(udp) ((udp).UdpL_Y2) +#define urWidth_(udp) ((udp).UdpL_PxlPerScn) +#define urHeight_(udp) ((udp).UdpL_ScnCnt) +#define urPos_(udp) ((udp).UdpL_Pos) +#define urCmpIdx_(udp) ((udp).UdpL_CompIdx) +#define urLvl_(udp) ((udp).UdpL_Levels) + + /* + ** The _MD forms access memory in machine-dependant (bigendian or + ** littleendian) format. The other forms access memory in + ** image format, which is always little endian. + */ +#ifdef vax +#define READ32_(address) \ + (*((int *)(address))) +#define READ32_MD READ32_ +#else + /* + ** For machine architectures that can't access longwords + ** on non-longword aligned boundaries. + ** The (unsigned int) casts seem redundant, but they are needed + ** to make the ULTRIX/RISC compiler happy. + */ +#define READ32_(address) \ + ((unsigned int) *((unsigned char *)(address)) + \ + ((unsigned int) *(((unsigned char *)(address))+1)<< 8) + \ + ((unsigned int) *(((unsigned char *)(address))+2)<<16) + \ + ((unsigned int) *(((unsigned char *)(address))+3)<<24)) +#endif + +#ifdef BIGENDIAN +#define READ32_MD(address) \ + (*(((unsigned char *)(address))+3) + \ + (*(((unsigned char *)(address))+2)<< 8) + \ + (*(((unsigned char *)(address))+1)<<16) + \ + (* ((unsigned char *)(address)) <<24)) +#else +#define READ32_MD READ32_ +#endif + +#define GET_VALUE_(base,offset,mask) \ + (READ32_((base)+((offset)>>3))>>((offset)&7)&(mask)) +#define GET_VALUE_MD(base,offset,mask) \ + (READ32_MD((base)+((offset)>>3))>>((offset)&7)&(mask)) + +#ifdef vax +#define WRITE32_(address,value) \ + (*((int *)(address)) = (int)(value)) +#define WRITE32_MD WRITE32_ +#else +#define WRITE32_(address,value) \ + ((* ((unsigned char *)(address)) = ((int)(value)) &0xff), \ + (*(((unsigned char *)(address))+1) = (((int)(value))>> 8)&0xff), \ + (*(((unsigned char *)(address))+2) = (((int)(value))>>16)&0xff), \ + (*(((unsigned char *)(address))+3) = (((int)(value))>>24)&0xff)) +#ifdef BIGENDIAN +#define WRITE32_MD(address,value) \ + ((*(((unsigned char *)(address))+3) = ((int)(value)) &0xff), \ + (*(((unsigned char *)(address))+2) = (((int)(value))>> 8)&0xff), \ + (*(((unsigned char *)(address))+1) = (((int)(value))>>16)&0xff), \ + (* ((unsigned char *)(address)) = (((int)(value))>>24)&0xff)) +#else +#define WRITE32_MD WRITE32_ +#endif +#endif + +#ifdef vax +#define XOR_WRITE32_(address,value) \ + (*((int *)(address)) ^= (int)(value)) +#define XOR_WRITE32_MD XOR_WRITE32_ +#else +#define XOR_WRITE32_(address,value) \ + ((* ((unsigned char *)(address)) ^= ((int)(value)) &0xff), \ + (*(((unsigned char *)(address))+1) ^= (((int)(value))>> 8)&0xff), \ + (*(((unsigned char *)(address))+2) ^= (((int)(value))>>16)&0xff), \ + (*(((unsigned char *)(address))+3) ^= (((int)(value))>>24)&0xff)) +#ifdef BIGENDIAN +#define XOR_WRITE32_MD(address,value) \ + ((*(((unsigned char *)(address))+3) ^= ((int)(value)) &0xff), \ + (*(((unsigned char *)(address))+2) ^= (((int)(value))>> 8)&0xff), \ + (*(((unsigned char *)(address))+1) ^= (((int)(value))>>16)&0xff), \ + (*(((unsigned char *)(address)) ^= (((int)(value))>>24)&0xff)) +#else +#define XOR_WRITE32_MD XOR_WRITE32_ +#endif +#endif + +#define PUT_VALUE_(base,offset,value,mask) \ + (WRITE32_((base)+((offset)>>3), \ + READ32_((base)+((offset)>>3)) & ~((mask)<<((offset)&7)) \ + | (((mask)&(value))<<((offset)&0x7)))) + +#define PUT_VALUE_MD(base,offset,value,mask) \ + (WRITE32_MD((base)+((offset)>>3), \ + READ32_MD((base)+((offset)>>3)) & ~((mask)<<((offset)&7)) \ + | (((mask)&(value))<<((offset)&0x7)))) + + + /* + ** Degrees to radians conversion factor -- with inverted Y axis. + */ +#define RADIANS_PER_DEGREE -0.0174532925199432959 + /* + ** These symbols define valid UdpRec data type and class combinations. + */ +#define XieK_UBAVU 0 /* unaligned bit array */ +#define XieK_UBAV 1 /* unaligned bit array that is aligned ?? */ +#define XieK_UBSVU 2 /* unaligned bit stream */ +#define XieK_UBSV 3 /* unaligned bit stream that is aligned ?? */ +#define XieK_CLCL 4 /* change list */ +#define XieK_ABU 5 /* aligned byte array */ +#define XieK_AF 6 /* aligned float array */ +#define XieK_AWU 7 /* aligned word array */ +/* Not yet implemented +#define XieK_ALU 8 +*/ +#define XieK_DATA_TYPE_COUNT 8 + + /* + ** Defs for DDX table entry points + */ +#ifndef externalref +#if (defined(VMS) && defined(VAXC)) +#define externalref globalref +#else +#define externalref extern +#endif +#endif + + /* + ** Typedefs + */ +typedef unsigned long card32; +typedef unsigned long (*Fcard32)(); /* Used in DDX dispatch table */ + + /* + ** Data structures for passing Template IDC (kernel) data to DDX + ** routines. + */ +typedef struct { + float value; /* A template value */ + long int increment; /* Number of kernel elements skipped + * between previous and this element, + * plus 1. Zero marks end of row */ +} TmpDatEntryRec, *TmpDatEntryPtr; + +typedef struct { + long int center_x; /* Template center X coordinate */ + long int center_y; /* Template center Y coordinate */ + long int x_count; /* Template x dimension */ + long int y_count; /* Template y dimension */ + TmpDatEntryPtr array; /* Pointer to the template data + * records */ +} TmpDatRec, *TmpDatPtr; + +/***************************************************************************** +** +** Xie Ddx Index - +** +** FUNCTIONAL DESCRIPTION: +** +** The following symbols define the indices into the dispatch table +** used to call "atomic" DDX functions. These functions include both +** processing routines for the protocol functions and DDX support +** routines. +** +** WARNING: The indices here AND the order of the XieDdxProc table +** in SmiDdx.c MUST match. +** +*****************************************************************************/ + /* + ** Protocol processing routines + */ +#define D_dxArea 0 /* Protocol functions */ +#define D_dxStatsArea 1 +#define D_dxArith 2 +#define D_dxHistogram 3 +#define D_dxChromeCom 4 +#define D_dxChromeSep 5 +#define D_dxCompare 6 +#define D_dxConstrain 7 +#define D_dxCrop 8 +#define D_dxDither 9 +#define D_dxFill 10 +#define D_dxLogical 11 +#define D_dxLuminance 12 +#define D_dxMatchHistogram 13 +#define D_dxMath 14 +#define D_dxMirror 15 +#define D_dxPoint 16 +#define D_dxStatsPoint 17 +#define D_dxRotate 18 +#define D_dxScale 19 +#define D_dxTranslate 20 +#define D_dxRmOwnData 21 + /* 21..32 -- was Compression handlers */ + /* + ** DDX specific function indices + */ +#define D_dxInit 33 /* DDX Init routine */ +#define D_dxReset 34 /* " Reset */ +#define D_dxOptimizePipe 35 /* " Pipeline optimizer */ +#define D_dxConvert 36 /* Udp support routines */ +#define D_dxCopy 37 +#define D_dxGetTyp 38 +#define D_dxCopyBits 39 +#define D_dxResolveUdp 40 +#define D_dxCalloc 41 /* Memory mgt routines */ +#define D_dxCallocBits 42 +#define D_dxCfree 43 +#define D_dxFree 44 +#define D_dxFreeBits 45 +#define D_dxMalloc 46 +#define D_dxMallocBits 47 +#define D_dxRealloc 48 +#define D_dxReallocBits 49 +#define D_dxCreatePipeline 50 /* Pipeline routines */ +#define D_dxDestroyPipeline 51 +#define D_dxPipeHasYielded 52 /* was D_dxExecutePipeline */ +#define D_dxInitiatePipeline 53 +#define D_dxResumePipeline 54 +#define D_dxFlushPipeline 55 +#define D_dxAbortPipeline 56 +#define D_dxRmAllocData 57 /* Pipe resource mgr routines */ +#define D_dxRmAllocDataDesc 58 +#define D_dxRmAllocPermDesc 59 +#define D_dxRmAllocRefDesc 60 +#define D_dxRmBestDType 61 +#define D_dxRmCreateDrain 62 +#define D_dxRmCreateSink 63 +#define D_dxRmDeallocData 64 +#define D_dxRmDeallocDataDesc 65 +#define D_dxRmDestroyDrain 66 +#define D_dxRmDestroySink 67 +#define D_dxRmGetData 68 +#define D_dxRmGetDType 69 +#define D_dxRmGetMaxQuantum 70 +#define D_dxRmGetQuantum 71 +#define D_dxRmHasQuantum 72 +#define D_dxRmInitializePort 73 +#define D_dxRmMergeBuffers 75 +#define D_dxRmObtainQuantum 76 +#define D_dxRmPutData 77 +#define D_dxRmSetDType 78 +#define D_dxRmSetQuantum 79 +#define D_dxRmSplitBuffers 80 +#define D_dxSchedProcessComplete 81 /* Pipe scheduling routines */ +#define D_dxSchedProcessReady 82 +#define D_dxSchedOkToRun 83 +#define D_dxBuildChangeList 84 /* Change list routines */ +#define D_dxPutRuns 85 +#define D_dxFfsLong 86 +#define D_dxFfcLong 87 +#define D_dxFillRegion 88 /* Miscellaneous additions */ +#define D_dxConvertCpp 89 +#define D_dxCopyCpp 90 +#define D_dxEncodeG4 91 +#define D_dxEncodeDct 92 +#define D_dxDecodeG4 93 +#define D_dxDecodeDct 94 +#define D_dxPosCl 95 +#define D_dxCheckLicense 96 + /* More RM functions */ +#define D_dxRmAllocCmpDataDesc 97 /* was D_dxRmGetAlignment */ +#define D_dxRmSetAlignment 98 +#define D_dxRmCreateDataDesc 99 +#define D_dxCreatePipeCtx 100 +#define D_dxUsingCL 101 +#define D_dxCmpPreferred 102 /* was D_dxSmiDecodeG4IsAtomic */ +#define D_dxRmAllocDataArray 103 +#define D_dxRmAllocCmpPermDesc 104 +#define D_dxSchedProcessNoInput 105 + +/***************************************************************************** +** +** DDX Access Macros +** +** FUNCTIONAL DESCRIPTION: +** +** These macros provide access to the DDX functions while hiding +** the implementation from the caller. +** +*****************************************************************************/ + /* + ** DDX function access macro + ** This macro calls an arbitrary DDX routine through the + ** xieDdxProc dispatch table. + ** + ** func = the Mi function index from this file. + ** + */ +externalref card32 (*xieDdxProc[])(); +#define CallDdx_(func) (*(xieDdxProc)[func]) + /* + ** Image functions + */ +#define DdxArea_ CallDdx_(D_dxArea) +#define DdxStatsArea_ CallDdx_(D_dxStatsArea) +#define DdxArith_ CallDdx_(D_dxArith) +#define DdxHistogram_ CallDdx_(D_dxHistogram) +#define DdxChromeCom_ CallDdx_(D_dxChromeCom) +#define DdxChromeSep_ CallDdx_(D_dxChromeSep) +#define DdxCompare_ CallDdx_(D_dxCompare) +#define DdxConstrain_ CallDdx_(D_dxConstrain) +#define DdxCrop_ CallDdx_(D_dxCrop) +#define DdxDither_ CallDdx_(D_dxDither) +#define DdxFill_ CallDdx_(D_dxFill) +#define DdxLogical_ CallDdx_(D_dxLogical) +#define DdxLuminance_ CallDdx_(D_dxLuminance) +#define DdxMatchHistogram_ CallDdx_(D_dxMatchHistogram) +#define DdxMath_ CallDdx_(D_dxMath) +#define DdxMirror_ CallDdx_(D_dxMirror) +#define DdxPoint_ CallDdx_(D_dxPoint) +#define DdxStatsPoint_ CallDdx_(D_dxStatsPoint) +#define DdxRotate_ CallDdx_(D_dxRotate) +#define DdxScale_ CallDdx_(D_dxScale) +#define DdxTranslate_ CallDdx_(D_dxTranslate) +#define DdxRmOwnData_ CallDdx_(D_dxRmOwnData) + /* + ** Ddx specific functions + */ +#define DdxInit_ CallDdx_(D_dxInit) +#define DdxReset_ CallDdx_(D_dxReset) +#define DdxOptimizePipe_ CallDdx_(D_dxOptimizePipe) + /* + ** MI software functions + */ +#define DdxConvert_ CallDdx_(D_dxConvert) +#define DdxCopy_ CallDdx_(D_dxCopy) +#define DdxGetTyp_ CallDdx_(D_dxGetTyp) +#define DdxCopyBits_ CallDdx_(D_dxCopyBits) /* 65 */ +#define DdxResolveUdp_ CallDdx_(D_dxResolveUdp) + /* + ** Memory management routines + */ +#define DdxCalloc_ CallDdx_(D_dxCalloc) +#define DdxCallocBits_ (unsigned char *)CallDdx_(D_dxCallocBits) +#define DdxCfree_ CallDdx_(D_dxCfree) +#define DdxFree_ CallDdx_(D_dxFree) +#define DdxFreeBits_ (unsigned char *)CallDdx_(D_dxFreeBits) +#define DdxMalloc_ CallDdx_(D_dxMalloc) +#define DdxMallocBits_ (unsigned char *)CallDdx_(D_dxMallocBits) +#define DdxRealloc_ CallDdx_(D_dxRealloc) +#define DdxReallocBits_ (unsigned char *)CallDdx_(D_dxReallocBits) + /* + ** Pipeline support routines + */ +#define DdxCreatePipeline_ (Pipe)CallDdx_(D_dxCreatePipeline) +#define DdxDestroyPipeline_ (int)CallDdx_(D_dxDestroyPipeline) +#define DdxPipeHasYielded_ (int)CallDdx_(D_dxPipeHasYielded) +#define DdxInitiatePipeline_ (int)CallDdx_(D_dxInitiatePipeline) +#define DdxResumePipeline_ (int)CallDdx_(D_dxResumePipeline) +#define DdxFlushPipeline_ (int)CallDdx_(D_dxFlushPipeline) +#define DdxAbortPipeline_ (int)CallDdx_(D_dxAbortPipeline) + /* + ** Pipeline resource manager routines + */ +#define DdxRmAllocData_ (PipeDataPtr)CallDdx_(D_dxRmAllocData) +#define DdxRmAllocDataDesc_ (PipeDataPtr)CallDdx_(D_dxRmAllocDataDesc) +#define DdxRmAllocPermDesc_ (PipeDataPtr)CallDdx_(D_dxRmAllocPermDesc) +#define DdxRmAllocRefDesc_ (PipeDataPtr)CallDdx_(D_dxRmAllocRefDesc) +#define DdxRmBestDType_ (char)CallDdx_(D_dxRmBestDType) +#define DdxRmCreateDrain_ (PipeDrainPtr)CallDdx_(D_dxRmCreateDrain) +#define DdxRmCreateSink_ (PipeSinkPtr)CallDdx_(D_dxRmCreateSink) +#define DdxRmDeallocData_ (PipeDataPtr)CallDdx_(D_dxRmDeallocData) +#define DdxRmDeallocDataDesc_ (PipeDataPtr)CallDdx_(D_dxRmDeallocDataDesc) +#define DdxRmDestroyDrain_ (PipeDrainPtr)CallDdx_(D_dxRmDestroyDrain) +#define DdxRmDestroySink_ (PipeSinkPtr)CallDdx_(D_dxRmDestroySink) +#define DdxRmGetData_ (PipeDataPtr)CallDdx_(D_dxRmGetData) +#define DdxRmGetDType_ (int)CallDdx_(D_dxRmGetDType) +#define DdxRmGetMaxQuantum_ (int)CallDdx_(D_dxRmGetMaxQuantum) +#define DdxRmGetQuantum_ (int)CallDdx_(D_dxRmGetQuantum) +#define DdxRmHasQuantum_ (int)CallDdx_(D_dxRmHasQuantum) +#define DdxRmInitializePort_ (int)CallDdx_(D_dxRmInitializePort) +#define DdxRmMergeBuffers_ (PipeDataPtr)CallDdx_(D_dxRmMergeBuffers) +#define DdxRmObtainQuantum_ (PipeDataPtr)CallDdx_(D_dxRmObtainQuantum) +#define DdxRmPutData_ (int)CallDdx_(D_dxRmPutData) +#define DdxRmSetDType_ CallDdx_(D_dxRmSetDType) +#define DdxRmSetQuantum_ CallDdx_(D_dxRmSetQuantum) +#define DdxRmSplitBuffers_ (PipeDataPtr)CallDdx_(D_dxRmSplitBuffers) + /* + ** Pipe scheduling routines + */ +#define DdxSchedProcessComplete_ (PipeElementCtxPtr)CallDdx_(D_dxSchedProcessComplete) +#define DdxSchedProcessReady_ (PipeElementCtxPtr)CallDdx_(D_dxSchedProcessReady) +#define DdxSchedOkToRun_ (int)CallDdx_(D_dxSchedOkToRun) + /* + ** Change list routines + */ +#define DdxBuildChangeList_ CallDdx_(D_dxBuildChangeList) +#define DdxPutRuns_ CallDdx_(D_dxPutRuns) +#define DdxFfsLong_ CallDdx_(D_dxFfsLong) +#define DdxFfcLong_ CallDdx_(D_dxFfcLong) + /* + ** Additions + */ +#define DdxFillRegion_ CallDdx_(D_dxFillRegion) +#define DdxConvertCpp_ CallDdx_(D_dxConvertCpp) +#define DdxCopyCpp_ CallDdx_(D_dxCopyCpp) +#define DdxEncodeG4_ CallDdx_(D_dxEncodeG4) +#define DdxEncodeDct_ CallDdx_(D_dxEncodeDct) +#define DdxDecodeG4_ CallDdx_(D_dxDecodeG4) +#define DdxDecodeDct_ CallDdx_(D_dxDecodeDct) +#define DdxPosCl_ CallDdx_(D_dxPosCl) +#define DdxCheckLicense_ CallDdx_(D_dxCheckLicense) + /* + ** More RM functions + */ +#define DdxRmAllocCmpDataDesc_ (PipeDataPtr)CallDdx_(D_dxRmAllocCmpDataDesc) +#define DdxRmSetAlignment_ CallDdx_(D_dxRmSetAlignment) +#define DdxRmCreateDataDesc_ (PipeDataPtr)CallDdx_(D_dxRmCreateDataDesc) +#define DdxCreatePipeCtx_ (PipeElementCtxPtr)CallDdx_(D_dxCreatePipeCtx) +#define DdxUsingCL_ CallDdx_(D_dxUsingCL) +#define DdxCmpPreferred_ CallDdx_(D_dxCmpPreferred) +#define DdxRmAllocDataArray_ CallDdx_(D_dxRmAllocDataArray) +#define DdxRmAllocCmpPermDesc_ (PipeDataPtr)CallDdx_(D_dxRmAllocCmpPermDesc) +#define DdxSchedProcessNoInput_ (PipeElementCtxPtr)CallDdx_(D_dxSchedProcessNoInput) + +/***************************************************************************** +** +** Xie Ddx Setup Index - +** +** FUNCTIONAL DESCRIPTION: +** +** The following symbols define the indices into the dispatch table +** used to call "pipeline create" DDX functions. Each of these +** functions creates a new pipeline element. +** +** WARNING: These indices and the entries in the XieDdxSetup table +** in SmiDdx.c MUST be in the same order. +** +*****************************************************************************/ +#define D_dxCreateArea 0 +#define D_dxCreateArith 1 +#define D_dxCreateChromeCom 2 +#define D_dxCreateChromeSep 3 +#define D_dxCreateCompare 4 +#define D_dxCreateConstrain 5 +#define D_dxCreateCrop 6 +#define D_dxCreateDither 7 +#define D_dxCreateFill 8 +#define D_dxCreateLogical 9 +#define D_dxCreateLuminance 10 +#define D_dxCreateMatchHistogram 11 +#define D_dxCreateMath 12 +#define D_dxCreateMirror 13 +#define D_dxCreatePoint 14 +#define D_dxCreateRotate 15 +#define D_dxCreateScale 16 +#define D_dxCreateTranslate 17 +#define D_dxCreateDecodeDct 18 /* Compression pipeline creates */ +#define D_dxCreateEncodeDct 19 +#define D_dxCreateDecodeG4 20 +#define D_dxCreateEncodeG4 21 + +/***************************************************************************** +** +** Pipeline Create Access Macros +** +** FUNCTIONAL DESCRIPTION: +** +** These macros provide access to the Pipeline Create functions while +** hiding the implementation from the caller. +** +*****************************************************************************/ + /* + ** Pipe create function access macro + ** This macro calls a create function through the + ** xieDdxSetup dispatch table. + ** + ** func = the setup function index from this file. + ** + */ +externalref card32 (*xieDdxSetup[])(); +#define CallCreate_(func) (*(xieDdxSetup)[func]) + /* + ** Image processing pipe element creates + */ +#define DdxCreateArea_ CallCreate_(D_dxCreateArea) +#define DdxCreateArith_ CallCreate_(D_dxCreateArith) +#define DdxCreateChromeCom_ CallCreate_(D_dxCreateChromeCom) +#define DdxCreateChromeSep_ CallCreate_(D_dxCreateChromeSep) +#define DdxCreateCompare_ CallCreate_(D_dxCreateCompare) +#define DdxCreateConstrain_ CallCreate_(D_dxCreateConstrain) +#define DdxCreateCrop_ CallCreate_(D_dxCreateCrop) +#define DdxCreateDither_ CallCreate_(D_dxCreateDither) +#define DdxCreateFill_ CallCreate_(D_dxCreateFill) +#define DdxCreateLogical_ CallCreate_(D_dxCreateLogical) +#define DdxCreateLuminance_ CallCreate_(D_dxCreateLuminance) +#define DdxCreateMatchHistogram_ CallCreate_(D_dxCreateMatchHistogram) +#define DdxCreateMath_ CallCreate_(D_dxCreateMath) +#define DdxCreateMirror_ CallCreate_(D_dxCreateMirror) +#define DdxCreatePoint_ CallCreate_(D_dxCreatePoint) +#define DdxCreateRotate_ CallCreate_(D_dxCreateRotate) +#define DdxCreateScale_ CallCreate_(D_dxCreateScale) +#define DdxCreateTranslate_ CallCreate_(D_dxCreateTranslate) + /* + ** Compression creates, used by Transport + */ +#define DdxCreateDecodeDct_ CallCreate_(D_dxCreateDecodeDct) +#define DdxCreateEncodeDct_ CallCreate_(D_dxCreateEncodeDct) +#define DdxCreateDecodeG4_ CallCreate_(D_dxCreateDecodeG4) +#define DdxCreateEncodeG4_ CallCreate_(D_dxCreateEncodeG4) + +/***************************************************************************** +** +** Ddx Alignment Function Access Index +** +** FUNCTIONAL DESCRIPTION: +** +** The following symbols define the indices into the DDX Alignment +** dispatch table used to call DDX image array alignment functions. +** Each of these functions performs alignments to meet individual +** algorithms or the default DDX needs. +** +** WARNING: These indices and the entries in the XieDdxAlign table +** in SmiDdx.c MUST be in the same order. +** +** +*****************************************************************************/ +#define D_dxAlignArea 0 +#define D_dxAlignArith 1 +#define D_dxAlignChromeCom 2 +#define D_dxAlignChromeSep 3 +#define D_dxAlignCompare 4 +#define D_dxAlignConstrain 5 +#define D_dxAlignCrop 6 +#define D_dxAlignDither 7 +#define D_dxAlignFill 8 +#define D_dxAlignLogical 9 +#define D_dxAlignLuminance 10 +#define D_dxAlignMatchHistogram 11 +#define D_dxAlignMath 12 +#define D_dxAlignMirror 13 +#define D_dxAlignPoint 14 +#define D_dxAlignRotate 15 +#define D_dxAlignScale 16 +#define D_dxAlignTranslate 17 +#define D_dxAlignDecodeDct 18 +#define D_dxAlignEncodeDct 19 +#define D_dxAlignDecodeG4 20 +#define D_dxAlignEncodeG4 21 +#define D_dxAlignDefault 22 +#define D_dxAlignExport 23 + +/***************************************************************************** +** +** DDX Alignment Function Access Macros +** +** FUNCTIONAL DESCRIPTION: +** +** These macros provide access to the DDX image array alignment functions +** +*****************************************************************************/ + /* + ** Align function access macro + ** This macro calls an arbitrary Alignment routine through the + ** xieDdxAlign dispatch table. + ** + ** func = the DDX alignment function index from this file. + ** + */ +externalref card32 (*xieDdxAlign[])(); +#define GetAlign_(func) (xieDdxAlign[func]) + +#define DdxAlignArea_ GetAlign_(D_dxAlignArea) +#define DdxAlignStatsArea_ GetAlign_(D_dxAlignStatsArea) +#define DdxAlignArith_ GetAlign_(D_dxAlignArith) +#define DdxAlignHistogram_ GetAlign_(D_dxAlignHistogram) +#define DdxAlignChromeCom_ GetAlign_(D_dxAlignChromeCom) +#define DdxAlignChromeSep_ GetAlign_(D_dxAlignChromeSep) +#define DdxAlignCompare_ GetAlign_(D_dxAlignCompare) +#define DdxAlignConstrain_ GetAlign_(D_dxAlignConstrain) +#define DdxAlignCrop_ GetAlign_(D_dxAlignCrop) +#define DdxAlignDither_ GetAlign_(D_dxAlignDither) +#define DdxAlignFill_ GetAlign_(D_dxAlignFill) +#define DdxAlignLogical_ GetAlign_(D_dxAlignLogical) +#define DdxAlignLuminance_ GetAlign_(D_dxAlignLuminance) +#define DdxAlignMatchHistogram_ GetAlign_(D_dxAlignMatchHistogram) +#define DdxAlignMath_ GetAlign_(D_dxAlignMath) +#define DdxAlignMirror_ GetAlign_(D_dxAlignMirror) +#define DdxAlignPoint_ GetAlign_(D_dxAlignPoint) +#define DdxAlignStatsPoint_ GetAlign_(D_dxAlignStatsPoint) +#define DdxAlignRotate_ GetAlign_(D_dxAlignRotate) +#define DdxAlignScale_ GetAlign_(D_dxAlignScale) +#define DdxAlignTranslate_ GetAlign_(D_dxAlignTranslate) +#define DdxAlignDecodeDct_ GetAlign_(D_dxAlignDecodeDct) +#define DdxAlignEncodeDct_ GetAlign_(D_dxAlignEncodeDct) +#define DdxAlignDecodeG4_ GetAlign_(D_dxAlignDecodeG4) +#define DdxAlignEncodeG4_ GetAlign_(D_dxAlignEncodeG4) +#define DdxAlignDefault_ GetAlign_(D_dxAlignDefault) +#define DdxAlignExport_ GetAlign_(D_dxAlignExport) + +/***************************************************************************** +** +** Mi Access Macros +** +** FUNCTIONAL DESCRIPTION: +** +** These macros provide access to the "atomic" DDX functions provided +** by a Machine Independent layer of the DDX. +** +*****************************************************************************/ + /* + ** Mi function access macro + ** This macro calls an arbitrary Mi routine through the + ** xieMiProc dispatch table. + ** + ** func = the Mi function index from this file. + ** + */ +externalref card32 (*xieMiProc[])(); +#define CallMi_(func) (*(xieMiProc)[func]) + /* + ** Image functions + */ +#define MiArea_ CallMi_(D_dxArea) +#define MiStatsArea_ CallMi_(D_dxStatsArea) +#define MiArith_ CallMi_(D_dxArith) +#define MiHistogram_ CallMi_(D_dxHistogram) +#define MiChromeCom_ CallMi_(D_dxChromeCom) +#define MiChromeSep_ CallMi_(D_dxChromeSep) +#define MiCompare_ CallMi_(D_dxCompare) +#define MiConstrain_ CallMi_(D_dxConstrain) +#define MiCrop_ CallMi_(D_dxCrop) +#define MiDither_ CallMi_(D_dxDither) +#define MiFill_ CallMi_(D_dxFill) +#define MiLogical_ CallMi_(D_dxLogical) +#define MiLuminance_ CallMi_(D_dxLuminance) +#define MiMatchHistogram_ CallMi_(D_dxMatchHistogram) +#define MiMath_ CallMi_(D_dxMath) +#define MiMirror_ CallMi_(D_dxMirror) +#define MiPoint_ CallMi_(D_dxPoint) +#define MiStatsPoint_ CallMi_(D_dxStatsPoint) +#define MiRotate_ CallMi_(D_dxRotate) +#define MiScale_ CallMi_(D_dxScale) +#define MiTranslate_ CallMi_(D_dxTranslate) + /* + ** Mi specific functions + */ +#define MiInit_ CallMi_(D_dxInit) +#define MiReset_ CallMi_(D_dxReset) +#define MiOptimizePipe_ CallMi_(D_dxOptimizePipe) + /* + ** MI software functions + */ +#define MiConvert_ CallMi_(D_dxConvert) +#define MiCopy_ CallMi_(D_dxCopy) +#define MiGetTyp_ CallMi_(D_dxGetTyp) +#define MiCopyBits_ CallMi_(D_dxCopyBits) +#define MiResolveUdp_ CallMi_(D_dxResolveUdp) + /* + ** Memory management routines + */ +#define MiCalloc_ CallMi_(D_dxCalloc) +#define MiCallocBits_ (unsigned char *)CallMi_(D_dxCallocBits) +#define MiCfree_ CallMi_(D_dxCfree) +#define MiFree_ CallMi_(D_dxFree) +#define MiFreeBits_ (unsigned char *)CallMi_(D_dxFreeBits) +#define MiMalloc_ CallMi_(D_dxMalloc) +#define MiMallocBits_ (unsigned char *)CallMi_(D_dxMallocBits) +#define MiRealloc_ CallMi_(D_dxRealloc) +#define MiReallocBits_ (unsigned char *)CallMi_(D_dxReallocBits) + /* + ** Pipeline support routines + */ +#define MiCreatePipeline_ (Pipe)CallMi_(D_dxCreatePipeline) +#define MiDestroyPipeline_ (int)CallMi_(D_dxDestroyPipeline) +#define MiPipeHasYielded_ (int)CallMi_(D_dxPipeHasYielded) +#define MiInitiatePipeline_ (int)CallMi_(D_dxInitiatePipeline) +#define MiResumePipeline_ (int)CallMi_(D_dxResumePipeline) +#define MiFlushPipeline_ (int)CallMi_(D_dxFlushPipeline) +#define MiAbortPipeline_ (int)CallMi_(D_dxAbortPipeline) + /* + ** Pipeline resource manager routines + */ +#define MiRmAllocData_ (PipeDataPtr)CallMi_(D_dxRmAllocData) +#define MiRmAllocDataDesc_ (PipeDataPtr)CallMi_(D_dxRmAllocDataDesc) +#define MiRmAllocPermDesc_ (PipeDataPtr)CallMi_(D_dxRmAllocPermDesc) +#define MiRmAllocRefDesc_ (PipeDataPtr)CallMi_(D_dxRmAllocRefDesc) +#define MiRmBestDType_ (char)CallMi_(D_dxRmBestDType) +#define MiRmCreateDrain_ (PipeDrainPtr)CallMi_(D_dxRmCreateDrain) +#define MiRmCreateSink_ (PipeSinkPtr)CallMi_(D_dxRmCreateSink) +#define MiRmDeallocData_ (PipeDataPtr)CallMi_(D_dxRmDeallocData) +#define MiRmDeallocDataDesc_ (PipeDataPtr)CallMi_(D_dxRmDeallocDataDesc) +#define MiRmDestroyDrain_ (PipeDrainPtr)CallMi_(D_dxRmDestroyDrain) +#define MiRmDestroySink_ (PipeSinkPtr)CallMi_(D_dxRmDestroySink) +#define MiRmGetData_ (PipeDataPtr)CallMi_(D_dxRmGetData) +#define MiRmGetDType_ (int)CallMi_(D_dxRmGetDType) +#define MiRmGetMaxQuantum_ (int)CallMi_(D_dxRmGetMaxQuantum) +#define MiRmGetQuantum_ (int)CallMi_(D_dxRmGetQuantum) +#define MiRmHasQuantum_ (int)CallMi_(D_dxRmHasQuantum) +#define MiRmInitializePort_ (int)CallMi_(D_dxRmInitializePort) +#define MiRmMergeBuffers_ (PipeDataPtr)CallMi_(D_dxRmMergeBuffers) +#define MiRmObtainQuantum_ (PipeDataPtr)CallMi_(D_dxRmObtainQuantum) +#define MiRmPutData_ (int)CallMi_(D_dxRmPutData) +#define MiRmSetDType_ CallMi_(D_dxRmSetDType) +#define MiRmSetQuantum_ CallMi_(D_dxRmSetQuantum) +#define MiRmSplitBuffers_ (PipeDataPtr)CallMi_(D_dxRmSplitBuffers) + /* + ** Pipe scheduling routines + */ +#define MiSchedProcessComplete_ (PipeElementCtxPtr)CallMi_(D_dxSchedProcessComplete) +#define MiSchedProcessReady_ (PipeElementCtxPtr)CallMi_(D_dxSchedProcessReady) +#define MiSchedOkToRun_ (int)CallMi_(D_dxSchedOkToRun) + /* + ** Change list routines + */ +#define MiBuildChangeList_ CallMi_(D_dxBuildChangeList) +#define MiPutRuns_ CallMi_(D_dxPutRuns) +#define MiFfsLong_ CallMi_(D_dxFfsLong) +#define MiFfcLong_ CallMi_(D_dxFfcLong) + /* + ** Additions + */ +#define MiFillRegion_ CallMi_(D_dxFillRegion) +#define MiConvertCpp_ CallMi_(D_dxConvertCpp) +#define MiCopyCpp_ CallMi_(D_dxCopyCpp) +#define MiEncodeG4_ CallMi_(D_dxEncodeG4) +#define MiEncodeDct_ CallMi_(D_dxEncodeDct) +#define MiDecodeG4_ CallMi_(D_dxDecodeG4) +#define MiDecodeDct_ CallMi_(D_dxDecodeDct) +#define MiPosCl_ CallMi_(D_dxPosCl) +#define MiCheckLicense_ CallMi_(D_dxCheckLicense) + /* + ** More resource manager + */ +#define MiRmAllocCmpDataDesc_ CallMi_(D_dxRmAllocCmpDataDesc) +#define MiRmSetAlignment_ CallMi_(D_dxRmSetAlignment) +#define MiRmCreateDataDesc_ (PipeDataPtr)CallMi_(D_dxRmCreateDataDesc) +#define MiCreatePipeCtx_ (PipeElementCtxPtr)CallMi_(D_dxCreatePipeCtx) +#define MiUsingCL_ CallMi_(D_dxUsingCL) +#define MiCmpPreferred_ CallMi_(D_dxCmpPreferred) +#define MiRmAllocDataArray_ CallMi_(D_dxRmAllocDataArray) +#define MiRmAllocCmpPermDesc_ (PipeDataPtr)CallMi_(D_dxRmAllocCmpPermDesc) +#define MiSchedProcessNoInput_ (PipeElementCtxPtr)CallMi_(D_dxSchedProcessNoInput) + +/***************************************************************************** +** +** Pipeline Create Access Macros +** +** FUNCTIONAL DESCRIPTION: +** +** These macros provide access to the "pipeline create" DDX functions +** provided by a Machine Independent layer of the DDX. +** +*****************************************************************************/ + /* + ** Pipe create function access macro + ** This macro calls a create function through the + ** xieMiSetup dispatch table. + ** + ** func = the setup function index from this file. + ** + */ +externalref card32 (*xieMiSetup[])(); +#define CallMiCreate_(func) (*(xieMiSetup)[func]) + /* + ** Image processing pipe element creates + */ +#define MiCreateArea_ CallMiCreate_(D_dxCreateArea) +#define MiCreateArith_ CallMiCreate_(D_dxCreateArith) +#define MiCreateChromeCom_ CallMiCreate_(D_dxCreateChromeCom) +#define MiCreateChromeSep_ CallMiCreate_(D_dxCreateChromeSep) +#define MiCreateCompare_ CallMiCreate_(D_dxCreateCompare) +#define MiCreateConstrain_ CallMiCreate_(D_dxCreateConstrain) +#define MiCreateCrop_ CallMiCreate_(D_dxCreateCrop) +#define MiCreateDither_ CallMiCreate_(D_dxCreateDither) +#define MiCreateFill_ CallMiCreate_(D_dxCreateFill) +#define MiCreateLogical_ CallMiCreate_(D_dxCreateLogical) +#define MiCreateLuminance_ CallMiCreate_(D_dxCreateLuminance) +#define MiCreateMatchHistogram_ CallMiCreate_(D_dxCreateMatchHistogram) +#define MiCreateMath_ CallMiCreate_(D_dxCreateMath) +#define MiCreateMirror_ CallMiCreate_(D_dxCreateMirror) +#define MiCreatePoint_ CallMiCreate_(D_dxCreatePoint) +#define MiCreateRotate_ CallMiCreate_(D_dxCreateRotate) +#define MiCreateScale_ CallMiCreate_(D_dxCreateScale) +#define MiCreateTranslate_ CallMiCreate_(D_dxCreateTranslate) + /* + ** Compression creates, used by Transport + */ +#define MiCreateDecodeDct_ CallMiCreate_(D_dxCreateDecodeDct) +#define MiCreateEncodeDct_ CallMiCreate_(D_dxCreateEncodeDct) +#define MiCreateDecodeG4_ CallMiCreate_(D_dxCreateDecodeG4) +#define MiCreateEncodeG4_ CallMiCreate_(D_dxCreateEncodeG4) + +/* +** This "endif" MUST be the last line of this file. +*/ +#endif +/* end of XIEDDX -- NO DEFINITIONS ALLOWED BEYOND THIS POINT */ diff --git a/xie/docs/dec/xie23-src/include/XieFloat.h b/xie/docs/dec/xie23-src/include/XieFloat.h new file mode 100644 index 0000000..c58f26f --- /dev/null +++ b/xie/docs/dec/xie23-src/include/XieFloat.h @@ -0,0 +1,99 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1990-1991 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** XIE - X11 Image Extension +** +** +** ABSTRACT: +** +** This module contains definitions required by the XIE library +** and XIE server floating point formatting routines. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Robert NC Shelley +** +** CREATION DATE: +** +** October 31, 1990 +** +************************************************************************/ + + /* + ** Symbol XIEFLOAT allows XieFloat.h to be included multiple times. + */ +#ifndef XIEFLOAT +#define XIEFLOAT /* the "endif" MUST be the last line of this file */ + +#include /* for CARD8, ..., typedefs */ + + /* + ** Wire floating point format + */ +typedef struct _XieFloatRec { + CARD8 e_sign; + CARD8 m_sign; + CARD16 exponent; + CARD32 mantissa; +} XieFloatRec, *XieFloat; + +extern void MiEncodeDouble(); +extern double MiDecodeDouble(); + +#endif diff --git a/xie/docs/dec/xie23-src/include/XieLib.h b/xie/docs/dec/xie23-src/include/XieLib.h new file mode 100644 index 0000000..25409f9 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/XieLib.h @@ -0,0 +1,372 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989-1991 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** XIE - X11 Image Extension +** +** +** ABSTRACT: +** +** This module contains definitions required by all XIE client side +** layers -- from the application level through the XieLib level. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Robert NC Shelley +** +** CREATION DATE: +** +** April 13, 1989 +** +*******************************************************************************/ + + /* + ** Symbol XIELIB allows XieLib.h to be included multiple times. + */ +#ifndef _XIELIB +#define _XIELIB /* the "endif" MUST be the last line of this file */ + +/* +** Include files +*/ +#ifdef VMS +#include /* X11 Library Definitions */ +#else +#include /* X11 Library Definitions */ +#endif +#ifdef VMS +#include /* universal data plane definitions */ +#include /* XIE inter-layer definitions */ +#else +#include /* universal data plane definitions */ +#include /* XIE inter-layer definitions */ +#endif + +/* +** Equated symbols +*/ + /* + ** XieCopyImage, XieGetImage, and XiePutImage image data mode constants. + */ +#define XieK_DataNone 1 /* no buffers, no transport setup, no data copy */ +#define XieK_DataFlo 2 /* prepare a Photoflo for image data transport */ +#define XieK_DataMap 3 /* prepare a Photomap for image data transport */ +#define XieK_DataAlloc 4 /* allocate image buffers containing no data */ +#define XieK_DataCopy 5 /* allocate image buffers and copy data */ +#define XieK_DataShare 6 /* copy pointers to existing image data */ + /* + ** Opaque Xie resource definitions. + */ +typedef unsigned long *XieStream; /* Stream transport context pointer */ +typedef unsigned char + *XiePhotoflo, /* Photoflo: server image pipeline object */ + *XiePhotomap, /* Photomap: permanent server image object */ + *XiePhototap, /* Phototap: ephemeral server image object */ + *XieCpp, /* Cpp: control processing plane */ + *XieRoi, /* Roi: region of interest */ + *XieTmp, /* Tmp: template (eg. convolution kernel) */ + *XiePhoto, /* Any of: XiePhotoflo, XiePhotomap, XiePhototap*/ + *XieIdc, /* Any of: XieCpp, XieRoi, XieTmp, */ + *XieResource; /* Any of: XiePhoto, XieIdc */ + +#ifdef __alpha +#define RES_XID 16 /* offset to XieResource X11 resource-id */ +#define RES_TYPE 24 /* offset to XieResource resource type */ +#define RES_MAPPING 25 /* offset to XiePhoto component mapping */ +#else +#define RES_XID 8 /* offset to XieResource X11 resource-id */ +#define RES_TYPE 12 /* offset to XieResource resource type */ +#define RES_MAPPING 13 /* offset to XiePhoto component mapping */ +#endif +/* +** Macros +*/ + /* + ** Macro for returning a resource's X11-id. + */ +#define XId_(res) (*((XID *)(&((XieResource)(res))[RES_XID]))) + /* + ** Boolean macros for determining a resource's type. + */ +#define IsPhotoflo_(res) (((XieResource)(res))[RES_TYPE]==XieK_Photoflo) +#define IsPhotomap_(res) (((XieResource)(res))[RES_TYPE]==XieK_Photomap) +#define IsPhototap_(res) (((XieResource)(res))[RES_TYPE]==XieK_Phototap) +#define IsCpp_(res) (((XieResource)(res))[RES_TYPE]==XieK_IdcCpp) +#define IsRoi_(res) (((XieResource)(res))[RES_TYPE]==XieK_IdcRoi) +#define IsTmp_(res) (((XieResource)(res))[RES_TYPE]==XieK_IdcTmp) +#define IsPhoto_(res) (IsPhotoflo_(res)||IsPhotomap_(res)||IsPhototap_(res)) +#define IsIdc_(res) (IsCpp_(res)||IsRoi_(res)||IsTmp_(res)) + /* + ** Boolean macros for determining a XiePhotomap's component mapping. + */ +#define IsBitonal_(pho) (((XiePhoto)(pho))[RES_MAPPING]==XieK_Bitonal) +#define IsGrayScale_(pho) (((XiePhoto)(pho))[RES_MAPPING]==XieK_GrayScale) +#define IsRGB_(pho) (((XiePhoto)(pho))[RES_MAPPING]==XieK_RGB) + + /* + ** Return the component count of an XiePhotomap. + */ +#define PhotoCount_(pho) (IsRGB_(pho) ? 3 : 1) + /* + ** Return the number of planes (UdpPtr's) an XieImage "should" contain. + */ +#define PlaneCount_(img) \ + ( CmpOrg_(img) == XieK_BandByPixel ? 1 \ + : CmpOrg_(img) == XieK_BandByPlane ? CmpCnt_(img) \ + : CmpLen_(img,0)+CmpLen_(img,1)+CmpLen_(img,2) ) + /* + ** Return "val" rounded up (if necessary) to a multiple of "mod". + */ +#define Modulo_(val,mod) \ + ((mod) < 2 ? (val) : (((mod) - (val) % (mod)) % (mod) + (val))) + +/* +** Structures +*/ + /* + ** XIE Client Event Structure + */ +typedef struct { + int type; /* see XQueryExtention "first_event"*/ + unsigned long serial; /* X11 serial number */ + Bool send_event; /* Boolean: true if client generated*/ + Display *display; /* X11 display pointer */ + XieResource resource; /* Xie resource-id (source of event)*/ +} XieEventRec, *XieEvent; + /* + ** Image domain context template data for XieCreateTmp / XieQueryTmp. + */ +typedef struct { + long x; /* X coordinate of template entry */ + long y; /* Y coordinate of template entry */ + double value; /* value of template entry */ +} XieTemplateRec, *XieTemplate; + /* + ** Statistics data + */ +typedef struct { + double value; + double minimum; + double maximum; + double mean; + double stddev; + double variance; +} XieStatsRec, *XieStats; + + /* + ** XIE Image structure (client side image descriptor). + */ +typedef struct { + unsigned char Compression; /* compression scheme */ + unsigned char CmpOrg; /* component organization */ + unsigned char CmpMap; /* component mapping */ + unsigned char CmpCnt; /* component count */ + unsigned long CmpLvl[XieK_MaxComponents]; /* levels per component */ + unsigned char CmpLen[XieK_MaxComponents]; /* bits per component */ + unsigned char PxlPol; /* pixel brightness polarity*/ + unsigned char PxlProg; /* pixel progression */ + unsigned char ScnProg; /* scanline progression */ + unsigned char OwnData; /* image array ownership */ + unsigned char Stream; /* Stream transport status */ + XieStream Xport; /* Stream transport context */ + double PxlRatio; /* pixel aspect ratio */ + UdpPtr Plane[XieK_MaxPlanes]; /* data plane pointers */ +} XieImageRec, *XieImage; + /* + ** Access macros for XIE Image structure. + */ +#define Cmpres_(img) ((img)->Compression) +#define CmpOrg_(img) ((img)->CmpOrg) +#define CmpMap_(img) ((img)->CmpMap) +#define CmpCnt_(img) ((img)->CmpCnt) +#define CmpLvl_(img,ind) ((img)->CmpLvl[(ind)]) +#define CmpLen_(img,ind) ((img)->CmpLen[(ind)]) +#define PxlPol_(img) ((img)->PxlPol) +#define PxlProg_(img) ((img)->PxlProg) +#define ScnProg_(img) ((img)->ScnProg) +#define OwnData_(img) ((img)->OwnData) +#define Stream_(img) ((img)->Stream) +#define StreamFinal_(img) (Stream_(img) == XieK_StreamFinal) +#define StreamError_(img) (Stream_(img) == XieK_StreamError) +#define StreamPending_(img) (!(StreamFinal_(img) || StreamError_(img))) +#define PxlRatio_(img) ((img)->PxlRatio) +#define Width_(img) ((img)->Plane[0]->UdpL_PxlPerScn) +#define Height_(img) ((img)->Plane[0]->UdpL_ScnCnt) +#define Plane_(img,ind) ((img)->Plane[(ind)]) +#define uPxlLen_(img,ind) ((img)->Plane[(ind)]->UdpW_PixelLength) +#define uDType_(img,ind) ((img)->Plane[(ind)]->UdpB_DType) +#define uClass_(img,ind) ((img)->Plane[(ind)]->UdpB_Class) +#define uBase_(img,ind) ((img)->Plane[(ind)]->UdpA_Base) +#define uArSize_(img,ind) ((img)->Plane[(ind)]->UdpL_ArSize) +#define uPxlStr_(img,ind) ((img)->Plane[(ind)]->UdpL_PxlStride) +#define uScnStr_(img,ind) ((img)->Plane[(ind)]->UdpL_ScnStride) +#define uX1_(img,ind) ((img)->Plane[(ind)]->UdpL_X1) +#define uX2_(img,ind) ((img)->Plane[(ind)]->UdpL_X2) +#define uY1_(img,ind) ((img)->Plane[(ind)]->UdpL_Y1) +#define uY2_(img,ind) ((img)->Plane[(ind)]->UdpL_Y2) +#define uWidth_(img,ind) ((img)->Plane[(ind)]->UdpL_PxlPerScn) +#define uHeight_(img,ind) ((img)->Plane[(ind)]->UdpL_ScnCnt) +#define uPos_(img,ind) ((img)->Plane[(ind)]->UdpL_Pos) +#define uCmpIdx_(img,ind) ((img)->Plane[(ind)]->UdpL_CompIdx) +#define uLvl_(img,ind) ((img)->Plane[(ind)]->UdpL_Levels) + +/* +** XieLib entry points. +*/ +#ifndef _XieLibEvents +extern unsigned long XieQueryEvents(); +extern void XieSelectEvents(); +#endif +#ifndef _XieLibImage +extern XieImage XieCopyImage(); +extern XieImage XieCreateImage(); +extern XieImage XieFreeImage(); +extern XieImage XieGetImage(); +extern unsigned char XieGetImageData(); +extern XiePhoto XiePutImage(); +extern unsigned char XiePutImageData(); +#endif +#ifndef _XieLibProcess +extern XiePhoto XieArea(); +extern XiePhoto XieAreaStats(); +extern XiePhoto XieArithmetic(); +extern XiePhoto XieChromeCom(); +extern XiePhoto XieChromeSep(); +extern XiePhoto XieCompare(); +extern XiePhoto XieConstrain(); +extern XiePhoto XieCrop(); +extern XiePhoto XieDither(); +extern XiePhoto XieFill(); +extern unsigned long *XieHistogram(); +extern XiePhoto XieLogical(); +extern XiePhoto XieLuminance(); +extern XiePhoto XieMatchHistogram(); +extern XiePhoto XieMath(); +extern XiePhoto XieMirror(); +extern XiePhoto XiePoint(); +extern void XiePointStats(); +extern XiePhoto XieRotate(); +extern XiePhoto XieScale(); +extern XiePhoto XieTranslate(); +#endif +#ifndef _XieLibResource +extern void XieAbortFlo(); +extern void XieBindMapToFlo(); +extern XiePhoto XieClonePhoto(); +extern XieCpp XieCreateCpp(); +extern XiePhoto XieCreatePhoto(); +extern XieRoi XieCreateRoi(); +extern XieTmp XieCreateTmp(); +extern void XieExecuteFlo(); +extern void XieExport(); +extern XieResource XieFindResource(); +extern void XieFreeExport(); +extern XieResource XieFreeResource(); +extern XiePhotomap XieImport(); +extern void XieQueryCpp(); +extern void XieQueryExport(); +extern unsigned long XieQueryFlo(); +extern XiePhoto XieQueryMap(); +extern void XieQueryRoi(); +extern XieTemplate XieQueryTmp(); +extern XiePhoto XieTapFlo(); +#endif +#ifndef _XieLibSession +extern char *XieCheckFunction(); +extern char **XieListFunctions(); +extern void XieQueryOpDefaults(); +extern void XieSetOpDefaults(); +#endif +#ifndef _XieLibTransport +extern void XieAbortStream(); +extern unsigned char XieGetStream(); +extern void XieGetTile(); +extern void XiePutStream(); +extern void XiePutTile(); +extern void XieSetStream(); +#endif +#ifndef _XieLibUtils +extern void *XieCalloc(); +extern unsigned char *XieCallocBits(); +extern void *XieCfree(); +extern void *XieFree(); +extern unsigned char *XieFreeBits(); +extern unsigned char XieIsBitonal(); +extern unsigned char XieIsCpp(); +extern unsigned char XieIsGrayScale(); +extern unsigned char XieIsIdc(); +extern unsigned char XieIsPhoto(); +extern unsigned char XieIsPhotoflo(); +extern unsigned char XieIsPhotomap(); +extern unsigned char XieIsPhototap(); +extern unsigned char XieIsRGB(); +extern unsigned char XieIsRoi(); +extern unsigned char XieIsTmp(); +extern void *XieMalloc(); +extern unsigned char *XieMallocBits(); +extern unsigned long XiePhotoCount(); +extern unsigned long XiePlaneCount(); +extern void *XieRealloc(); +extern unsigned char *XieReallocBits(); +extern unsigned long XieXId(); +#endif + +/* +** This "endif" MUST be the last line of this file. +*/ +#endif /* end of _XIELIB -- NO DEFINITIONS ALLOWED BEYOND THIS POINT */ diff --git a/xie/docs/dec/xie23-src/include/XieProto.h b/xie/docs/dec/xie23-src/include/XieProto.h new file mode 100644 index 0000000..2aeac5c --- /dev/null +++ b/xie/docs/dec/xie23-src/include/XieProto.h @@ -0,0 +1,1228 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989-1991 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Image Extension DIX +** +** ABSTRACT: +** +** This module contains definitions required by the XIE wire protocol +** -- XIE library and XIE server DDX layers. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Richard J. Piccolo +** Robert NC Shelley +** +** CREATION DATE: +** +** March 1, 1989 +** +************************************************************************/ + + /* + ** Symbol XIEPROTO allows XieProto.h to be included multiple times. + */ +#ifndef XIEPROTO +#define XIEPROTO /* the "endif" MUST be the last line of this file */ + +/* +** Include files +*/ +#ifdef VMS +#include /* XIE inter-layer definitions */ +#include /* XIE device dependant definitions */ +#else +#include /* XIE inter-layer definitions */ +#include /* XIE device dependant definitions */ +#endif + +/* +** Wire protocol constant definitions. +*/ + /* + ** Version number + */ +#define XieK_MajorVersion 2 +#define XieK_MinorVersion 3 + +/******************************************************************************* +** Protocol request packet minor op-codes +*******************************************************************************/ +#define X_ieInitSession 1 +#define X_ieTermSession 2 + +#define X_ieQueryEvents 3 +#define X_ieSelectEvents 4 + +#define X_ieSetOpDefaults 5 +#define X_ieQueryOpDefaults 6 + +#define X_ieCreateByReference 7 +#define X_ieCreateByValue 8 +#define X_ieDeleteResource 9 +#define X_ieQueryResource 10 + +#define X_ieBindPhotomap 11 +#define X_ieAbortPhotoflo 12 +#define X_ieExecutePhotoflo 13 +#define X_ieTapPhotoflo 14 + +#define X_ieAbortTransport 15 +#define X_ieGetStream 16 +#define X_ieGetTile 17 +#define X_iePutStream 18 +#define X_iePutTile 19 +#define X_ieSetTransport 20 + +#define X_ieExport 21 +#define X_ieFreeExport 22 +#define X_ieImport 23 +#define X_ieQueryExport 24 + +#define X_ieArea 25 +#define X_ieAreaStats 26 +#define X_ieArith 27 +#define X_ieCalcHist 28 +#define X_ieChromeCom 29 +#define X_ieChromeSep 30 +#define X_ieCompare 31 +#define X_ieConstrain 32 +#define X_ieCrop 33 +#define X_ieDither 34 +#define X_ieFill 35 +#define X_ieLogical 36 +#define X_ieLuminance 37 +#define X_ieMatchHistogram 38 +#define X_ieMath 39 +#define X_ieMirror 40 +#define X_iePoint 41 +#define X_iePointStats 42 +#define X_ieRotate 43 +#define X_ieScale 44 +#define X_ieTranslate 45 + +#define X_ieLastRequest 46 + +/******************************************************************************* +** Protocol packet size definitions required by Xlibint.h +*******************************************************************************/ +#define sz_xieReq 4 +#define sz_xieInitSessionReq 8 +#define sz_xieTermSessionReq 4 + +#define sz_xieQueryEventsReq 8 +#define sz_xieSelectEventsReq 8 + +#define sz_xieSetOpDefaultsReq 20 +#define sz_xieQueryOpDefaultsReq 4 + +#define sz_xieCreateByReferenceReq 16 +#define sz_xieCreateByValueReq 12 +#define sz_xieCreateCppReq 24 +#define sz_xieCreatePhotoReq 48 +#define sz_xieCreateRoiReq 28 +#define sz_xieCreateTmpReq 24 +#define sz_xieDeleteResourceReq 12 +#define sz_xieQueryResourceReq 12 + +#define sz_xieBindPhotomapReq 12 +#define sz_xieAbortPhotofloReq 8 +#define sz_xieExecutePhotofloReq 8 +#define sz_xieTapPhotofloReq 16 + +#define sz_xieAbortTransportReq 12 +#define sz_xieGetStreamReq 16 +#define sz_xieGetTileReq 32 +#define sz_xiePutStreamReq 16 +#define sz_xiePutTileReq 32 +#define sz_xieSetTransportReq 140 + +#define sz_xieExportReq 64 +#define sz_xieFreeExportReq 8 +#define sz_xieImportReq 20 +#define sz_xieQueryExportReq 16 + +#define sz_xieAreaReq 24 +#define sz_xieAreaStatsReq 20 +#define sz_xieArithReq 36 +#define sz_xieCalcHistReq 16 +#define sz_xieChromeComReq 20 +#define sz_xieChromeSepReq 16 +#define sz_xieCompareReq 36 +#define sz_xieConstrainReq 28 +#define sz_xieCropReq 16 +#define sz_xieDitherReq 24 +#define sz_xieFillReq 28 +#define sz_xieLogicalReq 36 +#define sz_xieLuminanceReq 12 +#define sz_xieMatchHistogramReq 36 +#define sz_xieMathReq 20 +#define sz_xieMirrorReq 16 +#define sz_xiePointReq 20 +#define sz_xiePointStatsReq 20 +#define sz_xieRotateReq 40 +#define sz_xieScaleReq 20 +#define sz_xieTranslateReq 24 + +/******************************************************************************* +** Sub-structures +*******************************************************************************/ + + /* + ** Structure defining the Xie function vector. + */ +typedef struct { + CARD8 function[32]; +} XieFunctionsRec, *XieFunctionVector; + + /* + ** Structure defining IdcTmp template data crossing wire. + */ +typedef struct { + INT32 x; + INT32 y; + XieFloatRec value; +} XieTmpEntryRec, *XieTmpEntry; + +/******************************************************************************* +** Protocol request packets +*******************************************************************************/ + + /* + ** Generic part of all XIE requests + */ +typedef struct { + CARD8 reqType; /* major op-code assigned to extension */ + CARD8 opcode; /* minor op-code == XIE function */ + CARD16 length; /* length in longwords of entire request */ +} xieReq; + + /* + ** Init Session Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieInitSession */ + CARD16 length; + CARD16 major_version; + CARD16 minor_version; +} xieInitSessionReq; + + /* + ** Term Session Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieTermSession */ + CARD16 length; +} xieTermSessionReq; + + /* + ** Query Events Requests + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 event_param; +} xieQueryEventsReq; + + /* + ** Select Events Requests + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 event_mask; +} xieSelectEventsReq; + + /* + ** Set Operational Defaults + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieSetOpDefaults */ + CARD16 length; + CARD8 model; + CARD8 _pad[3]; + CARD32 levels[XieK_MaxComponents]; +} xieSetOpDefaultsReq; + + /* + ** Query Operational Defaults + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieQueryOpDefaults */ + CARD16 length; +} xieQueryOpDefaultsReq; + + /* + ** Create (ie. clone Photo{flo|map}) resource By Reference Request. + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByReference*/ + CARD16 length; + CARD32 resource_type; + CARD32 resource_id; /* new Photo{flo|map}-id */ + CARD32 photomap_id; /* existing Photomap-id */ +} xieCreateByReferenceReq; + + /* + ** Generic Create resource By Value Request. + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByValue */ + CARD16 length; + CARD32 resource_type; /* new resource type */ + CARD32 resource_id; /* new resource identifier */ +} xieCreateByValueReq; + + /* + ** Create Cpp Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByValue */ + CARD16 length; + CARD32 resource_type; /* resource type == XieK_IdcCpp */ + CARD32 resource_id; + CARD32 photomap_id; + INT32 x; + INT32 y; +} xieCreateCppReq; + + /* + ** Create Photo{flo|map} from client specified attributes. + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByValue */ + CARD16 length; + CARD32 resource_type; /* XieK_Photomap or XieK_Photoflo */ + CARD32 resource_id; + CARD32 width; + CARD32 height; + XieFloatRec aspect_ratio; + CARD32 levels[XieK_MaxComponents]; + CARD8 number_of_components; + CARD8 component_mapping; + CARD8 pixel_progression; + CARD8 line_progression; + CARD8 polarity; + CARD8 _pad[3]; +} xieCreatePhotoReq; + + /* + ** Create Roi Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByValue */ + CARD16 length; + CARD32 resource_type; /* resource type == XieK_IdcRoi */ + CARD32 resource_id; + INT32 x; + INT32 y; + CARD32 width; + CARD32 height; +} xieCreateRoiReq; + + /* + ** Create Tmp Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByValue */ + CARD16 length; + CARD32 resource_type; /* resource type == XieK_IdcTmp */ + CARD32 resource_id; + INT32 center_x; + INT32 center_y; + CARD32 data_count; /* number of XieTmpEntryRec's */ +/* XieTmpEntryRec data[data_count] /* list of XieTmpEntryRec */ +} xieCreateTmpReq; + + /* + ** Delete resource request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieDeleteResource */ + CARD16 length; + CARD32 resource_type; + CARD32 resource_id; +} xieDeleteResourceReq; + + /* + ** Query resource request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieQueryResource */ + CARD16 length; + CARD32 resource_type; + CARD32 resource_id; +} xieQueryResourceReq; + + /* + ** Bind an existing Photomap to an existing Photoflo. + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieBindPhotomap */ + CARD16 length; + CARD32 photoflo_id; + CARD32 photomap_id; +} xieBindPhotomapReq; + + /* + ** Abort Photoflo request. + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieAbortPhotoflo */ + CARD16 length; + CARD32 photoflo_id; +} xieAbortPhotofloReq; + + /* + ** Execute Photoflo Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieExecutePhotoflo */ + CARD16 length; + CARD32 photoflo_id; +} xieExecutePhotofloReq; + + /* + ** Tap Photoflo Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieTapPhotoflo */ + CARD16 length; + CARD32 photoflo_id; + CARD32 photo_id; + BOOL permanent; + CARD8 _pad[3]; +} xieTapPhotofloReq; + + /* + ** Abort transport Request (release transport resources) + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieAbortTransport */ + CARD16 length; + CARD32 photo_id; + CARD32 plane_mask; +} xieAbortTransportReq; + + /* + ** Get Stream Request (transport image data: server --> client) + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieGetStream */ + CARD16 length; + CARD32 photo_id; + CARD32 max_bytes; /* maximum return image data length */ + CARD8 plane_num; + CARD8 _pad[3]; +} xieGetStreamReq; + + /* + ** Get Tile Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieGetTile */ + CARD16 length; + CARD32 photomap_id; + INT32 x; + INT32 y; + CARD32 width; + CARD32 height; + CARD32 plane_mask; + BOOL final; + CARD8 _pad[3]; +} xieGetTileReq; + + /* + ** Put Stream Request (transport image data: client --> server) + */ +typedef struct _xiePutStreamReq { + CARD8 reqType; + CARD8 opcode; /* function == X_iePutStream */ + CARD16 length; + CARD32 photo_id; + CARD32 byte_count; /* image plane data length in bytes */ + BOOL final; + CARD8 plane_num; + CARD8 _pad[2]; +} xiePutStreamReq; + + /* + ** Put Tile Request (transport image data: client --> server) + */ +typedef struct _xiePutTileReq { + CARD8 reqType; + CARD8 opcode; /* function == X_iePutTile */ + CARD16 length; + CARD32 photomap_id; + INT32 x; + INT32 y; + CARD32 width; + CARD32 height; + CARD32 plane_mask; + BOOL final; + CARD8 _pad[3]; +} xiePutTileReq; + + /* + ** Set transport Request (set transport parameters) + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieSetTransport */ + CARD16 length; + CARD32 photo_id; + CARD32 compression_parameter; + CARD8 compression_scheme; + CARD8 mode; + CARD8 component_organization; + CARD8 _pad; + CARD32 plane_mask; + CARD8 pixel_stride[XieK_MaxPlanes]; + CARD32 scanline_stride[XieK_MaxPlanes]; +} xieSetTransportReq; + + /* + ** Export image data to drawable Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieExport */ + CARD16 length; + CARD32 photo_id; + CARD32 drawable_id; + CARD32 gc_id; + INT32 src_x; + INT32 src_y; + CARD32 width; + CARD32 height; + INT32 dst_x; + INT32 dst_y; + CARD32 photo_lut_id; + CARD32 colormap_id; + XieFloatRec match_limit; + XieFloatRec gray_limit; +} xieExportReq; + + /* + ** Free ExportContext from Photomap Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieFreeExport */ + CARD16 length; + CARD32 photo_id; +} xieFreeExportReq; + + /* + ** Import image data from drawable Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieImport */ + CARD16 length; + CARD32 photomap_id; + CARD32 drawable_id; + CARD32 colormap_id; + CARD8 polarity; + CARD8 _pad[3]; +} xieImportReq; + + /* + ** Query ExportContext Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieQueryExport */ + CARD16 length; + CARD32 photo_id; + CARD32 lut_id; + BOOL get_pixels; + CARD8 _pad[3]; +} xieQueryExportReq; + + /* + ** Area Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 ipcc_id; + CARD32 ipct_id; + CARD8 op1; + CARD8 op2; + CARD8 constrain; + CARD8 _pad; +} xieAreaReq; + + /* + ** Area Statistics Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD8 edge_size; + CARD8 stat_type; + CARD8 _pad[2]; +} xieAreaStatsReq; + + /* + ** Arith Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieArithmetic */ + CARD16 length; + CARD32 src1_photo_id; + CARD32 src2_photo_id; + CARD32 constants[XieK_MaxComponents]; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD8 op; + CARD8 constrain; + CARD16 _pad; +} xieArithReq; + + /* + ** Calculate Histogram Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 photo_id; + CARD32 idc_id; + CARD8 by_component; + CARD8 _pad[3]; +} xieCalcHistReq; + + /* + ** Chrominance Combine Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 photo_id1; + CARD32 photo_id2; + CARD32 photo_id3; + CARD32 dst_photo_id; +} xieChromeComReq; + + /* + ** Chrominance Separate Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src_photo; + CARD32 dst_photo; + CARD32 component; +} xieChromeSepReq; + + /* + ** Compare Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src1_photo_id; + CARD32 src2_photo_id; + CARD32 constants[XieK_MaxComponents]; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD8 op; + CARD8 combine; + CARD16 _pad; +} xieCompareReq; + + /* + ** Constrain Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieConstrain */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD8 model; + CARD8 _pad[3]; + CARD32 levels[XieK_MaxComponents]; + +} xieConstrainReq; + + /* + ** Crop Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCrop */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 idc_id; +} xieCropReq; + + /* + ** Dither Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieDither */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 levels[XieK_MaxComponents]; +} xieDitherReq; + + /* + ** Fill Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieFill */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 dst_idc_id; + CARD32 constant[XieK_MaxComponents]; +} xieFillReq; + + /* + ** Logical Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieLogical */ + CARD16 length; + CARD32 src1_photo_id; + CARD32 src2_photo_id; + CARD32 constants[XieK_MaxComponents]; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD8 op; + CARD8 _pad[3]; + } xieLogicalReq; + + /* + ** Luminance Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieLuminance */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; +} xieLuminanceReq; + + /* + ** Math Function Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD8 op; + CARD8 constrain; + CARD16 _pad; +} xieMathReq; + + /* + ** Match Histogram Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 photo_id1; + CARD32 photo_id2; + CARD32 idc_id; + XieFloatRec param1; + XieFloatRec param2; + CARD8 h_shape; + CARD8 _pad[3]; +} xieMatchHistogramReq; + + /* + ** Mirror Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieMirror */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + BOOL x_mirror; + BOOL y_mirror; + CARD8 _pad[2]; +} xieMirrorReq; + + /* + ** Point Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD32 trans_photo_id; +} xiePointReq; + + /* + ** Point Statistics Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 photo_id; + INT32 x; + INT32 y; + CARD8 height; + CARD8 width; + CARD8 _pad[2]; +} xiePointStatsReq; + + /* + ** Rotate Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieRotate */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + XieFloatRec angle; + CARD32 width; + CARD32 height; + CARD32 fill[XieK_MaxComponents]; +} xieRotateReq; + + /* + ** Scale Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieScale */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 width; + CARD32 height; +} xieScaleReq; + + /* + ** Translate Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieTranslate */ + CARD16 length; + CARD32 src1_photo_id; + CARD32 src2_photo_id; + CARD32 src_idc_id; + CARD32 dst_photo_id; + CARD32 dst_idc_id; +} xieTranslateReq; + +#ifdef NOT_YET_IMPLEMENTED +/************ NONE OF THE FOLLOWING REQUESTS HAVE BEEN IMPLEMENTED ************/ + /* + ** Display Sequence Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 window_id; + CARD16 frame_count; + CARD16 frame_timing; + CARD8 forward; + CARD8 number_of_pixmaps; +} xieDisplaySeqReq; + +/**************************** END OF UNIMPLEMENTED REQUESTS *******************/ +#endif + +/******************************************************************************* +** Events +*******************************************************************************/ + /* + ** Send Xie Event + */ +typedef struct { + CARD8 type; + CARD8 detail; + CARD16 sequenceNumber; + CARD32 resource_id; + CARD8 _pad[24]; +} xieSendEvent; + +/******************************************************************************* +** Replies +*******************************************************************************/ + /* + ** Reply for Init Session + */ +typedef struct { + INT8 type; + CARD8 success; + CARD16 sequenceNumber; + CARD32 length; + CARD16 major_version; + CARD16 minor_version; + CARD32 service_class; /* not implemented */ + CARD8 _pad[16]; +} xieInitSessionReply; + + /* + ** Reply for Query Events + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD32 event_mask; + CARD8 _pad[20]; +} xieQueryEventsReply; + + /* + ** Reply for Query Operational Defaults + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD8 model; + CARD8 _pad[3]; + CARD32 levels[XieK_MaxComponents]; + CARD8 _pad1[8]; +} xieQueryOpDefaultsReply; + + /* + ** Reply for Query Resource: resource type == Photoflo + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD32 status; + CARD8 _pad[20]; +} xieQueryPhotofloReply; + + /* + ** Reply for Query Resource: resource type == Photo{map|tap} + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD32 width; + CARD32 height; + XieFloatRec aspect_ratio; + CARD8 polarity; + CARD8 pixel_progression; + CARD8 line_progression; + BOOL constrained; + CARD8 component_mapping; + CARD8 component_count; + CARD8 _pad[2]; + CARD32 levels[XieK_MaxComponents]; + CARD32 photo_id; +} xieQueryPhotomapReply; + + /* + ** Reply for Query Resource: resource type == Idc of type XieK_Cpp + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + INT32 x; + INT32 y; + CARD32 photomap_id; + CARD8 _pad[12]; +} xieQueryCppReply; + + /* + ** Reply for Query Resource: resource type == Idc of type XieK_Roi + */ +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + INT32 x; + INT32 y; + CARD32 width; + CARD32 height; + CARD8 _pad[8]; +} xieQueryRoiReply; + + /* + ** Reply for Query Resource: resource type == Idc of type XieK_Tmp + */ +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; /* length of entries: long words */ + INT32 center_x; + INT32 center_y; + CARD32 data_count; /* number of XieTmpEntryRec's to */ + CARD8 _pad[12]; /* follow xieQueryTmpReply as data */ +} xieQueryTmpReply; + + /* + ** Reply for Get Stream + */ +typedef struct { + INT8 type; + CARD8 status; + CARD16 sequenceNumber; + CARD32 length; /* length of image data: longwords */ + CARD32 byte_count; /* image plane data length in bytes */ + CARD8 _pad[20]; +} xieGetStreamReply; + + /* + ** Reply for Get Tile + */ +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; /* length of image data: longwords */ + CARD8 _pad[24]; +} xieGetTileReply; + + /* + ** Reply for QueryExport -- returns LUT and list of allocated pixels + */ +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; /* number of pixels being returned */ + CARD32 pixel_count; + CARD32 lut_id; + CARD8 lut_mapping; + CARD8 _pad[15]; +} xieQueryExportReply; + + /* + ** Reply for CalcHistogram -- returns frequency distribution data + */ +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; /* size of histogram list in longs */ + CARD8 _pad[24]; +} xieCalcHistReply; + + /* + ** Reply for Point Statistics + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD8 _pad[24]; +} xiePointStatsReply; + +/* the following structure is used for Point Statistics */ + +typedef struct { + XieFloatRec pixel; + XieFloatRec minimum; + XieFloatRec maximum; + XieFloatRec mean; + XieFloatRec std_dev; + XieFloatRec variance; +} xiePointStatsData, *xiePointStatsDataPtr; + + +#ifdef NOT_YET_IMPLEMENTED +/************ NONE OF THE FOLLOWING REPLIES HAVE BEEN IMPLEMENTED *************/ + +typedef struct { + CARD16 screen_width_millimeters; + CARD16 screen_height_millimeters; + CARD16 screen_width_pixels; + CARD16 screen_height_pixels; + CARD16 screen_depth; + CARD16 screen_luts_size; + CARD8 screen_number; + CARD8 screen_luts; + CARD8 screen_brightness_control; + CARD8 screen_contrast_control; + CARD8 screen_hue_control; + CARD8 _pad[5]; +} screen_data; + +typedef struct { + CARD32 minimum; + CARD32 maximum; + CARD32 mean; + CARD32 std_dev; + CARD32 variance; +} statistics_data; + +/* Reply for Dot Product */ + +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD32 _pad[6]; +} xieDotProductReply; + +/*** following display stuff may be deleted or expanded */ + +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD8 idc_type; + CARD8 skip_or_show; + CARD32 pixmap; + CARD16 _pad; +} xieSingleStaticReply; + +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD8 idc_type; + CARD8 map_x_tiles; + CARD8 map_y_tiles; + CARD32 current_frame; + CARD32 number_of_display_frames; +} xieSpatialMapReply; + +typedef struct { + CARD32 pixmap; + CARD8 skip_or_show; + CARD8 _pad[3]; +} display_frame; + +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD32 current_frame; + CARD32 number_of_display_frames; + CARD8 idc_type; + CARD8 map_x_tiles; + CARD8 map_y_tiles; + CARD8 _pad[14]; +} xieTimeSequenceReply; + +/**************************** END OF UNIMPLEMENTED REPLIES ********************/ +#endif +/* +** This "endif" MUST be the last line of this file. +*/ +#endif /* end of XIEPROTO -- NO DEFINITIONS ALLOWED BEYOND THIS POINT */ + diff --git a/xie/docs/dec/xie23-src/include/XieUdpDef.h b/xie/docs/dec/xie23-src/include/XieUdpDef.h new file mode 100644 index 0000000..44d88ff --- /dev/null +++ b/xie/docs/dec/xie23-src/include/XieUdpDef.h @@ -0,0 +1,118 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/********************************************************************************************************************************/ +/* Created 23-MAY-1992 03:11:09 by VAX SDL V3.2-12 Source: 12-JUL-1990 18:14:51 VNRESD$:[XIESMI.SRC]XIEUDPDEF.SDL;1 */ +/********************************************************************************************************************************/ +/******************************************************************************* */ +/** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, */ +/** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. */ +/** */ +/** All Rights Reserved */ +/** */ +/** Permission to use, copy, modify, and distribute this software and its */ +/** documentation for any purpose and without fee is hereby granted, */ +/** provided that the above copyright notice appear in all copies and that */ +/** both that copyright notice and this permission notice appear in */ +/** supporting documentation, and that the names of Digital or MIT not be */ +/** used in advertising or publicity pertaining to distribution of the */ +/** software without specific, written prior permission. */ +/** */ +/** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */ +/** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL */ +/** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR */ +/** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, */ +/** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */ +/** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS */ +/** SOFTWARE. */ +/** */ +/******************************************************************************* */ +/******************************************************************************* */ +/** */ +/** FACILITY: */ +/** */ +/** Sample Machine Independant DDX */ +/** X Image Extensions */ +/** */ +/** ABSTRACT: */ +/** */ +/** This include file defines low level image data representation */ +/** structures. */ +/** */ +/** ENVIRONMENT: */ +/** */ +/** VAX/VMS V5.3 */ +/** ULTRIX V3.1 */ +/** */ +/** AUTHOR(S): */ +/** */ +/** John Weber */ +/** */ +/** CREATION DATE: */ +/** */ +/** August 12, 1989 */ +/** */ +/** MODIFICATION HISTORY: */ +/** */ +/******************************************************************************* */ + +/*** MODULE XieUdpDef ***/ +#ifndef UDPDEF +#define UDPDEF +struct UDP { + unsigned short int UdpW_PixelLength; + unsigned char UdpB_DType; + unsigned char UdpB_Class; + unsigned char *UdpA_Base; + unsigned long int UdpL_ArSize; + unsigned long int UdpL_PxlStride; + unsigned long int UdpL_ScnStride; + long int UdpL_X1; + long int UdpL_X2; + long int UdpL_Y1; + long int UdpL_Y2; + unsigned long int UdpL_PxlPerScn; + unsigned long int UdpL_ScnCnt; + long int UdpL_Pos; + unsigned long int UdpL_CompIdx; + unsigned long int UdpL_Levels; + } ; +typedef struct UDP UdpRec, *UdpPtr; +#define UdpK_DTypeUndefined 0 +#define UdpK_DTypeMin 1 +#define UdpK_DTypeBU 1 +#define UdpK_DTypeWU 2 +#define UdpK_DTypeLU 3 +#define UdpK_DTypeF 4 +#define UdpK_DTypeC 5 +#define UdpK_DTypeVU 6 +#define UdpK_DTypeV 7 +#define UdpK_DTypeCL 8 +#define UdpK_DTypeMax 8 +#define UdpK_ClassUBA 1 +#define UdpK_ClassUBS 2 +#define UdpK_ClassA 3 +#define UdpK_ClassCL 4 +#endif /* UDPDEF */ diff --git a/xie/docs/dec/xie23-src/include/bits.h b/xie/docs/dec/xie23-src/include/bits.h new file mode 100644 index 0000000..2bfb950 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/bits.h @@ -0,0 +1,114 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* +************************************************************************** +** DIGITAL EQUIPMENT CORPORATION ** +** CONFIDENTIAL ** +** NOT FOR MODIFICATION OR REDISTRIBUTION IN ANY MANNER WHATSOEVER ** +************************************************************************** +*/ +/* + * This include file is designed to be a portable way for systems to define + * bit field manipulation of arrays of bits. + */ +#ifndef __BITS__ +#define __BITS__ "@(#)bits.h 1.6 - 90/09/18 " +/* RCSID = $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/include/bits.h,v 1.1.2.2 92/02/06 13:44:37 Jim_Ludwig Exp $" */ + +/***************************************************************************** +Copyright 1987, 1988, 1989, 1990 by Digital Equipment Corporation, Maynard, MA + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*****************************************************************************/ +/* + * + * CONTRIBUTORS: + * + * Dick Annicchiarico + * Robert Chesler + * Dan Coutu + * Gene Durso + * Marc Evans + * Alan Jamison + * Mark Henry + * Ken Miller + * + */ +typedef unsigned char *UByteP; /* Pointer to an unsigned byte array */ +#define BitsInByte 8L /* The number of bits in a byte */ + +#define BitInByte(bit) /* Returns the bit mask of a byte */ \ + (1L << (((bit) % BitsInByte))) + +#define BitInWord(bit) /* Returns the bit mask of a word */ \ + (1L << (((bit) % (BitsInByte * 2L)))) + +#define BitInLong(bit) /* Returns the bit mask of a long */ \ + (1L << (((bit) % (BitsInByte * 4L)))) + +#define ByteInArray(array,bit) /* Returns the byte offset to get to a bit */ \ + (((UByteP)(array))[(bit) / BitsInByte]) + +#define BitIsTrue(array,bit) /* Test to see if a specific bit is True */ \ + (ByteInArray(array,bit) & BitInByte(bit)) + +#define BitIsFalse(array,bit) /* Test to see if a specific bit is False */ \ + (!(BitIsTrue(array,bit))) + +#define BitTrue(array,bit) /* Set a specific bit to be True */ \ + (ByteInArray(array,bit) |= BitInByte(bit)) + +#define BitFalse(array,bit) /* Set a specific bit to be False */ \ + (ByteInArray(array,bit) &= ~BitInByte(bit)) + +#define BitToggle(array,bit) /* Toggle a specific bit */ \ + (ByteInArray(array,bit) ^= BitInByte(bit)) + +#define BitCopy(dest,src,bit) /* Copy a specific bit */ \ + BitIsTrue((src),(bit)) ? BitTrue((dest),(bit)) : BitFalse((dest),(bit)) + +#define BitValue(array,bit) /* Return True or False depending on bit */ \ + (BitIsTrue((array),(bit)) ? True : False) + +#define BitSet(array,bit,value) /* Set bit to given value in array */ \ + (value) ? BitTrue((array),(bit)) : BitFalse((array),(bit)) + +#endif /* __BITS__ */ diff --git a/xie/docs/dec/xie23-src/include/extutil.h b/xie/docs/dec/xie23-src/include/extutil.h new file mode 100644 index 0000000..b597c17 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/extutil.h @@ -0,0 +1,148 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* + * $XConsortium: extutil.h,v 1.11 89/12/09 21:12:33 rws Exp $ + * + * Copyright 1989 Massachusetts Institute of Technology + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Jim Fulton, MIT X Consortium + * + * Xlib Extension-Writing Utilities + * + * This package contains utilities for writing the client API for various + * protocol extensions. THESE INTERFACES ARE NOT PART OF THE X STANDARD AND + * ARE SUBJECT TO CHANGE! + */ + +#ifndef _EXTUTIL_H_ +#define _EXTUTIL_H_ + +/* + * We need to keep a list of open displays since the Xlib display list isn't + * public. We also have to per-display info in a separate block since it isn't + * stored directly in the Display structure. + */ +typedef struct _XExtDisplayInfo { + struct _XExtDisplayInfo *next; /* keep a linked list */ + Display *display; /* which display this is */ + XExtCodes *codes; /* the extension protocol codes */ + caddr_t data; /* extra data for extension to use */ +} XExtDisplayInfo; + +typedef struct _XExtensionInfo { + XExtDisplayInfo *head; /* start of list */ + XExtDisplayInfo *cur; /* most recently used */ + int ndisplays; /* number of displays */ +} XExtensionInfo; + +typedef struct _XExtensionHooks { + int (*create_gc)(); + int (*copy_gc)(); + int (*flush_gc)(); + int (*free_gc)(); + int (*create_font)(); + int (*free_font)(); + int (*close_display)(); + Bool (*wire_to_event)(); + Status (*event_to_wire)(); + int (*error)(); + char *(*error_string)(); +} XExtensionHooks; + +extern XExtensionInfo *XextCreateExtension(); +extern void XextDestroyExtension(); +extern XExtDisplayInfo *XextAddDisplay(); +extern int XextRemoveDisplay(); +extern XExtDisplayInfo *XextFindDisplay(); + +#define XextHasExtension(i) ((i) && ((i)->codes)) +#define XextCheckExtension(dpy,i,name,val) \ + if (!XextHasExtension(i)) { XMissingExtension (dpy, name); return val; } +#define XextSimpleCheckExtension(dpy,i,name) \ + if (!XextHasExtension(i)) { XMissingExtension (dpy, name); return; } + + +/* + * helper macros to generate code that is common to all extensions; caller + * should prefix it with static if extension source is in one file; this + * could be a utility function, but have to stack 6 unused arguments for + * something that is called many, many times would be bad. + */ +#define XEXT_GENERATE_FIND_DISPLAY(proc,extinfo,extname,hooks,nev,data) \ +XExtDisplayInfo *proc (dpy) \ + register Display *dpy; \ +{ \ + XExtDisplayInfo *dpyinfo; \ + if (!extinfo) { if (!(extinfo = XextCreateExtension())) return NULL; } \ + if (!(dpyinfo = XextFindDisplay (extinfo, dpy))) \ + dpyinfo = XextAddDisplay (extinfo,dpy,extname,hooks,nev,data); \ + return dpyinfo; \ +} + +#define XEXT_GENERATE_CLOSE_DISPLAY(proc,extinfo) \ +int proc (dpy, codes) \ + Display *dpy; \ + XExtCodes *codes; \ +{ \ + return XextRemoveDisplay (extinfo, dpy); \ +} + +#define XEXT_GENERATE_ERROR_STRING(proc,extname,nerr,errl) \ +char *proc (dpy, code, codes, buf, n) \ + Display *dpy; \ + int code; \ + XExtCodes *codes; \ + char *buf; \ + int n; \ +{ \ + code -= codes->first_error; \ + if (code >= 0 && code < nerr) { \ + char tmp[256]; \ + sprintf (tmp, "%s.%d", extname, code); \ + XGetErrorDatabaseText (dpy, "XProtoError", tmp, errl[code], buf, n); \ + return buf; \ + } \ + return (char *)0; \ +} + +#endif diff --git a/xie/docs/dec/xie23-src/include/mitmiscstr.h b/xie/docs/dec/xie23-src/include/mitmiscstr.h new file mode 100644 index 0000000..4576b0b --- /dev/null +++ b/xie/docs/dec/xie23-src/include/mitmiscstr.h @@ -0,0 +1,81 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/************************************************************ +Copyright 1989 by The Massachusetts Institute of Technology + +Permission to use, copy, modify, and distribute this +software and its documentation for any purpose and without +fee is hereby granted, provided that the above copyright +no- tice appear in all copies and that both that copyright +no- tice and this permission notice appear in supporting +docu- mentation, and that the name of MIT not be used in +advertising or publicity pertaining to distribution of the +software without specific prior written permission. +M.I.T. makes no representation about the suitability of +this software for any purpose. It is provided "as is" +without any express or implied warranty. + +********************************************************/ + +/* RANDOM CRUFT! THIS HAS NO OFFICIAL X CONSORTIUM BLESSING */ + +/* $XConsortium: mitmiscstr.h,v 1.3 90/05/15 18:50:18 keith Exp $ */ + +#include "MITMisc.h" + +#define MITMISCNAME "MIT-SUNDRY-NONSTANDARD" + +typedef struct _SetBugMode { + CARD8 reqType; /* always MITReqCode */ + CARD8 mitReqType; /* always X_MITSetBugMode */ + CARD16 length B16; + BOOL onOff; + BYTE pad0; + CARD16 pad1; +} xMITSetBugModeReq; +#define sz_xMITSetBugModeReq 8 + +typedef struct _GetBugMode { + CARD8 reqType; /* always MITReqCode */ + CARD8 mitReqType; /* always X_MITGetBugMode */ + CARD16 length B16; +} xMITGetBugModeReq; +#define sz_xMITGetBugModeReq 4 + +typedef struct { + BYTE type; /* X_Reply */ + BOOL onOff; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 pad0 B32; + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; +} xMITGetBugModeReply; +#define sz_xMITGetBugModeReply 32 + diff --git a/xie/docs/dec/xie23-src/include/multibuf.h b/xie/docs/dec/xie23-src/include/multibuf.h new file mode 100644 index 0000000..7a72bfd --- /dev/null +++ b/xie/docs/dec/xie23-src/include/multibuf.h @@ -0,0 +1,305 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* + * $XConsortium: multibuf.h,v 1.15 91/07/12 10:20:42 rws Exp $ + * + * Copyright 1989 Massachusetts Institute of Technology + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _MULTIBUF_H_ +#define _MULTIBUF_H_ + +#include + +#define MULTIBUFFER_PROTOCOL_NAME "Multi-Buffering" + +#define MULTIBUFFER_MAJOR_VERSION 1 /* current version numbers */ +#define MULTIBUFFER_MINOR_VERSION 0 + +#define X_MbufGetBufferVersion 0 +#define X_MbufCreateImageBuffers 1 +#define X_MbufDestroyImageBuffers 2 +#define X_MbufDisplayImageBuffers 3 +#define X_MbufSetMBufferAttributes 4 +#define X_MbufGetMBufferAttributes 5 +#define X_MbufSetBufferAttributes 6 +#define X_MbufGetBufferAttributes 7 +#define X_MbufGetBufferInfo 8 +#define X_MbufCreateStereoWindow 9 + +/* + * update_action field + */ +#define MultibufferUpdateActionUndefined 0 +#define MultibufferUpdateActionBackground 1 +#define MultibufferUpdateActionUntouched 2 +#define MultibufferUpdateActionCopied 3 + +/* + * update_hint field + */ +#define MultibufferUpdateHintFrequent 0 +#define MultibufferUpdateHintIntermittent 1 +#define MultibufferUpdateHintStatic 2 + +/* + * valuemask fields + */ +#define MultibufferWindowUpdateHint (1L << 0) +#define MultibufferBufferEventMask (1L << 0) + +/* + * mono vs. stereo and left vs. right + */ +#define MultibufferModeMono 0 +#define MultibufferModeStereo 1 +#define MultibufferSideMono 0 +#define MultibufferSideLeft 1 +#define MultibufferSideRight 2 + +/* + * clobber state + */ +#define MultibufferUnclobbered 0 +#define MultibufferPartiallyClobbered 1 +#define MultibufferFullyClobbered 2 + +/* + * event stuff + */ +#define MultibufferClobberNotifyMask 0x02000000 +#define MultibufferUpdateNotifyMask 0x04000000 + +#define MultibufferClobberNotify 0 +#define MultibufferUpdateNotify 1 +#define MultibufferNumberEvents (MultibufferUpdateNotify + 1) + +#define MultibufferBadBuffer 0 +#define MultibufferNumberErrors (MultibufferBadBuffer + 1) + + +#ifndef _MULTIBUF_SERVER_ +/* + * Extra definitions that will only be needed in the client + */ +typedef XID Multibuffer; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + int send_event; /* true if this came frome a SendEvent request */ + Display *display; /* Display the event was read from */ + Multibuffer buffer; /* buffer of event */ + int state; /* see Clobbered constants above */ +} XmbufClobberNotifyEvent; + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + int send_event; /* true if this came frome a SendEvent request */ + Display *display; /* Display the event was read from */ + Multibuffer buffer; /* buffer of event */ +} XmbufUpdateNotifyEvent; + + +/* + * per-window attributes that can be got + */ +typedef struct { + int displayed_index; /* which buffer is being displayed */ + int update_action; /* Undefined, Background, Untouched, Copied */ + int update_hint; /* Frequent, Intermittent, Static */ + int window_mode; /* Mono, Stereo */ + int nbuffers; /* Number of buffers */ + Multibuffer *buffers; /* Buffers */ +} XmbufWindowAttributes; + +/* + * per-window attributes that can be set + */ +typedef struct { + int update_hint; /* Frequent, Intermittent, Static */ +} XmbufSetWindowAttributes; + + +/* + * per-buffer attributes that can be got + */ +typedef struct { + Window window; /* which window this belongs to */ + unsigned long event_mask; /* events that have been selected */ + int buffer_index; /* which buffer is this */ + int side; /* Mono, Left, Right */ +} XmbufBufferAttributes; + +/* + * per-buffer attributes that can be set + */ +typedef struct { + unsigned long event_mask; /* events that have been selected */ +} XmbufSetBufferAttributes; + + +/* + * per-screen buffer info (there will be lists of them) + */ +typedef struct { + VisualID visualid; /* visual usuable at this depth */ + int max_buffers; /* most buffers for this visual */ + int depth; /* depth of buffers to be created */ +} XmbufBufferInfo; + +_XFUNCPROTOBEGIN + +extern Bool XmbufQueryExtension( +#if NeedFunctionPrototypes + Display* /* dpy */, + int* /* event_base_return */, + int* /* error_base_return */ +#endif +); + +extern Status XmbufGetVersion( +#if NeedFunctionPrototypes + Display* /* dpy */, + int* /* major_version_return */, + int* /* minor_version_return */ +#endif +); + +extern int XmbufCreateBuffers( +#if NeedFunctionPrototypes + Display* /* dpy */, + Window /* w */, + int /* count */, + int /* update_action */, + int /* update_hint */, + Multibuffer* /* buffers */ +#endif +); + +extern void XmbufDestroyBuffers( +#if NeedFunctionPrototypes + Display* /* dpy */, + Window /* window */ +#endif +); + +extern void XmbufDisplayBuffers( +#if NeedFunctionPrototypes + Display* /* dpy */, + int /* count */, + Multibuffer* /* buffers */, + int /* min_delay */, + int /* max_delay */ +#endif +); + +extern Status XmbufGetWindowAttributes( +#if NeedFunctionPrototypes + Display* /* dpy */, + Window /* w */, + XmbufWindowAttributes* /* attr */ +#endif +); + +extern void XmbufChangeWindowAttributes( +#if NeedFunctionPrototypes + Display* /* dpy */, + Window /* w */, + unsigned long /* valuemask */, + XmbufSetWindowAttributes* /* attr */ +#endif +); + +extern Status XmbufGetBufferAttributes( +#if NeedFunctionPrototypes + Display* /* dpy */, + Multibuffer /* b */, + XmbufBufferAttributes* /* attr */ +#endif +); + +extern void XmbufChangeBufferAttributes( +#if NeedFunctionPrototypes + Display* /* dpy */, + Multibuffer /* b */, + unsigned long /* valuemask */, + XmbufSetBufferAttributes* /* attr */ +#endif +); + +extern Status XmbufGetScreenInfo( +#if NeedFunctionPrototypes + Display* /* dpy */, + Drawable /* d */, + int* /* nmono_return */, + XmbufBufferInfo** /* mono_info_return */, + int* /* nstereo_return */, + XmbufBufferInfo** /* stereo_info_return */ +#endif +); + +extern Window XmbufCreateStereoWindow( +#if NeedFunctionPrototypes + Display* /* dpy */, + Window /* parent */, + int /* x */, + int /* y */, + unsigned int /* width */, + unsigned int /* height */, + unsigned int /* border_width */, + int /* depth */, + unsigned int /* class */, + Visual* /* visual */, + unsigned long /* valuemask */, + XSetWindowAttributes* /* attr */, + Multibuffer* /* leftp */, + Multibuffer* /* rightp */ +#endif +); + +_XFUNCPROTOEND + +#endif /* _MULTIBUF_SERVER_ */ +#endif /* _MULTIBUF_H_ */ diff --git a/xie/docs/dec/xie23-src/include/multibufst.h b/xie/docs/dec/xie23-src/include/multibufst.h new file mode 100644 index 0000000..9af9e29 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/multibufst.h @@ -0,0 +1,301 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* + * $XConsortium: multibufst.h,v 1.7 91/01/05 16:32:49 rws Exp $ + * + * Copyright 1989 Massachusetts Institute of Technology + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _MULTIBUFST_H_ +#define _MULTIBUFST_H_ + +/* + * Protocol requests constants and alignment values + * These would really be in Multi-Buffering's X.h and Xproto.h equivalents + */ + +#include "multibuf.h" + +#include /* for Window & VisualId defines */ +/* Added to match X11/Xproto.h */ +#define Window CARD32 +#define Drawable CARD32 +#define VisualID CARD32 + +#if defined(__STDC__) && !defined(UNIXCPP) +#define MbufGetReq(name,req,info) GetReq (name, req); \ + req->reqType = info->codes->major_opcode; \ + req->mbufReqType = X_##name; +#else +#define MbufGetReq(name,req,info) GetReq (name, req); \ + req->reqType = info->codes->major_opcode; \ + req->mbufReqType = X_/**/name; +#endif + +#define Multibuffer CARD32 + +typedef struct { + CARD32 visualID B32; /* associated visual */ + CARD16 maxBuffers B16; /* maximum supported buffers */ + CARD8 depth; /* depth of visual (redundant) */ + CARD8 unused; +} xMbufBufferInfo; +#define sz_xMbufBufferInfo 8 + +typedef struct { + BYTE type; + BYTE unused; + CARD16 sequenceNumber B16; + CARD32 buffer B32; /* affected buffer */ + BYTE state; /* current status */ + CARD8 unused1; + CARD16 unused2 B16; + CARD32 unused3 B32; + CARD32 unused4 B32; + CARD32 unused5 B32; + CARD32 unused6 B32; + CARD32 unused7 B32; +} xMbufClobberNotifyEvent; + +typedef struct { + BYTE type; + BYTE unused; + CARD16 sequenceNumber B16; + CARD32 buffer B32; /* affected buffer */ + CARD32 timeStamp B32; /* update time */ + CARD32 unused1 B32; + CARD32 unused2 B32; + CARD32 unused3 B32; + CARD32 unused4 B32; + CARD32 unused5 B32; + CARD32 unused6 B32; +} xMbufUpdateNotifyEvent; + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 mbufReqType; /* always X_MbufGetBufferVersion */ + CARD16 length B16; +} xMbufGetBufferVersionReq; +#define sz_xMbufGetBufferVersionReq 4 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 unused; /* not used */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD8 majorVersion; /* major version of Multi-Buffering protocol */ + CARD8 minorVersion; /* minor version of Multi-Buffering protocol */ + CARD16 pad1 B16; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xMbufGetBufferVersionReply; +#define sz_xMbufGetBufferVersionReply 32 + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 mbufReqType; /* always X_MbufCreateImageBuffers */ + CARD16 length B16; + CARD32 window B32; /* associated window */ + CARD8 updateAction; /* action at update */ + CARD8 updateHint; /* hint as to frequency of updates */ + CARD16 unused; +} xMbufCreateImageBuffersReq; /* followed by buffer ids */ +#define sz_xMbufCreateImageBuffersReq 12 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 unused; /* not used */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 numberBuffer B16; /* number successfully allocated */ + CARD16 unused1 B16; + CARD32 unused2 B32; + CARD32 unused3 B32; + CARD32 unused4 B32; + CARD32 unused5 B32; + CARD32 unused6 B32; +} xMbufCreateImageBuffersReply; +#define sz_xMbufCreateImageBuffersReply 32 + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 mbufReqType; /* always X_MbufDestroyImageBuffers */ + CARD16 length B16; + CARD32 window B32; /* associated window */ +} xMbufDestroyImageBuffersReq; +#define sz_xMbufDestroyImageBuffersReq 8 + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 mbufReqType; /* always X_MbufDisplayImageBuffers */ + CARD16 length B16; + CARD16 minDelay B16; /* minimum time between last update and now */ + CARD16 maxDelay B16; /* maximum time between last update and now */ +} xMbufDisplayImageBuffersReq; /* followed by list of buffers */ +#define sz_xMbufDisplayImageBuffersReq 8 + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 mbufReqType; /* always X_MbufSetMBufferAttributes */ + CARD16 length B16; + CARD32 window B32; /* associated window */ + CARD32 valueMask B32; /* modified entries */ +} xMbufSetMBufferAttributesReq; /* followed by values */ +#define sz_xMbufSetMBufferAttributesReq 12 + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 mbufReqType; /* always X_MbufGetMBufferAttributes */ + CARD16 length B16; + CARD32 window B32; /* associated window */ +} xMbufGetMBufferAttributesReq; +#define sz_xMbufGetMBufferAttributesReq 8 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 unused; /* not used */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 displayedBuffer B16; /* currently visible buffer */ + CARD8 updateAction; + CARD8 updateHint; + CARD8 windowMode; + CARD8 unused0; + CARD16 unused1 B16; + CARD32 unused2 B32; + CARD32 unused3 B32; + CARD32 unused4 B32; + CARD32 unused5 B32; +} xMbufGetMBufferAttributesReply; +#define sz_xMbufGetMBufferAttributesReply 32 + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 mbufReqType; /* always X_MbufSetBufferAttributes */ + CARD16 length B16; + CARD32 buffer B32; + CARD32 valueMask B32; +} xMbufSetBufferAttributesReq; /* followed by values */ +#define sz_xMbufSetBufferAttributesReq 12 + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 mbufReqType; /* always X_MbufGetBufferAttributes */ + CARD16 length B16; + CARD32 buffer B32; +} xMbufGetBufferAttributesReq; +#define sz_xMbufGetBufferAttributesReq 8 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 unused; /* not used */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 window B32; + CARD32 eventMask B32; + CARD16 bufferIndex B16; + CARD8 side; + CARD8 unused0; + CARD32 unused1 B32; + CARD32 unused2 B32; + CARD32 unused3 B32; +} xMbufGetBufferAttributesReply; +#define sz_xMbufGetBufferAttributesReply 32 + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 mbufReqType; /* always X_MbufGetBufferInfo */ + CARD16 length B16; + Drawable drawable B32; +} xMbufGetBufferInfoReq; +#define sz_xMbufGetBufferInfoReq 8 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 unused; /* not used */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 normalInfo B16; + CARD16 stereoInfo B16; + CARD32 unused1 B32; + CARD32 unused2 B32; + CARD32 unused3 B32; + CARD32 unused4 B32; + CARD32 unused5 B32; +} xMbufGetBufferInfoReply; /* followed by buffer infos */ +#define sz_xMbufGetBufferInfoReply 32 + + +typedef struct { + CARD8 reqType; /* always codes->major_opcode */ + CARD8 mbufReqType; /* always X_MbufCreateStereoWindow */ + CARD16 length B16; + CARD8 unused0; + CARD8 unused1; + CARD8 unused2; + CARD8 depth; + Window wid B32; + Window parent B32; + Multibuffer left B32; /* associated buffers */ + Multibuffer right B32; + INT16 x B16; + INT16 y B16; + CARD16 width B16; + CARD16 height B16; + CARD16 borderWidth B16; + CARD16 class B16; + VisualID visual B32; + CARD32 mask B32; +} xMbufCreateStereoWindowReq; /* followed by value list */ +#define sz_xMbufCreateStereoWindowReq 44 + + +#undef Multibuffer +#undef Window CARD32 +#undef Drawable CARD32 +#undef VisualID CARD32 + +#endif /* _MULTIBUFST_H_ */ diff --git a/xie/docs/dec/xie23-src/include/shape.h b/xie/docs/dec/xie23-src/include/shape.h new file mode 100644 index 0000000..65aff1d --- /dev/null +++ b/xie/docs/dec/xie23-src/include/shape.h @@ -0,0 +1,222 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/************************************************************ +Copyright 1989 by The Massachusetts Institute of Technology + +Permission to use, copy, modify, and distribute this +software and its documentation for any purpose and without +fee is hereby granted, provided that the above copyright +no- tice appear in all copies and that both that copyright +no- tice and this permission notice appear in supporting +docu- mentation, and that the name of MIT not be used in +advertising or publicity pertaining to distribution of the +software without specific prior written permission. +M.I.T. makes no representation about the suitability of +this software for any purpose. It is provided "as is" +without any express or implied warranty. + +MIT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT- +NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE LI- +ABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH +THE USE OR PERFORMANCE OF THIS SOFTWARE. + +********************************************************/ + +/* $XConsortium: shape.h,v 1.15 91/02/17 13:09:32 rws Exp $ */ + +#ifndef _SHAPE_H_ +#define _SHAPE_H_ + +#include + +#define X_ShapeQueryVersion 0 +#define X_ShapeRectangles 1 +#define X_ShapeMask 2 +#define X_ShapeCombine 3 +#define X_ShapeOffset 4 +#define X_ShapeQueryExtents 5 +#define X_ShapeSelectInput 6 +#define X_ShapeInputSelected 7 +#define X_ShapeGetRectangles 8 + +#define ShapeSet 0 +#define ShapeUnion 1 +#define ShapeIntersect 2 +#define ShapeSubtract 3 +#define ShapeInvert 4 + +#define ShapeBounding 0 +#define ShapeClip 1 + +#define ShapeNotifyMask (1L << 0) +#define ShapeNotify 0 + +#define ShapeNumberEvents (ShapeNotify + 1) + +#ifndef _SHAPE_SERVER_ +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came frome a SendEvent request */ + Display *display; /* Display the event was read from */ + Window window; /* window of event */ + int kind; /* ShapeBounding or ShapeClip */ + int x, y; /* extents of new region */ + unsigned width, height; + Time time; /* server timestamp when region changed */ + Bool shaped; /* true if the region exists */ +} XShapeEvent; + +_XFUNCPROTOBEGIN + +extern Bool XShapeQueryExtension ( +#if NeedFunctionPrototypes + Display* /* display */, + int* /* event_base */, + int* /* error_base */ +#endif +); + +extern Status XShapeQueryVersion ( +#if NeedFunctionPrototypes + Display* /* display */, + int* /* major_version */, + int* /* minor_version */ +#endif +); + +extern void XShapeCombineRegion ( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* dest */, + int /* dest_kind */, + int /* x_off */, + int /* y_off */, + Region /* region */, + int /* op */ +#endif +); + +extern void XShapeCombineRectangles ( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* dest */, + int /* dest_kind */, + int /* x_off */, + int /* y_off */, + XRectangle* /* rectangles */, + int /* n_rects */, + int /* op */, + int /* ordering */ +#endif +); + +extern void XShapeCombineMask ( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* dest */, + int /* dest_kind */, + int /* x_off */, + int /* y_off */, + Pixmap /* src */, + int /* op */ +#endif +); + +extern void XShapeCombineShape ( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* dest */, + int /* dest_kind */, + int /* x_off */, + int /* y_off */, + Window /* src */, + int /* src_kind */, + int /* op */ +#endif +); + +extern void XShapeOffsetShape ( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* dest */, + int /* dest_kind */, + int /* x_off */, + int /* y_off */ +#endif +); + +extern Status XShapeQueryExtents ( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* window */, + Bool* /* bounding_shaped */, + int* /* x_bounding */, + int* /* y_bounding */, + unsigned int* /* w_bounding */, + unsigned int* /* h_bounding */, + Bool* /* clip_shaped */, + int* /* x_clip */, + int* /* y_clip */, + unsigned int* /* w_clip */, + unsigned int* /* h_clip */ +#endif +); + +extern void XShapeSelectInput ( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* window */, + unsigned long /* mask */ +#endif +); + +extern unsigned long XShapeInputSelected ( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* window */ +#endif +); + +extern XRectangle *XShapeGetRectangles ( +#if NeedFunctionPrototypes + Display* /* display */, + Window /* window */, + int /* kind */, + int* /* count */, + int* /* ordering */ +#endif +); + +_XFUNCPROTOEND + +#endif /* _SHAPE_SERVER_ */ + +#endif /* _SHAPE_H_ */ diff --git a/xie/docs/dec/xie23-src/include/shapestr.h b/xie/docs/dec/xie23-src/include/shapestr.h new file mode 100644 index 0000000..9f3475b --- /dev/null +++ b/xie/docs/dec/xie23-src/include/shapestr.h @@ -0,0 +1,255 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/************************************************************ +Copyright 1989 by The Massachusetts Institute of Technology + +Permission to use, copy, modify, and distribute this +software and its documentation for any purpose and without +fee is hereby granted, provided that the above copyright +no- tice appear in all copies and that both that copyright +no- tice and this permission notice appear in supporting +docu- mentation, and that the name of MIT not be used in +advertising or publicity pertaining to distribution of the +software without specific prior written permission. +M.I.T. makes no representation about the suitability of +this software for any purpose. It is provided "as is" +without any express or implied warranty. + +MIT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT- +NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE LI- +ABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH +THE USE OR PERFORMANCE OF THIS SOFTWARE. + +********************************************************/ + +/* $XConsortium: shapestr.h,v 1.9 90/06/07 10:08:36 rws Exp $ */ + +/* + * Protocol requests constants and alignment values + * These would really be in SHAPE's X.h and Xproto.h equivalents + */ + +#include "shape.h" +#include +/* for Window & Time defines */ +/* Added to match X11/Xproto.h */ +#define Window CARD32 +#define Time CARD32 + +#define SHAPENAME "SHAPE" + +#define SHAPE_MAJOR_VERSION 1 /* current version numbers */ +#define SHAPE_MINOR_VERSION 0 + +typedef struct _ShapeQueryVersion { + CARD8 reqType; /* always ShapeReqCode */ + CARD8 shapeReqType; /* always X_ShapeQueryVersion */ + CARD16 length B16; +} xShapeQueryVersionReq; +#define sz_xShapeQueryVersionReq 4 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 unused; /* not used */ + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 majorVersion B16; /* major version of SHAPE protocol */ + CARD16 minorVersion B16; /* minor version of SHAPE protocol */ + CARD32 pad0 B32; + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; +} xShapeQueryVersionReply; +#define sz_xShapeQueryVersionReply 32 + +typedef struct _ShapeRectangles { + CARD8 reqType; /* always ShapeReqCode */ + CARD8 shapeReqType; /* always X_ShapeRectangles */ + CARD16 length B16; + CARD8 op; /* Set, ... */ + CARD8 destKind; /* ShapeBounding or ShapeClip */ + CARD8 ordering; /* UnSorted, YSorted, YXSorted, YXBanded */ + CARD8 pad0; /* not used */ + CARD32 dest B32; /* Window */ + INT16 xOff B16; + INT16 yOff B16; +} xShapeRectanglesReq; /* followed by xRects */ +#define sz_xShapeRectanglesReq 16 + +typedef struct _ShapeMask { + CARD8 reqType; /* always ShapeReqCode */ + CARD8 shapeReqType; /* always X_ShapeMask */ + CARD16 length B16; + + CARD8 op; /* Set, ... */ + CARD8 destKind; /* ShapeBounding or ShapeClip */ + CARD16 junk B16; /* not used */ + + CARD32 dest B32; /* Window */ + INT16 xOff B16; + INT16 yOff B16; + CARD32 src B32; /* 1 bit pixmap */ +} xShapeMaskReq; +#define sz_xShapeMaskReq 20 + +typedef struct _ShapeCombine { + CARD8 reqType; /* always ShapeReqCode */ + CARD8 shapeReqType; /* always X_ShapeCombine */ + CARD16 length B16; + CARD8 op; /* Set, ... */ + CARD8 destKind; /* ShapeBounding or ShapeClip */ + CARD8 srcKind; /* ShapeBounding or ShapeClip */ + CARD8 junk; /* not used */ + CARD32 dest B32; /* Window */ + INT16 xOff B16; + INT16 yOff B16; + CARD32 src B32; /* Window */ +} xShapeCombineReq; +#define sz_xShapeCombineReq 20 + +typedef struct _ShapeOffset { + CARD8 reqType; /* always ShapeReqCode */ + CARD8 shapeReqType; /* always X_ShapeOffset */ + CARD16 length B16; + CARD8 destKind; /* ShapeBounding or ShapeClip */ + CARD8 junk1; /* not used */ + CARD16 junk2 B16; /* not used */ + CARD32 dest B32; /* Window */ + INT16 xOff B16; + INT16 yOff B16; +} xShapeOffsetReq; +#define sz_xShapeOffsetReq 16 + +typedef struct _ShapeQueryExtents { + CARD8 reqType; /* always ShapeReqCode */ + CARD8 shapeReqType; /* always X_ShapeQueryExtents */ + CARD16 length B16; + CARD32 window B32; /* request destination id */ +} xShapeQueryExtentsReq; +#define sz_xShapeQueryExtentsReq 8 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 unused; /* not used */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* 0 */ + CARD8 boundingShaped; /* window has bounding shape */ + CARD8 clipShaped; /* window has clip shape */ + CARD16 unused1 B16; + INT16 xBoundingShape B16; /* extents of bounding shape */ + INT16 yBoundingShape B16; + CARD16 widthBoundingShape B16; + CARD16 heightBoundingShape B16; + INT16 xClipShape B16; /* extents of clip shape */ + INT16 yClipShape B16; + CARD16 widthClipShape B16; + CARD16 heightClipShape B16; + CARD32 pad1 B32; +} xShapeQueryExtentsReply; +#define sz_xShapeQueryExtentsReply 32 + +typedef struct _ShapeSelectInput { + CARD8 reqType; /* always ShapeReqCode */ + CARD8 shapeReqType; /* always X_ShapeSelectInput */ + CARD16 length B16; + CARD32 window B32; /* request destination id */ + BYTE enable; /* xTrue -> send events */ + BYTE pad1; + CARD16 pad2 B16; +} xShapeSelectInputReq; +#define sz_xShapeSelectInputReq 12 + +typedef struct _ShapeNotify { + BYTE type; /* always eventBase + ShapeNotify */ + BYTE kind; /* either ShapeBounding or ShapeClip */ + CARD16 sequenceNumber B16; + Window window B32; + INT16 x B16; + INT16 y B16; /* extents of new shape */ + CARD16 width B16; + CARD16 height B16; + Time time B32; /* time of change */ + BYTE shaped; /* set when a shape actual exists */ + BYTE pad0; + CARD16 pad1 B16; + CARD32 pad2 B32; + CARD32 pad3 B32; +} xShapeNotifyEvent; +#define sz_xShapeNotifyEvent 32 + +typedef struct _ShapeInputSelected { + CARD8 reqType; /* always ShapeReqCode */ + CARD8 shapeReqType; /* always X_ShapeInputSelected */ + CARD16 length B16; + CARD32 window B32; /* request destination id */ +} xShapeInputSelectedReq; +#define sz_xShapeInputSelectedReq 8 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 enabled; /* current status */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* 0 */ + CARD32 pad1 B32; /* unused */ + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xShapeInputSelectedReply; +#define sz_xShapeInputSelectedReply 32 + +typedef struct _ShapeGetRectangles { + CARD8 reqType; /* always ShapeReqCode */ + CARD8 shapeReqType; /* always X_ShapeGetRectangles */ + CARD16 length B16; + CARD32 window B32; /* request destination id */ + CARD8 kind; /* ShapeBounding or ShapeClip */ + CARD8 junk1; + CARD16 junk2 B16; +} xShapeGetRectanglesReq; +#define sz_xShapeGetRectanglesReq 12 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 ordering; /* UnSorted, YSorted, YXSorted, YXBanded */ + CARD16 sequenceNumber B16; + CARD32 length B32; /* not zero */ + CARD32 nrects B32; /* number of rectangles */ + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; +} xShapeGetRectanglesReply; /* followed by xRectangles */ +#define sz_xShapeGetRectanglesReply 32 +#undef Window CARD32 +#undef Time CARD32 diff --git a/xie/docs/dec/xie23-src/include/shmstr.h b/xie/docs/dec/xie23-src/include/shmstr.h new file mode 100644 index 0000000..4c742ac --- /dev/null +++ b/xie/docs/dec/xie23-src/include/shmstr.h @@ -0,0 +1,207 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/************************************************************ +Copyright 1989 by The Massachusetts Institute of Technology + +Permission to use, copy, modify, and distribute this +software and its documentation for any purpose and without +fee is hereby granted, provided that the above copyright +no- tice appear in all copies and that both that copyright +no- tice and this permission notice appear in supporting +docu- mentation, and that the name of MIT not be used in +advertising or publicity pertaining to distribution of the +software without specific prior written permission. +M.I.T. makes no representation about the suitability of +this software for any purpose. It is provided "as is" +without any express or implied warranty. + +********************************************************/ + +/* THIS IS NOT AN X CONSORTIUM STANDARD */ + +/* $XConsortium: shmstr.h,v 1.6 91/07/12 09:18:52 rws Exp $ */ + +#include "XShm.h" + +#include /* for Window & VisualId defines */ +/* Added to match X11/Xproto.h */ +#define Window CARD32 +#define Drawable CARD32 +#define VisualID CARD32 +#define GContext CARD32 +#define Pixmap CARD32 + +#define SHMNAME "MIT-SHM" + +#define SHM_MAJOR_VERSION 1 /* current version numbers */ +#define SHM_MINOR_VERSION 1 + +#ifdef _XSHM_SERVER_ +typedef struct _ShmFuncs { + PixmapPtr (* CreatePixmap)(); + void (* PutImage)(); +} ShmFuncs, *ShmFuncsPtr; +#endif + +typedef struct _ShmQueryVersion { + CARD8 reqType; /* always ShmReqCode */ + CARD8 shmReqType; /* always X_ShmQueryVersion */ + CARD16 length B16; +} xShmQueryVersionReq; +#define sz_xShmQueryVersionReq 4 + +typedef struct { + BYTE type; /* X_Reply */ + BOOL sharedPixmaps; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 majorVersion B16; /* major version of SHM protocol */ + CARD16 minorVersion B16; /* minor version of SHM protocol */ + CARD16 uid B16; + CARD16 gid B16; + CARD8 pixmapFormat; + CARD8 pad0; + CARD16 pad1 B16; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; +} xShmQueryVersionReply; +#define sz_xShmQueryVersionReply 32 + +typedef struct _ShmAttach { + CARD8 reqType; /* always ShmReqCode */ + CARD8 shmReqType; /* always X_ShmAttach */ + CARD16 length B16; + ShmSeg shmseg; + CARD32 shmid; + BOOL readOnly; + BYTE pad0; + CARD16 pad1; +} xShmAttachReq; +#define sz_xShmAttachReq 16 + +typedef struct _ShmDetach { + CARD8 reqType; /* always ShmReqCode */ + CARD8 shmReqType; /* always X_ShmDetach */ + CARD16 length B16; + ShmSeg shmseg; +} xShmDetachReq; +#define sz_xShmDetachReq 8 + +typedef struct _ShmPutImage { + CARD8 reqType; /* always ShmReqCode */ + CARD8 shmReqType; /* always X_ShmPutImage */ + CARD16 length B16; + Drawable drawable B32; + GContext gc B32; + CARD16 totalWidth B16; + CARD16 totalHeight B16; + CARD16 srcX B16; + CARD16 srcY B16; + CARD16 srcWidth B16; + CARD16 srcHeight B16; + INT16 dstX B16; + INT16 dstY B16; + CARD8 depth; + CARD8 format; + CARD8 sendEvent; + CARD8 bpad; + ShmSeg shmseg B32; + CARD32 offset B32; +} xShmPutImageReq; +#define sz_xShmPutImageReq 40 + +typedef struct _ShmGetImage { + CARD8 reqType; /* always ShmReqCode */ + CARD8 shmReqType; /* always X_ShmGetImage */ + CARD16 length B16; + Drawable drawable B32; + INT16 x B16; + INT16 y B16; + CARD16 width B16; + CARD16 height B16; + CARD32 planeMask B32; + CARD8 format; + CARD8 pad0; + CARD8 pad1; + CARD8 pad2; + ShmSeg shmseg B32; + CARD32 offset B32; +} xShmGetImageReq; +#define sz_xShmGetImageReq 32 + +typedef struct _ShmGetImageReply { + BYTE type; /* X_Reply */ + CARD8 depth; + CARD16 sequenceNumber B16; + CARD32 length B32; + VisualID visual B32; + CARD32 size B32; + CARD32 pad0 B32; + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; +} xShmGetImageReply; +#define sz_xShmGetImageReply 32 + +typedef struct _ShmCreatePixmap { + CARD8 reqType; /* always ShmReqCode */ + CARD8 shmReqType; /* always X_ShmCreatePixmap */ + CARD16 length B16; + Pixmap pid B32; + Drawable drawable B32; + CARD16 width B16; + CARD16 height B16; + CARD8 depth; + CARD8 pad0; + CARD8 pad1; + CARD8 pad2; + ShmSeg shmseg B32; + CARD32 offset B32; +} xShmCreatePixmapReq; +#define sz_xShmCreatePixmapReq 28 + +typedef struct _ShmCompletion { + BYTE type; /* always eventBase + ShmCompletion */ + BYTE bpad0; + CARD16 sequenceNumber B16; + Drawable drawable B32; + CARD16 minorEvent B16; + BYTE majorEvent; + BYTE bpad1; + ShmSeg shmseg B32; + CARD32 offset B32; + CARD32 pad0 B32; + CARD32 pad1 B32; + CARD32 pad2 B32; +} xShmCompletionEvent; +#define sz_xShmCompletionEvent 32 + +#undef Window CARD32 +#undef Drawable CARD32 +#undef VisualID CARD32 +#undef GContext CARD32 +#undef Pixmap CARD32 diff --git a/xie/docs/dec/xie23-src/include/smt.h b/xie/docs/dec/xie23-src/include/smt.h new file mode 100644 index 0000000..5beb6e2 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/smt.h @@ -0,0 +1,106 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ +/* $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/include/smt.h,v 1.1.2.4 92/07/21 07:22:58 Jim_Ludwig Exp $ + * smt.h + * Shared Memory Transport definitions + */ + + +#ifndef _SMT_H_ +#define _SMT_H_ + +#if defined(SMT_DEBUG) +#define SMT_DIAG(s) s +#else +#define SMT_DIAG(s) +#endif /* SMT_DEBUG */ + +#define SMT_PROTOCOL_NAME "Shared-Memory Transport" + +/* + * Requests + */ +#define X_SmtQueryVersion 0 +#define X_SmtAttach 1 +#define X_SmtWakeupServer 2 + +/* + * event stuff + */ +#define XSmtWakeupNotifyMask 0x02000000 + +#define XSmtWakeupNotify 0 +#define XSmtNumberOfEvents (XSmtWakeupNotify + 1) + +#define XSmtBadSegment 0 +#define XSmtNumberOfErrors (XSmtBadSegment + 1) + +#define SMT_REQ (1 << 0) +#define SMT_REP (1 << 1) +#define SMT_NEED_WAKEUP (1 << 2) +#define SMT_NEWVER (1 << 3) + +#ifndef _SMT_SERVER_ +/* + * Extra definitions that will only be needed in the client + */ +typedef XID XSmt; + +extern Bool XSmtQueryVersion(); /* is extension on server? */ +extern Bool XSmtAttach(); /* attach shared memory transport */ +extern Bool XWakeupServer(); /* wakeup server */ + +typedef struct { + int type; /* of event */ + unsigned long serial; /* # of last request processed by server */ + int send_event; /* true if this came frome a SendEvent request */ + struct _XDisplay *display; /* Display the event was read from */ +} XSmtWakeupEvent; + +#endif /* _SMT_SERVER_ */ +#endif /* _SMT_H_ */ diff --git a/xie/docs/dec/xie23-src/include/smtstr.h b/xie/docs/dec/xie23-src/include/smtstr.h new file mode 100644 index 0000000..5a46db7 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/smtstr.h @@ -0,0 +1,194 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ +/* $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/include/smtstr.h,v 1.1.2.5 92/08/03 09:32:18 Dave_Hill Exp $ + * smtstr.h + * Shared Memory Transport definitions + */ + +#ifndef _SMTSTR_H_ +#define _SMTSTR_H_ + +#include +#include +#include + +/* + * Minor Version Description + * ------------- ----------- + * 0 Wakeup request increments serial number + * 1 not implemented + * 2 Wakeup request doesn't increment serial number + */ +#define SMT_MAJOR_VERSION 1 +#define SMT_MINOR_VERSION 2 + + +typedef struct _SmtProcInfo { + int whoami; + int status; + int pid; +} SmtProcInfo, *SmtProcInfoPtr; + +typedef struct _SmtPrivate { + SmtProcInfo server; + SmtProcInfo client; +} SmtPrivate, *SmtPrivatePtr; + +typedef struct _SmtQueryVersion { + CARD8 reqType; + CARD8 smtReqType; + CARD16 length B16; +} xSmtQueryVersionReq; +#define sz_xSmtQueryVersionReq 4 + +typedef struct { + BYTE type; /* X_Reply */ + BYTE bpad0; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 majorVersion B16; + CARD16 minorVersion B16; + CARD16 uid B16; + CARD16 gid B16; + CARD32 pad0 B32; + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; +} xSmtQueryVersionReply; +#define sz_xSmtQueryVersionReply 32; + +typedef struct _SmtAttach { + CARD8 reqType; + CARD8 smtReqType; + CARD16 length B16; + CARD16 flags; + CARD8 majorVersion; + CARD8 minorVersion; + Channel chan; +} xSmtAttachReq; +#define sz_xSmtAttachReq sizeof(xSmtAttachReq) + +typedef struct { + BYTE type; /* X_Reply */ + BYTE bpad0; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 status B32; + CARD32 pad0 B32; + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; +} xSmtAttachReply; +#define sz_xSmtAttachReply 32; + +typedef struct _SmtWakeupServer { + CARD8 reqType; + CARD8 smtReqType; + CARD16 length B16; + CARD32 flags; +} xSmtWakeupServerReq; +#define sz_xSmtWakeupServerReq 8 + +typedef struct _SmtWakeup { + BYTE type; /* eventBase + SmtWakeup */ + BYTE bpad0; + CARD16 sequenceNumber B16; + CARD32 flags; + CARD32 pad0 B32; + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; +} xSmtWakeupEvent; +#define sz_xSmtWakeupEvent 32 + +#ifdef _SMT_SERVER_ + +typedef struct { /* SMT_DEFER_FREE */ + int (*freep)(/* ptr,dat */); + unsigned char *Q; + unsigned long *ptr; + unsigned long dat; + unsigned int len; +} smtQEntry, *smtQEntryPtr; + +#define SMT_Q_DEPTH 11 /* SMT_DEFER_FREE */ + +typedef struct { /* SMT_DEFER_FREE */ + int last; /* next to be freed */ + int this; /* current request */ + int next; /* next to be written */ + smtQEntry e[SMT_Q_DEPTH]; +} smtQueue, *smtQueuePtr; + +typedef struct _smtControlBlock { + Channel chan; /* channel control block */ + SmtPrivatePtr pPriv; + int wakeRec; /* wakeup requests received */ + int wakeSent; /* wakeup events sent */ + int (*ReadRequestFromClient)(); + smtQueue q; /* queue of req's to free */ + short majorVersion, minorVersion; /* client versions */ +} smtControlBlock, *smtControlBlockPtr; + +#else /* client-side definitions */ + +typedef struct _smtDisplay { + Channel chan; + char *buffer; /* saved non-smt buffer starting address. */ + char *bufptr; /* saved non-smt buffer index pointer. */ + char *bufmax; /* saved non-smt buffer index pointer. */ + SmtPrivatePtr pPriv; /* pointer to server-client private area */ + short majorVersion, minorVersion; /* server versions */ +} smtDisplay, *smtDisplayPtr; + +#endif /* _SMT_SERVER_ */ + +#endif /* _SMTSTR_H_ */ diff --git a/xie/docs/dec/xie23-src/include/xemacros.h b/xie/docs/dec/xie23-src/include/xemacros.h new file mode 100644 index 0000000..445b57d --- /dev/null +++ b/xie/docs/dec/xie23-src/include/xemacros.h @@ -0,0 +1,358 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* +************************************************************************** +** DIGITAL EQUIPMENT CORPORATION ** +** CONFIDENTIAL ** +** NOT FOR MODIFICATION OR REDISTRIBUTION IN ANY MANNER WHATSOEVER ** +************************************************************************** +*/ +#ifndef __XEMACROS__ +#define __XEMACROS__ "@(#)xemacros.h 1.9 - 90/09/18 " +/* RCSID = $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/include/xemacros.h,v 1.1.2.3 92/04/27 12:33:06 Leela_Obilichetti Exp $" */ +/***************************************************************************** +Copyright 1987, 1988, 1989, 1990, 1991 by Digital Equipment Corp., Maynard, MA + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*****************************************************************************/ +/* + * + * CONTRIBUTORS: + * + * Dick Annicchiarico + * Robert Chesler + * Dan Coutu + * Gene Durso + * Marc Evans + * Alan Jamison + * Mark Henry + * Ken Miller + * + * DESCRIPTION: + * This include file is designed to provide the *visible* + * interface to XTrap data structures. Fields can be set + * using these macros by client programs unless otherwise + * specified; however, use of Trap Context convenience + * routines is strongly encouraged (XETrapContext.c) + */ +#include "bits.h" + +/* msleep macro to replace msleep() for portability reasons */ +#define msleep(m) usleep((m)*1000) + +/* Copying TC's assumes that the new TC must be created */ +#define XECopyTC(src,mask,dest) \ + (dest = XECreateTC(((src)->dpy), (mask), (&((src)->values)))) + +/* Expands to SET each element of the TCValues structure + * Returns the TCValues Mask so that the Set can be entered + * as an argument to the XEChangeTC() routine call + */ +/* Note: req_cb & evt_cb would only be used if you wanted to + * *share* callbacks between Trap Contexts. Normally, + * XEAddRequestCB() and XEAddEventCB() would be used. + */ +#define XETrapSetCfgReqCB(tcv,x) ((tcv)->req_cb = (x)) +#define XETrapSetCfgEvtCB(tcv,x) ((tcv)->evt_cb = (x)) +#define XETrapSetCfgMaxPktSize(tcv,x) ((tcv)->v.max_pkt_size = (x)) +#define XETrapSetCfgCmdKey(tcv,x) ((tcv)->v.cmd_key = (x)) +/* Note: e is only pertinent for "valid" or "data" */ +#define XETrapSetCfgFlags(tcv,e,a) \ + memcpy((tcv)->v.flags.e, (a), sizeof((tcv)->v.flags.e)) +#define XETrapSetCfgFlagTimestamp(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapTimestamp, (x)) +#define XETrapSetCfgFlagCmd(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapCmd, (x)) +#define XETrapSetCfgFlagCmdKeyMod(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapCmdKeyMod, (x)) +#define XETrapSetCfgFlagRequest(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapRequest, (x)) +#define XETrapSetCfgFlagEvent(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapEvent, (x)) +#define XETrapSetCfgFlagMaxPacket(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapMaxPacket, (x)) +#define XETrapSetCfgFlagStatistics(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapStatistics, (x)) +#define XETrapSetCfgFlagWinXY(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapWinXY, (x)) +#define XETrapSetCfgFlagCursor(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapCursor, (x)) +#define XETrapSetCfgFlagReq(tcv,request,x) \ + BitSet((tcv)->v.flags.req, (request), (x)) +#define XETrapSetCfgFlagXInput(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapXInput, (x)) +#define XETrapSetCfgFlagColorReplies(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapColorReplies, (x)) +#define XETrapSetCfgFlagGrabServer(tcv,e,x) \ + BitSet((tcv)->v.flags.e, XETrapGrabServer, (x)) +#define XETrapSetCfgFlagEvt(tcv,evt,x) \ + BitSet((tcv)->v.flags.event, (evt), (x)) + +#define XETrapSetValFlagDeltaTimes(tcv,x) \ + BitSet((tcv)->tc_flags, XETCDeltaTimes, (x)) + +/* Fields returned in the "GetAvailable" request */ +#define XETrapGetAvailPFIdent(avail) ((avail)->pf_ident) +#define XETrapGetAvailRelease(avail) ((avail)->xtrap_release) +#define XETrapGetAvailVersion(avail) ((avail)->xtrap_version) +#define XETrapGetAvailRevision(avail) ((avail)->xtrap_revision) +#define XETrapGetAvailMaxPktSize(avail) ((avail)->max_pkt_size) +#define XETrapGetAvailFlags(avail,a) \ + memcpy((a), (avail)->valid, sizeof((avail)->valid)) +#define XETrapGetAvailFlagTimestamp(avail) \ + (BitValue((avail)->valid, XETrapTimestamp)) +#define XETrapGetAvailFlagCmd(avail) \ + (BitValue((avail)->valid, XETrapCmd)) +#define XETrapGetAvailFlagCmdKeyMod(avail) \ + (BitValue((avail)->valid, XETrapCmdKeyMod)) +#define XETrapGetAvailFlagRequest(avail) \ + (BitValue((avail)->valid, XETrapRequest)) +#define XETrapGetAvailFlagEvent(avail) \ + (BitValue((avail)->valid, XETrapEvent)) +#define XETrapGetAvailFlagMaxPacket(avail) \ + (BitValue((avail)->valid, XETrapMaxPacket)) +#define XETrapGetAvailFlagStatistics(avail) \ + (BitValue((avail)->valid, XETrapStatistics)) +#define XETrapGetAvailFlagWinXY(avail) \ + (BitValue((avail)->valid, XETrapWinXY)) +#define XETrapGetAvailFlagCursor(avail) \ + (BitValue((avail)->valid, XETrapCursor)) +#define XETrapGetAvailFlagXInput(avail) \ + (BitValue((avail)->valid, XETrapXInput)) +#define XETrapGetAvailFlagVecEvt(avail) \ + (BitValue((avail)->valid, XETrapVectorEvents)) +#define XETrapGetAvailFlagColorReplies(avail) \ + (BitValue((avail)->valid, XETrapColorReplies)) +#define XETrapGetAvailFlagGrabServer(avail) \ + (BitValue((avail)->valid, XETrapGrabServer)) +#define XETrapGetAvailOpCode(avail) ((avail)->major_opcode) +/* Macro's for creating current request and trap context macros */ +#define XETrapGetCfgMaxPktSize(cfg) ((cfg)->max_pkt_size) +#define XETrapGetCfgCmdKey(cfg) ((cfg)->cmd_key) +#define XETrapGetCfgFlags(cfg,e,a) \ + memcpy((a), (cfg)->flags.e, sizeof((cfg)->flags.e)) +#define XETrapGetCfgFlagTimestamp(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapTimestamp)) +#define XETrapGetCfgFlagCmd(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapCmd)) +#define XETrapGetCfgFlagCmdKeyMod(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapCmdKeyMod)) +#define XETrapGetCfgFlagRequest(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapRequest)) +#define XETrapGetCfgFlagEvent(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapEvent)) +#define XETrapGetCfgFlagMaxPacket(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapMaxPacket)) +#define XETrapGetCfgFlagStatistics(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapStatistics)) +#define XETrapGetCfgFlagWinXY(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapWinXY)) +#define XETrapGetCfgFlagCursor(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapCursor)) +#define XETrapGetCfgFlagXInput(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapXInput)) +#define XETrapGetCfgFlagColorReplies(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapColorReplies)) +#define XETrapGetCfgFlagGrabServer(cfg,e) \ + (BitValue((cfg)->flags.e, XETrapGrabServer)) +/* Request values are in "Xproto.h" of the flavor X_RequestType */ +#define XETrapGetCfgFlagReq(cfg,request) \ + (BitValue((cfg)->flags.req, (request))) +/* Event types are in "X.h" of the flavor EventType (e.g. KeyPress) */ +#define XETrapGetCfgFlagEvt(cfg,evt) \ + (BitValue((cfg)->flags.event, (evt))) + +/* Fields returned int the "GetCurrent" Request */ +#define XETrapGetCurX(avail) ((avail)->cur_x) +#define XETrapGetCurY(avail) ((avail)->cur_y) +#define XETrapGetCurSFlags(cur,a) \ + memcpy((a), (cur)->state_flags, sizeof((cur)->state_flags)) +#define XETrapGetCurMaxPktSize(cur) (XETrapGetCfgMaxPktSize(&((cur)->config))) +#define XETrapGetCurCmdKey(cur) (XETrapGetCfgCmdKey(&((cur)->config))) +/* Note: e is only pertinent for "valid" or "data" */ +#define XETrapGetCurCFlags(cur,e,a) (XETrapGetCfgFlags(&((cur)->config),e,a)) +#define XETrapGetCurFlagTimestamp(cur,e) \ + (XETrapGetCfgFlagTimestamp(&((cur)->config),e)) +#define XETrapGetCurFlagCmd(cur,e) (XETrapGetCfgFlagCmd(&((cur)->config),e)) +#define XETrapGetCurFlagCmdKeyMod(cur,e) \ + (XETrapGetCfgFlagCmdKeyMod(&((cur)->config),e)) +#define XETrapGetCurFlagRequest(cur,r) \ + (XETrapGetCfgFlagRequest(&((cur)->config),r)) +#define XETrapGetCurFlagEvent(cur,e) \ + (XETrapGetCfgFlagEvent(&((cur)->config),e)) +#define XETrapGetCurFlagMaxPacket(cur,e) \ + (XETrapGetCfgFlagMaxPacket(&((cur)->config),e)) +#define XETrapGetCurFlagStatistics(cur,e) \ + (XETrapGetCfgFlagStatistics(&((cur)->config),e)) +#define XETrapGetCurFlagWinXY(cur,e) \ + (XETrapGetCfgFlagWinXY(&((cur)->config),e)) +#define XETrapGetCurFlagCursor(cur,e) \ + (XETrapGetCfgFlagCursor(&((cur)->config),e)) +#define XETrapGetCurFlagXInput(cur,e) \ + (XETrapGetCfgFlagXInput(&((cur)->config),e)) +#define XETrapGetCurFlagColorReplies(cur,e) \ + (XETrapGetCfgFlagColorReplies(&((cur)->config),e)) +#define XETrapGetCurFlagGrabServer(cur,e) \ + (XETrapGetCfgFlagGrabServer(&((cur)->config),e)) +/* Request values are in "Xproto.h" of the flavor X_RequestType */ +#define XETrapGetCurFlagReq(cur,r) (XETrapGetCfgFlagReq(&((cur)->config),r)) +/* Event types are in "X.h" of the flavor EventType (e.g. KeyPress) */ +#define XETrapGetCurFlagEvt(cur,e) (XETrapGetCfgFlagEvt(&((cur)->config),e)) + +/* Fields returned int the "GetStatistics" Request */ +#define XETrapGetStatsReq(stat,e) ((stat)->requests[(e)]) +#define XETrapGetStatsEvt(stat,e) ((stat)->events[(e)]) + +/* Fields returned in the "GetVersion" request */ +#define XETrapGetVersRelease(vers) ((vers)->xtrap_release) +#define XETrapGetVersVersion(vers) ((vers)->xtrap_version) +#define XETrapGetVersRevision(vers) ((vers)->xtrap_revision) + +/* Fields returned in the "GetLastInpTime" request */ +#define XETrapGetLastInpTime(time_rep) ((time_rep)->last_time) + +/* Expands to GET each element of the TCValues structure */ +#define XETrapGetTCReqCB(tc) ((tc)->values.req_cb) +#define XETrapGetTCEvtCB(tc) ((tc)->values.evt_cb) +#define XETrapGetTCTime(tc) ((tc)->values.last_time) +/* TC specific flags */ +#define XETrapGetTCLFlags(tc,a) \ + memcpy((a), (tc)->values.tc_flags, sizeof((tc)->values.tc_flags)) +#define XETrapGetTCFlagDeltaTimes(tc) \ + (BitValue((tc)->values.tc_flags, XETCDeltaTimes)) +#define XETrapGetTCFlagTrapActive(tc) \ + (BitValue((tc)->values.tc_flags, XETCTrapActive)) +#define XETrapGetTCMaxPktSize(tc) (XETrapGetCfgMaxPktSize(&((tc)->values.v))) +#define XETrapGetTCCmdKey(tc) (XETrapGetCfgCmdKey(&((tc)->values.v))) +/* Note: e is only pertinent for "valid" or "data" */ +#define XETrapGetTCFlags(tc,e,a) (XETrapGetCfgFlags(&((tc)->values.v),e,a)) +#define XETrapGetTCFlagTimestamp(tc,e) \ + (XETrapGetCfgFlagTimestamp(&((tc)->values.v),e)) +#define XETrapGetTCFlagCmd(tc,e) \ + (XETrapGetCfgFlagCmd(&((tc)->values.v),e)) +#define XETrapGetTCFlagCmdKeyMod(tc,e) \ + (XETrapGetCfgFlagCmdKeyMod(&((tc)->values.v),e)) +#define XETrapGetTCFlagRequest(tc,r) \ + (XETrapGetCfgFlagRequest(&((tc)->values.v),r)) +#define XETrapGetTCFlagEvent(tc,e) \ + (XETrapGetCfgFlagEvent(&((tc)->values.v),e)) +#define XETrapGetTCFlagMaxPacket(tc,e) \ + (XETrapGetCfgFlagMaxPacket(&((tc)->values.v),e)) +#define XETrapGetTCFlagStatistics(tc,e) \ + (XETrapGetCfgFlagStatistics(&((tc)->values.v),e)) +#define XETrapGetTCFlagWinXY(tc,e) \ + (XETrapGetCfgFlagWinXY(&((tc)->values.v),e)) +#define XETrapGetTCFlagCursor(tc,e) \ + (XETrapGetCfgFlagCursor(&((tc)->values.v),e)) +#define XETrapGetTCFlagXInput(tc,e) \ + (XETrapGetCfgFlagXInput(&((tc)->values.v),e)) +#define XETrapGetTCFlagColorReplies(tc,e) \ + (XETrapGetCfgFlagColorReplies(&((tc)->values.v),e)) +#define XETrapGetTCFlagGrabServer(tc,e) \ + (XETrapGetCfgFlagGrabServer(&((tc)->values.v),e)) +/* Request values are in "Xproto.h" of the flavor X_RequestType */ +#define XETrapGetTCFlagReq(tc,r) \ + (XETrapGetCfgFlagReq(&((tc)->values.v),r)) +/* Event types are in "X.h" of the flavor EventType (e.g. KeyPress) */ +#define XETrapGetTCFlagEvt(tc,e) \ + (XETrapGetCfgFlagEvt(&((tc)->values.v),e)) +/* The following can/should *not* be set directly! */ +#define XETrapGetNext(tc) ((tc)->next) +#define XETrapGetDpy(tc) ((tc)->dpy) +#define XETrapGetEventBase(tc) ((tc)->eventBase) +#define XETrapGetErrorBase(tc) ((tc)->errorBase) +#define XETrapGetExtOpcode(tc) ((tc)->extOpcode) +#define XETrapGetXBuff(tc) ((tc)->xbuff) +#define XETrapGetXMaxSize(tc) ((tc)->xmax_size) +#define XETrapGetExt(tc) ((tc)->ext_data) +#define XETrapGetDirty(tc) ((tc)->dirty) +#define XETrapGetValues(tc) memcpy((x),(tc)->values,sizeof((tc)->values)) +#define XETrapGetEventFunc(tc) ((tc)->eventFunc) + +#define XETrapGetHeaderCount(phdr) ((phdr)->count) +#define XETrapGetHeaderTimestamp(phdr) ((phdr)->timestamp) +#define XETrapGetHeaderType(phdr) ((phdr)->type) +#define XETrapGetHeaderScreen(phdr) ((phdr)->screen) +#define XETrapGetHeaderWindowX(phdr) ((phdr)->win_x) +#define XETrapGetHeaderWindowY(phdr) ((phdr)->win_y) +#define XETrapGetHeaderClient(phdr) ((phdr)->client) + +#define XEGetRelease(tc) ((tc)->release) +#define XEGetVersion(tc) ((tc)->version) +#define XEGetRevision(tc) ((tc)->revision) + +/* Condition handling macros */ +#ifndef _InitExceptionHandling +#ifdef vms +#define _InitExceptionHandling(rtn) \ + VAXC$ESTABLISH(rtn) /* VMS exception handler */ +#else /* vms */ +#define _InitExceptionHandling(rtn) \ + (void)signal(SIGBUS, rtn); /* Bus error */ \ + (void)signal(SIGSEGV, rtn); /* Accvio/Segment error */ \ + (void)signal(SIGFPE, rtn); /* Floating point exception */ \ + (void)signal(SIGILL, rtn); /* Illegal instruction */ \ + (void)signal(SIGSYS, rtn); /* Param error in sys call */ \ + (void)signal(SIGHUP, rtn); \ + (void)signal(SIGPIPE, rtn); \ + (void)signal(SIGTERM, rtn) +#endif /* vms */ +#endif /* _InitExceptionHandling */ + +#ifndef _ClearExceptionHandling +#ifdef vms +#define _ClearExceptionHandling() \ + LIB$REVERT() +#else +#define _ClearExceptionHandling() \ + (void)signal(SIGBUS, SIG_DFL); /* Bus error */ \ + (void)signal(SIGSEGV, SIG_DFL); /* Accvio/Segment error */ \ + (void)signal(SIGFPE, SIG_DFL); /* Floating point exception */ \ + (void)signal(SIGILL, SIG_DFL); /* Illegal instruction */ \ + (void)signal(SIGSYS, SIG_DFL); /* Param error in sys call */ \ + (void)signal(SIGHUP, SIG_DFL); \ + (void)signal(SIGPIPE, SIG_DFL); \ + (void)signal(SIGTERM, SIG_DFL) +#endif /* vms */ +#endif /* _ClearExceptionHandling */ + +#endif /* __XEMACROS__ */ + diff --git a/xie/docs/dec/xie23-src/include/xestream.h b/xie/docs/dec/xie23-src/include/xestream.h new file mode 100644 index 0000000..ecc9361 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/xestream.h @@ -0,0 +1,201 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* +************************************************************************** +** DIGITAL EQUIPMENT CORPORATION ** +** CONFIDENTIAL ** +** NOT FOR MODIFICATION OR REDISTRIBUTION IN ANY MANNER WHATSOEVER ** +************************************************************************** +*/ +/* BuildSystemHeader added automatically */ +/* $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/include/xestream.h,v 1.1.2.2 92/02/06 16:53:05 Jim_Ludwig Exp $ */ +#ifndef __XESTREAM__ +#define __XESTREAM__ "@(#)xestream.h 1.11 - 90/11/07 " + +/***************************************************************************** +Copyright 1987, 1988, 1989, 1990, 1991 by Digital Equipment Corp., Maynard, MA + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*****************************************************************************/ +/* + * + * CONTRIBUTORS: + * + * Dick Annicchiarico + * Robert Chesler + * Dan Coutu + * Gene Durso + * Marc Evans + * Alan Jamison + * Mark Henry + * Ken Miller + * + * DESCRIPTION: + * This header file describes the data structures and constants + * required to utilize the custom "stream" facility which presents + * a common interface to varying I/O transports. Currently only + * partially implemented for (server-side). + */ +#include +#if defined TCPCONN && !defined VMS +#include +#endif +#if defined DNETCONN && !defined VMS +#include +#endif + +typedef struct +{ + INT32 flink; + INT32 blink; +} +#ifdef VMS + _align(QUADWORD) +#endif + QUEUE_HDR; + +/* Stream I/O data abstraction: + * The following structures support a loose rendition of + * stream I/O abstraction for use in writing more portable + * applications between VMS and U*IX. It was intentionally + * decided NOT to attempt to implement streams per the + * published interface specification (beyond *our* scope). + * However, the *principle* is being observed in the hope + * that someday XTrap can take advantage of some future + * streams implementation. + */ +typedef struct _XESTREAM /* stream I/O object */ +{ + struct _XESTREAM *next; + CARD8 type; + Bool queue; + int_function accept; + int_function close; + int_function read; + int_function write; + void_function err_func; + CARD16 addr1_lgth; /* in bytes (counted string) */ + char *addr1; /* string of what's opened */ + CARD16 addr2_lgth; /* in bytes (counted string) */ + char *addr2; /* Maybe a return addr (DECnet) */ + union + { + struct _qio + { + INT16 read_chan; + INT16 write_chan; + CARD16 iosb[4L]; + CARD32 efn; + CARD32 read_mode; + CARD32 write_mode; + QUEUE_HDR *read_queue; /* must be quadword-aligned loc */ + QUEUE_HDR *free_queue; /* must be quadword-aligned loc */ + CARD32 byte_cnt; + CARD32 bufsiz; + CARD32 bufinc; + CARD32 errno; +#if defined TCPCONN || defined DNETCONN + CARD32 accept_efn; + INT16 port; + INT16 mbx_chan; + void *ncb; /* VMS-only Network Command Block Info */ + void *netcmd; /* VMS-only Network Command Mbx Logical */ +#endif + } Q; + struct _dsc + { + INT32 fd; + INT32 sd; /* socket descriptor for init connection */ +#if defined TCPCONN && !defined VMS + struct sockaddr_in insock; +#endif +#if defined DNETCONN && !defined VMS + struct sockaddr_dn dnsock; +#endif + } D; + } u; +} XESTREAM; + +/* Currently defined Stream Types */ +#define StreamInternet 1L +#define StreamDECnet 2L +#define StreamMbx 3L /* Only on VMS */ +#define StreamShMem 4L /* Not Currently Implemented */ +#define StreamFile 5L +#define StreamLAT 6L /* Not Currently Implemented */ + + +#define BUFSIZstream 1500L /* Stream BUFSIZ used w/queued stream type */ + /* Note: Can't be <110 bytes for DECnet */ +#define BUFstream 1L /* Initial increment of n buffers per */ + /* stream. Increases exponentially as more */ + /* are req'd */ +#ifdef vms +typedef struct _QREC +{ + CARD32 queue_entry[2L]; + CARD16 iosb[4L]; + XESTREAM *st; + CARD8 *data; +} +#ifdef VMS + _align(QUADWORD) +#endif + QREC; +typedef struct _QREC *QRECPtr; + +#define MbxSize 8192L +#define MbxBufs 2L + +#endif + +#if defined TCPCONN || defined DNETCONN +#define AcceptInterval 2 /* in seconds */ +#define AcceptLoops 15 /* max times around the loop */ +#endif + +#define XEStreamEFN 7L /* Arbitrary event flag in cluster 0 for VMS use */ + +#define SIOErr(st,err_str) ((void)(*(st)->err_func)(err_str)) +#define SIOSetErrFunc(st,rtn) ((st)->err_func = (void_function)rtn) +#define SIOGetErrFunc(st) ((st)->err_func) + +#endif /* __XESTREAM__ */ diff --git a/xie/docs/dec/xie23-src/include/xkmeproto_include.h b/xie/docs/dec/xie23-src/include/xkmeproto_include.h new file mode 100644 index 0000000..e9e30d3 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/xkmeproto_include.h @@ -0,0 +1,123 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/*********************************************************************** +Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts. +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +************************************************************************/ +/* +**++ +** FACILITY: +** +** common struct +** +** ABSTRACT: +** +** It contains protocol definition for the keyboard management extension. +** (KME). +** The KME extension name string and all relevant protocol definition for +** I18N keyboard mode-switching are defined here. +** +** ENVIRONMENT: +** +** Ultrix +** +** MODIFICATION HISTORY: +** +**-- +**/ +#ifndef XKMEPROTO_INCLUDE_H +#define XKMEPROTO_INCLUDE_H + +#define KMEXTENSIONNAME "Keyboard-Management-Extension" + +/* constant returned by XKME routines indicating that the target server + * version does not honor the request */ +#define KMEBADREQUEST 2 + +/* Opcodes to set and reset keyboard mode-switch */ +#define X_KMEDoKBModeSwitch 10 + +/* command mode constants for switching the keyboard mode */ +#define LockDownModeSwitch 1 +#define UnlockModeSwitch 2 + + +/* reply constants */ +#define KBModeSwitchSuccess 0 /* kb mode successfully switched */ +#define KBModeSwitchFailure 1 /* kb mode failed to switch */ +#define KBModeSwitchInvalidCmd 2 /* invalid kb mode-switch command */ +#define KBModeSwitchNoop 3 /* Keyboard is already in the request mode*/ + + +/* + * X_KMEDoKBModeSwitch request packet def + */ +typedef struct { + CARD8 reqType; + CARD8 minor_opcode; + CARD16 length B16; + CARD32 mode B32; /* LockDownModeSwitch or UnlockModeSwitch */ +} xKMEDoKBModeSwitchReq; + +/* + * X_KMEDoKBModeSwitch reply packet definition + */ +typedef struct { + BYTE type; + BYTE data1; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 status B32; /* 0 = SUCCESS, 1 = FAILURE */ + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; +}xKMEDoKBModeSwitchRep; + +#define sz_xKMEDoKBModeSwitchReq (sizeof(xKMEDoKBModeSwitchReq)) +#define sz_xKMEDoKBModeSwitchRep (sizeof(xKMEDoKBModeSwitchRep)) + +#endif /* XKMEPROTO_INCLUDE_H */ diff --git a/xie/docs/dec/xie23-src/include/xtestext1.h b/xie/docs/dec/xie23-src/include/xtestext1.h new file mode 100644 index 0000000..9f86011 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/xtestext1.h @@ -0,0 +1,327 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* + * xtestext1.h + * + * X11 Input Synthesis Extension include file + */ + +/* + +Copyright 1986, 1987, 1988 by Hewlett-Packard Corporation +Copyright 1986, 1987, 1988 by the Massachusetts Institute of Technology + +Permission to use, copy, modify, and distribute this +software and its documentation for any purpose and without +fee is hereby granted, provided that the above copyright +notice appear in all copies and that both that copyright +notice and this permission notice appear in supporting +documentation, and that the name of M.I.T. not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +Hewlett-Packard and M.I.T. make no representations about the +suitability of this software for any purpose. It is provided +"as is" without express or implied warranty. + +This software is not subject to any license of the American +Telephone and Telegraph Company or of the Regents of the +University of California. + +*/ + +/* + * the typedefs for CARD8, CARD16, and CARD32 are defined in Xmd.h + */ + +/* + * used in the XTestPressButton and XTestPressKey functions + */ +#define XTestPRESS 1 << 0 +#define XTestRELEASE 1 << 1 +#define XTestSTROKE 1 << 2 + +/* + * When doing a key or button stroke, the number of milliseconds + * to delay between the press and the release of a key or button + * in the XTestPressButton and XTestPressKey functions. + */ + +#define XTestSTROKE_DELAY_TIME 10 + +/* + * used in the XTestGetInput function + */ +#define XTestEXCLUSIVE 1 << 0 +#define XTestPACKED_ACTIONS 1 << 1 +#define XTestPACKED_MOTION 1 << 2 + +/* + * used in the XTestFakeInput function + */ +#define XTestFAKE_ACK_NOT_NEEDED 0 +#define XTestFAKE_ACK_REQUEST 1 + +/* + * used in the XTest extension initialization routine + */ +#define XTestEXTENSION_NAME "XTestExtension1" +#define XTestEVENT_COUNT 2 + +/* + * XTest request type values + * + * used in the XTest extension protocol requests + */ +#define X_TestFakeInput 1 +#define X_TestGetInput 2 +#define X_TestStopInput 3 +#define X_TestReset 4 +#define X_TestQueryInputSize 5 + +/* + * This defines the maximum size of a list of input actions + * to be sent to the server. It should always be a multiple of + * 4 so that the entire xTestFakeInputReq structure size is a + * multiple of 4. + */ +#define XTestMAX_ACTION_LIST_SIZE 64 + +typedef struct { + CARD8 reqType; /* always XTestReqCode */ + CARD8 XTestReqType; /* always X_TestFakeInput */ + CARD16 length B16; /* 2 + XTestMAX_ACTION_LIST_SIZE/4 */ + CARD32 ack B32; + CARD8 action_list[XTestMAX_ACTION_LIST_SIZE]; +} xTestFakeInputReq; +#define sz_xTestFakeInputReq (XTestMAX_ACTION_LIST_SIZE + 8) + +typedef struct { + CARD8 reqType; /* always XTestReqCode */ + CARD8 XTestReqType; /* always X_TestGetInput */ + CARD16 length B16; /* 2 */ + CARD32 mode B32; +} xTestGetInputReq; +#define sz_xTestGetInputReq 8 + +typedef struct { + CARD8 reqType; /* always XTestReqCode */ + CARD8 XTestReqType; /* always X_TestStopInput */ + CARD16 length B32; /* 1 */ +} xTestStopInputReq; +#define sz_xTestStopInputReq 4 + +typedef struct { + CARD8 reqType; /* always XTestReqCode */ + CARD8 XTestReqType; /* always X_TestReset */ + CARD16 length B16; /* 1 */ +} xTestResetReq; +#define sz_xTestResetReq 4 + +typedef struct { + CARD8 reqType; /* always XTestReqCode */ + CARD8 XTestReqType; /* always X_TestQueryInputSize */ + CARD16 length B16; /* 1 */ +} xTestQueryInputSizeReq; +#define sz_xTestQueryInputSizeReq 4 + +/* + * This is the definition of the reply for the xTestQueryInputSize + * request. It should remain the same minimum size as other replies + * (32 bytes). + */ +typedef struct { + CARD8 type; /* always X_Reply */ + CARD8 pad1; + CARD16 sequenceNumber B16; + CARD32 length B32; /* always 0 */ + CARD32 size_return B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xTestQueryInputSizeReply; + +/* + * This is the definition for the input action wire event structure. + * This event is sent to the client when the server has one or + * more user input actions to report to the client. It must + * remain the same size as all other wire events (32 bytes). + */ +#define XTestACTIONS_SIZE 28 + +typedef struct { + CARD8 type; /* always XTestInputActionType */ + CARD8 pad00; + CARD16 sequenceNumber B16; + CARD8 actions[XTestACTIONS_SIZE]; +} xTestInputActionEvent; + +/* + * This is the definition for the xTestFakeAck wire event structure. + * This event is sent to the client when the server has completely + * processed its input action buffer, and is ready for more. + * It must remain the same size as all other wire events (32 bytes). + */ +typedef struct { + CARD8 type; /* always XTestFakeAckType */ + CARD8 pad00; + CARD16 sequenceNumber B16; + CARD32 pad02 B32; + CARD32 pad03 B32; + CARD32 pad04 B32; + CARD32 pad05 B32; + CARD32 pad06 B32; + CARD32 pad07 B32; + CARD32 pad08 B32; +} xTestFakeAckEvent; + +/* + * The server side of this extension does not (and should not) have + * definitions for Display and Window. The ifndef allows the server + * side of the extension to ignore the following typedefs. + */ +#ifndef XTestSERVER_SIDE +/* + * This is the definition for the input action host format event structure. + * This is the form that a client using this extension will see when + * it receives an input action event. + */ +typedef struct { + int type; /* always XTestInputActionType */ + Display *display; + Window window; + CARD8 actions[XTestACTIONS_SIZE]; +} XTestInputActionEvent; + +/* + * This is the definition for the xTestFakeAck host format event structure. + * This is the form that a client using this extension will see when + * it receives an XTestFakeAck event. + */ +typedef struct { + int type; /* always XTestFakeAckType */ + Display *display; + Window window; +} XTestFakeAckEvent; +#endif + +/* + * This is the definition for the format of the header byte + * in the input action structures. + */ +#define XTestACTION_TYPE_MASK 0x03 /* bits 0 and 1 */ +#define XTestKEY_STATE_MASK 0x04 /* bit 2 (key action) */ +#define XTestX_SIGN_BIT_MASK 0x04 /* bit 2 (motion action) */ +#define XTestY_SIGN_BIT_MASK 0x08 /* bit 3 (motion action) */ +#define XTestDEVICE_ID_MASK 0xf0 /* bits 4 through 7 */ + +#define XTestMAX_DEVICE_ID 0x0f +#define XTestPackDeviceID(x) (((x) & XTestMAX_DEVICE_ID) << 4) +#define XTestUnpackDeviceID(x) (((x) & XTestDEVICE_ID_MASK) >> 4) + +/* + * These are the possible action types. + */ +#define XTestDELAY_ACTION 0 +#define XTestKEY_ACTION 1 +#define XTestMOTION_ACTION 2 +#define XTestJUMP_ACTION 3 + +/* + * These are the definitions for key/button motion input actions. + */ +#define XTestKEY_UP 0x04 +#define XTestKEY_DOWN 0x00 + +typedef struct { + CARD8 header; /* which device, key up/down */ + CARD8 keycode; /* which key/button to move */ + CARD16 delay_time B16; /* how long to delay (in ms) */ +} XTestKeyInfo; + +/* + * This is the definition for pointer jump input actions. + */ +typedef struct { + CARD8 header; /* which pointer */ + CARD8 pad1; /* unused padding byte */ + CARD16 jumpx B16; /* x coord to jump to */ + CARD16 jumpy B16; /* y coord to jump to */ + CARD16 delay_time B16; /* how long to delay (in ms) */ +} XTestJumpInfo; + +/* + * These are the definitions for pointer relative motion input + * actions. + * + * The sign bits for the x and y relative motions are contained + * in the header byte. The x and y relative motions are packed + * into one byte to make things fit in 32 bits. If the relative + * motion range is larger than +/-15, use the pointer jump action. + */ +#define XTestMOTION_MAX 15 +#define XTestMOTION_MIN -15 + +#define XTestX_NEGATIVE 0x04 +#define XTestY_NEGATIVE 0x08 + +#define XTestX_MOTION_MASK 0x0f +#define XTestY_MOTION_MASK 0xf0 + +#define XTestPackXMotionValue(x) ((x) & XTestX_MOTION_MASK) +#define XTestPackYMotionValue(x) (((x) << 4) & XTestY_MOTION_MASK) + +#define XTestUnpackXMotionValue(x) ((x) & XTestX_MOTION_MASK) +#define XTestUnpackYMotionValue(x) (((x) & XTestY_MOTION_MASK) >> 4) + +typedef struct { + CARD8 header; /* which pointer */ + CARD8 motion_data; /* x,y relative motion */ + CARD16 delay_time B16; /* how long to delay (in ms) */ +} XTestMotionInfo; + +/* + * These are the definitions for a long delay input action. It is + * used when more than XTestSHORT_DELAY_TIME milliseconds of delay + * (approximately one minute) is needed. + * + * The device ID for a delay is always set to XTestDELAY_DEVICE_ID. + * This guarantees that a header byte with a value of 0 is not + * a valid header, so it can be used as a flag to indicate that + * there are no more input actions in an XTestInputAction event. + */ + +#define XTestSHORT_DELAY_TIME 0xffff +#define XTestDELAY_DEVICE_ID 0x0f + +typedef struct { + CARD8 header; /* always XTestDELAY_DEVICE_ID */ + CARD8 pad1; /* unused padding byte */ + CARD16 pad2 B16; /* unused padding word */ + CARD32 delay_time B32; /* how long to delay (in ms) */ +} XTestDelayInfo; diff --git a/xie/docs/dec/xie23-src/include/xteststr.h b/xie/docs/dec/xie23-src/include/xteststr.h new file mode 100644 index 0000000..9c04a0f --- /dev/null +++ b/xie/docs/dec/xie23-src/include/xteststr.h @@ -0,0 +1,121 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* $XConsortium: xteststr.h,v 1.5 92/04/20 13:14:15 rws Exp $ */ +/* + +Copyright 1992 by the Massachusetts Institute of Technology + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation, and that the name of M.I.T. not be used in advertising or +publicity pertaining to distribution of the software without specific, +written prior permission. M.I.T. makes no representations about the +suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +*/ + +/* The following are needed for correctly-sized protocol requests */ + +#include +#define Window CARD32 +#define Time CARD32 +#define Cursor CARD32 + + +#define XTestCurrentCursor ((Cursor)1) + +typedef struct { + CARD8 reqType; /* always XTestReqCode */ + CARD8 xtReqType; /* always X_XTestGetVersion */ + CARD16 length B16; + CARD8 majorVersion; + CARD8 pad; + CARD16 minorVersion B16; +} xXTestGetVersionReq; +#define sz_xXTestGetVersionReq 8 + +typedef struct { + BYTE type; /* X_Reply */ + CARD8 majorVersion; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 minorVersion B16; + CARD16 pad0 B16; + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; +} xXTestGetVersionReply; +#define sz_xXTestGetVersionReply 32 + +typedef struct { + CARD8 reqType; /* always XTestReqCode */ + CARD8 xtReqType; /* always X_XTestCompareCursor */ + CARD16 length B16; + Window window B32; + Cursor cursor B32; +} xXTestCompareCursorReq; +#define sz_xXTestCompareCursorReq 12 + +typedef struct { + BYTE type; /* X_Reply */ + BOOL same; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 pad0 B32; + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; +} xXTestCompareCursorReply; +#define sz_xXTestCompareCursorReply 32 + +/* used only on the client side */ +typedef struct { + CARD8 reqType; /* always XTestReqCode */ + CARD8 xtReqType; /* always X_XTestFakeInput */ + CARD16 length B16; + BYTE type; + BYTE detail; + CARD16 pad0 B16; + Time time B32; + Window root B32; + CARD32 pad1 B32; + CARD32 pad2 B32; + INT16 rootX B16, rootY B16; + CARD32 pad3 B32; + CARD32 pad4 B32; +} xXTestFakeInputReq; +#define sz_xXTestFakeInputReq 36 + +#undef Window CARD32 +#undef Time CARD32 +#undef Cursor CARD32 diff --git a/xie/docs/dec/xie23-src/include/xtrapddmi.h b/xie/docs/dec/xie23-src/include/xtrapddmi.h new file mode 100644 index 0000000..6928ffd --- /dev/null +++ b/xie/docs/dec/xie23-src/include/xtrapddmi.h @@ -0,0 +1,181 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* BuildSystemHeader added automatically */ +/* $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/include/xtrapddmi.h,v 1.1.2.3 92/04/27 12:36:37 Leela_Obilichetti Exp $ */ +#ifndef __XTRAPDDMI__ +#define __XTRAPDDMI__ + +/***************************************************************************** +Copyright 1987, 1988, 1989, 1990, 1991 by Digital Equipment Corp., Maynard, MA + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*****************************************************************************/ +/* + * + * CONTRIBUTORS: + * + * Dick Annicchiarico + * Robert Chesler + * Dan Coutu + * Gene Durso + * Marc Evans + * Alan Jamison + * Mark Henry + * Ken Miller + * + * DESCRIPTION: + * This header file is used by the XTrap server extension only + * (not used by clients or the XTrap Toolkit). Information + * contained herein should *not* be visible to clients (xtrapdi.h + * is used for this). The name is historical. + */ +#include "X.h" +#include "bits.h" +#include "dix.h" + +#ifndef MIN +# define MIN(a,b) ((a) < (b) ? (a) : (b)) +#endif +#ifndef MAX +# define MAX(a,b) ((a) > (b) ? (a) : (b)) +#endif + +#define XETrapNumEvents 1L /* constants used for AddExtension */ + +/* Other constants used within the extension code */ +#define XETrapMinRepSize 32L /* Minimum number of longs */ + +/* This structure will be globally declared to provide storage to hold + * the various extension wide configuration information. Allocated on + * a per-client basis. + */ +typedef struct +{ + ClientPtr client; /* Multi-client support and error handling */ + xXTrapGetCurReply cur; /* Struct of Miscellaneous state info */ + xXTrapGetStatsReply *stats; /* Pointer to stat's, malloc'd if requested */ + CARD32 last_input_time B32; /* last timestamp from input event */ + CARD16 protocol B16; /* current communication protocol */ +} XETrapEnv; + +#define XETrapSetHeaderEvent(phdr) ((phdr)->type = 0x1L) +#define XETrapSetHeaderRequest(phdr) ((phdr)->type = 0x2L) +#define XETrapSetHeaderSpecial(phdr) ((phdr)->type = 0x3L) +#define XETrapSetHeaderCursor(phdr) ((phdr)->type = 0x4L) +#define XETrapSetHeaderReply(phdr) ((phdr)->type = 0x5L) + +#ifdef X11R3 +/* Swapping macros not visible in X11 Release 3 */ +#define LengthRestB(stuff) \ + (((unsigned long)stuff->length << 2) - sizeof(*stuff)) + +#define LengthRestS(stuff) \ + (((unsigned long)stuff->length << 1) - (sizeof(*stuff) >> 1)) + +#define LengthRestL(stuff) \ + ((unsigned long)stuff->length - (sizeof(*stuff) >> 2)) + +#define SwapRestS(stuff) \ + SwapShorts((short *)(stuff + 1), LengthRestS(stuff)) + +#define SwapRestL(stuff) \ + SwapLongs((long *)(stuff + 1), LengthRestL(stuff)) + +/* copy long from src to dst byteswapping on the way */ +#ifndef cpswapl +#define cpswapl(Src, Dest) \ + { \ + char *pSrc = (char *)&(Src); \ + char *pDest = (char *)&(Dest); \ + pDest[0] = pSrc[3]; \ + pDest[1] = pSrc[2]; \ + pDest[2] = pSrc[1]; \ + pDest[3] = pSrc[0]; \ + } +#endif +/* copy short from src to dst byteswapping on the way */ +#ifndef cpswaps +#define cpswaps(Src, Dest)\ + { \ + char *pSrc = ((char *)&(Src)); \ + char *pDest = ((char *)&(Dest)); \ + pDest[1] = pSrc[0]; \ + pDest[0] = pSrc[1]; \ + } +#endif +#endif /* X11R3 */ + +#ifndef vaxc +#define globaldef +#define globalref extern +#endif + +/* Extension platform identifier (conditionally defined) */ +#ifdef osf1 +# define XETrapPlatform PF_DECOSF1 +#endif +#ifdef ultrix +# define XETrapPlatform PF_DECUltrix +#endif +#ifdef vms +#ifdef VAXELN +# define XETrapPlatform PF_DECELN +#else +# define XETrapPlatform PF_DECVMS +#endif +#endif +#ifdef VT1000 +# define XETrapPlatform PF_DECVT1000 +#endif +#ifdef VXT +# define XETrapPlatform PF_DECXTerm +#endif +#ifdef PC +# define XETrapPlatform PF_IBMAT +#endif +#ifdef sun +# define XETrapPlatform PF_SunSparc +#endif +#ifndef XETrapPlatform +# define XETrapPlatform PF_Other +#endif /* XETrapPlatform */ + +#endif /* __XTRAPDDMI__ */ diff --git a/xie/docs/dec/xie23-src/include/xtrapdi.h b/xie/docs/dec/xie23-src/include/xtrapdi.h new file mode 100644 index 0000000..ccca215 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/xtrapdi.h @@ -0,0 +1,539 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* +************************************************************************** +** DIGITAL EQUIPMENT CORPORATION ** +** CONFIDENTIAL ** +** NOT FOR MODIFICATION OR REDISTRIBUTION IN ANY MANNER WHATSOEVER ** +************************************************************************** +*/ +#ifndef __XTRAPDI__ +#define __XTRAPDI__ + +/***************************************************************************** +Copyright 1987, 1988, 1989, 1990, 1991, 1992 by Digital Equipment Corp., +Maynard, MA + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*****************************************************************************/ +/* + * + * CONTRIBUTORS: + * + * Dick Annicchiarico + * Robert Chesler + * Dan Coutu + * Gene Durso + * Marc Evans + * Alan Jamison + * Mark Henry + * Ken Miller + * + * DESCRIPTION: + * This header file defines the common structures/constants + * between the XTrap extension and clients. All protocol + * definitions between XTrap extension/clients can be found + * here. + */ + +#define NEED_REPLIES +#define NEED_EVENTS +#include +#include "X.h" +#include "Xmd.h" +#ifdef SMT +#define NEED_EVENTS +#define NEED_REPLIES +#endif +#include "Xproto.h" +#include "bits.h" +#define XTrapExtName "DEC-XTRAP" +/* Current Release, Version, and Revision of the XTrap Extension */ +#define XETrapRelease 3L +#define XETrapVersion 3L +#ifndef XETrapRevision /* Changed from the Makefile by users */ +# define XETrapRevision 0L +#endif /* XETrapRevision */ +#define XETrapProtocol 32L + +#ifndef B8 +# define B8 :8 +#endif +#ifndef SIZEOF +# ifdef __STDC__ +# define SIZEOF(x) sz_##x +# else +# define SIZEOF(x) sz_/**/x +# endif /* if ANSI C compiler else not */ +#endif +#ifndef sz_CARD32 +#define sz_CARD32 4L +#endif +#ifndef sz_CARD8 +#define sz_CARD8 1L +#endif +#ifndef True +# define True 1L +# define False 0L +#endif + +typedef int (*int_function)(); +typedef void (*void_function)(); + +/* This is used as flags to indicate desired request traps + * Note: This has been padded to a CARD32 to keep structure aligned + */ +#define XETrapMaxRequest (((SIZEOF(CARD32)+((256L-1L) / \ + (BitsInByte*SIZEOF(CARD8))))/SIZEOF(CARD32))*SIZEOF(CARD32)) +typedef CARD8 ReqFlags[XETrapMaxRequest]; + +/* This is used as flags to indicate desired event traps + * Until events become *fully vectored*, we'll have to fake it + * by defining an array of 5 events (KeyPress, KeyRelease, + * ButtonPress, ButtonRelease, and MotionNotify. The extra 2 + * are required as the event types start with "2" (errors and + * replies are 0 & 1). The event type is the index into the + * bits. + * Note: This has been padded to a longword to keep structure aligned + */ +#ifndef VECTORED_EVENTS +#define XETrapCoreEvents (2L+5L) +#else +#define XETrapCoreEvents 128L +#endif +#define XETrapMaxEvent (((SIZEOF(CARD32)+((XETrapCoreEvents-1L) / \ + (BitsInByte*SIZEOF(CARD8))))/SIZEOF(CARD32))*SIZEOF(CARD32)) +typedef CARD8 EventFlags[XETrapMaxEvent]; + +/* This structure is used in a request to specify the types of + * configuration information that should be changed or updated. + */ +typedef struct +{ + CARD8 valid[4L]; /* Bits TRUE indicates data field is used */ + CARD8 data[4L]; /* Bits looked at if corresponding valid bit set */ + ReqFlags req; /* Bits coorespond to core requests */ + EventFlags event; /* Bits correspond to core events */ +} XETrapFlags; + +/* Bit definitions for the above XETrapFlags structure. */ +#define XETrapTimestamp 0L /* hdr timestamps desired */ +#define XETrapCmd 1L /* command key specified */ +#define XETrapCmdKeyMod 2L /* cmd key is a modifier */ +#define XETrapRequest 3L /* output requests array */ +#define XETrapEvent 4L /* future output events array */ +#define XETrapMaxPacket 5L /* Maximum packet length set */ +#define XETrapTransOut 6L /* obsolete */ +#define XETrapStatistics 7L /* collect counts on requests */ +#define XETrapWinXY 8L /* Fill in Window (X,Y) in hdr */ +#define XETrapTransIn 9L /* obsolete */ +#define XETrapCursor 10L /* Trap cursor state changes */ +#define XETrapXInput 11L /* Use XInput extension */ +#define XETrapVectorEvents 12L /* Use Vectored Events (128) */ +#define XETrapColorReplies 13L /* Return replies with Color Req's */ +#define XETrapGrabServer 14L /* Disables client GrabServers */ + +typedef struct /* used by XEConfigRequest */ +{ + XETrapFlags flags; /* Flags to specify what should be chg'd */ + CARD16 max_pkt_size B16; /* Maximum number of bytes in a packet */ + CARD8 cmd_key B8; /* Keyboard command_key (KeyCode) */ +/* + * cmd_key is intentionally *not* defined KeyCode since it's definition is + * ambiguous (int in Intrinsic.h and unsigned char in X.h. + */ + CARD8 pad[1L]; /* pad out to a quadword */ +} XETrapCfg; + +/* These structures are used within the Xtrap request structure for + * the various types of xtrap request + */ +#ifndef _XINPUT +/* (see the definition of XEvent as a reference) */ +typedef struct /* used by XESimulateXEventRequest for synthesizing core evts */ +{ + CARD8 type B8; /* (must be first) as in XEvent */ + CARD8 detail B8; /* Detail keycode/button as in XEvent */ + CARD8 screen B8; /* screen number (0 to n) */ + CARD8 pad B8; /* pad to longword */ + INT16 x B16; /* X & Y coord as in XEvent */ + INT16 y B16; +} XETrapInputReq; +#endif + +/* These are constants that refer to the extension request vector table. + * A request will use these values as minor opcodes. + */ +#define XETrap_Reset 0L /* set to steady state */ +#define XETrap_GetAvailable 1L /* get available funct from ext */ +#define XETrap_Config 2L /* configure extension */ +#define XETrap_StartTrap 3L /* use Trapping */ +#define XETrap_StopTrap 4L /* stop using Trapping */ +#define XETrap_GetCurrent 5L /* get current info from ext */ +#define XETrap_GetStatistics 6L /* get count statistics from ext */ +#ifndef _XINPUT +#define XETrap_SimulateXEvent 7L /* async input simulation */ +#endif +#define XETrap_GetVersion 8L /* Get (Just) Version */ +#define XETrap_GetLastInpTime 9L /* Get Timestamp of last client input */ + +/* The following are formats of a request to the XTRAP + * extension. The data-less XTrap requests all use xXTrapReq + */ +typedef struct +{ + CARD8 reqType B8; + CARD8 minor_opcode B8; + CARD16 length B16; + CARD32 pad B32; /* Maintain quadword alignment */ +} xXTrapReq; +/* the following works because all fields are defined as bit (Bnn) fields */ +#define sz_xXTrapReq (sizeof(xXTrapReq)) +/* For retrieving version/available info (passes lib-side protocol number) */ +typedef struct +{ + CARD8 reqType B8; + CARD8 minor_opcode B8; + CARD16 length B16; + CARD16 protocol B16; /* The xtrap extension protocol number */ + CARD16 pad B16; /* Maintain quadword alignment */ +} xXTrapGetReq; +/* the following works because all fields are defined as bit (Bnn) fields */ +#define sz_xXTrapGetReq (sizeof(xXTrapGetReq)) + +typedef struct +{ + CARD8 reqType B8; + CARD8 minor_opcode B8; + CARD16 length B16; + /* + * The follwing is done so that structure padding wont be + * a problem. The request structure contains a shadow for + * the XETrapCfg structure. Since the XETrapCfg also has a + * substructure (XETrapFlags) this structure is also shadowed. + * + * The following are a shadow of the XETrapFlags + * structure. + */ + CARD8 config_flags_valid[4L]; + CARD8 config_flags_data[4L]; + ReqFlags config_flags_req; + EventFlags config_flags_event; + /* End Shadow (XETrapFlags)*/ + CARD16 config_max_pkt_size B16; /* Max number of bytes in a packet */ + CARD8 config_cmd_key B8; /* Keyboard command_key (KeyCode) */ +/* + * cmd_key is intentionally *not* defined KeyCode since it's definition is + * ambiguous (int in Intrinsic.h and unsigned char in X.h. + */ + CARD8 config_pad[1L]; /* pad out to a quadword */ + /* End Shadow (XETrapCfg) */ + CARD32 pad B32; /* Maintain quadword alignment */ +} xXTrapConfigReq; +/* the following works because all fields are defined as bit (Bnn) fields */ +#define sz_xXTrapConfigReq (sizeof(xXTrapConfigReq)) + +#ifndef _XINPUT +typedef struct +{ + CARD8 reqType B8; + CARD8 minor_opcode B8; + CARD16 length B16; + CARD32 pad B32; /* Maintain quadword alignment */ + XETrapInputReq input; +} xXTrapInputReq; +/* the following works because all fields are defined as bit (Bnn) fields */ +#define sz_xXTrapInputReq (sizeof(xXTrapInputReq)) +#endif + + +/* The following structures are used by the server extension to send + * information and replies to the client. + */ + +/* header for all X replies */ +typedef struct +{ + CARD8 type B8; + CARD8 detail B8; + CARD16 sequenceNumber B16; + CARD32 length B32; +} XETrapRepHdr; + +/* Structure of Get Available Functionality reply */ +typedef struct +{ + CARD32 pf_ident B32; /* Contains constant identifying the platform */ + CARD16 xtrap_release B16; /* The xtrap extension release number */ + CARD16 xtrap_version B16; /* The xtrap extension version number */ + CARD16 xtrap_revision B16; /* The xtrap extension revision number */ + CARD16 max_pkt_size B16; /* Maximum number of bytes in a packet */ + CARD8 valid[4]; /* What specific configuration flags are valid */ + CARD32 major_opcode B32; /* The major opcode identifying xtrap */ + CARD32 event_base B32; /* The event value we start at */ + CARD32 pad0 B32; /* obsolete field */ + CARD16 pad1 B16, pad2 B16, pad3 B16; /* obsolete field */ + CARD16 xtrap_protocol B16; /* The xtrap extension protocol number */ + INT16 cur_x B16; /* Current X & Y coord for relative motion */ + INT16 cur_y B16; +} XETrapGetAvailRep; + +typedef struct +{ + CARD16 xtrap_release B16; /* The xtrap extension release number */ + CARD16 xtrap_version B16; /* The xtrap extension version number */ + CARD16 xtrap_revision B16; /* The xtrap extension revision number */ + CARD16 xtrap_protocol B16; /* The xtrap extension protocol number */ +} XETrapGetVersRep; + +typedef struct +{ + CARD32 last_time B32; /* Timestamp of last input time */ +} XETrapGetLastInpTimeRep; + +/* Structure of Get Current Configuration Information reply */ +typedef struct +{ + CARD8 state_flags[2]; /* Miscelaneous flags, see below #define's */ + CARD16 pad0 B16; /* Assure quadword alignment */ + XETrapCfg config; /* Current Config information */ + CARD32 pad1 B32; +} XETrapGetCurRep; + +/* Mask definitions for the above flags. */ +#define XETrapTrapActive 0L /* If sending/receiving between client/ext */ + +/* Structure of Get Statistics Information reply */ +typedef struct +{ + CARD32 requests[256L]; /* Array containing request counts if trapped */ + CARD32 events[XETrapCoreEvents]; /* Array containing event stats */ +#ifndef VECTORED_EVENTS + CARD32 pad B32; /* Pad out to a quadword */ +#endif +} XETrapGetStatsRep; + +#define PF_Other 0L /* server not one of the below */ +#define PF_Apollo 10L /* server on Apollo system */ +#define PF_ATT 20L /* server on AT&T system */ +#define PF_Cray1 30L /* server on Cray 1 system */ +#define PF_Cray2 31L /* server on Cray 2 system */ +#define PF_DECUltrix 40L /* server on DEC ULTRIX system */ +#define PF_DECVMS 41L /* server on DEC VMS system */ +#define PF_DECVT1000 42L /* server on DEC-VT1000-terminal */ +#define PF_DECXTerm 43L /* server on DEC-X-terminal */ +#define PF_DECELN 44L /* server on DEC VAXELN X terminal */ +#define PF_DECOSF1 45L /* server on DEC's OSF/1 system */ +#define PF_HP9000s800 50L /* server on HP 9000/800 system */ +#define PF_HP9000s300 51L /* server on HP 9000/300 system */ +#define PF_IBMAT 60L /* server on IBM/AT system */ +#define PF_IBMRT 61L /* server on IBM/RT system */ +#define PF_IBMPS2 62L /* server on IBM/PS2 system */ +#define PF_IBMRS 63L /* server on IBM/RS system */ +#define PF_MacII 70L /* server on Mac II system */ +#define PF_Pegasus 80L /* server on Tektronix Pegasus system */ +#define PF_SGI 90L /* server on Silicon Graphcis system */ +#define PF_Sony 100L /* server on Sony system */ +#define PF_Sun3 110L /* server on Sun 3 system */ +#define PF_Sun386i 111L /* server on Sun 386i system */ +#define PF_SunSparc 112L /* server on Sun Sparc system */ + +/* reply sent back by XETrapGetAvailable request */ +typedef struct +{ + XETrapRepHdr hdr; + XETrapGetAvailRep data; +} xXTrapGetAvailReply; +/* the following works because all fields are defined as bit (Bnn) fields */ +#define sz_xXTrapGetAvailReply sizeof(xXTrapGetAvailReply) + +/* reply sent back by XETrapGetVersion request */ +typedef struct +{ + XETrapRepHdr hdr; + XETrapGetVersRep data; + CARD32 pad0 B32; /* pad out to 32 bytes */ + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; +} xXTrapGetVersReply; +/* the following works because all fields are defined as bit (Bnn) fields */ +#define sz_xXTrapGetVersReply sizeof(xXTrapGetVersReply) + +/* reply sent back by XETrapGetLastInpTime request */ +typedef struct +{ + XETrapRepHdr hdr; + /* + * The following is a shadow of the XETrapGetLastInpTimeRep + * structure. This is done to avoid structure padding. + */ + CARD32 data_last_time B32; /* Timestamp of last input time */ + CARD32 pad0 B32; /* pad out to 32 bytes */ + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; +} xXTrapGetLITimReply; +/* the following works because all fields are defined as bit (Bnn) fields */ +#define sz_xXTrapGetLITimReply sizeof(xXTrapGetLITimReply) + +/* reply sent back by XETrapGetCurrent request */ +typedef struct +{ + XETrapRepHdr hdr; + /* + * The following is a shadow of the XETrapGetCurRep + * structure. This is done to avoid structure padding. + * Since the XETrapGetCurRep structure contains a sub-structure + * (XETrapCfg) there is a shadow for that as well.*/ + CARD8 data_state_flags[2]; /* Misc flags, see below #define's */ + CARD16 data_pad0 B16; /* Assure quadword alignment */ + /* XETrapCfg Shadow Starts */ + CARD8 data_config_flags_valid[4L]; + CARD8 data_config_flags_data[4L]; + ReqFlags data_config_flags_req; + EventFlags data_config_flags_event; + CARD16 data_config_max_pkt_size B16; /* Max num of bytes in a pkt */ + CARD8 data_config_cmd_key B8; /* Keyboard cmd_key (KeyCode) */ +/* + * cmd_key is intentionally *not* defined KeyCode since it's definition is + * ambiguous (int in Intrinsic.h and unsigned char in X.h. + */ + CARD8 data_config_pad[1L]; /* pad out to a quadword */ + /* End Shadow (XETrapCfg) */ + CARD32 pad1 B32; +} xXTrapGetCurReply; +/* the following works because all fields are defined as bit (Bnn) fields */ +#define sz_xXTrapGetCurReply sizeof(xXTrapGetCurReply) + +/* reply sent back by XETrapGetStatistics request */ +/* Note: + * The following does *not* use the standard XETrapRepHdr, but instead + * one which is padded out to 32-bytes. This is because Cray's have a problem + * reading arrays of CARD32s without using the _Read32 macro (see XERqsts.c). + * This requires that none of the data be in the _Reply area. + */ +typedef struct +{ + CARD8 type B8; + CARD8 detail B8; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 pad0 B32; + CARD32 pad1 B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + XETrapGetStatsRep data; +} xXTrapGetStatsReply; +#define sz_xXTrapGetStatsReply 1088 + +typedef struct /* the XTrap Output header (for output from ext to client) */ +{ /* this must be quadword aligned for portability */ + CARD32 count B32; /* Length including this header */ + CARD32 timestamp B32; /* timestamp if desired */ + CARD8 type B8; /* event id, request id, special id */ + CARD8 screen B8; /* screen number (0 to n) */ + INT16 win_x B16; /* X coord of drawable, if any */ + INT16 win_y B16; /* X coord of drawable, if any */ + CARD16 client B16; /* to distinguish requests */ +} XETrapHeader; +/* the following works because all fields are defined as bit (Bnn) fields */ +#define sz_XETrapHeader sizeof(XETrapHeader) + +#define XETrapHeaderIsEvent(phdr) (XETrapGetHeaderType(phdr) == 0x1L) +#define XETrapHeaderIsRequest(phdr) (XETrapGetHeaderType(phdr) == 0x2L) +#define XETrapHeaderIsSpecial(phdr) (XETrapGetHeaderType(phdr) == 0x3L) +#define XETrapHeaderIsCursor(phdr) (XETrapGetHeaderType(phdr) == 0x4L) +#define XETrapHeaderIsReply(phdr) (XETrapGetHeaderType(phdr) == 0x5L) + +/* Define a structure used for reading/writing datum of type XTrap */ +typedef struct +{ + XETrapHeader hdr; + union + { + xEvent event; + xResourceReq req; + xGenericReply reply; + /* special? */ + } u; +} XETrapDatum; + +/* this doesn't get picked up for VMS server builds (different Xproto.h) */ +#ifndef sz_xEvent +#define sz_xEvent 32 +#endif +/* Minimum size of a packet from the server extension */ +#define XETrapMinPktSize (SIZEOF(XETrapHeader) + SIZEOF(xEvent)) + +/* Constants used with the XLIB transport */ +#define XETrapDataStart 0L /* Used in the detail field */ +#define XETrapDataContinued 1L /* Used in the detail field */ +#define XETrapDataLast 2L /* Used in the detail field */ +#define XETrapData 0L /* Used in the type field */ +#define XETrapNumberEvents 1L +/* This is the representation on the wire(see also XLib.h) */ +#define sz_EventData 24L /* 32 bytes - type, detail, seq, index */ +typedef struct { + CARD8 type B8; + CARD8 detail B8; + CARD16 sequenceNumber B16; + CARD32 idx B32; + CARD8 data[sz_EventData]; +} xETrapDataEvent; + +/* Error message indexes added to X for extension */ +#define BadIO 2L /* Can't read/write */ +#define BadStatistics 4L /* Stat's not avail. */ +#define BadDevices 5L /* Devices not vectored */ +#define BadScreen 7L /* Can't send event to given screen */ +#define BadSwapReq 8L /* Can't send swapped extension requests */ +#define XETrapNumErrors (BadSwapReq + 1) + + +#define XEKeyIsClear 0 +#define XEKeyIsEcho 1 +#define XEKeyIsOther 2 + +#endif /* __XTRAPDI__ */ diff --git a/xie/docs/dec/xie23-src/include/xtraplib.h b/xie/docs/dec/xie23-src/include/xtraplib.h new file mode 100644 index 0000000..2cc58aa --- /dev/null +++ b/xie/docs/dec/xie23-src/include/xtraplib.h @@ -0,0 +1,158 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* +************************************************************************** +** DIGITAL EQUIPMENT CORPORATION ** +** CONFIDENTIAL ** +** NOT FOR MODIFICATION OR REDISTRIBUTION IN ANY MANNER WHATSOEVER ** +************************************************************************** +*/ +#ifndef __XTRAPLIB__ +#define __XTRAPLIB__ "@(#)xtraplib.h 1.15 - 90/09/18 " +/* RCSID = $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/include/xtraplib.h,v 1.1.2.4 92/06/12 09:33:20 Jim_Ludwig Exp $" */ + +/***************************************************************************** +Copyright 1987, 1988, 1989, 1990, 1991 by Digital Equipment Corp., Maynard, MA + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*****************************************************************************/ +/* + * + * CONTRIBUTORS: + * + * Dick Annicchiarico + * Robert Chesler + * Dan Coutu + * Gene Durso + * Marc Evans + * Alan Jamison + * Mark Henry + * Ken Miller + * + * DESCRIPTION: + * This header file describes all the structures/constants required + * for interfacing with the client toolkit *except* the common + * client/extension definitions in xtrapdi.h. Namely, *no* extension- + * only information or client/extension information can be found here. + */ +#ifdef SMT +#define NEED_EVENTS +#define NEED_REPLIES +#endif +#include "Xlib.h" +#include "Intrinsic.h" +#include "xtrapdi.h" +#include "bits.h" +#include "xemacros.h" + +typedef struct /* Callback structure */ +{ + void_function func; + BYTE *data; +} XETrapCB; + +/* Data structure for setting trap context */ +typedef struct +{ + CARD8 tc_flags[2L]; /* Toolkit-side specific flags */ + XETrapCfg v; /* XTrap configuration values */ + XETrapCB *req_cb; /* Pointer to Request Callbacks */ + XETrapCB *evt_cb; /* Pointer to Event Callbacks (starting at 2) */ + CARD32 last_time B32; /* Last (delta) timestamp */ +} XETCValues; + + /* bits 0 thru 6 are formerly "families" (now obsolete) */ +#define XETCDeltaTimes 7 +#define XETCTrapActive 8 + /* bits 9 thru 15 are reserved for future expansion */ + +/* Values bit masks (used when determining what's dirty */ +#define TCStatistics (1L<<0L) +#define TCRequests (1L<<1L) +#define TCEvents (1L<<2L) +#define TCMaxPacket (1L<<3L) +#define TCCmdKey (1L<<4L) +#define TCTimeStamps (1L<<5L) +#define TCWinXY (1L<<6L) +#define TCXInput (1L<<7L) +#define TCReqCBs (1L<<8L) +#define TCEvtCBs (1L<<9L) +#define TCCursor (1L<<10L) +#define TCColorReplies (1L<<11L) +#define TCGrabServer (1L<<12L) + +/* Trap Context structure for maintaining XTrap State for client */ +typedef struct _XETC +{ + struct _XETC *next; /* Ptr to next linked-listed TC */ + Display *dpy; /* Display ptr of current TC */ + INT32 eventBase /*B32*/; /* First event value */ + INT32 errorBase /*B32*/; /* First error value */ + INT32 extOpcode /*B32*/; /* Major opcode of the extension */ + BYTE *xbuff; /* Pointer to buffer for XLib Communications */ + CARD16 xmax_size /*B16*/; /* Max Size of a request */ + XExtData *ext_data; /* hook for extension to hang data */ + /* + * The following are initialized with the client-side version number + * However, when either a GetAvailable or GetVersion reply is received, + * these values are updated with the *oldest* version numbers. + */ + CARD16 release /*B16*/; /* The extension release number */ + CARD16 version /*B16*/; /* The xtrap extension version number */ + CARD16 revision /*B16*/; /* The xtrap extension revision number */ + CARD16 protocol /*B16*/; /* The xtrap extension protocol number */ + unsigned dirty /*B32*/; /* cache dirty bits */ + XETCValues values; /* shadow structure of values */ + Boolean (*eventFunc[XETrapNumberEvents])(); +} XETC; + +/* This is the representation we use in the library code for XLib transport */ +typedef struct { + int type; + unsigned long serial; + Bool synthetic; + Display *display; + int detail; + unsigned long idx; + unsigned char data[sz_EventData]; +} XETrapDataEvent; + +#endif /* __XTRAPLIB__ */ diff --git a/xie/docs/dec/xie23-src/include/xtraplibp.h b/xie/docs/dec/xie23-src/include/xtraplibp.h new file mode 100644 index 0000000..d2e7b57 --- /dev/null +++ b/xie/docs/dec/xie23-src/include/xtraplibp.h @@ -0,0 +1,192 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* +************************************************************************** +** DIGITAL EQUIPMENT CORPORATION ** +** CONFIDENTIAL ** +** NOT FOR MODIFICATION OR REDISTRIBUTION IN ANY MANNER WHATSOEVER ** +************************************************************************** +*/ +/* BuildSystemHeader added automatically */ +/* $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/include/xtraplibp.h,v 1.1.2.3 92/04/27 12:33:25 Leela_Obilichetti Exp $ */ + +#ifndef __XTRAPLIBP__ +#define __XTRAPLIBP__ + + +/***************************************************************************** +Copyright 1987, 1988, 1989, 1990, 1991 by Digital Equipment Corp., Maynard, MA + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*****************************************************************************/ +/* + * + * CONTRIBUTORS: + * + * Dick Annicchiarico + * Robert Chesler + * Dan Coutu + * Gene Durso + * Marc Evans + * Alan Jamison + * Mark Henry + * Ken Miller + * + * DESCRIPTION: + * This header file contains the function prototypes for client/toolkit + * routines sorted by module (globally defined routines *only*). + */ +#if (__STDC__ || defined vaxc) +#define FUNCTION_PROTOS +#endif +#ifdef FUNCTION_PROTOS +# define P(s) s +#else +# define P(s) () +#endif + +/* XETrapContext.c */ +XETC *XECreateTC P((Display *dpy , CARD32 valuemask , XETCValues *value )); +int XEChangeTC P((XETC *tc , CARD32 mask , XETCValues *values )); +void XEFreeTC P((XETC *tc )); +int XETrapSetMaxPacket P((XETC *tc , Bool set_flag , CARD16 size )); +int XETrapSetCommandKey P((XETC *tc , Bool set_flag , KeySym cmd_key , + Bool mod_flag )); +int XETrapSetTimestamps P((XETC *tc , Bool set_flag , Bool delta_flag )); +int XETrapSetWinXY P((XETC *tc , Bool set_flag )); +int XETrapSetCursor P((XETC *tc , Bool set_flag )); +int XETrapSetXInput P((XETC *tc , Bool set_flag )); +int XETrapSetColorReplies P((XETC *tc , Bool set_flag )); +int XETrapSetGrabServer P((XETC *tc , Bool set_flag )); +int XETrapSetStatistics P((XETC *tc , Bool set_flag )); +int XETrapSetRequests P((XETC *tc , Bool set_flag , ReqFlags requests )); +int XETrapSetEvents P((XETC *tc , Bool set_flag , EventFlags events )); +Bool XESetCmdGateState P((XETC *tc , CARD8 type, Bool *gate_closed , + CARD8 *next_key , Bool *key_ignore )); + +/* XETrapRequests.c */ +int XEFlushConfig P((XETC *tc )); +int XEResetRequest P((XETC *tc )); +int XEGetVersionRequest P((XETC *tc , XETrapGetVersRep *ret )); +int XEGetLastInpTimeRequest P((XETC *tc , XETrapGetLastInpTimeRep *ret )); +int XEGetAvailableRequest P((XETC *tc , XETrapGetAvailRep *ret )); +int XEStartTrapRequest P((XETC *tc )); +int XEStopTrapRequest P((XETC *tc )); +int XESimulateXEventRequest P((XETC *tc , CARD8 type , CARD8 detail , + CARD16 x , CARD16 y , CARD8 screen )); +int XEGetCurrentRequest P((XETC *tc , XETrapGetCurRep *ret )); +int XEGetStatisticsRequest P((XETC *tc , XETrapGetStatsRep *ret )); + +/* XECallbacks.c */ +int XEAddRequestCB P((XETC *tc , CARD8 req , void_function func , BYTE *data )); +int XEAddRequestCBs P((XETC *tc , ReqFlags req_flags , void_function func , + BYTE *data )); +int XEAddEventCB P((XETC *tc , CARD8 evt , void_function func , BYTE *data )); +int XEAddEventCBs P((XETC *tc , EventFlags evt_flags , void_function func , + BYTE *data )); + +/* XETrapDispatch.c */ +void XETrapDispatchXLib P((XETrapDataEvent *event , XETC *tc)); + +/* XEWrappers.c */ +Boolean XETrapDispatchEvent P((XEvent *pevent , XETC *tc )); +XtInputMask XETrapAppPending P((XtAppContext app)); +void XETrapAppMainLoop P((XtAppContext app , XETC *tc )); +int XETrapAppWhileLoop P((XtAppContext app , XETC *tc , Bool *done )); +#ifdef X11R3 +Widget XtAppInitialize P((XtAppContext *app , String application_class , + XrmOptionDescRec *options , Cardinal num_options , Cardinal *argc_in_out , + String *argv_in_out , String *fallback_resources , + ArgList args_in , Cardinal num_args_in)); +#endif +int XETrapWaitForSomething P((XtAppContext app )); + +/* XEPrintInfo.c */ +void XEPrintRelease P((FILE *ofp , XETrapGetAvailRep *pavail )); +void XEPrintPlatform P((FILE *ofp , XETrapGetAvailRep *pavail )); +void XEPrintAvailFlags P((FILE *ofp , XETrapGetAvailRep *pavail )); +void XEPrintAvailPktSz P((FILE *ofp , XETrapGetAvailRep *pavail )); +void XEPrintStateFlags P((FILE *ofp , XETrapGetCurRep *pcur )); +void XEPrintMajOpcode P((FILE *ofp , XETrapGetAvailRep *pavail )); +void XEPrintCurXY P((FILE *ofp , XETrapGetAvailRep *pavail )); +void XEPrintTkFlags P((FILE *ofp , XETC *tc )); +void XEPrintLastTime P((FILE *ofp , XETC *tc )); +void XEPrintCfgFlags P((FILE *ofp , XETrapGetCurRep *pcur )); +void XEPrintRequests P((FILE *ofp , XETrapGetCurRep *pcur )); +void XEPrintEvents P((FILE *ofp , XETrapGetCurRep *pcur )); +void XEPrintCurPktSz P((FILE *ofp , XETrapGetCurRep *pcur )); +void XEPrintCmdKey P((FILE *ofp , XETrapGetCurRep *pcur )); +void XEPrintEvtStats P((FILE *ofp , XETrapGetStatsRep *pstats )); +void XEPrintReqStats P((FILE *ofp , XETrapGetStatsRep *pstats )); +void XEPrintAvail P((FILE *ofp , XETrapGetAvailRep *pavail )); +void XEPrintTkState P((FILE *ofp , XETC *tc )); +void XEPrintCurrent P((FILE *ofp , XETrapGetCurRep *pcur )); +void XEPrintStatistics P((FILE *ofp , XETrapGetStatsRep *pstats )); + +/* XEStringMapping.c */ +INT16 XEEventStringToID P((char *string )); +INT16 XERequestStringToID P((char *string )); +CARD32 XEPlatformStringToID P((char *string )); +char *XEEventIDToString P((CARD8 id )); +char *XERequestIDToExtString P((register CARD8 id )); +char *XERequestIDToString P((CARD8 id )); +char *XEPlatformIDToString P((CARD32 id )); + +/* getopt.c */ +int *XEgetopterr(); +int *XEgetoptind(); +int *XEgetoptopt(); +char **XEgetoptarg(); +int getopt P((int argc , char **argv , char *optstring )); + +/* sleep.c */ +void usleep P((unsigned long usecs )); + +/* XEKeybCtrl.c */ +int XEEnableCtrlKeys P((void (*rtn)() )); +int XEClearCtrlKeys P((void )); +int XEEnableCtrlC P((void (*rtn)() )); +int XEEnableCtrlY P((void (*rtn)() )); +int XEDeclExitHndlr P((void (*rtn)() )); + +#undef P + +#endif /* __XTRAPLIBP__ */ diff --git a/xie/docs/dec/xie23-src/include/xtrapproto.h b/xie/docs/dec/xie23-src/include/xtrapproto.h new file mode 100644 index 0000000..70b8bae --- /dev/null +++ b/xie/docs/dec/xie23-src/include/xtrapproto.h @@ -0,0 +1,210 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* +************************************************************************** +** DIGITAL EQUIPMENT CORPORATION ** +** CONFIDENTIAL ** +** NOT FOR MODIFICATION OR REDISTRIBUTION IN ANY MANNER WHATSOEVER ** +************************************************************************** +*/ +#ifndef __XTRAPPROTO__ +#define __XTRAPPROTO__ +/* RCSID = $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/include/xtrapproto.h,v 1.1.2.3 92/04/27 12:33:34 Leela_Obilichetti Exp $" */ + +/***************************************************************************** +Copyright 1987, 1988, 1989, 1990, 1991 by Digital Equipment Corp., Maynard, MA + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*****************************************************************************/ +/* + * + * CONTRIBUTORS: + * + * Dick Annicchiarico + * Robert Chesler + * Dan Coutu + * Gene Durso + * Marc Evans + * Alan Jamison + * Mark Henry + * Ken Miller + * + * DESCRIPTION: + * This header file contains the function prototypes for extension + * routines sorted by module (globally defined routines *only*). + */ +#if (__STDC__ || defined vaxc) +#define FUNCTION_PROTOS +#endif +#ifdef FUNCTION_PROTOS +# define P(s) s +#else +# define P(s) () +#endif +#ifndef Bool +# define Bool int +#endif +/* xtrapdi.c */ +void XETrapDestroyEnv P((pointer value , XID id )); +void XETrapCloseDown P((void )); +Bool XETrapRedirectDevices P((void )); +void DEC_XTRAPInit P((void )); +int XETrapCreateEnv P((ClientPtr client )); +int XETrapDispatch P((ClientPtr client )); +int sXETrapDispatch P((ClientPtr client )); +int XETrapReset P((xXTrapReq *request , ClientPtr client )); +int XETrapGetAvailable P((xXTrapGetReq *request , ClientPtr client )); +int XETrapGetCurrent P((xXTrapReq *request , ClientPtr client )); +int XETrapGetStatistics P((xXTrapReq *request , ClientPtr client )); +int XETrapConfig P((xXTrapConfigReq *request , ClientPtr client )); +int XETrapStartTrap P((xXTrapReq *request , ClientPtr client )); +int XETrapStopTrap P((xXTrapReq *request , ClientPtr client )); +int XETrapGetVersion P((xXTrapGetReq *request , ClientPtr client )); +int XETrapGetLastInpTime P((xXTrapReq *request , ClientPtr client )); +int XETrapRequestVector P((ClientPtr client )); +int XETrapKeyboard P((xEvent *x_event , DevicePtr keybd , int count )); +#ifndef VECTORED_EVENTS +int XETrapPointer P((xEvent *x_event , DevicePtr ptrdev , int count )); +#else +int XETrapEventVector P((ClientPtr client , xEvent *x_event )); +#endif +void XETrapStampAndMail P((xEvent *x_event )); +void sReplyXTrapDispatch P((ClientPtr client , int size , char *reply )); +int XETrapWriteXLib P((XETrapEnv *penv , BYTE *data , CARD32 nbytes )); + +/* xtrapddmi.c */ +void XETrapPlatformSetup P((void )); +int XETrapSimulateXEvent P((xXTrapInputReq *request , ClientPtr client )); + +/* /usr/users1/miller/golly/work/xtrap/xtrapdiswap.c */ +int sXETrapReset P((xXTrapReq *request , ClientPtr client )); +int sXETrapGetAvailable P((xXTrapGetReq *request , ClientPtr client )); +int sXETrapConfig P((xXTrapConfigReq *request , ClientPtr client )); +int sXETrapStartTrap P((xXTrapReq *request , ClientPtr client )); +int sXETrapStopTrap P((xXTrapReq *request , ClientPtr client )); +int sXETrapGetCurrent P((xXTrapReq *request , ClientPtr client )); +int sXETrapGetStatistics P((xXTrapReq *request , ClientPtr client )); +int sXETrapSimulateXEvent P((xXTrapInputReq *request , ClientPtr client )); +int sXETrapGetVersion P((xXTrapGetReq *request , ClientPtr client )); +int sXETrapGetLastInpTime P((xXTrapReq *request , ClientPtr client )); +void sReplyXETrapGetAvail P((ClientPtr client , int size , char *reply )); +void sReplyXETrapGetVers P((ClientPtr client , int size , char *reply )); +void sReplyXETrapGetLITim P((ClientPtr client , int size , char *reply )); +void sReplyXETrapGetCur P((ClientPtr client , int size , char *reply )); +void sReplyXETrapGetStats P((ClientPtr client , int size , char *reply )); +void sXETrapHeader P((XETrapHeader *hdr )); +void XETSwSimpleReq P((xReq *data )); +void XETSwResourceReq P((xResourceReq *data )); +void XETSwCreateWindow P((xCreateWindowReq *data )); +void XETSwChangeWindowAttributes P((xChangeWindowAttributesReq *data )); +void XETSwReparentWindow P((xReparentWindowReq *data )); +void XETSwConfigureWindow P((xConfigureWindowReq *data )); +void XETSwInternAtom P((xInternAtomReq *data )); +void XETSwChangeProperty P((xChangePropertyReq *data )); +void XETSwDeleteProperty P((xDeletePropertyReq *data )); +void XETSwGetProperty P((xGetPropertyReq *data )); +void XETSwSetSelectionOwner P((xSetSelectionOwnerReq *data )); +void XETSwConvertSelection P((xConvertSelectionReq *data )); +void XETSwSendEvent P((xSendEventReq *data )); +void XETSwGrabPointer P((xGrabPointerReq *data )); +void XETSwGrabButton P((xGrabButtonReq *data )); +void XETSwUngrabButton P((xUngrabButtonReq *data )); +void XETSwChangeActivePointerGrab P((xChangeActivePointerGrabReq *data )); +void XETSwGrabKeyboard P((xGrabKeyboardReq *data )); +void XETSwGrabKey P((xGrabKeyReq *data )); +void XETSwUngrabKey P((xUngrabKeyReq *data )); +void XETSwGetMotionEvents P((xGetMotionEventsReq *data )); +void XETSwTranslateCoords P((xTranslateCoordsReq *data )); +void XETSwWarpPointer P((xWarpPointerReq *data )); +void XETSwSetInputFocus P((xSetInputFocusReq *data )); +void XETSwOpenFont P((xOpenFontReq *data )); +void XETSwListFonts P((xListFontsReq *data )); +void XETSwListFontsWithInfo P((xListFontsWithInfoReq *data )); +void XETSwSetFontPath P((xSetFontPathReq *data )); +void XETSwCreatePixmap P((xCreatePixmapReq *data )); +void XETSwCreateGC P((xCreateGCReq *data )); +void XETSwChangeGC P((xChangeGCReq *data )); +void XETSwCopyGC P((xCopyGCReq *data )); +void XETSwSetDashes P((xSetDashesReq *data )); +void XETSwSetClipRectangles P((xSetClipRectanglesReq *data )); +void XETSwClearToBackground P((xClearAreaReq *data )); +void XETSwCopyArea P((xCopyAreaReq *data )); +void XETSwCopyPlane P((xCopyPlaneReq *data )); +void XETSwPoly P((xPolyPointReq *data )); +void XETSwFillPoly P((xFillPolyReq *data )); +void XETSwPutImage P((xPutImageReq *data )); +void XETSwGetImage P((xGetImageReq *data )); +void XETSwPolyText P((xPolyTextReq *data )); +void XETSwImageText P((xImageTextReq *data )); +void XETSwCreateColormap P((xCreateColormapReq *data )); +void XETSwCopyColormapAndFree P((xCopyColormapAndFreeReq *data )); +void XETSwAllocColor P((xAllocColorReq *data )); +void XETSwAllocNamedColor P((xAllocNamedColorReq *data )); +void XETSwAllocColorCells P((xAllocColorCellsReq *data )); +void XETSwAllocColorPlanes P((xAllocColorPlanesReq *data )); +void XETSwFreeColors P((xFreeColorsReq *data )); +void XETSwStoreColors P((xStoreColorsReq *data )); +void XETSwStoreNamedColor P((xStoreNamedColorReq *data )); +void XETSwQueryColors P((xQueryColorsReq *data )); +void XETSwLookupColor P((xLookupColorReq *data )); +void XETSwCreateCursor P((xCreateCursorReq *data )); +void XETSwCreateGlyphCursor P((xCreateGlyphCursorReq *data )); +void XETSwRecolorCursor P((xRecolorCursorReq *data )); +void XETSwQueryBestSize P((xQueryBestSizeReq *data )); +void XETSwQueryExtension P((xQueryExtensionReq *data )); +void XETSwChangeKeyboardMapping P((xChangeKeyboardMappingReq *data )); +void XETSwChangeKeyboardControl P((xChangeKeyboardControlReq *data )); +void XETSwChangePointerControl P((xChangePointerControlReq *data )); +void XETSwSetScreenSaver P((xSetScreenSaverReq *data )); +void XETSwChangeHosts P((xChangeHostsReq *data )); +void XETSwRotateProperties P((xRotatePropertiesReq *data )); +void XETSwNoOperation P((xReq *data )); +#ifdef vms +void SwapLongs P((long *list , unsigned long count )); +void SwapShorts P((short *list , unsigned long count )); +int SwapColorItem P((xColorItem *pItem )); +#endif /* vms */ +void NotImplemented P((void )); +int ProcBadRequest P((ClientPtr client )); + +#undef P + +#endif /* __XTRAPPROTO__ */ diff --git a/xie/docs/dec/xie23-src/lib/xie/Imakefile b/xie/docs/dec/xie23-src/lib/xie/Imakefile new file mode 100644 index 0000000..335d7fc --- /dev/null +++ b/xie/docs/dec/xie23-src/lib/xie/Imakefile @@ -0,0 +1,132 @@ +/* + * @DEC_FREE_COPYRIGHT@ + */ +/* + * HISTORY + * $Log: Imakefile,v $ + * Revision 1.1.2.5 93/01/22 15:34:22 Dave_Hill + * changes to match the new osfLib.rules + * [93/01/21 13:54:46 Dave_Hill] + * + * Revision 1.1.2.4 92/09/15 16:34:16 Dave_Hill + * changing debug lib install rules + * [92/09/15 14:59:05 Dave_Hill] + * + * Revision 1.1.2.3 92/08/16 17:17:07 Dave_Hill + * changes to support profiled & debugged libs + * + * removed obsolete build rules that upset debugged build + * Revision 1.1.2.2 92/08/06 13:57:27 Dave_Hill + * changing shared rules to match Alpha/OSF1 conventions + * [92/08/06 13:56:54 Dave_Hill] + * + * Revision 1.1.2.1 92/07/17 16:44:42 devrcs + * Initial load into Alpha pool + * + * Revision 1.1 90/01/01 00:00:00 devrcs + * *** Initial Trunk Revision *** + * Revision 1.2.2.6 92/04/13 18:16:02 Scott_Sewall + * Fixed EXTRA_LIBRARIES; added -none, -hidden and -L$(OSFLIBDIR) + * [92/04/13 18:15:26 Scott_Sewall] + * + * Revision 1.2.2.5 92/04/06 08:26:20 Gary_Grebus + * Add target for XIE shareable library. + * [92/03/31 08:12:23 Gary_Grebus] + * + * Revision 1.2.2.3 92/02/28 12:54:18 Scott_Sewall + * Added #include + * [92/02/27 19:42:45 Scott_Sewall] + * + * Revision 1.2.2.2 92/02/18 15:50:03 David_Berg + * "Added -DDEC so Xfree, UnlockDisplay & LockDisplay are defined" + * + * Revision 1.2.1.2 92/02/18 15:49:19 David_Berg + * Added -DDEC so Xfree, UnlockDisplay & LockDisplay are defined + * + * Revision 1.2 91/12/30 12:48:20 devbld + * Initial load of project + * + * $EndLog$ + */ +# BuildSystemHeader added automatically +/**/# $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/lib/xie/Imakefile,v 1.1.2.5 93/01/22 15:34:22 Dave_Hill Exp $ + +#define DoNormalLib NormalLibXinput +#define DoSharedLib SharedLibXinput +#define DoDebugLib DebugLibXinput +#define DoProfileLib ProfileLibXinput + +#include + +#define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' + STD_DEFINES = LibraryDefines ExtensionDefines -DCLIENT -DDEC + INCLUDES = -I. -I$(TOP) -I$(INCLUDESRC) -I$(XLIBSRC) -I../../include + + SRCS = XieLibEvents.c \ + XieLibImage.c \ + XieLibProcess.c \ + XieLibResource.c \ + XieLibSession.c \ + XieLibTransport.c \ + XieLibUtils.c \ + XieLibint.h \ + XieConvert.c \ + XieFloat.c + + OBJS = XieLibEvents.o \ + XieLibImage.o \ + XieLibProcess.o \ + XieLibResource.o \ + XieLibSession.o \ + XieLibTransport.o \ + XieLibUtils.o \ + XieConvert.o \ + XieFloat.o + + LOBJS = XieLibEvents.ln \ + XieLibImage.ln \ + XieLibProcess.ln \ + XieLibResource.ln \ + XieLibSession.ln \ + XieLibTransport.ln \ + XieLibUtils.ln \ + XieConvert.ln \ + XieFloat.ln + + LINTLIBS = $(LINTXLIB) + +#if DoSharedLib + SO_REQLIBS = -L$(XLIBSRC) -lX11 -lc -lm +#if DoNormalLib +SharedLibraryTarget(Xie,$(SOXEXTREV),$(OBJS),shared,..) +#else +SharedLibraryTarget(Xie,$(SOXEXTREV),$(OBJS),.,.) +#endif +InstallSharedLibrary(Xie,$(SOXEXTREV),$(USRSHLIBDIR)) +#endif +#if DoNormalLib +NormalLibraryTarget(Xie,$(OBJS)) +InstallLibrary(Xie,$(USRLIBDIR)) +#endif + +LintLibraryTarget(Xie,$(SRCS)) +InstallLintLibrary(Xie,$(LINTLIBDIR)) + +#if ProfileLibXinput +ProfiledLibraryTarget(Xie,$(OBJS)) +InstallLibrary(Xie_p,$(USRLIBDIR)) +#endif + +#if DebugLibXinput +DebuggedLibraryTarget(Xie,$(OBJS)) +#if InstallStaticDebugLibraries +InstallLibrary(Xext_d,$(DEBUGUSRLIBDIR)) +#endif +#if DoSharedLib && InstallSharedDebugLibraries +InstallNonExecFile(debugger/libXext.so,$(DEBUGUSRLIBDIR)) +#endif +#endif + +DependTarget() + +NormalLintTarget($(SRCS)) diff --git a/xie/docs/dec/xie23-src/lib/xie/XieConvert.c b/xie/docs/dec/xie23-src/lib/xie/XieConvert.c new file mode 100644 index 0000000..8f25e6f --- /dev/null +++ b/xie/docs/dec/xie23-src/lib/xie/XieConvert.c @@ -0,0 +1,3916 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains all image data type and organization conversion +** routines. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** John Weber +** Rich Hennessy - Add 16 bit support(10/91) +** +** CREATION DATE: +** +** May 15, 1989 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ + +/* +** Definition to let include files know who's calling. +*/ +#define _SmiConvert + +/* +** Include files +*/ +#include +#include +#include /* XIE device dependant definitions */ +#include + +#ifdef CLIENT +/* +** When this module is built for use on the client side, redirect the +** references which would go through the DDX dispatch table. +*/ +#include + +#undef DdxConvert_ +#define DdxConvert_ SmiConvert +#undef DdxCopy_ +#define DdxCopy_ SmiCopy +#undef DdxConvertCpp_ +#define DdxConvertCpp_ SmiConvertCpp +#undef DdxGetTyp_ +#define DdxGetTyp_ SmiGetTyp +#undef DdxMallocBits_ +#define DdxMallocBits_ XieMallocBits +#endif + + +/* +** Table of contents +*/ +int SmiConvert(); +int SmiCopy(); +int SmiConvertCpp(); +int SmiCopyCpp(); +int SmiGetTyp(); + +static int _CvtUnsOpr(); + +static int _CvtBsBs(); +static int _CvtBsByt(); +static int _CvtBsFlt(); +static int _CvtBsWrd(); + +static int _CvtBytByt(); +static int _CvtBytBs(); +static int _CvtBytFlt(); +static int _CvtBytWrd(); + +static int _CvtFltFlt(); +static int _CvtFltBs(); +static int _CvtFltByt(); +static int _CvtFltWrd(); + +static int _CvtWrdWrd(); +static int _CvtWrdBs(); +static int _CvtWrdByt(); +static int _CvtWrdFlt(); + +static int _CvtBsBsCpp(); +static int _CvtBsBytCpp(); +static int _CvtBsFltCpp(); +static int _CvtBsWrdCpp(); + +static int _CvtBytBytCpp(); +static int _CvtBytBsCpp(); +static int _CvtBytFltCpp(); +static int _CvtBytWrdCpp(); + +static int _CvtFltFltCpp(); +static int _CvtFltBsCpp(); +static int _CvtFltBytCpp(); +static int _CvtFltWrdCpp(); + +static int _CvtWrdWrdCpp(); +static int _CvtWrdBsCpp(); +static int _CvtWrdBytCpp(); +static int _CvtWrdFltCpp(); + + +static int _ConHCBs(); +static int _ConHCByt(); +static int _ConHCWrd(); + +static int _ConCSBs(); +static int _ConCSByt(); +static int _ConCSWrd(); + +static int _ConHSBs(); +static int _ConHSByt(); +static int _ConHSWrd(); + + +/* +** MACRO definitions +*/ +#define Min_(a,b) ((a) <= (b) ? (a) : (b)) +#define Max_(a,b) ((a) > (b) ? (a) : (b)) + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* +** Local Storage +*/ + + /* + ** This table describes functions to be called when converting from one + ** descriptor type to another. + ** The table's indecis are from XieDDX.h, UdpRec data types constants. + */ +static int (*conversion_table[XieK_DATA_TYPE_COUNT][XieK_DATA_TYPE_COUNT])()={ + {_CvtBsBs, _CvtBsBs, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtBsByt, _CvtBsFlt, _CvtBsWrd}, + {_CvtBsBs, _CvtBsBs, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtBsByt, _CvtBsFlt, _CvtBsWrd}, + {_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr}, + {_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr}, + {_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr}, + {_CvtBytBs, _CvtBytBs, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtBytByt,_CvtBytFlt,_CvtBytWrd}, + {_CvtFltBs, _CvtFltBs, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtFltByt,_CvtFltFlt,_CvtFltWrd}, + {_CvtWrdBs, _CvtWrdBs, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtWrdByt,_CvtWrdFlt,_CvtWrdWrd} +}; + + /* + ** This table is for conversions under the control of a CPP + */ +static int (*conversion_table_cpp[XieK_DATA_TYPE_COUNT][XieK_DATA_TYPE_COUNT])()={ + {_CvtBsBsCpp, _CvtBsBsCpp, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtBsBytCpp, _CvtBsFltCpp, _CvtBsWrdCpp}, + {_CvtBsBsCpp, _CvtBsBsCpp, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtBsBytCpp, _CvtBsFltCpp, _CvtBsWrdCpp}, + {_CvtUnsOpr, _CvtUnsOpr, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr, _CvtUnsOpr, _CvtUnsOpr}, + {_CvtUnsOpr, _CvtUnsOpr, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr, _CvtUnsOpr, _CvtUnsOpr}, + {_CvtUnsOpr, _CvtUnsOpr, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr, _CvtUnsOpr, _CvtUnsOpr}, + {_CvtBytBsCpp,_CvtBytBsCpp,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtBytBytCpp,_CvtBytFltCpp,_CvtBytWrdCpp}, + {_CvtFltBsCpp,_CvtFltBsCpp,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtFltBytCpp,_CvtFltFltCpp,_CvtFltWrdCpp}, + {_CvtWrdBsCpp,_CvtWrdBsCpp,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtWrdBytCpp,_CvtWrdFltCpp,_CvtWrdWrdCpp} +}; + + /* + ** This table describes the functions to be called when constraining data. + */ +static int (*constrain_table[5][XieK_DATA_TYPE_COUNT])()={ + {_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr}, + {_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr}, + {_ConHCBs, _ConHCBs, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_ConHCByt, _CvtUnsOpr,_ConHCWrd}, + {_ConCSBs, _ConCSBs, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_ConCSByt, _CvtUnsOpr,_ConCSWrd}, + {_ConHSBs, _ConHSBs, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_ConHSByt, _CvtUnsOpr,_ConHSWrd} +}; + +/***************************************************************************** +** SmiConvert +** +** FUNCTIONAL DESCRIPTION: +** +** This is the externally callable entry point for type conversion. The +** data specified by the source descriptor is reorganized to conform to +** the specification of the destination descriptor. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** mode - transfer mode, one of the following: +** XieK_MoveMode, move without constraining +** XieK_HardClip, constrain data via hard clip model +** XieK_ClipScale, constrain data via clip scale model +** XieK_HardScale, constrain data via hard scale model +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiConvert(src, dst, mode) +UdpPtr src; +UdpPtr dst; +int mode; +{ + int srctyp, dsttyp, status; + /* + ** Validate and get type of descriptors + */ + srctyp = DdxGetTyp_(src); + dsttyp = DdxGetTyp_(dst); + + if( srctyp >= XieK_DATA_TYPE_COUNT || dsttyp >= XieK_DATA_TYPE_COUNT ) + status = _CvtUnsOpr(src,dst); + + else if( mode == XieK_MoveMode ) + /* + ** Call specific conversion routine. + */ + status = (*conversion_table[srctyp][dsttyp])(src,dst); + + else if( srctyp != XieK_AF ) + status = _CvtUnsOpr(src,dst); + /* + ** The input data must be type float. Call conversion + ** routine based on the constraint model requested. + */ + else + status = (*constrain_table[mode][dsttyp])(src,dst); + + return( status ); +} /* end SmiConvert */ + +/***************************************************************************** +** SmiConvertCpp +** +** FUNCTIONAL DESCRIPTION: +** +** This is the same as SmiConvert, except that a CPP is used to +** select the input pixels to be copied. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** mode - transfer mode, one of the following: +** XieK_MoveMode, move without constraining +** cpp - cpp data descriptor +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiConvertCpp(src, dst, cpp, mode) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int mode; +{ + int srctyp, dsttyp, status; + /* + ** Validate and get type of descriptors + */ + srctyp = DdxGetTyp_(src); + dsttyp = DdxGetTyp_(dst); + + if( srctyp >= XieK_DATA_TYPE_COUNT || dsttyp >= XieK_DATA_TYPE_COUNT + || cpp == NULL || mode != XieK_MoveMode ) + status = _CvtUnsOpr(src,dst); + + else + status = (*conversion_table_cpp[srctyp][dsttyp])(src,dst,cpp); + + return( status ); +} /* end SmiConvertCpp */ + +/***************************************************************************** +** SmiCopy +** +** FUNCTIONAL DESCRIPTION: +** +** This is a jacket function over the CONVERT routine which provides a +** straight-forward interface for copying ROIs. +** +** The principle used is simple, but possibly hard to understand. This +** routine relies on the fact that the CONVERT code matches source and +** destination image coordinates during the move (i.e. source pixel (0,0) +** is moved to destination pixel (0,0). To accomplish the move of a source +** ROI, the source UDP is modified so that only the ROI data is described +** as image (all other data will be described as pad by careful use of +** POS, and STRIDE fields). The coordinates of the source are shifted so +** they match the desired destination coordinates. +** +** Simple...right? (no way) +** +** FORMAL PARAMETERS: +** +** srcudp - UDP to copy from +** dstudp - UDP to copy to +** src_x - Source X coordinate (X coordinate of upper left corner of +** source ROI). +** src_y - Source Y coordinate (Y coordinate of upper left corner of +** source ROI). +** dst_x - Destination X coordinate +** dst_y - Destination Y coordinate +** width - Width of ROI in pels +** height - Height of ROI in pels +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCopy( src, dst, srcx, srcy, dstx, dsty, width, height ) +UdpPtr src; +UdpPtr dst; +long int srcx; +long int srcy; +long int dstx; +long int dsty; +long int width; +long int height; +{ + UdpRec srcudp; + long int clipped_width; + long int clipped_height; + /* + ** Make a copy of the source UDP that we can modify. + */ + srcudp = *src; + /* + ** Modify the source UDP so that is describes only the ROI and reflects + ** where in the destination the data is to be copied. + */ + srcudp.UdpL_X1 = dstx; + srcudp.UdpL_Y1 = dsty; + + clipped_width = Min_(srcx + width -1, src->UdpL_X2) - srcx + 1; + clipped_height = Min_(srcy + height -1, src->UdpL_Y2) - srcy + 1; + + srcudp.UdpL_X2 = dstx + clipped_width - 1; + srcudp.UdpL_Y2 = dsty + clipped_height - 1; + + srcudp.UdpL_PxlPerScn = clipped_width; + srcudp.UdpL_ScnCnt = clipped_height; + + srcudp.UdpL_Pos += srcy * srcudp.UdpL_ScnStride + + srcx * srcudp.UdpL_PxlStride; + /* + ** Now, call the CONVERT routine to do the data movement. + */ + return( DdxConvert_( &srcudp, dst, XieK_MoveMode ) ); +} /* end SmiCopy */ + +/***************************************************************************** +** SmiCopyCpp +** +** FUNCTIONAL DESCRIPTION: +** +** This is the same as SmiCopy, except the pixels to be copied +** are selected by a CPP. +** +** FORMAL PARAMETERS: +** +** srcudp - UDP to copy from +** dstudp - UDP to copy to +** cpp - UDP for the CPP +** src_x - Source X coordinate (X coordinate of upper left corner of +** source ROI). +** src_y - Source Y coordinate (Y coordinate of upper left corner of +** source ROI). +** dst_x - Destination X coordinate +** dst_y - Destination Y coordinate +** width - Width of ROI in pels +** height - Height of ROI in pels +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCopyCpp( src, dst, cpp, srcx, srcy, dstx, dsty, width, height ) +UdpPtr src; +UdpPtr dst; +long int srcx; +long int srcy; +long int dstx; +long int dsty; +long int width; +long int height; +{ + UdpRec srcudp; + long int clipped_width; + long int clipped_height; + /* + ** Make a copy of the source UDP that we can modify. + */ + srcudp = *src; + /* + ** Modify the source UDP so that is describes only the ROI and reflects + ** where in the destination the data is to be copied. + */ + srcudp.UdpL_X1 = dstx; + srcudp.UdpL_Y1 = dsty; + + clipped_width = Min_(srcx + width -1, src->UdpL_X2) - srcx + 1; + clipped_height = Min_(srcy + height -1, src->UdpL_Y2) - srcy + 1; + + srcudp.UdpL_X2 = dstx + clipped_width - 1; + srcudp.UdpL_Y2 = dsty + clipped_height - 1; + + srcudp.UdpL_PxlPerScn = clipped_width; + srcudp.UdpL_ScnCnt = clipped_height; + + srcudp.UdpL_Pos += srcy * srcudp.UdpL_ScnStride + + srcx * srcudp.UdpL_PxlStride; + /* + ** Now, call the CONVERT routine to do the data movement. + */ + return( DdxConvertCpp_( &srcudp, dst, cpp, XieK_MoveMode ) ); +} /* end SmiCopyCpp */ + +/***************************************************************************** +** SmiGetTyp +** +** FUNCTIONAL DESCRIPTION: +** +** Return constant which identifies a valid combination of descriptor +** class and data type. +** +** FORMAL PARAMETERS: +** +** desc - data descriptor to validate and classify +** +** FUNCTION VALUE: +** +** data type of descriptor +** +*****************************************************************************/ +int SmiGetTyp(desc) +UdpPtr desc; +{ + int type; + + switch (desc->UdpB_DType) + { + case UdpK_DTypeBU : + switch (desc->UdpB_Class) + { + case UdpK_ClassA: type = XieK_ABU; break; + case UdpK_ClassUBA: + case UdpK_ClassUBS: + default: type = XieK_DATA_TYPE_COUNT; break; + } break; + case UdpK_DTypeWU: + switch (desc->UdpB_Class) + { + case UdpK_ClassA: type = XieK_AWU; break; + case UdpK_ClassUBA: + case UdpK_ClassUBS: + default: type = XieK_DATA_TYPE_COUNT; break; + } break; + case UdpK_DTypeLU: + switch (desc->UdpB_Class) + { + case UdpK_ClassA: + case UdpK_ClassUBA: + case UdpK_ClassUBS: + default: type = XieK_DATA_TYPE_COUNT; break; + } break; + case UdpK_DTypeF: + switch (desc->UdpB_Class) + { + case UdpK_ClassA: type = XieK_AF; break; + case UdpK_ClassUBA: + case UdpK_ClassUBS: + default: type = XieK_DATA_TYPE_COUNT; break; + } break; + case UdpK_DTypeVU: + switch (desc->UdpB_Class) + { + case UdpK_ClassUBA: type = XieK_UBAVU; break; + case UdpK_ClassUBS: type = XieK_UBSVU; break; + case UdpK_ClassA: + default: type = XieK_DATA_TYPE_COUNT; break; + } break; + case UdpK_DTypeV: + switch (desc->UdpB_Class) + { + case UdpK_ClassUBA: type = XieK_UBAV; break; + case UdpK_ClassUBS: type = XieK_UBSV; break; + case UdpK_ClassA: + default: type = XieK_DATA_TYPE_COUNT; break; + } break; + default : type = XieK_DATA_TYPE_COUNT; break; + } + return( type ); +} /* end SmiGetTyp */ + +/***************************************************************************** +** SmiPosCl +** +** FUNCTIONAL DESCRIPTION: +** +** Return the UdpL_Pos value (i.e. offset in bits) which corresponds +** to the beginning of the specified scanline in a changelist Udp. +** +** This code assumes the specified scanline actually exists in the +** UDP. +** +** FORMAL PARAMETERS: +** +** base - data to position in +** inipos - initial offset into data +** scncnt - number of scanlines to position to +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiPosCl(base, inipos, scncnt) +unsigned int *base; +int inipos; +int scncnt; +{ + /* Not implemented */ + return( BadImplementation ); +} /* end SmiPosCl */ + +/***************************************************************************** +** _CvtUnsOpr +** +** FUNCTIONAL DESCRIPTION: +** +** This is an action routine called when conversion from source descriptor +** type to destination descriptor type is not supported. Simply signal an +** error at this point. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtUnsOpr(src, dst) +UdpPtr src; +UdpPtr dst; +{ + return( BadImplementation ); +} + +/***************************************************************************** +** _CvtBsBs +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit stream to bit stream encoding +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBsBs(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask, dst_mask, mask_24 = (1 << 24) - 1; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + int bits; + int value; + char *data, copy_line = src->UdpW_PixelLength == 1 + && dst->UdpW_PixelLength == 1 + && src->UdpL_PxlStride == 1 + && dst->UdpL_PxlStride == 1; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + /* + ** Copy until the destination is at a byte boundary. + */ + for( pixel = X1; pixel <= X2 && dst_offset & 7; pixel++ ) + { + value = GET_VALUE_(src->UdpA_Base, src_offset, src_mask); + PUT_VALUE_(dst->UdpA_Base, dst_offset, value, dst_mask); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + /* + ** If there is enough data, try for a higher performance copy. + */ + if( copy_line && X2 + 1 - pixel >= 24 ) + if( src_offset & 7 ) + /* + ** Src and dst aren't aligned, so move in 3 byte chunks. + */ + for( data = (char *)(dst->UdpA_Base+(dst_offset>>3)); + pixel <= X2 + 1 - 24; + src_offset += 24, + dst_offset += 24, + pixel += 24 ) + { + value = GET_VALUE_(src->UdpA_Base, src_offset, mask_24); +#ifdef BIGENDIAN + *data++ = *((unsigned char *)(&value)+3); + *data++ = *((unsigned char *)(&value)+2); + *data++ = *((unsigned char *)(&value)+1); +#else + *data++ = *((unsigned char *)(&value)); + *data++ = *((unsigned char *)(&value)+1); + *data++ = *((unsigned char *)(&value)+2); +#endif + } + else + /* + ** Src and dst are aligned, so we can use the fast byte mover. + */ + { + bits = X2 + 1 - pixel & ~7; + memcpy( dst->UdpA_Base + (dst_offset >> 3), + src->UdpA_Base + (src_offset >> 3), bits >> 3 ); + src_offset += bits; + dst_offset += bits; + pixel += bits; + } + /* + ** Copy the remainder. + */ + while( pixel <= X2 ) + { + value = GET_VALUE_(src->UdpA_Base, src_offset, src_mask); + PUT_VALUE_(dst->UdpA_Base, dst_offset, value, dst_mask); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + pixel++; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBsByt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit string to byte array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBsByt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + *((unsigned char *)(dst->UdpA_Base + dst_offset / 8)) = + GET_VALUE_(src->UdpA_Base,src_offset,src_mask); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBsFlt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit string to float +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBsFlt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + *((float *)(dst->UdpA_Base + dst_offset / 8)) = + (float)GET_VALUE_(src->UdpA_Base,src_offset,src_mask); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBsWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit string to word array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBsWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + GET_VALUE_(src->UdpA_Base,src_offset,src_mask); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBytByt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to byte array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBytByt( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + char copy_line = src->UdpW_PixelLength == dst->UdpW_PixelLength + && src->UdpW_PixelLength == src->UdpL_PxlStride + && dst->UdpW_PixelLength == dst->UdpL_PxlStride + && src->UdpL_PxlStride == dst->UdpL_PxlStride; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + if( copy_line ) + memcpy( dst->UdpA_Base + (dst_offset >> 3), + src->UdpA_Base + (src_offset >> 3), X2 - X1 + 1 ); + else + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((unsigned char *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned char *)(src->UdpA_Base + (src_offset >> 3))); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBytBs +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to bit string +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBytBs(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + PUT_VALUE_(dst->UdpA_Base,dst_offset, + *((unsigned char *)(src->UdpA_Base + src_offset / 8)),dst_mask); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + + +/***************************************************************************** +** _CvtBytFlt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to floating point +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBytFlt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + *((float *)(dst->UdpA_Base + dst_offset / 8)) = + (float)*((unsigned char *)(src->UdpA_Base + src_offset / 8)); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + + +/***************************************************************************** +** _CvtBytWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to word array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBytWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((unsigned short *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned char *)(src->UdpA_Base + (src_offset >> 3))); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltFlt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to floating array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtFltFlt( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + char copy_line = src->UdpW_PixelLength == dst->UdpW_PixelLength + && src->UdpW_PixelLength == src->UdpL_PxlStride + && dst->UdpW_PixelLength == dst->UdpL_PxlStride + && src->UdpL_PxlStride == dst->UdpL_PxlStride; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + if( copy_line ) + memcpy( dst->UdpA_Base + (dst_offset >> 3), + src->UdpA_Base + (src_offset >> 3), + (X2 + 1 - X1) * sizeof(float) ); + else + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((float *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((float *)(src->UdpA_Base + (src_offset >> 3))); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltBs +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to bit string +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtFltBs(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + int value; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + + value = *((float *)(src->UdpA_Base + src_offset / 8)) + 0.5; + + PUT_VALUE_(dst->UdpA_Base,dst_offset,value,dst_mask); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltByt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to byte array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtFltByt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + *((unsigned char *)(dst->UdpA_Base + dst_offset / 8)) = + *((float *)(src->UdpA_Base + src_offset / 8)) + 0.5; + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + + +/***************************************************************************** +** _CvtFltWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to word array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtFltWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + *((float *)(src->UdpA_Base + src_offset / 8)) + 0.5; + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/* N O W A L L T H E "W O R D" F U N C T I O N */ + +/***************************************************************************** +** _CvtWrdWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to word array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtWrdWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + char copy_line = src->UdpW_PixelLength == dst->UdpW_PixelLength + && src->UdpW_PixelLength == src->UdpL_PxlStride + && dst->UdpW_PixelLength == dst->UdpL_PxlStride + && src->UdpL_PxlStride == dst->UdpL_PxlStride; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + if( copy_line ) + memcpy( dst->UdpA_Base + (dst_offset >> 3), + src->UdpA_Base + (src_offset >> 3), X2 - X1 + 1 << 1 ); + else + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((unsigned short *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned short *)(src->UdpA_Base + (src_offset >> 3))); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdBs +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to bit string +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtWrdBs( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + PUT_VALUE_( dst->UdpA_Base,dst_offset, + *((unsigned short *)(src->UdpA_Base + src_offset / 8)), + dst_mask ); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdByt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to byte array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtWrdByt( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((unsigned char *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned short *)(src->UdpA_Base + (src_offset >> 3))); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdFlt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to floating point +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtWrdFlt( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + *((float *)(dst->UdpA_Base + dst_offset / 8)) = + (float)*((unsigned short *)(src->UdpA_Base + src_offset / 8)); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/* N O W A L L T H E "C O N S T R A I N T" F U N C T I O N S */ + +/***************************************************************************** +** _ConHCBs +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Hard Clip model from float to bit string: +** values < 0 ==> 0.0 +** values > ceiling ==> ceiling +** Round all values to nearest integer. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConHCBs(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + int value; + float ceiling; + float fvalue; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if (fvalue < 0.0) /* Clip */ + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + value = fvalue + 0.5; + PUT_VALUE_(dst->UdpA_Base,dst_offset,value,dst_mask); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConHCByt +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Hard Clip model from float to unsigned byte: +** values < 0 ==> 0.0 +** values > ceiling ==> ceiling +** Round all values to nearest integer. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConHCByt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + float ceiling; + float fvalue; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if (fvalue < 0.0) /* Clip */ + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + *((unsigned char *)(dst->UdpA_Base + dst_offset / 8)) = + fvalue + 0.5; + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConHCWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Hard Clip model from float to unsigned word: +** values < 0 ==> 0.0 +** values > ceiling ==> ceiling +** Round all values to nearest integer. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConHCWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + float ceiling; + float fvalue; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if (fvalue < 0.0) /* Clip */ + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + fvalue + 0.5; + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConCSBs +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Clip Scale model from float to bit string: +** values < 0 ==> 0.0 +** values > ceiling ==> ceiling +** Scale such that smallest value -> 0 +** largest value -> ceiling +** +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConCSBs(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + int value; + float ceiling; + float fvalue; + float fmax, fmin, foffset, fscale; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + ceiling = (float)(dst->UdpL_Levels - 1); + + /* Make a pass through the pixels to determine the range of the data */ + fmin = ceiling; + fmax = 0.0; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + /* Clip the data */ + if (fvalue < 0.0) + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + fmax = Max_(fmax,fvalue); + fmin = Min_(fmin,fvalue); + + src_offset += src->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + } + + /* Calculate the scale value and offset */ + foffset = fmin; + if ((fmax-fmin) != 0.0) + fscale = ceiling/(fmax-fmin); + else + fscale = 1.0; + + /* Scale and convert the data */ + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if (fvalue < 0.0) /* Clip */ + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + value = (fvalue - foffset) * fscale + 0.5; /* Scale */ + PUT_VALUE_(dst->UdpA_Base,dst_offset,value,dst_mask); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConCSByt +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Clip Scale model from float to byte array: +** values < 0 ==> 0.0 +** values > ceiling ==> ceiling +** Scale such that smallest value -> 0 +** largest value -> ceiling +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConCSByt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + float ceiling; + float fvalue; + float fmax, fmin, foffset, fscale; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + +/* +** Make a pass through the pixels to determine the range of the data +*/ + fmin = ceiling; + fmax = 0.0; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if (fvalue < 0.0) /* Clip */ + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + fmax = Max_(fmax,fvalue); + fmin = Min_(fmin,fvalue); + + src_offset += src->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + } + +/* +** Calculate the scale value and offset +*/ + foffset = fmin; + if ((fmax-fmin) != 0.0) + fscale = ceiling/(fmax-fmin); + else + fscale = 1.0; + +/* +** Scale and convert the data +*/ + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if (fvalue < 0.0) /* Clip */ + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + *((unsigned char *)(dst->UdpA_Base + dst_offset / 8)) = + (fvalue - foffset) * fscale + 0.5; /* Scale */ + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConCSWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Clip Scale model from float to word array: +** values < 0 ==> 0.0 +** values > ceiling ==> ceiling +** Scale such that smallest value -> 0 +** largest value -> ceiling +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConCSWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + float ceiling; + float fvalue; + float fmax, fmin, foffset, fscale; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + +/* +** Make a pass through the pixels to determine the range of the data +*/ + fmin = ceiling; + fmax = 0.0; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if (fvalue < 0.0) /* Clip */ + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + fmax = Max_(fmax,fvalue); + fmin = Min_(fmin,fvalue); + + src_offset += src->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + } + +/* +** Calculate the scale value and offset +*/ + foffset = fmin; + if ((fmax-fmin) != 0.0) + fscale = ceiling/(fmax-fmin); + else + fscale = 1.0; + +/* +** Scale and convert the data +*/ + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if (fvalue < 0.0) /* Clip */ + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + (fvalue - foffset) * fscale + 0.5; /* Scale */ + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConHSBs +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Hard Scale model from float to bit string: +** Scale such that smallest value -> 0 +** largest value -> ceiling +** +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConHSBs(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + int value; + float ceiling; + float fvalue; + float fmax, fmin, foffset, fscale; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + ceiling = (float)(dst->UdpL_Levels - 1); + + /* Make a pass through the pixels to determine the range of the data */ + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + + fmin = *((float *)(src->UdpA_Base + (src_scan_offset + + (X1-src->UdpL_X1) * src->UdpL_PxlStride)/ 8)); + fmax = fmin; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + fmax = Max_(fmax,fvalue); + fmin = Min_(fmin,fvalue); + + src_offset += src->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + } + + /* Calculate the scale value and offset */ + foffset = fmin; + if ((fmax-fmin) != 0.0) + fscale = ceiling/(fmax-fmin); + else + fscale = 1.0; + + + /* Scale and convert the data */ + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + value = (fvalue - foffset) * fscale + 0.5; /* Scale */ + PUT_VALUE_(dst->UdpA_Base,dst_offset,value,dst_mask); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConHSByt +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Hard Scale model from float to byte array: +** Scale such that smallest value -> 0 +** largest value -> ceiling +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConHSByt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + float ceiling; + float fvalue; + float fmax, fmin, foffset, fscale; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + + /* Make a pass through the pixels to determine the range of the data */ + fmin = *((float *)(src->UdpA_Base + (src_scan_offset + + (X1-src->UdpL_X1) * src->UdpL_PxlStride)/ 8)); + fmax = fmin; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + fmax = Max_(fmax,fvalue); + fmin = Min_(fmin,fvalue); + + src_offset += src->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + } + + /* Calculate the scale value and offset */ + foffset = fmin; + if ((fmax-fmin) != 0.0) + fscale = ceiling/(fmax-fmin); + else + fscale = 1.0; + + /* Scale and convert the data */ + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + *((unsigned char *)(dst->UdpA_Base + dst_offset / 8)) = + (fvalue - foffset) * fscale + 0.5; /* Scale */ + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConHSWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Hard Scale model from float to word array: +** Scale such that smallest value -> 0 +** largest value -> ceiling +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConHSWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + float ceiling; + float fvalue; + float fmax, fmin, foffset, fscale; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + +/* +** Make a pass through the pixels to determine the range of the data +*/ + fmin = *((float *)(src->UdpA_Base + (src_scan_offset + + (X1-src->UdpL_X1) * src->UdpL_PxlStride)/ 8)); + fmax = fmin; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + fmax = Max_(fmax,fvalue); + fmin = Min_(fmin,fvalue); + + src_offset += src->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + } + +/* +** Calculate the scale value and offset +*/ + foffset = fmin; + if ((fmax-fmin) != 0.0) + fscale = ceiling/(fmax-fmin); + else + fscale = 1.0; + +/* +** Scale and convert the data +*/ + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + (fvalue - foffset) * fscale + 0.5; /* Scale */ + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/* N O W "C P P V E R S I O N S" O F T H E B A S E C O N V E R S I O N S */ + +/***************************************************************************** +** _CvtBsBsCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit stream to bit stream encoding with CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtBsBsCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask, dst_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; + int bits; + int value; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + /* + ** Copy the bits. + */ + for( pixel = X1; pixel <= X2; pixel++ ) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + value = GET_VALUE_(src->UdpA_Base, src_offset, src_mask); + PUT_VALUE_(dst->UdpA_Base, dst_offset, value, dst_mask); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBsBytCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit string to byte array using cpp +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtBsBytCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned char *)(dst->UdpA_Base + dst_offset / 8)) = + GET_VALUE_(src->UdpA_Base,src_offset,src_mask); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBsFltCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit string to float using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtBsFltCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((float *)(dst->UdpA_Base + dst_offset / 8)) = + (float)GET_VALUE_(src->UdpA_Base,src_offset,src_mask); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBsWrdCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit string to word array using cpp +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtBsWrdCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + GET_VALUE_(src->UdpA_Base,src_offset,src_mask); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBytBytCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to byte array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBytBytCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned char *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned char *)(src->UdpA_Base + (src_offset >> 3))); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBytBsCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to bit string using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtBytBsCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + PUT_VALUE_(dst->UdpA_Base,dst_offset, + *((unsigned char *)(src->UdpA_Base + + src_offset / 8)),dst_mask); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBytFltCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to floating point using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBytFltCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((float *)(dst->UdpA_Base + dst_offset / 8)) = + (float)*((unsigned char *)(src->UdpA_Base + + src_offset / 8)); + } + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBytWrdCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to word array using a cpp +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp descriptor +** +*****************************************************************************/ +static int _CvtBytWrdCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned short *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned char *)(src->UdpA_Base + (src_offset >> 3))); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltFltCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to floating array using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtFltFltCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((float *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((float *)(src->UdpA_Base + (src_offset >> 3))); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltBsCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to bit string using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtFltBsCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; + int value; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + value = *((float *)(src->UdpA_Base + + src_offset / 8)) + 0.5; + PUT_VALUE_(dst->UdpA_Base,dst_offset,value,dst_mask); + } + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltBytCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to byte array using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtFltBytCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned char *)(dst->UdpA_Base + dst_offset / 8)) = + *((float *)(src->UdpA_Base + src_offset /8)) + 0.5; + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltWrdCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to word array using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtFltWrdCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + *((float *)(src->UdpA_Base + src_offset /8)) + 0.5; + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdWrdCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to word array using a cpp +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp descriptor +** +*****************************************************************************/ +static int _CvtWrdWrdCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } + +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned short *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned short *)(src->UdpA_Base + (src_offset >> 3))); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdBsCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to bit string using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtWrdBsCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } + +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + PUT_VALUE_(dst->UdpA_Base,dst_offset, + *((unsigned short *)(src->UdpA_Base + + src_offset / 8)),dst_mask); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdBytCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to byte array using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp = CPP descriptor +** +*****************************************************************************/ +static int _CvtWrdBytCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned char *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned short *)(src->UdpA_Base + (src_offset >> 3))); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdFltCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to floating point using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtWrdFltCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } + +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((float *)(dst->UdpA_Base + dst_offset / 8)) = + (float)*((unsigned short *)(src->UdpA_Base + + src_offset / 8)); + } + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} +/* end Module SmiConvert */ diff --git a/xie/docs/dec/xie23-src/lib/xie/XieFloat.c b/xie/docs/dec/xie23-src/lib/xie/XieFloat.c new file mode 100644 index 0000000..4955663 --- /dev/null +++ b/xie/docs/dec/xie23-src/lib/xie/XieFloat.c @@ -0,0 +1,195 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module provides a machine independant mechanism for transporting +** floating point numbers using the X11 Image Extension protocol. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHORS: +** +** Robert NC Shelley +** +** +** CREATION DATE: 25-Aug-1989 +** +*******************************************************************************/ + +/* +** INCLUDE FILES +**/ +#ifndef VXT +#include +#else +#include +#endif +#include /* XIE device dependant definitions */ + +/* +** Table of Contents +*/ +void MiEncodeDouble(); +double MiDecodeDouble(); + + + +/* +** Macro definitions +*/ + /* + ** To convert the mantissa of a 'double' (always < 1.0) to/from the + ** 'XieFloatRec.mantissa' we multiply/divide by this factor + ** ( 2^n, where n is the size in bits of 'XieFloatRec.mantissa' less 1). + ** On the wire the mantissa is shifted left one place for compatibililty + ** with previous protocol versions. + */ +#define Convert_Mantissa_(xiefloatptr) \ + pow(2.0, 8.0*sizeof(xiefloatptr->mantissa)-1.0) + +/* +** External routines +*/ + +/* +** Equated symbols +*/ + +/* +** External symbol definitions. +*/ + +/***************************************************************************** +** MiEncodeDouble +** +** FUNCTIONAL DESCRIPTION: +** +** Encode a double value as XieFloat format. +** +** FORMAL PARAMETERS: +** +** ptr - pointer to XieFloatRec +** value - double value to be encoded +** +*****************************************************************************/ +void MiEncodeDouble( ptr, value ) + XieFloat ptr; + double value; +{ + double mantissa; + int exponent; + + /* + ** Separate out the mantissa and exponent. + */ + mantissa = frexp(value, &exponent); + + /* + ** Encode the mantissa in XieFloat format. + */ + ptr->m_sign = (unsigned char) (mantissa >= 0.0); + ptr->mantissa = (unsigned long) (Convert_Mantissa_(ptr) + * (ptr->m_sign ? mantissa : -mantissa) + 0.5); + + /* + ** Check/correct for overflow on round-up. + */ + if( (int)(ptr->mantissa) < 0 ) + { + exponent++; + ptr->mantissa = (unsigned long) Convert_Mantissa_(ptr); + } + else + ptr->mantissa <<= 1; + + /* + ** Encode the exponent in XieFloat format. + */ + ptr->e_sign = (unsigned char) (exponent >= 0); + ptr->exponent = (unsigned short) (ptr->e_sign ? exponent : -exponent); +} + +/***************************************************************************** +** MiDecodeDouble +** +** FUNCTIONAL DESCRIPTION: +** +** Decode a double value from XieFloat format. +** +** FORMAL PARAMETERS: +** +** ptr - pointer to XieFloatRec +** +** FUNCTION VALUE: +** +** decoded double value +** +*****************************************************************************/ +double MiDecodeDouble( ptr ) + XieFloat ptr; +{ + /* + ** Reassemble the XieFloatRec into a double value. + */ + return( pow( 2.0, (ptr->e_sign ? 1.0 : -1.0) * ptr->exponent ) + * (ptr->m_sign ? 1.0 : -1.0) + * (ptr->mantissa >> 1) / Convert_Mantissa_(ptr) ); +} diff --git a/xie/docs/dec/xie23-src/lib/xie/XieLibEvents.c b/xie/docs/dec/xie23-src/lib/xie/XieLibEvents.c new file mode 100644 index 0000000..bb776c1 --- /dev/null +++ b/xie/docs/dec/xie23-src/lib/xie/XieLibEvents.c @@ -0,0 +1,242 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** X Image Extension (XIE) +** +** ABSTRACT: +** +** This module contains XIE library routines for EVENTS. +** +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Bernardo Tagariello +** +** CREATION DATE: +** +** March 23, 1990 +** +** MODIFICATION HISTORY: +** +*******************************************************************************/ + +/* +** Definitions required by X11 include files +*/ +#define NEED_EVENTS +#define NEED_REPLIES + +/* +** Definition to let include files know who's calling. +*/ +#define _XieLibEvents + +/* +** Include files +*/ + /* + ** Standard C include files + */ +#include + /* + ** X11 and XIE include files + */ +#ifdef VMS +#include /* X11 internal lib/transport defs */ +#else +#include /* X11 internal lib/transport defs */ +#endif +#include /* XIE Req/Reply protocol defs */ +#include /* XIE public definitions */ +#include /* XIE private definitions */ + +/* +** Table of contents +*/ +unsigned long XieQueryEvents(); +void XieSelectEvents(); + /* + ** Low level global entry points + */ +Bool _XieConvertEventProc(); + /* + ** internal routines + */ + +/* +** MACRO definitions +*/ + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* +** Local Storage +*/ + +/******************************************************************************* +** XieQueryEvents +** +** FUNCTIONAL DESCRIPTION: +** +** Retreives the event mask for Xie events enabled on the Xie server. +** +** FORMAL PARAMETERS: +** +** dpy - pointer to X11 display structure +** +** FUNCTION VALUE: +** +** value of current Xie events mask +** +*******************************************************************************/ +unsigned long XieQueryEvents(dpy) + Display *dpy; +{ + xieQueryEventsReply rep; + xieQueryEventsReq *req; + XieSessionPtr ses = _XieGetSession(dpy); + Status status; + + /* + ** Create request to query events + */ + XieReq_(dpy,0,SesOpCode_(ses),ieQueryEvents,req); + + status = _XReply( dpy, (xReply *) &rep, 0, True ); + + if( !status ) + _XieSrvError( dpy, req->opcode, 0, rep.sequenceNumber, + BadAccess, "QueryEvents" ); + else + XieReqDone_(dpy); + + return( rep.event_mask ); +} /* end XieQueryEvents */ + +/******************************************************************************* +** XieSelectEvents +** +** FUNCTIONAL DESCRIPTION: +** +** Sets the event mask to enabled specified Xie events on the Xie server. +** +** FORMAL PARAMETERS: +** +** dpy - pointer to X11 display structure +** event_mask - mask of events to enable +** +*******************************************************************************/ +void XieSelectEvents(dpy, event_mask) + Display *dpy; + unsigned long event_mask; +{ + Status status; + xieSelectEventsReq *req; + XieSessionPtr ses = _XieGetSession(dpy); + + /* + ** Create request to Select Events. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieSelectEvents,req); + req->event_mask = event_mask; + XieReqDone_(dpy); + +} /* end XieSelectEvents */ + +/******************************************************************************* +** _XieConvertEventProc +** +** FUNCTIONAL DESCRIPTION: +** +** Convert an event from wire format to client format. +** +** FORMAL PARAMETERS: +** +** dpy - X11 display pointer +** ce - pointer to client event structure to be filled in +** we - pointer to wire event structure to be converted +** +** FUNCTION VALUE: +** +** Boolean: true if event should be queued +** +*******************************************************************************/ +Bool _XieConvertEventProc(dpy, ce, we) + Display *dpy; + XEvent *ce; + xEvent *we; +{ + xieSendEvent *wireevent = (xieSendEvent *) we; + XieEventRec *clientevent = (XieEventRec *) ce; + + clientevent->type = wireevent->type & ~0x80; + clientevent->send_event =(wireevent->type & 0x80) == True; + clientevent->serial = wireevent->sequenceNumber; + clientevent->display = dpy; + clientevent->resource = XieFindResource(dpy, wireevent->resource_id); + + return( clientevent->resource != NULL ); +} /* end _XieConvertEventProc */ +/* end module XieLibEvents.c */ diff --git a/xie/docs/dec/xie23-src/lib/xie/XieLibImage.c b/xie/docs/dec/xie23-src/lib/xie/XieLibImage.c new file mode 100644 index 0000000..6cf2a0b --- /dev/null +++ b/xie/docs/dec/xie23-src/lib/xie/XieLibImage.c @@ -0,0 +1,708 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** X Image Extension (XIE) +** +** ABSTRACT: +** +** This module contains XieImage routines. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Robert NC Shelley +** +** CREATION DATE: +** +** April 17, 1989 +** +** MODIFICATION HISTORY: +** +*******************************************************************************/ + +/* +** Definitions required by X11 include files +*/ +#define NEED_EVENTS +#define NEED_REPLIES + +/* +** Definition to let include files know who's calling. +*/ +#define _XieLibImage + +/* +** Include files +*/ + /* + ** Standard C include files + */ +#include +#include + /* + ** X11 and XIE include files + */ +#ifdef VMS +#include /* X11 internal lib/transport defs */ +#else +#include /* X11 internal lib/transport defs */ +#endif +#include /* XIE client/server common defs */ +#include /* XIE Req/Reply protocol defs */ +#include /* XIE public definitions */ +#include /* XIE private definitions */ + +/* +** Table of contents +*/ + /* + ** PUBLIC entry points + */ +XieImage XieCopyImage(); /* Image from Image (optional data) */ +XieImage XieCreateImage(); /* Image from argumemts (no data) */ +XieImage XieFreeImage(); /* free Image resources */ +XieImage XieGetImage(); /* Image from Photo{any} (optional data) */ +unsigned char XieGetImageData();/* transport image data from Photo{any} */ +XiePhoto XiePutImage(); /* Photo{any} from Image (optional data) */ +unsigned char XiePutImageData();/* transport image data to Photo{flo|map} */ + /* + ** internal routines + */ +static void CreateXport(); /* create XieImage stream transport context */ + +/* +** Macro definitions +*/ + +/* +** Equated symbols +*/ + +/* +** Externals +*/ + +/* +** Local Storage +*/ + +/******************************************************************************* +** XieCopyImage +** +** FUNCTIONAL DESCRIPTION: +** +** Create an XieImage by copying an existing XieImage. +** +** FORMAL PARAMETERS: +** +** img - pointer to XieImageRec +** mode - what to do about image data: +** XieK_DataNone - no image buffers, no data copy +** XieK_DataAlloc - allocate new image buffers only, no data +** XieK_DataCopy - allocate new image buffers and copy data +** XieK_DataShare - copy pointers to image data (share) +** +** FUNCTION VALUE: +** +** XieImage - pointer to new XieImageRec +** +*******************************************************************************/ +XieImage XieCopyImage( img, mode ) + XieImage img; + unsigned char mode; +{ + CARD32 i; + + /* + ** Make a copy of the XieImageRec. + */ + XieImage copy = (XieImage) XieMalloc(sizeof(XieImageRec)); + *copy = *img; + OwnData_(copy) = False; + + /* + ** Make a copy of each existing UdpRec. + */ + for( i = 0; i < XieK_MaxPlanes; i++ ) + if( Plane_(img,i) != NULL ) + { + Plane_(copy,i) = (UdpPtr) XieMalloc(sizeof(UdpRec)); + *Plane_(copy,i) = *Plane_(img,i); + + switch( mode ) + { + case XieK_DataNone : + uBase_(copy,i) = NULL; + break; + + case XieK_DataAlloc : + OwnData_(copy) = True; + uBase_(copy,i) = XieCallocBits( uArSize_(copy,i) ); + break; + + case XieK_DataCopy : + if( uBase_(img,i) != NULL ) + { + OwnData_(copy) = True; + uBase_(copy,i) = XieMallocBits( uArSize_(img,i) ); + memcpy(uBase_(copy,i),uBase_(img,i),uArSize_(img,i)+7>>3); + } + break; + + case XieK_DataShare : + break; + + default : _XieLibError( EINVAL, "XieCopyImage (mode)" ); + } + } + return( copy ); +} /* end XieCopyImage */ + +/******************************************************************************* +** XieCreateImage +** +** FUNCTIONAL DESCRIPTION: +** +** Create an XieImage as specified by formal parameters -- no image data. +** +** FORMAL PARAMETERS: +** +** width - width of proposed image data +** height - height of proposed image data +** cmpres - compression scheme +** cmp_org - component organization +** cmp_map - component mapping +** cmp_cnt - number of components +** cmp_lvl - array of component levels +** pxl_mod - pixel stride modulo +** scn_mod - scanline stride modulo +** +** FUNCTION VALUE: +** +** XieImage - pointer to new XieImageRec +** +*******************************************************************************/ +XieImage XieCreateImage( width, height, cmpres, + cmp_org, cmp_map, cmp_cnt, cmp_lvl, pxl_mod, scn_mod ) + unsigned long width, height, *cmp_lvl; + unsigned char cmpres, cmp_org, cmp_map, cmp_cnt, pxl_mod, scn_mod; +{ + CARD32 i, levels, pxl_bits, planes; + /* + ** Allocate the XieImageRec and fill in the non-Udp fields. + */ + XieImage img = (XieImage) XieCalloc(1,sizeof(XieImageRec)); + + CmpOrg_(img) = cmp_org; + CmpMap_(img) = cmp_map; + CmpCnt_(img) = cmp_cnt; + for( levels = 1, pxl_bits = 0, i = 0; i < cmp_cnt; i++ ) + { + CmpLvl_(img,i) = cmp_lvl[i]; + CmpLen_(img,i) = BitsFromLevels_(cmp_lvl[i]); + levels *= CmpLvl_(img,i); + pxl_bits += CmpLen_(img,i); + } + Cmpres_(img) = cmpres; + PxlPol_(img) = cmp_map == XieK_Bitonal ? XieK_ZeroBright : XieK_ZeroDark; + PxlRatio_(img) = 1.0; + PxlProg_(img) = XieK_PP0; + ScnProg_(img) = XieK_LP270; + OwnData_(img) = False; + + /* + ** Allocate UdpRec's and fill in component organization based fields. + */ + switch( cmp_org ) + { + case XieK_BandByPixel : + planes = 1; + Plane_(img,0) = (UdpPtr) XieMalloc(sizeof(UdpRec)); + uCmpIdx_(img,0) = 0; + uPxlLen_(img,0) = pxl_bits; + uLvl_(img,0) = levels; + break; + case XieK_BandByPlane : + planes = CmpCnt_(img); + for( i = 0; i < planes; i++ ) + { + Plane_(img,i) = (UdpPtr) XieMalloc(sizeof(UdpRec)); + uCmpIdx_(img,i) = i; + uPxlLen_(img,i) = CmpLen_(img,i); + uLvl_(img,i) = CmpLvl_(img,i); + } + break; + case XieK_BitByPlane : + planes = pxl_bits; + for( i = 0; i < planes; i++ ) + { + Plane_(img,i) = (UdpPtr) XieMalloc(sizeof(UdpRec)); + uCmpIdx_(img,i) = i < CmpLen_(img,0) ? 0 + : i < CmpLen_(img,0) + CmpLen_(img,1) ? 1 : 2; + uPxlLen_(img,i) = 1; + uLvl_(img,i) = CmpLvl_(img,uCmpIdx_(img,i)) < 2 + ? CmpLvl_(img,uCmpIdx_(img,i)) : 2; + } + break; + default : _XieLibError(EINVAL, "XieCreateImage (component organization)"); + } + + /* + ** Complete filling in UdpRec's based on per-plane information. + */ + for( i = 0; i < planes; i++ ) + { + if( cmpres == XieK_PCM ) + switch( uPxlLen_(img,i) ) + { + case 8 : + uDType_(img,i) = UdpK_DTypeBU; + uClass_(img,i) = UdpK_ClassA; + break; + case 16: + uDType_(img,i) = UdpK_DTypeWU; + uClass_(img,i) = UdpK_ClassA; + break; + case 32 : + uDType_(img,i) = UdpK_DTypeLU; + uClass_(img,i) = UdpK_ClassA; + break; + default : + uDType_(img,i) = UdpK_DTypeVU; + uClass_(img,i) = UdpK_ClassUBA; + break; + } + else + { + uDType_(img,i) = UdpK_DTypeV; + uClass_(img,i) = UdpK_ClassUBS; + } + uPxlStr_(img,i) = Modulo_( uPxlLen_(img,i), pxl_mod ); + uScnStr_(img,i) = Modulo_( uPxlStr_(img,i) * width, scn_mod ); + uX1_(img,i) = 0; + uX2_(img,i) = width - 1; + uY1_(img,i) = 0; + uY2_(img,i) = height - 1; + uWidth_(img,i) = width; + uHeight_(img,i) = height; + uArSize_(img,i) = uScnStr_(img,i) * height; + uBase_(img,i) = NULL; + uPos_(img,i) = 0; + } + + return( img ); +} /* end XieCreateImage */ + +/******************************************************************************* +** XieFreeImage +** +** FUNCTIONAL DESCRIPTION: +** +** Free XieImageRec, including plane descriptors and image data (if owned). +** +** FORMAL PARAMETERS: +** +** img - pointer to XieImageRec +** +** FUNCTION VALUE: +** +** NULL +** +*******************************************************************************/ +XieImage XieFreeImage( img ) + XieImage img; +{ + CARD32 i, planes; + + if( img != NULL ) + { + /* + ** Free all the image data planes. + */ + for( planes = PlaneCount_(img), i = 0; i < planes; i++ ) + if( Plane_(img,i) != NULL ) + { + if( OwnData_(img) ) + XieFreeBits( uBase_(img,i) ); + XieFree( Plane_(img,i) ); + } + + if( Xport_(img) != NULL ) + XieFree( Xport_(img) ); + + /* + ** Free the XieImageRec. + */ + XieFree( img ); + } + return( NULL ); +} /* end XieFreeImage */ + +/******************************************************************************* +** XieGetImage +** +** FUNCTIONAL DESCRIPTION: +** +** Create an XieImage from a server Photomap: with optional image data. +** +** FORMAL PARAMETERS: +** +** pho_id - Photo{flo|map|tap} id +** cmpres - compression scheme +** cmpprm - compression parameter +** cmp_org - component organization +** pxl_mod - pixel stride modulo +** scn_mod - scanline stride modulo +** mode - what to do about image data: +** XieK_DataNone - no image buffers, no data copy +** XieK_DataAlloc - allocate new image buffers only, no data +** XieK_DataCopy - setup GetStream transport and attempt to +** retrieve data into new image buffers +** +** FUNCTION VALUE: +** +** XieImage - pointer to XieImageRec +** +*******************************************************************************/ +XieImage XieGetImage( pho_id, cmpres, cmpprm, cmp_org, pxl_mod, scn_mod, mode ) + XiePhoto pho_id; + unsigned char cmpres, cmp_org, pxl_mod, scn_mod, mode; + unsigned long cmpprm; +{ + PhotoPtr pho = (PhotoPtr) pho_id; + Display *dpy = ResDpy_(pho); + xieQueryPhotomapReply reply; + XieImage img; + CARD32 plane, planes; + unsigned long *levels, long_levels[XieK_MaxComponents]; + /* + ** Get the attributes from of the server's Photomap. + */ + if( !_XieQueryResource( pho, &reply ) ) + return( NULL ); + UnlockDisplay(dpy); + SyncHandle(); + /* + ** Copy the levels data into an unsigned long array, if necessary, + ** because XieCreateImage() requires one. + */ + if (sizeof (CARD32) != sizeof (unsigned long)) + { + int i; + CARD32 *card32_levels; + + for (i = 0, levels = long_levels, card32_levels = reply.levels; + i < XieK_MaxComponents; + i++) + { + *levels++ = (unsigned long) *card32_levels++; + } + levels = long_levels; + } + else + levels = (unsigned long *)reply.levels; + /* + ** Create an XieImage from the Photomap attributes and arguments passed in. + */ + img = XieCreateImage( + (unsigned long)reply.width, + (unsigned long)reply.height, + cmpres, cmp_org, + reply.component_mapping, reply.component_count, + levels, + pxl_mod, scn_mod ); + + PxlPol_(img) = reply.polarity; + PxlRatio_(img) = MiDecodeDouble( &reply.aspect_ratio ); + PxlProg_(img) = reply.pixel_progression; + ScnProg_(img) = reply.line_progression; + + planes = PlaneCount_(img); + /* + ** Handle the image data according to the mode passed in. + */ + switch( mode ) + { + case XieK_DataAlloc : + /* + ** Allocate zeroed image data planes. + */ + for( plane = 0; plane < planes; plane++ ) + uBase_(img,plane) = XieCallocBits( uArSize_(img,plane) ); + OwnData_(img) = True; + break; + + case XieK_DataNone : + break; + + case XieK_DataCopy : + /* + ** Setup GetStream image transport and attempt to retrieve the data. + */ + CreateXport(pho, img, XieK_GetStream, cmpprm); + XieGetImageData( img ); + break; + + default : _XieLibError(EINVAL, "XieGetImage (mode)"); + } + return( img ); +} /* end XieGetImage */ + +/******************************************************************************* +** XieGetImageData +** +** FUNCTIONAL DESCRIPTION: +** +** Transport all planes of image data from server Photo{flo|map|tap}. +** {Xport context is created by XieGetImage()} +** FORMAL PARAMETERS: +** +** img - pointer to XieImageRec +** +** FUNCTION VALUE: +** +** GetStream status: Final, Empty, or Error +** +*******************************************************************************/ +unsigned char XieGetImageData( img ) + XieImage img; +{ + XieStreamPtr xp = (XieStreamPtr) Xport_(img); + XiePhoto pho_id = xp ? XieFindResource(xpDpy_(xp), xpId_(xp)) : NULL; + CARD32 plane, getb, retb, planes = PlaneCount_(img); + CARD8 *base, state; + + if( xp == NULL || pho_id == NULL ) + return( XieK_StreamError ); + for( Stream_(img) = XieK_StreamFinal, plane = 0; + !StreamError_(img) && plane < planes; plane++ ) + { + if( xpBits_(xp,plane) >= uArSize_(img,plane) ) + continue; + if( uBase_(img,plane) == NULL ) + { + uBase_(img,plane) = (CARD8 *) XieMallocBits(uArSize_(img,plane)); + OwnData_(img) = True; + } + base = uBase_(img,plane) + xpBytes_(xp,plane); + getb = uArSize_(img,plane) - xpBits_(xp,plane) + 7 >> 3; + state = XieGetStream( pho_id, plane, &base, getb, &retb ); + + xpBytes_(xp,plane) += retb; + if( state == XieK_StreamFinal && retb < getb ) + { + uArSize_(img,plane) = xpBits_(xp,plane); + uBase_(img,plane) = XieReallocBits( uBase_(img,plane), + uArSize_(img,plane)); + } + Stream_(img) = max(Stream_(img), state); + } + if( !StreamPending_(img) ) + Xport_(img) = (XieStream) XieFree( Xport_(img) ); + + return( Stream_(img) ); +} /* end XieGetImageData */ + +/******************************************************************************* +** XiePutImage +** +** FUNCTIONAL DESCRIPTION: +** +** Create a server Photomap, and optionally transport data to it. +** +** FORMAL PARAMETERS: +** +** display - X11 display pointer +** img - pointer to XieImageRec +** mode - what to do about image data: +** XieK_DataFlo - create Photoflo + SetStream for put data +** XieK_DataMap - create Photomap + SetStream for put data +** XieK_DataNone - create Photomap, don't send image data +** XieK_DataCopy - create Photomap, then send image data +** +** FUNCTION VALUE: +** +** XiePhoto - newly created Photo{flo|map} id +** +*******************************************************************************/ +XiePhoto XiePutImage( display, img, mode ) + Display *display; + XieImage img; + unsigned char mode; +{ + /* + ** Create a server XiePhoto{flo|map}. + */ + XiePhoto pho = XieCreatePhoto(display, mode == XieK_DataFlo ? XieK_Photoflo + : XieK_Photomap, + Width_(img), Height_(img), + CmpMap_(img), CmpCnt_(img), &CmpLvl_(img,0), + PxlPol_(img), PxlRatio_(img), + PxlProg_(img), ScnProg_(img) ); + switch( mode ) + { + case XieK_DataFlo : + case XieK_DataMap : + CreateXport(pho, img, XieK_PutStream, 0); + case XieK_DataNone : + break; + + case XieK_DataCopy : + CreateXport(pho, img, XieK_PutStream, 0); + XiePutImageData( img ); + break; + + default : _XieLibError(EINVAL, "XiePutImage (mode)"); + } + return( pho ); +} /* end XiePutImage */ + +/******************************************************************************* +** XiePutImageData +** +** FUNCTIONAL DESCRIPTION: +** +** Transport all planes of image data to server Photo{flo|map}. +** {Xport context is created by XiePutImage()} +** +** FORMAL PARAMETERS: +** +** img - pointer to XieImageRec +** +** FUNCTION VALUE: +** +** GetStream status: Final or More +** +*******************************************************************************/ +unsigned char XiePutImageData( img ) + XieImage img; +{ + XieStreamPtr xp = (XieStreamPtr) Xport_(img); + PhotoPtr pho = xp ? (PhotoPtr) XieFindResource(xpDpy_(xp),xpId_(xp)) : NULL; + CARD32 done, size, bytes, plane, planes = PlaneCount_(img); + + Stream_(img) = XieK_StreamFinal; + if( xp == NULL || pho == NULL ) + return( XieK_StreamError ); + /* + ** If we have a Photoflo we only send one "max_request_size" chunck of + ** planes, otherwise we send the entire image a plane at a time. + */ + size = FloLnk_(pho) == NULL ? ~0 + : (((xpDpy_(xp)->max_request_size < 65536 ? + xpDpy_(xp)->max_request_size : 65536)<<2) + / planes - sz_xiePutStreamReq); + for( plane = 0; plane < planes; plane++ ) + { + if( xpBits_(xp,plane) >= uArSize_(img,plane) ) + continue; + bytes = uArSize_(img,plane) - xpBits_(xp,plane) + 7 >> 3; + done = bytes <= size; + if( !done ) + { + Stream_(img) = XieK_StreamMore; + bytes = size; + } + XiePutStream(pho,plane,uBase_(img,plane)+xpBytes_(xp,plane),bytes,done); + xpBytes_(xp,plane) += bytes; + } + if( !StreamPending_(img) ) + Xport_(img) = (XieStream) XieFree( Xport_(img) ); + + return( Stream_(img) ); +} /* end XiePutImageData */ + +/******************************************************************************* +** CreateXport +** +** FUNCTIONAL DESCRIPTION: +** +** Create a stream transport context for XieImage and server. +** +** FORMAL PARAMETERS: +** +** pho - Photo{flo|map|tap} pointer +** img - XieImageRec pointer +** mode - XieK_GetStream or XieK_PutStream +** cmpprm - compression parameter +** +*******************************************************************************/ +static void CreateXport( pho, img, mode, cmpprm ) + PhotoPtr pho; + XieImage img; + unsigned char mode; + unsigned long cmpprm; +{ + XieStreamPtr xp; + + /* + ** Create a stream transport context for the XieImage. + */ + xp = (XieStreamPtr) XieCalloc(1, sizeof(XieStreamRec)); + xpId_(xp) = ResId_(pho); + xpDpy_(xp) = ResDpy_(pho); + Stream_(img) = XieK_StreamMore; + Xport_(img) = (XieStream) xp; + + /* + ** Create a stream transport context for the server. + */ + _XieSetTransport( pho, img, mode, (1< + /* + ** X11 and XIE include files + */ +#ifdef VMS +#include /* X11 internal lib/transport defs */ +#else +#include /* X11 internal lib/transport defs */ +#endif +#include /* XIE Req/Reply protocol defs */ +#include /* XIE public definitions */ +#include /* XIE private definitions */ + +/* +** Table of contents +*/ + /* + ** PUBLIC entry points + */ +XiePhoto XieArea(); /* create Photomap by applying area op to */ + /* src. Optional IDC. */ +XiePhoto XieAreaStats(); /* create Photomap by applying area stats */ + /* op to src. Optional IDC. */ +XiePhoto XieArithmetic();/* create Photomap from arithmetic combination + * of Photomap, and Photomap or constant. + * Optional IDC. */ +XiePhoto XieChromeCom(); /* create an RGB Photomap by combining three + * monochrome Photomaps. */ +XiePhoto XieChromeSep(); /* create an monochrome Photomap by selecting + * one component of an RGB Photomap */ +XiePhoto XieCompare(); /* create a photomap which contains the + * boolean results of per-pixel compares */ +XiePhoto XieConstrain(); /* constrain an existing photomap */ +XiePhoto XieCrop(); /* create Photomap from Photomap. + * Optional ROI */ +XiePhoto XieDither(); /* create Photomap from dithered src Photomap*/ +XiePhoto XieFill(); /* fill ROI of Photomap with a constant */ +XiePhoto XieLogical(); /* create Photomap from bitwise-logical + * combination of Photomap, and Photomap or + * constant. Optional IDC. */ +XiePhoto XieLuminance(); /* create Photomap from luminance of src */ +XiePhoto XieMatchHistogram();/* create Photomap from src Photomap + * remapped to new distribution. + * Optional IDC. */ +XiePhoto XieMath(); /* create Photomap from math function of + * src Photomap. Optional IDC. */ +XiePhoto XieMirror(); /* create Photomap from mirrored src Photomap*/ +XiePhoto XiePoint(); /* create Photomap from point remapped src */ +void XiePointStats();/* Return statistics around a point */ +XiePhoto XieRotate(); /* create Photomap from rotated src Photomap */ +XiePhoto XieScale(); /* create Photomap from scaled src Photomap */ +XiePhoto XieTranslate(); /* translate ROI between Photomap's */ + /* + ** internal routines + */ + +/* +** MACRO definitions +*/ + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* +** Local Storage +*/ + +/******************************************************************************* +** XieArea +** +** FUNCTIONAL DESCRIPTION: +** +** Create a Photomap by applying an area operator to a server +** Photomap resource. +** +** FORMAL PARAMETERS: +** +** src_id - id of source Photo{flo|map|tap} to be processed +** tmp_id - id of template Idc containing the area kernel. +** idc_id - image domain context, XieCpp or XieRoi {optional} +** op1 - request code for first operation to be performed +** op2 - request code for second operation to be performed +** constrain - output should be constrained (Boolean) +** +** FUNCTION VALUE: +** +** XiePhoto - id of Photoflo passed in, or created Photomap +** +******************************************************************************/ +XiePhoto XieArea( src_id, tmp_id, idc_id, op1, op2, constrain) + XiePhoto src_id; + XieTmp tmp_id; + XieIdc idc_id; + unsigned long op1; + unsigned long op2; + unsigned long constrain; +{ + PhotoPtr dst; + PhotoPtr src = (PhotoPtr) src_id; + IdcPtr tmp = (IdcPtr) tmp_id; + IdcPtr idc = (IdcPtr) idc_id; + Display *dpy = ResDpy_(src); + XieSessionPtr ses = _XieGetSession(dpy); + CARD32 i, cmp_cnt = PhotoCount_(src); + xieAreaReq *req; + + dst = _XieGetDst(src); + + /* + ** Create a request to do area between the operands. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieArea,req); + req->src_photo_id = ResId_(src); + req->dst_photo_id = ResId_(dst); + req->ipct_id = ResId_(tmp); + req->ipcc_id = idc == NULL ? 0 : ResId_(idc); + req->op1 = op1; + req->op2 = op2; + req->constrain = (constrain != 0); + XieReqDone_(dpy); + + return( (XiePhoto) dst ); +} /* end XieArea */ + +/******************************************************************************* +** XieAreaStats +** +** FUNCTIONAL DESCRIPTION: +** +** Create a Photomap by applying an area statistics operator to a server +** Photomap resource. +** +** FORMAL PARAMETERS: +** +** src_id - id of source Photo{flo|map|tap} to be processed +** idc_id - image domain context, XieCpp or XieRoi {optional} +** op - statistics operation to perform, one of: +** +** XieK_Minimum +** XieK_Maximum +** XieK_Mean +** XieK_StdDev +** XieK_Variance +** +** edge - size of the local area square region surrounding each +** pixel over which the statistics operation is performed. +** +** FUNCTION VALUE: +** +** XiePhoto - id of Photoflo passed in, or created Photomap +** +******************************************************************************/ +XiePhoto XieAreaStats( src_id, idc_id, op, edge ) + XiePhoto src_id; + XieIdc idc_id; + unsigned long op; + unsigned long edge; +{ + xieAreaStatsReq *req; + + PhotoPtr src = (PhotoPtr) src_id; + PhotoPtr dst; + IdcPtr idc = (IdcPtr) idc_id; + + Display *dpy = ResDpy_(src); + XieSessionPtr ses = _XieGetSession(dpy); + + dst = _XieGetDst(src); + /* + ** Create a request to do area stats. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieAreaStats,req); + req->src_photo_id = ResId_(src); + req->dst_photo_id = ResId_(dst); + req->idc_id = idc == NULL ? 0 : ResId_(idc); + req->edge_size = edge; + req->stat_type = op; + XieReqDone_(dpy); + + return( (XiePhoto) dst ); +} + +/******************************************************************************* +** XieArithmetic +** +** FUNCTIONAL DESCRIPTION: +** +** Create the arithmetic combination of two server Photomap resources +** or one server Photomap resource and a "constant" image. +** +** FORMAL PARAMETERS: +** +** src_id1 - id of first source Photo{flo|map|tap} to be processed +** src_id2 - id of second source Photo{flo|map|tap} to be processed +** constant - "constant" image values if src_id2 == 0. +** idc_id - image domain context, XieCpp or XieRoi {optional} +** operator - request code for the operation to be performed +** constrain - output should be constrained (Boolean) +** +** FUNCTION VALUE: +** +** XiePhoto - id of Photoflo passed in, or created Photomap +** +*******************************************************************************/ +XiePhoto XieArithmetic( src_id1, src_id2, constant, idc_id, operator, + constrain) + XiePhoto src_id1; + XiePhoto src_id2; + unsigned long *constant; + XieIdc idc_id; + unsigned long operator; + unsigned long constrain; +{ + PhotoPtr dst; + PhotoPtr src1 = (PhotoPtr) src_id1; + PhotoPtr src2 = (PhotoPtr) src_id2; + IdcPtr idc = (IdcPtr) idc_id; + Display *dpy = ResDpy_(src1); + XieSessionPtr ses = _XieGetSession(dpy); + CARD32 i, cmp_cnt = PhotoCount_(src1); + xieArithReq *req; + + if( constant == NULL && !XieIsPhoto( src2 ) ) + return( NULL ); /* One or the other required */ + + dst = src2 == NULL || FloLnk_(src2) == NULL ? _XieGetDst(src1) + : FloLnk_(src2); + /* + ** Create a request to do arithmetic between the operands. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieArith,req); + req->src1_photo_id = ResId_(src1); + req->src2_photo_id = src2 == NULL ? 0 : ResId_(src2); + for( i = 0; i < XieK_MaxComponents; i++ ) + req->constants[i] = i < cmp_cnt && constant != NULL ? constant[i] : 0; + req->dst_photo_id = ResId_(dst); + req->idc_id = idc == NULL ? 0 : ResId_(idc); + req->op = operator; + req->constrain = (constrain != 0); + XieReqDone_(dpy); + + return( (XiePhoto) dst ); +} /* end XieArithmetic */ + +/******************************************************************************* +** XieChromeCom +** +** FUNCTIONAL DESCRIPTION: +** +** Combine three monochrome server Photomaps into one +** RGB server Photomap resource. +** +** FORMAL PARAMETERS: +** +** src_id1 - id of first source Photo{flo|map|tap} to be processed +** src_id2 - id of second source Photo{flo|map|tap} to be processed +** src_id3 - id of third source Photo{flo|map|tap} to be processed +** +** FUNCTION VALUE: +** +** XiePhoto - id of Photoflo passed in, or created Photomap +** +*******************************************************************************/ +XiePhoto XieChromeCom( src_id1, src_id2, src_id3) + + XiePhoto src_id1; + XiePhoto src_id2; + XiePhoto src_id3; +{ + PhotoPtr dst; + PhotoPtr src1 = (PhotoPtr) src_id1; + PhotoPtr src2 = (PhotoPtr) src_id2; + PhotoPtr src3 = (PhotoPtr) src_id3; + Display *dpy = ResDpy_(src1); + XieSessionPtr ses = _XieGetSession(dpy); + xieChromeComReq *req; + + dst = FloLnk_(src1) != NULL ? FloLnk_(src1) + : FloLnk_(src2) != NULL ? FloLnk_(src2) + : FloLnk_(src3) != NULL ? FloLnk_(src3) : _XieGetDst(src1); + ResMap_(dst) = XieK_RGB; + /* + ** Create a request to do the combine. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieChromeCom,req); + req->photo_id1 = ResId_(src1); + req->photo_id2 = ResId_(src2); + req->photo_id3 = ResId_(src3); + req->dst_photo_id = ResId_(dst); + + XieReqDone_(dpy); + + return( (XiePhoto) dst ); +} /* end XieChromeCom */ + +/******************************************************************************* +** XieChromeSep +** +** FUNCTIONAL DESCRIPTION: +** +** Separate one component of an RGB Photomap into an monochrome +** server Photomap resource. +** +** FORMAL PARAMETERS: +** +** src_id - id of polychromatic Photo{flo|map|tap} to be processed +** component - index of component to separate +** +** FUNCTION VALUE: +** +** XiePhoto - id of Photoflo passed in, or created Photomap +** +*******************************************************************************/ +XiePhoto XieChromeSep( src_id, component ) + + XiePhoto src_id; + CARD32 component; +{ + PhotoPtr dst; + PhotoPtr src = (PhotoPtr) src_id; + Display *dpy = ResDpy_(src); + XieSessionPtr ses = _XieGetSession(dpy); + CARD32 i; + xieChromeSepReq *req; + xieQueryPhotomapReply rep; + + dst = _XieGetDst(src); + + /* + ** Create a request to do the separate. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieChromeSep,req); + req->src_photo = ResId_(src); + req->dst_photo = ResId_(dst); + req->component = component; + XieReqDone_(dpy); + + if( _XieQueryResource( dst, &rep ) ) + { + ResMap_(dst) = rep.component_mapping; + XieReqDone_(dpy); + } + return( (XiePhoto) dst ); +} /* end XieChromeSep */ + +/******************************************************************************* +** XieCompare +** +** FUNCTIONAL DESCRIPTION: +** +** Perform a pixel-by-pixel comparison between two server Photomaps +** or one server Photomap resource and a "constant" image. +** The results are returned as a Photomap where the pixel values +** are one where the comparisons is true and zero elsewhere. +** +** FORMAL PARAMETERS: +** +** src_id1 - id of first source Photo{flo|map|tap} to be processed +** src_id2 - id of second source Photo{flo|map|tap} to be processed +** constant - "constant" image values if src_id2 == 0. +** idc_id - image domain context, XieCpp or XieRoi {optional} +** operator - request code for the operation to be performed +** combine - Combine the per-component results for multi-component +** input. +** +** FUNCTION VALUE: +** +** XiePhoto - id of Photoflo passed in, or created Photomap +** +*******************************************************************************/ +XiePhoto XieCompare( src_id1, src_id2, constant, idc_id, operator, combine ) + + XiePhoto src_id1; + XiePhoto src_id2; + unsigned long *constant; + XieIdc idc_id; + unsigned long operator; + unsigned long combine; +{ + PhotoPtr dst; + PhotoPtr src1 = (PhotoPtr) src_id1; + PhotoPtr src2 = (PhotoPtr) src_id2; + IdcPtr idc = (IdcPtr) idc_id; + Display *dpy = ResDpy_(src1); + XieSessionPtr ses = _XieGetSession(dpy); + CARD32 i, cmp_cnt = PhotoCount_(src1); + xieCompareReq *req; + + if( constant == NULL && !XieIsPhoto( src2 ) ) + return( NULL ); /* One or the other required */ + + dst = src2 == NULL || FloLnk_(src2) == NULL ? _XieGetDst(src1) + : FloLnk_(src2); + /* + ** Create a request to do compare between the operands. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieCompare,req); + req->src1_photo_id = ResId_(src1); + req->src2_photo_id = src2 == NULL ? 0 : ResId_(src2); + for( i = 0; i < XieK_MaxComponents; i++ ) + req->constants[i] = i < cmp_cnt && constant != NULL ? constant[i] + : 0; + req->dst_photo_id = ResId_(dst); + req->idc_id = idc == NULL ? 0 : ResId_(idc); + req->op = operator; + req->combine = combine; + + if (!IsRGB_(dst) || combine) + ResMap_(dst) = XieK_Bitonal; /* Compnent mapping changes except + * for RGB/no combine */ + + XieReqDone_(dpy); + + return( (XiePhoto) dst ); +} /* end XieCompare */ + +/******************************************************************************* +** XieConstrain +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain a photomap using the current default constraint model. +** +** FORMAL PARAMETERS: +** +** src_id - id of source Photo{flo|map|tap} +** model - constraint model to use, or zero for the default +** {XieK_HardClip, XieK_ClipScale, XieK_HardScale} +** levels - if model != 0, array of levels to constrain each component. +** +** FUNCTION VALUE: +** +** XiePhoto - id of Photoflo passed in, or created Photomap +** +*******************************************************************************/ +XiePhoto XieConstrain( src_id, model, levels) + XiePhoto src_id; + int model; + unsigned long int levels[XieK_MaxComponents]; +{ + PhotoPtr src = (PhotoPtr) src_id; + PhotoPtr dst = _XieGetDst(src); + Display *dpy = ResDpy_(dst); + XieSessionPtr ses = _XieGetSession(dpy); + CARD32 i, cmp_cnt = PhotoCount_(dst); + xieQueryPhotomapReply rep; + xieConstrainReq *req; + + /* + ** Create a request to constrain a photomap. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieConstrain,req); + req->src_photo_id = ResId_(src); + req->dst_photo_id = ResId_(dst); + req->model = model; + for (i = 0; i < XieK_MaxComponents; i++) + req->levels[i] = levels[i]; + XieReqDone_(dpy); + + /* Change component mapping */ + if( model > 0 && cmp_cnt == 1 ) + ResMap_(dst) = (levels[0] > 2) ? XieK_GrayScale : XieK_Bitonal; + else if( _XieQueryResource( dst, &rep ) ) + { + ResMap_(dst) = rep.component_mapping; + XieReqDone_(dpy); + } + + return( (XiePhoto) dst ); +} /* end XieConstrain */ + +/******************************************************************************* +** XieCrop +** +** FUNCTIONAL DESCRIPTION: +** +** Create a Photomap from an existing Photomap (ROI optional). +** +** FORMAL PARAMETERS: +** +** src_id - id of source Photo{flo|map|tap} +** idc_id - image domain context, XieCpp or XieRoi {optional} +** +** FUNCTION VALUE: +** +** XiePhoto - id of Photoflo passed in, or created Photomap +** +*******************************************************************************/ +XiePhoto XieCrop( src_id, idc_id ) + XiePhoto src_id; + XieIdc idc_id; +{ + PhotoPtr src = (PhotoPtr) src_id; + PhotoPtr dst = _XieGetDst(src); + IdcPtr idc = (IdcPtr) idc_id; + Display *dpy = ResDpy_(src); + XieSessionPtr ses = _XieGetSession(dpy); + xieCropReq *req; + + /* + ** Create a request to copy the area from the src into the dst. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieCrop,req); + req->src_photo_id = ResId_(src); + req->dst_photo_id = ResId_(dst); + req->idc_id = idc == NULL ? 0 : ResId_(idc); + XieReqDone_(dpy); + + return( (XiePhoto) dst ); +} /* end XieCrop */ + +/******************************************************************************* +** XieDither +** +** FUNCTIONAL DESCRIPTION: +** +** Create a dithered copy of a Photomap. +** +** FORMAL PARAMETERS: +** +** src_id - id of source Photo{flo|map|tap} to be dithered +** levels - list of number of levels to dither each component down to +** +** FUNCTION VALUE: +** +** XiePhoto - id of Photoflo passed in, or created Photomap +** +*******************************************************************************/ +XiePhoto XieDither( src_id, levels ) + XiePhoto src_id; + unsigned long *levels; +{ + PhotoPtr src = (PhotoPtr) src_id; + PhotoPtr dst = _XieGetDst(src); + Display *dpy = ResDpy_(src); + CARD32 i, cmp_cnt = PhotoCount_(src); + XieSessionPtr ses = _XieGetSession(dpy); + xieDitherReq *req; + + /* + ** Create a request to dither the src to the dst. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieDither,req); + req->src_photo_id = ResId_(src); + req->dst_photo_id = ResId_(dst); + for( i = 0; i < XieK_MaxComponents; i++ ) + req->levels[i] = i >= cmp_cnt ? 0 : levels == NULL || levels[i] == 0 + ? 2 : levels[i]; + + if( cmp_cnt == 1 && req->levels[0] <= 2 ) + ResMap_(dst) = XieK_Bitonal; /* change component mapping */ + + XieReqDone_(dpy); + + return( (XiePhoto) dst ); +} /* end XieDither */ + +/******************************************************************************* +** XieFill +** +** FUNCTIONAL DESCRIPTION: +** +** Fill a region of an existing Photomap with a constant, creating +** a new photomap. +** +** FORMAL PARAMETERS: +** +** src_id - id of Photo{flo|map|tap} of image to be filled. +** idc_id - id of image domain context, XieCpp or XieRoi +** fill - array of constants +** +*******************************************************************************/ +XiePhoto XieFill( src_id, idc_id, fill ) + XiePhoto src_id; + XieIdc idc_id; + unsigned long *fill; +{ + PhotoPtr src = (PhotoPtr) src_id; + PhotoPtr dst = _XieGetDst(src); + IdcPtr idc = (IdcPtr) idc_id; + Display *dpy = ResDpy_(src); + XieSessionPtr ses = _XieGetSession(dpy); + CARD32 i, cmp_cnt = PhotoCount_(src); + xieQueryPhotomapReply rep; + xieFillReq *req; + + if( fill == NULL && !_XieQueryResource( src, &rep ) ) + return ( (XiePhoto)NULL );/* if you can't query it, you can't fill it*/ + /* + ** Create a request to fill an area of the dst with a constant value. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieFill,req); + req->src_photo_id = ResId_(src); + req->dst_photo_id = ResId_(dst); + req->dst_idc_id = idc == NULL ? 0 : ResId_(idc); + for( i = 0; i < XieK_MaxComponents; i++ ) + req->constant[i] = i < cmp_cnt && fill != NULL ? fill[i] + : rep.polarity == XieK_ZeroBright ? 0 : ~0; + XieReqDone_(dpy); + return( (XiePhoto) dst); +} /* end XieFill */ + +/******************************************************************************* +** XieHistogram +** +** FUNCTIONAL DESCRIPTION: +** +** Calculate the frequency histogram for the given image. +** +** FORMAL PARAMETERS: +** +** photo - photomap id +** idc - region to calculate over +** by_component - calculate histogram by component +** +** FUNCTION VALUE: +** +** Address of histogram data. +** +*******************************************************************************/ +CARD32 *XieHistogram(photo, idc_id, by_component) +XiePhoto photo; +XieIdc idc_id; +BOOL by_component; +{ + PhotoPtr src = (PhotoPtr)photo; + IdcPtr idc = (IdcPtr)idc_id; + Display *dpy = ResDpy_(src); + XieSessionPtr ses = _XieGetSession(dpy); + xieCalcHistReq *req; + + xieCalcHistReply reply; + CARD32 *repdat = NULL; + int repsiz; + + int status; + /* + ** Create request to point remap the image. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieCalcHist,req); + + req->photo_id = ResId_(src); + req->idc_id = idc == NULL ? 0 : ResId_(idc); + req->by_component = by_component; + /* + ** Wait for reply... + */ + status = _XReply(dpy, &reply, 0, False); + if (!status) + _XieSrvError(dpy, req->opcode, req->photo_id, reply.sequenceNumber, + BadLength, "CalcHist : reply error"); + else + { + repsiz = reply.length << 2; + repdat = (CARD32 *)XieMalloc(repsiz); + _XRead(dpy, repdat, repsiz); + XieReqDone_(dpy); + } + + return (repdat); +} + +/******************************************************************************* +** XieLogical +** +** FUNCTIONAL DESCRIPTION: +** +** Create the bitwise logical combination of two server Photomap resources +** or one server Photomap resource and a "constant" image. +** +** FORMAL PARAMETERS: +** +** src_id1 - id of first source Photo{flo|map|tap} to be processed +** src_id2 - id of second source Photo{flo|map|tap} to be processed +** constant - "constant" image values if src_id2 == 0. +** idc_id - image domain context, XieCpp or XieRoi {optional} +** operator - request code for the operation to be performed +** +** FUNCTION VALUE: +** +** XiePhoto - id of Photoflo passed in, or created Photomap +** +*******************************************************************************/ +XiePhoto XieLogical( src_id1, src_id2, constant, idc_id, operator) + + XiePhoto src_id1; + XiePhoto src_id2; + unsigned long *constant; + XieIdc idc_id; + unsigned long operator; +{ + PhotoPtr dst; + PhotoPtr src1 = (PhotoPtr) src_id1; + PhotoPtr src2 = (PhotoPtr) src_id2; + IdcPtr idc = (IdcPtr) idc_id; + Display *dpy = ResDpy_(src1); + XieSessionPtr ses = _XieGetSession(dpy); + CARD32 i, cmp_cnt = PhotoCount_(src1); + xieLogicalReq *req; + + if( constant == NULL && !XieIsPhoto( src2 ) ) + return( NULL ); /* One or the other required */ + + dst = src2 == NULL || FloLnk_(src2) == NULL ? _XieGetDst(src1) + : FloLnk_(src2); + /* + ** Create a request to do logical between the operands. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieLogical,req); + req->src1_photo_id = ResId_(src1); + req->src2_photo_id = src2 == NULL ? 0 : ResId_(src2); + for( i = 0; i < XieK_MaxComponents; i++ ) + req->constants[i] = i < cmp_cnt && constant != NULL ? constant[i] + : 0; + req->dst_photo_id = ResId_(dst); + req->idc_id = idc == NULL ? 0 : ResId_(idc); + req->op = operator; + + XieReqDone_(dpy); + + return( (XiePhoto) dst ); +} /* end XieLogical */ + +/******************************************************************************* +** XieLuminance +** +** FUNCTIONAL DESCRIPTION: +** +** Create a luminance only copy of a server Photomap resource +** +** FORMAL PARAMETERS: +** +** src_id - id of Photo{flo|map|tap} from which to extract luminance info +** +** FUNCTION VALUE: +** +** XiePhoto - id of Photoflo passed in, or created Photomap +** +*******************************************************************************/ +XiePhoto XieLuminance( src_id ) + XiePhoto src_id; +{ + PhotoPtr src = (PhotoPtr) src_id; + PhotoPtr dst = _XieGetDst(src); + Display *dpy = ResDpy_(src); + XieSessionPtr ses = _XieGetSession(dpy); + xieLuminanceReq *req; + + ResMap_(dst) = XieK_GrayScale; + /* + ** Create a request to extract luminance from the src into the dst. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieLuminance,req); + req->src_photo_id = ResId_(src); + req->dst_photo_id = ResId_(dst); + XieReqDone_(dpy); + + return( (XiePhoto) dst ); +} /* end XieLuminance */ + +/******************************************************************************* +** XieMatchHistogram +** +** FUNCTIONAL DESCRIPTION: +** +** Create a remapped copy of a server Photomap resource with the +** requested distribution. +** +** FORMAL PARAMETERS: +** +** src_id - id of source Photo{flo|map|tap} to be remapped. +** idc_id - id of domain context, XieCpp or XieRoi {optional} +** h_shape - desired distribution +** {XieK_Flat, XieK_Gaussian, XieK_Hyperbolic} +** param1 - First distribution parameter +** param2 - Second distribution parameter +** +** FUNCTION VALUE: +** +** XiePhoto - id of Photoflo passed in, or created Photomap +** +*******************************************************************************/ +XiePhoto XieMatchHistogram( src_id, idc_id, h_shape, param1, param2 ) + XiePhoto src_id; + XieIdc idc_id; + unsigned long h_shape; + double param1, param2; +{ + PhotoPtr src = (PhotoPtr) src_id; + PhotoPtr dst = _XieGetDst(src); + IdcPtr idc = (IdcPtr) idc_id; + Display *dpy = ResDpy_(src); + XieSessionPtr ses = _XieGetSession(dpy); + xieMatchHistogramReq *req; + + /* + ** Create request to remap the image with a new histogram. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieMatchHistogram,req); + req->photo_id1 = ResId_(src); + req->photo_id2 = ResId_(dst); + req->idc_id = idc == NULL ? 0 : ResId_(idc); + req->h_shape = h_shape; + MiEncodeDouble( &req->param1, param1); + MiEncodeDouble( &req->param2, param2); + XieReqDone_(dpy); + + return( (XiePhoto) dst ); +} /* end XieMatchHistogram */ + +/******************************************************************************* +** XieMath +** +** FUNCTIONAL DESCRIPTION: +** +** Create the mathematical function of a server Photomap resource. +** +** FORMAL PARAMETERS: +** +** src_id - id of source Photo{flo|map|tap} to be processed +** idc_id - image domain context, XieCpp or XieRoi {optional} +** operator - request code for the operation to be performed +** constrain - output should be constrained (Boolean) +** +** FUNCTION VALUE: +** +** XiePhoto - id of Photoflo passed in, or created Photomap +** +*******************************************************************************/ +XiePhoto XieMath( src_id, idc_id, operator, constrain) + XiePhoto src_id; + XieIdc idc_id; + unsigned long operator; + unsigned long constrain; +{ + PhotoPtr dst; + PhotoPtr src = (PhotoPtr) src_id; + IdcPtr idc = (IdcPtr) idc_id; + Display *dpy = ResDpy_(src); + XieSessionPtr ses = _XieGetSession(dpy); + CARD32 i, cmp_cnt = PhotoCount_(src); + xieMathReq *req; + + dst = _XieGetDst(src); + + /* + ** Create a request to do the math function + */ + XieReq_(dpy,0,SesOpCode_(ses),ieMath,req); + req->src_photo_id = ResId_(src); + req->dst_photo_id = ResId_(dst); + req->idc_id = idc == NULL ? 0 : ResId_(idc); + req->op = operator; + req->constrain = (constrain != 0); + XieReqDone_(dpy); + + return( (XiePhoto) dst ); +} /* end XieMath */ + +/******************************************************************************* +** XieMirror +** +** FUNCTIONAL DESCRIPTION: +** +** Create a mirrored copy of a server Photomap resource. +** +** FORMAL PARAMETERS: +** +** src_id - id of source Photo{flo|map|tap} to be mirrored +** x_mirror- mirror about the X axis (Boolean) +** y_mirror- mirror about the Y axis (Boolean) +** +** FUNCTION VALUE: +** +** XiePhoto - id of Photoflo passed in, or created Photomap +** +*******************************************************************************/ +XiePhoto XieMirror( src_id, x_mirror, y_mirror ) + XiePhoto src_id; + unsigned long x_mirror, y_mirror; +{ + PhotoPtr src = (PhotoPtr) src_id; + PhotoPtr dst = _XieGetDst(src); + Display *dpy = ResDpy_(src); + XieSessionPtr ses = _XieGetSession(dpy); + xieMirrorReq *req; + + /* + ** Create request to flip (mirror) the image. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieMirror,req); + req->src_photo_id = ResId_(src); + req->dst_photo_id = ResId_(dst); + req->x_mirror = x_mirror; + req->y_mirror = y_mirror; + XieReqDone_(dpy); + + return( (XiePhoto) dst ); +} /* end XieMirror */ + +/******************************************************************************* +** XiePoint +** +** FUNCTIONAL DESCRIPTION: +** +** Create a point remapped copy of a server Photomap resource. +** +** FORMAL PARAMETERS: +** +** src_id - id of source Photo{flo|map|tap} to be remapped. +** idc_id - id of domain context, XieCpp or XieRoi {optional} +** tbl_id - id of Photomap containing transfer function lookup table(s) +** (lookup tables). +** +** FUNCTION VALUE: +** +** XiePhoto - id of Photoflo passed in, or created Photomap +** +*******************************************************************************/ +XiePhoto XiePoint( src_id, idc_id, tbl_id ) + XiePhoto src_id; + XieIdc idc_id; + XiePhoto tbl_id; + +{ + PhotoPtr src = (PhotoPtr) src_id; + PhotoPtr dst = _XieGetDst(src); + IdcPtr idc = (IdcPtr) idc_id; + PhotoPtr tbl = (PhotoPtr) tbl_id; + Display *dpy = ResDpy_(src); + XieSessionPtr ses = _XieGetSession(dpy); + xiePointReq *req; + + /* + ** Create request to point remap the image. + */ + XieReq_(dpy,0,SesOpCode_(ses),iePoint,req); + req->src_photo_id = ResId_(src); + req->dst_photo_id = ResId_(dst); + req->idc_id = idc == NULL ? 0 : ResId_(idc); + req->trans_photo_id = ResId_(tbl); + XieReqDone_(dpy); + + /* + ** Dst component mapping will be the same as the lookup tables. + */ + ResMap_(dst) = ResMap_(tbl); + + return( (XiePhoto) dst ); +} /* end XiePoint */ + +/******************************************************************************* +** XiePointStats +** +** FUNCTIONAL DESCRIPTION: +** +** Returns statistic information about pixel values around a point in +** the image. +** +** FORMAL PARAMETERS: +** +** src_id - id of source Photo{flo|map|tap} to be remapped. +** x - x coordinate of point +** y - y coordinate of point +** height - height of region +** width - width of region +** value - value of pixel at (x,y) +** min - minimum value of region +** max - maximum value of region +** mean - mean value of region +** stddev - standard deviation of region +** var - variance of region +** +*******************************************************************************/ +void XiePointStats(src_id, x, y, width, height, cmpmsk, stats) + XiePhoto src_id; + unsigned long x; + unsigned long y; + unsigned long height; + unsigned long width; + unsigned long cmpmsk; + XieStatsRec stats[]; +{ + PhotoPtr src = (PhotoPtr) src_id; + Display *dpy = ResDpy_(src); + XieSessionPtr ses = _XieGetSession(dpy); + xiePointStatsReply reply; + xiePointStatsReq *req; + xiePointStatsDataPtr data; + int status; + int data_bytes; + int cmpcnt; + int repidx; + int retidx; + /* + ** Create request to point remap the image. + */ + XieReq_(dpy,0,SesOpCode_(ses),iePointStats,req); + req->photo_id = ResId_(src); + req->x = x; + req->y = y; + req->height = height; + req->width = width; + /* + ** Wait for reply... + */ + status = _XReply(dpy, &reply, 0, False); + if (!status) + _XieSrvError(dpy, req->opcode, req->photo_id, reply.sequenceNumber, + BadLength, "PointStats : reply error"); + else + { + data_bytes = reply.length << 2; + cmpcnt = data_bytes / sizeof(xiePointStatsData); + data = (xiePointStatsDataPtr) XieMalloc(data_bytes); + _XRead(dpy, data, data_bytes); + + for( retidx = 0, repidx = 0; repidx < cmpcnt; repidx++ ) + if( 1<pixel); + stats[retidx].minimum = MiDecodeDouble(&data->minimum); + stats[retidx].maximum = MiDecodeDouble(&data->maximum); + stats[retidx].mean = MiDecodeDouble(&data->mean); + stats[retidx].stddev = MiDecodeDouble(&data->std_dev); + stats[retidx].variance = MiDecodeDouble(&data->variance); + retidx++; data++; + } + XieReqDone_(dpy); + + } + XieFree(data); +} /* end XiePointStats */ + +/******************************************************************************* +** XieRotate +** +** FUNCTIONAL DESCRIPTION: +** +** Create a rotated copy of a server Photomap resource. +** +** FORMAL PARAMETERS: +** +** src_id - id of source Photo{flo|map|tap} to be rotated +** angle - angle of rotation +** width - width of result Photomap (0 to allow rotate to calculate it) +** height - height of result Photomap (0 to allow rotate to calculate it) +** fill - fill pattern +** +** FUNCTION VALUE: +** +** XiePhoto - id of Photoflo passed in, or created Photomap +** +*******************************************************************************/ +XiePhoto XieRotate( src_id, angle, width, height, fill ) + XiePhoto src_id; + double angle; + unsigned long width, height, *fill; +{ + PhotoPtr dst, src = (PhotoPtr) src_id; + Display *dpy = ResDpy_(src); + XieSessionPtr ses = _XieGetSession(dpy); + CARD32 i, cmp_cnt = PhotoCount_(src); + xieQueryPhotomapReply rep; + xieRotateReq *req; + + if( fill == NULL && !_XieQueryResource( src, &rep ) ) + return( NULL ); /* if you can't query it, you can't rotate it! */ + + dst = _XieGetDst(src); + /* + ** Create a request to rotate from the src into the dst. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieRotate,req); + req->src_photo_id = ResId_(src); + req->dst_photo_id = ResId_(dst); + req->width = width; + req->height = height; + MiEncodeDouble( &req->angle, angle ); + for( i = 0; i < XieK_MaxComponents; i++ ) + req->fill[i] = i < cmp_cnt && fill != NULL ? fill[i] + : rep.polarity == XieK_ZeroBright ? 0 : ~0; + XieReqDone_(dpy); + + return( (XiePhoto) dst ); +} /* end XieRotate */ + +/******************************************************************************* +** XieScale +** +** FUNCTIONAL DESCRIPTION: +** +** Create a scaled copy of a server Photomap resource. +** +** FORMAL PARAMETERS: +** +** src_id - id of source Photo{flo|map|tap} to be scaled +** width - width of scaled Photomap +** height - height of scaled Photomap +** +** FUNCTION VALUE: +** +** XiePhoto - id of Photoflo passed in, or created Photomap +** +*******************************************************************************/ +XiePhoto XieScale( src_id, width, height ) + XiePhoto src_id; + unsigned long width; + unsigned long height; +{ + PhotoPtr src = (PhotoPtr) src_id; + PhotoPtr dst = _XieGetDst(src); + Display *dpy = ResDpy_(src); + XieSessionPtr ses = _XieGetSession(dpy); + xieScaleReq *req; + + /* + ** Create a request to scale from the src into the dst. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieScale,req); + req->src_photo_id = ResId_(src); + req->dst_photo_id = ResId_(dst); + req->width = width; + req->height = height; + XieReqDone_(dpy); + + return( (XiePhoto) dst ); +} /* end XieScale */ + +/******************************************************************************* +** XieTranslate +** +** FUNCTIONAL DESCRIPTION: +** +** Copy a region of interest from an existing Photomap resource +** into a region of interest of an existing Photomap, producing +** a new photomap. +** +** FORMAL PARAMETERS: +** +** src1_id - id of first Photo{flo|map|tap} to translate +** src1_idc_id - id of first image domain context, XieCpp or XieRoi +** src2_id - id of second Photo{map|tap} for translate +** src2_idc_id - id of second image domain context, XieCpp or XieRoi +** +*******************************************************************************/ +XiePhoto XieTranslate( src1_id, src1_idc_id, src2_id, src2_idc_id ) + XiePhoto src1_id, src2_id; + XieIdc src1_idc_id, src2_idc_id; +{ + PhotoPtr src1 = (PhotoPtr) src1_id; + PhotoPtr src2 = (PhotoPtr) src2_id; + PhotoPtr dst = FloLnk_(src1) ? FloLnk_(src1) : _XieGetDst(src2); + IdcPtr src1_idc = (IdcPtr) src1_idc_id, + src2_idc = (IdcPtr) src2_idc_id; + Display *dpy = ResDpy_(src2); + XieSessionPtr ses = _XieGetSession(dpy); + xieTranslateReq *req; + + /* + ** Create a request to translate ROI from the src into the dst. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieTranslate,req); + req->src1_photo_id = ResId_(src1); + req->src2_photo_id = ResId_(src2); + req->dst_photo_id = ResId_(dst); + req->src_idc_id = src1_idc == NULL ? 0 : ResId_(src1_idc); + req->dst_idc_id = src2_idc == NULL ? 0 : ResId_(src2_idc); + + XieReqDone_(dpy); + return( (XiePhoto) dst ); +} /* end XieTranslate */ +/* end module XieLibProcess.c */ diff --git a/xie/docs/dec/xie23-src/lib/xie/XieLibResource.c b/xie/docs/dec/xie23-src/lib/xie/XieLibResource.c new file mode 100644 index 0000000..6385a61 --- /dev/null +++ b/xie/docs/dec/xie23-src/lib/xie/XieLibResource.c @@ -0,0 +1,1336 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** X Image Extension (XIE) +** +** ABSTRACT: +** +** This module contains XIE library routines for manipulating resources. +** +** +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Robert NC Shelley +** +** CREATION DATE: +** +** March 18, 1989 +** +** MODIFICATION HISTORY: +** +*******************************************************************************/ + +/* +** Definitions required by X11 include files +*/ +#define NEED_EVENTS +#define NEED_REPLIES + +/* +** Definition to let include files know who's calling. +*/ +#define _XieLibResource + +/* +** Include files +*/ + /* + ** Standard C include files + */ +#include + /* + ** X11 and XIE include files + */ +#ifdef VMS +#include /* X11 internal lib/transport defs */ +#else +#include /* X11 internal lib/transport defs */ +#endif +#include /* XIE Req/Reply protocol defs */ +#include /* XIE public definitions */ +#include /* XIE private definitions */ + +/* +** Table of contents +*/ + /* + ** PUBLIC entry points + */ +void XieAbortFlo(); /* Abort Photoflo execution */ +void XieBindMapToFlo(); /* bind Photomap to Photoflo */ +XiePhoto XieClonePhoto(); /* Photo{flo|map} from Photomap */ +XieCpp XieCreateCpp(); /* Idc type: Cpp from args */ +XiePhoto XieCreatePhoto(); /* Photo{flo|map} from args */ +XieRoi XieCreateRoi(); /* Idc type: Roi from args */ +XieTmp XieCreateTmp(); /* Idc type: Tmp from args */ +void XieExecuteFlo(); /* Execute Photoflo pipeline */ +void XieExport(); /* export Photomap to drawable */ +XieResource XieFindResource(); /* find XieResource using XID */ +void XieFreeExport(); /* free export context */ +XieResource XieFreeResource(); /* free a server resource */ +XiePhotomap XieImport(); /* Photomap from X11 drawable */ +void XieQueryCpp(); /* query Idc type: Cpp */ +void XieQueryExport(); /* query ExportContext */ +unsigned long XieQueryFlo(); /* query Photoflo status */ +XiePhoto XieQueryMap(); /* query Photo{flo|map|tap} attr*/ +void XieQueryRoi(); /* query Idc type: Roi */ +XieTemplate XieQueryTmp(); /* query Idc type: Tmp */ +XiePhoto XieTapFlo(); /* Photo{map|tap} from Photoflo */ + /* + ** private routines called from other Xie modules. + */ +void _XieAddResource(); /* allocate XID/add resource */ +Status _XieQueryResource(); /* query a server resource */ +XieResPtr _XieGetDst(); /* return destination resource */ + /* + ** internal routines. + */ +static void FreeResource(); /* free an Xie resource */ + +/* +** MACRO definitions +*/ + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* +** Local Storage +*/ + +/******************************************************************************* +** XieAbortFlo +** +** FUNCTIONAL DESCRIPTION: +** +** Abort Photoflo execution prematurely. +** +** FORMAL PARAMETERS: +** +** flo_id - id of Photoflo to be aborted (or any bound Photo{map|tap}). +** +*******************************************************************************/ +void XieAbortFlo( flo_id ) + XiePhoto flo_id; +{ + PhotoPtr flo = FloLnk_((PhotoPtr)flo_id); + Display *dpy = ResDpy_(flo); + XieSessionPtr ses = _XieGetSession(dpy); + xieAbortPhotofloReq *req; + + /* + ** Create a request to abort the photoflo. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieAbortPhotoflo,req); + req->photoflo_id = ResId_(flo); + XieReqDone_(dpy); +} /* end XieAbortFlo */ + +/******************************************************************************* +** XieBindMapToFlo +** +** FUNCTIONAL DESCRIPTION: +** +** Bind a server Photomap resource to a server Photoflo resource. +** +** FORMAL PARAMETERS: +** +** phf_id - id of Photoflo to bind (or any bound Photo{map|tap}). +** phm_id - id of Photomap to bind to to Photoflo +** +*******************************************************************************/ +void XieBindMapToFlo( phf_id, phm_id ) + XiePhoto phf_id; + XiePhotomap phm_id; +{ + PhotoPtr phf = FloLnk_((PhotoPtr)phf_id); + PhotoPtr phm = (PhotoPtr) phm_id; + Display *dpy = ResDpy_(phf); + XieSessionPtr ses = _XieGetSession(dpy); + xieBindPhotomapReq *req; + + if( !IsPhotomap_(phm) || FloLnk_(phm) != NULL ) + return; /* consider an error message for this */ + + FloLnk_(phm) = phf; /* bind Photomap to Photoflo */ + PhotoLnk_(phm) = PhotoLnk_(phf); /* insert Photomap at the head of */ + PhotoLnk_(phf) = phm; /* ... the Photoflo's Photomap list */ + /* + ** Create request to bind the Photomap to the Photoflo. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieBindPhotomap,req); + req->photoflo_id = ResId_(phf); + req->photomap_id = ResId_(phm); + XieReqDone_(dpy); +} /* end XieBindMapToFlo */ + +/******************************************************************************* +** XieClonePhoto +** +** FUNCTIONAL DESCRIPTION: +** +** Clone a server Photo{flo|map} resource from an existing Photomap. +** +** FORMAL PARAMETERS: +** +** phm_id - Photomap id of input to Photoflo +** type - Photo type: XieK_Photoflo or XieK_Photomap +** +** FUNCTION VALUE: +** +** XiePhoto - id of created Photo{flo|map} +** +*******************************************************************************/ +XiePhoto XieClonePhoto( phm_id, type ) + XiePhotomap phm_id; + unsigned long type; +{ + PhotoPtr phm = (PhotoPtr) phm_id; + PhotoPtr pho = IsPhotomap_(phm) ? _XieGetDst(phm) : NULL; + Display *dpy = ResDpy_(phm); + XieSessionPtr ses = _XieGetSession(dpy); + xieCreateByReferenceReq *req; + + if( pho == NULL || IsPhotoflo_(pho) ) + return( NULL ); /* consider an error message for this */ + + if( type == XieK_Photoflo ) + { + FloLnk_(pho) = pho; /* link Photoflo to itself */ + FloLnk_(phm) = pho; /* bind Photomap to Photoflo */ + PhotoLnk_(pho) = phm; /* link Photomap to Photoflo */ + } + ResType_(pho) = type; + /* + ** Request a Photo{flo|map} be created by reference, using "phm_id". + */ + XieReq_(dpy,0,SesOpCode_(ses),ieCreateByReference,req); + req->resource_type = type; + req->resource_id = ResId_(pho); + req->photomap_id = ResId_(phm); + XieReqDone_(dpy); + + return( (XiePhoto) pho ); +} /* end XieClonePhoto */ + +/******************************************************************************* +** XieCreateCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Create a server control processing plane image domain context resource. +** +** FORMAL PARAMETERS: +** +** dpy - pointer to X11 display structure +** x - X Photomap registration coordinate +** y - Y Photomap registration coordinate +** phm_id - Photomap id of control processing plane +** +** FUNCTION VALUE: +** +** XieCpp - id of created image domain context, of type Cpp +** +*******************************************************************************/ +XieCpp XieCreateCpp( dpy, x, y, phm_id ) + Display *dpy; + long x, y; + XiePhotomap phm_id; +{ + PhotoPtr phm = (PhotoPtr) phm_id; + IdcPtr cpp; + XieSessionPtr ses = _XieGetSession(dpy); + xieCreateByValueReq *create; + xieCreateCppReq *req; + + if( !IsPhotomap_(phm) ) + return( NULL ); /* consider an error message for this */ + + cpp = (IdcPtr) XieCalloc(1,sizeof(XieResRec)); + + ResType_(cpp) = XieK_IdcCpp; + ResDpy_(cpp) = dpy; /* save display pointer */ + PhotoLnk_(cpp) = phm; /* linkage to Photomap */ + _XieAddResource(cpp); /* add to resource list */ + + XieReqExtra_(dpy,0,SesOpCode_(ses),ieCreateByValue,create, + sz_xieCreateCppReq-sz_xieCreateByValueReq); + req = (xieCreateCppReq *) create; + req->resource_type = ResType_(cpp); + req->resource_id = ResId_(cpp); + req->x = x; + req->y = y; + req->photomap_id = ResId_(phm); + XieReqDone_(dpy); + + return( (XieCpp) cpp ); +} /* end XieCreateCpp */ + +/******************************************************************************* +** XieCreatePhoto +** +** FUNCTIONAL DESCRIPTION: +** +** Create a server Photoflo or Photomap resource. +** +** FORMAL PARAMETERS: +** +** dpy - pointer to X11 display structure +** type - XieK_Photoflo or XieK_Photomap +** width - width +** height - height +** cmp_map - component mapping +** cmp_cnt - component count +** cmp_lvl - levels-per-component list +** pxl_pol - pixel brightness polarity +** pxl_ratio - pixel aspect ratio +** pxl_prog - pixel progression +** scn_prog - line progression +** +** FUNCTION VALUE: +** +** XiePhoto - id of created Photo{flo|map} +** +*******************************************************************************/ +XiePhoto XieCreatePhoto( dpy, type, width, height, cmp_map, cmp_cnt, cmp_lvl, + pxl_pol, pxl_ratio, pxl_prog, scn_prog ) + Display *dpy; + unsigned long width, height, *cmp_lvl; + unsigned char type, cmp_map, cmp_cnt, pxl_pol, pxl_prog, scn_prog; + double pxl_ratio; + +{ + XieSessionPtr ses = _XieGetSession(dpy); + xieCreateByValueReq *create; + xieCreatePhotoReq *req; + CARD32 i; + + PhotoPtr pho = (PhotoPtr) XieCalloc(1,sizeof(XieResRec)); + + ResType_(pho) = type; + ResMap_(pho) = cmp_map; /* component mapping */ + ResDpy_(pho) = dpy; /* display pointer */ + FloLnk_(pho) = IsPhotoflo_(pho) ? pho : NULL; /* link self if Photoflo*/ + _XieAddResource(pho); /* add to resource list */ + /* + ** Create request to establish a Photo{flo|map}. + */ + XieReqExtra_(dpy,0,SesOpCode_(ses),ieCreateByValue,create, + sz_xieCreatePhotoReq-sz_xieCreateByValueReq); + req = (xieCreatePhotoReq *) create; + req->resource_type = type; + req->resource_id = ResId_(pho); + req->width = width; + req->height = height; + req->number_of_components = cmp_cnt; + req->component_mapping = cmp_map; + req->pixel_progression = pxl_prog; + req->line_progression = scn_prog; + req->polarity = pxl_pol; + MiEncodeDouble( &req->aspect_ratio, pxl_ratio ); + for( i = 0; i < XieK_MaxComponents; i++ ) + req->levels[i] = i < cmp_cnt ? cmp_lvl[i] : 0; + + XieReqDone_(dpy); + + return( (XiePhoto) pho ); +} /* end XieCreatePhoto */ + +/******************************************************************************* +** XieCreateRoi +** +** FUNCTIONAL DESCRIPTION: +** +** Create a server region of interest image domain context resource. +** +** FORMAL PARAMETERS: +** +** dpy - pointer to X11 display structure +** x - X Photomap registration coordinate +** y - Y Photomap registration coordinate +** width - width of region +** height - height of region +** +** FUNCTION VALUE: +** +** XieRoi - id of created image domain context, of type Roi +** +*******************************************************************************/ +XieRoi XieCreateRoi( dpy, x, y, width, height ) + Display *dpy; + long x, y; + unsigned long width, height; +{ + XieSessionPtr ses = _XieGetSession(dpy); + xieCreateByValueReq *create; + xieCreateRoiReq *req; + + IdcPtr roi = (IdcPtr) XieCalloc(1,sizeof(XieResRec)); + + ResType_(roi) = XieK_IdcRoi; + ResDpy_(roi) = dpy; /* save display pointer */ + _XieAddResource(roi); /* add to resource list */ + /* + ** Create request to establish an Roi. + */ + XieReqExtra_(dpy,0,SesOpCode_(ses),ieCreateByValue,create, + sz_xieCreateRoiReq-sz_xieCreateByValueReq); + req = (xieCreateRoiReq *) create; + req->resource_type = ResType_(roi); + req->resource_id = ResId_(roi); + req->x = x; + req->y = y; + req->width = width; + req->height = height; + XieReqDone_(dpy); + + return( (XieRoi) roi ); +} /* end XieCreateRoi */ + +/******************************************************************************* +** XieCreateTmp +** +** FUNCTIONAL DESCRIPTION: +** +** Create a server template image domain context resource. +** +** FORMAL PARAMETERS: +** +** dpy - pointer to X11 display structure +** x - X coordinate of center of template +** y - Y coordinate of center of template +** count - number of XieTemplateRec's in list +** list - array of XieTemplateRec +** +** FUNCTION VALUE: +** +** XieTmp - id of created image domain context, of type Tmp +** +*******************************************************************************/ +XieTmp XieCreateTmp( dpy, x, y, count, list ) + Display *dpy; + long x, y; + unsigned long count; + XieTemplate list; +{ + XieSessionPtr ses = _XieGetSession(dpy); + xieCreateByValueReq *create; + xieCreateTmpReq *req; + XieTmpEntryRec *data; + CARD32 i; + IdcPtr tmp = (IdcPtr) XieCalloc(1,sizeof(XieResRec)); + + ResType_(tmp) = XieK_IdcTmp; + ResDpy_(tmp) = dpy; /* save display pointer */ + _XieAddResource(tmp); /* add to resource list */ + + XieReqExtra_(dpy,0,SesOpCode_(ses),ieCreateByValue,create, + sz_xieCreateTmpReq-sz_xieCreateByValueReq + +sizeof(XieTmpEntryRec)*count); + req = (xieCreateTmpReq *) create; + req->resource_type = ResType_(tmp); + req->resource_id = ResId_(tmp); + req->center_x = x; + req->center_y = y; + req->data_count = count; + for( data = (XieTmpEntryRec *) &req[1], i = 0; i < count; i++ ) + { + data[i].x = list[i].x; + data[i].y = list[i].y; + MiEncodeDouble( &data[i].value, list[i].value ); + } + XieReqDone_(dpy); + return( (XieTmp) tmp ); +} /* end XieCreateTmp */ + +/******************************************************************************* +** XieExecuteFlo +** +** FUNCTIONAL DESCRIPTION: +** +** Begin Photoflo execution. +** +** FORMAL PARAMETERS: +** +** flo_id - id of Photoflo to be executed (or any bound Photo{map|tap}). +** +*******************************************************************************/ +void XieExecuteFlo( flo_id ) + XiePhoto flo_id; +{ + PhotoPtr flo = FloLnk_((PhotoPtr)flo_id); + Display *dpy = ResDpy_(flo); + XieSessionPtr ses = _XieGetSession(dpy); + xieExecutePhotofloReq *req; + + /* + ** Create a request to execute the photoflo. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieExecutePhotoflo,req); + req->photoflo_id = ResId_(flo); + XieReqDone_(dpy); +} /* end XieExecuteFlo */ + +/******************************************************************************* +** XieExport +** +** FUNCTIONAL DESCRIPTION: +** +** Export image data from a Photomap to an X11 drawable. +** +** FORMAL PARAMETERS: +** +** src_id - id of source Photo{flo|map|tap} to export from +** d - drawable id +** gc - graphics context id +** sx, sy - from Photomap X,Y coordinate +** dx, dy - to drawable X,Y coordinate +** w, h - dimensions of region to be exported +** lut_id - optional: LUT to map pixels to pre-allocated palette +** cmap_id - optional: X11 colormap assigned to target drawable +** match - optional: granularity for pixel matching +** gray - optional: purity of gray shades +** +*******************************************************************************/ +void XieExport( src_id, d, gc, sx,sy, dx,dy, w,h, lut_id, cmap_id, match, gray ) + XiePhoto src_id, lut_id; + Drawable d; + GC gc; + long sx, sy, dx, dy; + unsigned long w, h; + Colormap cmap_id; + double match, gray; +{ + PhotoPtr src = (PhotoPtr) src_id; + Display *dpy = ResDpy_(src); + XieSessionPtr ses = _XieGetSession(dpy); + xieExportReq *req; + /* + ** Create request to export image data from Photomap to drawable. + */ + XieReq_(dpy,gc,SesOpCode_(ses),ieExport,req); + req->photo_id = ResId_(src); + req->drawable_id = d; + req->gc_id = gc->gid; + req->src_x = sx; + req->src_y = sy; + req->width = w; + req->height = h; + req->dst_x = dx; + req->dst_y = dy; + req->photo_lut_id = lut_id == 0 ? 0 : XId_(lut_id); + req->colormap_id = cmap_id; + MiEncodeDouble( &req->match_limit, match ); + MiEncodeDouble( &req->gray_limit, gray ); + XieReqDone_(dpy); +} /* end XieExport */ + +/******************************************************************************* +** XieFindResource +** +** FUNCTIONAL DESCRIPTION: +** +** Find an XieResource using the resource's X11 XID. +** +** FORMAL PARAMETERS: +** +** dpy - pointer to X11 display structure +** id - resource's X11 XID +** +** FUNCTION VALUE: +** +** XieResource - XieResource id +** +*******************************************************************************/ +XieResource XieFindResource( dpy, id ) + Display *dpy; + XID id; +{ + XieResPtr res; + XieSessionPtr ses = _XieGetSession(dpy); + + for( res = SesResLst_(ses); res != NULL; res = ResLnk_(res) ) + if( ResId_(res) == id ) + break; + + return( (XieResource) res ); +} /* end XieFindResource */ + +/******************************************************************************* +** XieFreeExport +** +** FUNCTIONAL DESCRIPTION: +** +** Free ExportContext. +** +** FORMAL PARAMETERS: +** +** src_id - id of source Photo{flo|map|tap} +** +*******************************************************************************/ +void XieFreeExport( src_id ) + XiePhoto src_id; +{ + PhotoPtr src = (PhotoPtr) src_id; + Display *dpy = ResDpy_(src); + XieSessionPtr ses = _XieGetSession(dpy); + xieFreeExportReq *req; + /* + ** Create a request to free ExportContext. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieFreeExport,req); + req->photo_id = ResId_(src); + XieReqDone_(dpy); +} /* end XieFreeExport */ + +/******************************************************************************* +** XieFreeResource +** +** FUNCTIONAL DESCRIPTION: +** +** Free a server image extension resource +** +** FORMAL PARAMETERS: +** +** res_id - id of resource to be freed +** +** FUNCTION VALUE: +** +** NULL +** +*******************************************************************************/ +XieResource XieFreeResource( res_id ) + XieResource res_id; +{ + XieResPtr res = (XieResPtr) res_id; + PhotoPtr phm, nxt; + + if( res != NULL ) + switch( ResType_(res) ) + { + case XieK_Photoflo : + for( phm = PhotoLnk_(res); phm != NULL; phm = nxt ) + { + nxt = PhotoLnk_(phm); + PhotoLnk_(phm) = NULL; /* zap Photo{map|tap} list */ + FloLnk_(phm) = NULL; /* zap Photoflo binding */ + if( IsPhototap_(phm) ) + FreeResource(phm); /* free the Phototap */ + } + FreeResource( res ); /* free the Photoflo */ + break; + + case XieK_Photomap : + case XieK_Phototap : + if( FloLnk_(res) != NULL ) + /* + ** Unbind this Photo{map|tap} from the Photoflo. + */ + for( phm = FloLnk_(res); phm != NULL; phm = PhotoLnk_(phm) ) + if( PhotoLnk_(phm) == res ) + PhotoLnk_(phm) = PhotoLnk_(PhotoLnk_(phm)); + + FreeResource( res ); /* free Photo{map|tap} resource */ + break; + + case XieK_IdcCpp : + case XieK_IdcRoi : + case XieK_IdcTmp : + FreeResource( res ); /* free Idc type resource */ + break; + } + return( NULL ); +} /* end XieFreeResource */ + +/******************************************************************************* +** XieImport +** +** FUNCTIONAL DESCRIPTION: +** +** Import image data from an X11 drawable into a new Photomap. +** +** FORMAL PARAMETERS: +** +** dpy - pointer to X11 display structure +** drawable- drawable id +** cmap_id - X11 colormap id +** pxl_pol - pixel brightness polarity +** +** FUNCTION VALUE: +** +** XiePhotomap - id of created Photomap +** +*******************************************************************************/ +XiePhotomap XieImport( dpy, drawable, cmap_id, pxl_pol ) + Display *dpy; + Drawable drawable; + Colormap cmap_id; + unsigned char pxl_pol; +{ + XieSessionPtr ses = _XieGetSession(dpy); + xieImportReq *req; + xieQueryPhotomapReply rep; + PhotoPtr phm = (PhotoPtr) XieCalloc(1,sizeof(XieResRec)); + + ResType_(phm) = XieK_Photomap; /* resource type */ + ResDpy_(phm) = dpy; /* copy display pointer */ + _XieAddResource(phm); /* add to our resource list */ + /* + ** Create request to import image data from drawable to Photomap. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieImport,req); + req->photomap_id = ResId_(phm); + req->drawable_id = drawable; + req->colormap_id = cmap_id; + req->polarity = pxl_pol; + XieReqDone_(dpy); + + if( _XieQueryResource( phm, &rep ) ) + { + ResMap_(phm) = rep.component_mapping; + XieReqDone_(dpy); + } + + return( (XiePhotomap) phm ); +} /* end XieImport */ + +/******************************************************************************* +** XieQueryCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Obtain control processing plane context from server. +** +** FORMAL PARAMETERS: +** +** cpp_id - Cpp id +** x_ret - X return pointer +** y_ret - Y return pointer +** phm_ret - Photomap return pointer +** +*******************************************************************************/ +void XieQueryCpp( cpp_id, x_ret, y_ret, phm_ret ) + XieCpp cpp_id; + long *x_ret, *y_ret; + XiePhotomap *phm_ret; +{ + IdcPtr cpp = (IdcPtr) cpp_id; + Display *dpy = ResDpy_(cpp); + xieQueryCppReply rep; + + /* + ** Query the Cpp. + */ + if( _XieQueryResource( cpp, &rep ) ) + { + XieReqDone_(dpy); + /* + ** Unload the reply packet. + */ + if( x_ret != NULL ) + *x_ret = rep.x; + if( y_ret != NULL ) + *y_ret = rep.y; + if( phm_ret != NULL ) + *phm_ret = (XiePhotomap) PhotoLnk_(cpp); + } +} /* end XieQueryCpp */ + +/******************************************************************************* +** XieQueryExport +** +** FUNCTIONAL DESCRIPTION: +** +** Return ExportContext LUT and allocated pixel list. +** +** FORMAL PARAMETERS: +** +** pho_id - Photoflo id (or any bound Photo{map|tap}). +** lut_id_ret - where to stash returned LUT_id (or NULL). +** pxl_lst_ret - where to stash returned pixel list pointer +** (none are returned if pxl_lst or pxl_cnt are NULL). +** pxl_cnt_ret - where to stash count of allocated pixels. +** +*******************************************************************************/ +void XieQueryExport( pho_id, lut_id_ret, pxl_lst_ret, pxl_cnt_ret ) + XiePhoto pho_id; + XiePhotomap *lut_id_ret; + unsigned long **pxl_lst_ret; + unsigned long *pxl_cnt_ret; +{ + PhotoPtr pho = (PhotoPtr) pho_id; + PhotoPtr *lut = (PhotoPtr *) lut_id_ret; + Display *dpy = ResDpy_(pho); + unsigned long *pxl = NULL; + XieSessionPtr ses = _XieGetSession(dpy); + xieQueryExportReq *req; + xieQueryExportReply rep; + + if( lut != NULL ) + { /* + ** Begin to create a Photomap record for the LUT. + */ + *lut = (PhotoPtr) XieCalloc(1,sizeof(XieResRec)); + ResType_(*lut) = XieK_Photomap; /* resource type for lut */ + ResDpy_(*lut) = dpy; /* copy display pointer */ + ResId_(*lut) = XAllocID(dpy); /* resource id for lut */ + } + /* + ** Query the ExportContext. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieQueryExport,req); + req->photo_id = ResId_(pho); + req->lut_id = lut != NULL ? ResId_(*lut) : 0; + req->get_pixels = pxl_lst_ret != NULL && pxl_cnt_ret != NULL; + + if( !_XReply( dpy, &rep, 0, !req->get_pixels ) ) + { /* + ** Reply error. + */ + _XieSrvError( dpy, req->opcode, req->photo_id, rep.sequenceNumber, + BadLength, "QueryExport: reply error" ); + + if( lut != NULL ) + *lut = (PhotoPtr) XieFree( *lut ); /* no lut on error */ + rep.pixel_count = 0; /* no pixel count on error */ + } + else + { + if( rep.length > 0 ) + { /* + ** Get the allocated pixel list. + */ + pxl = (unsigned long *) XieMalloc(rep.pixel_count * + sizeof(unsigned long)); + /* + ** Pixels from X are ALWAYS CARD32's. + */ + _XRead( dpy, pxl, rep.length * sizeof(CARD32)); + /* + ** If longs are greater than CARD32's, space the data out from + ** the CARD32 array to fill out the long array. + */ + if (sizeof (CARD32) != sizeof (unsigned long)) + { + unsigned long *pxl_long = (pxl + rep.length - 1); + CARD32 *pxl_card32 = (((CARD32 *)pxl) + rep.length - 1); + + while (pxl_long >= pxl) + *pxl_long-- = (unsigned long)*pxl_card32--; + } + } + XieReqDone_(dpy); /* unlock the display */ + + if( lut != NULL ) + if( rep.lut_id == ResId_(*lut) ) + { /* + ** Finish creating the LUT's Photomap. + */ + ResMap_(*lut) = rep.lut_mapping; + ResLnk_(*lut) = SesResLst_(ses); + SesResLst_(ses) = *lut; + } + else + { /* + ** Trash new LUT -- instead find LUT returned in reply. + */ + *lut = (PhotoPtr) XieFree( *lut ); + if( rep.lut_id != 0 ) + *lut_id_ret = XieFindResource( dpy, rep.lut_id ); + } + } + if( pxl_lst_ret != NULL ) + *pxl_lst_ret = pxl; /* return pixel list, if any*/ + + if( pxl_cnt_ret != NULL ) + *pxl_cnt_ret = rep.pixel_count; /* return pixel count */ + +} /* end XieQueryExport */ + +/******************************************************************************* +** XieQueryFlo +** +** FUNCTIONAL DESCRIPTION: +** +** Obtain Photoflo status from server. +** +** FORMAL PARAMETERS: +** +** phf_id - Photoflo id (or any bound Photo{map|tap}). +** +** FUNCTION VALUE: +** +** status +** +*******************************************************************************/ +unsigned long XieQueryFlo( phf_id ) + XiePhoto phf_id; +{ + PhotoPtr phf = FloLnk_((PhotoPtr)phf_id); + Display *dpy = ResDpy_(phf); + XieSessionPtr ses = _XieGetSession(dpy); + xieQueryResourceReq *req; + xieQueryPhotofloReply rep; + + /* + ** Query the Photoflo. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieQueryResource,req); + req->resource_type = ResType_(phf); + req->resource_id = ResId_(phf); + + if( !_XReply( dpy, &rep, 0, True ) ) + _XieSrvError( dpy, req->opcode, req->resource_id, rep.sequenceNumber, + BadLength, "QueryPhotoflo: reply error" ); + else + XieReqDone_(dpy); + + return( rep.status ); +} /* end XieQueryFlo */ + +/******************************************************************************* +** XieQueryMap +** +** FUNCTIONAL DESCRIPTION: +** +** Obtain Photomap attributes from Photo{flo|map|tap}. +** +** FORMAL PARAMETERS: +** +** pho_id - Photo{flo|map|tap} id +** width_ret - width return pointer +** height_ret - height return pointer +** cmp_map_ret - component mapping return pointer +** cmp_cnt_ret - component count return pointer +** cmp_lvl_ret - levels-per-component return pointer +** pxl_pol_ret - polarity return pointer +** pxl_ratio_ret - aspect ratio return pointer +** pxl_prog_ret - pixel progression return pointer +** scn_prog_ret - line progression return pointer +** constrained_ret - constrained flag return pointer +** +** FUNCTION VALUE: +** +** XiePhoto - id of queried Photo +** +*******************************************************************************/ +XiePhoto XieQueryMap( pho_id, width_ret, height_ret, + cmp_map_ret, cmp_cnt_ret, cmp_lvl_ret, + pxl_pol_ret, pxl_ratio_ret, pxl_prog_ret, + scn_prog_ret, constrained_ret ) + XiePhoto pho_id; + unsigned long *width_ret; + unsigned long *height_ret; + unsigned char *cmp_map_ret; + unsigned char *cmp_cnt_ret; + unsigned long *cmp_lvl_ret; + unsigned char *pxl_pol_ret; + double *pxl_ratio_ret; + unsigned char *pxl_prog_ret; + unsigned char *scn_prog_ret; + unsigned char *constrained_ret; + +{ + PhotoPtr pho = (PhotoPtr) pho_id; + Display *dpy = ResDpy_(pho); + xieQueryPhotomapReply rep; + CARD32 i; + + /* + ** Query the Photo{flo|map|tap} for Photomap attributes. + */ + if( _XieQueryResource( pho, &rep ) ) + { + XieReqDone_(dpy); + /* + ** Unload the reply packet. + */ + if( width_ret != NULL ) + *width_ret = rep.width; + if( height_ret != NULL ) + *height_ret = rep.height; + if( cmp_map_ret != NULL ) + *cmp_map_ret = rep.component_mapping; + if( cmp_cnt_ret != NULL ) + *cmp_cnt_ret = rep.component_count; + if( pxl_pol_ret != NULL ) + *pxl_pol_ret = rep.polarity; + if( pxl_ratio_ret != NULL ) + *pxl_ratio_ret = MiDecodeDouble( &rep.aspect_ratio ); + if( pxl_prog_ret != NULL ) + *pxl_prog_ret = rep.pixel_progression; + if( scn_prog_ret != NULL ) + *scn_prog_ret = rep.line_progression; + if( constrained_ret != NULL ) + *constrained_ret = rep.constrained; + if( cmp_lvl_ret != NULL ) + for( i = 0; i < XieK_MaxComponents; i++ ) + cmp_lvl_ret[i] = i < rep.component_count ? rep.levels[i] : 0; + } + return( rep.photo_id == 0 ? NULL : rep.photo_id == ResId_(pho) ? pho_id + : XieFindResource( dpy, rep.photo_id )); +} /* end XieQueryMap */ + +/******************************************************************************* +** XieQueryRoi +** +** FUNCTIONAL DESCRIPTION: +** +** Obtain region of interest context from server. +** +** FORMAL PARAMETERS: +** +** roi_id - Roi id +** x_ret - X return pointer +** y_ret - Y return pointer +** width_ret - width return pointer +** height_ret - height return pointer +** +*******************************************************************************/ +void XieQueryRoi( roi_id, x_ret, y_ret, width_ret, height_ret ) + XieRoi roi_id; + long *x_ret, *y_ret; + unsigned long *width_ret, *height_ret; +{ + IdcPtr roi = (IdcPtr) roi_id; + Display *dpy = ResDpy_(roi); + xieQueryRoiReply rep; + + /* + ** Query the Roi. + */ + if( _XieQueryResource( roi, &rep ) ) + { + XieReqDone_(dpy); + /* + ** Unload the reply packet. + */ + if( x_ret != NULL ) + *x_ret = rep.x; + if( y_ret != NULL ) + *y_ret = rep.y; + if( width_ret != NULL ) + *width_ret = rep.width; + if( height_ret != NULL ) + *height_ret = rep.height; + } +} /* end XieQueryRoi */ + +/******************************************************************************* +** XieQueryTmp +** +** FUNCTIONAL DESCRIPTION: +** +** Obtain template context from server. +** +** FORMAL PARAMETERS: +** +** tmp_id - Tmp id +** x_ret - center X return pointer +** y_ret - center Y return pointer +** count_ret - XieTemplateRec count return pointer +** +** FUNCTION VALUE: +** +** XieTemplate - pointer to list of XieTemplateRec (dealloc with XieFree) +** +*******************************************************************************/ +XieTemplate XieQueryTmp( tmp_id, x_ret, y_ret, count_ret ) + XieTmp tmp_id; + long *x_ret, *y_ret; + unsigned long *count_ret; +{ + IdcPtr tmp = (IdcPtr) tmp_id; + Display *dpy = ResDpy_(tmp); + xieQueryTmpReply rep; + XieTemplate data = NULL; + XieTmpEntryRec entry; + CARD32 i; + + if( _XieQueryResource( tmp, &rep ) ) + { + if( x_ret != NULL ) + *x_ret = rep.center_x; + if( y_ret != NULL ) + *y_ret = rep.center_y; + if( count_ret != NULL ) + *count_ret = rep.data_count; + + data = (XieTemplate) XieMalloc(rep.data_count*sizeof(XieTemplateRec)); + + for( i = 0; i < rep.data_count; i++ ) + { + _XRead( dpy, &entry, sizeof(XieTemplateRec) ); + data[i].x = entry.x; + data[i].y = entry.y; + data[i].value = MiDecodeDouble( &entry.value ); + } + XieReqDone_(dpy); + } + return( data ); +} /* end XieQueryTmp */ + +/******************************************************************************* +** XieTapFlo +** +** FUNCTIONAL DESCRIPTION: +** +** Get a Photo{map|tap}-id for the Photomap at the of a Photoflo. +** +** FORMAL PARAMETERS: +** +** flo_id - Photoflo id (or any bound Photo{map|tap}). +** permanent - Boolean: true=permanent Photomap, false=ephemeral Phototap +** +** FUNCTION VALUE: +** +** XiePhoto - id of permanent Photomap or ephemeral Phototap +** +*******************************************************************************/ +XiePhoto XieTapFlo( flo_id, permanent ) + XiePhoto flo_id; + unsigned char permanent; +{ + PhotoPtr flo = FloLnk_((PhotoPtr)flo_id); + Display *dpy = ResDpy_(flo); + XieSessionPtr ses = _XieGetSession(dpy); + xieTapPhotofloReq *req; + + PhotoPtr tap = (PhotoPtr) XieMalloc(sizeof(XieResRec)); + *tap = *flo; + ResType_(tap) = permanent ? XieK_Photomap : XieK_Phototap; + PhotoLnk_(flo) = tap; /* bind to Photoflo */ + _XieAddResource(tap); /* add to the resource list */ + /* + ** Create request to tap the end of the Photoflo. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieTapPhotoflo,req); + req->photoflo_id = ResId_(flo); + req->photo_id = ResId_(tap); + req->permanent = permanent; + XieReqDone_(dpy); + + return( (XiePhoto) tap ); +} /* end XieTapFlo */ + +/******************************************************************************* +** _XieAddResource +** +** FUNCTIONAL DESCRIPTION: +** +** Add an XieResource to our resource list. +** +** FORMAL PARAMETERS: +** +** res - resource pointer +** +*******************************************************************************/ +void _XieAddResource( res ) + XieResPtr res; +{ + Display *dpy = ResDpy_(res); + XieSessionPtr ses = _XieGetSession(dpy); + + /* + ** Allocate an X11 resource-id. + */ + ResId_(res) = XAllocID(dpy); + + /* + ** Stash the new resource at the head of the list. + */ + ResLnk_(res) = SesResLst_(ses); + SesResLst_(ses) = res; +} /* end _XieAddResource */ + +/******************************************************************************* +** _XieGetDst +** +** FUNCTIONAL DESCRIPTION: +** +** Create or point to an Xie destination resource. +** +** FORMAL PARAMETERS: +** +** src - pointer to source resource. +** +** FUNCTION VALUE: +** +** XieResPtr - pointer to destination +** +*******************************************************************************/ +XieResPtr _XieGetDst( src ) + XieResPtr src; +{ + XieResPtr dst; + + if( FloLnk_(src) == NULL ) + { + /* + ** Create a new destination resource of the same type. + */ + dst = (XieResPtr) XieMalloc(sizeof(XieResRec)); + *dst = *src; + _XieAddResource(dst); + } + else + /* + ** Destination is the binding Photoflo. + */ + dst = FloLnk_(src); + + return( dst ); +} /* end _XieGetDst */ + +/******************************************************************************* +** _XieQueryResource +** +** FUNCTIONAL DESCRIPTION: +** +** Obtain resource information from server. +** +** FORMAL PARAMETERS: +** +** res - pointer to resource to be queried +** reply - pointer to reply structure +** +** FUNCTION VALUE: +** +** Boolean - True if reply is successful +** +*******************************************************************************/ +Status _XieQueryResource( res, reply ) + XieResPtr res; + xGenericReply *reply; +{ + Display *dpy = ResDpy_(res); + XieSessionPtr ses = _XieGetSession(dpy); + xieQueryResourceReq *req; + Status status; + + /* + ** Create request to query the specified resource. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieQueryResource,req); + req->resource_type = IsPhoto_(res) ? XieK_Photomap : ResType_(res); + req->resource_id = ResId_(res); + + status = _XReply( dpy, reply, 0, !(IsPhoto_(res) || IsTmp_(res)) ); + + if( !status ) + _XieSrvError(dpy, req->opcode, req->resource_id, reply->sequenceNumber, + BadLength, "QueryResource: reply error"); + + else if( IsPhoto_(res) ) + _XRead( dpy, &reply[1], reply->length<<2 ); + + return( status ); +} /* end _XieQueryResource */ + +/******************************************************************************* +** FreeResource +** +** FUNCTIONAL DESCRIPTION: +** +** Free an Xie resource +** +** FORMAL PARAMETERS: +** +** res - pointer to resource to be freed +** +*******************************************************************************/ +static void FreeResource( res ) + XieResPtr res; +{ + Display *dpy = ResDpy_(res); + XieSessionPtr ses = _XieGetSession(dpy); + XieResPtr lst; + xieDeleteResourceReq *req; + + /* + ** Remove this resource from our resource list. + */ + if( SesResLst_(ses) == res ) + SesResLst_(ses) = ResLnk_(res); + else + for( lst = SesResLst_(ses); lst != NULL; lst = ResLnk_(lst) ) + if( ResLnk_(lst) == res ) + { + ResLnk_(lst) = ResLnk_(res); + break; + } + + if( !IsPhototap_(res) ) + { /* + ** Create a request to delete the server resource. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieDeleteResource,req); + req->resource_type = ResType_(res); + req->resource_id = ResId_(res); + XieReqDone_(dpy); + } + XieFree( res ); +} /* end FreeResource */ +/* end module XieLibResource.c */ diff --git a/xie/docs/dec/xie23-src/lib/xie/XieLibSession.c b/xie/docs/dec/xie23-src/lib/xie/XieLibSession.c new file mode 100644 index 0000000..14ef8fa --- /dev/null +++ b/xie/docs/dec/xie23-src/lib/xie/XieLibSession.c @@ -0,0 +1,587 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** X Image Extension (XIE) +** +** ABSTRACT: +** +** This module contains XIE library routines for session managment. +** +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Robert NC Shelley +** +** CREATION DATE: +** +** March 18, 1989 +** +** MODIFICATION HISTORY: +** +*******************************************************************************/ + +/* +** Definitions required by X11 include files +*/ +#define NEED_EVENTS +#define NEED_REPLIES + +/* +** Definition to let include files know who's calling. +*/ +#define _XieLibSession + +/* +** Include files +*/ + /* + ** Standard C include files + */ +#include + + /* + ** X11 and XIE include files + */ +#ifdef VMS +#include /* X11 internal lib/transport defs */ +#else +#include /* X11 internal lib/transport defs */ +#endif +#include /* XIE client/server common defs */ +#include /* XIE Req/Reply protocol defs */ +#include /* XIE public definitions */ +#include /* XIE private definitions */ + +/* +** Table of contents +*/ + /* + ** PUBLIC entry points + */ +char *XieCheckFunction(); /* check server support of single function */ +char **XieListFunctions(); /* list server support of all functions */ + +void XieSetOpDefaults(); +void XieQueryOpDefaults(); + + /* + ** Low level global entry points + */ +XieSessionPtr _XieGetSession(); /* get session info for display */ + /* + ** internal routines + */ +static XExtCodes *InitExtension(); /* initialize server extension */ +static XieSessionPtr InitSession(); /* initiate a session */ +int CloseDisplayProc();/* what to do on close display */ +static int FindDpyNum(); /* stub for multi-dpy support */ + +/* +** MACRO definitions +*/ + /* + ** On VMS the connection number is not obtained per THE book (pg 499). + */ +#ifdef VMS +#define DpyNumber_(dpy) (dpy->next ? FindDpyNum(dpy) : 0) +#else +#define DpyNumber_(dpy) ((dpy)->fd) +#endif + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* +** Local/Global Storage +*/ + /* + ** Array of XieSessionPtr for session wide information. + ** This should really be the maximum number of open files + ** the process can have (like NOFILE from ) but there + ** doesn't seem to be a portable way to do that. + */ +static XieSessionPtr Session[64] = {NULL}; + + /* + ** Flag that controls packet tracing on the client side. + */ +externaldef(xiePacketTrace) BOOL xiePacketTrace; + + /* + ** Array of Xie protocol function names. + */ +externaldef(XieFunctionName) char *_XieFunctionName[256] = { + NULL, + "X_ieInitSession", + "X_ieTermSession", + "X_ieQueryEvents", + "X_ieSelectEvents", + "X_ieSetOpDefaults", + "X_ieQueryOpDefaults", + "X_ieCreateByReference", + "X_ieCreateByValue", + "X_ieDeleteResource", + "X_ieQueryResource", + "X_ieBindPhotomap", + "X_ieAbortPhotoflo", + "X_ieExecutePhotoflo", + "X_ieTapPhotoflo", + "X_ieAbortTransport", + "X_ieGetStream", + "X_ieGetTile", + "X_iePutStream", + "X_iePutTile", + "X_ieSetTransport", + "X_ieExport", + "X_ieFreeExport", + "X_ieImport", + "X_ieQueryExport", + "X_ieArea", + "X_ieAreaStats", + "X_ieArith", + "X_ieCalcHist", + "X_ieChromeCom", + "X_ieChromeSep", + "X_ieCompare", + "X_ieConstrain", + "X_ieCrop", + "X_ieDither", + "X_ieFill", + "X_ieLogical", + "X_ieLuminance", + "X_ieMatchHistogram", + "X_ieMathf", + "X_ieMirror", + "X_iePoint", + "X_iePointStats", + "X_ieRotate", + "X_ieScale", + "X_ieTranslate", + NULL}; + +/******************************************************************************* +** XieCheckFunction +** +** FUNCTIONAL DESCRIPTION: +** +** Return the pointer to the protocol name string for the requested +** protocol function. The pointer is NULL if not implemented. +** +** FORMAL PARAMETERS: +** +** dpy - pointer to X11 display structure +** function - minor-opcode of function requested +** +** FUNCTION VALUE: +** +** string pointer - DO NOT free ! +** +*******************************************************************************/ +char *XieCheckFunction( dpy, function ) + Display *dpy; + int function; +{ + Bool supported = False; + char *name; + + if( function < 8 * sizeof(XieSessionRec) ) + /* + ** See if this function is supported. + */ + supported = GET_VALUE_( SesFunVec_(_XieGetSession(dpy)), function, 1 ); + + /* + ** Set the function name string pointer. + */ + name = supported ? _XieFunctionName[function] : NULL; + + return( name ); +} /* end XieCheckFunction */ + +/******************************************************************************* +** XieListFunctions +** +** FUNCTIONAL DESCRIPTION: +** +** Return an array of pointers to the protocol name strings for all +** supported Xie protocol functions. NULL pointers are returned for +** functions that are not yet implemented or unsupported by the server. +** +** FORMAL PARAMETERS: +** +** dpy - pointer to X11 display structure +** +** FUNCTION VALUE: +** +** array of string pointers - use XieFree to free array, don't free strings +** +*******************************************************************************/ +char **XieListFunctions( dpy ) + Display *dpy; +{ + int function; + char **strings = (char **) XieMalloc(256 * sizeof(char *)); + + for( function = 0; function < 256; function++ ) + strings[function] = XieCheckFunction(dpy, function); + + return( strings ); +} /* end XieListFunctions */ + +/******************************************************************************* +** XieSetOpDefaults +** +** FUNCTIONAL DESCRIPTION: +** +** Set the operational defaults associated with a session. +** +** FORMAL PARAMETERS: +** dpy - pointer to X11 display structure +** model - Constraint model to be used: +** {XieK_HardClip, XieK_ClipScale, XieK_HardScale} +** levels - Array of levels to constrain each component. +** +** +*******************************************************************************/ +void XieSetOpDefaults( dpy, model, levels) + Display *dpy; + int model; + unsigned long int levels[XieK_MaxComponents]; +{ + XieSessionPtr ses = _XieGetSession(dpy); + xieSetOpDefaultsReq *req; + int i; + + /* + ** Create a request to set the session operational defaults. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieSetOpDefaults,req); + req->model = model; + for( i = 0; i < XieK_MaxComponents; i++) + req->levels[i] = levels[i]; + XieReqDone_(dpy); +} /* end XieSetOpDefaults */ + +/******************************************************************************* +** XieQueryOpDefaults +** +** FUNCTIONAL DESCRIPTION: +** +** Obtain session operational defaults info from the server. +** +** FORMAL PARAMETERS: +** +** dpy - Pointer to X11 display structure +** model_ret - Constraint model return pointer +** levels_ret - Constraint levels array +** +*******************************************************************************/ +void XieQueryOpDefaults( dpy, model_ret, levels_ret ) + Display *dpy; + int *model_ret; + unsigned long int *levels_ret; +{ + XieSessionPtr ses = _XieGetSession(dpy); + xieQueryOpDefaultsReq *req; + xieQueryOpDefaultsReply rep; + int i; + + /* + ** Create request to query the session defaults + */ + XieReq_(dpy,0,SesOpCode_(ses),ieQueryOpDefaults,req); + if( !_XReply( dpy, &rep, 0, True) ) + _XieSrvError(dpy, req->opcode, 0, rep.sequenceNumber, + BadLength, "QueryOpDefaults: reply error"); + else { + XieReqDone_(dpy); + /* + * Unload the reply packet. + */ + if( model_ret != NULL ) + *model_ret = rep.model; + if( levels_ret != NULL ) { + for (i = 0; i < XieK_MaxComponents; i++) + levels_ret[i] = rep.levels[i]; + } + + } +} /* end XieQueryOpDefaults */ + +/******************************************************************************* +** _XieGetSession +** +** FUNCTIONAL DESCRIPTION: +** +** Return the pointer to the XieSessionRec structure belonging to this +** connection. The image extension is initialized and a session +** initiated, if necessary. +** +** FORMAL PARAMETERS: +** +** dpy - pointer to X11 display structure +** +** FUNCTION VALUE: +** +** XieSessionPtr +** +*******************************************************************************/ +XieSessionPtr _XieGetSession( dpy ) + Display *dpy; +{ + XExtCodes *codes; + + if( Session[DpyNumber_(dpy)] == NULL ) + { + /* + ** Initialize the server's image extension. + */ + codes = InitExtension( dpy ); + + /* + ** Initiate an image extension session. + */ + Session[DpyNumber_(dpy)] = InitSession( dpy, codes ); + } + + /* + ** Return the pointer to this session's parameters. + */ + return( Session[DpyNumber_(dpy)] ); +} /* end _XieGetSession */ + +/******************************************************************************* +** InitExtension +** +** FUNCTIONAL DESCRIPTION: +** +** Initialized the image extension. +** +** FORMAL PARAMETERS: +** +** dpy - pointer to X11 display structure +** +** FUNCTION VALUE: +** +** XExtCodes - pointer to X11 extension information about Xie +** +*******************************************************************************/ +static XExtCodes *InitExtension( dpy ) + Display *dpy; +{ + XExtCodes *codes; + + /* + ** Initialize the extension. + */ + codes = XInitExtension( dpy, XieS_Name ); + if( codes == NULL ) + _XieLibError( EACCES, "XInitExtension" ); + + /* + ** Hook our proceedures into Xlib. + */ + XESetCloseDisplay(dpy, codes->extension, (int (*)()) CloseDisplayProc ); + XESetWireToEvent( dpy, codes->first_event + XieK_ComputationEvent, + _XieConvertEventProc ); + XESetWireToEvent( dpy, codes->first_event + XieK_PhotofloEvent, + _XieConvertEventProc ); + XESetWireToEvent( dpy, codes->first_event + XieK_DisplayEvent, + _XieConvertEventProc ); + /* + ** Set the packet trace variable as requested. + */ + if( (char *)getenv("XIE_PACKET_TRACE") != NULL) + xiePacketTrace = True; + else + xiePacketTrace = False; + + return( codes ); +} /* end InitExtension */ + +/******************************************************************************* +** InitSession +** +** FUNCTIONAL DESCRIPTION: +** +** Initiate a session with the server image extension. +** +** FORMAL PARAMETERS: +** +** dpy - pointer to X11 display structure +** codes - pointer to X11 extension information about Xie +** +** FUNCTION VALUE: +** +** XieSessionPtr +** +*******************************************************************************/ +static XieSessionPtr InitSession( dpy, codes ) + Display *dpy; + XExtCodes *codes; +{ + xieInitSessionReply rep; + xieInitSessionReq *req; + XieSessionPtr ses = NULL; + char text[80]; + /* + ** Create request to initialize the session. + */ + XieReq_(dpy,0,codes->major_opcode,ieInitSession,req); + req->major_version = XieK_MajorVersion; + req->minor_version = XieK_MinorVersion; + + if( !_XReply( dpy, (xReply *) &rep, 0, False ) + || rep.length != sizeof(XieFunctionsRec) >> 2 ) + _XieLibError( EACCES, "InitSession: reply error" ); + + else if( !rep.success || rep.major_version != XieK_MajorVersion + || rep.minor_version != XieK_MinorVersion ) + { + sprintf(text, "InitSession: %s server V%d.%d, %s client V%d.%d", + XieS_Name, rep.major_version, rep.minor_version, + XieS_Name, XieK_MajorVersion, XieK_MinorVersion ); + _XieLibError( EACCES, text ); + } + else + { /* + ** Create an XieSessionRec. + */ + ses = (XieSessionPtr) XieCalloc(1,sizeof(XieSessionRec)); + SesCodes_(ses) = codes; + _XReadPad( dpy, SesFunVec_(ses), sizeof(XieFunctionsRec) ); + XieReqDone_(dpy); + } + return( ses ); +} /* end InitSession */ + +/******************************************************************************* +** CloseDisplayProc +** +** FUNCTIONAL DESCRIPTION: +** +** What to do when client calls XCloseDisplay. +** +** FORMAL PARAMETERS: +** +** dpy - pointer to X11 display structure +** codes - pointer to XExtCodes +** +*******************************************************************************/ +int CloseDisplayProc( dpy, codes ) + Display *dpy; + XExtCodes *codes; +{ + xieTermSessionReq *req; + XieResPtr nxt, res; + XieSessionPtr ses = Session[DpyNumber_(dpy)]; + + /* + ** Create request to terminate the session. + */ + XieReq_(dpy,0,codes->major_opcode,ieTermSession,req); + XieReqDone_(dpy); + + /* + ** Free every XieResRec left on the list. + */ + for( res = SesResLst_(ses); res != NULL; res = nxt ) + { + nxt = ResLnk_(res); + XieFree(res); + } + /* + ** Free the session info. + */ + XieFree( ses ); + Session[DpyNumber_(dpy)] = NULL; + + return( Success ); +} /* end CloseDisplayProc */ + +/******************************************************************************* +** FindDpyNum +** +** FUNCTIONAL DESCRIPTION: +** +** %%%%%%%% search a list and compare dpy's with indices %%%%%%%% +** +** FORMAL PARAMETERS: +** +** dpy - pointer to X11 display structure +** +** FUNCTION VALUE: +** +** some magic number ??? +** +*******************************************************************************/ +static int FindDpyNum( dpy ) + Display *dpy; +{ + /* + ** NYI -- stay tuned to XDPS.C (from display Postscript) for what to do. + */ + _XieLibError(EMLINK, "FindDpyNum (one display per process)"); +} /* end FindDpyNum */ +/* end module XieLibSession.c */ diff --git a/xie/docs/dec/xie23-src/lib/xie/XieLibTransport.c b/xie/docs/dec/xie23-src/lib/xie/XieLibTransport.c new file mode 100644 index 0000000..d77de11 --- /dev/null +++ b/xie/docs/dec/xie23-src/lib/xie/XieLibTransport.c @@ -0,0 +1,744 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** X Image Extension (XIE) +** +** ABSTRACT: +** +** This module contains XIE library image transport routines. +** +** +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Robert NC Shelley +** +** CREATION DATE: +** +** March 18, 1989 +** +** MODIFICATION HISTORY: +** +*******************************************************************************/ + +/* +** Definitions required by X11 include files +*/ +#define NEED_EVENTS +#define NEED_REPLIES + +/* +** Definition to let include files know who's calling. +*/ +#define _XieLibTransport + +/* +** Include files +*/ + /* + ** Standard C include files + */ +#include + /* + ** X11 and XIE include files + */ +#ifdef VMS +#include /* X11 internal lib/transport defs */ +#else +#include /* X11 internal lib/transport defs */ +#endif +#include /* XIE Req/Reply protocol defs */ +#include /* XIE public definitions */ +#include /* XIE private definitions */ + +/* +** Table of contents +*/ + /* + ** PUBLIC entry points + */ +void XieAbortStream(); /* abort outstanding transport requests */ +unsigned char XieGetStream(); /* image bit stream: server to client */ +void XiePutStream(); /* image bit stream: client to server */ +void XieSetStream(); /* send stream mode transport parameters*/ +void XieGetTile(); /* image tile: server to client */ +void XiePutTile(); /* image tile: client to server */ + /* + ** PRIVATE entry points + */ +void _XieSetTransport(); /* send SetTransport request */ + /* + ** internal routines + */ +static void PutPlane(); /* segment an image plane tile */ +static void PutTile(); /* send an image tile segment to server */ + +/* +** MACRO definitions +*/ + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* +** Local Storage +*/ + +/******************************************************************************* +** XieAbortStream +** +** FUNCTIONAL DESCRIPTION: +** +** Release server transport resources. +** +** FORMAL PARAMETERS: +** +** pho_id - Photo{flo|map} id +** p_mask - plane mask of planes to release transport resources from +** +*******************************************************************************/ +void XieAbortStream( pho_id, p_mask ) + XiePhoto pho_id; + unsigned long p_mask; +{ + PhotoPtr pho = (PhotoPtr) pho_id; + Display *dpy = ResDpy_(pho); + XieSessionPtr ses = _XieGetSession(dpy); + xieAbortTransportReq *req; + + /* + ** Create request to abort transport to/from the Photomap. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieAbortTransport,req); + req->photo_id = ResId_(pho); + req->plane_mask = min(p_mask, 1<photo_id = ResId_(pho); + req->max_bytes = getbytes; + req->plane_num = plane; + + if( !_XReply(dpy, (xReply *) &rep, 0, False) || rep.byte_count > getbytes ) + { + if( retbytes != NULL ) + *retbytes = 0; + _XieSrvError( dpy, req->opcode, ResId_(pho), rep.sequenceNumber, + BadLength, "GetStream: reply error" ); + return( XieK_StreamError ); + } + + if( rep.byte_count > 0 ) + { /* + ** Allocate a buffer (if none supplied), and read the image data. + */ + if( *ptr_ptr == NULL ) + *ptr_ptr = XieMallocBits( rep.byte_count << 3 ); + + _XReadPad( dpy, *ptr_ptr, rep.byte_count ); + } + XieReqDone_(dpy); + + if( rep.status == XieK_StreamMore && rep.byte_count < getbytes ) + { + if( ptr != NULL ) + /* + ** The application supplied a buffer -- offset to next segment. + */ + ptr += rep.byte_count; + + /* + ** Re-call XieGetStream to get the remainder of what was requested. + */ + rep.status = XieGetStream(pho,plane,&ptr,getbytes-rep.byte_count,&more); + + if( ptr != *ptr_ptr + rep.byte_count ) + { + /* + ** Since we allocated the buffer we must now reallocate it and + ** append the remainder of the data to what we already have. + */ + *ptr_ptr = XieReallocBits( *ptr_ptr, rep.byte_count + more << 3 ); + memcpy( *ptr_ptr + rep.byte_count, ptr, more ); + XieFreeBits( ptr ); + } + } + + if( retbytes != NULL ) + /* + ** Report back the total number of bytes retrieved. + */ + *retbytes = rep.byte_count + more; + + return( rep.status ); +} /* end XieGetStream */ + +/******************************************************************************* +** XiePutStream +** +** FUNCTIONAL DESCRIPTION: +** +** Transport a stream of image data from client to Photomap. +** +** FORMAL PARAMETERS: +** +** pho_id - Photo{flo|map} id +** plane - plane number that data is being sent from +** buffer - address of buffer to send image data from +** bytes - number of bytes of data to send +** final - Boolean - true when final segment of image is to be sent +** +*******************************************************************************/ +void XiePutStream( pho_id, plane, buffer, bytes, final ) + XiePhoto pho_id; + unsigned char *buffer, final; + unsigned long plane, bytes; +{ + PhotoPtr pho = (PhotoPtr) pho_id; + Display *dpy = ResDpy_(pho); + XieSessionPtr ses = _XieGetSession(dpy); + xiePutStreamReq *req; + CARD32 remaining, size, left = ((dpy->max_request_size < 65536 ? + dpy->max_request_size : 65536) << 2) + - sz_xiePutStreamReq; + /* + ** Send the image data -- segmented as necessary. + */ + for( remaining = bytes; remaining > 0; remaining -= size ) + { + size = remaining <= left ? remaining : left; + /* + ** Create request to send image data in byte stream format. + */ + XieReq_(dpy,0,SesOpCode_(ses),iePutStream,req); + req->length += size + 3 >> 2; + req->photo_id = ResId_(pho); + req->byte_count = size; + req->final = size == remaining ? final : False; + req->plane_num = plane; + _XSend( dpy, buffer + bytes - remaining, size ); + XieReqDone_(dpy); + } +} /* end XiePutStream */ + +/******************************************************************************* +** XieSetStream +** +** FUNCTIONAL DESCRIPTION: +** +** Set server transport parameters for stream mode Get or Put. +** +** FORMAL PARAMETERS: +** +** pho_id - Photo{flo|map|tap} id to set parameters for +** plane - plane number to set up transport parameters for +** mode - transport mode, XieK_GetStream or XieK_PutStream +** cmpres - compression scheme of image data +** cmpprm - compression parameter for image data +** cmporg - component organization of image data +** pxlstr - pixel stride of image data +** scnstr - scanline stride of image data +** +*******************************************************************************/ +void XieSetStream( pho_id, plane, mode, cmpres, cmpprm, cmporg, pxlstr, scnstr ) + XiePhoto pho_id; + unsigned char plane, mode, cmpres, cmporg; + unsigned long cmpprm, pxlstr, scnstr; +{ + PhotoPtr pho = (PhotoPtr) pho_id; + Display *dpy = ResDpy_(pho); + XieSessionPtr ses = _XieGetSession(dpy); + xieSetTransportReq *req; + CARD32 p; + + /* + ** Create request to set server transport parameters to/from Photomap. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieSetTransport,req); + req->photo_id = ResId_(pho); + req->plane_mask = 1 << min(plane, XieK_MaxPlanes); + req->compression_scheme = cmpres; + req->compression_parameter = cmpprm; + req->mode = mode; + req->component_organization = cmporg; + for( p = 0; p < XieK_MaxPlanes; p++ ) + { + req->scanline_stride[p] = p == plane ? scnstr : 0; + req->pixel_stride[p] = p == plane ? pxlstr : 0; + } + XieReqDone_(dpy); +} /* end XieSetStream */ + +/******************************************************************************* +** XieGetTile +** +** FUNCTIONAL DESCRIPTION: +** +** Transport a tile of uncompressed image data from Photomap to client. +** +** FORMAL PARAMETERS: +** +** phm_id - Photomap id +** img - pointer to XieImage structure +** p_mask - mask specifying planes to retrieve tiles from +** src_x - src X coordinate of tile (within Photomap) +** src_y - src Y coordinate of tile (within Photomap) +** dst_x - dst X coordinate of tile (within XieImage) +** dst_y - dst Y coordinate of tile (within XieImage) +** width - width of tile +** height - height of tile +** +*******************************************************************************/ +void XieGetTile( phm_id, img, p_mask, src_x, src_y, dst_x, dst_y, width, height) + XiePhotomap phm_id; + XieImage img; + unsigned long p_mask, width, height; + long src_x, src_y, dst_x, dst_y; +{ + PhotoPtr phm = (PhotoPtr) phm_id; + Display *dpy = ResDpy_(phm); + XieSessionPtr ses = _XieGetSession(dpy); + xieGetTileReply rep; + xieGetTileReq *req; + unsigned char *data; + CARD32 msk, plane_mask = 0, planes = PlaneCount_(img); + CARD32 i, longs, bytes[XieK_MaxPlanes]; + INT32 sx, sy, dx, dy, sw, dw, sh, dh, w, h; + /* + ** Make sure the coordinates and dimensions are within reasonable limits. + */ + sx = src_x < 0 ? 0 : src_x; + sy = src_y < 0 ? 0 : src_y; + sw = width + src_x > Width_(img) ? Width_(img) - sx : width + src_x - sx; + sh = height+ src_y > Height_(img)? Height_(img) - sy : height+ src_y - sy; + dx = dst_x < 0 ? 0 : dst_x; + dy = dst_y < 0 ? 0 : dst_y; + dw = width + dst_x > Width_(img) ? Width_(img) - dx : width + dst_x - dx; + dh = height+ dst_y > Height_(img)? Height_(img) - dy : height+ dst_y - dy; + w = sw < dw ? sw : dw; + h = sh < dh ? sh : dh; + + if( w > 0 && h > 0 && planes <= XieK_MaxPlanes ) + /* + ** Calculate the number of full bytes to be retrieved for each plane. + */ + for( longs = 0, msk = 1, i = 0; i < planes; msk <<= 1, i++ ) + if( p_mask & msk && Plane_(img,i) != NULL ) + { + bytes[i] = uPxlStr_(img,i) * w * h + 7 >> 3; + longs += bytes[i] + 3 >> 2; + plane_mask |= msk; + } + if( !plane_mask ) + return; + /* + ** Send the transport parameters. + */ + _XieSetTransport( phm, img, XieK_Tile, plane_mask, 0 ); + /* + ** Request the tile of image data for all the specified planes. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieGetTile,req); + req->photomap_id = ResId_(phm); + req->x = sx; + req->y = sy; + req->width = w; + req->height = h; + req->plane_mask = plane_mask; + req->final = True; + + if( !_XReply(dpy, (xReply *) &rep, 0, False) || rep.length != longs ) + { + _XieSrvError( dpy, req->opcode, ResId_(phm), rep.sequenceNumber, + BadLength, "GetTile: reply error"); + return; + } + for( i = 0; plane_mask; i++, plane_mask >>= 1 ) + if( plane_mask & 1 ) + if( dx != 0 || uPxlStr_(img,i) * w != uScnStr_(img,i) + || bytes[i] < uScnStr_(img,i) * Height_(img) + 7 >> 3 + && (bytes[i] & 7 || uPos_(img,i) & 7) ) + { /* + ** Transfer data from wire to scratch buffer to Udp. + */ + data = (unsigned char *) _XAllocScratch( dpy, bytes[i]+4 ); + _XReadPad( dpy, data, bytes[i] ); + _XieBufToUdp( data, Plane_(img,i), dx, dy, w, h ); + } + else /* + ** Read the data directly into the Udp buffer. + */ + _XReadPad(dpy, uBase_(img,i) + +(uPos_(img,i)+uScnStr_(img,i)*dy>>3), bytes[i]); + XieReqDone_(dpy); +} /* end XieGetTile */ + +/******************************************************************************* +** XiePutTile +** +** FUNCTIONAL DESCRIPTION: +** +** Transport a tile of uncompressed image data from client to Photomap. +** +** FORMAL PARAMETERS: +** +** phm_id - Photomap id +** img - pointer to XieImage structure +** p_mask - mask specifying planes to retrieve tiles from +** src_x - src X coordinate of tile (within XieImage) +** src_y - src Y coordinate of tile (within XieImage) +** dst_x - dst X coordinate of tile (within Photomap) +** dst_y - dst Y coordinate of tile (within Photomap) +** width - width of tile +** height - height of tile +** +*******************************************************************************/ +void XiePutTile( phm_id, img, p_mask, src_x, src_y, dst_x, dst_y, width, height) + XiePhotomap phm_id; + XieImage img; + unsigned long p_mask, width, height; + long src_x, src_y, dst_x, dst_y; + +{ + PhotoPtr phm = (PhotoPtr) phm_id; + Display *dpy = ResDpy_(phm); + XieSessionPtr ses = _XieGetSession(dpy); + xiePutTileReq *req; + unsigned char *data; + INT32 sx, sy, dx, dy, sw, dw, sh, dh, w, h; + CARD32 i, pels, lines, bytes[XieK_MaxPlanes], line[XieK_MaxPlanes]; + CARD32 msk, longs = 0, plane_mask = 0, planes = PlaneCount_(img); + CARD32 max_longs = (dpy->max_request_size < 65536 ? + dpy->max_request_size : 65536)-(sz_xiePutTileReq>>2); + /* + ** Make sure the coordinates and dimensions are within reasonable limits. + */ + sx = src_x < 0 ? 0 : src_x; + sy = src_y < 0 ? 0 : src_y; + sw = width + src_x > Width_(img) ? Width_(img) - sx : width + src_x - sx; + sh = height+ src_y > Height_(img)? Height_(img) - sy : height+ src_y - sy; + dx = dst_x < 0 ? 0 : dst_x; + dy = dst_y < 0 ? 0 : dst_y; + dw = width + dst_x > Width_(img) ? Width_(img) - dx : width + dst_x - dx; + dh = height+ dst_y > Height_(img)? Height_(img) - dy : height+ dst_y - dy; + w = sw < dw ? sw : dw; + h = sh < dh ? sh : dh; + + if( w > 0 && h > 0 && planes <= XieK_MaxPlanes ) + /* + ** Calculate the number of: bits per line, bytes per plane (rounded + ** up to a full lonword), and the total number of longwords. + */ + for( msk = 1, i = 0; i < planes; msk <<= 1, i++ ) + if( p_mask & msk && Plane_(img,i) != NULL ) + { + line[i] = w * uPxlStr_(img,i); + bytes[i] = h * line[i] + 7 >> 3; + longs += bytes[i] + 3 >> 2; + plane_mask |= msk; + } + if( !plane_mask ) + return; + + /* + ** Send the transport parameters. + */ + _XieSetTransport( phm, img, XieK_Tile, plane_mask, 0 ); + + if( longs > max_longs ) + { /* + ** Send each image plane separately, segmented as necessary. + */ + for( i = 0; plane_mask; i++, plane_mask >>= 1 ) + if( plane_mask & 1 ) + PutPlane( phm, img, i, max_longs<<5, line[i], + sx, sy, dx, dy, w, h, plane_mask == 1 ); + } + else + { /* + ** Send all requested planes in a single protocol message. + */ + XieReq_(dpy,0,SesOpCode_(ses),iePutTile,req); + req->length += longs; + req->photomap_id = ResId_(phm); + req->x = dx; + req->y = dy; + req->width = w; + req->height = h; + req->plane_mask = plane_mask; + req->final = True; + + for( i = 0; plane_mask != 0; i++, plane_mask >>= 1 ) + if( plane_mask & 1 ) + if( dx != 0 || uPxlStr_(img,i) * w != uScnStr_(img,i) + || bytes[i] < uScnStr_(img,i) * Height_(img)+7>>3 + && (bytes[i] & 7 || uPos_(img,i) & 7) ) + { /* + ** Transfer the data to a scratch buffer -- then send. + */ + data = (unsigned char *) _XAllocScratch( dpy, bytes[i]+4 ); + _XieUdpToBuf( Plane_(img,i), data, sx, sy, w, h ); + _XSend( dpy, data, bytes[i] ); + } + else /* + ** Send the full width plane directly from the Udp. + */ + _XSend(dpy, uBase_(img,i) + +(uPos_(img,i)+uScnStr_(img,i)*dy>>3), bytes[i]); + XieReqDone_(dpy); + } +} /* end XiePutTile */ + +/******************************************************************************* +** _XieSetTransport +** +** FUNCTIONAL DESCRIPTION: +** +** Set server transport parameters for tile mode Get or Put. +** +** FORMAL PARAMETERS: +** +** pho - Photo{flo|map|tap} to set parameters for +** img - pointer to XieImage structure +** mode - transport mode: XieK_GetStream, XieK_PutStream, or XieK_Tile +** p_mask - mask specifying planes to be transported +** cmpprm - compression parameter (for DCT) +** +*******************************************************************************/ +void _XieSetTransport( pho, img, mode, p_mask, cmpprm ) + PhotoPtr pho; + XieImage img; + CARD8 mode; + CARD32 p_mask; + CARD32 cmpprm; +{ + Display *dpy = ResDpy_(pho); + XieSessionPtr ses = _XieGetSession(dpy); + xieSetTransportReq *req; + CARD32 i, msk; + + /* + ** Create request to set server transport parameters for new Photomap. + */ + XieReq_(dpy,0,SesOpCode_(ses),ieSetTransport,req); + req->photo_id = ResId_(pho); + req->plane_mask = min(p_mask, 1<compression_scheme = Cmpres_(img); + req->compression_parameter = cmpprm; + req->mode = mode; + req->component_organization = CmpOrg_(img); + for( msk = 1, i = 0; i < XieK_MaxPlanes; msk <<= 1, i++ ) + { + req->scanline_stride[i] = p_mask & msk ? uScnStr_(img,i) : 0; + req->pixel_stride[i] = p_mask & msk ? uPxlStr_(img,i) : 0; + } + XieReqDone_(dpy); +} /* end _XieSetTransport */ + +/******************************************************************************* +** PutPlane +** +** FUNCTIONAL DESCRIPTION: +** +** Send a tile from a plane of image data to the Photomap. PutPlane +** calls itself recursively until all the data has been sent. +** +** FORMAL PARAMETERS: +** +** phm - Photomap +** img - pointer to XieImage structure +** plane - plane number +** maxlen - maximum nuymber of bits we can send +** scnlen - length of a scanline in bits +** sx - src X coordinate +** sy - src Y coordinate +** dx - dst X coordinate +** dy - dst Y coordinate +** w - width +** h - height +** final - Boolean - true when last tile is to be sent +** +*******************************************************************************/ +static void PutPlane(phm, img, plane, maxlen, scnlen, sx,sy, dx,dy, w,h, final) + PhotoPtr phm; + XieImage img; + CARD32 plane, maxlen, scnlen, sx,sy, dx,dy, w,h; + BOOL final; +{ + CARD32 pels, lines, total = scnlen * h + 7 & ~7; + + if( total <= maxlen ) + PutTile( phm, img, plane, sx, sy, dx, dy, w, h, final ); + + else if( scnlen <= maxlen ) + { + lines = maxlen / scnlen; + PutTile( phm, img, plane, sx, sy, dx, dy, w, lines, False ); + PutPlane(phm, img, plane, maxlen, scnlen, sx, sy + lines, + dx, dy + lines, + w, h - lines, final); + } + else + { + pels = (maxlen << 5) / uPxlStr_(img,plane); + PutTile( phm, img, plane, sx, sy, dx, dy, pels, 1, False ); + PutPlane(phm, img, plane, maxlen, scnlen, sx + pels, sy, + dx + pels, dy, + w - pels, 1, h == 1 ? final + : False); + } +} /* end PutPlane */ + +/******************************************************************************* +** PutTile +** +** FUNCTIONAL DESCRIPTION: +** +** Transport a tile of image data from client image to Photomap. +** +** FORMAL PARAMETERS: +** +** phm - Photomap +** img - pointer to XieImage structure +** plane - number of image plane being sent +** sx, sy, dx, dy - src and dst coordinates +** w, h - width and height +** final - Boolean - true when last tile is to be sent +** +*******************************************************************************/ +static void PutTile( phm, img, plane, sx, sy, dx, dy, w, h, final ) + PhotoPtr phm; + XieImage img; + CARD32 plane, sx, sy, dx, dy, w, h; + BOOL final; +{ + Display *dpy = ResDpy_(phm); + XieSessionPtr ses = _XieGetSession(dpy); + CARD32 bytes = uPxlStr_(img,plane) * w * h + 7 >> 3; + unsigned char *data; + xiePutTileReq *req; + + XieReq_(dpy,0,SesOpCode_(ses),iePutTile,req); + req->length += bytes + 3 >> 2; + req->photomap_id = ResId_(phm); + req->x = dx; + req->y = dy; + req->width = w; + req->height = h; + req->plane_mask = 1 << plane; + req->final = final; + + if( uPos_(img,plane) & 7 || bytes != uScnStr_(img,plane)*Height_(img)+7>>3 ) + { /* + ** Extract and send the tile using a scratch buffer. + */ + data = (unsigned char *) _XAllocScratch( dpy, bytes+4 ); + _XieUdpToBuf( Plane_(img,plane), data, sx, sy, w, h ); + _XSend( dpy, data, bytes ); + } + else /* + ** Send the full image plane directly from the Udp's buffer. + */ + _XSend( dpy, uBase_(img,plane)+(uPos_(img,plane)>>3), bytes ); + XieReqDone_(dpy); +} /* end PutTile */ +/* end module XieLibTransport.c */ diff --git a/xie/docs/dec/xie23-src/lib/xie/XieLibUtils.c b/xie/docs/dec/xie23-src/lib/xie/XieLibUtils.c new file mode 100644 index 0000000..e6badfc --- /dev/null +++ b/xie/docs/dec/xie23-src/lib/xie/XieLibUtils.c @@ -0,0 +1,496 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** X Image Extension (XIE) +** +** ABSTRACT: +** +** This module contains XieLib utility routines. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Robert NC Shelley +** +** CREATION DATE: +** +** September 21, 1989 +** +** MODIFICATION HISTORY: +** +*******************************************************************************/ + +/* +** Definitions required by X11 include files +*/ +#define NEED_EVENTS +#define NEED_REPLIES + +/* +** Definition to let include files know who's calling. +*/ +#define _XieLibUtils + +/* +** Include files +*/ + /* + ** Standard C include files + */ +#include + /* + ** X11 and XIE include files + */ +#ifdef VMS +#include /* X11 internal lib/transport defs */ +#else +#include /* X11 internal lib/transport defs */ +#endif +#include /* XIE Req/Reply protocol defs */ +#include /* XIE public definitions */ +#include /* XIE private definitions */ + +/* +** Table of contents +*/ + /* + ** PUBLIC utility entry points + */ +unsigned char XieIsBitonal(); +unsigned char XieIsCpp(); +unsigned char XieIsGrayScale(); +unsigned char XieIsIdc(); +unsigned char XieIsPhoto(); +unsigned char XieIsPhotoflo(); +unsigned char XieIsPhotomap(); +unsigned char XieIsPhototap(); +unsigned char XieIsRGB(); +unsigned char XieIsRoi(); +unsigned char XieIsTmp(); +unsigned long XiePhotoCount(); +unsigned long XiePlaneCount(); +unsigned long XieXId(); + /* + ** PUBLIC memory management entry points + */ +void *XieCalloc(); +unsigned char *XieCallocBits(); +void *XieCfree(); +void *XieFree(); +unsigned char *XieFreeBits(); +void *XieMalloc(); +unsigned char *XieMallocBits(); +void *XieRealloc(); +unsigned char *XieReallocBits(); + /* + ** PRIVATE entry points + */ +void _XieBufToUdp(); /* copy image data from buffer to Udp */ +void _XieUdpToBuf(); /* copy image data from Udp to buffer */ +void _XieLibError(); /* client error report routine */ +void _XiePacketTrace(); /* trace packets sent from client side */ +void _XieSrvError(); /* server error report routine */ + + + +/* +** Macro definitions +*/ + +/* +** Equated symbols +*/ + +/* +** Externals +*/ + +/* +** Local storage +*/ + +/* +** XieLib macros as callable routines. +*/ +unsigned char XieIsBitonal( photo_id ) + XiePhoto photo_id; +{ + return( XieIsPhoto(photo_id) && IsBitonal_(photo_id) ); +} + +unsigned char XieIsCpp( res_id ) + XieResource res_id; +{ + return( res_id != NULL && IsCpp_(res_id) ); +} + +unsigned char XieIsGrayScale( photo_id ) + XiePhoto photo_id; +{ + return( XieIsPhoto(photo_id) && IsGrayScale_(photo_id) ); +} + +unsigned char XieIsIdc( res_id ) + XieResource res_id; +{ + return( res_id != NULL && IsIdc_(res_id) ); +} + +unsigned char XieIsPhoto( res_id ) + XieResource res_id; +{ + return( res_id != NULL && IsPhoto_(res_id) ); +} + +unsigned char XieIsPhotoflo( res_id ) + XieResource res_id; +{ + return( res_id != NULL && IsPhotoflo_(res_id) ); +} + +unsigned char XieIsPhotomap( res_id ) + XieResource res_id; +{ + return( res_id != NULL && IsPhotomap_(res_id) ); +} + +unsigned char XieIsPhototap( res_id ) + XieResource res_id; +{ + return( res_id != NULL && IsPhototap_(res_id) ); +} + +unsigned char XieIsRGB( photo_id ) + XiePhoto photo_id; +{ + return( XieIsPhoto(photo_id) && IsRGB_(photo_id) ); +} + +unsigned char XieIsRoi( res_id ) + XieResource res_id; +{ + return( res_id != NULL && IsRoi_(res_id) ); +} + +unsigned char XieIsTmp( res_id ) + XieResource res_id; +{ + return( res_id != NULL && IsTmp_(res_id) ); +} + +unsigned long XiePhotoCount( photo_id ) + XiePhoto photo_id; +{ + return( XieIsPhoto(photo_id) ? PhotoCount_(photo_id) : 0 ); +} + +unsigned long XiePlaneCount( img ) + XieImage img; +{ + return( img != NULL ? PlaneCount_(img) : 0 ); +} + +unsigned long XieXId( res_id ) + XieResource res_id; +{ + return( res_id != NULL ? XId_(res_id) : 0 ); +} + +/* +** Memory management entry points. +*/ +void *XieCalloc(number,size) + unsigned number; + unsigned size; +{ + return (void *)Xcalloc((number),(size)); +} + +unsigned char *XieCallocBits(bits) + unsigned bits; +{ + return (unsigned char *)Xcalloc(1,(bits)+39>>3); +} + +void *XieCfree(ptr) + char *ptr; +{ + if( ptr != NULL ) + Xfree(ptr); + return( NULL ); +} + +void *XieFree(ptr) + char *ptr; +{ + if( ptr != NULL ) + Xfree(ptr); + return( NULL ); +} + +unsigned char *XieFreeBits(ptr) + unsigned char *ptr; +{ + if( ptr != NULL ) + Xfree(ptr); + return( NULL ); +} + +void *XieMalloc(size) + unsigned size; +{ + return (void *)Xmalloc(size); +} + +unsigned char *XieMallocBits(bits) + unsigned bits; +{ + return (unsigned char *)Xmalloc((bits)+39>>3); +} + +void *XieRealloc(ptr,size) + char *ptr; + unsigned size; +{ + return (void *)Xrealloc(ptr,size); +} + +unsigned char *XieReallocBits(ptr,bits) + unsigned char *ptr; + unsigned bits; +{ + return (unsigned char *)Xrealloc(ptr,(bits)+39>>3); +} + +/******************************************************************************* +** _XieBufToUdp +** +** FUNCTIONAL DESCRIPTION: +** +** Copy image data from buffer to udp. The image data in the buffer is +** assumed to have the same format as described by the udp. +** +** FORMAL PARAMETERS: +** +** buf - src buffer pointer +** dst - dst udp pointer +** x - X coordinate within udp to begin data storage +** y - Y coordinate within udp to begin data storage +** width - width of data to copy (in pixels) +** height - height of data to copy (in pixels) +** +*******************************************************************************/ +void _XieBufToUdp( buf, dst, x, y, width, height ) + unsigned char *buf; + UdpPtr dst; + long x, y; + unsigned long width, height; +{ + UdpRec src; + + src = *dst; + src.UdpL_ScnStride = width * src.UdpL_PxlStride; + src.UdpL_X1 = 0; + src.UdpL_X2 = width - 1; + src.UdpL_Y1 = 0; + src.UdpL_Y2 = height - 1; + src.UdpL_PxlPerScn = width; + src.UdpL_ScnCnt = height; + src.UdpL_Pos = 0; + src.UdpA_Base = buf; + src.UdpL_ArSize = height * src.UdpL_ScnStride; + + SmiCopy( &src, dst, 0, 0, x, y, width, height ); +} /* end _XieBufToUdp */ + +/******************************************************************************* +** _XieUdpToBuf +** +** FUNCTIONAL DESCRIPTION: +** +** Copy image data from udp udp to buffer. The image data in the buffer +** will have the same format as described by the udp. +** +** FORMAL PARAMETERS: +** +** src - src udp pointer +** buf - dst buffer pointer +** x - X coordinate within udp to begin data retrieval +** y - Y coordinate within udp to begin data retrieval +** width - width of data to copy (in pixels) +** height - height of data to copy (in pixels) +** +*******************************************************************************/ +void _XieUdpToBuf( src, buf, x, y, width, height ) + UdpPtr src; + unsigned char *buf; + long x, y; + unsigned long width, height; +{ + UdpRec dst; + + dst = *src; + dst.UdpL_ScnStride = width * dst.UdpL_PxlStride; + dst.UdpL_X1 = 0; + dst.UdpL_X2 = width - 1; + dst.UdpL_Y1 = 0; + dst.UdpL_Y2 = height - 1; + dst.UdpL_PxlPerScn = width; + dst.UdpL_ScnCnt = height; + dst.UdpL_Pos = 0; + dst.UdpA_Base = buf; + dst.UdpL_ArSize = height * dst.UdpL_ScnStride; + + SmiCopy( src, &dst, x, y, 0, 0, width, height ); +} /* end _XieUdpToBuf */ + +/******************************************************************************* +** _XieLibError +** +** FUNCTIONAL DESCRIPTION: +** +** XieLib client error routine (exit on application programmer goofs). +** +** FORMAL PARAMETERS: +** +** error - error code: selected from +** text - pointer to informational text. +** +*******************************************************************************/ +void _XieLibError( error, text ) + unsigned long error; + char *text; +{ + errno = error; + perror( text ); + exit(1); +} /* end _XieLibError */ + +/******************************************************************************* +** _XiePacketTrace +** +** FUNCTIONAL DESCRIPTION: +** +** XieLib protocol packet trace +** +** FORMAL PARAMETERS: +** +** opcode - Xie protocol opcode +** +** +*******************************************************************************/ +void _XiePacketTrace( opcode ) + int opcode; +{ + externalref char *_XieFunctionName[]; /* The function names */ + + if (opcode > 0 && opcode < X_ieLastRequest) + printf("Packet Trace : %s\n", _XieFunctionName[opcode] ); + else + printf("Packet Trace : Bad Request %d\n", opcode); +} + +/******************************************************************************* +** _XieSrvError +** +** FUNCTIONAL DESCRIPTION: +** +** XieLib server error reporting routine. +** +** FORMAL PARAMETERS: +** +** dpy - X11 display +** opcode - minor op-code +** id - resource id +** seqnum - reply sequence number +** error - error code +** text - pointer to informational text. +** +*******************************************************************************/ +void _XieSrvError( dpy, opcode, id, seqnum, error, text ) + Display *dpy; + unsigned long opcode, id, seqnum, error; + char *text; +{ + xError err; + + err.type = X_Error; + err.errorCode = error; + err.sequenceNumber = seqnum; + err.resourceID = id; + err.minorCode = opcode; + err.majorCode = SesOpCode_(_XieGetSession(dpy)); + + if( text != NULL && *text != '\0' ) + fprintf(stderr,"\n%s> %s.\n", XieS_Name, text ); + + UnlockDisplay(dpy); + +#ifdef VMS + SyncHandle(); + exit(1); /* _XError() isn't in the transfer vector ! */ +#else + /* + ** Now tell the rest of the story. + */ + _XError( dpy, &err ); + SyncHandle(); +#endif +} /* end _XieSrvError */ + +/* end module XieLibUtils.c */ diff --git a/xie/docs/dec/xie23-src/lib/xie/XieLibint.h b/xie/docs/dec/xie23-src/lib/xie/XieLibint.h new file mode 100644 index 0000000..3e8ae3d --- /dev/null +++ b/xie/docs/dec/xie23-src/lib/xie/XieLibint.h @@ -0,0 +1,225 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/******************************************************************************* +** Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** XIE - X11 Image Extension +** +** +** ABSTRACT: +** +** This module contains private definitions required by XieLib. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Robert NC Shelley +** +** CREATION DATE: +** +** February 9, 1990 +** +*******************************************************************************/ + + /* + ** Symbol XIELIBINT allows XieLibint.h to be included multiple times. + */ +#ifndef XIELIBINT +#define XIELIBINT /* the "endif" MUST be the last line of this file */ + + /* + ** XieLib session structure. + */ +typedef struct _XieSessionRec { + struct _XieResRec *flink; /* Xie resource list */ + XExtCodes *codes; /* X11 extension codes pointer */ + CARD8 FunVec[sizeof(XieFunctionsRec)]; /* functions supported by server*/ +} XieSessionRec, *XieSessionPtr; + /* + ** Access macros for XieLib session info. + */ +#define SesResLst_(ses) ((ses)->flink) +#define SesCodes_(ses) ((ses)->codes) +#define SesExtNum_(ses) ((ses)->codes->extension) +#define SesOpCode_(ses) ((ses)->codes->major_opcode) +#define SesError_(ses) ((ses)->codes->first_error) +#define SesEvent_(ses) ((ses)->codes->first_event) +#define SesFunVec_(ses) ((ses)->FunVec) + /* + ** XieImageRec extension for Stream transport state info + */ +typedef struct _XieStreamRec { + XID id; /* X11 resource-id */ + Display *dpy; /* X11 display pointer */ + unsigned long bytes[XieK_MaxPlanes]; /* bytes transported */ +} XieStreamRec, *XieStreamPtr; +#define Xport_(img) ((img)->Xport) +#define xpId_(xp) (xp->id) +#define xpDpy_(xp) (xp->dpy) +#define xpBytes_(xp,ind) (xp->bytes[(ind)]) +#define xpBits_(xp,ind) (xp->bytes[(ind)]<<3) + /* + ** XieLib resource structure. + */ +typedef struct _XieResRec { + struct _XieResRec *flink; /* X11 display Xie resource list flink */ + Display *dpy; /* X11 display pointer */ + XID id; /* X11 resource-id */ + unsigned char type; /* offset must match RES_TYPE */ + unsigned char mapping; /* offset must match RES_MAPPING */ + unsigned short _reserved; + struct _XieResRec *floLnk; /* linkage to Photoflo */ + struct _XieResRec *photoLnk; /* linkage to Photo{map|tap} {list} */ +} XieResRec, *XieResPtr, /* generic resource */ + *PhotoPtr, /* Photoflo, Photomap, or Phototap */ + *IdcPtr; /* Cpp, Roi, or Tmp */ + /* + ** Access macros for XieLib resources. + */ +#define ResLnk_(res) ((res)->flink) +#define ResDpy_(res) ((res)->dpy) +#define ResId_(res) ((res)->id) +#define ResType_(res) ((res)->type) +#define ResMap_(res) ((res)->mapping) +#define FloLnk_(res) ((res)->floLnk) +#define PhotoLnk_(res) ((res)->photoLnk) + +/* +** Macros +*/ + /* + ** XieLib interface to Xlibint.h macros. + ** + ** WARNING: some Xlibint.h macros assume variable "Display *dpy" exists. + */ + /* + ** The argument "shortened_proto_name" that is passed to Xlibint + ** macros, GetReq() and GetReqExtra(), is a partial name for the + ** Xie protocol function to be built. Using the Crop function as + ** an example, these macros would expect the name "ieCrop" from + ** which they create the following names: + ** + ** XieCropReq - typedef name for protocol structure + ** X_ieCrop - symbol name for protocol minor op-code + ** sz_xieCropReq - symbol name for protocol structure size + ** + ** Unfortunately there are no special macros for extensions, so we + ** have to move our minor_opcode to the correct field and write our + ** own major_opcode after the macros have performed their magic. + */ +#define XieReq_(dpy,gc,major_opcode,shortened_proto_name,proto_ptr) \ + LockDisplay(dpy); \ + if(gc) FlushGC(dpy,(GC)gc); \ + GetReq(shortened_proto_name,proto_ptr); \ + if(xiePacketTrace) _XiePacketTrace(proto_ptr->reqType); \ + proto_ptr->opcode = proto_ptr->reqType; \ + proto_ptr->reqType = major_opcode + +#define XieReqExtra_(dpy,gc,major_opcode,shortened_proto_name,proto_ptr,extra) \ + LockDisplay(dpy); \ + if(gc) FlushGC(dpy,(GC)gc); \ + GetReqExtra(shortened_proto_name,extra,proto_ptr); \ + proto_ptr->opcode = proto_ptr->reqType; \ + proto_ptr->reqType = major_opcode + +#define XieReqDone_(dpy) \ + {UnlockDisplay(dpy); SyncHandle();} + +#ifndef externalref +#if (defined(VMS) && defined(VAXC)) +#define externalref globalref +#else +#define externalref extern +#endif +#endif + +#ifndef externaldef +#if (defined (VMS) && defined(VAXC)) +#define externaldef(psect) globaldef {"psect"} noshare +#else +#define externaldef(psect) +#endif +#endif + +/* +** XieLib private entry points. +*/ +#ifndef _XieLibEvents +extern Bool _XieConvertEventProc(); +#endif +#ifndef _XieLibResource +extern void _XieAddResource(); +extern Status _XieQueryResource(); +extern XieResPtr _XieGetDst(); +#endif +#ifndef _XieLibSession +externalref BOOL xiePacketTrace; +extern XieSessionPtr _XieGetSession(); +#endif +#ifndef _XieLibTransport +extern void _XieSetTransport(); +#endif +#ifndef _XieLibUtils +extern void _XieBufToUdp(); +extern void _XieUdpToBuf(); +extern void _XieLibError(); +extern void _XiePacketTrace(); +extern void _XieSrvError(); +#endif + +/* +** This "endif" MUST be the last line of this file. +*/ +#endif /* end of XIELIBINT -- NO DEFINITIONS ALLOWED BEYOND THIS POINT */ diff --git a/xie/docs/dec/xie23-src/server/xie/Imakefile b/xie/docs/dec/xie23-src/server/xie/Imakefile new file mode 100644 index 0000000..7ca2dd3 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/Imakefile @@ -0,0 +1,94 @@ +/**/# +/**/# @DEC_FREE_COPYRIGHT@ +/**/# +/**/# +/**/# HISTORY +/**/# $Log: Imakefile,v $ +/**/# Revision 1.1.2.5 92/10/23 16:09:52 Jim_Ludwig +/**/# library name change +/**/# [92/10/23 13:31:47 Jim_Ludwig] +/**/# +/**/# Revision 1.1.2.4 92/09/25 18:21:20 Jim_Ludwig +/**/# loadable server changes +/**/# [92/09/25 18:20:22 Jim_Ludwig] +/**/# +/**/# Revision 1.1.2.3 92/09/14 10:39:21 Dave_Hill +/**/# cleanup & adding of server.tmpl +/**/# [92/09/14 10:38:53 Dave_Hill] +/**/# +/**/# Revision 1.1.2.2 92/07/19 10:38:21 Dave_Hill +/**/# corrected internal comments that crashed make after changing +/**/# comment leader +/**/# [92/07/19 10:37:19 Dave_Hill] +/**/# +/**/# Revision 1.1.2.1 92/07/17 16:49:28 devrcs +/**/# Initial load into Alpha pool +/**/# +/**/# Revision 1.1 90/01/01 00:00:00 devrcs +/**/# *** Initial Trunk Revision *** +/**/# +/**/# Revision 1.2 91/12/30 12:48:20 devbld +/**/# Initial load of project +/**/# +/**/# $EndLog$ +/**/# +# BuildSystemHeader added automatically +/**/# $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/server/xie/Imakefile,v 1.1.2.5 92/10/23 16:09:52 Jim_Ludwig Exp $ +#include + +#define IHaveSubdirs + +/**/# define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' + +SRCS = XieDisplay.c \ + XieDisplay.h \ + XieEvents.c \ + XieMain.c \ + XiePipeInterface.h \ + XieProcess.c \ + XieResource.c \ + XieServer.h \ + XieSession.c \ + XieSwapRep.c \ + XieSwapReq.c \ + XieTables.c \ + XieTransport.c \ + XieTransport.h \ + XieUtils.c + +OBJS = XieDisplay.o \ + XieEvents.o \ + XieMain.o \ + XieProcess.o \ + XieResource.o \ + XieSession.o \ + XieSwapRep.o \ + XieSwapReq.o \ + XieTables.o \ + XieTransport.o \ + XieUtils.o + + INCLUDES = -I. -I../../include -I../../../server/include -I$(INCLUDESRC) -I./smi -I$(FONTSRC)/include + LINTLIBS = ../../../server/dix/llib-ldix.ln ../../../server/os/4.2bsd/llib-los.ln + SUBDIRS = smi + +NormalLibraryTarget(_dec_xie,$(OBJS)) +NormalLibraryObjectRule() +LintLibraryTarget(_dec_xie,$(SRCS)) +NormalLintTarget($(SRCS)) + +#ifdef IHaveSubdirs +MakeSubdirs($(SUBDIRS)) +DependSubdirs($(SUBDIRS)) +#endif + +#if SharedServerLibs +SharedLibraryTarget(_dec_xie,.,$(OBJS) smi/?*.o) +InstallSharedLibrary(_dec_xie,.,$(INSTALLSERVERLIBSDIR)) +#endif + +saber_src: + #load $(CFLAGS) $(SRCS) + +DependTarget() + diff --git a/xie/docs/dec/xie23-src/server/xie/XieDisplay.c b/xie/docs/dec/xie23-src/server/xie/XieDisplay.c new file mode 100644 index 0000000..ef9b243 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/XieDisplay.c @@ -0,0 +1,2505 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Image Extension DIX +** +** ABSTRACT: +** +** This Xie module consists of DIX procedures for Display +** service requests. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Robert NC Shelley +** +** CREATION DATE: +** +** November 1, 1989 +** +************************************************************************/ + +/* +** Definition to let include files know who's calling. +*/ +#define _XieDisplay + +/* +** Include files +*/ +#include + /* + ** Core X Includes + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + + /* + ** XIE Includes + */ +#include +#include +#include +#include +#include +#include +#include + +/* +** Table of contents +*/ + /* + ** Xie protocol proceedures called from XieMain + */ +int ProcDisplaySequence(); +int ProcExport(); +int ProcFreeExport(); +int ProcImport(); + /* + ** routines referenced by other modules + */ +void FreeExport(); + /* + ** routines used internally by XieDisplay. + */ +static int CreateExportContext(); +static int CvtRGBBitZPixmap(); +static int CvtRGBBytZPixmap(); +#if defined(DWV3) +static void ExportSpans(); +#endif +static int CvtZPixmap(); +static int Export(); +static void ExportDone(); +static int Format(); +static void FormatDirectColor(); +static void FormatPseudoColor(); +static void Histogram(); +static CARD32 HistogramAnalysis(); +static int Import(); +static int ImportSingleMapData(); +static int ImportTripleMapData(); +static int InitForSpans(); +static CARD32 MatchDirectAllocColor(); +static CARD32 MatchPseudoAllocColor(); +static void MatchPseudoClosest(); +static void MatchPseudoDistant(); +static CARD32 MatchPseudoInit(); +static void ReadSingleMap(); +static void ReadTripleMap(); +static void SetLutEntry(); +static void SetupUdp(); + /* + ** routines used to support pipelines. + */ +static int _ExportCreate(); +static int _ExportInitialize(); +static int _ExportActivate(); +static int _ExportFlush(); +static int _ExportDestroy(); +static int _ExportAbort(); +static int _ExportFreeData(); + +/* +** Equated Symbols +*/ +/* +** MACRO definitions +*/ +/* +** External References +*/ +#if defined(X11R3) && !defined(DWV3) +extern int UtilFreeResource(); /* ref'd by AddResource_ macro */ +#endif +extern int AllocColor(); /* X11 colormap.c */ +extern int FreeColors(); /* X11 colormap.c */ + +extern int xieDoSendEvent(); /* XieEvents.c */ +extern UdpPtr UtilAllocUdp(); /* XieUtils.c */ +extern int UtilBePCM(); /* XieUtils.c */ +extern PhotomapPtr UtilCreatePhotomap(); /* XieUtils.c */ +extern UdpPtr UtilFreeUdp(); /* XieUtils.c */ + +extern CARD32 xieClients; /* num of clients served */ +extern CARD32 xieEventBase; /* Base for Xie events */ +extern CARD32 xieReqCode; /* XIE main opcode */ +#if defined(X11R3) && !defined(DWV3) +extern CARD16 RC_xie; /* XIE Class */ +extern CARD16 RT_photo; /* Photo{flo|map|tap} resource */ +extern CARD16 RT_idc; /* Cpp, Roi & Tmp resource types*/ +#else /* X11R4 || DWV3 */ +extern RESTYPE RC_xie; /* XIE Class */ +extern RESTYPE RT_photo; /* Photo{flo|map|tap} resource */ +extern RESTYPE RT_idc; /* Cpp, Roi & Tmp resource types*/ +#endif + +externalref int (*xieDixSwap[X_ieLastRequest])(); /* Reply swap dispatch + * table */ +externalref int (*xieDixSwapReply[])(); +externalref void (*xieDixSwapData[])(); + +extern void Swap32Write(); +/* +** Local Storage +*/ + + /* + ** Export Element Vector + */ +static PipeElementVector ExportPipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeExportElement, /* Structure subtype */ + sizeof(ExportPipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* reserved flags */ + _ExportInitialize, /* Initialize entry */ + _ExportActivate, /* Activate entry */ + _ExportFlush, /* Flush entry */ + _ExportDestroy, /* Destroy entry */ + _ExportAbort /* Abort entry point */ + }; + +#ifdef BIGENDIAN /* BIGENDIANEVILHACK */ +static unsigned char _reverse_byte[0x100] = { + 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, + 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, + 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, + 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, + 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, + 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, + 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, + 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, + 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, + 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, + 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, + 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, + 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, + 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, + 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, + 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, + 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, + 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, + 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, + 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, + 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, + 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, + 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, + 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, + 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, + 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, + 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, + 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, + 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, + 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, + 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, + 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff +}; +#endif + +/*----------------------------------------------------------------------- +---------------------- Display Sequence Procedure ---------------------- +------------------------------------------------------------------------*/ +int ProcDisplaySequence( client ) + ClientPtr client; +{ + REQUEST( xieReq ); + + BadRequest_(0); +} /* end ProcDisplaySequence */ + +/*----------------------------------------------------------------------- +---------------------- Export to drawable Procedure --------------------- +------------------------------------------------------------------------*/ +int ProcExport( client ) + ClientPtr client; +{ + PhotofloPtr flo; + PhotomapPtr img; + ExpCtxPtr exp; + INT32 x, y, w, h, dx, dy, status; + REQUEST( xieExportReq ); + REQUEST_SIZE_MATCH( xieExportReq ); + /* + ** Lookup Photo{flo|map|tap} -- check export region. + */ + LookupPhotos_(&flo, &img, stuff->photo_id, -1); + MatchOkIf_(Constrained_(img), stuff->photo_id); + x = max(stuff->src_x, 0); + y = max(stuff->src_y, 0); + w = min(stuff->src_x, 0) + stuff->width; + h = min(stuff->src_y, 0) + stuff->height; + w = Width_(img) < x + w ? Width_(img) - x : w; + h = Height_(img) < y + h ? Height_(img) - y : h; + dx = stuff->dst_x + x - stuff->src_x; + dy = stuff->dst_y + y - stuff->src_y; + ValueOkIf_( w > 0 && h > 0, stuff->photo_id ); + + status = CreateExportContext( client, img, x, y, w, h ); + if( status != Success ) + FreeExport( img ); + + else if( flo != NULL ) + { /* + ** Export later in a Photoflo. + */ + status = _ExportCreate( Pipe_(flo), img, dx, dy ); + OkIf_(status == Success, (FreeExport(img), stuff->photo_id), status); + } + else + { /* + ** Export now. + */ + BePCM_( img, (FreeExport(img), stuff->photo_id) ); + exp = Eport_(img); + status = Format( exp, Sink_(img) ); + OkIf_(status == Success, (FreeExport(img), stuff->photo_id), status); + status = Export( exp, Sink_(img), ePixUdp_(exp), dx, dy ); + OkIf_(status == Success, (FreeExport(img), stuff->photo_id), status); + ExportDone( exp ); + status = xieDoSendEvent( client, img, XieK_DisplayEvent ); +#ifdef PEZD + LIB$SHOW_TIMER(); + printf("PEZD : End Export\n"); +#endif + } + return( status ); +} /* end ProcExport */ + +/*----------------------------------------------------------------------- +------------------------ Free Export context Procedure ------------------ +------------------------------------------------------------------------*/ +int ProcFreeExport( client ) + ClientPtr client; +{ + PhotofloPtr flo; + PhotomapPtr img; + REQUEST( xieFreeExportReq ); + REQUEST_SIZE_MATCH( xieFreeExportReq ); + /* + ** Check out the Photo{flo|map|tap}. + */ + LookupPhotos_(&flo, &img, stuff->photo_id, 0); + AccessOkIf_( !flo || !Make_(flo) || !Run_(flo), ResId_(flo)); + + FreeExport( img ); + + return( Success ); +} /* end ProcFreeExport */ + +/*----------------------------------------------------------------------- +---------------------- Import from drawable Procedure ------------------- +------------------------------------------------------------------------*/ +int ProcImport( client ) + ClientPtr client; +{ + PhotomapPtr img = NULL; + REQUEST( xieImportReq ); + REQUEST_SIZE_MATCH( xieImportReq ); + + CheckNewResource_( stuff->photomap_id, RT_photo ); + /* + ** Import the Drawable's image data. + */ + if( Import( client, &img ) == Success ) + { /* + ** Add new Photomap. + */ + AddResource_( stuff->photomap_id, RT_photo, img ); + xieDoSendEvent( client, img, XieK_ComputationEvent ); + } + if( img ) + FreeExport( img ); + + return( Success ); +} /* end ProcImport */ + +/*----------------------------------------------------------------------- +----------------------- Query Export context Procedure ------------------ +------------------------------------------------------------------------*/ +int ProcQueryExport( client ) + ClientPtr client; +{ + PhotofloPtr flo; + PhotomapPtr img; + ExpCtxPtr exp; + xieQueryExportReply rep; + REQUEST( xieQueryExportReq ); + REQUEST_SIZE_MATCH( xieQueryExportReq ); + /* + ** Check out the Photo{flo|map|tap}. + */ + LookupPhotos_(&flo, &img, stuff->photo_id, 0); + AccessOkIf_( !flo || Done_(flo), ResId_(flo)); + exp = Eport_(img); + + /* + ** Create reply for client. + */ + memset( &rep, 0, sizeof(xieQueryExportReply)); + rep.type = X_Reply; + rep.sequenceNumber = client->sequence; + if( exp != NULL ) + { + if( stuff->get_pixels ) + rep.length = ePxlCnt_(exp); + rep.pixel_count = ePxlCnt_(exp); + + if( stuff->lut_id != 0 && eLutMap_(exp) != NULL ) + { + if( ResId_(eLutMap_(exp)) == 0 ) + { + RefCnt_(eLutMap_(exp))++; + AddResource_( stuff->lut_id, RT_photo, eLutMap_(exp) ); + } + rep.lut_id = ResId_(eLutMap_(exp)); + rep.lut_mapping = CmpMap_(eLutMap_(exp)); + } + } + WriteXieReplyToClient(client, sizeof(xieQueryExportReply), &rep); + + if( rep.length > 0 ) + { + SetSwappedDataRtn(client, CARD32); + WriteSwappedXieDataToClient(client, + ePxlCnt_(exp) * sizeof(CARD32), ePxlLst_(exp)); + ePxlCnt_(exp) = 0; + ePxlLst_(exp) = (CARD32 *) DdxFree_( ePxlLst_(exp) ); + } + return( Success ); +} /* end ProcQueryExport */ + +/*----------------------------------------------------------------------- +------------------------ routine: Free Export context ------------------ +------------------------------------------------------------------------*/ +void FreeExport( img ) + PhotomapPtr img; +{ + ExpCtxPtr exp = Eport_(img); + Pixel pixel; + CARD32 i; + + if( IsPointer_(exp) ) + { + if( IsPointer_(eLutMap_(exp)) ) + /* + ** Free the LUT. + */ + UtilFreeResource( eLutMap_(exp) ); + + if( IsPointer_(ePxlLst_(exp)) ) + { /* + ** Free the pixels -- if the Colormap still exists. + */ + LookupColormap_( eCmap_(exp), eCmapId_(exp) ); + + if( eCmap_(exp) && ePxlCnt_(exp) ) + if( sizeof(Pixel) == sizeof(CARD32) ) + FreeColors(eCmap_(exp), eClientIdx_(exp), + ePxlCnt_(exp), (Pixel*)ePxlLst_(exp), (Pixel)0); + else + for( i = 0; i < ePxlCnt_(exp); i++ ) + { + pixel = ePxlLst_(exp)[i]; + FreeColors( eCmap_(exp), eClientIdx_(exp), + 1, &pixel, (Pixel)0 ); + } + DdxFree_( ePxlLst_(exp) ); + } + + /* + ** Free everything else. + */ + ExportDone( exp ); + + Eport_(img) = (ExpCtxPtr) DdxFree_( exp ); + } +} /* end FreeExport */ + +/*----------------------------------------------------------------------- +----------- routine: Create Context for Export to drawable ------------- +------------------------------------------------------------------------*/ +static int CreateExportContext( client, img, X, Y, W, H ) + ClientPtr client; + PhotomapPtr img; + INT32 X,Y; + CARD32 W,H; +{ + PhotofloPtr flo; + PhotomapPtr lut = NULL; + ExpCtxPtr exp = Eport_(img); + double src_lvls, dst_lvls; + CARD32 c, scnstr, padmsk, pxlstr, max_lvls, lvl[XieK_MaxComponents]; + CARD32 w, h, format, mapping, lut_width, level, val, off, mask; + CARD8 *base; + + REQUEST( xieExportReq ); + + LookupDrawableAndGC_(client, stuff->drawable_id, stuff->gc_id); + if( exp != NULL ) + { /* + ** See if we can re-use the existing ExportContext. + */ + AccessOkIf_( !eBusy_(exp), ResId_(img) ); + if( eCmapId_(exp) ) + LookupColormap_( eCmap_(exp), eCmapId_(exp) ); + if( !IsBitonal_(img) && /* continuous-tone AND different... */ + ( client->lastDrawable->depth != eDepth_(exp) /* depth */ + || stuff->photo_lut_id != 0 /* OR: LUT */ + && stuff->photo_lut_id != (eLutMap_(exp) ? ResId_(eLutMap_(exp)) : 0) + || stuff->colormap_id != 0 /* OR: Colormap */ + && stuff->colormap_id != (eCmap_(exp) ? eCmap_(exp)->mid : 0))) + FreeExport( img ); + } + if( Eport_(img) == NULL ) + { + Eport_(img) = (ExpCtxPtr) DdxCalloc_(1, sizeof(ExpCtxRec)); + AllocOkIf_(Eport_(img), ResId_(img)); + exp = Eport_(img); + eClient_(exp) = client; + eDepth_(exp) = IsBitonal_(img) ? 1 : eClientDrw_(exp)->depth; + eRGBPol_(exp) = PxlPol_(img) == XieK_ZeroDark ? 0 : ~0; + for( max_lvls = 0, src_lvls = 1.0, c = 0; c < CmpCnt_(img); c++ ) + { /* + ** Initialize format conversion parameters. + */ + eMul_(exp,c) = c == 0 ? 1 : eMul_(exp,c-1) * eLvl_(exp,c-1); + eLen_(exp,c) = BitsFromLevels_(uLvl_(img,c)); + eLvl_(exp,c) = uLvl_(img,c); + src_lvls *= eLvl_(exp,c); + max_lvls = max(max_lvls, eLvl_(exp,c)); + } + if( stuff->photo_lut_id == 0 ) + MatchOkIf_( src_lvls <= 1<photo_lut_id ) + { + LookupPhotos_( &flo, &lut, stuff->photo_lut_id, -1 ); + BePCM_( lut, stuff->photo_lut_id ); + eLutMap_(exp) = lut; + RefCnt_(lut)++; + AccessOkIf_( FloLnk_(img) == flo, ResId_(lut) ); + if( IsRGB_(lut) ) + { /* + ** Ok if client LUT is compatible with image and drawable. + */ + for( dst_lvls = 1.0, c = 0; c < XieK_MaxComponents; c++ ) + { + MatchOkIf_( uLvl_(img,c) <= uWidth_(lut,c), ResId_(lut) ); + dst_lvls *= uLvl_(lut,c); + eLen_(exp,c) = BitsFromLevels_(uLvl_(lut,c)); + } + MatchOkIf_( dst_lvls <= 1<= src_lvls + && uLvl_(lut,0) <= 1<colormap_id ) + { /* + ** Ok if Colormap and LUT are compatible. + */ + LookupColormap_( eCmap_(exp), stuff->colormap_id ); + ColorOkIf_(eCmap_(exp), stuff->colormap_id); + eCmapId_(exp) = stuff->colormap_id; + switch( eClass_(exp) ) + { + case StaticColor : + case DirectColor : + case TrueColor : + lvl[0] = eRedMsk_(exp) >> eRedOff_(exp); + lvl[1] = eGrnMsk_(exp) >> eGrnOff_(exp); + lvl[2] = eBluMsk_(exp) >> eBluOff_(exp); + if( lvl[0]++ & lvl[1]++ & lvl[2]++ ) + { + MatchOkIf_(IsRGB_(lut) || IsGrayScale_(img) + && eStaticCmap_(exp) + && lvl[0]==lvl[1] + && lvl[1]==lvl[2], ResId_(lut)); + eMasks_(exp) = TRUE; + break; + } /* else StaticColor with no masks -- fall thru */ + default : + MatchOkIf_( !IsRGB_(lut), ResId_(lut) ); + lvl[0] = 1<colormap_id ) + { + LookupColormap_( eCmap_(exp), stuff->colormap_id ); + ColorOkIf_(eCmap_(exp), stuff->colormap_id); + MatchOkIf_(eClass_(exp) > GrayScale || !IsRGB_(img), ResId_(img)); + eCmapId_(exp) = stuff->colormap_id; + eMchLmt_(exp) = MiDecodeDouble( &stuff->match_limit ); + eGryLmt_(exp) = MiDecodeDouble( &stuff->gray_limit ); + switch( eClass_(exp) ) + { + case DirectColor : + eRGBCnt_(exp) = max_lvls; + case TrueColor : + case StaticColor : + lvl[0] = eRedMsk_(exp) >> eRedOff_(exp); + lvl[1] = eGrnMsk_(exp) >> eGrnOff_(exp); + lvl[2] = eBluMsk_(exp) >> eBluOff_(exp); + if( lvl[0]++ & lvl[1]++ & lvl[2]++ ) + { + for( dst_lvls = 1.0, c = 0; c < XieK_MaxComponents; c++ ) + { /* + ** Ok if Photomap levels are compatible with masks. + */ + eLen_(exp,c) = BitsFromLevels_(lvl[c]); + eMul_(exp,c) = 1 << ( c == 0 ? eRedOff_(exp) + : c == 1 ? eGrnOff_(exp) + : eBluOff_(exp) ); + if( eLvl_(exp,c) ) + { + MatchOkIf_( eLvl_(exp,c) <= lvl[c], ResId_(img) ); + dst_lvls *= lvl[c]; + } + else + MatchOkIf_( eDynamicCmap_(exp) + && lvl[c] >= eLvl_(exp,0) + || lvl[c] == lvl[0], ResId_(img) ); + } + eMasks_(exp) = TRUE; + lut_width = max_lvls; + mapping = eDynamicCmap_(exp) ? XieK_RGB : CmpMap_(img); + break; + } /* else StaticColor with no masks -- fall thru */ + case PseudoColor : + case GrayScale : + eRGBCnt_(exp) = src_lvls; + case StaticGray : + dst_lvls = 1< 0 ? eRGBCnt_(exp) + : eRGBPol_(exp) || src_lvls < dst_lvls ? lut_width : 0; + if( lut_width > 0 ) + { /* + ** Create LUT to re-map image to Colormap pixel indices. + */ + lut = UtilCreatePhotomap( mapping, lvl, 1.0, 0, 0, 0, + lut_width, 1, TRUE, TRUE, NULL ); + AllocOkIf_( lut, ResId_(img) ); + eLutMap_(exp) = lut; + if( lut_width > eRGBCnt_(exp) ) + /* + ** Build a LUT to match pixels to static Colormap. + */ + for( c = 0; c < CmpCnt_(lut); c++ ) + { + mask = uLvl_(lut,c) - 1; + base = uBase_(lut,c); + memset( base, 0, uArSize_(lut,c)+7>>3 ); + for( level = 0; level < eLvl_(exp,c); level++ ) + { + off = level*uPxlStr_(lut,c); + val = level*mask/(eLvl_(exp,c)-1)^eRGBPol_(exp); + PUT_VALUE_(base, off, val, mask); + } + } + } + if( eRGBCnt_(exp) > 0 ) + { /* + ** Allocate pixel allocation/match structures (for Step D). + */ + ePxlLst_(exp) = (CARD32*) DdxCalloc_( eRGBCnt_(exp), + sizeof(CARD32) ); + AllocOkIf_(ePxlLst_(exp),ResId_(img)); + eRGBLst_(exp) = (RGBPtr) DdxCalloc_( eRGBCnt_(exp), + sizeof(RGBRec) ); + AllocOkIf_(eRGBLst_(exp),ResId_(img)); + eMapLst_(exp) = (RGBPtr) DdxCalloc_( eMapLen_(exp), + sizeof(RGBRec) ); + AllocOkIf_(eMapLst_(exp),ResId_(img)); + + for( c = 0; c < CmpCnt_(lut); c++ ) + { /* + ** Allocate histogram space (for Step C). + */ + eHst_(exp,c) = (CARD32 *) DdxCalloc_( eRGBCnt_(exp), + sizeof(CARD32)); + AllocOkIf_( eHst_(exp,c), ResId_(img) ); + } + eHstAll_(exp) = IsPhotomap_(img) && (W < Width_(img) + || H < Height_(img)); + } + } + } + + /* + ** The Drawable and GC are allowed to change between Export calls. + */ + eDrwId_(exp) = stuff->drawable_id; + eGCId_(exp) = stuff->gc_id; + /* + ** Find drawable's pixel and scanline requirements for exporting our image. + */ + for( format = 0; format < screenInfo.numPixmapFormats + && eDepth_(exp) != screenInfo.formats[format].depth; format++ ); + + pxlstr = IsBitonal_(img) ? 1 : screenInfo.formats[format].bitsPerPixel; + padmsk = screenInfo.formats[format].scanlinePad - 1; + + if( ePreFmt_(exp) ) + { /* + ** Allocate a Udp for ZPixmap conversion (for Step B). + */ + scnstr = Width_(img) * pxlstr + padmsk & ~padmsk; + ePreUdp_(exp) = UtilAllocUdp( + UtilDType(eDepth_(exp), XieK_PCM, pxlstr, scnstr), + XieK_PCM, Width_(img), Height_(img), + pxlstr, scnstr, + 1<type == DRAWABLE_WINDOW + ? min(eClientDrw_(exp)->pScreen->width, W) : W; + h = eClientDrw_(exp)->type == DRAWABLE_WINDOW + ? min(eClientDrw_(exp)->pScreen->height, H) : H; + scnstr = w * pxlstr + padmsk & ~padmsk; + ePixUdp_(exp) = UtilAllocUdp(UtilDType(eDepth_(exp),XieK_PCM,pxlstr,scnstr), + XieK_PCM, w, h, pxlstr, scnstr, + 1<>lg2; + for( scn = y1; scn <= y2; scn++ ) + { + red_pxl = red_off; + grn_pxl = grn_off; + blu_pxl = blu_off; + dst_pxl = dst_off; + switch( lg2 ) + { + case 3 : + for( pix = x1; pix <= x2; pix++ ) + { + red_val = GET_VALUE_(red_base,red_pxl,red_msk); + grn_val = GET_VALUE_(grn_base,grn_pxl,grn_msk); + blu_val = GET_VALUE_(blu_base,blu_pxl,blu_msk); + dst_val = mul[0]*red_val + mul[1]*grn_val + mul[2]*blu_val; + dst_base[dst_pxl++] = dst_val; + red_pxl += upPxlStr_(red_udp); + grn_pxl += upPxlStr_(grn_udp); + blu_pxl += upPxlStr_(blu_udp); + } + break; + case 4 : + for( pix = x1; pix <= x2; pix++ ) + { + red_val = GET_VALUE_(red_base,red_pxl,red_msk); + grn_val = GET_VALUE_(grn_base,grn_pxl,grn_msk); + blu_val = GET_VALUE_(blu_base,blu_pxl,blu_msk); + dst_val = mul[0]*red_val + mul[1]*grn_val + mul[2]*blu_val; + ((CARD16 *)dst_base)[dst_pxl++] = dst_val; + red_pxl += upPxlStr_(red_udp); + grn_pxl += upPxlStr_(grn_udp); + blu_pxl += upPxlStr_(blu_udp); + } + break; + case 5 : + for( pix = x1; pix <= x2; pix++ ) + { + red_val = GET_VALUE_(red_base,red_pxl,red_msk); + grn_val = GET_VALUE_(grn_base,grn_pxl,grn_msk); + blu_val = GET_VALUE_(blu_base,blu_pxl,blu_msk); + dst_val = mul[0]*red_val + mul[1]*grn_val + mul[2]*blu_val; + ((CARD32 *)dst_base)[dst_pxl++] = dst_val; + red_pxl += upPxlStr_(red_udp); + grn_pxl += upPxlStr_(grn_udp); + blu_pxl += upPxlStr_(blu_udp); + } + break; + case 0 : + for( pix = x1; pix <= x2; pix++ ) + { + red_val = GET_VALUE_(red_base,red_pxl,red_msk); + grn_val = GET_VALUE_(grn_base,grn_pxl,grn_msk); + blu_val = GET_VALUE_(blu_base,blu_pxl,blu_msk); + dst_val = mul[0]*red_val + mul[1]*grn_val + mul[2]*blu_val; + PUT_VALUE_( dst_base, dst_pxl, dst_val, dst_msk ); + red_pxl += upPxlStr_(red_udp); + grn_pxl += upPxlStr_(grn_udp); + blu_pxl += upPxlStr_(blu_udp); + dst_pxl += upPxlStr_(dst_udp); + } + break; + } + red_off += upScnStr_(red_udp); + grn_off += upScnStr_(grn_udp); + blu_off += upScnStr_(blu_udp); + dst_off += upScnStr_(dst_udp)>>lg2; + } + return( Success ); +} /* end CvtRGBBitZPixmap */ + +/*----------------------------------------------------------------------- +---------- routine: Convert byte image data to ZPixmap Format ---------- +------------------------------------------------------------------------*/ +static int CvtRGBBytZPixmap( snk, dst_udp, mul ) + PipeSinkPtr snk; + UdpPtr dst_udp; + CARD32 mul[]; +{ + UdpPtr red_udp = SnkUdpPtr_(snk,0), + grn_udp = SnkUdpPtr_(snk,1), + blu_udp = SnkUdpPtr_(snk,2); + CARD8 *red_base = upBase_(red_udp), + *grn_base = upBase_(grn_udp), + *blu_base = upBase_(blu_udp), + *dst_base; + CARD32 red_msk = (1<>3; + grn_off = upPos_(grn_udp)+upScnStr_(grn_udp)*(y1-upY1_(grn_udp)) + +upPxlStr_(grn_udp)*(x1-upX1_(grn_udp))>>3; + blu_off = upPos_(blu_udp)+upScnStr_(blu_udp)*(y1-upY1_(blu_udp)) + +upPxlStr_(blu_udp)*(x1-upX1_(blu_udp))>>3; + dst_off = upPos_(dst_udp)+upScnStr_(dst_udp)*(y1-upY1_(dst_udp)) + +upPxlStr_(dst_udp)*(x1-upX1_(dst_udp))>>lg2; + + for( scn = y1; scn <= y2; scn++ ) + { + red_pxl = red_off; + grn_pxl = grn_off; + blu_pxl = blu_off; + dst_pxl = dst_off; + + switch( lg2 ) + { + case 3 : + for( pix = x1; pix <= x2; pix++ ) + dst_base[dst_pxl++] = mul[0] * (red_base[red_pxl++] & red_msk) + + mul[1] * (grn_base[grn_pxl++] & grn_msk) + + mul[2] * (blu_base[blu_pxl++] & blu_msk); + break; + case 4 : + for( pix = x1; pix <= x2; pix++ ) + ((CARD16 *)dst_base)[dst_pxl++] = + mul[0] * (red_base[red_pxl++] & red_msk) + + mul[1] * (grn_base[grn_pxl++] & grn_msk) + + mul[2] * (blu_base[blu_pxl++] & blu_msk); + break; + case 5 : + for( pix = x1; pix <= x2; pix++ ) + ((CARD32 *)dst_base)[dst_pxl++] = + mul[0] * (red_base[red_pxl++] & red_msk) + + mul[1] * (grn_base[grn_pxl++] & grn_msk) + + mul[2] * (blu_base[blu_pxl++] & blu_msk); + break; + case 0 : + for( pix = x1; pix <= x2; pix++ ) + { + dst_val = mul[0] * (red_base[red_pxl++] & red_msk) + + mul[1] * (grn_base[grn_pxl++] & grn_msk) + + mul[2] * (blu_base[blu_pxl++] & blu_msk); + PUT_VALUE_( dst_base, dst_pxl, dst_val, dst_msk ); + dst_pxl += upPxlStr_(dst_udp); + } + break; + } + red_off += upScnStr_(red_udp)>>3; + grn_off += upScnStr_(grn_udp)>>3; + blu_off += upScnStr_(blu_udp)>>3; + dst_off += upScnStr_(dst_udp)>>lg2; + } + return( Success ); +} /* end CvtRGBBytZPixmap */ + +#if defined(DWV3) +/*----------------------------------------------------------------------- +------- routine: Draw changelist image data using core X spans -------- +------------------------------------------------------------------------*/ +static void ExportSpans( exp, datudp, pix, win_x, win_y) + ExpCtxPtr exp; /* Pointer to export context */ + UdpPtr datudp; /* Pointer to Udp for changelist */ + UdpPtr pix; /* Export region UDP */ + CARD32 win_x; /* Window X coord for first pixel */ + CARD32 win_y; /* Window Y coord for first pixel */ +{ + CARD32 index; /* index into changelist */ + CARD32 x1, x2; /* Adjusted limits of export region */ + CARD32 X1, X2; /* Limits of current span */ + CARD32 scanline; /* Scanline within the data segment */ + unsigned int *cl; /* Current changelist entry */ + int clpos; /* Pointer to current changelist */ + int clcnt; /* Count of change list entries in */ + /* this scanline */ + int spncnt; /* Number of spans remaining in */ + /* list */ + + DDXPointPtr pt; /* Pointer to span points buffer */ + CARD32 *ptw; /* Pointer to span width buffer */ + + GCPtr spanGC = (eSpnGC_(exp) == NULL) ? eClientGC_(exp) : + eSpnGC_(exp); + /* + ** Get pointer into change list. + */ + clpos = DdxPosCl_(upBase_(datudp),upPos_(datudp),0); + /* + ** Get pointers into span list and count of remaining entries. + */ + pt = eSpnPt_(exp) + eSpnIdx_(exp); + ptw = eSpnW_(exp) + eSpnIdx_(exp); + spncnt = eSpnCnt_(exp) - eSpnIdx_(exp); + /* + ** Compute horizontal bounds + */ + x1 = upX1_(pix) - upX1_(datudp); + x2 = upX2_(pix) - upX1_(datudp); + /* + ** Process each scanline of the input changelist. + */ + for (scanline = 0; scanline < upHeight_(pix); scanline++) + { + cl = upBase_(datudp) + (clpos >> 3); + /* Start at top of current list */ + clcnt = *cl++; /* Count of entries in change list */ + + for (index = 0; index < clcnt; index += 2 ) + { + if (*cl > x2) break; /* Span begins beyond right edge */ + + X1 = *cl++; /* X1 = max(*cl++, x1) */ + if (x1 > X1) X1 = x1; + X2 = *cl++ - 1; /* X2 = min(*cl++, x2) */ + if (x2 < X2) X2 = x2; + + if( X2 >= X1 ) + { + pt->x = win_x + (X1 - x1); + (pt++)->y = win_y + scanline; + *ptw++ = X2 - X1 + 1; + /* + ** If span buffer full, draw them... + */ + if (--spncnt <= 0) + { + FillSpans_(eClientDrw_(exp), + spanGC, + eSpnCnt_(exp), + eSpnPt_(exp), + eSpnW_(exp)); + + pt = eSpnPt_(exp); + ptw = eSpnW_(exp); + spncnt = eSpnCnt_(exp); + } + } + } + clpos = DdxPosCl_(upBase_(datudp),clpos,1); + } + eSpnIdx_(exp) = eSpnCnt_(exp) - spncnt; +} /* ExportSpans */ +#endif + +/*----------------------------------------------------------------------- +--------------- routine: Convert image data to ZPixmap Format ---------- +------------------------------------------------------------------------*/ +static int CvtZPixmap( exp, snk, pix ) + ExpCtxPtr exp; + PipeSinkPtr snk; + UdpPtr pix; +{ + UdpRec dst; + CARD32 c, status = Success; + + if( eLvl_(exp,1) > 0 ) + /* + ** Convert region of RGB image to ZPixmap format. + */ + if( SnkDatTyp_(snk,0) == UdpK_DTypeBU ) + status = CvtRGBBytZPixmap( snk, pix, &eMul_(exp,0) ); + else + status = CvtRGBBitZPixmap( snk, pix, &eMul_(exp,0) ); + + else + { +#ifndef BIGENDIAN /* BIGENDIANEVILHACK */ +/* Can't apply this optimization on big-endian machines since we must bit + * swap the copy of the data we give to the core server. + */ + if( upWidth_(pix) == SnkWidth_(snk,0) + && upHeight_(pix) <= SnkHeight_(snk,0) + && upPxlStr_(pix) == SnkPxlStr_(snk,0) + && upScnStr_(pix) == SnkScnStr_(snk,0) + && upLvl_(pix) == SnkLvl_(snk,0) + && upX1_(pix) == SnkX1_(snk,0) ) + { /* + ** Use monochrome image directly from the Sink Udp buffer. + */ + upBase_(pix) = SnkBase_(snk,0); + upArSize_(pix) = SnkArSize_(snk,0); + upPos_(pix) = SnkScnStr_(snk,0) * (upY1_(pix) - SnkY1_(snk,0)) + + SnkPos_(snk,0); + } else +#endif /* BIGENDIAN */ + { + /* + ** Convert region of monochrome image. + */ + status = DdxConvert_( SnkUdpPtr_(snk,0), pix, XieK_MoveMode ); + if( eMasks_(exp) ) + /* + ** Copy GrayScale data to green and blue components. + */ + for(dst= *pix, c=1 ; c < XieK_MaxComponents && + status==Success; c++) + { + SetupUdp(&dst, SnkLvl_(snk,0), eLen_(exp,c), c); + urPos_(dst) += eLen_(exp,c-1); + status = DdxConvert_(SnkUdpPtr_(snk,0), &dst, + XieK_MoveMode); + } + } +#ifdef BIGENDIAN /* BIGENDIANEVILHACK */ + if( status == Success ) + { + unsigned char *p; + unsigned char *endp = upBase_(pix)+(7+upArSize_(pix))/8+1; + for(p = upBase_(pix); p < endp; ++p) + *p = _reverse_byte[*p]; + } +#endif + } + return( status ); +} /* end CvtZPixmap */ + +/*----------------------------------------------------------------------- +-------- routine: Export formatted Photo{map|tap} data to drawable ------ +------------------------------------------------------------------------*/ +static int Export( exp, snk, pix, x, y ) + ExpCtxPtr exp; + PipeSinkPtr snk; + UdpPtr pix; + INT32 x,y; +{ + PhotomapPtr lut = eLutMap_(exp); + UdpRec src, dst; + CARD32 sc, dc, status = Success; + +#if defined(DWV3) + if (SnkDatTyp_(snk, 0) != UdpK_DTypeCL) { +#endif + if( lut != NULL ) + { + if( upBase_(pix) == NULL && + ( upBase_(pix) = (CARD8 *)DdxMallocBits_(upArSize_(pix)) ) == NULL ) + return( BadAlloc ); + /* + ** Step E: re-map image pixels to LUT (Colormap) pixel indices. + */ + if( IsRGB_(lut) ) + for( src = *pix, dst = *pix, dc = 0; dc < CmpCnt_(lut); dc++ ) + { /* + ** Set up source Udp. + */ + sc = eLvl_(exp,dc) ? dc : 0; + if( ePreFmt_(exp) ) + SetupUdp( &src, eLvl_(exp,sc), eLen_(exp,sc), sc ); + else + src = SnkUdp_(snk,sc); + /* + ** Set up destination Udp. + */ + SetupUdp( &dst, uLvl_(lut,dc), eLen_(exp,dc), dc ); + if( eMasks_(exp) ) + urPos_(dst) = dc == 0 ? eRedOff_(exp) + : dc == 1 ? eGrnOff_(exp) : eBluOff_(exp); + + status = DdxPoint_( &src, &dst, NULL, Udp_(lut,dc) ); + if( status != Success ) return( status ); + if( !eMasks_(exp) ) + urPos_(dst) += urPxlLen_(dst); + if( ePreFmt_(exp) && eLvl_(exp,dc) ) + urPos_(src) += urPxlLen_(src); + } + + else + { /* + ** Choose the source Udp -- then do it. + */ + src = ePreFmt_(exp) ? + eHstAll_(exp) ? *ePreUdp_(exp) : *pix : SnkUdp_(snk,0); + + status = DdxPoint_( &src, pix, NULL, Udp_(lut,0) ); + if( status != Success ) return( status ); + + if( eMasks_(exp) ) + { /* + ** Copy GrayScale data to green and blue components. + */ + src = *pix; + dst = *pix; + SetupUdp(&src, uLvl_(lut,0), eLen_(exp,0), 0); + for( dc = 1; dc < XieK_MaxComponents; dc++ ) + { + SetupUdp(&dst, uLvl_(lut,0), eLen_(exp,dc), dc); + urPos_(dst) += eLen_(exp,dc-1); + status = DdxConvert_( &src, &dst, XieK_MoveMode ); + if( status != Success ) return( status ); + } + } + } + } + else + { /* + ** Step F: post-format as ZPixmap image data. + */ + status = CvtZPixmap( exp, snk, pix ); + if( status != Success ) return( status ); + } + /* + ** Step G: export our finished masterpiece to the drawable. + */ + PutImage_( eClientDrw_(exp), eClientGC_(exp), /* Drawable & GC */ + eDepth_(exp), /* Drawable depth */ + x, y, upWidth_(pix), upHeight_(pix), /* Drawable region */ + upPos_(pix) & 31, /* data left pad */ + eDepth_(exp) > 1 ? ZPixmap : /* data format */ + eClientDrw_(exp)->type == DRAWABLE_PIXMAP ? XYPixmap : XYBitmap, + upBase_(pix) + (upPos_(pix) >> 3 & ~3)); /* data address */ + if( upBase_(pix) == SnkBase_(snk,0) ) + upBase_(pix) = NULL; + +#if defined(DWV3) + } else { + /* + * Export changelist data using core X FillSpan operation. + */ + ExportSpans(exp, SnkUdpPtr_(snk, 0), pix, x, y); + } +#endif + + return( Success ); +} /* end Export */ + +/*----------------------------------------------------------------------- +---------------- routine: free temporary Export resources -------------- +------------------------------------------------------------------------*/ +static void ExportDone( exp ) + ExpCtxPtr exp; +{ + CARD32 c; + + for( c = 0; c < XieK_MaxComponents && eHst_(exp,c); c++ ) + eHst_(exp,c) = (CARD32 *) DdxFree_( eHst_(exp,c) ); + + eMapLst_(exp) = (RGBPtr) DdxFree_( eMapLst_(exp) ); + eRGBLst_(exp) = (RGBPtr) DdxFree_( eRGBLst_(exp) ); + ePreUdp_(exp) = UtilFreeUdp( ePreUdp_(exp) ); + ePixUdp_(exp) = UtilFreeUdp( ePixUdp_(exp) ); + + eHstAll_(exp) = FALSE; + eBusy_(exp) = FALSE; + +#if defined(DWV3) + /* Free the span buffers and span GC, if used */ + if( eSpnW_(exp) != NULL ) + eSpnW_(exp) = (CARD32 *) DdxFree_(eSpnW_(exp)); + + if( eSpnPt_(exp) != NULL ) + eSpnPt_(exp) = (DDXPointPtr)DdxFree_(eSpnPt_(exp)); + + if( eSpnGC_(exp) != NULL ) + { + FreeScratchGC(eSpnGC_(exp)); + eSpnGC_(exp) = NULL; + } +#endif +} /* end ExportDone */ + +/*----------------------------------------------------------------------- +---------- routine: Format Photo{map|tap} for export to drawable -------- +------------------------------------------------------------------------*/ +static int Format( exp, snk ) + ExpCtxPtr exp; + PipeSinkPtr snk; +{ + INT32 status = Success; + + if( ePreFmt_(exp) ) + /* + ** Step B: pre-format as ZPixmap image data. + */ + status = CvtZPixmap( exp, snk, eHstAll_(exp) ? ePreUdp_(exp) + : ePixUdp_(exp) ); + if( status == Success && eHst_(exp,0) != NULL ) + /* + ** Step C: create and analyze histogram. + ** Step D: allocate and/or match colors, then fill in the LUT. + */ + switch( eClass_(exp) ) + { + case GrayScale : + case StaticColor : + case PseudoColor : + FormatPseudoColor( exp, snk ); + break; + + case DirectColor : + FormatDirectColor( exp, snk ); + break; + } + return( status ); +} /* end Format */ + +/*----------------------------------------------------------------------- +---------------------- routine: Format for DirectColor ------------------ +------------------------------------------------------------------------*/ +static void FormatDirectColor( exp, snk ) + ExpCtxPtr exp; + PipeSinkPtr snk; +{ + UdpPtr src, roi; + RGBRec state, *rgb; + CARD32 status, c, i, maxCnt, cnt[XieK_MaxComponents]; + + for( maxCnt = 0, c = 0; c < XieK_MaxComponents && eLvl_(exp,c); c++ ) + { /* + ** Step C: create histogram of individual component usage. + */ + src = SnkUdpPtr_(snk,c); + roi = eHstAll_(exp) ? src : ePixUdp_(exp); + Histogram( src, roi, eHst_(exp,c) ); + cnt[c] = HistogramAnalysis( exp, c ); + maxCnt = max(maxCnt, cnt[c]); + memset( uBase_(eLutMap_(exp),c), 0, uArSize_(eLutMap_(exp),c)+7>>3 ); + } + for( eRGBCnt_(exp) = maxCnt; c < XieK_MaxComponents; c++ ) + { + cnt[c] = cnt[0]; + memset( uBase_(eLutMap_(exp),c), 0, uArSize_(eLutMap_(exp),c)+7>>3 ); + } + ReadTripleMap( exp, &state, cnt ); + + for( rgb = eRGBLst_(exp), i = 0; i < maxCnt; rgb++, i++ ) + { + rgb->red = i < cnt[0] ? SetDirectColor_(exp,eHst_(exp,0)[i],0,rgb) + : state.red; + rgb->grn = i < cnt[1] ? SetDirectColor_(exp,eHst_(exp,1)[i],1,rgb) + : state.grn; + rgb->blu = i < cnt[2] ? SetDirectColor_(exp,eHst_(exp,2)[i],2,rgb) + : state.blu; + } + for( rgb = eRGBLst_(exp), i = 0; i < maxCnt; rgb++, i++ ) + { /* + ** Step D: allocate pixels. + */ + rgb->pixel = ~0; + if( MatchDirectAllocColor( exp, &state, rgb ) != Success ) + continue; + + ePxlLst_(exp)[ePxlCnt_(exp)++] = rgb->pixel; + if( i < cnt[0] ) + SetLutEntry(exp, (CARD32)(rgb->pixel >> eRedOff_(exp)), 0, i); + if( i < cnt[1] ) + SetLutEntry(exp, (CARD32)(rgb->pixel >> eGrnOff_(exp)), 1, i); + if( i < cnt[2] ) + SetLutEntry(exp, (CARD32)(rgb->pixel >> eBluOff_(exp)), 2, i); + } +} /* end FormatDirectColor */ + +/*----------------------------------------------------------------------- +---------------------- routine: Format for PseudoColor ------------------ +------------------------------------------------------------------------*/ +static void FormatPseudoColor( exp, snk ) + ExpCtxPtr exp; + PipeSinkPtr snk; +{ + UdpPtr src, roi; + CARD32 i, state; + double range = 65535.0 * 65535.0 * 3.0; + double limit = eMchLmt_(exp) * range; + + /* + ** Step C: create histogram of combined component usage. + */ + src = ePreFmt_(exp) ? eHstAll_(exp) ? ePreUdp_(exp) : ePixUdp_(exp) + : SnkUdpPtr_(snk,0); + roi = eHstAll_(exp) ? SnkUdpPtr_(snk,0) : ePixUdp_(exp); + Histogram( src, roi, eHst_(exp,0) ); + eRGBCnt_(exp) = HistogramAnalysis( exp, 0 ); + memset( uBase_(eLutMap_(exp),0), 0, uArSize_(eLutMap_(exp),0)+7>>3 ); + + /* + ** Step D: allocate pixels. + */ + state = MatchPseudoInit( exp ); + switch( state ) + { + case FREE : + /* + ** Allocate new pixels: there are enough free so allocation can't fail. + */ + for( i = 0; i < eRGBCnt_(exp); MatchPseudoAllocColor(exp, i++, FALSE) ); + break; + + case SHARED : + if( limit < range ) + /* + ** Allocate new pixels where no reasonable match can be found. + */ + MatchPseudoDistant( exp, limit ); + /* fall thru to allocate any remaining */ + case OWNED : + if( ePxlCnt_(exp) < eRGBCnt_(exp) ) + /* + ** Use the closest match for each required pixel. + */ + MatchPseudoClosest( exp ); + break; + } +} /* end FormatPseudoColor */ + +/*----------------------------------------------------------------------- +------------------ routine: create a Histogram of pixel useage ---------- +------------------------------------------------------------------------*/ +static void Histogram( udp, roi, hst ) + UdpPtr udp, roi; + CARD32 hst[]; +{ + INT32 x, y, X1, Y1, X2, Y2, pxl, pxl_nxt, scn_nxt; + CARD8 *base = upBase_(udp); + CARD32 msk = (1<> 3; + scn_nxt =(upScnStr_(udp) >> 3) - (X2 - X1 + 1) * pxl_nxt; + pxl = upPos_(udp) + upScnStr_(udp) * (upY1_(udp) - Y1) + + upPxlStr_(udp) * (upX1_(udp) - X1) >> 3; + + for( y = Y1; y++ <= Y2; pxl += scn_nxt ) + for( x = X1; x++ <= X2; pxl += pxl_nxt ) + hst[ base[pxl] & msk ]++; + break; + + default : + pxl_nxt = upPxlStr_(udp); + scn_nxt = upScnStr_(udp) - (X2 - X1 + 1) * pxl_nxt; + pxl = upPos_(udp) + upScnStr_(udp) * (upY1_(udp) - Y1) + + upPxlStr_(udp) * (upX1_(udp) - X1); + + for( y = Y1; y++ <= Y2; pxl += scn_nxt ) + for( x = X1; x++ <= X2; pxl += pxl_nxt ) + hst[GET_VALUE_(base,pxl,msk)]++; + break; + } +} /* end Histogram */ + +/*----------------------------------------------------------------------- +---------------------- routine: Analyze histogram data ------------------ +------------------------------------------------------------------------*/ +static CARD32 HistogramAnalysis( exp, comp ) + ExpCtxPtr exp; + CARD32 comp; +{ + CARD32 i, j, count, swap, *list = ePxlLst_(exp), *data = eHst_(exp,comp); + /* + ** Fill PxlLst with values required. + */ + for( j = 0, i = 0; i < eRGBCnt_(exp); i++ ) + if( data[i] != 0 ) + list[j++] = i; + + count = j; + /* + ** Sort PxlLst -- ordered by descending frequency of usage. + */ + while( j-- > 1 ) + for( i = 0; i < j; i++ ) + if( data[ list[i] ] < data[ list[i+1] ] ) + { + swap = list[i]; + list[i] = list[i+1]; + list[i+1] = swap; + } + /* + ** Replace the Histogram with the sorted list and leave PxlLst zeroed. + */ + if( count < eRGBCnt_(exp) ) + memset( &list[count], 0, (eRGBCnt_(exp) - count) * sizeof(CARD32) ); + eHst_(exp,comp) = list; + memset( data, 0, eRGBCnt_(exp) * sizeof(CARD32) ); + ePxlLst_(exp) = data; + + return( count ); +} /* end HistogramAnalysis */ + +/*----------------------------------------------------------------------- +--------------------- routine: Import from Drawable -------------------- +------------------------------------------------------------------------*/ +static int Import( client, img ) + ClientPtr client; + PhotomapPtr *img; +{ + ExpCtxPtr exp; + CARD32 c, format, mapping, scnstr, padmsk, pxlstr, width, height; + REQUEST( xieImportReq ); + + exp = (ExpCtxPtr) DdxCalloc_(1, sizeof(ExpCtxRec)); + AllocOkIf_(exp, stuff->photomap_id); + eClient_(exp) = client; + + LookupDrawable_( client, stuff->drawable_id ); + DrawableOkIf_( eClientDrw_(exp), (DdxFree_(exp), stuff->drawable_id) ); + MatchOkIf_( eClientDrw_(exp)->type == DRAWABLE_PIXMAP + || eClientDrw_(exp)->type == DRAWABLE_WINDOW + && ((WindowPtr)eClientDrw_(exp))->realized + && DrawableX_(eClientDrw_(exp)) >= 0 + && DrawableX_(eClientDrw_(exp)) + DrawableWidth_(eClientDrw_(exp)) + <= eClientDrw_(exp)->pScreen->width + && DrawableY_(eClientDrw_(exp)) >= 0 + && DrawableY_(eClientDrw_(exp)) + DrawableHeight_(eClientDrw_(exp)) + <= eClientDrw_(exp)->pScreen->height, + (DdxFree_(exp), stuff->drawable_id)); + eDepth_(exp) = eClientDrw_(exp)->depth; + if( eDepth_(exp) > 1 ) + { + LookupColormap_( eCmap_(exp), stuff->colormap_id ); + ColorOkIf_(eCmap_(exp), (DdxFree_(exp), stuff->colormap_id)); + } + /* + ** Allocate the destination Photomap. + */ + for( c = 0; c < XieK_MaxComponents; c++ ) + eLvl_(exp, c) = !eCmap_(exp) ? 2 : 1<bitsPerRGBValue; + width = DrawableWidth_( eClientDrw_(exp)); + height = DrawableHeight_(eClientDrw_(exp)); + mapping = !eCmap_(exp) ? XieK_Bitonal : eClass_(exp) <= GrayScale + ? XieK_GrayScale : XieK_RGB; + *img = UtilCreatePhotomap( mapping, &eLvl_(exp,0), + 1.0, XieK_PP0, XieK_LP270, + XieK_ZeroDark, width, height, + TRUE, TRUE, NULL ); + AllocOkIf_( *img, (DdxFree_(exp), stuff->photomap_id) ); + PxlPol_(*img) = stuff->polarity; + Eport_(*img) = exp; + if( IsBitonal_(*img) ) + /* + ** Discard the Photomap Udp -- probably doesn't match the Drawable. + */ + Udp_(*img,0) = UtilFreeUdp( Udp_(*img,0) ); + + /* + ** Allocate a Udp for importing ZPixmap formatted Drawable contents. + */ + for( format = 0; format < screenInfo.numPixmapFormats + && eDepth_(exp) != screenInfo.formats[format].depth; format++ ); + pxlstr = screenInfo.formats[format].bitsPerPixel; + padmsk = screenInfo.formats[format].scanlinePad - 1; + scnstr = pxlstr * width + padmsk & ~padmsk; + ePixUdp_(exp) = UtilAllocUdp(UtilDType(eDepth_(exp),XieK_PCM,pxlstr,scnstr), + XieK_PCM, width, IsBitonal_(*img) ? height : 1, + pxlstr, scnstr, + 1<photomap_id ); + if( IsBitonal_(*img) ) + { /* + ** No analysis necessary -- GetImage directly into Photomap. + */ + (*eClientDrw_(exp)->pScreen->GetImage) + (eClientDrw_(exp),0,0,width,height,ZPixmap,1,upBase_(ePixUdp_(exp))); + Udp_(*img,0) = ePixUdp_(exp); + ePixUdp_(exp) = NULL; + } + else + { /* + ** Allocate Colormap space and interpret the imported data. + */ + eMapLst_(exp) = (RGBPtr) DdxCalloc_(eMapLen_(exp), sizeof(RGBRec)); + AllocOkIf_(eMapLst_(exp),stuff->photomap_id); + + CmpMap_(*img) = eClass_(exp) <= PseudoColor ? ImportSingleMapData(*img) + : ImportTripleMapData(*img); + if( CmpMap_(*img) < mapping ) + { /* + ** Demote the Photomap to match the image data analysis. + */ + for( c = CmpCnt_(*img), CmpCnt_(*img) = 1; + --c > 0; Udp_(*img,c) = UtilFreeUdp( Udp_(*img,c) )); + + if( IsBitonal_(*img) ) + uLvl_(*img,0) = 2; + } + ePixUdp_(exp) = UtilFreeUdp( ePixUdp_(exp) ); + } + + return( Success ); +} /* end Import */ + +/*----------------------------------------------------------------------- +-------------- routine: Import Single ColorMap image Data -------------- +------------------------------------------------------------------------*/ +static int ImportSingleMapData( img ) + PhotomapPtr img; +{ + ExpCtxPtr exp = Eport_(img); + RGBPtr map; + UdpPtr src_udp = ePixUdp_(exp), + dst_udp = Udp_(img,0); + BOOL gray = FALSE, + rgb = IsRGB_(img); + CARD8 *src_buf = upBase_(src_udp), + *red_buf = upBase_(dst_udp), + *grn_buf = (rgb ? uBase_(img,1) : NULL), + *blu_buf = (rgb ? uBase_(img,2) : NULL); + CARD32 src_lg2 = upPxlStr_(src_udp) == 8 ? 3 + : upPxlStr_(src_udp) == 16 ? 4 + : upPxlStr_(src_udp) == 32 ? 5 : 0; + CARD32 dst_lg2 = upPxlStr_(dst_udp) == 8 ? 3 + : upPxlStr_(dst_udp) == 16 ? 4 + : upPxlStr_(dst_udp) == 32 ? 5 : 0; + CARD32 src_msk = (1 << eVisual_(exp)->nplanes)-1, + dst_msk = (1 << dst_lg2)-1; + CARD32 dst_off = 0, + discard = 16 - BitsFromLevels_(upLvl_(dst_udp)); + CARD32 src_val, dst_pxl, i, scn, pix; + + /* + ** Grab a snapshot of the Colormap. + */ + ReadSingleMap( exp, NULL ); + + /* + ** Fill in Photomap data based on Colormap RGB values. + */ + for( scn = 0; scn < upHeight_(dst_udp); scn++ ) + { + (*eClientDrw_(exp)->pScreen->GetImage) + (eClientDrw_(exp),0,scn,upWidth_(src_udp),1,ZPixmap,src_msk,src_buf); + + for( dst_pxl = dst_off, pix = 0; pix < upWidth_(dst_udp); pix++ ) + { + src_val = src_lg2 == 3 ? ((CARD8 *)src_buf)[pix] & src_msk + : src_lg2 == 4 ? ((CARD16 *)src_buf)[pix] & src_msk + : src_lg2 == 5 ? ((CARD32 *)src_buf)[pix] & src_msk + : GET_VALUE_(src_buf,(pix*upPxlStr_(src_udp)),src_msk); + + map = &eMapLst_(exp)[src_val]; + map->status = TRUE; + + if( dst_lg2 == 3 ) + { + if( rgb ) + { + blu_buf[dst_pxl] = map->blu >> discard; + grn_buf[dst_pxl] = map->grn >> discard; + } + red_buf[dst_pxl++] = map->red >> discard; + } + else + { + dst_pxl = dst_off + pix * upPxlStr_(dst_udp); + if( rgb ) + { + PUT_VALUE_(blu_buf, dst_pxl, map->blu >> discard, dst_msk); + PUT_VALUE_(grn_buf, dst_pxl, map->grn >> discard, dst_msk); + } + PUT_VALUE_( red_buf, dst_pxl, map->red >> discard, dst_msk ); + } + } + dst_off += upScnStr_(dst_udp) >> dst_lg2; + } + /* + ** Scan thru the colors used to determine the actual mapping. + */ + for(map = eMapLst_(exp), gray = FALSE, i = 0; i < eMapLen_(exp); map++, i++) + if( map->status ) + { + if( map->red ^ map->grn | map->red ^ map->blu ) + break; /* color: red<>green<>blue */ + pix = (INT16)(map->red)>>discard; + gray = gray || pix && ~pix; /* gray: not black or white */ + } + return(i < eMapLen_(exp) ? XieK_RGB : gray ? XieK_GrayScale : XieK_Bitonal); +} /* end ImportSingleMapData */ + +/*----------------------------------------------------------------------- +-------------- routine: Import Triple ColorMap image Data -------------- +------------------------------------------------------------------------*/ +static int ImportTripleMapData( img ) + PhotomapPtr img; +{ + ExpCtxPtr exp = Eport_(img); + RGBPtr map = eMapLst_(exp); + UdpPtr src_udp = ePixUdp_(exp), + dst_udp = Udp_(img,0); + BOOL gray = FALSE, rgb = FALSE; + CARD8 *src_buf = upBase_(src_udp), + *red_buf = uBase_(img,0), + *grn_buf = uBase_(img,1), + *blu_buf = uBase_(img,2); + CARD32 src_lg2 = upPxlStr_(src_udp) == 8 ? 3 + : upPxlStr_(src_udp) == 16 ? 4 + : upPxlStr_(src_udp) == 32 ? 5 : 0; + CARD32 dst_lg2 = upPxlStr_(dst_udp) == 8 ? 3 + : upPxlStr_(dst_udp) == 16 ? 4 + : upPxlStr_(dst_udp) == 32 ? 5 : 0; + CARD32 red_shf = eRedOff_(exp), + grn_shf = eGrnOff_(exp), + blu_shf = eBluOff_(exp); + CARD32 src_msk = (1 << eVisual_(exp)->nplanes)-1, + dst_msk = (1 << dst_lg2)-1, + red_msk = eRedMsk_(exp), + grn_msk = eGrnMsk_(exp), + blu_msk = eBluMsk_(exp); + CARD32 dst_off = 0, + discard = 16 - BitsFromLevels_(upLvl_(dst_udp)); + CARD32 src_val, dst_pxl, red_val, grn_val, blu_val, scn, pix; + + /* + ** Grab a snapshot of the Colormap. + */ + ReadTripleMap( exp, NULL, NULL ); + + /* + ** Fill in Photomap data based on Colormap RGB values. + */ + for( scn = 0; scn < upHeight_(dst_udp); scn++ ) + { + (*eClientDrw_(exp)->pScreen->GetImage) + (eClientDrw_(exp),0,scn,upWidth_(src_udp),1,ZPixmap,src_msk,src_buf); + + for( dst_pxl = dst_off, pix = 0; pix < upWidth_(dst_udp); pix++ ) + { + src_val = src_lg2 == 5 ? ((CARD32 *)src_buf)[pix] + : src_lg2 == 3 ? ((CARD8 *)src_buf)[pix] + : src_lg2 == 4 ? ((CARD16 *)src_buf)[pix] + : GET_VALUE_(src_buf,(pix*upPxlStr_(src_udp)),src_msk); + red_val = (INT16)(map[(src_val&red_msk)>>red_shf].red)>>discard; + grn_val = (INT16)(map[(src_val&grn_msk)>>grn_shf].grn)>>discard; + blu_val = (INT16)(map[(src_val&blu_msk)>>blu_shf].blu)>>discard; + rgb = rgb || red_val ^ grn_val | red_val ^ blu_val; + gray = gray || red_val && ~red_val; + + if( dst_lg2 == 3 ) + { + red_buf[dst_pxl ] = red_val; + grn_buf[dst_pxl ] = grn_val; + blu_buf[dst_pxl++] = blu_val; + } + else + { + dst_pxl = dst_off + pix * upPxlStr_(dst_udp); + PUT_VALUE_( red_buf, dst_pxl, red_val, dst_msk ); + PUT_VALUE_( grn_buf, dst_pxl, grn_val, dst_msk ); + PUT_VALUE_( blu_buf, dst_pxl, blu_val, dst_msk ); + } + } + dst_off += upScnStr_(dst_udp) >> dst_lg2; + } + return( rgb ? XieK_RGB : gray ? XieK_GrayScale : XieK_Bitonal ); +} /* end ImportTripleMapData */ + +/*----------------------------------------------------------------------- +-------------------- routine: initialize for export using spans --------- +------------------------------------------------------------------------*/ +static int InitForSpans( ctx, exp ) + ExportPipeCtxPtr ctx; + ExpCtxPtr exp; /* export context */ +{ +#if defined(DWV3) + + int size, i; + DDXPointPtr pt, nxtpt; + CARD32 *w, *nxtw; + GCPtr spanGC; + GCPtr revGC = NULL; + CARD32 GCval; + + eSpnGC_(exp) = NULL; + eSpnW_(exp) = NULL; + eSpnPt_(exp) = NULL; + + LookupDrawable_( eClient_(exp), eDrwId_(exp) ); + + /* + * Select the GC needed to draw the spans. + */ + if (eClientDrw_(exp)->type == DRAWABLE_PIXMAP && + eClientDrw_(exp)->depth == 1) { + /* For depth 1 pixmap, make a GC that will just copy the bits */ + eSpnGC_(exp) = (GCPtr)CreateScratchGC(eClientDrw_(exp)->pScreen, + 1); + if (eSpnGC_(exp) == NULL) + goto alloc_fail; + CopyGC(eClientGC_(exp), eSpnGC_(exp), ~0L); + GCval = ~0L; + ChangeGC(eSpnGC_(exp), GCForeground, &GCval); + GCval = 0L; + ChangeGC(eSpnGC_(exp), GCBackground, &GCval); + + spanGC = eSpnGC_(exp); + + } else { + LookupGC_( eClient_(exp), eGCId_(exp) ); + spanGC = eClientGC_(exp); + } + ValidateGC(eClientDrw_(exp), spanGC); + + /* Allocate buffers for describing the largest possible number of + * spans we will draw: + * one for each scanline in the window (drawing background) + * one for every other pixel in a scanline (drawing foreground) + */ + size = max(upWidth_(ePixUdp_(exp))/2+1, upHeight_(ePixUdp_(exp))); + eSpnW_(exp) = (CARD32 *)DdxMalloc_(size * sizeof(int)); + if (!IsPointer_(eSpnW_(exp))) + goto alloc_fail; + eSpnPt_(exp) = (DDXPointPtr)DdxMalloc_(size * + sizeof(DDXPointRec)); + if (!IsPointer_(eSpnPt_(exp))) + goto alloc_fail; + + eSpnCnt_(exp) = size - 1; + eSpnIdx_(exp) = 0; + + /* Create a GC with reversed foreground/background for drawing + * the spans which must be in the background color. + */ + revGC = (GCPtr)CreateScratchGC(eClientDrw_(exp)->pScreen, + eClientDrw_(exp)->depth); + if (revGC == NULL) + goto alloc_fail; + CopyGC(spanGC, revGC, ~0L); + GCval = spanGC->fgPixel; + ChangeGC(revGC, GCBackground, &GCval); + + GCval = spanGC->bgPixel; + ChangeGC(revGC, GCForeground, &GCval); + + ValidateGC(eClientDrw_(exp), revGC); + + /* Build the changelists needed to draw the entire window background */ + nxtpt = eSpnPt_(exp); + nxtw = eSpnW_(exp); + for (i = 0; i < upHeight_(ePixUdp_(exp)); i++) { + nxtpt->x = ExpDstX_(ctx); + (nxtpt++)->y = ExpDstY_(ctx) + i; + *nxtw++ = upWidth_(ePixUdp_(exp)); + } + + /* Draw the background */ + FillSpans_( eClientDrw_(exp), revGC, + upHeight_(ePixUdp_(exp)), eSpnPt_(exp), eSpnW_(exp)); + (void)FreeScratchGC(revGC); + UsingScratchGC_(eClient_(exp), NULL); + + return( Success ); + +alloc_fail: + + if (eSpnGC_(exp) != NULL) { + FreeScratchGC(eSpnGC_(exp)); + eSpnGC_(exp) = 0; + } + if (eSpnW_(exp) != NULL) + eSpnW_(exp) = (CARD32 *)DdxFree_(eSpnW_(exp)); + if (eSpnPt_(exp) != NULL) + eSpnPt_(exp) = (DDXPointPtr)DdxFree_(eSpnPt_(exp)); + if (revGC != NULL) + FreeScratchGC(revGC); + + return( BadAlloc ); +#else + return( Success ); +#endif +} + +/*----------------------------------------------------------------------- + -------------------- routine: allocate a new DirectColor ---------------- + ------------------------------------------------------------------------*/ +static CARD32 MatchDirectAllocColor( exp, state, rgb ) + ExpCtxPtr exp; /* export context */ + RGBPtr state; /* Colormap state info */ + RGBPtr rgb; /* RGB triplet to be allocated */ +{ + RGBPtr r, g, b, map = eMapLst_(exp); + CARD32 dr, dg, db, i, status; + + status = AllocColor( eCmap_(exp), &rgb->red, &rgb->grn, &rgb->blu, + &rgb->pixel, eClientIdx_(exp) ); + if( status != Success ) + { /* + ** Find the closest match for each component. + */ + for( r = g = b = map, dr = dg = db = -1, i = 0; i < eMapLen_(exp); i++ ) + { + if(map[i].Rstate >= SHARED && dr > abs((int)(map[i].red-rgb->red))) + { + dr = abs((int)(map[i].red-rgb->red)); + r = &map[i]; + } + if(map[i].Gstate >= SHARED && dg > abs((int)(map[i].grn-rgb->grn))) + { + dg = abs((int)(map[i].grn-rgb->grn)); + g = &map[i]; + } + if(map[i].Bstate >= SHARED && db > abs((int)(map[i].blu-rgb->blu))) + { + db = abs((int)(map[i].blu-rgb->blu)); + b = &map[i]; + } + } + rgb->red = r->red; + rgb->grn = g->grn; + rgb->blu = b->blu; + rgb->pixel = r->pixel & eRedMsk_(exp) + | g->pixel & eGrnMsk_(exp) + | b->pixel & eBluMsk_(exp); + status = AllocColor( eCmap_(exp), &rgb->red, &rgb->grn, &rgb->blu, + &rgb->pixel, eClientIdx_(exp) ); + } + if( status == Success ) + { + r = &map[(rgb->pixel & eRedMsk_(exp)) >> eRedOff_(exp)]; + g = &map[(rgb->pixel & eGrnMsk_(exp)) >> eGrnOff_(exp)]; + b = &map[(rgb->pixel & eBluMsk_(exp)) >> eBluOff_(exp)]; + r->red = rgb->red; + g->grn = rgb->grn; + b->blu = rgb->blu; + r->Rstate = SHARED; + g->Gstate = SHARED; + b->Bstate = SHARED; + } + return( status ); +} /* end MatchDirectAllocColor */ + +/*----------------------------------------------------------------------- +-------------------- routine: allocate a new PseudoColor ---------------- +------------------------------------------------------------------------*/ +static CARD32 MatchPseudoAllocColor( exp, index, update ) + ExpCtxPtr exp; + CARD32 index; + BOOL update; +{ + RGBPtr lst, rgb = &eRGBLst_(exp)[index]; + CARD32 i, status, distance, sum, sqr; + Pixel pixel; + INT32 dif; + + ePxlLst_(exp)[ePxlCnt_(exp)] = -1; + + status = AllocColor( eCmap_(exp), &rgb->red, &rgb->grn, &rgb->blu, + &pixel, eClientIdx_(exp)); + if( status == Success ) + { + ePxlLst_(exp)[ePxlCnt_(exp)++] = pixel; + rgb->Pstate = OWNED; + rgb->pixel = pixel; + rgb->distance = 0.0; + eRGBLst_(exp)[index] = *rgb; + eMapLst_(exp)[pixel] = *rgb; + SetLutEntry( exp, (CARD32)pixel, 0, index ); + + if( update ) + /* + ** See if our new color is a better match for any pending colors. + */ + for( lst = eRGBLst_(exp), i = 0; i < eRGBCnt_(exp); lst++, i++ ) + if( lst->Pstate == PRIVATE ) + { + dif = rgb->red - lst->red; + sqr = dif * dif; + dif = rgb->grn - lst->grn; + sum = dif * dif + sqr; + if( sum < sqr ) + continue; /* overflow */ + + dif = rgb->blu - lst->blu; + distance = dif * dif + sum; + + if( lst->distance > distance && distance >= sum ) + { + lst->distance = distance; + lst->pixel = pixel; + } + } + } + return( status ); +} /* end MatchPseudoAllocColor */ + +/*----------------------------------------------------------------------- +-------------------- routine: share existing PseudoColors --------------- +------------------------------------------------------------------------*/ +static void MatchPseudoClosest( exp ) + ExpCtxPtr exp; +{ + RGBPtr rgb, map; + CARD32 index; + + for( rgb = eRGBLst_(exp), index = 0; index < eRGBCnt_(exp); rgb++, index++ ) + if( rgb->Pstate == PRIVATE ) + { + map = &eMapLst_(exp)[rgb->pixel]; + + if( map->Pstate == SHARED ) + { + AllocColor(eCmap_(exp), &map->red, &map->grn, &map->blu, + &map->pixel, eClientIdx_(exp)); + ePxlLst_(exp)[ePxlCnt_(exp)++] = map->pixel; + } + map->Pstate = OWNED; + *rgb = *map; + SetLutEntry( exp, (CARD32)(map->pixel), 0, index ); + } +} /* end MatchPseudoClosest */ + +/*----------------------------------------------------------------------- +-------- routine: allocate PseudoColors which have no close match ------- +------------------------------------------------------------------------*/ +static void MatchPseudoDistant( exp, limit ) + ExpCtxPtr exp; + double limit; +{ + CARD32 i, count; + double mean; + + MatchPseudoAllocColor( exp, 0, TRUE ); /* in case Colormap was empty */ + + while( ePxlCnt_(exp) < eRGBCnt_(exp) ) + { /* + ** Calculate the mean match distance of all the pending colors. + */ + for( count = 0, mean = 0.0, i = 0; i < eRGBCnt_(exp); i++ ) + if( eRGBLst_(exp)[i].distance > 0 ) + { + count++; + mean += eRGBLst_(exp)[i].distance; + } + mean = mean < limit * count ? limit : mean / (count + 1e-6); + + for( i = 0; i < eRGBCnt_(exp); i++ ) + if( eRGBLst_(exp)[i].Pstate == PRIVATE + && eRGBLst_(exp)[i].distance >= mean + && MatchPseudoAllocColor( exp, i, TRUE) != Success ) + break; /* the colormap is full */ + + if( mean == limit || i < eRGBCnt_(exp) ) + break; + } +} /* end MatchPseudoDistant */ + +/*----------------------------------------------------------------------- +----------- routine: Init Colormap list and required colors list -------- +------------------------------------------------------------------------*/ +static CARD32 MatchPseudoInit( exp ) + ExpCtxPtr exp; +{ + RGBRec state, *map, *rgb; + CARD32 i,m, distance, sum, sqr; + INT32 dif, entries = eMapLen_(exp); + + ReadSingleMap( exp, &state ); + + for( rgb = eRGBLst_(exp), i = 0; i < eRGBCnt_(exp); rgb++, i++ ) + { /* + ** Init RGB components. + */ + rgb->red = SetPseudoColor_(exp, eHst_(exp,0)[i], 0, rgb); + rgb->grn = SetPseudoColor_(exp, eHst_(exp,0)[i], 1, rgb); + rgb->blu = SetPseudoColor_(exp, eHst_(exp,0)[i], 2, rgb); + + if( state.Pstate != FREE ) + { /* + ** Find closest existing match that the hardware can provide. + */ + (*eCmap_(exp)->pScreen->ResolveColor) + (&rgb->red, &rgb->grn, &rgb->blu, eVisual_(exp)); + for(rgb->distance=~0, map=eMapLst_(exp), m=0; mPstate >= SHARED ) + { + dif = rgb->red - map->red; + sqr = dif * dif; + dif = rgb->grn - map->grn; + sum = dif * dif + sqr; + if( sum < sqr ) + continue; /* overflow */ + + dif = rgb->blu - map->blu; + distance = dif * dif + sum; + + if( rgb->distance > distance && distance >= sum ) + { + rgb->distance = distance; + rgb->pixel = m; + if( distance == 0 ) + break; + } + } + } + } + return( state.Pstate ); +} /* end MatchPseudoInit */ + +/*----------------------------------------------------------------------- +------------------ routine: Get Snapshot of Colormap State -------------- +------------------------------------------------------------------------*/ +static void ReadSingleMap( exp, state ) + ExpCtxPtr exp; /* export context */ + RGBPtr state; /* OPTIONAL: pointer to RGBRec in which to return state */ +{ + RGBPtr map; + CARD32 i, available = 0, gray = eGryLmt_(exp) * 65535.0 + 0.5; + + /* + ** Take a snapshot of the current Colormap state. + */ + for( map = eMapLst_(exp), i = 0; i < eMapLen_(exp); map++, i++ ) + { + if( eCmap_(exp)->red[i].fShared ) + { + map->red = eCmap_(exp)->red[i].co.shco.red->color; + map->grn = eCmap_(exp)->red[i].co.shco.green->color; + map->blu = eCmap_(exp)->red[i].co.shco.blue->color; + } + else + { + map->red = eCmap_(exp)->red[i].co.local.red; + map->grn = eCmap_(exp)->red[i].co.local.green; + map->blu = eCmap_(exp)->red[i].co.local.blue; + } + map->pixel = i; + map->Pstate = eStaticCmap_(exp) ? OWNED + : eCmap_(exp)->red[i].refcnt == 0 ? FREE + : eCmap_(exp)->red[i].refcnt == -1 ? PRIVATE : SHARED; + + if( map->Pstate == FREE ) + available++; + + else if( eLvl_(exp,1) == 0 && map->Pstate >= SHARED + && (abs((int)(map->red - map->grn)) > gray + || abs((int)(map->grn - map->blu)) > gray + || abs((int)(map->blu - map->red)) > gray)) + map->Pstate = PRIVATE; + } + if( state ) + state->Pstate = eMchLmt_(exp) == 0.0 + && eRGBCnt_(exp) <= available ? FREE + : available ? SHARED : OWNED; + +} /* end ReadSingleMap */ + +/*----------------------------------------------------------------------- +------------------ routine: Get Snapshot of Colormap State -------------- +------------------------------------------------------------------------*/ +static void ReadTripleMap( exp, state, cnt ) + ExpCtxPtr exp; /* export context */ + RGBPtr state; /* OPTIONAL: pointer to RGBRec in which to return state */ + CARD32 cnt[]; /* OPTIONAL: array of number of pixels required */ +{ + RGBPtr map; + CARD32 i, Rfree = 0, Gfree = 0, Bfree = 0; + + for( map = eMapLst_(exp), i = 0; i < eMapLen_(exp); map++, i++ ) + { + map->pixel = i << eRedOff_(exp) & eRedMsk_(exp) + | i << eGrnOff_(exp) & eGrnMsk_(exp) + | i << eBluOff_(exp) & eBluMsk_(exp); + if( eClass_(exp) == TrueColor ) + { + map->red = map->grn = map->blu = eCmap_(exp)->red[i].co.local.red; + map->Rstate = map->Gstate = map->Bstate = OWNED; + } + else + { + map->red = eCmap_(exp)->red [i].co.local.red; + map->grn = eCmap_(exp)->green[i].co.local.green; + map->blu = eCmap_(exp)->blue [i].co.local.blue; + map->Rstate = eCmap_(exp)->red [i].refcnt == 0 ? FREE + : eCmap_(exp)->red [i].refcnt == -1 ? PRIVATE : SHARED; + map->Gstate = eCmap_(exp)->green[i].refcnt == 0 ? FREE + : eCmap_(exp)->green[i].refcnt == -1 ? PRIVATE : SHARED; + map->Bstate = eCmap_(exp)->blue [i].refcnt == 0 ? FREE + : eCmap_(exp)->blue [i].refcnt == -1 ? PRIVATE : SHARED; + if( map->Rstate == FREE ) + Rfree++; + else if( state && map->Rstate == SHARED ) + state->red = map->red; + if( map->Gstate == FREE ) + Gfree++; + else if( state && map->Gstate == SHARED ) + state->grn = map->grn; + if( map->Bstate == FREE ) + Bfree++; + else if( state && map->Bstate == SHARED ) + state->blu = map->blu; + } + } + if( state ) + { + state->Rstate = cnt[0] <= Rfree ? FREE : Rfree ? SHARED : OWNED; + state->Gstate = cnt[1] <= Gfree ? FREE : Gfree ? SHARED : OWNED; + state->Bstate = cnt[2] <= Bfree ? FREE : Bfree ? SHARED : OWNED; + } +} /* end ReadTripleMap */ + +/*----------------------------------------------------------------------- +------------------- routine: Set an Entry in the LUT ------------------- +------------------------------------------------------------------------*/ +static void SetLutEntry( exp, value, comp, entry ) + ExpCtxPtr exp; + CARD32 value; + CARD32 comp; + CARD32 entry; +{ + UdpPtr udp = Udp_(eLutMap_(exp),comp); + CARD8 *base = upBase_(udp); + CARD32 offset = upPxlStr_(udp)*(eHst_(exp,eLvl_(exp,comp)?comp:0)[entry]); + CARD32 mask = (1 << upPxlStr_(udp)) - 1; + + PUT_VALUE_(base, offset, value, mask); +} /* end SetLutEntry */ + +/*----------------------------------------------------------------------- +-------------- routine: Setup Udp for various export operations -------- +------------------------------------------------------------------------*/ +static void SetupUdp( udp, levels, bits, comp ) + UdpPtr udp; + CARD32 levels; + CARD32 bits; + CARD32 comp; +{ + upCmpIdx_(udp) = comp; + upLvl_(udp) = levels; + upPxlLen_(udp) = bits; + upDType_(udp) = UtilDType(bits, XieK_PCM, upPxlStr_(udp), upScnStr_(udp)); + upClass_(udp) = UtilClass(upDType_(udp),XieK_PCM); +} /* end SetupUdp */ + +/*----------------------------------------------------------------------- +----------------- routine: Create Export pipeline element --------------- +------------------------------------------------------------------------*/ +static int _ExportCreate(pipe, img, dstx, dsty) + Pipe pipe; + PhotomapPtr img; + INT32 dstx, dsty; +{ + CARD32 comp, dtype, dtype_mask; + ExportPipeCtxPtr ctx = (ExportPipeCtxPtr) + DdxCreatePipeCtx_( pipe, &ExportPipeElement,FALSE); + if( !IsPointer_(ctx) ) return( (int) ctx ); + /* + ** Build our ExportPipeCtx from the arguments passed in. + */ + ExpSrc_(ctx) = img; + ExpDstX_(ctx) = dstx; + ExpDstY_(ctx) = dsty; + +#if defined(DWV3) + if( IsBitonal_(img) ) + { + dtype = UdpK_DTypeUndefined; + dtype_mask = DtM_VU | DtM_CL; + } + else + { + dtype = IsGrayScale_(img) ? UdpK_DTypeBU : UdpK_DTypeUndefined; + dtype_mask = DtM_Constrained; + } +#else + dtype = IsBitonal_(img) ? UdpK_DTypeVU + : IsGrayScale_(img) ? UdpK_DTypeBU : UdpK_DTypeUndefined; + dtype_mask = DtM_Constrained; +#endif + /* + ** Create a drain for each available source component. + */ + for( comp = 0; comp < CmpCnt_(img); comp++ ) + { + ExpDrn_(ctx,comp) = DdxRmCreateDrain_( Sink_(img), (1< 0 ) + /* + ** Set the quantum for the green and blue drains to + ** match what we obtained from the red drain. + */ + DdxRmSetQuantum_( ExpDrn_(ctx,comp), + DatHeight_(ExpDat_(ctx,0)) ); + + ExpDat_(ctx,comp) = DdxRmGetData_(ctx,ExpDrn_(ctx,comp)); + + if( IsPointer_(ExpDat_(ctx,comp)) ) + SnkUdpPtr_(cvt,comp) = DatUdpPtr_(ExpDat_(ctx,comp)); + else if( ExpDat_(ctx,comp) == NULL ) + break; + else + return( (int) ExpDat_(ctx,comp) ); + } + if( comp < CmpCnt_(ExpSrc_(ctx)) ) + break; + + /* + ** If the client trashed one of his resources, return the + ** appropriate error. + */ + if( !eClientDrw_(exp) ) + s = BadDrawable; + else if ( !eClientGC_(exp) ) + s = BadGC; + else if ( eCmapId_(exp) && !eCmap_(exp) ) + s = BadColor; + if ( s != Success ) + continue; + + /* + ** Do pre-export stuff. + */ + ValidateDrawableAndGC_( eClient_(exp) ); + s = Format( exp, cvt ); + if( s != Success ) break; + /* + ** Determine the coincidence of drain data and export region. + */ + pix = *ePixUdp_(exp); + urX1_(pix) = max(SnkX1_(cvt,0), urX1_(pix)); + urX2_(pix) = min(SnkX2_(cvt,0), urX2_(pix)); + urY1_(pix) = max(SnkY1_(cvt,0), urY1_(pix)); + urY2_(pix) = min(SnkY2_(cvt,0), urY2_(pix)); + if( urX2_(pix) < urX1_(pix) || urY2_(pix) < urY1_(pix) ) + continue; + + urWidth_(pix) = urX2_(pix) - urX1_(pix) + 1; + urHeight_(pix) = urY2_(pix) - urY1_(pix) + 1; + urArSize_(pix) = urScnStr_(pix) * urHeight_(pix); + + s = Export( exp, cvt, &pix, + ExpDstX_(ctx) + urX1_(pix) - upX1_(ePixUdp_(exp)), + ExpDstY_(ctx) + urY1_(pix) - upY1_(ePixUdp_(exp)) ); + + if( IsPointer_(urBase_(pix)) + && urBase_(pix) != upBase_(ePixUdp_(exp)) ) + DdxFreeBits_( urBase_(pix) ); /* free converted data */ + } + return( s ); +} /* end _ExportActivate */ + +/*----------------------------------------------------------------------- +------------------------- routine: _ExportFlush ------------------------- +------------------------------------------------------------------------*/ +static int _ExportFlush(ctx) + ExportPipeCtxPtr ctx; +{ + ExpCtxPtr exp = Eport_(ExpSrc_(ctx)); + PipeSinkPtr sink = Sink_(ExpSrc_(ctx)); + + if( !IsPointer_(exp) ) + return( Success ); /* Something isn't right. Punt. */ + + if (DrnDtyp_(ExpDrn_(ctx,0)) == UdpK_DTypeCL) + { + /* + ** If change lists remain to be drawn, do it now... + */ + if (eSpnIdx_(exp) != 0) + { + GCPtr spanGC = (eSpnGC_(exp) == NULL) ? eClientGC_(exp) : + eSpnGC_(exp); + FillSpans_(eClientDrw_(exp), + spanGC, + eSpnIdx_(exp), + eSpnPt_(exp), + eSpnW_(exp)); + + eSpnIdx_(exp) = 0; + } + } + + _ExportFreeData(ctx); + ExportDone( Eport_(ExpSrc_(ctx)) ); + + return( Success ); +} /* end _ExportFlush */ + +/*----------------------------------------------------------------------- +------------------------- routine: _ExportDestroy ----------------------- +------------------------------------------------------------------------*/ +static int _ExportDestroy(ctx) + ExportPipeCtxPtr ctx; +{ + CARD32 comp; + + for( comp = 0; comp < CmpCnt_(ExpSrc_(ctx)); comp++ ) + if( IsPointer_(ExpDrn_(ctx,comp)) ) + DdxRmDestroyDrain_( ExpDrn_(ctx,comp) ); + + return( Success ); +} /* end _ExportDestroy */ + +/*----------------------------------------------------------------------- +------------------------- routine: _ExportAbort ------------------------- +------------------------------------------------------------------------*/ +static int _ExportAbort(ctx) + ExportPipeCtxPtr ctx; +{ + _ExportFlush(ctx); + eCmap_(Eport_(ExpSrc_(ctx))) = NULL; /* forget the Colormap */ + + return( Success ); +} /* end _ExportAbort */ + +/*----------------------------------------------------------------------- +-------------------- routine: _Export Free Data segment ----------------- +------------------------------------------------------------------------*/ +static int _ExportFreeData(ctx) + ExportPipeCtxPtr ctx; +{ + PipeSinkPtr cvt = ExpCvt_(ctx); + CARD32 comp; + + for( comp = 0; comp < CmpCnt_(ExpSrc_(ctx)); comp++ ) + { + if( IsPointer_(ExpDat_(ctx,comp)) ) + DdxRmDeallocData_( ExpDat_(ctx,comp) ); + + if( IsPointer_(cvt) ) + SnkUdpPtr_(cvt,comp) = NULL; + ExpDat_(ctx,comp) = NULL; + } + return( Success ); +} /* end _ExportFreeData */ +/* end module XieDisplay.c */ diff --git a/xie/docs/dec/xie23-src/server/xie/XieDisplay.h b/xie/docs/dec/xie23-src/server/xie/XieDisplay.h new file mode 100644 index 0000000..219fa43 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/XieDisplay.h @@ -0,0 +1,254 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension DIX +** +** ABSTRACT: +** +** This is the header file for the DIX DISPLAY module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Robert NC Shelley +** +** CREATION DATE: +** +** February 19, 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ + + /* + ** Core X Includes (to access Colormap, Drawable, GC, Screen, Visual...). + */ +#if defined(VAX) && !defined(MITR5) +#include +#endif +#include +#include +#include +#include + + /* + ** RGB record and state constants. + */ +typedef struct _RGB { + CARD16 red; + CARD16 grn; + CARD16 blu; + BOOL status; + unsigned Pstate : 2; + unsigned Rstate : 2; + unsigned Gstate : 2; + unsigned Bstate : 2; + Pixel pixel; + CARD32 distance; +} RGBRec, *RGBPtr; +#define PRIVATE 0 /* private color cell or pending allocation */ +#define FREE 1 /* available color cell */ +#define SHARED 2 /* sharable color cell */ +#define OWNED 3 /* static color cell or allocated color */ + + /* + ** ExportContext. + */ +typedef struct _ExpCtxRec { + ClientPtr Client; /* X11 client pointer */ + CARD32 DrwId; /* X11 drawable id */ + CARD32 GCId; /* X11 GC id */ + CARD32 CmapId; /* X11 Colormap id */ + ColormapPtr Cmap; /* X11 Colormap */ + PhotomapPtr LutMap; /* LUT for pixel mapping */ + UdpPtr PixUdp; /* final export ZPixmap Udp */ + UdpPtr PreUdp; /* pre-format ZPixmap Udp */ + double MchLmt; /* match_limit */ + double GryLmt; /* gray_limit */ + CARD32 *PxlLst; /* allocated pixel list */ + CARD32 PxlCnt; /* allocated pixel count */ + RGBPtr MapLst; /* colors available list */ + RGBPtr RGBLst; /* colors required list */ + CARD32 RGBCnt; /* colors required count */ + CARD32 *Hst[XieK_MaxComponents]; /* histogram arrays */ + CARD32 Len[XieK_MaxComponents]; /* RGB lengths */ + CARD32 Lvl[XieK_MaxComponents]; /* RGB levels */ + CARD32 Mul[XieK_MaxComponents]; /* RGB component multipliers */ +#if !defined(X11R3) || defined(DWV3) + DDXPointPtr SpanPoints; /* Span points array */ + CARD32 *SpanWidths; /* Span widths array */ + GCPtr SpanGC; /* GC to use when drawing spans */ + CARD32 SpanCount; /* Span entries allocated */ + CARD32 SpanIndex; /* Curr position in span list */ +#endif + CARD16 RGBPol; /* RGB polarity */ + CARD8 Depth; /* depth */ + unsigned Busy : 1; /* True == export in progress */ + unsigned Masks : 1; /* True == use RGB masks */ + unsigned PreFmt : 1; /* True == pre-format to ZPixmap*/ + unsigned HstAll : 1; /* True == histogram entire src */ + unsigned _reserved : 4; +} ExpCtxRec; + /* + ** ExportContext access macros. + */ +#define eClient_(exp) ((exp)->Client) +#define eClientDrw_(exp) (eClient_(exp)->lastDrawable) +#define eClientGC_(exp) (eClient_(exp)->lastGC) +#define eClientIdx_(exp) (eClient_(exp)->index) +#define eDrwId_(exp) ((exp)->DrwId) +#define eGCId_(exp) ((exp)->GCId) +#define eCmapId_(exp) ((exp)->CmapId) +#define eCmap_(exp) ((exp)->Cmap) +#define eClass_(exp) (eCmap_(exp)->class) +#define eDynamicCmap_(exp) (eCmap_(exp)->class&DynamicClass) +#define eStaticCmap_(exp) (!eDynamicCmap_(exp)) +#define eVisual_(exp) (eCmap_(exp)->pVisual) +#define eRedMsk_(exp) (eCmap_(exp)->pVisual->redMask) +#define eGrnMsk_(exp) (eCmap_(exp)->pVisual->greenMask) +#define eBluMsk_(exp) (eCmap_(exp)->pVisual->blueMask) +#define eRedOff_(exp) (eCmap_(exp)->pVisual->offsetRed) +#define eGrnOff_(exp) (eCmap_(exp)->pVisual->offsetGreen) +#define eBluOff_(exp) (eCmap_(exp)->pVisual->offsetBlue) +#define eMapLen_(exp) (eCmap_(exp)->pVisual->ColormapEntries) +#define eLutMap_(exp) ((exp)->LutMap) +#define ePixUdp_(exp) ((exp)->PixUdp) +#define ePreUdp_(exp) ((exp)->PreUdp) +#define eMchLmt_(exp) ((exp)->MchLmt) +#define eGryLmt_(exp) ((exp)->GryLmt) +#define ePxlLst_(exp) ((exp)->PxlLst) +#define ePxlCnt_(exp) ((exp)->PxlCnt) +#define eMapLst_(exp) ((exp)->MapLst) +#define eRGBLst_(exp) ((exp)->RGBLst) +#define eRGBCnt_(exp) ((exp)->RGBCnt) +#define eHst_(exp,comp) ((exp)->Hst[(comp)]) +#define eLen_(exp,comp) ((exp)->Len[(comp)]) +#define eLvl_(exp,comp) ((exp)->Lvl[(comp)]) +#define eMul_(exp,comp) ((exp)->Mul[(comp)]) +#if !defined(X11R3) || defined(DWV3) +#define eSpnPt_(exp) ((exp)->SpanPoints) +#define eSpnW_(exp) ((exp)->SpanWidths) +#define eSpnGC_(exp) ((exp)->SpanGC) +#define eSpnCnt_(exp) ((exp)->SpanCount) +#define eSpnIdx_(exp) ((exp)->SpanIndex) +#endif +#define eRGBPol_(exp) ((exp)->RGBPol) +#define eDepth_(exp) ((exp)->Depth) +#define eBusy_(exp) ((exp)->Busy) +#define eMasks_(exp) ((exp)->Masks) +#define ePreFmt_(exp) ((exp)->PreFmt) +#define eHstAll_(exp) ((exp)->HstAll) + +/* +** Structure definitions and Typedefs +*/ + /* + ** Export Pipe Context. + */ +typedef struct _ExportPipeCtx { + PipeElementCommonPart common; + struct _ExportPart { + PhotomapPtr Src; /* source Photo{map|tap}*/ + PipeSinkRec Cvt; /* data conversion sink */ + PipeDrainPtr Drn[XieK_MaxComponents]; /* drains */ + PipeDataPtr Dat[XieK_MaxComponents]; /* drains' data */ + INT32 DstX, DstY; /* drawable X,Y */ + } ExportPart; +} ExportPipeCtx, *ExportPipeCtxPtr; + /* + ** Pipeline context, Export part, access macros + */ +#define ExpSrc_(ctx) ((ctx)->ExportPart.Src) +#define ExpCvt_(ctx) (&(ctx)->ExportPart.Cvt) +#define ExpDrn_(ctx,comp) ((ctx)->ExportPart.Drn[(comp)]) +#define ExpDat_(ctx,comp) ((ctx)->ExportPart.Dat[(comp)]) +#define ExpDstX_(ctx) ((ctx)->ExportPart.DstX) +#define ExpDstY_(ctx) ((ctx)->ExportPart.DstY) + +/* +** MACRO definitions +*/ + /* + ** MACRO to compute an RGB component value: + ** Component value + ** * the maximum dst value that can be expressed (65535) + ** / the maximum src value for component + ** ^ polarity (0x0000 == normal, 0xffff == invert) + */ +#define ScaleColor_(exp,value,comp) (eLvl_(exp,comp) < 2 ? 0 : \ + (value) * 65535 / (eLvl_(exp,comp) - 1) ^ eRGBPol_(exp)) + + /* + ** MACRO to extract an RGB component value from a ZPixmap pixel: + ** pixel / "component multiplier" % "number of levels for component" + */ +#define ExtractColor_(exp,value,comp) ((value)/eMul_(exp,comp)%eLvl_(exp,comp)) + + /* + ** MACRO to set DirectColor RGB component values + */ +#define SetDirectColor_(exp,pxl,comp,rgb) \ + (eLvl_(exp,comp) == 0 ? rgb->red : ScaleColor_(exp,pxl,comp)) + + /* + ** MACRO to extract PseudoColor RGB component values from a ZPixmap pixel + */ +#define SetPseudoColor_(exp,pxl,comp,rgb) \ + ( eLvl_(exp,comp) == 0 ? rgb->red \ + : ScaleColor_(exp,((pxl)/eMul_(exp,comp)%eLvl_(exp,comp)),comp)) + diff --git a/xie/docs/dec/xie23-src/server/xie/XieEvents.c b/xie/docs/dec/xie23-src/server/xie/XieEvents.c new file mode 100644 index 0000000..1e0c2f0 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/XieEvents.c @@ -0,0 +1,225 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Image Extension DIX +** +** ABSTRACT: +** +** This Xie module consists of DIX procedures for event +** service requests. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Bernardo Tagariello +** Robert NC Shelley +** +** CREATION DATE: +** +** March 23, 1990 +** +************************************************************************/ + +/* +** Include files +*/ +#include +/* +** Core X Includes +*/ +#include +#include +#include +#include +#include +/* +** XIE Includes +*/ +#include +#include +#include +#include +#include + +/* +** Table of contents +*/ + /* + ** Xie protocol proceedures called from XieMain + */ +int ProcQueryEvents(); +int ProcSelectEvents(); + /* + ** routines referenced by other modules + */ +int xieDoSendEvent(); + /* + ** routines used internally by XieEvents + */ + +/* +** Equated Symbols +*/ + +/* +** MACRO definitions +*/ + +/* +** External References +*/ +externalref ClientTableRec xieClientTable[MAXCLIENTS]; + +extern CARD32 xieClients; /* num of clients served */ +extern CARD32 xieEventBase; /* Base for Xie events */ +extern CARD32 xieReqCode; /* XIE main opcode */ +#if defined(X11R3) && !defined(DWV3) +extern CARD16 RC_xie; /* XIE Class */ +extern CARD16 RT_photo; /* Photo{flo|map|tap} resource */ +extern CARD16 RT_idc; /* Cpp, Roi & Tmp resource types*/ +#else /* X11R4 || DWV3 */ +extern RESTYPE RC_xie; /* XIE Class */ +extern RESTYPE RT_photo; /* Photo{flo|map|tap} resource */ +extern RESTYPE RT_idc; /* Cpp, Roi & Tmp resource types*/ +#endif + +externalref int (*xieDixSwap[X_ieLastRequest])(); /* Reply swap dispatch + * tables */ +externalref int (*xieDixSwapReply[])(); +void WriteEventToClient(); + +/* +** Local Storage +*/ + +/*----------------------------------------------------------------------- +------------------------- QueryEvents Procedure ------------------------- +------------------------------------------------------------------------*/ +int ProcQueryEvents( client ) + ClientPtr client; /* client pointer */ +{ + xieQueryEventsReply rep; + REQUEST( xieQueryEventsReq); + REQUEST_SIZE_MATCH( xieQueryEventsReq ); + + /* + ** Build reply. + */ + rep.type = X_Reply; + rep.length = 0; + rep.sequenceNumber = client->sequence; + rep.event_mask = xieClientTable[client->index].event_mask; + + WriteXieReplyToClient( client, sizeof(xieQueryEventsReply), &rep ); + + return(Success); +} /* end ProcQueryEvents */ + +/*----------------------------------------------------------------------- +------------------------- SelectEvents Procedure ------------------------ +------------------------------------------------------------------------*/ +int ProcSelectEvents( client ) + ClientPtr client; /* client pointer */ +{ + REQUEST( xieSelectEventsReq ); + REQUEST_SIZE_MATCH( xieSelectEventsReq ); + + /* + ** Stash new event mask. + */ + xieClientTable[client->index].event_mask = stuff->event_mask; + + return(Success); +} /* end ProcSelectEvents */ + +/*----------------------------------------------------------------------- +----------------------- routine: Send an Event ----------------------- +------------------------------------------------------------------------*/ +int xieDoSendEvent( client, res, type ) + ClientPtr client; /* client pointer */ + CommonPartPtr res; /* resource pointer */ + CARD8 type; /* event type */ +{ + PhotomapPtr img; + xieSendEvent event; + REQUEST( xieReq ); + + if( type == XieK_ComputationEvent ) + { /* + ** Remember that this sink is full of image data. + */ + img = (PhotomapPtr)res; + SnkFull_(Sink_(img)) = TRUE; + SnkUdpFinalMsk_(Sink_(img)) = (1<index].event_mask & 1<sequence; + event.resource_id = ResId_(res); + WriteEventToClient( client, sizeof(xieSendEvent), &event ); + } + + return(Success); +} /* End of xieDoSendEvent */ +/* end module XieEvents.c */ diff --git a/xie/docs/dec/xie23-src/server/xie/XieMacros.h b/xie/docs/dec/xie23-src/server/xie/XieMacros.h new file mode 100644 index 0000000..152230b --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/XieMacros.h @@ -0,0 +1,367 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Image Extension DIX +** +** ABSTRACT: +** +** The XieMacros module consists of all XIE macros. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Richard J. Piccolo +** Robert NC Shelley +** +** CREATION DATE: +** +** May 3, 1989 +** +************************************************************************/ + + /* + ** This macro sends "code" and "id" if "test" is FALSE, NULL, or = 0. + ** + ** Error exit - code + */ +#define OkIf_(test,id,code) \ + if(!(test)) {SendErrorToClient(client,xieReqCode,stuff->opcode,id,code);\ + return(code);} else + +#define RequestOkIf_(test,id) OkIf_(test,id,BadRequest) +#define ValueOkIf_(test,id) OkIf_(test,id,BadValue) +#define MatchOkIf_(test,id) OkIf_(test,id,BadMatch) +#define DrawableOkIf_(test,id) OkIf_(test,id,BadDrawable) +#define AccessOkIf_(test,id) OkIf_(test,id,BadAccess) +#define AllocOkIf_(test,id) OkIf_(test,id,BadAlloc) +#define ColorOkIf_(test,id) OkIf_(test,id,BadColor) +#define GCOkIf_(test,id) OkIf_(test,id,BadGC) +#define IDChoiceOkIf_(test,id) OkIf_(test,id,BadIDChoice) +#define LengthOkIf_(test,id) OkIf_(test,id,BadLength) + +#define BadRequest_(id) OkIf_(FALSE,id,BadRequest) +#define BadValue_(id) OkIf_(FALSE,id,BadValue) +#define BadMatch_(id) OkIf_(FALSE,id,BadMatch) +#define BadDrawable_(id) OkIf_(FALSE,id,BadDrawable) +#define BadAccess_(id) OkIf_(FALSE,id,BadAccess) +#define BadAlloc_(id) OkIf_(FALSE,id,BadAlloc) +#define BadColor_(id) OkIf_(FALSE,id,BadColor) +#define BadGC_(id) OkIf_(FALSE,id,BadGC) +#define BadIDChoice_(id) OkIf_(FALSE,id,BadIDChoice) +#define BadLength_(id) OkIf_(FALSE,id,BadLength) + + /* + ** This macro guarantees that a Photomap contains PCM data. + */ +#define BePCM_(img,id)\ + if(IsPointer_(img) && (AnyPending_(img) || !IsPCM_(img)))\ + {int _s = UtilBePCM(img); OkIf_(_s==Success, (id), _s);} else + + /* + ** This macro calls a function using index [stuff->opcode] + */ +#define CallProc_(table) (*(table)[stuff->opcode]) + + /* + ** This macro checks that an XIE resource ID is valid as a new resource. + ** + ** Error exit - BadIDChoice + */ +#if defined(X11R3) && !defined(DWV3) +#define CheckNewResource_(id,rType)\ + IDChoiceOkIf_(client->clientAsMask==CLIENT_BITS(id) && !(id&SERVER_BIT)\ + && LookupID(id,rType,RC_xie)==0, id) +#else /* X11R4 || DWV3 */ +#define CheckNewResource_(id,rType)\ + IDChoiceOkIf_(client->clientAsMask==CLIENT_BITS(id) && !(id&SERVER_BIT)\ + && LookupIDByType(id,rType)==0, id) +#endif + + /* + ** This macro hides the difference between X11R3 and X11R4 AddResource. + */ +#if defined(X11R3) && !defined(DWV3) +#define AddResource_(id,type,res)\ + ResId_(res)=id;\ + AddResource(id,type,res,UtilFreeResource,RC_xie) +#else /* X11R4 || DWV3 */ +#define AddResource_(id,type,res)\ + ResId_(res)=id;\ + AllocOkIf_(AddResource(id,type,res),id) +#endif + + /* + ** This macro hides the difference between X11R3 and X11R4 FreeResource. + */ +#if defined(X11R3) && !defined(DWV3) +#define FreeResource_(id)\ + FreeResource(id,RC_NONE) +#else /* X11R4 || DWV3 */ +#define FreeResource_(id)\ + FreeResource(id,RT_NONE) +#endif + + /* + ** This macro hides the difference between X11R3 and X11R4 Id Lookup + */ +#if defined(X11R3) && !defined(DWV3) +#define LookupId_(id,type)\ + LookupID(id,type,RC_xie) +#else /* X11R4 || DWV3 */ +#define LookupId_(id,type)\ + LookupIDByType(id,type) +#endif + + /* + ** This macro calls the LookupPhotos routine and tests the result returned. + ** + ** Error exit - result of LookupPhotos if result not "Success" + */ +#define LookupPhotos_(pflo,pmap,src_id,dst_id)\ + {int status = LookupPhotos(client,(pflo),(pmap),(src_id),(dst_id));\ + if( status ) return status;} + + /* + ** This macro calls the LookupIdc routine and tests the result returned. + ** + ** Error exit - result of LookupIdc if result not "Success" + */ +#define LookupIdc_(pidc,idc_id,type)\ + {int status = LookupIdc(client,(pidc),(idc_id),(type));\ + if( status ) return status;} + /* + ** This macro calls the LookupCppRoi routine and tests the result. + ** + ** Error exit - result of LookupCppRoi if result not "Success" + */ +#define LookupCppRoi_(pres, pudp,idc_id)\ + {int status = LookupCppRoi(client,(pres),(pudp),(idc_id));\ + if( status ) return status;} + + /* + ** This macro looks up a colormap. + */ +#if defined(X11R3) && !defined(DWV3) +#define LookupColormap_(pColormap,colormapID)\ + pColormap = (ColormapPtr)LookupID(colormapID,RT_COLORMAP,RC_CORE) +#else /* X11R4 || DWV3 */ +#define LookupColormap_(pColormap,colormapID)\ + pColormap = (ColormapPtr)LookupIDByType(colormapID,RT_COLORMAP) +#endif + + /* + ** This macro looks up a drawable. + */ +#if defined(X11R3) && !defined(DWV3) +#define LookupDrawable_(client,drawID)\ + if(client->lastDrawableID != drawID)\ + {\ + client->lastDrawable = (DrawablePtr)\ + LookupID(drawID,RT_DRAWABLE,RC_CORE);\ + client->lastDrawableID = drawID;\ + }\ + if(client->lastDrawable==0 || \ + client->lastDrawable->type != DRAWABLE_WINDOW && \ + client->lastDrawable->type != DRAWABLE_PIXMAP)\ + {\ + client->lastDrawable = NULL;\ + client->lastDrawableID = -1;\ + } +#else /* X11R4 || DWV3 */ +#define LookupDrawable_(client,drawID)\ + if(client->lastDrawableID != drawID)\ + {\ + client->lastDrawable = (DrawablePtr)LookupDrawable(drawID,client);\ + client->lastDrawableID = drawID;\ + }\ + if(client->lastDrawable == NULL)\ + client->lastDrawableID = -1 +#endif + + /* + ** This macro looks up a GC. + */ +#if defined(X11R3) && !defined(DWV3) +#define LookupGC_(client,GCID)\ + if(client->lastGCID != GCID)\ + {\ + client->lastGC = (GC *)LookupID(GCID, RT_GC, RC_CORE);\ + client->lastGCID = GCID;\ + }\ + if(client->lastGC == 0)\ + client->lastGCID = -1 +#else /* X11R4 || DWV3 */ +#define LookupGC_(client,GCID)\ + if(client->lastGCID != GCID)\ + {\ + client->lastGC = (GC *)LookupIDByType(GCID, RT_GC);\ + client->lastGCID = GCID;\ + }\ + if(client->lastGC == 0)\ + client->lastGCID = -1 +#endif + /* + ** This macro helps with the book keeping when we are using scratch GCs. + */ +#define UsingScratchGC_(client,gcptr) \ + client->lastGC = gcptr; \ + client->lastGCID = -1 + + /* + ** This macro validates the most recently used Drawable and GC. + */ +#define ValidateDrawableAndGC_(client)\ + if(client->lastGC->serialNumber != client->lastDrawable->serialNumber)\ + ValidateGC(client->lastDrawable, client->lastGC) + + /* + ** This macro makes sure that the drawable and GC are compatible. + ** + ** Error exit - BadDrawable, BadGC, BadMatch + */ +#define LookupDrawableAndGC_(client,drawID,GCID)\ + LookupDrawable_(client,drawID);\ + DrawableOkIf_(client->lastDrawable,drawID);\ + LookupGC_(client,GCID);\ + GCOkIf_(client->lastGC,GCID);\ + if( client->lastDrawable->type == UNDRAWABLE_WINDOW \ + || client->lastGC->depth != client->lastDrawable->depth \ + || client->lastGC->pScreen != client->lastDrawable->pScreen)\ + {\ + client->lastGC = NULL;\ + client->lastGCID = -1;\ + BadMatch_(GCID);\ + }\ + ValidateDrawableAndGC_(client) + + /* + ** This macro calls the LookupTmp routine and tests the result returned. + ** + ** Error exit - result of LookupTmp if result not "Success" + */ +#define LookupTmp_(pres, pudp,idc_id)\ + {int status = LookupTmp(client,(pres),(pudp),(idc_id));\ + if( status ) return status;} + + /* + ** These macros return the coordinates and dimensions of a drawable. + */ +#ifdef X11R3 +#define DrawableX_(pDraw) \ + (pDraw->type!=DRAWABLE_PIXMAP ? ((WindowPtr)pDraw)->clientWinSize.x : 0) +#define DrawableY_(pDraw) \ + (pDraw->type!=DRAWABLE_PIXMAP ? ((WindowPtr)pDraw)->clientWinSize.y : 0) +#ifdef VMS +#define DrawableWidth_(pDraw) \ + (pDraw->type!=DRAWABLE_PIXMAP \ + ? ((WindowPtr)pDraw)->clientWinSize.width \ + : ((PixmapPtr)pDraw)->mem_header->desc->width) +#define DrawableHeight_(pDraw) \ + (pDraw->type!=DRAWABLE_PIXMAP \ + ? ((WindowPtr)pDraw)->clientWinSize.height \ + : ((PixmapPtr)pDraw)->mem_header->desc->height) +#else /* NOT VMS */ +#define DrawableWidth_(pDraw) \ + (pDraw->type!=DRAWABLE_PIXMAP \ + ? ((WindowPtr)pDraw)->clientWinSize.width \ + : ((PixmapPtr)pDraw)->width) +#define DrawableHeight_(pDraw) \ + (pDraw->type!=DRAWABLE_PIXMAP \ + ? ((WindowPtr)pDraw)->clientWinSize.height \ + : ((PixmapPtr)pDraw)->height) +#endif +#else /* X11R4 */ +#define DrawableX_(pDraw) (((DrawablePtr)pDraw)->x) +#define DrawableY_(pDraw) (((DrawablePtr)pDraw)->x) +#define DrawableWidth_(pDraw) (((DrawablePtr)pDraw)->width) +#define DrawableHeight_(pDraw) (((DrawablePtr)pDraw)->height) +#endif + + /* + ** This macro calls core PutImage + */ +#if defined(X11R3) && !defined(DWV3) +#define PutImage_(draw,gc,depth,x,y,w,h,pad,format,adr) \ + (*gc->PutImage)(draw,gc,depth,x,y,w,h,pad,format,adr) +#else /* X11R4 || DWV3 */ +#define PutImage_(draw,gc,depth,x,y,w,h,pad,format,adr) \ + (*gc->ops->PutImage)(draw,gc,depth,x,y,w,h,pad,format,adr) +#define FillSpans_(draw,gc,count,points,widths) \ + (*gc->ops->FillSpans)(draw, gc, count, points, widths, 1) +#endif + +/* Macros to support swapped byte clients */ +#define WriteXieReplyToClient(pClient, size, pReply) \ + if ((pClient)->swapped) \ + CallProc_(xieDixSwapReply)(pClient, (int)(size), pReply); \ + else (void) WriteToClient(pClient, (int)(size), (char *)(pReply)); + +#define WriteSwappedXieDataToClient(pClient, size, pbuf) \ + if ((pClient)->swapped) \ + (*(pClient)->pSwapReplyFunc)(pClient, (int)(size), pbuf); \ + else (void) WriteToClient (pClient, (int)(size), (char *)(pbuf)); + +#define SetSwappedDataRtn(pClient, typ) \ + pClient->pSwapReplyFunc = xieDixSwapData[sizeof(typ)]; + +/* Macro to byte-swap the necessary fields of an XieFloat record */ +#define swapfloat(fp, n) \ +{ \ + swaps(fp.exponent, n); \ + swapl(fp.mantissa, n); \ +} diff --git a/xie/docs/dec/xie23-src/server/xie/XieMain.c b/xie/docs/dec/xie23-src/server/xie/XieMain.c new file mode 100644 index 0000000..c50b711 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/XieMain.c @@ -0,0 +1,477 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Image Extension DIX +** +** ABSTRACT: +** +** The XieMain module does the following : +** +** - identifies X Image Extension to X11 +** - initializes the extension resources class and types +** - invokes DDX-specific initialization routine +** - identifies X Image Extension Request +** - checks length, performs the XIE request preprocessing +** and processing. +** - swaps request, send replies, errors and events +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Richard J. Piccolo +** Robert NC Shelley +** +** CREATION DATE: +** +** January 31, 1989 +** +************************************************************************/ + +/* +** Include files +*/ +#include + /* + ** Core X Includes + */ +#include +#include +#include +#include +#include + /* + ** XIE Includes + */ +#include /* Get the DDX interface */ +#include +#include +#include +#include +#include + +/* +** Table of contents +*/ +void XieInit(); /* Xie Init routine */ +int XieDispatcher(); /* Xie Request Dispatcher */ +int XieSwapDispatcher(); /* Swap Request then Dispatch */ +void XieReset(); /* Xie Reset */ +void XiePacketTrace(); /* Packet trace function */ + +/* +** Equated Symbols +*/ + +/* +** MACRO definitions +*/ + +/* +** External References +*/ +#if defined(X11R3) && !defined(DWV3) + /* Nothing */ +#else +extern int UtilFreeResource(); +#endif +#undef FatalError + +externalref int (*xieDixProc[X_ieLastRequest])(); +externalref int (*xieDixSwap[X_ieLastRequest])(); + +extern CARD32 xiePipeTimeslice; + +/* +** Global Storage +*/ +CARD32 xieClients; /* num of clients served */ +CARD32 xieEventBase; /* Base for Xie events */ +CARD32 xieReqCode; /* XIE main opcode */ +#if defined(X11R3) && !defined(DWV3) +CARD16 RC_xie; /* XIE Class */ +CARD16 RT_photo; /* Photo{flo|map|tap} resource */ +CARD16 RT_idc; /* Cpp, Roi & Tmp resource types*/ +#else /* X11R4 || DWV3 */ +RESTYPE RC_xie; /* XIE Class */ +RESTYPE RT_photo; /* Photo{flo|map|tap} resource */ +RESTYPE RT_idc; /* Cpp, Roi & Tmp resource types*/ +#endif + +/* +** Local storage +*/ +static BOOL xiePacketTrace; /* Enable packet tracing */ + +static char *opstr[] = { + "NotRequest", /* 0 */ + "InitSession", /* 1 */ + "TermSession", /* 2 */ + "QueryEvents", /* 3 */ + "SelectEvents", /* 4 */ + "SetOpDefaults", /* 5 */ + "QueryOpDefaults", /* 6 */ + "ClonePhoto", /* 7 */ + "CreateResource", /* 8 */ + "DeleteResource", /* 9 */ + "QueryResource", /* 10 */ + "BindMapToFlo", /* 11 */ + "AbortFlo", /* 12 */ + "ExecuteFlo", /* 13 */ + "TapFlo", /* 14 */ + "AbortTransport", /* 15 */ + "GetStream", /* 16 */ + "GetTile", /* 17 */ + "PutStream", /* 18 */ + "PutTile", /* 19 */ + "SetTransport", /* 20 */ + "Export", /* 21 */ + "FreeExport", /* 22 */ + "Import", /* 23 */ + "QueryExport", /* 24 */ + "Area", /* 25 */ + "AreaStats", /* 26 */ + "Arith", /* 27 */ + "CalcHistogram", /* 28 */ + "ChromeCom", /* 29 */ + "ChromeSep", /* 30 */ + "Compare", /* 31 */ + "Constrain", /* 32 */ + "Crop", /* 33 */ + "Dither", /* 34 */ + "Fill", /* 35 */ + "Logical", /* 36 */ + "Luminance", /* 37 */ + "MatchHistogram", /* 38 */ + "Math", /* 39 */ + "Mirror", /* 40 */ + "Point", /* 41 */ + "PointStats", /* 42 */ + "Rotate", /* 43 */ + "Scale", /* 44 */ + "Translate" /* 45 */ +}; + + +/************************************************************************ +** +** FUNCTIONAL DESCRIPTION: +** +** This module contains the XIE intialization code. All XIE software +** related tasks are performed by XieInit. This includes defining an +** XIE resource class and several XIE resource types - Photomap ,Cpp etc. +** In addition, XieInit must identify the extension, its errors and +** events to the CORE X. +** +** All DDX related intialization tasks will be performed by the +** DdxInit procedure. In particular, this module will initialize +** the DDX procedure dispatch table. +** +** If the DDX initialization fails, the DDXInit routine should +** record the reason in the server error log, but not abort +** the server. We will only abort if the core X server returns +** an error when we attempt to add the extension. +** +** +** FORMAL PARAMETERS: +** +** The command line arguments argc,argv are passed in. +** +** IMPLICIT INPUTS: +** +** none +** +** IMPLICIT OUTPUTS: +** +** none +** +** FUNCTION VALUE: +** +** none +** +** SIGNAL CODES: +** +** none +** +** SIDE EFFECTS: +** +** Triggers fatal server error if extension cannot be bound to the +** core server. +** +************************************************************************/ + +/* +** XieInit +** +** Called by InitExtensions in main() or from QueryExtension() if the +** extension is dynamically loaded. +** +*/ +void XieInit( argc, argv ) + int argc; + char *argv[]; +{ + int status; + char *envstr; + + char *getenv(); + + ExtensionEntry *extEntry; + + /* + ** Initialize the DDX support first. If this fails, we will not + ** add the extension, and thus cause the client's InitExtension or + ** QueryExtension call to fail. + */ + if ( DdxInit_() != 0 ) + ErrorF("XieExtensionInit: DDX Init failed\n"); + else { + + if (InitPipelineInterface_() != Success) + FatalError("XieExtensionInit: Pipeline interface init failed\n"); + else { + +#ifdef X11R3 + extEntry = AddExtension( XieS_Name, XieK_NumEvents, XieK_NumErrors, + XieDispatcher, XieSwapDispatcher, XieReset ); +#else /* X11R4 */ + extEntry = AddExtension( XieS_Name, XieK_NumEvents, XieK_NumErrors, + XieDispatcher, XieSwapDispatcher, XieReset, + StandardMinorOpcode ); +#endif + + if( extEntry == NULL ) + FatalError("XieExtensionInit: AddExtension failed\n"); + else + { +#ifdef X11R3 + (void) MakeAtom( XieS_Name, strlen(XieS_Name), TRUE ); +#else /* X11R4 */ + if( !MakeAtom( XieS_Name, strlen(XieS_Name), TRUE )) + FatalError("XieExtensionInit: MakeAtom failed\n"); +#endif + xieClients = 0; + xieEventBase = extEntry->eventBase; + xieReqCode = extEntry->base; + RC_xie = CreateNewResourceClass(); +#if defined(X11R3) && !defined(DWV3) + RT_photo = CreateNewResourceType(); + RT_idc = CreateNewResourceType(); +#else /* X11R4 || DWV3 */ + RT_photo = CreateNewResourceType(UtilFreeResource); + RT_idc = CreateNewResourceType(UtilFreeResource); +#endif + /* ParseCommandLineArguments( argc, argv ); */ + } + /* + ** Set packet trace variable accordingly... + */ + envstr = getenv ("XIE_PACKET_TRACE"); + if (envstr != NULL) + { + xiePacketTrace = TRUE; + } + else + { + xiePacketTrace = FALSE; + } +#ifdef VMS + /* + ** Disable server yielding... + */ + envstr = getenv ("XIE_DISABLE_YIELD"); + if (envstr != NULL) + { + xiePipeTimeslice = 0; + } +#endif + } + } +} /* end XieInit */ + +/***************************************************************************** +** ProcXieDispatcher +******************************************************************************/ +int XieDispatcher( client ) + ClientPtr client; /* client pointer */ +{ + REQUEST(xieReq); + /* + ** Print packet trace if necessary + */ + if (xiePacketTrace) + { + XiePacketTrace(stuff); + } + + if ( stuff->opcode < X_ieLastRequest ) + /* + ** Call the appropriate 'Proc' function. + */ + return( CallProc_(xieDixProc)(client) ); + + else + /* + ** Call the BadRequest function. + */ + return( ProcNotRequest(client) ); + +} /* end XieDispatcher */ + +int XieSwapDispatcher(client) + ClientPtr client; /* client pointer */ +{ + REQUEST(xieReq); + + /* + ** Print packet trace if necessary + */ + if (xiePacketTrace) + { + XiePacketTrace(stuff); + } + + if( stuff->opcode < X_ieLastRequest ) + /* + ** Call the appropriate 'Proc' function. + */ + return( CallProc_(xieDixSwap)(client) ); + + else + /* + ** Call the BadRequest function. + */ + return( ProcNotRequest(client) ); + +} /* end XieSwapDispatcher */ + + +/************************************************************************ +** +** FUNCTIONAL DESCRIPTION: +** +** XieReset is responsible for reseting the extension and the attached +** DDX. +** +** FORMAL PARAMETERS: +** +** none +** +** IMPLICIT INPUTS: +** +** none +** +** IMPLICIT OUTPUTS: +** +** none +** +** FUNCTION VALUE: +** +** none +** +** SIGNAL CODES: +** +** none +** +** SIDE EFFECTS: +** +** none +** +************************************************************************/ + +void XieReset() +{ + /* + ** Reset extension-specific state + */ + + + /* + ** Reset any attached accelerator + */ + DdxReset_(); +} /* end XieReset */ + + +int ProcNotRequest(client) + ClientPtr client; /* client pointer */ +{ + REQUEST(xieReq); + + SendErrorToClient( client, xieReqCode, stuff->opcode, 0, BadRequest ); + return( BadRequest ); +} /* end ProcNotRequest */ + +int ProcNotImplemented(client) + ClientPtr client; /* client pointer */ +{ + REQUEST(xieReq); + + SendErrorToClient(client, xieReqCode, stuff->opcode, 0, BadImplementation); + return( BadImplementation ); +} /* end ProcNotImplemented */ + +void XiePacketTrace(stuff) +xieReq *stuff; +{ + if ( stuff->opcode < X_ieLastRequest ) + ErrorF("Packet Trace : %s\n",opstr[stuff->opcode]); + else + ErrorF("Packet Trace : Bad Request %d\n",stuff->opcode); +} + +/* end module XieMain.c */ diff --git a/xie/docs/dec/xie23-src/server/xie/XiePipeInterface.h b/xie/docs/dec/xie23-src/server/xie/XiePipeInterface.h new file mode 100644 index 0000000..f0a3058 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/XiePipeInterface.h @@ -0,0 +1,107 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989,1991 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Image Extension DIX +** +** ABSTRACT: +** +** This module contains the macros which are used to access the +** the DDX routines needed to create and run pipelines. +** +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Thu Feb 7 17:05:40 1991 +** +************************************************************************/ +#ifdef DWV3 + +/* For DECWindows V3, interpose the layer to support yielding */ +extern int XieAbortPipeline(); +extern Pipe XieCreatePipeline(); +extern int XieDestroyPipeline(); +extern int XieFlushPipeline(); +extern int XieInitPipelineInterface(); +extern int XieResumePipeline(); + +#define AbortPipeline_(flo) (XieAbortPipeline( flo )) +#define CreatePipeline_(client, flo) (XieCreatePipeline( client, flo )) +#define DestroyPipeline_(flo) (XieDestroyPipeline( flo )) +#define FlushPipeline_(flo) (XieFlushPipeline( flo )) +#define InitiatePipeline_(flo) (DdxInitiatePipeline_( Pipe_(flo) )) +#define InitPipelineInterface_() (XieInitPipelineInterface()) +#define OptimizePipeline_(flo) (DdxOptimizePipe_(Pipe_(flo))) +#define ResumePipeline_(flo) (XieResumePipeline( flo )) +#else + +/* Everywhere else, call the DDX routines directly */ +#define AbortPipeline_(flo) (DdxAbortPipeline_(Pipe_(flo))) +#define CreatePipeline_(client, flo) (DdxCreatePipeline_( 0 )) +#define DestroyPipeline_(flo) (DdxDestroyPipeline_( Pipe_(flo) )) +#define FlushPipeline_(flo) (DdxFlushPipeline_(Pipe_(flo))) +#define InitiatePipeline_(flo) (DdxInitiatePipeline_(Pipe_(flo))) +#define InitPipelineInterface_() (Success) /* Dummy */ +#define OptimizePipeline_(flo) (DdxOptimizePipe_(Pipe_(flo))) +#define ResumePipeline_(flo) (DdxResumePipeline_(Pipe_(flo))) + +#endif /* DWV3 */ diff --git a/xie/docs/dec/xie23-src/server/xie/XieProcess.c b/xie/docs/dec/xie23-src/server/xie/XieProcess.c new file mode 100644 index 0000000..8178048 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/XieProcess.c @@ -0,0 +1,1628 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** X Image Extension DIX +** +** ABSTRACT: +** +** This Xie module consists of DIX procedures for process +** service requests. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Richard J. Piccolo +** Robert NC Shelley +** +** CREATION DATE: +** +** May 3, 1989 +** +*******************************************************************************/ + +/* +** Include files +*/ +#include +/* +** Core X Includes +*/ +#include +#include +#include +#include +#include +/* +** XIE Includes +*/ +#include +#include +#include +#include +#include + +/* +** Table of contents +*/ + /* + ** Xie protocol proceedures called from XieMain + */ +int ProcArea(); +int ProcAreaStats(); +int ProcArith(); +int ProcChromeCom(); +int ProcChromeSep(); +int ProcCompare(); +int ProcConstrain(); +int ProcCrop(); +int ProcDither(); +int ProcFill(); +int ProcCalcHistogram(); +int ProcLogical(); +int ProcLuminance(); +int ProcMatchHistogram(); +int ProcMath(); +int ProcMirror(); +int ProcPoint(); +int ProcPointStats(); +int ProcRotate(); +int ProcScale(); +int ProcTranslate(); + /* + ** routines used internally by XieProcess + */ +static RoiPtr RoiEntirePhotomap(); + +/* +** Equated Symbols +*/ +/* +** MACRO definitions +*/ +#define QueNewFloDst_(flo,ele,id) \ + AllocOkIf_(QueResource((flo),(ele),TRUE),(UtilFreeResource(ele),id)) +#define QueResource_(flo,res,id) \ + AllocOkIf_(QueResource((flo),(res),FALSE),id); + +/* +** External References +** +*/ +#if defined(X11R3) && !defined(DWV3) +extern void AddResource(); /* called by AddResource_ macro */ +extern int UtilFreeResource(); /* ref'd by AddResource_ macro */ +#else /* X11R4 || DWV3 */ +extern Bool AddResource(); /* called by AddResource_ macro */ +#endif +extern int xieDoSendEvent(); /* XieEvents.c */ +extern int LookupCppRoi(); /* called by LookupCppRoi_ macro */ +extern int LookupIdc(); /* called by LookupIdc_ macro */ +extern int LookupPhotos(); /* called by LookupPhotos_ macro*/ +extern int LookupTmp(); /* called by LookupTmp_ macro */ +extern int UtilBePCM(); /* called by BePCM_ macro */ +extern Bool QueResource(); /* Queue a Photoflo'd resource */ +extern PhotomapPtr UtilCreatePhotomap(); /* create a Photomap structure */ +extern void GetConstraintModel(); /* Get this sessions constraint */ + + +extern CARD32 xieClients; /* num of clients served */ +extern CARD32 xieEventBase; /* Base for Xie events */ +extern CARD32 xieReqCode; /* XIE main opcode */ + +#if defined(X11R3) && !defined(DWV3) +extern CARD16 RC_xie; /* XIE Class */ +extern CARD16 RT_photo; /* Photo{flo|map|tap} resource */ +extern CARD16 RT_idc; /* Cpp, Roi & Tmp resource types*/ +#else /* X11R4 || DWV3 */ +extern RESTYPE RC_xie; /* XIE Class */ +extern RESTYPE RT_photo; /* Photo{flo|map|tap} resource */ +extern RESTYPE RT_idc; /* Cpp, Roi & Tmp resource types*/ +#endif + +externalref int (*xieDixSwap[X_ieLastRequest])(); /* Reply swap dispatch tables*/ +externalref int (*xieDixSwapReply[])(); +externalref void (*xieDixSwapData[])(); +extern void SwapFloatWrite(); + +/* +** Local Storage +*/ + +/*----------------------------------------------------------------------- +--------------------------- Area Procedure ---------------------------- +------------------------------------------------------------------------*/ +int ProcArea( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo; + PhotomapPtr src, dst, realdst = NULL; + UdpPtr idcudp = NULL; + CommonPartPtr idcptr = NULL; + CommonPartPtr kern_idc; + TmpDatPtr kern_dat; + CARD32 s, i, model, comp, lvl[XieK_MaxComponents]; + REQUEST( xieAreaReq ); + REQUEST_SIZE_MATCH( xieAreaReq ); + + /* Locate source Photomap {and Photoflo} and verify destination Id */ + LookupPhotos_(&flo, &src, stuff->src_photo_id, stuff->dst_photo_id); + + /* Locate template Idc containing the kernel, and convert it */ + LookupTmp_(&kern_idc, &kern_dat, stuff->ipct_id); + + /* Validate the operator codes */ + ValueOkIf_(((stuff->op1 == XieK_AreaOp1Add || + stuff->op1 == XieK_AreaOp1Mult) + && (stuff->op2 >= XieK_AreaOp2Min && + stuff->op2 <= XieK_AreaOp2Sum)), stuff->src_photo_id); + + if( stuff->ipcc_id != 0 ) + { + /* Get a UDP describing the ROI or CPP */ + LookupCppRoi_(&idcptr, &idcudp, stuff->ipcc_id); + ValueOkIf_(UtilValidRegion(src, idcudp), stuff->ipcc_id); + } + /* Create destination based on the source operand */ + for( i = 0; i < XieK_MaxComponents; i++) + lvl[i] = 0; /* Make destination photo unconstrained */ + + dst = UtilCreatePhotomap( CmpMap_(src), lvl, PxlRatio_(src), + PxlProg_(src), ScnProg_(src), PxlPol_(src), + Width_(src), Height_(src), + flo == NULL, FALSE, DdxAlignArea_ ); + AllocOkIf_(dst, stuff->dst_photo_id); + + /* If the result should be constrained, get another photomap */ + if (stuff->constrain) + { + GetConstraintModel(client, &model, lvl); + realdst = UtilCreatePhotomap(CmpMap_(dst), lvl, PxlRatio_(dst), + PxlProg_(dst), ScnProg_(dst), PxlPol_(dst), + Width_(dst), Height_(dst), + flo == NULL, FALSE, DdxAlignArea_ ); + AllocOkIf_(realdst, (UtilFreeResource(dst), stuff->dst_photo_id)); + } + if( flo != NULL ) + { + s = !((!idcptr || QueResource(flo, idcptr, FALSE)) + && QueResource(flo, kern_idc, FALSE) + && QueResource(flo, dst, TRUE)) ? BadAlloc + : DdxCreateArea_( Pipe_(flo), Sink_(src), Sink_(dst), + kern_dat, idcudp, stuff->op1, stuff->op2 ); + if( s == Success && stuff->constrain ) + s = !QueResource(flo, realdst, TRUE) ? BadAlloc + : DdxCreateConstrain_( Pipe_(flo), Sink_(dst), + Sink_(realdst), model); + OkIf_( s == Success, (UtilFreeResource(dst), + UtilFreeResource(realdst), ResId_(flo)), s ); + } + else + { + BePCM_( src, (UtilFreeResource(dst), ResId_(src)) ); + for(s = Success, comp = 0; comp < CmpCnt_(src) && s == Success; comp++) + { /* Call Area routine (once per component) */ + s = DdxArea_( Udp_(src,comp), Udp_(dst,comp), kern_dat, idcudp, + stuff->op1, stuff->op2 ); + if( s == Success && stuff->constrain ) + s = DdxConstrain_( Udp_(dst,comp), Udp_(realdst,comp), model); + } + if( stuff->constrain ) + { + UtilFreeResource(dst); + dst = realdst; + } + OkIf_(s == Success, (UtilFreeResource(dst), stuff->dst_photo_id), s); + AddResource_( stuff->dst_photo_id, RT_photo, dst ); + xieDoSendEvent( client, dst, XieK_ComputationEvent ); + } + return( Success ); +} /* End of ProcArea */ + +/*----------------------------------------------------------------------- +----------------------- Area Statistics Procedure --------------------- +------------------------------------------------------------------------*/ +int ProcAreaStats( client ) + ClientPtr client; /* client pointer */ +{ + PhotomapPtr src, dst, realdst = NULL; + CommonPartPtr kern_idc; + TmpDatPtr kern_dat; + CommonPartPtr idcptr = NULL; + UdpPtr idcudp = NULL; + CARD32 s, i, model, comp, lvl[XieK_MaxComponents]; + + REQUEST( xieAreaStatsReq ); + REQUEST_SIZE_MATCH( xieAreaStatsReq ); + + /* Locate source Photomap and verify destination Id */ + LookupPhotos_(NULL, &src, stuff->src_photo_id, stuff->dst_photo_id); + + /* Resource MUST be monochrome */ + MatchOkIf_(!IsRGB_(src), stuff->src_photo_id); + + /* Validate the statistics type */ + ValueOkIf_((stuff->stat_type >= XieK_Minimum && + stuff->stat_type <= XieK_Variance), stuff->src_photo_id); + + /* Lookup IDC if specified */ + if( stuff->idc_id != 0 ) { + LookupCppRoi_(&idcptr, &idcudp, stuff->idc_id); + ValueOkIf_( UtilValidRegion( src, idcudp ), stuff->idc_id ); + } + + /* Create the output photomap. If the input is unconstrained, then + * force the output to be unconstrained. If the input is constrained, + * force the output to be the number of levels we will constrain to + * under the current constraint mode. + */ + GetConstraintModel(client, &model, lvl); + if (!Constrained_(src)) + for( i = 0; i < XieK_MaxComponents; lvl[i++] = 0 ); + + BePCM_( src, ResId_(src) ); + dst = UtilCreatePhotomap( CmpMap_(src), lvl, PxlRatio_(src), + PxlProg_(src), ScnProg_(src), PxlPol_(src), + Width_(src), Height_(src), + TRUE, FALSE, DdxAlignDefault_ ); + AllocOkIf_(dst, stuff->dst_photo_id); + + /* If we are not operating over the entire image, fill the destination + * UDP from the source, then operate over the IDC. + */ + if( idcudp != NULL ) + DdxConvert_(Udp_(src, 0), Udp_(dst, 0), XieK_MoveMode); + + s = DdxStatsArea_( Udp_(src,0), Udp_(dst,0), idcudp, + stuff->stat_type, stuff->edge_size, model ); + OkIf_(s == Success, (UtilFreeResource(dst), stuff->dst_photo_id), s); + AddResource_(stuff->dst_photo_id, RT_photo, dst); + xieDoSendEvent( client, dst, XieK_ComputationEvent ); + + return( Success ); +} /* End of ProcAreaStats */ + +/*----------------------------------------------------------------------- +--------------------------- Arith Procedure ---------------------------- +------------------------------------------------------------------------*/ +int ProcArith( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo, flo2; + PhotomapPtr dst, src1, src2 = NULL, realdst = NULL; + CommonPartPtr idcptr = NULL; + UdpPtr idcudp = NULL; + CARD32 s, i, model, comp, lvl[XieK_MaxComponents]; + REQUEST( xieArithReq ); + REQUEST_SIZE_MATCH( xieArithReq ); + /* + ** Locate source Photomap(s) {and Photoflo} and verify destination Id. + ** If there is a Photoflo, verify the second operand is bound to it. + */ + LookupPhotos_(&flo, &src1, stuff->src1_photo_id, stuff->dst_photo_id); + if( stuff->src2_photo_id != 0 ) + { + LookupPhotos_(&flo2, &src2, stuff->src2_photo_id, -1); + AccessOkIf_( flo == flo2, stuff->src2_photo_id); + MatchOkIf_(CmpCnt_(src1) == CmpCnt_(src2), stuff->src2_photo_id); + } + if( stuff->idc_id != 0 ) { + /* Get a UDP describing the ROI or CPP */ + LookupCppRoi_(&idcptr, &idcudp, stuff->idc_id); + ValueOkIf_(UtilValidRegion( src1, idcudp ), stuff->idc_id ); + if (stuff->src2_photo_id != 0) + ValueOkIf_(UtilValidRegion( src2, idcudp ), stuff->idc_id ); + } + /* + ** Create destination based on first source operand. + */ + for( i = 0; i < XieK_MaxComponents; i++ ) + lvl[i] = 0; /* Make destination Photo unconstrained */ + dst = UtilCreatePhotomap( CmpMap_(src1), lvl, PxlRatio_(src1), + PxlProg_(src1), ScnProg_(src1), PxlPol_(src1), + Width_(src1), Height_(src1), + flo == NULL, FALSE, DdxAlignArith_ ); + AllocOkIf_(dst, stuff->dst_photo_id); + + if( stuff->constrain ) + { + GetConstraintModel(client, &model, lvl); + realdst = UtilCreatePhotomap(CmpMap_(dst), lvl, PxlRatio_(dst), + PxlProg_(dst), ScnProg_(dst), PxlPol_(dst), + Width_(dst), Height_(dst), + flo == NULL, FALSE, DdxAlignArith_ ); + AllocOkIf_(realdst, (UtilFreeResource(dst), stuff->dst_photo_id)); + } + if( flo != NULL ) + { + s = !((!idcptr || QueResource(flo, idcptr, FALSE)) + && QueResource(flo, dst, TRUE)) ? BadAlloc + : DdxCreateArith_( Pipe_(flo), Sink_(src1), src2 ? Sink_(src2) : NULL, + stuff->constants, Sink_(dst), idcudp, stuff->op); + if( s == Success && stuff->constrain ) + s = !QueResource(flo, realdst, TRUE) ? BadAlloc + : DdxCreateConstrain_( Pipe_(flo), Sink_(dst), + Sink_(realdst), model); + OkIf_(s == Success, (UtilFreeResource(dst), + UtilFreeResource(realdst), ResId_(flo)), s); + } + else + { + BePCM_( src1, (UtilFreeResource(dst), + UtilFreeResource(realdst), ResId_(src1)) ); + BePCM_( src2, (UtilFreeResource(dst), + UtilFreeResource(realdst), ResId_(src2)) ); + for(s = Success, comp = 0; comp < CmpCnt_(src1) && s == Success; comp++) + { /* Call Arithmetic routine (once per component) */ + s = DdxArith_(Udp_(src1,comp), src2 ? Udp_(src2,comp) : NULL, + stuff->constants, Udp_(dst,comp), idcudp, stuff->op); + if( s == Success && stuff->constrain ) + s = DdxConstrain_(Udp_(dst,comp), Udp_(realdst,comp), model); + } + if( stuff->constrain ) + { + UtilFreeResource(dst); + dst = realdst; + } + OkIf_(s == Success, (UtilFreeResource(dst), stuff->dst_photo_id), s); + AddResource_(stuff->dst_photo_id, RT_photo, dst); + xieDoSendEvent( client, dst, XieK_ComputationEvent ); + } + return( Success ); +} /* end ProcArith */ + +/*----------------------------------------------------------------------- +------------------------- Chrominance Combine -------------------------- +------------------------------------------------------------------------*/ +int ProcChromeCom( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo, flo2; + PhotomapPtr src[XieK_MaxComponents], dst; + CARD32 s, height, width, comp, lvl[XieK_MaxComponents]; + REQUEST( xieChromeComReq ); + REQUEST_SIZE_MATCH( xieChromeComReq ); + /* + ** Locate source Photomaps {and Photoflo} and verify destination Id. + ** If there is a Photoflo, verify all the operands are bound to it. + */ + LookupPhotos_(&flo, &src[0], stuff->photo_id1, stuff->dst_photo_id); + MatchOkIf_( !IsRGB_(src[0]), stuff->photo_id1); + + LookupPhotos_(&flo2, &src[1], stuff->photo_id2, -1); + AccessOkIf_( flo == flo2, stuff->photo_id2); + MatchOkIf_( !IsRGB_(src[1]), stuff->photo_id2); + MatchOkIf_(Constrained_(src[1]) == Constrained_(src[0]), stuff->photo_id2); + + LookupPhotos_(&flo2, &src[2], stuff->photo_id3, -1); + AccessOkIf_( flo == flo2, stuff->photo_id3); + MatchOkIf_( !IsRGB_(src[2]), stuff->photo_id3); + MatchOkIf_(Constrained_(src[2]) == Constrained_(src[0]), stuff->photo_id3); + /* + ** Create the destination photomap + */ + for (comp = 0; comp < XieK_MaxComponents; comp++) + lvl[comp] = uLvl_(src[comp],0); + width = min( Width_(src[0]), min( Width_(src[1]), Width_(src[2]))); + height = min(Height_(src[0]), min(Height_(src[1]), Height_(src[2]))); + + dst = UtilCreatePhotomap(XieK_RGB, lvl, PxlRatio_(src[0]), + PxlProg_(src[0]), ScnProg_(src[0]),PxlPol_(src[0]), + width, height, + flo == NULL, FALSE, DdxAlignChromeCom_ ); + AllocOkIf_(dst, stuff->dst_photo_id); + if( flo != NULL ) + { + s = !QueResource( flo, dst, TRUE ) ? BadAlloc + : DdxCreateChromeCom_( Pipe_(flo), + Sink_(src[0]), Sink_(src[1]), Sink_(src[2]), + Sink_(dst) ); + OkIf_(s == Success, (UtilFreeResource(dst), ResId_(flo)), s); + } + else + { + for( comp = 0; comp < XieK_MaxComponents; comp++ ) + { /* Call the ChromeCom routine for each input */ + BePCM_( src[comp], (UtilFreeResource(dst), ResId_(src[comp])) ); + s = DdxChromeCom_(Udp_(src[comp],0), Udp_(dst,comp), XieK_MoveMode); + OkIf_(s==Success, (UtilFreeResource(dst), stuff->dst_photo_id), s); + } + AddResource_(stuff->dst_photo_id, RT_photo, dst); + xieDoSendEvent( client, dst, XieK_ComputationEvent ); + } + return( Success ); +} /* End of ProcChromeCom */ + +/*----------------------------------------------------------------------- +------------------------- Chrominance Separate ------------------------- +------------------------------------------------------------------------*/ +int ProcChromeSep( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo, flo2; + PhotomapPtr src, dst; + CARD32 s, i, comp,lvl[XieK_MaxComponents]; + REQUEST( xieChromeSepReq ); + REQUEST_SIZE_MATCH( xieChromeSepReq ); + /* + ** Locate source Photomaps {and Photoflo} and verify destination Id. + ** If there is a Photoflo, verify all the operands are bound to it. + */ + LookupPhotos_(&flo, &src, stuff->src_photo, stuff->dst_photo); + MatchOkIf_(CmpCnt_(src) > 1, stuff->dst_photo); + ValueOkIf_(stuff->component >=0 && + stuff->component < XieK_MaxComponents, 0); + /* + ** Create destination based on first source operand. + */ + lvl[0] = uLvl_(src,stuff->component); + lvl[1] = 0; + lvl[2] = 0; + dst = UtilCreatePhotomap(lvl[0] == 2 ? XieK_Bitonal : XieK_GrayScale, lvl, + PxlRatio_(src), PxlProg_(src), ScnProg_(src), + PxlPol_(src), Width_(src), Height_(src), + flo == NULL, FALSE, DdxAlignChromeSep_ ); + AllocOkIf_(dst, stuff->dst_photo); + + if( flo != NULL ) + { + s = !QueResource( flo, dst, TRUE ) ? BadAlloc + : DdxCreateChromeSep_( Pipe_(flo), Sink_(src), Sink_(dst), + stuff->component ); + OkIf_(s == Success, (UtilFreeResource(dst), ResId_(flo)), s); + } + else + { /* Call the ChromeSep routine for the desired component */ + BePCM_( src, (UtilFreeResource(dst), ResId_(src)) ); + s = DdxChromeSep_(Udp_(src,stuff->component),Udp_(dst,0),XieK_MoveMode); + OkIf_(s == Success, (UtilFreeResource(dst), stuff->dst_photo), s); + AddResource_(stuff->dst_photo, RT_photo, dst); + xieDoSendEvent( client, dst, XieK_ComputationEvent ); + } + return( Success ); +} /* End of ProcChromeSep */ + +/*----------------------------------------------------------------------- +--------------------------- Compare Procedure -------------------------- +------------------------------------------------------------------------*/ +int ProcCompare( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo, flo2; + PhotomapPtr src1, src2 = NULL, dst; + CommonPartPtr idcptr = NULL; + UdpPtr idcudp = NULL; + UdpPtr tmpudp = NULL; + CARD32 s, comp, comp_out, combine_op, lvl[XieK_MaxComponents]; + REQUEST( xieCompareReq ); + REQUEST_SIZE_MATCH( xieCompareReq ); + /* + ** Locate source Photomap(s) {and Photoflo} and verify destination Id. + ** If there is a Photoflo, verify the second operand is bound to it. + */ + LookupPhotos_(&flo, &src1, stuff->src1_photo_id, stuff->dst_photo_id); + + if( stuff->src2_photo_id != 0 ) + { + LookupPhotos_(&flo2, &src2, stuff->src2_photo_id, -1); + AccessOkIf_(flo==flo2,stuff->src2_photo_id); + MatchOkIf_(CmpCnt_(src1) == CmpCnt_(src2), stuff->src2_photo_id); + } + + if( stuff->idc_id != 0 ) { + LookupCppRoi_(&idcptr, &idcudp, stuff->idc_id); + ValueOkIf_( UtilValidRegion( src1, idcudp ), stuff->idc_id); + if (stuff->src2_photo_id != 0) + ValueOkIf_( UtilValidRegion( src2, idcudp ), stuff->idc_id); + } + + /* Only "equal" and "not equal" are defined for RGB images */ + MatchOkIf_(!IsRGB_(src1) || stuff->op == XieK_EQ || stuff->op == XieK_NE, + stuff->src1_photo_id); + /* + ** Create destination based on first source operand. + ** Destination is always bitonal or RGB (2 levels). + */ + comp_out = stuff->combine ? 1 : CmpCnt_(src1); + for( comp = 0; comp < comp_out; lvl[comp] = 2, comp++); + dst = UtilCreatePhotomap( comp_out == 1 ? XieK_Bitonal : XieK_RGB, lvl, + PxlRatio_(src1), PxlProg_(src1), ScnProg_(src1), + PxlPol_(src1), Width_(src1), Height_(src1), + flo == NULL, FALSE, DdxAlignCompare_ ); + AllocOkIf_(dst, stuff->dst_photo_id); + + if( flo != NULL ) + { + s = !((!idcptr || QueResource(flo, idcptr, FALSE)) + && QueResource(flo, dst, TRUE)) ? BadAlloc + : DdxCreateCompare_( Pipe_(flo), Sink_(src1), + src2 ? Sink_(src2) : NULL, + stuff->constants, Sink_(dst), idcudp, + stuff->op, stuff->combine ); + OkIf_(s == Success, (UtilFreeResource(dst), ResId_(flo)), s); + } + else + { /* Call Compare routine (per component), then combine results */ + combine_op = stuff->op == XieK_NE ? XieK_OR : XieK_AND; + BePCM_( src1, (UtilFreeResource(dst), ResId_(src1)) ); + BePCM_( src2, (UtilFreeResource(dst), ResId_(src2)) ); + + if( comp_out < CmpCnt_(src1) ) + { /* Get a temporary UDP to hold the intermediate results */ + tmpudp = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + AllocOkIf_(tmpudp, (UtilFreeResource(dst), stuff->dst_photo_id)); + *tmpudp = *Udp_(dst,0); + tmpudp->UdpA_Base = DdxMallocBits_(tmpudp->UdpL_ArSize); + AllocOkIf_(tmpudp->UdpA_Base, + (UtilFreeResource(dst), stuff->dst_photo_id)); + } + /* Process the first component */ + s = DdxCompare_( Udp_(src1,0), src2 ? Udp_(src2,0) : NULL, + stuff->constants, Udp_(dst,0), idcudp, stuff->op ); + + for( comp = 1; comp < CmpCnt_(src1) && s == Success; comp++ ) + { + s = DdxCompare_( Udp_(src1,comp), src2 ? Udp_(src2,comp) : NULL, + stuff->constants, + stuff->combine ? tmpudp : Udp_(dst,comp), + idcudp, stuff->op); + if( s == Success && stuff->combine ) + s = DdxLogical_( tmpudp, Udp_(dst,0), NULL, + Udp_(dst,0), idcudp, combine_op ); + } + if( tmpudp != NULL ) + UtilFreeUdp(tmpudp); + OkIf_(s == Success, (UtilFreeResource(dst), stuff->dst_photo_id), s); + AddResource_(stuff->dst_photo_id, RT_photo, dst); + xieDoSendEvent( client, dst, XieK_ComputationEvent ); + } + return( Success ); +} /* End of ProcCompare */ + +/*----------------------------------------------------------------------- +--------------------------- Constrain Procedure ------------------------ +------------------------------------------------------------------------*/ +int ProcConstrain( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo; + PhotomapPtr src, dst; + CARD32 s, i, model, comp, compmpg, lvl[XieK_MaxComponents]; + REQUEST( xieConstrainReq ); + REQUEST_SIZE_MATCH( xieConstrainReq ); + /* + ** Locate source Photomap {and Photoflo} and verify destination Id. + */ + LookupPhotos_(&flo, &src, stuff->src_photo_id, stuff->dst_photo_id); + /* + ** Get the constraint model info. + */ + if( stuff->model != 0 ) + { + ValueOkIf_( stuff->model == XieK_HardClip + || stuff->model == XieK_ClipScale + || stuff->model == XieK_HardScale, 0 ); + model = stuff->model; + for( i = 0; i < XieK_MaxComponents; i++ ) + { + lvl[i] = stuff->levels[i]; + ValueOkIf_(lvl[i] > 0, stuff->dst_photo_id); + } + } + else + GetConstraintModel(client, &model, lvl); + + /* Adjust component mapping */ + if (CmpCnt_(src) > 1) + compmpg = XieK_RGB; + else + compmpg = lvl[0] > 2 ? XieK_GrayScale : XieK_Bitonal; + + dst = UtilCreatePhotomap(compmpg, lvl, PxlRatio_(src), + PxlProg_(src), ScnProg_(src), PxlPol_(src), + Width_(src), Height_(src), + flo == NULL, FALSE, DdxAlignConstrain_ ); + AllocOkIf_(dst, stuff->dst_photo_id); + if( flo != NULL ) + { + s = !QueResource( flo, dst, TRUE ) ? BadAlloc + : DdxCreateConstrain_(Pipe_(flo), Sink_(src), Sink_(dst), model); + OkIf_(s == Success, (UtilFreeResource(dst), ResId_(flo)), s); + } + else + { /* Call Constrain routine (once per component) */ + BePCM_( src, (UtilFreeResource(dst), ResId_(src)) ); + for(s = Success, comp = 0; comp < CmpCnt_(src) && s == Success; comp++ ) + s = DdxConstrain_(Udp_(src,comp), Udp_(dst,comp), model); + OkIf_(s == Success, (UtilFreeResource(dst), stuff->dst_photo_id), s); + AddResource_(stuff->dst_photo_id, RT_photo, dst); + xieDoSendEvent( client, dst, XieK_ComputationEvent ); + } + return( Success ); +} /* end ProcConstrain */ + +/*----------------------------------------------------------------------- +---------------------------- Crop Procedure ----------------------------- +------------------------------------------------------------------------*/ +int ProcCrop( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo; + PhotomapPtr src, dst; + UdpRec roi_udp; + RoiRec all, *roi; + CARD32 s, comp, lvl[XieK_MaxComponents]; + CARD32 width, height; + REQUEST( xieCropReq ); + REQUEST_SIZE_MATCH( xieCropReq ); + /* + ** Verify src Photo{flo&|map}, verify dst Id, and establish the Roi. + */ + LookupPhotos_(&flo, &src, stuff->src_photo_id, stuff->dst_photo_id); + if( stuff->idc_id == 0 ) + roi = RoiEntirePhotomap(src, &all, &roi_udp); + else { + LookupIdc_(&roi,stuff->idc_id,XieK_IdcRoi); + ValueOkIf_( UtilValidRegion( src, RoiUdp_(roi)), stuff->idc_id ); + } + + for( comp = 0; comp < CmpCnt_(src); lvl[comp] = uLvl_(src,comp), comp++); + + /* + ** Clip the ROI to the source image bounds. + */ + width = min(RoiX_(roi) + RoiW_(roi) - 1, uX2_(src, 0)) - RoiX_(roi) + 1; + height = min(RoiY_(roi) + RoiH_(roi) - 1, uY2_(src, 0)) - RoiY_(roi) + 1; + + dst = UtilCreatePhotomap(CmpMap_(src), lvl, PxlRatio_(src), + PxlProg_(src), ScnProg_(src), PxlPol_(src), + width, height, + flo == NULL, FALSE, DdxAlignCrop_ ); + AllocOkIf_(dst, stuff->dst_photo_id); + + if( flo != NULL ) + { + s = !QueResource( flo, dst, TRUE ) ? BadAlloc + : DdxCreateCrop_( Pipe_(flo), Sink_(src), Sink_(dst), + RoiX_(roi), RoiY_(roi), width, height ); + OkIf_(s == Success, (UtilFreeResource(dst), ResId_(flo)), s); + } + else + { /* Call Crop routine (once per component) */ + BePCM_( src, (UtilFreeResource(dst), ResId_(src)) ); + for(s = Success, comp = 0; comp < CmpCnt_(src) && s == Success; comp++) + s = DdxCrop_(Udp_(src,comp), Udp_(dst,comp), /* Udps */ + RoiX_(roi), RoiY_(roi), 0, 0, /* coordinates */ + width, height ); /* dimensions */ + OkIf_(s == Success, (UtilFreeResource(dst), stuff->dst_photo_id), s); + AddResource_(stuff->dst_photo_id, RT_photo, dst); + xieDoSendEvent( client, dst, XieK_ComputationEvent ); + } + return( Success ); +} /* End of ProcCrop */ + +/*----------------------------------------------------------------------- +------------------------------ Dither Procedure ------------------------ +------------------------------------------------------------------------*/ +int ProcDither( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo; + PhotomapPtr src, dst; + CARD32 s, comp, compmpg; + REQUEST( xieDitherReq ); + REQUEST_SIZE_MATCH( xieDitherReq ); + /* + ** Locate source Photomap {and Photoflo} and verify destination Id. + ** Create destination Photomap. + */ + LookupPhotos_(&flo, &src, stuff->src_photo_id, stuff->dst_photo_id); + MatchOkIf_(Constrained_(src), stuff->src_photo_id); + + for( comp = 0; comp < CmpCnt_(src); comp++ ) + { + MatchOkIf_(stuff->levels[comp] <= uLvl_(src,comp), stuff->src_photo_id); + ValueOkIf_(stuff->levels[comp] > 0, stuff->src_photo_id); + } + compmpg = IsGrayScale_(src) && stuff->levels[0] <= 2 ? XieK_Bitonal + : CmpMap_(src); + dst = UtilCreatePhotomap( compmpg, stuff->levels, PxlRatio_(src), + PxlProg_(src), ScnProg_(src), PxlPol_(src), + Width_(src), Height_(src), + flo == NULL, FALSE, DdxAlignDither_ ); + AllocOkIf_(dst, stuff->dst_photo_id); + + if( flo != NULL ) + { + s = !QueResource( flo, dst, TRUE ) ? BadAlloc + : DdxCreateDither_( Pipe_(flo), Sink_(src), Sink_(dst) ); + OkIf_(s == Success, (UtilFreeResource(dst), ResId_(flo)), s); + } + else + { /* Call Dither routine (once per component) */ + BePCM_( src, (UtilFreeResource(dst), ResId_(src)) ); + for(s = Success, comp = 0; comp < CmpCnt_(src) && s == Success; comp++) + s = DdxDither_(Udp_(src,comp), Udp_(dst,comp)); + OkIf_(s == Success, (UtilFreeResource(dst), stuff->dst_photo_id), s); + AddResource_(stuff->dst_photo_id, RT_photo, dst); + xieDoSendEvent( client, dst, XieK_ComputationEvent ); + } + return( Success ); +} /* End of ProcDither */ + +/*----------------------------------------------------------------------- +----------------------------- Fill Procedure --------------------------- +------------------------------------------------------------------------*/ +int ProcFill( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo; + PhotomapPtr src, dst; + UdpPtr idcudp = NULL; + CommonPartPtr *idcptr = NULL; + CARD32 s, comp, lvl[XieK_MaxComponents]; + REQUEST( xieFillReq ); + REQUEST_SIZE_MATCH( xieFillReq ); + /* + ** Verify src Photomap and setup Roi. + ** Src Photo is either updated in place, or it's a Photoflo. + */ + LookupPhotos_(&flo, &src, stuff->src_photo_id, stuff->dst_photo_id); + if( stuff->dst_idc_id != 0 ) { + LookupCppRoi_(&idcptr, &idcudp, stuff->dst_idc_id); + ValueOkIf_( UtilValidRegion( src, idcudp ), stuff->dst_idc_id ); + } + + for( comp = 0; comp < CmpCnt_(src); lvl[comp] = uLvl_(src,comp), comp++); + dst = UtilCreatePhotomap( CmpMap_(src), lvl, PxlRatio_(src), + PxlProg_(src), ScnProg_(src), PxlPol_(src), + Width_(src), Height_(src), + flo == NULL, FALSE, DdxAlignFill_ ); + AllocOkIf_(dst, stuff->dst_photo_id); + + if (flo != NULL) + { + s = !((!idcptr || QueResource(flo, idcptr, FALSE)) + && QueResource(flo, dst, TRUE)) ? BadAlloc + : DdxCreateFill_( Pipe_(flo), Sink_(src), Sink_(dst), + idcudp, stuff->constant ); + OkIf_(s == Success, (UtilFreeResource(dst), ResId_(flo)), s); + } + else + { /* Call Fill routine (once per component) */ + BePCM_( src, (UtilFreeResource(dst), ResId_(src)) ); + for(s = Success, comp = 0; comp < CmpCnt_(src) && s == Success; comp++) + s = DdxFill_( Udp_(src,comp), Udp_(dst,comp), idcudp, + stuff->constant[comp]); + OkIf_(s == Success, (UtilFreeResource(dst), stuff->dst_photo_id), s); + AddResource_(stuff->dst_photo_id, RT_photo, dst); + xieDoSendEvent( client, dst, XieK_ComputationEvent ); + } + return( Success ); +} /* End of ProcFill */ + +/*----------------------------------------------------------------------- +--------------------- Calculate Histogram Procedure --------------------- +------------------------------------------------------------------------*/ +int ProcCalcHistogram( client ) +ClientPtr client; /* client pointer */ +{ + PhotomapPtr img; + UdpPtr idcudp = NULL; + CommonPartPtr *idcptr = NULL; + xieCalcHistReply rep; + int repsiz; + CARD32 s, i,j, *repptr, *cmpcnt, *ptr, histcnt=0, *hist[XieK_MaxComponents]; + REQUEST(xieCalcHistReq); + REQUEST_SIZE_MATCH(xieCalcHistReq); + /* + ** Lookup source photomap...MUST NOT be a pipe. + */ + LookupPhotos_(NULL, &img, stuff->photo_id, 0); + /* + ** Lookup ROI if specified. + */ + if( stuff->idc_id != NULL ) { + LookupCppRoi_(&idcptr,&idcudp,stuff->idc_id); + ValueOkIf_( UtilValidRegion( img, idcudp ), stuff->idc_id ); + } + BePCM_( img, ResId_(img) ); + /* + ** Process depending on "by_component" flag setting. + */ + if( stuff->by_component ) + { + for( i = 0; i < CmpCnt_(img); i++ ) + { + hist[i] = (CARD32 *) DdxMalloc_(uLvl_(img,i) * sizeof(CARD32)); + /* + ** Do histogram calculation. + */ + s = hist[i] ? DdxHistogram_( Udp_(img,i), idcudp, hist[i] ) + : BadAlloc; + if( s != Success ) + { + while( i-- > 0 ) + DdxFree_(hist[i]); + OkIf_(FALSE, stuff->photo_id, s); + } + /* + ** Count number of non-zero histogram entries. + */ + for( j = 0; j < uLvl_(img,i); j++ ) + if( hist[i][j] ) + histcnt++; + } + /* + ** Allocate reply buffer for histogram data. For "by component" + ** histogram entry size is 2 CARD32s, plus 1 CARD32 for each component + ** for the entry count field. + */ + repsiz = (histcnt * 2 + CmpCnt_(img) ) * sizeof(CARD32); + repptr = (CARD32 *) DdxMalloc_(repsiz); + if( !repptr ) + { + for( i = 0; i < CmpCnt_(img); i++ ) + DdxFree_(hist[i]); + BadAlloc_(stuff->photo_id); + } + /* + ** Fill in the reply buffer... + */ + for( ptr = repptr, i = 0; i < CmpCnt_(img); i++ ) + { + cmpcnt = ptr++; /* Save pointer to entry count field */ + *cmpcnt = 0; /* Initialize to zero */ + for( j = 0; j < uLvl_(img,i); j++ ) + if( hist[i][j] ) + { + *ptr++ = j; + *ptr++ = hist[i][j]; + ++*cmpcnt; + } + /* + ** Free histogram buffer. + */ + DdxFree_(hist[i]); + } + } + else + { /* + ** NOT by_component + */ + UdpRec udp; + /* + ** For now...bad match if greater than one component. What belongs + ** here is code that will combine multiple components into a single + ** plane for histogram purposes. For now, just use the only existing + ** component plane. + */ + MatchOkIf_(!IsRGB_(img), stuff->photo_id); + udp = *Udp_(img,0); + /* + ** Allocate a histogram buffer. + */ + hist[0] = (CARD32 *) DdxMalloc_(udp.UdpL_Levels * sizeof(CARD32)); + AllocOkIf_(hist[0], stuff->photo_id); + /* + ** Do histogram calculation. + */ + s = DdxHistogram_( &udp, idcudp, hist[0] ); + OkIf_(s == Success, (DdxFree_(hist[0]), stuff->photo_id), s); + /* + ** Count number of non-zero histogram entries. + */ + for( j = 0; j < udp.UdpL_Levels; j++ ) + if( hist[0][j] ) + histcnt++; + /* + ** Allocate reply buffer for histogram data. For "NOT by component" + ** histogram entry size is CmpCnt_ CARD32s, plus 1 CARD32 for the + ** entry count field. + */ + repsiz = (histcnt * CmpCnt_(img) + 1) * sizeof(CARD32); + repptr = (CARD32 *) DdxMalloc_(repsiz); + AllocOkIf_(repptr, (DdxFree_(hist[0]), stuff->photo_id)); + /* + ** Fill in the reply buffer... + */ + ptr = repptr; + *ptr++ = histcnt; + for( j = 0; j < udp.UdpL_Levels; j++ ) + if( hist[0][j] ) + { + for( i = 0; i < CmpCnt_(img); i++ ) + *ptr++ = j; + *ptr++ = hist[0][j]; + } + /* + ** Free histogram buffer. + */ + DdxFree_(hist[0]); + } + /* + ** Send completed reply back to client. + */ + rep.type = X_Reply; + rep.sequenceNumber = client->sequence; + rep.length = repsiz >> 2; + + WriteXieReplyToClient(client,sizeof(xieCalcHistReply),&rep); + SetSwappedDataRtn(client, CARD32); + WriteSwappedXieDataToClient(client,repsiz,repptr); + + DdxFree_(repptr); + + return( Success ); +} + +/*----------------------------------------------------------------------- +--------------------------- Logical Procedure --------------------------- +------------------------------------------------------------------------*/ +int ProcLogical( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo, flo2; + PhotomapPtr src1, src2 = NULL, dst; + CommonPartPtr idcptr = NULL; + UdpPtr idcudp = NULL; + CARD32 s, comp, lvl[XieK_MaxComponents]; + REQUEST( xieLogicalReq ); + REQUEST_SIZE_MATCH( xieLogicalReq ); + /* + ** Locate source Photomap(s) {and Photoflo} and verify destination Id. + ** If there is a Photoflo, verify the second operand is bound to it. + */ + LookupPhotos_(&flo, &src1, stuff->src1_photo_id, stuff->dst_photo_id); + MatchOkIf_(Constrained_(src1), stuff->src1_photo_id); + + if( stuff->src2_photo_id != 0 ) + { + LookupPhotos_(&flo2, &src2, stuff->src2_photo_id, -1); + AccessOkIf_(flo==flo2,stuff->src2_photo_id); + MatchOkIf_(CmpCnt_(src1) == CmpCnt_(src2), stuff->src2_photo_id); + MatchOkIf_(Constrained_(src2), stuff->src2_photo_id); + } + if( stuff->idc_id != 0 ) { + LookupCppRoi_(&idcptr, &idcudp, stuff->idc_id); + ValueOkIf_( UtilValidRegion( src1, idcudp ), stuff->idc_id ); + if (stuff->src2_photo_id != 0) + ValueOkIf_( UtilValidRegion( src2, idcudp ), stuff->idc_id ); + } + /* + ** Create destination based on first source operand. + */ + for( comp = 0; comp < CmpCnt_(src1); lvl[comp] = uLvl_(src1,comp), comp++); + dst = UtilCreatePhotomap( CmpMap_(src1), lvl, PxlRatio_(src1), + PxlProg_(src1), ScnProg_(src1), PxlPol_(src1), + Width_(src1), Height_(src1), + flo == NULL, FALSE, DdxAlignLogical_ ); + AllocOkIf_(dst, stuff->dst_photo_id); + + if( flo != NULL ) + { + s = !((!idcptr || QueResource(flo, idcptr, FALSE)) + && QueResource(flo, dst, TRUE)) ? BadAlloc + : DdxCreateLogical_( Pipe_(flo), Sink_(src1), + src2 ? Sink_(src2) : NULL, + stuff->constants, Sink_(dst), idcudp, stuff->op); + OkIf_(s == Success, (UtilFreeResource(dst), ResId_(flo)), s); + } + else + { /* Call Logical routine (once per component) */ + BePCM_( src1, (UtilFreeResource(dst), ResId_(src1)) ); + BePCM_( src2, (UtilFreeResource(dst), ResId_(src2)) ); + for(s = Success, comp = 0; comp < CmpCnt_(src1) && s == Success; comp++) + s = DdxLogical_( Udp_(src1,comp), src2 ? Udp_(src2,comp) : NULL, + stuff->constants, Udp_(dst,comp), + idcudp, stuff->op ); + OkIf_(s == Success, (UtilFreeResource(dst), stuff->dst_photo_id), s); + AddResource_(stuff->dst_photo_id, RT_photo, dst); + xieDoSendEvent( client, dst, XieK_ComputationEvent ); + } + return( Success ); +} /* End of ProcLogical */ + +/*----------------------------------------------------------------------- +------------------------------ Luminance Procedure --------------------- +------------------------------------------------------------------------*/ +int ProcLuminance( client ) + ClientPtr client; /* client pointer */ +{ + static CARD32 lvl[] = {256,0,0}; + PhotofloPtr flo; + PhotomapPtr src, dst; + CARD32 s; + REQUEST( xieLuminanceReq ); + REQUEST_SIZE_MATCH( xieLuminanceReq ); + /* + ** Locate source Photomap {and Photoflo} and verify destination Id. + */ + LookupPhotos_(&flo, &src, stuff->src_photo_id, stuff->dst_photo_id); + MatchOkIf_(Constrained_(src), stuff->src_photo_id); + MatchOkIf_(IsRGB_(src), stuff->src_photo_id); + dst = UtilCreatePhotomap( XieK_GrayScale, lvl, PxlRatio_(src), + PxlProg_(src), ScnProg_(src), PxlPol_(src), + Width_(src), Height_(src), + flo == NULL, FALSE, DdxAlignLuminance_ ); + AllocOkIf_(dst, stuff->dst_photo_id); + + if( flo != NULL ) + { + s = !QueResource( flo, dst, TRUE ) ? BadAlloc + : DdxCreateLuminance_(Pipe_(flo), Sink_(src), Sink_(dst)); + OkIf_(s == Success, (UtilFreeResource(dst), ResId_(flo)), s); + } + else + { /* Call Luminance routine */ + BePCM_( src, (UtilFreeResource(dst), ResId_(src)) ); + s = DdxLuminance_(Udp_(src,0),Udp_(src,1),Udp_(src,2),Udp_(dst,0)); + OkIf_(s == Success, (UtilFreeResource(dst), stuff->dst_photo_id), s); + AddResource_(stuff->dst_photo_id, RT_photo, dst); + xieDoSendEvent( client, dst, XieK_ComputationEvent ); + } + return( Success ); +} /* End of ProcLuminance */ + +/*----------------------------------------------------------------------- +------------------------Match Histogram Procedure ----------------------- +------------------------------------------------------------------------*/ +int ProcMatchHistogram( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo; + PhotomapPtr src, dst; + CommonPartPtr idcptr = NULL; + UdpPtr idcudp = NULL; + CARD32 s, comp, lvl[XieK_MaxComponents]; + REQUEST( xieMatchHistogramReq ); + REQUEST_SIZE_MATCH( xieMatchHistogramReq ); + /* + ** Locate source Photomap(s) {and Photoflo} and verify destination Id. + */ + LookupPhotos_(&flo, &src, stuff->photo_id1, stuff->photo_id2); + MatchOkIf_( Constrained_(src) && !IsRGB_(src), stuff->photo_id1 ); + + if( stuff->idc_id != 0 ) { + LookupCppRoi_(&idcptr, &idcudp, stuff->idc_id); + ValueOkIf_( UtilValidRegion( src, idcudp ), stuff->idc_id ); + } + /* + ** Create destination based on source operand. + */ + for( comp = 0; comp < CmpCnt_(src); lvl[comp] = uLvl_(src,comp), comp++ ); + dst = UtilCreatePhotomap(CmpMap_(src), lvl, PxlRatio_(src), + PxlProg_(src), ScnProg_(src), PxlPol_(src), + Width_(src), Height_(src), + flo == NULL, FALSE, DdxAlignMatchHistogram_ ); + AllocOkIf_(dst, stuff->photo_id2); + + if( flo != NULL ) + { + s = !((!idcptr || QueResource(flo, idcptr, FALSE)) + && QueResource(flo, dst, TRUE)) ? BadAlloc + : DdxCreateMatchHistogram_( Pipe_(flo), Sink_(src), Sink_(dst), + idcudp, stuff->h_shape, + MiDecodeDouble(&stuff->param1), + MiDecodeDouble(&stuff->param2) ); + OkIf_(s == Success, (UtilFreeResource(dst), ResId_(flo)), s); + } + else + { /* Call MatchHistogram routine (once per component) */ + BePCM_( src, (UtilFreeResource(dst), ResId_(src)) ); + for(s = Success, comp = 0; comp < CmpCnt_(src) && s == Success; comp++) + s = DdxMatchHistogram_( Udp_(src,comp), Udp_(dst,comp), + idcudp, stuff->h_shape, + MiDecodeDouble(&stuff->param1), + MiDecodeDouble(&stuff->param2) ); + OkIf_(s == Success, (UtilFreeResource(dst), stuff->photo_id2), s); + AddResource_(stuff->photo_id2, RT_photo, dst); + xieDoSendEvent( client, dst, XieK_ComputationEvent ); + } + return( Success ); +} /* End of ProcMatchHistogram */ + +/*----------------------------------------------------------------------- +--------------------------- Math Procedure ---------------------------- +------------------------------------------------------------------------*/ +int ProcMath( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo; + PhotomapPtr src, dst; + PhotomapPtr realdst; + CommonPartPtr idcptr = NULL; + UdpPtr idcudp = NULL; + CARD32 s, i, model, comp, lvl[XieK_MaxComponents]; + REQUEST( xieMathReq ); + REQUEST_SIZE_MATCH( xieMathReq ); + /* + ** Locate source Photomap(s) {and Photoflo} and verify destination Id. + ** If there is a Photoflo, verify the second operand is bound to it. + */ + LookupPhotos_(&flo, &src, stuff->src_photo_id, stuff->dst_photo_id); + + if( stuff->idc_id != 0 ) { + LookupCppRoi_(&idcptr, &idcudp, stuff->idc_id); + ValueOkIf_( UtilValidRegion( src, idcudp ), stuff->idc_id ); + } + /* + ** Create destination based on first source operand. + */ + for( i = 0; i < XieK_MaxComponents; i++) + lvl[i] = 0; /* Make the destination Photo unconstrained */ + dst = UtilCreatePhotomap( CmpMap_(src), lvl, PxlRatio_(src), + PxlProg_(src), ScnProg_(src), PxlPol_(src), + Width_(src), Height_(src), + flo == NULL, FALSE, DdxAlignMath_ ); + AllocOkIf_(dst, stuff->dst_photo_id); + + /* If the result should be constrained, get another photomap */ + if (stuff->constrain) + { + GetConstraintModel(client, &model, lvl); + realdst = UtilCreatePhotomap(CmpMap_(dst), lvl, PxlRatio_(dst), + PxlProg_(dst), ScnProg_(dst), PxlPol_(dst), + Width_(dst), Height_(dst), + flo == NULL, FALSE, DdxAlignMath_ ); + AllocOkIf_(realdst, (UtilFreeResource(dst), stuff->dst_photo_id)); + } + if( flo != NULL ) + { + s = !((!idcptr || QueResource(flo, idcptr, FALSE)) + && QueResource(flo, dst, TRUE)) ? BadAlloc + : DdxCreateMath_( Pipe_(flo), Sink_(src), Sink_(dst), + idcudp, stuff->op ); + if( s == Success && stuff->constrain ) + s = !QueResource(flo, realdst, TRUE) ? BadAlloc + : DdxCreateConstrain_( Pipe_(flo), Sink_(dst), + Sink_(realdst), model); + OkIf_(s == Success, (UtilFreeResource(dst), + UtilFreeResource(realdst), ResId_(flo)), s); + } + else + { /* Call Math routine (once per component) */ + BePCM_( src, (UtilFreeResource(dst), + UtilFreeResource(realdst), ResId_(src)) ); + for(s = Success, comp = 0; comp < CmpCnt_(src) && s == Success; comp++) + { + s = DdxMath_( Udp_(src,comp), Udp_(dst,comp), idcudp, stuff->op ); + if( s == Success && stuff->constrain ) + s = DdxConstrain_( Udp_(dst,comp), Udp_(realdst,comp), model ); + } + if( stuff->constrain ) + { + UtilFreeResource(dst); + dst = realdst; + } + OkIf_(s == Success, (UtilFreeResource(dst), stuff->dst_photo_id), s); + AddResource_(stuff->dst_photo_id, RT_photo, dst); + xieDoSendEvent( client, dst, XieK_ComputationEvent ); + } + return( Success ); +} /* end ProcMath */ + +/*----------------------------------------------------------------------- +--------------------------- Mirror Procedure --------------------------- +------------------------------------------------------------------------*/ +int ProcMirror( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo; + PhotomapPtr src, dst; + CARD32 s, comp, lvl[XieK_MaxComponents]; + REQUEST( xieMirrorReq ); + REQUEST_SIZE_MATCH( xieMirrorReq ); + /* + ** Locate source Photomap {and Photoflo} and verify destination Id. + ** Create destination with same geometry as source + */ + LookupPhotos_(&flo, &src, stuff->src_photo_id, stuff->dst_photo_id); + for( comp=0; comp < CmpCnt_(src); lvl[comp] = uLvl_(src,comp), comp++ ); + dst = UtilCreatePhotomap( CmpMap_(src), lvl, PxlRatio_(src), + PxlProg_(src), ScnProg_(src), PxlPol_(src), + Width_(src), Height_(src), + flo == NULL, FALSE, DdxAlignMirror_ ); + AllocOkIf_(dst, stuff->dst_photo_id); + + if( flo != NULL ) + { + s = !QueResource( flo, dst, TRUE ) ? BadAlloc + : DdxCreateMirror_( Pipe_(flo), Sink_(src), Sink_(dst), + stuff->x_mirror, stuff->y_mirror); + OkIf_(s == Success, (UtilFreeResource(dst), ResId_(flo)), s); + } + else + { /* Call Mirror routine (once per component) */ + BePCM_( src, (UtilFreeResource(dst), ResId_(src)) ); + for(s = Success, comp = 0; comp < CmpCnt_(src) && s == Success; comp++) + s = DdxMirror_( Udp_(src,comp), Udp_(dst,comp), + stuff->x_mirror, stuff->y_mirror ); + OkIf_(s == Success, (UtilFreeResource(dst), stuff->dst_photo_id), s); + AddResource_(stuff->dst_photo_id, RT_photo, dst); + xieDoSendEvent( client, dst, XieK_ComputationEvent ); + } + return( Success ); +} /* End of ProcMirror */ + +/*----------------------------------------------------------------------- +--------------------------- Point Procedure ---------------------------- +------------------------------------------------------------------------*/ +int ProcPoint( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo, trans_flo; + PhotomapPtr src, dst, trans; + CommonPartPtr idcptr = NULL; + UdpPtr idcudp = NULL; + CARD32 s, comp, srccomp, lvl[XieK_MaxComponents]; + REQUEST( xiePointReq ); + REQUEST_SIZE_MATCH( xiePointReq ); + /* + ** Locate source Photomap {and Photoflo} and verify destination Id. + */ + LookupPhotos_(&flo, &src, stuff->src_photo_id, stuff->dst_photo_id); + MatchOkIf_(Constrained_(src), stuff->src_photo_id); + /* + ** Locate the transfer function(s) (lookup table) Photomap. + ** Verify the Photomap is bound to the current Photoflo (if one present). + ** Verify the Photomap has enough components. + */ + LookupPhotos_(&trans_flo, &trans, stuff->trans_photo_id, -1); + MatchOkIf_(Constrained_(trans), stuff->trans_photo_id); + AccessOkIf_( flo == trans_flo, stuff->trans_photo_id); + MatchOkIf_(CmpCnt_(trans) >= CmpCnt_(src), stuff->trans_photo_id); + /* + **** Remove the following when the Point element is fixed to handle + **** the translate table from a Photoflo. + */ + MatchOkIf_(IsPhotomap_(trans), stuff->trans_photo_id); + BePCM_( trans, ResId_(trans) ); + + if( stuff->idc_id != 0 ) + { + LookupCppRoi_(&idcptr, &idcudp, stuff->idc_id); + ValueOkIf_( UtilValidRegion( src, idcudp ), stuff->idc_id ); + } + /* + ** Create destination with same geometry as source, but with levels + ** as specified by the transfer functions. + */ + for( comp = 0; comp < CmpCnt_(trans); comp++ ) + { + lvl[comp] = uLvl_(trans,comp); + MatchOkIf_( !idcptr || lvl[comp] == uLvl_(src,comp), stuff->idc_id ); + } + dst = UtilCreatePhotomap( CmpMap_(trans), lvl, PxlRatio_(src), + PxlProg_(src), ScnProg_(src), PxlPol_(src), + Width_(src), Height_(src), + flo == NULL, FALSE, DdxAlignPoint_ ); + AllocOkIf_(dst, stuff->dst_photo_id); + + if( flo != NULL ) + { + s = !((!idcptr || QueResource(flo, idcptr, FALSE)) + && QueResource(flo, dst, TRUE)) ? BadAlloc + : DdxCreatePoint_( Pipe_(flo), Sink_(src), Sink_(dst), + idcudp, &Udp_(trans,0)); + OkIf_(s == Success, (UtilFreeResource(dst), ResId_(flo)), s); + } + else + { /* + ** Call Point routine (once per component in TRANSFER FUNCTION). + ** If the source has fewer component, supply one multiple times. + */ + BePCM_( src, (UtilFreeResource(dst), ResId_(src)) ); + for(s = Success, comp = 0; comp < CmpCnt_(trans) && s==Success; comp++) + { + srccomp = comp > (CmpCnt_(src)-1) ? 0 : comp; + s = DdxPoint_( Udp_(src,srccomp), Udp_(dst,comp), + idcudp, Udp_(trans,comp)); + } + OkIf_(s == Success, (UtilFreeResource(dst), stuff->dst_photo_id), s); + AddResource_(stuff->dst_photo_id, RT_photo, dst); + xieDoSendEvent( client, dst, XieK_ComputationEvent ); + } + return( Success ); +} /* End of ProcPoint */ + +/*----------------------------------------------------------------------- +--------------------------- Point Stats Procedure ---------------------- +------------------------------------------------------------------------*/ +int ProcPointStats( client ) +ClientPtr client; /* client pointer */ +{ + PhotomapPtr img; + CARD32 s, comp, data_bytes; + xiePointStatsReply rep; + xiePointStatsDataPtr data; + double pixel, minimum, maximum, mean, std_dev, variance; + REQUEST(xiePointStatsReq); + REQUEST_SIZE_MATCH(xiePointStatsReq); + + LookupPhotos_(NULL, &img, stuff->photo_id, 0); + BePCM_( img, ResId_(img) ); + /* + ** Allocate space for statistics. + */ + data_bytes = CmpCnt_(img) * sizeof(xiePointStatsData); + data = (xiePointStatsDataPtr) DdxMalloc_(data_bytes); + AllocOkIf_(data, stuff->photo_id); + /* + ** Setup reply packet. + */ + rep.type = X_Reply; + rep.sequenceNumber = client->sequence; + rep.length = data_bytes >> 2; + /* + ** Do calcuation. + */ + for( comp = 0; comp < CmpCnt_(img); comp++ ) + { + s = DdxStatsPoint_( Udp_(img,comp), stuff->x, stuff->y, + stuff->width, stuff->height, &pixel, + &minimum, &maximum, &mean, &std_dev, &variance ); + OkIf_(s == Success, (DdxFree_(data), stuff->photo_id), s); + MiEncodeDouble(&data[comp].pixel, pixel); + MiEncodeDouble(&data[comp].minimum, minimum); + MiEncodeDouble(&data[comp].maximum, maximum); + MiEncodeDouble(&data[comp].mean, mean); + MiEncodeDouble(&data[comp].std_dev, std_dev); + MiEncodeDouble(&data[comp].variance,variance); + } + /* + ** Send result to client. + */ + WriteXieReplyToClient(client, sizeof(xiePointStatsReply), &rep); + client->pSwapReplyFunc = SwapFloatWrite; + WriteSwappedXieDataToClient(client, data_bytes, data); + DdxFree_(data); + + return( Success ); +} /* End of ProcPointStats */ + +/*----------------------------------------------------------------------- +--------------------------- Rotate Procedure --------------------------- +------------------------------------------------------------------------*/ +int ProcRotate( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo; + PhotomapPtr src, dst; + CARD32 s, comp, width, height, lvl[XieK_MaxComponents]; + double angle, sina, cosa; + REQUEST( xieRotateReq ); + REQUEST_SIZE_MATCH( xieRotateReq ); + /* + ** Locate source Photomap {and Photoflo} and verify destination Id. + ** Create destination based on rotate angle and client passed attributes. + */ + LookupPhotos_(&flo, &src, stuff->src_photo_id, stuff->dst_photo_id); + angle = MiDecodeDouble( &stuff->angle ); + cosa = fabs( cos( angle * RADIANS_PER_DEGREE )); + sina = fabs( sin( angle * RADIANS_PER_DEGREE )); + width = stuff->width != 0 ? stuff->width + : cosa * Width_(src) + sina * Height_(src); + height = stuff->height != 0 ? stuff->height + : sina * Width_(src) + cosa * Height_(src); + for( comp = 0; comp < CmpCnt_(src); lvl[comp] = uLvl_(src,comp), comp++ ); + dst = UtilCreatePhotomap( CmpMap_(src), lvl, PxlRatio_(src), + PxlProg_(src), ScnProg_(src), PxlPol_(src), + width, height, + flo == NULL, FALSE, DdxAlignRotate_ ); + AllocOkIf_(dst, stuff->dst_photo_id); + + if( flo != NULL ) + { + s = !QueResource( flo, dst, TRUE ) ? BadAlloc + : DdxCreateRotate_( Pipe_(flo), Sink_(src), Sink_(dst), + angle, stuff->fill ); + OkIf_(s == Success, (UtilFreeResource(dst), ResId_(flo)), s); + } + else + { /* Call Rotate routine (once per component) */ + BePCM_( src, (UtilFreeResource(dst), ResId_(src)) ); + for(s = Success, comp = 0; comp < CmpCnt_(src) && s == Success; comp++) + s = DdxRotate_( Udp_(src,comp), Udp_(dst,comp), + angle, stuff->fill[comp]); + OkIf_(s == Success, (UtilFreeResource(dst), stuff->dst_photo_id), s); + AddResource_(stuff->dst_photo_id, RT_photo, dst); + xieDoSendEvent( client, dst, XieK_ComputationEvent ); + } + return( Success ); +} /* End of ProcRotate */ + + +/*----------------------------------------------------------------------- +--------------------------- Scale Procedure ---------------------------- +------------------------------------------------------------------------*/ +int ProcScale( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo; + PhotomapPtr src, dst; + CARD32 s, comp, lvl[XieK_MaxComponents]; + REQUEST( xieScaleReq ); + REQUEST_SIZE_MATCH( xieScaleReq ); + + /* + ** Test dimensions. + ** Locate source Photomap {and Photoflo} and verify destination Id. + ** Create a Photomap with new dimensions. + */ + ValueOkIf_(stuff->width != 0 && stuff->height != 0, stuff->src_photo_id); + LookupPhotos_(&flo, &src, stuff->src_photo_id, stuff->dst_photo_id); + for( comp = 0; comp < CmpCnt_(src); lvl[comp] = uLvl_(src,comp), comp++); + dst = UtilCreatePhotomap( CmpMap_(src), lvl, PxlRatio_(src), + PxlProg_(src), ScnProg_(src), PxlPol_(src), + stuff->width, stuff->height, + flo == NULL, FALSE, DdxAlignDefault_ ); + AllocOkIf_(dst, stuff->dst_photo_id); + + if( flo != NULL ) + { + s = !QueResource( flo, dst, TRUE ) ? BadAlloc + : DdxCreateScale_(Pipe_(flo), Sink_(src), Sink_(dst)); + OkIf_(s == Success, (UtilFreeResource(dst), ResId_(flo)), s); + } + else + { /* Call Scale routine (once per component) */ + BePCM_( src, (UtilFreeResource(dst), ResId_(src)) ); + for(s = Success, comp = 0; comp < CmpCnt_(src) && s == Success; comp++) + s = DdxScale_( Udp_(src,comp), Udp_(dst,comp) ); + OkIf_(s == Success, (UtilFreeResource(dst), stuff->dst_photo_id), s); + AddResource_(stuff->dst_photo_id, RT_photo, dst); + xieDoSendEvent( client, dst, XieK_ComputationEvent ); +#ifdef PEZD + LIB$SHOW_TIMER(); + printf("PEZD : End scale\n"); +#endif + } + return( Success ); +} /* End of ProcScale */ + + +/*----------------------------------------------------------------------- +--------------------------- Translate Procedure ------------------------ +------------------------------------------------------------------------*/ +int ProcTranslate( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo, flo2; + PhotomapPtr src1, src2, dst; + UdpPtr sidc_udp = NULL, didc_udp = NULL; + CommonPartPtr sidc = NULL, didc = NULL; + CARD32 s, comp, lvl[XieK_MaxComponents]; + REQUEST( xieTranslateReq ); + REQUEST_SIZE_MATCH( xieTranslateReq ); + + /* Verify source and destination Photomaps */ + LookupPhotos_(&flo, &src1, stuff->src1_photo_id, stuff->dst_photo_id); + LookupPhotos_(&flo2, &src2, stuff->src2_photo_id, -1); + AccessOkIf_(flo==flo2, stuff->src2_photo_id); + MatchOkIf_(CmpCnt_(src1) == CmpCnt_(src2), stuff->src2_photo_id); + + /* Verify or create source and destination IDC's */ + if( stuff->src_idc_id != 0 ) + { + LookupCppRoi_(&sidc, &sidc_udp, stuff->src_idc_id); + ValueOkIf_(UtilValidRegion( src1, sidc_udp ), stuff->src_idc_id ); + } + if( stuff->dst_idc_id != 0 ) + { + LookupCppRoi_(&didc, &didc_udp, stuff->dst_idc_id); + ValueOkIf_(UtilValidRegion( src2, didc_udp ), stuff->dst_idc_id); + } + for( comp = 0; comp < CmpCnt_(src1); comp++ ) + { + lvl[comp] = uLvl_(src1,comp); + MatchOkIf_(lvl[comp] == uLvl_(src2,comp), stuff->src2_photo_id); + } + dst = UtilCreatePhotomap( CmpMap_(src2), lvl, PxlRatio_(src2), + PxlProg_(src2), ScnProg_(src2), PxlPol_(src2), + Width_(src2), Height_(src2), + flo == NULL, FALSE, DdxAlignTranslate_ ); + AllocOkIf_(dst, stuff->dst_photo_id); + + if( flo != NULL ) + { + s = !((!sidc || QueResource(flo, sidc, FALSE)) + &&(!didc || QueResource(flo, didc, FALSE)) + && QueResource(flo, dst, TRUE)) ? BadAlloc + : DdxCreateTranslate_( Pipe_(flo), Sink_(src1), Sink_(src2), + Sink_(dst), sidc_udp, didc_udp ); + OkIf_(s == Success, (UtilFreeResource(dst), ResId_(flo)), s); + } + else + { /* Call Translate routine (once per component) */ + BePCM_( src1, (UtilFreeResource(dst), ResId_(src1)) ); + BePCM_( src2, (UtilFreeResource(dst), ResId_(src2)) ); + for(s = Success, comp = 0; comp < CmpCnt_(src2) && s == Success; comp++) + s = DdxTranslate_( Udp_(src1,comp), Udp_(src2,comp), + Udp_(dst,comp), sidc_udp, didc_udp ); + OkIf_(s == Success, (UtilFreeResource(dst), stuff->dst_photo_id), s); + AddResource_(stuff->dst_photo_id, RT_photo, dst); + xieDoSendEvent( client, dst, XieK_ComputationEvent ); + } + return( Success ); +} /* End of ProcTranslate */ + +/*----------------------------------------------------------------------- +----------- routine: initialize a RoiRec to use full Photomap ---------- +------------------------------------------------------------------------*/ +static RoiPtr RoiEntirePhotomap( img, roi, udp ) + PhotomapPtr img; /* Photo{map|tap} pointer */ + RoiPtr roi; /* pointer to Roi to be filled in */ + UdpPtr udp; /* pointer to Udp to be used by Roi */ +{ + /* + ** Setup the Roi to describe the entire Photomap. + */ + memset( roi, 0, sizeof(RoiRec) ); + memset( udp, 0, sizeof(UdpRec) ); + ResType_(roi) = XieK_IdcRoi; + RoiUdp_(roi) = udp; + upDType_(udp) = UdpK_DTypeVU; + upClass_(udp) = UdpK_ClassUBA; + upWidth_(udp) = Width_(img); + upHeight_(udp) = Height_(img); + upX2_(udp) = upWidth_(udp) - 1; + upY2_(udp) = upHeight_(udp) - 1; + + return( roi ); +} /* End of RoiEntirePhotomap */ +/* End of MODULE XIEPROCESS.C */ diff --git a/xie/docs/dec/xie23-src/server/xie/XieResource.c b/xie/docs/dec/xie23-src/server/xie/XieResource.c new file mode 100644 index 0000000..71ef970 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/XieResource.c @@ -0,0 +1,1156 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** X Image Extension DIX +** +** ABSTRACT: +** +** This Xie module consists of DIX procedures for resource +** service requests. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Richard J. Piccolo +** Robert NC Shelley +** +** CREATION DATE: +** +** May 3, 1989 +** +*******************************************************************************/ + +/* +** Include files +*/ +#include +/* +** Core X Includes +*/ +#include +#include +#include +#include +#include +/* +** XIE Includes +*/ +#include +#include +#include +#include +#include +#include + +/* +** Table of contents +*/ + /* + ** Xie protocol proceedures called from XieMain + */ +int ProcAbortFlo(); +int ProcBindPhotomap(); +int ProcClonePhoto(); +int ProcCreateResource(); +int ProcDeleteResource(); +int ProcExecuteFlo(); +int ProcQueryResource(); +int ProcTapFlo(); + /* + ** routines referenced by other modules. + */ +int FloDone(); +int LookupIdc(); +int LookupCppRoi(); +int LookupPhotos(); +Bool QueResource(); + /* + ** routines used internally by XieResource + */ +static int CloneFlo(); +static int CloneMap(); +static int CreateCpp(); +static int CreatePhoto(); +static int CreateRoi(); +static int CreateTmp(); +static int QueryCpp(); +static int QueryFlo(); +static int QueryMap(); +static int QueryRoi(); +static int QueryTmp(); + +/* +** Equated Symbols +*/ + +/* +** MACRO definitions +*/ + +/* +** External References +** +*/ +#if defined(X11R3) && !defined(DWV3) +extern void AddResource(); /* called by AddResource_ macro */ +extern int UtilFreeResource(); /* ref'd by AddResource_ macro */ +#else /* X11R4 || DWV3 */ +extern Bool AddResource(); /* called by AddResource_ macro */ +#endif +extern void FreeResource(); /* ref'd by FreeResource_ macro*/ + +extern int xieDoSendEvent(); /* XieEvents.c */ +extern int StreamCreate(); /* XieTransport.c */ +extern int xieStreamInit(); /* XieTransport.c */ +extern int StreamPending(); /* XieTransport.c */ +extern int UtilBePCM(); /* XieUtils.c */ +extern PhotomapPtr UtilCreatePhotomap(); /* XieUtils.c */ +extern void UtilSetPending(); /* XieUtils.c */ + +extern CARD32 xieClients; /* num of clients served */ +extern CARD32 xieEventBase; /* Base for Xie events */ +extern CARD32 xieReqCode; /* XIE main opcode */ +#if defined(X11R3) && !defined(DWV3) +extern CARD16 RC_xie; /* XIE Class */ +extern CARD16 RT_photo; /* Photo{flo|map|tap} resource */ +extern CARD16 RT_idc; /* Cpp, Roi & Tmp resource types*/ +#else /* X11R4 || DWV3 */ +extern RESTYPE RC_xie; /* XIE Class */ +extern RESTYPE RT_photo; /* Photo{flo|map|tap} resource */ +extern RESTYPE RT_idc; /* Cpp, Roi & Tmp resource types*/ +#endif + +externalref int (*xieDixSwap[X_ieLastRequest])(); /* Reply swap dispatch tables*/ +externalref int (*xieDixSwapReply[])(); +extern void SwapTmpWrite(); +/* +** Local Storage +*/ + +/*----------------------------------------------------------------------- +------------------- Abort Photoflo execution Procedure ----------------- +------------------------------------------------------------------------*/ +int ProcAbortFlo( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo; + REQUEST( xieAbortPhotofloReq ); + REQUEST_SIZE_MATCH( xieAbortPhotofloReq ); + /* + ** Locate Photoflo. + */ + LookupPhotos_(&flo, NULL, stuff->photoflo_id, 0); + + if( Run_(flo) ) + { /* + ** Kill the DDX Pipeline. + */ + Run_(flo) = FALSE; + AbortPipeline_( flo ); + FloDone(client, flo ); + } + Make_(flo) = FALSE; + + return( Success ); +} /* End of ProcAbortFlo */ + +/*----------------------------------------------------------------------- +---------------- Bind a Photomap to a Photoflo Procedure ---------------- +------------------------------------------------------------------------*/ +int ProcBindMapToFlo( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo; + PhotomapPtr img; + REQUEST( xieBindPhotomapReq ); + REQUEST_SIZE_MATCH( xieBindPhotomapReq ); + /* + ** Verify the Photomap and Photoflo . + */ + LookupPhotos_(&flo, NULL, stuff->photoflo_id,-1); + LookupPhotos_(NULL, &img, stuff->photomap_id, 0); + + /* + ** Add the Photomap to the Photoflo reference list. + */ + AllocOkIf_( QueResource(flo, img, FALSE), stuff->photoflo_id ); + + return( Success ); +} /* end ProcBindMapToFlo */ + +/*----------------------------------------------------------------------- +-------------- Clone Photo{flo|map} from Photomap Procedure ------------- +------------------------------------------------------------------------*/ +int ProcClonePhoto( client ) + ClientPtr client; /* client pointer */ +{ + INT32 status; + REQUEST( xieCreateByReferenceReq ); + REQUEST_SIZE_MATCH( xieCreateByReferenceReq ); + + switch( stuff->resource_type ) + { + case XieK_Photoflo : + status = CloneFlo( client ); + break; + + case XieK_Photomap : + status = CloneMap( client ); + break; + + default: BadRequest_(stuff->resource_id); + } + return( status ); +} /* end ProcClonePhoto */ + +/*----------------------------------------------------------------------- +------------------------ CreateResource Procedure ----------------------- +------------------------------------------------------------------------*/ +int ProcCreateResource( client ) + ClientPtr client; /* client pointer */ +{ + INT32 status; + REQUEST( xieCreateByValueReq ); + REQUEST_AT_LEAST_SIZE( xieCreateByValueReq ); + + switch( stuff->resource_type ) + { + case XieK_IdcCpp : + status = CreateCpp( client ); + break; + + case XieK_Photoflo : + case XieK_Photomap : + status = CreatePhoto( client ); + break; + + case XieK_IdcRoi : + status = CreateRoi( client ); + break; + + case XieK_IdcTmp : + status = CreateTmp( client ); + break; + + default: BadRequest_(stuff->resource_id); + } + + return( status ); +} /* end ProcCreateResource */ + +/*----------------------------------------------------------------------- +------------------------ DeleteResource Procedure ----------------------- +------------------------------------------------------------------------*/ +int ProcDeleteResource( client ) + ClientPtr client; /* client pointer */ +{ + CommonPartPtr res; + CARD32 type; + + REQUEST( xieDeleteResourceReq ); + REQUEST_SIZE_MATCH( xieDeleteResourceReq ); + + switch( stuff->resource_type ) + { + case XieK_Photoflo : + case XieK_Photomap : type = RT_photo; break; + + case XieK_IdcCpp : + case XieK_IdcRoi : + case XieK_IdcTmp : type = RT_idc; break; + + case XieK_Phototap : + default: BadRequest_(stuff->resource_id); + } + + res = (CommonPartPtr) LookupId_(stuff->resource_id, type); + /* + ** If we can't find what the client's trying to delete, just go away + ** quietly -- after all it could be a legitimate client resource that + ** we were unable to create for some reason. + */ + if( res == NULL ) + return( Success ); + + IDChoiceOkIf_( ResType_(res) == stuff->resource_type, stuff->resource_id ); + + FreeResource_( stuff->resource_id ); + + return( Success ); +} /* end ProcDeleteResource */ + +/*----------------------------------------------------------------------- +----------------------- Execute Photoflo Procedure --------------------- +------------------------------------------------------------------------*/ +int ProcExecuteFlo( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo; + INT32 pending, status; + REQUEST( xieExecutePhotofloReq ); + REQUEST_SIZE_MATCH( xieExecutePhotofloReq ); +#ifdef PEZD + printf("PEZD : Begin Execute Flo\n"); + LIB$INIT_TIMER(); +#endif + LookupPhotos_( &flo, NULL, stuff->photoflo_id, -1 ); + + status = StreamCreate(flo); /* create Decoders and Encoders */ + + if( status == Success ) + status = OptimizePipeline_(flo); /* let the DDX optimize the Flo */ + + if( status == Success ) + status = xieStreamInit(flo); /* initialize PutStream Sinks */ + + if( status == Success ) + status = InitiatePipeline_(flo); /* initialize Pipeline elements */ + + if( status == Success ) + pending = StreamPending(flo); /* PutStream requests pending ? */ + + if( status == Success ) + { /* + ** Begin Photoflo execution. + */ + Make_(flo) = FALSE; + Run_(flo) = TRUE; + RefCnt_(flo)++; + status = ResumePipeline_( flo ); + } + OkIf_( status == Success, stuff->photoflo_id, status ); + + if( pending == Success && !Yielded_(flo) ) + /* + ** No PutStream transport was pending so we're already done. + */ + status = FloDone( client, flo ); + + return( status ); +} /* End of ProcExecuteFlo */ + +/*----------------------------------------------------------------------- +------------------------ QueryResource Procedure ------------------------ +------------------------------------------------------------------------*/ +int ProcQueryResource( client ) + ClientPtr client; /* client pointer */ +{ + INT32 status; + REQUEST( xieQueryResourceReq ); + REQUEST_SIZE_MATCH( xieQueryResourceReq ); + + switch( stuff->resource_type ) + { + case XieK_IdcCpp : + status = QueryCpp( client ); + break; + + case XieK_Photoflo : + status = QueryFlo( client ); + break; + + case XieK_Photomap : + case XieK_Phototap : + status = QueryMap( client ); + break; + + case XieK_IdcRoi : + status = QueryRoi( client ); + break; + + case XieK_IdcTmp : + status = QueryTmp( client ); + break; + + default: BadRequest_(stuff->resource_id); + } + + return( status ); +} /* end ProcQueryResource */ + +/*----------------------------------------------------------------------- +----------------------- Tap Photoflo Proceedure ----------------------- +------------------------------------------------------------------------*/ +int ProcTapFlo( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo; + PhotomapPtr img; + REQUEST( xieTapPhotofloReq ); + REQUEST_SIZE_MATCH( xieTapPhotofloReq ); + + LookupPhotos_(&flo, &img, stuff->photoflo_id, -1); + IDChoiceOkIf_( flo, stuff->photoflo_id ); + AccessOkIf_( ResId_(img) == 0, ResId_(img) ); + CheckNewResource_( stuff->photo_id, RT_photo ); + + /* + ** Bump RefCnt_, even if ephemeral. If AddResource_ fails core X11 calls + ** UtilFreeResource -- our queue would be corrupted if RefCnt_ went to 0. + */ + RefCnt_(img)++; + AddResource_( stuff->photo_id, RT_photo, img ); + RefCnt_(img) -= stuff->permanent ? 0 : 1; + + if( stuff->permanent ) + { + ResType_(img) = XieK_Photomap; + SnkPrm_(Sink_(img)) = TRUE; + SnkWrite_(Sink_(img)) = TRUE; + } + + return( Success ); +} /* end ProcTapFlo */ + +/*----------------------------------------------------------------------- +------------------------- Photoflo Done Procedure ----------------------- +------------------------------------------------------------------------*/ +int FloDone( client, flo ) + ClientPtr client; /* client pointer */ + PhotofloPtr flo; /* Photoflo pointer */ +{ + INT32 status; + FloQuePtr que = QueSrc_(flo); + PhotomapPtr map; + PipeSinkPtr snk; + REQUEST( xieReq ); + + if( Run_(flo) ) + { /* + ** Kill the DDX Pipeline. + */ + status = FlushPipeline_( flo ); + OkIf_( status == Success, ResId_(flo), status ); + if( Yielded_(flo) ) + return( Success ); + /* + ** Set Photoflo status to indicate execution complete and send event. + */ + Done_(flo) = TRUE; + Run_(flo) = FALSE; + xieDoSendEvent( client, flo, XieK_PhotofloEvent ); + } + /* + ** Reset Sink attributes on all Photo{map|tap}s. + */ + do { + if( IsPhoto_(FloRes_(que)) ) + { + map = FloMap_(que); + snk = Sink_(map); + SnkInited_(snk) = FALSE; + SnkDtyp_(snk) = SnkDatTyp_(snk,0); + SnkFull_(snk) |= Done_(flo) && IsPhotomap_(map); + SnkUdpFinalMsk_(snk) |= Done_(flo) && IsPhotomap_(map) + ? (1< 0 ) + CheckNewResource_(dst_id,RT_photo); /* Ok if dst_id is legal */ + break; + + default : BadIDChoice_(src_id); + } + if( flo != NULL && *flo != NULL && dst_id != 0 ) + { + AccessOkIf_( Make_(*flo), src_id ); /* Ok if under construction */ + IDChoiceOkIf_( dst_id < 0 /* Ok if flo matches dst_id */ + || *flo == (PhotofloPtr) LookupId_(dst_id, RT_photo), dst_id); + } + return( Success ); +} /* end LookupPhotos */ + +/*----------------------------------------------------------------------- +------------- routine: Lookup/verify a Template Idc resource------------ +------------------------ Return the TmpDat structure -------------------- +------------------------------------------------------------------------*/ +int LookupTmp( client, idcptr, dat, idc_id) + ClientPtr client; /* client pointer, needed by error macros */ + CommonPartPtr *idcptr; /* where to store the resource pointer */ + TmpDatPtr *dat; /* where to store the TmpDat pointer */ + CARD32 idc_id; /* X11 resource-id of Idc */ +{ + TmpPtr tmp; + REQUEST( xieReq ); + + *idcptr = (CommonPartPtr) LookupId_(idc_id, RT_idc); + IDChoiceOkIf_(*idcptr && ResType_(*idcptr) == XieK_IdcTmp, idc_id ); + + tmp = (TmpPtr) *idcptr; + if( dat != NULL ) + *dat = TmpDat_(tmp); + + return( Success ); +} /* end LookupTmp */ + +/*----------------------------------------------------------------------- +- routine: Queue a resource to a flo (ie. remember what's in the Photoflo) - +------------------------------------------------------------------------*/ +Bool QueResource( flo, res, NewDst ) +PhotofloPtr flo; /* Photoflo resource */ +CommonPartPtr res; /* Resource to be added to the queue */ +Bool NewDst; /* True if Photo{map|tap} is new "end-of-Photoflo" */ +{ + FloQuePtr que = QueSrc_(flo); + + while(que != NULL && FloRes_(que) != res) /* search for resource */ + que = que == QueEnd_(flo) ? NULL : FloNxt(que); + + if( que == NULL ) + { + if( !NewDst || ResId_(DstMap_(flo)) != 0 || Eport_(DstMap_(flo)) + || QueSrc_(flo)==QueDst_(flo) || Tport_(DstMap_(flo)) ) + { /* + ** Allocate and queue the new resource. + */ + que = (FloQuePtr) DdxMalloc_(sizeof(FloQueRec)); + if( que == NULL ) return( FALSE ); + if( QueSrc_(flo) == NULL ) + QueSrc_(flo) = (FloQuePtr) IniQue_(que); /* init queue */ + else + InsQue_(que,QueSrc_(flo)); /* insert queue */ + } + else + { /* + ** Delete an untapped Phototap, and re-use its queue element. + */ + SnkDelete_(Sink_(DstMap_(flo))) = TRUE; + UtilFreeResource(DstMap_(flo)); + que = QueDst_(flo); + } + FloRes_(que) = res; /* stash resource in queue element */ + + if( !IsPhototap_(res) ) + RefCnt_(res)++; /* perm resource -- count reference */ + + if( IsPhoto_(res) ) /* link Photo{map|tap} to Photoflo */ + FloLnk_((PhotomapPtr)res) = flo; + } + if( NewDst ) + { + QueDst_(flo) = que; /* remember Photo{map|tap} as new DstMap_() */ + SnkFull_(Sink_((PhotomapPtr)res)) = FALSE; + SnkUdpFinalMsk_(Sink_((PhotomapPtr)res)) = 0; + } + return( TRUE ); +} /* end QueResource */ + +/*----------------------------------------------------------------------- +----------------- routine: Clone Photoflo from Photomap ---------------- +------------------------------------------------------------------------*/ +static int CloneFlo( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo; + PhotomapPtr img; + INT32 status; + REQUEST( xieCreateByReferenceReq ); + REQUEST_SIZE_MATCH( xieCreateByReferenceReq ); + /* + ** Verify the Photomap and the new Photoflo id. Create a Photoflo. + */ + LookupPhotos_(NULL, &img, stuff->photomap_id, stuff->resource_id); + + flo = (PhotofloPtr) DdxCalloc_(1,sizeof(PhotofloRec)); + AllocOkIf_(flo, stuff->resource_id); + ResType_(flo) = XieK_Photoflo; + RefCnt_(flo) = 1; + Make_(flo) = TRUE; + /* + ** Create a DDX Pipeline. + */ + Pipe_(flo) = CreatePipeline_(client, flo); + status = (int) Pipe_(flo); + OkIf_( IsPointer_(Pipe_(flo)), + ( UtilFreeResource(flo), stuff->resource_id), status ); + /* + ** Add the Photomap as the source of the Photoflo. + */ + AllocOkIf_( QueResource( flo, img, FALSE ), + ( UtilFreeResource(flo), stuff->resource_id)); + /* + ** At this point the initial Photomap is also the end of the Photoflo. + */ + QueDst_(flo) = QueSrc_(flo); + + AddResource_( stuff->resource_id, RT_photo, flo ); + + return( Success ); +} /* end CloneFlo */ + +/*----------------------------------------------------------------------- +----------------- routine: Clone Photomap from Photomap ---------------- +------------------------------------------------------------------------*/ +static int CloneMap( client ) + ClientPtr client; /* client pointer */ +{ + CARD32 comp, lvl[XieK_MaxComponents]; + PhotomapPtr img, dst; + REQUEST( xieCreateByReferenceReq ); + REQUEST_SIZE_MATCH( xieCreateByReferenceReq ); + /* + ** Verify the src Photomap and the new Photomap-id. + */ + LookupPhotos_(NULL, &img, stuff->photomap_id, stuff->resource_id); + + /* + ** Create a new Photomap with identical attributes. + */ + for( comp = 0; comp < CmpCnt_(img); lvl[comp] = uLvl_(img,comp), comp++ ); + dst = UtilCreatePhotomap(CmpMap_(img), lvl, + PxlRatio_(img),PxlProg_(img), ScnProg_(img), + PxlPol_(img), Width_(img), Height_(img), + TRUE, FALSE, DdxAlignDefault_, NULL ); + AllocOkIf_(dst, stuff->resource_id); + WriteMap_(dst) = TRUE; + UtilSetPending( dst, 0, XieK_BandByPixel, TRUE ); + + AddResource_( stuff->resource_id, RT_photo, dst ); + + return( Success ); +} /* end CloneMap */ + +/*----------------------------------------------------------------------- +---------------------- routine: Create Cpp Resource -------------------- +------------------------------------------------------------------------*/ +static int CreateCpp( client ) + ClientPtr client; /* client pointer */ +{ + PhotomapPtr map; + CppPtr cpp; + UdpPtr u; + REQUEST( xieCreateCppReq ); + REQUEST_SIZE_MATCH( xieCreateCppReq ); + + LookupPhotos_(NULL, &map, stuff->photomap_id, 0); + + CheckNewResource_(stuff->resource_id, RT_idc); + cpp = (CppPtr) DdxCalloc_(1,sizeof(CppRec)); + AllocOkIf_(cpp, stuff->resource_id); + + ResType_(cpp) = XieK_IdcCpp; + RefCnt_(cpp) = 1; + CppMap_(cpp) = map; + + /* Describe the CPP data plane in a form suitable for the DDX routines */ + u = (UdpPtr) DdxCalloc_(1, sizeof(UdpRec)); + AllocOkIf_(u, (UtilFreeResource(cpp), stuff->resource_id)); + CppUdp_(cpp) = u; + + *u = *Udp_(map,0); + upX1_(u) = stuff->x; + upY1_(u) = stuff->y; + upX2_(u) = upX1_(u) + upWidth_(u) - 1; + upY2_(u) = upY1_(u) + upHeight_(u) - 1; + + BePCM_( map, (UtilFreeResource(cpp), stuff->photomap_id) ); + RefCnt_(map)++; + AddResource_( stuff->resource_id, RT_idc, cpp ); + + return( Success ); +} /* end CreateCpp */ + +/*----------------------------------------------------------------------- +------------------ routine: Create Photo{flo|map} Resource ------------- +------------------------------------------------------------------------*/ +static int CreatePhoto( client ) + ClientPtr client; /* client pointer */ +{ + PhotomapPtr map; + PhotofloPtr flo = NULL; + INT32 status; + REQUEST( xieCreatePhotoReq ); + REQUEST_SIZE_MATCH( xieCreatePhotoReq ); + + ValueOkIf_(stuff->width != 0 && stuff->height != 0, stuff->resource_id); + CheckNewResource_(stuff->resource_id, RT_photo); + /* + ** Create a Photomap (or Phototap if resource_type == Photoflo). + */ + map = UtilCreatePhotomap( stuff->component_mapping, stuff->levels, + MiDecodeDouble( &stuff->aspect_ratio ), + stuff->pixel_progression, stuff->line_progression, + stuff->polarity, + stuff->width, stuff->height, + stuff->resource_type == XieK_Photomap, + FALSE, DdxAlignDefault_, NULL ); + AllocOkIf_(map, stuff->resource_id); + WriteMap_(map) = TRUE; + UtilSetPending( map, 0, XieK_BandByPixel, TRUE ); + + if( stuff->resource_type == XieK_Photoflo ) + { /* + ** Create a Photoflo with a DDX Pipeline attached. + */ + flo = (PhotofloPtr) DdxCalloc_(1,sizeof(PhotofloRec)); + AllocOkIf_(flo, (UtilFreeResource(map), stuff->resource_id)); + ResType_(flo) = XieK_Photoflo; + RefCnt_(flo) = 1; + Make_(flo) = TRUE; + Pipe_(flo) = CreatePipeline_(client, flo); + status = (int) Pipe_(flo); + OkIf_( IsPointer_(Pipe_(flo)), + ( UtilFreeResource(map), + UtilFreeResource(flo), stuff->resource_id), status ); + /* + ** Queue the new Phototap as the source (and end) of the Photoflo. + */ + AllocOkIf_( QueResource( flo, map, FALSE ), + ( UtilFreeResource(map), + UtilFreeResource(flo), stuff->resource_id )); + QueDst_(flo) = QueSrc_(flo); + } + AddResource_( stuff->resource_id, RT_photo, flo ? (CommonPartPtr) flo + : (CommonPartPtr) map ); + return( Success ); +} /* end CreatePhoto */ + +/*----------------------------------------------------------------------- +---------------------- routine: Create Roi Resource -------------------- +------------------------------------------------------------------------*/ +static int CreateRoi( client ) + ClientPtr client; /* client pointer */ +{ + RoiPtr roi; + UdpPtr u; + REQUEST( xieCreateRoiReq ); + REQUEST_SIZE_MATCH( xieCreateRoiReq ); + + ValueOkIf_(stuff->width != 0 && stuff->height != 0, stuff->resource_id); + CheckNewResource_(stuff->resource_id, RT_idc); + roi = (RoiPtr) DdxCalloc_(1,sizeof(RoiRec)); + AllocOkIf_(roi, stuff->resource_id); + ResType_(roi) = XieK_IdcRoi; + RefCnt_(roi) = 1; + + /* Describe the Roi in a form suitable for the DDX routines */ + u = (UdpPtr) DdxCalloc_(1, sizeof(UdpRec)); + AllocOkIf_(u, (UtilFreeResource(roi), stuff->resource_id)); + RoiUdp_(roi) = u; + upDType_(u) = UdpK_DTypeVU; + upClass_(u) = UdpK_ClassUBA; + upWidth_(u) = stuff->width; + upHeight_(u) = stuff->height; + upX1_(u) = stuff->x; + upY1_(u) = stuff->y; + upX2_(u) = upX1_(u) + upWidth_(u) - 1; + upY2_(u) = upY1_(u) + upHeight_(u) - 1; + + AddResource_(stuff->resource_id, RT_idc, roi); + + return( Success ); +} /* end CreateRoi */ + +/*----------------------------------------------------------------------- +---------------------- routine: Create Tmp Resource -------------------- +------------------------------------------------------------------------*/ +static int CreateTmp( client ) + ClientPtr client; /* client pointer */ +{ + TmpPtr tmp; + TmpEntryPtr entry; + XieTmpEntry data; + TmpDatPtr p; + TmpDatEntryPtr row; + CARD32 index, i, j, k, last, max_x, max_y, x, y; + REQUEST( xieCreateTmpReq ); + REQUEST_AT_LEAST_SIZE( xieCreateTmpReq ); + + CheckNewResource_(stuff->resource_id, RT_idc); + ValueOkIf_(stuff->data_count > 0, 0); + + tmp = (TmpPtr) DdxCalloc_(1, sizeof(TmpRec) + + sizeof(TmpEntryRec) * stuff->data_count); + AllocOkIf_(tmp, stuff->resource_id); + ResType_(tmp) = XieK_IdcTmp; + RefCnt_(tmp) = 1; + TmpX_(tmp) = stuff->center_x; + TmpY_(tmp) = stuff->center_y; + TmpCnt_(tmp) = stuff->data_count; + entry = TmpEnt_(tmp); + data = (XieTmpEntry) &stuff[1]; + max_x = data[0].x; + max_y = data[0].y; + + /* Find the x and y size of the kernel and sanity check the indices */ + for( index = 0; index < TmpCnt_(tmp); index++ ) + { + entry[index].x = data[index].x; + entry[index].y = data[index].y; + ValueOkIf_(entry[index].x >= 0 && entry[index].y >= 0, + stuff->resource_id); + entry[index].value = MiDecodeDouble( &data[index].value ); + max_x = max(max_x, entry[index].x); + max_y = max(max_y, entry[index].y); + } + /* Describe the template in a form for the DDX routines */ + /* The array has an extra element on each row to act as a marker */ + p = (TmpDatPtr) DdxMalloc_(sizeof(TmpDatRec)); + AllocOkIf_(p, (UtilFreeResource(tmp), stuff->resource_id)); + p->x_count = max_x + 1; + p->y_count = max_y + 1; + p->center_x = TmpX_(tmp); + p->center_y = TmpY_(tmp); + p->array = (TmpDatEntryPtr) DdxMalloc_((p->x_count + 1) + * p->y_count + * sizeof(TmpDatEntryRec)); + AllocOkIf_(p->array, (UtilFreeResource(tmp), stuff->resource_id)); + + /* Zero the array */ + row = p->array; + for (i = 0; i < p->y_count; i++) { + for (j = 0; j < p->x_count+1; j++) { + row[j].value = 0.0; + row[j].increment = 0; + } + row += (p->x_count+1); + } + + /* Insert the template data into the array. + * Note that the coordinate system used by the template uses the + * normal mathematical axes orientation (i.e. y increases up). + */ + for (index = 0; index < TmpCnt_(tmp); index++) { + + x = entry[index].x; + y = p->y_count - entry[index].y - 1; + row = p->array + y * (p->x_count+1); + row[x].value = entry[index].value; + row[x].increment = 1; + } + /* Compact the rows, ending with a marker (increment==0) */ + row = p->array; + for (i = 0; i < p->y_count; i++) { + + last = -1; + + for( j = 0; j < p->x_count; j++) { + + if (row[j].increment == 0) { + for (k = j + 1; k < p->x_count ; k++) { + if (row[k].increment != 0) { + row[j] = row[k]; + row[j].increment = k - last; + row[k].increment = 0; + last = k; + break; + } + } + if (k == p->x_count) + break; + } else + last++; + } + row += (p->x_count+1); + } + TmpDat_(tmp) = p; + + AddResource_(stuff->resource_id, RT_idc, tmp); + + return( Success ); +} /* end CreateTmp */ + +/*----------------------------------------------------------------------- +---------------------- routine: Query Cpp Resource --------------------- +------------------------------------------------------------------------*/ +static int QueryCpp( client ) + ClientPtr client; /* client pointer */ +{ + CppPtr cpp; + xieQueryCppReply rep; + REQUEST( xieQueryResourceReq ); + + LookupIdc_(&cpp, stuff->resource_id, XieK_IdcCpp); + rep.type = X_Reply; + rep._reserved = 0; + rep.sequenceNumber = client->sequence; + rep.length = 0; + rep.x = CppX_(cpp); + rep.y = CppY_(cpp); + rep.photomap_id = ResId_(CppMap_(cpp)); + WriteXieReplyToClient( client, sizeof(xieQueryCppReply), &rep ); + + return( Success ); +} /* end QueryCpp */ + +/*----------------------------------------------------------------------- +--------------------- routine: Query Photoflo Resource ----------------- +------------------------------------------------------------------------*/ +static int QueryFlo( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo; + xieQueryPhotofloReply rep; + REQUEST( xieQueryResourceReq ); + + LookupPhotos_(&flo, NULL, stuff->resource_id, 0); + rep.type = X_Reply; + rep.sequenceNumber = client->sequence; + rep.length = 0; + rep.status = Make_(flo) ? XieK_PhotofloFormation + : Run_(flo) ? XieK_PhotofloRunning + : Done_(flo) ? XieK_PhotofloComplete + : XieK_PhotofloAborted; + + WriteXieReplyToClient( client, sizeof(xieQueryPhotofloReply), &rep ); + + return( Success ); +} /* end QueryFlo */ + +/*----------------------------------------------------------------------- +------------------- routine: Query Photomap Resource ------------------- +------------------------------------------------------------------------*/ +static int QueryMap( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo; + PhotomapPtr img; + CARD32 index; + xieQueryPhotomapReply rep; + REQUEST( xieQueryResourceReq ); + + LookupPhotos_(&flo, &img, stuff->resource_id, 0); + rep.type = X_Reply; + rep.sequenceNumber = client->sequence; + rep.length = sizeof(xieQueryPhotomapReply)-32>>2; + rep.width = Width_(img); + rep.height = Height_(img); + MiEncodeDouble( &rep.aspect_ratio, PxlRatio_(img) ); + rep.polarity = PxlPol_(img); + rep.pixel_progression = PxlProg_(img); + rep.line_progression = ScnProg_(img); + rep.constrained = Constrained_(img); + rep.component_mapping = CmpMap_(img); + rep.component_count = CmpCnt_(img); + for( index = 0; index < CmpCnt_(img); index++ ) + rep.levels[index] = uLvl_(img,index); + rep.photo_id = ResId_(img); + + WriteXieReplyToClient( client, sizeof(xieQueryPhotomapReply), &rep ); + + return( Success ); +} /* end QueryMap */ + +/*----------------------------------------------------------------------- +---------------------- routine: Query Roi Resource --------------------- +------------------------------------------------------------------------*/ +static int QueryRoi( client ) + ClientPtr client; /* client pointer */ +{ + RoiPtr roi; + xieQueryRoiReply rep; + REQUEST( xieQueryResourceReq ); + + LookupIdc_(&roi, stuff->resource_id, XieK_IdcRoi); + rep.type = X_Reply; + rep._reserved = 0; + rep.sequenceNumber = client->sequence; + rep.length = 0; + rep.x = RoiX_(roi); + rep.y = RoiY_(roi); + rep.width = RoiW_(roi); + rep.height = RoiH_(roi); + WriteXieReplyToClient( client, sizeof(xieQueryRoiReply), &rep ); + + return( Success ); +} /* end QueryRoi */ + +/*----------------------------------------------------------------------- +---------------------- routine: Query Tmp Resource --------------------- +------------------------------------------------------------------------*/ +static int QueryTmp( client ) + ClientPtr client; /* client pointer */ +{ + TmpPtr tmp; + TmpEntryPtr get; + XieTmpEntry put; + CARD32 index; + xieQueryTmpReply rep; + REQUEST( xieQueryResourceReq ); + + LookupIdc_(&tmp, stuff->resource_id, XieK_IdcTmp); + rep.type = X_Reply; + rep._reserved = 0; + rep.sequenceNumber = client->sequence; + rep.length = TmpCnt_(tmp) * sizeof(XieTmpEntryRec) >> 2; + rep.center_x = TmpX_(tmp); + rep.center_y = TmpY_(tmp); + rep.data_count = TmpCnt_(tmp); + get = TmpEnt_(tmp); + put = (XieTmpEntry) DdxMalloc_(TmpCnt_(tmp) * sizeof(XieTmpEntryRec)); + AllocOkIf_(put, stuff->resource_id); + for( index = 0; index < TmpCnt_(tmp); index++ ) + { + put[index].x = get[index].x; + put[index].y = get[index].y; + MiEncodeDouble( &put[index].value, get[index].value ); + } + WriteXieReplyToClient( client, sizeof(xieQueryTmpReply), &rep ); + client->pSwapReplyFunc = SwapTmpWrite; + WriteSwappedXieDataToClient( client, + sizeof(XieTmpEntryRec) * TmpCnt_(tmp), put ); + DdxFree_( put ); + + return( Success ); +} /* end QueryTmp */ +/* end module XieResource.c */ diff --git a/xie/docs/dec/xie23-src/server/xie/XieServer.h b/xie/docs/dec/xie23-src/server/xie/XieServer.h new file mode 100644 index 0000000..85ac7fe --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/XieServer.h @@ -0,0 +1,341 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Image Extension DIX +** +** ABSTRACT: +** +** The Xie module contains the definitions and structures used by the +** XIE server. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Richard J. Piccolo +** Robert NC Shelley +** +** CREATION DATE: +** +** March 1, 1989 +** +************************************************************************/ + + /* + ** Smi includes + */ +#include /* sample machine independent pipeline definitions */ +#include /* DDX interface definitions */ +#include /* universal data plane descriptor definitions */ + +#if defined(VMS) && !defined(ALPHA) +#define X11R3 +#endif + +#ifndef externalref +#ifdef VMS +#define externalref globalref +#else +#define externalref extern +#endif +#endif + +#ifndef externaldef +#ifdef VMS +#define externaldef(psect) globaldef {"psect"} noshare +#else +#define externaldef(psect) +#endif +#endif + + /* + ** Client connection context table. + */ +typedef struct _ClientTable { + CARD32 event_mask; /* selected events */ + CARD32 model; /* default constrain model */ + CARD32 levels[XieK_MaxComponents]; /* default constrain levels */ + } ClientTableRec, *ClientTablePtr; + + /* + ** A byte of flags. + */ +typedef struct _Flags { + unsigned flag0 : 1; + unsigned flag1 : 1; + unsigned flag2 : 1; + unsigned flag3 : 1; + unsigned flag4 : 1; + unsigned flag5 : 1; + unsigned flag6 : 1; + unsigned flag7 : 1; +} FlagsRec, *FlagsPtr; + + /* + ** Common part of all resource structures. + */ +typedef struct _CommonPart { + CARD32 Id; /* X11 resource-id */ + CARD8 Type; /* Xie resource type */ + FlagsRec flags; /* resource flags */ + INT16 RefCnt; /* resource reference count */ +} CommonPartRec, *CommonPartPtr; + /* + ** Convenience macros for accessing CommonPartPtr fields. + */ +#define ResId_(res) (((CommonPartPtr)(res))->Id) +#define ResType_(res) (((CommonPartPtr)(res))->Type) +#define RefCnt_(res) (((CommonPartPtr)(res))->RefCnt) + /* + ** Convenience macros for determining resource types. + */ +#define IsPhotoflo_(res) (ResType_(res)==XieK_Photoflo) +#define IsPhotomap_(res) (ResType_(res)==XieK_Photomap) +#define IsPhototap_(res) (ResType_(res)==XieK_Phototap) +#define IsPhoto_(res) (IsPhotomap_(res)||IsPhototap_(res)) +#define IsCpp_(res) (ResType_(res)==XieK_IdcCpp) +#define IsRoi_(res) (ResType_(res)==XieK_IdcRoi) +#define IsTmp_(res) (ResType_(res)==XieK_IdcTmp) + + /* + ** Photoflo resource queue structure. + */ +typedef struct _FloQue { + struct _FloQue *flink; /* flink to next FloQue element */ + struct _FloQue *blink; /* blink to prev FloQue element */ + struct _CommonPart *resource; /* link to queued resource */ +} FloQueRec, *FloQuePtr; + /* + ** Convenience macros for accessing FloQuePtr fields. + */ +#define FloNxt(que) ((que)->flink) +#define FloPrv_(que) ((que)->blink) +#define FloRes_(que) ((que)->resource) +#define FloMap_(que) ((PhotomapPtr)FloRes_(que)) + +typedef struct _ThreadCtx *ThreadCtxPtr; /* Used with VMS DECwindows only */ + + /* + ** Photoflo structure. + */ +typedef struct _Photoflo { + CommonPartRec Res; /* type: XieK_Photoflo */ + /* Res.flags.flag0; /* Form: Photoflo under construction*/ + /* Res.flags.flag1; /* Run: Photoflo executing */ + /* Res.flags.flag2; /* Done: Photoflo execution complete*/ + /* Res.flags.flag3; /* Yielded: Photoflo has yielded */ + FloQuePtr QueSrc; /* Src Photomap in resource queue */ + FloQuePtr QueDst; /* Dst Photomap in resource queue */ + Pipe Pipe; /* root of executable Pipeline */ + ThreadCtxPtr ThreadCtx; /* Thread context */ +} PhotofloRec, *PhotofloPtr; + /* + ** Convenience macros for accessing PhotofloPtr fields. + */ +#define Make_(flo) ((flo)->Res.flags.flag0) +#define Run_(flo) ((flo)->Res.flags.flag1) +#define Done_(flo) ((flo)->Res.flags.flag2) +#define Yielded_(flo) ((flo)->Res.flags.flag3) +#define Aborted_(flo) (!(Make_(flo)||Run_(flo)||Done_(flo))) +#define QueSrc_(flo) ((flo)->QueSrc) +#define SrcMap_(flo) ((PhotomapPtr)(QueSrc_(flo)->resource)) +#define QueEnd_(flo) (QueSrc_(flo)->blink) +#define QueDst_(flo) ((flo)->QueDst) +#define DstMap_(flo) ((PhotomapPtr)(QueDst_(flo)->resource)) +#define Pipe_(flo) ((flo)->Pipe) +#define ThreadCtx_(flo) ((flo)->ThreadCtx) + +typedef struct _ExpCtxRec *ExpCtxPtr; /* Import/Export context pointer */ +typedef struct _XportRec *XportPtr; /* Transport context pointer */ + /* + ** Photomap (and Phototap) structure. + */ +typedef struct _Photomap { + CommonPartRec Res; /* type: XieK_Photo{map|tap}*/ + /* Res.flags.flag0; /* Constrained (NOT float) */ + /* Res.flags.flag1; /* AllPending (all pending)*/ + /* Res.flags.flag2; /* AnyPending (some pending)*/ + /* Res.flags.flag3; /* WriteMap (PutStream OK)*/ + CARD8 Cmpres; /* compression scheme */ + CARD8 CmpOrg; /* component organization */ + CARD8 CmpMap; /* component mapping */ + CARD8 CmpCnt; /* component count */ + CARD8 PxlPol; /* pixel polarity */ + CARD8 PxlProg; /* pixel progression */ + CARD8 ScnProg; /* scanline progression */ + CARD8 _pad; + CARD16 Pending[XieK_MaxComponents]; /* comp's pending PutStream */ + CARD32 Width; /* Photomap width in pixels*/ + CARD32 Height; /* Photomap height in pixels*/ + double PxlRatio; /* pixel aspect ratio */ + ExpCtxPtr Eport; /* import/export context */ + XportPtr Tport; /* transport context */ + PhotofloPtr FloLnk; /* binding to Photoflo */ + PipeSinkPtr Sink; /* image data sink */ +} PhotomapRec, *PhotomapPtr; + /* + ** Convenience macros for accessing PhotomapPtr fields. + */ +#define Constrained_(img) ((img)->Res.flags.flag0) +#define AllPending_(img) ((img)->Res.flags.flag1) +#define AnyPending_(img) ((img)->Res.flags.flag2) +#define WriteMap_(img) ((img)->Res.flags.flag3) +#define Cmpres_(img) ((img)->Cmpres) +#define IsDCT_(img) (Cmpres_(img)==XieK_DCT) +#define IsG31D_(img) (Cmpres_(img)==XieK_G31D) +#define IsG32D_(img) (Cmpres_(img)==XieK_G32D) +#define IsG42D_(img) (Cmpres_(img)==XieK_G42D) +#define IsPCM_(img) (Cmpres_(img)==XieK_PCM) +#define CmpOrg_(img) ((img)->CmpOrg) +#define IsBndPxl_(img) (CmpOrg_(img)==XieK_BandByPixel) +#define IsBndPln_(img) (CmpOrg_(img)==XieK_BandByPlane) +#define IsBitPln_(img) (CmpOrg_(img)==XieK_BitByPlane) +#define CmpMap_(img) ((img)->CmpMap) +#define IsBitonal_(img) (CmpMap_(img)==XieK_Bitonal) +#define IsGrayScale_(img) (CmpMap_(img)==XieK_GrayScale) +#define IsRGB_(img) (CmpMap_(img)==XieK_RGB) +#define CmpCnt_(img) ((img)->CmpCnt) +#define PxlPol_(img) ((img)->PxlPol) +#define PxlProg_(img) ((img)->PxlProg) +#define ScnProg_(img) ((img)->ScnProg) +#define CmpPending_(img,c) ((img)->Pending[(c)]) +#define Width_(img) ((img)->Width) +#define Height_(img) ((img)->Height) +#define PxlRatio_(img) ((img)->PxlRatio) +#define Eport_(img) ((img)->Eport) +#define Tport_(img) ((img)->Tport) +#define FloLnk_(img) ((img)->FloLnk) +#define Sink_(img) ((img)->Sink) +#define Udp_(img,comp) (SnkUdpPtr_(Sink_(img),comp)) +#define uPxlLen_(img,comp) (SnkPxlLen_(Sink_(img),comp)) +#define uDType_(img,comp) (SnkDatTyp_(Sink_(img),comp)) +#define uClass_(img,comp) (SnkDatCls_(Sink_(img),comp)) +#define uBase_(img,comp) (SnkBase_(Sink_(img),comp)) +#define uArSize_(img,comp) (SnkArSize_(Sink_(img),comp)) +#define uPxlStr_(img,comp) (SnkPxlStr_(Sink_(img),comp)) +#define uScnStr_(img,comp) (SnkScnStr_(Sink_(img),comp)) +#define uX1_(img,comp) (SnkX1_(Sink_(img),comp)) +#define uX2_(img,comp) (SnkX2_(Sink_(img),comp)) +#define uY1_(img,comp) (SnkY1_(Sink_(img),comp)) +#define uY2_(img,comp) (SnkY2_(Sink_(img),comp)) +#define uWidth_(img,comp) (SnkWidth_(Sink_(img),comp)) +#define uHeight_(img,comp) (SnkHeight_(Sink_(img),comp)) +#define uPos_(img,comp) (SnkPos_(Sink_(img),comp)) +#define uCmpIdx_(img,comp) (SnkCmpIdx_(Sink_(img),comp)) +#define uLvl_(img,comp) (SnkLvl_(Sink_(img),comp)) +#define RunningFlo_(img) (FloLnk_(img)&&Run_(FloLnk_(img))) + + /* + ** Cpp structure. + */ +typedef struct { + CommonPartRec Res; /* type: XieK_IdcCpp */ + PhotomapPtr photomap; /* Cpp Photomap pointer */ + UdpPtr udp; /* Cpp coordinates and data plane */ +} CppRec, *CppPtr; + /* + ** Convenience macros for accessing CppPtr fields. + */ +#define CppX_(cpp) ((cpp)->udp->UdpL_X1) +#define CppY_(cpp) ((cpp)->udp->UdpL_Y1) +#define CppMap_(cpp) ((cpp)->photomap) +#define CppUdp_(cpp) ((cpp)->udp) + + /* + ** Roi structure. + */ +typedef struct { + CommonPartRec Res; /* type: XieK_IdcRoi */ + UdpPtr udp; /* Roi coordinates in UDP format */ +} RoiRec, *RoiPtr; + /* + ** Convenience macros for accessing RoiPtr fields. + */ +#define RoiX_(roi) ((roi)->udp->UdpL_X1) +#define RoiY_(roi) ((roi)->udp->UdpL_Y1) +#define RoiW_(roi) ((roi)->udp->UdpL_PxlPerScn) +#define RoiH_(roi) ((roi)->udp->UdpL_ScnCnt) +#define RoiUdp_(roi) ((roi)->udp) + + /* + ** Tmp structure. + */ +typedef struct { + CommonPartRec Res; /* type: XieK_IdcTmp */ + INT32 center_x; /* Template center X coordinate */ + INT32 center_y; /* Template center Y coordinate */ + TmpDatPtr dat; /* Template data in DDX format */ + CARD32 data_count; /* number of TmpEntryRec's in data */ +/* TmpEntryRec data list of TmpEntryRec's */ +} TmpRec, *TmpPtr; + /* + ** Tmp resource data entry structure. + */ +typedef struct { + INT32 x; /* template entry X coordinate */ + INT32 y; /* template entry Y coordinate */ + double value; /* template entry value */ +} TmpEntryRec, *TmpEntryPtr; + /* + ** Convenience macros for accessing TmpPtr fields. + */ +#define TmpX_(tmp) ((tmp)->center_x) +#define TmpY_(tmp) ((tmp)->center_y) +#define TmpCnt_(tmp) ((tmp)->data_count) +#define TmpEnt_(tmp) ((TmpEntryPtr)&((tmp)[1])) +#define TmpDat_(tmp) ((tmp)->dat) + diff --git a/xie/docs/dec/xie23-src/server/xie/XieSession.c b/xie/docs/dec/xie23-src/server/xie/XieSession.c new file mode 100644 index 0000000..c2f63e0 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/XieSession.c @@ -0,0 +1,326 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Image Extension DIX +** +** ABSTRACT: +** +** This Xie module consists of DIX procedures for Session service requests. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Richard J. Piccolo +** Robert NC Shelley +** +** CREATION DATE: +** +** May 3, 1989 +** +************************************************************************/ + +/* +** Include files +*/ +#include +/* +** Core X Includes +*/ +#include +#include +#include +#include +#include +/* +** XIE Includes +*/ +#include +#include +#include +#include +#include + +/* +** Table of contents +*/ + /* + ** Xie protocol proceedures called from XieMain + */ +int ProcInitSession(); +int ProcTermSession(); + +int ProcSetOpDefaults(); +int ProcQueryOpDefaults(); + + /* + ** routines referenced by other modules. + */ +void GetConstraintModel(); + +/* +** Equated Symbols +*/ +/* +** MACRO definitions +*/ +/* +** External References +** +*/ +extern CARD32 xieClients; /* num of clients served */ +extern CARD32 xieEventBase; /* Base for Xie events */ +extern CARD32 xieReqCode; /* XIE main opcode */ +#if defined(X11R3) && !defined(DWV3) +extern CARD16 RC_xie; /* XIE Class */ +extern CARD16 RT_photo; /* Photo{flo|map|tap} resource */ +extern CARD16 RT_idc; /* Cpp, Roi & Tmp resource types*/ +#else /* X11R4 || DWV3 */ +extern RESTYPE RC_xie; /* XIE Class */ +extern RESTYPE RT_photo; /* Photo{flo|map|tap} resource */ +extern RESTYPE RT_idc; /* Cpp, Roi & Tmp resource types*/ +#endif + +externalref int (*xieDixSwap[X_ieLastRequest])(); /* Reply swap dispatch + * table */ +externalref int (*xieDixSwapReply[])(); +externalref void (*xieDixSwapData[])(); + +/* +** Global Storage +*/ +externaldef(xieClientTable) ClientTableRec xieClientTable[MAXCLIENTS]; + +/* +** Local Storage +*/ + +/*----------------------------------------------------------------------- +------------------------- InitSession Procedure ------------------------ +------------------------------------------------------------------------*/ +int ProcInitSession( client ) + ClientPtr client; /* client pointer */ +{ + CARD8 function[sizeof(XieFunctionsRec)]; + CARD32 i; + xieInitSessionReply reply; + REQUEST( xieInitSessionReq ); + REQUEST_SIZE_MATCH( xieInitSessionReq ); + + memset(function, 0, sizeof(XieFunctionsRec)); + /* + ** Functions supported by this implementation. + */ + PUT_VALUE_( function, X_ieInitSession, TRUE, 1 ); + PUT_VALUE_( function, X_ieTermSession, TRUE, 1 ); + PUT_VALUE_( function, X_ieQueryEvents, TRUE, 1 ); + PUT_VALUE_( function, X_ieSelectEvents, TRUE, 1 ); + PUT_VALUE_( function, X_ieSetOpDefaults, TRUE, 1 ); + PUT_VALUE_( function, X_ieQueryOpDefaults, TRUE, 1 ); + PUT_VALUE_( function, X_ieCreateByReference, TRUE, 1 ); + PUT_VALUE_( function, X_ieCreateByValue, TRUE, 1 ); + PUT_VALUE_( function, X_ieDeleteResource, TRUE, 1 ); + PUT_VALUE_( function, X_ieQueryResource, TRUE, 1 ); + PUT_VALUE_( function, X_ieBindPhotomap, TRUE, 1 ); + PUT_VALUE_( function, X_ieAbortPhotoflo, TRUE, 1 ); + PUT_VALUE_( function, X_ieExecutePhotoflo, TRUE, 1 ); + PUT_VALUE_( function, X_ieTapPhotoflo, TRUE, 1 ); + PUT_VALUE_( function, X_ieAbortTransport, TRUE, 1 ); + PUT_VALUE_( function, X_ieGetStream, TRUE, 1 ); + PUT_VALUE_( function, X_ieGetTile, TRUE, 1 ); + PUT_VALUE_( function, X_iePutStream, TRUE, 1 ); + PUT_VALUE_( function, X_iePutTile, TRUE, 1 ); + PUT_VALUE_( function, X_ieSetTransport, TRUE, 1 ); + PUT_VALUE_( function, X_ieExport, TRUE, 1 ); + PUT_VALUE_( function, X_ieFreeExport, TRUE, 1 ); + PUT_VALUE_( function, X_ieImport, TRUE, 1 ); + PUT_VALUE_( function, X_ieQueryExport, TRUE, 1 ); + PUT_VALUE_( function, X_ieArea, TRUE, 1 ); + PUT_VALUE_( function, X_ieAreaStats, TRUE, 1 ); + PUT_VALUE_( function, X_ieArith, TRUE, 1 ); + PUT_VALUE_( function, X_ieCalcHist, TRUE, 1 ); + PUT_VALUE_( function, X_ieChromeCom, TRUE, 1 ); + PUT_VALUE_( function, X_ieChromeSep, TRUE, 1 ); + PUT_VALUE_( function, X_ieCompare, TRUE, 1 ); + PUT_VALUE_( function, X_ieConstrain, TRUE, 1 ); + PUT_VALUE_( function, X_ieCrop, TRUE, 1 ); + PUT_VALUE_( function, X_ieDither, TRUE, 1 ); + PUT_VALUE_( function, X_ieFill, TRUE, 1 ); + PUT_VALUE_( function, X_ieLogical, TRUE, 1 ); + PUT_VALUE_( function, X_ieLuminance, TRUE, 1 ); + PUT_VALUE_( function, X_ieMatchHistogram, TRUE, 1 ); + PUT_VALUE_( function, X_ieMath, TRUE, 1 ); + PUT_VALUE_( function, X_ieMirror, TRUE, 1 ); + PUT_VALUE_( function, X_iePoint, TRUE, 1 ); + PUT_VALUE_( function, X_iePointStats, TRUE, 1 ); + PUT_VALUE_( function, X_ieRotate, TRUE, 1 ); + PUT_VALUE_( function, X_ieScale, TRUE, 1 ); + PUT_VALUE_( function, X_ieTranslate, TRUE, 1 ); + + reply.type = X_Reply; + reply.success = stuff->major_version == XieK_MajorVersion && + stuff->minor_version == XieK_MinorVersion; + reply.sequenceNumber = client->sequence; + reply.length = sizeof(XieFunctionsRec) >> 2; + reply.major_version = XieK_MajorVersion; + reply.minor_version = XieK_MinorVersion; + + if( reply.success ) + { /* + ** Define client dependent defaults for xieSession. + */ + xieClientTable[client->index].event_mask = 0; + xieClientTable[client->index].model = XieK_HardClip; + for( i = 0; i < XieK_MaxComponents; i++ ) + xieClientTable[client->index].levels[i] = 256; + /* + ** One more happy client served. + */ + xieClients++; + } + /* + ** Tell the client how happy it is. + */ + WriteXieReplyToClient( client, sizeof(xieInitSessionReply), &reply ); + SetSwappedDataRtn( client, CARD8 ); + WriteSwappedXieDataToClient( client, sizeof(XieFunctionsRec), function ); + + return( Success ); +} /* end ProcInitSession */ + +/*----------------------------------------------------------------------- +------------------------- TermSession Procedure ------------------------ +------------------------------------------------------------------------*/ +int ProcTermSession( client ) + ClientPtr client; /* client pointer */ +{ + REQUEST( xieTermSessionReq ); + REQUEST_SIZE_MATCH( xieTermSessionReq ); + + /* + ** One less happy client served. + */ + xieClients--; + + return( Success ); +} /* end ProcTermSession */ + +/*----------------------------------------------------------------------- +-------------------Set Operational Defaults Procedure ------------------ +------------------------------------------------------------------------*/ +int ProcSetOpDefaults( client ) + ClientPtr client; /* client pointer */ +{ + CARD32 i; + REQUEST( xieSetOpDefaultsReq ); + REQUEST_SIZE_MATCH( xieSetOpDefaultsReq ); + + ValueOkIf_( stuff->model == XieK_HardClip + || stuff->model == XieK_ClipScale + || stuff->model == XieK_HardScale, 0 ); + xieClientTable[client->index].model = stuff->model; + + for( i = 0; i < XieK_MaxComponents; i++ ) + { + ValueOkIf_(stuff->levels[i] > 0, 0); + xieClientTable[client->index].levels[i] = stuff->levels[i]; + } + + return( Success ); +} /* end ProcSetOpDefaults */ + +/*----------------------------------------------------------------------- +-----------------Query Operational Defaults Procedure ------------------- +------------------------------------------------------------------------*/ +int ProcQueryOpDefaults( client ) + ClientPtr client; /* client pointer */ +{ + xieQueryOpDefaultsReply rep; + CARD32 model; + + REQUEST( xieQueryOpDefaultsReq ); + REQUEST_SIZE_MATCH( xieQueryOpDefaultsReq ); + + rep.type = X_Reply; + rep._reserved = 0; + rep.sequenceNumber = client->sequence; + rep.length = 0; + GetConstraintModel(client, &model, &rep.levels[0]); + rep.model = model; + + WriteXieReplyToClient( client, sizeof(xieQueryOpDefaultsReply), &rep ); + + return( Success ); +} /* end ProcQueryOpDefaults */ + +/*----------------------------------------------------------------------- +------------------------- routine: GetConstraintModel ----------------- +------------------------------------------------------------------------*/ +void GetConstraintModel( client, model, levels ) + ClientPtr client; /* client pointer */ + CARD32 *model; /* model return pointer */ + CARD32 *levels; /* levels return array */ +{ + CARD32 i; + + *model = xieClientTable[client->index].model; + + for( i = 0; i < XieK_MaxComponents; i++ ) + levels[i] = xieClientTable[client->index].levels[i]; + +} /* end GetConstraintModel */ +/* end module XieSession.c */ diff --git a/xie/docs/dec/xie23-src/server/xie/XieSwapRep.c b/xie/docs/dec/xie23-src/server/xie/XieSwapRep.c new file mode 100644 index 0000000..e4cdf29 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/XieSwapRep.c @@ -0,0 +1,429 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** X Image Extension DIX +** +** ABSTRACT: +** +** This Xie module consists of wrapper routines for all Xie protocol +** requests. These routines perform the byte swapping necessary +** when the client and server are of different endian-ness. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Fri Dec 7 11:45:27 1990 +** +*******************************************************************************/ + +/* +** Include files +*/ +#include + +/* +** Core X Includes +*/ +#include +#include +#include +#include +#include +/* +** XIE Includes +*/ +#include +#include +#include +#include +#include + +/* +** Table of contents +*/ +/* Utility Routines */ +void Swap16Write(); +#if defined(VMS) && !defined(VXT) +void Swap32Write(); +#endif +void SwapFloatWrite(); +void SwapTmpWrite(); + + +/* Routines for swapping the Xie replies */ +int WriteEventToClient(); +int SReplySimple(); +int SReplyInitSession(); +int SReplyQueryEvents(); +int SReplyQueryOpDefaults(); +int SReplyQueryResource(); +int SReplyGetStream(); +int SReplyQueryExport(); + +/* +** Equated Symbols +*/ + +/* +** MACRO definitions +*/ + +/* +** External references +*/ +void WriteToClient(); + +externalref int (*xieDixSwapReply[])(); + + + +/*----------------------------------------------------------------------- +------------- Reply swapping utility routines, as lifted from --------- +--------------------- the X11R4 MIT sample server ----------------------- +------------------------------------------------------------------------*/ +/* Thanks to Jack Palevich for testing and subsequently rewriting all this */ + +#if defined(VMS) & !defined(VXT) +/* Write a block of swapped longs */ +void +Swap32Write(pClient, size, pbuf) + ClientPtr pClient; + int size; /* in bytes */ + register long *pbuf; +{ + int n, i; + + size >>= 2; + for(i = 0; i < size; i++) + /* brackets are mandatory here, because "swapl" macro expands + to several statements */ + { + swapl(&pbuf[i], n); + } + (void)WriteToClient(pClient, size << 2, (char *) pbuf); +} +#endif /* VMS && !VXT */ + +/* Write a block of swapped shorts */ +void +Swap16Write(pClient, size, pbuf) + ClientPtr pClient; + int size; /* in bytes */ + register short *pbuf; +{ + int n, i; + + size >>= 1; + for(i = 0; i < size; i++) + /* brackets are mandatory here, because "swaps" macro expands + to several statements */ + { + swaps(&pbuf[i], n); + } + (void)WriteToClient(pClient, size << 1, (char *) pbuf); +} + +/* Write a block of swapped XieFloat records */ +void +SwapFloatWrite(pClient, size, pbuf) + ClientPtr pClient; + int size; /* in bytes */ + register XieFloatRec *pbuf; +{ + register int n; + int i; + int entries; + + entries = size / (sizeof(XieFloatRec)); + + for(i = 0; i < entries; i++) + /* brackets are mandatory here, because "swapfloat" macro expands + to several statements */ + { + swapfloat(&pbuf[i], n); + } + (void)WriteToClient(pClient, size, (char *) pbuf); +} + +/* Write a block of swapped Xie Template IDC records */ +void +SwapTmpWrite(pClient, size, pbuf) + ClientPtr pClient; + int size; /* in bytes */ + XieTmpEntryRec *pbuf; +{ + register int n; + int i; + int entries; + register XieTmpEntryRec *p; + + entries = size / (sizeof(XieTmpEntryRec)); + p = pbuf; + + while (entries > 0) + { + swapl(&p->x, n); + swapl(&p->y, n); + swapfloat(&p->value, n); + entries--; p++; + } + (void)WriteToClient(pClient, size, (char *) pbuf); +} + +/*----------------------------------------------------------------------- +---------------------- Write Event Reply to Client ---------------------- +------------------------------------------------------------------------*/ +int WriteEventToClient(pClient, size, pEvent) + ClientPtr pClient; + int size; + xieSendEvent *pEvent; +{ + register char n; + + if (pClient->swapped) { + swaps(&pEvent->sequenceNumber, n); + swapl(&pEvent->resource_id, n); + } + WriteToClient(pClient, size, (char *)pEvent); + +} + +/*----------------------------------------------------------------------- +--------------------- Routine for all simple replies -------------------- +------------------------------------------------------------------------*/ +int SReplySimple(pClient, size, pRep) + ClientPtr pClient; + int size; + xieCalcHistReply *pRep; +{ + register char n; + + swaps(&pRep->sequenceNumber, n); + swapl(&pRep->length, n); + WriteToClient(pClient, size, (char *)pRep); + +} + +/*----------------------------------------------------------------------- +------------------------ Init Session Reply ----------------------------- +------------------------------------------------------------------------*/ +int SReplyInitSession(pClient, size, pRep) + ClientPtr pClient; + int size; + xieInitSessionReply *pRep; +{ + register char n; + + swaps(&pRep->sequenceNumber, n); + swapl(&pRep->length, n); + swaps(&pRep->major_version, n); + swaps(&pRep->minor_version, n); + swapl(&pRep->service_class, n); + WriteToClient(pClient, size, (char *)pRep); + +} + +/*----------------------------------------------------------------------- +------------------------ Query Events Reply ----------------------------- +------------------------------------------------------------------------*/ +int SReplyQueryEvents(pClient, size, pRep) + ClientPtr pClient; + int size; + xieQueryEventsReply *pRep; +{ + register char n; + + swaps(&pRep->sequenceNumber, n); + swapl(&pRep->length, n); + swapl(&pRep->event_mask, n); + WriteToClient(pClient, size, (char *)pRep); + +} + +/*----------------------------------------------------------------------- +------------------ Query Operational Defaults Reply --------------------- +------------------------------------------------------------------------*/ +int SReplyQueryOpDefaults(pClient, size, pRep) + ClientPtr pClient; + int size; + xieQueryOpDefaultsReply *pRep; +{ + register char n; + + swaps(&pRep->sequenceNumber, n); + swapl(&pRep->length, n); + SwapLongs(pRep->levels, XieK_MaxComponents); + WriteToClient(pClient, size, (char *)pRep); + +} + +/*----------------------------------------------------------------------- +------------------------- Query Resource Reply -------------------------- +------------------------------------------------------------------------*/ +int SReplyQueryResource(client, size, pRep) + ClientPtr client; + int size; + xieQueryPhotofloReply *pRep; +{ + register char n; + + REQUEST(xieCreateByValueReq); + + swaps(&pRep->sequenceNumber, n); + swapl(&pRep->length, n); + + /* The remainder of the reply is different depending on the resource. + * Get the resource type from the original request. */ + switch( stuff->resource_type ) { + case XieK_IdcCpp : + { + register xieQueryCppReply *rep = (xieQueryCppReply *)pRep; + + swapl(&rep->x, n); + swapl(&rep->y, n); + swapl(&rep->photomap_id, n); + } + break; + + case XieK_Photoflo : + { + register xieQueryPhotofloReply *rep = (xieQueryPhotofloReply *)pRep; + + swapl(&rep->status, n); + } + break; + + case XieK_Photomap : + { + register xieQueryPhotomapReply *rep = (xieQueryPhotomapReply *)pRep; + + swapl(&rep->width, n); + swapl(&rep->height, n); + swapfloat(&rep->aspect_ratio, n); + SwapLongs(rep->levels, XieK_MaxComponents); + swapl(&rep->photo_id, n); + } + break; + + case XieK_IdcRoi : + { + register xieQueryRoiReply *rep = (xieQueryRoiReply *)pRep; + + swapl(&rep->x, n); + swapl(&rep->y, n); + swapl(&rep->width, n); + swapl(&rep->height, n); + } + break; + + case XieK_IdcTmp : + { + register xieQueryTmpReply *rep = (xieQueryTmpReply *)pRep; + + swapl(&rep->center_x, n); + swapl(&rep->center_y, n); + swapl(&rep->data_count, n); + } + break; + } + + WriteToClient(client, size, (char *)pRep); + +} + +/*----------------------------------------------------------------------- +---------------------------- Get Stream Reply --------------------------- +------------------------------------------------------------------------*/ +int SReplyGetStream(pClient, size, pRep) + ClientPtr pClient; + int size; + xieGetStreamReply *pRep; +{ + register char n; + + swaps(&pRep->sequenceNumber, n); + swapl(&pRep->length, n); + swapl(&pRep->byte_count, n); + WriteToClient(pClient, size, (char *)pRep); + +} + +/*----------------------------------------------------------------------- +---------------------------- Query Export Reply ------------------------- +------------------------------------------------------------------------*/ +int SReplyQueryExport(pClient, size, pRep) + ClientPtr pClient; + int size; + xieQueryExportReply *pRep; +{ + register char n; + + swaps(&pRep->sequenceNumber, n); + swapl(&pRep->length, n); + swapl(&pRep->pixel_count, n); + swapl(&pRep->lut_id, n); + WriteToClient(pClient, size, (char *)pRep); + +} + +/* End of MODULE XIESWAPREP.C */ + diff --git a/xie/docs/dec/xie23-src/server/xie/XieSwapReq.c b/xie/docs/dec/xie23-src/server/xie/XieSwapReq.c new file mode 100644 index 0000000..af4a1f4 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/XieSwapReq.c @@ -0,0 +1,1018 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** X Image Extension DIX +** +** ABSTRACT: +** +** This Xie module consists of wrapper routines for all Xie protocol +** requests. These routines perform the byte swapping necessary +** when the client and server are of different endian-ness. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Fri Dec 7 11:45:27 1990 +** +*******************************************************************************/ + +/* +** Include files +*/ +#include + +/* +** Core X Includes +*/ +#include +#include +#include +#include +#include +/* +** XIE Includes +*/ +#include +#include +#include +#include +#include + +/* +** Table of contents +*/ +/* Utility Routines */ +#if defined(VMS) && !defined(VXT) && !defined(ALPHA) +void SwapLongs(); +void SwapShorts(); +#endif +void SwapTmpEntries(); +int SProcXieSimpleReq(); +int SProcXieResourceReq(); + +/* Routines for swapping the Xie requests */ +int SProcInitSession(); +int SProcQueryEvents(); +int SProcSelectEvents(); +int SProcSetOpDefaults(); +int SProcCreateResource(); +int SProcBindMapToFlo(); +int SProcAbortFlo(); +int SProcExecuteFlo(); +int SProcTapFlo(); +int SProcAbortTransport(); +int SProcGetStream(); +int SProcGetTile(); +int SProcPutStream(); +int SProcPutTile(); +int SProcSetTransport(); +int SProcExport(); +int SProcFreeExport(); +int SProcImport(); +int SProcQueryExport(); +int SProcArea(); +int SProcAreaStats(); +int SProcArith(); +int SProcCalcHistogram(); +int SProcChromeCom(); +int SProcChromeSep(); +int SProcCompare(); +int SProcConstrain(); +int SProcCrop(); +int SProcDither(); +int SProcFill(); +int SProcLogical(); +int SProcLuminance(); +int SProcMatchHistogram(); +int SProcMath(); +int SProcMirror(); +int SProcPoint(); +int SProcPointStats(); +int SProcRotate(); +int SProcScale(); +int SProcTranslate(); + + +/* +** Equated Symbols +*/ + +/* +** MACRO definitions +*/ + +/* +** External references +*/ +externalref int (*xieDixProc[X_ieLastRequest])(); + + + +/*----------------------------------------------------------------------- +------------- Request swapping utility routines, as lifted from --------- +--------------------- the X11R4 MIT sample server ----------------------- +------------------------------------------------------------------------*/ +/* Thanks to Jack Palevich for testing and subsequently rewriting all this */ + +#if defined(VMS) && !defined(VXT) && !defined(ALPHA) +/* Byte swap a list of longs */ + +void +SwapLongs (list, count) + register long *list; + register unsigned long count; +{ + register int n; + + while (count >= 8) { + swapl(list+0, n); + swapl(list+1, n); + swapl(list+2, n); + swapl(list+3, n); + swapl(list+4, n); + swapl(list+5, n); + swapl(list+6, n); + swapl(list+7, n); + list += 8; + count -= 8; + } + if (count != 0) { + do { + swapl(list, n); + list++; + } while (--count != 0); + } +} + + +/* Byte swap a list of shorts */ + +void +SwapShorts (list, count) + register short *list; + register unsigned long count; +{ + register int n; + + while (count >= 16) { + swaps(list+0, n); + swaps(list+1, n); + swaps(list+2, n); + swaps(list+3, n); + swaps(list+4, n); + swaps(list+5, n); + swaps(list+6, n); + swaps(list+7, n); + swaps(list+8, n); + swaps(list+9, n); + swaps(list+10, n); + swaps(list+11, n); + swaps(list+12, n); + swaps(list+13, n); + swaps(list+14, n); + swaps(list+15, n); + list += 16; + count -= 16; + } + if (count != 0) { + do { + swaps(list, n); + list++; + } while (--count != 0); + } +} +#endif /* VMS & !VXT */ + +/* Byte swap a list of template IDC entries */ + +void +SwapTmpEntries(list, count) + register XieTmpEntryRec *list; + register unsigned long count; +{ + register int n; + int i; + + while (count > 0) { + swapl(&(list->x), n); + swapl(&(list->y), n); + swapfloat(&(list->value), n); + list++; count--; + } +} + +/* The following is used for all requests that have + no fields to be swapped (except "length") */ +int +SProcXieSimpleReq(client) + register ClientPtr client; +{ + register char n; + + REQUEST(xieReq); + swaps(&stuff->length, n); + return( CallProc_(xieDixProc)(client) ); +} + +/* The following is used for all requests that have + only a resource type / resource id pair to be swapped, coming + right after the "length" field */ +int +SProcXieResourceReq(client) + register ClientPtr client; +{ + register char n; + + REQUEST(xieCreateByValueReq); + swaps(&stuff->length, n); + swapl(&stuff->resource_type, n); + swapl(&stuff->resource_id, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +------------------------ Init Session Request --------------------------- +------------------------------------------------------------------------*/ +int SProcInitSession( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieInitSessionReq); + + swaps(&stuff->length, n); + swaps(&stuff->major_version, n); + swaps(&stuff->minor_version, n); + return( CallProc_(xieDixProc)(client) ); + +} + +/*----------------------------------------------------------------------- +------------------------Query Events Procedure -------------------------- +------------------------------------------------------------------------*/ +int SProcQueryEvents( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieQueryEventsReq); + + swaps(&stuff->length, n); + swapl(&stuff->event_param, n); + return( CallProc_(xieDixProc)(client) ); + +} + +/*----------------------------------------------------------------------- +------------------------Select Events Procedure ------------------------- +------------------------------------------------------------------------*/ +int SProcSelectEvents( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieSelectEventsReq); + + swaps(&stuff->length, n); + swapl(&stuff->event_mask, n); + return( CallProc_(xieDixProc)(client) ); + +} + +/*----------------------------------------------------------------------- +------------------------Set Operational Defaults------------------------- +------------------------------------------------------------------------*/ +int SProcSetOpDefaults( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieSetOpDefaultsReq); + + swaps(&stuff->length, n); + SwapLongs(&stuff->levels[0], XieK_MaxComponents); + return( CallProc_(xieDixProc)(client) ); + +} + +/*----------------------------------------------------------------------- +------------------ Create Resource by Reference ------------------------- +------------------------------------------------------------------------*/ +int +SProcCreateResourceByRef(client) + register ClientPtr client; +{ + register char n; + + REQUEST(xieCreateByReferenceReq); + + swaps(&stuff->length, n); + swapl(&stuff->resource_type, n); + swapl(&stuff->resource_id, n); + swapl(&stuff->photomap_id, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +------------------ Create Resource by Value ----------------------------- +------------------------------------------------------------------------*/ +int SProcCreateResourceByValue( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieCreateByValueReq); + + swaps(&stuff->length, n); + swapl(&stuff->resource_type, n); + swapl(&stuff->resource_id, n); + + switch( stuff->resource_type ) { + + case XieK_IdcCpp : + { + REQUEST(xieCreateCppReq); + swapl(&stuff->photomap_id, n); + swapl(&stuff->x, n); + swapl(&stuff->y, n); + } + break; + + case XieK_Photoflo : + case XieK_Photomap : + { + REQUEST(xieCreatePhotoReq); + swapl(&stuff->width, n); + swapl(&stuff->height, n); + swapfloat(&stuff->aspect_ratio, n); + SwapLongs(stuff->levels, XieK_MaxComponents); + } + break; + + case XieK_IdcRoi : + { + REQUEST(xieCreateRoiReq); + swapl(&stuff->x, n); + swapl(&stuff->y, n); + swapl(&stuff->width, n); + swapl(&stuff->height, n); + } + break; + + case XieK_IdcTmp : + { + REQUEST(xieCreateTmpReq); + swapl(&stuff->center_x, n); + swapl(&stuff->center_y, n); + swapl(&stuff->data_count, n); + SwapTmpEntries(&((&stuff->data_count)[1]), stuff->data_count); + } + break; + } + return( CallProc_(xieDixProc)(client) ); + +} + +/*----------------------------------------------------------------------- +--------------------Bind Map to Flo Request ----------------------------- +------------------------------------------------------------------------*/ +int SProcBindMapToFlo( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieBindPhotomapReq); + + swaps(&stuff->length, n); + swapl(&stuff->photoflo_id, n); + swapl(&stuff->photomap_id, n); + return( CallProc_(xieDixProc)(client) ); + +} + +/*----------------------------------------------------------------------- +------------------------- Abort Photoflo Request ------------------------ +------------------------------------------------------------------------*/ +int SProcAbortFlo( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieAbortPhotofloReq); + + swaps(&stuff->length, n); + swapl(&stuff->photoflo_id, n); + return( CallProc_(xieDixProc)(client) ); + +} + +/*----------------------------------------------------------------------- +------------------------- Execute Photoflo Request ---------------------- +------------------------------------------------------------------------*/ +int SProcExecuteFlo( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieExecutePhotofloReq); + + swaps(&stuff->length, n); + swapl(&stuff->photoflo_id, n); + return( CallProc_(xieDixProc)(client) ); + +} + +/*----------------------------------------------------------------------- +---------------------------- Tap Photoflo Request ----------------------- +------------------------------------------------------------------------*/ +int SProcTapFlo( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieTapPhotofloReq); + + swaps(&stuff->length, n); + swapl(&stuff->photoflo_id, n); + swapl(&stuff->photo_id, n); + return( CallProc_(xieDixProc)(client) ); + +} + +/*----------------------------------------------------------------------- +-------------------------- Abort Transport Request ---------------------- +------------------------------------------------------------------------*/ +int SProcAbortTransport( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieAbortTransportReq); + + swaps(&stuff->length, n); + swapl(&stuff->photo_id, n); + swapl(&stuff->plane_mask, n); + return( CallProc_(xieDixProc)(client) ); + +} + +/*----------------------------------------------------------------------- +---------------------------- Get Stream Request ------------------------- +------------------------------------------------------------------------*/ +int SProcGetStream( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieGetStreamReq); + + swaps(&stuff->length, n); + swapl(&stuff->photo_id, n); + swapl(&stuff->max_bytes, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +----------------------------- Get Tile Request -------------------------- +------------------------------------------------------------------------*/ +int SProcGetTile( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieGetTileReq); + + swaps(&stuff->length, n); + swapl(&stuff->photomap_id, n); + swapl(&stuff->x, n); + swapl(&stuff->y, n); + swapl(&stuff->width, n); + swapl(&stuff->height, n); + swapl(&stuff->plane_mask, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +---------------------------- Put Stream Request ------------------------- +------------------------------------------------------------------------*/ +int SProcPutStream( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xiePutStreamReq); + + swaps(&stuff->length, n); + swapl(&stuff->photo_id, n); + swapl(&stuff->byte_count, n); + /* No swapping of the image data */ + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +----------------------------- Put Tile Request -------------------------- +------------------------------------------------------------------------*/ +int SProcPutTile( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xiePutTileReq); + + swaps(&stuff->length, n); + swapl(&stuff->photomap_id, n); + swapl(&stuff->x, n); + swapl(&stuff->y, n); + swapl(&stuff->width, n); + swapl(&stuff->height, n); + swapl(&stuff->plane_mask, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +-------------------------Set Transport Request -------------------------- +------------------------------------------------------------------------*/ +int SProcSetTransport( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieSetTransportReq); + + swaps(&stuff->length, n); + swapl(&stuff->photo_id, n); + swapl(&stuff->compression_parameter, n); + swapl(&stuff->plane_mask, n); + SwapLongs(stuff->scanline_stride, XieK_MaxPlanes); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +------------------------- Export Image Request -------------------------- +------------------------------------------------------------------------*/ +int SProcExport( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieExportReq); + + swaps(&stuff->length, n); + swapl(&stuff->photo_id, n); + swapl(&stuff->drawable_id, n); + swapl(&stuff->gc_id, n); + swapl(&stuff->src_x, n); + swapl(&stuff->src_y, n); + swapl(&stuff->width, n); + swapl(&stuff->height, n); + swapl(&stuff->dst_x, n); + swapl(&stuff->dst_y, n); + swapl(&stuff->photo_lut_id, n); + swapl(&stuff->colormap_id, n); + swapfloat(&stuff->match_limit, n); + swapfloat(&stuff->gray_limit, n); + + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +-------------------------- Free Export Request -------------------------- +------------------------------------------------------------------------*/ +int SProcFreeExport( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieFreeExportReq); + + swaps(&stuff->length, n); + swapl(&stuff->photo_id, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +------------------------- Import Image Request -------------------------- +------------------------------------------------------------------------*/ +int SProcImport( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieImportReq); + + swaps(&stuff->length, n); + swapl(&stuff->photomap_id, n); + swapl(&stuff->drawable_id, n); + swapl(&stuff->colormap_id, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +--------------------- Query Export Context Request ---------------------- +------------------------------------------------------------------------*/ +int SProcQueryExport( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieQueryExportReq); + + swaps(&stuff->length, n); + swapl(&stuff->photo_id, n); + swapl(&stuff->lut_id, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +--------------------------------- Area Request -------------------------- +------------------------------------------------------------------------*/ +int SProcArea( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieAreaReq); + + swaps(&stuff->length, n); + swapl(&stuff->src_photo_id, n); + swapl(&stuff->dst_photo_id, n); + swapl(&stuff->ipcc_id, n); + swapl(&stuff->ipct_id, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +------------------------------ Area Stats Request ----------------------- +------------------------------------------------------------------------*/ +int SProcAreaStats( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieAreaStatsReq); + + swaps(&stuff->length, n); + swapl(&stuff->src_photo_id, n); + swapl(&stuff->dst_photo_id, n); + swapl(&stuff->idc_id, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +--------------------------------- Arith Request ------------------------- +------------------------------------------------------------------------*/ +int SProcArith( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieArithReq); + + swaps(&stuff->length, n); + swapl(&stuff->src1_photo_id, n); + swapl(&stuff->src2_photo_id, n); + SwapLongs(stuff->constants, XieK_MaxComponents); + swapl(&stuff->dst_photo_id, n); + swapl(&stuff->idc_id, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +-------------------------Calculate Histogram Request -------------------- +------------------------------------------------------------------------*/ +int SProcCalcHistogram( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieCalcHistReq); + + swaps(&stuff->length, n); + swapl(&stuff->photo_id, n); + swapl(&stuff->idc_id, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +------------------------Chrominance Combine Request --------------------- +------------------------------------------------------------------------*/ +int SProcChromeCom( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieChromeComReq); + + swaps(&stuff->length, n); + swapl(&stuff->photo_id1, n); + swapl(&stuff->photo_id2, n); + swapl(&stuff->photo_id3, n); + swapl(&stuff->dst_photo_id, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +------------------------ Chrominance Separate Request ------------------- +------------------------------------------------------------------------*/ +int SProcChromeSep( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieChromeSepReq); + + swaps(&stuff->length, n); + swapl(&stuff->src_photo, n); + swapl(&stuff->dst_photo, n); + swapl(&stuff->component, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +------------------------------- Compare Request ------------------------- +------------------------------------------------------------------------*/ +int SProcCompare( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieCompareReq); + + swaps(&stuff->length, n); + swapl(&stuff->src1_photo_id, n); + swapl(&stuff->src2_photo_id, n); + SwapLongs(stuff->constants, XieK_MaxComponents); + swapl(&stuff->dst_photo_id, n); + swapl(&stuff->idc_id, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +------------------------------ Constrain Request ------------------------ +------------------------------------------------------------------------*/ +int SProcConstrain( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieConstrainReq); + + swaps(&stuff->length, n); + swapl(&stuff->src_photo_id, n); + swapl(&stuff->dst_photo_id, n); + SwapLongs(stuff->levels, XieK_MaxComponents); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +-------------------------------- Crop Request --------------------------- +------------------------------------------------------------------------*/ +int SProcCrop( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieCropReq); + + swaps(&stuff->length, n); + swapl(&stuff->src_photo_id, n); + swapl(&stuff->dst_photo_id, n); + swapl(&stuff->idc_id, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +------------------------------ Dither Request --------------------------- +------------------------------------------------------------------------*/ +int SProcDither( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieDitherReq); + + swaps(&stuff->length, n); + swapl(&stuff->src_photo_id, n); + swapl(&stuff->dst_photo_id, n); + SwapLongs(stuff->levels, XieK_MaxComponents); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +-------------------------------- Fill Request --------------------------- +------------------------------------------------------------------------*/ +int SProcFill( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieFillReq); + + swaps(&stuff->length, n); + swapl(&stuff->src_photo_id, n); + swapl(&stuff->dst_photo_id, n); + swapl(&stuff->dst_idc_id, n); + SwapLongs(stuff->constant, XieK_MaxComponents); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +---------------------------- Logical Request ---------------------------- +------------------------------------------------------------------------*/ +int SProcLogical( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieLogicalReq); + + swaps(&stuff->length, n); + swapl(&stuff->src1_photo_id, n); + swapl(&stuff->src2_photo_id, n); + SwapLongs(stuff->constants, XieK_MaxComponents); + swapl(&stuff->dst_photo_id, n); + swapl(&stuff->idc_id, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +-------------------------- Luminance Request ---------------------------- +------------------------------------------------------------------------*/ +int SProcLuminance( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieLuminanceReq); + + swaps(&stuff->length, n); + swapl(&stuff->src_photo_id, n); + swapl(&stuff->dst_photo_id, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +----------------------------- Math Request ------------------------------ +------------------------------------------------------------------------*/ +int SProcMath( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieMathReq); + + swaps(&stuff->length, n); + swapl(&stuff->src_photo_id, n); + swapl(&stuff->dst_photo_id, n); + swapl(&stuff->idc_id, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +----------------------- Match Histogram Request ------------------------- +------------------------------------------------------------------------*/ +int SProcMatchHistogram( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieMatchHistogramReq); + + swaps(&stuff->length, n); + swapl(&stuff->photo_id1, n); + swapl(&stuff->photo_id2, n); + swapl(&stuff->idc_id, n); + swapfloat(&stuff->param1, n); + swapfloat(&stuff->param2, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +----------------------------- Mirror Request ---------------------------- +------------------------------------------------------------------------*/ +int SProcMirror( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieMirrorReq); + + swaps(&stuff->length, n); + swapl(&stuff->src_photo_id, n); + swapl(&stuff->dst_photo_id, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +------------------------------ Point Request ---------------------------- +------------------------------------------------------------------------*/ +int SProcPoint( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xiePointReq); + + swaps(&stuff->length, n); + swapl(&stuff->src_photo_id, n); + swapl(&stuff->dst_photo_id, n); + swapl(&stuff->idc_id, n); + swapl(&stuff->trans_photo_id, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +--------------------------- Point Statistics Request -------------------- +------------------------------------------------------------------------*/ +int SProcPointStats( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xiePointStatsReq); + + swaps(&stuff->length, n); + swapl(&stuff->photo_id, n); + swapl(&stuff->x, n); + swapl(&stuff->y, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +---------------------------------- Rotate Request ----------------------- +------------------------------------------------------------------------*/ +int SProcRotate( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieRotateReq); + + swaps(&stuff->length, n); + swapl(&stuff->src_photo_id, n); + swapl(&stuff->dst_photo_id, n); + swapfloat(&stuff->angle, n); + swapl(&stuff->width, n); + swapl(&stuff->height, n); + SwapLongs(stuff->fill, XieK_MaxComponents); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +-------------------------------- Scale Request -------------------------- +------------------------------------------------------------------------*/ +int SProcScale( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieScaleReq); + + swaps(&stuff->length, n); + swapl(&stuff->src_photo_id, n); + swapl(&stuff->dst_photo_id, n); + swapl(&stuff->width, n); + swapl(&stuff->height, n); + return( CallProc_(xieDixProc)(client) ); +} + +/*----------------------------------------------------------------------- +------------------------------ Translate Request ------------------------ +------------------------------------------------------------------------*/ +int SProcTranslate( client ) + ClientPtr client; /* client pointer */ +{ + register char n; + REQUEST(xieTranslateReq); + + swaps(&stuff->length, n); + swapl(&stuff->src1_photo_id, n); + swapl(&stuff->src2_photo_id, n); + swapl(&stuff->src_idc_id, n); + swapl(&stuff->dst_photo_id, n); + swapl(&stuff->dst_idc_id, n); + return( CallProc_(xieDixProc)(client) ); +} + +/* End of MODULE XIESWAPREQ.C */ + diff --git a/xie/docs/dec/xie23-src/server/xie/XieTables.c b/xie/docs/dec/xie23-src/server/xie/XieTables.c new file mode 100644 index 0000000..1387b9c --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/XieTables.c @@ -0,0 +1,382 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Image Extension DIX +** +** ABSTRACT: +** +** The Xie dispatch tables. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Robert NC Shelley +** +** CREATION DATE: +** +** April 20, 1990 +** +************************************************************************/ + +/* +** Include files +*/ +#include + /* + ** Core X Includes + */ +#include +#include + /* + ** XIE Includes + */ +#include +#include +#include + +/* +** Equated Symbols +*/ +#ifndef externaldef +#ifdef VMS +#define externaldef(psect) globaldef {"psect"} noshare +#else +#define externaldef(psect) +#endif +#endif + + /* + ** DIX protocol functions + */ +extern int ProcNotRequest(); +extern int ProcInitSession(); +extern int ProcTermSession(); +extern int ProcQueryEvents(); +extern int ProcSelectEvents(); +extern int ProcSetOpDefaults(); +extern int ProcQueryOpDefaults(); +extern int ProcClonePhoto(); +extern int ProcCreateResource(); +extern int ProcDeleteResource(); +extern int ProcQueryResource(); +extern int ProcBindMapToFlo(); +extern int ProcAbortFlo(); +extern int ProcExecuteFlo(); +extern int ProcTapFlo(); +extern int ProcAbortTransport(); +extern int ProcGetStream(); +extern int ProcGetTile(); +extern int ProcPutStream(); +extern int ProcPutTile(); +extern int ProcSetTransport(); +extern int ProcExport(); +extern int ProcFreeExport(); +extern int ProcImport(); +extern int ProcQueryExport(); +extern int ProcArea(); +extern int ProcAreaStats(); +extern int ProcArith(); +extern int ProcCalcHistogram(); +extern int ProcChromeCom(); +extern int ProcChromeSep(); +extern int ProcCompare(); +extern int ProcConstrain(); +extern int ProcCrop(); +extern int ProcDither(); +extern int ProcFill(); +extern int ProcLogical(); +extern int ProcLuminance(); +extern int ProcMatchHistogram(); +extern int ProcMath(); +extern int ProcMirror(); +extern int ProcPoint(); +extern int ProcPointStats(); +extern int ProcRotate(); +extern int ProcScale(); +extern int ProcTranslate(); +extern int ProcNotImplemented(); + + /* + ** DIX protocol function dispatch table + */ +externaldef(xieDixProc) int (*xieDixProc[])() = { + ProcNotRequest, /* 0 */ + ProcInitSession, /* 1 */ + ProcTermSession, /* 2 */ + ProcQueryEvents, /* 3 */ + ProcSelectEvents, /* 4 */ + ProcSetOpDefaults, /* 5 */ + ProcQueryOpDefaults, /* 6 */ + ProcClonePhoto, /* 7 */ + ProcCreateResource, /* 8 */ + ProcDeleteResource, /* 9 */ + ProcQueryResource, /* 10 */ + ProcBindMapToFlo, /* 11 */ + ProcAbortFlo, /* 12 */ + ProcExecuteFlo, /* 13 */ + ProcTapFlo, /* 14 */ + ProcAbortTransport, /* 15 */ + ProcGetStream, /* 16 */ + ProcGetTile, /* 17 */ + ProcPutStream, /* 18 */ + ProcPutTile, /* 19 */ + ProcSetTransport, /* 20 */ + ProcExport, /* 21 */ + ProcFreeExport, /* 22 */ + ProcImport, /* 23 */ + ProcQueryExport, /* 24 */ + ProcArea, /* 25 */ + ProcAreaStats, /* 26 */ + ProcArith, /* 27 */ + ProcCalcHistogram, /* 28 */ + ProcChromeCom, /* 29 */ + ProcChromeSep, /* 30 */ + ProcCompare, /* 31 */ + ProcConstrain, /* 32 */ + ProcCrop, /* 33 */ + ProcDither, /* 34 */ + ProcFill, /* 35 */ + ProcLogical, /* 36 */ + ProcLuminance, /* 37 */ + ProcMatchHistogram, /* 38 */ + ProcMath, /* 39 */ + ProcMirror, /* 40 */ + ProcPoint, /* 41 */ + ProcPointStats, /* 42 */ + ProcRotate, /* 43 */ + ProcScale, /* 44 */ + ProcTranslate /* 45 */ + }; + + /* + ** DIX swap protocol functions + */ +int SProcXieSimpleReq(); +int SProcXieResourceReq(); + +int SProcInitSession(); +int SProcQueryEvents(); +int SProcSelectEvents(); +int SProcSetOpDefaults(); +int SProcCreateResourceByRef(); +int SProcCreateResourceByValue(); +int SProcBindMapToFlo(); +int SProcAbortFlo(); +int SProcExecuteFlo(); +int SProcTapFlo(); +int SProcAbortTransport(); +int SProcGetStream(); +int SProcGetTile(); +int SProcPutStream(); +int SProcPutTile(); +int SProcSetTransport(); +int SProcExport(); +int SProcFreeExport(); +int SProcImport(); +int SProcQueryExport(); +int SProcArea(); +int SProcAreaStats(); +int SProcArith(); +int SProcCalcHistogram(); +int SProcChromeCom(); +int SProcChromeSep(); +int SProcCompare(); +int SProcConstrain(); +int SProcCrop(); +int SProcDither(); +int SProcFill(); +int SProcLogical(); +int SProcLuminance(); +int SProcMatchHistogram(); +int SProcMath(); +int SProcMirror(); +int SProcPoint(); +int SProcPointStats(); +int SProcRotate(); +int SProcScale(); +int SProcTranslate(); + + /* + ** DIX swap protocol function procedure dispatch table + */ +externaldef(xieDixProc) int (*xieDixSwap[])() = { + ProcNotRequest, /* 0 */ + SProcInitSession, /* 1 */ + SProcXieSimpleReq, /* 2 */ + SProcQueryEvents, /* 3 */ + SProcSelectEvents, /* 4 */ + SProcSetOpDefaults, /* 5 */ + SProcXieSimpleReq, /* 6 */ + SProcCreateResourceByRef, /* 7 */ + SProcCreateResourceByValue, /* 8 */ + SProcXieResourceReq, /* 9 */ + SProcXieResourceReq, /* 10 */ + SProcBindMapToFlo, /* 11 */ + SProcAbortFlo, /* 12 */ + SProcExecuteFlo, /* 13 */ + SProcTapFlo, /* 14 */ + SProcAbortTransport, /* 15 */ + SProcGetStream, /* 16 */ + SProcGetTile, /* 17 */ + SProcPutStream, /* 18 */ + SProcPutTile, /* 19 */ + SProcSetTransport, /* 20 */ + SProcExport, /* 21 */ + SProcFreeExport, /* 22 */ + SProcImport, /* 23 */ + SProcQueryExport, /* 24 */ + SProcArea, /* 25 */ + SProcAreaStats, /* 26 */ + SProcArith, /* 27 */ + SProcCalcHistogram, /* 28 */ + SProcChromeCom, /* 29 */ + SProcChromeSep, /* 30 */ + SProcCompare, /* 31 */ + SProcConstrain, /* 32 */ + SProcCrop, /* 33 */ + SProcDither, /* 34 */ + SProcFill, /* 35 */ + SProcLogical, /* 36 */ + SProcLuminance, /* 37 */ + SProcMatchHistogram, /* 38 */ + SProcMath, /* 39 */ + SProcMirror, /* 40 */ + SProcPoint, /* 41 */ + SProcPointStats, /* 42 */ + SProcRotate, /* 43 */ + SProcScale, /* 44 */ + SProcTranslate /* 45 */ + }; + +extern int SReplySimple(); +extern int SReplyInitSession(); +extern int SReplyQueryEvents(); +extern int SReplyQueryOpDefaults(); +extern int SReplyQueryResource(); +extern int SReplyGetStream(); +extern int SReplyQueryExport(); + + /* + ** DIX swap protocol reply procedure dispatch table + */ +externaldef(xieDixProc) int (*xieDixSwapReply[])() = { + ProcNotRequest, /* 0 */ + SReplyInitSession, /* 1 */ + ProcNotRequest, /* 2 */ + SReplyQueryEvents, /* 3 */ + ProcNotRequest, /* 4 */ + ProcNotRequest, /* 5 */ + SReplyQueryOpDefaults, /* 6 */ + ProcNotRequest, /* 7 */ + ProcNotRequest, /* 8 */ + ProcNotRequest, /* 9 */ + SReplyQueryResource, /* 10 */ + ProcNotRequest, /* 11 */ + ProcNotRequest, /* 12 */ + ProcNotRequest, /* 13 */ + ProcNotRequest, /* 14 */ + ProcNotRequest, /* 15 */ + SReplyGetStream, /* 16 */ + SReplySimple, /* 17 */ + ProcNotRequest, /* 18 */ + ProcNotRequest, /* 19 */ + ProcNotRequest, /* 20 */ + ProcNotRequest, /* 21 */ + ProcNotRequest, /* 22 */ + ProcNotRequest, /* 23 */ + SReplyQueryExport, /* 24 */ + ProcNotRequest, /* 25 */ + ProcNotRequest, /* 26 */ + ProcNotRequest, /* 27 */ + SReplySimple, /* 28 */ + ProcNotRequest, /* 29 */ + ProcNotRequest, /* 30 */ + ProcNotRequest, /* 31 */ + ProcNotRequest, /* 32 */ + ProcNotRequest, /* 33 */ + ProcNotRequest, /* 34 */ + ProcNotRequest, /* 35 */ + ProcNotRequest, /* 36 */ + ProcNotRequest, /* 37 */ + ProcNotRequest, /* 38 */ + ProcNotRequest, /* 39 */ + ProcNotRequest, /* 40 */ + ProcNotRequest, /* 41 */ + SReplySimple, /* 42 */ + ProcNotRequest, /* 43 */ + ProcNotRequest, /* 44 */ + ProcNotRequest /* 45 */ + }; + +extern void WriteToClient(); +extern void Swap16Write(); +extern void Swap32Write(); + +/* + * Routines to swap arbitrary chunks of data that are part of replies. + * Index is size of data unit in bytes. + */ + +externaldef(xieDixProc) void (*xieDixSwapData[])() = { + NULL, + WriteToClient, /* No swap needed */ + Swap16Write, + NULL, + Swap32Write + }; +/* end module XieTables.c */ diff --git a/xie/docs/dec/xie23-src/server/xie/XieTransport.c b/xie/docs/dec/xie23-src/server/xie/XieTransport.c new file mode 100644 index 0000000..846f7af --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/XieTransport.c @@ -0,0 +1,1748 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** X Image Extension DIX +** +** ABSTRACT: +** +** This Xie module consists of DIX procedures for Transport +** service requests. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Robert NC Shelley +** +** CREATION DATE: +** +** September 27, 1989 +** +*******************************************************************************/ + +/* +** Definition to let include files know who's calling. +*/ +#define _XieTransport + +/* +** Include files +*/ + /* + ** Standard C include files + */ +#include + /* + ** Core X Includes + */ +#include +#include +#include +#include +#include + /* + ** XIE Includes + */ +#include +#include +#include +#include +#include +#include +#include + + +/* +** Table of contents +*/ + /* + ** Xie protocol proceedures called from XieMain + */ +int ProcAbortTransport(); +int ProcGetStream(); +int ProcGetTile(); +int ProcPutStream(); +int ProcPutTile(); +int ProcSetTransport(); + /* + ** routines referenced by other modules. + */ +void FreeTransport(); +int StreamCreate(); +int xieStreamInit(); +int StreamPending(); + /* + ** routines used internally by XieTransport + */ +static void AbortXport(); +static void FreeData(); +static int LookupTransport(); +static int PlaneFromSink(); +static int PlaneToSink(); +static int PutScanlines(); +static int PutStreamCmp(); +static int PutStreamPCM(); +static void SetupXportUdp(); + /* + ** routines used to support pipelines. + */ +static PipeSinkPtr _CreateDecode(); +static int _GetStreamCreate(); +static int _GetStreamInitialize(); +static int _GetStreamActivate(); +static int _GetStreamDestroy(); +static int _GetStreamConvert(); +static int _GetStreamFreeData(); +static int _PutCmp(); +static int _PutDataPCM(); +static int _PutNextPCM(); + +/* +** MACRO definitions +*/ +#define LookupTransport_(pflo,pmap,xport,src_id,mode,set)\ + {int status = LookupTransport(client,pflo,pmap,xport,src_id,mode,set);\ + if( status ) return status;} + +/* +** External References +*/ +extern int FloDone(); /* XieResource.c */ +extern UdpPtr UtilAllocUdp(); /* XieUtils.c */ +extern int UtilBePCM(); /* XieUtils.c */ +extern PipeSinkPtr UtilCreateSink(); /* XieUtils.c */ +extern CARD8 UtilClass(); /* XieUtils.c */ +extern CARD8 UtilDType(); /* XieUtils.c */ +extern void UtilSetPending(); /* XieUtils.c */ + +extern CARD32 xieClients; /* num of clients served */ +extern CARD32 xieEventBase; /* Base for Xie events */ +extern CARD32 xieReqCode; /* XIE main opcode */ +#if defined(X11R3) && !defined(DWV3) +extern CARD16 RC_xie; /* XIE Class */ +extern CARD16 RT_photo; /* Photo{flo|map|tap} resource */ +extern CARD16 RT_idc; /* Cpp, Roi & Tmp resource types*/ +#else /* X11R4 || DWV3 */ +extern RESTYPE RC_xie; /* XIE Class */ +extern RESTYPE RT_photo; /* Photo{flo|map|tap} resource */ +extern RESTYPE RT_idc; /* Cpp, Roi & Tmp resource types*/ +#endif + +externalref int (*xieDixSwapReply[])(); /* Swapped client reply table */ + +/* +** Local Storage +*/ + /* + ** GetStream Element Vector + */ +static PipeElementVector GetStreamPipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeGetStreamElement, /* Structure subtype */ + sizeof(GetStreamPipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* reserved flags */ + _GetStreamInitialize, /* Initialize entry */ + _GetStreamActivate, /* Activate entry */ + _GetStreamFreeData, /* Flush entry */ + _GetStreamDestroy, /* Destroy entry */ + _GetStreamFreeData /* Abort entry point */ + }; + +/*----------------------------------------------------------------------- +-------------------------- Abort Transport Procedure -------------------- +------------------------------------------------------------------------*/ +int ProcAbortTransport( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo; + PhotomapPtr img; + XportPtr xp; + INT32 status = Success; + REQUEST( xieAbortTransportReq ); + REQUEST_SIZE_MATCH( xieAbortTransportReq ); + /* + ** Lookup Photomap id. + */ + LookupTransport_(&flo, &img, &xp, stuff->photo_id, XieK_PutStream, -1); + + if( flo && ResId_(flo) == stuff->photo_id ) + { /* + ** Abort transport for ephemeral Phototaps (ie. SrcMap & DstMap). + */ + if( ResId_(SrcMap_(flo)) == 0 ) + AbortXport( SrcMap_(flo), XieK_AllPlanes ); + + if( ResId_(DstMap_(flo)) == 0 ) + AbortXport( DstMap_(flo), XieK_AllPlanes ); + } + else + /* + ** Release transport resources for all specified planes. + */ + AbortXport( img, stuff->plane_mask ); + + if( RunningFlo_(img) ) + { + status = StreamPending( flo ); + OkIf_( status <= Success, ResId_(flo), status ); + if( status == Success && !Yielded_(flo) ) + status = FloDone( client, flo ); + } + return( status <= Success ? Success : status ); +} /* end ProcAbortTransport */ + +/*----------------------------------------------------------------------- +--------------------------- Get Stream Procedure ----------------------- +------------------------------------------------------------------------*/ +int ProcGetStream( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo; + PhotomapPtr img; + XportPtr xp; + INT32 p, bits, bytes, s = Success; + xieGetStreamReply rep; + REQUEST( xieGetStreamReq ); + REQUEST_SIZE_MATCH( xieGetStreamReq ); + + p = stuff->plane_num; + LookupTransport_( &flo, &img, &xp, stuff->photo_id, XieK_GetStream, p ); + /* + ** Move available Photo{flo|map|tap} data to the Xport Udp for this plane. + */ + if( SnkFull_(xpSnk_(xp)) && !IsPointer_(xpBase_(xp,p)) ) + { + switch( xpCmpres_(xp) ) + { + case XieK_DCT : + /* + ** Always re-encode because we don't know original xpCmpPrm_. + */ + BePCM_(img, ResId_(img)); + xpSnk_(xp) = Sink_(img); + s = DdxEncodeDct_( &Udp_(img,p), + xpIsBndPxl_(xp) ? CmpCnt_(img) : 1, + xpUdp_(xp,p), xpCmpPrm_(xp), TRUE, &bits ); + break; + + case XieK_G42D : + if( IsG42D_(img) ) + { /* we can send G42D data already in the Photomap */ + bits = uArSize_(img,p); + xpBase_(xp,p) = uBase_(img,p); + xpPos_(xp,p) = uPos_(img,p); + } + else + { /* compress Photomap data into the transport Udp */ + BePCM_(img, ResId_(img)); /* must start with PCM data */ + xpSnk_(xp) = Sink_(img); + s = DdxEncodeG4_( Udp_(img,p), xpUdp_(xp,p), &bits ); + } + break; + + case XieK_PCM : + BePCM_(img, ResId_(img)); /* must start with PCM data */ + xpSnk_(xp) = Sink_(img); + if( xpCmpIdx_(xp,p) == p + && xpLvl_(xp,p) == uLvl_(img,p) + && xpPxlStr_(xp,p) == uPxlStr_(img,p) + && xpScnStr_(xp,p) == uScnStr_(img,p) ) + *xpUdp_(xp,p) = *Udp_(img,p); /* Xport from the Photomap */ + else /* Convert from Photomap */ + s = PlaneFromSink( xp, xpSnk_(xp), p ); + bits = xpArSize_(xp,p); + break; + + case XieK_G31D : /* not yet supported */ + case XieK_G32D : /* not yet supported */ + default : s = BadValue; + } + OkIf_(s==Success, (AbortXport(img,XieK_AllPlanes), stuff->photo_id), s); + xpArSize_(xp,p) = bits; + xpFinMsk_(xp) |= 1<max_bytes<<3, bits) + (s==XieK_StreamFinal ? 7 : 0 )>>3; + rep.type = X_Reply; + rep.sequenceNumber = client->sequence; + rep.length = bytes + 3 >> 2; + rep.byte_count = bytes; + rep.status = bytes < bits>>3 ? XieK_StreamMore : s; + WriteXieReplyToClient( client, sizeof(xieGetStreamReply), &rep ); + if( bytes != 0 ) + WriteToClient( client, bytes, xpBase_(xp,p) + (xpPos_(xp,p)>>3) ); + + if( bytes << 3 < bits ) + xpPos_(xp,p) += bytes<<3; /* offset to next segment to send */ + else if( IsPointer_(xpBase_(xp,p)) ) + { + if( xpBase_(xp,p) != uBase_(img,xpCmpIdx_(xp,p)) ) + DdxFreeBits_( xpBase_(xp,p) ); + xpBase_(xp,p) = NULL; + xpArSize_(xp,p) = 0; + xpPos_(xp,p) = 0; + } + if( rep.status == XieK_StreamFinal || rep.status == XieK_StreamError ) + FreeTransport(img, rep.status == XieK_StreamFinal ? p : XieK_AllPlanes); + + return( Success ); +} /* end ProcGetStream */ + +/*----------------------------------------------------------------------- +----------------------------- Get Tile Procedure ----------------------- +------------------------------------------------------------------------*/ +int ProcGetTile( client ) + ClientPtr client; /* client pointer */ +{ + PhotomapPtr img; + XportPtr xp; + CARD32 msk, total; + INT32 x, y, w, h, plane, s; + xieGetTileReply rep; + REQUEST( xieGetTileReq ); + REQUEST_SIZE_MATCH( xieGetTileReq ); + /* + ** Lookup Photomap id and verify the transport context and plane mask. + */ + LookupTransport_( NULL, &img, &xp, stuff->photomap_id, + XieK_Tile, stuff->plane_mask ); + /* + ** Make sure the coordinates and dimensions are within reasonable limits. + */ + x = max(stuff->x, 0); + y = max(stuff->y, 0); + w = stuff->width + stuff->x > Width_(img) ? Width_(img) - x + : stuff->width + stuff->x - x; + h = stuff->height+ stuff->y > Height_(img) ? Height_(img) - y + : stuff->height + stuff->y - y; + ValueOkIf_(w > 0 && h > 0, stuff->photomap_id); + + for( total = 0, plane = 0, msk = stuff->plane_mask; msk != 0; + plane++, msk >>= 1 ) + if( msk & 1 ) + { /* + ** Update the transport Udp to describe the tile of image data. + */ + xpWidth_(xp,plane) = w; + xpHeight_(xp,plane) = h; + xpX1_(xp,plane) = x; + xpY1_(xp,plane) = y; + xpX2_(xp,plane) = x + w - 1; + xpY2_(xp,plane) = y + h - 1; + xpScnStr_(xp,plane) = w * xpPxlStr_(xp,plane); + xpArSize_(xp,plane) = h * xpScnStr_(xp,plane); + /* + ** Get the image data from the Photomap and update the total + ** bytes to be sent -- each plane rounded up to a full longword. + */ + s = PlaneFromSink( xp, xpSnk_(xp), plane ); + OkIf_(s == Success, stuff->photomap_id, + (AbortXport(img,XieK_AllPlanes), s)); + total += xpArSize_(xp,plane) + 31 >> 3 & ~3; + } + /* + ** Send the reply header. + */ + rep.type = X_Reply; + rep.sequenceNumber = client->sequence; + rep.length = total + 3 >> 2; + WriteXieReplyToClient( client, sizeof(xieGetTileReply), &rep ); + /* + ** Send all the requested data. + */ + for( plane = 0, msk = stuff->plane_mask; msk != 0; plane++, msk >>= 1 ) + if( msk & 1 ) + { + WriteToClient(client, xpArSize_(xp,plane)- xpPos_(xp,plane)+7>>3, + xpBase_(xp,plane)+(xpPos_(xp,plane)>>3)); + if( xpBase_(xp,plane) != uBase_(img,xpCmpIdx_(xp,plane)) ) + DdxFreeBits_(xpBase_(xp,plane)); + xpBase_(xp,plane) = NULL; + } + if( stuff->final ) + /* + ** Deallocate the transport context from this Photomap. + */ + FreeTransport( img, XieK_AllPlanes ); + + return( Success ); +} /* end ProcGetTile */ + +/*----------------------------------------------------------------------- +--------------------------- Put Stream Procedure ----------------------- +------------------------------------------------------------------------*/ +int ProcPutStream( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo; + PhotomapPtr img; + XportPtr xp; + INT32 plane, s; + REQUEST( xiePutStreamReq ); + REQUEST_AT_LEAST_SIZE( xiePutStreamReq ); + + plane = stuff->plane_num; + LookupTransport_( &flo, &img, &xp, stuff->photo_id, XieK_PutStream, plane ); + + if( stuff->final ) + /* + ** Mark this plane done -- all its data is here now. + */ + UtilSetPending( img, plane, xpCmpOrg_(xp), FALSE ); + /* + ** Move the stream of client data into the Photo{flo|map|tap}. + */ + s = xpIsPCM_(xp) ? PutStreamPCM( client, img, xp, plane ) + : PutStreamCmp( client, img, xp, plane ); + if( s != Success ) + AbortXport( img, XieK_AllPlanes ); + else if( stuff->final ) + { + FreeTransport( img, plane ); + if( !AnyPending_(img) && RunningFlo_(img) ) + { /* + ** We're done -- see if there are any other streams pending. + */ + s = StreamPending( flo ); + OkIf_( s <= Success, ResId_(flo), s ); + if( s == Success && !Yielded_(flo) ) + s = FloDone( client, flo ); /* everybody's finished */ + } + else + { + SnkFull_(xpSnk_(xp)) = !AnyPending_(img); +#ifdef PEZD + LIB$SHOW_TIMER(); + printf("PEZD : Put Stream Final, plane = %d\n", plane); +#endif + } + } + return( s < Success ? Success : s ); +} /* end ProcPutStream */ + +/*----------------------------------------------------------------------- +---------------------------- Put Tile Procedure ------------------------ +------------------------------------------------------------------------*/ +int ProcPutTile( client ) + ClientPtr client; /* client pointer */ +{ + PhotomapPtr img; + XportPtr xp; + CARD32 msk, plane; + INT32 s, x, y, w, h; + unsigned char *data; + REQUEST( xiePutTileReq ); + REQUEST_AT_LEAST_SIZE( xiePutTileReq ); + /* + ** Lookup Photomap id and verify the transport context and plane mask. + */ + LookupTransport_( NULL, &img, &xp, stuff->photomap_id, + XieK_Tile, stuff->plane_mask ); + /* + ** Make sure the coordinates and dimensions are within reasonable limits. + */ + x = max(stuff->x, 0); + y = max(stuff->y, 0); + w = stuff->width + stuff->x > Width_(img) ? Width_(img) - x + : stuff->width + stuff->x - x; + h = stuff->height+ stuff->y > Height_(img) ? Height_(img) - y + : stuff->height + stuff->y - y; + ValueOkIf_(w > 0 && h > 0, stuff->photomap_id); + + for( data = (unsigned char*) &stuff[1], plane = 0, msk = stuff->plane_mask; + msk != 0; plane++, msk >>= 1 ) + if( msk & 1 ) + { /* + ** Update the transport Udp to describe the tile of image data. + */ + xpX1_(xp,plane) = x; + xpY1_(xp,plane) = y; + xpX2_(xp,plane) = x + w - 1; + xpY2_(xp,plane) = y + h - 1; + xpWidth_(xp,plane) = w; + xpHeight_(xp,plane) = h; + xpScnStr_(xp,plane) = w * xpPxlStr_(xp,plane); + xpArSize_(xp,plane) = h * xpScnStr_(xp,plane); + xpBase_(xp,plane) = data; + /* + ** Move the image data into the Photomap -- don't free "stuff". + */ + s = PlaneToSink( xp, xpSnk_(xp), plane, stuff->final ); + xpBase_(xp,plane) = NULL; + OkIf_( s == Success, stuff->photomap_id, s ); + /* + ** Update the data pointer -- if there are more planes of + ** data the next plane's data starts at the next longword. + */ + data += xpArSize_(xp,plane) + 31 >> 3 & ~3; + } + if( stuff->final ) + /* + ** Deallocate transport context from this Photomap. + */ + FreeTransport( img, XieK_AllPlanes ); + + return( Success ); +} /* end ProcPutTile */ + +/*----------------------------------------------------------------------- +--------------------------- Set Transport Procedure --------------------- +------------------------------------------------------------------------*/ +int ProcSetTransport( client ) + ClientPtr client; /* client pointer */ +{ + PhotofloPtr flo = NULL; + PhotomapPtr img; + PipeSinkPtr snk; + XportPtr xp; + CARD32 c, plane, org, msk, max_planes, DType, PxlBits; + CARD32 bpc[XieK_MaxComponents], lvl[XieK_MaxComponents]; + REQUEST( xieSetTransportReq ); + REQUEST_SIZE_MATCH( xieSetTransportReq ); + /* + ** Lookup Photo{flo|map} and verify the transport mode requested. + */ + LookupTransport_( stuff->mode == XieK_Tile ? NULL : &flo, + &img, &xp, stuff->photo_id, stuff->mode, -1 ); + AccessOkIf_(!flo || Make_(flo) + || Done_(flo) && IsPhotomap_(img), stuff->photo_id); + /* + ** Verify the size of each component and the total bits per pixel. + */ + for( PxlBits = 0, c = 0; c < XieK_MaxComponents; PxlBits += bpc[c++] ) + { + bpc[c] = IsPointer_(Udp_(img,c)) ? BitsFromLevels_(uLvl_(img,c)) : 0; + ValueOkIf_( bpc[c] <= XieK_MaxComponentDepth, stuff->photo_id ); + } + ValueOkIf_( stuff->plane_mask > 0 + && stuff->plane_mask <= XieK_AllPlanes, stuff->photo_id ); + /* + ** Degenerate the specified component_organization to its simplest form. + */ + org = IsBitonal_(img) ? XieK_BandByPlane + : IsRGB_(img) || stuff->component_organization == XieK_BitByPlane + ? stuff->component_organization : XieK_BandByPlane; + if( IsPointer_(xp) ) + { /* + ** Just adding more planes, make sure everything else is the same. + */ + MatchOkIf_((xpMode_(xp) == stuff->mode + && xpCmpOrg_(xp) == org + && xpCmpres_(xp) == stuff->compression_scheme + && xpCmpPrm_(xp) == stuff->compression_parameter + && !(xpPlnMsk_(xp) & stuff->plane_mask) + && !(xpFinMsk_(xp) & stuff->plane_mask) + && xpMaxMsk_(xp) >= stuff->plane_mask), stuff->photo_id); + xpPlnMsk_(xp) |= stuff->plane_mask; /* just update the plane_mask */ + } + else + { + AccessOkIf_(stuff->mode != XieK_PutStream /* Ok if client created */ + || WriteMap_(img),stuff->photo_id);/* this Photo{map|tap} */ + + switch( org ) + { /* test component_organization and number of planes requested */ + case XieK_BandByPixel : max_planes = 1; break; + case XieK_BandByPlane : max_planes = CmpCnt_(img); break; + case XieK_BitByPlane : max_planes = PxlBits; break; + } + ValueOkIf_( stuff->plane_mask <= (1<photo_id ); + + switch( stuff->compression_scheme ) + { /* verify compression_scheme */ + case XieK_PCM : break; + case XieK_G31D : + case XieK_G32D : + case XieK_G42D : + MatchOkIf_( IsBitonal_(img) && stuff->mode != XieK_Tile, + stuff->photo_id ); break; + case XieK_DCT : + MatchOkIf_(!IsBitonal_(img) && stuff->mode != XieK_Tile + && org != XieK_BitByPlane, stuff->photo_id ); break; + default: BadValue_(stuff->photo_id); + } + MatchOkIf_(stuff->mode != XieK_PutStream || !SnkUdpFinalMsk_(Sink_(img)) + || Cmpres_(img) == stuff->compression_scheme, stuff->photo_id); + + xp = (XportPtr) DdxCalloc_(1,sizeof(XportRec)); + AllocOkIf_( xp != NULL, stuff->photo_id ); + Tport_(img) = xp; + xpMode_(xp) = stuff->mode; + xpCmpOrg_(xp) = org; + xpCmpres_(xp) = stuff->compression_scheme; + xpCmpPrm_(xp) = stuff->compression_parameter; + xpPlnMsk_(xp) = stuff->plane_mask; + xpMaxMsk_(xp) = (1<photo_id)); + DdxRmDestroySink_( Sink_(img) ); + SnkPrm_(snk) = IsPhotomap_(img); + Sink_(img) = snk; + } + xpSnk_(xp) = Sink_(img); /* remember Sink involved in transport */ + } + + /* + ** Set parameters for specified planes. + */ + for( plane = 0, msk = 1; msk & xpMaxMsk_(xp); plane++, msk <<= 1 ) + { + if( !(msk & stuff->plane_mask) ) + continue; + + switch( org ) + { + case XieK_BandByPlane : PxlBits = bpc[plane]; break; + case XieK_BitByPlane : PxlBits = 1; break; + } + ValueOkIf_( !xpIsPCM_(xp) + || stuff->pixel_stride[plane] > 0 + && stuff->scanline_stride[plane] > 0, + (AbortXport(img,XieK_AllPlanes), stuff->photo_id)); + + DType = UtilDType( PxlBits, xpCmpres_(xp), stuff->pixel_stride[plane], + stuff->scanline_stride[plane]); + /* + ** Allocate a Udp for this plane (height == 0 if PutStream). + */ + xpUdp_(xp,plane) = UtilAllocUdp(DType, xpCmpres_(xp), Width_(img), + xpIsPutStream_(xp) ? 0 : Height_(img), + stuff->pixel_stride[plane], + stuff->scanline_stride[plane], + 1<photo_id)); + switch( org ) + { /* + ** Determine the component index for this plane. + */ + case XieK_BandByPixel : xpCmpIdx_(xp,plane) = 0; break; + case XieK_BandByPlane : xpCmpIdx_(xp,plane) = plane; break; + case XieK_BitByPlane : xpCmpIdx_(xp,plane) = + plane < bpc[0] ? 0 + : plane < bpc[0] + bpc[1] ? 1 : 2; + } + if( xpIsPutStream_(xp) ) + FreeData( img, plane, TRUE ); + } +#ifdef PEZD + printf("PEZD : End of Set Transport Context\n"); + LIB$INIT_TIMER(); +#endif + return( Success ); +} /* end ProcSetTransport */ + +/*----------------------------------------------------------------------- +------------------------- routine: Free Xport context ------------------ +------------------------------------------------------------------------*/ +void FreeTransport( img, plane ) + PhotomapPtr img; /* Photo{map|tap} from which to free transport resources */ + CARD32 plane; /* Xport plane number or XieK_AllPlanes */ +{ + XportPtr xp = Tport_(img); + CARD32 msk, c, p; + + if( !IsPointer_(xp) ) + return; + + msk = plane == XieK_AllPlanes ? xpPlnMsk_(xp) : 1<>= 1 ) + { + if( !(msk & 1) || !IsPointer_(xpUdp_(xp,p)) ) + continue; + + if( IsPointer_(xpBase_(xp,p)) + && xpBase_(xp,p) != uBase_(img,xpCmpIdx_(xp,p)) ) + DdxFreeBits_(xpBase_(xp,p)); + + xpUdp_(xp,p) = (UdpPtr) DdxFree_(xpUdp_(xp,p)); + xpPlnMsk_(xp) &= ~(1< 0 ) + { /* push "h" scanlines into the Photoflo */ + s = _PutNextPCM( xp, xpSnk_(xp), c, 0, -h ); + if( s == Success ) + s = _PutDataPCM( xp, xpSnk_(xp), c, y ); + } + } + } + } + que = FloNxt(que); + } + while( s == Success && que != QueSrc_(flo) ); + + return( s ); +} /* End of xieStreamInit */ + +/*----------------------------------------------------------------------- +-- routine: push pending input into Photoflo, tell if Xport is pending -- +------------------------------------------------------------------------*/ +int StreamPending( flo ) + PhotofloPtr flo; /* Photoflo pointer */ +{ +/* +** return value: +** +** -1 == input pending for some sink +** 0 == Success -- no transport pending +** >0 == error code +*/ + FloQuePtr que = QueSrc_(flo); + PhotomapPtr img; + XportPtr xp; + INT32 s = Success; + + do { + if( IsPhoto_(FloRes_(que)) ) + { + img = FloMap_(que); + xp = Tport_(img); + if( xp && xpIsPutStream_(xp) ) + s = -1; + else if( AnyPending_(img) ) + return( BadAccess ); + } + que = FloNxt(que); + } + while( que != QueSrc_(flo) ); + + return( s ); +} /* end StreamPending */ + +/*----------------------------------------------------------------------- +------------------------- routine: Abort transport --------------------- +------------------------------------------------------------------------*/ +static void AbortXport( img, mask ) + PhotomapPtr img; /* Photomap pointer */ + CARD32 mask; /* Xport plane mask */ +{ + XportPtr xp = Tport_(img); + CARD32 p, wait, msk; + + if( !IsPointer_(xp) ) return; + + for( p = 0, msk = xpPlnMsk_(xp) & mask; msk && Tport_(img); p++, msk >>= 1 ) + if( msk & 1 ) + { + if( xpIsPutStream_(xp) ) + /* + ** Free the image data if the component is totally aborted. + */ + FreeData( img, p, FALSE ); + + /* + ** Release the transport resources of this client plane. + */ + FreeTransport( img, p ); + } +} /* end AbortXport */ + +/*----------------------------------------------------------------------- +-------------- routine: Free image Data for empty components ----------- +------------------------------------------------------------------------*/ +static void FreeData( img, plane, set ) + PhotomapPtr img; /* Photomap pointer */ + CARD32 plane; /* client plane to be freed */ + BOOL set; /* TRUE if SetTransport, FALSE if AbortTransport */ +{ + XportPtr xp = Tport_(img); + CARD32 c = xpCmpIdx_(xp,plane); + CARD16 pending = CmpPending_(img,c); + + /* + ** Remember this plane is pending. + */ + UtilSetPending( img, plane, xpCmpOrg_(xp), TRUE ); + + do { /* + ** Test for: no planes previously pending (for SetTransport), + ** or all planes pending (after AbortTransport). + */ + if( set ? !pending + : CmpPending_(img,c) == (1<byte_count << 3; + xpBase_(xp,p) = IsPointer_(xpBase_(xp,p)) /* get larger buffer*/ + ? DdxReallocBits_(xpBase_(xp,p), xpArSize_(xp,p)) + : RunningFlo_(img) && !QueueEmpty_(SnkDrnLst_(xpSnk_(xp))) + ? (CARD8 *)&stuff[1] /* use wire buffer */ + : DdxMallocBits_(xpArSize_(xp,p)); /* get first buffer */ + AllocOkIf_( xpBase_(xp,p), stuff->photo_id ); + /* + ** See who owns the data buffer, X11 or Xie. + */ + own_data = xpBase_(xp,p) != (CARD8 *) &stuff[1]; + + if( own_data ) + { /* + ** Append the wire buffer data to our temporary buffer. + */ + memcpy( xpBase_(xp,p)+(xpPos_(xp,p)>>3), (CARD8 *) &stuff[1], + stuff->byte_count); + xpPos_(xp,p) += stuff->byte_count<<3; + } + if( stuff->final ) + SnkUdpFinalMsk_(xpSnk_(xp)) |= 1<photo_id, s ); + } + else if( stuff->final ) + { /* + ** Transfer compressed data ownership to the Photomap. + */ + c = xpCmpIdx_(xp,p); + uArSize_(img,c) = xpArSize_(xp,p); + uBase_(img,c) = xpBase_(xp,p); + xpBase_(xp,p) = NULL; + } + return( Success ); +} /* end PutStreamCmp */ + +/*----------------------------------------------------------------------- +------- routine: Put Stream PCM: convert stream to scanlines ----------- +------------------------------------------------------------------------*/ +static int PutStreamPCM( client, img, xp, plane ) + ClientPtr client; /* client pointer */ + PhotomapPtr img; /* Photo{map|tap} pointer */ + XportPtr xp; /* transport context pointer */ + CARD32 plane; /* client plane number */ +{ + REQUEST( xiePutStreamReq ); + INT32 s, total = stuff->byte_count << 3; + INT32 lines = (xpPos_(xp,plane) + total) / xpScnStr_(xp,plane); + INT32 used = 0; + /* + ** PutStreamPCM converts stream image data into scanline(s) that are + ** copied into the waiting Photo{map|tap} or if a Photoflo is running the + ** data is pushed directly into the running Photoflo. + ** + ** Any bits left over (a partial scanline) are saved in the transport + ** context Udp. Y1 indicates which scanline the data belongs to, and Pos + ** is used to keep the bit offset and byte count. Since the client is + ** required to send full bytes of data (except final) the lower 3 bits of + ** Pos is the actual Pos (bit offset) and the upper bits are the byte + ** count. + */ + lines = min(lines, uY2_(img,xpCmpIdx_(xp,plane)) - xpY2_(xp,plane)); + if( IsPointer_(xpBase_(xp,plane)) ) + { /* + ** Append new data to previous partial scanline. + */ + used = min( total, xpScnStr_(xp,plane) - xpPos_(xp,plane) ); + memcpy( xpBase_(xp,plane) + (xpPos_(xp,plane) + 7 >> 3), + (CARD8 *) &stuff[1], used + 7 >> 3); + if( lines-- == 0 ) + /* + ** Still don't have a full scanline. + */ + xpPos_(xp,plane) += used; + else + { /* + ** Copy (and convert) the single completed scanline. + */ + xpHeight_(xp,plane) = 1; + xpY2_(xp,plane) = xpY1_(xp,plane); + xpPos_(xp,plane) = -xpPos_(xp,plane) & 7; + s = PutScanlines( img, xp, plane, (stuff->final && lines == 0) ); + /* + ** Reset our context to accept all the full scanlines. + */ + xpBase_(xp,plane) = DdxFreeBits_( xpBase_(xp,plane) ); + xpPos_(xp,plane) = used & 7; + xpY1_(xp,plane)++; + OkIf_( s == Success, stuff->photo_id, s ); + } + } + + if( lines > 0 ) + { /* + ** Copy (and convert) all the full scanlines. + */ + xpY2_(xp,plane) = lines + xpY1_(xp,plane) - 1; + xpHeight_(xp,plane) = lines; + xpBase_(xp,plane) = (CARD8 *) &stuff[1] + (used >> 3); + s = PutScanlines( img, xp, plane, stuff->final ); + /* + ** Reset our context to save any remaining bits. + */ + xpBase_(xp,plane) = NULL; + used += lines * xpScnStr_(xp,plane); + xpY1_(xp,plane) += lines; + OkIf_( s == Success, stuff->photo_id, s ); + } + if( !stuff->final && used < total ) + { /* + ** Stash the remaining bits away until next time. + */ + xpPos_(xp,plane) = total - used; + xpBase_(xp,plane) = DdxMallocBits_(xpScnStr_(xp,plane) + 8); + AllocOkIf_( xpBase_(xp,plane), stuff->photo_id ); + memcpy(xpBase_(xp,plane), + (CARD8 *) &stuff[1] + (used >> 3), total - used + 7 >> 3); + } + else if( lines >= 0 ) + xpPos_(xp,plane) = 0; /* there are no bits remainding */ + + xpHeight_(xp,plane) = 0; /* there are no complete scanlines */ + + return( Success ); +} /* end PutStreamPCM */ + +/*----------------------------------------------------------------------- +------------------------ routine: Setup Xport Udp ---------------------- +------------------------------------------------------------------------*/ +static void SetupXportUdp( udp, snk, xp, plane, comp ) + UdpPtr udp; /* Udp pointer */ + PipeSinkPtr snk; /* Sink pointer */ + XportPtr xp; /* Xport context pointer */ + CARD32 plane, comp; /* client plane number and sink component index */ +{ + CARD32 i; + + switch( xpCmpOrg_(xp) ) + { + case XieK_BandByPixel : + upPxlLen_(udp) = BitsFromLevels_(SnkLvl_(snk,comp)); + upLvl_(udp) = SnkLvl_(snk,comp); + upCmpIdx_(udp) = SnkCmpIdx_(snk,comp); + upDType_(udp) = UtilDType(upPxlLen_(udp),XieK_PCM,xpPxlStr_(xp,plane), + xpScnStr_(xp,plane)); + upClass_(udp) = UtilClass( upDType_(udp), XieK_PCM ); + break; + + case XieK_BandByPlane : + break; + + case XieK_BitByPlane : + *udp = SnkUdp_(snk,comp); + upDType_(udp) = UdpK_DTypeVU; + upClass_(udp) = UdpK_ClassUBA; + upPxlLen_(udp) = 1; + upLvl_(udp) = 2; + for(upPos_(udp) += plane, i = 0; i < comp; i++ ) + upPos_(udp) -= BitsFromLevels_(SnkLvl_(snk,i)); + break; + } +} /* end SetupXportUdp */ + +/*----------------------------------------------------------------------- +-------------------- routine: Create a Decode element ------------------ +------------------------------------------------------------------------*/ +static PipeSinkPtr _CreateDecode( pipe, img ) + Pipe pipe; /* DDX pipeline pointer */ + PhotomapPtr img; /* Photo{map|tap} pointer */ +{ + PipeSinkPtr src, dst = Sink_(img); + UdpPtr udp; + INT32 c, s, lvl[XieK_MaxComponents]; + /* + ** Create a new Sink for the encoded data. Request PCM Udps + ** so we can swap them for the encoded Udps in the dst Sink. + */ + for( c = 0; c < CmpCnt_(img); lvl[c] = SnkLvl_(dst,c), c++ ); + src = UtilCreateSink( img, XieK_PCM, lvl, + IsPhotomap_(img) && DdxCmpPreferred_(Cmpres_(img)), + FALSE, NULL ); + if( src == NULL ) return( NULL ); + SnkFull_(src) = SnkFull_(dst); /* swap SinkFull */ + SnkFull_(dst) = FALSE; + SnkUdpFinalMsk_(src) = SnkUdpFinalMsk_(dst); /* swap UdpFinal */ + SnkUdpFinalMsk_(dst) = 0; + DdxRmSetDType_( src, UdpK_DTypeV, DtM_V ); /* src encoded */ + DdxRmSetAlignment_( dst, DdxAlignDefault_, NULL ); /* dst alignment */ + for( c = 0; c < CmpCnt_(img); c++ ) { + udp = SnkUdpPtr_(src,c); /* swap Udps */ + SnkUdpPtr_(src,c) = SnkUdpPtr_(dst,c); + SnkUdpPtr_(dst,c) = udp; + if( IsPointer_(DdxAlignDefault_) ) + (*DdxAlignDefault_)(udp, NULL); /* align PCM Udps */ + } + switch( Cmpres_(img) ) /* prepend the appropriate decoder element */ + { + case XieK_DCT : s = DdxCreateDecodeDct_(pipe,src,dst,CmpOrg_(img)); break; + case XieK_G42D : s = DdxCreateDecodeG4_( pipe,src,dst); break; + case XieK_G31D : + case XieK_G32D : + default : s = BadValue; + } + if( s != Success ) return( DdxRmDestroySink_(src) ); + + if( IsPhotomap_(img) && DdxCmpPreferred_(Cmpres_(img)) ) { + Sink_(img) = src; /* keep the encoded data */ + SnkDelete_(dst) = TRUE; /* delete the PCM data */ + SnkWrite_(dst) = FALSE; + SnkPrm_(dst) = FALSE; + } else { + SnkDelete_(src) = TRUE; /* delete the encoded data */ + Cmpres_(img) = XieK_PCM; /* keep the PCM data */ + CmpOrg_(img) = XieK_BandByPlane; + } + return( src ); +} /* End of _CreateDecode */ + +/*----------------------------------------------------------------------- +-------------- routine: Create Get_Stream Photoflo element -------------- +------------------------------------------------------------------------*/ +static int _GetStreamCreate( pipe, img ) + Pipe pipe; + PhotomapPtr img; +{ + XportPtr xp = Tport_(img); + GetStreamPipeCtxPtr ctx; + CARD32 drn, mask, plane; + INT32 i, s = Success; + + switch( xpCmpres_(xp) ) + { + case XieK_DCT : + if( xpIsBndPxl_(xp) ) + s = DdxCreateEncodeDct_( pipe, xpSnk_(xp), (1< 0 ) + if( xpUdp_(xp,plane) ) + mask |= 1< 0 ) + /* + ** Set quantum to match what we got from the red drain. + */ + DdxRmSetQuantum_(GsDrn_(ctx,drn),DatHeight_(GsDat_(ctx,0))); + + dat = DdxRmGetData_( ctx, GsDrn_(ctx,drn) ); + if( dat == NULL ) break; /* no more data */ + if( !IsPointer_(dat) ) return( (int) dat ); /* error status */ + comp = DatCmpIdx_(dat); + GsDat_(ctx,comp) = dat; + GsUdp_(ctx,comp) = DatUdp_(dat); + } + if( drn < GsDrnCnt_(ctx) ) break; /* insufficient data available */ + if( !IsPointer_(xp) ) continue; /* client no longer interested */ + + switch( xpCmpOrg_(xp) ) + { /* + ** Move available data to the Xport Udp(s). + */ + case XieK_BandByPixel : + s = _GetStreamConvert( ctx, xp, 0 ); + break; + + case XieK_BandByPlane : + s = _GetStreamConvert( ctx, xp, comp ); + break; + + case XieK_BitByPlane : + for( plane = 0; plane < XieK_MaxPlanes && s == Success; plane++ ) + if( xpUdp_(xp,plane) && xpCmpIdx_(xp,plane) == comp ) + s = _GetStreamConvert( ctx, xp, plane ); + } + } + return( s ); +} /* end _GetStreamActivate */ + +/*----------------------------------------------------------------------- +------------- routine: Destroy Get_Stream Photoflo element -------------- +------------------------------------------------------------------------*/ +static int _GetStreamDestroy(ctx) + GetStreamPipeCtxPtr ctx; /* GetStream pipe context pointer */ +{ + CARD32 drn; + + for( drn = 0; drn < GsDrnCnt_(ctx); drn++ ) + GsDrn_(ctx,drn) = DdxRmDestroyDrain_( GsDrn_(ctx,drn) ); + + return( Success ); +} /* end _GetStreamDestroy */ + +/*----------------------------------------------------------------------- +----------------- routine: Convert Get_Stream Data segment -------------- +------------------------------------------------------------------------*/ +static int _GetStreamConvert( ctx, xp, plane ) + GetStreamPipeCtxPtr ctx; /* GetStream pipe context pointer */ + XportPtr xp; /* Xport context pointer */ + CARD32 plane; /* Xport plane number */ +{ + PipeSinkPtr snk = &GsCvt_(ctx); + CARD32 s, pos, comp = xpCmpIdx_(xp,plane); + + if( IsPointer_(xpBase_(xp,plane)) ) + { + pos = xpPos_(xp,plane); + xpPos_(xp,plane) = xpArSize_(xp,plane) - ( SnkY1_(snk,comp) + * xpScnStr_(xp,plane)); + xpArSize_(xp,plane) += SnkHeight_(snk,comp) * xpScnStr_(xp,plane); + xpBase_(xp,plane) = DdxReallocBits_(xpBase_(xp,plane), + xpArSize_(xp,plane)); + } + else + { + pos = 0; + xpPos_(xp,plane) = -( SnkY1_(snk,comp) * xpScnStr_(xp,plane)); + xpArSize_(xp,plane) = SnkHeight_(snk,comp) * xpScnStr_(xp,plane); + xpBase_(xp,plane) = DdxMallocBits_(xpArSize_(xp,plane)); + } + if( xpBase_(xp,plane) == NULL ) return( BadAlloc ); + + s = PlaneFromSink( xp, snk, plane ); + if( s == Success ) + { + xpPos_(xp,plane) = pos; + + if( SnkY2_(snk,comp) >= xpY2_(xp,plane) ) + xpFinMsk_(xp) |= 1< 0 ? min(SnkMaxQnt_(snk), height) : height; + + /* + ** Don't go beyond the end of the image. + */ + length = min(length, SnkHeight_(snk,comp)-start); + /* + ** Allocate a data segment descriptor. + */ + xpDat_(xp,comp) = DdxRmAllocData_( snk, comp, start, length ); + if( !IsPointer_(xpDat_(xp,comp)) ) + { + s = (int) xpDat_(xp,comp); + xpDat_(xp,comp) = NULL; + } + + return( s ); +} /* end _PutNextPCM */ + +/* end module XieTransport.c */ diff --git a/xie/docs/dec/xie23-src/server/xie/XieTransport.h b/xie/docs/dec/xie23-src/server/xie/XieTransport.h new file mode 100644 index 0000000..b423462 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/XieTransport.h @@ -0,0 +1,162 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension DIX +** +** ABSTRACT: +** +** This is the header file for the DIX DISPLAY module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Robert NC Shelley +** +** CREATION DATE: +** +** August 11, 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ + + /* + ** Transport Context structure. + */ +typedef struct _XportRec { + CARD8 Mode; /* GetStream, PutStream, or Tile */ + CARD8 _pad; + CARD8 CmpOrg; /* component organization */ + CARD8 Cmpres; /* compression scheme */ + CARD32 CmpPrm; /* compression parameter */ + CARD32 PlnMsk; /* plane mask: initialized planes */ + CARD32 FinMsk; /* plane mask: completed planes */ + CARD32 MaxMsk; /* plane mask: all possible planes */ + PipeSinkPtr Snk; /* Sink to transport to or from */ + PipeDataPtr Dat[XieK_MaxComponents];/* Photoflo data descriptors */ + UdpPtr Udp[XieK_MaxPlanes]; /* Client plane descriptors */ +} XportRec; + /* + ** Convenience macros for accessing XportPtr fields. + */ +#define xpMode_(xp) ((xp)->Mode) +#define xpIsGetStream_(xp) (xpMode_(xp)==XieK_GetStream) +#define xpIsPutStream_(xp) (xpMode_(xp)==XieK_PutStream) +#define xpIsTile_(xp) (xpMode_(xp)==XieK_Tile) +#define xpCmpOrg_(xp) ((xp)->CmpOrg) +#define xpIsBndPxl_(xp) (xpCmpOrg_(xp)==XieK_BandByPixel) +#define xpIsBndPln_(xp) (xpCmpOrg_(xp)==XieK_BandByPlane) +#define xpIsBitPln_(xp) (xpCmpOrg_(xp)==XieK_BitByPlane) +#define xpCmpres_(xp) ((xp)->Cmpres) +#define xpIsDCT_(xp) (xpCmpres_(xp)==XieK_DCT) +#define xpIsG31D_(xp) (xpCmpres_(xp)==XieK_G31D) +#define xpIsG32D_(xp) (xpCmpres_(xp)==XieK_G32D) +#define xpIsG42D_(xp) (xpCmpres_(xp)==XieK_G42D) +#define xpIsPCM_(xp) (xpCmpres_(xp)==XieK_PCM) +#define xpCmpPrm_(xp) ((xp)->CmpPrm) +#define xpPlnMsk_(xp) ((xp)->PlnMsk) +#define xpFinMsk_(xp) ((xp)->FinMsk) +#define xpMaxMsk_(xp) ((xp)->MaxMsk) +#define xpSnk_(xp) ((xp)->Snk) +#define xpDat_(xp,comp) ((xp)->Dat[(comp)]) +#define xpUdp_(xp,plane) ((xp)->Udp[(plane)]) +#define xpPxlLen_(xp,plane) (xpUdp_(xp,plane)->UdpW_PixelLength) +#define xpDType_(xp,plane) (xpUdp_(xp,plane)->UdpB_DType) +#define xpClass_(xp,plane) (xpUdp_(xp,plane)->UdpB_Class) +#define xpBase_(xp,plane) (xpUdp_(xp,plane)->UdpA_Base) +#define xpArSize_(xp,plane) (xpUdp_(xp,plane)->UdpL_ArSize) +#define xpPxlStr_(xp,plane) (xpUdp_(xp,plane)->UdpL_PxlStride) +#define xpScnStr_(xp,plane) (xpUdp_(xp,plane)->UdpL_ScnStride) +#define xpX1_(xp,plane) (xpUdp_(xp,plane)->UdpL_X1) +#define xpX2_(xp,plane) (xpUdp_(xp,plane)->UdpL_X2) +#define xpY1_(xp,plane) (xpUdp_(xp,plane)->UdpL_Y1) +#define xpY2_(xp,plane) (xpUdp_(xp,plane)->UdpL_Y2) +#define xpWidth_(xp,plane) (xpUdp_(xp,plane)->UdpL_PxlPerScn) +#define xpHeight_(xp,plane) (xpUdp_(xp,plane)->UdpL_ScnCnt) +#define xpPos_(xp,plane) (xpUdp_(xp,plane)->UdpL_Pos) +#define xpCmpIdx_(xp,plane) (xpUdp_(xp,plane)->UdpL_CompIdx) +#define xpLvl_(xp,plane) (xpUdp_(xp,plane)->UdpL_Levels) + +/* +** Structure definitions and Typedefs +*/ + /* + ** GetStream Transport Pipe Context. + */ +typedef struct _GetStreamPipeCtx { + PipeElementCommonPart common; + struct _GetStreamPart { + PhotomapPtr Map; /* source Photo{map|tap}*/ + PipeSinkRec Cvt; /* data conversion sink */ + UdpRec Udp[XieK_MaxComponents]; /* copy of drains' Udp */ + PipeDrainPtr Drn[XieK_MaxComponents]; /* drains */ + PipeDataPtr Dat[XieK_MaxComponents]; /* drains' data */ + CARD8 DrnCnt; /* number of drains */ + CARD8 _pad[3]; + } GetStreamPart; +} GetStreamPipeCtx, *GetStreamPipeCtxPtr; + /* + ** Pipeline context, GetStream part, access macros + */ +#define GsMap_(ctx) ((ctx)->GetStreamPart.Map) +#define GsCvt_(ctx) ((ctx)->GetStreamPart.Cvt) +#define GsUdp_(ctx,comp) ((ctx)->GetStreamPart.Udp[(comp)]) +#define GsDrn_(ctx,comp) ((ctx)->GetStreamPart.Drn[(comp)]) +#define GsDat_(ctx,comp) ((ctx)->GetStreamPart.Dat[(comp)]) +#define GsDrnCnt_(ctx) ((ctx)->GetStreamPart.DrnCnt) + diff --git a/xie/docs/dec/xie23-src/server/xie/XieUtils.c b/xie/docs/dec/xie23-src/server/xie/XieUtils.c new file mode 100644 index 0000000..4fba9ec --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/XieUtils.c @@ -0,0 +1,550 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** X Image Extension DIX +** +** ABSTRACT: +** +** The Xie Utilities module +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Richard J. Piccolo +** Robert NC Shelley +** +** CREATION DATE: +** +** February 28, 1989 +** +*******************************************************************************/ + +/* +** Include files +*/ +#include +#include +#include +#include +#include +#include +#include /* for (DE)ALLOCATE_LOCAL Macros */ + +#include +#include +#include +#include +#include +#include + +/* +** Table of contents +*/ +UdpPtr UtilAllocUdp(); +int UtilBePCM(); +PhotomapPtr UtilCreatePhotomap(); +PipeSinkPtr UtilCreateSink(); +CARD8 UtilClass(); +CARD8 UtilDType(); +int UtilFreeResource(); +UdpPtr UtilFreeUdp(); +void UtilSetPending(); +Bool UtilValidRegion(); +/* +** Equated Symbols +*/ + +/* +** MACRO definitions +*/ + +/* +** External References +*/ +extern void FreeResource(); /* ref'd by FreeResource_ macro*/ + +extern void FreeExport(); /* XieDisplay.c */ +extern void FreeTransport(); /* XieTransport.c */ + +/* +** Local Storage +*/ + +/*----------------------------------------------------------------------- +--------------------------- routine: Allocate Udp ---------------------- +------------------------------------------------------------------------*/ +UdpPtr UtilAllocUdp( type, cmpres, w, h, pxlstr, scnstr, + lvl, idx, base, pos, align, algn_dat ) + unsigned char type; /* data type of Udp */ + unsigned char cmpres; /* data compression scheme */ + CARD32 w; /* width of image in pixels */ + CARD32 h; /* height of image in pixels */ + CARD32 pxlstr; /* pixel stride in bits */ + CARD32 scnstr; /* scanline stride in bits */ + CARD32 lvl; /* levels */ + CARD32 idx; /* component index */ + Bool base; /* True == allocate buffer */ + CARD32 pos; /* offset to beginning of data in bits */ + Fcard32 align; /* ptr to image array alignment function */ + unsigned long *algn_dat; /* ptr to prvt data for align func */ +{ + UdpPtr udp = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( udp == NULL ) return(NULL); + + if( cmpres == XieK_PCM ) + switch( type ) + { + case UdpK_DTypeBU : upPxlLen_(udp) = 8; break; + case UdpK_DTypeWU : upPxlLen_(udp) = 16; break; + case UdpK_DTypeLU : + case UdpK_DTypeF : upPxlLen_(udp) = 32; break; + case UdpK_DTypeV : + case UdpK_DTypeVU : upPxlLen_(udp) = BitsFromLevels_(lvl); break; + } + else upPxlLen_(udp) = 0; + + upDType_(udp) = type; + upClass_(udp) = UtilClass( type, cmpres ); + upPxlStr_(udp) = cmpres == XieK_PCM ? pxlstr : 0; + upScnStr_(udp) = cmpres == XieK_PCM ? scnstr : 0; + upX1_(udp) = 0; + upX2_(udp) = w - 1; + upY1_(udp) = 0; + upY2_(udp) = (signed long) h - 1; + upWidth_(udp) = w; + upHeight_(udp) = h; + upPos_(udp) = pos; + upCmpIdx_(udp) = idx; + upLvl_(udp) = lvl; + upArSize_(udp) = pos + h * upScnStr_(udp); + if( IsPointer_(align) ) + (*align)(udp, algn_dat); + + if( base && upArSize_(udp) > 0 ) + { + upBase_(udp) = DdxMallocBits_( upArSize_(udp) ); + if( upBase_(udp) == NULL ) + udp = UtilFreeUdp(udp); + } + else + upBase_(udp) = NULL; + + return( udp ); +} /* end UtilAllocUdp */ + +/*----------------------------------------------------------------------- +------------ routine: ensure that Photomap contains PCM data ----------- +------------------------------------------------------------------------*/ +int UtilBePCM( img ) + PhotomapPtr img; /* Photomap pointer */ +{ + PipeSinkPtr new, old = Sink_(img); + INT32 c, status = Success, lvl[XieK_MaxComponents]; + + if( Tport_(img) && AnyPending_(img) ) return( BadAccess ); + if(!IsPCM_(img) ) + { /* create a PCM Sink for decode */ + for( c = 0; c < CmpCnt_(img); lvl[c] = SnkLvl_(old,c), c++ ); + new = UtilCreateSink(img, XieK_PCM, lvl, TRUE, FALSE, DdxAlignDefault_); + if( new == NULL ) return( BadAlloc ); + if( !AnyPending_(img) ) + switch( Cmpres_(img) ) /* since all the data's here */ + { /* decode it into the new Sink */ + case XieK_DCT : + if( IsBndPxl_(img) ) + status = DdxDecodeDct_( SnkUdpPtr_(old,0), + &SnkUdpPtr_(new,0), CmpCnt_(img) ); + else + for( c = 0; c < CmpCnt_(img) && status == Success; c++ ) + status = DdxDecodeDct_( SnkUdpPtr_(old,c), + &SnkUdpPtr_(new,c), 1 ); + break; + case XieK_G42D : + status = DdxDecodeG4_( SnkUdpPtr_(old,0), SnkUdpPtr_(new,0) ); + break; + case XieK_G31D : + case XieK_G32D : + default : status = BadValue; + } + Sink_(img) = new; /* replace the compressed */ + Cmpres_(img) = XieK_PCM; /* Sink with the PCM Sink */ + CmpOrg_(img) = XieK_BandByPlane; + DdxRmDestroySink_( old ); + if( AnyPending_(img) ) /* if some data is missing */ + return( UtilBePCM(img) ); /* make a zeroed PCM image */ + } + else + for( c = 0; c < CmpCnt_(img); c++ ) /* create a zeroed array */ + if( !IsPointer_(uBase_(img,c)) ) /* for absent components */ + { + uBase_(img,c) = DdxCallocBits_( uArSize_(img,c) ); + if( uBase_(img,c) == NULL ) return( BadAlloc ); + } + SnkFull_(Sink_(img)) = TRUE; + SnkUdpFinalMsk_(Sink_(img)) = (1< 0; + CmpOrg_(img) = XieK_BandByPlane; + Cmpres_(img) = XieK_PCM; + CmpMap_(img) = cmpmap; + CmpCnt_(img) = IsRGB_(img) ? 3 : 1; + PxlRatio_(img) = pxlratio; + PxlProg_(img) = pxlprog; + ScnProg_(img) = scnprog; + PxlPol_(img) = pxlpol; + Width_(img) = width; + Height_(img) = height; + /* + ** Create a Sink to hold the Photo{map|tap}'s data (assume PCM for now). + */ + Sink_(img) = UtilCreateSink(img, XieK_PCM, cmplvl, permanent, base, align); + if( Sink_(img) == NULL ) + img = (PhotomapPtr) DdxFree_( img ); + + return( img ); +} /* end UtilCreatePhotomap */ + +/*----------------------------------------------------------------------- +------------ routine: Create a Sink for a Photo{map|tap} --------------- +------------------------------------------------------------------------*/ +PipeSinkPtr UtilCreateSink( img, cmpres, cmplvl, permanent, base, align ) + PhotomapPtr img; /* Photo{map|tap} pointer */ + unsigned long cmpres; /* compression scheme */ + CARD32 *cmplvl; /* levels per component */ + Bool permanent; /* True == sink for Photomap, else Phototap */ + Bool base; /* True == alloc image data arrays */ + Fcard32 align; /* ptr to image array alignment function */ +{ + CARD32 pxlstr, scnstr, dtype, c = CmpCnt_(img); + PipeSinkPtr sink = DdxRmCreateSink_( NULL ); + if( !IsPointer_(sink) ) return( NULL ); + /* + ** Allocate Udp's describing image data. + */ + while( c-- > 0 ) + { + pxlstr = cmplvl[c] == 0 ? 32 /* unconstrained float */ + : cmplvl[c] <= 1 << 1 ? 1 /* bitonal bits */ + : cmplvl[c] <= 1 << 8 ? 8 /* continuous tone byte */ + : cmplvl[c] <= 1 << 16 ? 16 /* continuous tone word */ + : 32; /* continuous tone long */ + scnstr = pxlstr * Width_(img); + dtype = cmplvl[c] > 0 ? UtilDType( pxlstr, cmpres, pxlstr, scnstr ) + : UdpK_DTypeF; + + SnkUdpPtr_(sink,c) = UtilAllocUdp( dtype, cmpres, + Width_(img), Height_(img), + pxlstr, scnstr, cmplvl[c], + c, base, 0, align, NULL ); + if( !IsPointer_(SnkUdpPtr_(sink,c)) ) + return( DdxRmDestroySink_( sink ) ); + } + /* + ** Only be specific about DType for PCM data. + */ + if( cmpres == XieK_PCM ) + DdxRmSetDType_( sink, dtype, 1<array ); + DdxFree_(TmpDat_((TmpPtr)res)); + break; + + default : return(BadRequest); + } + DdxFree_( res ); + } + return( Success ); +} /* end UtilFreeResource */ + +/*----------------------------------------------------------------------- +---------------------------- routine: Free Udp ------------------------- +------------------------------------------------------------------------*/ +UdpPtr UtilFreeUdp(udp) + UdpPtr udp; +{ + if( IsPointer_(udp) ) + { /* + ** If you don't want your data freed, you must NULL the pointer. + */ + if( IsPointer_(upBase_(udp)) ) + DdxFreeBits_( upBase_(udp) ); + DdxFree_( udp ); + } + return( NULL ); +} /* end UtilFreeUdp */ + +/*----------------------------------------------------------------------- +------------------ routine: Set/reset plane Pending mask --------------- +------------------------------------------------------------------------*/ +void UtilSetPending( map, plane, org, state ) + PhotomapPtr map; /* Photo{map|tap} pointer */ + CARD32 plane; /* client plane index */ + CARD32 org; /* client component organization */ + CARD8 state; /* Boolean - True to set, False to reset */ +{ + CARD32 c, p, bits[XieK_MaxComponents]; + /* + ** Get bit width required for each component. + */ + for( c = 0; c < CmpCnt_(map); c++ ) + bits[c] = BitsFromLevels_(uLvl_(map,c)); + + switch( org ) + { + case XieK_BandByPixel : + /* + ** Set or clear all bits of all components. + */ + for( c = 0; c < CmpCnt_(map); c++ ) + CmpPending_(map,c) = state ? (1 << bits[c]) - 1 : 0; + break; + + case XieK_BandByPlane : + /* + ** Set or clear all bits of the specified component. + */ + CmpPending_(map,plane) = state ? (1 << bits[plane]) - 1 : 0; + break; + + case XieK_BitByPlane : + /* + ** Set or clear a single bit. + */ + for( p = 0, c = 0; c < CmpCnt_(map) && p <= plane; p += bits[c++] ) + if( plane < bits[c] + p ) + if( state ) + CmpPending_(map,c) |= 1 << plane - p; + else + CmpPending_(map,c) &= ~(1 << plane - p); + break; + } + /* + ** Now see if any and all planes are still pending. + */ + AnyPending_(map) = FALSE; + AllPending_(map) = TRUE; + for( c = 0; c < CmpCnt_(map); c++ ) + { + AnyPending_(map) |= CmpPending_(map,c) != 0; + AllPending_(map) &= CmpPending_(map,c) == (1 << bits[c]) - 1; + } +} /* end UtilSetPending */ + +/*----------------------------------------------------------------------- +---------------- routine: Validate region against Photomap ------------- +------------------------------------------------------------------------*/ +Bool UtilValidRegion( map, idcudp ) + PhotomapPtr map; /* Photo{map|tap} pointer */ + UdpPtr idcudp; /* Udp corresponding to ROI/CPP */ +{ + /* To be valid, the IDC region must intersect the Photo at some point. */ + + if( upX1_(idcudp) > uX2_(map,0) || upY1_(idcudp) > uY2_(map, 0) || + upX2_(idcudp) < uX1_(map,0) || upY2_(idcudp) < uY1_(map, 0) ) + return( FALSE ); + else + return( TRUE ); +} /* end UtilValidRegion */ +/* End of Module XieUtils.c */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/DmiChangeList.c b/xie/docs/dec/xie23-src/server/xie/smi/DmiChangeList.c new file mode 100644 index 0000000..338f292 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/DmiChangeList.c @@ -0,0 +1,500 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/************************************************************************ +** +** Copyright (c) Digital Equipment Corporation, 1990-1991 All Rights Reserved. +** Unpublished rights reserved under the copyright laws of the United States. +** The software contained on this media is proprietary to and embodies the +** confidential technology of Digital Equipment Corporation. Possession, use, +** duplication or dissemination of the software and media is authorized only +** pursuant to a valid written license from Digital Equipment Corporation. +** RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the U.S. +** Government is subject to restrictions as set forth in Subparagraph +** (c)(1)(ii) of DFARS 252.227-7013, or in FAR 52.227-19, as applicable. +**/ + + +/************************************************************************ +** +** FACILITY: +** +** Image Processing Services (IPS) +** +** ABSTRACT: +** +** Changlist manipulation routines for the Ultrix environment. +** This module replaces the VMS module IPS__CHANGE_LIST.MAR. +** +** This module contains routines which support the creation of change +** lists from image data and the reconstruction of image data from +** change list structures. +** +** A CHANGELIST is an array of unsigned integers where the zeroeth entry +** contains the count of the number of valid entries, and a valid entry +** contains a CHANGE point (bit offset from the beginning of the scanline) +** from zero to one, or one to zero. +** +** Entry CHANGELIST[1], and all odd indexed entries contain CHANGEs to +** "ones"; even entries contain CHANGEs to "zeros". If the CHANGELIST +** array is large enough to process the entire scanline the last entry +** CHANGELIST[CHANGELIST[0]] will contain the length of the scanline (one +** bit position past the end) and is included in the count. +** +** The maximum size CHANGELIST array required to contain one scanline +** is scanline-length plus 2 entries (for the count and scanline length). +** +** ENVIRONMENT: +** +** Ultrix V3.0 +** +** AUTHOR(S): +** +** Written for VMS - John Weber - 15-May-1987 +** +** Rewritten for Ultrix - Brian M. Stevens - 26-Sep-1988 +** +** Clean-up and put into library - Michael D. O'Connor - 28-Nov-1988 +** +** Updated for use in ported XIE - Richard D. Hennessy 23-Jan-1992 +** +** CREATION DATE: +** +** 26-Sep-1988 +** +************************************************************************/ + + /* + ** Table of Contents + */ +int DmiBuildChangeList(); +void DmiPutRuns(); + +int _DmiFfsLong(); +int _DmiFfcLong(); + + +/* +** Include files +*/ +#include + +/* +** Global Symbols +*/ + +/* +** Equated Symbols +*/ +#define BYTE_SIZE 8 /* number of bits per byte */ + +/* +** MACRO definitions +*/ + /* + ** Macros for Ffslong, Ffclong + */ +/* +** 1st set/clear bit found, store its position in find_pos and return +** success indicator +*/ +#define SUCCESS_(bit) { \ + *find_pos = (long) (((long)pbyte) - base) \ + * BYTE_SIZE + bit; \ + return(Success); \ + } \ + +/* +** 1st set/clear bit not found, return a failure indicator (the offset of +** the last bit in the field plus 1 has already been stored in find_pos +*/ +#define FAILURE_ {return(-1);} + +/* +** External References +*/ + + +/************************************************************************ +** DmiBuildChangeList - Build a change list from image data +** +** FUNCTIONAL DESCRIPTION: +** +** This routine builds a change list structure from a buffer of image data. +** Run length transitions are detected by alternately searching for zero +** bits or one bits with the Ips__FFx_LONG routines. Bit offsets where the +** transitions take place are stored in subsequent entries in the change +** list. +** +** FORMAL PARAMETERS: +** + long src_addr; - scanline buffer address + long src_pos; - scanline buffer offset (in bits) + long size; - scanline buffer length (in bytes) + long cl_addr; - change list address (ptr to array of long) + long cl_len; - chane list length (num of cells in array) +** +** +** IMPLICIT INPUTS: +** +** none +** +** IMPLICIT OUTPUTS: +** +** none +** +** FUNCTION VALUE: +** +** Returns the address of the change list. +** +** SIGNAL CODES: +** +** none +** +** SIDE EFFECTS: +** +** none +** +************************************************************************/ +int DmiBuildChangeList(src_addr, src_pos, size, cl_addr, cl_len) + long src_addr; + long src_pos; + long size; + long cl_addr; + long cl_len; +{ + long pos; + long end; + int index; + unsigned int *cl; + + + cl = (unsigned int *) cl_addr; + end = src_pos + size; + pos = src_pos; + + /* + ** While there's room in the changlist and data to search, find + ** transitions and load them into the change list. + */ + for (index = 1; index < cl_len && size > 0; index++, size = end - pos) + { + if (index % 2) + { + /* + ** look for a transition to a 1 bit + */ + + _DmiFfsLong(pos, size, src_addr, &pos); + } + else + { + /* + ** look for a transition to a 0 bit + */ + + _DmiFfcLong(pos, size, src_addr, &pos); + } + + /* + ** save the transition point in the changelist + */ + + cl[index] = pos - src_pos; + } + + /* + ** store the number of valid entries + */ + + cl[0] = --index; + + return ((int) cl); +} + + +/************************************************************************ +** DmiPutRuns - Restore image data from change list +** +** FUNCTIONAL DESCRIPTION: +** +** This routine accepts a change list buffer and reconstructs the image +** data described by it into a data buffer. +** +** It is assumed that the data buffer contains zeros on entry to this +** routine, so only run lists of ones are actually written using +** _IpsMovv7. +** +** FORMAL PARAMETERS: +** + long dst_addr; - dest. address of image data buffer + long dst_pos; - dest. address offset (in bits) + long cl_addr; - address of change list (array of long) +** +** +** IMPLICIT INPUTS: +** +** none +** +** IMPLICIT OUTPUTS: +** +** none +** +** FUNCTION VALUE: +** +** none +** +** SIGNAL CODES: +** +** none +** +** SIDE EFFECTS: +** +** none +** +************************************************************************/ +void DmiPutRuns(dst_addr, dst_pos, cl_addr) + long dst_addr; + long dst_pos; + long cl_addr; +{ + long size; + int index; + unsigned int *cl; + int bit; + char *pbyte; + + + cl = (unsigned int *) cl_addr; + + /* + ** While there are elements in the change list write runs of bits + ** into the destination image data buffer. + ** Note: Since data buffer starts out as all 0's. Write only runs of 1's. + */ + for (index = 1; index < cl[0]; index += 2) + { + /* + ** Find out where to start + */ + pbyte = (char *) dst_addr + (dst_pos + cl[index]) / BYTE_SIZE; + size = cl[index + 1] - cl[index]; + + /* + ** Write bits before starting on byte boundary + */ + for (bit=(dst_pos + cl[index]) % BYTE_SIZE; size > 0 && bit < BYTE_SIZE; +--size, ++bit) + { + *pbyte |= (1 << bit); + } + + /* + ** Write ones for as many bytes as needed + */ + for (pbyte++; size >= BYTE_SIZE; size -= BYTE_SIZE, pbyte++) + { + *pbyte = 0xff; + } + + /* + ** Write ones after last byte boundary + */ + for (bit = 0; size > 0; --size, ++bit) + { + *pbyte |= (1 << bit); + } + } +} + + +/************************************************************************ +** +** _DmiFfsLong - Find first set bit +** +** FUNCTIONAL DESCRIPTION: +** +** Searches the bit field specified by start_pos, size, and base for +** the first set bit +** +** FORMAL PARAMETERS: +** + long start_pos; * starting position (offset) * + long size; * size of the bit field * + long base; * base address of the bit field * + long *find_pos; * returned position of 1st set bit * +** +** IMPLICIT INPUTS: +** +** None +** +** IMPLICIT OUTPUTS: +** +** None +** +** FUNCTION VALUE: +** +** Returns IpsX_NORMAL for success +** +** SIGNAL CODES: +** +** If set bit not found, signals LIB$_NOTFOU +** +** SIDE EFFECTS: +** +** None +** +************************************************************************/ + +int _DmiFfsLong(start_pos, size, base, find_pos) + long start_pos; /* starting position (offset) */ + long size; /* size of the bit field */ + long base; /* base address of the bit field */ + long *find_pos; /* returned position of 1st set bit */ + +{ + char *pbyte; /* address of byte being searched */ + char pbyte_val; /* value of byte being searched */ + int bit; /* position of bit being examined */ + + + *find_pos = start_pos + size; + pbyte = (char *) base + start_pos / BYTE_SIZE; + pbyte_val = *pbyte; + + for (bit=start_pos % BYTE_SIZE; size > 0 && bit < BYTE_SIZE; --size, ++bit) + { + if (pbyte_val & (1 << bit)) SUCCESS_(bit); + } + + for (pbyte++; size >= BYTE_SIZE; size -= BYTE_SIZE, pbyte++) + { + pbyte_val = *pbyte; + + if (pbyte_val & 0x01) SUCCESS_(0); + if (pbyte_val & 0x02) SUCCESS_(1); + if (pbyte_val & 0x04) SUCCESS_(2); + if (pbyte_val & 0x08) SUCCESS_(3); + if (pbyte_val & 0x10) SUCCESS_(4); + if (pbyte_val & 0x20) SUCCESS_(5); + if (pbyte_val & 0x40) SUCCESS_(6); + if (pbyte_val & 0x80) SUCCESS_(7); + } + + pbyte_val = *pbyte; + + for (bit = 0; size > 0; --size, ++bit) + { + if (pbyte_val & (1 << bit)) SUCCESS_(bit); + } + + FAILURE_; +} + + +/************************************************************************ +** +** _DmiFfcLong - Find first clear bit +** +** FUNCTIONAL DESCRIPTION: +** +** Searches the bit field specified by start_pos, size, and base for +** the first clear bit +** +** FORMAL PARAMETERS: +** + long start_pos; * starting position (offset) * + long size; * size of the bit field * + long base; * base address of the bit field * + long *find_pos; * returned position of 1st set bit * +** +** IMPLICIT INPUTS: +** +** None +** +** IMPLICIT OUTPUTS: +** +** None +** +** FUNCTION VALUE: +** +** Success == a 0 or a 1 bit found +** Failure == neither bit type found (off the edge) +** +** SIGNAL CODES: +** +** None +** +** SIDE EFFECTS: +** +** None +** +************************************************************************/ + +int _DmiFfcLong(start_pos, size, base, find_pos) + long start_pos; /* starting position (offset) */ + long size; /* size of the bit field */ + long base; /* base address of the bit field */ + long *find_pos; /* returned position of 1st clear bit */ + +{ + char *pbyte; /* address of byte being searched */ + char pbyte_val; /* value of byte being searched */ + int bit; /* position of bit being examined */ + + *find_pos = start_pos + size; + pbyte = (char *) base + start_pos / BYTE_SIZE; + pbyte_val = ~(*pbyte); + + for (bit=start_pos % BYTE_SIZE; size >= 0 && bit < BYTE_SIZE; --size, ++bit) + { + if (pbyte_val & (1 << bit)) SUCCESS_(bit); + } + + for (pbyte++; size >= BYTE_SIZE; size -= BYTE_SIZE, pbyte++) + { + pbyte_val = ~(*pbyte); + + if (pbyte_val & 0x01) SUCCESS_(0); + if (pbyte_val & 0x02) SUCCESS_(1); + if (pbyte_val & 0x04) SUCCESS_(2); + if (pbyte_val & 0x08) SUCCESS_(3); + if (pbyte_val & 0x10) SUCCESS_(4); + if (pbyte_val & 0x20) SUCCESS_(5); + if (pbyte_val & 0x40) SUCCESS_(6); + if (pbyte_val & 0x80) SUCCESS_(7); + } + + pbyte_val = ~(*pbyte); + + for (bit = 0; size >= 0; --size, ++bit) + { + if (pbyte_val & (1 << bit)) SUCCESS_(bit); + } + + FAILURE_; +} +/* E N D of D M I C H A N G E L I S T . C */ + diff --git a/xie/docs/dec/xie23-src/server/xie/smi/DmiChangeList.h b/xie/docs/dec/xie23-src/server/xie/smi/DmiChangeList.h new file mode 100644 index 0000000..3b4c400 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/DmiChangeList.h @@ -0,0 +1,103 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright (c) Digital Equipment Corporation, 1990 All Rights Reserved. +** Unpublished rights reserved under the copyright laws of the United States. +** The software contained on this media is proprietary to and embodies the +** confidential technology of Digital Equipment Corporation. Possession, use, +** duplication or dissemination of the software and media is authorized only +** pursuant to a valid written license from Digital Equipment Corporation. + +** RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the U.S. +** Government is subject to restrictions as set forth in Subparagraph +** (c)(1)(ii) of DFARS 252.227-7013, or in FAR 52.227-19, as applicable. +** +** Derived from work bearing the following copyright and permissions: +** +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Digital Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the CHANGELIST module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** +** AUTHOR(S): +** +** Richard Hennessy +** +** CREATION DATE: +** +** September 25, 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _DMICHANGELIST +#define _DMICHANGELIST + + /* + ** Include files + */ + + /* + ** Function reference + */ +int DmiBuildChangeList(); +void DmiPutRuns(); + +#endif _DMICHANGELIST diff --git a/xie/docs/dec/xie23-src/server/xie/smi/DmiConvert.c b/xie/docs/dec/xie23-src/server/xie/smi/DmiConvert.c new file mode 100644 index 0000000..8ffa723 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/DmiConvert.c @@ -0,0 +1,4667 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/****************************************************************************** +** +** Copyright (c) Digital Equipment Corporation, 1990 All Rights Reserved. +** Unpublished rights reserved under the copyright laws of the United States. +** The software contained on this media is proprietary to and embodies the +** confidential technology of Digital Equipment Corporation. Possession, use, +** duplication or dissemination of the software and media is authorized only +** pursuant to a valid written license from Digital Equipment Corporation. + +** RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the U.S. +** Government is subject to restrictions as set forth in Subparagraph +** (c)(1)(ii) of DFARS 252.227-7013, or in FAR 52.227-19, as applicable. +** +** Derived from work bearing the following copyright and permissions: +** +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +**/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** DEC Machine Independant DDX +** +** ABSTRACT: +** +** This module contains all image data type and organization conversion +** routines. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** John Weber +** Gary Grebus +** +** CREATION DATE: +** +** May 15, 1989 +** Aug 16, 1990 (cloned from SmiConvert.c) +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ + +/* +** Definition to let include files know who's calling. +*/ +#define _DmiConvert + +/* +** Include files +*/ +#include +#include +#include /* XIE device dependant definitions */ +#include + +/* +** Table of contents +*/ +int DmiConvert(); +int DmiConvertCpp(); +int DmiCopy(); +int DmiCopyCpp(); +int DmiGetTyp(); +int DmiPosCl(); + +static int _CvtUnsOpr(); + +static int _CvtBsBs(); +static int _CvtBsCl(); +static int _CvtBsByt(); +static int _CvtBsWrd(); +static int _CvtBsFlt(); + +static int _CvtBytByt(); +static int _CvtBytBs(); +static int _CvtBytCl(); +static int _CvtBytWrd(); +static int _CvtBytFlt(); + +static int _CvtWrdWrd(); +static int _CvtWrdBs(); +static int _CvtWrdCl(); +static int _CvtWrdByt(); +static int _CvtWrdFlt(); + +static int _CvtFltFlt(); +static int _CvtFltBs(); +static int _CvtFltByt(); +static int _CvtFltWrd(); + +static int _CvtClCl(); +static int _CvtClBs(); +static int _CvtClByt(); +static int _CvtClWrd(); +static int _CvtClFlt(); + +static int _CvtBsBsCpp(); +static int _CvtBsBytCpp(); +static int _CvtBsWrdCpp(); +static int _CvtBsFltCpp(); + +static int _CvtBytBytCpp(); +static int _CvtBytBsCpp(); +static int _CvtBytWrdCpp(); +static int _CvtBytFltCpp(); + +static int _CvtWrdWrdCpp(); +static int _CvtWrdBsCpp(); +static int _CvtWrdBytCpp(); +static int _CvtWrdFltCpp(); + +static int _CvtFltFltCpp(); +static int _CvtFltBsCpp(); +static int _CvtFltBytCpp(); +static int _CvtFltWrdCpp(); + +static int _ConHCBs(); +static int _ConHCByt(); +static int _ConHCWrd(); + +static int _ConCSBs(); +static int _ConCSByt(); +static int _ConCSWrd(); + +static int _ConHSBs(); +static int _ConHSByt(); +static int _ConHSWrd(); + +static void _BuildClBits(); +static void _BuildClBytes(); +static void _BuildClWords(); + +/* +** MACRO definitions +*/ +#define Min_(a,b) ((a) <= (b) ? (a) : (b)) +#define Max_(a,b) ((a) > (b) ? (a) : (b)) + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + + +/* +** Local Storage +*/ + +/* +** This table describes functions to be called when converting from one +** descriptor type to another. +*/ +static int (*conversion_table[XieK_DATA_TYPE_COUNT][XieK_DATA_TYPE_COUNT])()={ + {_CvtBsBs, _CvtBsBs, _CvtUnsOpr,_CvtUnsOpr,_CvtBsCl, _CvtBsByt, _CvtBsFlt, _CvtBsWrd}, + {_CvtBsBs, _CvtBsBs, _CvtUnsOpr,_CvtUnsOpr,_CvtBsCl, _CvtBsByt, _CvtBsFlt, _CvtBsWrd}, + {_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr}, + {_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr}, + {_CvtClBs, _CvtClBs, _CvtUnsOpr,_CvtUnsOpr,_CvtClCl, _CvtClByt, _CvtClFlt, _CvtClWrd}, + {_CvtBytBs, _CvtBytBs, _CvtUnsOpr,_CvtUnsOpr,_CvtBytCl, _CvtBytByt,_CvtBytFlt,_CvtBytWrd}, + {_CvtFltBs, _CvtFltBs, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtFltByt,_CvtFltFlt,_CvtFltWrd}, + {_CvtWrdBs, _CvtWrdBs, _CvtUnsOpr,_CvtUnsOpr,_CvtWrdCl, _CvtWrdByt,_CvtWrdFlt,_CvtWrdWrd} +}; + +/* Ditto for conversions under the control of a CPP */ +static int (*conversion_table_cpp[XieK_DATA_TYPE_COUNT][XieK_DATA_TYPE_COUNT])()={ + {_CvtBsBsCpp, _CvtBsBsCpp, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtBsBytCpp, _CvtBsFltCpp, _CvtBsWrdCpp}, + {_CvtBsBsCpp, _CvtBsBsCpp, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtBsBytCpp, _CvtBsFltCpp, _CvtBsWrdCpp}, + {_CvtUnsOpr, _CvtUnsOpr, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr, _CvtUnsOpr, _CvtUnsOpr}, + {_CvtUnsOpr, _CvtUnsOpr, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr, _CvtUnsOpr, _CvtUnsOpr}, + {_CvtUnsOpr, _CvtUnsOpr, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr, _CvtUnsOpr, _CvtUnsOpr}, + {_CvtBytBsCpp,_CvtBytBsCpp,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtBytBytCpp,_CvtBytFltCpp,_CvtBytWrdCpp}, + {_CvtFltBsCpp,_CvtFltBsCpp,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtFltBytCpp,_CvtFltFltCpp,_CvtFltWrdCpp}, + {_CvtWrdBsCpp,_CvtWrdBsCpp,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtWrdBytCpp,_CvtWrdFltCpp,_CvtWrdWrdCpp} +}; + +/* +** This table describes the functions to be called when constraining data. +*/ +static int (*constrain_table[5][XieK_DATA_TYPE_COUNT])()={ + {_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr}, + {_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr}, + {_ConHCBs, _ConHCBs, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_ConHCByt, _CvtUnsOpr,_ConHCWrd}, + {_ConCSBs, _ConCSBs, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_ConCSByt, _CvtUnsOpr,_ConCSWrd}, + {_ConHSBs, _ConHSBs, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_ConHSByt, _CvtUnsOpr,_ConHSWrd} +}; + +/***************************************************************************** +** DmiConvert +** +** FUNCTIONAL DESCRIPTION: +** +** This is the externally callable entry point for type conversion. The +** data specified by the source descriptor is reorganized to conform to +** the specification of the destination descriptor. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** mode - transfer mode, one of the following: +** XieK_MoveMode, move without constraining +** XieK_HardClip, constrain data via hard clip model +** XieK_ClipScale, constrain data via clip scale model +** XieK_HardScale, constrain data via hard scale model +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int DmiConvert(src, dst, mode) +UdpPtr src; +UdpPtr dst; +int mode; +{ + int srctyp; + int dsttyp; + int status; + /* + ** Validate and get type of descriptors + */ + srctyp = DdxGetTyp_(src); + dsttyp = DdxGetTyp_(dst); + + if( srctyp >= XieK_DATA_TYPE_COUNT || dsttyp >= XieK_DATA_TYPE_COUNT ) + status = _CvtUnsOpr(src, dst); + + else if( mode == XieK_MoveMode ) + /* + ** Call specific conversion routine. + */ + status = (*conversion_table[srctyp][dsttyp])(src,dst); + + else if( srctyp != XieK_AF ) + status = _CvtUnsOpr(src, dst); + else + /* + ** The input data must be type float. Call conversion + ** routine based on the constraint model requested. + */ + status = (*constrain_table[mode][dsttyp])(src,dst); + + return (status); +} /* end DmiConvert */ + +/***************************************************************************** +** DmiConvertCpp +** +** FUNCTIONAL DESCRIPTION: +** +** This is the same as DmiConvert, except that a CPP is used to +** select the input pixels to be copied. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** mode - transfer mode, one of the following: +** XieK_MoveMode, move without constraining +** cpp - cpp data descriptor +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int DmiConvertCpp(src, dst, cpp, mode) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int mode; +{ + int srctyp; + int dsttyp; + int status; + /* + ** Validate and get type of descriptors + */ + srctyp = DdxGetTyp_(src); + dsttyp = DdxGetTyp_(dst); + + if( srctyp >= XieK_DATA_TYPE_COUNT + || dsttyp >= XieK_DATA_TYPE_COUNT || mode != XieK_MoveMode || cpp == NULL ) + status = _CvtUnsOpr(src, dst); + else + status = (*conversion_table_cpp[srctyp][dsttyp])(src,dst,cpp); + + return (status); +} /* end DmiConvertCpp */ + +/***************************************************************************** +** DmiCopy +** +** FUNCTIONAL DESCRIPTION: +** +** This is a jacket function over the CONVERT routine which provides a +** straight-forward interface for copying ROIs. +** +** The principle used is simple, but possibly hard to understand. This +** routine relies on the fact that the CONVERT code matches source and +** destination image coordinates during the move (i.e. source pixel (0,0) +** is moved to destination pixel (0,0). To accomplish the move of a source +** ROI, the source UDP is modified so that only the ROI data is described +** as image (all other data will be described as pad by careful use of +** POS, and STRIDE fields). The coordinates of the source are shifted so +** they match the desired destination coordinates. +** +** Simple...right? (no way) +** +** FORMAL PARAMETERS: +** +** srcudp - UDP to copy from +** dstudp - UDP to copy to +** src_x - Source X coordinate (X coordinate of upper left corner of +** source ROI). +** src_y - Source Y coordinate (Y coordinate of upper left corner of +** source ROI). +** dst_x - Destination X coordinate +** dst_y - Destination Y coordinate +** width - Width of ROI in pels +** height - Height of ROI in pels +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int DmiCopy( src, dst, srcx, srcy, dstx, dsty, width, height ) +UdpPtr src; +UdpPtr dst; +long int srcx; +long int srcy; +long int dstx; +long int dsty; +long int width; +long int height; +{ + UdpRec srcudp; + long int clipped_width; + long int clipped_height; + /* + ** Make a copy of the source UDP that we can modify. + */ + srcudp = *src; + /* + ** Modify the source UDP so that is describes only the ROI and reflects + ** where in the destination the data is to be copied. + */ + srcudp.UdpL_X1 = dstx; + srcudp.UdpL_Y1 = dsty; + + clipped_width = Min_(srcx + width -1, src->UdpL_X2) - srcx + 1; + clipped_height = Min_(srcy + height -1, src->UdpL_Y2) - srcy + 1; + + srcudp.UdpL_X2 = dstx + clipped_width - 1; + srcudp.UdpL_Y2 = dsty + clipped_height - 1; + + srcudp.UdpL_PxlPerScn = clipped_width; + srcudp.UdpL_ScnCnt = clipped_height; + + srcudp.UdpL_Pos += srcy * srcudp.UdpL_ScnStride + + srcx * srcudp.UdpL_PxlStride; + + /* + ** Now, call the CONVERT routine to do the data movement. + */ + return (DdxConvert_(&srcudp, dst, XieK_MoveMode) ); +} /* end DmiCopy */ + +/***************************************************************************** +** DmiCopyCpp +** +** FUNCTIONAL DESCRIPTION: +** +** This is the same as DmiCopy, except the pixels to be copied +** are selected by a CPP. +** +** FORMAL PARAMETERS: +** +** srcudp - UDP to copy from +** dstudp - UDP to copy to +** cpp - UDP for the CPP +** src_x - Source X coordinate (X coordinate of upper left corner of +** source ROI). +** src_y - Source Y coordinate (Y coordinate of upper left corner of +** source ROI). +** dst_x - Destination X coordinate +** dst_y - Destination Y coordinate +** width - Width of ROI in pels +** height - Height of ROI in pels +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int DmiCopyCpp(src, dst, cpp, srcx, srcy, dstx, dsty, width, height) +UdpPtr src; +UdpPtr dst; +long int srcx; +long int srcy; +long int dstx; +long int dsty; +long int width; +long int height; +{ + UdpRec srcudp; + long int clipped_width; + long int clipped_height; + + /* + ** Make a copy of the source UDP that we can modify. + */ + srcudp = *src; + /* + ** Modify the source UDP so that is describes only the ROI and reflects + ** where in the destination the data is to be copied. + */ + srcudp.UdpL_X1 = dstx; + srcudp.UdpL_Y1 = dsty; + + clipped_width = Min_(srcx + width -1, src->UdpL_X2) - srcx + 1; + clipped_height = Min_(srcy + height -1, src->UdpL_Y2) - srcy + 1; + + srcudp.UdpL_X2 = dstx + clipped_width - 1; + srcudp.UdpL_Y2 = dsty + clipped_height - 1; + + srcudp.UdpL_PxlPerScn = clipped_width; + srcudp.UdpL_ScnCnt = clipped_height; + + srcudp.UdpL_Pos += srcy * srcudp.UdpL_ScnStride + + srcx * srcudp.UdpL_PxlStride; + + /* + ** Now, call the CONVERT routine to do the data movement. + */ + return( DdxConvertCpp_( &srcudp, dst, cpp, XieK_MoveMode ) ); +} /* end DmiCopyCpp */ + +/***************************************************************************** +** DmiGetTyp +** +** FUNCTIONAL DESCRIPTION: +** +** Return constant which identifies a valid combination of descriptor +** class and data type. +** +** FORMAL PARAMETERS: +** +** desc - data descriptor to validate and classify +** +** FUNCTION VALUE: +** +** Chf_InvDscTyp - data type of descriptor +** +** SIGNAL CODES: +** +** invalid descriptor type +** +*****************************************************************************/ +int DmiGetTyp(desc) +UdpPtr desc; +{ + int type; + + switch (desc->UdpB_DType) + { + case UdpK_DTypeBU : + switch (desc->UdpB_Class) + { + case UdpK_ClassA: type = XieK_ABU; break; + case UdpK_ClassUBA: + case UdpK_ClassUBS: + case UdpK_ClassCL: type = XieK_DATA_TYPE_COUNT; break; + default: type = XieK_DATA_TYPE_COUNT; break; + } break; + case UdpK_DTypeWU: + switch (desc->UdpB_Class) + { + case UdpK_ClassA: type = XieK_AWU; break; + case UdpK_ClassUBA: + case UdpK_ClassUBS: + case UdpK_ClassCL: type = XieK_DATA_TYPE_COUNT; break; + default: type = XieK_DATA_TYPE_COUNT; break; + } break; + case UdpK_DTypeLU: + switch (desc->UdpB_Class) + { + case UdpK_ClassA: type = XieK_UBAV; /* hack */ break; + case UdpK_ClassUBA: + case UdpK_ClassUBS: + case UdpK_ClassCL: type = XieK_DATA_TYPE_COUNT; break; + default: type = XieK_DATA_TYPE_COUNT; break; + } break; + case UdpK_DTypeF: + switch (desc->UdpB_Class) + { + case UdpK_ClassA: type = XieK_AF; break; + case UdpK_ClassUBA: + case UdpK_ClassUBS: + case UdpK_ClassCL: type = XieK_DATA_TYPE_COUNT; break; + default: type = XieK_DATA_TYPE_COUNT; break; + } break; + case UdpK_DTypeVU: + switch (desc->UdpB_Class) + { + case UdpK_ClassUBA: type = XieK_UBAVU; break; + case UdpK_ClassUBS: type = XieK_UBSVU; break; + case UdpK_ClassA: + case UdpK_ClassCL: type = XieK_DATA_TYPE_COUNT; break; + default: type = XieK_DATA_TYPE_COUNT; break; + } break; + case UdpK_DTypeV: + switch (desc->UdpB_Class) + { + case UdpK_ClassUBA: type = XieK_UBAV; break; + case UdpK_ClassUBS: type = XieK_UBSV; break; + case UdpK_ClassA: + case UdpK_ClassCL: type = XieK_DATA_TYPE_COUNT; break; + default: type = XieK_DATA_TYPE_COUNT; break; + } break; + case UdpK_DTypeCL: + switch (desc->UdpB_Class) + { + case UdpK_ClassCL: type = XieK_CLCL; break; + case UdpK_ClassA: + case UdpK_ClassUBA: + case UdpK_ClassUBS: type = XieK_DATA_TYPE_COUNT; break; + default: type = XieK_DATA_TYPE_COUNT; break; + } break; + default : type = XieK_DATA_TYPE_COUNT; break; + } + return( type ); +} /* end DmiGetTyp */ + +/***************************************************************************** +** DmiPosCl +** +** FUNCTIONAL DESCRIPTION: +** +** Return the UdpL_Pos value (i.e. offset in bits) which corresponds +** to the beginning of the specified scanline in a changelist Udp. +** +** This code assumes the specified scanline actually exists in the +** UDP. +** +** FORMAL PARAMETERS: +** +** base - base address of change list +** inipos - inipos value +** scncnt - number of scanlines to move ahead +** +** FUNCTION VALUE: +** +** Bit offset to the scanline from base. +** +** SIGNAL CODES: +** +** none +** +*****************************************************************************/ +int DmiPosCl(base, inipos, scncnt) +unsigned int *base; +int inipos; +int scncnt; +{ + unsigned int *lptr; /* Pointer to a changelist */ + long pos; /* Return pos value */ + int scanline, element_sz_bits; + + /* + ** Optimize the null case + */ + if( scncnt == 0 ) + return( inipos ); + + element_sz_bits = 8 * sizeof(unsigned int); + lptr = base + (inipos / element_sz_bits); + pos = inipos; + /* + ** Sum up the changelist lengths (in bits) + */ + for( scanline = 0; scanline < scncnt; scanline++ ) + { + pos += (*lptr + 2) * element_sz_bits; + lptr += (*lptr + 2); + } + + return( pos ); +} /* end DmiPosCl */ + +/***************************************************************************** +** _CvtUnsOpr +** +** FUNCTIONAL DESCRIPTION: +** +** This is an action routine called when conversion from source descriptor +** type to destination descriptor type is not supported. Simply signal an +** error at this point. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtUnsOpr(src, dst) +UdpPtr src; +UdpPtr dst; +{ + return( BadImplementation ); +} + +/***************************************************************************** +** _CvtBsBs +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit stream to bit stream encoding +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBsBs(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask, dst_mask, mask_24 = (1 << 24) - 1; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + int bits; + int value; + char *data, copy_line = src->UdpW_PixelLength == 1 + && dst->UdpW_PixelLength == 1 + && src->UdpL_PxlStride == 1 + && dst->UdpL_PxlStride == 1; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; +/* +** Optimize the case of copying from one contiguous, aligned bit string to +** another. This is a common case when copying PCM data out of the X wire +** buffers. Note copy_line being true insures PxlStride is one, so we +** can omit it from these calculations. +*/ + if( copy_line + && src->UdpL_ScnStride == dst->UdpL_ScnStride + && src->UdpL_ScnStride == X2 - X1 + 1 + && (src_scan_offset + X1 - src->UdpL_X1 & 7) == 0 + && (dst_scan_offset + X1 - dst->UdpL_X1 & 7) == 0 ) + { + memcpy( dst->UdpA_Base + ((dst_scan_offset + (X1-src->UdpL_X1)) >> 3), + src->UdpA_Base + ((src_scan_offset + (X1-dst->UdpL_X1)) >> 3), + (src->UdpL_ScnStride * (Y2-Y1+1)) >> 3); + + if( src->UdpL_ScnStride & 7 ) + { /* + ** Bit string length is not a multiple of byte length. + ** Copy the trailing bits. + */ + bits = (Y2-Y1+1) * src->UdpL_ScnStride & ~7; + src_offset = src_scan_offset + X1 - src->UdpL_X1 + bits; + dst_offset = dst_scan_offset + X1 - dst->UdpL_X1 + bits; + while( bits != (Y2-Y1+1) * src->UdpL_ScnStride ) + { + value = GET_VALUE_(src->UdpA_Base, src_offset, src_mask); + PUT_VALUE_(dst->UdpA_Base, dst_offset, value, dst_mask); + src_offset++; + dst_offset++; + bits++; + } + } + } + else + /* + ** Handle the more general cases. + */ + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset+(X1-src->UdpL_X1)*src->UdpL_PxlStride; + dst_offset = dst_scan_offset+(X1-dst->UdpL_X1)*dst->UdpL_PxlStride; + /* + ** Copy until the destination is at a byte boundary. + */ + for( pixel = X1; pixel <= X2 && dst_offset & 7; pixel++ ) + { + value = GET_VALUE_(src->UdpA_Base, src_offset, src_mask); + PUT_VALUE_(dst->UdpA_Base, dst_offset, value, dst_mask); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + /* + ** If there is enough data, try for a higher performance copy. + */ + if( copy_line && X2 + 1 - pixel >= 24 ) + if( src_offset & 7 ) + /* + ** Src and dst aren't aligned, so move in 3 byte chunks. + */ + for( data = (char *)(dst->UdpA_Base+(dst_offset>>3)); + pixel <= X2 + 1 - 24; + src_offset += 24, + dst_offset += 24, + pixel += 24 ) + { + value = + GET_VALUE_(src->UdpA_Base, src_offset, mask_24); +#ifdef BIGENDIAN + *data++ = *((unsigned char *)(&value)+3); + *data++ = *((unsigned char *)(&value)+2); + *data++ = *((unsigned char *)(&value)+1); +#else + *data++ = *((unsigned char *)(&value)); + *data++ = *((unsigned char *)(&value)+1); + *data++ = *((unsigned char *)(&value)+2); +#endif + } + else + { /* + ** Src and dst are aligned, so we can use + ** the fast byte mover. + */ + bits = X2 + 1 - pixel & ~7; + memcpy( dst->UdpA_Base + (dst_offset >> 3), + src->UdpA_Base + (src_offset >> 3), bits >> 3 ); + src_offset += bits; + dst_offset += bits; + pixel += bits; + } + /* + ** Copy the remainder. + */ + while( pixel <= X2 ) + { + value = GET_VALUE_(src->UdpA_Base, src_offset, src_mask); + PUT_VALUE_(dst->UdpA_Base, dst_offset, value, dst_mask); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + pixel++; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBsCl +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit string to change list +** +** The source and destination UDP's must have the same X1 and X2 +** coordinates. (i.e. only full scanlines are processed.) +** +** Data is unconditionally appended at the specified scanline. +** Scanlines must be appended in strict sequence (i.e. no gaps). +** +** The destination buffer (if one exists) is assumed to be +** large enough to hold ScnCnt * worst-case changelist size. +** +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBsCl(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int scanline; + int i; + int Y1, Y2; + int src_scan_offset, dst_scan_byte_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_byte_offset = + DmiPosCl(dst->UdpA_Base, dst->UdpL_Pos, Y1 - dst->UdpL_Y1) >> 3; + + if( src->UdpL_PxlStride == 1 ) + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + DmiBuildChangeList(src->UdpA_Base, src_scan_offset, + src->UdpL_PxlPerScn, + dst->UdpA_Base + dst_scan_byte_offset, + src->UdpL_PxlPerScn + 1); + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_byte_offset += + (*(unsigned int *)(dst->UdpA_Base+dst_scan_byte_offset) + 2) + * sizeof(unsigned int); + } + else + /* Need to skip over pixel pad */ + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + _BuildClBits(src->UdpA_Base, src_scan_offset, + src->UdpL_PxlPerScn, src->UdpL_PxlStride, + dst->UdpA_Base + dst_scan_byte_offset, + src->UdpL_PxlPerScn + 1); + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_byte_offset += + (*(unsigned int *)(dst->UdpA_Base+dst_scan_byte_offset) + 1) + * sizeof(unsigned int); + } + return (Success); +} + +/***************************************************************************** +** _CvtBsByt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit string to byte array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBsByt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_byte_offset; + int src_offset, dst_byte_offset; + int dst_byte_stride; + int dst_byte_scn_stride; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + dst_byte_scn_stride = dst->UdpL_ScnStride >> 3; + dst_byte_stride = dst->UdpL_PxlStride >> 3; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_byte_offset = + (dst->UdpL_Pos >> 3) + (Y1 - dst->UdpL_Y1) * dst_byte_scn_stride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_byte_offset = dst_scan_byte_offset + (X1-dst->UdpL_X1); + + for( pixel = X1; pixel <= X2; pixel++ ) + { + (dst->UdpA_Base)[dst_byte_offset] = + GET_VALUE_(src->UdpA_Base,src_offset,src_mask); + src_offset += src->UdpL_PxlStride; + dst_byte_offset += dst_byte_stride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_byte_offset += dst_byte_scn_stride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBsWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit string to word array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBsWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + GET_VALUE_(src->UdpA_Base,src_offset,src_mask); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBsFlt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit string to float +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBsFlt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((float *)(dst->UdpA_Base + dst_offset / 8)) = + (float)GET_VALUE_(src->UdpA_Base,src_offset,src_mask); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBytByt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to byte array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBytByt( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + char copy_line = src->UdpW_PixelLength == dst->UdpW_PixelLength + && src->UdpW_PixelLength == src->UdpL_PxlStride + && dst->UdpW_PixelLength == dst->UdpL_PxlStride + && src->UdpL_PxlStride == dst->UdpL_PxlStride; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + if( copy_line ) + memcpy( dst->UdpA_Base + (dst_offset >> 3), + src->UdpA_Base + (src_offset >> 3), X2 - X1 + 1 ); + else + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((unsigned char *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned char *)(src->UdpA_Base + (src_offset >> 3))); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBytBs +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to bit string +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBytBs(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_byte_offset, dst_scan_offset; + int src_byte_offset, dst_offset; + int src_byte_stride, src_scan_byte_stride; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_byte_stride = src->UdpL_ScnStride >> 3; + src_byte_stride = src->UdpL_PxlStride >> 3; + + src_scan_byte_offset = + (src->UdpL_Pos >> 3) + (Y1 - src->UdpL_Y1) * src_scan_byte_stride; + dst_scan_offset = dst->UdpL_Pos+ (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_byte_offset = + src_scan_byte_offset + (X1-src->UdpL_X1) * src_byte_stride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + PUT_VALUE_(dst->UdpA_Base,dst_offset, + (src->UdpA_Base)[src_byte_offset],dst_mask); + src_byte_offset += src_byte_stride; + dst_offset += dst->UdpL_PxlStride; + } + src_scan_byte_offset += src_scan_byte_stride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBytCl +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to change list +** +** The source and destination UDP's must have the same X1 and X2 +** coordinates. (i.e. only full scanlines are processed.) +** +** Data is unconditionally appended at the specified scanline. +** Scanlines must be appended in strict sequence (i.e. no gaps). +** +** The destination buffer (if one exists) is assumed to be +** large enough to hold ScnCnt * worst-case changelist size. +** +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBytCl(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int scanline; + int i; + int Y1, Y2; + int src_scan_byte_offset, dst_scan_byte_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_byte_offset = + (src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride) >> 3; + dst_scan_byte_offset = + DmiPosCl(dst->UdpA_Base, dst->UdpL_Pos, Y1 - dst->UdpL_Y1) >> 3; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + _BuildClBytes(src->UdpA_Base + src_scan_byte_offset, + src->UdpL_PxlPerScn, src->UdpL_PxlStride >> 3, + dst->UdpA_Base + dst_scan_byte_offset, + src->UdpL_PxlPerScn + 1); + + src_scan_byte_offset += (src->UdpL_ScnStride >> 3); + dst_scan_byte_offset += + (*(unsigned int *)(dst->UdpA_Base+dst_scan_byte_offset) + 2) + * sizeof(unsigned int); + } + return (Success); +} + +/***************************************************************************** +** _CvtBytWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to word array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBytWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((unsigned short *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned char *)(src->UdpA_Base + (src_offset >> 3))); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBytFlt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to floating point +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBytFlt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_byte_offset, dst_scan_float_offset; + int src_byte_offset, dst_float_offset; + int src_scan_byte_stride, src_byte_stride; + int dst_scan_float_stride, dst_float_stride; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_byte_stride = src->UdpL_ScnStride >> 3; + src_byte_stride = src->UdpL_PxlStride >> 3; + dst_scan_float_stride = dst->UdpL_ScnStride / (8 * sizeof(float)); + dst_float_stride = dst->UdpL_PxlStride / (8 * sizeof(float)); + + src_scan_byte_offset = + (src->UdpL_Pos >> 3) + (Y1 - src->UdpL_Y1) * src_scan_byte_stride; + dst_scan_float_offset = + (dst->UdpL_Pos / (8 * sizeof(float))) + + (Y1 - dst->UdpL_Y1) * dst_scan_float_stride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_byte_offset = + src_scan_byte_offset + (X1-src->UdpL_X1) * src_byte_stride; + dst_float_offset = + dst_scan_float_offset + (X1-dst->UdpL_X1) * dst_float_stride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + ((float *)(dst->UdpA_Base))[dst_float_offset] = + (float)((unsigned char *)(src->UdpA_Base))[src_byte_offset]; + + src_byte_offset += src_byte_stride; + dst_float_offset += dst_float_stride; + } + src_scan_byte_offset += src_scan_byte_stride; + dst_scan_float_offset += dst_scan_float_stride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to word array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtWrdWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + char copy_line = src->UdpW_PixelLength == dst->UdpW_PixelLength + && src->UdpW_PixelLength == src->UdpL_PxlStride + && dst->UdpW_PixelLength == dst->UdpL_PxlStride + && src->UdpL_PxlStride == dst->UdpL_PxlStride; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + if( copy_line ) + memcpy( dst->UdpA_Base + (dst_offset >> 3), + src->UdpA_Base + (src_offset >> 3), X2 - X1 + 1 << 1 ); + else + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((unsigned short *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned short *)(src->UdpA_Base + (src_offset >> 3))); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdBs +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to bit string +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtWrdBs( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + PUT_VALUE_( dst->UdpA_Base,dst_offset, + *((unsigned short *)(src->UdpA_Base + src_offset / 8)), + dst_mask ); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdCl +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to change list +** +** The source and destination UDP's must have the same X1 and X2 +** coordinates. (i.e. only full scanlines are processed.) +** +** Data is unconditionally appended at the specified scanline. +** Scanlines must be appended in strict sequence (i.e. no gaps). +** +** The destination buffer (if one exists) is assumed to be +** large enough to hold ScnCnt * worst-case changelist size. +** +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtWrdCl(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int scanline; + int i; + int Y1, Y2; + int src_scan_byte_offset, dst_scan_byte_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_byte_offset = + (src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride) >> 3; + dst_scan_byte_offset = + DmiPosCl(dst->UdpA_Base, dst->UdpL_Pos, Y1 - dst->UdpL_Y1) >> 3; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + _BuildClWords(src->UdpA_Base + src_scan_byte_offset, + src->UdpL_PxlPerScn, src->UdpL_PxlStride >> 4, + dst->UdpA_Base + dst_scan_byte_offset, + src->UdpL_PxlPerScn + 1); + + src_scan_byte_offset += (src->UdpL_ScnStride >> 3); + dst_scan_byte_offset += + (*(unsigned int *)(dst->UdpA_Base+dst_scan_byte_offset) + 2) + * sizeof(unsigned int); + } + return (Success); +} + +/***************************************************************************** +** _CvtWrdByt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to byte array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtWrdByt( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((unsigned char *) (dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned short *)(src->UdpA_Base + (src_offset >> 3))); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdFlt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to floating point +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtWrdFlt( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + *((float *)(dst->UdpA_Base + dst_offset / 8)) = + (float)*((unsigned short *)(src->UdpA_Base + src_offset / 8)); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltFlt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to floating array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtFltFlt( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + char copy_line = src->UdpW_PixelLength == dst->UdpW_PixelLength + && src->UdpW_PixelLength == src->UdpL_PxlStride + && dst->UdpW_PixelLength == dst->UdpL_PxlStride + && src->UdpL_PxlStride == dst->UdpL_PxlStride; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + if( copy_line ) + memcpy( dst->UdpA_Base + (dst_offset >> 3), + src->UdpA_Base + (src_offset >> 3), + (X2 + 1 - X1) * sizeof(float) ); + else + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((float *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((float *)(src->UdpA_Base + (src_offset >> 3))); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltBs +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to bit string +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtFltBs(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + int value; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + value = *((float *)(src->UdpA_Base + src_offset / 8)) + 0.5; + PUT_VALUE_(dst->UdpA_Base,dst_offset,value,dst_mask); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltByt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to byte array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtFltByt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((unsigned char *)(dst->UdpA_Base + dst_offset / 8)) = + *((float *)(src->UdpA_Base + src_offset / 8)) + 0.5; + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to word array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtFltWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + *((float *)(src->UdpA_Base + src_offset / 8)) + 0.5; + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtClCl +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from change list to change list +** +** The source and destination UDP's must have the same X1 and X2 +** coordinates. (i.e. only full scanlines are processed.) +** +** Data is unconditionally appended at the specified scanline. +** Scanlines must be appended in strict sequence (i.e. no gaps). +** +** The destination buffer (if one exists) is assumed to be +** large enough to hold ScnCnt * worst-case changelist size. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtClCl(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int scanline; + int i; + int Y1, Y2; + int src_scan_index, dst_scan_index; + unsigned long length; + + unsigned int *srcptr; + unsigned int *dstptr; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } + srcptr = (unsigned int *)src->UdpA_Base; + dstptr = (unsigned int *)dst->UdpA_Base; + +/* +** Determine maximum common dimensions between source and destination. +*/ + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_index = + DmiPosCl(src->UdpA_Base, src->UdpL_Pos, Y1 - src->UdpL_Y1) / + ( 8 * sizeof(unsigned int)); + dst_scan_index = + DmiPosCl(dst->UdpA_Base, dst->UdpL_Pos, Y1 - dst->UdpL_Y1) / + ( 8 * sizeof(unsigned int)); + + for(scanline = Y1; scanline <= Y2; scanline++ ) + { + length = srcptr[src_scan_index] + 2; + memcpy( &(dstptr[dst_scan_index]), + &(srcptr[src_scan_index]), + length * sizeof(unsigned int)); + + src_scan_index += length; + dst_scan_index += length; + } + return( Success ); +} + +/***************************************************************************** +** _CvtClBs +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from change list to bit string +** +** The source and destination UDP's must have the same X1 and X2 +** coordinates. (i.e. only full scanlines are processed.) +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtClBs(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int scanline; + int i; + int Y1, Y2; + int src_scan_byte_offset, dst_scan_offset; + + long size; + int index; + int offset; + unsigned int *cl_addr; + int status; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + /* Position to proper place in source changelist */ + src_scan_byte_offset = + DmiPosCl(src->UdpA_Base, src->UdpL_Pos, Y1 - src->UdpL_Y1) >> 3; + + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + /* Zero the destination region so we only have to write "1" bits */ + if( (status = DdxFillRegion_( dst, dst->UdpL_X1, Y1, dst->UdpL_PxlPerScn, + Y2 - Y1 + 1, 0 ) ) != Success ) + return( status ); + + if( dst->UdpL_PxlStride == 1 ) + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + DmiPutRuns( dst->UdpA_Base, dst_scan_offset, + src->UdpA_Base + src_scan_byte_offset ); + + src_scan_byte_offset += + (*(unsigned int *)(src->UdpA_Base+src_scan_byte_offset) + 2) + * sizeof(unsigned int); + dst_scan_offset += dst->UdpL_ScnStride; + } + else + /* Need to skip over pixel pad */ + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + cl_addr = (unsigned int *)(src->UdpA_Base+src_scan_byte_offset); + /* + ** While there are elements in the change list write runs + ** of bits into the destination image data buffer. + ** Since data buffer starts out as all 0's, we write only + ** runs of 1's. + */ + for( index = 1; index < cl_addr[0]; index += 2 ) + for( offset = dst_scan_offset + cl_addr[index], + size = cl_addr[index+1]- cl_addr[index]; + size > 0; offset += dst->UdpL_PxlStride, size-- ) + PUT_VALUE_( dst->UdpA_Base, offset, 1, 1 ); + + src_scan_byte_offset += + (*(unsigned int *)(src->UdpA_Base+src_scan_byte_offset) + 1) + * sizeof(unsigned int); + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtClByt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from change list to byte format +** +** The source and destination UDP's must have the same X1 and X2 +** coordinates. (i.e. only full scanlines are processed.) +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtClByt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int scanline; + int i; + int Y1, Y2; + int dst_scan_byte_offset; + + long size; + int index; + int offset; + int status; + + unsigned int *cl_addr = (unsigned int *)src->UdpA_Base; + int byte_stride = dst->UdpL_PxlStride >> 3; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + /* Position to proper place in source changelist */ + cl_addr += (DmiPosCl(src->UdpA_Base, src->UdpL_Pos, Y1 - src->UdpL_Y1) / + (8 * sizeof( int ))); + + dst_scan_byte_offset = + (dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride)/8; + + /* Zero the buffer so we only have to write "1" bits */ + if( (status = DdxFillRegion_( dst, dst->UdpL_X1, Y1, dst->UdpL_PxlPerScn, + Y2 - Y1 + 1, 0 ) ) != Success ) + return( status ); + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + for( index = 1; index < cl_addr[0]; index += 2 ) + for( offset = dst_scan_byte_offset + cl_addr[index], + size = cl_addr[index + 1] - cl_addr[index]; + size > 0; offset += byte_stride, size-- ) + (dst->UdpA_Base)[offset] = 1; + + cl_addr += (cl_addr[0] + 2); + dst_scan_byte_offset += dst->UdpL_ScnStride / 8; + } + return( Success); +} + +/***************************************************************************** +** _CvtClWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from change list to word array +** +** The source and destination UDP's must have the same X1 and X2 +** coordinates. (i.e. only full scanlines are processed.) +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtClWrd(src,dst) +UdpPtr src; +UdpPtr dst; +{ + int scanline; + int i; + int Y1, Y2; + int dst_scan_word_offset; + + long size; + int index; + int offset; + int status; + + unsigned int *cl_addr = (unsigned int *)src->UdpA_Base; + int word_stride = dst->UdpL_PxlStride /(8 * sizeof(short)); +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + /* Position to proper place in source changelist */ + cl_addr += (DmiPosCl(src->UdpA_Base, src->UdpL_Pos, Y1 - src->UdpL_Y1) / + (8 * sizeof( int ))); + + dst_scan_word_offset = + (dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride) + / (8 * sizeof(short)); + + /* Zero the destination region so we only have to write "1" bits */ + if( ( status = DdxFillRegion_( dst, dst->UdpL_X1, Y1, dst->UdpL_PxlPerScn, + Y2 - Y1 + 1, 0 ) ) != Success ) + return( status ); + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + for( index = 1; index < cl_addr[0]; index += 2 ) + for( offset = dst_scan_word_offset + cl_addr[index], + size = cl_addr[index + 1] - cl_addr[index]; + size > 0; offset += word_stride, size-- ) + ((unsigned short *)dst->UdpA_Base)[offset] = 1.0; + + cl_addr += (cl_addr[0] + 2); + dst_scan_word_offset += dst->UdpL_ScnStride / (8 * sizeof(short)); + } + return( Success ); +} + +/***************************************************************************** +** _CvtClFlt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from change list to floating array +** +** The source and destination UDP's must have the same X1 and X2 +** coordinates. (i.e. only full scanlines are processed.) +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtClFlt(src,dst) +UdpPtr src; +UdpPtr dst; +{ + int scanline; + int i; + int Y1, Y2; + int dst_scan_float_offset; + + long size; + int index; + int offset; + int status; + + unsigned int *cl_addr = (unsigned int *)src->UdpA_Base; + int float_stride = dst->UdpL_PxlStride /(8 * sizeof(float)); +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + /* Position to proper place in source changelist */ + cl_addr += (DmiPosCl(src->UdpA_Base, src->UdpL_Pos, Y1 - src->UdpL_Y1) / + (8 * sizeof( int ))); + + dst_scan_float_offset = + (dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride) + / (8 * sizeof(float)); + + /* Zero the destination region so we only have to write "1" bits */ + if( ( status = DdxFillRegion_( dst, dst->UdpL_X1, Y1, dst->UdpL_PxlPerScn, + Y2 - Y1 + 1, 0 ) ) != Success ) + return( status ); + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + for( index = 1; index < cl_addr[0]; index += 2 ) + for( offset = dst_scan_float_offset + cl_addr[index], + size = cl_addr[index + 1] - cl_addr[index]; + size > 0; offset += float_stride, size-- ) + ((float *)dst->UdpA_Base)[offset] = 1.0; + + cl_addr += (cl_addr[0] + 2); + dst_scan_float_offset += dst->UdpL_ScnStride / (8 * sizeof(float)); + } + return( Success ); +} + +/***************************************************************************** +** _CvtBsBsCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit stream to bit stream encoding with CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtBsBsCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask, dst_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; + int bits; + int value; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + /* + ** Copy the bits. + */ + for( pixel = X1; pixel <= X2; pixel++ ) + { + if( GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1) ) + value = GET_VALUE_(src->UdpA_Base, src_offset, src_mask ); + PUT_VALUE_( dst->UdpA_Base, dst_offset, value, dst_mask ); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBsBytCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit string to byte array using cpp +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtBsBytCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if( GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1) ) + *((unsigned char *)(dst->UdpA_Base + dst_offset / 8)) = + GET_VALUE_(src->UdpA_Base, src_offset, src_mask); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBsWrdCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit string to word array using cpp +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtBsWrdCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + GET_VALUE_(src->UdpA_Base,src_offset,src_mask); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBsFltCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit string to float using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtBsFltCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if( GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1) ) + *((float *)(dst->UdpA_Base + dst_offset / 8)) = + (float)GET_VALUE_(src->UdpA_Base, src_offset, src_mask); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBytBytCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to byte array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBytBytCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if( GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1) ) + *((unsigned char *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned char *)(src->UdpA_Base + (src_offset >> 3))); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBytBsCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to bit string using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtBytBsCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if( GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1) ) + PUT_VALUE_(dst->UdpA_Base, dst_offset, + *((unsigned char *)(src->UdpA_Base+src_offset/8)), + dst_mask); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBytWrdCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to word array using a cpp +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp descriptor +** +*****************************************************************************/ +static int _CvtBytWrdCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned short *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned char *)(src->UdpA_Base + (src_offset >> 3))); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBytFltCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to floating point using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBytFltCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if( GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1) ) + *((float *)(dst->UdpA_Base + dst_offset / 8)) = + (float)*((unsigned char *)(src->UdpA_Base + src_offset / 8)); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdWrdCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to word array using a cpp +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp descriptor +** +*****************************************************************************/ +static int _CvtWrdWrdCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } + +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned short *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned short *)(src->UdpA_Base + (src_offset >> 3))); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdBsCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to bit string using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtWrdBsCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } + +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + PUT_VALUE_(dst->UdpA_Base,dst_offset, + *((unsigned short *)(src->UdpA_Base + + src_offset / 8)),dst_mask); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdBytCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to byte array using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp = CPP descriptor +** +*****************************************************************************/ +static int _CvtWrdBytCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned char *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned short *)(src->UdpA_Base + (src_offset >> 3))); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdFltCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to floating point using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtWrdFltCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } + +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((float *)(dst->UdpA_Base + dst_offset / 8)) = + (float)*((unsigned short *)(src->UdpA_Base + + src_offset / 8)); + } + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltFltCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to floating array using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtFltFltCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if( GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1) ) + *((float *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((float*)(src->UdpA_Base + (src_offset >> 3))); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltBsCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to bit string using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtFltBsCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; + int value; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if( GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1) ) + { + value = *((float *)(src->UdpA_Base + src_offset / 8)) + 0.5; + PUT_VALUE_( dst->UdpA_Base, dst_offset, value, dst_mask ); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltBytCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to byte array using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtFltBytCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if( GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1) ) + *((unsigned char *)(dst->UdpA_Base + dst_offset / 8)) = + *((float *)(src->UdpA_Base + src_offset / 8)) + 0.5; + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltWrdCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to word array using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtFltWrdCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + *((float *)(src->UdpA_Base + src_offset /8)) + 0.5; + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConHCBs +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Hard Clip model from float to bit string: +** values < 0 ==> 0.0 +** values > ceiling ==> ceiling +** Round all values to nearest integer. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConHCBs(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + int value; + float ceiling; + float fvalue; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if( fvalue < 0.0 ) /* Clip */ + fvalue = 0.0; + else + if( fvalue > ceiling ) + fvalue = ceiling; + + value = fvalue + 0.5; + PUT_VALUE_( dst->UdpA_Base, dst_offset, value, dst_mask ); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConHCByt +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Hard Clip model from float to unsigned byte: +** values < 0 ==> 0.0 +** values > ceiling ==> ceiling +** Round all values to nearest integer. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConHCByt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + float ceiling; + float fvalue; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if( fvalue < 0.0 ) /* Clip */ + fvalue = 0.0; + else + if( fvalue > ceiling ) + fvalue = ceiling; + + *((unsigned char *)(dst->UdpA_Base + dst_offset / 8)) = fvalue+0.5; + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConHCWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Hard Clip model from float to unsigned word: +** values < 0 ==> 0.0 +** values > ceiling ==> ceiling +** Round all values to nearest integer. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConHCWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + float ceiling; + float fvalue; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if (fvalue < 0.0) /* Clip */ + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + fvalue + 0.5; + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConCSBs +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Clip Scale model from float to bit string: +** values < 0 ==> 0.0 +** values > ceiling ==> ceiling +** Scale such that smallest value -> 0 +** largest value -> ceiling +** +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConCSBs(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + int value; + float ceiling; + float fvalue; + float fmax, fmin, foffset, fscale; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + ceiling = (float)(dst->UdpL_Levels - 1); + + /* Make a pass through the pixels to determine the range of the data */ + fmin = ceiling; + fmax = 0.0; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + /* Clip the data */ + if( fvalue < 0.0 ) + fvalue = 0.0; + else + if( fvalue > ceiling ) + fvalue = ceiling; + + fmax = Max_(fmax,fvalue); + fmin = Min_(fmin,fvalue); + + src_offset += src->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + } + /* Calculate the scale value and offset */ + foffset = fmin; + if( fmax - fmin != 0.0 ) + fscale = ceiling / ( fmax - fmin ); + else + fscale = 1.0; + + /* Scale and convert the data */ + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if( fvalue < 0.0 ) /* Clip */ + fvalue = 0.0; + else + if( fvalue > ceiling ) + fvalue = ceiling; + + value = (fvalue - foffset) * fscale + 0.5; /* Scale */ + PUT_VALUE_(dst->UdpA_Base,dst_offset,value,dst_mask); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return (Success); +} + +/***************************************************************************** +** _ConCSByt +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Clip Scale model from float to bit string: +** values < 0 ==> 0.0 +** values > ceiling ==> ceiling +** Scale such that smallest value -> 0 +** largest value -> ceiling +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConCSByt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + float ceiling; + float fvalue; + float fmax, fmin, foffset, fscale; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + + /* Make a pass through the pixels to determine the range of the data */ + fmin = ceiling; + fmax = 0.0; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if( fvalue < 0.0 ) /* Clip */ + fvalue = 0.0; + else + if( fvalue > ceiling ) + fvalue = ceiling; + + fmax = Max_(fmax,fvalue); + fmin = Min_(fmin,fvalue); + + src_offset += src->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + } + + /* Calculate the scale value and offset */ + foffset = fmin; + if( fmax - fmin != 0.0 ) + fscale = ceiling / ( fmax - fmin ); + else + fscale = 1.0; + + /* Scale and convert the data */ + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if( fvalue < 0.0 ) /* Clip */ + fvalue = 0.0; + else + if( fvalue > ceiling ) + fvalue = ceiling; + + *((unsigned char *)(dst->UdpA_Base + dst_offset / 8)) = + (fvalue - foffset) * fscale + 0.5; /* Scale */ + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return (Success); +} + +/***************************************************************************** +** _ConCSWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Clip Scale model from float to word array: +** values < 0 ==> 0.0 +** values > ceiling ==> ceiling +** Scale such that smallest value -> 0 +** largest value -> ceiling +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConCSWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + float ceiling; + float fvalue; + float fmax, fmin, foffset, fscale; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + +/* +** Make a pass through the pixels to determine the range of the data +*/ + fmin = ceiling; + fmax = 0.0; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if (fvalue < 0.0) /* Clip */ + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + fmax = Max_(fmax,fvalue); + fmin = Min_(fmin,fvalue); + + src_offset += src->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + } + +/* +** Calculate the scale value and offset +*/ + foffset = fmin; + if ((fmax-fmin) != 0.0) + fscale = ceiling/(fmax-fmin); + else + fscale = 1.0; + +/* +** Scale and convert the data +*/ + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if (fvalue < 0.0) /* Clip */ + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + (fvalue - foffset) * fscale + 0.5; /* Scale */ + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConHSBs +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Hard Scale model from float to bit string: +** Scale such that smallest value -> 0 +** largest value -> ceiling +** +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConHSBs(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + int value; + float ceiling; + float fvalue; + float fmax, fmin, foffset, fscale; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + ceiling = (float)(dst->UdpL_Levels - 1); + + /* Make a pass through the pixels to determine the range of the data */ + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + + fmin = *((float *)(src->UdpA_Base + (src_scan_offset + + (X1-src->UdpL_X1) * src->UdpL_PxlStride)/ 8)); + fmax = fmin; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + fmax = Max_(fmax,fvalue); + fmin = Min_(fmin,fvalue); + + src_offset += src->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + } + /* Calculate the scale value and offset */ + foffset = fmin; + if( fmax - fmin != 0.0 ) + fscale = ceiling / ( fmax - fmin ); + else + fscale = 1.0; + + /* Scale and convert the data */ + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + value = (fvalue - foffset) * fscale + 0.5; /* Scale */ + PUT_VALUE_(dst->UdpA_Base,dst_offset,value,dst_mask); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConHSByt +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Hard Scale model from float to bit string: +** Scale such that smallest value -> 0 +** largest value -> ceiling +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConHSByt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + float ceiling; + float fvalue; + float fmax, fmin, foffset, fscale; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + + /* Make a pass through the pixels to determine the range of the data */ + fmin = *((float *)(src->UdpA_Base + (src_scan_offset + + (X1-src->UdpL_X1) * src->UdpL_PxlStride)/ 8)); + fmax = fmin; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + fmax = Max_(fmax,fvalue); + fmin = Min_(fmin,fvalue); + + src_offset += src->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + } + + /* Calculate the scale value and offset */ + foffset = fmin; + if( fmax - fmin != 0.0 ) + fscale = ceiling / ( fmax - fmin ); + else + fscale = 1.0; + + /* Scale and convert the data */ + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + *((unsigned char *)(dst->UdpA_Base + dst_offset / 8)) = + (fvalue - foffset) * fscale + 0.5; /* Scale */ + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return ( Success ); +} + +/***************************************************************************** +** _ConHSWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Hard Scale model from float to word array: +** Scale such that smallest value -> 0 +** largest value -> ceiling +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConHSWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + float ceiling; + float fvalue; + float fmax, fmin, foffset, fscale; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + +/* +** Make a pass through the pixels to determine the range of the data +*/ + fmin = *((float *)(src->UdpA_Base + (src_scan_offset + + (X1-src->UdpL_X1) * src->UdpL_PxlStride)/ 8)); + fmax = fmin; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + fmax = Max_(fmax,fvalue); + fmin = Min_(fmin,fvalue); + + src_offset += src->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + } + +/* +** Calculate the scale value and offset +*/ + foffset = fmin; + if ((fmax-fmin) != 0.0) + fscale = ceiling/(fmax-fmin); + else + fscale = 1.0; + +/* +** Scale and convert the data +*/ + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + (fvalue - foffset) * fscale + 0.5; /* Scale */ + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/************************************************************************ +** +** FUNCTIONAL DESCRIPTION: +** +** This routine builds a change list from a buffer of image data, +** where the buffer contains pixels of an arbitrary bit length. +** Run length transitions are detected by alternately searching for zero +** pixels or one pixels. Bit offsets where the transitions take place +** are stored in subsequent entries in the change list. +** +** FORMAL PARAMETERS: +** +** src_addr; - scanline buffer address +** src_pos; - scanline buffer offset (in bits) +** size; - scanline buffer length (in pixels) +** stride; - the source pixel stride +** cl_addr; - change list address (ptr to array of long) +** cl_len; - chane list length (num of cells in array) +** +************************************************************************/ +static void _BuildClBits( src_addr, src_pos, size, stride, cl_addr, cl_len ) +long src_addr; +long src_pos; +long size; +long stride; +long cl_addr; +long cl_len; +{ + long pos; + long end; + int index; + unsigned int *cl; + + + cl = (unsigned int *) cl_addr; + end = src_pos + size * stride; + pos = src_pos; + + /* + ** While there's room in the changlist and data to search, find + ** transitions and load them into the change list. + */ + for( index = 1; index < cl_len && size > 0; index++, size = end - pos ) + { + if( index % 2 ) + /* + ** look for a transition to a 1 bit + */ + while( pos < end ) + { + if( GET_VALUE_(src_addr, pos, 1 ) == 1 ) + break; + pos += stride; + } + else + /* + ** look for a transition to a 0 bit + */ + while( pos < end ) + { + if( GET_VALUE_(src_addr, pos, 1 ) == 0 ) + break; + pos += stride; + } + /* + ** save the transition point in the changelist + */ + cl[index] = (pos - src_pos)/stride; + } + /* + ** store the number of valid entries + */ + cl[0] = --index; +} /* end _BuildClBits */ + +/************************************************************************ +** +** FUNCTIONAL DESCRIPTION: +** +** This routine builds a change list from a buffer of image data, +** where the buffer contains byte-length pixels. +** Run length transitions are detected by alternately searching for zero +** pixels or one pixels. Pixel offsets where the transitions take place +** are stored in subsequent entries in the change list. +** +** FORMAL PARAMETERS: +** +** src_addr; - scanline buffer address +** size; - scanline buffer length (in pixels) +** stride; - pixel stride (bytes) +** cl_addr; - change list address (ptr to array of long) +** cl_len; - change list length (num of cells in array) +** +************************************************************************/ +static void _BuildClBytes( src_addr, size, stride, cl_addr, cl_len ) +unsigned char *src_addr; +long size; +long stride; +long cl_addr; +long cl_len; +{ + long pos; + long end; + int index; + unsigned int *cl; + + cl = (unsigned int *) cl_addr; + end = size * stride; + pos = 0; + + /* + ** While there's room in the changlist and data to search, find + ** transitions and load them into the change list. + */ + for( index = 1; index < cl_len && size > 0; index++, size = end - pos ) + { + if( index % 2 ) + /* + ** look for a transition to a 1 bit + */ + while( pos < end ) + { + if( src_addr[pos] == 1 ) + break; + pos += stride; + } + else + /* + ** look for a transition to a 0 bit + */ + while( pos < end ) + { + if( src_addr[pos] == 0 ) + break; + pos += stride; + } + /* + ** save the transition point in the changelist + */ + cl[index] = pos/stride; + } + /* + ** store the number of valid entries + */ + cl[0] = --index; +} /* end _BuildCLBytes */ + +/************************************************************************ +** +** FUNCTIONAL DESCRIPTION: +** +** This routine builds a change list from a buffer of image data, +** where the buffer contains word-length pixels. +** Run length transitions are detected by alternately searching for zero +** pixels or one pixels. Pixel offsets where the transitions take place +** are stored in subsequent entries in the change list. +** +** FORMAL PARAMETERS: +** +** src_addr; - scanline buffer address +** size; - scanline buffer length (in pixels) +** stride; - pixel stride (words) +** cl_addr; - change list address (ptr to array of long) +** cl_len; - change list length (num of cells in array) +** +************************************************************************/ +static void _BuildClWords( src_addr, size, stride, cl_addr, cl_len ) +unsigned short *src_addr; +long size; +long stride; +long cl_addr; +long cl_len; +{ + long pos; + long end; + int index; + unsigned int *cl; + + cl = (unsigned int *) cl_addr; + end = size * stride; + pos = 0; + + /* + ** While there's room in the changlist and data to search, find + ** transitions and load them into the change list. + */ + for( index = 1; index < cl_len && size > 0; index++, size = end - pos ) + { + if( index % 2 ) + /* + ** look for a transition to a 1 bit + */ + while( pos < end ) + { + if( src_addr[pos] == 1 ) + break; + pos += stride; + } + else + /* + ** look for a transition to a 0 bit + */ + while( pos < end ) + { + if( src_addr[pos] == 0 ) + break; + pos += stride; + } + /* + ** save the transition point in the changelist + */ + cl[index] = pos/stride; + } + /* + ** store the number of valid entries + */ + cl[0] = --index; +} /* end _BuildCLWords */ +/* end Module DmiConvert */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/DmiConvert.h b/xie/docs/dec/xie23-src/server/xie/smi/DmiConvert.h new file mode 100644 index 0000000..15be80b --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/DmiConvert.h @@ -0,0 +1,106 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/******************************************************************************* +** Copyright (c) Digital Equipment Corporation, 1990 All Rights Reserved. +** Unpublished rights reserved under the copyright laws of the United States. +** The software contained on this media is proprietary to and embodies the +** confidential technology of Digital Equipment Corporation. Possession, use, +** duplication or dissemination of the software and media is authorized only +** pursuant to a valid written license from Digital Equipment Corporation. + +** RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the U.S. +** Government is subject to restrictions as set forth in Subparagraph +** (c)(1)(ii) of DFARS 252.227-7013, or in FAR 52.227-19, as applicable. +** +** Derived from work bearing the following copyright and permissions: +** +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Digital Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the CONVERT module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** +** AUTHOR(S): +** +** Richard Hennessy +** +** CREATION DATE: +** +** September 25, 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _DMICONVERT +#define _DMICONVERT + + /* + ** Include files + */ + + /* + ** Function reference + */ +extern int DmiConvert(); +extern int DmiConvertCpp(); +extern int DmiCopy(); +extern int DmiCopyCpp(); +extern int DmiGetTyp(); +extern int DmiPosCl(); + +#endif _DMICONVERT diff --git a/xie/docs/dec/xie23-src/server/xie/smi/DmiDdx.c b/xie/docs/dec/xie23-src/server/xie/smi/DmiDdx.c new file mode 100644 index 0000000..9196a98 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/DmiDdx.c @@ -0,0 +1,536 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright (c) Digital Equipment Corporation, 1990 All Rights Reserved. +** Unpublished rights reserved under the copyright laws of the United States. +** The software contained on this media is proprietary to and embodies the +** confidential technology of Digital Equipment Corporation. Possession, use, +** duplication or dissemination of the software and media is authorized only +** pursuant to a valid written license from Digital Equipment Corporation. + +** RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the U.S. +** Government is subject to restrictions as set forth in Subparagraph +** (c)(1)(ii) of DFARS 252.227-7013, or in FAR 52.227-19, as applicable. +** +** Derived from work bearing the following copyright and permissions: +** +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Image Extension +** Digital Machine Independant DDX +** +** ABSTRACT: +** +** This module implements the connection between the +** XIE server DIX, and the XIE server DMI (Digital Machine +** Independent) DDX. This interface is used when the +** DIX is layered directly on top of the DMI DDX. If +** the DIX is layered on a hardware specific DDX, then the +** interface in the module DmiMi is used by the hardware +** specific DDX to access DMI services. +** +** The connection consists of: +** - dispatch tables +** - DDX supplied Init Reset and OptimizePipe routines +** - Default DDX image array alignment function +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 > +** ULTRIX V4.0 > +** +** AUTHOR(S): +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Tue Oct 9 09:23:16 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ + +/* +** Include files +*/ +#ifdef VMS +#include +#endif +#include +#include +#include + /* + ** Include needed DDX, SMI, MI entry points + */ +#include +#include +#include "DmiChangeList.h" +#include +#include +#include +#include +#include "DmiConvert.h" +#include + +#ifndef XIESMI +#define XIESMI /* Use the XIESMI-style definitions in the DCT code */ +#endif +#include /* Must be before DCT files */ +#include +#include +#undef XIESMI +#include "DmiDecodeG4.h" +#include +#include "DmiExtendInstruct.h" +#include +#include "DmiFill.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "DmiPoint.h" +#include +#include "DmiScale.h" +#include +#include +#include +#include "DmiUtil.h" + +/* +** Table of contents +*/ +int DmiAlignDefault(); /* DDX image array alignment */ +int DmiInitialize(); /* DDX Init */ +int DmiOptimizePipe(); /* DDX specific pipe optimizer */ +int DmiReset(); /* DDX Reset */ + + +/* +** MACRO definitions +*/ + +/* +** Equated Symbols +*/ +#ifdef VMS +#define XIE_PRODUCT_NAME "IMAGE-XIE-SERV-V" +#define XIE_PRODUCER "DEC" +#define XIE_PRODUCT_RELEASE_DATE "05-AUG-1991" +#define XIE_VERSION_MAJOR 1 +#define XIE_VERSION_MINOR 0 +#endif + +/* +** External References +*/ + +/* +** Local Storage +*/ + +/***************************************************************************** +** xieDdxProc - +** +** FUNCTIONAL DESCRIPTION: +** +** XieDdxProc is the DDX dispatch table, used by all callers of +** functions implemented by the DDX. +** +** This table should be accessed using the macros defined in XieDdx.h. +** +*****************************************************************************/ +externaldef(xieDdxProc) unsigned long (*xieDdxProc[])() = { + (Fcard32)SmiArea, /* 0 Protocol operations */ + (Fcard32)SmiStatsArea, + (Fcard32)SmiArithmetic, + (Fcard32)SmiHistogram, + (Fcard32)DmiConvert, + (Fcard32)DmiConvert, /* 5 */ + (Fcard32)SmiCompare, + (Fcard32)SmiConstrain, + (Fcard32)DmiCopy, + (Fcard32)SmiDither, + (Fcard32)DmiFill, /* 10 */ + (Fcard32)SmiLogical, + (Fcard32)SmiLuminance, + (Fcard32)SmiMatchHistogram, + (Fcard32)SmiMath, + (Fcard32)SmiMirror, /* 15 */ + (Fcard32)DmiPoint, + (Fcard32)SmiStatsPoint, + (Fcard32)SmiRotate, + (Fcard32)DmiScale, + (Fcard32)SmiTranslate, /* 20 */ + + (Fcard32)RmOwnData, /* 21..32 -- was compression handlers */ + NULL, + NULL, + NULL, + NULL, /* 25 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 30 */ + NULL, + NULL, + + (Fcard32)DmiInitialize, /* DDX specific functions */ + (Fcard32)DmiReset, + (Fcard32)DmiOptimizePipe, /* 35 */ + + (Fcard32)DmiConvert, /* MI Support routines */ + (Fcard32)DmiCopy, + (Fcard32)DmiGetTyp, + (Fcard32)DmiCopyBits, + (Fcard32)DmiResolveUdp, /* 40 */ +#ifdef CLIENT + (Fcard32)XieCalloc, /* CLIENT needs to use Xie */ + (Fcard32)XieCallocBits, + (Fcard32)XieCfree, + (Fcard32)XieFree, + (Fcard32)XieFreeBits, /* 45 */ + (Fcard32)XieMalloc, + (Fcard32)XieMallocBits, + (Fcard32)XieRealloc, + (Fcard32)XieReallocBits, +#else + (Fcard32)SmiCalloc, /* Memory mgt routines */ + (Fcard32)SmiCallocBits, + (Fcard32)SmiCfree, + (Fcard32)SmiFree, + (Fcard32)SmiFreeBits, /* 45 */ + (Fcard32)SmiMalloc, + (Fcard32)SmiMallocBits, + (Fcard32)SmiRealloc, + (Fcard32)SmiReallocBits, +#endif + (Fcard32)SmiCreatePipeline, /* 50 Pipeline routines */ + (Fcard32)SmiDestroyPipeline, + (Fcard32)SmiPipeHasYielded, + (Fcard32)SmiInitiatePipeline, + (Fcard32)SmiResumePipeline, + (Fcard32)SmiFlushPipeline, /* 55 */ + (Fcard32)SmiAbortPipeline, + + (Fcard32)RmAllocData, /* Pipe rsrc mgr routines*/ + (Fcard32)RmAllocDataDesc, + (Fcard32)RmAllocPermDesc, + (Fcard32)RmAllocRefDesc, /* 60 */ + (Fcard32)RmBestDType, + (Fcard32)RmCreateDrain, + (Fcard32)RmCreateSink, + (Fcard32)RmDeallocData, + (Fcard32)RmDeallocDataDesc, /* 65 */ + (Fcard32)RmDestroyDrain, + (Fcard32)RmDestroySink, + (Fcard32)RmGetData, + (Fcard32)RmGetDType, + (Fcard32)RmGetMaxQuantum, /* 70 */ + (Fcard32)RmGetQuantum, + (Fcard32)RmHasQuantum, + (Fcard32)RmInitializePort, + NULL, + (Fcard32)RmMergeBuffers, /* 75 */ + (Fcard32)RmObtainQuantum, + (Fcard32)RmPutData, + (Fcard32)RmSetDType, + (Fcard32)RmSetQuantum, + (Fcard32)RmSplitBuffers, /* 80 */ + + (Fcard32)SchedProcessComplete, /* Pipe schedule funcs */ + (Fcard32)SchedProcessReady, + (Fcard32)SchedOkToRun, + + (Fcard32)DmiBuildChangeList, /* Change list funcs */ + (Fcard32)DmiPutRuns, /* 85 */ + (Fcard32)_DmiFfsLong, + (Fcard32)_DmiFfcLong, + + (Fcard32)DmiFillRegion, /* Additions */ + (Fcard32)DmiConvertCpp, + (Fcard32)DmiCopyCpp, /* 90 */ + (Fcard32)SmiEncodeG4, + (Fcard32)SmiEncodeDct, + (Fcard32)DmiDecodeG4, + (Fcard32)SmiDecodeDct, + (Fcard32)DmiPosCl, /* 95 */ + (Fcard32)DmiCheckLicense, + /* More RM functions */ + (Fcard32)RmAllocCmpDataDesc, + (Fcard32)RmSetAlignment, + (Fcard32)RmCreateDataDesc, + + (Fcard32)SmiCreatePipeCtx, /* 100 */ + (Fcard32)DmiUsingCL, + (Fcard32)DmiCmpPreferred, + (Fcard32)RmAllocDataArray, + (Fcard32)RmAllocCmpPermDesc, + (Fcard32)SchedProcessNoInput, /* 105 */ + NULL + }; + +/***************************************************************************** +** XieDdxSetup - +** +** FUNCTIONAL DESCRIPTION: +** +** XieDdxSetup is the DDX dispatch table used to call the DDX Create +** Pipe Element routines. +** +** These routines should be called using the macros defined in XieDdx.h. +** +*****************************************************************************/ +externaldef(xieDdxSetup) card32 (*xieDdxSetup[])() = { + (Fcard32)SmiCreateArea, /* 0 */ + (Fcard32)SmiCreateArithmetic, + (Fcard32)SmiCreateChromeCom, + (Fcard32)SmiCreateChromeSep, + (Fcard32)SmiCreateCompare, + (Fcard32)SmiCreateConstrain, /* 5 */ + (Fcard32)SmiCreateCrop, + (Fcard32)SmiCreateDither, + (Fcard32)DmiCreateFill, + (Fcard32)SmiCreateLogical, + (Fcard32)SmiCreateLuminance, /* 10 */ + (Fcard32)SmiCreateMatchHistogram, + (Fcard32)SmiCreateMath, + (Fcard32)SmiCreateMirror, + (Fcard32)DmiCreatePoint, + (Fcard32)SmiCreateRotate, /* 15 */ + (Fcard32)DmiCreateScale, + (Fcard32)SmiCreateTranslate, + (Fcard32)SmiCreateDecodeDct, + (Fcard32)SmiCreateEncodeDct, + (Fcard32)DmiCreateDecodeG4, /* 20 */ + (Fcard32)SmiCreateEncodeG4, + NULL + }; + +/***************************************************************************** +** XieDdxAlign - +** +** FUNCTIONAL DESCRIPTION: +** +** XieDdxAlign is the DDX dispatch table used to call the +** DDX image array alignment functions. +** +** A NULL value is used by alignment logic throughout the XIE server +** to indicate "don't care", "no alignment needed". +** +** If alignment is needed, an alignment function must entered in this +** table in the operator/pipeline element named slot. +** +** These functions should be called using the macros defined in XieDdx.h. +** +*****************************************************************************/ +externaldef(xieDdxAlign) card32 (*xieDdxAlign[])() = { + (Fcard32)DmiAlignDefault, /* 0 */ + (Fcard32)DmiAlignDefault, + (Fcard32)DmiAlignDefault, + (Fcard32)DmiAlignDefault, + (Fcard32)DmiAlignDefault, + (Fcard32)DmiAlignDefault, /* 5 */ + (Fcard32)DmiAlignDefault, + (Fcard32)DmiAlignDefault, + (Fcard32)DmiAlignDefault, + (Fcard32)DmiAlignDefault, + (Fcard32)DmiAlignDefault, /* 10 */ + (Fcard32)DmiAlignDefault, + (Fcard32)DmiAlignDefault, + (Fcard32)DmiAlignDefault, + (Fcard32)DmiAlignDefault, + (Fcard32)DmiAlignDefault, /* 15 */ + (Fcard32)DmiAlignDefault, + (Fcard32)DmiAlignDefault, + (Fcard32)DmiAlignDefault, + (Fcard32)DmiAlignDefault, + (Fcard32)DmiAlignDefault, /* 20 */ + (Fcard32)DmiAlignDefault, + (Fcard32)DmiAlignDefault, + (Fcard32)DmiAlignDefault, + NULL + }; + +/******************************************************************************* +** DmiAlignDefault - +** +** FUNCTIONAL DESCRIPTION: +** +** This function performs DDX specific image array alignment adjustments +** on the passed Udp's pixel stride and scanline stride. +** +** FORMAL PARAMETERS: +** +** udp == ptr to the Udp which will be aligned +** +** FUNCTION VALUE: +** +** status == Success, if everything ok +** +*******************************************************************************/ +int DmiAlignDefault( udp ) +UdpPtr udp; +{ +#define SCN_PAD 32 /* default: longword aligned scanlines */ +#define SCN_MSK (SCN_PAD-1) + + if( upScnStr_(udp) > 0 ) + { + upScnStr_(udp) = upPxlStr_(udp) * upWidth_(udp) + SCN_MSK & ~SCN_MSK; + upArSize_(udp) = upScnStr_(udp) * upHeight_(udp) + upPos_(udp); + } + return( Success ); +} + +/******************************************************************************* +** DmiInitialize - +** +** FUNCTIONAL DESCRIPTION: +** +** Perform DDX-specific initializations. +** Since this is a software-only DDX, the only initialization +** required is to perform the LMF license check. +** +** The Dmi DDX is layered on top of the Smi DDX, so this routine +** could be responsible for building the above tables at runtime. +** But, since it is unlikely we'll ever need more than two levels +** of Mi DDX, everything is hardwired. +** +** FORMAL PARAMETERS: +** +** None. +** +** FUNCTION VALUE: +** +** 0 = DDX init successful +** non 0 = failure +** +*******************************************************************************/ +int DmiInitialize() +{ +#ifdef VMS + static char first_time = TRUE; + + if( first_time && getenv("XIE_DEBUG") != NULL ) + { /* + ** It saves time to have the server mostly running before + ** invoking the debugger. + */ + first_time = FALSE; + LIB$SIGNAL(SS$_DEBUG); + } +#endif + +#ifdef NEVER + return ( DdxCheckLicense_( XIE_PRODUCT_NAME, + XIE_PRODUCER, + XIE_PRODUCT_RELEASE_DATE, + XIE_VERSION_MAJOR, + XIE_VERSION_MINOR ) ); +#else + return( Success ); /* No separate XIE license for now */ +#endif +} + +/******************************************************************************* +** DmiOptimizePipe - +** +** FUNCTIONAL DESCRIPTION: +** +** Perform DDx-specific XIE pipeline optimizations. +** +** FORMAL PARAMETERS: +** +** None. +** +** FUNCTION VALUE: +** +** 0 = Pipeline optimization successful +** non 0 = failure +** +*******************************************************************************/ +int DmiOptimizePipe() +{ + return( Success ); +} + +/******************************************************************************* +** DmiReset - +** +** FUNCTIONAL DESCRIPTION: +** +** Perform DDX-specific reset actions. +** If an accelerator exists, get it too. +** +** FORMAL PARAMETERS: +** +** None. +** +** FUNCTION VALUE: +** +** 0 = DDX reset successful +** non 0 = failure +** +*******************************************************************************/ +int DmiReset() +{ + return( Success ); +} +/* End of DmiDdx.c */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/DmiDecodeG4.c b/xie/docs/dec/xie23-src/server/xie/smi/DmiDecodeG4.c new file mode 100644 index 0000000..f1320dd --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/DmiDecodeG4.c @@ -0,0 +1,1298 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright (c) Digital Equipment Corporation, 1990 All Rights Reserved. +** Unpublished rights reserved under the copyright laws of the United States. +** The software contained on this media is proprietary to and embodies the +** confidential technology of Digital Equipment Corporation. Possession, use, +** duplication or dissemination of the software and media is authorized only +** pursuant to a valid written license from Digital Equipment Corporation. + +** RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the U.S. +** Government is subject to restrictions as set forth in Subparagraph +** (c)(1)(ii) of DFARS 252.227-7013, or in FAR 52.227-19, as applicable. +** +** Derived from work bearing the following copyright and permissions: +** +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Digital Machine Independant DDX +** +** ABSTRACT: +** +** This module implements decompression of G4 Facsimile encoded data. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHORS: +** +** Gary Grebus (cloned from SmiDecodeG4.c) +** John Weber +** Derived from code originally developed by Ken MacDonald +** +** CREATION DATE: +** +** Fri Oct 5 16:01:43 1990 +** +*******************************************************************************/ + +#include + +#include +#include +#include + +#include "DmiDecodeG4.h" +#include + +/* +** Table of contents +*/ +int DmiDecodeG4(); + +int DmiCreateDecodeG4(); +static int _DecodeG4Initialize(); +static int _DecodeG4Activate(); +static int _DecodeG4Abort(); +static int _DecodeG4Destroy(); + +static int _DecodeG4Segment(); +static DecodeG4StatePtr _InitializeG4State(); +static void _DestroyG4State(); +static int _DecodeG4ToBits(); +static int _DecodeG4ToCl(); + +#if defined(VMS) +extern int _DecodeG4Process(); +#else +static int _DecodeG4Process(); +#endif +static int _PadG4Segment(); +static int _SaveSourceData(); + +/* +** Equated Symbols +*/ +#define Min_(a,b) ((ab) ? (a) : (b)) + +/* +** External References +*/ + +/* +** Local storage +*/ + /* + ** DecodeG4 Element Vector + */ +static PipeElementVector DecodeG4PipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeDecodeG4Element, /* Structure subtype */ + sizeof(DecodeG4PipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _DecodeG4Initialize, /* Initialize entry */ + _DecodeG4Activate, /* Activate entry */ + _DecodeG4Abort, /* Flush entry */ + _DecodeG4Destroy, /* Destroy entry */ + _DecodeG4Abort /* Abort entry */ + }; + +/***************************************************************************** +** DmiDecodeG4 +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int DmiDecodeG4( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + DecodeG4StatePtr state; + int status; + + /* + ** Initialize state record fields. + */ + state = _InitializeG4State(dst); + if (!IsPointer_(state) ) return( (int) state); + + state->srcpos = upPos_(src); + /* + ** Decode the entire buffer as a single segment. + */ + status = _DecodeG4Segment( src, dst, state, TRUE ); + _DestroyG4State( state ); + + return(status==G4K_StsDstFul || status==G4K_StsEoi ? Success : BadValue); +} /* end DmiDecodeG4 */ + +/***************************************************************************** +** DmiCreateDecodeG4 +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int DmiCreateDecodeG4( pipe, src, dst ) + Pipe pipe; + PipeSinkPtr src; + PipeSinkPtr dst; +{ + DecodeG4PipeCtxPtr ctx = (DecodeG4PipeCtxPtr) + DdxCreatePipeCtx_( pipe, &DecodeG4PipeElement, TRUE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + /* + ** Build our DecodeG4 Pipe Ctx from the arguments passed in. + */ + DG4SrcSnk_(ctx) = src; + DG4DstSnk_(ctx) = dst; + /* + ** Create a drain which reads component 0. + */ + DG4SrcDrn_(ctx) = DdxRmCreateDrain_( src, 1 ); + if( !IsPointer_(DG4SrcDrn_(ctx)) ) return((int) DG4SrcDrn_(ctx) ); + /* + ** Process any amount of encoded data, output bits or changelists. + */ + DdxRmSetQuantum_( DG4SrcDrn_(ctx), 0 ); + DdxRmSetDType_( DG4SrcDrn_(ctx), UdpK_DTypeV, DtM_V ); + + DdxRmSetQuantum_( dst, 0 ); + DdxRmSetDType_( dst, UdpK_DTypeUndefined, DtM_VU|DtM_CL ); + + return( Success ); +} /* end of DmiCreateDecodeG4 */ + +/***************************************************************************** +** _DecodeG4Initialize +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _DecodeG4Initialize( ctx ) + DecodeG4PipeCtxPtr ctx; +{ + int status; + int bytes_per_scan, quantum; + + /* + ** Initialize the source Drain. + */ + status = DdxRmInitializePort_( CtxHead_(ctx), DG4SrcDrn_(ctx) ); + if( status != Success ) return( status ); + CtxInp_(ctx) = DG4SrcDrn_(ctx); + VecNoInpt_(CtxVecPtr_(ctx)) = FALSE; + /* + ** Initialize the destination Sink. + */ + status = DdxRmInitializePort_( CtxHead_(ctx), DG4DstSnk_(ctx) ); + if( status != Success ) return( status ); + + /* + ** If the next element in the pipeline has a zero input quantum, + ** we should set a sink quantum to avoid decompressing the image in + ** one lump. This is a necessity for changelists, since they require + ** such overallocation. + ** Attempt to bound the quantum to 64KB chunks. + */ + bytes_per_scan = (SnkDtyp_(DG4DstSnk_(ctx)) == UdpK_DTypeCL) ? + (SnkWidth_(DG4DstSnk_(ctx),0) + 2) * sizeof(int) : + ((SnkScnStr_(DG4DstSnk_(ctx),0)+7)&~7) >> 3; + quantum = Min_(SnkHeight_(DG4DstSnk_(ctx),0), + Max_(64 * 1024 / bytes_per_scan,1)); + DdxRmSetQuantum_( DG4DstSnk_(ctx), quantum ); + + /* + ** Create a destination descriptor. + */ + DG4DstDat_(ctx) = DdxRmAllocData_( DG4DstSnk_(ctx), 0, 0, + DdxRmGetMaxQuantum_(DG4DstSnk_(ctx)) ); + if( !IsPointer_(DG4DstDat_(ctx)) ) + return((int)DG4DstDat_(ctx)); + DG4NewDst_(ctx) = TRUE; + /* + ** Create a decode state. + */ + DG4SteBlk_(ctx) = _InitializeG4State(SnkUdpPtr_(DG4DstSnk_(ctx),0), + DatDatTyp_(DG4DstDat_(ctx))); + if( !IsPointer_(DG4SteBlk_(ctx))) return((int) DG4SteBlk_(ctx) ); + + return( status ); +} /* end of _DecodeG4Initialize */ + + +/***************************************************************************** +** _DecodeG4Activate +** +** FUNCTIONAL DESCRIPTION: +** +** Decode some data. If we already have a source segment in progress, +** decode from it, otherwise get another source segment. We'll decode until +** we run out of source segments, create one quantum of +** destination data, or hit a decoding error. +** +** In the case of changelists, the destination data segments must be +** large enough to hold a worst-case scanline (change at every pixel). +** Since this usually results in massive overallocation, we apply the +** "changelist packing" optimization. This can actually produce more than +** a quantum's worth of scanlines. +** +** If the compressed data stream ends before the expected last line of +** the image, we will pad the image with zero filled scanlines (or +** equivalent changelists). Multiple quantums of scanlines may be +** produced in this case. +** +** FORMAL PARAMETERS: +** ctx - DecodeG4 pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _DecodeG4Activate( ctx ) + DecodeG4PipeCtxPtr ctx; +{ + PipeDataPtr src; + int h, y, s; + int oneCLbits; + int scnrem; + int curpos; + int status; + + if( VecNoInpt_(CtxVecPtr_(ctx)) && DdxPipeHasYielded_(CtxHead_(ctx)) ) + { /* + ** We already have source data but aren't allowed to process it. + */ + if( !DatOwned_(DG4SrcDat_(ctx)) ) + _SaveSourceData(ctx); + return( Success ); + } + + if( IsPointer_(DG4DstDat_(ctx)) && + DatDatTyp_(DG4DstDat_(ctx)) == UdpK_DTypeCL) + { + oneCLbits = + (SnkWidth_(DG4SrcSnk_(ctx),0) + 2 ) * sizeof(unsigned int) * 8; + scnrem = DatHeight_(DG4DstDat_(ctx)); + curpos = DatPos_(DG4DstDat_(ctx)); + } + + + do { /* + ** Decode data until source exhausted, destination full, or error. + */ + if( !VecNoInpt_(CtxVecPtr_(ctx)) ) + { /* + ** Get a chunk of encoded data. + */ + DG4SrcDat_(ctx) = DdxRmGetData_( ctx, DG4SrcDrn_(ctx) ); + if( !IsPointer_(DG4SrcDat_(ctx)) ) return( (int) DG4SrcDat_(ctx) ); + DG4SteBlk_(ctx)->srcpos = DatPos_(DG4SrcDat_(ctx)); + VecNoInpt_(CtxVecPtr_(ctx)) = TRUE; + } + + /* + ** No destination data segment means we have already returned the + ** the last scanline of the image, or there is a bug somewhere. + ** Tolerate the client being confused or having a slightly bogus + ** G4 stream by discarding any data and returning success. + */ + if( !IsPointer_(DG4DstDat_(ctx)) ) + { + DG4SrcDat_(ctx) = DdxRmDeallocData_(DG4SrcDat_(ctx)); + VecNoInpt_(CtxVecPtr_(ctx)) = FALSE; + break; + } + + /* + ** Call the decoder. + */ + if ( !DG4SteBlk_(ctx)->pad_flag ) + s = _DecodeG4Segment( DatUdpPtr_(DG4SrcDat_(ctx)), + DatUdpPtr_(DG4DstDat_(ctx)), + DG4SteBlk_(ctx), DG4NewDst_(ctx) ); + else + s = _PadG4Segment( DatUdpPtr_(DG4DstDat_(ctx)), + DatY1_(DG4DstDat_(ctx)) ); + + DG4NewDst_(ctx) = FALSE; + + switch( s ) + { + case G4K_StsDstFul : + + if (DatDatTyp_(DG4DstDat_(ctx)) == UdpK_DTypeCL ) + { + /* + ** For changelists, the data buffer will usually be massively + ** overallocated. Therefore, as long as there is space for + ** at least one worst-case changelist left in the buffer + ** we'll keep advancing the Y2 value of the data segment and + ** decoding more data. + */ + curpos = DdxPosCl_(DatBase_(DG4DstDat_(ctx)), curpos, scnrem); + scnrem = (DatArSize_(DG4DstDat_(ctx)) - curpos) / oneCLbits; + + if (DatY2_(DG4DstDat_(ctx)) + scnrem + > SnkY2_(DG4SrcSnk_(ctx),0)) + /* Gotta stop at the end of the image */ + scnrem = SnkY2_(DG4SrcSnk_(ctx),0) - DatY2_(DG4DstDat_(ctx)); + + if (scnrem > 0 ) + { + DatY2_(DG4DstDat_(ctx)) += scnrem; + DatHeight_(DG4DstDat_(ctx)) += scnrem; + s = G4K_StsSrcExh; /* dest isn't full anymore! */ + continue; /* the do-while loop */ + } + } + /* Drop through */ + case G4K_StsEoi : + + /* + ** Pass along all the PCM data we've decompressed + */ + status = Success; + y = DatY2_(DG4DstDat_(ctx)); + status = DdxRmPutData_( DG4DstSnk_(ctx), DG4DstDat_(ctx) ); + + if( status == Success && y++ < SnkY2_(DG4DstSnk_(ctx),0) ) + { /* + ** Allocate space for another quantum of decoded data. + */ + h = DdxRmGetMaxQuantum_( DG4DstSnk_(ctx) ); + if( h > SnkHeight_(DG4DstSnk_(ctx),0) - y ) + h = SnkHeight_(DG4DstSnk_(ctx),0) - y; + DG4DstDat_(ctx) = DdxRmAllocData_( DG4DstSnk_(ctx), 0, y, h ); + if( !IsPointer_(DG4DstDat_(ctx)) ) + status = (int) DG4DstDat_(ctx); + DG4NewDst_(ctx) = TRUE; + + if( s == G4K_StsEoi ) + /* + ** Eoi before last scanline. Generate padding on future + ** activations. + */ + DG4SteBlk_(ctx)->pad_flag = TRUE; + } + else + DG4DstDat_(ctx) = NULL; + + VecNoInpt_(CtxVecPtr_(ctx)) = IsPointer_(DG4DstDat_(ctx)); + return( status ); + + case G4K_StsSrcExh : + /* + ** We're done with that chunk -- prepare for more. + */ + DG4SrcDat_(ctx) = DdxRmDeallocData_(DG4SrcDat_(ctx)); + VecNoInpt_(CtxVecPtr_(ctx)) = FALSE; + break; + + default : return( BadValue ); + } + } + while( s == G4K_StsSrcExh ); + + return( Success ); +} /* end of _DecodeG4Activate */ + +/***************************************************************************** +** _DecodeG4Abort +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _DecodeG4Abort( ctx ) + DecodeG4PipeCtxPtr ctx; +{ + /* + ** Destroy decode state. + */ + _DestroyG4State( DG4SteBlk_(ctx) ); + DG4SteBlk_(ctx) = NULL; + + /* + ** Turn off the no-input flag. + */ + VecNoInpt_(CtxVecPtr_(ctx)) = FALSE; + /* + ** Destroy destination data descriptor. + */ + DG4SrcDat_(ctx) = DdxRmDeallocData_( DG4SrcDat_(ctx) ); + DG4DstDat_(ctx) = DdxRmDeallocData_( DG4DstDat_(ctx) ); + + return( Success ); +} /* end of _DecodeG4Abort */ + +/***************************************************************************** +** _DecodeG4Destroy +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _DecodeG4Destroy( ctx ) + DecodeG4PipeCtxPtr ctx; +{ + DG4SrcDrn_(ctx) = DdxRmDestroyDrain_( DG4SrcDrn_(ctx) ); + + return( Success ); +} /* end of _DecodeG4Destroy */ + +/***************************************************************************** +** _DecodeG4Segment +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** dst - pointer to the UDP to receive the decompressed segment. +** If dst is not of type changelist its associated data +** buffer *MUST* have been zeroed, since only the non-zero +** pixels are written. +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _DecodeG4Segment( src, dst, state, newdst ) +UdpPtr src; +UdpPtr dst; +DecodeG4StatePtr state; +int newdst; +{ + UdpRec tmp; + unsigned char rem[4]; + int value; + int status; + + /* + ** Allocate destination buffer if required. + */ + if( upBase_(dst) == NULL ) + { + upBase_(dst) = DdxMallocBits_( upArSize_(dst) ); + if( upBase_(dst) == NULL ) return( BadAlloc ); + } + + /* + ** If there are source bits remaining, append them in a buffer with the + ** new source bits. + */ + if (state->remlen != 0) + { + urArSize_(tmp) = state->remlen + G4K_MinSrcLen; + urBase_(tmp) = rem; + urPos_(tmp) = 0; + state->srcpos = 0; + PUT_VALUE_( urBase_(tmp), 0, state->remdat, (1<remlen)-1 ); + value = GET_VALUE_( upBase_(src), upPos_(src), (1<remlen, value, (1<UdpB_Class == UdpK_ClassCL + ? _DecodeG4ToCl(&tmp, dst, state, newdst) + : _DecodeG4ToBits(&tmp, dst, state); + + switch (status) + { + case G4K_StsSrcExh: + state->srcpos = upPos_(src) + G4K_MinSrcLen - state->remlen; + state->remlen = 0; + break; + + case G4K_StsDstFul: + /* + ** Destination full, but src not exhausted. + ** Restore state so things can be resumed. + */ + state->srcpos -= state->remlen; + if( state->srcpos < 0 ) + { + state->remdat >>= state->remlen + state->srcpos; + state->remlen = abs(state->srcpos); + } + else + state->remlen = 0; + return( G4K_StsDstFul ); + + default: + return status; + } + } + return (dst->UdpB_Class == UdpK_ClassCL + ? _DecodeG4ToCl(src, dst, state, newdst) + : _DecodeG4ToBits(src, dst, state)); + +} /* end _DecodeG4Segment */ + +/***************************************************************************** +** _InitializeG4State +** +** FUNCTIONAL DESCRIPTION: +** +** This routine creates a new G4 decode state record. This record is +** required to keep track of decode state variables between decoded data +** segments. +** +** FORMAL PARAMETERS: +** +** dst - Destination UDP pointer. Describes parameters of the image to +** be decompressed. +** +** dtype - Data type of target buffer. +** +** IMPLICIT INPUTS: +** +** none +** +** IMPLICIT OUTPUTS: +** +** none +** +** FUNCTION VALUE: +** +** On success, pointer to created state block +** On failure, status, one of the following : +** BadAlloc : Insufficient resources to allocate dynamic memory +** +** SIGNAL CODES: +** +** none +** +** SIDE EFFECTS: +** +** none +** +*****************************************************************************/ +static DecodeG4StatePtr _InitializeG4State(dst,dtype) +UdpPtr dst; +int dtype; +{ + DecodeG4StatePtr state = (DecodeG4StatePtr) + DdxCalloc_( 1, sizeof(DecodeG4StateRec) ); + if( state == NULL ) return( (DecodeG4StatePtr) BadAlloc ); + + state->ppl = upWidth_(dst); + state->nxtscn = upY1_(dst); + state->lstscn = dst->UdpL_Y2; + state->pad_flag = FALSE; + + if (dtype == UdpK_DTypeCL) + { + /* + ** Allocate a reference change list to hold the reference line + ** between output segments. Initialize it to the imaginary white + ** reference line. + */ + state->rcl_desc = (int *) DdxMalloc_((state->ppl + 4) * sizeof(int)); + state->rcl = state->rcl_desc; + if (state->rcl_desc == NULL) + { + DdxFree_(state); + return (DecodeG4StatePtr)BadAlloc; + } + } + else + { + /* + ** Allocate space for change lists... + */ + state->ccl = (int *) DdxMalloc_((state->ppl + 4) * sizeof(int)); + if (state->ccl == NULL) + { + DdxFree_(state); + return (DecodeG4StatePtr)BadAlloc; + } + + state->rcl = (int *) DdxMalloc_((state->ppl + 4) * sizeof(int)); + if (state->rcl == NULL) + { + DdxFree_(state); + DdxFree_(state->ccl); + return (DecodeG4StatePtr)BadAlloc; + } + } + + state->rcl[0] = 1; + state->rcl[1] = state->ppl; + state->rcl[2] = state->ppl; + state->rcl[3] = state->ppl; + state->rcl[4] = state->ppl; + + state->mode = G4K_ModeNewScan; + + return( state ); +} /* end _InitializeG4State */ + +/***************************************************************************** +** _DestroyG4State +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +*****************************************************************************/ +static void _DestroyG4State(state) +DecodeG4StatePtr state; +{ + if (IsPointer_(state) ) + { + if (IsPointer_(state->rcl_desc)) + { + DdxFree_(state->rcl_desc); + } + else + { + if (IsPointer_(state->ccl)) + DdxFree_(state->ccl); + if (IsPointer_(state->rcl)) + DdxFree_(state->rcl); + } + DdxFree_(state); + } +} + +/***************************************************************************** +** _DecodeG4ToBits +** +** FUNCTIONAL DESCRIPTION: +** +** This function decodes a G4 data segment into image data. +** +** FORMAL PARAMETERS: +** +** src Address of UDP describing compressed data buffer +** dst Address of UDP describing destination image data buffer +** state Address of G4 state block +** +** IMPLICIT INPUTS: +** +** none +** +** IMPLICIT OUTPUTS: +** +** none +** +** FUNCTION VALUE: +** +** status, one of the following: +** G4K_StsDstFul, Destination buffer full +** G4K_StsSrcExh, Source buffer exhausted +** G4K_StsDcdErr, Decode error (probably bad compressed data) +** +** SIGNAL CODES: +** +** none +** +** SIDE EFFECTS: +** +** none +** +*****************************************************************************/ +static int _DecodeG4ToBits(src,dst,state) +UdpPtr src; +UdpPtr dst; +DecodeG4StatePtr state; +{ + int status = G4K_StsEol; + int *tmp; + long scanofs; + /* + ** If we're already past this scanline, something's wrong... + */ + if (state->nxtscn < dst->UdpL_Y1) + { + return G4K_StsDstFul; + } + /* + ** While within this output segment... + */ + while (state->nxtscn <= dst->UdpL_Y2) + { + status = _DecodeG4Process(src, state); + if (status == G4K_StsEol) + { + state->ccl[state->ccl[0]+1] = state->ppl; + state->ccl[state->ccl[0]+2] = state->ppl; + state->ccl[state->ccl[0]+3] = state->ppl; + + scanofs = dst->UdpL_Pos + dst->UdpL_ScnStride + * (state->nxtscn++ - dst->UdpL_Y1); + memset(dst->UdpA_Base + ((scanofs + 7) >> 3), + 0, + ((dst->UdpL_ScnStride +7) >> 3)); + DdxPutRuns_(dst->UdpA_Base, scanofs, state->ccl); + /* + ** Swap current and reference scanlines. + */ + tmp = state->rcl; + state->rcl = state->ccl; + state->ccl = tmp; + } + else + break; + } + + switch( status ) + { + case G4K_StsEol: + return G4K_StsDstFul; + + case G4K_StsEoi: + _PadG4Segment( dst, state->nxtscn ); + return G4K_StsEoi; + + default: + return status; + } +} + +/***************************************************************************** +** _DecodeG4ToCl +** +** FUNCTIONAL DESCRIPTION: +** +** This function decodes a G4 data segment into a change list. +** +** FORMAL PARAMETERS: +** +** src Address of UDP describing compressed data buffer +** dst Address of UDP describing destination image data buffer +** state Address of G4 state block +** newdst Boolean, indicates caller has provided a new destination buffer +** +** IMPLICIT INPUTS: +** +** none +** +** IMPLICIT OUTPUTS: +** +** none +** +** FUNCTION VALUE: +** +** status, one of the following: +** +** G4K_StsDstFul, Destination buffer full +** G4K_StsSrcExh, Source buffer exhausted +** G4K_StsEoi, End of encoded image encountered +** G4K_StsDcdErr, Decode error (probably bad compressed data) +** +** SIGNAL CODES: +** +** none +** +** SIDE EFFECTS: +** +** none +** +*****************************************************************************/ +static int _DecodeG4ToCl(src,dst,state,newdst) +UdpPtr src; +UdpPtr dst; +DecodeG4StatePtr state; +int newdst; +{ + int status = G4K_StsEol; + int *clsrc,*cldst; + int i; + /* + ** If we're already past this scanline, something's wrong... + */ + if (state->nxtscn < dst->UdpL_Y1) + { + return G4K_StsDstFul; + } + /* + ** If new destination buffer, get pointer to starting point in output + ** changelist. + */ + if (newdst) + { + state->ccl = + (int *)(dst->UdpA_Base + + (DdxPosCl_(dst->UdpA_Base, + dst->UdpL_Pos, + state->nxtscn-dst->UdpL_Y1) >> 3)); + state->rcl = state->rcl_desc; + } + /* + ** While within this output segment... + */ + while (state->nxtscn <= dst->UdpL_Y2) + { + status = _DecodeG4Process(src, state); + + if (status == G4K_StsEol) + { + state->ccl[state->ccl[0]+1] = state->ppl; + state->ccl[state->ccl[0]+2] = state->ppl; + state->ccl[state->ccl[0]+3] = state->ppl; + state->ccl[0] += 3; + /* + ** Update change list pointers. + */ + state->rcl = state->ccl; + state->ccl = state->ccl + state->ccl[0] + 2; + /* + ** Proceed to next scanline... + */ + state->nxtscn++; + } + else + break; + } + /* + ** Before returning full destination buffer, copy the current + ** change list so it can be used as the reference change list with + ** compunction during the next segment. + ** + ** NOTE : + ** We wouldn't have to do this copy if we had a handle on the + ** pipe data descriptor down at this level. That would allow + ** us to make a reference descriptor on the data to insure that + ** it wouldn't be freed until we were done with it. + */ + clsrc = state->rcl; + cldst = state->rcl_desc; + for (i = 0; i <= *state->rcl; i++) + { + *cldst++ = *clsrc++; + } + + switch( status ) + { + case G4K_StsEol: + return G4K_StsDstFul; + + case G4K_StsEoi: + _PadG4Segment( dst, state->nxtscn ); + return G4K_StsEoi; + + default: + return status; + } + +} + +/***************************************************************************** +** _DecodeG4Process +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +#if !defined(VMS) +static int _DecodeG4Process(src, state) +UdpPtr src; +DecodeG4StatePtr state; +{ + int bits; + int value; + int type; + + if( state->mode == G4K_ModeNewScan ) + { + state->cidx = 0; + state->ridx = 1; + state->a0 = -1; + state->a0prime = -1; + state->a1 = 0; + state->b1 = 0; + state->mode = G4K_ModeCodeword; + state->ccl[0] = 0; + } + while( TRUE ) + { + if( src->UdpL_ArSize - state->srcpos > G4K_MinSrcLen ) + { + switch( state->mode ) + { + + /* + ** State mode is codeword. Read the next codeword and dispatch + ** based on the + */ + case G4K_ModeCodeword: + bits = GET_VALUE_(src->UdpA_Base,state->srcpos,G4M_Codeword); + state->srcpos += MiArFax2DDecodeTable[bits].length; + switch (MiArFax2DDecodeTable[bits].type) + { + /* + ** State mode is codeword, codeword type is TERMINATOR, + ** dispatch from here based on codeword value. + */ + case G4K_CodetypeTerminator: + switch (MiArFax2DDecodeTable[bits].value) + { + + /* + ** State mode is codeword, codeword type is TERMINATOR, + ** codeword value is PASS. + */ + case G4K_CodevaluePass: + while (state->rcl[state->ridx] <= state->a0prime || + ((state->ridx & 1) == (state->cidx & 1))) + state->ridx++; + + state->b1 = state->rcl[state->ridx]; + state->a0prime = state->rcl[state->ridx + 1]; + if ((state->ridx > 1) && + (state->rcl[state->ridx - 1] > state->a0prime)) + state->ridx--; + + if (state->ccl[state->cidx] >= state->ppl) + { + state->mode = G4K_ModeNewScan; + return G4K_StsEol; + } + break; + + /* + ** State mode is Codeword, codeword type is TERMINATOR, + ** codeword value is HORIZONTAL. + */ + case G4K_CodevalueHoriz: + if (state->a0 < 0) + { + state->a0 = 0; + if (state->a0prime < 0) + state->a0prime = 0; + } + state->cidx++; + state->rlen = 0; + state->mode = G4K_ModeFirstRun; + break; + + /* + ** State mode is codeword, codeword type is TERMINATOR, + ** codeword value is VERTICAL. + */ + case G4K_CodevalueV0: + case G4K_CodevalueVR1: + case G4K_CodevalueVL1: + case G4K_CodevalueVR2: + case G4K_CodevalueVL2: + case G4K_CodevalueVR3: + case G4K_CodevalueVL3: + while (state->rcl[state->ridx] <= state->a0prime || + ((state->ridx & 1) == (state->cidx & 1))) + state->ridx++; + + state->b1 = state->rcl[state->ridx]; + + if ((state->ridx > 1) && + (state->rcl[state->ridx - 1] > state->a0prime)) + state->ridx--; + + state->a0 = state->b1+MiArFax2DDecodeTable[bits].value; + state->a0prime = state->a0; + state->ccl[++(state->cidx)] = state->a0; + state->ccl[0]++; + + if (state->ccl[state->cidx] >= state->ppl) + { + state->mode = G4K_ModeNewScan; + return G4K_StsEol; + } + break; + + /* + ** Here on invalid codeword values. + */ + default: + return G4K_StsDcdErr; + } + break; /* End of switch (codeword type) */ + + /* + ** State mode is Codeword, codeword type is EOL. + */ + case G4K_CodetypeEol: + bits = GET_VALUE_(src->UdpA_Base, + state->srcpos, + G4M_Codeword); + + if (MiArFax2DDecodeTable[bits].type == G4K_CodetypeEol) + { + state->srcpos += MiArFax2DDecodeTable[bits].length; + return G4K_StsEoi; + } + else + { + state->mode = G4K_ModeNewScan; + return G4K_StsEol; + } + + /* + ** Here on invalid codeword types. + */ + default: + return G4K_StsDcdErr; + } + break; /* End of switch (codeword value) */ + + case G4K_ModeFirstRun: + if (state->cidx & 1 == G4K_WhiteRun) + { + bits = GET_VALUE_(src->UdpA_Base,state->srcpos,G4M_WhiteRun); + state->srcpos += MiArFax1DDecodeWhite[bits].length; + value = MiArFax1DDecodeWhite[bits].value; + type = MiArFax1DDecodeWhite[bits].type; + } + else + { + bits = GET_VALUE_(src->UdpA_Base,state->srcpos,G4M_BlackRun); + state->srcpos += MiArFax1DDecodeBlack[bits].length; + value = MiArFax1DDecodeBlack[bits].value; + type = MiArFax1DDecodeBlack[bits].type; + } + state->rlen += value; + + if (type != G4K_CodetypeMakeup) + { + state->a1 = state->rlen + state->a0prime; + state->ccl[state->cidx++] = state->a1; + state->ccl[0]++; + state->rlen = 0; + state->mode = G4K_ModeSecondRun; + } + break; + + case G4K_ModeSecondRun: + if (state->cidx & 1 == G4K_WhiteRun) + { + bits = GET_VALUE_(src->UdpA_Base,state->srcpos,G4M_WhiteRun); + state->srcpos += MiArFax1DDecodeWhite[bits].length; + value = MiArFax1DDecodeWhite[bits].value; + type = MiArFax1DDecodeWhite[bits].type; + } + else + { + bits = GET_VALUE_(src->UdpA_Base,state->srcpos,G4M_BlackRun); + state->srcpos += MiArFax1DDecodeBlack[bits].length; + value = MiArFax1DDecodeBlack[bits].value; + type = MiArFax1DDecodeBlack[bits].type; + } + state->rlen += value; + + if (type != G4K_CodetypeMakeup) + { + state->a0 = state->a1 + state->rlen; + state->a0prime = state->a0; + state->ccl[state->cidx] = state->a0; + state->ccl[0]++; + state->mode = G4K_ModeCodeword; + + if (state->ccl[state->cidx] >= state->ppl) + { + state->mode = G4K_ModeNewScan; + return G4K_StsEol; + } + } + break; + + /* + ** Here on invalid state mode. + */ + default: + return G4K_StsDcdErr; + } /* End of switch (state->mode) */ + + } /* End of if (enough source data remaining) */ + else + /* + ** If not enough source data, return source exhausted. + */ + { + state->remlen = src->UdpL_ArSize - state->srcpos; + state->remdat = GET_VALUE_(src->UdpA_Base, + state->srcpos, + (1 << state->remlen) - 1); + return G4K_StsSrcExh; + } + } +} +#endif + +/***************************************************************************** +** _PadG4Segment +** +** FUNCTIONAL DESCRIPTION: +** +** Fill the specified udp with the equivalent of zero image data, starting +** at the specified scanline. +** +** FORMAL PARAMETERS: +** dst - Pointer to udp to be filled with padding +** start - Starting scanline +** +** FUNCTION VALUE: +** G4K_StsEoi +** +*****************************************************************************/ +static int _PadG4Segment( dst, start ) + UdpPtr dst; + int start; +{ + int i; + int startpos; + unsigned int *cl; + + if( dst->UdpB_DType != UdpK_DTypeCL ) + DdxFillRegion_( dst, dst->UdpL_X1, start, + dst->UdpL_PxlPerScn, dst->UdpL_Y2- start + 1, 0); + else + { + startpos = DdxPosCl_(dst->UdpA_Base, dst->UdpL_Pos, + start - dst->UdpL_Y1); + cl = (unsigned int *)(dst->UdpA_Base + ( startpos / 8 )); + + for( i = start; i <= dst->UdpL_Y2; i++) + { + cl[0] = 1; + cl[1] = dst->UdpL_PxlPerScn; + cl[2] = 0; + cl += 3; + } + } + return( G4K_StsEoi ); +} /* end _PadG4Segment */ + +/***************************************************************************** +** _SaveSourceData +** +** FUNCTIONAL DESCRIPTION: +** +** Save the unprocessed portion of the data currently in the +** decompression state record. +** +** +** FORMAL PARAMETERS: +** ctx - pipe context pointer +** +** +** FUNCTION VALUE: +** Succes or BadAlloc +** +*****************************************************************************/ +static int _SaveSourceData( ctx ) + DecodeG4PipeCtxPtr ctx; +{ + int pos; + unsigned char *tmp; + PipeDataPtr src; + + src = DG4SrcDat_(ctx); + tmp = DatBase_(src); + pos = DG4SteBlk_(ctx)->srcpos & ~0x7; + DG4SteBlk_(ctx)->srcpos &= 0x7; + DatArSize_(src) -= pos; + DatOwned_(src) = TRUE; + DatPos_(src) = 0; + DatBase_(src) = DdxMallocBits_( DatArSize_(src) ); + if( DatBase_(src) == NULL ) return( BadAlloc ); + memcpy( DatBase_(src), tmp+(pos>>3), DatArSize_(src)>>3 ); + } + + +static int _DecodePrintState(state) +DecodeG4StatePtr state; +{ + int i; + + printf("Scanline = %d\n",state->nxtscn); + + printf("Current change list @ %X: \n",state->ccl); + for (i = 1; i <= state->ccl[0]; i++) + printf("%d\n",state->ccl[i]); + + printf("Reference change list @ %X: \n", state->rcl); + for (i = 1; i <= state->rcl[0]; i++) + printf("%d\n",state->rcl[i]); +} diff --git a/xie/docs/dec/xie23-src/server/xie/smi/DmiDecodeG4.h b/xie/docs/dec/xie23-src/server/xie/smi/DmiDecodeG4.h new file mode 100644 index 0000000..c831477 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/DmiDecodeG4.h @@ -0,0 +1,110 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright (c) Digital Equipment Corporation, 1990 All Rights Reserved. +** Unpublished rights reserved under the copyright laws of the United States. +** The software contained on this media is proprietary to and embodies the +** confidential technology of Digital Equipment Corporation. Possession, use, +** duplication or dissemination of the software and media is authorized only +** pursuant to a valid written license from Digital Equipment Corporation. + +** RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the U.S. +** Government is subject to restrictions as set forth in Subparagraph +** (c)(1)(ii) of DFARS 252.227-7013, or in FAR 52.227-19, as applicable. +** +** Derived from work bearing the following copyright and permissions: +** +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Digital Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the G4 decompress pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.0 +** RISC ULTRIX V3.0 +** +** AUTHOR(S): +** +** Gary Grebus (cloned from DmiDecodeG4.h) +** John Weber +** +** CREATION DATE: +** +** Fri Oct 5 15:59:28 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _DMIDECODEG4 +#define _DMIDECODEG4 +/* +** Include files +*/ +#include + +/* +** Equated Symbols +*/ + + +/* +** External References +*/ +extern int DmiDecodeG4(); +extern int DmiCreateDecodeG4(); +#endif _DMIDECODEG4 diff --git a/xie/docs/dec/xie23-src/server/xie/smi/DmiExtendInstruct.h b/xie/docs/dec/xie23-src/server/xie/smi/DmiExtendInstruct.h new file mode 100644 index 0000000..c6f5335 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/DmiExtendInstruct.h @@ -0,0 +1,111 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright (c) Digital Equipment Corporation, 1990 All Rights Reserved. +** Unpublished rights reserved under the copyright laws of the United States. +** The software contained on this media is proprietary to and embodies the +** confidential technology of Digital Equipment Corporation. Possession, use, +** duplication or dissemination of the software and media is authorized only +** pursuant to a valid written license from Digital Equipment Corporation. + +** RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the U.S. +** Government is subject to restrictions as set forth in Subparagraph +** (c)(1)(ii) of DFARS 252.227-7013, or in FAR 52.227-19, as applicable. +** +** Derived from work bearing the following copyright and permissions: +** +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Digital Machine Independent DDX +** +** ABSTRACT: +** +** This is the header file for the Extended Instruction module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** +** AUTHOR(S): +** +** Gary Grebus +** +** CREATION DATE: +** +** Fri Oct 5 14:59:58 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _DMIEXTEND +#define _DMIEXTEND + + /* + ** Include files + */ + + /* + ** Function reference. + ** Only the Ffs/Ffc entry points match up with standard DDX + ** functions. The other routines are Dmi internal only. + */ +int _DmiFfsLong(); +int _DmiFfcLong(); + +void _DmiMovc3Long(); +void _DmiMovc5Long(); +void _DmiMovtcLong(); +void _DmiMovv5(); +void _DmiMovv7(); +void _DmiCombine(); +#endif _DMIEXTEND diff --git a/xie/docs/dec/xie23-src/server/xie/smi/DmiFill.c b/xie/docs/dec/xie23-src/server/xie/smi/DmiFill.c new file mode 100644 index 0000000..75e305d --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/DmiFill.c @@ -0,0 +1,1027 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/****************************************************************************** +** +** Copyright (c) Digital Equipment Corporation, 1990 All Rights Reserved. +** Unpublished rights reserved under the copyright laws of the United States. +** The software contained on this media is proprietary to and embodies the +** confidential technology of Digital Equipment Corporation. Possession, use, +** duplication or dissemination of the software and media is authorized only +** pursuant to a valid written license from Digital Equipment Corporation. + +** RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the U.S. +** Government is subject to restrictions as set forth in Subparagraph +** (c)(1)(ii) of DFARS 252.227-7013, or in FAR 52.227-19, as applicable. +** +** Derived from work bearing the following copyright and permissions: +** +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +**/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains support for the operation. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** VAX ULTRIX V3.1 +** RISC ULTRIX 3.1 +** +** AUTHORS: +** +** Gary Grebus +** +** CREATION DATE: +** +** Fri Aug 31 13:41:37 1990 +** +*******************************************************************************/ + +#include + +#include "DmiFill.h" + +/* +** Table of contents +*/ +int DmiCreateFill(); +static int _FillInitialize(); +static int _FillActivate(); +static int _FillDestroy(); + +int DmiFill(); +int DmiFillRegion(); +static int _CvtUnsOpr(); +static int _FillBs(); +static int _FillByt(); +static int _FillWrd(); +static int _FillFlt(); +static int _FillBsCpp(); +static int _FillBytCpp(); +static int _FillWrdCpp(); +static int _FillFltCpp(); + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* +** Local storage +*/ + /* + ** Fill Element Vector + */ +static PipeElementVector FillPipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeFillElement, /* Structure subtype */ + sizeof(FillPipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _FillInitialize, /* Initialize entry */ + _FillActivate, /* Activate entry */ + NULL, /* Flush entry */ + _FillDestroy, /* Destroy entry */ + NULL /* Abort entry point */ + }; +/* +** This table describes functions to be called when filling a descriptor type. +*/ +static int (*fill_table[XieK_DATA_TYPE_COUNT])() = + {_FillBs,_FillBs,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_FillByt,_FillFlt,_FillWrd}; + +static int (*fill_table_cpp[XieK_DATA_TYPE_COUNT])() = + {_FillBsCpp,_FillBsCpp,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_FillBytCpp,_FillFltCpp,_FillWrdCpp}; + +/***************************************************************************** +** DmiCreateFill +** +** FUNCTIONAL DESCRIPTION: +** +** This function fills in a newly created FILL pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - fill pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int DmiCreateFill( pipe, src, dst, idcudp, constant ) +Pipe pipe; +PipeSinkPtr src; +PipeSinkPtr dst; +UdpPtr idcudp; +unsigned long int constant[XieK_MaxComponents]; +{ + int i; + FillPipeCtxPtr ctx = (FillPipeCtxPtr) + DdxCreatePipeCtx_( pipe, &FillPipeElement, FALSE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + + /* + ** Copy parameters into context block. + */ + FilSrcSnk_(ctx) = src; + FilDstSnk_(ctx) = dst; + if( idcudp == NULL ) + { + /* Roi the entire source */ + FilRoiX1_(ctx) = SnkX1_(src,0); + FilRoiX2_(ctx) = SnkX2_(src,0); + FilRoiY1_(ctx) = SnkY1_(src,0); + FilRoiY2_(ctx) = SnkY2_(src,0); + FilCpp_(ctx) = NULL; + } + else + { + FilRoiX1_(ctx) = upX1_(idcudp); + FilRoiX2_(ctx) = upX2_(idcudp); + FilRoiY1_(ctx) = upY1_(idcudp); + FilRoiY2_(ctx) = upY2_(idcudp); + FilCpp_(ctx) = IsPointer_(upBase_(idcudp)) ? idcudp : NULL; + } + + for( i = 0; i < XieK_MaxComponents && IsPointer_(SnkUdpPtr_(dst,i)); i++ ) + FilConst_(ctx,i) = constant[i] < SnkLvl_(dst,i) + ? constant[i] : SnkLvl_(dst,i) - 1; + + /* + ** Setup one drain from source sink, receiving all components. + */ + FilSrcDrn_(ctx) = DdxRmCreateDrain_( FilSrcSnk_(ctx), -1 ); + if( !IsPointer_(FilSrcDrn_(ctx)) ) return( (int) FilSrcDrn_(ctx) ); + + /* + ** Handle any data type or quantum size. + */ + DdxRmSetDType_( FilSrcDrn_(ctx), UdpK_DTypeUndefined, DtM_Any ); + DdxRmSetDType_( FilDstSnk_(ctx), UdpK_DTypeUndefined, DtM_Any ); + + return( Success ); +} /* end DmiCreateFill */ + +/***************************************************************************** +** _FillInitialize +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the FILL pipeline element prior to +** an activation. +** +** FORMAL PARAMETERS: +** +** ctx - fill pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _FillInitialize( ctx ) +FillPipeCtxPtr ctx; +{ + /* + ** Initialize the source and destination ports. + */ + int status = DdxRmInitializePort_( CtxHead_(ctx), FilSrcDrn_(ctx) ); + if( status == Success ) + status = DdxRmInitializePort_( CtxHead_(ctx), FilDstSnk_(ctx) ); + + /* + ** Currently processing from first (and only) source drain. + */ + CtxInp_(ctx) = FilSrcDrn_(ctx); + + return( Success ); +} + +/***************************************************************************** +** _FillActivate +** +** FUNCTIONAL DESCRIPTION: +** +** This routine reads data from the pipeline and fills each quantum, +** as necessary. +** +** FORMAL PARAMETERS: +** +** ctx - fill pipeline element context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _FillActivate( ctx ) +FillPipeCtxPtr ctx; +{ + PipeDataPtr src = NULL, dst = NULL; + PipeSinkPtr dstsnk = FilDstSnk_(ctx); + UdpRec udp, cppudp; + int status, nonroi, typ, X1, X2, Y1, Y2; + + for( status = Success; status == Success; src = DdxRmDeallocData_(src), + dst = DdxRmDeallocData_(dst) ) + { + src = DdxRmGetData_( ctx, FilSrcDrn_(ctx) ); + if( !IsPointer_(src) ) return( (int) src ); + + nonroi = DatY2_(src) < FilRoiY1_(ctx) || DatY1_(src) > FilRoiY2_(ctx); + + if( nonroi && DatDatTyp_(src) == SnkDtyp_(dstsnk) ) + { /* + ** DType matches and the entire quantum is outside the ROI. + */ + status = DdxRmPutData_( dstsnk, src ); + src = NULL; + } + else + { + dst = DdxRmAllocData_( dstsnk, DatCmpIdx_(src), DatY1_(src), + DatHeight_(src) ); + status = (int) dst; + if( !IsPointer_(dst) ) continue; + + if( nonroi ) + /* + ** Outside of ROI but DType doesn't match. + */ + status = DdxConvert_( DatUdpPtr_(src), + DatUdpPtr_(dst), XieK_MoveMode ); + else + { /* + ** The quantum intersects the ROI. Copy the regions + ** outside the ROI and fill the region within. + */ + X1 = DatX1_(src) > FilRoiX1_(ctx) ? + DatX1_(src) : FilRoiX1_(ctx); + X2 = DatX2_(src) < FilRoiX2_(ctx) ? + DatX2_(src) : FilRoiX2_(ctx); + Y1 = DatY1_(src) > FilRoiY1_(ctx) ? + DatY1_(src) : FilRoiY1_(ctx); + Y2 = DatY2_(src) < FilRoiY2_(ctx) ? + DatY2_(src) : FilRoiY2_(ctx); + + if( DatY1_(src) < Y1 ) + { /* Copy the part of this quantum above the ROI */ + status = DdxCopy_( DatUdpPtr_(src), DatUdpPtr_(dst), + 0, 0, + DatX1_(dst), DatY1_(dst), + DatWidth_(src), Y1 - DatY1_(src) ); + if( status != Success ) continue; + } + if( DatX1_(src) < X1 ) + { /* Copy the part of this quantum left of the ROI */ + status = DdxCopy_( DatUdpPtr_(src), DatUdpPtr_(dst), + 0, Y1 - DatY1_(src), + DatX1_(dst), Y1, + X1 - DatX1_(src), Y2 - Y1 + 1 ); + if( status != Success ) continue; + } + if( DatX2_(src) > X2 ) + { /* Copy the part of this quantum right of the ROI */ + status = DdxCopy_( DatUdpPtr_(src), DatUdpPtr_(dst), + X2 - DatX1_(src)+1, Y1 - DatY1_(src), + X2+1, Y1, + DatX2_(src) - X2, Y2 - Y1 + 1 ); + if( status != Success ) continue; + } + if( DatY2_(src) > Y2 ) + { /* Copy the part of this quantum below the ROI */ + status = DdxCopy_( DatUdpPtr_(src), DatUdpPtr_(dst), + 0, Y2 - DatY1_(src) + 1, + DatX1_(dst), Y2 + 1, + DatWidth_(src), DatY2_(src) - Y2 ); + if( status != Success ) continue; + } + /* Fill the intersection of the IDC with this quantum */ + udp = DatUdp_(dst); + urX1_(udp) = X1; + urX2_(udp) = X2; + urY1_(udp) = Y1; + urY2_(udp) = Y2; + urWidth_(udp) = X2 - X1 + 1; + urHeight_(udp) = Y2 - Y1 + 1; + + urPos_(udp) += (Y1 - DatY1_(dst)) * urScnStr_(udp) + + (X1 - DatX1_(dst)) * urPxlStr_(udp); + + typ = DdxGetTyp_(&udp); + + if( FilCpp_(ctx) == NULL ) + status = (*fill_table[typ]) + (&udp, &FilConst_(ctx, DatCmpIdx_(src))); + else + { /* + ** Copy the source data to the destination, then fill + ** the pixels selected by the CPP. + */ + status = DdxConvert_(DatUdpPtr_(src), &udp, XieK_MoveMode); + if( status != Success ) continue; + + cppudp = *FilCpp_(ctx); + urPos_(cppudp) += (Y1 - urY1_(cppudp)) * urScnStr_(cppudp) + + (X1 - urX1_(cppudp)) * urPxlStr_(cppudp); + + status = (*fill_table_cpp[typ]) + (&udp, &cppudp, &FilConst_(ctx, DatCmpIdx_(src))); + } + } + if( status != Success ) continue; + + status = DdxRmPutData_( dstsnk, dst ); + dst = NULL; + } + } + return( status ); +} + +/***************************************************************************** +** _FillDestroy +** +** FUNCTIONAL DESCRIPTION: +** +** This routine deallocates all resources allocated by the FILL +** pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - fill pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _FillDestroy( ctx ) +FillPipeCtxPtr ctx; +{ + FilSrcDrn_(ctx) = DdxRmDestroyDrain_( FilSrcDrn_(ctx) ); + + return( Success ); +} + +/***************************************************************************** +** DmiFill +** +** FUNCTIONAL DESCRIPTION: +** +** Fill pixels in a UDP as specified by an IDC. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** idcudp - destination IDC +** value - pel fill pattern +** +** FUNCTION VALUE: +** +** none +** +*****************************************************************************/ +int DmiFill( src, dst, idcudp, value ) +UdpPtr src, dst; +UdpPtr idcudp; +unsigned int value; +{ + UdpRec udp; + int typ, status; + unsigned long val; + + /* + * Copy the image. + */ + status = DdxConvert_( src, dst, XieK_MoveMode ); + if( status != Success ) return( status ); + + /* + ** Validate and get type of destination + */ + typ = DdxGetTyp_(dst); + if( typ >= XieK_DATA_TYPE_COUNT ) return( BadImplementation ); + /* + ** Make a copy of the destination UDP that we can modify. + */ + udp = *dst; + /* + ** Modify the UDP so that is describes only the ROI to receive the fill. + */ + if( idcudp != NULL ) + { + /* If the IDC was supplied, find its intersection with the image */ + urX1_(udp) = upX1_(idcudp) > urX1_(udp) ? upX1_(idcudp) : urX1_(udp); + urX2_(udp) = upX2_(idcudp) < urX2_(udp) ? upX2_(idcudp) : urX2_(udp); + urY1_(udp) = upY1_(idcudp) > urY1_(udp) ? upY1_(idcudp) : urY1_(udp); + urY2_(udp) = upY2_(idcudp) < urY2_(udp) ? upY2_(idcudp) : urY2_(udp); + } + urWidth_(udp) = urX2_(udp) - urX1_(udp) + 1; + urHeight_(udp) = urY2_(udp) - urY1_(udp) + 1; + + urPos_(udp) += (urY1_(udp) - upY1_(dst)) * urScnStr_(udp) + + (urX1_(udp) - upX1_(dst)) * urPxlStr_(udp); + + val = value < udp.UdpL_Levels ? value : udp.UdpL_Levels - 1; + /* + ** Call specific fill routine. + */ + if( idcudp == NULL || upBase_(idcudp) == NULL ) + status = (*fill_table[typ])(&udp, &val); + else + status = (*fill_table_cpp[typ])(&udp, idcudp, &val); + + return( status ); +} /* end DmiFill */ + +/***************************************************************************** +** DmiFillRegion +** +** FUNCTIONAL DESCRIPTION: +** +** This is utility style interface to DmiFill. +** +** FORMAL PARAMETERS: +** +** dst - destination data descriptor +** dst_x - Destination X coordinate +** dst_y - Destination Y coordinate +** width - Width of ROI in pels +** height - Height of ROI in pels +** value - pel fill pattern +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int DmiFillRegion( dst, x, y, width, height, value ) +UdpPtr dst; +unsigned int x; +unsigned int y; +unsigned int width; +unsigned int height; +unsigned int value; +{ + UdpRec udp; + int typ; + unsigned long val; + + /* + ** Handle the no-op case. + */ + if( width == 0 || height == 0 ) + return( Success ); + /* + ** Validate and get type of descriptors + */ + typ = DdxGetTyp_(dst); + if( typ >= XieK_DATA_TYPE_COUNT ) return( BadImplementation ); + + /* + ** Make a copy of the destination UDP that we can modify. + */ + udp = *dst; + /* + ** Modify the UDP so that is describes only the ROI to receive the value. + */ + urX1_(udp) = x > urX1_(udp) ? x : urX1_(udp); + urX2_(udp) = x + width - 1 < urX2_(udp) ? x + width - 1 : urX2_(udp); + urY1_(udp) = y > urY1_(udp) ? y : urY1_(udp); + urY2_(udp) = y + height - 1 < urY2_(udp) ? y + height - 1 : urY2_(udp); + + urWidth_(udp) = urX2_(udp) - urX1_(udp) + 1; + urHeight_(udp) = urY2_(udp) - urY1_(udp) + 1; + + urPos_(udp) += (urY1_(udp) - upY1_(dst)) * urScnStr_(udp) + + (urX1_(udp) - upX1_(dst)) * urPxlStr_(udp); + + val = value < udp.UdpL_Levels ? value : udp.UdpL_Levels - 1; + /* + ** Call specific fill routine. + */ + return( (*fill_table[typ])(&udp, &val) ); +} /* end DmiFillRegion */ + +/***************************************************************************** +** _CvtUnsOpr +** +** FUNCTIONAL DESCRIPTION: +** +** This is an action routine called when conversion from source descriptor +** type to destination descriptor type is not supported. Simply signal an +** error at this point. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtUnsOpr(src, dst) +UdpPtr src; +UdpPtr dst; +{ + return( BadImplementation ); +} + +/***************************************************************************** +** _FillBs +** +** FUNCTIONAL DESCRIPTION: +** +** Fill a region of a bit array with an integer value +** +** FORMAL PARAMETERS: +** +** dst - destination data descriptor +** val - value +** +*****************************************************************************/ +static int _FillBs( dst, val ) +UdpPtr dst; +unsigned long *val; +{ + int pixel, scanline, count, dst_offset, out_bits, out_mask; + int dst_mask = (1 << dst->UdpW_PixelLength) - 1; + int dst_scan_offset = dst->UdpL_Pos; + unsigned long value = dst->UdpL_PxlStride != 1 ? *val : *val == 0 ? 0 : ~0; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } + for( scanline = dst->UdpL_Y1; scanline <= dst->UdpL_Y2 ; scanline++ ) + { + dst_offset = dst_scan_offset; + + if( dst->UdpL_PxlStride != 1 ) + /* Have to do it the slow way */ + for( pixel = dst->UdpL_X1; pixel <= dst->UdpL_X2; pixel++ ) + { + PUT_VALUE_(dst->UdpA_Base, dst_offset, value, dst_mask); + dst_offset += dst->UdpL_PxlStride; + } + else + { + count = dst->UdpL_PxlPerScn; + + /* Fill bits up to a byte boundary */ + out_bits = 8 - (dst_offset % 8); + + if( out_bits != 8 ) + { + out_mask = (1<UdpA_Base, dst_offset, value, out_mask); + count -= out_bits; + dst_offset += out_bits; + } + /* Do the middle really fast */ + memset( dst->UdpA_Base + (dst_offset >> 3), value, count >> 3 ); + + /* Do the remaining bits at the end */ + out_bits = count % 8; + if( out_bits > 0 ) + { + dst_offset += (count - out_bits); + out_mask = (1<UdpA_Base, dst_offset, value, out_mask); + } + } + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _FillByt +** +** FUNCTIONAL DESCRIPTION: +** +** Fill a region of a byte array with an integer value +** +** FORMAL PARAMETERS: +** +** dst - destination data descriptor +** val - value +** +*****************************************************************************/ +static int _FillByt( dst, val ) +UdpPtr dst; +unsigned long *val; +{ + unsigned char value = *val; + int pixel; + int scanline; + int dst_scan_offset; + int dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } + dst_scan_offset = dst->UdpL_Pos; + + for( scanline = dst->UdpL_Y1; scanline <= dst->UdpL_Y2 ; scanline++ ) + { + dst_offset = dst_scan_offset; + + for( pixel = dst->UdpL_X1; pixel <= dst->UdpL_X2; pixel++ ) + { + *((unsigned char *)(dst->UdpA_Base + (dst_offset >> 3))) = value; + dst_offset += dst->UdpL_PxlStride; + } + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _FillWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Fill a region of a word array with an integer value +** +** FORMAL PARAMETERS: +** +** dst - destination data descriptor +** val - value +** +*****************************************************************************/ +static int _FillWrd( dst, val ) +UdpPtr dst; +unsigned long *val; +{ + unsigned short value = *val; + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_scan_offset; + int dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Get destination dimensions. +*/ + X1 = dst->UdpL_X1; + X2 = dst->UdpL_X2; + Y1 = dst->UdpL_Y1; + Y2 = dst->UdpL_Y2; + + dst_scan_offset = dst->UdpL_Pos; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + dst_offset = dst_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((unsigned short *)(dst->UdpA_Base + (dst_offset >> 3))) = value; + dst_offset += dst->UdpL_PxlStride; + } + + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _FillFlt +** +** FUNCTIONAL DESCRIPTION: +** +** Fill a region of a floating array with a floating value +** +** FORMAL PARAMETERS: +** +** dst - destination data descriptor +** val - floating value +** +*****************************************************************************/ +static int _FillFlt( dst, val ) +UdpPtr dst; +float *val; +{ + float value = *val; + int pixel; + int scanline; + int dst_scan_offset; + int dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } + dst_scan_offset = dst->UdpL_Pos; + + for( scanline = dst->UdpL_Y1; scanline <= dst->UdpL_Y2 ; scanline++ ) + { + dst_offset = dst_scan_offset; + + for( pixel = dst->UdpL_X1; pixel <= dst->UdpL_X2; pixel++ ) + { + *((float *)(dst->UdpA_Base + (dst_offset >> 3))) = value; + dst_offset += dst->UdpL_PxlStride; + } + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _FillBsCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Fill a region of a bit array with an integer value, under the +** control of a CPP. +** +** FORMAL PARAMETERS: +** +** dst - destination data descriptor +** cpp - pointer to CPP +** val - value +** +*****************************************************************************/ +static int _FillBsCpp( dst, cpp, val ) +UdpPtr dst; +UdpPtr cpp; +unsigned long *val; +{ + unsigned long value = *val; + int pixel; + int scanline; + int dst_mask; + int dst_scan_offset; + int dst_offset; + int cpp_scan_offset; + int cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + dst_scan_offset = dst->UdpL_Pos; + cpp_scan_offset = cpp->UdpL_Pos; + + for( scanline = dst->UdpL_Y1; scanline <= dst->UdpL_Y2 ; scanline++ ) + { + dst_offset = dst_scan_offset; + cpp_offset = cpp_scan_offset; + + for( pixel = dst->UdpL_X1; pixel <= dst->UdpL_X2; pixel++ ) + { + if( GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1) ) + PUT_VALUE_(dst->UdpA_Base, dst_offset, value, dst_mask); + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} /* end _FillBsCpp */ + +/***************************************************************************** +** _FillBytCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Fill a region of a byte array with an integer value, under the +** control of a CPP. +** +** FORMAL PARAMETERS: +** +** dst - destination data descriptor +** cpp - pointer to CPP +** val - value +** +*****************************************************************************/ +static int _FillBytCpp( dst, cpp, val ) +UdpPtr dst; +UdpPtr cpp; +unsigned long *val; +{ + unsigned char value = *val; + int pixel; + int scanline; + int dst_scan_offset; + int dst_offset; + int cpp_scan_offset; + int cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } + dst_scan_offset = dst->UdpL_Pos; + cpp_scan_offset = cpp->UdpL_Pos; + + for( scanline = dst->UdpL_Y1; scanline <= dst->UdpL_Y2 ; scanline++ ) + { + dst_offset = dst_scan_offset; + cpp_offset = cpp_scan_offset; + + for( pixel = dst->UdpL_X1; pixel <= dst->UdpL_X2; pixel++ ) + { + if( GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1) ) + *((unsigned char *)(dst->UdpA_Base+(dst_offset>>3))) = value; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} /* end _FillBytCpp */ + +/***************************************************************************** +** _FillWrdCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Fill a region of a word array with an integer value, under the +** control of a CPP. +** +** FORMAL PARAMETERS: +** +** dst - destination data descriptor +** cpp - pointer to CPP +** val - value +** +*****************************************************************************/ +static int _FillWrdCpp( dst, cpp, val ) +UdpPtr dst; +UdpPtr cpp; +unsigned long *val; +{ + unsigned short value = *val; + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_scan_offset; + int dst_offset; + int cpp_scan_offset; + int cpp_offset; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } + +/* +** Get destination dimensions. +*/ + X1 = dst->UdpL_X1; + X2 = dst->UdpL_X2; + Y1 = dst->UdpL_Y1; + Y2 = dst->UdpL_Y2; + + dst_scan_offset = dst->UdpL_Pos; + cpp_scan_offset = cpp->UdpL_Pos; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + dst_offset = dst_scan_offset; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) + *((unsigned short *)(dst->UdpA_Base+(dst_offset>>3))) = value; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} /* end _FillWrdCpp */ + +/***************************************************************************** +** _FillFltCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Fill a region of a floating array with a floating value, +** under control of a CPP. +** +** FORMAL PARAMETERS: +** +** dst - destination data descriptor +** cpp - pointer to CPP +** val - floating value +** +*****************************************************************************/ +static int _FillFltCpp( dst, cpp, val ) +UdpPtr dst; +UdpPtr cpp; +float *val; +{ + float value = *val; + int pixel; + int scanline; + int dst_scan_offset; + int dst_offset; + int cpp_scan_offset; + int cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } + dst_scan_offset = dst->UdpL_Pos; + cpp_scan_offset = cpp->UdpL_Pos; + + for( scanline = dst->UdpL_Y1; scanline <= dst->UdpL_Y2 ; scanline++ ) + { + dst_offset = dst_scan_offset; + cpp_offset = cpp_scan_offset; + + for( pixel = dst->UdpL_X1; pixel <= dst->UdpL_X2; pixel++ ) + { + if( GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1) ) + *((float *)(dst->UdpA_Base + (dst_offset >> 3))) = value; + + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} /* end _FillFltCpp */ +/* End module DmiFill */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/DmiFill.h b/xie/docs/dec/xie23-src/server/xie/smi/DmiFill.h new file mode 100644 index 0000000..f15fc60 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/DmiFill.h @@ -0,0 +1,154 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/******************************************************************************* +** Copyright (c) Digital Equipment Corporation, 1990 All Rights Reserved. +** Unpublished rights reserved under the copyright laws of the United States. +** The software contained on this media is proprietary to and embodies the +** confidential technology of Digital Equipment Corporation. Possession, use, +** duplication or dissemination of the software and media is authorized only +** pursuant to a valid written license from Digital Equipment Corporation. + +** RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the U.S. +** Government is subject to restrictions as set forth in Subparagraph +** (c)(1)(ii) of DFARS 252.227-7013, or in FAR 52.227-19, as applicable. +** +** Derived from work bearing the following copyright and permissions: +** +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Digital Machine Independent DDX +** +** ABSTRACT: +** +** This is the header file for the FILL pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.1 +** RISC ULTRIX V3.1 +** +** AUTHOR(S): +** +** Gary Grebus +** +** CREATION DATE: +** +** Wed Jul 11 10:19:08 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _DMIFILL +#define _DMIFILL + +/* +** Include files +*/ +#include + +/* +** Function reference +*/ +int DmiCreateFill(); +int DmiFill(); +int DmiFillRegion(); +/* +** Structure definitions and Typedefs +*/ + +/* +** Fill pipeline context block. +*/ +typedef struct _FillPipeCtx { + PipeElementCommonPart common; + struct _FillPart { + PipeSinkPtr src; + PipeSinkPtr dst; + long int x1; + long int x2; + long int y1; + long int y2; + UdpPtr cpp; + unsigned long constant[XieK_MaxComponents]; + PipeDrainPtr srcdrn; + } FillPart; +} FillPipeCtx, *FillPipeCtxPtr; + +/* +** MACRO definitions +*/ +/* +** Pipeline context, Fill part, access MACROs +*/ +#define FilSrcDrn_(ctx) (((FillPipeCtxPtr)(ctx))->FillPart.srcdrn) +/* +** Fill Parameters +*/ +#define FilSrcSnk_(ctx) (((FillPipeCtxPtr)(ctx))->FillPart.src) +#define FilDstSnk_(ctx) (((FillPipeCtxPtr)(ctx))->FillPart.dst) +#define FilRoiX1_(ctx) (((FillPipeCtxPtr)(ctx))->FillPart.x1) +#define FilRoiX2_(ctx) (((FillPipeCtxPtr)(ctx))->FillPart.x2) +#define FilRoiY1_(ctx) (((FillPipeCtxPtr)(ctx))->FillPart.y1) +#define FilRoiY2_(ctx) (((FillPipeCtxPtr)(ctx))->FillPart.y2) +#define FilCpp_(ctx) (((FillPipeCtxPtr)(ctx))->FillPart.cpp) +#define FilConst_(ctx,comp) (((FillPipeCtxPtr)(ctx))->FillPart.constant[comp]) + +/* +** External References +*/ + +#endif _DMIFILL + + + + diff --git a/xie/docs/dec/xie23-src/server/xie/smi/DmiMi.c b/xie/docs/dec/xie23-src/server/xie/smi/DmiMi.c new file mode 100644 index 0000000..24ce4bf --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/DmiMi.c @@ -0,0 +1,393 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright (c) Digital Equipment Corporation, 1990 All Rights Reserved. +** Unpublished rights reserved under the copyright laws of the United States. +** The software contained on this media is proprietary to and embodies the +** confidential technology of Digital Equipment Corporation. Possession, use, +** duplication or dissemination of the software and media is authorized only +** pursuant to a valid written license from Digital Equipment Corporation. + +** RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the U.S. +** Government is subject to restrictions as set forth in Subparagraph +** (c)(1)(ii) of DFARS 252.227-7013, or in FAR 52.227-19, as applicable. +** +** Derived from work bearing the following copyright and permissions: +** +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Image Extension +** Digital Machine Independant DDX +** +** ABSTRACT: +** +** This module implements the connection between the XIE server DMI +** (Digital Machine Independent) DDX, and a hardware-specific DDX. +** The hardware-specific DDX uses this interface to obtain DDX services +** which it does not implement. If there is no hardware-specific DDX, +** the DIX requests DMI DDX services using the interface in the module +** DmiDdx.c +** +** The connection consists of: +** - dispatch tables +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 > +** ULTRIX V4.0 > +** +** AUTHOR(S): +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Tue Oct 9 09:23:16 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ + +/* +** Include files +*/ +#include +#include "XieDdx.h" +#include "XieUdpDef.h" + /* + ** Include needed DDX, SMI, MI entry points + */ +#include "SmiArea.h" +#include "SmiArithmetic.h" +#include "SmiChromeCom.h" +#include "SmiChromeSep.h" +#include "SmiCompare.h" +#include "SmiConstrain.h" +#include "SmiCrop.h" +#ifndef XIESMI +#define XIESMI /* Use the XIESMI-style definitions in the DCT code */ +#endif +#include "SmiDctDef.h" /* Must be before DCT files */ +#include "SmiDecodeDct.h" +#include "SmiEncodeDct.h" +#undef XIESMI +#include "DmiDecodeG4.h" +#include "SmiEncodeG4.h" +#include "SmiDither.h" +#include "DmiFill.h" +#include "SmiHistogram.h" +#include "SmiLogical.h" +#include "SmiLuminance.h" +#include "SmiMatchHistogram.h" +#include "SmiMath.h" +#include "SmiMirror.h" +#include "SmiPipeRsm.h" +#include "SmiPipeSched.h" +#include "SmiPipe.h" +#include "DmiPoint.h" +#include "SmiRotate.h" +#include "DmiScale.h" +#include "SmiTranslate.h" +#include "SmiStats.h" +#include "DmiUtil.h" +#include "SmiMemMgt.h" +#include "DmiConvert.h" +#include "DmiExtendInstruct.h" +#include "DmiChangeList.h" + +/* +** Table of contents +*/ + +/* +** MACRO definitions +*/ + +/* +** Equated Symbols +*/ + +/* +** External References +*/ +extern int DmiUsingCL(); +extern int SmiReqFullImg(); + +/* +** Local Storage +*/ + +/******************************************************************************* +** xieMiProc - +** +** FUNCTIONAL DESCRIPTION: +** +** The miProc dispatch table is utilized by MI callers to access MI +** routines without having to know the explicit MI name of the routine. +** This independence will allow substitution of an MI layer in the server +** without code changes. +** +*******************************************************************************/ +externaldef(xieMiProc) unsigned long (*xieMiProc[])() = { + (Fcard32)SmiArea, /* 0 DDX Atomic operations */ + (Fcard32)SmiStatsArea, + (Fcard32)SmiArithmetic, + (Fcard32)SmiHistogram, + (Fcard32)DmiConvert, + (Fcard32)DmiConvert, /* 5 */ + (Fcard32)SmiCompare, + (Fcard32)SmiConstrain, + (Fcard32)DmiCopy, + (Fcard32)SmiDither, + (Fcard32)DmiFill, /* 10 */ + (Fcard32)SmiLogical, + (Fcard32)SmiLuminance, + (Fcard32)SmiMatchHistogram, + (Fcard32)SmiMath, + (Fcard32)SmiMirror, /* 15 */ + (Fcard32)DmiPoint, + (Fcard32)SmiStatsPoint, + (Fcard32)SmiRotate, + (Fcard32)DmiScale, + (Fcard32)SmiTranslate, /* 20 */ + + (Fcard32)RmOwnData, /* 21..32 -- was compression handlers */ + NULL, + NULL, + NULL, + NULL, /* 25 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 30 */ + NULL, + NULL, + + NULL, /* Only defined in the DDX table */ + NULL, + NULL, /* 35 */ + + (Fcard32)DmiConvert, /* MI Support routines */ + (Fcard32)DmiCopy, + (Fcard32)DmiGetTyp, + (Fcard32)DmiCopyBits, + (Fcard32)DmiResolveUdp, /* 40 */ + +#ifdef CLIENT /* CLIENT needs to use Xie */ + (Fcard32)XieCalloc, /* CLIENT needs to use Xie */ + (Fcard32)XieCallocBits, + (Fcard32)XieCfree, + (Fcard32)XieFree, + (Fcard32)XieFreeBits, /* 45 */ + (Fcard32)XieMalloc, + (Fcard32)XieMallocBits, + (Fcard32)XieRealloc, + (Fcard32)XieReallocBits, +#else + (Fcard32)SmiCalloc, /* Memory mgt routines */ + (Fcard32)SmiCallocBits, + (Fcard32)SmiCfree, + (Fcard32)SmiFree, + (Fcard32)SmiFreeBits, /* 45 */ + (Fcard32)SmiMalloc, + (Fcard32)SmiMallocBits, + (Fcard32)SmiRealloc, + (Fcard32)SmiReallocBits, +#endif + (Fcard32)SmiCreatePipeline, /* 50 Pipeline routines */ + (Fcard32)SmiDestroyPipeline, + (Fcard32)SmiPipeHasYielded, + (Fcard32)SmiInitiatePipeline, + (Fcard32)SmiResumePipeline, + (Fcard32)SmiFlushPipeline, /* 55 */ + (Fcard32)SmiAbortPipeline, + + (Fcard32)RmAllocData, /* Pipe rsrc mgr routines*/ + (Fcard32)RmAllocDataDesc, + (Fcard32)RmAllocPermDesc, + (Fcard32)RmAllocRefDesc, /* 60 */ + (Fcard32)RmBestDType, + (Fcard32)RmCreateDrain, + (Fcard32)RmCreateSink, + (Fcard32)RmDeallocData, + (Fcard32)RmDeallocDataDesc, /* 65 */ + (Fcard32)RmDestroyDrain, + (Fcard32)RmDestroySink, + (Fcard32)RmGetData, + (Fcard32)RmGetDType, + (Fcard32)RmGetMaxQuantum, /* 70 */ + (Fcard32)RmGetQuantum, + (Fcard32)RmHasQuantum, + (Fcard32)RmInitializePort, + NULL, + (Fcard32)RmMergeBuffers, /* 75 */ + (Fcard32)RmObtainQuantum, + (Fcard32)RmPutData, + (Fcard32)RmSetDType, + (Fcard32)RmSetQuantum, + (Fcard32)RmSplitBuffers, /* 80 */ + + (Fcard32)SchedProcessComplete, /* Pipe schedule funcs */ + (Fcard32)SchedProcessReady, + (Fcard32)SchedOkToRun, + + (Fcard32)DmiBuildChangeList, /* Change list funcs */ + (Fcard32)DmiPutRuns, /* 85 */ + (Fcard32)_DmiFfsLong, + (Fcard32)_DmiFfcLong, + + (Fcard32)DmiFillRegion, + (Fcard32)DmiConvertCpp, + (Fcard32)DmiCopyCpp, /* 90 */ + (Fcard32)SmiEncodeG4, + (Fcard32)SmiEncodeDct, + (Fcard32)DmiDecodeG4, + (Fcard32)SmiDecodeDct, + (Fcard32)DmiPosCl, /* 95 */ + NULL, + (Fcard32)RmAllocCmpDataDesc, + /* More RM functions */ + (Fcard32)RmSetAlignment, + (Fcard32)RmCreateDataDesc, + + (Fcard32)SmiCreatePipeCtx, /* 100 */ + (Fcard32)DmiUsingCL, + (Fcard32)DmiCmpPreferred, + (Fcard32)RmAllocDataArray, + (Fcard32)RmAllocCmpPermDesc, + (Fcard32)SchedProcessNoInput, /* 105 */ + NULL + }; + +/******************************************************************************* +** XieMiSetup - +** +** FUNCTIONAL DESCRIPTION: +** +** XieMiSetup is the DDX dispatch table used to find MI versions of +** the Create Pipe Element routines. +** +** Routines in this table should be called through the macros +** defined in XieDdx.h. +** +*****************************************************************************/ +externaldef(xieMiSetup) card32 (*xieMiSetup[])() = { + (Fcard32)SmiCreateArea, /* 0 */ + (Fcard32)SmiCreateArithmetic, + (Fcard32)SmiCreateChromeCom, + (Fcard32)SmiCreateChromeSep, + (Fcard32)SmiCreateCompare, + (Fcard32)SmiCreateConstrain, /* 5 */ + (Fcard32)SmiCreateCrop, + (Fcard32)SmiCreateDither, + (Fcard32)DmiCreateFill, + (Fcard32)SmiCreateLogical, + (Fcard32)SmiCreateLuminance, /* 10 */ + (Fcard32)SmiCreateMatchHistogram, + (Fcard32)SmiCreateMath, + (Fcard32)SmiCreateMirror, + (Fcard32)DmiCreatePoint, + (Fcard32)SmiCreateRotate, /* 15 */ + (Fcard32)DmiCreateScale, + (Fcard32)SmiCreateTranslate, + (Fcard32)SmiCreateDecodeDct, + (Fcard32)SmiCreateEncodeDct, + (Fcard32)DmiCreateDecodeG4, /* 20 */ + (Fcard32)SmiCreateEncodeG4, + NULL + }; + +/******************************************************************************* +** XieMiAlign - +** +** FUNCTIONAL DESCRIPTION: +** +** XieMiAlign is the DDX dispatch table used to call the +** MI versions of the image array alignment functions. +** +** A NULL value is used by alignment logic throughout the XIE server +** to indicate "don't care", "no alignment needed". +** +** If alignment is needed, an alignment function must entered in this +** table in the operator/pipeline element named slot. +** +** These functions should be called using the macros defined in XieDdx.h. +** +*******************************************************************************/ +externaldef(xieMiAlign) card32 (*xieMiAlign[])() = { + NULL, /* 0 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 5 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 10 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 15 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 20 */ + NULL, + NULL, + NULL, + NULL + }; diff --git a/xie/docs/dec/xie23-src/server/xie/smi/DmiPoint.c b/xie/docs/dec/xie23-src/server/xie/smi/DmiPoint.c new file mode 100644 index 0000000..889c681 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/DmiPoint.c @@ -0,0 +1,1635 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +** Copyright (c) Digital Equipment Corporation, 1991 All Rights Reserved. +** Unpublished rights reserved under the copyright laws of the United States. +** The software contained on this media is proprietary to and embodies the +** confidential technology of Digital Equipment Corporation. Possession, use, +** duplication or dissemination of the software and media is authorized only +** pursuant to a valid written license from Digital Equipment Corporation. +** +** RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the U.S. +** Government is subject to restrictions as set forth in Subparagraph +** (c)(1)(ii) of DFARS 252.227-7013, or in FAR 52.227-19, as applicable. +** +** Derived from work bearing the following copyright and permissions: +** +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +******************************************************************/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module implements the point operator which remaps pixel +** values using a lookup table. The resulting values can have more or +** fewer levels than the input value. +** +** The width of each data array (input, table, and output) must be +** accounted for when performing the remapping. This produces an n^3 +** number of cases which must be handled: +** +** o The width of the input data can be larger or smaller than the +** width of the table. The only requirement is that the length of +** the table be at least 2^input_width. The input data is accessed +** using GET_VALUE_ to eliminate one level of code duplication, at the +** cost of reduced performance. +** +** o The width of the table can vary (in theory) from 1 to 32 bits. +** To improve performance, and reduce duplication, only aligned, +** atomic, unpadded tables are handled. In the unlikely case the +** supplied table doesn't meet these criteria, a suitable copy is +** made. A separate routine exists to handle each table data type +** (byte, word, longword). +** +** o The width of the output should be the same as the width of the +** table, but data type, alignment, and padding are not guaranteed. +** We'll also handle the cases where the output is narrower than the +** table and assume that the caller knows what it is doing. +** The routines for each table data type replicate blocks of +** code to handle bit, byte, and word aligned output data. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHORS: +** +** Gary L. Grebus +** Rich Hennessy - speed-up +** +** CREATION DATE: +** +** Fri Apr 6 15:05:31 1990 +** +*******************************************************************************/ + +#include + +#include "DmiPoint.h" + +/* +** Table of contents +*/ +int DmiPoint(); +int DmiCreatePoint(); + +static int _PointInitialize(); +static int _PointActivate(); +static int _PointDestroy(); + +static void _PointProcessByte(); +static void _PointProcessWord(); +static void _PointProcessLong(); +static UdpPtr _TempCvtLut(); +static void _TempDestroyUdp(); + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* +** Local storage +*/ + /* + ** Point Element Vector + */ +static PipeElementVector PointPipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypePointElement, /* Structure subtype */ + sizeof(PointPipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _PointInitialize, /* Initialize entry */ + _PointActivate, /* Activate entry */ + NULL, /* Flush entry */ + _PointDestroy, /* Destroy entry */ + NULL /* Abort entry point */ + }; + +/***************************************************************************** +** DmiCreatePoint +** +** FUNCTIONAL DESCRIPTION: +** +** This function fills in a newly created context for a POINT +** pipeline element. +** +** FORMAL PARAMETERS: +** +** pipe - Descriptor for pipe being built. +** srcsnk - Pointer to source sink. +** dstsnk - Pointer to destination sink. +** idc - Pointer to UDP describing the ROI or CPP (NULL if no IDC). +** lut - Array of pointesr to UDPs describing the point remap +** lookup table. +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int DmiCreatePoint(pipe,srcsnk,dstsnk,idc,luts) +Pipe pipe; +PipeSinkPtr srcsnk; +PipeSinkPtr dstsnk; +UdpPtr idc; +UdpPtr luts[XieK_MaxComponents]; + +{ + int i; + int dst_dtype; + + PointPipeCtxPtr ctx = (PointPipeCtxPtr) + DdxCreatePipeCtx_( pipe, &PointPipeElement, FALSE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + /* + ** Copy parameters + */ + PntSrcSnk_(ctx) = srcsnk; + PntDstSnk_(ctx) = dstsnk; + + PntCpp_(ctx) = (idc != NULL && idc->UdpA_Base != NULL) ? + idc : /* It's a CPP */ + NULL; + + for( i = 0; i < XieK_MaxComponents; i++ ) + if( IsPointer_(SnkUdpPtr_(srcsnk,i)) ) + PntCmpIn_(ctx)++; + else + break; + + for (i = 0; i < XieK_MaxComponents; i++) + { + if (SnkUdpPtr_(dstsnk,i) == NULL) + break; + /* Convert the input lookup table for efficient access */ + PntInTable_(ctx,i) = luts[i]; + PntTable_(ctx,i) = _TempCvtLut(luts[i]); + if( !IsPointer_(PntTable_(ctx,i)) ) return( (int) PntTable_(ctx,i) ); + PntCmpOut_(ctx)++; + } + + /* Calculate the region to be remapped */ + if (idc == NULL) + { + PntRoiX1_(ctx) = SnkX1_(srcsnk,0); PntRoiX2_(ctx) = SnkX2_(srcsnk,0); + PntRoiY1_(ctx) = SnkY1_(srcsnk,0); PntRoiY2_(ctx) = SnkY2_(srcsnk,0); + } + else + { + PntRoiX1_(ctx) = idc->UdpL_X1 > SnkX1_(srcsnk,0) ? idc->UdpL_X1 + : SnkX1_(srcsnk,0); + PntRoiX2_(ctx) = idc->UdpL_X2 < SnkX2_(srcsnk,0) ? idc->UdpL_X2 + : SnkX2_(srcsnk,0); + PntRoiY1_(ctx) = idc->UdpL_Y1 > SnkY1_(srcsnk,0) ? idc->UdpL_Y1 + : SnkY1_(srcsnk,0); + PntRoiY2_(ctx) = idc->UdpL_Y2 < SnkY2_(srcsnk,0) ? idc->UdpL_Y2 + : SnkY2_(srcsnk,0); + } + PntSrcDrn_(ctx) = DdxRmCreateDrain_( PntSrcSnk_(ctx), -1 ); + if( !IsPointer_(PntSrcDrn_(ctx)) ) return( (int) PntSrcDrn_(ctx) ); + + /* Handle any constrained input data type */ + DdxRmSetDType_( PntSrcDrn_(ctx), UdpK_DTypeUndefined, DtM_Constrained ); + DdxRmSetQuantum_( PntSrcDrn_(ctx), 1 ); + + /* Since this operator can explicitly cause a change in the number + * of bits per pixel, determine the result datatype by looking at + * the UDP(s) in the destination sink. + */ + /* Handle one scanline at a time */ + dst_dtype = SnkDatTyp_(dstsnk,0); + DdxRmSetDType_( PntDstSnk_(ctx), dst_dtype, DtM_Constrained ); + DdxRmSetQuantum_( PntDstSnk_(ctx), 1 ); + + return( Success ); +} /* end DmiCreatePoint */ + +/***************************************************************************** +** _PointInitialize +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the POINT pipeline element prior to +** activation. +** +** FORMAL PARAMETERS: +** +** ctx - point pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _PointInitialize(ctx) +PointPipeCtxPtr ctx; +{ + int status = DdxRmInitializePort_( CtxHead_(ctx), PntSrcDrn_(ctx) ); + if( status == Success ) + status = DdxRmInitializePort_( CtxHead_(ctx), PntDstSnk_(ctx) ); + + /* We are reading from the only drain */ + CtxInp_(ctx) = PntSrcDrn_(ctx); + + return( status ); +} + +/***************************************************************************** +** _PointActivate +** +** FUNCTIONAL DESCRIPTION: +** +** This routine maps the selected pixels in the input image +** using a transfer function supplied in the form of a lookup +** table (LUT). +** +** FORMAL PARAMETERS: +** +** ctx - point pipeline element context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _PointActivate(ctx) +PointPipeCtxPtr ctx; +{ + PipeDataPtr src, dst = NULL; + int status, i, outidx, copies = PntCmpOut_(ctx) - PntCmpIn_(ctx) + 1; + + for( status = Success; status == Success; src = DdxRmDeallocData_(src), + dst = DdxRmDeallocData_(dst) ) + { + src = DdxRmGetData_( ctx, PntSrcDrn_(ctx) ); + if( !IsPointer_(src) ) return( (int) src ); + + /* If there are more output components than input components, + * we will duplicate the data. */ + for( outidx = DatCmpIdx_(src), i = 0; i < copies; outidx++, i++ ) + { + dst = DdxRmAllocData_( PntDstSnk_(ctx), outidx, DatY1_(src), 1 ); + status = (int) dst; + if( !IsPointer_(dst) ) break; + + if( DatY1_(src) < PntRoiY1_(ctx) || DatY1_(src) > PntRoiY2_(ctx)) + status = DdxConvert_( DatUdpPtr_(src), + DatUdpPtr_(dst), XieK_MoveMode ); + else + { + /* Copy the portions of this line outside the ROI */ + status = DdxCopy_( DatUdpPtr_(src), /* Left */ + DatUdpPtr_(dst), + DatX1_(src), 0, + DatX1_(dst), DatY1_(dst), + PntRoiX1_(ctx) - DatX1_(src), 1 ); + if( status != Success ) break; + + status = DdxCopy_( DatUdpPtr_(src), /* Right */ + DatUdpPtr_(dst), + PntRoiX2_(ctx)+1, 0, + PntRoiX2_(ctx)+1, DatY1_(dst), + DatX2_(src) - PntRoiX2_(ctx), 1 ); + if( status != Success ) break; + + /* Call appropriate routine based on lookup table type */ + switch( PntTable_(ctx,outidx)->UdpB_DType ) + { + case UdpK_DTypeBU : + _PointProcessByte(DatUdpPtr_(src), + DatUdpPtr_(dst), + PntCpp_(ctx), + PntRoiX1_(ctx), + DatY1_(src), + PntRoiX2_(ctx), + DatY1_(src), + PntTable_(ctx,outidx)); + break; + + case UdpK_DTypeWU : + _PointProcessWord(DatUdpPtr_(src), + DatUdpPtr_(dst), + PntCpp_(ctx), + PntRoiX1_(ctx), + DatY1_(src), + PntRoiX2_(ctx), + DatY1_(src), + PntTable_(ctx,outidx)); + break; + + case UdpK_DTypeLU : + _PointProcessLong(DatUdpPtr_(src), + DatUdpPtr_(dst), + PntCpp_(ctx), + PntRoiX1_(ctx), + DatY1_(src), + PntRoiX2_(ctx), + DatY1_(src), + PntTable_(ctx,outidx)); + break; + } + } + if( status == Success ) + { + status = DdxRmPutData_( PntDstSnk_(ctx), dst ); + dst = NULL; + } + if( status != Success ) + break; + } + } + return( status ); +} + +/***************************************************************************** +** _PointDestroy +** +** FUNCTIONAL DESCRIPTION: +** +** This routine deallocates all resources allocated by the POINT +** pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - point pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _PointDestroy(ctx) +PointPipeCtxPtr ctx; +{ + int i; + + PntSrcDrn_(ctx) = DdxRmDestroyDrain_( PntSrcDrn_(ctx) ); + + /* Deallocate the converted lookup tables */ + for(i = 0; i < PntCmpOut_(ctx); i++) + _TempDestroyUdp(PntTable_(ctx,i), PntInTable_(ctx,i)); + + return( Success ); +} + +/***************************************************************************** +** DmiPoint +** +** FUNCTIONAL DESCRIPTION: +** +** This routine performs a non-pipelined point operator, which +** remaps pixel values using a lookup table. Only one component +** is remapped. +** +** FORMAL PARAMETERS: +** +** srcudp - Pointer to a UDP describing the source data. +** dstudp - Pointer to a UDP describing the destination buffer. +** idc - Pointer to a UDP describing the Region of Interest, +** or Control Processing Plane. (NULL if no IDC) +** lut - Pointer to UDP containing one lookup table, organized as a +** single scan line. +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int DmiPoint( srcudp, dstudp, idc, lut ) +UdpPtr srcudp; +UdpPtr dstudp; +UdpPtr idc; +UdpPtr lut; + +{ + UdpPtr table; + UdpPtr cpp; + + long int status, pixels; + long int X1, X2, Y1, Y2; /* Extent of src/dst overlap */ + long int x1, x2, y1, y2; /* Extent of ROI */ + + + /* + ** Allocate the destination image array + */ + if( dstudp->UdpA_Base == NULL ) + { + dstudp->UdpA_Base = DdxMallocBits_( dstudp->UdpL_ArSize ); + if( dstudp->UdpA_Base == NULL ) return( BadAlloc ); + } + + /* + ** Determine maximum common dimensions between source and destination, + ** which is the defined region of output. + */ + X1 = srcudp->UdpL_X1 > dstudp->UdpL_X1 ? srcudp->UdpL_X1 : dstudp->UdpL_X1; + X2 = srcudp->UdpL_X2 < dstudp->UdpL_X2 ? srcudp->UdpL_X2 : dstudp->UdpL_X2; + Y1 = srcudp->UdpL_Y1 > dstudp->UdpL_Y1 ? srcudp->UdpL_Y1 : dstudp->UdpL_Y1; + Y2 = srcudp->UdpL_Y2 < dstudp->UdpL_Y2 ? srcudp->UdpL_Y2 : dstudp->UdpL_Y2; + + /* + ** Determine the maximum common dimensions between the above region + ** and the IDC (ROI or CPP), which is the region that will actually + ** be processed. + */ + if( idc == NULL ) + { + x1 = X1; x2 = X2; + y1 = Y1; y2 = Y2; + } + else + { + x1 = idc->UdpL_X1 > X1 ? idc->UdpL_X1 : X1; + x2 = idc->UdpL_X2 < X2 ? idc->UdpL_X2 : X2; + y1 = idc->UdpL_Y1 > Y1 ? idc->UdpL_Y1 : Y1; + y2 = idc->UdpL_Y2 < Y2 ? idc->UdpL_Y2 : Y2; + } + cpp = (idc != NULL && idc->UdpA_Base != NULL) ? idc : NULL; + + /* + ** Convert the lookup table to an efficient form if necessary + */ + table = _TempCvtLut(lut); + if( !IsPointer_(table) ) return( (int) table ); + + /* + ** If the ROI lies within the src/dst area, copy the areas which + ** don't need to be modified: top, bottom, left, right + */ + status = Success; + if( y1 > Y1 ) + status = DdxCopy_( srcudp, dstudp, X1, Y1, X1, Y1, X2-X1+1, y1-Y1 ); + if( status == Success ) + if( y2 < Y2 ) + status = DdxCopy_( srcudp, dstudp, X1, y2+1, X1, y2+1, X2-X1+1, Y2-y2 ); + if( status == Success ) + if( x1 > X1 ) + status = DdxCopy_( srcudp, dstudp, X1, y1, X1, y1, x1-X1, y2-y1+1 ); + if( status == Success ) + if( x2 < X2 ) + status = DdxCopy_( srcudp, dstudp, x2+1, y1, x2+1, y1, X2-x2, y2-y1+1 ); + + if( status == Success ) + switch (table->UdpB_DType) + { + case UdpK_DTypeBU : + _PointProcessByte(srcudp, dstudp, cpp, x1, y1, x2, y2, table); + break; + + case UdpK_DTypeWU : + _PointProcessWord(srcudp, dstudp, cpp, x1, y1, x2, y2, table); + break; + + case UdpK_DTypeLU : + _PointProcessLong(srcudp, dstudp, cpp, x1, y1, x2, y2, table); + break; + } + + _TempDestroyUdp(table, lut); + + return( status ); +} /* end DmiPoint */ + +/***************************************************************************** +** _PointProcessxxxx +** +** FUNCTIONAL DESCRIPTION: +** +** These routines perform the actual pixel remapping for the +** selected region of an image. +** The src and dst data types must be the same. +** +** FORMAL PARAMETERS: +** +** src - Pointer to a UDP describing the source data. +** dst - Pointer to a UDP describing the destination buffer. +** cpp - Pointer to a UDP describing the Control Processing Plane. +** (NULL if no CPP) +** x1 - The x coordinate of the upper left corner of the CPP, or +** the ROI. +** y1 - The y coordinate of the upper left corner of the CPP, or +** the ROI. +** x2 - The x coordinate of the lower right corner of the CPP, or +** the ROI. +** y2 - The y coordinate of the lower right corner of the CPP, or +** the ROI. +** lut - Pointers to a UDP which contains the lookup table for +** this source udp. +** +*****************************************************************************/ +static void _PointProcessByte(src, dst, cpp, x1, y1, x2, y2, lut) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +long int x1; +long int x2; +long int y1; +long int y2; +UdpPtr lut; +{ + long int pixel; + long int scanline; + + unsigned long srcmask; + unsigned long dstmask; + + long int srcpxlstart; + long int srcpxloff; + long int dstpxlstart; + long int dstpxloff; + unsigned long pxlvalue; + + long int cpppxlstart; + long int cpppxloff; + + srcmask = (1<UdpW_PixelLength)-1; + dstmask = (1<UdpW_PixelLength)-1; + + srcpxlstart = src->UdpL_Pos + (y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dstpxlstart = dst->UdpL_Pos + (y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + + /* + ** Begin massive code duplication to minimize branches in the + ** inner loops. + ** For each dst type, a switch is done on the src type to ensure + ** efficient code is used. + */ + if( cpp == NULL ) + { /* The mapping is not controlled by a CPP */ + switch( DdxGetTyp_( dst ) ) + { + case XieK_UBAV : + case XieK_UBAVU: + /* + ** Destination is aligned or unaligned bit stream format + ** Source format is not considered + */ + for (scanline = y1; scanline <= y2; scanline++) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + pxlvalue = ((unsigned char *)lut->UdpA_Base)[pxlvalue]; + + PUT_VALUE_(dst->UdpA_Base, dstpxloff, pxlvalue, dstmask); + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_ABU : + /* + ** Destination is byte aligned + */ + switch( DdxGetTyp_( src ) ) + { + case XieK_UBAV : /* table/dst == bytes, src bits/LU */ + case XieK_UBAVU : + for (scanline = y1; scanline <= y2; scanline++) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, + srcmask); + pxlvalue = ((unsigned char *) + lut->UdpA_Base)[pxlvalue]; + + PUT_VALUE_(dst->UdpA_Base, dstpxloff, pxlvalue, dstmask); + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_ABU : /* table, dst, src are bytes */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for (pixel = x1; pixel <= x2; pixel++) + { + pxlvalue = *((unsigned char *) + (src->UdpA_Base + (srcpxloff >> 3))); + *((unsigned char *) + (dst->UdpA_Base + (dstpxloff >> 3))) = + ((unsigned char *)lut->UdpA_Base)[pxlvalue]; + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_AWU : /* table/dst are bytes, src is short */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for (pixel = x1; pixel <= x2; pixel++) + { + pxlvalue = *((unsigned short*) + (src->UdpA_Base + (srcpxloff >> 3))); + *((unsigned char *) + (dst->UdpA_Base + (dstpxloff >> 3))) = + ((unsigned char *)lut->UdpA_Base)[pxlvalue]; + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + } + break; /* End table bytes, dst bytes, src type switch */ + + case XieK_AWU : + /* + ** Destination is word (16 bit shorts) aligned + */ + switch( DdxGetTyp_( src ) ) + { + case XieK_UBAV : /* tbl=bytes, dst=short, src bits/LU */ + case XieK_UBAVU : + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for (pixel = x1; pixel <= x2; pixel++) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + pxlvalue = ((unsigned char *) + lut->UdpA_Base)[pxlvalue]; + *((unsigned short *) + (dst->UdpA_Base + (dstpxloff >> 3))) = pxlvalue; + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_ABU : /* tbl = byte, dst = short, src = bytes */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for (pixel = x1; pixel <= x2; pixel++) + { + pxlvalue = *((unsigned char *) + (src->UdpA_Base + (srcpxloff >> 3))); + *((unsigned short *) + (dst->UdpA_Base + (dstpxloff >> 3))) = + ((unsigned char *)lut->UdpA_Base)[pxlvalue]; + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_AWU : /* tbl = byte, dst = short, src = short */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for (pixel = x1; pixel <= x2; pixel++) + { + pxlvalue = *((unsigned short *) + (src->UdpA_Base + (srcpxloff >> 3))); + *((unsigned short *) + (dst->UdpA_Base + (dstpxloff >> 3))) = + ((unsigned char *)lut->UdpA_Base)[pxlvalue]; + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + } + break; /* End table bytes, dst shorts, src type switch */ + } /* End table bytes, dst type switch */ + + } /* End if then */ + + else + { + /* The mapping is controlled by a Control Processing Plane */ + + cpppxlstart = cpp->UdpL_Pos + cpp->UdpL_ScnStride * (y1 - cpp->UdpL_Y1); + + switch( DdxGetTyp_( dst ) ) + { + case XieK_UBAV : + case XieK_UBAVU : + /* Destination is aligned or unaligned bit stream format */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + cpppxloff = cpppxlstart; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + if (GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1)) + pxlvalue = ((unsigned char *)lut->UdpA_Base)[pxlvalue]; + + PUT_VALUE_(dst->UdpA_Base, dstpxloff, pxlvalue, dstmask); + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + cpppxloff += cpp->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + cpppxlstart += cpp->UdpL_ScnStride; + } + break; + + case XieK_ABU : + /* Destination is byte aligned */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + cpppxloff = cpppxlstart; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + if (GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1) ) + pxlvalue = ((unsigned char *)lut->UdpA_Base)[pxlvalue]; + + cpppxloff += cpp->UdpL_PxlStride; + + (*(unsigned char *) + (dst->UdpA_Base + (dstpxloff >> 3))) = pxlvalue; + + srcpxloff+=src->UdpL_PxlStride; + dstpxloff+=dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + cpppxlstart += cpp->UdpL_ScnStride; + } + break; + + case XieK_AWU: + /* Destination is word (16 bit short) aligned */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + cpppxloff = cpppxlstart; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + if (GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1) ) + pxlvalue = ((unsigned char *)lut->UdpA_Base)[pxlvalue]; + + cpppxloff += cpp->UdpL_PxlStride; + + (*(unsigned short *) + (dst->UdpA_Base + (dstpxloff >> 3))) = pxlvalue; + + srcpxloff+=src->UdpL_PxlStride; + dstpxloff+=dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + cpppxlstart += cpp->UdpL_ScnStride; + } + break; + } /* end switch*/ + } +} /* end _PointProcessByte */ + + +static void _PointProcessWord(src, dst, cpp, x1, y1, x2, y2, lut) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +long int x1; +long int x2; +long int y1; +long int y2; +UdpPtr lut; +{ + long int pixel; + long int scanline; + + unsigned long srcmask; + unsigned long dstmask; + + long int srcpxlstart; + long int srcpxloff; + long int dstpxlstart; + long int dstpxloff; + unsigned long pxlvalue; + + long int cpppxlstart; + long int cpppxloff; + + srcmask = (1<UdpW_PixelLength)-1; + dstmask = (1<UdpW_PixelLength)-1; + + srcpxlstart = src->UdpL_Pos + (y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dstpxlstart = dst->UdpL_Pos + (y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + + /* + ** Begin massive code duplication to minimize branches in the + ** inner loops. + ** For each dst type, a switch is done on the src type to ensure + ** efficient code is used. + */ + if( cpp == NULL ) + { + /* The mapping is not controlled by a CPP */ + switch( DdxGetTyp_( dst ) ) + { + case XieK_UBAV : + case XieK_UBAVU: /* This currently handles LU + * data due to hack in DdxGetTyp_ */ + /* + ** Destination is aligned or unaligned bit stream format + ** Source format is not considered + */ + for (scanline = y1; scanline <= y2; scanline++) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + pxlvalue = ((unsigned short *)lut->UdpA_Base)[pxlvalue]; + + PUT_VALUE_(dst->UdpA_Base, dstpxloff, pxlvalue, dstmask); + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_ABU : + /* + ** Destination is byte aligned + */ + switch( DdxGetTyp_( src ) ) + { + case XieK_UBAV : /* tbl = short, dst = bytes, src bits/LU */ + case XieK_UBAVU : + for (scanline = y1; scanline <= y2; scanline++) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, + srcmask); + pxlvalue = ((unsigned short *) + lut->UdpA_Base)[pxlvalue]; + PUT_VALUE_(dst->UdpA_Base, dstpxloff, pxlvalue, + dstmask); + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_ABU : /* tbl = short, dst = byte, src = byte */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for (pixel = x1; pixel <= x2; pixel++) + { + pxlvalue = *((unsigned char *) + (src->UdpA_Base + (srcpxloff >> 3))); + *((unsigned char *) + (dst->UdpA_Base + (dstpxloff >> 3))) = + ((unsigned short *)lut->UdpA_Base)[pxlvalue]; + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_AWU : /* tbl = short, dst = byte, src = short */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for (pixel = x1; pixel <= x2; pixel++) + { + pxlvalue = *((unsigned short*) + (src->UdpA_Base + (srcpxloff >> 3))); + *((unsigned char *) + (dst->UdpA_Base + (dstpxloff >> 3))) = + ((unsigned short *)lut->UdpA_Base)[pxlvalue]; + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + } /* End tbl = short, dst = byte, src type switch */ + break; + + case XieK_AWU : + /* + ** Destination is word (16 bit short) aligned + */ + switch( DdxGetTyp_( src ) ) + { + case XieK_UBAV : /* tbl=short, dst=short, src bits/LU */ + case XieK_UBAVU : + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for (pixel = x1; pixel <= x2; pixel++) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + *((unsigned short *) + (dst->UdpA_Base + (dstpxloff >> 3))) = + ((unsigned short *) + lut->UdpA_Base)[pxlvalue]; + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_ABU : /* tbl = short, dst = short, src = bytes */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for (pixel = x1; pixel <= x2; pixel++) + { + pxlvalue = *((unsigned char *) + (src->UdpA_Base + (srcpxloff >> 3))); + *((unsigned short *) + (dst->UdpA_Base + (dstpxloff >> 3))) = + ((unsigned short *) + lut->UdpA_Base)[pxlvalue]; + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_AWU : /* tbl = short, dst = short, src = short */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for (pixel = x1; pixel <= x2; pixel++) + { + pxlvalue = *((unsigned short *) + (src->UdpA_Base + (srcpxloff >> 3))); + *((unsigned short *) + (dst->UdpA_Base + (dstpxloff >> 3))) = + ((unsigned short *)lut->UdpA_Base)[pxlvalue]; + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + } /* End tbl = short, dst = short, src type swich */ + } /* End tbl = short, dst type switch */ + } /* End if then */ + + else + { + /* The mapping is controlled by a Control Processing Plane */ + + cpppxlstart = cpp->UdpL_Pos + cpp->UdpL_ScnStride * (y1 - cpp->UdpL_Y1); + + switch( DdxGetTyp_( dst ) ) + { + case XieK_UBAV : + case XieK_UBAVU : + /* Destination is aligned or unaligned bit stream format */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + cpppxloff = cpppxlstart; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + if (GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1)) + pxlvalue = ((unsigned short *)lut->UdpA_Base)[pxlvalue]; + PUT_VALUE_(dst->UdpA_Base, dstpxloff, pxlvalue, dstmask); + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + cpppxloff += cpp->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + cpppxlstart += cpp->UdpL_ScnStride; + } + break; + + case XieK_ABU : + /* Destination is byte aligned */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + cpppxloff = cpppxlstart; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + + if (GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1) ) + pxlvalue = ((unsigned short *)lut->UdpA_Base)[pxlvalue]; + + (*(unsigned char *) + (dst->UdpA_Base + (dstpxloff >> 3))) = pxlvalue; + + srcpxloff+=src->UdpL_PxlStride; + dstpxloff+=dst->UdpL_PxlStride; + cpppxloff += cpp->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + cpppxlstart += cpp->UdpL_ScnStride; + } + break; + + case XieK_AWU : + /* Destination is word (16 bit short) aligned */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + cpppxloff = cpppxlstart; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + + if (GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1) ) + pxlvalue = ((unsigned short *)lut->UdpA_Base)[pxlvalue]; + + (*(unsigned short *) + (dst->UdpA_Base + (dstpxloff >> 3))) = pxlvalue; + + srcpxloff+=src->UdpL_PxlStride; + dstpxloff+=dst->UdpL_PxlStride; + cpppxloff += cpp->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + cpppxlstart += cpp->UdpL_ScnStride; + } + break; + + } /* end switch */ + } +} /* end _PointProcessWord */ + + +static void _PointProcessLong(src, dst, cpp, x1, y1, x2, y2, lut) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +long int x1; +long int x2; +long int y1; +long int y2; +UdpPtr lut; +{ + long int pixel; + long int scanline; + + unsigned long srcmask; + unsigned long dstmask; + + long int srcpxlstart; + long int srcpxloff; + long int dstpxlstart; + long int dstpxloff; + unsigned long pxlvalue; + + long int cpppxlstart; + long int cpppxloff; + + srcmask = (1<UdpW_PixelLength)-1; + dstmask = (1<UdpW_PixelLength)-1; + + srcpxlstart = src->UdpL_Pos + (y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dstpxlstart = dst->UdpL_Pos + (y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + + /* + ** Begin massive code duplication to minimize branches in the + ** inner loops. + ** For each dst type, a switch is done on the src type to ensure + ** efficient code is used. + */ + if( cpp == NULL ) + { + /* The mapping is not controlled by a CPP */ + switch( DdxGetTyp_( dst ) ) + { + case XieK_UBAV : + case XieK_UBAVU: /* This currently handles LU + * data due to hack in DdxGetTyp_ */ + /* + ** Destination is aligned or unaligned bit stream format + ** Source format is not considered + */ + for (scanline = y1; scanline <= y2; scanline++) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + pxlvalue = ((unsigned long *)lut->UdpA_Base)[pxlvalue]; + + PUT_VALUE_(dst->UdpA_Base, dstpxloff, pxlvalue, dstmask); + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_ABU : + /* + ** Destination is byte aligned + */ + switch( DdxGetTyp_( src ) ) + { + case XieK_UBAV : /* tbl = long, dst = byte, src bits/LU */ + case XieK_UBAVU : + for (scanline = y1; scanline <= y2; scanline++) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, + srcmask); + pxlvalue = ((unsigned long *) + lut->UdpA_Base)[pxlvalue]; + + PUT_VALUE_(dst->UdpA_Base, dstpxloff, pxlvalue, dstmask); + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_ABU : /* tbl = long, dst = byte, src = byte */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1) + * src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1) + * dst->UdpL_PxlStride; + + for (pixel = x1; pixel <= x2; pixel++) + { + pxlvalue = *((unsigned char *) + (src->UdpA_Base + (srcpxloff >> 3))); + *((unsigned char *) + (dst->UdpA_Base + (dstpxloff >> 3))) = + ((unsigned long *)lut->UdpA_Base)[pxlvalue]; + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_AWU : /* tbl = long, dst = byte, src = short */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1) + * src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1) + * dst->UdpL_PxlStride; + + for (pixel = x1; pixel <= x2; pixel++) + { + pxlvalue = *((unsigned short *) + (src->UdpA_Base + (srcpxloff >> 3))); + + *((unsigned char *) + (dst->UdpA_Base + (dstpxloff >> 3))) = + ((unsigned long *)lut->UdpA_Base)[pxlvalue]; + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + } /* End tbl = long, dst = byte, src type switch */ + break; + + case XieK_AWU : + /* + ** Destination is word (16 bit short) aligned + */ + switch( DdxGetTyp_( src ) ) + { + case XieK_UBAV : /* tbl = long, dst = short, src bits/LU */ + case XieK_UBAVU : + for (scanline = y1; scanline <= y2; scanline++) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, + srcmask); + pxlvalue = ((unsigned long *) + lut->UdpA_Base)[pxlvalue]; + + PUT_VALUE_(dst->UdpA_Base, dstpxloff, pxlvalue, dstmask); + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_ABU : /* tbl = long, dst = short, src = byte */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1) + * src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1) + * dst->UdpL_PxlStride; + + for (pixel = x1; pixel <= x2; pixel++) + { + pxlvalue = *((unsigned char *) + (src->UdpA_Base + (srcpxloff >> 3))); + *((unsigned short *) + (dst->UdpA_Base + (dstpxloff >> 3))) = + ((unsigned long *)lut->UdpA_Base)[pxlvalue]; + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_AWU : /* tbl = long, dst = short, src = short */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1) + * src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1) + * dst->UdpL_PxlStride; + + for (pixel = x1; pixel <= x2; pixel++) + { + pxlvalue = *((unsigned short *) + (src->UdpA_Base + (srcpxloff >> 3))); + + *((unsigned short *) + (dst->UdpA_Base + (dstpxloff >> 3))) = + ((unsigned long *)lut->UdpA_Base)[pxlvalue]; + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + } /* End tbl = long, dst = byte, src type switch */ + } /* End tbl = long, dst type switch */ + } /* End if then */ + + else + { + /* The mapping is controlled by a Control Processing Plane */ + + cpppxlstart = cpp->UdpL_Pos + cpp->UdpL_ScnStride * (y1 - cpp->UdpL_Y1); + + switch( DdxGetTyp_( dst ) ) + { + case XieK_UBAV : + case XieK_UBAVU : + /* Destination is aligned or unaligned bit stream format */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + cpppxloff = cpppxlstart; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + if (GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1)) + pxlvalue = ((unsigned long *)lut->UdpA_Base)[pxlvalue]; + + PUT_VALUE_(dst->UdpA_Base, dstpxloff, pxlvalue, dstmask); + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + cpppxloff += cpp->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + cpppxlstart += cpp->UdpL_ScnStride; + } + break; + + case XieK_ABU : + /* Destination is byte aligned */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + cpppxloff = cpppxlstart; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + + if (GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1) ) + pxlvalue = ((unsigned long *)lut->UdpA_Base)[pxlvalue]; + + (*(unsigned char *) + (dst->UdpA_Base + (dstpxloff >> 3))) = pxlvalue; + + srcpxloff+=src->UdpL_PxlStride; + dstpxloff+=dst->UdpL_PxlStride; + cpppxloff += cpp->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + cpppxlstart += cpp->UdpL_ScnStride; + } + break; + + case XieK_AWU : + /* Destination is word (16 bit short) aligned */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + cpppxloff = cpppxlstart; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + + if (GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1) ) + pxlvalue = ((unsigned long *)lut->UdpA_Base)[pxlvalue]; + + (*(unsigned short *) + (dst->UdpA_Base + (dstpxloff >> 3))) = pxlvalue; + + srcpxloff+=src->UdpL_PxlStride; + dstpxloff+=dst->UdpL_PxlStride; + cpppxloff += cpp->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + cpppxlstart += cpp->UdpL_ScnStride; + } + break; + + } /* end switch */ + } +} /* end _PointProcessLong */ + +/***************************************************************************** +** _TempCvtLut +** +** FUNCTIONAL DESCRIPTION: +** +** Convert data, described by src UDP, into the nearest atomic array +** datatype which will hold it. The result is created with no +** pad, so it can be indexed efficiently. +** If the formats is already suitable, just return the original UDP. +** +** +** FORMAL PARAMETERS: +** +** src - Pointer to input UDP +** +** FUNCTION VALUE: +** +** Returns a pointer to a UDP describing the data. +** +*****************************************************************************/ +static UdpPtr _TempCvtLut(src) + UdpPtr src; +{ + UdpPtr out; + int pixel_length, dtype, status; + + if((src->UdpB_DType != UdpK_DTypeBU && + src->UdpB_DType != UdpK_DTypeWU && + src->UdpB_DType != UdpK_DTypeLU) || + (src->UdpL_PxlStride != src->UdpW_PixelLength || + src->UdpL_ScnStride != (src->UdpL_PxlPerScn * src->UdpL_PxlStride) || + src->UdpL_Pos != 0)) + { + if( src->UdpL_Levels <= 256 ) + { + pixel_length = 8 * sizeof(char); + dtype = UdpK_DTypeBU; + } + else if( src->UdpL_Levels <= 65535 ) + { + pixel_length = 8 * sizeof(short); + dtype = UdpK_DTypeWU; + } + else + { + pixel_length = 8 * sizeof(long); + dtype = UdpK_DTypeLU; + } + out = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( out == NULL ) return( (UdpPtr) BadAlloc ); + + out->UdpW_PixelLength = pixel_length; + out->UdpB_DType = dtype; + out->UdpB_Class = UdpK_ClassA; + out->UdpL_X1 = src->UdpL_X1; + out->UdpL_X2 = src->UdpL_X2; + out->UdpL_Y1 = src->UdpL_Y1; + out->UdpL_Y2 = src->UdpL_Y2; + out->UdpL_PxlPerScn = src->UdpL_PxlPerScn; + out->UdpL_ScnCnt = src->UdpL_ScnCnt; + out->UdpL_PxlStride = out->UdpW_PixelLength; + out->UdpL_ScnStride = out->UdpL_PxlStride * out->UdpL_PxlPerScn; + out->UdpL_ArSize = out->UdpL_ScnStride * out->UdpL_ScnCnt; + out->UdpA_Base = NULL; + out->UdpL_Pos = 0; + out->UdpL_CompIdx = src->UdpL_CompIdx; + out->UdpL_Levels = src->UdpL_Levels; + + status = DdxConvert_( src, out, XieK_MoveMode ); + if( status != Success ) return( DdxFree_(out), (UdpPtr) status ); + } + else + out = src; + + return( out ); +} /* end _TempCvtLut */ + +/***************************************************************************** +** _TempDestroyUdp +** +** FUNCTIONAL DESCRIPTION: +** +** Free a temporary UDPs and its data, if it is not just a +* reference to another UDP. +** +** FORMAL PARAMETERS: +** +** in - Pointer to input UDP +** realudp - Point to a UDP which might be the same as the input UDP. +** +*****************************************************************************/ +static void _TempDestroyUdp(in, realudp) + UdpPtr in; + UdpPtr realudp; +{ + if( IsPointer_(in) && in != realudp ) + { + if( IsPointer_(in->UdpA_Base) ) + DdxFreeBits_(in->UdpA_Base); + DdxFree_(in); + } +} /* end _TempDestroyUdp */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/DmiPoint.h b/xie/docs/dec/xie23-src/server/xie/smi/DmiPoint.h new file mode 100644 index 0000000..1ab9fe3 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/DmiPoint.h @@ -0,0 +1,141 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the DMI POINT pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.0 +** RISC ULTRIX V3.0 +** +** AUTHOR(S): +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Fri Apr 6 15:05:04 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _DMIPOINT +#define _DMIPOINT + +/* +** Include files +*/ +#include + + /* + ** Function reference + */ +int DmiPoint(); +int DmiCreatePoint(); + +/* +** Structure definitions and Typedefs +*/ + +/* +** Point pipeline context block. +*/ +typedef struct _PointPipeCtx { + PipeElementCommonPart common; + struct _PointPart { + PipeSinkPtr srcsnk; + PipeSinkPtr dstsnk; + PipeDrainPtr srcdrn; + UdpPtr cpp; + long int x1; /* ROI or CPP position and extent */ + long int x2; + long int y1; + long int y2; + int cmpin; + int cmpout; + UdpPtr table[XieK_MaxComponents]; + UdpPtr intable[XieK_MaxComponents]; + } PointPart; +} PointPipeCtx, *PointPipeCtxPtr; + +/* +** MACRO definitions +*/ + +/* +** Pipeline context, Point part, access MACROs +*/ +#define PntSrcSnk_(ctx) (((PointPipeCtxPtr)(ctx))->PointPart.srcsnk) +#define PntDstSnk_(ctx) (((PointPipeCtxPtr)(ctx))->PointPart.dstsnk) + +#define PntSrcDrn_(ctx) (((PointPipeCtxPtr)(ctx))->PointPart.srcdrn) +#define PntCpp_(ctx) (((PointPipeCtxPtr)(ctx))->PointPart.cpp) +#define PntRoiX1_(ctx) (((PointPipeCtxPtr)(ctx))->PointPart.x1) +#define PntRoiX2_(ctx) (((PointPipeCtxPtr)(ctx))->PointPart.x2) +#define PntRoiY1_(ctx) (((PointPipeCtxPtr)(ctx))->PointPart.y1) +#define PntRoiY2_(ctx) (((PointPipeCtxPtr)(ctx))->PointPart.y2) +#define PntCmpIn_(ctx) (((PointPipeCtxPtr)(ctx))->PointPart.cmpin) +#define PntCmpOut_(ctx) (((PointPipeCtxPtr)(ctx))->PointPart.cmpout) +#define PntInTable_(ctx,comp) \ + (((PointPipeCtxPtr)(ctx))->PointPart.intable[comp]) +#define PntTable_(ctx,comp) (((PointPipeCtxPtr)(ctx))->PointPart.table[comp]) + +#endif +/* _DMIPOINT */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/DmiScale.c b/xie/docs/dec/xie23-src/server/xie/smi/DmiScale.c new file mode 100644 index 0000000..5fa98ff --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/DmiScale.c @@ -0,0 +1,2315 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright (c) Digital Equipment Corporation, 1990 All Rights Reserved. +** Unpublished rights reserved under the copyright laws of the United States. +** The software contained on this media is proprietary to and embodies the +** confidential technology of Digital Equipment Corporation. Possession, use, +** duplication or dissemination of the software and media is authorized only +** pursuant to a valid written license from Digital Equipment Corporation. + +** RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the U.S. +** Government is subject to restrictions as set forth in Subparagraph +** (c)(1)(ii) of DFARS 252.227-7013, or in FAR 52.227-19, as applicable. +** +** Derived from work bearing the following copyright and permissions: +** +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains the support for the scale pipeline element. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** +** AUTHOR(S): +** +** John Weber +** Bob Shelley (bitonal scale algorithms) +** Gary Grebus (cloned from SmiConvert) +** +** CREATION DATE: +** +** Mon Aug 27 14:01:43 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ + +/* +** Include files +*/ +#include + +#include "DmiScale.h" + +/* +** Table of contents +*/ +int DmiScale(); +int DmiCreateScale(); + +static int _ScaleInitialize(); +static int _ScaleActivate(); +static int _ScaleFlush(); +static int _ScaleDestroy(); + +static ScaleProc _ScaleHorizontal(); +static ScaleProc _ScaleVertical(); +static ScaleProc _ScaleVerticalCl(); + +static int _ScaleVerticalUp(); +static int _ScaleVerticalDown(); +static int _ScaleVerticalUpCl(); +static int _ScaleVerticalDownCl(); +static int _ScaleVerticalNoneCl(); +static int _ScaleVerticalDownClFast(); + +static int _ScaleHorizontalNone(); +static int _ScaleHorizontalNoneCl(); + +static int _ScaleHorizontalDownBits(); +static int _ScaleHorizontalDownBytes(); +static int _ScaleHorizontalDownWords(); +static int _ScaleHorizontalDownFloats(); +static int _ScaleHorizontalDownCl(); + +static int _ScaleHorizontalUpBits(); +static int _ScaleHorizontalUpBytes(); +static int _ScaleHorizontalUpWords(); +static int _ScaleHorizontalUpFloats(); +static int _ScaleHorizontalUpCl(); + +static void _ScaleAnalyzeSrc(); +static void _ScaleExtractDst(); +static void _ScaleGetClUdp(); +static void _ScaleDestroyClUdp(); + +static UdpPtr _ChkUdp(); +static unsigned int *_BuildHrzMap(); +static struct VPOINT *_BuildVRun(); + +/* +** MACRO definitions +*/ + +/* +** Equated Symbols +*/ +#undef FAST_SCALE_DOWN /* Select prettier but slower + * form of changelist scale down */ + +#define ALL0 8 /* VLIST window pre-set for NEXT == CURRENT == OUT == 0's */ +#define ALL1 7 /* VLIST window pre-set for NEXT == CURRENT == OUT == 1's */ +#define OUT 1 /* VLIST window mask for OUT polarity bit */ + +/* Structure defining vertical run transition points. */ +static struct VPOINT + { + long flink; /* link to next active column */ + int window; /* vertical window state */ + }; + +/* +** External References +*/ + +/* +** Local Storage +*/ + /* + ** Scale Element Vector + */ +static PipeElementVector ScalePipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeScaleElement, /* Structure subtype */ + sizeof(ScalePipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _ScaleInitialize, /* Initialize entry */ + _ScaleActivate, /* Activate entry */ + _ScaleFlush, /* Flush entry */ + _ScaleDestroy, /* Destroy entry */ + NULL /* Abort entry point */ + }; + +/* +** Look-up tables for vertical scaling of bitonal images using changelists. +** +** Source CHANGELISTs are processed in groups, by _ScaleAnalyzeSrc, to +** create destination CHANGELIST, via _ScaleExtractDst, which can then be +** horizontally scaled and written to the destination image. +** +** Each SRC group consists of the N source scanlines required to make up a DST +** scanline. An array of VPOINT structures is treated as a linked list called +** the VLIST. The array elements represent vertical columns of the SRC bitmap +** bracketed by column -1 (left of left) and X+1 (right of right). The VLIST +** forms a sliding window which covers two groups of scanlines at a time. +** Each VLIST element holds a 'flink' which links it to the next "active" +** column, and a 7 bit 'window' consisting of 3 fields: +** +** +--6--+--5--+--4--+--3--+--2--+--1--+--0--+ +** | NEXT | CURRENT | OUT | +** |< N >< 0 >|< N >< 0 >| | +** +-----+-----+-----+-----+-----+-----+-----+ +** - OUT DST pixel polarity OUTput for the previous DST CHANGELIST, +** - CURRENT SRC group data for the CURRENT DST CHANGELIST being created, +** - NEXT SRC group data for the NEXT DST CHANGELIST to create. +** +** The CURRENT and NEXT fields each consist of three bits (right to left): +** - initial polarity of the group (ie. pixel polarity of CHANGELIST 0), +** - first transition polarity within the group +** (ie. found in any CHANGELIST 1 thru N), +** - final polarity of the group (ie. pixel polarity of CHANGELIST N). +** (If a group consists of a single CHANGELIST or no vertical transitions +** are encountered, all three bits will equal the initial polarity.) +** +** Routine _ScaleAnalyzeSrc processes the NEXT SRC group. Any newly "active" +** column is linked in, and the contents of 'window' are used as an index +** to look-up table 'next_0' or 'next_1' depending on whether the pixel +** at the column being processed is a 0 or 1 respectively. Only the NEXT +** field is affected by the look-up as follows: +** +** previous NEXT from NEXT from +** NEXT next_0 next_1 +** 000 000 110 +** 001 001 101 +** 010 010 110 +** 011 000 111 011 and 100 are initial values set +** 100 000 111 by 'extract_dst' (see below). +** 101 001 101 +** 110 010 110 +** 111 001 111 +** +** (Entries containing ZERO in the following tables are never accessed.) +*/ + +#define ZERO 0 +/* +** 0 bit read from next SRC CHANGELIST +*/ +#ifdef VMS +static readonly int next_0[] = { +#else +static int next_0[] = { +#endif +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F*/ +0x00,0x01,0x02,0x03,0x04,0x05,ZERO,0x0F,0x00,ZERO,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x10,0x11,0x12,0x13,0x14,0x15,ZERO,ZERO,ZERO,ZERO,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, +0x20,0x21,0x22,0x23,0x24,0x25,ZERO,ZERO,ZERO,ZERO,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, +0x00,0x01,0x02,0x03,0x04,0x05,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO, +ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, +0x10,0x11,0x12,0x13,0x14,0x15,ZERO,ZERO,ZERO,ZERO,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, +0x20,0x21,0x22,0x23,0x24,0x25,ZERO,ZERO,ZERO,ZERO,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, +0x10,0x11,0x12,0x13,0x14,0x15,ZERO,ZERO,ZERO,ZERO,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + }; + +/* +** 1 bit read from next SRC CHANGELIST +*/ +#ifdef VMS +static readonly int next_1[] = { +#else +static int next_1[] = { +#endif +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F*/ +0x60,0x61,0x62,0x63,0x64,0x65,ZERO,0x7F,0x70,ZERO,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, +0x50,0x51,0x52,0x53,0x54,0x55,ZERO,ZERO,ZERO,ZERO,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, +0x60,0x61,0x62,0x63,0x64,0x65,ZERO,ZERO,ZERO,ZERO,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, +0x70,0x71,0x72,0x73,0x74,0x75,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO, +ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, +0x50,0x51,0x52,0x53,0x54,0x55,ZERO,ZERO,ZERO,ZERO,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, +0x60,0x61,0x62,0x63,0x64,0x65,ZERO,ZERO,ZERO,ZERO,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, +0x70,0x71,0x72,0x73,0x74,0x75,ZERO,ZERO,ZERO,ZERO,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F + }; +/* +** Routine _ScaleExtractDst reinitializes each "active" VLIST element by using +** the contents of 'window' as the index to the look-up table. The lookup +** table can be chosen to further alter the algorithm so that perference is +** given to increase the legibility of one pixel polarity over another. The +** choice of look-up tables and their contents implements the following +** algorithm to determine the new value for OUT: +** +** Note: currently the "PreferBoth" (i.e. prefer neither) mode is used. +** +** IF (NOT( PreferBoth ) +** AND( initial polarity of CURRENT equals OUT equals PREFERENCE ) +** AND( there follows a SINGLE transition ) +** AND( initial polarity of NEXT is not PREFERENCE ) +** +** THEN OUT will be of the PREFERENCE polarity, +** +** ELSE IF ( CURRENT contains any pixel not equal to OUT ) +** +** THEN complement OUT, +** +** ELSE OUT remains unchanged. +** +** Besides choosing the polarity of OUT, the table look-up also copies NEXT +** into CURRENT, and re-initializes NEXT to the special value, 011 or 100, +** depending on whether the 'final polarity' of NEXT had been 0 or 1. +** +** If the new window state of a column is identical to the window state of +** the nearest "active" column to its left, the column is redundant, and +** therefore is unlinked within the VLIST (making it not "active"). +*/ + +/* The prefer_0 and prefer_1 tables are not currently used since XIE protocol +** has no mechanism for expressing the preference. +*/ + +#ifdef NEVER_USED + +/* +** Decision table: PREFERENCE = 0 +*/ +#ifdef VMS +static readonly int prefer_0[] = { +#else +static int prefer_0[] = { +#endif +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F*/ +ALL0,0x30,0x31,0x30,0x31,0x30,ZERO,ALL1,ALL0,ZERO,0x31,0x30,0x31,0x30,0x31,0x31, +0x32,0x32,0x33,0x32,0x33,0x32,ZERO,ZERO,ZERO,ZERO,0x33,0x32,0x32,0x32,0x33,0x33, +0x34,0x34,0x35,0x34,0x35,0x34,ZERO,ZERO,ZERO,ZERO,0x35,0x34,0x35,0x34,0x35,0x35, +ALL0,ALL0,ALL1,ALL0,ALL1,ALL0,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO, +ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ALL1,ALL0,ALL0,ALL0,ALL1,ALL1, +0x4A,0x4A,0x4B,0x4A,0x4B,0x4A,ZERO,ZERO,ZERO,ZERO,0x4B,0x4A,0x4A,0x4A,0x4B,0x4B, +0x4C,0x4C,0x4D,0x4C,0x4D,0x4C,ZERO,ZERO,ZERO,ZERO,0x4D,0x4C,0x4D,0x4C,0x4D,0x4D, +0x4E,0x4E,0x4F,0x4E,0x4F,0x4E,ZERO,ZERO,ZERO,ZERO,0x4F,0x4E,0x4E,0x4E,0x4F,ALL1 + }; + +/* +** Decision table: PREFERENCE = 1 +*/ +#ifdef VMS +static readonly int prefer_1[] = { +#else +static int prefer_1[] = { +#endif +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F*/ +ALL0,0x30,0x31,0x31,0x31,0x30,ZERO,ALL1,ALL0,ZERO,0x31,0x30,0x31,0x30,0x31,0x31, +0x32,0x32,0x33,0x32,0x33,0x32,ZERO,ZERO,ZERO,ZERO,0x33,0x32,0x33,0x32,0x33,0x33, +0x34,0x34,0x35,0x35,0x35,0x34,ZERO,ZERO,ZERO,ZERO,0x35,0x34,0x35,0x34,0x35,0x35, +ALL0,ALL0,ALL1,ALL1,ALL1,ALL0,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO, +ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ALL1,ALL0,ALL1,ALL0,ALL1,ALL1, +0x4A,0x4A,0x4B,0x4A,0x4B,0x4A,ZERO,ZERO,ZERO,ZERO,0x4B,0x4A,0x4B,0x4A,0x4B,0x4B, +0x4C,0x4C,0x4D,0x4D,0x4D,0x4C,ZERO,ZERO,ZERO,ZERO,0x4D,0x4C,0x4D,0x4C,0x4D,0x4D, +0x4E,0x4E,0x4F,0x4E,0x4F,0x4E,ZERO,ZERO,ZERO,ZERO,0x4F,0x4E,0x4F,0x4E,0x4F,ALL1 + }; + +#endif /* NEVER_USED */ +/* +** Decision table: treat 0 and 1 equally +*/ +#ifdef VMS +static readonly int prefer_both[] = { +#else +static int prefer_both[] = { +#endif +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F*/ +ALL0,0x30,0x31,0x30,0x31,0x30,ZERO,ALL1,ALL0,ZERO,0x31,0x30,0x31,0x30,0x31,0x31, +0x32,0x32,0x33,0x32,0x33,0x32,ZERO,ZERO,ZERO,ZERO,0x33,0x32,0x33,0x32,0x33,0x33, +0x34,0x34,0x35,0x34,0x35,0x34,ZERO,ZERO,ZERO,ZERO,0x35,0x34,0x35,0x34,0x35,0x35, +ALL0,ALL0,ALL1,ALL0,ALL1,ALL0,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO, +ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ALL1,ALL0,ALL1,ALL0,ALL1,ALL1, +0x4A,0x4A,0x4B,0x4A,0x4B,0x4A,ZERO,ZERO,ZERO,ZERO,0x4B,0x4A,0x4B,0x4A,0x4B,0x4B, +0x4C,0x4C,0x4D,0x4C,0x4D,0x4C,ZERO,ZERO,ZERO,ZERO,0x4D,0x4C,0x4D,0x4C,0x4D,0x4D, +0x4E,0x4E,0x4F,0x4E,0x4F,0x4E,ZERO,ZERO,ZERO,ZERO,0x4F,0x4E,0x4F,0x4E,0x4F,ALL1 + }; + + +/***************************************************************************** +** DmiCreateScale +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the SCALE pipeline element +** +** FORMAL PARAMETERS: +** +** ctx - scale pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int DmiCreateScale( pipe, srcsnk, dstsnk ) + Pipe pipe; + PipeSinkPtr srcsnk; + PipeSinkPtr dstsnk; +{ + ScalePipeCtxPtr ctx = (ScalePipeCtxPtr) + DdxCreatePipeCtx_( pipe, &ScalePipeElement, FALSE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + + /* + ** Copy parameters into context record + */ + SclSrcSnk_(ctx) = srcsnk; + SclDstSnk_(ctx) = dstsnk; + /* + ** Calculate scale factors + */ + SclXScl_(ctx) = (double) SnkWidth_(dstsnk,0) / SnkWidth_(srcsnk,0); + SclYScl_(ctx) = (double) SnkHeight_(dstsnk,0) / SnkHeight_(srcsnk,0); + /* + ** Determine the image class. + */ + SclIsBitonal_(ctx) = !IsPointer_(SnkUdpPtr_(srcsnk,1)) + && SnkLvl_(srcsnk,0) == 2; + + /* + ** Create a drain on the source sink to read all components. + */ + SclSrcDrn_(ctx) = DdxRmCreateDrain_( srcsnk, -1 ); + if( !IsPointer_(SclSrcDrn_(ctx)) ) return( (int) SclSrcDrn_(ctx) ); + + DdxRmSetQuantum_( SclSrcDrn_(ctx), SclYScl_(ctx) >= 1.0 ? 1 + : (int)(1.0/SclYScl_(ctx)) ); + if( !SclIsBitonal_(ctx) ) + DdxRmSetDType_( SclSrcDrn_(ctx), UdpK_DTypeUndefined, DtM_Any ); + else + { + DdxRmSetDType_( SclSrcDrn_(ctx), UdpK_DTypeCL, DtM_CL ); + + /* Precalculate the changelist horizontal scaling map */ + SclHrzMap_(ctx) = _BuildHrzMap( SnkUdpPtr_(SclSrcSnk_(ctx),0), + SclXScl_(ctx)); + if( SclHrzMap_(ctx) != NULL && /* Null means no hrz scale needed */ + !IsPointer_(SclHrzMap_(ctx)) ) return( (int) SclHrzMap_(ctx) ); + +#ifndef FAST_SCALE_DOWN + /* If scaling down, initialize the vertical run structure */ + if( SclYScl_(ctx) < 1.0 ) + { + SclVRun_(ctx) = _BuildVRun( SnkUdpPtr_(SclSrcSnk_(ctx),0) ); + if( !IsPointer_(SclVRun_(ctx)) ) return( (int) SclVRun_(ctx) ); + + /* Allocate the buffer for the composite scanline */ + SclTmpCl_(ctx) = + (unsigned *) DdxMalloc_( (SnkWidth_(SclSrcSnk_(ctx),0) + 2) + * sizeof(unsigned int) ); + if( SclTmpCl_(ctx) == NULL ) return( BadAlloc ); + } +#endif + } + /* + ** Set up Destination sink. + */ + DdxRmSetQuantum_( dstsnk, 1 ); + if( SclIsBitonal_(ctx) ) + DdxRmSetDType_( dstsnk, UdpK_DTypeCL, DtM_CL ); + else + DdxRmSetDType_( dstsnk, UdpK_DTypeUndefined, DtM_Any ); + + return( Success ); +} /* end DmiCreateScale */ + +/***************************************************************************** +** _ScaleInitialize +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the SCALE pipeline element +** +** FORMAL PARAMETERS: +** +** ctx - scale pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleInitialize( ctx ) +ScalePipeCtxPtr ctx; +{ + int status, dtype; + + /* + ** Initialize input drain. + */ + status = DdxRmInitializePort_( CtxHead_(ctx), SclSrcDrn_(ctx) ); + if( status != Success ) return( status ); + CtxInp_(ctx) = SclSrcDrn_(ctx); + + /* + ** Initialize output sink (out dtype == in dtype). + */ + dtype = DdxRmGetDType_( SclSrcDrn_(ctx) ); + DdxRmSetDType_( SclDstSnk_(ctx), dtype, 1<= DatY1_(src) && sy <= DatY2_(src) ) + { + dst = DdxRmAllocData_( SclDstSnk_(ctx), c, + SclDstScn_(ctx,c), 1 ); + status = (int) dst; + if( !IsPointer_(dst) ) continue; + + if( DatDatTyp_(src) == UdpK_DTypeCL ) + status = (*SclHrzRou_(ctx))( SclHrzMap_(ctx), + DatBase_(src), + DatBase_(dst) ); + else + status = (*SclHrzRou_(ctx))( DatUdpPtr_(src), + DatUdpPtr_(dst), + SclXScl_(ctx), + SclYScl_(ctx) ); + + for( sy = ++SclDstScn_(ctx,c) / SclYScl_(ctx); + status == Success && sy >= DatY1_(src) && sy <= DatY2_(src) + && SclDstScn_(ctx,c) < SnkHeight_(SclDstSnk_(ctx),c); + sy = ++SclDstScn_(ctx,c) / SclYScl_(ctx) ) + { /* + ** Hand out reference copies to do vertical scale-up. + */ + copy = DdxRmAllocRefDesc_( dst, DatY1_(dst), 1 ); + if( IsPointer_(copy) ) + { + status = DdxRmPutData_( SclDstSnk_(ctx), dst ); + dst = copy; + DatY1_(dst)++; + DatY2_(dst)++; + } + else + status = (int) copy; + } + if( status != Success ) continue; + + status = DdxRmPutData_( SclDstSnk_(ctx), dst ); + dst = NULL; + } + } + + else /* Special case for changelist scale down vertical */ + { /* + ** Preload the vertical run structure. + */ + _ScaleAnalyzeSrc( DatUdpPtr_(src), SclVRun_(ctx) ); + _ScaleExtractDst( SclVRun_(ctx), DatWidth_(src), SclTmpCl_(ctx) ); + + if( SclDstScn_(ctx,c)++ > 0 ) + { /* + ** Consume this new quantum, producing composite source + ** scanline from the scanlines represented in the VRun. + */ + dst = DdxRmAllocData_( SclDstSnk_(ctx), c, + SclDstScn_(ctx,c) - 2, 1 ); + status = (int) dst; + if( !IsPointer_(dst) ) continue; + + status = (*SclHrzRou_(ctx))( SclHrzMap_(ctx), + SclTmpCl_(ctx), + DatBase_(dst) ); + if( status != Success ) continue; + + status = DdxRmPutData_( SclDstSnk_(ctx), dst ); + dst = NULL; + if( status != Success ) continue; + /* + ** Set the quantum for the next time around. + */ + quantum = (int)((SclDstScn_(ctx,c) + 1) / SclYScl_(ctx)) + - DatY2_(src) - 1; + if( quantum + DatY2_(src) > SnkY2_(SclSrcSnk_(ctx),c) ) + quantum = SnkY2_(SclSrcSnk_(ctx),c) - DatY2_(src); + DdxRmSetQuantum_( SclSrcDrn_(ctx), quantum ); + } + } + } + return( status ); +} + +/***************************************************************************** +** _ScaleFlush +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** ctx - scale pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleFlush( ctx ) +ScalePipeCtxPtr ctx; +{ + int status = Success; + PipeDataPtr dst; + + if( IsPointer_(SclVRun_(ctx)) ) + { /* + ** The last scanline is still in the VRun structure. + */ + dst = DdxRmAllocData_( SclDstSnk_(ctx), 0, SclDstScn_(ctx,0) - 1, 1 ); + status = (int) dst; + if( IsPointer_(dst) ) + { + _ScaleExtractDst( SclVRun_(ctx), + SnkWidth_(SclSrcSnk_(ctx),0), + SclTmpCl_(ctx) ); + status = (*SclHrzRou_(ctx))( SclHrzMap_(ctx), + SclTmpCl_(ctx), + DatBase_(dst) ); + if( status == Success ) + status = DdxRmPutData_( SclDstSnk_(ctx), dst ); + else + DdxRmDeallocData_( dst ); + } + } + return( status ); +} + +/***************************************************************************** +** _ScaleDestroy +** +** FUNCTIONAL DESCRIPTION: +** +** This routine deallocates all resources allocated by the scale +** pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - scale pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleDestroy( ctx ) +ScalePipeCtxPtr ctx; +{ + if( IsPointer_(SclHrzMap_(ctx)) ) + SclHrzMap_(ctx) = (unsigned int *) DdxFree_(SclHrzMap_(ctx)); + +#ifndef FAST_SCALE_DOWN + if( IsPointer_(SclVRun_(ctx)) ) + { + SclVRun_(ctx) = (struct VPOINT *) DdxFree_(SclVRun_(ctx)); + SclTmpCl_(ctx) = (unsigned int *) DdxFree_(SclTmpCl_(ctx)); + } +#endif + SclSrcDrn_(ctx) = DdxRmDestroyDrain_(SclSrcDrn_(ctx)); + + return( Success ); +} + +/***************************************************************************** +** DmiScale +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int DmiScale( srcudp, dstudp ) +UdpPtr srcudp; +UdpPtr dstudp; +{ + double xscale, yscale; + int (*horizontal_scale)(); + int status = Success; + unsigned int *h_map = NULL; + UdpPtr dst = NULL, cludp = NULL; + + if( dstudp->UdpA_Base == NULL ) + { /* + ** Allocate dest image array. + */ + dstudp->UdpA_Base = DdxMallocBits_( dstudp->UdpL_ArSize ); + if( dstudp->UdpA_Base == NULL ) return( BadAlloc ); + } + + /* + ** Calculate horizontal and vertical scale factors. + */ + xscale = (double)dstudp->UdpL_PxlPerScn / (double)srcudp->UdpL_PxlPerScn; + yscale = (double)dstudp->UdpL_ScnCnt / (double)srcudp->UdpL_ScnCnt; + /* + ** Determine the proper horizontal scale routine to call based + ** on source data type and scale factors. + */ + horizontal_scale = _ScaleHorizontal( xscale, srcudp->UdpB_DType, + srcudp->UdpL_Levels == 2 ); + /* + ** If destination is not a supported type, create an intermediate image. + */ + dst = _ChkUdp( srcudp, dstudp ); + if( !IsPointer_(dst) ) + { + status = (int) dst; + goto cleanup; + } + /* + ** Now, call the proper routine based on scale factors. + */ + if( srcudp->UdpL_Levels != 2 ) + status = (*_ScaleVertical( yscale, srcudp )) + ( srcudp, dst, xscale, yscale, horizontal_scale ); + else + { + /* Scale bitonal images using changelists */ + _ScaleGetClUdp( srcudp, 1, &cludp ); + if( !IsPointer_(cludp) ) + { + status = (int) cludp; + goto cleanup; + } + h_map = _BuildHrzMap( srcudp, xscale ); + if( h_map != NULL && !IsPointer_(h_map) ) + { + status = (int) h_map; + goto cleanup; + } + status = (*_ScaleVerticalCl( yscale, srcudp )) + ( srcudp, dst, h_map, yscale, horizontal_scale, cludp ); + } + if( status != Success ) goto cleanup; + + /* + ** If a temporary image was necessary, convert to the desired data type. + */ + if( dst != dstudp ) + status = DdxConvert_( dst, dstudp, XieK_MoveMode ); + +cleanup: + if( dst != dstudp ) + { + if( IsPointer_(dst->UdpA_Base) ) + DdxFreeBits_(dst->UdpA_Base); + DdxFree_(dst); + } + _ScaleDestroyClUdp( cludp ); + DdxFree_( h_map ); + + return( status ); +} + +/***************************************************************************** +** +** _ScaleHorizontal +** _ScaleVertical +** _ScaleVerticalCl +** +** FUNCTIONAL DESCRIPTION: +** +** Return a pointer to the appropriate scaling routine, based on +** the source image data type. +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static ScaleProc _ScaleHorizontal(xscale, dtype, bitonal) +double xscale; +int dtype; +int bitonal; +{ + if( xscale < 1.0 ) + /* + ** Scaling down + */ + if( bitonal ) + /* Handle bitonal images using change lists */ + return( _ScaleHorizontalDownCl ); + else + switch( dtype ) + { + case UdpK_DTypeBU: + return( _ScaleHorizontalDownBytes ); + + case UdpK_DTypeWU: + return( _ScaleHorizontalDownWords ); + + case UdpK_DTypeF: + return( _ScaleHorizontalDownFloats ); + + case UdpK_DTypeVU: + return( _ScaleHorizontalDownBits ); + + case UdpK_DTypeUndefined: + case UdpK_DTypeLU: + default: + return( NULL ); + } + else if( xscale > 1.0 ) + /* + ** Scaling up + */ + if( bitonal ) + /* Handle bitonal images using change lists */ + return( _ScaleHorizontalUpCl ); + else + switch( dtype ) + { + case UdpK_DTypeBU: + return( _ScaleHorizontalUpBytes ); + + case UdpK_DTypeWU: + return( _ScaleHorizontalUpWords ); + + case UdpK_DTypeF: + return( _ScaleHorizontalUpFloats ); + + case UdpK_DTypeVU: + return( _ScaleHorizontalUpBits ); + + case UdpK_DTypeLU: + case UdpK_DTypeUndefined: + default: + return( NULL ); + } + else + /* + ** No scale + */ + if( bitonal ) + /* Handle bitonal images using change lists */ + return( _ScaleHorizontalNoneCl ); + else + return( _ScaleHorizontalNone ); +} + +static ScaleProc _ScaleVertical(yscale,src) +double yscale; +UdpPtr src; +{ + if( yscale <= 1.0 ) + /* + ** Scaling down or none + */ + return( _ScaleVerticalDown ); + else + /* + ** Scaling up + */ + return( _ScaleVerticalUp ); +} + + +static ScaleProc _ScaleVerticalCl(yscale,src) +double yscale; +UdpPtr src; +{ + if( yscale == 1.0 ) + /* + ** No vertical scaling + */ + return( _ScaleVerticalNoneCl ); + + else if( yscale < 1.0 ) + /* + ** Scaling down + */ +#ifdef FAST_SCALE_DOWN + return( _ScaleVerticalDownClFast ); +#else + return( _ScaleVerticalDownCl ); +#endif /* FAST_SCALE_DOWN */ + else + /* + ** Scaling up + */ + return( _ScaleVerticalUpCl ); +} + +/***************************************************************************** +** +** _ScaleVerticalUp +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleVerticalUp( srcudp, dstudp, xscale, yscale, hrz_scale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +int (*hrz_scale)(); +{ + UdpRec dscn; /* This is a UDP that will describe a */ + /* single destination scanline */ + int sx, sy, dx, dy, status; + + dscn = *dstudp; + /* + ** Set up a temporary UDP to describe a single scanline + */ + dscn.UdpL_ScnCnt = 1; + dscn.UdpL_Y1 = dscn.UdpL_Y2 = dstudp->UdpL_Y1; + + while( dscn.UdpL_Y1 <= dstudp->UdpL_Y2 ) + { + sy = (int) ((double) dscn.UdpL_Y1 / yscale ); + + status = (*hrz_scale)( srcudp, &dscn, xscale, yscale ); + if( status != Success ) return( status ); + + dscn.UdpL_Y1 = ++dscn.UdpL_Y2; + dscn.UdpL_Pos += dscn.UdpL_ScnStride; + + while( (int) ((double) dscn.UdpL_Y1 / yscale ) == sy && + dscn.UdpL_Y1 <= dstudp->UdpL_Y2 ) + { + memcpy( dscn.UdpA_Base + dscn.UdpL_Pos / 8, + dscn.UdpA_Base + (dscn.UdpL_Pos-dscn.UdpL_ScnStride)/8, + dscn.UdpL_ScnStride / 8); + dscn.UdpL_Y1 = ++dscn.UdpL_Y2; + dscn.UdpL_Pos += dscn.UdpL_ScnStride; + } + } + return( Success ); +} + +/***************************************************************************** +** +** _ScaleVerticalDown +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleVerticalDown( srcudp, dstudp, xscale, yscale, hrz_scale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +int (*hrz_scale)(); +{ + UdpRec dscn; /* This is a UDP that will describe a */ + /* single destination scanline */ + int sx, sy, dx, dy, status; + + dscn = *dstudp; + /* + ** Set up a temporary UDP to describe a single scanline + */ + dscn.UdpL_ScnCnt = 1; + dscn.UdpL_Y1 = dscn.UdpL_Y2 = dstudp->UdpL_Y1; + + while( dscn.UdpL_Y1 <= dstudp->UdpL_Y2 ) + { + status = (*hrz_scale)( srcudp, &dscn, xscale, yscale ); + if( status != Success ) return( status ); + + dscn.UdpL_Y1 = ++dscn.UdpL_Y2; + dscn.UdpL_Pos += dscn.UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** +** _ScaleVerticalNoneCl +** +** FUNCTIONAL DESCRIPTION: +** +** Perform only horizontal scaling for a bitonal image, using the +** changelist scaling algorithm. +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleVerticalNoneCl(srcudp, dstudp, h_map, yscale, hrz_scale, cludp) +UdpPtr srcudp; +UdpPtr dstudp; +unsigned int *h_map; +double yscale; +int (*hrz_scale)(); +UdpPtr cludp; +{ + UdpRec tmpudp; /* Udp for one source scanline */ + int status; + + int scanline; + + if( h_map == NULL ) + /* No horizontal scaling either. Just copy the image */ + status = DdxConvert_( srcudp, dstudp, XieK_MoveMode ); + + else + { + status = Success; + tmpudp = *srcudp; + tmpudp.UdpL_ScnCnt = 1; + for( scanline = srcudp->UdpL_Y1; + scanline <= srcudp->UdpL_Y2 && status == Success; + scanline++ ) + { + /* Convert one input scanline to a change list */ + tmpudp.UdpL_Y1 = tmpudp.UdpL_Y2 = scanline; + cludp->UdpL_Y1 = cludp->UdpL_Y2 = scanline; + status = DdxConvert_( &tmpudp, cludp, XieK_MoveMode ); + + /* Scale the scanline horizontally */ + if( status == Success ) + status = (*hrz_scale)(h_map, (unsigned int *)cludp->UdpA_Base, + (unsigned int *)cludp->UdpA_Base); + + /* Convert the scaled changelist to the desired destination type */ + if( status == Success ) + status = DdxConvert_( cludp, dstudp, XieK_MoveMode ); + tmpudp.UdpL_Pos += tmpudp.UdpL_ScnStride; + } + } /* end _ScaleVerticalNoneCl */ + return( status ); +} + +/***************************************************************************** +** +** _ScaleVerticalUpCl +** +** FUNCTIONAL DESCRIPTION: +** +** Scale up vertically a bitonal image, using the changelist +** scaling algorithm. Each scanline is replicated y_scale times. +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleVerticalUpCl(srcudp, dstudp, h_map, yscale, hrz_scale, cludp) +UdpPtr srcudp; +UdpPtr dstudp; +unsigned int *h_map; +double yscale; +int (*hrz_scale)(); +UdpPtr cludp; +{ + UdpRec tmpudp; /* Udp for one source scanline */ + + int scanline; + int dline; + + int start_scan; + int end_scan; + int status; + + tmpudp = *srcudp; + tmpudp.UdpL_ScnCnt = 1; + status = Success; + + if( h_map == NULL ) + /* No horizontal scaling - no need to use changelists after all */ + for( scanline = 0; + scanline <= srcudp->UdpL_Y2 - srcudp->UdpL_Y1 && status == Success; + scanline++ ) + { + start_scan = (double)(scanline) * yscale; + end_scan = (double)(scanline+1) * yscale; + + for( dline = start_scan; + dline < end_scan && status == Success; + dline++ ) + { + /* Issue required number of copies of the scanline */ + tmpudp.UdpL_Y1 = tmpudp.UdpL_Y2 = dline; + status = DdxConvert_( &tmpudp, dstudp, XieK_MoveMode ); + } + tmpudp.UdpL_Pos += tmpudp.UdpL_ScnStride; + } + else + for( scanline = srcudp->UdpL_Y1; + scanline <= srcudp->UdpL_Y2 && status == Success; + scanline++ ) + { + /* Convert one input scanline to a change list */ + tmpudp.UdpL_Y1 = tmpudp.UdpL_Y2 = scanline; + cludp->UdpL_Y1 = cludp->UdpL_Y2 = scanline; + status = DdxConvert_( &tmpudp, cludp, XieK_MoveMode ); + if( status == Success ) + status = (*hrz_scale)(h_map, (unsigned int *)cludp->UdpA_Base, + (unsigned int *)cludp->UdpA_Base); + if( status != Success ) continue; + + start_scan = (double)(scanline - srcudp->UdpL_Y1) * yscale; + end_scan = (double)(scanline - srcudp->UdpL_Y1+1) * yscale; + + for( dline = start_scan; + dline < end_scan && status == Success; + dline++ ) + { + /* Issue required number of copies of the scanline */ + cludp->UdpL_Y1 = cludp->UdpL_Y2 = dline; + status = DdxConvert_( cludp, dstudp, XieK_MoveMode ); + } + tmpudp.UdpL_Pos += tmpudp.UdpL_ScnStride; + } + return( status ); +} /* end _ScaleVerticalUpCl */ + +/***************************************************************************** +** +** _ScaleVerticalDownCl +** +** FUNCTIONAL DESCRIPTION: +** +** Scale down vertically a bitonal image, by locating and scaling +** vertical runs. +** +** Vertical runs may shrink out of existance (e.g. thin horizontal lines, +** black or white). To prevent the loss of such detail we will detect +** vertical transitions within the group of source scanlines which will +** become the next destination scanline. Any transition will result in +** a destination pixel polarity change from that of the pixel in the +** same column on the preceeding destination scanline. If more than +** two transitions occur the additional detail must be discarded. +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleVerticalDownCl(srcudp, dstudp, h_map, yscale, hrz_scale,dst_cl) +UdpPtr srcudp; +UdpPtr dstudp; +unsigned int *h_map; +double yscale; +int (*hrz_scale)(); +UdpPtr dst_cl; +{ + struct VPOINT *v_run; /* Linked VLIST array */ + + int dstline; + int count; + int quantum; + int status; + + UdpRec tmpudp; /* Temp UDP to describe source */ + UdpPtr src_cl; /* Temp UDP to hold source changelist*/ + + v_run = NULL; + src_cl = NULL; + status = Success; + + /* Allocate the vertical changelist structure */ + v_run = _BuildVRun( srcudp ); + if( !IsPointer_(v_run) ) + { + status = (int) v_run; + goto cleanup; + } + tmpudp = *srcudp; + + dstline = dstudp->UdpL_Y1; + quantum = (dstline + 1) / yscale - tmpudp.UdpL_Y1; + + /* Allocate and init a buffer to hold converted quanta of the source */ + _ScaleGetClUdp( &tmpudp, quantum + 1, &src_cl ); + if( !IsPointer_(src_cl) ) + { + status = (int) src_cl; + goto cleanup; + } + tmpudp.UdpL_ScnCnt = quantum; + tmpudp.UdpL_Y2 = tmpudp.UdpL_Y1 + quantum - 1; + + src_cl->UdpL_ScnCnt = quantum; + src_cl->UdpL_Y1 = tmpudp.UdpL_Y1; + src_cl->UdpL_Y2 = src_cl->UdpL_Y1 + quantum - 1; + + status = DdxConvert_( &tmpudp, src_cl, XieK_MoveMode ); + if( status != Success ) goto cleanup; + + /* Pre-load the vertical run structure */ + _ScaleAnalyzeSrc(src_cl, v_run); + _ScaleExtractDst(v_run, tmpudp.UdpL_PxlPerScn, + (unsigned int *)dst_cl->UdpA_Base); + + tmpudp.UdpL_Y1 += quantum; + tmpudp.UdpL_Pos += (quantum * tmpudp.UdpL_ScnStride); + + /* + ** Process the remaining src scanlines and write dst scanlines. + */ + for( count = dstudp->UdpL_ScnCnt - 1; count > 0; count-- ) + { + dstline++; + quantum = (dstline + 1) / yscale - tmpudp.UdpL_Y1; + + tmpudp.UdpL_ScnCnt = quantum; + tmpudp.UdpL_Y2 = tmpudp.UdpL_Y1 + quantum - 1; + + src_cl->UdpL_ScnCnt = quantum; + src_cl->UdpL_Y1 = tmpudp.UdpL_Y1; + src_cl->UdpL_Y2 = src_cl->UdpL_Y1 + quantum - 1; + + status = DdxConvert_( &tmpudp, src_cl, XieK_MoveMode ); + if( status != Success ) goto cleanup; + + _ScaleAnalyzeSrc(src_cl, v_run); + _ScaleExtractDst(v_run, tmpudp.UdpL_PxlPerScn, + (unsigned int *)dst_cl->UdpA_Base); + + if( h_map != NULL ) + status = (*hrz_scale)( h_map, (unsigned int *)dst_cl->UdpA_Base, + (unsigned int *)dst_cl->UdpA_Base); + dst_cl->UdpL_Y1 = dst_cl->UdpL_Y2 = dstline; + if( status == Success ) + status = DdxConvert_( dst_cl, dstudp, XieK_MoveMode ); + if( status != Success ) goto cleanup; + + tmpudp.UdpL_Y1 += quantum; + tmpudp.UdpL_Pos += (quantum * tmpudp.UdpL_ScnStride); + } + + /* + ** Extract and write the final dst scanline. + */ + _ScaleExtractDst(v_run, tmpudp.UdpL_PxlPerScn, + (unsigned int *)dst_cl->UdpA_Base); + + if( h_map != NULL ) + status = (*hrz_scale)( h_map, (unsigned int *)dst_cl->UdpA_Base, + (unsigned int *)dst_cl->UdpA_Base); + + dst_cl->UdpL_Y1 = dst_cl->UdpL_Y2 = dstline; + if( status == Success ) + status = DdxConvert_( dst_cl, dstudp, XieK_MoveMode ); + +cleanup: + if( IsPointer_(v_run) ) + DdxFree_(v_run); + _ScaleDestroyClUdp(src_cl); + + return(status); +} /* end _ScaleVerticalDownCl */ + +#ifdef FAST_SCALE_DOWN +/***************************************************************************** +** +** _ScaleVerticalDownClFast +** +** FUNCTIONAL DESCRIPTION: +** +** Scale a bitonal image vertically by using only every (1/y_scale)th +** scanline. The image is processed using changelist scaling algorithms. +** This is an alternative to _ScaleVerticalDownCl(), giving up +** enhanced detail to gain speed. +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int +_ScaleVerticalDownClFast(srcudp, dstudp, h_map, yscale, hrz_scale, cludp) + +UdpPtr srcudp; +UdpPtr dstudp; +unsigned int *h_map; +double yscale; +int (*hrz_scale)(); +UdpPtr cludp; +{ + UdpRec tmpudp; /* Udp for one source scanline */ + + int scanline; + int sline; /* source scanline number */ + int status; + + tmpudp = *srcudp; + tmpudp.UdpL_ScnCnt = 1; + + status = Success; + if( h_map == NULL ) + /* No horizontal scaling - no need to use changelists after all */ + for( scanline = dstudp->UdpL_Y1; + scanline <= dstudp->UdpL_Y2 && status == Success; + scanline++ ) + { + sline = (int)((scanline - dstudp->UdpL_Y1) / yscale); + tmpudp.UdpL_Pos = sline * srcudp->UdpL_ScnStride + + srcudp->UdpL_Pos; + tmpudp.UdpL_Y1 = tmpudp.UdpL_Y2 = scanline; + status = DdxConvert_( &tmpudp, dstudp, XieK_MoveMode ); + } + else + for( scanline = dstudp->UdpL_Y1; + scanline <= dstudp->UdpL_Y2 && status == Success; + scanline++ ) + { + sline = (int)((scanline - dstudp->UdpL_Y1) / yscale); + + /* Convert required input scanline to a change list */ + tmpudp.UdpL_Y1 = tmpudp.UdpL_Y2 = sline + srcudp->UdpL_Y1; + cludp->UdpL_Y1 = cludp->UdpL_Y2 = sline + srcudp->UdpL_Y1; + tmpudp.UdpL_Pos = sline * srcudp->UdpL_ScnStride + + srcudp->UdpL_Pos; + status = DdxConvert_( &tmpudp, cludp, XieK_MoveMode ); + + if( status == Success) + { + status = (*hrz_scale)( h_map, (unsigned int *)cludp->UdpA_Base, + (unsigned int *)cludp->UdpA_Base); + cludp->UdpL_Y1 = cludp->UdpL_Y2 = scanline; + if( status == Success ) + status = DdxConvert_( cludp, dstudp, XieK_MoveMode ); + } + } +} /* end _ScaleVerticalDownClFast */ +#endif /* FAST_SCALE_DOWN */ + +/***************************************************************************** +** +** _ScaleHorizontalNone +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleHorizontalNone( srcudp, dstudp, xscale, yscale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +{ + return( DdxCopy_( srcudp, dstudp, + dstudp->UdpL_X1, + (int) ((double) dstudp->UdpL_Y1 / yscale) + - srcudp->UdpL_Y1, + dstudp->UdpL_X1, dstudp->UdpL_Y1, + dstudp->UdpL_PxlPerScn, dstudp->UdpL_ScnCnt ) ); +} + +/***************************************************************************** +** +** _ScaleHorizontalNoneCl +** +** FUNCTIONAL DESCRIPTION: +** +** Copy the input changelist to the output changelist without +** performing any horizontal scaling. +** +** FORMAL PARAMETERS: +** +** map - address of pre-scaled transition point array +** inlst - Ptr to the input changelist data. +** outlst - Ptr to buffer to receive the output changelist data. +** (could be the same as inlst). +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleHorizontalNoneCl( map, inlst, outlst ) +unsigned int *map; +unsigned int *inlst; +unsigned int *outlst; +{ + if( inlst != outlst ) + memcpy( outlst, inlst, (*inlst + 2) * sizeof(unsigned int) ); + + return( Success ); +} /* end _ScaleHorizontalNoneCl */ + +/***************************************************************************** +** +** _ScaleHorizontalDownBits +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleHorizontalDownBits( srcudp, dstudp, xscale, yscale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +{ + unsigned int s_cmask, d_cmask, value; + int s_scan_offset, s_offset; + int d_scan_offset, d_offset; + int sx, sy, dx, dy; + + s_cmask = srcudp->UdpL_Levels - 1; + d_cmask = dstudp->UdpL_Levels - 1; + + d_scan_offset = dstudp->UdpL_Pos; + + for( dy = dstudp->UdpL_Y1; dy <= dstudp->UdpL_Y2; dy++ ) + { + sy = (int)((double)dy / yscale ); + + s_scan_offset = srcudp->UdpL_Pos + + ((sy - srcudp->UdpL_Y1) * srcudp->UdpL_ScnStride); + d_offset = d_scan_offset; + + for( dx = dstudp->UdpL_X1; dx <= dstudp->UdpL_X2; dx++ ) + { + sx = (int)((double)dx / xscale ); + + s_offset = s_scan_offset + (srcudp->UdpL_PxlStride * sx); + + value = GET_VALUE_(srcudp->UdpA_Base,s_offset,s_cmask); + PUT_VALUE_(dstudp->UdpA_Base, d_offset, value,d_cmask); + + d_offset += dstudp->UdpL_PxlStride; + } + d_scan_offset += dstudp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** +** _ScaleHorizontalDownBytes +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleHorizontalDownBytes( srcudp, dstudp, xscale, yscale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +{ + int s_scan_offset, s_offset; + int d_scan_offset, d_offset; + int sx, sy, dx, dy; + + d_scan_offset = dstudp->UdpL_Pos; + + for( dy = dstudp->UdpL_Y1; dy <= dstudp->UdpL_Y2; dy++ ) + { + sy = (int)((double)dy / yscale ); + + s_scan_offset = srcudp->UdpL_Pos + + ((sy - srcudp->UdpL_Y1) * srcudp->UdpL_ScnStride); + d_offset = d_scan_offset; + + for( dx = dstudp->UdpL_X1; dx <= dstudp->UdpL_X2; dx++ ) + { + sx = (int)((double)dx / xscale ); + + s_offset = s_scan_offset + (srcudp->UdpL_PxlStride * sx); + + *(unsigned char *)(dstudp->UdpA_Base + d_offset / 8) = + *(unsigned char *)(srcudp->UdpA_Base + s_offset / 8); + + d_offset += dstudp->UdpL_PxlStride; + } + d_scan_offset += dstudp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** +** _ScaleHorizontalDownWords +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleHorizontalDownWords( srcudp, dstudp, xscale, yscale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +{ + int s_scan_offset, s_offset; + int d_scan_offset, d_offset; + int sx, sy, dx, dy; + + d_scan_offset = dstudp->UdpL_Pos; + + for( dy = dstudp->UdpL_Y1; dy <= dstudp->UdpL_Y2; dy++ ) + { + sy = (int)((double)dy / yscale ); + + s_scan_offset = srcudp->UdpL_Pos + + ((sy - srcudp->UdpL_Y1) * srcudp->UdpL_ScnStride); + d_offset = d_scan_offset; + + for( dx = dstudp->UdpL_X1; dx <= dstudp->UdpL_X2; dx++ ) + { + sx = (int)((double)dx / xscale ); + + s_offset = s_scan_offset + (srcudp->UdpL_PxlStride * sx); + + *(unsigned short *)(dstudp->UdpA_Base + d_offset / 8) = + *(unsigned short *)(srcudp->UdpA_Base + s_offset/8); + + d_offset += dstudp->UdpL_PxlStride; + } + d_scan_offset += dstudp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** +** _ScaleHorizontalDownFloats +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleHorizontalDownFloats( srcudp, dstudp, xscale, yscale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +{ + int s_scan_offset, s_offset; + int d_scan_offset, d_offset; + int sx, sy, dx, dy; + + d_scan_offset = dstudp->UdpL_Pos; + + for( dy = dstudp->UdpL_Y1; dy <= dstudp->UdpL_Y2; dy++ ) + { + sy = (int)((double)dy / yscale ); + + s_scan_offset = srcudp->UdpL_Pos + + ((sy - srcudp->UdpL_Y1) * srcudp->UdpL_ScnStride); + d_offset = d_scan_offset; + + for( dx = dstudp->UdpL_X1; dx <= dstudp->UdpL_X2; dx++ ) + { + sx = (int)((double)dx / xscale ); + + s_offset = s_scan_offset + (srcudp->UdpL_PxlStride * sx); + + *(float *)(dstudp->UdpA_Base + d_offset / 8) = + *(float *)(srcudp->UdpA_Base + s_offset/8); + + d_offset += dstudp->UdpL_PxlStride; + } + d_scan_offset += dstudp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** +** _ScaleHorizontalDownCl +** +** FUNCTIONAL DESCRIPTION: +** +** Scale down CHANGELIST transition points (i.e. shrink scanline width). +** +** When scaling down, runs may shrink out of existance (black or white). +** This results in the disappearance of thin vertical lines. +** Under these circumstances, for the sake of retaining detail, we will +** borrow a pixel from the beginning of the next run, if the combined +** scaled length of the current run and next run will result in at least +** two pixels. Otherwise we will discard the current run or the next +** run depending on run length (a run is a pair of transition points). +** +** FORMAL PARAMETERS: +** +** map - address of pre-scaled transition point array +** inlst - pointer to the input changelist data +** outlst - pointer to output changelist buffer (could be the same +** as inlst). +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleHorizontalDownCl( map, inlst, outlst ) +int *map; +unsigned int *inlst; +unsigned int *outlst; +{ + unsigned int beg; /* Scaled begin point of current run */ + unsigned int end; /* Scaled end point of current run */ + int cnt = *inlst; /* Number of transitions in CHANGELIST */ + unsigned int *cr = outlst + 1; /* Current run pointer */ + unsigned int *nr = inlst + 1; /* Next run pointer */ + + beg = map[*nr++]; /* scale begin of initial run of ones */ + + while( --cnt > 0 ) /* if at least a pair of points exists */ + { + end = map[*nr++]; /* scale end of current run */ + if( beg < end ) /* if run is at least one pixel long*/ + *cr++ = beg; /* ...save scaled begin point */ + + else if( --cnt > 0 ) /* else, if another point exists */ + { + end = map[*nr++]; /* ...scale end of next run */ + if( end - beg >= 2 ) /* if combined length of current */ + { /* ...and next run is >= 2 pixels */ + *cr++ = beg; /* ...save single pixel run */ + *cr++ = beg + 1; /* ...and begin of next run */ + } + else if( nr[-1] - nr[-2] /* else, if next run is shorter */ + <= nr[-2] - nr[-3] ) /* ...than its predecessor */ + continue; /* ...discard the next run */ + } /* (else discard current run) */ + + beg = end; /* current end point is next begin */ + } + + *cr = beg; /* scale scanline length */ + *outlst = cr - outlst; /* update size of CHANGELIST */ + + return( Success ); +} /* end _ScaleHorizontalDownCl */ + +/***************************************************************************** +** +** _ScaleHorizontalUpBits +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleHorizontalUpBits( srcudp, dstudp, xscale, yscale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +{ + unsigned int s_cmask, d_cmask, value; + int s_scan_offset, s_offset; + int d_scan_offset, d_offset; + int sx, sy, dx, dy; + + s_cmask = srcudp->UdpL_Levels - 1; + d_cmask = dstudp->UdpL_Levels - 1; + + d_scan_offset = dstudp->UdpL_Pos; + + for( dy = dstudp->UdpL_Y1; dy <= dstudp->UdpL_Y2; dy++ ) + { + sy = (int)((double)dy / yscale ); + + s_scan_offset = srcudp->UdpL_Pos + + ((sy - srcudp->UdpL_Y1) * srcudp->UdpL_ScnStride); + d_offset = d_scan_offset; + + for( dx = dstudp->UdpL_X1; dx <= dstudp->UdpL_X2; ) + { + sx = (int)((double)dx / xscale ); + + s_offset = s_scan_offset + (srcudp->UdpL_PxlStride * sx); + + value = GET_VALUE_(srcudp->UdpA_Base,s_offset,s_cmask); + + do { + PUT_VALUE_(dstudp->UdpA_Base, d_offset, value, d_cmask); + dx++; + d_offset += dstudp->UdpL_PxlStride; + } + while( sx == (int)((double)dx / xscale ) && dx <= dstudp->UdpL_X2); + } + d_scan_offset += dstudp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ScaleHorizontalUpBytes +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleHorizontalUpBytes(srcudp,dstudp,xscale,yscale) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +{ + int s_scan_offset, s_offset; + int d_scan_offset, d_offset; + int sx, sy, dx, dy; + + unsigned char value; + + d_scan_offset = dstudp->UdpL_Pos; + + for( dy = dstudp->UdpL_Y1; dy <= dstudp->UdpL_Y2; dy++ ) + { + sy = (int)((double)dy / yscale ); + + s_scan_offset = srcudp->UdpL_Pos + + ((sy - srcudp->UdpL_Y1) * srcudp->UdpL_ScnStride); + d_offset = d_scan_offset; + + for( dx = dstudp->UdpL_X1; dx <= dstudp->UdpL_X2; ) + { + sx = (int)((double)dx / xscale ); + + s_offset = s_scan_offset + (srcudp->UdpL_PxlStride * sx); + + value = *(unsigned char *) (srcudp->UdpA_Base + s_offset/8); + + do { + *(unsigned char *)(dstudp->UdpA_Base + d_offset / 8) = value; + dx++; + d_offset += dstudp->UdpL_PxlStride; + + } while( sx == (int)((double)dx / xscale ) && + dx <= dstudp->UdpL_X2); + } + d_scan_offset += dstudp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ScaleHorizontalUpWords +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleHorizontalUpWords( srcudp, dstudp, xscale, yscale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +{ + int s_scan_offset, s_offset; + int d_scan_offset, d_offset; + int sx, sy, dx, dy; + + unsigned short value; + + d_scan_offset = dstudp->UdpL_Pos; + + for( dy = dstudp->UdpL_Y1; dy <= dstudp->UdpL_Y2; dy++ ) + { + sy = (int)((double)dy / yscale ); + + s_scan_offset = srcudp->UdpL_Pos + + ((sy - srcudp->UdpL_Y1) * srcudp->UdpL_ScnStride); + d_offset = d_scan_offset; + + for( dx = dstudp->UdpL_X1; dx <= dstudp->UdpL_X2; ) + { + sx = (int)((double)dx / xscale ); + + s_offset = s_scan_offset + (srcudp->UdpL_PxlStride * sx); + + value = *(unsigned short *) (srcudp->UdpA_Base + s_offset/8); + + do { + *(unsigned short *)(dstudp->UdpA_Base + d_offset / 8) = value; + dx++; + d_offset += dstudp->UdpL_PxlStride; + } + while( sx == (int)((double)dx / xscale ) && dx <= dstudp->UdpL_X2 ); + } + d_scan_offset += dstudp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ScaleHorizontalUpFloats +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleHorizontalUpFloats( srcudp, dstudp, xscale, yscale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +{ + int s_scan_offset, s_offset; + int d_scan_offset, d_offset; + int sx, sy, dx, dy; + float value; + + d_scan_offset = dstudp->UdpL_Pos; + + for( dy = dstudp->UdpL_Y1; dy <= dstudp->UdpL_Y2; dy++ ) + { + sy = (int)((double)dy / yscale ); + + s_scan_offset = srcudp->UdpL_Pos + + ((sy - srcudp->UdpL_Y1) * srcudp->UdpL_ScnStride); + d_offset = d_scan_offset; + + for( dx = dstudp->UdpL_X1; dx <= dstudp->UdpL_X2; ) + { + sx = (int)((double)dx / xscale ); + + s_offset = s_scan_offset + (srcudp->UdpL_PxlStride * sx); + + value = *(float *) + (srcudp->UdpA_Base + s_offset/8); + + do { + *(float *)(dstudp->UdpA_Base + d_offset / 8) = value; + dx++; + d_offset += dstudp->UdpL_PxlStride; + + } while( sx == (int)((double)dx / xscale ) && + dx <= dstudp->UdpL_X2); + } + d_scan_offset += dstudp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ScaleHorizontalUpCl +** +** FUNCTIONAL DESCRIPTION: +** +** Scale up CHANGELIST transition points (i.e. expand scanline width). +** +** FORMAL PARAMETERS: +** +** map - address of pre-scaled transition point array +** inlst - Ptr to the input changelist data. +** outlst - Ptr to buffer to receive the output changelist data. +** (could be the same as inlst). +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleHorizontalUpCl( map, inlst, outlst ) +unsigned int *map; +unsigned int *inlst; +unsigned int *outlst; +{ + unsigned int i; /* point counter */ + unsigned int *icr; /* input pointer */ + unsigned int *ocr; /* output pointer */ + + /* + ** Scale up CHANGELIST transition points. + */ + ocr = outlst; + icr = inlst; + *ocr++ = *icr; + + for( i = *icr++; i > 0; --i ) + *ocr++ = map[*icr++]; /* scale current point */ + + return( Success ); +} /* end _ScaleHorizontalUpCl */ + +/****************************************************************************** +** _ScaleAnalyzeSrc +** +** FUNCTIONAL DESCRIPTION: +** +** This routine is responsible for detecting polarity changes in each +** column of pixels by analyzing the NEXT group of SRC CHANGELISTs. +** New "active" columns are linked in, then the contents of 'window' are +** used as an index to look-up table 'next_0' or 'next_1' depending on +** whether the pixel at the column being processed is a '0' or '1' +** respectively. Only the NEXT field is actually affected by the look-up. +** +** FORMAL PARAMETERS: +** +** srcudp - Pointer to a UDP describing the next quantum +** of the source image in changelist form. +** v_run - Pointer to vertical changelist (VLIST) array. +** +******************************************************************************/ +static void _ScaleAnalyzeSrc( srcudp, v_run) + UdpPtr srcudp; + struct VPOINT *v_run; +{ + UdpRec inudp; /* Temporary descriptor */ + int append; + unsigned int *clst; /* address of CHANGELIST */ + int cind; /* index into CHANGELIST */ + int vold; /* window state from prev scanline */ + struct VPOINT *cnxt; /* next CHANGELIST column within VLIST*/ + struct VPOINT *v0; /* VLIST pointer to column 0 */ + struct VPOINT *vcur; /* current VLIST column */ + struct VPOINT *vnxt; /* next active VLIST column */ + struct VPOINT *vend; /* end of VLIST */ + + inudp = *srcudp; + + v0 = v_run + 1; + vend = v0 + inudp.UdpL_PxlPerScn; + + /* + ** Iterate through the scanlines in this quantum, appending their + ** contents into the v_run. + */ + for( append = 0; append < inudp.UdpL_ScnCnt; append++ ) + { + clst = (unsigned int *)(inudp.UdpA_Base + (inudp.UdpL_Pos >> 3)); + vcur = v_run; + vnxt = (struct VPOINT *) vcur->flink; + vold = vcur->window; + cind = 1; + cnxt = v0 + clst[cind++]; + + while( vnxt < vend || cnxt < vend ) + { + if( vnxt > cnxt ) + { /* CHANGELIST has next column */ + vcur->flink = (long) cnxt; /* link in new column */ + vcur = cnxt; + vcur->flink = (long)vnxt; + vcur->window = vold; /* state from previous scanline */ + cnxt = v0 + clst[cind++]; /* get next CHANGELIST column */ + } + else + { /* VLIST has next column */ + if( vnxt == cnxt ) + cnxt = v0+clst[cind++]; /* get next CHANGELIST column */ + vcur = vnxt; /* current column */ + vold = vcur->window; /* save state of prev scanline */ + vnxt = (struct VPOINT *) vcur->flink; /* next column */ + } + if(( cind & 1 ) == 0 ) + vcur->window = + next_0[vcur->window]; /* update NEXT field with a 0 */ + else + vcur->window = + next_1[vcur->window]; /* update NEXT field with a 1 */ + } + inudp.UdpL_Pos = DdxPosCl_( inudp.UdpA_Base, inudp.UdpL_Pos, 1 ); + inudp.UdpL_Y1++; + } +} /* end _ScaleAnalyzeSrc */ + +/****************************************************************************** +** _ScaleExtractDst +** +** FUNCTIONAL DESCRIPTION: +** +** This routine extracts a DST CHANGELIST from the VLIST window state and +** re-initializes the VLIST by unlinking redundant columns and updating +** the window state of "active" columns. +** +** FORMAL PARAMETERS: +** +** v_run - Point to VLIST (vertical changelist) array. +** src_width - Number of pixels in source scanline used to build +** the changelist to be extracted. +** lst - Pointer to buffer to receive the changelist +** +******************************************************************************/ +static void _ScaleExtractDst( v_run, src_width, lst ) + struct VPOINT *v_run; + int src_width; + unsigned int *lst; +{ + int cind; /* index into CHANGELIST */ + int vnew; /* temporary VLIST window state */ + struct VPOINT *v0; /* VLIST pointer to column 0 */ + struct VPOINT *prev; /* previous active column */ + struct VPOINT *curr; /* current column */ + struct VPOINT *vend; /* end of VLIST */ + + cind = 1; + v0 = v_run + 1; + prev = v_run; + curr = (struct VPOINT *)prev->flink; + vend = v0 + src_width; + + while( curr < vend ) + { + vnew = prefer_both[curr->window]; /* choose new OUT, copy NEXT*/ + /* to CURRENT, re-init NEXT*/ + if( prev->window + vnew & OUT ) /* X polarity change ? */ + lst[cind++] = curr - v0; /* create CHANGELIST entry */ + else if( prev->window == vnew ) /* is this column redundant?*/ + { + curr = (struct VPOINT *)curr->flink;/* unlink current column */ + prev->flink = (long) curr; + continue; + } + curr->window = vnew; /* save new window state */ + prev = curr; /* link to next column */ + curr = (struct VPOINT *) curr->flink; + } + lst[cind] = curr - v0; /* stash scanline length */ + *lst = cind; /* stash CHANGELIST size */ +} /* end _ScaleExtractDst */ + +/****************************************************************************** +** _ScaleGetClUdp +** +** FUNCTIONAL DESCRIPTION: +** +** Allocate a UDP to hold count worst-case changelists for a scanline +** from the source image. +** +** FORMAL PARAMETERS: +** +** src - Point to source image UDP +** count - Number of changelists to allocate. +** dstptr - Pointer to location to receive changelist UDP address. +** +******************************************************************************/ +static void _ScaleGetClUdp( src, count, dstptr ) + UdpPtr src; + int count; + UdpPtr *dstptr; +{ + UdpPtr c; + + c = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( c == NULL ) + *dstptr = (UdpPtr) BadAlloc; + + else + { + c->UdpB_DType = UdpK_DTypeCL; + c->UdpB_Class = UdpK_ClassCL; + c->UdpW_PixelLength = 0; + c->UdpL_PxlStride = 0; + c->UdpL_ScnStride = 0; + c->UdpL_X1 = src->UdpL_X1; + c->UdpL_X2 = src->UdpL_X2; + c->UdpL_Y1 = src->UdpL_Y1; + c->UdpL_Y2 = c->UdpL_Y1 + count - 1; + c->UdpL_ScnCnt = count; + c->UdpL_PxlPerScn = src->UdpL_PxlPerScn; + c->UdpL_Pos = 0; + c->UdpL_Levels = 2; + c->UdpL_CompIdx = src->UdpL_CompIdx; + c->UdpL_ArSize = count * (c->UdpL_PxlPerScn + 2) * + sizeof(unsigned int) * 8; + c->UdpA_Base = DdxMallocBits_( c->UdpL_ArSize ); + *dstptr = c; + } +} /* end _ScaleGetClUdp */ + +/****************************************************************************** +** _ScaleDestroyClUdp +** +** FUNCTIONAL DESCRIPTION: +** +** Deallocate a changelist UDP allocated by _ScaleGetClUdp. +** +** FORMAL PARAMETERS: +** +** udp - Pointer to the changelist UDP +** +******************************************************************************/ +static void _ScaleDestroyClUdp( udp ) + UdpPtr udp; +{ + if( IsPointer_(udp) ) + { + if( IsPointer_(udp->UdpA_Base) ) + DdxFreeBits_( udp->UdpA_Base ); + DdxFree_( udp ); + } +} + +/****************************************************************************** +** _BuildHrzMap +** +** FUNCTIONAL DESCRIPTION: +** +** Build the lookup table of precalculated scaled run lengths used +** by the changelist horizontal scale routines. +** +** FORMAL PARAMETERS: +** +** src - Pointer to src udp +** xscale - Horizontal scale factor +** +** FUNCTION VALUE: +** Pointer to the allocated map +** +******************************************************************************/ +static unsigned int * _BuildHrzMap( src, xscale ) + UdpPtr src; + double xscale; +{ + unsigned int *h_map; + unsigned int *ptmp; + unsigned int tmp; + + if( xscale != 1.0 ) + { + /* Pre-calculate the horizontal scaling map */ + h_map = (unsigned *)DdxMalloc_((src->UdpL_PxlPerScn + 2) + * sizeof(unsigned int)); + if( h_map == NULL ) return( (unsigned int *) BadAlloc ); + + ptmp = h_map; + for( tmp = 0; tmp <= src->UdpL_PxlPerScn; tmp++ ) + *(ptmp++) = tmp * xscale; + } + else + h_map = NULL; + + return( h_map ); +} /* end _BuildHrzScale */ + +/****************************************************************************** +** _BuildVRun +** +** FUNCTIONAL DESCRIPTION: +** +** Build the data structure used to keep track of vertical runs +** when using the version of changelist scale that attempts to +** preserve detail. +** +** FORMAL PARAMETERS: +** +** src - Pointer to src udp +** +** FUNCTION VALUE: +** Pointer to the allocated structure +** +******************************************************************************/ +static struct VPOINT * _BuildVRun( src ) + UdpPtr src; +{ + struct VPOINT *v_run; + + /* Worst-case changelist contains entry for each pixel + 2 overhead */ + v_run = (struct VPOINT *) DdxMalloc_((src->UdpL_PxlPerScn + 2) + * sizeof(struct VPOINT)); + if( !IsPointer_(v_run) ) return( (struct VPOINT *) BadAlloc ); + /* + ** Initialize VLIST to contain single "end of scanline" element. + ** - The first VLIST element is initialized as an imaginary SRC scanline + ** column left of the left edge (ie. it's treated as VLIST[-1] ). + ** - The last VLIST element is initialized as an imaginary SRC scanline + ** column right of the right edge (ie. it's treated as VLIST[N+1] ). + */ + /* link VLIST[-1] to VLIST[N+1] */ + v_run->flink = (long)(v_run+src->UdpL_PxlPerScn+1); + v_run->window = ALL0; /* preset window for VLIST[-1] */ + v_run[src->UdpL_PxlPerScn+1] = *v_run; /* link VLIST[N+1] to itself */ + + return (v_run); +} /* end _BuildVRun */ + +/****************************************************************************** +** _ChkUdp +** +** FUNCTIONAL DESCRIPTION: +** +** Check dst udp and convert to one of our supported types if needed. +** +** FORMAL PARAMETERS: +** +** in - Point to input udp, which drives the type selection. +** out - Pointer to out udp +** +******************************************************************************/ +static UdpPtr _ChkUdp( in, out ) + UdpPtr in; + UdpPtr out; +{ + int itype, otype; + UdpPtr dst = out; + + /* For bitonal, the type conversion is handled by the scale routines. */ + if( in->UdpL_Levels == 2 ) + return( dst ); + + itype = DdxGetTyp_( in ); + otype = DdxGetTyp_( out ); + + if( itype != otype ) + { + dst = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( !IsPointer_(dst) ) return( (UdpPtr) BadAlloc ); + + *dst = *out; + + switch( itype ) + { + case XieK_AF: + dst->UdpB_DType = UdpK_DTypeF; + dst->UdpW_PixelLength = sizeof(float) * 8; + break; + case XieK_AWU: + dst->UdpB_DType = UdpK_DTypeWU; + dst->UdpW_PixelLength = sizeof(short) * 8; + break; + case XieK_ABU: + dst->UdpB_DType = UdpK_DTypeBU; + dst->UdpW_PixelLength = sizeof(char) * 8; + break; + default: + dst->UdpB_DType = UdpK_DTypeVU; + dst->UdpW_PixelLength = 1; + break; + } + dst->UdpB_Class = dst->UdpB_DType == UdpK_DTypeVU ? UdpK_ClassUBA + : UdpK_ClassA; + dst->UdpL_PxlStride = dst->UdpW_PixelLength; + dst->UdpL_ScnStride = dst->UdpL_PxlStride * out->UdpL_PxlPerScn; + dst->UdpL_ArSize = dst->UdpL_ScnStride * out->UdpL_ScnCnt; + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + + if( dst->UdpA_Base == NULL ) + dst = (UdpPtr) DdxFree_( dst ); + } + return( dst ); +} /* end _ChkUdp */ +/* end module DmiScale */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/DmiScale.h b/xie/docs/dec/xie23-src/server/xie/smi/DmiScale.h new file mode 100644 index 0000000..1776640 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/DmiScale.h @@ -0,0 +1,147 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright (c) Digital Equipment Corporation, 1990 All Rights Reserved. +** Unpublished rights reserved under the copyright laws of the United States. +** The software contained on this media is proprietary to and embodies the +** confidential technology of Digital Equipment Corporation. Possession, use, +** duplication or dissemination of the software and media is authorized only +** pursuant to a valid written license from Digital Equipment Corporation. + +** RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the U.S. +** Government is subject to restrictions as set forth in Subparagraph +** (c)(1)(ii) of DFARS 252.227-7013, or in FAR 52.227-19, as applicable. +** +** Derived from work bearing the following copyright and permissions: +** +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Digital Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the SCALE pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** +** AUTHOR(S): +** +** John Weber +** Gary L. Grebus (cloned from SmiScale.h) +** +** CREATION DATE: +** +** Wed Sep 5 09:15:42 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _DMISCALE +#define _DMISCALE + +/* +** Include files +*/ +#include + +/* +** Function reference +*/ +int DmiScale(); +int DmiCreateScale(); + +/* +** Structure definitions and Typedefs +*/ +typedef int (*ScaleProc)(); + +typedef struct _ScalePipeCtx { + PipeElementCommonPart common; + struct _ScalePart { + PipeSinkPtr srcsnk; + PipeSinkPtr dstsnk; + PipeDrainPtr srcdrn; + long int dstscn[XieK_MaxComponents]; + double x_scale; + double y_scale; + ScaleProc horizontal; + /* These are for the changelist code */ + unsigned int * h_map; /* Changelist horizontal scale map */ + struct VPOINT * v_run; /* Vertical changelists structure */ + unsigned int * tmp_cl; /* Temporary changelist buffer */ + int bitonal; /* Image is bitonal */ + } ScalePart; +} ScalePipeCtx, *ScalePipeCtxPtr; + +/* +** MACRO definitions +*/ + /* + ** Pipeline context SCALE access MACROs + */ +#define SclSrcSnk_(ctx) (((ScalePipeCtxPtr)(ctx))->ScalePart.srcsnk) +#define SclDstSnk_(ctx) (((ScalePipeCtxPtr)(ctx))->ScalePart.dstsnk) +#define SclSrcDrn_(ctx) (((ScalePipeCtxPtr)(ctx))->ScalePart.srcdrn) +#define SclDstScn_(ctx,i) (((ScalePipeCtxPtr)(ctx))->ScalePart.dstscn[(i)]) +#define SclXScl_(ctx) (((ScalePipeCtxPtr)(ctx))->ScalePart.x_scale) +#define SclYScl_(ctx) (((ScalePipeCtxPtr)(ctx))->ScalePart.y_scale) +#define SclHrzRou_(ctx) (((ScalePipeCtxPtr)(ctx))->ScalePart.horizontal) +#define SclHrzMap_(ctx) (((ScalePipeCtxPtr)(ctx))->ScalePart.h_map) +#define SclVRun_(ctx) (((ScalePipeCtxPtr)(ctx))->ScalePart.v_run) +#define SclTmpCl_(ctx) (((ScalePipeCtxPtr)(ctx))->ScalePart.tmp_cl) +#define SclIsBitonal_(ctx) (((ScalePipeCtxPtr)(ctx))->ScalePart.bitonal) + +#endif +/* _DMISCALE */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/DmiUtil.c b/xie/docs/dec/xie23-src/server/xie/smi/DmiUtil.c new file mode 100644 index 0000000..22a77c4 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/DmiUtil.c @@ -0,0 +1,578 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright (c) Digital Equipment Corporation, 1991 All Rights Reserved. +** Unpublished rights reserved under the copyright laws of the United States. +** The software contained on this media is proprietary to and embodies the +** confidential technology of Digital Equipment Corporation. Possession, use, +** duplication or dissemination of the software and media is authorized only +** pursuant to a valid written license from Digital Equipment Corporation. +** +** RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the U.S. +** Government is subject to restrictions as set forth in Subparagraph +** (c)(1)(ii) of DFARS 252.227-7013, or in FAR 52.227-19, as applicable. +** +** Derived from work bearing the following copyright and permissions: +** +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Digital Machine Independant DDX +** +** ABSTRACT: +** +** This module contains various utility routines. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Tue Mar 5 17:47:44 1991 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ + +/* +** Definition to let include files know who's calling. +*/ +#define _DmiUtil + +/* +** Include files +*/ +#include + +#if defined(VMS) && !defined(VXT) +#include +#include +#include +#endif + +#include /* XIE device dependant definitions */ +#include /* UDP definitions */ + +/* +** Table of contents +*/ +int DmiCmpPreferred(); +void DmiCopyBits(); +int DmiCheckLicense(); +int DmiResolveUdp(); +int DmiUsingCL(); + + + +/* +** MACRO definitions +*/ + +/* +** Equated Symbols +*/ +#define Success 0 +#define NoIntersect 1 +#define FALSE 0 +#define TRUE 1 +/* +** External References +*/ + +/* +** Local Storage +*/ + +/**************************************************************************** +** DmiCmpPreferred +** +** FUNCTIONAL DESCRIPTION: +** +** Answers the question: Does this DDX prefer to keep permanent data +** of the specified compression type in compressed form? +** +** Compressed form is preferred when the storage and conversion +** overhead of uncompressed data exceeds the overhead of decompressing +** the data each time it must be used. +** +** +** FORMAL PARAMETERS: +** type - compression type +** +** FUNCTION VALUE: +** TRUE or FALSE +** +*****************************************************************************/ +int DmiCmpPreferred( type ) + int type; +{ + switch (type) + { + + case XieK_G31D : + case XieK_G32D : + case XieK_G42D : + case XieK_DCT : + return( FALSE ); + + default: + return( FALSE ); + + } +} + +/***************************************************************************** +** DmiCopyBits +** +** FUNCTIONAL DESCRIPTION: +** +** This routine copies (in a semi-optimized way) a string of bits from +** one arbitrary location to another. +** +** FORMAL PARAMETERS: +** +** in - input buffer pointer +** inofs - bit offset into input buffer +** out - output buffer pointer +** outofs - bit offset into output buffer +** count - number of bits to copy +** +** IMPLICIT INPUTS: +** +** none +** +** IMPLICIT OUTPUTS: +** +** none +** +** FUNCTION VALUE: +** +** none +** +** SIGNAL CODES: +** +** none +** +** SIDE EFFECTS: +** +** none +** +*****************************************************************************/ +void DmiCopyBits(in, inofs, out, outofs, count) + char *in; + long inofs; + char *out; + long outofs; + long count; +{ + char *src, *dst; + int in_align_bits; + int out_align_bits; + unsigned int out_align_mask; + + int remainder; + + char *limit; + unsigned char temp; + + /* Compute amount by which bit streams are offset from being + * byte aligned. + */ + + in_align_bits = inofs & 7; + out_align_bits = outofs & 7; + + if (in_align_bits == 0) { + + if (out_align_bits == 0){ + + /* This is the easy case - both sides are byte aligned */ + remainder = count & 7; + + in+=(inofs>>3); + inofs = 0; + + out+=(outofs>>3); + outofs = 0; + + limit = in + (count >> 3); + + while (in < limit) + *out++ = *in++; + } else { + + /* The input is byte aligned. Fetch bytes, and store + * unaligned 8 bits chunks. */ + remainder = count & 7; + + in+=(inofs>>3); + inofs = 0; + + limit = in + (count >> 3); + + while (in < limit ) { + PUT_VALUE_(out, outofs, *in++, 0xff); + outofs+=8; + } + + } + + } else { + /* Input is not byte aligned */ + + if (out_align_bits != 0) { + + /* Neither stream is byte aligned. Align the output stream */ + out_align_mask = (1<<(8 - out_align_bits)) -1; + temp = GET_VALUE_(in, inofs, out_align_mask); + PUT_VALUE_(out, outofs, temp, out_align_mask); + + inofs += (8-out_align_bits); + outofs += (8-out_align_bits); + count -= (8-out_align_bits); + } + + /* The output is (now) byte aligned. Fetch 8 bits, store bytes */ + remainder = count & 7; + + out += (outofs>>3); + outofs = 0; + + limit = out + (count >> 3); + + while (out < limit ) { + temp = GET_VALUE_( in, inofs, 0xff); + *out++ = temp; + inofs+=8; + } + } + + /* Move the leftover (not multiple of a byte) bits. + * At this point in:inofs have been advanced to point to + * the source of the remaining bits, and out:outofs have been + * been advanced to point to the destination */ + if (remainder > 0) { + temp = GET_VALUE_(in, inofs, ((1<UdpL_X1 > idudp->UdpL_X1 ? isudp->UdpL_X1 : idudp->UdpL_X1; + Y1 = isudp->UdpL_Y1 > idudp->UdpL_Y1 ? isudp->UdpL_Y1 : idudp->UdpL_Y1; + X2 = isudp->UdpL_X2 < idudp->UdpL_X2 ? isudp->UdpL_X2 : idudp->UdpL_X2; + Y2 = isudp->UdpL_Y2 < idudp->UdpL_Y2 ? isudp->UdpL_Y2 : idudp->UdpL_Y2; + /* + ** If a ROI was also specified, intersect that with what we have thus + ** far. + */ + if (irudp != NULL) + { + X1 = X1 > irudp->UdpL_X1 ? X1 : irudp->UdpL_X1; + Y1 = Y1 > irudp->UdpL_Y1 ? Y1 : irudp->UdpL_Y1; + X2 = X2 < irudp->UdpL_X2 ? X2 : irudp->UdpL_X2; + Y2 = Y2 < irudp->UdpL_Y2 ? Y2 : irudp->UdpL_Y2; + } + /* + ** Check to make sure these UDPs do actually have an intersection. + */ + if (X1 > X2 || Y1 > Y2) + { + return NoIntersect; + } + /* + ** Now, adjust the output source UDP to describe only the bounding region. + */ + *osudp = *isudp; + + osudp->UdpL_Pos += (Y1 - osudp->UdpL_Y1) * osudp->UdpL_ScnStride + + (X1 - osudp->UdpL_X1) * osudp->UdpL_PxlStride; + osudp->UdpL_PxlPerScn = X2 - X1 + 1; + osudp->UdpL_ScnCnt = Y2 - Y2 + 1; + osudp->UdpL_X1 = X1; + osudp->UdpL_Y1 = Y1; + osudp->UdpL_X2 = X2; + osudp->UdpL_Y2 = Y2; + /* + ** Same for destination... + */ + *odudp = *idudp; + + odudp->UdpL_Pos += (Y1 - odudp->UdpL_Y1) * odudp->UdpL_ScnStride + + (X1 - odudp->UdpL_X1) * odudp->UdpL_PxlStride; + odudp->UdpL_PxlPerScn = X2 - X1 + 1; + odudp->UdpL_ScnCnt = Y2 - Y2 + 1; + odudp->UdpL_X1 = X1; + odudp->UdpL_Y1 = Y1; + odudp->UdpL_X2 = X2; + odudp->UdpL_Y2 = Y2; + /* + ** If ROI specified, then that too... + */ + if (irudp != NULL) + { + *orudp = *irudp; + + orudp->UdpL_Pos += (Y1 - orudp->UdpL_Y1) * orudp->UdpL_ScnStride + + (X1 - orudp->UdpL_X1) * orudp->UdpL_PxlStride; + orudp->UdpL_PxlPerScn = X2 - X1 + 1; + orudp->UdpL_ScnCnt = Y2 - Y2 + 1; + orudp->UdpL_X1 = X1; + orudp->UdpL_Y1 = Y1; + orudp->UdpL_X2 = X2; + orudp->UdpL_Y2 = Y2; + } + + return Success; +} + +/**************************************************************************** +** DmiUsingCL +** +** FUNCTIONAL DESCRIPTION: +** +** This function is the DMI version of the changelist support check +** used in XieTransport.c to determine if the DDX does changelists. +** The DMI DDX does. +** +** FORMAL PARAMETERS: +** +** None. +** +** FUNCTION VALUE: +** +** FALSE == no changelist support +** TRUE == changelists done here +** +*****************************************************************************/ +int DmiUsingCL() +{ + /* + ** This is a vile, ugly hack to allow the DIX to tell if the underlying + ** DDX includes changelist support. This avoids having to rebuild the + ** DIX routine when using different versions of the DDX code. + */ + static UdpRec udp = {0, UdpK_DTypeCL, UdpK_ClassCL}; + + if (DdxGetTyp_(&udp) == XieK_DATA_TYPE_COUNT) + return FALSE; + else + return TRUE; +} diff --git a/xie/docs/dec/xie23-src/server/xie/smi/DmiUtil.h b/xie/docs/dec/xie23-src/server/xie/smi/DmiUtil.h new file mode 100644 index 0000000..7d29db1 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/DmiUtil.h @@ -0,0 +1,106 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/******************************************************************************* +** Copyright (c) Digital Equipment Corporation, 1991 All Rights Reserved. +** Unpublished rights reserved under the copyright laws of the United States. +** The software contained on this media is proprietary to and embodies the +** confidential technology of Digital Equipment Corporation. Possession, use, +** duplication or dissemination of the software and media is authorized only +** pursuant to a valid written license from Digital Equipment Corporation. +** +** RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the U.S. +** Government is subject to restrictions as set forth in Subparagraph +** (c)(1)(ii) of DFARS 252.227-7013, or in FAR 52.227-19, as applicable. +** +** Derived from work bearing the following copyright and permissions: +** +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Digital Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the UTILity module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** Ultrix 4.0 +** +** AUTHOR(S): +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Tue Mar 5 17:48:58 1991 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _DMIUTIL +#define _DMIUTIL + + /* + ** Include files + */ + + /* + ** Function reference + */ +int DmiCmpPreferred(); +void DmiCopyBits(); +int DmiCheckLicense(); +int DmiResolveUdp(); +int DmiUsingCL(); + +#endif _DMIUTIL diff --git a/xie/docs/dec/xie23-src/server/xie/smi/Imakefile b/xie/docs/dec/xie23-src/server/xie/smi/Imakefile new file mode 100644 index 0000000..779349f --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/Imakefile @@ -0,0 +1,150 @@ +/**/# +/**/# @DEC_FREE_COPYRIGHT@ +/**/# +/**/# +/**/# HISTORY +/**/# $Log: Imakefile,v $ +/**/# Revision 1.1.2.3 92/09/14 10:31:55 Dave_Hill +/**/# changind DEFINES handling, removing CDEBUGFLAGS +/**/# [92/09/14 10:31:21 Dave_Hill] +/**/# +/**/# Revision 1.1.2.2 92/07/20 07:46:32 Dave_Hill +/**/# cleaned up old rcs comments +/**/# [92/07/20 07:45:53 Dave_Hill] +/**/# +/**/# Revision 1.1.2.1 92/07/17 16:45:15 devrcs +/**/# Initial load into Alpha pool +/**/# +/**/# $EndLog$ +/**/# +# BuildSystemHeader added automatically +/**/# $Header: /alphabits/u3/x11/ode/rcs/x11/src/extensions/server/xie/smi/Imakefile,v 1.1.2.3 92/09/14 10:31:55 Dave_Hill Exp $ + +#include + +EXTRA_DEFINES = -DXIESMI -DSERVER + +SRCS = SmiArea.c \ + SmiArea.h \ + SmiArithmetic.c \ + SmiArithmetic.h \ + SmiBitMasks.h \ + DmiChangeList.c \ + DmiChangeList.h \ + SmiChromeCom.c \ + SmiChromeCom.h \ + SmiChromeSep.c \ + SmiChromeSep.h \ + SmiCompare.c \ + SmiCompare.h \ + SmiConstrain.c \ + SmiConstrain.h \ + DmiConvert.c \ + DmiConvert.h \ + SmiCrop.c \ + SmiCrop.h \ + SmiDctDef.h \ + SmiDctMacros.h \ + SmiDctTables.c \ + DmiDdx.c \ + SmiDecodeDct.c \ + SmiDecodeDct.h \ + DmiDecodeG4.c \ + DmiDecodeG4.h \ + SmiDither.c \ + SmiDither.h \ + SmiEncodeDct.c \ + SmiEncodeDct.h \ + SmiEncodeG4.c \ + SmiEncodeG4.h \ + DmiExtendInstruct.h \ + SmiFaxTables.c \ + SmiFfx.c \ + SmiFfx.h \ + DmiFill.c \ + DmiFill.h \ + SmiFloat.c \ + SmiHistogram.c \ + SmiLogical.c \ + SmiLogical.h \ + SmiLuminance.c \ + SmiLuminance.h \ + SmiMatchHistogram.c \ + SmiMatchHistogram.h \ + SmiMath.c \ + SmiMath.h \ + SmiMemMgt.c \ + SmiMemMgt.h \ + DmiMi.c \ + SmiMirror.c \ + SmiMirror.h \ + SmiPipe.c \ + SmiPipe.h \ + SmiPipeRsm.c \ + SmiPipeRsm.h \ + SmiPipeSched.c \ + SmiPipeSched.h \ + DmiPoint.c \ + DmiPoint.h \ + SmiRotate.c \ + SmiRotate.h \ + DmiScale.c \ + DmiScale.h \ + SmiStats.c \ + SmiStats.h \ + SmiTranslate.c \ + SmiTranslate.h \ + DmiUtil.c \ + DmiUtil.h + +OBJS = SmiArea.o \ + SmiArithmetic.o \ + DmiChangeList.o \ + SmiChromeCom.o \ + SmiChromeSep.o \ + SmiCompare.o \ + SmiConstrain.o \ + DmiConvert.o \ + SmiCrop.o \ + SmiDctTables.o \ + DmiDdx.o \ + SmiDecodeDct.o \ + DmiDecodeG4.o \ + SmiDither.o \ + SmiEncodeDct.o \ + SmiEncodeG4.o \ + SmiFaxTables.o \ + SmiFfx.o \ + DmiFill.o \ + SmiFloat.o \ + SmiHistogram.o \ + SmiLogical.o \ + SmiLuminance.o \ + SmiMatchHistogram.o \ + SmiMath.o \ + SmiMemMgt.o \ + DmiMi.o \ + SmiMirror.o \ + SmiPipe.o \ + SmiPipeRsm.o \ + SmiPipeSched.o \ + DmiPoint.o \ + SmiRotate.o \ + DmiScale.o \ + SmiStats.o \ + SmiTranslate.o \ + DmiUtil.o + + INCLUDES = -I. -I../../../include -I../../../../server/include -I$(INCLUDESRC) + LINTLIBS = ../../../../server/dix/llib-ldix.ln ../../../../server/os/4.2bsd/llib-los.ln + +NormalLibraryTarget(smi,$(OBJS)) +NormalLibraryObjectRule() +LintLibraryTarget(smi,$(SRCS)) +NormalLintTarget($(SRCS)) + +saber_src: + #load $(CFLAGS) $(SRCS) + +DependTarget() + diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiArea.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiArea.c new file mode 100644 index 0000000..1dd2724 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiArea.c @@ -0,0 +1,2964 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module implements the area operator which performs +** area functions between two photomaps. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHORS: +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Fri Jun 1 14:21:54 1990 +** +*******************************************************************************/ + +#include + +#include "SmiArea.h" + +/* +** Table of contents +*/ +int SmiArea(); +int SmiCreateArea(); + +static int _AreaInitialize(); +static int _AreaActivate(); +static int _AreaAbort(); +static int _AreaDestroy(); + +static UdpPtr AreaGetTempUdp(); +static void AreaDestroyTempUdp(); +static int AreaConvertScanline(); +static int AreaStoreScanline(); + +static UdpPtr AreaGetCppUdp(); +static int AreaConvertCppLine(); + +static void AreaDeallocData(); +static int AreaReleaseData(); + +static int AreaAdjustKernel(); +static void AreaDestroyKernel(); + +static void AreaAddMin(); +static void AreaAddMax(); +static void AreaAddSum(); +static void AreaMultMin(); +static void AreaMultMax(); +static void AreaMultSum(); + +static void AreaAddMinCpp(); +static void AreaAddMaxCpp(); +static void AreaAddSumCpp(); +static void AreaMultMinCpp(); +static void AreaMultMaxCpp(); +static void AreaMultSumCpp(); + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* + * Macros + */ +#define Min_(a,b) ((a) <= (b) ? (a) : (b)) +#define Max_(a,b) ((a) > (b) ? (a) : (b)) +#define Circ_(a,b) ((a) >= 0 ? (a) % (b) : (b) + (a)) + +/* +** Local storage +*/ + /* + ** Area Element Vector + */ +static PipeElementVector AreaPipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeAreaElement, /* Structure subtype */ + sizeof(AreaPipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _AreaInitialize, /* Initialize entry */ + _AreaActivate, /* Activate entry */ + _AreaAbort, /* Flush entry */ + _AreaDestroy, /* Destroy entry */ + _AreaAbort /* Abort entry */ + }; + +/* Dispatch table to select the correct operation routine */ +/* This must match the ordering of the XieK_xxxx constants in XieAppl.h */ +static void (*AreaOpTable[])() = { + AreaAddMin, + AreaAddMax, + AreaAddSum, + AreaMultMin, + AreaMultMax, + AreaMultSum + }; + +static void (*AreaOpTableCpp[])() = { + AreaAddMinCpp, + AreaAddMaxCpp, + AreaAddSumCpp, + AreaMultMinCpp, + AreaMultMaxCpp, + AreaMultSumCpp + }; + +/***************************************************************************** +** SmiCreateArea +** +** FUNCTIONAL DESCRIPTION: +** +** This function fills in a newly created context for a AREA +** pipeline element. +** +** FORMAL PARAMETERS: +** +** pipe - Descriptor for pipe being built. +** srcsnk - Pointer to source sink. +** dstsnk - Pointer to destination sink. +** kernel - Pointer to TmpDatRec describing the area operation kernel. +** idc - Pointer to UDP describing the ROI or CPP (NULL if no IDC). +** op1 - Code for the first operation (kernel to image) +** op2 - Code for the second operation (between results of op1) +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCreateArea(pipe, srcsnk, dstsnk, kernel, idc, op1, op2) +Pipe pipe; +PipeSinkPtr srcsnk; +PipeSinkPtr dstsnk; +TmpDatPtr kernel; +UdpPtr idc; +long int op1; +long int op2; +{ + int windowsz = kernel->y_count; + int i, status, comp; + + AreaPipeCtxPtr ctx = (AreaPipeCtxPtr) + DdxCreatePipeCtx_( pipe, &AreaPipeElement, FALSE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + /* + ** Copy the parameters. + */ + AreaSrcSnk_(ctx) = srcsnk; + AreaDstSnk_(ctx) = dstsnk; + + status = AreaAdjustKernel(kernel, sizeof(float), &AreaKernel_(ctx)); + if( status != Success ) return( status ); + + AreaIdc_(ctx) = idc; + AreaOpIdx_(ctx) = 3 * (op1 - XieK_AreaOp1Add) + (op2 - XieK_AreaOp2Min); + + /* Calculate the bounds of the region that will actually be processed */ + if( idc == NULL ) + { + AreaRoiX1_(ctx) = SnkX1_(srcsnk,0); + AreaRoiX2_(ctx) = SnkX2_(srcsnk,0); + AreaRoiY1_(ctx) = SnkY1_(srcsnk,0); + AreaRoiY2_(ctx) = SnkY2_(srcsnk,0); + } + else + { + AreaRoiX1_(ctx) = idc->UdpL_X1 > SnkX1_(srcsnk,0) ? + idc->UdpL_X1 : SnkX1_(srcsnk,0); + AreaRoiX2_(ctx) = idc->UdpL_X2 < SnkX2_(srcsnk,0) ? + idc->UdpL_X2 : SnkX2_(srcsnk,0); + AreaRoiY1_(ctx) = idc->UdpL_Y1 > SnkY1_(srcsnk,0) ? + idc->UdpL_Y1 : SnkY1_(srcsnk,0); + AreaRoiY2_(ctx) = idc->UdpL_Y2 < SnkY2_(srcsnk,0) ? + idc->UdpL_Y2 : SnkY2_(srcsnk,0); + } + /* Set up the circular buffer(s) used to keep the set of scanlines + * needed to compute one scanline of output. One set of buffers + * contains the PipeDataPtr's for the data we are holding. Another + * set holds the UdpPtrs needed by the low level routines. + */ + for( comp = 0; comp < XieK_MaxComponents; comp++ ) + { + if( SnkUdpPtr_(AreaSrcSnk_(ctx),comp) == NULL ) + break; + AreaWindow_(ctx,comp) = (UdpPtr *) DdxCalloc_(windowsz,sizeof(UdpPtr)); + if( AreaWindow_(ctx,comp) == NULL ) return( BadAlloc ); + AreaDWindow_(ctx,comp) = (PipeDataPtr *) + DdxCalloc_(windowsz,sizeof(PipeDataPtr)); + if( AreaDWindow_(ctx,comp) == NULL ) return( BadAlloc ); + } + AreaSrcDrn_(ctx) = DdxRmCreateDrain_( AreaSrcSnk_(ctx), -1 ); + if( !IsPointer_(AreaSrcDrn_(ctx)) ) return( (int) AreaSrcDrn_(ctx) ); + + /* Handle data as floats only, one scanline at a time */ + DdxRmSetDType_( AreaSrcDrn_(ctx), UdpK_DTypeF, DtM_F ); + DdxRmSetQuantum_( AreaSrcDrn_(ctx), 1 ); + DdxRmSetDType_( AreaDstSnk_(ctx), UdpK_DTypeF, DtM_F ); + DdxRmSetQuantum_( AreaDstSnk_(ctx), 1 ); + + return( Success ); +} /* end SmiCreateArea */ + +/***************************************************************************** +** _AreaInitialize +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the AREA pipeline element prior to +** activation. Allocate the temprary descriptors needed to handle +** the scanlines. +** +** FORMAL PARAMETERS: +** +** ctx - area pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _AreaInitialize(ctx) +AreaPipeCtxPtr ctx; +{ + int comp, i, status, next; + int windowsz = AreaKernel_(ctx)->y_count; + UdpPtr *window; + PipeDataPtr *dwindow; + + for( comp = 0; comp < XieK_MaxComponents; comp++ ) + { + if( SnkUdpPtr_(AreaSrcSnk_(ctx),comp) == NULL ) + break; + window = AreaWindow_(ctx,comp); + dwindow = AreaDWindow_(ctx,comp); + + for( i = 0; i < windowsz; i++ ) + dwindow[AreaWindowNxt_(ctx,comp)] = NULL; + + /* Supply initial temporary UDP's pointing to zero data if the region + * to be processed requires scanlines before the beginning of the + * image. + */ + for( i = AreaRoiY1_(ctx) - AreaKernel_(ctx)->center_y, next = 0; + i < SnkY1_(AreaSrcSnk_(ctx), comp); next++, i++ ) + { + window[next] = AreaGetTempUdp(SnkUdpPtr_(AreaSrcSnk_(ctx), comp)); + if( !IsPointer_(window[next]) ) return( (int) window[next] ); + + status = AreaConvertScanline( SnkUdpPtr_(AreaSrcSnk_(ctx),comp), + SnkY1_(AreaSrcSnk_(ctx),comp), + SnkY2_(AreaSrcSnk_(ctx),comp), + i, window[next] ); + if( status != Success ) return( status ); + } + AreaWindowNxt_(ctx,comp) = next; + AreaWindowCtr_(ctx,comp) = AreaKernel_(ctx)->center_y - 1; + } + if( AreaIdc_(ctx) && AreaIdc_(ctx)->UdpA_Base ) + { + AreaCpp_(ctx) = AreaGetCppUdp(AreaIdc_(ctx)); + if( !IsPointer_(AreaCpp_(ctx)) ) return( (int) AreaCpp_(ctx) ); + } + status = DdxRmInitializePort_( CtxHead_(ctx), AreaSrcDrn_(ctx) ); + if( status == Success ) + status = DdxRmInitializePort_( CtxHead_(ctx), AreaDstSnk_(ctx) ); + + /* Start reading from the first (and only) drain */ + CtxInp_(ctx) = AreaSrcDrn_(ctx); + + return( status ); +} + +/***************************************************************************** +** _AreaActivate +** +** FUNCTIONAL DESCRIPTION: +** +** This routine reads the data from the source drain(s) and +** performs the area operations. +** +** The are five regions of the image stream which must be considered. +** K1 is the number of kernel scanlines before the center. +** K2 is the number of kernel scanlines after the center. +** +** Region Bounds Processing +** I y < Y1 - K1 Not modified. Just copy to output. +** II Y1-K1 <= y < Y1 Not modified, but needed to compute +** later result scanlines. +** III Y1 <= y <= Y2 Area operator applied here. +** IV Y2 < y <= Y2+K2 Not modified, but needed to compute +** previous result scanlines. +** V y > Y2 + K1 Not modified. Just copy to output. +** +** Any of these regions can be empty. +** +** FORMAL PARAMETERS: +** +** ctx - area pipeline element context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _AreaActivate(ctx) +AreaPipeCtxPtr ctx; +{ + PipeDataPtr src = NULL, dst = NULL; + UdpPtr srcudp; + PipeDataPtr *dwindow; + UdpPtr *window; + + int windowsz = AreaKernel_(ctx)->y_count; + int ytail = AreaKernel_(ctx)->y_count - AreaKernel_(ctx)->center_y - 1; + int center, comp, i, status; + + for( status = Success; status == Success; src = DdxRmDeallocData_(src), + dst = DdxRmDeallocData_(dst) ) + { + src = DdxRmGetData_( ctx, AreaSrcDrn_(ctx) ); + if( !IsPointer_(src) ) return( (int) src ); + + comp = DatCmpIdx_(src); + window = AreaWindow_(ctx,comp); + dwindow = AreaDWindow_(ctx,comp); + + if( DatY1_(src) < AreaRoiY1_(ctx) - AreaKernel_(ctx)->center_y || + DatY1_(src) > AreaRoiY2_(ctx) + ytail ) + { + /* This scanline is in Region I or V. Just release it. */ + status = DdxRmPutData_( AreaDstSnk_(ctx), src ); + src = NULL; + } + else + { + srcudp = DatUdpPtr_(src); + + while( 1 ) + { + if( srcudp->UdpL_Y1 < AreaRoiY1_(ctx) ) + { + /* This scanline is in Region II. Create a reference copy + * to save, then release the original. + */ + PipeDataPtr tmp; + tmp = DdxRmAllocRefDesc_(src, DatY1_(src), DatHeight_(src)); + if (!IsPointer_(tmp)) + status = (int) tmp; + else + { + status = DdxRmPutData_(AreaDstSnk_(ctx), src); + src = tmp; + } + if( status != Success ) break; + } + /* This scanline is Region II, III, or IV. + * Free the oldest scanline in the window, and save this one. + */ + AreaDeallocData( ctx, comp, AreaWindowNxt_(ctx,comp) ); + window[AreaWindowNxt_(ctx,comp)] = srcudp; + dwindow[AreaWindowNxt_(ctx,comp)] = src; + src = NULL; + AreaWindowNxt_(ctx,comp) = + Circ_(AreaWindowNxt_(ctx,comp)+1, windowsz); + + if( srcudp->UdpL_Y1 < AreaRoiY1_(ctx) + ytail ) + break; /* We haven't filled the window yet */ + + /* The window is full. We can compute the next output + * scanline. + */ + center = Circ_(AreaWindowCtr_(ctx, comp)+1, windowsz); + AreaWindowCtr_(ctx, comp) = center; + + dst = DdxRmAllocData_( AreaDstSnk_(ctx), comp, + DatY1_(dwindow[center]), 1 ); + status = (int) dst; + if( !IsPointer_(dst) ) break; + + /* Just copy the portion of this scanline outside the ROI*/ + status = DdxCopy_( window[center], /* Left */ + DatUdpPtr_(dst), + window[center]->UdpL_X1, 0, + window[center]->UdpL_X1, DatY1_(dst), + AreaRoiX1_(ctx)-window[center]->UdpL_X1, 1 ); + if( status != Success ) break; + + status = DdxCopy_( window[center], /* Right */ + DatUdpPtr_(dst), + AreaRoiX2_(ctx)+1, 0, + AreaRoiX2_(ctx)+1, DatY1_(dst), + window[center]->UdpL_X2-AreaRoiX2_(ctx), 1 ); + if( status != Success ) break; + + if( AreaCpp_(ctx) == NULL ) + (*AreaOpTable[AreaOpIdx_(ctx)])(window, center, + AreaKernel_(ctx), + DatUdpPtr_(dst), + AreaRoiX1_(ctx), + AreaRoiX2_(ctx)); + else + { + status = AreaConvertCppLine(AreaIdc_(ctx), + window[center]->UdpL_Y1 + ytail, + AreaCpp_(ctx)); + if( status != Success ) break; + (*AreaOpTableCpp[AreaOpIdx_(ctx)])(window, center, + AreaKernel_(ctx), + DatUdpPtr_(dst), + AreaCpp_(ctx), + AreaRoiX1_(ctx), + AreaRoiX2_(ctx)); + } + status = DdxRmPutData_( AreaDstSnk_(ctx), dst ); + dst = NULL; + if( status != Success ) break; + /* If we have just processed the last scanline of interest, + * flush the window. + */ + if( window[center]->UdpL_Y1 == AreaRoiY2_(ctx) ) + { + for( i = Circ_(center+1, windowsz); + i != center; + i = Circ_(i+1, windowsz) ) + if( window[i]->UdpL_Y1 < window[center]->UdpL_Y1 ) + /* This is a Region II or III scanline. + * Discard it. */ + AreaDeallocData(ctx, comp, i); + + else + if( window[i]->UdpL_Y1 <= + window[center]->UdpL_Y1+ytail ) + { /* This is a Region IV scanline. + * Release it */ + status = AreaReleaseData(ctx, comp, i); + if( status != Success ) break; + } + else + /* This must be a "zero" scanline + * inserted because region V is empty. + * Discard it. */ + AreaDeallocData(ctx, comp, i); + break; /* end while -- All done with this component */ + } + /* The last scanline of the image has been read, but + * we haven't processed the last scanline of interest. + * Supply a temporary UDP containing zero data. + */ + i = Circ_(center+ytail, windowsz); + if( window[i]->UdpL_Y1 >= SnkY2_(AreaSrcSnk_(ctx), comp) ) + { + srcudp = AreaGetTempUdp(SnkUdpPtr_(AreaSrcSnk_(ctx),comp)); + status = (int) srcudp; + if( !IsPointer_(srcudp) ) break; + + status = AreaConvertScanline(SnkUdpPtr_(AreaSrcSnk_(ctx), + comp), + SnkY1_(AreaSrcSnk_(ctx), comp), + SnkY2_(AreaSrcSnk_(ctx), comp), + window[i]->UdpL_Y1+1, srcudp); + if( status != Success ) break; + } + else + break; /* Go get the next scanline */ + } /* end while */ + } /* end else */ + } /* end for */ + return( status ); +} + +/***************************************************************************** +** _AreaAbort +** +** FUNCTIONAL DESCRIPTION: +** +** This routine is called when all preceding pipeline stages have +** completed. +** +** +** FORMAL PARAMETERS: +** +** ctx - area pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _AreaAbort(ctx) + AreaPipeCtxPtr ctx; +{ + int comp, i; + + if( IsPointer_(AreaKernel_(ctx)) ) + for( comp = 0; comp < XieK_MaxComponents; comp++ ) + { + if( SnkUdpPtr_(AreaSrcSnk_(ctx),comp) == NULL ) + break; + for( i = 0; i < AreaKernel_(ctx)->y_count; i++ ) + AreaDeallocData(ctx, comp, i); + } + + if( IsPointer_(AreaCpp_(ctx)) ) + AreaDestroyTempUdp( AreaCpp_(ctx), AreaIdc_(ctx) ); + + return( Success ); +} + +/***************************************************************************** +** _AreaDestroy +** +** FUNCTIONAL DESCRIPTION: +** +** This routine deallocates all resources allocated by the AREA +** pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - area pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _AreaDestroy(ctx) +AreaPipeCtxPtr ctx; +{ + int c; + + for( c = 0; c < XieK_MaxComponents; c++ ) + { + if (SnkUdpPtr_(AreaSrcSnk_(ctx),c) == NULL) + break; + if( IsPointer_(AreaWindow_(ctx,c)) ) + AreaWindow_(ctx,c) = (UdpPtr *) DdxFree_(AreaWindow_(ctx,c)); + if( IsPointer_(AreaDWindow_(ctx,c)) ) + AreaDWindow_(ctx,c) = (PipeDataPtr *) DdxFree_(AreaDWindow_(ctx,c)); + } + AreaDestroyKernel(AreaKernel_(ctx)); + AreaKernel_(ctx) = NULL; + AreaSrcDrn_(ctx) = DdxRmDestroyDrain_( AreaSrcDrn_(ctx) ); + + return( Success ); +} + +/***************************************************************************** +** SmiArea +** +** FUNCTIONAL DESCRIPTION: +** +** This routine performs a non-pipelined area operator, which +** performs an area operator between a UDP and a kernel +** supplied from a Template IDC. +** +** Only the region of the source UDP which intersects the destination +** UDP is processed. If an IDC is supplied, the region selected +** by the IDC is processed, while the source UDP data is copied +** to the unselected pixels. +** +** Source data outside the intersection (and IDC) is used when +** computing results at the boundary of the processed region. +** Points outside the source image are considered to be zero. +** +** Note that the destination photomap must be of type float or +** the data will be transformed from unconstrained to a constrained +** type in an undefined manner. +** +** FORMAL PARAMETERS: +** +** srcudp - Pointer to a UDP describing the source image. +** dstudp - Pointer to a UDP describing the destination buffer. +** in_kernel- Pointer to a TmpDatRec describing the area kernel. +** idc - Pointer to a UDP describing the Region of Interest, +** or Control Processing Plane. +** (NULL if no IDC) +** op1 - Code for the first operation (kernel to image) +** op2 - Code for the second operation (between results of op1) +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiArea( srcudp, dstudp, in_kernel, idc, op1, op2 ) + +UdpPtr srcudp; +UdpPtr dstudp; +TmpDatPtr in_kernel; +UdpPtr idc; +long int op1; +long int op2; +{ + UdpPtr dst = NULL, cpp = NULL, *window = NULL; + TmpDatPtr kernel = NULL; + long int window_next, window_center; + long int pixels, scanline, status; + long int X1, X2, Y1, Y2; /* src/destination common bounds */ + long int x1, x2, y1, y2; /* src/destination/ROI common bounds */ + long int windowsz; + long int i; + int opidx = 3 * (op1 - XieK_AreaOp1Add) + (op2 - XieK_AreaOp2Min); + + + /* + ** Allocate the destination image array + */ + if( dstudp->UdpA_Base == NULL ) + { + dstudp->UdpA_Base = DdxMallocBits_( dstudp->UdpL_ArSize ); + if( dstudp->UdpA_Base == NULL ) return( BadAlloc ); + } + + /* + * Determine maximum common dimensions between source and destination, + * which is the defined region of output. + */ + X1 = srcudp->UdpL_X1 > dstudp->UdpL_X1 ? srcudp->UdpL_X1 : dstudp->UdpL_X1; + X2 = srcudp->UdpL_X2 < dstudp->UdpL_X2 ? srcudp->UdpL_X2 : dstudp->UdpL_X2; + Y1 = srcudp->UdpL_Y1 > dstudp->UdpL_Y1 ? srcudp->UdpL_Y1 : dstudp->UdpL_Y1; + Y2 = srcudp->UdpL_Y2 < dstudp->UdpL_Y2 ? srcudp->UdpL_Y2 : dstudp->UdpL_Y2; + + /* + * Determine the maximum common dimensions between the above region + * and the IDC (ROI or CPP), which is the region that will actually + * be processed. + */ + if( idc == NULL ) + { + x1 = X1; + x2 = X2; + y1 = Y1; + y2 = Y2; + } + else + { + x1 = idc->UdpL_X1 > X1 ? idc->UdpL_X1 : X1; + x2 = idc->UdpL_X2 < X2 ? idc->UdpL_X2 : X2; + y1 = idc->UdpL_Y1 > Y1 ? idc->UdpL_Y1 : Y1; + y2 = idc->UdpL_Y2 < Y2 ? idc->UdpL_Y2 : Y2; + if( idc->UdpA_Base != NULL ) + { + cpp = AreaGetCppUdp(idc); + if( !IsPointer_(cpp) ) + { + status = (int) cpp; + goto clean_up; + } + } + } + windowsz = in_kernel->y_count; + window = (UdpPtr *) DdxCalloc_(windowsz, sizeof(UdpPtr)); + if( window == NULL ) + { + status = BadAlloc; + goto clean_up; + } + /* Window is an array of UdpPtr's managed as a circular buffer. + * Initialize the window to contain enough temporary float UDP's to + * hold the data needed to compute one result scanline. + * Initialize a similar window for the CPP data, converted to byte form. + */ + for( i = 0; i < windowsz; i++ ) + { + window[i] = AreaGetTempUdp(srcudp); + if( !IsPointer_(window[i]) ) + { + status = (int) window[i]; + goto clean_up; + } + } + /* Fill in the UDP's with the data needed to compute the first result + * scanline (except for one line). Results along the image boundaries + * are computed by treating values outside the image as zero. + */ + for( scanline = y1 - in_kernel->center_y, window_next = 0; + scanline < y1 + windowsz - in_kernel->center_y - 1; + scanline++, window_next++ ) + { + status = AreaConvertScanline( srcudp, srcudp->UdpL_Y1, srcudp->UdpL_Y2, + scanline, window[window_next] ); + if( status != Success ) goto clean_up; + } + + /* Create a copy of the kernel containing the appropriate increments. */ + status = AreaAdjustKernel(in_kernel, window[0]->UdpL_PxlStride>>3, &kernel); + + dst = AreaGetTempUdp(dstudp); + if( !IsPointer_(dst) ) + { + status = (int) dst; + goto clean_up; + } + /* Just copy the rectangles that are outside of the ROI */ + /* Top */ + status = DdxCopy_( srcudp, dstudp, X1, Y1, X1, Y1, X2-X1+1, y1-Y1 ); + if( status != Success ) goto clean_up; + /* Bottom */ + status = DdxCopy_( srcudp, dstudp, X1, y2+1, X1, y2+1, X2-X1+1, Y2-y2 ); + if( status != Success ) goto clean_up; + /* Left */ + status = DdxCopy_( srcudp, dstudp, X1, y1, X1, y1, x1-X1, y2-y1+1 ); + if( status != Success ) goto clean_up; + /* Right */ + status = DdxCopy_( srcudp, dstudp, x2+1, y1, x2+1, y1, X2-x2, y2-y1+1 ); + if( status != Success ) goto clean_up; + + /* Now perform the area operation over the scanlines within the ROI */ + + dst->UdpL_Y1 = dst->UdpL_Y2 = y1; + if( dst->UdpA_Base == dstudp->UdpA_Base ) + dst->UdpL_Pos = dst->UdpL_Pos + y1 * dst->UdpL_ScnStride; + + window_center = kernel->center_y - 1; + window_next = windowsz - 1; + + for( scanline = y1; scanline <= y2; scanline++ ) + { + /* Advance the window, and add the next scanline to it */ + window_center = Circ_(window_center+1, windowsz); + status = AreaConvertScanline( srcudp, srcudp->UdpL_Y1, srcudp->UdpL_Y2, + scanline+windowsz-kernel->center_y-1, + window[window_next]); + if( status != Success ) goto clean_up; + + window_next = Circ_(window_next+1, windowsz); + + if( cpp == NULL ) + (*AreaOpTable[opidx])(window, window_center, kernel, dst, x1, x2); + else + { + status = AreaConvertCppLine( idc, + scanline+windowsz-kernel->center_y-1, + cpp ); + if( status != Success ) goto clean_up; + (*AreaOpTableCpp[opidx])(window, window_center, kernel, dst, + cpp, x1, x2); + } + status = AreaStoreScanline(dst, scanline, dstudp); + if( status != Success ) goto clean_up; + } + + /* Cleanup the temporary descriptors */ +clean_up : + if( IsPointer_(window) ) + { + for( i = 0; i < windowsz; i++ ) + if( IsPointer_(window[i]) ) + AreaDestroyTempUdp( window[i], srcudp ); + DdxFree_(window); + } + if( IsPointer_(dst) ) + AreaDestroyTempUdp( dst, dstudp ); + + if( IsPointer_(kernel) ) + AreaDestroyKernel(kernel); + + if( IsPointer_(cpp) ) + AreaDestroyTempUdp( cpp, idc ); + + return( status ); +} /* end SmiArea */ + +/***************************************************************************** +** Area processing routines +** +** FUNCTIONAL DESCRIPTION: +** +** These routines the actual area operation over a selected +** portion of a scanline. A separate routine is used for each +** type of operation. +** +** FORMAL PARAMETERS: +** +** window - Array of pointers to Udps containing the scanlines +** needed to process the current scanline. +** center - Index into window of the pointer to the current scanline. +** kernel - Pointer to TmpDatRec containing the kernel. +** dst - Pointer to a UDP describing the destination buffer. +** x1 - The x coordinate of the left endpoint of the ROI. +** x2 - The x coordinate of the right endpoint of the ROI. +** +*****************************************************************************/ +static void AreaAddMin(window, center, kernel, dst, x1, x2) +UdpPtr window[]; +int center; +TmpDatPtr kernel; +UdpPtr dst; +long int x1; +long int x2; +{ + unsigned char *dststart; + unsigned char *dstptr; + int dstbytes; + int srcbytes; + + UdpPtr curudp; + unsigned char *curstart; + unsigned char *curptr; + unsigned char *curedge; + + TmpDatEntryPtr k1; + TmpDatEntryPtr k2; + + int ky; + float value; + + int windowsz = kernel->y_count; + int kerntail = kernel->x_count - kernel->center_x - 1; + + srcbytes = window[center]->UdpL_PxlStride >> 3; + dstbytes = dst->UdpL_PxlStride >> 3; + + dststart = dst->UdpA_Base + (dst->UdpL_Pos >> 3) + + (x1 - dst->UdpL_X1) * dstbytes; + + /* Initialize the destination scanline with the first candidate for the + * minimum value, the value corresponding to the upper left corner of the + * kernel. + */ + dstptr = dststart; + k2 = kernel->array; /* 1st value in first row of kernel */ + + curudp = window[Circ_(center - kernel->center_y, windowsz)]; + curptr = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + ((x1 - kernel->center_x) - curudp->UdpL_X1) * srcbytes; + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3); + + while (curptr < curedge) { + /* The relevant source pixel is off the left edge of the image */ + *(float *)dstptr = k2->value + 0.0; + curptr += srcbytes; + dstptr += dstbytes; + } + + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x2 - curudp->UdpL_X1) * srcbytes; + while (curptr < curedge) { + *(float *)dstptr = k2->value + *(float *)curptr; + curptr += srcbytes; + dstptr += dstbytes; + } + + /* + * Now calculate the rest, saving the minimum. + */ + k1 = kernel->array; + + for (ky = -kernel->center_y; ky < windowsz - kernel->center_y; ky++) { + curudp = window[Circ_(center + ky, windowsz)]; + dstptr = dststart; + + curstart = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x1 - kernel->center_x - curudp->UdpL_X1) * srcbytes; + + /* Do the region where pixels outside the left edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3); + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr < curedge) + value = k2->value + 0.0; + else + value = *(float *)curptr + k2->value; + if (value < *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + curstart += srcbytes; + dstptr += dstbytes; + } + + /* Do the pixels where the kernel totally overlaps the image */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (Min_(x2, curudp->UdpL_X2-kerntail) - kernel->center_x + - curudp->UdpL_X1) * srcbytes; + while (curstart <= curedge) { + k2 = k1; + curptr = curstart - srcbytes; + while (k2->increment != 0) { + curptr += k2->increment; + value = *(float *)curptr + k2->value; + if (value < *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + curstart += srcbytes; + dstptr += dstbytes; + } + + /* Do the region where pixels outside the right edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x2 - curudp->UdpL_X1) * srcbytes; + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr <= curedge) + value = *(float *)curptr + k2->value; + else + value = k2->value + 0.0; + if (value < *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + curstart += srcbytes; + dstptr += dstbytes; + } + + k1 += (kernel->x_count+1); + } +} /* end AreaAddMin */ + +static void AreaAddMax(window, center, kernel, dst, x1, x2) +UdpPtr window[]; +int center; +TmpDatPtr kernel; +UdpPtr dst; +long int x1; +long int x2; +{ + unsigned char *dststart; + unsigned char *dstptr; + int dstbytes; + int srcbytes; + + UdpPtr curudp; + unsigned char *curstart; + unsigned char *curptr; + unsigned char *curedge; + + TmpDatEntryPtr k1; + TmpDatEntryPtr k2; + + int ky; + float value; + + int windowsz = kernel->y_count; + int kerntail = kernel->x_count - kernel->center_x - 1; + + srcbytes = window[center]->UdpL_PxlStride >> 3; + dstbytes = dst->UdpL_PxlStride >> 3; + + dststart = dst->UdpA_Base + (dst->UdpL_Pos >> 3) + + (x1 - dst->UdpL_X1) * dstbytes; + + /* Initialize the destination scanline with the first candidate for the + * minimum value, the value corresponding to the upper left corner of the + * kernel. + */ + dstptr = dststart; + k2 = kernel->array; /* 1st value in first row of kernel */ + + curudp = window[Circ_(center - kernel->center_y, windowsz)]; + curptr = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + ((x1 - kernel->center_x) - curudp->UdpL_X1) * srcbytes; + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3); + + while (curptr < curedge) { + /* The relevant source pixel is off the left edge of the image */ + *(float *)dstptr = k2->value + 0.0; + curptr += srcbytes; + dstptr += dstbytes; + } + + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x2 - curudp->UdpL_X1) * srcbytes; + while (curptr < curedge) { + *(float *)dstptr = k2->value + *(float *)curptr; + curptr += srcbytes; + dstptr += dstbytes; + } + + /* + * Now calculate the rest, saving the minimum. + */ + k1 = kernel->array; + + for (ky = -kernel->center_y; ky < windowsz - kernel->center_y; ky++) { + curudp = window[Circ_(center + ky, windowsz)]; + dstptr = dststart; + + curstart = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x1 - kernel->center_x - curudp->UdpL_X1) * srcbytes; + + /* Do the region where pixels outside the left edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3); + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr < curedge) + value = k2->value + 0.0; + else + value = *(float *)curptr + k2->value; + if (value > *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + curstart += srcbytes; + dstptr += dstbytes; + } + + /* Do the pixels where the kernel totally overlaps the image */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (Min_(x2, curudp->UdpL_X2-kerntail) - kernel->center_x + - curudp->UdpL_X1) * srcbytes; + while (curstart <= curedge) { + k2 = k1; + curptr = curstart - srcbytes; + while (k2->increment != 0) { + curptr += k2->increment; + value = *(float *)curptr + k2->value; + if (value > *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + curstart += srcbytes; + dstptr += dstbytes; + } + + /* Do the region where pixels outside the right edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x2 - curudp->UdpL_X1) * srcbytes; + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr <= curedge) + value = *(float *)curptr + k2->value; + else + value = k2->value + 0.0; + if (value > *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + curstart += srcbytes; + dstptr += dstbytes; + } + + k1 += (kernel->x_count+1); + } +} /* end AreaAddMax */ + +static void AreaAddSum(window, center, kernel, dst, x1, x2) +UdpPtr window[]; +int center; +TmpDatPtr kernel; +UdpPtr dst; +long int x1; +long int x2; +{ + long int pixel; + + unsigned char *dststart; + unsigned char *dstptr; + int dstbytes; + int srcbytes; + + UdpPtr curudp; + unsigned char *curstart; + unsigned char *curptr; + unsigned char *curedge; + + TmpDatEntryPtr k1; + TmpDatEntryPtr k2; + + int ky; + + int windowsz = kernel->y_count; + int kerntail = kernel->x_count - kernel->center_x - 1; + + srcbytes = window[center]->UdpL_PxlStride >> 3; + dstbytes = dst->UdpL_PxlStride >> 3; + + dststart = dst->UdpA_Base + (dst->UdpL_Pos >> 3) + + (x1 - dst->UdpL_X1) * dstbytes; + + /* Zero the destination scanline so we can accumulate into it */ + dstptr = dststart; + for (pixel = x1; pixel <= x2; pixel++) { + *(float *)dstptr = 0.0; + dstptr+=dstbytes; + } + + /* + * Calculate the summation. + */ + k1 = kernel->array; + + for (ky = -kernel->center_y; ky < windowsz - kernel->center_y; ky++) { + curudp = window[Circ_(center + ky, windowsz)]; + dstptr = dststart; + + curstart = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x1 - kernel->center_x - curudp->UdpL_X1) * srcbytes; + + /* Do the region where pixels outside the left edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3); + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr < curedge) + *(float *)dstptr += (k2->value + 0.0); + else + *(float *)dstptr += (*(float *)curptr + k2->value); + k2++; + } + curstart += srcbytes; + dstptr += dstbytes; + } + + /* Do the pixels where the kernel totally overlaps the image */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (Min_(x2, curudp->UdpL_X2-kerntail) - kernel->center_x + - curudp->UdpL_X1) * srcbytes; + while (curstart <= curedge) { + k2 = k1; + curptr = curstart - srcbytes; + while (k2->increment != 0) { + curptr += k2->increment; + *(float *)dstptr += (*(float *)curptr + k2->value); + k2++; + } + curstart += srcbytes; + dstptr += dstbytes; + } + + /* Do the region where pixels outside the right edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x2 - curudp->UdpL_X1) * srcbytes; + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr <= curedge) + *(float *)dstptr += (*(float *)curptr + k2->value); + else + *(float *)dstptr += (k2->value + 0.0); + k2++; + } + curstart += srcbytes; + dstptr += dstbytes; + } + + k1 += (kernel->x_count+1); + } + +} /* end AreaAddSum */ + +static void AreaMultMin(window, center, kernel, dst, x1, x2) +UdpPtr window[]; +int center; +TmpDatPtr kernel; +UdpPtr dst; +long int x1; +long int x2; +{ + unsigned char *dststart; + unsigned char *dstptr; + int dstbytes; + int srcbytes; + + UdpPtr curudp; + unsigned char *curstart; + unsigned char *curptr; + unsigned char *curedge; + + TmpDatEntryPtr k1; + TmpDatEntryPtr k2; + + int ky; + float value; + + int windowsz = kernel->y_count; + int kerntail = kernel->x_count - kernel->center_x - 1; + + srcbytes = window[center]->UdpL_PxlStride >> 3; + dstbytes = dst->UdpL_PxlStride >> 3; + + dststart = dst->UdpA_Base + (dst->UdpL_Pos >> 3) + + (x1 - dst->UdpL_X1) * dstbytes; + + /* Initialize the destination scanline with the first candidate for the + * minimum value, the value corresponding to the upper left corner of the + * kernel. + */ + dstptr = dststart; + k2 = kernel->array; /* 1st value in first row of kernel */ + + curudp = window[Circ_(center - kernel->center_y, windowsz)]; + curptr = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + ((x1 - kernel->center_x) - curudp->UdpL_X1) * srcbytes; + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3); + + while (curptr < curedge) { + /* The relevant source pixel is off the left edge of the image */ + *(float *)dstptr = 0.0 * k2->value; + curptr += srcbytes; + dstptr += dstbytes; + } + + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x2 - curudp->UdpL_X1) * srcbytes; + while (curptr < curedge) { + *(float *)dstptr = k2->value * *(float *)curptr; + curptr += srcbytes; + dstptr += dstbytes; + } + + /* + * Now calculate the rest, saving the minimum. + */ + k1 = kernel->array; + + for (ky = -kernel->center_y; ky < windowsz - kernel->center_y; ky++) { + curudp = window[Circ_(center + ky, windowsz)]; + dstptr = dststart; + + curstart = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x1 - kernel->center_x - curudp->UdpL_X1) * srcbytes; + + /* Do the region where pixels outside the left edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3); + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr < curedge) + value = 0.0 * k2->value; + else + value = *(float *)curptr * k2->value; + if (value < *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + curstart += srcbytes; + dstptr += dstbytes; + } + + /* Do the pixels where the kernel totally overlaps the image */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (Min_(x2, curudp->UdpL_X2-kerntail) - kernel->center_x + - curudp->UdpL_X1) * srcbytes; + while (curstart <= curedge) { + k2 = k1; + curptr = curstart - srcbytes; + while (k2->increment != 0) { + curptr += k2->increment; + value = *(float *)curptr * k2->value; + if (value < *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + curstart += srcbytes; + dstptr += dstbytes; + } + + /* Do the region where pixels outside the right edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x2 - curudp->UdpL_X1) * srcbytes; + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr <= curedge) + value = *(float *)curptr * k2->value; + else + value = 0.0 * k2->value ; + if (value < *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + curstart += srcbytes; + dstptr += dstbytes; + } + + k1 += (kernel->x_count+1); + } +} /* end AreaMultMin */ + +static void AreaMultMax(window, center, kernel, dst, x1, x2) +UdpPtr window[]; +int center; +TmpDatPtr kernel; +UdpPtr dst; +long int x1; +long int x2; +{ + unsigned char *dststart; + unsigned char *dstptr; + int dstbytes; + int srcbytes; + + UdpPtr curudp; + unsigned char *curstart; + unsigned char *curptr; + unsigned char *curedge; + + TmpDatEntryPtr k1; + TmpDatEntryPtr k2; + + int ky; + float value; + + int windowsz = kernel->y_count; + int kerntail = kernel->x_count - kernel->center_x - 1; + + srcbytes = window[center]->UdpL_PxlStride >> 3; + dstbytes = dst->UdpL_PxlStride >> 3; + + dststart = dst->UdpA_Base + (dst->UdpL_Pos >> 3) + + (x1 - dst->UdpL_X1) * dstbytes; + + /* Initialize the destination scanline with the first candidate for the + * minimum value, the value corresponding to the upper left corner of the + * kernel. + */ + dstptr = dststart; + k2 = kernel->array; /* 1st value in first row of kernel */ + + curudp = window[Circ_(center - kernel->center_y, windowsz)]; + curptr = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + ((x1 - kernel->center_x) - curudp->UdpL_X1) * srcbytes; + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3); + + while (curptr < curedge) { + /* The relevant source pixel is off the left edge of the image */ + *(float *)dstptr = 0.0 * k2->value; + curptr += srcbytes; + dstptr += dstbytes; + } + + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x2 - curudp->UdpL_X1) * srcbytes; + while (curptr < curedge) { + *(float *)dstptr = k2->value * *(float *)curptr; + curptr += srcbytes; + dstptr += dstbytes; + } + + /* + * Now calculate the rest, saving the minimum. + */ + k1 = kernel->array; + + for (ky = -kernel->center_y; ky < windowsz - kernel->center_y; ky++) { + curudp = window[Circ_(center + ky, windowsz)]; + dstptr = dststart; + + curstart = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x1 - kernel->center_x - curudp->UdpL_X1) * srcbytes; + + /* Do the region where pixels outside the left edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3); + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr < curedge) + value = 0.0 * k2->value; + else + value = *(float *)curptr * k2->value; + if (value > *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + curstart += srcbytes; + dstptr += dstbytes; + } + + /* Do the pixels where the kernel totally overlaps the image */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (Min_(x2, curudp->UdpL_X2-kerntail) - kernel->center_x + - curudp->UdpL_X1) * srcbytes; + while (curstart <= curedge) { + k2 = k1; + curptr = curstart - srcbytes; + while (k2->increment != 0) { + curptr += k2->increment; + value = *(float *)curptr * k2->value; + if (value > *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + curstart += srcbytes; + dstptr += dstbytes; + } + + /* Do the region where pixels outside the right edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x2 - curudp->UdpL_X1) * srcbytes; + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr <= curedge) + value = *(float *)curptr * k2->value; + else + value = 0.0 * k2->value ; + if (value > *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + curstart += srcbytes; + dstptr += dstbytes; + } + + k1 += (kernel->x_count+1); + } +} /* end AreaMultMax */ + +static void AreaMultSum(window, center, kernel, dst, x1, x2) +UdpPtr window[]; +int center; +TmpDatPtr kernel; +UdpPtr dst; +long int x1; +long int x2; +{ + long int pixel; + + unsigned char *dststart; + unsigned char *dstptr; + int dstbytes; + int srcbytes; + + UdpPtr curudp; + unsigned char *curstart; + unsigned char *curptr; + unsigned char *curedge; + + TmpDatEntryPtr k1; + TmpDatEntryPtr k2; + + int ky; + + int windowsz = kernel->y_count; + int kerntail = kernel->x_count - kernel->center_x - 1; + + srcbytes = window[center]->UdpL_PxlStride >> 3; + dstbytes = dst->UdpL_PxlStride >> 3; + + dststart = dst->UdpA_Base + (dst->UdpL_Pos >> 3) + + (x1 - dst->UdpL_X1) * dstbytes; + + /* Zero the destination scanline so we can accumulate into it */ + dstptr = dststart; + for (pixel = x1; pixel <= x2; pixel++) { + *(float *)dstptr = 0.0; + dstptr+=dstbytes; + } + + /* + * Calculate the summation. + */ + k1 = kernel->array; + + for (ky = -kernel->center_y; ky < windowsz - kernel->center_y; ky++) { + curudp = window[Circ_(center + ky, windowsz)]; + dstptr = dststart; + + curstart = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x1 - kernel->center_x - curudp->UdpL_X1) * srcbytes; + + /* Do the region where pixels outside the left edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3); + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr < curedge) + *(float *)dstptr += (k2->value * 0.0); + else + *(float *)dstptr += (*(float *)curptr * k2->value); + k2++; + } + curstart += srcbytes; + dstptr += dstbytes; + } + + /* Do the pixels where the kernel totally overlaps the image */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (Min_(x2, curudp->UdpL_X2-kerntail) - kernel->center_x + - curudp->UdpL_X1) * srcbytes; + while (curstart <= curedge) { + k2 = k1; + curptr = curstart - srcbytes; + while (k2->increment != 0) { + curptr += k2->increment; + *(float *)dstptr += (*(float *)curptr * k2->value); + k2++; + } + curstart += srcbytes; + dstptr += dstbytes; + } + + /* Do the region where pixels outside the right edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x2 - curudp->UdpL_X1) * srcbytes; + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr <= curedge) + *(float *)dstptr += (*(float *)curptr * k2->value); + else + *(float *)dstptr += (k2->value * 0.0); + k2++; + } + curstart += srcbytes; + dstptr += dstbytes; + } + + k1 += (kernel->x_count+1); + } +} /* end AreaMultSum */ + +/***************************************************************************** +** Area processing routines including CPP +** +** FUNCTIONAL DESCRIPTION: +** +** These routines the actual area operation over a selected +** portion of a scanline. A separate routine is used for each +** type of operation. +** +** FORMAL PARAMETERS: +** +** window - Array of pointers to Udps containing the scanlines +** needed to process the current scanline. +** center - Index into window of the pointer to the current scanline. +** kernel - Pointer to a TmpDatRec describing the area kernel. +** dst - Pointer to a UDP describing the destination buffer. +** cpp - Pointer to a UDP describing the Control Processing Plane. +** y - The y coordinate of the beginning of the CPP or ROI. +** x1 - The x coordinate of the left endpoint of the CPP, or ROI. +** x2 - The x coordinate of the right endpoint of the CPP, or ROI. +** +*****************************************************************************/ +static void AreaAddMinCpp(window, center, kernel, dst, cpp, x1, x2) +UdpPtr window[]; +int center; +TmpDatPtr kernel; +UdpPtr dst; +UdpPtr cpp; +long int x1; +long int x2; +{ + unsigned char *dststart; + unsigned char *dstptr; + int dstbytes; + int srcbytes; + + UdpPtr curudp; + unsigned char *curstart; + unsigned char *curptr; + unsigned char *curedge; + unsigned char *srcptr; + + unsigned char *cppstart; + unsigned char *cppptr; + + TmpDatEntryPtr k1; + TmpDatEntryPtr k2; + + int ky; + float value; + + int windowsz = kernel->y_count; + int kerntail = kernel->x_count - kernel->center_x - 1; + + srcbytes = window[center]->UdpL_PxlStride >> 3; + dstbytes = dst->UdpL_PxlStride >> 3; + + dststart = dst->UdpA_Base + (dst->UdpL_Pos >> 3) + + (x1 - dst->UdpL_X1) * dstbytes; + cppstart = cpp->UdpA_Base + (cpp->UdpL_Pos >> 3); + + + /* Initialize the destination scanline with the first candidate for the + * minimum value, the value corresponding to the upper left corner of the + * kernel. + */ + dstptr = dststart; + k2 = kernel->array; /* 1st value in first row of kernel */ + + curudp = window[Circ_(center - kernel->center_y, windowsz)]; + curptr = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + ((x1 - kernel->center_x) - curudp->UdpL_X1) * srcbytes; + cppptr = cppstart; + srcptr = window[center]->UdpA_Base + + (window[center]->UdpL_Pos >> 3) + + (x1 - window[center]->UdpL_X1) * srcbytes; + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3); + + while (curptr < curedge) { + /* The relevant source pixel is off the left edge of the image */ + if (*cppptr) + *(float *)dstptr = k2->value + 0.0; + else + *(float *)dstptr = *(float *)srcptr; + curptr += srcbytes; + dstptr += dstbytes; + cppptr++; + srcptr += srcbytes; + } + + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x2 - curudp->UdpL_X1) * srcbytes; + while (curptr < curedge) { + if (*cppptr) + *(float *)dstptr = k2->value + *(float *)curptr; + else + *(float *)dstptr = *(float *)srcptr; + curptr += srcbytes; + dstptr += dstbytes; + cppptr++; + srcptr += srcbytes; + } + + /* + * Now calculate the rest, saving the minimum. + */ + k1 = kernel->array; + + for (ky = -kernel->center_y; ky < windowsz - kernel->center_y; ky++) { + curudp = window[Circ_(center + ky, windowsz)]; + dstptr = dststart; + cppptr = cppstart; + + curstart = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x1 - kernel->center_x - curudp->UdpL_X1) * srcbytes; + + /* Do the region where pixels outside the left edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3); + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + if (*cppptr) { + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr < curedge) + value = k2->value + 0.0; + else + value = *(float *)curptr + k2->value; + if (value < *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + } + curstart += srcbytes; + dstptr += dstbytes; + cppptr++; + } + + /* Do the pixels where the kernel totally overlaps the image */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (Min_(x2, curudp->UdpL_X2-kerntail) - kernel->center_x + - curudp->UdpL_X1) * srcbytes; + while (curstart <= curedge) { + k2 = k1; + curptr = curstart - srcbytes; + if (*cppptr) { + while (k2->increment != 0) { + curptr += k2->increment; + value = *(float *)curptr + k2->value; + if (value < *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + } + curstart += srcbytes; + dstptr += dstbytes; + cppptr++; + } + + /* Do the region where pixels outside the right edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x2 - curudp->UdpL_X1) * srcbytes; + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + if (*cppptr) { + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr <= curedge) + value = *(float *)curptr + k2->value; + else + value = k2->value + 0.0; + if (value < *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + } + curstart += srcbytes; + dstptr += dstbytes; + cppptr++; + } + + k1 += (kernel->x_count+1); + } +} /* end AreaAddMinCpp */ + +static void AreaAddMaxCpp(window, center, kernel, dst, cpp, x1, x2) +UdpPtr window[]; +int center; +TmpDatPtr kernel; +UdpPtr dst; +UdpPtr cpp; +long int x1; +long int x2; +{ + unsigned char *dststart; + unsigned char *dstptr; + int dstbytes; + int srcbytes; + + UdpPtr curudp; + unsigned char *curstart; + unsigned char *curptr; + unsigned char *curedge; + unsigned char *srcptr; + + unsigned char *cppstart; + unsigned char *cppptr; + + TmpDatEntryPtr k1; + TmpDatEntryPtr k2; + + int ky; + float value; + + int windowsz = kernel->y_count; + int kerntail = kernel->x_count - kernel->center_x - 1; + + srcbytes = window[center]->UdpL_PxlStride >> 3; + dstbytes = dst->UdpL_PxlStride >> 3; + + dststart = dst->UdpA_Base + (dst->UdpL_Pos >> 3) + + (x1 - dst->UdpL_X1) * dstbytes; + cppstart = cpp->UdpA_Base + (cpp->UdpL_Pos >> 3); + + /* Initialize the destination scanline with the first candidate for the + * minimum value, the value corresponding to the upper left corner of the + * kernel. + */ + dstptr = dststart; + k2 = kernel->array; /* 1st value in first row of kernel */ + + curudp = window[Circ_(center - kernel->center_y, windowsz)]; + curptr = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + ((x1 - kernel->center_x) - curudp->UdpL_X1) * srcbytes; + cppptr = cppstart; + srcptr = window[center]->UdpA_Base + + (window[center]->UdpL_Pos >> 3) + + (x1 - window[center]->UdpL_X1) * srcbytes; + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3); + + while (curptr < curedge) { + /* The relevant source pixel is off the left edge of the image */ + *(float *)dstptr = k2->value + 0.0; + curptr += srcbytes; + dstptr += dstbytes; + cppptr++; + srcptr += srcbytes; + } + + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x2 - curudp->UdpL_X1) * srcbytes; + while (curptr < curedge) { + if (*cppptr) + *(float *)dstptr = k2->value + *(float *)curptr; + else + *(float *)dstptr = *(float *)srcptr; + curptr += srcbytes; + dstptr += dstbytes; + cppptr++; + srcptr += srcbytes; + } + + /* + * Now calculate the rest, saving the minimum. + */ + k1 = kernel->array; + + for (ky = -kernel->center_y; ky < windowsz - kernel->center_y; ky++) { + curudp = window[Circ_(center + ky, windowsz)]; + dstptr = dststart; + cppptr = cppstart; + + curstart = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x1 - kernel->center_x - curudp->UdpL_X1) * srcbytes; + + /* Do the region where pixels outside the left edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3); + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + if (*cppptr) { + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr < curedge) + value = k2->value + 0.0; + else + value = *(float *)curptr + k2->value; + if (value > *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + } + curstart += srcbytes; + dstptr += dstbytes; + cppptr++; + } + + /* Do the pixels where the kernel totally overlaps the image */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (Min_(x2, curudp->UdpL_X2-kerntail) - kernel->center_x + - curudp->UdpL_X1) * srcbytes; + while (curstart <= curedge) { + k2 = k1; + curptr = curstart - srcbytes; + if (*cppptr) { + while (k2->increment != 0) { + curptr += k2->increment; + value = *(float *)curptr + k2->value; + if (value > *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + } + curstart += srcbytes; + dstptr += dstbytes; + cppptr++; + } + + /* Do the region where pixels outside the right edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x2 - curudp->UdpL_X1) * srcbytes; + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + if (*cppptr) { + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr <= curedge) + value = *(float *)curptr + k2->value; + else + value = k2->value + 0.0; + if (value > *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + } + curstart += srcbytes; + dstptr += dstbytes; + cppptr++; + } + + k1 += (kernel->x_count+1); + } +} /* end AreaAddMaxCpp */ + +static void AreaAddSumCpp(window, center, kernel, dst, cpp, x1, x2) +UdpPtr window[]; +int center; +TmpDatPtr kernel; +UdpPtr dst; +UdpPtr cpp; +long int x1; +long int x2; +{ + long int pixel; + + unsigned char *dststart; + unsigned char *dstptr; + int dstbytes; + int srcbytes; + + UdpPtr curudp; + unsigned char *curstart; + unsigned char *curptr; + unsigned char *curedge; + unsigned char *srcptr; + + unsigned char *cppstart; + unsigned char *cppptr; + + TmpDatEntryPtr k1; + TmpDatEntryPtr k2; + + int ky; + + int windowsz = kernel->y_count; + int kerntail = kernel->x_count - kernel->center_x - 1; + + srcbytes = window[center]->UdpL_PxlStride >> 3; + dstbytes = dst->UdpL_PxlStride >> 3; + + dststart = dst->UdpA_Base + (dst->UdpL_Pos >> 3) + + (x1 - dst->UdpL_X1) * dstbytes; + cppstart = cpp->UdpA_Base + (cpp->UdpL_Pos >> 3); + + /* Zero the destination scanline so we can accumulate into it. + * Copy the source data to those points not selected by the CPP */ + dstptr = dststart; + cppptr = cppstart; + srcptr = window[center]->UdpA_Base + + (window[center]->UdpL_Pos >> 3) + + (x1 - window[center]->UdpL_X1) * srcbytes; + + for (pixel = x1; pixel <= x2; pixel++) { + *(float *)dstptr = (*cppptr) ? 0.0 + : *(float *)srcptr; + dstptr+=dstbytes; + srcptr+=srcbytes; + cppptr++; + } + + /* + * Calculate the summation. + */ + k1 = kernel->array; + + for (ky = -kernel->center_y; ky < windowsz - kernel->center_y; ky++) { + curudp = window[Circ_(center + ky, windowsz)]; + dstptr = dststart; + cppptr = cppstart; + + curstart = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x1 - kernel->center_x - curudp->UdpL_X1) * srcbytes; + + /* Do the region where pixels outside the left edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3); + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + if (*cppptr) { + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr < curedge) + *(float *)dstptr += (k2->value + 0.0); + else + *(float *)dstptr += (*(float *)curptr + k2->value); + k2++; + } + } + curstart += srcbytes; + dstptr += dstbytes; + cppptr++; + } + + /* Do the pixels where the kernel totally overlaps the image */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (Min_(x2, curudp->UdpL_X2-kerntail) - kernel->center_x + - curudp->UdpL_X1) * srcbytes; + while (curstart <= curedge) { + k2 = k1; + curptr = curstart - srcbytes; + if (*cppptr) { + while (k2->increment != 0) { + curptr += k2->increment; + *(float *)dstptr += (*(float *)curptr + k2->value); + k2++; + } + } + curstart += srcbytes; + dstptr += dstbytes; + cppptr++; + } + + /* Do the region where pixels outside the right edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x2 - curudp->UdpL_X1) * srcbytes; + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + if (*cppptr) { + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr <= curedge) + *(float *)dstptr += (*(float *)curptr + k2->value); + else + *(float *)dstptr += (k2->value + 0.0); + k2++; + } + } + curstart += srcbytes; + dstptr += dstbytes; + cppptr++; + } + + k1 += (kernel->x_count+1); + } + +} /* end AreaAddSumCpp */ + +static void AreaMultMinCpp(window, center, kernel, dst, cpp, x1, x2) +UdpPtr window[]; +int center; +TmpDatPtr kernel; +UdpPtr dst; +UdpPtr cpp; +long int x1; +long int x2; +{ + unsigned char *dststart; + unsigned char *dstptr; + int dstbytes; + int srcbytes; + + UdpPtr curudp; + unsigned char *curstart; + unsigned char *curptr; + unsigned char *curedge; + unsigned char *srcptr; + + unsigned char *cppstart; + unsigned char *cppptr; + + TmpDatEntryPtr k1; + TmpDatEntryPtr k2; + + int ky; + float value; + + int windowsz = kernel->y_count; + int kerntail = kernel->x_count - kernel->center_x - 1; + + srcbytes = window[center]->UdpL_PxlStride >> 3; + dstbytes = dst->UdpL_PxlStride >> 3; + + dststart = dst->UdpA_Base + (dst->UdpL_Pos >> 3) + + (x1 - dst->UdpL_X1) * dstbytes; + cppstart = cpp->UdpA_Base + (cpp->UdpL_Pos >> 3); + + + /* Initialize the destination scanline with the first candidate for the + * minimum value, the value corresponding to the upper left corner of the + * kernel. + */ + dstptr = dststart; + k2 = kernel->array; /* 1st value in first row of kernel */ + + curudp = window[Circ_(center - kernel->center_y, windowsz)]; + curptr = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + ((x1 - kernel->center_x) - curudp->UdpL_X1) * srcbytes; + cppptr = cppstart; + srcptr = window[center]->UdpA_Base + + (window[center]->UdpL_Pos >> 3) + + (x1 - window[center]->UdpL_X1) * srcbytes; + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3); + + while (curptr < curedge) { + /* The relevant source pixel is off the left edge of the image */ + if (*cppptr) + *(float *)dstptr = k2->value * 0.0; + else + *(float *)dstptr = *(float *)srcptr; + curptr += srcbytes; + dstptr += dstbytes; + cppptr++; + srcptr += srcbytes; + } + + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x2 - curudp->UdpL_X1) * srcbytes; + while (curptr < curedge) { + if (*cppptr) + *(float *)dstptr = k2->value * *(float *)curptr; + else + *(float *)dstptr = *(float *)srcptr; + curptr += srcbytes; + dstptr += dstbytes; + cppptr++; + srcptr += srcbytes; + } + + /* + * Now calculate the rest, saving the minimum. + */ + k1 = kernel->array; + + for (ky = -kernel->center_y; ky < windowsz - kernel->center_y; ky++) { + curudp = window[Circ_(center + ky, windowsz)]; + dstptr = dststart; + cppptr = cppstart; + + curstart = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x1 - kernel->center_x - curudp->UdpL_X1) * srcbytes; + + /* Do the region where pixels outside the left edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3); + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + if (*cppptr) { + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr < curedge) + value = k2->value * 0.0; + else + value = *(float *)curptr * k2->value; + if (value < *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + } + curstart += srcbytes; + dstptr += dstbytes; + cppptr++; + } + + /* Do the pixels where the kernel totally overlaps the image */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (Min_(x2, curudp->UdpL_X2-kerntail) - kernel->center_x + - curudp->UdpL_X1) * srcbytes; + while (curstart <= curedge) { + k2 = k1; + curptr = curstart - srcbytes; + if (*cppptr) { + while (k2->increment != 0) { + curptr += k2->increment; + value = *(float *)curptr * k2->value; + if (value < *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + } + curstart += srcbytes; + dstptr += dstbytes; + cppptr++; + } + + /* Do the region where pixels outside the right edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x2 - curudp->UdpL_X1) * srcbytes; + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + if (*cppptr) { + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr <= curedge) + value = *(float *)curptr * k2->value; + else + value = k2->value * 0.0; + if (value < *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + } + curstart += srcbytes; + dstptr += dstbytes; + cppptr++; + } + + k1 += (kernel->x_count+1); + } + +} /* end AreaMultMinCpp */ + +static void AreaMultMaxCpp(window, center, kernel, dst, cpp, x1, x2) +UdpPtr window[]; +int center; +TmpDatPtr kernel; +UdpPtr dst; +UdpPtr cpp; +long int x1; +long int x2; +{ + unsigned char *dststart; + unsigned char *dstptr; + int dstbytes; + int srcbytes; + + UdpPtr curudp; + unsigned char *curstart; + unsigned char *curptr; + unsigned char *curedge; + unsigned char *srcptr; + + unsigned char *cppstart; + unsigned char *cppptr; + + TmpDatEntryPtr k1; + TmpDatEntryPtr k2; + + int ky; + float value; + + int windowsz = kernel->y_count; + int kerntail = kernel->x_count - kernel->center_x - 1; + + srcbytes = window[center]->UdpL_PxlStride >> 3; + dstbytes = dst->UdpL_PxlStride >> 3; + + dststart = dst->UdpA_Base + (dst->UdpL_Pos >> 3) + + (x1 - dst->UdpL_X1) * dstbytes; + cppstart = cpp->UdpA_Base + (cpp->UdpL_Pos >> 3); + + /* Initialize the destination scanline with the first candidate for the + * minimum value, the value corresponding to the upper left corner of the + * kernel. + */ + dstptr = dststart; + k2 = kernel->array; /* 1st value in first row of kernel */ + + curudp = window[Circ_(center - kernel->center_y, windowsz)]; + curptr = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + ((x1 - kernel->center_x) - curudp->UdpL_X1) * srcbytes; + cppptr = cppstart; + srcptr = window[center]->UdpA_Base + + (window[center]->UdpL_Pos >> 3) + + (x1 - window[center]->UdpL_X1) * srcbytes; + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3); + + while (curptr < curedge) { + /* The relevant source pixel is off the left edge of the image */ + *(float *)dstptr = k2->value * 0.0; + curptr += srcbytes; + dstptr += dstbytes; + cppptr++; + srcptr += srcbytes; + } + + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x2 - curudp->UdpL_X1) * srcbytes; + while (curptr < curedge) { + if (*cppptr) + *(float *)dstptr = k2->value * *(float *)curptr; + else + *(float *)dstptr = *(float *)srcptr; + curptr += srcbytes; + dstptr += dstbytes; + cppptr++; + srcptr += srcbytes; + } + + /* + * Now calculate the rest, saving the minimum. + */ + k1 = kernel->array; + + for (ky = -kernel->center_y; ky < windowsz - kernel->center_y; ky++) { + curudp = window[Circ_(center + ky, windowsz)]; + dstptr = dststart; + cppptr = cppstart; + + curstart = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x1 - kernel->center_x - curudp->UdpL_X1) * srcbytes; + + /* Do the region where pixels outside the left edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3); + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + if (*cppptr) { + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr < curedge) + value = k2->value * 0.0; + else + value = *(float *)curptr * k2->value; + if (value > *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + } + curstart += srcbytes; + dstptr += dstbytes; + cppptr++; + } + + /* Do the pixels where the kernel totally overlaps the image */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (Min_(x2, curudp->UdpL_X2-kerntail) - kernel->center_x + - curudp->UdpL_X1) * srcbytes; + while (curstart <= curedge) { + k2 = k1; + curptr = curstart - srcbytes; + if (*cppptr) { + while (k2->increment != 0) { + curptr += k2->increment; + value = *(float *)curptr * k2->value; + if (value > *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + } + curstart += srcbytes; + dstptr += dstbytes; + cppptr++; + } + + /* Do the region where pixels outside the right edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x2 - curudp->UdpL_X1) * srcbytes; + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + if (*cppptr) { + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr <= curedge) + value = *(float *)curptr * k2->value; + else + value = k2->value * 0.0; + if (value > *(float *)dstptr) + *(float *)dstptr = value; + k2++; + } + } + curstart += srcbytes; + dstptr += dstbytes; + cppptr++; + } + + k1 += (kernel->x_count+1); + } +} /* end AreaMultMaxCpp */ + +static void AreaMultSumCpp(window, center, kernel, dst, cpp, x1, x2) +UdpPtr window[]; +int center; +TmpDatPtr kernel; +UdpPtr dst; +UdpPtr cpp; +long int x1; +long int x2; +{ + long int pixel; + + unsigned char *dststart; + unsigned char *dstptr; + int dstbytes; + int srcbytes; + + UdpPtr curudp; + unsigned char *curstart; + unsigned char *curptr; + unsigned char *curedge; + unsigned char *srcptr; + + unsigned char *cppstart; + unsigned char *cppptr; + + TmpDatEntryPtr k1; + TmpDatEntryPtr k2; + + int ky; + + int windowsz = kernel->y_count; + int kerntail = kernel->x_count - kernel->center_x - 1; + + srcbytes = window[center]->UdpL_PxlStride >> 3; + dstbytes = dst->UdpL_PxlStride >> 3; + + dststart = dst->UdpA_Base + (dst->UdpL_Pos >> 3) + + (x1 - dst->UdpL_X1) * dstbytes; + cppstart = cpp->UdpA_Base + (cpp->UdpL_Pos >> 3); + + /* Zero the destination scanline so we can accumulate into it. + * Copy the source data to those points not selected by the CPP */ + cppptr = cppstart; + dstptr = dststart; + srcptr = window[center]->UdpA_Base + + (window[center]->UdpL_Pos >> 3) + + (x1 - window[center]->UdpL_X1) * srcbytes; + + for (pixel = x1; pixel <= x2; pixel++) { + *(float *)dstptr = (*cppptr) ? 0.0 + : *(float *)srcptr; + dstptr+=dstbytes; + srcptr+=srcbytes; + cppptr++; + } + + /* + * Calculate the summation. + */ + k1 = kernel->array; + + for (ky = -kernel->center_y; ky < windowsz - kernel->center_y; ky++) { + curudp = window[Circ_(center + ky, windowsz)]; + dstptr = dststart; + cppptr = cppstart; + + curstart = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x1 - kernel->center_x - curudp->UdpL_X1) * srcbytes; + + /* Do the region where pixels outside the left edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3); + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + if (*cppptr) { + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr < curedge) + *(float *)dstptr += (k2->value * 0.0); + else + *(float *)dstptr += (*(float *)curptr * k2->value); + k2++; + } + } + curstart += srcbytes; + dstptr += dstbytes; + cppptr++; + } + + /* Do the pixels where the kernel totally overlaps the image */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (Min_(x2, curudp->UdpL_X2-kerntail) - kernel->center_x + - curudp->UdpL_X1) * srcbytes; + while (curstart <= curedge) { + k2 = k1; + curptr = curstart - srcbytes; + if (*cppptr) { + while (k2->increment != 0) { + curptr += k2->increment; + *(float *)dstptr += (*(float *)curptr * k2->value); + k2++; + } + } + curstart += srcbytes; + dstptr += dstbytes; + cppptr++; + } + + /* Do the region where pixels outside the right edge of the + * image are needed */ + curedge = curudp->UdpA_Base + (curudp->UdpL_Pos >> 3) + + (x2 - curudp->UdpL_X1) * srcbytes; + while (curstart < curedge) { + k2 = k1; + curptr = curstart - srcbytes; + if (*cppptr) { + while (k2->increment != 0) { + curptr += k2->increment; + if (curptr <= curedge) + *(float *)dstptr += (*(float *)curptr * k2->value); + else + *(float *)dstptr += (k2->value * 0.0); + k2++; + } + } + curstart += srcbytes; + dstptr += dstbytes; + cppptr++; + } + + k1 += (kernel->x_count+1); + } +} /* end AreaMultSumCpp */ + +/***************************************************************************** +** AreaGetTempUdp +** +** FUNCTIONAL DESCRIPTION: +** +** Create a UDP which can be used to hold one scanline of the +** source UDP, but using float data. If the source UDP is already +* in float format, just point to its data. +** +** FORMAL PARAMETERS: +** +** src - Pointer to source UDP +** +** FUNCTION VALUE: +** +** Returns a pointer to a UDP describing floating point data. +** +*****************************************************************************/ +static UdpPtr AreaGetTempUdp(src) + UdpPtr src; +{ + UdpPtr dst; + + dst = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( dst == NULL ) return( (UdpPtr) dst ); + + *dst = *src; + dst->UdpL_Y2 = src->UdpL_Y1; + dst->UdpL_ScnCnt = 1; + + if( src->UdpB_DType != UdpK_DTypeF ) + { + dst->UdpW_PixelLength = sizeof(float) * 8; + dst->UdpB_DType = UdpK_DTypeF; + dst->UdpB_Class = UdpK_ClassA; + dst->UdpL_PxlStride = dst->UdpW_PixelLength; + dst->UdpL_ScnStride = dst->UdpL_PxlPerScn * dst->UdpL_PxlStride; + dst->UdpL_ArSize = dst->UdpL_ScnStride; + dst->UdpL_Pos = 0; + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + { + DdxFree_(dst); + return( (UdpPtr) BadAlloc ); + } + } + return( dst ); +} /* end AreaGetTempUdp */ + +/***************************************************************************** +** AreaDestroyTempUdp +** +** FUNCTIONAL DESCRIPTION: +** +** Free a UDP created by AreGetTempUdp. +** +** FORMAL PARAMETERS: +** +** udp - Pointer to the udp to free. +** realudp - Pointer to a udp which might actually own the storage +** pointed to by udp. +** +*****************************************************************************/ +static void AreaDestroyTempUdp( udp, realudp ) +UdpPtr udp; +UdpPtr realudp; + +{ + if( IsPointer_(udp) ) + { + if( IsPointer_(udp->UdpA_Base) && udp->UdpA_Base != realudp->UdpA_Base ) + DdxFreeBits_( udp->UdpA_Base ); + DdxFree_( udp ); + } +} /* end AreaDestroyTempUdp */ + +/***************************************************************************** +** AreaConvertScanline +** +** FUNCTIONAL DESCRIPTION: +** +** Adjust a UDP to point to the specified scanline of the source +** UDP. If the source UDP is not of type float, convert the +** data and leave it associated with the adjusted UDP. +** +** FORMAL PARAMETERS: +** +** src - Pointer to the source UDP. +** srcy1 - Beginning scanline index of entire source image. +** srcy2 - Ending scanline index of entire source image. +** scanline - The scanline being processed. +** dst - Pointer to the UDP to be adjusted. +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int AreaConvertScanline(src, srcy1, srcy2, scanline, dst) + UdpPtr src; + long int srcy1, srcy2; + long int scanline; + UdpPtr dst; +{ + int status = Success; + + dst->UdpL_Y1 = dst->UdpL_Y2 = scanline; + + if( src->UdpB_DType != UdpK_DTypeF ) + if( scanline < srcy1 || scanline > srcy2 ) + { + /* Supply a zero "image" outside of the image boundaries */ + dst->UdpL_Y1 = dst->UdpL_Y2 = 0; + status = DdxFillRegion_( dst, 0, 0, src->UdpL_PxlPerScn, 1, 0 ); + dst->UdpL_Y1 = dst->UdpL_Y2 = scanline; + } + else + status = DdxConvert_( src, dst, XieK_MoveMode ); + + else + /* This UDP normally points to the input data. If we need to + * supply a scanline of "zero" image, we have to swap to a + * temporary buffer. + */ + if( scanline < srcy1 || scanline > srcy2 ) + { + /* Supply a zero "image" outside of the image boundaries */ + if (dst->UdpA_Base == src->UdpA_Base) + dst->UdpA_Base = 0; /* Let DdxFill_ give us a temp buffer */ + dst->UdpL_Y1 = dst->UdpL_Y2 = 0; + status = DdxFillRegion_( dst, 0, 0, src->UdpL_PxlPerScn, 1, 0 ); + dst->UdpL_Y1 = dst->UdpL_Y2 = scanline; + } + else + { + if( dst->UdpA_Base != src->UdpA_Base ) + { + DdxFreeBits_(dst->UdpA_Base); + dst->UdpA_Base = src->UdpA_Base; + } + dst->UdpL_Pos = src->UdpL_Pos + scanline * src->UdpL_ScnStride; + } + return( status ); +} /* end AreaConvertScanline */ + +/***************************************************************************** +** AreaStoreScanline +** +** FUNCTIONAL DESCRIPTION: +** +** Store a scanline of data into the destination UDP. +** If the scanline UDP already points into the destination UDP, +** just adjust the scanline UDP to point past the scanline already +** stored. If not, copy (and possibly convert) the data into the +** destination. +** +** FORMAL PARAMETERS: +** +** dst - Pointer to scanline UDP +** scanline - The scanline number +** realdst - Pointer to the destination UDP +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int AreaStoreScanline(dst, scanline, realdst) + UdpPtr dst; + long int scanline; + UdpPtr realdst; +{ + int status = Success; + + if( dst->UdpA_Base != realdst->UdpA_Base ) + { + status = DdxConvert_( dst, realdst, XieK_MoveMode ); + dst->UdpL_Y1++; + dst->UdpL_Y2++; + } + else + dst->UdpL_Pos = realdst->UdpL_Pos+(scanline+1)*realdst->UdpL_ScnStride; + + return( status ); +} /* end AreaStoreScanline */ + +/***************************************************************************** +** AreaGetCppUdp +** +** FUNCTIONAL DESCRIPTION: +** +** Create a UDP which can be used to hold one scanline of the +** CPP, but using byte data. +** +** FORMAL PARAMETERS: +** +** inudp - Pointer to source UDP +** +** FUNCTION VALUE: +** +** Returns a pointer to a UDP describing byte data. +** +*****************************************************************************/ +static UdpPtr AreaGetCppUdp( src ) + UdpPtr src; +{ + UdpPtr dst; + + dst = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( dst == NULL ) return( (UdpPtr) BadAlloc ); + + *dst = *src; + dst->UdpW_PixelLength = 8; + dst->UdpB_DType = UdpK_DTypeBU; + dst->UdpB_Class = UdpK_ClassA; + dst->UdpL_ScnCnt = 1; + dst->UdpL_PxlStride = dst->UdpW_PixelLength; + dst->UdpL_ScnStride = dst->UdpL_PxlStride * dst->UdpL_PxlPerScn; + dst->UdpL_ArSize = dst->UdpL_ScnStride * dst->UdpL_ScnCnt; + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + { + DdxFree_(dst); + return( (UdpPtr) BadAlloc ); + } + dst->UdpL_Pos = 0; + dst->UdpL_CompIdx = 0; + dst->UdpL_Levels = 2; + + return( dst ); +} /* end AreaGetCppUdp */ + +/***************************************************************************** +** AreaConvertCppLine +** +** FUNCTIONAL DESCRIPTION: +** +** Adjust a UDP to point to the specified scanline of the source +** CPP UDP. Convert the CPP's bit data to bytes for more +** efficient access. +** +** FORMAL PARAMETERS: +** +** src - Pointer to the source UDP. +** scanline - The scanline being processed. +** dst - Pointer to the UDP to be adjusted. +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int AreaConvertCppLine(src, scanline, dst) + UdpPtr src; + long int scanline; + UdpPtr dst; +{ + dst->UdpL_Y1 = dst->UdpL_Y2 = scanline; + return( DdxConvert_( src, dst, XieK_MoveMode ) ); +} /* end AreaConvertCppLine */ + +/***************************************************************************** +** AreaDeallocData +** +** FUNCTIONAL DESCRIPTION: +** +** Deallocate a data segment queued in the window. +** +** FORMAL PARAMETERS: +** +** ctx - Area pipeline context +** comp - Component index +** idx - Index in the window of the data segment. +** +*****************************************************************************/ +static void AreaDeallocData (ctx, comp, idx) + AreaPipeCtxPtr ctx; + int comp; + int idx; +{ + UdpPtr *window = AreaWindow_(ctx,comp); + PipeDataPtr *dwindow = AreaDWindow_(ctx,comp); + + if( IsPointer_(dwindow[idx]) ) + { + /* Window must contain the UDP from the data segment */ + window[idx] = NULL; + dwindow[idx] = DdxRmDeallocData_( dwindow[idx] ); + } + + if( IsPointer_(window[idx]) ) + { + AreaDestroyTempUdp( window[idx], SnkUdpPtr_(AreaSrcSnk_(ctx),comp) ); + window[idx] = NULL; + } +} + +/***************************************************************************** +** AreaReleaseData +** +** FUNCTIONAL DESCRIPTION: +** +** Remove a data segment queued in the window and send it to the +** next pipeline stage. +** +** FORMAL PARAMETERS: +** +** ctx - Area pipeline context +** comp - Component index +** idx - Index in the window of the data segment. +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int AreaReleaseData (ctx, comp, idx) + AreaPipeCtxPtr ctx; + int comp; + int idx; +{ + int status = Success; + UdpPtr *window = AreaWindow_(ctx,comp); + PipeDataPtr *dwindow = AreaDWindow_(ctx,comp); + + if( IsPointer_(dwindow[idx]) ) + { + /* Window must contain the UDP from the data segment */ + window[idx] = NULL; + status = DdxRmPutData_( AreaDstSnk_(ctx), dwindow[idx] ); + dwindow[idx] = NULL; + } + return( status ); +} + +/***************************************************************************** +** AreaAdjustKernel +** +** FUNCTIONAL DESCRIPTION: +** +** Allocate and initialize a copy of the supplied kernel, +** adjusting the increment fields to match the current +** source image. +** +** FORMAL PARAMETERS: +** +** in - source template data +** pxlbytes - number of bytes to increment by one pixel. +** out - destination for pointer to the new template data. +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int AreaAdjustKernel (in, pxlbytes, out) + TmpDatPtr in; + long int pxlbytes; + TmpDatPtr *out; +{ + TmpDatPtr new; + TmpDatEntryPtr src, dst, srow, drow; + int i; + + /* Allocate a structure and copy */ + new = (TmpDatPtr) DdxMalloc_( sizeof(TmpDatRec) ); + if( new == NULL ) return( BadAlloc ); + *new = *in; + + /* Allocate the data array */ + new->array = (TmpDatEntryPtr) + DdxMalloc_(in->y_count*(in->x_count+1)*sizeof(TmpDatEntryRec)); + if( new->array == NULL ) + { + DdxFree_(new); + return( BadAlloc ); + } + /* Copy and adjust the data */ + srow = in->array; + drow = new->array; + for( i = 0; i < in->y_count; i++ ) + { + src = srow; + dst = drow; + do { + dst->value = src->value; + dst->increment = src->increment * pxlbytes; + dst++; + } while( (src++)->increment != 0 ); + srow += in->x_count+1; + drow += in->x_count+1; + } + *out = new; + + return( Success ); +} /* end AreaAdjustKernel */ + +/***************************************************************************** +** AreaDestroyKernel +** +** FUNCTIONAL DESCRIPTION: +** +** Deallocate a template data structure create by AreaAdjustKernel. +** +** FORMAL PARAMETERS: +** +** in - source Template Idc +** +*****************************************************************************/ +static void AreaDestroyKernel(in) +TmpDatPtr in; +{ + int i; + + if( IsPointer_(in) ) + { + if( IsPointer_(in->array) ) + DdxFree_(in->array); + DdxFree_(in); + } +} /* end AreaDestroyKernel */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiArea.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiArea.h new file mode 100644 index 0000000..c71bb63 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiArea.h @@ -0,0 +1,156 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the AREA pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.0 +** RISC ULTRIX V3.0 +** +** AUTHOR(S): +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Fri Jun 1 14:09:11 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMIAREA +#define _SMIAREA + +/* +** Include files +*/ +#include + +/* +** Function reference +*/ +int SmiArea(); +int SmiCreateArea(); + + +/* +** Structure definitions and Typedefs +*/ + +/* +** Area pipeline context block. +*/ +typedef struct _AreaPipeCtx { + PipeElementCommonPart common; + struct _AreaPart { + PipeSinkPtr srcsnk; + PipeSinkPtr dstsnk; + PipeDrainPtr srcdrn; + TmpDatPtr kernel; + UdpPtr *window[XieK_MaxComponents]; + PipeDataPtr *dwindow[XieK_MaxComponents]; + int window_next[XieK_MaxComponents]; + int window_center[XieK_MaxComponents]; + UdpPtr idc; + UdpPtr cpp; /* Converted CPP */ + long int X1; + long int X2; + long int Y1; + long int Y2; + int opidx; + } AreaPart; +} AreaPipeCtx, *AreaPipeCtxPtr; + +/* +** MACRO definitions +*/ + +/* +** Pipeline context, Area part, access MACROs +*/ +#define AreaSrcSnk_(ctx) \ + (((AreaPipeCtxPtr)(ctx))->AreaPart.srcsnk) + +#define AreaDstSnk_(ctx) (((AreaPipeCtxPtr)(ctx))->AreaPart.dstsnk) + +#define AreaSrcDrn_(ctx) \ + (((AreaPipeCtxPtr)(ctx))->AreaPart.srcdrn) +#define AreaKernel_(ctx) \ + (((AreaPipeCtxPtr)(ctx))->AreaPart.kernel) +#define AreaWindow_(ctx,comp) \ + (((AreaPipeCtxPtr)(ctx))->AreaPart.window[comp]) +#define AreaDWindow_(ctx,comp) \ + (((AreaPipeCtxPtr)(ctx))->AreaPart.dwindow[comp]) +#define AreaWindowNxt_(ctx,comp) \ + (((AreaPipeCtxPtr)(ctx))->AreaPart.window_next[comp]) +#define AreaWindowCtr_(ctx,comp) \ + (((AreaPipeCtxPtr)(ctx))->AreaPart.window_center[comp]) +#define AreaIdc_(ctx) (((AreaPipeCtxPtr)(ctx))->AreaPart.idc) +#define AreaCpp_(ctx) (((AreaPipeCtxPtr)(ctx))->AreaPart.cpp) +#define AreaRoiX1_(ctx) (((AreaPipeCtxPtr)(ctx))->AreaPart.X1) +#define AreaRoiX2_(ctx) (((AreaPipeCtxPtr)(ctx))->AreaPart.X2) +#define AreaRoiY1_(ctx) (((AreaPipeCtxPtr)(ctx))->AreaPart.Y1) +#define AreaRoiY2_(ctx) (((AreaPipeCtxPtr)(ctx))->AreaPart.Y2) +#define AreaOpIdx_(ctx) \ + (((AreaPipeCtxPtr)(ctx))->AreaPart.opidx) + +#endif +/* _SMIAREA */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiArithmetic.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiArithmetic.c new file mode 100644 index 0000000..6ed6b22 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiArithmetic.c @@ -0,0 +1,1732 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module implements the arithmetic operator which performs +** arithmetic functions between two photomaps. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHORS: +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Fri Apr 20 15:55:27 1990 +** +*******************************************************************************/ + +#include +#include +#include + +#include "SmiArithmetic.h" + +/* +** Table of contents +*/ +int SmiArithmetic(); +int SmiCreateArithmetic(); + +static int _ArithmeticInitialize(); +static int _ArithmeticActivate(); +static int _ArithmeticFlush(); +static int _ArithmeticAbort(); +static int _ArithmeticDestroy(); + +static void ArithmeticException(); +static UdpPtr ArithmeticGetTempUdp(); +static void ArithmeticDestroyTempUdp(); +static int ArithmeticConvertScanline(); +static int ArithmeticStoreScanline(); + +static int ArithmeticAddII(); +static int ArithmeticAddIC(); +static int ArithmeticSubII(); +static int ArithmeticSubIC(); +static int ArithmeticSubCI(); +static int ArithmeticMulII(); +static int ArithmeticMulIC(); +static int ArithmeticDivII(); +static int ArithmeticDivIC(); +static int ArithmeticDivCI(); +static int ArithmeticMinII(); +static int ArithmeticMinIC(); +static int ArithmeticMaxII(); +static int ArithmeticMaxIC(); + +/* +** Equated Symbols +*/ + +/* +** Alpha/VMS and VXT don't currently support sigvec/setjmp/longjmp, +** and require explicit testing of every pixel value. Otherwise, +** use exception handling to catch any bad values. +*/ +#if (!defined(ALPHA) && !defined(_ALPHA) && !defined(VXT) || !(defined(VMS))) +#define XIE_USE_EXCEPTION_HANDLING +#endif + +/* +** External References +*/ + +/* + * Macros + */ +#define Min_(a,b) ((a) <= (b) ? (a) : (b)) +#define Max_(a,b) ((a) > (b) ? (a) : (b)) + +#if defined(XIE_USE_EXCEPTION_HANDLING) +#define HandleFPE_( tvec, rtn, ovec ) \ + ( tvec.sv_handler = rtn, tvec.sv_mask=0, tvec.sv_onstack=0, \ + sigvec( SIGFPE, &tvec, &ovec) ) + +#define UnhandleFPE_( ovec ) \ + ( sigvec( SIGFPE, &ovec, NULL ) ) + +/* +** Local storage +*/ +static jmp_buf exception_buf; + +#endif + + /* + ** Arithmetic Element Vector + */ +static PipeElementVector ArithmeticPipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeArithmeticElement, /* Structure subtype */ + sizeof(ArithmeticPipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _ArithmeticInitialize, /* Initialize entry */ + _ArithmeticActivate, /* Activate entry */ + _ArithmeticFlush, /* Flush entry */ + _ArithmeticDestroy, /* Destroy entry */ + _ArithmeticAbort /* Abort entry */ + }; + +/* Dispatch table to select the correct operation routine */ +/* This must match the ordering of the XieK_xxxx constants in XieAppl.h */ +static int (*ArithmeticOpTable[])() = { + NULL, /* Constants start at 1 */ + ArithmeticAddII, + ArithmeticAddIC, + ArithmeticSubII, + ArithmeticSubIC, + ArithmeticSubCI, + ArithmeticMulII, + ArithmeticMulIC, + ArithmeticDivII, + ArithmeticDivIC, + ArithmeticDivCI, + ArithmeticMinII, + ArithmeticMinIC, + ArithmeticMaxII, + ArithmeticMaxIC + }; + +/***************************************************************************** +** SmiCreateArithmetic +** +** FUNCTIONAL DESCRIPTION: +** +** This function fills in a newly created context for a ARITHMETIC +** pipeline element. +** +** FORMAL PARAMETERS: +** +** pipe - Descriptor for pipe being built.. +** srcsnk1 - Pointer to first source sink +** srcsnk2 - Pointer to second source sink (NULL if no second source) +** constant- Array of "constant image" values (used when srcsnk2==NULL) +** dstsnk - Pointer to destination sink +** idc - Pointer to UDP describing the ROI or CPP (NULL if no IDC) +** operator- Arithmetic operation function code. +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCreateArithmetic(pipe,srcsnk1,srcsnk2,constant, + dstsnk, idc, operator) +Pipe pipe; +PipeSinkPtr srcsnk1; +PipeSinkPtr srcsnk2; +unsigned int constant[XieK_MaxComponents]; +PipeSinkPtr dstsnk; +UdpPtr idc; +int operator; + +{ + int i; + ArithmeticPipeCtxPtr ctx = (ArithmeticPipeCtxPtr) + DdxCreatePipeCtx_(pipe, &ArithmeticPipeElement, FALSE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + /* + ** Copy parameters + */ + AriSrcSnk1_(ctx) = srcsnk1; + AriSrcSnk2_(ctx) = srcsnk2; + AriDstSnk_(ctx) = dstsnk; + AriFunc_(ctx) = ArithmeticOpTable[operator]; + + if (srcsnk2 == NULL) { /* Using a constant "image" */ + for (i = 0; i < XieK_MaxComponents; i++){ + if (SnkUdpPtr_(srcsnk1,i) == NULL) + break; + AriFConst_(ctx,i) = (float)constant[i]; + } + } + + AriCpp_(ctx) = (idc != NULL && idc->UdpA_Base != NULL) ? + idc : /* It's a CPP */ + NULL; + + /* Calculate the bounds of the region that will actually be processed */ + if (srcsnk2 == NULL) { + AriRoiX1_(ctx) = SnkX1_(srcsnk1,0); + AriRoiX2_(ctx) = SnkX2_(srcsnk1,0); + AriRoiY1_(ctx) = SnkY1_(srcsnk1,0); + AriRoiY2_(ctx) = SnkY2_(srcsnk1,0); + } else { + /* Intersection of two source operands */ + AriRoiX1_(ctx) = SnkX1_(srcsnk2,0) > SnkX1_(srcsnk1,0) ? + SnkX1_(srcsnk2,0) : SnkX1_(srcsnk1,0); + AriRoiX2_(ctx) = SnkX2_(srcsnk2,0) < SnkX2_(srcsnk1,0) ? + SnkX2_(srcsnk2,0) : SnkX2_(srcsnk1,0); + AriRoiY1_(ctx) = SnkY1_(srcsnk2,0) > SnkY1_(srcsnk1,0) ? + SnkY1_(srcsnk2,0) : SnkY1_(srcsnk1,0); + AriRoiY2_(ctx) = SnkY2_(srcsnk2,0) < SnkY2_(srcsnk1,0) ? + SnkY2_(srcsnk2,0) : SnkY2_(srcsnk1,0); + } + + if (idc != NULL) { + /* Further restrict the area to be processed with the CPP/ROI */ + AriRoiX1_(ctx) = idc->UdpL_X1 > AriRoiX1_(ctx) ? idc->UdpL_X1 + : AriRoiX1_(ctx); + AriRoiX2_(ctx) = idc->UdpL_X2 < AriRoiX2_(ctx) ? idc->UdpL_X2 + : AriRoiX2_(ctx); + AriRoiY1_(ctx) = idc->UdpL_Y1 > AriRoiY1_(ctx) ? idc->UdpL_Y1 + : AriRoiY1_(ctx); + AriRoiY2_(ctx) = idc->UdpL_Y2 < AriRoiY2_(ctx) ? idc->UdpL_Y2 + : AriRoiY2_(ctx); + } + + AriSrcData1_(ctx) = NULL; + AriSrcData2_(ctx) = NULL; + + /* Create drains on the sink(s). + * Handle all the data as floats. + * Process a quantum of 1 scanline + */ + AriSrcDrn1_(ctx) = DdxRmCreateDrain_( AriSrcSnk1_(ctx), -1 ); + if( !IsPointer_(AriSrcDrn1_(ctx)) ) return( (int) AriSrcDrn1_(ctx) ); + DdxRmSetDType_( AriSrcDrn1_(ctx), UdpK_DTypeF, DtM_F ); + DdxRmSetQuantum_( AriSrcDrn1_(ctx), 1 ); + + if (srcsnk2 != NULL) { + AriSrcDrn2_(ctx) = DdxRmCreateDrain_( AriSrcSnk2_(ctx), -1 ); + if( !IsPointer_(AriSrcDrn2_(ctx)) ) return( (int) AriSrcDrn2_(ctx) ); + DdxRmSetDType_( AriSrcDrn2_(ctx), UdpK_DTypeF, DtM_F ); + DdxRmSetQuantum_( AriSrcDrn2_(ctx), 1 ); + } + + DdxRmSetDType_( AriDstSnk_(ctx), UdpK_DTypeF, DtM_F ); + DdxRmSetQuantum_( AriDstSnk_(ctx), 1 ); + + return( Success ); +} /* end SmiCreateArithmetic */ + +/***************************************************************************** +** _ArithmeticInitialize +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the ARITHMETIC pipeline element prior to +** activation. +** +** FORMAL PARAMETERS: +** +** ctx - arithmetic pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ArithmeticInitialize(ctx) +ArithmeticPipeCtxPtr ctx; +{ + int status = DdxRmInitializePort_( CtxHead_(ctx), AriSrcDrn1_(ctx) ); + + if( status == Success && AriSrcSnk2_(ctx) != NULL ) + status = DdxRmInitializePort_( CtxHead_(ctx), AriSrcDrn2_(ctx) ); + + if( status == Success ) + status = DdxRmInitializePort_( CtxHead_(ctx), AriDstSnk_(ctx) ); + + /* Start reading from the first drain */ + CtxInp_(ctx) = AriSrcDrn1_(ctx); + + return( status ); +} + +/***************************************************************************** +** _ArithmeticActivate +** +** FUNCTIONAL DESCRIPTION: +** +** This routine reads the data from the source drain(s) and +** performs the arithmetic operations. +** +** FORMAL PARAMETERS: +** +** ctx - arithmetic pipeline element context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ArithmeticActivate(ctx) +ArithmeticPipeCtxPtr ctx; +{ + + PipeDataPtr src1 = NULL, src2 = NULL, dst = NULL; + long int status, dstpos; + +#if defined(XIE_USE_EXCEPTION_HANDLING) + struct sigvec tmpvec, oldvec; + + + /* + * Establish error handling to catch possible division by zero, etc. + */ + HandleFPE_(tmpvec, ArithmeticException, oldvec); + if (setjmp(exception_buf) != 0) { + + /* On an exception, clean up locally held resources */ + UnhandleFPE_( oldvec ); + if ( src1 != NULL ) DdxRmDeallocData_(src1); + if ( src2 != NULL ) DdxRmDeallocData_(src2); + if ( dst != NULL ) DdxRmDeallocData_(dst); + return( BadValue ); + } +#endif + + + if( AriSrcSnk2_(ctx) == NULL ) + { + /* Operating between one image and a constant */ + for(status = Success; status == Success; src1 = DdxRmDeallocData_(src1), + dst = DdxRmDeallocData_(dst)) + { + src1 = DdxRmGetData_( ctx, AriSrcDrn1_(ctx) ); + if( !IsPointer_(src1) ) return( (int) src1 ); + + if( DatY1_(src1) < AriRoiY1_(ctx) || DatY1_(src1) > AriRoiY2_(ctx) ) + { + /* Scanline is outside the ROI - just pass it through */ + status = DdxRmPutData_( AriDstSnk_(ctx), src1 ); + src1 = NULL; + dst = NULL; + continue; + } + dst = DdxRmAllocData_( AriDstSnk_(ctx), DatCmpIdx_(src1), + DatY1_(src1), DatHeight_(src1) ); + status = (int) dst; + if( !IsPointer_(dst) ) continue; + + /* Copy the portions of this line outside the ROI */ + status = DdxCopy_( DatUdpPtr_(src1), /* Left */ + DatUdpPtr_(dst), + DatX1_(src1), 0, + DatX1_(dst), DatY1_(dst), + AriRoiX1_(ctx) - DatX1_(src1), 1 ); + if( status != Success ) continue; + + status = DdxCopy_( DatUdpPtr_(src1), /* Right */ + DatUdpPtr_(dst), + AriRoiX2_(ctx)+1, 0, + AriRoiX2_(ctx)+1, DatY1_(dst), + DatX2_(src1) - AriRoiX2_(ctx), 1 ); + if( status != Success ) continue; + + dstpos = DatPos_(dst); + DatPos_(src1) += (AriRoiX1_(ctx) - DatX1_(src1)) * DatPxlStr_(src1); + DatPos_(dst) += (AriRoiX1_(ctx) - DatX1_(dst)) * DatPxlStr_(dst); + + status = (*AriFunc_(ctx))(DatUdpPtr_(src1), + AriFConst_(ctx,DatCmpIdx_(src1)), + DatUdpPtr_(dst), + AriCpp_(ctx), + AriRoiY1_(ctx), + AriRoiX1_(ctx), + AriRoiX2_(ctx)); + if( status != Success ) continue; + + DatPos_(dst) = dstpos; + status = DdxRmPutData_( AriDstSnk_(ctx), dst ); + dst = NULL; + } + } + + else + { + /* Operating between two images */ + for( status = Success; status == Success; + AriSrcData1_(ctx) = DdxRmDeallocData_(src1), + AriSrcData2_(ctx) = DdxRmDeallocData_(src2), + dst = DdxRmDeallocData_(dst) ) + { + if( AriSrcData1_(ctx) == NULL ) + { + AriSrcData1_(ctx) = DdxRmGetData_( ctx, AriSrcDrn1_(ctx) ); + if( !IsPointer_(AriSrcData1_(ctx)) ) + return( (int) AriSrcData1_(ctx) ); + } + src1 = AriSrcData1_(ctx); + + if( DatY1_(src1) <= AriRoiY2_(ctx) && AriSrcData2_(ctx) == NULL ) + /* Keep the two streams synchronized as long as we still + * need src2 data */ + { + AriSrcData2_(ctx) = DdxRmGetData_( ctx, AriSrcDrn2_(ctx) ); + if( !IsPointer_(AriSrcData2_(ctx)) ) + return( (int) AriSrcData2_(ctx) ); + } + src2 = AriSrcData2_(ctx); + + if( DatY1_(src1) < AriRoiY1_(ctx) || DatY1_(src1) > AriRoiY2_(ctx) ) + { + /* Scanline is outside the ROI - just pass it through */ + status = DdxRmPutData_( AriDstSnk_(ctx), src1 ); + src1 = NULL; + dst = NULL; + continue; + } + dst = DdxRmAllocData_( AriDstSnk_(ctx), DatCmpIdx_(src1), + DatY1_(src1), DatHeight_(src1) ); + status = (int) dst; + if( !IsPointer_(dst) ) continue; + + /* Copy the portions of this line outside the ROI */ + status = DdxCopy_( DatUdpPtr_(src1), /* Left */ + DatUdpPtr_(dst), + DatX1_(src1), 0, + DatX1_(dst), DatY1_(dst), + AriRoiX1_(ctx) - DatX1_(src1), 1 ); + if( status != Success ) continue; + + status = DdxCopy_( DatUdpPtr_(src1), /* Right */ + DatUdpPtr_(dst), + AriRoiX2_(ctx)+1, 0, + AriRoiX2_(ctx)+1, DatY1_(dst), + DatX2_(src1) - AriRoiX2_(ctx), 1 ); + if( status != Success ) continue; + + dstpos = DatPos_(dst); + DatPos_(src1) += (AriRoiX1_(ctx) - DatX1_(src1)) * DatPxlStr_(src1); + DatPos_(src2) += (AriRoiX1_(ctx) - DatX1_(src2)) * DatPxlStr_(src2); + + status = (*AriFunc_(ctx))(DatUdpPtr_(src1), DatUdpPtr_(src2), + DatUdpPtr_(dst), + AriCpp_(ctx), + AriRoiY1_(ctx), + AriRoiX1_(ctx), + AriRoiX2_(ctx)); + if( status != Success ) continue; + + DatPos_(dst) = dstpos; + status = DdxRmPutData_( AriDstSnk_(ctx), dst ); + dst = NULL; + } + } + +#if defined(XIE_USE_EXCEPTION_HANDLING) + UnhandleFPE_( oldvec ); +#endif + + return( status ); +} + +/***************************************************************************** +** _ArithmeticFlush +** +** FUNCTIONAL DESCRIPTION: +** +** This routine is called when all preceding pipeline stages have +** completed. +** +** +** FORMAL PARAMETERS: +** +** ctx - arithmetic pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ArithmeticFlush(ctx) +ArithmeticPipeCtxPtr ctx; +{ + PipeDataPtr src2; + + _ArithmeticAbort(ctx); + + /* If the image on drain 2 has more scanlines that the image on drain 1 + * we will have unprocessed scanlines on drain 2. Flush them. + */ + if( IsPointer_(AriSrcSnk2_(ctx)) ) + while( ( src2 = DdxRmGetData_( ctx, AriSrcDrn2_(ctx) ) ) != NULL ) + { + if( !IsPointer_(src2) ) return( (int) src2 ); + DdxRmDeallocData_(src2); + } + + return( Success ); +} + +/***************************************************************************** +** _ArithmeticAbort +** +** FUNCTIONAL DESCRIPTION: +** +** Called when pipeline is aborted or finished. +** +** FORMAL PARAMETERS: +** +** ctx - arithmetic pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ArithmeticAbort(ctx) +ArithmeticPipeCtxPtr ctx; +{ + if( IsPointer_(AriSrcData1_(ctx)) ) + AriSrcData1_(ctx) = DdxRmDeallocData_( AriSrcData1_(ctx) ); + if( IsPointer_(AriSrcData2_(ctx)) ) + AriSrcData2_(ctx) = DdxRmDeallocData_( AriSrcData2_(ctx) ); + + return( Success ); +} + +/***************************************************************************** +** _ArithmeticDestroy +** +** FUNCTIONAL DESCRIPTION: +** +** This routine deallocates all resources allocated by the ARITHMETIC +** pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - arithmetic pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ArithmeticDestroy(ctx) +ArithmeticPipeCtxPtr ctx; +{ + AriSrcDrn1_(ctx) = DdxRmDestroyDrain_( AriSrcDrn1_(ctx) ); + + if( AriSrcSnk2_(ctx) != NULL ) + AriSrcDrn2_(ctx) = DdxRmDestroyDrain_( AriSrcDrn2_(ctx) ); + + return( Success ); +} + +/***************************************************************************** +** SmiArithmetic +** +** FUNCTIONAL DESCRIPTION: +** +** This routine implements a non-pipelined arithmetic operator, which +** performs an arithmetic operation between two photomaps, or between +** a photomap and a constant. +** +** Note that the destination photomap must be of type float or +** the data will be transformed from unconstrained to a constrained +** type in an undefined manner. +** +** FORMAL PARAMETERS: +** +** srcudp1 - Pointer to a UDP describing the first source operand. +** srcudp2 - Pointer to a UDP describing the second source operand. +** constant- Array of constants supplied if srcudp2 is NULL. +** dstudp - Pointer to a UDP describing the destination buffer. +** idc - Pointer to a UDP describing the Region of Interest, +** or Control Processing Plane. +** (NULL if no IDC) +** operator-Code for the operation being performed. +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiArithmetic( srcudp1, srcudp2, constant, dstudp, idc, operator ) +UdpPtr srcudp1; +UdpPtr srcudp2; +unsigned int constant[]; +UdpPtr dstudp; +UdpPtr idc; +int operator; +{ + UdpPtr cpp, src1 = NULL, src2 = NULL, dst = NULL; + float fconstant; + long int pixels, scanline, status; + long int X1, X2, Y1, Y2; /* src/destination common bounds */ + long int x1, x2, y1, y2; /* src/destination/ROI common bounds */ + +#if defined(XIE_USE_EXCEPTION_HANDLING) + struct sigvec tmpvec, oldvec; + + /* + ** Establish error handling to catch possible division by zero, etc. + */ + HandleFPE_( tmpvec, ArithmeticException, oldvec ); + if( setjmp( exception_buf ) != 0 ) + { + status = BadValue; + goto clean_up; + } +#endif + /* + ** Allocate the destination image array + */ + if( dstudp->UdpA_Base == NULL ) + { + dstudp->UdpA_Base = DdxMallocBits_( dstudp->UdpL_ArSize ); + if( dstudp->UdpA_Base == NULL ) return( BadAlloc ); + } + /* + * Determine maximum common dimensions between source1 and destination, + * which is the defined region of output. + */ + X1 = srcudp1->UdpL_X1 > dstudp->UdpL_X1 ? srcudp1->UdpL_X1 + : dstudp->UdpL_X1; + X2 = srcudp1->UdpL_X2 < dstudp->UdpL_X2 ? srcudp1->UdpL_X2 + : dstudp->UdpL_X2; + Y1 = srcudp1->UdpL_Y1 > dstudp->UdpL_Y1 ? srcudp1->UdpL_Y1 + : dstudp->UdpL_Y1; + Y2 = srcudp1->UdpL_Y2 < dstudp->UdpL_Y2 ? srcudp1->UdpL_Y2 + : dstudp->UdpL_Y2; + + /* + * Restrict the area to be processed by finding the intersection of + * the region of output and the second source operand (if used). + */ + if (srcudp2 == NULL) { + x1 = X1; x2 = X2; + y1 = Y1; y2 = Y2; + } else { + x1 = srcudp2->UdpL_X1 > X1 ? srcudp2->UdpL_X1 : X1; + x2 = srcudp2->UdpL_X2 < X2 ? srcudp2->UdpL_X2 : X2; + y1 = srcudp2->UdpL_Y1 > Y1 ? srcudp2->UdpL_Y1 : Y1; + y2 = srcudp2->UdpL_Y2 < Y2 ? srcudp2->UdpL_Y2 : Y2; + } + + /* + * Further restrict the area to be processed by finding the intersection + * with the IDC (ROI or CPP). + */ + if (idc != NULL) { + x1 = idc->UdpL_X1 > x1 ? idc->UdpL_X1 : x1; + x2 = idc->UdpL_X2 < x2 ? idc->UdpL_X2 : x2; + y1 = idc->UdpL_Y1 > y1 ? idc->UdpL_Y1 : y1; + y2 = idc->UdpL_Y2 < y2 ? idc->UdpL_Y2 : y2; + } + + /* Allocate and init temporary UDP's to hold one scanline of float data */ + status = BadAlloc; + src1 = ArithmeticGetTempUdp(srcudp1, y1, x1, x2); + if( !IsPointer_(src1) ) goto clean_up; + + if( srcudp2 != NULL ) + { + src2 = ArithmeticGetTempUdp(srcudp2, y1, x1, x2); + if( !IsPointer_(src2) ) goto clean_up; + } + dst = ArithmeticGetTempUdp(dstudp, y1, x1, x2); + if( !IsPointer_(dst) ) goto clean_up; + + fconstant = (float)constant[srcudp1->UdpL_CompIdx]; + cpp = (idc != NULL && idc->UdpA_Base != NULL) ? idc : NULL; + + /* Just copy the scanlines outside of the ROI */ + status = DdxCopy_( srcudp1, dstudp, /* Top */ + X1, Y1, X1, Y1, X2 - X1 + 1, y1 - Y1 ); + if( status != Success ) goto clean_up; + + status = DdxCopy_( srcudp1, dstudp, /* Bottom */ + X1, y2 + 1, X1, y2 + 1, X2 - X1 + 1, Y2 - y2 ); + if( status != Success ) goto clean_up; + + status = DdxCopy_( srcudp1, dstudp, /* Left */ + X1, y1, X1, y1, x1 - X1, y2 - y1 + 1 ); + if( status != Success ) goto clean_up; + + status = DdxCopy_( srcudp1, dstudp, /* Right */ + x2 + 1, y1, x2 + 1, y1, X2 - x2, y2 - y1 + 1 ); + if( status != Success ) goto clean_up; + + /* If the temporary UDP's are pointing to the original data, position + * to the correct offset. + */ + if (src1->UdpA_Base == srcudp1->UdpA_Base) + src1->UdpL_Pos = srcudp1->UdpL_Pos + y1 * srcudp1->UdpL_ScnStride + + (x1 - srcudp1->UdpL_X1) * srcudp1->UdpL_PxlStride; + + if (srcudp2 != NULL && src2->UdpA_Base == srcudp2->UdpA_Base) + src2->UdpL_Pos = srcudp2->UdpL_Pos + y1 * srcudp2->UdpL_ScnStride + + (x1 - srcudp2->UdpL_X1) * srcudp2->UdpL_PxlStride; + + dst->UdpL_Y1 = dst->UdpL_Y2 = y1; + if (dst->UdpA_Base == dstudp->UdpA_Base) + dst->UdpL_Pos = dstudp->UdpL_Pos + y1 * dstudp->UdpL_ScnStride + + (x1 - dstudp->UdpL_X1) * dstudp->UdpL_PxlStride; + + /* Now perform the arithmetic operation over the region-of-interest */ + + if (srcudp2 != NULL ) + { + /* Image-to-image operation */ + for( scanline = y1; scanline <= y2; scanline++) + { + /* Get a UDP pointing to this scanline */ + status = ArithmeticConvertScanline(srcudp1, src1); + if( status != Success ) goto clean_up; + status = ArithmeticConvertScanline(srcudp2, src2); + if( status != Success ) goto clean_up; + status = (*ArithmeticOpTable[operator])(src1, src2, dst, cpp, + y1, x1, x2); + if( status != Success ) goto clean_up; + status = ArithmeticStoreScanline(dst, dstudp); + if( status != Success ) goto clean_up; + } + } + else + { + /* Image-to-constant or Constant-to-Image operation */ + for( scanline = y1; scanline <= y2; scanline++) + { + /* Get a UDP pointing to this scanline */ + status = ArithmeticConvertScanline(srcudp1, src1); + if( status != Success ) goto clean_up; + + status = (*ArithmeticOpTable[operator])(src1, fconstant, dst, cpp, + y1, x1, x2); + if( status != Success ) goto clean_up; + status = ArithmeticStoreScanline(dst, dstudp); + if( status != Success ) goto clean_up; + } + } + /* Disable error handling and cleanup the temporary descriptors */ +clean_up : + +#if defined(XIE_USE_EXCEPTION_HANDLING) + UnhandleFPE_( oldvec ); +#endif + + + if( IsPointer_(src1) ) + ArithmeticDestroyTempUdp(src1, srcudp1); + if( IsPointer_(src2) ) + ArithmeticDestroyTempUdp(src2, srcudp2); + if( IsPointer_(dst) ) + ArithmeticDestroyTempUdp(dst, dstudp); + + return( status ); +} /* end SmiArithmetic */ + +/***************************************************************************** +** Arithmetic processing routines +** +** FUNCTIONAL DESCRIPTION: +** +** These routines the actual arithmetic operation over selected +** portion of a scanline. A separate routine is used for each +** type of operation. +** +** FORMAL PARAMETERS: +** +** src1 - Pointer to a UDP describing the first source operand. +** src2 - Pointer to a UDP describing the second source operand. +** fconst - Constant "image" value if image-to-constant. +** dst - Pointer to a UDP describing the destination buffer. +** cpp - Pointer to a UDP describing the Control Processing Plane. +** (NULL if no CPP) +** y1 - The y corrdinate of the beginning of the region to +* process. +** x1 - The x coordinate of the left endpoint of the region to +** process. +** x2 - The x coordinate of the right endpoint of the region to +** process. +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int ArithmeticAddII(src1, src2, dst, cpp, y1, x1, x2) +UdpPtr src1; +UdpPtr src2; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + + unsigned char *src1ptr; + unsigned char *src2ptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + + int src1bytes = src1->UdpL_PxlStride >> 3; + int src2bytes = src2->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + + src1ptr = src1->UdpA_Base + (src1->UdpL_Pos >> 3); + src2ptr = src2->UdpA_Base + (src2->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src1->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + for (pixel = x1; pixel <= x2; pixel++){ + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + *(float *)dstptr = *(float *)src1ptr + *(float *)src2ptr; + else + *(float *)dstptr = *(float *)src1ptr; /* Not selected by CPP */ + + src1ptr+=src1bytes; + src2ptr+=src2bytes; + dstptr+=dstbytes; + + } + return( Success ); +} /* end ArithmeticAddII */ + +static int ArithmeticSubII(src1, src2, dst, cpp, y1, x1, x2) +UdpPtr src1; +UdpPtr src2; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + + unsigned char *src1ptr; + unsigned char *src2ptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + + int src1bytes = src1->UdpL_PxlStride >> 3; + int src2bytes = src2->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + + src1ptr = src1->UdpA_Base + (src1->UdpL_Pos >> 3); + src2ptr = src2->UdpA_Base + (src2->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src1->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + for (pixel = x1; pixel <= x2; pixel++){ + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + *(float *)dstptr = *(float *)src1ptr - *(float *)src2ptr; + else + *(float *)dstptr = *(float *)src1ptr; /* Not selected by CPP */ + + src1ptr+=src1bytes; + src2ptr+=src2bytes; + dstptr+=dstbytes; + + } + return( Success ); +} /* end ArithmeticSubII */ + +static int ArithmeticMulII(src1, src2, dst, cpp, y1, x1, x2) +UdpPtr src1; +UdpPtr src2; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + + unsigned char *src1ptr; + unsigned char *src2ptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + + int src1bytes = src1->UdpL_PxlStride >> 3; + int src2bytes = src2->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + + src1ptr = src1->UdpA_Base + (src1->UdpL_Pos >> 3); + src2ptr = src2->UdpA_Base + (src2->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src1->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + for (pixel = x1; pixel <= x2; pixel++){ + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + *(float *)dstptr = *(float *)src1ptr * *(float *)src2ptr; + else + *(float *)dstptr = *(float *)src1ptr; /* Not selected by CPP */ + + src1ptr+=src1bytes; + src2ptr+=src2bytes; + dstptr+=dstbytes; + + } + return( Success ); +} /* end ArithmeticMulII */ + +static int ArithmeticDivII(src1, src2, dst, cpp, y1, x1, x2) +UdpPtr src1; +UdpPtr src2; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + + unsigned char *src1ptr; + unsigned char *src2ptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + + int src1bytes = src1->UdpL_PxlStride >> 3; + int src2bytes = src2->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + + src1ptr = src1->UdpA_Base + (src1->UdpL_Pos >> 3); + src2ptr = src2->UdpA_Base + (src2->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src1->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + for (pixel = x1; pixel <= x2; pixel++){ + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) { +#if !defined(XIE_USE_EXCEPTION_HANDLING) + if ( *(float *)src2ptr == 0.0 ) return( BadValue ); +#endif + *(float *)dstptr = *(float *)src1ptr / *(float *)src2ptr; + } + else + *(float *)dstptr = *(float *)src1ptr; /* Not selected by CPP */ + + + src1ptr+=src1bytes; + src2ptr+=src2bytes; + dstptr+=dstbytes; + + } + return( Success ); +} /* end ArithmeticDivII */ + +static int ArithmeticMinII(src1, src2, dst, cpp, y1, x1, x2) +UdpPtr src1; +UdpPtr src2; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + + unsigned char *src1ptr; + unsigned char *src2ptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + + int src1bytes = src1->UdpL_PxlStride >> 3; + int src2bytes = src2->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + + src1ptr = src1->UdpA_Base + (src1->UdpL_Pos >> 3); + src2ptr = src2->UdpA_Base + (src2->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src1->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + for (pixel = x1; pixel <= x2; pixel++){ + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + *(float *)dstptr = Min_(*(float *)src1ptr, *(float *)src2ptr); + else + *(float *)dstptr = *(float *)src1ptr; /* Not selected by CPP */ + + src1ptr+=src1bytes; + src2ptr+=src2bytes; + dstptr+=dstbytes; + + } + return( Success ); +} /* end ArithmeticMinII */ + +static int ArithmeticMaxII(src1, src2, dst, cpp, y1, x1, x2) +UdpPtr src1; +UdpPtr src2; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + + unsigned char *src1ptr; + unsigned char *src2ptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + + int src1bytes = src1->UdpL_PxlStride >> 3; + int src2bytes = src2->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + + src1ptr = src1->UdpA_Base + (src1->UdpL_Pos >> 3); + src2ptr = src2->UdpA_Base + (src2->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src1->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + for (pixel = x1; pixel <= x2; pixel++){ + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + *(float *)dstptr = Max_(*(float *)src1ptr, *(float *)src2ptr); + else + *(float *)dstptr = *(float *)src1ptr; /* Not selected by CPP */ + + + src1ptr+=src1bytes; + src2ptr+=src2bytes; + dstptr+=dstbytes; + + } + return( Success ); +} /* end ArithmeticMaxII */ + +static int ArithmeticAddIC(src, fconst, dst, cpp, y1, x1, x2) + UdpPtr src; + float fconst; + UdpPtr dst; + UdpPtr cpp; + long int y1; + long int x1; + long int x2; +{ + int pixel; + + unsigned char *srcptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + + int srcbytes = src->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + + srcptr = src->UdpA_Base + (src->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + for (pixel = x1; pixel <= x2; pixel++){ + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + *(float *)dstptr = *(float *)srcptr + fconst; + else + *(float *)dstptr = *(float *)srcptr; /* Not selected by CPP */ + + srcptr+=srcbytes; + dstptr+=dstbytes; + + } + return( Success ); +} /* end ArithmeticAddIC */ + +static int ArithmeticSubIC(src, fconst, dst, cpp, y1, x1, x2) + UdpPtr src; + float fconst; + UdpPtr dst; + UdpPtr cpp; + long int y1; + long int x1; + long int x2; +{ + int pixel; + + unsigned char *srcptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + + int srcbytes = src->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + + srcptr = src->UdpA_Base + (src->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + for (pixel = x1; pixel <= x2; pixel++){ + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + *(float *)dstptr = *(float *)srcptr - fconst; + else + *(float *)dstptr = *(float *)srcptr; /* Not selected by CPP */ + + srcptr+=srcbytes; + dstptr+=dstbytes; + + } + return( Success ); +} /* end ArithmeticSubIC */ + +static int ArithmeticMulIC(src, fconst, dst, cpp, y1, x1, x2) + UdpPtr src; + float fconst; + UdpPtr dst; + UdpPtr cpp; + long int y1; + long int x1; + long int x2; +{ + int pixel; + + unsigned char *srcptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + + int srcbytes = src->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + + srcptr = src->UdpA_Base + (src->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + for (pixel = x1; pixel <= x2; pixel++){ + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + *(float *)dstptr = *(float *)srcptr * fconst; + else + *(float *)dstptr = *(float *)srcptr; /* Not selected by CPP */ + + srcptr+=srcbytes; + dstptr+=dstbytes; + + } + return( Success ); +} /* end ArithmeticMulIC */ + +static int ArithmeticDivIC(src, fconst, dst, cpp, y1, x1, x2) + UdpPtr src; + float fconst; + UdpPtr dst; + UdpPtr cpp; + long int y1; + long int x1; + long int x2; +{ + int pixel; + + unsigned char *srcptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + + int srcbytes = src->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + srcptr = src->UdpA_Base + (src->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + for (pixel = x1; pixel <= x2; pixel++){ + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) { +#if !defined(XIE_USE_EXCEPTION_HANDLING) + if (fconst == 0.0) + return( BadValue ); +#endif + *(float *)dstptr = *(float *)srcptr / fconst; + } else + *(float *)dstptr = *(float *)srcptr; /* Not selected by CPP */ + + srcptr+=srcbytes; + dstptr+=dstbytes; + + } + return( Success ); +} /* end ArithmeticDivIC */ + +static int ArithmeticMinIC(src, fconst, dst, cpp, y1, x1, x2) + UdpPtr src; + float fconst; + UdpPtr dst; + UdpPtr cpp; + long int y1; + long int x1; + long int x2; +{ + int pixel; + + unsigned char *srcptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + + int srcbytes = src->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + + srcptr = src->UdpA_Base + (src->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + for (pixel = x1; pixel <= x2; pixel++){ + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + *(float *)dstptr = Min_(*(float *)srcptr, fconst); + else + *(float *)dstptr = *(float *)srcptr; /* Not selected by CPP */ + + srcptr+=srcbytes; + dstptr+=dstbytes; + + } + return( Success ); +} /* end ArithmeticMinIC */ + +static int ArithmeticMaxIC(src, fconst, dst, cpp, y1, x1, x2) + UdpPtr src; + float fconst; + UdpPtr dst; + UdpPtr cpp; + long int y1; + long int x1; + long int x2; +{ + int pixel; + + unsigned char *srcptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + + int srcbytes = src->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + + srcptr = src->UdpA_Base + (src->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + for (pixel = x1; pixel <= x2; pixel++){ + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + *(float *)dstptr = Max_(*(float *)srcptr, fconst); + else + *(float *)dstptr = *(float *)srcptr; /* Not selected by CPP */ + + srcptr+=srcbytes; + dstptr+=dstbytes; + + } + return( Success ); +} /* end ArithmeticMaxIC */ + +static int ArithmeticSubCI(src, fconst, dst, cpp, y1, x1, x2) + UdpPtr src; + float fconst; + UdpPtr dst; + UdpPtr cpp; + long int y1; + long int x1; + long int x2; +{ + int pixel; + + unsigned char *srcptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + + int srcbytes = src->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + + srcptr = src->UdpA_Base + (src->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + for (pixel = x1; pixel <= x2; pixel++){ + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + *(float *)dstptr = fconst - *(float *)srcptr; + else + *(float *)dstptr = *(float *)srcptr; /* Not selected by CPP */ + + srcptr+=srcbytes; + dstptr+=dstbytes; + + } + return( Success ); +} /* end ArithmeticSubCI */ + +static int ArithmeticDivCI(src, fconst, dst, cpp, y1, x1, x2) + UdpPtr src; + float fconst; + UdpPtr dst; + UdpPtr cpp; + long int y1; + long int x1; + long int x2; +{ + int pixel; + + unsigned char *srcptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + + int srcbytes = src->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + + srcptr = src->UdpA_Base + (src->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + for (pixel = x1; pixel <= x2; pixel++){ + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) { +#if !defined(XIE_USE_EXCEPTION_HANDLING) + if ( *(float *)srcptr == 0.0 ) + return( BadValue ); +#endif + *(float *)dstptr = fconst / *(float *)srcptr; + + } else + *(float *)dstptr = *(float *)srcptr; /* Not selected by CPP */ + + srcptr+=srcbytes; + dstptr+=dstbytes; + + } + return( Success ); +} /* end ArithmeticDivCI */ + +/***************************************************************************** +** ArithmeticException +** +** FUNCTIONAL DESCRIPTION: +** +** This routine is our signal handler for a floating point exception. +** +** FORMAL PARAMETERS: +** +** none +** +** FUNCTION VALUE: +** +** Returns a 1 through the setjmp. +** +*****************************************************************************/ +static void ArithmeticException( ) +{ +#if defined(XIE_USE_EXCEPTION_HANDLING) + longjmp( exception_buf, 1 ); +#endif +} + +/***************************************************************************** +** ArithmeticGetTempUdp +** +** FUNCTIONAL DESCRIPTION: +** +** Create a UDP which can be used to hold one scanline of the +** source UDP, but using float data. If the source UDP is already +* in float format, just point to its data. +** +** FORMAL PARAMETERS: +** +** inudp - Pointer to source UDP +** y1 - First scanline we need +** x1 - Leftmost pixel we need +** x2 - Rightmost pixel we need +** +** FUNCTION VALUE: +** +** Returns a pointer to a UDP describing floating point data. +** +*****************************************************************************/ +static UdpPtr ArithmeticGetTempUdp(src, y1, x1, x2) + UdpPtr src; + long int y1; + long int x1, x2; +{ + UdpPtr dst; + + dst = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( dst == NULL ) return( (UdpPtr) BadAlloc ); + + if (src->UdpB_DType != UdpK_DTypeF) + { + dst->UdpW_PixelLength = sizeof(float) * 8; + dst->UdpB_DType = UdpK_DTypeF; + dst->UdpB_Class = UdpK_ClassA; + dst->UdpL_PxlStride = dst->UdpW_PixelLength; + dst->UdpL_PxlPerScn = x2 - x1 + 1; + dst->UdpL_ScnStride = dst->UdpL_PxlPerScn * dst->UdpL_PxlStride; + dst->UdpL_ArSize = dst->UdpL_PxlPerScn * sizeof(float) << 3; + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( DdxFree_(dst), (UdpPtr) BadAlloc ); + dst->UdpL_Pos = 0; + dst->UdpL_CompIdx = src->UdpL_CompIdx; + dst->UdpL_Levels = src->UdpL_Levels; + } + else + { + *dst = *src; + dst->UdpL_PxlPerScn = x2 - x1 + 1; + dst->UdpL_ScnStride = dst->UdpL_PxlPerScn * dst->UdpL_PxlStride; + } + dst->UdpL_X1 = x1; + dst->UdpL_X2 = x2; + dst->UdpL_Y1 = y1; + dst->UdpL_Y2 = y1; /* One scanline UDP */ + dst->UdpL_ScnCnt = 1; + + return( dst ); +} /* end ArithmeticGetTempUdp */ + +/***************************************************************************** +** ArithmeticDestroyTempUdp +** +** FUNCTIONAL DESCRIPTION: +** +** Free a UDP created by ArithmeticGetTempUdp. +** +** FORMAL PARAMETERS: +** +** udp - Pointer to the udp to free. +** realudp - Pointer to a udp which might actually own the storage +** pointed to by udp. +** +*****************************************************************************/ +static void ArithmeticDestroyTempUdp( udp, realudp ) +UdpPtr udp; +UdpPtr realudp; + +{ + if (udp->UdpA_Base != NULL && udp->UdpA_Base != realudp->UdpA_Base) + DdxFreeBits_( udp->UdpA_Base ); + DdxFree_( udp ); +} /* end ArithmeticDestroyTempUdp */ + +/***************************************************************************** +** ArithmeticConvertScanline +** +** FUNCTIONAL DESCRIPTION: +** +** Adjust a UDP to point to the specified scanline of the source +** UDP. If the source UDP is not of type float, convert the +** data and leave it associated with the adjusted UDP. +** +** FORMAL PARAMETERS: +** +** src - Pointer to the source UDP. +** dst - Pointer to the UDP to be adjusted. +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int ArithmeticConvertScanline(src, dst) + UdpPtr src; + UdpPtr dst; +{ + int status = Success; + + dst->UdpL_Y1++; + dst->UdpL_Y2++; + + if (src->UdpB_DType != UdpK_DTypeF) + status = DdxConvert_( src, dst, XieK_MoveMode ); + else + dst->UdpL_Pos += src->UdpL_ScnStride; + + return( status ); +} /* end ArithmeticConvertScanline */ + +/***************************************************************************** +** ArithmeticStoreScanline +** +** FUNCTIONAL DESCRIPTION: +** +** Store a scanline of data into the destination UDP. +** If the scanline UDP already points into the destination UDP, +** just adjust the scanline UDP to point past the scanline already +** stored. If not, copy (and possibly convert) the data into the +** destination. +** +** FORMAL PARAMETERS: +** +** dst - Pointer to scanline UDP +** realdst - Pointer to the destination UDP +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int ArithmeticStoreScanline(dst, realdst) + UdpPtr dst; + UdpPtr realdst; +{ + int status = Success; + + if (dst->UdpA_Base != realdst->UdpA_Base) { + status = DdxConvert_( dst, realdst, XieK_MoveMode ); + } else { + dst->UdpL_Pos += realdst->UdpL_ScnStride; + } + dst->UdpL_Y1++; + dst->UdpL_Y2++; + + return( status ); +} /* end ArithmeticStoreScanline */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiArithmetic.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiArithmetic.h new file mode 100644 index 0000000..b4b9fab --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiArithmetic.h @@ -0,0 +1,148 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the ARITHMETIC pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.0 +** RISC ULTRIX V3.0 +** +** AUTHOR(S): +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Fri Apr 20 15:08:58 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMIARITHMETIC +#define _SMIARITHMETIC + +/* +** Include files +*/ +#include + +/* +** Function reference +*/ +int SmiArithmetic(); +int SmiCreateArithmetic(); + + +/* +** Structure definitions and Typedefs +*/ + +/* +** Arithmetic pipeline context block. +*/ +typedef struct _ArithmeticPipeCtx { + PipeElementCommonPart common; + struct _ArithmeticPart { + PipeSinkPtr srcsnk1; + PipeSinkPtr srcsnk2; + PipeSinkPtr dstsnk; + PipeDrainPtr srcdrn1; + PipeDrainPtr srcdrn2; + PipeDataPtr srcdata1; + PipeDataPtr srcdata2; + float fconst[XieK_MaxComponents]; + long int x1; + long int x2; + long int y1; + long int y2; + UdpPtr cpp; + int (*function)(); + } ArithmeticPart; +} ArithmeticPipeCtx, *ArithmeticPipeCtxPtr; + +/* +** MACRO definitions +*/ + +/* +** Pipeline context, Arithmetic part, access MACROs +*/ +#define AriSrcSnk1_(ctx) (((ArithmeticPipeCtxPtr)(ctx))->ArithmeticPart.srcsnk1) +#define AriSrcSnk2_(ctx) (((ArithmeticPipeCtxPtr)(ctx))->ArithmeticPart.srcsnk2) +#define AriDstSnk_(ctx) (((ArithmeticPipeCtxPtr)(ctx))->ArithmeticPart.dstsnk) + +#define AriSrcDrn1_(ctx) (((ArithmeticPipeCtxPtr)(ctx))->ArithmeticPart.srcdrn1) +#define AriSrcDrn2_(ctx) (((ArithmeticPipeCtxPtr)(ctx))->ArithmeticPart.srcdrn2) +#define AriSrcData1_(ctx) \ + (((ArithmeticPipeCtxPtr)(ctx))->ArithmeticPart.srcdata1) +#define AriSrcData2_(ctx) \ + (((ArithmeticPipeCtxPtr)(ctx))->ArithmeticPart.srcdata2) +#define AriFConst_(ctx,comp) \ + (((ArithmeticPipeCtxPtr)(ctx))->ArithmeticPart.fconst[comp]) +#define AriRoiX1_(ctx) (((ArithmeticPipeCtxPtr)(ctx))->ArithmeticPart.x1) +#define AriRoiX2_(ctx) (((ArithmeticPipeCtxPtr)(ctx))->ArithmeticPart.x2) +#define AriRoiY1_(ctx) (((ArithmeticPipeCtxPtr)(ctx))->ArithmeticPart.y1) +#define AriRoiY2_(ctx) (((ArithmeticPipeCtxPtr)(ctx))->ArithmeticPart.y2) +#define AriCpp_(ctx) (((ArithmeticPipeCtxPtr)(ctx))->ArithmeticPart.cpp) +#define AriFunc_(ctx) (((ArithmeticPipeCtxPtr)(ctx))->ArithmeticPart.function) + +#endif +/* _SMIARITHMETIC */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiBitMasks.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiBitMasks.h new file mode 100644 index 0000000..c3c60e7 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiBitMasks.h @@ -0,0 +1,158 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Image Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** Header file containg bitmasks for help in C written bit-twidling +** routines. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Bernardo Tagariello +** +** CREATION DATE: +** +** 24-May-1989 +** +************************************************************************/ + +/* +** Bit masks used by MiPutRuns +** +*/ + +#define BYTE_SIZE 8 /* number of bits per byte */ +#define LONG_SIZE 32 /* number of bits per longword */ + +/* + * these masks protect regions of the destination buffer (used in ImgMovv5) + * from being destroyed when copying + */ + +static +long int lo_mask[] = { 0xffffffff, + 0xfffffffe, + 0xfffffffc, + 0xfffffff8, + 0xfffffff0, + 0xffffffe0, + 0xffffffc0, + 0xffffff80, + 0xffffff00, + 0xfffffe00, + 0xfffffc00, + 0xfffff800, + 0xfffff000, + 0xffffe000, + 0xffffc000, + 0xffff8000, + 0xffff0000, + 0xfffe0000, + 0xfffc0000, + 0xfff80000, + 0xfff00000, + 0xffe00000, + 0xffc00000, + 0xff800000, + 0xff000000, + 0xfe000000, + 0xfc000000, + 0xf8000000, + 0xf0000000, + 0xe0000000, + 0xc0000000, + 0x80000000, + 0x00000000}; + +static +long int hi_mask[] = { 0x00000000, + 0x00000001, + 0x00000003, + 0x00000007, + 0x0000000f, + 0x0000001f, + 0x0000003f, + 0x0000007f, + 0x000000ff, + 0x000001ff, + 0x000003ff, + 0x000007ff, + 0x00000fff, + 0x00001fff, + 0x00003fff, + 0x00007fff, + 0x0000ffff, + 0x0001ffff, + 0x0003ffff, + 0x0007ffff, + 0x000fffff, + 0x001fffff, + 0x003fffff, + 0x007fffff, + 0x00ffffff, + 0x01ffffff, + 0x03ffffff, + 0x07ffffff, + 0x0fffffff, + 0x1fffffff, + 0x3fffffff, + 0x7fffffff, + 0xffffffff}; diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiChangeList.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiChangeList.c new file mode 100644 index 0000000..a28ec93 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiChangeList.c @@ -0,0 +1,317 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** Changlist manipulation routines for the Ultrix environment. +** This module replaces the VMS module Img__CHANGE_LIST.MAR. +** +** This module contains routines which support the creation of change +** lists from image data and the reconstruction of image data from +** change list structures. +** +** A CHANGELIST is an array of unsigned integers where the zeroeth entry +** contains the count of the number of valid entries, and a valid entry +** contains a CHANGE point (bit offset from the beginning of the scanline) +** from zero to one, or one to zero. +** +** Entry CHANGELIST[1], and all odd indexed entries contain CHANGEs to +** "ones"; even entries contain CHANGEs to "zeros". If the CHANGELIST +** array is large enough to process the entire scanline the last entry +** CHANGELIST[CHANGELIST[0]] will contain the length of the scanline (one +** bit position past the end) and is included in the count. +** +** The maximum size CHANGELIST array required to contain one scanline +** is scanline-length plus 2 entries (for the count and scanline length). +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Written for VMS by John Weber 15-May-1987 +** +** Rewritten for Ultrix by Brian M. Stevens 26-Sep-1988 +** +** Clean-up and put into library by Michael D. O'Connor 28-Nov-1988 +** +** CREATION DATE: +** +** 26-Sep-1988 +** +** MODIFICATION HISTORY: +** +************************************************************************/ +/* +** Table of Contents +*/ +int MiBuildChangeList(); +void MiPutRuns(); + +/* +** Include files +*/ +#include "SmiBitMasks.h" +/* +** MACRO definitions +*/ + +/* +** Global Symbols +*/ + +/* +** Equated Symbols +*/ + +/* +** External References +*/ +extern int MiFfsLong(); +extern int MiFfcLong(); + +/************************************************************************ +** +** +** FUNCTIONAL DESCRIPTION: +** +** This routine builds a change list structure from a buffer of image data. +** Run length transitions are detected by alternately searching for zero +** bits or one bits with the Mi_FFx_LONG routines. Bit offsets where the +** transitions take place are stored in subsequent entries in the change +** list. +** +** FORMAL PARAMETERS: +** +** src_addr; - scanline buffer address +** src_pos; - scanline buffer offset (in bits) +** size; - scanline buffer length (in bytes) +** cl_addr; - change list address (ptr to array of long) +** cl_len; - chane list length (num of cells in array) +** +** +** IMPLICIT INPUTS: +** +** none +** +** IMPLICIT OUTPUTS: +** +** none +** +** FUNCTION VALUE: +** +** Returns the address of the change list. +** +** SIGNAL CODES: +** +** none +** +** SIDE EFFECTS: +** +** none +** +************************************************************************/ +int MiBuildChangeList(src_addr, src_pos, size, cl_addr, cl_len) +long src_addr; +long src_pos; +long size; +long cl_addr; +long cl_len; +{ + long pos; + long end; + int index; + unsigned int *cl; + + + cl = (unsigned int *) cl_addr; + end = src_pos + size; + pos = src_pos; + + /* + ** While there's room in the changlist and data to search, find + ** transitions and load them into the change list. + */ + for (index = 1; index < cl_len && size > 0; index++, size = end - pos) + { + if (index % 2) + { + /* + ** look for a transition to a 1 bit + */ + + MiFfsLong(pos, size, src_addr, &pos); + } + else + { + /* + ** look for a transition to a 0 bit + */ + + MiFfcLong(pos, size, src_addr, &pos); + } + + /* + ** save the transition point in the changelist + */ + + cl[index] = pos - src_pos; + } + + /* + ** store the number of valid entries + */ + + cl[0] = --index; + + return ((int) cl); +} + +/************************************************************************ +** +** +** FUNCTIONAL DESCRIPTION: +** +** This routine accepts a change list buffer and reconstructs the image +** data described by it into a data buffer. +** +** It is assumed that the data buffer contains zeros on entry to this +** routine, so only run lists of ones are actually written using +** MiMovv7. +** +** FORMAL PARAMETERS: +** +** dst_addr; - dest. address of image data buffer +** dst_pos; - dest. address offset (in bits) +** cl_addr; - address of change list (array of long) +** +** +** IMPLICIT INPUTS: +** +** none +** +** IMPLICIT OUTPUTS: +** +** none +** +** FUNCTION VALUE: +** +** none +** +** SIGNAL CODES: +** +** none +** +** SIDE EFFECTS: +** +** none +** +************************************************************************/ +void +MiPutRuns(dst_addr, dst_pos, cl_addr) + long dst_addr; + long dst_pos; + long cl_addr; +{ + long size; + int index; + unsigned int *cl; + int bit; + char *pbyte; + + + cl = (unsigned int *) cl_addr; + + /* + ** While there are elements in the change list write runs of bits + ** into the destination image data buffer. + ** Note: Since data buffer starts out as all 0's. Write only runs of 1's. + */ + for (index = 1; index < cl[0]; index += 2) + { + /* + ** Find out where to start + */ + pbyte = (char *) dst_addr + (dst_pos + cl[index]) / BYTE_SIZE; + size = cl[index + 1] - cl[index]; + + /* + ** Write bits before starting on byte boundary + */ + for (bit=(dst_pos + cl[index]) % BYTE_SIZE; size > 0 && bit < BYTE_SIZE; --size, ++bit) + { + *pbyte |= (1 << bit); + } + + /* + ** Write ones for as many bytes as needed + */ + for (pbyte++; size >= BYTE_SIZE; size -= BYTE_SIZE, pbyte++) + { + *pbyte = 0xff; + } + + /* + ** Write ones after last byte boundary + */ + for (bit = 0; size > 0; --size, ++bit) + { + *pbyte |= (1 << bit); + } + } +} diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiChangeList.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiChangeList.h new file mode 100644 index 0000000..a1c1ece --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiChangeList.h @@ -0,0 +1,91 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the CHANGELIST module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** +** AUTHOR(S): +** +** Richard Hennessy +** +** CREATION DATE: +** +** September 25, 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMICHANGELIST +#define _SMICHANGELIST + + /* + ** Include files + */ + + /* + ** Function reference + */ +int MiBuildChangeList(); +void MiPutRuns(); + +#endif +/* _SMICHANGELIST */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiChromeCom.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiChromeCom.c new file mode 100644 index 0000000..08d080d --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiChromeCom.c @@ -0,0 +1,288 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains support for the pipelined Chrominance Combine +** operator. The non-pipelined operator is handled entirely in the DIX. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Wed Jul 11 10:43:28 1990 +** +** MODIFICATION HISTORY: +** +*******************************************************************************/ + +#include + +#include "SmiChromeCom.h" + +/* +** Table of contents +*/ +int SmiCreateChromeCom(); + +static int _ChromeComInitialize(); +static int _ChromeComActivate(); +static int _ChromeComDestroy(); + +/* +** External References +*/ + +/* +** Local storage +*/ + /* + ** ChromeCom Element Vector + */ +static PipeElementVector ChromeComPipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeChromeComElement, /* Structure subtype */ + sizeof(ChromeComPipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _ChromeComInitialize, /* Initialize entry */ + _ChromeComActivate, /* Activate entry */ + NULL, /* Flush entry */ + _ChromeComDestroy, /* Destroy entry */ + NULL /* Abort entry point */ + }; + +/***************************************************************************** +** SmiCreateChromeCom +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the ChromeCom pipeline element +** +** FORMAL PARAMETERS: +** +** ctx - ChromeCom pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCreateChromeCom( pipe, srcsnk1, srcsnk2, srcsnk3, dstsnk ) +Pipe pipe; +PipeSinkPtr srcsnk1; +PipeSinkPtr srcsnk2; +PipeSinkPtr srcsnk3; +PipeSinkPtr dstsnk; +{ + int i; + ChromeComPipeCtxPtr ctx = (ChromeComPipeCtxPtr) + DdxCreatePipeCtx_( pipe, &ChromeComPipeElement, FALSE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + + /* + ** Copy parameters into context struct + */ + ChcSrcSnk_(ctx,0) = srcsnk1; + ChcSrcSnk_(ctx,1) = srcsnk2; + ChcSrcSnk_(ctx,2) = srcsnk3; + ChcDstSnk_(ctx) = dstsnk; + + /* Any input/output data types. Quantum 1 */ + for( i = 0; i < XieK_MaxComponents; i++ ) + { + ChcDrn_(ctx,i) = DdxRmCreateDrain_( ChcSrcSnk_(ctx,i), 1 ); + if( !IsPointer_(ChcDrn_(ctx,i)) ) return( (int) ChcDrn_(ctx,i) ); + DdxRmSetDType_( ChcDrn_(ctx,i), UdpK_DTypeUndefined, DtM_Any ); + DdxRmSetQuantum_( ChcDrn_(ctx,i), 1 ); + } + DdxRmSetDType_( ChcDstSnk_(ctx), UdpK_DTypeUndefined, DtM_Any ); + DdxRmSetQuantum_( ChcDstSnk_(ctx), 1 ); + + return( Success ); +} /* end SmiCreateChromeCom */ + +/***************************************************************************** +** _ChromeComInitialize +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the ChromeCom pipeline element +** +** FORMAL PARAMETERS: +** +** ctx - ChromeCom pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ChromeComInitialize(ctx) +ChromeComPipeCtxPtr ctx; +{ + int i, dtype, status; + + CtxInp_(ctx) = ChcDrn_(ctx,0); + + for( i = 0; i + +/* +** Function reference +*/ +int SmiCreateChromeCom(); + +/* +** Structure definitions and Typedefs +*/ + +/* +** ChromeCom pipeline context block. +*/ +typedef struct _ChromeComPipeCtx { + PipeElementCommonPart common; + struct _ChromeComPart { + PipeSinkPtr srcsnk[XieK_MaxComponents]; + PipeSinkPtr dstsnk; + PipeDrainPtr drn[XieK_MaxComponents]; + } ChromeComPart; +} ChromeComPipeCtx, *ChromeComPipeCtxPtr; + +/* +** MACRO definitions +*/ + +/* +** Pipeline context, ChromeCom part, access MACROs +*/ +#define ChcDrn_(ctx,comp) \ + (((ChromeComPipeCtxPtr)(ctx))->ChromeComPart.drn[comp]) +/* +** ChromeCom Parameters +*/ +#define ChcSrcSnk_(ctx,comp) \ + (((ChromeComPipeCtxPtr)(ctx))->ChromeComPart.srcsnk[comp]) +#define ChcDstSnk_(ctx) (((ChromeComPipeCtxPtr)(ctx))->ChromeComPart.dstsnk) + +#endif +/* _SMICHROMECOM */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiChromeSep.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiChromeSep.c new file mode 100644 index 0000000..5751491 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiChromeSep.c @@ -0,0 +1,259 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains support for the pipelined Chrominance Separate +** operator. Non-pipelined ChromeSep is handled entirely in the DIX. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Gary Grebus +** +** DATE: +** +** Wed Jul 11 12:38:21 1990 +** +** MODIFICATION HISTORY: +** +*******************************************************************************/ + +#include + +#include "SmiChromeSep.h" + +/* +** Table of contents +*/ +int SmiCreateChromeSep(); + +static int _ChromeSepInitialize(); +static int _ChromeSepActivate(); +static int _ChromeSepDestroy(); + +/* +** External References +*/ + +/* +** Local storage +*/ + /* + ** ChromeSep Element Vector + */ +static PipeElementVector ChromeSepPipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeChromeSepElement, /* Structure subtype */ + sizeof(ChromeSepPipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _ChromeSepInitialize, /* Initialize entry */ + _ChromeSepActivate, /* Activate entry */ + NULL, /* Flush entry */ + _ChromeSepDestroy, /* Destroy entry */ + NULL /* Abort entry point */ + }; + +/***************************************************************************** +** SmiCreateChromeSep +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the CHROMESEP pipeline element +** +** FORMAL PARAMETERS: +** +** ctx - chromeSep pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCreateChromeSep( pipe, srcsnk, dstsnk, component ) +Pipe pipe; +PipeSinkPtr srcsnk; +PipeSinkPtr dstsnk; +long int component; +{ + ChromeSepPipeCtxPtr ctx = (ChromeSepPipeCtxPtr) + DdxCreatePipeCtx_( pipe, &ChromeSepPipeElement, FALSE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + + /* + ** Copy parameters into context struct + */ + ChsSrcSnk_(ctx) = srcsnk; + ChsDstSnk_(ctx) = dstsnk; + ChsComp_(ctx) = component; /* The component to select */ + + /* Handle any data type and quantum */ + ChsSrcDrn_(ctx) = DdxRmCreateDrain_( ChsSrcSnk_(ctx), 1 << component ); + if( !IsPointer_(ChsSrcDrn_(ctx)) ) return( (int) ChsSrcDrn_(ctx) ); + DdxRmSetDType_( ChsSrcDrn_(ctx), UdpK_DTypeUndefined, DtM_Any ); + DdxRmSetQuantum_( ChsSrcDrn_(ctx), 0 ); + + DdxRmSetDType_( ChsDstSnk_(ctx), UdpK_DTypeUndefined, DtM_Any ); + DdxRmSetQuantum_( ChsDstSnk_(ctx), 0 ); + + return( Success ); +} /* end SmiCreateChromeSep */ + +/***************************************************************************** +** _ChromeSepInitialize +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the CHROMESEP pipeline element +** +** FORMAL PARAMETERS: +** +** ctx - chromeSep pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ChromeSepInitialize(ctx) +ChromeSepPipeCtxPtr ctx; +{ + int dtype, status; + + /* + ** Initialize the source drain. + */ + CtxInp_(ctx) = ChsSrcDrn_(ctx); + status = DdxRmInitializePort_( CtxHead_(ctx), ChsSrcDrn_(ctx) ); + if( status != Success ) return( status ); + + /* + ** Set our destination sink DType to match our drain and initialize it. + */ + dtype = DdxRmGetDType_( ChsSrcDrn_(ctx) ); + DdxRmSetDType_( ChsDstSnk_(ctx), dtype, 1< +/* +** Function Reference +*/ +int SmiCreateChromeSep(); + + +/* +** Structure definitions and Typedefs +*/ + +/* +** ChromeSep pipeline context block. +*/ +typedef struct _ChromeSepPipeCtx { + PipeElementCommonPart common; + struct _ChromeSepPart { + PipeSinkPtr srcsnk; + PipeSinkPtr dstsnk; + PipeDrainPtr srcdrn; + long int component; + } ChromeSepPart; +} ChromeSepPipeCtx, *ChromeSepPipeCtxPtr; + +/* +** MACRO definitions +*/ + +/* +** Pipeline context, ChromeSep part, access MACROs +*/ +#define ChsSrcDrn_(ctx) (((ChromeSepPipeCtxPtr)(ctx))->ChromeSepPart.srcdrn) +#define ChsComp_(ctx) (((ChromeSepPipeCtxPtr)(ctx))->ChromeSepPart.component) +/* +** ChromeSep Parameters +*/ +#define ChsSrcSnk_(ctx) (((ChromeSepPipeCtxPtr)(ctx))->ChromeSepPart.srcsnk) +#define ChsDstSnk_(ctx) (((ChromeSepPipeCtxPtr)(ctx))->ChromeSepPart.dstsnk) + +#endif +/* _SMICHROMESEP */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiCompare.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiCompare.c new file mode 100644 index 0000000..5324b05 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiCompare.c @@ -0,0 +1,2096 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module implements the compare operator which performs +** compare functions between two photomaps or a photomap and a +** constant. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHORS: +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Fri Jul 6 16:16:22 1990 +** +*******************************************************************************/ + +#include + +#include "SmiCompare.h" + +/* +** Table of contents +*/ +int SmiCompare(); +int SmiCreateCompare(); + +static int _CompareInitialize(); +static int _CompareActivate(); +static int _CompareFlush(); +static int _CompareAbort(); +static int _CompareDestroy(); + +static UdpPtr CompareGetTempUdp(); +static void CompareDestroyTempUdp(); +static int CompareConvertScanline(); +static int CollectComponents(); + +static void CompareLTII(); +static void CompareLTIC(); +static void CompareLEII(); +static void CompareLEIC(); +static void CompareEQII(); +static void CompareEQIC(); +static void CompareNEII(); +static void CompareNEIC(); +static void CompareGTII(); +static void CompareGTIC(); +static void CompareGEII(); +static void CompareGEIC(); + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* +** Local storage +*/ + /* + ** Compare Element Vector + */ +static PipeElementVector ComparePipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeCompareElement, /* Structure subtype */ + sizeof(ComparePipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _CompareInitialize, /* Initialize entry */ + _CompareActivate, /* Activate entry */ + _CompareFlush, /* Flush entry */ + _CompareDestroy, /* Destroy entry */ + _CompareAbort /* Abort entry */ + }; + +/* Dispatch tables to select the correct operation routine */ +/* These must match the ordering of the XieK_xxxx constants in XieAppl.h */ +static void (*CompareTableII[])() = { + NULL, /* Constants start with 1 */ + CompareLTII, + CompareLEII, + CompareEQII, + CompareNEII, + CompareGTII, + CompareGEII + }; + +static void (*CompareTableIC[])() = { + NULL, + CompareLTIC, + CompareLEIC, + CompareEQIC, + CompareNEIC, + CompareGTIC, + CompareGEIC + }; + + +/***************************************************************************** +** SmiCreateCompare +** +** FUNCTIONAL DESCRIPTION: +** +** This function fills in a newly created context for a COMPARE +** pipeline element. +** +** FORMAL PARAMETERS: +** +** pipe - Descriptor for pipe being built.. +** srcsnk1 - Pointer to first source sink +** srcsnk2 - Pointer to second source sink (NULL if no second source) +** constant- Array of "constant image" values (used when srcsnk2==NULL) +** dstsnk - Pointer to destination sink +** idc - Pointer to UDP describing the ROI or CPP (NULL if no IDC) +** operator- Compare operation function code. +** combine - Produce one combined photomap for multiple component +** input (Boolean) +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCreateCompare(pipe,srcsnk1,srcsnk2,constant, + dstsnk,idc,operator,combine) +Pipe pipe; +PipeSinkPtr srcsnk1; +PipeSinkPtr srcsnk2; +unsigned int constant[XieK_MaxComponents]; +PipeSinkPtr dstsnk; +UdpPtr idc; +int operator; +int combine; +{ + int i; + int combine_op; + + ComparePipeCtxPtr ctx = (ComparePipeCtxPtr) + DdxCreatePipeCtx_( pipe, &ComparePipeElement, FALSE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + /* + ** Copy parameters + */ + CmpSrcSnk1_(ctx) = srcsnk1; + CmpSrcSnk2_(ctx) = srcsnk2; + CmpDstSnk_(ctx) = dstsnk; + + for( i = 0; i < XieK_MaxComponents; i++ ) + if( SnkUdpPtr_(srcsnk1,i) == NULL ) + break; + + CmpCmpIn_(ctx) = i; + CmpCmpOut_(ctx) = combine ? 1 : i; + + /* The "combined" option is only really defined for XieK_EQ and XieK_NE. + * If asked, we'll do combined mode of the other ops using the + * same semantics as for XieK_EQ. + */ + CmpCombOp_(ctx) = (operator == XieK_NE) ? XieK_OR : XieK_AND; + + if( srcsnk2 == NULL ) + { /* Using a constant "image" */ + CmpFunc_(ctx) = CompareTableIC[operator]; + + for( i = 0; i < CmpCmpIn_(ctx); i++ ) + CmpConst_(ctx,i) = constant[i]; + } + else + CmpFunc_(ctx) = CompareTableII[operator]; + + CmpCpp_(ctx) = idc != NULL && idc->UdpA_Base != NULL ? idc : NULL; + + /* Calculate the bounds of the region that will actually be processed */ + if( srcsnk2 == NULL ) + { + CmpRoiX1_(ctx) = SnkX1_(srcsnk1,0); + CmpRoiX2_(ctx) = SnkX2_(srcsnk1,0); + CmpRoiY1_(ctx) = SnkY1_(srcsnk1,0); + CmpRoiY2_(ctx) = SnkY2_(srcsnk1,0); + } + else + { + /* Intersection of two source operands */ + CmpRoiX1_(ctx) = SnkX1_(srcsnk2,0) > SnkX1_(srcsnk1,0) ? + SnkX1_(srcsnk2,0) : SnkX1_(srcsnk1,0); + CmpRoiX2_(ctx) = SnkX2_(srcsnk2,0) < SnkX2_(srcsnk1,0) ? + SnkX2_(srcsnk2,0) : SnkX2_(srcsnk1,0); + CmpRoiY1_(ctx) = SnkY1_(srcsnk2,0) > SnkY1_(srcsnk1,0) ? + SnkY1_(srcsnk2,0) : SnkY1_(srcsnk1,0); + CmpRoiY2_(ctx) = SnkY2_(srcsnk2,0) < SnkY2_(srcsnk1,0) ? + SnkY2_(srcsnk2,0) : SnkY2_(srcsnk1,0); + } + + if( idc != NULL ) + { + /* Further restrict the area to be processed with the CPP/ROI */ + CmpRoiX1_(ctx) = idc->UdpL_X1 > CmpRoiX1_(ctx) ? + idc->UdpL_X1 : CmpRoiX1_(ctx); + CmpRoiX2_(ctx) = idc->UdpL_X2 < CmpRoiX2_(ctx) ? + idc->UdpL_X2 : CmpRoiX2_(ctx); + CmpRoiY1_(ctx) = idc->UdpL_Y1 > CmpRoiY1_(ctx) ? + idc->UdpL_Y1 : CmpRoiY1_(ctx); + CmpRoiY2_(ctx) = idc->UdpL_Y2 < CmpRoiY2_(ctx) ? + idc->UdpL_Y2 : CmpRoiY2_(ctx); + } + + for( i = 0; i < XieK_MaxComponents; i++ ) + { + CmpSrcData1_(ctx,i) = NULL; + CmpSrcData2_(ctx,i) = NULL; + } + + /* Create drains on the sink(s). + * Handle any data format. + * Process a quantum of 1 scanline. + */ + for( i = 0; i < CmpCmpIn_(ctx); i++ ) + { + CmpSrcDrn1_(ctx,i) = DdxRmCreateDrain_( CmpSrcSnk1_(ctx), 1 << i ); + if( !IsPointer_(CmpSrcDrn1_(ctx,i)) ) + return((int)CmpSrcDrn1_(ctx,i)); + DdxRmSetDType_( CmpSrcDrn1_(ctx,i), UdpK_DTypeUndefined, DtM_Any ); + DdxRmSetQuantum_( CmpSrcDrn1_(ctx,i), 1 ); + + if( srcsnk2 != NULL ) + { + CmpSrcDrn2_(ctx,i) = DdxRmCreateDrain_( CmpSrcSnk2_(ctx), 1 << i ); + if( !IsPointer_(CmpSrcDrn2_(ctx,i)) ) + return((int)CmpSrcDrn2_(ctx,i)); + DdxRmSetDType_( CmpSrcDrn2_(ctx,i), UdpK_DTypeUndefined, DtM_Any ); + DdxRmSetQuantum_( CmpSrcDrn2_(ctx,i), 1 ); + } + } + + /* The result is an IDC, so we always produce bits */ + DdxRmSetDType_( CmpDstSnk_(ctx), UdpK_DTypeVU, DtM_VU ); + DdxRmSetQuantum_( CmpDstSnk_(ctx), 1 ); + + return( Success ); +} /* SmiCreateCompare */ + +/***************************************************************************** +** _CompareInitialize +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the COMPARE pipeline element prior to +** activation. +** +** FORMAL PARAMETERS: +** +** ctx - compare pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _CompareInitialize(ctx) +ComparePipeCtxPtr ctx; +{ + int i, status; + + for( i = 0; i < CmpCmpIn_(ctx); i++ ) + { + status = DdxRmInitializePort_( CtxHead_(ctx), CmpSrcDrn1_(ctx,i) ); + if( status != Success ) return( status ); + } + if( CmpSrcSnk2_(ctx) != NULL ) + { + for( i = 0; i < CmpCmpIn_(ctx); i++ ) + { + status = DdxRmInitializePort_( CtxHead_(ctx), CmpSrcDrn2_(ctx,i) ); + if( status != Success ) return( status ); + } + /* If one of the drains is constrained, and the other is unconstrained, + * we have to force conversion of the constrained data to unconstrained + */ + if( DrnDtyp_(CmpSrcDrn1_(ctx,0)) == UdpK_DTypeF || + DrnDtyp_(CmpSrcDrn2_(ctx,0)) == UdpK_DTypeF ) + for( i = 0; i < CmpCmpIn_(ctx); i++ ) + { + DrnDtyp_(CmpSrcDrn1_(ctx,i)) = UdpK_DTypeF; + DrnDtyp_(CmpSrcDrn2_(ctx,i)) = UdpK_DTypeF; + } + } + + status = DdxRmInitializePort_( CtxHead_(ctx), CmpDstSnk_(ctx) ); + + /* Start reading from the first drain */ + CtxInp_(ctx) = CmpSrcDrn1_(ctx,0); + + return( status ); +} + +/***************************************************************************** +** _CompareActivate +** +** FUNCTIONAL DESCRIPTION: +** +** This routine reads the data from the source drain(s) and +** performs the compare operations. +** +** FORMAL PARAMETERS: +** +** ctx - compare pipeline element context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _CompareActivate(ctx) +ComparePipeCtxPtr ctx; +{ + PipeDataPtr dst[XieK_MaxComponents], tmp = NULL; + int dstpos[XieK_MaxComponents], status, i; + + if( CmpSrcSnk2_(ctx) == NULL ) + /* Operating between one image and a constant */ + for( status = Success; status == Success; ) + { + status = CollectComponents( &CmpSrcDrn1_(ctx,0), + &CmpSrcData1_(ctx,0), + ctx, CmpCmpIn_(ctx) ); + if( status != Success ) break; + + /* Allocate a destination data seg for each output component */ + for( i =0; i < CmpCmpOut_(ctx); i++ ) + { + dst[i] = DdxRmAllocData_( CmpDstSnk_(ctx), i, + DatY1_(CmpSrcData1_(ctx,0)), + DatHeight_(CmpSrcData1_(ctx,0)) ); + if( !IsPointer_(dst[i]) ) + status = (int) dst[i]; + } + /* If combining results, get a temporary data seg. */ + if( status == Success && CmpCmpIn_(ctx) > CmpCmpOut_(ctx) ) + { + tmp = DdxRmAllocData_( CmpDstSnk_(ctx),0, + DatY1_(CmpSrcData1_(ctx,0)), + DatHeight_(CmpSrcData1_(ctx,0)) ); + if( !IsPointer_(tmp) ) + status = (int) tmp; + } + if( DatY1_(CmpSrcData1_(ctx,0)) < CmpRoiY1_(ctx) || + DatY1_(CmpSrcData1_(ctx,0)) > CmpRoiY2_(ctx) ) + /* Scanline is outside the ROI - return zeros in the + * destination. + */ + for( i = 0; i < CmpCmpOut_(ctx) && status == Success; i++ ) + { + status = DdxFillRegion_( DatUdpPtr_(dst[i]), + DatX1_(dst[i]), DatY1_(dst[i]), + DatWidth_(dst[i]), + DatHeight_(dst[i]), 0 ); + dstpos[i] = DatPos_(dst[i]); + } + else + { + /* Zero the portions of this line outside the ROI */ + for( i = 0; i < CmpCmpOut_(ctx) && status == Success; i++ ) + { + status = DdxFillRegion_( DatUdpPtr_(dst[i]), /* Left */ + DatX1_(CmpSrcData1_(ctx,0)), + DatY1_(CmpSrcData1_(ctx,0)), + CmpRoiX1_(ctx) + - DatX1_(CmpSrcData1_(ctx,0)), + 1, 0 ); + if( status != Success ) break; + + status = DdxFillRegion_( DatUdpPtr_(dst[i]), /* Right */ + CmpRoiX2_(ctx)+1, + DatY1_(CmpSrcData1_(ctx,0)), + DatX2_(CmpSrcData1_(ctx,0)) + - CmpRoiX2_(ctx), + 1, 0 ); + if( status != Success ) break; + + DatPos_(CmpSrcData1_(ctx,i)) += + (CmpRoiX1_(ctx) - DatX1_(CmpSrcData1_(ctx,i))) * + DatPxlStr_(CmpSrcData1_(ctx,i)); + dstpos[i] = DatPos_(dst[i]); + DatPos_(dst[i]) += + (CmpRoiX1_(ctx) - DatX1_(dst[i])) * DatPxlStr_(dst[i]); + } + + /* Compare all the components of this scanline */ + if( status == Success ) + (*CmpFunc_(ctx))(DatUdpPtr_(CmpSrcData1_(ctx,0)), + CmpConst_(ctx,0), + DatUdpPtr_(dst[0]), + CmpCpp_(ctx), + CmpRoiY1_(ctx), + CmpRoiX1_(ctx), + CmpRoiX2_(ctx)); + + for( i = 1; i < CmpCmpIn_(ctx) && status == Success; i++ ) + { + if( CmpCmpIn_(ctx) > CmpCmpOut_(ctx) ) + { + /* Combining output */ + DatCmpIdx_(tmp) = i; + (*CmpFunc_(ctx))(DatUdpPtr_(CmpSrcData1_(ctx,i)), + CmpConst_(ctx,i), + DatUdpPtr_(tmp), + CmpCpp_(ctx), + CmpRoiY1_(ctx), + CmpRoiX1_(ctx), + CmpRoiX2_(ctx)); + status = DdxLogical_( DatUdpPtr_(dst[0]), + DatUdpPtr_(tmp), + NULL, DatUdpPtr_(dst[0]), + NULL, CmpCombOp_(ctx) ); + } + else + /* Not combining output */ + (*CmpFunc_(ctx))(DatUdpPtr_(CmpSrcData1_(ctx,i)), + CmpConst_(ctx,i), + DatUdpPtr_(dst[i]), + CmpCpp_(ctx), + CmpRoiY1_(ctx), + CmpRoiX1_(ctx), + CmpRoiX2_(ctx)); + } + } + for( i = 0; i < CmpCmpOut_(ctx); i++ ) + if( IsPointer_(dst[i]) ) + { + DatPos_(dst[i]) = dstpos[i]; + if( status == Success ) + status = DdxRmPutData_( CmpDstSnk_(ctx), dst[i] ); + else + DdxRmDeallocData_( dst[i] ); + dst[i] = NULL; + } + for( i = 0; i < CmpCmpIn_(ctx); i++ ) + CmpSrcData1_(ctx,i) = DdxRmDeallocData_( CmpSrcData1_(ctx,i) ); + + if( tmp != NULL ) + tmp = DdxRmDeallocData_( tmp ); + } /* end for */ + + else + /* Operating between two images */ + for( status = Success; status == Success; ) + { + status = CollectComponents( &CmpSrcDrn1_(ctx,0), + &CmpSrcData1_(ctx,0), + ctx, CmpCmpIn_(ctx) ); + if( status != Success ) break; + + if( DatY1_(CmpSrcData1_(ctx,0)) <= CmpRoiY2_(ctx) ) + { /* Keep the two streams synchronized as long as we still + * need data from the second image */ + status = CollectComponents( &CmpSrcDrn2_(ctx,0), + &CmpSrcData2_(ctx,0), + ctx, CmpCmpIn_(ctx) ); + if( status != Success ) break; + } + /* Allocate a destination data seg for each output component */ + for( i =0; i < CmpCmpOut_(ctx); i++ ) + { + dst[i] = DdxRmAllocData_( CmpDstSnk_(ctx), i, + DatY1_(CmpSrcData1_(ctx,0)), + DatHeight_(CmpSrcData1_(ctx,0)) ); + if( !IsPointer_(dst[i]) ) + status = (int) dst[i]; + } + /* If combining results, get a temporary data seg. */ + if( CmpCmpIn_(ctx) > CmpCmpOut_(ctx) ) + { + tmp = DdxRmAllocData_( CmpDstSnk_(ctx), 0, + DatY1_(CmpSrcData1_(ctx,0)), + DatHeight_(CmpSrcData1_(ctx,0)) ); + if( !IsPointer_(tmp) ) + status = (int) tmp; + } + if( DatY1_(CmpSrcData1_(ctx,0)) < CmpRoiY1_(ctx) || + DatY1_(CmpSrcData1_(ctx,0)) > CmpRoiY2_(ctx) ) + /* Scanline is outside the ROI - return zeros in the + * destination. + */ + for( i = 0; i < CmpCmpOut_(ctx) && status == Success; i++ ) + { + status = DdxFillRegion_( DatUdpPtr_(dst[i]), + DatX1_(dst[i]), DatY1_(dst[i]), + DatWidth_(dst[i]), + DatHeight_(dst[i]), 0 ); + dstpos[i] = DatPos_(dst[i]); + } + else + { + /* Zero the portions of this line outside the ROI */ + for( i = 0; i < CmpCmpOut_(ctx) && status == Success; i++ ) + { + status = DdxFillRegion_( DatUdpPtr_(dst[i]), /* Left */ + DatX1_(CmpSrcData1_(ctx,0)), + DatY1_(CmpSrcData1_(ctx,0)), + CmpRoiX1_(ctx) + - DatX1_(CmpSrcData1_(ctx,0)), + 1, 0 ); + if( status != Success ) break; + + status = DdxFillRegion_( DatUdpPtr_(dst[i]), /* Right */ + CmpRoiX2_(ctx)+1, + DatY1_(CmpSrcData1_(ctx,0)), + DatX2_(CmpSrcData1_(ctx,0)) + - CmpRoiX2_(ctx), + 1, 0); + if( status != Success ) break; + + DatPos_(CmpSrcData1_(ctx,i)) += + (CmpRoiX1_(ctx) - DatX1_(CmpSrcData1_(ctx,i))) * + DatPxlStr_(CmpSrcData1_(ctx,i)); + dstpos[i] = DatPos_(dst[i]); + DatPos_(dst[i]) += + (CmpRoiX1_(ctx) - DatX1_(dst[i])) * DatPxlStr_(dst[i]); + } + /* Compare all the components of this scanline */ + if( status == Success ) + (*CmpFunc_(ctx))(DatUdpPtr_(CmpSrcData1_(ctx,0)), + DatUdpPtr_(CmpSrcData2_(ctx,0)), + DatUdpPtr_(dst[0]), + CmpCpp_(ctx), + CmpRoiY1_(ctx), + CmpRoiX1_(ctx), + CmpRoiX2_(ctx)); + + for( i = 1; i < CmpCmpIn_(ctx) && status == Success; i++ ) + if( CmpCmpIn_(ctx) > CmpCmpOut_(ctx) ) + { + /* Combining output */ + DatCmpIdx_(tmp) = i; + (*CmpFunc_(ctx))(DatUdpPtr_(CmpSrcData1_(ctx,i)), + DatUdpPtr_(CmpSrcData2_(ctx,i)), + DatUdpPtr_(tmp), + CmpCpp_(ctx), + CmpRoiY1_(ctx), + CmpRoiX1_(ctx), + CmpRoiX2_(ctx)); + status = DdxLogical_( DatUdpPtr_(dst[0]), + DatUdpPtr_(tmp), + NULL, DatUdpPtr_(dst[0]), + NULL, CmpCombOp_(ctx) ); + } + else + /* Not combining output */ + (*CmpFunc_(ctx))(DatUdpPtr_(CmpSrcData1_(ctx,i)), + DatUdpPtr_(CmpSrcData2_(ctx,i)), + DatUdpPtr_(dst[i]), + CmpCpp_(ctx), + CmpRoiY1_(ctx), + CmpRoiX1_(ctx), + CmpRoiX2_(ctx)); + } + for( i = 0; i < CmpCmpOut_(ctx); i++ ) + if( IsPointer_(dst[i]) ) + { + DatPos_(dst[i]) = dstpos[i]; + if( status == Success ) + status = DdxRmPutData_( CmpDstSnk_(ctx), dst[i] ); + else + DdxRmDeallocData_( dst[i] ); + dst[i] = NULL; + } + for( i = 0; i < CmpCmpIn_(ctx); i++ ) + { + CmpSrcData1_(ctx,i) = DdxRmDeallocData_( CmpSrcData1_(ctx,i) ); + if( CmpSrcData2_(ctx,i) != NULL ) + CmpSrcData2_(ctx,i) = + DdxRmDeallocData_( CmpSrcData2_(ctx,i) ); + } + if( tmp != NULL ) + tmp = DdxRmDeallocData_( tmp ); + } /* end for */ + return( status > 0 ? status : Success ); +} /* end _CompareActivate */ + +/***************************************************************************** +** _CompareFlush +** +** FUNCTIONAL DESCRIPTION: +** +** This routine is called when all preceding pipeline stages have +** completed. +** +** +** FORMAL PARAMETERS: +** +** ctx - compare pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _CompareFlush(ctx) +ComparePipeCtxPtr ctx; +{ + PipeDataPtr src2; + int i; + + _CompareAbort(ctx); + + /* If the second image operand has more scanlines that the first image, + * we will have unprocessed scanlines on the image2 drains. Flush them. + */ + if( CmpSrcSnk2_(ctx) != NULL ) + for( i = 0; i < CmpCmpIn_(ctx); i++ ) + { + src2 = DdxRmGetData_( ctx, CmpSrcDrn2_(ctx,i) ); + + if( IsPointer_(src2) ) + DdxRmDeallocData_( src2 ); + + else if( src2 != NULL ) + return( (int) src2 ); + } + + return( Success ); +} + +/***************************************************************************** +** _CompareAbort +** +** FUNCTIONAL DESCRIPTION: +** +** This routine is called when all preceding pipeline stages have +** completed. +** +** +** FORMAL PARAMETERS: +** +** ctx - compare pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _CompareAbort(ctx) +ComparePipeCtxPtr ctx; +{ + int i; + + for( i = 0; i < CmpCmpIn_(ctx); i++ ) + { + if( IsPointer_(CmpSrcData1_(ctx,i)) ) + CmpSrcData1_(ctx,i) = DdxRmDeallocData_( CmpSrcData1_(ctx,i) ); + if( IsPointer_(CmpSrcData2_(ctx,i)) ) + CmpSrcData2_(ctx,i) = DdxRmDeallocData_( CmpSrcData2_(ctx,i) ); + } + return( Success ); +} + +/***************************************************************************** +** _CompareDestroy +** +** FUNCTIONAL DESCRIPTION: +** +** This routine deallocates all resources allocated by the COMPARE +** pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - compare pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _CompareDestroy(ctx) +ComparePipeCtxPtr ctx; +{ + int i; + + for( i = 0; i < CmpCmpIn_(ctx); i++ ) + { + CmpSrcDrn1_(ctx,i) = DdxRmDestroyDrain_( CmpSrcDrn1_(ctx,i) ); + if( CmpSrcSnk2_(ctx) != NULL ) + CmpSrcDrn2_(ctx,i) = DdxRmDestroyDrain_( CmpSrcDrn2_(ctx,i) ); + } + + return( Success ); +} + +/***************************************************************************** +** SmiCompare +** +** FUNCTIONAL DESCRIPTION: +** +** This routine performs a non-pipelined compare operator, which +** executes an compare operator between two photomaps, or between +** a photomap and a constant. +** +** FORMAL PARAMETERS: +** +** srcudp1 - Pointer to a UDP describing the first source operand. +** srcudp2 - Pointer to a UDP describing the second source operand. +** constant- Array of constants supplied if srcudp2 is NULL. +** dstudp - Pointer to a UDP describing the destination buffer. +** idc - Pointer to a UDP describing the Region of Interest, +** or Control Processing Plane. +** (NULL if no IDC) +** operator-Code for the operation being performed. +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCompare( srcudp1, srcudp2, constant, dstudp, idc, operator ) +UdpPtr srcudp1; +UdpPtr srcudp2; +unsigned int constant[]; +UdpPtr dstudp; +UdpPtr idc; +int operator; +{ + UdpPtr cpp, src1 = NULL, src2 = NULL, dst = NULL; + float fconst; + long int pixels, scanline, status; + long int X1, X2, Y1, Y2; /* src/destination common bounds */ + long int x1, x2, y1, y2; /* src/destination/ROI common bounds */ + + + /* + ** Allocate the destination image array + */ + if( dstudp->UdpA_Base == NULL ) + { + dstudp->UdpA_Base = DdxMallocBits_( dstudp->UdpL_ArSize ); + if( dstudp->UdpA_Base == NULL ) return( BadAlloc ); + } + + /* + * Determine maximum common dimensions between source1 and destination, + * which is the defined region of output. + */ + X1 = srcudp1->UdpL_X1 > dstudp->UdpL_X1 ? + srcudp1->UdpL_X1 : dstudp->UdpL_X1; + X2 = srcudp1->UdpL_X2 < dstudp->UdpL_X2 ? + srcudp1->UdpL_X2 : dstudp->UdpL_X2; + Y1 = srcudp1->UdpL_Y1 > dstudp->UdpL_Y1 ? + srcudp1->UdpL_Y1 : dstudp->UdpL_Y1; + Y2 = srcudp1->UdpL_Y2 < dstudp->UdpL_Y2 ? + srcudp1->UdpL_Y2 : dstudp->UdpL_Y2; + + /* + * Restrict the area to be processed by finding the intersection of + * the region of output and the second source operand (if used). + */ + if (srcudp2 == NULL) { + x1 = X1; x2 = X2; + y1 = Y1; y2 = Y2; + } else { + x1 = srcudp2->UdpL_X1 > X1 ? srcudp2->UdpL_X1 : X1; + x2 = srcudp2->UdpL_X2 < X2 ? srcudp2->UdpL_X2 : X2; + y1 = srcudp2->UdpL_Y1 > Y1 ? srcudp2->UdpL_Y1 : Y1; + y2 = srcudp2->UdpL_Y2 < Y2 ? srcudp2->UdpL_Y2 : Y2; + } + + /* + * Further restrict the area to be processed by finding the intersection + * with the IDC (ROI or CPP). + */ + if (idc != NULL) { + x1 = idc->UdpL_X1 > x1 ? idc->UdpL_X1 : x1; + x2 = idc->UdpL_X2 < x2 ? idc->UdpL_X2 : x2; + y1 = idc->UdpL_Y1 > y1 ? idc->UdpL_Y1 : y1; + y2 = idc->UdpL_Y2 < y2 ? idc->UdpL_Y2 : y2; + } + + cpp = idc != NULL && idc->UdpA_Base != NULL ? idc : NULL; + + /* If one of the input UDP's is unconstrained, then convert the other */ + src1 = CompareGetTempUdp( srcudp1, srcudp2, y1, x1, x2 ); + if( !IsPointer_(src1) ) + { + status = (int) src1; + goto clean_up; + } + if( srcudp2 != NULL ) + { + src2 = CompareGetTempUdp( srcudp2, srcudp1, y1, x1, x2 ); + if( !IsPointer_(src2) ) + { + status = (int) src2; + goto clean_up; + } + } + dst = CompareGetTempUdp(dstudp, NULL, y1, x1, x2); + if( !IsPointer_(dst) ) + { + status = (int) dst; + goto clean_up; + } + + /* Return zero for the scanlines outside the ROI */ + /* Top */ + status = DdxFillRegion_( dstudp, X1, Y1, X2-X1+1, y1 - Y1, 0 ); + if( status != Success ) goto clean_up; + /* Bottom */ + status = DdxFillRegion_( dstudp, X1, y2+1, X2-X1+1, Y2 - y2, 0); + if( status != Success ) goto clean_up; + /* Left */ + status = DdxFillRegion_( dstudp, X1, y1, x1 - X1, y2 - y1 + 1, 0 ); + if( status != Success ) goto clean_up; + /* Right */ + status = DdxFillRegion_( dstudp, x2+1, y1, X2 - x2, y2 - y1 + 1, 0 ); + if( status != Success ) goto clean_up; + + /* Now perform the compare operation over the region-of-interest */ + + if( srcudp2 != NULL ) + /* Image-to-image operation */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + /* Get a UDP pointing to this scanline */ + status = CompareConvertScanline(srcudp1, src1); + if( status != Success ) break; + status = CompareConvertScanline(srcudp2, src2); + if( status != Success ) break; + status = CompareConvertScanline(dstudp, dst ); + if( status != Success ) break; + + (*CompareTableII[operator])(src1, src2, + dst, + cpp, y1, x1, x2); + } + else + /* Image-to-constant operation */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + /* Get a UDP pointing to this scanline */ + status = CompareConvertScanline(srcudp1, src1); + if( status != Success ) break; + status = CompareConvertScanline(dstudp, dst ); + if( status != Success ) break; + (*CompareTableIC[operator])(src1, constant[src1->UdpL_CompIdx], + dst, + cpp, y1, x1, x2); + } + + /* Cleanup the temporary descriptors */ +clean_up : + if( IsPointer_(src1) ) + CompareDestroyTempUdp( src1, srcudp1 ); + if( IsPointer_(src2) ) + CompareDestroyTempUdp( src2, srcudp2 ); + if( IsPointer_(dst) ) + CompareDestroyTempUdp( dst, dstudp ); + + return( status ); +} /* end SmiCompare */ + +/***************************************************************************** +** Compare processing routines +** +** FUNCTIONAL DESCRIPTION: +** +** These routines perform the actual compare operation over selected +** portion of a scanline. A separate routine is used for each +** type of operation. +** +** FORMAL PARAMETERS: +** +** src1 - Pointer to a UDP describing the first source operand. +** src2 - Pointer to a UDP describing the second source operand. +** const - Constant "image" value if image-to-constant. +** dst - Pointer to a UDP describing the destination buffer. +** cpp - Pointer to a UDP describing the Control Processing Plane. +** (NULL if no CPP) +** y1 - The y corrdinate of the beginning of the region to +* process. +** x1 - The x coordinate of the left endpoint of the CPP, or +** the ROI. +** x2 - The x coordinate of the right endpoint of the CPP, or +** the ROI. +** +*****************************************************************************/ +static void CompareLTII(src1, src2, dst, cpp, y1, x1, x2) +UdpPtr src1; +UdpPtr src2; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + + unsigned int src1_off; + unsigned int src2_off; + unsigned int dst_off; + long int cpppxloff; + int cppbit; + + int result; + int src1_mask; + int src2_mask; + + src1_off = src1->UdpL_Pos; + src2_off = src2->UdpL_Pos; + dst_off = dst->UdpL_Pos; + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src1->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + if (src1->UdpB_DType != UdpK_DTypeF) { + + /* Constrained types */ + src1_mask = (1 << src1->UdpW_PixelLength) -1; + src2_mask = (1 << src2->UdpW_PixelLength) -1; + + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = GET_VALUE_(src1->UdpA_Base, src1_off, src1_mask) < + GET_VALUE_(src2->UdpA_Base, src2_off, src2_mask); + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src1_off+=src1->UdpL_PxlStride; + src2_off+=src2->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + } + + } else { + + /* Unconstrained data */ + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = *(float *)(src1->UdpA_Base + (src1_off >> 3)) < + *(float *)(src2->UdpA_Base + (src2_off >> 3)); + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src1_off+=src1->UdpL_PxlStride; + src2_off+=src2->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + + } + } +} /* end CompareLTII */ + +static void CompareLEII(src1, src2, dst, cpp, y1, x1, x2) +UdpPtr src1; +UdpPtr src2; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + + unsigned int src1_off; + unsigned int src2_off; + unsigned int dst_off; + long int cpppxloff; + int cppbit; + + int result; + int src1_mask; + int src2_mask; + + src1_off = src1->UdpL_Pos; + src2_off = src2->UdpL_Pos; + dst_off = dst->UdpL_Pos; + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src1->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + if (src1->UdpB_DType != UdpK_DTypeF) { + + /* Constrained types */ + src1_mask = (1 << src1->UdpW_PixelLength) -1; + src2_mask = (1 << src2->UdpW_PixelLength) -1; + + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = GET_VALUE_(src1->UdpA_Base, src1_off, src1_mask) + <= GET_VALUE_(src2->UdpA_Base, src2_off, src2_mask); + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src1_off+=src1->UdpL_PxlStride; + src2_off+=src2->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + } + + } else { + + /* Unconstrained data */ + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = *(float *)(src1->UdpA_Base + (src1_off >> 3)) <= + *(float *)(src2->UdpA_Base + (src2_off >> 3)); + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src1_off+=src1->UdpL_PxlStride; + src2_off+=src2->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + + } + } +} /* end CompareLEII */ + +static void CompareEQII(src1, src2, dst, cpp, y1, x1, x2) +UdpPtr src1; +UdpPtr src2; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + + unsigned int src1_off; + unsigned int src2_off; + unsigned int dst_off; + long int cpppxloff; + int cppbit; + + int result; + int src1_mask; + int src2_mask; + + src1_off = src1->UdpL_Pos; + src2_off = src2->UdpL_Pos; + dst_off = dst->UdpL_Pos; + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src1->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + if (src1->UdpB_DType != UdpK_DTypeF) { + + /* Constrained types */ + src1_mask = (1 << src1->UdpW_PixelLength) -1; + src2_mask = (1 << src2->UdpW_PixelLength) -1; + + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = GET_VALUE_(src1->UdpA_Base, src1_off, src1_mask) + == GET_VALUE_(src2->UdpA_Base, src2_off, src2_mask); + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src1_off+=src1->UdpL_PxlStride; + src2_off+=src2->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + } + + } else { + + /* Unconstrained data */ + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = *(float *)(src1->UdpA_Base + (src1_off >> 3)) == + *(float *)(src2->UdpA_Base + (src2_off >> 3)); + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src1_off+=src1->UdpL_PxlStride; + src2_off+=src2->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + + } + } +} /* end CompareEQII */ + +static void CompareNEII(src1, src2, dst, cpp, y1, x1, x2) +UdpPtr src1; +UdpPtr src2; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + + unsigned int src1_off; + unsigned int src2_off; + unsigned int dst_off; + long int cpppxloff; + int cppbit; + + int result; + int src1_mask; + int src2_mask; + + src1_off = src1->UdpL_Pos; + src2_off = src2->UdpL_Pos; + dst_off = dst->UdpL_Pos; + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src1->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + if (src1->UdpB_DType != UdpK_DTypeF) { + + /* Constrained types */ + src1_mask = (1 << src1->UdpW_PixelLength) -1; + src2_mask = (1 << src2->UdpW_PixelLength) -1; + + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = GET_VALUE_(src1->UdpA_Base, src1_off, src1_mask) + != GET_VALUE_(src2->UdpA_Base, src2_off, src2_mask); + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src1_off+=src1->UdpL_PxlStride; + src2_off+=src2->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + } + + } else { + + /* Unconstrained data */ + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = *(float *)(src1->UdpA_Base + (src1_off >> 3)) != + *(float *)(src2->UdpA_Base + (src2_off >> 3)); + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src1_off+=src1->UdpL_PxlStride; + src2_off+=src2->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + + } + } +} /* end CompareNEII */ + +static void CompareGTII(src1, src2, dst, cpp, y1, x1, x2) +UdpPtr src1; +UdpPtr src2; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + + unsigned int src1_off; + unsigned int src2_off; + unsigned int dst_off; + long int cpppxloff; + int cppbit; + + int result; + int src1_mask; + int src2_mask; + + src1_off = src1->UdpL_Pos; + src2_off = src2->UdpL_Pos; + dst_off = dst->UdpL_Pos; + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src1->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + if (src1->UdpB_DType != UdpK_DTypeF) { + + /* Constrained types */ + src1_mask = (1 << src1->UdpW_PixelLength) -1; + src2_mask = (1 << src2->UdpW_PixelLength) -1; + + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = GET_VALUE_(src1->UdpA_Base, src1_off, src1_mask) > + GET_VALUE_(src2->UdpA_Base, src2_off, src2_mask); + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src1_off+=src1->UdpL_PxlStride; + src2_off+=src2->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + } + + } else { + + /* Unconstrained data */ + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = *(float *)(src1->UdpA_Base + (src1_off >> 3)) > + *(float *)(src2->UdpA_Base + (src2_off >> 3)); + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src1_off+=src1->UdpL_PxlStride; + src2_off+=src2->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + + } + } +} /* end CompareGTII */ + +static void CompareGEII(src1, src2, dst, cpp, y1, x1, x2) +UdpPtr src1; +UdpPtr src2; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + + unsigned int src1_off; + unsigned int src2_off; + unsigned int dst_off; + long int cpppxloff; + int cppbit; + + int result; + int src1_mask; + int src2_mask; + + src1_off = src1->UdpL_Pos; + src2_off = src2->UdpL_Pos; + dst_off = dst->UdpL_Pos; + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src1->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + if (src1->UdpB_DType != UdpK_DTypeF) { + + /* Constrained types */ + src1_mask = (1 << src1->UdpW_PixelLength) -1; + src2_mask = (1 << src2->UdpW_PixelLength) -1; + + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = GET_VALUE_(src1->UdpA_Base, src1_off, src1_mask) + >= GET_VALUE_(src2->UdpA_Base, src2_off, src2_mask); + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src1_off+=src1->UdpL_PxlStride; + src2_off+=src2->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + } + + } else { + + /* Unconstrained data */ + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = *(float *)(src1->UdpA_Base + (src1_off >> 3)) >= + *(float *)(src2->UdpA_Base + (src2_off >> 3)); + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src1_off+=src1->UdpL_PxlStride; + src2_off+=src2->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + + } + } +} /* end CompareGEII */ + +static void CompareLTIC(src, constant, dst, cpp, y1, x1, x2) + UdpPtr src; + unsigned long int constant; + UdpPtr dst; + UdpPtr cpp; + long int y1; + long int x1; + long int x2; +{ + int pixel; + + unsigned int src_off; + unsigned int dst_off; + long int cpppxloff; + int cppbit; + + int result; + int src_mask; + float fconst; + + src_off = src->UdpL_Pos; + dst_off = dst->UdpL_Pos; + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + if (src->UdpB_DType != UdpK_DTypeF) { + + /* Constrained types */ + src_mask = (1 << src->UdpW_PixelLength) -1; + + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = GET_VALUE_(src->UdpA_Base, src_off, src_mask) + < constant; + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src_off+=src->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + + } + } else { + + /* Unconstrained data */ + fconst = constant; + + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = *(float *)(src->UdpA_Base + (src_off >> 3)) + < fconst; + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src_off+=src->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + + } + } +} /* end CompareLTIC */ + +static void CompareLEIC(src, constant, dst, cpp, y1, x1, x2) + UdpPtr src; + unsigned long int constant; + UdpPtr dst; + UdpPtr cpp; + long int y1; + long int x1; + long int x2; +{ + int pixel; + + unsigned int src_off; + unsigned int dst_off; + long int cpppxloff; + int cppbit; + + int result; + int src_mask; + float fconst; + + src_off = src->UdpL_Pos; + dst_off = dst->UdpL_Pos; + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + if (src->UdpB_DType != UdpK_DTypeF) { + + /* Constrained types */ + src_mask = (1 << src->UdpW_PixelLength) -1; + + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = GET_VALUE_(src->UdpA_Base, src_off, src_mask) + <= constant; + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src_off+=src->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + + } + } else { + + /* Unconstrained data */ + fconst = constant; + + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = *(float *)(src->UdpA_Base + (src_off >> 3)) + <= fconst; + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src_off+=src->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + + } + } +} /* end CompareLEIC */ + +static void CompareEQIC(src, constant, dst, cpp, y1, x1, x2) + UdpPtr src; + unsigned long int constant; + UdpPtr dst; + UdpPtr cpp; + long int y1; + long int x1; + long int x2; +{ + int pixel; + + unsigned int src_off; + unsigned int dst_off; + long int cpppxloff; + int cppbit; + + int result; + int src_mask; + float fconst; + + src_off = src->UdpL_Pos; + dst_off = dst->UdpL_Pos; + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + if (src->UdpB_DType != UdpK_DTypeF) { + + /* Constrained types */ + src_mask = (1 << src->UdpW_PixelLength) -1; + + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = GET_VALUE_(src->UdpA_Base, src_off, src_mask) + == constant; + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src_off+=src->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + + } + } else { + + /* Unconstrained data */ + fconst = constant; + + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = *(float *)(src->UdpA_Base + (src_off >> 3)) + == fconst; + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src_off+=src->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + + } + } +} /* end CompareEQIC */ + +static void CompareNEIC(src, constant, dst, cpp, y1, x1, x2) + UdpPtr src; + unsigned long int constant; + UdpPtr dst; + UdpPtr cpp; + long int y1; + long int x1; + long int x2; +{ + int pixel; + + unsigned int src_off; + unsigned int dst_off; + long int cpppxloff; + int cppbit; + + int result; + int src_mask; + float fconst; + + src_off = src->UdpL_Pos; + dst_off = dst->UdpL_Pos; + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + if (src->UdpB_DType != UdpK_DTypeF) { + + /* Constrained types */ + src_mask = (1 << src->UdpW_PixelLength) -1; + + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = GET_VALUE_(src->UdpA_Base, src_off, src_mask) + != constant; + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src_off+=src->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + + } + } else { + + /* Unconstrained data */ + fconst = constant; + + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = *(float *)(src->UdpA_Base + (src_off >> 3)) + != fconst; + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src_off+=src->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + + } + } +} /* end CompareNEIC */ + +static void CompareGTIC(src, constant, dst, cpp, y1, x1, x2) + UdpPtr src; + unsigned long int constant; + UdpPtr dst; + UdpPtr cpp; + long int y1; + long int x1; + long int x2; +{ + int pixel; + + unsigned int src_off; + unsigned int dst_off; + long int cpppxloff; + int cppbit; + + int result; + int src_mask; + float fconst; + + src_off = src->UdpL_Pos; + dst_off = dst->UdpL_Pos; + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + if (src->UdpB_DType != UdpK_DTypeF) { + + /* Constrained types */ + src_mask = (1 << src->UdpW_PixelLength) -1; + + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = GET_VALUE_(src->UdpA_Base, src_off, src_mask) + > constant; + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src_off+=src->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + + } + } else { + + /* Unconstrained data */ + fconst = constant; + + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = *(float *)(src->UdpA_Base + (src_off >> 3)) + > fconst; + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src_off+=src->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + + } + } +} /* end CompareGTIC */ + +static void CompareGEIC(src, constant, dst, cpp, y1, x1, x2) + UdpPtr src; + unsigned long int constant; + UdpPtr dst; + UdpPtr cpp; + long int y1; + long int x1; + long int x2; +{ + int pixel; + + unsigned int src_off; + unsigned int dst_off; + long int cpppxloff; + int cppbit; + + int result; + int src_mask; + float fconst; + + src_off = src->UdpL_Pos; + dst_off = dst->UdpL_Pos; + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + + if (src->UdpB_DType != UdpK_DTypeF) { + + /* Constrained types */ + src_mask = (1 << src->UdpW_PixelLength) -1; + + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = GET_VALUE_(src->UdpA_Base, src_off, src_mask) + >= constant; + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src_off+=src->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + + } + } else { + + /* Unconstrained data */ + fconst = constant; + + for (pixel = x1; pixel <= x2; pixel++){ + + result = 0; + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + result = *(float *)(src->UdpA_Base + (src_off >> 3)) + >= fconst; + + PUT_VALUE_(dst->UdpA_Base, dst_off, result, 1); + + src_off+=src->UdpL_PxlStride; + dst_off+=dst->UdpL_PxlStride; + + } + } +} /* end CompareGEIC */ + +/***************************************************************************** +** CompareGetTempUdp +** +** FUNCTIONAL DESCRIPTION: +** +** If either of the input UDP's are float data, provide a UDP +** which describes the source UDP as float data. Otherwise, +** provide a UDP which points to a single scan line of the source +** data. In either case, initialize the UDP so it points to the +** scanline before the first to be processed (CompareConvertScanline +** increments before converting). +** +** FORMAL PARAMETERS: +** +** src - Pointer to source UDP +** other - Pointer to the other UDP +** y1 - First scanline we need +** x1 - Leftmost pixel we need +** x2 - Rightmost pixel we need +** +** FUNCTION VALUE: +** +** Returns a pointer to a UDP describing the data. +** +*****************************************************************************/ +static UdpPtr CompareGetTempUdp(src, other, y1, x1, x2) + UdpPtr src; + UdpPtr other; + long int y1; + long int x1, x2; +{ + UdpPtr dst; + + dst = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( dst == NULL ) return( (UdpPtr) BadAlloc ); + + if( other && other->UdpB_DType == UdpK_DTypeF + && src->UdpB_DType != UdpK_DTypeF ) + { + dst->UdpW_PixelLength = sizeof(float) * 8; + dst->UdpB_DType = UdpK_DTypeF; + dst->UdpB_Class = UdpK_ClassA; + dst->UdpL_PxlStride = dst->UdpW_PixelLength; + dst->UdpL_PxlPerScn = x2 - x1 + 1; + dst->UdpL_ScnStride = dst->UdpL_PxlPerScn * dst->UdpL_PxlStride; + dst->UdpL_ArSize = dst->UdpL_PxlPerScn * sizeof(float) * 8; + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + { + DdxFree_(dst); + return( (UdpPtr) BadAlloc ); + } + dst->UdpL_Pos = 0; + dst->UdpL_CompIdx = src->UdpL_CompIdx; + dst->UdpL_Levels = src->UdpL_Levels; + } + else + { + *dst = *src; + dst->UdpL_PxlPerScn = x2 - x1 + 1; + dst->UdpL_ScnStride = dst->UdpL_PxlPerScn * dst->UdpL_PxlStride; + dst->UdpL_Pos += ((y1 - src->UdpL_Y1 -1) * src->UdpL_ScnStride + + (x1 - src->UdpL_X1) * src->UdpL_PxlStride); + } + /* One scanline UDP */ + dst->UdpL_X1 = x1; + dst->UdpL_X2 = x2; + dst->UdpL_Y1 = y1 - 1; + dst->UdpL_Y2 = y1 - 1; + dst->UdpL_ScnCnt = 1; + + return( dst ); +} /* end CompareGetTempUdp */ + +/***************************************************************************** +** CompareDestroyTempUdp +** +** FUNCTIONAL DESCRIPTION: +** +** Free a UDP created by CompareGetTempUdp. +** +** FORMAL PARAMETERS: +** +** udp - Pointer to the udp to free. +** realudp - Pointer to a udp which might actually own the storage +** pointed to by udp. +** +*****************************************************************************/ +static void CompareDestroyTempUdp( udp, realudp ) +UdpPtr udp; +UdpPtr realudp; + +{ + if( IsPointer_(udp->UdpA_Base) && udp->UdpA_Base != realudp->UdpA_Base ) + DdxFreeBits_( udp->UdpA_Base ); + DdxFree_( udp ); +} /* end CompareDestroyTempUdp */ + +/***************************************************************************** +** CollectComponents +** +** FUNCTIONAL DESCRIPTION: +** +** Collect the next quantum from each drain, until all +** drains have provided one scanline. +** +** FORMAL PARAMETERS: +** +** drain - Array of pointers to the source drains. +** data - Array to receive the data segment pointers. +** ctx - Current pipe context. +** ncmp - Number of components (drains) for the image. +** +** FUNCTION VALUE: +** +** Success if all drains have contributed, else -1 or error code. +** +*****************************************************************************/ +static int CollectComponents(drain, data, ctx, ncmp) +PipeDrainPtr drain[XieK_MaxComponents]; +PipeDataPtr data[XieK_MaxComponents]; +ComparePipeCtxPtr ctx; +int ncmp; +{ + int i; + + /* Collect each component of the current quantum */ + for( i = 0; i < ncmp; i++ ) + if( data[i] == NULL ) + { + data[i] = DdxRmGetData_( ctx, drain[i] ); + if( !IsPointer_(data[i]) ) + return( data[i] == NULL ? -1 : (int) data[i] ); + } + return( Success ); +} /* end CollectComponents */ + +/***************************************************************************** +** CompareConvertScanline +** +** FUNCTIONAL DESCRIPTION: +** +** Adjust a UDP to point to the specified scanline of the source +** UDP. If the destination udp is of type float, convert the +** source data if necessary. +** +** FORMAL PARAMETERS: +** +** src - Pointer to the source UDP. +** dst - Pointer to the UDP to be adjusted. +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int CompareConvertScanline(src, dst) + UdpPtr src; + UdpPtr dst; +{ + int status = Success; + + dst->UdpL_Y1++; + dst->UdpL_Y2++; + + if (dst->UdpB_DType == UdpK_DTypeF && src->UdpB_DType != UdpK_DTypeF) + status = DdxConvert_( src, dst, XieK_MoveMode ); + else + dst->UdpL_Pos += src->UdpL_ScnStride; + + return( status ); +} /* end CompareConvertScanline */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiCompare.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiCompare.h new file mode 100644 index 0000000..5ab1fb0 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiCompare.h @@ -0,0 +1,166 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* DEC/CMS REPLACEMENT HISTORY, Element SMICOMPARE.H */ +/* *3 1-NOV-1990 10:40:59 SHELLEY "first pass adding error handling" */ +/* *2 25-SEP-1990 10:49:15 HENNESSY "Add DIX -> DDX interface change" */ +/* *1 10-JUL-1990 16:48:42 GREBUS "Defns for Compare operator" */ +/* DEC/CMS REPLACEMENT HISTORY, Element SMICOMPARE.H */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the COMPARE pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.0 +** RISC ULTRIX V3.0 +** +** AUTHOR(S): +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Fri Jul 6 16:32:27 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMICOMPARE +#define _SMICOMPARE + +/* +** Include files +*/ +#include + +/* +** Function reference +*/ +int SmiCompare(); +int SmiCreateCompare(); + + +/* +** Structure definitions and Typedefs +*/ + +/* +** Compare pipeline context block. +*/ +typedef struct _ComparePipeCtx { + PipeElementCommonPart common; + struct _ComparePart { + PipeSinkPtr srcsnk1; + PipeSinkPtr srcsnk2; + PipeSinkPtr dstsnk; + PipeDrainPtr srcdrn1[XieK_MaxComponents]; + PipeDrainPtr srcdrn2[XieK_MaxComponents]; + PipeDataPtr srcdata1[XieK_MaxComponents]; + PipeDataPtr srcdata2[XieK_MaxComponents]; + unsigned long int constant[XieK_MaxComponents]; + int ncmp_in; + int ncmp_out; + int combine_op; + UdpPtr cpp; + long int x1; + long int x2; + long int y1; + long int y2; + void (*function)(); + } ComparePart; +} ComparePipeCtx, *ComparePipeCtxPtr; + +/* +** MACRO definitions +*/ + +/* +** Pipeline context, Compare part, access MACROs +*/ +#define CmpSrcSnk1_(ctx) \ + (((ComparePipeCtxPtr)(ctx))->ComparePart.srcsnk1) +#define CmpSrcSnk2_(ctx) \ + (((ComparePipeCtxPtr)(ctx))->ComparePart.srcsnk2) +#define CmpDstSnk_(ctx) (((ComparePipeCtxPtr)(ctx))->ComparePart.dstsnk) + +#define CmpSrcDrn1_(ctx,comp) \ + (((ComparePipeCtxPtr)(ctx))->ComparePart.srcdrn1[comp]) +#define CmpSrcDrn2_(ctx,comp) \ + (((ComparePipeCtxPtr)(ctx))->ComparePart.srcdrn2[comp]) + +#define CmpSrcData1_(ctx,comp) \ + (((ComparePipeCtxPtr)(ctx))->ComparePart.srcdata1[comp]) +#define CmpSrcData2_(ctx,comp) \ + (((ComparePipeCtxPtr)(ctx))->ComparePart.srcdata2[comp]) + +#define CmpConst_(ctx,comp) \ + (((ComparePipeCtxPtr)(ctx))->ComparePart.constant[comp]) +#define CmpCmpIn_(ctx) (((ComparePipeCtxPtr)(ctx))->ComparePart.ncmp_in) +#define CmpCmpOut_(ctx) (((ComparePipeCtxPtr)(ctx))->ComparePart.ncmp_out) +#define CmpCombOp_(ctx) (((ComparePipeCtxPtr)(ctx))->ComparePart.combine_op) +#define CmpCpp_(ctx) (((ComparePipeCtxPtr)(ctx))->ComparePart.cpp) +#define CmpRoiX1_(ctx) (((ComparePipeCtxPtr)(ctx))->ComparePart.x1) +#define CmpRoiX2_(ctx) (((ComparePipeCtxPtr)(ctx))->ComparePart.x2) +#define CmpRoiY1_(ctx) (((ComparePipeCtxPtr)(ctx))->ComparePart.y1) +#define CmpRoiY2_(ctx) (((ComparePipeCtxPtr)(ctx))->ComparePart.y2) +#define CmpFunc_(ctx) \ + (((ComparePipeCtxPtr)(ctx))->ComparePart.function) + +#endif +/* _SMICOMPARE */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiConstrain.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiConstrain.c new file mode 100644 index 0000000..aa966fa --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiConstrain.c @@ -0,0 +1,384 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** X Image Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains sample code for image data rotation. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Wed May 9 16:33:00 1990 +** +** MODIFICATION HISTORY: +** +*******************************************************************************/ + +/* +** Include files +*/ +#include + +#include "SmiConstrain.h" + +/* +** Table of contents +*/ +int SmiConstrain(); +int SmiCreateConstrain(); + +static int _ConstrainInitialize(); +static int _ConstrainActivate(); +static int _ConstrainDestroy(); + +static void _ProcessConstrain(); +static UdpPtr _ChkUdp(); +static UdpPtr _CvtSrc(); + +/* +** Equated Symbols +*/ +#define FALSE 0 +#define TRUE 1 + +/* +** MACRO definitions +*/ + +/* +** External References +*/ + +/* + * Local Storage + */ + +/* + ** Constrain Pipeline Element Vector + */ +static PipeElementVector ConstrainPipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeConstrainElement, /* Structure subtype */ + sizeof(ConstrainPipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _ConstrainInitialize, /* Initialize entry */ + _ConstrainActivate, /* Activate entry */ + NULL, /* Flush entry */ + _ConstrainDestroy, /* Destroy entry */ + NULL /* Abort entry point */ + }; + +/***************************************************************************** +** SmiCreateConstrain +** +** FUNCTIONAL DESCRIPTION: +** +** This function fills in a newly created CONSTRAIN pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - constrain pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCreateConstrain(pipe,src,dst,model) +Pipe pipe; +PipeSinkPtr src; +PipeSinkPtr dst; +int model; +{ + int dtype; + + ConstrainPipeCtxPtr ctx = (ConstrainPipeCtxPtr) + DdxCreatePipeCtx_( pipe, &ConstrainPipeElement, FALSE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + + /* Save the parameter values */ + ConSrcSnk_(ctx) = src; + ConDstSnk_(ctx) = dst; + ConModel_(ctx) = model; + + /* Setup one drain from source sink, receiving all components */ + ConSrcDrn_(ctx) = DdxRmCreateDrain_(ConSrcSnk_(ctx),-1); + if( !IsPointer_(ConSrcDrn_(ctx)) ) return( (int) ConSrcDrn_(ctx) ); + + /* Ask for the data as floats. Constrained input types will be + * converted to float and then reconstrained with the current model. + * The input quantum depends on model. */ + DdxRmSetDType_( ConSrcDrn_(ctx), UdpK_DTypeF, DtM_F ); + DdxRmSetQuantum_( ConSrcDrn_(ctx), model == XieK_HardClip ? 0 + : SnkHeight_(ConSrcSnk_(ctx),0) ); + + /* The output data type depends on the destination levels. + * The output quantum depends on model. */ + dtype = (SnkLvl_(dst, 0) <= 2) ? UdpK_DTypeVU : + (SnkLvl_(dst, 0) <= 256) ? UdpK_DTypeBU : + UdpK_DTypeWU; + + DdxRmSetDType_( ConDstSnk_(ctx), dtype, 1<UdpA_Base == NULL ) +{ + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); +} + +/* +** Convert src to unconstrained (float) data type if necessary. +*/ +src = _ChkUdp( in ); +if( !IsPointer_(src) ) return( (int) src ); + +/* Do the actual work */ +status = DdxConvert_(src, dst, model); + +if( src != in ) + { /* free converted input data */ + DdxFreeBits_( src->UdpA_Base ); + DdxFree_( src ); + } + +return( status ); +} /* end SmiConstrain */ + +/****************************************************************************** +** _ChkUdp +** +** FUNCTIONAL DESCRIPTION: +** +** Check src udp and convert to unconstrained type if necessary. +** +** FORMAL PARAMETERS: +** +** src - Pointer to src udp +** +******************************************************************************/ +static UdpPtr _ChkUdp( src ) + UdpPtr src; +{ + int status, stype; + UdpPtr dst = src; + + stype = DdxGetTyp_( src ); + + if( stype != XieK_AF ) + { + dst = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( dst == NULL ) return( (UdpPtr) BadAlloc ); + *dst = *src; + dst->UdpB_DType = UdpK_DTypeF; + dst->UdpB_Class = UdpK_ClassA; + dst->UdpW_PixelLength = sizeof(float) * 8; + dst->UdpL_PxlStride = dst->UdpW_PixelLength; + dst->UdpL_ScnStride = dst->UdpL_PxlStride*src->UdpL_PxlPerScn; + dst->UdpL_ArSize = dst->UdpL_ScnStride*src->UdpL_ScnCnt; + dst->UdpA_Base = 0; + status = DdxConvert_( src, dst, XieK_MoveMode ); + if( status != Success ) + { + DdxFreeBits_(dst->UdpA_Base); + DdxFree_(dst); + return( (UdpPtr) status ); + } + } + return( dst ); +} /* end _ChkUdp */ +/* end module SmiConstrain.c */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiConstrain.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiConstrain.h new file mode 100644 index 0000000..7071a8b --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiConstrain.h @@ -0,0 +1,127 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* DEC/CMS REPLACEMENT HISTORY, Element SMICONSTRAIN.H */ +/* *4 14-MAR-1990 17:31:50 WEBER "Change argument passing" */ +/* *3 13-MAR-1990 10:17:33 GREBUS "Fixed bug. Temp buffers must match drain datatype" */ +/* *2 9-MAR-1990 14:49:50 GREBUS "Change constrain context structure." */ +/* *1 8-MAR-1990 15:44:37 GREBUS "New element for constrains" */ +/* DEC/CMS REPLACEMENT HISTORY, Element SMICONSTRAIN.H */ +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the CONSTRAIN pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.1 +** RISC ULTRIX V3.1 +** +** AUTHOR(S): +** +** Gary Grebus +** +** CREATION DATE: +** +** Wed May 9 16:28:08 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMICONSTRAIN +#define _SMICONSTRAIN + +/* +** Include files +*/ +#include + +/* +** Function reference +*/ +int SmiConstrain(); +int SmiCreateConstrain(); + +/* +** Structure definitions and Typedefs +*/ + +/* +** Constrain pipeline context block. +*/ +typedef struct _ConstrainPipeCtx { + PipeElementCommonPart common; + struct _ConstrainPart { + PipeSinkPtr src; + PipeSinkPtr dst; + PipeDrainPtr srcdrn; + int model; + } ConstrainPart; +} ConstrainPipeCtx, *ConstrainPipeCtxPtr; + +/* +** MACRO definitions +*/ + /* + ** Constrain access macros + */ +#define ConSrcSnk_(ctx) (((ConstrainPipeCtxPtr)(ctx))->ConstrainPart.src) +#define ConDstSnk_(ctx) (((ConstrainPipeCtxPtr)(ctx))->ConstrainPart.dst) +#define ConSrcDrn_(ctx) (((ConstrainPipeCtxPtr)(ctx))->ConstrainPart.srcdrn) +#define ConModel_(ctx) (((ConstrainPipeCtxPtr)(ctx))->ConstrainPart.model) + +#endif +/* _SMICONSTRAIN */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiConvert.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiConvert.c new file mode 100644 index 0000000..8f25e6f --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiConvert.c @@ -0,0 +1,3916 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains all image data type and organization conversion +** routines. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** John Weber +** Rich Hennessy - Add 16 bit support(10/91) +** +** CREATION DATE: +** +** May 15, 1989 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ + +/* +** Definition to let include files know who's calling. +*/ +#define _SmiConvert + +/* +** Include files +*/ +#include +#include +#include /* XIE device dependant definitions */ +#include + +#ifdef CLIENT +/* +** When this module is built for use on the client side, redirect the +** references which would go through the DDX dispatch table. +*/ +#include + +#undef DdxConvert_ +#define DdxConvert_ SmiConvert +#undef DdxCopy_ +#define DdxCopy_ SmiCopy +#undef DdxConvertCpp_ +#define DdxConvertCpp_ SmiConvertCpp +#undef DdxGetTyp_ +#define DdxGetTyp_ SmiGetTyp +#undef DdxMallocBits_ +#define DdxMallocBits_ XieMallocBits +#endif + + +/* +** Table of contents +*/ +int SmiConvert(); +int SmiCopy(); +int SmiConvertCpp(); +int SmiCopyCpp(); +int SmiGetTyp(); + +static int _CvtUnsOpr(); + +static int _CvtBsBs(); +static int _CvtBsByt(); +static int _CvtBsFlt(); +static int _CvtBsWrd(); + +static int _CvtBytByt(); +static int _CvtBytBs(); +static int _CvtBytFlt(); +static int _CvtBytWrd(); + +static int _CvtFltFlt(); +static int _CvtFltBs(); +static int _CvtFltByt(); +static int _CvtFltWrd(); + +static int _CvtWrdWrd(); +static int _CvtWrdBs(); +static int _CvtWrdByt(); +static int _CvtWrdFlt(); + +static int _CvtBsBsCpp(); +static int _CvtBsBytCpp(); +static int _CvtBsFltCpp(); +static int _CvtBsWrdCpp(); + +static int _CvtBytBytCpp(); +static int _CvtBytBsCpp(); +static int _CvtBytFltCpp(); +static int _CvtBytWrdCpp(); + +static int _CvtFltFltCpp(); +static int _CvtFltBsCpp(); +static int _CvtFltBytCpp(); +static int _CvtFltWrdCpp(); + +static int _CvtWrdWrdCpp(); +static int _CvtWrdBsCpp(); +static int _CvtWrdBytCpp(); +static int _CvtWrdFltCpp(); + + +static int _ConHCBs(); +static int _ConHCByt(); +static int _ConHCWrd(); + +static int _ConCSBs(); +static int _ConCSByt(); +static int _ConCSWrd(); + +static int _ConHSBs(); +static int _ConHSByt(); +static int _ConHSWrd(); + + +/* +** MACRO definitions +*/ +#define Min_(a,b) ((a) <= (b) ? (a) : (b)) +#define Max_(a,b) ((a) > (b) ? (a) : (b)) + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* +** Local Storage +*/ + + /* + ** This table describes functions to be called when converting from one + ** descriptor type to another. + ** The table's indecis are from XieDDX.h, UdpRec data types constants. + */ +static int (*conversion_table[XieK_DATA_TYPE_COUNT][XieK_DATA_TYPE_COUNT])()={ + {_CvtBsBs, _CvtBsBs, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtBsByt, _CvtBsFlt, _CvtBsWrd}, + {_CvtBsBs, _CvtBsBs, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtBsByt, _CvtBsFlt, _CvtBsWrd}, + {_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr}, + {_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr}, + {_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr}, + {_CvtBytBs, _CvtBytBs, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtBytByt,_CvtBytFlt,_CvtBytWrd}, + {_CvtFltBs, _CvtFltBs, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtFltByt,_CvtFltFlt,_CvtFltWrd}, + {_CvtWrdBs, _CvtWrdBs, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtWrdByt,_CvtWrdFlt,_CvtWrdWrd} +}; + + /* + ** This table is for conversions under the control of a CPP + */ +static int (*conversion_table_cpp[XieK_DATA_TYPE_COUNT][XieK_DATA_TYPE_COUNT])()={ + {_CvtBsBsCpp, _CvtBsBsCpp, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtBsBytCpp, _CvtBsFltCpp, _CvtBsWrdCpp}, + {_CvtBsBsCpp, _CvtBsBsCpp, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtBsBytCpp, _CvtBsFltCpp, _CvtBsWrdCpp}, + {_CvtUnsOpr, _CvtUnsOpr, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr, _CvtUnsOpr, _CvtUnsOpr}, + {_CvtUnsOpr, _CvtUnsOpr, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr, _CvtUnsOpr, _CvtUnsOpr}, + {_CvtUnsOpr, _CvtUnsOpr, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr, _CvtUnsOpr, _CvtUnsOpr}, + {_CvtBytBsCpp,_CvtBytBsCpp,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtBytBytCpp,_CvtBytFltCpp,_CvtBytWrdCpp}, + {_CvtFltBsCpp,_CvtFltBsCpp,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtFltBytCpp,_CvtFltFltCpp,_CvtFltWrdCpp}, + {_CvtWrdBsCpp,_CvtWrdBsCpp,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtWrdBytCpp,_CvtWrdFltCpp,_CvtWrdWrdCpp} +}; + + /* + ** This table describes the functions to be called when constraining data. + */ +static int (*constrain_table[5][XieK_DATA_TYPE_COUNT])()={ + {_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr}, + {_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr}, + {_ConHCBs, _ConHCBs, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_ConHCByt, _CvtUnsOpr,_ConHCWrd}, + {_ConCSBs, _ConCSBs, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_ConCSByt, _CvtUnsOpr,_ConCSWrd}, + {_ConHSBs, _ConHSBs, _CvtUnsOpr,_CvtUnsOpr,_CvtUnsOpr,_ConHSByt, _CvtUnsOpr,_ConHSWrd} +}; + +/***************************************************************************** +** SmiConvert +** +** FUNCTIONAL DESCRIPTION: +** +** This is the externally callable entry point for type conversion. The +** data specified by the source descriptor is reorganized to conform to +** the specification of the destination descriptor. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** mode - transfer mode, one of the following: +** XieK_MoveMode, move without constraining +** XieK_HardClip, constrain data via hard clip model +** XieK_ClipScale, constrain data via clip scale model +** XieK_HardScale, constrain data via hard scale model +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiConvert(src, dst, mode) +UdpPtr src; +UdpPtr dst; +int mode; +{ + int srctyp, dsttyp, status; + /* + ** Validate and get type of descriptors + */ + srctyp = DdxGetTyp_(src); + dsttyp = DdxGetTyp_(dst); + + if( srctyp >= XieK_DATA_TYPE_COUNT || dsttyp >= XieK_DATA_TYPE_COUNT ) + status = _CvtUnsOpr(src,dst); + + else if( mode == XieK_MoveMode ) + /* + ** Call specific conversion routine. + */ + status = (*conversion_table[srctyp][dsttyp])(src,dst); + + else if( srctyp != XieK_AF ) + status = _CvtUnsOpr(src,dst); + /* + ** The input data must be type float. Call conversion + ** routine based on the constraint model requested. + */ + else + status = (*constrain_table[mode][dsttyp])(src,dst); + + return( status ); +} /* end SmiConvert */ + +/***************************************************************************** +** SmiConvertCpp +** +** FUNCTIONAL DESCRIPTION: +** +** This is the same as SmiConvert, except that a CPP is used to +** select the input pixels to be copied. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** mode - transfer mode, one of the following: +** XieK_MoveMode, move without constraining +** cpp - cpp data descriptor +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiConvertCpp(src, dst, cpp, mode) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int mode; +{ + int srctyp, dsttyp, status; + /* + ** Validate and get type of descriptors + */ + srctyp = DdxGetTyp_(src); + dsttyp = DdxGetTyp_(dst); + + if( srctyp >= XieK_DATA_TYPE_COUNT || dsttyp >= XieK_DATA_TYPE_COUNT + || cpp == NULL || mode != XieK_MoveMode ) + status = _CvtUnsOpr(src,dst); + + else + status = (*conversion_table_cpp[srctyp][dsttyp])(src,dst,cpp); + + return( status ); +} /* end SmiConvertCpp */ + +/***************************************************************************** +** SmiCopy +** +** FUNCTIONAL DESCRIPTION: +** +** This is a jacket function over the CONVERT routine which provides a +** straight-forward interface for copying ROIs. +** +** The principle used is simple, but possibly hard to understand. This +** routine relies on the fact that the CONVERT code matches source and +** destination image coordinates during the move (i.e. source pixel (0,0) +** is moved to destination pixel (0,0). To accomplish the move of a source +** ROI, the source UDP is modified so that only the ROI data is described +** as image (all other data will be described as pad by careful use of +** POS, and STRIDE fields). The coordinates of the source are shifted so +** they match the desired destination coordinates. +** +** Simple...right? (no way) +** +** FORMAL PARAMETERS: +** +** srcudp - UDP to copy from +** dstudp - UDP to copy to +** src_x - Source X coordinate (X coordinate of upper left corner of +** source ROI). +** src_y - Source Y coordinate (Y coordinate of upper left corner of +** source ROI). +** dst_x - Destination X coordinate +** dst_y - Destination Y coordinate +** width - Width of ROI in pels +** height - Height of ROI in pels +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCopy( src, dst, srcx, srcy, dstx, dsty, width, height ) +UdpPtr src; +UdpPtr dst; +long int srcx; +long int srcy; +long int dstx; +long int dsty; +long int width; +long int height; +{ + UdpRec srcudp; + long int clipped_width; + long int clipped_height; + /* + ** Make a copy of the source UDP that we can modify. + */ + srcudp = *src; + /* + ** Modify the source UDP so that is describes only the ROI and reflects + ** where in the destination the data is to be copied. + */ + srcudp.UdpL_X1 = dstx; + srcudp.UdpL_Y1 = dsty; + + clipped_width = Min_(srcx + width -1, src->UdpL_X2) - srcx + 1; + clipped_height = Min_(srcy + height -1, src->UdpL_Y2) - srcy + 1; + + srcudp.UdpL_X2 = dstx + clipped_width - 1; + srcudp.UdpL_Y2 = dsty + clipped_height - 1; + + srcudp.UdpL_PxlPerScn = clipped_width; + srcudp.UdpL_ScnCnt = clipped_height; + + srcudp.UdpL_Pos += srcy * srcudp.UdpL_ScnStride + + srcx * srcudp.UdpL_PxlStride; + /* + ** Now, call the CONVERT routine to do the data movement. + */ + return( DdxConvert_( &srcudp, dst, XieK_MoveMode ) ); +} /* end SmiCopy */ + +/***************************************************************************** +** SmiCopyCpp +** +** FUNCTIONAL DESCRIPTION: +** +** This is the same as SmiCopy, except the pixels to be copied +** are selected by a CPP. +** +** FORMAL PARAMETERS: +** +** srcudp - UDP to copy from +** dstudp - UDP to copy to +** cpp - UDP for the CPP +** src_x - Source X coordinate (X coordinate of upper left corner of +** source ROI). +** src_y - Source Y coordinate (Y coordinate of upper left corner of +** source ROI). +** dst_x - Destination X coordinate +** dst_y - Destination Y coordinate +** width - Width of ROI in pels +** height - Height of ROI in pels +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCopyCpp( src, dst, cpp, srcx, srcy, dstx, dsty, width, height ) +UdpPtr src; +UdpPtr dst; +long int srcx; +long int srcy; +long int dstx; +long int dsty; +long int width; +long int height; +{ + UdpRec srcudp; + long int clipped_width; + long int clipped_height; + /* + ** Make a copy of the source UDP that we can modify. + */ + srcudp = *src; + /* + ** Modify the source UDP so that is describes only the ROI and reflects + ** where in the destination the data is to be copied. + */ + srcudp.UdpL_X1 = dstx; + srcudp.UdpL_Y1 = dsty; + + clipped_width = Min_(srcx + width -1, src->UdpL_X2) - srcx + 1; + clipped_height = Min_(srcy + height -1, src->UdpL_Y2) - srcy + 1; + + srcudp.UdpL_X2 = dstx + clipped_width - 1; + srcudp.UdpL_Y2 = dsty + clipped_height - 1; + + srcudp.UdpL_PxlPerScn = clipped_width; + srcudp.UdpL_ScnCnt = clipped_height; + + srcudp.UdpL_Pos += srcy * srcudp.UdpL_ScnStride + + srcx * srcudp.UdpL_PxlStride; + /* + ** Now, call the CONVERT routine to do the data movement. + */ + return( DdxConvertCpp_( &srcudp, dst, cpp, XieK_MoveMode ) ); +} /* end SmiCopyCpp */ + +/***************************************************************************** +** SmiGetTyp +** +** FUNCTIONAL DESCRIPTION: +** +** Return constant which identifies a valid combination of descriptor +** class and data type. +** +** FORMAL PARAMETERS: +** +** desc - data descriptor to validate and classify +** +** FUNCTION VALUE: +** +** data type of descriptor +** +*****************************************************************************/ +int SmiGetTyp(desc) +UdpPtr desc; +{ + int type; + + switch (desc->UdpB_DType) + { + case UdpK_DTypeBU : + switch (desc->UdpB_Class) + { + case UdpK_ClassA: type = XieK_ABU; break; + case UdpK_ClassUBA: + case UdpK_ClassUBS: + default: type = XieK_DATA_TYPE_COUNT; break; + } break; + case UdpK_DTypeWU: + switch (desc->UdpB_Class) + { + case UdpK_ClassA: type = XieK_AWU; break; + case UdpK_ClassUBA: + case UdpK_ClassUBS: + default: type = XieK_DATA_TYPE_COUNT; break; + } break; + case UdpK_DTypeLU: + switch (desc->UdpB_Class) + { + case UdpK_ClassA: + case UdpK_ClassUBA: + case UdpK_ClassUBS: + default: type = XieK_DATA_TYPE_COUNT; break; + } break; + case UdpK_DTypeF: + switch (desc->UdpB_Class) + { + case UdpK_ClassA: type = XieK_AF; break; + case UdpK_ClassUBA: + case UdpK_ClassUBS: + default: type = XieK_DATA_TYPE_COUNT; break; + } break; + case UdpK_DTypeVU: + switch (desc->UdpB_Class) + { + case UdpK_ClassUBA: type = XieK_UBAVU; break; + case UdpK_ClassUBS: type = XieK_UBSVU; break; + case UdpK_ClassA: + default: type = XieK_DATA_TYPE_COUNT; break; + } break; + case UdpK_DTypeV: + switch (desc->UdpB_Class) + { + case UdpK_ClassUBA: type = XieK_UBAV; break; + case UdpK_ClassUBS: type = XieK_UBSV; break; + case UdpK_ClassA: + default: type = XieK_DATA_TYPE_COUNT; break; + } break; + default : type = XieK_DATA_TYPE_COUNT; break; + } + return( type ); +} /* end SmiGetTyp */ + +/***************************************************************************** +** SmiPosCl +** +** FUNCTIONAL DESCRIPTION: +** +** Return the UdpL_Pos value (i.e. offset in bits) which corresponds +** to the beginning of the specified scanline in a changelist Udp. +** +** This code assumes the specified scanline actually exists in the +** UDP. +** +** FORMAL PARAMETERS: +** +** base - data to position in +** inipos - initial offset into data +** scncnt - number of scanlines to position to +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiPosCl(base, inipos, scncnt) +unsigned int *base; +int inipos; +int scncnt; +{ + /* Not implemented */ + return( BadImplementation ); +} /* end SmiPosCl */ + +/***************************************************************************** +** _CvtUnsOpr +** +** FUNCTIONAL DESCRIPTION: +** +** This is an action routine called when conversion from source descriptor +** type to destination descriptor type is not supported. Simply signal an +** error at this point. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtUnsOpr(src, dst) +UdpPtr src; +UdpPtr dst; +{ + return( BadImplementation ); +} + +/***************************************************************************** +** _CvtBsBs +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit stream to bit stream encoding +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBsBs(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask, dst_mask, mask_24 = (1 << 24) - 1; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + int bits; + int value; + char *data, copy_line = src->UdpW_PixelLength == 1 + && dst->UdpW_PixelLength == 1 + && src->UdpL_PxlStride == 1 + && dst->UdpL_PxlStride == 1; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + /* + ** Copy until the destination is at a byte boundary. + */ + for( pixel = X1; pixel <= X2 && dst_offset & 7; pixel++ ) + { + value = GET_VALUE_(src->UdpA_Base, src_offset, src_mask); + PUT_VALUE_(dst->UdpA_Base, dst_offset, value, dst_mask); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + /* + ** If there is enough data, try for a higher performance copy. + */ + if( copy_line && X2 + 1 - pixel >= 24 ) + if( src_offset & 7 ) + /* + ** Src and dst aren't aligned, so move in 3 byte chunks. + */ + for( data = (char *)(dst->UdpA_Base+(dst_offset>>3)); + pixel <= X2 + 1 - 24; + src_offset += 24, + dst_offset += 24, + pixel += 24 ) + { + value = GET_VALUE_(src->UdpA_Base, src_offset, mask_24); +#ifdef BIGENDIAN + *data++ = *((unsigned char *)(&value)+3); + *data++ = *((unsigned char *)(&value)+2); + *data++ = *((unsigned char *)(&value)+1); +#else + *data++ = *((unsigned char *)(&value)); + *data++ = *((unsigned char *)(&value)+1); + *data++ = *((unsigned char *)(&value)+2); +#endif + } + else + /* + ** Src and dst are aligned, so we can use the fast byte mover. + */ + { + bits = X2 + 1 - pixel & ~7; + memcpy( dst->UdpA_Base + (dst_offset >> 3), + src->UdpA_Base + (src_offset >> 3), bits >> 3 ); + src_offset += bits; + dst_offset += bits; + pixel += bits; + } + /* + ** Copy the remainder. + */ + while( pixel <= X2 ) + { + value = GET_VALUE_(src->UdpA_Base, src_offset, src_mask); + PUT_VALUE_(dst->UdpA_Base, dst_offset, value, dst_mask); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + pixel++; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBsByt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit string to byte array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBsByt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + *((unsigned char *)(dst->UdpA_Base + dst_offset / 8)) = + GET_VALUE_(src->UdpA_Base,src_offset,src_mask); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBsFlt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit string to float +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBsFlt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + *((float *)(dst->UdpA_Base + dst_offset / 8)) = + (float)GET_VALUE_(src->UdpA_Base,src_offset,src_mask); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBsWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit string to word array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBsWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + GET_VALUE_(src->UdpA_Base,src_offset,src_mask); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBytByt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to byte array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBytByt( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + char copy_line = src->UdpW_PixelLength == dst->UdpW_PixelLength + && src->UdpW_PixelLength == src->UdpL_PxlStride + && dst->UdpW_PixelLength == dst->UdpL_PxlStride + && src->UdpL_PxlStride == dst->UdpL_PxlStride; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + if( copy_line ) + memcpy( dst->UdpA_Base + (dst_offset >> 3), + src->UdpA_Base + (src_offset >> 3), X2 - X1 + 1 ); + else + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((unsigned char *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned char *)(src->UdpA_Base + (src_offset >> 3))); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBytBs +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to bit string +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBytBs(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + PUT_VALUE_(dst->UdpA_Base,dst_offset, + *((unsigned char *)(src->UdpA_Base + src_offset / 8)),dst_mask); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + + +/***************************************************************************** +** _CvtBytFlt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to floating point +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBytFlt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + *((float *)(dst->UdpA_Base + dst_offset / 8)) = + (float)*((unsigned char *)(src->UdpA_Base + src_offset / 8)); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + + +/***************************************************************************** +** _CvtBytWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to word array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBytWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((unsigned short *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned char *)(src->UdpA_Base + (src_offset >> 3))); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltFlt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to floating array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtFltFlt( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + char copy_line = src->UdpW_PixelLength == dst->UdpW_PixelLength + && src->UdpW_PixelLength == src->UdpL_PxlStride + && dst->UdpW_PixelLength == dst->UdpL_PxlStride + && src->UdpL_PxlStride == dst->UdpL_PxlStride; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + if( copy_line ) + memcpy( dst->UdpA_Base + (dst_offset >> 3), + src->UdpA_Base + (src_offset >> 3), + (X2 + 1 - X1) * sizeof(float) ); + else + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((float *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((float *)(src->UdpA_Base + (src_offset >> 3))); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltBs +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to bit string +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtFltBs(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + int value; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + + value = *((float *)(src->UdpA_Base + src_offset / 8)) + 0.5; + + PUT_VALUE_(dst->UdpA_Base,dst_offset,value,dst_mask); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltByt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to byte array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtFltByt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + *((unsigned char *)(dst->UdpA_Base + dst_offset / 8)) = + *((float *)(src->UdpA_Base + src_offset / 8)) + 0.5; + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + + +/***************************************************************************** +** _CvtFltWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to word array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtFltWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + *((float *)(src->UdpA_Base + src_offset / 8)) + 0.5; + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/* N O W A L L T H E "W O R D" F U N C T I O N */ + +/***************************************************************************** +** _CvtWrdWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to word array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtWrdWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + char copy_line = src->UdpW_PixelLength == dst->UdpW_PixelLength + && src->UdpW_PixelLength == src->UdpL_PxlStride + && dst->UdpW_PixelLength == dst->UdpL_PxlStride + && src->UdpL_PxlStride == dst->UdpL_PxlStride; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + if( copy_line ) + memcpy( dst->UdpA_Base + (dst_offset >> 3), + src->UdpA_Base + (src_offset >> 3), X2 - X1 + 1 << 1 ); + else + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((unsigned short *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned short *)(src->UdpA_Base + (src_offset >> 3))); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdBs +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to bit string +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtWrdBs( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + PUT_VALUE_( dst->UdpA_Base,dst_offset, + *((unsigned short *)(src->UdpA_Base + src_offset / 8)), + dst_mask ); + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdByt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to byte array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtWrdByt( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((unsigned char *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned short *)(src->UdpA_Base + (src_offset >> 3))); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdFlt +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to floating point +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtWrdFlt( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + *((float *)(dst->UdpA_Base + dst_offset / 8)) = + (float)*((unsigned short *)(src->UdpA_Base + src_offset / 8)); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/* N O W A L L T H E "C O N S T R A I N T" F U N C T I O N S */ + +/***************************************************************************** +** _ConHCBs +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Hard Clip model from float to bit string: +** values < 0 ==> 0.0 +** values > ceiling ==> ceiling +** Round all values to nearest integer. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConHCBs(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + int value; + float ceiling; + float fvalue; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if (fvalue < 0.0) /* Clip */ + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + value = fvalue + 0.5; + PUT_VALUE_(dst->UdpA_Base,dst_offset,value,dst_mask); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConHCByt +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Hard Clip model from float to unsigned byte: +** values < 0 ==> 0.0 +** values > ceiling ==> ceiling +** Round all values to nearest integer. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConHCByt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + float ceiling; + float fvalue; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if (fvalue < 0.0) /* Clip */ + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + *((unsigned char *)(dst->UdpA_Base + dst_offset / 8)) = + fvalue + 0.5; + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConHCWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Hard Clip model from float to unsigned word: +** values < 0 ==> 0.0 +** values > ceiling ==> ceiling +** Round all values to nearest integer. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConHCWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + float ceiling; + float fvalue; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if (fvalue < 0.0) /* Clip */ + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + fvalue + 0.5; + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConCSBs +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Clip Scale model from float to bit string: +** values < 0 ==> 0.0 +** values > ceiling ==> ceiling +** Scale such that smallest value -> 0 +** largest value -> ceiling +** +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConCSBs(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + int value; + float ceiling; + float fvalue; + float fmax, fmin, foffset, fscale; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + ceiling = (float)(dst->UdpL_Levels - 1); + + /* Make a pass through the pixels to determine the range of the data */ + fmin = ceiling; + fmax = 0.0; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + /* Clip the data */ + if (fvalue < 0.0) + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + fmax = Max_(fmax,fvalue); + fmin = Min_(fmin,fvalue); + + src_offset += src->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + } + + /* Calculate the scale value and offset */ + foffset = fmin; + if ((fmax-fmin) != 0.0) + fscale = ceiling/(fmax-fmin); + else + fscale = 1.0; + + /* Scale and convert the data */ + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if (fvalue < 0.0) /* Clip */ + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + value = (fvalue - foffset) * fscale + 0.5; /* Scale */ + PUT_VALUE_(dst->UdpA_Base,dst_offset,value,dst_mask); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConCSByt +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Clip Scale model from float to byte array: +** values < 0 ==> 0.0 +** values > ceiling ==> ceiling +** Scale such that smallest value -> 0 +** largest value -> ceiling +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConCSByt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + float ceiling; + float fvalue; + float fmax, fmin, foffset, fscale; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + +/* +** Make a pass through the pixels to determine the range of the data +*/ + fmin = ceiling; + fmax = 0.0; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if (fvalue < 0.0) /* Clip */ + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + fmax = Max_(fmax,fvalue); + fmin = Min_(fmin,fvalue); + + src_offset += src->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + } + +/* +** Calculate the scale value and offset +*/ + foffset = fmin; + if ((fmax-fmin) != 0.0) + fscale = ceiling/(fmax-fmin); + else + fscale = 1.0; + +/* +** Scale and convert the data +*/ + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if (fvalue < 0.0) /* Clip */ + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + *((unsigned char *)(dst->UdpA_Base + dst_offset / 8)) = + (fvalue - foffset) * fscale + 0.5; /* Scale */ + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConCSWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Clip Scale model from float to word array: +** values < 0 ==> 0.0 +** values > ceiling ==> ceiling +** Scale such that smallest value -> 0 +** largest value -> ceiling +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConCSWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + float ceiling; + float fvalue; + float fmax, fmin, foffset, fscale; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + +/* +** Make a pass through the pixels to determine the range of the data +*/ + fmin = ceiling; + fmax = 0.0; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if (fvalue < 0.0) /* Clip */ + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + fmax = Max_(fmax,fvalue); + fmin = Min_(fmin,fvalue); + + src_offset += src->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + } + +/* +** Calculate the scale value and offset +*/ + foffset = fmin; + if ((fmax-fmin) != 0.0) + fscale = ceiling/(fmax-fmin); + else + fscale = 1.0; + +/* +** Scale and convert the data +*/ + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + if (fvalue < 0.0) /* Clip */ + fvalue = 0.0; + else + if (fvalue > ceiling) + fvalue = ceiling; + + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + (fvalue - foffset) * fscale + 0.5; /* Scale */ + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConHSBs +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Hard Scale model from float to bit string: +** Scale such that smallest value -> 0 +** largest value -> ceiling +** +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConHSBs(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + int value; + float ceiling; + float fvalue; + float fmax, fmin, foffset, fscale; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + ceiling = (float)(dst->UdpL_Levels - 1); + + /* Make a pass through the pixels to determine the range of the data */ + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + + fmin = *((float *)(src->UdpA_Base + (src_scan_offset + + (X1-src->UdpL_X1) * src->UdpL_PxlStride)/ 8)); + fmax = fmin; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + fmax = Max_(fmax,fvalue); + fmin = Min_(fmin,fvalue); + + src_offset += src->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + } + + /* Calculate the scale value and offset */ + foffset = fmin; + if ((fmax-fmin) != 0.0) + fscale = ceiling/(fmax-fmin); + else + fscale = 1.0; + + + /* Scale and convert the data */ + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + value = (fvalue - foffset) * fscale + 0.5; /* Scale */ + PUT_VALUE_(dst->UdpA_Base,dst_offset,value,dst_mask); + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConHSByt +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Hard Scale model from float to byte array: +** Scale such that smallest value -> 0 +** largest value -> ceiling +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConHSByt(src, dst) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + float ceiling; + float fvalue; + float fmax, fmin, foffset, fscale; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + + /* Make a pass through the pixels to determine the range of the data */ + fmin = *((float *)(src->UdpA_Base + (src_scan_offset + + (X1-src->UdpL_X1) * src->UdpL_PxlStride)/ 8)); + fmax = fmin; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + fmax = Max_(fmax,fvalue); + fmin = Min_(fmin,fvalue); + + src_offset += src->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + } + + /* Calculate the scale value and offset */ + foffset = fmin; + if ((fmax-fmin) != 0.0) + fscale = ceiling/(fmax-fmin); + else + fscale = 1.0; + + /* Scale and convert the data */ + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + *((unsigned char *)(dst->UdpA_Base + dst_offset / 8)) = + (fvalue - foffset) * fscale + 0.5; /* Scale */ + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _ConHSWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Constrain using the Hard Scale model from float to word array: +** Scale such that smallest value -> 0 +** largest value -> ceiling +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _ConHSWrd( src, dst ) +UdpPtr src; +UdpPtr dst; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset; + int src_offset, dst_offset; + float ceiling; + float fvalue; + float fmax, fmin, foffset, fscale; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + ceiling = (float)(dst->UdpL_Levels - 1); + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + +/* +** Make a pass through the pixels to determine the range of the data +*/ + fmin = *((float *)(src->UdpA_Base + (src_scan_offset + + (X1-src->UdpL_X1) * src->UdpL_PxlStride)/ 8)); + fmax = fmin; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + fmax = Max_(fmax,fvalue); + fmin = Min_(fmin,fvalue); + + src_offset += src->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + } + +/* +** Calculate the scale value and offset +*/ + foffset = fmin; + if ((fmax-fmin) != 0.0) + fscale = ceiling/(fmax-fmin); + else + fscale = 1.0; + +/* +** Scale and convert the data +*/ + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + + for (pixel = X1; pixel <= X2; pixel++) + { + fvalue = *((float *)(src->UdpA_Base + src_offset / 8)); + + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + (fvalue - foffset) * fscale + 0.5; /* Scale */ + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/* N O W "C P P V E R S I O N S" O F T H E B A S E C O N V E R S I O N S */ + +/***************************************************************************** +** _CvtBsBsCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit stream to bit stream encoding with CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtBsBsCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask, dst_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; + int bits; + int value; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + /* + ** Copy the bits. + */ + for( pixel = X1; pixel <= X2; pixel++ ) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + value = GET_VALUE_(src->UdpA_Base, src_offset, src_mask); + PUT_VALUE_(dst->UdpA_Base, dst_offset, value, dst_mask); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBsBytCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit string to byte array using cpp +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtBsBytCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned char *)(dst->UdpA_Base + dst_offset / 8)) = + GET_VALUE_(src->UdpA_Base,src_offset,src_mask); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBsFltCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit string to float using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtBsFltCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((float *)(dst->UdpA_Base + dst_offset / 8)) = + (float)GET_VALUE_(src->UdpA_Base,src_offset,src_mask); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBsWrdCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from bit string to word array using cpp +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtBsWrdCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + GET_VALUE_(src->UdpA_Base,src_offset,src_mask); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBytBytCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to byte array +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBytBytCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned char *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned char *)(src->UdpA_Base + (src_offset >> 3))); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBytBsCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to bit string using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtBytBsCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + PUT_VALUE_(dst->UdpA_Base,dst_offset, + *((unsigned char *)(src->UdpA_Base + + src_offset / 8)),dst_mask); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBytFltCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to floating point using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtBytFltCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((float *)(dst->UdpA_Base + dst_offset / 8)) = + (float)*((unsigned char *)(src->UdpA_Base + + src_offset / 8)); + } + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtBytWrdCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from byte array to word array using a cpp +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp descriptor +** +*****************************************************************************/ +static int _CvtBytWrdCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned short *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned char *)(src->UdpA_Base + (src_offset >> 3))); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltFltCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to floating array using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtFltFltCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((float *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((float *)(src->UdpA_Base + (src_offset >> 3))); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltBsCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to bit string using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtFltBsCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; + int value; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + value = *((float *)(src->UdpA_Base + + src_offset / 8)) + 0.5; + PUT_VALUE_(dst->UdpA_Base,dst_offset,value,dst_mask); + } + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltBytCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to byte array using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtFltBytCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned char *)(dst->UdpA_Base + dst_offset / 8)) = + *((float *)(src->UdpA_Base + src_offset /8)) + 0.5; + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtFltWrdCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from floating array to word array using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtFltWrdCpp(src, dst, cpp) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned short *)(dst->UdpA_Base + dst_offset / 8)) = + *((float *)(src->UdpA_Base + src_offset /8)) + 0.5; + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdWrdCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to word array using a cpp +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp descriptor +** +*****************************************************************************/ +static int _CvtWrdWrdCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } + +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned short *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned short *)(src->UdpA_Base + (src_offset >> 3))); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdBsCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to bit string using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp - cpp data descriptor +** +*****************************************************************************/ +static int _CvtWrdBsCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } + +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + PUT_VALUE_(dst->UdpA_Base,dst_offset, + *((unsigned short *)(src->UdpA_Base + + src_offset / 8)),dst_mask); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdBytCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to byte array using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** cpp = CPP descriptor +** +*****************************************************************************/ +static int _CvtWrdBytCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_scan_offset = src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + src_offset = src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((unsigned char *)(dst->UdpA_Base + (dst_offset >> 3))) = + *((unsigned short *)(src->UdpA_Base + (src_offset >> 3))); + } + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _CvtWrdFltCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Convert from word array to floating point using a CPP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtWrdFltCpp( src, dst, cpp ) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +{ + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int src_mask; + int src_scan_offset, dst_scan_offset, cpp_scan_offset; + int src_offset, dst_offset, cpp_offset; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + return( BadAlloc ); + } + +/* +** Determine maximum common dimensions between source and destination. +*/ + X1 = src->UdpL_X1 > dst->UdpL_X1 ? src->UdpL_X1 : dst->UdpL_X1; + X2 = src->UdpL_X2 < dst->UdpL_X2 ? src->UdpL_X2 : dst->UdpL_X2; + Y1 = src->UdpL_Y1 > dst->UdpL_Y1 ? src->UdpL_Y1 : dst->UdpL_Y1; + Y2 = src->UdpL_Y2 < dst->UdpL_Y2 ? src->UdpL_Y2 : dst->UdpL_Y2; + + src_mask = (1 << src->UdpW_PixelLength) - 1; + + src_scan_offset = + src->UdpL_Pos + (Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dst_scan_offset = + dst->UdpL_Pos + (Y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + cpp_scan_offset = cpp->UdpL_Pos + (Y1 - cpp->UdpL_Y1) * cpp->UdpL_ScnStride; + + for (scanline = Y1; scanline <= Y2 ; scanline++) + { + src_offset = + src_scan_offset + (X1-src->UdpL_X1) * src->UdpL_PxlStride; + dst_offset = + dst_scan_offset + (X1-dst->UdpL_X1) * dst->UdpL_PxlStride; + cpp_offset = cpp_scan_offset; + + for (pixel = X1; pixel <= X2; pixel++) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) { + *((float *)(dst->UdpA_Base + dst_offset / 8)) = + (float)*((unsigned short *)(src->UdpA_Base + + src_offset / 8)); + } + + src_offset += src->UdpL_PxlStride; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} +/* end Module SmiConvert */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiConvert.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiConvert.h new file mode 100644 index 0000000..94251e5 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiConvert.h @@ -0,0 +1,94 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the CONVERT module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** +** AUTHOR(S): +** +** Richard Hennessy +** +** CREATION DATE: +** +** September 25, 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMICONVERT +#define _SMICONVERT + +/* +** Include files +*/ + +/* +** External reference +*/ +extern int SmiConvert(); +extern int SmiCopy(); +extern int SmiConvertCpp(); +extern int SmiCopyCpp(); +extern int SmiGetTyp(); +extern int SmiPosCl(); +#endif +/* _SMICONVERT */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiCrop.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiCrop.c new file mode 100644 index 0000000..076ae25 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiCrop.c @@ -0,0 +1,301 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains support for the pipeline crop operation. +** Non-pipelined crop is still handled in the DIX. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** VAX ULTRIX V3.1 +** RISC ULTRIX 3.1 +** +** AUTHORS: +** +** Gary Grebus +** +** CREATION DATE: +** +** Thu Feb 22 14:39:51 1990 +** +*******************************************************************************/ + +#include + +#include "SmiCrop.h" + +/* +** Table of contents +*/ +int SmiCreateCrop(); + +static int _CropInitialize(); +static int _CropActivate(); +static int _CropDestroy(); + + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* +** Local storage +*/ + /* + ** Crop Element Vector + */ +static PipeElementVector CropPipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeCropElement, /* Structure subtype */ + sizeof(CropPipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _CropInitialize, /* Initialize entry */ + _CropActivate, /* Activate entry */ + NULL, /* Flush entry */ + _CropDestroy, /* Destroy entry */ + NULL /* Abort entry point */ + }; + +/***************************************************************************** +** SmiCreateCrop +** +** FUNCTIONAL DESCRIPTION: +** +** This function fills in a newly created CROP pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - crop pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCreateCrop( pipe, src, dst, x, y, width, height ) +Pipe pipe; +PipeSinkPtr src; +PipeSinkPtr dst; +int x; +int y; +int width; +int height; +{ + CropPipeCtxPtr ctx = (CropPipeCtxPtr) + DdxCreatePipeCtx_( pipe, &CropPipeElement, FALSE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + /* + ** Copy parameters into context block. + */ + CrpSrcSnk_(ctx) = src; + CrpDstSnk_(ctx) = dst; + CrpRoiX_(ctx) = x; + CrpRoiY_(ctx) = y; + CrpRoiWidth_(ctx) = width; + CrpRoiHeight_(ctx) = height; + + /* + ** Setup one drain from source sink, receiving all components. + */ + CrpSrcDrn_(ctx) = DdxRmCreateDrain_( CrpSrcSnk_(ctx), -1 ); + if( !IsPointer_(CrpSrcDrn_(ctx)) ) return( (int) CrpSrcDrn_(ctx) ); + /* + ** Since cropping is done entirely by manipulating UDP fields, + ** we can handle any data type or quantum size. + */ + DdxRmSetDType_( CrpSrcDrn_(ctx), UdpK_DTypeUndefined, DtM_Any ); + DdxRmSetDType_( CrpDstSnk_(ctx), UdpK_DTypeUndefined, DtM_Any ); + + return( Success ); +} /* end SmiCreateCrop */ + +/***************************************************************************** +** _CropInitialize +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the CROP pipeline element prior to +** an activation. +** +** FORMAL PARAMETERS: +** +** ctx - crop pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _CropInitialize(ctx) +CropPipeCtxPtr ctx; +{ + int dtype, status; + + /* + ** Initialize the source drain. + */ + CtxInp_(ctx) = CrpSrcDrn_(ctx); + status = DdxRmInitializePort_( CtxHead_(ctx), CrpSrcDrn_(ctx) ); + if( status != Success ) return( status ); + + /* + ** Set our destination sink DType to match our drain and initialize it. + */ + dtype = DdxRmGetDType_( CrpSrcDrn_(ctx) ); + DdxRmSetDType_( CrpDstSnk_(ctx), dtype, 1<= DatY1_(src))) + { /* + ** Calculate the y limits imposed by the ROI on this quantum. + */ + crop_y1 = CrpRoiY_(ctx) < DatY1_(src) ? DatY1_(src) : CrpRoiY_(ctx); + crop_y2 = roi_y2 > DatY2_(src) ? DatY2_(src) : roi_y2; + /* + ** Adjust the UDP to describe just the cropped portion. + */ + DatPos_(src) = DatPos_(src) + + ( crop_y1 - DatY1_(src) ) * DatScnStr_(src) + + ( CrpRoiX_(ctx) - DatX1_(src) ) * DatPxlStr_(src); + DatWidth_(src) = CrpRoiWidth_(ctx); + DatHeight_(src) = crop_y2 - crop_y1 + 1; + /* + ** Adjust the UDP so that the pixel/scanline indices are + ** relative to the output image description. + */ + dstsnk = CrpDstSnk_(ctx); + idx = DatCmpIdx_(src); + + DatX1_(src) = SnkX1_(dstsnk,idx); + DatX2_(src) = SnkX1_(dstsnk,idx) + CrpRoiWidth_(ctx) - 1 ; + + DatY1_(src) = SnkY1_(dstsnk,idx) + (crop_y1 - CrpRoiY_(ctx)); + DatY2_(src) = DatY1_(src) + DatHeight_(src) - 1; + + status = DdxRmPutData_( CrpDstSnk_(ctx), src ); + if( status != Success ) return( status ); + } + else + DdxRmDeallocData_( src ); + } + return( Success ); +} + +/***************************************************************************** +** _CropDestroy +** +** FUNCTIONAL DESCRIPTION: +** +** This routine deallocates all resources allocated by the CROP +** pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - crop pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _CropDestroy(ctx) +CropPipeCtxPtr ctx; +{ + CrpSrcDrn_(ctx) = DdxRmDestroyDrain_( CrpSrcDrn_(ctx) ); + + return( Success ); +} diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiCrop.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiCrop.h new file mode 100644 index 0000000..8701fd9 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiCrop.h @@ -0,0 +1,131 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the CROP pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.1 +** RISC ULTRIX V3.1 +** +** AUTHOR(S): +** +** Gary Grebus +** +** CREATION DATE: +** +** Thu Feb 22 14:43:45 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMICROP +#define _SMICROP + +/* +** Include files +*/ +#include + +/* +** Function reference +*/ +int SmiCreateCrop(); + + +/* +** Structure definitions and Typedefs +*/ + +/* +** Crop pipeline context block. +*/ +typedef struct _CropPipeCtx { + PipeElementCommonPart common; + struct _CropPart { + PipeSinkPtr src; + PipeSinkPtr dst; + long int x; /* Region of Interest */ + long int y; + unsigned long int width; + unsigned long int height; + PipeDrainPtr srcdrn; + } CropPart; +} CropPipeCtx, *CropPipeCtxPtr; + +/* +** MACRO definitions +*/ + +/* +** Pipeline context, Crop part, access MACROs +*/ +#define CrpSrcDrn_(ctx) (((CropPipeCtxPtr)(ctx))->CropPart.srcdrn) +/* +** Crop Parameters +*/ +#define CrpSrcSnk_(ctx) (((CropPipeCtxPtr)(ctx))->CropPart.src) +#define CrpDstSnk_(ctx) (((CropPipeCtxPtr)(ctx))->CropPart.dst) +#define CrpRoiX_(ctx) (((CropPipeCtxPtr)(ctx))->CropPart.x) +#define CrpRoiY_(ctx) (((CropPipeCtxPtr)(ctx))->CropPart.y) +#define CrpRoiWidth_(ctx) (((CropPipeCtxPtr)(ctx))->CropPart.width) +#define CrpRoiHeight_(ctx) (((CropPipeCtxPtr)(ctx))->CropPart.height) + +#endif +/* _SMICrop */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiDctDef.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiDctDef.h new file mode 100644 index 0000000..90cf021 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiDctDef.h @@ -0,0 +1,332 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains common definitions for DCT +** compression/decompression. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHORS: +** +** John Nadai +** John Weber +** Robert NC Shelley +** +** CREATION DATE: +** +** July 31, 1990 +** +*******************************************************************************/ + + /* + ** Allows to be included multiple times. + */ +#ifndef _DCTDEF +#define _DCTDEF + +#if defined(IPS) +#include +#endif + +/* +** Equated symbols +*/ + /* + ** Define TRUE and FALSE + */ +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + /* + ** Token constants + */ +#define DctK_TokenNone 0 +#define DctK_TokenSOI 1 +#define DctK_TokenSOF 2 +#define DctK_TokenSOS 3 +#define DctK_TokenData 4 +#define DctK_TokenRSC 5 +#define DctK_TokenEOI 6 +#define DctK_TokenError 7 +#define DctK_TokenMax 8 + /* + ** State constants + */ +#define DctK_StateNew 0 +#define DctK_StateSOI 1 +#define DctK_StateSOF 2 +#define DctK_StateSOS 3 +#define DctK_StateData 4 +#define DctK_StateRSC 5 +#define DctK_StateEOI 6 +#define DctK_StateErr 7 +#define DctK_StateMax 8 + /* + ** Marker code constants + */ +#define DctK_Marker 0xFF +#define DctK_MarkerSOI 0xFC +#define DctK_MarkerSOF 0xE0 +#define DctK_MarkerSOS 0xF8 +#define DctK_MarkerRSC 0xF0 +#define DctK_MarkerRSC0 0xF0 +#define DctK_MarkerRSC1 0xF1 +#define DctK_MarkerRSC2 0xF2 +#define DctK_MarkerRSC3 0xF3 +#define DctK_MarkerRSC4 0xF4 +#define DctK_MarkerRSC5 0xF5 +#define DctK_MarkerRSC6 0xF6 +#define DctK_MarkerRSC7 0xF7 +#define DctK_MarkerEOI 0xFE + /* + ** Field length constants + */ +#define DctK_LenFixedSOI 2 + +#define DctK_LenFixedSOF 13 +#define DctK_LenPerCmpSOF 2 + +#define DctK_LenFixedSOS 5 +#define DctK_LenPerCmpSOS 1 + +#define DctK_LenFixedRSC 2 + +#define DctK_LenFixedEOI 2 + /* + ** Segment routine state values. + */ +#define DctK_StatusDone 0 +#define DctK_StatusContinue -1 +#define DctK_StatusError -2 +#define DctK_StatusInput -3 +#define DctK_StatusOutput -4 + /* + ** Generic error codes, defined based on facility being built. + */ +#if defined(XIESMI) || defined(XIEDIX) +#define DctX_Success Success +#define DctX_BadAlloc BadAlloc +#define DctX_OutBufSiz BadLength +#define DctX_EncodeFail BadValue +#define DctX_DecodeFail BadValue +#define DctX_BadFactor BadValue +#define DctX_UnsOption BadImplementation + +#elif defined(IPS) +#define DctX_Success IpsX_SUCCESS +#define DctX_BadAlloc IpsX_INSVIRMEM +#define DctX_OutBufSiz IpsX_INSVIRMEM +#define DctX_EncodeFail IpsX_DCTENCODEFAIL +#define DctX_DecodeFail IpsX_DCTDECODEFAIL +#define DctX_BadFactor IpsX_DCTFACTERR +#define DctX_UnsOption IpsX_UNSOPTION +#define DctX_DctCompIdxErr IpsX_DCTCOMPIDXERR +#endif + /* + ** Parameter constants + */ +#define DctK_BlockSize 8 +#define DctK_Mode 0 +#define DctK_Precision 8 + /* + ** Generic parameters defined differently depending on the facility + ** being built. + */ +#if defined(XIESMI) || defined(XIEDIX) +#define DctK_MaxComponents XieK_MaxComponents +#elif defined(IPS) +#define DctK_MaxComponents MAX_NUMBER_OF_COMPONENTS +#endif + +/* +** MACRO definitions +*/ + + /* + ** MACROs for declaring and referencing external data structures. + */ +#ifndef externalref +#if (defined(VMS) && defined(VAXC)) +#define externalref globalref +#else +#define externalref extern +#endif +#endif + +#ifndef externaldef +#if (defined (VMS) && defined(VAXC)) +#define externaldef(psect) globaldef {"psect"} noshare +#else +#define externaldef(psect) +#endif +#endif + + /* + ** MACROs for allocating memory depending on facility. + */ +#if defined(XIESMI) || defined(XIEDIX) +#define DctCalloc_(count,size) DdxCalloc_((count),(size)) +#define DctFree_(adr) DdxFree_((adr)) +#define DctMalloc_(size) DdxMalloc_((size)) +#define DctMallocBits_(size) DdxMallocBits_((size)) +#define DctRealloc_(adr,size) DdxRealloc_((adr),(size)) +#define DctReallocBits_(adr,size) DdxReallocBits_((adr),(size)) +#elif defined(IPS) +#define DctCalloc_(count,size) \ + (*IpsA_MemoryTable[IpsK_Alloc])((count*size),(IpsM_InitMem),(0)) +#define DctFree_(adr) \ + (*IpsA_MemoryTable[IpsK_Dealloc])((adr)) +#define DctMalloc_(size) \ + (*IpsA_MemoryTable[IpsK_Alloc])((size),(0),(0)) +#define DctMallocBits_(size) \ + (*IpsA_MemoryTable[IpsK_AllocateDataPlane])(((size)+7>>3),(0),(0)) +#define DctRealloc_(adr,size) \ + (*IpsA_MemoryTable[IpsK_Realloc])((adr),(size)) +#define DctReallocBits_(adr,size) \ + (*IpsA_MemoryTable[IpsK_ReallocateDataPlane])((adr),(((size)+7>>3))) +#endif + +/* +** Quantization table definition +*/ +#define DctK_QuantTableSize 64 +#define DctK_MaxQuantTables 4 +typedef struct _QuantTable { + unsigned char quant[DctK_QuantTableSize]; +} QuantTable, *QuantTablePtr; + +/* +** Huffman table definitions +*/ +#define DctK_MaxHuffTables 4 +#define DctK_MaxHuffTblSize 512 + /* + ** Generic huffman decode table definition + */ +typedef struct _HuffDecodeEntry { + short int w1; + short int w0; +} HuffDecodeEntry, *HuffDecodeEntryPtr; + +typedef struct _HuffDecodeTable { + int half_table_size ; + struct _HuffDecodeEntry huff_decode_entry[DctK_MaxHuffTblSize]; +} HuffDecodeTable, *HuffDecodeTablePtr; + /* + ** Huffman AC table definitions + */ +typedef struct _AcSpecTable { + unsigned char huff_spec_size; + unsigned char huff_size_histo[16]; + unsigned char sorted_symbols[256]; +} AcSpecTable, *AcSpecTablePtr; + +typedef struct _AcEncodeTable { + unsigned char huff_size[256] ; + short int huff_code[256] ; +} AcEncodeTable, *AcEncodeTablePtr; + +typedef struct _AcDecodeTable { + int half_table_size ; + /* This is the maximum length needed */ + HuffDecodeEntry huff_decode_entry[512]; +} AcDecodeTable, *AcDecodeTablePtr; + /* + ** Huffman DC table definitions + */ +typedef struct _DcSpecTable { + unsigned char huff_spec_size; + unsigned char huff_size_histo[16]; + unsigned char sorted_symbols[16]; +} DcSpecTable, *DcSpecTablePtr; + +typedef struct _DcEncodeTable { + unsigned char huff_size[16] ; + short int huff_code[16] ; +} DcEncodeTable, *DcEncodeTablePtr; + +typedef struct _DcDecodeTable { + int half_table_size ; + /* This is the maximum length needed */ + HuffDecodeEntry huff_decode_entry[32]; +} DcDecodeTable, *DcDecodeTablePtr; + +/* +** Default tables. +*/ +externalref short int DctAW_ZigZag[]; +externalref QuantTable DctR_QuantDefault[]; +externalref DcSpecTable DctR_DcSpecTable[]; +externalref AcSpecTable DctR_AcSpecTable[]; +externalref DcEncodeTable DctR_DcEncodeTable[]; +externalref DcDecodeTable DctR_DcDecodeTable[]; +externalref AcEncodeTable DctR_AcEncodeTable[]; +externalref AcDecodeTable DctR_AcDecodeTable[]; + +/* +** The following line MUST be the last line of this file. +*/ +#endif +/* _DCTDEF */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiDctMacros.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiDctMacros.h new file mode 100644 index 0000000..80184a7 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiDctMacros.h @@ -0,0 +1,340 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* WARNING: These macros use private automatic variables with prefix d_ ! */ + +#define DCT_VARIABLES \ +\ +/* Working variables for dct8x8 macro */\ +\ +float d_pi = 3.14159265358979324;\ +\ +int d_k ;/* loop counter */\ +\ +unsigned char *d_puc1; /* unsigned char pointers */\ +unsigned char *d_puc2;\ +int *d_pi1; /* int pointers */\ +int *d_pi2;\ +int *d_pi3;\ +int *d_pi4;\ +int *d_pi5;\ +short int *d_ps1 ;/* short int pointer */\ +\ +int d_a[8],*d_ap ;/* intermediate stage storage */\ +int d_b[8],*d_bp ;/* intermediate stage storage */\ +int d_c[8],*d_cp ;/* intermediate stage storage */\ +\ +int d_work[64] ;/* transpose/work area */\ +\ +int d_temp ;/* temporary variable */ +/* +int d_cpi4 = (int)(cos(d_pi/4.)*65536.+.5);\ +int d_cpi8 = (int)(cos(d_pi/8.)*65536.+.5);\ +int d_spi8 = (int)(sin(d_pi/8.)*65536.+.5);\ +int d_c3pi8 = (int)(cos(3.*d_pi/8.)*65536.+.5);\ +int d_s3pi8 = (int)(sin(3.*d_pi/8.)*65536.+.5);\ +int d_cpi16 = (int)(cos(d_pi/16.)*65536.+.5);\ +int d_spi16 = (int)(sin(d_pi/16.)*65536.+.5);\ +int d_c3pi16 = (int)(cos(3.*d_pi/16.)*65536.+.5);\ +int d_s3pi16 = (int)(sin(3.*d_pi/16.)*65536.+.5);\ +int d_c5pi16 = (int)(cos(5.*d_pi/16.)*65536.+.5);\ +int d_s5pi16 = (int)(sin(5.*d_pi/16.)*65536.+.5);\ +int d_c7pi16 = (int)(cos(7.*d_pi/16.)*65536.+.5);\ +int d_s7pi16 = (int)(sin(7.*d_pi/16.)*65536.+.5);\ +*/ +#define d_cpi4 46341 /* (int)(cos(d_pi/4.)*65536.+.5) */ +#define d_cpi8 60547 /* (int)(cos(d_pi/8.)*65536.+.5) */ +#define d_spi8 25080 /* (int)(sin(d_pi/8.)*65536.+.5) */ +#define d_c3pi8 25080 /* (int)(cos(3.*d_pi/8.)*65536.+.5) */ +#define d_s3pi8 60547 /* (int)(sin(3.*d_pi/8.)*65536.+.5) */ +#define d_cpi16 64277 /* (int)(cos(d_pi/16.)*65536.+.5) */ +#define d_spi16 12785 /* (int)(sin(d_pi/16.)*65536.+.5) */ +#define d_c3pi16 54491 /* (int)(cos(3.*d_pi/16.)*65536.+.5) */ +#define d_s3pi16 36410 /* (int)(sin(3.*d_pi/16.)*65536.+.5) */ +#define d_c5pi16 36410 /* (int)(cos(5.*d_pi/16.)*65536.+.5) */ +#define d_s5pi16 54491 /* (int)(sin(5.*d_pi/16.)*65536.+.5) */ +#define d_c7pi16 12785 /* (int)(cos(7.*d_pi/16.)*65536.+.5) */ +#define d_s7pi16 64277 /* (int)(sin(7.*d_pi/16.)*65536.+.5) */ + +#define ZQ_VARIABLES \ +\ +double d_dtemp ;\ +short int *d_in_ptr,*d_out_ptr,*d_z_ptr;\ +unsigned char *d_q_ptr ;\ +int d_i ; + +/* DCT MACRO (8-bit unsigned input; 16-bit signed output) + + Inputs: > 8-bit unsigned pixels + > organized as 2-D pixel array (pixels stored by rows) + > inputs are level shifted by -128 before processing + + Outputs: > 16-bit signed DCT coefficients, rounded to integer + > organized as sequence of blocks (within blocks, the + coefficients stored by rows) +*/ + +#define DCT8x8_8U_16S_(PIXELS,COEFS,SCAN_WIDTH,PEL_WIDTH) \ +\ + d_puc1 = PIXELS ;\ + d_puc2 = d_puc1 + 7 * PEL_WIDTH ;\ + d_ps1 = COEFS ;\ + d_pi1 = d_work ;\ + for(d_k=0 ; d_k<8; d_k++)\ + {\ + d_ap = d_a ;\ + *d_ap++ = ((*d_puc1) + (*d_puc2) - 256)<<4 ;\ + d_puc1 += PEL_WIDTH; d_puc2 -= PEL_WIDTH ; \ + *d_ap++ = ((*d_puc1) + (*d_puc2) - 256)<<4 ;\ + d_puc1 += PEL_WIDTH; d_puc2 -= PEL_WIDTH ; \ + *d_ap++ = ((*d_puc1) + (*d_puc2) - 256)<<4 ;\ + d_puc1 += PEL_WIDTH; d_puc2 -= PEL_WIDTH ; \ + *d_ap++ = ((*d_puc1) + (*d_puc2) - 256)<<4 ;\ + *d_ap++ = ((*d_puc1) - (*d_puc2) )<<4 ;\ + d_puc1 -= PEL_WIDTH; d_puc2 += PEL_WIDTH ; \ + *d_ap++ = ((*d_puc1) - (*d_puc2) )<<4 ;\ + d_puc1 -= PEL_WIDTH; d_puc2 += PEL_WIDTH ; \ + *d_ap++ = ((*d_puc1) - (*d_puc2) )<<4 ;\ + d_puc1 -= PEL_WIDTH; d_puc2 += PEL_WIDTH ; \ + *d_ap = ((*d_puc1) - (*d_puc2) )<<4 ;\ + d_puc1 += SCAN_WIDTH ;\ + d_puc2 += SCAN_WIDTH ;\ +\ + d_bp = d_b ;\ + *d_bp++ = d_a[0] + d_a[3] ;\ + *d_bp++ = d_a[1] + d_a[2] ;\ + *d_bp++ = d_a[1] - d_a[2] ;\ + *d_bp++ = d_a[0] - d_a[3] ;\ + *d_bp++ = d_a[4] ;\ + *d_bp++ = (d_cpi4*(d_a[6]-d_a[5]) + 32768)>>16 ;\ + *d_bp++ = (d_cpi4*(d_a[6]+d_a[5]) + 32768)>>16 ;\ + *d_bp = d_a[7] ;\ +\ + d_cp = d_c ;\ + *d_cp++ = (d_cpi4*(d_b[0]+d_b[1]) + 32768)>>16 ;\ + *d_cp++ = (d_cpi4*(d_b[0]-d_b[1]) + 32768)>>16 ;\ + *d_cp++ = (d_spi8*d_b[2] + d_cpi8*d_b[3] + 32768)>>16 ;\ + *d_cp++ = (d_c3pi8*d_b[3] - d_s3pi8*d_b[2] + 32768)>>16 ;\ + *d_cp++ = d_b[4] + d_b[5] ;\ + *d_cp++ = d_b[4] - d_b[5] ;\ + *d_cp++ = d_b[7] - d_b[6] ;\ + *d_cp = d_b[7] + d_b[6] ;\ +\ + *d_pi1 = (d_c[0] + 1)>>1 ;\ + *(d_pi1+8) = (d_spi16*d_c[4] + d_cpi16*d_c[7] +65536)>>17 ;\ + *(d_pi1+16) = (d_c[2] + 1)>>1 ;\ + *(d_pi1+24) = (d_c3pi16*d_c[6] - d_s3pi16*d_c[5] +65536)>>17 ;\ + *(d_pi1+32) = (d_c[1] + 1)>>1 ;\ + *(d_pi1+40) = (d_s5pi16*d_c[5] + d_c5pi16*d_c[6] +65536)>>17 ;\ + *(d_pi1+48) = (d_c[3] + 1)>>1 ;\ + *(d_pi1+56) = (d_c7pi16*d_c[7] - d_s7pi16*d_c[4] +65536)>>17 ;\ + d_pi1++ ;\ + }\ + d_pi2 = d_work ;\ + d_pi3 = d_work + 7 ;\ + for(d_k=0 ; d_k <8; d_k++)\ + {\ + d_ap = d_a ;\ + *d_ap++ = (*d_pi2++) + (*d_pi3--) ;\ + *d_ap++ = (*d_pi2++) + (*d_pi3--) ;\ + *d_ap++ = (*d_pi2++) + (*d_pi3--) ;\ + *d_ap++ = (*d_pi2) + (*d_pi3) ;\ + *d_ap++ = (*d_pi2--) - (*d_pi3++) ;\ + *d_ap++ = (*d_pi2--) - (*d_pi3++) ;\ + *d_ap++ = (*d_pi2--) - (*d_pi3++) ;\ + *d_ap = (*d_pi2) - (*d_pi3) ;\ + d_pi2 += 8 ;\ + d_pi3 += 8 ;\ +\ + d_bp = d_b ;\ + *d_bp++ = d_a[0] + d_a[3] ;\ + *d_bp++ = d_a[1] + d_a[2] ;\ + *d_bp++ = d_a[1] - d_a[2] ;\ + *d_bp++ = d_a[0] - d_a[3] ;\ + *d_bp++ = d_a[4] ;\ + *d_bp++ = (d_cpi4*(d_a[6]-d_a[5]) + 32768)>>16 ;\ + *d_bp++ = (d_cpi4*(d_a[6]+d_a[5]) + 32768)>>16 ;\ + *d_bp = d_a[7] ;\ +\ + d_cp = d_c ;\ + *d_cp++ = (d_cpi4*(d_b[0]+d_b[1]) + 32768)>>16 ;\ + *d_cp++ = (d_cpi4*(d_b[0]-d_b[1]) + 32768)>>16 ;\ + *d_cp++ = (d_spi8*d_b[2] + d_cpi8*d_b[3] + 32768)>>16 ;\ + *d_cp++ = (d_c3pi8*d_b[3] - d_s3pi8*d_b[2] + 32768)>>16 ;\ + *d_cp++ = d_b[4] + d_b[5] ;\ + *d_cp++ = d_b[4] - d_b[5] ;\ + *d_cp++ = d_b[7] - d_b[6] ;\ + *d_cp = d_b[7] + d_b[6] ;\ +\ + *d_ps1 = (d_c[0] + 16 )>>5 ;\ + *(d_ps1+8) = (d_spi16*d_c[4] + d_cpi16*d_c[7] + (1<<20))>>21 ;\ + *(d_ps1+16) = (d_c[2] + 16 )>>5 ;\ + *(d_ps1+24) = (d_c3pi16*d_c[6] - d_s3pi16*d_c[5] + (1<<20))>>21 ;\ + *(d_ps1+32) = (d_c[1] + 16 )>>5 ;\ + *(d_ps1+40) = (d_s5pi16*d_c[5] + d_c5pi16*d_c[6] + (1<<20))>>21 ;\ + *(d_ps1+48) = (d_c[3] + 16 )>>5 ;\ + *(d_ps1+56) = (d_c7pi16*d_c[7] - d_s7pi16*d_c[4] + (1<<20))>>21 ;\ + d_ps1++ ;\ + } + +/* IDCT MACRO (16-bit signed input ; 8-bit unsigned output) + + Inputs: > 16-bit signed DCT coefficients + > organized as sequence of blocks (within blocks, the + coefficients stored by rows) + + Outputs: > 8-bit unsigned pixels + > organized as 2-D pixel array (pixels stored by rows) + > outputs are level shifted by -128 and clipped to + [0,255] after processing +*/ + +#define IDCT8x8_16S_8U_(COEFS,PIXELS,SCAN_WIDTH,PEL_WIDTH) \ +\ + d_ps1 = COEFS ;\ + d_pi1 = d_work ;\ + for(d_k=0 ; d_k<8; d_k++)\ + {\ + d_ap = d_a ;\ + *d_ap++ = (d_ps1[0])<<2 ;\ + *d_ap++ = (d_ps1[4*8])<<2 ;\ + *d_ap++ = (d_ps1[2*8])<<2 ;\ + *d_ap++ = (d_ps1[6*8])<<2 ;\ + *d_ap++ = ((d_spi16*d_ps1[1*8] - d_s7pi16*d_ps1[7*8]) + (1<<13))>>14 ;\ + *d_ap++ = ((d_s5pi16*d_ps1[5*8] - d_s3pi16*d_ps1[3*8]) + (1<<13))>>14 ;\ + *d_ap++ = ((d_c3pi16*d_ps1[3*8] + d_c5pi16*d_ps1[5*8]) + (1<<13))>>14 ;\ + *d_ap = ((d_cpi16*d_ps1[1*8] + d_c7pi16*d_ps1[7*8]) + (1<<13))>>14 ;\ + d_ps1++ ;\ +\ + d_bp = d_b ;\ + *d_bp++ = (d_cpi4*(d_a[0]+d_a[1]) + 32768)>>16 ;\ + *d_bp++ = (d_cpi4*(d_a[0]-d_a[1]) + 32768)>>16 ;\ + *d_bp++ = (d_spi8*d_a[2] - d_s3pi8*d_a[3] + 32768)>>16 ;\ + *d_bp++ = (d_cpi8*d_a[2] + d_c3pi8*d_a[3] + 32768)>>16 ;\ + *d_bp++ = d_a[4] + d_a[5] ;\ + *d_bp++ = d_a[4] - d_a[5] ;\ + *d_bp++ = d_a[7] - d_a[6] ;\ + *d_bp = d_a[7] + d_a[6] ;\ +\ + d_cp = d_c ;\ + *d_cp++ = d_b[0] + d_b[3] ;\ + *d_cp++ = d_b[1] + d_b[2] ;\ + *d_cp++ = d_b[1] - d_b[2] ;\ + *d_cp++ = d_b[0] - d_b[3] ;\ + *d_cp++ = d_b[4] ;\ + *d_cp++ = (d_cpi4*(d_b[6]-d_b[5]) + 32768)>>16 ;\ + *d_cp++ = (d_cpi4*(d_b[6]+d_b[5]) + 32768)>>16 ;\ + *d_cp = d_b[7] ;\ +\ + d_pi2 = d_c ;\ + d_pi3 = d_c + 7 ;\ + *d_pi1++ = ((*d_pi2++) + (*d_pi3--) + 1) >> 1 ;\ + *d_pi1++ = ((*d_pi2++) + (*d_pi3--) + 1) >> 1 ;\ + *d_pi1++ = ((*d_pi2++) + (*d_pi3--) + 1) >> 1 ;\ + *d_pi1++ = ((*d_pi2 ) + (*d_pi3 ) + 1) >> 1 ;\ + *d_pi1++ = ((*d_pi2--) - (*d_pi3++) + 1) >> 1 ;\ + *d_pi1++ = ((*d_pi2--) - (*d_pi3++) + 1) >> 1 ;\ + *d_pi1++ = ((*d_pi2--) - (*d_pi3++) + 1) >> 1 ;\ + *d_pi1++ = ((*d_pi2 ) - (*d_pi3 ) + 1) >> 1 ;\ + }\ +\ + d_pi2 = d_work ;\ + d_pi4 = d_c ;\ + d_pi5 = d_c + 7 ;\ + d_puc2 = PIXELS ;\ +\ + for(d_k=0 ; d_k <8; d_k++)\ + {\ + d_ap = d_a ;\ + *d_ap++ = d_pi2[0] ;\ + *d_ap++ = d_pi2[4*8] ;\ + *d_ap++ = d_pi2[2*8] ;\ + *d_ap++ = d_pi2[6*8] ;\ + *d_ap++ = (d_spi16*d_pi2[1*8] - d_s7pi16*d_pi2[7*8] + 32768)>>16 ;\ + *d_ap++ = (d_s5pi16*d_pi2[5*8] - d_s3pi16*d_pi2[3*8] + 32768)>>16 ;\ + *d_ap++ = (d_c3pi16*d_pi2[3*8] + d_c5pi16*d_pi2[5*8] + 32768)>>16 ;\ + *d_ap = (d_cpi16*d_pi2[1*8] + d_c7pi16*d_pi2[7*8] + 32768)>>16 ;\ + d_pi2++ ;\ +\ + d_bp = d_b ;\ + *d_bp++ = (d_cpi4*(d_a[0]+d_a[1]) + 32768)>>16 ;\ + *d_bp++ = (d_cpi4*(d_a[0]-d_a[1]) + 32768)>>16 ;\ + *d_bp++ = (d_spi8*d_a[2] - d_s3pi8*d_a[3] + 32768)>>16 ;\ + *d_bp++ = (d_cpi8*d_a[2] + d_c3pi8*d_a[3] + 32768)>>16 ;\ + *d_bp++ = d_a[4] + d_a[5] ;\ + *d_bp++ = d_a[4] - d_a[5] ;\ + *d_bp++ = d_a[7] - d_a[6] ;\ + *d_bp = d_a[7] + d_a[6] ;\ +\ + d_cp = d_c ;\ + *d_cp++ = (d_b[0] + d_b[3] + 4 )>>3 ;\ + *d_cp++ = (d_b[1] + d_b[2] + 4 )>>3 ;\ + *d_cp++ = (d_b[1] - d_b[2] + 4 )>>3 ;\ + *d_cp++ = (d_b[0] - d_b[3] + 4 )>>3 ;\ + *d_cp++ = (d_b[4] + 4 )>>3 ;\ + *d_cp++ = (d_cpi4*(d_b[6]-d_b[5]) + (1<<18))>>19 ;\ + *d_cp++ = (d_cpi4*(d_b[6]+d_b[5]) + (1<<18))>>19 ;\ + *d_cp = (d_b[7] + 4 )>>3 ;\ +\ + d_puc1 = d_puc2 ;\ + if( (d_temp = (*d_pi4++) + (*d_pi5--)) > 127) *d_puc1 = 255 ;\ + else if(d_temp < -128) *d_puc1 = 0 ;\ + else *d_puc1 = d_temp + 128 ;\ + d_puc1 += PEL_WIDTH; \ + if( (d_temp = (*d_pi4++) + (*d_pi5--)) > 127) *d_puc1 = 255 ;\ + else if(d_temp < -128) *d_puc1 = 0 ;\ + else *d_puc1 = d_temp + 128 ;\ + d_puc1 += PEL_WIDTH; \ + if( (d_temp = (*d_pi4++) + (*d_pi5--)) > 127) *d_puc1 = 255 ;\ + else if(d_temp < -128) *d_puc1 = 0 ;\ + else *d_puc1 = d_temp + 128 ;\ + d_puc1 += PEL_WIDTH; \ + if( (d_temp = (*d_pi4) + (*d_pi5)) > 127) *d_puc1 = 255 ;\ + else if(d_temp < -128) *d_puc1 = 0 ;\ + else *d_puc1 = d_temp + 128 ;\ + d_puc1 += PEL_WIDTH; \ + if( (d_temp = (*d_pi4--) - (*d_pi5++)) > 127) *d_puc1 = 255 ;\ + else if(d_temp < -128) *d_puc1 = 0 ;\ + else *d_puc1 = d_temp + 128 ;\ + d_puc1 += PEL_WIDTH; \ + if( (d_temp = (*d_pi4--) - (*d_pi5++)) > 127) *d_puc1 = 255 ;\ + else if(d_temp < -128) *d_puc1 = 0 ;\ + else *d_puc1 = d_temp + 128 ;\ + d_puc1 += PEL_WIDTH; \ + if( (d_temp = (*d_pi4--) - (*d_pi5++)) > 127) *d_puc1 = 255 ;\ + else if(d_temp < -128) *d_puc1 = 0 ;\ + else *d_puc1 = d_temp + 128 ;\ + d_puc1 += PEL_WIDTH; \ + if( (d_temp = (*d_pi4) - (*d_pi5)) > 127) *d_puc1 = 255 ;\ + else if(d_temp < -128) *d_puc1 = 0 ;\ + else *d_puc1 = d_temp + 128 ;\ + d_puc2 += SCAN_WIDTH ;\ + } + +#define GetBit_(base,offset) \ + (*((unsigned char *)(base)+((offset)>>3))>>((offset)&7)&1) + +#define get_pad_byte(offset)\ + (offset) += 8 - (9offset) & 7); diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiDctTables.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiDctTables.c new file mode 100644 index 0000000..997d0fd --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiDctTables.c @@ -0,0 +1,1275 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains data tables used by DCT (de)compression routines. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHORS: +** +** John Nadai +** John Weber +** +** CREATION DATE: +** +** July 31, 1990 +** +*******************************************************************************/ + +/* +** INCLUDE FILES +*/ +#if defined(XIESMI) +#include +#elif defined(IPS) +#include +#endif + +/* +** Table used for mapping the zigzag pattern used when quantizing DCT +** coefficients. +*/ +externaldef (DctAW_ZigZag) short int DctAW_ZigZag[64] = +{ + 0, 1, 8,16, 9, 2, 3,10, 17,24,32,25,18,11, 4, 5, + 12,19,26,33,40,48,41,34, 27,20,13, 6, 7,14,21,28, + 35,42,49,56,57,50,43,36, 29,22,15,23,30,37,44,51, + 58,59,52,45,38,31,39,46, 53,60,61,54,47,55,62,63 +} ; + +/* For reference, this is the inverse zigzag mapping */ + +/* static short int zigzag[64] = { + 0, 1, 5, 6,14,15,27,28, 2, 4, 7,13,16,26,29,42, + 3, 8,12,17,25,30,41,43, 9,11,18,24,31,40,44,53, + 10,19,23,32,39,45,52,54, 20,22,33,38,46,51,55,60, + 21,34,37,47,50,56,59,61, 35,36,48,49,57,58,62,63 } ; +*/ + + +/* Default (Recommended) Quantization tables in zigzag order */ + +externaldef (DctR_QuantDefault) QuantTable DctR_QuantDefault[2] = { + { + 16,11, 12, 14, 12,10,16, 14, 13, 14, 18, 17,16, 19, 24,40, + 26,24, 22, 22, 24,49,35, 37, 29, 40, 58, 51,61, 60, 57,51, + 56,55, 64, 72, 92,78,64, 68, 87, 69, 55, 56,80,109, 81,87, + 95,98,103,104,103,62,77,113, 121,112,100,120,92,101,103,99 + }, + + { + 17,18,18,24,21,24,47,26, 26,47,99,66,56,66,66,99, + 99,99,99,99,99,99,99,99, 99,99,99,99,99,99,99,99, + 99,99,99,99,99,99,99,99, 99,99,99,99,99,99,99,99, + 99,99,99,99,99,99,99,99, 99,99,99,99,99,99,99,99 + } +}; + +/* For reference, this is the non-zigzag ordered default quantizer table */ + +/* {{16,11,10,16,24,40,51,61}, {12,12,14,19,26,58,60,55}, + {14,13,16,24,40,57,69,56}, {14,17,22,29,51,87,80,62}, + {18,22,37,56,68,109,103,77}, {24,35,55,64,81,104,113,92}, + {49,64,78,87,103,121,120,101},{72,92,95,98,112,100,103,99}}, + + {{17,18,24,47,66,99,99,99}, {18,21,26,66,99,99,99,99}, + {24,26,56,99,99,99,99,99}, {47,66,99,99,99,99,99,99}, + {99,99,99,99,99,99,99,99}, {99,99,99,99,99,99,99,99}, + {99,99,99,99,99,99,99,99}, {99,99,99,99,99,99,99,99}}} ; +*/ + + +/* Default DC Huffman Specification tables */ + +externaldef (DctR_DcSpecTable) DcSpecTable DctR_DcSpecTable[2] = { + { 12, + + 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + + 3, 0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0, 0, 0 + } , + + { 12, + + 0, 2, 3, 1, 1, 1, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, + + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0, 0, 0 + } +} ; + +/* Default DC Huffman Encoder tables */ + +externaldef (DctR_DcEncodeTable) DcEncodeTable DctR_DcEncodeTable[2] = { +#ifndef MSB_FIRST + { {3, 3, 3, 2, 3, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0}, + + {2, 6, 1, 0, 5, 3, 7, 15, 31, 63, 127, 255, 0, 0, 0, 0} + } , + + { {2, 2, 3, 3, 3, 4, 5, 6, 7, 9, 9, 9, 0, 0, 0, 0}, + + {0, 2, 1, 5, 3, 7, 15, 31, 63, 127, 383, 255, 0, 0, 0, 0} + } +#else +{ + { {3, 3, 3, 2, 3, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0}, + + {2, 3, 4, 0, 5, 6, 14, 30, 62, 126, 254, 510, 0, 0, 0, 0} + } , + + { {2, 2, 3, 3, 3, 4, 5, 6, 7, 9, 9, 9, 0, 0, 0, 0}, + + {0, 1, 4, 5, 6, 14, 30, 62, 126, 508, 509, 510, 0, 0, 0, 0} + } +#endif +} ; + + +/* Default DC Huffman Decoder tables */ + +externaldef (DctR_DcDecodeTable) DcDecodeTable DctR_DcDecodeTable[2] = +{ + { + 12, /* Half table size */ + { /* Table entries */ + {0, 1}, + {3, 0}, + {0, 0}, + {0, 4}, + {2, 0}, + {5, 0}, + {6, 0}, + {7, 0}, + {8, 0}, + {9, 0}, + {10, 0}, + {11, 0}, + {0, 3}, + {0, 2}, + {1, 0}, + {0, 5}, + {4, 0}, + {0, 6}, + {0, 7}, + {0, 8}, + {0, 9}, + {0, 10}, + {0, 11}, + {0, 0} + } + }, + { + 12, /* Half table size */ + { /* Table entries */ + {0, 1}, + {0, 0}, + {0, 3}, + {2, 0}, + {4, 0}, + {5, 0}, + {6, 0}, + {7, 0}, + {8, 0}, + {0, 10}, + {9, 0}, + {11, 0}, + {0, 2}, + {1, 0}, + {0, 4}, + {3, 0}, + {0, 5}, + {0, 6}, + {0, 7}, + {0, 8}, + {0, 9}, + {0, 11}, + {10, 0}, + {0, 0} + } + } +} ; + + +/* Default AC Huffman Specification tables */ + +externaldef (DctR_AcSpecTable) AcSpecTable DctR_AcSpecTable[2] = +{ + { 162, + + 0, 2, 1, 3, 2, 4, 4, 3, 5, 5, 5, 2, 0, 0, 1, 125, + + 1, 2, 3, 0, 4, 0x11, 5, 0x21, + 6, 0x12, 0x31, 0x41, 7, 0x13, 0x51, 0x61, + 0x22, 0x71, 0x81, 0x14, 0x32, 0x91, 0xa1, 0xb1, + 8, 0x23, 0x42, 0x52, 0xc1, 0x15, 0x33, 0x62, + 0x72, 0xd1, 0xe1, 0xf0, 0x82, 9, 0xa, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, + 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, + 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, + 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, + 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, + 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, + 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, + 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 + } , + + { 162, + + 0, 2, 1, 2, 4, 3, 5, 6, 3, 5, 4, 4, 0, 1, 1, 121, + + 0, 1, 2, 3, 0x11, 4, 0x21, 0x31, + 0x41, 0x12, 0x51, 0x71, 5, 0x22, 0x32, 0x61, + 0x81, 0x13, 0x42, 0x91, 0xa1, 0xb1, 0xc1, 6, + 0x33, 0x52, 0x14, 0x23, 0x62, 0x72, 0xd1, 0x24, + 0x34, 0x43, 0xf0, 0x82, 0x92, 0xb2, 0xe1, 0x53, + 0x15, 7, 8, 9, 0xa, 0x16, 0x17, 0x18, + 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, + 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x54, 0x55, 0x56, + 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, + 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, + 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, + 0x87, 0x88, 0x89, 0x8a, 0x93, 0x94, 0x95, 0x96, + 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb3, 0xb4, 0xb5, + 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, + 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, + 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, + 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, + 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 + } +} ; + + +/* Default AC Huffman Encoder tables */ + + +externaldef (DctR_AcEncodeTable) AcEncodeTable DctR_AcEncodeTable[2] = +{ +#ifndef MSB_FIRST + {{ 4, 2, 2, 3, 4, 5, 6, 7, + 10, 16, 16, 0, 0, 0, 0, 0, + 0, 4, 6, 7, 9, 11, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 5, 8, 10, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 6, 9, 11, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 6, 10, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 7, 10, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 7, 11, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 8, 11, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 8, 15, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 9, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 9, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 9, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 10, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 11, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 12, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 12, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0}, + + { 5, 0, 2, 1, 13, 11, 7, 15, + 447, 16895, 49663, 0, 0, 0, 0, 0, + 0, 3, 39, 79, 223, 895, 8703, 41471, + 25087, 57855, 4607, 0, 0, 0, 0, 0, + 0, 27, 31, 959, 37375, 20991, 53759, 12799, + 45567, 29183, 61951, 0, 0, 0, 0, 0, + 0, 23, 479, 1919, 2559, 35327, 18943, 51711, + 10751, 43519, 27135, 0, 0, 0, 0, 0, + 0, 55, 127, 59903, 6655, 39423, 23039, 55807, + 14847, 47615, 31231, 0, 0, 0, 0, 0, + 0, 47, 639, 63999, 1535, 34303, 17919, 50687, + 9727, 42495, 26111, 0, 0, 0, 0, 0, + 0, 111, 255, 58879, 5631, 38399, 22015, 54783, + 13823, 46591, 30207, 0, 0, 0, 0, 0, + 0, 159, 1279, 62975, 3583, 36351, 19967, 52735, + 11775, 44543, 28159, 0, 0, 0, 0, 0, + 0, 95, 511, 60927, 7679, 40447, 24063, 56831, + 15871, 48639, 32255, 0, 0, 0, 0, 0, + 0, 63, 65023, 1023, 33791, 17407, 50175, 9215, + 41983, 25599, 58367, 0, 0, 0, 0, 0, + 0, 319, 5119, 37887, 21503, 54271, 13311, 46079, + 29695, 62463, 3071, 0, 0, 0, 0, 0, + 0, 191, 35839, 19455, 52223, 11263, 44031, 27647, + 60415, 7167, 39935, 0, 0, 0, 0, 0, + 0, 383, 23551, 56319, 15359, 48127, 31743, 64511, + 2047, 34815, 18431, 0, 0, 0, 0, 0, + 0, 767, 51199, 10239, 43007, 26623, 59391, 6143, + 38911, 22527, 55295, 0, 0, 0, 0, 0, + 0, 1791, 14335, 47103, 30719, 63487, 4095, 36863, + 20479, 53247, 12287, 0, 0, 0, 0, 0, + 3839, 45055, 28671, 61439, 8191, 40959, 24575, 57343, + 16383, 49151, 32767, 0, 0, 0, 0, 0} + } , + + {{ 2, 2, 3, 4, 5, 7, 9, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 4, 6, 8, 10, 15, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 5, 7, 10, 11, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 5, 7, 9, 11, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 5, 8, 11, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 6, 9, 14, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 7, 10, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 6, 10, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 7, 12, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 8, 12, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 8, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 8, 12, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 8, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 10, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 12, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 11, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0}, + + { 0, 2, 1, 5, 3, 55, 63, 25087, + 57855, 4607, 37375, 0, 0, 0, 0, 0, + 0, 13, 7, 111, 447, 8703, 20991, 53759, + 12799, 45567, 29183, 0, 0, 0, 0, 0, + 0, 19, 119, 959, 895, 61951, 2559, 35327, + 18943, 51711, 10751, 0, 0, 0, 0, 0, + 0, 11, 15, 319, 1919, 43519, 27135, 59903, + 6655, 39423, 23039, 0, 0, 0, 0, 0, + 0, 27, 239, 255, 55807, 14847, 47615, 31231, + 63999, 1535, 34303, 0, 0, 0, 0, 0, + 0, 39, 191, 511, 17919, 50687, 9727, 42495, + 26111, 58879, 5631, 0, 0, 0, 0, 0, + 0, 79, 127, 38399, 22015, 54783, 13823, 46591, + 30207, 62975, 3583, 0, 0, 0, 0, 0, + 0, 23, 639, 36351, 19967, 52735, 11775, 44543, + 28159, 60927, 7679, 0, 0, 0, 0, 0, + 0, 47, 767, 40447, 24063, 56831, 15871, 48639, + 32255, 65023, 1023, 0, 0, 0, 0, 0, + 0, 31, 2815, 33791, 17407, 50175, 9215, 41983, + 25599, 58367, 5119, 0, 0, 0, 0, 0, + 0, 159, 37887, 21503, 54271, 13311, 46079, 29695, + 62463, 3071, 35839, 0, 0, 0, 0, 0, + 0, 95, 1791, 19455, 52223, 11263, 44031, 27647, + 60415, 7167, 39935, 0, 0, 0, 0, 0, + 0, 223, 23551, 56319, 15359, 48127, 31743, 64511, + 2047, 34815, 18431, 0, 0, 0, 0, 0, + 0, 383, 51199, 10239, 43007, 26623, 59391, 6143, + 38911, 22527, 55295, 0, 0, 0, 0, 0, + 0, 3839, 14335, 47103, 30719, 63487, 4095, 36863, + 20479, 53247, 12287, 0, 0, 0, 0, 0, + 1279, 45055, 28671, 61439, 8191, 40959, 24575, 57343, + 16383, 49151, 32767, 0, 0, 0, 0, 0} + } +#else + {{ 4, 2, 2, 3, 4, 5, 6, 7, + 10, 16, 16, 0, 0, 0, 0, 0, + 0, 4, 6, 7, 9, 11, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 5, 8, 10, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 6, 9, 11, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 6, 10, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 7, 10, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 7, 11, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 8, 11, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 8, 15, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 9, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 9, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 9, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 10, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 11, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 12, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 12, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0}, + + { 10, 0, 1, 4, 11, 26, 56, 120, + 1014, 65410, 65411, 0, 0, 0, 0, 0, + 0, 12, 57, 121, 502, 2038, 65412, 65413, + 65414, 65415, 65416, 0, 0, 0, 0, 0, + 0, 27, 248, 1015, 65417, 65418, 65419, 65420, + 65421, 65422, 65423, 0, 0, 0, 0, 0, + 0, 58, 503, 2039, 65424, 65425, 65426, 65427, + 65428, 65429, 65430, 0, 0, 0, 0, 0, + 0, 59, 1016, 65431, 65432, 65433, 65434, 65435, + 65436, 65437, 65438, 0, 0, 0, 0, 0, + 0, 122, 1017, 65439, 65440, 65441, 65442, 65443, + 65444, 65445, 65446, 0, 0, 0, 0, 0, + 0, 123, 2040, 65447, 65448, 65449, 65450, 65451, + 65452, 65453, 65454, 0, 0, 0, 0, 0, + 0, 249, 2041, 65455, 65456, 65457, 65458, 65459, + 65460, 65461, 65462, 0, 0, 0, 0, 0, + 0, 250, 32704, 65463, 65464, 65465, 65466, 65467, + 65468, 65469, 65470, 0, 0, 0, 0, 0, + 0, 504, 65471, 65472, 65473, 65474, 65475, 65476, + 65477, 65478, 65479, 0, 0, 0, 0, 0, + 0, 505, 65480, 65481, 65482, 65483, 65484, 65485, + 65486, 65487, 65488, 0, 0, 0, 0, 0, + 0, 506, 65489, 65490, 65491, 65492, 65493, 65494, + 65495, 65496, 65497, 0, 0, 0, 0, 0, + 0, 1018, 65498, 65499, 65500, 65501, 65502, 65503, + 65504, 65505, 65506, 0, 0, 0, 0, 0, + 0, 2042, 65507, 65508, 65509, 65510, 65511, 65512, + 65513, 65514, 65515, 0, 0, 0, 0, 0, + 0, 4086, 65516, 65517, 65518, 65519, 65520, 65521, + 65522, 65523, 65524, 0, 0, 0, 0, 0, + 4087, 65525, 65526, 65527, 65528, 65529, 65530, 65531, + 65532, 65533, 65534, 0, 0, 0, 0, 0} + } , + + {{ 2, 2, 3, 4, 5, 7, 9, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 4, 6, 8, 10, 15, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 5, 7, 10, 11, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 5, 7, 9, 11, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 5, 8, 11, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 6, 9, 14, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 7, 10, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 6, 10, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 7, 12, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 8, 12, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 8, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 8, 12, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 8, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 10, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 0, 12, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 11, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0}, + + { 0, 1, 4, 10, 24, 118, 504, 65414, + 65415, 65416, 65417, 0, 0, 0, 0, 0, + 0, 11, 56, 246, 1014, 32706, 65418, 65419, + 65420, 65421, 65422, 0, 0, 0, 0, 0, + 0, 25, 119, 1015, 2038, 65423, 65424, 65425, + 65426, 65427, 65428, 0, 0, 0, 0, 0, + 0, 26, 120, 505, 2039, 65429, 65430, 65431, + 65432, 65433, 65434, 0, 0, 0, 0, 0, + 0, 27, 247, 2040, 65435, 65436, 65437, 65438, + 65439, 65440, 65441, 0, 0, 0, 0, 0, + 0, 57, 506, 16352, 65442, 65443, 65444, 65445, + 65446, 65447, 65448, 0, 0, 0, 0, 0, + 0, 121, 1016, 65449, 65450, 65451, 65452, 65453, + 65454, 65455, 65456, 0, 0, 0, 0, 0, + 0, 58, 1017, 65457, 65458, 65459, 65460, 65461, + 65462, 65463, 65464, 0, 0, 0, 0, 0, + 0, 122, 4084, 65465, 65466, 65467, 65468, 65469, + 65470, 65471, 65472, 0, 0, 0, 0, 0, + 0, 248, 4085, 65473, 65474, 65475, 65476, 65477, + 65478, 65479, 65480, 0, 0, 0, 0, 0, + 0, 249, 65481, 65482, 65483, 65484, 65485, 65486, + 65487, 65488, 65489, 0, 0, 0, 0, 0, + 0, 250, 4086, 65490, 65491, 65492, 65493, 65494, + 65495, 65496, 65497, 0, 0, 0, 0, 0, + 0, 251, 65498, 65499, 65500, 65501, 65502, 65503, + 65504, 65505, 65506, 0, 0, 0, 0, 0, + 0, 1018, 65507, 65508, 65509, 65510, 65511, 65512, + 65513, 65514, 65515, 0, 0, 0, 0, 0, + 0, 4087, 65516, 65517, 65518, 65519, 65520, 65521, + 65522, 65523, 65524, 0, 0, 0, 0, 0, + 2041, 65525, 65526, 65527, 65528, 65529, 65530, 65531, + 65532, 65533, 65534, 0, 0, 0, 0, 0} + } +#endif +} ; + + + + +/* Default AC Huff Decoder tables */ + +externaldef (DctR_AcDecodeTable) AcDecodeTable DctR_AcDecodeTable[2] = +{ + { + 162, /* Half table size */ + { /* Table entries */ + { 0, 1}, + { 1, 0}, + { 0, 3}, + { 3, 0}, + { 0, 0}, + { 0, 6}, + { 17, 0}, + { 5, 0}, + { 0, 9}, + { 0, 10}, + { 6, 0}, + { 49, 0}, + { 0, 13}, + { 0, 14}, + { 7, 0}, + { 81, 0}, + { 0, 17}, + { 0, 18}, + { 34, 0}, + { 129, 0}, + { 20, 0}, + { 0, 22}, + { 0, 23}, + { 145, 0}, + { 177, 0}, + { 8, 0}, + { 0, 27}, + { 0, 28}, + { 66, 0}, + { 193, 0}, + { 21, 0}, + { 0, 32}, + { 0, 33}, + { 98, 0}, + { 209, 0}, + { 225, 0}, + { 0, 37}, + { 0, 38}, + { 0, 39}, + { 0, 40}, + { 0, 41}, + { 130, 0}, + { 9, 0}, + { 0, 44}, + { 22, 0}, + { 24, 0}, + { 0, 47}, + { 0, 48}, + { 26, 0}, + { 37, 0}, + { 0, 51}, + { 39, 0}, + { 41, 0}, + { 0, 54}, + { 0, 55}, + { 0, 56}, + { 52, 0}, + { 54, 0}, + { 0, 59}, + { 56, 0}, + { 58, 0}, + { 0, 62}, + { 0, 63}, + { 68, 0}, + { 70, 0}, + { 0, 66}, + { 72, 0}, + { 74, 0}, + { 0, 69}, + { 0, 70}, + { 0, 71}, + { 0, 72}, + { 84, 0}, + { 86, 0}, + { 0, 75}, + { 88, 0}, + { 90, 0}, + { 0, 78}, + { 0, 79}, + { 100, 0}, + { 102, 0}, + { 0, 82}, + { 104, 0}, + { 106, 0}, + { 0, 85}, + { 0, 86}, + { 0, 87}, + { 116, 0}, + { 118, 0}, + { 0, 90}, + { 120, 0}, + { 122, 0}, + { 0, 93}, + { 0, 94}, + { 132, 0}, + { 134, 0}, + { 0, 97}, + { 136, 0}, + { 138, 0}, + { 0, 100}, + { 0, 101}, + { 0, 102}, + { 0, 103}, + { 0, 104}, + { 147, 0}, + { 149, 0}, + { 0, 107}, + { 151, 0}, + { 153, 0}, + { 0, 110}, + { 0, 111}, + { 162, 0}, + { 164, 0}, + { 0, 114}, + { 166, 0}, + { 168, 0}, + { 0, 117}, + { 0, 118}, + { 0, 119}, + { 170, 0}, + { 179, 0}, + { 0, 122}, + { 181, 0}, + { 183, 0}, + { 0, 125}, + { 0, 126}, + { 185, 0}, + { 194, 0}, + { 0, 129}, + { 196, 0}, + { 198, 0}, + { 0, 132}, + { 0, 133}, + { 0, 134}, + { 0, 135}, + { 200, 0}, + { 202, 0}, + { 0, 138}, + { 211, 0}, + { 213, 0}, + { 0, 141}, + { 0, 142}, + { 215, 0}, + { 217, 0}, + { 0, 145}, + { 226, 0}, + { 228, 0}, + { 0, 148}, + { 0, 149}, + { 0, 150}, + { 230, 0}, + { 232, 0}, + { 0, 153}, + { 234, 0}, + { 242, 0}, + { 0, 156}, + { 0, 157}, + { 244, 0}, + { 246, 0}, + { 0, 160}, + { 248, 0}, + { 250, 0}, + { 0, 2}, + { 2, 0}, + { 0, 5}, + { 0, 4}, + { 4, 0}, + { 0, 8}, + { 0, 7}, + { 33, 0}, + { 0, 12}, + { 0, 11}, + { 18, 0}, + { 65, 0}, + { 0, 16}, + { 0, 15}, + { 19, 0}, + { 97, 0}, + { 0, 21}, + { 0, 19}, + { 113, 0}, + { 0, 20}, + { 50, 0}, + { 0, 26}, + { 0, 24}, + { 161, 0}, + { 0, 25}, + { 35, 0}, + { 0, 31}, + { 0, 29}, + { 82, 0}, + { 0, 30}, + { 51, 0}, + { 0, 36}, + { 0, 34}, + { 114, 0}, + { 0, 35}, + { 240, 0}, + { 0, 99}, + { 0, 68}, + { 0, 53}, + { 0, 46}, + { 0, 43}, + { 0, 42}, + { 10, 0}, + { 0, 45}, + { 23, 0}, + { 25, 0}, + { 0, 50}, + { 0, 49}, + { 36, 0}, + { 38, 0}, + { 0, 52}, + { 40, 0}, + { 42, 0}, + { 0, 61}, + { 0, 58}, + { 0, 57}, + { 53, 0}, + { 55, 0}, + { 0, 60}, + { 57, 0}, + { 67, 0}, + { 0, 65}, + { 0, 64}, + { 69, 0}, + { 71, 0}, + { 0, 67}, + { 73, 0}, + { 83, 0}, + { 0, 84}, + { 0, 77}, + { 0, 74}, + { 0, 73}, + { 85, 0}, + { 87, 0}, + { 0, 76}, + { 89, 0}, + { 99, 0}, + { 0, 81}, + { 0, 80}, + { 101, 0}, + { 103, 0}, + { 0, 83}, + { 105, 0}, + { 115, 0}, + { 0, 92}, + { 0, 89}, + { 0, 88}, + { 117, 0}, + { 119, 0}, + { 0, 91}, + { 121, 0}, + { 131, 0}, + { 0, 96}, + { 0, 95}, + { 133, 0}, + { 135, 0}, + { 0, 98}, + { 137, 0}, + { 146, 0}, + { 0, 131}, + { 0, 116}, + { 0, 109}, + { 0, 106}, + { 0, 105}, + { 148, 0}, + { 150, 0}, + { 0, 108}, + { 152, 0}, + { 154, 0}, + { 0, 113}, + { 0, 112}, + { 163, 0}, + { 165, 0}, + { 0, 115}, + { 167, 0}, + { 169, 0}, + { 0, 124}, + { 0, 121}, + { 0, 120}, + { 178, 0}, + { 180, 0}, + { 0, 123}, + { 182, 0}, + { 184, 0}, + { 0, 128}, + { 0, 127}, + { 186, 0}, + { 195, 0}, + { 0, 130}, + { 197, 0}, + { 199, 0}, + { 0, 147}, + { 0, 140}, + { 0, 137}, + { 0, 136}, + { 201, 0}, + { 210, 0}, + { 0, 139}, + { 212, 0}, + { 214, 0}, + { 0, 144}, + { 0, 143}, + { 216, 0}, + { 218, 0}, + { 0, 146}, + { 227, 0}, + { 229, 0}, + { 0, 155}, + { 0, 152}, + { 0, 151}, + { 231, 0}, + { 233, 0}, + { 0, 154}, + { 241, 0}, + { 243, 0}, + { 0, 159}, + { 0, 158}, + { 245, 0}, + { 247, 0}, + { 0, 161}, + { 249, 0}, + { 0, 0} + } + }, + { + 162, /* Half table size */ + { /* Table entries */ + { 0, 1}, + { 0, 0}, + { 0, 3}, + { 2, 0}, + { 3, 0}, + { 0, 6}, + { 0, 7}, + { 4, 0}, + { 49, 0}, + { 0, 10}, + { 0, 11}, + { 18, 0}, + { 113, 0}, + { 5, 0}, + { 0, 15}, + { 0, 16}, + { 50, 0}, + { 129, 0}, + { 19, 0}, + { 0, 20}, + { 0, 21}, + { 145, 0}, + { 177, 0}, + { 0, 24}, + { 0, 25}, + { 6, 0}, + { 82, 0}, + { 20, 0}, + { 0, 29}, + { 0, 30}, + { 98, 0}, + { 209, 0}, + { 36, 0}, + { 0, 34}, + { 0, 35}, + { 67, 0}, + { 0, 37}, + { 130, 0}, + { 178, 0}, + { 0, 40}, + { 0, 41}, + { 0, 42}, + { 0, 43}, + { 83, 0}, + { 21, 0}, + { 7, 0}, + { 0, 47}, + { 0, 48}, + { 9, 0}, + { 22, 0}, + { 0, 51}, + { 24, 0}, + { 26, 0}, + { 0, 54}, + { 0, 55}, + { 0, 56}, + { 38, 0}, + { 40, 0}, + { 0, 59}, + { 42, 0}, + { 54, 0}, + { 0, 62}, + { 0, 63}, + { 56, 0}, + { 58, 0}, + { 0, 66}, + { 69, 0}, + { 71, 0}, + { 0, 69}, + { 0, 70}, + { 0, 71}, + { 0, 72}, + { 73, 0}, + { 84, 0}, + { 0, 75}, + { 86, 0}, + { 88, 0}, + { 0, 78}, + { 0, 79}, + { 90, 0}, + { 100, 0}, + { 0, 82}, + { 102, 0}, + { 104, 0}, + { 0, 85}, + { 0, 86}, + { 0, 87}, + { 106, 0}, + { 116, 0}, + { 0, 90}, + { 118, 0}, + { 120, 0}, + { 0, 93}, + { 0, 94}, + { 122, 0}, + { 132, 0}, + { 0, 97}, + { 134, 0}, + { 136, 0}, + { 0, 100}, + { 0, 101}, + { 0, 102}, + { 0, 103}, + { 0, 104}, + { 138, 0}, + { 148, 0}, + { 0, 107}, + { 150, 0}, + { 152, 0}, + { 0, 110}, + { 0, 111}, + { 154, 0}, + { 163, 0}, + { 0, 114}, + { 165, 0}, + { 167, 0}, + { 0, 117}, + { 0, 118}, + { 0, 119}, + { 169, 0}, + { 179, 0}, + { 0, 122}, + { 181, 0}, + { 183, 0}, + { 0, 125}, + { 0, 126}, + { 185, 0}, + { 194, 0}, + { 0, 129}, + { 196, 0}, + { 198, 0}, + { 0, 132}, + { 0, 133}, + { 0, 134}, + { 0, 135}, + { 200, 0}, + { 202, 0}, + { 0, 138}, + { 211, 0}, + { 213, 0}, + { 0, 141}, + { 0, 142}, + { 215, 0}, + { 217, 0}, + { 0, 145}, + { 226, 0}, + { 228, 0}, + { 0, 148}, + { 0, 149}, + { 0, 150}, + { 230, 0}, + { 232, 0}, + { 0, 153}, + { 234, 0}, + { 242, 0}, + { 0, 156}, + { 0, 157}, + { 244, 0}, + { 246, 0}, + { 0, 160}, + { 248, 0}, + { 250, 0}, + { 0, 2}, + { 1, 0}, + { 0, 5}, + { 0, 4}, + { 17, 0}, + { 0, 9}, + { 0, 8}, + { 33, 0}, + { 65, 0}, + { 0, 14}, + { 0, 12}, + { 81, 0}, + { 0, 13}, + { 34, 0}, + { 0, 19}, + { 0, 17}, + { 97, 0}, + { 0, 18}, + { 66, 0}, + { 0, 23}, + { 0, 22}, + { 161, 0}, + { 193, 0}, + { 0, 28}, + { 0, 26}, + { 51, 0}, + { 0, 27}, + { 35, 0}, + { 0, 33}, + { 0, 31}, + { 114, 0}, + { 0, 32}, + { 52, 0}, + { 0, 39}, + { 0, 36}, + { 240, 0}, + { 0, 38}, + { 146, 0}, + { 225, 0}, + { 0, 99}, + { 0, 68}, + { 0, 53}, + { 0, 46}, + { 0, 44}, + { 0, 45}, + { 8, 0}, + { 0, 50}, + { 0, 49}, + { 10, 0}, + { 23, 0}, + { 0, 52}, + { 25, 0}, + { 37, 0}, + { 0, 61}, + { 0, 58}, + { 0, 57}, + { 39, 0}, + { 41, 0}, + { 0, 60}, + { 53, 0}, + { 55, 0}, + { 0, 65}, + { 0, 64}, + { 57, 0}, + { 68, 0}, + { 0, 67}, + { 70, 0}, + { 72, 0}, + { 0, 84}, + { 0, 77}, + { 0, 74}, + { 0, 73}, + { 74, 0}, + { 85, 0}, + { 0, 76}, + { 87, 0}, + { 89, 0}, + { 0, 81}, + { 0, 80}, + { 99, 0}, + { 101, 0}, + { 0, 83}, + { 103, 0}, + { 105, 0}, + { 0, 92}, + { 0, 89}, + { 0, 88}, + { 115, 0}, + { 117, 0}, + { 0, 91}, + { 119, 0}, + { 121, 0}, + { 0, 96}, + { 0, 95}, + { 131, 0}, + { 133, 0}, + { 0, 98}, + { 135, 0}, + { 137, 0}, + { 0, 131}, + { 0, 116}, + { 0, 109}, + { 0, 106}, + { 0, 105}, + { 147, 0}, + { 149, 0}, + { 0, 108}, + { 151, 0}, + { 153, 0}, + { 0, 113}, + { 0, 112}, + { 162, 0}, + { 164, 0}, + { 0, 115}, + { 166, 0}, + { 168, 0}, + { 0, 124}, + { 0, 121}, + { 0, 120}, + { 170, 0}, + { 180, 0}, + { 0, 123}, + { 182, 0}, + { 184, 0}, + { 0, 128}, + { 0, 127}, + { 186, 0}, + { 195, 0}, + { 0, 130}, + { 197, 0}, + { 199, 0}, + { 0, 147}, + { 0, 140}, + { 0, 137}, + { 0, 136}, + { 201, 0}, + { 210, 0}, + { 0, 139}, + { 212, 0}, + { 214, 0}, + { 0, 144}, + { 0, 143}, + { 216, 0}, + { 218, 0}, + { 0, 146}, + { 227, 0}, + { 229, 0}, + { 0, 155}, + { 0, 152}, + { 0, 151}, + { 231, 0}, + { 233, 0}, + { 0, 154}, + { 241, 0}, + { 243, 0}, + { 0, 159}, + { 0, 158}, + { 245, 0}, + { 247, 0}, + { 0, 161}, + { 249, 0}, + { 0, 0} + } + } +} ; diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiDdx.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiDdx.c new file mode 100644 index 0000000..12d3d03 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiDdx.c @@ -0,0 +1,474 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989,1990 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Image Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains the connection to the machine dependent DDX +** layer of the XIE sever. Another module, SmiMi.c, contains the +** connection to the machine independent(MI) layer. +** The connection consists of: +** - dispatch tables +** - DDX supplied Init, Reset and OptimizePipe function +** - Default DDX image array alignment function +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 > +** ULTRIX V4.0 > +** +** AUTHOR(S): +** +** Richard Hennessy +** Robert NC Shelley +** +** CREATION DATE: +** +** June 4, 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ + +/* +** Include files +*/ +#ifdef VMS +#include +#endif +#include + +#include "XieDdx.h" +#include "XieUdpDef.h" + + /* + ** Include needed DDX, SMI, MI entry points + */ +#include "SmiArea.h" +#include "SmiArithmetic.h" + +#include "SmiChangeList.h" +#include "SmiChromeCom.h" +#include "SmiChromeSep.h" +#include "SmiCompare.h" +#include "SmiConstrain.h" +#include "SmiConvert.h" +#include "SmiCrop.h" + +#include "SmiDctDef.h" /* Must be before DCT files */ +#include "SmiDecodeDct.h" +#include "SmiDecodeG4.h" +#include "SmiDither.h" + +#include "SmiEncodeDct.h" +#include "SmiEncodeG4.h" + +#include "SmiFfx.h" +#include "SmiFill.h" + +#include "SmiHistogram.h" + +#include "SmiLogical.h" +#include "SmiLuminance.h" + +#include "SmiMatchHistogram.h" +#include "SmiMath.h" +#include "SmiMemMgt.h" +#include "SmiMirror.h" + +#include "SmiPipeRsm.h" +#include "SmiPipeSched.h" +#include "SmiPipe.h" +#include "SmiPoint.h" + +#include "SmiRotate.h" + +#include "SmiScale.h" +#include "SmiStats.h" + +#include "SmiTranslate.h" + +#include "SmiUtil.h" + +/* +** Table of contents +*/ +int SmiDdxInit(); /* DDX - Init */ +int SmiDdxOptimizePipe(); /* - specific pipe optimizer */ +int SmiDdxReset(); /* - Reset */ + +/* +** MACRO definitions +*/ + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/***************************************************************************** +** +** xieDdxProc - +** +** FUNCTIONAL DESCRIPTION: +** +** XieDdxProc is the DDX dispatch table, used by all callers of +** functions implemented by the DDX. +** +** This table should be accessed using the macros defined in XieDdx.h. +** +*****************************************************************************/ + /* + ** DDX process dispatch table + */ +externaldef(xieDdxProc) card32 (*xieDdxProc[])() = { + (Fcard32)SmiArea, /* 0 Protocol operations */ + (Fcard32)SmiStatsArea, + (Fcard32)SmiArithmetic, + (Fcard32)SmiHistogram, + (Fcard32)SmiConvert, + (Fcard32)SmiConvert, /* 5 */ + (Fcard32)SmiCompare, + (Fcard32)SmiConstrain, + (Fcard32)SmiCopy, + (Fcard32)SmiDither, + (Fcard32)SmiFill, /* 10 */ + (Fcard32)SmiLogical, + (Fcard32)SmiLuminance, + (Fcard32)SmiMatchHistogram, + (Fcard32)SmiMath, + (Fcard32)SmiMirror, /* 15 */ + (Fcard32)SmiPoint, + (Fcard32)SmiStatsPoint, + (Fcard32)SmiRotate, + (Fcard32)SmiScale, + (Fcard32)SmiTranslate, /* 20 */ + (Fcard32)RmOwnData, /* 21..32 -- was compression handlers */ + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, /* 30 */ + NULL, + NULL, + (Fcard32)SmiDdxInit, /* DDX specific functions */ + (Fcard32)SmiDdxReset, + (Fcard32)SmiDdxOptimizePipe, /* 35 */ + + (Fcard32)SmiConvert, /* MI Support routines */ + (Fcard32)SmiCopy, + (Fcard32)SmiGetTyp, + (Fcard32)SmiCopyBits, + (Fcard32)SmiResolveUdp, /* 40 */ +#ifdef CLIENT + (Fcard32)XieCalloc, /* CLIENT needs to use Xie */ + (Fcard32)XieCallocBits, + (Fcard32)XieCfree, + (Fcard32)XieFree, + (Fcard32)XieFreeBits, /* 45 */ + (Fcard32)XieMalloc, + (Fcard32)XieMallocBits, + (Fcard32)XieRealloc, + (Fcard32)XieReallocBits, +#else + (Fcard32)SmiCalloc, /* DDX Memory mgt routines */ + (Fcard32)SmiCallocBits, + (Fcard32)SmiCfree, + (Fcard32)SmiFree, + (Fcard32)SmiFreeBits, /* 45 */ + (Fcard32)SmiMalloc, + (Fcard32)SmiMallocBits, + (Fcard32)SmiRealloc, + (Fcard32)SmiReallocBits, +#endif + (Fcard32)SmiCreatePipeline, /* 50 Pipeline routines */ + (Fcard32)SmiDestroyPipeline, + (Fcard32)SmiPipeHasYielded, + (Fcard32)SmiInitiatePipeline, + (Fcard32)SmiResumePipeline, + (Fcard32)SmiFlushPipeline, /* 55 */ + (Fcard32)SmiAbortPipeline, + + (Fcard32)RmAllocData, /* Pipe rsrc mgr routines */ + (Fcard32)RmAllocDataDesc, + (Fcard32)RmAllocPermDesc, + (Fcard32)RmAllocRefDesc, /* 60 */ + (Fcard32)RmBestDType, + (Fcard32)RmCreateDrain, + (Fcard32)RmCreateSink, + (Fcard32)RmDeallocData, + (Fcard32)RmDeallocDataDesc, /* 65 */ + (Fcard32)RmDestroyDrain, + (Fcard32)RmDestroySink, + (Fcard32)RmGetData, + (Fcard32)RmGetDType, + (Fcard32)RmGetMaxQuantum, /* 70 */ + (Fcard32)RmGetQuantum, + (Fcard32)RmHasQuantum, + (Fcard32)RmInitializePort, + NULL, + (Fcard32)RmMergeBuffers, /* 75 */ + (Fcard32)RmObtainQuantum, + (Fcard32)RmPutData, + (Fcard32)RmSetDType, + (Fcard32)RmSetQuantum, + (Fcard32)RmSplitBuffers, /* 80 */ + + (Fcard32)SchedProcessComplete, /* Pipe schedule funcs */ + (Fcard32)SchedProcessReady, + (Fcard32)SchedOkToRun, + + (Fcard32)MiBuildChangeList, /* Change list funcs */ + (Fcard32)MiPutRuns, /* 85 */ + (Fcard32)MiFfsLong, + (Fcard32)MiFfcLong, + + (Fcard32)SmiFillRegion, /* Additions */ + (Fcard32)SmiConvertCpp, + (Fcard32)SmiCopyCpp, /* 90 */ + (Fcard32)SmiEncodeG4, + (Fcard32)SmiEncodeDct, + (Fcard32)SmiDecodeG4, + (Fcard32)SmiDecodeDct, + (Fcard32)SmiPosCl, /* 95 */ + NULL, + (Fcard32)RmAllocCmpDataDesc, /* More RM functions */ + (Fcard32)RmSetAlignment, + (Fcard32)RmCreateDataDesc, + + (Fcard32)SmiCreatePipeCtx, /* 100 */ + (Fcard32)SmiUsingCL, + (Fcard32)SmiCmpPreferred, + (Fcard32)RmAllocDataArray, + (Fcard32)RmAllocCmpPermDesc, + (Fcard32)SchedProcessNoInput, /* 105 */ + NULL + }; + +/***************************************************************************** +** +** XieDdxSetup - +** +** FUNCTIONAL DESCRIPTION: +** +** XieDdxSetup is the DDX dispatch table used to call the DDX Create +** Pipe Element routines. +** +** These routines should be called using the macros defined in XieDdx.h. +** +*****************************************************************************/ + /* + ** DDX process dispatch table + */ +externaldef(xieDdxSetup) card32 (*xieDdxSetup[])() = { + (Fcard32)SmiCreateArea, /* 0 */ + (Fcard32)SmiCreateArithmetic, + (Fcard32)SmiCreateChromeCom, + (Fcard32)SmiCreateChromeSep, + (Fcard32)SmiCreateCompare, + (Fcard32)SmiCreateConstrain, /* 5 */ + (Fcard32)SmiCreateCrop, + (Fcard32)SmiCreateDither, + (Fcard32)SmiCreateFill, + (Fcard32)SmiCreateLogical, + (Fcard32)SmiCreateLuminance, /* 10 */ + (Fcard32)SmiCreateMatchHistogram, + (Fcard32)SmiCreateMath, + (Fcard32)SmiCreateMirror, + (Fcard32)SmiCreatePoint, + (Fcard32)SmiCreateRotate, /* 15 */ + (Fcard32)SmiCreateScale, + (Fcard32)SmiCreateTranslate, + (Fcard32)SmiCreateDecodeDct, + (Fcard32)SmiCreateEncodeDct, + (Fcard32)SmiCreateDecodeG4, + (Fcard32)SmiCreateEncodeG4, + NULL + }; + +/***************************************************************************** +** +** XieDdxAlign - +** +** FUNCTIONAL DESCRIPTION: +** +** XieDdxAlign is the DDX dispatch table used to call the +** DDX image array alignment functions. +** +** A NULL value is used by alignment logic throughout the XIE server +** to indicate "don't care", "no alignment needed". +** +** If alignment is needed, an alignment function must entered in this +** table in the operator/pipeline element named slot. +** +** These functions should be called using the macros defined in XieDdx.h. +** +*****************************************************************************/ + /* + ** DDX alignment function table + */ +externaldef(xieDdxAlign) card32 (*xieDdxAlign[])() = { + NULL, /* 0 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 5 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 10 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 15 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 20 */ + NULL, + NULL, + NULL, + NULL + }; + +/**************************************************************************** +** SmiDdxInit +** +** FUNCTIONAL DESCRIPTION: +** +** Perform DDX-specific initializations. +** If an accelerator exists get it too. +** +** FORMAL PARAMETERS: +** +** None. +** +** FUNCTION VALUE: +** +** DDX init successful +** +*****************************************************************************/ +int SmiDdxInit() +{ +#ifdef VMS + static char first_time = TRUE; + + if( first_time && getenv("XIE_DEBUG") != NULL ) + { /* + ** It saves time to have the server mostly running before + ** invoking the debugger. + */ + first_time = FALSE; + LIB$SIGNAL(SS$_DEBUG); + } +#endif + return( Success ); +} + +/**************************************************************************** +** SmiDdxOptimizePipe +** +** FUNCTIONAL DESCRIPTION: +** +** Perform DDx-specific XIE pipeline optimizations. +** +** FORMAL PARAMETERS: +** +** None. +** +** FUNCTION VALUE: +** +** Pipeline optimization successful +** +*****************************************************************************/ +int SmiDdxOptimizePipe() +{ + return( Success ); +} + +/**************************************************************************** +** SmiDdxReset +** +** FUNCTIONAL DESCRIPTION: +** +** Perform DDX-specific reset actions. +** If an accelerator exists, get it too. +** +** FORMAL PARAMETERS: +** +** None. +** +** FUNCTION VALUE: +** +** DDX reset successful +** +*****************************************************************************/ +int SmiDdxReset() +{ + return( Success ); +} +/* end of module SmiDdx.c */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiDecodeDct.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiDecodeDct.c new file mode 100644 index 0000000..18c9da5 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiDecodeDct.c @@ -0,0 +1,1805 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains the interface to the DCT decompressesion routines. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHORS: +** +** John Nadai +** John Weber +** Robert NC Shelley +** +** CREATION DATE: +** +** July 31, 1990 +** +*******************************************************************************/ + +/* +** Include Files +*/ +#ifdef VMS +#include +#endif +#include +#include + +#if defined(XIESMI) +#include "SmiDecodeDct.h" +#include "SmiDctMacros.h" +#elif defined(IPS) +#include +#include +#include +#include +#include +#include +#include +#endif + +/* +** Table of Contents +*/ +#if defined(XIESMI) +int SmiDecodeDct(); +#elif defined(IPS) +long _IpsDecodeDct(); +long IpsSetUdp(); +#endif + +#if defined(XIESMI) +int SmiCreateDecodeDct(); +static int _DecodeDctInitialize(); +static int _DecodeDctActivate(); +static int _DecodeDctAbort(); +static int _DecodeDctDestroy(); +#endif + +static DecodeDctStatePtr DcdInitializeState(); +static DecodeDctStatePtr DcdDestroyState(); +static int DcdDecodeSegment(); + +static int DcdGetToken(); +static int DcdGetData(); +static unsigned char *DcdExtendData(); +static int DcdSaveToken(); + +static int DcdDataAction(); +static int DcdSosAction(); +static int DcdSofAction(); +static int DcdRscAction(); + +static void DcdDecode(); +static short int DcdGetHuf(); +static int IDCT8x8_16S_8U(); + +/* +** External References +*/ + +/* +** Equated symbols +*/ +#define DctK_NoComponent 0xFFFFFFFF + +/* +** Local MACROs +*/ + /* + ** Determine if sufficient source data remains. + */ +#define DataAvailable_(_state,_ptr,_len,_pos,_more) \ + ((_len)<(_pos)+(_more)?DcdSaveToken(_state,&_ptr,&_len,_pos,_more):TRUE) + + +/* DEQUANT_ZIGZAG MACRO + + Inputs: > 16-bit signed, quantized DCT coefficients + > organized as sequence of blocks (within blocks, the + coefficients stored in zigzag order) + + Outputs: > 16-bit signed, UNquantized DCT coefficients + > organized as sequence of blocks (within blocks, the + coefficients stored by rows) +*/ + +#define ZQ_VARIABLES \ +\ +double d_dtemp ;\ +short int *d_in_ptr,*d_out_ptr,*d_z_ptr;\ +unsigned char *d_q_ptr ;\ +int d_i ; + +#define DEQUANT_ZIGZAG(IN_PT,OUT_PT,Z_PT,Q_PT) \ + d_in_ptr = (short int *)(IN_PT) ;\ + d_out_ptr = (short int *)(OUT_PT) ;\ + d_q_ptr = (unsigned char *)(Q_PT) ;\ + d_z_ptr = (short int *)(Z_PT) ;\ + for( d_i=0 ; d_i<=63 ; d_i++ )\ + *(d_out_ptr+(*d_z_ptr++)) = (*d_in_ptr++) * (*d_q_ptr++) ; + +/* +** Local storage +*/ + /* + ** DecodeDct Element Vector + */ +#if defined(XIESMI) +static PipeElementVector DecodeDctPipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeDecodeDctElement, /* Structure subtype */ + sizeof(DecodeDctPipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _DecodeDctInitialize, /* Initialize entry */ + _DecodeDctActivate, /* Activate entry */ + _DecodeDctAbort, /* Flush entry */ + _DecodeDctDestroy, /* Destroy entry */ + _DecodeDctAbort /* Abort entry */ + }; +#endif + + /* + ** State transition table. + */ +static int next_state[DctK_StateMax][DctK_TokenMax] = { + {DctK_StateErr, DctK_StateSOI, DctK_StateErr, DctK_StateErr, DctK_StateErr, DctK_StateErr, DctK_StateErr, DctK_StateErr}, + {DctK_StateErr, DctK_StateErr, DctK_StateSOF, DctK_StateErr, DctK_StateErr, DctK_StateErr, DctK_StateErr, DctK_StateErr}, + {DctK_StateErr, DctK_StateErr, DctK_StateSOF, DctK_StateSOS, DctK_StateErr, DctK_StateErr, DctK_StateErr, DctK_StateErr}, + {DctK_StateErr, DctK_StateErr, DctK_StateErr, DctK_StateErr, DctK_StateData, DctK_StateRSC, DctK_StateErr, DctK_StateErr}, + {DctK_StateErr, DctK_StateErr, DctK_StateSOF, DctK_StateErr, DctK_StateErr, DctK_StateRSC, DctK_StateEOI, DctK_StateErr}, + {DctK_StateErr, DctK_StateErr, DctK_StateErr, DctK_StateErr, DctK_StateData, DctK_StateErr, DctK_StateErr, DctK_StateErr}, + {DctK_StateErr, DctK_StateErr, DctK_StateErr, DctK_StateErr, DctK_StateErr, DctK_StateErr, DctK_StateErr, DctK_StateErr}, + {DctK_StateErr, DctK_StateErr, DctK_StateErr, DctK_StateErr, DctK_StateErr, DctK_StateErr, DctK_StateErr, DctK_StateErr}, +}; + /* + ** Transition routine table. + */ +static int (*action[DctK_StateMax][DctK_TokenMax])() = { + {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {NULL, NULL, DcdSofAction, NULL, NULL, NULL, NULL, NULL}, + {NULL, NULL, DcdSofAction, DcdSosAction, NULL, NULL, NULL, NULL}, + {NULL, NULL, NULL, NULL, DcdDataAction, DcdRscAction, NULL, NULL}, + {NULL, NULL, DcdSofAction, NULL, NULL, DcdRscAction, NULL, NULL}, + {NULL, NULL, NULL, NULL, DcdDataAction, NULL, NULL, NULL}, + {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, + {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, +}; + +/***************************************************************************** +** SmiDecodeDct +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** IMPLICIT INPUTS: +** +** none +** +** IMPLICIT OUTPUTS: +** +** none +** +** FUNCTION VALUE: +** +** none +** +** SIGNAL CODES: +** +** none +** +** SIDE EFFECTS: +** +** none +** +*****************************************************************************/ +#if defined(XIESMI) +int SmiDecodeDct(cdp,udplst,udpcnt) +#elif defined(IPS) +long _IpsDecodeDct(cdp,udplst,udpcnt) +#endif +UdpPtr cdp; +UdpPtr udplst[]; +int udpcnt; +{ + int i; + int status; + DecodeDctStatePtr state; + +#if defined(IPS) + /* + ** Verify input UDPs + */ + if ((cdp->UdpB_Class != UdpK_ClassUBS) || (cdp->UdpB_DType != UdpK_DTypeVU)) + return (DctX_UnsOption); +#endif + /* + ** Initialize state, return if an error. + */ + state = DcdInitializeState(); + if (state == NULL) + return( DctX_BadAlloc ); + /* + ** Decode data. + */ + status = DcdDecodeSegment( cdp, udplst, udpcnt, state ); + /* + ** Deallocate state block. + */ + DcdDestroyState(state); + /* + ** Return based on state of decode. + */ +#if defined(XIESMI) + if( status > DctK_StatusDone ) + return( status ); +#endif + if (status != DctK_StatusDone) + return (DctX_DecodeFail); + else + return (DctX_Success); +} /* end of SmiDecodeDct */ + +/***************************************************************************** +** SmiCreateDecodeDct +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +#if defined(XIESMI) +int SmiCreateDecodeDct( pipe, src, dst, org ) + Pipe pipe; + PipeSinkPtr src; + PipeSinkPtr dst; + int org; +{ + int c; + DecodeDctPipeCtxPtr ctx = (DecodeDctPipeCtxPtr) + DdxCreatePipeCtx_( pipe, &DecodeDctPipeElement, TRUE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + /* + ** Build our DecodeDct Pipe Ctx from the arguments passed in. + */ + DcdSrc_(ctx) = src; + DcdDst_(ctx) = dst; + /* + ** Compute number of: source planes, how many components to decode per + ** source plane, and the total number of destination components. + */ + for( c = 0; c < XieK_MaxComponents && IsPointer_(SnkUdpPtr_(dst,c)); c++ ); + DcdSrcCnt_(ctx) = org == XieK_BandByPixel ? 1 : c; + DcdDcdCnt_(ctx) = org == XieK_BandByPixel ? c : 1; + DcdDstCnt_(ctx) = c; + /* + ** Create a drain which reads all the source planes. + */ + DcdDrn_(ctx) = DdxRmCreateDrain_( src, (1 << DcdSrcCnt_(ctx)) - 1 ); + if( !IsPointer_(DcdDrn_(ctx)) ) return((int) DcdDrn_(ctx) ); + /* + ** Process any amount of source and output bytes in DctK_BlockSize chunks. + */ + DdxRmSetDType_( DcdDrn_(ctx), UdpK_DTypeV, DtM_V ); + DdxRmSetQuantum_( DcdDrn_(ctx), 0 ); + DdxRmSetDType_( dst, UdpK_DTypeBU, DtM_BU ); + DdxRmSetQuantum_( dst, DctK_BlockSize ); + + return( DctX_Success ); +} /* end of SmiCreateDecodeDct */ +#endif + +/***************************************************************************** +** _DecodeDctInitialize +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +#if defined(XIESMI) +static int _DecodeDctInitialize( ctx ) + DecodeDctPipeCtxPtr ctx; +{ + int h, i, status; + /* + ** Initialize the source Drain. + */ + VecNoInpt_(CtxVecPtr_(ctx)) = FALSE; + CtxInp_(ctx) = DcdDrn_(ctx); + status = DdxRmInitializePort_( CtxHead_(ctx), DcdDrn_(ctx) ); + if( status != DctX_Success ) return( status ); + /* + ** Initialize the destination Sink. + */ + status = DdxRmInitializePort_( CtxHead_(ctx), DcdDst_(ctx) ); + if( status != DctX_Success ) return( status ); + /* + ** Create a decode state per source plane. + */ + for( i = 0; i < DcdSrcCnt_(ctx); i++ ) + { + DcdSteBlk_(ctx,i) = DcdInitializeState(); + if( !IsPointer_(DcdSteBlk_(ctx,i))) return((int) DcdSteBlk_(ctx,i) ); + } + /* + ** Create a destination descriptor per component. + */ + for( i = 0; i < DcdDstCnt_(ctx); i++ ) + { + h = DctK_BlockSize < SnkHeight_(DcdDst_(ctx),i) + ? DctK_BlockSize : SnkHeight_(DcdDst_(ctx),i); + DcdDstDat_(ctx,i) = DdxRmAllocData_( DcdDst_(ctx), i, 0, h ); + if( !IsPointer_(DcdDstDat_(ctx,i)) ) + return((int)DcdDstDat_(ctx,i)); + DcdDstUdp_(ctx,i) = DatUdpPtr_(DcdDstDat_(ctx,i)); + } + + return( status ); +} /* end of _DecodeDctInitialize */ +#endif + +/***************************************************************************** +** _DecodeDctActivate +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +#if defined(XIESMI) +static int _DecodeDctActivate( ctx ) + DecodeDctPipeCtxPtr ctx; +{ + PipeDataPtr src; + unsigned char *tmp; + int c, h, i, p, s, y, pos; + /* + ** If we already have source data see if we can continue to process it. + */ + if( VecNoInpt_(CtxVecPtr_(ctx)) && DdxPipeHasYielded_(CtxHead_(ctx)) ) + { /* + ** We already have source data but aren't allowed to process it. + */ + if( !DatOwned_(DcdSrcDat_(ctx)) ) + { /* + ** Move the unprocessed data to a buffer of our own. + */ + src = DcdSrcDat_(ctx); + tmp = DatBase_(src); + p = DatCmpIdx_(src); + pos = DcdCurPos_(DcdSteBlk_(ctx,p)); + DcdCurPos_(DcdSteBlk_(ctx,p)) = 0; + DatArSize_(src) -= pos << 3; + DatOwned_(src) = TRUE; + DatPos_(src) = 0; + DatBase_(src) = DdxMallocBits_( DatArSize_(src) ); + if( DatBase_(src) == NULL ) return( DctX_BadAlloc ); + memcpy( DatBase_(src), tmp+pos, DatArSize_(src)>>3 ); + } + return( DctX_Success ); + } + + do { + if( !VecNoInpt_(CtxVecPtr_(ctx)) ) + { /* + ** Get a chunk of encoded data. + */ + DcdSrcDat_(ctx) = DdxRmGetData_( ctx, DcdDrn_(ctx) ); + if( !IsPointer_(DcdSrcDat_(ctx)) ) return( (int) DcdSrcDat_(ctx) ); + } + + /* + ** Call the decoder. + */ + p = DatCmpIdx_(DcdSrcDat_(ctx)); + if (IsPointer_(DcdDstDat_(ctx,p)) ) + { + s = DcdDecodeSegment( DatUdpPtr_(DcdSrcDat_(ctx)), + &DcdDstUdp_(ctx,p), + DcdDcdCnt_(ctx), + DcdSteBlk_(ctx,p) ); + } + else + { + /* + ** No destination data segment means we have already returned the + ** the last scanline of the image, or there is a bug somewhere. + ** Tolerate the client being confused or having a slightly bogus + ** compressed data stream. + */ + DcdSrcDat_(ctx) = DdxRmDeallocData_( DcdSrcDat_(ctx) ); + VecNoInpt_(CtxVecPtr_(ctx)) = FALSE; + return( DctX_Success ); + } + + switch( s ) + { + case DctK_StatusDone : + case DctK_StatusOutput : + /* + ** Pass the PCM data along for the number of components decoded. + */ + for( i = 0; i < DcdDcdCnt_(ctx); i++ ) + { + c = p > 0 ? p : i; + y = DatY2_(DcdDstDat_(ctx,c)); + s = DdxRmPutData_( DcdDst_(ctx), DcdDstDat_(ctx,c) ); + if( s == DctX_Success && y++ < SnkY2_(DcdDst_(ctx),c) ) + { /* + ** Allocate space for another quantum of decoded data. + */ + h = DctK_BlockSize < SnkHeight_(DcdDst_(ctx),i) - y + ? DctK_BlockSize : SnkHeight_(DcdDst_(ctx),i) - y; + DcdDstDat_(ctx,c) = DdxRmAllocData_(DcdDst_(ctx), c, y, h); + if( IsPointer_(DcdDstDat_(ctx,c)) ) + DcdDstUdp_(ctx,c) = DatUdpPtr_(DcdDstDat_(ctx,c)); + else + s = (int) DcdDstDat_(ctx,c); + } + else + DcdDstDat_(ctx,c) = NULL; + if( s != DctX_Success ) break; + } + VecNoInpt_(CtxVecPtr_(ctx)) = IsPointer_(DcdDstDat_(ctx,c)); + return( s ); + case DctK_StatusInput : + /* + ** We're done with that chunk -- prepare for more. + */ + DcdSrcDat_(ctx) = DdxRmDeallocData_( DcdSrcDat_(ctx) ); + VecNoInpt_(CtxVecPtr_(ctx)) = FALSE; + break; + default : return( DctX_DecodeFail ); + } + } + while( s == DctK_StatusInput ); + + return( DctX_Success ); +} /* end of _DecodeDctActivate */ +#endif + +/***************************************************************************** +** _DecodeDctAbort +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +#if defined(XIESMI) +static int _DecodeDctAbort( ctx ) + DecodeDctPipeCtxPtr ctx; +{ + int i; + /* + ** Destroy decode state(s). + */ + for( i = 0; i < DcdSrcCnt_(ctx); i++ ) + DcdSteBlk_(ctx,i) = DcdDestroyState( DcdSteBlk_(ctx,i) ); + /* + ** Turn off the no-input flag. + */ + VecNoInpt_(CtxVecPtr_(ctx)) = FALSE; + /* + ** Destroy destination data descriptor(s). + */ + for( i = 0; i < DcdDstCnt_(ctx); i++ ) + DcdDstDat_(ctx,i) = DdxRmDeallocData_( DcdDstDat_(ctx,i) ); + + return( DctX_Success ); +} /* end of _DecodeDctAbort */ +#endif + +/***************************************************************************** +** _DecodeDctDestroy +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +#if defined(XIESMI) +static int _DecodeDctDestroy( ctx ) + DecodeDctPipeCtxPtr ctx; +{ + DcdDrn_(ctx) = DdxRmDestroyDrain_( DcdDrn_(ctx) ); + + return( DctX_Success ); +} /* end of _DecodeDctDestroy */ +#endif + +/***************************************************************************** +** DcdInitializeState +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static DecodeDctStatePtr DcdInitializeState() +{ + DecodeDctStatePtr state; + int i; + /* + ** Allocate new state block. + */ + state = (DecodeDctStatePtr) DctCalloc_(1,sizeof(DecodeDctStateRec)); + /* + ** Return on bad alloc... + */ + if( state == NULL ) return( (DecodeDctStatePtr) DctX_BadAlloc ); + /* + ** Initialize global locations + */ + DcdHacTbl_(state,0) = &DctR_AcDecodeTable[0]; /* Default AC tables */ + DcdHacTbl_(state,1) = &DctR_AcDecodeTable[1]; + DcdHdcTbl_(state,0) = &DctR_DcDecodeTable[0]; /* Default DC tables */ + DcdHdcTbl_(state,1) = &DctR_DcDecodeTable[1]; + + DcdQntTbl_(state,0) = &DctR_QuantDefault[0]; /* Default quantization */ + DcdQntDef_(state,0) = TRUE; /* tables. */ + DcdQntTbl_(state,1) = &DctR_QuantDefault[1]; /* */ + DcdQntDef_(state,1) = TRUE; + /* + ** Allocate initial space for token data buffer. + */ + DcdDatPtr_(state) = (unsigned char *) DctMalloc_( DcdK_DataSize ); + if( DcdDatPtr_(state) == NULL ) + { + DctFree_( state ); + return( (DecodeDctStatePtr) DctX_BadAlloc ); + } + DcdDatSiz_(state) = DcdK_DataSize; + + return( state ); +} /* end of DcdInitializeState */ + +/***************************************************************************** +** DcdDestroyState +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static DecodeDctStatePtr DcdDestroyState( state ) + DecodeDctStatePtr state; +{ + int i; + UdpPtr udp; + +#if defined(XIESMI) + if( !IsPointer_(state) ) return( NULL ); +#endif + + if( DcdDatPtr_(state) != NULL ) + /* + ** Free token data buffer. + */ + DctFree_( DcdDatPtr_(state) ); + + /* + ** Free any user defined quantization tables. + */ + for( i = 0; i < DctK_MaxQuantTables; i++ ) + if( !DcdQntDef_(state,i) && DcdQntTbl_(state,i) != NULL ) + DctFree_(DcdQntTbl_(state,i)); + + /* + ** Free the state block. + */ + DctFree_(state); + + return( NULL ); +} /* end of DcdDestroyState */ + +/***************************************************************************** +** DcdDecodeSegment +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int DcdDecodeSegment( cdp, udplst, udpcnt, state ) + UdpPtr cdp; + UdpPtr udplst[]; + int udpcnt; + DecodeDctStatePtr state; +{ + int i, token; + /* + ** Set source in state block. + */ + DcdCurPtr_(state) = cdp->UdpA_Base; + DcdCurLen_(state) = cdp->UdpL_ArSize>>3; + /* + ** Set destination in state block. + */ + for( i = 0; i < udpcnt; i++ ) + { + DcdDstLst_(state,i) = udplst[i]; +#if defined(XIESMI) + if( udplst[i]->UdpA_Base == NULL ) + { + udplst[i]->UdpA_Base = DctMallocBits_( udplst[i]->UdpL_ArSize ); + if( udplst[i]->UdpA_Base == NULL ) return( DctX_BadAlloc ); + } +#elif defined(IPS) + udplst[i]->UdpL_CompIdx = DctK_NoComponent; +#endif + } + if( DcdDstFul_(state) ) + { /* + ** Continue decoding from where we left off. + */ + DcdDataAction(state); + if( DcdDstFul_(state) ) + return( DctK_StatusOutput ); + } + else /* + ** Assume new input. + */ + DcdCurPos_(state) = cdp->UdpL_Pos>>3; + + /* + ** While tokens remain in the buffer, process... + */ + while( TRUE ) + { /* + ** Attempt to get the next token. + */ + token = DcdGetToken(state); + + if( DcdDatPtr_(state) == NULL ) + return( DctX_BadAlloc ); + + if( DcdInpExh_(state) ) + /* + ** Input buffer exhausted. + */ + return( DctK_StatusInput ); + /* + ** Call transition action routine if specified. + */ + if( action[DcdState_(state)][token] != NULL && + (*action[DcdState_(state)][token])(state) != DcdK_ActionSuccess ) + return(DctK_StatusError); + /* + ** Transition to new state. + */ + DcdState_(state) = next_state[DcdState_(state)][token]; + + if( DcdDstFul_(state) ) + /* + ** No room in the inn. + */ + return( DctK_StatusOutput ); + /* + ** If at an end state, stop + */ + switch( DcdState_(state) ) + { + case DctK_StateErr : return( DctK_StatusError ); + case DctK_StateEOI : return( DctK_StatusDone ); + default : continue; + } + } +} /* end of DcdDecodeSegment */ + +/***************************************************************************** +** DcdGetToken +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +** +*****************************************************************************/ +static int DcdGetToken(state) + DecodeDctStatePtr state; +{ + unsigned char *dat, *src; + int token, len, pos, cnt = 1; + int current = DcdData_(state) || !DcdInpExh_(state) + || DcdTokLen_(state) == 0; + /* + ** Point to current or saved token data. + */ + src = current ? DcdCurPtr_(state) : DcdDatPtr_(state); + len = current ? DcdCurLen_(state) : DcdTokLen_(state); + pos = current ? DcdCurPos_(state) : 0; + + while( DataAvailable_( state, src, len, pos, cnt ) ) + { + if( !(DcdData_(state) || DcdMarker_(state)) ) + DcdData_(state) = src[pos] != DctK_Marker; + + switch( DcdData_(state) ? 0 : src[pos] ) + { + case DctK_Marker : pos++; DcdMarker_(state) = TRUE; continue; + + case DctK_MarkerSOI : token = DctK_TokenSOI; break; + + case DctK_MarkerSOF : cnt = 0; + case DctK_MarkerSOS : token = cnt ? DctK_TokenSOS : DctK_TokenSOF; + /* + ** The next 2 bytes express the length of additional token data. + */ + if( !DataAvailable_( state, src, len, pos, 3 ) ) + return( DctK_TokenNone ); /* SOF/SOS length unavailable */ + cnt = src[pos+1] + 1; + cnt += src[pos+2] << 8; + if( !DataAvailable_( state, src, len, pos, cnt ) ) + return( DctK_TokenNone ); /* SOF/SOS data unavailable */ + DcdTokPtr_(state) = src; + DcdTokPos_(state) = pos + 3; + DcdTokLen_(state) = pos + cnt; + break; + + case DctK_MarkerRSC0 : + case DctK_MarkerRSC1 : + case DctK_MarkerRSC2 : + case DctK_MarkerRSC3 : + case DctK_MarkerRSC4 : + case DctK_MarkerRSC5 : + case DctK_MarkerRSC6 : + case DctK_MarkerRSC7 : token = DctK_TokenRSC; break; + + case DctK_MarkerEOI : token = DctK_TokenEOI; break; + + case 0 : + if( !DcdData_(state) ) + { /* + ** Initial data was 0xFF00. + */ + DcdCurPos_(state) = pos; + DcdTokLen_(state) = 1; + *DcdDatPtr_(state) = 0xFF; + } + else if( !DcdInpExh_(state) ) + DcdTokLen_(state) = 0; + /* + ** Unstuff, copy, and count source data. + */ + return( DcdGetData( state ) ); + + default : return( DctK_TokenError ); + } /* end switch */ + + if( !DcdMarker_(state) ) + token = DctK_TokenError; /* token not preceeded by a marker */ + DcdMarker_(state) = FALSE; + DcdInpExh_(state) = FALSE; + if( current ) + DcdCurPos_(state) = pos+cnt; /* update pos to next marker/data */ + return( token ); + } /* end while */ + + return( DctK_TokenNone ); /* no data available */ +} /* end of DcdGetToken */ + +/***************************************************************************** +** DcdGetData +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +** +*****************************************************************************/ +static int DcdGetData( state ) + DecodeDctStatePtr state; +{ + unsigned char *src = DcdCurPtr_(state), *dat = DcdDatPtr_(state); + int pos, mark, len = DcdCurLen_(state), cnt = DcdTokLen_(state); + + /* + ** Unstuff, copy, and count source data. + */ + for( mark = DcdMarker_(state), pos = DcdCurPos_(state); pos < len; pos++ ) + { + if( mark ) + if( mark = src[pos] != 0 ) + break; /* end of data segment */ + else + continue; /* strip 00 from 0xFF00 */ + + if( DcdDatSiz_(state) == cnt ) + { + dat = DcdExtendData( state, cnt + DcdK_DataSize ); + if( dat == NULL ) return( DctK_TokenError ); + } + dat[cnt] = src[pos]; + mark = dat[cnt++] == DctK_Marker; + } + /* + ** End of data parsing -- either input exhausted or at next marker. + */ + DcdInpExh_(state) = pos == len; + DcdMarker_(state) = mark; + DcdCurPos_(state) = pos; + DcdTokLen_(state) = cnt; + DcdTokPtr_(state) = dat; + DcdTokPos_(state) = 0; + DcdData_(state) = DcdInpExh_(state); + + return( DctK_TokenData ); +} /* end of DcdGetData */ + +/***************************************************************************** +** DcdExtendData +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +** +*****************************************************************************/ +static unsigned char *DcdExtendData( state, data_len ) + DecodeDctStatePtr state; + int data_len; +{ + /* + ** Extend the token data buffer by a multiple of DcdK_DataSize. + */ + do DcdDatSiz_(state) += DcdK_DataSize; + while( DcdDatSiz_(state) < data_len ); + +#ifdef __alpha + DcdDatPtr_(state) = (unsigned char *) DctRealloc_( state->data_ptr, + state->data_siz ); +#else + DcdDatPtr_(state) = (unsigned char *) DctRealloc_( DcdDatPtr_(state), + DcdDatSiz_(state) ); +#endif + return( DcdDatPtr_(state) ); +} /* end of DcdExtendData */ + +/***************************************************************************** +** DcdSaveToken +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +** Boolean: TRUE = sufficient data remains. +** +*****************************************************************************/ +static int DcdSaveToken( state, ptr, len, pos, more ) + DecodeDctStatePtr state; + unsigned char **ptr; + int *len, pos, more; +{ + int need, have, copy, total; + + switch( DcdInpExh_(state) ) + { + case FALSE : /* save all that remains */ + DcdInpExh_(state) = TRUE; + DcdCurPos_(state) = pos; + DcdTokPos_(state) = 0; + *len = 0; + + case TRUE : /* transfer what is needed */ + total = pos + more; + need = total - *len; + have = DcdCurLen_(state) - DcdCurPos_(state); + copy = have < need ? have : need; + + if( copy > 0 ) + { + if( DcdDatSiz_(state) < total && DcdExtendData(state,total)==NULL ) + return( FALSE ); + + memcpy( DcdDatPtr_(state) + *len, + DcdCurPtr_(state) + DcdCurPos_(state), copy ); + *len += copy; + DcdCurPos_(state) += copy; + } + } + *ptr = DcdDatPtr_(state); + DcdTokPtr_(state) = DcdDatPtr_(state); + DcdTokLen_(state) = *len; + + return( copy == need ); +} /* end of DcdSaveToken */ + +/***************************************************************************** +** DcdDataAction +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +** +*****************************************************************************/ +static int DcdDataAction(state) + DecodeDctStatePtr state; +{ + ZQ_VARIABLES + UdpPtr udp; + short int work1[64], work2[64], previous_dc[DctK_MaxComponents]; + int scn_stride[DctK_MaxComponents], pix_stride[DctK_MaxComponents]; + int status, h, v, i, c, row, col, dstrow, dstcol, x, y, pos; + unsigned char *base[DctK_MaxComponents], tmp[64]; + unsigned char *scnptr, *pxlptr, *tmpptr, *dstptr; + /* + ** Make sure the destination UDP can accept the output of the current + ** segment -- if not, set destination full and return. + */ + for( i = 0; i < DcdCmpCnt_(state); i++ ) + { + udp = DcdDstLst_(state,i); +#if defined(XIESMI) + if( udp == NULL ) return( DcdK_ActionError ); else +#elif defined(IPS) + status = IpsSetUdp(state,DcdDstIdx_(state,i)); + if( status != DctX_Success ) return( status ); +#endif + DcdUdpFul_(state,DcdDstIdx_(state,i)) = + udp->UdpL_Y2 < DcdScnSeg_(state,i) - 1 + DcdCurY_(state,i) && + udp->UdpL_Y2 < DcdCmpHgt_(state,i) - 1; + } + if( DcdDstFul_(state) ) + return( DcdK_ActionSuccess ); + /* + ** Assign local pointers to speed things up inside loops + */ + for( c = 0; c < DcdCmpCnt_(state); c++ ) + { + udp = DcdDstLst_(state,DcdDstIdx_(state,c)); + + scn_stride[c] = udp->UdpL_ScnStride / 8; + pix_stride[c] = udp->UdpL_PxlStride / 8; + base[c] = udp->UdpA_Base + udp->UdpL_Pos / 8; + previous_dc[c] = 0; + } + /* + ** This is the main decompression loop. + ** -- Once around for each MDU in this code segment -- + */ + for( pos = 0, i = 0; i < DcdRstInt_(state); i++ ) + { /* + ** For each component in the MDU + */ + for( c = 0; c < DcdCmpCnt_(state); c++ ) + { + x = DcdCurX_(state,c); + y = DcdCurY_(state,c); + udp = DcdDstLst_(state,DcdDstIdx_(state,c)); + /* + ** Calculate address to start of tile. + */ + scnptr = base[c] + (y - udp->UdpL_Y1) * scn_stride[c] + + (x - udp->UdpL_X1) * pix_stride[c]; + /* + ** For each vertical sample of this component. + */ + for( v = 0; v < DcdCmpVrt_(state,c); v++ ) + { + pxlptr = scnptr; + /* + ** For each horizontal sample in this component. + */ + for( h = 0; h < DcdCmpHrz_(state,c); h++ ) + { /* + ** Turn huffman codes into quantized coefficients. + */ + DcdDecode( DcdTokPtr_(state), &pos, + DcdHdcTbl_(state,DcdCmpHdc_(state,c)), + DcdHacTbl_(state,DcdCmpHac_(state,c)), + &previous_dc[c], work1 ); + /* + ** Dequantize and put coefficients in raster order. + */ +#ifdef __alpha + d_in_ptr = (short int *)(work1) ; + d_out_ptr = (short int *)(work2) ; + d_q_ptr = (unsigned char *)(DcdQntTbl_(state,DcdCmpQnt_(state,c))) ; + d_z_ptr = (short int *)(DctAW_ZigZag) ; + for( d_i=0 ; d_i<=63 ; d_i++ ) + *(d_out_ptr+(*d_z_ptr++)) = (*d_in_ptr++) * (*d_q_ptr++) ; +#else + DEQUANT_ZIGZAG(work1, + work2, + DctAW_ZigZag, + DcdQntTbl_(state,DcdCmpQnt_(state,c))); +#endif + /* + ** If this block goes beyond the limits of the image, + ** buffer it in a temporary, then copy it to the dst. + */ + if( x + DctK_BlockSize - 1 > udp->UdpL_X2 + || y + DctK_BlockSize - 1 > udp->UdpL_Y2 ) + { + IDCT8x8_16S_8U( work2, tmp, 8, 1 ); + /* + ** Calculate remaining rows and columns...if greater + ** than 8, then set to maximum. + */ + dstrow = udp->UdpL_Y2 - y + 1; + if( dstrow > 8 ) + dstrow = 8; + dstcol = udp->UdpL_X2 - x + 1; + if( dstcol > 8 ) + dstcol = 8; + /* + ** Copy from temp buffer into image buffer. + */ + for( row = 0; row < dstrow; row++ ) + { + tmpptr = tmp + 8 * row; + dstptr = pxlptr + scn_stride[c] * row; + for( col = 0; col < dstcol; col++ ) + { + *dstptr = *tmpptr++; + dstptr += pix_stride[c]; + } + } + } + else + /* + ** Do inverse DCT directly into image buffer. + */ + IDCT8x8_16S_8U( work2, pxlptr, scn_stride[c], + pix_stride[c] ); + /* + ** Update pointer to next horizontal sample. + */ + pxlptr += 8 * pix_stride[c]; + x += 8; + } + /* + ** Update pointer to next vertical sample. + */ + scnptr += 8 * scn_stride[c]; + y += 8; + } + /* + ** Update current X,Y location pointers. If at end of scan, reset + ** X pointer and increment Y pointer. + */ + DcdCurX_(state,c) += 8 * DcdCmpHrz_(state,c); + if( DcdCurX_(state,c) >= DcdCmpWid_(state,c) ) + { + DcdCurX_(state,c) = 0; + DcdCurY_(state,c) += 8 * DcdCmpVrt_(state,c); + } + } + if( DcdCurY_(state,0) >= DcdCmpHgt_(state,0) ) + break; + } + return( DcdK_ActionSuccess ); +} /* end of DcdDataAction */ + +/***************************************************************************** +** DcdSosAction +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +** +*****************************************************************************/ +static int DcdSosAction(state) + DecodeDctStatePtr state; +{ + unsigned char *ptr = DcdTokPtr_(state) + DcdTokPos_(state); + int current_component; + unsigned char huff_specifier; + int huff_idx; + int huff_sel; + int i; + /* + ** Reset resync enable for each scan. + */ + DcdRstEnb_(state) = FALSE; + /* + ** First byte specifies the component to be worked on. + */ + current_component = *ptr++; + /* + ** Read per component huffman table assignments. One byte per component. + ** The DC index is in the low four bits, AC index in the high four bits. + */ + for( i = 0; i < DcdCmpCnt_(state); i++ ) + { + DcdCmpHdc_(state,i) = *ptr & 0x0F; + DcdCmpHac_(state,i) = *ptr++ >> 4 & 0x0F; + } + /* + ** Read huffman table specifiers. Since compression doesn't generate + ** custom huffman tables, ignore that capability for now... + */ + while((huff_specifier = *ptr++) != 0x80) + { /* + ** The huffman specifier contains the huffman table index + ** in the low nibble, and selector in the high nibble. + */ + huff_idx = huff_specifier & 0x0F; + huff_sel = huff_specifier >> 4 & 0x0F; + /* + ** Take action based on selector value. + */ + switch( huff_sel ) + { + case 0 : /* these cases call for loading private tables...NYI */ + case 1 : return( DcdK_ActionError ); + + case 2: /* + ** Load default DC huffman table. + */ + DcdHdcTbl_(state,huff_idx) = &DctR_DcDecodeTable[0]; + DcdSdcTbl_(state,huff_idx) = &DctR_DcSpecTable[0]; + break; + + case 3: /* + ** Load default AC huffman table. + */ + DcdHacTbl_(state,huff_idx) = &DctR_AcDecodeTable[0]; + DcdSacTbl_(state,huff_idx) = &DctR_AcSpecTable[0]; + break; + + default : return( DcdK_ActionError ); + } + } + /* + ** Reset horizontal and vertical interleave counters. + */ + DcdHrzCnt_(state) = 0; + DcdVrtCnt_(state) = 0; + + return( DcdK_ActionSuccess ); +} /* end of DcdSosAction */ + +/***************************************************************************** +** DcdSofAction +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +** +*****************************************************************************/ +static int DcdSofAction(state) + DecodeDctStatePtr state; +{ + unsigned char *ptr = DcdTokPtr_(state) + DcdTokPos_(state); + int vert_max = 0; + int horz_max = 0; + int i; + int j; + char qntidx; + char qntprc; + /* + ** Parse SOF fixed header fields. + */ + DcdMode_(state) = *ptr++; + DcdPrec_(state) = *ptr++; + DcdFrmHgt_(state) = *ptr++; + DcdFrmHgt_(state) += *ptr++ << 8; + DcdFrmWid_(state) = *ptr++; + DcdFrmWid_(state) += *ptr++ << 8; + DcdRstInt_(state) = *ptr++; + DcdRstInt_(state) += *ptr++ << 8; + /* + ** Get per component information. + */ + DcdCmpCnt_(state) = *ptr++; + for( i = 0; i < DcdCmpCnt_(state); i++ ) + { /* + ** Get component index from DCT stream. Determine which UDP + ** corresponds to this component. + */ + DcdCmpIdx_(state,i) = *ptr++; + + for( j = 0; j < DcdCmpCnt_(state); j++ ) + if (DcdDstLst_(state,j)->UdpL_CompIdx == DcdCmpIdx_(state,i)) + break; + else if (DcdDstLst_(state,j)->UdpL_CompIdx == DctK_NoComponent) + { + DcdDstLst_(state,j)->UdpL_CompIdx = DcdCmpIdx_(state,i); + break; + } + if( j < DcdCmpCnt_(state) ) + DcdDstIdx_(state,i) = j; + else + return( DcdK_ActionError ); + /* + ** Get sampling rates. + */ + DcdCmpVrt_(state,i) = *ptr & 0x0F; + DcdCmpHrz_(state,i) = *ptr++ >> 4 & 0x0F; + + if( vert_max < DcdCmpVrt_(state,i) ) + vert_max = DcdCmpVrt_(state,i); + if( horz_max < DcdCmpHrz_(state,i) ) + horz_max = DcdCmpHrz_(state,i); + } + /* + ** Calculate sizes for interleaving. + */ + DcdIntCol_(state) = (DcdFrmWid_(state)+(8*horz_max-1)) / (8*horz_max); + DcdIntLin_(state) = (DcdFrmHgt_(state)+(8*vert_max-1)) / (8*vert_max); + /* + ** Now, compute component sizes based on subsampling frequency. + */ + for( i = 0; i < DcdCmpCnt_(state); i++ ) + { + DcdCmpWid_(state,i) = DcdFrmWid_(state)*DcdCmpHrz_(state,i)/horz_max; + DcdCmpHgt_(state,i) = DcdFrmHgt_(state)*DcdCmpVrt_(state,i)/vert_max; + DcdCmpStr_(state,i) = DcdIntCol_(state) * 8 * DcdCmpHrz_(state,i); + DcdCmpLen_(state,i) = DcdIntLin_(state) * 8 * DcdCmpVrt_(state,i); + /* + ** Initially, scans per segement is entire image (for no resync). + */ + DcdScnSeg_(state,i) = DcdCmpHgt_(state,i); + } + /* + ** Next, extract per component quantization table assignments. + ** These values are four bits each packed two per byte. + */ + switch( DcdCmpCnt_(state) ) + { + case 3 : DcdCmpQnt_(state,2) = *(ptr+1) & 0x0F; + case 2 : DcdCmpQnt_(state,1) = (*ptr >> 4) & 0x0F; + case 1 : DcdCmpQnt_(state,0) = *ptr & 0x0F; + break; + default : return( DcdK_ActionError ); + } + ptr += (DcdCmpCnt_(state) + 1) / 2; + /* + ** Now, comes quantization table specifiers. + */ + while( *ptr++ != 0x80 ) + { + qntidx = *(ptr-1) & 0x0F; + qntprc = *(ptr-1) >> 4 & 0x0F; + /* + ** If this slot contains a non-default quantization table, + ** deallocate the memory. + */ + if( DcdQntTbl_(state,qntidx) != NULL && !DcdQntDef_(state,qntidx) ) + DctFree_(DcdQntTbl_(state,qntidx)); + /* + ** Read in user defined quantization table. + */ + DcdQntTbl_(state,qntidx) = (QuantTablePtr) + DctMalloc_(sizeof(QuantTable)); + if( DcdQntTbl_(state,qntidx) == NULL ) return( DctX_BadAlloc ); + + DcdQntDef_(state,qntidx) = FALSE; + memcpy( DcdQntTbl_(state,qntidx), ptr, sizeof(QuantTable) ); + ptr += sizeof(QuantTable); + } + /* + ** Now, validate what we found in the JPEG stream against what's being + ** specified by the caller. + */ + + /* + ** Return from wence we came... + */ + return( DcdK_ActionSuccess ); +} /* end of DcdSofAction */ + +/***************************************************************************** +** DcdRscAction +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +** +*****************************************************************************/ +static int DcdRscAction(state) + DecodeDctStatePtr state; +{ + int i; + + DcdRstEnb_(state) = TRUE; + + for( i = 0; i < DcdCmpCnt_(state); i++ ) + /* + ** NOTE : Sampling rate needs to be considered here... + */ + DcdScnSeg_(state,i) = DcdRstInt_(state) * DctK_BlockSize + / DcdCmpWid_(state,i) * DctK_BlockSize; + + return( DcdK_ActionSuccess ); +} /* end of DcdRscAction */ + +/***************************************************************************** +** DcdDecode +** +** FUNCTIONAL DESCRIPTION: +** Huffman decodes one block of quantized zigzag scanned DCT coefs +** (most bit banging is done by the macros GetBit_ and GET_VALUE_). +** +** FORMAL PARAMETERS: +** +** +*****************************************************************************/ +static void DcdDecode(inptr,bitoff,dc_table,ac_table,prv_dc,coef) + unsigned char *inptr; + int *bitoff; + HuffDecodeTablePtr dc_table; + HuffDecodeTablePtr ac_table; + short int *prv_dc; + short int *coef; +{ + int i, coef_index; + int dc_exp, dc_man; + int ac_exp, ac_man, ac_run; + + int temp; + short int stemp; + /* + ** Decode DC coefficient of block + */ + dc_exp = DcdGetHuf( inptr, bitoff, dc_table ); + + if( dc_exp & 15 ) + { +#ifndef MSB_FIRST + dc_man = GET_VALUE_( inptr, *bitoff, (1<<(dc_exp-1))-1 ); + *bitoff += dc_exp-1; + temp = GetBit_( inptr, *bitoff ); + (*bitoff)++; +#else + temp = GetBit_( inptr, *bitoff ); + (*bitoff)++; + dc_man = GET_VALUE_( inptr, *bitoff, (1<<(dc_exp-1))-1 ); + *bitoff += dc_exp-1; +#endif + if( temp == 0 ) + dc_man += (-1 << dc_exp)+ 1; + else + dc_man += 1 <<(dc_exp - 1); + } + else if( dc_exp == 0 ) + dc_man = 0 ; + else + dc_man = -32768 ; /* i.e. dc_exp == 16 */ + + *coef = dc_man + *prv_dc; + *prv_dc = *coef++; + + /* Decode AC coefficients of block */ + + /* + ** coef_index points to the NEXT coef to be processed + */ + for( coef_index = 1; coef_index <= 63; ) + { + stemp = DcdGetHuf( inptr, bitoff, ac_table ); + + ac_run = stemp >> 4; + ac_exp = stemp & 15; /* stemp - 16 * ac_run ; */ + + if( ac_exp == 0 ) /* The 2 special codes */ + { + if( ac_run ) /* Max-length-run (i.e. ac_run==15) */ + for( i = 0; i <= 15; i++,coef_index++ ) + *coef++ = 0; + else /* End-of-block (i.e.ac_run==0) */ + for( ;coef_index <= 63; coef_index++ ) + *coef++ = 0; + } + else /* Regular codes */ + { +#ifndef MSB_FIRST + ac_man = GET_VALUE_( inptr, *bitoff, (1<<(ac_exp-1))-1 ); + *bitoff += ac_exp-1; + temp = GetBit_( inptr, *bitoff ); + (*bitoff)++; +#else + temp = GetBit_( inptr, *bitoff ); + (*bitoff)++; + ac_man = GET_VALUE_( inptr, *bitoff, (1<<(ac_exp-1))-1 ); + *bitoff += ac_exp-1; +#endif + if( temp == 0 ) + ac_man += (-1<< ac_exp)+ 1; + else + ac_man += 1<<(ac_exp - 1); + + for( i = 0; i < ac_run; i++, coef_index++ ) + *coef++ = 0; + *coef++ = ac_man; + coef_index++; + } + } /* Done with a block */ +} /* end of DcdDecode */ + +/***************************************************************************** +** DcdGetHuf +** +** FUNCTIONAL DESCRIPTION: +** +** Fetches the next Huffman code from a bit stream pointed to by +** bufptr/bufoff, using a set of codes specified by huff_decode_ptr. +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static short int DcdGetHuf( bufptr, bufoff, huff_decode_ptr ) + unsigned char *bufptr; + int *bufoff; + HuffDecodeTable *huff_decode_ptr; +{ + int temp; + int index = 0; + short rlen; + + do { + temp = GetBit_( bufptr, *bufoff ); + (*bufoff)++; + if( temp ) /* i.e., if temp==1 */ + index += huff_decode_ptr->half_table_size; + rlen = huff_decode_ptr->huff_decode_entry[index].w1; + index = huff_decode_ptr->huff_decode_entry[index].w0; + } + while( index ); + + return( rlen ); +} /* end of DcdGetHuf */ + +/***************************************************************************** +** IDCT8x8_16S_8U +** +** FUNCTIONAL DESCRIPTION: +** +** Inverse DCT routine. +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int IDCT8x8_16S_8U(COEFS,PIXELS,SCAN_WIDTH,PEL_WIDTH) + short int *COEFS; + unsigned char *PIXELS; + int SCAN_WIDTH; + int PEL_WIDTH; +{ + DCT_VARIABLES + + d_ps1 = COEFS; + d_pi1 = d_work; + + for(d_k=0 ; d_k<8; d_k++) + { + d_ap = d_a; + *d_ap++ = (d_ps1[0])<<2; + *d_ap++ = (d_ps1[4*8])<<2; + *d_ap++ = (d_ps1[2*8])<<2; + *d_ap++ = (d_ps1[6*8])<<2; + *d_ap++ = ((d_spi16*d_ps1[1*8] - d_s7pi16*d_ps1[7*8]) + (1<<13))>>14; + *d_ap++ = ((d_s5pi16*d_ps1[5*8] - d_s3pi16*d_ps1[3*8]) + (1<<13))>>14; + *d_ap++ = ((d_c3pi16*d_ps1[3*8] + d_c5pi16*d_ps1[5*8]) + (1<<13))>>14; + *d_ap = ((d_cpi16*d_ps1[1*8] + d_c7pi16*d_ps1[7*8]) + (1<<13))>>14; + d_ps1++; + + d_bp = d_b; + *d_bp++ = (d_cpi4*(d_a[0]+d_a[1]) + 32768)>>16; + *d_bp++ = (d_cpi4*(d_a[0]-d_a[1]) + 32768)>>16; + *d_bp++ = (d_spi8*d_a[2] - d_s3pi8*d_a[3] + 32768)>>16; + *d_bp++ = (d_cpi8*d_a[2] + d_c3pi8*d_a[3] + 32768)>>16; + *d_bp++ = d_a[4] + d_a[5]; + *d_bp++ = d_a[4] - d_a[5]; + *d_bp++ = d_a[7] - d_a[6]; + *d_bp = d_a[7] + d_a[6]; + + d_cp = d_c; + *d_cp++ = d_b[0] + d_b[3]; + *d_cp++ = d_b[1] + d_b[2]; + *d_cp++ = d_b[1] - d_b[2]; + *d_cp++ = d_b[0] - d_b[3]; + *d_cp++ = d_b[4]; + *d_cp++ = (d_cpi4*(d_b[6]-d_b[5]) + 32768)>>16; + *d_cp++ = (d_cpi4*(d_b[6]+d_b[5]) + 32768)>>16; + *d_cp = d_b[7]; + + d_pi2 = d_c; + d_pi3 = d_c + 7; + *d_pi1++ = ((*d_pi2++) + (*d_pi3--) + 1) >> 1; + *d_pi1++ = ((*d_pi2++) + (*d_pi3--) + 1) >> 1; + *d_pi1++ = ((*d_pi2++) + (*d_pi3--) + 1) >> 1; + *d_pi1++ = ((*d_pi2 ) + (*d_pi3 ) + 1) >> 1; + *d_pi1++ = ((*d_pi2--) - (*d_pi3++) + 1) >> 1; + *d_pi1++ = ((*d_pi2--) - (*d_pi3++) + 1) >> 1; + *d_pi1++ = ((*d_pi2--) - (*d_pi3++) + 1) >> 1; + *d_pi1++ = ((*d_pi2 ) - (*d_pi3 ) + 1) >> 1; + } + + d_pi2 = d_work; + d_pi4 = d_c; + d_pi5 = d_c + 7; + d_puc2 = PIXELS; + + for(d_k=0 ; d_k <8; d_k++) + { + d_ap = d_a; + *d_ap++ = d_pi2[0]; + *d_ap++ = d_pi2[4*8]; + *d_ap++ = d_pi2[2*8]; + *d_ap++ = d_pi2[6*8]; + *d_ap++ = (d_spi16*d_pi2[1*8] - d_s7pi16*d_pi2[7*8] + 32768)>>16; + *d_ap++ = (d_s5pi16*d_pi2[5*8] - d_s3pi16*d_pi2[3*8] + 32768)>>16; + *d_ap++ = (d_c3pi16*d_pi2[3*8] + d_c5pi16*d_pi2[5*8] + 32768)>>16; + *d_ap = (d_cpi16*d_pi2[1*8] + d_c7pi16*d_pi2[7*8] + 32768)>>16; + d_pi2++; + + d_bp = d_b; + *d_bp++ = (d_cpi4*(d_a[0]+d_a[1]) + 32768)>>16; + *d_bp++ = (d_cpi4*(d_a[0]-d_a[1]) + 32768)>>16; + *d_bp++ = (d_spi8*d_a[2] - d_s3pi8*d_a[3] + 32768)>>16; + *d_bp++ = (d_cpi8*d_a[2] + d_c3pi8*d_a[3] + 32768)>>16; + *d_bp++ = d_a[4] + d_a[5]; + *d_bp++ = d_a[4] - d_a[5]; + *d_bp++ = d_a[7] - d_a[6]; + *d_bp = d_a[7] + d_a[6]; + + d_cp = d_c; + *d_cp++ = (d_b[0] + d_b[3] + 4 )>>3; + *d_cp++ = (d_b[1] + d_b[2] + 4 )>>3; + *d_cp++ = (d_b[1] - d_b[2] + 4 )>>3; + *d_cp++ = (d_b[0] - d_b[3] + 4 )>>3; + *d_cp++ = (d_b[4] + 4 )>>3; + *d_cp++ = (d_cpi4*(d_b[6]-d_b[5]) + (1<<18))>>19; + *d_cp++ = (d_cpi4*(d_b[6]+d_b[5]) + (1<<18))>>19; + *d_cp = (d_b[7] + 4 )>>3; + + d_puc1 = d_puc2; + if( (d_temp = (*d_pi4++) + (*d_pi5--)) > 127) + *d_puc1 = 255; + else if(d_temp < -128) + *d_puc1 = 0; + else + *d_puc1 = d_temp + 128; + + d_puc1 += PEL_WIDTH; + if( (d_temp = (*d_pi4++) + (*d_pi5--)) > 127) + *d_puc1 = 255; + else if(d_temp < -128) + *d_puc1 = 0; + else + *d_puc1 = d_temp + 128; + + d_puc1 += PEL_WIDTH; + if( (d_temp = (*d_pi4++) + (*d_pi5--)) > 127) + *d_puc1 = 255; + else if(d_temp < -128) + *d_puc1 = 0; + else + *d_puc1 = d_temp + 128; + + d_puc1 += PEL_WIDTH; + if( (d_temp = (*d_pi4) + (*d_pi5)) > 127) + *d_puc1 = 255; + else if(d_temp < -128) + *d_puc1 = 0; + else + *d_puc1 = d_temp + 128; + + d_puc1 += PEL_WIDTH; + if( (d_temp = (*d_pi4--) - (*d_pi5++)) > 127) + *d_puc1 = 255; + else if(d_temp < -128) + *d_puc1 = 0; + else + *d_puc1 = d_temp + 128; + + d_puc1 += PEL_WIDTH; + if( (d_temp = (*d_pi4--) - (*d_pi5++)) > 127) + *d_puc1 = 255; + else if(d_temp < -128) + *d_puc1 = 0; + else + *d_puc1 = d_temp + 128; + + d_puc1 += PEL_WIDTH; + if( (d_temp = (*d_pi4--) - (*d_pi5++)) > 127) + *d_puc1 = 255; + else if(d_temp < -128) + *d_puc1 = 0; + else + *d_puc1 = d_temp + 128; + + d_puc1 += PEL_WIDTH; + if( (d_temp = (*d_pi4) - (*d_pi5)) > 127) + *d_puc1 = 255; + else if(d_temp < -128) + *d_puc1 = 0; + else + *d_puc1 = d_temp + 128; + + d_puc2 += SCAN_WIDTH; + } +} /* end of IDCT8x8_16S_8U */ + +/***************************************************************************** +** IpsSetupUdp +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +** +*****************************************************************************/ +#ifdef IPS +static long IpsSetUdp(state,i) + DecodeDctStatePtr state; + int i; +{ + UdpPtr udp = DcdDstLst_(state,i); + int min_arsize; + /* + ** Fill in UDP based on current component parameters. + */ + udp->UdpW_PixelLength = DcdPrec_(state); + switch (DcdPrec_(state)) + { + case 8: + udp->UdpB_DType = UdpK_DTypeBU; + udp->UdpB_Class = UdpK_ClassA; + break; + case 16: + udp->UdpB_DType = UdpK_DTypeWU; + udp->UdpB_Class = UdpK_ClassA; + break; + default: + udp->UdpB_DType = UdpK_DTypeVU; + udp->UdpB_Class = UdpK_ClassUBA; + } + udp->UdpL_PxlStride = udp->UdpW_PixelLength; + udp->UdpL_ScnStride = DcdCmpStr_(state,i) * 8; + udp->UdpL_X1 = 0; + udp->UdpL_X2 = DcdCmpWid_(state,i) - 1; + udp->UdpL_Y1 = 0; + udp->UdpL_Y2 = DcdCmpHgt_(state,i) - 1; + udp->UdpL_PxlPerScn = DcdCmpWid_(state,i); + udp->UdpL_ScnCnt = DcdCmpHgt_(state,i); + udp->UdpL_CompIdx = DcdCmpIdx_(state,i); + udp->UdpL_Levels = 1 << udp->UdpW_PixelLength; + /* + ** If buffer already exists, try to use it. + */ + min_arsize = (udp->UdpL_ScnStride * udp->UdpL_ScnCnt + 7) / 8; + if (udp->UdpA_Base == NULL) + { + udp->UdpL_ArSize = min_arsize * 8; + udp->UdpL_Pos = 0; + udp->UdpA_Base = + (unsigned char *) DctMallocBits_(udp->UdpL_ArSize); + if (udp->UdpA_Base == NULL) + return DctX_BadAlloc; + } + else if ((udp->UdpL_ArSize - udp->UdpL_Pos) < min_arsize) + { + return DctX_OutBufSiz; + } + + return DctX_Success; +} /* end of IpsSetupUdp */ +#endif diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiDecodeDct.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiDecodeDct.h new file mode 100644 index 0000000..6f16389 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiDecodeDct.h @@ -0,0 +1,315 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** XIE Sample Machine Independant DDX +** DCT decompression routine +** +** ABSTRACT: +** +** This module contains definitions required by the XIE SMI DCT +** decompression routines. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** John Nadai +** John Weber +** Robert NC Shelley +** +** CREATION DATE: +** +** July 31, 1990 +** +************************************************************************/ + + /* + ** Allows to be included multiple times. + */ +#ifndef _DECODEDCT +#define _DECODEDCT + +/* +** Include Files +*/ +#if defined(XIESMI) +#include +#include +#endif + +/* +** Equated symbols +*/ + /* + ** Action routine status values + */ +#define DcdK_ActionSuccess 0 +#define DcdK_ActionError 1 + /* + ** Initial size and increment of unstuffed source data buffer. + */ +#define DcdK_DataSize 1024 + +/* +** DCT decompression state structure. +*/ +typedef struct _DecodeDctState { + /* + ** Decode state variable. + */ + struct _DecDctStatus { + char state; + struct _DctStatusFlags { + unsigned data_seen : 1; + unsigned marker_seen : 1; + unsigned input_exhausted : 1; + unsigned reserved : 5; + } flags; + union { + int dst_full; + char udp_full[sizeof(int)]; + } full; + } status; + /* + ** The current source buffer. + */ + int current_len; /* Length of current data */ + int current_pos; /* Position within current data */ + unsigned char *current_ptr; /* Pointer to current data */ + /* + ** Token type and data pointer/length. + */ + int token_len; /* Length of token data */ + int token_pos; /* Position of token specific data */ + unsigned char *token_ptr; /* Pointer to token data */ + /* + ** Data buffer -- for tokens that span source buffers and unstuffing data. + */ + unsigned char *data_ptr; /* Pointer to data buffer */ + int data_siz; /* Size of data buffer */ + /* + ** DCT frame variables. + */ + union { + char mode; + struct _DctMode { /* DCT mode flags */ + unsigned reserved_1 : 1; /* Unused */ + unsigned arith_coding : 1; /* Arithmetic encoding */ + unsigned progressive : 1; /* Progressive xmisson */ + unsigned hierarchical : 1; /* Hierarchical encoding */ + unsigned differential : 1; /* Differential encoding */ + unsigned spatial : 1; /* Spatial encoding */ + unsigned extended : 1; /* Extended version */ + unsigned reserved_2 : 1; /* Unused */ + } mode_bits; + } mode_union; + char precision; /* Data precision, 0 = 8 bits */ + short frame_width; /* Pels/scan for frame */ + short frame_height; /* Scan count for frame */ + char component_count; /* Components per scan */ + short restart_interval; /* Restart interval */ + char restart_enable; /* Restart enabled for current scan */ + /* + ** DCT per component variables. + */ + UdpPtr dstlst[DctK_MaxComponents]; /* Destination UDPs */ + struct _DecDctComponent { + char component_index; /* Component index value */ + char dstidx; /* Destination UDP index */ + char vertical_samples; /* Vertical sampling rate */ + char horizontal_samples; /* Horizontal sampling rate */ + char quant_table; /* Quantization table to use */ + int component_width; /* Pels/scan for component */ + int component_height; /* Scan count for component */ + int component_stride; /* Minimum stride required per scan */ + int component_arsize; /* Minimum scans required for image */ + char component_huff_ac; /* Huffman AC table for this comp. */ + char component_huff_dc; /* Huffman DC table for this comp. */ + int scans_per_segment; /* Number of scans between restarts */ + int current_x; /* Current X location for decode */ + int current_y; /* Current Y location for decode */ + } component[DctK_MaxComponents]; + /* + ** Quantization tables. + */ + char quant_default[DctK_MaxQuantTables]; + QuantTablePtr quant_table[DctK_MaxQuantTables]; + /* + ** Huffman tables. + */ + AcSpecTablePtr ac_spec_table[DctK_MaxHuffTables]; + AcDecodeTablePtr ac_huff_table[DctK_MaxHuffTables]; + DcSpecTablePtr dc_spec_table[DctK_MaxHuffTables]; + DcDecodeTablePtr dc_huff_table[DctK_MaxHuffTables]; + /* + ** Decompression state variables. + */ + int interleaves_per_line; + int interleave_lines; + int horz_interleave_count; + int vert_interleave_counter; + int horz_interleave_counter; +} DecodeDctStateRec, *DecodeDctStatePtr; + +/* +** MACROs to access state structure variables. +*/ +#define DcdState_(state_ptr) (state_ptr)->status.state +#define DcdData_(state) (state)->status.flags.data_seen +#define DcdMarker_(state) (state)->status.flags.marker_seen +#define DcdInpExh_(state) (state)->status.flags.input_exhausted +#define DcdDstFul_(state) (state)->status.full.dst_full +#define DcdUdpFul_(state,i) (state)->status.full.udp_full[(i)] + +#define DcdCurLen_(state) (state)->current_len +#define DcdCurPos_(state) (state)->current_pos +#define DcdCurPtr_(state) (state)->current_ptr + +#define DcdTokLen_(state) (state)->token_len +#define DcdTokPos_(state) (state)->token_pos +#define DcdTokPtr_(state) (state)->token_ptr + +#define DcdDatPtr_(state) (state)->data_ptr +#define DcdDatSiz_(state) (state)->data_siz + +#define DcdMode_(state) (state)->mode_union.mode +#define DcdPrec_(state) (state)->precision +#define DcdFrmWid_(state) (state)->frame_width +#define DcdFrmHgt_(state) (state)->frame_height +#define DcdCmpCnt_(state) (state)->component_count +#define DcdRstInt_(state) (state)->restart_interval +#define DcdRstEnb_(state) (state)->restart_enable + +#define DcdCmpIdx_(state,i) (state)->component[(i)].component_index +#define DcdCmpVrt_(state,i) (state)->component[(i)].vertical_samples +#define DcdCmpHrz_(state,i) (state)->component[(i)].horizontal_samples +#define DcdCmpQnt_(state,i) (state)->component[(i)].quant_table +#define DcdCmpWid_(state,i) (state)->component[(i)].component_width +#define DcdCmpHgt_(state,i) (state)->component[(i)].component_height +#define DcdCmpStr_(state,i) (state)->component[(i)].component_stride +#define DcdCmpLen_(state,i) (state)->component[(i)].component_arsize +#define DcdCmpHac_(state,i) (state)->component[(i)].component_huff_ac +#define DcdCmpHdc_(state,i) (state)->component[(i)].component_huff_dc +#define DcdScnSeg_(state,i) (state)->component[(i)].scans_per_segment +#define DcdCurX_(state,i) (state)->component[(i)].current_x +#define DcdCurY_(state,i) (state)->component[(i)].current_y +#define DcdDstIdx_(state,i) (state)->component[(i)].dstidx + +#define DcdDstLst_(state,i) (state)->dstlst[(i)] + +#define DcdQntTbl_(state,i) (state)->quant_table[(i)] +#define DcdQntDef_(state,i) (state)->quant_default[(i)] + +#define DcdHacTbl_(state,i) (state)->ac_huff_table[(i)] +#define DcdHdcTbl_(state,i) (state)->dc_huff_table[(i)] +#define DcdSacTbl_(state,i) (state)->ac_spec_table[(i)] +#define DcdSdcTbl_(state,i) (state)->dc_spec_table[(i)] + +#define DcdVrtCnt_(state) (state)->vert_interleave_counter +#define DcdHrzCnt_(state) (state)->horz_interleave_counter + +#define DcdIntCol_(state) (state)->interleaves_per_line +#define DcdIntLin_(state) (state)->interleave_lines + +#if defined(XIESMI) + /* + ** DecodeDct pipeline context block. + */ +typedef struct _DecodeDctPipeCtx { + PipeElementCommonPart common; + struct _DecodeDctPart { + PipeSinkPtr Src; + PipeSinkPtr Dst; + PipeDrainPtr Drn; + PipeDataPtr SrcDat; + PipeDataPtr DstDat[XieK_MaxComponents]; + UdpPtr DstUdp[XieK_MaxComponents]; + DecodeDctStatePtr SteBlk[XieK_MaxComponents]; + int SrcCnt; + int DstCnt; + int DcdCnt; + } DecodeDctPart; +} DecodeDctPipeCtx, *DecodeDctPipeCtxPtr; + +/* +** MACROs to access pipeline context structure. +*/ +#define DcdSrc_(ctx) ((ctx)->DecodeDctPart.Src) +#define DcdDst_(ctx) ((ctx)->DecodeDctPart.Dst) +#define DcdDrn_(ctx) ((ctx)->DecodeDctPart.Drn) +#define DcdSrcDat_(ctx) ((ctx)->DecodeDctPart.SrcDat) +#define DcdDstDat_(ctx,comp) ((ctx)->DecodeDctPart.DstDat[(comp)]) +#define DcdDstUdp_(ctx,comp) ((ctx)->DecodeDctPart.DstUdp[(comp)]) +#define DcdSteBlk_(ctx,comp) ((ctx)->DecodeDctPart.SteBlk[(comp)]) +#define DcdSrcCnt_(ctx) ((ctx)->DecodeDctPart.SrcCnt) +#define DcdDstCnt_(ctx) ((ctx)->DecodeDctPart.DstCnt) +#define DcdDcdCnt_(ctx) ((ctx)->DecodeDctPart.DcdCnt) +#endif + + /* + ** Function reference at end to allow ptr defs + */ +#ifdef XIESMI +extern int SmiDecodeDct(); +extern int SmiCreateDecodeDct(); +#endif + +/* +** The following line MUST be the last line of this file. +*/ +#endif +/* _DECODEDCT */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiDecodeG4.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiDecodeG4.c new file mode 100644 index 0000000..8e23333 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiDecodeG4.c @@ -0,0 +1,835 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989, 1990 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module implements decompression of G4 Facsimile encoded data. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHORS: +** +** Derived from code originally developed by Ken MacDonald +** John Weber +** Robert NC Shelley +** +** CREATION DATE: +** +** February 27, 1990 +** +*******************************************************************************/ + +#include + +#include "SmiDecodeG4.h" + +/* +** Table of contents +*/ +int SmiDecodeG4(); + +int SmiCreateDecodeG4(); +static int _DecodeG4Initialize(); +static int _DecodeG4Activate(); +static int _DecodeG4Abort(); +static int _DecodeG4Destroy(); + +static int _DecodeG4Segment(); +static DecodeG4StatePtr _InitializeG4State(); +static DecodeG4StatePtr _DestroyG4State(); +static int _DecodeG4Src(); +static int _DecodeG4Process(); + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* +** Local storage +*/ + /* + ** DecodeG4 Element Vector + */ +static PipeElementVector DecodeG4PipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeDecodeG4Element, /* Structure subtype */ + sizeof(DecodeG4PipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _DecodeG4Initialize, /* Initialize entry */ + _DecodeG4Activate, /* Activate entry */ + _DecodeG4Abort, /* Flush entry */ + _DecodeG4Destroy, /* Destroy entry */ + _DecodeG4Abort /* Abort entry */ + }; + +/***************************************************************************** +** SmiDecodeG4 +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiDecodeG4( src, dst ) + UdpPtr src; + UdpPtr dst; +{ + DecodeG4StatePtr state; + int status; + /* + ** Initialize state record fields. + */ + state = _InitializeG4State( dst ); + if( !IsPointer_(state) ) return( (int) state ); + + state->srcpos = upPos_(src); + /* + ** Decode the entire buffer as a single segment. + */ + status = _DecodeG4Segment( src, dst, state ); + _DestroyG4State( state ); + + return(status == G4K_StsDstFul || status==G4K_StsEoi ? Success : BadValue); +} + +/***************************************************************************** +** SmiCreateDecodeG4 +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCreateDecodeG4( pipe, src, dst ) + Pipe pipe; + PipeSinkPtr src; + PipeSinkPtr dst; +{ + DecodeG4PipeCtxPtr ctx = (DecodeG4PipeCtxPtr) + DdxCreatePipeCtx_( pipe, &DecodeG4PipeElement, TRUE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + /* + ** Build our DecodeG4 Pipe Ctx from the arguments passed in. + */ + DG4SrcSnk_(ctx) = src; + DG4DstSnk_(ctx) = dst; + /* + ** Create a drain which reads component 0. + */ + DG4SrcDrn_(ctx) = DdxRmCreateDrain_( src, 1 ); + if( !IsPointer_(DG4SrcDrn_(ctx)) ) return((int) DG4SrcDrn_(ctx) ); + /* + ** Process any amount of encoded data, output bits. + */ + DdxRmSetQuantum_( DG4SrcDrn_(ctx), 0 ); + DdxRmSetDType_( DG4SrcDrn_(ctx), UdpK_DTypeV, DtM_V ); + DdxRmSetQuantum_( dst, 0 ); + DdxRmSetDType_( dst, UdpK_DTypeVU, DtM_VU ); + + return( Success ); +} /* end of SmiCreateDecodeG4 */ + +/***************************************************************************** +** _DecodeG4Initialize +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _DecodeG4Initialize( ctx ) + DecodeG4PipeCtxPtr ctx; +{ + int status; + /* + ** Initialize the source Drain. + */ + status = DdxRmInitializePort_( CtxHead_(ctx), DG4SrcDrn_(ctx) ); + if( status != Success ) return( status ); + CtxInp_(ctx) = DG4SrcDrn_(ctx); + VecNoInpt_(CtxVecPtr_(ctx)) = FALSE; + /* + ** Initialize the destination Sink. + */ + status = DdxRmInitializePort_( CtxHead_(ctx), DG4DstSnk_(ctx) ); + if( status != Success ) return( status ); + /* + ** Create a destination descriptor. + */ + DG4DstDat_(ctx) = DdxRmAllocData_( DG4DstSnk_(ctx), 0, 0, + DdxRmGetMaxQuantum_(DG4DstSnk_(ctx)) ); + if( !IsPointer_(DG4DstDat_(ctx)) ) + return((int)DG4DstDat_(ctx)); + /* + ** Create a decode state. + */ + DG4SteBlk_(ctx) = _InitializeG4State(SnkUdpPtr_(DG4DstSnk_(ctx),0)); + if( !IsPointer_(DG4SteBlk_(ctx))) return((int) DG4SteBlk_(ctx) ); + + return( status ); +} /* end of _DecodeG4Initialize */ + +/***************************************************************************** +** _DecodeG4Activate +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _DecodeG4Activate( ctx ) + DecodeG4PipeCtxPtr ctx; +{ + PipeDataPtr src; + unsigned char *tmp; + int pos, h, y, s; + + if( VecNoInpt_(CtxVecPtr_(ctx)) && DdxPipeHasYielded_(CtxHead_(ctx)) ) + { /* + ** We already have source data but aren't allowed to process it. + */ + if( !DatOwned_(DG4SrcDat_(ctx)) ) + { /* + ** Move the unprocessed data to a buffer of our own. + */ + src = DG4SrcDat_(ctx); + tmp = DatBase_(src); + pos = DG4SteBlk_(ctx)->srcpos & ~0x7; + DG4SteBlk_(ctx)->srcpos &= 0x7; + DatArSize_(src) -= pos; + DatOwned_(src) = TRUE; + DatPos_(src) = 0; + DatBase_(src) = DdxMallocBits_( DatArSize_(src) ); + if( DatBase_(src) == NULL ) return( BadAlloc ); + memcpy( DatBase_(src), tmp+(pos>>3), DatArSize_(src)>>3 ); + } + return( Success ); + } + + do { /* + ** Decode data until source exhausted, destination full, or error. + */ + if( !VecNoInpt_(CtxVecPtr_(ctx)) ) + { /* + ** Get a chunk of encoded data. + */ + DG4SrcDat_(ctx) = DdxRmGetData_( ctx, DG4SrcDrn_(ctx) ); + if( !IsPointer_(DG4SrcDat_(ctx)) ) return( (int) DG4SrcDat_(ctx) ); + DG4SteBlk_(ctx)->srcpos = DatPos_(DG4SrcDat_(ctx)); + } + + /* + ** No destination data segment means we have already returned the + ** the last scanline of the image, or there is a bug somewhere. + ** Tolerate the client being confused or having a slightly bogus + ** G4 stream by discarding any data and returning success. + */ + if( !IsPointer_(DG4DstDat_(ctx)) ) + { + DG4SrcDat_(ctx) = DdxRmDeallocData_(DG4SrcDat_(ctx)); + VecNoInpt_(CtxVecPtr_(ctx)) = FALSE; + break; + } + + /* + ** Call the decoder (if we've already finished just discard the data). + */ + s = !IsPointer_(DG4DstDat_(ctx)) ? G4K_StsSrcExh + : _DecodeG4Segment( DatUdpPtr_(DG4SrcDat_(ctx)), + DatUdpPtr_(DG4DstDat_(ctx)), + DG4SteBlk_(ctx) ); + switch( s ) + { + case G4K_StsDstFul : + /* + ** Pass the PCM data along. + */ + y = DatY2_(DG4DstDat_(ctx)); + s = DdxRmPutData_( DG4DstSnk_(ctx), DG4DstDat_(ctx) ); + + if( s == Success && y++ < SnkY2_(DG4DstSnk_(ctx),0) ) + { /* + ** Allocate space for another quantum of decoded data. + */ + h = DdxRmGetMaxQuantum_( DG4DstSnk_(ctx) ); + if( h > SnkHeight_(DG4DstSnk_(ctx),0) - y ) + h = SnkHeight_(DG4DstSnk_(ctx),0) - y; + DG4DstDat_(ctx) = DdxRmAllocData_( DG4DstSnk_(ctx), 0, y, h ); + if( !IsPointer_(DG4DstDat_(ctx)) ) + s = (int) DG4DstDat_(ctx); + } + else + DG4DstDat_(ctx) = NULL; + + VecNoInpt_(CtxVecPtr_(ctx)) = IsPointer_(DG4DstDat_(ctx)); + return( s ); + + case G4K_StsSrcExh : + /* + ** We're done with that chunk -- prepare for more. + */ + DG4SrcDat_(ctx) = DdxRmDeallocData_(DG4SrcDat_(ctx)); + VecNoInpt_(CtxVecPtr_(ctx)) = FALSE; + break; + + default : return( BadValue ); + } + } + while( s == G4K_StsSrcExh ); + + return( Success ); +} /* end of _DecodeG4Activate */ + +/***************************************************************************** +** _DecodeG4Abort +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _DecodeG4Abort( ctx ) + DecodeG4PipeCtxPtr ctx; +{ + /* + ** Destroy decode state. + */ + DG4SteBlk_(ctx) = _DestroyG4State( DG4SteBlk_(ctx) ); + /* + ** Turn off the no-input flag. + */ + VecNoInpt_(CtxVecPtr_(ctx)) = FALSE; + /* + ** Deallocate source and destination data descriptors. + */ + DG4SrcDat_(ctx) = DdxRmDeallocData_( DG4SrcDat_(ctx) ); + DG4DstDat_(ctx) = DdxRmDeallocData_( DG4DstDat_(ctx) ); + + return( Success ); +} /* end of _DecodeG4Abort */ + +/***************************************************************************** +** _DecodeG4Destroy +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _DecodeG4Destroy( ctx ) + DecodeG4PipeCtxPtr ctx; +{ + DG4SrcDrn_(ctx) = DdxRmDestroyDrain_( DG4SrcDrn_(ctx) ); + + return( Success ); +} /* end of _DecodeG4Destroy */ + +/***************************************************************************** +** _DecodeG4Segment +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _DecodeG4Segment( src, dst, state ) + UdpPtr src; + UdpPtr dst; + DecodeG4StatePtr state; +{ + UdpRec tmp; + unsigned char rem[4]; + int value; + + /* + ** Allocate destination buffer if required. + */ + if( upBase_(dst) == NULL ) + { + upBase_(dst) = DdxMallocBits_( upArSize_(dst) ); + if( upBase_(dst) == NULL ) return( BadAlloc ); + } + /* + ** If there are source bits remaining, concatenate them in a buffer with + ** some new source bits. + */ + if( state->remlen != 0 ) + { + urArSize_(tmp) = state->remlen + G4K_MinSrcLen; + urBase_(tmp) = rem; + urPos_(tmp) = 0; + state->srcpos = 0; + PUT_VALUE_( urBase_(tmp), 0, state->remdat, (1<remlen)-1 ); + value = GET_VALUE_( upBase_(src), upPos_(src), (1<remlen, value, (1<srcpos = upPos_(src) + G4K_MinSrcLen - state->remlen; + state->remlen = 0; + break; + + case G4K_StsDstFul: + /* + ** Destination full, but src not exhausted. + ** Restore state so things can be resumed. + */ + state->srcpos -= state->remlen; + if( state->srcpos < 0 ) + { + state->remdat >>= state->remlen + state->srcpos; + state->remlen = abs( state->srcpos ); + } + else + state->remlen = 0; + return( G4K_StsDstFul ); + + case G4K_StsDcdErr: + return( G4K_StsDcdErr ); + } + } + return( _DecodeG4Src( src, dst, state ) ); +} + +/***************************************************************************** +** _InitializeG4State +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +** none +** +*****************************************************************************/ +static DecodeG4StatePtr _InitializeG4State(dst) + UdpPtr dst; +{ + DecodeG4StatePtr state = (DecodeG4StatePtr) + DdxCalloc_(1,sizeof(DecodeG4StateRec)); + if( state == NULL ) return( (DecodeG4StatePtr) BadAlloc ); + + state->ppl = upWidth_(dst); + state->nxtscn = upY1_(dst); + state->lstscn = dst->UdpL_Y2; + state->ccl = (int *) DdxMalloc_((state->ppl + 4) * sizeof(int)); + state->rcl = (int *) DdxMalloc_((state->ppl + 4) * sizeof(int)); + + state->rcl[0] = 1; + state->rcl[1] = state->ppl; + state->rcl[2] = state->ppl; + state->rcl[3] = state->ppl; + state->rcl[4] = state->ppl; + + state->mode = G4K_ModeNewScan; + + return( state ); +} + +/***************************************************************************** +** _DestroyG4State +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +** none +** +*****************************************************************************/ +static DecodeG4StatePtr _DestroyG4State(state) + DecodeG4StatePtr state; +{ + if( IsPointer_(state) ) + { + if( IsPointer_(state->ccl) ) + DdxFree_(state->ccl); + if( IsPointer_(state->rcl) ) + DdxFree_(state->rcl); + DdxFree_(state); + } + return( NULL ); +} + +/***************************************************************************** +** _DecodeG4Src +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _DecodeG4Src( src, dst, state ) + UdpPtr src; + UdpPtr dst; + DecodeG4StatePtr state; +{ + int status; + int *tmp; + long scanofs; + + if( state->nxtscn < upY1_(dst) ) + status = G4K_StsDstFul; + else + while( TRUE ) + { + if( state->nxtscn > upY2_(dst) ) + { + status = G4K_StsDstFul; + break; + } + status = _DecodeG4Process( src, state ); + if( status == G4K_StsEol ) + { + state->ccl[state->ccl[0]+1] = state->ppl; + state->ccl[state->ccl[0]+2] = state->ppl; + state->ccl[state->ccl[0]+3] = state->ppl; + + scanofs = upPos_(dst) + upScnStr_(dst) + * (state->nxtscn++ - upY1_(dst)); + memset( upBase_(dst)+(scanofs+7>>3), 0, upScnStr_(dst)+7>>3 ); + MiPutRuns( upBase_(dst), scanofs, state->ccl ); + /* + ** Swap current and reference scanlines. + */ + tmp = state->rcl; + state->rcl = state->ccl; + state->ccl = tmp; + } + else + break; + } + + switch (status) + { + case G4K_StsEoi: + /* + ** EOI before the expected last scanline. For now, + ** consider this an error. + */ + if (state->nxtscn <= state->lstscn) + return G4K_StsDcdErr; + + case G4K_StsEol: + if (state->nxtscn > state->lstscn) + return G4K_StsEoi; + else + return G4K_StsDstFul; + default: + return status; + } + +} + +/***************************************************************************** +** _DecodeG4Process +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _DecodeG4Process(src, state) + UdpPtr src; + DecodeG4StatePtr state; +{ + int bits, value, type; + + if( state->mode == G4K_ModeNewScan ) + { + state->cidx = 0; + state->ridx = 1; + state->a0 = -1; + state->a0prime = -1; + state->a1 = 0; + state->b1 = 0; + state->mode = G4K_ModeCodeword; + state->ccl[0] = 0; + } + while( TRUE ) + { + if( upArSize_(src) - state->srcpos > G4K_MinSrcLen ) + { + switch( state->mode ) + { /* + ** Read the next codeword and dispatch. + */ + case G4K_ModeCodeword : + bits = GET_VALUE_( upBase_(src), state->srcpos, G4M_Codeword ); + state->srcpos += MiArFax2DDecodeTable[bits].length; + + switch( MiArFax2DDecodeTable[bits].type ) + { /* + ** State mode is codeword, codeword type is TERMINATOR, + ** dispatch from here based on codeword value. + */ + case G4K_CodetypeTerminator : + switch( MiArFax2DDecodeTable[bits].value ) + { /* + ** State mode is codeword, codeword type is + ** TERMINATOR, codeword value is PASS. + */ + case G4K_CodevaluePass : + while( state->rcl[state->ridx] <= state->a0prime || + ((state->ridx & 1) == (state->cidx & 1))) + state->ridx++; + state->b1 = state->rcl[state->ridx]; + state->a0prime = state->rcl[state->ridx + 1]; + if( state->ridx > 1 + && state->rcl[state->ridx - 1] > state->a0prime ) + state->ridx--; + if( state->ccl[state->cidx] >= state->ppl ) + { + state->mode = G4K_ModeNewScan; + return( G4K_StsEol ); + } + break; + /* + ** State mode is Codeword, codeword type is TERMINATOR, + ** codeword value is HORIZONTAL. + */ + case G4K_CodevalueHoriz : + if( state->a0 < 0 ) + { + state->a0 = 0; + if( state->a0prime < 0 ) + state->a0prime = 0; + } + state->cidx++; + state->rlen = 0; + state->mode = G4K_ModeFirstRun; + break; + /* + ** State mode is codeword, codeword type is TERMINATOR, + ** codeword value is VERTICAL. + */ + case G4K_CodevalueV0 : + case G4K_CodevalueVR1 : + case G4K_CodevalueVL1 : + case G4K_CodevalueVR2 : + case G4K_CodevalueVL2 : + case G4K_CodevalueVR3 : + case G4K_CodevalueVL3 : + while( state->rcl[state->ridx] <= state->a0prime || + ((state->ridx & 1) == (state->cidx & 1))) + state->ridx++; + state->b1 = state->rcl[state->ridx]; + + if( state->ridx > 1 + && state->rcl[state->ridx - 1] > state->a0prime ) + state->ridx--; + state->a0 = state->b1+MiArFax2DDecodeTable[bits].value; + state->a0prime = state->a0; + state->ccl[++(state->cidx)] = state->a0; + state->ccl[0]++; + + if( state->ccl[state->cidx] >= state->ppl ) + { + state->mode = G4K_ModeNewScan; + return( G4K_StsEol ); + } + break; + /* + ** Here on invalid codeword values. + */ + default: return( G4K_StsDcdErr ); + } + break; /* End of switch (codeword type) */ + + /* + ** State mode is Codeword, codeword type is EOL. + */ + case G4K_CodetypeEol : + bits = GET_VALUE_(upBase_(src),state->srcpos,G4M_Codeword); + if( MiArFax2DDecodeTable[bits].type == G4K_CodetypeEol ) + { + state->srcpos += MiArFax2DDecodeTable[bits].length; + return( G4K_StsEoi ); + } + else + { + state->mode = G4K_ModeNewScan; + return( G4K_StsEol ); + } + /* + ** Here on invalid codeword types. + */ + default: return( G4K_StsDcdErr ); + } + break; /* End of switch (codeword value) */ + + case G4K_ModeFirstRun : + if( state->cidx & 1 == G4K_WhiteRun ) + { + bits = GET_VALUE_(upBase_(src), state->srcpos, G4M_WhiteRun); + value = MiArFax1DDecodeWhite[bits].value; + type = MiArFax1DDecodeWhite[bits].type; + state->srcpos += MiArFax1DDecodeWhite[bits].length; + } + else + { + bits = GET_VALUE_(upBase_(src), state->srcpos, G4M_BlackRun); + value = MiArFax1DDecodeBlack[bits].value; + type = MiArFax1DDecodeBlack[bits].type; + state->srcpos += MiArFax1DDecodeBlack[bits].length; + } + state->rlen += value; + + if( type != G4K_CodetypeMakeup ) + { + state->a1 = state->rlen + state->a0prime; + state->ccl[state->cidx++] = state->a1; + state->ccl[0]++; + state->rlen = 0; + state->mode = G4K_ModeSecondRun; + } + break; + + case G4K_ModeSecondRun : + if( state->cidx & 1 == G4K_WhiteRun ) + { + bits = GET_VALUE_(upBase_(src), state->srcpos, G4M_WhiteRun); + value = MiArFax1DDecodeWhite[bits].value; + type = MiArFax1DDecodeWhite[bits].type; + state->srcpos += MiArFax1DDecodeWhite[bits].length; + } + else + { + bits = GET_VALUE_(upBase_(src), state->srcpos, G4M_BlackRun); + value = MiArFax1DDecodeBlack[bits].value; + type = MiArFax1DDecodeBlack[bits].type; + state->srcpos += MiArFax1DDecodeBlack[bits].length; + } + state->rlen += value; + + if( type != G4K_CodetypeMakeup ) + { + state->a0 = state->a1 + state->rlen; + state->a0prime = state->a0; + state->ccl[state->cidx] = state->a0; + state->ccl[0]++; + state->mode = G4K_ModeCodeword; + + if( state->ccl[state->cidx] >= state->ppl ) + { + state->mode = G4K_ModeNewScan; + return( G4K_StsEol ); + } + } + break; + /* + ** Here on invalid state mode. + */ + default: return( G4K_StsDcdErr ); + } /* End of switch (state->mode) */ + + } /* End of if (enough source data remaining) */ + else + { /* + ** Not enough source data, return source exhausted. + */ + state->remlen = upArSize_(src) - state->srcpos; + state->remdat = GET_VALUE_( upBase_(src), + state->srcpos, (1<remlen)-1 ); + return( G4K_StsSrcExh ); + } + } +} diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiDecodeG4.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiDecodeG4.h new file mode 100644 index 0000000..2aed4fb --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiDecodeG4.h @@ -0,0 +1,215 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the G4 decompress pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.0 +** RISC ULTRIX V3.0 +** +** AUTHOR(S): +** +** John Weber +** Robert NC Shelley +** +** CREATION DATE: +** +** February 27, 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMIDECODEG4 +#define _SMIDECODEG4 + +/* +** Include files +*/ +#include + +/* +** Equated Symbols +*/ + +/* +** State record for decompression +*/ +typedef struct _DecodeG4State { + int srcpos; + int ppl; + int mode; + int *rcl_desc; + int *rcl; + int *ccl; + int ridx; + int cidx; + int a0; + int a0prime; + int a1; + int b1; + int rlen; + int remdat; + int remlen; + int nxtscn; + int lstscn; + int pad_flag; +} DecodeG4StateRec, *DecodeG4StatePtr; + +/* +** Huffman decode table definitions +*/ +typedef struct _DecodeG4HuffTable { + short value; + unsigned char length; + char type; +} DecodeG4HuffTableRec, *DecodeG4HuffTablePtr; + + /* + ** DecodeG4 pipeline context block. + */ +typedef struct _DecodeG4PipeCtx { + PipeElementCommonPart common; + struct _DecodeG4Part { + PipeSinkPtr Src; + PipeSinkPtr Dst; + PipeDrainPtr Drn; + PipeDataPtr SrcDat; + PipeDataPtr DstDat; + DecodeG4StatePtr SteBlk; + int NewDst; + } DecodeG4Part; +} DecodeG4PipeCtx, *DecodeG4PipeCtxPtr; + +/* +** MACROs to access pipeline context structure. +*/ +#define DG4SrcSnk_(ctx) ((ctx)->DecodeG4Part.Src) +#define DG4DstSnk_(ctx) ((ctx)->DecodeG4Part.Dst) +#define DG4SrcDrn_(ctx) ((ctx)->DecodeG4Part.Drn) +#define DG4SrcDat_(ctx) ((ctx)->DecodeG4Part.SrcDat) +#define DG4DstDat_(ctx) ((ctx)->DecodeG4Part.DstDat) +#define DG4SteBlk_(ctx) ((ctx)->DecodeG4Part.SteBlk) +#define DG4NewDst_(ctx) ((ctx)->DecodeG4Part.NewDst) + +/* +** Code table constants +*/ +#define G4K_BlackTableSize 8192 +#define G4K_WhiteTableSize 4096 +#define G4K_DecodeTableSize 4096 +#define G4K_MinSrcLen 14 /* Defines the maximum codeword */ + /* size in bits */ +#define G4M_WhiteRun 0x0FFF +#define G4M_BlackRun 0x1FFF +#define G4M_Codeword 0x0FFF +/* +** Decoding mode constants +*/ +#define G4K_ModeNewScan 1 +#define G4K_ModeCodeword 2 +#define G4K_ModeFirstRun 3 +#define G4K_ModeSecondRun 4 +/* +** These constants define the usage of the change lists. If the change list +** index is even, a white run is described. If a black run is being defined, +** the changelist index will be odd. +*/ +#define G4K_WhiteRun 1 +#define G4K_BlackRun 0 +/* +** Code type constants +*/ +#define G4K_CodetypeTerminator 2 +#define G4K_CodetypeEol -1 +#define G4K_CodetypeMakeup 1 +/* +** Code value constants +*/ +#define G4K_CodevaluePass 4 +#define G4K_CodevalueHoriz 5 +#define G4K_CodevalueV0 0 +#define G4K_CodevalueVR1 1 +#define G4K_CodevalueVL1 -1 +#define G4K_CodevalueVR2 2 +#define G4K_CodevalueVL2 -2 +#define G4K_CodevalueVR3 3 +#define G4K_CodevalueVL3 -3 +/* +** Status code definitions +*/ +#define G4K_StsEol -1 +#define G4K_StsDcdErr -2 +#define G4K_StsSrcExh -3 +#define G4K_StsDstFul -4 +#define G4K_StsEoi -5 + +/* +** External References +*/ +extern int SmiDecodeG4(); +extern int SmiCreateDecodeG4(); + +externalref DecodeG4HuffTableRec MiArFax1DDecodeWhite[G4K_WhiteTableSize]; +externalref DecodeG4HuffTableRec MiArFax1DDecodeBlack[G4K_BlackTableSize]; +externalref DecodeG4HuffTableRec MiArFax2DDecodeTable[G4K_DecodeTableSize]; + +#endif +/* _SMIDECODEG4 */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiDither.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiDither.c new file mode 100644 index 0000000..280cbdd --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiDither.c @@ -0,0 +1,597 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module does a Floyd Stienberg dither, same as blue noise +** only no random, no serpentine stuff. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHORS: +** +** John Weber +** +** CREATION DATE: +** +** 28-April-1989 +** +*******************************************************************************/ + +#include + +#include "SmiDither.h" + +/* +** Table of contents +*/ +int SmiDither(); +int SmiCreateDither(); + +static int _DitherInitialize(); +static int _DitherActivate(); +static int _DitherAbort(); +static int _DitherDestroy(); + +static void DitherProcess(); + +/* +** Equated Symbols +*/ + +#define F1_32 0.03125 +#define F1_8 0.125 +#define F7_16 0.4375 +#define F1_16 0.0625 +#define F5_16 0.3125 +#define F3_16 0.1875 + +/* +** External References +*/ + +/* +** Local storage +*/ + /* + ** Dither Element Vector + */ +static PipeElementVector DitherPipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeDitherElement, /* Structure subtype */ + sizeof(DitherPipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _DitherInitialize, /* Initialize entry */ + _DitherActivate, /* Activate entry */ + _DitherAbort, /* Flush entry */ + _DitherDestroy, /* Destroy entry */ + _DitherAbort /* Abort entry point */ + }; + +/***************************************************************************** +** SmiCreateDither +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the DITHER pipeline element +** +** FORMAL PARAMETERS: +** +** ctx - dither pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCreateDither(pipe,srcsnk,dstsnk) +Pipe pipe; +PipeSinkPtr srcsnk; +PipeSinkPtr dstsnk; +{ + int i, dtype; + DitherPipeCtxPtr ctx = (DitherPipeCtxPtr) + DdxCreatePipeCtx_(pipe, &DitherPipeElement, FALSE); + if( !IsPointer_(ctx) ) return( (int) ctx ); + /* + ** Copy parameters + */ + DtrSrcSnk_(ctx) = srcsnk; + DtrDstSnk_(ctx) = dstsnk; + + DtrSrcDrn_(ctx) = DdxRmCreateDrain_( srcsnk, -1 ); + if( !IsPointer_(DtrSrcDrn_(ctx)) ) return( (int) DtrSrcDrn_(ctx) ); + + DdxRmSetDType_( DtrSrcDrn_(ctx), UdpK_DTypeUndefined, DtM_BU | DtM_WU ); + DdxRmSetQuantum_( DtrSrcDrn_(ctx), 1 ); + + for(i = 0; i < XieK_MaxComponents && IsPointer_(SnkUdpPtr_(dstsnk,i)); i++) + if( SnkLvl_(dstsnk,i) <= 256 ) + dtype = UdpK_DTypeBU; + else + { + dtype = UdpK_DTypeWU; + break; + } + DdxRmSetDType_( dstsnk, dtype, 1<UdpA_Base == NULL ) + { /* + ** Allocate the destination image array + */ + dstudp->UdpA_Base = DdxMallocBits_( dstudp->UdpL_ArSize ); + if( dstudp->UdpA_Base == NULL ) return( BadAlloc ); + } + if( dstudp->UdpL_Levels < 2 ) + /* + ** Forget the image -- just zero-fill the destination scanlines. + */ + return( DdxFillRegion_( dstudp, + dstudp->UdpL_X1, dstudp->UdpL_Y1, + dstudp->UdpL_PxlPerScn, + dstudp->UdpL_ScnCnt, 0 ) ); + + if(srcudp->UdpB_DType == UdpK_DTypeBU || srcudp->UdpB_DType == UdpK_DTypeWU) + src = srcudp; + else + { /* + ** Convert input data buffer to our "prefered" format. + */ + src = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( src == NULL ) return( BadAlloc ); + + src->UdpW_PixelLength = srcudp->UdpL_Levels > 256 ? 8 * sizeof(short) + : 8 * sizeof(char); + src->UdpB_DType = srcudp->UdpL_Levels > 256 ? UdpK_DTypeWU + : UdpK_DTypeBU; + src->UdpB_Class = UdpK_ClassA; + src->UdpL_X1 = srcudp->UdpL_X1; + src->UdpL_X2 = srcudp->UdpL_X2; + src->UdpL_Y1 = srcudp->UdpL_Y1; + src->UdpL_Y2 = srcudp->UdpL_Y2; + src->UdpL_PxlPerScn = srcudp->UdpL_PxlPerScn; + src->UdpL_ScnCnt = srcudp->UdpL_ScnCnt; + src->UdpL_PxlStride = src->UdpW_PixelLength; + src->UdpL_ScnStride = src->UdpL_PxlStride * src->UdpL_PxlPerScn; + src->UdpL_ArSize = src->UdpL_ScnStride * src->UdpL_ScnCnt; + src->UdpA_Base = NULL; + src->UdpL_Pos = 0; + src->UdpL_CompIdx = srcudp->UdpL_CompIdx; + src->UdpL_Levels = srcudp->UdpL_Levels; + status = DdxConvert_( srcudp, src, XieK_MoveMode ); + if( status != Success ) goto clean_up; + } + + if(dstudp->UdpB_DType == UdpK_DTypeBU || dstudp->UdpB_DType == UdpK_DTypeWU) + dst = dstudp; + else + { /* + ** Convert output data buffer to our "prefered" format. + */ + dst = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( dst == NULL ) + { + status = BadAlloc; + goto clean_up; + } + dst->UdpW_PixelLength = dstudp->UdpL_Levels > 256 ? 8 * sizeof(short) + : 8 * sizeof(char); + dst->UdpB_DType = dstudp->UdpL_Levels > 256 ? UdpK_DTypeWU + : UdpK_DTypeBU; + dst->UdpB_Class = UdpK_ClassA; + dst->UdpL_X1 = dstudp->UdpL_X1; + dst->UdpL_X2 = dstudp->UdpL_X2; + dst->UdpL_Y1 = dstudp->UdpL_Y1; + dst->UdpL_Y2 = dstudp->UdpL_Y2; + dst->UdpL_PxlPerScn = dstudp->UdpL_PxlPerScn; + dst->UdpL_ScnCnt = dstudp->UdpL_ScnCnt; + dst->UdpL_PxlStride = dst->UdpW_PixelLength; + dst->UdpL_ScnStride = dst->UdpL_PxlStride * dst->UdpL_PxlPerScn; + dst->UdpL_ArSize = dst->UdpL_ScnStride * dst->UdpL_ScnCnt; + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + dst->UdpL_Pos = 0; + dst->UdpL_CompIdx = dstudp->UdpL_CompIdx; + dst->UdpL_Levels = dstudp->UdpL_Levels; + if( dst->UdpA_Base == NULL ) + { + status = BadAlloc; + goto clean_up; + } + } + /* + ** Allocate error buffers + */ + errbuf[0] = (double *) DdxCalloc_(dst->UdpL_PxlPerScn+2,sizeof(double)); + errbuf[1] = (double *) DdxCalloc_(dst->UdpL_PxlPerScn+2,sizeof(double)); + + if( errbuf[0] == NULL || errbuf[1] == NULL ) + status = BadAlloc; + else + DitherProcess( src, dst, errbuf[0], errbuf[1], &curerr ); + +clean_up : + if( IsPointer_(errbuf[0]) ) + DdxFree_(errbuf[0]); + if( IsPointer_(errbuf[1]) ) + DdxFree_(errbuf[1]); + + if( IsPointer_(src) && src != srcudp ) + { + if( IsPointer_(src->UdpA_Base) ) + DdxFreeBits_(src->UdpA_Base); + DdxFree_(src); + } + if( IsPointer_(dst) && dst != dstudp ) + { + if( status == Success ) + status = DdxConvert_( dst, dstudp, XieK_MoveMode ); + if( IsPointer_(dst->UdpA_Base) ) + DdxFreeBits_(dst->UdpA_Base); + DdxFree_(dst); + } + return( status ); +} /* end of SmiDither */ + +/***************************************************************************** +** DitherProcess +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +*****************************************************************************/ +static void DitherProcess(src, dst, err0, err1, erridx) +UdpPtr src; +UdpPtr dst; +double *err0; +double *err1; +int *erridx; +{ + int pix, scn, dtypes; + int src_bytes_per_scn, src_bytes_per_pxl; + int dst_bytes_per_scn, dst_bytes_per_pxl; + double *errbuf[2], *curerr, *prverr, nompxlrng, modpxlval; + unsigned char BUpxlval, *dstptr, *srcptr; + unsigned short WUpxlval; + + errbuf[0] = err0; + errbuf[1] = err1; + + nompxlrng = (double)(src->UdpL_Levels - 1) / (double)(dst->UdpL_Levels - 1); + + src_bytes_per_scn = src->UdpL_ScnStride / 8; + dst_bytes_per_scn = dst->UdpL_ScnStride / 8; + src_bytes_per_pxl = src->UdpL_PxlStride / 8; + dst_bytes_per_pxl = dst->UdpL_PxlStride / 8; + /* + ** Figure out what Dtype combination we have. + */ + dtypes = src->UdpB_DType == dst->UdpB_DType + ? src->UdpB_DType == UdpK_DTypeBU ? 0 /* BytByt */ : 1 /* WrdWrd */ + : src->UdpB_DType == UdpK_DTypeBU ? 2 /* BytWrd */ : 3 /* WrdByt */; + + for( scn = 0; scn < dst->UdpL_ScnCnt; scn++ ) + { + curerr = errbuf[*erridx] + 1; + prverr = errbuf[(*erridx + 1) & 1] + 1; + + srcptr = src->UdpA_Base + src_bytes_per_scn * scn + src->UdpL_Pos / 8; + dstptr = dst->UdpA_Base + dst_bytes_per_scn * scn + dst->UdpL_Pos / 8; + + switch( dtypes ) + { /* dither a scanline */ + case 0 : /* BytByt */ + for( pix = 0; pix < dst->UdpL_PxlPerScn; pix++ ) + { + modpxlval = *((unsigned char *)srcptr) + F7_16 * (*(curerr-1)) + + F1_16 * (*(prverr-1)) + + F5_16 * (*(prverr)) + + F3_16 * (*(prverr+1)); + BUpxlval = (modpxlval + nompxlrng/2)/nompxlrng; + *curerr = modpxlval - (BUpxlval * nompxlrng); + *((unsigned char *)dstptr) = BUpxlval; + srcptr += src_bytes_per_pxl; + dstptr += dst_bytes_per_pxl; + curerr++; + prverr++; + } + break; + + case 1 : /* WrdWrd */ + for( pix = 0; pix < dst->UdpL_PxlPerScn; pix++ ) + { + modpxlval = *((unsigned short *)srcptr) + F7_16 * (*(curerr-1)) + + F1_16 * (*(prverr-1)) + + F5_16 * (*(prverr)) + + F3_16 * (*(prverr+1)); + WUpxlval = (modpxlval + nompxlrng/2)/nompxlrng; + *curerr = modpxlval - (WUpxlval * nompxlrng); + *((unsigned short *)dstptr) = WUpxlval; + srcptr += src_bytes_per_pxl; + dstptr += dst_bytes_per_pxl; + curerr++; + prverr++; + } + break; + + case 2 : /* BytWrd */ + for( pix = 0; pix < dst->UdpL_PxlPerScn; pix++ ) + { + modpxlval = *((unsigned char *)srcptr) + F7_16 * (*(curerr-1)) + + F1_16 * (*(prverr-1)) + + F5_16 * (*(prverr)) + + F3_16 * (*(prverr+1)); + WUpxlval = (modpxlval + nompxlrng/2)/nompxlrng; + *curerr = modpxlval - (WUpxlval * nompxlrng); + *((unsigned short *)dstptr) = WUpxlval; + srcptr += src_bytes_per_pxl; + dstptr += dst_bytes_per_pxl; + curerr++; + prverr++; + } + break; + + case 3 : /* WrdByt */ + for( pix = 0; pix < dst->UdpL_PxlPerScn; pix++ ) + { + modpxlval = *((unsigned short *)srcptr) + F7_16 * (*(curerr-1)) + + F1_16 * (*(prverr-1)) + + F5_16 * (*(prverr)) + + F3_16 * (*(prverr+1)); + BUpxlval = (modpxlval + nompxlrng/2)/nompxlrng; + *curerr = modpxlval - (BUpxlval * nompxlrng); + *((unsigned char *)dstptr) = BUpxlval; + srcptr += src_bytes_per_pxl; + dstptr += dst_bytes_per_pxl; + curerr++; + prverr++; + } + } + *erridx = (*erridx + 1) & 1; + } +} /* end of DitherProcess */ +/* end of module SmiDither.c */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiDither.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiDither.h new file mode 100644 index 0000000..dcdf2d7 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiDither.h @@ -0,0 +1,128 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the DITHER pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.0 +** RISC ULTRIX V3.0 +** +** AUTHOR(S): +** +** John Weber +** +** CREATION DATE: +** +** February 12, 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMIDITHER +#define _SMIDITHER + +/* +** Include files +*/ +#include + + /* + ** Function reference + */ +int SmiDither(); +int SmiCreateDither(); + +/* +** Structure definitions and Typedefs +*/ + +/* +** Dither pipeline context block. +*/ +typedef struct _DitherPipeCtx { + PipeElementCommonPart common; + struct _DitherPart { + PipeSinkPtr srcsnk; + PipeSinkPtr dstsnk; + PipeDrainPtr srcdrn; + double *errbuf[XieK_MaxComponents]; + double *errnxt; + } DitherPart; +} DitherPipeCtx, *DitherPipeCtxPtr; + +/* +** MACRO definitions +*/ + +/* +** Pipeline context, Dither part, access MACROs +*/ +#define DtrSrcDrn_(ctx) (((DitherPipeCtxPtr)(ctx))->DitherPart.srcdrn) +#define DtrErrBuf_(ctx,i) (((DitherPipeCtxPtr)(ctx))->DitherPart.errbuf[i]) +#define DtrNxtErr_(ctx) (((DitherPipeCtxPtr)(ctx))->DitherPart.errnxt) +/* +** Dither Parameters +*/ +#define DtrSrcSnk_(ctx) (((DitherPipeCtxPtr)(ctx))->DitherPart.srcsnk) +#define DtrDstSnk_(ctx) (((DitherPipeCtxPtr)(ctx))->DitherPart.dstsnk) + +#endif +/* _SMIDITHER */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiEncodeDct.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiEncodeDct.c new file mode 100644 index 0000000..e623840 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiEncodeDct.c @@ -0,0 +1,2110 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains the interface to the DCT compressesion routines. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHORS: +** +** John Nadai +** John Weber +** +** CREATION DATE: +** +** April 5, 1990 +** +*******************************************************************************/ + +/* +** INCLUDE FILES +*/ +#include +#include + +#if defined(XIESMI) +#include "SmiEncodeDct.h" +#include "SmiDctMacros.h" +#elif defined(IPS) +#include +#include +#include +#include +#include +#include +#endif + +/* +** Table of Contents +*/ +#if defined(XIESMI) +unsigned long SmiEncodeDct(); /* External XIE entries */ +#elif defined(IPS) +long _IpsEncodeDct(); /* External IPS entries */ +#endif + +#if defined(XIESMI) +int SmiCreateEncodeDct(); +static int _EncodeDctInitialize(); +static int _EncodeDctActivate(); +static int _EncodeDctFlush(); +static int _EncodeDctAbort(); +static int _EncodeDctDestroy(); +static int _EncodeDctFreeData(); +#endif + +static unsigned long DceEncodeSegment(); +static EncodeDctStatePtr DceInitializeState(); +static EncodeDctStatePtr DceDestroyState(); + +static int DceNextToken(); +static int DceEncodeData(); + +static int DceLenDat(); +static int DceLenRSC(); +static int DceLenSOI(); +static int DceLenSOF(); +static int DceLenSOS(); +static int DceLenEOI(); + +static int DceActDat(); +static int DceActRSC(); +static int DceActSOI(); +static int DceActSOF(); +static int DceActSOS(); +static int DceActEOI(); + +static void DcePadData(); +static void Dce8x8_8U_16S() ; + +static int DctCreateScaledQuant(); +static int DctRstEnable(); +static int DctEncode(); +static int DctPutBits(); + +/* +** Local MACROS +*/ + /* + ** Put a 16 bit value into the code stream, LSB first. + */ +#define PutShort_(ptr,value) \ + *(ptr)++ = (value) & 0xFF; \ + *(ptr)++ = ((value) >> 8) &0xFF; + +/* ZIGZAG_QUANT MACRO + + Inputs: > 16-bit signed, UNquantized DCT coefficients + > organized as sequence of blocks (within blocks, the + coefficients stored by rows) + + Outputs: > 16-bit signed, quantized DCT coefficients + > organized as sequence of blocks (within blocks, the + coefficients stored in zigzag order) + +*/ + +#define ZQ_VARIABLES \ +\ +double d_dtemp ;\ +short int *d_in_ptr,*d_out_ptr,*d_z_ptr;\ +unsigned char *d_q_ptr ;\ +int d_i ; + +#define ZIGZAG_QUANT(IN_PT,OUT_PT,Z_PT,Q_PT) \ + d_in_ptr = (short int *)(IN_PT) ;\ + d_out_ptr = (short int *)(OUT_PT) ;\ + d_q_ptr = (unsigned char *)(Q_PT) ;\ + d_z_ptr = (short int *)(Z_PT) ;\ + for( d_i=0 ; d_i<=63 ; d_i++ )\ + {\ + d_dtemp = \ + (double)(*(d_in_ptr+(*d_z_ptr++)))/(double)(*d_q_ptr++);\ + *d_out_ptr++ = \ + (d_dtemp<0.) ? (int)(d_dtemp-.5) : (int)(d_dtemp+.5) ;\ + } + +/* +** Static storage +*/ + /* + ** EncodeDct Element Vector + */ +#if defined(XIESMI) +static PipeElementVector EncodeDctPipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeEncodeDctElement, /* Structure subtype */ + sizeof(EncodeDctPipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _EncodeDctInitialize, /* Initialize entry */ + _EncodeDctActivate, /* Activate entry */ + _EncodeDctFlush, /* Flush entry */ + _EncodeDctDestroy, /* Destroy entry */ + _EncodeDctAbort /* Abort entry */ + }; +#endif + + /* + ** Token length table. + */ +static int (*token_length[DctK_TokenMax])() = { + NULL, /* None */ + DceLenSOI, /* SOI */ + DceLenSOF, /* SOF */ + DceLenSOS, /* SOS */ + DceLenDat, /* Data */ + DceLenRSC, /* RSC */ + DceLenEOI, /* EOI */ + NULL /* Error */ +}; +static int (*token_action[DctK_TokenMax])() = { + NULL, /* None */ + DceActSOI, /* SOI */ + DceActSOF, /* SOF */ + DceActSOS, /* SOS */ + DceActDat, /* Data */ + DceActRSC, /* RSC */ + DceActEOI, /* EOI */ + NULL /* Error */ +}; + +/***************************************************************************** +** SmiEncodeDct +** +** FUNCTIONAL DESCRIPTION: +** +** Image data is encoded using the DCT data compression scheme. +** +** FORMAL PARAMETERS: +** +** udplst - pointer to image data to be compressed. +** udpcnt - number of components in udplst. +** cdp - pointer to resulting compressed image data plane. +** factor - compression factor to be used to encode image. +** resync - enable generation of resync markers. +** size_ret - where to return size of compressed data +** +** FUNCTION VALUE: +** +** status +** +*****************************************************************************/ +#if defined(XIESMI) +unsigned long SmiEncodeDct(udplst,udpcnt,cdp,factor,resync,size_ret) +#elif defined(IPS) +long _IpsEncodeDct(udplst,udpcnt,cdp,factor,resync,size_ret) +#endif +UdpPtr udplst[]; +int udpcnt; +UdpPtr cdp; +unsigned long factor; +unsigned long resync; +int *size_ret; +{ + long status; + long bytcnt; + long output_bytcnt; + long i,j,k; + long width; + long height; + long mem_alloc = FALSE; + EncodeDctStatePtr state; + + *size_ret = 0; + /* + ** Check DCT compression factor. + */ + if( factor < 5 || factor > 200 ) + return( DctX_BadFactor ); + /* + ** Check input UDP fields + ** Calculate worst case compressed data buffer size. + */ + for( output_bytcnt = 0, i = 0; i < udpcnt; i++ ) + { + if( udplst[i]->UdpB_Class != UdpK_ClassA || + udplst[i]->UdpB_DType != UdpK_DTypeBU ) + return( DctX_UnsOption ); + width = (udplst[i]->UdpL_PxlPerScn + 7) & ~7; + height = (udplst[i]->UdpL_ScnCnt + 7) & ~7; + output_bytcnt += width * height * (20.0 / (float)factor) + 3200; + } +#if defined(IPS) + if( cdp->UdpA_Base != NULL && cdp->UdpL_ArSize / 8 < output_bytcnt ) + return( DctX_OutBufSiz ); +#endif + /* + ** If error during initialization, return to caller. + */ + state = DceInitializeState( udplst, udpcnt ); + if( state == NULL ) return( DctX_BadAlloc ); + /* + ** Check CDP...if buffer not allocated, allocate a worst case size. + */ + if( cdp->UdpA_Base == NULL ) + { +#if defined(IPS) + *cdp = *udplst[0]; + cdp->UdpL_Pos = 0; +#endif + cdp->UdpL_ArSize = output_bytcnt * 8; + cdp->UdpA_Base = (unsigned char *) DctMallocBits_(output_bytcnt*8); + if( cdp->UdpA_Base == NULL ) + { + DceDestroyState(state); + return DctX_BadAlloc; + } + mem_alloc = TRUE; + } +#if defined(IPS) + else + { + i = (long)cdp->UdpL_ArSize; + j = (long)cdp->UdpA_Base; + k = (long)cdp->UdpL_Pos; + *cdp = *udplst[0]; + /* Adjust fields */ + cdp->UdpL_ArSize = (unsigned long)i; + cdp->UdpA_Base = (unsigned char *)j; + cdp->UdpL_Pos = (unsigned long)k; + } + cdp->UdpB_Class = UdpK_ClassUBS; + cdp->UdpB_DType = UdpK_DTypeVU; + cdp->UdpL_X1 = 0; + cdp->UdpL_Y1 = 0; + cdp->UdpL_X2 = cdp->UdpL_PxlPerScn - 1; + cdp->UdpL_Y2 = cdp->UdpL_ScnCnt - 1; +#endif + /* + ** Setup custom quantization tables based on default quantization tables + ** scaled by "factor". + */ + if( (status = DctCreateScaledQuant(state,0,0,factor)) != DctX_Success ) + { + DceDestroyState(state); + return status; + } + /* + ** Enable resync codes if requested. + */ + if( resync ) + DctRstEnable(state); + /* + ** Setup destination buffer. + */ + DceCurPtr_(state) = cdp->UdpA_Base; + DceCurLen_(state) = cdp->UdpL_ArSize / 8; + DceCurRem_(state) = DceCurLen_(state); + /* + ** Encode the data. + */ + status = DceEncodeSegment( state, udplst, udpcnt ); + bytcnt = DceCurLen_(state) - DceCurRem_(state); + + DceDestroyState(state); + + if( status != DctK_StatusDone ) + { +#if defined(XIESMI) + if( status > DctK_StatusDone ) + return( status ); + else if( status == DctK_StatusOutput ) + return( DctX_Success ); + else +#endif + return( DctX_EncodeFail ); + } + /* + ** reallocate memory if allocated from inside... + */ + if( mem_alloc ) + { + cdp->UdpL_ArSize = bytcnt * 8; + cdp->UdpA_Base = DctReallocBits_(cdp->UdpA_Base, cdp->UdpL_ArSize); + } + *size_ret = bytcnt * 8; + + return DctX_Success; +} + +/***************************************************************************** +** SmiCreateEncodeDct +** +** FUNCTIONAL DESCRIPTION: +** +** This function creates the ENCODE DCT pipeline element +** +** FORMAL PARAMETERS: +** +** pipe - pipeline pointer +** srcsnk - the sink from which to read PCM data +** cmpcnt - number of components in sink. +** dstudp - pointer to destination Udps for DCT data +** factor - compression factor +** final - pointer to flag to set when finished +** +*****************************************************************************/ +#if defined(XIESMI) +int SmiCreateEncodeDct(pipe,srcsnk,cmpmsk,dstudp,factor,final) + Pipe pipe; + PipeSinkPtr srcsnk; + int cmpmsk; + UdpPtr dstudp; + int factor; + unsigned int *final; +{ + int i; + /* + ** Create pipe element context block. + */ + EncodeDctPipeCtxPtr ctx = (EncodeDctPipeCtxPtr) + DdxCreatePipeCtx_( pipe, &EncodeDctPipeElement, FALSE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + /* + ** Build our EncodeDct Pipe Ctx from the arguments passed in. + */ + DceSrcSnk_(ctx) = srcsnk; + DceDstUdp_(ctx) = dstudp; + DceFinal_(ctx) = final; + DceCmpMsk_(ctx) = cmpmsk; + DceCmpFct_(ctx) = factor; + *final &= ~(cmpmsk); + /* + ** Create drains. + */ + for (i = 0; i < XieK_MaxComponents ; i++) + if( 1<UdpL_ArSize = 0; + DceCurLen_(DceSteBlk_(ctx)) = bytcnt - DceDstUdp_(ctx)->UdpL_Pos / 8; + DceCurRem_(DceSteBlk_(ctx)) = DceCurLen_(DceSteBlk_(ctx)); + DceCurPtr_(DceSteBlk_(ctx)) = DceDstUdp_(ctx)->UdpA_Base + + DceDstUdp_(ctx)->UdpL_Pos / 8; + + return( DctX_Success ); +} /* end _EncodeDctInitialize */ +#endif + +/***************************************************************************** +** _EncodeDctActivate +** +** FUNCTIONAL DESCRIPTION: +** +** This routine performs DCT compression on a segment of the image. +** +** FORMAL PARAMETERS: +** +** ctx - encode DCT pipeline element context +** +*****************************************************************************/ +#if defined(XIESMI) +static int _EncodeDctActivate(ctx) + EncodeDctPipeCtxPtr ctx; +{ + UdpPtr dst = DceDstUdp_(ctx); + UdpPtr udplst[XieK_MaxComponents]; + int udpcnt; + int i; + int status; + int bits; + + if( DceDstUdp_(ctx)->UdpA_Base == NULL ) + { + bits = DceDstUdp_(ctx)->UdpL_Pos + DceCurRem_(DceSteBlk_(ctx)) * 8; + DceDstUdp_(ctx)->UdpA_Base = DctMallocBits_(bits); + if( DceDstUdp_(ctx)->UdpA_Base == NULL ) return( DctX_BadAlloc ); + DceCurPtr_(DceSteBlk_(ctx)) = DceDstUdp_(ctx)->UdpA_Base + + DceDstUdp_(ctx)->UdpL_Pos / 8; + } + + for(status = DctX_Success; status == DctX_Success; _EncodeDctFreeData(ctx)) + { + for( i = 0, udpcnt = 0; i < XieK_MaxComponents; i++ ) + /* + ** Read a quantum worth of data on each drain. + */ + if( 1< DceCurRem_(state)) + return DctK_StatusOutput; + /* + ** Call action routine....if good return, then update next token + ** else return with current status. + */ + status = (*token_action[nxttok])(state,udplst,udpcnt); + if (status == DctK_StatusContinue) + DceCurTok_(state) = nxttok; + else + return status; + } +} + +/***************************************************************************** +** DceInitializeState +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +** Address of state block or +** NULL on error (one of): +** BadAlloc +** +*****************************************************************************/ +static EncodeDctStatePtr DceInitializeState( udplst, udpcnt ) +UdpPtr udplst[]; +int udpcnt; +{ + int i; + int c; + int xmin; /* Minimum width */ + int xmax; /* Maximum width */ + int ymin; /* Minimum height */ + int ymax; /* Maximum height */ + char iscd; /* Boolean, is a common denominator */ + int gcd; /* Greatest common denominator */ + + EncodeDctStatePtr state = + (EncodeDctStatePtr) DctCalloc_(1,sizeof(EncodeDctStateRec)); + /* + ** If allocation error, return now. + */ + if( state == NULL ) return NULL; + + DceCmpCnt_(state) = udpcnt; + /* + ** Setup default tables. + */ + DceHacTbl_(state,0) = &DctR_AcEncodeTable[0]; + DceHacTbl_(state,1) = &DctR_AcEncodeTable[1]; + DceHdcTbl_(state,0) = &DctR_DcEncodeTable[0]; + DceHdcTbl_(state,1) = &DctR_DcEncodeTable[1]; + + DceQntTbl_(state,0) = &DctR_QuantDefault[0]; + DceQntDef_(state,0) = TRUE; + DceQntTbl_(state,1) = &DctR_QuantDefault[1]; + DceQntDef_(state,1) = TRUE; + /* + ** Set frame dimensions to match udp[0] + */ + DceFrmWid_(state) = udplst[0]->UdpL_PxlPerScn; + DceFrmHgt_(state) = udplst[0]->UdpL_ScnCnt; + /* + ** Initialize "per-component" information. + ** NOTE : Default tables are 0, so no explicit initialization required. + */ + for( i = 0; i < DceCmpCnt_(state); i++ ) + DceSrcUdp_(state,i) = *udplst[i]; + /* + ** For multiple components, calculate relative subsampling within scans... + */ + if( DceCmpCnt_(state) > 1 ) + { + xmin = DceCmpWid_(state,0); + ymin = DceCmpHgt_(state,0); + xmax = DceCmpWid_(state,0); + ymax = DceCmpHgt_(state,0); + + for( i = 1; i < DceCmpCnt_(state); i++ ) + { + if( xmin > DceCmpWid_(state,i) ) + xmin = DceCmpWid_(state,i); + if( xmax < DceCmpWid_(state,i) ) + xmax = DceCmpWid_(state,i); + if( ymin > DceCmpHgt_(state,i) ) + ymin = DceCmpWid_(state,i); + if( ymin < DceCmpHgt_(state,i) ) + ymax = DceCmpWid_(state,i); + } + /* + ** Find greatest common denominator for horizontal dimensions. + */ + for( i = 1, gcd = 1; i <= xmin; i++ ) + for( c = 0, iscd = TRUE; c < DceCmpCnt_(state); c++ ) + { + if( DceCmpWid_(state,c) % i != 0 ) + { + iscd = FALSE; + break; + } + if( iscd ) + gcd = i; + } + /* + ** Determine the horizontal sampling rates based on GCD. + */ + for( c = 0; c < DceCmpCnt_(state); c++ ) + DceCmpHrz_(state,c) = DceCmpWid_(state,c) / gcd; + /* + ** Find greatest common denominator for vertical dimensions. + */ + for( i = 1, gcd = 1; i <= ymin; i++ ) + for( c = 0, iscd = TRUE; c < DceCmpCnt_(state); c++ ) + { + if( DceCmpHgt_(state,c) % i != 0 ) + { + iscd = FALSE; + break; + } + if( iscd ) + gcd = i; + } + /* + ** Determine the vertical sampling rates based on GCD. + */ + for( c = 0; c < DceCmpCnt_(state); c++ ) + DceCmpVrt_(state,c) = DceCmpHgt_(state,c) / gcd; + } + else + { + DceCmpVrt_(state,0) = 1; + DceCmpHrz_(state,0) = 1; + } + /* + ** Assuming restarts are disabled, calculate restart interval to be + ** entire image. + */ + DceRstInt_(state) = + ((DceCmpHgt_(state,0)+(8*DceCmpVrt_(state,0)-1))/(8*DceCmpVrt_(state,0)))* + ((DceCmpWid_(state,0)+(8*DceCmpHrz_(state,0)-1))/(8*DceCmpHrz_(state,0))); + + return( state ); +} + +/***************************************************************************** +** DceDestroyState +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static EncodeDctStatePtr DceDestroyState( state ) + EncodeDctStatePtr state; +{ + int i; + +#if defined(XIESMI) + if( !IsPointer_(state) ) return( NULL ); +#endif + /* + ** Free any "non-default" quantization tables. + */ + for (i = 0; i < DctK_MaxQuantTables; i++) +#if defined(XIESMI) + if ((!DceQntDef_(state,i)) && (IsPointer_(DceQntTbl_(state,i)))) +#elif defined(IPS) + if ((!DceQntDef_(state,i)) && (DceQntTbl_(state,i) != NULL)) +#endif + DctFree_(DceQntTbl_(state,i)); + + DctFree_(state); + + return( NULL ); +} + +/***************************************************************************** +** DceNextToken +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int DceNextToken(state) +EncodeDctStatePtr state; +{ + int next_token; + UdpPtr udp; + + switch (DceCurTok_(state)) + { + case DctK_TokenNone: + next_token = DctK_TokenSOI; + break; + + case DctK_TokenSOI: + next_token = DctK_TokenSOF; + break; + + case DctK_TokenSOF: + next_token = DctK_TokenSOS; + break; + + case DctK_TokenSOS: + if (DceRstEnb_(state)) + next_token = DctK_TokenRSC; + else + next_token = DctK_TokenData; + break; + + case DctK_TokenData: + udp = &DceSrcUdp_(state,0); + + if (DceCurY_(state,0) > DceSrcUdp_(state,0).UdpL_Y2) + next_token = DctK_TokenEOI; + else if (DceEndFrm_(state)) + next_token = DctK_TokenSOF; + else if (DceRstEnb_(state)) + next_token = DctK_TokenRSC; + else + next_token = DctK_TokenData; + break; + + case DctK_TokenRSC: + next_token = DctK_TokenData; + break; + + default: + next_token = DctK_TokenError; + } + return next_token; +} + +/***************************************************************************** +** DceLenDat +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int DceLenDat(state) +EncodeDctStatePtr state; +{ + /* WORST CASE COMPRESSED DATA LENGTH ?? */ + return 0; +} + +/***************************************************************************** +** DceLenRSC +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int DceLenRSC(state) +EncodeDctStatePtr state; +{ + return DctK_LenFixedRSC; +} + +/***************************************************************************** +** DceLenSOI +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int DceLenSOI(state) +EncodeDctStatePtr state; +{ + return DctK_LenFixedSOI; +} + +/***************************************************************************** +** DceLenSOF +** +** FUNCTIONAL DESCRIPTION: +** +** Returns the size of the Start of Frame token. The size is the sum of: +** +** 1) The marker code and fixed size header information. +** 2) "per component" information, one block per component. +** 3) Quantization table assignments. One byte for every two components. +** 4) Quantization tables, 1 byte for table specifier plus table data +** for each table, followed by a one byte terminator (0x80 value); +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int DceLenSOF(state) +EncodeDctStatePtr state; +{ + int quant_cnt = 0; + int i; + + for (i = 0; i < DctK_MaxQuantTables; i++) + if (DceQntTbl_(state,i) != NULL && !DceQntDef_(state,i)) + quant_cnt++; + + return DctK_LenFixedSOF + + DceCmpCnt_(state) * DctK_LenPerCmpSOF + + (DceCmpCnt_(state) + 1) / 2 + + quant_cnt * (sizeof(QuantTable) + 1) + 1; +} + +/***************************************************************************** +** DceLenSOS +** +** FUNCTIONAL DESCRIPTION: +** +** Returns the length of the Start of Scan marker. Value includes the sum +** of : +** +** 1) Marker and fixed size header information. +** 2) Per component huffman specifiers. +** 3) User defined huffman tables (not supported), so only need room for +** one byte terminator (0x80). +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int DceLenSOS(state) +EncodeDctStatePtr state; +{ + return DctK_LenFixedSOS + + DceCmpCnt_(state) * DctK_LenPerCmpSOS + +/* +** Private huffman tables not supported +** DceHufCnt_(state) * (sizeof(HuffTable) + 1) + 1; +*/ + 1; +} + +/***************************************************************************** +** DceLenEOI +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int DceLenEOI(state) +EncodeDctStatePtr state; +{ + return DctK_LenFixedEOI; +} + +/***************************************************************************** +** DceActDat +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int DceActDat(state,udplst,udpcnt) +EncodeDctStatePtr state; +UdpPtr udplst[]; +int udpcnt; +{ + int length; + int mducnt; + int scncnt; + int lstscn; + /* + ** Make sure there's enough data to encode the next bunch-o-MDUs. + ** + ** Start by calculating how many MDU will remain after the current scan. + */ + mducnt = DceRstInt_(state) - + ((DceCmpWid_(state,0) - DceCurX_(state,0)) + + (DctK_BlockSize * DceCmpHrz_(state,0) - 1)) / + (DctK_BlockSize * DceCmpHrz_(state,0)); + /* + ** Now, compute how many total scanlines will be required. + */ + scncnt = mducnt <= 0 ? + DctK_BlockSize : + mducnt / + ((DceCmpWid_(state,0) + + (DctK_BlockSize * DceCmpHrz_(state,0) - 1)) / + (DctK_BlockSize * DceCmpHrz_(state,0))); + /* + ** Figure last "legal" input scan as Y2 or Y2 rounded to next block if + ** padding at end of image. + */ + lstscn = (DceCurY_(state,0) + scncnt) > DceCmpHgt_(state,0) ? + DceSrcUdp_(state,0).UdpL_Y2 : + DceCurY_(state,0) + scncnt - 1; + /* + ** If current segment doesn't have data we need, return for more. + */ + if ((udplst[0]->UdpL_Y1 > DceCurY_(state,0)) || (udplst[0]->UdpL_Y2 < lstscn)) + return DctK_StatusInput; + /* + ** Encode data buffers. + */ + length = DceEncodeData(state, + udplst, + udpcnt, + DceCurPtr_(state), + DceCurRem_(state)); + /* + ** Update output pointers... + */ + DceCurPtr_(state) += length; + DceCurRem_(state) -= length; + /* + ** Return goodness... + */ + return DctK_StatusContinue; +} + +/***************************************************************************** +** DceActRSC +** +** FUNCTIONAL DESCRIPTION: +** +** Write out a resync marker code. There are eight possible values...we +** increment the low three bits of the marker code as we go. +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int DceActRSC(state,udplst,udpcnt) +EncodeDctStatePtr state; +UdpPtr udplst[]; +int udpcnt; +{ + int i; + + *(DceCurPtr_(state))++ = DctK_Marker; + *(DceCurPtr_(state))++ = DctK_MarkerRSC + (DceRstCnt_(state)++ & 0x7); + + DceCurRem_(state) -= DctK_LenFixedRSC; + /* + ** Reset DC predictor + */ + for (i = 0; i < DceCmpCnt_(state); i++) + { + DceCmpPdc_(state,i) = 0; + } + + return DctK_StatusContinue; +} + +/***************************************************************************** +** DceActSOI +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int DceActSOI(state,udplst,udpcnt) +EncodeDctStatePtr state; +UdpPtr udplst[]; +int udpcnt; +{ + *(DceCurPtr_(state))++ = DctK_Marker; + *(DceCurPtr_(state))++ = DctK_MarkerSOI; + + DceCurRem_(state) -= DctK_LenFixedSOI; + + return DctK_StatusContinue; +} + +/***************************************************************************** +** DceActSOF +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int DceActSOF(state,udplst,udpcnt) +EncodeDctStatePtr state; +UdpPtr udplst[]; +int udpcnt; +{ + unsigned char *ptr = DceCurPtr_(state); + unsigned char *lenptr; + int i; + short length; + /* + ** Write marker code and save room to write data length. + */ + *ptr++ = DctK_Marker; + *ptr++ = DctK_MarkerSOF; + lenptr = ptr; ptr += 2; + /* + ** Frame information... + */ + *ptr++ = DctK_Mode; + *ptr++ = DctK_Precision; + PutShort_(ptr,DceFrmHgt_(state)); + PutShort_(ptr,DceFrmWid_(state)); + PutShort_(ptr,DceRstInt_(state)); + /* + ** Per component information... + */ + *ptr++ = DceCmpCnt_(state); + for (i = 0; i < DceCmpCnt_(state); i++) + { + *ptr++ = DceCmpIdx_(state,i); + *ptr++ = (DceCmpHrz_(state,i) << 4) + DceCmpVrt_(state,i); + } + /* + ** Per component quantization table assignments. + */ + *ptr = '\0'; /* Note : even though an extra byte may be */ + *(ptr + 1) = '\0'; /* zeroed, it shouldn't matter since the */ + /* terminating 0x80 must be written anyway. */ + switch (DceCmpCnt_(state)) + { + case 4: *(ptr + 1) = DceCmpQnt_(state,3) << 4; + case 3: *(ptr + 1) |= DceCmpQnt_(state,2) & 0xF; + case 2: *ptr = DceCmpQnt_(state,1) << 4; + case 1: *ptr |= DceCmpQnt_(state,0) & 0xF; + break; + default: + return DctK_StatusError; + } + ptr += ((DceCmpCnt_(state) + 1) / 2); + /* + ** Non-default quantization tables. + */ + for (i = 0; i < DctK_MaxQuantTables; i++) + if (DceQntTbl_(state,i) != NULL && !DceQntDef_(state,i)) + { + *ptr++ = i; + memcpy(ptr,DceQntTbl_(state,i),sizeof(QuantTable)); + ptr += sizeof(QuantTable); + } + *ptr++ = 0x80; + + length = ptr - lenptr; + PutShort_(lenptr,length); + + DceCurRem_(state) -= ptr - DceCurPtr_(state); + DceCurPtr_(state) = ptr; + + return DctK_StatusContinue; +} + +/***************************************************************************** +** DceActSOS +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int DceActSOS(state,udplst,udpcnt) +EncodeDctStatePtr state; +UdpPtr udplst[]; +int udpcnt; +{ + unsigned char *ptr = DceCurPtr_(state); + unsigned char *lenptr; + int i; + short length; + /* + ** Write marker code, save room for length. + */ + *ptr++ = DctK_Marker; + *ptr++ = DctK_MarkerSOS; + lenptr = ptr; ptr += 2; + + *ptr++ = 0; /* Component ID, always 0...if data wasn't */ + /* interleaved, this would be the component */ + /* index in this scan. */ + /* + ** Huffman table assignments. + */ + for (i = 0; i < DceCmpCnt_(state); i++) + { + *ptr++ = (DceCmpHac_(state,i) << 4) + DceCmpHdc_(state,i); + } + /* + ** Download custom huffman tables...not supported. + */ + *ptr++ = 0x80; + /* + ** Store length of data in field. + */ + length = ptr - lenptr; + PutShort_(lenptr,length); + /* + ** Update pointers. + */ + DceCurRem_(state) -= ptr - DceCurPtr_(state); + DceCurPtr_(state) = ptr; + + return DctK_StatusContinue; +} + +/***************************************************************************** +** DceActEOI +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int DceActEOI(state,udplst,udpcnt) +EncodeDctStatePtr state; +UdpPtr udplst[]; +int udpcnt; +{ + *(DceCurPtr_(state))++ = DctK_Marker; + *(DceCurPtr_(state))++ = DctK_MarkerEOI; + DceCurRem_(state) -= DctK_LenFixedEOI; + + return DctK_StatusDone; +} + +/***************************************************************************** +** DceEncodeData +** +** FUNCTIONAL DESCRIPTION: +** +** This routine encodes a segment of data equivalent to the number of +** MDUs in a restart interval. +** +** The data must be padded out to modulo 8 pixels per scanline and +** scanline count. +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int DceEncodeData(state,udplst,udpcnt,outptr,outlen) +EncodeDctStatePtr state; +UdpPtr udplst[]; +int udpcnt; +unsigned char *outptr; +int outlen; +{ + ZQ_VARIABLES + + unsigned char *scnptr; + unsigned char *pxlptr; + UdpPtr udp; + + int i; + int c; + int h; + int v; + int x; + int y; + + unsigned char tmp[64]; + short int work1[64]; + short int work2[64]; + + int bufoff = 0; + + unsigned char *base[DctK_MaxComponents]; + int pix_stride[DctK_MaxComponents]; + int scn_stride[DctK_MaxComponents]; + /* + ** Do per-component set-up. + */ + for (i = 0; i < DceCmpCnt_(state); i++) + { + udp = udplst[i]; + + scn_stride[i] = udp->UdpL_ScnStride / 8; + pix_stride[i] = udp->UdpL_PxlStride / 8; +#if defined(XIESMI) + base[i] = udp->UdpA_Base + udp->UdpL_Pos / 8; +#elif defined(IPS) + base[i] = (unsigned char *)udp->UdpA_Base + (((udp->UdpL_Pos + + (udp->UdpL_Y1 * udp->UdpL_ScnStride))>>3) + udp->UdpL_X1); +#endif + } + /* + ** For each MDU in this segment. + */ + for (i = 0; i < DceRstInt_(state); i++) + { + /* + ** For each component in the MDU + */ + for (c = 0; c < DceCmpCnt_(state); c++) + { + udp = udplst[c]; + + x = DceCurX_(state,c); + y = DceCurY_(state,c); + + scnptr = base[c] + + (y - udp->UdpL_Y1) * scn_stride[c] + + (x - udp->UdpL_X1) * pix_stride[c]; + /* + ** For each vertical sample... + */ + for (v = 0; v < DceCmpVrt_(state,c); v++) + { + pxlptr = scnptr; + /* + ** For each horizontal sample. + */ + for (h = 0; h < DceCmpHrz_(state,c); h++) + { + /* + ** If there isn't enough source data for this block, pad + ** it out... + */ + if (((x + DctK_BlockSize - 1) > udp->UdpL_X2) || + ((y + DctK_BlockSize - 1) > udp->UdpL_Y2)) + { + /* + ** Calculate remaining rows and columns in image. If + ** greater than 8, copy no more than that. + */ + int srcrow = udp->UdpL_Y2 - y + 1; + int srccol = udp->UdpL_X2 - x + 1; + + if (srcrow > 8) srcrow = 8; + if (srccol > 8) srccol = 8; + /* + ** Pad data into temporary buffer. + */ + DcePadData (pxlptr, /* Source pointer */ + srcrow, /* Source rows */ + srccol, /* Source columns */ + scn_stride[c], /* Scan stride */ + pix_stride[c], /* Pixel stride */ + tmp, /* Dest pointer */ + 8, /* Dest rows */ + 8); /* Dest columns */ + /* + ** Do forward DCT from temporary buffer. + */ + Dce8x8_8U_16S(tmp, /* Data pointer */ + work1, /* Dest pointer */ + 8, /* Data scan str */ + 1); /* Data pixel str */ + } + else + { + /* + ** Do forward DCT directly from source data. + */ + Dce8x8_8U_16S(pxlptr, + work1, + scn_stride[c], + pix_stride[c]); + } + /* + ** Quantize and zigzag order coefficients. + */ +#ifdef __alpha + d_in_ptr = (short int *)(work1) ; + d_out_ptr = (short int *)(work2) ; + d_q_ptr = (unsigned char *)(DceQntTbl_(state,DceCmpQnt_(state,c))) ; + d_z_ptr = (short int *)(DctAW_ZigZag) ; + for( d_i=0 ; d_i<=63 ; d_i++ ) + { + d_dtemp = + (double)(*(d_in_ptr+(*d_z_ptr++)))/(double)(*d_q_ptr++); + *d_out_ptr++ = + (d_dtemp<0.) ? (int)(d_dtemp-.5) : (int)(d_dtemp+.5) ; + } +#else + ZIGZAG_QUANT(work1, + work2, + DctAW_ZigZag, + DceQntTbl_(state,DceCmpQnt_(state,c))); +#endif + /* + ** Do huffman encoding on the result. + */ + bufoff += DctEncode(work2, + DceHdcTbl_(state,DceCmpHdc_(state,c)), + DceHacTbl_(state,DceCmpHac_(state,c)), + &DceCmpPdc_(state,c), + outptr, + outlen, + bufoff); + /* + ** Update pointer to next horizontal sample. + */ + pxlptr += (8 * pix_stride[c]); + x += 8; + } + /* + ** Update pointers to next vertical sample; + */ + scnptr += (8 * scn_stride[c]); + y += 8; + } + /* + ** Update current X,Y location pointers. If at end of scan, reset + ** X pointer and increment Y pointer. + */ + DceCurX_(state,c) += (8 * DceCmpHrz_(state,c)); + if (DceCurX_(state,c) >= DceCmpWid_(state,c)) + { + DceCurX_(state,c) = 0; + DceCurY_(state,c) += (8 * DceCmpVrt_(state,c)); + } + } + if (DceCurY_(state,0) >= DceCmpHgt_(state,0)) + break; + } + return (bufoff + 7) / 8; +} + + +/***************************************************************************** +** DcePadData +** +** FUNCTIONAL DESCRIPTION: +** +** Copies a partial interleave of pixels into a work area and completes a +** whole interleave there by replicating right and bottom pixels. +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ + +static void DcePadData (srcptr,srcrow,srccol,srcsst,srcpst,dstptr,dstrow,dstcol) +unsigned char *srcptr; /* Pointer to source data */ +int srcrow; /* Number of rows of source data */ +int srccol; /* Number of columns of source data */ +int srcsst; /* Source data scanline stride */ +int srcpst; /* Source data pixel stride */ +unsigned char *dstptr; /* Destination data pointer */ +int dstrow; /* Destination rows */ +int dstcol; /* Destination columns */ +{ + int i, j; + unsigned char *srcscn = srcptr; + unsigned char *src; + unsigned char *dst = dstptr; + /* + ** Copy to destination rows + */ + for (i = 0; i < dstrow; i++) + { + /* + ** Update source pointer to beginning of current row. + */ + src = srcscn; + /* + ** If source row exists, copy from source, otherwise, copy previous + ** destination row. + */ + if (i < srcrow) + { + /* + ** Copy from source... + */ + for (j = 0; j < dstcol; j++) + { + /* + ** If source column exists, copy from source, otherwise, copy + ** previous destination pixel. + */ + if (j < srccol) + { + *dst++ = *src; /* Copy from source */ + src += srcpst; /* Update source pointer */ + } + else + { + *dst++ = *(src-srcpst); /* Copy previous source pixel */ + } + } + } + else + { + /* + ** Copy previous destination row. + */ + memcpy(dst,dst-dstcol,dstcol); + dst += dstcol; + } + /* + ** Update source scan pointer to next scanline + */ + srcscn += srcsst; + } +} + +/***************************************************************************** +** DctEncode +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ + +/* ENCODE: Huffman encodes one block of quantized, zigzag scanned DCT coeffs */ + +static int DctEncode(z_coef,dc_tbl,ac_tbl,dc_prev,bufptr,buflen, + bitoff) +short int *z_coef; +DcEncodeTablePtr dc_tbl; +AcEncodeTablePtr ac_tbl; +short int *dc_prev; +unsigned char *bufptr; +int buflen; +int bitoff; +{ + unsigned char *dc_size_tbl ; + unsigned char *ac_size_tbl ; + short int *dc_code_tbl ; /* was int */ + short int *ac_code_tbl ; /* was int */ + + int coef_index; + int temp; + unsigned char exp; + unsigned char run_length ; + + int curoff = bitoff; + + short coef; + unsigned char coef_lo; + unsigned char coef_hi; + + static unsigned char exp_tbl_hi[256] = { + 0,9,10,10,11,11,11,11,12,12,12,12,12,12,12,12, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 12,12,12,12,12,12,12,12,11,11,11,11,10,10,9,8 } ; + + static unsigned char exp_tbl_lo0[256] = { + 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 } ; + + static unsigned char exp_tbl_lo1[256] = { + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,4,4,3,3,3,3,2,2,1,16 } ; + + /* + ** Assign pointers inside huff structures + */ + dc_size_tbl = dc_tbl->huff_size; + ac_size_tbl = ac_tbl->huff_size; + dc_code_tbl = dc_tbl->huff_code; + ac_code_tbl = ac_tbl->huff_code; + /* + ** DC encoding + */ + coef = (*z_coef) - (*dc_prev); + *dc_prev = *z_coef++; + + if (coef < 0) coef = (coef - 1) | 0x8000 ; + + coef_lo = coef & 0xFF; + coef_hi = coef >> 8; + + if (!((exp = exp_tbl_hi[coef_hi]) & 7))/* if hi byte is not just sign*/ + if (exp) + exp = exp_tbl_lo1[coef_lo]; /* if hi byte is all 1's */ + else + exp = exp_tbl_lo0[coef_lo]; /* if hi byte is all 0's */ + + curoff += DctPutBits(dc_code_tbl[exp],(int)dc_size_tbl[exp],bufptr,curoff); + /* + ** Write out mantissa bits if exp != 0 or 16 + */ + if (exp & 15) + curoff += DctPutBits((int)(coef),(int)(exp),bufptr,curoff); + /* + ** AC encoding + */ + run_length = 0 ; + for (coef_index = 1; coef_index <= 63; coef_index++) + { + /* + ** Accumulate runs of zero coefficients + */ + if (*z_coef == 0) + { + z_coef++; + run_length++; + } + else + { + /* + ** Generate MAX-RUN-LENGTH if run >= 16 and non-zero coef found + */ + while (run_length >= 16) + { + run_length = run_length - 16 ; + curoff += DctPutBits((int)ac_code_tbl[240], + (int)ac_size_tbl[240], + bufptr, + curoff) ; + } + /* + ** Normal case: encode exponent, mantissa, and preceding 0 + ** run length, for non-zero coefficient + ** + ** Calculate exponent from table (Note: the value 0x8000 is not + ** allowed as input -- will crash) (Assumes clipping on the + ** quantizer output) + */ + coef = *z_coef++ ; + if (coef < 0) coef -= 1; + + coef_lo = coef & 0xFF; + coef_hi = coef >> 8; + + if (!((exp=exp_tbl_hi[coef_hi])&7)) /* if hi byte is not just sign*/ + if (exp) exp = exp_tbl_lo1[coef_lo]; /* if hi byte is all 1's */ + else exp = exp_tbl_lo0[coef_lo]; /* if hi byte is all 0's */ + /* + ** Store fixed codes + */ + temp = exp + 16 * run_length ; + curoff += DctPutBits((int)ac_code_tbl[temp], + (int)ac_size_tbl[temp], + bufptr, + curoff); + curoff += DctPutBits((int)(coef),(int)(exp),bufptr,curoff); + run_length = 0 ; + } + } + /* + ** Generate END-OF-BLOCK if last coef is a zero + */ + if (run_length != 0) + curoff += DctPutBits((int)ac_code_tbl[0], + (int)ac_size_tbl[0], + bufptr, + curoff); + /* + ** Return number of bits written. + */ + return curoff - bitoff; +} + +/******************************************************************* + DctPadByte + + Pads the BITS_AVAILABLE msb's of the current byte in the output bitstream + STREAM_OUT with 1 bits. If the result is FF, adds a pad byte of 00 to the + stream. +********************************************************************/ + +static int DctPadByte(bufptr,bitoff) +unsigned char *bufptr; +int bitoff; +{ + if (bitoff & 0x7) + return DctPutBits(0xFF,8,bufptr,bitoff); + else + return 0; +} + +/******************************************************************* + DctPutBits + + Places NUMBER_OF_BITS lsb's of DATA_IN into a bit stream (array of + unsigned char) currently in position STREAM_OUT. The byte pointed to + by STREAM_OUT has BITS_AVAILABLE of unfilled msb bits upon entry. + Both STREAM_OUT and BITS_AVAILABLE may be changed by PUTBITS. +********************************************************************/ +static int DctPutBits(data_in,number_of_bits,bufptr,bitoff) +int data_in; +int number_of_bits; +unsigned char *bufptr; +int bitoff; +{ + int bits_available = 8 - (bitoff & 0x07); + unsigned char *stream_out = bufptr + bitoff / 8; + int bits_written = number_of_bits; + + if (bits_available == 8) + *stream_out = 0; + + if (number_of_bits >= bits_available) + { + (*stream_out) |= + ((data_in & ((1 << bits_available) - 1))<<(8-bits_available)); + data_in >>= bits_available ; + number_of_bits -= bits_available ; + if(*stream_out == 0xff) + (*(++stream_out) = 0, bits_written += 8); + *(++stream_out) = 0; + bits_available = 8; + if(number_of_bits >= 8) /* 8 being the current bits_available */ + { + *stream_out = data_in & 255; + data_in >>= 8 ; + number_of_bits -= 8; + if (*stream_out == 0xff) + (*(++stream_out) = 0, bits_written += 8); + *(++stream_out) = 0; + } + } + + (*stream_out) |= + ((data_in & ((1 << number_of_bits) - 1))<<(8-bits_available)) ; + + return bits_written; +} + +/***************************************************************************** +** DctCreateScaledQuant +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +** status - one of: +** Success, all is well +** BadAlloc, memory allocation failure +** +*****************************************************************************/ +static int DctCreateScaledQuant(state,defidx,outidx,factor) +EncodeDctStatePtr state; +int defidx; +int outidx; +int factor; +{ + int temp; + int i; + /* + ** Allocate space for new quantization table. + */ + QuantTablePtr outtab = (QuantTablePtr)DctMalloc_(sizeof(QuantTable)); + /* + ** Return error on bad allocation + */ + if (outtab == NULL) return DctX_BadAlloc; + /* + ** Fill in data from specified default table. + */ + for (i = 0; i < DctK_QuantTableSize; i++) + { + temp = + (int)(0.5+((float)factor)*DctR_QuantDefault[defidx].quant[i]/50.0); + outtab->quant[i] = temp < 1 ? 1 : temp > 255 ? 255 : temp; + } + /* + ** If current table slot already contains a non-default table, deallocate + ** it. + */ + if ((!DceQntDef_(state,outidx)) && (DceQntTbl_(state,outidx) != NULL)) + DctFree_(DceQntTbl_(state,outidx)); + /* + ** Set new quantization table in state block. + */ + DceQntTbl_(state,outidx) = outtab; + DceQntDef_(state,outidx) = FALSE; + + return DctX_Success; +} + +/***************************************************************************** +** DctCreateScaledQuant +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int DctRstEnable(state) +EncodeDctStatePtr state; +{ + /* + ** Calculate restart interval such that we end up with whole scanlines. + */ + DceRstEnb_(state) = TRUE; + DceRstInt_(state) = + (DceCmpWid_(state,0)+(8*DceCmpHrz_(state,0)-1))/(8*DceCmpHrz_(state,0)); + /* + DceRstInt_(state) = 19; + */ +} + +static void Dce8x8_8U_16S(PIXELS,COEFS,SCAN_WIDTH,PEL_WIDTH) + +unsigned char *PIXELS ; +short int *COEFS ; +int SCAN_WIDTH, PEL_WIDTH ; + +{ +DCT_VARIABLES + + d_puc1 = PIXELS ; + d_puc2 = d_puc1 + 7 * PEL_WIDTH ; + d_ps1 = COEFS ; + d_pi1 = d_work ; + for(d_k=0 ; d_k<8; d_k++) + { + d_ap = d_a ; + *d_ap++ = ((*d_puc1) + (*d_puc2) - 256)<<4 ; + d_puc1 += PEL_WIDTH; d_puc2 -= PEL_WIDTH ; + *d_ap++ = ((*d_puc1) + (*d_puc2) - 256)<<4 ; + d_puc1 += PEL_WIDTH; d_puc2 -= PEL_WIDTH ; + *d_ap++ = ((*d_puc1) + (*d_puc2) - 256)<<4 ; + d_puc1 += PEL_WIDTH; d_puc2 -= PEL_WIDTH ; + *d_ap++ = ((*d_puc1) + (*d_puc2) - 256)<<4 ; + *d_ap++ = ((*d_puc1) - (*d_puc2) )<<4 ; + d_puc1 -= PEL_WIDTH; d_puc2 += PEL_WIDTH ; + *d_ap++ = ((*d_puc1) - (*d_puc2) )<<4 ; + d_puc1 -= PEL_WIDTH; d_puc2 += PEL_WIDTH ; + *d_ap++ = ((*d_puc1) - (*d_puc2) )<<4 ; + d_puc1 -= PEL_WIDTH; d_puc2 += PEL_WIDTH ; + *d_ap = ((*d_puc1) - (*d_puc2) )<<4 ; + d_puc1 += SCAN_WIDTH ; + d_puc2 += SCAN_WIDTH ; + + d_bp = d_b ; + *d_bp++ = d_a[0] + d_a[3] ; + *d_bp++ = d_a[1] + d_a[2] ; + *d_bp++ = d_a[1] - d_a[2] ; + *d_bp++ = d_a[0] - d_a[3] ; + *d_bp++ = d_a[4] ; + *d_bp++ = (d_cpi4*(d_a[6]-d_a[5]) + 32768)>>16 ; + *d_bp++ = (d_cpi4*(d_a[6]+d_a[5]) + 32768)>>16 ; + *d_bp = d_a[7] ; + + d_cp = d_c ; + *d_cp++ = (d_cpi4*(d_b[0]+d_b[1]) + 32768)>>16 ; + *d_cp++ = (d_cpi4*(d_b[0]-d_b[1]) + 32768)>>16 ; + *d_cp++ = (d_spi8*d_b[2] + d_cpi8*d_b[3] + 32768)>>16 ; + *d_cp++ = (d_c3pi8*d_b[3] - d_s3pi8*d_b[2] + 32768)>>16 ; + *d_cp++ = d_b[4] + d_b[5] ; + *d_cp++ = d_b[4] - d_b[5] ; + *d_cp++ = d_b[7] - d_b[6] ; + *d_cp = d_b[7] + d_b[6] ; + + *d_pi1 = (d_c[0] + 1)>>1 ; + *(d_pi1+8) = (d_spi16*d_c[4] + d_cpi16*d_c[7] +65536)>>17 ; + *(d_pi1+16) = (d_c[2] + 1)>>1 ; + *(d_pi1+24) = (d_c3pi16*d_c[6] - d_s3pi16*d_c[5] +65536)>>17 ; + *(d_pi1+32) = (d_c[1] + 1)>>1 ; + *(d_pi1+40) = (d_s5pi16*d_c[5] + d_c5pi16*d_c[6] +65536)>>17 ; + *(d_pi1+48) = (d_c[3] + 1)>>1 ; + *(d_pi1+56) = (d_c7pi16*d_c[7] - d_s7pi16*d_c[4] +65536)>>17 ; + d_pi1++ ; + } + d_pi2 = d_work ; + d_pi3 = d_work + 7 ; + for(d_k=0 ; d_k <8; d_k++) + { + d_ap = d_a ; + *d_ap++ = (*d_pi2++) + (*d_pi3--) ; + *d_ap++ = (*d_pi2++) + (*d_pi3--) ; + *d_ap++ = (*d_pi2++) + (*d_pi3--) ; + *d_ap++ = (*d_pi2) + (*d_pi3) ; + *d_ap++ = (*d_pi2--) - (*d_pi3++) ; + *d_ap++ = (*d_pi2--) - (*d_pi3++) ; + *d_ap++ = (*d_pi2--) - (*d_pi3++) ; + *d_ap = (*d_pi2) - (*d_pi3) ; + d_pi2 += 8 ; + d_pi3 += 8 ; + + d_bp = d_b ; + *d_bp++ = d_a[0] + d_a[3] ; + *d_bp++ = d_a[1] + d_a[2] ; + *d_bp++ = d_a[1] - d_a[2] ; + *d_bp++ = d_a[0] - d_a[3] ; + *d_bp++ = d_a[4] ; + *d_bp++ = (d_cpi4*(d_a[6]-d_a[5]) + 32768)>>16 ; + *d_bp++ = (d_cpi4*(d_a[6]+d_a[5]) + 32768)>>16 ; + *d_bp = d_a[7] ; + + d_cp = d_c ; + *d_cp++ = (d_cpi4*(d_b[0]+d_b[1]) + 32768)>>16 ; + *d_cp++ = (d_cpi4*(d_b[0]-d_b[1]) + 32768)>>16 ; + *d_cp++ = (d_spi8*d_b[2] + d_cpi8*d_b[3] + 32768)>>16 ; + *d_cp++ = (d_c3pi8*d_b[3] - d_s3pi8*d_b[2] + 32768)>>16 ; + *d_cp++ = d_b[4] + d_b[5] ; + *d_cp++ = d_b[4] - d_b[5] ; + *d_cp++ = d_b[7] - d_b[6] ; + *d_cp = d_b[7] + d_b[6] ; + + *d_ps1 = (d_c[0] + 16 )>>5 ; + *(d_ps1+8) = (d_spi16*d_c[4] + d_cpi16*d_c[7] + (1<<20))>>21 ; + *(d_ps1+16) = (d_c[2] + 16 )>>5 ; + *(d_ps1+24) = (d_c3pi16*d_c[6] - d_s3pi16*d_c[5] + (1<<20))>>21 ; + *(d_ps1+32) = (d_c[1] + 16 )>>5 ; + *(d_ps1+40) = (d_s5pi16*d_c[5] + d_c5pi16*d_c[6] + (1<<20))>>21 ; + *(d_ps1+48) = (d_c[3] + 16 )>>5 ; + *(d_ps1+56) = (d_c7pi16*d_c[7] - d_s7pi16*d_c[4] + (1<<20))>>21 ; + d_ps1++ ; + } + + return ; +} diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiEncodeDct.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiEncodeDct.h new file mode 100644 index 0000000..c276346 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiEncodeDct.h @@ -0,0 +1,251 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** XIE Sample Machine Independant DDX +** DCT compression routine +** +** ABSTRACT: +** +** This module contains definitions required by the XIE SMI DCT +** compression routines. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** John Nadai +** John Weber +** +** CREATION DATE: +** +** July 31, 1990 +** +************************************************************************/ + +#ifndef _ENCODEDCT +#define _ENCODEDCT +/* +** INCLUDE FILES +*/ +#if defined(XIESMI) +#include +#include +#endif + +/* +** DCT decompression state structure. +*/ +typedef struct _EncodeDctState { + /* + ** Decode state variable. + */ + char current_state; + struct _EnDctStatus { + unsigned input_exhausted : 1; + unsigned new_data : 1; + unsigned end_frame : 1; + unsigned end_image : 1; + unsigned reserved : 4; + } status; + /* + ** Information about where we are in destination data buffer. + */ + unsigned char *current_ptr; + int current_len; + int current_remaining; + /* + ** Information about last token parsed. + */ + int token; /* Token type */ + /* + ** DCT frame variables. + */ + short frame_width; /* Pels/scan for frame */ + short frame_height; /* Scan count for frame */ + char component_count; /* Components per scan */ + short restart_interval; /* Restart interval */ + char restart_enable; /* Restart enabled for current scan */ + int restart_count; /* Restart counter */ + int restart_lines; /* Lines per restart */ + /* + ** DCT per component variables. + */ + struct _EnDctComponent { + UdpRec udp; /* Source component UDP */ + char vertical_samples; /* Vertical sampling rate */ + char horizontal_samples; /* Horizontal sampling rate */ + char quant_table; /* Quantization table to use */ + char huff_ac; /* Huffman AC table for this comp. */ + char huff_dc; /* Huffman DC table for this comp. */ + int scans_per_segment; /* Number of scans between restarts */ + int current_x; /* Current X location for decode */ + int current_y; /* Current Y location for decode */ + short previous_dc; /* Previous DC value */ + } component[DctK_MaxComponents]; + /* + ** Quantization tables. + */ + char quant_default[DctK_MaxQuantTables]; + QuantTablePtr quant_table[DctK_MaxQuantTables]; + /* + ** Huffman tables + */ + AcEncodeTablePtr huff_ac_table[DctK_MaxHuffTables]; + DcEncodeTablePtr huff_dc_table[DctK_MaxHuffTables]; + /* + ** Compression state variables. + */ + int interleaves_per_line; + int interleave_lines; + int horz_interleave_count; + int vert_interleave_counter; + int horz_interleave_counter; +} EncodeDctStateRec, *EncodeDctStatePtr; + +/* +** MACROs to access state structure variables. +*/ +#define DceState_(state) (state)->current_state +#define DceInpExh_(state) (state)->status.input_exhausted +#define DceNewDat_(state) (state)->status.new_data +#define DceEndFrm_(state) (state)->status.end_frame +#define DceEndImg_(state) (state)->status.end_image + +#define DceCurPtr_(state) (state)->current_ptr +#define DceCurLen_(state) (state)->current_len +#define DceCurRem_(state) (state)->current_remaining + +#define DceCurTok_(state) (state)->token + +#define DceMode_(state) (state)->mode_union.mode +#define DceFrmWid_(state) (state)->frame_width +#define DceFrmHgt_(state) (state)->frame_height +#define DceCmpCnt_(state) (state)->component_count +#define DceRstInt_(state) (state)->restart_interval +#define DceRstEnb_(state) (state)->restart_enable +#define DceRstCnt_(state) (state)->restart_count + +#define DceCmpVrt_(state,i) (state)->component[(i)].vertical_samples +#define DceCmpHrz_(state,i) (state)->component[(i)].horizontal_samples +#define DceCmpQnt_(state,i) (state)->component[(i)].quant_table +#define DceCmpHac_(state,i) (state)->component[(i)].huff_ac +#define DceCmpHdc_(state,i) (state)->component[(i)].huff_dc +#define DceScnSeg_(state,i) (state)->component[(i)].scans_per_segment +#define DceCurX_(state,i) (state)->component[(i)].current_x +#define DceCurY_(state,i) (state)->component[(i)].current_y +#define DceCmpPdc_(state,i) (state)->component[(i)].previous_dc + +#define DceSrcUdp_(state,i) (state)->component[(i)].udp +#define DceCmpIdx_(state,i) (state)->component[(i)].udp.UdpL_CompIdx +#define DceCmpWid_(state,i) (state)->component[(i)].udp.UdpL_PxlPerScn +#define DceCmpHgt_(state,i) (state)->component[(i)].udp.UdpL_ScnCnt + +#define DceQntTbl_(state,i) (state)->quant_table[(i)] +#define DceQntDef_(state,i) (state)->quant_default[(i)] + +#define DceHacTbl_(state,i) (state)->huff_ac_table[(i)] +#define DceHdcTbl_(state,i) (state)->huff_dc_table[(i)] + +#define DceVrtCnt_(state) (state)->vert_interleave_counter +#define DceHrzCnt_(state) (state)->horz_interleave_counter + +#define DceIntCol_(state) (state)->interleaves_per_line +#define DceIntLin_(state) (state)->interleave_lines + +#if defined(XIESMI) + /* + ** EncodeDct pipeline context block. + */ +typedef struct _EncodeDctPipeCtx { + PipeElementCommonPart common; + struct _EncodeDctPart { + PipeSinkPtr src; + int cmpmsk; + PipeDrainPtr drn[XieK_MaxComponents]; + PipeDataPtr srcdat[XieK_MaxComponents]; + UdpPtr dst; + EncodeDctStatePtr state; + int factor; + unsigned int *final; + } EncodeDctPart; +} EncodeDctPipeCtx, *EncodeDctPipeCtxPtr; + +/* +** MACROs to access pipeline context structure. +*/ +#define DceSrcSnk_(ctx) ((ctx)->EncodeDctPart.src) +#define DceDstUdp_(ctx) ((ctx)->EncodeDctPart.dst) +#define DceFinal_(ctx) ((ctx)->EncodeDctPart.final) +#define DceCmpMsk_(ctx) ((ctx)->EncodeDctPart.cmpmsk) +#define DceCmpFct_(ctx) ((ctx)->EncodeDctPart.factor) +#define DceSrcDrn_(ctx,i) ((ctx)->EncodeDctPart.drn[(i)]) +#define DceSteBlk_(ctx) ((ctx)->EncodeDctPart.state) +#define DceSrcDat_(ctx,i) ((ctx)->EncodeDctPart.srcdat[(i)]) +#endif + + /* + ** Function reference at end to allow for ptr defs + */ +#if defined(XIESMI) +unsigned long SmiEncodeDct(); +int SmiCreateEncodeDct(); +#endif + +/* +** The following line MUST be the last line of this file. +*/ +#endif diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiEncodeG4.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiEncodeG4.c new file mode 100644 index 0000000..f4e44f9 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiEncodeG4.c @@ -0,0 +1,847 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989, 1990 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module implements compression using G4 Facsimile encoding. +** +** Since compression is driven by requests from transport, it is not +** implemented as a standard pipeline element. The usual pipeline +** routines are stubbed in for consistency. +** +** +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHORS: +** +** Gary L. Grebus +** Derived from code originally developed by Ken MacDonald +** +** CREATION DATE: +** +** Mon Mar 26 15:28:21 1990 +** +*******************************************************************************/ + +#include + +#include "SmiEncodeG4.h" + +/* +** Table of contents +*/ +int SmiEncodeG4(); + +int SmiCreateEncodeG4(); +static int _EncodeG4Initialize(); +static int _EncodeG4Activate(); +static int _EncodeG4Abort(); +static int _EncodeG4Destroy(); + +static int _EncodeG4Segment(); +static EncodeG4StatePtr _InitializeG4State(); +static EncodeG4StatePtr _DestroyG4State(); +static void _EncodeG4Process(); + +/* +** Equated Symbols +*/ +#define WHITE 0 +#define BLACK 1 +#define BLACK_TABLE_SIZE 8192 +#define WHITE_TABLE_SIZE 4096 +#define DECODE_TABLE_SIZE 4096 +#define MAXCODEWORDSIZE 14 + +/* + * 2 Dimensional codeword and codeword length definitions used to + * encode image data using either G32D or G42D schemes. + * + * NOTE: These are coded as literals rather than as + * values in a lookup table because there aren't + * very many of them, and the encoding code will + * run a little faster. Decoding codewords are + * stored in a table found in the MiFAX_DECODE_TABLES + * module. + */ +#define MiK_FAX2D_CODEWORD_PASS 8 +#define MiK_FAX2D_CODELEN_PASS 4 +#define MiK_FAX2D_CODEWORD_HORIZ 4 +#define MiK_FAX2D_CODELEN_HORIZ 3 +#define MiK_FAX2D_CODEWORD_V0 1 +#define MiK_FAX2D_CODELEN_V0 1 +#define MiK_FAX2D_CODEWORD_VR1 6 +#define MiK_FAX2D_CODELEN_VR1 3 +#define MiK_FAX2D_CODEWORD_VR2 48 +#define MiK_FAX2D_CODELEN_VR2 6 +#define MiK_FAX2D_CODEWORD_VR3 96 +#define MiK_FAX2D_CODELEN_VR3 7 +#define MiK_FAX2D_CODEWORD_VL1 2 +#define MiK_FAX2D_CODELEN_VL1 3 +#define MiK_FAX2D_CODEWORD_VL2 16 +#define MiK_FAX2D_CODELEN_VL2 6 +#define MiK_FAX2D_CODEWORD_VL3 32 +#define MiK_FAX2D_CODELEN_VL3 7 + +/* Constants for some of the 1D codewords/lengths */ +#define MiK_FAX1D_CODEWORD_EOL 2048 +#define MiK_FAX1D_CODELEN_EOL 12 +#define MiK_FAX1D_CODEWORD_WHITE2560 3968 +#define MiK_FAX1D_CODELEN_WHITE2560 12 +#define MiK_FAX1D_CODEWORD_BLACK2560 3968 +#define MiK_FAX1D_CODELEN_BLACK2560 12 + +/* +** Macros +*/ +#ifndef min +#define min(a,b) (ab?a:b) +#endif +/* +** Macros used for performing G4 codeword manipulations. +** For Ultrix (and the non-VAX architectures Ultrix supports), +** don't access longwords on non-longword aligned boundaries. +*/ + +/* Add a codeword of given length to the buffer */ +#define ADD_CODEWORD_(base,bitptr,code,len) \ + XOR_WRITE32_(base + (bitptr >> 3),code << (bitptr & 0x7));\ + bitptr += len + +/* Add a complete white run (makeup + term codes) to buffer (no check) + * the rl (runlength parameter) is destroyed during this macro + */ +#define ENCODE_1D_WHITERUN_(base,bitptr,rl) \ + while (rl >= 2560)\ + {\ + XOR_WRITE32_(base + (bitptr >> 3), \ + MiK_FAX1D_CODEWORD_WHITE2560 << (bitptr & 0x7));\ + bitptr += MiK_FAX1D_CODELEN_WHITE2560;\ + rl -= 2560;\ + }\ + if (rl >= 64)\ + {\ + working_run_length = rl & 0xFFFFFFC0;\ + rl &= 0x3F;\ + XOR_WRITE32_(base + (bitptr >> 3), \ + MiAR_Fax1dEncodeWhite[working_run_length].codeword << \ + (bitptr & 0x7));\ + bitptr += MiAR_Fax1dEncodeWhite[working_run_length].length;\ + }\ + XOR_WRITE32_(base + (bitptr >> 3), \ + MiAR_Fax1dEncodeWhite[rl].codeword << (bitptr & 0x7));\ + bitptr += MiAR_Fax1dEncodeWhite[rl].length + +/* Add a complete black run (makeup + term codes) to buffer (no check) + * the rl (runlength parameter) is destroyed during this macro + */ +#define ENCODE_1D_BLACKRUN_(base,bitptr,rl) \ + while (rl >= 2560)\ + {\ + XOR_WRITE32_(base + (bitptr >> 3), \ + MiK_FAX1D_CODEWORD_BLACK2560 << (bitptr & 0x7));\ + bitptr += MiK_FAX1D_CODELEN_BLACK2560;\ + rl -= 2560;\ + }\ + if (rl >= 64)\ + {\ + working_run_length = rl & 0xFFFFFFC0;\ + rl &= 0x3F;\ + XOR_WRITE32_(base + (bitptr >> 3),\ + MiAR_Fax1dEncodeBlack[working_run_length].codeword << \ + (bitptr & 0x7));\ + bitptr += MiAR_Fax1dEncodeBlack[working_run_length].length;\ + }\ + XOR_WRITE32_(base + (bitptr >> 3), \ + MiAR_Fax1dEncodeBlack[rl].codeword << (bitptr & 0x7));\ + bitptr += MiAR_Fax1dEncodeBlack[rl].length + +/* +** External References +*/ +extern int *MiBuildChangeList(); + +/* +** Local storage +*/ + /* + ** EncodeG4 Element Vector + */ +externaldef(EncodeG4PipeElement) PipeElementVector EncodeG4PipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeEncodeG4Element, /* Structure subtype */ + sizeof(EncodeG4PipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _EncodeG4Initialize, /* Initialize entry */ + _EncodeG4Activate, /* Activate entry */ + _EncodeG4Abort, /* Flush entry */ + _EncodeG4Destroy, /* Destroy entry */ + _EncodeG4Abort /* Abort entry point */ + }; + +/***************************************************************************** +** SmiEncodeG4 +** +** FUNCTIONAL DESCRIPTION: +** +** This routine performs CCITT G4 compression of an entire image. +** +** FORMAL PARAMETERS: +** +** src - Pointer to the Udp which will feed the compression +** dst - Pointer to the Udp which will receive the compressed data +** +** FUNCTION VALUE: +** +** status +** +*****************************************************************************/ +int SmiEncodeG4( src, dst, size_ret ) + UdpPtr src; + UdpPtr dst; + unsigned long *size_ret; +{ + EncodeG4StatePtr state; + int status, final = FALSE; + + state = _InitializeG4State( dst ); + if( state == NULL ) return( BadAlloc ); + + status = _EncodeG4Segment( src, dst, state, &final, size_ret ); + + _DestroyG4State( state ); + + return( status == BadLength ? Success : status ); +} /* end SmiEncodeG4 */ + +/***************************************************************************** +** SmiCreateEncodeG4 +** +** FUNCTIONAL DESCRIPTION: +** +** This function creates the ENCODE G4 pipeline element +** +** FORMAL PARAMETERS: +** +** pipe - pipeline pointer +** src_sink - the sink from which to read PCM data +** dst_udps - pointer to destination Udps for G42D data +** final - pointer to flag to set when finished +** +*****************************************************************************/ +int SmiCreateEncodeG4( pipe, src_sink, dst_udps, final ) + Pipe pipe; + PipeSinkPtr src_sink; + UdpPtr *dst_udps; + unsigned int *final; +{ + EncodeG4PipeCtxPtr ctx = (EncodeG4PipeCtxPtr) + DdxCreatePipeCtx_( pipe, &EncodeG4PipeElement, FALSE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + + /* + ** Build our EncodeG4 Pipe Ctx from the arguments passed in. + */ + EG4Src_(ctx) = src_sink; + EG4Dst_(ctx) = dst_udps[0]; + EG4Final_(ctx) = final; + *final &= ~(1<= upY1_(dst) && DatY1_(src) <= upY2_(dst) ) + { + status = _EncodeG4Segment( DatUdpPtr_(src), dst, + EG4State_(ctx), EG4Final_(ctx), &bits ); + if( status != Success ) + { /* + ** Image didn't compress. + */ + upArSize_(dst) = 0; + upPos_(dst) = 0; + if( status == BadLength ) + status = Success; + } + else + /* + ** Use ArSize to point to the end of the compressed data. + */ + upArSize_(dst) += bits; + } + } + return( status ); +} /* end _EncodeG4Activate */ + +/***************************************************************************** +** _EncodeG4Abort +** +** FUNCTIONAL DESCRIPTION: +** +** This routine deallocates all resources allocated by the encode G4 +** pipeline element initialize and/or activate routines. +** +** FORMAL PARAMETERS: +** +** ctx - encode G4 pipeline context +** +*****************************************************************************/ +static int _EncodeG4Abort(ctx) + EncodeG4PipeCtxPtr ctx; +{ + EG4State_(ctx) = _DestroyG4State( EG4State_(ctx) ); + + return( Success ); +} /* end _EncodeG4Abort */ + +/***************************************************************************** +** _EncodeG4Destroy +** +** FUNCTIONAL DESCRIPTION: +** +** This routine deallocates all resources allocated by the encode G4 +** pipeline element create routine. +** +** FORMAL PARAMETERS: +** +** ctx - encode G4 pipeline context +** +*****************************************************************************/ +static int _EncodeG4Destroy(ctx) + EncodeG4PipeCtxPtr ctx; +{ + EG4Drn_(ctx) = DdxRmDestroyDrain_( EG4Drn_(ctx) ); + + return( Success ); +} /* end _EncodeG4Destroy */ + +/***************************************************************************** +** _EncodeG4Segment +** +** FUNCTIONAL DESCRIPTION: +** +** This routine performs CCITT G4 compression on a segment of an image. +** +** FORMAL PARAMETERS: +** +** src - Pointer to the Udp containing segment to be compressed +** dst - Pointer to the Udp which will receive the compressed data +** state - Pointer to the compression state information +** final - Pointer to a flag to set when finished +** size_ret - Pointer to where to stash number of bits encoded +** +** FUNCTION VALUE: +** +** status +** +*****************************************************************************/ +static int _EncodeG4Segment( src, dst, state, final, size_ret ) + UdpPtr src; + UdpPtr dst; + EncodeG4StatePtr state; + int *final; + unsigned long *size_ret; +{ + long int x1, y1, x2, y2, width, height; + long int pos, used, size, line, status; + int *tmp_ptr; + UdpPtr cvt = esG4Cvt_(state); + + *size_ret = 0; + x1 = max( upX1_(src), upX1_(dst) ); + x2 = min( upX2_(src), upX2_(dst) ); + y1 = max( upY1_(src), upY1_(dst) ); + y2 = min( upY2_(src), upY2_(dst) ); + width = x2 - x1 + 1; + height = y2 - y1 + 1; + + *final |= width > 0 && height > 0 ? 1< size ) return( BadLength ); + /* + ** Convert changelist into CCITT G42D compressed data. + */ + _EncodeG4Process( state ); + /* + ** Swap pointers for current and reference change lists. + */ + tmp_ptr = esG4Rcl_(state); + esG4Rcl_(state) = esG4Ccl_(state); + esG4Ccl_(state) = tmp_ptr; + } /* end for */ + + if( line < upY2_(dst) ) + *final &= ~(1< 1 && rcl[ridx-1] > a0prime ) + ridx--; + while( rcl[ridx] <= a0prime || (ridx & 1) == run_color ) + ridx++; + b1 = rcl[ridx]; + b2 = rcl[ridx+1]; + + /* detect proper coding mode */ + if( b2 < a1 ) /* pass mode */ + { + ADD_CODEWORD_(buf,pos,MiK_FAX2D_CODEWORD_PASS,MiK_FAX2D_CODELEN_PASS); + a0prime = b2; + + /* must back up bit pointers to reclaim difference between */ + /* the new value of a0 (a0prime) and a1 */ + curr_pos -= a1 - a0prime; /* cp = cp - (a1-a0') */ + } + else + { + if( abs(a1 - b1) <= 3 ) /* one of the vertical modes */ + { + switch( a1 - b1 ) + { + case 0 : + ADD_CODEWORD_(buf,pos,MiK_FAX2D_CODEWORD_V0, + MiK_FAX2D_CODELEN_V0); + break; + case -1 : + ADD_CODEWORD_(buf,pos,MiK_FAX2D_CODEWORD_VL1, + MiK_FAX2D_CODELEN_VL1); + break; + case 1 : + ADD_CODEWORD_(buf,pos,MiK_FAX2D_CODEWORD_VR1, + MiK_FAX2D_CODELEN_VR1); + break; + case -2 : + ADD_CODEWORD_(buf,pos,MiK_FAX2D_CODEWORD_VL2, + MiK_FAX2D_CODELEN_VL2); + break; + case 2 : + ADD_CODEWORD_(buf,pos,MiK_FAX2D_CODEWORD_VR2, + MiK_FAX2D_CODELEN_VR2); + break; + case -3 : + ADD_CODEWORD_(buf,pos,MiK_FAX2D_CODEWORD_VL3, + MiK_FAX2D_CODELEN_VL3); + break; + case 3 : + ADD_CODEWORD_(buf,pos,MiK_FAX2D_CODEWORD_VR3, + MiK_FAX2D_CODELEN_VR3); + break; + } + if( a0 < 0 ) + { + a0 = 0; + if( a0prime < 0 ) + a0prime = 0; + } + run_color ^= 1; /* change run color */ + + a0prime = a1; + a0 = a0prime; + } + else /* horizontal mode */ + { + ADD_CODEWORD_(buf,pos,MiK_FAX2D_CODEWORD_HORIZ, + MiK_FAX2D_CODELEN_HORIZ); + /* update change list and index */ + if( a0 < 0 ) + { + a0 = 0; + if( a0prime < 0 ) + a0prime = 0; + } + i++; + if( run_color == WHITE ) + {ENCODE_1D_WHITERUN_(buf,pos,run_length);} + else + {ENCODE_1D_BLACKRUN_(buf,pos,run_length);} + + /* detect a2; get next runlength */ + run_color ^= 1; + run_length = ccl[i] - curr_pos; + curr_pos = ccl[i]; + a2 = a1 + run_length; + + if( run_color == WHITE ) + {ENCODE_1D_WHITERUN_(buf,pos,run_length);} + else + {ENCODE_1D_BLACKRUN_(buf,pos,run_length);} + + run_color ^= 1; + a0prime = a2; + a0 = a0prime; + } + } + if( curr_pos == ccl[i] ) + i++; + } /* end for */ + /* + ** Update number of bits used. + */ + esG4Pos_(state) = pos; +} /* end _EncodeG4Process */ +/* end module SmiEncodeG4 */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiEncodeG4.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiEncodeG4.h new file mode 100644 index 0000000..5d90607 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiEncodeG4.h @@ -0,0 +1,159 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the G4 compress pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.0 +** RISC ULTRIX V3.0 +** +** AUTHOR(S): +** +** Gary L. Grebus +** Robert NC Shelley +** +** CREATION DATE: +** +** Mon Mar 26 15:24:07 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ + +#ifndef _SMIENCODEG4 +#define _SMIENCODEG4 + +#include + +/* +** Structure definitions and Typedefs +*/ + /* + ** This is the structure allocated by SmiEncodeG4InitState(), and used to + ** maintain the state of a segmented compression. + */ +typedef struct _EncodeG4State { + int *ccl; /* Pointer to current changelist */ + int *rcl; /* Pointer to reference changelist */ + int pos; /* destination bit offset */ + int size; /* total buffer size */ + unsigned char *base; /* destination buffer address */ + UdpPtr cvt; /* optional format conversion Udp */ +} EncodeG4State, *EncodeG4StatePtr; + + /* + ** EncodeG4 pipeline context block. + */ +typedef struct _EncodeG4PipeCtx { + PipeElementCommonPart common; + struct _EncodeG4Part { + PipeSinkPtr src; + PipeDrainPtr drn; + UdpPtr dst; + EncodeG4StatePtr state; + unsigned int *final; + } EncodeG4Part; +} EncodeG4PipeCtx, *EncodeG4PipeCtxPtr; + + /* + ** Encode table structure. + */ +typedef struct _EncodeG4HuffTable { + short length; /* codeword length */ + short codeword; /* codeword */ +} EncodeG4HuffTableRec, *EncodeG4HuffTablePtr; + +/* +** MACRO definitions +*/ + /* + ** Macros for accessing EncodeG4StatePtr fields. + */ +#define esG4Ccl_(state) ((state)->ccl) +#define esG4Rcl_(state) ((state)->rcl) +#define esG4Pos_(state) ((state)->pos) +#define esG4Siz_(state) ((state)->size) +#define esG4Buf_(state) ((state)->base) +#define esG4Cvt_(state) ((state)->cvt) + /* + ** Macros for accessing EncodeG4PipeCtxPtr fields. + */ +#define EG4Src_(ctx) ((ctx)->EncodeG4Part.src) +#define EG4Drn_(ctx) ((ctx)->EncodeG4Part.drn) +#define EG4Dst_(ctx) ((ctx)->EncodeG4Part.dst) +#define EG4State_(ctx) ((ctx)->EncodeG4Part.state) +#define EG4Final_(ctx) ((ctx)->EncodeG4Part.final) + +/* +** Equated Symbols +*/ +#define ENCODE_TABLE_SIZE 2561 +/* +** External References +*/ +extern int SmiEncodeG4(); +extern int SmiCreateEncodeG4(); + +externalref EncodeG4HuffTableRec MiAR_Fax1dEncodeWhite[ENCODE_TABLE_SIZE]; +externalref EncodeG4HuffTableRec MiAR_Fax1dEncodeBlack[ENCODE_TABLE_SIZE]; + +#endif +/* _SMIENCODEG4 */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiFaxTables.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiFaxTables.c new file mode 100644 index 0000000..7350c67 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiFaxTables.c @@ -0,0 +1,5443 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989, 1990 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +#include +#include +externaldef (MiArFax1DDecodeWhite) +DecodeG4HuffTableRec MiArFax1DDecodeWhite[G4K_WhiteTableSize] = { +{ 1, 12, -1 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 39, 8, 2 },{ 16, 6, 2 },{ 576, 8, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 55, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 45, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 53, 8, 2 },{ 9, 5, 2 },{ 448, 8, 1 },{ 6, 4, 2 }, +{ 35, 8, 2 },{ 128, 5, 1 },{ 51, 8, 2 },{ 15, 6, 2 }, +{ 63, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1472, 9, 1 },{ 5, 4, 2 }, +{ 43, 8, 2 },{ 17, 6, 2 },{ 1216, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 29, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 33, 8, 2 },{ 128, 5, 1 },{ 49, 8, 2 },{ 14, 6, 2 }, +{ 61, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 47, 8, 2 },{ 3, 4, 2 },{ 59, 8, 2 },{ 5, 4, 2 }, +{ 41, 8, 2 },{ 16, 6, 2 },{ 960, 9, 1 },{ 6, 4, 2 }, +{ 31, 8, 2 },{ 8, 5, 2 },{ 57, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 704, 9, 1 },{ 6, 4, 2 }, +{ 37, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 320, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 1792, 11, 1 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 40, 8, 2 },{ 16, 6, 2 },{ 832, 9, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 56, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 46, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 54, 8, 2 },{ 9, 5, 2 },{ 512, 8, 1 },{ 6, 4, 2 }, +{ 36, 8, 2 },{ 128, 5, 1 },{ 52, 8, 2 },{ 15, 6, 2 }, +{ 0, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1600, 9, 1 },{ 5, 4, 2 }, +{ 44, 8, 2 },{ 17, 6, 2 },{ 1344, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 30, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 34, 8, 2 },{ 128, 5, 1 },{ 50, 8, 2 },{ 14, 6, 2 }, +{ 62, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 48, 8, 2 },{ 3, 4, 2 },{ 60, 8, 2 },{ 5, 4, 2 }, +{ 42, 8, 2 },{ 16, 6, 2 },{ 1088, 9, 1 },{ 6, 4, 2 }, +{ 32, 8, 2 },{ 8, 5, 2 },{ 58, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 640, 8, 1 },{ 6, 4, 2 }, +{ 38, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 384, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 0, 0, 0 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 39, 8, 2 },{ 16, 6, 2 },{ 576, 8, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 55, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 45, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 53, 8, 2 },{ 9, 5, 2 },{ 448, 8, 1 },{ 6, 4, 2 }, +{ 35, 8, 2 },{ 128, 5, 1 },{ 51, 8, 2 },{ 15, 6, 2 }, +{ 63, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1536, 9, 1 },{ 5, 4, 2 }, +{ 43, 8, 2 },{ 17, 6, 2 },{ 1280, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 29, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 33, 8, 2 },{ 128, 5, 1 },{ 49, 8, 2 },{ 14, 6, 2 }, +{ 61, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 47, 8, 2 },{ 3, 4, 2 },{ 59, 8, 2 },{ 5, 4, 2 }, +{ 41, 8, 2 },{ 16, 6, 2 },{ 1024, 9, 1 },{ 6, 4, 2 }, +{ 31, 8, 2 },{ 8, 5, 2 },{ 57, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 768, 9, 1 },{ 6, 4, 2 }, +{ 37, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 320, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 1856, 11, 1 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 40, 8, 2 },{ 16, 6, 2 },{ 896, 9, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 56, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 46, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 54, 8, 2 },{ 9, 5, 2 },{ 512, 8, 1 },{ 6, 4, 2 }, +{ 36, 8, 2 },{ 128, 5, 1 },{ 52, 8, 2 },{ 15, 6, 2 }, +{ 0, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1728, 9, 1 },{ 5, 4, 2 }, +{ 44, 8, 2 },{ 17, 6, 2 },{ 1408, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 30, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 34, 8, 2 },{ 128, 5, 1 },{ 50, 8, 2 },{ 14, 6, 2 }, +{ 62, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 48, 8, 2 },{ 3, 4, 2 },{ 60, 8, 2 },{ 5, 4, 2 }, +{ 42, 8, 2 },{ 16, 6, 2 },{ 1152, 9, 1 },{ 6, 4, 2 }, +{ 32, 8, 2 },{ 8, 5, 2 },{ 58, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 640, 8, 1 },{ 6, 4, 2 }, +{ 38, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 384, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 0, 0, 0 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 39, 8, 2 },{ 16, 6, 2 },{ 576, 8, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 55, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 45, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 53, 8, 2 },{ 9, 5, 2 },{ 448, 8, 1 },{ 6, 4, 2 }, +{ 35, 8, 2 },{ 128, 5, 1 },{ 51, 8, 2 },{ 15, 6, 2 }, +{ 63, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1472, 9, 1 },{ 5, 4, 2 }, +{ 43, 8, 2 },{ 17, 6, 2 },{ 1216, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 29, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 33, 8, 2 },{ 128, 5, 1 },{ 49, 8, 2 },{ 14, 6, 2 }, +{ 61, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 47, 8, 2 },{ 3, 4, 2 },{ 59, 8, 2 },{ 5, 4, 2 }, +{ 41, 8, 2 },{ 16, 6, 2 },{ 960, 9, 1 },{ 6, 4, 2 }, +{ 31, 8, 2 },{ 8, 5, 2 },{ 57, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 704, 9, 1 },{ 6, 4, 2 }, +{ 37, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 320, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 2112, 12, 1 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 40, 8, 2 },{ 16, 6, 2 },{ 832, 9, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 56, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 46, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 54, 8, 2 },{ 9, 5, 2 },{ 512, 8, 1 },{ 6, 4, 2 }, +{ 36, 8, 2 },{ 128, 5, 1 },{ 52, 8, 2 },{ 15, 6, 2 }, +{ 0, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1600, 9, 1 },{ 5, 4, 2 }, +{ 44, 8, 2 },{ 17, 6, 2 },{ 1344, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 30, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 34, 8, 2 },{ 128, 5, 1 },{ 50, 8, 2 },{ 14, 6, 2 }, +{ 62, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 48, 8, 2 },{ 3, 4, 2 },{ 60, 8, 2 },{ 5, 4, 2 }, +{ 42, 8, 2 },{ 16, 6, 2 },{ 1088, 9, 1 },{ 6, 4, 2 }, +{ 32, 8, 2 },{ 8, 5, 2 },{ 58, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 640, 8, 1 },{ 6, 4, 2 }, +{ 38, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 384, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 0, 0, 0 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 39, 8, 2 },{ 16, 6, 2 },{ 576, 8, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 55, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 45, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 53, 8, 2 },{ 9, 5, 2 },{ 448, 8, 1 },{ 6, 4, 2 }, +{ 35, 8, 2 },{ 128, 5, 1 },{ 51, 8, 2 },{ 15, 6, 2 }, +{ 63, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1536, 9, 1 },{ 5, 4, 2 }, +{ 43, 8, 2 },{ 17, 6, 2 },{ 1280, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 29, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 33, 8, 2 },{ 128, 5, 1 },{ 49, 8, 2 },{ 14, 6, 2 }, +{ 61, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 47, 8, 2 },{ 3, 4, 2 },{ 59, 8, 2 },{ 5, 4, 2 }, +{ 41, 8, 2 },{ 16, 6, 2 },{ 1024, 9, 1 },{ 6, 4, 2 }, +{ 31, 8, 2 },{ 8, 5, 2 },{ 57, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 768, 9, 1 },{ 6, 4, 2 }, +{ 37, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 320, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 2368, 12, 1 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 40, 8, 2 },{ 16, 6, 2 },{ 896, 9, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 56, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 46, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 54, 8, 2 },{ 9, 5, 2 },{ 512, 8, 1 },{ 6, 4, 2 }, +{ 36, 8, 2 },{ 128, 5, 1 },{ 52, 8, 2 },{ 15, 6, 2 }, +{ 0, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1728, 9, 1 },{ 5, 4, 2 }, +{ 44, 8, 2 },{ 17, 6, 2 },{ 1408, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 30, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 34, 8, 2 },{ 128, 5, 1 },{ 50, 8, 2 },{ 14, 6, 2 }, +{ 62, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 48, 8, 2 },{ 3, 4, 2 },{ 60, 8, 2 },{ 5, 4, 2 }, +{ 42, 8, 2 },{ 16, 6, 2 },{ 1152, 9, 1 },{ 6, 4, 2 }, +{ 32, 8, 2 },{ 8, 5, 2 },{ 58, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 640, 8, 1 },{ 6, 4, 2 }, +{ 38, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 384, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 0, 0, 0 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 39, 8, 2 },{ 16, 6, 2 },{ 576, 8, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 55, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 45, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 53, 8, 2 },{ 9, 5, 2 },{ 448, 8, 1 },{ 6, 4, 2 }, +{ 35, 8, 2 },{ 128, 5, 1 },{ 51, 8, 2 },{ 15, 6, 2 }, +{ 63, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1472, 9, 1 },{ 5, 4, 2 }, +{ 43, 8, 2 },{ 17, 6, 2 },{ 1216, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 29, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 33, 8, 2 },{ 128, 5, 1 },{ 49, 8, 2 },{ 14, 6, 2 }, +{ 61, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 47, 8, 2 },{ 3, 4, 2 },{ 59, 8, 2 },{ 5, 4, 2 }, +{ 41, 8, 2 },{ 16, 6, 2 },{ 960, 9, 1 },{ 6, 4, 2 }, +{ 31, 8, 2 },{ 8, 5, 2 },{ 57, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 704, 9, 1 },{ 6, 4, 2 }, +{ 37, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 320, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 1984, 12, 1 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 40, 8, 2 },{ 16, 6, 2 },{ 832, 9, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 56, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 46, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 54, 8, 2 },{ 9, 5, 2 },{ 512, 8, 1 },{ 6, 4, 2 }, +{ 36, 8, 2 },{ 128, 5, 1 },{ 52, 8, 2 },{ 15, 6, 2 }, +{ 0, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1600, 9, 1 },{ 5, 4, 2 }, +{ 44, 8, 2 },{ 17, 6, 2 },{ 1344, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 30, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 34, 8, 2 },{ 128, 5, 1 },{ 50, 8, 2 },{ 14, 6, 2 }, +{ 62, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 48, 8, 2 },{ 3, 4, 2 },{ 60, 8, 2 },{ 5, 4, 2 }, +{ 42, 8, 2 },{ 16, 6, 2 },{ 1088, 9, 1 },{ 6, 4, 2 }, +{ 32, 8, 2 },{ 8, 5, 2 },{ 58, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 640, 8, 1 },{ 6, 4, 2 }, +{ 38, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 384, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 0, 0, 0 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 39, 8, 2 },{ 16, 6, 2 },{ 576, 8, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 55, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 45, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 53, 8, 2 },{ 9, 5, 2 },{ 448, 8, 1 },{ 6, 4, 2 }, +{ 35, 8, 2 },{ 128, 5, 1 },{ 51, 8, 2 },{ 15, 6, 2 }, +{ 63, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1536, 9, 1 },{ 5, 4, 2 }, +{ 43, 8, 2 },{ 17, 6, 2 },{ 1280, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 29, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 33, 8, 2 },{ 128, 5, 1 },{ 49, 8, 2 },{ 14, 6, 2 }, +{ 61, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 47, 8, 2 },{ 3, 4, 2 },{ 59, 8, 2 },{ 5, 4, 2 }, +{ 41, 8, 2 },{ 16, 6, 2 },{ 1024, 9, 1 },{ 6, 4, 2 }, +{ 31, 8, 2 },{ 8, 5, 2 },{ 57, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 768, 9, 1 },{ 6, 4, 2 }, +{ 37, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 320, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 1920, 11, 1 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 40, 8, 2 },{ 16, 6, 2 },{ 896, 9, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 56, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 46, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 54, 8, 2 },{ 9, 5, 2 },{ 512, 8, 1 },{ 6, 4, 2 }, +{ 36, 8, 2 },{ 128, 5, 1 },{ 52, 8, 2 },{ 15, 6, 2 }, +{ 0, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1728, 9, 1 },{ 5, 4, 2 }, +{ 44, 8, 2 },{ 17, 6, 2 },{ 1408, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 30, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 34, 8, 2 },{ 128, 5, 1 },{ 50, 8, 2 },{ 14, 6, 2 }, +{ 62, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 48, 8, 2 },{ 3, 4, 2 },{ 60, 8, 2 },{ 5, 4, 2 }, +{ 42, 8, 2 },{ 16, 6, 2 },{ 1152, 9, 1 },{ 6, 4, 2 }, +{ 32, 8, 2 },{ 8, 5, 2 },{ 58, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 640, 8, 1 },{ 6, 4, 2 }, +{ 38, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 384, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 0, 0, 0 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 39, 8, 2 },{ 16, 6, 2 },{ 576, 8, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 55, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 45, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 53, 8, 2 },{ 9, 5, 2 },{ 448, 8, 1 },{ 6, 4, 2 }, +{ 35, 8, 2 },{ 128, 5, 1 },{ 51, 8, 2 },{ 15, 6, 2 }, +{ 63, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1472, 9, 1 },{ 5, 4, 2 }, +{ 43, 8, 2 },{ 17, 6, 2 },{ 1216, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 29, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 33, 8, 2 },{ 128, 5, 1 },{ 49, 8, 2 },{ 14, 6, 2 }, +{ 61, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 47, 8, 2 },{ 3, 4, 2 },{ 59, 8, 2 },{ 5, 4, 2 }, +{ 41, 8, 2 },{ 16, 6, 2 },{ 960, 9, 1 },{ 6, 4, 2 }, +{ 31, 8, 2 },{ 8, 5, 2 },{ 57, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 704, 9, 1 },{ 6, 4, 2 }, +{ 37, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 320, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 2240, 12, 1 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 40, 8, 2 },{ 16, 6, 2 },{ 832, 9, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 56, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 46, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 54, 8, 2 },{ 9, 5, 2 },{ 512, 8, 1 },{ 6, 4, 2 }, +{ 36, 8, 2 },{ 128, 5, 1 },{ 52, 8, 2 },{ 15, 6, 2 }, +{ 0, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1600, 9, 1 },{ 5, 4, 2 }, +{ 44, 8, 2 },{ 17, 6, 2 },{ 1344, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 30, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 34, 8, 2 },{ 128, 5, 1 },{ 50, 8, 2 },{ 14, 6, 2 }, +{ 62, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 48, 8, 2 },{ 3, 4, 2 },{ 60, 8, 2 },{ 5, 4, 2 }, +{ 42, 8, 2 },{ 16, 6, 2 },{ 1088, 9, 1 },{ 6, 4, 2 }, +{ 32, 8, 2 },{ 8, 5, 2 },{ 58, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 640, 8, 1 },{ 6, 4, 2 }, +{ 38, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 384, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 0, 0, 0 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 39, 8, 2 },{ 16, 6, 2 },{ 576, 8, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 55, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 45, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 53, 8, 2 },{ 9, 5, 2 },{ 448, 8, 1 },{ 6, 4, 2 }, +{ 35, 8, 2 },{ 128, 5, 1 },{ 51, 8, 2 },{ 15, 6, 2 }, +{ 63, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1536, 9, 1 },{ 5, 4, 2 }, +{ 43, 8, 2 },{ 17, 6, 2 },{ 1280, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 29, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 33, 8, 2 },{ 128, 5, 1 },{ 49, 8, 2 },{ 14, 6, 2 }, +{ 61, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 47, 8, 2 },{ 3, 4, 2 },{ 59, 8, 2 },{ 5, 4, 2 }, +{ 41, 8, 2 },{ 16, 6, 2 },{ 1024, 9, 1 },{ 6, 4, 2 }, +{ 31, 8, 2 },{ 8, 5, 2 },{ 57, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 768, 9, 1 },{ 6, 4, 2 }, +{ 37, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 320, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 2496, 12, 1 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 40, 8, 2 },{ 16, 6, 2 },{ 896, 9, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 56, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 46, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 54, 8, 2 },{ 9, 5, 2 },{ 512, 8, 1 },{ 6, 4, 2 }, +{ 36, 8, 2 },{ 128, 5, 1 },{ 52, 8, 2 },{ 15, 6, 2 }, +{ 0, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1728, 9, 1 },{ 5, 4, 2 }, +{ 44, 8, 2 },{ 17, 6, 2 },{ 1408, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 30, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 34, 8, 2 },{ 128, 5, 1 },{ 50, 8, 2 },{ 14, 6, 2 }, +{ 62, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 48, 8, 2 },{ 3, 4, 2 },{ 60, 8, 2 },{ 5, 4, 2 }, +{ 42, 8, 2 },{ 16, 6, 2 },{ 1152, 9, 1 },{ 6, 4, 2 }, +{ 32, 8, 2 },{ 8, 5, 2 },{ 58, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 640, 8, 1 },{ 6, 4, 2 }, +{ 38, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 384, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 0, 12, -1 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 39, 8, 2 },{ 16, 6, 2 },{ 576, 8, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 55, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 45, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 53, 8, 2 },{ 9, 5, 2 },{ 448, 8, 1 },{ 6, 4, 2 }, +{ 35, 8, 2 },{ 128, 5, 1 },{ 51, 8, 2 },{ 15, 6, 2 }, +{ 63, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1472, 9, 1 },{ 5, 4, 2 }, +{ 43, 8, 2 },{ 17, 6, 2 },{ 1216, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 29, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 33, 8, 2 },{ 128, 5, 1 },{ 49, 8, 2 },{ 14, 6, 2 }, +{ 61, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 47, 8, 2 },{ 3, 4, 2 },{ 59, 8, 2 },{ 5, 4, 2 }, +{ 41, 8, 2 },{ 16, 6, 2 },{ 960, 9, 1 },{ 6, 4, 2 }, +{ 31, 8, 2 },{ 8, 5, 2 },{ 57, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 704, 9, 1 },{ 6, 4, 2 }, +{ 37, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 320, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 1792, 11, 1 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 40, 8, 2 },{ 16, 6, 2 },{ 832, 9, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 56, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 46, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 54, 8, 2 },{ 9, 5, 2 },{ 512, 8, 1 },{ 6, 4, 2 }, +{ 36, 8, 2 },{ 128, 5, 1 },{ 52, 8, 2 },{ 15, 6, 2 }, +{ 0, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1600, 9, 1 },{ 5, 4, 2 }, +{ 44, 8, 2 },{ 17, 6, 2 },{ 1344, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 30, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 34, 8, 2 },{ 128, 5, 1 },{ 50, 8, 2 },{ 14, 6, 2 }, +{ 62, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 48, 8, 2 },{ 3, 4, 2 },{ 60, 8, 2 },{ 5, 4, 2 }, +{ 42, 8, 2 },{ 16, 6, 2 },{ 1088, 9, 1 },{ 6, 4, 2 }, +{ 32, 8, 2 },{ 8, 5, 2 },{ 58, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 640, 8, 1 },{ 6, 4, 2 }, +{ 38, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 384, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 0, 0, 0 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 39, 8, 2 },{ 16, 6, 2 },{ 576, 8, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 55, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 45, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 53, 8, 2 },{ 9, 5, 2 },{ 448, 8, 1 },{ 6, 4, 2 }, +{ 35, 8, 2 },{ 128, 5, 1 },{ 51, 8, 2 },{ 15, 6, 2 }, +{ 63, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1536, 9, 1 },{ 5, 4, 2 }, +{ 43, 8, 2 },{ 17, 6, 2 },{ 1280, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 29, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 33, 8, 2 },{ 128, 5, 1 },{ 49, 8, 2 },{ 14, 6, 2 }, +{ 61, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 47, 8, 2 },{ 3, 4, 2 },{ 59, 8, 2 },{ 5, 4, 2 }, +{ 41, 8, 2 },{ 16, 6, 2 },{ 1024, 9, 1 },{ 6, 4, 2 }, +{ 31, 8, 2 },{ 8, 5, 2 },{ 57, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 768, 9, 1 },{ 6, 4, 2 }, +{ 37, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 320, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 1856, 11, 1 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 40, 8, 2 },{ 16, 6, 2 },{ 896, 9, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 56, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 46, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 54, 8, 2 },{ 9, 5, 2 },{ 512, 8, 1 },{ 6, 4, 2 }, +{ 36, 8, 2 },{ 128, 5, 1 },{ 52, 8, 2 },{ 15, 6, 2 }, +{ 0, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1728, 9, 1 },{ 5, 4, 2 }, +{ 44, 8, 2 },{ 17, 6, 2 },{ 1408, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 30, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 34, 8, 2 },{ 128, 5, 1 },{ 50, 8, 2 },{ 14, 6, 2 }, +{ 62, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 48, 8, 2 },{ 3, 4, 2 },{ 60, 8, 2 },{ 5, 4, 2 }, +{ 42, 8, 2 },{ 16, 6, 2 },{ 1152, 9, 1 },{ 6, 4, 2 }, +{ 32, 8, 2 },{ 8, 5, 2 },{ 58, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 640, 8, 1 },{ 6, 4, 2 }, +{ 38, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 384, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 0, 0, 0 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 39, 8, 2 },{ 16, 6, 2 },{ 576, 8, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 55, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 45, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 53, 8, 2 },{ 9, 5, 2 },{ 448, 8, 1 },{ 6, 4, 2 }, +{ 35, 8, 2 },{ 128, 5, 1 },{ 51, 8, 2 },{ 15, 6, 2 }, +{ 63, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1472, 9, 1 },{ 5, 4, 2 }, +{ 43, 8, 2 },{ 17, 6, 2 },{ 1216, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 29, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 33, 8, 2 },{ 128, 5, 1 },{ 49, 8, 2 },{ 14, 6, 2 }, +{ 61, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 47, 8, 2 },{ 3, 4, 2 },{ 59, 8, 2 },{ 5, 4, 2 }, +{ 41, 8, 2 },{ 16, 6, 2 },{ 960, 9, 1 },{ 6, 4, 2 }, +{ 31, 8, 2 },{ 8, 5, 2 },{ 57, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 704, 9, 1 },{ 6, 4, 2 }, +{ 37, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 320, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 2176, 12, 1 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 40, 8, 2 },{ 16, 6, 2 },{ 832, 9, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 56, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 46, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 54, 8, 2 },{ 9, 5, 2 },{ 512, 8, 1 },{ 6, 4, 2 }, +{ 36, 8, 2 },{ 128, 5, 1 },{ 52, 8, 2 },{ 15, 6, 2 }, +{ 0, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1600, 9, 1 },{ 5, 4, 2 }, +{ 44, 8, 2 },{ 17, 6, 2 },{ 1344, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 30, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 34, 8, 2 },{ 128, 5, 1 },{ 50, 8, 2 },{ 14, 6, 2 }, +{ 62, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 48, 8, 2 },{ 3, 4, 2 },{ 60, 8, 2 },{ 5, 4, 2 }, +{ 42, 8, 2 },{ 16, 6, 2 },{ 1088, 9, 1 },{ 6, 4, 2 }, +{ 32, 8, 2 },{ 8, 5, 2 },{ 58, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 640, 8, 1 },{ 6, 4, 2 }, +{ 38, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 384, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 0, 0, 0 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 39, 8, 2 },{ 16, 6, 2 },{ 576, 8, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 55, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 45, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 53, 8, 2 },{ 9, 5, 2 },{ 448, 8, 1 },{ 6, 4, 2 }, +{ 35, 8, 2 },{ 128, 5, 1 },{ 51, 8, 2 },{ 15, 6, 2 }, +{ 63, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1536, 9, 1 },{ 5, 4, 2 }, +{ 43, 8, 2 },{ 17, 6, 2 },{ 1280, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 29, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 33, 8, 2 },{ 128, 5, 1 },{ 49, 8, 2 },{ 14, 6, 2 }, +{ 61, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 47, 8, 2 },{ 3, 4, 2 },{ 59, 8, 2 },{ 5, 4, 2 }, +{ 41, 8, 2 },{ 16, 6, 2 },{ 1024, 9, 1 },{ 6, 4, 2 }, +{ 31, 8, 2 },{ 8, 5, 2 },{ 57, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 768, 9, 1 },{ 6, 4, 2 }, +{ 37, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 320, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 2432, 12, 1 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 40, 8, 2 },{ 16, 6, 2 },{ 896, 9, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 56, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 46, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 54, 8, 2 },{ 9, 5, 2 },{ 512, 8, 1 },{ 6, 4, 2 }, +{ 36, 8, 2 },{ 128, 5, 1 },{ 52, 8, 2 },{ 15, 6, 2 }, +{ 0, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1728, 9, 1 },{ 5, 4, 2 }, +{ 44, 8, 2 },{ 17, 6, 2 },{ 1408, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 30, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 34, 8, 2 },{ 128, 5, 1 },{ 50, 8, 2 },{ 14, 6, 2 }, +{ 62, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 48, 8, 2 },{ 3, 4, 2 },{ 60, 8, 2 },{ 5, 4, 2 }, +{ 42, 8, 2 },{ 16, 6, 2 },{ 1152, 9, 1 },{ 6, 4, 2 }, +{ 32, 8, 2 },{ 8, 5, 2 },{ 58, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 640, 8, 1 },{ 6, 4, 2 }, +{ 38, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 384, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 0, 0, 0 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 39, 8, 2 },{ 16, 6, 2 },{ 576, 8, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 55, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 45, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 53, 8, 2 },{ 9, 5, 2 },{ 448, 8, 1 },{ 6, 4, 2 }, +{ 35, 8, 2 },{ 128, 5, 1 },{ 51, 8, 2 },{ 15, 6, 2 }, +{ 63, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1472, 9, 1 },{ 5, 4, 2 }, +{ 43, 8, 2 },{ 17, 6, 2 },{ 1216, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 29, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 33, 8, 2 },{ 128, 5, 1 },{ 49, 8, 2 },{ 14, 6, 2 }, +{ 61, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 47, 8, 2 },{ 3, 4, 2 },{ 59, 8, 2 },{ 5, 4, 2 }, +{ 41, 8, 2 },{ 16, 6, 2 },{ 960, 9, 1 },{ 6, 4, 2 }, +{ 31, 8, 2 },{ 8, 5, 2 },{ 57, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 704, 9, 1 },{ 6, 4, 2 }, +{ 37, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 320, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 2048, 12, 1 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 40, 8, 2 },{ 16, 6, 2 },{ 832, 9, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 56, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 46, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 54, 8, 2 },{ 9, 5, 2 },{ 512, 8, 1 },{ 6, 4, 2 }, +{ 36, 8, 2 },{ 128, 5, 1 },{ 52, 8, 2 },{ 15, 6, 2 }, +{ 0, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1600, 9, 1 },{ 5, 4, 2 }, +{ 44, 8, 2 },{ 17, 6, 2 },{ 1344, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 30, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 34, 8, 2 },{ 128, 5, 1 },{ 50, 8, 2 },{ 14, 6, 2 }, +{ 62, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 48, 8, 2 },{ 3, 4, 2 },{ 60, 8, 2 },{ 5, 4, 2 }, +{ 42, 8, 2 },{ 16, 6, 2 },{ 1088, 9, 1 },{ 6, 4, 2 }, +{ 32, 8, 2 },{ 8, 5, 2 },{ 58, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 640, 8, 1 },{ 6, 4, 2 }, +{ 38, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 384, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 0, 0, 0 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 39, 8, 2 },{ 16, 6, 2 },{ 576, 8, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 55, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 45, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 53, 8, 2 },{ 9, 5, 2 },{ 448, 8, 1 },{ 6, 4, 2 }, +{ 35, 8, 2 },{ 128, 5, 1 },{ 51, 8, 2 },{ 15, 6, 2 }, +{ 63, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1536, 9, 1 },{ 5, 4, 2 }, +{ 43, 8, 2 },{ 17, 6, 2 },{ 1280, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 29, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 33, 8, 2 },{ 128, 5, 1 },{ 49, 8, 2 },{ 14, 6, 2 }, +{ 61, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 47, 8, 2 },{ 3, 4, 2 },{ 59, 8, 2 },{ 5, 4, 2 }, +{ 41, 8, 2 },{ 16, 6, 2 },{ 1024, 9, 1 },{ 6, 4, 2 }, +{ 31, 8, 2 },{ 8, 5, 2 },{ 57, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 768, 9, 1 },{ 6, 4, 2 }, +{ 37, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 320, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 1920, 11, 1 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 40, 8, 2 },{ 16, 6, 2 },{ 896, 9, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 56, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 46, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 54, 8, 2 },{ 9, 5, 2 },{ 512, 8, 1 },{ 6, 4, 2 }, +{ 36, 8, 2 },{ 128, 5, 1 },{ 52, 8, 2 },{ 15, 6, 2 }, +{ 0, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1728, 9, 1 },{ 5, 4, 2 }, +{ 44, 8, 2 },{ 17, 6, 2 },{ 1408, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 30, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 34, 8, 2 },{ 128, 5, 1 },{ 50, 8, 2 },{ 14, 6, 2 }, +{ 62, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 48, 8, 2 },{ 3, 4, 2 },{ 60, 8, 2 },{ 5, 4, 2 }, +{ 42, 8, 2 },{ 16, 6, 2 },{ 1152, 9, 1 },{ 6, 4, 2 }, +{ 32, 8, 2 },{ 8, 5, 2 },{ 58, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 640, 8, 1 },{ 6, 4, 2 }, +{ 38, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 384, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 0, 0, 0 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 39, 8, 2 },{ 16, 6, 2 },{ 576, 8, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 55, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 45, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 53, 8, 2 },{ 9, 5, 2 },{ 448, 8, 1 },{ 6, 4, 2 }, +{ 35, 8, 2 },{ 128, 5, 1 },{ 51, 8, 2 },{ 15, 6, 2 }, +{ 63, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1472, 9, 1 },{ 5, 4, 2 }, +{ 43, 8, 2 },{ 17, 6, 2 },{ 1216, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 29, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 33, 8, 2 },{ 128, 5, 1 },{ 49, 8, 2 },{ 14, 6, 2 }, +{ 61, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 47, 8, 2 },{ 3, 4, 2 },{ 59, 8, 2 },{ 5, 4, 2 }, +{ 41, 8, 2 },{ 16, 6, 2 },{ 960, 9, 1 },{ 6, 4, 2 }, +{ 31, 8, 2 },{ 8, 5, 2 },{ 57, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 704, 9, 1 },{ 6, 4, 2 }, +{ 37, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 320, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 2304, 12, 1 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 40, 8, 2 },{ 16, 6, 2 },{ 832, 9, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 56, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 46, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 54, 8, 2 },{ 9, 5, 2 },{ 512, 8, 1 },{ 6, 4, 2 }, +{ 36, 8, 2 },{ 128, 5, 1 },{ 52, 8, 2 },{ 15, 6, 2 }, +{ 0, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1600, 9, 1 },{ 5, 4, 2 }, +{ 44, 8, 2 },{ 17, 6, 2 },{ 1344, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 30, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 34, 8, 2 },{ 128, 5, 1 },{ 50, 8, 2 },{ 14, 6, 2 }, +{ 62, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 48, 8, 2 },{ 3, 4, 2 },{ 60, 8, 2 },{ 5, 4, 2 }, +{ 42, 8, 2 },{ 16, 6, 2 },{ 1088, 9, 1 },{ 6, 4, 2 }, +{ 32, 8, 2 },{ 8, 5, 2 },{ 58, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 640, 8, 1 },{ 6, 4, 2 }, +{ 38, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 384, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 0, 0, 0 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 39, 8, 2 },{ 16, 6, 2 },{ 576, 8, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 55, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 45, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 53, 8, 2 },{ 9, 5, 2 },{ 448, 8, 1 },{ 6, 4, 2 }, +{ 35, 8, 2 },{ 128, 5, 1 },{ 51, 8, 2 },{ 15, 6, 2 }, +{ 63, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1536, 9, 1 },{ 5, 4, 2 }, +{ 43, 8, 2 },{ 17, 6, 2 },{ 1280, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 29, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 33, 8, 2 },{ 128, 5, 1 },{ 49, 8, 2 },{ 14, 6, 2 }, +{ 61, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 47, 8, 2 },{ 3, 4, 2 },{ 59, 8, 2 },{ 5, 4, 2 }, +{ 41, 8, 2 },{ 16, 6, 2 },{ 1024, 9, 1 },{ 6, 4, 2 }, +{ 31, 8, 2 },{ 8, 5, 2 },{ 57, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 768, 9, 1 },{ 6, 4, 2 }, +{ 37, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 320, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 2560, 12, 1 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 20, 7, 2 },{ 128, 5, 1 },{ 24, 7, 2 },{ 14, 6, 2 }, +{ 28, 7, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 23, 7, 2 },{ 3, 4, 2 },{ 27, 7, 2 },{ 5, 4, 2 }, +{ 40, 8, 2 },{ 16, 6, 2 },{ 896, 9, 1 },{ 6, 4, 2 }, +{ 19, 7, 2 },{ 8, 5, 2 },{ 56, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 46, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 54, 8, 2 },{ 9, 5, 2 },{ 512, 8, 1 },{ 6, 4, 2 }, +{ 36, 8, 2 },{ 128, 5, 1 },{ 52, 8, 2 },{ 15, 6, 2 }, +{ 0, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 1728, 9, 1 },{ 5, 4, 2 }, +{ 44, 8, 2 },{ 17, 6, 2 },{ 1408, 9, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 30, 8, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 12, 6, 2 },{ 9, 5, 2 },{ 1664, 6, 1 },{ 6, 4, 2 }, +{ 34, 8, 2 },{ 128, 5, 1 },{ 50, 8, 2 },{ 14, 6, 2 }, +{ 62, 8, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 48, 8, 2 },{ 3, 4, 2 },{ 60, 8, 2 },{ 5, 4, 2 }, +{ 42, 8, 2 },{ 16, 6, 2 },{ 1152, 9, 1 },{ 6, 4, 2 }, +{ 32, 8, 2 },{ 8, 5, 2 },{ 58, 8, 2 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 22, 7, 2 },{ 3, 4, 2 },{ 11, 5, 2 },{ 5, 4, 2 }, +{ 26, 7, 2 },{ 9, 5, 2 },{ 640, 8, 1 },{ 6, 4, 2 }, +{ 38, 8, 2 },{ 128, 5, 1 },{ 25, 7, 2 },{ 15, 6, 2 }, +{ 384, 8, 1 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +{ 13, 6, 2 },{ 3, 4, 2 },{ 18, 7, 2 },{ 5, 4, 2 }, +{ 21, 7, 2 },{ 17, 6, 2 },{ 256, 7, 1 },{ 6, 4, 2 }, +{ 1, 6, 2 },{ 8, 5, 2 },{ 192, 6, 1 },{ 64, 5, 1 }, +{ 10, 5, 2 },{ 4, 4, 2 },{ 2, 4, 2 },{ 7, 4, 2 }, +}; +externaldef (MiArFax1DDecodeBlack) +DecodeG4HuffTableRec MiArFax1DDecodeBlack[G4K_BlackTableSize] = { +{ 1, 12, -1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 15, 9, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 18, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 17, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1792, 11, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 23, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 20, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 25, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 128, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 56, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 30, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1856, 11, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 57, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 21, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 54, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 15, 9, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 52, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 48, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 2112, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 44, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 36, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 384, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 28, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 60, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 40, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 2368, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 16, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 64, 10, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 15, 9, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 18, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 17, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1984, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 50, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 34, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1664, 13, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 26, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1408, 13, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 32, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1920, 11, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 61, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 42, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1024, 13, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 15, 9, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 768, 13, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 62, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 2240, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 46, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 38, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 512, 13, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 19, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 24, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 22, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 2496, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 16, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 64, 10, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 12, -1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 15, 9, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 18, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 17, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1792, 11, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 23, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 20, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 25, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 192, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1280, 13, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 31, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1856, 11, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 58, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 21, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 896, 13, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 15, 9, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 640, 13, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 49, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 2176, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 45, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 37, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 448, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 29, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1536, 13, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 41, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 2432, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 16, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 64, 10, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 15, 9, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 18, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 17, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 2048, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 51, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 35, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 320, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 27, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 59, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 33, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1920, 11, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 256, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 43, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1152, 13, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 15, 9, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 55, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 63, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 2304, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 47, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 39, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 53, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 19, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 24, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 22, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 2560, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 16, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 64, 10, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1, 12, -1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 15, 9, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 18, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 17, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1792, 11, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 23, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 20, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 25, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 128, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 56, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 30, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1856, 11, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 57, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 21, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 54, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 15, 9, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 52, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 48, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 2112, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 44, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 36, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 384, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 28, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 60, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 40, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 2368, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 16, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 64, 10, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 15, 9, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 18, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 17, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1984, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 50, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 34, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1728, 13, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 26, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1472, 13, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 32, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1920, 11, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 61, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 42, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1088, 13, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 15, 9, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 832, 13, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 62, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 2240, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 46, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 38, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 576, 13, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 19, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 24, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 22, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 2496, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 16, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 64, 10, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 12, -1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 15, 9, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 18, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 17, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1792, 11, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 23, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 20, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 25, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 192, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1344, 13, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 31, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1856, 11, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 58, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 21, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 960, 13, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 15, 9, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 704, 13, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 49, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 2176, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 45, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 37, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 448, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 29, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1600, 13, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 41, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 2432, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 16, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 64, 10, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 15, 9, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 18, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 17, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 2048, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 51, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 35, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 320, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 27, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 59, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 33, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1920, 11, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 256, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 43, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 1216, 13, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 15, 9, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 55, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 63, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 2304, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 47, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 39, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 53, 12, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 0, 0 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 13, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 19, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 24, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 22, 11, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 2560, 12, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 10, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 16, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 0, 10, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 64, 10, 1 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 9, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 11, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 14, 8, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 8, 6, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 12, 7, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 6, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +{ 7, 5, 2 },{ 3, 2, 2 },{ 1, 3, 2 },{ 2, 2, 2 }, +{ 5, 4, 2 },{ 3, 2, 2 },{ 4, 3, 2 },{ 2, 2, 2 }, +}; +externaldef (MiArFax2DDecodeTable) +DecodeG4HuffTableRec MiArFax2DDecodeTable[G4K_DecodeTableSize] = { +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 12, -1 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 0, 0, 0 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ -2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 3, 7, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 2, 6, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +{ 4, 4, 2 },{ 0, 1, 2 },{ -1, 3, 2 },{ 0, 1, 2 }, +{ 5, 3, 2 },{ 0, 1, 2 },{ 1, 3, 2 },{ 0, 1, 2 }, +}; +externaldef (MiAr_Fax1dEncodeWhite) +EncodeG4HuffTableRec MiAR_Fax1dEncodeWhite[ENCODE_TABLE_SIZE] = { +{ 0x0008, 0x00AC },{ 0x0006, 0x0038 },{ 0x0004, 0x000E },{ 0x0004, 0x0001 }, +{ 0x0004, 0x000D },{ 0x0004, 0x0003 },{ 0x0004, 0x0007 },{ 0x0004, 0x000F }, +{ 0x0005, 0x0019 },{ 0x0005, 0x0005 },{ 0x0005, 0x001C },{ 0x0005, 0x0002 }, +{ 0x0006, 0x0004 },{ 0x0006, 0x0030 },{ 0x0006, 0x000B },{ 0x0006, 0x002B }, +{ 0x0006, 0x0015 },{ 0x0006, 0x0035 },{ 0x0007, 0x0072 },{ 0x0007, 0x0018 }, +{ 0x0007, 0x0008 },{ 0x0007, 0x0074 },{ 0x0007, 0x0060 },{ 0x0007, 0x0010 }, +{ 0x0007, 0x000A },{ 0x0007, 0x006A },{ 0x0007, 0x0064 },{ 0x0007, 0x0012 }, +{ 0x0007, 0x000C },{ 0x0008, 0x0040 },{ 0x0008, 0x00C0 },{ 0x0008, 0x0058 }, +{ 0x0008, 0x00D8 },{ 0x0008, 0x0048 },{ 0x0008, 0x00C8 },{ 0x0008, 0x0028 }, +{ 0x0008, 0x00A8 },{ 0x0008, 0x0068 },{ 0x0008, 0x00E8 },{ 0x0008, 0x0014 }, +{ 0x0008, 0x0094 },{ 0x0008, 0x0054 },{ 0x0008, 0x00D4 },{ 0x0008, 0x0034 }, +{ 0x0008, 0x00B4 },{ 0x0008, 0x0020 },{ 0x0008, 0x00A0 },{ 0x0008, 0x0050 }, +{ 0x0008, 0x00D0 },{ 0x0008, 0x004A },{ 0x0008, 0x00CA },{ 0x0008, 0x002A }, +{ 0x0008, 0x00AA },{ 0x0008, 0x0024 },{ 0x0008, 0x00A4 },{ 0x0008, 0x001A }, +{ 0x0008, 0x009A },{ 0x0008, 0x005A },{ 0x0008, 0x00DA },{ 0x0008, 0x0052 }, +{ 0x0008, 0x00D2 },{ 0x0008, 0x004C },{ 0x0008, 0x00CC },{ 0x0008, 0x002C }, +{ 0x0005, 0x001B },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0005, 0x0009 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0006, 0x003A },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0007, 0x0076 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0008, 0x006C },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0008, 0x00EC },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0008, 0x0026 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0008, 0x00A6 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0008, 0x0016 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0008, 0x00E6 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0009, 0x0066 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0009, 0x0166 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0009, 0x0096 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0009, 0x0196 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0009, 0x0056 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0009, 0x0156 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0009, 0x00D6 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0009, 0x01D6 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0009, 0x0036 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0009, 0x0136 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0009, 0x00B6 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0009, 0x01B6 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0009, 0x0032 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0009, 0x0132 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0009, 0x00B2 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0006, 0x0006 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0009, 0x01B2 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000B, 0x0080 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000B, 0x0180 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000B, 0x0580 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0480 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0C80 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0280 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0A80 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0680 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0E80 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0380 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0B80 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0780 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0F80 },}; +externaldef (MiAR_Fax1dEncodeBlack) +EncodeG4HuffTableRec MiAR_Fax1dEncodeBlack[ENCODE_TABLE_SIZE] = { +{ 0x000A, 0x03B0 },{ 0x0003, 0x0002 },{ 0x0002, 0x0003 },{ 0x0002, 0x0001 }, +{ 0x0003, 0x0006 },{ 0x0004, 0x000C },{ 0x0004, 0x0004 },{ 0x0005, 0x0018 }, +{ 0x0006, 0x0028 },{ 0x0006, 0x0008 },{ 0x0007, 0x0010 },{ 0x0007, 0x0050 }, +{ 0x0007, 0x0070 },{ 0x0008, 0x0020 },{ 0x0008, 0x00E0 },{ 0x0009, 0x0030 }, +{ 0x000A, 0x03A0 },{ 0x000A, 0x0060 },{ 0x000A, 0x0040 },{ 0x000B, 0x0730 }, +{ 0x000B, 0x00B0 },{ 0x000B, 0x01B0 },{ 0x000B, 0x0760 },{ 0x000B, 0x00A0 }, +{ 0x000B, 0x0740 },{ 0x000B, 0x00C0 },{ 0x000C, 0x0530 },{ 0x000C, 0x0D30 }, +{ 0x000C, 0x0330 },{ 0x000C, 0x0B30 },{ 0x000C, 0x0160 },{ 0x000C, 0x0960 }, +{ 0x000C, 0x0560 },{ 0x000C, 0x0D60 },{ 0x000C, 0x04B0 },{ 0x000C, 0x0CB0 }, +{ 0x000C, 0x02B0 },{ 0x000C, 0x0AB0 },{ 0x000C, 0x06B0 },{ 0x000C, 0x0EB0 }, +{ 0x000C, 0x0360 },{ 0x000C, 0x0B60 },{ 0x000C, 0x05B0 },{ 0x000C, 0x0DB0 }, +{ 0x000C, 0x02A0 },{ 0x000C, 0x0AA0 },{ 0x000C, 0x06A0 },{ 0x000C, 0x0EA0 }, +{ 0x000C, 0x0260 },{ 0x000C, 0x0A60 },{ 0x000C, 0x04A0 },{ 0x000C, 0x0CA0 }, +{ 0x000C, 0x0240 },{ 0x000C, 0x0EC0 },{ 0x000C, 0x01C0 },{ 0x000C, 0x0E40 }, +{ 0x000C, 0x0140 },{ 0x000C, 0x01A0 },{ 0x000C, 0x09A0 },{ 0x000C, 0x0D40 }, +{ 0x000C, 0x0340 },{ 0x000C, 0x05A0 },{ 0x000C, 0x0660 },{ 0x000C, 0x0E60 }, +{ 0x000A, 0x03C0 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0130 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0930 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0DA0 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0CC0 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x02C0 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0AC0 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000D, 0x06C0 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000D, 0x16C0 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000D, 0x0A40 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000D, 0x1A40 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000D, 0x0640 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000D, 0x1640 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000D, 0x09C0 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000D, 0x19C0 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000D, 0x05C0 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000D, 0x15C0 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000D, 0x0DC0 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000D, 0x1DC0 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000D, 0x0940 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000D, 0x1940 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000D, 0x0540 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000D, 0x1540 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000D, 0x0B40 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000D, 0x1B40 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000D, 0x04C0 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000D, 0x14C0 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000B, 0x0080 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000B, 0x0180 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000B, 0x0580 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0480 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0C80 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0280 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0A80 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0680 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0E80 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0380 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0B80 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0780 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 },{ 0x0000, 0x0000 }, +{ 0x000C, 0x0F80 },}; diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiFfx.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiFfx.c new file mode 100644 index 0000000..0361f72 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiFfx.c @@ -0,0 +1,292 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** Lower level routines for finding the first set or clear bit in a +** bit string. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Written for Ultrix by Brian Stevens 26-Sep-1988 +** +** Clean-up and put in library by Michael D. O'Connor 5-Dec-1988 +** +** CREATION DATE: +** +** 5-Dec-1988 +** +************************************************************************/ + +/* +** Table of Contents +*/ +int MiFfsLong(); + +/* +** Include files +*/ +#include + +#include "SmiBitMasks.h" +/* +** Equated Symbols +*/ +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef TRUE +#define TRUE 1 +#endif +/* +** MACRO definitions +*/ +/* + * 1st set/clear bit found, store its position in find_pos and return + * success indicator + */ +#define SUCCESS_(bit) { \ + *find_pos = (long) (((int)pbyte) - base) \ + * BYTE_SIZE + bit; \ + return(TRUE); \ + } \ + +/* + * 1st set/clear bit not found, return a failure indicator (the offset of + * the last bit in the field plus 1 has already been stored in find_pos + */ +#define FAILURE_ {return(FALSE);} + +/* +** Global Symbols +*/ + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/************************************************************************ +** +** MiFfsLong +** +** FUNCTIONAL DESCRIPTION: +** +** Searches the bit field specified by start_pos, size, and base for +** the first set bit +** +** FORMAL PARAMETERS: +** + long start_pos; * starting position (offset) * + long size; * size of the bit field * + long base; * base address of the bit field * + long *find_pos; * returned position of 1st set bit * +** +** IMPLICIT INPUTS: +** +** None +** +** IMPLICIT OUTPUTS: +** +** None +** +** FUNCTION VALUE: +** +** Returns IMG$_NORMAL for success +** +** SIGNAL CODES: +** +** If set bit not found, signals LIB$_NOTFOU +** +** SIDE EFFECTS: +** +** None +** +************************************************************************/ + +int MiFfsLong(start_pos, size, base, find_pos) + long start_pos; /* starting position (offset) */ + long size; /* size of the bit field */ + long base; /* base address of the bit field */ + long *find_pos; /* returned position of 1st set bit */ +{ + char *pbyte; /* address of byte being searched */ + char pbyte_val; /* value of byte being searched */ + int bit; /* position of bit being examined */ + + + *find_pos = start_pos + size; + pbyte = (char *) base + start_pos / BYTE_SIZE; + pbyte_val = *pbyte; + + for (bit=start_pos % BYTE_SIZE; size > 0 && bit < BYTE_SIZE; --size, ++bit) + { + if (pbyte_val & (1 << bit)) SUCCESS_(bit); + } + + for (pbyte++; size >= BYTE_SIZE; size -= BYTE_SIZE, pbyte++) + { + pbyte_val = *pbyte; + + if (pbyte_val & 0x01) SUCCESS_(0); + if (pbyte_val & 0x02) SUCCESS_(1); + if (pbyte_val & 0x04) SUCCESS_(2); + if (pbyte_val & 0x08) SUCCESS_(3); + if (pbyte_val & 0x10) SUCCESS_(4); + if (pbyte_val & 0x20) SUCCESS_(5); + if (pbyte_val & 0x40) SUCCESS_(6); + if (pbyte_val & 0x80) SUCCESS_(7); + } + + pbyte_val = *pbyte; + + for (bit = 0; size > 0; --size, ++bit) + { + if (pbyte_val & (1 << bit)) SUCCESS_(bit); + } + + FAILURE_; +} + +/************************************************************************ +** +** MiFfcLong +** +** FUNCTIONAL DESCRIPTION: +** +** Searches the bit field specified by start_pos, size, and base for +** the first clear bit +** +** FORMAL PARAMETERS: +** + long start_pos; * starting position (offset) * + long size; * size of the bit field * + long base; * base address of the bit field * + long *find_pos; * returned position of 1st set bit * +** +** IMPLICIT INPUTS: +** +** None +** +** IMPLICIT OUTPUTS: +** +** None +** +** FUNCTION VALUE: +** +** Returns IMG$_NORMAL for success +** +** SIGNAL CODES: +** +** If clear bit not found, signals LIB$_NOTFOU +** +** SIDE EFFECTS: +** +** None +** +************************************************************************/ + +int MiFfcLong(start_pos, size, base, find_pos) + long start_pos; /* starting position (offset) */ + long size; /* size of the bit field */ + long base; /* base address of the bit field */ + long *find_pos; /* returned position of 1st clear bit */ +{ + char *pbyte; /* address of byte being searched */ + char pbyte_val; /* value of byte being searched */ + int bit; /* position of bit being examined */ + + *find_pos = start_pos + size; + pbyte = (char *) base + start_pos / BYTE_SIZE; + pbyte_val = ~(*pbyte); + + for (bit=start_pos % BYTE_SIZE; size >= 0 && bit < BYTE_SIZE; --size, ++bit) + { + if (pbyte_val & (1 << bit)) SUCCESS_(bit); + } + + for (pbyte++; size >= BYTE_SIZE; size -= BYTE_SIZE, pbyte++) + { + pbyte_val = ~(*pbyte); + + if (pbyte_val & 0x01) SUCCESS_(0); + if (pbyte_val & 0x02) SUCCESS_(1); + if (pbyte_val & 0x04) SUCCESS_(2); + if (pbyte_val & 0x08) SUCCESS_(3); + if (pbyte_val & 0x10) SUCCESS_(4); + if (pbyte_val & 0x20) SUCCESS_(5); + if (pbyte_val & 0x40) SUCCESS_(6); + if (pbyte_val & 0x80) SUCCESS_(7); + } + + pbyte_val = ~(*pbyte); + + for (bit = 0; size >= 0; --size, ++bit) + { + if (pbyte_val & (1 << bit)) SUCCESS_(bit); + } + + FAILURE_; +} diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiFfx.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiFfx.h new file mode 100644 index 0000000..2aefda0 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiFfx.h @@ -0,0 +1,91 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the Find First X(FFX) module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** +** AUTHOR(S): +** +** Richard Hennessy +** +** CREATION DATE: +** +** September 25, 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMIFFX +#define _SMIFFX + + /* + ** Include files + */ + + /* + ** Function reference + */ +int MiFfsLong(); +int MiFfcLong(); + +#endif +/* _SMIFFX */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiFill.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiFill.c new file mode 100644 index 0000000..4441759 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiFill.c @@ -0,0 +1,1087 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains support for the operation. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** VAX ULTRIX V3.1 +** RISC ULTRIX 3.1 +** +** AUTHORS: +** +** Gary Grebus +** +** CREATION DATE: +** +** Wed Jul 11 10:12:21 1990 +** +*******************************************************************************/ + +#include + +#include "SmiFill.h" + +/* +** Table of contents +*/ +int SmiCreateFill(); +int SmiFill(); +int SmiFillRegion(); + +static int _CvtUnsOpr(); +static int _FillBs(); +static int _FillByt(); +static int _FillFlt(); +static int _FillWrd(); + +static int _FillBsCpp(); +static int _FillBytCpp(); +static int _FillFltCpp(); +static int _FillWrdCpp(); + +static int _FillInitialize(); +static int _FillActivate(); +static int _FillDestroy(); + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* +** Local storage +*/ + /* + ** Fill Element Vector + */ +static PipeElementVector FillPipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeFillElement, /* Structure subtype */ + sizeof(FillPipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _FillInitialize, /* Initialize entry */ + _FillActivate, /* Activate entry */ + NULL, /* Flush entry */ + _FillDestroy, /* Destroy entry */ + NULL /* Abort entry point */ + }; + +/* +** This table describes functions to be called when filling a descriptor type. +*/ +static int (*fill_table[XieK_DATA_TYPE_COUNT])() = + {_FillBs ,_FillBs, _CvtUnsOpr, _CvtUnsOpr, _CvtUnsOpr, _FillByt, _FillFlt, _FillWrd}; + +static int (*fill_table_cpp[XieK_DATA_TYPE_COUNT])() = + {_FillBsCpp ,_FillBsCpp, _CvtUnsOpr, _CvtUnsOpr, _CvtUnsOpr, + _FillBytCpp, _FillFltCpp, _FillWrdCpp}; + + +/***************************************************************************** +** SmiCreateFill +** +** FUNCTIONAL DESCRIPTION: +** +** This function fills in a newly created FILL pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - fill pipeline context +** +** FUNCTION VALUE: +** +** none +** +*****************************************************************************/ +int SmiCreateFill(pipe,src,dst,idcudp,constant) +Pipe pipe; +PipeSinkPtr src; +PipeSinkPtr dst; +UdpPtr idcudp; +unsigned long int constant[XieK_MaxComponents]; +{ + int i; + FillPipeCtxPtr ctx = (FillPipeCtxPtr) + DdxCreatePipeCtx_( pipe, &FillPipeElement, FALSE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + + /* + ** Copy parameters into context block. + */ + FilSrcSnk_(ctx) = src; + FilDstSnk_(ctx) = dst; + if( idcudp == NULL ) + { + /* Roi the entire source */ + FilRoiX1_(ctx) = SnkX1_(src,0); + FilRoiX2_(ctx) = SnkX2_(src,0); + FilRoiY1_(ctx) = SnkY1_(src,0); + FilRoiY2_(ctx) = SnkY2_(src,0); + FilCpp_(ctx) = NULL; + } + else + { + FilRoiX1_(ctx) = idcudp->UdpL_X1; + FilRoiX2_(ctx) = idcudp->UdpL_X2; + FilRoiY1_(ctx) = idcudp->UdpL_Y1; + FilRoiY2_(ctx) = idcudp->UdpL_Y2; + if( idcudp->UdpA_Base == NULL ) + FilCpp_(ctx) = NULL; + else + FilCpp_(ctx) = idcudp; + } + + for( i = 0; i < XieK_MaxComponents && IsPointer_(SnkUdpPtr_(dst,i)); i++ ) + FilConst_(ctx,i) = constant[i] < SnkLvl_(dst,i) + ? constant[i] : SnkLvl_(dst,i) - 1; + + /* + ** Setup one drain from source sink, receiving all components. + */ + FilSrcDrn_(ctx) = DdxRmCreateDrain_( FilSrcSnk_(ctx), -1 ); + if( !IsPointer_(FilSrcDrn_(ctx)) ) return( (int) FilSrcDrn_(ctx) ); + + /* + ** Handle any data type. + */ + DdxRmSetDType_( FilSrcDrn_(ctx), UdpK_DTypeUndefined, DtM_Any ); + DdxRmSetDType_( FilDstSnk_(ctx), UdpK_DTypeUndefined, DtM_Any ); + + return( Success ); +} /* end SmiCreateFill */ + +/***************************************************************************** +** _FillInitialize +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the FILL pipeline element prior to +** an activation. +** +** FORMAL PARAMETERS: +** +** ctx - fill pipeline context +** +** FUNCTION VALUE: +** +** none +** +*****************************************************************************/ +static int _FillInitialize(ctx) +FillPipeCtxPtr ctx; +{ + int dtype, status; + + /* + ** Initialize the source drain. + */ + CtxInp_(ctx) = FilSrcDrn_(ctx); + status = DdxRmInitializePort_( CtxHead_(ctx), FilSrcDrn_(ctx) ); + if( status != Success ) return( status ); + + /* + ** Set our destination sink DType to match our drain and initialize it. + */ + dtype = DdxRmGetDType_( FilSrcDrn_(ctx) ); + DdxRmSetDType_( FilDstSnk_(ctx), dtype, 1< FilRoiY2_(ctx) ) + { /* + ** Entire quantum is outside the ROI + */ + status = DdxRmPutData_( FilDstSnk_(ctx), src ); + src = NULL; + } + else + { + /* The quantum intersects the ROI. Copy the regions outside + * the ROI and fill the region within */ + dst = DdxRmAllocData_( FilDstSnk_(ctx), DatCmpIdx_(src), + DatY1_(src), DatHeight_(src) ); + status = (int) dst; + if( !IsPointer_(dst) ) continue; + + X1 = DatX1_(src) > FilRoiX1_(ctx) ? DatX1_(src) : FilRoiX1_(ctx); + X2 = DatX2_(src) < FilRoiX2_(ctx) ? DatX2_(src) : FilRoiX2_(ctx); + Y1 = DatY1_(src) > FilRoiY1_(ctx) ? DatY1_(src) : FilRoiY1_(ctx); + Y2 = DatY2_(src) < FilRoiY2_(ctx) ? DatY2_(src) : FilRoiY2_(ctx); + + if( DatY1_(src) < Y1 ) + { /* Copy the part of this quantum above the ROI */ + status = DdxCopy_( DatUdpPtr_(src), DatUdpPtr_(dst), 0, 0, + DatX1_(dst), DatY1_(dst), + DatWidth_(src), Y1 - DatY1_(src) ); + if( status != Success ) continue; + } + if( DatX1_(src) < X1 ) + { /* Copy the part of this quantum left of the ROI */ + status = DdxCopy_( DatUdpPtr_(src), DatUdpPtr_(dst), + 0, Y1 - DatY1_(src), + DatX1_(dst), Y1, + X1 - DatX1_(src), Y2 - Y1 + 1); + if( status != Success ) continue; + } + if( DatX2_(src) > X2 ) + { /* Copy the part of this quantum right of the ROI */ + status = DdxCopy_( DatUdpPtr_(src), DatUdpPtr_(dst), + X2 - DatX1_(src)+1, Y1 - DatY1_(src), + X2+1, Y1, + DatX2_(src) - X2, Y2 - Y1 + 1); + if( status != Success ) continue; + } + if( DatY2_(src) > Y2 ) + { /* Copy the part of this quantum below the ROI */ + status = DdxCopy_( DatUdpPtr_(src), DatUdpPtr_(dst), + 0, Y2 - DatY1_(src) + 1, + DatX1_(dst), Y2 + 1, + DatWidth_(src), DatY2_(src) - Y2); + if( status != Success ) continue; + } + /* Fill the intersection of the IDC with this quantum */ + udp = DatUdp_(dst); + udp.UdpL_X1 = X1; + udp.UdpL_X2 = X2; + udp.UdpL_Y1 = Y1; + udp.UdpL_Y2 = Y2; + udp.UdpL_PxlPerScn = udp.UdpL_X2 - udp.UdpL_X1 + 1; + udp.UdpL_ScnCnt = udp.UdpL_Y2 - udp.UdpL_Y1 + 1; + + udp.UdpL_Pos += (udp.UdpL_Y1 - DatY1_(dst)) * udp.UdpL_ScnStride + + (udp.UdpL_X1 - DatX1_(dst)) * udp.UdpL_PxlStride; + + typ = DdxGetTyp_(&udp); + + if( FilCpp_(ctx) == NULL ) + status = (*fill_table[typ]) + (&udp, &FilConst_(ctx,DatCmpIdx_(src))); + else + { + /* Copy the source data to the destination, then fill + * the pixels selected by the CPP. + */ + status = DdxConvert_( DatUdpPtr_(src), &udp, XieK_MoveMode ); + if( status != Success ) continue; + + cppudp = *FilCpp_(ctx); + cppudp.UdpL_Pos += + (udp.UdpL_Y1 - cppudp.UdpL_Y1) * cppudp.UdpL_ScnStride + + (udp.UdpL_X1 - cppudp.UdpL_X1) * cppudp.UdpL_PxlStride; + + status = (*fill_table_cpp[typ]) + (&udp, &cppudp, &FilConst_(ctx,DatCmpIdx_(src))); + } + if( status != Success ) continue; + + status = DdxRmPutData_( FilDstSnk_(ctx), dst ); + dst = NULL; + } + } + return( status ); +} + +/***************************************************************************** +** _FillDestroy +** +** FUNCTIONAL DESCRIPTION: +** +** This routine deallocates all resources allocated by the FILL +** pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - fill pipeline context +** +** FUNCTION VALUE: +** +** none +** +*****************************************************************************/ +static int _FillDestroy(ctx) +FillPipeCtxPtr ctx; +{ + FilSrcDrn_(ctx) = DdxRmDestroyDrain_( FilSrcDrn_(ctx) ); + + return( Success ); +} + +/***************************************************************************** +** SmiFill +** +** FUNCTIONAL DESCRIPTION: +** +** Fill pixels in a UDP as specified by an IDC. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** idcudp - destination IDC +** value - pel fill pattern +** +** FUNCTION VALUE: +** +** none +** +*****************************************************************************/ +int SmiFill( src, dst, idcudp, value ) +UdpPtr src, dst; +UdpPtr idcudp; +unsigned int value; +{ + UdpRec udp; + int typ, status; + unsigned long val; + + /* + ** Allocate the destination image array + */ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } + + /* + * Copy the image. + */ + status = DdxConvert_( src, dst, XieK_MoveMode ); + if( status != Success ) return( status ); + + /* + ** Validate and get type of destination + */ + typ = DdxGetTyp_(dst); + if( typ >= XieK_DATA_TYPE_COUNT ) return( BadImplementation ); + + /* + ** Make a copy of the destination UDP that we can modify. + */ + udp = *dst; + /* + ** Modify the UDP so that is describes only the ROI to receive the fill. + */ + if( idcudp != NULL ) + { + /* If the IDC was supplied, find its intersection with the image */ + udp.UdpL_X1 = idcudp->UdpL_X1 > udp.UdpL_X1 ? + idcudp->UdpL_X1 : udp.UdpL_X1; + udp.UdpL_X2 = idcudp->UdpL_X2 < udp.UdpL_X2 ? + idcudp->UdpL_X2 : udp.UdpL_X2; + udp.UdpL_Y1 = idcudp->UdpL_Y1 > udp.UdpL_Y1 ? + idcudp->UdpL_Y1 : udp.UdpL_Y1; + udp.UdpL_Y2 = idcudp->UdpL_Y2 < udp.UdpL_Y2 ? + idcudp->UdpL_Y2 : udp.UdpL_Y2; + } + udp.UdpL_PxlPerScn = udp.UdpL_X2 - udp.UdpL_X1 + 1; + udp.UdpL_ScnCnt = udp.UdpL_Y2 - udp.UdpL_Y1 + 1; + + udp.UdpL_Pos += (udp.UdpL_Y1 - dst->UdpL_Y1) * udp.UdpL_ScnStride + + (udp.UdpL_X1 - dst->UdpL_X1) * udp.UdpL_PxlStride; + + val = value < udp.UdpL_Levels ? value : udp.UdpL_Levels - 1; + /* + ** Call specific fill routine. + */ + if( idcudp == NULL || idcudp->UdpA_Base == NULL ) + status = (*fill_table[typ])(&udp, &val); + else + status = (*fill_table_cpp[typ])(&udp, idcudp, &val); + + return( status ); +} /* end SmiFill */ + +/***************************************************************************** +** SmiFillRegion +** +** FUNCTIONAL DESCRIPTION: +** +** This is utility style interface to SmiFill. +** +** FORMAL PARAMETERS: +** +** dst - destination data descriptor +** dst_x - Destination X coordinate +** dst_y - Destination Y coordinate +** width - Width of ROI in pels +** height - Height of ROI in pels +** value - pel fill pattern +** +** FUNCTION VALUE: +** +** Standard X status codes. +** +*****************************************************************************/ +int SmiFillRegion( dst, x, y, width, height, value ) +UdpPtr dst; +int x; +int y; +unsigned int width; +unsigned int height; +unsigned int value; +{ + UdpRec udp; + int typ; + unsigned long val; + + /* + * Handle the no-op case. + */ + if (width == 0 || height == 0) + return( Success ); + /* + ** Validate and get type of descriptors + */ + typ = DdxGetTyp_(dst); + if( typ >= XieK_DATA_TYPE_COUNT ) return( BadImplementation ); + /* + ** Make a copy of the destination UDP that we can modify. + */ + udp = *dst; + /* + ** Modify the UDP so that is describes only the ROI to receive the value. + */ + udp.UdpL_X1 = x > udp.UdpL_X1 ? x : udp.UdpL_X1; + udp.UdpL_X2 = x + width - 1 < udp.UdpL_X2 ? x + width - 1 : udp.UdpL_X2; + udp.UdpL_Y1 = y > udp.UdpL_Y1 ? y : udp.UdpL_Y1; + udp.UdpL_Y2 = y + height - 1 < udp.UdpL_Y2 ? y + height - 1 : udp.UdpL_Y2; + + udp.UdpL_PxlPerScn = udp.UdpL_X2 - udp.UdpL_X1 + 1; + udp.UdpL_ScnCnt = udp.UdpL_Y2 - udp.UdpL_Y1 + 1; + + udp.UdpL_Pos += (udp.UdpL_Y1 - dst->UdpL_Y1) * udp.UdpL_ScnStride + + (udp.UdpL_X1 - dst->UdpL_X1) * udp.UdpL_PxlStride; + + val = value < udp.UdpL_Levels ? value : udp.UdpL_Levels - 1; + /* + ** Call specific fill routine. + */ + return( (*fill_table[typ])(&udp, &val) ); +} /* end SmiFillRegion */ + +/***************************************************************************** +** _CvtUnsOpr +** +** FUNCTIONAL DESCRIPTION: +** +** This is an action routine called when conversion from source descriptor +** type to destination descriptor type is not supported. Simply signal an +** error at this point. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** +*****************************************************************************/ +static int _CvtUnsOpr(src, dst) +UdpPtr src; +UdpPtr dst; +{ + return( BadImplementation ); +} + +/***************************************************************************** +** _FillBs +** +** FUNCTIONAL DESCRIPTION: +** +** Fill a region of a bit array with an integer value +** +** FORMAL PARAMETERS: +** +** dst - destination data descriptor +** val - value +** +*****************************************************************************/ +static int _FillBs( dst, val ) +UdpPtr dst; +unsigned long *val; +{ + unsigned long value = *val; + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int dst_scan_offset; + int dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Get destination dimensions. +*/ + X1 = dst->UdpL_X1; + X2 = dst->UdpL_X2; + Y1 = dst->UdpL_Y1; + Y2 = dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + dst_scan_offset = dst->UdpL_Pos; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + dst_offset = dst_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + PUT_VALUE_(dst->UdpA_Base, dst_offset, value, dst_mask); + dst_offset += dst->UdpL_PxlStride; + } + + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _FillByt +** +** FUNCTIONAL DESCRIPTION: +** +** Fill a region of a byte array with an integer value +** +** FORMAL PARAMETERS: +** +** dst - destination data descriptor +** val - value +** +*****************************************************************************/ +static int _FillByt( dst, val ) +UdpPtr dst; +unsigned long *val; +{ + unsigned char value = *val; + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_scan_offset; + int dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Get destination dimensions. +*/ + X1 = dst->UdpL_X1; + X2 = dst->UdpL_X2; + Y1 = dst->UdpL_Y1; + Y2 = dst->UdpL_Y2; + + dst_scan_offset = dst->UdpL_Pos; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + dst_offset = dst_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((unsigned char *)(dst->UdpA_Base + (dst_offset >> 3))) = value; + dst_offset += dst->UdpL_PxlStride; + } + + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + +/***************************************************************************** +** _FillFlt +** +** FUNCTIONAL DESCRIPTION: +** +** Fill a region of a floating array with a floating value +** +** FORMAL PARAMETERS: +** +** dst - destination data descriptor +** val - floating value +** +*****************************************************************************/ +static int _FillFlt( dst, val ) +UdpPtr dst; +float *val; +{ + float value = *val; + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_scan_offset; + int dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Get destination dimensions. +*/ + X1 = dst->UdpL_X1; + X2 = dst->UdpL_X2; + Y1 = dst->UdpL_Y1; + Y2 = dst->UdpL_Y2; + + dst_scan_offset = dst->UdpL_Pos; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + dst_offset = dst_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((float *)(dst->UdpA_Base + (dst_offset >> 3))) = value; + dst_offset += dst->UdpL_PxlStride; + } + + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + + +/***************************************************************************** +** _FillWrd +** +** FUNCTIONAL DESCRIPTION: +** +** Fill a region of a word array with an integer value +** +** FORMAL PARAMETERS: +** +** dst - destination data descriptor +** val - value +** +*****************************************************************************/ +static int _FillWrd( dst, val ) +UdpPtr dst; +unsigned long *val; +{ + unsigned short value = *val; + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_scan_offset; + int dst_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Get destination dimensions. +*/ + X1 = dst->UdpL_X1; + X2 = dst->UdpL_X2; + Y1 = dst->UdpL_Y1; + Y2 = dst->UdpL_Y2; + + dst_scan_offset = dst->UdpL_Pos; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + dst_offset = dst_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + *((unsigned short *)(dst->UdpA_Base + (dst_offset >> 3))) = value; + dst_offset += dst->UdpL_PxlStride; + } + + dst_scan_offset += dst->UdpL_ScnStride; + } + return( Success ); +} + + +/***************************************************************************** +** _FillBsCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Fill a region of a bit array with an integer value, under the +** control of a CPP. +** +** FORMAL PARAMETERS: +** +** dst - destination data descriptor +** cpp - pointer to CPP +** val - value +** +*****************************************************************************/ +static int _FillBsCpp( dst, cpp, val ) +UdpPtr dst; +UdpPtr cpp; +unsigned long *val; +{ + unsigned long value = *val; + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_mask; + int dst_scan_offset; + int dst_offset; + int cpp_scan_offset; + int cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Get destination dimensions. +*/ + X1 = dst->UdpL_X1; + X2 = dst->UdpL_X2; + Y1 = dst->UdpL_Y1; + Y2 = dst->UdpL_Y2; + + dst_mask = (1 << dst->UdpW_PixelLength) - 1; + + dst_scan_offset = dst->UdpL_Pos; + cpp_scan_offset = cpp->UdpL_Pos; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + dst_offset = dst_scan_offset; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) + PUT_VALUE_(dst->UdpA_Base, dst_offset, value, dst_mask); + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} /* end _FillBsCpp */ + + +/***************************************************************************** +** _FillBytCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Fill a region of a byte array with an integer value, under the +** control of a CPP. +** +** FORMAL PARAMETERS: +** +** dst - destination data descriptor +** cpp - pointer to CPP +** val - value +** +*****************************************************************************/ +static int _FillBytCpp( dst, cpp, val ) +UdpPtr dst; +UdpPtr cpp; +unsigned long *val; +{ + unsigned char value = *val; + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_scan_offset; + int dst_offset; + int cpp_scan_offset; + int cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Get destination dimensions. +*/ + X1 = dst->UdpL_X1; + X2 = dst->UdpL_X2; + Y1 = dst->UdpL_Y1; + Y2 = dst->UdpL_Y2; + + dst_scan_offset = dst->UdpL_Pos; + cpp_scan_offset = cpp->UdpL_Pos; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + dst_offset = dst_scan_offset; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) + *((unsigned char *)(dst->UdpA_Base + (dst_offset >> 3))) = + value; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} /* end _FillBytCpp */ + + +/***************************************************************************** +** _FillFltCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Fill a region of a floating array with a floating value, +** under control of a CPP. +** +** FORMAL PARAMETERS: +** +** dst - destination data descriptor +** cpp - pointer to CPP +** val - floating value +** +*****************************************************************************/ +static int _FillFltCpp( dst, cpp, val ) +UdpPtr dst; +UdpPtr cpp; +float *val; +{ + float value = *val; + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_scan_offset; + int dst_offset; + int cpp_scan_offset; + int cpp_offset; +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } +/* +** Get destination dimensions. +*/ + X1 = dst->UdpL_X1; + X2 = dst->UdpL_X2; + Y1 = dst->UdpL_Y1; + Y2 = dst->UdpL_Y2; + + dst_scan_offset = dst->UdpL_Pos; + cpp_scan_offset = cpp->UdpL_Pos; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + dst_offset = dst_scan_offset; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) + *((float *)(dst->UdpA_Base + (dst_offset >> 3))) = value; + + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} /* end _FillFltCpp */ + + +/***************************************************************************** +** _FillWrdCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Fill a region of a word array with an integer value, under the +** control of a CPP. +** +** FORMAL PARAMETERS: +** +** dst - destination data descriptor +** cpp - pointer to CPP +** val - value +** +*****************************************************************************/ +static int _FillWrdCpp( dst, cpp, val ) +UdpPtr dst; +UdpPtr cpp; +unsigned long *val; +{ + unsigned short value = *val; + int pixel; + int scanline; + int X1, Y1, X2, Y2; + int dst_scan_offset; + int dst_offset; + int cpp_scan_offset; + int cpp_offset; + +/* +** Allocate memory for destination buffer. +*/ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } + +/* +** Get destination dimensions. +*/ + X1 = dst->UdpL_X1; + X2 = dst->UdpL_X2; + Y1 = dst->UdpL_Y1; + Y2 = dst->UdpL_Y2; + + dst_scan_offset = dst->UdpL_Pos; + cpp_scan_offset = cpp->UdpL_Pos; + + for( scanline = Y1; scanline <= Y2 ; scanline++ ) + { + dst_offset = dst_scan_offset; + cpp_offset = cpp_scan_offset; + + for( pixel = X1; pixel <= X2; pixel++ ) + { + if (GET_VALUE_(cpp->UdpA_Base, cpp_offset, 1)) + *((unsigned short *)(dst->UdpA_Base + (dst_offset >> 3))) = + value; + dst_offset += dst->UdpL_PxlStride; + cpp_offset += cpp->UdpL_PxlStride; + } + + dst_scan_offset += dst->UdpL_ScnStride; + cpp_scan_offset += cpp->UdpL_ScnStride; + } + return( Success ); +} /* end _FillWrdCpp */ + +/* E N D of S m i F i l l . c */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiFill.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiFill.h new file mode 100644 index 0000000..a43099a --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiFill.h @@ -0,0 +1,136 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the FILL pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.1 +** RISC ULTRIX V3.1 +** +** AUTHOR(S): +** +** Gary Grebus +** +** CREATION DATE: +** +** Wed Jul 11 10:19:08 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMIFILL +#define _SMIFILL + +/* +** Include files +*/ +#include + + /* + ** Function reference + */ +int SmiCreateFill(); +int SmiFill(); +int SmiFillRegion(); + +/* +** Structure definitions and Typedefs +*/ + +/* +** Fill pipeline context block. +*/ +typedef struct _FillPipeCtx { + PipeElementCommonPart common; + struct _FillPart { + PipeSinkPtr src; + PipeSinkPtr dst; + long int x1; + long int x2; + long int y1; + long int y2; + UdpPtr cpp; + unsigned long constant[XieK_MaxComponents]; + PipeDrainPtr srcdrn; + } FillPart; +} FillPipeCtx, *FillPipeCtxPtr; + +/* +** MACRO definitions +*/ + +/* +** Pipeline context, Fill part, access MACROs +*/ +#define FilSrcDrn_(ctx) (((FillPipeCtxPtr)(ctx))->FillPart.srcdrn) +/* +** Fill Parameters +*/ +#define FilSrcSnk_(ctx) (((FillPipeCtxPtr)(ctx))->FillPart.src) +#define FilDstSnk_(ctx) (((FillPipeCtxPtr)(ctx))->FillPart.dst) +#define FilRoiX1_(ctx) (((FillPipeCtxPtr)(ctx))->FillPart.x1) +#define FilRoiX2_(ctx) (((FillPipeCtxPtr)(ctx))->FillPart.x2) +#define FilRoiY1_(ctx) (((FillPipeCtxPtr)(ctx))->FillPart.y1) +#define FilRoiY2_(ctx) (((FillPipeCtxPtr)(ctx))->FillPart.y2) +#define FilCpp_(ctx) (((FillPipeCtxPtr)(ctx))->FillPart.cpp) +#define FilConst_(ctx,comp) (((FillPipeCtxPtr)(ctx))->FillPart.constant[comp]) + +#endif +/* _SMIFILL */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiFloat.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiFloat.c new file mode 100644 index 0000000..6fc24f6 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiFloat.c @@ -0,0 +1,195 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module provides a machine independant mechanism for transporting +** floating point numbers using the X11 Image Extension protocol. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHORS: +** +** Robert NC Shelley +** +** +** CREATION DATE: 25-Aug-1989 +** +*******************************************************************************/ + +/* +** INCLUDE FILES +**/ +#ifndef VXT +#include +#else +#include +#endif +#include /* XIE device dependant definitions */ + +/* +** Table of Contents +*/ +void MiEncodeDouble(); +double MiDecodeDouble(); + + + +/* +** Macro definitions +*/ + /* + ** To convert the mantissa of a 'double' (always < 1.0) to/from the + ** 'XieFloatRec.mantissa' we multiply/divide by this factor + ** ( 2^n, where n is the size in bits of 'XieFloatRec.mantissa' less 1). + ** On the wire the mantissa is shifted left one place for compatibililty + ** with previous protocol versions. + */ +#define Convert_Mantissa_(xiefloatptr) \ + pow(2.0, 8.0*sizeof(xiefloatptr->mantissa)-1.0) + +/* +** External routines +*/ + +/* +** Equated symbols +*/ + +/* +** External symbol definitions. +*/ + +/***************************************************************************** +** MiEncodeDouble +** +** FUNCTIONAL DESCRIPTION: +** +** Encode a double value as XieFloat format. +** +** FORMAL PARAMETERS: +** +** ptr - pointer to XieFloatRec +** value - double value to be encoded +** +*****************************************************************************/ +void MiEncodeDouble( ptr, value ) + XieFloat ptr; + double value; +{ + double mantissa; + int exponent; + + /* + ** Separate out the mantissa and exponent. + */ + mantissa = frexp(value, &exponent); + + /* + ** Encode the mantissa in XieFloat format. + */ + ptr->m_sign = (CARD8) (mantissa >= 0.0); + ptr->mantissa = (CARD32) (Convert_Mantissa_(ptr) + * (ptr->m_sign ? mantissa : -mantissa) + 0.5); + + /* + ** Check/correct for overflow on round-up. + */ + if( (int)(ptr->mantissa) < 0 ) + { + exponent++; + ptr->mantissa = (CARD32) Convert_Mantissa_(ptr); + } + else + ptr->mantissa <<= 1; + + /* + ** Encode the exponent in XieFloat format. + */ + ptr->e_sign = (CARD8) (exponent >= 0); + ptr->exponent = (CARD16) (ptr->e_sign ? exponent : -exponent); +} + +/***************************************************************************** +** MiDecodeDouble +** +** FUNCTIONAL DESCRIPTION: +** +** Decode a double value from XieFloat format. +** +** FORMAL PARAMETERS: +** +** ptr - pointer to XieFloatRec +** +** FUNCTION VALUE: +** +** decoded double value +** +*****************************************************************************/ +double MiDecodeDouble( ptr ) + XieFloat ptr; +{ + /* + ** Reassemble the XieFloatRec into a double value. + */ + return( pow( 2.0, (ptr->e_sign ? 1.0 : -1.0) * ptr->exponent ) + * (ptr->m_sign ? 1.0 : -1.0) + * ((long)ptr->mantissa >> 1) / Convert_Mantissa_(ptr) ); +} diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiHistogram.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiHistogram.c new file mode 100644 index 0000000..1a2a576 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiHistogram.c @@ -0,0 +1,206 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Image Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains code for image data histograms. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** John Weber +** +** CREATION DATE: +** +** December 28, 1989 +** +*****************************************************************************/ + +/* +** Include files +*/ +#include + +#include "SmiHistogram.h" +#include "XieDdx.h" + +/* +** Table of contents +*/ +int SmiHistogram(); + +/* +** MACRO definitions +*/ + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* +** Local Storage +*/ + +/***************************************************************************** +** SmiHistogram +** +** FUNCTIONAL DESCRIPTION: +** +** This function ... +** +** FORMAL PARAMETERS: +** +** src - src udp +** idc - cpp or roi (optional) +** histogram - histogram buffer +** +** FUNCTION VALUE: +** +** Success +** +*****************************************************************************/ +int SmiHistogram( src, idc, histogram ) +UdpPtr src; +UdpPtr idc; +unsigned long histogram[]; +{ + long int scanline; + long int pixel; + + int src_mask = (1 << src->UdpW_PixelLength) - 1; + long int src_scan_offset; + long int src_offset; + + long int cpp_scan_offset; + long int cpp_offset; + + unsigned long value; + long int x1, y1, x2, y2; + + memset( histogram, NULL, src->UdpL_Levels * sizeof(long) ); + + /* Determine the boundaries of the intersection of the image and the + * ROI or CPP (if present). + */ + if( idc == NULL ) + { + x1 = src->UdpL_X1; + x2 = src->UdpL_X2; + y1 = src->UdpL_Y1; + y2 = src->UdpL_Y2; + } + else + { + x1 = src->UdpL_X1 > idc->UdpL_X1 ? src->UdpL_X1 : idc->UdpL_X1; + x2 = src->UdpL_X2 < idc->UdpL_X2 ? src->UdpL_X2 : idc->UdpL_X2; + y1 = src->UdpL_Y1 > idc->UdpL_Y1 ? src->UdpL_Y1 : idc->UdpL_Y1; + y2 = src->UdpL_Y2 < idc->UdpL_Y2 ? src->UdpL_Y2 : idc->UdpL_Y2; + } + src_scan_offset = src->UdpL_Pos + (y1 - src->UdpL_Y1) * src->UdpL_ScnStride + + (x1 - src->UdpL_X1) * src->UdpL_PxlStride; + + if( idc == NULL || idc->UdpA_Base == NULL ) + { + /* Not using a CPP */ + for( scanline = y1; scanline <= y2 ; scanline++ ) + { + src_offset = src_scan_offset; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + value = GET_VALUE_(src->UdpA_Base, src_offset, src_mask); + histogram[value]++; + src_offset += src->UdpL_PxlStride; + } + src_scan_offset += src->UdpL_ScnStride; + } + } + else + { + /* Using a CPP */ + cpp_scan_offset = idc->UdpL_Pos; + + for( scanline = y1; scanline <= y2 ; scanline++ ) + { + src_offset = src_scan_offset; + cpp_offset = cpp_scan_offset; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( GET_VALUE_(idc->UdpA_Base, cpp_offset, 1) ) + { + value = GET_VALUE_(src->UdpA_Base, src_offset, src_mask); + histogram[value]++; + } + src_offset += src->UdpL_PxlStride; + cpp_offset += idc->UdpL_PxlStride; + } + + src_scan_offset += src->UdpL_ScnStride; + cpp_scan_offset += idc->UdpL_ScnStride; + } + } + return( Success ); +} diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiHistogram.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiHistogram.h new file mode 100644 index 0000000..0aaf7ac --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiHistogram.h @@ -0,0 +1,90 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the Histogram module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** +** AUTHOR(S): +** +** Richard Hennessy +** +** CREATION DATE: +** +** September 25, 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMIHISTO +#define _SMIHISTO + + /* + ** Include files + */ +#include /* Get various useful definitions */ + /* + ** Function reference + */ +int SmiHistogram(); + +#endif +/* _SMIHISTO */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiLogical.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiLogical.c new file mode 100644 index 0000000..686b917 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiLogical.c @@ -0,0 +1,1742 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module implements the logical operator which performs +** logical functions between two photomaps. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHORS: +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Fri Apr 20 15:55:27 1990 +** +*******************************************************************************/ + +#include + +#include "SmiLogical.h" + +/* +** Table of contents +*/ +int SmiLogical(); +int SmiCreateLogical(); + +static int _LogicalAbort(); +static int _LogicalInitialize(); +static int _LogicalActivate(); +static int _LogicalFlush(); +static int _LogicalDestroy(); + +static UdpPtr LogicalGetTempUdp(); +static void LogicalDestroyTempUdp(); +static int LogicalConvertScanline(); +static int LogicalStoreScanline(); + +static void LogicalAndII(); +static void LogicalAndIC(); +static void LogicalOrII(); +static void LogicalOrIC(); +static void LogicalXorII(); +static void LogicalXorIC(); +static void LogicalNotII(); +static void LogicalNotIC(); +static void LogicalShiftUpII(); +static void LogicalShiftUpIC(); +static void LogicalShiftDownII(); +static void LogicalShiftDownIC(); + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* +** Local storage +*/ + /* + ** Logical Element Vector + */ +static PipeElementVector LogicalPipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeLogicalElement, /* Structure subtype */ + sizeof(LogicalPipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _LogicalInitialize, /* Initialize entry */ + _LogicalActivate, /* Activate entry */ + _LogicalFlush, /* Flush entry */ + _LogicalDestroy, /* Destroy entry */ + NULL /* Abort entry logical */ + }; + +/* Dispatch tables to select the correct operation routine */ +/* These must match the ordering of the XieK_xxxx constants in XieAppl.h */ +static void (*LogicalTableII[])() = { + NULL, /* Constants start with 1 */ + LogicalAndII, + LogicalOrII, + LogicalXorII, + LogicalNotII, + LogicalShiftUpII, + LogicalShiftDownII, + }; + +static void (*LogicalTableIC[])() = { + NULL, + LogicalAndIC, + LogicalOrIC, + LogicalXorIC, + LogicalNotIC, + LogicalShiftUpIC, + LogicalShiftDownIC, + }; + +/***************************************************************************** +** SmiCreateLogical +** +** FUNCTIONAL DESCRIPTION: +** +** This function fills in a newly created context for a LOGICAL +** pipeline element. +** +** FORMAL PARAMETERS: +** +** pipe - Descriptor for pipe being built.. +** srcsnk1 - Pointer to first source sink +** srcsnk2 - Pointer to second source sink (NULL if no second source) +** constant- Array of "constant image" values (used when srcsnk2==NULL) +** dstsnk - Pointer to destination sink +** idc - Pointer to UDP describing the ROI or CPP (NULL if no IDC) +** operator- Logical operation function code. +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCreateLogical(pipe,srcsnk1,srcsnk2,constant,dstsnk,idc,operator) +Pipe pipe; +PipeSinkPtr srcsnk1; +PipeSinkPtr srcsnk2; +unsigned int constant[XieK_MaxComponents]; +PipeSinkPtr dstsnk; +UdpPtr idc; +int operator; +{ + int i, dtype; + LogicalPipeCtxPtr ctx = (LogicalPipeCtxPtr) + DdxCreatePipeCtx_( pipe, &LogicalPipeElement, FALSE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + /* + ** Copy parameters + */ + LogSrcSnk1_(ctx) = srcsnk1; + LogSrcSnk2_(ctx) = srcsnk2; + LogDstSnk_(ctx) = dstsnk; + + /* See if sink 1 contains word or byte data */ + for(i = 0; i < XieK_MaxComponents && IsPointer_(SnkUdpPtr_(srcsnk1,i)); i++) + if( SnkLvl_(srcsnk1,i) <= 256 ) + dtype = UdpK_DTypeBU; + else + { + dtype = UdpK_DTypeWU; + break; + } + if( dtype == UdpK_DTypeBU ) + /* See if destination sink contains word data */ + for(i=0; i 256 ) + { + dtype = UdpK_DTypeWU; + break; + } + if( IsPointer_(srcsnk2) ) + { + LogFunc_(ctx) = LogicalTableII[operator]; + /* Intersection of two source operands */ + LogRoiX1_(ctx) = SnkX1_(srcsnk2,0) > SnkX1_(srcsnk1,0) ? + SnkX1_(srcsnk2,0) : SnkX1_(srcsnk1,0); + LogRoiX2_(ctx) = SnkX2_(srcsnk2,0) < SnkX2_(srcsnk1,0) ? + SnkX2_(srcsnk2,0) : SnkX2_(srcsnk1,0); + LogRoiY1_(ctx) = SnkY1_(srcsnk2,0) > SnkY1_(srcsnk1,0) ? + SnkY1_(srcsnk2,0) : SnkY1_(srcsnk1,0); + LogRoiY2_(ctx) = SnkY2_(srcsnk2,0) < SnkY2_(srcsnk1,0) ? + SnkY2_(srcsnk2,0) : SnkY2_(srcsnk1,0); + if( dtype == UdpK_DTypeBU ) + /* See if sink 2 contains word data */ + for(i=0;i 256 ) + { + dtype = UdpK_DTypeWU; + break; + } + /* Create a drain on sink 2, process a quantum of 1 scanline */ + LogSrcDrn2_(ctx) = DdxRmCreateDrain_( LogSrcSnk2_(ctx), -1 ); + if( !IsPointer_(LogSrcDrn2_(ctx)) ) return( (int) LogSrcDrn2_(ctx)); + DdxRmSetDType_( LogSrcDrn2_(ctx), dtype, 1<UdpA_Base) ? idc : NULL; + + if( IsPointer_(idc) ) + { + /* Further restrict the area to be processed with the CPP/ROI */ + LogRoiX1_(ctx) = idc->UdpL_X1 > LogRoiX1_(ctx) ? + idc->UdpL_X1 : LogRoiX1_(ctx); + LogRoiX2_(ctx) = idc->UdpL_X2 < LogRoiX2_(ctx) ? + idc->UdpL_X2 : LogRoiX2_(ctx); + LogRoiY1_(ctx) = idc->UdpL_Y1 > LogRoiY1_(ctx) ? + idc->UdpL_Y1 : LogRoiY1_(ctx); + LogRoiY2_(ctx) = idc->UdpL_Y2 < LogRoiY2_(ctx) ? + idc->UdpL_Y2 : LogRoiY2_(ctx); + } + LogSrcData1_(ctx) = NULL; + LogSrcData2_(ctx) = NULL; + + /* Create a drain on sink 1, process a quantum of 1 scanline */ + LogSrcDrn1_(ctx) = DdxRmCreateDrain_( LogSrcSnk1_(ctx), -1 ); + if( !IsPointer_(LogSrcDrn1_(ctx)) ) return( (int) LogSrcDrn1_(ctx)); + DdxRmSetDType_( LogSrcDrn1_(ctx), dtype, 1< LogRoiY2_(ctx) ) + { + /* Scanline is outside the ROI - just pass it through */ + status = DdxRmPutData_( LogDstSnk_(ctx), src1 ); + src1 = NULL; + } + else + { + dst = DdxRmAllocData_( LogDstSnk_(ctx), DatCmpIdx_(src1), + DatY1_(src1), DatHeight_(src1) ); + status = (int) dst; + if( !IsPointer_(dst) ) continue; + + /* Copy the portions of this line outside the ROI */ + status = DdxCopy_( DatUdpPtr_(src1), /* Left */ + DatUdpPtr_(dst), + DatX1_(src1), 0, + DatX1_(dst), DatY1_(dst), + LogRoiX1_(ctx) - DatX1_(src1), 1 ); + if( status != Success ) continue; + + status = DdxCopy_( DatUdpPtr_(src1), /* Right */ + DatUdpPtr_(dst), + LogRoiX2_(ctx)+1, 0, + LogRoiX2_(ctx)+1, DatY1_(dst), + DatX2_(src1) - LogRoiX2_(ctx), 1 ); + if( status != Success ) continue; + + DatPos_(src1) += + (LogRoiX1_(ctx) - DatX1_(src1)) * DatPxlStr_(src1); + dstpos = DatPos_(dst); + DatPos_(dst) += + (LogRoiX1_(ctx) - DatX1_(dst)) * DatPxlStr_(dst);; + + (*LogFunc_(ctx))(DatUdpPtr_(src1), + LogConst_(ctx,DatCmpIdx_(src1)), + DatUdpPtr_(dst), + LogCpp_(ctx), + LogRoiY1_(ctx), + LogRoiX1_(ctx), + LogRoiX2_(ctx)); + + DatPos_(dst) = dstpos; + status = DdxRmPutData_( LogDstSnk_(ctx), dst ); + dst = NULL; + } + } + + else + /* Operating between two images */ + for( status = Success; status == Success; + LogSrcData1_(ctx) = DdxRmDeallocData_(LogSrcData1_(ctx)), + LogSrcData2_(ctx) = DdxRmDeallocData_(LogSrcData2_(ctx)), + dst = DdxRmDeallocData_(dst) ) + { + if( LogSrcData1_(ctx) == NULL ) + { + LogSrcData1_(ctx) = DdxRmGetData_( ctx, LogSrcDrn1_(ctx) ); + if( !IsPointer_(LogSrcData1_(ctx)) ) + return((int)LogSrcData1_(ctx)); + } + src1 = LogSrcData1_(ctx); + + if( DatY1_(src1) <= LogRoiY2_(ctx) ) + { + /* Keep the two streams synchronized as long as we still + * need src2 data */ + if( LogSrcData2_(ctx) == NULL ) + { + LogSrcData2_(ctx) = DdxRmGetData_( ctx, LogSrcDrn2_(ctx) ); + if( !IsPointer_(LogSrcData2_(ctx)) ) + return((int)LogSrcData2_(ctx)); + } + src2 = LogSrcData2_(ctx); + } + if( DatY1_(src1) < LogRoiY1_(ctx) || DatY1_(src1) > LogRoiY2_(ctx) ) + { + /* Scanline is outside the ROI - just pass it through */ + status = DdxRmPutData_( LogDstSnk_(ctx), src1 ); + LogSrcData1_(ctx) = NULL; + } + else + { + dst = DdxRmAllocData_( LogDstSnk_(ctx), DatCmpIdx_(src1), + DatY1_(src1), DatHeight_(src1) ); + status = (int) dst; + if( !IsPointer_(dst) ) continue; + + /* Copy the portions of this line outside the ROI */ + status = DdxCopy_( DatUdpPtr_(src1), /* Left */ + DatUdpPtr_(dst), + DatX1_(src1), 0, + DatX1_(dst), DatY1_(dst), + LogRoiX1_(ctx) - DatX1_(src1), 1 ); + if( status != Success ) continue; + + status = DdxCopy_( DatUdpPtr_(src1), /* Right */ + DatUdpPtr_(dst), + LogRoiX2_(ctx)+1, 0, + LogRoiX2_(ctx)+1, DatY1_(dst), + DatX2_(src1) - LogRoiX2_(ctx), 1 ); + if( status != Success ) continue; + + DatPos_(src1) += + (LogRoiX1_(ctx) - DatX1_(src1)) * DatPxlStr_(src1); + DatPos_(src2) += + (LogRoiX1_(ctx) - DatX1_(src2)) * DatPxlStr_(src2); + dstpos = DatPos_(dst); + DatPos_(dst) += + (LogRoiX1_(ctx) - DatX1_(dst)) * DatPxlStr_(dst);; + + (*LogFunc_(ctx))(DatUdpPtr_(src1), + DatUdpPtr_(src2), + DatUdpPtr_(dst), + LogCpp_(ctx), + LogRoiY1_(ctx), + LogRoiX1_(ctx), + LogRoiX2_(ctx)); + + DatPos_(dst) = dstpos; + status = DdxRmPutData_( LogDstSnk_(ctx), dst ); + dst = NULL; + } + } /* end for */ + return( status ); +} + +/***************************************************************************** +** _LogicalFlush +** +** FUNCTIONAL DESCRIPTION: +** +** This routine is called when all preceding pipeline stages have +** completed. +** +** +** FORMAL PARAMETERS: +** +** ctx - logical pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _LogicalFlush(ctx) +LogicalPipeCtxPtr ctx; +{ + PipeDataPtr src2; + + _LogicalAbort(ctx); + + /* If the image on drain 2 has more scanlines that the image on drain 1 + * we will have unprocessed scanlines on drain 2. Flush them. + */ + if( IsPointer_(LogSrcSnk2_(ctx)) ) + while((src2 = DdxRmGetData_( ctx, LogSrcDrn2_(ctx) )) != NULL ) + { + if( !IsPointer_(src2) ) return( (int) src2 ); + DdxRmDeallocData_( src2 ); + } + return( Success ); +} + +/***************************************************************************** +** _LogicalAbort +** +** FUNCTIONAL DESCRIPTION: +** +** This routine is called when all preceding pipeline stages have +** completed. +** +** FORMAL PARAMETERS: +** +** ctx - logical pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _LogicalAbort(ctx) +LogicalPipeCtxPtr ctx; +{ + if( IsPointer_(LogSrcData1_(ctx)) ) + LogSrcData1_(ctx) = DdxRmDeallocData_( LogSrcData1_(ctx) ); + if( IsPointer_(LogSrcData2_(ctx)) ) + LogSrcData2_(ctx) = DdxRmDeallocData_( LogSrcData2_(ctx) ); + + return( Success ); +} + +/***************************************************************************** +** _LogicalDestroy +** +** FUNCTIONAL DESCRIPTION: +** +** This routine deallocates all resources allocated by the LOGICAL +** pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - logical pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _LogicalDestroy(ctx) +LogicalPipeCtxPtr ctx; +{ + int i; + + LogSrcDrn1_(ctx) = DdxRmDestroyDrain_( LogSrcDrn1_(ctx) ); + if (LogSrcSnk2_(ctx) != NULL) + LogSrcDrn2_(ctx) = DdxRmDestroyDrain_( LogSrcDrn2_(ctx) ); + + return( Success ); +} + +/***************************************************************************** +** SmiLogical +** +** FUNCTIONAL DESCRIPTION: +** +** This routine performs a non-pipelined logical operator, which +** performs an logical operator between two photomaps, or between +** a photomap and a constant. +** +** FORMAL PARAMETERS: +** +** srcudp1 - Pointer to a UDP describing the first source operand. +** srcudp2 - Pointer to a UDP describing the second source operand. +** constant- Array of constants supplied if srcudp2 is NULL. +** dstudp - Pointer to a UDP describing the destination buffer. +** idc - Pointer to a UDP describing the Region of Interest, +** or Control Processing Plane. +** (NULL if no IDC) +** operator-Code for the operation being performed. +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiLogical( srcudp1, srcudp2, constant, dstudp, idc, operator ) +UdpPtr srcudp1; +UdpPtr srcudp2; +unsigned int constant[]; +UdpPtr dstudp; +UdpPtr idc; +int operator; + +{ + UdpPtr cpp, src1 = NULL, src2 = NULL, dst = NULL; + long int dtype, pixels, scanline, status; + long int X1, X2, Y1, Y2; /* src/destination common bounds */ + long int x1, x2, y1, y2; /* src/destination/ROI common bounds */ + + /* + ** Allocate the destination image array + */ + if( dstudp->UdpA_Base == NULL ) + { + dstudp->UdpA_Base = DdxMallocBits_( dstudp->UdpL_ArSize ); + if( dstudp->UdpA_Base == NULL ) return( BadAlloc ); + } + /* + ** Determine maximum common dimensions between source1 and destination, + ** which is the defined region of output. + */ + X1 = srcudp1->UdpL_X1 > dstudp->UdpL_X1 ? + srcudp1->UdpL_X1 : dstudp->UdpL_X1; + X2 = srcudp1->UdpL_X2 < dstudp->UdpL_X2 ? + srcudp1->UdpL_X2 : dstudp->UdpL_X2; + Y1 = srcudp1->UdpL_Y1 > dstudp->UdpL_Y1 ? + srcudp1->UdpL_Y1 : dstudp->UdpL_Y1; + Y2 = srcudp1->UdpL_Y2 < dstudp->UdpL_Y2 ? + srcudp1->UdpL_Y2 : dstudp->UdpL_Y2; + /* + ** Restrict the area to be processed by finding the intersection of + ** the region of output and the second source operand (if used). + */ + if( IsPointer_(srcudp2) ) + { + x1 = srcudp2->UdpL_X1 > X1 ? srcudp2->UdpL_X1 : X1; + x2 = srcudp2->UdpL_X2 < X2 ? srcudp2->UdpL_X2 : X2; + y1 = srcudp2->UdpL_Y1 > Y1 ? srcudp2->UdpL_Y1 : Y1; + y2 = srcudp2->UdpL_Y2 < Y2 ? srcudp2->UdpL_Y2 : Y2; + } + else + { + x1 = X1; x2 = X2; + y1 = Y1; y2 = Y2; + } + /* + * Further restrict the area to be processed by finding the intersection + * with the IDC (ROI or CPP). + */ + if( IsPointer_(idc) ) + { + x1 = idc->UdpL_X1 > x1 ? idc->UdpL_X1 : x1; + x2 = idc->UdpL_X2 < x2 ? idc->UdpL_X2 : x2; + y1 = idc->UdpL_Y1 > y1 ? idc->UdpL_Y1 : y1; + y2 = idc->UdpL_Y2 < y2 ? idc->UdpL_Y2 : y2; + } + cpp = IsPointer_(idc) && IsPointer_(idc->UdpA_Base) ? idc : NULL; + dtype = dstudp->UdpL_Levels > 256 || srcudp1->UdpL_Levels > 256 + || IsPointer_(srcudp2) && srcudp2->UdpL_Levels > 256 + ? UdpK_DTypeWU : UdpK_DTypeBU; + /* Allocate and init temporary UDP's to hold one scanline of data */ + src1 = LogicalGetTempUdp( srcudp1, dtype, y1, x1, x2 ); + if( !IsPointer_(src1) ) + { + status = (int) src1; + goto clean_up; + } + if( IsPointer_(srcudp2) ) + { + src2 = LogicalGetTempUdp( srcudp2, dtype, y1, x1, x2 ); + if( !IsPointer_(src2) ) + { + status = (int) src2; + goto clean_up; + } + } + dst = LogicalGetTempUdp( dstudp, dtype, y1, x1, x2 ); + if( !IsPointer_(dst) ) + { + status = (int) dst; + goto clean_up; + } + + /* Just copy the scanlines outside of the ROI */ + /* Top */ + status = DdxCopy_( srcudp1, dstudp, X1, Y1, X1, Y1, X2-X1+1, y1-Y1 ); + if( status != Success ) goto clean_up; + /* Bottom */ + status = DdxCopy_( srcudp1, dstudp, X1, y2+1, X1, y2+1, X2-X1+1, Y2-y2 ); + if( status != Success ) goto clean_up; + /* Left */ + status = DdxCopy_( srcudp1, dstudp, X1, y1, X1, y1, x1-X1, y2-y1+1 ); + if( status != Success ) goto clean_up; + /* Right */ + status = DdxCopy_( srcudp1, dstudp, x2+1, y1, x2+1, y1, X2-x2, y2-y1+1 ); + if( status != Success ) goto clean_up; + + /* If the temporary UDP's are pointing to the original data, position + * to the correct offset. + */ + if( src1->UdpA_Base == srcudp1->UdpA_Base ) + src1->UdpL_Pos = srcudp1->UdpL_Pos + srcudp1->UdpL_ScnStride * y1 + + srcudp1->UdpL_PxlStride * + (x1 - srcudp1->UdpL_X1); + + if( srcudp2 != NULL && src2->UdpA_Base == srcudp2->UdpA_Base ) + src2->UdpL_Pos = srcudp2->UdpL_Pos + y1 * srcudp2->UdpL_ScnStride + + (x1 - srcudp2->UdpL_X1) * srcudp2->UdpL_PxlStride; + + dst->UdpL_Y1 = dst->UdpL_Y2 = y1; + if( dst->UdpA_Base == dstudp->UdpA_Base ) + dst->UdpL_Pos = dstudp->UdpL_Pos + y1 * dstudp->UdpL_ScnStride + + (x1 - dstudp->UdpL_X1) * dstudp->UdpL_PxlStride; + + /* Now perform the logical operation over the region-of-interest */ + if( IsPointer_(srcudp2) ) + /* Image-to-image operation */ + for( scanline = y1; scanline <= y2 && status == Success; scanline++ ) + { + /* Get a UDP pointing to this scanline */ + status = LogicalConvertScanline(srcudp1, src1, dtype); + if( status != Success ) break; + status = LogicalConvertScanline(srcudp2, src2, dtype); + if( status != Success ) break; + + (*LogicalTableII[operator])(src1, src2, + dst, + cpp, y1, x1, x2); + status = LogicalStoreScanline(dst, dstudp); + } + else + /* Image-to-constant operation */ + for( scanline = y1; scanline <= y2 && status == Success; scanline++ ) + { + /* Get a UDP pointing to this scanline */ + status = LogicalConvertScanline(srcudp1, src1, dtype); + if( status != Success ) break; + + (*LogicalTableIC[operator])(src1, constant[src1->UdpL_CompIdx], + dst, + cpp, y1, x1, x2); + + status = LogicalStoreScanline(dst, dstudp); + } + + /* Cleanup the temporary descriptors */ +clean_up : + if( IsPointer_(src1) ) + LogicalDestroyTempUdp( src1, srcudp1 ); + if( IsPointer_(src2) ) + LogicalDestroyTempUdp( src2, srcudp2 ); + if( IsPointer_(dst) ) + LogicalDestroyTempUdp( dst, dstudp ); + + return( status); +} /* end SmiLogical */ + +/***************************************************************************** +** Logical processing routines +** +** FUNCTIONAL DESCRIPTION: +** +** These routines perform the actual logical operation over selected +** portion of a scanline. A separate routine is used for each +** type of operation. +** +** FORMAL PARAMETERS: +** +** src1 - Pointer to a UDP describing the first source operand. +** src2 - Pointer to a UDP describing the second source operand. +** const - Constant "image" value if image-to-constant. +** dst - Pointer to a UDP describing the destination buffer. +** cpp - Pointer to a UDP describing the Control Processing Plane. +** (NULL if no CPP) +** y1 - The y corrdinate of the beginning of the region to +* process. +** x1 - The x coordinate of the left endpoint of the CPP, or +** the ROI. +** x2 - The x coordinate of the right endpoint of the CPP, or +** the ROI. +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static void LogicalAndII(src1, src2, dst, cpp, y1, x1, x2) +UdpPtr src1; +UdpPtr src2; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + unsigned char *src1ptr; + unsigned char *src2ptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + int src1bytes = src1->UdpL_PxlStride >> 3; + int src2bytes = src2->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + src1ptr = src1->UdpA_Base + (src1->UdpL_Pos >> 3); + src2ptr = src2->UdpA_Base + (src2->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if( cpp != NULL ) + cpppxloff = cpp->UdpL_Pos + cpp->UdpL_ScnStride * (src1->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + if( dst->UdpB_DType == UdpK_DTypeBU ) + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff += cpp->UdpL_PxlStride; + } + if( cppbit ) + *dstptr = *src1ptr & *src2ptr; + else + *dstptr = *src1ptr; /* Not selected by CPP */ + + src1ptr += src1bytes; + src2ptr += src2bytes; + dstptr += dstbytes; + } + else + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff += cpp->UdpL_PxlStride; + } + if( cppbit ) + *((unsigned short *)dstptr) = *((unsigned short *)src1ptr) + & *((unsigned short *)src2ptr); + else /* Not selected by CPP */ + *((unsigned short *)dstptr) = *((unsigned short *)src1ptr); + + src1ptr += src1bytes; + src2ptr += src2bytes; + dstptr += dstbytes; + } +} /* end LogicalAndII */ + +static void LogicalOrII(src1, src2, dst, cpp, y1, x1, x2) +UdpPtr src1; +UdpPtr src2; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + unsigned long value, max = dst->UdpL_Levels-1; + unsigned char *src1ptr; + unsigned char *src2ptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + int src1bytes = src1->UdpL_PxlStride >> 3; + int src2bytes = src2->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + src1ptr = src1->UdpA_Base + (src1->UdpL_Pos >> 3); + src2ptr = src2->UdpA_Base + (src2->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if( cpp != NULL ) + cpppxloff = cpp->UdpL_Pos + cpp->UdpL_ScnStride * (src1->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + if( dst->UdpB_DType == UdpK_DTypeBU ) + for (pixel = x1; pixel <= x2; pixel++) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + if( cppbit ) + { + value = *src1ptr | *src2ptr; + *dstptr = value <= max ? value : max; + } + else + *dstptr = *src1ptr; /* Not selected by CPP */ + + src1ptr += src1bytes; + src2ptr += src2bytes; + dstptr += dstbytes; + } + else + for (pixel = x1; pixel <= x2; pixel++) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + if( cppbit ) + { + value = *((unsigned short *)src1ptr) + | *((unsigned short *)src2ptr); + *((unsigned short *)dstptr) = value <= max ? value : max; + } + else /* Not selected by CPP */ + *((unsigned short *)dstptr) = *((unsigned short *)src1ptr); + + src1ptr += src1bytes; + src2ptr += src2bytes; + dstptr += dstbytes; + } +} /* end LogicalOrII */ + +static void LogicalXorII(src1, src2, dst, cpp, y1, x1, x2) +UdpPtr src1; +UdpPtr src2; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + unsigned long value, max = dst->UdpL_Levels-1; + unsigned char *src1ptr; + unsigned char *src2ptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + int src1bytes = src1->UdpL_PxlStride >> 3; + int src2bytes = src2->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + src1ptr = src1->UdpA_Base + (src1->UdpL_Pos >> 3); + src2ptr = src2->UdpA_Base + (src2->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if( cpp != NULL ) + cpppxloff = cpp->UdpL_Pos + cpp->UdpL_ScnStride * (src1->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + if( dst->UdpB_DType == UdpK_DTypeBU ) + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff += cpp->UdpL_PxlStride; + } + if( cppbit ) + { + value = *src1ptr ^ *src2ptr; + *dstptr = value <= max ? value : max; + } + else + *dstptr = *src1ptr; /* Not selected by CPP */ + + src1ptr += src1bytes; + src2ptr += src2bytes; + dstptr += dstbytes; + } + else + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff += cpp->UdpL_PxlStride; + } + if( cppbit ) + { + value = *((unsigned short *)src1ptr) + ^ *((unsigned short *)src2ptr); + *((unsigned short *)dstptr) = value <= max ? value : max; + } + else /* Not selected by CPP */ + *((unsigned short *)dstptr) = *((unsigned short *)src1ptr); + + src1ptr += src1bytes; + src2ptr += src2bytes; + dstptr += dstbytes; + } +} /* end LogicalXorII */ + +static void LogicalNotII(src1, src2, dst, cpp, y1, x1, x2) +UdpPtr src1; +UdpPtr src2; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + /* Since NOT is a unary operation, we just ignore the second + * operand. + */ + int pixel; + unsigned long value, max = dst->UdpL_Levels-1; + unsigned char *src1ptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + int src1bytes = src1->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + src1ptr = src1->UdpA_Base + (src1->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if( cpp != NULL ) + cpppxloff = cpp->UdpL_Pos + cpp->UdpL_ScnStride * (src1->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + if( dst->UdpB_DType == UdpK_DTypeBU ) + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff += cpp->UdpL_PxlStride; + } + if( cppbit ) + { + value = ~(*src1ptr); + *dstptr = value <= max ? value : max; + } + else + *dstptr = *src1ptr; /* Not selected by CPP */ + + src1ptr += src1bytes; + dstptr += dstbytes; + } + else + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff += cpp->UdpL_PxlStride; + } + if( cppbit ) + { + value = ~(*((unsigned short *)src1ptr)); + *((unsigned short *)dstptr) = value <= max ? value : max; + } + else /* Not selected by CPP */ + *((unsigned short *)dstptr) = *((unsigned short *)src1ptr); + + src1ptr += src1bytes; + dstptr += dstbytes; + } +} /* end LogicalNotII */ + +static void LogicalShiftUpII(src1, src2, dst, cpp, y1, x1, x2) +UdpPtr src1; +UdpPtr src2; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + unsigned long value, max = dst->UdpL_Levels-1; + unsigned char *src1ptr; + unsigned char *src2ptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + int src1bytes = src1->UdpL_PxlStride >> 3; + int src2bytes = src2->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + src1ptr = src1->UdpA_Base + (src1->UdpL_Pos >> 3); + src2ptr = src2->UdpA_Base + (src2->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if( cpp != NULL ) + cpppxloff = cpp->UdpL_Pos + cpp->UdpL_ScnStride * (src1->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + if( dst->UdpB_DType == UdpK_DTypeBU ) + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff += cpp->UdpL_PxlStride; + } + if( cppbit ) + { + value = *src1ptr << *src2ptr; + *dstptr = value <= max ? value : max; + } + else + *dstptr = *src1ptr; /* Not selected by CPP */ + + src1ptr += src1bytes; + src2ptr += src2bytes; + dstptr += dstbytes; + } + else + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff += cpp->UdpL_PxlStride; + } + if( cppbit ) + { + value = *((unsigned short *)src1ptr) + << *((unsigned short *)src2ptr); + *((unsigned short *)dstptr) = value <= max ? value : max; + } + else /* Not selected by CPP */ + *((unsigned short *)dstptr) = *((unsigned short *)src1ptr); + + src1ptr += src1bytes; + src2ptr += src2bytes; + dstptr += dstbytes; + } +} /* end LogicalShiftUpII */ + +static void LogicalShiftDownII(src1, src2, dst, cpp, y1, x1, x2) +UdpPtr src1; +UdpPtr src2; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + unsigned char *src1ptr; + unsigned char *src2ptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + int src1bytes = src1->UdpL_PxlStride >> 3; + int src2bytes = src2->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + src1ptr = src1->UdpA_Base + (src1->UdpL_Pos >> 3); + src2ptr = src2->UdpA_Base + (src2->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if( cpp != NULL ) + cpppxloff = cpp->UdpL_Pos + cpp->UdpL_ScnStride * (src1->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + if( dst->UdpB_DType == UdpK_DTypeBU ) + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff += cpp->UdpL_PxlStride; + } + if( cppbit ) + *dstptr = *src1ptr >> *src2ptr; + else + *dstptr = *src1ptr; /* Not selected by CPP */ + + src1ptr += src1bytes; + src2ptr += src2bytes; + dstptr += dstbytes; + } + else + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff += cpp->UdpL_PxlStride; + } + if( cppbit ) + *((unsigned short *)dstptr) = *((unsigned short *)src1ptr) + >> *((unsigned short *)src2ptr); + else /* Not selected by CPP */ + *((unsigned short *)dstptr) = *((unsigned short *)src1ptr); + + src1ptr += src1bytes; + src2ptr += src2bytes; + dstptr += dstbytes; + } +} /* end LogicalShiftDownII */ + +static void LogicalAndIC(src, constant, dst, cpp, y1, x1, x2) + UdpPtr src; + unsigned long int constant; + UdpPtr dst; + UdpPtr cpp; + long int y1; + long int x1; + long int x2; +{ + int pixel; + unsigned char *srcptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + int srcbytes = src->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + srcptr = src->UdpA_Base + (src->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if( cpp != NULL ) + cpppxloff = cpp->UdpL_Pos + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + if( dst->UdpB_DType == UdpK_DTypeBU ) + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + if( cppbit ) + *dstptr = *srcptr & (unsigned char) constant; + else + *dstptr = *srcptr; /* Not selected by CPP */ + + srcptr += srcbytes; + dstptr += dstbytes; + } + else + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + if( cppbit ) + *((unsigned short *)dstptr) = *((unsigned short *)srcptr) + & (unsigned short) constant; + else /* Not selected by CPP */ + *((unsigned short *)dstptr) = *((unsigned short *)srcptr); + + srcptr += srcbytes; + dstptr += dstbytes; + } +} /* end LogicalAndIC */ + +static void LogicalOrIC(src, constant, dst, cpp, y1, x1, x2) + UdpPtr src; + unsigned long int constant; + UdpPtr dst; + UdpPtr cpp; + long int y1; + long int x1; + long int x2; +{ + int pixel; + unsigned long value, max = dst->UdpL_Levels-1; + unsigned char *srcptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + int srcbytes = src->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + srcptr = src->UdpA_Base + (src->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if( cpp != NULL ) + cpppxloff = cpp->UdpL_Pos + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + if( dst->UdpB_DType == UdpK_DTypeBU ) + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + if( cppbit ) + { + value = *srcptr | (unsigned char) constant; + *dstptr = value <= max ? value : max; + } + else + *dstptr = *srcptr; /* Not selected by CPP */ + + srcptr += srcbytes; + dstptr += dstbytes; + } + else + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + if( cppbit ) + { + value = *((unsigned short *)srcptr) + | (unsigned short) constant; + *((unsigned short *)dstptr) = value <= max ? value : max; + } + else /* Not selected by CPP */ + *((unsigned short *)dstptr) = *((unsigned short *)srcptr); + + srcptr += srcbytes; + dstptr += dstbytes; + } +} /* end LogicalOrIC */ + +static void LogicalXorIC(src, constant, dst, cpp, y1, x1, x2) + UdpPtr src; + unsigned long int constant; + UdpPtr dst; + UdpPtr cpp; + long int y1; + long int x1; + long int x2; +{ + int pixel; + unsigned long value, max = dst->UdpL_Levels-1; + unsigned char *srcptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + int srcbytes = src->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + srcptr = src->UdpA_Base + (src->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if( cpp != NULL ) + cpppxloff = cpp->UdpL_Pos + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + if( dst->UdpB_DType == UdpK_DTypeBU ) + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + if( cppbit ) + { + value = *srcptr ^ (unsigned char) constant; + *dstptr = value <= max ? value : max; + } + else + *dstptr = *srcptr; /* Not selected by CPP */ + + srcptr += srcbytes; + dstptr += dstbytes; + } + else + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + if( cppbit ) + { + value = *((unsigned short *)srcptr) + ^ (unsigned short) constant; + *((unsigned short *)dstptr) = value <= max ? value : max; + } + else /* Not selected by CPP */ + *((unsigned short *)dstptr) = *((unsigned short *)srcptr); + + srcptr += srcbytes; + dstptr += dstbytes; + } +} /* end LogicalXorIC */ + +static void LogicalNotIC(src, constant, dst, cpp, y1, x1, x2) + UdpPtr src; + unsigned long int constant; + UdpPtr dst; + UdpPtr cpp; + long int y1; + long int x1; + long int x2; +{ + int pixel; + unsigned long value, max = dst->UdpL_Levels-1; + unsigned char *srcptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + int srcbytes = src->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + srcptr = src->UdpA_Base + (src->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if( cpp != NULL ) + cpppxloff = cpp->UdpL_Pos + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + if( dst->UdpB_DType == UdpK_DTypeBU ) + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + if( cppbit ) + { + value = ~(*srcptr); + *dstptr = value <= max ? value : max; + } + else + *dstptr = *srcptr; /* Not selected by CPP */ + + srcptr += srcbytes; + dstptr += dstbytes; + } + else + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + if( cppbit ) + { + value = ~(*((unsigned short *)srcptr)); + *((unsigned short *)dstptr) = value <= max ? value : max; + } + else /* Not selected by CPP */ + *((unsigned short *)dstptr) = *((unsigned short *)srcptr); + + srcptr += srcbytes; + dstptr += dstbytes; + } +} /* end LogicalNotIC */ + +static void LogicalShiftUpIC(src, constant, dst, cpp, y1, x1, x2) + UdpPtr src; + unsigned long int constant; + UdpPtr dst; + UdpPtr cpp; + long int y1; + long int x1; + long int x2; +{ + int pixel; + unsigned long value, max = dst->UdpL_Levels-1; + unsigned char *srcptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + int srcbytes = src->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + srcptr = src->UdpA_Base + (src->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if( cpp != NULL ) + cpppxloff = cpp->UdpL_Pos + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + if( dst->UdpB_DType == UdpK_DTypeBU ) + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + if( cppbit ) + { + value = *srcptr << (unsigned char) constant; + *dstptr = value <= max ? value : max; + } + else + *dstptr = *srcptr; /* Not selected by CPP */ + + srcptr += srcbytes; + dstptr += dstbytes; + } + else + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + if( cppbit ) + { + value = *((unsigned short *)srcptr) + << (unsigned short) constant; + *((unsigned short *)dstptr) = value <= max ? value : max; + } + else /* Not selected by CPP */ + *((unsigned short *)dstptr) = *((unsigned short *)srcptr); + + srcptr += srcbytes; + dstptr += dstbytes; + } +} /* end LogicalShiftUpIC */ + +static void LogicalShiftDownIC(src, constant, dst, cpp, y1, x1, x2) + UdpPtr src; + unsigned long int constant; + UdpPtr dst; + UdpPtr cpp; + long int y1; + long int x1; + long int x2; +{ + int pixel; + unsigned char *srcptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + int srcbytes = src->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + srcptr = src->UdpA_Base + (src->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if( cpp != NULL ) + cpppxloff = cpp->UdpL_Pos + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + if( dst->UdpB_DType == UdpK_DTypeBU ) + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + if( cppbit ) + *dstptr = *srcptr >> (unsigned char) constant; + else + *dstptr = *srcptr; /* Not selected by CPP */ + + srcptr += srcbytes; + dstptr += dstbytes; + } + else + for( pixel = x1; pixel <= x2; pixel++ ) + { + if( cpp != NULL ) + { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + if( cppbit ) + *((unsigned short *)dstptr) = *((unsigned short *)srcptr) + >> (unsigned short) constant; + else /* Not selected by CPP */ + *((unsigned short *)dstptr) = *((unsigned short *)srcptr); + + srcptr += srcbytes; + dstptr += dstbytes; + } +} /* end LogicalShiftDownIC */ + +/***************************************************************************** +** LogicalGetTempUdp +** +** FUNCTIONAL DESCRIPTION: +** +** Create a UDP which can be used to hold one scanline of the source +** UDP, using byte or word data. If the source UDP is already in +* the correct format, just point to its data. +** +** FORMAL PARAMETERS: +** +** inudp - Pointer to source UDP +** dtype - dtype required +** y1 - First scanline we need +** x1 - Leftmost pixel we need +** x2 - Rightmost pixel we need +** +** FUNCTION VALUE: +** +** Returns a pointer to a UDP describing the data. +** +*****************************************************************************/ +static UdpPtr LogicalGetTempUdp(src, dtype, y1, x1, x2) + UdpPtr src; + char dtype; + long int y1; + long int x1, x2; +{ + UdpPtr dst; + + dst = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( dst == NULL ) return( (UdpPtr) BadAlloc ); + + if( src->UdpB_DType != dtype ) + { + dst->UdpW_PixelLength = dtype == UdpK_DTypeBU ? sizeof(char) * 8 + : sizeof(short) * 8; + dst->UdpB_DType = dtype; + dst->UdpB_Class = UdpK_ClassA; + dst->UdpL_PxlStride = dst->UdpW_PixelLength; + dst->UdpL_PxlPerScn = x2 - x1 + 1; + dst->UdpL_ScnStride = dst->UdpL_PxlStride * dst->UdpL_PxlPerScn; + dst->UdpL_ArSize = dst->UdpL_ScnStride; + dst->UdpL_Pos = 0; + dst->UdpL_CompIdx = src->UdpL_CompIdx; + dst->UdpL_Levels = src->UdpL_Levels; + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + { + DdxFree_(dst); + return( (UdpPtr) BadAlloc ); + } + } + else + { + *dst = *src; + dst->UdpL_PxlPerScn = x2 - x1 + 1; + dst->UdpL_ScnStride = dst->UdpL_PxlPerScn * dst->UdpL_PxlStride; + } + /* One scanline UDP */ + dst->UdpL_X1 = x1; + dst->UdpL_X2 = x2; + dst->UdpL_Y1 = y1; + dst->UdpL_Y2 = y1; + dst->UdpL_ScnCnt = 1; + + return( dst ); +} /* end LogicalGetTempUdp */ + +/***************************************************************************** +** LogicalDestroyTempUdp +** +** FUNCTIONAL DESCRIPTION: +** +** Free a UDP created by LogicalGetTempUdp. +** +** FORMAL PARAMETERS: +** +** udp - Pointer to the udp to free. +** realudp - Pointer to a udp which might actually own the storage +** pointed to by udp. +** +*****************************************************************************/ +static void LogicalDestroyTempUdp( udp, realudp ) +UdpPtr udp; +UdpPtr realudp; +{ + if( IsPointer_(udp) ) + { + if( IsPointer_(udp->UdpA_Base) && udp->UdpA_Base != realudp->UdpA_Base ) + DdxFreeBits_( udp->UdpA_Base ); + DdxFree_( udp ); + } +} /* end LogicalDestroyTempUdp */ + +/***************************************************************************** +** LogicalConvertScanline +** +** FUNCTIONAL DESCRIPTION: +** +** Adjust a UDP to point to the specified scanline of the source +** UDP. If the source UDP is not of type byte, convert the +** data and leave it associated with the adjusted UDP. +** +** FORMAL PARAMETERS: +** +** src - Pointer to the source UDP. +** dst - Pointer to the UDP to be adjusted. +** dtype - dtype required +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int LogicalConvertScanline(src, dst, dtype) + UdpPtr src; + UdpPtr dst; + char dtype; +{ + int status = Success; + + dst->UdpL_Y1++; + dst->UdpL_Y2++; + + if( src->UdpB_DType != dtype ) + status = DdxConvert_( src, dst, XieK_MoveMode ); + + else + dst->UdpL_Pos += src->UdpL_ScnStride; + + return( status ); +} /* end LogicalConvertScanline */ + +/***************************************************************************** +** LogicalStoreScanline +** +** FUNCTIONAL DESCRIPTION: +** +** Store a scanline of data into the destination UDP. +** If the scanline UDP already points into the destination UDP, +** just adjust the scanline UDP to point past the scanline already +** stored. If not, copy (and possibly convert) the data into the +** destination. +** +** FORMAL PARAMETERS: +** +** dst - Pointer to scanline UDP +** realdst - Pointer to the destination UDP +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int LogicalStoreScanline(dst, realdst) + UdpPtr dst; + UdpPtr realdst; +{ + int status = Success; + + if( dst->UdpA_Base != realdst->UdpA_Base ) + status = DdxConvert_( dst, realdst, XieK_MoveMode ); + + else + dst->UdpL_Pos += realdst->UdpL_ScnStride; + + dst->UdpL_Y1++; + dst->UdpL_Y2++; + + return( status ); +} /* end LogicalStoreScanline */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiLogical.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiLogical.h new file mode 100644 index 0000000..4411777 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiLogical.h @@ -0,0 +1,152 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the LOGICAL pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.0 +** RISC ULTRIX V3.0 +** +** AUTHOR(S): +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Wed Apr 25 11:02:18 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMILOGICAL +#define _SMILOGICAL + +/* +** Include files +*/ +#include + + /* + ** Function reference + */ +int SmiLogical(); +int SmiCreateLogical(); + +/* +** Structure definitions and Typedefs +*/ + +/* +** Logical pipeline context block. +*/ +typedef struct _LogicalPipeCtx { + PipeElementCommonPart common; + struct _LogicalPart { + PipeSinkPtr srcsnk1; + PipeSinkPtr srcsnk2; + PipeSinkPtr dstsnk; + PipeDrainPtr srcdrn1; + PipeDrainPtr srcdrn2; + PipeDataPtr srcdata1; + PipeDataPtr srcdata2; + unsigned long int constant[XieK_MaxComponents]; + UdpPtr cpp; + long int x1; + long int x2; + long int y1; + long int y2; + void (*function)(); + } LogicalPart; +} LogicalPipeCtx, *LogicalPipeCtxPtr; + +/* +** MACRO definitions +*/ + +/* +** Pipeline context, Logical part, access MACROs +*/ +#define LogSrcSnk1_(ctx) \ + (((LogicalPipeCtxPtr)(ctx))->LogicalPart.srcsnk1) +#define LogSrcSnk2_(ctx) \ + (((LogicalPipeCtxPtr)(ctx))->LogicalPart.srcsnk2) +#define LogDstSnk_(ctx) (((LogicalPipeCtxPtr)(ctx))->LogicalPart.dstsnk) + +#define LogSrcDrn1_(ctx) \ + (((LogicalPipeCtxPtr)(ctx))->LogicalPart.srcdrn1) +#define LogSrcDrn2_(ctx) \ + (((LogicalPipeCtxPtr)(ctx))->LogicalPart.srcdrn2) +#define LogSrcData1_(ctx) \ + (((LogicalPipeCtxPtr)(ctx))->LogicalPart.srcdata1) +#define LogSrcData2_(ctx) \ + (((LogicalPipeCtxPtr)(ctx))->LogicalPart.srcdata2) +#define LogConst_(ctx,comp) \ + (((LogicalPipeCtxPtr)(ctx))->LogicalPart.constant[comp]) +#define LogCpp_(ctx) (((LogicalPipeCtxPtr)(ctx))->LogicalPart.cpp) +#define LogRoiX1_(ctx) (((LogicalPipeCtxPtr)(ctx))->LogicalPart.x1) +#define LogRoiX2_(ctx) (((LogicalPipeCtxPtr)(ctx))->LogicalPart.x2) +#define LogRoiY1_(ctx) (((LogicalPipeCtxPtr)(ctx))->LogicalPart.y1) +#define LogRoiY2_(ctx) (((LogicalPipeCtxPtr)(ctx))->LogicalPart.y2) +#define LogFunc_(ctx) \ + (((LogicalPipeCtxPtr)(ctx))->LogicalPart.function) + +#endif +/* _SMILOGICAL */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiLuminance.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiLuminance.c new file mode 100644 index 0000000..d5f7a22 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiLuminance.c @@ -0,0 +1,564 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains support for the luminance operator. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** John Weber +** +** CREATION DATE: +** +** May 15, 1989 +** +** MODIFICATION HISTORY: +** +*******************************************************************************/ + +#include +#include + +#include "SmiLuminance.h" + +/* +** Table of contents +*/ +int SmiLuminance(); +int SmiCreateLuminance(); + +static int _LuminanceInitialize(); +static int _LuminanceActivate(); +static int _LuminanceDestroy(); + +static UdpPtr GetBytUdp(); +static UdpPtr GetFltUdp(); +static int GetFltScn(); + +static void FreeUdp(); + +static void LuminanceProcess(); +/* +** External References +*/ + +/* +** Local storage +*/ + /* + ** Luminance Element Vector + */ +static PipeElementVector LuminancePipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeLuminanceElement, /* Structure subtype */ + sizeof(LuminancePipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _LuminanceInitialize, /* Initialize entry */ + _LuminanceActivate, /* Activate entry */ + NULL, /* Flush entry */ + _LuminanceDestroy, /* Destroy entry */ + NULL /* Abort entry point */ + }; +/* RGB luminance weights */ + +#define RED_WEIGHT 0.299 +#define GRN_WEIGHT 0.587 +#define BLU_WEIGHT 0.114 + +/***************************************************************************** +** SmiCreateLuminance +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the LUMINANCE pipeline element +** +** FORMAL PARAMETERS: +** +** ctx - luminance pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCreateLuminance( pipe, srcsnk, dstsnk ) +Pipe pipe; +PipeSinkPtr srcsnk; +PipeSinkPtr dstsnk; +{ + LuminancePipeCtxPtr ctx = (LuminancePipeCtxPtr) + DdxCreatePipeCtx_( pipe, &LuminancePipeElement, FALSE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + /* + ** Copy parameters into context struct + */ + LumSrcSnk_(ctx) = srcsnk; + LumDstSnk_(ctx) = dstsnk; + + /* Let the resource manager convert the data to floats */ + LumRedDrn_(ctx) = DdxRmCreateDrain_( LumSrcSnk_(ctx), 1 << 0 ); + if( !IsPointer_(LumRedDrn_(ctx)) ) return( (int) LumRedDrn_(ctx) ); + DdxRmSetDType_( LumRedDrn_(ctx), UdpK_DTypeF, DtM_F ); + DdxRmSetQuantum_( LumRedDrn_(ctx), 1 ); + + LumGrnDrn_(ctx) = DdxRmCreateDrain_( LumSrcSnk_(ctx), 1 << 1 ); + if( !IsPointer_(LumGrnDrn_(ctx)) ) return( (int) LumGrnDrn_(ctx) ); + DdxRmSetDType_( LumGrnDrn_(ctx), UdpK_DTypeF, DtM_F ); + DdxRmSetQuantum_( LumGrnDrn_(ctx), 1 ); + + LumBluDrn_(ctx) = DdxRmCreateDrain_( LumSrcSnk_(ctx), 1 << 2 ); + if( !IsPointer_(LumBluDrn_(ctx)) ) return( (int) LumBluDrn_(ctx) ); + DdxRmSetDType_( LumBluDrn_(ctx), UdpK_DTypeF, DtM_F ); + DdxRmSetQuantum_( LumBluDrn_(ctx), 1 ); + + /* Output bytes */ + DdxRmSetDType_( LumDstSnk_(ctx), UdpK_DTypeBU, DtM_BU ); + DdxRmSetQuantum_( LumDstSnk_(ctx), 1 ); + + return( Success ); +} /* end SmiCreateLuminance */ + +/***************************************************************************** +** _LuminanceInitialize +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the LUMINANCE pipeline element +** +** FORMAL PARAMETERS: +** +** ctx - luminance pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _LuminanceInitialize( ctx ) +LuminancePipeCtxPtr ctx; +{ + int status = DdxRmInitializePort_( CtxHead_(ctx), LumRedDrn_(ctx) ); + if( status == Success ) + status = DdxRmInitializePort_( CtxHead_(ctx), LumGrnDrn_(ctx) ); + if( status == Success ) + status = DdxRmInitializePort_( CtxHead_(ctx), LumBluDrn_(ctx) ); + if( status == Success ) + status = DdxRmInitializePort_( CtxHead_(ctx), LumDstSnk_(ctx) ); + if( status == Success ) + { + /* Adjust the RGB weight factors by the relative ranges of the + * components. */ + LumWeight_(ctx,0) = RED_WEIGHT / (SnkLvl_(LumSrcSnk_(ctx),0) - 1); + LumWeight_(ctx,1) = GRN_WEIGHT / (SnkLvl_(LumSrcSnk_(ctx),1) - 1); + LumWeight_(ctx,2) = BLU_WEIGHT / (SnkLvl_(LumSrcSnk_(ctx),2) - 1); + + CtxInp_(ctx) = LumRedDrn_(ctx); + } + return( status ); +} + +/***************************************************************************** +** _LuminanceActivate +** +** FUNCTIONAL DESCRIPTION: +** +** This routine controls luminance generation +** +** FORMAL PARAMETERS: +** +** ctx - luminance pipeline element context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _LuminanceActivate( ctx ) +LuminancePipeCtxPtr ctx; +{ + PipeDataPtr dst = NULL; + int status; + + for( status = Success; status == Success; + LumRedDat_(ctx) = DdxRmDeallocData_(LumRedDat_(ctx)), + LumGrnDat_(ctx) = DdxRmDeallocData_(LumGrnDat_(ctx)), + LumBluDat_(ctx) = DdxRmDeallocData_(LumBluDat_(ctx))) + { + if( LumRedDat_(ctx) == NULL ) + { + LumRedDat_(ctx) = DdxRmGetData_( ctx, LumRedDrn_(ctx) ); + if( !IsPointer_(LumRedDat_(ctx)) ) return( (int) LumRedDat_(ctx) ); + } + if (LumGrnDat_(ctx) == NULL) + { + LumGrnDat_(ctx) = DdxRmGetData_( ctx, LumGrnDrn_(ctx) ); + if( !IsPointer_(LumGrnDat_(ctx)) ) return( (int) LumGrnDat_(ctx) ); + } + if (LumBluDat_(ctx) == NULL) + { + LumBluDat_(ctx) = DdxRmGetData_( ctx, LumBluDrn_(ctx) ); + if( !IsPointer_(LumBluDat_(ctx)) ) return( (int) LumBluDat_(ctx) ); + } + dst = DdxRmAllocData_( LumDstSnk_(ctx), 0, DatY1_(LumRedDat_(ctx)), + DatHeight_(LumRedDat_(ctx)) ); + status = (int) dst; + if( !IsPointer_(dst) ) continue; + + LuminanceProcess(DatUdpPtr_(LumRedDat_(ctx)), + DatUdpPtr_(LumGrnDat_(ctx)), + DatUdpPtr_(LumBluDat_(ctx)), + LumWeightPtr_(ctx), + DatUdpPtr_(dst)); + + status = DdxRmPutData_( LumDstSnk_(ctx), dst ); + } + + return( status ); +} + +/***************************************************************************** +** _LuminanceDestroy +** +** FUNCTIONAL DESCRIPTION: +** +** This routine deallocates all resources allocated by the luminance +** pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - luminance pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _LuminanceDestroy( ctx ) +LuminancePipeCtxPtr ctx; +{ + LumRedDrn_(ctx) = DdxRmDestroyDrain_( LumRedDrn_(ctx) ); + LumGrnDrn_(ctx) = DdxRmDestroyDrain_( LumGrnDrn_(ctx) ); + LumBluDrn_(ctx) = DdxRmDestroyDrain_( LumBluDrn_(ctx) ); + + return( Success ); +} + +/***************************************************************************** +** SmiLuminance +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiLuminance( redudp, grnudp, bluudp, dstudp ) +UdpPtr redudp; +UdpPtr grnudp; +UdpPtr bluudp; +UdpPtr dstudp; +{ + UdpPtr red = NULL, grn = NULL, blu = NULL, dst = NULL; + int status, scanline; + float weight[XieK_MaxComponents]; + + /* Adjust the RGB weight factors by the relative ranges of the + * components. + */ + weight[0] = RED_WEIGHT / (redudp->UdpL_Levels - 1); + weight[1] = GRN_WEIGHT / (grnudp->UdpL_Levels - 1); + weight[2] = BLU_WEIGHT / (bluudp->UdpL_Levels - 1); + + if( dstudp->UdpA_Base == NULL ) + { + dstudp->UdpA_Base = DdxMallocBits_( dstudp->UdpL_ArSize ); + if( dstudp->UdpA_Base == NULL ) return( BadAlloc ); + } + /* + ** Allocate temporary Udps for desired datatype + */ + red = GetFltUdp(redudp); + if( !IsPointer_(red) ) + { + status = (int) red; + goto clean_up; + } + grn = GetFltUdp(grnudp); + if( !IsPointer_(grn) ) + { + status = (int) grn; + goto clean_up; + } + blu = GetFltUdp(bluudp); + if( !IsPointer_(blu) ) + { + status = (int) blu; + goto clean_up; + } + dst = GetBytUdp(dstudp); + if( !IsPointer_(dst) ) + { + status = (int) dst; + goto clean_up; + } + + for( scanline = 0; scanline < dstudp->UdpL_ScnCnt; scanline++ ) + { + status = GetFltScn(redudp,scanline,red); + if( status != Success ) goto clean_up; + status = GetFltScn(grnudp,scanline,grn); + if( status != Success ) goto clean_up; + status = GetFltScn(bluudp,scanline,blu); + if( status != Success ) goto clean_up; + + dst->UdpL_Y1 = dst->UdpL_Y2 = scanline; + if( dstudp->UdpA_Base == dst->UdpA_Base ) + dst->UdpL_Pos = dstudp->UdpL_Pos + dstudp->UdpL_ScnStride * scanline; + + LuminanceProcess(red,grn,blu,weight,dst); + /* + ** If a temporary destination buffer was allocated, do the scanline + ** conversion now and reuse the temporary buffer for the next scanline. + ** + ** Otherwise, set the destination pointer to the next scanline in + ** the destination UDP. + */ + if( dst->UdpA_Base != dstudp->UdpA_Base ) + { + status = DdxConvert_( dst, dstudp, XieK_MoveMode ); + if( status != Success ) goto clean_up; + dst->UdpL_Y1++; + dst->UdpL_Y2++; + } + else + dst->UdpL_Pos = + dstudp->UdpL_Pos + dstudp->UdpL_ScnStride * (scanline + 1); + } +clean_up : + FreeUdp(red, redudp); + FreeUdp(grn, grnudp); + FreeUdp(blu, bluudp); + FreeUdp(dst, dstudp); + + return( status ); +} + +/***************************************************************************** +** LuminanceProcess +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +*****************************************************************************/ +static void LuminanceProcess( red, grn, blu, weight, dst ) +UdpPtr red; +UdpPtr grn; +UdpPtr blu; +float weight[XieK_MaxComponents]; +UdpPtr dst; +{ + int pixel, scanline; + + unsigned char *redptr, *grnptr, *bluptr, *dstptr; + float value, dst_levels; + + int red_bytes_per_pel = red->UdpL_PxlStride / 8; + int grn_bytes_per_pel = grn->UdpL_PxlStride / 8; + int blu_bytes_per_pel = blu->UdpL_PxlStride / 8; + + int dst_bytes_per_scn = dst->UdpL_ScnStride / 8; + int dst_bytes_per_pel = dst->UdpL_PxlStride / 8; + int dst_bytes_pos = dst->UdpL_Pos / 8; + + dst_levels = (float)(dst->UdpL_Levels - 1); + + for (scanline = 0; scanline < dst->UdpL_ScnCnt; scanline++) + { + redptr = red->UdpA_Base + red->UdpL_Pos / 8; + grnptr = grn->UdpA_Base + grn->UdpL_Pos / 8; + bluptr = blu->UdpA_Base + blu->UdpL_Pos / 8; + dstptr = dst->UdpA_Base + dst->UdpL_Pos / 8; + + for( pixel = 0; pixel < dst->UdpL_PxlPerScn; pixel++ ) + { + value = *(float *)redptr * weight[0] + + *(float *)grnptr * weight[1] + + *(float *)bluptr * weight[2]; + + + *(char *)dstptr = value * dst_levels; + + redptr += red_bytes_per_pel; + grnptr += grn_bytes_per_pel; + bluptr += blu_bytes_per_pel; + dstptr += dst_bytes_per_pel; + } + } +} + +static UdpPtr GetFltUdp( src ) +UdpPtr src; +{ + UdpPtr dst = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( dst == NULL ) return( (UdpPtr) BadAlloc ); + + if (src->UdpB_DType != UdpK_DTypeF) + { + dst->UdpW_PixelLength = sizeof(float) * 8; + dst->UdpB_DType = UdpK_DTypeF; + dst->UdpB_Class = UdpK_ClassA; + dst->UdpL_X1 = src->UdpL_X1; + dst->UdpL_X2 = src->UdpL_X2; + dst->UdpL_Y1 = src->UdpL_Y1; + dst->UdpL_Y2 = src->UdpL_Y1; + dst->UdpL_PxlPerScn = src->UdpL_PxlPerScn; + dst->UdpL_ScnCnt = 1; + dst->UdpL_PxlStride = dst->UdpW_PixelLength; + dst->UdpL_ScnStride = dst->UdpL_PxlStride * dst->UdpL_PxlPerScn; + dst->UdpL_ArSize = dst->UdpL_ScnStride; + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( DdxFree_(dst), (UdpPtr) BadAlloc ); + dst->UdpL_Pos = 0; + dst->UdpL_CompIdx = src->UdpL_CompIdx; + dst->UdpL_Levels = src->UdpL_Levels; + } + else + { + *dst = *src; + dst->UdpL_Y2 = src->UdpL_Y1; + dst->UdpL_ScnCnt = 1; + } + return( dst ); +} + +static UdpPtr GetBytUdp( src ) +UdpPtr src; +{ + UdpPtr dst = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( dst == NULL ) return( (UdpPtr) BadAlloc ); + + if (src->UdpB_DType != UdpK_DTypeBU) + { + dst->UdpW_PixelLength = sizeof(char) * 8; + dst->UdpB_DType = UdpK_DTypeBU; + dst->UdpB_Class = UdpK_ClassA; + dst->UdpL_X1 = src->UdpL_X1; + dst->UdpL_X2 = src->UdpL_X2; + dst->UdpL_Y1 = src->UdpL_Y1; + dst->UdpL_Y2 = src->UdpL_Y1; + dst->UdpL_PxlPerScn = src->UdpL_PxlPerScn; + dst->UdpL_ScnCnt = 1; + dst->UdpL_PxlStride = dst->UdpW_PixelLength; + dst->UdpL_ScnStride = dst->UdpL_PxlStride * dst->UdpL_PxlPerScn; + dst->UdpL_ArSize = dst->UdpL_ScnStride; + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( DdxFree_(dst), (UdpPtr) BadAlloc ); + dst->UdpL_Pos = 0; + dst->UdpL_CompIdx = src->UdpL_CompIdx; + dst->UdpL_Levels = src->UdpL_Levels; + } + else + { + *dst = *src; + dst->UdpL_Y2 = src->UdpL_Y1; + dst->UdpL_ScnCnt = 1; + } + + return( dst ); +} + +static void FreeUdp( udp, realudp ) +UdpPtr udp, realudp; +{ + if( IsPointer_(udp) ) + { + if( udp->UdpA_Base != NULL && udp->UdpA_Base != realudp->UdpA_Base ) + DdxFreeBits_( udp->UdpA_Base ); + + DdxFree_( udp ); + } +} + +/* +** This routine will setup a UDP of one scanline of floating point data for +** a given scanline. +*/ +static int GetFltScn( src, scn, dst ) +UdpPtr src; +int scn; +UdpPtr dst; +{ + int status = Success; + UdpPtr tmp; + + dst->UdpL_Y1 = dst->UdpL_Y2 = scn; + + if( src->UdpB_DType != UdpK_DTypeF ) + status = DdxConvert_( src, dst, XieK_MoveMode ); + else + dst->UdpL_Pos = src->UdpL_Pos + src->UdpL_ScnStride * scn; + + return( status ); +} diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiLuminance.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiLuminance.h new file mode 100644 index 0000000..d3ece3f --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiLuminance.h @@ -0,0 +1,139 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the LUMINANCE pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.0 +** RISC ULTRIX V3.0 +** +** AUTHOR(S): +** +** John Weber +** +** CREATION DATE: +** +** February 12, 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMILUMINANCE +#define _SMILUMINANCE + +/* +** Include files +*/ +#include + + /* + ** Function reference + */ +int SmiLuminance(); +int SmiCreateLuminance(); + +/* +** Structure definitions and Typedefs +*/ + +/* +** Luminance pipeline context block. +*/ +typedef struct _LuminancePipeCtx { + PipeElementCommonPart common; + struct _LuminancePart { + PipeSinkPtr srcsnk; + PipeSinkPtr dstsnk; + PipeDrainPtr reddrn; + PipeDrainPtr grndrn; + PipeDrainPtr bludrn; + PipeDataPtr reddat; + PipeDataPtr grndat; + PipeDataPtr bludat; + float weight[XieK_MaxComponents]; + } LuminancePart; +} LuminancePipeCtx, *LuminancePipeCtxPtr; + +/* +** MACRO definitions +*/ + +/* +** Pipeline context, Luminance part, access MACROs +*/ +#define LumRedDrn_(ctx) (((LuminancePipeCtxPtr)(ctx))->LuminancePart.reddrn) +#define LumGrnDrn_(ctx) (((LuminancePipeCtxPtr)(ctx))->LuminancePart.grndrn) +#define LumBluDrn_(ctx) (((LuminancePipeCtxPtr)(ctx))->LuminancePart.bludrn) +#define LumRedDat_(ctx) (((LuminancePipeCtxPtr)(ctx))->LuminancePart.reddat) +#define LumGrnDat_(ctx) (((LuminancePipeCtxPtr)(ctx))->LuminancePart.grndat) +#define LumBluDat_(ctx) (((LuminancePipeCtxPtr)(ctx))->LuminancePart.bludat) +#define LumWeight_(ctx,comp) \ + (((LuminancePipeCtxPtr)(ctx))->LuminancePart.weight[comp]) +#define LumWeightPtr_(ctx) \ + (&((LuminancePipeCtxPtr)(ctx))->LuminancePart.weight[0]) +/* +** Luminance Parameters +*/ +#define LumSrcSnk_(ctx) (((LuminancePipeCtxPtr)(ctx))->LuminancePart.srcsnk) +#define LumDstSnk_(ctx) (((LuminancePipeCtxPtr)(ctx))->LuminancePart.dstsnk) + +#endif +/* _SMILUMINANCE */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiMatchHistogram.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiMatchHistogram.c new file mode 100644 index 0000000..5796ff7 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiMatchHistogram.c @@ -0,0 +1,833 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** X Image Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains sample code which remaps an image such that +** the resulting image has the specified distribution of pixel +** values. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Gary L. Grebus +** Richard Piccolo +** +** CREATION DATE: +** +** Thu Jun 28 16:35:52 1990 +** +** MODIFICATION HISTORY: +** +*******************************************************************************/ + +/* +** Include files +*/ +#include +#include /* C math definitions */ + +#include "SmiMatchHistogram.h" +/* +** Table of contents +*/ +int SmiMatchHistogram(); +int SmiCreateMatchHistogram(); + +static int _MatchHistogramInitialize(); +static int _MatchHistogramActivate(); +static int _MatchHistogramDestroy(); + +static UdpPtr _ChkUdp(); +static int _CreateMHLut(); +static UdpPtr _FreeUdp(); +static int _GenerateCdf(); +/* +** Equated Symbols +*/ +# define K1 .39894228 /* 1 / sqrt (2pi) */ +/* +** MACRO definitions +*/ +/* +** External References +*/ +/* + * Local Storage + */ + /* + ** MatchHistogram Pipeline Element Vector + */ +static PipeElementVector MatchHistogramPipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeMatchHistogramElement, /* Structure subtype */ + sizeof(MatchHistogramPipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _MatchHistogramInitialize, /* Initialize entry */ + _MatchHistogramActivate, /* Activate entry */ + NULL, /* Flush entry */ + _MatchHistogramDestroy, /* Destroy entry */ + NULL /* Abort entry */ + }; + +/***************************************************************************** +** SmiCreateMatchHistogram +** +** FUNCTIONAL DESCRIPTION: +** +** This function fills in a newly created MATCHHISTOGRAM pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - MatchHistogram pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCreateMatchHistogram( pipe, src, dst, idc, hshape, param1, param2 ) +Pipe pipe; +PipeSinkPtr src; +PipeSinkPtr dst; +UdpPtr idc; +int hshape; /* Distribution shape and parameters */ +float param1; +float param2; +{ + MatchHistogramPipeCtxPtr ctx = (MatchHistogramPipeCtxPtr) + DdxCreatePipeCtx_( pipe, &MatchHistogramPipeElement, FALSE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + + /* + ** Save the parameter values + */ + MhSrcSnk_(ctx) = src; + MhDstSnk_(ctx) = dst; + MhIdc_(ctx) = idc; + MhHShape_(ctx) = hshape; + MhParam1_(ctx) = param1; + MhParam2_(ctx) = param2; + + /* + ** Setup one drain from source sink, receiving all components + */ + MhSrcDrn_(ctx) = DdxRmCreateDrain_(MhSrcSnk_(ctx),-1); + if( !IsPointer_(MhSrcDrn_(ctx)) ) return( (int) MhSrcDrn_(ctx) ); + + /* + ** The datatypes handled by this module and those handled by DdxPoint_ + ** and DdxHistogram_ must be in synch + ** Bytes & words are ok. + */ + DdxRmSetDType_( MhSrcDrn_(ctx), UdpK_DTypeUndefined, DtM_BU | DtM_WU ); + DdxRmSetDType_( MhDstSnk_(ctx), UdpK_DTypeUndefined, DtM_BU | DtM_WU ); + + /* + ** Set quantums to process the entire image + */ + DdxRmSetQuantum_( MhSrcDrn_(ctx), SnkHeight_(MhSrcSnk_(ctx),0) ); + DdxRmSetQuantum_( MhDstSnk_(ctx), SnkHeight_(MhDstSnk_(ctx),0) ); + + return( Success ); +} /* end SmiCreateMatchHistogram */ + +/***************************************************************************** +** _MatchHistogramInitialize +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the MATCHHISTOGRAM pipeline element prior to +** an activation. +** +** FORMAL PARAMETERS: +** +** ctx - MatchHistogram pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _MatchHistogramInitialize(ctx) +MatchHistogramPipeCtxPtr ctx; +{ + + PipeDataPtr data; + int status = DdxRmInitializePort_( CtxHead_(ctx), MhSrcDrn_(ctx) ); + if( status == Success ) + status = DdxRmInitializePort_( CtxHead_(ctx), MhDstSnk_(ctx) ); + + /* Currently processing from first (and only) source drain */ + CtxInp_(ctx) = MhSrcDrn_(ctx); + + return( Success ); +} + +/***************************************************************************** +** _MatchHistogramActivate +** +** FUNCTIONAL DESCRIPTION: +** +** This routine reads data from the pipeline. Since the histogram +** must be calculated across the entire image, we can only accumulate +** the scanlines until _MatchHistogramFlush is called. +** +** FORMAL PARAMETERS: +** +** ctx - MatchHistogram pipeline element context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _MatchHistogramActivate(ctx) +MatchHistogramPipeCtxPtr ctx; +{ + PipeDataPtr src, dst = NULL; + int status; + + for( status = Success; status == Success; src = DdxRmDeallocData_(src), + dst = DdxRmDeallocData_(dst) ) + { + src = DdxRmGetData_( ctx, MhSrcDrn_(ctx) ); + if( !IsPointer_(src) ) return( (int) src ); + + dst = DdxRmAllocData_( MhDstSnk_(ctx), DatCmpIdx_(src), + DatY1_(src), DatHeight_(src) ); + status = (int) dst; + if( !IsPointer_(dst) ) continue; + + status = DdxMatchHistogram_( DatUdpPtr_(src), + DatUdpPtr_(dst), + MhIdc_(ctx), + MhHShape_(ctx), + MhParam1_(ctx), + MhParam2_(ctx) ); + if( status != Success ) continue; + + status = DdxRmPutData_( MhDstSnk_(ctx), dst ); + dst = NULL; + } + return( status ); +} + +/***************************************************************************** +** _MatchHistogramDestroy +** +** FUNCTIONAL DESCRIPTION: +** +** This routine deallocates all resources allocated by the MATCHHISTOGRAM +** pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - dither pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _MatchHistogramDestroy(ctx) +MatchHistogramPipeCtxPtr ctx; +{ + MhSrcDrn_(ctx) = DdxRmDestroyDrain_(MhSrcDrn_(ctx)); + return( Success ); +} + +/****************************************************************************** +** SmiMatchHistogram +** +** FUNCTIONAL DESCRIPTION: +** +** This routine performs a non-pipelined transformation on the source +** image such that its new distribution has the specified shape and +** parameters. +** +** FORMAL PARAMETERS: +** +** in - Pointer to source udp (initialized) +** out - Pointer to destination udp (initialized, maybe without array) +** idc - Pointer to a UDP describing the Region of Interest, +** or Control Processing Plane. (NULL if no IDC) +** hshape - Shape of the resulting histogram (distribution) +** XieK_Flat +** XieK_Gaussian +** XieK_Hyperbolic +** param1 - First parameter of the distribution (hshape dependent) +** param2 - Second parameter of the distribution (hshape dependent) +** +** +******************************************************************************/ +int SmiMatchHistogram( in, out, idc, hshape, param1, param2) +UdpPtr in; +UdpPtr out; +UdpPtr idc; +int hshape; +float param1; +float param2; +{ +UdpPtr src = NULL; +UdpPtr dst = NULL; +UdpPtr lut = NULL; +int status; + + +/* +** Allocate the destination image array +*/ +if( out->UdpA_Base == NULL ) +{ + out->UdpA_Base = DdxMallocBits_( out->UdpL_ArSize ); + if( out->UdpA_Base == NULL ) return( BadAlloc ); +} + +/* +** Convert src and destination to byte data. +*/ +src = _ChkUdp( in, TRUE ); +if( !IsPointer_(src) ) + { + status = (int) src; + goto clean_up; + } +dst = _ChkUdp( out, FALSE ); +if( !IsPointer_(dst) ) + { + status = (int) dst; + goto clean_up; + } + +/* Create a lookup table which implements the desired transformation */ +status = _CreateMHLut( src, idc, hshape, param1, param2, &lut ); + +/* And remap the image to have the new distribution */ +if( status == Success ) + status = DdxPoint_( src, dst, idc, lut ); + +clean_up : + +if( IsPointer_(lut) ) + lut = _FreeUdp( lut ); /* Free the lookup table */ + +if( IsPointer_(src) && src != in ) + src = _FreeUdp(src); /* Free the temporary copy */ + +if( IsPointer_(dst) && dst != out ) + { + /* Convert the output data if necessary */ + status = DdxConvert_( dst, out, XieK_MoveMode ); + dst = _FreeUdp(dst); + } + +return( status ); +} /* end SmiMatchHistogram */ + + +/****************************************************************************** +** _ChkUdp +** +** FUNCTIONAL DESCRIPTION: +** +** Check udp and convert to a supported datatype if necessary. +** +** FORMAL PARAMETERS: +** +** src - Pointer to udp +** cvt - boolean: TRUE if data should be converted +** +******************************************************************************/ +static UdpPtr _ChkUdp( src, cvt ) + UdpPtr src; + int cvt; +{ + int stype, status = Success; + UdpPtr dst = src; + + stype = DdxGetTyp_( src ); + + /* + ** If the src is bits or floats it will be converted to bytes which + ** can be processed properly by DdxPoint_ and DdxHistogram_. + */ + if( stype != XieK_ABU ) + { + if( stype != XieK_AWU ) + { /* + ** Convert a bit or float array to bytes + */ + dst = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( dst == NULL ) return( (UdpPtr) BadAlloc ); + + *dst = *src; + dst->UdpB_DType = UdpK_DTypeBU; + dst->UdpB_Class = UdpK_ClassA; + dst->UdpW_PixelLength = 8; + dst->UdpL_PxlStride = dst->UdpW_PixelLength; + dst->UdpL_ScnStride = dst->UdpL_PxlStride*src->UdpL_PxlPerScn; + dst->UdpL_ArSize = dst->UdpL_ScnStride*src->UdpL_ScnCnt; + dst->UdpA_Base = cvt ? NULL : DdxMallocBits_(dst->UdpL_ArSize); + if( cvt ) + status = DdxConvert_( src, dst, XieK_MoveMode ); + + if( status != Success || dst->UdpA_Base == NULL ) + { + _FreeUdp(dst); + dst = (UdpPtr) status; + } + } + } + + return( dst ); +} /* end _ChkUdp */ + + +/****************************************************************************** +** _FreeUdp +** +** FUNCTIONAL DESCRIPTION: +** +** Free a UDP and the associated bits. +** +** FORMAL PARAMETERS: +** +** udp - Pointer to udp +** +******************************************************************************/ +static UdpPtr _FreeUdp(udp) + UdpPtr udp; +{ + if( IsPointer_(udp) ) + { + if( IsPointer_(udp->UdpA_Base) ) + DdxFreeBits_(udp->UdpA_Base); + DdxFree_(udp); + } + return( NULL ); +} + +/****************************************************************************** +** +** FUNCTIONAL DESCRIPTION: +** +** Takes a UDP, creates a lookup table by matching its histogram to the +** specified shape. +** +** FORMAL PARAMETERS: +** +** src_udp - pointer to source udp +** idc - CPP or ROI selecting region to be processed. +** hshape - indicator for distribution shape +** param1 - general argument (depending on the density type) +** param2 - general argument (depending on the density type) +** lut_ptr - place to receive pointer to lookup table UDP. +** +** FUNCTION VALUE: +** +*******************************************************************************/ +static int _CreateMHLut( src_udp, idc, hshape, param1, param2, lut_ptr ) +UdpPtr src_udp; +UdpPtr idc; +int hshape; +float param1; +float param2; +UdpPtr *lut_ptr; +{ + unsigned status; + unsigned i,j,k; /* Indices for loops */ + unsigned long *hist_ptr, *h_ptr; /* Histogram Pointers */ + unsigned long hist_cnt; /* Number elements in histogram */ + double fmax, prev_err, err; /* working float values */ + unsigned long total_pixels; /* number of pixels in src udp */ + + float *src_pd_base, *src_pd; /* Src Probability Density */ + float *src_cdf_base, *src_cdf; /* Src Cumulative Disribution */ + float *src_map_base, *src_map; /* Src Transfer Function for Eq. */ + + float *dst_cdf_base, *dst_cdf; /* Target Cumulative Disribution */ + + unsigned long *remap_base, *remap; /* Lookup Table For Match Histogram */ + UdpPtr lut; + + hist_cnt = src_udp->UdpL_Levels; + + hist_ptr = (unsigned long *) DdxMalloc_(hist_cnt * sizeof(long)); + if( hist_ptr == NULL ) return( BadAlloc ); + + status = DdxHistogram_( src_udp, idc, hist_ptr ); + if( status != Success ) + { + DdxFree_(hist_ptr); + return( status ); + } + /* + ** Allocate memory for the source probability density and cumulative + ** functions + */ + src_pd_base = (float *) DdxMalloc_(2 * hist_cnt * sizeof(float)); + if( src_pd_base == NULL ) + { + DdxFree_(hist_ptr); + return( BadAlloc ); + } + src_cdf_base = (float *)(src_pd_base + hist_cnt); + + /* + ** Allocate memory for the lookup table + */ + remap_base = (unsigned long *) DdxCallocBits_(hist_cnt * sizeof(long) * 8); + if( remap_base == NULL ) + { + DdxFree_(hist_ptr); + DdxFree_(src_pd_base); + return( BadAlloc ); + } + /* + ** Obtain Normalized, Equalized, Histogram + */ + total_pixels = src_udp->UdpL_PxlPerScn * src_udp->UdpL_ScnCnt; + h_ptr = hist_ptr; + + /* + ** Calculate probability density function of source UDP + */ + src_pd = (float *)src_pd_base; + for( i = 0; i < hist_cnt; i++ ) + *src_pd++ = (float)(*h_ptr++) / (float)total_pixels; + + /* + ** Calculate Cumulative Distribution Function + ** (i.e. histogram equalization transfer function) + */ + src_pd = (float *)src_pd_base; + src_cdf = (float *)src_cdf_base; + *src_cdf++ = *src_pd++; + for( i = 1; i < hist_cnt; i++, src_cdf++ ) + *src_cdf = *(src_cdf-1) + *src_pd++; + + /* + ** Generate src_pd -> src_cdf mapping (i.e. make sure src_cdf values are + ** real levels of the source) + ** Take advantage of the fact that src_cdf is a monotonically increasing + ** function (use of k) + */ + src_cdf = (float *)src_cdf_base; + fmax = (float) (hist_cnt - 1); /* max value */ + + switch( hshape ) + { + case XieK_Flat: + + /* flat - histogram equalization */ + remap = remap_base; + + for( k = 0, i= 0; i < hist_cnt; i++, src_cdf++ ) + { + for( prev_err = 1.0,j = k; j < hist_cnt; j++ ) + { + /* calc abs diff */ + err = fabs ( (double)(((float)j / fmax) - *src_cdf)); + if( err == 0.0 ) + { + j++; + break; + } + else if( err > prev_err ) + break; + else + prev_err = err; + } + *remap++ = j - 1; + k = j - 1; /* search next from k */ + } + break; /* end of histogram equalization */ + + default: /* all other density types - erroneous + ** density types will be flagged in + ** the generate_cdf subroutine + */ + + /* Histogram matching */ + /* + ** Allocate memory for mapping array (from src to an equalized + ** histogram) and dst cumulative function + */ + src_map_base = (float*) DdxMalloc_(2 * hist_cnt * sizeof(float)); + if( src_map_base == NULL ) + { + DdxFree_(hist_ptr); + DdxFree_(src_pd_base); + DdxFreeBits_(remap_base); + return( BadAlloc ); + } + dst_cdf_base = (float *)(src_map_base + hist_cnt); + + /* + ** Map cdf elements to actual levels + */ + src_map = (float *)src_map_base; + for( k = 0, i= 0; i < hist_cnt; i++, src_cdf++ ) + { + for( prev_err = 1.0,j = k; j < hist_cnt; j++ ) + { + /* calc abs diff */ + err = fabs ( (double)(((float)j / fmax) - *src_cdf)); + if( err == 0.0 ) + { + j++; + break; + } + else if( err > prev_err ) + break; + else + prev_err = err; + } + *src_map++ = (float)(j - 1) / fmax; /* set to norm val */ + k = j - 1; /* search next from k */ + } + + /* + ** Call general cumulative distribution subroutine + */ + status = _GenerateCdf( hshape, param1, param2, dst_cdf_base, hist_cnt ); + if( status != Success ) + { + DdxFree_(hist_ptr); + DdxFree_(src_pd_base); + DdxFree_(src_map_base); + DdxFreeBits_(remap_base); + return( status ); + } + /* + ** Match closest CDF value to each src_map value to obtain + ** src -> dst mapping (remap) + */ + src_map = (float *)src_map_base; + dst_cdf = (float *)dst_cdf_base; + remap = remap_base; + for( k = 0, i= 0; i < hist_cnt; i++, src_map++ ) + { + dst_cdf = (float *)(dst_cdf_base + k); + for( prev_err = 1.0, j = k; j < hist_cnt; j++ ) + { + err = fabs ((double)(*dst_cdf++ - *src_map)); + if( err == 0.0 ) + { + j++; + break; + } + else if( err > prev_err ) + break; + else + prev_err = err; + } + *remap++ = j - 1; + k = j - 1; + } + DdxFree_(src_map_base); + break; /* end of matching density function */ + } + +/* debug */ +/* +**{ +** unsigned long *ptr; +** ptr = remap_base; +** for (i=0; i < 256; i++) +** printf ("%d %d\n",i, *ptr++); +**} +*/ +/* end of debug */ + + DdxFree_(hist_ptr); + DdxFree_(src_pd_base); + +/* Build a one-scanline UDP to describe the LUT */ + lut = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( lut == NULL ) + { + DdxFreeBits_(remap_base); + return( BadAlloc ); + } + lut->UdpW_PixelLength = sizeof(long) * 8; + lut->UdpB_DType = UdpK_DTypeLU; + lut->UdpB_Class = UdpK_ClassA; + lut->UdpA_Base = (unsigned char *)remap_base; + lut->UdpL_ArSize = hist_cnt * lut->UdpW_PixelLength; + lut->UdpL_PxlStride = lut->UdpW_PixelLength; + lut->UdpL_ScnStride = lut->UdpL_ArSize; + lut->UdpL_X1 = 0; + lut->UdpL_Y1 = 0; + lut->UdpL_X2 = hist_cnt - 1; + lut->UdpL_Y2 = 0; + lut->UdpL_PxlPerScn = hist_cnt; + lut->UdpL_ScnCnt = 1; + lut->UdpL_Pos = 0; + lut->UdpL_CompIdx = 0; + lut->UdpL_Levels = hist_cnt; + + *lut_ptr = lut; + + return( status ); +} + +/* +** This subroutine generates a cumulative distribution function for the +** specified density type (hshape). The param arguments depend on the +** density. +*/ +static int _GenerateCdf (hshape, param1, param2, out_ptr, levels) +unsigned long hshape; /* density type */ +double param1, param2; /* density parameters */ +float *out_ptr; /* ptr to the output distr. func */ +unsigned long levels; /* number of levels (array elements */ +{ + unsigned long i,j; + float *target; /* working pointer */ + float fmax, sfactor, sum; + double z; + + switch (hshape) + { + case (XieK_Gaussian): + /* + ** Generate Gaussian Probability Density Function Around specified + ** mean level (param1) with the specified variance (param2) + */ + if( param1 == 0.0 ) + param1 = levels >> 1; + if( param2 == 0.0 ) + param2 = param1 / 4; + + target = (float *)out_ptr; + for(sum = 0, fmax = 0.0, i = 0; i < levels; i++ ) + { + z = (float)i - (float)param1; + z = -1.0 * z * z; + z /= (2 * param2 * param2); + z = exp(z); + *target = (float)((z * K1) / param2); + if( *target >= fmax ) + fmax = *target; + sum += *target++; + } + /* + ** Normalize and Calculate Cumulative Distribution Function For the + ** Gaussian probability density (i.e. histogram equalization + ** transfer function) + */ + sfactor = 1 / sum; + target = (float *)out_ptr; + *target++ *= sfactor; + for( i = 1; i < levels; i++, target++ ) + *target = *(target- 1) + (*target * sfactor); + break; + + case (XieK_Hyperbolic): + /* + ** Generate Hyperbolic Probability Density Function with specified + ** constant (param1) + */ + if( param1 == 0.0 ) /* default is 1/4 th */ + param1 = levels >> 2; + + target = (float *)out_ptr; + param2 = 1.0 / param1; /* use mult rather than div */ + + if( param2 != 1.0 ) /* default is neg exp */ + { + for( sum = 0, fmax = 0.0, i = 0; i < levels; i++ ) + { + z = log (1.0 + param2); + *target = (float)(1.0 / (((double)i + param1) * z)); + if( *target >= fmax ) + fmax = *target; + sum += *target++; + } + } + else + { + j = levels - 1; + for( sum = 0, fmax = 0.0, i = 0; i < levels; i++, j-- ) + { + z = log (1.0 + param2); + *target = (float)(1.0 / (((double)j + param1) * z)); + if( *target >= fmax ) + fmax = *target; + sum += *target++; + } + } + /* + ** Normalize and Calculate Cumulative Distribution Function For the + ** hyperbolic probability density (i.e. histogram equalization + ** transfer function) + */ + sfactor = 1 / sum; + target = (float *)out_ptr; + *target++ *= sfactor; + for( i = 1; i < levels; i++, target++ ) + *target = *(target- 1) + (*target * sfactor); + break; + + default : + return( BadValue ); + } /* end of switch */ + return( Success ); +} +/* end module SmiMatchHistogram.c */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiMatchHistogram.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiMatchHistogram.h new file mode 100644 index 0000000..e4dcf52 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiMatchHistogram.h @@ -0,0 +1,133 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the MATCHHISTOGRAM pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.1 +** RISC ULTRIX V3.1 +** +** AUTHOR(S): +** +** Gary Grebus +** +** CREATION DATE: +** +** Thu Jun 28 16:41:35 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMIMATCHHISTOGRAM +#define _SMIMATCHHISTOGRAM + +/* +** Include files +*/ +#include + + /* + ** Function reference + */ +int SmiMatchHistogram(); +int SmiCreateMatchHistogram(); + +/* +** Structure definitions and Typedefs +*/ + /* + ** MatchHistogram pipeline context block. + */ +typedef struct _MatchHistogramPipeCtx { + PipeElementCommonPart common; + struct _MatchHistogramPart { + PipeSinkPtr src; + PipeSinkPtr dst; + PipeDrainPtr srcdrn; + UdpPtr idc; + int hshape; /* Distribution shape */ + float param1; /* Distribution parameters */ + float param2; + } MatchHistogramPart; +} MatchHistogramPipeCtx, *MatchHistogramPipeCtxPtr; + +/* +** MACRO definitions +*/ + /* + ** MatchHistogram access macros + */ +#define MhSrcSnk_(ctx) \ + (((MatchHistogramPipeCtxPtr)(ctx))->MatchHistogramPart.src) +#define MhDstSnk_(ctx) \ + (((MatchHistogramPipeCtxPtr)(ctx))->MatchHistogramPart.dst) +#define MhHShape_(ctx) \ + (((MatchHistogramPipeCtxPtr)(ctx))->MatchHistogramPart.hshape) +#define MhParam1_(ctx) \ + (((MatchHistogramPipeCtxPtr)(ctx))->MatchHistogramPart.param1) +#define MhParam2_(ctx) \ + (((MatchHistogramPipeCtxPtr)(ctx))->MatchHistogramPart.param2) +#define MhSrcDrn_(ctx) \ + (((MatchHistogramPipeCtxPtr)(ctx))->MatchHistogramPart.srcdrn) +#define MhIdc_(ctx) \ + (((MatchHistogramPipeCtxPtr)(ctx))->MatchHistogramPart.idc) + +#endif +/* _SMIMATCHHISTOGRAM */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiMath.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiMath.c new file mode 100644 index 0000000..40c3098 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiMath.c @@ -0,0 +1,1056 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module implements the mathematical operator which performs +** mathematical functions between two photomaps. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHORS: +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Thu Jul 5 13:57:43 1990 +** +*******************************************************************************/ + +#include +#include +#include + +#include "SmiMath.h" + +/* +** Table of contents +*/ +int SmiMath(); +int SmiCreateMath(); + +static int _MathInitialize(); +static int _MathActivate(); +static int _MathDestroy(); + +static void MathException(); +static UdpPtr MathGetTempUdp(); +static void MathDestroyTempUdp(); +static int MathConvertScanline(); +static int MathStoreScanline(); + +static int MathExp(); +static int MathLn(); +static int MathLog2(); +static int MathLog10(); +static int MathSquare(); +static int MathSqrt(); + +/* +** Equated Symbols +*/ +/* +** Alpha/VMS and VXT don't currently support sigvec/setjmp/longjmp, +** and require explicit testing of every pixel value. Otherwise, +** use exception handling to catch any bad values. +*/ +#if (!defined(ALPHA) && !defined(_ALPHA) && !defined(VXT) || !(defined(VMS))) +#define XIE_USE_EXCEPTION_HANDLING +#endif + +/* +** External References +*/ + +/* + * Macros + */ +#define Min_(a,b) ((a) <= (b) ? (a) : (b)) +#define Max_(a,b) ((a) > (b) ? (a) : (b)) + +#if defined(XIE_USE_EXCEPTION_HANDLING) +#define HandleFPE_( tvec, rtn, ovec ) \ + ( tvec.sv_handler = rtn, tvec.sv_mask=0, tvec.sv_onstack=0, \ + sigvec( SIGFPE, &tvec, &ovec) ) + +#define UnhandleFPE_( ovec ) \ + ( sigvec( SIGFPE, &ovec, NULL ) ) + +/* +** Local storage +*/ +static jmp_buf exception_buf; + +#endif + + /* + ** Math Element Vector + */ +static PipeElementVector MathPipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeMathElement, /* Structure subtype */ + sizeof(MathPipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _MathInitialize, /* Initialize entry */ + _MathActivate, /* Activate entry */ + NULL, /* Flush entry */ + _MathDestroy, /* Destroy entry */ + NULL /* Abort entry */ + }; + +/* Dispatch table to select the correct operation routine */ +/* This must match the ordering of the XieK_xxxx constants in XieAppl.h */ +static int (*MathOpTable[])() = { + NULL, /* Constants start at 1 */ + MathExp, + MathLn, + MathLog2, + MathLog10, + MathSquare, + MathSqrt + }; + +/***************************************************************************** +** SmiCreateMath +** +** FUNCTIONAL DESCRIPTION: +** +** This function fills in a newly created context for a MATH +** pipeline element. +** +** FORMAL PARAMETERS: +** +** pipe - Descriptor for pipe being built.. +** srcsnk - Pointer to source sink +** dstsnk - Pointer to destination sink +** idc - Pointer to UDP describing the ROI or CPP (NULL if no IDC) +** operator- Math operation function code. +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCreateMath(pipe,srcsnk, dstsnk, idc, operator) +Pipe pipe; +PipeSinkPtr srcsnk; +PipeSinkPtr dstsnk; +UdpPtr idc; +int operator; + +{ + MathPipeCtxPtr ctx = (MathPipeCtxPtr) + DdxCreatePipeCtx_( pipe, &MathPipeElement, FALSE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + /* + ** Copy parameters + */ + MthSrcSnk_(ctx) = srcsnk; + MthDstSnk_(ctx) = dstsnk; + MthFunc_(ctx) = MathOpTable[operator]; + MthCpp_(ctx) = idc != NULL && idc->UdpA_Base != NULL ? idc : NULL; + + /* Calculate the bounds of the region that will actually be processed */ + if( idc == NULL ) + { + MthRoiX1_(ctx) = SnkX1_(srcsnk,0); + MthRoiX2_(ctx) = SnkX2_(srcsnk,0); + MthRoiY1_(ctx) = SnkY1_(srcsnk,0); + MthRoiY2_(ctx) = SnkY2_(srcsnk,0); + } + else + { + /* Further restrict the area to be processed with the CPP/ROI */ + MthRoiX1_(ctx) = idc->UdpL_X1 > SnkX1_(srcsnk,0) ? + idc->UdpL_X1 : SnkX1_(srcsnk,0); + MthRoiX2_(ctx) = idc->UdpL_X2 < SnkX2_(srcsnk,0) ? + idc->UdpL_X2 : SnkX2_(srcsnk,0); + MthRoiY1_(ctx) = idc->UdpL_Y1 > SnkY1_(srcsnk,0) ? + idc->UdpL_Y1 : SnkY1_(srcsnk,0); + MthRoiY2_(ctx) = idc->UdpL_Y2 < SnkY2_(srcsnk,0) ? + idc->UdpL_Y2 : SnkY2_(srcsnk,0); + } + + /* Create drains on the sink(s). + * Handle all the data as floats. + * Process a quantum of 1 scanline + */ + MthSrcDrn_(ctx) = DdxRmCreateDrain_( MthSrcSnk_(ctx), -1 ); + if( !IsPointer_(MthSrcDrn_(ctx)) ) return( (int) MthSrcDrn_(ctx)); + DdxRmSetDType_( MthSrcDrn_(ctx), UdpK_DTypeF, DtM_F ); + DdxRmSetQuantum_( MthSrcDrn_(ctx), 1 ); + + DdxRmSetDType_( MthDstSnk_(ctx), UdpK_DTypeF, DtM_F ); + DdxRmSetQuantum_( MthDstSnk_(ctx), 1 ); + + return( Success ); +} /* end SmiCreateMath */ + +/***************************************************************************** +** _MathInitialize +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the MATH pipeline element prior to +** activation. +** +** FORMAL PARAMETERS: +** +** ctx - math pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _MathInitialize(ctx) +MathPipeCtxPtr ctx; +{ + int status = DdxRmInitializePort_( CtxHead_(ctx), MthSrcDrn_(ctx) ); + if( status == Success ) + status = DdxRmInitializePort_( CtxHead_(ctx), MthDstSnk_(ctx) ); + + /* Start reading from the first drain */ + CtxInp_(ctx) = MthSrcDrn_(ctx); + + return( status ); +} + +/***************************************************************************** +** _MathActivate +** +** FUNCTIONAL DESCRIPTION: +** +** This routine reads the data from the source drain and +** performs the math operations. +** +** FORMAL PARAMETERS: +** +** ctx - math pipeline element context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _MathActivate(ctx) +MathPipeCtxPtr ctx; +{ + PipeDataPtr src = NULL, dst = NULL; + int status, dstpos; + +#if defined(XIE_USE_EXCEPTION_HANDLING) + struct sigvec tmpvec, oldvec; + + /* + * Establish error handling to catch possible floating point errors. + */ + HandleFPE_(tmpvec, MathException, oldvec); + if (setjmp(exception_buf) != 0) { + + /* On an exception, clean up locally held resources */ + UnhandleFPE_( oldvec ); + if ( src != NULL ) DdxRmDeallocData_(src); + if ( dst != NULL ) DdxRmDeallocData_(dst); + return( BadValue ); + } +#endif + + for( status = Success; status == Success; src = DdxRmDeallocData_(src), + dst = DdxRmDeallocData_(dst) ) + { + src = DdxRmGetData_( ctx, MthSrcDrn_(ctx) ); + if( !IsPointer_(src) ) return( (int) src ); + + if( DatY1_(src) < MthRoiY1_(ctx) || DatY1_(src) > MthRoiY2_(ctx) ) + { + /* Scanline is outside the ROI - just pass it through */ + status = DdxRmPutData_( MthDstSnk_(ctx), src ); + src = NULL; + } + else + { + dst = DdxRmAllocData_( MthDstSnk_(ctx), DatCmpIdx_(src), + DatY1_(src), DatHeight_(src) ); + status = (int) dst; + if( !IsPointer_(dst) ) continue; + + /* Copy the portions of this line outside the ROI */ + /* Left */ + status = DdxCopy_( DatUdpPtr_(src), DatUdpPtr_(dst), + DatX1_(src), 0, + DatX1_(dst), DatY1_(dst), + MthRoiX1_(ctx) - DatX1_(src), 1 ); + if( status != Success ) continue; + /* Right */ + status = DdxCopy_( DatUdpPtr_(src), DatUdpPtr_(dst), + MthRoiX2_(ctx)+1, 0, + MthRoiX2_(ctx)+1, DatY1_(dst), + DatX2_(src) - MthRoiX2_(ctx), 1 ); + if( status != Success ) continue; + + DatPos_(src) += (MthRoiX1_(ctx) - DatX1_(src)) * DatPxlStr_(src); + dstpos = DatPos_(dst); + DatPos_(dst) += (MthRoiX1_(ctx) - DatX1_(dst)) * DatPxlStr_(dst);; + + status = (*MthFunc_(ctx))(DatUdpPtr_(src), + DatUdpPtr_(dst), + MthCpp_(ctx), + MthRoiY1_(ctx), + MthRoiX1_(ctx), + MthRoiX2_(ctx)); + if( status != Success ) continue; + + DatPos_(dst) = dstpos; + status = DdxRmPutData_( MthDstSnk_(ctx), dst ); + dst = NULL; + } + } +#if defined(XIE_USE_EXCEPTION_HANDLING) + UnhandleFPE_( oldvec ); +#endif + return( status ); +} + +/***************************************************************************** +** _MathDestroy +** +** FUNCTIONAL DESCRIPTION: +** +** This routine deallocates all resources allocated by the MATH +** pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - math pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _MathDestroy(ctx) +MathPipeCtxPtr ctx; +{ + MthSrcDrn_(ctx) = DdxRmDestroyDrain_( MthSrcDrn_(ctx) ); + + return( Success ); +} + +/***************************************************************************** +** SmiMath +** +** FUNCTIONAL DESCRIPTION: +** +** This routine performs a non-pipelined math operator, which +** evaluates a mathematical function for each pixel in the photomap. +** +** Note that the destination photomap must be of type float or +** the data will be transformed from unconstrained to a constrained +** type in an undefined manner. +** +** FORMAL PARAMETERS: +** +** srcudp - Pointer to a UDP describing the source operand. +** dstudp - Pointer to a UDP describing the destination buffer. +** idc - Pointer to a UDP describing the Region of Interest, +** or Control Processing Plane. +** (NULL if no IDC) +** operator-Code for the operation being performed. +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiMath( srcudp, dstudp, idc, operator ) +UdpPtr srcudp; +UdpPtr dstudp; +UdpPtr idc; +int operator; +{ + UdpPtr cpp, src = NULL, dst = NULL; + long int pixels, scanline, status; + long int X1, X2, Y1, Y2; /* src/destination common bounds */ + long int x1, x2, y1, y2; /* src/destination/ROI common bounds */ + +#if defined(XIE_USE_EXCEPTION_HANDLING) + struct sigvec tmpvec, oldvec; + /* + * Establish error handling to catch possible floating point errors. + */ + HandleFPE_( tmpvec, MathException, oldvec ); + if( setjmp( exception_buf ) != 0 ) + { + status = BadValue; + goto clean_up; + } +#endif + /* + ** Allocate the destination image array + */ + if( dstudp->UdpA_Base == NULL ) + { + dstudp->UdpA_Base = DdxMallocBits_( dstudp->UdpL_ArSize ); + if( dstudp->UdpA_Base == NULL ) return( BadAlloc ); + } + /* + * Determine maximum common dimensions between source and destination, + * which is the defined region of output. + */ + X1 = srcudp->UdpL_X1 > dstudp->UdpL_X1 ? srcudp->UdpL_X1 : dstudp->UdpL_X1; + X2 = srcudp->UdpL_X2 < dstudp->UdpL_X2 ? srcudp->UdpL_X2 : dstudp->UdpL_X2; + Y1 = srcudp->UdpL_Y1 > dstudp->UdpL_Y1 ? srcudp->UdpL_Y1 : dstudp->UdpL_Y1; + Y2 = srcudp->UdpL_Y2 < dstudp->UdpL_Y2 ? srcudp->UdpL_Y2 : dstudp->UdpL_Y2; + /* + * Further restrict the area to be processed by finding the maximum + * common dimensions between the source region, and the IDC + * (ROI or CPP). + */ + if( idc == NULL ) + { + x1 = X1; + x2 = X2; + y1 = Y1; + y2 = Y2; + } + else + { + x1 = idc->UdpL_X1 > X1 ? idc->UdpL_X1 : X1; + x2 = idc->UdpL_X2 < X2 ? idc->UdpL_X2 : X2; + y1 = idc->UdpL_Y1 > Y1 ? idc->UdpL_Y1 : Y1; + y2 = idc->UdpL_Y2 < Y2 ? idc->UdpL_Y2 : Y2; + } + cpp = idc != NULL && idc->UdpA_Base != NULL ? idc : NULL; + + /* Allocate temporary UDP's to hold one scanline of float data */ + src = MathGetTempUdp( srcudp, y1, x1, x2 ); + if( !IsPointer_(src) ) + { + status = (int) src; + goto clean_up; + } + dst = MathGetTempUdp( dstudp, y1, x1, x2 ); + if( !IsPointer_(dst) ) + { + status = (int) dst; + goto clean_up; + } + + /* Just copy the scanlines outside of the ROI */ + /* Top */ + status = DdxCopy_( srcudp, dstudp, X1, Y1, X1, Y1, X2-X1+1, y1-Y1 ); + if( status != Success ) goto clean_up; + /* Bottom */ + status = DdxCopy_( srcudp, dstudp, X1, y2+1, X1, y2+1, X2-X1+1, Y2-y2 ); + if( status != Success ) goto clean_up; + /* Left */ + status = DdxCopy_( srcudp, dstudp, X1, y1, X1, y1, x1-X1, y2-y1+1 ); + if( status != Success ) goto clean_up; + /* Right */ + status = DdxCopy_( srcudp, dstudp, x2+1, y1, x2+1, y1, X2-x2, y2-y1+1 ); + if( status != Success ) goto clean_up; + + /* If the temporary UDP's are pointing to the original data, position + * to the correct offset. + */ + if( src->UdpA_Base == srcudp->UdpA_Base ) + src->UdpL_Pos = srcudp->UdpL_Pos + srcudp->UdpL_ScnStride * y1 + + srcudp->UdpL_PxlStride * + (x1 - srcudp->UdpL_X1); + dst->UdpL_Y1 = dst->UdpL_Y2 = y1; + if( dst->UdpA_Base == dstudp->UdpA_Base ) + dst->UdpL_Pos = dstudp->UdpL_Pos + y1 * dstudp->UdpL_ScnStride + + (x1 - dstudp->UdpL_X1) * dstudp->UdpL_PxlStride; + + /* Now perform the math operation over the region-of-interest */ + + for( scanline = y1; scanline <= y2; scanline++ ) + { + /* Get a UDP pointing to this scanline */ + status = MathConvertScanline( srcudp, src ); + if( status != Success ) break; + + status = (*MathOpTable[operator])(src, dst, cpp, y1, x1, x2); + if( status != Success ) break; + + status = MathStoreScanline(dst, dstudp); + if( status != Success ) break; + } + + /* Cleanup the temporary descriptors */ +clean_up : + +#if defined(XIE_USE_EXCEPTION_HANDLING) + UnhandleFPE_( oldvec ); +#endif + + if( IsPointer_(src) ) + MathDestroyTempUdp( src, srcudp ); + if( IsPointer_(dst) ) + MathDestroyTempUdp( dst, dstudp ); + + return( status ); +} /* end SmiMath */ + +/***************************************************************************** +** Math processing routines +** +** FUNCTIONAL DESCRIPTION: +** +** These routines the actual math operation over selected +** portion of a scanline. A separate routine is used for each +** type of operation. +** +** The explicit tests for bad pixel values are highly implementation +** dependent and probably incomplete. +** +** FORMAL PARAMETERS: +** +** src - Pointer to a UDP describing the source operand. +** dst - Pointer to a UDP describing the destination buffer. +** cpp - Pointer to a UDP describing the Control Processing Plane. +** (NULL if no CPP) +** y1 - The y coordinate of the beginning of the region to +* process. +** x1 - The x coordinate of the left endpoint of the region to +** process. +** x2 - The x coordinate of the right endpoint of the region to +** process. +** +*****************************************************************************/ +static int MathExp(src, dst, cpp, y1, x1, x2) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + + unsigned char *srcptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + + int srcbytes = src->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + srcptr = src->UdpA_Base + (src->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + for (pixel = x1; pixel <= x2; pixel++){ + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) { +#if !defined(XIE_USE_EXCEPTION_HANDLING) + if (*(float *)srcptr > 88.029 ) /* VAX MTH$DEXP */ + return( BadValue ); +#endif + *(float *)dstptr = exp(*(float *)srcptr); + } else + *(float *)dstptr = *(float *)srcptr; /* Not selected by CPP */ + + srcptr+=srcbytes; + dstptr+=dstbytes; + + } + return( Success ); +} /* end MathExp */ + +static int MathLn(src, dst, cpp, y1, x1, x2) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + + unsigned char *srcptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + + int srcbytes = src->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + srcptr = src->UdpA_Base + (src->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + for (pixel = x1; pixel <= x2; pixel++){ + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) { +#if !defined(XIE_USE_EXCEPTION_HANDLING) + if (*(float *)srcptr <= 0.0) + return( BadValue ); +#endif + *(float *)dstptr = log(*(float *)srcptr); + } else + *(float *)dstptr = *(float *)srcptr; /* Not selected by CPP */ + + srcptr+=srcbytes; + dstptr+=dstbytes; + + } + return( Success ); +} /* end MathLn */ + +static int MathLog2(src, dst, cpp, y1, x1, x2) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + + unsigned char *srcptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + + int srcbytes = src->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + double lntwo = log(2.0); + + srcptr = src->UdpA_Base + (src->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + for (pixel = x1; pixel <= x2; pixel++){ + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) { +#if !defined(XIE_USE_EXCEPTION_HANDLING) + if (*(float *)srcptr <= 0.0) + return( BadValue ); +#endif + *(float *)dstptr = log((*(float *)srcptr))/lntwo; + } else + *(float *)dstptr = *(float *)srcptr; /* Not selected by CPP */ + + srcptr+=srcbytes; + dstptr+=dstbytes; + + } + return( Success ); +} /* end MathLog2 */ + +static int MathLog10(src, dst, cpp, y1, x1, x2) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + + unsigned char *srcptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + + int srcbytes = src->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + srcptr = src->UdpA_Base + (src->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + for (pixel = x1; pixel <= x2; pixel++){ + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) { +#if !defined(XIE_USE_EXCEPTION_HANDLING) + if (*(float *)srcptr <= 0.0) + return( BadValue ); +#endif + *(float *)dstptr = log10(*(float *)srcptr); + } else + *(float *)dstptr = *(float *)srcptr; /* Not selected by CPP */ + + srcptr+=srcbytes; + dstptr+=dstbytes; + + } + return( Success ); +} /* end MathLog10 */ + +static int MathSquare(src, dst, cpp, y1, x1, x2) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + + unsigned char *srcptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + + int srcbytes = src->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + srcptr = src->UdpA_Base + (src->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + for (pixel = x1; pixel <= x2; pixel++){ + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) + *(float *)dstptr = *(float *)srcptr * *(float *)srcptr; + else + *(float *)dstptr = *(float *)srcptr; /* Not selected by CPP */ + + srcptr+=srcbytes; + dstptr+=dstbytes; + + } + return( Success ); +} /* end MathSquare */ + +static int MathSqrt(src, dst, cpp, y1, x1, x2) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +long int y1; +long int x1; +long int x2; +{ + int pixel; + + unsigned char *srcptr; + unsigned char *dstptr; + long int cpppxloff; + int cppbit; + + int srcbytes = src->UdpL_PxlStride >> 3; + int dstbytes = dst->UdpL_PxlStride >> 3; + + srcptr = src->UdpA_Base + (src->UdpL_Pos >> 3); + dstptr = dst->UdpA_Base + (dst->UdpL_Pos >> 3); + + if (cpp != NULL) + cpppxloff = cpp->UdpL_Pos + + cpp->UdpL_ScnStride * (src->UdpL_Y1 - y1); + else + cppbit = 1; /* Fake all 1's in CPP */ + + for (pixel = x1; pixel <= x2; pixel++){ + + if (cpp != NULL) { + cppbit = GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1); + cpppxloff+=cpp->UdpL_PxlStride; + } + + if (cppbit) { +#if !defined(XIE_USE_EXCEPTION_HANDLING) + if (*(float *)srcptr < 0.0) + return( BadValue ); +#endif + *(float *)dstptr = sqrt(*(float *)srcptr); + } else + *(float *)dstptr = *(float *)srcptr; /* Not selected by CPP */ + + srcptr+=srcbytes; + dstptr+=dstbytes; + + } + return( Success ); +} /* end MathSqrt */ + +/***************************************************************************** +** MathException +** +** FUNCTIONAL DESCRIPTION: +** +** This routine is our signal handler for a floating point exception. +** +** FORMAL PARAMETERS: +** +** none +** +** FUNCTION VALUE: +** +** Returns a 1 through the setjmp. +** +*****************************************************************************/ +static void MathException( ) +{ +#if defined(XIE_USE_EXCEPTION_HANDLING) + longjmp( exception_buf, 1 ); +#endif +} + +/***************************************************************************** +** MathGetTempUdp +** +** FUNCTIONAL DESCRIPTION: +** +** Create a UDP which can be used to hold one scanline of the +** source UDP, but using float data. If the source UDP is already +* in float format, just point to its data. +** +** FORMAL PARAMETERS: +** +** inudp - Pointer to source UDP +** y1 - First scanline we need +** x1 - Leftmost pixel we need +** x2 - Rightmost pixel we need +** +** FUNCTION VALUE: +** +** Returns a pointer to a UDP describing floating point data. +** +*****************************************************************************/ +static UdpPtr MathGetTempUdp(src, y1, x1, x2) + UdpPtr src; + long int y1; + long int x1, x2; +{ + UdpPtr dst; + + dst = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( dst == NULL ) return( (UdpPtr) BadAlloc ); + + if( src->UdpB_DType != UdpK_DTypeF ) + { + dst->UdpW_PixelLength = sizeof(float) * 8; + dst->UdpB_DType = UdpK_DTypeF; + dst->UdpB_Class = UdpK_ClassA; + dst->UdpL_PxlStride = dst->UdpW_PixelLength; + dst->UdpL_PxlPerScn = x2 - x1 + 1; + dst->UdpL_ScnStride = dst->UdpL_PxlPerScn * dst->UdpL_PxlStride; + dst->UdpL_ArSize = dst->UdpL_PxlPerScn * sizeof(float) << 3; + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) + { + DdxFree_(dst); + return( (UdpPtr) BadAlloc ); + } + dst->UdpL_Pos = 0; + dst->UdpL_CompIdx = src->UdpL_CompIdx; + dst->UdpL_Levels = src->UdpL_Levels; + } + else + { + *dst = *src; + dst->UdpL_PxlPerScn = x2 - x1 + 1; + dst->UdpL_ScnStride = dst->UdpL_PxlPerScn * dst->UdpL_PxlStride; + } + /* One scanline UDP */ + dst->UdpL_X1 = x1; + dst->UdpL_X2 = x2; + dst->UdpL_Y1 = y1; + dst->UdpL_Y2 = y1; + dst->UdpL_ScnCnt = 1; + + return( dst ); +} /* end MathGetTempUdp */ + +/***************************************************************************** +** MathDestroyTempUdp +** +** FUNCTIONAL DESCRIPTION: +** +** Free a UDP created by MathGetTempUdp. +** +** FORMAL PARAMETERS: +** +** udp - Pointer to the udp to free. +** realudp - Pointer to a udp which might actually own the storage +** pointed to by udp. +** +*****************************************************************************/ +static void MathDestroyTempUdp( udp, realudp ) +UdpPtr udp; +UdpPtr realudp; + +{ + if( IsPointer_(udp) ) + { + if( IsPointer_(udp->UdpA_Base) && udp->UdpA_Base != realudp->UdpA_Base ) + DdxFreeBits_( udp->UdpA_Base ); + DdxFree_( udp ); + } +} /* end MathDestroyTempUdp */ + +/***************************************************************************** +** MathConvertScanline +** +** FUNCTIONAL DESCRIPTION: +** +** Adjust a UDP to point to the specified scanline of the source +** UDP. If the source UDP is not of type float, convert the +** data and leave it associated with the adjusted UDP. +** +** FORMAL PARAMETERS: +** +** src - Pointer to the source UDP. +** dst - Pointer to the UDP to be adjusted. +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int MathConvertScanline(src, dst) + UdpPtr src; + UdpPtr dst; +{ + int status = Success; + + dst->UdpL_Y1++; + dst->UdpL_Y2++; + + if (src->UdpB_DType != UdpK_DTypeF) + status = DdxConvert_( src, dst, XieK_MoveMode ); + else + dst->UdpL_Pos += src->UdpL_ScnStride; + + return( status ); +} /* end MathConvertScanline */ + +/***************************************************************************** +** MathStoreScanline +** +** FUNCTIONAL DESCRIPTION: +** +** Store a scanline of data into the destination UDP. +** If the scanline UDP already points into the destination UDP, +** just adjust the scanline UDP to point past the scanline already +** stored. If not, copy (and possibly convert) the data into the +** destination. +** +** FORMAL PARAMETERS: +** +** dst - Pointer to scanline UDP +** realdst - Pointer to the destination UDP +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int MathStoreScanline(dst, realdst) + UdpPtr dst; + UdpPtr realdst; +{ + int status = Success; + + if (dst->UdpA_Base != realdst->UdpA_Base) + status = DdxConvert_( dst, realdst, XieK_MoveMode ); + else + dst->UdpL_Pos += realdst->UdpL_ScnStride; + + dst->UdpL_Y1++; + dst->UdpL_Y2++; + + return( status ); +} /* end MathStoreScanline */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiMath.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiMath.h new file mode 100644 index 0000000..7ab87be --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiMath.h @@ -0,0 +1,137 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the MATH pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.0 +** RISC ULTRIX V3.0 +** +** AUTHOR(S): +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Thu Jul 5 14:03:13 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMIMATH +#define _SMIMATH + +/* +** Include files +*/ +#include + + /* + ** Function reference + */ +int SmiMath(); +int SmiCreateMath(); + +/* +** Structure definitions and Typedefs +*/ + +/* +** Math pipeline context block. +*/ +typedef struct _MathPipeCtx { + PipeElementCommonPart common; + struct _MathPart { + PipeSinkPtr srcsnk; + PipeSinkPtr dstsnk; + PipeDrainPtr srcdrn; + long int x1; + long int x2; + long int y1; + long int y2; + UdpPtr cpp; + int (*function)(); + } MathPart; +} MathPipeCtx, *MathPipeCtxPtr; + +/* +** MACRO definitions +*/ + +/* +** Pipeline context, Math part, access MACROs +*/ +#define MthSrcSnk_(ctx) \ + (((MathPipeCtxPtr)(ctx))->MathPart.srcsnk) +#define MthDstSnk_(ctx) (((MathPipeCtxPtr)(ctx))->MathPart.dstsnk) + +#define MthSrcDrn_(ctx) \ + (((MathPipeCtxPtr)(ctx))->MathPart.srcdrn) +#define MthRoiX1_(ctx) (((MathPipeCtxPtr)(ctx))->MathPart.x1) +#define MthRoiX2_(ctx) (((MathPipeCtxPtr)(ctx))->MathPart.x2) +#define MthRoiY1_(ctx) (((MathPipeCtxPtr)(ctx))->MathPart.y1) +#define MthRoiY2_(ctx) (((MathPipeCtxPtr)(ctx))->MathPart.y2) +#define MthCpp_(ctx) (((MathPipeCtxPtr)(ctx))->MathPart.cpp) +#define MthFunc_(ctx) \ + (((MathPipeCtxPtr)(ctx))->MathPart.function) + +#endif +/* _SMIMATH */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiMemMgt.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiMemMgt.c new file mode 100644 index 0000000..2c22d6f --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiMemMgt.c @@ -0,0 +1,326 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/* +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains SMI jacket routines which call either client +** or server memory management functions depending on how its compiled. +** This allows us to use common code for both client and server. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHORS: +** +** John Weber +** +** +** CREATION DATE: August 30, 1989 +** +** MODIFICATION HISTORY: +** +**-- +*/ + +/* +** Include files +*/ +#include +#ifdef SERVER +#include +#include +#include +#endif +#ifdef CLIENT +#include +#endif + +/* #define COUNT_SMIMEMMGT 1 */ +/* #define TRACE_SMIMEMMGT 1 */ + +#ifdef TRACE_SMIMEMMGT + +/* +** If COUNT_SMIMEMMGT is turned on, the trace will report the actual (modified) +** size and address of the allocation. +*/ + +#define TraceAlloc_(ptr, size, name) \ + ErrorF("Allocating %7d bytes at 0x%08x from %s\n", \ + (size),(unsigned)(ptr), name) +#define TraceRealloc_(ptr, size, newptr, name) \ + ErrorF("Realloc to %7d bytes at 0x%08x --> 0x%08x from %s\n", \ + (size), (unsigned)(ptr+4), (unsigned)(newptr), name) +#define TraceFree_(ptr, name) \ + ErrorF("Freeing at 0x%08x from %s\n", \ + (unsigned)(ptr), name) +#else +#define TraceAlloc_(ptr, size, name) +#define TraceRealloc_(ptr, size, newptr, name) +#define TraceFree_(ptr, name) +#endif + + +#ifdef COUNT_SMIMEMMGT +static int OtherMemInUse = 0; +static int BitsMemInUse = 0; +static int TotalMemInUse = 0; +#define CountAdjSize_(nbytes) ((nbytes)+=4) +#define CountAlloc_(ptr, nbytes) (*(int *)(ptr) = nbytes, \ + (ptr)+=4, \ + OtherMemInUse+=nbytes, \ + TotalMemInUse+=nbytes) +#define CountFree_(ptr) ((ptr)-=4, \ + OtherMemInUse-=(*(int *)(ptr)), \ + TotalMemInUse-=(*(int *)(ptr))) + +#define CountAllocBits_(ptr, nbytes) (*(int *)(ptr) = nbytes, \ + (ptr)+=4, \ + BitsMemInUse+=nbytes, \ + TotalMemInUse+=nbytes) +#define CountFreeBits_(ptr) ((ptr)-=4, \ + BitsMemInUse-=(*(int *)(ptr)), \ + TotalMemInUse-=(*(int *)(ptr))) + +void _ReportCurrentMemoryCount() +{ + printf("%8d : bytes allocated by calls to Bits routines\n", BitsMemInUse); + printf("%8d : bytes allocated by calls to regular routines\n", OtherMemInUse); + printf("%8d : total bytes allocated\n", TotalMemInUse ); +} +#else +#define CountAdjSize_(nbytes) +#define CountAlloc_(ptr, nbytes) +#define CountFree_(ptr) +#define CountAllocBits_(ptr, nbytes) +#define CountFreeBits_(ptr) +#endif + + +void *SmiCalloc(number,size) + unsigned number; + unsigned size; +{ +#ifdef SERVER + char *memptr; + + CountAdjSize_(size); + memptr = (char *)Xalloc((number)*(size)); + if (memptr != NULL) + memset(memptr,0,(number)*(size)); + CountAlloc_(memptr, size); + TraceAlloc_(memptr, size*number, "SmiCalloc"); + return (void *)(memptr); +#endif +#ifdef CLIENT + return (void *)Xcalloc((number),(size)); +#endif +} + +unsigned char *SmiCallocBits(bits) + unsigned bits; +{ +#ifdef SERVER + unsigned char *memptr; + int bytes = (bits)+39>>3; + + CountAdjSize_(bytes); + memptr = (unsigned char *) Xalloc(bytes); + + if (memptr != NULL) + memset(memptr,0,bytes); + CountAllocBits_( memptr, bytes ); + TraceAlloc_(memptr, bytes, "SmiCallocBits"); + return (memptr); +#endif +#ifdef CLIENT + return (unsigned char *)Xcalloc(1,(bits)+39>>3); +#endif +} + +void *SmiCfree(ptr) + char *ptr; +{ +#ifdef SERVER + if(IsPointer_(ptr)) { + TraceFree_(ptr, "SmiCfree"); + CountFree_(ptr); + Xfree(ptr); + } +#endif +#ifdef CLIENT + if(ptr) + Xfree(ptr); +#endif + return(0); +} + +void *SmiFree(ptr) + char *ptr; +{ +#ifdef SERVER + if(IsPointer_(ptr)) + { + TraceFree_(ptr, "SmiFree"); + CountFree_(ptr); + Xfree(ptr); + } +#endif +#ifdef CLIENT + if(ptr) + Xfree(ptr); +#endif + return(0); +} + +unsigned char *SmiFreeBits(ptr) + unsigned char *ptr; +{ +#ifdef SERVER + if(IsPointer_(ptr)) { + TraceFree_(ptr, "SmiFreeBits"); + CountFreeBits_(ptr); + Xfree(ptr); + } +#endif +#ifdef CLIENT + if(ptr) + Xfree(ptr); +#endif + return(0); +} + +void *SmiMalloc(size) + unsigned size; +{ +#ifdef SERVER + char *memptr; + + CountAdjSize_(size); + memptr = (char *)Xalloc(size); + + CountAlloc_(memptr, size); + TraceAlloc_(memptr, size, "SmiMalloc"); + return (void *)(memptr); +#endif +#ifdef CLIENT + return (void *)Xmalloc(size); +#endif +} + +unsigned char *SmiMallocBits(bits) + unsigned bits; +{ +#ifdef SERVER + unsigned char *memptr; + int bytes = (bits)+39>>3; + + CountAdjSize_(bytes); + memptr = (unsigned char *) Xalloc(bytes); + + CountAllocBits_(memptr, bytes ); + TraceAlloc_(memptr, bytes, "SmiMallocBits"); + return (memptr); +#endif +#ifdef CLIENT + return (unsigned char *)Xmalloc((bits)+39>>3); +#endif +} + +void *SmiRealloc(ptr,size) + char *ptr; + unsigned size; +{ +#ifdef SERVER + char *memptr; + + CountFree_(ptr); + CountAdjSize_(size); + memptr = (char *)Xrealloc(ptr,size); + CountAlloc_(memptr, size); + + TraceRealloc_(ptr, size, memptr, "SmiRealloc"); + return (void *)(memptr); +#endif +#ifdef CLIENT + return (void *)Xrealloc(ptr,size); +#endif +} + +unsigned char *SmiReallocBits(ptr,bits) + unsigned char *ptr; + unsigned bits; +{ +#ifdef SERVER + unsigned char *memptr; + int bytes = (bits)+39>>3; + + CountFreeBits_(ptr); + CountAdjSize_(bytes); + memptr = (unsigned char *)Xrealloc(ptr,bytes); + CountAllocBits_(memptr, bytes ); + + TraceRealloc_(ptr, bytes, memptr, "SmiReallocBits"); + return (memptr); +#endif +#ifdef CLIENT + return (unsigned char *)Xrealloc(ptr,(bits)+39>>3); +#endif +} + diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiMemMgt.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiMemMgt.h new file mode 100644 index 0000000..3c0af60 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiMemMgt.h @@ -0,0 +1,98 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the SMI Memory Management module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** +** AUTHOR(S): +** +** Richard Hennessy +** +** CREATION DATE: +** +** September 25, 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMIMEMMGT +#define _SMIMEMMGT + + /* + ** Include files + */ + + /* + ** Function reference + */ +void *SmiCalloc(); +unsigned char *SmiCallocBits(); +void *SmiCfree(); +void *SmiFree(); +unsigned char *SmiFreeBits(); +void *SmiMalloc(); +unsigned char *SmiMallocBits(); +void *SmiRealloc(); +unsigned char *SmiReallocBits(); + +#endif +/* _SMIMEMMGT */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiMi.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiMi.c new file mode 100644 index 0000000..05a12f9 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiMi.c @@ -0,0 +1,371 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/*********************************************************** +Copyright 1989,1990 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Image Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains the connection to the Machine Independent(MI) +** software that is the base of the XIE server. Another module, SmiDdx.c, +** contains the connection to the DDX version of the base. +** +** The connection consists of: +** - MI function dispatch table +** - MI pipeline CREATE dispatch table +** - MI image array alignment dispatch table +** +** ENVIRONMENT: +** +** VAX/VMS V5.x > +** ULTRIX V4.0 > +** +** AUTHOR(S): +** +** Richard D. Hennessy +** Robert NC Shelley +** +** CREATION DATE: +** +** October 12, 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ + +/* +** Include files +*/ +#include +#include "XieDdx.h" +#include "XieUdpDef.h" + +#include "SmiArea.h" +#include "SmiArithmetic.h" +#include "SmiChangeList.h" +#include "SmiChromeCom.h" +#include "SmiChromeSep.h" +#include "SmiCompare.h" +#include "SmiConstrain.h" +#include "SmiConvert.h" +#include "SmiCrop.h" +#include "SmiDctDef.h" +#include "SmiDecodeDct.h" +#include "SmiDecodeG4.h" +#include "SmiDither.h" +#include "SmiEncodeDct.h" +#include "SmiEncodeG4.h" +#include "SmiFfx.h" +#include "SmiFill.h" +#include "SmiHistogram.h" +#include "SmiLogical.h" +#include "SmiLuminance.h" +#include "SmiMatchHistogram.h" +#include "SmiMath.h" +#include "SmiMemMgt.h" +#include "SmiMirror.h" +#include "SmiPipe.h" +#include "SmiPipeRsm.h" +#include "SmiPipeSched.h" +#include "SmiPoint.h" +#include "SmiRotate.h" +#include "SmiScale.h" +#include "SmiStats.h" +#include "SmiTranslate.h" +#include "SmiUtil.h" + +/* +** Table of contents +*/ + +/* +** Externs +*/ +/* +** Local Storage +*/ + +/***************************************************************************** +** +** xieMiProc - +** +** FUNCTIONAL DESCRIPTION: +** +** The miProc dispatch table is utilized by MI callers to access MI +** routines without having to know the explicit MI name of the routine. +** This independence will allow substitution of an MI layer in the XIE +** server without code changes in the remainder of the server.. +** +*****************************************************************************/ + /* + ** MI dispatch table + */ +externaldef(xieMiProc) unsigned long (*xieMiProc[])() = { + (Fcard32)SmiArea, /* 0 DDX Atomic operations */ + (Fcard32)SmiStatsArea, + (Fcard32)SmiArithmetic, + (Fcard32)SmiHistogram, + (Fcard32)SmiConvert, + (Fcard32)SmiConvert, /* 5 */ + (Fcard32)SmiCompare, + (Fcard32)SmiConstrain, + (Fcard32)SmiCopy, + (Fcard32)SmiDither, + (Fcard32)SmiFill, /* 10 */ + (Fcard32)SmiLogical, + (Fcard32)SmiLuminance, + (Fcard32)SmiMatchHistogram, + (Fcard32)SmiMath, + (Fcard32)SmiMirror, /* 15 */ + (Fcard32)SmiPoint, + (Fcard32)SmiStatsPoint, + (Fcard32)SmiRotate, + (Fcard32)SmiScale, + (Fcard32)SmiTranslate, /* 20 */ + + (Fcard32)RmOwnData, /* 21..32 -- was compression handlers */ + NULL, + NULL, + NULL, + NULL, /* 25 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 30 */ + NULL, + NULL, + NULL, /* Only defined in the DDX table */ + NULL, + NULL, /* 35 */ + + (Fcard32)SmiConvert, /* MI Support routines */ + (Fcard32)SmiCopy, + (Fcard32)SmiGetTyp, + (Fcard32)SmiCopyBits, + (Fcard32)SmiResolveUdp, /* 40 */ + +#ifdef CLIENT + (Fcard32)XieCalloc, /* CLIENT needs to use Xie */ + (Fcard32)XieCallocBits, + (Fcard32)XieCfree, + (Fcard32)XieFree, + (Fcard32)XieFreeBits, /* 45 */ + (Fcard32)XieMalloc, + (Fcard32)XieMallocBits, + (Fcard32)XieRealloc, + (Fcard32)XieReallocBits, +#else + (Fcard32)SmiCalloc, /* MI Memory mgt routines */ + (Fcard32)SmiCallocBits, + (Fcard32)SmiCfree, + (Fcard32)SmiFree, + (Fcard32)SmiFreeBits, /* 45 */ + (Fcard32)SmiMalloc, + (Fcard32)SmiMallocBits, + (Fcard32)SmiRealloc, + (Fcard32)SmiReallocBits, +#endif + (Fcard32)SmiCreatePipeline, /* 50 Pipeline routines */ + (Fcard32)SmiDestroyPipeline, + (Fcard32)SmiPipeHasYielded, + (Fcard32)SmiInitiatePipeline, + (Fcard32)SmiResumePipeline, + (Fcard32)SmiFlushPipeline, /* 55 */ + (Fcard32)SmiAbortPipeline, + + (Fcard32)RmAllocData, /* Pipe rsrc mgr routines*/ + (Fcard32)RmAllocDataDesc, + (Fcard32)RmAllocPermDesc, + (Fcard32)RmAllocRefDesc, /* 60 */ + (Fcard32)RmBestDType, + (Fcard32)RmCreateDrain, + (Fcard32)RmCreateSink, + (Fcard32)RmDeallocData, + (Fcard32)RmDeallocDataDesc, /* 65 */ + (Fcard32)RmDestroyDrain, + (Fcard32)RmDestroySink, + (Fcard32)RmGetData, + (Fcard32)RmGetDType, + (Fcard32)RmGetMaxQuantum, /* 70 */ + (Fcard32)RmGetQuantum, + (Fcard32)RmHasQuantum, + (Fcard32)RmInitializePort, + NULL, + (Fcard32)RmMergeBuffers, /* 75 */ + (Fcard32)RmObtainQuantum, + (Fcard32)RmPutData, + (Fcard32)RmSetDType, + (Fcard32)RmSetQuantum, + (Fcard32)RmSplitBuffers, /* 80 */ + + (Fcard32)SchedProcessComplete, /* Pipe schedule funcs */ + (Fcard32)SchedProcessReady, + (Fcard32)SchedOkToRun, + + (Fcard32)MiBuildChangeList, /* Change list funcs */ + (Fcard32)MiPutRuns, /* 85 */ + (Fcard32)MiFfsLong, + (Fcard32)MiFfcLong, + + (Fcard32)SmiFillRegion, + (Fcard32)SmiConvertCpp, + (Fcard32)SmiCopyCpp, /* 90 */ + (Fcard32)SmiEncodeG4, + (Fcard32)SmiEncodeDct, + (Fcard32)SmiDecodeG4, + (Fcard32)SmiDecodeDct, + (Fcard32)SmiPosCl, /* 95 */ + NULL, + (Fcard32)RmAllocCmpDataDesc, /* More RM functions */ + (Fcard32)RmSetAlignment, + (Fcard32)RmCreateDataDesc, + + (Fcard32)SmiCreatePipeCtx, /* 100 */ + (Fcard32)SmiUsingCL, + (Fcard32)SmiCmpPreferred, + (Fcard32)RmAllocDataArray, + (Fcard32)RmAllocCmpPermDesc, + (Fcard32)SchedProcessNoInput, /* 105 */ + NULL + }; + +/***************************************************************************** +** +** XieMiSetup - +** +** FUNCTIONAL DESCRIPTION: +** +** XieMiSetup is the DDX dispatch table used to find MI versions of +** the Create Pipe Element routines. +** +** Routines in this table should be called through the macros +** defined in XieDdx.h. +** +*****************************************************************************/ + /* + ** MI process dispatch table + */ +externaldef(xieMiSetup) card32 (*xieMiSetup[])() = { + (Fcard32)SmiCreateArea, /* 0 */ + (Fcard32)SmiCreateArithmetic, + (Fcard32)SmiCreateChromeCom, + (Fcard32)SmiCreateChromeSep, + (Fcard32)SmiCreateCompare, + (Fcard32)SmiCreateConstrain, /* 5 */ + (Fcard32)SmiCreateCrop, + (Fcard32)SmiCreateDither, + (Fcard32)SmiCreateFill, + (Fcard32)SmiCreateLogical, + (Fcard32)SmiCreateLuminance, /* 10 */ + (Fcard32)SmiCreateMatchHistogram, + (Fcard32)SmiCreateMath, + (Fcard32)SmiCreateMirror, + (Fcard32)SmiCreatePoint, + (Fcard32)SmiCreateRotate, /* 15 */ + (Fcard32)SmiCreateScale, + (Fcard32)SmiCreateTranslate, + (Fcard32)SmiCreateDecodeDct, + (Fcard32)SmiCreateEncodeDct, + (Fcard32)SmiCreateDecodeG4, + (Fcard32)SmiCreateEncodeG4, + NULL + }; + +/***************************************************************************** +** +** XieMiAlign - +** +** FUNCTIONAL DESCRIPTION: +** +** XieMiAlign is the DDX dispatch table used to call the +** MI versions of the image array alignment functions. +** +** A NULL value is used by alignment logic throughout the XIE server +** to indicate "don't care", "no alignment needed". +** +** If alignment is needed, an alignment function must entered in this +** table in the operator/pipeline element named slot. +** +** These functions should be called using the macros defined in XieDdx.h. +** +*****************************************************************************/ + +externaldef(xieMiAlign) void (*xieMiAlign[])() = { + NULL, /* 0 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 5 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 10 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 15 */ + NULL, + NULL, + NULL, + NULL, + NULL, /* 20 */ + NULL, + NULL, + NULL, + NULL + }; +/* end of module SmiMi.c */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiMirror.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiMirror.c new file mode 100644 index 0000000..570c099 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiMirror.c @@ -0,0 +1,569 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* DEC/CMS REPLACEMENT HISTORY, Element SMIROTATE.C */ +/* *11 13-MAR-1990 10:16:31 GREBUS "Fixed bug. Temp buffers must match drain datatype." */ +/* *10 9-MAR-1990 14:48:18 GREBUS "Fixed rotate when dest sink bigger than source." */ +/* *9 8-MAR-1990 14:54:02 GREBUS "ADD PIPELINE SUPPORT." */ +/* *8 3-JAN-1990 13:18:39 TAG "break up macro too complex for Pmax" */ +/* *7 2-NOV-1989 19:13:42 SHELLEY "move degrees to radians conversion factor to XieDdx.h" */ +/* *6 1-NOV-1989 19:55:10 TAG "copyright" */ +/* *5 30-OCT-1989 13:47:48 SHELLEY "duplicate code to improve execution speed" */ +/* *4 27-OCT-1989 14:46:36 SHELLEY "replace with all purpose version" */ +/* *3 2-OCT-1989 10:07:31 TAG "change angle from float to double" */ +/* *2 25-SEP-1989 15:14:31 GARIKAPATI " added support for bitonal rotate" */ +/* *1 14-SEP-1989 11:54:57 GARIKAPATI " rotate functionality" */ +/* DEC/CMS REPLACEMENT HISTORY, Element SMIROTATE.C */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** X Image Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains sample code for image data rotation. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Tue Mar 13 15:38:35 1990 +** +** MODIFICATION HISTORY: +** +*******************************************************************************/ + +/* +** Include files +*/ +#include + +#include "SmiMirror.h" + +/* +** Table of contents +*/ +int SmiMirror(); +int SmiCreateMirror(); + +static int _MirrorInitialize(); +static int _MirrorActivate(); +static int _MirrorFlush(); +static int _MirrorAbort(); +static int _MirrorDestroy(); + +static void _MirrorProcess(); +static UdpPtr _CvtSrc(); + +/* +** Equated Symbols +*/ +#define FALSE 0 +#define TRUE 1 + +/* +** MACRO definitions +*/ + +/* +** External References +*/ + +/* + * Local Storage + */ + +/* Mirror Pipeline Element Vector */ +static PipeElementVector MirrorPipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeMirrorElement, /* Structure subtype */ + sizeof(MirrorPipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _MirrorInitialize, /* Initialize entry */ + _MirrorActivate, /* Activate entry */ + NULL, /* Flush entry */ + _MirrorDestroy, /* Destroy entry */ + NULL /* Abort entry */ + }; + +/***************************************************************************** +** SmiCreateMirror +** +** FUNCTIONAL DESCRIPTION: +** +** This function fills in a newly created MIRROR pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - mirror pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCreateMirror( pipe, srcsnk, dstsnk, xflip, yflip ) + Pipe pipe; + PipeSinkPtr srcsnk; + PipeSinkPtr dstsnk; + int xflip; + int yflip; +{ + MirrorPipeCtxPtr ctx = (MirrorPipeCtxPtr) + DdxCreatePipeCtx_(pipe, &MirrorPipeElement, FALSE); + if( !IsPointer_(ctx) ) return( (int) ctx ); + + /* + ** Copy the parameters to the context block. + */ + MirSrcSnk_(ctx) = srcsnk; + MirDstSnk_(ctx) = dstsnk; + MirXFlip_(ctx) = xflip; + MirYFlip_(ctx) = yflip; + /* + ** Setup one drain from source sink, receiving all components + */ + MirSrcDrn_(ctx) = DdxRmCreateDrain_( srcsnk, -1 ); + if( !IsPointer_(MirSrcDrn_(ctx)) ) return( (int) MirSrcDrn_(ctx) ); + /* + ** Decide on data types we'll allow (we're not too fussy). + */ + DdxRmSetDType_( MirSrcDrn_(ctx), UdpK_DTypeUndefined, DtM_Any ); + DdxRmSetDType_( MirDstSnk_(ctx), UdpK_DTypeUndefined, DtM_Any ); + /* + ** Handle any quantum or wait for full image depending on X flip. + */ + DdxRmSetQuantum_( MirSrcDrn_(ctx), xflip ? SnkHeight_(srcsnk,0) : 0 ); + DdxRmSetQuantum_( MirDstSnk_(ctx), xflip ? SnkHeight_(srcsnk,0) : 0 ); + + return( Success ); +} /* end SmiCreateMirror */ + +/***************************************************************************** +** _MirrorInitialize +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the MIRROR pipeline element prior to +** an activation. +** +** FORMAL PARAMETERS: +** +** ctx - mirror pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _MirrorInitialize(ctx) +MirrorPipeCtxPtr ctx; +{ + int dtype, status; + + /* + ** Initialize the source drain. + */ + CtxInp_(ctx) = MirSrcDrn_(ctx); + status = DdxRmInitializePort_( CtxHead_(ctx), MirSrcDrn_(ctx) ); + if( status != Success ) return( status ); + /* + ** Set our destination sink DType to match our source and initialize it. + */ + dtype = DdxRmGetDType_( MirSrcDrn_(ctx) ); + DdxRmSetDType_( MirDstSnk_(ctx), dtype, 1<UdpA_Base == NULL ) + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); +if( dst->UdpA_Base == NULL ) + status = BadAlloc; +else + /* Do the actual work */ + _MirrorProcess(src, dst, xflip, yflip); + +if( src != in ) + { /* free converted input data */ + DdxFreeBits_( src->UdpA_Base ); + DdxFree_( src ); + } +return( status ); +} /* end SmiMirror */ + +/****************************************************************************** +** _MirrorProcess +** +** FUNCTIONAL DESCRIPTION: +** +** Mirror an image about the X or Y, or X and Y axes. +** +** FORMAL PARAMETERS: +** +** in - Pointer to source udp (initialized) +** dst - Pointer to destination udp (initialized, maybe without array) +** xflip - Mirror about the X axis (Boolean) +** yflip - Mirror about the Y axis (Boolean) +** +******************************************************************************/ +static void _MirrorProcess( src, dst, xflip, yflip ) +UdpPtr src; +UdpPtr dst; +int xflip; +int yflip; +{ +unsigned long pxlind, scnind; /* Pixel and scanline indices */ +unsigned long srcpxloff, dstpxloff; /* Offsets to current pixels */ + +unsigned long srcscnoff,dstscnoff; /* Offsets to start of current scan + * lines */ +unsigned long flippxloff; /* Offsets to first pixel in scanline + * to process. */ + +int dstpxlinc, dstscninc; /* Increment to successor + * pixel/scanline in dest */ + +unsigned long pxlval; /* Temporary pixel value */ + +unsigned long smask, dmask; /* Src and dst pixel value masks */ + +/* + * Setup the offsets and increments. + */ +srcscnoff = src->UdpL_Pos; + +if (xflip){ + /* Storing to last scan line and working backward */ + dstscninc = -dst->UdpL_ScnStride; + dstscnoff = (dst->UdpL_ScnCnt -1) * dst->UdpL_ScnStride + dst->UdpL_Pos; +}else { + /* Storing to first scan and working forward */ + dstscninc = dst->UdpL_ScnStride; + dstscnoff = dst->UdpL_Pos; +} +if (yflip) { + /* Storing to last pixel and working backward */ + dstpxlinc = -dst->UdpL_PxlStride; + flippxloff = (dst->UdpL_PxlPerScn -1) * dst->UdpL_PxlStride; +}else { + /* Storing to first pixel and working forward */ + dstpxlinc = dst->UdpL_PxlStride; + flippxloff = 0; +} +/* +** Mirror the image data (code duplication traded for execution efficiency). +*/ +switch( DdxGetTyp_( dst ) ) + { +case XieK_UBAV : +case XieK_UBAVU : + /* + ** Mirror aligned or unaligned bit stream image data. + */ + smask = (1<UdpW_PixelLength)-1; /* mask for isolating src pixel */ + dmask = (1<UdpW_PixelLength)-1; /* mask for isolating dst pixel */ + + for( scnind = 0; scnind < src->UdpL_ScnCnt; scnind++ ) { + srcpxloff = srcscnoff; /* initial pixel bit offset */ + dstpxloff = dstscnoff + flippxloff;; + + for( pxlind = 0; pxlind < dst->UdpL_PxlPerScn; pxlind++ ) + { /* + ** Copy the pixel. + */ + pxlval = GET_VALUE_( src->UdpA_Base, srcpxloff, smask ); + PUT_VALUE_( dst->UdpA_Base, dstpxloff, pxlval, dmask ); + + srcpxloff += src->UdpL_PxlStride; /* Position to next pixel */ + dstpxloff += dstpxlinc; + } + srcscnoff += src->UdpL_ScnStride; /* Position to next scanline */ + dstscnoff += dstscninc; + } + break; /* end unaligned bit stream image */ + +case XieK_ABU : + /* + ** Mirror byte aligned byte size image data. + */ + for( scnind = 0; scnind < src->UdpL_ScnCnt; scnind++ ) + { + srcpxloff = srcscnoff; /* initial pixel bit offset */ + dstpxloff = dstscnoff + flippxloff;; + + for( pxlind = 0; pxlind < dst->UdpL_PxlPerScn; pxlind++ ) + { /* + ** Copy the pixel. + */ + *((unsigned char *)(dst->UdpA_Base + (dstpxloff >> 3))) = + *((unsigned char *)(src->UdpA_Base + (srcpxloff >> 3))); + + srcpxloff += src->UdpL_PxlStride; /* Position to next pixel */ + dstpxloff += dstpxlinc; + } + srcscnoff += src->UdpL_ScnStride; /* Position to next scanline */ + dstscnoff += dstscninc; + } + break; /* end aligned byte image */ + +case XieK_AWU : + /* + ** Mirror byte aligned word (16 bit short) size image data. + */ + for( scnind = 0; scnind < src->UdpL_ScnCnt; scnind++ ) + { + srcpxloff = srcscnoff; /* initial pixel bit offset */ + dstpxloff = dstscnoff + flippxloff;; + + for( pxlind = 0; pxlind < dst->UdpL_PxlPerScn; pxlind++ ) + { /* + ** Copy the pixel. + */ + *((unsigned short *)(dst->UdpA_Base + (dstpxloff >> 3))) = + *((unsigned short *)(src->UdpA_Base + (srcpxloff >> 3))); + + srcpxloff += src->UdpL_PxlStride; /* Position to next pixel */ + dstpxloff += dstpxlinc; + } + srcscnoff += src->UdpL_ScnStride; /* Position to next scanline */ + dstscnoff += dstscninc; + } + break; /* end aligned byte image */ + +case XieK_AF : + /* + ** Mirror aligned float image data. + */ + smask = (1<UdpW_PixelLength)-1; /* mask for isolating src pixel */ + dmask = (1<UdpW_PixelLength)-1; /* mask for isolating dst pixel */ + + for( scnind = 0; scnind < src->UdpL_ScnCnt; scnind++ ) + { + srcpxloff = srcscnoff; /* initial pixel bit offset */ + dstpxloff = dstscnoff + flippxloff;; + + for( pxlind = 0; pxlind < dst->UdpL_PxlPerScn; pxlind++ ) + { /* + ** Copy the pixel. + */ + *((float *)(dst->UdpA_Base + (dstpxloff >> 3))) = + *((float *)(src->UdpA_Base + (srcpxloff >> 3))); + + srcpxloff += src->UdpL_PxlStride; /* Position to next pixel */ + dstpxloff += dstpxlinc; + } + srcscnoff += src->UdpL_ScnStride; /* Position to next scanline */ + dstscnoff += dstscninc; + } + break; /* end aligned float image */ + } +} /* end _MirrorProcess */ + +/****************************************************************************** +** _CvtSrc +** +** FUNCTIONAL DESCRIPTION: +** +** Convert src to match dst if data types don't match. +** +** FORMAL PARAMETERS: +** +** in - Pointer to src udp +** dst - Pointer to dst udp +** +******************************************************************************/ +static UdpPtr _CvtSrc( in, dst ) +UdpPtr in, dst; +{ + int status; + UdpPtr src; + + if( in->UdpB_DType == dst->UdpB_DType ) + return( in ); + + src = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( src == NULL ) return( (UdpPtr) BadAlloc ); + + *src = *in; + src->UdpB_DType = dst->UdpB_DType; + src->UdpB_Class = dst->UdpB_Class; + src->UdpW_PixelLength = dst->UdpW_PixelLength; + src->UdpL_PxlStride = dst->UdpL_PxlStride; + src->UdpL_ScnStride = src->UdpL_PxlStride * in->UdpL_PxlPerScn; + src->UdpL_ArSize = src->UdpL_ScnStride * in->UdpL_ScnCnt; + src->UdpA_Base = 0; + + status = DdxConvert_( in, src, XieK_MoveMode ); + if( status != Success ) + { + DdxFree_(src); + src = (UdpPtr) status; + } + return( src ); +} /* end _CvtSrc */ +/* end module SmiMirror.c */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiMirror.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiMirror.h new file mode 100644 index 0000000..c86edd0 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiMirror.h @@ -0,0 +1,124 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* DEC/CMS REPLACEMENT HISTORY, Element SMIROTATE.H */ +/* *3 13-MAR-1990 10:17:33 GREBUS "Fixed bug. Temp buffers must match drain datatype" */ +/* *2 9-MAR-1990 14:49:50 GREBUS "Change rotate context structure." */ +/* *1 8-MAR-1990 15:44:37 GREBUS "New element for rotates" */ +/* DEC/CMS REPLACEMENT HISTORY, Element SMIROTATE.H */ +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the MIRROR pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.1 +** RISC ULTRIX V3.1 +** +** AUTHOR(S): +** +** Gary Grebus +** +** CREATION DATE: +** +** Tue Mar 13 14:44:57 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMIMIRROR +#define _SMIMIRROR + +/* +** Include files +*/ +#include + + /* + ** Function reference + */ +int SmiMirror(); +int SmiCreateMirror(); + +/* +** Mirror pipeline context block. +*/ +typedef struct _MirrorPipeCtx { + PipeElementCommonPart common; + struct _MirrorPart { + PipeSinkPtr src; + PipeSinkPtr dst; + PipeDrainPtr srcdrn; + int xflip; + int yflip; + } MirrorPart; +} MirrorPipeCtx, *MirrorPipeCtxPtr; + +/* +** MACRO definitions +*/ + /* + ** Pipeline context access MACROs + */ +#define MirSrcSnk_(ctx) (((MirrorPipeCtxPtr)(ctx))->MirrorPart.src) +#define MirDstSnk_(ctx) (((MirrorPipeCtxPtr)(ctx))->MirrorPart.dst) +#define MirSrcDrn_(ctx) (((MirrorPipeCtxPtr)(ctx))->MirrorPart.srcdrn) +#define MirXFlip_(ctx) (((MirrorPipeCtxPtr)(ctx))->MirrorPart.xflip) +#define MirYFlip_(ctx) (((MirrorPipeCtxPtr)(ctx))->MirrorPart.yflip) + +#endif +/* _SMIMIRROR */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiPipe.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiPipe.c new file mode 100644 index 0000000..ca3507f --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiPipe.c @@ -0,0 +1,540 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains user interface routines for pipelined processing +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.0 +** RISC ULTRIX V3.0 +** +** AUTHOR(S): +** +** Original: John Weber +** Modified for optimized pipes: Richard Hennessy +** +** CREATION DATE: +** +** March 27, 1989 +** +** MODIFICATION HISTORY: +** May 28, 1991 == Modified for optimized pipes +** +************************************************************************/ + +/* +** Include files +*/ +#include + +#include "SmiPipe.h" + +/* +** Table of contents +*/ +int SmiAbortPipeline(); +PipeElementCtxPtr SmiCreatePipeCtx(); +Pipe SmiCreatePipeline(); +int SmiDestroyPipeline(); +int SmiFlushPipeline(); +int SmiInitiatePipeline(); +int SmiPipeHasYielded(); +int SmiResumePipeline(); + +/* +** MACRO definitions +*/ + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* +** Local Storage +*/ + +/************************************************************************ +** SmiAbortPipeline +** +** FUNCTIONAL DESCRIPTION: +** +** This function will abort a potentially running pipe. +** Only the active pipe, either base or optimized, will be aborted. +** +** FORMAL PARAMETERS: +** +** pipe = pointer to pipe hearder struct +** +** FUNCTION VALUE: +** +** [@description_or_none@] +** +************************************************************************/ +int SmiAbortPipeline( pipe ) + Pipe pipe; +{ + int status, return_status = Success; + PipeDataPtr data; + PipeElementCtxPtr ctx; + + if( QueueEmpty_(pipe) ) return (Success); + + if (PipeOptPtr_(pipe) != NULL) + /* + ** Abort the optimized pipe. + */ + return( SmiAbortPipeline(PipeOptPtr_(pipe)) ); + + for( ctx = CtxNxt_(pipe); CtxTyp_(ctx) != TypePipe; ctx = CtxNxt_(ctx) ) + { + if( CtxAbort_(ctx) != NULL && CtxStatus_(ctx) != StatusComplete ) + { + status = (*CtxAbort_(ctx))(ctx); + if( status != Success ) + return_status = status; + } + CtxStatus_(ctx) = StatusComplete; + } + /* + ** Free pipe data descriptor cache... + */ + for( data = PipeDscFlk_(pipe); + data != PipeDsc_(pipe); + data = PipeDscFlk_(pipe) ) + { + RemQue_(data); + DdxFree_(data); + } + return( return_status ); +} /* end of SmiAbortPipeline */ + +/************************************************************************ +** SmiCreatePipeCtx +** +** FUNCTIONAL DESCRIPTION: +** +** Create a pipe element of the speicified type and add it +** to the current pipeline. +** +** FORMAL PARAMETERS: +** +** pipeline - pointer to the header of the pipe currently under +** construction +** element - pointer to the vector for the element being added +** athead - boolean indicating this element goes at the head +** of the pipe. +** +** FUNCTION VALUE: +** +** pointer to the newly created pipe context +** +************************************************************************/ +PipeElementCtxPtr SmiCreatePipeCtx( pipeline, element, athead ) + Pipe pipeline; + PipeElementVectorPtr element; + int athead; +{ + int count, *dst; + QueuePtr pred; + PipeElementCtxPtr ctx = (PipeElementCtxPtr) + DdxCalloc_(1, VecCtxSiz_(element)); + if( ctx != NULL ) + { /* + ** Initialize misc context block fields. + */ + CtxSiz_(ctx) = VecCtxSiz_(element); + CtxTyp_(ctx) = TypePipeElementCtx; + CtxSubTyp_(ctx) = VecSubTyp_(element); + CtxVecPtr_(ctx) = element; + CtxHead_(ctx) = pipeline; + /* + ** Insert context block on the pipe queue. + */ + pred = athead ? (QueuePtr) &(pipeline->bhd) : + (QueuePtr) pipeline->bhd.blink; + InsQue_(ctx,pred); + } + else + ctx = (PipeElementCtxPtr) BadAlloc; + + return( ctx ); +} /* end of SmiCreatePipeCtx */ + +/************************************************************************ +** SmiCreatePipeline +** +** FUNCTIONAL DESCRIPTION: +** +** This function allocates and initializes a pipeline header. +** +** FORMAL PARAMETERS: +** +** None. +** +** FUNCTION VALUE: +** +** PipelineHeadPtr +** +************************************************************************/ +Pipe SmiCreatePipeline(slice) + unsigned int slice; +{ + int i; + Pipe pipe = (Pipe) DdxCalloc_(1,sizeof(PipelineHead)); + + if( pipe != NULL ) + { + pipe->bhd.flink = (BhdPtr) pipe; + pipe->bhd.blink = (BhdPtr) pipe; + pipe->bhd.size = sizeof(PipelineHead); + pipe->bhd.type = TypePipe; + PipePxlCnt_(pipe) = 0; + PipeTimeSlice_(pipe) = slice; + IniQue_( PipeDsc_(pipe) ); + PipeOptPtr_(pipe) = NULL; + } + else + pipe = (Pipe) BadAlloc; + + return( pipe ); +} /* end of SmiCreatePipeline */ + +/************************************************************************ +** SmiDestroyPipeline +** +** FUNCTIONAL DESCRIPTION: +** +** This function will destroy the pipeline. +** If an optimized pipe then destroy it as well. +** +** FORMAL PARAMETERS: +** +** pipe == pointer to a pipeline header block +** +** FUNCTION VALUE: +** +************************************************************************/ +int SmiDestroyPipeline( pipe ) + Pipe pipe; +{ + int status, return_status = Success; + PipeElementCtxPtr ctx; + PipeDataPtr data; + PipeElementCtxPtr start; + + if( !IsPointer_(pipe) ) return( return_status ); + + if( PipeOptPtr_(pipe) != NULL ) + /* + ** Destroy the optimized pipeline, which has all the resources + ** associated with it. Any base pipe contexts which did not + ** get copied to the optimized pipe have already been called at + ** their Destroy routines by the pipeline optimizer. + */ + return_status = SmiDestroyPipeline( PipeOptPtr_(pipe) ); + + else + { /* + ** Destroy the resources associated with the pipeline + */ + for( ctx = PipeCtxNxt_(pipe); + CtxTyp_(ctx) != TypePipe; + ctx = PipeCtxNxt_(pipe) ) + { + if( !IsPointer_(ctx) ) + continue; + if( CtxDestroy_(ctx) != NULL ) + { + status = (*CtxDestroy_(ctx))(ctx); + if( status != Success ) + return_status = status; + } + RemQue_(ctx); + DdxCfree_(ctx); + } + } + /* + ** Free the pipe element contexts that make up the base pipe. + */ + for( ctx = (PipeElementCtxPtr)pipe->bhd.flink; + CtxTyp_(ctx) != TypePipe; + ctx = (PipeElementCtxPtr)pipe->bhd.flink ) + { + if( !IsPointer_(ctx) ) + continue; + RemQue_(ctx); + DdxCfree_(ctx); + } + DdxFree_(pipe); + + return( return_status ); +} /* end of SmiDestroyPipeline */ + +/************************************************************************ +** SmiFlushPipeline +** +** FUNCTIONAL DESCRIPTION: +** +** Run the active pipe one more time and then cause each +** processing element to perform its flush processing. +** +** FORMAL PARAMETERS: +** +** [@description_or_none@] +** +** FUNCTION VALUE: +** +** [@description_or_none@] +** +************************************************************************/ +int SmiFlushPipeline( pipe ) + Pipe pipe; +{ + PipeDataPtr data; + PipeElementCtxPtr ctx; + int status = Success; + + if( QueueEmpty_(pipe) ) return( Success ); + + if ( PipeOptPtr_(pipe) != NULL ) + /* + ** Flush the optimized pipeline. + */ + status = SmiFlushPipeline(PipeOptPtr_(pipe) ); + + else + { /* + ** Activate processes while the scheduler says they're ready. + */ + status = DdxResumePipeline_(pipe); + if( DdxPipeHasYielded_(pipe) ) + return( Success ); + + /* + ** When pipe stalls, flush contents... + */ + ctx = (PipeElementCtxPtr) CtxNxt_(pipe); + + while( status == Success && CtxTyp_(ctx) != TypePipe ) + { + if( CtxFlush_(ctx) != NULL && CtxStatus_(ctx) != StatusComplete ) + status = (*CtxFlush_(ctx))(ctx); + + CtxStatus_(ctx) = StatusComplete; + + if( status == Success ) + status = DdxResumePipeline_( pipe ); + if( DdxPipeHasYielded_(pipe) ) + break; + + ctx = CtxNxt_(ctx); + } + } + /* + ** Free pipe data descriptor cache... + */ + for( data = PipeDscFlk_(pipe); + data != PipeDsc_(pipe); + data = PipeDscFlk_(pipe) ) + { + RemQue_(data); + DdxFree_(data); + } + return( status ); +} /* end of SmiFlushPipeline */ + +/************************************************************************ +** SmiInitiatePipeline +** +** FUNCTIONAL DESCRIPTION: +** +** [@tbs@] +** +** FORMAL PARAMETERS: +** +** [@description_or_none@] +** +** FUNCTION VALUE: +** +** [@description_or_none@] +** +************************************************************************/ +int SmiInitiatePipeline( pipe ) + Pipe pipe; +{ + int status = Success; + PipeElementCtxPtr ctx; + + if( QueueEmpty_(pipe) ) return( Success ); + + if ( PipeOptPtr_(pipe) != NULL ) + /* + ** Initialize the optimized pipeline. + */ + return( SmiInitiatePipeline(PipeOptPtr_(pipe)) ); + + for( ctx = CtxNxt_(pipe); CtxTyp_(ctx) != TypePipe; ctx = CtxNxt_(ctx) ) + { + if( CtxInit_(ctx) != NULL ) + { + status = (*CtxInit_(ctx))(ctx); + if( status != Success ) + break; + } + CtxStatus_(ctx) = StatusReady; + } + return( status ); +} /* end of SmiInitiatePipeline */ + +/************************************************************************ +** SmiPipeHasYielded +** +** FUNCTIONAL DESCRIPTION: +** +** Indicates if the specified pipeline has reached a point where +** it wishes to yield control before completion. +** +** FORMAL PARAMETERS: +** +** pipe - the DDX pipeline to test +** +** FUNCTION VALUE: +** +** TRUE if pipe has yielded, else FALSE; +** +************************************************************************/ +int SmiPipeHasYielded( pipe ) + Pipe pipe; +{ + + if( PipeOptPtr_( pipe ) != NULL ) + return( SmiPipeHasYielded( PipeOptPtr_( pipe ) ) ); + + else + return( PipePxlCnt_(pipe) > PipeTimeSlice_(pipe) && + PipeTimeSlice_(pipe) != 0 ); + +} /* end of SmiPipeHasYielded */ + +/************************************************************************ +** SmiResumePipeline +** +** FUNCTIONAL DESCRIPTION: +** +** [@tbs@] +** +** FORMAL PARAMETERS: +** +** pipe - the DDX pipeline to be run +** +** FUNCTION VALUE: +** +** [@description_or_none@] +** +************************************************************************/ +int SmiResumePipeline( pipe ) + Pipe pipe; +{ + int status = Success; + PipeElementCtxPtr ctx; + + if( QueueEmpty_(pipe) ) return( Success); + + if( PipeOptPtr_(pipe) != NULL ) + /* + ** Resume the optimized pipe. + */ + return( SmiResumePipeline(PipeOptPtr_(pipe)) ); + + /* + ** Activate processes while the scheduler says they're ready. + ** Keep running until the pipeline timeslice has been exceeded. + */ + PipePxlCnt_(pipe) = 0; + + while( (ctx = DdxSchedProcessReady_(pipe)) != NULL && + !DdxPipeHasYielded_(pipe) ) + { + status = (*CtxActivate_(ctx))(ctx); + if( status != Success ) + break; + } + + if( status == Success && DdxPipeHasYielded_(pipe) ) + /* + ** Reactivate any elements on the active pipe which wish to + ** run independent of pending input. This gives them an + ** opportunity to detect the pipeline has yielded. + */ + for( ctx = PipeCtxPrv_(pipe); + (ctx = DdxSchedProcessNoInput_(pipe,ctx)) != NULL; + ctx = CtxPrv_(ctx) ) + { + status = (*CtxActivate_(ctx))(ctx); + if( status != Success ) + break; + } + return( status ); +} /* end of SmiResumePipeline */ +/* end of module SmiPipe.c */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiPipe.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiPipe.h new file mode 100644 index 0000000..548572c --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiPipe.h @@ -0,0 +1,603 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extensions +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the common header file for all pipeline processing modules. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.0 +** RISC ULTRIX V3.0 +** +** AUTHOR(S): +** +** John Weber +** Robert NC Shelley +** +** CREATION DATE: +** +** March 25, 1989 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMIPIPE +#define _SMIPIPE + +/* +** Include files +*/ + +/* Fix a conflict that comes from the core X misc.h file */ +#ifdef __alpha +#if defined(abs) +#undef abs +#endif +#endif +#if defined(fabs) +#undef fabs +#endif + +#ifndef VXT +#include +#else +#include +#endif + +#include +#include +#include +#include +#include + +/* +** Data Structures and Typedefs +*/ +#ifndef externalref +#if (defined(VMS) && defined(VAXC)) +#define externalref globalref +#else +#define externalref extern +#endif +#endif + +#ifndef externaldef +#if (defined (VMS) && defined(VAXC)) +#ifdef VXT +#define externaldef(psect) globaldef {"psect"} +#else +#define externaldef(psect) globaldef {"psect"} noshare +#endif + +#else +#define externaldef(psect) +#endif +#endif +/* +** Standard block header...begins all data structures to provide support for +** linked lists, and to tag each data structure with a type and subtype. This +** makes things easy to identify in memory. +*/ +typedef struct _BHD { + struct _BHD *flink; + struct _BHD *blink; + short size; + char type; + char subtype; +} Bhd, *BhdPtr; + +/* +** A simple queue data structure with flink and blink +*/ +typedef struct _Queue { + struct _Queue *flink; + struct _Queue *blink; +} Queue, *QueuePtr; + +/* +** Pipe Element Vector Flags +*/ +typedef struct _PipeElementVectorFlags { + unsigned Pv_v_NoInput : 1; + unsigned reserved : 31; +} PipeElementVectorFlags, *PipeElementVectorFlagsPtr; + +#define Pv_m_NoInput 1 + +/* +** Pipeline Element Vector Block +*/ +typedef struct _PipeElementVector { + Bhd bhd; + short ctx_size; + PipeElementVectorFlags flags; + int (*initialize)(); + int (*activate)(); + int (*flush)(); + int (*destroy)(); + int (*abort)(); +} PipeElementVector, *PipeElementVectorPtr; + +/* +** Pipeline Head. +** This data structure is the root of the pipeline description. +*/ +typedef struct _PipelineHead { + Bhd bhd; + struct _PipeElementCtxRec *run_nxt; /* next runnable element ctx*/ + unsigned pixel_count; /* work count for yielding */ + unsigned time_slice; /* work limit for yielding */ + Queue desc_cache; /* queue of PipeDataRec */ + struct _PipelineHead *optptr; /* optimized pipe block ptr */ +} PipelineHead, *Pipe; + +/* +** Pipeline Element Context, Common Part. +** This struct defines the common part of the pipeline context data structure. +** All context structs contain this struct as the first part of the context. +*/ +typedef struct _PipeElementCommonPart { + Bhd bhd; + PipeElementVectorPtr vector; + struct _PipeDrainRec *input_port; + Pipe head; /* Ptr back to head of this pipeline */ + int status; +} PipeElementCommonPart, *PipeElementCommonPartPtr; + +/* +** Generic Pipe Context Record +*/ +typedef struct _PipeElementCtxRec { + PipeElementCommonPart common; +} PipeElementCtxRec, *PipeElementCtxPtr; + +/* +** Pipe Element Vector Flags +*/ +typedef struct _DataTypeMaskRec { + unsigned DtV_reserved_0 : 1; /* Reserved */ + unsigned DtV_BU : 1; /* Byte Unsigned */ + unsigned DtV_WU : 1; /* Word Unsigned */ + unsigned DtV_LU : 1; /* Longword Unsigned */ + unsigned DtV_F : 1; /* Single Precision Float */ + unsigned DtV_VU : 1; /* Unaligned Bitstream */ + unsigned DtV_V : 1; /* Aligned Bitstream */ + unsigned DtV_CL : 1; /* Change list */ + unsigned reserved : 24; /* Reserved */ +} DataTypeMaskRec, *DataTypeMaskPtr; + +typedef unsigned short DataTypeMask; + +#define DtM_BU (1<flink) +#define BhdPrv_(bhd) (((BhdPtr)(bhd))->blink) +#define BhdSiz_(bhd) (((BhdPtr)(bhd))->size) +#define BhdTyp_(bhd) (((BhdPtr)(bhd))->type) +#define BhdSubTyp_(bhd) (((BhdPtr)(bhd))->subtype) + + /* + ** Pipeline Head Access Macros + */ +#define PipeCtxNxt_(pipe) ((PipeElementCtxPtr)(((Pipe)(pipe))->bhd.flink)) +#define PipeCtxPrv_(pipe) ((PipeElementCtxPtr)(((Pipe)(pipe))->bhd.blink)) +#define PipeCtxRun_(pipe) (((Pipe)(pipe))->run_nxt) +#define PipePxlCnt_(pipe) (((Pipe)(pipe))->pixel_count) +#define PipeTimeSlice_(pipe) (((Pipe)(pipe))->time_slice) +#define PipeDsc_(pipe) ((PipeDataPtr)(&(((Pipe)(pipe))->desc_cache))) +#define PipeDscFlk_(pipe) ((PipeDataPtr)(((Pipe)(pipe))->desc_cache.flink)) +#define PipeDscBlk_(pipe) ((PipeDataPtr)(((Pipe)(pipe))->desc_cache.blink)) +#define PipeOptPtr_(pipe) (((Pipe)(pipe))->optptr) +#define PipeOptFlk_(pipe)\ + ((PipeElementCtxPtr)(((Pipe)(pipe))->optptr->bhd.flink)) +#define PipeOptBlk_(pipe)\ + ((PipeElementCtxPtr)(((Pipe)(pipe))->optptr->bhd.blink)) + + /* + ** Pipeline Element Context Access Macros + */ +#define CtxNxt_(ctx)\ + ((PipeElementCtxPtr)(((PipeElementCtxPtr)(ctx))->common.bhd.flink)) +#define CtxPrv_(ctx)\ + ((PipeElementCtxPtr)(((PipeElementCtxPtr)(ctx))->common.bhd.blink)) +#define CtxSiz_(ctx) (((PipeElementCtxPtr)(ctx))->common.bhd.size) +#define CtxTyp_(ctx) (((PipeElementCtxPtr)(ctx))->common.bhd.type) +#define CtxSubTyp_(ctx) (((PipeElementCtxPtr)(ctx))->common.bhd.subtype) +#define CtxVecPtr_(ctx) (((PipeElementCtxPtr)(ctx))->common.vector) +#define CtxInp_(ctx) (((PipeElementCtxPtr)(ctx))->common.input_port) +#define CtxHead_(ctx) (((PipeElementCtxPtr)(ctx))->common.head) +#define CtxStatus_(ctx) (((PipeElementCtxPtr)(ctx))->common.status) +#define CtxPxlCnt_(ctx) (PipePxlCnt_(((PipeElementCtxPtr)(ctx))->common.head)) +#define CtxInit_(ctx) (((PipeElementCtxPtr)(ctx))->common.vector->initialize) +#define CtxActivate_(ctx) (((PipeElementCtxPtr)(ctx))->common.vector->activate) +#define CtxFlush_(ctx) (((PipeElementCtxPtr)(ctx))->common.vector->flush) +#define CtxDestroy_(ctx) (((PipeElementCtxPtr)(ctx))->common.vector->destroy) +#define CtxAbort_(ctx) (((PipeElementCtxPtr)(ctx))->common.vector->abort) + + /* + ** Pipe element vector macros + */ +#define VecSubTyp_(vec) ((vec)->bhd.subtype) +#define VecCtxSiz_(vec) ((vec)->ctx_size) +#define VecFlags_(vec) ((vec)->flags) +#define VecNoInpt_(vec) ((vec)->flags.Pv_v_NoInput) +#define VecInit_(vec) ((vec)->initialize) +#define VecActive_(vec) ((vec)->activate) +#define VecDestroy_(vec) ((vec)->destroy) + + /* + ** Port access macros + */ +#define PrtFlk_(port) (((PipePortPtr)(port))->bhd.flink) +#define PrtBlk_(port) (((PipePortPtr)(port))->bhd.blink) +#define PrtTyp_(port) (((PipePortPtr)(port))->bhd.type) +#define PrtDtyp_(port) (((PipePortPtr)(port))->data_type) +#define PrtDtypMsk_(port) (((PipePortPtr)(port))->data_type_mask) +#define PrtQnt_(port) (((PipePortPtr)(port))->quantum) +#define PrtAln_(port) (((PipePortPtr)(port))->alignment) +#define PrtAlnDat_(port) (((PipePortPtr)(port))->align_dat) + +#define PrtAryLst_(port)\ + ((PipeDataPtr)(&(((PipePortPtr)(port))->array_cache))) +#define PrtAryNxt_(port)\ + ((PipeDataPtr)(((PipePortPtr)(port))->array_cache.flink)) +#define PrtAryPrv_(port)\ + ((PipeDataPtr)(((PipePortPtr)(port))->array_cache.blink)) + + /* + ** Data Sink access macros. + */ +#define SnkNxt_(sink) ((PipeSinkPtr)(((PipeSinkPtr)(sink))->port.bhd.flink)) +#define SnkPrv_(sink) ((PipeSinkPtr)(((PipeSinkPtr)(sink))->port.bhd.blink)) +#define SnkTyp_(sink) (((PipeSinkPtr)(sink))->port.bhd.type) +#define SnkSiz_(sink) (((PipeSinkPtr)(sink))->port.bhd.size) +#define SnkDtyp_(sink) (((PipeSinkPtr)(sink))->port.data_type) +#define SnkDtypMsk_(sink) (((PipeSinkPtr)(sink))->port.data_type_mask) +#define SnkQnt_(sink) (((PipeSinkPtr)(sink))->port.quantum) +#define SnkAln_(sink) (((PipeSinkPtr)(sink))->port.alignment) +#define SnkAlnDat_(sink) (((PipeSinkPtr)(sink))->port.align_dat) +#define SnkPipe_(sink) (((PipeSinkPtr)(sink))->pipe_head) +#define SnkDrnLst_(sink)\ + ((PipeDrainPtr)(&(((PipeSinkPtr)(sink))->drain_list))) +#define SnkDrnFlk_(sink)\ + ((PipeDrainPtr)(((PipeSinkPtr)(sink))->drain_list.flink)) +#define SnkDrnBlk_(sink)\ + ((PipeDrainPtr)(((PipeSinkPtr)(sink))->drain_list.blink)) +#define SnkMaxQnt_(sink) (((PipeSinkPtr)(sink))->max_quantum) +#define SnkUdpFinalMsk_(sink) (((PipeSinkPtr)(sink))->udp_final_mask) +#define SnkRefCnt_(sink,comp) (((PipeSinkPtr)(sink))->reference_count[(comp)]) +#define SnkUdp_(sink,comp) (*((PipeSinkPtr)(sink))->udp[(comp)]) +#define SnkUdpPtr_(sink,comp) (((PipeSinkPtr)(sink))->udp[(comp)]) +#define SnkPxlLen_(sink,comp)\ + (((PipeSinkPtr)(sink))->udp[(comp)]->UdpW_PixelLength) +#define SnkDatTyp_(sink,comp) (((PipeSinkPtr)(sink))->udp[(comp)]->UdpB_DType) +#define SnkDatCls_(sink,comp) (((PipeSinkPtr)(sink))->udp[(comp)]->UdpB_Class) +#define SnkBase_(sink,comp) (((PipeSinkPtr)(sink))->udp[(comp)]->UdpA_Base) +#define SnkArSize_(sink,comp)\ + (((PipeSinkPtr)(sink))->udp[(comp)]->UdpL_ArSize) +#define SnkPxlStr_(sink,comp)\ + (((PipeSinkPtr)(sink))->udp[(comp)]->UdpL_PxlStride) +#define SnkScnStr_(sink,comp)\ + (((PipeSinkPtr)(sink))->udp[(comp)]->UdpL_ScnStride) +#define SnkX1_(sink,comp) (((PipeSinkPtr)(sink))->udp[(comp)]->UdpL_X1) +#define SnkX2_(sink,comp) (((PipeSinkPtr)(sink))->udp[(comp)]->UdpL_X2) +#define SnkY1_(sink,comp) (((PipeSinkPtr)(sink))->udp[(comp)]->UdpL_Y1) +#define SnkY2_(sink,comp) (((PipeSinkPtr)(sink))->udp[(comp)]->UdpL_Y2) +#define SnkWidth_(sink,comp)\ + (((PipeSinkPtr)(sink))->udp[(comp)]->UdpL_PxlPerScn) +#define SnkHeight_(sink,comp)\ + (((PipeSinkPtr)(sink))->udp[(comp)]->UdpL_ScnCnt) +#define SnkPos_(sink,comp) (((PipeSinkPtr)(sink))->udp[(comp)]->UdpL_Pos) +#define SnkCmpIdx_(sink,comp)\ + (((PipeSinkPtr)(sink))->udp[(comp)]->UdpL_CompIdx) +#define SnkLvl_(sink,comp)\ + (((PipeSinkPtr)(sink))->udp[(comp)]->UdpL_Levels) +#define SnkInited_(sink) (((PipeSinkPtr)(sink))->flags.initialized) +#define SnkDelete_(sink) (((PipeSinkPtr)(sink))->flags.delete) +#define SnkFull_(sink) (((PipeSinkPtr)(sink))->flags.full) +#define SnkWrite_(sink) (((PipeSinkPtr)(sink))->flags.write) +#define SnkPrm_(sink) (((PipeSinkPtr)(sink))->flags.permanent) + + /* + ** Data Drain access macros. + */ +#define DrnNxt_(drain) ((PipeDrainPtr)(((PipeDrainPtr)(drain))->port.bhd.flink)) +#define DrnPrv_(drain) ((PipeDrainPtr)(((PipeDrainPtr)(drain))->port.bhd.blink)) +#define DrnTyp_(drain) (((PipeDrainPtr)(drain))->port.bhd.type) +#define DrnSiz_(drain) (((PipeDrainPtr)(drain))->port.bhd.size) +#define DrnQnt_(drain) (((PipeDrainPtr)(drain))->port.quantum) +#define DrnAln_(drain) (((PipeDrainPtr)(drain))->port.alignment) +#define DrnAlnDat_(drain) (((PipeDrainPtr)(drain))->port.align_dat) +#define DrnSnkPtr_(drain) (((PipeDrainPtr)(drain))->sink) +#define DrnDtyp_(drain) (((PipeDrainPtr)(drain))->port.data_type) +#define DrnDtypMsk_(drain) (((PipeDrainPtr)(drain))->port.data_type_mask) +#define DrnCmpMsk_(drain) (((PipeDrainPtr)(drain))->comp_mask) +#define DrnCmpQnt_(drain,i) (((PipeDrainPtr)(drain))->comp_quantum[(i)]) +#define DrnDat_(drain,i)\ + ((PipeDataPtr)(&(((PipeDrainPtr)(drain))->data[(i)]))) +#define DrnDatFlk_(drain,i)\ + ((PipeDataPtr)(((PipeDrainPtr)(drain))->data[(i)].flink)) +#define DrnDatBlk_(drain,i)\ + ((PipeDataPtr)(((PipeDrainPtr)(drain))->data[(i)].blink)) +#define DrnClog_(drain) (((PipeDrainPtr)(drain))->flags.clog) +#define DrnConvert_(drain) (((PipeDrainPtr)(drain))->flags.convert) +#define DrnRunOk_(drain) (((PipeDrainPtr)(drain))->flags.run_ok) + + /* + ** Image data access macros. + */ +#define DatNxt_(data) ((PipeDataPtr)(((PipeDataPtr)(data))->bhd.flink)) +#define DatPrv_(data) ((PipeDataPtr)(((PipeDataPtr)(data))->bhd.blink)) +#define DatTyp_(data) (((PipeDataPtr)(data))->bhd.type) +#define DatSiz_(data) (((PipeDataPtr)(data))->bhd.size) +#define DatPrt_(data) (((PipeDataPtr)(data))->port) +#define DatRefCnt_(data) (((PipeDataPtr)(data))->reference_count) +#define DatRefPtr_(data) (((PipeDataPtr)(data))->reference_ptr) +#define DatUdp_(data) (((PipeDataPtr)(data))->udp) +#define DatUdpPtr_(data) (&((PipeDataPtr)(data))->udp) +#define DatPxlLen_(data) (((PipeDataPtr)(data))->udp.UdpW_PixelLength) +#define DatDatCls_(data) (((PipeDataPtr)(data))->udp.UdpB_Class) +#define DatDatTyp_(data) (((PipeDataPtr)(data))->udp.UdpB_DType) +#define DatDatCls_(data) (((PipeDataPtr)(data))->udp.UdpB_Class) +#define DatBase_(data) (((PipeDataPtr)(data))->udp.UdpA_Base) +#define DatArSize_(data) (((PipeDataPtr)(data))->udp.UdpL_ArSize) +#define DatPxlStr_(data) (((PipeDataPtr)(data))->udp.UdpL_PxlStride) +#define DatScnStr_(data) (((PipeDataPtr)(data))->udp.UdpL_ScnStride) +#define DatX1_(data) (((PipeDataPtr)(data))->udp.UdpL_X1) +#define DatX2_(data) (((PipeDataPtr)(data))->udp.UdpL_X2) +#define DatY1_(data) (((PipeDataPtr)(data))->udp.UdpL_Y1) +#define DatY2_(data) (((PipeDataPtr)(data))->udp.UdpL_Y2) +#define DatWidth_(data) (((PipeDataPtr)(data))->udp.UdpL_PxlPerScn) +#define DatHeight_(data) (((PipeDataPtr)(data))->udp.UdpL_ScnCnt) +#define DatPos_(data) (((PipeDataPtr)(data))->udp.UdpL_Pos) +#define DatCmpIdx_(data) (((PipeDataPtr)(data))->udp.UdpL_CompIdx) +#define DatLvl_(data) (((PipeDataPtr)(data))->udp.UdpL_Levels) +#define DatPrm_(data) (((PipeDataPtr)(data))->flags.permanent) +#define DatDelPnd_(data) (((PipeDataPtr)(data))->flags.delete_pending) +#define DatNoCache_(data) (((PipeDataPtr)(data))->flags.dont_cache) +#define DatOwned_(data) (((PipeDataPtr)(data))->flags.owned) + + /* + ** Queue operation macros + */ +#define IniQue_(head) \ + (((QueuePtr)(head))->flink = ((QueuePtr)(head)), \ + ((QueuePtr)(head))->blink = ((QueuePtr)(head))) + +#define InsQue_(entry,pred) \ + (((QueuePtr)(entry))->flink = ((QueuePtr)(pred))->flink, \ + ((QueuePtr)(entry))->blink = ((QueuePtr)(pred)),\ + ((QueuePtr)(pred))->flink->blink = ((QueuePtr)(entry)),\ + ((QueuePtr)(pred))->flink = ((QueuePtr)(entry))) + +#define RemQue_(entry) \ + (((QueuePtr)(entry))->blink->flink = ((QueuePtr)(entry))->flink, \ + ((QueuePtr)(entry))->flink->blink = ((QueuePtr)(entry))->blink, \ + ((QueuePtr)(entry))) + +#define QueueEmpty_(head) (((QueuePtr)(head))->flink == (QueuePtr)(head)) + + /* + ** Equated Symbols + */ +#ifndef FALSE +#define FALSE 0 +#endif +#ifndef TRUE +#define TRUE 1 +#endif + + /* + ** List of block types + ** + ** NOTE: If you add to the element stype list, remember that other + ** DDX'x have allocated stypes for their elements in their + ** element associated .h files. The StypeLast is used as the + ** base for these additions. + */ +#define TypePipeElementVector 1 +#define TypePipeElementCtx 2 +#define StypeAreaElement 1 +#define StypeAreaStatisticsElement 2 +#define StypeArithmeticElement 3 +#define StypeChromeComElement 4 +#define StypeChromeSepElement 5 +#define StypeCompareElement 6 +#define StypeConstrainElement 7 +#define StypeCropElement 8 +#define StypeDecodeDctElement 9 +#define StypeDecodeG4Element 10 +#define StypeDitherElement 11 +#define StypeEncodeDctElement 12 +#define StypeEncodeG4Element 13 +#define StypeExportElement 14 +#define StypeFillElement 15 +#define StypeGetStreamElement 16 +#define StypeLogicalElement 17 +#define StypeLuminanceElement 18 +#define StypeMatchHistogramElement 19 +#define StypeMathElement 20 +#define StypeMirrorElement 21 +#define StypePointElement 22 +#define StypePointStatisticsElement 23 +#define StypePutStreamElement 24 +#define StypeRotateElement 25 +#define StypeScaleElement 26 +#define StypeTranslateElement 27 +#define StypeLast 28 +#define TypePipe 3 +#define TypePipeData 4 +#define TypePipeSink 5 +#define TypePipeDrain 6 + + /* + ** Pipeline element Status Types + */ +#define StatusNew 1 +#define StatusReady 2 +#define StatusActive 3 +#define StatusBlocked 4 +#define StatusComplete 5 + + + /* + ** Pipeline Entry Points + */ +extern int SmiAbortPipeline(); +extern PipeElementCtxPtr SmiCreatePipeCtx(); +extern Pipe SmiCreatePipeline(); +extern int SmiDestroyPipeline(); +extern int SmiFlushPipeline(); +extern int SmiInitiatePipeline(); +extern int SmiPipeHasYielded(); +extern int SmiResumePipeline(); + + /* + ** Include pipeline entry points from other modules. + */ +#include +#include + +#endif +/* _SMIPIPE */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiPipeRsm.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiPipeRsm.c new file mode 100644 index 0000000..987ec0b --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiPipeRsm.c @@ -0,0 +1,1946 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains resource manager utility routines +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.0 +** RISC ULTRIX V3.0 +** +** AUTHOR(S): +** +** John Weber +** Robert NC Shelley +** +** CREATION DATE: +** +** March 25, 1989 +** +** MODIFICATION HISTORY: +** +************************************************************************/ + +/* +** Include files +*/ +#include + +#include "SmiPipe.h" +#include + +/* +** Table of contents +*/ +PipeDataPtr RmAllocCmpDataDesc(); +PipeDataPtr RmAllocCmpPermDesc(); +PipeDataPtr RmAllocData(); +int RmAllocDataArray(); +PipeDataPtr RmAllocDataDesc(); +PipeDataPtr RmAllocPermDesc(); +PipeDataPtr RmAllocRefDesc(); +char RmBestDType(); +PipeDataPtr RmCreateDataDesc(); +PipeDrainPtr RmCreateDrain(); +PipeSinkPtr RmCreateSink(); +PipeDataPtr RmDeallocData(); +PipeDataPtr RmDeallocDataDesc(); +PipeDrainPtr RmDestroyDrain(); +PipeSinkPtr RmDestroySink(); +PipeDataPtr RmGetData(); +int RmGetDType(); +int RmGetMaxQuantum(); +int RmGetQuantum(); +int RmHasQuantum(); +int RmInitializePort(); +PipeDataPtr RmMergeBuffers(); +PipeDataPtr RmObtainQuantum(); +int RmOwnData(); +int RmPutData(); +void RmSetAlignment(); +void RmSetDType(); +void RmSetQuantum(); +PipeDataPtr RmSplitBuffers(); + +/* +** MACRO definitions +*/ +#define Min_(a,b) ((a) <= (b) ? (a) : (b)) +#define Max_(a,b) ((a) > (b) ? (a) : (b)) +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* +** Local Storage +*/ + +/************************************************************************ +** RmAllocCmpDataDesc +** +** FUNCTIONAL DESCRIPTION: +** +** This routine allocates and initializes a pipe data descriptor +** which can be used to describe an array of compressed data. +** +** FORMAL PARAMETERS: +** +** sink - sink which describes the data +** plane - plane index for this segment +** size - size in bits of the data segment +** +** FUNCTION VALUE: +** +** address of allocated data descriptor +** +************************************************************************/ +PipeDataPtr RmAllocCmpDataDesc( sink, plane, size ) + PipeSinkPtr sink; + int plane; + int size; + +{ + PipeDataPtr data; + + data = DdxRmCreateDataDesc_( sink ); + if( data == NULL ) return( (PipeDataPtr) BadAlloc ); + /* + ** Copy and init Udp + */ + DatUdp_(data) = SnkUdp_(sink,plane); + DatY1_(data) = 0; + DatY2_(data) = 0; + DatHeight_(data) = 0; + DatPos_(data) = 0; + DatBase_(data) = NULL; + DatDatTyp_(data) = SnkDtyp_(sink); + + DatArSize_(data) = size; + + /* + ** Initialize remaining data fields + */ + DatTyp_(data) = TypePipeData; + DatSiz_(data) = sizeof(PipeDataRec); + DatPrt_(data) = (PipePortPtr) sink; + DatRefPtr_(data) = NULL; + DatRefCnt_(data) = 0; + DatPrm_(data) = FALSE; + DatNoCache_(data) = TRUE; + DatDelPnd_(data) = FALSE; + DatOwned_(data) = FALSE; + + return( data ); +} /* end of RmAllocCmpDataDesc */ + +/************************************************************************ +** RmAllocCmpPermDesc +** +** FUNCTIONAL DESCRIPTION: +** +** This routine allocates and initializes a pipe data descriptor +** which points to data residing in a sink. +** +** FORMAL PARAMETERS: +** +** sink - sink which describes the data +** plane - plane index for this segment +** size - size in bits of the data segment +** +** FUNCTION VALUE: +** +** address of allocated data descriptor +** +************************************************************************/ +PipeDataPtr RmAllocCmpPermDesc( sink, plane, size ) + PipeSinkPtr sink; + int plane; + int size; + +{ + PipeDataPtr data; + + data = DdxRmCreateDataDesc_( sink ); + if( data == NULL ) return( (PipeDataPtr) BadAlloc ); + /* + ** Copy and init Udp + */ + DatUdp_(data) = SnkUdp_(sink,plane); + DatY1_(data) = 0; + DatY2_(data) = 0; + DatHeight_(data) = 0; + DatDatTyp_(data) = SnkDtyp_(sink); + + DatArSize_(data) = size; + + /* + ** Initialize remaining data fields + */ + DatTyp_(data) = TypePipeData; + DatSiz_(data) = sizeof(PipeDataRec); + DatPrt_(data) = (PipePortPtr) sink; + DatRefPtr_(data) = NULL; + DatRefCnt_(data) = 0; + DatPrm_(data) = TRUE; + DatNoCache_(data) = TRUE; + DatDelPnd_(data) = FALSE; + DatOwned_(data) = TRUE; + SnkRefCnt_(sink,plane)++; + + return( data ); +} /* end of RmAllocCmpPermDesc */ + +/************************************************************************ +** RmAllocData +** +** FUNCTIONAL DESCRIPTION: +** +** This routine allocates a pipe data descriptor and its associated +** image data array. The data must be uncompressed (PCM) format. +** +** This is the routine which DDX modules should call to obtain +** a destination data segment which they will later write to a +** sink. +** +** FORMAL PARAMETERS: +** +** sink +** comp +** start +** length +** +** FUNCTION VALUE: +** +** Pointer to Pipe Data Descriptor for allocated data. +** +************************************************************************/ +PipeDataPtr RmAllocData( sink, comp, start, length ) + PipeSinkPtr sink; + int comp; + int start; + int length; +{ + PipeDataPtr data; + int s; + + if( !SnkWrite_(sink) || SnkDtyp_(sink) == UdpK_DTypeCL ) + data = DdxRmAllocDataDesc_( sink, comp, start, length ); + else + data = DdxRmAllocPermDesc_( sink, comp, start, length ); + + if( IsPointer_(data) && DatBase_(data) == NULL ) + { + s = RmAllocDataArray( data ); + if (s != Success ) + { + RmDeallocDataDesc( data ); + data = (PipeDataPtr) s; + } + else + { + if( DatPrm_(data) ) + SnkBase_(sink,comp) = DatBase_(data); + else + /* Since the cache is searched for exact fit, don't + ** bother caching segments that can't ever be used. + */ + DatNoCache_(data) = + (DatHeight_(data) > SnkHeight_(sink,comp)/2); + } + } + return( data ); +} /* end of RmAllocData */ + +/************************************************************************ +** RmAllocDataArray +** +** FUNCTIONAL DESCRIPTION: +** +** This routine allocates an image data array and associates it with the +** specified data segment. If possible, the request is satisfied from +** the array cache of the port associated with the data segment. +** +** FORMAL PARAMETERS: +** +** data +** +** FUNCTION VALUE: +** +** Returns standard X status codes. +** +************************************************************************/ +int RmAllocDataArray( data ) + PipeDataPtr data; +{ + PipeDataPtr cache; + PipePortPtr port = DatPrt_(data); + + /* + ** See if we've cached a suitable image array for this request. + */ + for( cache = PrtAryNxt_(port); + cache != PrtAryLst_(port); + cache = DatNxt_(cache) ) + { + if( DatArSize_(cache) < DatArSize_(data) ) + continue; + if( DatArSize_(cache) == DatArSize_(data) ) + { /* + ** Use the cached array for the image data, and move + ** its descriptor to the pipeline's descriptor cache. + */ + DatBase_(data) = DatBase_(cache); + RemQue_(cache); + RmDeallocDataDesc(cache); + } + break; + } + + if( DatBase_(data) == NULL ) + /* + ** Allocate a new array for the image data. + */ + DatBase_(data) = DdxMallocBits_(DatArSize_(data)); + + if ( DatBase_(data) == NULL ) + return( BadAlloc ); + else + { + DatOwned_(data) = TRUE; + return( Success ); + } +} /* end of RmAllocDataArray */ + +/************************************************************************ +** RmAllocDataDesc +** +** FUNCTIONAL DESCRIPTION: +** +** This routine allocates and initializes an image data descriptor +** which will be used to hold uncompressed (PCM) data. +** +** FORMAL PARAMETERS: +** +** port +** comp +** start +** length +** +** FUNCTION VALUE: +** +** address of allocated data descriptor +** +************************************************************************/ +PipeDataPtr RmAllocDataDesc( port, comp, start, length ) + PipePortPtr port; + int comp; + int start; + int length; +{ + PipeDataPtr data; + PipeSinkPtr sink = PrtTyp_(port) == TypePipeSink ? (PipeSinkPtr) port + : DrnSnkPtr_(port); + + data = DdxRmCreateDataDesc_( sink ); + if( data == NULL ) return( (PipeDataPtr) BadAlloc ); + /* + ** Copy and init Udp + */ + DatUdp_(data) = SnkUdp_(sink,comp); + DatY1_(data) = start; + DatY2_(data) = DatY1_(data) + length - 1; + DatHeight_(data) = length; + DatBase_(data) = NULL; + DatPos_(data) = 0; + + if( DatDatTyp_(data) != PrtDtyp_(port) ) + { /* + ** Arrange for correct DType. + */ + DatDatTyp_(data) = PrtDtyp_(port); + + switch( DatDatTyp_(data) ) + { + case UdpK_DTypeBU: + DatPxlLen_(data) = 8; + DatDatCls_(data) = UdpK_ClassA; + break; + case UdpK_DTypeWU: + DatPxlLen_(data) = 16; + DatDatCls_(data) = UdpK_ClassA; + break; + case UdpK_DTypeLU: + case UdpK_DTypeF: + DatPxlLen_(data) = 32; + DatDatCls_(data) = UdpK_ClassA; + break; + case UdpK_DTypeV: + case UdpK_DTypeVU: + DatPxlLen_(data) = BitsFromLevels_(DatLvl_(data)); + DatDatCls_(data) = UdpK_ClassUBA; + break; + case UdpK_DTypeCL: + DatPxlLen_(data) = 0; + DatDatCls_(data) = UdpK_ClassCL; + break; + default: + RmDeallocDataDesc( data ); + return( (PipeDataPtr) BadMatch ); + } + DatPxlStr_(data) = DatPxlLen_(data); + DatScnStr_(data) = DatDatCls_(data) == UdpK_ClassCL ? 0 + : DatPxlStr_(data) * DatWidth_(data); + } + /* + ** Calculate default ArSize for the described data. + */ + DatArSize_(data) = DatDatCls_(data) == UdpK_ClassCL + ? DatHeight_(data) * (DatWidth_(data) + 2) * sizeof(unsigned int) * 8 + : DatHeight_(data) * DatScnStr_(data) + DatPos_(data); + + if( IsPointer_(PrtAln_(port)) && PrtAln_(port) != SnkAln_(sink) ) + /* + ** Arrange for Ddx specific alignment. + */ + (*PrtAln_(port))(DatUdpPtr_(data), PrtAlnDat_(port)); + + /* + ** Initialize remaining data fields + */ + DatTyp_(data) = TypePipeData; + DatSiz_(data) = sizeof(PipeDataRec); + DatPrt_(data) = port; + DatRefPtr_(data) = NULL; + DatRefCnt_(data) = 0; + DatPrm_(data) = FALSE; + DatNoCache_(data) = FALSE; + DatDelPnd_(data) = FALSE; + DatOwned_(data) = TRUE; + + return( data ); +} /* end of RmAllocDataDesc */ + +/************************************************************************ +** RmAllocPermDesc +** +** FUNCTIONAL DESCRIPTION: +** +** This routine allocates a pipe data descriptor which points to +** an image data array associated with the sink. Only uncompressed +** data is supported. +** +** FORMAL PARAMETERS: +** sink - pointer to the sink which describes the data +** comp - component index for this segment of data +** start - starting scanline number for this segment +** length - number of scanlines in this segment +** +** FUNCTION VALUE: +** +** address of allocated data descriptor +** +************************************************************************/ +PipeDataPtr RmAllocPermDesc( sink, comp, start, length ) + PipeSinkPtr sink; + int comp; + int start; + int length; +{ + PipeDataPtr data; + + data = DdxRmCreateDataDesc_( sink ); + if( data == NULL ) return( (PipeDataPtr) BadAlloc ); + /* + ** Copy and init Udp + */ + DatUdp_(data) = SnkUdp_(sink,comp); + DatPos_(data) += DatScnStr_(data) * (start - DatY1_(data)); + DatY1_(data) = start; + DatY2_(data) = start + length - 1; + DatHeight_(data) = length; + /* + ** Initialize remaining data fields. + */ + DatTyp_(data) = TypePipeData; + DatSiz_(data) = sizeof(PipeDataRec); + DatPrt_(data) = (PipePortPtr) sink; + DatRefPtr_(data) = NULL; + DatRefCnt_(data) = 0; + DatPrm_(data) = TRUE; + DatNoCache_(data) = FALSE; + DatDelPnd_(data) = FALSE; + DatOwned_(data) = TRUE; + SnkRefCnt_(sink,comp)++; + + return( data ); +} /* end of RmAllocPermDesc */ + +/************************************************************************ +** RmAllocRefDesc +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +** Pointer to Image Data Descriptor for allocated data. +** +************************************************************************/ +PipeDataPtr RmAllocRefDesc( data, start, length ) + PipeDataPtr data; + int start; + int length; +{ + PipeDataPtr refdat; + PipePortPtr port = DatPrt_(data); + PipeSinkPtr sink = PrtTyp_(port) == TypePipeSink ? (PipeSinkPtr) port + : DrnSnkPtr_(port); + refdat = DdxRmCreateDataDesc_( sink ); + if( refdat == NULL ) return( (PipeDataPtr) BadAlloc ); + /* + ** Copy and init Udp + */ + DatUdp_(refdat) = DatUdp_(data); + if( DatDatTyp_(data) == UdpK_DTypeCL ) + DatPos_(refdat) = + DdxPosCl_(DatBase_(data), DatPos_(data), start - DatY1_(data)); + else + DatPos_(refdat) += DatScnStr_(data) * (start - DatY1_(data)); + DatY1_(refdat) = start; + DatY2_(refdat) = start + length - 1; + DatHeight_(refdat) = length; + /* + ** Initialize remaining data fields. + */ + DatTyp_(refdat) = TypePipeData; + DatSiz_(refdat) = sizeof(PipeDataRec); + DatRefPtr_(refdat) = data; + DatRefCnt_(refdat) = 0; + DatPrt_(refdat) = port; + DatPrm_(refdat) = DatPrm_(data); + DatDelPnd_(refdat) = FALSE; + DatNoCache_(refdat) = FALSE; + DatOwned_(refdat) = DatOwned_(data); + + DatRefCnt_(data)++; + + return( refdat ); +} /* end of RmAllocRefDesc */ + +/************************************************************************ +** RmBestDType +** +** FUNCTIONAL DESCRIPTION: +** +** This routine selects the best datatype to be used for a sink +** or drain, given a mask of possible choices and the number of +** levels which needed to be represented. +** +** FORMAL PARAMETERS: +** +** mask - mask of supported dtypes +** levels - number of levels in data to be stored +** +** FUNCTION VALUE: +** +** selected DType value +** +************************************************************************/ +char RmBestDType( mask, levels ) + int mask; + int levels; +{ + int *list; + int i; + int best; + + /* The possible data types for each range of levels, in decreasing order + ** of preference. + */ + static int list_32[] = {UdpK_DTypeLU, UdpK_DTypeVU, 0}; + static int list_16[] = {UdpK_DTypeWU, UdpK_DTypeVU, UdpK_DTypeLU, 0}; + static int list_8[] = { UdpK_DTypeBU, UdpK_DTypeVU, + UdpK_DTypeWU, UdpK_DTypeLU, 0 }; + static int list_1[] = {UdpK_DTypeCL, UdpK_DTypeVU, UdpK_DTypeBU, + UdpK_DTypeWU, UdpK_DTypeLU, 0}; + + best = 0; + if( levels > 65536 ) + list = &list_32[0]; + else if( levels > 256 ) + list = &list_16[0]; + else if( levels > 2 ) + list = &list_8[0]; + else { + list = &list_1[0]; + best = 1; /* Changelists are only best if explicitly + ** requested. */ + } + + for( i = 0; list[i] != 0; i++ ) + if( mask & 1<<(list[i]) ) + return( list[i] ); + + /* + ** There is no suitable data type in the mask. + ** Return the best choice for the number of levels. + */ + return( list[best] ); +} /* end of RmBestDType */ + +/************************************************************************ +** RmCreateDataDesc +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +** pointer to created drain +** +************************************************************************/ +PipeDataPtr RmCreateDataDesc( sink ) + PipeSinkPtr sink; +{ + PipeDataPtr data; + Pipe pipe = SnkPipe_(sink); + + if( !IsPointer_(pipe) || QueueEmpty_(PipeDsc_(pipe)) ) + /* + ** Allocate a new data descriptor. + */ + data = (PipeDataPtr) DdxMalloc_(sizeof(PipeDataRec)); + else + { /* + ** Re-use a data descriptor from the pipeline's data cache. + */ + data = PipeDscFlk_(pipe); + RemQue_(data); + } + + return( data ); +} /* end of RmCreateDataDesc */ + +/************************************************************************ +** RmCreateDrain +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** data queue +** quantum +** +** FUNCTION VALUE: +** +** pointer to created drain +** +************************************************************************/ +PipeDrainPtr RmCreateDrain( sink, cmask ) + PipeSinkPtr sink; + int cmask; +{ + PipeDrainPtr pred; + PipeDrainPtr drain; + int comp; + + if( cmask == 0 ) return( (PipeDrainPtr) BadValue ); + + drain = (PipeDrainPtr) DdxCalloc_(1,sizeof(PipeDrainRec)); + if( drain == NULL ) return( (PipeDrainPtr) BadAlloc ); + /* + ** Attach to end of Drain queue. + */ + pred = SnkDrnBlk_(sink); + InsQue_(drain,pred); + /* + ** Init block head fields + */ + DrnTyp_(drain) = TypePipeDrain; + DrnSiz_(drain) = sizeof(PipeDrainRec); + /* + ** Init Queues + */ + IniQue_(PrtAryLst_(drain)); + + for( comp = 0; comp < XieK_MaxComponents; comp++ ) + IniQue_(DrnDat_(drain,comp)); + + DrnAln_(drain) = DdxAlignDefault_; + DrnDtyp_(drain) = UdpK_DTypeUndefined; + DrnCmpMsk_(drain) = cmask & (1<= DatArSize_(data) ) + break; + pred = ref; + } + InsQue_(data,pred); + } + } + else + DdxRmDeallocDataDesc_(data); + + else if( IsPointer_(data) ) + /* + ** A valid descriptor, but with outstanding references.... + */ + DatDelPnd_(data) = TRUE; + + return( NULL ); +} /* end of RmDeallocData */ + +/************************************************************************ +** RmDeallocDataDesc +** +** FUNCTIONAL DESCRIPTION: +** +** This routine deallocates an image data descriptor +** +** FORMAL PARAMETERS: +** +** data - image data descriptor to deallocate +** +** FUNCTION VALUE: NULL +** +************************************************************************/ +PipeDataPtr RmDeallocDataDesc( data ) + PipeDataPtr data; +{ + PipeDataPtr queue; + PipePortPtr port = DatPrt_(data); + PipeSinkPtr sink = PrtTyp_(port) == TypePipeSink ? (PipeSinkPtr) port + : DrnSnkPtr_(port); + Pipe pipe = SnkPipe_(sink); + + if( IsPointer_(data) ) + if( IsPointer_(pipe) ) + { + DatBase_(data) = NULL; + queue = PipeDsc_(pipe); + InsQue_(data,queue); + } + else + DdxFree_(data); + + return( NULL ); +} /* end of RmDeallocDataDesc */ + +/************************************************************************ +** RmDestroyDrain +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** data queue +** quantum +** +** FUNCTION VALUE: NULL +** +************************************************************************/ +PipeDrainPtr RmDestroyDrain( drain ) + PipeDrainPtr drain; +{ + PipeDataPtr data; + PipeSinkPtr sink; + int comp; + + if( IsPointer_(drain) ) + { + sink = DrnSnkPtr_(drain); + /* + ** Remove Drain from queue. + */ + RemQue_(drain); + /* + ** Free anything lingering on the data queues. + */ + for( comp = 0; comp < XieK_MaxComponents; comp++ ) + for( data = DrnDatFlk_(drain,comp); + data != DrnDat_(drain,comp); + data = DrnDatFlk_(drain,comp) ) + { + RemQue_(data); + DrnCmpQnt_(drain,DatCmpIdx_(data)) -= DatHeight_(data); + DdxRmDeallocData_(data); + } + /* + ** Free cached image array data descriptors. + */ + for( data = PrtAryNxt_(drain); + data != PrtAryLst_(drain); + data = PrtAryNxt_(drain) ) + { + RemQue_(data); + DdxFreeBits_(DatBase_(data)); + DdxFree_(data); + } + /* + ** Free Drain structure. + */ + DdxCfree_(drain); + /* + ** If this is the last Drain on the Sink queue, and this + ** Sink wants to be deleted, then do it now. + */ + if( QueueEmpty_(SnkDrnLst_(sink)) && SnkDelete_(sink) ) + DdxRmDestroySink_(sink); + } + + return( NULL ); +} /* end of RmDestroyDrain */ + +/************************************************************************ +** RmDestroySink +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** sink +** +** FUNCTION VALUE: NULL +** +************************************************************************/ +PipeSinkPtr RmDestroySink( sink ) + PipeSinkPtr sink; +{ + int i; + PipeDataPtr data; + + if( IsPointer_(sink) ) + { /* + ** Free cached image array data descriptors. + */ + for( data = PrtAryNxt_(sink); + data != PrtAryLst_(sink); + data = PrtAryNxt_(sink) ) + { + RemQue_(data); + DdxFreeBits_(DatBase_(data)); + DdxFree_(data); + } + /* + ** Free the Udps and their image data arrays. + */ + for( i = 0; i < XieK_MaxComponents; i++ ) + if( IsPointer_(SnkUdpPtr_(sink,i)) ) + { + if( IsPointer_(SnkBase_(sink,i)) ) + DdxFreeBits_(SnkBase_(sink,i)); + + DdxFree_(SnkUdpPtr_(sink,i)); + } + DdxCfree_(sink); + } + return( NULL ); +} /* end of RmDestroySink */ + +/************************************************************************ +** RmGetData +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +** pointer to data +** +************************************************************************/ +PipeDataPtr RmGetData( ctx, drain ) + PipeElementCtxPtr ctx; + PipeDrainPtr drain; +{ + int comp; + PipeDataPtr data; + + /* + ** Remember this was the last Drain read from. + */ + CtxInp_(ctx) = drain; + /* + ** If the scheduler says its OK, return a data buffer (if available). + */ + if( DrnRunOk_(drain) || DdxSchedOkToRun_(ctx) ) + { + data = DdxRmObtainQuantum_(drain); + if( IsPointer_(data) ) + { /* + ** Update pixel count and component quantum for this buffer. + */ + CtxPxlCnt_(ctx) += DatWidth_(data) * DatHeight_(data) + * DatPxlLen_(data); + comp = DatCmpIdx_(data); + DrnCmpQnt_(drain,comp) -= DatHeight_(data); + } + DrnRunOk_(drain) = FALSE; + } + else + data = NULL; + + return( data ); +} /* end of RmGetData */ + +/************************************************************************ +** RmGetDType +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** port +** +** FUNCTION VALUE: +** +** value of DType +** +************************************************************************/ +int RmGetDType( port ) + PipePortPtr port; +{ + return( PrtDtyp_(port) ); +} /* end of RmGetDType */ + +/************************************************************************ +** RmGetQuantum +** +** FUNCTIONAL DESCRIPTION: +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +** current quantum value +** +************************************************************************/ +int RmGetQuantum( port ) + PipePortPtr port; +{ + return( PrtQnt_(port) ); +} /* end of RmGetQuantum */ + +/************************************************************************ +** RmGetMaxQuantum +** +** FUNCTIONAL DESCRIPTION: +** +** Return the maximum quantum requested for any Drain attached to a Sink. +** If that result is 0, return the Sink's quantum instead. +** If that result is 0, return the Sink's height. +** +** FORMAL PARAMETERS: +** +** FUNCTION VALUE: +** +** value of maximum quantum found +** +************************************************************************/ +int RmGetMaxQuantum( sink ) + PipeSinkPtr sink; +{ + return( SnkMaxQnt_(sink) > 0 ? SnkMaxQnt_(sink) : SnkHeight_(sink,0) ); +} /* end of RmGetMaxQuantum */ + +/************************************************************************ +** RmHasQuantum +** +** FUNCTIONAL DESCRIPTION: +** +** Examines the specified drain and returns the index of the component +** or compressed data plane with enough data available to satisfy +** the drain quantum. If multiple components satisfy quantum, the +** one with the most data available is returned. +** +** +** FORMAL PARAMETERS: +** +** drain - drain to test for quantum +** +** FUNCTION VALUE: +** +** index of component which as quantum (or XieK_MaxComponents if none do) +** +************************************************************************/ +int RmHasQuantum( drain ) + PipeDrainPtr drain; +{ + int i, mask, available = 0, component = XieK_MaxComponents, + quantum = abs(DrnQnt_(drain)); + + if( DrnDtyp_(drain) != UdpK_DTypeV ) + { + for( i = 0, mask = DrnCmpMsk_(drain); mask; i++, mask >>= 1 ) + /* + ** Choose the component with the largest quantum available. + */ + if( mask & 1 && DrnCmpQnt_(drain,i) > available + && DrnCmpQnt_(drain,i) >= quantum ) + { + component = i; + available = DrnCmpQnt_(drain,i); + } + } + else + for( i =0, mask = DrnCmpMsk_(drain); mask; i++, mask >>= 1 ) + /* + ** Choose the compressed data plane with data available. + ** Only two quantum values are allowed: 0 and SnkHeight + ** (ie. the whole image) + */ + if( mask & 1 && !QueueEmpty_(DrnDat_(drain,i)) && + ( quantum == 0 || SnkUdpFinalMsk_(DrnSnkPtr_(drain)) & 1< 0; remaining -= count ) + { + if( DatHeight_(data) > remaining ) + { + data = DdxRmSplitBuffers_( drain, data, remaining ); + next = data; + if( !IsPointer_(data) ) break; + } + else + { + next = DatNxt_(data); + RemQue_(data); + } + count = DatHeight_(data); + DdxRmDeallocData_(data); + data = next; + } + } + else + { + quantum_data = DdxRmAllocDataDesc_( drain, comp, y1, quantum ); + if( IsPointer_(quantum_data) ) + { + status = DdxRmAllocDataArray_( quantum_data ); + if( status != Success ) + { + DdxRmDeallocData_(quantum_data); + quantum_data = (PipeDataPtr) status; + } + } + + if( IsPointer_(quantum_data) ) + for( remaining = quantum; remaining > 0; remaining -= count ) + { + if( DatHeight_(data) > remaining ) + { + data = DdxRmSplitBuffers_( drain, data, remaining ); + next = data; + if( !IsPointer_(data) ) break; + } + else + { + next = DatNxt_(data); + RemQue_(data); + } + count = DatHeight_(data); + status = DdxConvert_( DatUdpPtr_(data), + DatUdpPtr_(quantum_data), XieK_MoveMode ); + if( status != Success ) + { + DdxRmDeallocData_(quantum_data); + quantum_data = (PipeDataPtr) status; + } + else + { + DdxRmDeallocData_(data); + data = next; + } + } + } + + if( !IsPointer_(quantum_data) || !IsPointer_(data) ) + { + if( IsPointer_(quantum_data) ) + { + DdxRmDeallocData_(quantum_data); + quantum_data = data; + } + if( IsPointer_(data) ) + DdxRmDeallocData_(data); + } + return( quantum_data ); +} /* end of RmMergeBuffers */ + +/************************************************************************ +** RmObtainQuantum +** +** FUNCTIONAL DESCRIPTION: +** +** This routine extracts a quantum of data from the drain data queue. +** +** FORMAL PARAMETERS: +** +** drain +** +** FUNCTION VALUE: +** +** pointer to the data +** +************************************************************************/ +PipeDataPtr RmObtainQuantum( drain ) + PipeDrainPtr drain; +{ + PipeDataPtr new, data; + int comp, status; + + if( !SnkInited_(DrnSnkPtr_(drain)) ) + return( NULL ); + /* + ** Determine which component to use next. + */ + comp = DdxRmHasQuantum_( drain ); + if( comp == XieK_MaxComponents ) + return( NULL ); /* sorry, try again later */ + + /* + ** Beginning of the data queue for this component. + */ + data = DrnDatFlk_(drain,comp); + /* + ** If the Drain quantum is zero, or the first data element has + ** correct quantum, no need to jumble stuff around. Never have to + ** split/merge for compressed data. + */ + if( DrnQnt_(drain) == 0 + || DatHeight_(data) == DrnQnt_(drain) + || DrnQnt_(drain) < 0 && DatHeight_(data) == DrnCmpQnt_(drain,comp) + || DrnDtyp_(drain) == UdpK_DTypeV ) + { + RemQue_(data); + if( DrnConvert_(drain) ) + { /* + ** The DType or alignment doesn't match what the Drain wants. + */ + new = DdxRmAllocDataDesc_( drain, DatCmpIdx_(data), + DatY1_(data), DatHeight_(data) ); + if( IsPointer_(new) ) + { + status = DdxRmAllocDataArray_( new ); + if ( status == Success ) + status = DdxConvert_( DatUdpPtr_(data), + DatUdpPtr_(new), XieK_MoveMode ); + if( status != Success ) + { + DdxRmDeallocData_(new); + new = (PipeDataPtr) status; + } + } + DdxRmDeallocData_(data); + data = new; + } + } + else if( DrnQnt_(drain) < 0 ) + /* + ** Merge together all buffers for this component. + */ + data = DdxRmMergeBuffers_( drain, data, DrnCmpQnt_(drain,comp) ); + + else if( DatHeight_(data) < DrnQnt_(drain) ) + /* + ** Merge together enough buffers to satisfy quantum for this component. + */ + data = DdxRmMergeBuffers_( drain, data, DrnQnt_(drain) ); + + else + /* + ** Extract a quantum of data from this buffer leaving the rest behind. + */ + data = DdxRmSplitBuffers_( drain, data, DrnQnt_(drain) ); + + return( data ); +} /* end of RmObtainQuantum */ + +/************************************************************************ +** RmOwnData +** +** FUNCTIONAL DESCRIPTION: +** +** This routine replaces references to a specified data arrays +** on the drains associated with a sink. The contents of the +** array is copied to storage that is known to be owned by +** XIE. +** +** FORMAL PARAMETERS: +** +** sink - sink to be searched +** wire - address of the array to replace. +** comp - component/plane index of the data buffer +** +** FUNCTION VALUE: +** +** status +** +************************************************************************/ +int RmOwnData( sink, wire, comp ) + PipeSinkPtr sink; + unsigned char *wire; + int comp; +{ + PipeDrainPtr drain; + PipeDataPtr data; + unsigned char *owned = NULL; + + if (!QueueEmpty_(SnkDrnLst_(sink)) ) + for( drain = SnkDrnFlk_(sink); drain != SnkDrnLst_(sink); + drain = DrnNxt_(drain)) + { + if (1<>3 ); + } + DatBase_(data) = owned; + DatOwned_(data) = TRUE; + } + } + } + } + } + return( Success ); +} + +/************************************************************************ +** RmPutData +** +** FUNCTIONAL DESCRIPTION: +** +** This routine puts data on the pipeline element's output port +** +** FORMAL PARAMETERS: +** +** sink +** data - image data descriptor +** +** FUNCTION VALUE: +** +** status +** +************************************************************************/ +int RmPutData( sink, data ) + PipeSinkPtr sink; + PipeDataPtr data; +{ + PipeDrainPtr drain; + PipeDataPtr copy, queue; + UdpRec src; + int pos, status = Success, reference = 0, comp = DatCmpIdx_(data); + + if( SnkWrite_(sink) ) + /* + ** Make sure data in the Sink reflects this request. + */ + if( SnkBase_(sink,comp) != DatBase_(data) ) + { /* + ** Copy external data into the Sink. + */ + if( DatDatTyp_(data) != UdpK_DTypeV ) + { + status = DdxConvert_( DatUdpPtr_(data), + SnkUdpPtr_(sink,comp), XieK_MoveMode ); + if( status == Success && DatDatTyp_(data) != UdpK_DTypeCL ) + { /* + ** Redirect data to be referenced from the Sink. + */ + copy = DdxRmAllocPermDesc_( sink, comp, DatY1_(data), + DatHeight_(data) ); + if( IsPointer_(copy) ) + { + DdxRmDeallocData_(data); + data = copy; + } + else + status = (int) copy; + } + } + else + { /* + ** Append new compressed data to the Sink. ArSize records + ** how much data is present (ie. the current end of data). + */ + pos = SnkPos_(sink,comp) + SnkArSize_(sink,comp); + SnkArSize_(sink,comp) += DatArSize_(data); + SnkBase_(sink,comp) = SnkBase_(sink,comp) != NULL + ? DdxReallocBits_(SnkBase_(sink,comp),SnkArSize_(sink,comp)) + : DdxMallocBits_(SnkArSize_(sink,comp)); + if( SnkBase_(sink,comp) == NULL ) + status = BadAlloc; + else + memcpy( SnkBase_(sink,comp) + (pos>>3), + DatBase_(data), DatArSize_(data)>>3 ); + + if( status == Success ) + { + copy = DdxRmAllocCmpPermDesc_( sink, comp, + SnkArSize_(sink,comp) ); + if( IsPointer_(copy) ) + { + DatPos_(copy) = pos; + DdxRmDeallocData_(data); + data = copy; + } + else + status = (int) copy; + } + } + } + else if( IsPointer_(DatRefPtr_(data)) ) + { /* + ** If this reference descriptor is pointing back at preceeding + ** scanlines, copy them to the new location within the Sink. + */ + pos = SnkPos_(sink,comp) + DatScnStr_(data) * DatY1_(data); + if( pos > DatPos_(data) ) + { + src = DatUdp_(data); + DatPos_(data) = pos; + status = DdxConvert_( &src, DatUdpPtr_(data), XieK_MoveMode ); + } + } + if( DatY2_(data) == SnkY2_(sink,comp) ) + /* + ** We've reached the last scanline -- set final for the associated Udp. + */ + SnkUdpFinalMsk_(sink) |= 1< 0 ? max_quantum : SnkQnt_(sink); +} /* end of RmSetQuantum */ + +/************************************************************************ +** RmSplitBuffers +** +** FUNCTIONAL DESCRIPTION: +** +** Split a quantum sized piece off the front of a pipe data segment. +** Data segments containing compressed data are not supported. +** +** FORMAL PARAMETERS: +** +** data queue +** quantum +** +** FUNCTION VALUE: +** +** pointer to data +** +************************************************************************/ +PipeDataPtr RmSplitBuffers( drain, data, quantum ) + PipeDrainPtr drain; + PipeDataPtr data; + int quantum; +{ + PipeDataPtr new; + int status, y1 = DatY1_(data); + + if( DrnConvert_(drain) && quantum == DrnQnt_(drain) ) + { /* + ** Create quantum scanlines of the Drain's data type. + */ + new = DdxRmAllocDataDesc_( drain, + DatCmpIdx_(data), y1, quantum ); + if( IsPointer_(new) ) + { + status = DdxRmAllocDataArray_( new ); + if( status == Success ) + status = DdxConvert_( DatUdpPtr_(data), + DatUdpPtr_(new), XieK_MoveMode ); + if( status != Success ) + { + DdxRmDeallocData_(new); + new = (PipeDataPtr) status; + } + } + } + else + new = DdxRmAllocRefDesc_( data, y1, quantum ); + + if( IsPointer_(new) ) + { /* + ** Adjust data to describe only the remant beyond quantum. + */ + DatHeight_(data) -= quantum; + DatY1_(data) += quantum; + if( DatDatTyp_(data) == UdpK_DTypeCL ) + DatPos_(data) = DdxPosCl_(DatBase_(data), DatPos_(data), quantum); + else + DatPos_(data) += quantum * DatScnStr_(data); + } + return( new ); +} /* end of RmSplitBuffers */ +/* end of module SmiPipeRsm.c */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiPipeRsm.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiPipeRsm.h new file mode 100644 index 0000000..7d5af80 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiPipeRsm.h @@ -0,0 +1,114 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the Pipe RESOURCE mgt. module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** +** AUTHOR(S): +** +** Richard Hennessy +** +** CREATION DATE: +** +** September 25, 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMIPIPERSM +#define _SMIPIPERSM + + /* + ** Resource Manager entry points. + */ +extern PipeDataPtr RmAllocCmpDataDesc(); +extern PipeDataPtr RmAllocCmpPermDesc(); +extern PipeDataPtr RmAllocData(); +extern int RmAllocDataArray(); +extern PipeDataPtr RmAllocDataDesc(); +extern PipeDataPtr RmAllocPermDesc(); +extern PipeDataPtr RmAllocRefDesc(); +extern char RmBestDType(); +extern PipeDataPtr RmCreateDataDesc(); +extern PipeDrainPtr RmCreateDrain(); +extern PipeSinkPtr RmCreateSink(); +extern PipeDataPtr RmDeallocData(); +extern PipeDataPtr RmDeallocDataDesc(); +extern PipeDrainPtr RmDestroyDrain(); +extern PipeSinkPtr RmDestroySink(); +extern PipeDataPtr RmGetData(); +extern int RmGetDType(); +extern int RmGetMaxQuantum(); +extern int RmGetQuantum(); +extern int RmHasQuantum(); +extern int RmInitializePort(); +extern PipeDataPtr RmMergeBuffers(); +extern PipeDataPtr RmObtainQuantum(); +extern int RmOwnData(); +extern int RmPutData(); +extern void RmSetAlignment(); +extern void RmSetDType(); +extern void RmSetQuantum(); +extern PipeDataPtr RmSplitBuffers(); + +#endif +/* _SMIPIPERSM */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiPipeSched.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiPipeSched.c new file mode 100644 index 0000000..5fd888a --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiPipeSched.c @@ -0,0 +1,270 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains pipeline schedule management routines. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.0 +** RISC ULTRIX V3.0 +** +** AUTHOR(S): +** +** Michael O'Connor( Creator ) +** Richard Hennessy( Optimized pipe mods ) +** +** +** CREATION DATE: +** +** March 29, 1989 +** +** MODIFICATION HISTORY: +** +************************************************************************/ + +/* +** Include files +*/ +#include + +#include "SmiPipe.h" + +/* +** Table of contents +*/ +PipeElementCtxPtr SchedProcessComplete(); +PipeElementCtxPtr SchedProcessNoInput(); +PipeElementCtxPtr SchedProcessReady(); +int SchedOkToRun(); + +/* +** MACRO definitions +*/ + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* +** Local Storage +*/ + +/************************************************************************ +** SchedProcessComplete +** +** FUNCTIONAL DESCRIPTION: +** +** [@tbs@] +** +** FORMAL PARAMETERS: +** +** [@description_or_none@] +** +** FUNCTION VALUE: +** +** [@description_or_none@] +** +************************************************************************/ +PipeElementCtxPtr SchedProcessComplete(ctx) + PipeElementCtxPtr ctx; +{ + CtxStatus_(ctx) = StatusComplete; +} + +/************************************************************************ +** SchedProcessNoInput +** +** FUNCTIONAL DESCRIPTION: +** +** Return the next pipeline context which is runnable by virtue +** of having its NoInput flag set. +** +** The scheduling is done from the current ctx to front. +** +** FORMAL PARAMETERS: +** +** pipe == Pointer to a pipeline header struct +** (may be the base Smi pipeline or an optimized pipe) +** ctx == Pointer to the context to begin with. +** +** FUNCTION VALUE: +** +** NULL == no element ready to run +** ctx == pointer to the context of the element to run +** +************************************************************************/ +PipeElementCtxPtr SchedProcessNoInput( pipe, ctx ) + Pipe pipe; + PipeElementCtxPtr ctx; +{ + /* + ** Search for an element that is "ready" AND requires no input. + */ + while( CtxTyp_(ctx) != TypePipe ) + { + if( CtxStatus_(ctx) == StatusReady && VecNoInpt_(CtxVecPtr_(ctx)) ) + /* + ** Return runnable element's context. + */ + return( ctx ); + + ctx = CtxPrv_(ctx); + } + return( NULL ); +} /* end of SchedProcessNoInput */ + +/************************************************************************ +** SchedProcessReady +** +** FUNCTIONAL DESCRIPTION: +** +** This function selects the next pipeline element that is ready +** for processing. +** +** The scheduling is done from back to front. This allows elements +** that are stalled for input to be stepped over until an element +** closer to the front of the pipe is found that can run. +** +** FORMAL PARAMETERS: +** +** pipe == Pointer to a pipeline header struct +** (may be the base Smi pipeline or an optimized pipe) +** +** FUNCTION VALUE: +** +** NULL == no element ready to run +** ctx == pointer to the context of the element to run +** +************************************************************************/ +PipeElementCtxPtr SchedProcessReady(pipe) + Pipe pipe; +{ + PipeElementCtxPtr ctx = PipeCtxRun_(pipe); + + if( ctx != NULL ) + { /* + ** Run this element -- it's already got the green light. + */ + PipeCtxRun_(pipe) = NULL; + return( ctx ); + } + + /* + ** Search for a runnable element -- it must be "ready" AND either + ** requires no input, OR it has quantum. + */ + for( ctx = PipeCtxPrv_(pipe); CtxTyp_(ctx) != TypePipe; ctx = CtxPrv_(ctx) ) + if( CtxStatus_(ctx) == StatusReady + && VecNoInpt_(CtxVecPtr_(ctx)) + || DdxRmHasQuantum_( CtxInp_(ctx) ) < XieK_MaxComponents ) + /* + ** Return runnable element's context. + */ + return( ctx ); + + return( NULL ); +} + +/************************************************************************ +** SchedOkToRun +** +** FUNCTIONAL DESCRIPTION: +** +** This function walks the pipe element list from "ctx" to back. +** +** FORMAL PARAMETERS: +** +** ctx - current pipe element context +** +** FUNCTION VALUE: +** +** TRUE == runnable -- no element closer to the end is runnable. +** FALSE == NOT ok to run -- another element has higher priority. +** +************************************************************************/ +int SchedOkToRun(ctx) + PipeElementCtxPtr ctx; +{ + PipeElementCtxPtr nxt_ctx; + + if( CtxStatus_(ctx) != StatusReady ) + return( FALSE ); + + for( nxt_ctx = CtxNxt_(ctx); + CtxTyp_(nxt_ctx) != TypePipe; + nxt_ctx = CtxNxt_(nxt_ctx) ) + { /* + ** If a downline element is able to run (ie. doesn't need input, + ** or has quantum) then our caller is ineligable to run (ie. the + ** downline element should run next). + */ + if( CtxStatus_(nxt_ctx) == StatusReady && + ( VecNoInpt_(CtxVecPtr_(nxt_ctx)) || + DdxRmHasQuantum_( CtxInp_(nxt_ctx) ) < XieK_MaxComponents ) ) + { + PipeCtxRun_(CtxHead_(ctx)) = nxt_ctx; + return( FALSE ); + } + } + return( TRUE ); +} diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiPipeSched.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiPipeSched.h new file mode 100644 index 0000000..1c64aaf --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiPipeSched.h @@ -0,0 +1,93 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* DEC/CMS REPLACEMENT HISTORY, Element SMIPIPESCHED.H */ +/* *2 1-NOV-1990 10:45:30 SHELLEY "first pass adding error handling" */ +/* *1 5-OCT-1990 17:36:04 HENNESSY "Created for DIX -> DDX interface change" */ +/* DEC/CMS REPLACEMENT HISTORY, Element SMIPIPESCHED.H */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the Pipe SCHEDULE module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** +** AUTHOR(S): +** +** Richard Hennessy +** +** CREATION DATE: +** +** September 25, 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMIPIPESCHED +#define _SMIPIPESCHED + + /* + ** Scheduler entry points. + */ +extern PipeElementCtxPtr SchedProcessComplete(); +extern PipeElementCtxPtr SchedProcessNoInput(); +extern PipeElementCtxPtr SchedProcessReady(); +extern int SchedOkToRun(); + +#endif +/* _SMIPIPESCHED */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiPoint.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiPoint.c new file mode 100644 index 0000000..965a4f0 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiPoint.c @@ -0,0 +1,1269 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module implements the point operator which remaps pixel +** values using a lookup table. The result values can have more or +** fewer levels than the input value. +** +** The width of each data array (input, table, and output) must be +** accounted for when performing the remapping. This produces an n^3 +** number of cases which must be handled: +** +** o The width of the input data can be larger or smaller than the +** width of the table. The only requirement is that the length of +** the table be at least 2^input_width. The input data is accessed +** using GET_VALUE_ to eliminate one level of code duplication, at the +** cost of reduced performance. +** +** o The width of the table can vary (in theory) from 1 to 32 bits. +** To improve performance, and reduce duplication, only aligned, +** atomic, unpadded tables are handled. In the unlikely case the +** supplied table doesn't meet these criteria, a suitable copy is +** made. A separate routine exists to handle each table data type +** (byte, word, longword). +** +** o The width of the output should be the same as the width of the +** table, but data type, alignment, and padding are not guaranteed. +** We'll also handle the cases where the output is narrower than the +** table and assume that the caller knows what it is doing. +** The routines for each table data type replicate blocks of +** code to handle bit, byte, and word aligned output data. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHORS: +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Fri Apr 6 15:05:31 1990 +** +*******************************************************************************/ + +#include + +#include "SmiPoint.h" + +/* +** Table of contents +*/ +int SmiPoint(); +int SmiCreatePoint(); + +static int _PointInitialize(); +static int _PointActivate(); +static int _PointDestroy(); + +static void _PointProcessByte(); +static void _PointProcessWord(); +static void _PointProcessLong(); +static UdpPtr _TempCvtLut(); +static void _TempDestroyUdp(); + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* +** Local storage +*/ + /* + ** Point Element Vector + */ +static PipeElementVector PointPipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypePointElement, /* Structure subtype */ + sizeof(PointPipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _PointInitialize, /* Initialize entry */ + _PointActivate, /* Activate entry */ + NULL, /* Flush entry */ + _PointDestroy, /* Destroy entry */ + NULL /* Abort entry point */ + }; + +/***************************************************************************** +** SmiCreatePoint +** +** FUNCTIONAL DESCRIPTION: +** +** This function fills in a newly created context for a POINT +** pipeline element. +** +** FORMAL PARAMETERS: +** +** pipe - Descriptor for pipe being built. +** srcsnk - Pointer to source sink. +** dstsnk - Pointer to destination sink. +** idc - Pointer to UDP describing the ROI or CPP (NULL if no IDC). +** lut - Array of pointesr to UDPs describing the point remap +** lookup table. +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCreatePoint(pipe,srcsnk,dstsnk,idc,luts) +Pipe pipe; +PipeSinkPtr srcsnk; +PipeSinkPtr dstsnk; +UdpPtr idc; +UdpPtr luts[XieK_MaxComponents]; + +{ + int i; + int dst_dtype; + + PointPipeCtxPtr ctx = (PointPipeCtxPtr) + DdxCreatePipeCtx_( pipe, &PointPipeElement, FALSE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + /* + ** Copy parameters + */ + PntSrcSnk_(ctx) = srcsnk; + PntDstSnk_(ctx) = dstsnk; + + PntCpp_(ctx) = (idc != NULL && idc->UdpA_Base != NULL) ? + idc : /* It's a CPP */ + NULL; + + for( i = 0; i < XieK_MaxComponents; i++ ) + if( IsPointer_(SnkUdpPtr_(srcsnk,i)) ) + PntCmpIn_(ctx)++; + else + break; + + for (i = 0; i < XieK_MaxComponents; i++) + { + if (SnkUdpPtr_(dstsnk,i) == NULL) + break; + /* Convert the input lookup table for efficient access */ + PntInTable_(ctx,i) = luts[i]; + PntTable_(ctx,i) = _TempCvtLut(luts[i]); + if( !IsPointer_(PntTable_(ctx,i)) ) return( (int) PntTable_(ctx,i) ); + PntCmpOut_(ctx)++; + } + + /* Calculate the region to be remapped */ + if (idc == NULL) + { + PntRoiX1_(ctx) = SnkX1_(srcsnk,0); PntRoiX2_(ctx) = SnkX2_(srcsnk,0); + PntRoiY1_(ctx) = SnkY1_(srcsnk,0); PntRoiY2_(ctx) = SnkY2_(srcsnk,0); + } + else + { + PntRoiX1_(ctx) = idc->UdpL_X1 > SnkX1_(srcsnk,0) ? idc->UdpL_X1 + : SnkX1_(srcsnk,0); + PntRoiX2_(ctx) = idc->UdpL_X2 < SnkX2_(srcsnk,0) ? idc->UdpL_X2 + : SnkX2_(srcsnk,0); + PntRoiY1_(ctx) = idc->UdpL_Y1 > SnkY1_(srcsnk,0) ? idc->UdpL_Y1 + : SnkY1_(srcsnk,0); + PntRoiY2_(ctx) = idc->UdpL_Y2 < SnkY2_(srcsnk,0) ? idc->UdpL_Y2 + : SnkY2_(srcsnk,0); + } + PntSrcDrn_(ctx) = DdxRmCreateDrain_( PntSrcSnk_(ctx), -1 ); + if( !IsPointer_(PntSrcDrn_(ctx)) ) return( (int) PntSrcDrn_(ctx) ); + + /* Handle any constrained input data type */ + DdxRmSetDType_( PntSrcDrn_(ctx), UdpK_DTypeUndefined, DtM_Constrained ); + DdxRmSetQuantum_( PntSrcDrn_(ctx), 1 ); + + /* Since this operator can explicitly cause a change in the number + * of bits per pixel, determine the result datatype by looking at + * the UDP(s) in the destination sink. + */ + /* Handle one scanline at a time */ + dst_dtype = SnkDatTyp_(dstsnk,0); + DdxRmSetDType_( PntDstSnk_(ctx), dst_dtype, DtM_Constrained ); + DdxRmSetQuantum_( PntDstSnk_(ctx), 1 ); + + return( Success ); +} /* end SmiCreatePoint */ + +/***************************************************************************** +** _PointInitialize +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the POINT pipeline element prior to +** activation. +** +** FORMAL PARAMETERS: +** +** ctx - point pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _PointInitialize(ctx) +PointPipeCtxPtr ctx; +{ + int status = DdxRmInitializePort_( CtxHead_(ctx), PntSrcDrn_(ctx) ); + if( status == Success ) + status = DdxRmInitializePort_( CtxHead_(ctx), PntDstSnk_(ctx) ); + + /* We are reading from the only drain */ + CtxInp_(ctx) = PntSrcDrn_(ctx); + + return( status ); +} + +/***************************************************************************** +** _PointActivate +** +** FUNCTIONAL DESCRIPTION: +** +** This routine maps the selected pixels in the input image +** using a transfer function supplied in the form of a lookup +** table (LUT). +** +** FORMAL PARAMETERS: +** +** ctx - point pipeline element context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _PointActivate(ctx) +PointPipeCtxPtr ctx; +{ + PipeDataPtr src, dst = NULL; + int status, i, outidx, copies = PntCmpOut_(ctx) - PntCmpIn_(ctx) + 1; + + for( status = Success; status == Success; src = DdxRmDeallocData_(src), + dst = DdxRmDeallocData_(dst) ) + { + src = DdxRmGetData_( ctx, PntSrcDrn_(ctx) ); + if( !IsPointer_(src) ) return( (int) src ); + + /* If there are more output components than input components, + * we will duplicate the data. */ + for( outidx = DatCmpIdx_(src), i = 0; i < copies; outidx++, i++ ) + { + dst = DdxRmAllocData_( PntDstSnk_(ctx), outidx, DatY1_(src), 1 ); + status = (int) dst; + if( !IsPointer_(dst) ) break; + + if( DatY1_(src) < PntRoiY1_(ctx) || DatY1_(src) > PntRoiY2_(ctx)) + status = DdxConvert_( DatUdpPtr_(src), + DatUdpPtr_(dst), XieK_MoveMode ); + else + { + /* Copy the portions of this line outside the ROI */ + status = DdxCopy_( DatUdpPtr_(src), /* Left */ + DatUdpPtr_(dst), + DatX1_(src), 0, + DatX1_(dst), DatY1_(dst), + PntRoiX1_(ctx) - DatX1_(src), 1 ); + if( status != Success ) break; + + status = DdxCopy_( DatUdpPtr_(src), /* Right */ + DatUdpPtr_(dst), + PntRoiX2_(ctx)+1, 0, + PntRoiX2_(ctx)+1, DatY1_(dst), + DatX2_(src) - PntRoiX2_(ctx), 1 ); + if( status != Success ) break; + + /* Call appropriate routine based on lookup table type */ + switch( PntTable_(ctx,outidx)->UdpB_DType ) + { + case UdpK_DTypeBU : + _PointProcessByte(DatUdpPtr_(src), + DatUdpPtr_(dst), + PntCpp_(ctx), + PntRoiX1_(ctx), + DatY1_(src), + PntRoiX2_(ctx), + DatY1_(src), + PntTable_(ctx,outidx)); + break; + + case UdpK_DTypeWU : + _PointProcessWord(DatUdpPtr_(src), + DatUdpPtr_(dst), + PntCpp_(ctx), + PntRoiX1_(ctx), + DatY1_(src), + PntRoiX2_(ctx), + DatY1_(src), + PntTable_(ctx,outidx)); + break; + + case UdpK_DTypeLU : + _PointProcessLong(DatUdpPtr_(src), + DatUdpPtr_(dst), + PntCpp_(ctx), + PntRoiX1_(ctx), + DatY1_(src), + PntRoiX2_(ctx), + DatY1_(src), + PntTable_(ctx,outidx)); + break; + } + } + if( status == Success ) + { + status = DdxRmPutData_( PntDstSnk_(ctx), dst ); + dst = NULL; + } + if( status != Success ) + break; + } + } + return( status ); +} + +/***************************************************************************** +** _PointDestroy +** +** FUNCTIONAL DESCRIPTION: +** +** This routine deallocates all resources allocated by the POINT +** pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - point pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _PointDestroy(ctx) +PointPipeCtxPtr ctx; +{ + int i; + + PntSrcDrn_(ctx) = DdxRmDestroyDrain_( PntSrcDrn_(ctx) ); + + /* Deallocate the converted lookup tables */ + for(i = 0; i < PntCmpOut_(ctx); i++) + _TempDestroyUdp(PntTable_(ctx,i), PntInTable_(ctx,i)); + + return( Success ); +} + +/***************************************************************************** +** SmiPoint +** +** FUNCTIONAL DESCRIPTION: +** +** This routine performs a non-pipelined point operator, which +** remaps pixel values using a lookup table. Only one component +** is remapped. +** +** FORMAL PARAMETERS: +** +** srcudp - Pointer to a UDP describing the source data. +** dstudp - Pointer to a UDP describing the destination buffer. +** idc - Pointer to a UDP describing the Region of Interest, +** or Control Processing Plane. (NULL if no IDC) +** lut - Pointer to UDP containing one lookup table, organized as a +** single scan line. +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiPoint( srcudp, dstudp, idc, lut ) +UdpPtr srcudp; +UdpPtr dstudp; +UdpPtr idc; +UdpPtr lut; + +{ + UdpPtr table; + UdpPtr cpp; + + long int status, pixels; + long int X1, X2, Y1, Y2; /* Extent of src/dst overlap */ + long int x1, x2, y1, y2; /* Extent of ROI */ + + + /* + ** Allocate the destination image array + */ + if( dstudp->UdpA_Base == NULL ) + { + dstudp->UdpA_Base = DdxMallocBits_( dstudp->UdpL_ArSize ); + if( dstudp->UdpA_Base == NULL ) return( BadAlloc ); + } + + /* + * Determine maximum common dimensions between source and destination, + * which is the defined region of output. + */ + X1 = srcudp->UdpL_X1 > dstudp->UdpL_X1 ? srcudp->UdpL_X1 : dstudp->UdpL_X1; + X2 = srcudp->UdpL_X2 < dstudp->UdpL_X2 ? srcudp->UdpL_X2 : dstudp->UdpL_X2; + Y1 = srcudp->UdpL_Y1 > dstudp->UdpL_Y1 ? srcudp->UdpL_Y1 : dstudp->UdpL_Y1; + Y2 = srcudp->UdpL_Y2 < dstudp->UdpL_Y2 ? srcudp->UdpL_Y2 : dstudp->UdpL_Y2; + + /* + * Determine the maximum common dimensions between the above region + * and the IDC (ROI or CPP), which is the region that will actually + * be processed. + */ + if( idc == NULL ) + { + x1 = X1; x2 = X2; + y1 = Y1; y2 = Y2; + } + else + { + x1 = idc->UdpL_X1 > X1 ? idc->UdpL_X1 : X1; + x2 = idc->UdpL_X2 < X2 ? idc->UdpL_X2 : X2; + y1 = idc->UdpL_Y1 > Y1 ? idc->UdpL_Y1 : Y1; + y2 = idc->UdpL_Y2 < Y2 ? idc->UdpL_Y2 : Y2; + } + cpp = (idc != NULL && idc->UdpA_Base != NULL) ? idc : NULL; + + /* Convert the lookup table to an efficient form if necessary */ + table = _TempCvtLut(lut); + if( !IsPointer_(table) ) return( (int) table ); + + /* Just copy the areas which don't need to be modified */ + status = DdxCopy_( srcudp, dstudp, X1, Y1, X1, Y1, X2-X1+1, y1-Y1 ); + if( status == Success ) + status = DdxCopy_( srcudp, dstudp, X1, y2+1, X1, y2+1, X2-X1+1, Y2-y2 ); + if( status == Success ) + status = DdxCopy_( srcudp, dstudp, X1, y1, X1, y1, x1-X1, y2-y1+1 ); + if( status == Success ) + status = DdxCopy_( srcudp, dstudp, x2+1, y1, x2+1, y1, X2-x2, y2-y1+1 ); + + if( status == Success ) + switch (table->UdpB_DType) + { + case UdpK_DTypeBU : + _PointProcessByte(srcudp, dstudp, cpp, x1, y1, x2, y2, table); + break; + + case UdpK_DTypeWU : + _PointProcessWord(srcudp, dstudp, cpp, x1, y1, x2, y2, table); + break; + + case UdpK_DTypeLU : + _PointProcessLong(srcudp, dstudp, cpp, x1, y1, x2, y2, table); + break; + } + + _TempDestroyUdp(table, lut); + + return( status ); +} /* end SmiPoint */ + +/***************************************************************************** +** _PointProcessxxxx +** +** FUNCTIONAL DESCRIPTION: +** +** These routines perform the actual pixel remapping for the +** selected region of an image. +** The src and dst data types must be the same. +** +** FORMAL PARAMETERS: +** +** src - Pointer to a UDP describing the source data. +** dst - Pointer to a UDP describing the destination buffer. +** cpp - Pointer to a UDP describing the Control Processing Plane. +** (NULL if no CPP) +** x1 - The x coordinate of the upper left corner of the CPP, or +** the ROI. +** y1 - The y coordinate of the upper left corner of the CPP, or +** the ROI. +** x2 - The x coordinate of the lower right corner of the CPP, or +** the ROI. +** y2 - The y coordinate of the lower right corner of the CPP, or +** the ROI. +** lut - Pointers to a UDP which contains the lookup table for +** this source udp. +** +*****************************************************************************/ +static void _PointProcessByte(src, dst, cpp, x1, y1, x2, y2, lut) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +long int x1; +long int x2; +long int y1; +long int y2; +UdpPtr lut; +{ + long int pixel; + long int scanline; + + unsigned long srcmask; + unsigned long dstmask; + + long int srcpxlstart; + long int srcpxloff; + long int dstpxlstart; + long int dstpxloff; + unsigned long pxlvalue; + + long int cpppxlstart; + long int cpppxloff; + + srcmask = (1<UdpW_PixelLength)-1; + dstmask = (1<UdpW_PixelLength)-1; + + srcpxlstart = src->UdpL_Pos + (y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dstpxlstart = dst->UdpL_Pos + (y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + + /* Begin massive code duplication to minimize branches in the + * inner loops. + */ + if( cpp == NULL ) + { + /* The mapping is not controlled by a CPP */ + switch( DdxGetTyp_( dst ) ) + { + case XieK_UBAV : + case XieK_UBAVU: /* This currently handles LU + * data due to hack in DdxGetTyp_ */ + /* Destination is aligned or unaligned bit stream format */ + for (scanline = y1; scanline <= y2; scanline++) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + pxlvalue = ((unsigned char *)lut->UdpA_Base)[pxlvalue]; + + PUT_VALUE_(dst->UdpA_Base, dstpxloff, pxlvalue, dstmask); + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_ABU : + /* Destination is byte aligned */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for (pixel = x1; pixel <= x2; pixel++) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + pxlvalue = ((unsigned char *)lut->UdpA_Base)[pxlvalue]; + + *((unsigned char *) + (dst->UdpA_Base + (dstpxloff >> 3))) = pxlvalue; + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_AWU : + /* Destination is word (16 bit shorts) aligned */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for (pixel = x1; pixel <= x2; pixel++) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + pxlvalue = ((unsigned char *)lut->UdpA_Base)[pxlvalue]; + + *((unsigned short *) + (dst->UdpA_Base + (dstpxloff >> 3))) = pxlvalue; + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + } /* end switch */ + + } + + else + { + /* The mapping is controlled by a Control Processing Plane */ + + cpppxlstart = cpp->UdpL_Pos + cpp->UdpL_ScnStride * (y1 - cpp->UdpL_Y1); + + switch( DdxGetTyp_( dst ) ) + { + case XieK_UBAV : + case XieK_UBAVU : + /* Destination is aligned or unaligned bit stream format */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + cpppxloff = cpppxlstart; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + if (GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1)) + pxlvalue = ((unsigned char *)lut->UdpA_Base)[pxlvalue]; + + PUT_VALUE_(dst->UdpA_Base, dstpxloff, pxlvalue, dstmask); + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + cpppxloff += cpp->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + cpppxlstart += cpp->UdpL_ScnStride; + } + break; + + case XieK_ABU : + /* Destination is byte aligned */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + cpppxloff = cpppxlstart; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + if (GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1) ) + pxlvalue = ((unsigned char *)lut->UdpA_Base)[pxlvalue]; + + cpppxloff += cpp->UdpL_PxlStride; + + (*(unsigned char *) + (dst->UdpA_Base + (dstpxloff >> 3))) = pxlvalue; + + srcpxloff+=src->UdpL_PxlStride; + dstpxloff+=dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + cpppxlstart += cpp->UdpL_ScnStride; + } + break; + + case XieK_AWU: + /* Destination is word (16 bit short) aligned */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + cpppxloff = cpppxlstart; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + if (GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1) ) + pxlvalue = ((unsigned char *)lut->UdpA_Base)[pxlvalue]; + + cpppxloff += cpp->UdpL_PxlStride; + + (*(unsigned short *) + (dst->UdpA_Base + (dstpxloff >> 3))) = pxlvalue; + + srcpxloff+=src->UdpL_PxlStride; + dstpxloff+=dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + cpppxlstart += cpp->UdpL_ScnStride; + } + break; + } /* end switch */ + } +} /* end _PointProcessByte */ + +static void _PointProcessWord(src, dst, cpp, x1, y1, x2, y2, lut) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +long int x1; +long int x2; +long int y1; +long int y2; +UdpPtr lut; +{ + long int pixel; + long int scanline; + + unsigned long srcmask; + unsigned long dstmask; + + long int srcpxlstart; + long int srcpxloff; + long int dstpxlstart; + long int dstpxloff; + unsigned long pxlvalue; + + long int cpppxlstart; + long int cpppxloff; + + srcmask = (1<UdpW_PixelLength)-1; + dstmask = (1<UdpW_PixelLength)-1; + + srcpxlstart = src->UdpL_Pos + (y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dstpxlstart = dst->UdpL_Pos + (y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + + /* Begin massive code duplication to minimize branches in the + * inner loops. + */ + if( cpp == NULL ) + { + /* The mapping is not controlled by a CPP */ + switch( DdxGetTyp_( dst ) ) + { + case XieK_UBAV : + case XieK_UBAVU: /* This currently handles LU + * data due to hack in DdxGetTyp_ */ + /* Destination is aligned or unaligned bit stream format */ + for (scanline = y1; scanline <= y2; scanline++) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + pxlvalue = ((unsigned short *)lut->UdpA_Base)[pxlvalue]; + + PUT_VALUE_(dst->UdpA_Base, dstpxloff, pxlvalue, dstmask); + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_ABU : + /* Destination is byte aligned */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for (pixel = x1; pixel <= x2; pixel++) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + pxlvalue = ((unsigned short *)lut->UdpA_Base)[pxlvalue]; + + *((unsigned char *) + (dst->UdpA_Base + (dstpxloff >> 3))) = pxlvalue; + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_AWU : + /* Destination is word (16 bit short) aligned */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for (pixel = x1; pixel <= x2; pixel++) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + pxlvalue = ((unsigned short *)lut->UdpA_Base)[pxlvalue]; + + *((unsigned short *) + (dst->UdpA_Base + (dstpxloff >> 3))) = pxlvalue; + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + } /* end switch */ + } + + else + { + /* The mapping is controlled by a Control Processing Plane */ + + cpppxlstart = cpp->UdpL_Pos + cpp->UdpL_ScnStride * (y1 - cpp->UdpL_Y1); + + switch( DdxGetTyp_( dst ) ) + { + case XieK_UBAV : + case XieK_UBAVU : + /* Destination is aligned or unaligned bit stream format */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + cpppxloff = cpppxlstart; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + if (GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1)) + pxlvalue = ((unsigned short *)lut->UdpA_Base)[pxlvalue]; + PUT_VALUE_(dst->UdpA_Base, dstpxloff, pxlvalue, dstmask); + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + cpppxloff += cpp->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + cpppxlstart += cpp->UdpL_ScnStride; + } + break; + + case XieK_ABU : + /* Destination is byte aligned */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + cpppxloff = cpppxlstart; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + + if (GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1) ) + pxlvalue = ((unsigned short *)lut->UdpA_Base)[pxlvalue]; + + (*(unsigned char *) + (dst->UdpA_Base + (dstpxloff >> 3))) = pxlvalue; + + srcpxloff+=src->UdpL_PxlStride; + dstpxloff+=dst->UdpL_PxlStride; + cpppxloff += cpp->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + cpppxlstart += cpp->UdpL_ScnStride; + } + break; + + case XieK_AWU : + /* Destination is word (16 bit short) aligned */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + cpppxloff = cpppxlstart; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + + if (GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1) ) + pxlvalue = ((unsigned short *)lut->UdpA_Base)[pxlvalue]; + + (*(unsigned short *) + (dst->UdpA_Base + (dstpxloff >> 3))) = pxlvalue; + + srcpxloff+=src->UdpL_PxlStride; + dstpxloff+=dst->UdpL_PxlStride; + cpppxloff += cpp->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + cpppxlstart += cpp->UdpL_ScnStride; + } + break; + + } /* end switch */ + } +} /* end _PointProcessWord */ + +static void _PointProcessLong(src, dst, cpp, x1, y1, x2, y2, lut) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +long int x1; +long int x2; +long int y1; +long int y2; +UdpPtr lut; +{ + long int pixel; + long int scanline; + + unsigned long srcmask; + unsigned long dstmask; + + long int srcpxlstart; + long int srcpxloff; + long int dstpxlstart; + long int dstpxloff; + unsigned long pxlvalue; + + long int cpppxlstart; + long int cpppxloff; + + srcmask = (1<UdpW_PixelLength)-1; + dstmask = (1<UdpW_PixelLength)-1; + + srcpxlstart = src->UdpL_Pos + (y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + dstpxlstart = dst->UdpL_Pos + (y1 - dst->UdpL_Y1) * dst->UdpL_ScnStride; + + + /* Begin massive code duplication to minimize branches in the + * inner loops. + */ + if( cpp == NULL ) + { + /* The mapping is not controlled by a CPP */ + switch( DdxGetTyp_( dst ) ) + { + case XieK_UBAV : + case XieK_UBAVU: /* This currently handles LU + * data due to hack in DdxGetTyp_ */ + /* Destination is aligned or unaligned bit stream format */ + for (scanline = y1; scanline <= y2; scanline++) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + pxlvalue = ((unsigned long *)lut->UdpA_Base)[pxlvalue]; + + PUT_VALUE_(dst->UdpA_Base, dstpxloff, pxlvalue, dstmask); + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_ABU : + /* Destination is byte aligned */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for (pixel = x1; pixel <= x2; pixel++) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + pxlvalue = ((unsigned long *)lut->UdpA_Base)[pxlvalue]; + + *((unsigned char *) + (dst->UdpA_Base + (dstpxloff >> 3))) = pxlvalue; + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + + case XieK_AWU : + /* Destination is word (16 bit short) aligned */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + + for (pixel = x1; pixel <= x2; pixel++) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + pxlvalue = ((unsigned long *)lut->UdpA_Base)[pxlvalue]; + + *((unsigned short *) + (dst->UdpA_Base + (dstpxloff >> 3))) = pxlvalue; + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + } + break; + } /* end switch */ + } + + else + { + /* The mapping is controlled by a Control Processing Plane */ + + cpppxlstart = cpp->UdpL_Pos + cpp->UdpL_ScnStride * (y1 - cpp->UdpL_Y1); + + switch( DdxGetTyp_( dst ) ) + { + case XieK_UBAV : + case XieK_UBAVU : + /* Destination is aligned or unaligned bit stream format */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + cpppxloff = cpppxlstart; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + if (GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1)) + pxlvalue = ((unsigned long *)lut->UdpA_Base)[pxlvalue]; + + PUT_VALUE_(dst->UdpA_Base, dstpxloff, pxlvalue, dstmask); + + srcpxloff += src->UdpL_PxlStride; + dstpxloff += dst->UdpL_PxlStride; + cpppxloff += cpp->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + cpppxlstart += cpp->UdpL_ScnStride; + } + break; + + case XieK_ABU : + /* Destination is byte aligned */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + cpppxloff = cpppxlstart; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + + if (GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1) ) + pxlvalue = ((unsigned long *)lut->UdpA_Base)[pxlvalue]; + + (*(unsigned char *) + (dst->UdpA_Base + (dstpxloff >> 3))) = pxlvalue; + + srcpxloff+=src->UdpL_PxlStride; + dstpxloff+=dst->UdpL_PxlStride; + cpppxloff += cpp->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + cpppxlstart += cpp->UdpL_ScnStride; + } + break; + + case XieK_AWU : + /* Destination is word (16 bit short) aligned */ + for( scanline = y1; scanline <= y2; scanline++ ) + { + srcpxloff = srcpxlstart+(x1-src->UdpL_X1)*src->UdpL_PxlStride; + dstpxloff = dstpxlstart+(x1-dst->UdpL_X1)*dst->UdpL_PxlStride; + cpppxloff = cpppxlstart; + + for( pixel = x1; pixel <= x2; pixel++ ) + { + pxlvalue = GET_VALUE_(src->UdpA_Base, srcpxloff, srcmask); + + if (GET_VALUE_(cpp->UdpA_Base, cpppxloff, 1) ) + pxlvalue = ((unsigned long *)lut->UdpA_Base)[pxlvalue]; + + (*(unsigned short *) + (dst->UdpA_Base + (dstpxloff >> 3))) = pxlvalue; + + srcpxloff+=src->UdpL_PxlStride; + dstpxloff+=dst->UdpL_PxlStride; + cpppxloff += cpp->UdpL_PxlStride; + } + srcpxlstart += src->UdpL_ScnStride; + dstpxlstart += dst->UdpL_ScnStride; + cpppxlstart += cpp->UdpL_ScnStride; + } + break; + + } /* end switch */ + } +} /* end _PointProcessLong */ + +/***************************************************************************** +** _TempCvtLut +** +** FUNCTIONAL DESCRIPTION: +** +** Convert data, described by src UDP, into the nearest atomic array +** datatype which will hold it. The result is created with no +** pad, so it can be indexed efficiently. +** If the formats is already suitable, just return the original UDP. +** +** +** FORMAL PARAMETERS: +** +** src - Pointer to input UDP +** +** FUNCTION VALUE: +** +** Returns a pointer to a UDP describing the data. +** +*****************************************************************************/ +static UdpPtr _TempCvtLut(src) + UdpPtr src; +{ + UdpPtr out; + int pixel_length, dtype, status; + + if((src->UdpB_DType != UdpK_DTypeBU && + src->UdpB_DType != UdpK_DTypeWU && + src->UdpB_DType != UdpK_DTypeLU) || + (src->UdpL_PxlStride != src->UdpW_PixelLength || + src->UdpL_ScnStride != (src->UdpL_PxlPerScn * src->UdpL_PxlStride) || + src->UdpL_Pos != 0)) + { + if( src->UdpL_Levels <= 256 ) + { + pixel_length = 8 * sizeof(char); + dtype = UdpK_DTypeBU; + } + else if( src->UdpL_Levels <= 65535 ) + { + pixel_length = 8 * sizeof(short); + dtype = UdpK_DTypeWU; + } + else + { + pixel_length = 8 * sizeof(long); + dtype = UdpK_DTypeLU; + } + out = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( out == NULL ) return( (UdpPtr) BadAlloc ); + + out->UdpW_PixelLength = pixel_length; + out->UdpB_DType = dtype; + out->UdpB_Class = UdpK_ClassA; + out->UdpL_X1 = src->UdpL_X1; + out->UdpL_X2 = src->UdpL_X2; + out->UdpL_Y1 = src->UdpL_Y1; + out->UdpL_Y2 = src->UdpL_Y2; + out->UdpL_PxlPerScn = src->UdpL_PxlPerScn; + out->UdpL_ScnCnt = src->UdpL_ScnCnt; + out->UdpL_PxlStride = out->UdpW_PixelLength; + out->UdpL_ScnStride = out->UdpL_PxlStride * out->UdpL_PxlPerScn; + out->UdpL_ArSize = out->UdpL_ScnStride * out->UdpL_ScnCnt; + out->UdpA_Base = NULL; + out->UdpL_Pos = 0; + out->UdpL_CompIdx = src->UdpL_CompIdx; + out->UdpL_Levels = src->UdpL_Levels; + + status = DdxConvert_( src, out, XieK_MoveMode ); + if( status != Success ) return( DdxFree_(out), (UdpPtr) status ); + } + else + out = src; + + return( out ); +} /* end _TempCvtLut */ + +/***************************************************************************** +** _TempDestroyUdp +** +** FUNCTIONAL DESCRIPTION: +** +** Free a temporary UDPs and its data, if it is not just a +* reference to another UDP. +** +** FORMAL PARAMETERS: +** +** in - Pointer to input UDP +** realudp - Point to a UDP which might be the same as the input UDP. +** +*****************************************************************************/ +static void _TempDestroyUdp(in, realudp) + UdpPtr in; + UdpPtr realudp; +{ + if( IsPointer_(in) && in != realudp ) + { + if( IsPointer_(in->UdpA_Base) ) + DdxFreeBits_(in->UdpA_Base); + DdxFree_(in); + } +} /* end _TempDestroyUdp */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiPoint.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiPoint.h new file mode 100644 index 0000000..6fa14fd --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiPoint.h @@ -0,0 +1,145 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/* DEC/CMS REPLACEMENT HISTORY, Element SMIPOINT.H */ +/* *2 14-MAR-1990 17:29:33 WEBER "Change argument passing" */ +/* *1 14-FEB-1990 09:10:24 WEBER "SMI Point header file" */ +/* DEC/CMS REPLACEMENT HISTORY, Element SMIPOINT.H */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the POINT pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.0 +** RISC ULTRIX V3.0 +** +** AUTHOR(S): +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Fri Apr 6 15:05:04 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMIPOINT +#define _SMIPOINT + +/* +** Include files +*/ +#include + + /* + ** Function reference + */ +int SmiPoint(); +int SmiCreatePoint(); + +/* +** Structure definitions and Typedefs +*/ + +/* +** Point pipeline context block. +*/ +typedef struct _PointPipeCtx { + PipeElementCommonPart common; + struct _PointPart { + PipeSinkPtr srcsnk; + PipeSinkPtr dstsnk; + PipeDrainPtr srcdrn; + UdpPtr cpp; + long int x1; /* ROI or CPP position and extent */ + long int x2; + long int y1; + long int y2; + int cmpin; + int cmpout; + UdpPtr table[XieK_MaxComponents]; + UdpPtr intable[XieK_MaxComponents]; + } PointPart; +} PointPipeCtx, *PointPipeCtxPtr; + +/* +** MACRO definitions +*/ + +/* +** Pipeline context, Point part, access MACROs +*/ +#define PntSrcSnk_(ctx) (((PointPipeCtxPtr)(ctx))->PointPart.srcsnk) +#define PntDstSnk_(ctx) (((PointPipeCtxPtr)(ctx))->PointPart.dstsnk) + +#define PntSrcDrn_(ctx) (((PointPipeCtxPtr)(ctx))->PointPart.srcdrn) +#define PntCpp_(ctx) (((PointPipeCtxPtr)(ctx))->PointPart.cpp) +#define PntRoiX1_(ctx) (((PointPipeCtxPtr)(ctx))->PointPart.x1) +#define PntRoiX2_(ctx) (((PointPipeCtxPtr)(ctx))->PointPart.x2) +#define PntRoiY1_(ctx) (((PointPipeCtxPtr)(ctx))->PointPart.y1) +#define PntRoiY2_(ctx) (((PointPipeCtxPtr)(ctx))->PointPart.y2) +#define PntCmpIn_(ctx) (((PointPipeCtxPtr)(ctx))->PointPart.cmpin) +#define PntCmpOut_(ctx) (((PointPipeCtxPtr)(ctx))->PointPart.cmpout) +#define PntInTable_(ctx,comp) \ + (((PointPipeCtxPtr)(ctx))->PointPart.intable[comp]) +#define PntTable_(ctx,comp) (((PointPipeCtxPtr)(ctx))->PointPart.table[comp]) + +#endif +/* _SMIPOINT */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiRotate.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiRotate.c new file mode 100644 index 0000000..71f3191 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiRotate.c @@ -0,0 +1,622 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** X Image Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains sample code for image data rotation. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Robert NC Shelley +** +** CREATION DATE: +** +** October 26, 1989 +** +** MODIFICATION HISTORY: +** +*******************************************************************************/ + +/* +** Include files +*/ +#include + +#include "SmiRotate.h" + +/* +** Table of contents +*/ +int SmiRotate(); +int SmiCreateRotate(); + +static int _RotateInitialize(); +static int _RotateActivate(); +static int _RotateAbort(); +static int _RotateDestroy(); + +static void _ProcessRotate(); +static UdpPtr _CvtSrc(); + +/* +** Equated Symbols +*/ +#define FALSE 0 +#define TRUE 1 + +/* +** MACRO definitions +*/ + +/* +** External References +*/ + +/* +** Local Storage +*/ + +/* Rotate Pipeline Element Vector */ +static PipeElementVector RotatePipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeRotateElement, /* Structure subtype */ + sizeof(RotatePipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _RotateInitialize, /* Initialize entry */ + _RotateActivate, /* Activate entry */ + NULL, /* Flush entry */ + _RotateDestroy, /* Destroy entry */ + NULL /* Abort entry */ + }; + +/***************************************************************************** +** SmiCreateRotate +** +** FUNCTIONAL DESCRIPTION: +** +** This function fills in a newly created ROTATE pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - rotate pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCreateRotate(pipe,src,dst,angle,fill) +Pipe pipe; +PipeSinkPtr src; +PipeSinkPtr dst; +double angle; +int fill[]; +{ + int i; + RotatePipeCtxPtr ctx = (RotatePipeCtxPtr) + DdxCreatePipeCtx_(pipe, &RotatePipeElement, FALSE); + if( !IsPointer_(ctx) ) return( (int) ctx ); + + /* + ** Copy the parameters to the context block. + */ + RotSrcSnk_(ctx) = src; + RotDstSnk_(ctx) = dst; + RotAngle_(ctx) = angle; + for( i = 0; i < XieK_MaxComponents && IsPointer_(SnkUdpPtr_(dst,i)); i++ ) + RotFill_(ctx,i) = fill[i] < SnkLvl_(dst,i) + ? fill[i] : SnkLvl_(dst,i) - 1;; + /* + ** Setup one drain from source sink, receiving all components + */ + RotSrcDrn_(ctx) = DdxRmCreateDrain_( src, -1 ); + if( !IsPointer_(RotSrcDrn_(ctx)) ) return( (int) RotSrcDrn_(ctx) ); + /* + ** Decide on data types we'll allow (we're not too fussy). + */ + DdxRmSetDType_( RotSrcDrn_(ctx), UdpK_DTypeUndefined, DtM_Any ); + DdxRmSetDType_( RotDstSnk_(ctx), UdpK_DTypeUndefined, DtM_Any ); + /* + ** Handle only full image. + */ + DdxRmSetQuantum_( RotSrcDrn_(ctx), SnkHeight_(src,0) ); + DdxRmSetQuantum_( RotDstSnk_(ctx), SnkHeight_(dst,0) ); + + return( Success ); +} /* end SmiCreateRotate */ + +/***************************************************************************** +** _RotateInitialize +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the ROTATE pipeline element prior to +** an activation. +** +** FORMAL PARAMETERS: +** +** ctx - rotate pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _RotateInitialize(ctx) +RotatePipeCtxPtr ctx; +{ + int dtype, status; + + /* + ** Initialize the source drain. + */ + CtxInp_(ctx) = RotSrcDrn_(ctx); + status = DdxRmInitializePort_( CtxHead_(ctx), RotSrcDrn_(ctx) ); + if( status != Success ) return( status ); + /* + ** Set our destination sink DType to match our drain and initialize it. + */ + dtype = DdxRmGetDType_( RotSrcDrn_(ctx) ); + DdxRmSetDType_( RotDstSnk_(ctx), dtype, 1<UdpA_Base == NULL ) + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); +if( dst->UdpA_Base == NULL ) + status = BadAlloc; +else + /* Do the actual work */ + _ProcessRotate(src, dst, angle, value); + +if( src != in ) + { /* free converted input data */ + DdxFreeBits_( src->UdpA_Base ); + DdxFree_( src ); + } + +return( status ); +} /* end SmiRotate */ + +/****************************************************************************** +** ProcessRotate +** +** FUNCTIONAL DESCRIPTION: +** +** Rotate an image through any number of degrees using the +** nearest neighbor algorithm to interpolate the value of pixels +** located at non-integral coordinates in the source. +** +** FORMAL PARAMETERS: +** +** in - Pointer to source udp (initialized) +** dst - Pointer to destination udp (initialized, maybe without array) +** angle - Degrees of rotation (positive angle == clockwise rotation) +** fill - Fill value +** +******************************************************************************/ +static void _ProcessRotate( src, dst, angle, fill ) +UdpPtr src; +UdpPtr dst; +double angle; +unsigned long fill; +{ +double xsina, xcosa; /* x sine and cosine */ +double ysina, ycosa; /* y sine and cosine */ +double sina, cosa; /* sine and cosine of angle */ +double xpivot, ypivot; /* x and y dst pivot coordinates */ +double xtrans, ytrans; /* x and y src translation */ +unsigned long xclip, yclip; /* x and y src clip region limits */ +unsigned long xsrc, ysrc; /* x,y nearest neighbor coordinate */ +unsigned long pxlind, scnind; /* pixel and scanline indices */ +unsigned long pxloff, scnoff; /* pixel and scanline offsets */ +unsigned long smask, dmask; /* src and dst pixel value masks */ +unsigned long pxlval; /* temp for pixel value */ + +/* +** Compute the sine and cosine of angle. +*/ +sina = sin( angle * RADIANS_PER_DEGREE ); +cosa = cos( angle * RADIANS_PER_DEGREE ); + +/* +** Translate dst to align it with the center of src, offset by relative X1,Y1. +*/ +xtrans = src->UdpL_PxlPerScn / 2.0 + dst->UdpL_X1 - src->UdpL_X1 - 0.5; +ytrans = src->UdpL_ScnCnt / 2.0 + dst->UdpL_Y1 - src->UdpL_Y1 - 0.5; + +/* +** We will rotate around the center point of the translated dst. +*/ +xpivot = dst->UdpL_PxlPerScn / 2.0; +ypivot = dst->UdpL_ScnCnt / 2.0; + +/* +** Set src clip region limits (by normalizing to 0,0 we take advantage of +** unsigned arithmetic to make negative values look greater than clip limits). +*/ +xclip = src->UdpL_X2 - src->UdpL_X1; +yclip = src->UdpL_Y2 - src->UdpL_Y1; + +/* +** Set the initial src scanline sine and cosine (relative to the pivot point), +** and the dst scanline data offset . +*/ +ysina = -ypivot * sina; +ycosa = -ypivot * cosa; +scnoff = dst->UdpL_Pos; + +/* +** Rotate the image data (code duplication traded for execution efficiency). +*/ +switch( DdxGetTyp_( dst ) ) + { + +case XieK_UBAV : +case XieK_UBAVU : + /* + ** Rotate aligned or unaligned bit stream image data. + */ + smask = (1<UdpW_PixelLength)-1; /* mask for isolating src pixel */ + dmask = (1<UdpW_PixelLength)-1; /* mask for isolating dst pixel */ + + for( scnind = 0; scnind < dst->UdpL_ScnCnt; scnind++ ) + { + xsina = -xpivot * sina; /* initial src pixel sin offset */ + xcosa = -xpivot * cosa; /* initial src pixel cos offset */ + pxloff = scnoff; /* initial dst pixel bit offset */ + + for( pxlind = 0; pxlind < dst->UdpL_PxlPerScn; pxlind++ ) + { + xsrc = xcosa - ysina + xtrans; /* nearest neighbor X coordinate*/ + ysrc = xsina + ycosa + ytrans; /* nearest neighbor Y coordinate*/ + + if( xsrc > xclip || ysrc > yclip ) + pxlval = fill; /* use fill value */ + else /* use nearest src pixel value */ + pxlval = GET_VALUE_( src->UdpA_Base, src->UdpL_Pos + + src->UdpL_ScnStride * ysrc + + src->UdpL_PxlStride * xsrc, smask ); + PUT_VALUE_( dst->UdpA_Base, pxloff, pxlval, dmask ); + + xsina += sina; /* new src pixel sin offset */ + xcosa += cosa; /* new src pixel cos offset */ + pxloff += dst->UdpL_PxlStride; /* new dst pixel bit offset */ + } + ysina += sina; /* new src scanline sin offset */ + ycosa += cosa; /* new src scanline cos offset */ + scnoff += dst->UdpL_ScnStride; /* new dst scanline bit offset */ + } + break; /* end unaligned bit stream image */ + +case XieK_ABU : + /* + ** Rotate aligned byte size image data. + */ + for( scnind = 0; scnind < dst->UdpL_ScnCnt; scnind++ ) + { + xsina = -xpivot * sina; /* initial src pixel sin offset */ + xcosa = -xpivot * cosa; /* initial src pixel cos offset */ + pxloff = scnoff; /* initial dst pixel bit offset */ + + for( pxlind = 0; pxlind < dst->UdpL_PxlPerScn; pxlind++ ) + { + xsrc = xcosa - ysina + xtrans; /* nearest neighbor X coordinate*/ + ysrc = xsina + ycosa + ytrans; /* nearest neighbor Y coordinate*/ + + if( xsrc > xclip || ysrc > yclip ) + /* + ** Outside src clip region -- so use fill value. + */ + *((unsigned char *)(dst->UdpA_Base + (pxloff >> 3))) = fill; + else + /* + ** Stash the dst pixel with the nearest src pixel value. + */ + *((unsigned char *)(dst->UdpA_Base + (pxloff >> 3))) = + *((unsigned char *)(src->UdpA_Base + + (src->UdpL_Pos + + src->UdpL_ScnStride * ysrc + + src->UdpL_PxlStride * xsrc >> 3))); + + xsina += sina; /* new src pixel sin offset */ + xcosa += cosa; /* new src pixel cos offset */ + pxloff += dst->UdpL_PxlStride; /* new dst pixel bit offset */ + } + ysina += sina; /* new src scanline sin offset */ + ycosa += cosa; /* new src scanline cos offset */ + scnoff += dst->UdpL_ScnStride; /* new dst scanline bit offset */ + } + break; /* end aligned byte image */ + +case XieK_AWU : + /* + ** Rotate aligned word size image data. + */ + for( scnind = 0; scnind < dst->UdpL_ScnCnt; scnind++ ) + { + xsina = -xpivot * sina; /* initial src pixel sin offset */ + xcosa = -xpivot * cosa; /* initial src pixel cos offset */ + pxloff = scnoff; /* initial dst pixel bit offset */ + + for( pxlind = 0; pxlind < dst->UdpL_PxlPerScn; pxlind++ ) + { + xsrc = xcosa - ysina + xtrans; /* nearest neighbor X coordinate*/ + ysrc = xsina + ycosa + ytrans; /* nearest neighbor Y coordinate*/ + + if( xsrc > xclip || ysrc > yclip ) + /* + ** Outside src clip region -- so use fill value. + */ + *((unsigned short *)(dst->UdpA_Base + (pxloff >> 3))) = fill; + else + /* + ** Stash the dst pixel with the nearest src pixel value. + */ + *((unsigned short *)(dst->UdpA_Base + (pxloff >> 3))) = + *((unsigned short *)(src->UdpA_Base + + (src->UdpL_Pos + + src->UdpL_ScnStride * ysrc + + src->UdpL_PxlStride * xsrc >> 3))); + + xsina += sina; /* new src pixel sin offset */ + xcosa += cosa; /* new src pixel cos offset */ + pxloff += dst->UdpL_PxlStride; /* new dst pixel bit offset */ + } + ysina += sina; /* new src scanline sin offset */ + ycosa += cosa; /* new src scanline cos offset */ + scnoff += dst->UdpL_ScnStride; /* new dst scanline bit offset */ + } + break; /* end aligned byte image */ + +case XieK_AF : + /* + ** Rotate aligned float image data. + */ + smask = (1<UdpW_PixelLength)-1; /* mask for isolating src pixel */ + dmask = (1<UdpW_PixelLength)-1; /* mask for isolating dst pixel */ + + for( scnind = 0; scnind < dst->UdpL_ScnCnt; scnind++ ) + { + xsina = -xpivot * sina; /* initial src pixel sin offset */ + xcosa = -xpivot * cosa; /* initial src pixel cos offset */ + pxloff = scnoff; /* initial dst pixel bit offset */ + + for( pxlind = 0; pxlind < dst->UdpL_PxlPerScn; pxlind++ ) + { + xsrc = xcosa - ysina + xtrans; /* nearest neighbor X coordinate*/ + ysrc = xsina + ycosa + ytrans; /* nearest neighbor Y coordinate*/ + + if( xsrc > xclip || ysrc > yclip ) + /* + ** Outside src clip region -- so use fill value (fill is really + ** a float value, but we lie about it to avoid conversion). + */ + *((unsigned long *)(dst->UdpA_Base + (pxloff >> 3))) = fill; + else + /* + ** Stash the dst pixel with the nearest src pixel value. + */ + *((float *)(dst->UdpA_Base + (pxloff >> 3))) = + *((float *)(src->UdpA_Base + (src->UdpL_Pos + + src->UdpL_ScnStride * ysrc + + src->UdpL_PxlStride * xsrc >> 3))); + + + xsina += sina; /* new src pixel sin offset */ + xcosa += cosa; /* new src pixel cos offset */ + pxloff += dst->UdpL_PxlStride; /* new dst pixel bit offset */ + } + ysina += sina; /* new src scanline sin offset */ + ycosa += cosa; /* new src scanline cos offset */ + scnoff += dst->UdpL_ScnStride; /* new dst scanline bit offset */ + } + break; /* end aligned float image */ + } + +} /* end _ProcessRotate */ + +/****************************************************************************** +** _CvtSrc +** +** FUNCTIONAL DESCRIPTION: +** +** Convert src to match dst if data types don't match. +** +** FORMAL PARAMETERS: +** +** in - Pointer to src udp +** dst - Pointer to dst udp +** +******************************************************************************/ +static UdpPtr _CvtSrc( in, dst ) +UdpPtr in, dst; +{ + int status; + UdpPtr src; + + if( in->UdpB_DType == dst->UdpB_DType ) + return( in ); + + src = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( src == NULL ) return( (UdpPtr) BadAlloc ); + + *src = *in; + src->UdpB_DType = dst->UdpB_DType; + src->UdpB_Class = dst->UdpB_Class; + src->UdpW_PixelLength = dst->UdpW_PixelLength; + src->UdpL_PxlStride = dst->UdpL_PxlStride; + src->UdpL_ScnStride = src->UdpL_PxlStride * in->UdpL_PxlPerScn; + src->UdpL_ArSize = src->UdpL_ScnStride * in->UdpL_ScnCnt; + src->UdpA_Base = 0; + + status = DdxConvert_( in, src, XieK_MoveMode ); + if( status != Success ) + { + DdxFree_(src); + src = (UdpPtr) status; + } + return( src ); +} /* end _CvtSrc */ +/* end module SmiRotate.c */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiRotate.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiRotate.h new file mode 100644 index 0000000..c6ac2f9 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiRotate.h @@ -0,0 +1,128 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the ROTATE pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.1 +** RISC ULTRIX V3.1 +** +** AUTHOR(S): +** +** Gary Grebus +** +** CREATION DATE: +** +** Fri Mar 2 11:34:55 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMIROTATE +#define _SMIROTATE + +/* +** Include files +*/ +#include + + /* + ** Function reference + */ +int SmiRotate(); +int SmiCreateRotate(); + +/* +** Structure definitions and Typedefs +*/ + +/* +** Rotate pipeline context block. +*/ +typedef struct _RotatePipeCtx { + PipeElementCommonPart common; + struct _RotatePart { + PipeSinkPtr src; + PipeSinkPtr dst; + double angle; + PipeDrainPtr srcdrn; + unsigned long fill[XieK_MaxComponents]; /* Fill values */ + } RotatePart; +} RotatePipeCtx, *RotatePipeCtxPtr; + +/* +** MACRO definitions +*/ + +/* +** Pipeline context, Rotate part, access MACROs +*/ +#define RotSrcDrn_(ctx) (((RotatePipeCtxPtr)(ctx))->RotatePart.srcdrn) +#define RotAngle_(ctx) (((RotatePipeCtxPtr)(ctx))->RotatePart.angle) +#define RotFill_(ctx,i) (((RotatePipeCtxPtr)(ctx))->RotatePart.fill[i]) + +/* +** Rotate Parameters +*/ +#define RotSrcSnk_(ctx) (((RotatePipeCtxPtr)(ctx))->RotatePart.src) +#define RotDstSnk_(ctx) (((RotatePipeCtxPtr)(ctx))->RotatePart.dst) + +#endif +/* _SMIROTATE */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiScale.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiScale.c new file mode 100644 index 0000000..4ffb1c5 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiScale.c @@ -0,0 +1,995 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains the support for the scale pipeline element. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** +** AUTHOR(S): +** +** John Weber +** Rich Hennessy ( 16 bit support ) +** +** CREATION DATE: +** +** March 25, 1989 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ + +/* +** Include files +*/ +#include + +#include "SmiScale.h" + +/* +** Table of contents +*/ +int SmiScale(); +int SmiCreateScale(); + +static int _ScaleInitialize(); +static int _ScaleActivate(); +static int _ScaleDestroy(); + +static ScaleHorzPtr _ScaleHorizontal(); +static ScaleVertPtr _ScaleVertical(); + +static int _ScaleVerticalUp(); +static int _ScaleVerticalDown(); + +static int _ScaleHorizontalNone(); + +static int _ScaleHorizontalDownBits(); +static int _ScaleHorizontalDownBytes(); +static int _ScaleHorizontalDownFloats(); +static int _ScaleHorizontalDownWords(); + +static int _ScaleHorizontalUpBits(); +static int _ScaleHorizontalUpBytes(); +static int _ScaleHorizontalUpFloats(); +static int _ScaleHorizontalUpWords(); + +static UdpPtr _ChkUdp(); + + +/* +** MACRO definitions +*/ + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* +** Local Storage +*/ + /* + ** Scale Element Vector + */ +static PipeElementVector ScalePipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeScaleElement, /* Structure subtype */ + sizeof(ScalePipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _ScaleInitialize, /* Initialize entry */ + _ScaleActivate, /* Activate entry */ + NULL, /* Flush entry */ + _ScaleDestroy, /* Destroy entry */ + NULL /* Abort entry */ + }; + +/***************************************************************************** +** SmiCreateScale +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the SCALE pipeline element +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiCreateScale( pipe, srcsnk, dstsnk ) + Pipe pipe; + PipeSinkPtr srcsnk; + PipeSinkPtr dstsnk; +{ + ScalePipeCtxPtr ctx = (ScalePipeCtxPtr) + DdxCreatePipeCtx_( pipe, &ScalePipeElement, FALSE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + + /* + ** Copy parameters into context record + */ + SclSrcSnk_(ctx) = srcsnk; + SclDstSnk_(ctx) = dstsnk; + /* + ** Create a drain on the source sink to read all components. + */ + SclSrcDrn_(ctx) = DdxRmCreateDrain_( srcsnk, -1 ); + if( !IsPointer_(SclSrcDrn_(ctx)) ) return( (int) SclSrcDrn_(ctx) ); + /* + ** Calculate scale factors + */ + SclXScl_(ctx) = (double) SnkWidth_(dstsnk,0) + / (double) SnkWidth_(srcsnk,0); + SclYScl_(ctx) = (double) SnkHeight_(dstsnk,0) + / (double) SnkHeight_(srcsnk,0); + /* + ** Set input and output quantums based on scale factors + */ + DdxRmSetQuantum_( SclSrcDrn_(ctx), + (int)(SclYScl_(ctx) < 1.0 ? 1.0 / SclYScl_(ctx) : 1.0) ); + DdxRmSetQuantum_( dstsnk, 1 ); + /* + ** Set input and output data types. + ** Assume byte for output, but we might choose float later. + */ + DdxRmSetDType_( SclSrcDrn_(ctx), UdpK_DTypeUndefined, DtM_Any ); + DdxRmSetDType_( SclDstSnk_(ctx), UdpK_DTypeUndefined, DtM_Any ); + + return( Success ); +} /* end SmiCreateScale */ + +/***************************************************************************** +** _ScaleInitialize +** +** FUNCTIONAL DESCRIPTION: +** +** This function initializes the SCALE pipeline element +** +** FORMAL PARAMETERS: +** +** ctx - scale pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleInitialize(ctx) +ScalePipeCtxPtr ctx; +{ + int dtype, status; + + /* + ** Initialize input drain. + */ + status = DdxRmInitializePort_( CtxHead_(ctx), SclSrcDrn_(ctx) ); + if( status != Success ) return( status ); + CtxInp_(ctx) = SclSrcDrn_(ctx); + + /* + ** Initialize output sink. + */ + dtype = DdxRmGetDType_( SclSrcDrn_(ctx) ); + DdxRmSetDType_( SclDstSnk_(ctx), dtype, 1<= DatY1_(src) && sy <= DatY2_(src) ) + { + dst = DdxRmAllocData_(SclDstSnk_(ctx), idx, SclDstScn_(ctx,idx), 1); + status = (int) dst; + if( !IsPointer_(dst) ) continue; + + status = (*SclHrzRou_(ctx))( DatUdpPtr_(src), + DatUdpPtr_(dst), + SclXScl_(ctx), + SclYScl_(ctx)); + + for( sy = ++SclDstScn_(ctx,idx) / SclYScl_(ctx); + status == Success && sy >= DatY1_(src) && sy <= DatY2_(src) + && SclDstScn_(ctx,idx) < SnkHeight_(SclDstSnk_(ctx),idx); + sy = ++SclDstScn_(ctx,idx) / SclYScl_(ctx) ) + { /* + ** Hand out reference copies to do vertical scale-up. + */ + copy = DdxRmAllocRefDesc_( dst, DatY1_(dst), 1 ); + if( IsPointer_(copy) ) + { + status = DdxRmPutData_( SclDstSnk_(ctx), dst ); + dst = copy; + DatY1_(dst)++; + DatY2_(dst)++; + } + else + status = (int) copy; + } + if( status != Success ) continue; + + status = DdxRmPutData_( SclDstSnk_(ctx), dst ); + dst = NULL; + } + } + return( status ); +} + +/***************************************************************************** +** _ScaleDestroy +** +** FUNCTIONAL DESCRIPTION: +** +** This routine deallocates all resources allocated by the scale +** pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - scale pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _ScaleDestroy(ctx) +ScalePipeCtxPtr ctx; +{ + SclSrcDrn_(ctx) = DdxRmDestroyDrain_( SclSrcDrn_(ctx) ); + + return( Success ); +} + +/***************************************************************************** +** SmiScale +** +** FUNCTIONAL DESCRIPTION: +** +** +** FORMAL PARAMETERS: +** +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiScale(srcudp,dstudp) +UdpPtr srcudp; +UdpPtr dstudp; +{ + UdpPtr dst; + double xscale; + double yscale; + int (*horizontal_scale)(); + int status = Success; + + if( dstudp->UdpA_Base == NULL ) + { /* + ** Allocate the destination image array + */ + dstudp->UdpA_Base = DdxMallocBits_( dstudp->UdpL_ArSize ); + if( dstudp->UdpA_Base == NULL ) return( BadAlloc ); + } + + /* + ** Calculate horizontal and vertical scale factors. + */ + xscale = (double) dstudp->UdpL_PxlPerScn / (double) srcudp->UdpL_PxlPerScn; + yscale = (double) dstudp->UdpL_ScnCnt / (double) srcudp->UdpL_ScnCnt; + /* + ** Determine the proper horizontal scale routine to call based + ** on source data type and scale factors. + */ + horizontal_scale = _ScaleHorizontal( xscale, srcudp->UdpB_DType ); + if( !IsPointer_(horizontal_scale) ) return( (int) horizontal_scale ); + + /* + ** If destination is not a supported type, create an intermediate + ** image. + */ + dst = _ChkUdp(srcudp, dstudp); + if( !IsPointer_(dst) ) return( (int) dst ); + + /* + ** Now, call the proper routine based on scale factors. + */ + status = (*_ScaleVertical(yscale)) + (srcudp, dst, xscale, yscale, horizontal_scale); + /* + ** If a temporary image was necessary, convert to the desired data type + ** and delete the temporary. + */ + if( dst != dstudp ) + { + if( status == Success ) + status = DdxConvert_( dst, dstudp, XieK_MoveMode ); + if( IsPointer_(dst->UdpA_Base) ) + DdxFreeBits_(dst->UdpA_Base); + DdxFree_(dst); + } + return( status ); +} + + +static ScaleHorzPtr _ScaleHorizontal(xscale, dtype) +double xscale; +char dtype; +{ + if( xscale < 1.0 ) + /* + ** Scaling down + */ + switch (dtype) + { + case UdpK_DTypeBU: + return( _ScaleHorizontalDownBytes ); + + case UdpK_DTypeF: + return( _ScaleHorizontalDownFloats ); + + case UdpK_DTypeVU: + case UdpK_DTypeV: + return( _ScaleHorizontalDownBits ); + + case UdpK_DTypeWU: + return( _ScaleHorizontalDownWords ); + + case UdpK_DTypeUndefined: + case UdpK_DTypeLU: + default: + return( (ScaleHorzPtr) BadValue ); + } + else if( xscale > 1.0 ) + /* + ** Scaling up + */ + switch (dtype) + { + case UdpK_DTypeBU: + return( _ScaleHorizontalUpBytes ); + + case UdpK_DTypeF: + return( _ScaleHorizontalUpFloats ); + + case UdpK_DTypeVU: + case UdpK_DTypeV: + return( _ScaleHorizontalUpBits ); + + case UdpK_DTypeWU: + return( _ScaleHorizontalUpWords ); + + case UdpK_DTypeLU: + case UdpK_DTypeUndefined: + default: + return( (ScaleHorzPtr) BadValue ); + } + else + /* + ** No scale + */ + return( _ScaleHorizontalNone ); +} + +static ScaleVertPtr _ScaleVertical(yscale) +double yscale; +{ + if( yscale <= 1.0 ) + /* + ** Scaling down or none, return pointer to scale down routine. + */ + return( _ScaleVerticalDown ); + + else + /* + ** Scaling up, return pointer to scale up routine. + */ + return( _ScaleVerticalUp ); +} + +static int _ScaleVerticalUp( srcudp, dstudp, xscale, yscale, hrz_scale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +int (*hrz_scale)(); +{ + UdpRec dscn; /* This is a UDP that will describe a */ + /* single destination scanline */ + int sx, sy, dx, dy, status = Success; + + dscn = *dstudp; + /* + ** Set up a temporary UDP to describe a single scanline + */ + dscn.UdpL_ScnCnt = 1; + dscn.UdpL_Y1 = dscn.UdpL_Y2 = dstudp->UdpL_Y1; + + while( dscn.UdpL_Y1 <= dstudp->UdpL_Y2 ) + { + sy = (int)((double)dscn.UdpL_Y1 / yscale ); + + status = (*hrz_scale)(srcudp,&dscn,xscale,yscale); + if( status != Success ) + break; + + dscn.UdpL_Y1 = ++dscn.UdpL_Y2; + dscn.UdpL_Pos += dscn.UdpL_ScnStride; + + while( (int)((double)dscn.UdpL_Y1 / yscale ) == sy + && dscn.UdpL_Y1 <= dstudp->UdpL_Y2 ) + { + memcpy( dscn.UdpA_Base + dscn.UdpL_Pos / 8, + dscn.UdpA_Base+(dscn.UdpL_Pos-dscn.UdpL_ScnStride) / 8, + dscn.UdpL_ScnStride / 8 ); + dscn.UdpL_Y1 = ++dscn.UdpL_Y2; + dscn.UdpL_Pos += dscn.UdpL_ScnStride; + } + } + return( status ); +} + +static int _ScaleVerticalDown( srcudp, dstudp, xscale, yscale, hrz_scale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +int (*hrz_scale)(); +{ + UdpRec dscn; /* This is a UDP that will describe a */ + /* single destination scanline */ + int sx, sy, dx, dy, status = Success; + + dscn = *dstudp; + /* + ** Set up a temporary UDP to describe a single scanline + */ + dscn.UdpL_ScnCnt = 1; + dscn.UdpL_Y1 = dscn.UdpL_Y2 = dstudp->UdpL_Y1; + + while( dscn.UdpL_Y1 <= dstudp->UdpL_Y2 ) + { + status = (*hrz_scale)(srcudp,&dscn,xscale,yscale); + if( status != Success ) + break; + dscn.UdpL_Y1 = ++dscn.UdpL_Y2; + dscn.UdpL_Pos += dscn.UdpL_ScnStride; + } + return( status ); +} + +static int _ScaleHorizontalNone( srcudp, dstudp, xscale, yscale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +{ + return( DdxCopy_( srcudp, dstudp, + dstudp->UdpL_X1, (int)((double)dstudp->UdpL_Y1 / yscale ) + - srcudp->UdpL_Y1, + dstudp->UdpL_X1, dstudp->UdpL_Y1, + dstudp->UdpL_PxlPerScn, dstudp->UdpL_ScnCnt ) ); +} + +static int _ScaleHorizontalDownBits( srcudp, dstudp, xscale, yscale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +{ + int s_cmask, d_cmask, value; + int s_scan_offset; + int s_offset; + + int d_scan_offset; + int d_offset; + + int sx, sy; + int dx, dy; + + s_cmask = srcudp->UdpL_Levels - 1; + d_cmask = dstudp->UdpL_Levels - 1; + d_scan_offset = dstudp->UdpL_Pos; + + for( dy = dstudp->UdpL_Y1; dy <= dstudp->UdpL_Y2; dy++ ) + { + sy = (int)((double)dy / yscale ); + + s_scan_offset = srcudp->UdpL_Pos + + ((sy - srcudp->UdpL_Y1) * srcudp->UdpL_ScnStride); + d_offset = d_scan_offset; + + for( dx = dstudp->UdpL_X1; dx <= dstudp->UdpL_X2; dx++ ) + { + sx = (int)((double)dx / xscale ); + + s_offset = s_scan_offset + (srcudp->UdpL_PxlStride * sx); + + value = GET_VALUE_(srcudp->UdpA_Base,s_offset,s_cmask); + PUT_VALUE_(dstudp->UdpA_Base, d_offset, value, d_cmask); + + d_offset += dstudp->UdpL_PxlStride; + } + d_scan_offset += dstudp->UdpL_ScnStride; + } + return( Success ); +} + + +static int _ScaleHorizontalDownBytes( srcudp, dstudp, xscale, yscale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +{ + int s_scan_offset; + int s_offset; + + int d_scan_offset; + int d_offset; + + int sx, sy; + int dx, dy; + + d_scan_offset = dstudp->UdpL_Pos; + + for( dy = dstudp->UdpL_Y1; dy <= dstudp->UdpL_Y2; dy++ ) + { + sy = (int)((double)dy / yscale ); + + s_scan_offset = srcudp->UdpL_Pos + + ((sy - srcudp->UdpL_Y1) * srcudp->UdpL_ScnStride); + d_offset = d_scan_offset; + + for( dx = dstudp->UdpL_X1; dx <= dstudp->UdpL_X2; dx++ ) + { + sx = (int)((double)dx / xscale ); + + s_offset = s_scan_offset + (srcudp->UdpL_PxlStride * sx); + + *(unsigned char *)(dstudp->UdpA_Base + d_offset / 8) = + *(unsigned char *)(srcudp->UdpA_Base + s_offset/8); + + d_offset += dstudp->UdpL_PxlStride; + } + d_scan_offset += dstudp->UdpL_ScnStride; + } + return( Success ); +} + + +static int _ScaleHorizontalDownFloats( srcudp, dstudp, xscale, yscale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +{ + int s_scan_offset; + int s_offset; + + int d_scan_offset; + int d_offset; + + int sx, sy; + int dx, dy; + + d_scan_offset = dstudp->UdpL_Pos; + + for( dy = dstudp->UdpL_Y1; dy <= dstudp->UdpL_Y2; dy++ ) + { + sy = (int)((double)dy / yscale ); + + s_scan_offset = srcudp->UdpL_Pos + + ((sy - srcudp->UdpL_Y1) * srcudp->UdpL_ScnStride); + d_offset = d_scan_offset; + + for( dx = dstudp->UdpL_X1; dx <= dstudp->UdpL_X2; dx++ ) + { + sx = (int)((double)dx / xscale ); + + s_offset = s_scan_offset + (srcudp->UdpL_PxlStride * sx); + + *(float *)(dstudp->UdpA_Base + d_offset / 8) = + *(float *)(srcudp->UdpA_Base + s_offset/8); + + d_offset += dstudp->UdpL_PxlStride; + } + d_scan_offset += dstudp->UdpL_ScnStride; + } + return( Success ); +} + + +static int _ScaleHorizontalDownWords( srcudp, dstudp, xscale, yscale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +{ + int s_scan_offset; + int s_offset; + + int d_scan_offset; + int d_offset; + + int sx, sy; + int dx, dy; + + d_scan_offset = dstudp->UdpL_Pos; + + for( dy = dstudp->UdpL_Y1; dy <= dstudp->UdpL_Y2; dy++ ) + { + sy = (int)((double)dy / yscale ); + + s_scan_offset = srcudp->UdpL_Pos + + ((sy - srcudp->UdpL_Y1) * srcudp->UdpL_ScnStride); + d_offset = d_scan_offset; + + for( dx = dstudp->UdpL_X1; dx <= dstudp->UdpL_X2; dx++ ) + { + sx = (int)((double)dx / xscale ); + + s_offset = s_scan_offset + (srcudp->UdpL_PxlStride * sx); + + *(unsigned short *)(dstudp->UdpA_Base + d_offset / 8) = + *(unsigned short *)(srcudp->UdpA_Base + s_offset/8); + + d_offset += dstudp->UdpL_PxlStride; + } + d_scan_offset += dstudp->UdpL_ScnStride; + } + return( Success ); +} + + +static int _ScaleHorizontalUpBits( srcudp, dstudp, xscale, yscale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +{ + int s_cmask, d_cmask, value; + int s_scan_offset; + int s_offset; + + int d_scan_offset; + int d_offset; + + int sx, sy; + int dx, dy; + + s_cmask = srcudp->UdpL_Levels - 1; + d_cmask = dstudp->UdpL_Levels - 1; + d_scan_offset = dstudp->UdpL_Pos; + + for( dy = dstudp->UdpL_Y1; dy <= dstudp->UdpL_Y2; dy++ ) + { + sy = (int)((double)dy / yscale ); + + s_scan_offset = srcudp->UdpL_Pos + + ((sy - srcudp->UdpL_Y1) * srcudp->UdpL_ScnStride); + d_offset = d_scan_offset; + + for( dx = dstudp->UdpL_X1; dx <= dstudp->UdpL_X2; ) + { + sx = (int)((double)dx / xscale ); + + s_offset = s_scan_offset + (srcudp->UdpL_PxlStride * sx); + + value = GET_VALUE_(srcudp->UdpA_Base,s_offset,s_cmask); + + do { + PUT_VALUE_(dstudp->UdpA_Base, d_offset, value, d_cmask); + dx++; + d_offset += dstudp->UdpL_PxlStride; + } + while( sx == (int)((double)dx / xscale ) && dx <= dstudp->UdpL_X2 ); + } + d_scan_offset += dstudp->UdpL_ScnStride; + } + return( Success ); +} + + +static int _ScaleHorizontalUpBytes( srcudp, dstudp, xscale, yscale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +{ + int s_scan_offset; + int s_offset; + + int d_scan_offset; + int d_offset; + + int sx, sy; + int dx, dy; + + unsigned char value; + + d_scan_offset = dstudp->UdpL_Pos; + + for( dy = dstudp->UdpL_Y1; dy <= dstudp->UdpL_Y2; dy++ ) + { + sy = (int)((double)dy / yscale ); + + s_scan_offset = srcudp->UdpL_Pos + + ((sy - srcudp->UdpL_Y1) * srcudp->UdpL_ScnStride); + d_offset = d_scan_offset; + + for( dx = dstudp->UdpL_X1; dx <= dstudp->UdpL_X2; ) + { + sx = (int)((double)dx / xscale ); + + s_offset = s_scan_offset + (srcudp->UdpL_PxlStride * sx); + + value = *(unsigned char *) (srcudp->UdpA_Base + s_offset/8); + + do { + *(unsigned char *)(dstudp->UdpA_Base + d_offset / 8) = value; + dx++; + d_offset += dstudp->UdpL_PxlStride; + } + while( sx == (int)((double)dx / xscale ) && dx <= dstudp->UdpL_X2 ); + } + d_scan_offset += dstudp->UdpL_ScnStride; + } + return( Success ); +} + + +static int _ScaleHorizontalUpFloats( srcudp, dstudp, xscale, yscale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +{ + int s_scan_offset; + int s_offset; + + int d_scan_offset; + int d_offset; + + int sx, sy; + int dx, dy; + + float value; + + d_scan_offset = dstudp->UdpL_Pos; + + for( dy = dstudp->UdpL_Y1; dy <= dstudp->UdpL_Y2; dy++ ) + { + sy = (int)((double)dy / yscale ); + + s_scan_offset = srcudp->UdpL_Pos + + ((sy - srcudp->UdpL_Y1) * srcudp->UdpL_ScnStride); + d_offset = d_scan_offset; + + for( dx = dstudp->UdpL_X1; dx <= dstudp->UdpL_X2; ) + { + sx = (int)((double)dx / xscale ); + + s_offset = s_scan_offset + (srcudp->UdpL_PxlStride * sx); + + value = *(float *) (srcudp->UdpA_Base + s_offset/8); + + do { + *(float *)(dstudp->UdpA_Base + d_offset / 8) = value; + dx++; + d_offset += dstudp->UdpL_PxlStride; + } + while( sx == (int)((double)dx / xscale ) && dx <= dstudp->UdpL_X2 ); + } + d_scan_offset += dstudp->UdpL_ScnStride; + } + return( Success ); +} + + +static int _ScaleHorizontalUpWords( srcudp, dstudp, xscale, yscale ) +UdpPtr srcudp; +UdpPtr dstudp; +double xscale; +double yscale; +{ + int s_scan_offset; + int s_offset; + + int d_scan_offset; + int d_offset; + + int sx, sy; + int dx, dy; + + unsigned short value; + + d_scan_offset = dstudp->UdpL_Pos; + + for( dy = dstudp->UdpL_Y1; dy <= dstudp->UdpL_Y2; dy++ ) + { + sy = (int)((double)dy / yscale ); + + s_scan_offset = srcudp->UdpL_Pos + + ((sy - srcudp->UdpL_Y1) * srcudp->UdpL_ScnStride); + d_offset = d_scan_offset; + + for( dx = dstudp->UdpL_X1; dx <= dstudp->UdpL_X2; ) + { + sx = (int)((double)dx / xscale ); + + s_offset = s_scan_offset + (srcudp->UdpL_PxlStride * sx); + + value = *(unsigned short *) (srcudp->UdpA_Base + s_offset/8); + + do { + *(unsigned short *)(dstudp->UdpA_Base + d_offset / 8) = value; + dx++; + d_offset += dstudp->UdpL_PxlStride; + } + while( sx == (int)((double)dx / xscale ) && dx <= dstudp->UdpL_X2 ); + } + d_scan_offset += dstudp->UdpL_ScnStride; + } + return( Success ); +} + + +/****************************************************************************** +** _ChkUdp +** +** FUNCTIONAL DESCRIPTION: +** +** Check dst udp and convert to one of our supported types if needed. +** +** FORMAL PARAMETERS: +** +** in - Point to input udp, which drives the type selection. +** out - Pointer to out udp +** +******************************************************************************/ +static UdpPtr _ChkUdp( in, out ) + UdpPtr in; + UdpPtr out; +{ + int itype, otype; + UdpPtr dst = out; + + itype = DdxGetTyp_( in ); + otype = DdxGetTyp_( out ); + + if( itype != otype ) + { + dst = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( dst == NULL ) return( (UdpPtr) BadAlloc ); + + *dst = *out; + + switch( itype ) + { + case XieK_AF: + dst->UdpB_DType = UdpK_DTypeF; + dst->UdpW_PixelLength = sizeof(float) * 8; + break; + case XieK_AWU: + dst->UdpB_DType = UdpK_DTypeWU; + dst->UdpW_PixelLength = sizeof(short) * 8; + break; + case XieK_ABU: + dst->UdpB_DType = UdpK_DTypeBU; + dst->UdpW_PixelLength = sizeof(char) * 8; + break; + default: + dst->UdpB_DType = UdpK_DTypeVU; + dst->UdpW_PixelLength = 1; + break; + } + + dst->UdpB_Class = dst->UdpB_DType == UdpK_DTypeVU ? UdpK_ClassUBA + : UdpK_ClassA; + dst->UdpL_PxlStride = dst->UdpW_PixelLength; + dst->UdpL_ScnStride = dst->UdpL_PxlStride*out->UdpL_PxlPerScn; + dst->UdpL_ArSize = dst->UdpL_ScnStride*out->UdpL_ScnCnt; + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + + if( dst->UdpA_Base == NULL ) + dst = (UdpPtr) DdxFree_( dst ); + } + return( dst ); +} /* end _ChkUdp */ +/* end module SmiScale */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiScale.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiScale.h new file mode 100644 index 0000000..9f4fdff --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiScale.h @@ -0,0 +1,125 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the SCALE pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** +** AUTHOR(S): +** +** John Weber +** +** CREATION DATE: +** +** March 25, 1989 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMISCALE +#define _SMISCALE + +/* +** Include files +*/ +#include + + /* + ** Function reference + */ +int SmiScale(); +int SmiCreateScale(); + +/* +** Structure definitions and Typedefs +*/ +typedef int (*ScaleHorzPtr)(); +typedef int (*ScaleVertPtr)(); + +typedef struct _ScalePipeCtx { + PipeElementCommonPart common; + struct _ScalePart { + PipeSinkPtr srcsnk; + PipeSinkPtr dstsnk; + PipeDrainPtr srcdrn; + long int dstscn[XieK_MaxComponents]; + double x_scale; + double y_scale; + ScaleHorzPtr horizontal; + } ScalePart; +} ScalePipeCtx, *ScalePipeCtxPtr; + +/* +** MACRO definitions +*/ + /* + ** Pipeline context SCALE access MACROs + */ +#define SclSrcSnk_(ctx) (((ScalePipeCtxPtr)(ctx))->ScalePart.srcsnk) +#define SclDstSnk_(ctx) (((ScalePipeCtxPtr)(ctx))->ScalePart.dstsnk) +#define SclSrcDrn_(ctx) (((ScalePipeCtxPtr)(ctx))->ScalePart.srcdrn) +#define SclDstScn_(ctx,i) (((ScalePipeCtxPtr)(ctx))->ScalePart.dstscn[(i)]) +#define SclXScl_(ctx) (((ScalePipeCtxPtr)(ctx))->ScalePart.x_scale) +#define SclYScl_(ctx) (((ScalePipeCtxPtr)(ctx))->ScalePart.y_scale) +#define SclHrzRou_(ctx) (((ScalePipeCtxPtr)(ctx))->ScalePart.horizontal) + +#endif +/* _SMISCALE */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiStats.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiStats.c new file mode 100644 index 0000000..384068b --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiStats.c @@ -0,0 +1,3208 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains routines for computing image data statistics. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** John Weber +** +** CREATION DATE: +** +** May 15, 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ + +/* +** Include files +*/ +#include +#include /* X definitions */ +#include /* XIE device dependant definitions */ +#include /* UDP structure definitions */ +#ifndef VXT +#include +#else +#include +#endif + +/* +** Table of contents +*/ + +/* +** Point statistics routines. +*/ + +int SmiStatsPoint(); + +static int PointStatsByte(); +static int PointStatsWord(); +static int PointStatsLong(); +static int PointStatsFloat(); +static int PointStatsBits(); +/* +** Area statistics routines. +*/ +int SmiStatsArea(); + +static int _AreaErr(); + +static int _AreaMinB(); +static int _AreaMinW(); +static int _AreaMinL(); +static int _AreaMinF(); +static int _AreaMinV(); + +static int _AreaMaxB(); +static int _AreaMaxW(); +static int _AreaMaxL(); +static int _AreaMaxF(); +static int _AreaMaxV(); + +static int _AreaMeanB(); +static int _AreaMeanW(); +static int _AreaMeanL(); +static int _AreaMeanF(); +static int _AreaMeanV(); + +static int _AreaStdDevB(); +static int _AreaStdDevW(); +static int _AreaStdDevL(); +static int _AreaStdDevF(); +static int _AreaStdDevV(); + +static int _AreaVarB(); +static int _AreaVarW(); +static int _AreaVarL(); +static int _AreaVarF(); +static int _AreaVarV(); + +static int _AreaCppMinB(); +static int _AreaCppMinW(); +static int _AreaCppMinL(); +static int _AreaCppMinF(); +static int _AreaCppMinV(); + +static int _AreaCppMaxB(); +static int _AreaCppMaxW(); +static int _AreaCppMaxL(); +static int _AreaCppMaxF(); +static int _AreaCppMaxV(); + +static int _AreaCppMeanB(); +static int _AreaCppMeanW(); +static int _AreaCppMeanL(); +static int _AreaCppMeanF(); +static int _AreaCppMeanV(); + +static int _AreaCppStdDevB(); +static int _AreaCppStdDevW(); +static int _AreaCppStdDevL(); +static int _AreaCppStdDevF(); +static int _AreaCppStdDevV(); + +static int _AreaCppVarB(); +static int _AreaCppVarW(); +static int _AreaCppVarL(); +static int _AreaCppVarF(); +static int _AreaCppVarV(); + +/* +** MACRO definitions +*/ + +/* +** Equated Symbols +*/ +#define XieK_StypeMin 0 +#define XieK_StypeMinimum 1 +#define XieK_StypeMaximum 2 +#define XieK_StypeMean 3 +#define XieK_StypeStdDev 4 +#define XieK_StypeVariance 5 +#define XieK_StypeMax 6 +/* +** External References +*/ + +/* +** Local Storage +*/ + /* + ** These tables describe routines to call for statistics based on source + ** data type, selector, and if a CPP is required. + */ +static int (*area_stats_table[UdpK_DTypeMax+1][XieK_StypeMax])() = { + _AreaErr, _AreaErr, _AreaErr, _AreaErr, _AreaErr, _AreaErr, + _AreaErr, _AreaMinB, _AreaMaxB, _AreaMeanB, _AreaStdDevB, _AreaVarB, + _AreaErr, _AreaMinW, _AreaMaxW, _AreaMeanW, _AreaStdDevW, _AreaVarW, + _AreaErr, _AreaMinL, _AreaMaxL, _AreaMeanL, _AreaStdDevL, _AreaVarL, + _AreaErr, _AreaMinF, _AreaMaxF, _AreaMeanF, _AreaStdDevF, _AreaVarF, + _AreaErr, _AreaMinV, _AreaMaxV, _AreaMeanV, _AreaStdDevV, _AreaVarV, + _AreaErr, _AreaMinV, _AreaMaxV, _AreaMeanV, _AreaStdDevV, _AreaVarV +}; + +static int (*area_stats_cpp_table[UdpK_DTypeMax+1][XieK_StypeMax])() = { + _AreaErr, _AreaErr, _AreaErr, _AreaErr, _AreaErr, _AreaErr, + _AreaErr, _AreaCppMinB, _AreaCppMaxB, _AreaCppMeanB, _AreaCppStdDevB, _AreaCppVarB, + _AreaErr, _AreaCppMinW, _AreaCppMaxW, _AreaCppMeanW, _AreaCppStdDevW, _AreaCppVarW, + _AreaErr, _AreaCppMinL, _AreaCppMaxL, _AreaCppMeanL, _AreaCppStdDevL, _AreaCppVarL, + _AreaErr, _AreaCppMinF, _AreaCppMaxF, _AreaCppMeanF, _AreaCppStdDevF, _AreaCppVarF, + _AreaErr, _AreaCppMinV, _AreaCppMaxV, _AreaCppMeanV, _AreaCppStdDevV, _AreaCppVarV, + _AreaErr, _AreaCppMinV, _AreaCppMaxV, _AreaCppMeanV, _AreaCppStdDevV, _AreaCppVarV +}; + +/***************************************************************************** +** SmiStatsPoint +** +** FUNCTIONAL DESCRIPTION: +** +** This routine returns statistics about a rectangular region surrounding +** a pixel location. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor. +** x - X location of pixel. +** y - Y location of pixel. +** width - width of region. +** height - height of region. +** value - returned value of pixel at (x,y). +** min - returned minimum pixel value in region. +** max - returned maxumum pixel value in region. +** mean - returned mean pixel value in region. +** stddev - returned standard deviation of pixel values in region. +** var - returned variance of pixel values in region. +** +** FUNCTION VALUE: +** +** status, returns Success, or error. +** +*****************************************************************************/ +int SmiStatsPoint(src,x,y,width,height,value,min,max,mean,stddev,var) +UdpPtr src; /* source data descriptor */ +int x; /* X location of pixel */ +int y; /* Y location of pixel */ +int width; /* width of region */ +int height; /* height of region */ +double *value; /* returned value of pixel at (x,y) */ +double *min; /* returned minimum pixel value in region */ +double *max; /* returned maxumum pixel value in region */ +double *mean; /* returned mean pixel value in region */ +double *stddev; /* returned standard deviation of pixel values in */ + /* region */ +double *var; /* returned variance of pixel values in region */ +{ + UdpRec srcudp; + int valoff; + int status; + /* + ** Initial X,Y must be inside the source image. + */ + if (x < src->UdpL_X1 || x > src->UdpL_X2 || + y < src->UdpL_Y1 || y > src->UdpL_Y2) + return( BadValue ); + /* + ** Determine the spatial extent over which the image statistics + ** will be calculated. If the corners of the region go out of range of + ** the source, they are reset to the nearest edge. + */ + srcudp = *src; + + srcudp.UdpL_X1 = x - width / 2; + srcudp.UdpL_Y1 = y - height / 2; + srcudp.UdpL_X2 = srcudp.UdpL_X1 + width; + srcudp.UdpL_Y2 = srcudp.UdpL_Y1 + height; + + if (srcudp.UdpL_X1 < src->UdpL_X1) srcudp.UdpL_X1 = src->UdpL_X1; + if (srcudp.UdpL_Y1 < src->UdpL_Y1) srcudp.UdpL_Y1 = src->UdpL_Y1; + if (srcudp.UdpL_X2 > src->UdpL_X2) srcudp.UdpL_X2 = src->UdpL_X2; + if (srcudp.UdpL_Y2 > src->UdpL_Y2) srcudp.UdpL_Y2 = src->UdpL_Y2; + + srcudp.UdpL_PxlPerScn = srcudp.UdpL_X2 - srcudp.UdpL_X1 + 1; + srcudp.UdpL_ScnCnt = srcudp.UdpL_Y2 - srcudp.UdpL_Y1 + 1; + + srcudp.UdpL_Pos += (srcudp.UdpL_X1 - src->UdpL_X1) * src->UdpL_PxlStride + + (srcudp.UdpL_Y1 - src->UdpL_Y1) * src->UdpL_ScnStride; + /* + ** Now, call calculation routine based on data type. + */ + valoff = srcudp.UdpL_Pos + (y - srcudp.UdpL_Y1) * srcudp.UdpL_ScnStride + + (x - srcudp.UdpL_X1) * srcudp.UdpL_PxlStride; + + switch (srcudp.UdpB_DType) + { + case UdpK_DTypeBU: + *value = *(unsigned char *)(srcudp.UdpA_Base + valoff / 8); + status = PointStatsByte(&srcudp,min,max,mean,var); + break; + case UdpK_DTypeWU: + *value = *(unsigned short *)(srcudp.UdpA_Base + valoff / 8); + status = PointStatsWord(&srcudp,min,max,mean,var); + break; + case UdpK_DTypeLU: + *value = *(unsigned char *)(srcudp.UdpA_Base + valoff / 8); + status = PointStatsLong(&srcudp,min,max,mean,var); + break; + case UdpK_DTypeF: + *value = *(unsigned char *)(srcudp.UdpA_Base + valoff / 8); + status = PointStatsFloat(&srcudp,min,max,mean,var); + break; + case UdpK_DTypeVU: + case UdpK_DTypeV: + *value = GET_VALUE_(srcudp.UdpA_Base, + valoff, + (1<UdpA_Base + src->UdpL_Pos / 8; + unsigned char *pel_ptr = scan_ptr; + int scnstride = src->UdpL_ScnStride / 8; + int pxlstride = src->UdpL_PxlStride / 8; + + unsigned char value; + + int count = src->UdpL_PxlPerScn * src->UdpL_ScnCnt; + unsigned char lclmin = *pel_ptr; + unsigned char lclmax = *pel_ptr; + + double sum = 0.0; + double sumsqr = 0.0; + /* + ** Do first pass to get min, max, and mean + */ + for (scan = src->UdpL_Y1; scan <= src->UdpL_Y2; scan++) + { + pel_ptr = scan_ptr; + for (pel = src->UdpL_X1; pel <= src->UdpL_X2; pel++) + { + value = *pel_ptr; + /* + ** Keep track of minimum and maximum values. + */ + if (value > lclmax) lclmax = value; + if (value < lclmin) lclmin = value; + /* + ** Keep runnning sum of samples and square of samples. + */ + sum += value; + sumsqr += value * value; + /* + ** Update source data pointer + */ + pel_ptr += pxlstride; + } + /* + ** Update source data pointer + */ + scan_ptr += scnstride; + } + /* + ** Return values. + */ + *min = lclmin; + *max = lclmax; + *mean = sum / (double)count; + *var = (sumsqr-((sum*sum)/(double)count))/(double)(count-1); + + return( Success ); +} + +/***************************************************************************** +** PointStatsWord +** +** FUNCTIONAL DESCRIPTION: +** +** This routine calculates point stats for a word UDP. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor. +** value - returned value of pixel at (x,y). +** min - returned minimum pixel value in region. +** max - returned maxumum pixel value in region. +** mean - returned mean pixel value in region. +** stddev - returned standard deviation of pixel values in region. +** var - returned variance of pixel values in region. +** +** FUNCTION VALUE: +** +** status, returns Success, or error. +** +*****************************************************************************/ +static int PointStatsWord(src,min,max,mean,var) +UdpPtr src; /* source data descriptor */ +double *min; /* returned minimum pixel value in region */ +double *max; /* returned maxumum pixel value in region */ +double *mean; /* returned mean pixel value in region */ +double *var; /* returned variance of pixel values in region */ +{ + int scan; + int pel; + + unsigned short *scan_ptr = + (unsigned short *)(src->UdpA_Base + src->UdpL_Pos / 8); + unsigned short *pel_ptr = scan_ptr; + int scnstride = src->UdpL_ScnStride / 16; + int pxlstride = src->UdpL_PxlStride / 16; + + unsigned short value; + unsigned short lclmin = *pel_ptr; + unsigned short lclmax = *pel_ptr; + int count = src->UdpL_PxlPerScn * src->UdpL_ScnCnt; + + double sum = 0.0; + double sumsqr = 0.0; + /* + ** Do first pass to get min, max, and mean + */ + for (scan = src->UdpL_Y1; scan <= src->UdpL_Y2; scan++) + { + pel_ptr = scan_ptr; + for (pel = src->UdpL_X1; pel <= src->UdpL_X2; pel++) + { + value = *pel_ptr; + /* + ** Keep track of minimum and maximum values. + */ + if (value > lclmax) lclmax = value; + if (value < lclmin) lclmin = value; + /* + ** Keep runnning sum. + */ + sum += value; + sumsqr += value * value; + /* + ** Update source data pointer + */ + pel_ptr += pxlstride; + } + /* + ** Update source data pointer + */ + scan_ptr += scnstride; + } + /* + ** Return values. + */ + *min = lclmin; + *max = lclmax; + *mean = sum / (double)count; + *var = (sumsqr-((sum*sum)/(double)count))/(double)(count-1); + + return( Success ); +} + +/***************************************************************************** +** PointStatsLong +** +** FUNCTIONAL DESCRIPTION: +** +** This routine calculates point stats for a long UDP. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor. +** value - returned value of pixel at (x,y). +** min - returned minimum pixel value in region. +** max - returned maxumum pixel value in region. +** mean - returned mean pixel value in region. +** stddev - returned standard deviation of pixel values in region. +** var - returned variance of pixel values in region. +** +** FUNCTION VALUE: +** +** status, returns Success, or error. +** +*****************************************************************************/ +static int PointStatsLong(src,min,max,mean,var) +UdpPtr src; /* source data descriptor */ +double *min; /* returned minimum pixel value in region */ +double *max; /* returned maxumum pixel value in region */ +double *mean; /* returned mean pixel value in region */ +double *var; /* returned variance of pixel values in region */ +{ + int scan; + int pel; + + unsigned long *scan_ptr = + (unsigned long *)(src->UdpA_Base + src->UdpL_Pos / 8); + unsigned long *pel_ptr = scan_ptr; + int scnstride = src->UdpL_ScnStride / 32; + int pxlstride = src->UdpL_PxlStride / 32; + + unsigned long value; + unsigned long lclmin = *pel_ptr; + unsigned long lclmax = *pel_ptr; + int count = src->UdpL_PxlPerScn * src->UdpL_ScnCnt; + + double sum = 0.0; + double sumsqr = 0.0; + /* + ** Do first pass to get min, max, and mean + */ + for (scan = src->UdpL_Y1; scan <= src->UdpL_Y2; scan++) + { + pel_ptr = scan_ptr; + for (pel = src->UdpL_X1; pel <= src->UdpL_X2; pel++) + { + value = *pel_ptr; + /* + ** Keep track of minimum and maximum values. + */ + if (value > lclmax) lclmax = value; + if (value < lclmin) lclmin = value; + /* + ** Keep runnning sum. + */ + sum += value; + sumsqr += value * value; + /* + ** Update source data pointer + */ + pel_ptr += pxlstride; + } + /* + ** Update source data pointer + */ + scan_ptr += scnstride; + } + /* + ** Return values. + */ + *min = lclmin; + *max = lclmax; + /* + ** MEAN : + ** _ N + ** x = 1/N * sum x + ** i=1 i + ** + */ + *mean = (double)sum / (double)count; + /* + ** VARIANCE : + ** 2 N N + ** s = 1 / (N-1) * ( sum x² - 1/N * (sum x )²) + ** i=1 i=1 i + */ + *var = (sumsqr-((sum*sum)/(double)count))/(double)(count-1); + + return( Success ); +} + +/***************************************************************************** +** PointStatsFloat +** +** FUNCTIONAL DESCRIPTION: +** +** This routine calculates point stats for a float UDP. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor. +** value - returned value of pixel at (x,y). +** min - returned minimum pixel value in region. +** max - returned maxumum pixel value in region. +** mean - returned mean pixel value in region. +** stddev - returned standard deviation of pixel values in region. +** var - returned variance of pixel values in region. +** +** FUNCTION VALUE: +** +** status, returns Success, or error. +** +*****************************************************************************/ +static int PointStatsFloat(src,min,max,mean,var) +UdpPtr src; /* source data descriptor */ +double *min; /* returned minimum pixel value in region */ +double *max; /* returned maxumum pixel value in region */ +double *mean; /* returned mean pixel value in region */ +double *var; /* returned variance of pixel values in region */ +{ + int scan; + int pel; + + float *scan_ptr = (float *)(src->UdpA_Base + src->UdpL_Pos / 8); + float *pel_ptr = scan_ptr; + int scnstride = src->UdpL_ScnStride / 32; + int pxlstride = src->UdpL_PxlStride / 32; + + float value; + float lclmin = *pel_ptr; + float lclmax = *pel_ptr; + int count = src->UdpL_PxlPerScn * src->UdpL_ScnCnt; + + double sum = 0.0; + double sumsqr = 0.0; + /* + ** Do first pass to get min, max, and mean + */ + for (scan = src->UdpL_Y1; scan <= src->UdpL_Y2; scan++) + { + pel_ptr = scan_ptr; + for (pel = src->UdpL_X1; pel <= src->UdpL_X2; pel++) + { + value = *pel_ptr; + /* + ** Keep track of minimum and maximum values. + */ + if (value > lclmax) lclmax = value; + if (value < lclmin) lclmin = value; + /* + ** Keep runnning sum. + */ + sum += value; + sumsqr += value * value; + /* + ** Update source data pointer + */ + pel_ptr += pxlstride; + } + /* + ** Update source data pointer + */ + scan_ptr += scnstride; + } + /* + ** Return values. + */ + *min = lclmin; + *max = lclmax; + *mean = sum / (double)count; + *var = (sumsqr-((sum*sum)/(double)count))/(double)(count-1); + + return( Success ); +} + +/***************************************************************************** +** PointStatsBits +** +** FUNCTIONAL DESCRIPTION: +** +** This routine calculates point stats for a bits UDP. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor. +** value - returned value of pixel at (x,y). +** min - returned minimum pixel value in region. +** max - returned maxumum pixel value in region. +** mean - returned mean pixel value in region. +** stddev - returned standard deviation of pixel values in region. +** var - returned variance of pixel values in region. +** +** FUNCTION VALUE: +** +** status, returns success, or error. +** +*****************************************************************************/ +static int PointStatsBits(src,min,max,mean,var) +UdpPtr src; /* source data descriptor */ +double *min; /* returned minimum pixel value in region */ +double *max; /* returned maxumum pixel value in region */ +double *mean; /* returned mean pixel value in region */ +double *var; /* returned variance of pixel values in region */ +{ + int scan; + int pel; + + int scan_ptr = src->UdpL_Pos; + int pel_ptr = scan_ptr; + + unsigned long value; + unsigned long pel_mask = (1 << src->UdpW_PixelLength) - 1; + unsigned long lclmin = GET_VALUE_(src->UdpA_Base,pel_ptr,pel_mask); + unsigned long lclmax = GET_VALUE_(src->UdpA_Base,pel_ptr,pel_mask); + int count = src->UdpL_PxlPerScn * src->UdpL_ScnCnt; + + double sum = 0.0; + double sumsqr = 0.0; + /* + ** Do first pass to get min, max, and mean + */ + for (scan = src->UdpL_Y1; scan <= src->UdpL_Y2; scan++) + { + pel_ptr = scan_ptr; + for (pel = src->UdpL_X1; pel <= src->UdpL_X2; pel++) + { + value = GET_VALUE_(src->UdpA_Base,pel_ptr,pel_mask); + /* + ** Keep track of minimum and maximum values. + */ + if (value > lclmax) lclmax = value; + if (value < lclmin) lclmin = value; + /* + ** Keep runnning sum. + */ + sum += value; + sumsqr += value * value; + /* + ** Update source data pointer + */ + pel_ptr += src->UdpL_PxlStride; + } + /* + ** Update source data pointer + */ + scan_ptr += src->UdpL_ScnStride; + } + /* + ** Return values. + */ + *min = lclmin; + *max = lclmax; + *mean = sum / (double)count; + *var = (sumsqr-((sum*sum)/(double)count))/(double)(count-1); + + return( Success ); +} + +/***************************************************************************** +** SmiAreaStats +** +** FUNCTIONAL DESCRIPTION: +** +** This routine fills the destination UDP with the results of the +** statistics operation specified by the selector calculated over values +** surrounding each point in the source. The size of the area calculated +** over is determined by the edge parameter. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor. +** dst - destination data descriptor. +** roi - region of interest or CPP, may be NULL. +** selector - operation to perform. +** edge - size of source area to calculate over. +** +** FUNCTION VALUE: +** +** status, returns Success, or error. +** +*****************************************************************************/ +int SmiStatsArea(src,dst,roi,selector,edge,constrain) +UdpPtr src; +UdpPtr dst; +UdpPtr roi; +int selector; +int edge; +int constrain; +{ + int status; + /* + ** Local copies of the UDPs which will describe the intersection of the + ** ROI, source UDP, and destination UDP. + */ + UdpRec srcudp; + UdpRec dstudp; + UdpRec roiudp; + + /* + ** Allocate the destination image array + */ + if( dst->UdpA_Base == NULL ) + { + dst->UdpA_Base = DdxMallocBits_( dst->UdpL_ArSize ); + if( dst->UdpA_Base == NULL ) return( BadAlloc ); + } + + /* + ** Set up destination UDP to always be float + */ + if (dst->UdpB_DType != UdpK_DTypeF) + { + dstudp = *dst; + + dstudp.UdpW_PixelLength = sizeof(float) * 8; + dstudp.UdpB_DType = UdpK_DTypeF; + dstudp.UdpB_Class = UdpK_ClassA; + dstudp.UdpL_PxlStride = dstudp.UdpW_PixelLength; + dstudp.UdpL_ScnStride = dstudp.UdpL_PxlPerScn * dstudp.UdpL_PxlStride; + dstudp.UdpL_Pos = 0; + + dstudp.UdpL_ArSize = dstudp.UdpL_ScnCnt * dstudp.UdpL_ScnStride; + dstudp.UdpA_Base = (unsigned char *) DdxMalloc_(dstudp.UdpL_ArSize / 8); + } + /* + ** Determine intersection of source, destination, and ROI. + */ + roiudp.UdpA_Base = NULL; + status = DdxResolveUdp_( src, + dst->UdpB_DType == UdpK_DTypeF ? dst : &dstudp, + roi, + &srcudp, + &dstudp, + &roiudp ); + if( status != Success ) return( status ); + /* + ** Call routine based on selector and source data type. + */ + /* + ** Perform bounds checking on dtype and selector before entering?? + */ + if (roiudp.UdpA_Base == NULL) + status = (*area_stats_table[srcudp.UdpB_DType][selector]) + (&srcudp,&dstudp,edge); + else + status = (*area_stats_cpp_table[selector][srcudp.UdpB_DType]) + (&srcudp,&dstudp,&roiudp,edge); + /* + ** If output UDP not float, do a convert into the required data type. + */ + if (dst->UdpB_DType != UdpK_DTypeF) + { + DdxConvert_( &dstudp, dst, constrain ); + DdxFree_( dstudp.UdpA_Base ); + } + + return( status ); +} + +/***************************************************************************** +** _AreaErr +** +** FUNCTIONAL DESCRIPTION: +** +** This routine returns BadValue error for selectors and/or data type out +** of range errors. +** +** FORMAL PARAMETERS: +** +** none +** +** IMPLICIT INPUTS: +** +** none +** +** IMPLICIT OUTPUTS: +** +** none +** +** FUNCTION VALUE: +** +** status, returns BadValue always. +** +** SIDE EFFECTS: +** +** none +** +*****************************************************************************/ +static int _AreaErr() +{ + return( BadValue ); +} + +/***************************************************************************** +** _AreaMin* +** +** FUNCTIONAL DESCRIPTION: +** +** These routines fill the destination UDP with the minimum of pixel +** values surrounding each point in the source. The size of the area +** calculated over is determined by the edge parameter. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor. +** dst - destination data descriptor. +** edge - size of source area to calculate over. +** +** FUNCTION VALUE: +** +** success +** +*****************************************************************************/ +static int _AreaMinB(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + unsigned char *spelptr; /* Source pixel pointer */ + unsigned char *sscnptr; /* Source pixel pointer */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + unsigned char min; + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride / (sizeof(char) * 8); + sscnstr = src->UdpL_ScnStride / (sizeof(char) * 8); + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Get the first pixel value in this block, and save that as the + ** initial minimum. + */ + sscnptr = (unsigned char *)src->UdpA_Base + + src->UdpL_Pos / (sizeof(char) * 8) + + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + min = *(sscnptr); + + for (sscn = bscn; sscn <= escn; sscn++) + { + spelptr = sscnptr; + for (spel = bpxl; spel <= epxl; spel++) + { + if (min > *spelptr) + min = *spelptr; + spelptr += spelstr; + } + sscnptr += sscnstr; + } + /* + ** Store the local minimum in the destination UDP buffer, and + ** update destination pointer. + */ + *dpelptr = min; + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +static int _AreaMinW(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + unsigned short *spelptr; /* Source pixel pointer */ + unsigned short *sscnptr; /* Source pixel pointer */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + unsigned short min; + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride / (sizeof(short) * 8); + sscnstr = src->UdpL_ScnStride / (sizeof(short) * 8); + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Get the first pixel value in this block, and save that as the + ** initial minimum. + */ + sscnptr = (unsigned short *)src->UdpA_Base + + src->UdpL_Pos / (sizeof(short) * 8) + + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + min = *(sscnptr); + + for (sscn = bscn; sscn <= escn; sscn++) + { + spelptr = sscnptr; + for (spel = bpxl; spel <= epxl; spel++) + { + if (min > *spelptr) + min = *spelptr; + spelptr += spelstr; + } + sscnptr += sscnstr; + } + /* + ** Store the local minimum in the destination UDP buffer, and + ** update destination pointer. + */ + *dpelptr = min; + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +static int _AreaMinL(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + unsigned long *spelptr; /* Source pixel pointer */ + unsigned long *sscnptr; /* Source pixel pointer */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + unsigned long min; + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride / (sizeof(long) * 8); + sscnstr = src->UdpL_ScnStride / (sizeof(long) * 8); + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Get the first pixel value in this block, and save that as the + ** initial minimum. + */ + sscnptr = (unsigned long *)src->UdpA_Base + + src->UdpL_Pos / (sizeof(long) * 8) + + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + min = *(sscnptr); + + for (sscn = bscn; sscn <= escn; sscn++) + { + spelptr = sscnptr; + for (spel = bpxl; spel <= epxl; spel++) + { + if (min > *spelptr) + min = *spelptr; + spelptr += spelstr; + } + sscnptr += sscnstr; + } + /* + ** Store the local minimum in the destination UDP buffer, and + ** update destination pointer. + */ + *dpelptr = min; + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +static int _AreaMinF(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + float *spelptr; /* Source pixel pointer */ + float *sscnptr; /* Source pixel pointer */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + float min; + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride / (sizeof(float) * 8); + sscnstr = src->UdpL_ScnStride / (sizeof(float) * 8); + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Get the first pixel value in this block, and save that as the + ** initial minimum. + */ + sscnptr = (float *)src->UdpA_Base + + src->UdpL_Pos / (sizeof(float) * 8) + + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + min = *(sscnptr); + + for (sscn = bscn; sscn <= escn; sscn++) + { + spelptr = sscnptr; + for (spel = bpxl; spel <= epxl; spel++) + { + if (min > *spelptr) + min = *spelptr; + spelptr += spelstr; + } + sscnptr += sscnstr; + } + /* + ** Store the local minimum in the destination UDP buffer, and + ** update destination pointer. + */ + *dpelptr = min; + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +static int _AreaMinV(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + int speloff; /* Source pixel bit offset */ + int sscnoff; /* Source scanline bit offset */ + int srcmsk; /* Source pixel mask */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + float min; + int value; + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride; + sscnstr = src->UdpL_ScnStride; + srcmsk = (1 << src->UdpL_Levels) - 1; + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Get the first pixel value in this block, and save that as the + ** initial minimum. + */ + sscnoff = src->UdpL_Pos + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + min = GET_VALUE_(src->UdpA_Base,sscnoff,srcmsk); + + for (sscn = bscn; sscn <= escn; sscn++) + { + speloff = sscnoff; + for (spel = bpxl; spel <= epxl; spel++) + { + value = GET_VALUE_(src->UdpA_Base,speloff,srcmsk); + if (min > value) + min = value; + speloff += spelstr; + } + sscnoff += sscnstr; + } + /* + ** Store the local minimum in the destination UDP buffer, and + ** update destination pointer. + */ + *dpelptr = min; + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +/***************************************************************************** +** _AreaMax* +** +** FUNCTIONAL DESCRIPTION: +** +** These routines fill the destination UDP with the maximum of pixel +** values surrounding each point in the source. The size of the area +** calculated over is determined by the edge parameter. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor. +** dst - destination data descriptor. +** edge - size of source area to calculate over. +** +** FUNCTION VALUE: +** +** success +** +*****************************************************************************/ +static int _AreaMaxB(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + unsigned char *spelptr; /* Source pixel pointer */ + unsigned char *sscnptr; /* Source pixel pointer */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + unsigned char max; + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride / (sizeof(char) * 8); + sscnstr = src->UdpL_ScnStride / (sizeof(char) * 8); + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Get the first pixel value in this block, and save that as the + ** initial maximum. + */ + sscnptr = (unsigned char *)src->UdpA_Base + + src->UdpL_Pos / (sizeof(char) * 8) + + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + max = *(sscnptr); + + for (sscn = bscn; sscn <= escn; sscn++) + { + spelptr = sscnptr; + for (spel = bpxl; spel <= epxl; spel++) + { + if (max < *spelptr) + max = *spelptr; + spelptr += spelstr; + } + sscnptr += sscnstr; + } + /* + ** Store the local maximum in the destination UDP buffer, and + ** update destination pointer. + */ + *dpelptr = max; + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +static int _AreaMaxW(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + unsigned short *spelptr; /* Source pixel pointer */ + unsigned short *sscnptr; /* Source pixel pointer */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + unsigned short max; + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride / (sizeof(short) * 8); + sscnstr = src->UdpL_ScnStride / (sizeof(short) * 8); + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Get the first pixel value in this block, and save that as the + ** initial maximum. + */ + sscnptr = (unsigned short *)src->UdpA_Base + + src->UdpL_Pos / (sizeof(short) * 8) + + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + max = *(sscnptr); + + for (sscn = bscn; sscn <= escn; sscn++) + { + spelptr = sscnptr; + for (spel = bpxl; spel <= epxl; spel++) + { + if (max < *spelptr) + max = *spelptr; + spelptr += spelstr; + } + sscnptr += sscnstr; + } + /* + ** Store the local maximum in the destination UDP buffer, and + ** update destination pointer. + */ + *dpelptr = max; + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +static int _AreaMaxL(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + unsigned long *spelptr; /* Source pixel pointer */ + unsigned long *sscnptr; /* Source pixel pointer */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + unsigned long max; + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride / (sizeof(long) * 8); + sscnstr = src->UdpL_ScnStride / (sizeof(long) * 8); + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Get the first pixel value in this block, and save that as the + ** initial maximum. + */ + sscnptr = (unsigned long *)src->UdpA_Base + + src->UdpL_Pos / (sizeof(long) * 8) + + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + max = *(sscnptr); + + for (sscn = bscn; sscn <= escn; sscn++) + { + spelptr = sscnptr; + for (spel = bpxl; spel <= epxl; spel++) + { + if (max < *spelptr) + max = *spelptr; + spelptr += spelstr; + } + sscnptr += sscnstr; + } + /* + ** Store the local maximum in the destination UDP buffer, and + ** update destination pointer. + */ + *dpelptr = max; + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +static int _AreaMaxF(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + float *spelptr; /* Source pixel pointer */ + float *sscnptr; /* Source pixel pointer */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + float max; + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride / (sizeof(float) * 8); + sscnstr = src->UdpL_ScnStride / (sizeof(float) * 8); + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Get the first pixel value in this block, and save that as the + ** initial maximum. + */ + sscnptr = (float *)src->UdpA_Base + + src->UdpL_Pos / (sizeof(float) * 8) + + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + max = *(sscnptr); + + for (sscn = bscn; sscn <= escn; sscn++) + { + spelptr = sscnptr; + for (spel = bpxl; spel <= epxl; spel++) + { + if (max < *spelptr) + max = *spelptr; + spelptr += spelstr; + } + sscnptr += sscnstr; + } + /* + ** Store the local maximum in the destination UDP buffer, and + ** update destination pointer. + */ + *dpelptr = max; + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +static int _AreaMaxV(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + return( BadImplementation ); +} + +/***************************************************************************** +** _AreaMean* +** +** FUNCTIONAL DESCRIPTION: +** +** These routines fill the destination UDP with the mean of pixel +** values surrounding each point in the source. The size of the area +** calculated over is determined by the edge parameter. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor. +** dst - destination data descriptor. +** edge - size of source area to calculate over. +** +** FUNCTION VALUE: +** +** success +** +*****************************************************************************/ + +static int _AreaMeanB(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + unsigned char *spelptr; /* Source pixel pointer */ + unsigned char *sscnptr; /* Source pixel pointer */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + double sum; /* Sum of pixel values in area */ + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride / (sizeof(char) * 8); + sscnstr = src->UdpL_ScnStride / (sizeof(char) * 8); + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Initialize scanline pointer and sum. + */ + sscnptr = (unsigned char *)src->UdpA_Base + + src->UdpL_Pos / (sizeof(char) * 8) + + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + sum = 0.0; + + for (sscn = bscn; sscn <= escn; sscn++) + { + spelptr = sscnptr; + for (spel = bpxl; spel <= epxl; spel++) + sum += *spelptr; + sscnptr += sscnstr; + } + /* + ** Store the local mean in the destination UDP buffer, and + ** update destination pointer. + */ + *dpelptr = (double)sum / (double)((escn-bscn+1) * (epxl-bpxl+1)); + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +static int _AreaMeanW(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + unsigned short *spelptr; /* Source pixel pointer */ + unsigned short *sscnptr; /* Source pixel pointer */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + double sum; /* Sum of pixel values in area */ + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride / (sizeof(short) * 8); + sscnstr = src->UdpL_ScnStride / (sizeof(short) * 8); + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Initialize scanline pointer and sum. + */ + sscnptr = (unsigned short *)src->UdpA_Base + + src->UdpL_Pos / (sizeof(short) * 8) + + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + sum = 0.0; + + for (sscn = bscn; sscn <= escn; sscn++) + { + spelptr = sscnptr; + for (spel = bpxl; spel <= epxl; spel++) + sum += *spelptr; + sscnptr += sscnstr; + } + /* + ** Store the local mean in the destination UDP buffer, and + ** update destination pointer. + */ + *dpelptr = sum / (double)((escn-bscn+1) * (epxl-bpxl+1)); + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +static int _AreaMeanL(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + unsigned long *spelptr; /* Source pixel pointer */ + unsigned long *sscnptr; /* Source pixel pointer */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + double sum; /* Sum of pixel values in area */ + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride / (sizeof(long) * 8); + sscnstr = src->UdpL_ScnStride / (sizeof(long) * 8); + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Initialize scanline pointer and sum. + */ + sscnptr = (unsigned long *)src->UdpA_Base + + src->UdpL_Pos / (sizeof(long) * 8) + + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + sum = 0.0; + + for (sscn = bscn; sscn <= escn; sscn++) + { + spelptr = sscnptr; + for (spel = bpxl; spel <= epxl; spel++) + sum += *spelptr; + sscnptr += sscnstr; + } + /* + ** Store the local mean in the destination UDP buffer, and + ** update destination pointer. + */ + *dpelptr = sum / (double)((escn-bscn+1) * (epxl-bpxl+1)); + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +static int _AreaMeanF(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + float *spelptr; /* Source pixel pointer */ + float *sscnptr; /* Source pixel pointer */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + double sum; /* Sum of pixel values in area */ + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride / (sizeof(float) * 8); + sscnstr = src->UdpL_ScnStride / (sizeof(float) * 8); + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Initialize scanline pointer and sum. + */ + sscnptr = (float *)src->UdpA_Base + + src->UdpL_Pos / (sizeof(float) * 8) + + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + sum = 0.0; + + for (sscn = bscn; sscn <= escn; sscn++) + { + spelptr = sscnptr; + for (spel = bpxl; spel <= epxl; spel++) + sum += *spelptr; + sscnptr += sscnstr; + } + /* + ** Store the local mean in the destination UDP buffer, and + ** update destination pointer. + */ + *dpelptr = sum / (double)((escn-bscn+1) * (epxl-bpxl+1)); + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +static int _AreaMeanV(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + return( BadImplementation ); +} + +/***************************************************************************** +** _AreaStdDev* +** +** FUNCTIONAL DESCRIPTION: +** +** These routines fill the destination UDP with the standard deviation of +** pixel values surrounding each point in the source. The size of the area +** calculated over is determined by the edge parameter. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor. +** dst - destination data descriptor. +** edge - size of source area to calculate over. +** +** FUNCTION VALUE: +** +** success +** +*****************************************************************************/ +static int _AreaStdDevB(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + unsigned char *spelptr; /* Source pixel pointer */ + unsigned char *sscnptr; /* Source pixel pointer */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + unsigned long count; /* Count of pixels in local area */ + double sum; /* Sum of pixel values in area */ + double sumsqr; /* Sum of pixel values in area */ + + double var; /* Variance */ + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride / (sizeof(char) * 8); + sscnstr = src->UdpL_ScnStride / (sizeof(char) * 8); + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Initialize scanline pointer and sum. + */ + sscnptr = (unsigned char *)src->UdpA_Base + + src->UdpL_Pos / (sizeof(char) * 8) + + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + count = (escn - bscn + 1) * (epxl - bpxl + 1); + sum = 0.0; + sumsqr = 0.0; + + for (sscn = bscn; sscn <= escn; sscn++) + { + spelptr = sscnptr; + for (spel = bpxl; spel <= epxl; spel++) + { + sum += *spelptr; + sumsqr += *spelptr * *spelptr; + } + sscnptr += sscnstr; + } + /* + ** Store the local standard deviation in the destination UDP + ** buffer, and update destination pointer. + */ + var = (sumsqr-((sum*sum)/(double)count))/(double)(count-1); + *dpelptr = sqrt(var); + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +static int _AreaStdDevW(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + unsigned short *spelptr; /* Source pixel pointer */ + unsigned short *sscnptr; /* Source pixel pointer */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + unsigned long count; /* Count of pixels in local area */ + double sum; /* Sum of pixel values in area */ + unsigned long sumsqr; /* Sum of pixel values in area */ + + double var; /* Variance */ + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride / (sizeof(short) * 8); + sscnstr = src->UdpL_ScnStride / (sizeof(short) * 8); + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Initialize scanline pointer and sum. + */ + sscnptr = (unsigned short *)src->UdpA_Base + + src->UdpL_Pos / (sizeof(short) * 8) + + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + count = (escn - bscn + 1) * (epxl - bpxl + 1); + sum = 0.0; + sumsqr = 0.0; + + for (sscn = bscn; sscn <= escn; sscn++) + { + spelptr = sscnptr; + for (spel = bpxl; spel <= epxl; spel++) + { + sum += *spelptr; + sumsqr += *spelptr * *spelptr; + } + sscnptr += sscnstr; + } + /* + ** Store the local standard deviation in the destination UDP + ** buffer, and update destination pointer. + */ + var = (sumsqr-((sum*sum)/(double)count))/(double)(count-1); + *dpelptr = sqrt(var); + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +static int _AreaStdDevL(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + unsigned long *spelptr; /* Source pixel pointer */ + unsigned long *sscnptr; /* Source pixel pointer */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + unsigned long count; /* Count of pixels in local area */ + double sum; /* Sum of pixel values in area */ + double sumsqr; /* Sum of pixel values in area */ + + double var; /* Variance */ + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride / (sizeof(long) * 8); + sscnstr = src->UdpL_ScnStride / (sizeof(long) * 8); + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Initialize scanline pointer and sum. + */ + sscnptr = (unsigned long *)src->UdpA_Base + + src->UdpL_Pos / (sizeof(long) * 8) + + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + count = (escn - bscn + 1) * (epxl - bpxl + 1); + sum = 0.0; + sumsqr = 0.0; + + for (sscn = bscn; sscn <= escn; sscn++) + { + spelptr = sscnptr; + for (spel = bpxl; spel <= epxl; spel++) + { + sum += *spelptr; + sumsqr += *spelptr * *spelptr; + } + sscnptr += sscnstr; + } + /* + ** Store the local standard deviation in the destination UDP + ** buffer, and update destination pointer. + */ + var = (sumsqr-((sum*sum)/(double)count))/(double)(count-1); + *dpelptr = sqrt(var); + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +static int _AreaStdDevF(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + float *spelptr; /* Source pixel pointer */ + float *sscnptr; /* Source pixel pointer */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + unsigned long count; /* Count of pixels in local area */ + double sum; /* Sum of pixel values in area */ + double sumsqr; /* Sum of pixel values in area */ + + double var; /* Variance */ + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride / (sizeof(float) * 8); + sscnstr = src->UdpL_ScnStride / (sizeof(float) * 8); + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Initialize scanline pointer and sum. + */ + sscnptr = (float *)src->UdpA_Base + + src->UdpL_Pos / (sizeof(float) * 8) + + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + count = (escn - bscn + 1) * (epxl - bpxl + 1); + sum = 0.0; + sumsqr = 0.0; + + for (sscn = bscn; sscn <= escn; sscn++) + { + spelptr = sscnptr; + for (spel = bpxl; spel <= epxl; spel++) + { + sum += *spelptr; + sumsqr += *spelptr * *spelptr; + } + sscnptr += sscnstr; + } + /* + ** Store the local standard deviation in the destination UDP + ** buffer, and update destination pointer. + */ + var = (sumsqr-((sum*sum)/(double)count))/(double)(count-1); + *dpelptr = sqrt(var); + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +static int _AreaStdDevV(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + return( BadImplementation ); +} + +/***************************************************************************** +** _AreaVar* +** +** FUNCTIONAL DESCRIPTION: +** +** These routines fill the destination UDP with the variance of pixel +** values surrounding each point in the source. The size of the area +** calculated over is determined by the edge parameter. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor. +** dst - destination data descriptor. +** edge - size of source area to calculate over. +** +** FUNCTION VALUE: +** +** success +** +*****************************************************************************/ +static int _AreaVarB(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + unsigned char *spelptr; /* Source pixel pointer */ + unsigned char *sscnptr; /* Source pixel pointer */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + unsigned long count; /* Count of pixels in local area */ + double sum; /* Sum of pixel values in area */ + double sumsqr; /* Sum of pixel values in area */ + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride / (sizeof(char) * 8); + sscnstr = src->UdpL_ScnStride / (sizeof(char) * 8); + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Initialize scanline pointer and sum. + */ + sscnptr = (unsigned char *)src->UdpA_Base + + src->UdpL_Pos / (sizeof(char) * 8) + + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + count = (escn - bscn + 1) * (epxl - bpxl + 1); + sum = 0.0; + sumsqr = 0.0; + + for (sscn = bscn; sscn <= escn; sscn++) + { + spelptr = sscnptr; + for (spel = bpxl; spel <= epxl; spel++) + { + sum += *spelptr; + sumsqr += *spelptr * *spelptr; + } + sscnptr += sscnstr; + } + /* + ** Store the local standard deviation in the destination UDP + ** buffer, and update destination pointer. + */ + *dpelptr = + (sumsqr-((sum*sum)/(float)count))/(float)(count-1); + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +static int _AreaVarW(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + unsigned short *spelptr; /* Source pixel pointer */ + unsigned short *sscnptr; /* Source pixel pointer */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + unsigned long count; /* Count of pixels in local area */ + double sum; /* Sum of pixel values in area */ + double sumsqr; /* Sum of pixel values in area */ + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride / (sizeof(short) * 8); + sscnstr = src->UdpL_ScnStride / (sizeof(short) * 8); + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Initialize scanline pointer and sum. + */ + sscnptr = (unsigned short *)src->UdpA_Base + + src->UdpL_Pos / (sizeof(short) * 8) + + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + count = (escn - bscn + 1) * (epxl - bpxl + 1); + sum = 0.0; + sumsqr = 0.0; + + for (sscn = bscn; sscn <= escn; sscn++) + { + spelptr = sscnptr; + for (spel = bpxl; spel <= epxl; spel++) + { + sum += *spelptr; + sumsqr += *spelptr * *spelptr; + } + sscnptr += sscnstr; + } + /* + ** Store the local standard deviation in the destination UDP + ** buffer, and update destination pointer. + */ + *dpelptr = + (sumsqr-((sum*sum)/(float)count))/(float)(count-1); + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +static int _AreaVarL(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + unsigned long *spelptr; /* Source pixel pointer */ + unsigned long *sscnptr; /* Source pixel pointer */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + unsigned long count; /* Count of pixels in local area */ + double sum; /* Sum of pixel values in area */ + double sumsqr; /* Sum of pixel values in area */ + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride / (sizeof(long) * 8); + sscnstr = src->UdpL_ScnStride / (sizeof(long) * 8); + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Initialize scanline pointer and sum. + */ + sscnptr = (unsigned long *)src->UdpA_Base + + src->UdpL_Pos / (sizeof(long) * 8) + + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + count = (escn - bscn + 1) * (epxl - bpxl + 1); + sum = 0.0; + sumsqr = 0.0; + + for (sscn = bscn; sscn <= escn; sscn++) + { + spelptr = sscnptr; + for (spel = bpxl; spel <= epxl; spel++) + { + sum += *spelptr; + sumsqr += *spelptr * *spelptr; + } + sscnptr += sscnstr; + } + /* + ** Store the local standard deviation in the destination UDP + ** buffer, and update destination pointer. + */ + *dpelptr = + (sumsqr-((sum*sum)/(float)count))/(float)(count-1); + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +static int _AreaVarF(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + int dpel; /* Destination pixel index */ + int dscn; /* Destination scanline index */ + int dpelstr; /* Destination pixel stride */ + int dscnstr; /* Destination scanline stride */ + float *dpelptr; /* Destination pixel pointer */ + float *dscnptr; /* Destination scanline pointer */ + + int spel; /* Source pixel index */ + int sscn; /* Source scanline index */ + int spelstr; /* Source pixel stride */ + int sscnstr; /* Source scanline stride */ + float *spelptr; /* Source pixel pointer */ + float *sscnptr; /* Source pixel pointer */ + + int bscn; /* The beginning and ending pixel */ + int escn; /* index for each local area */ + int bpxl; /* operation. */ + int epxl; + + unsigned long count; /* Count of pixels in local area */ + double sum; /* Sum of pixel values in area */ + double sumsqr; /* Sum of pixel values in area */ + + dpelstr = dst->UdpL_PxlStride / (sizeof(float) * 8); + dscnstr = dst->UdpL_ScnStride / (sizeof(float) * 8); + dscnptr = (float *)(dst->UdpA_Base + dst->UdpL_Pos / 8); + + spelstr = src->UdpL_PxlStride / (sizeof(float) * 8); + sscnstr = src->UdpL_ScnStride / (sizeof(float) * 8); + + for (dscn = dst->UdpL_Y1; dscn <= dst->UdpL_Y2; dscn++) + { + dpelptr = dscnptr; + for (dpel = dst->UdpL_X1; dpel <= dst->UdpL_X2; dpel++) + { + /* + ** Calculate source scanlines required to do this computation such + ** that we don't extend beyond the boundary of the source. + */ + bscn = dscn - edge / 2 > src->UdpL_Y1 ? + dscn - edge / 2 : dst->UdpL_Y1; + + escn = dscn - edge / 2 + edge < src->UdpL_Y2 ? + dscn - edge / 2 + edge : dst->UdpL_Y2; + + bpxl = dpel - edge / 2 > src->UdpL_X1 ? + dpel - edge / 2 : dst->UdpL_X1; + + epxl = dpel - edge / 2 + edge < src->UdpL_X2 ? + dpel - edge / 2 + edge : dst->UdpL_X2; + /* + ** Initialize scanline pointer and sum. + */ + sscnptr = (float *)src->UdpA_Base + + src->UdpL_Pos / (sizeof(float) * 8) + + (bscn - src->UdpL_Y1) * sscnstr + + (bpxl - src->UdpL_X1) * spelstr; + count = (escn - bscn + 1) * (epxl - bpxl + 1); + sum = 0.0; + sumsqr = 0.0; + + for (sscn = bscn; sscn <= escn; sscn++) + { + spelptr = sscnptr; + for (spel = bpxl; spel <= epxl; spel++) + { + sum += *spelptr; + sumsqr += *spelptr * *spelptr; + } + sscnptr += sscnstr; + } + /* + ** Store the local standard deviation in the destination UDP + ** buffer, and update destination pointer. + */ + *dpelptr = + (sumsqr-((sum*sum)/(float)count))/(float)(count-1); + dpelptr += dpelstr; + } + dscnptr += dscnstr; + } + + return( Success ); +} + +static int _AreaVarV(src,dst,edge) +UdpPtr src; +UdpPtr dst; +int edge; +{ + return( BadImplementation ); +} + +/***************************************************************************** +** _AreaCppMin* +** +** FUNCTIONAL DESCRIPTION: +** +** These routines fill the destination UDP with the minimum of pixel +** values surrounding each point in the source which has a bit set in the +** corresponding position in the CPP. The size of the area calculated over +** is determined by the edge parameter. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor. +** dst - destination data descriptor. +** cpp - CPP data descriptor. +** edge - size of source area to calculate over. +** +** FUNCTION VALUE: +** +** success +** +*****************************************************************************/ +static int _AreaCppMinB(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +static int _AreaCppMinW(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +static int _AreaCppMinL(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +static int _AreaCppMinF(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +static int _AreaCppMinV(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +/***************************************************************************** +** _AreaCppMax* +** +** FUNCTIONAL DESCRIPTION: +** +** These routines fill the destination UDP with the maximum of pixel +** values surrounding each point in the source which has a bit set in the +** corresponding position in the CPP. The size of the area calculated over +** is determined by the edge parameter. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor. +** dst - destination data descriptor. +** cpp - CPP data descriptor. +** edge - size of source area to calculate over. +** +** FUNCTION VALUE: +** +** success +** +*****************************************************************************/ +static int _AreaCppMaxB(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +static int _AreaCppMaxW(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +static int _AreaCppMaxL(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +static int _AreaCppMaxF(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +static int _AreaCppMaxV(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +/***************************************************************************** +** _AreaCppMean* +** +** FUNCTIONAL DESCRIPTION: +** +** These routines fill the destination UDP with the mean of pixel values +** surrounding each point in the source which has a bit set in the +** corresponding position in the CPP. The size of the area calculated over +** is determined by the edge parameter. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor. +** dst - destination data descriptor. +** cpp - CPP data descriptor. +** edge - size of source area to calculate over. +** +** FUNCTION VALUE: +** +** success +** +*****************************************************************************/ +static int _AreaCppMeanB(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +static int _AreaCppMeanW(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +static int _AreaCppMeanL(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +static int _AreaCppMeanF(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +static int _AreaCppMeanV(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +/***************************************************************************** +** _AreaCppStdDev* +** +** FUNCTIONAL DESCRIPTION: +** +** These routines fill the destination UDP with the standard deviation of +** pixel values surrounding each point in the source which has a bit set +** in the corresponding position in the CPP. The size of the area +** calculated over is determined by the edge parameter. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor. +** dst - destination data descriptor. +** cpp - CPP data descriptor. +** edge - size of source area to calculate over. +** +** FUNCTION VALUE: +** +** success +** +*****************************************************************************/ +static int _AreaCppStdDevB(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +static int _AreaCppStdDevW(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +static int _AreaCppStdDevL(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +static int _AreaCppStdDevF(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +static int _AreaCppStdDevV(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +/***************************************************************************** +** _AreaCppVar* +** +** FUNCTIONAL DESCRIPTION: +** +** These routines fill the destination UDP with the variance of pixel +** values surrounding each point in the source which has a bit set in the +** corresponding position in the CPP. The size of the area calculated over +** is determined by the edge parameter. +** +** FORMAL PARAMETERS: +** +** src - source data descriptor. +** dst - destination data descriptor. +** cpp - CPP data descriptor. +** edge - size of source area to calculate over. +** +** FUNCTION VALUE: +** +** success +** +*****************************************************************************/ +static int _AreaCppVarB(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +static int _AreaCppVarW(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +static int _AreaCppVarL(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +static int _AreaCppVarF(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} + +static int _AreaCppVarV(src,dst,cpp,edge) +UdpPtr src; +UdpPtr dst; +UdpPtr cpp; +int edge; +{ + return( BadImplementation ); +} diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiStats.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiStats.h new file mode 100644 index 0000000..3ec4eda --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiStats.h @@ -0,0 +1,91 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the STATS module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** +** AUTHOR(S): +** +** Richard Hennessy +** +** CREATION DATE: +** +** September 25, 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMISTATS +#define _SMISTATS + + /* + ** Include files + */ + + /* + ** Function reference + */ +int SmiStatsPoint(); +int SmiStatsArea(); + +#endif +/* _SMISTATS */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiTranslate.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiTranslate.c new file mode 100644 index 0000000..32e743c --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiTranslate.c @@ -0,0 +1,790 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/****************************************************************************** +**++ +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains support for the TRANSLATE operation. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** VAX ULTRIX V3.1 +** RISC ULTRIX 3.1 +** +** AUTHORS: +** +** Gary Grebus +** +** CREATION DATE: +** +** Thu Feb 22 14:39:51 1990 +** +*******************************************************************************/ + +#include + +#include "SmiTranslate.h" + +/* +** Table of contents +*/ +int SmiCreateTranslate(); +int SmiTranslate(); + +static int _TranslateInitialize(); +static int _TranslateActivate(); +static int _TranslateAbort(); +static int _TranslateDestroy(); + +static int _TranslateResolveCpp(); +static PipeDataPtr _TranslateNxtSrc1Data(); + +/* +** Equated Symbols +*/ + +/* +** External References +*/ + +/* + * Macros + */ +#define Min_(a,b) ((a) <= (b) ? (a) : (b)) +#define Max_(a,b) ((a) > (b) ? (a) : (b)) +/* +** Local storage +*/ + /* + ** Translate Element Vector + */ +static PipeElementVector TranslatePipeElement = { + NULL, /* FLINK */ + NULL, /* BLINK */ + sizeof(PipeElementVector), /* Size */ + TypePipeElementVector, /* Structure type */ + StypeTranslateElement, /* Structure subtype */ + sizeof(TranslatePipeCtx), /* Context block size */ + 0, /* No input flag */ + 0, /* Reserved flags */ + _TranslateInitialize, /* Initialize entry */ + _TranslateActivate, /* Activate entry */ + _TranslateAbort, /* Flush entry */ + _TranslateDestroy, /* Destroy entry */ + _TranslateAbort /* Abort entry */ + }; + +/***************************************************************************** +** SmiCreateTranslate +** +** FUNCTIONAL DESCRIPTION: +** +** This function creates and fills in a TRANSLATE pipeline element. +** +** FORMAL PARAMETERS: +** +** pipe - Handle for pipe being created +** src1 - Pointer to sink containing source data being translated +** src2 - Pointer to sink containing source data being translated into +** dst - Pointer to sink to receive the result +** srcidc - Pointer to UDP describing the region to be copied from src1 +** dstidc - Pointer to UDP describing the region to be copied into +** +** FUNCTION VALUE: +** +** Success or standard X error code. +** +*****************************************************************************/ +int SmiCreateTranslate(pipe,src1,src2,dst,srcidc,dstidc) +Pipe pipe; +PipeSinkPtr src1; +PipeSinkPtr src2; +PipeSinkPtr dst; +UdpPtr srcidc; +UdpPtr dstidc; +{ + long width, height, status; + UdpPtr newcpp; + long sx1, sx2, sy1, sy2, dx1, dx2, dy1, dy2; + int i; + + TranslatePipeCtxPtr ctx = (TranslatePipeCtxPtr) + DdxCreatePipeCtx_( pipe, &TranslatePipeElement, FALSE ); + if( !IsPointer_(ctx) ) return( (int) ctx ); + + + /* + * Calculate the location and bounds of the region to be translated. + */ + if (srcidc == NULL){ + sx1 = SnkX1_(src1, 0); + sy1 = SnkY1_(src1, 0); + sx2 = SnkX2_(src1, 0); + sy2 = SnkY2_(src1, 0); + } else { + sx1 = Max_(srcidc->UdpL_X1, SnkX1_(src1, 0)); + sy1 = Max_(srcidc->UdpL_Y1, SnkY1_(src1, 0)); + sx2 = Min_(srcidc->UdpL_X2, SnkX2_(src1, 0)); + sy2 = Min_(srcidc->UdpL_Y2, SnkY2_(src1, 0)); + } + + if (dstidc == NULL) { + dx1 = SnkX1_(dst, 0); + dy1 = SnkY1_(dst, 0); + dx2 = SnkX2_(dst, 0); + dy2 = SnkY2_(dst, 0); + } else { + dx1 = Max_(dstidc->UdpL_X1, SnkX1_(dst, 0)); + dy1 = Max_(dstidc->UdpL_Y1, SnkY1_(dst, 0)); + dx2 = Min_(dstidc->UdpL_X2, SnkX2_(dst, 0)); + dy2 = Min_(dstidc->UdpL_Y2, SnkY2_(dst, 0)); + } + width = Min_(sx2 - sx1, dx2 - dx1) + 1; + height = Min_(sy2 - sy1, dy2 - dy1) + 1; + if (width <= 0 || height <= 0) { + DdxFree_( ctx ); /* DIX is supposed to catch this */ + return( BadValue ); + } + + TrnSrcX1_(ctx) = sx1; + TrnSrcY1_(ctx) = sy1; + TrnSrcY2_(ctx) = sy1 + height - 1; + TrnRoiX1_(ctx) = dx1; + TrnRoiY1_(ctx) = dy1; + TrnRoiX2_(ctx) = dx1 + width - 1; + TrnRoiY2_(ctx) = dy1 + height - 1; + + /* + ** Copy parameters into context block. + */ + TrnSrcSnk1_(ctx) = src1; + TrnSrcSnk2_(ctx) = src2; + TrnDstSnk_(ctx) = dst; + TrnSrcIdc_(ctx) = srcidc; + TrnDstIdc_(ctx) = dstidc; + + /* + ** Setup one drain per component on the first source sink. + ** Setup one drain on the second source sink. + */ + for( i = 0; i < XieK_MaxComponents && IsPointer_(SnkUdpPtr_(src1,i)); i++ ) + { + TrnSrcDrn1_(ctx, i) = DdxRmCreateDrain_( src1, 1< TrnRoiY2_(ctx) ) { + + /* This scanline comes before or after the destination ROI. + * Just copy it through. */ + status = DdxRmPutData_( TrnDstSnk_(ctx), src2 ); + TrnDat2_(ctx) = NULL; + + } else { + + /* This scanline falls within destination ROI */ + comp = DatCmpIdx_(src2); + + /* Get the next chunk of to-be-translated data */ + src1 = _TranslateNxtSrc1Data(ctx, comp); + + if (!IsPointer_(src1)) { + status = (int) src1; + break; + } + TrnDat1_(ctx, comp) = src1; + + if( DatY1_(src1) < TrnSrcY1_(ctx) || + DatY1_(src1) > TrnSrcY2_(ctx)) { + + /* This segment falls before or after the ROI. + * Throw it away. */ + DdxRmDeallocData_( src1 ); + TrnDat1_(ctx, comp) = NULL; + + } else { + /* We have the segment of to-be-translated data, and + * a background scanline within the destination ROI. + * Translate a scanline. + */ + dst = DdxRmAllocData_(TrnDstSnk_(ctx), comp, DatY1_(src2), 1); + if( !IsPointer_(dst) ) + status = (int) dst; + + if( TrnCpp_(ctx) == NULL ) { + + if( status == Success && TrnRoiX1_(ctx) > DatX1_(src2) ) + /* Copy the region left of the destination ROI */ + status = DdxCopy_( DatUdpPtr_(src2), DatUdpPtr_(dst), + 0, 0, + DatX1_(dst), DatY1_(dst), + TrnRoiX1_(ctx) - DatX1_(dst), 1 ); + + if( status == Success && TrnRoiX2_(ctx) < DatX2_(src2) ) + /* Copy the region right of the destination ROI */ + status = DdxCopy_( DatUdpPtr_(src2), DatUdpPtr_(dst), + TrnRoiX2_(ctx) + 1, 0, + TrnRoiX2_(ctx) + 1, DatY1_(dst), + DatX2_(dst) - TrnRoiX2_(ctx), 1 ); + + if( status == Success ) + /* Translate the region in the ROI */ + status = DdxCopy_( DatUdpPtr_(src1), DatUdpPtr_(dst), + TrnSrcX1_(ctx), + DatY1_(dst) - TrnRoiY1_(ctx), + TrnRoiX1_(ctx), DatY1_(dst), + TrnRoiX2_(ctx)-TrnRoiX1_(ctx)+1, 1 ); + } else { + + /* Copy the background data to the destination */ + if ( status == Success ) + status = DdxConvert_( DatUdpPtr_(src2), + DatUdpPtr_(dst), XieK_MoveMode ); + + if( status == Success ) + /* Translate the pixels selected by the CPP */ + status = DdxCopyCpp_(DatUdpPtr_(src1), DatUdpPtr_(dst), + TrnCpp_(ctx), + TrnSrcX1_(ctx), 0, + TrnRoiX1_(ctx), DatY1_(dst), + TrnRoiX2_(ctx)-TrnRoiX1_(ctx)+1,1); + } + + if( status == Success ) + status = DdxRmPutData_( TrnDstSnk_(ctx), dst ); + else + DdxRmDeallocData_(dst); + + if (DatY2_(src2) == TrnRoiY2_(ctx)) { + /* This is the last scanline which will receive translated + * data. Throw away the segment of to-be-translated data + */ + DdxRmDeallocData_( src1 ); + TrnDat1_(ctx, comp) = NULL; + } + + DdxRmDeallocData_(src2); + TrnDat2_(ctx) = NULL; + + } + } + } + return( status ); +} + +/***************************************************************************** +** _TranslateAbort +** +** FUNCTIONAL DESCRIPTION: +** +** This routine cleans up any data queued on the drains, and +** deallocates any data held in the local context. +** +** FORMAL PARAMETERS: +** +** ctx - translate pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _TranslateAbort(ctx) +TranslatePipeCtxPtr ctx; +{ + int i; + PipeDataPtr src; + + for( i = 0; i < TrnNcmp_(ctx); i++ ) + if( IsPointer_(TrnDat1_(ctx, i)) ) + TrnDat1_(ctx,i) = DdxRmDeallocData_( TrnDat1_(ctx,i) ); + + if( IsPointer_(TrnDat2_(ctx)) ) + TrnDat2_(ctx) = DdxRmDeallocData_( TrnDat2_(ctx) ); + + /* If the destination ROI ended at the end of the image, + * we will not have read any data beyond the source ROI in + * the to-be-translated image. Flush that data off of the drain. */ + for( i = 0; i < TrnNcmp_(ctx); i++ ) + { + src = _TranslateNxtSrc1Data(ctx,i); + if (IsPointer_(src)) + DdxRmDeallocData_( src ); + } + + return( Success ); +} + +/***************************************************************************** +** _TranslateDestroy +** +** FUNCTIONAL DESCRIPTION: +** +** This routine deallocates all resources allocated by the TRANSLATE +** pipeline element. +** +** FORMAL PARAMETERS: +** +** ctx - translate pipeline context +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _TranslateDestroy(ctx) +TranslatePipeCtxPtr ctx; +{ + int i; + + for( i = 0; i < TrnNcmp_(ctx); i++) + TrnSrcDrn1_(ctx, i) = DdxRmDestroyDrain_( TrnSrcDrn1_(ctx,i) ); + TrnSrcDrn2_(ctx) = DdxRmDestroyDrain_( TrnSrcDrn2_(ctx) ); + + if( IsPointer_(TrnCpp_(ctx)) ) + { + if( IsPointer_(TrnCpp_(ctx)->UdpA_Base) + && TrnCpp_(ctx)->UdpA_Base != TrnSrcIdc_(ctx)->UdpA_Base + && TrnCpp_(ctx)->UdpA_Base != TrnDstIdc_(ctx)->UdpA_Base ) + /* We allocated additional UDP storage - free it */ + DdxFreeBits_(TrnCpp_(ctx)->UdpA_Base); + + TrnCpp_(ctx) = (UdpPtr) DdxFree_( TrnCpp_(ctx) ); + } + + return( Success ); +} + +/***************************************************************************** +** SmiTranslate +** +** FUNCTIONAL DESCRIPTION: +** +** Copy a region of an input UDP into a region of an output UDP +** +** FORMAL PARAMETERS: +** +** src - source data descriptor +** dst - destination data descriptor +** srcidc - source IDC +** dstidc - destination IDC +** +** FUNCTION VALUE: +** +*****************************************************************************/ +int SmiTranslate( src1, src2, dst, srcidc, dstidc) +UdpPtr src1; +UdpPtr src2; +UdpPtr dst; +UdpPtr srcidc; +UdpPtr dstidc; +{ + unsigned width, height; + int status; + UdpPtr newcpp; + UdpPtr inroi, outroi; + + /* Copy the "background" image to the destination */ + status = DdxConvert_( src2, dst, XieK_MoveMode ); + if( status != Success ) return( status ); + + /* Determine the bounds of the destination region */ + inroi = srcidc == NULL ? src1 : srcidc; + inroi->UdpL_X1 = Max_(inroi->UdpL_X1, src1->UdpL_X1); + inroi->UdpL_X2 = Min_(inroi->UdpL_X2, src1->UdpL_X2); + inroi->UdpL_Y1 = Max_(inroi->UdpL_Y1, src1->UdpL_Y1); + inroi->UdpL_Y2 = Min_(inroi->UdpL_Y2, src1->UdpL_Y2); + if (inroi->UdpL_X1 > inroi->UdpL_X2 || inroi->UdpL_Y1 > inroi->UdpL_Y2) + return( BadValue ); + inroi->UdpL_PxlPerScn = inroi->UdpL_X2 - inroi->UdpL_X1 + 1; + inroi->UdpL_ScnCnt = inroi->UdpL_Y2 - inroi->UdpL_Y1 + 1; + + outroi = dstidc == NULL ? dst : dstidc; + outroi->UdpL_X1 = Max_(outroi->UdpL_X1, dst->UdpL_X1); + outroi->UdpL_X2 = Min_(outroi->UdpL_X2, dst->UdpL_X2); + outroi->UdpL_Y1 = Max_(outroi->UdpL_Y1, dst->UdpL_Y1); + outroi->UdpL_Y2 = Min_(outroi->UdpL_Y2, dst->UdpL_Y2); + if (outroi->UdpL_X1 > outroi->UdpL_X2 || outroi->UdpL_Y1 > outroi->UdpL_Y2) + return( BadValue ); + outroi->UdpL_PxlPerScn = outroi->UdpL_X2 - outroi->UdpL_X1 + 1; + outroi->UdpL_ScnCnt = outroi->UdpL_Y2 - outroi->UdpL_Y1 + 1; + + width = Min_(inroi->UdpL_PxlPerScn, outroi->UdpL_PxlPerScn); + height = Min_(inroi->UdpL_ScnCnt, outroi->UdpL_ScnCnt); + + /* Determine which CPP to use (if any) */ + status = _TranslateResolveCpp( srcidc, dstidc, &newcpp ); + if( status != Success ) return( status ); + + /* + ** Translate the region of interest. + */ + if( newcpp == NULL ) + status = DdxCopy_( src1, dst, + inroi->UdpL_X1, inroi->UdpL_Y1, + outroi->UdpL_X1, outroi->UdpL_Y1, width, height ); + else + status = DdxCopyCpp_( src1, dst, newcpp, + inroi->UdpL_X1, inroi->UdpL_Y1, + outroi->UdpL_X1, outroi->UdpL_Y1, width, height ); + + /* Free the temporary CPP if one was created */ + if( newcpp != NULL && newcpp != srcidc && newcpp != dstidc ) + { + if( IsPointer_(newcpp->UdpA_Base) ) + DdxFreeBits_(newcpp->UdpA_Base); + DdxFree_(newcpp); + } + return( status ); +} /* end SmiTranslate */ + +/***************************************************************************** +** _TranslateResolveCpp +** +** FUNCTIONAL DESCRIPTION: +** +** Determine the set of pixels to be processed given UDP's representing +** the IDC's. The source IDC may be omitted (NULL). Either IDC +** could represent only an ROI. +** +** FORMAL PARAMETERS: +** +** srcidc - Udp pointer for source CPP (may be NULL) +** dstidc - Udp Pointer for destination CPP +** newcpp - Pointer to return location for result CPP. +** +** FUNCTION VALUE: +** +*****************************************************************************/ +static int _TranslateResolveCpp( srcidc, dstidc, outcpp) +UdpPtr srcidc; +UdpPtr dstidc; +UdpPtr *outcpp; +{ + long int width, height, status; + UdpRec tmpsrc, tmpdst; + UdpPtr newcpp; + + if( srcidc == NULL || srcidc->UdpA_Base == NULL ) + /* Source does not have a CPP */ + if( dstidc == NULL || dstidc->UdpA_Base == NULL ) + /* There is no CPP at all */ + newcpp = NULL; + else + { + /* Only the destination is a CPP */ + newcpp = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( newcpp == NULL ) return( BadAlloc ); + *newcpp = *dstidc; + } + else + /* Source does have a CPP */ + if( dstidc == NULL || dstidc->UdpA_Base == NULL ) + { + /* Only the source has a CPP. Adjust its position to be + * relative to the destination. + */ + newcpp = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( newcpp == NULL ) return( BadAlloc ); + *newcpp = *srcidc; + newcpp->UdpL_X1 = dstidc->UdpL_X1; + newcpp->UdpL_X2 = dstidc->UdpL_X2; + newcpp->UdpL_Y1 = dstidc->UdpL_Y1; + newcpp->UdpL_Y2 = dstidc->UdpL_Y2; + } + else + { + /* Both IDC's contained a CPP. Use the intersection. */ + newcpp = (UdpPtr) DdxMalloc_(sizeof(UdpRec)); + if( newcpp == NULL ) return( BadAlloc ); + + /* Align the two input CPP's at upper left corner */ + tmpsrc = *srcidc; + tmpsrc.UdpL_X2 = tmpsrc.UdpL_X2 - tmpsrc.UdpL_X1; + tmpsrc.UdpL_Y2 = tmpsrc.UdpL_Y2 - tmpsrc.UdpL_Y1; + tmpsrc.UdpL_X1 = 0; + tmpsrc.UdpL_Y1 = 0; + + tmpdst = *dstidc; + tmpdst.UdpL_X2 = tmpdst.UdpL_X2 - tmpdst.UdpL_X1; + tmpdst.UdpL_Y2 = tmpdst.UdpL_Y2 - tmpdst.UdpL_Y1; + tmpdst.UdpL_X1 = 0; + tmpdst.UdpL_Y1 = 0; + + /* Create the new, intersected CPP */ + width = Min_(srcidc->UdpL_PxlPerScn, dstidc->UdpL_PxlPerScn); + height = Min_(srcidc->UdpL_ScnCnt, dstidc->UdpL_ScnCnt); + + newcpp->UdpW_PixelLength = 1; + newcpp->UdpB_DType = UdpK_DTypeVU; + newcpp->UdpB_Class = UdpK_ClassUBA; + newcpp->UdpL_PxlStride = 1; + newcpp->UdpL_ScnStride = width; + newcpp->UdpL_X1 = 0; + newcpp->UdpL_X2 = width - 1; + newcpp->UdpL_Y1 = 0; + newcpp->UdpL_Y2 = height - 1; + newcpp->UdpL_PxlPerScn = width; + newcpp->UdpL_ScnCnt = height; + newcpp->UdpL_Pos = 0; + newcpp->UdpL_CompIdx = 0; + newcpp->UdpL_Levels = 2; + newcpp->UdpL_ArSize = height * width; + newcpp->UdpA_Base = DdxMallocBits_(newcpp->UdpL_ArSize); + status = DdxLogical_(&tmpsrc,&tmpdst, NULL, newcpp, NULL, XieK_AND); + if( status != Success ) + { + DdxFree_(newcpp); + return( status ); + } + newcpp->UdpL_X1 = dstidc->UdpL_X1; + newcpp->UdpL_X2 = dstidc->UdpL_X1 + width - 1; + newcpp->UdpL_Y1 = dstidc->UdpL_Y1; + newcpp->UdpL_Y2 = dstidc->UdpL_Y1 + height - 1; + } + *outcpp = newcpp; + + return( Success ); +} + +/***************************************************************************** +** _TranslateNxtSrc1Data +** +** FUNCTIONAL DESCRIPTION: +** +** Attempt to read the next quantum of translated (src1) data +** for the specified component. The size of the quantum is set +** based on the state of that component. +** +** FORMAL PARAMETERS: +** +** ctx - Pipe context pointer +** comp - Component to read +** +** FUNCTION VALUE: +** +** Pointer to the data segmnt read, or error code. +** +*****************************************************************************/ +static PipeDataPtr _TranslateNxtSrc1Data( ctx, comp ) + TranslatePipeCtxPtr ctx; + int comp; +{ + PipeDataPtr src; + int quantum; + int next_state; + + quantum = 0; + + if ( TrnDat1_(ctx, comp) != NULL ) + src = TrnDat1_(ctx, comp); /* Already have the segment */ + + else { + next_state = TrnSrc1State_(ctx, comp); + switch (TrnSrc1State_(ctx, comp)) { + case 0 : + /* Get all the data before the source ROI */ + quantum = TrnSrcY1_(ctx) - SnkY1_(TrnSrcSnk1_(ctx), comp); + next_state++; + if (quantum != 0) break; + /* else fall through */ + case 1 : + /* Get all the data within the source ROI */ + quantum = TrnSrcY2_(ctx) - TrnSrcY1_(ctx) + 1; + next_state++; + if (quantum != 0) break; + + case 2 : + /* Get all the data after the source ROI */ + quantum = SnkY2_(TrnSrcSnk1_(ctx), comp) - TrnSrcY2_(ctx); + next_state++; + break; + + default : + /* Something is amiss */ + return( (PipeDataPtr)BadImplementation ); + } + + DdxRmSetQuantum_( TrnSrcDrn1_(ctx,comp), quantum ); + src = DdxRmGetData_( ctx, TrnSrcDrn1_(ctx,comp) ); + if (IsPointer_(src)) + TrnSrc1State_(ctx,comp) = next_state; + } + + return( src ); +} diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiTranslate.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiTranslate.h new file mode 100644 index 0000000..4602261 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiTranslate.h @@ -0,0 +1,159 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the TRANSLATE pipeline element module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.0 +** VAX ULTRIX V3.1 +** RISC ULTRIX V3.1 +** +** AUTHOR(S): +** +** Gary Grebus +** +** CREATION DATE: +** +** Wed Jul 11 10:29:06 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMITRANSLATE +#define _SMITRANSLATE + +/* +** Include files +*/ +#include + + /* + ** Function reference + */ +int SmiCreateTranslate(); +int SmiTranslate(); + +/* +** Structure definitions and Typedefs +*/ + +/* +** Translate pipeline context block. +*/ +typedef struct _TranslatePipeCtx { + PipeElementCommonPart common; + struct _TranslatePart { + PipeSinkPtr src1; + PipeSinkPtr src2; + PipeSinkPtr dst; + UdpPtr srcidc; + UdpPtr dstidc; + int srcx1; + int srcy1; + int srcy2; + int x1; + int x2; + int y1; + int y2; + int src1state[XieK_MaxComponents]; + int ncmp; + UdpPtr cpp; + PipeDataPtr srcdat1[XieK_MaxComponents]; + PipeDataPtr srcdat2; + PipeDrainPtr srcdrn1[XieK_MaxComponents]; + PipeDrainPtr srcdrn2; + } TranslatePart; +} TranslatePipeCtx, *TranslatePipeCtxPtr; + +/* +** MACRO definitions +*/ + +/* +** Pipeline context, Translate part, access MACROs +*/ +#define TrnSrcDrn1_(ctx,cmp) \ + (((TranslatePipeCtxPtr)(ctx))->TranslatePart.srcdrn1[cmp]) +#define TrnSrcDrn2_(ctx) (((TranslatePipeCtxPtr)(ctx))->TranslatePart.srcdrn2) +/* +** Translate Parameters +*/ +#define TrnSrcSnk1_(ctx) (((TranslatePipeCtxPtr)(ctx))->TranslatePart.src1) +#define TrnSrcSnk2_(ctx) (((TranslatePipeCtxPtr)(ctx))->TranslatePart.src2) +#define TrnDstSnk_(ctx) (((TranslatePipeCtxPtr)(ctx))->TranslatePart.dst) +#define TrnSrcX1_(ctx) (((TranslatePipeCtxPtr)(ctx))->TranslatePart.srcx1) +#define TrnSrcY1_(ctx) (((TranslatePipeCtxPtr)(ctx))->TranslatePart.srcy1) +#define TrnSrcY2_(ctx) (((TranslatePipeCtxPtr)(ctx))->TranslatePart.srcy2) +#define TrnRoiX1_(ctx) (((TranslatePipeCtxPtr)(ctx))->TranslatePart.x1) +#define TrnRoiX2_(ctx) (((TranslatePipeCtxPtr)(ctx))->TranslatePart.x2) +#define TrnRoiY1_(ctx) (((TranslatePipeCtxPtr)(ctx))->TranslatePart.y1) +#define TrnRoiY2_(ctx) (((TranslatePipeCtxPtr)(ctx))->TranslatePart.y2) +#define TrnSrc1State_(ctx, cmp)\ + (((TranslatePipeCtxPtr)(ctx))->TranslatePart.src1state[cmp]) + +#define TrnNcmp_(ctx) (((TranslatePipeCtxPtr)(ctx))->TranslatePart.ncmp) +#define TrnSrcIdc_(ctx) (((TranslatePipeCtxPtr)(ctx))->TranslatePart.srcidc) +#define TrnDstIdc_(ctx) (((TranslatePipeCtxPtr)(ctx))->TranslatePart.dstidc) +#define TrnCpp_(ctx) (((TranslatePipeCtxPtr)(ctx))->TranslatePart.cpp) +#define TrnDat1_(ctx,cmp) \ + (((TranslatePipeCtxPtr)(ctx))->TranslatePart.srcdat1[cmp]) +#define TrnDat2_(ctx) (((TranslatePipeCtxPtr)(ctx))->TranslatePart.srcdat2) + +#endif +/* _SMITRANSLATE */ diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiUtil.c b/xie/docs/dec/xie23-src/server/xie/smi/SmiUtil.c new file mode 100644 index 0000000..5713d07 --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiUtil.c @@ -0,0 +1,397 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ + +/*********************************************************** +Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This module contains various utility routines. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Sat Mar 31 13:45:36 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ + +/* +** Definition to let include files know who's calling. +*/ +#define _SmiUtil + +/* +** Include files +*/ +#include +#include /* XIE device dependant definitions */ +#include /* UDP definitions */ + +/* +** Table of contents +*/ +int SmiCmpPreferred(); +void SmiCopyBits(); +int SmiResolveUdp(); +int SmiUsingCL(); + +/* +** MACRO definitions +*/ + +/* +** Equated Symbols +*/ +#define Success 0 +#define NoIntersect 1 +#define FALSE 0 +#define TRUE 1 +/* +** External References +*/ + +/* +** Local Storage +*/ + +/**************************************************************************** +** SmiCmpPreferred +** +** FUNCTIONAL DESCRIPTION: +** +** Answers the question: Does this DDX prefer to keep permanent data +** of the specified compression type in compressed form? +** +** Compressed form is preferred when the storage and conversion +** overhead of uncompressed data exceeds the overhead of decompressing +** the data each time it must be used. +** +** +** FORMAL PARAMETERS: +** type - compression type +** +** FUNCTION VALUE: +** TRUE or FALSE +** +*****************************************************************************/ +int SmiCmpPreferred( type ) + int type; +{ + switch (type) + { + + case XieK_G31D : + case XieK_G32D : + case XieK_G42D : + case XieK_DCT : + return( FALSE ); + + default: + return( FALSE ); + + } +} + +/***************************************************************************** +** SmiCopyBits +** +** FUNCTIONAL DESCRIPTION: +** +** This routine copies (in a semi-optimized way) a string of bits from +** one arbitrary location to another. +** +** FORMAL PARAMETERS: +** +** in - input buffer pointer +** inofs - bit offset into input buffer +** out - output buffer pointer +** outofs - bit offset into output buffer +** count - number of bits to copy +** +*****************************************************************************/ +void SmiCopyBits(in, inofs, out, outofs, count) + char *in; + long inofs; + char *out; + long outofs; + long count; +{ + char *src, *dst; + int in_align_bits; + int out_align_bits; + unsigned int out_align_mask; + + int remainder; + + char *limit; + unsigned char temp; + + /* Compute amount by which bit streams are offset from being + * byte aligned. + */ + + in_align_bits = inofs & 7; + out_align_bits = outofs & 7; + + if (in_align_bits == 0) { + + if (out_align_bits == 0){ + + /* This is the easy case - both sides are byte aligned */ + remainder = count & 7; + + in+=(inofs>>3); + inofs = 0; + + out+=(outofs>>3); + outofs = 0; + + limit = in + (count >> 3); + + while (in < limit) + *out++ = *in++; + } else { + + /* The input is byte aligned. Fetch bytes, and store + * unaligned 8 bits chunks. */ + remainder = count & 7; + + in+=(inofs>>3); + inofs = 0; + + limit = in + (count >> 3); + + while (in < limit ) { + PUT_VALUE_(out, outofs, *in++, 0xff); + outofs+=8; + } + + } + + } else { + /* Input is not byte aligned */ + + if (out_align_bits != 0) { + + /* Neither stream is byte aligned. Align the output stream */ + out_align_mask = (1<<(8 - out_align_bits)) -1; + temp = GET_VALUE_(in, inofs, out_align_mask); + PUT_VALUE_(out, outofs, temp, out_align_mask); + + inofs += (8-out_align_bits); + outofs += (8-out_align_bits); + count -= (8-out_align_bits); + } + + /* The output is (now) byte aligned. Fetch 8 bits, store bytes */ + remainder = count & 7; + + out += (outofs>>3); + outofs = 0; + + limit = out + (count >> 3); + + while (out < limit ) { + temp = GET_VALUE_( in, inofs, 0xff); + *out++ = temp; + inofs+=8; + } + } + + /* Move the leftover (not multiple of a byte) bits. + * At this point in:inofs have been advanced to point to + * the source of the remaining bits, and out:outofs have been + * been advanced to point to the destination */ + if (remainder > 0) { + temp = GET_VALUE_(in, inofs, ((1<UdpL_X1 > idudp->UdpL_X1 ? isudp->UdpL_X1 : idudp->UdpL_X1; + Y1 = isudp->UdpL_Y1 > idudp->UdpL_Y1 ? isudp->UdpL_Y1 : idudp->UdpL_Y1; + X2 = isudp->UdpL_X2 < idudp->UdpL_X2 ? isudp->UdpL_X2 : idudp->UdpL_X2; + Y2 = isudp->UdpL_Y2 < idudp->UdpL_Y2 ? isudp->UdpL_Y2 : idudp->UdpL_Y2; + /* + ** If a ROI was also specified, intersect that with what we have thus + ** far. + */ + if (irudp != NULL) + { + X1 = X1 > irudp->UdpL_X1 ? X1 : irudp->UdpL_X1; + Y1 = Y1 > irudp->UdpL_Y1 ? Y1 : irudp->UdpL_Y1; + X2 = X2 < irudp->UdpL_X2 ? X2 : irudp->UdpL_X2; + Y2 = Y2 < irudp->UdpL_Y2 ? Y2 : irudp->UdpL_Y2; + } + /* + ** Check to make sure these UDPs do actually have an intersection. + */ + if (X1 > X2 || Y1 > Y2) + { + return NoIntersect; + } + /* + ** Now, adjust the output source UDP to describe only the bounding region. + */ + *osudp = *isudp; + + osudp->UdpL_Pos += (Y1 - osudp->UdpL_Y1) * osudp->UdpL_ScnStride + + (X1 - osudp->UdpL_X1) * osudp->UdpL_PxlStride; + osudp->UdpL_PxlPerScn = X2 - X1 + 1; + osudp->UdpL_ScnCnt = Y2 - Y2 + 1; + osudp->UdpL_X1 = X1; + osudp->UdpL_Y1 = Y1; + osudp->UdpL_X2 = X2; + osudp->UdpL_Y2 = Y2; + /* + ** Same for destination... + */ + *odudp = *idudp; + + odudp->UdpL_Pos += (Y1 - odudp->UdpL_Y1) * odudp->UdpL_ScnStride + + (X1 - odudp->UdpL_X1) * odudp->UdpL_PxlStride; + odudp->UdpL_PxlPerScn = X2 - X1 + 1; + odudp->UdpL_ScnCnt = Y2 - Y2 + 1; + odudp->UdpL_X1 = X1; + odudp->UdpL_Y1 = Y1; + odudp->UdpL_X2 = X2; + odudp->UdpL_Y2 = Y2; + /* + ** If ROI specified, then that too... + */ + if (irudp != NULL) + { + *orudp = *irudp; + + orudp->UdpL_Pos += (Y1 - orudp->UdpL_Y1) * orudp->UdpL_ScnStride + + (X1 - orudp->UdpL_X1) * orudp->UdpL_PxlStride; + orudp->UdpL_PxlPerScn = X2 - X1 + 1; + orudp->UdpL_ScnCnt = Y2 - Y2 + 1; + orudp->UdpL_X1 = X1; + orudp->UdpL_Y1 = Y1; + orudp->UdpL_X2 = X2; + orudp->UdpL_Y2 = Y2; + } + + return Success; +} + +/**************************************************************************** +** SmiUsingCL +** +** FUNCTIONAL DESCRIPTION: +** +** This function is the SMI version of the changelist support check +** used in XieTransport.c to determine if the DDX does changelists. +** The SMI DDX does not, so this function just returns false. +** +** FORMAL PARAMETERS: +** +** None. +** +** FUNCTION VALUE: +** +** FALSE == no change list support +** +*****************************************************************************/ +int SmiUsingCL() +{ + return( FALSE ); +} diff --git a/xie/docs/dec/xie23-src/server/xie/smi/SmiUtil.h b/xie/docs/dec/xie23-src/server/xie/smi/SmiUtil.h new file mode 100644 index 0000000..4e9e4da --- /dev/null +++ b/xie/docs/dec/xie23-src/server/xie/smi/SmiUtil.h @@ -0,0 +1,92 @@ +/* + * ***************************************************************** + * * * + * * Copyright (c) Digital Equipment Corporation, 1991, 1994 * + * * * + * * All Rights Reserved. Unpublished rights reserved under * + * * the copyright laws of the United States. * + * * * + * * The software contained on this media is proprietary to * + * * and embodies the confidential technology of Digital * + * * Equipment Corporation. Possession, use, duplication or * + * * dissemination of the software and media is authorized only * + * * pursuant to a valid written license from Digital Equipment * + * * Corporation. * + * * * + * * RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * + * * by the U.S. Government is subject to restrictions as set * + * * forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * + * * or in FAR 52.227-19, as applicable. * + * * * + * ***************************************************************** + */ +/* + * HISTORY + */ +/******************************************************************************* +** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/***************************************************************************** +** +** FACILITY: +** +** X Imaging Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** This is the header file for the UTILity module. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** +** AUTHOR(S): +** +** Richard Hennessy +** +** CREATION DATE: +** +** September 25, 1990 +** +** MODIFICATION HISTORY: +** +*****************************************************************************/ +#ifndef _SMIUTIL +#define _SMIUTIL + + /* + ** Include files + */ + + /* + ** Function reference + */ +int SmiCmpPreferred(); +void SmiCopyBits(); +int SmiResolveUdp(); +int SmiUsingCL(); + +#endif +/* _SMIUTIL */ diff --git a/xie/docs/dec/xie23/README.md b/xie/docs/dec/xie23/README.md new file mode 100644 index 0000000..24641ce --- /dev/null +++ b/xie/docs/dec/xie23/README.md @@ -0,0 +1,121 @@ +# DEC XIE 2.3 development kit (recovered from DEC OSF/1 media) + +`XieProto.h` declares the protocol this directory was recovered for: + +```c +#define XieK_MajorVersion 2 +#define XieK_MinorVersion 3 +``` + +This is the **DEC** XIE, not the X Consortium/MIT lineage: the header is DEC's own +(`Copyright 1989-1991 by Digital Equipment Corporation ... and the Massachusetts +Institute of Technology`), lives under `include/dec/extensions/`, and its revision +log says *"Update to XIE VN/ALPHA_BL1 baselevel, 92/04/06"*. + +It is the artefact the VT1200 work needed: the terminal speaks XIE 2.3 with 46 minor +slots, and `XieProto.h` gives that numbering and the request structures. + +## Provenance + +Recovered 2026-11-01 from DEC OSF/1 install media at +`https://fsck.technology/software/DEC-Compaq/Digital%20OSF1%20Install%20Media/`. +Those CDs are **UFS1 images**, not ISO-9660; they mount with +`mount -t ufs -o ro,loop,ufstype=old`, and the install kits inside are +`compress(1)`-ed tar archives. + +| local path | came from | original member | +|---|---|---| +| `include/dec/extensions/Xie*.h` | DEC OSF/1 2.0 (DECstation) media, X11 development kit | `BL8_2kits/f109.OSFXDEV200.tar.Z` → `./usr/include/dec/extensions/` | +| `lib/osf1-2.0-decstation/libXie.a` | same kit | `./usr/lib/libXie.a` | +| `man/*.3X` (84 pages) | DEC OSF/1 2.0 (DECstation), man-pages kit | `BL8_2kits/f131.OSFMANWS200.tar.Z` → `./usr/share/man/man3x/` | +| `lib/osf1-1.2-alpha/libXie.a` | DEC OSF/1 1.3a (AXP) OS CD, X11 dev kit | `ALPHA/BASE/OSFXDEV120` | +| `lib/osf1-1.2-alpha/libXie.so` | DEC OSF/1 1.3a (AXP) OS CD, X11 runtime | `ALPHA/BASE/OSFX11120` → `./usr/shlib/libXie.so` | +| `server/osf1-1.2-alpha/lib_dec_xie.so` | DEC OSF/1 1.3a (AXP) OS CD, server kit | `ALPHA/BASE/OSFSER120` → `./usr/shlib/Xserver/lib_dec_xie.so` | + +Media used (local copies, outside the repo): + +``` +/home/arti/code/k-space/dec-media/osf1-2.0-decstation.zip 125,721,389 bytes +/home/arti/code/k-space/dec-media/osf1-1.3a-os.iso 614,711,296 bytes +``` + +## Protocol request minor opcodes (`XieProto.h`) + +``` + 1 InitSession 12 AbortPhotoflo 23 Import + 2 TermSession 13 ExecutePhotoflo 24 QueryExport + 3 QueryEvents 14 TapPhotoflo 25 Area + 4 SelectEvents 15 AbortTransport 26 AreaStats + 5 SetOpDefaults 16 GetStream 27 Arith + 6 QueryOpDefaults 17 GetTile 28 CalcHist + 7 CreateByReference 18 PutStream 29 ChromeCom + 8 CreateByValue 19 PutTile 30 ChromeSep + 9 DeleteResource 20 SetTransport 31 Compare +10 QueryResource 21 Export 32 Constrain +11 BindPhotomap 22 FreeExport 33 Crop + 34 Dither 37 Luminance 40 Mirror 43 Rotate + 35 Fill 38 MatchHistogram 41 Point 44 Scale + 36 Logical 39 Math 42 PointStats 45 Translate + 46 LastRequest +``` + +Fixed packet sizes are declared alongside (`sz_xieCreateCppReq 24`, +`sz_xiePutTileReq 32`, `sz_xieCreatePhotoReq 48`, `sz_xieSetOpDefaultsReq 20`, ...), +and the full request/reply structs follow them in the same header. + +### Cross-check against the live VT1200 (observed by the peer session) + +| VT1200 slot | observed behaviour | this header says | +|---|---|---| +| 1 | 2 words, replies `2.3` | `InitSession`, `sz_xieInitSessionReq 8` | +| 2 | 1 word, success, no reply | `TermSession`, `sz_xieTermSessionReq 4` | +| 6 | bare header, empty reply | `QueryOpDefaults`, `sz_xieQueryOpDefaultsReq 4` | +| 11 | 3 words, id at byte 4 | `BindPhotomap` | +| 19 | PUT_TILE, 8+ words | `PutTile`, `sz_xiePutTileReq 32` | +| 20 | fixed 35-word request | `SetTransport` | +| 21 | 16 words | `Export` | +| 23 | `BadRequest` (not implemented) | `Import` | +| 24 | 4 words, id at byte 4 | `QueryExport` | + +Every slot lines up, which is what makes this the period numbering rather than a +coincidence. + +## What is here + +``` +include/dec/extensions/ XieProto.h XieLib.h XieAppl.h XieDdx.h + XiePipeInterface.h XieUdpDef.h XieFloat.h +lib/osf1-2.0-decstation/ libXie.a (MIPS/DECstation, 150,252 bytes) +lib/osf1-1.2-alpha/ libXie.a libXie.so (Alpha, Feb 1993) +server/osf1-1.2-alpha/ lib_dec_xie.so (Alpha X server XIE module, + XieDixProc / SProcXie*) +man/ 84 Xie*.3X man pages (DEC 1992 client API reference, + with C examples) +``` + +## md5 + +``` +0e75e976c8775ecf3edf36d11814b6bb include/dec/extensions/XieAppl.h +235c34478efd18f3c50ff02b4bc1865d include/dec/extensions/XieDdx.h +35cbcb18037d7cedb6cc3b27c13807a1 include/dec/extensions/XieFloat.h +fdcff8c986142092c6caf621e1aee4a0 include/dec/extensions/XieLib.h +8644b708a1c0124d473e0c401beec344 include/dec/extensions/XiePipeInterface.h +ea36374201767e926d23e77f8a778677 include/dec/extensions/XieProto.h +3b9ce78a243dc043749dd16c36301a18 include/dec/extensions/XieUdpDef.h +08cee42c88c71e15c3bc25faefff269c lib/osf1-1.2-alpha/libXie.a +8d24d55b571e61a2f544bc040eb7536b lib/osf1-1.2-alpha/libXie.so +09f483d8570fd1f899c78439ccd6a4b1 lib/osf1-2.0-decstation/libXie.a +eb4135366a136a4de03cb5e3ba83dc57 server/osf1-1.2-alpha/lib_dec_xie.so +``` + +## Negative results worth not repeating + +- **DEC OSF/1 1.3a layered-products CD** (Dec 1992): 14 products + (`AVO410 CXX120 DFA330 DMG320 DNA100 DPO500 FUS120 GKO510 KPC100 KPF100 + ODB110 PHO240 XML200 XXA100`) — no XIE, no DECimage. +- **Tru64 UNIX 4.0F** ships XIE 5.0 only (`xieMajorVersion 5`), and its four + `X11/extensions/XIE*.h` are **byte-identical to the MIT X11R6.1 copies**. +- **Ultrix CONDIST Oct93–May95** (VAX + RISC): `DECimage` appears only as + "DECimage Character Recognition 1.1" (UPI `MH5AA`, `/irs110`). +- **Ultrix 4.5 OS kit** (85 subsets, 13,679 members): no XIE file, no `libXie`. diff --git a/xie/docs/dec/xie23/include/dec/extensions/XieAppl.h b/xie/docs/dec/xie23/include/dec/extensions/XieAppl.h new file mode 100644 index 0000000..34e7791 --- /dev/null +++ b/xie/docs/dec/xie23/include/dec/extensions/XieAppl.h @@ -0,0 +1,287 @@ +/* + * @DEC_COPYRIGHT@ + */ +/* + * HISTORY + * $Log: XieAppl.h,v $ + * Revision 1.2.2.3 92/04/06 08:16:23 Gary_Grebus + * Update to XIE VN/ALPHA_BL1 baselevel. + * [92/03/11 07:11:11 Gary_Grebus] + * + * Revision 1.2 91/12/30 12:48:20 devbld + * Initial load of project + * + * $EndLog$ + */ +/* BuildSystemHeader added automatically */ +/* $Header: /b5/aguws3.0/aguws3.0_rcs/src/dec/extensions/include/XieAppl.h,v 1.2.2.3 92/04/06 08:16:23 Gary_Grebus Exp $ */ +/******************************************************************************* +** Copyright 1989-1991 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Image Extension +** Sample Machine Independant DDX +** +** ABSTRACT: +** +** The Xie module contains definitions used by all of the XIE layers +** -- from the applications level through the XIE server levels. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Richard J. Piccolo +** Robert NC Shelley +** +** CREATION DATE: +** +** April 20, 1989 +** +************************************************************************/ + + /* + ** Symbol XIEAPPL allows XieAppl.h to be included multiple times. + */ +#ifndef XIEAPPL +#define XIEAPPL /* The "endif" MUST be the last line of this file. */ + +/***************************************************************************** +** Constants +*****************************************************************************/ + /* + ** X Image Extension name string + */ +#define XieS_Name "Xie" + + /* + ** Number of supported Events and Errors + */ +#define XieK_NumErrors 0 +#define XieK_NumEvents 3 + /* + ** Xie Event constants + */ +#define XieK_ComputationEvent 0 +#define XieK_PhotofloEvent 1 +#define XieK_DisplayEvent 2 + /* + ** Xie Event masks + */ +#define XieM_ComputationEvent (1< +#else +#include +#endif +#endif /* XIEAPPL */ + +/* +** MACRO definitions +*/ + /* + ** Return the minimum number of bits required to contain the specified + ** number of levels. Levels == 0 indicates unconstrained data of type + ** float. <<<< remember to include math.h >>>> + */ +#define BitsFromLevels_(levels) \ + ((levels) > 2 ? ((int)(ceil(log10((double)levels)/log10(2.0)))) : \ + (levels) > 0 ? 1 : sizeof(float) * 8) + /* + ** Determine if a value is a valid pointer or an error code. + ** <<<< remember to include X.h >>>> + */ +#ifdef BadImplementation +#define IsPointer_(ptr) (((unsigned)(ptr)) > BadImplementation) +#endif + /* + ** Convenience macros for accessing generic UdpPtr fields. + */ +#define upPxlLen_(udp) ((udp)->UdpW_PixelLength) +#define upDType_(udp) ((udp)->UdpB_DType) +#define upClass_(udp) ((udp)->UdpB_Class) +#define upBase_(udp) ((udp)->UdpA_Base) +#define upArSize_(udp) ((udp)->UdpL_ArSize) +#define upPxlStr_(udp) ((udp)->UdpL_PxlStride) +#define upScnStr_(udp) ((udp)->UdpL_ScnStride) +#define upX1_(udp) ((udp)->UdpL_X1) +#define upX2_(udp) ((udp)->UdpL_X2) +#define upY1_(udp) ((udp)->UdpL_Y1) +#define upY2_(udp) ((udp)->UdpL_Y2) +#define upWidth_(udp) ((udp)->UdpL_PxlPerScn) +#define upHeight_(udp) ((udp)->UdpL_ScnCnt) +#define upPos_(udp) ((udp)->UdpL_Pos) +#define upCmpIdx_(udp) ((udp)->UdpL_CompIdx) +#define upLvl_(udp) ((udp)->UdpL_Levels) + /* + ** Convenience macros for accessing generic UdpRec fields. + */ +#define urPxlLen_(udp) ((udp).UdpW_PixelLength) +#define urDType_(udp) ((udp).UdpB_DType) +#define urClass_(udp) ((udp).UdpB_Class) +#define urBase_(udp) ((udp).UdpA_Base) +#define urArSize_(udp) ((udp).UdpL_ArSize) +#define urPxlStr_(udp) ((udp).UdpL_PxlStride) +#define urScnStr_(udp) ((udp).UdpL_ScnStride) +#define urX1_(udp) ((udp).UdpL_X1) +#define urX2_(udp) ((udp).UdpL_X2) +#define urY1_(udp) ((udp).UdpL_Y1) +#define urY2_(udp) ((udp).UdpL_Y2) +#define urWidth_(udp) ((udp).UdpL_PxlPerScn) +#define urHeight_(udp) ((udp).UdpL_ScnCnt) +#define urPos_(udp) ((udp).UdpL_Pos) +#define urCmpIdx_(udp) ((udp).UdpL_CompIdx) +#define urLvl_(udp) ((udp).UdpL_Levels) + + /* + ** The _MD forms access memory in machine-dependant (bigendian or + ** littleendian) format. The other forms access memory in + ** image format, which is always little endian. + */ +#ifdef vax +#define READ32_(address) \ + (*((int *)(address))) +#define READ32_MD READ32_ +#else + /* + ** For machine architectures that can't access longwords + ** on non-longword aligned boundaries. + ** The (unsigned int) casts seem redundant, but they are needed + ** to make the ULTRIX/RISC compiler happy. + */ +#define READ32_(address) \ + ((unsigned int) *((unsigned char *)(address)) + \ + ((unsigned int) *(((unsigned char *)(address))+1)<< 8) + \ + ((unsigned int) *(((unsigned char *)(address))+2)<<16) + \ + ((unsigned int) *(((unsigned char *)(address))+3)<<24)) +#endif + +#ifdef BIGENDIAN +#define READ32_MD(address) \ + (*(((unsigned char *)(address))+3) + \ + (*(((unsigned char *)(address))+2)<< 8) + \ + (*(((unsigned char *)(address))+1)<<16) + \ + (* ((unsigned char *)(address)) <<24)) +#else +#define READ32_MD READ32_ +#endif + +#define GET_VALUE_(base,offset,mask) \ + (READ32_((base)+((offset)>>3))>>((offset)&7)&(mask)) +#define GET_VALUE_MD(base,offset,mask) \ + (READ32_MD((base)+((offset)>>3))>>((offset)&7)&(mask)) + +#ifdef vax +#define WRITE32_(address,value) \ + (*((int *)(address)) = (int)(value)) +#define WRITE32_MD WRITE32_ +#else +#define WRITE32_(address,value) \ + ((* ((unsigned char *)(address)) = ((int)(value)) &0xff), \ + (*(((unsigned char *)(address))+1) = (((int)(value))>> 8)&0xff), \ + (*(((unsigned char *)(address))+2) = (((int)(value))>>16)&0xff), \ + (*(((unsigned char *)(address))+3) = (((int)(value))>>24)&0xff)) +#ifdef BIGENDIAN +#define WRITE32_MD(address,value) \ + ((*(((unsigned char *)(address))+3) = ((int)(value)) &0xff), \ + (*(((unsigned char *)(address))+2) = (((int)(value))>> 8)&0xff), \ + (*(((unsigned char *)(address))+1) = (((int)(value))>>16)&0xff), \ + (* ((unsigned char *)(address)) = (((int)(value))>>24)&0xff)) +#else +#define WRITE32_MD WRITE32_ +#endif +#endif + +#ifdef vax +#define XOR_WRITE32_(address,value) \ + (*((int *)(address)) ^= (int)(value)) +#define XOR_WRITE32_MD XOR_WRITE32_ +#else +#define XOR_WRITE32_(address,value) \ + ((* ((unsigned char *)(address)) ^= ((int)(value)) &0xff), \ + (*(((unsigned char *)(address))+1) ^= (((int)(value))>> 8)&0xff), \ + (*(((unsigned char *)(address))+2) ^= (((int)(value))>>16)&0xff), \ + (*(((unsigned char *)(address))+3) ^= (((int)(value))>>24)&0xff)) +#ifdef BIGENDIAN +#define XOR_WRITE32_MD(address,value) \ + ((*(((unsigned char *)(address))+3) ^= ((int)(value)) &0xff), \ + (*(((unsigned char *)(address))+2) ^= (((int)(value))>> 8)&0xff), \ + (*(((unsigned char *)(address))+1) ^= (((int)(value))>>16)&0xff), \ + (*(((unsigned char *)(address)) ^= (((int)(value))>>24)&0xff)) +#else +#define XOR_WRITE32_MD XOR_WRITE32_ +#endif +#endif + +#define PUT_VALUE_(base,offset,value,mask) \ + (WRITE32_((base)+((offset)>>3), \ + READ32_((base)+((offset)>>3)) & ~((mask)<<((offset)&7)) \ + | (((mask)&(value))<<((offset)&0x7)))) + +#define PUT_VALUE_MD(base,offset,value,mask) \ + (WRITE32_MD((base)+((offset)>>3), \ + READ32_MD((base)+((offset)>>3)) & ~((mask)<<((offset)&7)) \ + | (((mask)&(value))<<((offset)&0x7)))) + + + /* + ** Degrees to radians conversion factor -- with inverted Y axis. + */ +#define RADIANS_PER_DEGREE -0.0174532925199432959 + /* + ** These symbols define valid UdpRec data type and class combinations. + */ +#define XieK_UBAVU 0 /* unaligned bit array */ +#define XieK_UBAV 1 /* unaligned bit array that is aligned ?? */ +#define XieK_UBSVU 2 /* unaligned bit stream */ +#define XieK_UBSV 3 /* unaligned bit stream that is aligned ?? */ +#define XieK_CLCL 4 /* change list */ +#define XieK_ABU 5 /* aligned byte array */ +#define XieK_AF 6 /* aligned float array */ +#define XieK_AWU 7 /* aligned word array */ +/* Not yet implemented +#define XieK_ALU 8 +*/ +#define XieK_DATA_TYPE_COUNT 8 + + /* + ** Defs for DDX table entry points + */ +#ifndef externalref +#if (defined(VMS) && defined(VAXC)) +#define externalref globalref +#else +#define externalref extern +#endif +#endif + + /* + ** Typedefs + */ +typedef unsigned long card32; +typedef unsigned long (*Fcard32)(); /* Used in DDX dispatch table */ + + /* + ** Data structures for passing Template IDC (kernel) data to DDX + ** routines. + */ +typedef struct { + float value; /* A template value */ + long int increment; /* Number of kernel elements skipped + * between previous and this element, + * plus 1. Zero marks end of row */ +} TmpDatEntryRec, *TmpDatEntryPtr; + +typedef struct { + long int center_x; /* Template center X coordinate */ + long int center_y; /* Template center Y coordinate */ + long int x_count; /* Template x dimension */ + long int y_count; /* Template y dimension */ + TmpDatEntryPtr array; /* Pointer to the template data + * records */ +} TmpDatRec, *TmpDatPtr; + +/***************************************************************************** +** +** Xie Ddx Index - +** +** FUNCTIONAL DESCRIPTION: +** +** The following symbols define the indices into the dispatch table +** used to call "atomic" DDX functions. These functions include both +** processing routines for the protocol functions and DDX support +** routines. +** +** WARNING: The indices here AND the order of the XieDdxProc table +** in SmiDdx.c MUST match. +** +*****************************************************************************/ + /* + ** Protocol processing routines + */ +#define D_dxArea 0 /* Protocol functions */ +#define D_dxStatsArea 1 +#define D_dxArith 2 +#define D_dxHistogram 3 +#define D_dxChromeCom 4 +#define D_dxChromeSep 5 +#define D_dxCompare 6 +#define D_dxConstrain 7 +#define D_dxCrop 8 +#define D_dxDither 9 +#define D_dxFill 10 +#define D_dxLogical 11 +#define D_dxLuminance 12 +#define D_dxMatchHistogram 13 +#define D_dxMath 14 +#define D_dxMirror 15 +#define D_dxPoint 16 +#define D_dxStatsPoint 17 +#define D_dxRotate 18 +#define D_dxScale 19 +#define D_dxTranslate 20 +#define D_dxRmOwnData 21 + /* 21..32 -- was Compression handlers */ + /* + ** DDX specific function indices + */ +#define D_dxInit 33 /* DDX Init routine */ +#define D_dxReset 34 /* " Reset */ +#define D_dxOptimizePipe 35 /* " Pipeline optimizer */ +#define D_dxConvert 36 /* Udp support routines */ +#define D_dxCopy 37 +#define D_dxGetTyp 38 +#define D_dxCopyBits 39 +#define D_dxResolveUdp 40 +#define D_dxCalloc 41 /* Memory mgt routines */ +#define D_dxCallocBits 42 +#define D_dxCfree 43 +#define D_dxFree 44 +#define D_dxFreeBits 45 +#define D_dxMalloc 46 +#define D_dxMallocBits 47 +#define D_dxRealloc 48 +#define D_dxReallocBits 49 +#define D_dxCreatePipeline 50 /* Pipeline routines */ +#define D_dxDestroyPipeline 51 +#define D_dxPipeHasYielded 52 /* was D_dxExecutePipeline */ +#define D_dxInitiatePipeline 53 +#define D_dxResumePipeline 54 +#define D_dxFlushPipeline 55 +#define D_dxAbortPipeline 56 +#define D_dxRmAllocData 57 /* Pipe resource mgr routines */ +#define D_dxRmAllocDataDesc 58 +#define D_dxRmAllocPermDesc 59 +#define D_dxRmAllocRefDesc 60 +#define D_dxRmBestDType 61 +#define D_dxRmCreateDrain 62 +#define D_dxRmCreateSink 63 +#define D_dxRmDeallocData 64 +#define D_dxRmDeallocDataDesc 65 +#define D_dxRmDestroyDrain 66 +#define D_dxRmDestroySink 67 +#define D_dxRmGetData 68 +#define D_dxRmGetDType 69 +#define D_dxRmGetMaxQuantum 70 +#define D_dxRmGetQuantum 71 +#define D_dxRmHasQuantum 72 +#define D_dxRmInitializePort 73 +#define D_dxRmMergeBuffers 75 +#define D_dxRmObtainQuantum 76 +#define D_dxRmPutData 77 +#define D_dxRmSetDType 78 +#define D_dxRmSetQuantum 79 +#define D_dxRmSplitBuffers 80 +#define D_dxSchedProcessComplete 81 /* Pipe scheduling routines */ +#define D_dxSchedProcessReady 82 +#define D_dxSchedOkToRun 83 +#define D_dxBuildChangeList 84 /* Change list routines */ +#define D_dxPutRuns 85 +#define D_dxFfsLong 86 +#define D_dxFfcLong 87 +#define D_dxFillRegion 88 /* Miscellaneous additions */ +#define D_dxConvertCpp 89 +#define D_dxCopyCpp 90 +#define D_dxEncodeG4 91 +#define D_dxEncodeDct 92 +#define D_dxDecodeG4 93 +#define D_dxDecodeDct 94 +#define D_dxPosCl 95 +#define D_dxCheckLicense 96 + /* More RM functions */ +#define D_dxRmAllocCmpDataDesc 97 /* was D_dxRmGetAlignment */ +#define D_dxRmSetAlignment 98 +#define D_dxRmCreateDataDesc 99 +#define D_dxCreatePipeCtx 100 +#define D_dxUsingCL 101 +#define D_dxCmpPreferred 102 /* was D_dxSmiDecodeG4IsAtomic */ +#define D_dxRmAllocDataArray 103 +#define D_dxRmAllocCmpPermDesc 104 +#define D_dxSchedProcessNoInput 105 + +/***************************************************************************** +** +** DDX Access Macros +** +** FUNCTIONAL DESCRIPTION: +** +** These macros provide access to the DDX functions while hiding +** the implementation from the caller. +** +*****************************************************************************/ + /* + ** DDX function access macro + ** This macro calls an arbitrary DDX routine through the + ** xieDdxProc dispatch table. + ** + ** func = the Mi function index from this file. + ** + */ +externalref card32 (*xieDdxProc[])(); +#define CallDdx_(func) (*(xieDdxProc)[func]) + /* + ** Image functions + */ +#define DdxArea_ CallDdx_(D_dxArea) +#define DdxStatsArea_ CallDdx_(D_dxStatsArea) +#define DdxArith_ CallDdx_(D_dxArith) +#define DdxHistogram_ CallDdx_(D_dxHistogram) +#define DdxChromeCom_ CallDdx_(D_dxChromeCom) +#define DdxChromeSep_ CallDdx_(D_dxChromeSep) +#define DdxCompare_ CallDdx_(D_dxCompare) +#define DdxConstrain_ CallDdx_(D_dxConstrain) +#define DdxCrop_ CallDdx_(D_dxCrop) +#define DdxDither_ CallDdx_(D_dxDither) +#define DdxFill_ CallDdx_(D_dxFill) +#define DdxLogical_ CallDdx_(D_dxLogical) +#define DdxLuminance_ CallDdx_(D_dxLuminance) +#define DdxMatchHistogram_ CallDdx_(D_dxMatchHistogram) +#define DdxMath_ CallDdx_(D_dxMath) +#define DdxMirror_ CallDdx_(D_dxMirror) +#define DdxPoint_ CallDdx_(D_dxPoint) +#define DdxStatsPoint_ CallDdx_(D_dxStatsPoint) +#define DdxRotate_ CallDdx_(D_dxRotate) +#define DdxScale_ CallDdx_(D_dxScale) +#define DdxTranslate_ CallDdx_(D_dxTranslate) +#define DdxRmOwnData_ CallDdx_(D_dxRmOwnData) + /* + ** Ddx specific functions + */ +#define DdxInit_ CallDdx_(D_dxInit) +#define DdxReset_ CallDdx_(D_dxReset) +#define DdxOptimizePipe_ CallDdx_(D_dxOptimizePipe) + /* + ** MI software functions + */ +#define DdxConvert_ CallDdx_(D_dxConvert) +#define DdxCopy_ CallDdx_(D_dxCopy) +#define DdxGetTyp_ CallDdx_(D_dxGetTyp) +#define DdxCopyBits_ CallDdx_(D_dxCopyBits) /* 65 */ +#define DdxResolveUdp_ CallDdx_(D_dxResolveUdp) + /* + ** Memory management routines + */ +#define DdxCalloc_ CallDdx_(D_dxCalloc) +#define DdxCallocBits_ (unsigned char *)CallDdx_(D_dxCallocBits) +#define DdxCfree_ CallDdx_(D_dxCfree) +#define DdxFree_ CallDdx_(D_dxFree) +#define DdxFreeBits_ (unsigned char *)CallDdx_(D_dxFreeBits) +#define DdxMalloc_ CallDdx_(D_dxMalloc) +#define DdxMallocBits_ (unsigned char *)CallDdx_(D_dxMallocBits) +#define DdxRealloc_ CallDdx_(D_dxRealloc) +#define DdxReallocBits_ (unsigned char *)CallDdx_(D_dxReallocBits) + /* + ** Pipeline support routines + */ +#define DdxCreatePipeline_ (Pipe)CallDdx_(D_dxCreatePipeline) +#define DdxDestroyPipeline_ (int)CallDdx_(D_dxDestroyPipeline) +#define DdxPipeHasYielded_ (int)CallDdx_(D_dxPipeHasYielded) +#define DdxInitiatePipeline_ (int)CallDdx_(D_dxInitiatePipeline) +#define DdxResumePipeline_ (int)CallDdx_(D_dxResumePipeline) +#define DdxFlushPipeline_ (int)CallDdx_(D_dxFlushPipeline) +#define DdxAbortPipeline_ (int)CallDdx_(D_dxAbortPipeline) + /* + ** Pipeline resource manager routines + */ +#define DdxRmAllocData_ (PipeDataPtr)CallDdx_(D_dxRmAllocData) +#define DdxRmAllocDataDesc_ (PipeDataPtr)CallDdx_(D_dxRmAllocDataDesc) +#define DdxRmAllocPermDesc_ (PipeDataPtr)CallDdx_(D_dxRmAllocPermDesc) +#define DdxRmAllocRefDesc_ (PipeDataPtr)CallDdx_(D_dxRmAllocRefDesc) +#define DdxRmBestDType_ (char)CallDdx_(D_dxRmBestDType) +#define DdxRmCreateDrain_ (PipeDrainPtr)CallDdx_(D_dxRmCreateDrain) +#define DdxRmCreateSink_ (PipeSinkPtr)CallDdx_(D_dxRmCreateSink) +#define DdxRmDeallocData_ (PipeDataPtr)CallDdx_(D_dxRmDeallocData) +#define DdxRmDeallocDataDesc_ (PipeDataPtr)CallDdx_(D_dxRmDeallocDataDesc) +#define DdxRmDestroyDrain_ (PipeDrainPtr)CallDdx_(D_dxRmDestroyDrain) +#define DdxRmDestroySink_ (PipeSinkPtr)CallDdx_(D_dxRmDestroySink) +#define DdxRmGetData_ (PipeDataPtr)CallDdx_(D_dxRmGetData) +#define DdxRmGetDType_ (int)CallDdx_(D_dxRmGetDType) +#define DdxRmGetMaxQuantum_ (int)CallDdx_(D_dxRmGetMaxQuantum) +#define DdxRmGetQuantum_ (int)CallDdx_(D_dxRmGetQuantum) +#define DdxRmHasQuantum_ (int)CallDdx_(D_dxRmHasQuantum) +#define DdxRmInitializePort_ (int)CallDdx_(D_dxRmInitializePort) +#define DdxRmMergeBuffers_ (PipeDataPtr)CallDdx_(D_dxRmMergeBuffers) +#define DdxRmObtainQuantum_ (PipeDataPtr)CallDdx_(D_dxRmObtainQuantum) +#define DdxRmPutData_ (int)CallDdx_(D_dxRmPutData) +#define DdxRmSetDType_ CallDdx_(D_dxRmSetDType) +#define DdxRmSetQuantum_ CallDdx_(D_dxRmSetQuantum) +#define DdxRmSplitBuffers_ (PipeDataPtr)CallDdx_(D_dxRmSplitBuffers) + /* + ** Pipe scheduling routines + */ +#define DdxSchedProcessComplete_ (PipeElementCtxPtr)CallDdx_(D_dxSchedProcessComplete) +#define DdxSchedProcessReady_ (PipeElementCtxPtr)CallDdx_(D_dxSchedProcessReady) +#define DdxSchedOkToRun_ (int)CallDdx_(D_dxSchedOkToRun) + /* + ** Change list routines + */ +#define DdxBuildChangeList_ CallDdx_(D_dxBuildChangeList) +#define DdxPutRuns_ CallDdx_(D_dxPutRuns) +#define DdxFfsLong_ CallDdx_(D_dxFfsLong) +#define DdxFfcLong_ CallDdx_(D_dxFfcLong) + /* + ** Additions + */ +#define DdxFillRegion_ CallDdx_(D_dxFillRegion) +#define DdxConvertCpp_ CallDdx_(D_dxConvertCpp) +#define DdxCopyCpp_ CallDdx_(D_dxCopyCpp) +#define DdxEncodeG4_ CallDdx_(D_dxEncodeG4) +#define DdxEncodeDct_ CallDdx_(D_dxEncodeDct) +#define DdxDecodeG4_ CallDdx_(D_dxDecodeG4) +#define DdxDecodeDct_ CallDdx_(D_dxDecodeDct) +#define DdxPosCl_ CallDdx_(D_dxPosCl) +#define DdxCheckLicense_ CallDdx_(D_dxCheckLicense) + /* + ** More RM functions + */ +#define DdxRmAllocCmpDataDesc_ (PipeDataPtr)CallDdx_(D_dxRmAllocCmpDataDesc) +#define DdxRmSetAlignment_ CallDdx_(D_dxRmSetAlignment) +#define DdxRmCreateDataDesc_ (PipeDataPtr)CallDdx_(D_dxRmCreateDataDesc) +#define DdxCreatePipeCtx_ (PipeElementCtxPtr)CallDdx_(D_dxCreatePipeCtx) +#define DdxUsingCL_ CallDdx_(D_dxUsingCL) +#define DdxCmpPreferred_ CallDdx_(D_dxCmpPreferred) +#define DdxRmAllocDataArray_ CallDdx_(D_dxRmAllocDataArray) +#define DdxRmAllocCmpPermDesc_ (PipeDataPtr)CallDdx_(D_dxRmAllocCmpPermDesc) +#define DdxSchedProcessNoInput_ (PipeElementCtxPtr)CallDdx_(D_dxSchedProcessNoInput) + +/***************************************************************************** +** +** Xie Ddx Setup Index - +** +** FUNCTIONAL DESCRIPTION: +** +** The following symbols define the indices into the dispatch table +** used to call "pipeline create" DDX functions. Each of these +** functions creates a new pipeline element. +** +** WARNING: These indices and the entries in the XieDdxSetup table +** in SmiDdx.c MUST be in the same order. +** +*****************************************************************************/ +#define D_dxCreateArea 0 +#define D_dxCreateArith 1 +#define D_dxCreateChromeCom 2 +#define D_dxCreateChromeSep 3 +#define D_dxCreateCompare 4 +#define D_dxCreateConstrain 5 +#define D_dxCreateCrop 6 +#define D_dxCreateDither 7 +#define D_dxCreateFill 8 +#define D_dxCreateLogical 9 +#define D_dxCreateLuminance 10 +#define D_dxCreateMatchHistogram 11 +#define D_dxCreateMath 12 +#define D_dxCreateMirror 13 +#define D_dxCreatePoint 14 +#define D_dxCreateRotate 15 +#define D_dxCreateScale 16 +#define D_dxCreateTranslate 17 +#define D_dxCreateDecodeDct 18 /* Compression pipeline creates */ +#define D_dxCreateEncodeDct 19 +#define D_dxCreateDecodeG4 20 +#define D_dxCreateEncodeG4 21 + +/***************************************************************************** +** +** Pipeline Create Access Macros +** +** FUNCTIONAL DESCRIPTION: +** +** These macros provide access to the Pipeline Create functions while +** hiding the implementation from the caller. +** +*****************************************************************************/ + /* + ** Pipe create function access macro + ** This macro calls a create function through the + ** xieDdxSetup dispatch table. + ** + ** func = the setup function index from this file. + ** + */ +externalref card32 (*xieDdxSetup[])(); +#define CallCreate_(func) (*(xieDdxSetup)[func]) + /* + ** Image processing pipe element creates + */ +#define DdxCreateArea_ CallCreate_(D_dxCreateArea) +#define DdxCreateArith_ CallCreate_(D_dxCreateArith) +#define DdxCreateChromeCom_ CallCreate_(D_dxCreateChromeCom) +#define DdxCreateChromeSep_ CallCreate_(D_dxCreateChromeSep) +#define DdxCreateCompare_ CallCreate_(D_dxCreateCompare) +#define DdxCreateConstrain_ CallCreate_(D_dxCreateConstrain) +#define DdxCreateCrop_ CallCreate_(D_dxCreateCrop) +#define DdxCreateDither_ CallCreate_(D_dxCreateDither) +#define DdxCreateFill_ CallCreate_(D_dxCreateFill) +#define DdxCreateLogical_ CallCreate_(D_dxCreateLogical) +#define DdxCreateLuminance_ CallCreate_(D_dxCreateLuminance) +#define DdxCreateMatchHistogram_ CallCreate_(D_dxCreateMatchHistogram) +#define DdxCreateMath_ CallCreate_(D_dxCreateMath) +#define DdxCreateMirror_ CallCreate_(D_dxCreateMirror) +#define DdxCreatePoint_ CallCreate_(D_dxCreatePoint) +#define DdxCreateRotate_ CallCreate_(D_dxCreateRotate) +#define DdxCreateScale_ CallCreate_(D_dxCreateScale) +#define DdxCreateTranslate_ CallCreate_(D_dxCreateTranslate) + /* + ** Compression creates, used by Transport + */ +#define DdxCreateDecodeDct_ CallCreate_(D_dxCreateDecodeDct) +#define DdxCreateEncodeDct_ CallCreate_(D_dxCreateEncodeDct) +#define DdxCreateDecodeG4_ CallCreate_(D_dxCreateDecodeG4) +#define DdxCreateEncodeG4_ CallCreate_(D_dxCreateEncodeG4) + +/***************************************************************************** +** +** Ddx Alignment Function Access Index +** +** FUNCTIONAL DESCRIPTION: +** +** The following symbols define the indices into the DDX Alignment +** dispatch table used to call DDX image array alignment functions. +** Each of these functions performs alignments to meet individual +** algorithms or the default DDX needs. +** +** WARNING: These indices and the entries in the XieDdxAlign table +** in SmiDdx.c MUST be in the same order. +** +** +*****************************************************************************/ +#define D_dxAlignArea 0 +#define D_dxAlignArith 1 +#define D_dxAlignChromeCom 2 +#define D_dxAlignChromeSep 3 +#define D_dxAlignCompare 4 +#define D_dxAlignConstrain 5 +#define D_dxAlignCrop 6 +#define D_dxAlignDither 7 +#define D_dxAlignFill 8 +#define D_dxAlignLogical 9 +#define D_dxAlignLuminance 10 +#define D_dxAlignMatchHistogram 11 +#define D_dxAlignMath 12 +#define D_dxAlignMirror 13 +#define D_dxAlignPoint 14 +#define D_dxAlignRotate 15 +#define D_dxAlignScale 16 +#define D_dxAlignTranslate 17 +#define D_dxAlignDecodeDct 18 +#define D_dxAlignEncodeDct 19 +#define D_dxAlignDecodeG4 20 +#define D_dxAlignEncodeG4 21 +#define D_dxAlignDefault 22 +#define D_dxAlignExport 23 + +/***************************************************************************** +** +** DDX Alignment Function Access Macros +** +** FUNCTIONAL DESCRIPTION: +** +** These macros provide access to the DDX image array alignment functions +** +*****************************************************************************/ + /* + ** Align function access macro + ** This macro calls an arbitrary Alignment routine through the + ** xieDdxAlign dispatch table. + ** + ** func = the DDX alignment function index from this file. + ** + */ +externalref card32 (*xieDdxAlign[])(); +#define GetAlign_(func) (xieDdxAlign[func]) + +#define DdxAlignArea_ GetAlign_(D_dxAlignArea) +#define DdxAlignStatsArea_ GetAlign_(D_dxAlignStatsArea) +#define DdxAlignArith_ GetAlign_(D_dxAlignArith) +#define DdxAlignHistogram_ GetAlign_(D_dxAlignHistogram) +#define DdxAlignChromeCom_ GetAlign_(D_dxAlignChromeCom) +#define DdxAlignChromeSep_ GetAlign_(D_dxAlignChromeSep) +#define DdxAlignCompare_ GetAlign_(D_dxAlignCompare) +#define DdxAlignConstrain_ GetAlign_(D_dxAlignConstrain) +#define DdxAlignCrop_ GetAlign_(D_dxAlignCrop) +#define DdxAlignDither_ GetAlign_(D_dxAlignDither) +#define DdxAlignFill_ GetAlign_(D_dxAlignFill) +#define DdxAlignLogical_ GetAlign_(D_dxAlignLogical) +#define DdxAlignLuminance_ GetAlign_(D_dxAlignLuminance) +#define DdxAlignMatchHistogram_ GetAlign_(D_dxAlignMatchHistogram) +#define DdxAlignMath_ GetAlign_(D_dxAlignMath) +#define DdxAlignMirror_ GetAlign_(D_dxAlignMirror) +#define DdxAlignPoint_ GetAlign_(D_dxAlignPoint) +#define DdxAlignStatsPoint_ GetAlign_(D_dxAlignStatsPoint) +#define DdxAlignRotate_ GetAlign_(D_dxAlignRotate) +#define DdxAlignScale_ GetAlign_(D_dxAlignScale) +#define DdxAlignTranslate_ GetAlign_(D_dxAlignTranslate) +#define DdxAlignDecodeDct_ GetAlign_(D_dxAlignDecodeDct) +#define DdxAlignEncodeDct_ GetAlign_(D_dxAlignEncodeDct) +#define DdxAlignDecodeG4_ GetAlign_(D_dxAlignDecodeG4) +#define DdxAlignEncodeG4_ GetAlign_(D_dxAlignEncodeG4) +#define DdxAlignDefault_ GetAlign_(D_dxAlignDefault) +#define DdxAlignExport_ GetAlign_(D_dxAlignExport) + +/***************************************************************************** +** +** Mi Access Macros +** +** FUNCTIONAL DESCRIPTION: +** +** These macros provide access to the "atomic" DDX functions provided +** by a Machine Independent layer of the DDX. +** +*****************************************************************************/ + /* + ** Mi function access macro + ** This macro calls an arbitrary Mi routine through the + ** xieMiProc dispatch table. + ** + ** func = the Mi function index from this file. + ** + */ +externalref card32 (*xieMiProc[])(); +#define CallMi_(func) (*(xieMiProc)[func]) + /* + ** Image functions + */ +#define MiArea_ CallMi_(D_dxArea) +#define MiStatsArea_ CallMi_(D_dxStatsArea) +#define MiArith_ CallMi_(D_dxArith) +#define MiHistogram_ CallMi_(D_dxHistogram) +#define MiChromeCom_ CallMi_(D_dxChromeCom) +#define MiChromeSep_ CallMi_(D_dxChromeSep) +#define MiCompare_ CallMi_(D_dxCompare) +#define MiConstrain_ CallMi_(D_dxConstrain) +#define MiCrop_ CallMi_(D_dxCrop) +#define MiDither_ CallMi_(D_dxDither) +#define MiFill_ CallMi_(D_dxFill) +#define MiLogical_ CallMi_(D_dxLogical) +#define MiLuminance_ CallMi_(D_dxLuminance) +#define MiMatchHistogram_ CallMi_(D_dxMatchHistogram) +#define MiMath_ CallMi_(D_dxMath) +#define MiMirror_ CallMi_(D_dxMirror) +#define MiPoint_ CallMi_(D_dxPoint) +#define MiStatsPoint_ CallMi_(D_dxStatsPoint) +#define MiRotate_ CallMi_(D_dxRotate) +#define MiScale_ CallMi_(D_dxScale) +#define MiTranslate_ CallMi_(D_dxTranslate) + /* + ** Mi specific functions + */ +#define MiInit_ CallMi_(D_dxInit) +#define MiReset_ CallMi_(D_dxReset) +#define MiOptimizePipe_ CallMi_(D_dxOptimizePipe) + /* + ** MI software functions + */ +#define MiConvert_ CallMi_(D_dxConvert) +#define MiCopy_ CallMi_(D_dxCopy) +#define MiGetTyp_ CallMi_(D_dxGetTyp) +#define MiCopyBits_ CallMi_(D_dxCopyBits) +#define MiResolveUdp_ CallMi_(D_dxResolveUdp) + /* + ** Memory management routines + */ +#define MiCalloc_ CallMi_(D_dxCalloc) +#define MiCallocBits_ (unsigned char *)CallMi_(D_dxCallocBits) +#define MiCfree_ CallMi_(D_dxCfree) +#define MiFree_ CallMi_(D_dxFree) +#define MiFreeBits_ (unsigned char *)CallMi_(D_dxFreeBits) +#define MiMalloc_ CallMi_(D_dxMalloc) +#define MiMallocBits_ (unsigned char *)CallMi_(D_dxMallocBits) +#define MiRealloc_ CallMi_(D_dxRealloc) +#define MiReallocBits_ (unsigned char *)CallMi_(D_dxReallocBits) + /* + ** Pipeline support routines + */ +#define MiCreatePipeline_ (Pipe)CallMi_(D_dxCreatePipeline) +#define MiDestroyPipeline_ (int)CallMi_(D_dxDestroyPipeline) +#define MiPipeHasYielded_ (int)CallMi_(D_dxPipeHasYielded) +#define MiInitiatePipeline_ (int)CallMi_(D_dxInitiatePipeline) +#define MiResumePipeline_ (int)CallMi_(D_dxResumePipeline) +#define MiFlushPipeline_ (int)CallMi_(D_dxFlushPipeline) +#define MiAbortPipeline_ (int)CallMi_(D_dxAbortPipeline) + /* + ** Pipeline resource manager routines + */ +#define MiRmAllocData_ (PipeDataPtr)CallMi_(D_dxRmAllocData) +#define MiRmAllocDataDesc_ (PipeDataPtr)CallMi_(D_dxRmAllocDataDesc) +#define MiRmAllocPermDesc_ (PipeDataPtr)CallMi_(D_dxRmAllocPermDesc) +#define MiRmAllocRefDesc_ (PipeDataPtr)CallMi_(D_dxRmAllocRefDesc) +#define MiRmBestDType_ (char)CallMi_(D_dxRmBestDType) +#define MiRmCreateDrain_ (PipeDrainPtr)CallMi_(D_dxRmCreateDrain) +#define MiRmCreateSink_ (PipeSinkPtr)CallMi_(D_dxRmCreateSink) +#define MiRmDeallocData_ (PipeDataPtr)CallMi_(D_dxRmDeallocData) +#define MiRmDeallocDataDesc_ (PipeDataPtr)CallMi_(D_dxRmDeallocDataDesc) +#define MiRmDestroyDrain_ (PipeDrainPtr)CallMi_(D_dxRmDestroyDrain) +#define MiRmDestroySink_ (PipeSinkPtr)CallMi_(D_dxRmDestroySink) +#define MiRmGetData_ (PipeDataPtr)CallMi_(D_dxRmGetData) +#define MiRmGetDType_ (int)CallMi_(D_dxRmGetDType) +#define MiRmGetMaxQuantum_ (int)CallMi_(D_dxRmGetMaxQuantum) +#define MiRmGetQuantum_ (int)CallMi_(D_dxRmGetQuantum) +#define MiRmHasQuantum_ (int)CallMi_(D_dxRmHasQuantum) +#define MiRmInitializePort_ (int)CallMi_(D_dxRmInitializePort) +#define MiRmMergeBuffers_ (PipeDataPtr)CallMi_(D_dxRmMergeBuffers) +#define MiRmObtainQuantum_ (PipeDataPtr)CallMi_(D_dxRmObtainQuantum) +#define MiRmPutData_ (int)CallMi_(D_dxRmPutData) +#define MiRmSetDType_ CallMi_(D_dxRmSetDType) +#define MiRmSetQuantum_ CallMi_(D_dxRmSetQuantum) +#define MiRmSplitBuffers_ (PipeDataPtr)CallMi_(D_dxRmSplitBuffers) + /* + ** Pipe scheduling routines + */ +#define MiSchedProcessComplete_ (PipeElementCtxPtr)CallMi_(D_dxSchedProcessComplete) +#define MiSchedProcessReady_ (PipeElementCtxPtr)CallMi_(D_dxSchedProcessReady) +#define MiSchedOkToRun_ (int)CallMi_(D_dxSchedOkToRun) + /* + ** Change list routines + */ +#define MiBuildChangeList_ CallMi_(D_dxBuildChangeList) +#define MiPutRuns_ CallMi_(D_dxPutRuns) +#define MiFfsLong_ CallMi_(D_dxFfsLong) +#define MiFfcLong_ CallMi_(D_dxFfcLong) + /* + ** Additions + */ +#define MiFillRegion_ CallMi_(D_dxFillRegion) +#define MiConvertCpp_ CallMi_(D_dxConvertCpp) +#define MiCopyCpp_ CallMi_(D_dxCopyCpp) +#define MiEncodeG4_ CallMi_(D_dxEncodeG4) +#define MiEncodeDct_ CallMi_(D_dxEncodeDct) +#define MiDecodeG4_ CallMi_(D_dxDecodeG4) +#define MiDecodeDct_ CallMi_(D_dxDecodeDct) +#define MiPosCl_ CallMi_(D_dxPosCl) +#define MiCheckLicense_ CallMi_(D_dxCheckLicense) + /* + ** More resource manager + */ +#define MiRmAllocCmpDataDesc_ CallMi_(D_dxRmAllocCmpDataDesc) +#define MiRmSetAlignment_ CallMi_(D_dxRmSetAlignment) +#define MiRmCreateDataDesc_ (PipeDataPtr)CallMi_(D_dxRmCreateDataDesc) +#define MiCreatePipeCtx_ (PipeElementCtxPtr)CallMi_(D_dxCreatePipeCtx) +#define MiUsingCL_ CallMi_(D_dxUsingCL) +#define MiCmpPreferred_ CallMi_(D_dxCmpPreferred) +#define MiRmAllocDataArray_ CallMi_(D_dxRmAllocDataArray) +#define MiRmAllocCmpPermDesc_ (PipeDataPtr)CallMi_(D_dxRmAllocCmpPermDesc) +#define MiSchedProcessNoInput_ (PipeElementCtxPtr)CallMi_(D_dxSchedProcessNoInput) + +/***************************************************************************** +** +** Pipeline Create Access Macros +** +** FUNCTIONAL DESCRIPTION: +** +** These macros provide access to the "pipeline create" DDX functions +** provided by a Machine Independent layer of the DDX. +** +*****************************************************************************/ + /* + ** Pipe create function access macro + ** This macro calls a create function through the + ** xieMiSetup dispatch table. + ** + ** func = the setup function index from this file. + ** + */ +externalref card32 (*xieMiSetup[])(); +#define CallMiCreate_(func) (*(xieMiSetup)[func]) + /* + ** Image processing pipe element creates + */ +#define MiCreateArea_ CallMiCreate_(D_dxCreateArea) +#define MiCreateArith_ CallMiCreate_(D_dxCreateArith) +#define MiCreateChromeCom_ CallMiCreate_(D_dxCreateChromeCom) +#define MiCreateChromeSep_ CallMiCreate_(D_dxCreateChromeSep) +#define MiCreateCompare_ CallMiCreate_(D_dxCreateCompare) +#define MiCreateConstrain_ CallMiCreate_(D_dxCreateConstrain) +#define MiCreateCrop_ CallMiCreate_(D_dxCreateCrop) +#define MiCreateDither_ CallMiCreate_(D_dxCreateDither) +#define MiCreateFill_ CallMiCreate_(D_dxCreateFill) +#define MiCreateLogical_ CallMiCreate_(D_dxCreateLogical) +#define MiCreateLuminance_ CallMiCreate_(D_dxCreateLuminance) +#define MiCreateMatchHistogram_ CallMiCreate_(D_dxCreateMatchHistogram) +#define MiCreateMath_ CallMiCreate_(D_dxCreateMath) +#define MiCreateMirror_ CallMiCreate_(D_dxCreateMirror) +#define MiCreatePoint_ CallMiCreate_(D_dxCreatePoint) +#define MiCreateRotate_ CallMiCreate_(D_dxCreateRotate) +#define MiCreateScale_ CallMiCreate_(D_dxCreateScale) +#define MiCreateTranslate_ CallMiCreate_(D_dxCreateTranslate) + /* + ** Compression creates, used by Transport + */ +#define MiCreateDecodeDct_ CallMiCreate_(D_dxCreateDecodeDct) +#define MiCreateEncodeDct_ CallMiCreate_(D_dxCreateEncodeDct) +#define MiCreateDecodeG4_ CallMiCreate_(D_dxCreateDecodeG4) +#define MiCreateEncodeG4_ CallMiCreate_(D_dxCreateEncodeG4) + +/* +** This "endif" MUST be the last line of this file. +*/ +#endif +/* end of XIEDDX -- NO DEFINITIONS ALLOWED BEYOND THIS POINT */ diff --git a/xie/docs/dec/xie23/include/dec/extensions/XieFloat.h b/xie/docs/dec/xie23/include/dec/extensions/XieFloat.h new file mode 100644 index 0000000..84d92bb --- /dev/null +++ b/xie/docs/dec/xie23/include/dec/extensions/XieFloat.h @@ -0,0 +1,89 @@ +/* + * @DEC_COPYRIGHT@ + */ +/* + * HISTORY + * $Log: XieFloat.h,v $ + * Revision 1.2.2.3 92/04/06 08:18:45 Gary_Grebus + * Update to XIE VN/ALPHA_BL1 baselevel. + * [92/03/11 07:12:06 Gary_Grebus] + * + * Revision 1.2 91/12/30 12:48:20 devbld + * Initial load of project + * + * $EndLog$ + */ +/* BuildSystemHeader added automatically */ +/* $Header: /b5/aguws3.0/aguws3.0_rcs/src/dec/extensions/include/XieFloat.h,v 1.2.2.3 92/04/06 08:18:45 Gary_Grebus Exp $ */ + +/*********************************************************** +Copyright 1990-1991 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** XIE - X11 Image Extension +** +** +** ABSTRACT: +** +** This module contains definitions required by the XIE library +** and XIE server floating point formatting routines. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Robert NC Shelley +** +** CREATION DATE: +** +** October 31, 1990 +** +************************************************************************/ + + /* + ** Symbol XIEFLOAT allows XieFloat.h to be included multiple times. + */ +#ifndef XIEFLOAT +#define XIEFLOAT /* the "endif" MUST be the last line of this file */ + + /* + ** Wire floating point format + */ +typedef struct _XieFloatRec { + unsigned char e_sign; + unsigned char m_sign; + unsigned short exponent; + unsigned long mantissa; +} XieFloatRec, *XieFloat; + +extern void MiEncodeDouble(); +extern double MiDecodeDouble(); + +#endif diff --git a/xie/docs/dec/xie23/include/dec/extensions/XieLib.h b/xie/docs/dec/xie23/include/dec/extensions/XieLib.h new file mode 100644 index 0000000..12be241 --- /dev/null +++ b/xie/docs/dec/xie23/include/dec/extensions/XieLib.h @@ -0,0 +1,365 @@ +/* + * @DEC_COPYRIGHT@ + */ +/* + * HISTORY + * $Log: XieLib.h,v $ + * Revision 1.2.3.4 92/04/06 08:24:05 Gary_Grebus + * Update to XIE VN/ALPHA_BL1 baselevel. + * + * Revision 1.2.3.3 92/04/03 10:41:37 Gary_Grebus + * Update to XIE VN/ALPHA_BL1 baselevel. + * [92/03/11 07:12:28 Gary_Grebus] + * + * Revision 1.2.3.2 92/03/24 17:05:01 Scott_Sewall + * Added path, X11/extensions/, to XieAppl.h and XieUpDef.h + * [92/03/24 17:04:09 Scott_Sewall] + * + * Revision 1.2 91/12/30 12:48:20 devbld + * Initial load of project + * + * $EndLog$ + */ +/* BuildSystemHeader added automatically */ +/* $Header: /b5/aguws3.0/aguws3.0_rcs/src/dec/extensions/include/XieLib.h,v 1.2.3.4 92/04/06 08:24:05 Gary_Grebus Exp $ */ + +/******************************************************************************* +** Copyright 1989-1992 by Digital Equipment Corporation, Maynard, Massachusetts, +** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. +** +** All Rights Reserved +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, +** provided that the above copyright notice appear in all copies and that +** both that copyright notice and this permission notice appear in +** supporting documentation, and that the names of Digital or MIT not be +** used in advertising or publicity pertaining to distribution of the +** software without specific, written prior permission. +** +** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +** SOFTWARE. +** +*******************************************************************************/ + +/******************************************************************************* +** +** FACILITY: +** +** XIE - X11 Image Extension +** +** +** ABSTRACT: +** +** This module contains definitions required by all XIE client side +** layers -- from the application level through the XieLib level. +** +** ENVIRONMENT: +** +** VAX/VMS V5.3 +** ULTRIX V3.1 +** +** AUTHOR(S): +** +** Robert NC Shelley +** +** CREATION DATE: +** +** April 13, 1989 +** +*******************************************************************************/ + + /* + ** Symbol XIELIB allows XieLib.h to be included multiple times. + */ +#ifndef _XIELIB +#define _XIELIB /* the "endif" MUST be the last line of this file */ + +/* +** Include files +*/ +#ifdef VMS +#include /* X11 Library Definitions */ +#else +#include /* X11 Library Definitions */ +#endif +#ifdef VMS +#include /* universal data plane definitions */ +#include /* XIE inter-layer definitions */ +#else +#include /* universal data plane definitions */ +#include /* XIE inter-layer definitions */ +#endif + +/* +** Equated symbols +*/ + /* + ** XieCopyImage, XieGetImage, and XiePutImage image data mode constants. + */ +#define XieK_DataNone 1 /* no buffers, no transport setup, no data copy */ +#define XieK_DataFlo 2 /* prepare a Photoflo for image data transport */ +#define XieK_DataMap 3 /* prepare a Photomap for image data transport */ +#define XieK_DataAlloc 4 /* allocate image buffers containing no data */ +#define XieK_DataCopy 5 /* allocate image buffers and copy data */ +#define XieK_DataShare 6 /* copy pointers to existing image data */ + /* + ** Opaque Xie resource definitions. + */ +typedef unsigned long *XieStream; /* Stream transport context pointer */ +typedef unsigned char + *XiePhotoflo, /* Photoflo: server image pipeline object */ + *XiePhotomap, /* Photomap: permanent server image object */ + *XiePhototap, /* Phototap: ephemeral server image object */ + *XieCpp, /* Cpp: control processing plane */ + *XieRoi, /* Roi: region of interest */ + *XieTmp, /* Tmp: template (eg. convolution kernel) */ + *XiePhoto, /* Any of: XiePhotoflo, XiePhotomap, XiePhototap*/ + *XieIdc, /* Any of: XieCpp, XieRoi, XieTmp, */ + *XieResource; /* Any of: XiePhoto, XieIdc */ + +#define RES_XID 8 /* offset to XieResource X11 resource-id */ +#define RES_TYPE 12 /* offset to XieResource resource type */ +#define RES_MAPPING 13 /* offset to XiePhoto component mapping */ +/* +** Macros +*/ + /* + ** Macro for returning a resource's X11-id. + */ +#define XId_(res) (*((XID *)(&((XieResource)(res))[RES_XID]))) + /* + ** Boolean macros for determining a resource's type. + */ +#define IsPhotoflo_(res) (((XieResource)(res))[RES_TYPE]==XieK_Photoflo) +#define IsPhotomap_(res) (((XieResource)(res))[RES_TYPE]==XieK_Photomap) +#define IsPhototap_(res) (((XieResource)(res))[RES_TYPE]==XieK_Phototap) +#define IsCpp_(res) (((XieResource)(res))[RES_TYPE]==XieK_IdcCpp) +#define IsRoi_(res) (((XieResource)(res))[RES_TYPE]==XieK_IdcRoi) +#define IsTmp_(res) (((XieResource)(res))[RES_TYPE]==XieK_IdcTmp) +#define IsPhoto_(res) (IsPhotoflo_(res)||IsPhotomap_(res)||IsPhototap_(res)) +#define IsIdc_(res) (IsCpp_(res)||IsRoi_(res)||IsTmp_(res)) + /* + ** Boolean macros for determining a XiePhotomap's component mapping. + */ +#define IsBitonal_(pho) (((XiePhoto)(pho))[RES_MAPPING]==XieK_Bitonal) +#define IsGrayScale_(pho) (((XiePhoto)(pho))[RES_MAPPING]==XieK_GrayScale) +#define IsRGB_(pho) (((XiePhoto)(pho))[RES_MAPPING]==XieK_RGB) + + /* + ** Return the component count of an XiePhotomap. + */ +#define PhotoCount_(pho) (IsRGB_(pho) ? 3 : 1) + /* + ** Return the number of planes (UdpPtr's) an XieImage "should" contain. + */ +#define PlaneCount_(img) \ + ( CmpOrg_(img) == XieK_BandByPixel ? 1 \ + : CmpOrg_(img) == XieK_BandByPlane ? CmpCnt_(img) \ + : CmpLen_(img,0)+CmpLen_(img,1)+CmpLen_(img,2) ) + /* + ** Return "val" rounded up (if necessary) to a multiple of "mod". + */ +#define Modulo_(val,mod) \ + ((mod) < 2 ? (val) : (((mod) - (val) % (mod)) % (mod) + (val))) + +/* +** Structures +*/ + /* + ** XIE Client Event Structure + */ +typedef struct { + int type; /* see XQueryExtention "first_event"*/ + unsigned long serial; /* X11 serial number */ + Bool send_event; /* Boolean: true if client generated*/ + Display *display; /* X11 display pointer */ + XieResource resource; /* Xie resource-id (source of event)*/ +} XieEventRec, *XieEvent; + /* + ** Image domain context template data for XieCreateTmp / XieQueryTmp. + */ +typedef struct { + long x; /* X coordinate of template entry */ + long y; /* Y coordinate of template entry */ + double value; /* value of template entry */ +} XieTemplateRec, *XieTemplate; + /* + ** Statistics data + */ +typedef struct { + double value; + double minimum; + double maximum; + double mean; + double stddev; + double variance; +} XieStatsRec, *XieStats; + + /* + ** XIE Image structure (client side image descriptor). + */ +typedef struct { + unsigned char Compression; /* compression scheme */ + unsigned char CmpOrg; /* component organization */ + unsigned char CmpMap; /* component mapping */ + unsigned char CmpCnt; /* component count */ + unsigned long CmpLvl[XieK_MaxComponents]; /* levels per component */ + unsigned char CmpLen[XieK_MaxComponents]; /* bits per component */ + unsigned char PxlPol; /* pixel brightness polarity*/ + unsigned char PxlProg; /* pixel progression */ + unsigned char ScnProg; /* scanline progression */ + unsigned char OwnData; /* image array ownership */ + unsigned char Stream; /* Stream transport status */ + XieStream Xport; /* Stream transport context */ + double PxlRatio; /* pixel aspect ratio */ + UdpPtr Plane[XieK_MaxPlanes]; /* data plane pointers */ +} XieImageRec, *XieImage; + /* + ** Access macros for XIE Image structure. + */ +#define Cmpres_(img) ((img)->Compression) +#define CmpOrg_(img) ((img)->CmpOrg) +#define CmpMap_(img) ((img)->CmpMap) +#define CmpCnt_(img) ((img)->CmpCnt) +#define CmpLvl_(img,ind) ((img)->CmpLvl[(ind)]) +#define CmpLen_(img,ind) ((img)->CmpLen[(ind)]) +#define PxlPol_(img) ((img)->PxlPol) +#define PxlProg_(img) ((img)->PxlProg) +#define ScnProg_(img) ((img)->ScnProg) +#define OwnData_(img) ((img)->OwnData) +#define Stream_(img) ((img)->Stream) +#define StreamFinal_(img) (Stream_(img) == XieK_StreamFinal) +#define StreamError_(img) (Stream_(img) == XieK_StreamError) +#define StreamPending_(img) (!(StreamFinal_(img) || StreamError_(img))) +#define PxlRatio_(img) ((img)->PxlRatio) +#define Width_(img) ((img)->Plane[0]->UdpL_PxlPerScn) +#define Height_(img) ((img)->Plane[0]->UdpL_ScnCnt) +#define Plane_(img,ind) ((img)->Plane[(ind)]) +#define uPxlLen_(img,ind) ((img)->Plane[(ind)]->UdpW_PixelLength) +#define uDType_(img,ind) ((img)->Plane[(ind)]->UdpB_DType) +#define uClass_(img,ind) ((img)->Plane[(ind)]->UdpB_Class) +#define uBase_(img,ind) ((img)->Plane[(ind)]->UdpA_Base) +#define uArSize_(img,ind) ((img)->Plane[(ind)]->UdpL_ArSize) +#define uPxlStr_(img,ind) ((img)->Plane[(ind)]->UdpL_PxlStride) +#define uScnStr_(img,ind) ((img)->Plane[(ind)]->UdpL_ScnStride) +#define uX1_(img,ind) ((img)->Plane[(ind)]->UdpL_X1) +#define uX2_(img,ind) ((img)->Plane[(ind)]->UdpL_X2) +#define uY1_(img,ind) ((img)->Plane[(ind)]->UdpL_Y1) +#define uY2_(img,ind) ((img)->Plane[(ind)]->UdpL_Y2) +#define uWidth_(img,ind) ((img)->Plane[(ind)]->UdpL_PxlPerScn) +#define uHeight_(img,ind) ((img)->Plane[(ind)]->UdpL_ScnCnt) +#define uPos_(img,ind) ((img)->Plane[(ind)]->UdpL_Pos) +#define uCmpIdx_(img,ind) ((img)->Plane[(ind)]->UdpL_CompIdx) +#define uLvl_(img,ind) ((img)->Plane[(ind)]->UdpL_Levels) + +/* +** XieLib entry points. +*/ +#ifndef _XieLibEvents +extern unsigned long XieQueryEvents(); +extern void XieSelectEvents(); +#endif +#ifndef _XieLibImage +extern XieImage XieCopyImage(); +extern XieImage XieCreateImage(); +extern XieImage XieFreeImage(); +extern XieImage XieGetImage(); +extern unsigned char XieGetImageData(); +extern XiePhoto XiePutImage(); +extern unsigned char XiePutImageData(); +#endif +#ifndef _XieLibProcess +extern XiePhoto XieArea(); +extern XiePhoto XieAreaStats(); +extern XiePhoto XieArithmetic(); +extern XiePhoto XieChromeCom(); +extern XiePhoto XieChromeSep(); +extern XiePhoto XieCompare(); +extern XiePhoto XieConstrain(); +extern XiePhoto XieCrop(); +extern XiePhoto XieDither(); +extern XiePhoto XieFill(); +extern unsigned long *XieHistogram(); +extern XiePhoto XieLogical(); +extern XiePhoto XieLuminance(); +extern XiePhoto XieMatchHistogram(); +extern XiePhoto XieMath(); +extern XiePhoto XieMirror(); +extern XiePhoto XiePoint(); +extern void XiePointStats(); +extern XiePhoto XieRotate(); +extern XiePhoto XieScale(); +extern XiePhoto XieTranslate(); +#endif +#ifndef _XieLibResource +extern void XieAbortFlo(); +extern void XieBindMapToFlo(); +extern XiePhoto XieClonePhoto(); +extern XieCpp XieCreateCpp(); +extern XiePhoto XieCreatePhoto(); +extern XieRoi XieCreateRoi(); +extern XieTmp XieCreateTmp(); +extern void XieExecuteFlo(); +extern void XieExport(); +extern XieResource XieFindResource(); +extern void XieFreeExport(); +extern XieResource XieFreeResource(); +extern XiePhotomap XieImport(); +extern void XieQueryCpp(); +extern void XieQueryExport(); +extern unsigned long XieQueryFlo(); +extern XiePhoto XieQueryMap(); +extern void XieQueryRoi(); +extern XieTemplate XieQueryTmp(); +extern XiePhoto XieTapFlo(); +#endif +#ifndef _XieLibSession +extern char *XieCheckFunction(); +extern char **XieListFunctions(); +extern void XieQueryOpDefaults(); +extern void XieSetOpDefaults(); +#endif +#ifndef _XieLibTransport +extern void XieAbortStream(); +extern unsigned char XieGetStream(); +extern void XieGetTile(); +extern void XiePutStream(); +extern void XiePutTile(); +extern void XieSetStream(); +#endif +#ifndef _XieLibUtils +extern void *XieCalloc(); +extern unsigned char *XieCallocBits(); +extern void *XieCfree(); +extern void *XieFree(); +extern unsigned char *XieFreeBits(); +extern unsigned char XieIsBitonal(); +extern unsigned char XieIsCpp(); +extern unsigned char XieIsGrayScale(); +extern unsigned char XieIsIdc(); +extern unsigned char XieIsPhoto(); +extern unsigned char XieIsPhotoflo(); +extern unsigned char XieIsPhotomap(); +extern unsigned char XieIsPhototap(); +extern unsigned char XieIsRGB(); +extern unsigned char XieIsRoi(); +extern unsigned char XieIsTmp(); +extern void *XieMalloc(); +extern unsigned char *XieMallocBits(); +extern unsigned long XiePhotoCount(); +extern unsigned long XiePlaneCount(); +extern void *XieRealloc(); +extern unsigned char *XieReallocBits(); +extern unsigned long XieXId(); +#endif + +/* +** This "endif" MUST be the last line of this file. +*/ +#endif /* end of _XIELIB -- NO DEFINITIONS ALLOWED BEYOND THIS POINT */ diff --git a/xie/docs/dec/xie23/include/dec/extensions/XiePipeInterface.h b/xie/docs/dec/xie23/include/dec/extensions/XiePipeInterface.h new file mode 100644 index 0000000..d7fd60f --- /dev/null +++ b/xie/docs/dec/xie23/include/dec/extensions/XiePipeInterface.h @@ -0,0 +1,106 @@ +/* + * @DEC_COPYRIGHT@ + */ +/* + * HISTORY + * $Log: XiePipeInterface.h,v $ + * Revision 1.2.2.3 92/04/06 08:24:43 Gary_Grebus + * Update to XIE VN/ALPHA_BL1 baselevel. + * [92/03/31 10:59:22 Gary_Grebus] + * + * Revision 1.2 91/12/30 12:48:20 devbld + * Initial load of project + * + * $EndLog$ + */ +/* BuildSystemHeader added automatically */ +/* $Header: /b5/aguws3.0/aguws3.0_rcs/src/dec/extensions/include/XiePipeInterface.h,v 1.2.2.3 92/04/06 08:24:43 Gary_Grebus Exp $ */ + +/* DEC/CMS REPLACEMENT HISTORY, Element XIEPIPEINTERFACE.H */ +/* *4 3-SEP-1991 17:44:50 GREBUS "Start changes for compressed data support" */ +/* *3 17-JUN-1991 14:52:20 HENNESSY "Add Macros to handle optimizer support in ProcExecuteFlo path" */ +/* *2 22-FEB-1991 16:14:09 GREBUS "Fixed bug which was passing wrong pointer on non-VMS systems" */ +/* *1 18-FEB-1991 16:50:18 GREBUS "Definitions to access/hide the yielding support" */ +/* DEC/CMS REPLACEMENT HISTORY, Element XIEPIPEINTERFACE.H */ + +/*********************************************************** +Copyright 1989,1991 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Image Extension DIX +** +** ABSTRACT: +** +** This module contains the macros which are used to access the +** the DDX routines needed to create and run pipelines. +** +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Gary L. Grebus +** +** CREATION DATE: +** +** Thu Feb 7 17:05:40 1991 +** +************************************************************************/ +#ifdef DWV3 + +/* For DECWindows V3, interpose the layer to support yielding */ +extern int XieAbortPipeline(); +extern Pipe XieCreatePipeline(); +extern int XieDestroyPipeline(); +extern int XieFlushPipeline(); +extern int XieInitPipelineInterface(); +extern int XieResumePipeline(); + +#define AbortPipeline_(flo) (XieAbortPipeline( flo )) +#define CreatePipeline_(client, flo) (XieCreatePipeline( client, flo )) +#define DestroyPipeline_(flo) (XieDestroyPipeline( flo )) +#define FlushPipeline_(flo) (XieFlushPipeline( flo )) +#define InitiatePipeline_(flo) (DdxInitiatePipeline_( Pipe_(flo) )) +#define InitPipelineInterface_() (XieInitPipelineInterface()) +#define OptimizePipeline_(flo) (DdxOptimizePipe_(Pipe_(flo))) +#define ResumePipeline_(flo) (XieResumePipeline( flo )) +#else + +/* Everywhere else, call the DDX routines directly */ +#define AbortPipeline_(flo) (DdxAbortPipeline_(Pipe_(flo))) +#define CreatePipeline_(client, flo) (DdxCreatePipeline_( 0 )) +#define DestroyPipeline_(flo) (DdxDestroyPipeline_( Pipe_(flo) )) +#define FlushPipeline_(flo) (DdxFlushPipeline_(Pipe_(flo))) +#define InitiatePipeline_(flo) (DdxInitiatePipeline_(Pipe_(flo))) +#define InitPipelineInterface_() (Success) /* Dummy */ +#define OptimizePipeline_(flo) (DdxOptimizePipe_(Pipe_(flo))) +#define ResumePipeline_(flo) (DdxResumePipeline_(Pipe_(flo))) + +#endif /* DWV3 */ diff --git a/xie/docs/dec/xie23/include/dec/extensions/XieProto.h b/xie/docs/dec/xie23/include/dec/extensions/XieProto.h new file mode 100644 index 0000000..e2e8581 --- /dev/null +++ b/xie/docs/dec/xie23/include/dec/extensions/XieProto.h @@ -0,0 +1,1220 @@ +/* + * @DEC_COPYRIGHT@ + */ +/* + * HISTORY + * $Log: XieProto.h,v $ + * Revision 1.2.2.3 92/04/06 08:25:13 Gary_Grebus + * Update to XIE VN/ALPHA_BL1 baselevel. + * [92/03/11 07:12:50 Gary_Grebus] + * + * Revision 1.2 91/12/30 12:48:20 devbld + * Initial load of project + * + * $EndLog$ + */ +/* BuildSystemHeader added automatically */ +/* $Header: /b5/aguws3.0/aguws3.0_rcs/src/dec/extensions/include/XieProto.h,v 1.2.2.3 92/04/06 08:25:13 Gary_Grebus Exp $ */ + +/*********************************************************** +Copyright 1989-1991 by Digital Equipment Corporation, Maynard, Massachusetts, +and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +/************************************************************************ +** +** FACILITY: +** +** X Image Extension DIX +** +** ABSTRACT: +** +** This module contains definitions required by the XIE wire protocol +** -- XIE library and XIE server DDX layers. +** +** ENVIRONMENT: +** +** VAX/VMS V5.4 +** ULTRIX V4.0 +** +** AUTHOR(S): +** +** Richard J. Piccolo +** Robert NC Shelley +** +** CREATION DATE: +** +** March 1, 1989 +** +************************************************************************/ + + /* + ** Symbol XIEPROTO allows XieProto.h to be included multiple times. + */ +#ifndef XIEPROTO +#define XIEPROTO /* the "endif" MUST be the last line of this file */ + +/* +** Include files +*/ +#ifdef VMS +#include /* XIE inter-layer definitions */ +#include /* XIE device dependant definitions */ +#else +#include /* XIE inter-layer definitions */ +#include /* XIE device dependant definitions */ +#endif + +/* +** Wire protocol constant definitions. +*/ + /* + ** Version number + */ +#define XieK_MajorVersion 2 +#define XieK_MinorVersion 3 + +/******************************************************************************* +** Protocol request packet minor op-codes +*******************************************************************************/ +#define X_ieInitSession 1 +#define X_ieTermSession 2 + +#define X_ieQueryEvents 3 +#define X_ieSelectEvents 4 + +#define X_ieSetOpDefaults 5 +#define X_ieQueryOpDefaults 6 + +#define X_ieCreateByReference 7 +#define X_ieCreateByValue 8 +#define X_ieDeleteResource 9 +#define X_ieQueryResource 10 + +#define X_ieBindPhotomap 11 +#define X_ieAbortPhotoflo 12 +#define X_ieExecutePhotoflo 13 +#define X_ieTapPhotoflo 14 + +#define X_ieAbortTransport 15 +#define X_ieGetStream 16 +#define X_ieGetTile 17 +#define X_iePutStream 18 +#define X_iePutTile 19 +#define X_ieSetTransport 20 + +#define X_ieExport 21 +#define X_ieFreeExport 22 +#define X_ieImport 23 +#define X_ieQueryExport 24 + +#define X_ieArea 25 +#define X_ieAreaStats 26 +#define X_ieArith 27 +#define X_ieCalcHist 28 +#define X_ieChromeCom 29 +#define X_ieChromeSep 30 +#define X_ieCompare 31 +#define X_ieConstrain 32 +#define X_ieCrop 33 +#define X_ieDither 34 +#define X_ieFill 35 +#define X_ieLogical 36 +#define X_ieLuminance 37 +#define X_ieMatchHistogram 38 +#define X_ieMath 39 +#define X_ieMirror 40 +#define X_iePoint 41 +#define X_iePointStats 42 +#define X_ieRotate 43 +#define X_ieScale 44 +#define X_ieTranslate 45 + +#define X_ieLastRequest 46 + +/******************************************************************************* +** Protocol packet size definitions required by Xlibint.h +*******************************************************************************/ +#define sz_xieReq 4 +#define sz_xieInitSessionReq 8 +#define sz_xieTermSessionReq 4 + +#define sz_xieQueryEventsReq 8 +#define sz_xieSelectEventsReq 8 + +#define sz_xieSetOpDefaultsReq 20 +#define sz_xieQueryOpDefaultsReq 4 + +#define sz_xieCreateByReferenceReq 16 +#define sz_xieCreateByValueReq 12 +#define sz_xieCreateCppReq 24 +#define sz_xieCreatePhotoReq 48 +#define sz_xieCreateRoiReq 28 +#define sz_xieCreateTmpReq 24 +#define sz_xieDeleteResourceReq 12 +#define sz_xieQueryResourceReq 12 + +#define sz_xieBindPhotomapReq 12 +#define sz_xieAbortPhotofloReq 8 +#define sz_xieExecutePhotofloReq 8 +#define sz_xieTapPhotofloReq 16 + +#define sz_xieAbortTransportReq 12 +#define sz_xieGetStreamReq 16 +#define sz_xieGetTileReq 32 +#define sz_xiePutStreamReq 16 +#define sz_xiePutTileReq 32 +#define sz_xieSetTransportReq 140 + +#define sz_xieExportReq 64 +#define sz_xieFreeExportReq 8 +#define sz_xieImportReq 20 +#define sz_xieQueryExportReq 16 + +#define sz_xieAreaReq 24 +#define sz_xieAreaStatsReq 20 +#define sz_xieArithReq 36 +#define sz_xieCalcHistReq 16 +#define sz_xieChromeComReq 20 +#define sz_xieChromeSepReq 16 +#define sz_xieCompareReq 36 +#define sz_xieConstrainReq 28 +#define sz_xieCropReq 16 +#define sz_xieDitherReq 24 +#define sz_xieFillReq 28 +#define sz_xieLogicalReq 36 +#define sz_xieLuminanceReq 12 +#define sz_xieMatchHistogramReq 36 +#define sz_xieMathReq 20 +#define sz_xieMirrorReq 16 +#define sz_xiePointReq 20 +#define sz_xiePointStatsReq 20 +#define sz_xieRotateReq 40 +#define sz_xieScaleReq 20 +#define sz_xieTranslateReq 24 + +/******************************************************************************* +** Sub-structures +*******************************************************************************/ + + /* + ** Structure defining the Xie function vector. + */ +typedef struct { + CARD8 function[32]; +} XieFunctionsRec, *XieFunctionVector; + + /* + ** Structure defining IdcTmp template data crossing wire. + */ +typedef struct { + INT32 x; + INT32 y; + XieFloatRec value; +} XieTmpEntryRec, *XieTmpEntry; + +/******************************************************************************* +** Protocol request packets +*******************************************************************************/ + + /* + ** Generic part of all XIE requests + */ +typedef struct { + CARD8 reqType; /* major op-code assigned to extension */ + CARD8 opcode; /* minor op-code == XIE function */ + CARD16 length; /* length in longwords of entire request */ +} xieReq; + + /* + ** Init Session Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieInitSession */ + CARD16 length; + CARD16 major_version; + CARD16 minor_version; +} xieInitSessionReq; + + /* + ** Term Session Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieTermSession */ + CARD16 length; +} xieTermSessionReq; + + /* + ** Query Events Requests + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 event_param; +} xieQueryEventsReq; + + /* + ** Select Events Requests + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 event_mask; +} xieSelectEventsReq; + + /* + ** Set Operational Defaults + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieSetOpDefaults */ + CARD16 length; + CARD8 model; + CARD8 _pad[3]; + CARD32 levels[XieK_MaxComponents]; +} xieSetOpDefaultsReq; + + /* + ** Query Operational Defaults + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieQueryOpDefaults */ + CARD16 length; +} xieQueryOpDefaultsReq; + + /* + ** Create (ie. clone Photo{flo|map}) resource By Reference Request. + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByReference*/ + CARD16 length; + CARD32 resource_type; + CARD32 resource_id; /* new Photo{flo|map}-id */ + CARD32 photomap_id; /* existing Photomap-id */ +} xieCreateByReferenceReq; + + /* + ** Generic Create resource By Value Request. + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByValue */ + CARD16 length; + CARD32 resource_type; /* new resource type */ + CARD32 resource_id; /* new resource identifier */ +} xieCreateByValueReq; + + /* + ** Create Cpp Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByValue */ + CARD16 length; + CARD32 resource_type; /* resource type == XieK_IdcCpp */ + CARD32 resource_id; + CARD32 photomap_id; + INT32 x; + INT32 y; +} xieCreateCppReq; + + /* + ** Create Photo{flo|map} from client specified attributes. + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByValue */ + CARD16 length; + CARD32 resource_type; /* XieK_Photomap or XieK_Photoflo */ + CARD32 resource_id; + CARD32 width; + CARD32 height; + XieFloatRec aspect_ratio; + CARD32 levels[XieK_MaxComponents]; + CARD8 number_of_components; + CARD8 component_mapping; + CARD8 pixel_progression; + CARD8 line_progression; + CARD8 polarity; + CARD8 _pad[3]; +} xieCreatePhotoReq; + + /* + ** Create Roi Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByValue */ + CARD16 length; + CARD32 resource_type; /* resource type == XieK_IdcRoi */ + CARD32 resource_id; + INT32 x; + INT32 y; + CARD32 width; + CARD32 height; +} xieCreateRoiReq; + + /* + ** Create Tmp Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCreateByValue */ + CARD16 length; + CARD32 resource_type; /* resource type == XieK_IdcTmp */ + CARD32 resource_id; + INT32 center_x; + INT32 center_y; + CARD32 data_count; /* number of XieTmpEntryRec's */ +/* XieTmpEntryRec data[data_count] /* list of XieTmpEntryRec */ +} xieCreateTmpReq; + + /* + ** Delete resource request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieDeleteResource */ + CARD16 length; + CARD32 resource_type; + CARD32 resource_id; +} xieDeleteResourceReq; + + /* + ** Query resource request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieQueryResource */ + CARD16 length; + CARD32 resource_type; + CARD32 resource_id; +} xieQueryResourceReq; + + /* + ** Bind an existing Photomap to an existing Photoflo. + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieBindPhotomap */ + CARD16 length; + CARD32 photoflo_id; + CARD32 photomap_id; +} xieBindPhotomapReq; + + /* + ** Abort Photoflo request. + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieAbortPhotoflo */ + CARD16 length; + CARD32 photoflo_id; +} xieAbortPhotofloReq; + + /* + ** Execute Photoflo Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieExecutePhotoflo */ + CARD16 length; + CARD32 photoflo_id; +} xieExecutePhotofloReq; + + /* + ** Tap Photoflo Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieTapPhotoflo */ + CARD16 length; + CARD32 photoflo_id; + CARD32 photo_id; + BOOL permanent; + CARD8 _pad[3]; +} xieTapPhotofloReq; + + /* + ** Abort transport Request (release transport resources) + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieAbortTransport */ + CARD16 length; + CARD32 photo_id; + CARD32 plane_mask; +} xieAbortTransportReq; + + /* + ** Get Stream Request (transport image data: server --> client) + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieGetStream */ + CARD16 length; + CARD32 photo_id; + CARD32 max_bytes; /* maximum return image data length */ + CARD8 plane_num; + CARD8 _pad[3]; +} xieGetStreamReq; + + /* + ** Get Tile Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieGetTile */ + CARD16 length; + CARD32 photomap_id; + INT32 x; + INT32 y; + CARD32 width; + CARD32 height; + CARD32 plane_mask; + BOOL final; + CARD8 _pad[3]; +} xieGetTileReq; + + /* + ** Put Stream Request (transport image data: client --> server) + */ +typedef struct _xiePutStreamReq { + CARD8 reqType; + CARD8 opcode; /* function == X_iePutStream */ + CARD16 length; + CARD32 photo_id; + CARD32 byte_count; /* image plane data length in bytes */ + BOOL final; + CARD8 plane_num; + CARD8 _pad[2]; +} xiePutStreamReq; + + /* + ** Put Tile Request (transport image data: client --> server) + */ +typedef struct _xiePutTileReq { + CARD8 reqType; + CARD8 opcode; /* function == X_iePutTile */ + CARD16 length; + CARD32 photomap_id; + INT32 x; + INT32 y; + CARD32 width; + CARD32 height; + CARD32 plane_mask; + BOOL final; + CARD8 _pad[3]; +} xiePutTileReq; + + /* + ** Set transport Request (set transport parameters) + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieSetTransport */ + CARD16 length; + CARD32 photo_id; + CARD32 compression_parameter; + CARD8 compression_scheme; + CARD8 mode; + CARD8 component_organization; + CARD8 _pad; + CARD32 plane_mask; + CARD8 pixel_stride[XieK_MaxPlanes]; + CARD32 scanline_stride[XieK_MaxPlanes]; +} xieSetTransportReq; + + /* + ** Export image data to drawable Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieExport */ + CARD16 length; + CARD32 photo_id; + CARD32 drawable_id; + CARD32 gc_id; + INT32 src_x; + INT32 src_y; + CARD32 width; + CARD32 height; + INT32 dst_x; + INT32 dst_y; + CARD32 photo_lut_id; + CARD32 colormap_id; + XieFloatRec match_limit; + XieFloatRec gray_limit; +} xieExportReq; + + /* + ** Free ExportContext from Photomap Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieFreeExport */ + CARD16 length; + CARD32 photo_id; +} xieFreeExportReq; + + /* + ** Import image data from drawable Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieImport */ + CARD16 length; + CARD32 photomap_id; + CARD32 drawable_id; + CARD32 colormap_id; + CARD8 polarity; + CARD8 _pad[3]; +} xieImportReq; + + /* + ** Query ExportContext Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieQueryExport */ + CARD16 length; + CARD32 photo_id; + CARD32 lut_id; + BOOL get_pixels; + CARD8 _pad[3]; +} xieQueryExportReq; + + /* + ** Area Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 ipcc_id; + CARD32 ipct_id; + CARD8 op1; + CARD8 op2; + CARD8 constrain; + CARD8 _pad; +} xieAreaReq; + + /* + ** Area Statistics Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD8 edge_size; + CARD8 stat_type; + CARD8 _pad[2]; +} xieAreaStatsReq; + + /* + ** Arith Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieArithmetic */ + CARD16 length; + CARD32 src1_photo_id; + CARD32 src2_photo_id; + CARD32 constants[XieK_MaxComponents]; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD8 op; + CARD8 constrain; + CARD16 _pad; +} xieArithReq; + + /* + ** Calculate Histogram Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 photo_id; + CARD32 idc_id; + CARD8 by_component; + CARD8 _pad[3]; +} xieCalcHistReq; + + /* + ** Chrominance Combine Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 photo_id1; + CARD32 photo_id2; + CARD32 photo_id3; + CARD32 dst_photo_id; +} xieChromeComReq; + + /* + ** Chrominance Separate Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src_photo; + CARD32 dst_photo; + CARD32 component; +} xieChromeSepReq; + + /* + ** Compare Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src1_photo_id; + CARD32 src2_photo_id; + CARD32 constants[XieK_MaxComponents]; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD8 op; + CARD8 combine; + CARD16 _pad; +} xieCompareReq; + + /* + ** Constrain Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieConstrain */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD8 model; + CARD8 _pad[3]; + CARD32 levels[XieK_MaxComponents]; + +} xieConstrainReq; + + /* + ** Crop Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieCrop */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 idc_id; +} xieCropReq; + + /* + ** Dither Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieDither */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 levels[XieK_MaxComponents]; +} xieDitherReq; + + /* + ** Fill Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieFill */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 dst_idc_id; + CARD32 constant[XieK_MaxComponents]; +} xieFillReq; + + /* + ** Logical Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieLogical */ + CARD16 length; + CARD32 src1_photo_id; + CARD32 src2_photo_id; + CARD32 constants[XieK_MaxComponents]; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD8 op; + CARD8 _pad[3]; + } xieLogicalReq; + + /* + ** Luminance Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieLuminance */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; +} xieLuminanceReq; + + /* + ** Math Function Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD8 op; + CARD8 constrain; + CARD16 _pad; +} xieMathReq; + + /* + ** Match Histogram Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 photo_id1; + CARD32 photo_id2; + CARD32 idc_id; + XieFloatRec param1; + XieFloatRec param2; + CARD8 h_shape; + CARD8 _pad[3]; +} xieMatchHistogramReq; + + /* + ** Mirror Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieMirror */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + BOOL x_mirror; + BOOL y_mirror; + CARD8 _pad[2]; +} xieMirrorReq; + + /* + ** Point Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 idc_id; + CARD32 trans_photo_id; +} xiePointReq; + + /* + ** Point Statistics Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 photo_id; + INT32 x; + INT32 y; + CARD8 height; + CARD8 width; + CARD8 _pad[2]; +} xiePointStatsReq; + + /* + ** Rotate Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieRotate */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + XieFloatRec angle; + CARD32 width; + CARD32 height; + CARD32 fill[XieK_MaxComponents]; +} xieRotateReq; + + /* + ** Scale Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieScale */ + CARD16 length; + CARD32 src_photo_id; + CARD32 dst_photo_id; + CARD32 width; + CARD32 height; +} xieScaleReq; + + /* + ** Translate Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; /* function == X_ieTranslate */ + CARD16 length; + CARD32 src1_photo_id; + CARD32 src2_photo_id; + CARD32 src_idc_id; + CARD32 dst_photo_id; + CARD32 dst_idc_id; +} xieTranslateReq; + +#ifdef NOT_YET_IMPLEMENTED +/************ NONE OF THE FOLLOWING REQUESTS HAVE BEEN IMPLEMENTED ************/ + /* + ** Display Sequence Request + */ +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length; + CARD32 window_id; + CARD16 frame_count; + CARD16 frame_timing; + CARD8 forward; + CARD8 number_of_pixmaps; +} xieDisplaySeqReq; + +/**************************** END OF UNIMPLEMENTED REQUESTS *******************/ +#endif + +/******************************************************************************* +** Events +*******************************************************************************/ + /* + ** Send Xie Event + */ +typedef struct { + CARD8 type; + CARD8 detail; + CARD16 sequenceNumber; + CARD32 resource_id; + CARD8 _pad[24]; +} xieSendEvent; + +/******************************************************************************* +** Replies +*******************************************************************************/ + /* + ** Reply for Init Session + */ +typedef struct { + INT8 type; + CARD8 success; + CARD16 sequenceNumber; + CARD32 length; + CARD16 major_version; + CARD16 minor_version; + CARD32 service_class; /* not implemented */ + CARD8 _pad[16]; +} xieInitSessionReply; + + /* + ** Reply for Query Events + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD32 event_mask; + CARD8 _pad[20]; +} xieQueryEventsReply; + + /* + ** Reply for Query Operational Defaults + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD8 model; + CARD8 _pad[3]; + CARD32 levels[XieK_MaxComponents]; + CARD8 _pad1[8]; +} xieQueryOpDefaultsReply; + + /* + ** Reply for Query Resource: resource type == Photoflo + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD32 status; + CARD8 _pad[20]; +} xieQueryPhotofloReply; + + /* + ** Reply for Query Resource: resource type == Photo{map|tap} + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD32 width; + CARD32 height; + XieFloatRec aspect_ratio; + CARD8 polarity; + CARD8 pixel_progression; + CARD8 line_progression; + BOOL constrained; + CARD8 component_mapping; + CARD8 component_count; + CARD8 _pad[2]; + CARD32 levels[XieK_MaxComponents]; + CARD32 photo_id; +} xieQueryPhotomapReply; + + /* + ** Reply for Query Resource: resource type == Idc of type XieK_Cpp + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + INT32 x; + INT32 y; + CARD32 photomap_id; + CARD8 _pad[12]; +} xieQueryCppReply; + + /* + ** Reply for Query Resource: resource type == Idc of type XieK_Roi + */ +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + INT32 x; + INT32 y; + CARD32 width; + CARD32 height; + CARD8 _pad[8]; +} xieQueryRoiReply; + + /* + ** Reply for Query Resource: resource type == Idc of type XieK_Tmp + */ +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; /* length of entries: long words */ + INT32 center_x; + INT32 center_y; + CARD32 data_count; /* number of XieTmpEntryRec's to */ + CARD8 _pad[12]; /* follow xieQueryTmpReply as data */ +} xieQueryTmpReply; + + /* + ** Reply for Get Stream + */ +typedef struct { + INT8 type; + CARD8 status; + CARD16 sequenceNumber; + CARD32 length; /* length of image data: longwords */ + CARD32 byte_count; /* image plane data length in bytes */ + CARD8 _pad[20]; +} xieGetStreamReply; + + /* + ** Reply for Get Tile + */ +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; /* length of image data: longwords */ + CARD8 _pad[24]; +} xieGetTileReply; + + /* + ** Reply for QueryExport -- returns LUT and list of allocated pixels + */ +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; /* number of pixels being returned */ + CARD32 pixel_count; + CARD32 lut_id; + CARD8 lut_mapping; + CARD8 _pad[15]; +} xieQueryExportReply; + + /* + ** Reply for CalcHistogram -- returns frequency distribution data + */ +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; /* size of histogram list in longs */ + CARD8 _pad[24]; +} xieCalcHistReply; + + /* + ** Reply for Point Statistics + */ +typedef struct { + INT8 type; + INT8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD8 _pad[24]; +} xiePointStatsReply; + +/* the following structure is used for Point Statistics */ + +typedef struct { + XieFloatRec pixel; + XieFloatRec minimum; + XieFloatRec maximum; + XieFloatRec mean; + XieFloatRec std_dev; + XieFloatRec variance; +} xiePointStatsData, *xiePointStatsDataPtr; + + +#ifdef NOT_YET_IMPLEMENTED +/************ NONE OF THE FOLLOWING REPLIES HAVE BEEN IMPLEMENTED *************/ + +typedef struct { + CARD16 screen_width_millimeters; + CARD16 screen_height_millimeters; + CARD16 screen_width_pixels; + CARD16 screen_height_pixels; + CARD16 screen_depth; + CARD16 screen_luts_size; + CARD8 screen_number; + CARD8 screen_luts; + CARD8 screen_brightness_control; + CARD8 screen_contrast_control; + CARD8 screen_hue_control; + CARD8 _pad[5]; +} screen_data; + +typedef struct { + CARD32 minimum; + CARD32 maximum; + CARD32 mean; + CARD32 std_dev; + CARD32 variance; +} statistics_data; + +/* Reply for Dot Product */ + +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD32 _pad[6]; +} xieDotProductReply; + +/*** following display stuff may be deleted or expanded */ + +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD8 idc_type; + CARD8 skip_or_show; + CARD32 pixmap; + CARD16 _pad; +} xieSingleStaticReply; + +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD8 idc_type; + CARD8 map_x_tiles; + CARD8 map_y_tiles; + CARD32 current_frame; + CARD32 number_of_display_frames; +} xieSpatialMapReply; + +typedef struct { + CARD32 pixmap; + CARD8 skip_or_show; + CARD8 _pad[3]; +} display_frame; + +typedef struct { + INT8 type; + CARD8 _reserved; + CARD16 sequenceNumber; + CARD32 length; + CARD32 current_frame; + CARD32 number_of_display_frames; + CARD8 idc_type; + CARD8 map_x_tiles; + CARD8 map_y_tiles; + CARD8 _pad[14]; +} xieTimeSequenceReply; + +/**************************** END OF UNIMPLEMENTED REPLIES ********************/ +#endif +/* +** This "endif" MUST be the last line of this file. +*/ +#endif /* end of XIEPROTO -- NO DEFINITIONS ALLOWED BEYOND THIS POINT */ + diff --git a/xie/docs/dec/xie23/include/dec/extensions/XieUdpDef.h b/xie/docs/dec/xie23/include/dec/extensions/XieUdpDef.h new file mode 100644 index 0000000..9703541 --- /dev/null +++ b/xie/docs/dec/xie23/include/dec/extensions/XieUdpDef.h @@ -0,0 +1,110 @@ +/* + * @DEC_COPYRIGHT@ + */ +/* + * HISTORY + * $Log: XieUdpDef.h,v $ + * Revision 1.2.2.3 92/04/06 08:25:48 Gary_Grebus + * Update to XIE VN/ALPHA_BL1 baselevel. + * [92/03/11 07:13:12 Gary_Grebus] + * + * Revision 1.2 91/12/30 12:48:20 devbld + * Initial load of project + * + * $EndLog$ + */ +/* BuildSystemHeader added automatically */ +/* $Header: /b5/aguws3.0/aguws3.0_rcs/src/dec/extensions/include/XieUdpDef.h,v 1.2.2.3 92/04/06 08:25:48 Gary_Grebus Exp $ */ +/********************************************************************************************************************************/ +/* Created 25-FEB-1992 13:08:45 by VAX SDL V3.2-12 Source: 12-JUL-1990 18:14:51 VNWRKD$:[XIESMI.SRC]XIEUDPDEF.SDL;2 */ +/********************************************************************************************************************************/ +/******************************************************************************* */ +/** Copyright 1989 by Digital Equipment Corporation, Maynard, Massachusetts, */ +/** and the Massachusetts Institute of Technology, Cambridge, Massachusetts. */ +/** */ +/** All Rights Reserved */ +/** */ +/** Permission to use, copy, modify, and distribute this software and its */ +/** documentation for any purpose and without fee is hereby granted, */ +/** provided that the above copyright notice appear in all copies and that */ +/** both that copyright notice and this permission notice appear in */ +/** supporting documentation, and that the names of Digital or MIT not be */ +/** used in advertising or publicity pertaining to distribution of the */ +/** software without specific, written prior permission. */ +/** */ +/** DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */ +/** ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL */ +/** DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR */ +/** ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, */ +/** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */ +/** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS */ +/** SOFTWARE. */ +/** */ +/******************************************************************************* */ +/******************************************************************************* */ +/** */ +/** FACILITY: */ +/** */ +/** Sample Machine Independant DDX */ +/** X Image Extensions */ +/** */ +/** ABSTRACT: */ +/** */ +/** This include file defines low level image data representation */ +/** structures. */ +/** */ +/** ENVIRONMENT: */ +/** */ +/** VAX/VMS V5.3 */ +/** ULTRIX V3.1 */ +/** */ +/** AUTHOR(S): */ +/** */ +/** John Weber */ +/** */ +/** CREATION DATE: */ +/** */ +/** August 12, 1989 */ +/** */ +/** MODIFICATION HISTORY: */ +/** */ +/******************************************************************************* */ + +/*** MODULE XieUdpDef ***/ +#ifndef UDPDEF +#define UDPDEF +struct UDP { + unsigned short int UdpW_PixelLength; + unsigned char UdpB_DType; + unsigned char UdpB_Class; + unsigned char *UdpA_Base; + unsigned long int UdpL_ArSize; + unsigned long int UdpL_PxlStride; + unsigned long int UdpL_ScnStride; + long int UdpL_X1; + long int UdpL_X2; + long int UdpL_Y1; + long int UdpL_Y2; + unsigned long int UdpL_PxlPerScn; + unsigned long int UdpL_ScnCnt; + long int UdpL_Pos; + unsigned long int UdpL_CompIdx; + unsigned long int UdpL_Levels; + } ; +typedef struct UDP UdpRec, *UdpPtr; +#define UdpK_DTypeUndefined 0 +#define UdpK_DTypeMin 1 +#define UdpK_DTypeBU 1 +#define UdpK_DTypeWU 2 +#define UdpK_DTypeLU 3 +#define UdpK_DTypeF 4 +#define UdpK_DTypeC 5 +#define UdpK_DTypeVU 6 +#define UdpK_DTypeV 7 +#define UdpK_DTypeCL 8 +#define UdpK_DTypeMax 8 +#define UdpK_ClassUBA 1 +#define UdpK_ClassUBS 2 +#define UdpK_ClassA 3 +#define UdpK_ClassCL 4 +#endif /* UDPDEF */ diff --git a/xie/docs/dec/xie23/man/XieAbortFlo.3X b/xie/docs/dec/xie23/man/XieAbortFlo.3X new file mode 100644 index 0000000..216b40c --- /dev/null +++ b/xie/docs/dec/xie23/man/XieAbortFlo.3X @@ -0,0 +1,59 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieAbortFlo 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieAbortFlo \- This routine aborts a running photoflo. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fI\fPXieAbortFlo\fI(flo_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto flo_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +None. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "flo_id" 20 +The \fIflo_id\fP argument specifies the +photoflo, or any photomap or phototap bound to the photoflo. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine aborts a running photoflo. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +\fBProtocol Messages:\fP X_ieAbortFlo +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- invalid photoflo +identifier +.PP +BadAlloc -- Insufficient server resources +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieAbortStream.3X b/xie/docs/dec/xie23/man/XieAbortStream.3X new file mode 100644 index 0000000..3f6ff7f --- /dev/null +++ b/xie/docs/dec/xie23/man/XieAbortStream.3X @@ -0,0 +1,75 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieAbortStream 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieAbortStream \- This routine releases server transport resources and aborts any +outstanding planes. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fI\fPXieAbortStream\fI(pho_id, p_mask)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto pho_id; +unsigned long p_mask; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +None. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "pho_id" 20 +The \fIpho_id\fP argument specifies the identifier of +the photoflo or a photomap or phototap bound to the photoflo. +.IP "p_mask" 20 +The \fIp_mask\fP argument specifies the mask that indicates +the plane whose resources you want to release from transport. The least +significant bit of the mask indicates plane 0. You can use the symbol +XieK_AllPlanes to release the resources for all planes. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine releases server transport resources and aborts any +outstanding planes. +If \fIpho_id\fP is a photomap or a phototap, the routine +releases server transport resources for the specified planes. If +\fIpho_id\fP is a photoflo, the routine releases all planes of +server transport resources held by an untapped source or destination hidden +phototaps, or both. +.PP +You can use the XieAbortStream routine to release server +transport resources that were established using the +XieSetStream, XieGetImage, and XiePutImage routines for which +the \fImode\fP argument symbol was XieK_DataFlo or XieK_DataMap. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieAbortStream +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid photomap identifier +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieArea.3X b/xie/docs/dec/xie23/man/XieArea.3X new file mode 100644 index 0000000..90ba16e --- /dev/null +++ b/xie/docs/dec/xie23/man/XieArea.3X @@ -0,0 +1,178 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieArea 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieArea \- This routine creates a new image by transforming a source image +using an area operator. +...\" MANDOC->End OVERVIEW + +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdst_photo_id\fP = XieArea\fI(src_id, tmp_id, idc_id, op1, op2, constrain)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto dst_photo_id; +XiePhoto src_id; +XieTmp tmp_id; +XieIdc idc_id; +unsigned long op1; +unsigned long op2; +unsigned long constrain; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +If the source image is an unbound photomap, the routine returns the +identifier of the newly created photomap in the \fIdst_photo_id\fP +argument. Otherwise, the routine returns the identifier of the photoflo +to which the routine is appended. You can free the photomap +using the +XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id" 20 +The \fIsrc_id\fP argument specifies the identifier +of the source image. If the source image is an unbound photomap, +the operation is performed immediately. Otherwise, a processing +element is appended to the specified photoflo with execution pending +a call to the +XieExecuteFlo routine. The photoflo +is specified explicitly +if the source image is a photoflo, or implicitly if the +source image argument is a photomap or a phototap bound to the photoflo. +.IP "tmp_id" 20 +The \fItmp_id\fP argument specifies the Image Domain +Context (IDC) of type TMP (template) that contains the coefficients used +in the area transformation. The +spatial registration of the template relative to each pixel is established +by the x-coordinate and the y-coordinate of the template center. +The template is specified in the positive x- and positive y-quadrant +of the Cartesian coordinate system. +.IP "idc_id" 20 +The \fIidc_id\fP argument specifies the optional IDC +of type CPP (control processing plane) or ROI (region of interest) +that defines the region of the image over which the routine operates. +If you specify a value of 0, the routine operates across the entire +source image. +.IP "op1" 20 +The \fIop1\fP argument specifies the first operation +performed between each element of the template and the corresponding pixel +in the source image. +.IP "op2" 20 +The \fIop2\fP argument specifies the second operation +performed between the results obtained from the first operation. +The result of the second operation is the resultant pixel value. +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lfR lw(4.0i)fR . +...\" MANDOC->FOOTNOTE tag not supported, FOOTNOTE ignored +.sp 4p +Symbol@Operation Performed +.sp 6p +XieK_AreaOp1Add@T{ +Adds the corresponding pixel and template values +T} +.sp +XieK_AreaOp1Mult@T{ +Multiplies the corresponding pixel and template values +T} +.sp +XieK_AreaOp2Min@T{ +Selects the minimum value resulting from applying the first operator +T} +.sp +XieK_AreaOp2Max@T{ +Selects the maximum value resulting from applying the first operator +T} +.sp +XieK_AreaOp2Sum@T{ +Sums the values resulting from applying the first operator +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +.IP "constrain" 20 +The \fIconstrain\fP argument is a Boolean flag that indicates +whether or not the routine constrains the resulting image data before being +written to the destination image. If you specify True, +the routine constrains the image data based on the current constraint +model. If you specify False, the resulting image data remains unconstrained. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a new image by transforming an existing image +using an area operator. +The routine calculates the transformed value of each pixel based on +the pixel values in the area surrounding the pixel. The routine performs +the calculation in 2 steps, controlled by the \fIop1\fP and +\fIop2\fP arguments. +In the first step, the pointwise sum or product of the template coefficients +and the source image is calculated, producing a two-dimensional array of values. +In the second step, the minimum, maximum, or sum is applied to the +two-dimensional array to yield a single, transformed pixel value. +The registration of the template relative to a particular pixel +is established by the x-coordinate and the y-coordinate values of the +template center. +.PP +The destination image has the same spatial dimensions as those of +the source image. The routine transforms the entire source image +unless you specify an IDC. When you do use an IDC, the region +outside the area defined by the IDC contains the original source values. +If positioning of the template causes some of the template values +to extend beyond the boundaries of the source image, the routine extends +the image and sets the resulting pixel values in the extended area to 0. +However, if the template extends outside the boundaries of the IDC, +the routine uses the template values within for the extended area. +This avoids introducing artifacts into the resulting image. +.PP +The routine converts the source image and the template to be +unconstrained before performing the transformation. +If the value of the \fIconstrain\fP argument +is True, the routine constrains the resulting image data +before writing it to the destination image. +.PP +If the operation is performed immediately and you selected computation +events using the +XieSelectEvents routine, the routine +adds an XieM_ComputationEvent to the X11 event queue when the +routine is completed. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieArea +.PP +\fBXIE event returned:\fP XieK_ComputationEvent +if immediate execution and computation events are selected +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadValue -- Invalid area operator or IDC does not intersect the image +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieAreaStats.3X b/xie/docs/dec/xie23/man/XieAreaStats.3X new file mode 100644 index 0000000..f816d8e --- /dev/null +++ b/xie/docs/dec/xie23/man/XieAreaStats.3X @@ -0,0 +1,133 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieAreaStats 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieAreaStats \- This routine creates a new image by transforming an existing source +image using an area statistics operator. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdst_id\fP = XieAreaStats\fI(src_id, idc_id, op, edge)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto src_id; +XieIdc idc_id; +unsigned long op; +unsigned long edge; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the identifier of the newly created image in +the \fIdst_id\fP argument. You can free the photomap using the +XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id" 20 +The \fIsrc_id\fP argument specifies the unbound +photomap identifier of the source image. +.IP "idc_id" 20 +The \fIidc_id\fP argument specifies the identifier of +the IDC of type ROI that defines the region of the source +image over which the routine operates. +If you specify a value of 0, the routine operates over the entire source image. +.IP "op" 20 +The \fIop\fP argument specifies the statistical operation performed by the +routine. +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lfR lw(4.0i)fR . +.sp 4p +Symbol@Operation Performed +.sp 6p +XieK_Minimum@T{ +Minimum pixel value in area +T} +.sp +XieK_Maximum@T{ +Maximum pixel value in area +T} +.sp +XieK_Mean@T{ +Mean pixel value in area +T} +.sp +XieK_StdDev@T{ +Standard deviation of the pixel +distribution in area +T} +.sp +XieK_Variance@T{ +Variance of the pixel +distribution in area +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +.IP "edge" 20 +The \fIedge\fP argument specifies the size in pixels +of the local area square region surrounding each pixel the routine uses +in the statistical operation. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a new image by transforming an existing source +image using an area statistics operator. +The routine calculates the statistical information pixel by pixel +based on the local area surrounding each pixel. +The \fIedge\fP argument determines the size of the square local area. +.PP +The unbound source photomap must be bitonal or gray scale and +can be either constrained or unconstrained and the destination image +is the same. +.PP +Specification of a nonexistent photomap generates a BadIdChoice error +and specification of a nonexistent IDC or an IDC of type TMP generates +a BadIdChoice error. If the server cannot allocate the destination +photomap, the routine returns a BadAlloc error. Specification of a +multispectral source image returns a BadMatch error. +.PP +If you selected computation events using the XieSelectEvents routine, +the routine adds an XieK_ComputationEvent to the X11 event queue +when the routine is completed. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieArea +.PP +\fBXIE event returned:\fP XieK_ComputationEvent if immediate execution +and computation events are selected +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadMatch -- The source image is multispectral +.PP +BadValue -- Invalid area operator or IDC does not intersect the image +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieArithmetic.3X b/xie/docs/dec/xie23/man/XieArithmetic.3X new file mode 100644 index 0000000..7775dab --- /dev/null +++ b/xie/docs/dec/xie23/man/XieArithmetic.3X @@ -0,0 +1,204 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieArithmetic 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieArithmetic \- This routine creates a new image by arithmetically combining +2 source images or 1 source image and a constant image. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdst_photo_id\fP = XieArithmetic\fI(src_id1, src_id2, +constant, idc_id, operator, constrain)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto dst_photo_id; +XiePhoto src_id1; +XiePhoto src_id2; +unsigned long *constant; +XieIdc idc_id; +unsigned long operator; +unsigned long constrain; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +If the \fIsrc_id1\fP argument specifies an unbound photomap, +the routine returns the newly created destination image identifier +in the \fIdst_photo_id\fP argument. Otherwise, the routine returns +the identifier of the photoflo to which the routine is appended. +You can free the photomap using the XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id1" 20 +The \fIsrc_id1\fP argument specifies the identifier +of the first source image. +If the first source image is an unbound photomap, the operation is +performed immediately. Otherwise, a processing element is appended to the +specified photoflo with execution pending a call to the +XieExecuteFlo routine. +The photoflo is specified explicitly if the first source image +is a photoflo, or implicitly if the first source image +is a photomap or phototap bound to the photoflo. +.IP "src_id2" 20 +The \fIsrc_id2\fP argument specifies the second +source image. If you specify a value of 0 for \fIsrc_id2\fP, +the routine uses the constant image you specified for the +\fIconstant\fP argument as the second image. If you specify +a photoflo for the first source image, the second source image +must be bound to the specified photoflo using the XieBindMapToFlo routine. +.IP "constant" 20 +The \fIconstant\fP argument specifies the address of an array +containing 1 constant value per component used as the second input +when the value of the \fIsrc_id2\fP argument is 0. +.IP "idc_id" 20 +The \fIidc_id\fP argument specifies the identifier of the +optional IDC of type CPP that defines the region of the source +image or images over which the routine operates. +If you specify a value of 0, the +routine operates over the entire intersection of the 2 source images. +.IP "operator" 20 +The \fIoperator\fP argument specifies the type of arithmetic +operation the routine performs. +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lfR lw(4.0i)fR . +.sp 4p +Symbol@Operation Performed +.sp 6p +XieK_AddII@T{ +Adds the data in the 2 source +images +T} +.sp +XieK_AddIC@T{ +Adds the constant value to the +first source image +T} +.sp +XieK_SubII@T{ +Subtracts the data in the second +source image from the data in the first source image +T} +.sp +XieK_SubIC@T{ +Subtracts the constant value from the data in the first source image +T} +.sp +XieK_SubCI@T{ +Subtracts the data in the first source image from the constant value +T} +.sp +XieK_MulII@T{ +Multiplies the data in the 2 source images +T} +.sp +XieK_MulIC@T{ +Multiplies the constant value by the data in the first source image +T} +.sp +XieK_DivII@T{ +Divides the data in the first source image by the data in the second +source image +T} +.sp +XieK_DivIC@T{ +Divides the data in the second source image by the constant value +T} +.sp +XieK_DivCI@T{ +Divides the constant value by the data in the first source image +T} +.sp +XieK_MinII@T{ +Selects the minimum of the data in the 2 source images +T} +.sp +XieK_MinIC@T{ +Selects the minimum of the constant value and the data in the first +source image +T} +.sp +XieK_MaxII@T{ +Selects the maximum of the data in the 2 source images +T} +.sp +XieK_MaxIC@T{ +Selects the maximum of the constant value and the data in the first source image +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +.IP "constrain" 20 +The \fIconstrain\fP argument is a Boolean flag that indicates +whether or not the routine constrains the resulting data before it is +written to the destination image. If you specify True, +the routine constrains the image data based on the current constraint +model. If you specify False, the data remains unconstrained. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a new image by arithmetically combining +2 source images or 1 source image and a constant image. +The 2 source images can be bitonal, gray scale, or multispectral +and be constrained or unconstrained, but the 2 source images must +have the same number of components and be spatially aligned. +If the source images are constrained, the routine first converts +them to be unconstrained before performing the operation. +.PP +If you use a constant image, you must specify the same number of +components as there are in the first source image. +Each point of a component has the value supplied in the constant image array. +.PP +The destination image has the same spatial dimensions as +those of the first source image. The area over which the routine operates +is the intersection of the 2 source images and the IDC, if you specify +one. Any area not operated on by the routine contains the original values +in the first source image. +.PP +If the operation is performed immediately and you selected computation +events using the XieSelectEvents routine, the routine adds an +XieK_ComputationEvent to the X11 event queue when the routine is completed. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieArith +.PP +\fBXIE event returned:\fP XieK_ComputationEvent +if immediate execution and computation events are selected +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadAccess -- 1 source image is a photoflo and the other is not bound to it +.PP +BadMatch -- The source images do not have the same number of components +.PP +BadValue -- The arithmetic operator generated an undefined value or +the IDC does not intersect the source images +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieBindMapToFlo.3X b/xie/docs/dec/xie23/man/XieBindMapToFlo.3X new file mode 100644 index 0000000..2152148 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieBindMapToFlo.3X @@ -0,0 +1,72 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieBindMapToFlo 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieBindMapToFlo \- This routine binds a photomap to a photoflo. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fI\fPXieBindMapToFlo\fI(phf_id, phm_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhotoflo phf_id; +XiePhotomap phm_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +None. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "phf_id" 20 +The \fIphf_id\fP argument specifies the identifier +of a photoflo, or any photomap or phototap bound to the photoflo. +.IP "phm_id" 20 +The \fIphm_id\fP argument specifies the photomap you +want to bind to the photoflo. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine binds a photomap to a photoflo. +The photomap does not have to contain image data. +This way, you can specify inputs to a photoflo +other than the specified input when you created the photoflo. +Once bound to the photoflo, the photomap can receive +image data transported from the client either prior to or during photoflo +execution, or both. The photomap can also serve as an input to +downstream processing elements in the photoflo. However, you cannot use +the photomap for any other purpose until you free the photoflo. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieBindPhotomap +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.br +BadAlloc -- Insufficient server resources +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieCalloc.3X b/xie/docs/dec/xie23/man/XieCalloc.3X new file mode 100644 index 0000000..274afc3 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieCalloc.3X @@ -0,0 +1,68 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieCalloc 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieCalloc \- This routine allocates a block of zeroed memory. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIpointer\fP = XieCalloc\fI(number,size)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +void *pointer; +unsigned number; +unsigned size; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the address of the allocated memory +block in the \fIpointer\fP argument. If the routine fails, the returned +value is null. After using the memory, you should free the memory using +the XieCfree or XieFree routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "number" 20 +The \fInumber\fP argument specifies the number of +multiples of memory you want to allocate. +.IP "size" 20 +The \fIsize\fP argument specifies the number of +bytes contained in each memory multiple. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine allocates a block of zeroed memory. +Using this routine, you can allocate blocks of zeroed memory for any +use on the client side. The amount of memory allocated is equal to +the number multiples multiplied by the number of bytes per multiple. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Returns a null if the routine cannot allocate the memory +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieCallocBits.3X b/xie/docs/dec/xie23/man/XieCallocBits.3X new file mode 100644 index 0000000..e265ca2 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieCallocBits.3X @@ -0,0 +1,66 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieCallocBits 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieCallocBits \- This routine allocates zeroed memory for an image data array. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIpointer\fP = XieCallocBits\fI(bits)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned char *pointer; +unsigned bits; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns a pointer to the allocated +image data array in the \fIpointer\fP argument. +If the routine fails, the routine returns null. +After using the memory, you should free the memory +using the +XieFreeBits routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "bits" 20 +The \fIbits\fP argument specifies the size of the +allocated image data array in bits. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine allocates zeroed memory for an image data array. +The size of the data array is specified by the \fIsize\fP argument. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Returns a null if the routine cannot +allocate the memory +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieCfree.3X b/xie/docs/dec/xie23/man/XieCfree.3X new file mode 100644 index 0000000..8f1111e --- /dev/null +++ b/xie/docs/dec/xie23/man/XieCfree.3X @@ -0,0 +1,61 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieCfree 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieCfree \- This routine deallocates memory that was allocated using either the +XieCalloc or XieRealloc routine. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fInull\fP = XieCfree\fI(ptr)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +void *null; +char *ptr; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +Returns a null pointer. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "ptr" 20 +The \fIptr\fP argument specifies the pointer to +the block of memory you want to deallocate. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine deallocates memory that was allocated using either the +XieCalloc or XieRealloc routine. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieCheckFunction.3X b/xie/docs/dec/xie23/man/XieCheckFunction.3X new file mode 100644 index 0000000..020c72d --- /dev/null +++ b/xie/docs/dec/xie23/man/XieCheckFunction.3X @@ -0,0 +1,75 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieCheckFunction 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieCheckFunction \- This routine checks for the availability of server support for a +specified XIE protocol function. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIstring\fP = XieCheckFunction\fI(dpy, function)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +char *string; +Display *dpy; +int function; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns a pointer to a character string that describes the +protocol function in the \fIstring\fP argument. +If the server does not support the function, +the routine returns a null value. The \fIstring\fP argument +should not be freed. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "dpy" 20 +The \fIdpy\fP argument specifies the +X11 display identifier returned by the XOpenDisplay routine. +.IP "function" 20 +The \fIfunction\fP argument specifies the XIE protocol +function minor op-code that you want to check. The valid range is from +0 to 255. For a list of minor op-code symbols, refer to the applicable +include file. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine checks for the availability of server support for a +specified XIE protocol function. +This routine returns a pointer to a character string that describes +whether or not your server supports the specified XIE protocol function. +If the server does not support the function, the routine returns a null +pointer. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieChromeCom.3X b/xie/docs/dec/xie23/man/XieChromeCom.3X new file mode 100644 index 0000000..c0337db --- /dev/null +++ b/xie/docs/dec/xie23/man/XieChromeCom.3X @@ -0,0 +1,137 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieChromeCom 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieChromeCom \- This routine creates a multispectral image by combining the 3 +chrominance components of existing images. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdst_photo_id\fP = XieChromeCom\fI(src_id1, src_id2, src_id3)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto dst_photo_id; +XiePhoto src_id1; +XiePhoto src_id2; +XiePhoto src_id3; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +If the 3 source images are all unbound photomaps, the routine returns the +identifier of the newly created image in the \fIdst_photo_id\fP +argument. Otherwise, the routine returns the +identifier of the photoflo to which the processing element is appended. +You can free the photomap using the XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id1" 20 + +The \fIsrc_id1\fP argument specifies the identifier of the +source image that provides the red component. +If you are using this routine outside the context of a photoflo, +you must specify an unbound photomap. +If you are using this routine within the context a photoflo, the +source image can be a photoflo, or a photomap or phototap bound to +the photoflo. +.IP +If you specify an unbound photomap, the operation is performed immediately. +Otherwise, a processing element is appended to the photoflo with +execution pending a +call to the +XieExecuteFlo routine. +The photoflo is specified explicitly if the source image is a photoflo, +or implicitly if the source image is a phototap or a photomap bound +to the photoflo. +.IP "src_id2" 20 +The \fIsrc_id2\fP argument specifies the identifier of the +source image that provides the green component. +If you are using this routine outside the context of a photoflo, +you must specify an unbound photomap. +If you are using this routine within the context a photoflo, the +source image can be a photoflo, or a photomap or phototap bound to +the photoflo. +.IP +If you specify an unbound photomap, the operation is performed immediately. +Otherwise, a processing element is appended to the photoflo with execution +pending a call to the +XieExecuteFlo routine. +The photoflo is specified explicitly if the source image is a photoflo, +or implicitly if the source image is a phototap or a photomap bound +to the photoflo. +.IP "src_id3" 20 +The \fIsrc_id3\fP argument specifies the identifier of the +source image that provides the blue component. +If you are using this routine outside the context of a photoflo, +you must specify an unbound photomap. +If you are using this routine within the context a photoflo, the +source image can be a photoflo, or a photomap or phototap bound to +the photoflo. +.IP +If you specify an unbound photomap, the operation is performed immediately. +Otherwise, a processing element is appended to the photoflo with execution +pending a call to the +XieExecuteFlo routine. +The photoflo is specified explicitly if the source image is a photoflo, +or implicitly if the source image is a phototap or a photomap bound +to the photoflo. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a multispectral image by combining the 3 +chrominance components of existing images. +The source images must be either all constrained or all be unconstrained. +The output photomap is either constrained or unconstrained, depending +on the source images. +.PP +The routine assumes the source images to be spatially aligned at the upper +left corner. If the source images are of different sizes, the +routine calculates the size of the combined image +to be the intersection of the source images. +.PP +If the operation is performed immediately and you selected computation +events using the +XieSelectEvents routine, the routine adds an +XieK_ComputationEvent to the X11 event queue +when the routine is completed. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieChromeCom +.PP +\fBXIE event returned:\fP XieK_ComputationEvent +if immediate execution and computation events are selected +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadAccess -- 1 source image is a photoflo and the others are not bound to +it +.PP +BadMatch -- A source image has multiple components or the source images +are not all constrained or all unconstrained. +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieChromeSep.3X b/xie/docs/dec/xie23/man/XieChromeSep.3X new file mode 100644 index 0000000..be6c882 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieChromeSep.3X @@ -0,0 +1,91 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieChromeSep 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieChromeSep \- This routine separates 1 chrominance component from a multispectral +source image and creates a new image containing the separated component. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdst_photo_id\fP = XieChromeSep\fI(src_id, component)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto dst_photo_id; +XiePhoto src_id; +unsigned long component; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +If the source image is an unbound photomap, +the routine returns the identifier of the newly created image in the +\fIdst_photo_id\fP argument. Otherwise, the routine returns the +identifier of the photoflo to which the processing element is appended. +You can free the photomap using the XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id" 20 +The \fIsrc_id\fP argument specifies the identifier +of the source image. If the source image is +an unbound photomap, the operation is performed immediately. +Otherwise, a processing element is appended to the specified photoflo with +execution pending a call to the XieExecuteFlo routine. +The photoflo is specified explicitly if the source image is a photoflo, +or implicitly if the source image is a phototap or a photomap bound +to the photoflo. +.IP "component" 20 +The \fIcomponent\fP argument specifies the +chrominance component you want to separate. Specify a value of 0, 1, +or 2. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine separates 1 chrominance component from a multispectral +source image and creates a new image containing the separated component. +.PP +The source image component organization must be multispectral +and can be constrained or unconstrained. The output image is either +constrained or unconstrained, depending on the source image. +.PP +If the operation is performed immediately and you have +selected computation events using the XieSelectEvents routine, the routine +adds an XieK_ComputationEvent to the X11 event queue when the routine is +completed. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieChromeSep +.PP +\fBXIE event returned:\fP XieK_ComputationEvent if immediate execution and +computation events are selected +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadValue -- The specified component is not 0, 1, or 2 +.PP +BadMatch -- The source image is not multispectral +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieClonePhoto.3X b/xie/docs/dec/xie23/man/XieClonePhoto.3X new file mode 100644 index 0000000..406aa5d --- /dev/null +++ b/xie/docs/dec/xie23/man/XieClonePhoto.3X @@ -0,0 +1,83 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieClonePhoto 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieClonePhoto \- This routine clones a photoflo using an existing photomap as its image +data source, or clones a photomap using only the attributes +of an existing photomap. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIphoto_id\fP = XieClonePhoto\fI(phm_id, type)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto photo_id; +XiePhotomap phm_id; +unsigned long type; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +If you clone a photomap, the routine returns the identifier of the +cloned photomap in the \fIphoto_id\fP argument. If you clone a photoflo, +the routine returns the identifier of the cloned photoflo. +You can free the photo using the XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "phm_id" 20 +If you clone a photoflo, the \fIphm_id\fP argument +specifies the existing unbound photomap that the routine binds +to the photoflo. The photomap does not +have to contain image data, and you can transport client +image data to the photomap prior to or during photoflo execution, +or both. The photomap can also supply data to downstream processing +elements in the photoflo, but is not available for any other purpose until +you free the photoflo. +.IP +If you clone a photomap, the \fIphm_id\fP argument specifies +the unbound photomap whose attributes are copied to the new photomap. +.IP "type" 20 +The \fItype\fP argument specifies whether the cloned +image is a photoflo or a photomap. Specify either the +XieK_Photoflo or XieK_Photomap symbol. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine clones a photoflo using an existing photomap as its image +data source, or clones a photomap using the attributes only +of an existing photomap. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieCreateByReference +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Returns a null if the source image is +not a photomap or is a photoflo +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieCompare.3X b/xie/docs/dec/xie23/man/XieCompare.3X new file mode 100644 index 0000000..1565a1e --- /dev/null +++ b/xie/docs/dec/xie23/man/XieCompare.3X @@ -0,0 +1,179 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieCompare 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieCompare \- This routine relationally compares 2 source images, or 1 source image +and a constant image, and creates a new image based on the comparison. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdst_photo_id\fP = XieCompare\fI(src_id1, src_id2, constant, idc_id, +operator, combine)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto dst_photo_id; +XiePhoto src_id1; +XiePhoto src_id2; +unsigned long *constant; +XieIdc idc_id; +unsigned long operator; +unsigned long combine; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +If the first source image is an unbound photomap, +the routine returns the identifier of the newly created photomap +in the \fIdst_photo_id\fP argument. Otherwise, the routine returns the +identifier of the processing element to which this routine is appended. +You can free the photomap using the XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id1" 20 +The \fIsrc_id1\fP argument specifies the first source image. +If the image is an unbound photomap, +the operation is performed immediately. Otherwise the routine is +appended to the processing element with execution pending a call to the +routine. The photoflo is specified explicitly if the source image is a +photoflo, or implicitly if the source image is a photomap or a phototap +bound to the photoflo. +.IP "src_id2" 20 +The \fIsrc_id2\fP argument specifies the second +source image. If you specify a value of 0, the routine +uses the constant image you specify for the \fIconstant\fP +argument as the second source image. If the first source image is +a photoflo, the second source image must be bound to the photoflo using +the XieBindMapToFlo routine. +.IP "constant" 20 +The \fIconstant\fP argument specifies the address of an array +containing one constant value per component +the routine uses to compare with the first source image. If +you specify a value that is not 0 for the \fIsrc_id2\fP argument, +the routine ignores the \fIconstant\fP argument. Each point of a +component has the value supplied in the corresponding element of the +constant image. +.IP "idc_id" 20 +The \fIidc_id\fP argument specifies the optional IDC +of type CPP or ROI that defines the region of the image or images the +routine compares. If you specify a value of 0, the routine +performs the comparison across the entire intersection of the 2 source images. +.IP "operator" 20 +The \fIoperator\fP argument specifies the comparison +operation the routine performs. Only XieK_EQ and XieK_NE are valid +for multispectral images. +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lfR lw(4.0i)fR . +.sp 4p +Symbol@Comparison +.sp 6p +XieK_LT@T{ +First operand less than second +T} +.sp +XieK_LE@T{ +First operand less than or equal to second +T} +.sp +XieK_EQ@T{ +Operands are equal +T} +.sp +XieK_NE@T{ +Operands are not equal +T} +.sp +XieK_GT@T{ +First operand is greater than the second +T} +.sp +XieK_GE@T{ +First operand is greater than or equal to second +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +.IP "combine" 20 +The Boolean \fIcombine\fP argument specifies whether or not +the resulting image, created by comparing 2 multispectral images, has 1 +component or multiple components. The routine applies to this argument only +when the 2 source images are multispectral. If you specify a value of False, +the resulting photomap contains multiple components, each representing +the results of comparing like components of the 2 source images. +If you specify a value of True, the routine compares +each component for equality, and +the results are logically ANDed to obtain a single-component result. If +you specified a value of XieK_NE for the \fIoperator\fP +argument, the routine logically complements the logically ANDed result. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine relationally compares 2 source images, or 1 source image +and a constant image, and creates a new image based on the comparison. +The 2 source images must have the same number of components +and are assumed to be spatially aligned. If 1 of the source images is +unconstrained, the routine first converts the other source image to +unconstrained before performing the comparison. +.PP +The resulting image has the same spatial dimensions as those of the +first source image. The routine performs +the comparison over the region defined by the +intersection of the 2 source images and the IDC, if you specify 1. +.PP +The resulting image is always bitonal. If the specified comparison between +the 2 pixel values is True, the corresponding output pixel is set to +a logical 1. If the comparison is False, the corresponding output pixel is +set to a logical 0. Output pixels are also set to a logical 0 if they are +located outside the region being compared. +.PP +If the operation is performed immediately and you selected computation +events using the XieSelectEvents routine, the routine adds an +XieK_ComputationEvent to the X11 event queue when the routine is completed. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieCompare +.PP +X_ieQueryResource if the constant array is null +.PP +\fBXIE event returned:\fP XieK_ComputationEvent if immediate execution and +computation events are selected +.PP +\fBXieLib errors:\fP Returns a null if the constant array argument is null +and the second source image identifier is invalid +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadAccess -- 1 source image is a photoflo and the other is not bound to it +.PP +BadValue -- The IDC does not intersect the source images +.PP +BadMatch -- The source images do not have the same number of components +or the source images are multispectral and the compare operator is not either +XieK_EQ or XieK_NE +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieConstrain.3X b/xie/docs/dec/xie23/man/XieConstrain.3X new file mode 100644 index 0000000..20a8635 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieConstrain.3X @@ -0,0 +1,118 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieConstrain 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieConstrain \- This routine creates a constrained copy of a source image. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdst_photo_id\fP = XieConstrain\fI(src_id, model, levels)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto dst_photo_id; +XiePhoto src_id; +int model; +unsigned long int levels[]; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +If the source image is an unbound +photomap, the routine returns the identifier of the newly created image +in the \fIdst_photo_id\fP argument. Otherwise, the routine returns the +identifier of the photoflo to which the routine is appended. +You can free the photomap using the XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id" 20 +The \fIsrc_id\fP argument specifies the source image. +If the image is an unbound photomap, the operation is performed immediately. +Otherwise, a processing element is appended to the specified photoflo with +execution pending a call to the XieExecuteFlo routine. +The photoflo is specified explicitly if the source image +is a photoflo, or implicitly if the source image is a photomap +or phototap bound to the photoflo. +.IP "model" 20 +The \fImodel\fP argument specifies the +constraint model the routine uses to convert the source image. +If you specify a value of 0, the +routine ignores the \fIlevels\fP argument and uses the session default +constraint model. See the XieSetOpDefaults routine for more information. +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lfR lw(4.0i)fR . +...\" MANDOC->FOOTNOTE tag not supported, FOOTNOTE ignored +.sp 4p +Symbol@Operation Performed +.sp 6p +XieK_HardClip@T{ +Apply hard clip model +T} +.sp +XieK_ClipScale@T{ +Apply clip scale model +T} +.sp +XieK_HardScale@T{ +Apply hard scale model +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +.IP "levels" 20 +The \fIlevels\fP argument specifies the address of an +array that defines the number of levels to which each component is +constrained. This array must be at least XieK_MaxComponents elements in length. +The routine ignores this argument if you specify a value of 0 +for the \fImodel\fP argument. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a constrained copy of a source image. +The routine constrains the image based on the specified constraint model and +number of levels. If the source image is already constrained, the routine +first converts the data to be unconstrained before reconstraining it. +.PP +If the operation is performed immediately and you selected computation +events using the XieSelectEvents +routine, the routine adds an XieK_ComputationEvent +to the X11 event queue when the routine is completed. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieConstrain +.PP +\fBXIE event returned:\fP XieK_ComputationEvent +if immediate execution and computation events are selected +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadValue -- Invalid constraint model +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieCopyImage.3X b/xie/docs/dec/xie23/man/XieCopyImage.3X new file mode 100644 index 0000000..d80a584 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieCopyImage.3X @@ -0,0 +1,90 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieCopyImage 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieCopyImage \- This routine creates a client XieImage by copying an existing XieImage. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdst_image\fP = XieCopyImage\fI(img, mode)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XieImage dst_image; +XieImage img; +unsigned char mode; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the identifier of the newly created image in +the \fIdst_image\fP argument. You can free the image using the XieFreeImage +routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "img" 20 +The \fIimg\fP argument specifies the pointer to the XieImageRec you want to +copy. +.IP "mode" 20 +The \fImode\fP argument specifies the status of image data in the new XieImage. +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lfR lw(4.0i)fR . +.sp 4p +Symbol@Status of Image Data in the New XieImage +.sp 6p +XieK_DataNone@T{ +Image data pointers = null +T} +.sp +XieK_DataAlloc@T{ +Allocate new image buffers containing no data +T} +.sp +XieK_DataCopy@T{ +Allocate new image buffers and copy data +T} +.sp +XieK_DataShare@T{ +Copy pointers to existing image data +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a client XieImage by copying an existing XieImage. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Fatal, invalid mode argument +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieCreateCpp.3X b/xie/docs/dec/xie23/man/XieCreateCpp.3X new file mode 100644 index 0000000..c62e765 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieCreateCpp.3X @@ -0,0 +1,77 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieCreateCpp 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieCreateCpp \- This routine creates an IDC (Image Domain Context) of type CPP +(Control Processing Plane). +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIcpp\fP = XieCreateCpp\fI(dpy, x, y, phm_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XieCpp cpp; +Display *dpy; +long x; +long y; +XiePhotomap phm_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the identifier of the CPP. +You can free the CPP using the XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "dpy" 20 +The \fIdpy\fP argument specifies the X11 display +identifier returned by the XOpenDisplay routine. +.IP "x" 20 +The \fIx\fP argument specifies the x-coordinate of +the upper left hand corner of the CPP. +.IP "y" 20 +The \fIy\fP argument specifies the y-coordinate of +the upper left hand corner of the CPP. +.IP "phm_id" 20 +The \fIphm_id\fP argument specifies the identifier +of the bitonal photomap used as a control processing plane. See +the XieCreatePhoto routine for more information. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates an IDC of type CPP. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieCreateByValue +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Returns a null if the control processing +plane is not a photomap +.PP +\fBXieServer errors:\fP BadAlloc -- Insufficient server +resources +.PP +BadIDChoice -- Invalid identifier +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieCreateImage.3X b/xie/docs/dec/xie23/man/XieCreateImage.3X new file mode 100644 index 0000000..a4c5550 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieCreateImage.3X @@ -0,0 +1,394 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieCreateImage 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieCreateImage \- This routine creates a client XieImage using specified image record +attributes passed as parameters. The image contains no image data. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIimage\fP = XieCreateImage\fI(width, height, cmpres, cmp_org, cmp_map, + cmp_cnt, cmp_lvl, pxl_mod, scn_mod)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XieImage image; +unsigned long width; +unsigned long height; +unsigned char cmpres; +unsigned char cmp_org; +unsigned char cmp_map; +unsigned char cmp_cnt; +unsigned long *cmp_lvl; +unsigned char pxl_mod; +unsigned char scn_mod; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the newly created image. You can free the image using the +XieFreeImage routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "width" 20 +The \fIwidth\fP argument specifies the image width in pixels. +.IP "height" 20 +The \fIheight\fP argument specifies the image height in scanlines. +.IP "cmpres" 20 +The \fIcmpres\fP argument specifies the image compression scheme. +.IP "cmp_org" 20 +The \fIcmp_org\fP argument specifies the image component organization. +.IP "cmp_map" 20 +The \fIcmp_map\fP argument specifies the image component mapping. +.IP "cmp_cnt" 20 +The \fIcmp_cnt\fP argument specifies the number of image components. +.IP "cmp_lvl" 20 +The \fIcmp_lvl\fP argument specifies the pointer to an +array of image component levels. The array must be at least +XieK_MaxComponents in length. +.IP "pxl_mod" 20 +The \fIpxl_mod\fP argument specifies the image pixel +stride modulo. The pixel stride modulo is the modulo of the number +of bits between the starting points of adjacent pixels on +a scanline. For example, a pixel stride modulo of 8 indicates the +pixel stride is a multiple of a byte. If you specify a value of less +than 2 for this argument, the routine does not add padding bits. +.IP "scn_mod" 20 +The \fIscn_mod\fP argument specifies the image scanline +stride modulo. The scanline stride modulo is the modulo of the number of +bits between the starting points of adjacent scanlines. For example, +a scanline stride modulo of 32 indicates that the scanline stride is a +multiple of a longword. If you specify a scanline stride modulo of less than +2, the routine does not add scanline padding bits. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a client XieImage using specified image record +attributes passed as parameters. The image contains no image data. +.PP +The routine fills in the XieImageRec fields. +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lw(1.2i)fR lw(4.0i)fR . +.sp 4p +XieImage Field@Initial Value +.sp 6p +Compression@T{ +compression_scheme +T} +.sp +CmpOrg@T{ +component_organization +T} +.sp +CmpMap@T{ +component_mapping +T} +.sp +CmpCnt@T{ +component_count +T} +.sp +CmpLvl@T{ +component_levels +T} +.sp +CmpLen@T{ +ceil(log10(component_levels)/log10(2.0)) +T} +.sp +PxlPol@T{ +dependent on component_mapping: +T} +.sp +.TE +.PP +.TS +tab(@); +lw(1.2i)fR lfR lw(4.0i)fR . +.sp 4p +@Component_mapping@Initial Value +.sp 6p +@XieK_Bitonal@T{ +XieK_ZeroBright +T} +.sp +@XieK_GrayScale@T{ +XieK_ZeroDark +T} +.sp +@XieK_RGB@T{ +XieK_ZeroDark +T} +.sp +.TE +.PP +.TS +tab(@); +lw(1.2i)fR lw(4.0i)fR . +.sp 4p +PxlProg@T{ +XieK_PP0 +T} +.sp +ScnProg@T{ +XieK_LP270 +T} +.sp +OwnData@T{ +False +T} +.sp +Stream@T{ +0 +T} +.sp +Xport@T{ +Null +T} +.sp +PxlRatio@T{ +1.0 +T} +.sp +Plane@T{ +UdpPtr's, dependent on component_organization: +T} +.sp +.TE +.PP +.TS +tab(@); +lw(1.2i)fR lfR lw(4.0i)fR . +.sp 4p +@Component_organization@UdpRec's Allocated +.sp 6p +@XieK_BandByPixel@T{ +1 +T} +.sp +@XieK_BandByPlane@T{ +component_count +T} +.sp +@XieK_BitByPlane@T{ +total of CmpLen +T} +.sp +.TE +.PP +The routine fills in all fields in each UdpRec. +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lw(1.2i)fR lw(4.0i)fR . +.sp 4p +UdpRec Field@Initial Value +.sp 6p +UdpW_PixelLength@T{ +dependent on component_organization: +T} +.sp +.TE +.PP +.TS +tab(@); +lw(1.2i)fR lfR lw(4.0i)fR . +.sp 4p +@Component_organization@Initial Value +.sp 6p +@XieK_BandByPixel@T{ +total of CmpLen +T} +.sp +@XieK_BandByPlane@T{ +CmpLen +T} +.sp +@XieK_BitByPlane@T{ +1 +T} +.sp +.TE +.PP +.TS +tab(@); +lw(1.2i)fR lw(4.0i)fR . +.sp 4p +UdpB_DType@T{ +UdpK_DTypeV if compression_scheme +is not XieK_PCM, otherwise dependent +on UdpW_PixelLength: +T} +.sp +.TE +.PP +.TS +tab(@); +lw(1.2i)fR lfR lw(4.0i)fR . +.sp 4p +@UdpW_PixelLength@Data Type +.sp 6p +@8@T{ +UdpK_DTypeBU +T} +.sp +@16@T{ +UdpK_DTypeWU +T} +.sp +@32@T{ +UdpK_DTypeLU +T} +.sp +@other@T{ +UdpK_DTypeVU +T} +.sp +.TE +.PP +.TS +tab(@); +lw(1.2i)fR lw(4.0i)fR . +.sp 4p +UdpB_Class@T{ +UdpK_ClassUBS if compression_scheme is not +XieK_PCM, otherwise dependent on UdpW_PixelLength: +T} +.sp +.TE +.PP +.TS +tab(@); +lw(1.2i)fR lfR lw(4.0i)fR . +.sp 4p +@UdpW_PixelLength@Data Type +.sp 6p +@8, 16, or 32@T{ +UdpK_ClassA +T} +.sp +@other@T{ +UdpK_ClassUBA +T} +.sp +.TE +.PP +.TS +tab(@); +lw(1.2i)fR lw(4.0i)fR . +.sp 4p +UdpA_Base@T{ +Null +T} +.sp +UdpL_ArSize@T{ +UdpL_ScnStride * height +T} +.sp +UdpL_PxlStride@T{ +UdpW_PixelLength, rounded up to \fIpixel_stride_modulo\fP +T} +.sp +UdpL_ScnStride@T{ +UdpL_PxlStride * width, rounded up to \fIscanline_stride_modulo\fP +T} +.sp +UdpL_X1@T{ +0 +T} +.sp +UdpL_X2@T{ +width - 1 +T} +.sp +UdpL_Y1@T{ +0 +T} +.sp +UdpL_Y2@T{ +height - 1 +T} +.sp +UdpL_PxlPerScn@T{ +width +T} +.sp +UdpL_ScnCnt@T{ +height +T} +.sp +UdpL_Pos@T{ +0 +T} +.sp +UdpL_CompIdx@T{ +dependent on component_organization: +T} +.sp +.TE +.PP +.TS +tab(@); +lw(1.2i)fR lfR lw(4.0i)fR . +.sp 4p +@Component_organization@Initial Value +.sp 6p +@XieK_BandByPixel@T{ +0 +T} +.sp +@XieK_BandByPlane@T{ +plane index (0,1, or 2) +T} +.sp +@XieK_BitByPlane@T{ +component index (0,1,2) +T} +.sp +.TE +.PP +.TS +tab(@); +lw(1.2i)fR lw(4.0i)fR . +.sp 4p +UdpL_Levels@T{ +2 ^ UdpW_PixelLength +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Fatal, invalid component organization argument +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieCreatePhoto.3X b/xie/docs/dec/xie23/man/XieCreatePhoto.3X new file mode 100644 index 0000000..02ba758 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieCreatePhoto.3X @@ -0,0 +1,105 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieCreatePhoto 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieCreatePhoto \- This routine creates a photoflo or photomap using the specified image +attributes. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIphoto\fP = XieCreatePhoto\fI(dpy, type, width, height, cmp_map, cmp_cnt, + cmp_lvl, pxl_pol, pxl_ratio, pxl_prog, scn_prog)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhotomap photomap; +Display *dpy; +unsigned char type; +unsigned long width; +unsigned long height; +unsigned char cmp_map; +unsigned char cmp_cnt; +unsigned char *cmp_lvl; +unsigned char pxl_pol; +double pxl_ratio; +unsigned char pxl_prog; +unsigned char scn_prog; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the identifier of the newly created photomap or +photoflo. You can free the photo using the XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "dpy" 20 +The \fIdpy\fP argument specifies the X11 display identifier returned by the X11 +XOpenDisplay routine. +.IP "type" 20 +The \fItype\fP argument specifies the type of image you +want to create. You can specify the symbols XieK_Photoflo and XieK_Photomap. +.IP "width" 20 +The \fIwidth\fP argument specifies the image width in pixels. +.IP "height" 20 +The \fIheight\fP argument specifies the image height in scanlines. +.IP "cmp_map" 20 +The \fIcmp_map\fP argument specifies the image component mapping. +.IP "cmp_cnt" 20 +The \fIcmp_cnt\fP argument specifies the number of components in the image. +.IP "cmp_lvl" 20 +The \fIcmp_lvl\fP argument specifies the address +of an array containing the number of levels per component in the image. +The length of the array must be at least equal to the value specified +by the symbol XieK_MaxComponents. +.IP "pxl_pol" 20 +The \fIpxl_pol\fP argument specifies the image pixel brightness polarity. +.IP "pxl_ratio" 20 +The \fIpxl_ratio\fP argument specifies the image pixel aspect ratio. +.IP "pxl_prog" 20 +The \fIpxl_prog\fP argument specifies the image pixel progression. +.IP "scn_prog" 20 +The \fIscn_prog\fP argument specifies the image scanline progression. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a photoflo or photomap using the specified image +attributes. +.PP +If you specify that the routine create a photoflo, the routine attaches +an ephemeral phototap to the photoflo. If you want to directly access +this phototap, use the XieTapFlo routine to assign an identifier to the +phototap. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieCreateByValue +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadAlloc -- Insufficient server resources +.PP +BadIDChoice -- Invalid identifier +.PP +BadValue -- Height or width is 0 +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieCreateRoi.3X b/xie/docs/dec/xie23/man/XieCreateRoi.3X new file mode 100644 index 0000000..4fded6c --- /dev/null +++ b/xie/docs/dec/xie23/man/XieCreateRoi.3X @@ -0,0 +1,84 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieCreateRoi 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieCreateRoi \- This routine creates an IDC type ROI. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIroi\fP = XieCreateRoi\fI(dpy, x, y, width, height)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XieRoi roi; +Display *dpy; +long x; +long y; +unsigned long width; +unsigned long height; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the identifier of the newly created ROI in +the \fIroi\fP argument. You can free the ROI +using the +XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "dpy" 20 +The \fIdpy\fP argument specifies the X11 display identifier +returned by the +XOpenDisplay routine. +.IP "x" 20 +The \fIx\fP argument specifies the x-coordinate of +the upper left hand corner of the ROI. +.IP "y" 20 +The \fIy\fP argument specifies the y-coordinate of +the upper left hand corner of the ROI. +.IP "width" 20 +The \fIwidth\fP argument specifies the width of the ROI +in pixels. +.IP "height" 20 +The \fIheight\fP argument specifies the height of the ROI +in scanlines. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates an IDC of type ROI. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieCreateByValue +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadAlloc -- Insufficient server +resources +.PP +BadIDChoice -- Invalid identifier +.PP +BadValue -- Height or width is 0 +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieCreateTmp.3X b/xie/docs/dec/xie23/man/XieCreateTmp.3X new file mode 100644 index 0000000..66d442e --- /dev/null +++ b/xie/docs/dec/xie23/man/XieCreateTmp.3X @@ -0,0 +1,94 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieCreateTmp 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieCreateTmp \- This routine creates an IDC of type TMP. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fItmp\fP = XieCreateTmp\fI(dpy, x, y, count, tmp_list)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XieTmp tmp; +Display *dpy; +long x; +long y; +unsigned long count; +XieTemplate tmp_list; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the identifier of the newly created TMP in +the \fItmp\fP argument. You can free the TMP +using the +XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "dpy" 20 +The \fIdpy\fP argument specifies the X11 display +identifier returned by the +XOpenDisplay routine. +.IP "x" 20 +The \fIx\fP argument specifies the x-coordinate of the +template center. +.IP "y" 20 +The \fIy\fP argument specifies the y-coordinate of the +template center. +.IP "count" 20 +The \fIcount\fP argument specifies the number of +template records contained in the \fItmp_list\fP argument. +.IP "tmp_list" 20 +The \fItmp_list\fP argument specifies the address of +an array of template records of type XieTemplateRec, which are +defined to be: +...\" MANDOC->Begin CODE_EXAMPLE +.oS +typedef struct { + long x; /* x-coordinate of template entry */ + long y; /* y-coordinate of template entry */ + double value; /* value of template entry */ +} XieTemplateRec, *XieTemplate; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates an IDC of type TMP. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieCreateByValue +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadAlloc -- Insufficient server +resources +.PP +BadIDChoice -- Invalid identifier +.PP +BadValue -- The count is less than or equal to 0 +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieCrop.3X b/xie/docs/dec/xie23/man/XieCrop.3X new file mode 100644 index 0000000..7a3d5f3 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieCrop.3X @@ -0,0 +1,82 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieCrop 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieCrop \- This routine creates a cropped version of a source image. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdst_photo_id\fP = XieCrop\fI(src_id, idc_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto dst_photo_id; +XiePhoto src_id; +XieIdc idc_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the identifier of the newly created image in +the \fIdst_photo_id\fP argument if the source image is an unbound +photomap. Otherwise, the routine returns the identifier of the photoflo to +which the processing element is appended. You can free the photomap using the +XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id" 20 +The \fIsrc_id\fP argument specifies the identifier +of the source image. If the source image is an unbound photomap, +the operation is performed immediately. Otherwise, a processing element is +appended to the specified photoflo with execution pending a call to the +XieExecuteFlo routine. The photoflo is specified +explicitly if the source image is a photoflo, or implicitly if the source image +is a photomap or phototap bound to the photoflo. +.IP "idc_id" 20 +The \fIidc_id\fP argument specifies the identifier +of the IDC of type ROI that defines the crop boundaries. +If you specify a value of 0, the entire source image is copied to the +destination image. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a cropped version of a source image. +.PP +If the operation is performed immediately and you selected computation events +using the XieSelectEvents routine, an XieK_ComputationEvent +is added to the X11 event queue when the routine is completed. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieCrop +.PP +\fBXIE event returned:\fP XieK_ComputationEvent +if immediate execution and computation events are selected +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadValue -- The IDC does not intersect the source image +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieDither.3X b/xie/docs/dec/xie23/man/XieDither.3X new file mode 100644 index 0000000..8d95485 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieDither.3X @@ -0,0 +1,90 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieDither 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieDither \- This routine creates a dithered copy of a source image. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdst_photo_id\fP = XieDither\fI(src_id, levels)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto dst_photo_id; +XiePhoto src_id; +unsigned long *levels; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +If the source image is an unbound photomap, the routine returns the +identifier of the newly created image in the \fIdst_photo_id\fP +argument. Otherwise, the routine returns the identifier of the photoflo to which +the processing element is appended. You can free the photomap using the +XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id" 20 +The \fIsrc_id\fP argument specifies the source image. +If the source image is an unbound photomap, the operation is performed +immediately. Otherwise, the processing element is appended to the specified +photoflo with execution pending a call to the XieExecuteFlo routine. The +photoflo is specified explicitly if the source image is a photoflo, or +implicitly if the source image is a photomap or phototap bound to the photoflo. +.IP "levels" 20 +The \fIlevels\fP argument specifies the address of an +array containing the maximum number of output levels for each +component of the dithered image. For example, to dither a gray scale +image down to a bitonal image, the array entry would be levels[0] = 2; +and to dither a multispectral image to 8 bits per pixel the array +entries can be levels[0]=3, levels[1]=3, and levels[3]=2. +If you specify a null value, the routine uses a default of 2 levels +per component. Dithering to 1 level results in a value of 0 for all +pixels in the component. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a dithered copy of a source image. +.PP +If the operation is performed immediately and you selected +computation events using the XieSelectEvents routine, an +XieK_ComputationEvent is added to the X11 event queue when the +routine is completed. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieDither +.PP +\fBXIE event returned:\fP XieK_ComputationEvent +if immediate execution and computation events are selected +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadMatch -- The source image is not constrained or the levels argument +is greater than the levels in the source image +.PP +BadValue -- The levels argument is 0 or negative +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieExecuteFlo.3X b/xie/docs/dec/xie23/man/XieExecuteFlo.3X new file mode 100644 index 0000000..8332498 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieExecuteFlo.3X @@ -0,0 +1,74 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieExecuteFlo 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieExecuteFlo \- This routine starts photoflo execution. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fI\fPXieExecuteFlo\fI(flo_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto flo_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +None. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "flo_id" 20 +The \fIflo_id\fP argument specifies the photoflo identifier, +or the identifier of any photomap or phototap bound to the photoflo. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine starts photoflo execution. You must have issued calls +to append all processing elements and set up transport prior to +calling this +routine. You can transport data into the photoflo or to bound source +photomaps, either before or during execution. You can transport data out +of the photoflo or destination photomaps and phototaps either +during or after execution. +.PP +If you selected computation events using the XieSelectEvents +routine, adds an +XieK_PhotofloEvent +to the X11 event queue upon photoflo completion. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieExecuteFlo +.PP +\fBXIE event returned:\fP XieK_PhotofloEvent +if immediate execution and computation events selected +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +Any error that can be returned by a processing element in the photoflo +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieExport.3X b/xie/docs/dec/xie23/man/XieExport.3X new file mode 100644 index 0000000..20f81a4 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieExport.3X @@ -0,0 +1,174 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieExport 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieExport \- This routine exports an XIE image to an X11 drawable. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fI\fPXieExport\fI(src_id, d, gc, sx, sy, dx, dy, w, h, lut_id, +cmap_id, match, gray)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto src_id; +Drawable d; +GC gc; +long sx; +long sy; +long dx; +long dy; +unsigned long w; +unsigned long h; +XiePhoto lut_id; +Colormap cmap_id; +double match; +double gray; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +None. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id" 20 +The \fIsrc_id\fP argument specifies the source image. +If the source image is an unbound photomap, +the operation is performed immediately. Otherwise, a processing element is +appended to the specified photoflo with execution pending a call to +the XieExecuteFlo routine. The photoflo is specified explicitly +if the source image is a photoflo, or implicitly if the source image +is a photomap or phototap bound to the photoflo. +.IP "d" 20 +The \fId\fP argument specifies the X11 drawable +identifier returned by the XCreateWindow and XCreatePixmap routines. +.IP "gc" 20 +The \fIgc\fP argument specifies the X11 graphics context +identifier returned by the XCreateGC routine. +.IP "sx" 20 +The \fIsx\fP argument specifies the x-coordinate +of the upper left hand corner of the source image region you want to export. +.IP "sy" 20 +The \fIsy\fP argument specifies the y-coordinate +of the upper left hand corner of the source image region you want to export. +.IP "dx" 20 +The \fIdx\fP argument specifies the x-coordinate of +the upper left hand corner of the X11 drawable region to hold the exported +image. +.IP "dy" 20 +The \fIdy\fP argument specifies the y-coordinate +of the upper left hand corner of the X11 drawable region to hold the +exported image. +.IP "w" 20 +The \fIw\fP argument specifies the width in pixels +of the source image region you want to export. +.IP "h" 20 +The \fIh\fP argument specifies the height in scanlines +of the source image region you want to export. +.IP "lut_id" 20 +The \fIlut_id\fP argument specifies an optional +photomap identifier of the LUT (lookup table) used to map the source +image continuous-tone pixels to a client-allocated palette of colormap pixels. +.IP +You can specify a 3-plane LUT (multispectral photomap) to simulate the +direct color or true color visual classes. Each plane contains enough +entries to satisfy the number of levels per component in the source image. +.IP +You can specify a single-plane LUT (gray scale photomap) to simulate other +visual classes. If the source image is multispectral, XIE accesses the +LUT as follows: +...\" MANDOC->Begin CODE_EXAMPLE +.oS +pixel_index = *(LUT + red_value + + green_value * red_levels + + blue_value * red_levels * green_levels) +.oE +...\" MANDOC->End CODE_EXAMPLE +.IP +If you specify a value for the \fIlut_id\fP argument, the routine +ignores the \fIcmap_id\fP, \fImatch\fP, and \fIgray\fP +arguments. If the routine is performed within a photoflo, the +\fIlut_id\fP photomap must be bound to the photoflo. +.IP "cmap_id" 20 +The \fIcmap_id\fP specifies an optional colormap associated with the +target X11 drawable and from which the routine allocates or matches, +or both, continuous-tone image pixels. +.IP "match" 20 +The \fImatch\fP argument specifies an optional +granularity factor the routine uses for matching continuous-tone +image pixels to the pseudocolor and gray scale visual class +colormap pixel indices. The valid range is from 0.0 (use exact matches only) +to 1.0 (use closest shareable pixel from the colormap). Values between the +extremes result in a mix of shared pixels and new allocations. +.IP "gray" 20 +The \fIgray\fP argument specifies an optional +gray shade purity factor the routine uses for matching gray scale +image pixels to the pseudocolor visual class colormap pixel indices. +The valid range is from 0.0 (use pure gray shades only) to 1.0 (use +closest shareable pixel from the colormap). Values between the extremes +result in a mix of shared pixels and new allocations. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine exports an XIE image to an X11 drawable. +The routine creates an ExportContext and attaches it to the +source image. The ExportContext contains information +concerning the export request and the resources used. For example, +the colormap pixels and the LUT the routine allocates to satisfy the +request. If you issue similar export requests later, the information in the +routine uses the ExportContext to expedite the request. See the +XieFreeExport routine for more information about how to free the context and +how to retrieve the list of allocated colormap indices. +.PP +If the operation is performed immediately and you selected computation events +using the XieSelectEvents routine, the routine adds an XieK_DisplayEvent +to the X11 event queue when the routine is completed. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieExportImage +.PP +\fBXIE event returned:\fP XieK_DisplayEvent if +execution is immediate and computation events selected +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadDrawable -- Invalid X11 drawable +.PP +BadGC -- Invalid graphics context +.PP +BadMatch -- The source image is not constrained, the graphics context +is not compatible with the X11 drawable, the LUT has fewer levels +than the source image, the LUT is not compatible with the X11 drawable +levels, or the source image is not compatible with the X11 drawable +.PP +BadValue -- The height or width is less than or equal to 0 +.PP +BadAccess -- The export is within a photoflo and the LUT is not bound +to it or the export context is incorrectly used +.PP +BadColor -- Invalid colormap +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieFill.3X b/xie/docs/dec/xie23/man/XieFill.3X new file mode 100644 index 0000000..8ac1017 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieFill.3X @@ -0,0 +1,94 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieFill 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieFill \- This routine creates a new image by filling a region of a source +image with a constant. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdst_photo_id\fP = XieFill\fI(src_id, idc_id, fill)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto dst_photo_id; +XiePhoto src_id; +XieResource idc_id; +unsigned long *fill; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +If the source image is an unbound photomap, the routine returns the +identifier of the newly created image in the \fIdst_photo_id\fP +argument. Otherwise, the routine returns the identifier of the photoflo +to which the processing element is appended. You can free +the image using the XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id" 20 +The \fIsrc_id\fP argument specifies the source image +you want to copy and fill. If the source image is an unbound photomap, +the operation is performed immediately. Otherwise, a processing element is +appended to the specified photoflo with execution pending a call to +the XieExecuteFlo routine. The photoflo is specified +explicitly if the source image is a photoflo, or implicitly if the source image +is a photomap or phototap bound to the photoflo. +.IP "idc_id" 20 +The \fIidc_id\fP argument specifies the identifier +of the IDC of type CPP or ROI that defines the region you want to fill. +If you specify a value of 0, the entire source image is copied and filled. +.IP "fill" 20 +The \fIfill\fP argument specifies the address of an array of +constants used as pixel values in the fill region for each component. +The array must specify 1 constant per component in the destination image. +For example, you could define array entries to be fill[0]=pixel_value, +fill[1]=pixel_value, and fill[2]=pixel_value. +If you specify a value of null, the routine uses a default constant value +that fills the region with a maximum intensity (white) pixel value. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a new image by filling a region of a source +image with a constant. +.PP +If the operation is performed immediately and you selected computation events +using the XieSelectEvents routine, the routine adds an +XieK_ComputationEvent to the X11 event queue when the routine is completed. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieFill and X_ieQueryResource if +the fill argument is null +.PP +\fBXIE event returned:\fP XieK_ComputationEvent +if immediate execution and computation events are selected +.PP +\fBXieLib errors:\fP Returns null if the fill array is +null and the source image is invalid +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadValue -- The IDC does not intersect the source image +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieFindResource.3X b/xie/docs/dec/xie23/man/XieFindResource.3X new file mode 100644 index 0000000..d77a99a --- /dev/null +++ b/xie/docs/dec/xie23/man/XieFindResource.3X @@ -0,0 +1,70 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieFindResource 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieFindResource \- This routine returns the identifier of an XIE resource that matches +a specified X11 resource identifier. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIresource\fP = XieFindResource\fI(dpy, id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XieResource resource; +Display *dpy; +XID id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the XIE resource identifier that matches the +specified X11 resource identifier. If no match is found, the routine returns +a null. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "dpy" 20 +The \fIdpy\fP argument specifies the X11 display +identifier returned by the +XOpenDisplay routine. +.IP "id" 20 +The \fIid\fP argument specifies the X11 resource +identifier associated with the XIE resource you want to find. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine returns the identifier of an XIE resource that matches +a specified X11 resource identifier. You can use this routine +to map an X11 resource identifier returned by an X11 error +to an XIE resource identifier. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieFree.3X b/xie/docs/dec/xie23/man/XieFree.3X new file mode 100644 index 0000000..2ef7b5b --- /dev/null +++ b/xie/docs/dec/xie23/man/XieFree.3X @@ -0,0 +1,62 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieFree 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieFree \- This routine deallocates the memory allocated using the +XieMalloc, XieCalloc, and XieRealloc routines. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fInull\fP = XieFree\fI(ptr)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +void *null; +char *ptr; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +Returns a null pointer. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "ptr" 20 +The \fIptr\fP argument specifies the pointer to the +address of the block of memory you want to deallocate. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine deallocates the memory allocated using the +XieMalloc, XieCalloc, and XieRealloc routines. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Returns a null if the routine cannot +allocate the memory +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieFreeBits.3X b/xie/docs/dec/xie23/man/XieFreeBits.3X new file mode 100644 index 0000000..36b7af4 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieFreeBits.3X @@ -0,0 +1,64 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieFreeBits 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieFreeBits \- This routine deallocates an image data array allocated using the +XieCallocBits, XieMallocBits, and +XieReallocBits routines. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fInull\fP = XieFreeBits\fI(ptr)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned char *null; +unsigned char *ptr; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +Returns a null pointer. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "ptr" 20 +The \fIptr\fP argument specifies the +address of the image data array you want to deallocate. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine deallocates an image data array allocated using the +XieCallocBits, XieMallocBits, and +XieReallocBits routines. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Returns a null if the routine cannot +allocate the memory +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieFreeExport.3X b/xie/docs/dec/xie23/man/XieFreeExport.3X new file mode 100644 index 0000000..7e68d6e --- /dev/null +++ b/xie/docs/dec/xie23/man/XieFreeExport.3X @@ -0,0 +1,69 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieFreeExport 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieFreeExport \- This routine frees the export context created using the XieExport routine. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fI\fPXieFreeExport\fI(src_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto src_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +None. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id" 20 +The \fIsrc_id\fP argument specifies the image from which +to free an export context. The image can be an unbound photomap, +a photoflo, phototap, or a bound photomap. The photoflo +is specified explicitly if the image is a photoflo, or implicitly if +the image is a bound photomap or phototap bound to the photoflo. +If the image is bound to a photoflo, the photoflo execution must be complete +or the routine returns an error. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine frees the export context created using the XieExport +routine. The routine does not deallocate the associated LUT and list +of allocated pixels if you previously retrieved them using the XieQueryExport +routine. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieFreeExport +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadAccess -- The export is within a photoflo that is not complete +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieFreeImage.3X b/xie/docs/dec/xie23/man/XieFreeImage.3X new file mode 100644 index 0000000..f4b4bc5 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieFreeImage.3X @@ -0,0 +1,60 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieFreeImage 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieFreeImage \- This routine frees an XieImage. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fInull\fP = XieFreeImage\fI(img)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XieImage img; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +Returns a null pointer. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "img" 20 +The \fIimg\fP argument specifies the address of the XieImage +you want to free. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine deallocates the specified XieImageRec and all associated +UdpRec's. If the value of the OwnData field of the XieImageRec is True, +the routine also deallocates each plane of image data. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieFreeResource.3X b/xie/docs/dec/xie23/man/XieFreeResource.3X new file mode 100644 index 0000000..b5d8dc6 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieFreeResource.3X @@ -0,0 +1,60 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieFreeResource 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieFreeResource \- This routine frees a server resource and all associated data. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fInull\fP = XieFreeResource\fI(res_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XieResource res_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +Returns a null pointer. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "res_id" 20 +The \fIres_id\fP argument specifies the identifier +of the server resource you want to deallocate. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine deallocates a server resource and all associated data. +If the server resource is a phototap, the routine deallocates the client +resources, but does not generate a server protocol message. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieDeleteResource +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieGetImage.3X b/xie/docs/dec/xie23/man/XieGetImage.3X new file mode 100644 index 0000000..af661bb --- /dev/null +++ b/xie/docs/dec/xie23/man/XieGetImage.3X @@ -0,0 +1,169 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieGetImage 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieGetImage \- This routine creates a client XieImage from an existing server image +with image data optional. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIimage\fP = XieGetImage\fI(pho_id, compres, cmpprm, cmp_org, pxl_mod, + scn_mod, mode)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XieImage image; +XiePhoto pho_id; +unsigned char compres; +unsigned long cmpprm; +unsigned char cmp_org; +unsigned char pxl_mod; +unsigned char scn_mod; +unsigned char mode; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the newly created XieImage in the \fIimage\fP +argument. You can free the image using the XieFreeImage routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "pho_id" 20 +The \fIpho_id\fP argument specifies the identifier of the source image. +The source image can be an unbound photomap, a photoflo, or a phototap +or photomap bound to the photoflo. The photoflo is specified explicitly if +the source image is a photoflo, or implicitly if the source image is a +phototap or a photomap bound to the photoflo. +.IP "compres" 20 +The \fIcompres\fP argument specifies the compression scheme for the newly +created XieImage. +.IP "cmpprm" 20 +The \fIcmpprm\fP argument specifies a parameter required for the DCT +compression scheme. +.IP "cmp_org" 20 +The \fIcmp_org\fP argument specifies the component organization for the +XieImage. +.IP "pxl_mod" 20 +The \fIpxl_mod\fP argument specifies the image pixel +stride modulo. The pixel stride modulo is the modulo of the number +of bits between the starting points of adjacent pixels on +a scanline. For example, a pixel stride modulo of 8 indicates the +pixel stride is a multiple of a byte. If you specify a value of less +than 2 for this argument, the routine does not add padding bits. +.IP "scn_mod" 20 +The \fIscn_mod\fP argument specifies the image scanline +stride modulo. The scanline stride modulo is the modulo of the number of +bits between the starting points of adjacent scanlines. For example, +a scanline stride modulo of 32 indicates that the scanline stride is a +multiple of a longword. If you specify a scanline stride modulo of less than +2, the routine does not add scanline padding bits. +.IP "mode" 20 +The \fImode\fP argument specifies the disposition of image data +in the new XieImage. +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lfR lw(4.0i)fR . +.sp 4p +Symbol@Status of Image Data in the New XieImage +.sp 6p +XieK_DataNone@T{ +Zero image data pointers +T} +.sp +XieK_DataAlloc@T{ +Allocate new image buffers containing no data +T} +.sp +XieK_DataCopy@T{ +Allocate new image buffers and fetch data, if available +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a client XieImage from an existing server image +with image data optional. The attributes of the new XieImage are the same +as the attributes of the source image and the image data +format is that specified by the \fIcmp_org\fP argument. Transport of +image data to the new XieImage depends on the value of the \fImode\fP argument. +.PP +If you specify a value of XieK_DataNone or XieK_DataAlloc for the \fImode\fP +argument, no data is transported and you are responsible for transporting all +planes of the image data, using the desired compression scheme and component +organization. If you specify a value of XieK_DataCopy, +an attempt is made to transport all image data planes using the specified +compression scheme and component organization. The stream field of the returned +XieImageRec indicates the status of the requested data as follows: +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lfR lw(4.0i)fR . +.sp 4p +Symbol Returned@Meaning +.sp 6p +XieK_StreamFinal@T{ +All of +the image has been retrieved +T} +.sp +XieK_StreamEmpty@T{ +Some or all of the image is unavailable -- try again later using the +XieGetImageData routine +T} +.sp +XieK_StreamError@T{ +A server error occurred while retrieving the data +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +.PP +When requesting data from a photoflo, the returned status is normally +XieK_StreamEmpty. In this case, use the +XieGetImageData routine, either during or after +photoflo execution, to retrieve image data created by the photoflo. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieQueryResource +.PP +X_ieSetTransport for XieK_DataCopy mode only +.PP +X_ieGetStream 1 or more times per plane for the XieK_DataCopy mode only +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Reply error, BadLength +.PP +Fatal, invalid mode argument +.PP +Returns null if the source image is invalid +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieGetImageData.3X b/xie/docs/dec/xie23/man/XieGetImageData.3X new file mode 100644 index 0000000..ce15a19 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieGetImageData.3X @@ -0,0 +1,83 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieGetImageData 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieGetImageData \- This routine transports all planes of image data from a server source +image to a client XieImage. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIstatus\fP = XieGetImageData\fI(img)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned char status; +XieImage img; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the status of the routine execution in the +\fIstatus\fP argument. The status values are: +...\" MANDOC->Begin UNNUMBERED LIST +.IP \(bu 3 +XieK_StreamFinal -- all data has been transported +.IP \(bu 3 +XieK_StreamMore -- more data is available +.IP \(bu 3 +XieK_StreamEmpty -- no more data currently available; +try again later +.IP \(bu 3 +XieK_StreamError -- invalid destination image +...\" MANDOC->End LIST +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "img" 20 +The \fIimg\fP argument specifies the address of the XieImage +structure to receive the image data. You must have created this XieImage +structure using the +XieGetImage routine. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine transports all planes of image data from a server source +image to a client XieImage. Use this routine to transport +photoflo image data that was not available when +you used the +XieGetImage routine. This routine always executes +immediately, even when you specify a photoflo for the \fIimg\fP +argument. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +\fBProtocol Messages:\fP X_ieGetStream 1 or more times +.PP +X_ieAbortStream if there is an error +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Reply error, BadLength +.PP +XieK_StreamError if the destination image is invalid +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieGetStream.3X b/xie/docs/dec/xie23/man/XieGetStream.3X new file mode 100644 index 0000000..ba03158 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieGetStream.3X @@ -0,0 +1,111 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieGetStream 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieGetStream \- This routine transports a plane of image data as a byte stream from +a server source image to a client XieImage data buffer. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIstatus\fP = XieGetStream\fI(pho_id, plane, ptr_ptr, getbytes, retbytes)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned char status; +XiePhoto pho_id; +unsigned long plane; +unsigned char **ptr_ptr; +unsigned long getbytes; +unsigned long *retbytes; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the image data transport status in the +\fIstatus\fP argument. The returned status values are as follows: +...\" MANDOC->Begin UNNUMBERED LIST +.IP \(bu 3 +XieK_StreamFinal -- all data has been transported +.IP \(bu 3 +XieK_StreamEmpty -- no data currently available +.IP \(bu 3 +XieK_StreamMore -- more data available +...\" MANDOC->End LIST +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "pho_id" 20 +The \fIpho_id\fP argument specifies the identifier of the +source image. If the source image is an unbound photomap, the data is +transported immediately. Otherwise, a processing element is appended to the +specified photoflo and executed when the photoflo generates image data. +The photoflo is specified explicitly if the source image is +a photoflo, or implicitly if the source image is a phototap or a +photomap bound to the photoflo. +.IP "plane" 20 +The \fIplane\fP argument specifies the image data plane you want to transport. +.IP "ptr_ptr" 20 +The \fIptr_ptr\fP argument specifies the address of the +pointer to the XieImage data buffer in which to store the image data. +If the pointer is null, the routine allocates a data buffer, the size +of which is determined by the \fIretbytes\fP argument. +The routine returns the address of the allocated data buffer in +\fIptr_ptr\fP. You can deallocate this buffer using the XieFree routine. +.IP "getbytes" 20 +The \fIgetbytes\fP argument specifies the maximum number +of data bytes you want to transport. +.IP "retbytes" 20 +The \fIretbytes\fP argument specifies a pointer to +the location where the routine returns the number of bytes actually transported. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine transports a plane of image data as a byte stream from +a server source image to a client XieImage data buffer. +The routine always executes immediately even if the \fIpho_id\fP +argument specifies a photoflo. +.PP +You must set up the transport parameters using the XieSetStream +routine prior to calling this routine. If you are +transporting multiple data planes, use the XieSetStream and +XieGetStream routines in combination +for each plane. You can abort stream transport prior to completion +using the XieAbortStream routine. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieGetStream for each plane +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Reply error, BadLength +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadAccess -- Stream transport not set or the specified photoflo has been +aborted +.PP +BadMatch -- The plane was not specified during set transport or the +attempted transport direction is not the same as specified during set +transport +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieGetTile.3X b/xie/docs/dec/xie23/man/XieGetTile.3X new file mode 100644 index 0000000..c1a291f --- /dev/null +++ b/xie/docs/dec/xie23/man/XieGetTile.3X @@ -0,0 +1,100 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieGetTile 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieGetTile \- This routine transports a tile of uncompressed image data from a server +photomap to a client XieImage. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fI\fPXieGetTile\fI(phm_id, img, p_mask, src_x, src_y, dst_x, dst_y, width, + height)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhotomap phm_id; +XieImage img; +unsigned long p_mask; +long src_x; +long src_y; +long dst_x; +long dst_y; +unsigned long width; +unsigned long height; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +None. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "phm_id" 20 +The \fIphm_id\fP argument specifies the identifier of the source photomap. +.IP "img" 20 +The \fIimg\fP argument specifies the address of an existing XieImage data +structure. +.IP "p_mask" 20 +The \fIp_mask\fP argument specifies a mask that +identifies the planes you want to transport. The least significant +bit of the mask corresponds to plane 0. You can specify the symbol +XieK_AllPlanes to transport all planes. +.IP "src_x" 20 +The \fIsrc_x\fP argument specifies the x-coordinate +of the upper left hand corner of the photomap tile you want to transport. +.IP "src_y" 20 +The \fIsrc_y\fP argument specifies the y-coordinate +of the upper left hand corner of the photomap tile you want to transport. +.IP "dst_x" 20 +The \fIdst_x\fP argument specifies the x-coordinate +of the upper left hand corner of the transported tile in the XieImage. +.IP "dst_y" 20 +The \fIdst_y\fP argument specifies the y-coordinate +of the upper left hand corner of the transported tile in the XieImage. +.IP "width" 20 +The \fIwidth\fP argument specifies the width in pixels +of the source photomap tile you want to transport. +.IP "height" 20 +The \fIheight\fP argument specifies the height in +scanlines of the source photomap tile you want to transport. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine transports a tile of uncompressed image data from a server +photomap to a client XieImage. You cannot use this routine from a +photoflo and the source photomap cannot be bound to a photoflo. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieSetTransport +.PP +1 or more calls to X_ieGetTile +.PP +\fBXIE event returned:\fP None +.PP +\fBLib errors:\fP Reply error, BadLength +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadValue -- The resulting height or width is less than or equal to 0 +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieHistogram.3X b/xie/docs/dec/xie23/man/XieHistogram.3X new file mode 100644 index 0000000..8c40b11 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieHistogram.3X @@ -0,0 +1,98 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieHistogram 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieHistogram \- This routine calculates the frequency histogram for a photomap. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdata\fP = XieHistogram\fI(photo,idc,by_component)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto photo; +XieIdc idc; +BOOL by_component; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the histogram data to an array of longwords +pointed to by the \fIdata\fP argument. Each entry in the array consists +of a pixel value index and the number of pixels found to have that value. +.PP +If the image is multispectral and the value of the \fIby_component\fP +argument is True requesting 3 separate distributions, +the index is a single value. Otherwise, the index is a list of 3 values. +.PP +You can free the returned array using the XieFree routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "photo" 20 +The \fIphoto\fP argument specifies the identifier of +the source photomap, which must be constrained. +.IP "idc" 20 +The \fIidc\fP argument specifies the identifier +of the CPP or ROI that defines the region over which you want to +calculate the histogram. If you specify a value of 0, the routine calculates +the histogram over the entire source image. +.IP "by_component" 20 +The \fIby_component\fP argument specifies whether the +routine calculates the frequency distribution for each component +separately or for the 3 components combined. To obtain a frequency +distribution for each component, specify a value of True. For a +combined distribution, specify a value of False. +.IP +When calculating a distribution for each component, the routine totals +identical pixel values separately for each component. For a combined +distribution, the routine totals identical red, green, blue (RGB) +triplet values for all components combined. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine calculates the frequency histogram for a photomap. +The distribution reflects the population of all possible pixel values for a +given photomap based on the actual data content. +.PP +The routine can calculate the frequency distribution for a bitonal +image, gray scale image, or a multispectral image. +.PP +For multispectral images, only the per-component is currently supported. +Setting the \fBby_component\fP argument False results in a BadMatch error. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieCalcHist +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Reply error, BadLength +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadMatch -- The by_component argument is False and the source image is +multispectral +.PP +BadValue -- IDC does not intersect source image +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieImport.3X b/xie/docs/dec/xie23/man/XieImport.3X new file mode 100644 index 0000000..f502014 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieImport.3X @@ -0,0 +1,100 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieImport 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieImport \- This routine imports an X11 drawable image to a photomap. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIphotomap\fP = XieImport\fI(dpy, drawable, cmap_id, pxl_pol)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhotomap photomap; +Display *dpy; +Drawable drawable; +Colormap cmap_id; +unsigned char pxl_pol; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the imported photomap identifier in the +\fIphotomap\fP argument. +You can free the photomap using the XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "dpy" 20 +The \fIdpy\fP argument specifies the X11 display identifier returned by the +XOpenDisplay routine. +.IP "drawable" 20 +The \fIdrawable\fP argument specifies the X11 drawable +identifier returned by routines such as XCreateWindow and XCreatePixmap. +.IP "cmap_id" 20 +The \fIcmap_id\fP argument specifies the +X11 colormap the routine uses to convert source drawable pixel +indices to RGB values in the imported photomap. +.IP "pxl_pol" 20 +The \fIpxl_pol\fP argument specifies the +pixel polarity attribute assigned to the imported photomap. +For image data imported from a drawable greater than depth 1, +specify the pixel polarity symbol XieK_ZeroDark. +For pixmaps having a depth of 1, the pixmap data may not map directly +to a colormap index. Therefore, you must specify the desired pixel +polarity for the imported image. Specify either the XieK_ZeroDark or +XieK_ZeroBright symbol. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine imports an X11 drawable image to a photomap. +You cannot import a drawable to a photoflo. +The routine analyzes the drawable data to determine the component mapping +for the imported photomap. If the depth of the drawable is 1 or all +pixels are either black or white, the routine set the +component mapping to XieK_Bitonal. If any pixel +contains unequal RGB values, the routine sets the +component mapping to XieK_RGB. Otherwise, the routine sets +the component mapping to XieK_GrayScale. +.PP +If you selected computation events using the XieSelectEvents routine, +the routine adds an XieK_ComputationEvent to the X11 event +queue when the routine is completed. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieImportImage +.PP +\fBXIE event returned:\fP XieK_ComputationEvent +if immediate execution and computation events are selected +.PP +\fBXieLib errors:\fP Reply error, BadLength +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.br +BadAlloc -- Insufficient server resources +.br +BadDrawable -- Invalid X11 drawable +.br +BadMatch -- The X11 drawable is not entirely visible on the screen +.br +BadColor -- Invalid X11 colormap +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieIsBitonal.3X b/xie/docs/dec/xie23/man/XieIsBitonal.3X new file mode 100644 index 0000000..6c48f88 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieIsBitonal.3X @@ -0,0 +1,67 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieIsBitonal 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieIsBitonal \- This routine determines whether or not the component mapping of +a photo associated with a given identifier is bitonal. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIflag\fP = XieIsBitonal\fI(photo_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned char flag; +XiePhoto photo_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns a value of True in the \fIflag\fP argument if the +specified photo component mapping is XieK_Bitonal. +Otherwise the returned value is False. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "photo_id" 20 +The \fIphoto_id\fP argument specifies the identifier +of the photo you want to test. You can specify an unbound +photomap, a photomap bound to a photoflo, a phototap, or a photoflo. +If you specify a photoflo, the routine tests the photomap or phototap +currently at the end of the photoflo. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine determines whether or not the component mapping of +a photo associated with a given identifier is bitonal. +You can use the C Macro \fIIsBitonal_\fP instead of this routine. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieIsCpp.3X b/xie/docs/dec/xie23/man/XieIsCpp.3X new file mode 100644 index 0000000..ed05cad --- /dev/null +++ b/xie/docs/dec/xie23/man/XieIsCpp.3X @@ -0,0 +1,63 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieIsCpp 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieIsCpp \- This routine determines whether or not the XIE resource +associated with a given identifier is a CPP. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIflag\fP = XieIsCpp\fI(res_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned char flag; +XieResource res_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns a value of True in the \fIflag\fP argument if the +specified XIE resource is a CPP. Otherwise the returned value is False. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "res_id" 20 +The \fIres_id\fP argument specifies the identifier of +the XIE resource you want to test. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine determines whether or not the XIE resource +associated with a given identifier is a CPP. +You can use the C Macro \fIIsCpp_\fP instead of this routine. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieIsGrayScale.3X b/xie/docs/dec/xie23/man/XieIsGrayScale.3X new file mode 100644 index 0000000..45c24f7 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieIsGrayScale.3X @@ -0,0 +1,67 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieIsGrayScale 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieIsGrayScale \- This routine determines whether or not the component mapping of +a photo associated with a given identifier is gray scale. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIflag\fP = XieIsGrayScale\fI(photo_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned char flag; +XiePhoto photo_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns a value of True in the \fIflag\fP argument if the +specified photo component mapping is XieK_GrayScale. Otherwise +the returned value is False. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "photo_id" 20 +The \fIphoto_id\fP argument specifies the identifier +of the photo you want to test. You can specify an unbound +photomap, a photomap bound to a photoflo, a phototap, or a photoflo. +If you specify a photoflo, the routine tests the photomap or phototap +currently at the end of the photoflo. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine determines whether or not the component mapping of +a photo associated with a given identifier is gray scale. +You can use the C Macro \fIIsGrayScale_\fP instead of this routine. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieIsIdc.3X b/xie/docs/dec/xie23/man/XieIsIdc.3X new file mode 100644 index 0000000..522c739 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieIsIdc.3X @@ -0,0 +1,63 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieIsIdc 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieIsIdc \- This routine determines whether or not the XIE resource +associated with a given identifier is an IDC. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIflag\fP = XieIsIdc\fI(res_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned char flag; +XieResource res_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns a value of True in the \fIflag\fP argument if the +specified XIE resource is an IDC. Otherwise the returned value is False. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "res_id" 20 +The \fIres_id\fP argument specifies the identifier of +the XIE resource you want to test. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine determines whether or not the XIE resource +associated with a given identifier is an IDC. +You can use the C Macro \fIIsIdc_\fP instead of this routine. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieIsPhoto.3X b/xie/docs/dec/xie23/man/XieIsPhoto.3X new file mode 100644 index 0000000..c57d611 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieIsPhoto.3X @@ -0,0 +1,65 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieIsPhoto 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieIsPhoto \- This routine determines whether or not the XIE resource +associated with a given identifier is a photo. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIflag\fP = XieIsPhoto\fI(res_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned char flag; +XieResource res_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns a value of True in the \fIflag\fP argument if the +specified XIE resource is either a photomap, photoflo, or phototap. +Otherwise the returned value is False. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "res_id" 20 +The \fIres_id\fP argument specifies the identifier of +the XIE resource you want to test. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine determines whether or not the XIE resource +associated with a given identifier is a photo, which can be +either a photomap, photoflo, or phototap. +You can use the C Macro \fIIsPhoto_\fP instead of this routine. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieIsPhotoFlo.3X b/xie/docs/dec/xie23/man/XieIsPhotoFlo.3X new file mode 100644 index 0000000..8c52608 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieIsPhotoFlo.3X @@ -0,0 +1,63 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieIsPhotoflo 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieIsPhotoflo \- This routine determines whether or not the XIE resource +associated with a given identifier is a photoflo. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIflag\fP = XieIsPhotoflo\fI(res_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned char flag; +XieResource res_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns a value of True in the \fIflag\fP argument if the +specified XIE resource is a photoflo. Otherwise the returned value is False. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "res_id" 20 +The \fIres_id\fP argument specifies the identifier of +the XIE resource you want to test. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine determines whether or not the XIE resource +associated with a given identifier is a photoflo. +You can use the C Macro \fIIsPhotoflo_\fP instead of this routine. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieIsPhotoMap.3X b/xie/docs/dec/xie23/man/XieIsPhotoMap.3X new file mode 100644 index 0000000..5766435 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieIsPhotoMap.3X @@ -0,0 +1,63 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieIsPhotomap 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieIsPhotomap \- This routine determines whether or not the XIE resource +associated with a given identifier is a photomap. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIflag\fP = XieIsPhotoflo\fI(res_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned char flag; +XieResource res_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns a value of True in the \fIflag\fP argument if the +specified XIE resource is a photomap. Otherwise the returned value is False. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "res_id" 20 +The \fIres_id\fP argument specifies the identifier of +the XIE resource you want to test. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine determines whether or not the XIE resource +associated with a given identifier is a photomap. +You can use the C Macro \fIIsPhotomap_\fP instead of this routine. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieIsPhotoTap.3X b/xie/docs/dec/xie23/man/XieIsPhotoTap.3X new file mode 100644 index 0000000..87bd46e --- /dev/null +++ b/xie/docs/dec/xie23/man/XieIsPhotoTap.3X @@ -0,0 +1,63 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieIsPhototap 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieIsPhototap \- This routine determines whether or not the XIE resource +associated with a given identifier is a phototap. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIflag\fP = XieIsPhototap\fI(res_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned char flag; +XieResource res_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns a value of True in the \fIflag\fP argument if the +specified XIE resource is a phototap. Otherwise the returned value is False. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "res_id" 20 +The \fIres_id\fP argument specifies the identifier of +the XIE resource you want to test. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine determines whether or not the XIE resource +associated with a given identifier is a phototap. +You can use the C Macro \fIIsPhototap_\fP instead of this routine. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieIsRGB.3X b/xie/docs/dec/xie23/man/XieIsRGB.3X new file mode 100644 index 0000000..c4ad7a7 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieIsRGB.3X @@ -0,0 +1,67 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieIsRGB 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieIsRGB \- This routine determines whether or not the component mapping of +a photo associated with a given identifier is multispectral. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIflag\fP = XieIsRGB\fI(photo_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned char flag; +XiePhoto photo_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns a value of True in the \fIflag\fP argument if the +specified photo component mapping is multispectral. Otherwise the +returned value is False. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "photo_id" 20 +The \fIphoto_id\fP argument specifies the identifier +of the photo you want to test. You can specify an unbound +photomap, a photomap bound to a photoflo, a phototap, or a photoflo. +If you specify a photoflo, the routine tests the photomap or phototap +currently at the end of the photoflo. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine determines whether or not the component mapping of +a photo associated with a given identifier is multispectral. +You can use the C Macro \fIIsRGB_\fP instead of this routine. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieIsRoi.3X b/xie/docs/dec/xie23/man/XieIsRoi.3X new file mode 100644 index 0000000..71c0d6a --- /dev/null +++ b/xie/docs/dec/xie23/man/XieIsRoi.3X @@ -0,0 +1,63 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieIsRoi 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieIsRoi \- This routine determines whether or not the XIE resource +associated with a given identifier is an ROI. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIflag\fP = XieIsRoi\fI(res_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned char flag; +XieResource res_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns a value of True in the \fIflag\fP argument if the +specified XIE resource is an ROI. Otherwise the returned value is False. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "res_id" 20 +The \fIres_id\fP argument specifies the identifier of +the XIE resource you want to test. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine determines whether or not the XIE resource +associated with a given identifier is an ROI. +You can use the C Macro \fIIsRoi_\fP instead of this routine. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieIsTmp.3X b/xie/docs/dec/xie23/man/XieIsTmp.3X new file mode 100644 index 0000000..99365a7 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieIsTmp.3X @@ -0,0 +1,63 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieIsTmp 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieIsTmp \- This routine determines whether or not the XIE resource +associated with a given identifier is a TMP. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIflag\fP = XieIsTmp\fI(res_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned char flag; +XieResource res_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns a value of True in the \fIflag\fP argument if the +specified XIE resource is a TMP. Otherwise the returned value is False. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "res_id" 20 +The \fIres_id\fP argument specifies the identifier of +the XIE resource you want to test. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine determines whether or not the XIE resource +associated with a given identifier is a TMP. +You can use the C Macro \fIIsTmp_\fP instead of this routine. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieListFunctions.3X b/xie/docs/dec/xie23/man/XieListFunctions.3X new file mode 100644 index 0000000..01489b2 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieListFunctions.3X @@ -0,0 +1,66 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieListFunctions 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieListFunctions \- This routine obtains a list of XIE functions supported by your XIE server. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIstrings\fP = XieListFunctions\fI(dpy)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +char **strings; +Display *dpy; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns a pointer to an array of pointers +in the \fIstrings\fP argument. There are 256 pointers, 1 for each possible +minor opcode value. You should free the array using the XieFree routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "dpy" 20 +The \fIdpy\fP argument specifies the identifier of the +X11 display identifier returned by the XOpenDisplay routine. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine obtains a list of XIE operations supported by your XIE server. +The list contains the protocol name strings for all XIE protocol +function minor op-codes supported by the XIE server specified by +the \fIdpy\fP argument. The pointers are null for minor op-codes +not yet implemented or unsupported by the server. You should not free +the protocol name strings. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieLogical.3X b/xie/docs/dec/xie23/man/XieLogical.3X new file mode 100644 index 0000000..a815b51 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieLogical.3X @@ -0,0 +1,174 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieLogical 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieLogical \- This routine creates a new photomap from the bitwise logical combination +of 2 source photomaps or 1 source photomap and a constant image. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdst_photo_id\fP = XieLogical\fI(src_id1, src_id2, constant, idc_id, +operator)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto dst_photo_id; +XiePhoto src_id1; +XiePhoto src_id2; +unsigned long *constant; +XieIdc idc_id; +unsigned long operator; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +If the first source image is an unbound photomap, the routine returns +the identifier of the resulting photomap in the \fIdst_photo_id\fP +argument. Otherwise, the routine returns the identifier of the photoflo to which +the processing element is appended. You can free the photomap using the +XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id1" 20 +The \fIsrc_id1\fP argument specifies the first source +image. If this image is an unbound photomap, the operation is performed +immediately. Otherwise, a processing element is appended to the specified +photoflo with execution pending a call to the XieExecuteFlo routine. The +photoflo is specified explicitly if +the image is a photoflo, or implicitly if the image is a phototap or photomap. +.IP "src_id2" 20 +The \fIsrc_id2\fP argument specifies the second source +image. If the first source image is a photoflo, this image must be +a photomap bound to that photoflo using the XieBindMapToFlo +routine. If you specify a value of 0, the constant +image becomes the second source image. +.IP "constant" 20 +The \fIconstant\fP argument specifies the address of an array +containing 1 constant value per component. For example, +you could use array entries of constant[0]=pixel_value, +constant[1]=pixel_value, and constant[2]=pixel_value. If the value of the +\fIsrc_id2\fP argument is not 0, the routine ignores the constant image. +.IP "idc_id" 20 +The \fIidc_id\fP argument specifies the optional CPP +or ROI that defines the region of the image or images over which the +routine operates. If you specify a value of 0, the routine operates +across the entire intersection of the 2 source images. +.IP "operator" 20 +The \fIoperator\fP argument specifies the type of logical +operation the routine performs. +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lfR lw(4.0i)fR . +.sp 4p +Symbol@Operation Performed +.sp 6p +XieK_AND@T{ +Logical AND +T} +.sp +XieK_OR@T{ +Logical OR +T} +.sp +XieK_XOR@T{ +Logical XOR +T} +.sp +XieK_NOT@T{ +Logical complement of +\fIsrc_id1\fP data +T} +.sp +XieK_ShiftUp@T{ +Logical shift up with zero fill +T} +.sp +XieK_ShiftDown@T{ +Logical shift down with +zero fill +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a new photomap from the bitwise logical combination +of 2 source photomaps or 1 source photomap and a constant image. +.PP +The 2 source images can be bitonal, gray scale, or multispectral and both +must be constrained. In addition, the 2 source images must have the +same number of components and are assumed to be spatially aligned. +The 2 source images do not have to be the same size, but must be +large enough to encompass the entire region defined by the IDC, if +you specify 1. +.PP +The resulting photomap is either bitonal, gray scale, or multispectral, +(depending on the source images) and is constrained. The spacial dimensions are +those of the first source image. +.PP +If you specify a value of 0 for the second source image, the routine +performs the operation between the first source image and a constant +image. The constant array must have the same number +of components as the first source image. If you specify a value that is not +0 for the second source image, the routine ignores any specified constant image. +.PP +The area over which the routine operates is the intersection of the 2 +source images and the IDC if you specify 1. This is true even for the +XieK_NOT logical operator, which does not actually use the data in the second +source image. Any areas not affected by the operator contain the original +values in the first source image. +.PP +The routine performs the logical operation on +a bitwise basis between the 2 pixel values. If the values are of different +depths, the routine first zero extends to the left the value with fewer bits. +.PP +If the operation is performed immediately and you selected +computation events using the XieSelectEvents +routine, the routine adds an XieK_ComputationEvent +to the X11 event queue when the routine is completed. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieLogical +.PP +\fBXIE event returned:\fP XieK_ComputationEvent +if immediate execution and computation events are selected +.PP +\fBXieLib errors:\fP Returns null if the second source image +is specified to be 0 and the constant array does not exist +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.br +BadAlloc -- Insufficient server resources +.br +BadMatch -- 1 or both source images is not constrained or the 2 +source images do not have the same number of components +.br +BadAccess -- 1 source image is a photoflo and the other is not bound +to it +.br +BadValue -- IDC does not intersect the source image +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieLuminance.3X b/xie/docs/dec/xie23/man/XieLuminance.3X new file mode 100644 index 0000000..bd35d08 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieLuminance.3X @@ -0,0 +1,80 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieLuminance 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieLuminance \- This routine extracts the luminance component from a multispectral image +and creates a new image. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdst_photo_id\fP = XieLuminance\fI(src_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto dst_photo_id; +XiePhoto src_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +If the source image is an unbound photomap, the routine returns the +identifier of the new photomap in the \fIdst_photo_id\fP argument. +Otherwise, the routine returns the identifier of the photoflo to which the +processing element is appended. You can free the photomap using the +XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id" 20 +The \fIsrc_id\fP argument specifies the source image. +If the source image is an unbound photomap, the operation is performed +immediately. Otherwise, a processing element is appended to the specified +photoflo with execution pending a call to the XieExecuteFlo routine. The +photoflo is specified explicitly if +the source image is a photoflo, or implicitly if the source image +is a photomap or phototap. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine extracts the luminance component from a multispectral image +and creates a new image. +.PP +If the operation is performed immediately and you selected +computation events using the XieSelectEvents routine, the routine adds an +XieK_ComputationEvent to the X11 event queue when the routine is +completed. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieLuminance +.PP +\fBXIE event returned:\fP XieK_ComputationEvent if immediate execution and +computation events are selected +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadMatch -- The source image is not constrained or the source image is +not multispectral +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieMalloc.3X b/xie/docs/dec/xie23/man/XieMalloc.3X new file mode 100644 index 0000000..8f9f139 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieMalloc.3X @@ -0,0 +1,66 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieMalloc 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieMalloc \- This routine allocates a block of memory having undefined contents +on the client side. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIpointer\fP = XieMalloc\fI(size)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +void *pointer; +unsigned size; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns a pointer to the block of allocated memory +in the \fIpointer\fP argument. If the allocation fails, the routine +returns a null value. You should free the memory using the +XieFree +routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "size" 20 +The \fIsize\fP argument specifies the size in bytes of +the allocated block of memory. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine allocates a block of memory on the client side +having undefined contents. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Returns a null pointer if the memory +cannot be allocated +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieMallocBits.3X b/xie/docs/dec/xie23/man/XieMallocBits.3X new file mode 100644 index 0000000..610161a --- /dev/null +++ b/xie/docs/dec/xie23/man/XieMallocBits.3X @@ -0,0 +1,62 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieMallocBits 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieMallocBits \- This routine allocates a block of memory having undefined contents for +an image data array. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIpointer\fP = XieMallocBits\fI(bits)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned char *pointer; +unsigned bits; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns a pointer to the allocated block of +memory in the \fIpointer\fP argument. If the allocation fails, the routine +returns a null value. You should free the memory using the XieFreeBits routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "bits" 20 +The \fIbits\fP argument specifies the size in bits of the allocated block of +memory. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine allocates a block of memory having undefined contents for a client +image data array. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Returns a null pointer if the memory cannot be allocated +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieMatchHistogram.3X b/xie/docs/dec/xie23/man/XieMatchHistogram.3X new file mode 100644 index 0000000..9b4978b --- /dev/null +++ b/xie/docs/dec/xie23/man/XieMatchHistogram.3X @@ -0,0 +1,179 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieMatchHistogram 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieMatchHistogram \- This routine creates a photomap having a specified histogram shape from +a source image. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdst_photo_id\fP = XieMatchHistogram\fI(src_id, idc_id, h_shape, +param1, param2)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto dst_photo_id; +XiePhoto src_id; +XieIdc idc_id; +unsigned long h_shape; +double param1; +double param2; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +If the source image is an unbound photomap, the routine returns the +identifier of the new photomap in the \fIdst_photo_id\fP argument. +Otherwise, the routine returns the identifier of the processing element to +which a processing element is appended. You can free the photomap using the +XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id" 20 +The \fIsrc_id\fP argument specifies the identifier of +the source image. If the source image is an unbound photomap, the +operation is performed immediately. Otherwise, a processing element is +appended to the specified photoflo with execution pending a call to the +XieExecuteFlo routine. The photoflo is specified explicitly +if the source image is a photoflo, or implicitly if the source image +is a photomap or phototap. +.IP "idc_id" 20 +The \fIidc_id\fP argument specifies the optional CPP +or ROI that defines the region of the source image that the routine +remaps. If you specify a value of 0, the routine remaps the entire +source image. +.IP "h_shape" 20 +The \fIh_shape\fP argument specifies the histogram shape for the remapped +photomap. +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lfR lw(4.0i)fR . +.sp 4p +Symbol@Resulting Distribution +.sp 6p +XieK_Flat@T{ +Flat (uniform) distribution +T} +.sp +XieK_Gaussian@T{ +Gaussian distribution +T} +.sp +XieK_Hyperbolic@T{ +Hyperbolic distribution +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +.IP "param1" 20 +The \fIparam1\fP argument specifies a parameter for the +specified distribution. If you specify a value of 0.0, the routine +uses a default value. +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lfR lfR lfR . +.sp 4p +Distribution@Parameter@Default +.sp 6p +XieK_Flat@Ignored@T{ +Not applicable +T} +.sp +XieK_Gaussian@Mean value@T{ +Levels/2 +T} +.sp +XieK_Hyperbolic@Hyperbolic constant@T{ +Levels/4 +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +.IP "param2" 20 +The \fIparam2\fP argument specifies a parameter for the +specified histogram distribution. If you specify a value of 0.0, the +routine uses a default value. +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lfR lfR lfR . +...\" MANDOC->FOOTNOTE tag not supported, FOOTNOTE ignored +.sp 4p +Distribution@Parameter@Default +.sp 6p +XieK_Flat@Ignored@T{ +NA +T} +.sp +XieK_Gaussian@Variance@T{ +Levels/4 +T} +.sp +XieK_Hyperbolic@Shape Factor@T{ +0.0 +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a photomap having a specified +histogram shape. The source image must be gray scale and be constrained. The +resulting image is always gray scale and constrained. +.PP +The resulting photomap has the same spatial dimensions as +the source image. The routine operates over that area of the source +image defined by an IDC, if you specify 1. Otherwise, the routine +operates over the entire source image area. +.PP +If the routine executes immediately and you selected computation +events using the XieSelectEvents routine, the routine adds an +XieK_ComputationEvent to the X11 event queue when the routine is completed. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieMatchHistogram +.PP +\fBXIE event returned:\fP XieK_ComputationEvent if immediate execution +and computation events are selected +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadMatch -- The source image is not constrained or the source image is +multispectral +.PP +BadValue -- Invalid histogram shape or the IDC does not intersect the +source image +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieMath.3X b/xie/docs/dec/xie23/man/XieMath.3X new file mode 100644 index 0000000..6e7557a --- /dev/null +++ b/xie/docs/dec/xie23/man/XieMath.3X @@ -0,0 +1,141 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieMath 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieMath \- This routine creates a copy of an image by applying a specified +mathematical function to each pixel of an existing source image. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdst_photo_id\fP = XieMath\fI(src_id, idc_id, operator, constrain)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto dst_photo_id; +XiePhoto src_id; +XieIdc idc_id; +unsigned long operator; +unsigned long constrain; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +If the source image is an unbound photomap, the routine returns the +identifier of the new photomap in the \fIdst_photo_id\fP argument. +Otherwise, the routine returns the identifier of the photoflo to which +the processing element is appended. You can free the photomap using the +XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id" 20 +The \fIsrc_id\fP argument specifies the identifier +of the source image. If the source image is an unbound photomap, +the operation is performed immediately. Otherwise, a processing element is +appended to the specified photoflo with execution pending a call to the +XieExecuteFlo routine. The photoflo is specified explicitly +if the source image is a photoflo, or implicitly if the source image is +a photomap or phototap. +.IP "idc_id" 20 +The \fIidc_id\fP argument specifies the optional CPP +or ROI that defines the region of the source image over which the routine +operates. If you specify a value of 0, the routine operates over the +the entire source image. +.IP "operator" 20 +The \fIoperator\fP argument specifies the +mathematical function the routine applies to each pixel in the source image. +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lfR lw(4.0i)fR . +.sp 4p +Symbol@Function +.sp 6p +XieK_Exp@T{ +Exponential +T} +.sp +XieK_Ln@T{ +Natural logarithm +T} +.sp +XieK_Log2@T{ +Logarithm base 2 +T} +.sp +XieK_Log10@T{ +Logarithm base 10 +T} +.sp +XieK_Square@T{ +Square +T} +.sp +XieK_Sqrt@T{ +Square Root +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +.IP "constrain" 20 +The \fIconstrain\fP argument is a Boolean flag that +specifies whether or not the routine constrains the output data +before writing it to the output photomap. +If you specify a value of True, the routine constrains the output +data using the current constraint model. Otherwise if you specify +a value of False, the data remains unconstrained. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a copy of an image by applying a specified +mathematical function to each pixel of an existing source image. +.PP +The source image can be either bitonal, gray scale, or multispectral and can +be either constrained or unconstrained. The resulting photomap data +is unconstrained unless you specify a value of True for the +\fIconstrain\fP argument. +The output photomap has the same spatial dimensions as the source image. +The area over which the routine operates is defined by an IDC, if you +specify 1. Otherwise, the routine operates over the entire area of the source +image. +.PP +If the operation is performed immediately and you selected +computation events using the XieSelectEvents routine, the routine adds an +XieK_ComputationEvent to the X11 event queue when the routine is completed. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieMath +.PP +\fBXIE event returned:\fP XieK_ComputationEvent +if immediate execution and computation events are selected +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadValue -- The generated result for a pixel value is undefined or +out of range or the IDC does not intersect the source image +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieMirror.3X b/xie/docs/dec/xie23/man/XieMirror.3X new file mode 100644 index 0000000..f2dd108 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieMirror.3X @@ -0,0 +1,80 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieMirror 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieMirror \- This routine creates a flipped copy of an existing image. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdst_photo_id\fP = XieMirror\fI(src_id, x_mirror, y_mirror)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto dst_photo_id; +XiePhoto src_id; +unsigned long x_mirror; +unsigned long y_mirror; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +If the source image is an unbound photomap, the routine returns the +identifier of the new photomap in the \fIdst_photo_id\fP argument. +Otherwise, the routine returns the identifier of the photoflo to +which the processing element appended. You can free the photomap using the +XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id" 20 +The \fIsrc_id\fP argument specifies the source image. +If the source image is an unbound photomap, the operation is performed +immediately. Otherwise, a processing element is appended to the specified +photoflo with execution pending a call to the XieExecuteFlo routine. The +photoflo is specified explicitly if the source +image is a photoflo, or implicitly if the source images is a photomap or +phototap. +.IP "x_mirror" 20 +The \fIx_mirror\fP argument specifies whether or not +the source image is flipped about the x-axis. To flip about the +x-axis, set the argument to True. +.IP "y_mirror" 20 +The \fIy_mirror\fP argument specifies whether or not +the source image is flipped about the y-axis. To flip about the +y-axis, set the argument to True. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a flipped copy of an existing image. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieMirror +.PP +\fBXIE event returned:\fP XieK_ComputationEvent +if immediate execution and computation events selected +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XiePhotoCount.3X b/xie/docs/dec/xie23/man/XiePhotoCount.3X new file mode 100644 index 0000000..fa2f7c2 --- /dev/null +++ b/xie/docs/dec/xie23/man/XiePhotoCount.3X @@ -0,0 +1,66 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XiePhotoCount 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XiePhotoCount \- This routine returns a count of the number of components in an image. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIcount\fP = XiePhotoCount\fI(photo_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned long count; +XiePhoto photo_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the count of the number of components in +the \fIcount\fP argument. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "photo_id" 20 +The \fIphoto_id\fP argument specifies the identifier +of the source image. The source image can be either an unbound photomap, +a photoflo, a phototap, or a photomap bound to a photoflo. +If the source image is a photoflo, the +routine operates on the photomap or phototap currently at the end of +the photoflo. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine returns a count of the number of components in an image. +Multispectral images contain 3 components and all others contain 1. +You can use the C Macro \fIPhotoCount_\fP instead of this routine. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XiePlaneCount.3X b/xie/docs/dec/xie23/man/XiePlaneCount.3X new file mode 100644 index 0000000..5d17fe1 --- /dev/null +++ b/xie/docs/dec/xie23/man/XiePlaneCount.3X @@ -0,0 +1,99 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XiePlaneCount 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XiePlaneCount \- This routine returns the number of planes a client XieImage should contain +based on its component mapping and component organization. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIcount\fP = XiePlaneCount\fI(img)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned long count; +XieImage img; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the number of planes the specified XieImage +should contain in the \fIcount\fP argument. +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lw(1.5i)fR lw(1.5i)fR lw(3.0i)fR . +.sp 4p +Component@Component@Number of +Mapping@Organization@Planes +.sp 6p +Bitonal@N/A@T{ +1 +T} +.sp +Gray scale@BandByPixel@T{ +1 +T} +@BandByPlane@T{ +1 +T} +@BitByPlane@T{ +bits per pixel +T} +.sp +Multispectral@BandByPixel@T{ +1 +T} +@BandByPlane@T{ +3 +T} +@BitByPlane@T{ +sum of bits of the 3 components +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "img" 20 +The \fIimg\fP argument specifies the identifier of the +XieImage the routine tests. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine returns the number of planes a client XieImage should contain +based on its component mapping and component organization. +You can use the C Macro \fIPlaneCount_\fP instead of this routine. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XiePoint.3X b/xie/docs/dec/xie23/man/XiePoint.3X new file mode 100644 index 0000000..3e572a3 --- /dev/null +++ b/xie/docs/dec/xie23/man/XiePoint.3X @@ -0,0 +1,121 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XiePoint 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XiePoint \- This routine creates a new photomap by remapping each pixel value to +a new value that is independent of neighboring pixel values. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdst_photo_id\fP = XiePoint\fI(src_id, idc_id, tbl_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto dst_photo_id; +XiePhoto src_id; +XieIdc idc_id; +XiePhoto tbl_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +If the source image is an unbound photomap, the routine returns the +identifier of the remapped photomap in the \fIdst_photo_id\fP +argument. Otherwise, the routine returns the identifier of the photoflo to which +the processing element is appended. You can free the photomap using the +XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id" 20 +The \fIsrc_id\fP argument specifies the identifier +of the source image. If the source image is an unbound photomap, +the operation is performed immediately. Otherwise a processing element is +appended to the specified photoflo with execution pending a call to the +XieExecuteFlo routine. The photoflo is specified explicitly if the source +image is a photoflo, or implicitly if the source image is a photomap or +phototap. The source image can be either bitonal, gray scale, or multispectral +and must be constrained. +.IP "idc_id" 20 +The \fIidc_id\fP argument specifies the optional CPP +or ROI that defines the region of the source image over which the +routine operates. If you specify a value of 0, the routine operates +over the entire image. +.IP "tbl_id" 20 +The \fItbl_id\fP argument specifies the identifier of +the photomap the routine uses as a LUT to remap the source image +pixels. If the source image identifier is a photoflo, the LUT must +be bound to the photoflo using the XieBindMapToFlo routine. +.IP +You must structure the LUT to have the same number of components +that you want in the remapped image. Each component must contain a +single scanline, which must contain as many unique pixel values as there +are different levels in the corresponding component of the source image. +If the source photomap is multispectral, +the LUT must contain 3 components. If the source photomap is bitonal or +gray scale, the LUT can contain either 1 or 3 components, depending on +the type of remapping you want to perform. If the source photomap is +bitonal or gray scale, the same source pixels are remapped into as many +spectral components as there are components in the LUT. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a new photomap by remapping each pixel value to +a new value that is independent of neighboring pixel values. +.PP +On a per-component basis, the routine uses each pixel value in the source +image as an index into the LUT to obtain a new value for +that pixel. If the number of components in the LUT is greater +than the number of components in the source image, the routine reuses +the last component in the source image to remap into the last component +in the output image. This allows you to convert gray scale images +to pseudocolor images using the appropriate choice of LUTs. +.PP +The output photomap has the same spatial dimensions as +the source image. The routine operates over the area defined by the +IDC, if you specify 1. Otherwise, the routine operates over the +entire source image. Pixel values outside the area of the IDC retain +their original values. +.PP +If the operation is performed immediately and you selected +computation events using the XieSelectEvents routine, the routine adds an +XieK_ComputationEvent to the X11 event queue when the routine is completed. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_iePoint +.PP +\fBXIE event returned:\fP XieK_ComputationEvent +if immediate execution and computation events are selected +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadMatch -- The source image and the LUT photomap are not constrained +.PP +BadAccess -- The source image is a photoflo and the LUT photomap is not +bound to it +.PP +BadValue -- IDC does not intersect the source image +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XiePointStats.3X b/xie/docs/dec/xie23/man/XiePointStats.3X new file mode 100644 index 0000000..4962cf7 --- /dev/null +++ b/xie/docs/dec/xie23/man/XiePointStats.3X @@ -0,0 +1,139 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XiePointStats 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XiePointStats \- This routine returns statistical information about a particular pixel +value and the surrounding values. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fI\fPXiePointStats\fI(src_id, x, y, height, width, cmpmsk, stats)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto src_id; +unsigned long x; +unsigned long y; +unsigned long height; +unsigned long width; +unsigned long cmpmsk; +XieStatsRec stats[]; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +None. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id" 20 +The \fIsrc_id\fP argument specifies the identifier of the source image. The +source image can be either constrained or unconstrained. +.IP "x" 20 +The \fIx\fP argument specifies the x-coordinate of +the pixel around which the routine calculates statistics. +.IP "y" 20 +The \fIy\fP argument specifies the y-coordinate of +the pixel around which the routine calculates statistics. +.IP "height" 20 +The \fIheight\fP argument specifies the height in pixels +of the region around the target pixel over which the routine calculates +statistics. +.IP "width" 20 +The \fIwidth\fP argument specifies the width in pixels +of the region around the target pixel over which the routine calculates +statistics. +.IP "cmpmsk" 20 +The \fIcmpmsk\fP argument specifies a bit mask that specifies which +components of the source image the routine uses. +.IP "stats" 20 +The \fIstats\fP argument specifies a pointer to +an array of XieStats structures that receive the statistical information. +The array must contain 1 structure for each bit you set in the +\fIcmpmsk\fP argument. The format of the XieStats record is: +...\" MANDOC->Begin CODE_EXAMPLE +.oS +typedef struct { + double value; + double minimum; + double maximum; + double mean; + double stddev; + double variance; +} XieStatsRec, *XieStats; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lfR lw(4.0i)fR . +.sp 4p +Symbol@Operation Performed +.sp 6p +value@T{ +The value of the pixel at the specified location +T} +.sp +minimum@T{ +The minimum pixel value in this area +T} +.sp +maximum@T{ +The maximum pixel value in this area +T} +.sp +mean@T{ +The mean pixel value for this area +T} +.sp +stddev@T{ +The standard deviation of the pixel distribution for this +area +T} +.sp +variance@T{ +The variance of the pixel distribution for this area +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine returns statistical information about a particular pixel +value and the surrounding values. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_iePointStats +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Reply error, BadLength +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadValue -- The x- and y-coordinates are not within the source image +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XiePutImage.3X b/xie/docs/dec/xie23/man/XiePutImage.3X new file mode 100644 index 0000000..5e74743 --- /dev/null +++ b/xie/docs/dec/xie23/man/XiePutImage.3X @@ -0,0 +1,114 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XiePutImage 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XiePutImage \- This routine creates a photoflo or photomap, and optionally transports +XieImage data to the photoflo or photomap. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIphoto_id\fP = XiePutImage\fI(dpy, img, mode)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto photo_id; +Display *dpy; +XieImage img; +unsigned char mode; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +If you specify the symbol +XieK_DataFlo for the \fImode\fP argument, +the routine returns the photoflo identifier in the \fIphoto_id\fP +argument. Otherwise, the routine returns the new photomap identifier. +You can free the photomap using the XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "dpy" 20 +The \fIdpy\fP argument specifies the X11 display +identifier returned by the +XOpenDisplay routine. +.IP "img" 20 +The \fIimg\fP argument specifies the address of an +existing client XieImage structure. +.IP "mode" 20 +The \fImode\fP argument specifies an image data +transport option. +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lfR lw(4.0i)fR . +.sp 4p +Symbol@Status of Image Data in the New Photomap +.sp 6p +XieK_DataFlo@T{ +Create photoflo and SetStream +for put data +T} +.sp +XieK_DataMap@T{ +Create photomap and SetStream +for put data +T} +.sp +XieK_DataNone@T{ +Create photomap without +transporting image data +T} +.sp +XieK_DataCopy@T{ +Create photomap and +transport all planes of image data +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a photoflo or photomap, and optionally transports +all XieImage data planes to the photoflo or photomap. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieCreateResource +.PP +X_ieSetTransport for the \fImode\fP symbols +XieK_DataFlo, XieK_DataMap, and XieK_DataCopy +.PP +1 or more calls per data plane to X_iePutStream for the mode +symbol +XieK_DataCopy +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Fatal, invalid mode argument +.PP +\fBXieServer errors:\fP BadAlloc -- Insufficient server +resources +.br +BadIDChoice -- Invalid identifier +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XiePutImageData.3X b/xie/docs/dec/xie23/man/XiePutImageData.3X new file mode 100644 index 0000000..a68617b --- /dev/null +++ b/xie/docs/dec/xie23/man/XiePutImageData.3X @@ -0,0 +1,67 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XiePutImageData 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XiePutImageData \- This routine transports all image data planes from a client XieImage to +a photomap. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIstatus\fP = XiePutImageData\fI(img)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned char status; +XieImage img; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the status of the image data transport in +the \fIstatus\fP argument. If there is more data to be transported, +the return is XieK_StreamMore. If all image data has +been transported, the return is XieK_StreamFinal. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "img" 20 +The \fIimg\fP argument specifies the address of the client source XieImage. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine transports all image data planes from a client XieImage to +a photomap. You can use this routine only if you created the destination +photomap, photoflo, phototap using the XiePutImage routine. +Depending on the quantity of image data to be transported, you may have +to issue more than 1 call to this routine until the \fIstatus\fP return is +XieK_StreamFinal. This operation always executes immediately, even when the +destination image is a photoflo. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP 1 or more calls to X_iePutStream +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP XieStreamError for invalid destination image +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XiePutStream.3X b/xie/docs/dec/xie23/man/XiePutStream.3X new file mode 100644 index 0000000..1628a99 --- /dev/null +++ b/xie/docs/dec/xie23/man/XiePutStream.3X @@ -0,0 +1,108 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XiePutStream 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XiePutStream \- This routine transports a plane of image data, as a byte stream, from +a client XieImage to a server image. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fI\fPXiePutStream\fI(pho_id, plane, buffer, bytes, final)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto pho_id; +unsigned long plane; +unsigned char *buffer; +unsigned long bytes; +unsigned char final; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +None. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "pho_id" 20 +The \fIpho_id\fP argument specifies the identifier of +the destination image. The destination image can be either an +unbound photomap, a photoflo, or a phototap. The photoflo is specified +explicitly if the destination is specified as a photoflo, or implicitly +if the destination image is specified as a photomap or phototap. +.IP "plane" 20 +The \fIplane\fP argument specifies the source image data plane you want to +transport. +.IP "buffer" 20 +The \fIbuffer\fP argument specifies the pointer to the source image data plane. +.IP "bytes" 20 +The \fIbytes\fP argument specifies the length of the transported data stream +in bytes. +.IP "final" 20 +The \fIfinal\fP argument is a Boolean flag that +specifies whether or not the upcoming transport is the final one for +the current data plane. If this is the only transport +or the last transport for the plane, set the argument to True. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine transports a plane of image data, as a byte stream, from +a client XieImage to a server image. You can use this routine only if +you created the destination image using the XieClonePhoto or XieCreatePhoto +routine. +.PP +Prior to calling this routine, you must set up the transport parameters using +the XieSetStream routine specifying the XieK_PutStream +symbol for the \fImode\fP argument. If you want to transport multiple data +planes, call the XieSetStream and XiePutStream +routines in combination for each plane. +.PP +This routine always sends full bytes of image data. However, +if you set the \fIfinal\fP argument True when sending the last +of the image data, you can pad the last byte of the source image with +nonimage data. +.PP +This routine always executes immediately, even if the destination +image is a photoflo. You can abort the data transport before +completion using the XieAbortStream routine. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP 1 or more calls to X_iePutStream +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadAccess -- Stream transport not set or the specified photoflo +has been aborted +.PP +BadMatch -- The plane was not specified during set transport or the +attempted transport direction is not the same as specified during set +transport +.PP +Any error from a processing element within the photoflo while it is +running +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XiePutTile.3X b/xie/docs/dec/xie23/man/XiePutTile.3X new file mode 100644 index 0000000..102097e --- /dev/null +++ b/xie/docs/dec/xie23/man/XiePutTile.3X @@ -0,0 +1,103 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XiePutTile 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XiePutTile \- This routine transports a tile of uncompressed image data from a client +XieImage to a server image. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fI\fPXiePutTile\fI(phm_id, img, p_mask, src_x, src_y, dst_x, dst_y, width, +height)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhotomap phm_id; +XieImage img; +unsigned long p_mask; +long src_x; +long src_y; +long dst_x; +long dst_y; +unsigned long width; +unsigned long height; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +None. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "phm_id" 20 +The \fIphm_id\fP argument specifies the identifier of an unbound photomap. +.IP "img" 20 +The \fIimg\fP argument specifies the address of the source client XieImage. +.IP "p_mask" 20 +The \fIp_mask\fP argument specifies a mask that defines +which planes of the source image you want to transport. The least +significant bit indicates plane 0. You can specify the symbol +XieK_AllPlanes to transport all of the source image data planes. +.IP "src_x" 20 +The \fIsrc_x\fP argument specifies the x-coordinate +of the upper left hand corner of the tile you want to transport. +.IP "src_y" 20 +The \fIsrc_y\fP argument specifies the y-coordinate +of the upper left hand corner of the tile you want to transport. +.IP "dst_x" 20 +The \fIdst_x\fP argument specifies the x-coordinate +of the upper left hand corner of the tile in the destination photomap. +.IP "dst_y" 20 +The \fIdst_y\fP argument specifies the y-coordinate +of the upper left hand corner of the tile in the destination photomap. +.IP "width" 20 +The \fIwidth\fP argument specifies the width of the tile you want to transport. +.IP "height" 20 +The \fIheight\fP argument specifies the height of the tile you want to +transport. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine transports a tile of uncompressed image data from a client +XieImage to a server image. You cannot use this routine to transport +image data to a photoflo or to any photomap bound to a photoflo. +.PP +If you use this routine to modify the image data of a photomap that you +previously exported to a dynamic visual class X11 drawable, the +ExportContext can be incompatible with the photomap image data. Use the +XieQueryExport and the XieFreeExport routines to resolve such conflicts. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieSetTransport +.PP +1 or more calls to X_iePutTile +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadValue -- Height or width is less than or equal to 0 +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieQueryCpp.3X b/xie/docs/dec/xie23/man/XieQueryCpp.3X new file mode 100644 index 0000000..ad6b1c2 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieQueryCpp.3X @@ -0,0 +1,76 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieQueryCpp 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieQueryCpp \- This routine returns the context of a specified CPP. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fI\fPXieQueryCpp\fI(cpp_id, x_ret, y_ret, phm_ret)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XieCpp cpp_id; +long *x_ret; +long *y_ret; +XiePhotomap *phm_ret; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +None. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "cpp_id" 20 +The \fIcpp_id\fP argument specifies the identifier +of an existing CPP. +.IP "x_ret" 20 +The \fIx_ret\fP argument specifies the pointer to +the location to which the routine returns the +x-coordinate from the CPP. If you do not want this information, set +the argument to null. +.IP "y_ret" 20 +The \fIy_ret\fP argument specifies the pointer to +the location to which the routine returns the +y-coordinate from the CPP. If you do not want this information, set +the argument to null. +.IP "phm_ret" 20 +The \fIphm_ret\fP argument specifies the pointer to +the location to which the routine returns the identifier +of the bitonal photomap used as the CPP. If you do not want this +information, set the argument to null. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine returns the context of a specified CPP. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieQueryResource +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Reply error, BadLength +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieQueryEvents.3X b/xie/docs/dec/xie23/man/XieQueryEvents.3X new file mode 100644 index 0000000..ce48f4e --- /dev/null +++ b/xie/docs/dec/xie23/man/XieQueryEvents.3X @@ -0,0 +1,62 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieQueryEvents 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieQueryEvents \- This routine returns the XIE event mask so you can determine +which XIE events are currently enabled. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIevent_mask = \fPXieQueryEvents\fI(dpy)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned long event_mask; +Display *dpy; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the XIE event mask in the \fIevent_mask\fP argument. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "dpy" 20 +The \fIdpy\fP argument specified the X11 display +identifier returned by the +XOpenDisplay routine. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine returns the XIE event mask so you can determine +which XIE events are currently enabled. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieQueryEvents +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Reply error, BadAccess +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieQueryExport.3X b/xie/docs/dec/xie23/man/XieQueryExport.3X new file mode 100644 index 0000000..a1844ff --- /dev/null +++ b/xie/docs/dec/xie23/man/XieQueryExport.3X @@ -0,0 +1,109 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieQueryExport 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieQueryExport \- This routine returns the LUT and a list of allocated color cells, +if any, that were used during the export of an image. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fI\fPXieQueryExport\fI(pho_id, lut_id_ret, pxl_lst_ret, pxl_cnt_ret)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto pho_id; +XiePhotomap *lut_id_ret; +unsigned long **pxl_lst_ret; +unsigned long *pxl_cnt_ret; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +None. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "pho_id" 20 +The \fIpho_id\fP argument specifies the identifier of +the server image from which you want to obtain the ExportContext. +The image can be an unbound photomap, a photoflo, a bound photomap, +or a phototap. The photoflo is specified explicitly if the image is +a photoflo, or implicitly if the image is a bound photomap or phototap. +If the image is bound to a photoflo, the photoflo execution +must be complete or the routine returns a BadAccess error. +.IP "lut_id_ret" 20 +The \fIlut_id_ret\fP argument specifies the address of +the location to which the routine returns the export LUT photomap identifier. +If the ExportContext is not using a LUT, the routine returns +a null. You can free the LUT photomap using the XieFreeResource routine. +.IP "pxl_lst_ret" 20 +The \fIpxl_lst_ret\fP argument specifies the address of +the location to which the routine returns the pointer to the list of +allocated pixels. If you specify a null for either the +\fIpxl_lst_ret\fP or the \fIpxl_cnt_ret\fP argument, the +routine does not return a pixel list +and all allocated pixels remain the property of the +ExportContext. If the routine returns a pixel list, the list is removed +from the ExportContext and the application is responsible for +freeing the list using the XieFree routine. +.IP "pxl_cnt_ret" 20 +The \fIpxl_cnt_ret\fP argument specifies the address of the +location to which the routine returns the count of the allocated pixels. +If you do not want a pixel list and a count of the allocated pixels, +set this argument to null. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine returns the LUT identifier and a list of allocated color cells, +if any, that were used during the export of an image. The LUT could have +been supplied by the application or generated by an XIE routine. +The application is responsible for freeing the allocated pixels using +the XFreeColors routine. For example: +...\" MANDOC->Begin CODE_EXAMPLE +.oS + XieExport( photo_id, window, gc, 0,0, 0,0, 100, 100, 0, + colormap, 0.0,0.0); + . + XieQueryExport( photo_id, &lut_id, &pixel_list, &pixel_count ); + . + XieExport( photo_id, window, gc, 0,0, 0,0, 100, 100, lut_id, + colormap, 0.0,0.0); + . + XFreeColors( display, colormap, pixel_list, pixel_count, 0 ); + pixel_list = XieFree( pixel_list ); + lut_id = XieFreeResource( lut_id ); +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieQueryExport +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Reply error, BadLength +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadAccess -- The photoflo is running +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieQueryFlo.3X b/xie/docs/dec/xie23/man/XieQueryFlo.3X new file mode 100644 index 0000000..9764a7d --- /dev/null +++ b/xie/docs/dec/xie23/man/XieQueryFlo.3X @@ -0,0 +1,93 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieQueryFlo 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieQueryFlo \- This routine returns information about the execution state of a +photoflo. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIstatus = \fPXieQueryFlo\fI(phf_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned long status; +XiePhoto phf_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the current execution state of the photoflo in +the \fIstatus\fP argument. +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lfR lw(4.0i)fR . +.sp 4p +Status Returned@Description +.sp 6p +XieK_PhotofloFormation +@T{ +Photoflo is under construction +T} +.sp +XieK_PhotofloRunning@T{ +Photoflo +is currently running +T} +.sp +XieK_PhotofloComplete@T{ +Photoflo +has run to completion +T} +.sp +XieK_PhotofloAborted@T{ +Photoflo +formation or running was aborted +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "phf_id" 20 +The \fIphf_id\fP argument specifies the identifier of +the photoflo, phototap, or any photomap bound to the photoflo. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine returns information about the execution state of a +photoflo. This routine always executes immediately. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieQueryResource +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Reply error, BadLength +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieQueryMap.3X b/xie/docs/dec/xie23/man/XieQueryMap.3X new file mode 100644 index 0000000..6ff369a --- /dev/null +++ b/xie/docs/dec/xie23/man/XieQueryMap.3X @@ -0,0 +1,109 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieQueryMap 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieQueryMap \- This routine returns the attributes of a server image. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fBXieQueryMap\fP\fI (pho_id, width_ret, height_ret, cmp_map_ret, cmp_cnt_ret, +cmp_lvl_ret, pxl_pol_ret, pxl_ratio_ret, pxl_prog_ret, scn_prog_ret, +constrained_ret)\fB +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto pho_id; +unsigned long *width_ret; +unsigned long *height_ret; +unsigned char *cmp_map_ret; +unsigned char *cmp_cnt_ret; +unsigned char *cmp_lvl_ret; +unsigned char *pxl_pol_ret; +double *pxl_ratio_ret; +unsigned char *pxl_prog_ret; +unsigned char *scn_prog_ret; +unsigned char *constrained_ret; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +None. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "pho_id" 20 +The \fIpho_id\fP argument specifies the identifier of the image you want to +query. The image can be an unbound photomap, a photomap bound to a photoflo, +a phototap, or a photoflo. The photoflo is specified explicitly if +the image is a photoflo, or implicitly if the image is a photomap bound +to the photoflo or a phototap. If the image is a photoflo, the routine +queries the photomap or phototap currently at the end of the photoflo. +.IP "width_ret" 20 +The \fIwidth_ret\fP argument specifies the pointer to +the location to which the routine returns the width attribute. +.IP "height_ret" 20 +The \fIheight_ret\fP argument specifies the pointer to +the location to which the routine returns the height attribute. +.IP "cmp_map_ret" 20 +The \fIcmp_map_ret\fP argument specifies the pointer to +the location to which the routine returns the component mapping attribute. +.IP "cmp_cnt_ret" 20 +The \fIcmp_cnt_ret\fP argument specifies the pointer to +the location to which the routine returns the component count attribute. +.IP "cmp_lvl_ret" 20 +The \fIcmp_lvl_ret\fP argument specifies the pointer to +the array to which the routine returns the bits per +component attribute. The array length must be at least equal to +XieK_MaxComponents. +.IP "pxl_pol_ret" 20 +The \fIpxl_pol_ret\fP argument specifies the pointer to +the location to which the routine returns the pixel polarity attribute. +.IP "pxl_ratio_ret" 20 +The \fIpxl_ratio_ret\fP argument specifies the pointer to +the location to which the routine returns the pixel aspect ratio attribute. +.IP "pxl_prog_ret" 20 +The \fIpxl_prog_ret\fP argument specifies the pointer to +the location to which the routine returns the pixel progression attribute. +.IP "scn_prog_ret" 20 +The \fIscn_prog_ret\fP argument specifies the pointer to +the location to which the routine returns the scanline progression attribute. +.IP "constrained_ret" 20 +The \fIconstrained_ret\fP argument specifies the pointer +to the location where the routine returns the Boolean flag indicating +whether or not the image data is constrained. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine returns the attributes of a server image. If you do not +want to retrieve a particular attribute, set the associated pointer to null. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieQueryResource +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Reply error, BadLength +.PP +Returns null if invalid photomap +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieQueryOpDefaults.3X b/xie/docs/dec/xie23/man/XieQueryOpDefaults.3X new file mode 100644 index 0000000..bf8eef3 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieQueryOpDefaults.3X @@ -0,0 +1,96 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieQueryOpDefaults 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieQueryOpDefaults \- This routine obtains the current operational default constraint +model from the server. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fI\fPXieQueryOpDefaults\fI(dpy, model_ret, levels_ret)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +Display *dpy; +int *model_ret; +unsigned long levels_ret[]; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +None. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "dpy" 20 +The \fIdpy\fP argument specifies the X11 display +identifier returned by the +XOpenDisplay routine. +.IP "model_ret" 20 +The \fImodel_ret\fP argument specifies the pointer to +the location to which the routine returns the current constraint model +information. +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lfR lw(4.0i)fR . +.sp 4p +Symbol@Operation Performed +.sp 6p +XieK_HardClip@T{ +Apply hard clip model +T} +.sp +XieK_ClipScale@T{ +Apply clip scale model +T} +.sp +XieK_HardScale@T{ +Apply hard scale model +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +.IP "levels_ret" 20 +The \fIlevels_ret\fP argument specifies the +address of the array to which the routine returns the number of levels +to which each component is constrained. The length must be at least +equal to +XieK_MaxComponents. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine obtains the current operational default constraint +model from the server. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieQueryOpDefaults +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Reply error, BadLength +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieQueryRoi.3X b/xie/docs/dec/xie23/man/XieQueryRoi.3X new file mode 100644 index 0000000..1b42675 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieQueryRoi.3X @@ -0,0 +1,74 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieQueryRoi 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieQueryRoi \- This routine obtains an ROI context from the server. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fI\fPXieQueryRoi\fI(roi_id, x_ret, y_ret, width_ret, height_ret)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XieRoi roi_id; +long *x_ret; +long *y_ret; +unsigned long *width_ret; +unsigned long *height_ret; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +None. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "roi_id" 20 +The \fIroi_id\fP argument specifies the identifier of the ROI you want to query. +.IP "x_ret" 20 +The \fIx_ret\fP argument specifies the pointer to the +location to which the routine returns the ROI x-coordinate information. +.IP "y_ret" 20 +The \fIy_ret\fP argument specifies the pointer to the +location to which the routine returns the ROI y-coordinate information. +.IP "width_ret" 20 +The \fIwidth_ret\fP argument specifies the pointer to the +location to which the routine returns the ROI width information. +.IP "height_ret" 20 +The \fIheight_ret\fP argument specifies the pointer to the +location to which the routine returns the ROI height information. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine obtains an ROI context from the server. +If you do not want to retrieve the information for a particular +argument, set the pointer to null. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieQueryResource +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Reply error, BadLength +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieQueryTmp.3X b/xie/docs/dec/xie23/man/XieQueryTmp.3X new file mode 100644 index 0000000..40ca751 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieQueryTmp.3X @@ -0,0 +1,82 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieQueryTmp 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieQueryTmp \- This routine obtains information about a TMP from the server. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdata_list\fP = XieQueryTmp\fI(tmp_id, x_ret, y_ret, count_ret)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XieTemplate data_list; +XieTmp tmp_id; +long *x_ret; +long *y_ret; +unsigned long *count_ret; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the address of an array of template records +of type XieTemplateRec in the \fIdata_list\fP argument. You can free the +array using the +XieFree routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "tmp_id" 20 +The \fItmp_id\fP argument specifies the identifier of +the TMP you want to query. +.IP "x_ret" 20 +The \fIx_ret\fP argument specifies the pointer to the +location to which the routine returns the x-coordinate of the template +center. +.IP "y_ret" 20 +The \fIy_ret\fP argument specifies the pointer to the +location to which the routine returns the y-coordinate of the template +center. +.IP "count_ret" 20 +The \fIcount_ret\fP argument specifies the pointer to the +location to which the routine returns the count of the number of entries +in \fIdata_list\fP. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine obtains information about a TMP from the server. +If you do not want to retrieve information about a particular argument, +set the associated pointer to null. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieQueryResource +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP Reply error, BadLength +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.br +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieRealloc.3X b/xie/docs/dec/xie23/man/XieRealloc.3X new file mode 100644 index 0000000..153b50e --- /dev/null +++ b/xie/docs/dec/xie23/man/XieRealloc.3X @@ -0,0 +1,74 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieRealloc 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieRealloc \- This routine reallocates (changes the size of) a block of memory. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fInew_pointer\fP = XieRealloc\fI(ptr, size)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +void *new_pointer; +char *ptr; +unsigned size; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the address of the reallocated block of memory in the +\fInew_pointer\fP argument. If the routine fails, the routine returns +a null. If you increase the size of the reallocated +block of memory, the routine zeros the contents of the additional memory. +.PP +If the address returned in the \fInew_pointer\fP argument is different +than the address you specified for the \fIptr\fP argument, the routine +moved the original contents of the memory to the new address +and deallocated the original block of memory. +.PP +You should free the memory using either the +XieCfree or the XieFree routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "ptr" 20 +The \fIptr\fP argument specifies the address of the block +of memory you want to reallocate. +.IP "size" 20 +The \fIsize\fP argument specifies the size in bytes +to which you want to change the reallocated memory. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine reallocates (changes the size of) a block of memory. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieReallocBits.3X b/xie/docs/dec/xie23/man/XieReallocBits.3X new file mode 100644 index 0000000..71cfb58 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieReallocBits.3X @@ -0,0 +1,73 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieReallocBits 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieReallocBits \- This routine reallocates (changes the size of) a client XieImage data array. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fInew_pointer\fP = XieReallocBits\fI(ptr, bits)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +unsigned char *new_pointer; +unsigned char *ptr; +unsigned bits; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the address of the reallocated +image data array in the \fInew_pointer\fP argument. +If the routine fails, the routine returns a null. +If you increase the size of the reallocated data array, +the routine zeros the contents of the additional memory. +.PP +If the address returned in the \fInew_pointer\fP argument is different +than the address you specified for the \fIptr\fP argument, the routine +moved the original contents of the memory to the new address +and deallocated the original data array memory. +.PP +You should free the image array using the XieFreeBits routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "ptr" 20 +The \fIptr\fP argument specifies the address +of the image data array you want to reallocate. +.IP "bits" 20 +The \fIbits\fP argument specifies the +size in bits to which you want to change the reallocated memory. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine changes the size (reallocates) of a client XieImage data array. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieRotate.3X b/xie/docs/dec/xie23/man/XieRotate.3X new file mode 100644 index 0000000..36436ad --- /dev/null +++ b/xie/docs/dec/xie23/man/XieRotate.3X @@ -0,0 +1,108 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieRotate 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieRotate \- This routine creates a rotated copy of a source image. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdst_photo_id\fP = XieRotate\fI(src_id, angle, width, height, fill)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto dst_photo_id; +XiePhoto src_id; +double angle; +unsigned long width; +unsigned long height; +unsigned long *fill; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +If the source image is an unbound photomap, the routine returns the +identifier of the destination image in the \fIdst_photo_id\fP +argument. Otherwise, the routine returns the identifier of the photoflo +to which the processing element is appended. You can free the image using the +XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id" 20 +The \fIsrc_id\fP argument specifies the identifier of +the source image. The source image can be an unbound photomap, a photoflo, +a phototap, of a photomap bound to the photoflo. +If the source image is an unbound photomap, the operation is performed +immediately. Otherwise, a processing element is appended to the photoflo with +execution pending a call to the XieExecuteFlo routine. +The photoflo is specified explicitly if the source image is a photoflo, +or implicitly if the source image is a phototap or a bound photomap. +.IP "angle" 20 +The \fIangle\fP argument specifies the rotation +angle in degrees. A positive angle results in clockwise rotation. The +axis of rotation is the z-axis, which passes through the geometric +center of the source image. +.IP "width" 20 +The \fIwidth\fP argument specifies the width of +the destination image in pixels. If you specify a value of 0, the routine +adjusts the width of the destination image so that the rotated image +fits exactly without clipping off its corners. +.IP "height" 20 +The \fIheight\fP argument specifies the height of +the destination image in scanlines. If you specify a value of 0, the +routine adjusts the height of the destination image so that the rotated image +fits exactly without clipping off its corners. +.IP "fill" 20 +The \fIfill\fP argument specifies a pointer to an array +of pixel values the routine uses for each component to fill those areas +that do not map within the source image. For example, you could specify +array entries of fill[0]=pixel_value, fill[1]=pixel_value, and +fill[2]=pixel_value. If you specify +a null value, the routine uses a default pixel value representing +maximum intensity (white). +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a rotated copy of a source image. +.PP +If the operation is performed immediately and you selected computation +events using the +XieSelectEvents routine, the routine +adds an +XieM_ComputationEvent to the X11 event +queue when the routine is completed. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieRotate +.br +X_ieQueryResource if the fill argument is null +.PP +\fBXIE event returned:\fP XieK_ComputationEvent +if immediate execution and computation events selected +.PP +\fBXieLib errors:\fP Returns null if the fill +argument is null and source image is invalid +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.br +BadAlloc -- Insufficient server resources +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieScale.3X b/xie/docs/dec/xie23/man/XieScale.3X new file mode 100644 index 0000000..eb1b938 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieScale.3X @@ -0,0 +1,89 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieScale 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieScale \- This routine creates a scaled copy of a source image. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdst_photo_id\fP = XieScale\fI(src_id, width, height)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto dst_photo_id; +XiePhoto src_id; +unsigned long width; +unsigned long height; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +If the source image is an unbound photomap, the routine returns the +identifier of the destination image in the \fIdst_photo_id\fP +argument. Otherwise, the routine returns the identifier of the photoflo to +which the processing element is appended. You can free the image using +the +XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id" 20 +The \fIsrc_id\fP argument specifies the identifier +of the source image. The source image can be an unbound photomap, +a photoflo, a phototap, or a photomap bound to the photoflo. +If the source image is an unbound photomap, the operation is performed +immediately. Otherwise, a processing element is appended to the photoflo with +execution pending a call to the +XieExecuteFlo routine. +The photoflo is specified explicitly if the source image is a photoflo, +or implicitly if the source image is a phototap or a bound photomap. +.IP "width" 20 +The \fIwidth\fP argument specifies the width in pixels +of the destination image. +.IP "height" 20 +The \fIheight\fP argument specifies the height in +scanlines of the destination image. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a scaled copy of a source image. +.PP +If the operation is performed immediately and you selected +computation events using the +XieSelectEvents +routine, the routine adds an XieK_ComputationEvent +to the X11 event queue when the routine is completed. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieScale +.PP +\fBXIE event returned:\fP XieK_ComputationEvent if immediate +execution and computation events are selected +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadValue -- Height or width equal to 0 +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieSelectEvents.3X b/xie/docs/dec/xie23/man/XieSelectEvents.3X new file mode 100644 index 0000000..a439a38 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieSelectEvents.3X @@ -0,0 +1,90 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieSelectEvents 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieSelectEvents \- This routine sets the event mask to enable specified XIE events on +the XIE server. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fI\fPXieSelectEvents\fI(dpy, event_mask)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +Display *dpy; +unsigned long event_mask; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +None. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "dpy" 20 +The \fIdpy\fP argument specifies the X11 display +identifier returned by the +XOpenDisplay routine. +.IP "event_mask" 20 +The \fIevent_mask\fP argument specifies a bit mask +that determines which XIE server events are enabled. +The new mask replaces an existing mask. +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lfR lw(4.0i)fR . +.sp 4p +Symbol@Description +.sp 6p +XieM_ComputationEvent@T{ +Completion of immediate mode image +processing function +T} +.sp +XieM_DisplayEvent@T{ +Completion of immediate mode export to drawable +T} +.sp +XieM_PhotofloEvent@T{ +Completion of photoflo execution +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine sets the event mask to enable specified XIE events on +the XIE server. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieSelectEvents +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieSetOpDefaults.3X b/xie/docs/dec/xie23/man/XieSetOpDefaults.3X new file mode 100644 index 0000000..bdc0239 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieSetOpDefaults.3X @@ -0,0 +1,139 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieSetOpDefaults 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieSetOpDefaults \- This routine sets the current constraint model defaults on the server. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fI\fPXieSetOpDefaults\fI(dpy, model, levels)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +Display *dpy; +int model; +unsigned long levels[]; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +None. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "dpy" 20 +The \fIdpy\fP argument specifies the X11 display +identifier returned by the +XOpenDisplay routine. +.IP "model" 20 +The \fImodel\fP argument specifies the desired +default constraint model. +...\" MANDOC->Begin TABLE +.PP +.TS +tab(@); +lfR lw(4.0i)fR . +.sp 4p +Symbol@Operation Performed +.sp 6p +XieK_HardClip@T{ +Apply hard clip model +T} +.sp +XieK_ClipScale@T{ +Apply clip scale model +T} +.sp +XieK_HardScale@T{ +Apply hard scale model +T} +.sp +.TE +.PP +...\" MANDOC->End TABLE +.IP "levels" 20 +The \fIlevels\fP argument specifies an array of +quantization level numbers routines use when constraining each component of +an image. The array length must be at least equal to +XieK_MaxComponents. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine sets the current constraint model defaults on the server. +The constraint models supported by XIE are as follows: +...\" MANDOC->Begin UNNUMBERED LIST +.IP \(bu 3 +Hard Clip +.IP \(bu 3 +Clip Scale +.IP \(bu 3 +Hard Scale +...\" MANDOC->End LIST +.PP +In describing the constraint models, the floor is the smallest value +allowed after the data is constrained. For XIE, the floor is always +0. The ceiling is the largest positive integer value allowed after +the data is constrained to the specified number of levels. +.PP +In the Hard Clip model, data is constrained in the following steps: +...\" MANDOC->Begin NUMBERED LIST +.IP "\fR1\fP" 3 +All values less than 0 are set to 0 +.IP "\fR2\fP" 3 +All values greater than the ceiling are set to the ceiling +.IP "\fR3\fP" 3 +All values are rounded to the nearest integer +...\" MANDOC->End LIST +.PP +In the Clip Scale model, data is constrained in the following steps: +...\" MANDOC->Begin NUMBERED LIST +.IP "\fR1\fP" 3 +All values less than 0 are set to 0 +.IP "\fR2\fP" 3 +All values greater than the ceiling are set to the ceiling +.IP "\fR3\fP" 3 +All values are offset so that the smallest value +is set to 0 and then scaled so the largest value is set to the ceiling +.IP "\fR4\fP" 3 +Values are rounded to the nearest integer +...\" MANDOC->End LIST +.PP +In the Hard Scale model, data is constrained in the following steps: +...\" MANDOC->Begin NUMBERED LIST +.IP "\fR1\fP" 3 +All values are offset so that the smallest value is +set to 0 and scaled so the largest value is set to the ceiling +.IP "\fR2\fP" 3 +Values are rounded to the nearest integer +...\" MANDOC->End LIST +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieSetOpDefaults +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadValue -- Invalid constraint model +or levels less than or equal to 0 +...\" MANDOC->End TEMPLATE_PARA + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieSetStream.3X b/xie/docs/dec/xie23/man/XieSetStream.3X new file mode 100644 index 0000000..f0dda8e --- /dev/null +++ b/xie/docs/dec/xie23/man/XieSetStream.3X @@ -0,0 +1,131 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieSetStream 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieSetStream \- This routine sets the server transport parameters for stream mode +transport of an image plane in a specified source image. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fI\fPXieSetStream\fI(pho_id, plane, mode, cmpres, cmpprm, cmporg, +pxlstr, scnstr)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto pho_id; +unsigned char plane; +unsigned char mode; +unsigned char cmpres; +unsigned long cmpprm; +unsigned char cmporg; +unsigned long pxlstr; +unsigned long scnstr; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +None. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "pho_id" 20 +The \fIpho_id\fP argument specifies the identifier +of the source image for which you want to set transport parameters. +The source image can be an unbound photomap, a photoflo, a phototap, or a +photomap bound to the photoflo. The photoflo is specified explicitly +if the source image is a photoflo, or implicitly if the source image +is phototap or a photomap bound to the photoflo. +.IP "plane" 20 +The \fIplane\fP argument specifies the source image +data plane with which you want to associate the transport parameters. +.IP "mode" 20 +The \fImode\fP argument specifies the transport +direction. You can specify the symbol XieK_GetStream to +set up transport from the server to the client, or XieK_PutStream +to set up transport from the client to the server. +.IP "cmpres" 20 +The \fIcmpres\fP argument specifies the compression +scheme used for the data plane as it exists if you specify the +XieK_PutStream symbol, or as desired if you specify the +XieK_GetStream symbol. +.IP "cmpprm" 20 +The \fIcmpprm\fP argument specifies a compression +parameter required only if the transport direction is from the server +to the client and the compression scheme is DCT. +.IP "cmporg" 20 +The \fIcmporg\fP argument specifies the +image data component organization as it exists if you specify the +XieK_PutStream symbol, or as desired if you specify +XieK_GetStream symbol. +.IP "pxlstr" 20 +The \fIpxlstr\fP argument specifies the image data +pixel stride as it exists if you specify the XieK_PutStream symbol, or as +desired if you specify the +XieK_GetStream symbol. +.IP "scnstr" 20 +The \fIscnstr\fP argument specifies the image data +scanline stride as it exists if you specify the XieK_PutStream +symbol, or as desired if you specify the XieK_GetStream symbol. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine sets the server transport parameters for stream mode +transport of an image plane in a specified source image. +If you are transporting multiple data planes, you must call this +routine prior to calling either the XieGetStream or the +XiePutStream routine. In +addition, you must call this routine once for each data plane you want to +transport. You can abort stream mode transport prior to completion using the +XieAbortStream routine. +.PP +You can specify the +XieK_PutStream symbol for the +\fImode\fP argument only if you explicitly created the server +photoflo, photomap, or phototap into which you will transport image data. +To explicitly create these destination images, use the +XieClonePhoto, XieCreatePhoto, and XiePutImage +routines. If you attempt to set transport context for other +photomaps such as those resulting from a processing function, the routine +returns a BadAccess error. +.PP +If you specify a source image that is associated with a photoflo, +you can use the XieSetStream routine +only if the photoflo is not running. You must set transport context +for phototaps prior to executing the associated photoflo if the image +data is to be available. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieSetTransport +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadAccess -- Photoflo is running +.PP +BadIDChoice -- Invalid identifier +.PP +BadMatch -- Compression scheme not compatible with the image, data plane +and component organization not compatible +.PP +BadValue -- Invalid compression scheme +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieTapFlo.3X b/xie/docs/dec/xie23/man/XieTapFlo.3X new file mode 100644 index 0000000..8225a64 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieTapFlo.3X @@ -0,0 +1,85 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieTapFlo 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieTapFlo \- This routine returns an identifier for the hidden phototap currently at +the end of a photoflo. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIphoto_id\fP = XieTapFlo\fI(flo_id, permanent)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto photo_id; +XiePhoto flo_id; +unsigned char permanent; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +If you set the \fIpermanent\fP argument True, the routine returns +the new photomap identifier in the \fIphoto_id\fP argument. +Otherwise, the routine returns the identifier of the new phototap identifier. +You can free the photomap or the phototap using the XieFreeResource +routine. Phototaps are freed automatically when +you free the associated photoflo. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "flo_id" 20 +The \fIflo_id\fP argument specifies the identifier +of the photoflo, or any photomap or phototap bound to the photoflo. +.IP "permanent" 20 +The \fIpermanent\fP argument specifies whether or not +you want to create a permanent photomap. Set the argument True to +create a permanent photomap. Otherwise, the routine creates an ephemeral +phototap. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine returns an identifier for the hidden phototap currently at +the end of a photoflo. Use this routine when you want a temporary +identifier so you can use the output of the last processing element +as input to a downstream nonadjacent processing element. +Phototaps do not retain image data after photoflo execution. +.PP +You can create a permanent photomap if you want the image data to be +available after photoflo execution. This permanent photomap is +available during photoflo execution for export to an X11 drawable, as input to +downstream processing elements, and for transport back to the client. +It is not available for any other purpose until you free the associated +photoflo. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieTapPhotoflo +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadAccess -- A tap already exists +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieTranslate.3X b/xie/docs/dec/xie23/man/XieTranslate.3X new file mode 100644 index 0000000..68850d8 --- /dev/null +++ b/xie/docs/dec/xie23/man/XieTranslate.3X @@ -0,0 +1,115 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieTranslate 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieTranslate \- This routine creates a copy of an existing source image and replaces +part of the copied image with a part of a second source image. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIdst_photo_id = \fPXieTranslate\fI(src_id, src_idc_id, dst_id, dst_idc_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XiePhoto dst_photo_id; +XiePhoto src_id; +XieResource src_idc_id; +XiePhoto dst_id; +XieResource dst_idc_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +If the source image specified in the \fIsrc_id\fP argument +is an unbound photomap, the routine returns the identifier of the +destination image in the \fIdst_photo_id\fP argument. Otherwise, the +routine returns the identifier of the photoflo to which the processing +element is appended. You can free the returned identifier using the +XieFreeResource routine. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "src_id" 20 +The \fIsrc_id\fP argument specifies the source image +from which the routine extracts a region to translate to the destination +image. If this image is an unbound photomap, the operation is performed +immediately. Otherwise, a processing element is appended to the photoflo with +execution pending a call to the XieExecuteFlo routine. +The photoflo is specified explicitly if the image is a photoflo, +or implicitly if the image is a phototap or a photomap bound to the photoflo. +.IP "src_idc_id" 20 +The \fIsrc_idc_id\fP argument specifies the identifier +of the IDC of type CPP or ROI that defines the region the routine +extracts from the source image specified in \fIsrc_id\fP and +translates to the +destination image. If you specify a value of 0, the routine extracts +and translates the entire image from \fIsrc_id\fP. +.IP "dst_id" 20 +The \fIdst_id\fP argument specifies the identifier of the +source image the routine copies, in its entirety, to the destination image. +If the identifier specified in \fIsrc_id\fP is a photoflo, +\fIdst_id\fP must be bound to the photoflo using the +XieBindMapToFlo routine. +.IP "dst_idc_id" 20 +The \fIdst_idc_id\fP argument specifies the identifier +of the IDC of type CPP or ROI that defines the region in the destination image +the routine replaces with the region extracted from \fIsrc_id\fP. +If you specify a value of 0, the routine uses the entire image of +\fIdst_id\fP as the target of the translation. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine creates a copy of an existing source image and replaces +part of the copied image with a part of a second source image. +Both source images must have the same number of components +and both must be either constrained or unconstrained. +.PP +If the the 2 IDCs do not define a region of the same size, the +region the routine actually translates is sized to the minimum of the +2 widths and heights. +.PP +If the operation is performed immediately and you selected +computation events using the +XieSelectEvents +routine, the routine adds anXieK_ComputationEvent to +the X11 event queue when the routine is completed. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP X_ieTranslate +.PP +\fBXIE event returned:\fP XieK_ComputationEvent +if immediate execution and computation events are selected +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP BadIDChoice -- Invalid identifier +.PP +BadAlloc -- Insufficient server resources +.PP +BadAccess -- 1 source image is a photoflo and the other is not bound +to it +.PP +BadMatch -- The source images do not have the same number of components +or the 2 images do not have the same constraint model +.PP +BadValue -- IDC does not intersect the source image + +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/XieXid.3X b/xie/docs/dec/xie23/man/XieXid.3X new file mode 100644 index 0000000..27b04eb --- /dev/null +++ b/xie/docs/dec/xie23/man/XieXid.3X @@ -0,0 +1,61 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +.TH XieXId 3X "" "" "" "Digital" "" +...\" MANDOC->Begin OVERVIEW +.SH NAME +XieXId \- This routine returns the X11 identifier assigned to an XIE resource. +...\" MANDOC->End OVERVIEW +...\" MANDOC->Begin FORMAT +.SH C Format +\fIxid\fP = XieXId\fI(res_id)\fP +...\" MANDOC->End FORMAT +...\" MANDOC->Begin TEMPLATE_PARA +.SH C Argument Information +...\" MANDOC->Begin CODE_EXAMPLE +.oS +XID xie; +XieResource res_id; +.oE +...\" MANDOC->End CODE_EXAMPLE +...\" MANDOC->End TEMPLATE_PARA +...\" MANDOC->VMS-specific, only valid keyword: HEADONLY +.SH RETURN VALUES +...\" MANDOC->Begin RETTEXT +The routine returns the X11 identifier in the \fIxid\fP argument. +...\" MANDOC->End RETTEXT +...\" MANDOC->Begin PARAMDEFLIST +.SH PARAMETERS +.IP "res_id" 20 +The \fIres_id\fP argument specifies the identifier +of the XIE resource. +...\" MANDOC->End PARAMDEFLIST +...\" MANDOC->Begin DESCRIPTION +.SH DESCRIPTION +This routine returns the X11 identifier assigned to an XIE resource. +This information is useful when you are interpreting +XIE errors returned from the X11 server. You can use the C MACRO +\fIXId_\fP instead of this routine. +...\" MANDOC->End DESCRIPTION +...\" MANDOC->Begin TEMPLATE_PARA +.SH XIE Events and Error Messages +.PP +\fBProtocol Messages:\fP None +.PP +\fBXIE event returned:\fP None +.PP +\fBXieLib errors:\fP None +.PP +\fBXieServer errors:\fP None +...\" MANDOC->End TEMPLATE_PARA +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xie23/man/Xie_intro.3X b/xie/docs/dec/xie23/man/Xie_intro.3X new file mode 100644 index 0000000..4ea6a01 --- /dev/null +++ b/xie/docs/dec/xie23/man/Xie_intro.3X @@ -0,0 +1,47 @@ +...\" This manpage source uses rsml coding. +.so /usr/share/lib/tmac/sml +.so /usr/share/lib/tmac/rsml +...\" +...\" ********************************************************************* +...\" * * +...\" * Copyright (c) Digital Equipment Corporation, 1992 * +...\" * * +...\" * All Rights Reserved. * +...\" * * +...\" ********************************************************************* +...\" SCCSID: @(#)Xie_Intro.3 6.4 3/21/90 +.TH Xie_intro 3X "" "" "" "Digital" "" +.SH NAME +Xie_intro \- introduction to Xie library routines +.SH DESCRIPTION +.iX "Xie_intro(3) keyword" +.NXS "Xie library" "libXie library" +.iX "libXie library" "introduction" +These routines constitute the Xie library, +.I libXie. +XIE is an extension to the X Window System which +lets your application perform image formatting and display operations +using the resources of the X server. +Your application can transport images from an XIE +client application to the server and from the server to a client +application, manipulate images, and import images from and export images +to an X11 window or pixmap. XIE also allows data to be transported +in compressed form. +.PP +Declarations for these functions may be obtained from the include files +.RI , , +, . +.NE +.SH X Window System Compatibility +XIE has been proposed as a standard extension to the X Window System. +It is expected that the program interface will change as a result +of the standardization process. Future versions of XIE will reflect +any necessary changes to maintain compatibility with the X Window +System standard. +.SH FILES +.nf +/usr/lib/libXie.a, /usr/shlib/libXie.so +.fi +...\" +...\" This source file has been processed by the osf_build_manpages +...\" script. Contact dlibrary@ravine if you need more information. diff --git a/xie/docs/dec/xieSIarch.txt b/xie/docs/dec/xieSIarch.txt new file mode 100644 index 0000000..b60cfc0 --- /dev/null +++ b/xie/docs/dec/xieSIarch.txt @@ -0,0 +1,1620 @@ + +XIE Sample Implementation Architecture + + +Authors + +Robert NC Shelley +Dean A. Verheiden +J. Ben Fahy + +Sample Implementation Team +AGE Logic, Inc. + + + + +Additional Contributors +Larry Hare +AGE Logic, Inc. + + + + + + + +Comments concerning the SI architecture should be submitted by electronic mail to: +imagework@x.org + + + + + + +Copyright Notice + +This document is being provided by AGE Logic, Inc. and MIT under the following license. By obtaining, using +and/or copying this documentation, you agree that you have read, understood, and will comply with these terms +and conditions: + +Permission to use, copy, modify, distribute and sell this documentation for any purpose and +without fee or royalty and to grant others any and all rights granted herein is hereby granted, +providing that you agree to comply with the following copyright notice and statements, including +the disclaimer, and that the same appears on all copies and derivative works of the document that +you make. + +Copyright 1993 by AGE Logic, Inc. and the Massachusetts Institute of Technology + +THIS DOCUMENT IS PROVIDED "AS IS". AGE LOGIC AND MIT MAKE NO REPRESENTATIONS +OR WARRANTIES, EXPRESS OR IMPLIED. By way of example, but not limitation, AGE LOGIC AND +MIT MAKE NO REPRESENTATION OR WARRANTIES OF MERCHANTABILITY OR FITNESS FOR +ANY PARTICULAR PURPOSE OR THAT THE DOCUMENT DOES NOT INFRINGE THIRD-PARTY +PROPRIETARY RIGHTS. AGE LOGIC AND MIT SHALL BEAR NO LIABILITY FOR ANY USE OF +THIS DOCUMENT. IN NO EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, +INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS OF PROFITS, +REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR ANY THIRD PARTY, WHETHER IN +AN ACTION IN CONTRACT OR TORT OR BASED ON A WARRANTY, EVEN IF AGE LOGIC OR +MIT OR LICENSEES HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +The names of AGE Logic and MIT may not be used in advertising or publicity pertaining to the +document or software without specific, written prior permission from AGE Logic and MIT. + + + + +Acknowledgments + +XIE has evolved from the original specifications and sample implementation developed by Digital Equipment +Corporation and contributed to the X Consortium. +We wish to thank Digital Equipment Corporation and Hewlett-Packard Co. for contributing their pipeline +implementations to the X Consortium. The SI architecture has benefited from these efforts. + + +Table of Contents +Copyright Notice ii +Acknowledgments iii +Table of Contents iv +1. Introduction 1 +1.1. Task Definition 1 +1.2. Design Goals 2 +1.3. Document Organization 3 +2. Architecture Overview 4 +2.1. X/XIE Interfacing 4 +2.2. XIE Components 5 +2.2.1. Photoflo Compiler 6 +2.2.2. The Photoflo Linker 12 +2.2.3. The Photoflo Runtime Manager 13 +2.2.3.1. Scheduler 14 +2.2.3.2. Data flo Manager 15 +2.2.4. The XIE Resource Manager 15 +2.2.5. The XIE Memory Manager 15 +3. Extension Initialization 16 +4. Memory Management 17 +5. Dispatching requests 18 +6. Data Representations 19 +6.1. Canonic Data 19 +6.2. Non-canonic Data 19 +6.2.1. Byte Stream Data 19 +6.2.2. Compressed Data 19 +6.2.3. Run-length Data 20 +6.3. Tri-chromatic Data 20 +6.4. Strips 20 +7. Data Structures 21 +7.1. Data Formats 21 +7.1.1. Canonic 21 +7.1.2. Compressed 21 +7.1.3. Lookup-table 22 +7.2. Resource structures 22 +7.2.1. ColorList 22 +7.2.2. LUT 22 +7.2.3. Photomap 22 +7.2.4. ROI 22 +7.2.5. Photospace 23 +7.2.6. Photoflo 23 +7.3. Photo Element Definition 24 +7.4. DDXIE Structures 25 +7.4.1. Photoflo run-time context 25 +7.4.2. Photo Element run-time context 25 +7.4.3. Receptor 25 +7.4.4. Strip 25 +8. Protocol requests 26 +8.1. Global Query requests 26 +8.1.1. QueryImageExtension 26 +8.1.2. QueryTechniques 26 +8.2. Resource requests 27 +8.2.1. Overview 27 +8.2.1.1. Creating Resources 27 +8.2.1.2. Flo'ing Resources 27 +8.2.1.3. Destroying Resources 27 +8.2.2. ColorList 28 +8.2.2.1. Create 28 +8.2.2.2. Query 28 +8.2.2.3. Purge 28 +8.2.2.4. Destroy 28 +8.2.3. LUT 28 +8.2.3.1. Create 28 +8.2.3.2. Destroy 28 +8.2.4. Photomap 29 +8.2.4.1. Create 29 +8.2.4.2. Query 29 +8.2.4.3. Destroy 29 +8.2.5. ROI 29 +8.2.5.1. Create 29 +8.2.5.2. Destroy 29 +8.3. Photoflo related requests 30 +8.3.1. ServerIDspace 30 +8.3.2. Photospace 30 +8.3.2.1. Create 30 +8.3.2.2. Destroy 30 +8.3.3. Immediate-mode specific 30 +8.3.3.1. ExecuteImmediate 30 +8.3.4. Stored-mode specific 31 +8.3.4.1. Create 31 +8.3.4.2. Modify 31 +8.3.4.3. Redefine 31 +8.3.4.4. Execute 31 +8.3.4.5. Destroy 31 +8.3.5. ClientData transport 32 +8.3.5.1. Put 32 +8.3.5.2. Get 32 +8.3.6. Query/Control 32 +8.3.6.1. Query 32 +8.3.6.2. Await 32 +8.3.6.3. Abort 32 +9. DIXIE Photoflo Management 33 +9.1. Overview 33 +9.2. Photoflo Creation 33 +9.2.1. Creating the Flo 33 +9.2.2. Traversing the DAG 34 +9.2.3. Registering the Flo 36 +9.3. Photoflo Execution 37 +9.3.1. Prepping the DAG 37 +9.3.2. Analyzing the DAG 37 +9.3.3. Linking an executable Photoflo 37 +9.3.4. Starting the flo 37 +9.3.5. Resuming the flo 38 +9.3.6. Stopping the flo 38 +9.3.7. Destroying an executable Photoflo 38 +9.3.8. Event notification from a flo 38 +10. DDXIE Photoflo Management 39 +10.1. DAG Analysis 39 +10.1.1. Choosing Element Handlers 39 +10.1.2. Choosing a Linker and Photoflo Manager 41 +10.2. Photoflo Linker 41 +10.3. Photoflo manager 42 +10.3.1. Startup 42 +10.3.2. Scheduling 42 +10.3.3. Data Manager 44 +10.3.4. Input 46 +10.3.5. Output 46 +10.3.6. Query 46 +10.3.7. Abort 46 +10.3.8. Destroy 46 +11. Photo Elements 47 +11.1. Element Structures 47 +11.2. Element Interfaces 48 +11.2.1. Create 48 +11.2.2. Initialize 48 +11.2.3. Activate 48 +11.2.4. Flush 48 +11.2.5. Reset 48 +11.2.6. Destroy 48 + + + +1. Introduction +The X windows Image Extension (XIE) project was initiated in 1988 by Joe Mauro of Digital Equipment +Corporation, in order to meet the needs of those wanting improved imaging facilities within X. XIE is targeted at +the problem of image display, and rendering any digital image on any X-capable hardware. XIE is not intended to +be a general purpose image processing engine, although it does provide a rich environment for performing simple +image enhancement operations and format conversions. XIE also permits the support of image-specific hardware +in the server, including but not limited to decompression, scaling, rotation and convolution accelerators. +The X Consortium accepted XIE into Technical Review in March of 1991. After over a year and a half of debate +and analysis by a number of interested Consortium members, a revised Version 4.12 of the XIE protocol was +passed out of Technical Review and into Public Review. The Public Review period is scheduled to expire April +23rd, 1993. It is the goal of the Consortium that XIE will be made widely available shortly after acceptance as an +official standard, and therefore AGE Logic, Inc. has been commissioned to provide a Sample Implementation (SI) +of XIE, to be distributed as part of the December 1993 X windows R6 release. This document describes AGE +Logic's initial design of the XIE SI architecture. +The audience of this document is anticipated to be X Consortium members who have a working understanding of +XIE, either through participating in its design within the Consortium, or by having read the latest version of the +XIE protocol, by Shelley et al., published in Special Issue C of The X Resource journal. An overview of XIE by +Fahy and Shelley is also provided in the same issue. Other references of interest would include The X Window +System Server by Israel and Fortune, and X Window System by Scheifler and Gettys. + + +1.1. Task Definition +XIE is defined by the protocol document referenced in the previous section. XIE requests are channeled through +the Core X dispatch loop to the dispatchers (swapped and unswapped) for the XIE SI. XIE-specific events and +errors are originated in SI and routed back through Core X to the waiting client. +XIE defines six new resources: ColorLists, LUTs, Photoflos, Photomaps, Photospaces, and ROIs. Each of these +resources must be recorded with Core X, so that at client shutdown the resources may be freed reliably. +In the XIE computational model, a client provides a blueprint for a computational engine, a photoflo, and passes it +to the server for execution The blueprint is a directed acyclic graph (DAG), which shows what the components +(elements) of the engine are, and how data flows between them. Import elements receive data from the client, Core +X, or from resources. Processing elements receive data from import elements or upstream processing elements, +perform a specified operation on the data, and pass the data on downstream. Export elements define the exit point +of data from the photoflo. Data from Import or Processing elements may be routed to the client, Core X, or an XIE +resource simply by adding an Export connection after the element of interest. +Processing, Import, and Export elements are defined at two levels. For example, a Geometry element states that +incoming image data is to be re-sampled to produce a new output image. The specific sampling mechanism is +selected by using a set of technique parameters in the element specification. Thus, technique parameters give fine- +grain information on how a course-grain operation (such as geometric transformation) is to be performed. + +To summarize the tasks which the SI must perform, it must: +1. Integrate into Core X +2. Receive and correctly interpret XIE-specific requests +3. Manage XIE-specific resources +4. Build computational engines (photoflos) according to the blueprints (DAGs) provided +5. Execute the photoflos +6. Return error and event information as required. + +Building and executing the photoflos necessitates: +1. Parsing the DAG information +2. Performing semantic analysis +3. Matching sub-tasks (defined by elements, etc.) to machine-specific code +4. Scheduling execution +5. Managing data flow. +6. Handling special conditions, including shutdown and return of control. + +Note that the SI must be able to support multiple photoflos executing simultaneously, and thus all photoflo and +element code must be reentrant, and data structures must not be written so as to preclude reentrancy. + +1.2. Design Goals +The MIT X Consortium, in soliciting for bids on the SI project, has previously stated the following design +requirements: +1. The SI must be easily ported to many different platforms. +2. The SI must be modular, to support easy customization. +3. Performance should be commercial quality. +4. Performance should not be biased to a particular machine architecture (e.g., big endian machines should +have performance comparable with little endian machines of the same approximate raw speed). +5. The SI should accommodate servers with limited memory. + +An additional, implied requirement is: +6. Design of the SI should be minimal risk. + +That is, it must be acknowledged that while there are any number of ways in which photoflo optimizers and +schedulers could be implemented, the overriding goal must be to ensure that an SI is available in time for the R6 +release of X windows. + +1.3. Document Organization +This chapter has provided a brief introduction to the topic of designing a sample implementation of the X image +extension. The next chapter provides an overview of the architecture as the design currently stands. It starts by +looking at XIE from a very high conceptual level and working its way down examining a few of the SI's major +building blocks. +The next three chapters discuss in more detail: extension initialization, memory management, and the +dispatching of requests through Core X. They are followed by a brief description of a some high-level data +representations, followed by a detailed exposition of critical data structures. These chapters serve as references for +the chapters that follow. + The eighth chapter discusses the implementation ramifications of XIE requests, up to the topic of photoflo +management in the server. That issue is covered in detail in chapters nine and ten, which are split across device- +independent / device-dependent lines. The final chapter discusses elements; their data structures and interfaces. + + + +2. Architecture Overview + +Core X is divided into device-independent (dix) and device-dependent (ddx) layers. The dix layer contains code +and data structures which should not need to be altered in porting X from one machine to another. The ddx code is +where device-specific information, such as drivers for special hardware, assembly routines for optimized graphics, +etc., are placed. The dix layer accesses ddx code by calling ddx procedures indirectly, through a list of well- +defined entry points stored in dix resources. +The design of XIE is intentionally modeled so as to follow the same basic form. XIE is divided into a device- +independent layer called dixie, and a device-dependent layer called ddxie. A set of dixie data structures is +defined, which includes a list of entry points to ddxie routines. In the SI, this list will be filled exclusively with +machine-independent XIE code. However, in the interest of portability and optimization, care has been taken to +make it easy to override the generic code with machine-specific routines. It is anticipated that server implementors +porting to new hardware will create new ddxie subdirectories which are machine dependent, as is depicted below. + + + + +2.1. X/XIE Interfacing +The figure on the following page illustrates the interface between the new XIE architecture and the existing Core X +server design. All routing of data in or out of XIE must go through Core X. XIE requests are received by the Core +X dispatcher, recognized as belonging to XIE, and the appropriate procedure to receive the request is called. +Similarly, errors and events generated within XIE are routed back out using standard Core X mechanisms. Image, +LUT, and ROI data is passed from the client to XIE via a PutClientData request, and thus follows the same route +as normally dispatched data. Image, LUT and ROI data to be returned to the client is sent via Reply packets, using +the conventional Core X technique. Finally, XIE moves data between an XIE photoflo and Core X resources by +making use of the list of Core X entry points described above. + + +2.2. XIE Components +At the highest level, XIE may be viewed as containing the components depicted in the figure below (it also +contains other components, not shown). Core X provides a resource manager in the dix layer and a memory +manager in ddx. XIE will provide its own resource and memory managers layered on top of the Core X facilities. +XIE also has its own dispatcher. Routines within the XIE dispatcher are called when the X dispatcher receives a +request which it recognizes as belonging to the imaging extension. + +When the request contains the definition of a photoflo, this definition must be translated into the appropriate code +and data structures required to build and execute the flo. For this reason, XIE may be viewed as containing a +Photoflo Compiler, which performs this task. The output of the compiler is a set of data structures which describe +how the photoflo will be executed, given the existing available code. Initialization of static variables and resolu- +tion of entry points identified by compilation is the responsibility of the Photoflo compiler. Execution is conducted +by a Photoflo Manager, which consists of a Scheduler, Dataflo Manager, and other components. Client data is +input through the XIE dispatcher and given to the Photoflo Manager, which deposits the data in with the Dataflo +Manager and then wakes up the Scheduler. +2.2.1. Photoflo Compiler +The sub-structure of the Photoflo Compiler may be derived by comparing the task of compiling photoflos +to classical compiler problems. The figure below shows the classical model of a compiler which is pro- +ducing code for the expression a = bee + cf*d[i], where cf is floating point and a, bee, and d are inte- +gers. + +The input to the compiler is simply a stream of bytes, that is, a followed by = followed by b, followed by +e, etc., with no meaning or structure yet attached to the stream. Lexical analysis groups the characters to- +gether into the distinct tokens, a, bee, + , cf, etc. Syntax analysis is used to resolve the order in which +fundamental operations are carried out, which is represented as a directed graph. Semantic analysis adds +type and other attribute information to the problem representation. Note that required type conversions +and operator classes have been made explicit in the output of the Semantic Analyzer. Intermediate Code +Generation converts the DAG representation into a device independent pseudo-language (output not +shown). The first four phases of the compiler are often grouped together and referred to collectively as +the compiler front end, which is the device independent part of the compiler. +The back end of a compiler is the device dependent part, which consists of the optimizer and code gen- +erator. Most compilers incorporate both device independent and device dependent optimizations. The +code generator translates from the intermediate language representation to the language of the target ma- +chine. +In attempting to apply the standard compiler model to the problem of photoflo compilation, a number of +fundamental differences in the two environments must be recognized. First, it should be noted that there +is usually a significant delay between when a conventional compiler translates source code into object +code and when the final executable is eventually run. This means that the time constraints on the com- +piler are not necessarily severe, allowing for more extensive optimization. In contrast, in XIE, it will al- +ways be the case in compiling photoflos that significant parts of the compilation time will occur just before +execution, and add to the perceived execution time. This is because the XIE protocol expressly forbids re- +solving the attributes of input data before the ExecutePhotoflo (or equivalent) request is given. This puts a +hold on semantic analysis, constraining it to wait until just before execution. Since code generation and +optimization follow the semantic analysis phase of compilation, these phases are also constrained, and +the time to carry them out should be kept tightly restricted. This inhibits exhaustive optimization, and +encourages very simple code generation strategies. +Another important environmental difference which affects the application of the compiler model is that +most conventional languages expose the canonical data types of the processor fairly conveniently. The +underlying hardware model assumes registers of a few fixed sizes, whereas in XIE, the "register size" of +the server is hidden completely. Canonical data types, such as 1, 8, and 16 bits might be chosen by the +server implementor in order to reduce the number of cases for which processing elements must be writ- +ten. However, this may vary from server to server, and thus the SI code should not make the decision +that it already knows all of the canonical data types. Although the SI will support 1, 8, 16 and 32 bit data, +it is also a design goal that the SI be easily extensible if a vendor also wants to support 4 bit data. This +implies that the type resolution portion of the semantic analyzer must be moved out of the device inde- +pendent front end, and into the device dependent back end. +The figure below shows the basic compiler model modified to accommodate the XIE computational +model. Only lexical and syntactic analysis may occur prior to receiving the equivalent of an Execute- +Photoflo request. Lexical analysis in the context of XIE refers to parsing the raw data stream and break- +ing it into the element definitions, etc. Syntactic analysis refers to analyzing the DAG to make sure it is +legal (e.g. contains no cycles). As the DAG is analyzed, the dixie data structures which describe it are +filled in. + +The semantic analyzer is split into device independent and device dependent portions. Propagation of +attributes from import elements to downstream elements occurs in the device independent part of the +semantic analyzer, whereas type resolution requires device dependent information. Both parts of the +semantic analyzer fill in structures in the dix layer of XIE (see figure, following page). The difference is +that the attribute analyzer does not use any device independent information to produce its data, whereas +the type resolution code does. + +The code generator has the task of accepting the device-independent photoflo representation as input, and +filling in the device-dependent data structures which implement the photoflo. Because code generation +may be closely coupled with type resolution, the SI groups these two operations into a DAG Analyzer, as +is depicted in the figure below. The SI will include a default machine independent DAG Analyzer which +handles type resolution by a simple type upgrading scheme, and which generates code by mapping di- +rectly from elements defined in the DAG to mi element handlers. The design accommodates substitution +of a device dependent DAG Analyzer, however, which can choose to perform special optimizations, +support non-SI canonical data types, and employ a machine-dependent element interface. + + +The figure below illustrates the fundamental task of the DAG Analyzer. A Photoflo to be compiled is +shown at the left, in which a one-bit image is imported as a process domain, a 4 bit image is imported +and convolved, the output is constrained, and a lookup table transformation is applied using Point. The +XIE server implements Point, Convolve, Constrain, ..., operations on various canonical data types. By +definition, element handlers only accept canonical data as input, and only produce it as output. If the +routines to perform a convolution can only accept 1,8,16, or unconstrained data, and the routines to +import client image data can also produce any of these types, it is necessary to negotiate on which type +should be used between connected elements. + + + +Consider the photoflo depicted below, which has 4 bit image data being fed to both Convolve and Point. +The user has specified in the protocol that the Point element is to produce data with 128 levels, which +requires at least 7 bits of storage. This suggests that the output of the Point element should produce 8 bit +data, which is the closest canonical form with adequate resolution. + + + +Using the same reasoning, that is, that elements should produce as output the smallest-resolution +canonical form which is adequate, ImportClientPhoto should produce 8 bit data. This would fix the type +at the input of the Convolve element, implying that it is necessary to choose a Convolve handler which +accepts 8 bit data. + + +Let us now suppose that it is desirable that server implementors be allowed to introduce new canonical +types, such as four bit data. This would be quite natural on servers which only had four bit deep displays, +and wanted to insure good performance on operations like: + + + + +Rather than have to convert the 4 bit data to 8 bits, do an 8 bit Point and then convert back to 4 bits in +ExportDrawable, it might be more efficient to keep the data as 4 bits throughout. This implies that the +implementor might want to define an ImportClientPhoto handler which could produce 4 bits output, a +4->4 Point handler, and an ExportDrawable handler which accepts 4 bits. Let us suppose this is +permissible. +Returning to the case of the photoflo containing a Convolve element above, reapplying the heuristic that +the output of an element should be in the smallest available canonical form which has adequate resolution, +we reach the situation: + + +The problem is, we are now requiring the presence of handlers for Convolve and Point which can accept +4 bit data and produce unconstrained and 8 bit data, respectively, and these may not exist. It might be +reasonable to require a 4->8 Point handler, since that may have general utility, but since Convolve is +fundamentally an unconstrained operation, it seems overly harsh to force the server implementor to go +through and alter all element handlers like Convolve to include conversions of data types which are not +interesting. An alternative is to provide mechanism in the dixie structures for a DAG analyzer to be able +to insert "pseudo-elements" which do the conversion or perform analogous tasks: + + + +Thus, the SI data structures allow the DAG analyzer to produce a new, optimized DAG with a different +number of "elements" than the original flo. The ddxie layer is allowed to define pseudo-elements which +may perform type conversions, or combine two or more elements into a single "super-element," or +perform other functions (for example, converting a bitonal image into a list of run-lengths, if it is to be +used as a Process Domain). This provides a great deal of flexibility for future enhancement and +optimization. + +The SI DAG Analyzer will employ the following general method: +1. For each element defined by the protocol, and each implementation-specific pseudo-element, there must +be written at least one handler which is capable of doing processing for that element. +2. All handlers will output a type that is the smallest acceptable canonical type for the input data and the +particular operation. +3. Prior to trying to find a handler for a particular element, the DAG Analyzer will propagate the output types +of all of its source elements to its input data receptors. +4. Each handler must provide a test entry point, which the DAG Analyzer can call providing the photoflo and +tag number of the element to be "compiled". +5. The handler's test function will examine the element parameters and the requested input types and return +ACCEPT if it agrees to handle the element, and REJECT otherwise. +6. A handler which agrees to accept an element may change the input type coming from any source element by +indicating that a Convert pseudo-element must be inserted between itself and the source. +7. If multiple downstream elements require the same conversion, they will share output from the same +converter. + + The next figure provides a simplified diagram of relevant data structures. The DAG analyzer is given a +photoflo, which is shown at left. It orders the elements by their distance from the nearest Import element, +and resolves types in the order of increasing distance. The upper right hand corner of the figure shows a +list of handlers associated with each element type. By the time the DAG analyzer gets to the Convolve +element, ImportClientPhoto has already been resolved to produce four bit output, and that "suggested +input type" has been recorded in the input receptor of the Convolve element. + + + +The DAG analyzer looks at its list of handlers which are of type Convolve, and selects the first member of +that list, ddConvolve. This handler supports floating point hardware, and as written, does not insert +Conversion pseudo-elements to prepare its input data. Therefore it rejects the element, and the DAG +analyzer goes on to the next handler in the list for Convolve. +All elements will contain as the last handler in their list a machine independent handler which can accept +any canonical data type. If the data type matches an explicitly supported type, the handler loads the entry +point for the specific function and leaves the requested types unchanged. If the data type is not explicitly +supported, the handler inserts a Conversion element into the photoflo (these are pre-resolved, so the +DAG analyzer doesn't have to back up to find a handler for it) and accepts with the nearest sufficient +canonical type which it supports. +The SI will provide mi handlers which can accept any element specified in the protocol. Note however +that the SI may provide multiple mi handlers for a single element, which may be differentiated by which +techniques they support, etc. +The method described above solves the code generation problem by effectively labeling each element in +the photoflo with a handler. Discussion of the data flow between elements and scheduling of processing is +deferred to the section on the Photoflo Runtime Manager. + +2.2.2. The Photoflo Linker +After the Photoflo Compiler has resolved data types and handlers for each element, the Photoflo Linker is +called to perform one-time ("static") initialization of the photoflo. It is at this point that the first device- +dependent structures are created, which provide an execution context for the photoflo and its elements. +Entry points into the photoflo manager are loaded in the dixie flo-def structure, along with entry points to +the flo manager's sub-components, the scheduler and data manager. +Both the linker and the DAG analyzer portion of the compiler can be skipped if the photoflo has been +executed previously. This is because the dixie structures retain the one-time initialization state even after +shutdown. The attribute checking portion of the Semantic Analyzer must (by directive of the protocol) be +re-run at each invocation, but if it discovers that no attributes have changed, it skips the back end of +compilation and linking, and proceeds directly to execution. + + +2.2.3. The Photoflo Runtime Manager +Photoflo management is partially the responsibility of the client, and partially the responsibility of the +server. The client sends Execute, PutClientData, GetClientData, QueryPhotoflo, Await and Abort re- +quests which the server must accommodate. Specific Procs in the XIE dispatcher receive these requests, +and after possibly making other internal server calls (e.g., ProcExecute may call the compiler or linker +first), route control to the Photoflo Manager, which resides in ddxie. + +The entry points of each photoflo manager component are placed in the dixie data structures. Thus, the +photoflo manager is purposely designed to support ample customization, at several different levels. For +example, an md scheduler could be substituted, while to using other components from the mi photoflo +manager. The selection of which components to use could be determined by the nature of the photoflo. +For example, the general-case mi photoflo manager could be chosen if the DAG is topologically complex, +whereas a simpler photoflo manager might be appropriate for linear photoflos. + +2.2.3.1. Scheduler +The scheduler is responsible for managing the activation of elements in order to move data +through the photoflo. The SI provides a default scheduler in the mi layer, which may be over- +ridden by a device-dependent scheduler by the server implementor. +Any scheduler has the following responsibilities: +1. When data arrives from the client, it must be delivered to the appropriate receiving element. +2. Elements which have filled their output buffers must be suspended until there is room to generate +more output. +3. Elements which have sufficient data to begin processing must eventually be activated, to avoid +deadlock. +In addition there are the following issues to be dealt with: +1. Low-memory servers should minimize the requirement of large data buffers within the photoflo, +possibly at the expense of some performance loss. +2. High-memory servers should maximize efficiency, possibly at the expense of using more mem- +ory in photoflo data structures. +3. For slow operations, it may be desirable to minimize the initial delay to receiving data in export +elements. +4. For fast operations, it may be desirable to maximize performance, so as to increase the number +of operations per second which can be carried out. + +Consideration of the above issues and responsibilities leads to the notion of letting elements pro- +duce a configurable number of lines when activated. If an element only produces one line at a +time and then returns to the scheduler for permission to proceed further, excessive overhead may +result. If an element on the other hand waits for all input data to proceed and then produces all +output data at once, excessive memory usage in the photoflo may occur. +The SI scheduler supports elements that can produce their output data in strips, that is, a fixed +number of lines at a time. The number of lines in a strip will vary among elements and even +servers, since memory/performance tradeoffs in the scheduler will tend to vary with the same +tradeoffs in the server. Thus, the number of lines in a strip for any element is set by that ele- +ment's ddx-level handler, at link time. At the same time, a minimum number of lines of input +which are required to commence processing are also recorded in the element's receptor data +structures. +Another concern of the scheduler implied by the above issues and responsibilities is to maintain +an even flow of data through the photoflo. If the scheduler simply finds an element which can be +activated and repeatedly executes it until all input data is exhausted, the data may wind up +moving slowly through the photoflo in large chunks, as if the strip sizes were equal to the entire +output image. Thus the SI scheduler attempts to balance the flow of data by reducing the prior- +ity of elements which have recently been activated, and increasing the priority of elements which +have recently received data. The SI scheduler will also yield to the client when it has finished +processing all elements since the last client yield, presuming there is more data which the client +is obligated to send. +To summarize the heuristics upon which the SI scheduler are based: +1. elements produce output several lines at a time instead of one or all, to avoid thrashing in the +first place and heavy memory consumption in the second. +2. the scheduler yields to Core X if there is pending client input data, after checking to make sure +that all elements which are capable of processing have had a turn since the last yield. +3. elements which have recently been executed have their priorities downgraded. +4. elements which have recently received data have their priority upgraded. +Details of the actual algorithm employed for scheduling may be found in the last chapter on +DDXIE Photoflo Management. + +2.2.3.2. Data flo Manager +The data flo manager has the responsibility of moving data between the elements which produce +it to the elements that consume it. In order to minimize overhead, pointers to the data are ex- +changed, rather than copying the data itself. +In this model, an element requests a pointer to an output strip from the data flo manager when it +is ready to execute. The element maintains exclusive control over that strip while it is processing +its data and placing it in the strip. Once the element has finished with the strip, it calls the data +flo manager to pass it to downstream receiving elements. +After being informed that a strip has been completed, the data flo manager determines which +downstream element receptors are in need of the data. A pointer to the strip is then added to the +end of each such receptors input strip list. +For the receiving elements, the strips will usually be read-only, unless the elements requests and +receives permission to re-use the input strip for storing its output. Macros will be provided as a +tool to hide the stripped nature of the data. While using these macros will avoid problems asso- +ciated with downstream elements consuming strip output at different rates, elements will have +the option of accessing data on a whole strip basis if they so desire. +Details of the actual algorithm employed for dataflo management may be found in the last +chapter on DDXIE Photoflo Management. + +2.2.4. The XIE Resource Manager +The XIE resource manager is responsible for creating, doing lookup, and destroying XIE resources. +Those resources available to the client are Photomap, LUT, Photoflo, Photospace, ROI, and ColorList +types, which are registered with the Core X resource manager to comply with the standard X model. +A photospace resource maintains a list of the photoflos which reside in it. When the photospace is de- +stroyed, all of its photoflos are destroyed along with it. Destroying a photoflo requires going through its +list of elements and destroying all of their data structures too. + +2.2.5. The XIE Memory Manager +The XIE SI will layer an XIE-private set of allocation calls on top of the standard X allocation routines. +This will permit customization of the memory manager to allow for special fragmentation avoidance al- +gorithms, etc. + + +3. Extension Initialization +The image extension is initialized along with other extensions by setting the XIE flag in the module miinitext.c. +This causes the function XieInit() to be called during server startup. +XieInit() calls CreateNewResourceClass() to register an XIE resource class, and registers the Photomap, LUT, +Photoflo, Photospace, ROI, and ColorList resource types and their respective deleteFunc vectors by calling +CreateNewResourceType(). +Next XieInit() calls AddExtension() to register the XIE dispatchers and closeDownProc with Core X. +AddExtension returns the major opcode, error and event bases for XIE to use. +XieInit() allocs a client array sufficient for holding MAXCLIENTS clients, and initializes the array to contain +XieNullClient pointers. +The last step of extension initialization is to call XieReset(), which initializes XIE's internal state variables, if +required. + + +4. Memory Management +The SI will place a veneer over the core X memory management routines (e.g. Xalloc, Xrealloc, Xfree, etc.). This +will facilitate adding any special management hooks that may be necessary when the SI is ported to particular +platforms. This will also facilitate monitoring memory usage, tracking down leaks, etc. +To cut down on memory management overhead during flo execution, the many data segment descriptors that might +normally be allocated and freed as they are needed, will instead be returned to a look-aside list that is managed by +the photoflo data manager (so that they can be more efficiently re-used). They will be returned to the underlying +management routines (i.e. core X) when the flo completes (and if the number of cached descriptors exceeds a high +water mark). +A global parameter will be used to hint at the most efficient alignment for scanlines, lookup tables, etc.. Individual +elements are allowed to override this alignment hint in order to address their own particular alignment +requirements (e.g. restrictions that might be imposed by an image processing accelerator). + + + +5. Dispatching requests +XIE protocol requests are passed through the normal X protocol stream from the client to the core X dispatch loop. +Core X dispatches XIE requests to the XIE dispatcher or the XIE swap-dispatcher. The XIE dispatcher of choice +was selected at extension initialization time by AddExtension(). +The XIE dispatcher passes the request directly to the appropriate Proc routine. The XIE swap-dispatcher must +byte-swap multi-byte fields within the protocol request before calling the Proc routine. For requests that include +PhotoElements, the element (and technique) fields must also be swapped. Conversion of IEEE-floats is deferred to +the photoflo creation routines. Likewise, reformatting of client data (received with a PutClientData request) is +deferred to the target element within the photoflo. +When the extension is done fielding the request, it returns a code value to indicate either success or failure. If the +request is not a successful, an error packet is sent back to the client. + + +6. Data Representations +6.1. Canonic Data +To ensure the greatest processing efficiency the SI will maintain images using a limited number of convenient data +types. Since data provided through PutClientData requests must be copied from the wire buffer before returning to +core X, the least overhead is incurred if the data are converted as they are moved. All image data entering the SI +from the client will be converted (if necessary) to one of the following data types: +* Bit: bi-level pixels. 8 pixels are packed into each consecutive byte +* Byte: pixels having 3 to 256 quantization levels, each pixel stored in the low-order bits of a byte (unused high-order +bits within the byte are zero) +* Pair: pixels having 257 to 16,384 quantization levels, each pixel stored in the low-order bits of a byte-pair (unused +high-order bits within the byte-pair are zero) +* Quad: pixels having more than 16,384 quantization levels, each pixel stored in the low-order bits of a 4-byte unit +(unused high-order bits within the unit are zero) +An additional image data type arises from elements that can produce unconstrained data, which can only exist +within the context of a photoflo. Unconstrained data must be converted, via a client specified Constrain element, +prior to export out of the photoflo. The protocol makes no restriction on the representation of unconstrained data. +In the SI, unconstrained data will be represented via " typedef float Unconstrained; " to facilitate redefining +the representation. +Canonic form will take advantage of the natural byte order of the server architecture for data that spans multiple +bytes. The SI will use Endian-intelligent macros to efficiently extract and insert arbitrarily aligned bit field data. +There will be a module of conversion routines for converting to and from canonic form, and for promoting data to +a higher canonic form (e.g. convert byte to float). Demoting data (e.g. from float to byte) is explicitly requested by +the client via Constrain elements. + +6.2. Non-canonic Data +All data that is transported through the protocol stream is considered to be non-canonic. Additionally, all encoded +data is non-canonic. +6.2.1. Byte Stream Data +For data that are injected into a flo by a PutClientData request, conversions are specific to the target +ImportClient element and decode technique. Since their parameters fully describe how the data are to be +interpreted, the appropriate decode or conversion function is selected by the ddxie DAG analyzer. +Similarly, it is the responsibility of an ExportClient element to format output data (as specified by client +parameters) prior to it being sent to the client (the data are sent in response to a GetClientData request). + +6.2.2. Compressed Data +Compressed data is stored as a byte stream, together with sufficient decoding parameters to decompress +the data. These parameters include a decode technique. + +6.2.3. Run-length Data +A ProcessDomain is not a resource, but rather the use of a photomap or ROI resource (or equivalent data +imported directly from the client) in conjunction with an X,Y offset (V4.12 pg. 7-2). The Blend element +is unique in that the process domain input data must be a blend-plane. A blend-plane is an n-level +constrained alpha-plane (i.e. data that looks much like a gray scale image). All other elements that accept +a process domain (e.g. Arithmetic, Compare, ..., Point, ExportClientHistogram) accept only ROI or +control-plane type processing domain data. An ROI represents a list-of-rectangles, whereas a control- +plane is treated as an array of Booleans. +Since some elements can accept both ROI and control-plane data types, their implementation can be +simplified if these data types could be converted to a common form that offers processing efficiency. +Using run-lengths, groups of image pixels could be alternately processed or passed-through without +testing the domain on a per-pixel basis. +The SI will present control-plane and ROI data to an element's process domain input in run-length form +on a per-scanline basis. Consecutive scanlines with identical sets of run-lengths can be counted as a +vertical run. Encoding the data in this manner may also provide some compression, but that is not the +primary consideration. +Conversion of control-plane data will be accomplished by inserting an additional element type between +the source of the control-plane data and the process domain input of the element that requires it. This +new element type will alternately count runs of zero and non-zero pixels in the image. +ROI data will be converted by the ImportClientROI element. The rectangles must be sorted by their Y +offset and then by X offsets within the same Y, before they are converted into run-lengths. +Defining process domain data in this manner is akin to Y-X banding of regions within core X. + +6.3. Tri-chromatic Data +Triple band data is stored and passed between flo elements in band-by-plane format (i.e. pixels for each band are +segregated into separate image arrays). In XIE, the color space attributes of triple band data are known only to the +client. Therefore, this data is not tagged as representing any particular color space. + +6.4. Strips +One of the motivations for using photoflos is to reduce memory utilization by propagating segments of the image +through each processing step to form the desired result, rather than consuming a full size image buffer at each step. +If the segment size is too small, however, performance can suffer due to increased scheduling overhead. To +address these conflicting problems, elements will produce a number of scanlines at a time, in strips, where the +number of scanlines that constitutes a strip is a function of a tunable parameter. + + +7. Data Structures +7.1. Data Formats +A format-rec is used to describe the format of data that an element will produce or the format required by a +receptor. It consists of: +* the data class (i.e. canonic, compressed, lookup-table, run-length) +* an in-line format-specific structure +Note: run-length data require no additional specification, byte stream data are described by client specified element parameters. + +7.1.1. Canonic +A canonic-rec is used to describe the format of canonic image data that an element will produce or the +format required by a receptor. For triple band data, a separate canonic-rec is used for each band. A +canonic-rec contains: +* the canonic data type +* the band number +* the total width (in pixels) +* the total height (in pixels) +* the depth (in bits) +* the number of potential quantization levels +* the distance between adjacent pixels (in bits) +* the distance between adjacent scanlines (in bits) + +7.1.2. Compressed +A compressed-rec is used to describe encoded image data that an element will produce or encoded data +that is required by a receptor. A compressed-rec contains: +* the compression technique (either decode for data that is to be stored, or encode to describe how an export +element should compress data) +* the band interleaving +* the band number +* the width (in pixels) +* the height (in pixels) +* the number of potential quantization levels +* a pointer to technique-specific parameters +For triple band JPEG data, three compressed-recs are required to describe the individual bands despite the number of image +arrays that are required to represent the data (1 or 3 depending on interleave). + +7.1.3. Lookup-table +A table-rec is used to describe the format of lookup table data. It contains: +* the band order of lookup tables sent from the client +* the maximum number of quantization levels allowed in the input image +(i.e. the number of entries per table) +* the number of quantization levels that may occur in the output image + +7.2. Resource structures +7.2.1. ColorList +A colorlist-rec is used to define a ColorList resource. It contains: +* the resource-id of the colorlist +* the number of references to the colorlist (including 1 for core X) +* the resource-id of the colormap from which the cells have been allocated +* the number of cells allocated +* the pointer to the list of allocated cell indices +7.2.2. LUT +A lut-rec is used to define a LUT resource. It contains: +* the resource-id of the lut +* the number of references to the lut (including 1 for core X) +* the number of lookup tables (either 1 or 3) +* a format-rec containing the lookup table attributes +* pointers to the lookup tables +7.2.3. Photomap +A photomap-rec is used to define a Photomap resource. It contains: +* the resource-id of the photomap +* the number of references to the photomap (including 1 for core X) +* the number of chrominance bands in the image (1 or 3) +* per-band format-recs (i.e. queriable attributes: width, height, and levels) +* a pointer to the decode parameters +* a pointer to the image array for each band +7.2.4. ROI +A roi-rec is used to define a ROI resource. It contains: +* the resource-id of the roi +* the number of references to the roi (including 1 for core X) +* the length of the run-length encoded list of rectangles +* a pointer to the run-length list +7.2.5. Photospace +A photospace-rec is used to define a Photospace resource. It contains: +* the resource-id of the photospace +* the number of active photoflos in the photospace +* a queue head that points to the first and last photoflos in the photospace + +7.2.6. Photoflo +A flo-def is used to define a photoflo resource. It contains: +* the Executable identity of the photoflo (i.e. the name-space/flo-id pair) +* Booleans: Active, Modified, ... +* the number of elements received from the client +* an array of pointers to client elements in phototag order +* a circular doubly linked list head that points to the definition DAG +* a circular doubly linked list head that points to the optimized DAG +* a flo-error-rec for passing error information back to dixie +* a flo-event-rec for sending event information back through dixie +* a pointer to ddxie-private data (the SI will hang a flo-tex structure here) +* a set of ddxie photoflo manager public entry points: +* link create a runnable photoflo, its elements, and data that persists between + executions +* startup allocate/initialize data that are valid for a single execution instance and + commence execution +* resume continue execution after the flo has yielded + (not used in the SI) +* input push data from the client into a specified ImportClient element and resume + execution +* output pull data for the client from a specified ExportClient element and resume + execution +* query query a specified ImportClient element to see if it needs more data, or query + a specified ExportClient element to see if it has data available +* abort stop execution and free single instance stuff +* destroy free persistent stuff and destroy the runnable DAG +* a set of ddxie photoflo manager private entry points: +* scheduler schedule elements to run until data exhausted or yielding is required +* data manager strip management + + +7.3. Photo Element Definition +A pe-def is used to define each client element supplied at photoflo creation. Each pe-def contains pointers +for linking elements together according to their phototag inter-connections. A fully linked set of pe-defs +constitutes a definition DAG that is suitable for presentation to ddxie for analysis. Each structure +contains: +* the element phototag number received from the client +* the element type received from the client (within the optimized DAG this may identify additional converter +or optimized element types that are defined for the server implementation) +* Booleans: loop-detect, orphan, modify, import, process, export +* a pair of pointers linking this element to the next and previous element in DAG order +* a pointer linking this element to another element of the same class (used to locate all the Import or Export +elements; not used for Process elements) +* a pointer to link a client element to a replacement element in the optimized DAG +* a pointer to element specific parameters (e.g., parameters supplied by the client) +* a pointer to ddxie-private data (placed here by the ddxie link routine, removed by the ddxie destroy routine +-- the SI will hang a pe-tex structure here) +* element entry points +* create +* initialize +* activate +* flush +* reset +* destroy +* fan out information: +* the number of bands this element will produce +* a format-rec describing each output band +(dixie fills in attributes, ddxie fills in alignment ...) +* the number of receptors connected to this element's output +* linkage to receptors of this element's output +* the number of phototag inputs this element is using +(i.e., the number of inputs from other elements, including process domain and lut inputs) +* an array of input connection information; each input connection includes: +* the phototag of the source element +* a pointer to the source element +* the number of bands this input will receive +* a format-rec describing each band +(dixie fills in attributes, ddxie fills in alignment, ...) + +7.4. DDXIE Structures +7.4.1. Photoflo run-time context +A flo-tex stores ddxie-specific information for the execution of a photoflo. It contains: +* a pointer back to the flo-def +* information for the scheduler (e.g. the ready-list) +* information for the data manager (e.g. a look-aside list of strips that can be re-used) +* a pointer reserved for yielding information + +7.4.2. Photo Element run-time context +An pe-tex stores ddxie-specific information for an element. It contains: +* a pointer back to the pe-def +* a pointer back to the flo-tex +* output strip size +* a pointer to an array of receptor-recs * +* a pointer to additional storage for element-private information * +* the structures pointed at by these pointers are contiguous with (appended to) the pe-tex. + +7.4.3. Receptor +A receptor-rec provides an execution context for data that are to be brought into an element. It contains: +* a pointer to the pe-def that is supplying the data +* the minimum number of data units needed for activation (per band) +* the total number of data units currently available (per-band) +* a circular doubly linked list head that points to the strips that are available (per band) + +7.4.4. Strip +A strip describes a segment of data that is produced by an element and is then given to the data manager +for distribution to one or more receptors. A strip describes an array containing one or more complete data +units (for canonic data a unit is a scanline). It contains: +* forward and backward pointers to the next and previous strips +* a pointer to the format-rec that describes the data format +* a reference count +* the number of data units in the strip (e.g. number of scanlines for canonic data) +* the first scanline number (if canonic) +* the total size of the data array (in bits) +* the offset within the data array to the first data (in bits) +* the base address of the data array + + + +8. Protocol requests +Each of the XIE protocol requests is listed below. For the sake of brevity, information that can be found in the +protocol document (V4.12) is not duplicated here. Instead there is: +* a short description of each request +* an overview of the actions taken for a successful request +If a request cannot be honored due to an error, an error packet will be returned to the client, as prescribed in the +protocol document. +Each protocol request will have a dedicated Proc and SProc routine which is called from the XIE dispatcher +(which is called by the X dispatcher). Swap routines will also be provided for replies, errors, and events. + +8.1. Global Query requests +8.1.1. QueryImageExtension +Each client is required to invoke QueryImageExtension prior to issuing any other XIE protocol requests in +order to establish protocol version compatibility between client and server. +The xie-client-table is checked for an existing xie-client-rec for the current client. If the client is not +found (as is the case when QueryImageExtension is used for XIE connection setup) a new xie-client-rec +structure is added to the table. +Applying the compatibility rules spelled out in the protocol document, the XIE version is chosen and +saved in the xie-client-rec. The set of Proc and SProc routines that match this version are also saved in +the xie-client-rec. +QueryImageExtension generates a protocol reply which returns the chosen XIE version information, the +ServiceClass, and the Alignment capabilities of this server. + +8.1.2. QueryTechniques +QueryTechniques provides information about a selected group of techniques that are supported by the +server. This is the only method by which a client can discover implementation specific technique +information such as: +* what are the default techniques? +* which techniques require parameters? +* what is the relative execution speed? +* what private techniques have been added? +A reply is returned to the client containing a TechniqueRec for each technique in the specified group. + +8.2. Resource requests +8.2.1. Overview +The ColorList, LUT, Photomap, and ROI resources provide server-side storage of XIE data types. Each of +these resource types is registered with core X at extension initialization time (CreateNewResourceType) +along with a resource specific deleteFunc (e.g. DeletePhotomap). This function enables core X to destroy +these resources if the client connection is closed. +Chapter 4 of the protocol document explains resource creation, destruction, and flo bindings using a +bucket and handle analogy. The following sections explain how these requirements will be satisfy. + +8.2.1.1. Creating Resources +Each of these resources is created via an explicit XIE protocol request. Upon creation each +resource has a reference count of one, but has no resource specific data or attributes. If the +resource is created successfully, AddResource() is called to register it with core X. +These resources are populated with data and attributes as the result of executing a flo. With the +exception of the ColorList resource, these resources can be used to provide input for a flo. + +8.2.1.2. Flo'ing Resources +When a flo becomes active, the reference count of each XIE resource referenced by the flo is +incremented once for each reference to the resource. +For LUT, ROI, and Photomap resources, it is permissible for multiple elements in an active flo +(or different active flos) to access the same resource simultaneously (e.g. the explanation of +pseudo in-place operations). Multiple simultaneous writes to the same ColorList are illegal. +Therefore a ColorList's reference count can never exceed two. +If multiple elements within a flo export to the same resource, upon successful flo completion the +resource's handle will be connected to one of the new buckets (the protocol does not specify +which bucket will win). If multiple flos are exporting to the same resource, each flo will leave a +new bucket attached to the resource upon successful completion. Synchronizing the execution of +multiple flos is an exercise left to the client. +When the flo leaves the active state (because of done, error, or abort), the deleteFunc of each +referenced XIE resource is called to decrement the reference count (once for each reference). If a +resource has zero references, its structure (and everything associated with it) is freed. + +8.2.1.3. Destroying Resources +Each of these resources can be destroyed via an explicit XIE protocol request which indirectly +calls the resource's deleteFunc via the core X FreeResource() routine. Calling the deleteFunc in +this way disassociates the resource-id from core X. The deleteFunc is specified at extension +initialization time via CreateNewResourceType(). +Other responsibilities of the deleteFunc are to zero the resource-id in the resource structure and +decrement the reference count. If the count goes to zero, the resource structure and everything +associated with it are freed, otherwise this action is delayed until there are no outstanding +references. + +8.2.2. ColorList +8.2.2.1. Create +Create an empty color-list-rec and call AddResource(). A ColorList is a resource used by the +ConvertToIndex element to record colormap cells that it allocates. These cells can be freed by +explicit ColorList requests or via other mechanisms that are specified in the protocol document. + +8.2.2.2. Query +Reply with the list of colormap cells currently referenced by the ColorList. If there are none or +the colormap has been freed, the colormap and count fields of the reply will both contain zero. If +the query is made while a flo is actively allocating cells, the query will return a snapshot of the +ColorList at the time of the query. + +8.2.2.3. Purge +If the reference count is one, all cells that are currently allocated are freed, thus restoring the +color-list-rec to its create-time state. + +8.2.2.4. Destroy +Call FreeResource() to disassociate the ColorList resource-id from core X. The registered +deleteFunc may purge cells held by the ColorList and free the color-list-rec (see Destroying +Resources above). + + +8.2.3. LUT +8.2.3.1. Create +Create an empty lut-rec and call AddResource(). A LUT is a resource that contains lookup-table +array(s) that are used by the Point element. A LUT resource is populated via an ExportLUT +element. Its attributes are inherited indirectly from an ImportClientLUT element (XIE does not +provide any facilities for synthesizing exportable LUT data in the server). + +8.2.3.2. Destroy +Call FreeResource() to disassociate the LUT resource-id from core X. The registered deleteFunc +may free the lookup arrays and the lut-rec (see Destroying Resources above). + + +8.2.4. Photomap +8.2.4.1. Create +Create a photomap-rec and call AddResource(). A photomap is a resource that is used to store a +complete image. Data stored in a photomap may be imported into a flo and used as image data +for display, or exported from the flo, or used as a process domain. +The photomap-rec is populated by an ExportPhotomap element. This export element will receive +the image from a process element, or an import element (i.e. from the client, a photomap, or a +drawable). Image attributes are also inherited from this element. + +8.2.4.2. Query +Generate a reply that reflects the current set of image attributes. If the photomap has not been +populated (i.e. the number of bands is zero), all fields of the reply will contain zeros and +populated will be false. + +8.2.4.3. Destroy +Call FreeResource() to disassociate the photomap resource-id from core X. The registered +deleteFunc may free the image descriptors, image data, decode parameters, and photomap-rec +(see Destroying Resources above). + +8.2.5. ROI +8.2.5.1. Create +Create a roi-rec and call AddResource(). An ROI is a resource which contains a list of rectangles +that are used to define a process domain. An ROI resource is populated via an ExportROI +element. +The list of rectangles received from the client is sorted and converted into run-lengths by the +ImportClientROI element (this is explained in the section on Processing Domains). This data is +stored in the roi-rec by an ExportROI element. ROI data always originates from the client, XIE +does not provide any facility for synthesizing exportable ROI data within the server. +Note: the list of rectangles returned from ExportClientROI will be a list of sorted non-overlapping +rectangles (reconstructed from the run-length list). Although the contents of this list may differ from +the list received from the client, it will be logically equivalent. The protocol does not specify that +the original list must be returned. + +8.2.5.2. Destroy +Call FreeResource() to disassociate the ROI resource-id from core X. The registered deleteFunc +may free the run-length list and the roi-rec (see Destroying Resources above). + +8.3. Photoflo related requests +Photoflos provide the mechanism by which a sequence of import, process, and exports steps are described. Two +photoflo modes are supported: an immediate flo is executed once and then it is destroyed, whereas a stored flo can +be executed repeatedly and offers the option of modifying its parameters between executions. + +8.3.1. ServerIDspace +Since stored flos can be re-executed, they generally enjoy a normal life expectancy. Therefore they are +identified using the same name-space as other resources created by the client. Their resource-ids can be +re-used however, by redefining the complete contents of the flo. + +8.3.2. Photospace +Immediate flos may be generated in rapid succession (and are short lived relative to normal resources). +Therefore, a separate 32-bit wide identifier name space is provided for their execution. + +8.3.2.1. Create +Create a photospace-rec and call AddResource(). Since only a small number of immediate flos +are likely to be active in a photospace at any given time, the SI will maintain the active set of flos +as a doubly linked list. + +8.3.2.2. Destroy +Call FreeResource() to disassociate the photospace resource-id from core X. The registered +deleteFunc will abort and destroy all immediate flos known to the photospace and then free the +photospace-rec. + + +8.3.3. Immediate-mode specific +An immediate flo begins execution as soon as the protocol request containing the sequence of steps to be +performed is received. Upon completion the flo is automatically destroyed. + +8.3.3.1. ExecuteImmediate +Create a flo-def and copy the supplied list of elements to the flo-def while verifying that the list is +a DAG. Next, the flo-def is added to the specified photospace and execution commences. Upon +completion the flo is destroyed and the flo-def is removed from the photospace. Flo creation, +execution, and destruction is covered in detail in the chapters on photoflo management. + + +8.3.4. Stored-mode specific +8.3.4.1. Create +Create a flo-def, copy the supplied list of elements into pe-defs (while verifying that the list is a +DAG), and then call AddResource(). This process is covered in detail in the chapter on DIXIE +Photoflo Management. + +8.3.4.2. Modify +After verifying that no topological or element type changes are being attempted, the parameters +of the specified set of elements are replaced. These elements are flagged to note that they have +been modified. The chapters on photoflo management address the additional side affects that +may be incurred when a previously executed flo is modified. + +8.3.4.3. Redefine +The SI will simply call FreeResource() to destroy the old flo in its entirety, and then create a new +one using the old resource-id. + +8.3.4.4. Execute +Prior to executing a photoflo several preparatory steps are necessary: +* each element's parameters and data attributes are validated +* the DAG is analyzed to choose the most appropriate manner in which to execute it +* an optimized DAG is generated, if any refinements to the definition DAG can be made +* the required sequence of elements is instantiated +Finally, the flo is set active and execution begins. Flo execution is covered in detail in the +chapters on photoflo management. + +8.3.4.5. Destroy +Call FreeResource() to disassociate the flo's resource-id from core X. The registered deleteFunc +will abort execution (if active), free everything attached to the flo, and then free the flo-def. + + +8.3.5. ClientData transport +8.3.5.1. Put +PutClientData supplies a byte stream of data from the client that is to be delivered to a specific +ImportClient element within a flo. Since the interpretation of the data is specific to the target +element and its parameters (and possibly a technique), any reformatting of the data to convert it +to canonic form (including byte swapping) must be controlled by the receiving element. + +8.3.5.2. Get +GetClientData generates a reply which returns a byte stream of data from a specific ExportClient +element within a flo. The data will be formatted according to the parameters specified to the +supplying element prior to the commencement of flo execution. + +8.3.6. Query/Control +8.3.6.1. Query +Reply with the status of the specified flo (active, inactive, or nonexistent). If it is active, two lists +of elements are provided: one listing elements waiting for data from the protocol stream, and the +other listing elements which have data for the protocol stream. + +8.3.6.2. Await +If the specified flo is not found in the active state, no operation is performed. Otherwise +IgnoreClient() is called to block further requests from the client. Later, when the flo transitions +out of the active state, AttendClient() will be called to allow blocked requests to be processed +again. + +8.3.6.3. Abort +If the specified flo is not found in the active state, no operation is performed. Otherwise +execution of the specified flo is terminated and output pending for the client is destroyed. A +stored flo is returned to the inactive state; an immediate flo is destroyed. + + +9. DIXIE Photoflo Management +9.1. Overview +The protocol representation of a photoflo is a list of elements. There are three element types: import elements +which bring data into the flo, processing elements which operate on the data, and export elements which transfer +data out of the flo to external resources or back to the client. +Connections between elements is accomplished through the use of phototags. An element's relative position on the +protocol list determines the element's phototag number. The source(s) for each element are explicitly specified +using the phototags of upstream elements. The output of an element can fan out to any number of downstream +elements. +Dixie is responsible for creating the photoflo data structures that will contain the client's list of elements. The +same structures are used by stored and immediate flos. At create time, dixie also converts the client list into a fully +connected DAG. Dixie relies on ddxie to analyze the DAG in order to select an appropriate method to execute the +sequence of operations. Ddxie fills in a vector of entry points within the flo-def, so that dixie can control the +overall photoflo execution process. A call through the link entry point generates a re-usable execution context +(called a flo-tex) and an associated set of run-time element handlers. The startup entry point (re)initializes the flo +and starts execution. Input and output entry points are used to move client data in and out of the flo on behalf of +data transport protocol requests. Additional entry points are provided for restarting the flo after it has yielded, for +obtaining status information, for stopping the flo prematurely, and for destroying it. +The following sections will discuss photoflo management from the dixie point of view. The chapter titled DDXIE +Photoflo Management, describes the actions performed within ddxie. + +9.2. Photoflo Creation +9.2.1. Creating the Flo +When the server receives an ExecuteImmediate or CreatePhotoflo protocol request, a flo-def is allocated +and initialized. The list of elements received from the client is parsed in the order received. The following +actions are performed (within dixie) for each element: +* verify that each phototag input is specified within the bounds of the client element list +* create an pe-def large enough to accommodate the number of phototag inputs +* store element information in the pe-def +(e.g. the element's phototag index, class, type, and input phototag connections) +* store the element's parameters (including technique data) in a separately allocated area +(any necessary floating point conversions are performed at this time) + + +The address of each pe-def is stored in phototag order within the flo-def. Upon completion of this initial +creation phase the photoflo looks like: + + +9.2.2. Traversing the DAG +The next phase of photoflo creation converts the list of client elements into a DAG. The element list is +scanned in phototag order. At each export element, the phototag input connections are followed upstream +via a recursive depth first search algorithm until one of the following conditions occurs: +* an import element is found +* an element with fully connected inputs is encountered +(i.e. one that was examined while searching back from a previous export element) +* a topological error condition is detected +Topological errors are discovered during the DAG definition process by setting a flag in the current +element prior to invoking the recursive search routine to examined the element's inputs, and then resetting +the flag when all the input elements have been examined. A loop condition exists if a flagged element is +found during the recursive search. Attempting to use an export element as a data source is also a +topological error. + + +As the search algorithm considers each element, the following actions are performed: +* if the element being examined is not an import element: +* set the loop-detect flag in the current element +* invoke the search algorithm to examine each of the element's inputs + the inputs of multi-input elements are searched in the following order: +1. lut input +2. process domain input +3. source input(s) 1 through n +* clear the loop-detect flag in the current element +* link the current element's output and the downstream element's input to each other +* append the current element to the definition DAG +Continuing with the example given above, the definition DAG structures would be linked like this: + + + +The definition DAG is a circular doubly-linked list of pe-defs that has the following characteristics as seen +from the DAG head: +* the first element in the forward direction is an import element +* the first element in the backward direction is an export element +* for each element that is examined in a forward traversal, all of the elements from which it obtains +input have already been examined + +Depending on which export element was considered first, the DAG order of our simple flo illustrated +above would be either: +1, 2, 3, 4, or 1, 2, 4, 3. +If the export elements in the flo illustrated below were considered in ascending order (i.e. search back +from element 2, then from 5, etc.), the DAG ordering would be: +1, 2, 3, 4, 5, 7, 6, 8, 9, 11, 13. +If, however, the export elements in the flo below were considered in descending order (i.e. search back +from element 13, then from 11, etc.), the DAG ordering would be: +7, 1, 6, 3, 4, 8, 9, 13, 11, 5, 2. +The DAG characteristics described above hold true for any sequence in which the export elements could +be considered. +It is possible that the output from some elements will not terminate at an export element. The protocol +states that these elements should be ignored. Therefore, elements 10 and 12, in the figure below, would +not be included in a definition DAG because they do not terminate at an export element. + + + +9.2.3. Registering the Flo +Provided no errors are encountered while creating and validating the photoflo, the flo-def structure of an +immediate flo is registered with the specified photospace, whereas AddResource() is called to register a +stored flo with core X. + +9.3. Photoflo Execution +9.3.1. Prepping the DAG +Before a flo can be made active, some preparatory steps are necessary. First the DAG is traversed in the +forward direction to execute each element's dixie prep routine which will: +* lookup external resources (colormap, colorlist, drawable, gc, lut, photomap, roi, ...) +(for XIE resources their reference counts are incremented) +* validate the attributes of each source of data for the element +* validate the element's parameter values (including technique data) +* determine what the element's output attributes will be +* determine if the flo has been modified since a previous execution +* the element was affected by a ModifyPhotoflo request +* source attribute changes have caused output attributes to change +If there is an executable photoflo that already exists and it has been modified in such a way that re- +compilation is necessary, the photoflo manager's destroy function is called, in preparation for a new +compilation. + +9.3.2. Analyzing the DAG +When the elements have been prepped by dixie, the DAG is suitable for presentation to the DAG analyzer. +The purpose of the analyzer is to define an appropriate solution to the problem to be solved (e.g. coalesce +multiple elements into a single super-element, insert data type conversion elements, insert data alignment +elements, ...), and to choose a photoflo manager that can execute it. +If a previously executed flo still exists, the analyzer is not called. The current executable will be re-used +because no additional analysis is required. +If an optimized DAG has been generated, the analyzer will attach it to the flo-def. The analyzer +establishes a photoflo manager by placing its link entry point in the flo-def. + +9.3.3. Linking an executable Photoflo +The first time a photoflo is executed, the flo-def link function is called to generate the run-time structures +for the photoflo. It must: +* create a run-time context for the flo manager (attach a flo-tex to the flo-def) +* create a run-time context for each element (attach a pe-tex to each pe-def) +* establish the remaining entry points in the flo-def + +9.3.4. Starting the flo +The flo-def startup function is called to initialize the flo and begin execution. The photoflo manager +startup routine will initialize each of its elements (in DAG order), and call upon the scheduler to run the +flo. The next chapter covering ddxie photoflo management describes the actual execution of the flo. +If there are no ImportClient or ExportClient elements in the flo, it can run to completion. Otherwise, +execution is dependent on data transport protocol requests. + +9.3.5. Resuming the flo +When a PutClientData request is received, the flo-def input function is called with the phototag of the +target element and a pointer to the available data. Calling input gives the new data into the specified +element and causes the scheduler to resume flo execution. +When a GetClientData request is received, the flo-def output function is called to fetch some data from the +specified element. This may cause the scheduler to resume execution (e.g. execution may have been +suspended due to the output buffer being full). +A resume entry point is provided in the flo-def for implementations that support yielding. There will be +no resume routine supplied with the SI. + +9.3.6. Stopping the flo +Dixie does not get involved in determining when a flo reaches completion. Rather ddxie is responsible for +determining if all data has been processed and if any data transport requests are required for completion. +If an error is encountered within the ddxie flo manager, the error detail is recorded in the error-rec, which +is embedded in the flo-def, and control is returned to dixie. When an error is discovered by dixie, the flo- +def abort function is called to stop the flo. Finally, the error is sent to the client via core X mechanisms. +If an Abort request is received from the client, the flo-def abort function is called to stop the flo. + +9.3.7. Destroying an executable Photoflo +Dixie destroys a flo-tex by calling the flo-def destroy function which allows ddxie to free its resources and +remove the ddxie-private flo-tex pointer from the flo-def. + +9.3.8. Event notification from a flo +Several elements can generate events, as can flo completion. The flo-def includes an event-rec where +details about the event can be recorded. Ddxie calls the dixie SendEvent() routine to request that the +client be notified. + + +10. DDXIE Photoflo Management +Ddxie contains a DAG analyzer that defines an appropriate solution for the image equation expressed by the DAG, +a linker that creates an executable sequence of element handlers to solve the problem, and a flo manager to produce +the result. The element handlers, which also reside in ddxie, are discussed in the next chapter. + +10.1. DAG Analysis +The purpose of the DAG analyzer is to define an appropriate solution to the image equation expressed by the DAG +(e.g. choosing an element handler for a specific technique, coalescing multiple elements into a single "super- +element", or inserting data type conversion elements), and to choose a photoflo manager that can execute it. + +10.1.1. Choosing Element Handlers +The first step is to select an appropriate element handler for each element. To better understand how this +is performed, an example is shown below. Assume that each photoelement type defined in the XIE +protocol is assigned a different shading pattern. Then the flo + + + +could be represented as: + + + +For each element type (shading pattern), the mi layer of the SI will provide a set of handlers which can +implement the computation specified by that element. A single handler may suffice for elements which do +not take techniques, whereas an element like ImportClientData, which can take a number of different +techniques, might be implemented as several handlers. Besides having handlers to account for technique +variations, it may also be convenient to separate handlers on the basis of import type restrictions, ma- +chine dependence, and degree of optimization. +Given the framework established above, code generation for a photoflo may be viewed as a labeling prob- +lem, in which it is necessary that the DAG analyzer find a valid label for each element in the flo. The +analyzer is only allowed to label an element with a handler of like shading pattern. +All handlers will output a type which is the smallest acceptable canonical type for the input data and the +particular operation. Import elements will thus be able to write down their output image data types im- +mediately. +Let k be the distance from an element to an Import element. Given a flo which has been labeled and had +types resolved up to a distance of k-1, the DAG analyzer will label and resolve all elements of distance k +by the following method: + +For each element Eki of distance k: + For each element Eki,j which feeds that element: +Propagate the known output type of Eki,j to the corresponding input receptor on Eki +(these will be treated as "suggested input types" by the handlers). + Call HandlerTest, giving it the flo-def and pe-def. A handler will be selected which resolves all +input types. If any input types match, the selected handler will insert a labeled ConvertType +pseudo-element into the flo. + Label Eki with the selected handler. + + + +The HandlerTest procedure simply goes through the list of handlers which have the same shading pattern +as the element in question, and calls the handler's test entry point. The test routine checks to see if this +handler can accommodate the parameters of the element (obtained from the pe-def) in combination with +the input data types. If the handler rejects the element, the HandlerTest procedure checks the next +handler of the same shading pattern in the list. The SI element handler sets will be written so as to ensure +that regardless of what the input data type is, at least one handler per shading pattern will accept any +valid element. +Handlers have the option of accepting seemingly non-canonical data types by inserting a ConvertType +pseudo-element in the path between the input element and the receiving element. This ConvertType +element must be able to convert any non-canonical data type to a canonical type. The handler doing the +insertion specifies the type to which it wants the data to be converted. This mechanism allows the mi +handlers to continue working even if a server implementor chooses to invent new canonical types. Thus, +the criterion that there must be at least one valid handler for any element will remain fulfilled even if new +types are introduced. + +10.1.2. Choosing a Linker and Photoflo Manager +The analyzer must establish a linker and photoflo manager by placing their entry points in the flo-def. The +mi linker and photoflo manager can handle all element handlers (whether mi or md) that abide by their +interface conventions. +If an md analyzer is substituted for the mi analyzer, it may elect to use a foreign linker, photoflo manager, +and element set (e.g. the pipe manager and sample elements contributed by HP). In this case, the foreign +linker would need to translate the contents of the pe-def structures into its own set of elements. + + +10.2. Photoflo Linker +The linker is invoked by dixie calling through the flo-def link entry point (it is not called when an unmodified +photoflo is re-executed). The linker creates a run-time context (a flo-tex) for use by the flo manager's components. +It is also responsible for the creation and static initialization of the element handlers selected by the DAG analyzer. +This is accomplished by calling the create entry point (stored in each pe-def) of each element selected. + + +10.3. Photoflo manager +The photoflo manager is a collection of component parts that are called upon from dixie to perform specific tasks +during the startup, execution, and eventual tear down of a photoflo. + +10.3.1. Startup +When dixie calls through the flo-def startup entry point, the flo manager calls upon its sub-components to +(re)initialize their run-time context. The flo manager also calls through the initialize entry point of each +element to allow the elements to (re)initialize their run-time context. Finally, it transfers control to the +scheduler to run the flo. + +10.3.2. Scheduling +The scheduler is responsible for running available data strips through elements. The scheduler is initially +called as the final step of photoflo startup. Later, as data arrives from the client, or data is requested by the +client, the scheduler is started to satisfy the request. +Scheduling of individual elements for execution is handled through a ready-list. The first time a photoflo +is executed, only ImportResource elements have data. The ready-list is initialized with these elements. +Starting from the front of the ready-list, each of the elements on the ready-list are executed in order. An +element will produce a maximum of one strip of data each time it executes* . This strip is passed to the +data manager and then on to appropriate downstream receptors. Elements receiving data from this ele- +ment are examined to see if they have sufficient data to execute. If they do, they are pushed onto the front +of the ready-list. If the current element was an import element it is removed from the ready-list, otherwise +it is allowed to remain on the ready-list (assuming it has more data to process) so that it may resume exe- +cution after the downstream elements have consumed its output. +One key concept to this algorithm is the removal of elements from the ready-list. Once an import element +executes and produces up to one strip of data, it is removed from the ready-list, even if more data is avail- +able. Other element types are not removed from the ready-list until they can proceed no farther. This +method of removing elements from the ready-list, combined with prepending downstream elements to the +head of the list, has the effect of pushing strips of data through the flo before new strips are brought in +from import elements. +When all data has been processed, the import elements are re-examined. If there are any ImportClient +elements, control is returned to Core X. This is done to prevent large amounts of server data (possibly +whole images) from being buffered in the flo while the client is stalled. If only ImportResource elements +are found, they are put back on the ready-list and execution continues, as described above, until the flo has +completed. +Each subsequent execution of the flo will be in response to the client. The element indicated in the proto- +col request, and all ImportResource elements, are placed on the ready-list. As before, each time an import +element is executed, it is removed from the list and all downstream elements connected to its output with +sufficient data to execute are pushed onto the front of the ready-list. If an import element was the target of +a PutClientData request, it is re-examined to see if it has more data available. If so, the ready-list is re- +initialized and execution continues (as above). If no more client data is available, control is returned to +Core X. +As an example of how the scheduler would process a flo, the sample flo from Figure 5-2 of the protocol +document (V4.12) is shown below. + + +This flo has two import elements, 1 and 7. Element 1, is an ImportClientPhoto element. Element 7, +importing a Photomap, is an ImportResource element. When the flo is first executed, only element 7 will +have data. Element 7 will import one strip of the photomap and cause element 8 to be placed on the ready +list. Since element 7 is an import element, it is removed from the list. +Element 8 can now process the data and pass it on to element 9s receptor. Element 9 is a ConvertToIndex +element that is using a technique which requires the entire image before it can continue. Since element 9 +does not have sufficient data to execute, it is not added to the ready-list. +Assuming that element 8 has processed all of its data, it is removed from the list. With an empty list, the +scheduler examines the two import elements. Noting that at least one ImportClient element is present, +control is returned to Core X. +After the initial execution cycle, the flo will only be executed when data is received from the client for an +ImportClient element. When such data arrives, the target ImportClient element (element 1) and all +ImportResource elements (element 7) will be placed on the ready-list. +After element 1 has generated a maximum of one strip of data, the following elements would be on the +ready list (elements 2, 3, and 6 all have sufficient data to execute with element 1s output): +2 3 6 7 +Element 2 would be executed next. Since it is an export element, it will exhaust all data passed to it and +be removed from the list. Element 3 will be processed next. Following its execution, element 4 will be +added to the front of the list and executed, causing elements 5 and 8 to be added to the list. Assuming that +elements 3 and 4 both have no further data to process, the resulting ready-list is: +5 8 6 7 +Element 5 is an export element and passes all data it receives. It is then removed from the list. Element 8 +processes data available to it from elements 4 and 7. Since element 9 is still unable to execute, it is not +added to the list. This leaves the following ready-list: +6 7 +With the execution of element 6, element 8 is again added to the ready list. After element 6s data passes +to element 9s receptor the list is left with only element 7. Element 7 is executed to load another strip of +data from the server photomap. At this point, control is returned to Core X. The photoflo waits until it is +reactivated by more data being received from the client for element 1. +This process repeats until all data has been received from the client. Element 9 can then execute, which in +turn allows export elements 10 and 11 to execute. Element 9 stays on the list until it exhausts its data. At +this point, the photoflo operation is complete. + +10.3.3. Data Manager +It is the responsibility of the data manager to coordinate the flo of data between element outputs and +inputs. Since data is processed in strips, it will often be the case that data required by a downstream +element will span two or more buffers generated upstream. To eliminate the complexity and overhead of +concatenating data segments, data accesses within elements can be conducted on a line by line basis, while +data transfers between elements are conducted on a strip basis. +When an element is producing a strip of data, the buffer it is writing its data into is private to the element. +Only when the strip is passed back to the data manager is it made visible to downstream elements for +processing. When the completed strip of data is passed to the data manager, it is linked to a list of strips +maintained by each downstream receptor. As an element requires data, it reads in the data by +transferring strips from its receptor into its private data section. The element may then access individual +lines of data within the strip through a set of light-weight macros. These macros are provided as a tool to +simplify the access of scan lines within strips but do not preclude elements from operating on data in strip +form. When the element is done with the strip, it informs the data manager. +The strip itself contains a count of the number of references to the strip. When a strip is assigned as an +element output buffer, this count is 1. When the completed strip is returned to the data manager the +reference count is set to the number of receptors that the strip is transferred to. When an element asks the +data manager for an available strip, the reference count is unaffected until the element notifies the data +manager that it is done with the strip. +When an element finishes reading from a strip (or it has an output strip that it does not wish to +propagate), it informs the data manager and the reference count is decremented. If the reference count is +decremented to 0, the strip is either freed or cached for re-use. +The data manager also provides a mechanism whereby in-place operations may be performed within the +strip. When this is allowed, only a single element has access to the strip. Since it is using it for both read +and write, the reference count is 2. When it completes the strip it must give it to the data manager for +transfer downstream and notify the data manager that it is done reading it. +Elements access the data manager through five entry points: +* MakeStrip : used by an element to obtain storage for data it intends to produce. +* PutStrip: used by an element to give a completed strip of data back to the data manager (which then passes +it on to downstream receptors) +* GetStrip: used by an element to read in a strip of data from its receptor +* InPlaceStrip: used to obtain in place privileges for a strip that it has obtained via GetStrip. If the data +manager determines that another element also has access to the strip, a new strip is created instead. +* FreeStrip: used by a receptor to inform the data manager that it has no further need for the strip it obtained +through GetStrip. Also used by an element to return an unfilled data strip buffer to the data manager if for +any reason it decides to not fill it after allocating it through MakeStrip or InPlaceStrip. +To illustrate how data is passed from element to element, a runtime snapshot of an executing flo is shown +on the following page. +In the illustration, element w is performing its processing in place with strip A being used both as an +input and an output. Strips B and C are linked to element ws receptor indicating that they have not been +read in yet. Since strip B is at the head of the list, it will be processed next. Any new strips assigned to +element ws receptor would be linked after element C. +Strips D and E have been passed from element w to elements x and y. Element y has already processed the +data from strip D and has indicated to the data manager that it has finished with the strip. Element y is +currently processing Strip E and placing its output in strip F. Element x is currently processing strip D +and has not yet read in strip E. Since element x hasnt read in strip E, it is still pointed to by element xs +receptor. Element x is placing its result into strip G. Element z has two inputs. Strips H and I are being +processed to form a result in strip J. + + + +10.3.4. Input +Dixie calls through the flo-def input entry point when data arrives from the client via a PutClientData +protocol request. Input calls upon the data manager to create a non-canonic strip that describes the byte +stream segment, and then attaches it to the receptor of the import element handler that corresponds with +the phototag specified to PutClientData. Input then passes control to the scheduler. + +10.3.5. Output +Dixie calls through the flo-def output entry point when data is to be retrieved for the client. Output calls +upon the data manager to fetch some non-canonic data from the export element that corresponds to the +phototag specified in the GetClientData protocol request. If the client has asked for less data than is +available from the export element, it will leave the leftovers with the export element. Otherwise, it will +take all data that is available. Output returns the data and current output buffer status to dixie, which will +send this information on to the client in the form of a reply. + +10.3.6. Query +Dixie calls through the flo-def query entry point to find out if an import or export element handler is done. +Dixie will interrogate each import and export element separately. + +10.3.7. Abort +The photoflo will either complete normally, or dixie will call through the flo-def abort entry point to +terminate execution prematurely. In either case the reset routine in each element is called. It will also +call upon the data manager to release any strips it may have cached. + +10.3.8. Destroy +When dixie calls through the flo-def destroy entry point, the flo manager calls the destroy routine in each +element and then frees the flo-tex. + + +11. Photo Elements +An element is the basic execution unit of a photoflo. An element consists of a body of code with supporting +structures. + +11.1. Element Structures +Element structures are separated into a dixie part, a ddxie part, and an element-specific part. The dixie photoflo +management routines only understand the dixie part. The ddxie photoflo manager understands the dixie and ddxie +public parts. Only the element itself understands the contents of the ddxie private part. These structures are +illustrated below in conjunction with strips (which are handled by ddxie data manager routines and macros). + + +11.2. Element Interfaces +The external interface to each element consists of a set of entry points that are loaded into the pe-def by the DAG +analyzer and the photoflo linker. These entry points are used by various components of the photoflo manager for +setup, execution, and shutdown of the element. + +11.2.1. Create +The create entry point is called by the photoflo linker. It is responsible for attaching a pe-tex to the pe- +def. It also loads the entry points into the pe-def. It will also allocate or setup anything that can persist +over multiple executions. + +11.2.2. Initialize +The initialize entry point is called at photoflo startup. It allocates and initializes run-time data for the +current execution instance. + +11.2.3. Activate +Activate is called by the scheduler when there is sufficient data available at one or more receptors. It calls +upon the data manager to get data from its own receptors and to push data out to the receptors of +downstream elements. + +11.2.4. Flush +Flush is called when all of the upstream elements have completed their task. This gives the element one +last opportunity to finish up. + +11.2.5. Reset +Reset is called at photoflo done time (i.e. flo completed successfully, or aborted due to an error or client +request). Reset frees run-time data and structures that are left behind by the initialize, activate, or flush +routines. + +11.2.6. Destroy +Destroy is called to free data and structures that are allocated by the create routine, including the run-time +context itself (i.e. remove the pe-tex from the pe-def). + + +* There are three exceptions: +* The entire buffer of data received from the protocol stream for an ImportClient element will be presented as a strip of non- +canonic data. The element is then responsible for converting this byte stream of data into canonic form, and processing or +buffering the data prior to allowing control to be returned to core X. +* Export elements pass data out of the flo allowing them to process all data available when executed. +* LUT arrays are indivisible units. Therefore, a strip containing a lookup table will contain the entire array for a single band. + + + + +Submitted to: MIT X Consortium +Submitted by: AGE Logic, Inc. + + +Page 48 + + diff --git a/xie/docs/dec/xielib.TXT b/xie/docs/dec/xielib.TXT new file mode 100644 index 0000000..7823a09 --- /dev/null +++ b/xie/docs/dec/xielib.TXT @@ -0,0 +1,7430 @@ +XIElib +Specification + + +Gary Rogers +AGE Logic, Inc. + +This document contains reference pages for each XIElib function. +Revision History + +Gary Rogers, AGE Logic, Inc., Public Review Draft, April, 1994 + +Syd Logan, NetManage, Inc., Minor technical edits, correction of errors, October, 1996 + + + +Copyright © 1994 AGE Logic, Inc. + + +Permission to use, copy, modify, distribute, and sell this documentation for any purpose is hereby granted +without fee, provided that the above copyright notices and this permission notice appear in all copies. +AGE Logic makes no representations about the suitability for any purpose of the information in this +document. This documentation is only a draft standard of the X consortium and is therefore subject to +change. + + + +Acknowledgments + +XIElib was provided by the X Consortium, with cooperation from AGE Logic, Inc. of San Diego, CA. +It is a C subroutine library that provides a low level C binding of all features that are defined by +Version 5.0 of the XIE Protocol. + +Various parts of the text were borrowed from the Version 5.0 XIE Protocol Reference Manual, edited +by Bob Shelley of AGE Logic, Inc.. Bob provided suggestions and comments that were invaluable in +preparing this document. Dean Verheiden and Syd Logan, both of AGE Logic, Inc., graciously +volunteered to review the original manuscript. + +The author would like to thank Ralph Mor of the X Consortium for his careful review of this +document. Ralph designed the XIElib and wrote its sample implementation, and his technical advice +was indispensable. Adrian Nye, Editor for O'Reilly & Associates, Inc., provided substantive assistance +in the preparation of this document, for which the author is very thankful. + + + +Table of Contents +Introduction 1 +Startup Functions +XieInitialize 3 +XieQueryTechniques 5 +XieCreateColorList 8 +XieDestroyColorList 9 +XiePurgeColorList 10 +XieQueryColorList 11 +LUT Functions +XieCreateLUT 12 +XieDestroyLUT 13 +Photomap Functions +XieCreatePhotomap 14 +XieDestroyPhotomap 15 +XieQueryPhotomap 16 +ROI Functions +XieCreateROI 18 +XieDestroyROI 19 +Photoflo Functions +XieCreatePhotospace 20 +XieDestroyPhotospace 21 +XieExecuteImmediate 22 +XieAllocatePhotofloGraph 24 +XieCreatePhotoflo 25 +XieDestroyPhotoflo 27 +XieExecutePhotoflo 28 +XieModifyPhotoflo 29 +XieRedefinePhotoflo 31 +XieQueryPhotoflo 32 +Client Data Functions +XiePutClientData 34 +XieGetClientData 36 +Abort and Await Functions +XieAbort 38 +XieAwait 39 +Photoflo Element Functions +XieFloImportClientLUT 40 +XieFloImportClientPhoto 43 +XieFloImportClientROI 46 +XieFloImportDrawable 47 +XieFloImportDrawablePlane 49 +XieFloImportLUT 51 +XieFloImportPhotomap 52 +XieFloImportROI 54 +XieFloArithmetic 55 +XieFloBandCombine 58 +XieFloBandExtract 60 +XieFloBandSelect 62 +XieFloBlend 63 +XieFloCompare 66 +XieFloConstrain 69 +XieFloConvertFromIndex 71 +XieFloConvertFromRGB 73 +XieFloConvertToIndex 75 +XieFloConvertToRGB 78 +XieFloConvolve 80 +XieFloDither 83 +XieFloGeometry 85 +XieFloLogical 88 +XieFloMatchHistogram 91 +XieFloMath 93 +XieFloPasteUp 95 +XieFloPoint 97 +XieFloUnconstrain 99 +XieFloExportClientHistogram 100 +XieFloExportClientLUT 102 +XieFloExportClientPhoto 104 +XieFloExportClientROI 106 +XieFloExportDrawable 108 +XieFloExportDrawablePlane 110 +XieFloExportLUT 112 +XieFloExportPhotomap 114 +XieFloExportROI 116 +Technique Functions +XieTecColorAllocAll 117 +XieTecColorAllocMatch 118 +XieTecColorAllocRequantize 120 +XieTecRGBToCIELab 121 +XieTecRGBToCIEXYZ 123 +XieTecRGBToYCbCr 125 +XieTecRGBToYCC 127 +XieTecCIELabToRGB 129 +XieTecCIEXYZToRGB 132 +XieTecYCbCrToRGB 134 +XieTecYCCToRGB 136 +XieTecClipScale 138 +XieTecConvolveConstant 140 +XieTecDecodeUncompressedSingle 141 +XieTecDecodeUncompressedTriple 143 +XieTecDecodeG31D 146 +XieTecDecodeG32D 148 +XieTecDecodeG42D 150 +XieTecDecodeTIFF2 152 +XieTecDecodeTIFFPackBits 154 +XieTecDecodeJPEGBaseline 156 +XieTecDecodeJPEGLossless 158 +XieTecDitherOrdered 160 +XieTecEncodeUncompressedSingle 161 +XieTecEncodeUncompressedTriple 163 +XieTecEncodeG31D 166 +XieTecEncodeG32D 168 +XieTecEncodeG42D 170 +XieTecEncodeServerChoice 172 +XieTecEncodeJPEGBaseline 174 +XieTecEncodeJPEGLossless 177 +XieTecEncodeTIFF2 179 +XieTecEncodeTIFFPackBits 181 +XieTecGeomAntialiasByArea 183 +XieTecGeomAntialiasByLowpass 185 +XieTecGeomGaussian 187 +XieTecGeomNearestNeighbor 189 +XieTecHistogramGaussian 191 +XieTecHistogramHyperbolic 192 +XieTecWhiteAdjustCIELabShift 194 +Free Functions +XieFreeTechniques 195 +XieFreePhotofloGraph 196 +XieFreeEncodeJPEGBaseline 197 +XieFreeEncodeJPEGLossless 198 +XieFreePasteUpTiles 199 +XIElib Events +ColorAlloc Event Events-1 +DecodeNotify Event Events-2 +ExportAvailable Event Events-3 +ImportObscured Event Events-4 +PhotofloDone Event Events-5 +XIElib Errors +Resource Errors Errors-1 +Photoflo Errors Errors-2 + + + + + XIElib - Function Group Introduction +The following pages describe the format of the reference pages for each XIElib function. Every effort +has been made to maintain consistency with the format used in Xlib Reference Manual for Version 11 +(A. Nye, ed., O'Reilly & Associates, Inc., 1992). The reader is also referred to X Image Extension +Protocol Reference Manual, Version 5.0 (R. Shelley, ed., 1994) for a complete definition of the XIE +protocol. +Name +XieFunctionName - brief description of the function +Syntax +The Syntax section presents the calling syntax for the routine, including the declarations of the +arguments and the return type. For example: + +returntype XieFunctionName (arg1, arg2_ret) +type1 arg1; +type2 *arg2_ret; +Arguments +The Arguments section describes each of the arguments used by the function. There are two sorts of +arguments: arguments to specify data to the function and arguments that return data from the +function. An example of each type follows: + +arg1 Specifies information for XieFunctionName. The description for +this type of argument always starts with the word "Specifies." +arg2_ret Returns information from XieFunctionName. The description for +this type of argument always starts with the word "Returns." +Returns +This section is present when XieFunctionName returns a value and describes what is returned. +Description +The Description section describes what the function does, what it returns, and what events or side +effects it causes. It also may contain pertinent definitions, algorithms, and tables. A description of +each XIE event structure is presented in the section XIElib Events. +Output Attributes +This section, which presents a table of element output attributes, is present if +XieFloFunctionName specifies an element that produces output data. + +Class Data class of output data + - single band (achromatic or index) + - triple band (trichromatic) +Type Data type + - constrained (quantization levels is Levels) + - unconstrained (quantization levels is unknown) +Width Width of output (in pixels per band) +Height Height of output (in pixels per band) +Levels Depends on type + - constrained: number of quantization levels + - unconstrained: unknown +Structures +The Structures section contains the C definitions of the XIE-specific data types used by +XieFunctionName as arguments or return values. It also contains definitions of important +constants used by the function. +Errors +The Errors section is present when an action of XieFunctionName could generate an error. A +table of errors that can be generated and their causes is presented. The full list of errors is presented +in the section XIElib Errors. +See Also +This section lists other functions that contain information related to XieFunctionName. + XIElib - Startup Functions XieInitialize +Name +XieInitialize - initialize the XIE extension +Syntax +Status XieInitialize (display, extinfo_ret) +Display *display; +XieExtensionInfo **extinfo_ret; +Arguments +display Specifies a connection to an X server. +extinfo_ret Returns the pointer to an XieExtensionInfo structure, which contains +information about the XIE server's capabilities. +Returns +Zero on failure, nonzero on success. +Description +XieInitialize initializes the interface to the XIE extension and returns information about the +XIE server's capabilities. XieInitialize should be called to establish version compatibility +between client and server prior to making any other XIE request. + +If successful, XieInitialize allocates and fills the XieExtensionInfo structure as follows: + +* The server_major_rev and server_minor_rev members are set to specify the highest +version of the XIE protocol that the server supports. If the server version is higher than the +XIElib version, the server will return the lower version, if it supports it. +* The service_class member is set to the service-class supported by the XIE server. Service- +class defines the recognized image-processing service sets supported by the X Image Extension +standard; the two service classes currently defined are Full, the entire XIE protocol, and DIS, the +Document Image Subset, a proper subset of Full XIE. The service_class member can be set +to one of the standard values: + +xieValFull +xieValDIS + +* The alignment member is set to the pixel and scanline alignment for image data supported by +the server. Values for this member can be either xieValAlignable or xieValArbitrary. +xieValAlignable data units must fit evenly within a byte, or they must fill a byte, or fill a +multiple of bytes; xieValArbitrary data units may fall at any bit address. +* The uncnst_mantissa member is set to the number of bits in the servers floating-point +format (including the sign bit). If the server uses fixed point, uncnst_mantissa is set to zero. +* The uncnst_min_exp member is set to the smallest (most negative) value n such that 2n is +representable in the servers unconstrained data format. +* The uncnst_max_exp member is set to the largest value n such that 2n - 1 is representable in +the servers unconstrained data format. +* The n_cnst_levels member is the number of items in the list cnst_levels. +* The items in the list cnst_levels are set to the levels that are recommended for constrained +data by the server. A value of zero means 232 levels. +* The first_event member is set to the value from which subsequent XIE events values are +based. +* The first_error member is set to the value from which subsequent XIE error values are +based. + +The memory allocated to extinfo_ret is freed when display is closed via XCloseDisplay; +the client should not free this memory. + +If not successful, XieInitialize sets **extinfo_ret to NULL. +Structures +typedef struct { + unsigned server_major_rev; + unsigned server_minor_rev; + XieServiceClass service_class; + XieAlignment alignment; + int uncnst_mantissa; + int uncnst_min_exp; + int uncnst_max_exp; + int n_cnst_levels; + unsigned long *cnst_levels; + int major_opcode; + int first_event; + int first_error; +} XieExtensionInfo; + +/* Definitions of Extension Name and Version Number */ +#define xieMajorVersion 5 +#define xieMinorVersion 0 +#define xieEarliestMinorVersion 0 +#define xieLatestMinorVersion 0 + +/* Definitions of ServiceClass */ +#define xieValFull 1 +#define xieValDIS 2 + +/* Definitions of Alignment */ +#define xieValAlignable 1 +#define xieValArbitrary 2 + XIElib - Startup Functions XieQueryTechniques +Name +XieQueryTechniques - return information about the standard and private techniques that are +supported by the server +Syntax +Status XieQueryTechniques (display, technique_group, ntechniques_ret, +techniques_ret) +Display *display; +XieTechniqueGroup technique_group; +int *ntechniques_ret; +XieTechnique **techniques_ret; +Arguments +display Specifies a connection to an X server. +technique_group Specifies the group of techniques for which the server is to return +information. +ntechniques_ret Returns the number of items in the list of XieTechnique structures. +techniques_ret Returns the pointer to the list of XieTechnique structures, which +contains the information about the selected group of techniques. +Returns +Zero on failure, nonzero on success. +Description +If successful, XieQueryTechniques allocates and fills each XieTechnique structure in the +list as follows: + +* The member needs_param is set to True if the technique requires additional parameters; +needs_param is set to False if the technique takes no parameters, or it has parameters that +are optional. If parameters are optional, they must be totally omitted, or they must all be supplied. +* The member group is set to the group the technique belongs to. +* The member number is set to the numeric identifier assigned to the technique. +* The member speed is set to the server's assessment of the speed of this technique relative to +other techniques in the same group, where 0 is slowest and 255 is fastest. +* The member name is set to the XIE compliant technique name string. + +To free the memory allocated to techniques_ret, use XieFreeTechniques. + +On failure, ntechniques_ret is set to zero and *techniques_ret is set to NULL. + +The standard technique group names that can be queried using XieQueryTechniques are: + +Technique group +Meaning +xieValDefault +Select all default techniques +xieValAll +Select all supported techniques +xieValColorAlloc +Select color allocation techniques +xieValConstrain +Select techniques for constraining data +xieValConvertFromRGB +Select colorspace conversion techniques (for conversion +from the RGB colorspace) +xieValConvertToRGB +Select colorspace conversion techniques (for conversion to +the RGB colorspace) +xieValConvolve +Select techniques for handling convolution edge conditions +xieValDecode +Select image decoding (decompression) techniques +xieValDither +Select dithering techniques +xieValEncode +Select image encoding (compression) techniques +xieValGamut +Select colorspace conversion gamut compression +techniques +xieValGeometry +Select geometric sampling techniques +xieValHistogram +Select match-histogram shapes +xieValWhiteAdjust +Select colorspace conversion white point adjustment +techniques + +If a vendor defined an additional private technique group, it could be discovered by querying for all +groups. +Structures +typedef unsigned XieTechniqueGroup; +typedef struct { + Bool needs_param; + XieTechniqueGroup group; + unsigned int number; + unsigned int speed; + char *name; +} XieTechnique; + +/* Definitions for TechniqueGroups */ +#define xieValDefault 0 +#define xieValAll 1 +#define xieValColorAlloc 2 +#define xieValConstrain 4 +#define xieValConvertFromRGB 6 +#define xieValConvertToRGB 8 +#define xieValConvolve 10 +#define xieValDecode 12 +#define xieValDither 14 +#define xieValEncode 16 +#define xieValGamut 18 +#define xieValGeometry 20 +#define xieValHistogram 22 +#define xieValWhiteAdjust 24 +Errors +BadAlloc Insufficient resources +BadValue Unknown technique_group +See Also +XieFreeTechniques + XIElib - Color List Functions XieCreateColorList +Name +XieCreateColorList - create a color list +Syntax +XieColorList XieCreateColorList (display) +Display *display; +Arguments +display Specifies a connection to an X server. +Returns +The color list identifier. +Description +XieCreateColorList creates a color list resource and returns its color list ID. + +The color list created is an unpopulated server resource that can be used to store the list of colors +allocated by XieFloConvertToIndex. The Colormap allocations that are recorded in a color list +belong to the client that executed the photoflo that populated the resource (this is not necessarily the +same client that created the color list). A color list cannot be the target of more than one active +photoflo at a time. The contents of a color list may be queried using XieQueryColorList. All +allocated cells can be explicitly purged from a color list using XiePurgeColorList. A color list +can be destroyed using XieDestroyColorList. +Structures +typedef XID XieColorList; +Errors +BadAlloc Insufficient resources +BadIdChoice Invalid color list +See Also +XieDestroyColorList, XiePurgeColorList, XieQueryColorList, XieFloConvertToIndex + XIElib - Color List Functions XieDestroyColorList +Name +XieDestroyColorList - destroy a color list +Syntax +void XieDestroyColorList (display, color_list) +Display *display; +XieColorList color_list; +Arguments +display Specifies a connection to an X server. +color_list Specifies the color list to be destroyed. +Description +XieDestroyColorList destroys the color list resource identified by color_list. Once +destroyed, color list ID is no longer valid. +Structures +typedef XID XieColorList; +Errors +xieErrNoColorlist Invalid color_list +See Also +XieCreateColorList + XIElib - Color List Functions XiePurgeColorList +Name +XiePurgeColorList - purge all allocated cells from a color list +Syntax +void XiePurgeColorList (display, color_list) +Display *display; +XieColorList color_list; +Arguments +display Specifies a connection to an X server. +color_list Specifies the color list to be purged. +Description +XiePurgeColorList frees the colors from the specified color list. +Structures +typedef XID XieColorList; +Errors +BadAccess Attempt to purge colors when color list is being written by a photoflo +xieErrNoColorlist Invalid color_list +See Also +XieCreateColorList, XieDestroyColorList, XieQueryColorList, XieFloConvertToIndex + XIElib - Color List Functions XieQueryColorList +Name +XieQueryColorList - obtain a list of allocated Colormap indices +Syntax +Status XieQueryColorList (display, color_list, colormap_ret, +ncolors_ret, colors_ret) +Display *display; +XieColorList color_list; +Colormap *colormap_ret; +unsigned *ncolors_ret; +unsigned long **colors_ret; +Arguments +display Specifies a connection to an X server. +color_list Specifies the color list to query. +colormap_ret Returns the Colormap from which the colors were allocated. +ncolors_ret Returns the number of Colormap indices in the list. +colors_ret Returns the list of allocated Colormap indices. +Returns +Zero on failure, nonzero on success. +Description +XieQueryColorList allocates and returns a list of colors allocated by a ConvertToIndex element. + +When there are no colors in color list, a zero status is returned, the value zero is returned for the +colormap, and the list of colors is of length zero. The pointer to the list of allocated Colormap indices +is set to NULL. + +To free the memory allocated to colors_ret, use XFree. +Structures +typedef XID XieColorList; +Errors +BadAlloc Insufficient resources +xieErrNoColorlist Invalid color list +See Also +XieCreateColorList, XieDestroyColorList, XieQueryColorList, XieFloConvertToIndex + XIElib - LUT Functions XieCreateLUT +Name +XieCreateLUT - create a lookup table +Syntax +XieLut XieCreateLUT (display) +Display *display; +Arguments +display Specifies a connection to an X server. +Returns +The lookup table (LUT) identifier. +Description +XieCreateLUT creates a server resource that is used as a lookup table (LUT) by a Point element. A +lookup table consists of one or three single-dimension arrays, each long enough to contain an entry +for all possible pixels values in the image data to which the Point element will be applied. + +The LUT is populated (or repopulated) with lookup table entries after the successful execution of a +photoflo containing an ExportLUT element that targets lut. LUT data can be imported into a photoflo +using an ImportLUT element. +Structures +typedef XID XieLut; +Errors +BadAlloc Insufficient resources +BadIDChoice Invalid LUT +See Also +XieDestroyLUT, XieFloImportLUT, XieFloExportLUT + XIElib - LUT Functions XieDestroyLUT +Name +XieDestroyLUT - destroy a lookup table +Syntax +void XieDestroyLUT (display, lut) +Display *display; +XieLut lut; +Arguments +display Specifies a connection to an X server. +lut Specifies the ID of the LUT to be destroyed. +Description +XieDestroyLUT destroys the lookup table (LUT) identified by lut. Once destroyed, LUT ID is no +longer valid. +Structures +typedef XID XieLut; +Errors +xieErrNoLut The value for the lut argument does not name a defined LUT +See Also +XieDestroyLUT, XieFloImportLUT, XieFloExportLUT + XIElib - Photomap Functions XieCreatePhotomap +Name +XieCreatePhotomap - create a photomap +Syntax +XiePhotomap XieCreatePhotomap (display) +Display *display; +Arguments +display Specifies a connection to an X server. +Returns +The photomap identifier. +Description +XieCreatePhotomap creates a photomap, a server resource that stores image data. Photomap +data may be rendered for display or used as input to control or modify the rendition of another image. + +Photomap attributes are defined when a photoflo containing an ExportPhotomap element populates +the photomap with data. +Structures +typedef XID XiePhotomap; +Errors +BadAlloc Insufficient resources +BadIdChoice Invalid photomap +See Also +XieDestroyPhotomap, XieQueryPhotomap, XieFloImportPhotomap, XieFloExportPhotomap + XIElib - Photomap Functions XieDestroyPhotomap +Name +XieDestroyPhotomap - destroy a photomap +Syntax +void XieDestroyPhotomap (display, photomap) +Display *display; +XiePhotomap photomap; +Arguments +display Specifies a connection to an X server. +photomap Specifies the ID of the photomap to be destroyed. +Description +XieDestroyPhotomap destroys the photomap identified by photomap. Once destroyed, the +photomap ID is no longer valid. A photomap is the XIE resource used to store image data in the +server. +Structures +typedef XID XiePhotomap; +Errors +xieErrNoPhotomap The value for the photomap argument does not name a defined +photomap +See Also +XieCreatePhotomap , XieQueryPhotomap, XieFloImportPhotomap, XieFloExportPhotomap + XIElib - Photomap Functions XieQueryPhotomap +Name +XieQueryPhotomap - return the queriable attributes of a photomap +Syntax +Status XieQueryPhotomap (display, photomap, populated_ret, +datatype_ret, class_ret, decode_technique_ret, width_ret, +height_ret, levels_ret) +Display *display; +XiePhotomap photomap; +Bool *populated_ret; +XieDataType *datatype_ret; +XieDataClass *class_ret; +XieDecodeTechnique *decode_technique_ret; +XieLTriplet width_ret; +XieLTriplet height_ret; +XieLTriplet levels_ret; +Arguments +display Specifies a connection to an X server. +photomap Specifies the photomap to be queried. +populated_ret Returns the status of the photomap. +datatype_ret Returns the type of data in the photomap. +class_ret Returns the class of data in the photomap. +decode_technique_ret Returns the decode technique required to interpret the data. +width_ret Returns the width, in pixels per band. +height_ret Returns the height, in pixels per band. +levels_ret Returns the number of quantization levels per band. +Returns +Zero on failure, nonzero on success. +Description +A photomap is a server resource that stores image data. XieQueryPhotomap sets +populated_ret to indicate whether or not photomap has been populated with attributes and +data. If populated_ret is False, all remaining fields contain zeros. + +datatype_ret reports whether the photomap contains constrained or unconstrained data, and is +set to one of the following standard data type values: + +xieValConstrained +xieValUnconstrained + +class_ret is the class of image data (that is, single-band or triple-band) and is set to one of the +following standard data class values: + +xieValSingleBand +xieValTripleBand + +width_ret and height_ret are set to the dimensions of the image data in pixels (per band). +levels_ret is set to the potential dynamic range, or number of quantization levels (per band). If +datatype_ret is set to unconstrained, the returned values for levels are zeros. If class_ret is +xieValSingleBand, width_ret, height_ret, and levels_ret are only valid for element +0 in each of these vectors; elements 1 and 2 are unused and are returned as zeros. + +decode_technique_ret is set to the decode technique that will be required to interpret or +decompress the data. Decode techniques define the techniques that can be used to interpret +uncompressed image data or decode compressed images. decode_technique_ret can be set to +one of the following standard decode technique values: + +xieValDecodeUncompressedSingle +xieValDecodeUncompressedTriple +xieValDecodeG31D +xieValDecodeG32D +xieValDecodeG42D +xieValDecodeJPEGBaseline +xieValDecodeJPEGLossless +xieValDecodeTIFF2 +xieValDecodeTIFFPackBits + +If a vendor defined additional private decode techniques, decode_technique_ret can be set to +the values given to these techniques. +Structures +typedef unsigned XieDataClass; +typedef unsigned XieDataType; +typedef unsigned XieDecodeTechnique; +typedef unsigned long XieLTriplet[3]; +typedef XID XiePhotomap; + +/* Definitions of DataType */ +#define xieValConstrained 1 +#define xieValUnconstrained 2 + +/* Definitions of DataClass */ +#define xieValSingleBand 1 +#define xieValTripleBand 2 + +/* Definitions for DecodeTechniques */ +#define xieValDecodeUncompressedSingle 2 +#define xieValDecodeUncompressedTriple 3 +#define xieValDecodeG31D 4 +#define xieValDecodeG32D 6 +#define xieValDecodeG42D 8 +#define xieValDecodeJPEGBaseline 10 +#define xieValDecodeJPEGLossless 12 +#define xieValDecodeTIFF2 14 +#define xieValDecodeTIFFPackBits 16 +Errors +xieErrNoPhotomap The value for the photomap argument does not name a defined +photomap. +xieErrNoFloAlloc Insufficient resources (for exmple, memory) + XIElib - ROI Functions XieCreateROI +Name +XieCreateROI - create a Rectangles-Of-Interest +Syntax +XieRoi XieCreateROI (display) +Display *display; +Arguments +display Specifies a connection to an X server. +Returns +The ROI (Rectangles-Of-Interest) identifier. +Description +XieCreateROI creates a server ROI (Rectangles-Of-Interest) resource, and returns its resource ID +to the client. +Structures +typedef XID XieRoi; +Errors +BadAlloc Insufficient resources +BadIDChoice Invalid ROI +See Also +XieDestroyROI, XieFloImportROI, XieFloExportROI + XIElib - ROI Functions XieDestroyROI +Name +XieDestroyROI - destroy a Rectangles-Of-Interest +Syntax +void XieDestroyROI (display, roi) +Display *display; +XieRoi roi; +Arguments +display Specifies a connection to an X server. +roi Specifies the ID of the ROI to be destroyed. +Description +XieDestroyROI destroys the Rectangles-Of-Interest (ROI) identified by roi. Once destroyed, +roi is no longer valid. +Structures +typedef XID XieRoi; +Errors +xieErrNoROI The value for the roi argument does not name a defined ROI +See Also +XieCreateROI + XIElib - Immediate Photoflo Functions XieCreatePhotospace +Name +XieCreatePhotospace - create a photospace +Syntax +XiePhotospace XieCreatePhotospace (display) +Display *display; +Arguments +display Specifies a connection to an X server. +Returns +The photospace identifier. +Description +XieCreatePhotospace returns a resource-id for a new photospace that can be used to +accommodate immediate photoflos instantiated by a client. Any client that needs to instantiate +immediate photoflos must create at least one photospace. +Structures +typedef XID XiePhotospace; +Errors +BadAlloc Insufficient resources +BadIDChoice Invalid photospace +See Also +XieDestroyPhotospace, XieExecuteImmediate + XIElib - Immediate Photoflo Functions XieDestroyPhotospace +Name +XieDestroyPhotospace - destroy a photospace +Syntax +void XieDestroyPhotospace (display, photospace) +Display *display; +XiePhotospace photospace; +Arguments +display Specifies a connection to an X server. +photospace Specifies the ID of the photospace to be destroyed. +Description +XieDestroyPhotospace destroys a photospace. Prior to destroying the photospace, all photoflos +that are currently active in the photospace will be aborted, exported data pending client retrieval will +be freed, and the photoflos will be destroyed. +Structures +typedef XID XiePhotospace; +Errors +xieErrNoPhotospace The value for the photospace argument does not name a defined +photospace +See Also +XieCreatePhotospace + XIElib - Immediate Photoflo Functions XieExecuteImmediate +Name +XieExecuteImmediate - define and begin execution of an immediate photoflo +Syntax +void XieExecuteImmediate (display, photospace, flo_id, notify, +elem_list, elem_count) +Display *display; +XiePhotospace photospace; +unsigned long flo_id; +Bool notify; +XiePhotoElement *elem_list; +int elem_count; +Arguments +display Specifies a connection to an X server. +photospace Specifies the ID of the photospace to be executed. +flo_id Specifies a particular instance of the photoflo to be executed. +notify Specifies whether a PhotofloDone event must be sent upon +completion. +elem_list Specifies the import, process, and export elements to be executed. +elem_count Specifies the number of items in elem_list. +Description +XieExecuteImmediate begins the asynchronous execution of an immediate photoflo. The server +does not save a copy of an immediate photoflo after the photoflo has completed execution and all data +exported for the client have been retrieved. An immediate photoflo may therefore not be modified or +totally redefined prior to subsequent executions. It is legal to have multiple unique instances of +immediate photoflos (and stored photoflos) active concurrently. + +The photospace/flo_id argument pair specifies the instance by which this photoflo will be +identified in other requests, events, or errors. notify specifies whether a PhotofloDone event +must be sent upon completion. The PhotofloDone event notifies the client that a photoflo has left +the active state: it is no longer executing. elem_list defines the import, process, and export +elements to be executed. + +If any clients have blocked themselves during the execution of the photoflo (see XieAwait), they +will become unblocked when the photoflo's state changes from active to nonexistent. + +Care should be taken that the argument pair elem_list/elem_count matches a returned value +(an array of XiePhotoElement structures) and argument count from a call to +XieAllocatePhotofloGraph. +Structures +typedef XID XiePhotospace; + +typedef struct { + int elemType; + /* union of ALL element types */ + union { + ... + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloElement Invalid element type(s) in elem_list +xieErrNoFloID Invalid photospace/flo_id argument pair has been specified +xieErrNoFlo An error has been detected while defining, executing, or accessing a +photoflo (See Photoflo Errors). +See Also +XieAwait, XieAllocatePhotofloGraph + XIElib - Photoflo Functions XieAllocatePhotofloGraph +Name +XieAllocatePhotofloGraph - allocate an array of XiePhotoElement structures +Syntax +XiePhotoElement *XieAllocatePhotofloGraph (count); +unsigned int count; +Arguments +count Specifies the number of XiePhotoElement structures to allocate. +Returns +The array of XiePhotoElement structures. +Description +XieAllocatePhotofloGraph allocates and returns a pointer to an array of +XiePhotoElement structures; each field of each structure in the array is set to zero (0). + +To free the memory allocated to the list of XiePhotoElement structures, use +XieFreePhotofloGraph . + +If XieAllocatePhotofloGraph is unable to create an XiePhotoElement array , it returns +NULL. +Structures +typedef struct { + int elemType; + /* union of ALL element types */ + union { + ... + ... + } data; +} XiePhotoElement; +See Also +XieFreePhotofloGraph, XieCreatePhotoflo, XieModifyPhotoflo, XieRedefinePhotoflo, +XieExecutePhotoflo, XieExecuteImmediate + XIElib - Stored Photoflo Functions XieCreatePhotoflo +Name +XieCreatePhotoflo - create a stored photoflo +Syntax +XiePhotoflo XieCreatePhotoflo (display, elem_list, elem_count) +Display *display; +XiePhotoElement *elem_list; +int elem_count; +Arguments +display Specifies a connection to an X server. +elem_list Specifies the defining array of XiePhotoElement structures. +elem_count Specifies the number of XiePhotoElement structures in the array. +Returns +The photoflo identifier. +Description +XieCreatePhotoflo creates a stored photoflo resource, defines its complete contents using the +contents of elem_list, sets it in the inactive state, and returns its resource-id. Stored photoflos +persist beyond execution and may be modified or totally redefined prior to subsequent executions. + +The returned photoflo identifier is a new resource-id that, along with the execution domain used for +the photoflo, identifies this photoflo in other requests, events, or errors. elem_list defines the +import, process, and export elements to be stored for execution. Although resources and parameters +are specified at creation, no action is taken to validate them at that time. XieCreatePhotoflo +will only store the photoflo's definition: parameter validation is delayed until an execute request is +received. +Structures +typedef XID XiePhotoflo; + +typedef struct { + int elemType; + /* union of ALL element types */ + union { + ... + ... + } data; +} XiePhotoElement; +Errors +BadAlloc Insufficient resources +BadIdChoice Invalid photoflo +xieErrNoFloAlloc Insufficient resources (for example, memory) for elem_list +xieErrNoFloElement Invalid element type(s) in elem_list +xieErrNoFlo An error has been detected while defining, executing, or accessing a +photoflo (see Photoflo Errors). +See Also +XieAllocatePhotofloGraph, XieFreePhotofloGraph, XieModifyPhotoflo, XieRedefinePhotoflo, +XieExecutePhotoflo, XieQueryPhotoflo, XieDestroyPhotoflo + XIElib - Stored Photoflo Functions XieDestroyPhotoflo +Name +XieDestroyPhotoflo - destroy a stored photoflo +Syntax +void XieDestroyPhotoflo (display, photoflo) +Display *display; +XiePhotoflo photoflo; +Arguments +display Specifies a connection to an X server. +photoflo Specifies the photoflo to be destroyed. +Description +XieDestroyPhotoflo destroys a stored photoflo. If photoflo is active, that is, executing, it is +aborted and all exported data that are pending client retrieval are freed prior to destroying +photoflo. +Structures +typedef XID XiePhotoflo; +Errors +xieErrNoPhotoflo The value for the photoflo argument does not name a defined +photoflo +See Also +XieCreatePhotoflo + XIElib - Stored Photoflo Functions XieExecutePhotoflo +Name +XieExecutePhotoflo - execute a stored photoflo +Syntax +void XieExecutePhotoflo (display, photoflo, notify) +Display *display; +XiePhotoflo photoflo; +Bool notify; +Arguments +display Specifies a connection to an X server. +photoflo Specifies the photoflo to be executed. +notify Specifies that a PhotofloDone event must be sent upon completion. +Description +XieExecutePhotoflo changes a stored photoflo to the active state. Execution is asynchronous. +The photoflo returns to the inactive state when execution completes and all data exported for the +client have been retrieved. It is legal to have multiple stored photoflos (and immediate photoflos) +active concurrently. + +notify specifies that a PhotofloDone event must be sent upon completion. A PhotofloDone +event notifies the client that a photoflo has left the active state (it is no longer executing). + +Stored photoflos persist beyond execution and may be modified or totally redefined prior to +subsequent executions. +Structures +typedef XID XiePhotoflo; +Errors +xieErrNoPhotoflo The value for the photoflo argument does not name a defined +photoflo +xieErrNoFloAccess Attempt to execute photoflo when it is already active +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFlo An error has been detected while defining, executing, or accessing a +photoflo (see Photoflo Errors). +See Also +XieCreatePhotoflo, XieModifyPhotoflo, XieRedefinePhotoflo, XieQueryPhotoflo, +XieDestroyPhotoflo, XieAbort, XieAwait, XieGetClientData, XiePutClientData + XIElib - Stored Photoflo Functions XieModifyPhotoflo +Name +XieModifyPhotoflo - modify a stored photoflo +Syntax +void XieModifyPhotoflo (display, photoflo, start, elem_list, +elem_count) +Display *display; +XiePhotoflo photoflo; +int start; +XiePhotoElement *elem_list; +int elem_count; +Arguments +display Specifies a connection to an X server. +photoflo Specifies the photoflo to be modified. +start Specifies the index where element replacement is to begin. +elem_list Specifies an array of elements that will replace existing elements. +elem_count Specifies the number of items in elem_list. +Description +XieModifyPhotoflo allows element parameters of a stored photoflo to be modified. Stored +photoflos persist beyond execution and may be modified prior to subsequent executions. + +start is the position or index of an element within an array of elements used to specify a photoflo; +the first element in the array has a start value of one (1). + +XieModifyPhotoflo only allows parameter modification. No topological changes are allowed: +elements cannot be deleted, inserted, or appended. +Structures +typedef XID XiePhotoflo; + +typedef struct { + int elemType; + /* union of ALL element types */ + union { + ... + ... + } data; +} XiePhotoElement; +Errors +xieErrNoPhotoflo The value for the photoflo argument does not name a defined +photoflo +xieErrNoFloAccess Attempt to change photoflo when it is already active +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloElement Invalid element type(s) in elem_list or +attempt to append additional element(s) to photoflo +xieErrNoFloSource An invalid start has been specified or +attempt to change input connections of type XiePhototag in +elem_list +xieErrNoFlo An error has been detected while defining, executing, or accessing a +photoflo (see Photoflo Errors). +See Also +XieAllocatePhotofloGraph, XieFreePhotofloGraph, XieCreatePhotoflo, XieRedefinePhotoflo, +XieExecutePhotoflo, XieQueryPhotoflo, XieDestroyPhotoflo + XIElib - Stored Photoflo Functions XieRedefinePhotoflo +Name +XieRedefinePhotoflo - redefine a stored photoflo +Syntax +void XieRedefinePhotoflo (display, photoflo, elem_list, elem_count) +Display *display; +XiePhotoflo photoflo; +XiePhotoElement *elem_list; +int elem_count; +Arguments +display Specifies a connection to an X server. +photoflo Specifies the photoflo to be redefined. +elem_list Specifies an array of elements that will replace all existing elements. +elem_count Specifies the number of items in elem_list. +Description +XieRedefinePhotoflo allows all elements of a stored photoflo to be removed and replaced with +a new list. Stored photoflos persist beyond execution and may be totally redefined prior to subsequent +executions. + +There are no restrictions on changing element types or the array's size. +Structures +typedef XID XiePhotoflo; + +typedef struct { + int elemType; + /* union of ALL element types */ + union { + ... + ... + } data; +} XiePhotoElement; +Errors +xieErrNoPhotoflo The value for the photoflo argument does not name a defined +photoflo +xieErrNoFloAccess Attempt to change photoflo when it is already active +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloElement Invalid element type(s) in elem_list +xieErrNoFlo An error has been detected while defining, executing, or accessing a +photoflo (see Photoflo Errors). +See Also +XieAllocatePhotofloGraph, XieFreePhotofloGraph, XieCreatePhotoflo, XieModifyPhotoflo, +XieExecutePhotoflo, XieQueryPhotoflo, XieDestroyPhotoflo + XIElib - Photoflo Functions XieQueryPhotoflo +Name +XieQueryPhotoflo - return the current status of a photoflo +Syntax +XieQueryPhotoflo(display, name_space, flo_id, state_ret, +data_expected_ret, nexpected_ret, data_available_ret, +navailable_ret) +Display *display; +unsigned long name_space; +unsigned long flo_id; +XiePhotofloState *state_ret; +XiePhototag **data_expected_ret; +unsigned int *nexpected_ret; +XiePhototag **data_available_ret; +unsigned int *navailable_ret; +Arguments +display Specifies a connection to an X server. +name_space Specifies the execution domain used for the photoflo to query. +flo_id Specifies a particular instance of the photoflo to query. +state_ret Returns the state of the photoflo. +data_expected_ret Returns a list of ImportClient elements. +nexpected_ret Returns the length of data_expected_ret. +data_available_ret Returns a list of ExportClient elements. +navailable_ret Returns the length of data_available_ret. +Returns +Zero on failure, nonzero on success. +Description +XieQueryPhotoflo will return the current status of a photoflo. + +The name_space/flo_id argument pair specifies the instance that identifies the photoflo that is +being queried. state_ret indicates the state of the photoflo, and if XieQueryPhotoflo is +successful, will return one of the following standard photoflo state values: + +xieValInactive +xieValActive +xieValNonexistent + +data_expected_ret is a list of ImportClient elements that are expecting data via +XiePutClientData. data_available_ret is a list of ExportClient elements from which +data are available (via XieGetClientData). Either or both of these lists may be of length zero, +indicated by the returned values of nexpected_ret and navailable_ret. + +XieQueryPhotoflo allocates memory for the list of ImportClient elements and the list of +ExportClient elements. To free the memory allocated to data_expected_ret and +data_available_ret, use XFree. + +Specifying an unknown or invalid instance will return a state_ret of nonexistent and zero length +data_expected_ret and data_available_ret lists. +Structures +typedef unsigned XiePhotofloState; + +/* Definitions of PhotofloState */ +#define xieValInactive 1 +#define xieValActive 2 +#define xieValNonexistent 3 +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +See Also +XieCreatePhotoflo, XieModifyPhotoflo, XieRedefinePhotoflo, XieExecutePhotoflo, +XieDestroyPhotoflo, XieGetClientData, XiePutClientData + XIElib - Client Data Functions XiePutClientData +Name +XiePutClientData - send a stream of data to an active photoflo +Syntax +void XiePutClientData (display, name_space, flo_id, element, final, +band_number, data, nbytes) +Display *display; +unsigned long name_space; +unsigned long flo_id; +XiePhototag element; +Bool final; +unsigned band_number; +unsigned char *data; +unsigned nbytes; +Arguments +display Specifies a connection to an X server. +name_space Specifies the execution domain used for the photoflo to receive the +data. +flo_id Specifies a particular instance of the photoflo to receive the data. +element Specifies the element to receive the data. +final Specifies if the data is the last segment of data to be sent. If True, then +data represents the last data to be sent by the client. False indicates +that more data will be sent (during a subsequent call to +XiePutClientData). +band_number Specifies which band of data is being sent. +data Specifies a counted list of bytes that comprises the data stream. +nbytes Specifies the count of bytes that comprises the data stream. +Description +XiePutClientData sends a stream of data to an active photoflo. Since the complete data object +may be larger than can fit in a single protocol request, XIE allows the stream to be segmented; the +last segment is signaled with a final flag. + +The organization and contents of the data stream must match the parameters given to the +ImportClient element or the results are undefined. An arbitrary amount of image data can be sent per +request, whereas for nonimage data one or more complete aggregates must be sent per request (for +example, one or more LUT array entries). If too many data are sent (for example, too many +rectangles, or too many scanlines), the unwanted data are discarded. It is an error, however, to send +too few data prior to signaling final. + +For stored photoflos, name_space is always ServerIDSpace (the value zero) and flo_id is the +photoflo's resource-id. For immediate photoflos name_space is a photospace resource-id and +flo_id is 32-bit value that uniquely identifies the instance of the photoflo within name_space. +Structures +typedef unsigned XiePhototag; +Errors +xieErrNoFloAccess Executable photospace/flo_id argument pair not active +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloElement Invalid element type specified by element +xieErrNoFloID Invalid photospace/flo_id argument pair has been specified +xieErrNoFloValue Invalid band_number or +for nonimage data, data contains a partial aggregate +See Also +XieGetClientData, XieQueryPhotoflo, XieFloImportClientPhoto, XieFloImportClientROI, +XieFloImportClientLUT + XIElib - Client Data Functions XieGetClientData +Name +XieGetClientData - retrieve data from an ExportClient element within an active photoflo +Syntax +Status XieGetClientData (display, name_space, flo_id, element, +max_bytes, terminate, band_number, new_state_ret, +data_ret, nbytes_ret) +Display *display; +unsigned long name_space; +unsigned long flo_id; +XiePhototag element; +unsigned max_bytes; +Bool terminate; +unsigned band_number; +XieExportState *new_state_ret; +unsigned char **data_ret; +unsigned *nbytes_ret; +Arguments +display Specifies a connection to an X server. +name_space Specifies the execution domain used for the photoflo from which to +retrieve data. +flo_id Specifies a particular instance of the photoflo from which to retrieve +data. +element Specifies the element from which to retrieve the data. +max_bytes Specifies the maximum number of bytes that can be sent to the client. +terminate Specifies whether more data are wanted after this request. +band_number Specifies which band of data is being retrieved. +new_state_ret Returns the status of the ExportClient element after this request. +data_ret Returns a counted list of bytes that comprises the data stream. +nbytes_ret Returns the count of bytes that comprises the data stream. +Returns +Zero on failure, nonzero on success. +Description +XieGetClientData returns data in a contiguous read-once byte stream, which can be requested +in segments that are limited in size by the amount the client desires or the amount of data available +from the server. The format of the data depends on the parameters given to the ExportClient element +from which the data are requested. + +new_state_ret returns the state of the ExportClient element after this request and can be set to +one of the following standard export state values: + +xieValExportDone +xieValExportMore +xieValExportEmpty +xieValExportError + +If the request is sent to an ExportClient element that either: does not have any data, was terminated +by a previous XieGetClientData call, or has already returned all its data (ExportDone sent), the +request will return a zero length data_ret stream. + +Image data are always retrieved from the server as a byte stream, whereas nonimage data are always +returned by the server as one or more complete aggregates. max_bytes is effectively rounded down +by the server to the match the nearest aggregate size. + +For stored photoflos, name_space is always ServerIDSpace (the value zero) and flo_id is the +photoflo's resource-id. For immediate photoflos name_space is a photospace resource-id and +flo_id is a 32-bit value that uniquely identifies the instance of the photoflo within name_space. + +To free the memory allocated to data_ret, use XFree. +Structures +typedef unsigned XieExportState; +typedef unsigned XiePhototag; + +/* Definitions of ExportState */ +#define xieValExportDone 1 +#define xieValExportMore 2 +#define xieValExportEmpty 3 +#define xieValExportError 4 +Errors +xieErrNoFloAccess Executable photospace/flo_id argument pair not active +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloElement Invalid element type specified by element +xieErrNoFloID Invalid photospace/flo_id argument pair has been specified +xieErrNoFloValue Invalid band_number +See Also +XiePutClientData, XieQueryPhotoflo, XieExecutePhotoflo, XieFloExportClientHistogram, +XieFloExportClientLUT, XieFloExportClientPhoto, XieFloExportClientROI + XIElib - Abort and Await Functions XieAbort +Name +XieAbort - prematurely terminate execution of a photoflo +Syntax +void XieAbort (display, name_space, flo_id); +Display *display; +unsigned long name_space; +unsigned long flo_id; +Arguments +display Specifies a connection to an X server. +name_space Specifies the execution domain used for the photoflo to abort. +flo_id Specifies a particular instance of the photoflo to abort. +Description +XieAbort will prematurely terminate execution of the photoflo specified by name_space and +flo_id. Any output from the photoflo that is pending client retrieval is freed. Stored photoflos are +returned to the inactive state; immediate photoflos are destroyed. + +If the photoflo specified by name_space and flo_id is either invalid or not active, no action is +taken; it is not an error, and nothing is destroyed. + +For stored photoflos, name_space is always ServerIDSpace (the value zero) and flo_id is the +photoflo's resource-id. For immediate photoflos name_space is a photospace resource-id and +flo_id is 32-bit value that uniquely identifies the instance of the photoflo within name_space. +See Also +XieExecutePhotoflo, XieExecuteImmediate + XIElib - Abort and Await Functions XieAwait +Name +XieAwait - block all further requests for this client connection from being honored by the server while +the photoflo is active +Syntax +void XieAwait (display, name_space, flo_id); +Display *display; +unsigned long name_space; +unsigned long flo_id; +Arguments +display Specifies a connection to an X server. +name_space Specifies the execution domain used for the photoflo to block requests. +flo_id Specifies a particular instance of the photoflo to block requests. +Description +XieAwait blocks all further requests for this client connection from being honored by the server +while the photoflo, specified by name_space and flo_id, is active. When the photoflo transitions +from the active state, blocked requests are allowed to be processed in the order received. + +If the photoflo specified by name_space and flo_id is either invalid or not active, no action is +taken; it is not an error, and the client is not blocked. + +For stored photoflos, name_space is always ServerIDSpace (the value zero) and flo_id is the +photoflo's resource-id. For immediate photoflos name_space is a photospace resource-id and +flo_id is 32-bit value that uniquely identifies the instance of the photoflo within name_space. +Warning +Calling XieAwait before sending all import data or before retrieving all export data will block the +client from sending or retrieving the remaining data. This also will prevent completion of the +photoflo and prevent any and all protocol requests from this client from being honored. This deadlock +can be broken only by another client completing or aborting the photoflo (to release the Await), or by +breaking the client connection. +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +See Also +XieExecutePhotoFlo, XieExecuteImmediate + XIElib - Photoflo Element Functions XieFloImportClientLUT +Name +XieFloImportClientLUT - specify an ImportClientLUT element and set its parameters +Syntax +void XieFloImportClientLUT (element, data_class, band_order, length, +levels) +XiePhotoElement *element; +XieDataClass data_class; +XieOrientation band_order; +XieLTriplet length; +XieLevels levels; +Arguments +element Specifies the XiePhotoElement structure to use. +data_class Specifies the number of lookup arrays to expect. +band_order Specifies the order of triple band arrays. +length Specifies the number of entries per array. +levels Specifies the number of quantization levels represented per array. +Description +An ImportClientLUT element accepts lookup table data from the protocol stream. The transport of +data through the protocol stream is accomplished using XiePutClientData. This data is accepted +by the Point, ExportLUT, and ExportClientLUT elements. + +data_class, which specifies the number of lookup arrays to expect, can be set to one of the +following standard data class values: + +xieValSingleBand +xieValTripleBand + +The length of each array should match the number of source image levels that will be remapped +through the array. When a triple band image is to be remapped through a single band array, the +length of the array should match the product of the source image levels of all three bands; in this +case, band_order specifies the order in which pixels from a triple band image should be combined +to form indices for a single band array. band_order can be set to one of the following standard +orientation values: + +xieValLSFirst +xieValMSFirst + +The least significant band of trichromatic data is the first band mentioned in the common name of the +colorspace: for example, red is the least significant band of RGB data. When one LUT array is used +with triple band data, the algorithm for computing combined array indices, based on band_order, +is: + +LUT band order +LUT indexing algorithm for combining pixel values +LSFirst +index = value[0] + value[1] x levels[0] + value[2] x levels[0] x levels[1] +MSFirst +index = value[2] + value[1] x levels[2] + value[0] x levels[2] x levels[1] + +When three LUT arrays are used, band_order specifies whether this band corresponds with the +least significant or most significant LUT array. Each array is transported as a separate data stream. +For example, if the colorspace of the image data is RGB: + +band +LSFirst +MSFirst +0 +Red array +Blue array +1 +Green array +Green array +2 +Blue array +Red array +Structures +XieFloImportClientLUT sets the XiePhotoElement structure field elemType to +xieElemImportClientLUT, which identifies the element as an ImportClientLUT, and sets the +fields of the member structure ImportClientLUT using the arguments in the argument list. + +typedef unsigned XieDataClass; +typedef unsigned XieOrientation; +typedef unsigned long XieLTriplet[3]; +typedef unsigned long XieLevels[3]; + +typedef struct { + int elemType; + union { + ... + struct { + XieDataClass data_class; + XieOrientation band_order; + XieLTriplet length; + XieLevels levels; + } ImportClientLUT; + ... + } data; +} XiePhotoElement; + +/* Definitions of DataClass */ +#define xieValSingleBand 1 +#define xieValTripleBand 2 + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloMatch levels is incompatible with the server's depth-handling capabilities +xieErrNoFloValue Invalid data_class or band_order +See Also +XiePutClientData, XieQueryPhotoflo, XieFloExportLUT, XieFloExportClientLUT, XieFloPoint, +XieFloImportLUT + XIElib - Photoflo Element Functions XieFloImportClientPhoto +Name +XieFloImportClientPhoto - specify an ImportClientPhoto element and set its parameters +Syntax +void XieFloImportClientPhoto (element, data_class, width, height, +levels, notify, decode_tech, decode_param) +XiePhotoElement *element; +XieDataClass data_class; +XieLTriplet width; +XieLTriplet height; +XieLevels levels; +Bool notify; +XieDecodeTechnique decode_tech; +XiePointer decode_param; +Arguments +element Specifies the XiePhotoElement structure to use. +data_class Specifies whether the data is single band or triple band. +width Specifies the width of the image in pixels per band. +height Specifies the height of the image in pixels per band. +levels Specifies the number of quantization levels per band. +notify Specifies whether to enable sending DecodeNotify events. +decode_tech Specifies the decode technique required to interpret the image. +decode_param Specifies the list of additional parameters required by decode_tech. +Description +An ImportClientPhoto element accepts image data from the protocol stream. This data may be +processed for display or used as process domain data. A process domain is inserted in many element +definitions and is used to restrict the element's processing to a subset of the source data pixels. The +attributes and organization of the expected data stream are fully specified by the parameters. The +actual transport of image data through the protocol stream is requested using XiePutClientData. + +notify enables DecodeNotify events to be sent if anomalies are encountered while interpreting +the imported image data: either an error has been encountered while decoding an image or the image +data received does not satisfy the expected dimensions. + +Only constrained data can be sent through the protocol stream; therefore, levels must be valid. + +data_class specifies whether the data is single band or triple band and can be set to one of the +following standard data class values: + +xieValSingleBand +xieValTripleBand + +Decode techniques define the techniques that can be used to interpret uncompressed image data or +decode compressed images. decode_tech can be assigned one of the following standard decode +technique values: + +xieValDecodeUncompressedSingle +xieValDecodeUncompressedTriple +xieValDecodeG31D +xieValDecodeG32D +xieValDecodeG42D +xieValDecodeJPEGBaseline +xieValDecodeJPEGLossless +xieValDecodeTIFF2 +xieValDecodeTIFFPackBits + +If a vendor defined additional private decode techniques, the values given to these techniques can be +assigned to decode_tech. +Output Attributes +Class class of imported image +Type constrained +Width width of imported image (in pixels) +Height height of imported image (in pixels) +Levels levels of imported image +Structures +XieFloImportClientPhoto sets the XiePhotoElement structure field elemType to +xieElemImportClientPhoto, which identifies the element as an ImportClientPhoto, and sets +the fields of the member structure ImportClientPhoto using the arguments in the argument list. + +typedef unsigned XieDataClass; +typedef unsigned XieDecodeTechnique; +typedef unsigned long XieLTriplet[3]; +typedef unsigned long XieLevels[3]; + +typedef struct { + int elemType; + union { + ... + struct { + XieDataClass data_class; + XieLTriplet width; + XieLTriplet height; + XieLevels levels; + Bool notify; + XieDecodeTechnique decode_tech; + XiePointer decode_param; + } ImportClientPhoto; + ... + } data; +} XiePhotoElement; + +/* Definitions of DataClass */ +#define xieValSingleBand 1 +#define xieValTripleBand 2 + +/* Definitions for DecodeTechniques */ +#define xieValDecodeUncompressedSingle 2 +#define xieValDecodeUncompressedTriple 3 +#define xieValDecodeG31D 4 +#define xieValDecodeG32D 6 +#define xieValDecodeG42D 8 +#define xieValDecodeJPEGBaseline 10 +#define xieValDecodeJPEGLossless 12 +#define xieValDecodeTIFF2 14 +#define xieValDecodeTIFFPackBits 16 +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloMatch levels is incompatible with the server's depth-handling capabilities +xieErrNoFloTechnique Invalid decode_tech or decode_param +xieErrNoFloValue Invalid width, height, levels (zero) or +invalid data_class +See Also +XieTecDecodeUncompressedSingle, XieTecDecodeUncompressedTriple, XieTecDecodeG31D, +XieTecDecodeG32D, XieTecDecodeG42D, XieTecDecodeTIFF2, XieTecDecodeTIFFPackBits, +XieTecDecodeJPEGBaseline, XieTecDecodeJPEGLossless + XIElib - Photoflo Element Functions XieFloImportClientROI +Name +XieFloImportClientROI - specify an ImportClientROI element and set its parameters +Syntax +void XieFloImportClientROI (element, rectangles); +XiePhotoElement *element; +unsigned int rectangles; +Arguments +element Specifies the XiePhotoElement structure to use. +rectangles Specifies the number of rectangles expected. +Description +An ImportClientROI element accepts a list of rectangles from the protocol stream. These data can be +used as input to a process domain or an ExportROI or ExportClientROI element. A process domain is +inserted in many element definitions and is used to restrict the element's processing to a subset of the +source data pixels. The actual transport of data through the protocol stream is accomplished using +XiePutClientData (the band_number parameter of XiePutClientData is ignored). +Structures +XieFloImportClientROI sets the XiePhotoElement structure field elemType to +xieElemImportClientROI, which identifies the element as an ImportClientROI, and sets the +fields of the member structure ImportClientROI using the arguments in the argument list. + +typedef struct { + int elemType; + union { + ... + struct { + unsigned int rectangles; + } ImportClientROI; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +See Also +XiePutClientData, XieQueryPhotoflo +XieFloExportROI, XieFloExportClientROI, XieFloImportROI + XIElib - Photoflo Element Functions XieFloImportDrawable +Name +XieFloImportDrawable - specify an ImportDrawable element and set its parameters +Syntax +void XieFloImportDrawable (element, drawable, src_x, src_y, width, +height, fill, notify) +XiePhotoElement *element; +Drawable drawable; +int src_x; +int src_y; +unsigned int width; +unsigned int height; +unsigned long fill; +Bool notify; +Arguments +element Specifies the XiePhotoElement structure to use. +drawable Specifies the Drawable resource supplying the data. +src_x Specifies the left corner of the region of the data to be imported. +src_y Specifies the upper corner of the region of the data to be imported. +width Specifies the width of the region of the data to be imported. +height Specifies the height of the region of the data to be imported. +fill Specifies the Colormap index to use for all regions that are obscured. +notify Specifies whether to enable sending ImportObscured events. +Description +An ImportDrawable element allows access to data existing in a Drawable. This data may be +processed for display or, if drawable is one bit deep, used as process domain data. A process +domain is inserted in many element definitions and is used to restrict the element's processing to a +subset of the source data pixels. + +notify enables ImportObscured events to be sent if data for one or more regions of a Window +are obscured and cannot be retrieved from backing store. The arguments src_x, src_y, width, +and height specify the region of data to be imported from drawable, where src_x and src_y +define the upper-left corner of the region. +Output Attributes +Class single band +Type constrained +Width width +Height height +Levels 2depth (that is, drawable depth) +Structures +XieFloImportDrawable sets the XiePhotoElement structure field elemType to +xieElemImportDrawable, which identifies the element as an ImportDrawable, and sets the +fields of the member structure ImportDrawable using the arguments in the argument list. + +typedef struct { + int elemType; + union { + ... + struct { + Drawable drawable; + int src_x; + int src_y; + unsigned int width; + unsigned int height; + unsigned long fill; + Bool notify; + } ImportDrawable; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloDrawable Invalid drawable +xieErrNoFloValue Invalid region width, height, src_x, src_y + XIElib - Photoflo Element Functions XieFloImportDrawablePlane +Name +XieFloImportDrawablePlane - specify an ImportDrawablePlane element and set its parameters +Syntax +void XieFloImportDrawablePlane (element, drawable, src_x, src_y, +width, height, fill, bit_plane, notify) +XiePhotoElement *element; +Drawable drawable; +int src_x; +int src_y; +unsigned int width; +unsigned int height; +unsigned long fill; +unsigned long bit_plane; +Bool notify; +Arguments +element Specifies the XiePhotoElement structure to use. +drawable Specifies the Drawable resource supplying the data. +src_x Specifies the left corner of the region of the data to be imported. +src_y Specifies the upper corner of the region of the data to be imported. +width Specifies the width of the region of the data to be imported. +height Specifies the height of the region of the data to be imported. +fill Specifies the Colormap index to use for all regions that are obscured. +bit_plane Specifies the plane to be imported from drawable. +notify Specifies whether to enable sending ImportObscured events. +Description +An ImportDrawablePlane event allows access to a single plane of data existing in a Drawable. This +data may be processed for display or used as process domain data. A process domain is inserted in +many element definitions and is used to restrict the element's processing to a subset of the source data +pixels. + +notify enables ImportObscured events to be sent if data for one or more regions of a Window +are obscured and cannot be retrieved from backing store. The arguments src_x, src_y, width, +and height specify the region of data to be imported from drawable, where src_x and src_y +define the upper-left corner of the region. + +bit_plane must have exactly one bit set to one (1), and the value of bit_plane must be less than +or equal to , where n is the depth of drawable. This single bit selects the corresponding bit to +be extracted from pixels within drawable. +Output Attributes +Class single band +Type constrained +Width width +Height height +Levels 2 +Structures +XieFloImportDrawablePlane sets the XiePhotoElement structure field elemType to +xieElemImportDrawablePlane, which identifies the element as an ImportDrawablePlane, and +sets the fields of the member structure ImportDrawablePlane using the arguments in the +argument list. + +typedef struct { + int elemType; + union { + ... + struct { + Drawable drawable; + int src_x; + int src_y; + unsigned int width; + unsigned int height; + unsigned long fill; + unsigned long bit_plane; + Bool notify; + } ImportDrawablePlane; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloDrawable Invalid drawable +xieErrNoFloValue Invalid bit_plane or region width, height, src_x, src_y + XIElib - Photoflo Element Functions XieFloImportLUT +Name +XieFloImportLUT - specify an ImportLUT element and set its parameters +Syntax +void XieFloImportLUT (element, lut) +XiePhotoElement *element; +XieLut lut; +Arguments +element Specifies the XiePhotoElement structure to use. +lut Specifies the LUT resource supplying the lookup table. +Description +An ImportLUT element allows access to lookup table data existing in a LUT resource. These data are +accepted by the Point, ExportLUT, and ExportClientLUT elements. + +Attributes of the lookup table data are inherited from lut. +Structures +XieFloImportLUT sets the XiePhotoElement structure field elemType to +xieElemImportLUT, which identifies the element as an ImportLUT, and sets the fields of the +member structure ImportLUT using the arguments in the argument list. + +typedef XID XieLut; + +typedef struct { + int elemType; + union { + ... + struct { + XieLut lut; + } ImportLUT; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAccess Attempt to import from lut before it has been populated +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloLUT An unknown lut has been specified + XIElib - Photoflo Element Functions XieFloImportPhotomap +Name +XieFloImportPhotomap - specify an ImportPhotomap element and set its parameters +Syntax +void XieFloImportPhotomap (element, photomap, notify) +XiePhotoElement *element; +XiePhotomap photomap; +Bool notify; +Arguments +element Specifies the XiePhotoElement structure to use. +photomap Specifies the photomap resource supplying image data. +notify Specifies whether to enable sending DecodeNotify events. +Description +An ImportPhotomap element allows access to image data existing in a photomap; a photomap is a +server resource that can be used to store image data. This data may be processed for display or used as +process domain data (if its levels attribute is 2), or it may be used as source to ExportPhotomap or +ExportClientPhoto or any other element which takes image data as input. A process domain is +inserted in many element definitions and is used to restrict the element's processing to a subset of the +source data pixels. + +notify enables DecodeNotify events to be sent if anomalies are encountered while decoding +compressed data: either an error has been encountered while decoding an image or the image data +received does not satisfy the expected dimensions. + +Attributes of the source data are inherited from photomap. +Output Attributes +Class same as photomap +Type same as photomap +Width same as photomap +Height same as photomap +Levels same as photomap +Structures +XieFloImportPhotomap sets the XiePhotoElement structure field elemType to +xieElemImportPhotomap, which identifies the element as an ImportPhotomap, and sets the +fields of the member structure ImportPhotomap using the arguments in the argument list. + +typedef XID XiePhotomap; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhotomap photomap; + Bool notify; + } ImportPhotomap; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAccess Attempt to import from photomap before it has been populated +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloPhotomap An unknown photomap has been specified +See Also +XieFloExportPhotomap, XIeFloExportClientPhoto + + XIElib - Photoflo Element Functions XieFloImportROI +Name +XieFloImportROI - specify an ImportROI element and set its parameters +Syntax +void XieFloImportROI (element, roi) +XiePhotoElement *element; +XieRoi roi; +Arguments +element Specifies the XiePhotoElement structure to use. +roi Specifies the ID of the ROI supplying the list-of-rectangles. +Description +An ImportROI element allows access to a list-of-rectangles existing in a ROI resource. This data may +be referenced by a process domain, or used as input to an ExportClientROI or ExportROI element. A +process domain is inserted in many element definitions and is used to restrict the element's processing +to a subset of the source data pixels. +Structures +XieFloImportROI sets the XiePhotoElement structure field elemType to +xieElemImportROI, which identifies the element as an ImportROI, and sets the fields of the +member structure ImportROI using the arguments in the argument list. + +typedef XID XieRoi; + +typedef struct { + int elemType; + union { + ... + struct { + XieRoi roi; + } ImportROI; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAccess Attempt to import from roi before it has been populated +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloPhotomap An unknown roi has been specified +See Also +XieFloExportROI, XieFloExportClientROI + + XIElib - Photoflo Element Functions XieFloArithmetic +Name +XieFloArithmetic - specify an Arithmetic element and set its parameters +Syntax +void XieFloArithmetic (element, src1, src2, domain, constant, +operator, band_mask) +XiePhotoElement *element; +XiePhototag src1; +XiePhototag src2; +XieProcessDomain *domain; +XieConstant constant; +XieArithmeticOp operator; +unsigned int band_mask; +Arguments +element Specifies the XiePhotoElement structure to use. +src1 Specifies the phototag of the first data source. +src2 Specifies the phototag of the second data source, or 0 if none. +domain Specifies the subset of source data that will be operated on. +constant Specifies the constant data source (if src2 is 0). +operator Specifies the arithmetic operation to be performed. +band_mask Specifies which bands are to be operated on. +Description +An Arithmetic element produces output data by performing an addition, subtraction, minimum, or +maximum operation between two data sources or between a single data source and a constant. +Furthermore, multiplication, division, or gamma correction may by applied to a single data source. + +When two sources are involved, src1 and src2 are the phototags of the elements supplying source +data (constant is ignored). A phototag is the position or index of an element within an array of +elements used to specify a photoflo; the first element in the array has a phototag value of one (1). If +the operation is to involve a constant, src1 is one operand, src2 must be zero, and constant is +used as the other operand. + +When two sources are involved, all attributes, other than width and height, must match; all +output attributes are inherited from src1. + +In order to specify a subset of source data that will be operated on, the phototag, offset_x, and +offset_y fields of the XieProcessDomain structure pointed to by domain must be supplied; +XIElib does not provide a convenience function to create and/or fill in an XieProcessDomain +structure. If the entire source data is to be operated on, a pointer to an XieProcessDomain +structure must still be provided, with the phototag field set to zero (0); the offset_x and +offset_y fields are ignored. + +Only bands selected by band_mask are subject to processing. Other bands present in the image are +passed through to the output. For example, a band_mask of 0012 indicates that only the least +significant band would be processed; operating on all bands requires a band_mask of 1112. Using +band_mask to select source data that have two (2) or less levels is not permitted. + +Pixel computations that would lead to errors, will yield valid server-dependent values (for example, +dividing by a constrained pixel value of zero might result in a value of levels-1). + +The valid operations for the Arithmetic process element are: + +Operator +src1 (operator) src2 +src1 (operator) constant +xieValAdd +src1 + src2 +src1 + constant +xieValSub +src1 - src2 +src1 - constant +xieValSubRev +src2 - src1 +constant - src1 +xieValMul + +src1 * constant +xieValDiv + +src1 / constant +xieValDivRev + +constant / src1 +xieValMin +minimum( src1, src2 ) +minimum( src1, constant ) +xieValMax +maximum( src1, src2 ) +maximum( src1, constant ) +xieValGamma +(constrained) + +(levels - 1) * ((src1 / (levels - 1))constant) +xieValGamma +(unconstrained) + +src1constant +Output Attributes +Class same as src1 +Type same as src1 +Width same as src1 +Height same as src1 +Levels same as src1 +Structures +XieFloArithmetic sets the XiePhotoElement structure field elemType to +xieElemArithmetic, which identifies the element as an Arithmetic, and sets the fields of the +member structure Arithmetic using the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef float XieConstant[3]; +typedef unsigned XieArithmeticOp; +typedef struct { + int offset_x; + int offset_y; + XiePhototag phototag; +} XieProcessDomain; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src1; + XiePhototag src2; + XieProcessDomain domain; + XieConstant constant; + XieArithmeticOp operator; + unsigned int band_mask; + } Arithmetic; + ... + } data; +} XiePhotoElement; + +/* Definitions of ArithmeticOperations */ +#define xieValAdd 1 +#define xieValSub 2 +#define xieValSubRev 3 +#define xieValMul 4 +#define xieValDiv 5 +#define xieValDivRev 6 +#define xieValMin 7 +#define xieValMax 8 +#define xieValGamma 9 +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloDomain Invalid domain +xieErrNoFloMatch Class, type, or levels differ between src1 and src2 or +selected data source are bitonal +xieErrNoFloOperator Invalid operator +xieErrNoFloSource Invalid src1 or src2 or +src2 has been specified with a monadic operator + XIElib - Photoflo Element Functions XieFloBandCombine +Name +XieFloBandCombine - specify a BandCombine element and set its parameters +Syntax +void XieFloBandCombine (element, src1, src2, src3) +XiePhotoElement *element; +XiePhototag src1; +XiePhototag src2; +XiePhototag src3; +Arguments +element Specifies the XiePhotoElement structure to use. +src1 Specifies the first element supplying source data. +src2 Specifies the second element supplying source data. +src3 Specifies the third element supplying source data. +Description +A BandCombine element merges three single band data sources to produce a triple band result. The +arguments src1, src2, and src3 must be of the same type, and each source must be single band. +Other attributes that are taken from the individual sources may differ. The output will be triple band. +Output Attributes +Class triple band +Type same as src1 +Width same as srcs +Height same as srcs +Levels same as srcs +Structures +XieFloBandCombine sets the XiePhotoElement structure field elemType to +xieElemBandCombine, which identifies the element as a BandCombine, and sets the fields of the +member structure BandCombine using the arguments in the argument list. + +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src1; + XiePhototag src2; + XiePhototag src3; + } BandCombine; + ... + } data; +} XiePhotoElement; + +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloMatch A source has more than one band or +type differs between sources +xieErrNoFloSource Invalid src1, src2, or src3 + XIElib - Photoflo Element Functions XieFloBandExtract +Name +XieFloBandExtract - specify a BandExtract element and set its parameters +Syntax +void XieFloBandExtract (element, src, levels, bias, coefficients) +XiePhotoElement *element; +XiePhototag src; +unsigned int levels; +double bias; +XieConstant coefficients; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +levels Specifies the number of quantization levels for the output. +bias Specifies the value to be added to each output pixel. +coefficients Specifies the proportion of each band in src to pixelsin the single +band result. +Description +A BandExtract element produces single band output data from a triple band source by multiplying a +pixel value from each source band by its corresponding coefficient and then summing the results with +the bias value. + +coefficients is a three-element array that determines the proportion of each source band pixel +that is used to form the output. levels is used as the levels attribute of the output data if the src +data are constrained; otherwise, it is ignored. + +The source data must be triple band, and all bands must have equal dimensions. The output data will +be single band, with levels taken from the levels parameter, if the data type is constrained. All +other attributes are inherited from src. +Output Attributes +Class single band +Type same as src +Width same as src +Height same as src +Levels levels if src is contrained, else unknown +Structures +XieFloBandExtract sets the XiePhotoElement structure field elemType to +xieElemBandExtract, which identifies the element as a BandExtract, and sets the fields of the +member structure BandExtract using the arguments in the argument list. + +typedef float XieConstant[3]; +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + unsigned int levels; + float bias; + XieConstant coefficients; + } BandExtract; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloMatch src is not triple band or +unequal interband dimensions +xieErrNoFloSource Invalid src + XIElib - Photoflo Element Functions XieFloBandSelect +Name +XieFloBandSelect - specify a BandSelect element and set its parameters +Syntax +void XieFloBandSelect (element, src, band_number) +XiePhotoElement *element; +XiePhototag src; +unsigned int band_number; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +band_number Specifies which src band is to be selected to provide the output data. +Description +A BandSelect element produces single band output data by selecting a single band from a triple band +source. +Output Attributes +Class single band +Type same as src +Width same as band selected from src +Height same as band selected from src +Levels same as band selected from src +Structures +XieFloBandSelect sets the XiePhotoElement structure field elemType to +xieElemBandSelect, which identifies the element as a BandSelect, and sets the fields of the +member structure BandSelect using the arguments in the argument list. + +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + unsigned int band_number; + } BandSelect; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloMatch src is not triple band +xieErrNoFloSource Invalid src +xieErrNoFloValue Invalid band_number + XIElib - Photoflo Element Functions XieFloBlend +Name +XieFloBlend - specify a Blend element and set its parameters +Syntax +void XieFloBlend (element, src1, src2, src_constant, alpha, +alpha_const, domain, band_mask) +XiePhotoElement *element; +XiePhototag src1; +XiePhototag src2; +XieConstant src_constant; +XiePhototag alpha; +double alpha_const; +XieProcessDomain *domain; +unsigned int band_mask; +Arguments +element Specifies the XiePhotoElement structure to use. +src1 Specifies the phototag of the first data source. +src2 Specifies the phototag of the second data source, else 0. +src_constant Specifies a constant data source, if src2 is 0. +alpha Specifies the blend proportion for each processed pixel. +alpha_const Specifies the constant blend proportion for each processed pixel. +domain Specifies the subset of source data that will be operated on. +band_mask Specifies which bands are to be operated on. +Description +A Blend element produces output data from two data sources or a single data source and a constant. +Each output pixel is a percentage combination of the source values, as controlled by an alpha input +image or an alpha constant. + +When two sources are involved, src1 and src2 are the phototags of the elements supplying source +data; src_constant is ignored. A phototag is the position or index of an element within an array +of elements used to specify a photoflo; the first element in the array has a phototag value of one (1). If +the operation is to involve a constant, src1 is one operand, src2 must be zero, and +src_constant is used as the other operand. If alpha is nonzero, it controls the blend proportion +for each pixel that is processed, otherwise alpha_const provides this control. Domain may control +the subset of source data that will be operated on. Only bands selected by the band_mask are subject +to processing. Other bands present in the image are passed through to the output. For example, a +band_mask of 0012 indicates that only the least significant band would be processed; operating on +all bands requires a band_mask of 1112. Using band_mask to select source data that have two (2) +or less levels is not permitted. + +When two sources are involved, all attributes, other that width and height, must match. If alpha +is nonzero, it must be a source of constrained data. + +In order to specify a subset of source data that will be operated on, the phototag, offset_x, and +offset_y fields of the XieProcessDomain structure pointed to by domain must be supplied; +XIElib does not provide a convenience function to create and/or fill in an XieProcessDomain +structure. If the entire source data is to be operated on, a pointer to an XieProcessDomain +structure must still be provided, with the phototag field set to zero (0); the offset_x and +offset_y fields are ignored. + +Within the intersection of the source(s) and domain, each output pixel is a blend of the +corresponding pixels from src1 and src2 (or src1 pixels blended with src_constant). The +degree of blend is determined by the corresponding pixel taken from alpha or the value of +alpha_const. If alpha is nonzero, the proportion of blend is further scaled by alpha_const: + +output = src1 * (1 - alpha / alpha_const) + src2 * (alpha / alpha_const) +(where alpha_const is greater than 0.0) + +if alpha is zero: + +output = src1 * (1 - alpha_const) + src2 * alpha_const +(where alpha_const is in the range [0.0, 1.0]) +Output Attributes +Class same as src1 +Type same as src1 +Width same as src1 +Height same as src1 +Levels same as src1 +Structures +XieFloBlend sets the XiePhotoElement structure field elemType to xieElemBlend, +which identifies the element as a Blend, and sets the fields of the member structure Blend using the +arguments in the argument list. + +typedef unsigned XiePhototag; +typedef float XieConstant[3]; +typedef struct { + int offset_x; + int offset_y; + XiePhototag phototag; +} XieProcessDomain; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src1; + XiePhototag src2; + XieConstant src_constant; + XiePhototag alpha; + float alpha_constant; + XieProcessDomain domain; + unsigned int band_mask; + } Blend; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloMatch Incompatible attributes between src1 and src2 or +alpha is unconstrained or +selected source data are bitonal +xieErrNoFloSource Invalid src1, src2, or alpha +xieErrNoFloValue alpha is zero and alpha_const is outside the range [0.0,1.0], or +alpha is nonzero and alpha_const is nonpositive + XIElib - Photoflo Element Functions XieFloCompare +Name +XieFloCompare - specify a Compare element and set its parameters +Syntax +void XieFloCompare (element, src1, src2, domain, constant, operator, +combine, band_mask) +XiePhotoElement *element; +XiePhototag src1; +XiePhototag src2; +XieProcessDomain *domain; +XieConstant constant; +XieCompareOp operator; +Bool combine; +unsigned int band_mask; +Arguments +element Specifies the XiePhotoElement structure to use. +src1 Specifies the first data source. +src2 Specifies the second data source. +domain Specifies the subset of source data that will be operated on. +constant Specifies the constant data source. +operator Specifies the logical predicate operator used in the comparison. +combine Specifies whether the comparison should be done on a per-band or on +an all-bands basis. +band_mask Specifies which bands are to be operated on. +Description +A Compare element takes two data sources or a single data source and a constant and generates a +Boolean bitmap output that reflects the results of a pointwise comparison. The output data has a value +of one wherever the comparison is true, and a value of zero everywhere else (that is, comparison false +or comparison not performed). The comparison may be performed on a per-band basis or for all bands +taken together. + +When two sources are involved, src1 and src2 are the phototags of the elements supplying source +data; constant is ignored. A phototag is the position or index of an element within an array of +elements used to specify a photoflo; the first element in the array has a phototag value of one (1). If +the operation is to involve a constant, src1 is one operand, src2 must be zero, and constant is +used as the other operand. + +In order to specify a subset of source data that will be operated on, the phototag, offset_x, and +offset_y fields of the XieProcessDomain structure pointed to by domain must be supplied; +XIElib does not provide a convenience function to create and/or fill in an XieProcessDomain +structure. If the entire source data is to be operated on, a pointer to an XieProcessDomain +structure must still be provided, with the phototag field set to zero (0); the offset_x and +offset_y fields are ignored. + +operator is the logical predicate operator used in the comparison. The valid operators for the +Compare process element are: + +Operator +src1 (operator) src2 +src1 (operator) constant +xieValLT +src1 * src2 +src1 * constant +xieValLE +src1 * src2 +src1 * constant +xieValEQ +src1 * src2 +src1 * constant +xieValNE +src1 * src2 +src1 * constant +xieValGT +src1 * src2 +src1 * constant +xieValGE +src1 * src2 +src1 * constant + +combine is a Boolean that determines whether the comparison should be done on a per-band basis +or on an all-bands basis. Only bands selected by band_mask are subject to processing. Other bands +present in the image are passed through to the output. For example, a band_mask of 0012 indicates +that only the least significant band would be processed; operating on all bands requires a +band_mask of 1112. + +If combine is True or src1 is single band, the output data will form a single Boolean bitmap. If +src1 is triple band and combine is False, the output data will yield three separate boolean +bitmaps (for this case band_mask must specify all bands). + +If src1 is triple band and combine is True, only the EQ and NE operators are allowed; equality is +established for each band selected by band_mask, and then the result is logically ANDed to derive +equality (inequality is a logical NOT of this result). For this case, width and height must match for all +bands selected by band_mask. + +The relationship between combine and data class dependencies is given in the following table: + +combine +input class +band_mask +output class +True +single band +n/a +single band + +triple band +selected bands +single band +False +single band +n/a +single band + +triple band +all bands +triple band +Output Attributes +Class see Description +Type constrained +Width same as src1 +Height same as src1 +Levels 2 per band (see Description) +Structures +XieFloCompare sets the XiePhotoElement structure field elemType to +xieElemCompare, which identifies the element as a Compare, and sets the fields of the member +structure Compare using the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef float XieConstant[3]; +typedef struct { + int offset_x; + int offset_y; + XiePhototag phototag; +} XieProcessDomain; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src1; + XiePhototag src2; + XieProcessDomain domain; + XieConstant constant; + XieCompareOp operator; + Bool combine; + unsigned int band_mask; + } Compare; + ... + } data; +} XiePhotoElement; + +/* Definitions of Compare Operators */ +#define xieValLT 1 +#define xieValLE 2 +#define xieValEQ 3 +#define xieValNE 4 +#define xieValGT 5 +#define xieValGE 6 +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloDomain Invalid domain +xieErrNoFloMatch Class differs between src1 and src2 or +invalid combination of operator and combine or +triple band, and combine is false, and band_mask incomplete +xieErrNoFloOperator Invalid operator +xieErrNoFloSource Invalid src1 or src2 + XIElib - Photoflo Element Functions XieFloConstrain +Name +XieFloConstrain - specify a Constrain element and set its parameters +Syntax +void XieFloConstrain (element, src, levels, constrain_tech, +constrain_param) +XiePhotoElement *element; +XiePhototag src; +XieLevels levels; +XieConstrainTechnique constrain_tech; +XiePointer constrain_param; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +levels Specifies the number of quantization levels desired in the output data. +constrain_tech Specifies the technique to be used when constraining the data. +constrain_param Specifies the list of additional parameters required by constrain. +Description +A Constrain element applies a quantization model to the image data to convert the data to a fixed +number of quantization levels. Application of the quantization model may involve steps such as range +shifting, scaling, clipping, and rounding. + +src is the phototag of the element supplying source data. A phototag is the position or index of an +element within an array of elements used to specify a photoflo; the first element in the array has a +phototag value of one (1). Levels is the number of quantization levels desired in the output data. +constrain_tech specifies the constrain technique to be used when constraining the data. +constrain_param is the list of additional parameters required by constrain_tech. + +If the input image is already constrained, the data will be reconstrained. + +One of the following standard constrain technique values can be assigned to constrain_tech : + +xieValConstrainClipScale +xieValConstrainHardClip + +If a vendor defined additional private constrain techniques, the values given to these techniques can +be assigned to constrain_tech. +Output Attributes +Class same as src +Type constrained +Width same as src +Height same as src +Levels levels +Structures +XieFloConstrain sets the XiePhotoElement structure field elemType to +xieElemConstrain, which identifies the element as a Constrain, and sets the fields of the +member structure Constrain using the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef unsigned long XieLevels[3]; +typedef unsigned XieConstrainTechnique; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieLevels levels; + XieConstrainTechnique constrain_tech; + XiePointer constrain_param; + } Constrain; + ... + } data; +} XiePhotoElement; + +/* Definitions for ConstrainTechniques */ +#define xieValConstrainClipScale 2 +#define xieValConstrainHardClip 4 +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloSource Invalid src +xieErrNoFloTechnique Invalid constrain_tech or constrain_param +See Also +XieTecClipScale + XIElib - Photoflo Element Functions XieFloConvertFromIndex +Name +XieFloConvertFromIndex - specify a ConvertFromIndex element and set its parameters +Syntax +void XieFloConvertFromIndex (element, src, colormap, data_class, +precision) +XiePhotoElement *element; +XiePhototag src; +Colormap colormap; +XieDataClass data_class; +unsigned int precision; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +colormap Specifies the Colormap from which to obtain output pixel values. +data_class Specifies whether the output data is single band or triple band. +precision Specifies the number of bits to be used from colormap's RGB +values. +Description +A ConvertFromIndex element converts Colormap index data into achromatic or trichromatic data. + +data_class specifies whether the output data is single band or triple band and can be set to one of +the following standard data class values: + +xieValSingleBand +xieValTripleBand + +If data_class is single band and a trichromatic colormap is specified (static color, pseudo color, +true color, or direct color), the gray shade for each pixel is taken from the red values in colormap. +If data_class is triple band and an achromatic colormap is specified (static gray or gray scale), +the red band will be replicated to populate the green and blue output bands. + +The depth of colormap must match the Levels attribute of src (that is, 2depth must equal Levels). +Output Attributes +Class data_class +Type constrained +Width same as src +Height same as src +Levels 2precision (per band) +Structures +XieFloConvertFromIndex sets the XiePhotoElement structure field elemType to +xieElemConvertFromIndex, which identifies the element as a ConvertFromIndex, and sets the +fields of the member structure ConvertFromIndex using the arguments in the argument list. + +typedef unsigned XieDataClass; +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + Colormap colormap; + XieDataClass data_class; + unsigned int precision; + } ConvertFromIndex; + ... + } data; +} XiePhotoElement; + +/* Definitions of DataClass */ +#define xieValSingleBand 1 +#define xieValTripleBand 2 +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloColormap Invalid colormap +xieErrNoFloMatch Levels of src do not match depth of colormap +xieErrNoFloSource Invalid src +xieErrNoFloValue Invalid data_class or precision + XIElib - Photoflo Element Functions XieFloConvertFromRGB +Name +XieFloConvertFromRGB - specify a ConvertFromRGB element and set its parameters +Syntax +void XieFloConvertFromRGB (element, src, color_space, color_param) +XiePhotoElement *element; +XiePhototag src; +XieColorspace color_space; +XiePointer color_param; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data (RGB assumed). +color_space Specifies the technique to be used in the conversion. +color_param Specifies the list of additional parameters required by color_space. +Description +A ConvertFromRGB element converts RGB source data to an alternate colorspace. + +The source data must be triple band, and all bands must have equal dimensions. The type and levels +of the output data are determined by the color_space's technique parameters. All other attributes +are inherited from src. + +ConvertFromRGB techniques define the trichromatic colorspaces known to a ConvertFromRGB +element. One of the following standard ConvertFromRGB technique values can be assigned to +color_space: + +xieValRGBToCIELab +xieValRGBToCIEXYZ +xieValRGBToYCbCr +xieValRGBToYCC + +If a vendor defined additional private ConvertFromRGB techniques, the private technique values +given to these techniques can be assigned to color_space. +Output Attributes +Class triple band +Type color_space dependent +Width same as src +Height same as src +Levels color_space dependent +Structures +XieFloConvertFromRGB sets the XiePhotoElement structure field elemType to +xieElemConvertFromRGB, which identifies the element as a ConvertFromRGB, and sets the +fields of the member structure ConvertFromRGB using the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef unsigned XieColorspace; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieColorspace color_space; + XiePointer color_param; + } ConvertFromRGB; + ... + } data; +} XiePhotoElement; + +/* Definitions for Colorspace Conversions */ +#define xieValRGBToCIELab 2 +#define xieValRGBToCIEXYZ 4 +#define xieValRGBToYCbCr 6 +#define xieValRGBToYCC 8 +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloMatch src is not triple band or +unequal inter-band dimensions +xieErrNoFloSource Invalid src +xieErrNoFloTechnique Invalid color_space or color_param +See Also +XieFloConvertToRGB, XieTecRGBToCIELab, XieTecRGBToCIEXYZ, XieTecRGBToYCbCr, +XieTecRGBToYCC + XIElib - Photoflo Element Functions XieFloConvertToIndex +Name +XieFloConvertToIndex - specify a ConvertToIndex element and set its parameters +Syntax +void XieFloConvertToIndex (element, src, colormap, color_list, +notify, color_alloc_tech, color_alloc_param) +XiePhotoElement *element; +XiePhototag src; +Colormap colormap; +XieColorList color_list; +Bool notify; +XieColorAllocTechnique color_alloc_tech; +XiePointer color_alloc_param; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying the constrained source data. +colormap Specifies the Colormap from which to obtain output pixel values. +color_list Specifies the list where Colormap indices are to be stored. +notify Specifies whether to enable sending ColorAlloc events. +color_alloc_tech Specifies the desired color allocation technique. +color_alloc_param Specifies the list of additional parameters required by +color_alloc_tech. +Description +A ConvertToIndex element allocates and/or matches colors or gray shades, as required, from a +Colormap. It produces pixel indices as output data, and records indices that it allocates in +color_list. + +The specified color_alloc_tech technique may generate a ColorAlloc event to warn the +client that results are of lesser fidelity than desired. Notify allows the client to be notified about +inferior results from color allocation or matching. + +src is the phototag of the element supplying constrained source data. A phototag is the position or +index of an element within an array of elements used to specify a photoflo; the first element in the +array has a phototag value of one (1). Colormap is the Colormap from which colors or gray shades +are allocated and/or matched. Color_list is the list where allocated Colormap indices are to be stored. +color_alloc_tech specifies the desired color allocation technique. color_alloc_params is +the list of additional parameters required by color_alloc_tech. + +color_list is purged of any colors it already contains when photoflo execution begins. Allocated +Colormap indices can be freed using XiePurgeColorList, XieDestroyColorList, or by +making color_list the target of an active photoflo. Care must be taken to ensure that +color_list is not referenced by more than one executing photoflo at any time; it is a protocol +error to allow more than one executing photoflo access the same color_list. + +ColorAlloc techniques define the recognized color allocation techniques used by the ConvertToIndex +element. One of the following standard ColorAlloc technique values can be assigned to +color_alloc_tech: + +xieValColorAllocDefault +xieValColorAllocAll +xieValColorAllocMatch +xieValColorAllocRequantize + +If a vendor defined additional private ColorAlloc techniques, the private technique values given to +these techniques can be assigned to color_alloc_tech. + +The server is required to support the default technique that is bound to one of the standard techniques +defined or a private technique. +Output Attributes +Class single band +Type constrained +Width same as src +Height same as src +Levels 2depth (that is, colormap depth) +Structures +XieFloConvertToIndex sets the XiePhotoElement structure field elemType to +xieElemConvertToIndex, which identifies the element as a ConvertToIndex, and sets the fields +of the member structure ConvertToIndex using the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef XID XieColorList; +typedef unsigned XieColorAllocTechnique; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + Colormap colormap; + XieColorList color_list; + Bool notify; + XieColorAllocTechnique color_alloc_tech; + XiePointer color_alloc_param; + } ConvertToIndex; + ... + } data; +} XiePhotoElement; + +/* Definitions for ColorAlloc Techniques */ +#define xieValColorAllocDefault 0 +#define xieValColorAllocAll 2 +#define xieValColorAllocMatch 4 +#define xieValColorAllocRequantize 6 +Errors +xieErrNoFloAccess color_list already being used by another active photoflo +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloColorlist Invalid color_list +xieErrNoFloColormap Invalid colormap +xieErrNoFloMatch Unequal inter-band dimensions +xieErrNoFloSource Invalid src +xieErrNoFloTechnique Invalid color_alloc_tech or color_alloc_param +See Also +XieCreateColorList, XiePurgeColorList, XieDestroyColorList +XieTecColorAllocAll, XieTecColorAllocMatch, XieTecColorAllocRequantize + XIElib - Photoflo Element Functions XieFloConvertToRGB +Name +XieFloConvertToRGB - specify a ConvertToRGB element and set its parameters +Syntax +void XieFloConvertToRGB (element, src, color_space, color_param) +XiePhotoElement *element; +XiePhototag src; +XieColorspace color_space; +XiePointer color_param; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +color_space Specifies the technique that will be used for the conversion. +color_param Specifies the list of additional parameters required by color_space. +Description +A ConvertToRGB element converts alternate colorspace source data into RGB data. + +The source data must be triple band, and all bands must have equal dimensions. The type and levels +of the output data are determined by the color_space's technique parameters. All other attributes +are inherited from src. + +ConvertToRGB techniques define the trichromatic colorspaces known to a ConvertToRGB element. +One of the following standard ConvertFromRGB technique values can be assigned to +color_space: + +xieValCIELabToRGB +xieValCIEXYZToRGB +xieValYCbCrToRGB +xieValYCCToRGB + +If a vendor defined additional private ConvertToRGB techniques, the private technique values given +to these techniques can be assigned to color_space. +Output Attributes +Class triple band +Type color_space dependent +Width same as src +Height same as src +Levels color_space dependent +Structures +XieFloConvertToRGB sets the XiePhotoElement structure field elemType to +xieElemConvertToRGB, which identifies the element as a ConvertToRGB, and sets the fields of +the member structure ConvertToRGB using the arguments in the argument list. + +typedef unsigned XieColorspace; +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieColorspace color_space; + XiePointer color_param; + } ConvertToRGB; + ... + } data; +} XiePhotoElement; + +/* Definitions for Colorspace Conversions */ +#define xieValCIELabToRGB 2 +#define xieValCIEXYZToRGB 4 +#define xieValYCbCrToRGB 6 +#define xieValYCCToRGB 8 +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloMatch src is not triple band or +unequal inter-band dimensions +xieErrNoFloSource Invalid src +xieErrNoFloTechnique Invalid color_space or color_param +See Also +XieTecCIELabToRGB, XieTecCIEXYZToRGB, XieTecYCbCrToRGB, XieTecYCCToRGB, +XieConvertFromRGB + XIElib - Photoflo Element Functions XieFloConvolve +Name +XieFloConvolve - specify a Convolve element and set its parameters +Syntax +void XieFloConvolve (element, src, domain, kernel, kernel_size, +band_mask, convolve_tech, convolve_param) +XiePhotoElement *element; +XiePhototag src; +XieProcessDomain *domain; +float *kernel; +int kernel_size; +unsigned int band_mask; +XieConvolveTechnique convolve_tech; +XiePointer convolve_param; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +domain Specifies the subset of the image that will be operated on. +kernel Specifies the coefficients used in the convolution process. +kernel_size Specifies the dimension of kernel. +band_mask Specifies which bands are to be operated on. +convolve_tech Specifies the technique for handling edge conditions. +convolve_param Specifies the list of additional parameters required by +convolve_tech. +Description +A Convolve element produces output data by convolving each input pixel value (and surrounding +area) with the specified convolution kernel. + +In order to specify a subset of source data that will be operated on, the phototag, offset_x, and +offset_y fields of the XieProcessDomain structure pointed to by domain must be supplied; +XIElib does not provide a convenience function to create and/or fill in an XieProcessDomain +structure. If the entire source data is to be operated on, a pointer to an XieProcessDomain +structure must still be provided, with the phototag field set to zero (0); the offset_x and +offset_y fields are ignored. + +kernel represents a square array of float data that has odd dimensions. Thus, a single dimension is +used to specify kernel_size. + +Only bands selected by the band_mask are subject to processing. Other bands present in the image +are passed through to the output. For example, a band_mask of 0012 indicates that only the least +significant band would be processed; operating on all bands requires a band_mask of 1112. Using +band_mask to select source data that have two (2) or less levels is not permitted. + +All output data attributes are inherited from the source data. + +Convolve techniques provide various methods of handling edge conditions. These techniques +determine what pixel values are used when Convolve requires data beyond the image bounds. One of +the following standard convolve technique values can be assigned to convolve_tech: + +xieValConvolveDefault +xieValConvolveConstant +xieValConvolveReplicate + +If a vendor defined additional private convolve techniques, the private technique values given to these +techniques can be assigned to convolve_tech. + +The server is required to support the default technique that is bound to one of the standard techniques +defined above or a private technique. +Output Attributes +Class same as src +Type same as src +Width same as src +Height same as src +Levels same as src +Structures +XieFloConvolve sets the XiePhotoElement structure field elemType to +xieElemConvolve, which identifies the element as a Convolve, and sets the fields of the member +structure Convolve using the arguments in the argument list. + +typedef unsigned XieConvolveTechnique; +typedef unsigned XiePhototag; +typedef struct { + int offset_x; + int offset_y; + XiePhototag phototag; +} XieProcessDomain; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieProcessDomain domain; + float *kernel; + int kernel_size; + unsigned int band_mask; + XieConvolveTechnique convolve_tech; + XiePointer convolve_param; + } Convolve; + ... + } data; +} XiePhotoElement; + +/* Definitions for ConvolveTechniques */ +#define xieValConvolveDefault 0 +#define xieValConvolveConstant 2 +#define xieValConvolveReplicate 4 +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloDomain Invalid domain +xieErrNoFloMatch Selected source data are bitonal +xieErrNoFloSource Invalid src +xieErrNoFloTechnique Invalid convolve_tech or convolve_param +xieErrNoFloValue Invalid kernel_size (for example, not odd) +See Also +XieTecConvolveConstant + XIElib - Photoflo Element Functions XieFloDither +Name +XieFloDither - specify a Dither element and set its parameters +Syntax +void XieFloDither (element, src, band_mask, levels, dither_tech, +dither_param) +XiePhotoElement *element; +XiePhototag src; +unsigned int band_mask; +XieLevels levels; +XieDitherTechnique dither_tech; +XiePointer dither_param; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +band_mask Specifies which bands are to be operated on. +levels Specifies the number of levels desired in the output data. +dither_tech Specifies the desired dither technique. +dither_param Specifies the list of additional parameters required by dither_tech. +Description +The Dither element is used to reduce the number of quantization levels in an image. It accomplishes +this by affecting adjacent pixels (area affect) to make up for the lack of depth resolution. + +Only bands selected by the band_mask are subject to processing. Other bands present in the image +are passed through to the output. For example, a band_mask of 0012 indicates that only the least +significant band would be processed; operating on all bands requires a band_mask of 1112. Using +band_mask to select source data that have two (2) or less levels is not permitted. + +The source data must be constrained. + +Dither techniques define the technique that can be used to dither an image. One of the following +standard dither technique values can be assigned to dither_tech: + +xieValDitherDefault +xieValDitherErrorDiffusion +xieValDitherOrdered + +If a vendor defined additional private dither techniques, the private technique values given to these +techniques can be assigned to dither_tech. + +The server is required to support the default technique that is bound to one of the standard techniques +defined or a private technique. +Output Attributes +Class same as src +Type constrained +Width same as src +Height same as src +Levels levels +Structures +XieFloDither sets the XiePhotoElement structure field elemType to xieElemDither, +which identifies the element as a Dither, and sets the fields of the member structure Dither using +the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef unsigned long XieLevels[3]; +typedef unsigned XieDitherTechnique; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieLevels levels; + unsigned int band_mask; + XieDitherTechnique dither_tech; + XiePointer dither_param; + } Dither; + ... + } data; +} XiePhotoElement; + +/* Definitions for DitherTechniques */ +#define xieValDitherDefault 0 +#define xieValDitherErrorDiffusion 2 +#define xieValDitherOrdered 4 +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloDomain Invalid domain +xieErrNoFloMatch Unconstrained src data or +selected source data are bitonal +xieErrNoFloSource Invalid src +xieErrNoFloTechnique Invalid dither_tech or dither_param +xieErrNoFloValue Invalid output levels: less than two or greater than src levels +See Also +XieTecDitherOrdered + XIElib - Photoflo Element Functions XieFloGeometry +Name +XieFloGeometry - specify a Geometry element and set its parameters +Syntax +void XieFloGeometry (element, src, width, height, coefficients, +constant, band_mask, sample_tech, sample_param) +XiePhotoElement *element; +XiePhototag src; +unsigned int width; +unsigned int height; +float coefficients[6]; +XieConstant constant; +unsigned int band_mask; +XieGeometryTechnique sample_tech; +XiePointer sample_param; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +width Specifies the horizontal dimension of the output data. +height Specifies the vertical dimension of the output data. +coefficients Specifies an affine transformation to be applied to pixels in src. +constant Specifies the fill value used for output pixels that do not map back to a +src pixel. +band_mask Specifies which bands are to be operated on. +sample_tech Specifies the technique to be used for retrospectively resampling src. +sample_param Specifies the list of additional parameters required by sample_tech. +Description +A Geometry element is used to perform geometric transformations on image data. Linear geometric +resampling operations are implemented, such as: crop, mirror, scale, shear, rotate, translate, and +combinations thereof. + +A Geometry element can be visualized as stepping through each possible output pixel location in turn +and computing the location from which to obtain each input pixel value. Each pixel (x',y') in the +output image is mapped to the coordinate location (x,y) in src by: + + + +The coordinate mapping coefficients (a,b,c,d,tx,ty), together with the output width and +height, fully specify the geometric transformation. The following briefly (and approximately) +summarizes the intuitive role of each parameter: + +a, d Scaling parameters. Increasing a and d will make the output image appear smaller, +whereas decreasing them will make the output pixels appear larger. +b, c Rotation/skew parameters. If b and c are zero, the output image will be a rectangular +scaling of the input image. If a and d are both zero, b is one, and c is negative one, the +image will appear rotated. The magnitude of b and c will affect scaling as well if a and d +are zero. If more than two of (a,b,c,d) are nonzero, the effect is complicated. The image +may appear skewed and scaled. +tx, ty Translation parameters. Used to specify the offset between input and output coordinate +systems. +width, height These specify the output image dimensions of the selected band(s). Note that +increasing the output image height and width over the input image size will not by itself +cause magnification * if a and d are one (1) and b and c are zero (0), the output image +will have the same appearance as the input, except that the borders will shrink or +expand (as determined by width and height) and new areas of the image will be filled +with constant. + +The region to be cropped in the input image is implicitly defined by the dimensions of the output +image and the mapping from output to input coordinates. Depending on the size of the input and +output images, the amount of scaling specified, and the amount of translation in the mapping, pixels +in the output image may map off the edge of the input image and the constant value is used. + +Trichromatic image bands can be operated individually, all together, or in any combination, using +band_mask. Since applying the same (a,b,c,d,tx,ty) mapping to inputs with diverse sizes will specify +different transformations, operating on all bands in unison (band_mask of 1112) is most appropriate +if the dimensions of all bands are equal. + +Often a given output pixel location (x,y) will not correspond exactly to a single pixel in the input +image. The sample_tech technique is used to determine how the input data will be interpolated to +produce each output pixel value. One of the following standard geometry technique values can be +assigned to sample_tech: + +xieValGeomDefault +xieValGeomAntialias +xieValGeomAntialiasByArea +xieValGeomAntialiasByLPF +xieValGeomBilinearInterp +xieValGeomGaussian +xieValGeomNearestNeighbor + +If a vendor defined additional private geometry techniques, the private technique values given to these +techniques can be assigned to sample_tech. + +The server is required to support the default technique that is bound to one of the standard techniques +defined or a private technique. +Output Attributes +Class same as src +Type same as src +Width width +Height height +Levels same as src +Structures +XieFloGeometry sets the XiePhotoElement structure field elemType to +xieElemGeometry, which identifies the element as a Geometry, and sets the fields of the member +structure Geometry using the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef float XieConstant[3]; +typedef unsigned XieGeometryTechnique; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + unsigned int width; + unsigned int height; + float coefficients[6]; + XieConstant constant; + unsigned int band_mask; + XieGeometryTechnique sample_tech; + XiePointer sample_param; + } Geometry; + ... + } data; +} XiePhotoElement; + +/* Definitions for GeometryTechniques */ +#define xieValGeomDefault 0 +#define xieValGeomAntialias 2 +#define xieValGeomAntialiasByArea 4 +#define xieValGeomAntialiasByLPF 6 +#define xieValGeomBilinearInterp 8 +#define xieValGeomGaussian 10 +#define xieValGeomNearestNeighbor 12 +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloSource Invalid src +xieErrNoFloTechnique Invalid sample_tech or sample_param +xieErrNoFloValue Invalid coefficients +See Also +XieTecGeomAntialiasByArea, XieTecGeomAntialiasByLowpass, XieTecGeomGaussian, +XieTecGeomNearestNeighbor + XIElib - Photoflo Element Functions XieFloLogical +Name +XieFloLogical - specify a Logical element and set its parameters +Syntax +void XieFloLogical (element, src1, src2, domain, constant, operator, +band_mask) +XiePhotoElement *element; +XiePhototag src1; +XiePhototag src2; +XieProcessDomain *domain; +XieConstant constant; +unsigned long operator; +unsigned int band_mask; +Arguments +element Specifies the XiePhotoElement structure to use. +src1 Specifies the first data source. +src2 Specifies the second data source. +domain Specifies the subset of source data that will be operated on. +constant Specifies the constant data source. +operator Specifies the logical operator to be used. +band_mask Specifies which bands are to be operated on. +Description +A Logical element performs per-pixel bitwise operations on a single data source, or between two data +sources, or between a single data source and a constant. + +When two sources are involved, src1 and src2 are the phototags of the elements supplying source +data; constant is ignored. A phototag is the position or index of an element within an array of +elements used to specify a photoflo; the first element in the array has a phototag value of one (1). If +the operation is to involve a constant, src1 is one operand, src2 must be zero, and constant is +used as the other operand. + +In order to specify a subset of source data that will be operated on, the phototag, offset_x, and +offset_y fields of the XieProcessDomain structure pointed to by domain must be supplied; +XIElib does not provide a convenience function to create and/or fill in an XieProcessDomain +structure. If the entire source data is to be operated on, a pointer to an XieProcessDomain +structure must still be provided, with the phototag field set to zero (0); the offset_x and +offset_y fields are ignored. + +The value of operator matches the GC-function values defined by the core protocol specification +for CreateGC. The output of a Logical element is determined by the number of data sources and +operator: + +GC function +monadic operation +dyadic operation +Clear +0 +0 +And +constant AND src1 +src2 AND src1 +AndReverse +constant AND (NOT src1) +src2 AND (NOT src1) +Copy +constant +src2 +AndInverted +(NOT constant) AND src1 +(NOT src2) AND src1 +NoOp +src1 +src1 +Xor +constant XOR src1 +src2 XOR src1 +Or +constant OR src1 +src2 OR src1 +Nor +(NOT constant) AND (NOT src1) +(NOT src2) AND (NOT src1) +Equiv +(NOT constant) XOR src1 +(NOT src2) XOR src1 +Invert +NOT src1 +NOT src1 +OrReverse +constant OR (NOT src1) +src2 OR (NOT src1) +CopyInverted +NOT constant +NOT src2 +OrInverted +(NOT constant) OR src1 +(NOT src2) OR src1 +Nand +(NOT constant) OR (NOT src1) +(NOT src2) OR (NOT src1) +Set +1 +1 + +Only bands selected by the band_mask are subject to processing. Other bands present in the image +are passed through to the output. For example, a band_mask of 0012 indicates that only the least +significant band would be processed; operating on all bands requires a band_mask of 1112. +Output Attributes +Class same as src1 +Type constrained +Width same as src1 +Height same as src1 +Levels same as src1 +Structures +XieFloLogical sets the XiePhotoElement structure field elemType to +xieElemLogical, which identifies the element as a Logical, and sets the fields of the member +structure Logical using the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef float XieConstant[3]; +typedef struct { + int offset_x; + int offset_y; + XiePhototag phototag; +} XieProcessDomain; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src1; + XiePhototag src2; + XieProcessDomain domain; + XieConstant constant; + int operator; + unsigned int band_mask; + } Logical; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloDomain Invalid domain +xieErrNoFloMatch Class or levels differ between src1 and src2, or +levels is not a power of 2, or +src1 or src2 in not constrained +xieErrNoFloOperator Invalid operator +xieErrNoFloSource Invalid src1 or src2 + XIElib - Photoflo Element Functions XieFloMatchHistogram +Name +XieFloMatchHistogram - specify a MatchHistogram element and set its parameters +Syntax +void XieFloMatchHistogram (element, src, domain, shape, shape_param) +XiePhotoElement *element; +XiePhototag src; +XieProcessDomain *domain; +XieHistogramShape shape; +XiePointer shape_param; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +domain Specifies the subset of source data that will be operated on. +shape Specifies the form of the desired output data histogram. +shape_param Specifies the list of additional parameters required by shape. +Description +A MatchHistogram element produces output data that differ from the source data in terms of its pixel +value distribution, or histogram. It allows the client to specify the desired shape of the resulting data's +histogram (algorithmic description of resulting histogram shape). + +The source data must be constrained and single band, and it must have three or more levels. + +In order to specify a subset of source data that will be operated on, the phototag, offset_x, and +offset_y fields of the XieProcessDomain structure pointed to by domain must be supplied; +XIElib does not provide a convenience function to create and/or fill in an XieProcessDomain +structure. Only data that intersects with the subset specified by domain is included in the histogram, +and only that data will be affected in the result of the histogram matching operation: all other data +will pass through unchanged. If the entire source data is to be operated on, a pointer to an +XieProcessDomain structure must still be provided, with the phototag field set to zero (0); the +offset_x and offset_y fields are ignored. + +HistogramShape defines the various match-histogram shape techniques that can be requested by a +MatchHistogram element. One of the following standard match-histogram shape technique values +can be assigned to shape: + +xieValHistogramFlat +xieValHistogramGaussian +xieValHistogramHyperbolic + +If a vendor defined additional private match-histogram shape techniques, the private technique values +given to these techniques can be assigned to shape. +Output Attributes +Class single band +Type constrained +Width same as src +Height same as src +Levels same as src +Structures +XieFloMatchHistogram sets the XiePhotoElement structure field elemType to +xieElemMatchHistogram, which identifies the element as a MatchHistogram, and sets the fields +of the member structure MatchHistogram using the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef unsigned XieHistogramShape; +typedef struct { + int offset_x; + int offset_y; + XiePhototag phototag; +} XieProcessDomain; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieProcessDomain domain; + XieHistogramShape shape; + XiePointer shape_param; + } MatchHistogram; + ... + } data; +} XiePhotoElement; + +/* Definitions for GeometryTechniques */ +#define xieValGeomDefault 0 +#define xieValGeomAntialias 2 +#define xieValGeomAntialiasByArea 4 +#define xieValGeomAntialiasByLPF 6 +#define xieValGeomBilinearInterp 8 +#define xieValGeomGaussian 10 +#define xieValGeomNearestNeighbor 12 +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloDomain Invalid domain +xieErrNoFloMatch Invalid src data: unconstrained, triple band, or bitonal +xieErrNoFloSource Invalid src +xieErrNoFloTechnique Invalid shape or shape_param +See Also +XieTecHistogramGaussian, XieTecHistogramHyperbolic + XIElib - Photoflo Element Functions XieFloMath +Name +XieFloMath - specify a Math element and set its parameters +Syntax +void XieFloMath (element, src, domain, operator, band_mask) +XiePhotoElement *element; +XiePhototag src; +XieProcessDomain *domain; +XieMathOp operator; +unsigned int band_mask; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +domain Specifies the subset of source data that will be operated on. +operator Specifies the mathematical operation to be applied. +band_mask Specifies which bands are to be operated on. +Description +A Math element applies a single operand mathematical operation to the source data on a point-wise +basis. + +In order to specify a subset of source data that will be operated on, the phototag, offset_x, and +offset_y fields of the XieProcessDomain structure pointed to by domain must be supplied; +XIElib does not provide a convenience function to create and/or fill in an XieProcessDomain +structure. If the entire source data is to be operated on, a pointer to an XieProcessDomain +structure must still be provided, with the phototag field set to zero (0); the offset_x and +offset_y fields are ignored. + +Pixel computations that would lead to errors will yield valid server-dependent values (for example, +the log of a constrained pixel value of zero might result in a value of zero). Only bands selected by the +band_mask are subject to processing. Other bands present in the image are passed through to the +output. For example, a band_mask of 0012 indicates that only the least significant band would be +processed; operating on all bands requires a band_mask of 1112. Using band_mask to select +source data that have two (2) or less levels is not permitted. + +The following valid mathematical operations that can be invoked through the Math element: + +Operator +Meaning +xieValExp +exponential +xieValLn +natural logarithm +xieValLog2 +logarithm base 2 +xieValLog10 +logarithm base 10 +xieValSquare +square +xieValSqrt +square root + +All output data attributes are inherited from the source data. +Output Attributes +Class same as src +Type same as src +Width same as src +Height same as src +Levels same as src +Structures +XieFloMath sets the XiePhotoElement structure field elemType to xieElemMath, which +identifies the element as a Math, and sets the fields of the member structure Math using the +arguments in the argument list. + +typedef unsigned XiePhototag; +typedef unsigned XieMathOp; +typedef struct { + int offset_x; + int offset_y; + XiePhototag phototag; +} XieProcessDomain; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieProcessDomain domain; + XieMathOp operator; + unsigned int band_mask; + } Math; + ... + } data; +} XiePhotoElement; + +/* Definitions of Math Operators */ +#define xieValExp 1 +#define xieValLn 2 +#define xieValLog2 3 +#define xieValLog10 4 +#define xieValSquare 5 +#define xieValSqrt 6 +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloDomain Invalid domain +xieErrNoFloMatch Selected source data are bitonal +xieErrNoFloSource Invalid src +xieErrNoFloOperator Invalid operator + XIElib - Photoflo Element Functions XieFloPasteUp +Name +XieFloPasteUp - specify a PasteUp element and set its parameters +Syntax +void XieFloPasteUp (element, width, height, constant, tiles, +tile_count) +XiePhotoElement *element; +unsigned int width; +unsigned int height; +XieConstant constant; +XieTile *tiles +unsigned int tile_count; +Arguments +element Specifies the XiePhotoElement structure to use. +width Specifies the full horizontal extent of the output data. +height Specifies the full vertical extent of the output data. +constant Specifies the fill value for output regions that do not intersect the +regions defined in tiles. +tiles Specifies a list of tile descriptors. +tile_count Specifies the number of tile descriptors in tiles. +Description +A PasteUp element is an N-input translate operation that outputs data constructed from various source +data tiles or a constant value. + +Each of the tiles specifies a src (the phototag of the element supplying source data), and the +coordinates, dst_x and dst_y, where the tile belongs in the output data. A phototag is the position +or index of an element within an array of elements used to specify a photoflo; the first element in the +array has a phototag value of one (1). + +Each region of the output data is defined by a tile's destination coordinates, dst_x and dst_y, and +its src dimensions. For output regions where no tile provides input, the value of constant is used. +If tiles overlap, a stacking-order rule defines which pixel value will be output: the last tile involved in +the overlap in the list of tiles will provide the output pixel. + +At least one tile must be supplied. Except for width and height, all attributes of each source tile +must match. In addition, for triple band input, inter-band dimensions within each tiles must +match. +Output Attributes +Class same as tiles +Type same as tiles +Width width +Height height +Levels same as tiles +Structures +XieFloPasteUp sets the XiePhotoElement structure field elemType to +xieElemPasteUp, which identifies the element as a PasteUp, and sets the fields of the member +structure PasteUp using the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef float XieConstant[3]; +typedef struct { + XiePhototag src; + int dst_x; + int dst_y; +} XieTile; + +typedef struct { + int elemType; + union { + ... + struct { + unsigned int width; + unsigned int height; + XieConstant constant; + XieTile *tiles; + unsigned int tile_count; + } PasteUp; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloMatch Incompatible attributes between tiles or +unequal inter-band dimensions within a tile +xieErrNoFloSource Invalid source tiles or +no tiles were specified +See Also +XieFreePasteUpTiles + XIElib - Photoflo Element Functions XieFloPoint +Name +XieFloPoint - specify a Point element and set its parameters +Syntax +void XieFloPoint (element, src, domain, lut, band_mask) +XiePhotoElement *element; +XiePhototag src; +XieProcessDomain *domain; +XieLut lut; +unsigned int band_mask; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +domain Specifies the subset of source data that will be operated on. +lut Specifies the LUT resource supplying the lookup table. +band_mask Specifies which bands are to be operated on. +Description +A Point element maps source pixel values to output pixel values using a lookup table (LUT). + +src is the phototag of the element supplying constrained source data. A phototag is the position or +index of an element within an array of elements used to specify a photoflo; the first element in the +array has a phototag value of one (1). Lut is the phototag of the ImportClientLUT or ImportLUT +element supplying the lookup table data. + +In order to specify a subset of source data that will be operated on, the phototag, offset_x, and +offset_y fields of the XieProcessDomain structure pointed to by domain must be supplied; +XIElib does not provide a convenience function to create and/or fill in an XieProcessDomain +structure. If the entire source data is to be operated on, a pointer to an XieProcessDomain +structure must still be provided, with the phototag field set to zero (0); the offset_x and +offset_y fields are ignored. + +band_mask specifies which bands are to be operated on (all bands must be specified if lut is single +band and src is triple band). For example, a band_mask of 0012 indicates that only the least +significant band would be processed; operating on all bands requires a band_mask of 1112. + +The output is constrained, with the width and height taken from src and class and levels taken from +lut. When src is single band and lut is triple band, for the bands that are indicated by +band_mask, the output bands are remapped through their respective lut bands, whereas the other +bands are just replications of the single src band. If domain is used, the class and levels of lut +must match those of src. + +Each lut array must contain sufficient entries so that all potential pixel values found in src can +form a valid index into the array. Generally each src pixel value is used directly as an index into a +lut array. When triple band src data are remapped through a single band lut, however, pixel +values from all three src bands are combined to form an array index; for this case, width and height +must match for all bands. + +When a single band lut is used to remap triple band src data, the following presents the algorithm +for computing combined array indices: + +LUT band order +LUT indexing algorithm for combining pixel values +LSFirst +index = value[0] + value[1] x levels[0] + value[2] x levels[0] x levels[1] +MSFirst +index = value[2] + value[1] x levels[2] + value[0] x levels[2] x levels[1] +Output Attributes +Class same as lut +Type constrained +Width same as src +Height same as src +Levels same as lut +Structures +XieFloPoint sets the XiePhotoElement structure field elemType to xieElemPoint, +which identifies the element as a Point, and sets the fields of the member structure Point using the +arguments in the argument list. + +typedef XID XieLut; +typedef unsigned XiePhototag; +typedef struct { + int offset_x; + int offset_y; + XiePhototag phototag; +} XieProcessDomain; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieProcessDomain domain; + XieLut lut; + unsigned int band_mask; + } Point; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloDomain Invalid domain +xieErrNoFloMatch Unconstrained src data, or +lut does not contain enough entries, or +lut is single band and src is triple band, but band_mask is +incomplete, or +domain is being used, but lut class or levels do not match those of +src +xieErrNoFloSource Invalid src or lut +See Also +XieFloImportLUT, XieFloImportClientLUT + XIElib - Photoflo Element Functions XieFloUnconstrain +Name +XieFloUnconstrain - specify an unconstrain element and set its parameters +Syntax +void XieFloUnconstrain (element, src) +XiePhotoElement *element; +XiePhototag src; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying constrained source data. +Description +An Unconstrain element produces unconstrained output data from constrained input data. +Output Attributes +Class same as src +Type unconstrained +Width same as src +Height same as src +Levels unknown +Structures +XieFloUnconstrain sets the XiePhotoElement structure field elemType to +xieElemUnconstrain, which identifies the element as an Unconstrain, and sets the fields of the +member structure Unconstrain using the arguments in the argument list. + +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + } Unconstrain; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloMatch Unconstrained src data +xieErrNoFloSource Invalid src +See Also +XieFloConstrain + XIElib - Photoflo Element Functions XieFloExportClientHistogram +Name +XieFloExportClientHistogram - specify an ExportClientHistogram element and set its parameters +Syntax +void XieFloExportClientHistogram (element, src, domain, notify) +XiePhotoElement *element; +XiePhototag src; +XieProcessDomain *domain; +XieExportNotify notify; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying single band constrained source data. +domain Specifies the subset of the source data from which the distribution will +be generated. +notify Specifies whether to enable sending an ExportAvailable event. +Description +An ExportClientHistogram element generates a histogram of the pixel values found in the source +data. It prepares histogram data that can be retrieved by the client using XieGetClientData. An +event can be requested that will notify the client when histogram data becomes available. + +The data generated for the client is a list of XieHistogramData where each entry consists of a +value (that is, a pixel value) followed by the count of pixels found with that value. If the number of +pixels for a given value exceeds the capacity of count, that count will be returned at the maximum +value (that is, 232 - 1). Pixel values that are not found in the data are not included in the histogram +data: no entries are returned where count is zero. + +In order to specify a subset of source data that will be operated on, the phototag, offset_x, and +offset_y fields of the XieProcessDomain structure pointed to by domain must be supplied; +XIElib does not provide a convenience function to create and/or fill in an XieProcessDomain +structure. Only data that intersects with the subset specified by domain is included in the histogram. +If the entire source data is to be operated on, a pointer to an XieProcessDomain structure must +still be provided, with the phototag field set to zero (0); the offset_x and offset_y fields are +ignored. + +One of three standard export notify values can be assigned to notify: + +xieValDisable +xieValFirstData +xieValNewData + +If notify was specified as xieValFirstData, this event will be sent only the first time data +become available; otherwise, if xieValNewData was specified, this event will be generated each +time the amount of data available changes from zero to nonzero. +Structures +XieFloExportClientHistogram sets the XiePhotoElement structure field elemType to +xieElemExportClientHistogram, which identifies the element as an ExportClientHistogram, +and sets the fields of the member structure ExportClientHistogram using the arguments in the +argument list. + +typedef unsigned XieExportNotify; +typedef unsigned XiePhototag; +typedef struct { + int offset_x; + int offset_y; + XiePhototag phototag; +} XieProcessDomain; +typedef struct { + unsigned long value; + unsigned long count; +} XieHistogramData; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieProcessDomain domain; + XieExportNotify notify; + } ExportClientHistogram; + ... + } data; +} XiePhotoElement; + +/* Definitions of ExportNotify */ +#define xieValDisable 1 +#define xieValFirstData 2 +#define xieValNewData 3 +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloDomain Invalid domain +xieErrNoFloMatch Unconstrained src data or +triple band src data +xieErrNoFloSource Invalid src +xieErrNoFloValue Invalid notify +See Also +XieGetClientData + XIElib - Photoflo Element Functions XieFloExportClientLUT +Name +XieFloExportClientLUT - specify an ExportClientLUT element and set its parameters +Syntax +void XieFloExportClientLUT (element, src, band_order, notify, start, +length) +XiePhotoElement *element; +XiePhototag src; +XieOrientation band_order; +XieExportNotify notify; +XieLTriplet start; +XieLTriplet length; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying lookup table data. +band_order Specifies the order of triple band arrays. +notify Specifies whether to enable sending an ExportAvailable event. +start Specifies the index of the first array entry that should be returned. +length Specifies the number of array entries that should be returned. +Description +An ExportClientLUT element allows data imported from an ImportLUT or an ImportClientLUT +element to be retrieved by the client. The actual transport of lookup table data through the protocol +stream is requested using XieGetClientData. + +One of three standard export notify values can be assigned to notify: + +xieValDisable +xieValFirstData +xieValNewData + +If notify was specified as xieValFirstData, this event will be sent only the first time data +become available; otherwise, if xieValNewData was specified, this event will be generated each +time the amount of data available changes from zero to nonzero. + +band_order is the order in which triple band arrays are transmitted through the protocol stream. +One of the following standard orientation values can be assigned to band_order: + +xieValLSFirst +xieValMSFirst + +The least significant band of trichromatic data is the first band mentioned in the common name of the +colorspace: for example, red is the least significant band of RGB data. For band-by-plane data, +band_order specifies whether this band corresponds with the least significant or most significant +LUT array. Each array is transported as a separate data stream: + +band +LSFirst +MSFirst +0 +R7R6R5R4R3R2R1R0 +B7B6B5B4B3B2B1B0 +1 +G7G6G5G4G3G2G1G0 +G7G6G5G4G3G2G1G0 +2 +B7B6B5B4B3B2B1B0 +R7R6R5R4R3R2R1R0 + +The size of each array entry is either 1, 2, or 4 bytes: the smallest size into which the output +quantization levels can be stored. When array entries require multiple bytes, the byte order per entry +is determined in the same manner as other numeric data: it is the byte orientation established at core +X connection setup time. +Structures +XieFloExportClientLUT sets the XiePhotoElement structure field elemType to +xieElemExportClientLUT, which identifies the element as an ExportClientLUT, and sets the +fields of the member structure ExportClientLUT using the arguments in the argument list. + +typedef unsigned XieExportNotify; +typedef unsigned XieOrientation; +typedef unsigned long XieLTriplet[3]; +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieOrientation band_order; + XieExportNotify notify; + XieLTriplet start; + XieLTriplet length; + } ExportClientLUT; + ... + } data; +} XiePhotoElement; + +/* Definitions of ExportNotify */ +#define xieValDisable 1 +#define xieValFirstData 2 +#define xieValNewData 3 + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloMatch start + length exceeds number of entries in an array +xieErrNoFloSource Invalid src +xieErrNoFloValue Invalid notify or band_order +See Also + XieFloImportLUT, XieFloImportClientLUT, XieGetClientData + XIElib - Photoflo Element Functions XieFloExportClientPhoto +Name +XieFloExportClientPhoto - specify an ExportClientPhoto element and set its parameters +Syntax +void XieFloExportClientPhoto (element, src, notify, encode_tech, +encode_param) +XiePhotoElement *element; +XiePhototag src; +XieExportNotify notify; +XieEncodeTechnique encode_tech; +XiePointer encode_param; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying constrained data. +notify Specifies whether to enable sending an ExportAvailable event. +encode_tech Specifies the technique to compress or format the exported data. +encode_param Specifies the list of additional parameters required by encode_tech. +Description +An ExportClientPhoto element makes image data available to the protocol stream. The attributes of +the exported data are determined by the attributes of the source data. The format of the data is +specified by the encode_tech technique and encode_param. The actual transport of image data +through the protocol stream is requested using XieGetClientData. + +One of three standard export notify values can be assigned to notify: + +xieValDisable +xieValFirstData +xieValNewData + +If notify was specified as xieValFirstData, this event will be sent only the first time data +become available; otherwise, if xieValNewData was specified, this event will be generated each +time the amount of data available changes from zero to nonzero. + +Encode techniques define the techniques that can be used to compress an image or format it as +uncompressed data. One of the following standard encode technique values can be assigned to +encode_tech: + +xieValEncodeServerChoice +xieValEncodeUncompressedSingle +xieValEncodeUncompressedTriple +xieValEncodeG31D +xieValEncodeG32D +xieValEncodeG42D +xieValEncodeJPEGBaseline +xieValEncodeJPEGLossless +xieValEncodeTIFF2 +xieValEncodeTIFFPackBits + +If a vendor defined additional private encode techniques, the private technique values given to these +techniques can be assigned to encode_tech. +Structures +XieFloExportClientPhoto sets the XiePhotoElement structure field elemType to +xieElemExportClientPhoto, which identifies the element as an ExportClientPhoto, and sets +the fields of the member structure ExportClientPhoto using the arguments in the argument list. + +typedef unsigned XieExportNotify; +typedef unsigned XiePhototag; +typedef unsigned XieEncodeTechnique; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieExportNotify notify; + XieEncodeTechnique encode_tech; + XiePointer encode_param; + } ExportClientPhoto; + ... + } data; +} XiePhotoElement; + +/* Definitions of ExportNotify */ +#define xieValDisable 1 +#define xieValFirstData 2 +#define xieValNewData 3 + +/* Definitions for EncodeTechniques */ +#define xieValEncodeServerChoice 1 +#define xieValEncodeUncompressedSingle 2 +#define xieValEncodeUncompressedTriple 3 +#define xieValEncodeG31D 4 +#define xieValEncodeG32D 6 +#define xieValEncodeG42D 8 +#define xieValEncodeJPEGBaseline 10 +#define xieValEncodeJPEGLossless 12 +#define xieValEncodeTIFF2 14 +#define xieValEncodeTIFFPackBits 16 +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloMatch Unconstrained src data +xieErrNoFloSource Invalid src +xieErrNoFloTechnique Invalid encode_tech or encode_param +xieErrNoFloValue Invalid notify +See Also +XieGetClientData, XieFloExportClientPhoto, +XieTecEncodeUncompressedSingle, XieTecEncodeUncompressedTriple, XieTecEncodeG31D, +XieTecEncodeG32D, XieTecEncodeG42D, XieTecEncodeServerChoice, +XieTecEncodeJPEGBaseline, XieTecEncodeJPEGLossless, XieTecEncodeTIFF2, +XieTecEncodeTIFFPackBits + XIElib - Photoflo Element Functions XieFloExportClientROI +Name +XieFloExportClientROI - specify an ExportClientROI element and set its parameters +Syntax +void XieFloExportClientROI (element, src, notify) +XiePhotoElement *element; +XiePhototag src; +XieExportNotify notify; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying the list-of-rectangles. +notify Specifies whether to enable sending an ExportAvailable event. +Description +An ExportClientROI element allows a list-of-rectangles, imported using an ImportROI or an +ImportClientROI element, to be retrieved by the client. The actual transport of list-of-rectangles data +through the protocol stream is requested using a GetClientData element. + +One of three standard export notify values can be assigned to notify: + +xieValDisable +xieValFirstData +xieValNewData + +If notify was specified as xieValFirstData, this event will be sent only the first time data +become available; otherwise, if xieValNewData was specified, this event will be generated each +time the amount of data available changes from zero to nonzero. +Structures +XieFloExportClientROI sets the XiePhotoElement structure field elemType to +xieElemExportClientROI, which identifies the element as an ExportClientROI, and sets the +fields of the member structure ExportClientROI using the arguments in the argument list. + +typedef unsigned XieExportNotify; +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieExportNotify notify; + } ExportClientROI; + ... + } data; +} XiePhotoElement; + +/* Definitions of ExportNotify */ +#define xieValDisable 1 +#define xieValFirstData 2 +#define xieValNewData 3 +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloSource Invalid src +xieErrNoFloValue Invalid notify +See Also +XieFloImportROI, XieFloImportClientROI, XieGetClientData + XIElib - Photoflo Element Functions XieFloExportDrawable +Name +XieFloExportDrawable - specify an ExportDrawable element and set its parameters +Syntax +void XieFloExportDrawable (element, src, drawable, gc, dst_x, dst_y) +XiePhotoElement *element; +XiePhototag src; +Drawable drawable; +GC gc; +int dst_x; +int dst_y; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying constrained source data. +drawable Specifies the Window or Pixmap into which the data will be written. +gc Specifies the GContext to be used when transferring pixels to +drawable. +dst_x Specifies where the data should be placed in drawable. +dst_y Specifies where the data should be placed in drawable. +Description +An ExportDrawable element allows Colormap index data to be exported to a Window or Pixmap. + +The following components are used from gc: function, plane-mask, subwindow-mode, clip-x-origin, +clip-y-origin, and clip-mask. + +The levels of src must exactly match the depth of drawable and gc (that is, levels must be +2depth). +Structures +XieFloExportDrawable sets the XiePhotoElement structure field elemType to +xieElemExportDrawable, which identifies the element as an ExportDrawable, and sets the +fields of the member structure ExportDrawable using the arguments in the argument list. + +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + Drawable drawable; + GC gc; + int dst_x; + int dst_y; + } ExportDrawable; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloDrawable Invalid drawable +xieErrNoFloGC Invalid gc +xieErrNoFloMatch Invalid src data: triple band, unconstrained, levels does not match +depth +xieErrNoFloSource Invalid src +See Also +XieFloExportDrawablePlane + XIElib - Photoflo Element Functions XieFloExportDrawablePlane +Name +XieFloExportDrawablePlane - specify an ExportDrawablePlane element and set its parameters +Syntax +void XieFloExportDrawablePlane (element, src, drawable, gc, dst_x, +dst_y) +XiePhotoElement *element; +XiePhototag src; +Drawable drawable; +GC gc; +int dst_x; +int dst_y; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying constrained bitonal source data. +drawable Specifies the Window or Pixmap into which the data will be written. +gc Specifies the GContext to be used when transferring pixels to +drawable. +dst_x Specifies where the data should be placed in drawable. +dst_y Specifies where the data should be placed in drawable. +Description +An ExportDrawablePlane element allows single-band single-bit (bitonal) data to be exported to a +Window or a Pixmap. + +The following components are used from gc: function, plane-mask, foreground, background, fill- +style, subwindow-mode, clip-x-origin, clip-y-origin, and clip-mask. For the fill-style component of +gc, values of FillSolid and FillTiled are treated as synonyms for FillOpaqueStippled. +Structures +XieFloExportDrawablePlane sets the XiePhotoElement structure field elemType to +xieElemExportDrawablePlane, which identifies the element as an ExportDrawablePlane, and +sets the fields of the member structure ExportDrawablePlane using the arguments in the +argument list. + +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + Drawable drawable; + GC gc; + int dst_x; + int dst_y; + } ExportDrawablePlane; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloDrawable Invalid drawable +xieErrNoFloGC Invalid gc +xieErrNoFloMatch Invalid src data: triple band, not constrained, levels > 2 +xieErrNoFloSource Invalid src +See Also +XieFloExportDrawable + XIElib - Photoflo Element Functions XieFloExportLUT +Name +XieFloExportLUT - specify an ExportLUT element and set its parameters +Syntax +void XieFloExportLUT (element, src, lut, merge, start) +XiePhotoElement *element; +XiePhototag src; +XieLut lut; +Bool merge; +XieLTriplet start; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying lookup table data. +lut Specifies the ID of the LUT to receive the data. +merge Specifies how new array entries replace existing entries. +start Specifies the index of the first array entry that should be written in +lut, per band. +Description +An ExportLUT element allows data imported from an ImportLUT or ImportClientLUT element to be +saved in an existing LUT resource. + +merge specifies that new array entries from src should replace entries that already exist within +lut. If merge is False, start must be zero for each band. In this case, lut will inherit the +attributes of src and be populated with its data; the previous attributes and data of lut are +overwritten when the photoflo completes. If merge is True and lut has existing attributes, the +data from src will replace the data from lut, beginning at position start. If merge is True,but +lut has not yet been populated, it is an error. + +The attributes of src must match those of lut, and the combination of start and the length of +src must specify a valid subrange existing within lut. +Structures +XieFloExportLUT sets the XiePhotoElement structure field elemType to +xieElemExportLUT, which identifies the element as an ExportLUT, and sets the fields of the +member structure ExportLUT using the arguments in the argument list. + +typedef XID XieLut; +typedef unsigned long XieLTriplet[3]; +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieLut lut; + Bool merge; + XieLTriplet start; + } ExportLUT; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloLUT Invalid lut +xieErrNoFloMatch merge true and attributes do not match between src and lut, or +merge true and start + src length is not a subrange of lut +xieErrNoFloSource Invalid src +xieErrNoFloValue merge false and start nonzero +See Also +XieFloImportLUT, XieFloImportClientLUT + XIElib - Photoflo Element Functions XieFloExportPhotomap +Name +XieFloExportPhotomap - specify an ExportPhotomap element and set its parameters +Syntax +void XieFloExportPhotomap (element, src, photomap, encode_tech, +encode_param) +XiePhotoElement *element; +XiePhototag src; +XiePhotomap photomap; +XieEncodeTechnique encode_tech; +XiePointer encode_param; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +photomap Specifies the ID of the photomap resource to receive the data. +encode_tech Specifies the image compression or formatting technique. +encode_param Specifies the list of additional parameters required by encode_tech. +Description +An ExportPhotomap element allows data from photoflo operations to be saved in a photomap. A +photomap is a server resource that can be used to store image data. + +photomap will inherit the attributes of src and be populated with its data. The previous attributes +and data of photomap are overwritten when the photoflo completes. + +Encode techniques define the techniques that can be used to compress an image or format it as +uncompressed data. One of the following standard encode technique values can be assigned to +encode_tech: + +xieValEncodeServerChoice +xieValEncodeUncompressedSingle +xieValEncodeUncompressedTriple +xieValEncodeG31D +xieValEncodeG32D +xieValEncodeG42D +xieValEncodeJPEGBaseline +xieValEncodeJPEGLossless +xieValEncodeTIFF2 +xieValEncodeTIFFPackBits + +If a vendor defined additional private encode techniques, the private technique values given to these +techniques can be assigned to encode_tech. +Structures +XieFloExportPhotomap sets the XiePhotoElement structure field elemType to +xieElemExportPhotomap, which identifies the element as an ExportPhotomap, and sets the +fields of the member structure ExportPhotomap using the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef XID XiePhotomap; +typedef unsigned XieEncodeTechnique; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XiePhotomap photomap; + XieEncodeTechnique encode_tech; + XiePointer encode_param; + } ExportPhotomap; + ... + } data; +} XiePhotoElement; + +/* Definitions for EncodeTechniques */ +#define xieValEncodeServerChoice 1 +#define xieValEncodeUncompressedSingle 2 +#define xieValEncodeUncompressedTriple 3 +#define xieValEncodeG31D 4 +#define xieValEncodeG32D 6 +#define xieValEncodeG42D 8 +#define xieValEncodeJPEGBaseline 10 +#define xieValEncodeJPEGLossless 12 +#define xieValEncodeTIFF2 14 +#define xieValEncodeTIFFPackBits 16 +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloPhotomap Invalid photomap +xieErrNoFloSource Invalid src +xieErrNoFloTechnique Invalid encode_tech or encode_param +See Also +XieTecEncodeUncompressedSingle, XieTecEncodeUncompressedTriple, XieTecEncodeG31D, +XieTecEncodeG32D, XieTecEncodeG42D, XieTecEncodeServerChoice, +XieTecEncodeJPEGBaseline, XieTecEncodeTIFF2, XieTecEncodeTIFFPackBits + XIElib - Photoflo Element Functions XieFloExportROI +Name +XieFloExportROI - specify an ExportROI element and set its parameters +Syntax +void XieFloExportROI (element, src, roi) +XiePhotoElement *element; +XiePhototag src; +XieRoi roi; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying a list-of-rectangles. +roi Specifies the ID of the ROI resource to receive the data. +Description +An ExportROI element allows data imported from an ImportROI or ImportClientROI element to be +saved in an existing Rectangles-Of-Interest (ROI) resource. + +roi will be populated with new data. The previous data of roi are overwritten after the photoflo +completes. +Structures +XieFloExportROI sets the XiePhotoElement structure field elemType to +xieElemExportROI, which identifies the element as an ExportROI, and sets the fields of the +member structure ExportROI using the arguments in the argument list. + +typedef XID XieRoi; +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieRoi roi; + } ExportROI; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (for example, memory) +xieErrNoFloROI Invalid roi +xieErrNoFloSource Invalid src +See Also +XieFloImportROI, XieFloImportClientROI + XIElib - Technique Functions XieTecColorAllocAll +Name +XieTecColorAllocAll - allocate and fill an XieColorAllocAllParam structure +Syntax +XieColorAllocAllParam *XieTecColorAllocAll (fill) +unsigned long fill; +Arguments +fill Specifies thefill value to use for pixels which cannot be allocated. +Returns +The XieColorAllocAllParam structure. +Description +XieTecColorAllocAll allocates and returns a pointer to an XieColorAllocAllParam +structure. The returned structure represents the list of parameters required by the AllocAll color +allocation technique and may be used as the color_alloc_param argument of +XieFloConvertToIndex (when the color_alloc_tech argument is +xieValColorAllocAll). + +If insufficient memory is available, XieTecColorAllocAll returns NULL. To free the memory +allocated to this structure, use XFree. + +The AllocAll color allocation technique allocates a read-only Colormap cell for each new pixel found. +If the Colormap runs out of cells, the remaining new pixels are mapped to fill. A ColorAlloc +event, which warns the client that results are of lesser fidelity than desired, will be sent if it is +necessary to use fill, and the client has requested it (see XieFloConvertToIndex). AllocAll is +appropriate only for dynamic Colormaps and requires that the number of discrete image pixels fit +within the size of the Colormap to avoid running out of cells. +Structures +XieTecColorAllocAll sets the structure field fill to the value of the argument fill. + +typedef struct { + unsigned long fill; +} XieColorAllocAllParam; +See Also +XieFloConvertToIndex + XIElib - Technique Functions XieTecColorAllocMatch +Name +XieTecColorAllocMatch - allocate and fill an XieColorAllocMatchParam structure +Syntax +XieColorAllocMatchParam *XieTecColorAllocMatch (match_limit, +gray_limit) +double match_limit; +double gray_limit; +Arguments +match_limit Specifies the color allocation control value. +gray_limit Specifies the gray scale allocation control value. +Returns +The XieColorAllocMatchParam structure. +Description +XieTecColorAllocMatch allocates and returns a pointer to an +XieColorAllocMatchParam structure. The returned structure represents the list of parameters +required by the AllocMatch color allocation technique and may be used as the +color_alloc_param argument of XieFloConvertToIndex (when the +color_alloc_tech argument is xieValColorAllocMatch). + +If insufficient memory is available, XieTecColorAllocMatch returns NULL. To free the +memory allocated to this structure, use XFree. + +The AllocMatch color allocation technique allows a trade-off between image fidelity and Colormap +usage via a pair of granularity parameters. The highest priority is given to allocating read-only cells +in a sequence that provides an even distribution of pixels throughout the colorspace. Secondary +priority is given to the frequency of usage of image pixels. Any image pixel that is a close enough +match to an existing read-only cell will share that cell (where close is determined by the granularity +controls). For other image pixels, new read-only allocations are made. When no more cells are +available, each remaining image pixel is matched to the closest read-only cell. The AllocMatch color +allocation technique is appropriate for both static and dynamic Colormaps. For the sake of +computational efficiency the number of discrete image pixels should not exceed the size of the +Colormap. + +match_limit and gray_match control the allocation of colors and gray shades, respectively. The +minimum value (0.0) specifies exact matches (within the limits of the Colormap). The maximum +value (1.0) encompasses the entire colorspace within which no new cells are allocated. A +ColorAlloc event, which warns the client that results are of lesser fidelity than desired, can be +sent if the Colormap runs out of cells. +Structures +XieTecColorAllocMatch sets the structure field match_limit to the value of the argument +match_limit; and the structure field gray_limit to the value of the argument gray_limit. + +typedef struct { + float match_limit; + float gray_limit; +} XieColorAllocMatchParam; +See Also +XieFloConvertToIndex + XIElib - Technique Functions XieTecColorAllocRequantize +Name +XieTecColorAllocRequantize - allocate and fill an XieColorAllocRequantizeParam structure +Syntax +XieColorAllocRequantizeParam *XieTecColorAllocRequantize (max_cells) +unsigned long max_cells; +Arguments +max_cells Specifies the maximum number of Colormap allocations to allow. +Returns +The XieColorAllocRequantizeParam structure. +Description +XieTecColorAllocRequantize allocates and returns a pointer to an +XieColorAllocRequantizeParam structure. The returned structure represents the list of +parameters required by the AllocRequantize color allocation technique and may be used as the +color_alloc_param argument of XieFloConvertToIndex (when the +color_alloc_tech argument is xieValColorAllocRequantize). + +If insufficient memory is available, XieTecColorAllocRequantize returns NULL. To free the +memory allocated to this structure, use XFree. + +The AllocRequantize color allocation technique first reduces the total number of discrete pixel values +in the image to be no more than a specified number and then allocates the resulting pixel values as +read-only cells from the Colormap. One method of accomplishing this reduction process can be found +in "Color image quantization for frame buffer display" (Heckbert, P. S., Comput. Graph. 16, 3). + +If max_cells is zero or greater than the number of unallocated Colormap cells, the reduction +algorithm will restrict its output to the number of free cells. A ColorAlloc event, which warns the +client that results are of lesser fidelity than desired, can be sent if the number of pixels had to be +restricted to a lesser number than max_cells because of a lack of free Colormap cells. The +AllocRequantize color allocation technique is appropriate only for dynamic Colormaps. +Structures +XieTecColorAllocRequantize sets the structure field max_cells to the value of the +argument max_cells. + +typedef struct { + unsigned long max_cells; +} XieColorAllocRequantizeParam; +See Also +XieFloConvertToIndex + XIElib - Technique Functions XieTecRGBToCIELab +Name +XieTecRGBToCIELab - allocate and fill an XieRGBToCIELabParam structure +Syntax +XieRGBToCIELabParam *XieTecRGBToCIELab (matrix, white_adjust_tech, +white_adjust_param) +XieMatrix matrix; +XieWhiteAdjustTechnique white_adjust_tech; +XiePointer white_adjust_param; +Arguments +matrix Specifies the conversion matrix. +white_adjust_tech Specifies the WhiteAdjust technique to be used. +white_adjust_param Specifies the list of parameters required by white_adjust_tech. +Returns +The XieRGBToCIELabParam structure. +Description +XieTecRGBToCIELab allocates and returns a pointer to an XieRGBToCIELabParam structure. +The returned structure represents the list of parameters required by the RGBToCIELab color +conversion technique and may be used as the color_param argument of +XieFloConvertFromRGB (when the color_space argument is xieValRGBToCIELab). + +If insufficient memory is available, XieTecRGBToCIELab returns NULL. To free the memory +allocated to this structure, use XFree. + +XieTecRGBToCIELab converts RGB data to the CIELab colorspace, an international standard +designed for perceptual uniformity. The colorspace coordinates are denoted by L, a, and b and are +defined in CIE, Recommendations on Uniform Color Spaces, Color-Difference Equations, +Psychometric Color Terms (Bureau Central de la CIE [Supplement 2 of CIE Publication 15 (E-1.3.1) +1971], 1978). + +matrix is a 3x3 RGB-to-CIEXYZ conversion matrix (the source white point is also encoded in +matrix). white_adjust_tech is the WhiteAdjust technique that can be used to shift the white +point of the output data. white_adjust_param is the list of parameters required by +white_adjust_tech. + +The input data type can be constrained or unconstrained; the output data type is always +unconstrained. When the input is constrained, the data are normalized to the range [0, 1] (that is, +scaled by 1/(levels - 1) prior to the conversion). + +WhiteAdjust techniques define the white point adjustment techniques that can be used when +converting to or from the RGB colorspace. One of the following standard WhiteAdjust technique +values can be assigned to white_adjust_tech: + +xieValWhiteAdjustDefault +xieValWhiteAdjustNone +xieValWhiteAdjustCIELabShift + +If a vendor defined additional private WhiteAdjust techniques, the private technique values given to +these techniques can be assigned to white_adjust_tech. + +The server is required to support the default technique that is bound to one of the standard techniques +defined or a private technique. +Structures +XieTecRGBToCIELab sets the structure field matrix to the values of the argument matrix; the +structure field white_adjust_tech to the value of the argument white_adjust_tech; and +the structure field white_adjust_param to the value of the argument white_adjust_param. + +typedef float XieMatrix[9]; +typedef unsigned XieWhiteAdjustTechnique; +typedef struct { + XieMatrix matrix; + XieWhiteAdjustTechnique white_adjust_tech; + XiePointer white_adjust_param; +} XieRGBToCIELabParam; + +/* Definitions for WhiteAdjust Techniques */ +#define xieValWhiteAdjustDefault 0 +#define xieValWhiteAdjustNone 1 +#define xieValWhiteAdjustCIELabShift 2 +See Also +XieFloConvertFromRGB, XieTecWhiteAdjustCIELabShift + XIElib - Technique Functions XieTecRGBToCIEXYZ +Name +XieTecRGBToCIEXYZ - allocate and fill an XieRGBToCIEXYZParam structure +Syntax +XieRGBToCIEXYZParam *XieTecRGBToCIEXYZ (matrix, white_adjust_tech, +white_adjust_param) +XieMatrix matrix; +XieWhiteAdjustTechnique white_adjust_tech; +XiePointer white_adjust_param; +Arguments +matrix Specifies the conversion matrix. +white_adjust_tech Specifies the WhiteAdjust technique to be used. +white_adjust_param Specifies the list of parameters required by white_adjust_tech. +Returns +The XieRGBToCIEXYZParam structure. +Description +XieTecRGBToCIEXYZ allocates and returns a pointer to an XieRGBToCIEXYZParam structure. +The returned structure represents the list of parameters required by the RGBToCIEXYZ color +conversion technique and may be used as the color_param argument of +XieFloConvertFromRGB (when the color_space argument is xieValRGBToCIEXYZ). + +If insufficient memory is available, XieTecRGBToCIEXYZ returns NULL. To free the memory +allocated to this structure, use XFree. + +XieTecRGBToCIEXYZ converts RGB data to the CIEXYZ colorspace, an international standard +device-independent colorspace. + +matrix is a 3x3 RGB-to-CIEXYZ conversion matrix (the source white point is also encoded in +matrix). white_adjust_tech is the WhiteAdjust technique that can be used to shift the white +point of the output data. white_adjust_param is the list of parameters required by +white_adjust_tech. + +The input data type can be constrained or unconstrained; the output data type is always +unconstrained. When the input is constrained, the data are normalized to the range [0, 1] (that is, +scaled by 1/(levels - 1) prior to the conversion). + +WhiteAdjust techniques define the white point adjustment techniques that can be used when +converting to or from the RGB colorspace. One of the following standard WhiteAdjust technique +values can be assigned to white_adjust_tech: + +xieValWhiteAdjustDefault +xieValWhiteAdjustNone +xieValWhiteAdjustCIELabShift + +If a vendor defined additional private WhiteAdjust techniques, the private technique values given to +these techniques can be assigned to white_adjust_tech. + +The server is required to support the default technique that is bound to one of the standard techniques +defined or a private technique. +Structures +XieTecRGBToCIEXYZ sets the structure field matrix to the values of the argument matrix; the +structure field white_adjust_tech to the value of the argument white_adjust_tech; and +the structure field white_adjust_param to the value of the argument white_adjust_param. + +typedef float XieMatrix[9]; +typedef unsigned XieWhiteAdjustTechnique; +typedef struct { + XieMatrix matrix; + XieWhiteAdjustTechnique white_adjust_tech; + XiePointer white_adjust_param; +} XieRGBToCIEXYZParam; + +/* Definitions for WhiteAdjust Techniques */ +#define xieValWhiteAdjustDefault 0 +#define xieValWhiteAdjustNone 1 +#define xieValWhiteAdjustCIELabShift 2 +See Also +XieFloConvertFromRGB, XieTecWhiteAdjustCIELabShift + XIElib - Technique Functions XieTecRGBToYCbCr +Name +XieTecRGBToYCbCr - allocate and fill an XieRGBToYCbCrParam structure +Syntax +XieRGBToYCbCrParam *XieTecRGBToYCbCr (levels, luma_red, luma_green, +luma_blue, bias) +XieLevels levels; +double luma_red; +double luma_green; +double luma_blue; +XieConstant bias; +Arguments +levels Specifies the output levels. +luma_red Specifies the proportion of red in the luminance band. +luma_green Specifies the proportion of green in the luminance band. +luma_blue Specifies the proportion of blue in the luminance band. +bias Specifies an offset to add to the output pixels values. +Returns +The XieRGBToYCbCrParam structure. +Description +XieTecRGBToYCbCr allocates and returns a pointer to an XieRGBToYCbCrParam structure. +The returned structure represents the list of parameters required by the RGBToYCbCr color +conversion technique and may be used as the color_param argument of +XieFloConvertFromRGB (when the color_space argument is xieValRGBToYCbCr). + +If insufficient memory is available, XieTecRGBToYCbCr returns NULL. To free the memory +allocated to this structure, use XFree. + +XieTecRGBToYCbCr converts RGB data to the YCbCr colorspace. Source data may be constrained +or unconstrained; the output type will match. If the source data is constrained, levels determines +the output levels; otherwise levels is ignored. +Structures +XieTecRGBToYCbCr sets the structure field levels to the values of the argument levels; the +structure fields luma_red, luma_green, luma_blue to the values of the arguments luma_red, +luma_green, luma_blue; and the structure field bias to the values of the argument bias. + +typedef float XieConstant[3]; +typedef unsigned long XieLevels[3]; +typedef struct { + XieLevels levels; + float luma_red; + float luma_green; + float luma_blue; + XieConstant bias; +} XieRGBToYCbCrParam; +See Also +XieFloConvertFromRGB + XIElib - Technique Functions XieTecRGBToYCC +Name +XieTecRGBToYCC - allocate and fill an XieRGBToYCCParam structure +Syntax +XieRGBToYCCParam *XieTecRGBToYCC (levels, luma_red, luma_green, +luma_blue, scale) +XieLevels levels; +double luma_red; +double luma_green; +double luma_blue; +double scale; +Arguments +levels Specifies the output levels. +luma_red Specifies the proportion of red in the luminance band. +luma_green Specifies the proportion of green in the luminance band. +luma_blue Specifies the proportion of blue in the luminance band. +scale Specifies a compression factor to apply to the output pixels values. +Returns +The XieRGBToYCCParam structure. +Description +XieTecRGBToYCC allocates and returns a pointer to an XieRGBToYCCParam structure. The +returned structure represents the list of parameters required by the RGBToYCC color conversion +technique and may be used as the color_param argument of XieFloConvertFromRGB (when +the color_space argument is xieValRGBToYCC). + +If insufficient memory is available, XieTecRGBToYCC returns NULL. To free the memory allocated +to this structure, use XFree. + +XieTecRGBToYCC converts RGB data to the YCC colorspace. The PhotoYCC color-encoding +scheme is defined in: KODAK PhotoCD System - A Planning Guide for Developers (Eastman Kodak +Co., Part no. DCI200R, 1991). + +Source data may be constrained or unconstrained; the output type will match. If the source data is +constrained, levels determines the output levels; otherwise levels is ignored. Typical values +cited in the literature for scale are in the range of about 1.35 to 1.4. +Structures +XieTecRGBToYCC sets the structure field levels to the values of the argument levels; the +structure fields luma_red, luma_green, luma_blue are set to the values of the arguments +luma_red, luma_green, luma_blue; and the structure field scale to the value of the +argument scale. + +typedef unsigned long XieLevels[3]; +typedef struct { + XieLevels levels; + float luma_red; + float luma_green; + float luma_blue; + float scale; +} XieRGBToYCCParam; +See Also +XieFloConvertFromRGB + XIElib - Technique Functions XieTecCIELabToRGB +Name +XieTecCIELabToRGB - allocate and fill an XieCIELabToRGBParam structure +Syntax +XieCIELabToRGBParam *XieTecCIELabToRGB (matrix, white_adjust_tech, +white_adjust_param, gamut_tech, gamut_param) +XieMatrix matrix; +XieWhiteAdjustTechnique white_adjust_tech; +XiePointer white_adjust_param; +XieGamutTechnique gamut_tech; +XiePointer gamut_param; +Arguments +matrix Specifies the conversion matrix. +white_adjust_tech Specifies the WhiteAdjust technique to be used. +white_adjust_param Specifies the list of parameters required by white_adjust_tech. +gamut_tech Specifies the Gamut technique to be used. +gamut_param Specifies the list of parameters required by gamut_tech. +Returns +The XieCIELabToRGBParam structure. +Description +XieTecCIELabToRGB allocates and returns a pointer to an XieCIELabToRGBParam structure. +The returned structure represents the list of parameters required by the CIELabToRGB color +conversion technique and may be used as the color_param argument of XieFloConvertToRGB +(when the color_space argument is xieValCIELabToRGB). + +If insufficient memory is available, XieTecCIELabToRGB returns NULL. To free the memory +allocated to this structure, use XFree. + +XieTecCIELabToRGB converts CIELab data to the RGB colorspace. The CIELab colorspace is an +international standard designed for perceptual uniformity. The colorspace coordinates are denoted by +L, a, and b and are defined in CIE, Recommendations on Uniform Color Spaces, Color-Difference +Equations, Psychometric Color Terms (Bureau Central de la CIE [Supplement 2 of CIE Publication +15 (E-1.3.1) 1971], 1978). + +matrix is a 3x3 CIEXYZ-to-RGB conversion matrix (the target white point is also encoded in +matrix). white_adjust_tech is the WhiteAdjust technique that can be used to shift the white +point of the source data prior to conversion. white_adjust_param is the list of parameters +required by white_adjust_tech. gamut_tech is the Gamut technique that can be used to keep +the output pixels within the bounds of the RGB colorspace. gamut_param is the list of parameters +required by gamut_tech. + +The input data type must be unconstrained; the output data type is also unconstrained. + +WhiteAdjust techniques define the white point adjustment techniques that can be used when +converting to or from the RGB colorspace. One of the following standard WhiteAdjust technique +values can be assigned to white_adjust_tech: + +xieValWhiteAdjustDefault +xieValWhiteAdjustNone +xieValWhiteAdjustCIELabShift + +If a vendor defined additional private WhiteAdjust techniques, the private technique values given to +these techniques can be assigned to white_adjust_tech. + +The server is required to support the default technique that is bound to one of the standard techniques +defined or a private technique. + +Gamut techniques define the gamut compression techniques used to deal with converted colors that +lie outside the gamut of the RGB space. One of the following standard gamut technique values can be +assigned to gamut_tech: + +xieValGamutDefault +xieValGamutNone +xieValGamutClipRGB + +If a vendor defined additional private gamut techniques, the private technique values given to these +techniques can be assigned to gamut_tech. + +The server is required to support the default technique that is bound to one of the standard techniques +defined or a private technique. +Structures +XieTecCIELabToRGB sets the structure field matrix to the values of the argument matrix; the +structure field white_adjust_tech to the value of the argument white_adjust_tech; the +structure field white_adjust_param to the value of the argument white_adjust_param; the +structure field gamut_tech to the value of the argument gamut_tech; and the structure field +gamut_param to the value of the argument gamut_param. + +typedef float XieMatrix[9]; +typedef unsigned XieGamutTechnique; +typedef unsigned XieWhiteAdjustTechnique; +typedef struct { + XieMatrix matrix; + XieWhiteAdjustTechnique white_adjust_tech; + XiePointer white_adjust_param; + XieGamutTechnique gamut_tech; + XiePointer gamut_param; +} XieCIELabToRGBParam; + +/* Definitions for WhiteAdjust Techniques */ +#define xieValWhiteAdjustDefault 0 +#define xieValWhiteAdjustNone 1 +#define xieValWhiteAdjustCIELabShift 2 + +/* Definitions for Gamut Techniques */ +#define xieValGamutDefault 0 +#define xieValGamutNone 1 +#define xieValGamutClipRGB 2 +See Also +XieFloConvertToRGB, XieTecWhiteAdjustCIELabShift + XIElib - Technique Functions XieTecCIEXYZToRGB +Name +XieTecCIEXYZToRGB - allocate and fill an XieCIEXYZToRGBParam structure +Syntax +XieCIEXYZToRGBParam *XieTecCIEXYZToRGB (matrix, white_adjust_tech, +white_adjust_param, gamut_tech, gamut_param) +XieMatrix matrix; +XieWhiteAdjustTechnique white_adjust_tech; +XiePointer white_adjust_param; +XieGamutTechnique gamut_tech; +XiePointer gamut_param; +Arguments +matrix Specifies the conversion matrix. +white_adjust_tech Specifies the WhiteAdjust technique to be used. +white_adjust_param Specifies the list of parameters required by white_adjust_tech. +gamut_tech Specifies the Gamut technique to be used. +gamut_param Specifies the list of parameters required by gamut_tech. +Returns +The XieCIEXYZToRGBParam structure. +Description +XieTecCIEXYZToRGB allocates and returns a pointer to an XieCIEXYZToRGBParam structure. +The returned structure represents the list of parameters required by the CIEXYZToRGB color +conversion technique and may be used as the color_param argument of XieFloConvertToRGB +(when the color_space argument is xieValCIEXYZToRGB). + +If insufficient memory is available, XieTecCIEXYZToRGB returns NULL. To free the memory +allocated to this structure, use XFree. + +XieTecCIEXYZToRGB converts CIEXYZ data to the RGB colorspace. The CIEXYZ colorspace is +an international standard device-independent colorspace. + +matrix is a 3x3 CIEXYZ-to-RGB conversion matrix (the target white point is also encoded in +matrix). white_adjust_tech is the WhiteAdjust technique that can be used to shift the white +point of the source data prior to conversion. white_adjust_param is the list of parameters +required by white_adjust_tech. gamut_tech is the Gamut technique that can be used to keep +the output pixels within the bounds of the RGB colorspace. gamut_param is the list of parameters +required by gamut_tech. + +The input data type must be unconstrained; the output data type is also unconstrained. + +WhiteAdjust techniques define the white point adjustment techniques that can be used when +converting to or from the RGB colorspace. One of the following standard WhiteAdjust technique +values can be assigned to white_adjust_tech: + +xieValWhiteAdjustDefault +xieValWhiteAdjustNone +xieValWhiteAdjustCIELabShift + +If a vendor defined additional private WhiteAdjust techniques, the private technique values given to +these techniques can be assigned to white_adjust_tech. + +The server is required to support the default technique that is bound to one of the standard techniques +defined or a private technique. + +Gamut techniques define the gamut compression techniques used to deal with converted colors that +lie outside the gamut of the RGB space. One of the following standard gamut technique values can be +assigned to gamut_tech: + +xieValGamutDefault +xieValGamutNone +xieValGamutClipRGB + +If a vendor defined additional private gamut techniques, the private technique values given to these +techniques can be assigned to gamut_tech. + +The server is required to support the default technique that is bound to one of the standard techniques +defined or a private technique. +Structures +XieTecCIEXYZToRGB sets the structure field matrix to the values of the argument matrix; the +structure field white_adjust_tech to the value of the argument white_adjust_tech; the +structure field white_adjust_param to the value of the argument white_adjust_param; the +structure field gamut_tech to the value of the argument gamut_tech; and the structure field +gamut_param to the value of the argument gamut_param. + +typedef float XieMatrix[9]; +typedef unsigned XieGamutTechnique; +typedef unsigned XieWhiteAdjustTechnique; +typedef struct { + XieMatrix matrix; + XieWhiteAdjustTechnique white_adjust_tech; + XiePointer white_adjust_param; + XieGamutTechnique gamut_tech; + XiePointer gamut_param; +} XieCIEXYZToRGBParam; + +/* Definitions for WhiteAdjust Techniques */ +#define xieValWhiteAdjustDefault 0 +#define xieValWhiteAdjustNone 1 +#define xieValWhiteAdjustCIELabShift 2 + +/* Definitions for Gamut Techniques */ +#define xieValGamutDefault 0 +#define xieValGamutNone 1 +#define xieValGamutClipRGB 2 +See Also +XieFloConvertToRGB, XieTecWhiteAdjustCIELabShift + XIElib - Technique Functions XieTecYCbCrToRGB +Name +XieTecYCbCrToRGB - allocate and fill an XieYCbCrToRGBParam structure +Syntax +XieYCbCrToRGBParam *XieTecYCbCrToRGB (levels, luma_red, luma_green, +luma_blue, bias, gamut_tech, gamut_param) +XieLevels levels; +double luma_red; +double luma_green; +double luma_blue; +XieConstant bias; +XieGamutTechnique gamut_tech; +XiePointer gamut_param; +Arguments +levels Specifies the output levels. +luma_red Specifies the proportion of red in the luminance band (Y). +luma_green Specifies the proportion of green in the luminance band (Y). +luma_blue Specifies the proportion of blue in the luminance band (Y). +bias Specifies an offset to remove from the source pixels values. +gamut_tech Specifies the Gamut technique to be used. +gamut_param Specifies the list of parameters required by gamut_tech. +Returns +The XieYCbCrToRGBParam structure. +Description +XieTecYCbCrToRGB allocates and returns a pointer to an XieYCbCrToRGBParam structure. +The returned structure represents the list of parameters required by the YCbCrToRGB color +conversion technique and may be used as the color_param argument of XieFloConvertToRGB +(when the color_space argument is xieValYCbCrToRGB). + +If insufficient memory is available, XieTecYCbCrToRGB returns NULL. To free the memory +allocated to this structure, use XFree. + +XieTecYCbCrToRGB converts YCbCr data to the RGB colorspace. Source data may be constrained +or unconstrained; the output type will match. If the source data is constrained, levels determines +the output levels; otherwise levels is ignored. + +Gamut techniques define the gamut compression techniques used to deal with converted colors that +lie outside the gamut of the RGB space. One of the following standard gamut technique values can be +assigned to gamut_tech: + +xieValGamutDefault +xieValGamutNone +xieValGamutClipRGB + +If a vendor defined additional private gamut techniques, the private technique values given to these +techniques can be assigned to gamut_tech. + +The server is required to support the default technique that is bound to one of the standard techniques +defined or a private technique. +Structures +XieTecYCbCrToRGB sets the structure field levels to the values of the argument levels; the +structure fields luma_red, luma_green, luma_blue to the values of the arguments luma_red, +luma_green, luma_blue; the structure field bias to the values of the argument bias; the +structure field gamut_tech to the value of the argument gamut_tech; and the structure field +gamut_param to the value of the argument gamut_param. + +typedef float XieConstant[3]; +typedef unsigned long XieLevels[3]; +typedef unsigned XieGamutTechnique; +typedef struct { + XieLevels levels; + float luma_red; + float luma_green; + float luma_blue; + XieConstant bias; + XieGamutTechnique gamut_tech; + XiePointer gamut_param; +} XieYCbCrToRGBParam; + +/* Definitions for Gamut Techniques */ +#define xieValGamutDefault 0 +#define xieValGamutNone 1 +#define xieValGamutClipRGB 2 +See Also +XieFloConvertToRGB + XIElib - Technique Functions XieTecYCCToRGB +Name +XieTecYCCToRGB - allocate and fill an XieYCCToRGBParam structure +Syntax +XieYCCToRGBParam *XieTecYCCToRGB (levels, luma_red, luma_green, +luma_blue, scale, gamut_tech, gamut_param) +XieLevels levels; +double luma_red; +double luma_green; +double luma_blue; +double scale; +XieGamutTechnique gamut_tech; +XiePointer gamut_param; +Arguments +levels Specifies the output levels. +luma_red Specifies the proportion of red in the luminance band (Y). +luma_green Specifies the proportion of green in the luminance band (Y). +luma_blue Specifies the proportion of blue in the luminance band (Y). +scale Specifies an expansion factor to apply to the output pixels values. +gamut_tech Specifies the Gamut technique to be used. +gamut_param Specifies the list of parameters required by gamut_tech. +Returns +The XieYCCToRGBParam structure. +Description +XieTecYCCToRGB allocates and returns a pointer to an XieYCCToRGBParam structure. The +returned structure represents the list of parameters required by the YCCToRGB color conversion +technique and may be used as the color_param argument of XieFloConvertToRGB (when the +color_space argument is xieValYCCToRGB). + +If insufficient memory is available, XieTecYCCToRGB returns NULL. To free the memory allocated +to this structure, use XFree. + +XieTecYCCToRGB converts YCC data to the RGB colorspace. The PhotoYCC color-encoding +scheme is defined in KODAK PhotoCD System - A Planning Guide for Developers (Eastman Kodak +Co., Part no. DCI200R, 1991). + +Source data may be constrained or unconstrained; the output type will match. If the source data is +constrained, levels determines the output levels; otherwise levels is ignored. Typical values +cited in the literature for scale are in the range of about 1.35 to 1.4. + +Gamut techniques define the gamut compression techniques used to deal with converted colors that +lie outside the gamut of the RGB space. One of the following standard gamut technique values can be +assigned to gamut_tech: + +xieValGamutDefault +xieValGamutNone +xieValGamutClipRGB + +If a vendor defined additional private gamut techniques, the private technique values given to these +techniques can be assigned to gamut_tech . + +The server is required to support the default technique that is bound to one of the standard techniques +defined or a private technique. +Structures +XieTecYCCToRGB sets the structure field levels to the values of the argument levels; the +structure fields luma_red, luma_green, luma_blue to the values of the arguments luma_red, +luma_green, luma_blue; the structure field scale to the values of the argument scale; the +structure field gamut_tech to the value of the argument gamut_tech; and the structure field +gamut_param to the value of the argument gamut_param. + +typedef unsigned long XieLevels[3]; +typedef unsigned XieGamutTechnique; +typedef struct { + XieLevels levels; + float luma_red; + float luma_green; + float luma_blue; + float scale; + XieGamutTechnique gamut_tech; + XiePointer gamut_param; +} XieYCCToRGBParam; + +/* Definitions for Gamut Techniques */ +#define xieValGamutDefault 0 +#define xieValGamutNone 1 +#define xieValGamutClipRGB 2 + +See Also +XieFloConvertToRGB + XIElib - Technique Functions XieTecClipScale +Name +XieTecClipScale - allocate and fill an XieClipScaleParam structure +Syntax +XieClipScaleParam *XieTecClipScale (in_low, in_high, out_low, +out_high) +XieConstant in_low; +XieConstant in_high; +XieLTriplet out_low; +XieLTriplet out_high; +Arguments +in_low Specifies an input pixel limit. +in_high Specifies an input pixel limit. +out_low Specifies an output pixel limit. +out_high Specifies an output pixel limit. +Returns +The XieClipScaleParam structure. +Description +XieTecClipScale allocates and returns a pointer to an XieClipScaleParam structure. The +returned structure represents the list of parameters required by the constrain technique and may be +used as the constrain_param argument of XieFloConstrain (when the +constrain_tech argument is xieValClipScale). + +If insufficient memory is available, XieTecClipScale returns NULL. To free the memory +allocated to this structure, use XFree. + +For each band, output pixels will be clipped to the range [out_low, out_high]. If in_low is less +than in_high, then all pixels less than or equal to in_low will map to out_low, and all pixels +that are greater than or equal to in_high will map to out_high. All intermediate pixel values are +scaled proportionately to the output range. Nonintegral output values are rounded to the nearest +integer. + +If in_low is greater than in_high, then all pixels that are greater than or equal to in_low will +map to out_low, and all pixels that are less than or equal to in_high will map to out_high. All +intermediate pixel values will be linearly mapped to the output range, such that in_low maps to +out_low, and in_high maps to out_high. Nonintegral output values are rounded to the nearest +integer. + +in_low should not equal in_high, out_low should be less than out_high, and out_high +should not exceed levels - 1. +Structures +XieTecClipScale sets the structure fields input_low, input_high to the values of the +arguments in_low, in_high; and the structure fields output_low, output_high to the +values of the arguments out_low, out_high. + +typedef float XieConstant[3]; +typedef unsigned long XieLTriplet[3]; +typedef struct { + XieConstant input_low,input_high; + XieLTriplet output_low,output_high; +} XieClipScaleParam; +See Also +XieFloConstrain + XIElib - Technique Functions XieTecConvolveConstant +Name +XieTecConvolveConstant - allocate and fill an XieConvolveConstantParam structure +Syntax +XieConvolveConstantParam *XieTecConvolveConstant (constant) +XieConstant constant; +Arguments +constant Specifies the value to use if pixels are required from beyond the edge +of the image. +Returns +The XieConvolveConstantParam structure. +Description +XieTecConvolveConstant allocates and returns a pointer to an +XieConvolveConstantParam structure. The returned structure represents the list of parameters +required by the convolve technique and may be used as the convolve_param argument of +XieFloConvolve (when the convolve_tech argument is xieValConvolveConstant). + +If insufficient memory is available, XieTecConvolveConstant returns NULL. To free the +memory allocated to this structure, use XFree. + +Various methods of handling edge conditions are provided for convolve techniques. These techniques +determine what pixel values are used when the convolve technique requires data beyond the image +bounds. Convolve techniques come into play only when the kernel is positioned partially off the edge +of the image. Data around the edges of a process domain are convolved with adjacent image +pixels wherever possible. A process domain is inserted in many element definitions and is used to +restrict the element's processing to a subset of the source data pixels; it can be either a list-of- +rectangles or a control-plane. + +The Constant Convolve technique uses the value specified by constant if pixels are required from +beyond the edge of the image. +Structures +XieTecConvolveConstant sets the structure field constant to the value of the argument +constant. + +typedef float XieConstant[3]; +typedef struct { + XieConstant constant; +} XieConvolveConstantParam; +See Also +XieFloConvolve + XIElib - Technique Functions XieTecDecodeUncompressedSingle +Name +XieTecDecodeUncompressedSingle - allocate and fill an +XieDecodeUncompressedSingleParam structure +Syntax +XieDecodeUncompressedSingleParam *XieTecDecodeUncompressedSingle +(fill_order, pixel_order, pixel_stride, left_pad, +scanline_pad) +XieOrientation fill_order; +XieOrientation pixel_order; +unsigned int pixel_stride; +unsigned int left_pad; +unsigned int scanline_pad; +Arguments +fill_order Specifies the method of pixel packing. +pixel_order Specifies pixel ordering within the data stream. +pixel_stride Specifies the number of bits between consecutive pixels within a +scanline. +left_pad Specifies the number of pad bits in each scanline. +scanline_pad Specifies a multiple of bytes to which each scanline is padded. +Returns +The XieDecodeUncompressedSingleParam structure. +Description +XieTecDecodeUncompressedSingle allocates and returns a pointer to an +XieDecodeUncompressedSingleParam structure. The returned structure represents the list of +parameters required by the decode technique and may be used as the decode_param argument of +XieFloImportClientPhoto (when the decode_tech argument is +xieValDecodeUncompressedSingle). + +If insufficient memory is available, XieTecDecodeUncompressedSingle returns NULL. To +free the memory allocated to this structure, use XFree. + +The decode uncompressed single technique is used when no compression scheme has been applied to +single band image data. The parameters define the format of the data stream of uncompressed data +(the server may reformat the data as it chooses prior to processing or storage). When multiple pixels +are put in the same byte, or a pixel spans multiple bytes, fill_order specifies whether the pixels +(or parts of pixels) are packed into the most or least significant bits of a byte first. For pixels that span +a byte boundary, pixel_order defines whether the most or least significant bits of the pixel are +transported first within the data stream. One of the following standard orientation values can be +assigned to fill_order and pixel_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the relationship between fill_order and pixel_order, using two +10-bit pixels, each with two bits of pad (within each pixel the LS-bits are 0 and a, the MS-bits are +9 and j, the pad bits are p). + +fill order +LSFirst (pixel order) +MSFirst (pixel order) +LSFirst +76543210 dcbapp98 ppjihgfe +98765432 jihgpp10 ppfedcba +MSFirst +76543210 98ppdcba jihgfepp +98765432 10ppjihg fedcbapp + +pixel_stride is the number of bits between the start of consecutive pixels within a scanline; it +must be at least enough bits to contain the number of input levels. left_pad is the number of pad +bits preceding the first image pixel in each scanline; if the server's Alignment attribute is Alignable, +or pixel_stride fits the definition of Alignable, the value of left_pad must be a multiple of +pixel_stride or a multiple of 8; otherwise, left_pad may be any arbitrary value. +scanline_pad defines a multiple of bytes to which each scanline is padded; valid values are: 0 +(not aligned), 1, 2, 4, 8, and 16. The total number of bits-per-scanline in the data stream includes: +left_pad, the image data (width x pixel_stride), and sufficient additional bits to satisfy +scanline_pad. +Structures +XieTecDecodeUncompressedSingle sets the structure field fill_order to the value of the +argument fill_order; the structure field pixel_order to the value of the argument +pixel_order; the structure field pixel_stride to the value of the argument pixel_stride; +the structure field left_pad to the value of the argument left_pad; and the structure field +scanline_pad to the value of the argument scanline_pad. + +typedef unsigned XieOrientation; +typedef struct { + XieOrientation fill_order; + XieOrientation pixel_order; + unsigned int pixel_stride; + unsigned int left_pad; + unsigned int scanline_pad; +} XieDecodeUncompressedSingleParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloImportClientPhoto, XiePutClientData + XIElib - Technique Functions XieTecDecodeUncompressedTriple +Name +XieTecDecodeUncompressedTriple - allocate and fill an +XieDecodeUncompressedTripleParam structure +Syntax +XieDecodeUncompressedTripleParam *XieTecDecodeUncompressedTriple +(fill_order, pixel_order, band_order, interleave, +pixel_stride, left_pad, scanline_pad) +XieOrientation fill_order; +XieOrientation pixel_order; +XieOrientation band_order; +XieInterleave interleave; +unsigned char pixel_stride[3]; +unsigned char left_pad[3]; +unsigned char scanline_pad[3]; +Arguments +fill_order Specifies the method of pixel packing. +pixel_order Specifies pixel ordering within the data stream. +band_order Specifies the order of the image data sent through the protocol stream. +interleave Specifies how the image bands are interleaved. +pixel_stride Specifies the number of bits between consecutive pixels within a +scanline. +left_pad Specifies the number of pad bits in each scanline. +scanline_pad Specifies a multiple of bytes to which each scanline is padded. +Returns +The XieDecodeUncompressedTripleParam structure. +Description +XieTecDecodeUncompressedTriple allocates and returns a pointer to an +XieDecodeUncompressedTripleParam structure. The returned structure represents the list of +parameters required by the decode technique and may be used as the decode_param argument of +XieFloImportClientPhoto (when the decode_tech argument is +xieValDecodeUncompressedTriple). + +If insufficient memory is available, XieTecDecodeUncompressedTriple returns NULL. To +free the memory allocated to this structure, use XFree. + +The decode uncompressed triple technique is used when no compression scheme has been applied to +triple band image data. The parameters define the format of the data stream of uncompressed data +(the server may reformat the data as it chooses prior to processing or storage). When multiple pixels +are put in the same byte, or a pixel spans multiple bytes, fill_order specifies whether the pixels +(or parts of pixels) are packed into the most or least significant bits of a byte first. For pixels that span +a byte boundary, pixel_order defines whether the most or least significant bits of the pixel are +transported first within the data stream. + +One of the following standard orientation values can be assigned to fill_order and +pixel_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the relationship between fill_order and pixel_order, using two +10-bit pixels, each with two bits of pad (within each pixel the LS-bits are 0 and a, the MS-bits are +9 and j, the pad bits are p) + +fill order +LSFirst (pixel order) +MSFirst (pixel order) +LSFirst +76543210 dcbapp98 ppjihgfe +98765432 jihgpp10 ppfedcba +MSFirst +76543210 98ppdcba jihgfepp +98765432 10ppjihg fedcbapp + +pixel_stride is the number of bits between the start of consecutive pixels within a scanline; It +must be at least enough bits to contain the number of input levels. left_pad is the number of pad +bits preceding the first image pixel in each scanline; if the server's Alignment attribute is Alignable, +or pixel_stride fits the definition of Alignable, the value of left_pad must be a multiple of +pixel_stride or a multiple of 8; otherwise, left_pad may be any arbitrary value. +scanline_pad defines a multiple of bytes to which each scanline is padded; valid values are: 0 +(not aligned), 1, 2, 4, 8, and 16. The total number of bits-per-scanline in the data stream includes: +left_pad, the image data (width x pixel_stride), and sufficient additional bits to satisfy +scanline_pad. + +interleave describes how the image bands are interleaved (per pixel within a single plane, or sent +as three separate planes); if interleave is xieValBandByPixel, inter-band dimensions must +match: the widths and the heights of all bands must match. One of the following standard interleave +values can be assigned to interleave: + +xieValBandByPixel +xieValBandByPlane + +band_order is the order of the image bands or image planes as they are transmitted through the +protocol stream. band_order can be set to one of the standard orientation values. The least +significant band of trichromatic data is the first band mentioned in the common name of the +colorspace : red is the least significant band of RGB data. For band-by-pixel data, band_order +specifies whether this band is put in the least or most significant bits of a pixel: + +LSFirst +MSFirst +B1B0G2G1G0R2R1R0 +R2R1R0G2G1G0B1B0 + +For band-by-plane data, band_order specifies whether this band corresponds with the least +significant or most significant image plane. Each plane is transported as a separate data stream: + +band +LSFirst +MSFirst +0 +R7R6R5R4R3R2R1R0 +B7B6B5B4B3B2B1B0 +1 +G7G6G5G4G3G2G1G0 +G7G6G5G4G3G2G1G0 +2 +B7B6B5B4B3B2B1B0 +R7R6R5R4R3R2R1R0 + +Structures +XieTecDecodeUncompressedTriple sets the structure field fill_order to the value of the +argument fill_order; the structure field pixel_order to the value of the argument +pixel_order; the structure field band_order to the value of the argument band_order; the +structure field interleave to the value of the argument interleave; the structure field +pixel_stride to the value of the argument pixel_stride; the structure field left_pad to +the value of the argument left_pad; and the structure field scanline_pad to the value of the +argument scanline_pad. + +typedef unsigned XieOrientation; +typedef unsigned XieInterleave; +typedef struct { + unsigned char left_pad[3]; + XieOrientation fill_order; + unsigned char pixel_stride[3]; + XieOrientation pixel_order; + unsigned char scanline_pad[3]; + XieOrientation band_order; + XieInterleave interleave; +} XieDecodeUncompressedTripleParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 + +/* Definitions for Interleave */ +#define xieValBandByPixel 1 +#define xieValBandByPlane 2 +See Also +XieFloImportClientPhoto, XiePutClientData + XIElib - Technique Functions XieTecDecodeG31D +Name +XieTecDecodeG31D - allocate and fill an XieDecodeG31DParam structure +Syntax +XieDecodeG31DParam *XieTecDecodeG31D (encoded_order, normal, +radiometric) +XieOrientation encoded_order; +Bool normal; +Bool radiometric; +Arguments +encoded_order Specifies the bit order of the encoded data. +normal Specifies how the data was processed when it was originally encoded. +radiometric Specifies how white runs are decoded. +Returns +The XieDecodeG31DParam structure. +Description +XieTecDecodeG31D allocates and returns a pointer to an XieDecodeG31DParam structure. +The returned structure represents the list of parameters required by the decode technique and may be +used as the decode_param argument of XieFloImportClientPhoto (when the +decode_tech argument is xieValDecodeG31D). + +If insufficient memory is available, XieTecDecodeG31D returns NULL. To free the memory +allocated to this structure, use XFree. + +CCITT-G31D is the CCITT group 3 one-dimensional encoding technique as defined by CCITT T.4, +"Standardization of Group 3 Facsimile Apparatus for Document Transmission". + +encoded_order specifies the bit order of the encoded data. One of the following standard +orientation values can be assigned to encoded_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the encoded bit order of two bytes (within each byte the first encoded bit is +0, and the last is bit 7): + +LSFirst +MSFirst +76543210 76543210 +01234567 01234567 + +radiometric specifies that white runs in the encoded data should be represented as image ones +upon decode (maximum intensity), or conversely, they will be decoded as image zeros if +radiometric is False. normal specifies that the data was processed according to its normal fill- +order when it was originally encoded. +Structures +XieTecDecodeG31D sets the structure field encoded_order to the value of the argument +encoded_order; the structure field normal to the value of the argument normal; and the +structure field radiometric to the value of the argument radiometric. + +typedef unsigned XieOrientation; +typedef struct { + XieOrientation encoded_order; + Bool normal; + Bool radiometric; +} XieDecodeG31DParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloImportClientPhoto, XiePutClientData + XIElib - Technique Functions XieTecDecodeG32D +Name +XieTecDecodeG32D - allocate and fill an XieDecodeG32DParam structure +Syntax +XieDecodeG32DParam *XieTecDecodeG32D (encoded_order, normal, +radiometric) +XieOrientation encoded_order; +Bool normal; +Bool radiometric; +Arguments +encoded_order Specifies the bit order of the encoded data. +normal Specifies how the data was processed when it was originally encoded. +radiometric Specifies how white runs are decoded. +Returns +The XieDecodeG32DParam structure. +Description +XieTecDecodeG32D allocates and returns a pointer to an XieDecodeG32DParam structure. +The returned structure represents the list of parameters required by the decode technique and may be +used as the decode_param argument of XieFloImportClientPhoto (when the +decode_tech argument is xieValDecodeG32D). + +If insufficient memory is available, XieTecDecodeG32D returns NULL. To free the memory +allocated to this structure, use XFree. + +CCITT-G32D is the CCITT group 3 two-dimensional encoding technique as defined by CCITT T.4, +"Standardization of Group 3 Facsimile Apparatus for Document Transmission". + +encoded_order specifies the bit order of the encoded data. One of the following standard +orientation values can be assigned to encoded_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the encoded bit order of two bytes (within each byte the first encoded bit is +0, and the last is bit 7): + +LSFirst +MSFirst +76543210 76543210 +01234567 01234567 + +radiometric specifies that white runs in the encoded data should be represented as image ones +upon decode (maximum intensity), or conversely, they will be decoded as image zeros if +radiometric is False. normal specifies that the data was processed according to its normal fill- +order when it was originally encoded. +Structures +XieTecDecodeG32D sets the structure field encoded_order to the value of the argument +encoded_order; the structure field normal to the value of the argument normal; and the +structure field radiometric to the value of the argument radiometric. + +typedef unsigned XieOrientation; +typedef struct { + XieOrientation encoded_order; + Bool normal; + Bool radiometric; +} XieDecodeG32DParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloImportClientPhoto, XiePutClientData + XIElib - Technique Functions XieTecDecodeG42D +Name +XieTecDecodeG42D - allocate and fill an XieDecodeG42DParam structure +Syntax +XieDecodeG42DParam *XieTecDecodeG42D (encoded_order, normal, +radiometric)) +XieOrientation encoded_order; +Bool normal; +Bool radiometric; +Arguments +encoded_order Specifies the bit order of the encoded data. +normal Specifies how the data was processed when it was originally encoded. +radiometric Specifies how white runs are decoded. +Returns +The XieDecodeG42DParam structure. +Description +XieTecDecodeG42D allocates and returns a pointer to an XieDecodeG42DParam structure. +The returned structure represents the list of parameters required by the decode technique and may be +used as the decode_param argument of XieFloImportClientPhoto (when the +decode_tech argument is xieValDecodeG42D). + +If insufficient memory is available, XieTecDecodeG42D returns NULL. To free the memory +allocated to this structure, use XFree. + +CCITT-G42D is the CCITT group 4 two-dimensional encoding technique as defined by CCITT T.6, +"Facsimile Coding Schemes and Coding Control Functions for Group 4 Facsimile Apparatus". + +encoded_order specifies the bit order of the encoded data. One of the following standard +orientation values can be assigned to encoded_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the encoded bit order of two bytes (within each byte the first encoded bit is +0, and the last is bit 7): + +LSFirst +MSFirst +76543210 76543210 +01234567 01234567 + +radiometric specifies that white runs in the encoded data should be represented as image ones +upon decode (maximum intensity), or conversely, they will be decoded as image zeros if +radiometric is False. normal specifies that the data was processed according to its normal fill- +order when it was originally encoded. +Structures +XieTecDecodeG42D sets the structure field encoded_order to the value of the argument +encoded_order; the structure field normal to the value of the argument normal; and the +structure field radiometric to the value of the argument radiometric. + +typedef unsigned XieOrientation; +typedef struct { + XieOrientation encoded_order; + Bool normal; + Bool radiometric; +} XieDecodeG42DParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloImportClientPhoto, XiePutClientData + XIElib - Technique Functions XieTecDecodeTIFF2 +Name +XieTecDecodeTIFF2 - allocate and fill an XieDecodeTIFF2Param structure +Syntax +XieDecodeTIFF2Param *XieTecDecodeTIFF2 (encoded_order, normal, +radiometric) +XieOrientation encoded_order; +Bool normal; +Bool radiometric; +Arguments +encoded_order Specifies the bit order of the encoded data. +normal Specifies how the data was processed when it was originally encoded. +radiometric Specifies how white runs are decoded. +Returns +The XieDecodeTIFF2Param structure. +Description +XieTecDecodeTIFF2 allocates and returns a pointer to an XieDecodeTIFF2Param structure. +The returned structure represents the list of parameters required by the decode technique and may be +used as the decode_param argument of XieFloImportClientPhoto (when the +decode_tech argument is xieValDecodeTIFF2). + +If insufficient memory is available, XieTecDecodeTIFF2 returns NULL. To free the memory +allocated to this structure, use XFree. + +TIFF-2 is modified Huffman encoding as described in "TIFF Tag Image File Format", revision 6.0, +draft 2, by Aldus Corporation (TIFF compression scheme 2). + +encoded_order specifies the bit order of the encoded data. One of the following standard +orientation values can be assigned to encoded_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the encoded bit order of two bytes (within each byte the first encoded bit is +0, and the last is bit 7): + +LSFirst +MSFirst +76543210 76543210 +01234567 01234567 + +radiometric specifies that white runs in the encoded data should be represented as image ones +upon decode (maximum intensity), or conversely, they will be decoded as image zeros if +radiometric is False. normal specifies that the data was processed according to its normal fill- +order when it was originally encoded. +Structures +XieTecDecodeTIFF2 sets the structure field encoded_order to the value of the argument +encoded_order; the structure field normal to the value of the argument normal; and the +structure field radiometric to the value of the argument radiometric. + +typedef unsigned XieOrientation; +typedef struct { + XieOrientation encoded_order; + Bool normal; + Bool radiometric; +} XieDecodeTIFF2Param; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloImportClientPhoto, XiePutClientData + XIElib - Technique Functions XieTecDecodeTIFFPackBits +Name +XieTecDecodeTIFFPackBits - allocate and fill an XieDecodeTIFFPackBitsParam structure +Syntax +XieDecodeTIFFPackBitsParam *XieTecDecodeTIFFPackBits (encoded_order, +normal) +XieOrientation encoded_order; +Bool normal; +Arguments +encoded_order Specifies the bit order of the encoded data. +normal Specifies how the data was processed when it was originally encoded. +Returns +The XieDecodeTIFFPackBitsParam structure. +Description +XieTecDecodeTIFFPackBits allocates and returns a pointer to an +XieDecodeTIFFPackBitsParam structure. The returned structure represents the list of +parameters required by the decode technique and may be used as the decode_param argument of +XieFloImportClientPhoto (when the decode_tech argument is +xieValDecodeTIFFPackBits). + +If insufficient memory is available, XieTecDecodeTIFFPackBits returns NULL. To free the +memory allocated to this structure, use XFree. + +TIFF-PackBits is byte-oriented run-length encoding as described in "TIFF Tag Image File Format", +revision 6.0, draft 2, by Aldus Corporation (TIFF compression scheme 32773). + +encoded_order specifies the bit order of the encoded data. One of the following standard +orientation values can be assigned to encoded_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the encoded bit order of two bytes (within each byte the first encoded bit is +0, and the last is bit 7): + +LSFirst +MSFirst +76543210 76543210 +01234567 01234567 + +normal specifies that the data was processed according to its normal fill-order when it was +originally encoded. +Structures +XieTecDecodeTIFFPackBits sets the structure field encoded_order to the value of the +argument encoded_order and the structure field normal to the value of the argument normal. + +typedef unsigned XieOrientation; +typedef struct { + XieOrientation encoded_order; + Bool normal; +} XieDecodeTIFFPackBitsParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloImportClientPhoto, XiePutClientData + XIElib - Technique Functions XieTecDecodeJPEGBaseline +Name +XieTecDecodeJPEGBaseline - allocate and fill an XieDecodeJPEGBaselineParam structure +Syntax +XieDecodeJPEGBaselineParam *XieTecDecodeJPEGBaseline (interleave, +band_order, up_sample) +XieInterleave interleave; +XieOrientation band_order; +Bool up_sample; +Arguments +interleave Specifies how the image bands will be interleaved. +band_order Specifies the order in which the image bands were originally encoded. +up_sample Specifies how interleaved encoded data are up-sampled. +Returns +The XieTecDecodeJPEGBaselineParam structure. +Description +XieDecodeJPEGBaseline allocates and returns a pointer to an +XieDecodeJPEGBaselineParam structure. The returned structure represents the list of +parameters required by the decode technique and may be used as the decode_param argument of +XieFloImportClientPhoto (when the decode_tech argument is +xieValDecodeJPEGBaseline). + +If insufficient memory is available, XieTecDecodeJPEGBaseline returns NULL. To free the +memory allocated to this structure, use XFree. + +The JPEG baseline technique is the baseline Huffman DCT encoding technique that is defined in ISO +DIS 10918-1 "Digital Compression and Coding of Continuous-tone Still Images". Only JPEG +Interchange Format (JIF) is supported: all tables, compressed data, and so on are embedded in the +data stream, all delineated by markers. + +interleave determines whether all bands of a triple band image will be interleaved within a single +encoded stream or whether three separate encoded streams will be supplied. One of the following +standard interleave values can be assigned to interleave: + +xieValBandByPixel +xieValBandByPlane + +For triple band data, band_order specifies the order in which the image bands were originally +encoded. One of the following standard orientation values can be assigned to band_order: + +xieValLSFirst +xieValMSFirst + +The least significant band of trichromatic data is the first band mentioned in the common name of the +colorspace: red is the least significant band of RGB data. band_order specifies whether this band +corresponds with the least significant or most significant image plane. Each plane is decoded into a +separate data stream: + +band +LSFirst +MSFirst +0 +Red band +Blue band +1 +Green band +Green band +2 +Blue band +Red band + +up_sample specifies that if any bands in an interleaved encoded data stream are down-sampled, +they should be up-sampled by the JPEG decoder. + +The arguments interleave, band_order, and up_sample are ignored for single band images, +and up_sample is always ignored if interleave is band-by-plane. If up_sample is False and +some of the encoded bands of an interleaved image were down-sampled, an alternative method for up- +sampling the image would be to use a geometry element with appropriate band_mask and sample +technique parameters. +Structures +XieTecDecodeJPEGBaseline sets the structure field interleave to the value of the +argument interleave; the structure field band_order to the value of the argument +band_order; and the structure field up_sample to the value of the argument up_sample. + +typedef unsigned XieOrientation; +typedef struct { + XieInterleave interleave; + XieOrientation band_order; + Bool up_sample; +} XieDecodeJPEGBaselineParam; +/* Definitions for Interleave */ +#define xieValBandByPixel 1 +#define xieValBandByPlane 2 + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloImportClientPhoto, XieFloConvertToRGB, XieTecYCbCrToRGB, XiePutClientData + XIElib - Technique Functions XieTecDecodeJPEGLossless +Name +XieTecDecodeJPEGLossless - allocate and fill an XieDecodeJPEGLosslessParam structure +Syntax +XieDecodeJPEGLosslessParam *XieTecDecodeJPEGLossless (interleave, +band_order) +XieInterleave interleave; +XieOrientation band_order; +Arguments +interleave Specifies how the image bands will be interleaved. +band_order Specifies the order in which the image bands were originally encoded. +Returns +The XieDecodeJPEGLosslessParam structure. +Description +XieTecDecodeJPEGLossless allocates and returns a pointer to an +XieDecodeJPEGLosslessParam structure. The returned structure represents the list of +parameters required by the decode technique and may be used as the decode_param argument of +XieFloImportClientPhoto (when the decode_tech argument is +xieValDecodeJPEGLossless). + +If insufficient memory is available, XieTecDecodeJPEGLossless returns NULL. To free the +memory allocated to this structure, use XFree. + +The JPEG lossless technique is the Huffman predictive sequential lossless encoding technique that is +defined in ISO DIS 10918-1 "Digital Compression and Coding of Continuous-tone Still Images". +This technique is not available in the R6 sample implementation of XIE. + +interleave describes how the bands of triple band data are interleaved; either all bands are +interleaved within a single encoded stream, or three separate encoded streams are expected. One of +the following standard interleave values can be assigned to interleave: + +xieValBandByPixel +xieValBandByPlane + +For triple band data, band_order specifies the order in which the image bands were originally +encoded. One of the following standard orientation values can be assigned to band_order: + +xieValLSFirst +xieValMSFirst + +The least significant band of trichromatic data is the first band mentioned in the common name of the +colorspace: red is the least significant band of RGB data. band_order specifies whether this band +corresponds with the least significant or most significant image plane. Each plane is decoded into a +separate data stream: + +band +LSFirst +MSFirst +0 +Red band +Blue band +1 +Green band +Green band +2 +Blue band +Red band + +The arguments interleave and band_order are ignored for single band images. +Structures +XieTecDecodeJPEGLossless sets the structure field interleave to the value of the +argument interleave; and the structure field band_order to the value of the argument +band_order. + +typedef unsigned XieOrientation; +typedef struct { + XieInterleave interleave; + XieOrientation band_order; +} XieDecodeJPEGLosslessParam; +/* Definitions for Interleave */ +#define xieValBandByPixel 1 +#define xieValBandByPlane 2 + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloImportClientPhoto, XiePutClientData + XIElib - Technique Functions XieTecDitherOrdered +Name +XieTecDitherOrdered - allocate and fill an XieDitherOrderedParam structure +Syntax +XieDitherOrderedParam *XieTecDitherOrdered (threshold_order) +unsigned int threshold_order; +Arguments +threshold_order Specifies a value to determine the size of the dither matrix. +Returns +The XieDitherOrderedParam structure. +Description +XieTecDitherOrdered allocates and returns a pointer to an XieDitherOrderedParam +structure. The returned structure represents the list of parameters required by the decode technique +and may be used as the decode_param argument of XieFloImportClientPhoto (when the +decode_tech argument is xieValDitherOrdered). + +If insufficient memory is available, XieTecDitherOrdered returns NULL. To free the memory +allocated to this structure, use XFree. + +The dispersed-dot ordered dither technique replaces a matrix, or block, of pixels with a patterned +matrix of pixels. This patterned matrix of pixels is applied across the entire image. Because these +patterns may introduce artifacts that are distracting to the eye, the threshold_order parameter is +available to determine the size of the dither matrix, and therefore, the number of levels that can be +simulated. If the value of threshold_order is m, the threshold matrix can simulate 2m + 1 levels. +Structures +XieTecDitherOrdered sets the structure field threshold_order to the value of the +argument threshold_order. + +typedef struct { + unsigned int threshold_order; +} XieDitherOrderedParam; +See Also +XieFloDither + XIElib - Technique Functions XieTecEncodeUncompressedSingle +Name +XieTecEncodeUncompressedSingle - allocate and fill an +XieEncodeUncompressedSingleParam structure +Syntax +XieEncodeUncompressedSingleParam *XieTecEncodeUncompressedSingle +(fill_order, pixel_order, pixel_stride, scanline_pad) +XieOrientation fill_order; +XieOrientation pixel_order; +unsigned int pixel_stride; +unsigned int scanline_pad; +Arguments +fill_order Specifies the method of pixel packing. +pixel_order Specifies pixel ordering within the data stream. +pixel_stride Specifies the number of bits between consecutive pixels within a +scanline. +scanline_pad Specifies a multiple of bytes to which each scanline is padded. +Returns +The XieEncodeUncompressedSingleParam structure. +Description +XieTecEncodeUncompressedSingle allocates and returns a pointer to an +XieEncodeUncompressedSingleParam structure. The returned structure represents the list of +parameters required by the encode technique and may be used as the encode_param argument of +XieFloExportClientPhoto and XieFloExportPhotomap (when the encode_tech +argument is xieValEncodeUncompressedSingle). + +If insufficient memory is available, XieTecEncodeUncompressedSingle returns NULL. To +free the memory allocated to this structure, use XFree. + +The encode uncompressed single technique is used when no compression scheme is to be applied to +single band image data. The parameters define the format of the data stream of uncompressed data +that is made available for client retrieval via XieGetClientData. When multiple pixels are put in +the same byte or a pixel spans multiple bytes, fill_order specifies whether the pixels (or parts of +pixels) are packed into the most or least significant bits of a byte first. For pixels that span a byte +boundary, pixel_order defines whether the most or least significant bits of the pixel are put first +within the data stream. + +One of the following standard orientation values can be assigned to fill_order and +pixel_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the relationship between fill_order and pixel_order, using two +10-bit pixels, each with two bits of pad (within each pixel the LS-bits are 0 and a, the MS-bits are +9 and j, and the pad bits are p). + +fill order +LSFirst (pixel order) +MSFirst (pixel order) +LSFirst +76543210 dcbapp98 ppjihgfe +98765432 jihgpp10 ppfedcba +MSFirst +76543210 98ppdcba jihgfepp +98765432 10ppjihg fedcbapp + +pixel_stride is the number of bits between the start of consecutive pixels within a scanline. It +must be at least enough bits to contain the number of source levels. scanline_pad defines a +multiple of bytes to which each scanline is padded; valid values are: 0 (not aligned), 1, 2, 4, 8, and +16. +Structures +XieTecEncodeUncompressedSingle sets the structure field fill_order to the value of the +argument fill_order; the structure field pixel_order to the value of the argument +pixel_order; the structure field pixel_stride to the value of the argument pixel_stride; +and the structure field scanline_pad to the value of the argument scanline_pad. + +typedef unsigned XieOrientation; +typedef struct { + XieOrientation fill_order; + XieOrientation pixel_order; + unsigned int pixel_stride; + unsigned int scanline_pad; +} XieEncodeUncompressedSingleParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloExportClientPhoto, XieFloExportPhotomap, XieGetClientData + XIElib - Technique Functions XieTecEncodeUncompressedTriple +Name +XieTecEncodeUncompressedTriple - allocate and fill an +XieEncodeUncompressedTripleParam structure +Syntax +XieEncodeUncompressedTripleParam *XieTecEncodeUncompressedTriple +(fill_order, pixel_order, band_order, interleave, +pixel_stride, scanline_pad) +XieOrientation fill_order; +XieOrientation pixel_order; +XieOrientation band_order; +XieInterleave interleave; +unsigned char pixel_stride[3]; +unsigned char scanline_pad[3]; +Arguments +fill_order Specifies the method of pixel packing. +pixel_order Specifies pixel ordering within the data stream. +band_order Specifies the order of the image data sent through the protocol stream. +interleave Specifies how the image bands are interleaved. +pixel_stride Specifies the number of bits between consecutive pixels within a +scanline. +scanline_pad Specifies a multiple of bytes to which each scanline is padded. +Returns +The XieEncodeUncompressedTripleParam structure. +Description +XieTecEncodeUncompressedTriple allocates and returns a pointer to an +XieEncodeUncompressedTripleParam structure. The returned structure represents the list of +parameters required by the encode technique and may be used as the encode_param argument of +XieFloExportClientPhoto and XieFloExportPhotomap (when the encode_tech +argument is xieValEncodeUncompressedTriple). + +If insufficient memory is available, XieTecEncodeUncompressedTriple returns NULL. To +free the memory allocated to this structure, use XFree. + +The encode uncompressed triple technique is used when no compression scheme is to be applied to +triple band image data. The parameters define the format of the data stream of uncompressed data +that is made available for client retrieval via XieGetClientData. When multiple pixels are put in +the same byte or a pixel spans multiple bytes, fill_order specifies whether the pixels (or parts of +pixels) are packed into the most or least significant bits of a byte first. For pixels that span a byte +boundary, pixel_order defines whether the most or least significant bits of the pixel are put first +within the data stream. + +One of the following standard orientation values can be assigned to fill_order and +pixel_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the relationship between fill_order and pixel_order, using two +10-bit pixels, each with two bits of pad (within each pixel the LS-bits are 0 and a, the MS-bits are +9 and j, and the pad bits are p) + +fill order +LSFirst (pixel order) +MSFirst (pixel order) +LSFirst +76543210 dcbapp98 ppjihgfe +98765432 jihgpp10 ppfedcba +MSFirst +76543210 98ppdcba jihgfepp +98765432 10ppjihg fedcbapp + +pixel_stride is the number of bits between the start of consecutive pixels within a scanline. It +must be at least enough bits to contain the number of source levels. scanline_pad defines a +multiple of bytes to which each scanline is padded; valid values are: 0 (not aligned), 1, 2, 4, 8, and +16. band_order is the order of the image bands or image planes as they are transmitted through +the protocol stream. One of the following standard orientation values can be assigned to +band_order: + +xieValLSFirst +xieValMSFirst + +The least significant band of trichromatic data is the first band mentioned in the common name of the +colorspace: red is the least significant band of RGB data. For band-by-pixel data, band_order +specifies whether this band is put in the least or most significant bits of a pixel: + +LSFirst +MSFirst +B1B0G2G1G0R2R1R0 +R2R1R0G2G1G0B1B0 + +For band-by-plane data, band_order specifies whether this band corresponds with the least +significant or most significant image plane. Each plane is transported as a separate data stream: + +band +LSFirst +MSFirst +0 +R7R6R5R4R3R2R1R0 +B7B6B5B4B3B2B1B0 +1 +G7G6G5G4G3G2G1G0 +G7G6G5G4G3G2G1G0 +2 +B7B6B5B4B3B2B1B0 +R7R6R5R4R3R2R1R0 + +interleave describes how the bands are interleaved (per pixel within a single plane, or sent as +three separate planes). One of the following standard interleave values can be assigned to +interleave: + +xieValBandByPixel +xieValBandByPlane + +Export of down-sampled band-by-pixel data is not supported: all bands must have equal widths and +equal heights. +Structures +XieTecEncodeUncompressedTriple sets the structure field fill_order to the value of the +argument fill_order; the structure field pixel_order to the value of the argument +pixel_order; the structure field band_order to the value of the argument band_order; the +structure field interleave to the value of the argument interleave; the structure field +pixel_stride to the value of the argument pixel_stride; and the structure field +scanline_pad to the value of the argument scanline_pad. + +typedef unsigned XieOrientation; +typedef struct { + unsigned char pixel_stride[3]; + XieOrientation pixel_order; + unsigned char scanline_pad[3]; + XieOrientation fill_order; + XieOrientation band_order; + XieInterleave interleave; +} XieEncodeUncompressedTripleParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 + +/* Definitions for Interleave */ +#define xieValBandByPixel 1 +#define xieValBandByPlane 2 +See Also +XieFloExportClientPhoto, XieFloExportPhotomap, XieGetClientData + XIElib - Technique Functions XieTecEncodeG31D +Name +XieTecEncodeG31D - allocate and fill an XieEncodeG31DParam structure +Syntax +XieEncodeG31DParam *XieTecEncodeG31D (align_eol, radiometric, +encoded_order) +Bool align_eol; +Bool radiometric; +XieOrientation encoded_order; +Arguments +align_eol Specifies the use of fill bits preceding EOL codes. +radiometric Specifies how white runs are encoded. +encoded_order Specifies the bit order of the encoded data. +Returns +The XieEncodeG31DParam structure. +Description +XieTecEncodeG31D allocates and returns a pointer to an XieEncodeG31DParam structure. +The returned structure represents the list of parameters required by the encode technique and may be +used as the encode_param argument of XieFloExportClientPhoto and +XieFloExportPhotomap (when the encode_tech argument is xieValEncodeG31D). + +If insufficient memory is available, XieTecEncodeG31D returns NULL. To free the memory +allocated to this structure, use XFree. + +CCITT-G31D is the CCITT group 3 one-dimensional encoding technique as defined by CCITT T.4, +"Standardization of Group 3 Facsimile Apparatus for Document Transmission". + +If True, align_eol, specifies that sufficient fill bits must precede EOL codes to guarantee that +each EOL will end on a byte boundary (thus EOL will be a nibble of zero followed by a byte of one: +xxxx,00002 0000,00012). radiometric specifies that image ones will be encoded as white runs, +or conversely, image zeros will be encoded as white runs, if radiometric is False. +encoded_order specifies the bit order for the encoded data. One of the following standard +orientation values can be assigned to encoded_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the encoded bit order of two bytes (within each byte the first encoded bit is +0, and the last is bit 7): + +LSFirst +MSFirst +76543210 76543210 +01234567 01234567 +Structures +XieTecEncodeG31D sets the structure field align_eol to the value of the argument +align_eol; the structure field radiometric to the value of the argument radiometric; and +the structure field encoded_order to the value of the argument encoded_order. + +typedef unsigned XieOrientation; +typedef struct { + Bool align_eol; + Bool radiometric; + XieOrientation encoded_order; +} XieEncodeG31DParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloExportClientPhoto, XieFloExportPhotomap, XieGetClientData + XIElib - Technique Functions XieTecEncodeG32D +Name +XieTecEncodeG32D - allocate and fill an XieEncodeG32DParam structure +Syntax +XieEncodeG32DParam *XieTecEncodeG32D (uncompressed, align_eol, +radiometric, encoded_order, k_factor) +Bool uncompressed; +Bool align_eol; +Bool radiometric; +XieOrientation encoded_order; +unsigned long k_factor; +Arguments +uncompressed Specifies the use of the uncompressed-mode CCITT extension. +align_eol Specifies the use of fill bits preceding EOL codes. +radiometric Specifies how white runs are encoded. +encoded_order Specifies the bit order of the encoded data. +k_factor Specifies the number of two-dimensional scanlines to produce for +each one-dimensional scanline. +Returns +The XieEncodeG32DParam structure. +Description +XieTecEncodeG32D allocates and returns a pointer to an XieEncodeG32DParam structure. +The returned structure represents the list of parameters required by the encode technique and may be +used as the encode_param argument of XieFloExportClientPhoto and +XieFloExportPhotomap (when the encode_tech argument is xieValEncodeG32D). + +If insufficient memory is available, XieTecEncodeG32D returns NULL. To free the memory +allocated to this structure, use XFree. + +CCITT-G32D is the CCITT group 3 two-dimensional encoding technique as defined by CCITT T.4, +"Standardization of Group 3 Facsimile Apparatus for Document Transmission". + +If True, uncompressed, will enable the use of the uncompressed-mode CCITT extension. If +True, align_eol, specifies that sufficient fill bits must precede EOL codes to guarantee that each +EOL will end on a byte boundary (thus EOL will be a nibble of zero followed by a byte of one: +xxxx,00002 0000,00012). radiometric specifies that image ones will be encoded as white runs, +or conversely, image zeros will be encoded as white runs, if radiometric is False. +encoded_order specifies the bit order for the encoded data. One of the following standard +orientation values can be assigned to encoded_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the encoded bit order of two bytes (within each byte the first encoded bit is +0, and the last is bit 7): + +LSFirst +MSFirst +76543210 76543210 +01234567 01234567 + +k_factor specifies the number of two-dimensional scanlines to produce for each one-dimensional +scanline. +Structures +XieTecEncodeG32D sets the structure field uncompressed to the value of the argument +uncompressed; the structure field align_eol to the value of the argument align_eol; the +structure field radiometric to the value of the argument radiometric; the structure field +encoded_order to the value of the argument encoded_order; and the structure field +k_factor to the value of the argument k_factor. + +typedef unsigned XieOrientation; +typedef struct { + Bool uncompressed; + Bool align_eol; + Bool radiometric; + XieOrientation encoded_order; + unsigned long k_factor; +} XieEncodeG32DParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloExportClientPhoto, XieFloExportPhotomap, XieGetClientData + XIElib - Technique Functions XieTecEncodeG42D +Name +XieTecEncodeG42D - allocate and fill an XieEncodeG42DParam structure +Syntax +XieEncodeG42DParam *XieTecEncodeG42D (uncompressed, radiometric, +encoded_order) +Bool uncompressed; +Bool radiometric; +XieOrientation encoded_order; +Arguments +uncompressed Specifies the use of the uncompressed-mode CCITT extension. +radiometric Specifies how white runs are encoded. +encoded_order Specifies the bit order of the encoded data. +Returns +The XieEncodeG42DParam structure. +Description +XieTecEncodeG42D allocates and returns a pointer to an XieEncodeG42DParam structure. +The returned structure represents the list of parameters required by the encode technique and may be +used as the encode_param argument of XieFloExportClientPhoto and +XieFloExportPhotomap (when the encode_tech argument is xieValEncodeG42D). + +If insufficient memory is available, XieTecEncodeG42D returns NULL. To free the memory +allocated to this structure, use XFree. + +CCITT-G42D is the CCITT group 4 two-dimensional encoding technique as defined by CCITT T.6, +"Facsimile Coding Schemes and Coding Control Functions for Group 4 Facsimile Apparatus". + +If True, uncompressed will enable the use of the uncompressed-mode CCITT extension. +radiometric specifies that image ones will be encoded as white runs, or conversely, image zeros +will be encoded as white runs, if radiometric is False. encoded_order specifies the bit +order for the encoded data. One of the following standard orientation values can be assigned to +encoded_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the encoded bit order of two bytes (within each byte the first encoded bit is +0, and the last is bit 7): + +LSFirst +MSFirst +76543210 76543210 +01234567 01234567 +Structures +XieTecEncodeG42D sets the structure field uncompressed to the value of the argument +uncompressed; the structure field radiometric to the value of the argument radiometric; +and the structure field encoded_order to the value of the argument encoded_order. + +typedef unsigned XieOrientation; +typedef struct { + Bool uncompressed; + Bool radiometric; + XieOrientation encoded_order; +} XieEncodeG42DParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloExportClientPhoto, XieFloExportPhotomap, XieGetClientData + XIElib - Technique Functions XieTecEncodeServerChoice +Name +XieTecEncodeServerChoice - allocate and fill an XieEncodeServerChoiceParam structure +Syntax +XieEncodeServerChoiceParam *XieTecEncodeServerChoice (preference) +unsigned int preference; +Arguments +preference Specifies a hint to help the server make its choice. +Returns +The XieEncodeServerChoiceParam structure. +Description +XieTecEncodeServerChoice allocates and returns a pointer to an +XieEncodeServerChoiceParam structure. The returned structure represents the list of +parameters required by the encode technique and may be used as the encode_param argument of +XieFloExportPhotomap (when the encode_tech argument is +xieValEncodeServerChoice). + +If insufficient memory is available, XieTecEncodeServerChoice returns NULL. To free the +memory allocated to this structure, use XFree. + +The server choice technique allows the server to choose an encode technique when exporting to a +photomap. A photomap is a server resource that can be used to store image data. preference +specifies an optional hint that can be provided to help the server make its choice, but the server is +not obligated to obey the hint. One of the following standard server choice preference values can be +assigned to preference: + +xieValPreferDefault +xieValPreferSpace +xieValPreferTime + +xieValPreferTime hints that retrieval performance is the desired metric, whereas +xieValPreferSpace indicates that frugal use of storage space is more important. Normally the +server choice technique must choose a lossless encode technique, but when data is received from an +adjacent upstream import element, it may choose to pass the import elements input data directly to +the photomap. +Structures +XieTecEncodeServerChoice sets the structure field preference to the value of the +argument preference. + +typedef struct { + unsigned int preference; +} XieEncodeServerChoiceParam; + +/* Definitions for ServerChoice Preference Hints */ +#define xieValPreferDefault 0 +#define xieValPreferSpace 1 +#define xieValPreferTime 2 +See Also +XieFloExportPhotomap + XIElib - Technique Functions XieTecEncodeJPEGBaseline +Name +XieTecEncodeJPEGBaseline - allocate and fill an XieEncodeJPEGBaselineParam structure +Syntax +XieEncodeJPEGBaselineParam *XieTecEncodeJPEGBaseline (interleave, +band_order, horizontal_samples, vertical_samples, +q_table, q_size, ac_table, ac_size, dc_table, dc_size) +XieInterleave interleave; +XieOrientation band_order; +unsigned char horizontal_samples[3]; +unsigned char vertical_samples[3]; +char *q_table; +unsigned int q_size; +char *ac_table; +unsigned int ac_size; +char *dc_table; +unsigned int dc_size; +Arguments +interleave Specifies how the image bands will be interleaved. +band_order Specifies the order in which the image bands were originally encoded. +horizontal_samples Specifies the horizontal sampling factor. +vertical_samples Specifies the vertical sampling factor. +q_table Specifies the quantization table. +q_size Specifies the number of elements in q_table. +ac_table Specifies the AC Huffman table. +ac_size Specifies the number of elements in ac_table. +dc_table Specifies the DC Huffman table. +dc_size Specifies the number of elements in dc_table. +Returns +The XieEncodeJPEGBaselineParam structure. +Description +XieTecEncodeJPEGBaseline allocates and returns a pointer to an +XieEncodeJPEGBaselineParam structure. The returned structure represents the list of +parameters required by the encode technique and may be used as the encode_param argument of +XieFloExportClientPhoto and XieFloExportPhotomap (when the encode_tech +argument is xieValEncodeJPEGBaseline). + +If insufficient memory is available, XieTecEncodeJPEGBaseline returns NULL. +XieTecEncodeJPEGBaseline allocates memory for the structure fields q_table, +ac_table, and dc_table; to free the memory allocated to the structure +XieEncodeJPEGBaselineParam, use XieFreeEncodeJPEGBaseline. + +JPEG-Baseline is baseline Huffman DCT encoding as defined by ISO DIS 10918-1 "Digital +Compression and Coding of Continuous-tone Still Images". A stream of JPEG Interchange Format +(JIF) data is produced: all tables, compressed data, and so on are embedded in the data stream, all +delineated by markers. + +For optimal results, clients should ensure that the colorspace of triple band image data flowing into +ExportClientPhoto or ExportPhotomap, for encoding by the JPEGBaseline encoder, is YCbCr. + +interleave determines whether all bands of a triple band image will be interleaved within a single +encoded stream or whether three separate encoded streams will be produced. One of the following +standard interleave values can be assigned to interleave: + +xieValBandByPixel +xieValBandByPlane + +For triple band data, band_order specifies the order in which the image bands were originally +encoded. One of the following standard orientation values can be assigned to band_order: + +xieValLSFirst +xieValMSFirst + +The least significant band of trichromatic data is the first band mentioned in the common name of the +colorspace: red is the least significant band of RGB data. band_order specifies whether this band +corresponds with the least significant or most significant image plane. Each plane is encoded from a +separate data stream: + +band +LSFirst +MSFirst +0 +Red band +Blue band +1 +Green band +Green band +2 +Blue band +Red band + +The arguments horizontal_samples and vertical_samples are the horizontal and vertical +sampling factors. q_table is the quantization table. ac_table specifies the AC Huffman table +and dc_table specifies the DC Huffman table. + +There may be one q_table per band or a single q_table shared between all bands. Generally +there is a single AC/DC pair of Huffman tables, but for triple band band-by-pixel data there may be +two pairs of tables (one for the luminance band and the other for the chromanance bands). If any table +is specified with zero length, it indicates that the server implementor is to supply that table (for +example, the example tables defined in ISO DIS 10918-1 "Digital Compression and Coding of +Continuous-tone Still Images"). + +The arguments interleave, band_order, horizontal_samples, and +vertical_samples are ignored for single band images, and horizontal_samples and +vertical_samples are always ignored if interleave is band-by-plane. +horizontal_samples and vertical_samples share the definitions and restrictions +stipulated for parameters Hi and Vi, respectively, that are specified in annexes A and B of ISO DIS +10918-1 "Digital Compression and Coding of Continuous-tone Still Images". +Structures +XieTecEncodeJPEGBaseline sets the structure field interleave to the value of the +argument interleave; the structure field band_order to the value of the argument +band_order; the structure field horizontal_sample to the values of the argument +horizontal_sample; the structure field vertical_sample to the values of the argument +vertical_sample; and the structure fields q_table, q_size, ac_table, ac_size, +dc_table, dc_size to the values of the arguments q_table, q_size, ac_table, +ac_size, dc_table, dc_size. + +typedef unsigned XieOrientation; +typedef struct { + XieInterleave interleave; + XieOrientation band_order; + unsigned char horizontal_samples[3]; + unsigned char vertical_samples[3]; + char *q_table; + unsigned int q_size; + char *ac_table; + unsigned int ac_size; + char *dc_table; + unsigned int dc_size; +} XieEncodeJPEGBaselineParam; + +/* Definitions for Interleave */ +#define xieValBandByPixel 1 +#define xieValBandByPlane 2 + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloExportClientPhoto, XieFloExportPhotomap, XieFreeEncodeJPEGBaseline, +XieFloConvertFromRGB, XieTecRGBToYCbCr, XieGetClientData + XIElib - Technique Functions XieTecEncodeJPEGLossless +Name +XieTecEncodeJPEGLossless - allocate and fill an XieEncodeJPEGLosslessParam structure +Syntax +XieEncodeJPEGLosslessParam *XieTecEncodeJPEGLossless (interleave, +band_order, predictor, table, table_size) +XieInterleave interleave; +XieOrientation band_order; +unsigned char predictor[3]; +char *table; +unsigned int table_size; +Arguments +interleave Specifies how the image bands will be interleaved. +band_order Specifies the order in which the image bands were originally encoded. +predictor Specifies the predictor selection value. +table Specifies the lossless entropy encoding table. +table_size Specifies the number of elements in table. +Returns +The XieEncodeJPEGLosslessParam structure. +Description +XieTecEncodeJPEGLossless allocates and returns a pointer to an +XieEncodeJPEGLosslessParam structure. The returned structure represents the list of +parameters required by the encode technique and may be used as the encode_param argument of +XieFloExportClientPhoto and XieFloExportPhotomap (when the encode_tech +argument is xieValEncodeJPEGLossless). + +If insufficient memory is available, XieTecEncodeJPEGLossless returns NULL. +XieTecEncodeJPEGLossless allocates memory for the structure field table; to free the +memory allocated to the structure XieEncodeJPEGLosslessParam, use +XieFreeEncodeJPEGLossless. + +JPEG-Lossless, corresponds to frames encoded using Huffman, predictive sequential lossless +encoding as defined by ISO DIS 10918-1 "Digital Compression and Coding of Continuous-tone Still +Images". A data stream of JPEG Interchange Format (JIF) data is returned: all tables, compressed +data, and so on are embedded in the data stream, all delineated by markers. +This technique is not available in the R6 sample implementation of XIE. + + +interleave determines whether all bands of a triple band image will be interleaved within a single +encoded stream or whether three separate encoded streams will be produced. One of the following +standard interleave values can be assigned to interleave: + +xieValBandByPixel +xieValBandByPlane + +For triple band data, band_order specifies the order in which the image bands were originally +encoded. One of the following standard orientation values can be assigned to band_order: + +xieValLSFirst +xieValMSFirst + +The least significant band of trichromatic data is the first band mentioned in the common name of the +colorspace: red is the least significant band of RGB data. band_order specifies whether this band +corresponds with the least significant or most significant image plane. Each plane is encoded from a +separate data stream: + +band +LSFirst +MSFirst +0 +Red band +Blue band +1 +Green band +Green band +2 +Blue band +Red band + +The arguments interleave and band_order are ignored for single band images. + +predictor is the predictor selection value (one per band). table is the lossless entropy encoding +table (up to one per band). Specifying a table of length zero indicates that the server implementor +should supply a table (for example, the example tables defined in ISO DIS 10918-1 "Digital +Compression and Coding of Continuous-Tone Still Images"). + +Structures +XieTecEncodeJPEGLossless sets the structure field interleave to the value of the +argument interleave; the structure field band_order to the value of the argument +band_order; the structure field predictor to the values of the argument predictor; and the +structure fields table, table_size to the values of the arguments table, table_size. + +typedef unsigned XieOrientation; +typedef struct { + XieInterleave interleave; + XieOrientation band_order; + unsigned char predictor[3]; + char *table; + unsigned int table_size; +} XieEncodeJPEGLosslessParam; +/* Definitions for Interleave */ +#define xieValBandByPixel 1 +#define xieValBandByPlane 2 + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloExportClientPhoto, XieFloExportPhotomap, XieGetClientData + XIElib - Technique Functions XieTecEncodeTIFF2 +Name +XieTecEncodeTIFF2 - allocate and fill an XieEncodeTIFF2Param structure +Syntax +XieEncodeTIFF2Param *XieTecEncodeTIFF2 (encoded_order, radiometric) +XieOrientation encoded_order; +Bool radiometric; +Arguments +encoded_order Specifies the bit order of the encoded data. +radiometric Specifies how white runs are decoded. +Returns +The XieEncodeTIFF2Param structure. +Description +XieTecEncodeTIFF2 allocates and returns a pointer to an XieEncodeTIFF2Param structure. +The returned structure represents the list of parameters required by the encode technique and may be +used as the encode_param argument of XieFloExportClientPhoto and +XieFloExportPhotomap (when the encode_tech argument is xieValEncodeTIFF2). + +If insufficient memory is available, XieTecEncodeTIFF2 returns NULL. To free the memory +allocated to this structure, use XFree. + +TIFF-2 is modified Huffman compression as described in "TIFF Tag Image File Format", revision +6.0, draft 2, by Aldus Corporation (TIFF compression scheme 2). + +radiometric specifies that image ones will be encoded as white runs, or conversely, image zeros +will be encoded as white runs, if radiometric is False. encoded_order specifies the bit +order for the encoded data. One of the following standard orientation values can be assigned to +encoded_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the encoded bit order of two bytes (within each byte the first encoded bit is +0, and the last is bit 7): + +LSFirst +MSFirst +76543210 76543210 +01234567 01234567 +Structures +XieTecEncodeTIFF2 sets the structure field encoded_order to the value of the argument +encoded_order; and the structure field radiometric to the value of the argument +radiometric. + +typedef unsigned XieOrientation; +typedef struct { + XieOrientation encoded_order; + Bool radiometric; +} XieEncodeTIFF2Param; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloExportClientPhoto, XieFloExportPhotomap, XieGetClientData + XIElib - Technique Functions XieTecEncodeTIFFPackBits +Name +XieTecEncodeTIFFPackBits - allocate and fill an XieEncodeTIFFPackBitsParam structure +Syntax +XieEncodeTIFFPackBitsParam *XieTecEncodeTIFFPackBits (encoded_order) +XieOrientation encoded_order; +Arguments +encoded_order Specifies the bit order of the encoded data. +Returns +The XieEncodeTIFFPackBitsParam structure. +Description +XieTecEncodeTIFFPackBits allocates and returns a pointer to an +XieEncodeTIFFPackBitsParam structure. The returned structure represents the list of +parameters required by the encode technique and may be used as the encode_param argument of +XieFloExportClientPhoto and XieFloExportPhotomap (when the encode_tech +argument is xieValEncodeTIFFPackBits). + +If insufficient memory is available, XieTecEncodeTIFFPackBits returns NULL. To free the +memory allocated to this structure, use XFree. + +TIFF-PackBits is byte-oriented run-length encoding as described in "TIFF Tag Image File Format", +revision 6.0, draft 2, by Aldus Corporation (TIFF compression scheme 32773). + +encoded_order specifies the bit order of the encoded data. One of the following standard +orientation values can be assigned to encoded_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the encoded bit order of two bytes (within each byte the first encoded bit is +0, and the last is bit 7): + +LSFirst +MSFirst +76543210 76543210 +01234567 01234567 +Structures +XieTecEncodeTIFFPackBits sets the structure field encoded_order to the value of the +argument encoded_order. + +typedef unsigned XieOrientation; +typedef struct { + XieOrientation encoded_order; +} XieEncodeTIFFPackBitsParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloExportClientPhoto, XieFloExportPhotomap, XieGetClientData + XIElib - Technique Functions XieTecGeomAntialiasByArea +Name +XieTecGeomAntialiasByArea - allocate and fill an XieGeomAntialiasByAreaParam structure +Syntax +XieGeomAntialiasByAreaParam *XieTecGeomAntialiasByArea (simple) +int simple; +Arguments +simple Specifies the approximation form to use. +Returns +The XieGeomAntialiasByAreaParam structure. +Description +XieTecGeomAntialiasByArea allocates and returns a pointer to an +XieGeomAntialiasByAreaParam structure. The returned structure represents the list of +parameters required by the geometry technique and may be used as the sample_param argument of +XieFloGeometry (when the sample_tech argument is xieValGeomAntialiasByArea). + +If insufficient memory is available, XieTecGeomAntialiasByArea returns NULL. To free the +memory allocated to this structure, use XFree. + +Antialiasing techniques incorporate information from an "area" of pixels in the input image in order +to produce each output pixel. This implies that line dropouts and other artifacts will occur less often, +and the output image may have markedly better resemblance to the input image. The technique +AntialiasByArea computes the output image by assigning to each output pixel the weighted average of +the intensity values of input pixels that fall within its area. That is, the four corners of the output +pixel are projected back onto the input image. + +If simple is zero (0), the size and shape of the "area" are determined by the parameters of the +geometric transformation. The boundaries of the "area" may not fall on pixel boundaries and, in the +case of nonorthogonal rotation of the image, "area" may not be rectangular. Partial input pixel values +may have to be calculated: the antialias-by-area technique preserves shape but can be very slow +computationally. + +Because of the computational complexity of this method, two approximations are supported. If +simple is nonzero, the pixels covered by the projected area will be averaged without regard to the +relative amount of area that they contain: if they are touched by the area, they are included in a simple +average. If simple is set to N, with N odd and greater than one (3,5,7, ...), then only the center point +of the output pixel is projected, and a simple average is taken of an N by N window centered on the +projection. For best results, N should correspond roughly to the amount of scaling that will be done. + +Structures +XieTecGeomAntialiasByArea sets the structure field simple to the value of the argument +simple. + +typedef struct { + int simple; +} XieGeomAntialiasByAreaParam; +See Also +XieFloGeometry + XIElib - Technique Functions XieTecGeomAntialiasByLowpass +Name +XieTecGeomAntialiasByLowpass - allocate and fill an XieGeomAntialiasByLowpassParam +structure +Syntax +XieGeomAntialiasByLowpassParam *XieTecGeomAntialiasByLowpass +(kernel_size) +int kernel_size; +Arguments +kernel_size Specifies the size of the image kernel. +Returns +The XieGeomAntialiasByLowpassParam structure. +Description +XieTecGeomAntialiasByLowpass allocates and returns a pointer to an +XieGeomAntialiasByLowpassParam structure. The returned structure represents the list of +parameters required by the geometry technique and may be used as the sample_param argument of +XieFloGeometry (when the sample_tech argument is +xieValGeomAntialiasByLowpass). + +If insufficient memory is available, XieTecGeomAntialiasByLowpass returns NULL. To free +the memory allocated to this structure, use XFree. + +Antialiasing techniques incorporate information from an "area" of pixels in the input image in order +to produce each output pixel. This implies that line dropouts and other artifacts will occur less often, +and the output image may have markedly better resemblance to the input image. The technique +AntialiasByLowpass represents an approximation to antialias-by-area that can be faster, yet provides +similar results. First, a low-pass filter is applied by passing an nxn boxcar kernel over the original +input image. Output pixel values are then derived using a nearest neighbor sampling method that +selects the value of the input pixel in the upper-left corner of the area mapped back from the output +pixel. + +The user is allowed to select the size of the image kernel via the kernel_size parameter. For best +results, kernel_size should be chosen to correspond roughly to the amount of scaling that will be +done. Note that the server chooses the best kernel for the appropriate size; the values used in the +kernel are not alterable by the client application. Clients wishing to specify the kernel in more detail +should use the convolve technique directly. +Structures +XieTecGeomAntialiasByLowpass sets the structure field kernel_size to the value of the +argument kernel_size. + +typedef struct { + int kernel_size; +} XieGeomAntialiasByLowpassParam; +See Also +XieFloGeometry, XieFloConvolve, XieTecGeomAntialiasByArea + XIElib - Technique Functions XieTecGeomGaussian +Name +XieTecGeomGaussian - allocate and fill an XieGeomGaussianParam structure +Syntax +XieGeomGaussianParam *XieTecGeomGaussian (sigma, normalize, radius, +simple) +double sigma; +double normalize; +unsigned int radius; +Bool simple; +Arguments +sigma Specifies the drop-off rate. +normalize Specifies a normalization constant. +radius Specifies the extent of computation. +simple Specifies the approximation form to use. +Returns +The XieGeomGaussianParam structure. +Description +XieTecGeomGaussian allocates and returns a pointer to an XieGeomGaussianParam +structure. The returned structure represents the list of parameters required by the geometry technique +and may be used as the sample_param argument of XieFloGeometry (when the +sample_tech argument is xieValGeomGaussian). + +If insufficient memory is available, XieTecGeomGaussian returns NULL. To free the memory +allocated to this structure, use XFree. + +A Geometry element can be visualized as stepping through each possible output pixel location in turn, +and computing the location from which to obtain each input pixel value. Each pixel (x',y') in the +output image is mapped to the coordinate location (x,y) in src by: + + + +It is not unusual that the input location (x,y) so derived will be nonintegral and will not correspond +exactly to a single pixel in the input image. + +From sampling theory, a bandwidth limited continuous input image can be recovered perfectly (under +certain conditions) from its sampled output by computing the convolution: + + + +Here I(x,y) is the continuous image, i(m,n) the discrete sampled image, and h(u,v) is the impulse +response function for an appropriate low-pass filter. The specific form of h(u,v) for a Gaussian +impulse response function is given by: + + + +The term is called the "normalization constant" and may be altered using the normalize +parameter. The suggested value for * (sigma, the drop-off rate) is 1. Note that all technique +parameters must be chosen in concert + +radius defines the extent of computation. A suggested value for radius is one, that is, only pixels +within a distance of one in either the x or y direction are involved in the calculation. + +For computational convenience, a simplified form of Gaussian interpolation is provided. If simple +is True, the impulse-response function h(u,v) is: + + + +The normalization factor N is defined by normalize. As with true Gaussian interpolation, the +radius parameter is used to determine the number of pixels involved in the computation. +Structures +XieTecGeomGaussian sets the structure field sigma to the value of the argument sigma; the +structure field normalize to the value of the argument normalize; the structure field radius to +the value of the argument radius; and the structure field simple to the value of the argument +simple. + +typedef struct { + float sigma; + float normalize; + unsigned int radius; + Bool simple; +} XieGeomGaussianParam; +See Also +XieFloGeometry + XIElib - Technique Functions XieTecGeomNearestNeighbor +Name +XieTecGeomNearestNeighbor - allocate and fill an XieGeomNearestNeighborParam structure +Syntax +XieGeomNearestNeighborParam *XieTecGeomNearestNeighbor (modify) + unsigned int modify; +Arguments +modify Specifies technique behavior on even boundaries. +Returns +The XieGeomNearestNeighborParam structure. +Description +XieTecGeomNearestNeighbor allocates and returns a pointer to an +XieGeomNearestNeighborParam structure. The returned structure represents the list of +parameters required by the geometry technique and may be used as the sample_param argument of +XieFloGeometry (when the sample_tech argument is xieValGeomNearestNeighbor). + +If insufficient memory is available, XieTecGeomNearestNeighbor returns NULL. To free the +memory allocated to this structure, use XFree. + +A Geometry element can be visualized as stepping through each possible output pixel location in turn, +and computing the location from which to obtain each input pixel value. Each pixel (x',y') in the +output image is mapped to the coordinate location (x,y) in src by: + + + +It is not unusual that the input location (x,y) so derived will be nonintegral and will not correspond +exactly to a single pixel in the input image. + +To illustrate NearestNeighbor technique, assume that the pixel grid locations P, Q, R, and S are +integral. Pixel location X = (x,y)T, obtained from the mapping equation above, differs from P by +fractional amounts s in the x direction and t in the y direction. + + + +Let I(P) be the value of the input image at coordinate P, if P is within the image extent. Otherwise, let +I(P) be constant, where constant is the pixel value passed to the Geometry element. A value of +I(X) must be estimated from I(P), I(Q), I(R), and I(S). In nearest-neighbor sampling, we simply +choose the image value from the discrete location closest to X. Thus, + +if s < 1/2, t < 1/2, set I(X) = I(P), +if s > 1/2, t < 1/2, set I(X) = I(Q), +if s > 1/2, t > 1/2, set I(X) = I(R), +if s < 1/2, t > 1/2, set I(X) = I(S). + +The behavior on even boundaries (s = 1/2 or t = 1/2) is determined by the modify parameter. One of +the standard nearest neighbor modify values can be assigned to modify: + +xieValFavorDown +xieValFavorUp +xieValRoundNW +xieValRoundNE +xieValRoundSE +xieValRoundSW + + +If modify is xieValFavorDown, all less than signs in the above are replaced with less than +or equal signs. Thus, P would win all ties, S and Q would lose to P but win over R, and R would +lose all ties. If modify is xieValFavorUp, then all greater than signs would be replaced with +greater than or equals, and the opposite behavior would occur. Four additional options are provided. +The xieValRoundxx options will always choose a specific integral pixel grid location; these are +not strictly nearest neighbor algorithms but are available for computational/filtering convenience. +Structures +XieTecGeomNearestNeighbor sets the structure field modify to the value of the argument +modify. + +typedef struct { + unsigned int modify; +} XieGeomNearestNeighborParam; +/* Definitions of NearestNeighbor Modify */ +#define xieValFavorDown 1 +#define xieValFavorUp 2 +#define xieValRoundNW 3 +#define xieValRoundNE 4 +#define xieValRoundSE 5 +#define xieValRoundSW 6 +See Also +XieFloGeometry + XIElib - Technique Functions XieTecHistogramGaussian +Name +XieTecHistogramGaussian - allocate and fill an XieHistogramGaussianParam structure +Syntax +XieHistogramGaussianParam *XieTecHistogramGaussian (mean, sigma) +double mean; +double sigma; +Arguments +mean Specifies the center of the Gaussian probability density function. +sigma Specifies the "spread" of the Gaussian probability density function. +Returns +The XieHistogramGaussianParam structure. +Description +XieTecHistogramGaussian allocates and returns a pointer to an +XieHistogramGaussianParam structure. The returned structure represents the list of +parameters required by the match-histogram shape technique and may be used as the shape_param +argument of XieFloMatchHistogram (when the shape argument is +xieValHistogramGaussian). + +If insufficient memory is available, XieTecHistogramGaussian returns NULL. To free the +memory allocated to this structure, use XFree. + +The Gaussian match-histogram shape technique specifies that the output image is to have a histogram +that approximates a Gaussian probability density. The supplied parameters are used to generate a +Gaussian probability density function centered around the mean level with a spread specified by +sigma: + + + +Structures +XieTecHistogramGaussian sets the structure field mean to the value of the argument mean; +and the structure field sigma to the value of the argument sigma. + +typedef struct { + float mean; + float sigma; +} XieHistogramGaussianParam; +See Also +XieFloMatchHistogram + XIElib - Technique Functions XieTecHistogramHyperbolic +Name +XieTecHistogramHyperbolic - allocate and fill an XieHistogramHyperbolicParam structure +Syntax +XieHistogramHyperbolicParam *XieTecHistogramHyperbolic (constant, +shape_factor) +double constant; +Bool shape_factor; +Arguments +constant Specifies a value used to generate a hyperbolic probability density +function +shape_factor Specifies the relationship between the histogram shape and image +levels. +Returns +The XieHistogramHyperbolicParam structure. +Description +XieTecHistogramHyperbolic allocates and returns a pointer to an +XieHistogramHyperbolicParam structure. The returned structure represents the list of +parameters required by the match-histogram shape technique and may be used as the shape_param +argument of XieFloMatchHistogram (when the shape argument is +xieValHistogramHyperbolic). + +If insufficient memory is available, XieTecHistogramHyperbolic returns NULL. To free the +memory allocated to this structure, use XFree. + +The hyperbolic match-histogram shape technique specifies that the output image is to have a +histogram that approximates a hyperbolic probability density. + +constant is used to generate a hyperbolic probability density function: + + + +shape_factor should be specified as False if the histogram shape represents decreasing values +for higher levels or True if the shape represents increasing values for higher levels. +Structures +XieTecHistogramHyperbolic sets the structure field constant to the value of the argument +constant; and the structure field shape_factor to the value of the argument shape_factor. + +typedef struct { + float constant; + Bool shape_factor; +} XieHistogramHyperbolicParam; +See Also +XieFloMatchHistogram + XIElib - Technique Functions XieTecWhiteAdjustCIELabShift +Name +XieTecWhiteAdjustCIELabShift - allocate and fill an XieWhiteAdjustCIELabShiftParam +structure +Syntax +XieWhiteAdjustCIELabShiftParam *XieTecWhiteAdjustCIELabShift +(white_point) +XieConstant white_point; +Arguments +white_point Specifies the white point of the (source or output) data. +Returns +The XieWhiteAdjustCIELabShiftParam structure. +Description +XieTecWhiteAdjustCIELabShift allocates and returns a pointer to an +XieWhiteAdjustCIELabShiftParam structure. The returned structure represents the list of +parameters required by the WhiteAdjust technique and may be used as the white_adjust_param +argument of XieTecRGBToCIELab, XieTecRGBToCIEXYZ, XieTecCIELabToRGB, and +XieTecCIEXYZToRGB (when the white_adjust_tech argument is +xieValWhiteAdjustCIELabShift). + +If insufficient memory is available, XieTecWhiteAdjustCIELabShift returns NULL. To free +the memory allocated to this structure, use XFree. + +White point correction can be used to ensure that white "looks" white, or it can be used to change the +overall tint of an image. + +The CIELabShift WhiteAdjust technique specifies that white point correction is to be accomplished +by adding the white point displacement to the ab plane in the CIELab colorspace. The +white_point is specified using CIEXYZ encodings. If the WhiteAdjust technique is used with a +color conversion technique that converts from RGB, white_point specifies the desired white point +of the output data; if the conversion is to RGB, white_point specifies the white point of the source +data. +Structures +XieTecWhiteAdjustCIELabShift sets the structure field white_point to the value of the +argument white_point. + +typedef float XieConstant[3]; +typedef unsigned XieWhiteAdjustTechnique; +typedef struct { + XieConstant white_point; +} XieWhiteAdjustCIELabShiftParam; +See Also +XieTecRGBToCIELab, XieTecRGBToCIEXYZ, XieTecCIELabToRGB, XieTecCIEXYZToRGB + XIElib - Free Functions XieFreeTechniques +Name +XieFreeTechniques - free memory allocated for a list of techniques +Syntax +void XieFreeTechniques (techs, count) +XieTechnique *techs; +unsigned int count; +Arguments +techs Specifies the list of techniques to be freed. +count Specifies the number of items in the list of techniques to be freed. +Description +XieFreeTechniques frees the memory previously allocated for techs. Care should be taken +that the argument pair techs/count match an argument pair techniques_ret/ +ntechniques_ret returned from XieQueryTechniques. + +See XieQueryTechniques for a description of the XieTechnique structure. +Structures +typedef unsigned XieTechniqueGroup; +typedef struct { + Bool needs_param; + XieTechniqueGroup group; + unsigned int number; + unsigned int speed; + char *name; +} XieTechnique; +See Also + XieQueryTechniques + XIElib - Free Functions XieFreePhotofloGraph +Name +XieFreePhotofloGraph - free memory allocated for an array of XiePhotoElement structures +Syntax +void XieFreePhotofloGraph (elements, count) +XiePhotoElement *elements; +unsigned int count; +Arguments +elements Specifies the array of XiePhotoElement structures to be freed. +count Specifies the number of XiePhotoElement structures in the array. +Description +XieFreePhotofloGraph frees the specified array of XiePhotoElement structures. + +Care should be taken that the argument pair elements/count match a returned value (an array of +XiePhotoElement structures) and argument count from a call to +XieAllocatePhotofloGraph. + +Technique parameters are not freed by using XieFreePhotofloGraph. Most of the technique +parameters, with the exception of the JPEG baseline and JPEG lossless encode techniques, which are +allocated using XIElib convenience functions are freed using XFree. This is so the client can reuse +technique parameters between photoflos. +Structures +typedef struct { + int elemType; + /* union of ALL element types */ + union { + ... + ... + } data; +} XiePhotoElement; +See Also +XieAllocatePhotofloGraph, XieCreatePhotoflo, XieExecutePhotoflo, XieExecuteImmediate + XIElib - Free Functions XieFreeEncodeJPEGBaseline +Name +XieFreeEncodeJPEGBaseline - free the memory allocated to the structure +XieEncodeJPEGBaselineParam +Syntax +void XieFreeEncodeJPEGBaseline (param) +XieEncodeJPEGBaselineParam *param +Arguments +param Specifies a pointer to the structure that is to be freed. +Description +XieFreeEncodeJPEGBaseline (rather than XFree) should be used to free the memory +allocated by XieTecEncodeJPEGBaseline. +Structures +typedef struct { + XieInterleave interleave; + XieOrientation band_order; + unsigned char horizontal_samples[3]; + unsigned char vertical_samples[3]; + char *q_table; + unsigned int q_size; + char *ac_table; + unsigned int ac_size; + char *dc_table; + unsigned int dc_size; +} XieEncodeJPEGBaselineParam; +See Also +XieTecEncodeJPEGBaseline + XIElib - Free Functions XieFreeEncodeJPEGLossless +Name +XieFreeEncodeJPEGLossless - free the memory allocated to the structure +XieEncodeJPEGLosslessParam +Syntax +void XieFreeEncodeJPEGLossless (param) +XieEncodeJPEGLosslessParam *param; +Arguments +param Specifies a pointer to the structure that is to be freed. +Description +XieFreeEncodeJPEGLossless (rather than XFree) should be used to free the memory +allocated by XieTecEncodeJPEGLossless. + +Note that the JPEG Lossless technique is not available in the R6 sample implementation of XIE. +Structures +typedef struct { + XieInterleave interleave; + XieOrientation band_order; + unsigned char predictor[3]; + char *table; + unsigned int table_size; +} XieEncodeJPEGLosslessParam; +See Also +XieTecEncodeJPEGLossless + XIElib - Free Functions XieFreePasteUpTiles +Name +XieFreePasteUpTiles - free the memory allocated to the tiles field of a PasteUp structure +Syntax +void XieFreePasteUpTiles (element) +XiePhotoElement *element; +Arguments +element Specifies the XiePhotoElement structure to use. +Description +XieFreePasteUpTiles frees the memory allocated to the tiles field in the specified +PasteUp member structure; after the memory has been freed, the field value is set to NULL. +Structures +typedef struct { + int elemType; + union { + ... + struct { + unsigned int width; + unsigned int height; + XieConstant constant; + XieTile *tiles; + unsigned int tile_count; + } PasteUp; + ... + } data; +} XiePhotoElement; +See Also +XieFloPasteUp + + XIElib Events ColorAlloc +Description +The client is notified that a ConvertToIndex element has completed color allocation, but has produced +a result of lesser fidelity than was requested using the technique that was specified for the +ConvertToIndex element. + +The structure fields name_space, flo_id, src, and elem_type identify the photoflo and +specific ConvertToIndex element from which the ColorAlloc event originated. The structure field +time is the server time when the ColorAlloc event occurred, in milliseconds. The structure field +color_list is the color list resource that received the allocated colors. The structure field +color_alloc_technique is the ColorAlloc technique specified to the ConvertToIndex element. +The structure field color_alloc_data can be used for other information that is specific to the +ColorAlloc technique. +Structures +/* ColorAlloc Event Code */ +#define xieEvnNoColorAlloc 0 + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + unsigned long name_space; + Time time; + unsigned long flo_id; + XiePhototag src; + unsigned int elem_type; + XieColorList color_list; + XieColorAllocTechnique color_alloc_technique; + unsigned long color_alloc_data; +} XieColorAllocEvent; +See Also +XieFloConvertToIndex, XieTecColorAllocAll + XIElib Events DecodeNotify +Description +A DecodeNotify event notifies the client that anomalies were encountered while decoding a +compressed image (see the notify arguments of XieFloImportClientPhoto and +XieFloImportPhotomap). Either an error has been encountered while decoding an image, or the +image data received does not satisfy the expected dimensions. + +The structure fields name_space, flo_id, src, and elem_type identify the photoflo and +element from which the DecodeNotify event originated. The structure field time is the server +time when the DecodeNotify event occurred, in milliseconds. The structure field band_number +associates the event with a specific band of the image. The structure field decode_technique is +the Decode technique being used. The structure fields width and height are the dimensions +discovered while decoding the data. The structure field aborted is True if decoding was aborted, +or False if recovery was possible. + +Recovery from a decode error may result in some missing or garbled image data. This may also cause +the height of the decoded data to be less than was expected. If the structure fields width or height +do not match the width and height specified to XieFloImportClientPhoto, the image data is +clipped or padded (with zeros), as required, to enforce the XieFloImportClientPhoto +specified dimensions. +Structures +/* DecodeNotify Event Code */ +#define xieEvnNoDecodeNotify 1 + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + unsigned long name_space; + Time time; + unsigned long flo_id; + XiePhototag src; + unsigned int elem_type; + XieDecodeTechnique decode_technique; + Bool aborted; + unsigned int band_number; + unsigned long width; + unsigned long height; +} XieDecodeNotifyEvent; +See Also +XieFloImportClientPhoto, XieFloImportPhotomap + XIElib Events ExportAvailable +Description +The client is notified that an ExportClient element has data available (see the notify argument of +the applicable XieFloExportClient... function). If notify was specified as +xieValFirstData, this event will be sent only the first time data become available from the +ExportClient element. Otherwise (that is, xieValNewData was specified), this event will be +generated each time the amount of data available changes from zero to nonzero. + +The structure fields name_space, flo_id, src, and elem_type identify the photoflo and +specific ExportClient element from which the ExportAvailable event originated. The structure +field time is the server time when the ExportAvailable event occurred, in milliseconds. The +structure field band_number associates the event with a specific band of the image or LUT. The +structure field data is information specific to elem_type (for example, the number of LUT +entries or ROI rectangles available). + +Where there is a single ExportClient element, the client can just read bytes or be event-driven. For +photoflos containing multiple ExportClient elements, the client should be event-driven. +Structures +/* ExportAvailable Event Code */ +#define xieEvnNoExportAvailable 2 + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + unsigned long name_space; + Time time; + unsigned long flo_id; + XiePhototag src; + unsigned int elem_type; + unsigned int band_number; + unsigned long data[3]; +} XieExportAvailableEvent; +See Also +XieFloExportClientHistogram, XieFloExportClientLUT, XieFloExportClientPhoto, +XieFloExportClientROI + XIElib Events ImportObscured +Description +The client is notified when an ImportDrawable or ImportDrawablePlane element encounters obscured +regions in a Window that cannot be retrieved from backing store (see the notify argument of the +import element routine). A separate ImportObscured event is returned for each affected region. + +The structure fields name_space, flo_id, and src identify the photoflo and the specific import +element from which the ImportObscured event originated. The structure field time is the server +time when the ImportObscured event occurred, in milliseconds. The structure field window +identifies the Window. The obscured region of the window is specified by the structure fields x, y, +width, and height. + +Note: image data within obscured regions will be populated with the fill argument supplied to the +import element. +Structures +/* ImportObscured Event Code */ +#define xieEvnNoImportObscured 3 + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + unsigned long name_space; + Time time; + unsigned long flo_id; + XiePhototag src; + unsigned int elem_type; + Window window; + int x; + int y; + unsigned int width; + unsigned int height; +} XieImportObscuredEvent; +See Also +XieFloImportDrawable, XieFloImportDrawablePlane + XIElib Events PhotofloDone +Description +A PhotofloDone event notifies the client that a photoflo has left the active state. It is enabled by +the notify argument of XieExecutePhotoflo or XieExecuteImmediate. + +The photoflo from which the PhotofloDone event originated is identified by the structure fields +name_space and flo_id. The structure field time is the server time when the PhotofloDone +event occurred, in milliseconds. The reason the photoflo left the active state is indicated by the +structure field type. + +If the Photoflo terminated because of an error condition, the details concerning the error have +preceded this event in an error message. +Structures +/* PhotofloDone Event Code */ +#define xieEvnNoPhotofloDone 4 + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + unsigned long name_space; + Time time; + unsigned long flo_id; +} XiePhotofloDoneEvent; +See Also +XieExecuteImmediate, XieExecutePhotoflo + + XIElib Errors Resource Errors +The following error codes are allocated from the extension error space to provide for the errors +returned by XIE: + +Error Cause +xieErrNoColorlist The value for a color_list argument does not name a defined +color list. +xieErrNoLUT The value for a lut argument does not name a defined LUT. +xieErrNoPhotoflo The value for a photoflo argument does not name a defined +photoflo. +xieErrNoPhotomap The value for a photomap argument does not name a defined +photomap. +xieErrNoPhotospace The value for a photospace argument does not name a defined +photospace. +xieErrNoROI The value for a roi argument does not name a defined ROI. +xieErrNoFlo An error has been detected while defining, executing, or accessing a +photoflo (see Photoflo Errors). + +XIE also uses the core protocol BadAccess, BadAlloc, BadIDChoice, BadLength, BadRequest, and +BadValue errors. + XIElib Errors Photoflo Errors +If an error is detected while defining, executing, or accessing a photoflo, an xieErrNoFlo... +error is returned. This single error code is allocated from the extension error space for all photoflo +related errors. The following subcodes are defined to provide the details of the error: + +Error Cause +xieErrNoFloAccess Attempt to execute, modify, or redefine an active photoflo or +attempt to Get/Put client data from/to an inactive photoflo. +xieErrNoFloAlloc Insufficient resources (for example, memory). +xieErrNoFloColormap An unknown Colormap has been specified. +xieErrNoFloColorList An unknown color list has been specified. +xieErrNoFloDomain Invalid domain phototag: + - source data is not a list-of-rectangles or control-plane or + - specified nonzero on a DIS server. +xieErrNoFloDrawable An unknown Drawable has been specified. +xieErrNoFloElement An unknown element type has been specified, or +invalid element type for request, or +attempt to change or add an element type. +xieErrNoFloGC An unknown GContext has been specified. +xieErrNoFloID Invalid executable: + - an unknown photoflo has been specified or + - an unknown photospace has been specified. +xieErrNoFloLength An element was received with the incorrect number of bytes. +xieErrNoFloLUT An unknown LUT has been specified. +xieErrNoFloMatch Some argument or pair of arguments has the correct type and range, +but it fails to match in some other way required by the element. +xieErrNoFloOperator An unknown operator has been specified. +xieErrNoFloPhotomap An unknown photomap has been specified. +xieErrNoFloROI An unknown ROI has been specified. +xieErrNoFloSource An invalid phototag has been specified: + - zero, but a phototag is required, or + - downstream from the particular element, or + - beyond the bounds of the photoflo. +xieErrNoFloTechnique An unknown technique has been specified , or +invalid technique specific-parameters have been specified, or +the wrong number of technique-specific parameters have been given. +xieErrNoFloValue Some numeric value falls outside of the range of values accepted by +the element. +xieErrNoFloImplementation Some aspect of a request is not implemented by the server: +the client should be prepared to receive and handle this error. + + +Structures +/* Definition of Error Codes */ +#define xieErrNoColorList 0 +#define xieErrNoLUT 1 +#define xieErrNoPhotoflo 2 +#define xieErrNoPhotomap 3 +#define xieErrNoPhotospace 4 +#define xieErrNoROI 5 +#define xieErrNoFlo 6 + +/* Definitions of Flo Error (Sub-) Codes */ +#define xieErrNoFloAccess 1 +#define xieErrNoFloAlloc 2 +#define xieErrNoFloColormap 3 +#define xieErrNoFloColorList 4 +#define xieErrNoFloDomain 5 +#define xieErrNoFloDrawable 6 +#define xieErrNoFloElement 7 +#define xieErrNoFloGC 8 +#define xieErrNoFloID 9 +#define xieErrNoFloLength 10 +#define xieErrNoFloLUT 11 +#define xieErrNoFloMatch 12 +#define xieErrNoFloOperator 13 +#define xieErrNoFloPhotomap 14 +#define xieErrNoFloROI 15 +#define xieErrNoFloSource 16 +#define xieErrNoFloTechnique 17 +#define xieErrNoFloValue 18 +#define xieErrNoFloImplementation 19 + +XIElib 40 + +XIElib Events-5 + +XIElib Errors-3 + + diff --git a/xie/docs/x11r4/README.md b/xie/docs/x11r4/README.md new file mode 100644 index 0000000..1c07167 --- /dev/null +++ b/xie/docs/x11r4/README.md @@ -0,0 +1,56 @@ +# X Consortium XIE specification (DECUS LT92A, X11R4 contrib) + +Fetched from +`https://www.digiater.nl/openvms/decus/lt92a/x11r4/contrib/doc/xie/` +on 2026-11-01: + +| file | contents | +|---|---| +| `concepts.ps` / `.txt` | XIE Concepts | +| `protocol.ps` / `.txt` | XIE Protocol Specification, v2.0 (with v2.1 field-test notes) | +| `server.ps` / `.txt` | XIE Server interpretation | + +(`.ps` are the originals; `.txt` produced with `ps2pdf` + `pdftotext -layout`.) + +## These are NOT the VT1200's XIE + +Measured discriminator: **the VT1200 firmware is the DEC *photoflo* lineage**, while +these documents are the **X Consortium** lineage. Counts in the extracted text: + +``` +file pipeline photoflo IOB +protocol 80 0 350 +concepts 27 0 22 +server 3 0 210 +``` + +`photoflo` appears **zero** times in all three. The two lineages differ in vocabulary +and, more importantly, in resource model: + +| this spec (X Consortium v2.0) | VT1200 (DEC XIE 2.3) | +|---|---| +| `XIEP_EXECUTE_PIPE` | `XIEP_EXECUTE_PHOTOFLO` | +| `BINDING` | `XIEP_BIND_PHOTOFLO` | +| resources: IOB / IDC / IPC | photoflo + image resources | +| `XIEP_CREATE_RESOURCE`, `XIEP_IMPORT_IMAGE`, `XIEP_EXPORT_IMAGE` | `XIEP_CREATE_BY_VALUE`, `XIEP_EXPORT` | + +The firmware's own strings settle it — `reference/rom-strings.txt` and the XIE module +contain **"error allocating photoflo"**, `CROP/MIRROR/ROTATE/SCALE/EXPORT Process +block`, and `error: unsupported pipe element`. Those are photoflo/process-block terms, +matching `docs/EK-V120I-IN-001_installing-DECimage-1200.txt` Appendix C, not this spec. + +## What these documents are still good for + +- the general XIE shape (transport services, pipelines, export producing a PIXMAP, + error classes) — useful for orientation and for confirming inferences; +- Appendix 9.4.1 "Conceptual Changes" explains the split (server-side rendition + + named contexts moved to protocol parameters), which is why the vocabularies diverge; +- **not** useful for: minor-opcode numbers or wire field layouts. This spec states + outright that it carries no language bindings (line 272) and it contains **no + request/opcode numbering** — that lives in the server headers. + +## Still missing + +The VT1200's wire format needs the **DEC XIE 2.3** headers/library +(`XIEproto.h`, `xie.h`, `libXIE` 2.3 — the DECimage Application Services media), not +the X Consortium specification. diff --git a/xie/docs/x11r4/concepts.pdf b/xie/docs/x11r4/concepts.pdf new file mode 100644 index 0000000..2d5565b Binary files /dev/null and b/xie/docs/x11r4/concepts.pdf differ diff --git a/xie/docs/x11r4/concepts.ps b/xie/docs/x11r4/concepts.ps new file mode 100644 index 0000000..f19d151 --- /dev/null +++ b/xie/docs/x11r4/concepts.ps @@ -0,0 +1,6925 @@ +%!PS-Adobe-1.0 +%%DocumentFonts: (at end) +%%Creator: DVC$PS, Digital Equipment Corp. +%%Pages: (at end) +%%EndComments +%% DVC$PROLOG.PS - prolog for PostScript files generated by DVC$PS. +%% Copyright (c) 1986,1987 DIGITAL EQUIPMENT CORPORATION. All Rights Reserved. +/$DviLaser where {pop} {/$DviLaser 200 dict def} ifelse +/BeginDviLaserDoc % Begin document + {vmstatus pop pop 0 eq + {$DviLaser begin InitializeState} + {/DviLaserJob save def $DviLaser begin InitializeState + /DviLaserFonts save def + } ifelse + } def +/EndDviLaserDoc % End document + {vmstatus pop pop 0 eq + {end} {DviLaserFonts restore end DviLaserJob restore} ifelse + } def +%% +$DviLaser begin +%% +%% Create ISOLatin1 vector +(LPS$ISOLatin1Encoding.PS X1.0) pop +/Copyright_1986,_Digital_Equipment_Corporation_All_Rights_Reserved pop +mark /ISOLatin1Encoding 8#000 1 8#054 {StandardEncoding exch get} for /minus + 8#056 1 8#217 {StandardEncoding exch get} for /dotlessi 8#301 1 8#317 + {StandardEncoding exch get} for /space /exclamdown /cent /sterling /currency + /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft + /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior + /threesuperior /acute /mu /paragraph /periodcentered /cedilla /onesuperior + /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown + /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave + /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth + /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash + /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave + /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute + /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde + /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute + /ucircumflex /udieresis /yacute /thorn /ydieresis /ISOLatin1Encoding where not + {256 array astore def} if cleartomark +%% +%% create DECMCS vector +(LPS$DECMCSEncoding.PS X1.0) pop +/Copyright_1986,_Digital_Equipment_Corporation_All_Rights_Reserved pop +/DECMCSEncoding ISOLatin1Encoding 256 array copy def +mark + 8#240 8#244 8#246 8#254 8#255 8#256 8#257 + 8#264 8#270 8#276 8#320 8#336 8#360 8#376 8#377 + counttomark + {DECMCSEncoding exch /.notdef put} repeat + % stack now contains mark + 8#250 /currency 8#327 /OE 8#335 /Ydieresis 8#367 /oe 8#375 /ydieresis + counttomark -1 bitshift % divide by 2 + {DECMCSEncoding 3 1 roll put} repeat + % stack now contains mark + cleartomark +%% +%% create DOCUMENT-specific encoding vector based on DECMCS +(DOC$$PSEncoding.PS X1.0) pop +/Copyright_1987,_Digital_Equipment_Corporation_All_Rights_Reserved pop +/DOC$$PSEncoding DECMCSEncoding 256 array copy def +mark + % stack now contains mark + 8#201 /bullet 8#202 /emdash 8#203 /endash 8#204 /dagger + 8#205 /daggerdbl 8#206 /registered 8#207 /trademark %8#210 /Delta + 8#211 /fi 8#212 /fl + counttomark -1 bitshift % divide by 2 + {DOC$$PSEncoding 3 1 roll put} repeat + % stack now contains mark + cleartomark +%% +%% create FINDFONT routine that recognizes all these vectors +(DOC$$FINDFONT.PS X1.0) pop +/Copyright_1987,_Digital_Equipment_Corporation_All_Rights_Reserved pop +/setpacking where {pop} {/setpacking {pop} def /curentpacking {false} def + /packedarray {astore} def} ifelse currentpacking true setpacking /findfont + {LPS$findfontdict begin dup FontDirectory exch known {FontDirectory exch get} + {mark 1 index (123456789012345678901234567890123456789) cvs /LPS$encodings + where {/LPS$encodings get {3 1 roll (1234567890) cvs search {exit} {exch + pop} ifelse} forall} if counttomark 1 ne {exch pop exch length 0 eq {3 -1 + roll pop true} {pop pop pop false} ifelse} {pop pop false} ifelse {dup + findfont dup length dict 3 -1 roll dup /Courier eq /extendcourierfont where + {pop true} {false} ifelse and {pop 0 extendcourierfont} {dup /Courier-Oblique + eq /extendcourierfont where {pop true} {false} ifelse and {pop 1 + extendcourierfont} {dup /Courier-Bold eq /extendcourierfont where {pop true} + {false} ifelse and {pop 2 extendcourierfont} {dup /Courier-BoldOblique eq + /extendcourierfont where {pop true} {false} ifelse and {pop 3 + extendcourierfont} {pop exch {1 index /FID ne 2 index /UniqueID ne and {2 + index 3 1 roll put} {pop pop} ifelse} forall} ifelse} ifelse} ifelse} + ifelse /LPS$fallbacks where {pop dup /Encoding 4 -1 roll exec 256 array copy + put dup /CharStrings known {0 1 255 {{1 index /Encoding get 1 index get 2 + index /CharStrings get exch known not {1 index /Encoding get 1 index get 2 + index /Encoding get 2 index LPS$fallbacks /others get put LPS$fallbacks {exch + 2 index eq {3 index /Encoding get 3 index 3 -1 roll put exit} {pop} ifelse + } forall pop} {exit} ifelse} loop pop} for} if} {dup /Encoding 4 -1 roll + exec put} ifelse definefont} {systemdict /findfont get exec} + ifelse} ifelse end} bind def /LPS$findfontdict 32 dict def LPS$findfontdict + begin /findfont dup load def /$obliquefont 1 dict def /obliquefont + {$obliquefont begin neg dup sin exch cos div mat exch 2 exch put mat makefont + end} def $obliquefont begin /mat matrix def end /cvc {(x) dup 0 4 -1 roll put} + def /fontcopy {exch {1 index /FID ne 2 index /UniqueId ne and {2 index 3 1 + roll put} {pop pop} ifelse} forall} def /$scalefont2 1 dict def /scalefont2 + {$scalefont2 begin mat exch 3 exch put mat exch 0 exch put mat makefont end} + def $scalefont2 begin /mat matrix def end /fonts [[{/Symbol findfont} + {/Times-Roman findfont} {/Times-Roman-ISOLatin1 findfont}] [{/Symbol findfont + -12 obliquefont} {/Times-Roman findfont -12 obliquefont} {/Times-Roman-ISOLatin1 + findfont -12 obliquefont}] [{/Symbol findfont} {/Times-Bold findfont} + {/Times-Bold-ISOLatin1 findfont}] [{/Symbol findfont -12 obliquefont} + {/Times-Bold findfont -12 obliquefont} {/Times-Bold-ISOLatin1 findfont -12 + obliquefont}]] def /characters [[/mu 0 8#155] [/degree 0 8#260] [/plusminus 0 + 8#261] [/multiply 0 8#264] [/divide 0 8#270] [/trademark 0 8#324] [/fi 1 8#256] + [/fl 1 8#257] [/perthousand 1 8#275] [/AE 1 8#341] [/OE 1 8#352] [/ae 1 8#361] + [/oe 1 8#372] [/minus 2 8#055] [/brokenbar 2 8#246] [/copyright 2 8#251] + [/logicalnot 2 8#254] [/registered 2 8#256] [/twosuperior 2 8#262] + [/threesuperior 2 8#263] [/onesuperior 2 8#271] [/onequarter 2 8#274] [/onehalf + 2 8#275] [/threequarters 2 8#276] [/Eth 2 8#320] [/Yacute 2 8#335] [/Thorn 2 + 8#336] [/eth 2 8#360] [/yacute 2 8#375] [/thorn 2 8#376]] def + /extendcourierfont {/STYLE exch def /newfont exch def /oldfont exch def oldfont + newfont fontcopy pop /newcharstrings oldfont /CharStrings get dup length + characters length add 1 add dict exch {2 index 3 1 roll put} forall def newfont + /CharStrings newcharstrings put characters {dup 0 get /name exch def dup 1 get + /fnum exch def dup 2 get /code exch def pop newcharstrings name known not + {newcharstrings name [fonts STYLE get fnum get code /buildchar load /exec cvx] + cvx put} if} forall newfont} def /buildchar {currentdict LPS$findfontdict begin + /FONTDICT exch def /CODE exch def /FONT exch exec def /PSCODE exch def /WX 600 + def /WY 0 def /LBXadj FONT 925 scalefont setfont CODE cvc stringwidth pop dup + 600 gt {currentfont exch 600 exch div 1 scalefont2 setfont 0} {600 exch sub 2 + div} ifelse def /LBYadj 0 def FONTDICT /Metrics known {/CNAME Encoding PSCODE + get def Metrics CNAME known {Metrics CNAME get dup type /arraytype eq {dup 0 + get /WX exch def /LBXorig newpath 0 0 moveto CODE cvc true charpath pathbbox + newpath pop pop pop def dup length 2 gt {dup 1 get /WY exch def dup 2 get + /LBXnew exch def 3 get /LBYadj exch def} {1 get /LBXnew exch def} ifelse + /LBXadj LBXnew LBXorig sub def} {/WX exch def} ifelse} if} if WX WY newpath + LBXadj LBYadj moveto CODE cvc true charpath pathbbox newpath setcachedevice + LBXadj LBYadj moveto CODE cvc PaintType 2 ne {show} {true charpath gsave + FONTDICT /StrokeWidth get setlinewidth 1 setlinecap 1 setlinejoin stroke + grestore} ifelse end} def /LPS$encodings 6 dict def LPS$encodings begin + /-ISOLatin1 {ISOLatin1Encoding} def /-DECMCS {DECMCSEncoding} def /-DECTech + {DECTechEncoding} def /-DECPub {DECPubEncoding} def /-DOCPSE {DOC$$PSEncoding} + def end end setpacking +%% +%%disable showpage for included files +/DVC$$showpage /showpage load def +/showpage {} def +%% +/tempstr 64 string def +/tempint 0 def +/tempmatrix matrix def +%% debugging routines +/DebugMode false def +/PrintInt { tempstr cvs print } def +/PrintLn { (\n) print flush } def +/PrintXY { Xpos PrintInt (,)print Ypos Yadjust PrintInt } def +/PrintVMStats + {(VM status, ) print print (: ) print vmstatus 3 copy + PrintInt (\(total\), ) print PrintInt (\(used\), ) print + pop exch sub PrintInt (\(remaining\), ) print + PrintInt (\(level\)) print PrintLn + } def +/VMS /PrintVMStats load def +/VMSDebug {DebugMode {PrintVMStats} {pop} ifelse} def +%% +(beginning of prolog) VMSDebug +%% Begin page +/BP + {/Magnification exch def /DviLaserPage save def + (beginning of page) VMSDebug + } def +%% End page +/EP {DviLaserPage restore} def +%% Exit page (temporarily) to add fonts/characters. +/XP + {% Save current point information so it can be reset later. + /Xpos where {pop Xpos} {0} ifelse + /Ypos where {pop Ypos} {0} ifelse + /currentpoint cvx stopped {0 0 moveto currentpoint} if + /DviLaserPage where {pop DviLaserPage restore} if + moveto + /Ypos exch def /Xpos exch def + } def +%% Resume page +/RP {/DviLaserPage save def} def +%% Purge all fonts to reclaim memory space. +/PF {GlobalMode LocalMode} def +%% Switch to base save/restore level, saving state information. +/GlobalMode + {/UserSave where {pop UserSave} if % invoke "UserSave" if available + PortraitMode PaperWidth PaperHeight PxlResolution Resolution + Magnification Ymax Xorigin Yorigin RasterScaleFactor + % Save current point information so it can be reset later. + /currentpoint cvx stopped {0 0 moveto currentpoint} if + /DviLaserPage where {pop DviLaserPage restore} if + DviLaserFonts restore RecoverState + } def +%% Preserve state at the base level. +/RecoverState + {12 copy + /Ypos exch def /Xpos exch def /RasterScaleFactor exch def + /Yorigin exch def /Xorigin exch def /Ymax exch def + /Magnification exch def /Resolution exch def /PxlResolution exch def + /PaperHeight exch def /PaperWidth exch def /PortraitMode exch def + DoInitialScaling + PortraitMode not {PaperWidth 0 SetupLandscape} if + Xpos Ypos moveto + } def +%% Initialize state variables to default values. +/InitializeState + {/Resolution 3600 def /PxlResolution 300 def + /RasterScaleFactor PxlResolution Resolution div def + /PortraitMode true def /PaperHeight 11 Resolution mul def + /PaperWidth 8.5 Resolution mul def /Ymax PaperHeight def + /Magnification 1000 def /Xorigin 0 def /Yorigin 0 def + /Xpos 0 def /Ypos 0 def /InitialMatrix matrix currentmatrix def + } def +%% Switch from base save/restore level, restoring state information. +/LocalMode + {/Ypos exch def /Xpos exch def /RasterScaleFactor exch def + /Yorigin exch def /Xorigin exch def /Ymax exch def + /Magnification exch def /Resolution exch def /PxlResolution exch def + /PaperHeight exch def /PaperWidth exch def /PortraitMode exch def + DoInitialScaling + PortraitMode not {PaperWidth 0 SetupLandscape} if + Xpos Ypos moveto + /UserRestore where {pop UserRestore} if % invoke "UserRestore" if available + /DviLaserFonts save def /DviLaserPage save def + } def +%% Abbreviations +/S /show load def +/SV /save load def +/RST /restore load def +/Yadjust {Ymax exch sub} def +%% (x,y) position absolute, just set Xpos & Ypos, don't move. +/SXY {Yadjust /Ypos exch def /Xpos exch def} def +%% (x,y) position absolute +/XY {Yadjust 2 copy /Ypos exch def /Xpos exch def moveto} def +%% (x,0) position absolute +/X {currentpoint exch pop 2 copy /Ypos exch def /Xpos exch def moveto} def +%% (0,y) position absolute +/Y + {currentpoint pop exch Yadjust 2 copy + /Ypos exch def /Xpos exch def moveto + } def +%% (x,y) position relative +/xy {neg rmoveto currentpoint /Ypos exch def /Xpos exch def} def +%% (x,0) position relative +/x {0 rmoveto currentpoint /Ypos exch def /Xpos exch def} def +%% (0,y) position relative +/y {0 exch neg rmoveto currentpoint /Ypos exch def /Xpos exch def} def +%% Print a rule +/R + {/ht exch def /wd exch def gsave 0 setgray + currentpoint newpath moveto + 0 ht rlineto wd 0 rlineto + 0 ht neg rlineto wd neg 0 rlineto + closepath fill grestore wd 0 rmoveto + currentpoint /Ypos exch def /Xpos exch def + } def +%% RES +/RES + {/Resolution exch def /PxlResolution exch def + /RasterScaleFactor PxlResolution Resolution div def + DoInitialScaling + } def +%% Do initial scaling. +/DoInitialScaling {InitialMatrix setmatrix 72 Resolution div dup scale} def +%% PM +/PM + {XP /PaperWidth exch def /PaperHeight exch def + /Ymax PaperHeight def /PortraitMode true def + DoInitialScaling RP + } def +%% LM +/LM + {XP /PaperWidth exch def /PaperHeight exch def + /Ymax PaperWidth def /PortraitMode false def + DoInitialScaling + PaperWidth 0 SetupLandscape RP + } def +%% Change magnification setting +/MAG {XP /Magnification exch def RP} def +%% Switch to landscape mode +/SetupLandscape {translate 90 rotate} def +%% SPB - begin "\special" mode +%% Mode: 0 - Local 1 - Global 2 - Inline +/SPB + {/spc_mode exch def + Yadjust /Yorigin exch def /Xorigin exch def + spc_mode 0 eq spc_mode 2 eq or + {XP} {spc_mode 1 eq {GlobalMode} if} ifelse + Xorigin Yorigin translate + Resolution 72 div dup scale % Restore default scaling... + Magnification 1000 div dup scale % Adjust for any magnification... + /Xpos Xpos 72 Resolution div mul 1000 Magnification div mul def + /Ypos Ypos 72 Resolution div mul 1000 Magnification div mul def + } def +%% SPE - end "\special" mode +%% Mode: 0 - Local 1 - Global 2 - Inline +/SPE + {/spc_mode exch def + 1000 Magnification div dup scale % Un-adjust for any magnification... + 72 Resolution div dup scale % Restore default internal scaling... + spc_mode 0 eq spc_mode 2 eq or + {RP} {spc_mode 1 eq {LocalMode} if} ifelse + } def +%% PP +/PP {/#copies exch def DVC$$showpage /#copies 1 def} def +%% CLRP +/CLRP {erasepage} def +%% /font-name DMF +/DMF {/psz exch def /nam exch def nam findfont psz scalefont setfont} def +%% /abcd (xxx) concat ==> /abcdxxx +/concatstr 64 string def +/concat + {/xxx exch def /nam exch def + /namstr nam concatstr cvs def + /newnam namstr length xxx length add string def + newnam 0 namstr putinterval + newnam namstr length xxx putinterval + newnam cvn + } def +%% /abcdef 2 strip ==> /cdef +/strip + {/num exch def /nam exch def + /namstr nam tempstr cvs def + /newlen namstr length num sub def + namstr num newlen getinterval cvn + } def +%% copydict ==> new-dict on stack +/copydict + {dup length 1 add dict /newdict exch def + {1 index /FID ne + {newdict 3 1 roll put} {pop pop} ifelse + } forall newdict + } def +%% DefineCMEncoding +/DefineCMEncoding + {/EncodeType exch def /CMEncoding 256 array def + /Times-Roman findfont /Encoding get aload pop CMEncoding astore pop + EncodeType 11 eq {Do-CM-rm-encoding} if + EncodeType 12 eq {Do-CM-ti-encoding} if + EncodeType 13 eq {Do-CM-tt-encoding} if + } def +%% Do special mappings for the various CM-font types. +/Do-standard-CM-encodings + {CMEncoding + dup 0 /.notdef put dup 1 /.notdef put dup 2 /.notdef put + dup 3 /.notdef put dup 4 /.notdef put dup 5 /.notdef put + dup 6 /.notdef put dup 7 /.notdef put dup 8 /.notdef put + dup 9 /.notdef put dup 10 /.notdef put dup 11 /.notdef put + dup 12 /fi put dup 13 /fl put dup 14 /.notdef put + dup 15 /.notdef put dup 16 /dotlessi put dup 17 /.notdef put + dup 18 /grave put dup 19 /acute put dup 20 /caron put + dup 21 /breve put dup 22 /macron put dup 23 /ring put + dup 24 /cedilla put dup 25 /germandbls put dup 26 /ae put + dup 27 /oe put dup 28 /oslash put dup 29 /AE put + dup 30 /OE put dup 31 /Oslash put dup 32 /.notdef put + dup 127 /dieresis put pop + } def +/Do-CM-rm-encoding + {Do-standard-CM-encodings CMEncoding + dup 34 /quotedblright put dup 60 /exclamdown put dup 62 /questiondown put + dup 92 /quotedblleft put dup 94 /circumflex put dup 95 /dotaccent put + dup 123 /endash put dup 124 /emdash put dup 125 /hungarumlaut put + dup 126 /tilde put pop + } def +/Do-CM-ti-encoding + {Do-standard-CM-encodings CMEncoding + dup 34 /quotedblright put dup 36 /sterling put dup 60 /exclamdown put + dup 62 /questiondown put dup 92 /quotedblleft put dup 94 /circumflex put + dup 95 /dotaccent put dup 123 /endash put dup 124 /emdash put + dup 125 /hungarumlaut put dup 126 /tilde put pop + } def +/Do-CM-tt-encoding + {Do-standard-CM-encodings CMEncoding + dup 12 /.notdef put dup 13 /quotesingle put dup 14 /exclamdown put + dup 15 /questiondown put pop + } def +%% Routines to handle packing/unpacking numbers. +%% PackHW --> +/PackHW + {/num exch def /pos exch def /target exch def + num 16#0000FFFF and 1 pos sub 16 mul bitshift target or + } def +%% PackByte --> +/PackByte + {/num exch def /pos exch def /target exch def + num 16#000000FF and 3 pos sub 8 mul bitshift target or + } def +%% UnpkHW --> +/UnpkHW + {/num exch def /pos exch def + num 1 pos sub -16 mul bitshift 16#0000FFFF and + dup 16#00007FFF gt {16#00010000 sub} if + } def +%% UnpkByte --> +/UnpkByte + {/num exch def /pos exch def + num 3 pos sub -8 mul bitshift 16#000000FF and + dup 16#0000007F gt {16#00000100 sub} if + } def +%% DefineCMFont +%% type 10: "as-is" PostScript font +%% type 11: CM-mapped PostScript font - roman +%% type 12: CM-mapped PostScript font - text italic +%% type 13: CM-mapped PostScript font - typewriter type +/int-dict-name {int (-dict) concat} def +/int-dict {int (-dict) concat cvx load} def +/DF {true DefineCMFont} def % signal that the font is already loaded +/DNF {false DefineCMFont} def % signal that the font is not already loaded +/DefineCMFont + {/loaded exch def /typ exch def /psz exch def /ext exch def /int exch def + typ 10 ne + {% font_type = 11, 12, 13 + loaded not {/fnam ext 3 strip def fnam findfont copydict + /newdict exch def typ DefineCMEncoding newdict + /Encoding CMEncoding put ext newdict definefont pop} if + int-dict-name ext findfont psz scalefont def + currentdict int [int-dict /setfont cvx] cvx put + } + {% font_type = 10 + /fnam ext def int-dict-name fnam findfont psz scalefont def + currentdict int [int-dict /setfont cvx] cvx put + } + ifelse + } def +%% +%% [llx lly urx ury] DefinePXLFont +/PXLF { true DefinePXLFont} def % signal that the font is already loaded +/PXLNF {false DefinePXLFont} def % signal that the font is not already loaded +/PXLBuildCharDict 17 dict def +/CMEncodingArray 128 array def +0 1 127 {CMEncodingArray exch dup tempstr cvs cvn put} for +/RasterConvert {RasterScaleFactor div} def +/TransformBBox + {aload pop + /BB-ury exch def /BB-urx exch def /BB-lly exch def /BB-llx exch def + [BB-llx RasterConvert BB-lly RasterConvert + BB-urx RasterConvert BB-ury RasterConvert] + } def +/DefinePXLFont + {/newfont exch def /bb exch def /num exch def /psz exch def + /dsz exch def /pxlmag exch def /ext exch def /int exch def + /fnam ext (-) concat pxlmag tempstr cvs concat def + newfont not + { int-dict-name 13 dict def + int-dict begin + /FontType 3 def /FontMatrix [1 dsz div 0 0 1 dsz div 0 0] def + /FontBBox bb TransformBBox def /Encoding CMEncodingArray def + /CharDict 1 dict def CharDict begin /Char-Info num array def end + /BuildChar + { PXLBuildCharDict begin + /char exch def /fontdict exch def + fontdict /CharDict get /Char-Info get char get aload pop + /rasters exch def /PackedWord1 exch def + 0 PackedWord1 UnpkHW 16#7FFF ne + { /PackedWord2 exch def /wx 0 PackedWord1 UnpkHW def + /rows 2 PackedWord1 UnpkByte def /cols 3 PackedWord1 UnpkByte def + /llx 0 PackedWord2 UnpkByte def /lly 1 PackedWord2 UnpkByte def + /urx 2 PackedWord2 UnpkByte def /ury 3 PackedWord2 UnpkByte def + } + { /PackedWord2 exch def /PackedWord3 exch def /PackedWord4 exch def + /wx 1 PackedWord1 UnpkHW def /rows 0 PackedWord2 UnpkHW def + /cols 1 PackedWord2 UnpkHW def /llx 0 PackedWord3 UnpkHW def + /lly 1 PackedWord3 UnpkHW def /urx 0 PackedWord4 UnpkHW def + /ury 1 PackedWord4 UnpkHW def + } ifelse + rows 0 lt {/rows rows neg def /runlength 1 def} {/runlength 0 def} ifelse + wx 0 + llx RasterConvert lly RasterConvert + urx RasterConvert ury RasterConvert setcachedevice + rows 0 ne + { gsave cols rows true RasterScaleFactor + 0 0 RasterScaleFactor neg llx .5 add neg ury .5 add + tempmatrix astore GenerateRasters imagemask grestore + } if + end + } def + end fnam int-dict definefont pop + } if + int-dict-name fnam findfont psz scalefont def + currentdict int [int-dict /setfont cvx] cvx put + } def +%% PXLC +/PXLC + {/rasters exch def /runlength exch def /cols exch def /rows exch def + /ury exch def /urx exch def /lly exch def /llx exch def + /wx exch def /code exch def /int exch def + % See if the long or short format is required + true cols CKSZ rows CKSZ ury CKSZ urx CKSZ lly CKSZ llx CKSZ + TackRunLengthToRows + { int-dict /CharDict get /Char-Info get code + [0 0 llx PackByte 1 lly PackByte 2 urx PackByte 3 ury PackByte + 0 0 wx PackHW 2 rows PackByte 3 cols PackByte rasters] put + } + { int-dict /CharDict get /Char-Info get code + [0 0 urx PackHW 1 ury PackHW 0 0 llx PackHW 1 lly PackHW + 0 0 rows PackHW 1 cols PackHW 0 0 16#7FFF PackHW 1 wx PackHW rasters] put + } ifelse + } def +/CKSZ {abs 127 le and} def +/TackRunLengthToRows {runlength 0 ne {/rows rows neg def} if} def +%% PLOTC +/PLOTC + {/rasters exch def /runlength exch def /cols exch def /rows exch def + /ury exch def /urx exch def /lly exch def /llx exch def + /psz exch def /dsz exch def /wx exch def + % "Plot" a character's raster pattern. + rows 0 ne + { gsave currentpoint translate psz dsz div dup scale + cols rows true RasterScaleFactor 0 0 RasterScaleFactor + neg llx .5 add neg ury .5 add tempmatrix astore + GenerateRasters imagemask grestore + } if wx x + } def +%% Routine to generate rasters for "imagemask" +/GenerateRasters {rasters runlength 1 eq {RunLengthToRasters} if} def +%% Routine to convert from runlength encoding back to rasters. +/RunLengthToRasters + { % ...not done yet... + } def +%% +(end of common prolog) VMSDebug +%% +end +%% End of included prolog section. +%% +BeginDviLaserDoc +CLRP 300 3600 RES +%%EndProlog +%%Page -1 1 +1000 BP 39600 30600 PM 0 0 XY +XP /F24 /Helvetica-Bold-DOCPSE 697.385 10 DNF RP +4796 10773 XY F24(X)S 166 x(IMAGE)S 165 x(EXTENSION)S 165 x(CONC)S +-2 x(EPTS)S +XP /F40 /Helvetica-Bold-DOCPSE 448.319 10 DF RP +4796 13463 XY F40(Revision/U)S -2 x(pdate)S 167 x(Information:)S +XP /F38 /Helvetica-DOCPSE 448.319 10 DNF RP +11871 13463 XY F38(V2.4)S 17598 Y 14074 X(Joseph)S 187 x(G.)S 185 x +(Mauro)S 547 y 13315 X(Image)S 185 x(Proces)S 2 x(sing)S 184 x +(Group)S 548 y 12806 X(Digit)S -2 x(al)S 183 x(Equipmen)S 2 x(t)S +182 x(Corpora)S 2 x(tion)S 548 y 14369 X(June)S 187 x(10,)S 192 x +(1988)S 33987 Y 4796 X F40(digital)S 165 x(equipment)S 166 x +(corporation)S 166 x(maynard,)S 167 x(massachusett)S 2 x(s)S +1 PP +EP +%%Page -3 3 +1000 BP 39600 30600 PM 0 0 XY +XP /F24 /Helvetica-Bold-DOCPSE 697.385 10 DF RP +3600 5321 XY F24(Contents)S +XP /F40 /Helvetica-Bold-DOCPSE 448.319 10 DF RP +5393 6920 XY F40(PREF)S -25 x(ACE)S 26663 X(v)S +XP /F36 /Helvetica-Bold-DOCPSE 498.132 10 DF RP +3600 8115 XY F36(CHAPTER)S 165 x(1)S 499 x(INTRODUC)S -2 x(TION)S +26082 X(1\2031)S 897 y 5393 X F40(1.1)S 7187 X(SCOPE)S 165 x(AND)S +165 x(PURPOSE)S 26165 X(1\2031)S 897 y 5393 X(1.2)S 7187 X(JUSTIFIC)S +-2 x(A)S -33 x(TION)S 26165 X(1\2032)S 896 y 5393 X(1.3)S 7187 X +(REQUI)S -2 x(REMENTS)S 26165 X(1\2032)S 897 y 5393 X(1.4)S 7187 X +(GOALS)S 26165 X(1\2032)S 598 y 7187 X(1.4.1)S 9578 X(Minimal)S 165 x +(Suf\211ciency)S 26165 X(1\2032)S 598 y 7187 X(1.4.2)S 9578 X(Appli)S +-2 x(cation)S 167 x(Classes)S 26165 X(1\2033)S 597 y 7187 X(1.4.3)S +9578 X(Display)S 165 x(Systems)S 26165 X(1\2033)S 598 y 7187 X +(1.4.4)S 9578 X(Extensibility)S 26165 X(1\2033)S 15289 Y 3600 X F36 +(CHAPTER)S 165 x(2)S 499 x(IMAGING)S 165 x(CONC)S -2 x(EPTS)S 26082 X +(2\2031)S 896 y 5393 X F40(2.1)S 7187 X(TRANSF)S -2 x(ER)S 166 x +(MODEL)S 26165 X(2\2031)S 897 y 5393 X(2.2)S 7187 X(VISUAL)S 165 x +(PERCEPTIO)S -2 x(N)S 26165 X(2\2033)S 896 y 5393 X(2.3)S 7187 X +(IMAGE)S 165 x(CAPTURE)S 26165 X(2\2033)S 897 y 5393 X(2.4)S 7187 X +(IMAGE)S 165 x(SYNTHESIS)S 26165 X(2\2033)S 897 y 5393 X(2.5)S 7187 X +(MA)S -33 x(THEMA)S -34 x(TICAL)S 165 x(MODEL)S 26165 X(2\2034)S +896 y 5393 X(2.6)S 7187 X(IMAGE)S 165 x(REPRESENT)S -34 x(A)S -33 x +(TION)S 26165 X(2\2034)S 897 y 5393 X(2.7)S 7187 X(IMAGE)S 165 x +(COMPRESSION)S 26165 X(2\2036)S 897 y 5393 X(2.8)S 7187 X(IMAGE)S +165 x(VS)S 166 x(TEXT)S 166 x(&)S 166 x(GRAPHI)S -2 x(CS)S 26165 X +(2\2036)S 896 y 5393 X(2.9)S 7187 X(IMAGE)S 165 x(DA)S -34 x(T)S +-33 x(A)S 166 x(OBJECT)S 26165 X(2\2036)S 897 y 5393 X(2.10)S 7187 X +(IMAGE)S 165 x(PROCESSING)S 26165 X(2\2037)S 897 y 5393 X(2.1)S -24 x +(1)S 7187 X(IMAGE)S 165 x(RENDITI)S -2 x(ON)S 26165 X(2\2037)S 896 y +5393 X(2.12)S 7187 X(IMAGE)S 165 x(DISPLA)S -42 x(Y)S 26165 X +(2\2038)S 897 y 5393 X(2.13)S 7187 X(IMAGE)S 165 x(REVISABIL)S -2 x +(ITY)S 26165 X(2\2038)S 896 y 5393 X(2.14)S 7187 X(IMAGE)S 165 x +(APPLICA)S -34 x(TIONS)S 26165 X(2\2039)S 897 y 5393 X(2.15)S 7187 X +(IMAGE)S 165 x(SER)S -8 x(VER)S 26165 X(2\2039)S 35879 Y -373 x(iii)S +1 PP +EP +%%Page -4 4 +1000 BP 39600 30600 PM 0 0 XY +3600 Y 3600 X F36(Contents)S 5171 Y 3600 X(CHAPTER)S 165 x(3)S 499 x +(EXTENSION)S 166 x(ARCHITECTURE)S 166 x(CON)S -2 x(CEPTS)S 26082 X +(3\2031)S 896 y 5393 X F40(3.1)S 7187 X(EXTENSION)S 164 x(GUIDELIN)S +-2 x(ES)S 26165 X(3\2031)S 897 y 5393 X(3.2)S 7187 X(EXTENSION)S +164 x(LEVELS)S 26165 X(3\2032)S 897 y 5393 X(3.3)S 7187 X(GLOBA)S +-2 x(L)S 166 x(CONCEPTS)S 26165 X(3\2033)S 597 y 7187 X(3.3.1)S +9578 X(Final)S 165 x(vs)S 167 x(Revisable)S 166 x(Form)S 26165 X +(3\2033)S 598 y 7187 X(3.3.2)S 9578 X(Image)S 165 x(Data)S 167 x +(Representat)S 2 x(ion)S 26165 X(3\2033)S +XP /F38 /Helvetica-DOCPSE 448.319 10 DF RP +9578 9604 XY F38(3.3.2.1)S 11969 X(Aternate)S 166 x(Data)S 166 x +(Organizations)S 167 x(and)S 167 x(Pixels)S 179 x(\201)S 179 x +(3\2034)S 548 y 9578 X(3.3.2.2)S 11969 X(Discrete)S 166 x(vs)S 166 x +(Continuous)S 167 x(Pixels)S 179 x(\201)S 179 x(3\2034)S 598 y 7187 X +F40(3.3.3)S 9578 X(Layout)S 166 x(&)S 166 x(Coordinate)S 166 x +(Systems)S 26165 X(3\2035)S 548 y 9578 X F38(3.3.3.1)S 11969 X +(Coordinate)S 166 x(Systems)S 181 x(\201)S 179 x(3\2035)S 548 y +9578 X(3.3.3.1.1)S 12267 X(Spatial)S 166 x(Coordinate)S 167 x +(Systems)S 180 x(\201)S 179 x(3\2035)S 548 y 9578 X(3.3.3.1.2)S +12267 X(T)S -49 x(emporal)S 167 x(Coordinate)S 167 x(Systems)S 180 x +(\201)S 179 x(3\2036)S 547 y 9578 X(3.3.3.1.3)S 12267 X(Chromina)S +2 x(nce)S 166 x(Coordinate)S 167 x(Systems)S 180 x(\201)S 179 x +(3\2036)S 548 y 9578 X(3.3.3.2)S 11969 X(Layout)S 180 x(\201)S 179 x +(3\2037)S 548 y 9578 X(3.3.3.2.1)S 12267 X(Spatial)S 179 x(\201)S +180 x(3\2037)S 548 y 9578 X(3.3.3.2.2)S 12267 X(T)S -49 x(emporal)S +180 x(\201)S 180 x(3\2037)S 598 y 7187 X F40(3.3.4)S 9578 X(Image)S +165 x(Structur)S 2 x(e)S 166 x(-)S 166 x(Subsets)S 26165 X(3\2038)S +598 y 7187 X(3.3.5)S 9578 X(State)S 167 x(Information)S 166 x(-)S +166 x(Process)S 167 x(History)S 26165 X(3\2038)S 598 y 7187 X(3.3.6)S +9578 X(Extension)S 166 x(Relationships)S 26165 X(3\2038)S 548 y +9578 X F38(3.3.6.1)S 11969 X(T)S -50 x(o)S 166 x(Core)S 167 x(X)S +179 x(\201)S 179 x(3\2038)S 547 y 9578 X(3.3.6.2)S 11969 X(T)S -50 x +(o)S 166 x(Other)S 166 x(Extensions)S 180 x(\201)S 180 x(3\2038)S +548 y 9578 X(3.3.6.3)S 11969 X(Multiple)S 165 x(Connections,)S 167 x +(Cli)S -2 x(ents,)S 166 x(and)S 167 x(Resource)S 167 x(Sharing)S +181 x(\201)S 179 x(3\2039)S 548 y 9578 X(3.3.6.4)S 11969 X(T)S -50 x +(o)S 166 x(T)S -50 x(ext)S 166 x(and)S 167 x(Graphics)S 180 x(\201)S +179 x(3\2039)S 897 y 5393 X F40(3.4)S 7187 X(SER)S -9 x(VICE)S 166 x +(CONC)S -2 x(EPTS)S 26165 X(3\2039)S 598 y 7187 X(3.4.1)S 9578 X +(Service)S 167 x(Goals)S 166 x(-)S 166 x(Reasoning)S 166 x(&)S 165 x +(Implications)S 26165 X(3\2039)S 548 y 9578 X F38(3.4.1.1)S 11969 X +(Range)S 166 x(of)S 166 x(Images)S 181 x(\201)S 179 x(3\2039)S 548 y +9578 X(3.4.1.2)S 11969 X(Range)S 166 x(of)S 166 x(Applications)S +166 x(Needs)S 180 x(\201)S 179 x(3\20310)S 548 y 9578 X(3.4.1.3)S +11969 X(Range)S 166 x(of)S 166 x(Server)S 168 x(Capabiliti)S -2 x +(es)S 180 x(\201)S 179 x(3\20310)S 548 y 9578 X(3.4.1.4)S 11969 X +(Display)S 165 x(Device)S 166 x(Indepen)S 2 x(dence)S 180 x(\201)S +179 x(3\2031)S -32 x(1)S 547 y 9578 X(3.4.1.4.1)S 12267 X(Serve)S +2 x(r)S 166 x(Based)S 167 x(Rendition)S 179 x(\201)S 179 x(3\2031)S +-32 x(1)S 548 y 9578 X(3.4.1.4.2)S 12267 X(Image)S 167 x(Data)S 166 x +(Organization)S 180 x(\201)S 179 x(3\2031)S -32 x(1)S 548 y 9578 X +(3.4.1.5)S 11969 X(Image)S 167 x(Data)S 165 x(T)S -16 x(ranspor)S +2 x(t)S 178 x(\201)S 180 x(3\20312)S 548 y 9578 X(3.4.1.5.1)S 12267 X +(Image)S 167 x(Data)S 166 x(Compres)S 2 x(sion)S 179 x(\201)S 179 x +(3\20312)S 548 y 9578 X(3.4.1.5.2)S 12267 X(T)S -16 x(ranspor)S 2 x +(t)S 165 x(Granularity)S 180 x(\201)S 179 x(3\20312)S 548 y 9578 X +(3.4.1.6)S 11969 X(Image)S 167 x(Processing)S 180 x(\201)S 179 x +(3\20313)S 548 y 9578 X(3.4.1.6.1)S 12267 X(Enhan)S 2 x(cement)S +167 x(Processing)S 180 x(\201)S 180 x(3\20313)S 548 y 9578 X +(3.4.1.6.2)S 12267 X(Rendition)S 166 x(Process)S 2 x(ing)S 179 x +(\201)S 179 x(3\20313)S 548 y 9578 X(3.4.1.6.3)S 12267 X(Enhan)S +2 x(cement)S 167 x(-)S 166 x(Rendition)S 166 x(Relationship)S 179 x +(\201)S 179 x(3\20314)S 548 y 9578 X(3.4.1.6.4)S 12267 X(Other)S +167 x(Forms)S 167 x(of)S 166 x(Processing)S 181 x(\201)S 179 x +(3\20314)S 548 y 9578 X(3.4.1.6.5)S 12267 X(Proce)S 2 x(ssing)S 166 x +(Policy)S 179 x(\201)S 179 x(3\20314)S 548 y 9578 X(3.4.1.7)S 11969 X +(Operations)S 166 x(Pipelining)S 179 x(\201)S 179 x(3\20315)S 548 y +9578 X(3.4.1.8)S 11969 X(Server)S 167 x(Display)S 166 x(Hardware)S +167 x(Control)S 179 x(\201)S 179 x(3\20316)S 548 y 9578 X(3.4.1.8.1)S +12267 X(Share)S 2 x(d)S 166 x(Hardware)S 167 x(Device)S 166 x +(Control)S 179 x(\201)S 180 x(3\20316)S 548 y 9876 X(3.4.1.8.1.1)S +13164 X(LUTS)S 166 x(and)S 167 x(Bit)S 165 x(Map)S 180 x(\201)S 180 x +(3\20316)S 548 y 9876 X(3.4.1.8.1.2)S 13164 X(Brightness)S 167 x(-)S +166 x(Contrast)S 167 x(-)S 166 x(Hue)S 166 x(-)S 166 x(Saturation)S +180 x(\201)S 179 x(3\20316)S 548 y 9578 X(3.4.1.8.2)S 12267 X(Use)S +167 x(of)S 166 x(Image)S 166 x(Speci\211c)S 167 x(Accelerators)S +181 x(\201)S 179 x(3\20317)S 548 y 9578 X(3.4.1.8.3)S 12267 X(Image)S +167 x(Capture)S 167 x(Hardware)S 167 x(-)S 166 x(Live)S 167 x(V)S +-8 x(ideo)S 179 x(\201)S 180 x(3\20317)S 547 y 9578 X(3.4.1.8.4)S +12267 X(Extensibility)S 178 x(\201)S 180 x(3\20318)S 35879 Y 3600 X +F40(iv)S +1 PP +EP +%%Page -5 5 +1000 BP 39600 30600 PM 0 0 XY +3600 Y 24754 X F36(Contents)S 5133 Y 7187 X F40(3.4.2)S 9578 X +(Client-Server)S 167 x(Model)S 25916 X(3\20318)S 548 y 9578 X F38 +(3.4.2.1)S 11969 X(Server)S 167 x(Resources)S 181 x(\201)S 179 x +(3\20318)S 548 y 9578 X(3.4.2.2)S 11969 X(Service)S 166 x(Classes)S +180 x(\201)S 179 x(3\20318)S 548 y 9578 X(3.4.2.3)S 11969 X(Service)S +166 x(Events)S 180 x(\201)S 179 x(3\20319)S 897 y 5393 X F40(3.5)S +7187 X(TRANSF)S -2 x(ER)S 166 x(MODEL)S 166 x(VS)S 166 x(X)S 166 x +(WIRE)S 25916 X(3\20319)S 8869 Y 3600 X F36(CHAPTER)S 165 x(4)S 499 x +(EXTENSION)S 166 x(PROT)S -9 x(OCOL)S 165 x(ELEMENTS)S 26082 X +(4\2031)S 897 y 5393 X F40(4.1)S 7187 X(SER)S -9 x(VICES)S 26165 X +(4\2031)S 597 y 7187 X(4.1.1)S 9578 X(Device)S 166 x(Independent)S +166 x(Service)S 167 x(Group)S 26165 X(4\2031)S 548 y 9578 X F38 +(4.1.1.1)S 11969 X(Session)S 166 x(Class)S 166 x(Services)S 180 x +(\201)S 180 x(4\2031)S 548 y 9578 X(4.1.1.2)S 11969 X(Resource)S +167 x(Class)S 166 x(Services)S 180 x(\201)S 179 x(4\2031)S 548 y +9578 X(4.1.1.3)S 11969 X(T)S -17 x(ranspor)S 2 x(t)S 165 x(Class)S +166 x(Services)S 180 x(\201)S 180 x(4\2032)S 548 y 9578 X(4.1.1.4)S +11969 X(Statist)S -2 x(ics)S 166 x(Class)S 166 x(Services)S 180 x +(\201)S 180 x(4\2032)S 548 y 9578 X(4.1.1.5)S 11969 X(Enhancem)S +2 x(ent)S 166 x(Class)S 166 x(Services)S 180 x(\201)S 179 x(4\2033)S +548 y 9578 X(4.1.1.6)S 11969 X(Process)S 167 x(Control)S 166 x +(Class)S 166 x(Services)S 180 x(\201)S 179 x(4\2033)S 598 y 7187 X +F40(4.1.2)S 9578 X(Device)S 166 x(Dependent)S 166 x(Service)S 168 x +(Group)S 26165 X(4\2034)S 548 y 9578 X F38(4.1.2.1)S 11969 X +(Rendition)S 165 x(Class)S 166 x(Services)S 180 x(\201)S 180 x +(4\2034)S 548 y 9578 X(4.1.2.2)S 11969 X(Import/Export)S 166 x +(Class)S 166 x(Services)S 180 x(\201)S 180 x(4\2035)S 548 y 9578 X +(4.1.2.3)S 11969 X(Display)S 165 x(Class)S 166 x(Services)S 180 x +(\201)S 179 x(4\2035)S 548 y 9578 X(4.1.2.4)S 11969 X(Device)S 166 x +(Control)S 166 x(Class)S 165 x(Services)S 181 x(\201)S 179 x(4\2035)S +896 y 5393 X F40(4.2)S 7187 X(RESOUR)S -2 x(CES)S 26165 X(4\2036)S +598 y 7187 X(4.2.1)S 9578 X(Image)S 165 x(Object)S 166 x(-)S 167 x +(IOB)S 26165 X(4\2036)S 598 y 7187 X(4.2.2)S 9578 X(Image)S 165 x +(Enhancement)S 167 x(Context)S 167 x(-)S 166 x(IEC)S 26165 X(4\2036)S +598 y 7187 X(4.2.3)S 9578 X(Image)S 165 x(Process)S 168 x(Context)S +166 x(-)S 167 x(IPC)S 26165 X(4\2037)S 548 y 9578 X F38(4.2.3.1)S +11969 X(Region)S 166 x(of)S 166 x(Interest)S 166 x(-)S 166 x(ROI)S +179 x(\201)S 179 x(4\2037)S 548 y 9578 X(4.2.3.2)S 11969 X(Control)S +166 x(Processing)S 167 x(Plane)S 166 x(-)S 167 x(CPP)S 179 x(\201)S +179 x(4\2038)S 547 y 9578 X(4.2.3.3)S 11969 X(T)S -50 x(emplates)S +167 x(-)S 166 x(TMP)S 180 x(\201)S 179 x(4\2038)S 598 y 7187 X F40 +(4.2.4)S 9578 X(Image)S 165 x(Control)S 166 x(Context)S 167 x(-)S +166 x(ICC)S 26165 X(4\2038)S 598 y 7187 X(4.2.5)S 9578 X(Image)S +165 x(Display)S 166 x(Context)S 167 x(-)S 166 x(IDC)S 26165 X +(4\2039)S 897 y 5393 X(4.3)S 7187 X(SER)S -9 x(VICE)S 166 x(OPERA)S +-34 x(TION)S 25916 X(4\20310)S 597 y 7187 X(4.3.1)S 9578 X(Flow)S +25916 X(4\20310)S 598 y 7187 X(4.3.2)S 9578 X(Requests)S 166 x(and)S +167 x(Replies)S 25940 X(4\2031)S -24 x(1)S 598 y 7187 X(4.3.3)S +9578 X(Errors)S 25940 X(4\2031)S -24 x(1)S 598 y 7187 X(4.3.4)S +9578 X(Events)S 25940 X(4\2031)S -24 x(1)S 26453 Y 3600 X F36 +(CHAPTER)S 165 x(5)S 499 x(TERMINOLOGY)S 26082 X(5\2031)S 897 y +5393 X F40(5.1)S 7187 X(CORE)S 165 x(PROT)S -9 x(OCOL)S 26165 X +(5\2031)S 896 y 5393 X(5.2)S 7187 X(EXTENSION)S 164 x(PROT)S -8 x +(OCOL)S 26165 X(5\2032)S 598 y 7187 X(5.2.1)S 9578 X(Image)S 165 x +(De\211nitions)S 26165 X(5\2032)S 598 y 7187 X(5.2.2)S 9578 X(Image)S +165 x(Characte)S 2 x(ristics)S 26165 X(5\2034)S 598 y 7187 X(5.2.3)S +9578 X(V)S -8 x(isual)S 165 x(T)S -33 x(ypes)S 26165 X(5\2035)S 597 y +7187 X(5.2.4)S 9578 X(Image)S 165 x(Classes)S 26165 X(5\2035)S 598 y +7187 X(5.2.5)S 9578 X(Image)S 165 x(Data)S 167 x(Organization)S +26165 X(5\2036)S 598 y 7187 X(5.2.6)S 9578 X(Image)S 165 x(Data)S +167 x(Encoding)S 26165 X(5\2038)S 598 y 7187 X(5.2.7)S 9578 X(Image)S +165 x(Data)S 167 x(Presentat)S 2 x(ion)S 26165 X(5\2039)S 597 y +7187 X(5.2.8)S 9578 X(Image)S 165 x(Server)S 168 x(Hardware)S 25916 X +(5\20310)S 598 y 7187 X(5.2.9)S 9578 X(Image)S 165 x(Data)S 167 x +(Layout)S 25940 X(5\2031)S -24 x(1)S 35879 Y -249 x(v)S +1 PP +EP +%%Page -6 6 +1000 BP 39600 30600 PM 0 0 XY +3600 Y 3600 X F36(Contents)S 5133 Y 7187 X F40(5.2.10)S 9578 X +(Three)S 166 x(Space)S 167 x(Color)S 25940 X(5\2031)S -24 x(1)S 598 y +7187 X(5.2.1)S -25 x(1)S 9578 X(Image)S 165 x(Data)S 167 x +(Processing)S 25916 X(5\20312)S 6926 Y 3600 X F36(APPENDIX)S 166 x +(A)S 498 x(RELA)S -37 x(TED)S 167 x(T)S -9 x(OPICS)S 25999 X(A\2031)S +897 y 5393 X F40(A.1)S 7187 X(IMAGE)S 165 x(DA)S -34 x(T)S -33 x(A)S +166 x(INTERC)S -2 x(HANGE)S 26090 X(A\2031)S 9504 Y 3600 X F36 +(FIGURES)S 747 y -421 x F40(2\2031)S 7187 X(IMAGE)S 165 x(TRANSFER)S +165 x(PROCESS)S 26165 X(2\2032)S 697 y 5393 X(2\2032)S 7187 X +(VISUAL)S 165 x(TYPE)S 166 x(-)S 166 x(VS)S 166 x(-)S 166 x(IMAGE)S +166 x(CLASS)S 26165 X(2\2035)S 698 y 5393 X(3\2031)S 7187 X(IMAGE)S +165 x(EXTENSION)S 165 x(-)S 166 x(VS)S 166 x(-)S 167 x(CORE)S 165 x +(P)S -33 x(ACKAG)S -2 x(E)S 26165 X(3\2032)S 697 y 5393 X(3\2032)S +7187 X(SER)S -9 x(VICE)S 166 x(CLASS)S 165 x(GROUPS)S 25916 X +(3\20319)S 698 y 5393 X(3\2033)S 7187 X(TRANSF)S -2 x(ER)S 166 x +(MODEL)S 166 x(&)S 166 x(X)S 166 x(WIRE)S 165 x(LOCA)S -34 x(TION)S +25916 X(3\20320)S 697 y 5393 X(4\2031)S 7187 X(OPERA)S -34 x(TIONA)S +-2 x(L)S 166 x(MODEL)S 25916 X(4\20310)S 697 y 5393 X(A\2031)S 7187 X +(IMAGE)S 165 x(DA)S -34 x(T)S -33 x(A)S 166 x(INTERC)S -2 x(HANGE)S +26090 X(A\2031)S 16116 Y 3600 X F36(T)S -37 x(ABLES)S 747 y -162 x +F40(5\2031)S 7187 X(Core)S 166 x(T)S -33 x(erms)S 26165 X(5\2031)S +35879 Y 3600 X(vi)S +1 PP +EP +%%Page -5 7 +1000 BP 39600 30600 PM 0 0 XY +3600 4845 XY 23316 48 R 6190 Y 3600 X F24(Preface)S +XP /F78 /Times-Roman-DOCPSE 498.132 10 DNF RP +4796 8482 XY F78(The)S 173 x(core)S 173 x(X)S 172 x(archite)S 2 x +(cture)S 173 x(is)S 173 x(a)S 173 x(major)S 173 x(step)S 173 x(in)S +173 x(the)S 173 x(de\211nit)S 2 x(ion)S 173 x(of)S 173 x(open,)S +174 x(interact)S 2 x(ive)S 173 x(applic)S 2 x(ations)S 173 x +(display)S 174 x(services.)S 548 y 4796 X(It)S 181 x(has,)S 185 x +(in)S 182 x(essence,)S 186 x(pried)S 182 x(apart)S 182 x(the)S 182 x +(tight)S 2 x(ly)S 182 x(coupled,)S 186 x(private)S 183 x +(interconnec)S 2 x(t)S 182 x(between)S 182 x(applicat)S 2 x(ion)S +182 x(and)S 182 x(display)S 548 y 4796 X(subsystem)S 165 x(by)S 166 x +(specifyi)S 2 x(ng)S 166 x(a)S 166 x(structured)S 167 x(set)S 166 x +(of)S 166 x(display)S 167 x(services.)S 896 y 4796 X(The)S 183 x +(core)S 183 x(X)S 183 x(protocol)S 184 x(recognizes)S 184 x(the)S +183 x(need)S 184 x(for)S 183 x(minimally)S 184 x(suf)S -10 x +(\211cient)S 185 x(capabili)S 2 x(ties,)S 187 x(and,)S 187 x(as)S +183 x(such,)S 187 x(leaves)S 184 x(the)S 548 y 4796 X +(speci\211catio)S 2 x(n)S 169 x(of)S 169 x(robust)S 170 x(applica)S +2 x(tion)S 170 x(domain)S 170 x(speci\211c)S 170 x(display)S 170 x +(services)S 170 x(to)S 170 x(extension)S 171 x(packages.)S 256 x +(These)S 170 x(extension)S 548 y 4796 X(packages)S 166 x(relate)S +168 x(to)S 166 x(the)S 167 x(core)S 166 x(X)S 166 x(protocol)S 167 x +(by)S 166 x(way)S 166 x(of)S 166 x(an)S 166 x(extensi)S 2 x(on)S +166 x(mechanism)S 166 x(speci\211ed)S 167 x(in)S 166 x(the)S 167 x +(core)S 166 x(X)S 166 x(protocol.)S 897 y 4796 X(This)S 187 x +(document)S 187 x(contains)S 188 x(conceptual)S 188 x(material)S +188 x(useful)S 187 x(in)S 187 x(understanding)S 188 x(the)S 187 x +(proposed)S 187 x(X)S 186 x(image)S 187 x(extension)S 548 y 4796 X +(package)S 173 x(incl)S 2 x(uding)S 173 x(the)S 174 x(X)S 173 x +(image)S 173 x(extension)S 174 x(protocol)S 175 x(\(XIEP\),)S 172 x +(the)S 173 x(protocol)S 175 x(binding)S 174 x(in)S 173 x(the)S 174 x +(X)S 173 x(image)S 173 x(extension)S 548 y 4796 X(library)S 171 x +(\(XIE_LIB\),)S 170 x(and)S 171 x(the)S 171 x(X)S 170 x(image)S 171 x +(extension)S 172 x(toolki)S 2 x(t)S 170 x(\(XIE_TK\).)S 170 x(The)S +171 x(X)S 170 x(image)S 171 x(extension)S 172 x(protocol)S 172 x +(\(XIEP\),)S 548 y 4796 X(X)S 176 x(image)S 177 x(extension)S 178 x +(library)S 178 x(\(XIE_LIB\),)S 176 x(and)S 177 x(X)S 176 x(image)S +177 x(extensi)S 2 x(on)S 177 x(tool)S 177 x(kit)S 178 x(\(XIE_TK\))S +176 x(are)S 177 x(de\211ned)S 177 x(in)S 178 x(separate)S 548 y +4796 X(documents.)S 249 x(It)S 166 x(is)S 166 x(assumed)S 166 x +(that)S 167 x(the)S 167 x(reader)S 166 x(is)S 166 x(familia)S 2 x(r)S +166 x(with)S 166 x(the)S 167 x(core)S 166 x(X)S 166 x(architec)S +2 x(ture.)S 16153 Y 3600 X 23316 48 R +XP /F28 /Helvetica-Bold-DOCPSE 597.758 10 DF RP +3600 16850 XY F28(Related)S 167 x(Documen)S 2 x(ts)S 897 y 4796 X +F78(\201)S 722 x(X1)S -19 x(1)S 167 x(W)S -20 x(indow)S 166 x +(System)S 166 x(Protocol)S 747 y 5692 X(Describes)S 189 x(the)S 190 x +(core)S 190 x(X)S 189 x(protocol)S 190 x(functions)S 190 x(and)S +190 x(the)S 190 x(conventions)S 190 x(to)S 190 x(be)S 190 x(used)S +189 x(in)S 190 x(specifying)S 190 x(extension)S 548 y 5692 X +(packages.)S 747 y 4796 X(\201)S 722 x(X)S 166 x(Extension)S 167 x +(Package)S 167 x(Guideli)S 2 x(nes)S 747 y 5692 X(Sets)S 167 x +(forth)S 166 x(guideli)S 2 x(nes)S 166 x(for)S 166 x(extension)S +167 x(packages.)S 748 y 4796 X(\201)S 722 x(X)S 166 x(Image)S 166 x +(Extension)S 167 x(Protocol)S 167 x(\(XIEP\))S 747 y 5692 X +(Describes)S 169 x(the)S 169 x(proposed)S 168 x(X)S 168 x(Image)S +169 x(Extension)S 170 x(Protocol.)S 254 x(The)S 169 x(X)S 168 x +(Image)S 169 x(Extension)S 170 x(Protocol)S 169 x(Speci\211cat)S +2 x(ion)S 169 x(is)S 548 y 5692 X(the)S 167 x(companion)S 167 x +(document)S 166 x(to)S 167 x(this)S 167 x(concepts)S 167 x +(document.)S 747 y 4796 X(\201)S 722 x(X)S 166 x(Image)S 166 x +(Extension)S 167 x(Lib)S 167 x(\(XIE_LIB\))S 747 y 5692 X(Describes)S +166 x(the)S 167 x(content)S 2 x(s)S 165 x(of)S 166 x(the)S 167 x +(image)S 167 x(extension)S 167 x(library)S 167 x(level.)S 747 y +4796 X(\201)S 722 x(X)S 166 x(Image)S 166 x(Extension)S 167 x(T)S +-34 x(oolkit)S 167 x(\(XIE_TK\))S 748 y 5692 X(Describes)S 166 x +(the)S 167 x(content)S 2 x(s)S 165 x(of)S 166 x(the)S 167 x(image)S +167 x(extension)S 167 x(toolki)S 2 x(t)S 166 x(level.)S 27062 Y +3600 X 23316 48 R 697 y 3600 X F28(Participants)S 897 y 4796 X F78 +(\201)S 722 x(AUTHOR:)S 747 y 5692 X(\201)S 723 x(Joseph)S 166 x +(Mauro)S 747 y 5692 X(\201)S 723 x(Digital)S 168 x(Equipment)S 167 x +(Corporation)S 748 y 5692 X(\201)S 723 x(MS:)S 166 x(MK02-2/K03)S +747 y 5692 X(\201)S 723 x(Continent)S 2 x(al)S 167 x(Blvd.)S 747 y +5692 X(\201)S 723 x(Merrimack,)S 166 x(New)S 165 x(Hampshire)S 166 x +(03057)S 747 y 5692 X(\201)S 723 x(603-884-0528)S 35879 Y 26663 X +F40(v)S +1 PP +EP +%%Page -6 8 +1000 BP 39600 30600 PM 0 0 XY +XP /F36 /Helvetica-Bold-DOCPSE 498.132 10 DF RP +3600 3600 XY F36(Preface)S 5138 Y -604 x F78(\201)S 722 x(CONTRIBUT)S +-9 x(ORS:)S 747 y 5692 X(\201)S 723 x(John)S 166 x(W)S -40 x(eber)S +166 x(\(Digit)S 2 x(al\))S 747 y 4796 X(\201)S 722 x(INVITED)S 166 x +(REVIEWERS:)S 747 y 5692 X(\201)S 723 x(Mark)S 166 x(Sornson)S 166 x +(\(Digital\))S 748 y 5692 X(\201)S 723 x(Bob)S 166 x(Milli)S 2 x(ng)S +166 x(\(Digital)S 2 x(\))S 9621 Y 3600 X 23316 48 R 697 y 3600 X F28 +(Revision)S 167 x(History)S 12112 Y 4796 X F78(rev)S 166 x(v1.0)S +165 x(July)S 167 x(1,)S 165 x(1987)S 167 x(\211rst)S 166 x(protocol)S +167 x(draft)S 896 y 4796 X(rev)S 166 x(v2.0)S 165 x(September)S 167 x +(1,)S 166 x(1987)S 166 x(split)S 167 x(concepts)S 167 x(from)S 166 x +(protocol)S 897 y 4796 X(rev)S 166 x(v2.1)S 165 x(December)S 166 x +(1,)S 166 x(1987)S 166 x(rework)S 166 x(based)S 166 x(upon)S 166 x +(int)S 2 x(ernal)S 166 x(review)S 896 y 4796 X(rev)S 166 x(v2.2)S +165 x(December)S 166 x(10,)S 166 x(1987)S 166 x(rework)S 166 x +(based)S 166 x(upon)S 167 x(internal)S 167 x(review)S 897 y 4796 X +(rev)S 166 x(v2.3)S 165 x(April)S 167 x(10,)S 166 x(1988)S 166 x +(rework)S 166 x(based)S 166 x(upon)S 166 x(protocol)S 168 x(spec)S +897 y 4796 X(rev)S 166 x(v2.4)S 165 x(June)S 167 x(10,)S 165 x(1988)S +166 x(minor)S 167 x(rework)S 165 x(for)S 166 x(\211rst)S 166 x(MIT)S +166 x(release)S 18089 Y 3600 X 23316 48 R 698 y 3600 X F28 +(Organization)S 896 y 4796 X F78(This)S 166 x(document)S 167 x +(contains)S 167 x(\211ve)S 166 x(chapte)S 2 x(rs)S 165 x(and)S 167 x +(one)S 166 x(appendix.)S 897 y 4796 X(\201)S 722 x(Chapter)S 167 x +(1,)S 166 x(Introducti)S 2 x(on,)S 165 x(explai)S 2 x(ns)S 166 x +(the)S 166 x(purpose)S 166 x(of)S 166 x(the)S 167 x(X)S 166 x(Image)S +166 x(Extension)S 747 y 4796 X(\201)S 722 x(Chapter)S 167 x(2,)S +166 x(Imaging)S 166 x(Concepts,)S 167 x(describes)S 166 x(basic)S +167 x(digit)S 2 x(al)S 166 x(imaging)S 167 x(concepts)S 747 y 4796 X +(\201)S 722 x(Chapter)S 167 x(3,)S 166 x(Extension)S 167 x(Architec)S +2 x(ture)S 166 x(Concepts,)S 167 x(describes)S 166 x(the)S 167 x +(underlying)S 167 x(concept)S 2 x(s)S 165 x(of)S 166 x(the)S 167 x +(image)S 167 x(extension)S 747 y 4796 X(\201)S 722 x(Chapter)S 167 x +(4,)S 166 x(Extension)S 167 x(Protocol)S 168 x(Elements,)S 166 x +(de\211nes)S 166 x(the)S 167 x(basic)S 167 x(elements)S 167 x(of)S +166 x(the)S 167 x(extension)S 167 x(protocol)S 748 y 4796 X(\201)S +722 x(Chapter)S 167 x(5,)S 166 x(Extension)S 167 x(Lexi)S 2 x(con,)S +165 x(de\211nes)S 167 x(the)S 166 x(lexi)S 2 x(con)S 166 x(used)S +166 x(in)S 167 x(the)S 166 x(extensi)S 2 x(on)S 747 y 4796 X(\201)S +722 x(Appendix)S 167 x(A,)S 165 x(Relat)S 2 x(ed)S 166 x(T)S -35 x +(opics,)S 166 x(addresses)S 166 x(some)S 166 x(closely)S 167 x +(associated)S 167 x(topi)S 2 x(cs)S 35879 Y 3600 X F40(vi)S +1 PP +EP +%%Page 1 9 +1000 BP 39600 30600 PM 0 0 XY +9007 Y 3600 X F24(Chapter)S 498 x(1)S 10651 Y 3600 X(INTROD)S -2 x +(UCTION)S 13656 Y 3600 X F28(1.1)S 599 x(Scope)S 167 x(and)S 166 x +(Purpose)S 14901 Y 4796 X F78(The)S 167 x(X)S 168 x(image)S 167 x +(extensi)S 2 x(on)S 167 x(package)S 168 x(is)S 168 x(a)S 168 x +(supplement)S 168 x(to)S 168 x(the)S 168 x(core)S 168 x(X)S 167 x +(package.)S 252 x(The)S 168 x(X)S 167 x(image)S 168 x(extension)S +168 x(package)S 169 x(is)S 548 y 4796 X(designed)S 168 x(to)S 169 x +(provide)S 169 x(applicat)S 2 x(ions)S 168 x(with)S 169 x(robust)S +168 x(support)S 169 x(for)S 168 x(visually)S 169 x(inte)S 2 x +(ractive)S 169 x(digit)S 2 x(al)S 168 x(image)S 169 x(enhancement)S +169 x(and)S 548 y 4796 X(display)S 169 x(operations.)S 254 x(The)S +169 x(purpose)S 168 x(of)S 168 x(this)S 169 x(document)S 169 x(is)S +168 x(to)S 169 x(provide)S 169 x(conceptual)S 170 x(material)S 169 x +(useful)S 169 x(in)S 169 x(understanding)S 548 y 4796 X(the)S 166 x +(image)S 167 x(extension)S 167 x(package)S 167 x(and)S 166 x(its)S +167 x(wire)S 166 x(protocol)S 2 x(.)S 897 y 4796 X(The)S 156 x(core)S +157 x(X)S 156 x(architect)S 2 x(ure)S 156 x(de\211nes)S 157 x(a)S +156 x(client)S 2 x(-server)S 156 x(based)S 156 x(intera)S 2 x(ctive)S +157 x(applic)S 2 x(ation)S 157 x(display)S 157 x(services)S 157 x +(model)S 157 x(includin)S 2 x(g)S 548 y 4796 X(components)S 175 x +(and)S 175 x(their)S 175 x(relat)S 2 x(ionships)S 175 x(\(layering)S +176 x(and)S 175 x(distribut)S 2 x(ion\).)S 266 x(The)S 175 x +(proposed)S 175 x(X)S 175 x(image)S 175 x(extension)S 176 x(package)S +548 y 4796 X(follows)S 181 x(the)S 181 x(core)S 181 x(X)S 180 x +(archit)S 2 x(ecture)S 181 x(by)S 181 x(specifying)S 182 x(imaging)S +182 x(components)S 181 x(and)S 181 x(their)S 182 x(relatio)S 2 x +(nships)S 181 x(within)S 181 x(the)S 182 x(X)S 547 y 4796 X(model.)S +897 y 4796 X(Although)S 158 x(the)S 159 x(proposed)S 158 x(X)S 158 x +(image)S 158 x(extensio)S 2 x(n)S 158 x(package)S 158 x(de\211nes)S +159 x(image)S 158 x(speci\211c)S 159 x(extensions)S 159 x(at)S 158 x +(all)S 160 x(levels)S 159 x(of)S 158 x(the)S 158 x(core)S 548 y +4796 X(X)S 159 x(model,)S 162 x(it)S 161 x(focuses)S 160 x +(primarily)S 162 x(on)S 160 x(extensions)S 161 x(to)S 161 x(the)S +161 x(wire)S 161 x(protocol)S 161 x(as)S 161 x(these)S 161 x(are)S +160 x(fundamental)S 162 x(to)S 160 x(all)S 162 x(other)S 161 x +(levels.)S 548 y 4796 X(The)S 174 x(X)S 173 x(Image)S 174 x +(Extension)S 175 x(Protocol)S 175 x(\(XIEP\))S 173 x(is)S 174 x +(intended)S 175 x(as)S 174 x(the)S 174 x(format)S 174 x(by)S 174 x +(which)S 174 x(client)S 175 x(and)S 174 x(server)S 174 x(portions)S +175 x(of)S 548 y 4796 X(an)S 170 x(imaging)S 170 x(applic)S 2 x +(ation)S 171 x(communicate)S 170 x(imaging)S 171 x(service)S 171 x +(requests)S 170 x(and)S 170 x(replies)S 171 x(across)S 169 x(the)S +171 x(X)S 169 x(wire.)S 256 x(As)S 170 x(such,)S 170 x(this)S 548 y +4796 X(concepts)S 173 x(document)S 173 x(focuses)S 173 x(primarily)S +173 x(on)S 173 x(providing)S 174 x(the)S 173 x(reader)S 173 x(with)S +174 x(the)S 173 x(background)S 173 x(material)S 174 x(and)S 173 x +(reasoning)S 548 y 4796 X(necessary)S 166 x(to)S 166 x(understand)S +167 x(the)S 167 x(XIEP)S 166 x(protocol)S 167 x(speci\211cat)S 2 x +(ion.)S 896 y 4796 X(XIEP)S 175 x(is)S 176 x(inten)S 2 x(ded)S 176 x +(for)S 175 x(use)S 176 x(by)S 176 x(a)S 176 x(wide)S 176 x(range)S +177 x(of)S 175 x(digit)S 2 x(al)S 176 x(imaging)S 177 x(applic)S +2 x(ations)S 176 x(deali)S 2 x(ng)S 176 x(with)S 176 x(various)S +177 x(classes)S 176 x(of)S 548 y 4796 X(images,)S 165 x(and)S 167 x +(requiring)S 167 x(varying)S 167 x(degrees)S 166 x(of)S 166 x +(server)S 166 x(support.)S 249 x(The)S 166 x(classes)S 167 x(of)S +166 x(images)S 166 x(include)S 2 x(:)S 897 y 4796 X(\201)S 722 x +(Stati)S 2 x(c)S 166 x(bitonal)S 168 x(digita)S 2 x(l)S 166 x(image)S +166 x(data)S 167 x(\(scanned)S 167 x(documents\))S 747 y 4796 X +(\201)S 722 x(Stati)S 2 x(c)S 166 x(continuous)S 167 x(tone)S 167 x +(monochromatic)S 167 x(digita)S 2 x(l)S 166 x(image)S 167 x(data)S +166 x(\(gray)S 167 x(scale\))S 747 y 4796 X(\201)S 722 x(Stati)S +2 x(c)S 166 x(multi)S 167 x(spectral)S 167 x(digit)S 2 x(al)S 166 x +(image)S 167 x(data)S 167 x(\(color\))S 748 y 4796 X(\201)S 722 x(T)S +-17 x(ime)S 166 x(varying)S 167 x(versions)S 166 x(of)S 166 x(each)S +167 x(of)S 166 x(the)S 167 x(above)S 28401 Y 4796 X(XIEP)S 181 x(is)S +182 x(intended)S 183 x(to)S 182 x(support)S 182 x(applica)S 2 x +(tions)S 182 x(that)S 183 x(simply)S 182 x(display)S 182 x(images,)S +186 x(through)S 182 x(those)S 182 x(that)S 183 x(involve)S 183 x +(highly)S 547 y 4796 X(interacti)S 2 x(ve,)S 178 x(human)S 176 x +(directe)S 2 x(d)S 176 x(image)S 176 x(processing.)S 269 x(As)S 176 x +(a)S 176 x(future)S 176 x(component)S 177 x(of)S 176 x(a)S 176 x +(developi)S 2 x(ng)S 176 x(industry)S 177 x(standard,)S 548 y 4796 X +(XIEP)S 165 x(will)S 168 x(serve)S 166 x(the)S 166 x(needs)S 167 x +(of)S 166 x(multiple)S 167 x(vendors)S 166 x(and)S 167 x(their)S +167 x(end)S 166 x(users.)S 35879 Y 22280 X F40(INTRO)S -2 x(DUCTION)S +447 x(1\2031)S +1 PP +EP +%%Page 2 10 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(1.2)S 599 x(Justi\211ca)S 2 x(tion)S 6838 Y 4796 X +F78(The)S 171 x(core)S 172 x(X)S 171 x(protocol)S 172 x(chooses)S +171 x(not)S 172 x(to)S 172 x(provide)S 172 x(robust)S 171 x(support)S +172 x(for)S 171 x(certain)S 173 x(applicat)S 2 x(ion)S 171 x(areas)S +172 x(in)S 172 x(order)S 171 x(to)S 172 x(remain)S 548 y 4796 X +(minimal)S 175 x(in)S 176 x(extent.)S 268 x(Instead,)S 177 x(it)S +176 x(provides)S 175 x(a)S 176 x(mechanism)S 175 x(for)S 174 x +(adding)S 176 x(protocol)S 176 x(extensi)S 2 x(on)S 175 x(packages)S +175 x(for)S 175 x(domains)S 548 y 4796 X(such)S 166 x(as)S 166 x +(imaging.)S 896 y 4796 X(Analysis)S 167 x(of)S 166 x(imaging)S 167 x +(appli)S 2 x(cations)S 167 x(and)S 167 x(their)S 168 x(display)S +167 x(\(human)S 167 x(interact)S 2 x(ion\))S 167 x(needs)S 166 x +(indi)S 2 x(cates)S 167 x(that)S 168 x(there)S 167 x(are)S 167 x +(several)S 548 y 4796 X(broad)S 158 x(areas)S 158 x(which)S 158 x(X)S +158 x(image)S 158 x(servers)S 158 x(and)S 158 x(an)S 159 x(X)S 157 x +(image)S 159 x(extension)S 159 x(protocol)S 159 x(\(XIEP\))S 158 x +(should)S 159 x(provide)S 158 x(for)S 158 x(includi)S 2 x(ng:)S 897 y +4796 X(\201)S 722 x(Device)S 167 x(independent)S 168 x(display)S +167 x(interact)S 2 x(ion)S 747 y 4796 X(\201)S 722 x(W)S -20 x(ire)S +167 x(image)S 166 x(data)S 167 x(or)S -9 x(ganizat)S 2 x(ion)S 167 x +(and)S 166 x(compression)S 747 y 4796 X(\201)S 722 x(Interacti)S +2 x(ve)S 166 x(image)S 167 x(enhancement)S 167 x(processing)S 748 y +4796 X(\201)S 722 x(Control)S 167 x(of)S 166 x(tigh)S 2 x(tly)S 167 x +(coupled)S 167 x(image)S 166 x(capture)S 167 x(hardware)S 747 y +4796 X(\201)S 722 x(Use)S 166 x(of)S 166 x(image)S 166 x(speci\211c)S +167 x(accelerat)S 2 x(ors)S 14360 Y 4796 X(This)S 179 x(work)S 179 x +(is)S 179 x(justi)S 2 x(\211ed)S 179 x(by)S 179 x(the)S 180 x +(standardizat)S 2 x(ion)S 179 x(of)S 179 x(and)S 180 x(increase)S +180 x(in)S 179 x(imaging)S 180 x(display)S 180 x(capabil)S 2 x +(ities)S 180 x(provided)S 180 x(to)S 548 y 4796 X(applicat)S 2 x +(ions,)S 166 x(and)S 166 x(by)S 166 x(the)S 167 x(of)S -9 x(f)S 166 x +(loading)S 167 x(of)S 166 x(many)S 166 x(operations)S 167 x(to)S +167 x(the)S 166 x(server)S -27 x(.)S 16551 Y 3600 X F28(1.3)S 599 x +(Requirements)S 17797 Y 4796 X F78(It)S 183 x(is)S 183 x(a)S 183 x +(requirement)S 184 x(that)S 184 x(XIEP)S 182 x(comply)S 184 x(with)S +183 x(the)S 184 x(architect)S 2 x(ural)S 183 x(model)S 183 x(set)S +184 x(forth)S 183 x(by)S 183 x(X.)S 182 x(Compliance)S 184 x(will)S +184 x(be)S 548 y 4796 X(measured)S 165 x(by)S 167 x(the)S 166 x +(similari)S 2 x(ty)S 166 x(of)S 166 x(archite)S 2 x(ctural)S 167 x +(concepts.)S 896 y 4796 X(It)S 173 x(is)S 174 x(a)S 174 x +(requirement)S 174 x(that)S 175 x(XIEP)S 173 x(comply)S 174 x(with)S +174 x(the)S 174 x(core)S 174 x(protocol)S 174 x(and)S 174 x +(protocol)S 175 x(extension)S 174 x(mechanisms)S 174 x(set)S 174 x +(forth)S 548 y 4796 X(by)S 166 x(X.)S 21433 Y 3600 X F28(1.4)S 599 x +(Goals)S 22678 Y 4796 X F78(XIEP)S 189 x(is)S 189 x(designed)S 191 x +(to)S 190 x(meet)S 189 x(the)S 190 x(human)S 190 x(interact)S 2 x +(ion)S 190 x(needs)S 189 x(of)S 189 x(imaging)S 191 x(applicat)S +2 x(ions)S 190 x(by)S 189 x(providing)S 191 x(for)S 189 x(the)S 548 y +4796 X(communication)S 181 x(of)S 179 x(these)S 180 x(needs)S 180 x +(between)S 181 x(X)S 179 x(client)S 181 x(and)S 180 x(X)S 180 x +(server)S -28 x(.)S 276 x(XIEP)S 179 x(has)S 180 x(as)S 180 x(its)S +180 x(goals)S 180 x(the)S 181 x(inclusion)S 181 x(of)S 179 x(a)S +548 y 4796 X(minimal)S 164 x(set)S 163 x(of)S 163 x(functi)S 2 x +(ons)S 163 x(that)S 164 x(support)S 164 x(the)S 164 x(variety)S 164 x +(of)S 164 x(image)S 163 x(appli)S 2 x(cations)S 164 x(classes)S 164 x +(and)S 163 x(provide)S 164 x(access)S 164 x(to)S 164 x(the)S 164 x +(full)S 548 y 4796 X(resources)S 165 x(of)S 166 x(the)S 167 x +(display)S 167 x(system,)S 166 x(and)S 166 x(support)S 166 x(for)S +166 x(image)S 167 x(extension)S 167 x(package)S 167 x(extensibi)S +2 x(lity)S -31 x(.)S 25817 Y 3600 X F28(1.4.1)S 599 x(Minimal)S 168 x +(Suf\211ciency)S 26913 Y 4796 X F78(XIEP)S 181 x(should)S 182 x +(contain)S 183 x(a)S 181 x(minimal)S 183 x(set)S 181 x(of)S 182 x +(functions)S 182 x(that)S 183 x(support)S 182 x(basic)S 182 x +(imaging)S 182 x(operati)S 2 x(on)S 181 x(classes)S 182 x(includi)S +2 x(ng)S 548 y 4796 X(image)S 182 x(object)S 184 x(transport,)S 186 x +(intera)S 2 x(ctive)S 183 x(image)S 183 x(enhancement)S 183 x +(processing,)S 186 x(image)S 183 x(display)S 183 x(renditi)S 2 x +(on,)S 185 x(and)S 183 x(tightl)S 2 x(y)S 547 y 4796 X(coupled)S +187 x(image)S 186 x(capture)S 187 x(device)S 187 x(control)S 2 x(.)S +288 x(The)S 187 x(set)S 187 x(should)S 186 x(be)S 186 x(minimal)S +187 x(in)S 187 x(content)S 188 x(with)S 186 x(as)S 186 x(lit)S 2 x +(tle)S 187 x(overlap)S 187 x(in)S 548 y 4796 X(functions)S 172 x(as)S +172 x(possible.)S 261 x(The)S 173 x(protocol)S 173 x(must)S 172 x +(support)S 172 x(the)S 172 x(construct)S 2 x(ion)S 172 x(of)S 172 x +(X)S 171 x(image)S 173 x(extension)S 173 x(toolkit)S 174 x +(\(XIE_TK\))S 548 y 4796 X(and)S 166 x(client)S 168 x(speci\211c)S +167 x(higher)S 166 x(level)S 168 x(imaging)S 167 x(functions.)S +35879 Y 3600 X F40(1\2032)S 449 x(INTRODU)S -2 x(CTION)S +1 PP +EP +%%Page 3 11 +1000 BP 39600 30600 PM 0 0 XY +5246 Y 3600 X F28(1.4.2)S 599 x(Applicati)S 2 x(on)S 166 x(Classes)S +6342 Y 4796 X F78(XIEP)S 174 x(should)S 174 x(be)S 175 x(suf)S -10 x +(\211cient)S 176 x(to)S 175 x(support)S 174 x(applica)S 2 x(tions)S +175 x(that)S 175 x(simply)S 175 x(render)S 174 x(images)S 174 x(for)S +174 x(display)S 176 x(purposes,)S 175 x(as)S 174 x(well)S 547 y +4796 X(as)S 173 x(those)S 175 x(that)S 175 x(provide)S 174 x(for)S +174 x(high)S 174 x(visuall)S 2 x(y)S 173 x(inte)S 2 x(ractive,)S +176 x(human)S 174 x(directed,)S 177 x(image)S 174 x(enhancement)S +175 x(processing.)S 264 x(XIEP)S 548 y 4796 X(should)S 182 x +(support)S 183 x(rendering)S 183 x(and)S 182 x(processing)S 183 x +(for)S 182 x(applic)S 2 x(ations)S 183 x(that)S 183 x(deal)S 183 x +(with)S 183 x(stati)S 2 x(c)S 182 x(and)S 183 x(time)S 182 x +(varying)S 183 x(bit)S 2 x(onal)S 548 y 4796 X(monochrome,)S 171 x +(continu)S 2 x(ous)S 171 x(tone)S 172 x(monochrome)S 170 x(\(gray)S +172 x(scale\),)S 172 x(and)S 172 x(continuous)S 172 x(tone)S 172 x +(multi-spect)S 2 x(ral)S 172 x(\(color\))S 171 x(digit)S 2 x(al)S +548 y 4796 X(images.)S 897 y 4796 X(XIEP)S 176 x(should)S 178 x +(allow)S 178 x(X)S 176 x(appli)S 2 x(cation)S 178 x(client)S 2 x(s)S +177 x(to)S 177 x(perform)S 177 x(image)S 177 x(renditi)S 2 x(on)S +177 x(themselves)S 177 x(\(prepare)S 178 x(images)S 177 x(in)S 177 x +(\211nal)S 548 y 4796 X(form)S 179 x(for)S 181 x(display\),)S 184 x +(and)S 181 x(request)S 181 x(X)S 180 x(servers)S 180 x(to)S 181 x +(display)S 181 x(them,)S 184 x(as)S 181 x(is.)S 277 x(This)S 181 x +(is)S 181 x(essentiall)S 2 x(y)S 180 x(the)S 182 x(current)S 181 x +(situati)S 2 x(on)S 548 y 4796 X(under)S 172 x(X1)S -19 x(1.)S 261 x +(In)S 172 x(additi)S 2 x(on,)S 173 x(XIEP)S 172 x(should)S 173 x +(allow)S 173 x(applicat)S 2 x(ion)S 172 x(clie)S 2 x(nts)S 172 x(to)S +173 x(defer)S 172 x(renditi)S 2 x(on)S 172 x(to)S 172 x(the)S 173 x +(X)S 172 x(server)S 172 x(implying)S 548 y 4796 X(that)S 167 x(the)S +166 x(image)S 167 x(extension)S 167 x(package)S 167 x(server)S 166 x +(will)S 167 x(handle)S 167 x(all)S 168 x(device)S 167 x(speci\211cs)S +166 x(of)S 166 x(image)S 167 x(rendition.)S 12568 Y 3600 X F28 +(1.4.3)S 599 x(Display)S 167 x(System)S 2 x(s)S 13664 Y 4796 X F78 +(Display)S 169 x(system)S 168 x(archite)S 2 x(ctures)S 169 x(range)S +169 x(from)S 168 x(simple)S 169 x(terminals)S 170 x(connected)S 170 x +(through)S 169 x(serial)S 169 x(line)S 2 x(s)S 168 x(to)S 169 x +(host)S 169 x(processors,)S 548 y 4796 X(through)S 187 x(the)S 187 x +(modern)S 187 x(day)S 187 x(workstation)S 188 x(with)S 187 x(tight)S +2 x(ly)S 187 x(coupled)S 188 x(processor)S 186 x(and)S 187 x +(display)S 188 x(subsystem,)S 191 x(to)S 188 x(highly)S 548 y 4796 X +(specialize)S 2 x(d)S 178 x(interact)S 2 x(ive)S 179 x(graphics)S +178 x(and)S 179 x(image)S 178 x(processing)S 179 x(workstations.)S +274 x(XIEP)S 177 x(should)S 179 x(provide)S 179 x(the)S 179 x(means)S +178 x(for)S 548 y 4796 X(using)S 166 x(speciali)S 2 x(zed)S 166 x +(display)S 167 x(subsystem)S 166 x(archite)S 2 x(ctures)S 166 x(and)S +166 x(image)S 167 x(renditio)S 2 x(n)S 166 x(and)S 166 x(processing)S +167 x(hardware.)S 16802 Y 3600 X F28(1.4.4)S 599 x(Extensib)S 2 x +(ility)S 17898 Y 4796 X F78(While)S 174 x(it)S 175 x(is)S 173 x(a)S +174 x(goal)S 174 x(of)S 173 x(the)S 174 x(X)S 173 x(image)S 174 x +(extension)S 175 x(package)S 174 x(to)S 174 x(itself)S 175 x(be)S +173 x(extensibl)S 2 x(e,)S 175 x(unlike)S 174 x(the)S 175 x(core)S +173 x(X1)S -19 x(1)S 174 x(protocol,)S 548 y 4796 X(the)S 172 x +(package)S 174 x(extensibil)S 2 x(ity)S 173 x(will)S 173 x(not)S +173 x(be)S 173 x(achieved)S 173 x(via)S 173 x(extensibi)S 2 x(lity)S +174 x(of)S 172 x(the)S 173 x(X)S 172 x(image)S 172 x(extensi)S 2 x +(on)S 172 x(protocol)S 173 x(\(XIEP\).)S 548 y 4796 X(Instead,)S +190 x(it)S 187 x(will)S 187 x(be)S 186 x(goal)S 186 x(of)S 186 x +(the)S 186 x(X)S 186 x(image)S 186 x(extension)S 187 x(toolkit)S +188 x(\(XIE_TK\))S 185 x(to)S 186 x(provide)S 187 x(for)S 185 x +(extensi)S 2 x(blity)S -31 x(.)S 288 x(Thus,)S 548 y 4796 X(demands)S +160 x(for)S 160 x(addit)S 2 x(ional)S 162 x(high)S 161 x(level)S +162 x(services)S 161 x(will)S 162 x(be)S 161 x(met)S 160 x(over)S +161 x(time)S 162 x(via)S 161 x(additi)S 2 x(on)S 160 x(of)S 161 x +(services)S 161 x(at)S 161 x(the)S 162 x(tool)S 162 x(kit)S 161 x +(level)S 548 y 4796 X(versus)S 167 x(additio)S 2 x(nal)S 168 x(of)S +167 x(new)S 168 x(protocol)S 168 x(functi)S 2 x(ons.)S 251 x(The)S +168 x(evidence)S 169 x(suggests)S 168 x(\(in)S 168 x(particula)S +2 x(r)S -21 x(,)S 168 x(the)S 168 x(wide)S 168 x(range)S 168 x(of)S +167 x(exiti)S 2 x(ng)S 548 y 4796 X(popular)S 175 x(enhancement)S +175 x(functions,)S 177 x(and)S 175 x(the)S 175 x(continuin)S 2 x(g)S +174 x(development)S 176 x(ef)S -9 x(forts)S 174 x(in)S 175 x(this)S +175 x(area\))S 174 x(that)S 176 x(with)S 175 x(the)S 175 x(correct)S +548 y 4796 X(choice)S 167 x(of)S 166 x(low)S 166 x(level)S 167 x +(server)S 166 x(functions,)S 167 x(this)S 167 x(strategy)S 167 x +(can)S 166 x(be)S 166 x(made)S 166 x(to)S 167 x(work.)S 35879 Y +22280 X F40(INTRO)S -2 x(DUCTION)S 447 x(1\2033)S +1 PP +EP +%%Page 1 12 +1000 BP 39600 30600 PM 0 0 XY +9007 Y 3600 X F24(Chapter)S 498 x(2)S 10651 Y 3600 X(IMAGIN)S -2 x +(G)S 166 x(CON)S -2 x(CEPTS)S 13357 Y 4796 X F78(This)S 170 x +(chapter)S 170 x(presents)S 170 x(background)S 170 x(material)S 170 x +(regarding)S 170 x(the)S 170 x(de\211nit)S 2 x(ion)S 170 x(and)S +169 x(sources)S 169 x(of)S 170 x(digital)S 171 x(images,)S 170 x +(how)S 169 x(they)S 548 y 4796 X(move)S 175 x(through)S 175 x(appli)S +2 x(cations,)S 178 x(and)S 175 x(the)S 176 x(states)S 176 x(they)S +176 x(pass)S 175 x(through)S 176 x(in)S 176 x(transit.)S 268 x(This)S +176 x(material)S 177 x(constitut)S 2 x(es)S 175 x(a)S 175 x(simple)S +548 y 4796 X(model)S 166 x(of)S 166 x(digita)S 2 x(l)S 166 x +(imaging)S 167 x(which)S 166 x(is)S 167 x(useful)S 166 x(in)S 167 x +(presenting)S 167 x(the)S 167 x(extension)S 167 x(concepts.)S 16097 Y +3600 X F28(2.1)S 599 x(T)S -33 x(ransfer)S 166 x(Model)S 17342 Y +4796 X F78(The)S 185 x(overall)S 186 x(operati)S 2 x(onal)S 185 x +(model)S 186 x(for)S 184 x(many)S 185 x(image)S 185 x(appli)S 2 x +(cations)S 186 x(is)S 185 x(that)S 186 x(of)S 185 x(a)S 185 x +(transfer)S 185 x(process.)S 286 x(The)S 186 x(transfer)S 548 y +4796 X(process)S 173 x(begins)S 174 x(when)S 174 x(either)S 175 x(a)S +173 x(real)S 175 x(world)S 174 x(continuous)S 174 x(image)S 175 x +(is)S 173 x(captured)S 175 x(and)S 174 x(converted)S 175 x(into)S +174 x(a)S 174 x(digit)S 2 x(al)S 174 x(image,)S 548 y 4796 X(or)S +177 x(a)S 177 x(digita)S 2 x(l)S 177 x(image)S 178 x(is)S 177 x +(synthesized)S 178 x(by)S 178 x(some)S 176 x(other)S 178 x(applic)S +2 x(ation.)S 272 x(The)S 177 x(digit)S 2 x(al)S 178 x(image)S 177 x +(is)S 177 x(represented)S 178 x(and)S 178 x(stored)S 548 y 4796 X +(internall)S 2 x(y)S -33 x(,)S 187 x(and)S 183 x(processed)S 183 x +(by)S 183 x(the)S 183 x(appli)S 2 x(cation)S 184 x(\(sometimes)S +183 x(iterati)S 2 x(vely\).)S 282 x(Final)S 2 x(ly)S -32 x(,)S 186 x +(the)S 184 x(digita)S 2 x(l)S 183 x(image)S 183 x(is)S 183 x(made)S +548 y 4796 X(suitable)S 166 x(for)S 164 x(display)S 166 x +(\(rendering\))S 165 x(and)S 165 x(displayed)S 166 x(upon)S 165 x(a)S +164 x(computer)S 166 x(device.)S 249 x(Often,)S 165 x(the)S 165 x +(processing,)S 165 x(renditi)S 2 x(on,)S 164 x(and)S 548 y 4796 X +(display)S 167 x(steps)S 166 x(are)S 166 x(iterat)S 2 x(ed.)S 896 y +4796 X(T)S -35 x(wo)S 183 x(threads)S 185 x(which)S 184 x(run)S 184 x +(through)S 184 x(the)S 185 x(entire)S 184 x(process)S 184 x(are)S +184 x(ef)S -9 x(\211ciency)S 185 x(of)S 184 x(representation)S 185 x +(and)S 184 x(processing,)S 188 x(and)S 548 y 4796 X(\211delity)S +157 x(of)S 155 x(reproduction.)S 250 x(In)S 155 x(general,)S 158 x +(we)S 156 x(would)S 155 x(like)S 157 x(to)S 156 x(maximize)S 156 x +(\211delit)S 2 x(y)S 155 x(\(trueness)S 156 x(to)S 156 x(the)S 156 x +(original)S 157 x(as)S 155 x(perceive)S 2 x(d)S 548 y 4796 X(by)S +162 x(humans)S 162 x(-)S 162 x(ie.)S 249 x(psychologica)S 2 x(l)S +162 x(vs)S 162 x(mathematic)S 2 x(al\))S 162 x(and)S 163 x(ef)S -9 x +(\211ciency)S 163 x(of)S 162 x(representati)S 2 x(on)S 162 x +(\(minimize)S 163 x(the)S 163 x(data)S 163 x(storage\))S 548 y 4796 X +(at)S 166 x(the)S 167 x(same)S 166 x(time.)S 35879 Y 21092 X F40 +(IMAGING)S 165 x(CONC)S -2 x(EPTS)S 449 x(2\2031)S +1 PP +EP +%%Page 2 13 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 4796 X F36(Figure)S 167 x(2\2031:)S 498 x(IMAGE)S 166 x +(TRANSFER)S 165 x(PROCESS)S 548 y 4796 X 22116 24 R +XP /F102 /Courier-DOCPSE 398.506 10 DNF RP +8382 6359 XY F102(FLOW)S 16512 X(CONCEPT)S 748 y 7665 X(real)S 239 x +(world)S 448 y 7187 X(object)S 239 x(or)S 240 x(scene)S 448 y 8860 X +(|)S 449 y -239 x(|)S 239 x(IMAGE)S 240 x(FORMATION)S 448 y 8860 X +(v)S 448 y 7665 X(continuous)S 15077 X(Human)S 240 x(Visual)S 239 x +(Perception)S 448 y 8382 X(image)S 16033 X("Visual)S 240 x(Types")S +449 y 8860 X(|)S 448 y -239 x(|)S 239 x(SENSING/DI)S 2 x(GITIZATION)S +448 y 8860 X(|)S 19859 X(analog)S 479 x(image)S 449 y 4796 X +(.................|..)S 2 x(...................)S 2 x +(...................)S 2 x(....................)S 2 x(..)S 448 y +8860 X(|)S 19859 X(digital)S 240 x(image)S 448 y 5035 X(SYNTHESIS)S +8143 X(CAPTURE)S 449 y 5991 X(|)S 8860 X(|)S 448 y 5991 X(|)S 8860 X +(|)S 448 y 5991 X(+-----+-----+)S 449 y 7426 X(|)S 448 y -239 x(|)S +15077 X(Revisable)S 240 x(Form)S 240 x(Image)S 448 y 7426 X(v)S +15077 X(Efficiency)S 240 x(vs)S 239 x(Fidelity)S 449 y 5752 X +(+-->digital)S 15077 X(Compression)S 240 x(Encoding)S 448 y 5752 X +(|)S 6947 X(image)S 15077 X(Digital)S 240 x(Image)S 239 x(Classes)S +448 y 5752 X(|)S 7426 X(|)S 449 y 5752 X(|)S 7426 X(|)S 448 y 5752 X +(|)S 7426 X(|)S 239 x(ENHANCEMENT)S 15077 X(Visually)S 240 x +(Interactive)S 240 x(Processing)S 448 y 5752 X(|)S 7426 X(|)S 449 y +5752 X(+<-----+)S 448 y 5752 X(^)S 7426 X(|)S 448 y 5752 X(|)S 7426 X +(|)S 239 x(RENDITION)S 15077 X(Rendition)S 240 x(Processing)S 448 y +5752 X(|)S 7426 X(|)S 449 y 5752 X(+------+)S 448 y -238 x(|)S 448 y +-239 x(v)S 449 y 6708 X(digital)S 15077 X(Final)S 240 x(Form)S 239 x +(Image)S 448 y 6947 X(image)S 15077 X(Rendition)S 240 x(Fidelity)S +448 y 7426 X(|)S 19859 X(digital)S 240 x(image)S 449 y 4796 X +(...........|........)S 2 x(...................)S 2 x +(...................)S 2 x(....................)S 2 x(..)S 448 y +7426 X(|)S 19859 X(analog)S 479 x(image)S 448 y 7426 X(|)S 239 x +(DISPLAY)S 449 y 7426 X(|)S 448 y -239 x(v)S 15077 X(Human)S 240 x +(Visual)S 239 x(Perception)S 448 y 5991 X(screen)S 240 x(image)S +16033 X("Visual)S 240 x(Types")S 26011 Y 4796 X 22116 24 R 896 y +4796 X F78(Continuous)S 191 x(images)S 191 x(derive)S 191 x(from)S +189 x(real)S 191 x(world)S 191 x(objects)S 191 x(and)S 191 x +(scenes,)S 195 x(and)S 191 x(form)S 190 x(the)S 191 x(basis)S 190 x +(for)S 190 x(human)S 190 x(visual)S 548 y 4796 X(perception)S 190 x +(of)S 188 x(the)S 189 x(world)S 189 x(around)S 189 x(us.)S 293 x +(Digital)S 190 x(images)S 189 x(derive)S 189 x(eithe)S 2 x(r)S 188 x +(from)S 188 x(continuous)S 190 x(images)S 188 x(\(capture)S 190 x +(or)S 548 y 4796 X(digiti)S 2 x(zation\))S 170 x(or)S 169 x(from)S +168 x(two-dimensional)S 171 x(digital)S 171 x(data)S 170 x +(generation)S 170 x(processes)S 169 x(\(synthesis\).)S 255 x(The)S +170 x(X)S 168 x(image)S 170 x(extension)S 548 y 4796 X(is)S 166 x +(concerned)S 167 x(only)S 166 x(with)S 167 x(digit)S 2 x(al)S 166 x +(images)S 167 x(and)S 166 x(does)S 166 x(not)S 167 x(care)S 166 x +(about)S 167 x(their)S 167 x(derivati)S 2 x(on.)S 897 y 4796 X(Once)S +178 x(in)S 179 x(digital)S 180 x(format,)S 181 x(an)S 179 x +(applicat)S 2 x(ion)S 178 x(may)S 179 x(revise)S 178 x(an)S 179 x +(image)S 179 x(iterati)S 2 x(vely)S 179 x(through)S 179 x(editing)S +180 x(and)S 178 x(enhancement)S 548 y 4796 X(processes.)S 250 x +(Just)S 168 x(prior)S 167 x(to)S 168 x(display)S -31 x(,the)S 167 x +(digi)S 2 x(tal)S 168 x(image)S 168 x(must)S 167 x(be)S 167 x +(converted)S 169 x(into)S 168 x(a)S 167 x(format)S 168 x(understood)S +168 x(by)S 167 x(the)S 168 x(display)S 548 y 4796 X(device)S 173 x +(\(renditi)S 2 x(on)S 172 x(process\).)S 261 x(It)S 173 x(is)S 173 x +(then)S 173 x(displayed)S 174 x(where)S 172 x(it)S 174 x(is)S 172 x +(converte)S 2 x(d)S 172 x(back)S 173 x(to)S 173 x(analog)S 173 x +(format)S 173 x(and)S 173 x(perceived)S 548 y 4796 X(by)S 166 x(the)S +166 x(viewer)S -27 x(.)S 35879 Y 3600 X F40(2\2032)S 449 x(IMAGING)S +165 x(CONCEPTS)S +1 PP +EP +%%Page 3 14 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(2.2)S 599 x(V)S -11 x(isual)S 167 x(Perception)S +6838 Y 4796 X F78(An)S 171 x(image)S 171 x(of)S 172 x(a)S 171 x +(three-dimensiona)S 2 x(l)S 171 x(real)S 172 x(world)S 172 x(object)S +173 x(or)S 171 x(scene)S 172 x(is)S 171 x(a)S 172 x(continuous)S +172 x(\(in)S 172 x(its)S 172 x(spatial)S 173 x(dimensions,)S 173 x +(and)S 548 y 4796 X(in)S 178 x(the)S 179 x(dependence)S 179 x(of)S +177 x(its)S 179 x(intensi)S 2 x(ty)S 178 x(upon)S 178 x(wavelength)S +179 x(and)S 179 x(time\),)S 181 x(two-dimensional)S 179 x(projecti)S +2 x(on)S 178 x(formed)S 177 x(by)S 178 x(an)S 548 y 4796 X(imaging)S +166 x(element)S 2 x(.)S 896 y 4796 X(The)S 184 x(human)S 184 x +(visual)S 184 x(system)S 184 x(is)S 184 x(a)S 184 x(combination)S +185 x(of)S 184 x(imaging)S 184 x(element)S 185 x(\(lens\),)S 188 x +(focal)S 185 x(plane)S 184 x(sensor)S 184 x(\(retina\),)S 189 x(and)S +548 y 4796 X(interpretat)S 2 x(ion)S 177 x(machinery)S 177 x +(\(brain\).)S 270 x(Based)S 177 x(upon)S 177 x(perceived)S 178 x +(attri)S 2 x(butes)S 177 x(of)S 176 x(a)S 177 x(continuo)S 2 x(us)S +176 x(image)S 177 x(\(dependency)S 178 x(of)S 548 y 4796 X(intensit)S +2 x(y)S 178 x(upon)S 179 x(wavelengt)S 2 x(h)S 178 x(and)S 179 x +(time\),)S 182 x(we)S 179 x(often)S 179 x(assign)S 179 x(it)S 180 x +(to)S 179 x(one)S 179 x(of)S 179 x(a)S 178 x(number)S 179 x(of)S +178 x(disti)S 2 x(nct)S 179 x(groups)S 179 x(or)S 178 x(visual)S +548 y 4796 X(types)S 170 x(includi)S 2 x(ng)S 170 x(black)S 170 x +(and)S 171 x(white,)S 171 x(grey)S 170 x(scale,)S 171 x(color)S -20 x +(,)S 171 x(stills,)S 171 x(and)S 171 x(motion.)S 256 x(These)S 171 x +(phrases)S 170 x(are)S 170 x(simply)S 170 x(convenient)S 548 y 4796 X +(labels)S 167 x(for)S 166 x(complex)S 166 x(visual)S 167 x(percepti)S +2 x(on)S 166 x(phenomena.)S 897 y 4796 X(It)S 179 x(is)S 180 x(not)S +180 x(unusual)S 180 x(to)S 180 x(associate)S 181 x(the)S 180 x +(visual)S 180 x(types)S 180 x(\(which)S 180 x(are)S 180 x(based)S +180 x(upon)S 179 x(human)S 180 x(perception)S 181 x(of)S 179 x(a)S +180 x(continuous)S 548 y 4796 X(image\))S 168 x(with)S 168 x(the)S +168 x(digit)S 2 x(al)S 168 x(representat)S 2 x(ion)S 168 x(of)S 167 x +(the)S 169 x(continuous)S 169 x(image.)S 252 x(In)S 168 x(fact,)S +168 x(there)S 169 x(is)S 168 x(an)S 168 x(optimum)S 168 x(\(ef)S +-10 x(\211ciency)S 169 x(and)S 548 y 4796 X(\211delity\))S 167 x +(digit)S 2 x(al)S 166 x(image)S 167 x(representati)S 2 x(on,)S 165 x +(known)S 166 x(as)S 166 x(a)S 166 x(digi)S 2 x(tal)S 167 x(image)S +166 x(class,)S 166 x(for)S 166 x(each)S 167 x(visual)S 167 x(type.)S +14659 Y 3600 X F28(2.3)S 599 x(Image)S 167 x(Capture)S 15904 Y 4796 X +F78(Image)S 166 x(capture)S 168 x(or)S 167 x(digiti)S 2 x(zation)S +168 x(is)S 167 x(the)S 168 x(process)S 167 x(by)S 167 x(which)S 167 x +(a)S 167 x(continuo)S 2 x(us)S 166 x(image)S 168 x(is)S 167 x +(converted)S 168 x(into)S 168 x(a)S 167 x(discrete)S 168 x(image)S +548 y 4796 X(manageable)S 183 x(by)S 183 x(a)S 183 x(computer)S -26 x +(.)S 282 x(A)S 182 x(conti)S 2 x(nuous)S 182 x(image)S 184 x(is)S +183 x(an)S 183 x(intensi)S 2 x(ty)S 183 x(or)S 183 x(amplitude)S +184 x(function)S 184 x(I\(x,y)S -33 x(,w)S -33 x(,t\))S 183 x(which)S +548 y 4796 X(is)S 184 x(de\211ned)S 185 x(on)S 185 x(a)S 185 x(two)S +185 x(dimensional)S 186 x(plane)S 185 x(at)S 185 x(an)S 185 x +(in\211nit)S 2 x(e)S 185 x(number)S 184 x(of)S 184 x(locat)S 2 x +(ions)S 185 x(\(x)S 184 x(and)S 185 x(y)S 185 x(are)S 185 x +(continuous)S 186 x(real)S 548 y 4796 X(variables\),)S 175 x(which)S +174 x(is)S 174 x(de\211ned)S 174 x(at)S 174 x(an)S 173 x(in\211nit)S +2 x(e)S 174 x(number)S 173 x(of)S 173 x(wavelengths)S 175 x(\(w)S +172 x(is)S 174 x(a)S 174 x(continuous)S 174 x(real)S 174 x(variabl)S +2 x(e\),)S 175 x(which)S 548 y 4796 X(is)S 169 x(de\211ned)S 169 x +(at)S 170 x(an)S 170 x(in\211nite)S 170 x(number)S 169 x(of)S 169 x +(times)S 170 x(\(t)S 169 x(is)S 170 x(a)S 169 x(continuous)S 170 x +(real)S 170 x(variable)S 2 x(\),)S 169 x(and)S 169 x(which)S 170 x +(may)S 169 x(posess)S 168 x(an)S 170 x(in\211nite)S 548 y 4796 X +(number)S 165 x(of)S 166 x(values)S 167 x(\(I)S 166 x(is)S 166 x(a)S +166 x(conti)S 2 x(nuous)S 166 x(real)S 166 x(variabl)S 2 x(e\).)S +896 y 4796 X(Converting)S 186 x(to)S 186 x(a)S 185 x(discrete)S 186 x +(representati)S 2 x(on)S 185 x(means)S 184 x(that)S 187 x(I,)S 184 x +(x,)S 189 x(y)S -32 x(,)S 189 x(w)S -33 x(,)S 190 x(and)S 185 x(t)S +185 x(become)S 185 x(inte)S 2 x(gers)S 184 x(with)S 186 x(\211nite)S +186 x(range.)S 548 y 4796 X(Thus,)S 180 x(discret)S 2 x(e)S 178 x +(means)S 178 x(that)S 179 x(the)S 179 x(continuous)S 179 x(image)S +179 x(is)S 178 x(sampled)S 179 x(at)S 179 x(a)S 178 x(\211xed)S 178 x +(number)S 178 x(of)S 178 x(locat)S 2 x(ions)S 178 x(\(vertices)S +179 x(of)S 178 x(a)S 548 y 4796 X(regular)S -20 x(,)S 179 x +(two-dimensional)S 177 x(sampling)S 177 x(grid\),)S 179 x(and)S 176 x +(that)S 177 x(the)S 177 x(intensi)S 2 x(ty)S 176 x(is)S 177 x +(sampled)S 176 x(at)S 177 x(these)S 177 x(points)S 177 x(at)S 177 x +(a)S 176 x(number)S 176 x(of)S 548 y 4796 X(wavelengths)S 167 x(or)S +166 x(wavelength)S 167 x(bands)S 166 x(and)S 167 x(times,)S 166 x +(and)S 166 x(quantize)S 2 x(d)S 166 x(to)S 166 x(a)S 166 x(\211xed)S +167 x(number)S 166 x(of)S 166 x(levels.)S 897 y 4796 X(T)S -35 x +(ypicall)S 2 x(y)S -32 x(,)S 188 x(for)S 184 x(static)S 185 x +(images)S 185 x(\(no)S 184 x(dependence)S 185 x(upon)S 185 x +(time\),)S 188 x(the)S 185 x(process)S 184 x(of)S 184 x(conversion)S +185 x(from)S 184 x(continuous)S 185 x(to)S 548 y 4796 X(discrete)S +167 x(involves)S 167 x(only)S 167 x(sampling)S 166 x(and)S 167 x +(quantizat)S 2 x(ion.)S 24272 Y 3600 X F28(2.4)S 599 x(Image)S 167 x +(Synthesi)S 2 x(s)S 25518 Y 4796 X F78(In)S 168 x(practice,)S 169 x +(digit)S 2 x(al)S 169 x(images)S 168 x(are)S 168 x(often)S 169 x +(generated)S 170 x(by)S 168 x(means)S 168 x(other)S 168 x(than)S +169 x(sampling)S 169 x(at)S 169 x(the)S 169 x(focal)S 169 x(planes)S +169 x(of)S 168 x(imaging)S 548 y 4796 X(elements.)S 249 x +(Synthesized)S 163 x(images)S 162 x(are)S 162 x(ones)S 162 x(where)S +162 x(the)S 162 x(discrete)S 163 x(image)S 163 x(data)S 162 x(at)S +163 x(the)S 162 x(discrete)S 163 x(sampling)S 163 x(grid)S 162 x +(locati)S 2 x(ons)S 548 y 4796 X(is)S 186 x(computed)S 186 x(from)S +186 x(physical)S 187 x(sensory)S 186 x(information)S 187 x(or)S 186 x +(object)S 188 x(models.)S 289 x(Examples)S 186 x(includ)S 2 x(e)S +186 x(medical)S 187 x(Nuclear)S 548 y 4796 X(Magnetic)S 183 x +(Resonance)S 183 x(images,)S 186 x(Geosesmic)S 182 x(images,)S 186 x +(and)S 182 x(synthesized)S 183 x(graphic)S 183 x(images.)S 281 x(In)S +182 x(the)S 183 x(last)S 183 x(case,)S 186 x(the)S 548 y 4796 X +(digital)S 172 x(image)S 170 x(derives)S 171 x(from)S 169 x +(computer)S 170 x(models)S 170 x(of)S 170 x(objects)S 171 x(and)S +170 x(scenes)S 170 x(which)S 171 x(may)S 170 x(not)S 170 x(exist)S +171 x(in)S 170 x(reali)S 2 x(ty)S -32 x(.)S 256 x(As)S 169 x(with)S +548 y 4796 X(captured)S 167 x(images,)S 165 x(synthesize)S 2 x(d)S +166 x(images)S 166 x(are)S 166 x(often)S 167 x(intended)S 167 x(for)S +166 x(consumption)S 167 x(by)S 166 x(a)S 167 x(human)S 165 x(viewer)S +-27 x(.)S 35879 Y 21092 X F40(IMAGING)S 165 x(CONC)S -2 x(EPTS)S +449 x(2\2033)S +1 PP +EP +%%Page 4 15 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(2.5)S 599 x(Mathemati)S 2 x(cal)S 166 x(Model)S +6838 Y 4796 X F78(An)S 165 x(F)S 166 x(valued)S 167 x(image)S 167 x +('a')S 166 x(on)S 166 x(X)S 166 x(is)S 166 x(the)S 167 x(graph)S +166 x(of)S 166 x(a)S 166 x(function)S 167 x(a:X->F)S 7984 Y 5991 X +F102(a)S 239 x(=)S 239 x({)S 240 x(\(x,a\(x\)\))S 240 x(:)S 239 x(x)S +239 x(E)S 239 x(X,)S 240 x(a\(x\))S 239 x(E)S 239 x(F})S 9030 Y +5991 X(where:)S 747 y 6230 X(X)S 239 x(is)S 240 x(a)S 239 x(\(multi)S +240 x(dimensional\))S 240 x(coordinate)S 240 x(set)S 448 y 6230 X(x)S +239 x(is)S 240 x(an)S 239 x(element)S 240 x(of)S 239 x(the)S 240 x +(set)S 239 x(X)S 448 y 6230 X(F)S 239 x(is)S 240 x(a)S 239 x(value)S +239 x(set)S 240 x(whose)S 240 x(values)S 239 x(maybe)S 449 y 6469 X +(R)S 239 x(\(real\))S 448 y 6469 X(Z)S 239 x(\(integer\))S 448 y +6469 X(Z*2k)S 240 x(\(binary)S 240 x(integral\))S 449 y 6469 X(C)S +239 x(\(complex\))S 896 y 4796 X F78(Under)S 162 x(this)S 163 x +(de\211niti)S 2 x(on,)S 163 x(while)S 163 x(the)S 163 x(sampling)S +164 x(grid)S 163 x(is)S 162 x(discrete)S 164 x(and)S 163 x +(\211nite,)S 164 x(the)S 163 x(values)S 163 x(of)S 163 x(the)S 163 x +(image)S 163 x(may)S 162 x(be)S 163 x(integ)S 2 x(ral,)S 548 y 4796 X +(real,)S 172 x(or)S 171 x(complex.)S 259 x(W)S -40 x(e)S 172 x(will)S +172 x(see)S 171 x(that)S 172 x(as)S 171 x(image)S 171 x(processing)S +172 x(often)S 172 x(produces)S 171 x(results)S 171 x(which)S 172 x +(are)S 171 x(non)S 171 x(inte)S 2 x(gral,)S 172 x(it)S 172 x(is)S +548 y 4796 X(necessary)S 166 x(to)S 166 x(recognize)S 168 x(non)S +166 x(integral)S 168 x(valued)S 167 x(images.)S 897 y 4796 X(The)S +173 x(debate)S 174 x(over)S 173 x(the)S 174 x(de\211niti)S 2 x(on)S +173 x(of)S 173 x(a)S 173 x(digita)S 2 x(l)S 173 x(image)S 173 x +(regarding)S 174 x(is)S 173 x(potent)S 2 x(ial)S 174 x(values)S 174 x +(\(integral)S 174 x(vs)S 173 x(non)S 173 x(integra)S 2 x(l\))S 173 x +(is)S 548 y 4796 X(more)S 173 x(one)S 174 x(of)S 173 x(phil)S 2 x +(osophy)S 173 x(than)S 175 x(anything)S 175 x(else.)S 264 x(It)S +174 x(is)S 174 x(clear)S 175 x(that)S 175 x(there)S 174 x(are)S 174 x +(some)S 173 x(locat)S 2 x(ions)S 174 x(in)S 174 x(the)S 174 x +(transfer)S 174 x(model)S 548 y 4796 X(where)S 181 x(the)S 183 x +(point)S 183 x(is)S 183 x(not)S 182 x(moot.)S 281 x(In)S 182 x +(particul)S 2 x(ar)S -20 x(,)S 186 x(display)S 183 x(devices)S 183 x +(in)S 182 x(general)S 183 x(require)S 183 x(discrete)S 183 x +(\(integral)S 2 x(\))S 182 x(valued)S 548 y 4796 X(images)S 166 x +(for)S 166 x(display)S 167 x(purposes.)S 896 y 4796 X(W)S -40 x(e)S +187 x(will)S 188 x(adopt)S 187 x(a)S 187 x(pragmatic)S 188 x +(approach)S 188 x(which)S 187 x(avoids)S 187 x(the)S 188 x +(philosophic)S 2 x(al)S 187 x(question)S 188 x(which)S 187 x +(requires)S 187 x(discrete)S 548 y 4796 X(\(integral\))S 170 x +(images)S 168 x(in)S 170 x(client)S 170 x(server)S 168 x +(communicati)S 2 x(ons)S 168 x(and)S 169 x(server)S 169 x +(presentation)S 170 x(to)S 169 x(display)S 170 x(devices,)S 169 x +(but)S 170 x(allows)S 169 x(for)S 548 y 4796 X(non)S 166 x(integral)S +168 x(representations)S 167 x(in)S 167 x(the)S 167 x(server)S 166 x +(during)S 166 x(image)S 167 x(processing.)S 20636 Y 3600 X F28(2.6)S +599 x(Image)S 167 x(Representa)S 2 x(tion)S 21881 Y 4796 X F78 +(Whether)S 187 x(captured)S 187 x(or)S 185 x(synthesize)S 2 x(d,)S +190 x(a)S 186 x(primary)S 186 x(goal)S 187 x(is)S 186 x(to)S 187 x +(represent)S 186 x(what)S 187 x(was)S 185 x(\(or)S 186 x(will)S 187 x +(become)S 186 x(at)S 187 x(display)S 548 y 4796 X(time\))S 178 x(a)S +178 x(continuous)S 179 x(image)S 178 x(in)S 178 x(discrete)S 179 x +(form)S 177 x(with)S 178 x(the)S 179 x(fewest)S 178 x(bits)S 178 x +(possible)S 179 x(\(ef)S -9 x(\211ciency\),)S 181 x(while)S 178 x +(being)S 179 x(able)S 178 x(to)S 548 y 4796 X(recreate)S 159 x(as)S +159 x(similar)S 160 x(an)S 159 x(image)S 159 x(as)S 159 x(possible)S +160 x(for)S 158 x(human)S 159 x(viewing)S 160 x(\(\211delity\).)S +250 x(These)S 159 x(goals)S 159 x(result)S 160 x(in)S 159 x(classes)S +160 x(of)S 158 x(digit)S 2 x(al)S 548 y 4796 X(representation)S 167 x +(opti)S 2 x(mized)S 166 x(for)S 166 x(and)S 166 x(analogous)S 167 x +(to)S 167 x(the)S 166 x(various)S 167 x(visual)S 167 x(types.)S 897 y +4796 X(The)S 180 x(digital)S 182 x(image)S 180 x(representation)S +181 x(must)S 180 x(store)S 180 x(information)S 180 x(regarding)S +181 x(both)S 180 x(the)S 180 x(luminance)S 181 x(and)S 180 x +(chrominance)S 548 y 4796 X(characteristi)S 2 x(cs)S 165 x(of)S 165 x +(the)S 166 x(original)S 167 x(image.)S 249 x(W)S -40 x(e)S 166 x +(will)S 166 x(consider)S 166 x(static)S 167 x(images)S 165 x(only)S +-31 x(,)S 164 x(or)S 166 x(equivalent)S 2 x(ly)S -32 x(,)S 165 x +(time)S 166 x(variati)S 2 x(ons)S 165 x(as)S 548 y 4796 X +(representable)S 167 x(as)S 166 x(sequences)S 167 x(of)S 165 x(indi)S +2 x(vidual)S 167 x(static)S 168 x(images.)S 896 y 4796 X(Luminance)S +180 x(is)S 179 x(often)S 180 x(referred)S 180 x(to)S 180 x(as)S 179 x +(intensit)S 2 x(y)S 179 x(or)S 179 x(tonal)S 2 x(ity)S -32 x(.)S +275 x(In)S 180 x(a)S 179 x(digit)S 2 x(al)S 180 x(representation)S +2 x(,)S 182 x(the)S 180 x(number)S 179 x(of)S 179 x(bits)S 180 x(is)S +548 y 4796 X(\211nite,)S 168 x(and)S 167 x(so)S 167 x(the)S 168 x +(intensi)S 2 x(ty)S 167 x(or)S 167 x(tone)S 168 x(scale)S 168 x(has)S +167 x(a)S 168 x(limited)S 169 x(number)S 167 x(of)S 167 x(levels.)S +252 x(A)S 166 x(digi)S 2 x(tal)S 168 x(image)S 167 x(which)S 168 x +(provides)S 168 x(for)S 548 y 4796 X(only)S 176 x(two)S 176 x +(intensit)S 2 x(y)S 176 x(levels)S 177 x(\(and)S 176 x(has)S 175 x +(no)S 176 x(chrominance)S 177 x(information\))S 177 x(is)S 176 x +(often)S 176 x(referred)S 176 x(to)S 176 x(as)S 176 x(bitonal)S 2 x +(,)S 178 x(while)S 176 x(one)S 548 y 4796 X(with)S 166 x(several)S +167 x(intensit)S 2 x(y)S 166 x(levels)S 167 x(as)S 166 x(contin)S +2 x(uous)S 166 x(tone.)S 897 y 4796 X(Chrominance)S 183 x +(information)S 184 x(may)S 183 x(or)S 183 x(may)S 182 x(not)S 184 x +(be)S 183 x(present)S 183 x(in)S 184 x(a)S 183 x(digital)S 185 x +(image.)S 282 x(When)S 184 x(a)S 183 x(continuous)S 184 x(image)S +183 x(is)S 548 y 4796 X(captured,)S 185 x(the)S 182 x(use)S 181 x +(of)S 181 x(multiple)S 183 x(sensors)S 180 x(which)S 182 x(integrat)S +2 x(e)S 181 x(intensit)S 2 x(y)S 181 x(over)S 181 x(various)S 182 x +(wavelength)S 182 x(bands)S 181 x(provides)S 548 y 4796 X(some)S +177 x(chrominance)S 180 x(information.)S 274 x(Images)S 178 x(which)S +178 x(incl)S 2 x(ude)S 178 x(this)S 179 x(informatio)S 2 x(n)S 178 x +(are)S 178 x(known)S 179 x(as)S 178 x(poly)S 179 x(chromatic)S 179 x +(or)S 548 y 4796 X(multi-spectral)S 2 x(.)S 281 x(This)S 183 x(is)S +182 x(typic)S 2 x(ally)S 183 x(what)S 183 x(is)S 182 x(done)S 183 x +(for)S 182 x(systems)S 182 x(like)S 183 x(tel)S 2 x(evision)S 183 x +(cameras.)S 281 x(When)S 183 x(only)S 183 x(a)S 182 x(single)S 548 y +4796 X(sensor)S 185 x(is)S 187 x(used)S 186 x(and)S 186 x(the)S 187 x +(intensit)S 2 x(y)S 186 x(is)S 186 x(integrat)S 2 x(ed)S 186 x(over)S +186 x(the)S 187 x(entire)S 187 x(spectrum)S 186 x(that)S 188 x(the)S +186 x(sensor)S 186 x(responds)S 186 x(to,)S 191 x(no)S 548 y 4796 X +(chrominance)S 166 x(informatio)S 2 x(n)S 166 x(is)S 166 x(availabl)S +2 x(e.)S 249 x(These)S 166 x(images)S 167 x(are)S 166 x(known)S 166 x +(as)S 166 x(monochromatic.)S 35879 Y 3600 X F40(2\2034)S 449 x +(IMAGING)S 165 x(CONCEPTS)S +1 PP +EP +%%Page 5 16 +1000 BP 39600 30600 PM 0 0 XY +5138 Y 4796 X F78(There)S 175 x(are)S 176 x(many)S 175 x(ways)S 175 x +(in)S 176 x(which)S 175 x(the)S 176 x(luminance)S 177 x(and)S 175 x +(chrominance)S 177 x(information)S 176 x(of)S 175 x(an)S 176 x +(image)S 175 x(can)S 176 x(be)S 176 x(digital)S 2 x(ly)S 548 y 4796 X +(represented.)S 278 x(At)S 181 x(the)S 181 x(extremes)S 181 x(are)S +181 x(representatio)S 2 x(ns)S 180 x(which)S 181 x(fully)S 182 x +(combine)S 181 x(and)S 181 x(fully)S 181 x(separate)S 182 x(the)S +181 x(luminance)S 548 y 4796 X(and)S 182 x(chrominance)S 182 x +(information)S 183 x(and)S 182 x(in)S 182 x(between)S 183 x(are)S +182 x(representati)S 2 x(ons)S 181 x(with)S 183 x(varying)S 182 x +(degrees)S 182 x(of)S 182 x(combinatio)S 2 x(n.)S 548 y 4796 X(A)S +182 x(common)S 182 x(example)S 183 x(is)S 183 x(R-G-B)S 182 x(which)S +183 x(has)S 183 x(three)S 183 x(separate)S 184 x(luminance)S 183 x +(channel)S 2 x(s)S 182 x(\(one)S 183 x(for)S 182 x(each)S 183 x(of)S +183 x(the)S 183 x(three)S 548 y 4796 X(chrominance)S 177 x(bands\).)S +268 x(Broadcast)S 178 x(televisi)S 2 x(on)S 176 x(\(NTSC)S 176 x(-)S +176 x(which)S 177 x(is)S 176 x(an)S 177 x(analog)S 177 x(format\))S +176 x(is)S 176 x(designed)S 177 x(such)S 177 x(that)S 177 x(the)S +547 y 4796 X(luminance)S 168 x(and)S 167 x(chrominance)S 168 x +(signals)S 168 x(are)S 168 x(separate)S 168 x(and)S 167 x(can)S 168 x +(be)S 167 x(recombined)S 168 x(at)S 168 x(the)S 168 x(receiver)S +168 x(\(tv\))S 167 x(all)S 2 x(owing)S 167 x("black)S 548 y 4796 X +(and)S 178 x(white")S 179 x(\(what)S 178 x(we)S 178 x(will)S 178 x +(now)S 178 x(refer)S 178 x(to)S 178 x(as)S 178 x(monochromatic)S +179 x(continuous)S 179 x(tone\))S 179 x(tv')S -27 x(s)S 177 x(to)S +179 x(receive)S 179 x(and)S 178 x(show)S 177 x(the)S 548 y 4796 X +(image)S 166 x(without)S 167 x(color)S -26 x(.)S 897 y 4796 X +(Another)S 171 x(aspect)S 171 x(of)S 171 x(image)S 171 x +(representat)S 2 x(ion)S 171 x(is)S 171 x(the)S 171 x(amount)S 172 x +(of)S 170 x(information)S 172 x(required)S 172 x(per)S 171 x +(channel.)S 259 x(Many)S 171 x(schemes)S 548 y 4796 X(have)S 180 x +(unequal)S 181 x(amounts)S 181 x(of)S 180 x(information)S 181 x(per)S +181 x(channel.)S 278 x(The)S 180 x(amount)S 181 x(of)S 180 x +(information)S 181 x(per)S 181 x(channel)S 181 x(is)S 180 x(based)S +181 x(on)S 548 y 4796 X(many)S 184 x(thing)S 2 x(s)S 184 x(inclu)S +2 x(ding)S 185 x(human)S 185 x(visual)S 186 x(percepti)S 2 x(on)S +185 x(characterist)S 2 x(ics)S 185 x(and)S 185 x(ef)S -9 x +(\211cienc)S 2 x(y)S 185 x(\(conservation)S 186 x(of)S 185 x +(storage)S 548 y 4796 X(and)S 173 x(communications)S 174 x(bandwidt)S +2 x(h\).)S 262 x(Examples)S 174 x(of)S 174 x(this)S 174 x(include)S +174 x(8)S 174 x(bit)S 174 x(per)S 173 x(pixel)S 175 x(color)S 174 x +(\(R-G-B)S 173 x(3-3-2\))S 173 x(where)S 173 x(the)S 548 y 4796 X +(amount)S 173 x(of)S 173 x(luminance)S 174 x(information)S 175 x(is)S +173 x(dif)S -9 x(ferent)S 174 x(for)S 173 x(the)S 174 x(3)S 173 x +(chrominance)S 174 x(channels,)S 175 x(and)S 174 x(broadcast)S 174 x +(tv)S 173 x(where)S 173 x(the)S 548 y 4796 X(luminance)S 167 x(and)S +166 x(chrominance)S 167 x(signals)S 167 x(have)S 166 x(signi\211can)S +2 x(tly)S 167 x(dif)S -9 x(ferent)S 167 x(bandwidths.)S 14020 Y +4796 X F36(Figure)S 167 x(2\2032:)S 498 x(VISUAL)S 166 x(TYPE)S 168 x +(-)S 165 x(VS)S 167 x(-)S 166 x(IMAGE)S 166 x(CLASS)S 548 y 4796 X +22116 24 R 15508 Y 4796 X F102(HUMAN)S 239 x(VISUAL)S 240 x(TYPE)S +10773 X(OPTIMAL)S 240 x(IMAGE)S 240 x(CLASS)S 17946 X(CLASS)S 240 x +(CHARACTERISTICS)S 448 y 4796 X(-----------------)S 10773 X +(--------------)S 2 x(-----)S 17946 X(-------------)S 2 x(--------)S +747 y 4796 X(BLACK)S 239 x(AND)S 240 x(WHITE)S 10773 X +(MONOCHROMATIC)S 241 x(BITONAL)S 18185 X(1)S 240 x(BAND)S 478 x(-)S +239 x(2)S 240 x(INTENSITIES)S 747 y 4796 X(GRAY)S 239 x(SCALE)S +10773 X(MONOCHROMATIC)S 241 x(CONTINUOUS)S 240 x(TONE)S 478 x(1)S +240 x(BAND)S 478 x(-)S 239 x(N)S 240 x(INTENSITIES)S 747 y 4796 X +(COLOR)S 10773 X(MULTISPECTRAL)S 241 x(CONTINUOUS)S 240 x(TONE)S +478 x(M)S 240 x(BANDS)S 239 x(-)S 239 x(N)S 240 x(INTENSITIES)S +19244 Y 5035 X(where:)S 478 x(bands)S 240 x(-->)S 239 x(spectral)S +240 x(bands)S 672 y 4796 X 22116 24 R 897 y 4796 X F78(The)S 170 x +(black)S 170 x(and)S 170 x(white)S 170 x(visual)S 170 x(type)S 171 x +(is)S 169 x(usually)S 171 x(represented)S 170 x(by)S 170 x(a)S 169 x +(digit)S 2 x(al)S 170 x(image)S 170 x(class)S 170 x(known)S 169 x +(as)S 169 x(\(monochromatic\))S 548 y 4796 X(bitonal.)S 271 x(The)S +177 x(gray)S 176 x(scale)S 177 x(visual)S 178 x(type)S 177 x(is)S +177 x(usually)S 177 x(represented)S 177 x(by)S 177 x(a)S 176 x(digi)S +2 x(tal)S 177 x(image)S 177 x(class)S 177 x(known)S 176 x(as)S 176 x +(\(monochro-)S 548 y 4796 X(matic\))S 180 x(contin)S 2 x(uous)S 179 x +(tone.)S 278 x(The)S 180 x(color)S 181 x(visual)S 181 x(type)S 181 x +(is)S 180 x(usually)S 181 x(represented)S 181 x(by)S 180 x(a)S 180 x +(digit)S 2 x(al)S 180 x(image)S 181 x(class)S 180 x(known)S 180 x +(as)S 547 y 4796 X(multi-spectral)S 187 x(\(polychromatic)S 187 x +(continuous)S 186 x(tone\).)S 288 x(The)S 186 x(still)S 2 x(s)S 185 x +(and)S 185 x(motion)S 186 x(visual)S 187 x(types)S 186 x(are)S 185 x +(represented)S 186 x(by)S 548 y 4796 X(individual)S 168 x(or)S 166 x +(sets)S 166 x(of)S 166 x(the)S 167 x(other)S 167 x(digital)S 168 x +(image)S 166 x(classes.)S 897 y 4796 X(One)S 189 x(can)S 190 x(ar)S +-9 x(gue)S 190 x(that)S 190 x(digit)S 2 x(al)S 190 x(image)S 190 x +(classes,)S 195 x(and)S 190 x(by)S 190 x(analogy)S -32 x(,)S 195 x +(the)S 190 x(associate)S 2 x(d)S 189 x(human)S 190 x(visual)S 190 x +(types)S 190 x(can)S 190 x(be)S 548 y 4796 X(or)S -10 x(ganize)S +2 x(d)S 179 x(into)S 180 x(a)S 179 x(hierarchy)S 180 x(based)S 179 x +(upon)S 179 x(degrees)S 180 x(of)S 179 x(freedom)S 178 x(or)S 179 x +(information)S 180 x(theoret)S 2 x(ic)S 179 x(informatio)S 2 x(n)S +179 x(content.)S 548 y 4796 X(Loosely)S 170 x(speaking,)S 171 x +(color)S 170 x(images)S 170 x(have)S 170 x(an)S 170 x(addit)S 2 x +(ional)S 170 x(degree)S 171 x(of)S 169 x(freedom)S 170 x(or)S 169 x +(contai)S 2 x(n)S 169 x(more)S 170 x(information)S 171 x(than)S 170 x +(do)S 548 y 4796 X(grey)S 171 x(scale)S 173 x(and)S 171 x(black)S +173 x(and)S 172 x(white,)S 173 x(and)S 172 x(grey)S 172 x(scale)S +172 x(images)S 172 x(contain)S 173 x(more)S 171 x(information)S 173 x +(than)S 172 x(do)S 171 x(black)S 173 x(and)S 172 x(white.)S 548 y +4796 X(Obviously)S -32 x(,)S 165 x(time)S 167 x(varying)S 167 x +(images)S 166 x(have)S 167 x(an)S 166 x(additi)S 2 x(onal)S 166 x +(degree)S 167 x(of)S 166 x(freedom)S 166 x(over)S 166 x(static)S +168 x(images.)S 896 y 4796 X(Note)S 168 x(that)S 170 x(although)S +170 x(any)S 168 x(contin)S 2 x(uous)S 168 x(image)S 169 x(of)S 168 x +(any)S 169 x(visual)S 169 x(type)S 169 x(can)S 169 x(be)S 168 x +(represented)S 170 x(and)S 168 x(communicated)S 170 x(at)S 169 x +(some)S 548 y 4796 X(level)S 160 x(to)S 160 x(a)S 160 x(human)S 159 x +(viewer)S 160 x(using)S 160 x(any)S 160 x(class)S 160 x(of)S 159 x +(digit)S 2 x(al)S 160 x(image,)S 161 x(the)S 160 x(previous)S 160 x +(table)S 161 x(shows)S 159 x(the)S 160 x(optimal)S 160 x(digi)S 2 x +(tal)S 160 x(image)S 548 y 4796 X(class)S 167 x(\(in)S 168 x(terms)S +168 x(of)S 167 x(ef)S -9 x(\211ciency)S 169 x(and)S 168 x +(\211delity\))S 169 x(for)S 167 x(each)S 168 x(human)S 168 x(visual)S +168 x(type.)S 253 x(Representing)S 169 x(and)S 168 x(rendering)S +168 x(an)S 168 x(image)S 548 y 4796 X(for)S 177 x(display)S 178 x +(in)S 179 x(an)S 177 x(image)S 178 x(class)S 178 x(which)S 178 x(is)S +178 x(not)S 178 x(optimal)S 179 x(for)S 177 x(the)S 178 x(human)S +178 x(visual)S 179 x(type)S 178 x(usually)S 178 x(results)S 179 x +(in)S 178 x(a)S 177 x(loss)S 178 x(in)S 548 y 4796 X(ef)S -9 x +(\211ciency)S 167 x(of)S 166 x(representatio)S 2 x(n)S 166 x(and)S +166 x(visual)S 167 x(\211delit)S 2 x(y)S -33 x(.)S 897 y 4796 X(The)S +174 x(fact)S 174 x(that)S 175 x(the)S 174 x(dif)S -9 x(ferent)S 174 x +(digi)S 2 x(tal)S 174 x(image)S 174 x(class)S 174 x(data)S 174 x +(representat)S 2 x(ions)S 174 x(are)S 173 x(opti)S 2 x(mized)S 173 x +(for)S 174 x(representing)S 175 x(dif)S -9 x(ferent)S 548 y 4796 X +(visual)S 167 x(types)S 166 x(results)S 167 x(in)S 166 x +(signi\211ca)S 2 x(nt)S 166 x(structural)S 168 x(dif)S -9 x +(ferences)S 166 x(between)S 167 x(them.)S 896 y 4796 X(The)S 184 x +(visual)S 184 x(type)S 184 x(known)S 184 x(as)S 183 x(black)S 185 x +(and)S 183 x(white)S 185 x(is)S 183 x(dominated)S 185 x(by)S 184 x +(images)S 183 x(of)S 184 x(human)S 183 x(communications)S 185 x +(objects)S 548 y 4796 X(such)S 173 x(as)S 173 x(written)S 175 x(or)S +173 x(drawn)S 173 x(documents.)S 263 x(These)S 174 x(images)S 174 x +(are)S 173 x(characteri)S 2 x(zed)S 173 x(by)S 174 x(high)S 174 x +(contrast)S 174 x(and)S 174 x(relative)S 2 x(ly)S 173 x(high)S 548 y +4796 X(spatial)S 169 x(frequency)S -32 x(,)S 168 x(and)S 168 x +(contain)S 169 x(symbols)S 168 x(which)S 168 x(are)S 168 x(dif)S +-9 x(ferenti)S 2 x(ated)S 168 x(by)S 168 x(shape)S 168 x(rather)S +169 x(than)S 168 x(inten)S 2 x(sity)S 168 x(or)S 168 x(color)S -27 x +(.)S 252 x(The)S 548 y 4796 X(digital)S 170 x(image)S 169 x(class)S +169 x(used)S 169 x(to)S 169 x(represent)S 169 x(them)S 168 x(with)S +170 x(greatest)S 169 x(\211delit)S 2 x(y)S 168 x(and)S 169 x(ef)S +-9 x(\211ciency)S 170 x(\(bitonal)S 2 x(\))S 168 x(uses)S 168 x +(relati)S 2 x(vely)S 169 x(high)S 35879 Y 21092 X F40(IMAGING)S 165 x +(CONC)S -2 x(EPTS)S 449 x(2\2035)S +1 PP +EP +%%Page 6 17 +1000 BP 39600 30600 PM 0 0 XY +5138 Y 4796 X F78(spatial)S 176 x(resoluti)S 2 x(on)S 175 x(to)S +176 x(capture)S 176 x(the)S 176 x(shape)S 175 x(information)S 176 x +(of)S 175 x(these)S 176 x(symbols,)S 177 x(and)S 175 x(low)S 176 x +(luminance)S 176 x(resolutio)S 2 x(n)S 175 x(\(1)S 175 x(bit)S 548 y +4796 X(per)S 166 x(sampling)S 166 x(locat)S 2 x(ion)S 166 x(-)S 166 x +(2)S 166 x(inte)S 2 x(nsity)S 166 x(level)S 2 x(s)S 166 x(-)S 166 x +(black)S 166 x(and)S 167 x(white\).)S 896 y 4796 X(Real)S 181 x +(world)S 180 x(scenes)S 180 x(are)S 181 x(represented)S 181 x(by)S +180 x(the)S 181 x(gray)S 181 x(scale)S 181 x(and)S 180 x(color)S +181 x(visual)S 181 x(types.)S 278 x(They)S 181 x(have)S 180 x(far)S +180 x(fewer)S 180 x(sharp)S 548 y 4796 X(intensit)S 2 x(y)S 166 x +(edges)S 167 x(than)S 168 x(black)S 167 x(and)S 167 x(white)S 168 x +(visual)S 167 x(type)S 168 x(images,)S 167 x(and)S 166 x(much)S 167 x +(\211ner)S 167 x(gradation)S 168 x(and)S 167 x(variati)S 2 x(on)S +166 x(in)S 168 x(intensit)S 2 x(y)S 548 y 4796 X(and)S 178 x(hue.)S +274 x(Images)S 179 x(of)S 178 x(these)S 179 x(object)S 2 x(s)S 178 x +(do)S 179 x(not)S 179 x(require)S 179 x(the)S 180 x(high)S 179 x +(spatial)S 180 x(resoluti)S 2 x(on)S 178 x(that)S 180 x(is)S 179 x +(needed)S 179 x(for)S 179 x(black)S 179 x(and)S 548 y 4796 X(white)S +174 x(writte)S 2 x(n)S 174 x(material,)S 177 x(but)S 174 x(instea)S +2 x(d)S 174 x(require)S 175 x(higher)S 174 x(luminance)S 176 x(and)S +174 x(chrominance)S 175 x(resolution.)S 266 x(The)S 175 x +(continuous)S 548 y 4796 X(tone)S 166 x(and)S 167 x(multi-spectral)S +168 x(digita)S 2 x(l)S 166 x(image)S 167 x(classes)S 166 x(are)S +166 x(used)S 166 x(for)S 166 x(the)S 167 x(greyscale)S 167 x(and)S +166 x(color)S 167 x(visual)S 167 x(type)S 167 x(images.)S 10418 Y +3600 X F28(2.7)S 599 x(Image)S 167 x(Compressio)S 2 x(n)S 11663 Y +4796 X F78(Image)S 170 x(representati)S 2 x(on)S 171 x(deals)S 171 x +(with)S 171 x(select)S 2 x(ing)S 171 x(an)S 171 x(optimal)S 172 x +(digita)S 2 x(l)S 171 x(image)S 171 x(class)S 171 x(for)S 170 x(an)S +171 x(image)S 172 x(of)S 170 x(some)S 170 x(visual)S 172 x(type.)S +548 y 4796 X(W)S -20 x(ithin)S 170 x(these)S 170 x(digit)S 2 x(al)S +170 x(image)S 169 x(classes,)S 170 x(schemes)S 169 x(exist)S 170 x +(to)S 169 x(remap)S 169 x(or)S 169 x(encode)S 170 x(the)S 170 x +(digital)S 171 x(images)S 169 x(in)S 170 x(a)S 169 x(fashion)S 170 x +(which)S 548 y 4796 X(reduces)S 179 x(redundancy)S 180 x(and)S 179 x +(results)S 180 x(in)S 180 x(a)S 179 x(more)S 179 x(compact)S 179 x +(\(compressed\))S 179 x(representati)S 2 x(on.)S 274 x(There)S 180 x +(are)S 179 x(many)S 179 x(image)S 548 y 4796 X(compression)S 175 x +(schemes)S 175 x(and)S 176 x(to)S 175 x(some)S 175 x(extent)S 2 x(,)S +177 x(they)S 176 x(are)S 176 x(optimized)S 176 x(by)S 176 x(digit)S +2 x(al)S 176 x(image)S 175 x(class.)S 268 x(Image)S 175 x +(compression)S 548 y 4796 X(schemes)S 166 x(which)S 167 x(result)S +167 x(in)S 168 x(complete)S 167 x(\211deli)S 2 x(ty)S 167 x(\(as)S +166 x(measured)S 167 x(by)S 167 x(the)S 167 x(mathematical)S 169 x +(dif)S -9 x(ference)S 167 x(between)S 168 x(the)S 167 x(original)S +548 y 4796 X(image)S 171 x(and)S 172 x(one)S 172 x(which)S 172 x(is)S +171 x(reconstruct)S 2 x(ed)S 171 x(by)S 172 x(the)S 172 x +(compression-decompression)S 171 x(cycle)S 2 x(\))S 171 x(are)S 171 x +(referred)S 172 x(to)S 172 x(as)S 171 x(lossless)S 548 y 4796 X +(schemes,)S 165 x(while)S 167 x(those)S 166 x(that)S 167 x(lose)S +167 x(some)S 166 x(information)S 167 x(are)S 166 x(known)S 166 x(as)S +166 x(non-lossless)S 166 x(schemes.)S 16595 Y 3600 X F28(2.8)S 599 x +(Image)S 167 x(vs)S 167 x(T)S -44 x(ext)S 167 x(&)S 165 x(Graphics)S +17840 Y 4796 X F78(Although)S 187 x(computer)S 186 x(text,)S 192 x +(graphics,)S 191 x(and)S 187 x(images)S 186 x(all)S 187 x(represent)S +187 x(computer)S 187 x(information)S 187 x(to)S 187 x(be)S 186 x +(presented)S 187 x(for)S 548 y 4796 X(consumption)S 175 x(by)S 174 x +(the)S 176 x(human)S 174 x(visual)S 175 x(system,)S 176 x(they)S +175 x(are)S 175 x(dif)S -8 x(ferentiate)S 2 x(d)S 174 x(by)S 175 x +(their)S 175 x(internal)S 176 x(representat)S 2 x(ions,)S 176 x(and)S +175 x(by)S 548 y 4796 X(the)S 174 x(ease)S 173 x(with)S 174 x(which)S +174 x(computer)S 174 x(programs)S 173 x(can)S 173 x(inte)S 2 x +(rpret)S 173 x(thei)S 2 x(r)S 173 x(contents)S 175 x(and)S 173 x +(semantics.)S 264 x(T)S -34 x(ext)S 174 x(and)S 173 x(graphics)S +174 x(are)S 548 y 4796 X(highly)S 169 x(structured)S 169 x(with)S +169 x(limite)S 2 x(d)S 168 x(lexicons)S 169 x(\(ASCII)S 168 x +(character)S 169 x(set,)S 169 x(points,)S 169 x(lines,)S 169 x +(arcs\))S 168 x(and)S 169 x(possess)S 167 x(highl)S 2 x(y)S 168 x +(evolved)S 548 y 4796 X(semantics.)S 256 x(While)S 171 x(digita)S +2 x(l)S 170 x(images)S 170 x(are)S 169 x(a)S 170 x(less)S 170 x(ef)S +-9 x(\211cient)S 171 x(means)S 169 x(of)S 170 x(representing)S 171 x +(textual)S 171 x(or)S 170 x(graphical)S 171 x(information,)S 548 y +4796 X(they)S 166 x(of)S -9 x(fer)S 166 x(a)S 166 x(far)S 166 x +(richer)S 167 x(range)S 166 x(of)S 166 x(expression)S 167 x(\(such)S +166 x(as)S 166 x(a)S 166 x(photograph)S 167 x(of)S 166 x(a)S 166 x +(person\).)S 22224 Y 3600 X F28(2.9)S 599 x(Image)S 167 x(Data)S +167 x(Object)S 23469 Y 4796 X F78(In)S 178 x(practic)S 2 x(e,)S 181 x +(a)S 179 x(digit)S 2 x(al)S 179 x(image)S 179 x(consists)S 180 x(of)S +178 x(two)S 179 x(pieces:)S 276 x(the)S 179 x(actual)S 181 x(bits)S +179 x(which)S 179 x(are)S 179 x(a)S 179 x(result)S 180 x(of)S 178 x +(the)S 180 x(sensing)S 179 x(and)S 548 y 4796 X(digiti)S 2 x(zation)S +167 x(or)S 166 x(synthesis)S 167 x(processes,)S 165 x(and)S 166 x +(the)S 167 x(attri)S 2 x(butes)S 166 x(that)S 167 x(all)S 2 x(ow)S +165 x(the)S 167 x(bits)S 167 x(to)S 166 x(be)S 167 x(interprete)S +2 x(d)S 166 x(meaningfully)S -31 x(.)S 897 y 4796 X(The)S 169 x(raw)S +168 x(bits,)S 169 x(which)S 169 x(result)S 170 x(from)S 168 x(the)S +169 x(capture)S 169 x(or)S 169 x(synthesis)S 169 x(processes)S 168 x +(and)S 169 x(represent)S 169 x(a)S 169 x(discrete)S 170 x(image)S +169 x(\(spatiall)S 2 x(y)S 548 y 4796 X(sampled)S 171 x(and)S 171 x +(quanti)S 2 x(zed)S 171 x(-)S 171 x(no)S 172 x(\212oating)S 172 x +(point)S 173 x(arrays)S 171 x(allowed!\))S 260 x(can)S 171 x(be)S +172 x(or)S -9 x(ganized)S 172 x(in)S 172 x(many)S 171 x(dif)S -9 x +(ferent)S 172 x(ways.)S 259 x(The)S 547 y 4796 X(simplest)S 162 x +(or)S -9 x(ganizat)S 2 x(ional)S 162 x(model)S 162 x(is)S 162 x +(that)S 163 x(of)S 162 x(a)S 162 x(three-dimensional)S 163 x(volume)S +162 x(where)S 162 x(the)S 162 x(x)S 162 x(and)S 162 x(y)S 162 x +(dimensions)S 162 x(represent)S 548 y 4796 X(the)S 171 x(sampling)S +171 x(plane)S 171 x(or)S 171 x(grid)S 171 x(locati)S 2 x(ons,)S 171 x +(and)S 171 x(the)S 171 x(bits)S 171 x(found)S 171 x(in)S 171 x(the)S +171 x(z)S 171 x(direction)S 172 x(represent)S 171 x(the)S 171 x +(value)S 172 x(of)S 170 x(the)S 171 x(image)S 548 y 4796 X(at)S 164 x +(that)S 164 x(sampling)S 165 x(locati)S 2 x(on)S 163 x(at)S 164 x +(some)S 164 x(instant)S 165 x(in)S 164 x(time.)S 249 x(T)S -17 x +(ime)S 164 x(varying)S 164 x(images)S 164 x(may)S 163 x(be)S 164 x +(thought)S 165 x(of)S 163 x(as)S 164 x(a)S 163 x(coll)S 2 x(ection)S +165 x(of)S 548 y 4796 X(such)S 166 x(volumes.)S 897 y 4796 X(Image)S +171 x(attribut)S 2 x(es)S 171 x(consist)S 173 x(of)S 171 x +(information)S 173 x(which)S 172 x(does)S 171 x(not)S 172 x(derive)S +173 x(from)S 170 x(the)S 173 x(capture)S 172 x(or)S 172 x(synthesis)S +172 x(processes,)S 172 x(but)S 548 y 4796 X(which)S 167 x(is)S 167 x +(essential)S 168 x(for)S 166 x(interpret)S 2 x(ing)S 167 x(the)S +168 x(raw)S 166 x(bits.)S 251 x(Attributes)S 168 x(include)S 168 x +(such)S 167 x(information)S 168 x(as)S 166 x(the)S 168 x(way)S 166 x +(in)S 167 x(which)S 167 x(the)S 548 y 4796 X(raw)S 168 x(bits)S 170 x +(have)S 169 x(been)S 169 x(or)S -9 x(ganized)S 2 x(,)S 169 x +(parameters)S 169 x(of)S 169 x(the)S 169 x(sensing)S 169 x(process,)S +169 x(and)S 170 x(information)S 170 x(regarding)S 169 x(how)S 169 x +(the)S 170 x(image)S 548 y 4796 X(data)S 181 x(is)S 181 x(to)S 181 x +(be)S 181 x(displayed.)S 279 x(Although)S 181 x(the)S 181 x(digit)S +2 x(al)S 181 x(image)S 181 x(class)S 181 x(\(bitonal)S 2 x(,)S 183 x +(conti)S 2 x(nuous)S 180 x(tone,)S 185 x(multi-spectral)S 2 x(,)S +184 x(still,)S 548 y 4796 X(time)S 171 x(varying\))S 172 x(is)S 172 x +(usually)S 172 x(not)S 172 x(declared)S 172 x(explic)S 2 x(itly)S +-31 x(,)S 172 x(it)S 172 x(is)S 171 x(often)S 172 x(inferable)S 173 x +(from)S 170 x(the)S 172 x(attri)S 2 x(butes.)S 259 x(Assuming)S 171 x +(that)S 172 x(the)S 548 y 4796 X(digital)S 171 x(image)S 171 x +(class)S 170 x(used)S 169 x(to)S 171 x(represent)S 170 x(the)S 170 x +(human)S 170 x(visual)S 171 x(type)S 170 x(of)S 170 x(a)S 170 x +(particul)S 2 x(ar)S 169 x(image)S 170 x(is)S 170 x(chosen)S 170 x +(for)S 170 x(purposes)S 169 x(of)S 548 y 4796 X(achieving)S 171 x +(maximum)S 169 x(\211delity)S 171 x(with)S 170 x(maximum)S 169 x(ef)S +-9 x(\211ciency)S -31 x(,)S 170 x(the)S 170 x(visual)S 170 x(type)S +170 x(of)S 170 x(the)S 170 x(continuo)S 2 x(us)S 169 x(image)S 170 x +(can)S 170 x(usually)S 548 y 4796 X(be)S 166 x(inferred)S 166 x +(from)S 166 x(the)S 167 x(digital)S 168 x(image)S 166 x(class.)S +35879 Y 3600 X F40(2\2036)S 449 x(IMAGING)S 165 x(CONCEPTS)S +1 PP +EP +%%Page 7 18 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(2.10)S 599 x(Image)S 168 x(Processing)S 6838 Y +4796 X F78(Image)S 180 x(processing)S 181 x(is)S 180 x(the)S 181 x +(appli)S 2 x(cation)S 181 x(of)S 181 x(image)S 180 x(operators)S +181 x(to)S 181 x(image)S 181 x(data.)S 278 x(There)S 181 x(are)S +181 x(three)S 181 x(broad)S 181 x(classes)S 180 x(of)S 548 y 4796 X +(image)S 185 x(processing)S 186 x(distingui)S 2 x(shed)S 185 x(by)S +186 x(purpose)S 185 x(and)S 185 x(approach:)S 289 x(restoratio)S +2 x(n)S 185 x(and)S 185 x(enhancement)S 2 x(,)S 189 x(analysis,)S +191 x(and)S 548 y 4796 X(coding.)S 896 y 4796 X(Restoration)S 177 x +(processing)S 177 x(is)S 176 x(done)S 176 x(to)S 177 x(remove)S 176 x +(some)S 175 x(well)S 177 x(understood)S 177 x(or)S 176 x(predictabl)S +2 x(e)S 176 x(image)S 176 x(distort)S 2 x(ion)S 176 x(resulti)S 2 x +(ng)S 548 y 4796 X(from)S 167 x(the)S 168 x(imaging)S 169 x(system)S +167 x(or)S 168 x(conditi)S 2 x(ons.)S 252 x(Enhancement)S 169 x(is)S +168 x(the)S 168 x(processing)S 168 x(of)S 168 x(an)S 168 x(image)S +168 x(for)S 168 x(the)S 168 x(sole)S 168 x(purpose)S 168 x(of)S 548 y +4796 X(making)S 166 x(the)S 166 x(image)S 166 x(data)S 167 x(more)S +165 x(easily)S 167 x(interpret)S 2 x(able)S 166 x(by)S 166 x(a)S +166 x(human)S 166 x(viewer)S -27 x(.)S 249 x(Enhancement)S 167 x +(processing)S 166 x(is)S 166 x(often)S 166 x(done)S 548 y 4796 X +(interacti)S 2 x(vely)S 177 x(under)S 176 x(the)S 177 x(directi)S +2 x(on)S 176 x(of)S 176 x(the)S 177 x(viewer)S -27 x(.)S 268 x(Both)S +177 x(restorati)S 2 x(on)S 176 x(and)S 176 x(enhancement)S 177 x +(processing)S 177 x(produce)S 177 x(an)S 548 y 4796 X(image)S 166 x +(as)S 166 x(output)S 167 x(and)S 167 x(as)S 165 x(such,)S 166 x +(maybe)S 166 x(considered)S 167 x(to)S 167 x(be)S 166 x(similiar)S +167 x(to)S 167 x(image)S 166 x(synthesis.)S 897 y 4796 X(Analysis)S +191 x(processing)S 191 x(seeks)S 191 x(to)S 191 x(infer)S 191 x +(meaning)S 192 x(\(semantics\))S 191 x(from)S 190 x(raw)S 191 x +(image)S 191 x(data)S 192 x(and)S 191 x(involves)S 192 x(machine)S +548 y 4796 X(interpretat)S 2 x(ion)S 171 x(of)S 170 x(images.)S 258 x +(A)S 170 x(major)S 171 x(branch)S 171 x(of)S 170 x(analysi)S 2 x(s)S +170 x(processing)S 171 x(is)S 171 x(known)S 170 x(as)S 171 x +(pattern)S 171 x(recognit)S 2 x(ion.)S 258 x(Analysis)S 548 y 4796 X +(processing)S 180 x(usually)S 181 x(produces)S 180 x(some)S 180 x +(measurment)S 180 x(or)S 180 x(conclusion)S 181 x(as)S 180 x(output)S +181 x(rather)S 181 x(than)S 181 x(a)S 180 x(new)S 180 x(image.)S +277 x(Often)S 548 y 4796 X(enhancement)S 175 x(processing)S 175 x +(is)S 175 x(performed)S 174 x(in)S 175 x(preparati)S 2 x(on)S 174 x +(for)S 175 x(analysis)S 175 x(processing)S 175 x(\(one)S 175 x(such)S +174 x(example)S 176 x(would)S 174 x(be)S 548 y 4796 X(edge)S 170 x +(detecti)S 2 x(on)S 170 x(whic)S 170 x(produces)S 170 x(a)S 170 x +(new)S 170 x(image)S 170 x(which)S 170 x(is)S 170 x(dimensionall)S +2 x(y)S 170 x(simplier)S 170 x(for)S 170 x(an)S 170 x(analysis)S +171 x(process)S 170 x(to)S 170 x(deal)S 548 y 4796 X(with\).)S 896 y +4796 X(The)S 177 x(process)S 177 x(of)S 178 x(image)S 177 x(coding)S +178 x(deals)S 178 x(with)S 178 x(mapping)S 178 x(image)S 177 x(data)S +178 x(into)S 179 x(alternat)S 2 x(e)S 177 x(symbol)S 177 x(sets)S +177 x(for)S 177 x(ef)S -8 x(\211ciency)S 178 x(of)S 548 y 4796 X +(storage)S 182 x(and)S 183 x(communication)S 2 x(s)S 182 x(\(for)S +182 x(example)S 183 x(compression\),)S 186 x(or)S 182 x(for)S 182 x +(or)S -9 x(ganizat)S 2 x(ional)S 183 x(purposes.)S 282 x(Image)S +182 x(coding)S 548 y 4796 X(produces)S 163 x(an)S 163 x(alternat)S +2 x(ive)S 163 x(representat)S 2 x(ion)S 163 x(of)S 163 x(the)S 164 x +(input)S 164 x(image)S 163 x(as)S 163 x(output.)S 250 x(Depending)S +164 x(upon)S 163 x(the)S 163 x(type)S 164 x(of)S 163 x(coding,)S +164 x(the)S 548 y 4796 X(original)S 167 x(image)S 167 x(can)S 166 x +(be)S 166 x(recovered)S 167 x(with)S 167 x(varying)S 167 x(degrees)S +166 x(of)S 166 x(\211delit)S 2 x(y)S -33 x(.)S 18843 Y 3600 X F28 +(2.1)S -32 x(1)S 598 x(Image)S 168 x(Rendition)S 20088 Y 4796 X F78 +(Renditi)S 2 x(on)S 171 x(is)S 171 x(the)S 172 x(process)S 171 x(of)S +172 x(making)S 171 x(an)S 172 x(image)S 171 x(object)S 173 x +(suitable)S 173 x(for)S 171 x(display)S -32 x(.)S 259 x(In)S 172 x +(general,)S 173 x(it)S 172 x(involves)S 172 x(converti)S 2 x(ng)S +548 y 4796 X(the)S 172 x(image)S 173 x(into)S 173 x(a)S 173 x +(format)S 172 x(that)S 173 x(the)S 173 x(display)S 173 x(device)S +174 x(can)S 172 x(deal)S 173 x(with,)S 174 x(and)S 173 x(sizing)S +173 x(and)S 172 x(aligni)S 2 x(ng)S 172 x(it)S 173 x(properly)S 173 x +(to)S 173 x(\211t)S 172 x(on)S 548 y 4796 X(the)S 166 x(screen.)S +249 x(Rendit)S 2 x(ion)S 166 x(deals)S 167 x(with)S 167 x(the)S 166 x +(presentat)S 2 x(ion)S 166 x(attri)S 2 x(butes)S 166 x(of)S 166 x +(an)S 167 x(image.)S 897 y 4796 X(Renditi)S 2 x(on)S 160 x(and)S +161 x(display)S 161 x(are)S 161 x(logica)S 2 x(lly)S 161 x(the)S +161 x(\211nal)S 161 x(steps)S 161 x(in)S 161 x(the)S 161 x(image)S +161 x(transfer)S 161 x(model.)S 249 x(A)S 160 x(continuous)S 162 x +(image)S 161 x(of)S 160 x(some)S 548 y 4796 X(visual)S 170 x(type)S +171 x(was)S 169 x(converted)S 171 x(into)S 171 x(digita)S 2 x(l)S +170 x(format)S 170 x(of)S 169 x(a)S 170 x(particul)S 2 x(ar)S 170 x +(image)S 170 x(class)S 170 x(for)S 169 x(ef)S -8 x(\211ciency)S 170 x +(and)S 170 x(\211deli)S 2 x(ty)S 170 x(reasons.)S 548 y 4796 X(The)S +161 x(rendition)S 162 x(process)S 160 x(seeks)S 160 x(to)S 161 x +(make)S 161 x(the)S 161 x(image)S 161 x(object)S 162 x(of)S 160 x(a)S +161 x(particula)S 2 x(r)S 160 x(image)S 161 x(class)S 161 x +(viewable)S 161 x(on)S 161 x(a)S 160 x(display)S 162 x(with)S 548 y +4796 X(certain)S 167 x(hardware)S 166 x(characteri)S 2 x(stics)S +166 x(while)S 167 x(achievi)S 2 x(ng)S 166 x(as)S 166 x(high)S 167 x +(a)S 166 x(degree)S 166 x(of)S 166 x(display)S 168 x(\211delity)S +167 x(as)S 166 x(possible.)S 896 y 4796 X(Display)S 183 x(devices)S +184 x(have)S 183 x(hardware)S 183 x(characteri)S 2 x(stics)S 183 x +(that)S 184 x(determine)S 184 x(if)S 183 x(a)S 183 x(partic)S 2 x +(ular)S 183 x(digit)S 2 x(al)S 183 x(image)S 183 x(belongi)S 2 x(ng)S +183 x(to)S 548 y 4796 X(a)S 183 x(particul)S 2 x(ar)S 183 x(image)S +184 x(class)S 184 x(can)S 184 x(be)S 184 x(displayed)S 184 x(as)S +184 x(is)S 183 x(\(renditi)S 2 x(on)S 183 x(is)S 184 x(a)S 184 x +(null)S 184 x(operati)S 2 x(on\),)S 187 x(or)S 183 x(if)S 184 x(the)S +184 x(image)S 184 x(must)S 183 x(be)S 548 y 4796 X(converted)S 167 x +(within)S 167 x(its)S 167 x(image)S 166 x(class,)S 166 x(or)S 166 x +(across)S 166 x(image)S 166 x(classes,)S 166 x(before)S 166 x +(displa)S 2 x(y)S -33 x(.)S 897 y 4796 X(Conversion)S 179 x(withi)S +2 x(n)S 179 x(an)S 179 x(image)S 180 x(class)S 179 x(means)S 179 x +(that)S 180 x(renditi)S 2 x(on)S 179 x(takes)S 180 x(a)S 179 x +(particul)S 2 x(ar)S 179 x(revisable)S 180 x(form)S 178 x(image)S +180 x(of)S 179 x(some)S 548 y 4796 X(class)S 169 x(\(bitona)S 2 x +(l,)S 170 x(continuous)S 171 x(tone,)S 170 x(multi-spect)S 2 x +(ral\),)S 170 x(and)S 170 x(produces)S 169 x(a)S 170 x(\211nal)S +170 x(form)S 169 x(image)S 170 x(of)S 169 x(the)S 170 x(same)S 169 x +(class)S 170 x(\(bitonal)S 2 x(,)S 548 y 4796 X(continuous)S 172 x +(tone,)S 173 x(multi-spec)S 2 x(tral\).)S 260 x(Note)S 172 x(that)S +172 x(alth)S 2 x(ough)S 171 x(the)S 172 x(class)S 172 x(remains)S +172 x(the)S 172 x(same,)S 172 x(attribu)S 2 x(tes)S 171 x(such)S +172 x(as)S 171 x(number)S 548 y 4796 X(of)S 174 x(intensit)S 2 x(y)S +174 x(level)S 2 x(s)S 174 x(may)S 174 x(change)S 175 x(\(an)S 175 x +(example)S 175 x(would)S 175 x(be)S 174 x(rendering)S 175 x(an)S +175 x(8)S 175 x(bit)S 175 x(per)S 175 x(pixel)S 175 x(contin)S 2 x +(uous)S 174 x(tone)S 175 x(image)S 547 y 4796 X(for)S 165 x(display)S +167 x(in)S 167 x(4)S 166 x(bits)S 167 x(per)S 166 x(pixel\).)S 897 y +4796 X(Conversion)S 173 x(across)S 173 x(image)S 173 x(class)S 173 x +(means)S 173 x(that)S 174 x(rendition)S 174 x(takes)S 174 x(a)S 173 x +(particul)S 2 x(ar)S 172 x(revisable)S 174 x(form)S 173 x(image)S +173 x(of)S 173 x(some)S 172 x(class)S 548 y 4796 X(and)S 170 x +(produces)S 170 x(a)S 170 x(\211nal)S 171 x(form)S 169 x(image)S +171 x(of)S 170 x(a)S 170 x(dif)S -9 x(ferent)S 171 x(\(usually)S +171 x(inferior\))S 171 x(class.)S 257 x(An)S 169 x(example)S 171 x +(would)S 170 x(be)S 171 x(rendering)S 171 x(an)S 548 y 4796 X(8)S +175 x(bit)S 176 x(per)S 175 x(pixel)S 177 x(continuous)S 176 x(tone)S +176 x(class)S 176 x(image)S 176 x(for)S 175 x(display)S 176 x(in)S +176 x(1)S 175 x(bit)S 176 x(per)S 176 x(pixel)S 176 x(\(using)S 176 x +(a)S 175 x(ditheri)S 2 x(ng)S 175 x(algorit)S 2 x(hm\))S 175 x(as)S +548 y 4796 X(a)S 171 x(bitona)S 2 x(l)S 172 x(class)S 171 x(image.)S +260 x(Although)S 173 x(cross-class)S 171 x(conversion)S 173 x(can)S +172 x(be)S 171 x(from)S 171 x(any)S 172 x(digit)S 2 x(al)S 172 x +(image)S 172 x(class,)S 172 x(to)S 172 x(any)S 172 x(digit)S 2 x(al)S +548 y 4796 X(image)S 176 x(class,)S 178 x(conversion)S 177 x(more)S +176 x(often)S 177 x(\(due)S 176 x(to)S 176 x(display)S 177 x(device)S +178 x(limitat)S 2 x(ions\))S 176 x(proceeds)S 176 x(from)S 176 x +(digita)S 2 x(l)S 176 x(image)S 177 x(class)S 548 y 4796 X(with)S +175 x(higher)S 176 x(degree)S 175 x(of)S 175 x(freedom)S 174 x(to)S +175 x(that)S 176 x(with)S 176 x(lower)S 175 x(degree)S 175 x(of)S +175 x(freedom)S 175 x(\(such)S 174 x(as)S 175 x(from)S 174 x +(multi-spect)S 2 x(ral)S 175 x(to)S 175 x(gray)S 548 y 4796 X +(scale\).)S 263 x(Psuedo)S 173 x(coloring)S 175 x(is)S 173 x(an)S +173 x(example)S 174 x(of)S 173 x(a)S 174 x(digital)S 175 x(image)S +174 x(class)S 173 x(conversion)S 174 x(which)S 174 x(proceeds)S 173 x +(in)S 174 x(the)S 174 x(opposite)S 548 y 4796 X(direction)S 187 x +(\(inferior)S 186 x(to)S 186 x(superior)S 185 x(class\).)S 288 x +(Cross-class)S 185 x(conversions)S 186 x(which)S 186 x(proceed)S +186 x(from)S 184 x(superior)S 186 x(to)S 186 x(inferior)S 35879 Y +21092 X F40(IMAGING)S 165 x(CONC)S -2 x(EPTS)S 449 x(2\2037)S +1 PP +EP +%%Page 8 19 +1000 BP 39600 30600 PM 0 0 XY +5138 Y 4796 X F78(classes)S 175 x(tend)S 175 x(to)S 176 x(discard)S +175 x(information,)S 178 x(while)S 175 x(those)S 176 x(which)S 175 x +(proceed)S 175 x(in)S 175 x(the)S 176 x(other)S 175 x(direct)S 2 x +(ion)S 175 x(at)S 175 x(times)S 176 x("invent")S 176 x(or)S 548 y +4796 X(provide)S 166 x(information)S 168 x(which)S 166 x(was)S 166 x +(not)S 166 x(avail)S 2 x(able)S 167 x(in)S 166 x(the)S 167 x +(original)S 168 x(image.)S 896 y 4796 X(In)S 172 x(general,)S 175 x +(if)S 173 x(the)S 174 x(display)S 174 x(device)S 173 x(will)S 174 x +(support)S 173 x(it,)S 175 x(\211deli)S 2 x(ty)S 173 x(is)S 173 x +(maximized)S 173 x(if)S 173 x(the)S 174 x(image)S 173 x(is)S 173 x +(rendered)S 173 x(in)S 173 x(a)S 173 x(format)S 548 y 4796 X(as)S +166 x(close)S 168 x(to)S 168 x(that)S 168 x(of)S 167 x(the)S 168 x +(image)S 167 x(class)S 167 x(as)S 167 x(possible)S 168 x(\(for)S +167 x(example,)S 167 x(display)S 169 x(a)S 167 x(continuous)S 168 x +(tone)S 168 x(image)S 167 x(using)S 168 x(multiple)S 548 y 4796 X +(bits)S 168 x(per)S 168 x(pixel)S 169 x(rather)S 169 x(than)S 169 x +(by)S 168 x(using)S 168 x(1)S 168 x(bit)S 169 x(per)S 168 x(pixel)S +2 x(\).)S 252 x(If)S 168 x(not,)S 168 x(the)S 169 x(image)S 168 x +(may)S 168 x(be)S 168 x(converted)S 169 x(to)S 169 x(a)S 168 x(dif)S +-9 x(ferent)S 169 x(image)S 548 y 4796 X(class)S 176 x(\(from)S 174 x +(conti)S 2 x(nuous)S 175 x(tone)S 177 x(to)S 176 x(bitonal)S 177 x +(through)S 177 x(a)S 176 x(dithering)S 177 x(process\))S 175 x(in)S +177 x(order)S 175 x(to)S 177 x(still)S 177 x(render)S 176 x(and)S +176 x(display)S 177 x(it,)S 548 y 4796 X(and)S 166 x(convey)S 166 x +(a)S 167 x(facsimile)S 167 x(of)S 166 x(the)S 167 x(original)S 167 x +(visual)S 167 x(type.)S 897 y 4796 X(Display)S 173 x(hardware)S 172 x +(is)S 173 x(usually)S 173 x(such)S 173 x(that)S 173 x(there)S 173 x +(is)S 173 x(a)S 173 x(hierarchy)S 173 x(of)S 172 x(abili)S 2 x(ty)S +173 x(to)S 173 x(render)S 172 x(dif)S -8 x(ferent)S 173 x(image)S +173 x(classes)S 172 x(with)S 548 y 4796 X(\211delity)S -31 x(.)S +251 x(For)S 167 x(example,)S 168 x(if)S 168 x(a)S 168 x(display)S +168 x(device)S 169 x(can)S 167 x(render)S 168 x(a)S 168 x +(continuous)S 168 x(tone)S 168 x(image)S 168 x(with)S 168 x +(\211delit)S 2 x(y)S 167 x(\(ie.)S 252 x(it)S 168 x(has)S 168 x(N)S +167 x(bits)S 548 y 4796 X(per)S 167 x(pixel)S 168 x(capabil)S 2 x +(ities\),)S 168 x(in)S 167 x(general,)S 168 x(it)S 168 x(will)S 168 x +(also)S 168 x(be)S 167 x(able)S 168 x(to)S 168 x(render)S 167 x(a)S +167 x(biton)S 2 x(al)S 167 x(image)S 168 x(with)S 167 x(\211deli)S +2 x(ty)S -32 x(.)S 251 x(This)S 167 x(hierarchy)S 548 y 4796 X(is)S +166 x(not)S 166 x(one)S 167 x(of)S 166 x(image)S 166 x(class,)S 166 x +(but)S 167 x(rather)S 166 x(one)S 167 x(of)S 166 x(the)S 166 x +(displa)S 2 x(y)S 166 x(device')S -27 x(s)S 166 x(abili)S 2 x(ty)S +166 x(to)S 167 x(render)S 166 x(image)S 167 x(classes)S 166 x(with)S +167 x(\211delity)S -31 x(.)S 12958 Y 3600 X F28(2.12)S 599 x(Image)S +168 x(Display)S 14204 Y 4796 X F78(The)S 169 x(display)S 170 x(step)S +169 x(takes)S 170 x(an)S 169 x(image)S 169 x(which)S 169 x(has)S +169 x(been)S 169 x(rendered)S 169 x(and)S 169 x(makes)S 169 x(it)S +170 x(viewable)S 170 x(\(visible)S 170 x(on)S 169 x(the)S 169 x +(screen\).)S 255 x(It)S 548 y 4796 X(involves)S 175 x(transport)S +175 x(of)S 174 x(rendered)S 175 x(\(\211nal)S 175 x(form\))S 174 x +(image)S 174 x(data)S 176 x(\(usually)S 175 x(referred)S 174 x(to)S +175 x(as)S 174 x(the)S 175 x(bit)S 176 x(map)S 174 x(at)S 175 x +(this)S 175 x(point\))S 175 x(to)S 548 y 4796 X(the)S 166 x(display)S +167 x(memory)S 166 x(and)S 166 x(setting)S 168 x(of)S 166 x(display)S +167 x(controls.)S 896 y 4796 X(Display)S 183 x(is)S 183 x(an)S 183 x +(entirel)S 2 x(y)S 182 x(separate)S 184 x(step)S 183 x(from)S 182 x +(rendit)S 2 x(ion.)S 282 x(There)S 184 x(are)S 183 x(several)S 183 x +(reasons)S 183 x(for)S 182 x(separating)S 184 x(these)S 184 x(two)S +548 y 4796 X(steps.)S 252 x(One)S 168 x(major)S 168 x(reason)S 168 x +(is)S 168 x(performance.)S 253 x(The)S 168 x(clie)S 2 x(nt)S 168 x +(may)S 168 x(chose)S 168 x(to)S 169 x(render)S 168 x(several)S 168 x +(images)S 168 x(\(a)S 168 x(potent)S 2 x(ially)S 169 x(time)S 548 y +4796 X(consuming)S 171 x(task\))S 171 x(before)S 171 x(displayi)S +2 x(ng)S 171 x(them)S 171 x(so)S 171 x(that)S 172 x(they)S 171 x +(may)S 171 x(be)S 171 x(displaye)S 2 x(d)S 171 x(in)S 171 x(a)S 171 x +(time)S 172 x(sequence,)S 172 x(and)S 171 x(so)S 171 x(that)S 172 x +(the)S 548 y 4796 X(user)S 166 x(may)S 166 x(return)S 167 x(to)S +167 x(a)S 166 x(previously)S 168 x(rendered)S 166 x(image)S 167 x +(without)S 168 x(rerendering.)S 250 x(A)S 166 x(second)S 166 x +(reason)S 167 x(is)S 167 x(that)S 167 x(the)S 167 x(client)S 168 x +(may)S 548 y 4796 X(wish)S 159 x(to)S 159 x(render)S 160 x(an)S 159 x +(image)S 160 x(and)S 159 x(convert)S 160 x(it)S 160 x(back)S 160 x +(into)S 160 x(revisable)S 160 x(form)S 159 x(without)S 160 x +(displayi)S 2 x(ng)S 159 x(it)S 160 x(at)S 160 x(all.)S 250 x(In)S +159 x(this)S 160 x(case,)S 160 x(the)S 548 y 4796 X(user)S 174 x +(now)S 174 x(has)S 174 x(a)S 175 x(revisable)S 175 x(form)S 174 x +(image)S 175 x(which)S 175 x(can)S 174 x(be)S 175 x(processed,)S +176 x(and)S 175 x(whose)S 174 x(characterist)S 2 x(ics)S 174 x(are)S +175 x(aligned)S 176 x(with)S 548 y 4796 X(those)S 178 x(of)S 178 x +(the)S 179 x(display)S 179 x(device)S 179 x(making)S 178 x(future)S +179 x(renditi)S 2 x(on)S 178 x(much)S 177 x(less)S 179 x(expensive)S +179 x(if)S 178 x(not)S 179 x(entirely)S 179 x(null)S 2 x(.)S 272 x +(Of)S 178 x(course,)S 548 y 4796 X(processing)S 166 x(of)S 166 x +(this)S 167 x(image)S 166 x(might)S 167 x(make)S 166 x(re-renditi)S +2 x(on)S 166 x(a)S 166 x(necessary)S 166 x(step.)S 21676 Y 3600 X +F28(2.13)S 599 x(Image)S 168 x(Revisabilit)S 2 x(y)S 22921 Y 4796 X +F78(Revisabili)S 2 x(ty)S 173 x(is)S 173 x(the)S 174 x(abilit)S 2 x +(y)S 173 x(to)S 173 x(go)S 173 x(back)S 173 x(and)S 173 x(conti)S +2 x(nue)S 173 x(to)S 173 x(modify)S 173 x(the)S 173 x(content)S 2 x +(s)S 173 x(of)S 172 x(an)S 173 x(image.)S 263 x(At)S 173 x(one)S +173 x(end)S 173 x(of)S 173 x(the)S 548 y 4796 X(spectrum)S 166 x +(are)S 166 x(revisable)S 167 x(form)S 166 x(images,)S 165 x(while)S +167 x(at)S 167 x(the)S 167 x(other)S 166 x(end)S 167 x(are)S 166 x +(\211nal)S 167 x(form)S 165 x(images.)S 897 y 4796 X(In)S 152 x +(revisable)S 154 x(form)S 152 x(images,)S 155 x(the)S 154 x(raw)S +152 x(data)S 154 x(and)S 153 x(attribut)S 2 x(es)S 152 x(represent)S +154 x(the)S 153 x(original)S 155 x(image)S 153 x(as)S 152 x +(captured)S 154 x(or)S 153 x(synthesized,)S 548 y 4796 X(and)S 173 x +(renditi)S 2 x(on)S 173 x(or)S 173 x(other)S 173 x(non-reversibl)S +2 x(e)S 173 x(image)S 173 x(processing)S 174 x(operations)S 174 x +(have)S 174 x(not)S 173 x(been)S 174 x(applied.)S 264 x(The)S 174 x +(association)S 548 y 4796 X(between)S 166 x(image)S 167 x(attribut)S +2 x(es)S 166 x(and)S 166 x(raw)S 166 x(data)S 167 x(exists)S 167 x +(in)S 166 x(revisable)S 167 x(form)S 166 x(images.)S 896 y 4796 X +(In)S 176 x(\211nal)S 176 x(form,)S 178 x(an)S 176 x(image)S 177 x +(has)S 176 x(been)S 177 x(prepared)S 176 x(for)S 176 x(output)S 178 x +(and)S 176 x(all)S 177 x(presentat)S 2 x(ion)S 176 x(att)S 2 x +(ributes)S 177 x(have)S 176 x(been)S 177 x(accounted)S 548 y 4796 X +(for)S 167 x(\(applied)S 169 x(and)S 168 x(stripped)S 168 x(of)S +-9 x(f\).)S 251 x(The)S 168 x(content)S 2 x(s)S 167 x(of)S 168 x(a)S +167 x(display)S 169 x(device)S 169 x(display)S 168 x(memory)S 167 x +(may)S 167 x(be)S 168 x(considered)S 168 x(as)S 168 x(\211nal)S 548 y +4796 X(form.)S 251 x(As)S 167 x(rendit)S 2 x(ion)S 168 x(is)S 168 x +(an)S 168 x(output)S 169 x(device)S 169 x(dependent)S 170 x +(process,)S 167 x(it)S 169 x(is)S 168 x(likel)S 2 x(y)S 168 x(that)S +169 x(a)S 168 x(one)S 168 x(to)S 169 x(many)S 167 x(relati)S 2 x +(onship)S 168 x(exists)S 548 y 4796 X(between)S 170 x(a)S 169 x +(revisable)S 171 x(form)S 168 x(image,)S 170 x(and)S 170 x(the)S +170 x(various)S 170 x(\211nal)S 170 x(form)S 168 x(images)S 170 x +(that)S 170 x(derive)S 170 x(from)S 169 x(it)S 170 x(\(each)S 170 x +(for)S 169 x(a)S 170 x(dif)S -9 x(ferent)S 548 y 4796 X(output)S +167 x(device\).)S 897 y 4796 X(The)S 176 x(distinct)S 2 x(ion)S 176 x +(between)S 176 x(revisable)S 177 x(and)S 176 x(\211nal)S 176 x(form)S +175 x(for)S 175 x(images)S 176 x(is)S 176 x(not)S 176 x(as)S 176 x +(clear)S 176 x(as)S 175 x(it)S 177 x(is)S 176 x(for)S 175 x(text)S +177 x(objects.)S 269 x(W)S -20 x(ith)S 548 y 4796 X(images,)S 181 x +(the)S 179 x(\211nal)S 179 x(form)S 178 x(of)S 179 x(one)S 179 x +(image)S 179 x(object)S 180 x(could)S 179 x(be)S 179 x(used)S 178 x +(as)S 179 x(the)S 179 x(starting)S 180 x(point)S 180 x(for)S 178 x +(the)S 179 x(revisable)S 180 x(form)S 178 x(of)S 547 y 4796 X +(another)S 166 x(if)S 167 x(the)S 167 x(presentation)S 167 x(att)S +2 x(ributes)S 167 x(were)S 165 x(reassociat)S 2 x(ed)S 166 x(with)S +167 x(the)S 166 x(data.)S 35879 Y 3600 X F40(2\2038)S 449 x(IMAGING)S +165 x(CONCEPTS)S +1 PP +EP +%%Page 9 20 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(2.14)S 599 x(Image)S 168 x(Applications)S 6838 Y +4796 X F78(An)S 181 x(applicat)S 2 x(ion)S 182 x(which)S 182 x +(inputs,)S 185 x(output)S 2 x(s,)S 184 x(stores,)S 185 x +(communicates,)S 186 x(or)S 181 x(displays)S 182 x(digit)S 2 x(al)S +182 x(images)S 181 x(is)S 182 x(said)S 182 x(to)S 182 x(be)S 182 x +(an)S 548 y 4796 X(image)S 173 x(applicat)S 2 x(ion.)S 263 x(Many)S +172 x(appli)S 2 x(cations)S 174 x(will)S 174 x(integrate)S 174 x +(image)S 173 x(handli)S 2 x(ng)S 173 x(with)S 173 x(text)S 174 x +(and)S 173 x(graphics)S 174 x(handling.)S 263 x(The)S 548 y 4796 X +(subset)S 175 x(of)S 175 x(image)S 175 x(applicat)S 2 x(ions)S 175 x +(which)S 176 x(must)S 174 x(display)S 176 x(images)S 175 x(are)S +175 x(candid)S 2 x(ates)S 175 x(for)S 175 x(use)S 175 x(of)S 174 x +(the)S 176 x(X)S 175 x(image)S 175 x(extension)S 548 y 4796 X +(package.)S 259 x(Most)S 172 x(or)S 171 x(all)S 172 x(of)S 171 x +(the)S 172 x(overall)S 172 x(image)S 172 x(transfer)S 172 x(model)S +171 x(can)S 172 x(be)S 171 x(found)S 171 x(within)S 173 x(these)S +171 x(appli)S 2 x(cations,)S 173 x(although)S 548 y 4796 X(at)S 166 x +(times,)S 166 x(various)S 167 x(steps)S 166 x(are)S 166 x(null)S +167 x(or)S 166 x(compressed.)S 896 y 4796 X(T)S -35 x(ext,)S 178 x +(graphics,)S 178 x(and)S 176 x(images)S 176 x(are)S 176 x(simply)S +176 x(dif)S -9 x(ferent)S 176 x(data)S 177 x(protocols)S 176 x(and)S +176 x(sets)S 176 x(of)S 175 x(services)S 176 x(for)S 176 x(visual)S +176 x(information)S 548 y 4796 X(managed)S 180 x(on)S 181 x(a)S 181 x +(computer)S -27 x(.)S 278 x(While)S 182 x(many)S 180 x(applic)S 2 x +(ations)S 181 x(will)S 182 x(need)S 181 x(to)S 181 x(wield)S 182 x +(all)S 181 x(three)S 182 x(sets)S 181 x(\(text,)S 184 x(graphics,)S +185 x(and)S 548 y 4796 X(images\))S 177 x(to)S 178 x(visuall)S 2 x +(y)S 178 x(display)S 178 x(what)S 178 x(they)S 179 x(wish)S 177 x +(to)S 179 x(communicate,)S 181 x(the)S 178 x(integrat)S 2 x(ion)S +178 x(of)S 178 x(text,)S 181 x(graphics,)S 181 x(and)S 178 x(image)S +548 y 4796 X(services)S 173 x(under)S 174 x(X)S 172 x(are)S 174 x +(outside)S 174 x(of)S 173 x(the)S 174 x(scope)S 174 x(of)S 173 x +(this)S 174 x(work)S 173 x(\(the)S 173 x(X)S 173 x(image)S 174 x +(extension)S 174 x(protocol)S 2 x(\).)S 262 x(Minimall)S 2 x(y)S +-32 x(,)S 174 x(it)S 174 x(is)S 548 y 4796 X(up)S 173 x(to)S 174 x +(the)S 174 x(applicat)S 2 x(ion)S 174 x(to)S 173 x(accomplish)S 175 x +(the)S 173 x(inte)S 2 x(gration)S 174 x(of)S 173 x(use)S 174 x(of)S +173 x(these)S 174 x(services.)S 263 x(Compound)S 173 x(document)S +174 x(display)S 548 y 4796 X(and)S 166 x(edit)S 167 x(packages)S +167 x(are)S 166 x(perfect)S 167 x(examples)S 166 x(of)S 166 x(appli)S +2 x(cations)S 167 x(which)S 166 x(face)S 167 x(this)S 166 x(chall)S +2 x(enge.)S 897 y 4796 X(In)S 169 x(addition)S 171 x(to)S 169 x(not)S +170 x(solving)S 170 x(the)S 170 x(integrat)S 2 x(ed)S 169 x +(approach)S 170 x(to)S 170 x(the)S 170 x(use)S 169 x(of)S 169 x(X)S +169 x(based)S 169 x(text,)S 171 x(graphics,)S 170 x(and)S 169 x +(image)S 170 x(services,)S 548 y 4796 X(the)S 166 x(X)S 166 x(image)S +166 x(extensi)S 2 x(on)S 166 x(package)S 167 x(will)S 167 x(not)S +166 x(provide)S 167 x(ANY)S 165 x(text)S 167 x(or)S 166 x(graphics)S +167 x(services.)S 896 y 4796 X(The)S 173 x(processing)S 174 x(of)S +173 x(images)S 173 x(for)S 173 x(display)S 175 x(purposes)S 173 x +(and)S 173 x(the)S 174 x(display)S 174 x(of)S 173 x(images)S 174 x +(are)S 173 x(inti)S 2 x(mately)S 174 x(entwined.)S 264 x(The)S 173 x +(X)S 548 y 4796 X(architect)S 2 x(ure)S 175 x(has)S 175 x +(segregated)S 176 x(processing)S 176 x(for)S 175 x(display)S 176 x +(and)S 176 x(display)S 176 x(from)S 175 x(other)S 176 x(aspects)S +176 x(of)S 175 x(applicat)S 2 x(ions.)S 267 x(W)S -19 x(ithin)S 548 y +4796 X(the)S 164 x(X)S 164 x(model,)S 164 x(an)S 164 x(applicat)S +2 x(ion)S 164 x(has)S 164 x(a)S 164 x(component)S 165 x(which)S 164 x +(requires)S 164 x(the)S 165 x(display)S 165 x(processing)S 164 x +(\(and)S 164 x(human)S 164 x(interac)S 2 x(tion\))S 548 y 4796 X +(services)S 182 x(call)S 2 x(ed)S 182 x(the)S 183 x(cli)S 2 x(ent)S +183 x(component,)S 186 x(and)S 183 x(a)S 183 x(component)S 183 x +(which)S 182 x(provides)S 183 x(these)S 183 x(services)S 183 x(call)S +2 x(ed)S 182 x(the)S 183 x(server)S 548 y 4796 X(component.)S 267 x +(Naturally)S -31 x(,)S 177 x(the)S 176 x(server)S 174 x(component)S +176 x(resides)S 176 x(at)S 175 x(or)S 175 x(near)S 176 x(the)S 175 x +(equipment)S 177 x(which)S 175 x(provides)S 176 x(for)S 174 x +(displa)S 2 x(y)S 548 y 4796 X(and)S 187 x(human)S 187 x(inte)S 2 x +(raction.)S 292 x(The)S 188 x(X)S 187 x(architect)S 2 x(ure)S 187 x +(also)S 188 x(provides)S 188 x(for)S 187 x(logical)S 2 x(/physical)S +189 x(separation)S 189 x(of)S 187 x(these)S 188 x(two)S 548 y 4796 X +(components)S 166 x(by)S 166 x(a)S 166 x("wire".)S 19939 Y 3600 X +F28(2.15)S 599 x(Image)S 168 x(Server)S 21184 Y 4796 X F78(An)S 176 x +(X)S 176 x(server)S 176 x(for)S 177 x(imaging)S 177 x(applica)S 2 x +(tions)S 177 x(minimally)S 178 x(includes)S 177 x(a)S 177 x(general)S +178 x(purpose)S 176 x(host)S 177 x(processor)S 176 x(on)S 177 x +(which)S 177 x(the)S 548 y 4796 X(X)S 181 x(server)S 182 x(runs)S +182 x(and)S 183 x(a)S 182 x(display)S 183 x(subsystem.)S 281 x +(There)S 183 x(is)S 182 x(potenti)S 2 x(al)S 183 x(for)S 182 x +(great)S 183 x(diversity)S 183 x(regarding)S 183 x(the)S 183 x +(server)S 182 x(host)S 548 y 4796 X(con\211guration,)S 180 x(the)S +178 x(complexit)S 2 x(y)S 177 x(and)S 177 x(capabil)S 2 x(ity)S 178 x +(of)S 177 x(the)S 178 x(display)S 178 x(subsystem,)S 179 x(and)S +177 x(the)S 178 x(relati)S 2 x(onship)S 177 x(between)S 178 x(host)S +548 y 4796 X(processor)S 165 x(and)S 167 x(display)S 167 x +(subsystem.)S 897 y 4796 X(Regarding)S 172 x(the)S 172 x(relati)S +2 x(onship)S 172 x(between)S 172 x(the)S 172 x(host)S 172 x +(processor)S 171 x(and)S 172 x(the)S 172 x(display)S 173 x +(subsystem,)S 172 x(at)S 172 x(one)S 171 x(end)S 172 x(of)S 171 x +(the)S 173 x(server)S 547 y 4796 X(spectrum)S 186 x(are)S 186 x +(terminals)S 187 x(where)S 186 x(host)S 186 x(processor)S 186 x(and)S +186 x(display)S 187 x(subsystem)S 186 x(are)S 186 x(separated)S 187 x +(by)S 186 x(a)S 186 x(relat)S 2 x(ively)S 187 x(low)S 548 y 4796 X +(bandwidth)S 175 x(connect)S 2 x(ion)S 175 x(and)S 175 x(often)S +175 x(a)S 175 x(character)S 176 x(oriented)S 176 x(protocol.)S 267 x +(The)S 176 x(separation)S 176 x(between)S 175 x(these)S 175 x +(components)S 548 y 4796 X(maybe)S 169 x(relat)S 2 x(ively)S 171 x +(small)S 170 x(\(local)S 171 x(serial)S 171 x(line\),)S 171 x(or)S +170 x(lar)S -8 x(ge)S 170 x(\(modems)S 169 x(and)S 170 x(packet)S +171 x(switch)S 170 x(networks\).)S 257 x(At)S 170 x(the)S 170 x +(other)S 171 x(end)S 548 y 4796 X(are)S 168 x(workstations)S 169 x +(where)S 169 x(the)S 169 x(host)S 168 x(processor)S 169 x(and)S 168 x +(display)S 170 x(memory)S 167 x(are)S 169 x(connected)S 170 x(by)S +168 x(a)S 169 x(high)S 169 x(bandwidth)S 169 x(bus)S 168 x(and)S +548 y 4796 X(often)S 176 x(overlapping)S 177 x(address)S 175 x +(spaces.)S 268 x(While)S 177 x(the)S 176 x(X)S 176 x(image)S 176 x +(extension)S 177 x(package)S 176 x(does)S 176 x(not)S 176 x +(preclude)S 177 x(the)S 176 x(terminals)S 548 y 4796 X(cases,)S 166 x +(the)S 168 x(lar)S -9 x(ge)S 167 x(size)S 168 x(of)S 166 x(image)S +168 x(objects)S 168 x(implies)S 168 x(the)S 167 x(need)S 167 x(for)S +167 x(a)S 167 x(relati)S 2 x(vely)S 167 x(high)S 168 x(interconnec)S +2 x(t)S 167 x(bandwidth)S 168 x(between)S 548 y 4796 X(server)S 165 x +(host)S 167 x(processor)S 166 x(and)S 166 x(display)S 167 x +(subsystem)S 166 x(\(the)S 167 x(workstation)S 167 x +(con\211guration\).)S 897 y 4796 X(Regarding)S 176 x(display)S 176 x +(subsystem)S 175 x(capabili)S 2 x(ties,)S 177 x(at)S 176 x(the)S +176 x(low)S 175 x(end)S 175 x(are)S 176 x(devices)S 176 x(which)S +175 x(do)S 175 x(not)S 176 x(allow)S 176 x(direct)S 176 x(access)S +175 x(to)S 548 y 4796 X(the)S 162 x(display)S 163 x(memory)S 162 x +(and)S 162 x(have)S 163 x(no)S 162 x(user)S 162 x(accessible)S 163 x +(display)S 163 x(processing)S 163 x(capabili)S 2 x(ties.)S 249 x(At)S +162 x(the)S 163 x(high)S 163 x(end)S 162 x(are)S 162 x(displa)S 2 x +(y)S 548 y 4796 X(subsystems)S 172 x(with)S 174 x(specializ)S 2 x +(ed)S 173 x(processor)S -10 x(-memory)S 172 x(architec)S 2 x(tures)S +173 x(\(includi)S 2 x(ng)S 173 x(parrallel)S 2 x(-pipelined)S 174 x +(processors,)S 174 x(and)S 548 y 4796 X(shared)S 185 x(memory)S 185 x +(multi)S 187 x(processor)S 185 x(con\211gurati)S 2 x(ons\))S 185 x +(which)S 186 x(provide)S 187 x(on-board)S 186 x(support)S 186 x(for)S +185 x(enhancement)S 187 x(and)S 548 y 4796 X(rendition)S 167 x +(processing.)S 896 y 4796 X(As)S 175 x(image)S 176 x(capable)S 177 x +(workstation)S 2 x(s)S 175 x(and)S 176 x(display)S 177 x(subsystems)S +176 x(develop,)S 179 x(there)S 176 x(is)S 176 x(a)S 177 x(trend)S +176 x(to)S 177 x(closely)S 177 x(couple)S 177 x(image)S 548 y 4796 X +(capture)S 168 x(devices)S 168 x(to)S 167 x(image)S 168 x(display)S +168 x(subsystems.)S 250 x(Close)S 168 x(coupling)S 168 x(involv)S +2 x(es)S 167 x(sharing)S 167 x(the)S 168 x(display)S 168 x(memory)S +166 x(between)S 548 y 4796 X(the)S 167 x(capture)S 168 x(device)S +168 x(and)S 167 x(the)S 167 x(display)S 168 x(hardware.)S 250 x(W)S +-19 x(ith)S 167 x(these)S 168 x(con\211gurations,)S 168 x(it)S 167 x +(is)S 167 x(usually)S 168 x(possible)S 168 x(for)S 166 x(the)S 168 x +(viewer)S 548 y 4796 X(to)S 167 x(see)S 167 x(the)S 167 x(image)S +168 x(as)S 166 x(it)S 168 x(is)S 167 x(being)S 168 x(digiti)S 2 x +(zed.)S 251 x(In)S 166 x(these)S 168 x(cases,)S 166 x(the)S 168 x +(capture\203>represent)S 2 x(\203>enhance\203>render)S -9 x +(\203>display)S 548 y 4796 X(transfer)S 166 x(process)S 166 x(has)S +166 x(no)S 166 x(loops)S 166 x(and)S 167 x(is)S 166 x(very)S 166 x +(tight)S 2 x(ly)S 166 x(packed)S 167 x(and)S 166 x(highl)S 2 x(y)S +166 x(optimized.)S 35879 Y 290 x F40(IMAGING)S 165 x(CONC)S -2 x +(EPTS)S 449 x(2\2039)S +1 PP +EP +%%Page 1 21 +1000 BP 39600 30600 PM 0 0 XY +9007 Y 3600 X F24(Chapter)S 498 x(3)S 10651 Y 3600 X(EXTENSION)S +165 x(ARCH)S -2 x(ITECTURE)S 165 x(CONC)S -2 x(EPTS)S 13357 Y 4796 X +F78(There)S 171 x(are)S 172 x(a)S 171 x(number)S 171 x(of)S 171 x +(concepts)S 172 x(which)S 171 x(are)S 172 x(fundamental)S 172 x(to)S +172 x(the)S 171 x(image)S 172 x(extension)S 172 x(archit)S 2 x +(ectural)S 172 x(model.)S 259 x(These)S 548 y 4796 X(concepts)S 185 x +(are)S 185 x(introduce)S 2 x(d)S 184 x(in)S 186 x(this)S 185 x +(chapter)S -19 x(,)S 189 x(and)S 185 x(those)S 186 x(which)S 185 x +(result)S 185 x(in)S 186 x(elements)S 185 x(of)S 185 x(the)S 185 x +(X)S 185 x(Image)S 184 x(Extensi)S 2 x(on)S 548 y 4796 X(Protocol)S +176 x(\(XIEP\))S 174 x(are)S 175 x(explored)S 176 x(in)S 175 x +(depth)S 176 x(in)S 175 x(the)S 176 x(following)S 176 x(chapter)S +-26 x(.)S 266 x(In)S 175 x(addition)S 2 x(,)S 176 x(the)S 176 x +(relation)S 2 x(ship)S 175 x(between)S 175 x(the)S 548 y 4796 X +(core)S 170 x(X)S 170 x(archit)S 2 x(ecture)S 171 x(and)S 171 x +(protocol,)S 172 x(and)S 171 x(the)S 171 x(proposed)S 171 x +(extension)S 172 x(architect)S 2 x(ure)S 170 x(and)S 171 x(protocol)S +172 x(is)S 170 x(addressed)S 171 x(brie\212y)S 548 y 4796 X +(throughout)S 167 x(the)S 167 x(chapter)S -27 x(.)S 17193 Y 3600 X +F28(3.1)S 599 x(Extension)S 167 x(Guidel)S 2 x(ines)S 18438 Y 4796 X +F78(In)S 165 x(formulati)S 2 x(ng)S 166 x(an)S 166 x(image)S 166 x +(extensi)S 2 x(on)S 166 x(protocol,)S 167 x(the)S 166 x(two)S 167 x +(most)S 165 x(important)S 168 x(questions)S 167 x(are:)S 897 y 4796 X +(1.)S 522 x(What)S 167 x(services)S 167 x(do)S 166 x(client)S 168 x +(portions)S 167 x(of)S 166 x(image)S 166 x(applica)S 2 x(tions)S +167 x(require)S 166 x(of)S 166 x(an)S 166 x(image)S 167 x(server?)S +747 y 4796 X(2.)S 522 x(What)S 167 x(services)S 167 x(is)S 166 x(an)S +166 x(image)S 167 x(server)S 166 x(well)S 166 x(positi)S 2 x(oned)S +166 x(to)S 167 x(provide?)S 21178 Y 4796 X(From)S 175 x(the)S 178 x +(answer)S 176 x(to)S 177 x(these)S 177 x(questions,)S 180 x(a)S 176 x +(high)S 177 x(level)S 178 x(service)S 178 x(set)S 176 x(can)S 177 x +(be)S 177 x(de\211ned.)S 270 x(The)S 177 x(next)S 177 x(step)S 177 x +(is)S 177 x(to)S 177 x(proceed)S 548 y 4796 X(to)S 177 x(identi)S +2 x(fy)S 177 x(the)S 177 x(primiti)S 2 x(ves)S 177 x(that)S 178 x +(the)S 178 x(server)S 176 x(should)S 178 x(implement)S 178 x(to)S +177 x(support)S 178 x(the)S 177 x(high)S 178 x(level)S 178 x +(service)S 178 x(set.)S 271 x(Finall)S 2 x(y)S -33 x(,)S 548 y 4796 X +(the)S 180 x(primitive)S 2 x(s)S 179 x(must)S 180 x(be)S 180 x +(mapped)S 179 x(into)S 181 x(a)S 180 x(minimally)S 181 x(suf)S -9 x +(\211cient)S 181 x(protocol)S 181 x(for)S 179 x(communicati)S 2 x +(ng)S 179 x(both)S 181 x(the)S 180 x(service)S 547 y 4796 X +(primitive)S 167 x(requests)S 167 x(and)S 166 x(responses.)S 897 y +4796 X(In)S 167 x(order)S 168 x(to)S 168 x(answer)S 168 x(the)S 168 x +(\211rst)S 168 x(question,)S 169 x(one)S 168 x(must)S 168 x(analyze)S +169 x(the)S 168 x(human)S 168 x(interac)S 2 x(tion)S 168 x +(components)S 169 x(of)S 167 x(many)S 168 x(imaging)S 548 y 4796 X +(applicat)S 2 x(ions.)S 281 x(If)S 182 x(performed)S 182 x(by)S 182 x +(a)S 182 x(single)S 183 x(indivi)S 2 x(dual,)S 186 x(in)S 183 x(a)S +182 x(serial)S 183 x(fashion,)S 187 x(this)S 183 x(is)S 182 x +(potenti)S 2 x(ally)S 183 x(a)S 182 x(long)S 183 x(task.)S 282 x(A)S +548 y 4796 X(more)S 166 x(practica)S 2 x(l)S 167 x(approach)S 168 x +(to)S 167 x(this)S 168 x(problem)S 167 x(is)S 167 x(to)S 167 x(draw)S +167 x(upon)S 167 x(the)S 168 x(experience)S 168 x(of)S 167 x(many)S +167 x(diverse)S 167 x(image)S 168 x(applicat)S 2 x(ions)S 548 y +4796 X(developers)S 166 x(\(which)S 167 x(to)S 166 x(some)S 166 x +(extent)S 167 x(is)S 167 x(the)S 166 x(approach)S 167 x(taken)S 167 x +(to)S 167 x(date\).)S 897 y 4796 X(Regarding)S 191 x(the)S 191 x +(second)S 190 x(questio)S 2 x(n,)S 195 x(the)S 191 x(core)S 191 x(X)S +190 x(model)S 190 x(provides)S 191 x(some)S 190 x(guideli)S 2 x(nes)S +190 x(on)S 190 x(what)S 191 x(should)S 191 x(live)S 191 x(on)S 548 y +4796 X(the)S 181 x(server)S 182 x(side)S 181 x(of)S 182 x(the)S 181 x +(wire.)S 280 x(Clearly)S -31 x(,)S 184 x(all)S 183 x(interact)S 2 x +(ion)S 181 x(with)S 182 x(the)S 182 x(display)S 183 x(device)S 182 x +(must)S 181 x(go)S 181 x(through)S 182 x(the)S 182 x(server)S -27 x +(.)S 547 y 4796 X(Likewise,)S 166 x(all)S 167 x(interact)S 2 x(ion)S +166 x(with)S 166 x(human)S 166 x(controlle)S 2 x(d)S 165 x(intera)S +2 x(ction)S 166 x(device)S 2 x(s,)S 165 x(such)S 165 x(as)S 166 x +(keyboards)S 166 x(and)S 166 x(pointing)S 167 x(devices,)S 548 y +4796 X(must)S 165 x(go)S 167 x(through)S 166 x(the)S 167 x(server)S +-27 x(.)S 897 y 4796 X(In)S 161 x(general,)S 163 x(due)S 162 x +(perhaps)S 162 x(more)S 162 x(to)S 162 x(the)S 162 x(maturity)S 163 x +(and)S 162 x(standardiza)S 2 x(tion)S 162 x(of)S 162 x(the)S 162 x +(spaces,)S 163 x(the)S 162 x(core)S 162 x(X)S 161 x(package)S 163 x +(provides)S 548 y 4796 X(some)S 176 x(degree)S 178 x(of)S 176 x +(device)S 179 x(independence)S 178 x(for)S 177 x(text)S 178 x(and)S +178 x(graphics.)S 271 x(Although)S 178 x(this)S 177 x(is)S 178 x +(not)S 177 x(an)S 177 x(expli)S 2 x(cit)S 178 x(goal)S 178 x(of)S +176 x(core)S 548 y 4796 X(protocol,)S 188 x(it)S 184 x(seems)S 183 x +(like)S 184 x(a)S 184 x(reasonable)S 184 x(directi)S 2 x(on)S 183 x +(for)S 183 x(the)S 184 x(extension)S 185 x(protocol:)S 285 x(the)S +184 x(image)S 184 x(extension)S 184 x(package)S 548 y 4796 X(should)S +182 x(provide)S 183 x(device)S 184 x(independence)S 184 x(to)S 183 x +(the)S 183 x(client)S 2 x(.)S 281 x(This)S 183 x(means)S 182 x(that)S +183 x(the)S 183 x(XIE_T)S -8 x(OOLKIT)S -38 x(,)S 182 x(XIE_LIB,)S +182 x(and)S 548 y 4796 X(XIE_SER)S -40 x(VER)S 171 x(will)S 171 x +(handle)S 171 x(all)S 171 x(image)S 170 x(displa)S 2 x(y)S 170 x +(device)S 171 x(dependencie)S 2 x(s.)S 256 x(Minimall)S 2 x(y)S -33 x +(,)S 171 x(this)S 171 x(implies)S 171 x(that)S 171 x(renditi)S 2 x +(on)S 170 x(is)S 548 y 4796 X(an)S 173 x(extensi)S 2 x(on)S 174 x +(package)S 174 x(issue.)S 264 x(Server)S 174 x(extensi)S 2 x(ons)S +173 x(are)S 174 x(encouraged)S 175 x(to)S 174 x(provide)S 175 x(for)S +173 x(usage)S 174 x(of)S 174 x(speciali)S 2 x(zed)S 174 x(display)S +548 y 4796 X(hardware)S 166 x(primarily)S 167 x(for)S 166 x(display)S +167 x(purposes.)S 35879 Y 16766 X F40(EXTENSION)S 165 x(ARCHITEC)S +-2 x(TURE)S 166 x(CONC)S -2 x(EPTS)S 449 x(3\2031)S +1 PP +EP +%%Page 2 22 +1000 BP 39600 30600 PM 0 0 XY +5138 Y 4796 X F78(The)S 175 x(XIE_SER)S -40 x(VER)S 175 x(may)S 175 x +(be)S 174 x(home)S 175 x(to)S 175 x(operations)S 176 x(which,)S 176 x +(alt)S 2 x(hough)S 175 x(not)S 175 x(speci\211call)S 2 x(y)S 174 x +(device)S 176 x(dependent,)S 178 x(would)S 548 y 4796 X(derive)S +168 x(bene\211t)S 170 x(\(performance)S 168 x(ef)S -9 x +(\211ciency\))S 169 x(from)S 167 x(being)S 169 x(in)S 169 x(close)S +169 x(proximity)S 169 x(to)S 169 x(the)S 169 x(display)S 169 x +(subsystem)S 168 x(and)S 168 x(special)S 2 x(-)S 548 y 4796 X(ized)S +171 x(display)S 171 x(subsystem)S 171 x(hardware.)S 257 x(This)S +171 x(is)S 171 x(the)S 171 x(basis)S 171 x(for)S 170 x(postulat)S +2 x(ing)S 171 x(that)S 171 x(intera)S 2 x(ctive)S 171 x(enhancement)S +172 x(processing)S 548 y 4796 X(must)S 165 x(be)S 167 x(provided)S +167 x(for)S 165 x(\(allowed\))S 167 x(in)S 167 x(the)S 167 x(server)S +-28 x(.)S 8425 Y 3600 X F28(3.2)S 599 x(Extension)S 167 x(Leve)S +2 x(ls)S 9671 Y 4796 X F78(The)S 170 x(following)S 170 x(diagram)S +170 x(shows)S 169 x(the)S 170 x(relat)S 2 x(ionship)S 170 x(between)S +171 x(client)S 171 x(and)S 170 x(image)S 170 x(extension)S 171 x +(server)S -20 x(,)S 170 x(and)S 169 x(how)S 170 x(the)S 170 x(full)S +548 y 4796 X(image)S 173 x(extensi)S 2 x(on)S 173 x(package)S 175 x +(parallel)S 2 x(s)S 173 x(the)S 174 x(existi)S 2 x(ng)S 173 x(X)S +173 x(components.)S 264 x(It)S 174 x(also)S 174 x(positi)S 2 x(ons)S +173 x(the)S 174 x(speci\211cat)S 2 x(ion)S 174 x(of)S 173 x(XIEP)S +-55 x(,)S 548 y 4796 X(the)S 166 x(image)S 167 x(extension)S 167 x +(protocol)S 167 x(for)S 166 x(the)S 167 x(X)S 166 x(wire)S 166 x +(\(denoted)S 167 x(by)S 166 x(the)S 78 y 167 x(*)S -78 y(\).)S 12177 Y +4796 X F36(Figure)S 167 x(3\2031:)S 498 x(IMAGE)S 166 x(EXTENSION)S +166 x(-)S 166 x(VS)S 167 x(-)S 166 x(CORE)S 165 x(P)S -37 x(ACKAG)S +-2 x(E)S 548 y 4796 X 22116 24 R 13691 Y 6469 X F102(application)S +240 x(host)S 16751 X(server)S 239 x(host)S 448 y 7426 X(machine)S +17229 X(machine)S 748 y 5991 X(+--------------)S 2 x(---+)S 16272 X +(+---------)S 2 x(-------+)S 448 y 5991 X(|)S 717 x(application)S +719 x(|)S 16272 X(|)S 240 x(display)S 240 x(device)S 239 x(|<--)S +240 x(capture)S 448 y 5991 X(|)S 10295 X(|)S 16272 X(|)S 20337 X(|)S +21533 X(device)S 449 y 5991 X(|)S 10295 X(|)S 16272 X(|)S 20337 X(|)S +448 y 5991 X(|)S 10295 X(|)S 16272 X(|)S 20337 X(|)S 448 y 5991 X(|)S +239 x(X)S 239 x(&)S 240 x(XIE)S 239 x(toolkits|)S 16272 X(|)S 17946 X +(DDX)S 20337 X(|)S 449 y 5991 X(|)S 239 x(X)S 239 x(&)S 240 x(XIE)S +239 x(LIBs)S 10295 X(|)S 239 x(<=============)S 2 x(=======>)S 239 x +(|)S 17946 X(DIX)S 20337 X(|)S 448 y 5991 X(+--------------)S 2 x +(---+)S 12208 X(X11)S 239 x(&)S 239 x(XIEP)S 16272 X(+---------)S +2 x(-------+)S 448 y 12925 X(wire)S 449 y 12447 X(protocols)S 20864 Y +5991 X(EXISTING)S 240 x(X)S 239 x(COMPONENTS)S 16272 X(IMAGE)S 240 x +(EXTENSION)S 240 x(COMPONENTS)S 449 y 5991 X(---------------)S 2 x +(------)S 16272 X(----------)S 2 x(----------------)S 747 y 6469 X +(Applications)S 16751 X(Image)S 239 x(Applications)S 448 y 7665 X(|)S +18664 X(|)S 448 y 5035 X(Programming)S 240 x(Libraries)S 16272 X +(Imaging)S 240 x(Services)S 240 x(Library)S 449 y 7665 X(|)S 18664 X +(|)S 448 y 6947 X(Xtoolkit)S 17468 X(XIE_TOOLKIT)S 448 y 7665 X(|)S +18664 X(|)S 449 y 7187 X(Xlib)S 17946 X(XIE_LIB)S 448 y 7665 X(|)S +18664 X(|)S 448 y 5752 X(X)S 239 x(Core)S 240 x(Wire)S 239 x +(Protocol)S 16272 X(Image)S 240 x(Extension)S 240 x(Protocol)S 240 x +(\(*\))S 449 y 7665 X(|)S 18664 X(|)S 448 y 5991 X(X)S 239 x(server)S +240 x(kernel)S 16272 X(X)S 240 x(Image)S 239 x(server)S 240 x +(kernel)S 448 y 7665 X(|)S 18664 X(|)S 449 y 5035 X(device)S 239 x +(independent)S 241 x(modules)S 15794 X(device)S 240 x(independent)S +240 x(extensions)S 448 y 7665 X(|)S 18664 X(|)S 448 y 5274 X(device)S +239 x(dependent)S 240 x(modules)S 16033 X(device)S 240 x(dependent)S +240 x(extensions)S 449 y 7665 X(|)S 18664 X(|)S 448 y 5274 X +(display)S 240 x(&)S 239 x(input)S 239 x(devices)S 16272 X(image)S +240 x(capable)S 240 x(displays)S 672 y 4796 X 22116 24 R 897 y 4796 X +F78(Image)S 182 x(speci\211c)S 183 x(components)S 183 x(and)S 183 x +(issues)S 183 x(can)S 183 x(be)S 183 x(positioned)S 184 x(against)S +184 x(the)S 183 x(core)S 183 x(X)S 182 x(level)S 2 x(s.)S 281 x +(Image)S 182 x(accel)S 2 x(erators)S 548 y 4796 X(\(either)S 171 x +(integral)S 172 x(to)S 171 x(the)S 171 x(display)S 172 x(subsystem,)S +170 x(or)S 171 x(simply)S 171 x(ancilla)S 2 x(ry)S 170 x(server)S +170 x(host)S 171 x(processors\))S 170 x(exist)S 171 x(and)S 171 x +(are)S 171 x(accessed)S 548 y 4796 X(at)S 175 x(the)S 176 x(device)S +176 x(dependent)S 176 x(server)S 175 x(level.)S 268 x(The)S 175 x +(device)S 177 x(independent)S 176 x(image)S 176 x(extension)S 176 x +(protocol)S 176 x(function)S 2 x(s)S 174 x(\(XIEP\))S 548 y 4796 X +(and)S 166 x(image)S 166 x(speci\211c)S 167 x(resources)S 166 x +(exist)S 167 x(at)S 167 x(the)S 167 x(device)S 167 x(independent)S +168 x(server)S 166 x(level.)S 896 y 4796 X(Extensions)S 171 x(to)S +171 x(X)S 170 x(lib)S 171 x(implement)S 171 x(the)S 171 x(X)S 170 x +(image)S 171 x(extension)S 171 x(protocol)S 2 x(.)S 257 x(XIE_LIB)S +171 x(is)S 170 x(likel)S 2 x(y)S 170 x(to)S 171 x(follow)S 171 x +(the)S 171 x(precedent)S 548 y 4796 X(set)S 166 x(by)S 166 x(the)S +167 x(core)S 166 x(protocol)S 167 x(and)S 167 x(simply)S 166 x +(represent)S 167 x(language)S 167 x(binding)S 2 x(s)S 165 x(of)S +166 x(the)S 167 x(XIE)S 166 x(Protocol.)S 35879 Y 3600 X F40(3\2032)S +449 x(EXTENSION)S 165 x(ARCHI)S -2 x(TECTURE)S 165 x(CONCEPTS)S +1 PP +EP +%%Page 3 23 +1000 BP 39600 30600 PM 0 0 XY +5138 Y 4796 X F78(The)S 175 x(constraint)S 177 x(of)S 175 x +(minimality)S 176 x(for)S 175 x(the)S 176 x(X)S 175 x(Image)S 174 x +(Exte)S 2 x(nsion)S 175 x(Protocol)S 176 x(forces)S 175 x(many)S +175 x(useful)S 175 x(X)S 175 x(Image)S 175 x(Extension)S 548 y 4796 X +(Package)S 175 x(functi)S 2 x(ons)S 174 x(int)S 2 x(o)S 175 x(the)S +175 x(the)S 176 x(software)S 175 x(between)S 176 x(the)S 176 x +(client)S 177 x(and)S 175 x(the)S 176 x(wire:)S 268 x(ie.)S 267 x +(into)S 177 x(the)S 175 x(X)S 175 x(Image)S 175 x(Extension)S 548 y +4796 X(T)S -35 x(oolkit)S 2 x(.)S 258 x(In)S 171 x(essence,)S 172 x +(the)S 172 x(protocol)S 172 x(of)S -9 x(fers)S 171 x(the)S 172 x +(lowest)S 171 x(level)S 173 x(functions)S 172 x(upon)S 171 x(which)S +172 x(higher)S 171 x(level)S 173 x(services)S 171 x(can)S 172 x(be)S +548 y 4796 X(built.)S 263 x(These)S 173 x(higher)S 174 x(level)S +174 x(services)S 173 x(include)S 174 x(things)S 174 x(such)S 172 x +(as)S 173 x(renditi)S 2 x(on)S 172 x(models)S 173 x(and)S 173 x +(control,)S 175 x(and)S 173 x(image)S 173 x(speci\211c)S 548 y 4796 X +(display)S 167 x(constructs)S 167 x(\(widgets,)S 166 x(etc\),)S 166 x +(and)S 167 x(will)S 167 x(be)S 166 x(packaged)S 167 x(in)S 167 x +(the)S 166 x(X)S 166 x(Image)S 166 x(Extension)S 168 x(T)S -35 x +(oolkit)S 2 x(.)S 248 x(\(see)S 166 x(appendix)S 168 x(for)S 547 y +4796 X(a)S 166 x(more)S 165 x(detai)S 2 x(led)S 167 x(discussion)S +166 x(of)S 166 x(renditi)S 2 x(on)S 166 x(distribut)S 2 x(ion)S 166 x +(in)S 167 x(the)S 167 x(X)S 165 x(Image)S 166 x(Extensi)S 2 x(on)S +166 x(Package.)S 9521 Y 3600 X F28(3.3)S 599 x(Global)S 167 x +(Concepts)S 10767 Y 4796 X F78(The)S 184 x(following)S 185 x +(concepts)S 184 x(are)S 184 x(signi\211cant)S 2 x(,)S 187 x(if)S +184 x(not)S 184 x(highly)S 185 x(visible)S 185 x(or)S 184 x(locali)S +2 x(zed,)S 188 x(components)S 184 x(of)S 183 x(the)S 184 x(extensi)S +2 x(on)S 548 y 4796 X(architect)S 2 x(ure.)S 279 x(In)S 182 x +(general,)S 186 x(these)S 182 x(concept)S 2 x(s)S 181 x(are)S 182 x +(important)S 183 x(to)S 182 x(understanding)S 183 x(XIEP)S 181 x +(and)S 182 x(bear)S 182 x(upon)S 182 x(its)S 182 x(overall)S 548 y +4796 X(structure,)S 166 x(content)S 2 x(,)S 166 x(and)S 167 x(use.)S +249 x(They)S 167 x(have)S 167 x(been)S 166 x(segregated)S 168 x +(into)S 167 x(the)S 167 x(global)S 168 x(concepts)S 167 x(section)S +168 x(because)S 167 x(they)S 167 x(do)S 166 x(not)S 547 y 4796 X +(translate)S 167 x(lit)S 2 x(erally)S 167 x(to)S 167 x(any)S 166 x +(one)S 166 x(or)S 166 x(set)S 167 x(of)S 166 x(protocol)S 167 x +(elements.)S 13905 Y 3600 X F28(3.3.1)S 599 x(Final)S 167 x(vs)S +167 x(Revisab)S 2 x(le)S 166 x(Form)S 15001 Y 4796 X F78(Central)S +169 x(to)S 169 x(the)S 169 x(extension)S 169 x(proposal)S 169 x(is)S +168 x(the)S 169 x(relati)S 2 x(onship)S 168 x(between)S 169 x +(revisable)S 170 x(and)S 168 x(\211nal)S 169 x(form)S 168 x(images.)S +253 x(The)S 168 x(content)S 2 x(s)S 548 y 4796 X(of)S 180 x(the)S +181 x(server)S 18 x(')S -27 x(s)S 180 x(image)S 180 x(display)S 182 x +(represents)S 180 x(a)S 181 x(\211nal)S 181 x(form)S 179 x(image.)S +278 x(Thus,)S 183 x(the)S 181 x(viewer)S 181 x(always)S 180 x(sees)S +181 x(and)S 180 x(visuall)S 2 x(y)S 548 y 4796 X(interacts)S 171 x +(with)S 171 x(a)S 170 x(\211nal)S 170 x(form)S 169 x(image.)S 257 x +(Behind)S 171 x(every)S 170 x(\211nal)S 170 x(form)S 170 x(image)S +170 x(which)S 170 x(the)S 171 x(user)S 169 x(views)S 170 x(is)S 170 x +(a)S 170 x(revisable)S 171 x(form)S 548 y 4796 X(image)S 166 x(from)S +165 x(which)S 167 x(the)S 167 x(\211nal)S 166 x(form)S 166 x(image)S +166 x(derives)S 167 x(by)S 166 x(way)S 166 x(of)S 166 x(the)S 167 x +(rendition)S 167 x(process.)S 896 y 4796 X(The)S 175 x(relationshi)S +2 x(p)S 174 x(between)S 176 x(the)S 175 x(revisable)S 176 x(form)S +174 x(image)S 175 x(behind)S 175 x(the)S 175 x(\211nal)S 175 x(form)S +174 x(image)S 175 x(that)S 176 x(the)S 175 x(viewer)S 175 x(sees)S +175 x(may)S 548 y 4796 X(range)S 170 x(from)S 170 x(being)S 171 x +(nearly)S 172 x(identic)S 2 x(al)S 171 x(\(whereupon)S 170 x(the)S +171 x(rendit)S 2 x(ion)S 171 x(process)S 170 x(is)S 171 x(simply)S +171 x(a)S 170 x(logic)S 2 x(al)S 171 x(step)S 171 x(or)S 170 x +(null\))S 171 x(to)S 171 x(one)S 548 y 4796 X(where)S 170 x(the)S +171 x(revisable)S 172 x(form)S 169 x(image)S 171 x(contai)S 2 x(ns)S +170 x(much)S 170 x(more)S 170 x(information)S 172 x(than)S 171 x +(the)S 171 x(\211nal)S 171 x(form)S 170 x(image)S 171 x(on)S 170 x +(the)S 171 x(display)S -31 x(.)S 548 y 4796 X(This)S 166 x(additi)S +2 x(onal)S 167 x(information)S 167 x(might)S 167 x(be)S 166 x +(useful)S 166 x(in)S 167 x(zoom,)S 165 x(locat)S 2 x(e,)S 165 x(or)S +166 x(other)S 167 x(display)S 167 x(operati)S 2 x(ons.)S 897 y 4796 X +(It)S 178 x(is)S 179 x(the)S 179 x(responsibil)S 2 x(ity)S 179 x(of)S +179 x(the)S 179 x(applicat)S 2 x(ion)S 179 x(to)S 179 x(init)S 2 x +(iate)S 179 x(rendit)S 2 x(ion)S 179 x(and)S 179 x(display)S 179 x +(operatio)S 2 x(ns)S 178 x(which)S 179 x(create)S 179 x(a)S 179 x +(\211nal)S 548 y 4796 X(form)S 184 x(image)S 186 x(from)S 185 x(a)S +186 x(revisable)S 187 x(form)S 184 x(image)S 186 x(and)S 186 x +(cause)S 186 x(it)S 186 x(to)S 186 x(become)S 186 x(viewable.)S 289 x +(It)S 186 x(is)S 185 x(the)S 187 x(responsibilit)S 2 x(y)S 185 x(of)S +548 y 4796 X(the)S 172 x(image)S 171 x(extensio)S 2 x(n)S 171 x +(package)S 172 x(\(XIE)S 171 x(toolki)S 2 x(t,)S 172 x(lib,)S 173 x +(and)S 172 x(server\))S 171 x(to)S 172 x(provide)S 172 x(renditi)S +2 x(on)S 171 x(services)S 172 x(which)S 172 x(insulate)S 173 x(the)S +548 y 4796 X(applicat)S 2 x(ion)S 157 x(from)S 156 x(device)S 158 x +(particul)S 2 x(ars.)S 248 x(It)S 157 x(is)S 157 x(also)S 158 x(the)S +157 x(responsibili)S 2 x(ty)S 157 x(of)S 157 x(the)S 157 x(image)S +158 x(extension)S 158 x(package)S 157 x(\(XIE)S 157 x(toolki)S 2 x +(t,)S 547 y 4796 X(lib,)S 168 x(and)S 168 x(server\))S 168 x(to)S +168 x(provide)S 169 x(the)S 168 x(means)S 168 x(to)S 168 x +(associate)S 169 x(rendered)S 169 x(image)S 168 x(locati)S 2 x(ons)S +167 x(\(\211nal)S 169 x(form\))S 167 x(with)S 168 x(revisable)S 169 x +(form)S 548 y 4796 X(locations)S 177 x(\(whenever)S 176 x +(possible\).)S 270 x(This)S 177 x(amounts)S 176 x(to)S 176 x +(providi)S 2 x(ng)S 176 x(an)S 176 x(inverse)S 177 x(to)S 176 x(any)S +177 x(geometric)S 177 x(transform)S 176 x(applied)S 548 y 4796 X +(during)S 166 x(renditi)S 2 x(on.)S 249 x(Obviously)S -32 x(,)S 165 x +(it)S 167 x(is)S 167 x(required)S 166 x(in)S 167 x(order)S 166 x(to)S +167 x(make)S 166 x(screen)S 166 x(image)S 166 x(point)S 2 x(ing)S +166 x(operati)S 2 x(ons)S 165 x(meaningful.)S 897 y 4796 X(The)S +170 x(server)S 171 x(will)S 171 x(also)S 171 x(provide)S 171 x(a)S +171 x(means)S 170 x(by)S 170 x(which)S 171 x(a)S 171 x(\211nal)S +171 x(form)S 169 x(image)S 171 x(may)S 170 x(be)S 171 x(converted)S +171 x(back)S 171 x(into)S 172 x(a)S 170 x(revisable)S 548 y 4796 X +(form)S 172 x(image)S 174 x(\(ie.)S 264 x(attribut)S 2 x(es)S 173 x +(reassociated)S 175 x(with)S 174 x(bitmap\).)S 264 x(Note)S 173 x +(that)S 175 x(the)S 174 x(resulting)S 175 x(revisable)S 174 x(form)S +173 x(image)S 174 x(will)S 174 x(in)S 548 y 4796 X(general)S 167 x +(not)S 166 x(be)S 166 x(ident)S 2 x(ical)S 167 x(to)S 167 x(the)S +166 x(revisable)S 168 x(form)S 165 x(image)S 166 x(from)S 166 x +(which)S 166 x(the)S 167 x(\211nal)S 167 x(form)S 165 x(image)S 167 x +(was)S 165 x(derived.)S 26856 Y 3600 X F28(3.3.2)S 599 x(Image)S +168 x(Data)S 166 x(Representat)S 2 x(ion)S 27952 Y 4796 X F78(Image)S +176 x(data)S 177 x(representati)S 2 x(on)S 176 x(is)S 177 x(a)S 177 x +(generic)S 177 x(issue)S 177 x(which)S 177 x(is)S 176 x(found)S 177 x +(across)S 176 x(the)S 177 x(entire)S 178 x(transfer)S 177 x(model.)S +269 x(Image)S 177 x(data)S 548 y 4796 X(representation)S 174 x +(during)S 173 x(wire)S 173 x(transport)S 174 x(is)S 172 x(chosen)S +173 x(for)S 173 x(applicat)S 2 x(ion)S 173 x(convenienc)S 2 x(e)S +172 x(and)S 173 x(transport)S 174 x(ef)S -9 x(\211ciency)S -31 x(.)S +261 x(Image)S 548 y 4796 X(data)S 162 x(representatio)S 2 x(n)S 161 x +(during)S 162 x(server)S 161 x(storage)S 162 x(is)S 161 x(chosen)S +162 x(for)S 161 x(server)S 161 x(convenien)S 2 x(ce.)S 249 x(Image)S +161 x(data)S 162 x(representati)S 2 x(on)S 161 x(during)S 548 y +4796 X(screen)S 166 x(display)S 167 x(is)S 166 x(chosen)S 167 x(for)S +165 x(complianc)S 2 x(e)S 166 x(with)S 166 x(displa)S 2 x(y)S 166 x +(hardware)S 166 x(requirements.)S 897 y 4796 X(T)S -35 x(wo)S 172 x +(particul)S 2 x(arly)S 172 x(thorny)S 173 x(conceptu)S 2 x(al)S 172 x +(issues)S 173 x(involve)S 173 x(the)S 173 x(concept)S 174 x(of)S +172 x(the)S 173 x("pixel".)S 262 x(The)S 173 x(\211rst)S 172 x(one)S +173 x(has)S 172 x(to)S 173 x(do)S 172 x(with)S 548 y 4796 X(what)S +166 x(is)S 167 x(this)S 167 x(logica)S 2 x(l)S 167 x(thing)S 167 x +(known)S 166 x(as)S 167 x(a)S 166 x(pixel)S 168 x(especial)S 2 x(ly)S +167 x(as)S 166 x(it)S 167 x(relat)S 2 x(es)S 166 x(to)S 167 x +(various)S 167 x(data)S 167 x(or)S -9 x(ganizat)S 2 x(ions.)S 249 x +(The)S 167 x(second)S 548 y 4796 X(addresses)S 165 x(discrete)S 168 x +(versus)S 165 x(conti)S 2 x(nuous)S 166 x(pixel)S 167 x(values.)S +35879 Y 16766 X F40(EXTENSION)S 165 x(ARCHITEC)S -2 x(TURE)S 166 x +(CONC)S -2 x(EPTS)S 449 x(3\2033)S +1 PP +EP +%%Page 4 24 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 3600 X F36(3.3.2.1)S 599 x(Aternate)S 165 x(Data)S 166 x +(Organization)S 2 x(s)S 166 x(and)S 166 x(Pixels)S 896 y 4796 X F78 +(The)S 182 x(concept)S 183 x(of)S 182 x(a)S 182 x(regular)S -19 x(,)S +185 x(two-dimensional)S 183 x(grid)S 182 x(is)S 183 x(central)S 183 x +(to)S 182 x(both)S 183 x(the)S 182 x(image)S 183 x(capture)S 182 x +(and)S 183 x(image)S 182 x(display)S 548 y 4796 X(processes)S 171 x +(as)S 171 x(both)S 172 x(image)S 172 x(data)S 172 x(sampling)S 172 x +(and)S 172 x(image)S 171 x(displa)S 2 x(y)S 171 x(are)S 172 x(done)S +171 x(on)S 172 x(a)S 171 x(regular)S -19 x(,)S 172 x(two)S 172 x +(dimensional)S 172 x(grid.)S 260 x(In)S 548 y 4796 X(general,)S 168 x +(the)S 169 x(sampling)S 169 x(and)S 168 x(display)S 169 x(grids)S +168 x(will)S 169 x(not)S 169 x(be)S 168 x(of)S 168 x(the)S 169 x +(same)S 167 x(form)S 168 x(or)S 168 x(size.)S 253 x(W)S -40 x(e)S +168 x(will)S 169 x(use)S 168 x(the)S 169 x(term)S 168 x(pixel)S 169 x +(to)S 548 y 4796 X(mean)S 169 x(a)S 171 x(capture)S 171 x(or)S 170 x +(display)S 171 x(grid)S 170 x(locat)S 2 x(ion.)S 257 x(This)S 171 x +(section)S 171 x(addresses)S 170 x(the)S 170 x(associat)S 2 x(ion)S +170 x(between)S 171 x(image)S 170 x(informati)S 2 x(on)S 548 y 4796 X +(and)S 166 x(pixels.)S 897 y 4796 X(The)S 169 x(relationshi)S 2 x(p)S +168 x(between)S 169 x(image)S 169 x(data)S 169 x(representat)S 2 x +(ion)S 169 x(and)S 168 x(pixel)S 2 x(s)S 168 x(is)S 168 x(potent)S +2 x(ially)S 170 x(meaningful)S 169 x(only)S 169 x(at)S 169 x(the)S +169 x(capture)S 548 y 4796 X(and)S 182 x(display)S 184 x(points)S +183 x(in)S 183 x(the)S 183 x(transfer)S 182 x(model.)S 282 x(The)S +183 x(relation)S 2 x(ship)S 182 x(is)S 183 x(potenti)S 2 x(ally)S +183 x(meaningless)S 183 x(at)S 183 x(other)S 183 x(points)S 183 x +(in)S 548 y 4796 X(the)S 182 x(model)S 182 x(\(especially)S 183 x +(places)S 182 x(where)S 182 x(image)S 181 x(data)S 183 x(is)S 182 x +(kept)S 182 x(in)S 182 x(compressed)S 181 x(format\).)S 279 x(Most)S +182 x(displays)S 182 x(prescribe)S 548 y 4796 X(the)S 181 x(relati)S +2 x(onship)S 182 x(between)S 181 x(the)S 182 x(underlying)S 183 x +(data)S 182 x(that)S 182 x(goes)S 181 x(into)S 182 x(making)S 181 x +(up)S 182 x(a)S 181 x(display')S -27 x(s)S 181 x(pixel)S 183 x(at)S +181 x(display)S 182 x(time)S 547 y 4796 X(\(i.e.)S 269 x(the)S 177 x +(structure)S 177 x(of)S 176 x(a)S 177 x(pixel\).)S 270 x(Although)S +178 x(it)S 177 x(is)S 177 x(a)S 176 x(convenient)S 178 x(concept,)S +180 x(it)S 177 x(is)S 177 x(a)S 176 x(mistake)S 177 x(to)S 177 x +(assume)S 176 x(that)S 178 x(behind)S 548 y 4796 X(a)S 172 x +(display)S 174 x(screen,)S 174 x(the)S 173 x(information)S 174 x +(that)S 174 x(goes)S 173 x(into)S 173 x(light)S 2 x(ing)S 173 x(up)S +173 x(a)S 173 x(pixel)S 173 x(can)S 173 x(be)S 173 x(found)S 173 x +(as)S 173 x(a)S 172 x(stack)S 174 x(of)S 172 x(bits.)S 263 x(While)S +548 y 4796 X(some)S 175 x(displays)S 177 x(do)S 176 x(require)S 177 x +(that)S 177 x(all)S 178 x(the)S 176 x(information)S 178 x(which)S +176 x(makes)S 176 x(up)S 176 x(a)S 176 x(pixel)S 178 x(be)S 176 x +(gathered)S 177 x(togethe)S 2 x(r)S 176 x(into)S 177 x(a)S 176 x +(bit)S 548 y 4796 X(string)S 178 x(\(ie.)S 272 x(multipl)S 2 x(e)S +178 x(chrominance)S 178 x(channels)S 179 x(are)S 177 x(gathered)S +179 x(togethe)S 2 x(r)S 177 x(on)S 178 x(a)S 178 x(pixel)S 179 x +(basis\),)S 180 x(others)S 178 x(require)S 178 x(it)S 179 x(to)S +178 x(be)S 548 y 4796 X(separated)S 175 x(by)S 174 x(chrominance)S +175 x(channel.)S 266 x(The)S 175 x(situati)S 2 x(on)S 174 x(grows)S +174 x(more)S 174 x(complex)S 175 x(when)S 174 x(we)S 174 x(consider)S +175 x(displays)S 175 x(which)S 548 y 4796 X(allow)S 184 x(dif)S -9 x +(ferent)S 185 x(bandwitdhs)S 184 x(per)S 184 x(channel)S 185 x +(between)S 184 x(luminance)S 185 x(and)S 184 x(chrominance)S 184 x +(channels)S 185 x(or)S 183 x(just)S 185 x(between)S 548 y 4796 X +(dif)S -9 x(ferent)S 171 x(chrominance)S 171 x(channels.)S 258 x +(Thus,)S 172 x(the)S 171 x(relationshi)S 2 x(p)S 170 x(between)S +171 x(a)S 171 x(pixel)S 171 x(\(as)S 170 x(a)S 171 x(display-grid)S +172 x(element\))S 171 x(and)S 171 x(the)S 548 y 4796 X(underlying)S +172 x(image)S 171 x(data)S 171 x(and)S 171 x(its)S 171 x +(representati)S 2 x(on)S 171 x(is)S 171 x(potential)S 2 x(ly)S 171 x +(a)S 171 x(complex)S 171 x(one)S 171 x(and)S 171 x(not)S 171 x +(necessarily)S 172 x(a)S 170 x(one-to-one)S 548 y 4796 X +(correspondence)S 166 x(between)S 167 x(pixel)S 167 x(value,)S 167 x +(luminance,)S 167 x(and)S 166 x(chrominance.)S 897 y 4796 X(For)S +169 x(polychromatic)S 171 x(or)S 169 x(multispect)S 2 x(ral)S 170 x +(images,)S 170 x(the)S 170 x(various)S 170 x(representati)S 2 x(ons)S +169 x(which)S 170 x(provide)S 170 x(for)S 169 x(either)S 171 x +(separate)S 170 x(or)S 548 y 4796 X(integrated)S 168 x(luminance)S +168 x(and)S 167 x(chrominance)S 167 x(information,)S 167 x(and)S +167 x(for)S 166 x(eithe)S 2 x(r)S 166 x(equal)S 167 x(or)S 167 x +(dif)S -9 x(ferent)S 167 x(bandwidth)S 168 x(\(information)S 548 y +4796 X(content\))S 173 x(between)S 174 x(luminance)S 173 x(and)S +173 x(chrominance)S 173 x(channels)S 174 x(or)S 172 x(between)S 173 x +(multipl)S 2 x(e)S 172 x(chrominance)S 174 x(channels)S 173 x +(creates)S 547 y 4796 X(a)S 179 x(potenti)S 2 x(al)S 179 x(mismatch)S +180 x(between)S 180 x(the)S 180 x(front)S 179 x(end)S 180 x(of)S +179 x(the)S 180 x(transfer)S 179 x(model)S 180 x(\(before)S 179 x +(display)S 180 x(and)S 179 x("pixe)S 2 x(ls"\),)S 182 x(and)S 179 x +(the)S 548 y 4796 X(backend)S 181 x(\(at)S 182 x(display)S 182 x +(and)S 181 x("pixel)S 2 x(s"\).)S 278 x(For)S 181 x(the)S 181 x +(monochromatic)S 182 x(digit)S 2 x(al)S 181 x(image)S 182 x +(classes,)S 184 x(this)S 182 x(problem)S 181 x(does)S 181 x(not)S +548 y 4796 X(exist.)S 897 y 4796 X(The)S 176 x(X)S 176 x(image)S +177 x(extension)S 177 x(package)S 177 x(will)S 177 x(deal)S 177 x +(with)S 177 x(both)S 177 x(matches)S 176 x(and)S 177 x(mismatches)S +176 x(between)S 177 x(image)S 177 x(data)S 177 x(repre-)S 548 y +4796 X(sentation)S 179 x(structure)S 180 x(and)S 178 x(content)S +180 x(at)S 178 x(the)S 179 x(display)S 180 x(boundary)S 178 x(in)S +179 x(the)S 179 x(transfer)S 178 x(model.)S 273 x(As)S 178 x(such,)S +181 x(it)S 179 x(will)S 179 x(deal)S 179 x(with)S 548 y 4796 X +(matches)S 174 x(and)S 173 x(mismatches)S 174 x(in)S 174 x +(representat)S 2 x(ion)S 174 x(\(RGB)S 174 x(vs)S 173 x(YIQ)S 173 x +(vs)S 173 x(...\))S 263 x(and)S 174 x(content)S 175 x(\(equal)S 174 x +(vs)S 174 x(unequal)S 175 x(bandwidth)S 548 y 4796 X(between)S 183 x +(luminanc)S 2 x(e)S 183 x(and)S 183 x(chrominance)S 184 x(channel)S +2 x(s,)S 186 x(and)S 184 x(between)S 184 x(multiple)S 185 x +(chrominance)S 184 x(channels\).)S 283 x(It)S 184 x(is)S 183 x(the)S +548 y 4796 X(server)S 18 x(')S -28 x(s)S 173 x(responsibil)S 2 x +(ity)S 174 x(to)S 173 x(convert)S 174 x(from)S 173 x(the)S 174 x +(applicat)S 2 x(ion)S 173 x(representat)S 2 x(ion)S 173 x(into)S +175 x(a)S 173 x(representati)S 2 x(on)S 173 x(and)S 173 x(pixel)S +175 x(struc-)S 548 y 4796 X(ture)S 175 x(amenable)S 175 x(to)S 176 x +(server)S 174 x(based)S 175 x(enhancement)S 176 x(processing.)S 267 x +(It)S 175 x(is)S 175 x(the)S 175 x(responsibili)S 2 x(ty)S 175 x(of)S +175 x(the)S 175 x(X)S 175 x(Image)S 174 x(Extensio)S 2 x(n)S 548 y +4796 X(Package)S 174 x(\(XIE)S 172 x(tool)S 2 x(kit,)S 175 x(XIE)S +173 x(lib,)S 176 x(and)S 173 x(XIE)S 173 x(server\))S 173 x(to)S +174 x(provide)S 174 x(for)S 173 x(the)S 174 x(conversion)S 174 x(of)S +173 x(image)S 174 x(data)S 174 x(into)S 174 x(a)S 174 x(format)S +548 y 4796 X(compatible)S 167 x(with)S 167 x(that)S 167 x +(recognized)S 168 x(by)S 166 x(the)S 166 x(display)S 168 x +(subsystem)S 165 x(\(renditi)S 2 x(on)S 166 x(process\).)S 25594 Y +3600 X F36(3.3.2.2)S 599 x(Discrete)S 166 x(vs)S 166 x(Continuou)S +2 x(s)S 166 x(Pixels)S 897 y 4796 X F78(This)S 183 x(section)S 184 x +(focuses)S 182 x(on)S 183 x(the)S 184 x(representation)S 184 x(of)S +183 x(the)S 183 x(intensi)S 2 x(ty)S 183 x(function)S 184 x(for)S +182 x(a)S 183 x(digit)S 2 x(al)S 183 x(image)S 183 x(in)S 183 x(the)S +184 x(X)S 182 x(Image)S 548 y 4796 X(Extension.)S 291 x(In)S 187 x +(particula)S 2 x(r)S -20 x(,)S 191 x(it)S 188 x(will)S 188 x +(examine)S 187 x(where)S 187 x(in)S 187 x(the)S 187 x(Image)S 187 x +(extension)S 188 x(the)S 187 x(inte)S 2 x(nsity)S 187 x(must)S 187 x +(be)S 187 x(discrete)S 548 y 4796 X(\(quantized)S 168 x(to)S 168 x +(a)S 167 x(\211xed)S 167 x(number)S 167 x(of)S 167 x(levels)S 168 x +(-)S 167 x(intege)S 2 x(r\),)S 166 x(and)S 167 x(where)S 167 x(it)S +168 x(may)S 167 x(be)S 167 x(conti)S 2 x(nuous)S 167 x(\(in\211nite)S +168 x(number)S 167 x(of)S 167 x(level)S 2 x(s)S 547 y 4796 X(-)S +165 x(real\).)S 897 y 4796 X(The)S 185 x(image)S 186 x(concepts)S +187 x(sections)S 186 x(on)S 185 x(capture,)S 191 x(synthesis,)S 191 x +(and)S 185 x(representati)S 2 x(on)S 185 x(stressed)S 186 x(that)S +186 x(digi)S 2 x(tal)S 186 x(images)S 186 x(are)S 548 y 4796 X +(discrete)S 166 x(enti)S 2 x(ties)S 166 x(\(spatial)S 2 x(ly)S 166 x +(sampled)S 166 x(and)S 166 x(quantize)S 2 x(d\).)S 248 x(As)S 165 x +(capture)S 167 x(and)S 166 x(synthesis)S 166 x(are)S 166 x(clie)S +2 x(nt)S 166 x(issues)S 166 x(\(outside)S 166 x(of)S 166 x(the)S +548 y 4796 X(domain)S 169 x(of)S 168 x(the)S 169 x(image)S 170 x +(extension\),)S 170 x(the)S 169 x(client)S 170 x(may)S 169 x(do)S +169 x(as)S 168 x(it)S 170 x(wishes,)S 169 x(but)S 169 x(the)S 169 x +(image)S 169 x(extension)S 170 x(encourages)S 169 x(cli)S 2 x(ents)S +548 y 4796 X(to)S 166 x(consider)S 167 x(only)S 166 x(fully)S 167 x +(quanti)S 2 x(zed)S 166 x(2d)S 166 x(arrays)S 166 x(as)S 166 x +(digit)S 2 x(al)S 167 x(images.)S 897 y 4796 X(This)S 182 x(policy)S +184 x(becomes)S 181 x(bindi)S 2 x(ng)S 182 x(at)S 182 x(wire)S 183 x +(transport)S 182 x(time)S 183 x(where)S 182 x(transport)S 183 x +(will)S 183 x(only)S 183 x(include)S 183 x(support)S 183 x(for)S +181 x(fully)S 548 y 4796 X(quantized)S 185 x(\(positive)S 185 x +(inte)S 2 x(gral)S 184 x(valued\))S 185 x(digital)S 186 x(images)S +184 x(in)S 184 x(uncompressed)S 184 x(formats)S 183 x(\(the)S 185 x +(bits)S 185 x(represent)S 184 x(integer)S 547 y 4796 X(values)S 179 x +(of)S 179 x(inten)S 2 x(sity)S 179 x(for)S 179 x(components\),)S +182 x(and)S 180 x(compressed)S 178 x(forms)S 179 x(where)S 179 x +(the)S 179 x(bits)S 180 x(represent)S 180 x(code)S 179 x(sequences)S +180 x(for)S 548 y 4796 X(compression)S 180 x(schemes.)S 277 x(In)S +181 x(other)S 181 x(words,)S 183 x(the)S 181 x(wire)S 181 x +(transport)S 181 x(machinery)S 181 x(will)S 182 x(NOT)S 180 x +(provide)S 181 x(support)S 181 x(for)S 181 x(real)S 548 y 4796 X +(valued)S 167 x(\(\212oating)S 167 x(point\))S 167 x(image)S 166 x +(inten)S 2 x(sities.)S 35879 Y 3600 X F40(3\2034)S 449 x(EXTENSION)S +165 x(ARCHI)S -2 x(TECTURE)S 165 x(CONCEPTS)S +1 PP +EP +%%Page 5 25 +1000 BP 39600 30600 PM 0 0 XY +5138 Y 4796 X F78(This)S 178 x(same)S 178 x(policy)S 180 x(applies)S +179 x(within)S 179 x(the)S 179 x(server)S 178 x(at)S 179 x(post)S +179 x(rendition)S 180 x(and)S 178 x(display)S 179 x(time.)S 274 x +(Final)S 179 x(form)S 178 x(image)S 178 x(object)S 2 x(s)S 548 y +4796 X(on)S 175 x(the)S 176 x(server)S 175 x(will)S 176 x(be)S 176 x +(integral)S 177 x(valued)S 176 x(entit)S 2 x(ies.)S 267 x(Obviously)S +-31 x(,)S 177 x(rendition)S 177 x(implies)S 176 x(this)S 176 x(as)S +175 x(all)S 177 x(workstation)S 176 x(display)S 548 y 4796 X +(machinery)S 166 x(requires)S 167 x(this.)S 896 y 4796 X(It)S 179 x +(is)S 180 x(during)S 181 x(revisable)S 180 x(form)S 179 x +(representat)S 2 x(ion)S 180 x(of)S 180 x(image)S 180 x(objects)S +180 x(on)S 180 x(the)S 181 x(server)S 179 x(that)S 181 x(full)S 180 x +(quanti)S 2 x(zation)S 181 x(and)S 180 x(inte-)S 548 y 4796 X(gral)S +181 x(value)S 182 x(only)S 181 x(may)S 181 x(be)S 181 x(relaxed.)S +279 x(The)S 182 x(purpose)S 181 x(for)S 181 x(its)S 181 x(relaxat)S +2 x(ion)S 181 x(is)S 181 x(the)S 182 x(nature)S 182 x(of)S 180 x +(image)S 182 x(processing)S 181 x(\(both)S 548 y 4796 X(enhancement)S +166 x(and)S 166 x(rendit)S 2 x(ion\).)S 249 x(The)S 166 x(result)S +167 x(of)S 165 x(applyi)S 2 x(ng)S 166 x(an)S 165 x(image)S 167 x +(operator)S 166 x(to)S 166 x(image)S 167 x(data)S 166 x(may)S 166 x +(in)S 166 x(some)S 165 x(instanc)S 2 x(es)S 548 y 4796 X(be)S 179 x +(considered)S 179 x(by)S 180 x(the)S 179 x(user)S 179 x(to)S 179 x +(be)S 180 x(a)S 179 x(new)S 178 x(image,)S 183 x(while)S 179 x(in)S +180 x(others)S 179 x(it)S 180 x(may)S 179 x(simply)S 179 x(be)S 179 x +(considered)S 180 x(as)S 179 x(a)S 179 x(two)S 179 x(di-)S 548 y +4796 X(mensional)S 176 x(array)S 176 x(of)S 176 x(computati)S 2 x +(onal)S 176 x(data)S 177 x(results.)S 269 x(The)S 177 x(choice)S +177 x(is)S 176 x(often)S 176 x(but)S 177 x(not)S 176 x(always)S 177 x +(more)S 175 x(a)S 176 x(matter)S 177 x(of)S 176 x(user)S 548 y 4796 X +(perspective)S 179 x(and)S 179 x(intende)S 2 x(d)S 178 x(usage)S +179 x(than)S 179 x(of)S 178 x(image)S 179 x(operator)S 179 x +(semantics.)S 274 x(In)S 178 x(particul)S 2 x(ar)S -20 x(,)S 181 x +(many)S 178 x(image)S 179 x(processing)S 548 y 4796 X(operations)S +172 x(may)S 171 x(produce)S 172 x(non)S 171 x(integral)S 173 x(or)S +171 x(negati)S 2 x(ve)S 171 x(output)S 172 x(values.)S 260 x +(Examples)S 172 x(include)S 173 x(the)S 172 x(arithmetic)S 173 x +(operators)S 548 y 4796 X("divide",)S 167 x(and)S 166 x("subtract)S +2 x(".)S 897 y 4796 X(There)S 181 x(are)S 181 x(two)S 181 x +(possible)S 181 x(solutio)S 2 x(ns)S 180 x(to)S 181 x(this)S 182 x +(problem:)S 279 x(the)S 181 x(\211rst)S 181 x(is)S 181 x(to)S 181 x +(require)S 181 x(that)S 182 x(image)S 181 x(object)S 2 x(s)S 180 x +(remain)S 181 x(fully)S 547 y 4796 X(quantized)S 172 x(at)S 171 x +(all)S 171 x(times,)S 171 x(and)S 171 x(therefore)S 171 x(expressly)S +171 x(de\211ne)S 171 x(the)S 171 x(semantics)S 171 x(of)S 170 x +(each)S 171 x(and)S 171 x(every)S 170 x(image)S 171 x(operator)S +171 x(such)S 548 y 4796 X(that)S 175 x(this)S 175 x(is)S 174 x +(preserved.)S 265 x(In)S 174 x(the)S 175 x(divisi)S 2 x(on)S 174 x +(case,)S 176 x(one)S 174 x(such)S 175 x(policy)S 175 x(is)S 175 x +(to)S 174 x(implement)S 175 x(only)S 175 x(an)S 175 x(integer)S 175 x +(divide)S 176 x(which)S 548 y 4796 X(truncates.)S 287 x(A)S 184 x +(second)S 185 x(strategy)S 186 x(is)S 185 x(to)S 185 x(allow)S 185 x +(real)S 186 x(values)S 185 x(in)S 185 x(server)S 185 x(based)S 185 x +(revisable)S 186 x(form)S 184 x(image)S 185 x(objects)S 186 x(and)S +548 y 4796 X(delay)S 170 x(the)S 171 x(\211nal)S 170 x(quantiz)S +2 x(ation)S 171 x(until)S 171 x(renditi)S 2 x(on)S 170 x(time.)S +256 x(Obviously)S -31 x(,)S 170 x(the)S 170 x(display)S 171 x +(device)S 171 x(can)S 170 x(not)S 171 x(deal)S 170 x(with)S 171 x +(these)S 170 x(non)S 548 y 4796 X(integral)S 174 x(values,)S 174 x +(and)S 173 x(if)S 173 x(these)S 173 x(data)S 173 x(arrays)S 173 x +(are)S 173 x(to)S 173 x(be)S 172 x(treat)S 2 x(ed)S 172 x(as)S 173 x +(images)S 172 x(for)S 173 x(display)S 173 x(purposes,)S 174 x(at)S +173 x(renditi)S 2 x(on)S 172 x(time)S 548 y 4796 X(the)S 166 x +(situat)S 2 x(ion)S 166 x(must)S 166 x(be)S 167 x(corrected.)S 897 y +4796 X(The)S 169 x(policy)S 171 x(will)S 170 x(be)S 169 x(to)S 170 x +(allow)S 170 x(image)S 169 x(enhancement)S 170 x(and)S 170 x +(rendition)S 170 x(operators)S 170 x(to)S 170 x(produce)S 169 x +(image)S 170 x(objects)S 170 x(with)S 170 x(real)S 548 y 4796 X +(values)S 168 x(\(rather)S 168 x(than)S 169 x(integer\).)S 253 x +(Protocol)S 169 x(function)S 2 x(s)S 167 x(\(image)S 168 x +(operators\))S 168 x(which)S 169 x(must)S 167 x(produce)S 169 x(one)S +168 x(or)S 167 x(the)S 169 x(other)S 168 x(will)S 548 y 4796 X(note)S +158 x(it)S 159 x(in)S 159 x(their)S 159 x(de\211nitio)S 2 x(n.)S +248 x(Note)S 159 x(that)S 159 x(this)S 158 x(has)S 158 x(no)S 158 x +(bearing)S 159 x(on)S 158 x(the)S 159 x(integral)S 160 x(valued)S +159 x(only)S 159 x(position)S 159 x(at)S 159 x(wire)S 158 x +(transport)S 548 y 4796 X(and)S 166 x(display)S 167 x(other)S 167 x +(than)S 166 x(perhaps)S 167 x(the)S 166 x(potent)S 2 x(ail)S 167 x +(need)S 166 x(for)S 166 x(an)S 167 x(explicit)S 168 x(quantizi)S +2 x(ng)S 166 x(protocol)S 167 x(functi)S 2 x(on.)S 19185 Y 3600 X +F28(3.3.3)S 599 x(Layou)S 2 x(t)S 166 x(&)S 165 x(Coordinate)S 167 x +(Systems)S 20281 Y 4796 X F78(Implicit)S 178 x(in)S 177 x(all)S 178 x +(display)S 178 x(packages)S 177 x(are)S 177 x(the)S 177 x(coordinat)S +2 x(e)S 177 x(systems)S 176 x(used)S 177 x(by)S 177 x(the)S 177 x +(package)S 178 x(and)S 177 x(their)S 177 x(relat)S 2 x(ionship)S +177 x(to)S 548 y 4796 X(coordinate)S 178 x(systems)S 176 x(used)S +177 x(withi)S 2 x(n)S 177 x(the)S 177 x(applic)S 2 x(ation)S 178 x +(model.)S 270 x(At)S 177 x(a)S 177 x(somewhat)S 177 x(less)S 177 x +(abstract)S 178 x(level)S 179 x(are)S 177 x(the)S 177 x(display)S +548 y 4796 X(layout)S 168 x(problems)S 167 x(that)S 168 x(an)S 168 x +(applicat)S 2 x(ion)S 167 x(must)S 167 x(deal)S 168 x(with)S 168 x +(and)S 167 x(the)S 168 x(machinery)S 168 x(required)S 168 x(to)S +167 x(accomplish)S 168 x(these)S 168 x(layouts.)S 548 y 4796 X(The)S +180 x(next)S 182 x(few)S 180 x(subsections)S 181 x(provide)S 181 x +(an)S 181 x(overview)S 181 x(of)S 180 x(the)S 181 x(extension)S 182 x +(package)S 181 x(coordinate)S 182 x(systems)S 180 x(and)S 181 x +(layout)S 548 y 4796 X(concepts.)S 23967 Y 3600 X F36(3.3.3.1)S 599 x +(Coordinate)S 167 x(Systems)S 897 y 4796 X F78(By)S 178 x(our)S 177 x +(de\211nit)S 2 x(ion,)S 181 x(continuous,)S 181 x(two-dimensional)S +179 x(images)S 178 x(\(at)S 179 x(the)S 178 x(focal)S 179 x(plane\))S +179 x(have)S 178 x(dependencie)S 2 x(s)S 177 x(upon)S 178 x(two)S +548 y 4796 X(spatial)S 176 x(coordinat)S 2 x(es)S 175 x(\(planar\),)S +178 x(time,)S 177 x(and)S 176 x(wavelength.)S 268 x(This)S 176 x +(sectio)S 2 x(n)S 175 x(examines)S 176 x(some)S 174 x(of)S 176 x +(the)S 176 x(coordinate)S 176 x(system)S 548 y 4796 X(issues)S 166 x +(involved)S 167 x(in)S 167 x(the)S 166 x(extensi)S 2 x(on)S 166 x +(package)S 167 x(regarding)S 167 x(these)S 166 x(coordinat)S 2 x +(es.)S 27454 Y 3600 X F36(3.3.3.1.)S 2 x(1)S 597 x(Spatial)S 168 x +(Coordinate)S 167 x(Systems)S 897 y 4796 X F78(The)S 186 x(image)S +187 x(extension)S 187 x(package)S 187 x(does)S 186 x(not)S 187 x +(provide)S 187 x(for)S 186 x(any)S 186 x(world)S 187 x(coordinate)S +187 x(system.)S 289 x(Therefore,)S 191 x(it)S 187 x(is)S 187 x(not)S +548 y 4796 X(possible)S 171 x(through)S 171 x(the)S 172 x(image)S +171 x(extension)S 172 x(protocol)S 171 x(to)S 172 x(maintain)S 172 x +(relation)S 2 x(ships)S 170 x(back)S 171 x(to)S 172 x(real)S 171 x +(world)S 171 x(objects,)S 172 x(scenes,)S 548 y 4796 X(and)S 184 x +(relati)S 2 x(onships)S 184 x(within)S 185 x(them.)S 286 x(It)S 184 x +(is)S 184 x(left)S 186 x(to)S 184 x(those)S 185 x(imaging)S 185 x +(applica)S 2 x(tions)S 185 x(that)S 185 x(require)S 185 x(such)S +184 x(capabil)S 2 x(ities)S 185 x(to)S 548 y 4796 X(maintain)S 169 x +(and)S 168 x(conduct)S 169 x(their)S 169 x(own)S 168 x(conversion)S +169 x(from)S 167 x(a)S 168 x(private)S 170 x(world)S 168 x +(coordinate)S 169 x(system)S 168 x(to)S 169 x(the)S 168 x(system)S +168 x(of)S 168 x(device)S 547 y 4796 X(and)S 171 x(image)S 171 x +(object)S 172 x(coordinate)S 2 x(s)S 170 x(supported)S 171 x(by)S +171 x(the)S 172 x(extension)S 172 x(package,)S 172 x(and)S 171 x(to)S +172 x(relate)S 172 x(graphic)S 171 x(and)S 171 x(image)S 172 x +(display)S 548 y 4796 X(service)S 166 x(requests)S 167 x(to)S 166 x +(a)S 166 x(shared)S 167 x(world)S 166 x(coordinate)S 167 x(system.)S +897 y 4796 X(The)S 189 x(image)S 188 x(extensi)S 2 x(on)S 188 x +(package)S 190 x(does)S 188 x(not)S 189 x(support)S 189 x +(three-dimensiona)S 2 x(l)S 188 x(images)S 189 x(\(depth)S 189 x +(information\))S 190 x(and)S 189 x(as)S 548 y 4796 X(such)S 179 x +(perspecti)S 2 x(ve)S 180 x(transforms)S 179 x(and)S 180 x(all)S +181 x(three-)S 180 x(dimensional)S 182 x(imaging)S 180 x(operati)S +2 x(ons)S 179 x(must)S 180 x(be)S 180 x(managed)S 180 x(within)S +181 x(the)S 548 y 4796 X(applicat)S 2 x(ion)S 172 x(\(above)S 172 x +(the)S 172 x(client)S 2 x(\).)S 259 x(A)S 171 x(three-dimensio)S +2 x(nal)S 172 x(image)S 172 x(applicat)S 2 x(ion)S 172 x(can)S 172 x +(still)S 173 x(use)S 171 x(the)S 173 x(image)S 172 x(extension)S +172 x(by)S 548 y 4796 X(feeding)S 166 x(it)S 167 x(two-dimensional)S +168 x(slices)S 167 x(or)S 166 x(projecti)S 2 x(ons.)S 35879 Y 16766 X +F40(EXTENSION)S 165 x(ARCHITEC)S -2 x(TURE)S 166 x(CONC)S -2 x(EPTS)S +449 x(3\2035)S +1 PP +EP +%%Page 6 26 +1000 BP 39600 30600 PM 0 0 XY +5138 Y 4796 X F78(The)S 174 x(image)S 175 x(extension)S 176 x +(package)S 175 x(uses)S 174 x(the)S 175 x(device)S 175 x(coordinat)S +2 x(es)S 174 x(\(screen)S 175 x(and)S 174 x(window)S 174 x(relat)S +2 x(ive\))S 174 x(as)S 175 x(de\211ned)S 174 x(by)S 175 x(the)S 548 y +4796 X(core)S 166 x(X1)S -19 x(1)S 166 x(protocol)S 168 x(in)S 166 x +(all)S 167 x(display)S 167 x(requests.)S 896 y 4796 X(In)S 171 x +(addition)S 173 x(to)S 171 x(this)S 172 x(device)S 172 x(coordinat)S +2 x(e)S 171 x(system,)S 172 x(the)S 172 x(extension)S 172 x +(protocol)S 172 x(de\211nes)S 172 x(an)S 171 x(image)S 172 x(object)S +172 x(\(IOB\))S 171 x(relativ)S 2 x(e)S 548 y 4796 X(coordinate)S +167 x(system.)S 249 x(Regardless)S 166 x(of)S 166 x(the)S 167 x +(data)S 167 x(or)S -9 x(ganizat)S 2 x(ion)S 166 x(at)S 167 x +(transport)S 167 x(time,)S 166 x(or)S 166 x(the)S 167 x(internal)S +168 x(data)S 166 x(or)S -9 x(ganiza)S 2 x(tion)S 167 x(of)S 548 y +4796 X(an)S 167 x(image)S 168 x(object,)S 168 x(all)S 168 x(image)S +168 x(objects)S 168 x(have)S 168 x(their)S 168 x(own)S 167 x +(integral)S 2 x(,)S 167 x(two-dimensional,)S 168 x(recti)S 2 x +(linear)S -19 x(,)S 167 x(attache)S 2 x(d)S 167 x(coordinate)S 548 y +4796 X(system.)S 254 x(For)S 168 x(monochromatic)S 170 x(images,)S +169 x(there)S 170 x(is)S 169 x(no)S 169 x(confusion,)S 170 x(but)S +169 x(for)S 169 x(situat)S 2 x(ions)S 169 x(where)S 169 x(the)S 169 x +(bandwidth)S 170 x(between)S 548 y 4796 X(luminance)S 177 x(and)S +177 x(chrominance)S 178 x(channels)S 178 x(dif)S -9 x(fers,)S 179 x +(or)S 177 x(that)S 177 x(between)S 178 x(multipl)S 2 x(e)S 176 x +(chrominance)S 178 x(channels)S 178 x(dif)S -9 x(fers,)S 179 x(the)S +548 y 4796 X(coordinate)S 173 x(systems)S 171 x(of)S 171 x(the)S +172 x(image)S 172 x(object)S 173 x(applie)S 2 x(s)S 171 x(to)S 172 x +(the)S 172 x(highest)S 173 x(bandwidth)S 172 x(\(biggest\))S 173 x +(component.)S 260 x(All)S 172 x(regions)S 548 y 4796 X(of)S 165 x +(int)S 2 x(erest)S 166 x(are)S 166 x(de\211ned)S 167 x(relativ)S +2 x(e)S 166 x(to)S 166 x(the)S 167 x(image)S 166 x(object)S 168 x +(coordinate)S 168 x(system.)S 897 y 4796 X(Renditi)S 2 x(on)S 185 x +(is)S 186 x(the)S 186 x(point)S 187 x(of)S 185 x(align)S 2 x(ment)S +185 x(or)S 186 x(conversion)S 186 x(between)S 186 x(image)S 186 x +(object)S 187 x(and)S 186 x(device)S 187 x(coordinates.)S 289 x(The)S +548 y 4796 X(extension)S 176 x(protocol)S 175 x(provides)S 176 x +(the)S 175 x(means)S 174 x(by)S 175 x(which)S 175 x(a)S 175 x +(locati)S 2 x(on)S 175 x(within)S 176 x(a)S 174 x(rendered)S 175 x +(image)S 176 x(\(expressed)S 174 x(in)S 175 x(device)S 548 y 4796 X +(coordinates\))S 184 x(can)S 183 x(be)S 183 x(converted)S 184 x +(back)S 183 x(into)S 184 x(a)S 183 x(locati)S 2 x(on)S 182 x(withi)S +2 x(n)S 182 x(the)S 184 x(revisable)S 184 x(form)S 182 x(image)S +183 x(\(expressed)S 183 x(in)S 183 x(IOB)S 547 y 4796 X +(coordinates\))S 179 x(from)S 179 x(which)S 179 x(the)S 179 x +(\211nal)S 180 x(form)S 178 x(rendered)S 179 x(image)S 179 x +(derives.)S 275 x(This)S 179 x(capabil)S 2 x(ity)S 179 x(will)S 180 x +(be)S 179 x(provided)S 180 x(for)S 178 x(all)S 548 y 4796 X +(invertable)S 172 x(rendition)S 171 x(transforms)S 170 x(\(at)S 170 x +(least)S 172 x(linear)S 171 x(geometric)S 171 x(transforms\).)S 256 x +(It)S 170 x(should)S 171 x(be)S 170 x(clear)S 171 x(that)S 171 x +(this)S 171 x(capabil)S 2 x(ity)S 548 y 4796 X(is)S 163 x(essentia)S +2 x(l)S 164 x(if)S 164 x(an)S 164 x(applicat)S 2 x(ion)S 164 x(is)S +164 x(to)S 164 x(associate)S 165 x(what)S 164 x(a)S 164 x(user)S +164 x(sees)S 163 x(and)S 164 x(points)S 165 x(to)S 164 x(\(\211nal)S +164 x(form)S 163 x(image\))S 164 x(with)S 165 x(a)S 164 x(locatio)S +2 x(n)S 548 y 4796 X(in)S 166 x(the)S 167 x(revisable)S 167 x(form)S +166 x(image.)S 897 y 4796 X(Despite)S 167 x(the)S 167 x(avail)S 2 x +(abilit)S 2 x(y)S 167 x(of)S 166 x(this)S 168 x(coordinate)S 168 x +(conversion)S 168 x(service,)S 167 x(applicat)S 2 x(ion)S 167 x +(clie)S 2 x(nts)S 167 x(may)S 166 x(chose)S 167 x(to)S 167 x +(perform)S 167 x(their)S 548 y 4796 X(own)S 165 x(mapping)S 167 x +(back)S 166 x(from)S 166 x(device)S 167 x(coordinates)S 167 x +(\(mouse)S 166 x(interrupts\))S 167 x(to)S 167 x(revisable)S 167 x +(form)S 165 x(image)S 167 x(object)S 167 x(coordinat)S 2 x(es.)S +16993 Y 3600 X F36(3.3.3.1.)S 2 x(2)S 597 x(T)S -36 x(emporal)S 167 x +(Coordinate)S 167 x(Systems)S 897 y 4796 X F78(The)S 175 x +(extension)S 176 x(package)S 176 x(has)S 175 x(a)S 175 x(concept)S +176 x(of)S 175 x(time)S 176 x(sequences)S 175 x(of)S 175 x(frames)S +175 x(\(see)S 174 x(layout)S 2 x(\),)S 176 x(but)S 176 x(does)S 175 x +(not)S 175 x(provide)S 176 x(any)S 548 y 4796 X(temporal)S 173 x +(coordinat)S 2 x(e)S 173 x(system.)S 262 x(As)S 172 x(such,)S 174 x +(an)S 173 x(appli)S 2 x(cation)S 174 x(which)S 173 x(maintai)S 2 x +(ns)S 172 x(a)S 173 x(temporal)S 174 x(coordinate)S 174 x(system)S +173 x(\(such)S 548 y 4796 X(as)S 167 x(a)S 168 x(high-speed)S 169 x +(photography)S 169 x(applicat)S 2 x(ion\),)S 168 x(must)S 168 x +(convert)S 168 x(from)S 167 x(a)S 168 x(time)S 169 x(coordinate)S +169 x(to)S 169 x(an)S 168 x(individual)S 170 x(frame)S 167 x(id)S +169 x(or)S 548 y 4796 X(frame)S 165 x(sequence)S 167 x(index)S 167 x +(when)S 166 x(dealing)S 167 x(with)S 167 x(the)S 167 x(extension)S +167 x(package.)S 21028 Y 3600 X F36(3.3.3.1.)S 2 x(3)S 597 x +(Chrominan)S 2 x(ce)S 166 x(Coordinate)S 167 x(Systems)S 897 y 4796 X +F78(For)S 174 x(reasons)S 175 x(which)S 175 x(will)S 176 x(not)S +176 x(be)S 175 x(explain)S 2 x(ed)S 175 x(here)S 175 x(\(see)S 175 x +(ref:)S 267 x(CORNSWEET\))S 176 x(color)S 175 x(images)S 175 x(inte)S +2 x(nded)S 175 x(for)S 175 x(human)S 548 y 4796 X(consumption)S 169 x +(are,)S 168 x(in)S 169 x(general,)S 169 x(represented)S 169 x(with)S +169 x(three)S 169 x(independent)S 170 x(components.)S 253 x(The)S +169 x(theory)S 169 x(of)S 168 x(color)S 169 x(spaces)S 168 x(is)S +548 y 4796 X(particularl)S 2 x(y)S 164 x(convoluted)S 165 x(and)S +164 x(requires)S 164 x(a)S 164 x(good)S 164 x(understandi)S 2 x(ng)S +163 x(of)S 164 x(the)S 165 x(human)S 163 x(visual)S 165 x(system.)S +248 x(There)S 165 x(are)S 164 x(many)S 163 x(sets)S 548 y 4796 X(of)S +165 x(basis)S 167 x(vectors)S 166 x(for)S 166 x(a)S 166 x(color)S +167 x(three)S 167 x(space,)S 166 x(or)S 166 x(if)S 166 x(one)S 167 x +(prefers,)S 165 x(many)S 166 x(dif)S -9 x(ferent)S 167 x(color)S +167 x(three)S 166 x(spaces.)S 896 y 4796 X(Unlike)S 156 x(the)S 156 x +(two-dimensional)S 157 x(spatial)S 157 x(coordinates,)S 158 x(where)S +156 x(standardizat)S 2 x(ion)S 156 x(upon)S 155 x(rectil)S 2 x +(inear)S 156 x(\(vs)S 155 x(polar\))S 156 x(coordinat)S 2 x(es)S +548 y 4796 X(is)S 162 x(a)S 163 x(fairly)S 163 x(reasonable)S 164 x +(thing)S 163 x(to)S 163 x(do,)S 163 x(standardiz)S 2 x(ation)S 163 x +(upon)S 163 x(a)S 163 x(single)S 163 x(color)S 163 x(three)S 164 x +(space)S 162 x(coordinat)S 2 x(e)S 162 x(system)S 163 x(may)S 162 x +(not)S 548 y 4796 X(be)S 156 x(as)S 156 x(reasonable.)S 250 x +(Although)S 157 x(the)S 157 x(computer)S 156 x(industry)S 157 x +(display)S 158 x(devices)S 157 x(are)S 156 x(primarily)S 157 x +(R-G-B,)S 156 x(there)S 157 x(are)S 156 x(advanta)S 2 x(ges)S 548 y +4796 X(to)S 174 x(representing)S 175 x(images)S 173 x(in)S 175 x +(other)S 174 x(color)S 174 x(three)S 175 x(spaces)S 173 x(\(such)S +174 x(as)S 173 x(Y)S -55 x(-I-Q)S 173 x(or)S 173 x(H-L-S\).)S 173 x +(One)S 173 x(important)S 175 x(disti)S 2 x(nction)S 175 x(to)S 548 y +4796 X(note)S 165 x(is)S 165 x(that)S 166 x(some)S 165 x(color)S +165 x(spaces)S 165 x(maintai)S 2 x(n)S 164 x(a)S 166 x(one-to-one)S +165 x(relati)S 2 x(onship)S 165 x(between)S 166 x(component)S 165 x +(and)S 166 x(spectral)S 166 x(band)S 165 x(\(for)S 548 y 4796 X +(example,)S 180 x(R-G-B\),)S 176 x(while)S 178 x(others)S 178 x(do)S +177 x(not)S 178 x(\(Y)S -56 x(-I-Q\).)S 176 x(In)S 178 x(these)S +177 x(lat)S 2 x(ter)S 177 x(cases,)S 180 x(each)S 178 x(of)S 177 x +(the)S 178 x(dimensions)S 178 x(of)S 177 x(the)S 178 x(color)S 548 y +4796 X(three)S 170 x(space)S 171 x(is)S 170 x(not)S 171 x +(necessarily)S 172 x(a)S 170 x(dif)S -9 x(ferent)S 171 x(spectral)S +172 x(band.)S 257 x(In)S 170 x(some)S 170 x(cases,)S 170 x(these)S +171 x(color)S 171 x(systems)S 170 x(are)S 170 x(designed)S 171 x(to)S +548 y 4796 X(separate)S 166 x(chrominance)S 167 x(and)S 167 x +(luminance)S 167 x(information)S 167 x(for)S 166 x(representati)S +2 x(on)S 166 x(ef)S -9 x(\211ciency)S -31 x(.)S 897 y 4796 X(Higher)S +171 x(band)S 172 x(multi-spect)S 2 x(ral)S 172 x(images)S 171 x +(\(such)S 172 x(as)S 171 x(n)S 172 x(band)S 172 x(Landsat)S 172 x +(images\))S 172 x(tend)S 172 x(to)S 172 x(be)S 172 x(of)S 171 x(the)S +172 x(former)S 171 x(nature:)S 262 x(each)S 547 y 4796 X(component)S +166 x(maps)S 166 x(directl)S 2 x(y)S 166 x(to)S 166 x(a)S 166 x +(single)S 167 x(spectral)S 168 x(band.)S 897 y 4796 X(The)S 170 x +(extension)S 171 x(protocol)S 171 x(will)S 171 x(recognize)S 171 x +(more)S 170 x(than)S 171 x(one)S 170 x(three)S 170 x(space)S 171 x +(color)S 170 x(representati)S 2 x(on)S 170 x(at)S 170 x(key)S 171 x +(interfaces)S 171 x(and)S 548 y 4796 X(support)S 175 x(linear)S 176 x +(\(inverta)S 2 x(ble\))S 175 x(color)S 176 x(three)S 176 x(space)S +176 x(transforms)S 174 x(The)S 176 x(extension)S 176 x(protocol)S +177 x(will)S 176 x(rely)S 176 x(upon)S 175 x(these)S 176 x(three)S +548 y 4796 X(space)S 166 x(systems)S 166 x(\(or)S 165 x(protocol)S +2 x(s\))S 165 x(for)S 166 x(the)S 167 x(relati)S 2 x(onships)S 166 x +(between)S 167 x(component)S 166 x(and)S 167 x(wavelength)S 167 x +(band.)S 897 y 4796 X(The)S 171 x(extensi)S 2 x(on)S 171 x(protocol)S +172 x(will)S 173 x(not)S 171 x(recogniz)S 2 x(e)S 171 x(images)S +171 x(of)S 172 x(more)S 170 x(than)S 172 x(3)S 172 x(spectral)S 172 x +(bands,)S 172 x(and)S 172 x(as)S 171 x(such,)S 172 x(applica)S 2 x +(tions)S 548 y 4796 X(with)S 186 x(N)S 186 x(spectral)S 187 x(band)S +186 x(data)S 187 x(\(such)S 186 x(as)S 186 x(Landsat\))S 187 x(will)S +187 x(be)S 186 x(responsible)S 187 x(for)S 186 x(spectral)S 187 x +(dimensionali)S 2 x(ty)S 186 x(reducti)S 2 x(on)S 548 y 4796 X +(\(potential)S 2 x(ly)S 166 x(accompli)S 2 x(shed)S 166 x(by)S 166 x +(an)S 166 x(applic)S 2 x(ation)S 167 x(applied)S 167 x +(transform/mapping)S 167 x(or)S 166 x(by)S 166 x(applic)S 2 x(ation)S +167 x(band)S 166 x(select)S 2 x(ion\).)S 35879 Y 3600 X F40(3\2036)S +449 x(EXTENSION)S 165 x(ARCHI)S -2 x(TECTURE)S 165 x(CONCEPTS)S +1 PP +EP +%%Page 7 27 +1000 BP 39600 30600 PM 0 0 XY +5155 Y 3600 X F36(3.3.3.2)S 599 x(Layout)S 897 y 4796 X F78 +(Applicati)S 2 x(ons)S 181 x(which)S 183 x(deal)S 183 x(with)S 183 x +(the)S 182 x(display)S 183 x(of)S 182 x(digit)S 2 x(al)S 183 x +(images)S 182 x(often)S 182 x(face)S 183 x(a)S 182 x(variety)S 183 x +(of)S 182 x(appli)S 2 x(cations)S 183 x(speci\211c)S 548 y 4796 X +(screen)S 173 x(layout)S 174 x(issues.)S 262 x(Although)S 174 x(it)S +174 x(would)S 174 x(seem)S 172 x(that)S 174 x(layout)S 175 x(is)S +173 x(something)S 173 x(which)S 174 x(is)S 173 x(entirel)S 2 x(y)S +173 x(in)S 173 x(the)S 174 x(realm)S 173 x(of)S 173 x(a)S 548 y +4796 X(window)S 166 x(manager)S -20 x(,)S 167 x(there)S 168 x(are)S +167 x(layout)S 168 x(issues)S 167 x(which)S 167 x(perhaps)S 167 x +(transcend)S 167 x(the)S 168 x(bounds)S 167 x(of)S 167 x(core)S 167 x +(window)S 167 x(management.)S 548 y 4796 X(The)S 175 x(next)S 175 x +(two)S 175 x(subsections)S 175 x(present)S 175 x(examples)S 175 x +(of)S 175 x(such)S 174 x(image)S 175 x(layout)S 176 x(issues)S 174 x +(and)S 175 x(the)S 175 x(poli)S 2 x(cy)S 174 x(that)S 176 x(the)S +175 x(extensio)S 2 x(n)S 548 y 4796 X(package)S 166 x(will)S 168 x +(adopt.)S 9738 Y 3600 X F36(3.3.3.2.)S 2 x(1)S 597 x(Spatial)S 897 y +4796 X F78(Applicati)S 2 x(ons)S 184 x(often)S 185 x(need)S 184 x +(to)S 185 x(display)S 185 x(eit)S 2 x(her)S 184 x(two)S 184 x +(images,)S 189 x(or)S 184 x(an)S 185 x(image)S 184 x(and)S 185 x(a)S +184 x(graphics)S 185 x(scene,)S 189 x(overlaid)S 185 x(and)S 548 y +4796 X(spatiall)S 2 x(y)S 190 x(registered.)S 297 x(The)S 191 x +(image)S 190 x(extension)S 192 x(package)S 190 x(looks)S 191 x(to)S +190 x(the)S 191 x(core)S 190 x(X)S 190 x(package)S 191 x(for)S 189 x +(window)S 190 x(overlay)S 548 y 4796 X(capabili)S 2 x(ties.)S 281 x +(Barring)S 182 x(avail)S 2 x(abilit)S 2 x(y)S 182 x(of)S 181 x +(these)S 183 x(capabili)S 2 x(ties,)S 186 x(the)S 183 x(extension)S +183 x(package)S 182 x(will)S 183 x(provide)S 183 x(the)S 182 x +(means)S 182 x(to)S 547 y 4796 X(spatiall)S 2 x(y)S 182 x(register)S +182 x(and)S 182 x(overlay)S 183 x(two)S 182 x(images)S 182 x(from)S +182 x(their)S 182 x(revisabl)S 2 x(e)S 182 x(form)S 181 x(through)S +182 x(thei)S 2 x(r)S 181 x(renditi)S 2 x(on)S 182 x(and)S 182 x +(display)S 548 y 4796 X(steps.)S 257 x(This)S 171 x(is)S 171 x +(likely)S 172 x(to)S 171 x(be)S 170 x(done)S 171 x(through)S 171 x +(image)S 171 x(composition)S 172 x(operators)S 171 x(\(logical)S +172 x(point)S 171 x(functi)S 2 x(ons\).)S 257 x(In)S 170 x(the)S +171 x(case)S 548 y 4796 X(of)S 169 x(graphics)S 170 x(and)S 169 x +(image)S 170 x(overlays,)S 171 x(barring)S 170 x(help)S 170 x(from)S +168 x(the)S 170 x(core)S 170 x(X)S 169 x(package,)S 171 x(the)S 170 x +(approach)S 170 x(will)S 170 x(be)S 170 x(to)S 170 x(convert)S 170 x +(the)S 548 y 4796 X(graphics)S 166 x(information)S 167 x(to)S 167 x +(an)S 166 x(image)S 167 x(and)S 166 x(then)S 167 x(proceed)S 166 x +(as)S 166 x(above.)S 897 y 4796 X(The)S 178 x(approach)S 179 x +(described)S 180 x(above)S 178 x(should)S 179 x(provide)S 179 x(for)S +178 x(maintena)S 2 x(nce)S 178 x(of)S 179 x(spatial)S 179 x +(registrat)S 2 x(ion)S 179 x(under)S 178 x(operati)S 2 x(on)S 178 x +(of)S 548 y 4796 X(zoom,)S 165 x(pan,)S 166 x(and)S 166 x(scroll.)S +897 y 4796 X(The)S 179 x(extension)S 180 x(package)S 180 x(will)S +180 x(not)S 180 x(provide)S 180 x(any)S 179 x(speci\211c)S 180 x +(mechanisms)S 179 x(in)S 179 x(support)S 180 x(of)S 179 x("N)S 178 x +(up")S 180 x(spatial)S 180 x(layout)S 181 x(or)S 547 y 4796 X("tili)S +2 x(ng")S 180 x(problems.)S 277 x(The)S 181 x(extension)S 181 x +(package)S 181 x(looks)S 180 x(to)S 181 x(the)S 181 x(core)S 180 x +(protocol)S 181 x(and)S 181 x(toolki)S 2 x(t)S 180 x(levels)S 181 x +(built)S 182 x(upon)S 180 x(it)S 181 x(for)S 548 y 4796 X(support)S +166 x(of)S 166 x(tili)S 2 x(ng.)S 18854 Y 3600 X F36(3.3.3.2.)S 2 x +(2)S 597 x(T)S -36 x(emporal)S 896 y 4796 X F78(Some)S 161 x(image)S +161 x(appli)S 2 x(cations)S 162 x(deal)S 162 x(with)S 162 x(time)S +162 x(sequences)S 162 x(of)S 161 x(images.)S 249 x(In)S 162 x(a)S +161 x(time)S 162 x(sequence,)S 163 x(the)S 162 x(image)S 161 x +(subject)S 163 x(state)S 162 x(is)S 548 y 4796 X(changing)S 165 x +(with)S 165 x(time,)S 165 x(but)S 165 x(the)S 165 x(basic)S 165 x +(subject)S 166 x(is)S 164 x(the)S 165 x(same)S 164 x(\(ie.)S 249 x +(a)S 165 x(time)S 165 x(lapse)S 165 x(sequence)S 165 x(of)S 164 x(a)S +165 x(\212ower)S 164 x(as)S 164 x(it)S 165 x(blooms,)S 165 x(or)S +548 y 4796 X(a)S 169 x(sequence)S 170 x(of)S 169 x(heart)S 170 x +(radiologi)S 2 x(cal)S 170 x(images)S 169 x(as)S 169 x(it)S 170 x +(pumps)S 169 x(blood\).)S 256 x(While)S 170 x(the)S 170 x(extensio)S +2 x(n)S 169 x(package)S 170 x(does)S 169 x(not)S 170 x(provide)S +548 y 4796 X(a)S 168 x(temporal)S 170 x(coordinate)S 170 x(system,)S +169 x(it)S 170 x(will)S 169 x(support)S 169 x(the)S 170 x(concept)S +170 x(of)S 168 x(a)S 169 x(time)S 170 x(sequence)S 169 x(of)S 169 x +(spatiall)S 2 x(y)S 168 x(registered)S 170 x(images,)S 548 y 4796 X +(and)S 166 x(provide)S 167 x(for)S 166 x(control)S 167 x(over)S 166 x +(the)S 167 x(time)S 166 x(delt)S 2 x(a)S 166 x(between)S 167 x(time)S +166 x(sequence)S 167 x(frame)S 166 x(displays.)S 897 y 4796 X(The)S +171 x(slide)S 172 x(carousel)S 172 x(is)S 172 x(the)S 171 x(basic)S +172 x(mechanism)S 171 x(for)S 171 x(or)S -9 x(ganizi)S 2 x(ng)S 171 x +(a)S 171 x(time)S 172 x(sequence.)S 259 x(The)S 172 x(slide)S 172 x +(carousel)S 172 x(will)S 172 x(contai)S 2 x(n)S 548 y 4796 X +(\211nal)S 180 x(form)S 180 x(images)S 180 x(\(X)S 180 x(displayabl)S +2 x(es)S 180 x(or)S 180 x(pixmaps\))S 180 x(produced)S 181 x(by)S +180 x(rendering)S 181 x(revisable)S 182 x(form)S 179 x(images.)S +277 x(Optional)S 548 y 4796 X(references)S 185 x(back)S 186 x(to)S +186 x(the)S 186 x(source)S 185 x(revisable)S 187 x(form)S 184 x +(images)S 186 x(may)S 185 x(be)S 185 x(kept.)S 288 x(The)S 186 x +(image)S 186 x(extension)S 187 x(package)S 186 x(will)S 548 y 4796 X +(provide)S 179 x(mechanisms)S 179 x(for)S 179 x(playing)S 180 x(the)S +180 x(time)S 180 x(sequence)S 179 x(with)S 180 x(uniform)S 179 x +(time)S 180 x(spacing,)S 182 x(or)S 179 x(single)S 180 x(stepping)S +180 x(under)S 548 y 4796 X(applicat)S 2 x(ion)S 166 x(control.)S +250 x(Direction)S 168 x(of)S 165 x(play)S 167 x(is)S 167 x(also)S +166 x(under)S 166 x(appli)S 2 x(cation)S 167 x(control.)S 896 y +4796 X(A)S 176 x(very)S 178 x(signi\211cant)S 179 x(subset)S 178 x +(of)S 177 x(time)S 178 x(sequence)S 178 x(problems)S 177 x(is)S 178 x +(the)S 178 x(display)S 178 x(of)S 177 x(live)S 179 x(video.)S 272 x +(Live)S 178 x(video)S 178 x(consists)S 178 x(of)S 548 y 4796 X(the)S +171 x(display)S 171 x(of)S 170 x(30)S 171 x(still)S 172 x(frames)S +169 x(per)S 171 x(second.)S 257 x(Consideri)S 2 x(ng)S 170 x(the)S +171 x(size)S 171 x(of)S 170 x(indiv)S 2 x(idual)S 171 x(images,)S +171 x(a)S 171 x(few)S 170 x(seconds)S 170 x(of)S 170 x(live)S 548 y +4796 X(video)S 173 x(would)S 173 x(require)S 173 x(more)S 172 x +(memory)S 172 x(than)S 173 x(most)S 172 x(workstations)S 173 x +(posesses.)S 261 x(T)S -34 x(ypicall)S 2 x(y)S -32 x(,)S 173 x(in)S +173 x(live)S 174 x(video)S 173 x(applica)S 2 x(tions,)S 548 y 4796 X +(the)S 170 x(source)S 170 x(images)S 170 x(will)S 171 x(be)S 170 x +(supplied)S 171 x(from)S 169 x(a)S 170 x(digit)S 2 x(al)S 170 x +(image)S 170 x(disk,)S 171 x(or)S 170 x(digiti)S 2 x(zed)S 170 x +(from)S 169 x(an)S 170 x(analog)S 171 x(source)S 170 x(such)S 170 x +(as)S 170 x(a)S 548 y 4796 X(tv)S 171 x(camera)S 172 x(or)S 171 x +(vcr)S 171 x(by)S 172 x(a)S 171 x(frame)S 171 x(grabber)S 172 x(in)S +172 x(the)S 172 x(server)S -28 x(.)S 260 x(The)S 171 x(temporal)S +173 x(layout)S 172 x(machinery)S 172 x(will)S 173 x(give)S 172 x +(consideratio)S 2 x(n)S 548 y 4796 X(to)S 166 x(the)S 167 x(support)S +166 x(of)S 166 x(this)S 167 x(special)S 167 x(class)S 167 x(of)S +166 x(time)S 166 x(sequence)S 167 x(image)S 167 x(applicat)S 2 x +(ions.)S 35879 Y 16766 X F40(EXTENSION)S 165 x(ARCHITEC)S -2 x(TURE)S +166 x(CONC)S -2 x(EPTS)S 449 x(3\2037)S +1 PP +EP +%%Page 8 28 +1000 BP 39600 30600 PM 0 0 XY +5246 Y 3600 X F28(3.3.4)S 599 x(Image)S 168 x(Structure)S 166 x(-)S +166 x(Subsets)S 6342 Y 4796 X F78(Computer)S 172 x(displays)S 173 x +(present)S 172 x(users)S 172 x(with)S 172 x(screens)S 172 x(full)S +173 x(of)S 172 x(information.)S 262 x(W)S -20 x(ithin)S 173 x(any)S +173 x(screen)S 172 x(or)S 172 x(window)S -33 x(,)S 173 x(there)S +173 x(are)S 547 y 4796 X(established)S 161 x(rules)S 160 x(for)S +160 x(identifyi)S 2 x(ng)S 160 x(smaller)S 160 x(elements)S 161 x +(when)S 159 x(the)S 161 x(contents)S 161 x(derive)S 160 x(from)S +160 x(underlying)S 161 x(text)S 161 x(or)S 159 x(graphics.)S 548 y +4796 X(T)S -35 x(ext)S 174 x(and)S 174 x(graphics)S 175 x +(information)S 175 x(\(visual)S 174 x(informatio)S 2 x(n)S 173 x +(which)S 174 x(is)S 174 x(represented)S 175 x(on)S 174 x(computer)S +174 x(systems)S 173 x(via)S 175 x(text)S 175 x(and)S 548 y 4796 X +(graphics)S 171 x(protocol)S 2 x(s\))S 171 x(have)S 171 x(syntact)S +2 x(ic)S 171 x(object)S 2 x(s)S 171 x(\(characters,)S 173 x(words,)S +171 x(paragraphs,)S 173 x(lines,)S 173 x(arcs,)S 172 x(...\))S 258 x +(which)S 172 x(the)S 172 x(user)S 171 x(is)S 548 y 4796 X(familiar)S +167 x(with)S 166 x(and)S 167 x(which)S 166 x(can)S 167 x(be)S 166 x +(used)S 166 x(to)S 166 x(ident)S 2 x(ify)S 166 x(a)S 166 x +(component)S 167 x(of)S 166 x(a)S 166 x(screen.)S 897 y 4796 X(When)S +168 x(the)S 169 x(screen)S 168 x(contents)S 169 x(represent)S 168 x +(an)S 169 x(underlying)S 169 x(digit)S 2 x(al)S 168 x(image,)S 168 x +(no)S 168 x(such)S 168 x(user)S 168 x(familiar)S -19 x(,)S 168 x +(underlyi)S 2 x(ng)S 168 x(syntactic)S 548 y 4796 X(structure)S 185 x +(exists.)S 287 x(Instead,)S 190 x(it)S 185 x(is)S 185 x(replace)S +2 x(d)S 184 x(by)S 185 x(the)S 186 x(concept)S 186 x(of)S 184 x +(ident)S 2 x(ifying)S 186 x(portions)S 185 x(or)S 185 x(proper)S +185 x(subsets)S 185 x(of)S 184 x(the)S 548 y 4796 X(complete)S 176 x +(image.)S 266 x(These)S 176 x(subsets)S 175 x(are)S 175 x(used)S +175 x(to)S 176 x(identify)S 176 x(areas)S 175 x(that)S 176 x(will)S +176 x(be)S 175 x(operated)S 176 x(on.)S 267 x(There)S 176 x(are)S +175 x(two)S 175 x(proper)S 548 y 4796 X(subsets:)S 249 x(regions)S +167 x(of)S 166 x(interest)S 2 x(,)S 165 x(and)S 167 x(control)S 167 x +(planes.)S 250 x(A)S 165 x(region)S 167 x(of)S 166 x(inte)S 2 x +(rest)S 166 x(is)S 166 x(a)S 167 x(fully)S 167 x(connected)S 167 x +(subset)S 167 x(of)S 166 x(an)S 166 x(image)S 548 y 4796 X(such)S +172 x(as)S 172 x(the)S 173 x(contents)S 173 x(of)S 172 x(a)S 173 x +(rectangular)S 173 x(area)S 173 x(within)S 173 x(the)S 173 x(image,)S +174 x(while)S 173 x(a)S 172 x(control)S 173 x(plane)S 173 x +(determine)S 2 x(s)S 171 x(membership)S 548 y 4796 X(in)S 166 x(the)S +167 x(subset)S 166 x(on)S 166 x(a)S 167 x(pixel-by-pixel)S 168 x +(basis.)S 249 x(A)S 166 x(control)S 167 x(plane)S 167 x(maybe)S 166 x +(heavy)S 166 x(or)S 166 x(sparsely)S 167 x(populated.)S 896 y 4796 X +(The)S 178 x(extension)S 179 x(protocol)S 179 x(supports)S 178 x +(the)S 179 x(de\211nition)S 179 x(and)S 178 x(use)S 178 x(of)S 178 x +(both)S 178 x(regions)S 179 x(of)S 177 x(intere)S 2 x(st)S 178 x +(and)S 178 x(control)S 179 x(planes)S 178 x(for)S 548 y 4796 X +(operations)S 167 x(on)S 166 x(connected)S 167 x(and)S 167 x +(disconnected)S 167 x(subsets)S 167 x(of)S 166 x(a)S 166 x(complete)S +167 x(image.)S 15109 Y 3600 X F28(3.3.5)S 599 x(State)S 167 x +(Information)S 167 x(-)S 166 x(Process)S 167 x(History)S 16205 Y +4796 X F78(Other)S 173 x(than)S 174 x(the)S 174 x(information)S 175 x +(required)S 174 x(to)S 174 x(associate)S 175 x(display)S 174 x +(locati)S 2 x(ons)S 173 x(\(coordinate)S 2 x(s\))S 173 x(with)S 174 x +(image)S 173 x(object)S 175 x(coordi-)S 547 y 4796 X(nates)S 172 x +(\(for)S 171 x(pointi)S 2 x(ng)S 171 x(problems\),)S 172 x(the)S +173 x(server)S 171 x(will)S 173 x(not)S 172 x(maintain)S 173 x(any)S +172 x(processing)S 172 x(history)S 172 x(information.)S 261 x(It)S +171 x(is)S 172 x(left)S 173 x(to)S 548 y 4796 X(the)S 166 x(clie)S +2 x(nt)S 166 x(to)S 167 x(maintain)S 167 x(this)S 167 x(information)S +167 x(if)S 167 x(so)S 165 x(required.)S 18795 Y 3600 X F28(3.3.6)S +599 x(Extensio)S 2 x(n)S 166 x(Relationsh)S 2 x(ips)S 19891 Y 3600 X +F36(3.3.6.1)S 599 x(T)S -36 x(o)S 166 x(Core)S 166 x(X)S 896 y 4796 X +F78(The)S 177 x(X)S 176 x(image)S 177 x(extension)S 177 x(will)S +178 x(be)S 177 x(accessed)S 177 x(through)S 177 x(the)S 177 x(core)S +177 x(X)S 176 x(server)S 176 x(as)S 177 x(prescribed)S 177 x(by)S +176 x(the)S 177 x(core)S 177 x(X)S 176 x(protocol)S 548 y 4796 X +(extension)S 186 x(mechanism.)S 286 x(The)S 186 x(extension)S 186 x +(will)S 186 x(make)S 185 x(use)S 185 x(of)S 185 x(core)S 185 x(x)S +185 x(resources)S 185 x(where)S 184 x(ever)S 186 x(possible)S 185 x +(\(such)S 185 x(as)S 548 y 4796 X(drawables,)S 180 x(pixmaps,)S 179 x +(and)S 178 x(clippi)S 2 x(ng)S 177 x(regions\),)S 180 x(but)S 178 x +(the)S 178 x(policy)S 179 x(is)S 177 x(not)S 178 x(to)S 178 x +(extend)S 178 x(existi)S 2 x(ng)S 177 x(\(core\))S 177 x(resources)S +178 x(with)S 548 y 4796 X(regards)S 166 x(to)S 166 x(either)S 167 x +(content)S 168 x(or)S 166 x(semantics.)S 897 y 4796 X(Where)S 169 x +(extensi)S 2 x(on)S 169 x(would)S 170 x(be)S 169 x(required,)S 171 x +(the)S 170 x(image)S 170 x(extension)S 170 x(will)S 171 x(de\211ne)S +169 x(privat)S 2 x(e)S 169 x(resources)S 169 x(necessary)S 170 x(to)S +170 x(support)S 548 y 4796 X(the)S 161 x(speci\211ed)S 161 x(functi)S +2 x(onality)S -31 x(.)S 249 x(For)S 160 x(example,)S 162 x(rather)S +161 x(than)S 162 x(attempt)S 162 x(to)S 161 x(extend)S 162 x(an)S +161 x(already)S 161 x(complica)S 2 x(ted)S 161 x(structure)S 162 x +(such)S 548 y 4796 X(as)S 177 x(the)S 178 x(graphic)S 178 x(context)S +179 x(\(GC\))S 177 x(with)S 178 x(new)S 177 x(\211elds,)S 180 x(or)S +178 x(new)S 177 x(meanings)S 178 x(for)S 177 x(existing)S 179 x +(\211elds,)S 180 x(the)S 178 x(extension)S 179 x(package)S 548 y +4796 X(de\211nes)S 187 x(its)S 188 x(own)S 186 x(resources)S 187 x +(for)S 187 x(rendit)S 2 x(ion)S 187 x(purposes.)S 291 x(While)S 188 x +(this)S 188 x(entai)S 2 x(ls)S 187 x(some)S 186 x(dupli)S 2 x +(cation)S 188 x(of)S 187 x(information,)S 548 y 4796 X(percentage)S +170 x(wise,)S 169 x(the)S 169 x(amount)S 170 x(of)S 168 x(dupli)S +2 x(cation)S 170 x(is)S 169 x(very)S 169 x(very)S 169 x(small)S 169 x +(when)S 169 x(compared)S 169 x(with)S 170 x(a)S 169 x(1)S 169 x(MB)S +168 x(revisabl)S 2 x(e)S 169 x(form)S 548 y 4796 X(image,)S 166 x +(and)S 166 x(no)S 166 x(control)S 167 x(confusion)S 167 x(is)S 166 x +(likel)S 2 x(y)S 166 x(to)S 167 x(arise.)S 27562 Y 3600 X F36 +(3.3.6.2)S 599 x(T)S -36 x(o)S 166 x(Other)S 165 x(Extensio)S 2 x +(ns)S 897 y 4796 X F78(It)S 178 x(is)S 177 x(more)S 178 x(than)S +178 x(likel)S 2 x(y)S 178 x(that)S 178 x(an)S 178 x(appli)S 2 x +(cation)S 179 x(may)S 177 x(require)S 178 x(access)S 178 x(to)S 178 x +(multi)S 2 x(ple)S 178 x(extension)S 179 x(packages)S 178 x(at)S +178 x(the)S 179 x(same)S 548 y 4796 X(time,)S 180 x(such)S 178 x(as)S +177 x(a)S 178 x(graphics)S 178 x(and)S 178 x(image)S 178 x +(extension.)S 273 x(Control)S 179 x(over)S 178 x(concurrent)S 178 x +(residency)S 179 x(of)S 177 x(multipl)S 2 x(e)S 177 x(extensi)S 2 x +(ons)S 547 y 4796 X(to)S 186 x(the)S 187 x(server)S 186 x(is)S 187 x +(under)S 186 x(core)S 187 x(X.)S 185 x(While)S 188 x(exchange)S 187 x +(of)S 186 x(information)S 187 x(between)S 187 x(multipl)S 2 x(e)S +186 x(concurrently)S 188 x(resident)S 548 y 4796 X(extensions)S 178 x +(is)S 177 x(always)S 177 x(possible)S 178 x(via)S 177 x(the)S 178 x +(client)S 2 x(,)S 179 x(this)S 178 x(approach)S 177 x(is)S 177 x +(potent)S 2 x(ially)S 178 x(inef)S -8 x(\211cient)S 178 x(due)S 177 x +(to)S 178 x(wire)S 177 x(transport.)S 548 y 4796 X(The)S 167 x +(image)S 167 x(extensi)S 2 x(on)S 167 x(package)S 167 x(incl)S 2 x +(udes)S 167 x(import/export)S 168 x(services)S 168 x(which)S 167 x +(provide)S 168 x(a)S 167 x(limited)S 168 x(means)S 167 x(of)S 167 x +(exchanging)S 548 y 4796 X(information)S 177 x(\(primarily)S 177 x +(rendered)S 177 x(image)S 176 x(data\))S 177 x(between)S 177 x(the)S +177 x(image)S 176 x(extensi)S 2 x(on)S 176 x(and)S 176 x(another)S +177 x(extensi)S 2 x(on)S 176 x(through)S 548 y 4796 X(core)S 166 x +(X)S 166 x(resources.)S 35879 Y 3600 X F40(3\2038)S 449 x(EXTENSION)S +165 x(ARCHI)S -2 x(TECTURE)S 165 x(CONCEPTS)S +1 PP +EP +%%Page 9 29 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 3600 X F36(3.3.6.3)S 599 x(Multip)S 2 x(le)S 166 x +(Connection)S 2 x(s,)S 166 x(Clients,)S 167 x(and)S 167 x(Resource)S +166 x(Sharing)S 896 y 4796 X F78(Following)S 176 x(the)S 177 x +(guideline)S 2 x(s)S 175 x(establi)S 2 x(shed)S 175 x(by)S 176 x +(the)S 176 x(core)S 176 x(X)S 175 x(protocol,)S 179 x(the)S 176 x +(image)S 176 x(extension)S 177 x(will)S 176 x(support)S 176 x +(sharing)S 176 x(of)S 548 y 4796 X(resources)S 172 x(between)S 174 x +(multiple)S 174 x(connect)S 2 x(ions)S 173 x(from)S 172 x(the)S 174 x +(same)S 172 x(or)S 173 x(dif)S -9 x(ferent)S 174 x(client)S 2 x(.)S +262 x(Multipl)S 2 x(e)S 173 x(connection)S 2 x(s)S 172 x(\(from)S +172 x(the)S 548 y 4796 X(same)S 170 x(or)S 171 x(dif)S -9 x(ferent)S +172 x(applicat)S 2 x(ion)S 171 x(cli)S 2 x(ents\))S 171 x(may)S 170 x +(reference)S 172 x(the)S 171 x(same)S 171 x(resource)S 171 x(\(ie.)S +259 x(resource)S 171 x(handles)S 171 x(will)S 172 x(be)S 171 x +(server)S 548 y 4796 X(globals)S 169 x(rather)S 169 x(than)S 170 x +(connection)S 170 x(globals\).)S 255 x(Managing)S 169 x(the)S 169 x +(sharing)S 169 x(of)S 169 x(server)S 168 x(resources)S 169 x(and)S +168 x(all)S 170 x(rami\211catio)S 2 x(ns)S 168 x(is)S 169 x(a)S 548 y +4796 X(client)S 167 x(problem.)S 249 x(See)S 167 x(the)S 166 x +(appendix)S 168 x(for)S 165 x(a)S 167 x(more)S 165 x(detai)S 2 x +(led)S 166 x(discussion)S 167 x(of)S 166 x(applic)S 2 x(ations)S +167 x(interchange)S 167 x(of)S 166 x(image)S 167 x(data.)S 9753 Y +3600 X F36(3.3.6.4)S 599 x(T)S -36 x(o)S 166 x(T)S -37 x(ext)S 166 x +(and)S 167 x(Graphics)S 897 y 4796 X F78(As)S 167 x(was)S 169 x +(stated)S 169 x(earlie)S 2 x(r)S -21 x(,)S 169 x(text,)S 170 x +(graphics,)S 169 x(and)S 169 x(images)S 169 x(are)S 168 x(simply)S +169 x(dif)S -8 x(ferent)S 169 x(data)S 169 x(protocol)S 2 x(s)S 168 x +(and)S 169 x(sets)S 168 x(of)S 169 x(services)S 169 x(for)S 548 y +4796 X(visual)S 168 x(information)S 169 x(managed)S 168 x(on)S 167 x +(a)S 168 x(computer)S -27 x(.)S 252 x(While)S 169 x(many)S 167 x +(appli)S 2 x(cations)S 168 x(will)S 169 x(need)S 168 x(to)S 168 x +(wield)S 169 x(all)S 168 x(three)S 169 x(sets)S 167 x(\(text,)S 548 y +4796 X(graphics,)S 170 x(and)S 171 x(images\))S 169 x(to)S 171 x +(visually)S 171 x(display)S 171 x(what)S 170 x(they)S 171 x(wish)S +169 x(to)S 171 x(communicate,)S 171 x(the)S 170 x(int)S 2 x +(egration)S 171 x(of)S 169 x(text)S 2 x(,)S 170 x(graphics,)S 548 y +4796 X(and)S 166 x(image)S 166 x(services)S 167 x(under)S 166 x(X)S +166 x(are)S 166 x(outside)S 167 x(of)S 166 x(the)S 167 x(scope)S +166 x(of)S 166 x(this)S 167 x(work)S 166 x(\(the)S 166 x(X)S 166 x +(image)S 166 x(extensi)S 2 x(on)S 166 x(protocol\).)S 897 y 4796 X +(In)S 169 x(addition)S 171 x(to)S 169 x(not)S 170 x(solving)S 170 x +(the)S 170 x(integrat)S 2 x(ed)S 169 x(approach)S 170 x(to)S 170 x +(the)S 170 x(use)S 169 x(of)S 169 x(X)S 169 x(based)S 169 x(text,)S +171 x(graphics,)S 170 x(and)S 169 x(image)S 170 x(services,)S 547 y +4796 X(the)S 172 x(X)S 172 x(image)S 173 x(extension)S 173 x +(package)S 173 x(will)S 174 x(not)S 172 x(provide)S 173 x(ANY)S 171 x +(text)S 174 x(or)S 172 x(graphics)S 173 x(services.)S 261 x +(Applicati)S 2 x(ons)S 172 x(should)S 173 x(lokk)S 548 y 4796 X(to)S +166 x(core)S 166 x(X1)S -18 x(1)S 166 x(or)S 166 x(graphics)S 166 x +(extensi)S 2 x(on)S 166 x(packages)S 166 x(for)S 166 x(such)S 166 x +(services.)S 897 y 4796 X(The)S 177 x(author)S 178 x(recognizes)S +178 x(that)S 178 x(at)S 178 x(the)S 178 x(display)S 178 x(memory)S +176 x(level,)S 181 x(what)S 177 x(has)S 177 x(been)S 178 x(referred)S +177 x(to)S 177 x(as)S 177 x(text,)S 181 x(graphics,)S 180 x(and)S +548 y 4796 X(image)S 180 x(all)S 181 x(looks)S 180 x(the)S 181 x +(same:)S 277 x(simply)S 180 x(display)S 181 x(memory)S 180 x(bits)S +180 x(in)S 181 x(various)S 180 x(states.)S 278 x(The)S 180 x(inten)S +2 x(sion)S 180 x(of)S 180 x(the)S 180 x(X)S 180 x(image)S 548 y +4796 X(extension)S 167 x(package)S 168 x(is)S 167 x(not)S 167 x(to)S +167 x(subsume)S 166 x(text)S 167 x(and)S 167 x(graphics)S 167 x +(because)S 168 x(of)S 166 x(this)S 167 x(apparent)S 168 x +(uni\211cati)S 2 x(on)S 166 x(of)S 167 x(representati)S 2 x(on)S +548 y 4796 X(at)S 181 x(the)S 181 x(display)S 181 x(memory)S -33 x +(,)S 183 x(but)S 181 x(rather)S 181 x(to)S 181 x(deal)S 181 x(only)S +181 x(with)S 182 x(image)S 180 x(data)S 182 x(protocol)S 181 x +(elements)S 181 x(in)S 181 x(the)S 181 x(transfer)S 181 x(model)S +548 y 4796 X(before)S 166 x(the)S 167 x(display)S 167 x(memory)S +165 x(which)S 166 x(the)S 167 x(tradit)S 2 x(ional)S 167 x(text)S +167 x(and)S 167 x(graphics)S 166 x(data)S 167 x(protocol)S 167 x +(services)S 167 x(have)S 166 x(ignore.)S 19019 Y 3600 X F28(3.4)S +599 x(Service)S 166 x(Concept)S 2 x(s)S 20264 Y 4796 X F78(This)S +180 x(section)S 181 x(explores)S 181 x(in)S 181 x(more)S 179 x +(depth)S 181 x(the)S 181 x(reasoning)S 180 x(behind)S 181 x(and)S +181 x(implicati)S 2 x(ons)S 180 x(of)S 180 x(the)S 180 x(service)S +181 x(goals)S 181 x(and)S 180 x(the)S 548 y 4796 X(highest)S 167 x +(level)S 167 x(or)S -9 x(ganizat)S 2 x(ion)S 166 x(of)S 166 x(the)S +167 x(services.)S 22306 Y 3600 X F28(3.4.1)S 599 x(Service)S 167 x +(Goals)S 167 x(-)S 166 x(Reasoni)S 2 x(ng)S 166 x(&)S 166 x(Implica)S +2 x(tions)S 23402 Y 4796 X F78(The)S 170 x(introduct)S 2 x(ion)S +170 x(touched)S 171 x(brie\212y)S 171 x(upon)S 170 x(the)S 171 x +(functional)S 172 x(goals)S 170 x(of)S 170 x(the)S 171 x(proposed)S +170 x(image)S 170 x(extensi)S 2 x(on.)S 256 x(The)S 171 x(next)S +171 x(few)S 548 y 4796 X(subsections)S 166 x(present)S 167 x(these)S +167 x(goals)S 166 x(and)S 167 x(their)S 167 x(implicat)S 2 x(ions)S +166 x(for)S 166 x(the)S 167 x(extension)S 167 x(package)S 167 x(in)S +166 x(more)S 166 x(detai)S 2 x(l.)S 25445 Y 3600 X F36(3.4.1.1)S +599 x(Range)S 166 x(of)S 167 x(Images)S 896 y 4796 X F78(The)S 172 x +(proposal)S 172 x(call)S 2 x(s)S 171 x(for)S 172 x(integral)S 173 x +(support)S 172 x(for)S 172 x(applica)S 2 x(tions)S 172 x(requiring)S +173 x(display)S 173 x(services)S 172 x(for)S 172 x(the)S 172 x +(following)S 173 x(classes)S 548 y 4796 X(of)S 165 x(images:)S 897 y +4796 X(\201)S 722 x(Stati)S 2 x(c)S 166 x(bitonal)S 168 x(digita)S +2 x(l)S 166 x(image)S 166 x(data)S 167 x(\(black)S 167 x(and)S 167 x +(white\))S 747 y 4796 X(\201)S 722 x(Stati)S 2 x(c)S 166 x +(continuous)S 167 x(tone)S 167 x(monochromatic)S 167 x(digita)S 2 x +(l)S 166 x(image)S 167 x(data)S 166 x(\(gray)S 167 x(scale\))S 747 y +4796 X(\201)S 722 x(Stati)S 2 x(c)S 166 x(multi)S 167 x(spectral)S +167 x(digit)S 2 x(al)S 166 x(image)S 167 x(data)S 167 x(\(color\))S +747 y 4796 X(\201)S 722 x(T)S -17 x(ime)S 166 x(varying)S 167 x +(versions)S 166 x(of)S 166 x(the)S 167 x(above)S 31123 Y 4796 X(The)S +175 x(digital)S 177 x(representation)S 176 x(of)S 175 x(these)S 175 x +(images)S 175 x(\(digital)S 177 x(image)S 175 x(classes)S 175 x(vs)S +174 x(human)S 175 x(visual)S 175 x(types\))S 175 x(will)S 176 x +(vary)S 175 x(widely)S 548 y 4796 X(regarding)S 166 x(the)S 167 x +(amount)S 167 x(of)S 166 x(luminance,)S 166 x(chrominance,)S 167 x +(spatial,)S 167 x(and)S 166 x(temporal)S 167 x(information.)S 35879 Y +16766 X F40(EXTENSION)S 165 x(ARCHITEC)S -2 x(TURE)S 166 x(CONC)S +-2 x(EPTS)S 449 x(3\2039)S +1 PP +EP +%%Page 10 30 +1000 BP 39600 30600 PM 0 0 XY +5138 Y 4796 X F78(The)S 182 x(image)S 182 x(domain)S 183 x +(boundaries)S 182 x(implied)S 183 x(above)S 183 x(are)S 182 x +(somewhat)S 182 x(arti\211cal)S 183 x(in)S 183 x(that)S 183 x(they)S +182 x(have)S 183 x(been)S 182 x(establi)S 2 x(shed)S 548 y 4796 X +(partiall)S 2 x(y)S 181 x(by)S 182 x(human)S 181 x(visual)S 183 x +(perception)S 183 x(attribut)S 2 x(es)S 181 x(and)S 182 x(by)S 181 x +(the)S 183 x(applicat)S 2 x(ions)S 182 x(that)S 182 x(they)S 182 x +(are)S 182 x(an)S 182 x(integral)S 183 x(part)S 182 x(of)S 548 y +4796 X(\(such)S 180 x(as)S 180 x(facsimile)S 182 x(or)S 180 x +(televi)S 2 x(sion\).)S 277 x(In)S 181 x(reality)S -31 x(,)S 183 x +(there)S 181 x(is)S 181 x(a)S 181 x(continuum)S 181 x(of)S 180 x +(images)S 181 x(and)S 180 x(image)S 181 x(attri)S 2 x(butes)S 181 x +(out)S 181 x(of)S 548 y 4796 X(which)S 178 x(applicat)S 2 x(ions)S +178 x(have)S 178 x(concentrat)S 2 x(ed)S 178 x(on)S 177 x(a)S 178 x +(few)S 178 x(important)S 179 x(subspaces.)S 271 x(It)S 178 x(is)S +178 x(also)S 179 x(a)S 177 x(falla)S 2 x(cy)S 178 x(to)S 178 x +(think)S 179 x(that)S 178 x(all)S 548 y 4796 X(applicat)S 2 x(ions)S +170 x(are)S 171 x(con\211ned)S 170 x(to)S 171 x(only)S 171 x(one)S +170 x(of)S 171 x(these)S 170 x(classes)S 171 x(as)S 170 x(many)S +170 x(signi\211cant)S 172 x(applic)S 2 x(ations)S 171 x(\(such)S +170 x(as)S 170 x(publishin)S 2 x(g\))S 547 y 4796 X(cross)S 165 x +(the)S 167 x(domain)S 166 x(boundaries.)S 897 y 4796 X(Because)S +177 x(the)S 177 x(domain)S 176 x(boundaries)S 177 x(are)S 177 x +(arti\211cal)S 2 x(,)S 178 x(and)S 177 x(because)S 176 x(appli)S +2 x(cations)S 177 x(must)S 176 x(be)S 177 x(able)S 177 x(to)S 177 x +(work)S 176 x(across)S 176 x(these)S 548 y 4796 X(domains,)S 173 x +(the)S 172 x(extension)S 173 x(package)S 173 x(must)S 172 x(unify)S +172 x(the)S 173 x(representatio)S 2 x(n)S 171 x(and)S 173 x +(handling)S 173 x(of)S 172 x(the)S 172 x(images)S 172 x(in)S 173 x +(these)S 172 x(various)S 548 y 4796 X(domains.)S 248 x(The)S 164 x +(impli)S 2 x(cation)S 165 x(is)S 163 x(that)S 165 x(the)S 165 x +(extension)S 164 x(must)S 164 x(support)S 164 x(a)S 164 x(uniform)S +163 x(and)S 164 x(robust)S 164 x(image)S 164 x(data)S 165 x +(representatio)S 2 x(n)S 548 y 4796 X(at)S 165 x(least)S 167 x(at)S +165 x(key)S 166 x(interface)S 166 x(point)S 2 x(s,)S 164 x(and)S +166 x(that)S 166 x(there)S 166 x(will)S 166 x(not)S 166 x(be)S 165 x +(separate)S 166 x(service)S 166 x(packages)S 166 x(for)S 165 x(each)S +166 x(of)S 165 x(the)S 166 x(domains.)S 11912 Y 3600 X F36(3.4.1.2)S +599 x(Range)S 166 x(of)S 167 x(Applicatio)S 2 x(ns)S 166 x(Needs)S +897 y 4796 X F78(The)S 181 x(X)S 181 x(clie)S 2 x(nt)S 181 x +(component)S 182 x(of)S 181 x(image)S 182 x(applic)S 2 x(ations)S +182 x(will)S 182 x(demonstrate)S 182 x(a)S 182 x(wide)S 181 x(range)S +182 x(of)S 181 x(image)S 182 x(needs)S 181 x(to)S 182 x(the)S 182 x +(X)S 548 y 4796 X(servers.)S 284 x(The)S 184 x(range)S 185 x(will)S +185 x(likel)S 2 x(y)S 184 x(span)S 184 x(simple)S 184 x(image)S 185 x +(display)S 185 x(of)S 184 x(bitonal)S 186 x(images)S 184 x(through)S +185 x(highly)S 185 x(interact)S 2 x(ive)S 548 y 4796 X(processing)S +166 x(and)S 166 x(analysi)S 2 x(s)S 165 x(of)S 166 x(conti)S 2 x +(nuous)S 166 x(tone)S 166 x(and)S 167 x(multi-spectral)S 168 x +(images.)S 896 y 4796 X(The)S 175 x(extension)S 177 x(package)S 176 x +(must)S 174 x(not)S 176 x(force)S 175 x(an)S 176 x(applicat)S 2 x +(ion)S 175 x(to)S 176 x(operate)S 176 x(at)S 176 x(any)S 175 x +(particul)S 2 x(ar)S 175 x(service)S 176 x(level,)S 178 x(but)S 176 x +(rather)S 548 y 4796 X(\(like)S 169 x(other)S 168 x(layered)S 170 x +(and)S 168 x(open)S 169 x(systems\))S 167 x(allow)S 169 x(the)S 169 x +(applica)S 2 x(tion)S 169 x(access)S 168 x(to)S 169 x(both)S 169 x +(low)S 168 x(level)S 169 x(basic,)S 169 x(and)S 169 x(higher)S 168 x +(level)S 548 y 4796 X(layered)S 167 x(services.)S 249 x(The)S 166 x +(extensio)S 2 x(n)S 166 x(must)S 166 x(not)S 166 x(of)S -9 x(fer)S +166 x(separate)S 167 x(packages)S 167 x(for)S 166 x(the)S 166 x +(various)S 167 x(degrees)S 166 x(of)S 166 x(need.)S 17392 Y 3600 X +F36(3.4.1.3)S 599 x(Range)S 166 x(of)S 167 x(Server)S 165 x(Capabil)S +2 x(ities)S 896 y 4796 X F78(X)S 163 x(servers)S 164 x(are)S 164 x +(like)S 2 x(ly)S 164 x(to)S 165 x(vary)S 164 x(widely)S 165 x(in)S +165 x(their)S 165 x(abili)S 2 x(ty)S 164 x(to)S 165 x(support)S 164 x +(imaging)S 165 x(clie)S 2 x(nt)S 164 x(needs.)S 249 x(These)S 165 x +(variatio)S 2 x(ns)S 163 x(may)S 164 x(be)S 548 y 4796 X(due)S 173 x +(to)S 173 x(varying)S 173 x(server)S 173 x(hardware)S 173 x +(platforms)S 173 x(\(virtual)S 174 x(and)S 173 x(physical)S 174 x +(address)S 172 x(space,)S 175 x(computational)S 175 x(horsepower\).)S +548 y 4796 X(W)S -20 x(ith)S 182 x(limited)S 182 x(virtual)S 183 x +(address)S 180 x(space,)S 185 x(processing)S 181 x(power)S -20 x(,)S +184 x(and)S 181 x(display)S 182 x(hardware)S 181 x(on)S 181 x(some)S +180 x(hosts)S 181 x(for)S 181 x(imaging)S 548 y 4796 X(servers,)S +165 x(it)S 167 x(may)S 166 x(be)S 166 x(impractical)S 168 x(to)S +167 x(attempt)S 167 x(to)S 167 x(support)S 166 x(certain)S 167 x +(imaging)S 167 x(clie)S 2 x(nt)S 166 x(needs.)S 897 y 4796 X(As)S +167 x(the)S 169 x(image)S 168 x(extensi)S 2 x(on)S 168 x(architect)S +2 x(ure)S 168 x(is)S 168 x(inte)S 2 x(nded)S 168 x(to)S 169 x(unify)S +168 x(image)S 169 x(extensions)S 169 x(to)S 169 x(X)S 167 x(across)S +168 x(all)S 170 x(X)S 167 x(servers,)S 168 x(and)S 169 x(as)S 548 y +4796 X(it)S 172 x(is)S 172 x(clear)S 173 x(that)S 173 x(there)S 172 x +(are)S 172 x(underlying)S 173 x(reasons)S 172 x(why)S 171 x(all)S +173 x(servers)S 171 x(will)S 173 x(not)S 172 x(be)S 172 x(able)S +173 x(to)S 172 x(of)S -9 x(fer)S 172 x(all)S 173 x(image)S 172 x +(capabili)S 2 x(ties,)S 548 y 4796 X(the)S 185 x(extension)S 185 x +(proposal)S 185 x(introdu)S 2 x(ces)S 184 x(the)S 185 x(concept)S +186 x(of)S 184 x(service)S 185 x(sets.)S 286 x(Service)S 185 x(set)S +185 x(is)S 185 x(a)S 184 x(compliance)S 186 x(mechanism)S 548 y +4796 X(whereby)S 181 x(the)S 182 x(architect)S 2 x(ure)S 181 x +(speci\211es)S 182 x(what)S 181 x(imaging)S 182 x(capabil)S 2 x +(ities)S 182 x(must)S 181 x(be)S 182 x(availabl)S 2 x(e)S 181 x +(through)S 182 x(the)S 182 x(server)S 181 x(for)S 181 x(a)S 548 y +4796 X(particular)S 167 x(set.)S 896 y 4796 X(Service)S 169 x(sets)S +169 x(are)S 168 x(not)S 169 x(functi)S 2 x(onality)S 170 x +(hierarchies.)S 255 x(Instead,)S 169 x(they)S 169 x(represent)S 170 x +(dif)S -9 x(ferent)S 169 x(functiona)S 2 x(l)S 169 x(areas)S 168 x +(that)S 170 x(a)S 169 x(server)S 548 y 4796 X(may)S 186 x(or)S 186 x +(may)S 186 x(not)S 187 x(be)S 186 x(able)S 187 x(to)S 187 x(provide)S +187 x(for)S -28 x(.)S 289 x(A)S 186 x(server)S 186 x(must)S 186 x +(support)S 187 x(at)S 187 x(least)S 187 x(one)S 187 x(service)S 187 x +(set)S 186 x(\(set)S 187 x(#1\))S 186 x(to)S 187 x(be)S 548 y 4796 X +(considered)S 170 x(an)S 169 x(image)S 170 x(extension)S 171 x +(server)S -28 x(.)S 255 x(A)S 169 x(server)S 169 x(may)S 169 x +(support)S 170 x(other)S 170 x(services)S 170 x(sets)S 169 x(incl)S +2 x(uding)S 170 x(any)S 169 x(combinati)S 2 x(on)S 548 y 4796 X(of)S +165 x(the)S 167 x(other)S 167 x(service)S 167 x(sets.)S 248 x(The)S +167 x(following)S 167 x(is)S 167 x(a)S 166 x(summary)S 165 x(of)S +166 x(the)S 167 x(service)S 166 x(sets:)S 897 y 4796 X(\201)S 722 x +(Set)S 167 x(0:)S 249 x(transport)S 167 x(services,)S 166 x(renditi)S +2 x(on)S 166 x(services)S 747 y 4796 X(\201)S 722 x(Set)S 167 x(1:)S +249 x(enhancement)S 168 x(services)S 747 y 4796 X(\201)S 722 x(Set)S +167 x(2:)S 249 x(processing)S 167 x(pipeli)S 2 x(nes)S 747 y 4796 X +(\201)S 722 x(Set)S 167 x(3:)S 249 x(real)S 167 x(time)S 167 x +(image)S 166 x(capture)S 35879 Y 3600 X F40(3\20310)S 449 x +(EXTENSION)S 165 x(ARCHITEC)S -2 x(TURE)S 166 x(CONC)S -2 x(EPTS)S +1 PP +EP +%%Page 11 31 +1000 BP 39600 30600 PM 0 0 XY +5155 Y 3600 X F36(3.4.1.4)S 599 x(Display)S 167 x(Device)S 166 x +(Indepen)S 2 x(dence)S 897 y 4796 X F78(The)S 175 x(overall)S 175 x +(transfer)S 175 x(model)S 175 x(set)S 175 x(forth)S 175 x(in)S 175 x +(Chapter)S 175 x(2)S 175 x(is)S 174 x(not)S 175 x(an)S 175 x +(inventi)S 2 x(on)S 175 x(of)S 174 x(the)S 175 x(extension)S 176 x +(package,)S 177 x(but)S 175 x(rather)S 548 y 4796 X(an)S 168 x +(observation)S 169 x(of)S 168 x(the)S 169 x(process)S 168 x(which)S +169 x(underlies)S 169 x(the)S 169 x(capture)S 169 x(and)S 168 x +(display)S 169 x(of)S 168 x(digit)S 2 x(al)S 169 x(images)S 168 x +(in)S 169 x(all)S 169 x(systems.)S 252 x(The)S 548 y 4796 X(model)S +172 x(is)S 172 x(sometimes)S 172 x(obscured)S 173 x(in)S 172 x +(actual)S 174 x(practice)S 173 x(by)S 173 x(steps)S 172 x(being)S +173 x(combined)S 172 x(\(tight)S 2 x(ly)S 172 x(packed\))S 173 x(or)S +172 x(even)S 173 x(missing)S 548 y 4796 X(\(null\).)S 896 y 4796 X +(In)S 152 x(the)S 153 x(past,)S 156 x(image)S 153 x(applica)S 2 x +(tions)S 153 x(have)S 153 x(been)S 153 x(inti)S 2 x(mate)S 153 x +(with)S 153 x(display)S 154 x(devices)S 153 x(and)S 153 x(the)S 154 x +(display)S 153 x(device)S 154 x(characte)S 2 x(ristics)S 548 y 4796 X +(propagated)S 179 x(or)S 177 x(permeated)S 179 x(back)S 178 x(into)S +179 x(the)S 178 x(actual)S 180 x(applicat)S 2 x(ion.)S 273 x +(Examples)S 178 x(of)S 178 x(this)S 178 x(are)S 178 x(applic)S 2 x +(ations)S 178 x(which)S 179 x(keep)S 548 y 4796 X(basic)S 178 x +(image)S 179 x(data)S 179 x(with)S 178 x(characte)S 2 x(ristics)S +179 x(\(pixels,)S 181 x(scan)S 178 x(line)S 2 x(s,)S 180 x(spectral)S +179 x(bands\))S 178 x(which)S 179 x(match)S 178 x(the)S 179 x +(display)S 179 x(device)S 548 y 4796 X(capabili)S 2 x(ties)S 167 x +(rather)S 166 x(than)S 167 x(those)S 167 x(deriving)S 167 x(from)S +165 x(the)S 167 x(source)S 166 x(device)S 167 x(or)S 166 x +(synthesis)S 167 x(process.)S 897 y 4796 X(While)S 155 x(display)S +155 x(device)S 156 x(independence)S 156 x(for)S 154 x(the)S 154 x +(cli)S 2 x(ent)S 154 x(is)S 155 x(not)S 155 x(an)S 154 x(explici)S +2 x(t)S 155 x(goal)S 154 x(of)S 155 x(core)S 154 x(X,)S 153 x(it)S +156 x(is)S 154 x(deemed)S 154 x(a)S 155 x(meaningful)S 548 y 4796 X +(goal)S 174 x(for)S 175 x(the)S 174 x(image)S 175 x(extension)S 176 x +(package.)S 265 x(Display)S 175 x(device)S 176 x(independence)S 176 x +(implies)S 175 x(that)S 175 x(applic)S 2 x(ation)S 175 x(client)S +176 x(image)S 548 y 4796 X(data)S 178 x(need)S 179 x(not)S 179 x(be)S +178 x(in)S 178 x(a)S 179 x(format)S 178 x(related)S 179 x(to)S 179 x +(display)S 179 x(device)S 179 x(characteri)S 2 x(stics)S 178 x(and)S +179 x(the)S 178 x(appli)S 2 x(cation)S 179 x(client)S 180 x(need)S +178 x(not)S 548 y 4796 X(understand)S 184 x(or)S 184 x(implement)S +184 x(the)S 185 x(rendition)S 185 x(process.)S 284 x(This)S 184 x +(is)S 184 x(not)S 185 x(to)S 184 x(say)S 184 x(that)S 184 x(rendit)S +2 x(ion)S 184 x(is)S 184 x(no)S 184 x(longer)S 184 x(a)S 184 x +(device)S 548 y 4796 X(dependent)S 169 x(process,)S 167 x(but)S 169 x +(rather)S 168 x(to)S 168 x(say)S 168 x(that)S 169 x(it)S 169 x(is)S +168 x(now)S 167 x(the)S 169 x(headache)S 169 x(of)S 167 x(the)S 169 x +(image)S 168 x(extension)S 169 x(package)S 169 x(rather)S 168 x +(than)S 547 y 4796 X(the)S 166 x(clie)S 2 x(nt.)S 15367 Y 3600 X F36 +(3.4.1.4.)S 2 x(1)S 597 x(Server)S 166 x(Based)S 166 x(Renditio)S +2 x(n)S 897 y 4796 X F78(A)S 171 x(major)S 172 x(implica)S 2 x(tion)S +173 x(of)S 172 x(display)S 173 x(device)S 173 x(independence)S 173 x +(is)S 173 x(that)S 173 x(the)S 172 x(X)S 172 x(Image)S 172 x +(Extension)S 173 x(Package)S 173 x(\(XIE)S 172 x(T)S -35 x(oolkit)S +2 x(,)S 547 y 4796 X(XIE)S 171 x(Lib,)S 174 x(and)S 173 x(XIE)S 172 x +(Server\))S 172 x(will)S 173 x(need)S 172 x(to)S 173 x(understand)S +173 x(and)S 172 x(implement)S 173 x(the)S 173 x(device)S 173 x +(dependent)S 173 x(rendit)S 2 x(ion)S 172 x(process.)S 548 y 4796 X +(This)S 186 x(does)S 185 x(not)S 187 x(mean)S 185 x(that)S 187 x +(the)S 186 x(video)S 187 x(subsystem)S 185 x(\(actual)S 187 x +(display)S 187 x(hardware\))S 185 x(must)S 186 x(understand)S 186 x +(and)S 186 x(perform)S 548 y 4796 X(rendition,)S 169 x(nor)S 167 x +(does)S 167 x(it)S 169 x(mean)S 167 x(that)S 169 x(the)S 168 x +(complete)S 168 x(understandi)S 2 x(ng)S 167 x(and)S 168 x +(implementat)S 2 x(ion)S 168 x(at)S 168 x(a)S 167 x(high)S 168 x +(level)S 169 x(of)S 167 x(rendit)S 2 x(ion)S 548 y 4796 X(is)S 184 x +(on)S 184 x(the)S 185 x(server)S 183 x(side)S 185 x(of)S 184 x(the)S +184 x(wire.)S 285 x(It)S 184 x(does)S 184 x(mean)S 184 x(that)S 186 x +(the)S 184 x(X)S 184 x(image)S 184 x(extensio)S 2 x(n)S 184 x +(package)S 184 x(is)S 185 x(responsible)S 185 x(for)S 548 y 4796 X +(rendition)S 172 x(and)S 171 x(that)S 172 x(server)S 171 x(based)S +171 x(primitives)S 172 x(will)S 172 x(exist)S 171 x(which)S 172 x +(can)S 171 x(be)S 171 x(used)S 171 x(under)S 171 x(the)S 171 x +(directi)S 2 x(on)S 171 x(of)S 170 x(the)S 172 x(X)S 170 x(image)S +548 y 4796 X(extension)S 190 x(toolkit)S 190 x(to)S 190 x(implement)S +189 x(high)S 190 x(level)S 190 x(rendition)S 190 x(models.)S 294 x +(This)S 189 x(incl)S 2 x(udes)S 188 x(renditi)S 2 x(on)S 189 x +(which)S 189 x(preserves)S 548 y 4796 X(and)S 177 x(which)S 178 x +(crosses)S 177 x(digital)S 179 x(image)S 178 x(classes.)S 271 x +(Rendit)S 2 x(ion)S 177 x(will)S 179 x(likely)S 179 x(include)S 178 x +(scali)S 2 x(ng)S 177 x(\(up)S 177 x(and)S 178 x(down\),)S 179 x +(x-y)S 177 x(and)S 178 x(z)S 548 y 4796 X(resolution)S 175 x +(conversion)S 174 x(\(up)S 174 x(and)S 174 x(down\),)S 175 x(device)S +175 x(luminance)S 175 x(corrections)S 174 x(\(gamma)S 173 x(-)S 174 x +(tone)S 175 x(scale)S 174 x(adjustment\),)S 176 x(and)S 548 y 4796 X +(mono-poly)S 166 x(chromatic)S 167 x(conversions.)S 897 y 4796 X +(Relief)S 184 x(from)S 182 x(understandi)S 2 x(ng)S 183 x(and)S 183 x +(implementi)S 2 x(ng)S 183 x(the)S 184 x(rendition)S 184 x(process)S +183 x(can)S 184 x(result)S 184 x(in)S 183 x(signi\211can)S 2 x(t)S +183 x(complexit)S 2 x(y)S 548 y 4796 X(reduction)S 172 x(bene\211ts)S +172 x(to)S 171 x(the)S 172 x(applicat)S 2 x(ion)S 172 x(client.)S +260 x(It)S 171 x(will)S 172 x(also)S 172 x(allow)S 172 x(image)S +171 x(applic)S 2 x(ations)S 172 x(access)S 171 x(to)S 171 x(a)S 172 x +(much)S 170 x(broader)S 548 y 4796 X(set)S 166 x(of)S 166 x(display)S +167 x(devices)S 167 x(with)S 167 x(dif)S -9 x(ferent)S 167 x +(characterist)S 2 x(ics)S 166 x(with)S 167 x(no)S 166 x(additi)S +2 x(onal)S 167 x(applicat)S 2 x(ion)S 166 x(knowledge)S 167 x(or)S +166 x(cost.)S 896 y 4796 X(Figure)S 170 x(4-3)S 169 x(graphicall)S +2 x(y)S 169 x(depict)S 2 x(s)S 169 x(the)S 170 x(basic)S 170 x +(shift)S 170 x(in)S 170 x(the)S 170 x(wire)S 170 x(locati)S 2 x(on)S +169 x(and)S 170 x(the)S 170 x(fact)S 170 x(that)S 171 x(rendition)S +171 x(processing)S 170 x(has)S 548 y 4796 X(moved)S 172 x(from)S +171 x(the)S 173 x(client)S 174 x(to)S 173 x(the)S 172 x(server)S +172 x(side)S 173 x(of)S 172 x(the)S 173 x(wire.)S 261 x(\(see)S 172 x +(appendix)S 173 x(for)S 172 x(more)S 172 x(on)S 172 x(rendit)S 2 x +(ion)S 172 x(in)S 173 x(the)S 173 x(X)S 172 x(Image)S 548 y 4796 X +(Extension\).)S 26674 Y 3600 X F36(3.4.1.4.)S 2 x(2)S 597 x(Image)S +167 x(Data)S 166 x(Organization)S 897 y 4796 X F78(The)S 170 x(or)S +-9 x(ganizati)S 2 x(on)S 170 x(of)S 169 x(image)S 170 x(data)S 171 x +(depends)S 170 x(both)S 170 x(upon)S 170 x(the)S 170 x(digit)S 2 x +(al)S 170 x(image)S 170 x(class)S 170 x(and)S 170 x(the)S 170 x +(appli)S 2 x(cation.)S 257 x(The)S 170 x(goal)S 171 x(is)S 548 y +4796 X(to)S 167 x(allow)S 167 x(the)S 167 x(applic)S 2 x(ation)S +167 x(to)S 167 x(use)S 167 x(an)S 167 x(optimal)S 167 x(image)S 167 x +(data)S 168 x(format)S 166 x(rather)S 167 x(than)S 168 x(project)S +168 x(the)S 167 x(device)S 167 x(format)S 167 x(back)S 167 x(into)S +548 y 4796 X(the)S 171 x(applicat)S 2 x(ion.)S 258 x(The)S 171 x +(burden)S 171 x(should)S 171 x(be)S 170 x(on)S 171 x(the)S 171 x +(server)S 171 x(to)S 171 x(convert)S 171 x(from)S 170 x(applicat)S +2 x(ion)S 171 x(selected)S 172 x(data)S 171 x(or)S -9 x(ganizat)S +2 x(ion)S 548 y 4796 X(to)S 166 x(server)S 166 x(preferred)S 166 x +(format.)S 897 y 4796 X(The)S 190 x(implic)S 2 x(ation)S 191 x(is)S +191 x(that)S 191 x(the)S 191 x(clie)S 2 x(nt)S 190 x(chooses)S 191 x +(one)S 190 x(of)S 191 x(several)S 191 x(image)S 190 x(data)S 192 x +(or)S -9 x(ganizati)S 2 x(ons)S 190 x(\(for)S 190 x(the)S 191 x(raw)S +190 x(data)S 548 y 4796 X(component)S 176 x(of)S 175 x(a)S 176 x +(revisable)S 177 x(form)S 175 x(image)S 176 x(-)S 176 x(attribut)S +2 x(e)S 176 x(format)S 175 x(is)S 176 x(common\),)S 177 x(and)S 176 x +(the)S 177 x(server)S 175 x(complies)S 177 x(at)S 176 x(the)S 176 x +(wire)S 547 y 4796 X(with)S 185 x(that)S 186 x(format.)S 286 x(The)S +185 x(supported)S 186 x(PCM)S 185 x(or)S 184 x(raw)S 185 x(image)S +185 x(data)S 186 x(formats)S 184 x(are)S 185 x(touched)S 186 x(upon)S +185 x(in)S 185 x(the)S 186 x(chapter)S 186 x(on)S 548 y 4796 X +(extension)S 167 x(protocol)S 167 x(elements)S 167 x(\(transport)S +167 x(class)S 166 x(services\).)S 35879 Y 776 x F40(EXTENSION)S 165 x +(ARCH)S -2 x(ITECTURE)S 165 x(CONCEPTS)S 447 x(3\2031)S -24 x(1)S +1 PP +EP +%%Page 12 32 +1000 BP 39600 30600 PM 0 0 XY +5155 Y 3600 X F36(3.4.1.5)S 599 x(Image)S 167 x(Data)S 165 x(T)S +-27 x(ransport)S 897 y 4796 X F78(Image)S 181 x(data)S 182 x +(transport)S 182 x(is)S 181 x(the)S 182 x(movement)S 182 x(of)S 181 x +(image)S 181 x(data)S 183 x(across)S 181 x(the)S 182 x(X)S 181 x +(wire)S 181 x(between)S 182 x(client)S 183 x(and)S 182 x(server)S +-28 x(.)S 279 x(The)S 548 y 4796 X(transport)S 174 x(may)S 173 x +(invol)S 2 x(ve)S 173 x(the)S 175 x(movement)S 173 x(of)S 174 x +(uncompressed)S 173 x(\(PCM\))S 174 x(image)S 174 x(data)S 174 x(in)S +175 x(the)S 174 x(applica)S 2 x(tion)S 174 x(clie)S 2 x(nt)S 174 x +(chosen)S 548 y 4796 X(image)S 172 x(data)S 174 x(or)S -9 x +(ganizati)S 2 x(on,)S 173 x(or)S 173 x(compressed)S 172 x(forms.)S +261 x(The)S 173 x(transport)S 173 x(may)S 172 x(also)S 173 x(be)S +173 x(monolithic)S 174 x(or)S 172 x(segmented)S 173 x(at)S 173 x +(the)S 548 y 4796 X(applicat)S 2 x(ion)S 166 x(clie)S 2 x(nt)S 166 x +(level.)S 9190 Y 3600 X F36(3.4.1.5.)S 2 x(1)S 597 x(Image)S 167 x +(Data)S 166 x(Compression)S 897 y 4796 X F78(Because)S 189 x(the)S +189 x(extensi)S 2 x(on)S 188 x(package)S 190 x(pushes)S 189 x(image)S +189 x(rendition)S 190 x(processing)S 189 x(across)S 189 x(the)S 189 x +(X)S 189 x(wire)S 188 x(into)S 190 x(the)S 190 x(server)S -20 x(,)S +548 y 4796 X(revisable)S 169 x(form)S 167 x(images)S 169 x(often)S +168 x(will)S 170 x(move)S 168 x(across)S 168 x(the)S 168 x(X)S 168 x +(wire.)S 253 x(These)S 169 x(revisable)S 169 x(form)S 167 x(images)S +169 x(will)S 169 x(often)S 169 x(be)S 168 x(much)S 548 y 4796 X(lar)S +-9 x(ger)S 170 x(than)S 170 x(the)S 170 x(\211nal)S 171 x(form)S +168 x(images)S 170 x(which)S 170 x(are)S 170 x(displayed.)S 257 x +(An)S 169 x(example)S 170 x(is)S 170 x(sending)S 170 x(a)S 170 x +(digit)S 2 x(al)S 170 x(image)S 170 x(of)S 169 x(an)S 170 x(E)S 170 x +(size)S 548 y 4796 X(drawing)S 176 x(which)S 177 x(was)S 176 x +(sampled)S 176 x(at)S 177 x(200)S 176 x(dpi)S 177 x(across)S 176 x +(the)S 177 x(wire.)S 269 x(This)S 177 x(revisable)S 178 x(form)S +175 x(image)S 177 x(is)S 176 x(approximatel)S 2 x(y)S 176 x(7.5)S +547 y 4796 X(MB)S 176 x(in)S 176 x(size.)S 270 x(The)S 176 x +(rendered)S 177 x(image)S 176 x(which)S 177 x(will)S 177 x(\211t)S +177 x(on)S 176 x(a)S 176 x(1k)S 176 x(by)S 176 x(1k)S 177 x(by)S +176 x(1b)S 176 x(screen)S 176 x(is)S 177 x(approximately)S 178 x +(150)S 176 x(KB)S 176 x(in)S 548 y 4796 X(size.)S 262 x(Clearly)S +-31 x(,)S 174 x(when)S 172 x(the)S 173 x(X)S 173 x(wire)S 172 x(is)S +173 x(physical,)S 175 x(there)S 174 x(is)S 172 x(a)S 173 x(need)S +173 x(for)S 173 x(image)S 173 x(compression)S 172 x(in)S 173 x(at)S +173 x(least)S 174 x(the)S 173 x(transport)S 548 y 4796 X(services.)S +266 x(There)S 175 x(may)S 174 x(also)S 175 x(be)S 175 x(value)S 176 x +(for)S 174 x(compression)S 175 x(of)S 174 x(revisabl)S 2 x(e)S 174 x +(form)S 174 x(images)S 175 x(in)S 175 x(image)S 175 x(storage)S 176 x +(within)S 175 x(the)S 548 y 4796 X(server)S -28 x(.)S 897 y 4796 X +(Support)S 178 x(for)S 178 x(image)S 178 x(compression)S 178 x(in)S +179 x(wire)S 178 x(transport)S 179 x(is)S 178 x(central)S 180 x(to)S +178 x(the)S 179 x(X)S 177 x(image)S 179 x(extension)S 179 x +(package.)S 273 x(Standard)S 548 y 4796 X(image)S 171 x(compression)S +171 x(schemes)S 170 x(will)S 172 x(be)S 171 x(implemente)S 2 x(d)S +170 x(on)S 171 x(both)S 172 x(sides)S 171 x(of)S 171 x(the)S 172 x +(wire)S 171 x(and)S 171 x(used)S 171 x(to)S 171 x(optimize)S 172 x +(transport)S 548 y 4796 X(when)S 169 x(the)S 170 x(wire)S 169 x(is)S +170 x(physical.)S 256 x(There)S 170 x(are)S 169 x(compression)S 170 x +(standards)S 169 x(in)S 170 x(place)S 170 x(\(or)S 170 x(under)S +169 x(development\))S 171 x(which)S 169 x(should)S 548 y 4796 X(be)S +166 x(complied)S 167 x(with,)S 166 x(and)S 166 x(that)S 168 x(image)S +166 x(compression)S 166 x(algorit)S 2 x(hms)S 165 x(or)S 166 x +(approaches)S 167 x(are)S 166 x(digit)S 2 x(al)S 166 x(image)S 167 x +(class)S 166 x(dependent.)S 896 y 4796 X(While)S 179 x(transport)S +178 x(will)S 179 x(make)S 178 x(use)S 177 x(of)S 178 x(compression)S +178 x(for)S 177 x(ef)S -9 x(\211ciency)S -31 x(,)S 180 x(the)S 178 x +(PCM)S 178 x(data)S 179 x(or)S -9 x(ganizati)S 2 x(on)S 177 x +(select)S 2 x(ed)S 178 x(by)S 177 x(the)S 548 y 4796 X(applicat)S +2 x(ion)S 168 x(client)S 169 x(is)S 168 x(recovered)S 168 x(on)S +168 x(both)S 168 x(sides)S 168 x(of)S 168 x(the)S 168 x(wire)S 168 x +(via)S 168 x(decompression.)S 252 x(In)S 167 x(other)S 169 x(words,)S +167 x(compression)S 167 x(is)S 548 y 4796 X(applied)S 167 x(to)S +167 x(the)S 166 x(appli)S 2 x(cation)S 167 x(client)S 168 x +(selected)S 167 x(PCM)S 167 x(format.)S 19950 Y 3600 X F36(3.4.1.5.)S +2 x(2)S 597 x(T)S -27 x(ransport)S 167 x(Granularity)S 896 y 4796 X +F78(At)S 185 x(the)S 187 x(applicat)S 2 x(ion)S 186 x(clien)S 2 x(t)S +186 x(level,)S 191 x(the)S 187 x(image)S 186 x(extension)S 187 x +(will)S 187 x(support)S 186 x(transport)S 186 x(ranging)S 187 x +(from)S 185 x(monolithic)S 187 x(to)S 548 y 4796 X(segmented.)S 897 y +4796 X(Monolithi)S 2 x(c)S 177 x(transport)S 178 x(implies)S 179 x +(that)S 178 x(the)S 178 x(entire)S 179 x(image)S 178 x(\(PCM)S 177 x +(or)S 177 x(compressed)S 177 x(version)S 178 x(of)S 177 x(the)S 178 x +(appli)S 2 x(cation)S 178 x(cli)S 2 x(ent)S 548 y 4796 X(chosen)S +166 x(format\))S 166 x(will)S 167 x(be)S 166 x(transported)S 167 x +(across)S 166 x(the)S 167 x(wire)S 166 x(as)S 166 x(an)S 166 x +(atomic)S 167 x(\(un-interrupt)S 2 x(able\))S 167 x(event.)S 896 y +4796 X(Segmented)S 174 x(transport)S 174 x(implies)S 175 x(that)S +174 x(the)S 175 x(applicat)S 2 x(ion)S 174 x(client)S 175 x(may)S +173 x(send)S 174 x(the)S 174 x(image)S 174 x(across)S 174 x(in)S +174 x(a)S 173 x(piecemeal)S 175 x(fashion)S 548 y 4796 X(where)S +168 x(the)S 170 x(segments)S 168 x(are)S 169 x(regular)S 170 x +(pieces)S 169 x(such)S 169 x(as)S 169 x(scan)S 169 x(lines)S 169 x +(or)S 169 x(scan)S 169 x(line)S 170 x(blocks)S 169 x(\(tiles\),)S +170 x(chromatic)S 170 x(components,)S 548 y 4796 X(or)S 163 x +(luminance)S 165 x(planes.)S 250 x(Each)S 164 x(segment)S 164 x(is)S +165 x(in)S 164 x(either)S 165 x(PCM)S 164 x(or)S 164 x(compressed)S +163 x(version)S 165 x(of)S 163 x(the)S 165 x(applica)S 2 x(tion)S +165 x(client)S 165 x(chosen)S 548 y 4796 X(format,)S 178 x(and)S +177 x(each)S 178 x(segment)S 177 x(will)S 177 x(be)S 177 x +(transported)S 178 x(across)S 177 x(the)S 177 x(wire)S 177 x(as)S +177 x(an)S 177 x(atomic)S 177 x(\(un-interrupt)S 2 x(able\))S 177 x +(event.)S 271 x(The)S 548 y 4796 X(image)S 166 x(extension)S 167 x +(server)S 166 x(will)S 167 x(understand)S 167 x(how)S 166 x(to)S +167 x(reassemble)S 166 x(the)S 167 x(image)S 166 x(segments)S 166 x +(into)S 167 x(a)S 166 x(complete)S 168 x(image.)S 897 y 4796 X +(Segmented)S 172 x(transport)S 172 x(allows)S 172 x(other)S 172 x(X)S +171 x(operations)S 172 x(to)S 172 x(be)S 171 x(int)S 2 x(erleaved)S +172 x(with)S 172 x(the)S 172 x(transport)S 172 x(of)S 171 x(an)S +172 x(image)S 172 x(\(including)S 548 y 4796 X(event)S 190 x +(interrupts)S 190 x(and)S 190 x(servicing\).)S 296 x(A)S 189 x +(particul)S 2 x(arly)S 190 x(useful)S 189 x(instance)S 191 x(of)S +189 x(this)S 190 x(is)S 190 x(an)S 189 x(appli)S 2 x(cation)S 190 x +(which)S 190 x(uses)S 189 x(a)S 548 y 4796 X(transport,)S 178 x +(render)S -20 x(,)S 177 x(display)S 176 x(pipe)S 177 x(to)S 175 x +(\211ll)S 177 x(a)S 175 x(display)S 177 x(screen)S 175 x(in)S 176 x +(a)S 175 x(conti)S 2 x(nuous)S 175 x(fashion)S 176 x(as)S 175 x(it)S +176 x(sends)S 176 x(image)S 175 x(segments)S 548 y 4796 X(across)S +173 x(the)S 175 x(wire.)S 264 x(The)S 175 x(screen)S 174 x(begins)S +174 x(to)S 175 x(show)S 173 x(image)S 175 x(display)S 175 x(as)S +174 x(the)S 174 x(\211rst)S 174 x(segment)S 174 x(emer)S -9 x(ges)S +174 x(from)S 173 x(the)S 175 x(pipeli)S 2 x(ne)S 548 y 4796 X +(versus)S 187 x(waiting)S 189 x(unti)S 2 x(l)S 188 x(the)S 189 x +(entire)S 189 x(image)S 188 x(has)S 188 x(been)S 188 x(complete)S +2 x(ly)S 188 x(transported)S 189 x(and)S 188 x(the)S 189 x(entire)S +189 x(image)S 189 x(has)S 187 x(been)S 548 y 4796 X(completely)S +167 x(rendered)S 167 x(before)S 166 x(displayi)S 2 x(ng)S 166 x +(anything.)S 896 y 4796 X(Both)S 182 x(monolithi)S 2 x(c)S 182 x +(and)S 182 x(segmented)S 182 x(transports)S 182 x(are)S 182 x +(asynchronous)S 182 x(\(applicat)S 2 x(ion)S 182 x(clien)S 2 x(t)S +182 x(starts)S 182 x(and)S 182 x(is)S 182 x(noti\211ed)S 183 x(of)S +548 y 4796 X(completion\).)S 35879 Y 3600 X F40(3\20312)S 449 x +(EXTENSION)S 165 x(ARCHITEC)S -2 x(TURE)S 166 x(CONC)S -2 x(EPTS)S +1 PP +EP +%%Page 13 33 +1000 BP 39600 30600 PM 0 0 XY +5155 Y 3600 X F36(3.4.1.6)S 599 x(Image)S 167 x(Processing)S 897 y +4796 X F78(As)S 174 x(stated)S 175 x(in)S 176 x(the)S 175 x(image)S +175 x(concepts)S 176 x(section,)S 177 x(image)S 175 x(processing)S +176 x(is)S 175 x(the)S 175 x(applica)S 2 x(tion)S 175 x(of)S 175 x +(image)S 175 x(operators)S 175 x(to)S 175 x(image)S 548 y 4796 X +(data.)S 255 x(Image)S 169 x(processing)S 169 x(is)S 169 x(divide)S +2 x(d)S 169 x(into)S 170 x(three)S 169 x(broad)S 170 x(classes)S +169 x(includi)S 2 x(ng)S 169 x(restoration)S 170 x(and)S 169 x +(enhancement)S 2 x(,)S 169 x(analysis,)S 548 y 4796 X(and)S 166 x +(coding.)S 896 y 4796 X(In)S 183 x(the)S 185 x(extension)S 185 x +(package)S 185 x(operational)S 186 x(model,)S 188 x(image)S 184 x +(processing)S 185 x(will)S 185 x(potential)S 2 x(ly)S 184 x(be)S +184 x(appli)S 2 x(ed)S 184 x(at)S 184 x(a)S 184 x(number)S 548 y +4796 X(of)S 185 x(points)S 186 x(includ)S 2 x(ing)S 186 x(transport)S +186 x(across)S 185 x(the)S 186 x(wire)S 186 x(\(where)S 185 x +(compression)S 186 x(or)S 185 x(coding)S 186 x(processing)S 186 x +(may)S 185 x(be)S 186 x(used\),)S 548 y 4796 X(enhancement)S 167 x +(processing,)S 166 x(and)S 166 x(renditi)S 2 x(on)S 166 x(where)S +166 x(preparation)S 167 x(for)S 166 x(display)S 167 x(occurs.)S 897 y +4796 X(Support)S 169 x(in)S 169 x(the)S 169 x(extensi)S 2 x(on)S +168 x(package)S 170 x(for)S 169 x(coding)S 169 x(or)S 169 x +(compression)S 169 x(processing)S 169 x(has)S 168 x(been)S 170 x +(touched)S 169 x(upon)S 169 x(in)S 170 x(the)S 169 x(prior)S 548 y +4796 X(section)S 167 x(on)S 166 x(compression.)S 896 y 4796 X +(Support)S 167 x(in)S 167 x(the)S 167 x(extension)S 168 x(package)S +167 x(for)S 166 x(image)S 167 x(processing)S 167 x(used)S 167 x(in)S +167 x(the)S 167 x(renditi)S 2 x(on)S 167 x(process)S 166 x(has)S +167 x(been)S 167 x(touched)S 167 x(upon)S 548 y 4796 X(in)S 166 x +(the)S 167 x(prior)S 166 x(section)S 167 x(on)S 167 x(rendition.)S +897 y 4796 X(The)S 171 x(following)S 172 x(subsections)S 171 x(deal)S +171 x(with)S 172 x(support)S 171 x(in)S 171 x(the)S 171 x(extension)S +172 x(package)S 171 x(for)S 171 x(enhancement)S 172 x(and)S 170 x +(other)S 172 x(forms)S 169 x(of)S 548 y 4796 X(image)S 166 x +(processing,)S 166 x(and)S 166 x(with)S 167 x(the)S 167 x(relatio)S +2 x(nship)S 166 x(between)S 167 x(renditio)S 2 x(n)S 166 x(and)S +166 x(enhancement)S 167 x(processing.)S 14968 Y 3600 X F36(3.4.1.6.)S +2 x(1)S 597 x(Enhan)S 2 x(cement)S 166 x(Processing)S 897 y 4796 X +F78(Image)S 176 x(enhancement)S 177 x(processing)S 177 x(is)S 176 x +(techni)S 2 x(cally)S 177 x(the)S 177 x(appli)S 2 x(cation)S 177 x +(of)S 176 x(image)S 177 x(operators)S 177 x(to)S 177 x(image)S 176 x +(data)S 178 x(solely)S 177 x(for)S 548 y 4796 X(the)S 173 x(purpose)S +172 x(of)S 173 x(increasing)S 174 x(the)S 173 x(viewabil)S 2 x(ity)S +173 x(of)S 173 x(an)S 172 x(image.)S 262 x(The)S 173 x(metric)S 174 x +(for)S 172 x(increased)S 174 x(viewabili)S 2 x(ty)S 173 x(is)S 172 x +(determined)S 548 y 4796 X(by)S 170 x(the)S 171 x(viewing)S 172 x +(applicat)S 2 x(ion)S 171 x(and)S 170 x(the)S 171 x(user)S -27 x(.)S +257 x(Examples)S 171 x(of)S 171 x(basic)S 171 x(image)S 171 x +(enhancement)S 171 x(processes)S 170 x(incl)S 2 x(ude)S 170 x +(contrast)S 548 y 4796 X(enhancement)S 167 x(and)S 166 x(edge)S 167 x +(sharpening.)S 896 y 4796 X(Because)S 173 x(the)S 172 x(metric)S +173 x(for)S 173 x(enhancement)S 173 x(is)S 172 x(in)S 173 x(the)S +173 x(eye)S 173 x(of)S 172 x(the)S 173 x(viewer)S -20 x(,)S 174 x +(enhancement)S 173 x(is)S 173 x(often)S 173 x(a)S 172 x(trial)S 174 x +(and)S 172 x(error)S -20 x(,)S 174 x(or)S 548 y 4796 X(interacti)S +2 x(ve)S 178 x(and)S 179 x(iterati)S 2 x(ve)S 178 x(process.)S 273 x +(Interacti)S 2 x(vity)S 179 x(depends)S 178 x(upon)S 179 x(speed)S +178 x(of)S 178 x(iterat)S 2 x(ion,)S 181 x(and)S 179 x(this)S 179 x +(speed)S 178 x(is)S 178 x(often)S 179 x(a)S 548 y 4796 X(function)S +179 x(of)S 178 x(process)S 178 x(distance)S 180 x(from)S 177 x(the)S +179 x(display)S 179 x(end)S 179 x(of)S 178 x(the)S 179 x(transfer)S +178 x(model)S 179 x(pipeli)S 2 x(ne)S 178 x(\(especiall)S 2 x(y)S +178 x(when)S 178 x(the)S 179 x(X)S 548 y 4796 X(wire)S 166 x(is)S +166 x(physical\).)S 250 x(This)S 166 x(is)S 167 x(a)S 166 x(key)S +166 x(reason)S 166 x(for)S 166 x(inclu)S 2 x(ding)S 166 x(some)S +166 x(enhancement)S 167 x(processing)S 167 x(in)S 166 x(the)S 167 x +(server)S -28 x(.)S 897 y 4796 X(Enhancement)S 184 x(processing)S +185 x(is)S 183 x(a)S 184 x(very)S 184 x(lar)S -8 x(ge)S 183 x +(\211eld)S 185 x(with)S 184 x(a)S 184 x(potenti)S 2 x(ally)S 184 x +(in\211nit)S 2 x(e)S 184 x(number)S 183 x(of)S 184 x(recipes)S 184 x +(for)S 183 x(visuall)S 2 x(y)S 548 y 4796 X(enhancing)S 172 x(an)S +172 x(image.)S 259 x(As)S 171 x(such,)S 172 x(attempt)S 2 x(ing)S +171 x(to)S 172 x(incorporat)S 2 x(e)S 171 x(robust)S 172 x(support)S +171 x(for)S 172 x(enhancement)S 172 x(processing)S 172 x(in)S 172 x +(the)S 548 y 4796 X(server)S 166 x(is)S 168 x(a)S 167 x(dif)S -9 x +(\211cult)S 168 x(problem.)S 251 x(Once)S 167 x(again,)S 168 x(the)S +167 x(server)S 167 x(will)S 168 x(implement)S 168 x(a)S 167 x(set)S +168 x(of)S 167 x(primitives)S 168 x(which)S 168 x(support)S 167 x +(many)S 548 y 4796 X(enhancement)S 167 x(techniques,)S 167 x(thus)S +166 x(pushing)S 167 x(the)S 167 x(extensibil)S 2 x(ity)S 167 x +(issue)S 166 x(for)S 166 x(enhancement)S 167 x(into)S 167 x(the)S +167 x(tool)S 167 x(kit)S 167 x(level)S 2 x(.)S 24084 Y 3600 X F36 +(3.4.1.6.)S 2 x(2)S 597 x(Renditi)S 2 x(on)S 166 x(Processing)S 897 y +4796 X F78(Renditi)S 2 x(on)S 168 x(services)S 168 x(provide)S 169 x +(default)S 169 x(schemes)S 168 x(or)S 168 x(models)S 168 x(for)S +168 x(client)S 170 x(image)S 168 x(renditi)S 2 x(on)S 168 x(which)S +168 x(are)S 169 x(compatible)S 169 x(with)S 548 y 4796 X(the)S 177 x +(display)S 177 x(situat)S 2 x(ion.)S 270 x(The)S 177 x(models)S 177 x +(seek)S 176 x(to)S 177 x(maximize)S 178 x(visual)S 177 x(\211delit)S +2 x(y)S 176 x(between)S 178 x(the)S 177 x(original)S 178 x(captured)S +178 x(or)S 176 x(syn-)S 548 y 4796 X(thesized)S 171 x(image)S 170 x +(and)S 171 x(its)S 170 x(display)S 172 x(on)S 170 x(the)S 170 x(tar)S +-8 x(get)S 171 x(display)S 171 x(device.)S 258 x(Some)S 169 x +(control)S 172 x(over)S 170 x(\211delity)S 171 x(is)S 171 x +(provided)S 171 x(through)S 548 y 4796 X(the)S 172 x(alternat)S 2 x +(ive)S 172 x(renditi)S 2 x(on)S 172 x(models.)S 260 x(These)S 172 x +(schemes)S 172 x(are)S 172 x(atomic)S 172 x(\(indivi)S 2 x(sable\))S +172 x(from)S 171 x(the)S 173 x(client)S 2 x(')S -28 x(s)S 172 x +(perspective,)S 174 x(yet)S 548 y 4796 X(typicall)S 2 x(y)S 170 x +(involve)S 171 x(multi)S 2 x(ple)S 170 x(low)S 171 x(level)S 171 x +(image)S 170 x(rendit)S 2 x(ion)S 170 x(processing)S 171 x(steps)S +170 x(such)S 170 x(as)S 170 x(scaling)S 171 x(\(x-y)S -32 x(,)S 170 x +(and)S 171 x(z\),)S 170 x(rotat)S 2 x(ion,)S 548 y 4796 X(cropping,)S +176 x(and)S 174 x(image)S 175 x(class)S 174 x(conversion.)S 266 x +(While)S 175 x(the)S 175 x(rendition)S 176 x(models)S 174 x(are)S +174 x(independent)S 176 x(of)S 174 x(display)S 175 x(device,)S 177 x +(the)S 547 y 4796 X(rendition)S 167 x(process)S 166 x(is)S 167 x +(highly)S 167 x(device)S 167 x(dependent.)S 897 y 4796 X(Renditi)S +2 x(on)S 172 x(services)S 173 x(expli)S 2 x(citly)S 174 x(recognize)S +174 x(rendition)S 174 x(within)S 174 x(and)S 173 x(across)S 172 x +(image)S 173 x(classes)S 173 x(\(monochromatic)S 173 x(bitona)S 2 x +(l,)S 548 y 4796 X(monochromatic)S 168 x(continuous)S 168 x(tone,)S +168 x(and)S 167 x(poly)S 168 x(chromatic)S 169 x(continuous)S 168 x +(tone)S 168 x(or)S 167 x(multi)S 169 x(spectral\).)S 252 x(While)S +168 x(the)S 168 x(inte)S 2 x(nt)S 167 x(of)S 548 y 4796 X(rendition)S +171 x(services)S 170 x(is)S 169 x(to)S 170 x(reli)S 2 x(eve)S 169 x +(the)S 171 x(client)S 171 x(of)S 169 x(all)S 171 x(concerns)S 170 x +(regarding)S 170 x(mismatch)S 170 x(between)S 170 x(revisable)S 171 x +(form)S 169 x(image)S 548 y 4796 X(and)S 171 x(display)S 173 x +(device)S 172 x(capabi)S 2 x(litie)S 2 x(s,)S 172 x(it)S 172 x(is)S +172 x(felt)S 172 x(that)S 173 x(the)S 172 x(protocol)S 173 x(must)S +171 x(af)S -9 x(forded)S 172 x(the)S 172 x(client)S 173 x(some)S +171 x(control)S 173 x(over)S 172 x(cross)S 548 y 4796 X(class)S 169 x +(image)S 171 x(rendition)S 171 x(as)S 169 x(it)S 171 x(has)S 170 x +(a)S 169 x(signi\211can)S 2 x(t)S 170 x(bearing)S 170 x(upon)S 170 x +(visual)S 171 x(\211delity)S -31 x(,)S 170 x(and)S 170 x(upon)S 170 x +(complexity)S 171 x(of)S 169 x(the)S 171 x(server)S 548 y 4796 X +(rendition)S 167 x(machinery)S -31 x(.)S 896 y 4796 X(Clients)S 186 x +(which)S 186 x(\211nd)S 185 x(the)S 186 x(default)S 187 x(schemes)S +185 x(insuf)S -9 x(\211cient)S 187 x(or)S 185 x(unaccepta)S 2 x(ble)S +185 x(are)S 186 x(free)S 185 x(to)S 186 x(assemble)S 185 x +(enhancement)S 548 y 4796 X(processing)S 166 x(routines)S 167 x +(into)S 167 x(renditi)S 2 x(on)S 166 x(pipeli)S 2 x(nes)S 166 x(of)S +166 x(their)S 167 x(own)S 166 x(de\211nition.)S 35879 Y 16517 X F40 +(EXTENSION)S 165 x(ARCHI)S -2 x(TECTURE)S 165 x(CONCEPTS)S 448 x +(3\20313)S +1 PP +EP +%%Page 14 34 +1000 BP 39600 30600 PM 0 0 XY +5155 Y 3600 X F36(3.4.1.6.)S 2 x(3)S 597 x(Enhan)S 2 x(cement)S 166 x +(-)S 166 x(Rendition)S 168 x(Relationshi)S 2 x(p)S 897 y 4796 X F78 +(The)S 180 x(relationshi)S 2 x(p)S 179 x(between)S 180 x +(enhancement)S 181 x(and)S 180 x(rendition)S 181 x(processing)S 180 x +(is)S 179 x(somewhat)S 180 x(indistinc)S 2 x(t)S 180 x(especiall)S +2 x(y)S 179 x(when)S 548 y 4796 X(one)S 177 x(recognizes)S 177 x +(that)S 178 x(enhancement)S 178 x(and)S 177 x(rendit)S 2 x(ion)S +177 x(processing)S 177 x(may)S 177 x(share)S 177 x(low)S 177 x +(level)S 178 x(operators,)S 179 x(and)S 178 x(when)S 176 x(one)S +548 y 4796 X(allows)S 177 x(\(as)S 176 x(the)S 177 x(extension)S +178 x(package)S 177 x(does\))S 176 x(the)S 177 x(clie)S 2 x(nt)S +176 x(to)S 177 x(generate)S 178 x(a)S 176 x(revisabl)S 2 x(e)S 176 x +(form)S 176 x(object)S 178 x(from)S 175 x(a)S 177 x(prerendered)S +548 y 4796 X(image)S 166 x(via)S 167 x(import)S 167 x(services.)S +249 x(As)S 165 x(such,)S 166 x(the)S 167 x(distinc)S 2 x(tion)S 167 x +(is)S 166 x(based)S 167 x(more)S 165 x(upon)S 167 x(purpose)S 166 x +(\(renditio)S 2 x(n)S 166 x(is)S 166 x(device)S 167 x(speci\211c)S +548 y 4796 X(processing)S 167 x(that)S 169 x(creates)S 168 x(a)S +168 x(\211nal)S 168 x(form)S 167 x(image)S 168 x(which)S 167 x(is)S +168 x(compliant)S 169 x(with)S 168 x(the)S 168 x(output)S 169 x +(device,)S 168 x(while)S 169 x(enhancement)S 168 x(is)S 548 y 4796 X +(relativel)S 2 x(y)S 166 x(device)S 167 x(independen)S 2 x(t\))S +166 x(than)S 167 x(anything)S 167 x(else.)S 10286 Y 3600 X F36 +(3.4.1.6.)S 2 x(4)S 597 x(Other)S 166 x(Forms)S 166 x(of)S 167 x +(Processing)S 897 y 4796 X F78(The)S 190 x(labels)S 191 x +(enhancement,)S 196 x(coding,)S 196 x(and)S 190 x(rendition)S 191 x +(do)S 190 x(not)S 190 x(cover)S 190 x(all)S 191 x(the)S 190 x(uses)S +190 x(of)S 189 x(image)S 191 x(processing)S 190 x(in)S 190 x(the)S +548 y 4796 X(extension)S 173 x(server)S -27 x(.)S 261 x(There)S 173 x +(are)S 173 x(instances)S 174 x(where)S 172 x(an)S 173 x(applicat)S +2 x(ion)S 173 x(will)S 173 x(need)S 173 x(to)S 173 x(apply)S 174 x +(an)S 172 x(image)S 173 x(operator)S 174 x(to)S 173 x(image)S 547 y +4796 X(data)S 166 x(to)S 167 x(change)S 167 x(its)S 167 x(state)S +167 x(for)S 165 x(purposes)S 166 x(other)S 167 x(than)S 167 x +(coding,)S 166 x(enhancement,)S 167 x(or)S 166 x(renditi)S 2 x(on.)S +897 y 4796 X(As)S 172 x(an)S 174 x(example,)S 175 x(consider)S 174 x +(a)S 173 x(progressive)S 174 x(transmission)S 174 x(applicat)S 2 x +(ion)S 174 x(\(such)S 173 x(as)S 173 x(low)S 173 x(bandwidt)S 2 x(h)S +173 x(teleconfe)S 2 x(rencing\))S 548 y 4796 X(which)S 182 x +(chooses)S 181 x(to)S 182 x(opti)S 2 x(mize)S 182 x(the)S 182 x(use)S +182 x(of)S 181 x(intercon)S 2 x(nect)S 182 x(bandwidth)S 183 x(by)S +182 x(sending)S 182 x(image)S 182 x(data)S 182 x(to)S 183 x(the)S +182 x(destinat)S 2 x(ion)S 548 y 4796 X(\(receiving\))S 171 x +(extension)S 171 x(server)S 169 x(one)S 171 x(plane)S 170 x(at)S +171 x(a)S 170 x(time)S 170 x(\(most)S 170 x(signi\211cant)S 171 x +(\211rst\))S 170 x(so)S 170 x(that)S 171 x(a)S 170 x(progressively)S +170 x(bette)S 2 x(r)S 169 x(image)S 548 y 4796 X(develops.)S 274 x +(In)S 178 x(this)S 179 x(case,)S 181 x(the)S 179 x(applic)S 2 x +(ation)S 179 x(will)S 180 x(need)S 178 x(to)S 179 x(combine)S 179 x +(the)S 179 x(planes)S 179 x(as)S 179 x(they)S 179 x(become)S 178 x +(avail)S 2 x(able)S 179 x(within)S 548 y 4796 X(the)S 182 x +(extension)S 183 x(server)S 182 x(\(server)S 182 x(side)S 182 x(of)S +182 x(the)S 183 x(wire\))S 182 x(if)S 182 x(the)S 183 x(bandwidth)S +183 x(savings)S 182 x(are)S 182 x(to)S 183 x(be)S 182 x(realize)S +2 x(d.)S 280 x(In)S 182 x(this)S 183 x(case,)S 548 y 4796 X +(combinatorial)S 168 x(operators)S 166 x(will)S 167 x(be)S 167 x +(required.)S 896 y 4796 X(Fortunately)S -31 x(,)S 172 x(most)S 171 x +(of)S 170 x(the)S 172 x(operators)S 172 x(required)S 171 x(in)S 172 x +(this)S 171 x("other")S 172 x(categ)S 2 x(ory)S 170 x(are)S 172 x +(usually)S 172 x(deemed)S 171 x(essential)S 172 x(for)S 171 x(image)S +548 y 4796 X(enhancement)S 167 x(purposes.)S 248 x(They)S 167 x(are)S +166 x(pointed)S 168 x(out)S 166 x(here)S 166 x(more)S 166 x(as)S +166 x(additi)S 2 x(onal)S 167 x(justi\211cat)S 2 x(ion)S 166 x(for)S +166 x(their)S 167 x(presence.)S 18854 Y 3600 X F36(3.4.1.6.)S 2 x(5)S +597 x(Processin)S 2 x(g)S 166 x(Poli)S 2 x(cy)S 896 y 4796 X F78(In)S +182 x(additi)S 2 x(on)S 183 x(to)S 183 x(the)S 183 x(coding)S 184 x +(\(compression\))S 183 x(and)S 183 x(rendition)S 184 x(processing,)S +187 x(the)S 184 x(X)S 182 x(image)S 183 x(extension)S 184 x +(protocol)S 184 x(will)S 548 y 4796 X(support)S 176 x(a)S 177 x +(closed,)S 179 x(minimal)S 177 x(and)S 177 x(primiti)S 2 x(ve)S 176 x +(set)S 177 x(of)S 177 x(image)S 176 x(processing)S 177 x +(\(enhancement\))S 178 x(functions.)S 270 x(The)S 177 x(X)S 176 x +(image)S 548 y 4796 X(extension)S 167 x(package)S 167 x(will)S 167 x +(provide)S 167 x(for)S 166 x(higher)S 166 x(level)S 168 x +(extensibil)S 2 x(ity)S 167 x(through)S 167 x(the)S 166 x(X)S 166 x +(image)S 167 x(extension)S 167 x(tool)S 167 x(kit.)S 897 y 4796 X +(Closed)S 181 x(means)S 180 x(that)S 182 x(there)S 181 x(will)S 182 x +(be)S 180 x(no)S 181 x(extension)S 182 x(mechanism)S 180 x(which)S +181 x(all)S 2 x(ows)S 180 x(a)S 180 x(user)S 181 x(to)S 181 x +(either)S 181 x(add)S 181 x(new)S 181 x(image)S 548 y 4796 X +(processing)S 187 x(algorit)S 2 x(hms)S 187 x(to)S 187 x(the)S 188 x +(package)S 189 x(or)S 187 x(downline)S 188 x(load)S 188 x(them)S +188 x(\(other)S 188 x(than)S 188 x(the)S 188 x(pipeline)S 189 x +(macro)S 187 x(facili)S 2 x(ty\).)S 548 y 4796 X(Closure)S 166 x +(ensures)S 166 x(that)S 167 x(a)S 167 x(populatio)S 2 x(n)S 166 x +(explosion)S 167 x(does)S 166 x(not)S 167 x(occur)S 166 x(and)S 166 x +(that)S 168 x(incompatibi)S 2 x(liti)S 2 x(es)S 166 x(do)S 166 x +(not)S 166 x(develop.)S 896 y 4796 X(Minimal)S 185 x(and)S 184 x +(primiti)S 2 x(ve)S 184 x(means)S 184 x(that)S 185 x(the)S 185 x +(protocol)S 186 x(will)S 185 x(only)S 185 x(implement)S 185 x(low)S +185 x(level)S 185 x(functions)S 185 x(which)S 185 x(do)S 184 x(not)S +548 y 4796 X(overlap)S 176 x(in)S 177 x(purpose,)S 177 x(and)S 177 x +(upon)S 176 x(which)S 176 x(client)S 178 x(side)S 176 x(components)S +176 x(can)S 176 x(build)S 177 x(higher)S 177 x(level)S 177 x +(services.)S 269 x(As)S 175 x(a)S 176 x(simple)S 548 y 4796 X +(example,)S 185 x(convolut)S 2 x(ion)S 182 x(\211lteri)S 2 x(ng)S +182 x(will)S 182 x(be)S 183 x(implemented)S 183 x(in)S 182 x(the)S +182 x(protocol)S 2 x(,)S 185 x(but)S 182 x(commonly)S 182 x +(recognized)S 183 x(imaging)S 548 y 4796 X(services)S 190 x(which)S +191 x(can)S 190 x(be)S 191 x(built)S 191 x(upon)S 191 x(\211ltering)S +191 x(capabil)S 2 x(itie)S 2 x(s)S 189 x(such)S 191 x(as)S 190 x +(median)S 190 x(and)S 191 x(sharpening)S 191 x(\211lters)S 191 x +(will)S 191 x(be)S 548 y 4796 X(relegated)S 171 x(to)S 171 x(higher)S +171 x(level)S 171 x(clie)S 2 x(nt)S 170 x(side)S 171 x(components)S +171 x(such)S 170 x(as)S 170 x(the)S 171 x(X)S 169 x(Image)S 170 x +(Exten)S 2 x(sion)S 170 x(T)S -34 x(ool)S 170 x(kit.)S 258 x(As)S +170 x(such,)S 170 x(readers)S 548 y 4796 X(who)S 170 x(are)S 171 x +(looking)S 172 x(for)S 170 x(defacto)S 172 x(imaging)S 171 x +(industry)S 172 x(standard)S 171 x(services)S 172 x(should)S 171 x +(look)S 171 x(to)S 171 x(the)S 172 x(X)S 170 x(Image)S 170 x(T)S +-34 x(ool)S 171 x(Kit.)S 259 x(The)S 548 y 4796 X(protocol)S 167 x +(must)S 166 x(be)S 166 x(suf)S -9 x(\211cient)S 167 x(to)S 167 x(be)S +166 x(able)S 167 x(to)S 166 x(build)S 168 x(these)S 166 x(higher)S +167 x(level)S 167 x(services)S 167 x(upon)S 166 x(server)S 166 x +(side)S 167 x(processing.)S 897 y 4796 X(Enhancement)S 183 x +(processing)S 183 x(is)S 183 x(often)S 182 x(presented)S 184 x(in)S +182 x(terms)S 183 x(of)S 182 x(achievin)S 2 x(g)S 182 x(a)S 182 x +(desired)S 183 x(ef)S -9 x(fect)S 183 x(and)S 183 x(then)S 183 x(in)S +183 x(terms)S 182 x(of)S 548 y 4796 X(approaches)S 174 x(to)S 175 x +(achievi)S 2 x(ng)S 174 x(the)S 175 x(ef)S -9 x(fect.)S 266 x +(Approaches)S 174 x(to)S 175 x(achievi)S 2 x(ng)S 174 x(the)S 175 x +(desired)S 175 x(ef)S -9 x(fect)S 175 x(is)S 174 x(often)S 175 x +(broken)S 175 x(down)S 174 x(into)S 548 y 4796 X(techniques)S 171 x +(and)S 171 x(implementat)S 2 x(ions.)S 257 x(As)S 170 x(those)S 171 x +(familiar)S 171 x(with)S 171 x(signal)S 171 x(processing)S 171 x +(know)S -32 x(,)S 170 x(signal)S 172 x(processing)S 171 x(is)S 170 x +(often)S 548 y 4796 X(accomplished)S 180 x(in)S 181 x(any)S 179 x +(of)S 180 x(several)S 180 x(data)S 181 x(domains.)S 276 x(These)S +180 x(domains)S 180 x(are)S 180 x(roughly)S 180 x(categoriz)S 2 x +(ed)S 179 x(into)S 181 x(two)S 180 x(classes:)S 548 y 4796 X +(spatial)S 173 x(and)S 173 x(spatial)S 173 x(frequency)S -32 x(.)S +261 x(In)S 172 x(the)S 173 x(spatial)S 174 x(domain)S 172 x(is)S +172 x(we)S 172 x(operate)S 173 x(on)S 172 x(PCM)S 173 x(data)S 173 x +(which)S 172 x(is)S 172 x(representat)S 2 x(ive)S 172 x(of)S 548 y +4796 X(the)S 171 x(luminanc)S 2 x(e)S 171 x(and)S 171 x(chrominance)S +173 x(of)S 171 x(an)S 171 x(image,)S 173 x(while)S 172 x(in)S 171 x +(the)S 172 x(spatia)S 2 x(l)S 171 x(frequency)S 172 x(domain,)S 172 x +(we)S 172 x(operate)S 172 x(on)S 171 x(ampli-)S 547 y 4796 X(tude)S +176 x(coef)S -9 x(\211cients)S 176 x(of)S 176 x(bases)S 175 x +(vectors)S 176 x(such)S 175 x(as)S 175 x(Fourier)S 176 x(bases)S +176 x(vectors)S 175 x(\(Fourier)S 176 x(T)S -17 x(ransform\).)S 266 x +(Many)S 176 x(enhancement)S 548 y 4796 X(processes)S 165 x(can)S +167 x(be)S 166 x(implemented)S 167 x(in)S 167 x(either)S 167 x(of)S +166 x(these)S 167 x(two)S 166 x(domain)S 167 x(classes.)S 35879 Y +3600 X F40(3\20314)S 449 x(EXTENSION)S 165 x(ARCHITEC)S -2 x(TURE)S +166 x(CONC)S -2 x(EPTS)S +1 PP +EP +%%Page 15 35 +1000 BP 39600 30600 PM 0 0 XY +5138 Y 4796 X F78(While)S 184 x(spatial)S 185 x(frequency)S 184 x +(or)S 183 x(transform)S 183 x(domain)S 183 x(processing)S 184 x(is)S +184 x(an)S 183 x(extremely)S 184 x(important)S 185 x(approach)S 184 x +(in)S 183 x(digit)S 2 x(al)S 548 y 4796 X(signal)S 180 x +(processing,)S 184 x(and)S 180 x(some)S 179 x(workstati)S 2 x(ons)S +179 x(\(servers\))S 180 x(may)S 179 x(have)S 181 x(hardware)S 180 x +(which)S 180 x(support)S 180 x(it,)S 184 x(it)S 181 x(is)S 180 x +(felt)S 181 x(to)S 180 x(be)S 548 y 4796 X(outside)S 174 x(the)S +174 x(realm)S 174 x(of)S 173 x(reasonabili)S 2 x(ty)S 173 x(to)S +174 x(expect)S 175 x(such)S 173 x(support)S 174 x(of)S 173 x(main)S +174 x(stream)S 173 x(servers)S 173 x(at)S 174 x(this)S 174 x(point)S +175 x(in)S 173 x(time.)S 264 x(As)S 548 y 4796 X(such,)S 168 x(no)S +168 x(explici)S 2 x(t)S 168 x(protocol)S 169 x(functi)S 2 x(ons)S +167 x(will)S 170 x(exist)S 168 x(which)S 169 x(require)S 169 x(or)S +168 x(imply)S 168 x(transform)S 168 x(domain)S 168 x(processing)S +169 x(support.)S 548 y 4796 X(Examples)S 167 x(of)S 166 x(the)S 167 x +(implica)S 2 x(tions)S 167 x(of)S 166 x(this)S 168 x(policy)S 167 x +(incl)S 2 x(ude)S 166 x(that)S 168 x(the)S 167 x(protocol)S 168 x +(at)S 167 x(this)S 167 x(time)S 168 x(will)S 167 x(not)S 167 x +(includ)S 2 x(e)S 166 x(machinery)S 547 y 4796 X(which)S 184 x +(supports)S 184 x(the)S 184 x(exchange)S 185 x(of)S 183 x(discrete)S +185 x(spatial)S 186 x(frequency)S 184 x(domain)S 184 x(\211lter)S +185 x(coef)S -9 x(\211cients)S 185 x(or)S 183 x(analyt)S 2 x(ic)S +184 x(spatial)S 548 y 4796 X(frequency)S 166 x(domain)S 166 x +(\211lte)S 2 x(r)S 165 x(descript)S 2 x(ions,)S 166 x(or)S 165 x +(coef)S -8 x(\211cient)S 167 x(rooting)S 167 x(techni)S 2 x(ques)S +166 x(for)S 166 x(histogram)S 166 x(modi\211cati)S 2 x(on.)S 897 y +4796 X(This)S 167 x(position)S 168 x(on)S 166 x(spatial)S 168 x +(frequency)S 167 x(domain)S 167 x(processing)S 167 x(is)S 167 x +(\212exible)S 168 x(in)S 167 x(that)S 168 x(many)S 166 x(important)S +168 x(image)S 167 x(enhancement)S 548 y 4796 X(processes)S 181 x +(are)S 182 x(de\211ned)S 182 x(in)S 183 x(terms)S 181 x(of)S 182 x +(spatial)S 183 x(frequency)S 183 x(domain)S 182 x(processing.)S 280 x +(If)S 182 x(this)S 182 x(positi)S 2 x(on)S 182 x(is)S 182 x +(reversed,)S 185 x(the)S 548 y 4796 X(following)S 167 x(classes)S +166 x(of)S 166 x(protocol)S 167 x(functi)S 2 x(ons)S 165 x(would)S +167 x(likely)S 168 x(be)S 166 x(added:)S 897 y 4796 X(\201)S 722 x +(perform)S 166 x(various)S 166 x(transforms)S 166 x(\(Fourier)S -20 x +(,)S 166 x(DCT)S -37 x(,)S 166 x(Hadamard,)S 165 x(...\))S 747 y +4796 X(\201)S 722 x(perform)S 166 x(arithmetic)S 168 x(operations)S +167 x(on)S 166 x(transform)S 166 x(data)S 747 y 4796 X(\201)S 722 x +(generate)S 167 x(stati)S 2 x(stical)S 167 x(information)S 168 x +(about)S 166 x(transform)S 166 x(data)S 747 y 4796 X(\201)S 722 x +(apply)S 167 x(template)S 168 x(\(area\))S 166 x(functions)S 167 x +(in)S 166 x(transform)S 166 x(domain)S 167 x(\(\211lters\))S 14652 Y +4796 X(It)S 161 x(is)S 162 x(expecte)S 2 x(d)S 161 x(that)S 163 x +(analyt)S 2 x(ic)S 162 x(transform)S 161 x(domain)S 162 x(\211lters)S +162 x(would)S 162 x(be)S 162 x(implemented)S 163 x(at)S 162 x(the)S +163 x(X)S 161 x(image)S 162 x(extension)S 163 x(tool)S 163 x(kit)S +548 y 4796 X(level.)S 897 y 4796 X(Note)S 178 x(that)S 179 x(the)S +178 x(current)S 179 x(position)S 179 x(\(no)S 178 x(spatial)S 179 x +(frequency)S 178 x(domain)S 179 x(support)S 178 x(in)S 178 x(the)S +179 x(protocol\))S 179 x(does)S 177 x(not)S 179 x(imply)S 178 x +(that)S 548 y 4796 X(servers)S 156 x(may)S 156 x(not)S 158 x(use)S +156 x(transform)S 157 x(domain)S 157 x(approaches.)S 249 x(For)S +157 x(example,)S 159 x(a)S 156 x(server)S 157 x(with)S 158 x(2d-FFT)S +156 x(capabi)S 2 x(lity)S 158 x(may)S 156 x(chose)S 548 y 4796 X(to)S +166 x(implement)S 167 x(convolut)S 2 x(ion)S 166 x(with)S 167 x(lar)S +-9 x(ge)S 167 x(kernels)S 166 x(in)S 167 x(the)S 167 x(transform)S +165 x(domain.)S 896 y 4796 X(All)S 184 x(server)S 184 x(based)S 184 x +(image)S 184 x(processing)S 185 x(functions)S 184 x(\(enhancement)S +185 x(and)S 185 x(rendition)S 185 x(other)S 185 x(than)S 184 x(the)S +185 x(\211nal)S 184 x(step)S 185 x(in)S 184 x(a)S 548 y 4796 X +(rendition)S 180 x(process\))S 178 x(will)S 180 x(produce)S 179 x +(image)S 179 x(object)S 2 x(s.)S 274 x(These)S 179 x(image)S 179 x +(objects)S 180 x(may)S 178 x(posess)S 179 x(integral)S 180 x(or)S +179 x(non-integral)S 548 y 4796 X(\(real\))S 166 x(values.)S 250 x +(Protocol)S 168 x(functions)S 167 x(\(image)S 167 x(operators\))S +166 x(which)S 167 x(must)S 166 x(produce)S 167 x(one)S 167 x(or)S +166 x(the)S 167 x(other)S 167 x(will)S 168 x(note)S 167 x(it)S 167 x +(in)S 167 x(their)S 548 y 4796 X(de\211nition.)S 269 x(These)S 177 x +(resulting)S 177 x(image)S 176 x(object)S 2 x(s)S 175 x(may)S 176 x +(be)S 176 x(considered)S 177 x(as)S 175 x(true)S 177 x(images)S 176 x +(which)S 176 x(the)S 176 x(user)S 176 x(will)S 177 x(eventual)S 548 y +4796 X(view)S -32 x(,)S 160 x(or)S 159 x(simply)S 160 x(computati)S +2 x(onal)S 160 x(data)S 161 x(arrays)S 159 x(which)S 160 x(store)S +160 x(temporary)S 160 x(computati)S 2 x(on)S 159 x(information)S +161 x(and)S 160 x(are)S 160 x(discarded)S 548 y 4796 X(without)S +170 x(viewing)S 170 x(by)S 169 x(an)S 169 x(end)S 170 x(user)S -28 x +(.)S 255 x(The)S 169 x(extension)S 171 x(package)S 169 x(does)S 169 x +(not)S 170 x(disting)S 2 x(uish)S 169 x(them.)S 255 x(The)S 169 x +(extensi)S 2 x(on)S 169 x(package)S 548 y 4796 X(will)S 167 x +(provide)S 166 x(a)S 167 x(function)S 167 x(to)S 167 x(integerize)S +168 x(and)S 166 x(quantiz)S 2 x(e)S 166 x(\(force)S 166 x(integral)S +168 x(values\).)S 22871 Y 3600 X F36(3.4.1.7)S 599 x(Operations)S +167 x(Pipeli)S 2 x(ning)S 897 y 4796 X F78(Image)S 173 x(extension)S +175 x(server)S 174 x(operatio)S 2 x(ns)S 173 x(are)S 174 x(categori)S +2 x(zed)S 174 x(into)S 175 x(transport,)S 176 x(enhancement,)S 177 x +(rendition,)S 177 x(and)S 174 x(display)S -32 x(.)S 265 x(T)S -35 x +(o)S 548 y 4796 X(some)S 168 x(extent,)S 170 x(these)S 169 x +(represent)S 169 x(steps)S 168 x(that)S 170 x(an)S 169 x(image)S +169 x(must)S 168 x(pass)S 168 x(through)S 169 x(to)S 169 x(get)S +169 x(from)S 168 x(the)S 169 x(appli)S 2 x(cation)S 169 x(clie)S +2 x(nt)S 169 x(to)S 169 x(the)S 548 y 4796 X(display)S -32 x(.)S +268 x(While)S 177 x(these)S 177 x(operational)S 177 x(classes)S 176 x +(can)S 176 x(be)S 176 x(cleanl)S 2 x(y)S 175 x(separated,)S 179 x +(and)S 176 x(an)S 176 x(image)S 176 x(moved)S 175 x(through)S 177 x +(them)S 176 x(by)S 548 y 4796 X(completing)S 169 x(each)S 168 x +(step)S 168 x(on)S 168 x(the)S 169 x(entire)S 169 x(image)S 168 x +(before)S 168 x(beginning)S 169 x(the)S 168 x(next)S 169 x(step,)S +168 x(it)S 169 x(is)S 168 x(often)S 168 x(useful)S 168 x(to)S 168 x +(move)S 168 x(a)S 168 x(single)S 548 y 4796 X(image)S 166 x(through)S +167 x(them)S 166 x(in)S 167 x(a)S 166 x(pipelin)S 2 x(ed)S 166 x +(fashion.)S 896 y 4796 X(In)S 169 x(pipeli)S 2 x(nes,)S 169 x(part)S +170 x(of)S 170 x(the)S 170 x(same)S 169 x(image)S 170 x(may)S 169 x +(be)S 170 x(in)S 170 x(the)S 170 x(\211rst)S 169 x(step)S 170 x +(while)S 170 x(another)S 171 x(part)S 170 x(may)S 169 x(be)S 170 x +(completing)S 171 x(the)S 170 x(last)S 548 y 4796 X(step.)S 255 x(A)S +168 x(very)S 169 x(useful)S 170 x(pipeli)S 2 x(ne)S 169 x(is)S 169 x +(the)S 170 x(transport-render)S -9 x(-display)S 170 x(pipe)S 170 x +(where)S 169 x(a)S 169 x(segmented)S 169 x(image)S 170 x(is)S 169 x +(moved)S 169 x(across)S 548 y 4796 X(the)S 166 x(wire)S 166 x(and)S +167 x(to)S 166 x(the)S 167 x(display)S 167 x(in)S 167 x(a)S 166 x +(continuou)S 2 x(s)S 165 x(fashion.)S 897 y 4796 X(Pipelini)S 2 x +(ng)S 180 x(has)S 180 x(a)S 180 x(number)S 179 x(of)S 180 x +(advantag)S 2 x(es.)S 276 x(First,)S 183 x(it)S 181 x(allows)S 181 x +(the)S 180 x(cli)S 2 x(ent)S 180 x(applic)S 2 x(ation)S 181 x(to)S +180 x(assemble)S 180 x(multipl)S 2 x(e)S 180 x(syn-)S 548 y 4796 X +(chronous)S 182 x(steps)S 182 x(which)S 183 x(are)S 182 x(likel)S +2 x(y)S 182 x(to)S 182 x(be)S 183 x(used)S 182 x(over)S 182 x(and)S +182 x(over)S 183 x(\(macros\).)S 280 x(Second,)S 186 x(in)S 182 x +(cases)S 183 x(where)S 182 x(display)S 183 x(is)S 548 y 4796 X(part)S +176 x(of)S 177 x(the)S 176 x(pipe,)S 180 x(it)S 177 x(feeds)S 176 x +(out)S 177 x(visual)S 177 x(information)S 177 x(as)S 177 x(it)S 177 x +(becomes)S 176 x(availa)S 2 x(ble)S 177 x(rather)S 176 x(than)S 177 x +(waiti)S 2 x(ng)S 176 x(for)S 176 x(step)S 177 x(wise)S 548 y 4796 X +(completion.)S 265 x(Third,)S 176 x(as)S 174 x(multiple)S 175 x +(processors)S 173 x(become)S 174 x(availa)S 2 x(ble)S 174 x(in)S +174 x(workstations,)S 176 x(it)S 175 x(allows)S 174 x(for)S 174 x +(some)S 173 x(degree)S 174 x(of)S 548 y 4796 X(parallel)S 167 x +(processing)S 167 x(as)S 166 x(dif)S -9 x(ferent)S 167 x(pipe)S 167 x +(elements)S 167 x(can)S 166 x(be)S 166 x(execut)S 2 x(ed)S 166 x(on)S +166 x(dif)S -9 x(ferent)S 167 x(processors.)S 896 y 4796 X(The)S +166 x(image)S 167 x(extension)S 167 x(package)S 167 x(will)S 167 x +(provide)S 167 x(for)S 166 x(the)S 166 x(de\211nit)S 2 x(ion)S 166 x +(and)S 167 x(execution)S 167 x(of)S 166 x(process)S 166 x(control)S +167 x(pipes.)S 35879 Y 16517 X F40(EXTENSION)S 165 x(ARCHI)S -2 x +(TECTURE)S 165 x(CONCEPTS)S 448 x(3\20315)S +1 PP +EP +%%Page 16 36 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 3600 X F36(3.4.1.8)S 599 x(Server)S 166 x(Display)S 167 x +(Hardware)S 165 x(Control)S 896 y 4796 X F78(The)S 172 x(X)S 171 x +(server)S 171 x(is)S 172 x(of)S 171 x(necessity)S 173 x(intimate)S +173 x(with)S 172 x(the)S 172 x(display)S 173 x(device.)S 260 x(In)S +172 x(the)S 172 x(past,)S 173 x(applicat)S 2 x(ions)S 172 x(have)S +172 x(been)S 172 x(intimate)S 548 y 4796 X(with)S 166 x(the)S 167 x +(display)S 167 x(device)S 167 x(\(through)S 167 x(a)S 166 x +(driver\))S 166 x(and)S 167 x(have)S 166 x(often)S 167 x(had)S 166 x +(sole)S 167 x(access)S 166 x(to)S 167 x(it)S 167 x(\(non-shared)S +166 x(resource\).)S 897 y 4796 X(Display)S 164 x(devices)S 164 x +(\(video)S 164 x(subsystems\))S 163 x(includ)S 2 x(e)S 163 x(scarce)S +164 x(resources)S 163 x(\(such)S 164 x(as)S 163 x(physical)S 165 x +(lookup)S 164 x(tabl)S 2 x(es,)S 163 x(display)S 165 x(bitmap)S 548 y +4796 X(memory)S -34 x(,)S 181 x(display)S 178 x(control)S 2 x(s,)S +180 x(specializ)S 2 x(ed)S 178 x(processors\))S 177 x(which)S 178 x +(must)S 178 x(now)S 177 x(be)S 178 x(managed)S 178 x(as)S 178 x +(shared)S 178 x(rather)S 178 x(than)S 179 x(an)S 548 y 4796 X +(applicat)S 2 x(ion)S 166 x(private)S 168 x(resource.)S 896 y 4796 X +(Whenever)S 169 x(possible,)S 170 x(these)S 169 x(resources)S 169 x +(should)S 169 x(be)S 169 x(accessed)S 169 x(indirect)S 2 x(ly)S 169 x +(through)S 169 x(protocol)S 170 x(functions)S 170 x(which)S 169 x +(involve)S 548 y 4796 X(their)S 155 x(use)S 155 x(rather)S 155 x +(than)S 156 x(direct)S 156 x(access)S 154 x(protocol)S 156 x +(functio)S 2 x(ns)S 154 x(designed)S 156 x(to)S 155 x(provide)S 155 x +(remote)S 155 x(control)S 156 x(register)S 156 x(bit)S 155 x(diddli)S +2 x(ng.)S 548 y 4796 X(But,)S 177 x(when)S 175 x(there)S 176 x(are)S +175 x(no)S 176 x(protocol)S 176 x(functions)S 176 x(which)S 176 x +(serve)S 175 x(this)S 176 x(purpose,)S 177 x(and)S 175 x(access)S +175 x(to)S 176 x(these)S 176 x(resources)S 175 x(is)S 175 x(still)S +548 y 4796 X(essential)S 174 x(to)S 174 x(appli)S 2 x(cations,)S +176 x(direct)S 174 x(access)S 174 x(protocol)S 175 x(functions)S +174 x(should)S 174 x(be)S 173 x(provided.)S 265 x(It)S 173 x(is)S +174 x(still)S 175 x(important)S 175 x(in)S 174 x(these)S 548 y 4796 X +(cases)S 173 x(that)S 175 x(these)S 174 x(direct)S 175 x(access)S +174 x(protocol)S 175 x(functions)S 174 x(provide)S 174 x(access)S +174 x(to)S 174 x(logic)S 2 x(al)S 174 x(resources)S 173 x(which)S +174 x(are)S 174 x(mapped)S 174 x(by)S 548 y 4796 X(the)S 166 x +(server)S 166 x(to)S 167 x(the)S 167 x(physical)S 167 x(device)S +167 x(resources)S 166 x(so)S 166 x(that)S 167 x(the)S 167 x +(physical)S 167 x(device)S 167 x(resources)S 166 x(remain)S 167 x +(sharable.)S 897 y 4796 X(The)S 173 x(following)S 174 x(subsections)S +173 x(examine)S 174 x(some)S 172 x(speci\211c)S 173 x(instanc)S 2 x +(es)S 172 x(and)S 173 x(assert)S 173 x(extension)S 174 x(package)S +174 x(policy)S 174 x(regarding)S 548 y 4796 X(these)S 166 x(video)S +167 x(subsystem)S 166 x(resources.)S 15183 Y 3600 X F36(3.4.1.8.)S +2 x(1)S 597 x(Shared)S 167 x(Hardware)S 165 x(Device)S 166 x +(Control)S 897 y 4796 X F78(There)S 178 x(are)S 177 x(a)S 178 x(set)S +178 x(of)S 177 x(display)S 179 x(hardware)S 177 x(resources)S 177 x +(and)S 178 x(controls)S 179 x(which)S 177 x(are)S 178 x(important)S +179 x(to)S 178 x(imaging)S 178 x(applica)S 2 x(tions.)S 548 y 4796 X +(These)S 180 x(include)S 182 x(look)S 180 x(up)S 180 x(tabl)S 2 x +(es)S 180 x(\(luts\),)S 183 x(display)S 181 x(memory)S 180 x(\(bit)S +181 x(map\),)S 182 x(pan)S 181 x(and)S 180 x(scroll)S 181 x +(registers,)S 183 x(and)S 181 x(brightness,)S 548 y 4796 X +(contrast,)S 166 x(hue,)S 166 x(and)S 166 x(saturati)S 2 x(on)S 166 x +(registers.)S 896 y 4796 X(On)S 166 x(todays)S 167 x(workstations)S +168 x(these)S 167 x(consist)S 168 x(of)S 166 x(a)S 167 x(single)S +168 x(set)S 167 x(of)S 166 x(resources)S 167 x(and)S 167 x(controls)S +168 x(for)S 166 x(the)S 168 x(entire)S 168 x(display)S 167 x(\(ie.)S +251 x(one)S 548 y 4796 X(physical)S 178 x(set)S 178 x(which)S 179 x +(must)S 177 x(be)S 178 x(shared)S 178 x(by)S 177 x(all)S 179 x +(concurrent)S 179 x(screen)S 178 x(users\).)S 271 x(In)S 178 x +(future)S 178 x(workstations,)S 181 x(there)S 178 x(may)S 178 x(be)S +548 y 4796 X(multiple)S 165 x(sets)S 165 x(perhaps)S 164 x(allowi)S +2 x(ng)S 164 x(one)S 164 x(per)S 165 x(window)S -33 x(.)S 249 x +(Access)S 164 x(to)S 164 x(these)S 165 x(device)S 166 x(controls)S +165 x(cannot)S 165 x(be)S 164 x(hidden)S 166 x(behind)S 165 x(or)S +548 y 4796 X(within)S 167 x(more)S 165 x(general)S 167 x(protocol)S +168 x(functions.)S 897 y 4796 X(The)S 184 x(core)S 183 x(protocol)S +185 x(has)S 183 x(addressed)S 184 x(access)S 184 x(to)S 184 x(and)S +183 x(control)S 185 x(over)S 184 x(some)S 182 x(of)S 184 x(these)S +184 x(while)S 184 x(others)S 184 x(have)S 184 x(been)S 184 x(left)S +548 y 4796 X(unexplored.)S 259 x(As)S 170 x(all)S 172 x(af)S -9 x +(fect)S 172 x(the)S 171 x(display)S 172 x(of)S 171 x(anything)S 172 x +(on)S 171 x(the)S 172 x(screen)S 171 x(\(text,)S 172 x(graphics,)S +173 x(images\),)S 171 x(they)S 172 x(should)S 171 x(all)S 172 x(be)S +548 y 4796 X(dealt)S 167 x(with)S 167 x(by)S 166 x(the)S 167 x(core)S +166 x(protocol.)S 896 y 4796 X(The)S 167 x(image)S 168 x(extension)S +168 x(will)S 168 x(use)S 167 x(core)S 168 x(protocol)S 168 x +(mechanisms)S 167 x(where)S 167 x(they)S 168 x(exist,)S 167 x(and)S +168 x(will)S 168 x(follow)S 168 x(the)S 167 x(core)S 168 x(protocol)S +548 y 4796 X(in)S 182 x(de\211ning)S 182 x(a)S 182 x(logic)S 2 x(al)S +182 x(to)S 182 x(physical)S 183 x(relati)S 2 x(onship)S 182 x(for)S +182 x(the)S 182 x(others.)S 280 x(It)S 182 x(is)S 182 x(hoped)S 183 x +(that)S 182 x(anythi)S 2 x(ng)S 182 x(that)S 182 x(the)S 183 x(X)S +181 x(image)S 548 y 4796 X(extension)S 167 x(must)S 166 x(do)S 166 x +(in)S 167 x(this)S 166 x(area)S 167 x(would)S 166 x(migrate)S 167 x +(into)S 167 x(the)S 167 x(core)S 166 x(X1)S -19 x(1)S 166 x +(protocol)S 168 x(over)S 166 x(time.)S 25196 Y 3600 X F36(3.4.1.8.)S +2 x(1.1)S 598 x(LUTS)S 167 x(and)S 166 x(Bit)S 166 x(Map)S 896 y +4796 X F78(The)S 174 x(core)S 175 x(protocol)S 176 x(de\211nes)S +174 x(a)S 175 x(scheme)S 174 x(for)S 174 x(maintaini)S 2 x(ng)S 174 x +(multipl)S 2 x(e)S 174 x(logic)S 2 x(al)S 175 x(sets)S 174 x(of)S +174 x(lookup)S 175 x(tabl)S 2 x(es,)S 176 x(and)S 174 x(the)S 175 x +(means)S 548 y 4796 X(for)S 170 x(associati)S 2 x(ng)S 171 x +(\(loading\))S 172 x(the)S 172 x(physical)S 172 x(tables)S 172 x +(from)S 170 x(the)S 172 x(logical)S 173 x(tables.)S 259 x(This)S +172 x(scheme,)S 171 x(and)S 172 x(potential)S 173 x(extensions)S +548 y 4796 X(to)S 166 x(it)S 167 x(for)S 166 x(displays)S 167 x +(with)S 167 x(multiple)S 167 x(LUT)S -34 x(s,)S 165 x(will)S 167 x +(be)S 167 x(used)S 166 x(by)S 166 x(the)S 167 x(extension)S 167 x +(package.)S 897 y 4796 X(Likewise,)S 179 x(the)S 177 x(extension)S +177 x(package)S 177 x(will)S 177 x(rely)S 177 x(upon)S 177 x(the)S +176 x(core)S 177 x(protocol)S 177 x(machinery)S 177 x(for)S 176 x +(access)S 176 x(to)S 177 x(the)S 177 x(display)S 177 x(bit)S 548 y +4796 X(map.)S 30127 Y 3600 X F36(3.4.1.8.)S 2 x(1.2)S 598 x +(Brightness)S 167 x(-)S 166 x(Contrast)S 165 x(-)S 166 x(Hue)S 166 x +(-)S 166 x(Saturation)S 897 y 4796 X F78(Many)S 168 x(of)S 169 x +(the)S 169 x(current)S 169 x(crop)S 169 x(of)S 168 x(imaging)S 169 x +(frame)S 169 x(buf)S -9 x(fers)S 168 x(provide)S 169 x(software)S +169 x(access)S 168 x(to)S 169 x(hardware)S 169 x(which)S 169 x +(controls)S 169 x(the)S 548 y 4796 X(overall)S 174 x(settings)S 174 x +(for)S 172 x(brightness,)S 175 x(contrast,)S 175 x(hue,)S 174 x(and)S +173 x(saturatio)S 2 x(n.)S 262 x(In)S 172 x(essence,)S 174 x(this)S +174 x(is)S 173 x(digita)S 2 x(l)S 173 x(access)S 173 x(to)S 173 x +(the)S 173 x(knobs)S 548 y 4796 X(on)S 166 x(a)S 166 x(televi)S 2 x +(sion.)S 896 y 4796 X(The)S 166 x(extension)S 168 x(package)S 166 x +(will)S 168 x(again)S 167 x(provide)S 166 x(a)S 167 x(logical)S 167 x +(to)S 167 x(physical)S 167 x(mapping)S 167 x(and)S 166 x(access)S +166 x(to)S 167 x(these)S 167 x(controls.)S 35879 Y 3600 X F40 +(3\20316)S 449 x(EXTENSION)S 165 x(ARCHITEC)S -2 x(TURE)S 166 x +(CONC)S -2 x(EPTS)S +1 PP +EP +%%Page 17 37 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 3600 X F36(3.4.1.8.)S 2 x(2)S 597 x(Use)S 166 x(of)S 166 x +(Image)S 167 x(Speci\211c)S 167 x(Accelerators)S 896 y 4796 X F78 +(Server)S 167 x(platforms)S 168 x(and)S 167 x(display)S 168 x +(subsystems)S 167 x(may)S 167 x(both)S 168 x(have)S 168 x(special)S +169 x(silicon)S 168 x(accel)S 2 x(erators)S 167 x(useful)S 168 x(in)S +168 x(various)S 167 x(image)S 548 y 4796 X(operations)S 173 x(such)S +173 x(as)S 172 x(compression)S 172 x(/)S 173 x(decompression)S 173 x +(and)S 173 x(renditio)S 2 x(n.)S 261 x(It)S 173 x(is)S 172 x(left)S +174 x(to)S 173 x(the)S 173 x(discretio)S 2 x(n)S 172 x(of)S 172 x +(the)S 174 x(extension)S 548 y 4796 X(server)S 168 x(implementor)S +169 x(if)S 169 x(and)S 168 x(how)S 168 x(to)S 169 x(make)S 168 x +(best)S 169 x(use)S 168 x(of)S 169 x(these)S 168 x(accel)S 2 x +(erators.)S 253 x(But,)S 169 x(the)S 169 x(extensi)S 2 x(on)S 168 x +(protocol)S 169 x(call)S 2 x(s)S 168 x(for)S 548 y 4796 X +(noti\211cati)S 2 x(on)S 166 x(of)S 166 x(the)S 167 x(client)S 168 x +(\(upon)S 166 x(request\))S 166 x(by)S 166 x(the)S 167 x(server)S +166 x(of)S 166 x(accelera)S 2 x(tor)S 166 x(assist)S 166 x(for)S +166 x(various)S 167 x(protocol)S 167 x(functions.)S 897 y 4796 X +(Regarding)S 188 x(access)S 187 x(by)S 187 x(the)S 188 x(client)S +188 x(to)S 188 x(these)S 188 x(accelerators,)S 193 x(the)S 188 x +(policy)S 188 x(is)S 187 x(that)S 188 x(hardware)S 187 x(accele)S +2 x(rators)S 187 x(used)S 187 x(by)S 548 y 4796 X(protocol)S 175 x +(supported)S 176 x(operations)S 175 x(should)S 175 x(not)S 176 x(be)S +174 x(made)S 175 x(explici)S 2 x(tly)S 175 x(avail)S 2 x(able)S 175 x +(through)S 175 x(control)S 176 x(requests.)S 266 x(They)S 175 x(are)S +548 y 4796 X(simply)S 166 x(used)S 166 x(locall)S 2 x(y)S 166 x(by)S +166 x(the)S 167 x(server)S 166 x(on)S 166 x(the)S 167 x(client)S +2 x(')S -28 x(s)S 166 x(behalf)S 167 x(and)S 166 x(without)S 167 x +(the)S 167 x(clien)S 2 x(t')S -28 x(s)S 166 x(knowledge.)S 11198 Y +3600 X F36(3.4.1.8.)S 2 x(3)S 597 x(Image)S 167 x(Capture)S 166 x +(Hardware)S 165 x(-)S 166 x(Live)S 167 x(V)S -9 x(ideo)S 897 y 4796 X +F78(The)S 169 x(core)S 170 x(X)S 169 x(protocol)S 170 x(provides)S +170 x(for)S 169 x(human)S 169 x(inte)S 2 x(rface)S 169 x(and)S 170 x +(interact)S 2 x(ion)S 169 x(mechanisms.)S 255 x(This)S 170 x +(include)S 2 x(s)S 169 x(the)S 170 x(means)S 169 x(to)S 548 y 4796 X +(pass)S 166 x(information)S 168 x(from)S 166 x(input)S 168 x(device)S +2 x(s)S 166 x(such)S 167 x(as)S 167 x(keyboards)S 167 x(and)S 167 x +(mice)S 167 x(on)S 167 x(to)S 168 x(the)S 167 x(clie)S 2 x(nt)S 167 x +(side)S 167 x(of)S 167 x(the)S 168 x(wire)S 167 x(where)S 167 x(the)S +548 y 4796 X(applicat)S 2 x(ion)S 166 x(decision)S 168 x(is)S 166 x +(made)S 166 x(regarding)S 167 x(its)S 166 x(impact)S 167 x(on)S 167 x +(operations)S 167 x(or)S 166 x(display)S -32 x(.)S 896 y 4796 X(In)S +184 x(certai)S 2 x(n)S 185 x(instances,)S 190 x(there)S 185 x(may)S +185 x(be)S 185 x(very)S 185 x(close)S 185 x(proximity)S 186 x +(between)S 186 x(image)S 185 x(capture)S 186 x(and)S 185 x(display)S +186 x(hardware.)S 548 y 4796 X(In)S 177 x(these)S 178 x(cases,)S +180 x(the)S 179 x(capture)S 178 x(device)S 179 x(may)S 178 x(be)S +177 x(control)S 2 x(led)S 178 x(through)S 178 x(the)S 179 x(same)S +177 x(hardware)S 177 x(inte)S 2 x(rface)S 178 x(as)S 177 x(the)S +178 x(display)S 548 y 4796 X(subsystem)S 161 x(and)S 161 x(may)S +161 x(actual)S 2 x(ly)S 162 x(digiti)S 2 x(ze)S 161 x(an)S 162 x +(image)S 162 x(and)S 161 x(deposit)S 163 x(it)S 162 x(directl)S 2 x +(y)S 161 x(into)S 162 x(the)S 162 x(display)S 163 x(memory)S 160 x +(\(RS170)S 162 x(frame)S 548 y 4796 X(grabber)S 166 x(and)S 166 x +(frame)S 166 x(buf)S -9 x(fer)S 166 x(display)S 167 x(memory)S 165 x +(typic)S 2 x(ally)S 167 x(share)S 166 x(board)S 166 x(space)S 166 x +(and)S 167 x(bus)S 166 x(interface)S 167 x(mechanisms\).)S 897 y +4796 X(As)S 176 x(the)S 177 x(capture)S 177 x(of)S 177 x(an)S 177 x +(image)S 177 x(is)S 176 x(not)S 178 x(strictly)S 178 x(a)S 177 x +(human)S 176 x(intera)S 2 x(ction)S 177 x(or)S 177 x(signaling)S +178 x(mechanism)S 177 x(such)S 176 x(as)S 177 x(keyboard)S 548 y +4796 X(input)S 185 x(or)S 183 x(mouse)S 184 x(pointing)S 2 x(,)S +187 x(a)S 184 x(hard)S 184 x(line)S 186 x(position)S 185 x(is)S 184 x +(that)S 185 x(image)S 184 x(capture)S 185 x(devices)S 185 x(should)S +184 x(not)S 185 x(logical)S 2 x(ly)S 184 x(be)S 184 x(on)S 548 y +4796 X(the)S 191 x(server)S 191 x(side)S 191 x(of)S 191 x(the)S 192 x +(X)S 191 x(wire.)S 298 x(But,)S 198 x(the)S 191 x(tight)S 193 x +(coupling)S 192 x(or)S 191 x(inti)S 2 x(macy)S 190 x(of)S 191 x +(such)S 191 x(capture)S 192 x(devices)S 192 x(with)S 192 x(the)S +547 y 4796 X(display)S 172 x(makes)S 170 x(it)S 172 x(at)S 172 x +(least)S 172 x(convenient)S 173 x(to)S 171 x(provide)S 172 x +(control)S 172 x(mechanisms)S 171 x(in)S 171 x(the)S 172 x +(protocol.)S 260 x(Support)S 172 x(for)S 170 x(control)S 172 x(of)S +548 y 4796 X(time)S 177 x(sequences)S 178 x(of)S 177 x(digiti)S 2 x +(zed)S 177 x(images)S 178 x(which)S 177 x(derive)S 178 x(from)S 176 x +(analog)S 178 x(video)S 178 x(sources)S 177 x(\(cameras,)S 179 x +(vcr)S 19 x(')S -28 x(s,)S 180 x(broad)S 177 x(band)S 548 y 4796 X +(broadcast...\))S 257 x(and)S 172 x(pass)S 170 x(through)S 172 x +(the)S 171 x(digit)S 2 x(al)S 171 x(domain)S 171 x(on)S 171 x(the)S +172 x(server)S 171 x(via)S 171 x(frame)S 171 x(digiti)S 2 x(zers,)S +171 x(make)S 171 x(it)S 172 x(a)S 171 x(requirement)S 548 y 4796 X +(that)S 167 x(the)S 166 x(control)S 168 x(mechanisms)S 166 x(be)S +166 x(in)S 166 x(the)S 167 x(protocol.)S 897 y 4796 X(As)S 173 x +(such,)S 175 x(the)S 174 x(policy)S 175 x(is)S 174 x(that)S 175 x +(the)S 174 x(extensi)S 2 x(on)S 173 x(package)S 175 x(will)S 175 x +(provide)S 174 x(protocol)S 175 x(mechanisms)S 174 x(\(control)S +174 x(requests\))S 174 x(for)S 548 y 4796 X(image)S 172 x(input)S +173 x(devices)S 173 x(\(such)S 172 x(as)S 172 x(frame)S 172 x +(grabbers\))S 172 x(which)S 173 x(are)S 172 x(tightl)S 2 x(y)S 172 x +(coupled)S 173 x(to)S 173 x(the)S 173 x(display)S 173 x(hardware)S +172 x(\(accessed)S 548 y 4796 X(through)S 181 x(common)S 179 x +(hardware)S 181 x(interface)S 182 x(and)S 180 x(sharing)S 181 x +(display)S 182 x(memory\).)S 276 x(These)S 181 x(mechanisms)S 180 x +(will)S 182 x(support)S 180 x(the)S 548 y 4796 X(windowing)S 173 x +(of)S 172 x(the)S 174 x(video)S 173 x(information)S 174 x(into)S +173 x(X)S 173 x(windows.)S 261 x(This)S 173 x(is)S 173 x(in)S 173 x +(lin)S 2 x(e)S 172 x(with)S 174 x(the)S 173 x(concept)S 174 x(of)S +172 x(a)S 173 x(tight)S 2 x(ly)S 173 x(packed)S 548 y 4796 X +("capture->render)S -9 x(->display")S 167 x(pipeli)S 2 x(ne)S 166 x +(and)S 166 x(time)S 167 x(sequence)S 167 x(support.)S 896 y 4796 X +(The)S 174 x(policy)S 175 x(will)S 175 x(allow)S 175 x(control)S +175 x(over)S 174 x(tight)S 2 x(ly)S 174 x(coupled)S 175 x(image)S +175 x(capture)S 174 x(device)S 2 x(s)S 173 x(\(frame)S 174 x +(grabbers\))S 174 x(and)S 174 x(live)S 175 x(video)S 548 y 4796 X +(windowing)S 181 x(\(video)S 181 x(rate)S 181 x(time)S 181 x +(sequencing\))S 181 x(to)S 181 x(occur)S 181 x(under)S 180 x(X.)S +180 x(V)S -30 x(ideo)S 181 x(from)S 180 x(digital)S 182 x(or)S 181 x +(analog)S 181 x(sources)S 180 x(which)S 548 y 4796 X(can)S 170 x(be)S +170 x(presented)S 171 x(to)S 170 x(the)S 171 x(display)S 171 x +(subsystem)S 169 x(at)S 171 x(video)S 170 x(frame)S 170 x(rates)S +170 x(in)S 171 x(DIGIT)S -41 x(AL)S 170 x(\(vs)S 170 x(analog\))S +170 x(format)S 170 x(and)S 171 x(can)S 170 x(be)S 548 y 4796 X +(converted)S 174 x(back)S 174 x(to)S 175 x(analog)S 174 x(format)S +174 x(by)S 174 x(the)S 174 x(display)S 175 x(subsystem)S 173 x(in)S +175 x(a)S 174 x(way)S 173 x(which)S 174 x(is)S 174 x(compatibl)S +2 x(e)S 174 x(with)S 174 x(the)S 174 x(display)S 548 y 4796 X +(refresh)S 175 x(mechanisms,)S 177 x(can)S 175 x(be)S 176 x +(displayed)S 177 x(in)S 175 x(appli)S 2 x(cation)S 177 x +(speci\211ed)S 176 x(X)S 175 x(windows.)S 267 x(The)S 176 x(policy)S +176 x(will)S 177 x(NOT)S 175 x(support)S 548 y 4796 X(analog)S 177 x +(video)S 177 x(windowing)S 177 x(\(switching)S 178 x(/)S 176 x +(mixing)S 178 x(analog)S 177 x(video)S 177 x(in)S 177 x(the)S 177 x +(display)S 178 x(subsystem,)S 178 x(control)S 177 x(over)S 177 x +(analog)S 548 y 4796 X(broadcast)S 166 x(video)S 167 x(equipment)S +167 x(etc.\).)S 897 y 4796 X(Applicati)S 2 x(ons)S 190 x(which)S +191 x(should)S 192 x(bene\211t)S 191 x(from)S 191 x(this)S 191 x +(capabil)S 2 x(ity)S 192 x(are)S 191 x(those)S 191 x(which)S 191 x +(use)S 191 x(video)S 191 x(informati)S 2 x(on)S 190 x(\(time)S 548 y +4796 X(sequences)S 183 x(of)S 183 x(individual)S 185 x(frames\))S +182 x(which)S 183 x(derives)S 184 x(from)S 182 x(a)S 183 x(camera)S +183 x(or)S 182 x(perhaps)S 183 x(a)S 183 x(laser)S 184 x(disk,)S +187 x(and)S 183 x(which)S 183 x(is)S 183 x(in)S 548 y 4796 X +(digital)S 169 x(format)S 168 x(already)S -32 x(,)S 168 x(or)S 167 x +(is)S 168 x(converted)S 169 x(by)S 167 x(devices)S 169 x(such)S 167 x +(as)S 168 x(frame)S 167 x(grabber/digi)S 2 x(tizers)S 168 x(into)S +169 x(digital)S 169 x(format)S 168 x(within)S 548 y 4796 X(the)S +166 x(server)S 166 x(display)S 167 x(subsystem.)S 896 y 4796 X(Note)S +170 x(that)S 172 x(this)S 171 x(positi)S 2 x(on)S 170 x(stil)S 2 x +(l)S 171 x(leaves)S 171 x(loosely)S 171 x(couple)S 2 x(d)S 170 x +(image)S 171 x(capture)S 171 x(device)S 2 x(s)S 170 x(which)S 171 x +(happen)S 171 x(to)S 171 x(be)S 171 x(plugged)S 171 x(into)S 548 y +4796 X(an)S 174 x(open)S 175 x(bus)S 174 x(on)S 175 x(the)S 175 x +(server)S 175 x(node)S 174 x(\(such)S 175 x(as)S 174 x(document)S +175 x(scanners\))S 175 x(on)S 174 x(the)S 175 x(cli)S 2 x(ent)S 175 x +(side)S 175 x(of)S 174 x(the)S 175 x(wire)S 175 x(\(they)S 175 x +(will)S 175 x(not)S 548 y 4796 X(be)S 168 x(supported)S 169 x(in)S +168 x(the)S 169 x(image)S 169 x(extension)S 169 x(protocol)S 2 x +(\).)S 252 x(It)S 169 x(also)S 169 x(leaves)S 169 x(the)S 168 x +(computer)S 169 x(interfaces)S 169 x(\(typic)S 2 x(ally)S 169 x +(rs232)S 168 x(serial)S 548 y 4796 X(line)S 169 x(ports\))S 168 x +(of)S 168 x(video)S 170 x(source)S 168 x(devices)S 169 x(such)S 168 x +(as)S 168 x("video)S 170 x(disc)S 168 x(players",)S 170 x(vcr)S 18 x +(')S -27 x(s,)S 168 x(video)S 169 x(tuner)S 19 x(')S -28 x(s,)S 168 x +(etc.)S 254 x(on)S 169 x(the)S 168 x(cli)S 2 x(ent)S 169 x(side)S +548 y 4796 X(of)S 165 x(the)S 167 x(wire.)S 35879 Y 16517 X F40 +(EXTENSION)S 165 x(ARCHI)S -2 x(TECTURE)S 165 x(CONCEPTS)S 448 x +(3\20317)S +1 PP +EP +%%Page 18 38 +1000 BP 39600 30600 PM 0 0 XY +5155 Y 3600 X F36(3.4.1.8.)S 2 x(4)S 597 x(Extensib)S 2 x(ility)S +897 y 4796 X F78(The)S 168 x(core)S 168 x(X)S 167 x(system)S 168 x +(wisely)S 168 x(provides)S 169 x(the)S 168 x(abili)S 2 x(ty)S 168 x +(to)S 168 x(extend)S 169 x(itself)S 169 x(into)S 169 x(various)S +168 x(applic)S 2 x(ation)S 169 x(domains.)S 252 x(The)S 168 x(image)S +548 y 4796 X(extension)S 167 x(package)S 167 x(is)S 166 x(one)S 166 x +(such)S 167 x(extension)S 167 x(into)S 167 x(the)S 167 x(imaging)S +167 x(applicat)S 2 x(ion)S 166 x(domain.)S 896 y 4796 X(In)S 170 x +(order)S 170 x(to)S 170 x(be)S 171 x(useful,)S 171 x(the)S 171 x +(imaging)S 170 x(extensi)S 2 x(on)S 170 x(package)S 171 x(must)S +170 x(also)S 170 x(provide)S 171 x(for)S 170 x(growth)S 170 x(and)S +171 x(extension.)S 258 x(Perhaps)S 548 y 4796 X(the)S 174 x(most)S +173 x(troublesome)S 174 x(area)S 173 x(for)S 173 x(the)S 174 x +(extensi)S 2 x(on)S 173 x(package)S 174 x(is)S 174 x(image)S 173 x +(enhancement)S 175 x(processing)S 174 x(where)S 173 x(the)S 174 x +(number)S 548 y 4796 X(of)S 175 x(algori)S 2 x(thms,)S 177 x +(approaches,)S 179 x(and)S 176 x(combinati)S 2 x(ons)S 176 x(is)S +176 x(limitl)S 2 x(ess.)S 268 x(Providing)S 177 x(an)S 176 x(open)S +177 x(extension)S 177 x(mechanism)S 176 x(at)S 177 x(the)S 548 y +4796 X(protocol)S 167 x(level)S 167 x(for)S 166 x(this)S 167 x(area)S +166 x(is)S 167 x(inviti)S 2 x(ng)S 166 x(disaster)S -27 x(.)S 897 y +4796 X(Instead,)S 161 x(the)S 161 x(poli)S 2 x(cy)S 160 x(will)S +162 x(be)S 161 x(to)S 161 x(attempt)S 161 x(to)S 162 x(achieve)S +161 x(consensus)S 161 x(regarding)S 161 x(what)S 161 x(is)S 161 x +(the)S 161 x(basic)S 161 x(processing)S 161 x(machinery)S 548 y +4796 X(necessary)S 176 x(to)S 176 x(support)S 177 x(multiple)S 177 x +(enhancement)S 177 x(approaches.)S 269 x(This)S 177 x(machinery)S +176 x(will)S 178 x(reside)S 176 x(on)S 176 x(the)S 177 x(server)S +176 x(side)S 176 x(of)S 548 y 4796 X(the)S 167 x(wire)S 167 x(and)S +167 x(be)S 167 x(accessed)S 167 x(through)S 167 x(the)S 168 x(wire)S +167 x(protocol.)S 251 x(The)S 167 x(server)S 167 x(side)S 167 x +(processing)S 167 x(machinery)S 167 x(will)S 168 x(be)S 167 x(kept)S +167 x(to)S 168 x(a)S 548 y 4796 X(very)S 166 x(basic)S 166 x(level)S +168 x(and)S 166 x(no)S 166 x(extensi)S 2 x(on)S 166 x(mechnicanism)S +166 x(will)S 168 x(be)S 166 x(provided.)S 896 y 4796 X(Flexibil)S +2 x(ity)S 170 x(is)S 170 x(achieved)S 170 x(through)S 170 x(the)S +170 x(use)S 169 x(of)S 170 x(parameters)S 169 x(for)S 169 x(this)S +170 x(machinery)S -31 x(,)S 169 x(through)S 170 x(the)S 170 x(abili)S +2 x(ty)S 170 x(to)S 170 x(build)S 170 x(higher)S 548 y 4796 X(level)S +165 x(enhancement)S 165 x(processes)S 164 x(with)S 165 x(various)S +164 x(combinati)S 2 x(ons)S 164 x(of)S 164 x(the)S 164 x(machinery)S +-31 x(,)S 164 x(and)S 164 x(through)S 165 x(low)S 164 x(level)S 165 x +(support)S 165 x(for)S 548 y 4796 X(these)S 166 x(macros)S 166 x(on)S +166 x(the)S 167 x(server)S 166 x(side)S 166 x(in)S 167 x(terms)S +166 x(of)S 166 x("process)S 166 x(pipeli)S 2 x(nes".)S 897 y 4796 X +(The)S 169 x(extension)S 170 x(capabi)S 2 x(lity)S 170 x(will)S 170 x +(be)S 169 x(provided)S 170 x(at)S 170 x(the)S 170 x(tool)S 170 x +(kit)S 170 x(level)S 170 x(where)S 169 x(the)S 170 x(problem)S 169 x +(of)S 169 x(a)S 169 x(potent)S 2 x(ially)S 170 x(explosive)S 548 y +4796 X(number)S 165 x(of)S 166 x("my)S 166 x(favorite)S 167 x(image)S +167 x(enhancement)S 167 x(process")S 166 x(can)S 167 x(better)S 167 x +(be)S 166 x(dealt)S 168 x(with.)S 16612 Y 3600 X F28(3.4.2)S 599 x +(Client-Server)S 167 x(Model)S 17708 Y 4796 X F78(The)S 188 x(image)S +189 x(extension)S 189 x(follows)S 189 x(the)S 189 x(core)S 188 x +(protocol)S 190 x(in)S 188 x(the)S 189 x(use)S 189 x(of)S 188 x(a)S +188 x(client)S 2 x(-server)S 188 x(model.)S 293 x(Functions)S 189 x +(which)S 548 y 4796 X(the)S 183 x(server)S 183 x(performs)S 182 x +(on)S 182 x(behalf)S 184 x(of)S 183 x(the)S 183 x(applic)S 2 x +(ation)S 184 x(client)S 184 x(are)S 183 x(known)S 183 x(as)S 182 x +(services.)S 283 x(Although)S 184 x(most)S 182 x(services)S 548 y +4796 X(accomplish)S 180 x(things)S 181 x(which)S 180 x(an)S 180 x +(applic)S 2 x(ation)S 181 x(cares)S 180 x(directly)S 181 x(about,)S +184 x(some)S 179 x(services)S 180 x(involve)S 181 x(the)S 181 x +(overhead)S 180 x(of)S 180 x(the)S 548 y 4796 X(client)S 167 x +(server)S 166 x(model)S 167 x(and)S 166 x(potenti)S 2 x(al)S 167 x +(physical)S 167 x(separation.)S 20846 Y 3600 X F36(3.4.2.1)S 599 x +(Server)S 166 x(Resources)S 897 y 4796 X F78(W)S -20 x(ithin)S 173 x +(the)S 172 x(client)S 173 x(portion)S 173 x(of)S 171 x(the)S 172 x +(applica)S 2 x(tion,)S 173 x(the)S 172 x(applica)S 2 x(tion)S 172 x +(maintain)S 2 x(s)S 171 x(private)S 172 x(data)S 173 x(structures)S +172 x(for)S 171 x(storage)S 172 x(of)S 548 y 4796 X(image)S 178 x +(data,)S 181 x(and)S 179 x(applicat)S 2 x(ions)S 178 x(state)S 179 x +(and)S 178 x(control)S 180 x(information.)S 273 x(W)S -19 x(ithin)S +179 x(the)S 179 x(server)S 178 x(portion)S 179 x(of)S 178 x(the)S +179 x(applicat)S 2 x(ion,)S 548 y 4796 X(objects)S 169 x(which)S +168 x(are)S 169 x(maintained)S 169 x(and)S 169 x(used)S 168 x(by)S +168 x(the)S 169 x(server)S 168 x(in)S 169 x(providing)S 169 x(the)S +169 x(services,)S 169 x(and)S 168 x(are)S 168 x(known)S 168 x(about)S +169 x(by)S 168 x(the)S 548 y 4796 X(client,)S 163 x(are)S 162 x +(referred)S 161 x(to)S 162 x(as)S 161 x(resources.)S 249 x(The)S +162 x(extension)S 162 x(package)S 163 x(resource)S 161 x(concepts)S +162 x(are)S 162 x(presented)S 162 x(in)S 162 x(the)S 162 x(chapter)S +162 x(on)S 548 y 4796 X(extension)S 167 x(protocol)S 167 x +(elements.)S 25429 Y 3600 X F36(3.4.2.2)S 599 x(Service)S 166 x +(Classes)S 897 y 4796 X F78(A)S 177 x(taxonomy)S 178 x(of)S 177 x +(imaging)S 179 x(services)S 178 x(may)S 177 x(be)S 178 x(or)S -9 x +(ganized)S 178 x(at)S 179 x(the)S 178 x(lowest)S 178 x(level)S 179 x +(into)S 179 x(CLASSES)S 178 x(based)S 177 x(upon)S 178 x(com-)S 548 y +4796 X(monalty)S 169 x(of)S 169 x(purpose,)S 169 x(and)S 169 x(or)S +-9 x(ganized)S 170 x(at)S 170 x(the)S 169 x(highest)S 170 x(level)S +170 x(into)S 170 x(GROUPS)S 168 x(based)S 169 x(upon)S 169 x(device)S +170 x(dependence.)S 255 x(This)S 548 y 4796 X(section)S 167 x +(simply)S 166 x(sets)S 166 x(down)S 166 x(the)S 167 x(aggregati)S +2 x(on.)S 248 x(The)S 167 x(next)S 167 x(chapter)S 167 x(explores)S +166 x(the)S 167 x(content)S 2 x(s)S 166 x(in)S 166 x(more)S 166 x +(detail)S 2 x(.)S 35879 Y 3600 X F40(3\20318)S 449 x(EXTENSION)S +165 x(ARCHITEC)S -2 x(TURE)S 166 x(CONC)S -2 x(EPTS)S +1 PP +EP +%%Page 19 39 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 4796 X F36(Figure)S 167 x(3\2032:)S 498 x(SER)S -9 x(VICE)S +167 x(CLASS)S 166 x(GROU)S -2 x(PS)S 548 y 4796 X 22116 24 R 6941 Y +5991 X F102(+--------------)S 2 x(------------+------)S 2 x +(-------------------)S 2 x(------+)S 448 y 5991 X(|)S 478 x(DEVICE)S +240 x(INDEPENDENT)S 12447 X(|)S 14360 X(DEVICE)S 239 x(DEPENDENT)S +20098 X(|)S 448 y 5991 X(|)S 478 x(IMAGING)S 240 x(SERVICES)S 12447 X +(|)S 14360 X(IMAGING)S 239 x(SERVICES)S 20098 X(|)S 449 y 5991 X +(+--------------)S 2 x(------------+------)S 2 x +(-------------------)S 2 x(------+)S 448 y 5991 X(|)S 7904 X(.)S +239 x(session)S 12447 X(|)S 14360 X(.)S 239 x(device)S 240 x +(control)S 20098 X(|)S 448 y 5991 X(|)S 7904 X(.)S 239 x(resource)S +12447 X(|)S 14360 X(.)S 239 x(rendition)S 20098 X(|)S 448 y 5991 X +(|)S 7904 X(.)S 239 x(transport)S 12447 X(|)S 14360 X(.)S 239 x +(display)S 20098 X(|)S 449 y 5991 X(|)S 7904 X(.)S 239 x +(enhancement)S 12447 X(|)S 20098 X(|)S 448 y 5991 X(|)S 7904 X(.)S +239 x(process)S 240 x(control)S 479 x(|)S 20098 X(|)S 448 y 5991 X +(+--------------)S 2 x(------------+------)S 2 x +(-------------------)S 2 x(------+)S 673 y 4796 X 22116 24 R 897 y +4796 X F78(W)S -20 x(ithin)S 176 x(the)S 175 x(X)S 173 x(image)S +175 x(extension)S 176 x(server)S -20 x(,)S 175 x(imaging)S 176 x +(service)S 174 x(classes)S 175 x(may)S 174 x(be)S 174 x(grouped)S +175 x(into)S 175 x(two)S 175 x(major)S 174 x(categori)S 2 x(es:)S +548 y 4796 X(those)S 177 x(which)S 177 x(are)S 177 x(device)S 178 x +(independen)S 2 x(t,)S 179 x(and)S 177 x(those)S 178 x(which)S 177 x +(are)S 177 x(device)S 178 x(dependent.)S 271 x(Although)S 178 x(all)S +178 x(service)S 178 x(imple-)S 547 y 4796 X(mentations)S 181 x(may)S +181 x(in)S 181 x(some)S 180 x(way)S 181 x(depend)S 181 x(upon)S 181 x +(the)S 182 x(device)S 181 x(they)S 182 x(reside)S 181 x(upon,)S 184 x +(some)S 180 x(services)S 182 x(require)S 181 x(intimat)S 2 x(e)S +548 y 4796 X(knowledge)S 174 x(of)S 173 x(the)S 174 x(display)S 174 x +(and)S 174 x(display)S 174 x(processing)S 174 x(subsystem)S 173 x +(to)S 174 x(perform)S 173 x(their)S 174 x(job,)S 175 x(while)S 174 x +(others)S 174 x(do)S 174 x(not.)S 263 x(As)S 548 y 4796 X(such,)S +184 x(it)S 182 x(is)S 182 x(service)S 182 x(dependence)S 182 x(upon)S +181 x(int)S 2 x(imate)S 182 x(knowledge)S 182 x(of)S 181 x(the)S +182 x(display)S 182 x(subsystem)S 181 x(that)S 182 x(is)S 182 x(the)S +182 x(metric)S 182 x(for)S 548 y 4796 X(group)S 166 x(categoriza)S +2 x(tion)S 167 x(of)S 166 x(the)S 166 x(services.)S 897 y 4796 X +(Although)S 174 x(there)S 173 x(is)S 174 x(a)S 173 x(logical)S 175 x +(relatio)S 2 x(nship)S 173 x(\(in)S 174 x(terms)S 172 x(of)S 173 x +(positi)S 2 x(on)S 173 x(within)S 174 x(the)S 174 x(X)S 173 x(model)S +173 x(levels)S 174 x(diagram\))S 174 x(between)S 548 y 4796 X(the)S +175 x(two)S 174 x(service)S 175 x(groups,)S 176 x(the)S 175 x +(physical)S 175 x(relat)S 2 x(ionship)S 175 x(is)S 175 x(not)S 174 x +(quit)S 2 x(e)S 174 x(as)S 174 x(simple)S 175 x(as)S 174 x(all)S +176 x(device)S 175 x(independe)S 2 x(nt)S 174 x(services)S 548 y +4796 X(being)S 173 x(built)S 174 x(upon)S 173 x(the)S 173 x(device)S +174 x(dependent)S 174 x(services.)S 262 x(In)S 172 x(fact,)S 174 x +(to)S 174 x(a)S 172 x(lar)S -8 x(ge)S 173 x(extent,)S 175 x(the)S +173 x(device)S 174 x(independent)S 174 x(services)S 548 y 4796 X +(are)S 166 x(not)S 166 x(built)S 168 x(upon)S 166 x(the)S 167 x +(device)S 167 x(dependent)S 168 x(services.)S 19319 Y 3600 X F36 +(3.4.2.3)S 599 x(Service)S 166 x(Events)S 897 y 4796 X F78(All)S +171 x(core)S 172 x(protocol)S 172 x(event)S 172 x(mechanisms)S 171 x +(will)S 172 x(be)S 172 x(availabl)S 2 x(e)S 171 x(to)S 172 x(image)S +172 x(extension)S 172 x(package)S 172 x(users.)S 259 x(In)S 171 x +(additi)S 2 x(on,)S 172 x(a)S 171 x(set)S 548 y 4796 X(of)S 174 x +(image)S 175 x(extension)S 175 x(package)S 176 x(speci\211c)S 175 x +(events)S 175 x(will)S 175 x(be)S 175 x(availabl)S 2 x(e.)S 265 x +(There)S 175 x(is)S 175 x(no)S 174 x(relat)S 2 x(ionship)S 175 x +(between)S 175 x(these)S 175 x(two)S 548 y 4796 X(sets)S 173 x(of)S +173 x(events)S 174 x(other)S 174 x(than)S 174 x(that)S 174 x +(establi)S 2 x(shed)S 173 x(by)S 173 x(an)S 173 x(appli)S 2 x +(cation.)S 264 x(Image)S 173 x(speci\211c)S 174 x(events)S 174 x +(are)S 173 x(discussed)S 174 x(brie\212y)S 173 x(in)S 548 y 4796 X +(the)S 166 x(chapter)S 167 x(on)S 166 x(extensi)S 2 x(on)S 166 x +(protocol)S 167 x(elements.)S 23503 Y 3600 X F28(3.5)S 599 x(T)S +-33 x(ransfer)S 166 x(Model)S 167 x(vs)S 167 x(X)S 166 x(W)S -5 x +(ire)S 24749 Y 4796 X F78(The)S 177 x(image)S 178 x(transfer)S 178 x +(process)S 177 x(depict)S 2 x(ed)S 177 x(in)S 178 x(Figure)S 178 x +(2-1)S 178 x(shows)S 176 x(how)S 177 x(conti)S 2 x(nuous)S 177 x +(images)S 178 x(are)S 177 x(captured,)S 181 x(and)S 178 x(how)S 548 y +4796 X(captured)S 187 x(and)S 186 x(synthesized)S 188 x(digital)S +188 x(images)S 186 x(move)S 186 x(through)S 187 x(enhancement,)S +192 x(and)S 187 x(rendition)S 188 x(processes)S 186 x(towards)S 548 y +4796 X(display)S -32 x(.)S 256 x(Figure)S 170 x(4-3)S 170 x(shows)S +168 x(the)S 171 x(locatio)S 2 x(n)S 169 x(of)S 170 x(the)S 170 x +(core)S 170 x(X)S 169 x(protocol)S 171 x(wire)S 169 x(and)S 170 x +(the)S 170 x(extensi)S 2 x(on)S 169 x(X)S 169 x(protocol)S 171 x +(wire)S 170 x(with)S 548 y 4796 X(relationshi)S 2 x(p)S 166 x(to)S +166 x(stages)S 167 x(of)S 166 x(the)S 166 x(transfer)S 167 x(model.)S +896 y 4796 X(There)S 168 x(is)S 168 x(a)S 168 x(signi\211ca)S 2 x +(nt)S 168 x(shift)S 169 x(of)S 167 x(the)S 169 x(X)S 168 x(protocol)S +169 x(wire)S 168 x(between)S 169 x(the)S 168 x(core)S 169 x(and)S +168 x(the)S 168 x(extensi)S 2 x(on)S 168 x(protocol)S 169 x(with)S +169 x(regards)S 548 y 4796 X(to)S 175 x(the)S 175 x(transfer)S 175 x +(model.)S 267 x(Based)S 175 x(upon)S 175 x(the)S 175 x(guidel)S 2 x +(ines)S 175 x(set)S 175 x(forth)S 175 x(in)S 175 x(the)S 176 x +(previous)S 175 x(section,)S 178 x(the)S 175 x(extension)S 176 x +(protocol)S 548 y 4796 X(moves)S 171 x(rendition)S 173 x(processing)S +172 x(\(which)S 172 x(is)S 171 x(a)S 172 x(display)S 173 x(device)S +172 x(dependent)S 173 x(function\))S 173 x(across)S 171 x(the)S 172 x +(wire)S 172 x(into)S 173 x(the)S 172 x(server)S -28 x(.)S 548 y +4796 X(The)S 166 x(extension)S 168 x(also)S 166 x(lets)S 167 x +(those)S 167 x(elements)S 166 x(of)S 166 x(inte)S 2 x(ractive)S 167 x +(enhancement)S 167 x(move)S 166 x(across)S 166 x(the)S 167 x(wire.)S +35879 Y 16517 X F40(EXTENSION)S 165 x(ARCHI)S -2 x(TECTURE)S 165 x +(CONCEPTS)S 448 x(3\20319)S +1 PP +EP +%%Page 20 40 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 4796 X F36(Figure)S 167 x(3\2033:)S 498 x(TRANSFER)S 166 x +(MODEL)S 165 x(&)S 166 x(X)S 166 x(WIRE)S 167 x(LOCA)S -38 x(TION)S +548 y 4796 X 22116 24 R 640 y 8382 X F102(FLOW)S 16512 X(CONCEPT)S +748 y 7665 X(real)S 239 x(world)S 448 y 7187 X(object)S 239 x(or)S +240 x(scene)S 448 y 8860 X(|)S 449 y -239 x(|)S 239 x(image)S 240 x +(formation)S 448 y 8860 X(v)S 448 y 7665 X(continuous)S 15077 X +(Human)S 240 x(Visual)S 239 x(Perception)S 448 y 8382 X(image)S +16033 X("Visual)S 240 x(Types")S 449 y 8860 X(|)S 448 y -239 x(|)S +239 x(sensing/di)S 2 x(gitization)S 448 y 8860 X(|)S 19859 X(analog)S +479 x(image)S 449 y 4796 X(.................|..)S 2 x +(...................)S 2 x(...................)S 2 x +(....................)S 2 x(..)S 448 y 8860 X(|)S 19859 X(digital)S +240 x(image)S 448 y 5035 X(SYNTHESIS)S 8143 X(CAPTURE)S 449 y 5991 X +(|)S 8860 X(|)S 448 y 5991 X(|)S 8860 X(|)S 10295 X(^)S 239 x(image)S +240 x(data)S 239 x(pulled)S 240 x(back)S 239 x(by)S 240 x(client)S +448 y 5991 X(+-----+-----+)S 10295 X(|)S 449 y 7426 X(|)S 10295 X(|)S +11969 X(compression)S 240 x(/)S 239 x(decompression)S 448 y 4796 X +(xxxxxxxxxxx+xxxxxxxx)S 2 x(xxx+xxxxxxxxxxxxxxx)S 2 x +(xxxxxxxxxxxxxxxxxxx)S 2 x(xx)S 717 x(extension)S 240 x(x)S 239 x +(wire)S 448 y 7426 X(|)S 10295 X(|)S 11969 X(compression)S 240 x(/)S +239 x(decompression)S 449 y 7426 X(v)S 10295 X(|)S 448 y 5752 X +(+-->digital-----)S 2 x(---+)S 15077 X(Revisable)S 240 x(Form)S 240 x +(Image)S 448 y 5752 X(|)S 6947 X(image)S 15077 X(Representation)S +241 x(Efficiency)S 240 x(vs)S 239 x(Fidelity)S 449 y 5752 X(|)S +7426 X(|)S 11012 X(Digital)S 240 x(Image)S 240 x(Classes)S 448 y +5752 X(|)S 7426 X(|)S 448 y 5752 X(|)S 7426 X(|)S 239 x(enhancement)S +15077 X(Interactive)S 240 x(Enhancement)S 240 x(Processing)S 449 y +5752 X(|)S 7426 X(|)S 448 y 5752 X(+<-----+)S 448 y 5752 X(^)S 7426 X +(|)S 448 y 5752 X(|)S 7426 X(|)S 239 x(rendition)S 15077 X +(Rendition)S 240 x(Processing)S 449 y 5752 X(|)S 7426 X(|)S 448 y +5752 X(+------+)S 448 y -238 x(|)S 15077 X(Optional)S 240 x +(Compression)S 449 y 4796 X(xxxxxxxxxxx+xxxxxxxx)S 2 x +(xxxxxxxxxxxxxxxxxxx)S 2 x(xxxxxxxxxxxxxxxxxxx)S 2 x(x)S 717 x(core)S +239 x(x)S 240 x(wire)S 448 y 7426 X(|)S 15077 X(Optional)S 240 x +(Decompression)S 448 y 7426 X(+<---tightly)S 240 x(coupled)S 449 y +7426 X(|)S 8621 X(capture)S 240 x(devices)S 448 y 7426 X(|)S 448 y +-239 x(v)S 449 y 6708 X(digital)S 15077 X(Final)S 240 x(Form)S 239 x +(Image)S 448 y 6947 X(image)S 15077 X(Rendition)S 240 x(Fidelity)S +448 y 7426 X(|)S 19859 X(digital)S 240 x(image)S 449 y 4796 X +(...........|........)S 2 x(...................)S 2 x +(...................)S 2 x(....................)S 2 x(..)S 448 y +7426 X(|)S 19859 X(analog)S 479 x(image)S 448 y 7426 X(|)S 239 x +(display)S 449 y 7426 X(|)S 448 y -239 x(v)S 15077 X(Human)S 240 x +(Visual)S 239 x(Perception)S 448 y 5991 X(screen)S 240 x(image)S +16033 X("Visual)S 240 x(Types")S 673 y 4796 X 22116 24 R 35879 Y +3600 X F40(3\20320)S 449 x(EXTENSION)S 165 x(ARCHITEC)S -2 x(TURE)S +166 x(CONC)S -2 x(EPTS)S +1 PP +EP +%%Page 1 41 +1000 BP 39600 30600 PM 0 0 XY +9007 Y 3600 X F24(Chapter)S 498 x(4)S 10651 Y 3600 X(EXTENSION)S +165 x(PROT)S -13 x(OCOL)S 165 x(ELEMENTS)S 13357 Y 4796 X F78(This)S +168 x(chapter)S 169 x(presents)S 169 x(an)S 168 x(overview)S 169 x +(of)S 167 x(the)S 169 x(extensio)S 2 x(n)S 168 x(protocol)S 169 x +(includi)S 2 x(ng)S 168 x(service)S 169 x(classes,)S 168 x(server)S +168 x(resources,)S 168 x(and)S 548 y 4796 X(an)S 166 x(operational)S +168 x(model.)S 15549 Y 3600 X F28(4.1)S 599 x(Services)S 16794 Y +4796 X F78(Services)S 171 x(are)S 170 x(the)S 171 x(functio)S 2 x +(ns)S 170 x(performed)S 170 x(by)S 170 x(the)S 172 x(server)S 170 x +(for)S 170 x(the)S 171 x(clie)S 2 x(nt.)S 258 x(In)S 170 x(the)S +171 x(protocol,)S 172 x(they)S 171 x(are)S 171 x(implemented)S 172 x +(as)S 548 y 4796 X(client)S 168 x(requests.)S 250 x(Some)S 167 x(of)S +166 x(the)S 168 x(services)S 167 x(listed)S 168 x(below)S 167 x(are)S +167 x(potenti)S 2 x(ally)S 168 x(provided)S 167 x(by)S 167 x(or)S +167 x(through)S 167 x(the)S 167 x(use)S 167 x(of)S 167 x(existing)S +548 y 4796 X(core)S 166 x(protocol)S 167 x(services)S 167 x(\(such)S +166 x(as)S 166 x(resource)S 166 x(class)S 166 x(services\).)S 249 x +(They)S 167 x(are)S 166 x(listed)S 168 x(here)S 166 x(for)S 166 x +(completeness.)S 19384 Y 3600 X F28(4.1.1)S 599 x(Device)S 167 x +(Indep)S 2 x(endent)S 167 x(Service)S 167 x(Group)S 20480 Y 3600 X +F36(4.1.1.1)S 599 x(Session)S 167 x(Class)S 166 x(Services)S 897 y +4796 X F78(Session)S 169 x(class)S 170 x(services)S 170 x(establish)S +170 x(the)S 170 x(bounds)S 170 x(and)S 169 x(semantics)S 170 x(of)S +169 x(an)S 170 x(image)S 170 x(extension)S 170 x(clie)S 2 x +(nt-server)S 169 x(session.)S 255 x(Key)S 548 y 4796 X(activit)S +2 x(ies)S 182 x(such)S 183 x(as)S 182 x(server)S 182 x(initi)S 2 x +(alizat)S 2 x(ion)S 182 x(and)S 183 x(terminati)S 2 x(on,)S 186 x +(as)S 182 x(well)S 183 x(as)S 182 x(issues)S 182 x(such)S 182 x(as)S +182 x(server)S 182 x(capabil)S 2 x(ities)S 183 x(and)S 548 y 4796 X +(temporal)S 166 x(scope)S 167 x(of)S 166 x(service)S 166 x(requests)S +167 x(are)S 166 x(involved)S 168 x(in)S 166 x(session)S 166 x(class)S +167 x(services.)S 896 y 4796 X(Examples)S 166 x(\(non-exhaustive)S +168 x(list\))S 167 x(of)S 166 x(session)S 166 x(class)S 166 x +(services)S 167 x(include:)S 897 y 4796 X(\201)S 722 x(Connect)S +167 x(to)S 167 x(extension)S 167 x(server)S 747 y 4796 X(\201)S 722 x +(Disconnect)S 167 x(from)S 166 x(extension)S 167 x(server)S 26508 Y +3600 X F36(4.1.1.2)S 599 x(Resource)S 166 x(Class)S 166 x(Services)S +896 y 4796 X F78(Resources)S 178 x(are)S 178 x(a)S 179 x(means)S +177 x(by)S 179 x(which)S 178 x(important)S 179 x(operati)S 2 x(onal)S +179 x(information)S 179 x(may)S 178 x(be)S 178 x(or)S -9 x(ganized)S +179 x(by)S 179 x(the)S 178 x(server)S 178 x(and)S 548 y 4796 X +(accessed)S 166 x(by)S 166 x(the)S 167 x(client)S 2 x(.)S 248 x(T)S +-34 x(o)S 166 x(some)S 166 x(extent,)S 167 x(they)S 166 x(represent)S +167 x(both)S 167 x(housekeeping)S 167 x(and)S 166 x(an)S 167 x(or)S +-9 x(ganizati)S 2 x(onal)S 166 x(strategy)S -31 x(.)S 897 y 4796 X +(Examples)S 166 x(of)S 166 x(resource)S 166 x(class)S 167 x +(services)S 166 x(inclu)S 2 x(de:)S 897 y 4796 X(\201)S 722 x +(Create)S 167 x(resource)S 747 y 4796 X(\201)S 722 x(Delete)S 167 x +(resource)S 747 y 4796 X(\201)S 722 x(Modify)S 167 x(resource)S 747 y +4796 X(\201)S 722 x(Query)S 166 x(resource)S 747 y 4796 X(\201)S +722 x(Copy)S 167 x(resource)S 35879 Y 17820 X F40(EXTENSION)S 165 x +(PROT)S -9 x(OCOL)S 165 x(ELEMENTS)S 449 x(4\2031)S +1 PP +EP +%%Page 2 42 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 3600 X F36(4.1.1.3)S 599 x(T)S -27 x(ransport)S 166 x(Class)S +166 x(Services)S 896 y 4796 X F78(T)S -18 x(ransport)S 178 x(involv)S +2 x(es)S 177 x(the)S 178 x(movement)S 178 x(of)S 177 x(image)S 178 x +(objects)S 179 x(across)S 177 x(the)S 178 x(X)S 177 x(wire.)S 272 x +(This)S 178 x(movement)S 178 x(is)S 177 x(both)S 178 x(incoming)S +548 y 4796 X(\(client\203>server\))S 167 x(and)S 166 x(outgoi)S 2 x +(ng)S 166 x(\(server)S -10 x(\203>client)S 2 x(\))S 165 x(image)S +167 x(data.)S 897 y 4796 X(Ef)S -9 x(\211ciency)S 186 x(and)S 186 x +(convenience)S 187 x(are)S 185 x(key)S 186 x(concepts)S 186 x(in)S +186 x(transport)S 186 x(services.)S 288 x(Ef)S -9 x(\211ciency)S +186 x(invol)S 2 x(ves)S 185 x(the)S 186 x(support)S 186 x(of)S 548 y +4796 X(encoded)S 162 x(\(compressed\))S 162 x(image)S 162 x(data,)S +164 x(while)S 162 x(conveni)S 2 x(ence)S 162 x(involve)S 2 x(s)S +161 x(the)S 163 x(abili)S 2 x(ty)S 162 x(of)S 162 x(the)S 163 x +(client)S 164 x(to)S 163 x(specify)S 162 x(image)S 163 x(data)S 548 y +4796 X(formats,)S 165 x(and)S 166 x(to)S 167 x(break)S 166 x +(complete)S 167 x(image)S 167 x(transport)S 167 x(into)S 167 x +(multiple)S 168 x(steps.)S 896 y 4796 X(T)S -18 x(ransport)S 167 x +(processing)S 167 x(include)S 2 x(s)S 166 x(the)S 167 x(movement)S +166 x(across)S 167 x(the)S 167 x(wire)S 166 x(of)S 167 x(both)S 167 x +(PCM)S 166 x(\(uncompressed\))S 166 x(and)S 167 x(compression)S 548 y +4796 X(encoded)S 166 x(image)S 167 x(data,)S 166 x(and)S 167 x(the)S +166 x(actual)S 168 x(encoding)S 167 x(and)S 166 x(decoding)S 168 x +(of)S 166 x(this)S 166 x(data)S 167 x(by)S 166 x(both)S 167 x +(client)S 168 x(and)S 166 x(server)S -27 x(.)S 897 y 4796 X +(Supported)S 166 x(PCM)S 166 x(formats)S 166 x(inclu)S 2 x(de:)S +897 y 4796 X(\201)S 722 x(FULL_PIXEL_COMP)S -45 x(A)S -56 x(TION)S +747 y 4796 X(\201)S 722 x(P)S -46 x(AR)S -30 x(TIAL_PIXEL_EXP)S -45 x +(ANSION)S 747 y 4796 X(\201)S 722 x(FULL_PIXEL_EXP)S -45 x(ANSION)S +14436 Y 4796 X(Supported)S 166 x(Compressed)S 166 x(formats)S 166 x +(include:)S 897 y 4796 X(\201)S 722 x(CCITT)S 167 x(Modi\211ed)S +167 x(Huf)S -9 x(fman)S 165 x(and)S 167 x(Modi\211ed)S 166 x +(Modi\211ed)S 167 x(Read)S 547 y 5692 X(for)S 166 x(bitonal)S 168 x +(data)S 167 x(and)S 166 x(continuo)S 2 x(us)S 165 x(tone)S 167 x +(monochromatic/p)S 2 x(olychromatic)S 548 y 5692 X(in)S 167 x +(FULL_PIXEL_EXP)S -45 x(ANSIO)S -2 x(N)S 166 x(mode)S 748 y 4796 X +(\201)S 722 x(Discrete)S 167 x(Cosine)S 167 x(T)S -17 x(ransform)S +548 y 5692 X(for)S 166 x(continuou)S 2 x(s)S 165 x(tone)S 167 x +(monochromatic/po)S 2 x(lychromatic)S 547 y 5692 X(in)S 167 x(P)S +-46 x(AR)S -30 x(TIAL_PIXEL_EXP)S -45 x(ANSIO)S -2 x(N)S 166 x(mode)S +19367 Y 4796 X(Refer)S 166 x(to)S 166 x(the)S 167 x(chapter)S 167 x +(on)S 166 x(lexi)S 2 x(con)S 166 x(for)S 166 x(more)S 165 x(detai)S +2 x(ls)S 166 x(of)S 166 x(these)S 167 x(formats.)S 897 y 4796 X +(Examples)S 166 x(of)S 166 x(transport)S 167 x(class)S 166 x +(services)S 167 x(include:)S 897 y 4796 X(\201)S 722 x(Send)S 166 x +(image)S 167 x(object)S 167 x(to)S 167 x(server)S 747 y 4796 X(\201)S +722 x(Receive)S 168 x(image)S 166 x(object)S 168 x(from)S 165 x +(server)S 23402 Y 3600 X F36(4.1.1.4)S 599 x(Statistics)S 167 x +(Class)S 166 x(Services)S 897 y 4796 X F78(Statisti)S 2 x(cal)S 173 x +(informatio)S 2 x(n)S 172 x(about)S 174 x(image)S 173 x(data)S 174 x +(is)S 173 x(often)S 173 x(used)S 173 x(in)S 174 x(enhancement)S 174 x +(processing)S 173 x(strategies)S 174 x(and)S 173 x(operators.)S 548 y +4796 X(Statisti)S 2 x(cal)S 173 x(services)S 173 x(do)S 173 x(not)S +173 x(modify)S 172 x(image)S 173 x(data,)S 175 x(but)S 173 x(rather)S +173 x(generate)S 174 x(statisti)S 2 x(cal)S 173 x(information)S 174 x +(about)S 173 x(image)S 173 x(data.)S 548 y 4796 X(In)S 176 x +(certain)S 177 x(instance)S 2 x(s,)S 177 x(the)S 177 x(stati)S 2 x +(stical)S 177 x(information)S 178 x(maybe)S 176 x(calcula)S 2 x(ted)S +176 x(on)S 177 x(a)S 176 x(pixel)S 177 x(by)S 177 x(pixel)S 177 x +(basis)S 176 x(and)S 177 x(may)S 176 x(itself)S 548 y 4796 X(be)S +186 x(stored)S 186 x(in)S 187 x(a)S 186 x(server)S -10 x(-based)S +187 x(destinati)S 2 x(on)S 186 x(image)S 187 x(object.)S 290 x(The)S +187 x(resulting)S 187 x("stati)S 2 x(stical)S 188 x(image")S 186 x +(maybe)S 187 x(used)S 186 x(in)S 548 y 4796 X(enhancement)S 167 x +(processing)S 166 x(operati)S 2 x(ons.)S 896 y 4796 X(Examples)S +166 x(of)S 166 x(stati)S 2 x(stics)S 166 x(class)S 167 x(services)S +166 x(include)S 2 x(:)S 897 y 4796 X(\201)S 722 x(Calcul)S 2 x(ate)S +167 x(Statisti)S 2 x(cal)S 167 x(Moments)S 747 y 5692 X(\201)S 723 x +(Area)S 166 x(Minimum)S 747 y 5692 X(\201)S 723 x(Area)S 166 x +(Maximum)S 748 y 5692 X(\201)S 723 x(Area)S 166 x(Mean)S 747 y 5692 X +(\201)S 723 x(Area)S 166 x(Median)S 747 y 5692 X(\201)S 723 x +(Standard)S 167 x(Deviation)S 747 y 5692 X(\201)S 723 x(V)S -56 x +(ariance)S 747 y 4796 X(\201)S 722 x(Generate)S 167 x(Histogram)S +35879 Y 3600 X F40(4\2032)S 449 x(EXTENSION)S 165 x(PROT)S -9 x +(OCOL)S 166 x(ELEMENTS)S +1 PP +EP +%%Page 3 43 +1000 BP 39600 30600 PM 0 0 XY +5138 Y 4796 X F78(Due)S 176 x(to)S 178 x(the)S 177 x(potent)S 2 x +(ially)S 178 x(unbounded)S 178 x(nature)S 178 x(of)S 177 x +(enhancement)S 178 x(processing,)S 179 x(enhancement)S 179 x(class)S +177 x(services)S 177 x(will)S 178 x(be)S 548 y 4796 X(restricted)S +187 x(to)S 186 x(include)S 187 x(only)S 186 x(a)S 186 x(minimal)S +186 x(set)S 186 x(of)S 186 x(basic)S 186 x(enhancement)S 187 x +(processing)S 186 x(machinery)S 186 x(that)S 187 x(will)S 187 x +(support)S 548 y 4796 X(multiple)S 167 x(enhancement)S 167 x +(approaches.)S 249 x(Parameters)S 166 x(and)S 166 x(applicat)S 2 x +(ion)S 166 x(of)S 166 x(this)S 166 x(machinery)S 167 x(will)S 166 x +(be)S 166 x(left)S 167 x(to)S 166 x(the)S 167 x(directio)S 2 x(n)S +548 y 4796 X(of)S 171 x(the)S 173 x(toolkit)S 173 x(and)S 172 x +(appli)S 2 x(cation)S 173 x(client)S 173 x(level)S 2 x(s.)S 259 x +(An)S 172 x(example)S 172 x(of)S 172 x(this)S 172 x(approach)S 173 x +(is)S 172 x(to)S 172 x(include)S 173 x(\211lteri)S 2 x(ng)S 171 x +(capabil)S 2 x(itie)S 2 x(s)S 548 y 4796 X(\(spatial)S 167 x +(convolver\))S 167 x(but)S 167 x(not)S 166 x(the)S 167 x(\211lters)S +167 x(themselves.)S 8824 Y 3600 X F36(4.1.1.5)S 599 x(Enhancement)S +167 x(Class)S 166 x(Services)S 897 y 4796 X F78(In)S 167 x(the)S +168 x(enhancement)S 169 x(processing)S 168 x(of)S 167 x(an)S 168 x +(image,)S 168 x(the)S 168 x(server)S 167 x(uses)S 167 x(local)S 169 x +(server)S 168 x(hardware)S 167 x(to)S 168 x(apply)S 168 x(image)S +168 x(processes)S 547 y 4796 X(to)S 188 x(the)S 188 x(image)S 188 x +(data)S 188 x(in)S 188 x(the)S 188 x(server)S -10 x(-based)S 188 x +(source)S 187 x(image)S 188 x(object)S 2 x(.)S 291 x(The)S 188 x +(result)S 189 x(of)S 187 x(the)S 188 x(operatio)S 2 x(n)S 187 x(is)S +188 x(stored)S 188 x(in)S 188 x(a)S 548 y 4796 X(server)S -11 x +(-based)S 167 x(destinati)S 2 x(on)S 166 x(image)S 166 x(object)S +168 x(which)S 166 x(may)S 166 x(be)S 166 x(the)S 167 x(same)S 166 x +(as)S 166 x(the)S 167 x(source)S 166 x(image)S 166 x(object)S 2 x(.)S +897 y 4796 X(An)S 185 x(important)S 186 x(enhancement)S 187 x +(concept)S 186 x(is)S 186 x(that)S 186 x(both)S 186 x(the)S 186 x +(input)S 187 x(and)S 186 x(output)S 186 x(of)S 185 x(the)S 186 x +(enhancement)S 187 x(services)S 186 x(are)S 548 y 4796 X(revisable)S +186 x(form)S 185 x(image)S 186 x(objects.)S 288 x(Thus,)S 190 x(the)S +186 x(results)S 186 x(of)S 186 x(an)S 185 x(image)S 186 x +(enhancement)S 187 x(operation)S 187 x(may)S 185 x(be)S 185 x(fed)S +186 x(back)S 548 y 4796 X(into)S 176 x(other)S 177 x(enhancement)S +177 x(operations,)S 178 x(made)S 176 x(availa)S 2 x(ble)S 176 x(for)S +175 x(transport)S 177 x(back)S 176 x(to)S 176 x(the)S 177 x(client)S +2 x(,)S 177 x(or)S 176 x(made)S 176 x(availabl)S 2 x(e)S 176 x(for)S +548 y 4796 X(rendition)S 167 x(processing.)S 897 y 4796 X +(Enhancement)S 169 x(processing)S 169 x(is)S 168 x(a)S 168 x(parti)S +2 x(cularly)S 169 x(rich)S 169 x(and)S 168 x(popular)S 169 x(area.)S +253 x(Whil)S 2 x(e)S 168 x(the)S 169 x(X)S 168 x(image)S 168 x +(extensi)S 2 x(on)S 168 x(package)S 169 x(tool)S 547 y 4796 X(kit)S +168 x(will)S 168 x(be)S 167 x(the)S 168 x(home)S 167 x(for)S 167 x +(many)S 167 x(high)S 167 x(level)S 169 x(image)S 167 x(enhancement)S +168 x(processing)S 168 x(algorit)S 2 x(hms)S 166 x(and)S 167 x +(processing)S 168 x(macros,)S 548 y 4796 X(the)S 170 x(wire)S 170 x +(protocol)S 171 x(for)S 169 x(enhancement)S 171 x(services)S 170 x +(will)S 171 x(be)S 170 x(kept)S 170 x(minimal.)S 257 x(Examples)S +170 x(of)S 170 x(enhancement)S 171 x(class)S 170 x(services)S 548 y +4796 X(include:)S 897 y 4796 X(\201)S 722 x(Point)S 167 x +(Processing)S 747 y 5692 X(\201)S 723 x(Algebraic)S 747 y 5692 X +(\201)S 723 x(Logical)S 748 y 5692 X(\201)S 723 x(Luminance)S 747 y +4796 X(\201)S 722 x(Area)S 166 x(Operators)S 166 x(\(Filte)S 2 x +(ring\))S 747 y 4796 X(\201)S 722 x(Geometric)S 167 x(T)S -17 x +(ransforms)S 21626 Y 4796 X(Due)S 176 x(to)S 178 x(the)S 177 x +(potent)S 2 x(ially)S 178 x(unbounded)S 178 x(nature)S 178 x(of)S +177 x(enhancement)S 178 x(processing,)S 179 x(enhancement)S 179 x +(class)S 177 x(services)S 177 x(will)S 178 x(be)S 548 y 4796 X +(restricted)S 187 x(to)S 186 x(include)S 187 x(only)S 186 x(a)S 186 x +(minimal)S 186 x(set)S 186 x(of)S 186 x(basic)S 186 x(enhancement)S +187 x(processing)S 186 x(machinery)S 186 x(that)S 187 x(will)S 187 x +(support)S 548 y 4796 X(multiple)S 167 x(enhancement)S 167 x +(approaches.)S 249 x(Parameters)S 166 x(and)S 166 x(applicat)S 2 x +(ion)S 166 x(of)S 166 x(this)S 166 x(machinery)S 167 x(will)S 166 x +(be)S 166 x(left)S 167 x(to)S 166 x(the)S 167 x(directio)S 2 x(n)S +548 y 4796 X(of)S 171 x(the)S 173 x(toolkit)S 173 x(and)S 172 x +(appli)S 2 x(cation)S 173 x(client)S 173 x(level)S 2 x(s.)S 259 x +(An)S 172 x(example)S 172 x(of)S 172 x(this)S 172 x(approach)S 173 x +(is)S 172 x(to)S 172 x(include)S 173 x(\211lteri)S 2 x(ng)S 171 x +(capabil)S 2 x(itie)S 2 x(s)S 548 y 4796 X(\(spatial)S 167 x +(convolver\))S 167 x(but)S 167 x(not)S 166 x(the)S 167 x(\211lters)S +167 x(themselves.)S 25312 Y 3600 X F36(4.1.1.6)S 599 x(Process)S +166 x(Control)S 167 x(Class)S 166 x(Services)S 897 y 4796 X F78(The)S +182 x(server)S 182 x(will)S 184 x(support)S 182 x(pipel)S 2 x(ining)S +183 x(and)S 182 x(inte)S 2 x(rleaving)S 183 x(of)S 182 x(atomic)S +183 x(server)S 183 x(operations.)S 282 x(This)S 183 x(provides)S +182 x(a)S 183 x(home)S 548 y 4796 X(for)S 176 x(the)S 177 x(very)S +177 x(useful)S 177 x(and)S 176 x(everyday)S 178 x(concept)S 177 x +(of)S 177 x(tightl)S 2 x(y)S 176 x(coupled)S 178 x +(transport\203>render)S -9 x(\203>display)S -31 x(,)S 178 x(as)S +177 x(well)S 177 x(as)S 177 x(more)S 548 y 4796 X(elaborate)S 180 x +(concept)S 2 x(s)S 179 x(such)S 179 x(as)S 179 x(interl)S 2 x +(eaving)S 180 x(enhancement,)S 183 x(renditi)S 2 x(on,)S 182 x(and)S +179 x(displa)S 2 x(y)S 179 x(of)S 179 x(lar)S -8 x(ge)S 179 x(image)S +180 x(objects,)S 183 x(and)S 548 y 4796 X(enhancement)S 167 x +(processing)S 166 x(macros.)S 896 y 4796 X(The)S 179 x(image)S 179 x +(extension)S 179 x(will)S 180 x(suport)S 179 x(both)S 179 x +(primitive)S 180 x(pipeli)S 2 x(nes)S 178 x(\(ones)S 179 x(which)S +179 x(contain)S 180 x(only)S 179 x(references)S 179 x(to)S 179 x +(atomic)S 548 y 4796 X(protocol)S 167 x(functions\),)S 166 x(and)S +167 x(nested)S 166 x(pipel)S 2 x(ines)S 166 x(\(ones)S 166 x(which)S +167 x(reference)S 166 x(other)S 167 x(pipeli)S 2 x(nes\).)S 897 y +4796 X(W)S -20 x(ith)S 185 x(process)S 185 x(control,)S 190 x(the)S +185 x(interle)S 2 x(aving)S 185 x(of)S 184 x(many)S 185 x(mundane)S +184 x(operati)S 2 x(ons)S 184 x(can)S 185 x(be)S 185 x(ef)S -9 x +(\211cientl)S 2 x(y)S 184 x(represented)S 186 x(and)S 548 y 4796 X +(performed)S 172 x(on)S 174 x(the)S 174 x(server)S 173 x(side.)S +264 x(The)S 173 x(incl)S 2 x(usion)S 173 x(of)S 174 x(pipeline)S +175 x(control)S 174 x(operators)S 174 x(will)S 174 x(provide)S 174 x +(for)S 174 x(unattended)S 175 x(and)S 548 y 4796 X(client)S 167 x +(inte)S 2 x(rvention)S 167 x(\(interact)S 2 x(ive\))S 166 x(pipel)S +2 x(ine)S 166 x(executi)S 2 x(on.)S 896 y 4796 X(Examples)S 166 x +(of)S 166 x(process)S 166 x(control)S 167 x(services)S 167 x +(include:)S 897 y 4796 X(\201)S 722 x(Create)S 167 x(pipel)S 2 x +(ine)S 747 y 4796 X(\201)S 722 x(Delete)S 167 x(pipel)S 2 x(ine)S +35879 Y 17820 X F40(EXTENSION)S 165 x(PROT)S -9 x(OCOL)S 165 x +(ELEMENTS)S 449 x(4\2033)S +1 PP +EP +%%Page 4 44 +1000 BP 39600 30600 PM 0 0 XY +5138 Y 4796 X F78(\201)S 722 x(Modify)S 167 x(pipeline)S 747 y 4796 X +(\201)S 722 x(Query)S 166 x(pipeli)S 2 x(ne)S 166 x(content)S 747 y +4796 X(\201)S 722 x(Query)S 166 x(pipeli)S 2 x(ne)S 166 x(state)S +747 y 4796 X(\201)S 722 x(Execute)S 168 x(pipeline)S 748 y 4796 X +(\201)S 722 x(T)S -34 x(erminate)S 167 x(pipeline)S 9621 Y 3600 X +F28(4.1.2)S 599 x(Device)S 167 x(Depende)S 2 x(nt)S 166 x(Service)S +167 x(Group)S 10717 Y 3600 X F36(4.1.2.1)S 599 x(Renditio)S 2 x(n)S +166 x(Class)S 166 x(Services)S 896 y 4796 X F78(In)S 169 x(the)S +171 x(renditi)S 2 x(on)S 170 x(of)S 169 x(an)S 171 x(image,)S 170 x +(the)S 171 x(server)S 170 x(uses)S 169 x(a)S 170 x(combinat)S 2 x +(ion)S 170 x(of)S 170 x(local)S 171 x(server)S 170 x(software)S 170 x +(and)S 170 x(hardware)S 170 x(to)S 170 x(apply)S 548 y 4796 X +(rendition)S 182 x(operations)S 182 x(under)S 181 x(the)S 181 x +(directi)S 2 x(on)S 181 x(of)S 180 x(XIE)S 181 x(toolki)S 2 x(t)S +181 x(based)S 181 x(rendition)S 182 x(models)S 181 x(to)S 181 x(the)S +182 x(image)S 181 x(data)S 181 x(in)S 182 x(the)S 548 y 4796 X +(server)S -11 x(-based)S 174 x(source)S 174 x(image)S 174 x(object)S +2 x(.)S 264 x(The)S 174 x(partic)S 2 x(ulars)S 174 x(of)S 173 x +(these)S 175 x(operations)S 175 x(depend)S 174 x(upon)S 174 x(the)S +175 x(state)S 175 x(of)S 173 x(the)S 175 x(image)S 548 y 4796 X +(object,)S 167 x(the)S 166 x(display)S 167 x(characte)S 2 x +(ristics,)S 166 x(clie)S 2 x(nt)S 166 x(requests,)S 166 x(and)S 166 x +(the)S 167 x(renditi)S 2 x(on)S 166 x(models.)S 897 y 4796 X +(Renditi)S 2 x(on)S 167 x(services)S 168 x(are)S 167 x(designed)S +168 x(to)S 168 x(of)S -9 x(fer)S 167 x(the)S 168 x(client)S 169 x +(substantia)S 2 x(l)S 167 x(\212exibi)S 2 x(lity)S -31 x(.)S 251 x +(Renditi)S 2 x(on)S 167 x(services)S 168 x(are)S 167 x(divide)S 2 x +(d)S 167 x(into)S 548 y 4796 X(two)S 172 x(classes:)S 262 x(renditi)S +2 x(on)S 172 x(function)S 2 x(s)S 172 x(which)S 172 x(prepackage)S +173 x(commonly)S 173 x(used)S 172 x(renditi)S 2 x(on)S 172 x(models)S +172 x(and)S 173 x(of)S -9 x(fer)S 172 x(the)S 173 x(highest)S 548 y +4796 X(possible)S 181 x(\211delity)S 182 x(\(\211ll)S 181 x(screen,)S +184 x(\211ll)S 181 x(window)S -32 x(,)S 183 x(preserve)S 181 x +(aspect)S 181 x(ratio\);)S 189 x(and)S 181 x(renditi)S 2 x(on)S 180 x +(functions)S 182 x(under)S 180 x(complete)S 548 y 4796 X(control)S +175 x(of)S 174 x(the)S 175 x(client)S 2 x(.)S 265 x(The)S 175 x +(former)S 173 x(services)S 175 x(are)S 174 x(packed)S 175 x(in)S +175 x(XIE)S 174 x(toolki)S 2 x(t)S 175 x(functions.)S 266 x(The)S +174 x(lat)S 2 x(ter)S 174 x(case)S 175 x(allows)S 175 x(the)S 548 y +4796 X(client)S 175 x(to)S 175 x(control)S 175 x(\(override\))S 174 x +(default)S 176 x(operation)S 175 x(in)S 174 x(order)S 174 x(to)S +175 x(prevent)S 175 x(the)S 174 x("too)S 175 x(smart)S 174 x(by)S +174 x(half")S 175 x(syndrome)S 173 x(\(server)S 548 y 4796 X(keeps)S +166 x(client)S 168 x(from)S 165 x(rendering)S 167 x(the)S 167 x +(image)S 167 x(the)S 167 x(way)S 166 x(the)S 167 x(client)S 168 x +(wants)S 166 x(it,)S 167 x(because)S 166 x(server)S 166 x(thin)S +2 x(ks)S 166 x(it)S 167 x(knows)S 165 x(bett)S 2 x(er\).)S 248 x(A)S +548 y 4796 X(null)S 167 x(rendition)S 167 x(functi)S 2 x(on)S 166 x +(is)S 166 x(also)S 167 x(included.)S 896 y 4796 X(Low)S 174 x(level)S +175 x(\(server)S 174 x(based\))S 174 x(renditi)S 2 x(on)S 174 x +(processing)S 174 x(functio)S 2 x(ns)S 173 x(take)S 175 x(a)S 175 x +(revisable)S 175 x(form)S 173 x(image)S 175 x(and)S 174 x(produce)S +175 x(another)S 548 y 4796 X(revisable)S 184 x(form)S 182 x(image.)S +283 x(High)S 183 x(level)S 184 x(\(XIE)S 183 x(toolki)S 2 x(t)S 183 x +(based\))S 183 x(renditi)S 2 x(on)S 183 x(processing)S 183 x +(function)S 2 x(s)S 182 x(use)S 183 x(the)S 184 x(low)S 183 x(level)S +548 y 4796 X(functions)S 168 x(in)S 169 x(processing)S 168 x(pipeli)S +2 x(nes.)S 252 x(The)S 168 x(last)S 169 x(step)S 168 x(in)S 168 x +(these)S 169 x(high)S 168 x(level)S 169 x(pipeli)S 2 x(nes)S 168 x +(is)S 168 x(exporting)S 169 x(the)S 168 x(revisable)S 169 x(form)S +548 y 4796 X(image)S 168 x(into)S 170 x(a)S 168 x(PIXMAP)S 168 x +(which)S 168 x(is)S 169 x(considered)S 169 x(to)S 169 x(be)S 169 x +(a)S 168 x(\211nal)S 169 x(form)S 168 x(image.)S 254 x(The)S 169 x +(\211nal)S 169 x(form)S 168 x(image)S 169 x(is)S 168 x(suitabl)S +2 x(e)S 168 x(only)S 548 y 4796 X(for)S 175 x(display)S 177 x +(purposes.)S 267 x(It)S 176 x(is)S 176 x(possible)S 177 x(to)S 176 x +(convert)S 177 x(a)S 175 x(\211nal)S 177 x(form)S 175 x(image)S 176 x +(back)S 176 x(to)S 176 x(a)S 176 x(revisable)S 177 x(form)S 175 x +(image)S 176 x(via)S 176 x(the)S 548 y 4796 X(import/export)S 167 x +(class)S 167 x(services)S 166 x(\(see)S 166 x(next)S 167 x +(section\).)S 897 y 4796 X(Examples)S 166 x(of)S 166 x(high)S 167 x +(level)S 167 x(\(XIE)S 166 x(toolki)S 2 x(t)S 166 x(based\))S 166 x +(renditi)S 2 x(on)S 166 x(services)S 167 x(include:)S 896 y 4796 X +(\201)S 722 x(Render)S 167 x(best)S 166 x(\(renditi)S 2 x(on)S 166 x +(\211delit)S 2 x(y\))S 747 y 4796 X(\201)S 722 x(Render)S 167 x +(this)S 167 x(way)S 748 y 4796 X(\201)S 722 x(Render)S 167 x(to)S +166 x(\211t)S 167 x(object)S 167 x(in)S 167 x(window)S 747 y 4796 X +(\201)S 722 x(Render)S 167 x(at)S 166 x(real)S 167 x(size)S 167 x +(\(whatever)S 166 x(\211ts\))S 747 y 4796 X(\201)S 722 x(Render)S +167 x(preserving)S 166 x(aspect)S 167 x(ratio)S 26956 Y 4796 X +(Examples)S 166 x(of)S 166 x(low)S 166 x(level)S 168 x(\(server)S +166 x(based\))S 166 x(rendition)S 168 x(services)S 166 x(include)S +2 x(:)S 897 y 4796 X(\201)S 722 x(scale)S 747 y 4796 X(\201)S 722 x +(rotate)S 747 y 4796 X(\201)S 722 x(crop)S 747 y 4796 X(\201)S 722 x +(dither)S 35879 Y 3600 X F40(4\2034)S 449 x(EXTENSION)S 165 x(PROT)S +-9 x(OCOL)S 166 x(ELEMENTS)S +1 PP +EP +%%Page 5 45 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 3600 X F36(4.1.2.2)S 599 x(Import/Exp)S 2 x(ort)S 166 x +(Class)S 166 x(Services)S 896 y 4796 X F78(It)S 178 x(is)S 179 x +(expecte)S 2 x(d)S 178 x(that)S 180 x(at)S 179 x(least)S 180 x(the)S +179 x(core)S 179 x(X)S 178 x(protocol)S 180 x(and)S 179 x(services)S +179 x(will)S 180 x(be)S 178 x(coresident)S 180 x(with)S 180 x(the)S +179 x(image)S 179 x(extension)S 548 y 4796 X(protocol)S 171 x(and)S +170 x(services,)S 171 x(and)S 170 x(that)S 171 x(other)S 171 x +(extension)S 171 x(packages)S 171 x(may)S 170 x(be)S 170 x(resident)S +171 x(as)S 170 x(well.)S 257 x(Many)S 170 x(applica)S 2 x(tions,)S +171 x(such)S 548 y 4796 X(as)S 156 x(compound)S 157 x(document)S +158 x(editors,)S 159 x(may)S 157 x(have)S 157 x(need)S 158 x(of)S +157 x(multiple)S 159 x(domain)S 157 x(extension)S 158 x(packages)S +158 x(at)S 157 x(the)S 158 x(same)S 157 x(time)S 157 x(and)S 548 y +4796 X(it)S 167 x(is)S 166 x(quite)S 167 x(reasonable)S 167 x(to)S +167 x(expect)S 167 x(an)S 166 x(applic)S 2 x(ation)S 167 x(to)S 166 x +(manage)S 167 x(sessions)S 166 x(with)S 166 x(multipl)S 2 x(e)S 166 x +(resident)S 167 x(server)S 166 x(packages.)S 897 y 4796 X(Each)S +168 x(of)S 168 x(these)S 168 x(packages)S 169 x(may)S 167 x +(de\211ne)S 168 x(thei)S 2 x(r)S 167 x(own)S 168 x(resources)S 167 x +(and)S 169 x(the)S 168 x(or)S -9 x(ganizat)S 2 x(ional)S 169 x(and)S +168 x(operational)S 170 x(semantics)S 168 x(of)S 548 y 4796 X(these)S +168 x(resources.)S 253 x(For)S 168 x(ef)S -9 x(\211ciency)S 169 x +(reasons)S 168 x(,)S 169 x(XIEP)S 167 x(provides)S 169 x +(import/expo)S 2 x(rt)S 168 x(services)S 169 x(which)S 168 x(are)S +169 x(designed)S 169 x(to)S 168 x(allow)S 548 y 4796 X(the)S 177 x +(data)S 177 x(portion)S 178 x(of)S 176 x(an)S 177 x(image)S 177 x +(object)S 178 x(to)S 177 x(be)S 177 x(taken)S 178 x(from)S 176 x(or)S +176 x(placed)S 178 x(into)S 178 x(core)S 177 x(protocol)S 177 x +(structures,)S 180 x(thus)S 177 x(saving)S 548 y 4796 X(the)S 169 x +(appli)S 2 x(cation)S 170 x(two)S 170 x(potentia)S 2 x(lly)S 170 x +(lar)S -9 x(ge)S 170 x(wire)S 169 x(transmissions)S 170 x(and)S 169 x +(allowing)S 171 x(an)S 169 x(applic)S 2 x(ation)S 170 x(to)S 170 x +(use)S 169 x(the)S 170 x(power)S 169 x(of)S 169 x(an)S 548 y 4796 X +(image)S 166 x(extension)S 167 x(on)S 167 x(data)S 166 x(that)S 168 x +(may)S 165 x(derive)S 167 x(fromthe)S 166 x(core)S 167 x(package)S +167 x(or)S 166 x(perhaps)S 166 x(a)S 166 x(graphics)S 167 x +(extension.)S 896 y 4796 X(Included)S 167 x(in)S 166 x(the)S 167 x +(import/exp)S 2 x(ort)S 166 x(services)S 167 x(is)S 166 x(the)S 167 x +(abili)S 2 x(ty)S 166 x(to)S 167 x(take)S 167 x(an)S 167 x(image)S +166 x(which)S 167 x(has)S 166 x(been)S 167 x(rendered)S 166 x +(\(converted)S 167 x(to)S 548 y 4796 X(\211nal)S 166 x(form\))S 165 x +(and)S 167 x(make)S 166 x(a)S 166 x(new)S 166 x(revisable)S 167 x +(form)S 166 x(image)S 166 x(from)S 165 x(it)S 167 x(\(see)S 166 x +(previous)S 167 x(section\).)S 13738 Y 3600 X F36(4.1.2.3)S 599 x +(Display)S 167 x(Class)S 166 x(Services)S 897 y 4796 X F78(Although)S +179 x(closely)S 180 x(associated,)S 183 x(display)S 179 x(is)S 179 x +(a)S 179 x(distinc)S 2 x(t)S 179 x(step)S 179 x(from)S 178 x +(rendition)S 2 x(.)S 273 x(Once)S 179 x(the)S 179 x(rendit)S 2 x +(ion)S 179 x(operations)S 180 x(are)S 548 y 4796 X(complete,)S 189 x +(the)S 184 x(clie)S 2 x(nt)S 184 x(may)S 184 x(request)S 184 x +(display)S 185 x(of)S 184 x(the)S 185 x(rendered)S 184 x(image.)S +285 x(The)S 185 x(server)S 184 x(is)S 184 x(responsible)S 185 x(for)S +183 x(loadi)S 2 x(ng)S 548 y 4796 X(display)S 182 x(device)S 182 x +(hardware)S 181 x(with)S 182 x(the)S 182 x(rendered)S 181 x(image)S +182 x(object)S 182 x(to)S 182 x(make)S 181 x(the)S 182 x(image)S +181 x(viewable)S 183 x(on)S 181 x(request)S 182 x(of)S 181 x(the)S +548 y 4796 X(client.)S 897 y 4796 X(Display)S 174 x(class)S 174 x +(services)S 175 x(will)S 175 x(support)S 174 x(single)S 175 x(frame)S +173 x(and)S 174 x(time)S 175 x(sequences)S 174 x(of)S 174 x(frames.)S +264 x(T)S -18 x(ime)S 174 x(sequence)S 175 x(support)S 174 x(is)S +548 y 4796 X(deemed)S 170 x(necessary)S 171 x(to)S 171 x(ensure)S +170 x(uniform)S 171 x(time)S 171 x(spacing.)S 258 x(Multi)S 2 x +(-image)S 170 x(display)S 172 x(\(2-N)S 170 x(up)S 170 x(etc.\))S +259 x(will)S 171 x(be)S 171 x(supported)S 171 x(at)S 547 y 4796 X +(the)S 166 x(XIE)S 166 x(toolki)S 2 x(t)S 166 x(level)S 168 x +(through)S 166 x(multip)S 2 x(le)S 166 x(display)S 167 x(class)S +167 x(service)S 166 x(requests.)S 19766 Y 3600 X F36(4.1.2.4)S 599 x +(Device)S 166 x(Control)S 167 x(Class)S 166 x(Services)S 897 y 4796 X +F78(In)S 170 x(general,)S 173 x(the)S 171 x(extensi)S 2 x(on)S 171 x +(protocol)S 172 x(does)S 171 x(not)S 171 x(of)S -9 x(fer)S 171 x +(direct)S 172 x(access)S 171 x(to)S 171 x(speciali)S 2 x(zed)S 171 x +(server)S 171 x(hardware.)S 258 x(Instead,)S 172 x(this)S 547 y +4796 X(hardware)S 170 x(\(accelerat)S 2 x(ors)S 170 x(in)S 171 x +(particula)S 2 x(r\))S 170 x(is)S 170 x(accessed)S 171 x(indirect)S +2 x(ly)S 171 x(through)S 171 x(protocol)S 171 x(functi)S 2 x(ons)S +170 x(which)S 171 x(bene\211t)S 171 x(by)S 170 x(use)S 548 y 4796 X +(of)S 165 x(the)S 167 x(hardware.)S 897 y 4796 X(Device)S 186 x +(control)S 188 x(functions)S 187 x(are)S 187 x(protocol)S 187 x +(functions)S 187 x(which)S 187 x(of)S -9 x(fer)S 186 x(direct)S 187 x +(access)S 187 x(to)S 187 x(display)S 187 x(device)S 187 x(hardware.)S +548 y 4796 X(They)S 174 x(are)S 174 x(included)S 175 x(primarily)S +175 x(to)S 174 x(take)S 175 x(care)S 174 x(of)S 174 x(the)S 174 x +(few)S 174 x(cases)S 173 x(where)S 174 x(a)S 174 x(protocol)S 175 x +(function)S 175 x(degenerates)S 175 x(to)S 174 x(direct)S 548 y +4796 X(hardware)S 166 x(access)S 166 x(\(as)S 166 x(in)S 166 x +(frame)S 166 x(capture)S 167 x(operations\),)S 167 x(and)S 166 x +(secondarily)S -31 x(,)S 166 x(as)S 165 x(an)S 167 x(escape)S 166 x +(mechanism.)S 897 y 4796 X(There)S 161 x(are)S 161 x(a)S 160 x +(number)S 161 x(of)S 161 x(dangers)S 160 x(associate)S 2 x(d)S 160 x +(with)S 162 x(this)S 161 x(service)S 161 x(class.)S 249 x(The)S 162 x +(foremost)S 160 x(is)S 161 x(that)S 162 x(unwise)S 161 x(and)S 161 x +(excessive)S 548 y 4796 X(inclusion)S 174 x(of)S 173 x(device)S 174 x +(control)S 174 x(protocol)S 174 x(functions)S 173 x(is)S 173 x +(bound)S 174 x(to)S 173 x(lead)S 173 x(to)S 174 x(incompatibi)S 2 x +(liti)S 2 x(es)S 173 x(and)S 173 x(defeat)S 173 x(the)S 174 x +(purpose)S 547 y 4796 X(of)S 167 x(a)S 168 x(common)S 167 x +(protocol)S 2 x(.)S 252 x(Perhaps)S 168 x(a)S 168 x(more)S 167 x +(speci\211c)S 168 x(danger)S 169 x(is)S 168 x(con\212ict)S 169 x +(between)S 168 x(window)S 168 x(control)S 169 x(provided)S 169 x(by)S +168 x(the)S 548 y 4796 X(core)S 166 x(protocol)S 167 x(and)S 166 x +(overall)S 168 x(device)S 167 x(control)S 167 x(made)S 166 x +(possible)S 167 x(here.)S 897 y 4796 X(The)S 179 x(X)S 179 x(Image)S +179 x(Extension)S 180 x(will)S 181 x(provide)S 180 x(device)S 180 x +(control)S 180 x(access)S 179 x(services)S 180 x(for)S 179 x(a)S +179 x(limit)S 2 x(ed)S 179 x(set)S 179 x(of)S 179 x(device)S 181 x +(controls.)S 548 y 4796 X(These)S 174 x(services)S 174 x(will)S 174 x +(af)S -9 x(fect)S 175 x(device)S 174 x(control)S 175 x(attri)S 2 x +(butes)S 174 x(associated)S 175 x(with)S 174 x(indivi)S 2 x(dual)S +174 x(windows)S 173 x(\(ie.)S 264 x(logi)S 2 x(cal)S 174 x(device)S +548 y 4796 X(controls\).)S 263 x(The)S 174 x(extension)S 174 x(will)S +175 x(use)S 173 x(a)S 173 x(mechanism)S 173 x(similar)S 174 x(to)S +174 x(that)S 174 x(used)S 173 x(with)S 174 x(lookup)S 174 x(tables)S +174 x(\(colormap\))S 174 x(to)S 173 x(map)S 548 y 4796 X(logical)S +167 x(to)S 167 x(physical)S 167 x(device)S 167 x(control)S 168 x +(settings)S 167 x(as)S 166 x(windows)S 166 x(are)S 166 x(selected)S +2 x(.)S 897 y 4796 X(Examples)S 166 x(of)S 166 x(display)S 167 x +(device)S 167 x(control)S 168 x(services)S 166 x(includ)S 2 x(e:)S +896 y 4796 X(\201)S 722 x(Set/que)S 2 x(ry)S 166 x(intensit)S 2 x(y)S +747 y 4796 X(\201)S 722 x(Set/que)S 2 x(ry)S 166 x(contrast)S 748 y +4796 X(\201)S 722 x(Set/que)S 2 x(ry)S 166 x(hue)S 747 y 4796 X +(\201)S 722 x(Set/que)S 2 x(ry)S 166 x(brightness)S 747 y 4796 X +(\201)S 722 x(Set/que)S 2 x(ry)S 166 x(saturation)S 35879 Y 17820 X +F40(EXTENSION)S 165 x(PROT)S -9 x(OCOL)S 165 x(ELEMENTS)S 449 x +(4\2035)S +1 PP +EP +%%Page 6 46 +1000 BP 39600 30600 PM 0 0 XY +5138 Y 4796 X F78(\201)S 722 x(Image)S 166 x(capture)S 167 x +(controls)S 548 y 5692 X(-)S 166 x(live)S 167 x(video)S 167 x +(windowing)S 548 y 5692 X(-)S 166 x(frame)S 166 x(or)S 166 x(page)S +166 x(grabbing)S 8425 Y 3600 X F28(4.2)S 599 x(Resources)S 9671 Y +4796 X F78(The)S 186 x(purpose)S 186 x(of)S 185 x(this)S 187 x +(section)S 186 x(is)S 186 x(to)S 187 x(provide)S 186 x(an)S 186 x +(overview)S 186 x(of)S 186 x(the)S 186 x(server)S 186 x(resources)S +185 x(of)S 186 x(which)S 186 x(the)S 187 x(client)S 187 x(has)S 548 y +4796 X(knowledge)S 188 x(and)S 188 x(abili)S 2 x(ty)S 188 x(to)S +188 x(reference.)S 293 x(The)S 188 x(existence)S 189 x(and)S 188 x +(maintenanc)S 2 x(e)S 187 x(of)S 188 x(these)S 188 x(structures)S +189 x(represents)S 188 x(an)S 548 y 4796 X(object)S 183 x(orient)S +2 x(ed)S 182 x(or)S -9 x(ganizat)S 2 x(ional)S 183 x(strategy)S 184 x +(towards)S 182 x(managing)S 183 x(the)S 184 x(control)S 183 x(and)S +183 x(state)S 183 x(informatio)S 2 x(n)S 182 x(involved)S 184 x(in)S +548 y 4796 X(providing)S 177 x(the)S 177 x(services.)S 271 x(These)S +177 x(structure)S 177 x(are)S 177 x(referenced)S 177 x(through)S +177 x(the)S 177 x(resource)S 177 x(id)S 177 x(in)S 177 x(image)S +177 x(service)S 177 x(requests.)S 548 y 4796 X(The)S 181 x +(structures)S 182 x(are)S 182 x(not)S 182 x(bundled)S 182 x(into)S +182 x(a)S 181 x(mega)S 182 x(structure)S 182 x(so)S 181 x(that)S +182 x(mix)S 182 x(and)S 181 x(match)S 182 x(\212exibil)S 2 x(ity)S +182 x(is)S 181 x(maintai)S 2 x(ned)S 181 x(at)S 547 y 4796 X +(service)S 166 x(request)S 167 x(time.)S 249 x(Mega)S 166 x +(resource)S 167 x(structures)S 166 x(may)S 166 x(be)S 166 x +(supported)S 167 x(in)S 167 x(the)S 166 x(XIEtoolki)S 2 x(t)S 166 x +(if)S 167 x(it)S 167 x(makes)S 166 x(sense.)S 897 y 4796 X(The)S +186 x(overview)S 186 x(describes)S 186 x(the)S 187 x(purpose)S 185 x +(of)S 186 x(the)S 186 x(resource,)S 191 x(general)S 186 x(content)S +2 x(,)S 190 x(and)S 186 x(usage.)S 288 x(Where)S 186 x(relat)S 2 x +(ionships)S 548 y 4796 X(between)S 166 x(server)S 166 x(resources)S +166 x(exist,)S 167 x(they)S 167 x(are)S 166 x(pointed)S 167 x(out.)S +15349 Y 3600 X F28(4.2.1)S 599 x(Image)S 168 x(Object)S 167 x(-)S +166 x(IOB)S 16445 Y 4796 X F78(An)S 166 x(image)S 168 x(object)S +169 x(\(IOB\))S 167 x(is)S 167 x(a)S 168 x(structure)S 168 x(which)S +167 x(contai)S 2 x(ns)S 167 x(the)S 168 x(image)S 168 x(data)S 168 x +(and)S 167 x(closely)S 169 x(associated)S 168 x(attri)S 2 x(butes)S +168 x(within)S 548 y 4796 X(a)S 169 x(server)S -27 x(.)S 255 x(IOBs)S +169 x(are)S 170 x(always)S 169 x(revisabl)S 2 x(e)S 169 x(form)S +169 x(entit)S 2 x(ies.)S 255 x(As)S 169 x(such,)S 170 x(an)S 170 x +(image)S 170 x(object)S 171 x(can)S 170 x(be)S 169 x(a)S 170 x +(source)S 169 x(or)S 170 x(destinati)S 2 x(on)S 548 y 4796 X(in)S +170 x(a)S 170 x(transport,)S 172 x(enhancement,)S 172 x(or)S 170 x +(rendition)S 171 x(process.)S 257 x(IOBs)S 170 x(are)S 170 x(not)S +171 x(used)S 170 x(in)S 170 x(display)S 172 x(operations.)S 257 x +(XIEP)S 170 x(provides)S 548 y 4796 X(the)S 182 x(means)S 181 x(by)S +181 x(which)S 182 x(the)S 182 x(output)S 182 x(of)S 182 x(a)S 181 x +(render)S 182 x(operation)S 183 x(which)S 181 x(produces)S 182 x(a)S +181 x(\211nal)S 182 x(form)S 181 x(image,)S 185 x(or)S 182 x(input)S +182 x(to)S 182 x(a)S 548 y 4796 X(display)S 167 x(operation)S 167 x +(\(\211nal)S 167 x(form)S 165 x(images\))S 166 x(may)S 166 x(be)S +166 x(converted)S 167 x(back)S 167 x(into)S 167 x(an)S 166 x(IOB)S +166 x(\(revisable)S 167 x(form)S 166 x(images\).)S 897 y 4796 X +(Clients)S 175 x(know)S 173 x(IOBs)S 173 x(as)S 173 x(resources.)S +264 x(A)S 173 x(client)S 175 x(can)S 174 x(create)S 174 x(and)S 174 x +(delete)S 175 x(an)S 174 x(IOB,)S 172 x(and)S 174 x(modify)S 174 x +(as)S 173 x(well)S 174 x(as)S 173 x(query)S 174 x(the)S 548 y 4796 X +(attribut)S 2 x(es)S 165 x(section)S 166 x(of)S 165 x(an)S 165 x +(IOB.)S 165 x(The)S 165 x(only)S 166 x(way)S 165 x(a)S 165 x(clie)S +2 x(nt)S 165 x(can)S 166 x(directly)S 167 x(\(ie.)S 249 x(other)S +165 x(than)S 166 x(by)S 165 x(a)S 166 x(server)S 165 x(based)S 165 x +(processing)S 548 y 4796 X(operation\))S 167 x(modify)S 166 x(or)S +166 x(query)S 166 x(the)S 167 x(image)S 166 x(data)S 167 x(sectio)S +2 x(n)S 166 x(of)S 166 x(an)S 166 x(IOB)S 166 x(is)S 166 x(through)S +167 x(a)S 166 x(transport)S 167 x(operation.)S 896 y 4796 X(In)S +174 x(general,)S 178 x(an)S 175 x(IOBs)S 175 x(is)S 175 x(an)S 175 x +(operand)S 176 x(to)S 176 x(most)S 174 x(transfer)S -19 x(,)S 177 x +(enhancement,)S 177 x(and)S 176 x(rendition)S 176 x(requests.)S 267 x +(In)S 175 x(all)S 176 x(cases,)S 177 x(an)S 548 y 4796 X(image)S +181 x(context)S 183 x(of)S 181 x(one)S 182 x(form)S 180 x(or)S 181 x +(another)S 182 x(is)S 182 x(also)S 182 x(involved)S 182 x(in)S 182 x +(these)S 182 x(operations,)S 186 x(and)S 181 x(except)S 182 x(where)S +182 x(explici)S 2 x(tly)S 548 y 4796 X(noted,)S 163 x(the)S 164 x +(same)S 163 x(IOB)S 162 x(may)S 163 x(be)S 163 x(used)S 163 x(as)S +163 x(the)S 163 x(source)S 163 x(and)S 163 x(destin)S 2 x(ation)S +164 x(for)S 162 x(an)S 163 x(operati)S 2 x(on.)S 249 x(In)S 162 x +(general,)S 164 x(IOBs)S 163 x(are)S 163 x(to)S 163 x(be)S 548 y +4796 X(considered)S 170 x(as)S 170 x(very)S 171 x(scarce)S 170 x +(resources)S 170 x(by)S 170 x(the)S 171 x(client)S 2 x(,)S 170 x +(and)S 171 x(server)S 170 x(space)S 170 x(considerati)S 2 x(ons)S +170 x(may)S 170 x(cause)S 170 x(multipl)S 2 x(e)S 170 x(IOB)S 548 y +4796 X(creation)S 167 x(requests)S 166 x(to)S 167 x(fail.)S 25212 Y +3600 X F28(4.2.2)S 599 x(Image)S 168 x(Enhancem)S 2 x(ent)S 166 x +(Context)S 167 x(-)S 166 x(IEC)S 26308 Y 4796 X F78(An)S 171 x +(Image)S 172 x(Enhancement)S 174 x(Context)S 174 x(\(IEC\))S 172 x +(is)S 172 x(an)S 173 x(association)S 174 x(of)S 172 x(image)S 172 x +(processing)S 173 x(operands)S 172 x(and)S 173 x(operators)S 172 x +(used)S 548 y 4796 X(in)S 166 x(the)S 167 x(enhancement)S 167 x +(processing)S 167 x(of)S 166 x(an)S 166 x(image.)S 897 y 4796 X(An)S +166 x(IEC)S 168 x(resource)S 167 x(is)S 167 x(referenced)S 167 x +(every)S 168 x(time)S 167 x(an)S 167 x(image)S 168 x(object)S 168 x +(or)S 167 x(region)S 167 x(thereof)S 168 x(is)S 167 x(to)S 168 x(be)S +167 x(processed)S 167 x(for)S 166 x(enhance-)S 548 y 4796 X(ment)S +166 x(purposes.)S 897 y 4796 X(Its)S 184 x(primary)S 184 x(purpose)S +185 x(is)S 184 x(to)S 185 x(allow)S 185 x(enhancement)S 185 x(steps)S +185 x(to)S 185 x(be)S 184 x(represented)S 185 x(in)S 185 x +(processing)S 185 x(macros)S 184 x(\(see)S 184 x(Image)S 547 y 4796 X +(Control)S 167 x(Context\).)S 897 y 4796 X(Clients)S 186 x(know)S +185 x(IECs)S 185 x(as)S 184 x(resources.)S 286 x(A)S 184 x(cli)S +2 x(ent)S 185 x(can)S 185 x(create)S 186 x(and)S 185 x(delete)S 186 x +(an)S 185 x(IEC,)S 185 x(and)S 185 x(modify)S 185 x(as)S 184 x(well)S +186 x(as)S 185 x(query)S 548 y 4796 X(the)S 179 x(content)S 2 x(s)S +179 x(of)S 179 x(an)S 179 x(IEC.)S 179 x(The)S 180 x(same)S 178 x +(IEC)S 180 x(can)S 179 x(be)S 180 x(used)S 179 x(for)S 179 x(many)S +179 x(enhancement)S 180 x(processing)S 179 x(requests,)S 183 x(and)S +179 x(the)S 548 y 4796 X(relationshi)S 2 x(p)S 168 x(between)S 169 x +(an)S 168 x(IEC)S 169 x(and)S 169 x(IOB)S 168 x(is)S 168 x(establi)S +2 x(shed)S 168 x(and)S 168 x(maintai)S 2 x(ned)S 168 x(only)S 169 x +(during)S 169 x(an)S 168 x(enhancement)S 170 x(operation.)S 548 y +4796 X(A)S 171 x(cli)S 2 x(ent)S 173 x(can)S 172 x(maintai)S 2 x(n)S +172 x(multipl)S 2 x(e)S 172 x(distinc)S 2 x(t)S 172 x(IECs)S 173 x +(which)S 173 x(can)S 172 x(be)S 173 x(used)S 172 x(to)S 173 x +(render)S 173 x(the)S 173 x(same)S 172 x(\(or)S 172 x(dif)S -9 x +(ferent)S 173 x(IOB')S -28 x(s\))S 172 x(in)S 548 y 4796 X(dif)S +-9 x(ferent)S 167 x(ways.)S 35879 Y 3600 X F40(4\2036)S 449 x +(EXTENSION)S 165 x(PROT)S -9 x(OCOL)S 166 x(ELEMENTS)S +1 PP +EP +%%Page 7 47 +1000 BP 39600 30600 PM 0 0 XY +5246 Y 3600 X F28(4.2.3)S 599 x(Image)S 168 x(Process)S 167 x +(Context)S 167 x(-)S 166 x(IPC)S 6342 Y 4796 X F78(An)S 165 x(Image)S +166 x(Process)S 166 x(Context)S 168 x(\(IPC\))S 165 x(is)S 167 x(a)S +166 x(structure)S 167 x(which)S 166 x(is)S 167 x(used)S 166 x(for)S +166 x(one)S 166 x(of)S 166 x(three)S 167 x(purposes:)S 896 y 4796 X +(1.)S 522 x(de\211ne)S 167 x(the)S 166 x(subset)S 167 x(of)S 166 x +(an)S 166 x(image)S 166 x(to)S 167 x(process)S 747 y 4796 X(2.)S +522 x(act)S 167 x(as)S 166 x(an)S 166 x(area)S 167 x(operand)S 166 x +(in)S 167 x(area)S 166 x(image)S 167 x(operations)S 748 y 4796 X(3.)S +522 x(both)S 167 x(of)S 166 x(the)S 167 x(above)S 166 x +(\(concurrentl)S 2 x(y\))S 9828 Y 4796 X(When)S 167 x(used)S 167 x +(for)S 166 x(subsetting)S 168 x(purposes,)S 166 x(an)S 167 x(IPC)S +167 x(provides)S 167 x(control)S 168 x(over)S 167 x(the)S 168 x(sub)S +166 x(areas)S 167 x(of)S 167 x(an)S 167 x(image)S 167 x(object)S +168 x(\(objects\))S 548 y 4796 X(to)S 169 x(which)S 170 x +(enhancement)S 170 x(processing)S 170 x(or)S 169 x(renditi)S 2 x(on)S +169 x(operati)S 2 x(ons)S 169 x(should)S 170 x(be)S 169 x(applied)S +2 x(.)S 255 x(In)S 169 x(essence)S 169 x(the)S 170 x(IPC)S 170 x +(selects)S 170 x(the)S 548 y 4796 X(subset,)S 177 x(or)S 175 x +(speci\211c)S 176 x(point)S 2 x(s)S 175 x(in)S 176 x(an)S 175 x +(image)S 176 x(to)S 176 x(which)S 176 x(the)S 176 x(operation)S 176 x +(is)S 176 x(applied)S 177 x(\(acts)S 176 x(as)S 175 x(a)S 175 x +(boolean)S 177 x(control)S 176 x(mask\).)S 548 y 4796 X(T)S -35 x +(wo)S 166 x(forms)S 165 x(of)S 166 x(IPC)S 166 x(exist)S 167 x(for)S +166 x(this)S 167 x(purpose:)S 249 x(region)S 167 x(of)S 166 x +(interest)S 168 x(\(ROI\),)S 165 x(and)S 166 x(control)S 167 x +(processing)S 167 x(plane)S 167 x(\(CPP\).)S 897 y 4796 X(When)S +167 x(used)S 167 x(as)S 167 x(an)S 167 x(area)S 167 x(operand,)S +167 x(an)S 167 x(IPC)S 167 x(speci\211es)S 168 x(a)S 167 x(set)S +167 x(of)S 167 x(operands)S 167 x(and)S 167 x(their)S 168 x(spatial)S +168 x(relati)S 2 x(onship.)S 251 x(The)S 167 x(spatial)S 548 y 4796 X +(relationshi)S 2 x(p)S 177 x(determines)S 178 x(how)S 178 x(the)S +178 x(operands)S 178 x(in)S 178 x(the)S 178 x(set)S 178 x(are)S 178 x +(applied)S 179 x(under)S 177 x(area)S 178 x(operati)S 2 x(ons.)S +271 x(T)S -34 x(wo)S 177 x(possibilit)S 2 x(ies)S 548 y 4796 X +(exist:)S 283 x(fully)S 183 x(populated)S 184 x(and)S 182 x +(sparsely)S 183 x(populate)S 2 x(d.)S 281 x(An)S 182 x(example)S +183 x(of)S 182 x(a)S 182 x(fully)S 184 x(populated)S 184 x(IPC)S +182 x(area)S 183 x(operand)S 182 x(is)S 183 x(a)S 548 y 4796 X(3x3)S +170 x(or)S 171 x(5x5)S 171 x(convoluti)S 2 x(on)S 171 x(kernel)S +171 x(mask)S 170 x(where)S 171 x(all)S 172 x(elements)S 171 x(in)S +171 x(the)S 172 x(mask)S 170 x(have)S 171 x(a)S 171 x(value)S 171 x +(and)S 171 x(are)S 171 x(used)S 171 x(in)S 171 x(the)S 172 x(area)S +548 y 4796 X(operation)S 175 x(-)S 174 x(the)S 174 x(spatial)S 176 x +(relation)S 2 x(ship)S 174 x(between)S 175 x(the)S 174 x(operands)S +174 x(is)S 174 x(unambiguous.)S 265 x(In)S 174 x(the)S 175 x +(sparsely)S 174 x(populate)S 2 x(d)S 173 x(case,)S 548 y 4796 X(the)S +173 x(values)S 174 x(of)S 173 x(the)S 174 x(indivi)S 2 x(dual)S 174 x +(operands)S 173 x(are)S 173 x(speci\211ed)S 174 x(for)S 173 x(a)S +174 x(subset)S 173 x(of)S 173 x(a)S 174 x(square)S 173 x(region.)S +263 x(As)S 173 x(such,)S 174 x(the)S 174 x(locat)S 2 x(ions)S 548 y +4796 X(of)S 173 x(these)S 174 x(operand)S 173 x(values)S 174 x(must)S +173 x(be)S 174 x(speci\211ed)S 174 x(explici)S 2 x(tly)S 174 x +(along)S 174 x(with)S 174 x(the)S 174 x(values.)S 263 x(In)S 174 x +(this)S 174 x(case,)S 174 x(the)S 174 x(elements)S 174 x(that)S 548 y +4796 X(constitut)S 2 x(e)S 181 x(an)S 181 x(area)S 182 x(operation)S +182 x(only)S 182 x(occur)S 181 x(at)S 182 x(the)S 182 x(speci\211ed)S +182 x(locati)S 2 x(ons)S 181 x(\(an)S 181 x(example)S 182 x(would)S +181 x(be)S 181 x(a)S 182 x(cross)S 180 x(shaped)S 547 y 4796 X +(\211lter\).)S 249 x(IPC')S -27 x(s)S 165 x(used)S 166 x(for)S 166 x +(the)S 167 x(purposes)S 166 x(described)S 167 x(in)S 166 x(this)S +167 x(paragraph)S 167 x(will)S 167 x(be)S 166 x(referred)S 166 x(to)S +167 x(as)S 166 x(templates.)S 897 y 4796 X(Note)S 168 x(that)S 169 x +(a)S 168 x(major)S 169 x(dif)S -9 x(ference)S 169 x(between)S 169 x +(the)S 168 x(\211rst)S 169 x(two)S 168 x(classes)S 168 x(is)S 169 x +(that)S 169 x(in)S 168 x(the)S 169 x(\211rst,)S 168 x(the)S 169 x +(IPC)S 168 x(is)S 169 x(simply)S 168 x(a)S 168 x("select)S 2 x(or",)S +548 y 4796 X(while)S 166 x(in)S 167 x(the)S 167 x(second,)S 166 x +(the)S 166 x(IPC)S 166 x(is)S 167 x(used)S 166 x(both)S 167 x(for)S +165 x(area)S 167 x(operation)S 167 x(select)S 2 x(ion)S 166 x(and)S +166 x(operand)S 167 x(value)S 167 x(speci\211cati)S 2 x(on.)S 19691 Y +3600 X F36(4.2.3.1)S 599 x(Region)S 167 x(of)S 167 x(Interest)S 166 x +(-)S 166 x(ROI)S 897 y 4796 X F78(A)S 180 x(region)S 182 x(of)S 181 x +(interest)S 182 x(\(ROI\))S 181 x(is)S 181 x(a)S 181 x(closed)S 182 x +(form)S 180 x(\(analyti)S 2 x(c\))S 181 x(de\211niti)S 2 x(on)S 181 x +(of)S 181 x(a)S 181 x(single,)S 185 x(fully)S 182 x(connected)S 2 x +(,)S 184 x(subregion)S 548 y 4796 X(of)S 176 x(an)S 176 x(image.)S +269 x(ROI')S -28 x(s)S 176 x(de\211ne)S 177 x(the)S 177 x(geometric)S +177 x(bounds)S 176 x(on)S 176 x(an)S 177 x(image)S 176 x(object)S +178 x(within)S 177 x(which)S 177 x(the)S 176 x(operati)S 2 x(on)S +176 x(is)S 176 x(to)S 177 x(be)S 548 y 4796 X(performed)S 165 x(and)S +167 x(outside)S 167 x(of)S 166 x(which)S 166 x(it)S 167 x(is)S 166 x +(not)S 167 x(to)S 167 x(be)S 166 x(performed.)S 897 y 4796 X +(Regions)S 175 x(of)S 175 x(interest)S 176 x(can)S 175 x(be)S 175 x +(any)S 175 x(two-dimensional)S 176 x(closed)S 175 x(shape)S 175 x +(de\211ned)S 175 x(with)S 175 x(reference)S 176 x(to)S 175 x(an)S +175 x(image)S 175 x(object')S -26 x(s)S 548 y 4796 X(coordinate)S +175 x(system,)S 174 x(such)S 174 x(that)S 175 x(the)S 174 x +(question)S 174 x(of)S 174 x(within)S 174 x(can)S 174 x(be)S 174 x +(answered)S 173 x(for)S 174 x(any)S 174 x(pixel)S 174 x(in)S 174 x +(the)S 175 x(image)S 173 x(object)S 2 x(.)S 263 x(It)S 548 y 4796 X +(should)S 176 x(be)S 176 x(possible)S 177 x(to)S 177 x(de\211ne)S +176 x(closed)S 177 x(form)S 175 x(analyt)S 2 x(ic)S 176 x(regions)S +177 x(such)S 176 x(as)S 176 x(circles)S 177 x(and)S 176 x(rectangl)S +2 x(es,)S 178 x(as)S 176 x(well)S 176 x(as)S 176 x(more)S 547 y +4796 X(general)S 167 x(closed)S 166 x(polygons)S 167 x(de\211ned)S +167 x(by)S 166 x(a)S 166 x(list)S 167 x(of)S 166 x(coordinat)S 2 x +(e)S 166 x(vertices.)S 897 y 4796 X(Regions)S 173 x(of)S 173 x +(interest)S 174 x(are)S 173 x(optional)S 174 x(operands)S 173 x(in)S +174 x(image)S 173 x(enhancement)S 174 x(processing)S 173 x(and)S +173 x(renditio)S 2 x(n)S 172 x(requests.)S 263 x(When)S 548 y 4796 X +(not)S 188 x(speci\211ed,)S 194 x(the)S 189 x(system)S 188 x +(presumes)S 188 x(that)S 189 x(the)S 189 x(user)S 188 x(speci\211ed)S +189 x(a)S 188 x(region)S 189 x(of)S 188 x(interest)S 189 x(of)S 188 x +(the)S 189 x(same)S 188 x(geometric)S 548 y 4796 X(structure)S 167 x +(and)S 166 x(equal)S 167 x(to)S 166 x(the)S 167 x(full)S 167 x +(extent)S 168 x(of)S 165 x(the)S 167 x(image)S 167 x(object)S 167 x +(upon)S 166 x(which)S 167 x(the)S 167 x(operation)S 167 x(is)S 166 x +(being)S 167 x(performed.)S 897 y 4796 X(A)S 169 x(region)S 170 x +(of)S 169 x(interest)S 171 x(can)S 170 x(only)S 170 x(be)S 170 x +(used)S 169 x(to)S 170 x(control)S 171 x(the)S 170 x(subregion)S +170 x(to)S 170 x(which)S 170 x(processing)S 170 x(applies.)S 256 x +(It)S 170 x(has)S 170 x(no)S 169 x(other)S 548 y 4796 X(af)S -9 x +(fect)S 166 x(on)S 166 x(the)S 167 x(semantics)S 167 x(of)S 166 x +(the)S 167 x(operation)S 167 x(\(no)S 166 x(control)S 167 x +(mechanisms\).)S 896 y 4796 X(Clients)S 173 x(know)S 171 x(ROIs)S +171 x(as)S 171 x(IPC)S 171 x(resources.)S 260 x(A)S 171 x(client)S +173 x(can)S 171 x(create)S 173 x(and)S 172 x(delete)S 172 x(an)S +172 x(ROI,)S 171 x(and)S 171 x(modify)S 172 x(as)S 171 x(well)S 172 x +(as)S 171 x(query)S 548 y 4796 X(the)S 155 x(content)S 2 x(s)S 154 x +(of)S 155 x(an)S 156 x(ROI.)S 154 x(The)S 155 x(same)S 155 x(ROI)S +155 x(can)S 155 x(be)S 156 x(used)S 155 x(for)S 154 x(many)S 155 x +(transport,)S 158 x(enhancement,)S 158 x(and)S 155 x(renditi)S 2 x +(on)S 155 x(requests,)S 548 y 4796 X(and)S 172 x(the)S 173 x +(relatio)S 2 x(nship)S 172 x(between)S 173 x(an)S 172 x(ROI)S 172 x +(and)S 173 x(IOB)S 172 x(is)S 172 x(establi)S 2 x(shed)S 172 x(and)S +172 x(maintai)S 2 x(ned)S 172 x(only)S 173 x(during)S 173 x(an)S +172 x(the)S 173 x(operati)S 2 x(on.)S 548 y 4796 X(A)S 165 x(clien)S +2 x(t)S 166 x(can)S 167 x(maintain)S 167 x(multipl)S 2 x(e)S 166 x +(ROI')S -28 x(s)S 166 x(re\212ecting)S 167 x(dif)S -8 x(ferent)S +166 x(regions)S 167 x(of)S 166 x(image)S 166 x(object)S 2 x(s)S 166 x +(which)S 166 x(may)S 166 x(be)S 166 x(of)S 166 x(interest)S 2 x(.)S +897 y 4796 X(An)S 165 x(ROI)S 166 x(is)S 166 x(de\211ned)S 167 x +(with)S 167 x(relation)S 167 x(to)S 167 x(the)S 167 x(coordinates)S +167 x(of)S 166 x(an)S 166 x(IOB.)S 896 y 4796 X(If)S 181 x(at)S 182 x +(all)S 183 x(possible,)S 185 x(the)S 183 x(image)S 182 x(extension)S +183 x(will)S 182 x(use)S 182 x(the)S 182 x(core)S 182 x(X)S 181 x +(graphics)S 182 x(clippi)S 2 x(ng)S 181 x(structures)S 183 x(as)S +181 x(the)S 182 x(region)S 183 x(of)S 548 y 4796 X(interest)S 171 x +(resource.)S 256 x(In)S 169 x(this)S 171 x(case,)S 170 x(the)S 171 x +(image)S 170 x(extension)S 171 x(will)S 171 x(simply)S 170 x +(de\211ne)S 170 x(the)S 170 x(semantics)S 170 x(of)S 170 x(the)S +170 x(core)S 170 x(X)S 170 x(clippin)S 2 x(g)S 548 y 4796 X +(structures)S 166 x(when)S 166 x(used)S 166 x(in)S 167 x(conjunct)S +2 x(ion)S 166 x(with)S 167 x(imaging)S 167 x(services.)S 35879 Y +17820 X F40(EXTENSION)S 165 x(PROT)S -9 x(OCOL)S 165 x(ELEMENTS)S +449 x(4\2037)S +1 PP +EP +%%Page 8 48 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 3600 X F36(4.2.3.2)S 599 x(Control)S 167 x(Processing)S 167 x +(Plane)S 167 x(-)S 166 x(CPP)S 896 y 4796 X F78(A)S 169 x(Control)S +172 x(Processing)S 171 x(Plane)S 171 x(\(CPP\))S 170 x(is)S 170 x(a)S +171 x(mechanism)S 170 x(used)S 170 x(only)S 171 x(in)S 171 x +(enhancement)S 172 x(processing.)S 257 x(Its)S 171 x(purpose)S 170 x +(is)S 170 x(to)S 548 y 4796 X(allow)S 167 x(control)S 168 x(on)S +167 x(a)S 167 x(pixel)S 167 x(by)S 167 x(pixel)S 168 x(basis)S 167 x +(over)S 167 x(the)S 167 x(appli)S 2 x(cation)S 168 x(of)S 166 x(an)S +167 x(enhancement)S 168 x(process.)S 250 x(It)S 167 x(can)S 167 x +(be)S 167 x(used)S 167 x(both)S 548 y 4796 X(to)S 166 x(select)S +167 x(subregions,)S 166 x(and)S 167 x(to)S 166 x(control)S 167 x +(the)S 167 x(particu)S 2 x(lars)S 166 x(of)S 166 x(certain)S 167 x +(operators.)S 897 y 4796 X(CPPs)S 178 x(are)S 179 x(only)S 179 x +(used)S 178 x(in)S 180 x(enhancement)S 179 x(processing)S 179 x(and)S +179 x(cannot)S 180 x(be)S 178 x(used)S 179 x(in)S 179 x(transport)S +179 x(or)S 179 x(rendition)S 180 x(processing.)S 548 y 4796 X +(Unlike)S 166 x(ROIs,)S 166 x(CPPs)S 166 x(do)S 166 x(not)S 166 x +(have)S 167 x(an)S 166 x(analyt)S 2 x(ic)S 166 x(form)S 166 x(of)S +166 x(representation)S 2 x(.)S 896 y 4796 X(Clients)S 176 x(know)S +174 x(CPPs)S 174 x(as)S 175 x(IPC)S 174 x(resources.)S 266 x(A)S +174 x(client)S 176 x(can)S 175 x(create)S 175 x(and)S 175 x(delete)S +176 x(a)S 175 x(CPP)S -56 x(,)S 174 x(and)S 175 x(modify)S 175 x(as)S +174 x(well)S 175 x(as)S 175 x(query)S 548 y 4796 X(the)S 178 x +(content)S 2 x(s)S 177 x(of)S 178 x(a)S 178 x(CPP)S -55 x(.)S 178 x +(The)S 178 x(same)S 178 x(CPP)S 178 x(can)S 179 x(be)S 178 x(used)S +178 x(for)S 178 x(many)S 177 x(enhancement)S 179 x(requests,)S 181 x +(and)S 179 x(the)S 178 x(relati)S 2 x(onship)S 548 y 4796 X(between)S +167 x(a)S 167 x(CPP)S 167 x(and)S 167 x(IOB)S 166 x(is)S 167 x +(establi)S 2 x(shed)S 166 x(and)S 167 x(maintai)S 2 x(ned)S 167 x +(only)S 167 x(during)S 167 x(an)S 167 x(the)S 168 x(operation.)S +251 x(A)S 166 x(clien)S 2 x(t)S 167 x(may)S 166 x(maintain)S 548 y +4796 X(multiple)S 167 x(CPPs.)S 897 y 4796 X(CPPs)S 169 x(are)S 169 x +(in)S 170 x(essence)S 169 x(the)S 170 x(data)S 170 x(component)S +170 x(of)S 169 x(a)S 170 x(revisable)S 170 x(form)S 169 x(image)S +170 x(object)S 170 x(\(IOB\),)S 168 x(and)S 170 x(may)S 169 x(be)S +169 x(implemente)S 2 x(d)S 548 y 4796 X(as)S 164 x(IOB')S -28 x(s)S +164 x(\(one)S 164 x(of)S 165 x(two)S 164 x(IOB)S 164 x(operands)S +165 x(to)S 164 x(an)S 165 x(image)S 165 x(enhancement)S 165 x +(operation\).)S 250 x(It)S 164 x(may)S 164 x(also)S 165 x(be)S 165 x +(possible)S 165 x(to)S 165 x(use)S 164 x(the)S 548 y 4796 X(core)S +171 x(X)S 172 x(control)S 172 x(plane)S 173 x(structures)S 172 x(as)S +172 x(the)S 172 x(control)S 173 x(processing)S 172 x(plane)S 172 x +(resource.)S 260 x(In)S 171 x(this)S 173 x(case,)S 172 x(the)S 173 x +(image)S 172 x(extension)S 548 y 4796 X(will)S 176 x(simply)S 175 x +(de\211ne)S 176 x(the)S 176 x(semantics)S 176 x(of)S 175 x(the)S +176 x(core)S 176 x(X)S 174 x(control)S 177 x(structures)S 176 x +(when)S 175 x(used)S 175 x(in)S 176 x(conjunct)S 2 x(ion)S 176 x +(with)S 175 x(imaging)S 548 y 4796 X(services.)S 896 y 4796 X(Some)S +156 x(examples)S 158 x(of)S 157 x(how)S 156 x(CPP')S -27 x(s)S 157 x +(maybe)S 157 x(used)S 157 x(may)S 157 x(help)S 157 x(explai)S 2 x(n)S +157 x(the)S 157 x(breadth)S 158 x(of)S 157 x(it')S -26 x(s)S 156 x +(potent)S 2 x(ial)S 158 x(applicat)S 2 x(ions.)S 249 x(In)S 157 x +(the)S 548 y 4796 X(case)S 167 x(where)S 166 x(the)S 168 x(user)S +167 x(needs)S 167 x(to)S 167 x(specify)S 168 x(the)S 167 x(pixel)S +2 x(s)S 166 x(\(on)S 167 x(a)S 167 x(point)S 168 x(by)S 167 x(point)S +168 x(basis)S 167 x(rather)S 168 x(than)S 167 x(the)S 168 x(ROI)S +166 x(bounded)S 168 x(area)S 548 y 4796 X(case\))S 173 x(to)S 174 x +(which)S 173 x(pointwi)S 2 x(se)S 173 x(algebraic)S 175 x +(operations)S 174 x(are)S 174 x(applied,)S 176 x(a)S 173 x(CPP)S +173 x(which)S 174 x(is)S 174 x(a)S 173 x(simple)S 174 x(bitonal)S +175 x(image)S 173 x(\(contro)S 548 y 4796 X(map\))S 167 x(may)S 169 x +(be)S 168 x(used.)S 253 x(In)S 169 x(the)S 169 x(case)S 168 x(where)S +169 x(areawise)S 168 x(algebrai)S 2 x(c)S 168 x(operati)S 2 x(ons)S +168 x(are)S 168 x(to)S 169 x(be)S 169 x(performed)S 168 x(\(such)S +168 x(as)S 168 x(\211lteri)S 2 x(ng\),)S 548 y 4796 X(weighted)S +174 x(area)S 173 x(masks)S 173 x(including)S 175 x(spatial)S 174 x +(convolut)S 2 x(ion)S 173 x(\211lter)S 174 x(kernels)S 174 x(may)S +173 x(be)S 173 x(speci\211ed)S 174 x(as)S 173 x(a)S 173 x(CPP)S 174 x +(with)S 173 x(zero)S 174 x(and)S 548 y 4796 X(non)S 166 x(zero)S +166 x(integral)S 168 x(values.)S 19367 Y 3600 X F36(4.2.3.3)S 599 x +(T)S -36 x(emplates)S 166 x(-)S 166 x(TMP)S 897 y 4796 X F78(A)S +182 x(templat)S 2 x(e)S 183 x(\(TMP\))S 183 x(is)S 184 x(a)S 183 x +(mechanism)S 183 x(used)S 184 x(only)S 183 x(in)S 184 x(enhancement)S +185 x(area)S 183 x(processing.)S 284 x(Its)S 183 x(purpose)S 183 x +(is)S 184 x(to)S 184 x(allow)S 548 y 4796 X(control)S 175 x(over)S +174 x(which)S 174 x(local)S 175 x(area)S 175 x(source)S 174 x(image)S +174 x(pixel)S 2 x(s)S 173 x(\(pixels)S 175 x(near)S 174 x(the)S 175 x +(current)S 175 x(tar)S -9 x(get)S 175 x(pixel\))S 175 x(partici)S +2 x(pate)S 175 x(in)S 174 x(area)S 548 y 4796 X(operations,)S 166 x +(and)S 167 x(values)S 166 x(of)S 166 x(the)S 167 x(second)S 166 x +(area)S 167 x(operand)S 166 x(on)S 167 x(a)S 166 x(pixel)S 167 x(by)S +166 x(pixel)S 167 x(basis.)S 897 y 4796 X(TMPs)S 176 x(are)S 177 x +(only)S 177 x(used)S 177 x(in)S 177 x(enhancement)S 178 x +(processing)S 177 x(and)S 177 x(cannot)S 178 x(be)S 177 x(used)S +177 x(in)S 177 x(transport)S 177 x(or)S 177 x(renditi)S 2 x(on)S +176 x(processing.)S 547 y 4796 X(Unlike)S 166 x(ROIs,)S 166 x(TMPs)S +166 x(do)S 166 x(not)S 166 x(have)S 167 x(an)S 166 x(analyt)S 2 x +(ic)S 166 x(form)S 166 x(of)S 166 x(representation.)S 897 y 4796 X +(Clients)S 172 x(know)S 171 x(TMPs)S 171 x(as)S 171 x(IPC)S 171 x +(resources.)S 258 x(A)S 171 x(client)S 173 x(can)S 171 x(create)S +172 x(and)S 172 x(delete)S 172 x(a)S 171 x(TMP)S -55 x(,)S 171 x +(and)S 171 x(modify)S 171 x(as)S 171 x(well)S 172 x(as)S 171 x +(query)S 548 y 4796 X(the)S 175 x(contents)S 175 x(of)S 175 x(a)S +174 x(TMP)S -55 x(.)S 174 x(The)S 175 x(same)S 174 x(TMP)S 175 x +(can)S 174 x(be)S 175 x(used)S 174 x(for)S 175 x(many)S 174 x +(enhancement)S 175 x(requests,)S 177 x(and)S 175 x(the)S 175 x +(relationshi)S 2 x(p)S 548 y 4796 X(between)S 161 x(a)S 160 x(TMP)S +161 x(and)S 161 x(IOB)S 160 x(is)S 161 x(establi)S 2 x(shed)S 160 x +(and)S 161 x(maintaine)S 2 x(d)S 160 x(only)S 161 x(during)S 161 x +(an)S 161 x(the)S 161 x(operati)S 2 x(on.)S 248 x(A)S 160 x(cli)S +2 x(ent)S 161 x(may)S 160 x(maintai)S 2 x(n)S 548 y 4796 X(multiple)S +167 x(TMPs.)S 26839 Y 3600 X F28(4.2.4)S 599 x(Image)S 168 x +(Control)S 166 x(Context)S 167 x(-)S 166 x(ICC)S 27935 Y 4796 X F78 +(An)S 153 x(Image)S 154 x(Control)S 156 x(Context)S 156 x(\(ICC\))S +154 x(is)S 154 x(a)S 155 x(structure)S 155 x(which)S 154 x +(describes)S 155 x(the)S 155 x(relati)S 2 x(onship)S 154 x(between)S +155 x(the)S 155 x(various)S 155 x(transfer)S -20 x(,)S 548 y 4796 X +(enhancement,)S 168 x(and)S 168 x(renditi)S 2 x(on)S 167 x +(processes)S 168 x(that)S 169 x(make)S 167 x(up)S 168 x(a)S 168 x +(image)S 168 x(processing)S 168 x(pipeline)S 2 x(.)S 251 x(It)S 168 x +(is)S 168 x(possible)S 168 x(with)S 169 x(an)S 168 x(ICC)S 548 y +4796 X(to)S 175 x(describe)S 176 x(enhancement)S 177 x(processing)S +176 x(macros,)S 176 x(as)S 175 x(well)S 176 x(as)S 176 x(various)S +175 x(forms)S 175 x(of)S 175 x(transfer)S -20 x(,)S 178 x +(enhancement,)S 178 x(rendition)S 548 y 4796 X(and)S 166 x(display)S +167 x(pipeli)S 2 x(nes.)S 897 y 4796 X(As)S 167 x(an)S 168 x(ICC)S +168 x(is)S 169 x(a)S 168 x(higher)S 169 x(level)S 169 x(structure)S +169 x(which)S 168 x(may)S 168 x(imply)S 169 x(transfer)S -20 x(,)S +168 x(processing,)S 169 x(and)S 168 x(renditio)S 2 x(n,)S 168 x(it)S +169 x(is)S 168 x(not)S 168 x(referred)S 548 y 4796 X(to)S 181 x(in)S +182 x(those)S 181 x(atomic)S 182 x(requests,)S 185 x(but)S 182 x +(rather)S 181 x(in)S 182 x(pipeli)S 2 x(ne)S 181 x(\(process)S 181 x +(control\))S 182 x(requests)S 181 x(which)S 182 x(explici)S 2 x(tly)S +182 x(signal)S 182 x(the)S 548 y 4796 X(existence)S 167 x(and)S 166 x +(use)S 166 x(of)S 166 x(the)S 167 x(ICC.)S 35879 Y 3600 X F40 +(4\2038)S 449 x(EXTENSION)S 165 x(PROT)S -9 x(OCOL)S 166 x(ELEMENTS)S +1 PP +EP +%%Page 9 49 +1000 BP 39600 30600 PM 0 0 XY +5246 Y 3600 X F28(4.2.5)S 599 x(Image)S 168 x(Display)S 167 x +(Context)S 167 x(-)S 166 x(IDC)S 6342 Y 4796 X F78(An)S 157 x(Image)S +157 x(Display)S 158 x(Context)S 159 x(\(IDC\))S 157 x(is)S 157 x(a)S +158 x(structure)S 158 x(which)S 158 x(controls)S 158 x(the)S 158 x +(display)S 158 x(of)S 158 x(a)S 157 x(\211nal)S 158 x(form)S 157 x +(image)S 158 x(or)S 157 x(sequence)S 547 y 4796 X(of)S 177 x +(images.)S 273 x(It)S 178 x(contai)S 2 x(ns)S 178 x(the)S 178 x +(connecti)S 2 x(on)S 178 x(between)S 179 x(revisable)S 179 x(form)S +177 x(image,)S 181 x(\211nal)S 179 x(form)S 177 x(image,)S 181 x +(display)S 179 x(window)S -33 x(,)S 548 y 4796 X(display)S 183 x +(sequence,)S 186 x(and)S 183 x(sequence)S 182 x(timers.)S 281 x +(IDC')S -27 x(s)S 182 x(used)S 182 x(to)S 182 x(control)S 184 x(the)S +183 x(display)S 183 x(of)S 182 x(image)S 182 x(sequences)S 183 x +(are)S 182 x(also)S 548 y 4796 X(known)S 165 x(as)S 166 x(slide)S +167 x(carousels.)S 35879 Y 17820 X F40(EXTENSION)S 165 x(PROT)S -9 x +(OCOL)S 165 x(ELEMENTS)S 449 x(4\2039)S +1 PP +EP +%%Page 10 50 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(4.3)S 599 x(Service)S 166 x(Operation)S 7700 Y +4796 X F36(Figure)S 167 x(4\2031:)S 498 x(OPERA)S -38 x(TIONAL)S +166 x(MODEL)S 548 y 4796 X 22116 24 R 9487 Y 6708 X F102 +(OPERATIONAL)S 241 x(MODEL)S 10533 Y 6708 X(^)S 9099 X(^)S 448 y +4796 X(client)S 478 x(|)S 9099 X(|)S 448 y 6708 X(|)S 9099 X(|)S +449 y 4796 X(--------|---------|-)S 2 x(-------------x)S 240 x +(wire----------)S 2 x(-------------------)S 2 x(--)S 448 y 6708 X(|)S +9099 X(|)S 448 y 4796 X(server)S 478 x(|)S 240 x(control)S 239 x(|)S +240 x(transport)S 240 x([transport)S 240 x(context])S 240 x +(...............)S 449 y 6708 X(|)S 9099 X(|)S 240 x(processing)S +20098 X(.)S 448 y 6708 X(v)S 9099 X(|)S 20098 X(.)S 448 y 9099 X(v)S +20098 X(.)S 449 y 5274 X(+------->revisable)S 241 x(form)S 20098 X +(.)S 448 y 5274 X(^)S 7665 X(image)S 239 x(object)S 20098 X(.)S 448 y +5274 X(|)S 9099 X(^)S 20098 X(.)S 449 y 5274 X(|)S 9099 X(|)S 20098 X +(.)S 448 y 5274 X(|)S 9099 X(|)S 240 x(enhancement)S 240 x +([enhancement)S 240 x(context].....)S 2 x(.......)S 448 y 5274 X(|)S +9099 X(|)S 240 x(processing)S 20098 X(.)S 448 y 5274 X(|)S 9099 X(|)S +20098 X(.)S 449 y 5274 X(|)S 9099 X(v)S 18185 X(region)S 240 x(of)S +239 x(interest)S 448 y 5274 X(|)S 6469 X(revisable)S 240 x(form)S +18903 X(and)S 448 y 5274 X(+<-------image)S 240 x(object\(s\))S +18185 X(process)S 240 x(control)S 449 y 5274 X(^)S 9099 X(|)S 19381 X +(contexts)S 448 y 5274 X(|)S 9099 X(|)S 20098 X(.)S 448 y 5274 X(|)S +9099 X(|)S 240 x(rendition)S 240 x([rendition)S 240 x +(context].........)S 2 x(.......)S 449 y 5274 X(|)S 9099 X(|)S 240 x +(processing)S 448 y 5274 X(|)S 9099 X(|)S 448 y 5274 X(|)S 9099 X(v)S +449 y 5274 X(+---------------+)S 448 y -238 x(|)S 448 y -239 x(|)S +449 y -239 x(v)S 448 y 7904 X(final)S 239 x(form<-----)S 2 x(--)S +239 x(tightly)S 240 x(coupled)S 448 y 7665 X(image)S 239 x(object)S +12447 X(capture)S 240 x(devices)S 449 y 5991 X(|)S 9099 X(|)S 448 y +5991 X(|)S 239 x(device)S 9099 X(|)S 240 x(display)S 239 x([window)S +240 x(&)S 239 x(luts])S 448 y 5991 X(|)S 239 x(control)S 9099 X(|)S +449 y 5991 X(v)S 9099 X(v)S 747 y 5991 X(DISPLAY)S 240 x(DEVICE)S +672 y 4796 X 22116 24 R 28690 Y 3600 X F28(4.3.1)S 599 x(Flow)S +29786 Y 4796 X F78(The)S 169 x(image)S 170 x(extension)S 171 x +(protocol)S 170 x(follows)S 170 x(the)S 170 x(same)S 169 x(basic)S +170 x(operati)S 2 x(onal)S 170 x(model)S 169 x(as)S 170 x(the)S 170 x +(core)S 169 x(protocol)S 2 x(.)S 255 x(In)S 169 x(particul)S 2 x(ar)S +-20 x(,)S 547 y 4796 X(clients)S 169 x(communicate)S 168 x(with)S +168 x(servers)S 167 x(through)S 168 x(requests,)S 168 x(and)S 168 x +(servers)S 167 x(communicate)S 169 x(with)S 168 x(client)S 2 x(s)S +167 x(through)S 168 x(replies)S 168 x(to)S 548 y 4796 X(requests,)S +165 x(errors,)S 166 x(and)S 166 x(events.)S 897 y 4796 X(An)S 168 x +(image)S 170 x(applicat)S 2 x(ion)S 169 x(begins)S 170 x(by)S 169 x +(establi)S 2 x(shing)S 169 x(a)S 170 x(connection)S 170 x(using)S +170 x(the)S 170 x(core)S 169 x(X1)S -19 x(1)S 169 x(protocol)S 171 x +(to)S 169 x(an)S 170 x(X)S 168 x(server)S -27 x(.)S 254 x(The)S 548 y +4796 X(applicat)S 2 x(ion)S 170 x(then)S 170 x(queries)S 170 x(the)S +171 x(server)S 169 x(in)S 170 x(order)S 170 x(to)S 170 x(determine)S +171 x(if)S 170 x(support)S 170 x(exists)S 170 x(for)S 170 x(the)S +170 x(image)S 170 x(extension)S 171 x(protocol,)S 548 y 4796 X(and)S +183 x(what)S 184 x(level)S 185 x(of)S 184 x(support)S 184 x(exists.)S +284 x(If)S 184 x(the)S 184 x(image)S 184 x(extension)S 185 x(is)S +184 x(supported,)S 188 x(and)S 184 x(at)S 184 x(an)S 184 x +(appropriate)S 185 x(level,)S 189 x(the)S 548 y 4796 X(applicat)S +2 x(ion)S 175 x(establi)S 2 x(shes)S 174 x(a)S 175 x(connect)S 2 x +(ion)S 175 x(to)S 176 x(the)S 175 x(extension)S 176 x(package)S 176 x +(\(session)S 175 x(services\))S 175 x(through)S 176 x(\(within\))S +176 x(the)S 175 x(core)S 548 y 4796 X(X1)S 165 x(protocol)S 168 x +(connection.)S 35879 Y 3600 X F40(4\20310)S 449 x(EXTENSION)S 165 x +(PROT)S -8 x(OCOL)S 165 x(ELEMENTS)S +1 PP +EP +%%Page 11 51 +1000 BP 39600 30600 PM 0 0 XY +5138 Y 4796 X F78(Once)S 167 x(the)S 169 x(connecti)S 2 x(on)S 167 x +(has)S 168 x(been)S 169 x(established,)S 169 x(the)S 169 x(client)S +169 x(and)S 168 x(toolki)S 2 x(t)S 168 x(level)S 2 x(s)S 167 x(use)S +168 x(resource)S 168 x(requests)S 168 x(to)S 168 x(all)S 2 x(ocate)S +168 x(and)S 548 y 4796 X(load)S 159 x(criti)S 2 x(cal)S 159 x +(server)S 159 x(resources.)S 248 x(W)S -19 x(ith)S 159 x(these)S +160 x(resources)S 159 x(allocat)S 2 x(ed,)S 160 x(the)S 159 x +(applica)S 2 x(tion)S 159 x(can)S 160 x(make)S 158 x(image)S 160 x +(data)S 159 x(transport,)S 548 y 4796 X(enhancement,)S 166 x +(renditi)S 2 x(on,)S 166 x(display)S -32 x(,)S 166 x(and)S 166 x +(display)S 167 x(control)S 168 x(requests)S 166 x(of)S 166 x(the)S +167 x(server)S -28 x(.)S 896 y 4796 X(Upon)S 168 x(completion,)S +170 x(the)S 169 x(image)S 169 x(applicat)S 2 x(ion)S 169 x +(disconnects)S 169 x(\211rst)S 169 x(from)S 168 x(the)S 169 x(image)S +169 x(extension)S 169 x(package,)S 170 x(and)S 168 x(then)S 169 x +(from)S 548 y 4796 X(the)S 166 x(X)S 166 x(core)S 166 x(package.)S +897 y 4796 X(Using)S 158 x(this)S 159 x(model,)S 160 x(an)S 158 x +(image)S 159 x(applicat)S 2 x(ion)S 159 x(can)S 158 x(conti)S 2 x +(nue)S 158 x(to)S 159 x(run)S 158 x(as)S 159 x(it)S 159 x(has)S 158 x +(in)S 159 x(the)S 159 x(past.)S 249 x(In)S 158 x(this)S 159 x(case,)S +160 x(the)S 159 x(component)S 548 y 4796 X(of)S 176 x(the)S 177 x +(applica)S 2 x(tion)S 177 x(on)S 177 x(the)S 177 x(client)S 178 x +(side)S 177 x(of)S 176 x(the)S 177 x(wire)S 177 x(takes)S 177 x +(full)S 177 x(responsibil)S 2 x(ity)S 177 x(for)S 176 x(maintai)S +2 x(ning)S 177 x(all)S 177 x(of)S 177 x(its)S 177 x(private)S 548 y +4796 X(image)S 184 x(data)S 185 x(structures,)S 189 x(for)S 184 x +(applyi)S 2 x(ng)S 184 x(all)S 185 x(processing)S 185 x(operatio)S +2 x(ns)S 184 x(to)S 184 x(these)S 185 x(structures,)S 189 x(for)S +184 x(understandi)S 2 x(ng)S 184 x(the)S 548 y 4796 X(display)S 176 x +(device)S 177 x(characteri)S 2 x(stics,)S 178 x(and)S 176 x(for)S +176 x(rendering)S 176 x(an)S 176 x(image)S 176 x(suitabl)S 2 x(e)S +175 x(for)S 176 x(display)S 177 x(in)S 176 x(a)S 176 x(window)S -33 x +(.)S 268 x(In)S 176 x(short,)S 178 x(the)S 548 y 4796 X(client)S +167 x(side)S 166 x(of)S 166 x(the)S 166 x(applicat)S 2 x(ion)S 166 x +(contin)S 2 x(ues)S 165 x(to)S 166 x(bear)S 166 x(responsibili)S +2 x(ty)S 166 x(for)S 165 x(generati)S 2 x(ng)S 166 x(\211nal)S 166 x +(form)S 165 x(images.)S 249 x(XIEP)S 165 x(simply)S 548 y 4796 X +(provides)S 166 x(the)S 167 x(means)S 166 x(to)S 166 x(transport)S +167 x(the)S 167 x(\211nal)S 167 x(form)S 165 x(image)S 166 x(to)S +167 x(the)S 167 x(display)S -32 x(.)S 896 y 4796 X(At)S 180 x(the)S +182 x(other)S 181 x(extreme,)S 184 x(an)S 181 x(image)S 181 x +(applic)S 2 x(ation)S 181 x(may)S 181 x(cause)S 181 x(most)S 180 x +(or)S 181 x(all)S 182 x(of)S 180 x(its)S 182 x(image)S 181 x +(objects)S 182 x(to)S 181 x(reside)S 181 x(on)S 181 x(the)S 548 y +4796 X(server)S 171 x(side)S 173 x(of)S 172 x(the)S 172 x(wire.)S +261 x(In)S 172 x(this)S 172 x(case,)S 174 x(all)S 173 x(enhancement)S +173 x(processing)S 172 x(and)S 172 x(rendering)S 173 x(requests)S +172 x(are)S 172 x(made)S 172 x(through)S 548 y 4796 X(the)S 171 x +(extensi)S 2 x(on)S 171 x(package)S 172 x(\(XIE)S 171 x(T)S -34 x +(oolkit,)S 173 x(XIE)S 172 x(Lib,)S 173 x(XIE)S 171 x(Server\),)S +172 x(and)S 171 x(the)S 172 x(extensi)S 2 x(on)S 171 x(package)S +172 x(bears)S 171 x(responsibil)S 2 x(ity)S 548 y 4796 X(for)S 165 x +(generati)S 2 x(ng)S 166 x(\211nal)S 167 x(form)S 165 x(images.)S +15349 Y 3600 X F28(4.3.2)S 599 x(Requests)S 168 x(and)S 167 x +(Replies)S 16445 Y 4796 X F78(Requests)S 186 x(and)S 185 x(replies)S +186 x(are)S 186 x(the)S 186 x(primary)S 185 x(means)S 185 x(by)S +186 x(which)S 185 x(the)S 186 x(cli)S 2 x(ent)S 186 x(and)S 185 x +(server)S 185 x(communicate.)S 288 x(The)S 186 x(image)S 548 y 4796 X +(extension)S 166 x(requests)S 165 x(will)S 166 x(be)S 165 x +(aggregated)S 166 x(by)S 165 x(the)S 166 x(service)S 166 x(class)S +165 x(to)S 165 x(which)S 166 x(they)S 166 x(belong)S 165 x(\(i.e.)S +249 x(the)S 166 x(service)S 165 x(classes)S 165 x(will)S 548 y 4796 X +(be)S 166 x(broken)S 166 x(down)S 166 x(into)S 167 x(requests)S 167 x +(and)S 166 x(replies\).)S 19036 Y 3600 X F28(4.3.3)S 599 x(Errors)S +20132 Y 4796 X F78(Errors)S 165 x(are)S 167 x(noti\211cati)S 2 x +(ons)S 166 x(to)S 166 x(the)S 167 x(clie)S 2 x(nt)S 166 x(of)S 166 x +(server)S 166 x(problems)S 166 x(with)S 167 x(requests.)S 21626 Y +3600 X F28(4.3.4)S 599 x(Events)S 22722 Y 4796 X F78(Events)S 183 x +(are)S 183 x(situat)S 2 x(ions)S 183 x(or)S 183 x(occurrences)S 184 x +(which)S 183 x(are)S 183 x(detect)S 2 x(able)S 183 x(by)S 184 x(the)S +183 x(server)S 183 x(and)S 183 x(of)S 183 x(potenti)S 2 x(al)S 183 x +(inte)S 2 x(rest)S 183 x(to)S 183 x(the)S 548 y 4796 X(client.)S +269 x(Bear)S 176 x(in)S 176 x(mind)S 176 x(that)S 177 x(multipl)S +2 x(e)S 176 x(clients)S 177 x(may)S 175 x(share)S 176 x(a)S 176 x +(single)S 176 x(server)S -20 x(,)S 178 x(and)S 176 x(as)S 175 x +(such,a)S 176 x(client)S 177 x(may)S 176 x(be)S 176 x(noti\211ed)S +548 y 4796 X(of)S 172 x(an)S 174 x(event)S 173 x(caused)S 174 x(by)S +173 x(a)S 173 x(dif)S -9 x(ferent)S 174 x(client)S 2 x(.)S 262 x +(Image)S 173 x(extension)S 174 x(events)S 174 x(might)S 173 x(incl)S +2 x(ude)S 173 x(changes)S 173 x(in)S 174 x(overall)S 174 x(display)S +548 y 4796 X(characteristi)S 2 x(cs)S 177 x(\(brightness,)S 181 x +(contrast,...\),)S 179 x(transport)S 178 x(complete,)S 181 x +(processing)S 178 x(complete,)S 181 x(rendition)S 179 x(complete,)S +181 x(and)S 548 y 4796 X(time)S 166 x(sequence)S 167 x(display)S +167 x(complete.)S 35879 Y 17595 X F40(EXTENSION)S 165 x(PROT)S -8 x +(OCOL)S 165 x(ELEMENTS)S 448 x(4\2031)S -24 x(1)S +1 PP +EP +%%Page 1 52 +1000 BP 39600 30600 PM 0 0 XY +9007 Y 3600 X F24(Chapter)S 498 x(5)S 10651 Y 3600 X(TERMINOLO)S +-2 x(GY)S 13357 Y 4796 X F78(The)S 159 x(terminology)S 160 x +(section)S 160 x(is)S 159 x(segmented)S 159 x(in)S 160 x(a)S 159 x +(topical)S 160 x(fashion)S 160 x(in)S 159 x(order)S 159 x(to)S 159 x +(keep)S 159 x(closely)S 160 x(associate)S 2 x(d)S 158 x(terms)S 159 x +(togethe)S 2 x(r)S -28 x(.)S 548 y 4796 X(Although)S 175 x(terms)S +174 x(are)S 174 x(capit)S 2 x(alized)S 176 x(within)S 175 x(this)S +175 x(section,)S 177 x(they)S 175 x(are)S 175 x(not)S 175 x(capital)S +2 x(ized)S 175 x(or)S 174 x(visuall)S 2 x(y)S 174 x(dif)S -9 x +(ferenti)S 2 x(ated)S 175 x(from)S 548 y 4796 X(surrounding)S 166 x +(text)S 167 x(in)S 167 x(the)S 167 x(body)S 166 x(of)S 166 x(the)S +167 x(protocol.)S 16097 Y 3600 X F28(5.1)S 599 x(Core)S 165 x +(Protocol)S 17342 Y 4796 X F78(The)S 166 x(following)S 167 x(terms)S +166 x(are)S 167 x(de\211ned)S 166 x(in)S 167 x(the)S 166 x(core)S +167 x(protocol)S 167 x(and)S 166 x(used)S 166 x(at)S 167 x(times)S +167 x(in)S 166 x(the)S 167 x(extension)S 167 x(protocol)S 2 x(.)S +18787 Y 4796 X F36(T)S -37 x(able)S 167 x(5\2031:)S 498 x(Core)S +165 x(T)S -36 x(erms)S 224 y 4796 X 22116 24 R +XP /F82 /Times-Roman-DOCPSE 448.319 10 DF RP +4796 19459 XY F82(Access)S 166 x(ctl)S 166 x(list)S 10624 X(Active)S +165 x(grab)S 16452 X(Ancestors)S 22280 X(Atom)S 747 y 4796 X +(Backing)S 166 x(store)S 10624 X(Bit)S 165 x(gravity)S 16452 X +(Bitmap)S 22280 X(Button)S 166 x(grabbing)S 747 y 4796 X(Byte)S 165 x +(order)S 10624 X(Children)S 16452 X(Client)S 22280 X(Clipping)S 165 x +(regions)S 748 y 4796 X(Color)S 166 x(cell)S 10624 X(Colormap)S +16452 X(Connection)S 22280 X(Containment)S 747 y 4796 X(Coordinate)S +166 x(system)S 10624 X(Cursor)S 16452 X(Depth)S 22280 X(Device)S +747 y 4796 X(Drawable)S 10624 X(Event)S 16452 X(Event)S 166 x(mask)S +22280 X(Event)S 166 x(sychronization)S 747 y 4796 X(Event)S 165 x +(propaga)S 2 x(tion)S 10624 X(Event)S 166 x(source)S 16452 X +(Exposure)S 167 x(event)S 22280 X(Extension)S 747 y 4796 X(Grab)S +10624 X(Graphics)S 166 x(context)S 16452 X(Hotspot)S 22280 X +(Identi\211er)S 748 y 4796 X(Inferiors)S 10624 X(Input)S 166 x +(focus)S 16452 X(Input)S 166 x(manager)S 22280 X(InputOnly)S 166 x +(window)S 747 y 4796 X(InputOutput)S 165 x(window)S 10624 X(Key)S +166 x(grabbing)S 16452 X(Keyboard)S 167 x(grabbing)S 22280 X +(Mapping)S 747 y 4796 X(Modi\211er)S 166 x(keys)S 10624 X(Obscures)S +16452 X(Occludes)S 22280 X(Padding)S 747 y 4796 X(Parent)S 166 x +(window)S 10624 X(Passive)S 167 x(grab)S 16452 X(Pixel)S 166 x +(value)S 22280 X(Pixmap)S 747 y 4796 X(Plane)S 166 x(mask)S 10624 X +(Pointer)S 16452 X(Pointer)S 166 x(grabbing)S 22280 X(Pointing)S +166 x(device)S 748 y 4796 X(Property)S 10624 X(Property)S 167 x +(list)S 16452 X(Redirecting)S 166 x(control)S 22280 X(Reply)S 747 y +4796 X(Request)S 10624 X(Resource)S 16452 X(Root)S 22280 X(Root)S +166 x(window)S 747 y 4796 X(Save)S 166 x(set)S 10624 X(Screen)S +16452 X(Server)S 22280 X(Server)S 167 x(grabbing)S 747 y 4796 X +(Sibling)S 10624 X(Stacking)S 166 x(order)S 16452 X(Stipple)S 22280 X +(T)S -16 x(ile)S 747 y 4796 X(T)S -16 x(imestamp)S 10624 X(T)S -32 x +(ype)S 16452 X(Unviewable)S 22280 X(V)S -27 x(iewable)S 35879 Y +22379 X F40(TERMINOLOG)S -2 x(Y)S 449 x(5\2031)S +1 PP +EP +%%Page 2 53 +1000 BP 39600 30600 PM 0 0 XY +5343 Y 4796 X F36(T)S -37 x(able)S 167 x(5\2031)S 166 x(\(Cont.\):)S +498 x(Core)S 166 x(T)S -37 x(erms)S 225 y 4796 X 22116 24 R 498 y +4796 X F82(V)S -28 x(isible)S 10624 X(W)S -18 x(indow)S 166 x +(gravity)S 16452 X(W)S -18 x(indow)S 166 x(manager)S 22280 X +(XYFormat)S 747 y 4796 X(ZFormat)S 398 y 4796 X 22116 24 R 9403 Y +3600 X F28(5.2)S 599 x(Extension)S 167 x(Protocol)S 10649 Y 4796 X +F78(The)S 170 x(extension)S 171 x(protocol)S 171 x(descriptive)S +171 x(terminolog)S 2 x(y)S 169 x(section)S 171 x(is)S 170 x(intende)S +2 x(d)S 169 x(to)S 171 x(be)S 169 x(suf)S -9 x(\211cient)S 171 x +(for)S 170 x(clearly)S 171 x(communicat-)S 548 y 4796 X(ing)S 166 x +(concepts.)S 250 x(It)S 166 x(is)S 166 x(not)S 167 x(intende)S 2 x +(d)S 166 x(to)S 166 x(be)S 166 x(exhausti)S 2 x(ve.)S 12691 Y 3600 X +F28(5.2.1)S 599 x(Image)S 168 x(De\211nitions)S +XP /F80 /Times-Bold-DOCPSE 498.132 10 DNF RP +4796 13787 XY F80(CON)S -2 x(TINUOUS_IMAG)S -2 x(E)S 896 y 4796 X +F78(An)S 173 x(optical)S 2 x(ly)S 174 x(formed)S 173 x(counterpart)S +176 x(of)S 173 x(a)S 174 x(real)S 174 x(world)S 174 x(object)S 175 x +(or)S 174 x(scene.)S 264 x(An)S 174 x(example)S 174 x(would)S 174 x +(be)S 174 x(what)S 174 x(is)S 174 x(found)S 174 x(on)S 548 y 4796 X +(the)S 166 x(shutter)S 167 x(or)S 166 x(focal)S 167 x(plane)S 167 x +(of)S 166 x(a)S 166 x(35)S 166 x(mm)S 165 x(camera.)S 897 y 4796 X +F80(DIG)S -2 x(IT)S -36 x(AL_IMAGE)S 897 y 4796 X F78(The)S 175 x +(discrete)S 175 x(version)S 175 x(of)S 175 x(a)S 174 x +(CONTINUOUS_IM)S -2 x(AGE.)S 174 x(The)S 175 x(continuo)S 2 x(us)S +174 x(image)S 175 x(is)S 174 x(sampled)S 175 x(at)S 175 x(the)S 175 x +(verti)S 2 x(ces)S 174 x(of)S 175 x(a)S 548 y 4796 X(regular)S 173 x +(two)S 173 x(dimensional)S 175 x(SAMPLING_G)S -2 x(RID,)S 173 x(and)S +173 x(then)S 174 x(quantized)S 174 x(to)S 174 x(a)S 173 x(\211xed)S +173 x(number)S 173 x(of)S 173 x(levels.)S 264 x(In)S 173 x +(practice,)S 548 y 4796 X(a)S 181 x(digit)S 2 x(al)S 182 x(image)S +182 x(maybe)S 181 x(computed,)S 186 x(synthesized,)S 186 x(or)S 182 x +(randomly)S 181 x(generate)S 2 x(d,)S 185 x(as)S 181 x(well)S 182 x +(as)S 182 x(deriving)S 183 x(from)S 181 x(optical)S 547 y 4796 X +(processes.)S 897 y 4796 X F80(IMAGE_OBJECT)S 897 y 4796 X F78(An)S +182 x(image)S 182 x(object)S 184 x(is)S 183 x(the)S 183 x +(representati)S 2 x(on)S 182 x(of)S 182 x(a)S 183 x(digita)S 2 x(l)S +182 x(image)S 183 x(which)S 183 x(a)S 183 x(computer)S 182 x(appli)S +2 x(cation)S 183 x(manipulat)S 2 x(es.)S 281 x(It)S 548 y 4796 X +(consists)S 170 x(of)S 170 x(IMAGE_DA)S -57 x(T)S -39 x(A)S 169 x +(plus)S 170 x(IMAGE_A)S -56 x(TTRIBUTES.)S 171 x(Unless)S 169 x +(expli)S 2 x(citly)S 171 x(stated)S 171 x(otherwise,)S 171 x(any)S +170 x(use)S 170 x(of)S 169 x(the)S 548 y 4796 X(term)S 166 x +("image")S 167 x(in)S 166 x(the)S 167 x(speci\211cati)S 2 x(on)S +166 x(implies)S 167 x(the)S 167 x(term)S 166 x(IMAGE_OBJECT)S -37 x +(.)S 896 y 4796 X F80(IMAGE_DA)S -39 x(T)S -36 x(A)S 897 y 4796 X +F78(IMAGE_DA)S -57 x(T)S -40 x(A)S 166 x(consists)S 167 x(of)S 166 x +(the)S 166 x(bit)S 2 x(s)S 165 x(which)S 167 x(represent)S 166 x +(the)S 167 x(result)S 167 x(of)S 166 x(the)S 167 x(digiti)S 2 x +(zing)S 167 x(or)S 166 x(synthesis)S 166 x(process.)S 897 y 4796 X +F80(IMAGE_A)S -38 x(TTRIBUTES)S 896 y 4796 X F78(IMAGE_A)S -57 x +(TTRIBUTE)S 2 x(S)S 167 x(are)S 168 x(the)S 169 x(ancill)S 2 x(ary)S +167 x(informatio)S 2 x(n)S 167 x(required)S 169 x(to)S 168 x +(interpret)S 2 x(,)S 167 x(process,)S 168 x(and)S 168 x(present)S +168 x(for)S 168 x(viewing)S 548 y 4796 X(IMAGE_DA)S -57 x(T)S -40 x +(A.)S 166 x(There)S 166 x(are)S 167 x(three)S 166 x(classes)S 167 x +(of)S 166 x(independent)S 168 x(IMAGE_A)S -57 x(TTRIB)S 2 x(UTES:)S +897 y 4796 X(\201)S 722 x(IMAGE_PRESENT)S -39 x(A)S -56 x(TION_A)S +-56 x(TTRIBUTES)S 747 y 4796 X(\201)S 722 x(IMAGE_ORGAN)S -2 x(IZA)S +-55 x(TION_A)S -56 x(TTRIBUTES)S 747 y 4796 X(\201)S 722 x +(IMAGE_ENCODING)S -2 x(_A)S -55 x(TTRIBUTES)S 29179 Y 4796 X F80 +(IMAGE_PRESENT)S -37 x(A)S -38 x(TION_A)S -38 x(TTRIBUTES)S 897 y +4796 X F78(The)S 186 x(attri)S 2 x(butes)S 186 x(of)S 186 x(an)S +186 x(image)S 186 x(which)S 187 x(describe)S 187 x(how)S 185 x(it)S +187 x(is)S 186 x(to)S 187 x(be)S 186 x(presented)S 187 x(to)S 186 x +(a)S 186 x(user)S 186 x(for)S 186 x(viewing.)S 289 x(IMAGE_)S 548 y +4796 X(PRESENT)S -39 x(A)S -56 x(TION_A)S -56 x(TTRIBUTES)S 169 x +(have)S 168 x(no)S 168 x(bearing)S 168 x(upon)S 168 x(the)S 168 x +(or)S -9 x(ganizat)S 2 x(ion)S 168 x(and)S 168 x(amount)S 168 x(of)S +167 x(image)S 168 x(data.)S 253 x(Often,)S 548 y 4796 X(it)S 161 x +(is)S 160 x(desirabl)S 2 x(e)S 160 x(to)S 161 x(make)S 160 x(the)S +161 x(values)S 161 x(of)S 161 x(these)S 161 x(attribut)S 2 x(es)S +160 x(identi)S 2 x(cal)S 161 x(to)S 161 x(those)S 161 x(established)S +162 x(by)S 160 x(the)S 161 x(capture)S 162 x(or)S 160 x(synthesis)S +548 y 4796 X(process)S 179 x(so)S 180 x(that)S 181 x(the)S 181 x +(image)S 180 x(will)S 182 x(appear)S 180 x(identi)S 2 x(cal)S 181 x +(to)S 180 x(what)S 180 x(it)S 181 x(looked)S 181 x(like)S 181 x(at)S +181 x(capture)S 181 x(or)S 180 x(synthesis)S 181 x(time.)S 277 x +(\(see)S 547 y 4796 X(Image)S 165 x(Data)S 167 x(Presentati)S 2 x +(on)S 166 x(De\211nitions\).)S 897 y 4796 X F80(IMAGE_OR)S -2 x +(GANIZA)S -38 x(TION_A)S -38 x(TTRIBUTES)S 35879 Y 3600 X F40 +(5\2032)S 449 x(TERMINOLOGY)S +1 PP +EP +%%Page 3 54 +1000 BP 39600 30600 PM 0 0 XY +5138 Y 4796 X F78(IMAGE_ORGA)S -2 x(NIZA)S -56 x(TION_A)S -56 x +(TTRIBUTE)S 2 x(S)S 173 x(provide)S 174 x(information)S 174 x(about)S +174 x(the)S 173 x(structure)S 174 x(and)S 173 x(associat)S 2 x(ion)S +173 x(of)S 173 x(the)S 548 y 4796 X(bits)S 166 x(which)S 167 x(make)S +166 x(up)S 166 x(the)S 167 x(two)S 166 x(dimensional)S 167 x(image.)S +249 x(\(see)S 166 x(Image)S 166 x(Data)S 167 x(Or)S -10 x(ganizat)S +2 x(ion)S 167 x(De\211nitions\).)S 896 y 4796 X F80(IMAGE_ENCO)S +-2 x(DING_A)S -38 x(TTRIBUTES)S 897 y 4796 X F78(IMAGE_ENCODI)S -2 x +(NG_A)S -56 x(TTRIBUTE)S 2 x(S)S 182 x(de\211ne)S 184 x(the)S 183 x +(mapping)S 184 x(between)S 183 x(the)S 184 x(unencoded)S 183 x +(SYMBOL_SET)S 184 x(and)S 548 y 4796 X(the)S 179 x(encoded)S 180 x +(SYMBOL_SET)S 180 x(where)S 179 x(encoding)S 181 x(is)S 179 x(done)S +180 x(primarily)S 180 x(for)S 179 x(compression)S 179 x(or)S 179 x +(bandwidth)S 181 x(reduction)S 548 y 4796 X(purposes.)S 248 x(\(see)S +166 x(Image)S 166 x(Data)S 166 x(Encodi)S 2 x(ng)S 166 x +(De\211nitions\).)S 896 y 4796 X F80(IMAGE_APPLICA)S -38 x(TION)S +897 y 4796 X F78(A)S 172 x(computer)S 173 x(applic)S 2 x(ation)S +174 x(that)S 174 x(deals)S 173 x(in)S 173 x(the)S 174 x(input,)S +175 x(output,)S 175 x(storage,)S 175 x(or)S 173 x(processing)S 173 x +(of)S 173 x(IMAGE_OBJECTS.)S 172 x(This)S 548 y 4796 X(protocol)S +185 x(speci\211cati)S 2 x(on)S 184 x(is)S 185 x(primarily)S 185 x +(concerned)S 185 x(with)S 185 x(the)S 185 x(processing)S 184 x(and)S +185 x(output)S 185 x(of)S 185 x(IMAGE_OBJECTS)S 184 x(to)S 548 y +4796 X(displays.)S 897 y 4796 X F80(FIDELITY)S 896 y 4796 X F78(The)S +151 x(degree)S 152 x(to)S 152 x(which)S 151 x(the)S 152 x(computer)S +152 x(system)S 150 x(can)S 152 x(reproduce)S 152 x(a)S 151 x +(likeness)S 152 x(of)S 151 x(the)S 152 x(original)S 153 x +(\(source\))S 151 x(continuous)S 152 x(image)S 548 y 4796 X(without)S +172 x(distortion.)S 259 x(Issues)S 170 x(af)S -8 x(fecting)S 172 x +(\211delity)S 172 x(includi)S 2 x(ng)S 171 x(the)S 171 x(sampling)S +171 x(and)S 172 x(display)S 171 x(SP)S -46 x(A)S -55 x(TIAL_)S 171 x +(RESOLUTION,)S 548 y 4796 X(and)S 166 x(the)S 167 x(LUMINAN)S -2 x +(CE_RE)S 2 x(SOLUTION)S 165 x(or)S 166 x(CHROMINAN)S -2 x +(CE_RESOLUTION.)S 897 y 4796 X F80(REPRESENT)S -37 x(A)S -37 x +(TION_EFFICIENCY)S 896 y 4796 X F78(A)S 175 x(measure)S 175 x(of)S +175 x(how)S 175 x(few)S 176 x(bits)S 176 x(can)S 176 x(be)S 175 x +(used)S 176 x(to)S 176 x(represent)S 176 x(a)S 175 x(parti)S 2 x +(cular)S 176 x(DIGIT)S -41 x(AL_IMAGE)S 175 x(with)S 176 x(some)S +175 x(speci\211ed)S 548 y 4796 X(degree)S 166 x(of)S 166 x(FIDELITY)S +-64 x(.)S 897 y 4796 X F80(FINAL_FORM_IMAG)S -2 x(E)S 897 y 4796 X +F78(A)S 175 x(FINAL_FORM_IMAGE)S 175 x(is)S 177 x(one)S 176 x(that)S +177 x(has)S 177 x(been)S 176 x(rendered)S 177 x(suitable)S 178 x +(for)S 176 x(display)S 177 x(on)S 176 x(a)S 177 x(particula)S 2 x(r)S +176 x(device.)S 270 x(All)S 548 y 4796 X(internal)S 176 x +(structural)S 176 x(entit)S 2 x(ies)S 175 x(have)S 175 x(been)S 175 x +(removed,)S 177 x(and)S 175 x(all)S 176 x(rendition)S 176 x +(processing)S 175 x(complete)S 2 x(d.)S 266 x(The)S 175 x(generati)S +2 x(on)S 174 x(of)S 548 y 4796 X(a)S 169 x(FINAL_FORM_IMAG)S -2 x(E)S +170 x(from)S 169 x(a)S 169 x(REVISABLE_FORM_IMAGE)S 170 x(may)S 169 x +(involve)S 171 x(irreversible)S 171 x(TRANSFORMs)S 548 y 4796 X +(such)S 176 x(as)S 176 x(resolutio)S 2 x(n)S 176 x(reduction)S 178 x +(in)S 176 x(the)S 177 x(x,y)S -32 x(,)S 178 x(and)S 177 x(z)S 176 x +(directi)S 2 x(ons.)S 269 x(It)S 176 x(is)S 177 x(always)S 176 x +(possible)S 178 x(to)S 176 x(take)S 178 x(a)S 176 x(FINAL_FORM_)S +547 y 4796 X(IMAGE)S 165 x(and)S 166 x(rede\211ne)S 167 x(it)S 167 x +(as)S 166 x(the)S 166 x(starti)S 2 x(ng)S 166 x(point)S 167 x(for)S +166 x(a)S 166 x(new)S 166 x(and)S 166 x(enti)S 2 x(rely)S 166 x(dif)S +-8 x(ferent)S 166 x(REVISABLE_FORM_IMAGE.)S 897 y 4796 X F80(REVISA)S +-2 x(BLE_F)S 2 x(ORM_IMAG)S -2 x(E)S 897 y 4796 X F78(A)S 174 x +(REVISABLE_FORM_IMAGE)S 175 x(is)S 175 x(the)S 176 x(source)S 175 x +(image)S 176 x(used)S 175 x(in)S 175 x(reversible)S 176 x(and)S 176 x +(irreversible)S 176 x(image)S 176 x(rendering)S 548 y 4796 X +(operations.)S 256 x(A)S 169 x(REVISABLE_FORM_IMAGE)S 170 x(may)S +169 x(\(by)S 169 x(chance\))S 171 x(be)S 169 x(suitabl)S 2 x(e)S +169 x(for)S 170 x(display)S 170 x(as)S 170 x(is,)S 170 x(on)S 169 x +(a)S 170 x(particul)S 2 x(ar)S 548 y 4796 X(device.)S 272 x(If)S +177 x(this)S 179 x(is)S 177 x(the)S 179 x(case,)S 180 x(the)S 178 x +(REVISABLE_FORM_IMAGE)S 177 x(is)S 178 x(converted)S 179 x(to)S 178 x +(a)S 177 x(FINAL_FORM_IMAGE)S 548 y 4796 X(by)S 181 x(performing)S +181 x(a)S 181 x(null)S 183 x(rendering)S 182 x(operation.)S 280 x +(REVISABLE_FORM_IMAGEs)S 181 x(may)S 181 x(maintain)S 182 x(some)S +181 x(internal)S 548 y 4796 X(or)S -10 x(ganiza)S 2 x(tion)S 167 x +(or)S 166 x(structure)S 167 x(and)S 166 x(continue)S 168 x(to)S 166 x +(carry)S 166 x(rendit)S 2 x(ion)S 166 x(attri)S 2 x(butes)S 166 x +(along)S 167 x(with)S 167 x(them)S 896 y 4796 X F80(DISPLA)S -47 x +(Y_GRID)S 897 y 4796 X F78(The)S 173 x(regular)S -19 x(,)S 173 x +(two)S 173 x(dimensional)S 174 x(grid)S 173 x(at)S 174 x(whose)S +172 x(vertices)S 174 x(the)S 173 x(original)S 174 x(image)S 174 x +(is)S 172 x(reconstruct)S 2 x(ed)S 173 x(during)S 173 x(display)S +-31 x(.)S 261 x(A)S 548 y 4796 X(display)S 167 x(grid)S 166 x(locat)S +2 x(ion)S 166 x(is)S 166 x(often)S 167 x(referred)S 166 x(to)S 167 x +(as)S 166 x(a)S 166 x(PIXEL.)S 896 y 4796 X F80(SAMPLING_GR)S -2 x +(ID)S 897 y 4796 X F78(The)S 175 x(regular)S -19 x(,)S 176 x(two)S +175 x(dimensional)S 176 x(grid)S 175 x(at)S 176 x(whose)S 174 x +(vertice)S 2 x(s)S 174 x(the)S 176 x(original)S 176 x(image)S 175 x +(is)S 175 x(sampled)S 175 x(during)S 176 x(digiti)S 2 x(zation.)S +267 x(A)S 548 y 4796 X(sampling)S 166 x(grid)S 167 x(locati)S 2 x +(on)S 166 x(is)S 166 x(often)S 167 x(referred)S 166 x(to)S 166 x(as)S +166 x(a)S 167 x(PIXEL.)S 35879 Y 22379 X F40(TERMINOLOG)S -2 x(Y)S +449 x(5\2033)S +1 PP +EP +%%Page 4 55 +1000 BP 39600 30600 PM 0 0 XY +5246 Y 3600 X F28(5.2.2)S 599 x(Image)S 168 x(Characteristics)S +6342 Y 4796 X F80(SP)S -37 x(A)S -37 x(TIAL)S 896 y 4796 X F78(The)S +190 x(aspects)S 191 x(of)S 190 x(an)S 190 x(image)S 190 x(which)S +191 x(relate)S 191 x(to)S 190 x(space)S 191 x(\(typicall)S 2 x(y)S +190 x(x)S 190 x(&)S 190 x(y)S 190 x(dimensions,)S 196 x(and)S 190 x +(resolution)S 191 x(in)S 191 x(these)S 548 y 4796 X(dimensions\))S +166 x(includi)S 2 x(ng)S 166 x(how)S 166 x(the)S 166 x(image)S 167 x +(varies)S 166 x(with)S 167 x(respect)S 167 x(to)S 166 x(the)S 167 x +(spatial)S 168 x(dimensions.)S 897 y 4796 X F80(TEMPORAL)S 896 y +4796 X F78(The)S 158 x(aspects)S 159 x(of)S 157 x(an)S 158 x(image)S +159 x(which)S 158 x(relate)S 159 x(to)S 159 x(time)S 158 x(\(t)S +159 x(dimension,)S 159 x(and)S 159 x(resolution)S 159 x(in)S 159 x +(this)S 158 x(dimension\))S 159 x(\(typi\211ed)S 159 x(by)S 158 x +(the)S 548 y 4796 X(dif)S -9 x(ference)S 172 x(between)S 172 x(a)S +172 x(still)S 173 x(frame,)S 172 x(and)S 171 x(a)S 172 x(motion)S +172 x(sequence\))S 172 x(includi)S 2 x(ng)S 171 x(how)S 172 x(the)S +172 x(image)S 172 x(varies)S 172 x(at)S 172 x(any)S 171 x(SP)S -45 x +(A)S -56 x(TIAL)S 548 y 4796 X(location)S 168 x(with)S 166 x +(respect)S 167 x(to)S 167 x(the)S 166 x(time)S 167 x(dimension.)S +897 y 4796 X F80(RESOLUTIO)S -2 x(N)S 897 y 4796 X F78(The)S 173 x +(\211neness)S 172 x(or)S 172 x(granulari)S 2 x(ty)S 173 x(of)S 172 x +(an)S 173 x(image)S 173 x(measured)S 172 x(either)S 174 x(at)S 173 x +(the)S 173 x(capture)S 173 x(or)S 173 x(rendition)S 174 x(point.)S +262 x(The)S 174 x(granularity)S 547 y 4796 X(is)S 171 x(usually)S +171 x(expressed)S 171 x(in)S 172 x(both)S 171 x(spatial)S 173 x +(frequency)S 171 x(\(dots)S 171 x(per)S 171 x(inch\))S 171 x(and)S +171 x(temporal)S 172 x(frequency)S 171 x(\(frames)S 170 x(per)S 171 x +(second\).)S 548 y 4796 X(Resolution)S 170 x(is)S 168 x(a)S 169 x +(meaningless)S 169 x(term)S 168 x(away)S 168 x(from)S 168 x(the)S +169 x(capture)S 169 x(and)S 169 x(renditi)S 2 x(on)S 168 x(points.)S +254 x(Instead,)S 169 x(total)S 170 x(pixels)S 169 x(per)S 169 x +(scan)S 548 y 4796 X(line,)S 166 x(total)S 168 x(scan)S 166 x +(lines,)S 167 x(and)S 166 x(total)S 168 x(frames)S 165 x(in)S 167 x +(a)S 166 x(sequence)S 167 x(are)S 166 x(more)S 166 x(useful.)S 897 y +4796 X F80(SP)S -37 x(A)S -37 x(TIAL_RESOLUTION)S 897 y 4796 X F78 +(A)S 173 x(measure)S 173 x(of)S 173 x(the)S 174 x(separation)S 175 x +(between)S 174 x(adjacent)S 175 x(points)S 175 x(\(in)S 173 x(both)S +175 x(SP)S -46 x(A)S -56 x(TIAL)S 174 x(dimensions\))S 173 x(or)S +174 x(granularity)S 175 x(of)S 173 x(the)S 548 y 4796 X(SAMPLING)S +-2 x(_GRID)S 167 x(and)S 168 x(/)S 167 x(or)S 168 x(the)S 167 x +(DISPLA)S -46 x(Y_GRID.)S 166 x(SP)S -46 x(A)S -56 x +(TIAL_RESOLUTION)S 168 x(has)S 167 x(nothing)S 168 x(to)S 168 x(do)S +168 x(with)S 167 x(image)S 548 y 4796 X(size)S 166 x(or)S 166 x +(total)S 168 x(data)S 167 x(content.)S 250 x(It)S 166 x(has)S 166 x +(to)S 167 x(do)S 166 x(with)S 167 x(\211neness)S 166 x(at)S 166 x +(capture)S 167 x(and)S 167 x(output)S 167 x(times.)S 896 y 4796 X +F80(TEMPORAL_RESOLUTION)S 897 y 4796 X F78(A)S 165 x(measure)S 166 x +(of)S 166 x(the)S 167 x(separation)S 167 x(in)S 167 x(time)S 166 x +(between)S 167 x(the)S 167 x(capture)S 167 x(or)S 166 x(display)S +167 x(of)S 166 x(two)S 166 x(adjacen)S 2 x(t)S 166 x(image)S 166 x +(object)S 168 x(frames.)S 896 y 4796 X F80(SP)S -37 x(A)S -37 x +(TIAL_FREQUENCY)S 897 y 4796 X F78(A)S 165 x(measure)S 166 x(of)S +166 x(the)S 167 x(rapidity)S 167 x(of)S 166 x(image)S 167 x(change)S +167 x(with)S 166 x(respect)S 167 x(to)S 167 x(space.)S 897 y 4796 X +F80(TEMPORAL_FREQUENCY)S 896 y 4796 X F78(A)S 165 x(measure)S 166 x +(of)S 166 x(the)S 167 x(rapidity)S 167 x(of)S 166 x(image)S 167 x +(change)S 167 x(with)S 166 x(respect)S 167 x(to)S 167 x(time.)S 897 y +4796 X F80(INTENSITY)S 897 y 4796 X F78(The)S 177 x(square)S 177 x +(of)S 177 x(the)S 178 x(amplitude)S 178 x(of)S 177 x(the)S 178 x +(electro_magnet)S 2 x(ic)S 177 x(\211eld)S 178 x(as)S 177 x +(measured)S 177 x(at)S 177 x(the)S 178 x(focal)S 177 x(plane)S 178 x +(of)S 177 x(the)S 178 x(imaging)S 548 y 4796 X(device.)S 249 x +(Intensit)S 2 x(y)S 166 x(is)S 166 x(what)S 166 x(we)S 166 x +(perceive)S 167 x(as)S 166 x(brightn)S 2 x(ess.)S 896 y 4796 X F80 +(INTENSITY_LEVELS)S 897 y 4796 X F78(The)S 166 x(number)S 166 x(of)S +166 x(distinct)S 168 x(brightness)S 167 x(levels)S 167 x +(represented)S 167 x(in)S 166 x(the)S 167 x(image.)S 897 y 4796 X +F80(CON)S -2 x(TRAST)S 896 y 4796 X F78(The)S 166 x(dif)S -8 x +(ference)S 166 x(between)S 167 x(minimum)S 166 x(and)S 166 x +(maximum)S 165 x(INTENSITY)S 166 x(level)S 2 x(s)S 165 x(in)S 167 x +(an)S 166 x(image.)S 897 y 4796 X F80(LUMINAN)S -2 x(CE)S 896 y +4796 X F78(The)S 175 x(component)S 176 x(of)S 175 x(an)S 175 x +(image)S 176 x(which)S 175 x(represents)S 176 x(the)S 175 x +(INTENSITY)S 175 x(at)S 176 x(either)S 176 x(a)S 175 x(single)S 176 x +(wavelengt)S 2 x(h)S 175 x(or)S 175 x(averaged)S 548 y 4796 X(over)S +166 x(a)S 166 x(wavelength)S 167 x(band.)S 249 x(INTENSITY)S -64 x +(,)S 165 x(LUMINANCE,)S 165 x(and)S 167 x(brightness)S 166 x(are)S +167 x(psynonomous.)S 897 y 4796 X F80(CHR)S -2 x(OMINANCE)S 897 y +4796 X F78(The)S 168 x(component)S 169 x(of)S 168 x(an)S 168 x +(image)S 169 x(which)S 168 x(describes)S 169 x(the)S 168 x +(dependence)S 170 x(of)S 168 x(INTENSITY)S 167 x(on)S 169 x +(wavelength)S 169 x(or)S 168 x(wavelength)S 548 y 4796 X(band.)S +35879 Y 3600 X F40(5\2034)S 449 x(TERMINOLOGY)S +1 PP +EP +%%Page 5 56 +1000 BP 39600 30600 PM 0 0 XY +5227 Y 3600 X F28(5.2.3)S 599 x(V)S -11 x(isual)S 167 x(T)S -44 x +(ypes)S 6323 Y 4796 X F80(VISUA)S -2 x(L_TYPE)S 897 y 4796 X F78(A)S +179 x(label)S 180 x(appli)S 2 x(ed)S 179 x(to)S 180 x(the)S 181 x +(human)S 179 x(perception)S 181 x(of)S 179 x(a)S 180 x(continuous)S +181 x(image)S 180 x(based)S 179 x(upon)S 180 x(perceived)S 181 x +(characterist)S 2 x(ics)S 179 x(of)S 548 y 4796 X(intensit)S 2 x(y)S +169 x(distri)S 2 x(bution,)S 171 x(and)S 170 x(dependency)S 171 x +(upon)S 170 x(wavelength)S 171 x(and)S 170 x(time.)S 257 x(The)S +171 x(continuous)S 171 x(image)S 170 x(of)S 170 x(an)S 170 x(object)S +171 x(\(and)S 548 y 4796 X(occasionall)S 2 x(y)S 181 x(the)S 182 x +(object)S 183 x(itself\))S 182 x(is)S 182 x(said)S 181 x(to)S 182 x +(be)S 182 x(of)S 181 x(one)S 181 x(of)S 182 x(the)S 182 x(following)S +182 x(VISUAL_TYPEs)S 181 x(include)S 182 x(BLACK_)S 547 y 4796 X +(AND)S -2 x(_WHITE,)S 167 x(GREY_SCALE,)S 166 x(COLOR,)S 165 x +(STILL,)S 167 x(and)S 166 x(MOTION.)S 897 y 4796 X F80(BLACK_AN)S +-2 x(D_WHITE)S 897 y 4796 X F78(A)S 178 x(VISUAL_TYPE)S 178 x(where)S +179 x(the)S 179 x(continuous)S 180 x(images)S 179 x(have)S 179 x +(very)S 179 x(high)S 179 x(contrast,)S 182 x(and)S 179 x(no)S 179 x +(perceived)S 180 x(temporal)S 180 x(or)S 548 y 4796 X(chrominance)S +166 x(dependency)S 168 x(\(i.e.)S 248 x(what)S 167 x(we)S 165 x +(perceive)S 168 x(when)S 166 x(reading)S 167 x(this)S 166 x(page\).)S +896 y 4796 X F80(GREY_SC)S -2 x(ALE)S 897 y 4796 X F78(A)S 185 x +(VISUAL_TYPE)S 186 x(where)S 187 x(the)S 187 x(continuous)S 187 x +(image)S 187 x(has)S 187 x(a)S 186 x(relati)S 2 x(vely)S 187 x(wide)S +187 x(range)S 186 x(of)S 187 x(intensit)S 2 x(ies)S 186 x(which)S +187 x(vary)S 548 y 4796 X(smoothly)S -32 x(,)S 179 x(and)S 178 x(no)S +177 x(perceived)S 178 x(temporal)S 178 x(or)S 178 x(chrominance)S +178 x(dependencies.)S 272 x(GREY_SCALE)S 178 x(is)S 177 x(perhaps)S +177 x(more)S 177 x(an)S 548 y 4796 X(artifact)S 167 x(of)S 166 x +(early)S 167 x(televi)S 2 x(sion)S 166 x(and)S 167 x(photography)S +167 x(than)S 167 x(of)S 165 x(nature.)S 896 y 4796 X F80(COLOR)S +897 y 4796 X F78(A)S 172 x(VISUAL_TYPE)S 173 x(where)S 173 x(the)S +174 x(conti)S 2 x(nuous)S 173 x(image)S 174 x(has)S 173 x(a)S 173 x +(wide)S 174 x(range)S 174 x(of)S 173 x(luminances)S 174 x(and)S 174 x +(chrominances)S 174 x(which)S 548 y 4796 X(vary)S 166 x(smoothly)S +-32 x(,)S 165 x(and)S 167 x(no)S 166 x(temporal)S 167 x +(dependencies.)S 897 y 4796 X F80(STILL)S 896 y 4796 X F78(A)S 165 x +(VISUAL_TYPE)S 166 x(which)S 166 x(demonstrates)S 167 x(no)S 166 x +(temporal)S 167 x(variati)S 2 x(on)S 166 x(\(e.g.)S 248 x(this)S +167 x(page\).)S 897 y 4796 X F80(MOTION)S 897 y 4796 X F78(A)S 165 x +(VISUAL_TYPE)S 166 x(which)S 166 x(demonstrates)S 167 x(temporal)S +167 x(variati)S 2 x(ons)S 165 x(\(e.g.)S 249 x(televi)S 2 x(sion\).)S +21516 Y 3600 X F28(5.2.4)S 599 x(Image)S 168 x(Classes)S 22612 Y +4796 X F80(IMAGE_CLASS)S 897 y 4796 X F78(The)S 172 x(grouping)S +173 x(of)S 172 x(a)S 172 x(digit)S 2 x(al)S 172 x(image)S 173 x +(based)S 172 x(upon)S 172 x(which)S 173 x(visual)S 173 x(type)S 172 x +(it)S 173 x(represents)S 173 x(with)S 173 x(highest)S 173 x(ef)S +-9 x(\211ciency)S 173 x(and)S 172 x(\211-)S 547 y 4796 X(delity)S +160 x(of)S 158 x(reproduction.)S 250 x(IMAGE_CLASSes)S 158 x +(include)S 160 x(MONO)S -2 x(CHROMA)S -56 x(TIC-BIT)S -8 x(ONAL,)S +157 x(MONOCHROMA)S -57 x(TIC-)S 548 y 4796 X(CONTINUO)S -2 x(US)S +170 x(T)S -8 x(ONE,)S 169 x(and)S 171 x(POL)S -50 x(YCHROMA)S -57 x +(TIC-CONTINUOUS)S 169 x(T)S -8 x(ONE)S 170 x(or)S 170 x(MUL)S -46 x +(TISPECTRAL.)S 171 x(All)S 171 x(three)S 548 y 4796 X(classes)S 166 x +(have)S 166 x(eith)S 2 x(er)S 166 x(the)S 166 x(ST)S -39 x(A)S -56 x +(TIC)S 167 x(or)S 166 x(TIME_V)S -64 x(AR)S -28 x(YING)S 165 x +(modi\211er)S -27 x(.)S 897 y 4796 X F80(MONO)S -2 x(CHROMA)S -38 x +(TIC-BIT)S -9 x(ONAL)S 897 y 4796 X F78(An)S 168 x(IMAGE_CLASS)S +169 x(in)S 170 x(which)S 170 x(two)S 169 x(INTENSITY_LEVELS)S 170 x +(are)S 169 x(represented.)S 256 x(At)S 169 x(sampling)S 170 x(and)S +170 x(display)S 170 x(times,)S 548 y 4796 X(a)S 180 x(PIXEL)S 181 x +(for)S 181 x(the)S 181 x(MONOCHROM)S -2 x(A)S -55 x(TIC-BIT)S -8 x +(ONAL)S 180 x(IMAGE_CLASS)S 180 x(is)S 181 x(one)S 181 x(bit)S 182 x +(deep.)S 278 x(The)S 181 x(display)S 182 x(of)S 180 x(an)S 548 y +4796 X(image)S 181 x(of)S 181 x(this)S 181 x(class)S 182 x(either)S +182 x(does)S 181 x(not)S 181 x(use)S 181 x(a)S 181 x(COLORMAP)S -56 x +(,)S 181 x(or)S 180 x(uses)S 181 x(the)S 182 x(BLACK)S 181 x(and)S +181 x(WHITE)S 181 x(entries)S 182 x(of)S 181 x(the)S 547 y 4796 X +(COLORMAP)S -56 x(.)S 177 x(The)S 178 x(MONOCHROMA)S -57 x(TIC-BIT)S +-8 x(ONAL)S 177 x(IMAGE_CLASS)S 177 x(is)S 178 x(optimal)S 178 x +(\(REPRE)S 2 x(SENT)S -40 x(A)S -56 x(TION_)S 548 y 4796 X +(EFFICIENCY)S 166 x(and)S 166 x(RENDITION_FIDELITY\))S 165 x(for)S +166 x(the)S 167 x(BLACK_AND_WHITE)S 166 x(VISUAL_TYPE.)S 897 y 4796 X +F80(MONO)S -2 x(CHROMA)S -38 x(TIC-CON)S -2 x(TINUOUS_T)S -10 x(ONE)S +897 y 4796 X F78(An)S 184 x(IMAGE_CLASS)S 184 x(in)S 185 x(which)S +185 x(2)S 78 y(**)S -78 y(N)S 184 x(-1)S 185 x(INTENSITY_LEVELS)S +185 x(are)S 185 x(represented.)S 286 x(At)S 185 x(sampling)S 185 x +(and)S 185 x(dis-)S 548 y 4796 X(play)S 192 x(times,)S 198 x(a)S +192 x(PIXEL)S 191 x(for)S 192 x(the)S 192 x(CONTINUOU)S -2 x(S_T)S +-8 x(ONE)S 191 x(IMAGE_CLASS)S 191 x(is)S 192 x(N)S 191 x(bits)S +193 x(deep)S 192 x(where)S 191 x(N)S 191 x(>)S 192 x(1.)S 548 y +4796 X(CONTINUO)S -2 x(US_T)S -9 x(ONE)S 184 x(is)S 184 x +(accomplished)S 185 x(on)S 184 x(color)S 184 x(display)S 2 x(s)S +183 x(with)S 185 x(the)S 184 x(PIXEL)S 184 x(value)S 185 x(being)S +185 x(used)S 184 x(as)S 183 x(an)S 185 x(in-)S 548 y 4796 X(dex)S +178 x(into)S 180 x(a)S 178 x(COLORMAP)S -56 x(,)S 178 x(and)S 179 x +(the)S 179 x(same)S 178 x(value)S 179 x(used)S 179 x(to)S 179 x +(drive)S 179 x(the)S 179 x(RED,)S 178 x(GREEN,)S 178 x(and)S 179 x +(BLUE)S 179 x(display)S 179 x(guns.)S 547 y 4796 X(The)S 184 x(MONO)S +-2 x(CHROMA)S -56 x(TIC-CONTINUOUS_T)S -9 x(ONE)S 183 x(IMAGE_CLASS)S +183 x(is)S 184 x(optimal)S 184 x(\(REPRESE)S 2 x(NT)S -40 x(A)S -56 x +(TION_)S 548 y 4796 X(EFFICIENCY)S 166 x(and)S 166 x +(RENDITION_FIDELITY\))S 165 x(for)S 166 x(the)S 167 x(GREY_SCALE)S +167 x(VISUA)S -2 x(L_TYPE.)S 35879 Y -194 x F40(TERMINOLOG)S -2 x(Y)S +449 x(5\2035)S +1 PP +EP +%%Page 6 57 +1000 BP 39600 30600 PM 0 0 XY +5131 Y 4796 X F80(POL)S -46 x(YCHR)S -2 x(OMA)S -37 x(TIC-CON)S -2 x +(TINUOUS_T)S -10 x(ONE)S 166 x(or)S 166 x(MUL)S -46 x(TI_SPECTRAL)S +897 y 4796 X F78(An)S 183 x(IMAGE_CLASS)S 183 x(in)S 185 x(which)S +184 x(multipl)S 2 x(e)S 183 x(\(>2\))S 184 x(INTENSITY_LEVELS)S 185 x +(are)S 184 x(represented)S 184 x(for)S 184 x(multiple)S 185 x(\(2)S +184 x(or)S 548 y 4796 X(more\))S 170 x(SPECTR)S 2 x(AL_COMPONENT)S +-36 x(s.)S 259 x(MUL)S -46 x(TI_SPECT)S 2 x(RAL)S 171 x(is)S 172 x +(typical)S 2 x(ly)S 172 x(accomplished)S 172 x(on)S 172 x(color)S +172 x(displays)S 172 x(via)S 548 y 4796 X(the)S 180 x(use)S 180 x +(of)S 180 x(the)S 181 x(COLORMAP)S -55 x(.)S 179 x(The)S 181 x(POL)S +-50 x(YCHROMA)S -56 x(TIC_CONTINUOUS_T)S -10 x(ONE)S 180 x(or)S 180 x +(MUL)S -46 x(TI_SPECTRAL)S 547 y 4796 X(IMAGE_CLASS)S 178 x(is)S +179 x(optimal)S 180 x(\(REPRESENT)S -39 x(A)S -55 x(TION_EFFICIENCY)S +178 x(and)S 179 x(RENDITION_FIDELITY\))S 178 x(for)S 179 x(the)S +548 y 4796 X(COLOR)S 166 x(VISUAL_TYPE.)S 897 y 4796 X F80(ST)S -37 x +(A)S -37 x(TIC)S 897 y 4796 X F78(A)S 169 x(modi\211er)S 169 x(of)S +169 x(the)S 171 x(other)S 170 x(IMAGE_CLASSes)S 169 x(indicat)S 2 x +(ing)S 170 x(no)S 169 x(TEMPORAL)S 170 x(dependency)S -31 x(,)S 169 x +(and)S 170 x(implying)S 171 x(only)S 170 x(one)S 548 y 4796 X +(unchanging)S 167 x(IMAGE_OBJECT)S -37 x(.)S 896 y 4796 X F80 +(TIME_V)S -65 x(AR)S -18 x(YING)S 897 y 4796 X F78(A)S 180 x +(modi\211er)S 180 x(of)S 180 x(the)S 181 x(other)S 181 x +(IMAGE_CLASSes)S 180 x(indi)S 2 x(cating)S 181 x(TEMPORAL)S 181 x +(dependency)S -31 x(,)S 183 x(and)S 181 x(implying)S 182 x(multiple)S +548 y 4796 X(IMAGE_OBJECT)S -35 x(s)S 166 x(which)S 166 x(represent)S +167 x(the)S 166 x(conti)S 2 x(nuous)S 166 x(image)S 166 x(at)S 167 x +(dif)S -9 x(ferent)S 167 x(times)S 167 x(\(usually)S 167 x(a)S 166 x +(time)S 166 x(sequence\).)S 14396 Y 3600 X F28(5.2.5)S 599 x(Image)S +168 x(Data)S 166 x(Organization)S 15492 Y 4796 X F80(IMAGE_DA)S -39 x +(T)S -36 x(A_ORG)S -2 x(ANIZA)S -38 x(TION)S 897 y 4796 X F78(The)S +170 x(way)S 169 x(in)S 171 x(which)S 170 x(a)S 169 x(logi)S 2 x(cal)S +170 x(PCM)S 170 x(model)S 170 x(of)S 169 x(IMAGE_DA)S -56 x(T)S -40 x +(A)S 170 x(is)S 170 x(mapped)S 169 x(onto)S 171 x(a)S 169 x +(physical)S 171 x(storage)S 171 x(model.)S 256 x(The)S 548 y 4796 X +(overall)S 183 x(purpose)S 182 x(is)S 182 x(to)S 183 x(enable)S 183 x +(convenient)S 183 x(associat)S 2 x(ion)S 182 x(of)S 182 x(and)S 182 x +(access)S 182 x(to)S 183 x(all)S 183 x(of)S 182 x(the)S 183 x(bits)S +182 x(which)S 183 x(represent)S 182 x(the)S 548 y 4796 X +(information)S 168 x(found)S 167 x(at)S 168 x(each)S 167 x(sampling)S +168 x(grid)S 168 x(point.)S 252 x(Three)S 167 x(signi\211ca)S 2 x +(nt)S 167 x(IMAGE_DA)S -56 x(T)S -40 x(A_ORGANIZA)S -57 x(TIONS)S +167 x(exist,)S 548 y 4796 X(each)S 171 x(possessing)S 170 x(dif)S +-8 x(ferent)S 171 x(access)S 171 x(characterist)S 2 x(ics.)S 258 x +(The)S 171 x(core)S 171 x(X)S 170 x(protocol)S 172 x(recognizes)S +171 x(only)S 171 x(two)S 171 x(of)S 171 x(these)S 171 x(formats)S +548 y 4796 X(\(see)S 166 x(names)S 165 x(in)S 167 x(parenthesis\).)S +896 y 4796 X(\201)S 722 x(FULL_PIXEL_COMP)S -45 x(ACTION)S 165 x +(\(Z)S 166 x(format)S 166 x(in)S 167 x(core)S 166 x(X\))S 747 y +4796 X(\201)S 722 x(FULL_PIXEL_EXP)S -45 x(ANSION)S 164 x(\(X-Y)S +166 x(format)S 166 x(in)S 166 x(core)S 166 x(X\))S 748 y 4796 X +(\201)S 722 x(P)S -46 x(AR)S -30 x(TIAL_PIXEL_EXP)S -45 x(ANSION)S +165 x(\(unrecognized)S 167 x(in)S 166 x(core)S 167 x(X\))S 22067 Y +4796 X F80(PIXEL)S 897 y 4796 X F78(A)S 167 x(DISPLA)S -46 x(Y_GRID)S +167 x(or)S 168 x(SAMPLING_GRID)S 167 x(locatio)S 2 x(n.)S 252 x +(Often)S 169 x(used)S 168 x(to)S 168 x(mean)S 168 x(the)S 169 x +(colle)S 2 x(ction)S 169 x(of)S 168 x(bits)S 169 x(representing)S +548 y 4796 X(the)S 158 x(image)S 158 x(information)S 159 x(at)S 158 x +(the)S 159 x(sampling)S 158 x(and)S 158 x(display)S 159 x(grid)S +158 x(locati)S 2 x(ons.)S 248 x(This)S 159 x(second)S 158 x(usage)S +158 x(is)S 158 x(somewhat)S 157 x(dangerous)S 548 y 4796 X(as)S 176 x +(in)S 178 x(modern)S 176 x(displays)S 178 x(there)S 177 x(may)S 177 x +(be)S 177 x(no)S 177 x(simple)S 177 x(stack)S 178 x(of)S 176 x(bits)S +178 x(behind)S 178 x(the)S 177 x(display)S 178 x(at)S 178 x(each)S +177 x(DISPLA)S -46 x(Y_GRID)S 548 y 4796 X(location)S 168 x +(representing)S 167 x(the)S 167 x(image)S 166 x(information)S 167 x +(for)S 166 x(that)S 167 x(PIXEL.)S 897 y 4796 X F80(BITS_PER_PIXEL)S +896 y 4796 X F78(In)S 168 x(DISPLA)S -46 x(Y_SUBSYSTEMs)S 168 x +(which)S 169 x(do)S 169 x(maintain)S 170 x(a)S 169 x(FRAME_BUFFER)S +169 x(with)S 169 x(the)S 170 x(image)S 169 x(information)S 170 x +(for)S 168 x(each)S 548 y 4796 X(PIXEL)S 177 x(collect)S 2 x(ed)S +177 x(into)S 177 x(a)S 177 x(stack)S 178 x(of)S 177 x(N)S 176 x +(bits,)S 180 x(the)S 177 x(number)S 177 x(N.)S 176 x(Unless)S 177 x +(otherwise)S 177 x(quali)S 2 x(\211ed,)S 179 x(the)S 177 x(term)S +177 x(BITS_PER_)S 548 y 4796 X(PIXEL)S 170 x(implie)S 2 x(s)S 170 x +(the)S 171 x(total)S 173 x(number)S 170 x(of)S 171 x(bits)S 171 x +(which)S 171 x(when)S 171 x(aggregated)S 172 x(form)S 170 x(a)S 170 x +(PIXEL.)S 171 x(Occasionally)S -31 x(,)S 171 x(the)S 172 x +(quali\211ed)S 548 y 4796 X(phrase)S 189 x(BITS_PER_)S 2 x +(PIXEL_PER_SPECTR)S 2 x(AL_COMPONENT)S -38 x(,)S 189 x(or)S 190 x +(BITS_PER_PIXEL)S 2 x(_PER_PLANE_)S 548 y 4796 X(GROUP)S 162 x(will)S +164 x(be)S 163 x(used.)S 249 x(Either)S 164 x(of)S 163 x(these)S +164 x(values)S 163 x(must)S 163 x(by)S 163 x(de\211nit)S 2 x(ion)S +163 x(be)S 163 x(less)S 164 x(than)S 163 x(or)S 163 x(equal)S 164 x +(to)S 164 x(BITS_PER_PIXEL.)S 897 y 4796 X F80(BIT_PLANE)S 896 y +4796 X F78(A)S 165 x(two)S 167 x(dimensional)S 167 x(collec)S 2 x +(tion)S 167 x(of)S 166 x(bits)S 167 x(such)S 166 x(that)S 167 x +(there)S 167 x(is)S 167 x(one)S 166 x(and)S 166 x(only)S 167 x(one)S +167 x(bit)S 167 x(at)S 167 x(each)S 166 x(of)S 166 x(the)S 167 x +(points)S 167 x(in)S 167 x(the)S 167 x(two)S 548 y 4796 X +(dimensional)S 171 x(grid.)S 257 x(The)S 170 x(stacking)S 171 x(of)S +170 x(all)S 171 x(BIT_PLANES)S 170 x(which)S 171 x(form)S 169 x(an)S +170 x(image)S 170 x(results)S 171 x(in)S 170 x(a)S 170 x(PIXEL)S +170 x(at)S 171 x(each)S 170 x(grid)S 548 y 4796 X(point.)S 897 y +4796 X F80(PLANE_GRO)S -2 x(UP)S 896 y 4796 X F78(An)S 179 x(or)S +-9 x(ganized)S 181 x(collect)S 2 x(ion)S 180 x(or)S 180 x(stack)S +180 x(of)S 180 x(PLANEs.)S 276 x(A)S 179 x(PLANE_GROUP)S 179 x(may)S +180 x(be)S 180 x(from)S 179 x(1)S 179 x(to)S 181 x(N)S 179 x(PLANES)S +180 x(deep)S 548 y 4796 X(where)S 165 x(N)S 166 x(is)S 166 x(the)S +167 x(number)S 166 x(of)S 166 x(BITS_PER_PIXEL.)S 35879 Y 3600 X F40 +(5\2036)S 449 x(TERMINOLOGY)S +1 PP +EP +%%Page 7 58 +1000 BP 39600 30600 PM 0 0 XY +5131 Y 4796 X F80(PCM)S 897 y 4796 X F78(Pulse)S 175 x(Code)S 175 x +(Modulat)S 2 x(ion)S 175 x(\(or)S 175 x(raw)S 175 x(bits\))S 175 x +(is)S 175 x(the)S 176 x(reference)S 176 x(form)S 174 x(for)S 175 x +(uncompressed)S 174 x(images.)S 267 x(In)S 175 x(PCM)S 175 x(the)S +176 x(image)S 548 y 4796 X(symbol)S 179 x(set)S 179 x(consists)S +180 x(of)S 179 x(PIXELS,)S 178 x(where)S 179 x(PIXELS)S 180 x(are)S +179 x(the)S 180 x(quantized)S 180 x(representat)S 2 x(ion)S 179 x +(of)S 179 x(image)S 180 x(luminance)S 180 x(or)S 548 y 4796 X +(CHROMINA)S -2 x(NCE)S 167 x(channel)S 167 x(as)S 166 x(sampled)S +166 x(at)S 167 x(regular)S 167 x(two)S 166 x(dimensional)S 167 x +(grid)S 167 x(points.)S 896 y 4796 X F80(FULL_PIXEL_COMP)S -37 x +(ACTION)S 897 y 4796 X F78(An)S 178 x(IMAGE_DA)S -56 x(T)S -40 x(A)S +179 x(or)S -9 x(ganizati)S 2 x(on)S 179 x(in)S 180 x(which)S 179 x +(all)S 180 x(bits)S 180 x(which)S 180 x(make)S 179 x(up)S 179 x(all)S +180 x(SPECTRAL_COMPONENT)S -34 x(s)S 178 x(of)S 179 x(a)S 548 y +4796 X(PIXEL)S 175 x(are)S 175 x(logical)S 2 x(ly)S 175 x(and)S 175 x +(physicall)S 2 x(y)S 175 x(adjacent)S 176 x(in)S 176 x(transmission)S +175 x(and)S 175 x(storage.)S 267 x(All)S 175 x(bits)S 176 x(of)S +175 x(an)S 175 x(N)S 174 x(bit)S 176 x(PIXEL)S 175 x(are)S 548 y +4796 X(aggregated)S 170 x(to)S 170 x(form)S 169 x(an)S 170 x +(element)S 170 x(of)S 170 x(a)S 169 x(single,)S 171 x(two)S 170 x +(dimensional)S 171 x(array)S -33 x(.)S 256 x(PIXEL)S 170 x(bit)S +170 x(aggregates)S 170 x(may)S 170 x(be)S 169 x(separated)S 548 y +4796 X(by)S 166 x(pad)S 166 x(bits)S 167 x(for)S 166 x(alignment)S +167 x(purposes.)S 896 y 4796 X F80(FULL_PIXEL_EXP)S -36 x(ANSIO)S +-2 x(N)S 897 y 4796 X F78(An)S 178 x(IMAGE_DA)S -56 x(T)S -40 x(A)S +179 x(or)S -9 x(ganizati)S 2 x(on)S 179 x(in)S 180 x(which)S 179 x +(all)S 180 x(bits)S 180 x(which)S 180 x(make)S 179 x(up)S 179 x(all)S +180 x(SPECTRAL_COMPONENT)S -34 x(s)S 178 x(of)S 179 x(a)S 548 y +4796 X(PIXEL)S 180 x(are)S 181 x(physicall)S 2 x(y)S 180 x +(separated)S 182 x(such)S 180 x(that)S 182 x(every)S 181 x(bit)S +182 x(of)S 180 x(an)S 181 x(N)S 180 x(bit)S 181 x(PIXEL)S 181 x(is)S +181 x(an)S 181 x(element)S 181 x(of)S 181 x(a)S 180 x(separate)S +182 x(two)S 548 y 4796 X(dimensional)S 167 x(array)S 166 x +(\(PLANE\),)S 165 x(there)S 167 x(being)S 167 x(N)S 166 x(such)S +166 x(arrays)S 166 x(\(PLANEs\).)S 896 y 4796 X F80(P)S -37 x(AR)S +-18 x(TIAL_PIXEL_EXP)S -36 x(ANSIO)S -2 x(N)S 897 y 4796 X F78(An)S +189 x(IMAGE_DA)S -57 x(T)S -39 x(A)S 189 x(or)S -9 x(ganizati)S 2 x +(on)S 189 x(in)S 190 x(which)S 190 x(all)S 191 x(bits)S 190 x(which)S +190 x(make)S 189 x(up)S 190 x(each)S 190 x(SPECTRAL_COMPONENT)S 548 y +4796 X(are)S 190 x(physical)S 2 x(ly)S 191 x(adjacent)S 192 x(by)S +191 x(SPECTRAL_COMPONENT)S -37 x(.)S 190 x(The)S 192 x +(BITS_PER_PIXEL)S 191 x(for)S 191 x(each)S 191 x(indivi)S 2 x(dual)S +548 y 4796 X(SPECTRAL_COMPONENT)S 173 x(are)S 174 x(compacted)S 174 x +(into)S 174 x(individu)S 2 x(al,)S 175 x(two)S 173 x(dimensional)S +174 x(arrays,)S 175 x(there)S 174 x(being)S 174 x(one)S 173 x(such)S +548 y 4796 X(array)S 166 x(for)S 166 x(each)S 166 x(SPECTRAL_C)S +2 x(OMPON)S -2 x(ENT)S -36 x(.)S 897 y 4796 X F80(SCAN)S -2 x(_LINE)S +896 y 4796 X F78(A)S 181 x(logical)S 183 x(collect)S 2 x(ion)S 182 x +(of)S 181 x(PIXELs)S 181 x(or)S -9 x(ganize)S 2 x(d)S 181 x(in)S +182 x(a)S 181 x(lin)S 2 x(ear)S 181 x(fashion)S 182 x(which)S 182 x +(represents)S 182 x(an)S 181 x(array)S 182 x(row)S 181 x(in)S 182 x +(the)S 182 x(two)S 548 y 4796 X(dimensional)S 167 x(display)S 167 x +(grid.)S 897 y 4796 X F80(PIXELS_PER_LINE)S 896 y 4796 X F78(The)S +179 x(tota)S 2 x(l)S 179 x(number)S 179 x(of)S 180 x(PIXELS)S 179 x +(per)S 179 x(SCAN_LINE.)S 179 x(Note)S 180 x(that)S 180 x(this)S +180 x(is)S 180 x(not)S 179 x(necessaril)S 2 x(y)S 179 x(the)S 180 x +(number)S 179 x(of)S 179 x(bits)S 180 x(per)S 548 y 4796 X +(SCAN_LINE.)S 897 y 4796 X F80(NUMBER_OF_LINES)S 897 y 4796 X F78 +(The)S 166 x(total)S 168 x(number)S 166 x(of)S 166 x(SCAN_LINEs)S +165 x(in)S 167 x(the)S 167 x(image.)S 896 y 4796 X F80(PIXEL_STRIDE)S +897 y 4796 X F78(The)S 171 x(dif)S -8 x(ference)S 171 x(in)S 171 x +(bit)S 172 x(addresses)S 171 x(between)S 172 x(the)S 172 x(\211rst)S +171 x(bit)S 172 x(of)S 170 x(successive)S 172 x(PIXELS.)S 171 x +(PIXEL_STRIDE)S 171 x(will)S 172 x(typic)S 2 x(ally)S 548 y 4796 X +(be)S 189 x(equal)S 189 x(to)S 190 x(the)S 189 x(number)S 189 x(of)S +189 x(bits)S 189 x(per)S 189 x(pixel)S 190 x(stored)S 190 x(in)S +189 x(a)S 189 x(particul)S 2 x(ar)S 189 x(IMAGE_PLANE_GROU)S -2 x(P)S +-55 x(.)S 188 x(IF)S 189 x(PIXEL)S 548 y 4796 X(alignment)S 177 x +(requires)S 177 x(\211ll)S 177 x(bits)S 177 x(between)S 177 x +(PIXELs,)S 179 x(the)S 177 x(dif)S -9 x(ference)S 177 x(between)S +177 x(PIXEL_STRIDE)S 177 x(and)S 177 x(the)S 177 x(number)S 176 x +(of)S 548 y 4796 X(BITS_PER_PIXEL)S 167 x(per)S 166 x +(IMAGE_PLANE_GROUP)S 165 x(will)S 167 x(equal)S 167 x(the)S 167 x +(\211ll)S 167 x(value.)S 896 y 4796 X F80(SCAN)S -2 x(LINE_STRIDE)S +897 y 4796 X F78(The)S 178 x(dif)S -9 x(ference)S 179 x(in)S 178 x +(bit)S 179 x(addresses)S 178 x(between)S 178 x(the)S 179 x(\211rst)S +178 x(bit)S 179 x(of)S 177 x(successive)S 179 x(SCAN_LINEs.)S 272 x +(SCANLINE_STRIDE)S 548 y 4796 X(will)S 168 x(typica)S 2 x(lly)S 168 x +(be)S 168 x(equal)S 168 x(to)S 169 x(the)S 168 x(number)S 167 x(of)S +168 x(bits)S 168 x(\(not)S 168 x(PIXELs\))S 168 x(per)S 167 x(SCAN)S +167 x(LINE)S 168 x(stored)S 168 x(in)S 168 x(a)S 168 x(particul)S +2 x(ar)S 167 x(IMAGE_)S 548 y 4796 X(PLANE_)S 184 x(GROUP)S -56 x(.)S +185 x(IF)S 185 x(SCAN_LINE)S 184 x(align)S 2 x(ment)S 185 x +(requires)S 185 x(\211ll)S 186 x(bits)S 186 x(between)S 185 x +(SCAN_LINEs,)S 189 x(the)S 186 x(dif)S -9 x(ference)S 548 y 4796 X +(between)S 166 x(SCANLINE_STRIDE)S 167 x(and)S 166 x(the)S 167 x +(number)S 166 x(of)S 166 x(bits)S 166 x(per)S 166 x(SCAN_LINE)S 166 x +(will)S 167 x(equal)S 167 x(the)S 167 x(\211ll)S 167 x(value.)S 896 y +4796 X F80(SPECTRAL_COMPONENT)S 897 y 4796 X F78(The)S 170 x +(INTENSITY)S 169 x(dependence)S 171 x(of)S 169 x(an)S 170 x(image)S +170 x(at)S 170 x(either)S 171 x(a)S 169 x(partic)S 2 x(ular)S 170 x +(wavelength)S 171 x(or)S 169 x(averaged)S 170 x(over)S 170 x(a)S +170 x(wavelength)S 548 y 4796 X(band.)S 248 x(A)S 166 x(MUL)S -46 x +(TI_SPECTR)S 2 x(AL)S 166 x(image)S 166 x(is)S 166 x(made)S 166 x +(up)S 167 x(of)S 166 x(two)S 166 x(or)S 166 x(more)S 165 x(SPECTR)S +2 x(AL_COMPONENTS.)S 897 y 4796 X F80(SPECTRAL_COMPONENT_MAPPING)S +35879 Y 22379 X F40(TERMINOLOG)S -2 x(Y)S 449 x(5\2037)S +1 PP +EP +%%Page 8 59 +1000 BP 39600 30600 PM 0 0 XY +5138 Y 4796 X F78(The)S 159 x(correlat)S 2 x(ion)S 160 x(between)S +160 x(the)S 160 x(physical)S 160 x(image)S 160 x(data)S 160 x(and)S +159 x(the)S 160 x(various)S 160 x(SPECTRAL_C)S 2 x(OMPON)S -2 x +(ENTS)S 160 x(of)S 159 x(an)S 160 x(image.)S 896 y 4796 X F80 +(COMPONEN)S -2 x(T_SP)S -36 x(ACE_ORGA)S -2 x(NIZA)S -37 x(TION)S +897 y 4796 X(DA)S -38 x(T)S -37 x(A_PLANES_PER_PIXEL)S 897 y 4796 X +(DA)S -38 x(T)S -37 x(A_PLANE_SIGNIFICA)S -2 x(NCE)S 896 y 4796 X +(NUMBER_OF_CO)S -2 x(MPONENTS)S 897 y 4796 X F78(The)S 166 x(number)S +166 x(of)S 166 x(SPECTRAL_COMPONENT)S -34 x(s)S 165 x(in)S 167 x(a)S +166 x(MUL)S -46 x(TI_SPECTR)S 2 x(AL)S 166 x(image.)S 897 y 4796 X +F80(BITS_PER_COMPONENT)S 896 y 4796 X F78(The)S 194 x(number)S 194 x +(of)S 194 x(bits)S 195 x(used)S 194 x(for)S 193 x(each)S 195 x +(image)S 194 x(component)S 195 x(in)S 195 x(a)S 194 x(data)S 195 x +(plane.)S 305 x(The)S 195 x(sum)S 193 x(of)S 194 x(the)S 195 x +(BITS_PER_)S 548 y 4796 X(COMPONENT)S 189 x(over)S 190 x(all)S 191 x +(components)S 190 x(equals)S 191 x(the)S 190 x(BITS_PER_)S 191 x +(PIXEL)S 190 x(value.)S 298 x(In)S 190 x(that)S 191 x(some)S 189 x +(three)S 191 x(color)S 548 y 4796 X(image)S 179 x(data)S 180 x +(representati)S 2 x(ons)S 179 x(do)S 179 x(not)S 180 x(have)S 179 x +(a)S 179 x(one)S 180 x(to)S 179 x(one)S 180 x(correspondence)S 180 x +(between)S 179 x(representat)S 2 x(ion)S 179 x(component)S 548 y +4796 X(and)S 177 x(SPECTRAL_)S 2 x(COMPONENT)S -38 x(,)S 177 x +(BITS_PER_C)S 2 x(OMPON)S -2 x(ENT)S 178 x(should)S 178 x(not)S 178 x +(be)S 178 x(interpert)S 2 x(ed)S 178 x(as)S 177 x(bits)S 178 x(per)S +178 x(spec-)S 548 y 4796 X(tral)S 179 x(component.)S 275 x(In)S 179 x +(addition)S 2 x(,)S 181 x(the)S 179 x(BITS_PER)S 2 x(_COMPONENT)S +178 x(maybe)S 178 x(be)S 179 x(three)S 180 x(dif)S -9 x(ferent)S +180 x(numbers)S 178 x(\(one)S 179 x(per)S 548 y 4796 X(component\).)S +15648 Y 3600 X F28(5.2.6)S 599 x(Image)S 168 x(Data)S 166 x +(Encoding)S 16744 Y 4796 X F80(ENCOD)S -2 x(ING)S 897 y 4796 X F78 +(The)S 188 x(process)S 187 x(by)S 188 x(which)S 188 x(data)S 189 x +(is)S 187 x(mapped)S 188 x(into)S 189 x(a)S 188 x(new)S 187 x +(SYMBOL_SET)S 188 x(for)S 188 x(some)S 187 x(speci\211c)S 188 x +(purpose)S 188 x(such)S 188 x(as)S 548 y 4796 X(COMPRESSION.)S 896 y +4796 X F80(COMPRESSIO)S -2 x(N)S 897 y 4796 X F78(The)S 190 x +(process)S 189 x(by)S 190 x(which)S 190 x(an)S 190 x(image)S 190 x +(is)S 190 x(mapped)S 190 x(from)S 189 x(its)S 190 x(PCM)S 190 x +(representati)S 2 x(on)S 189 x(\(uncompressed)S 190 x(SYMBOL_)S 548 y +4796 X(SET\))S 175 x(into)S 175 x(a)S 175 x(new)S 174 x(representat)S +2 x(ion)S 175 x(\(compressed)S 174 x(SYMBOL_)S 174 x(SET\))S 176 x +(for)S 174 x(purposes)S 174 x(of)S 175 x(bandwidth)S 176 x +(reduction.)S 267 x(The)S 548 y 4796 X(applicat)S 2 x(ion)S 173 x +(of)S 173 x(COMPRESSION)S 172 x(technique)S 2 x(s)S 172 x(is)S 173 x +(a)S 173 x(function)S 174 x(of)S 173 x(the)S 173 x(IMAGE_DA)S -56 x +(T)S -40 x(A_ORGANIZA)S -57 x(TION,)S 172 x(and)S 173 x(is)S 548 y +4796 X(often)S 166 x(done)S 167 x(on)S 166 x(a)S 166 x +(SPECTRAL_COMPONENT)S 167 x(by)S 166 x(SPECTRAL_COMPONENT)S 166 x +(basis.)S 897 y 4796 X F80(COMPRESSIO)S -2 x(N_SCHEME)S 896 y 4796 X +F78(The)S 174 x(scheme)S 174 x(used)S 174 x(to)S 175 x(accomplish)S +175 x(COMPRESSION.)S 173 x(W)S -40 x(ell)S 175 x(known)S 174 x +(COMPRESSION_SCHEMES)S 174 x(include)S 175 x(run)S 548 y 4796 X +(length)S 167 x(compression,)S 165 x(lin)S 2 x(ear)S 166 x +(predictor)S 167 x(compressors,)S 165 x(and)S 166 x(transform)S 166 x +(schemes.)S 897 y 4796 X F80(COMPRESSIO)S -2 x(N_P)S -36 x +(ARAMETERS)S 896 y 4796 X F78(The)S 166 x(parameters)S 166 x +(required)S 167 x(by)S 166 x(a)S 167 x(particula)S 2 x(r)S 165 x +(COMPRESSION_SCHEME.)S 897 y 4796 X F80(DECOMPRESSIO)S -2 x(N)S 897 y +4796 X F78(The)S 166 x(process)S 166 x(by)S 166 x(which)S 167 x(an)S +166 x(image)S 166 x(is)S 167 x(returned)S 166 x(from)S 166 x(its)S +167 x(compressed)S 165 x(representat)S 2 x(ion)S 166 x(to)S 167 x +(its)S 167 x(PCM)S 166 x(representatio)S 2 x(n.)S 896 y 4796 X F80 +(DECOMPRESSIO)S -2 x(N_SCHEME)S 897 y 4796 X F78(The)S 170 x(scheme)S +169 x(used)S 169 x(to)S 170 x(accompli)S 2 x(sh)S 169 x +(DECOMPRESSION.)S 168 x(The)S 170 x(DECOMPRESSION_SCHEME)S 170 x(is)S +169 x(chosen)S 170 x(as)S 169 x(the)S 548 y 4796 X(complement)S 166 x +(of)S 166 x(the)S 167 x(COMPRESSION_SCHEME.)S 897 y 4796 X F80 +(DECOMPRESSIO)S -2 x(N_P)S -36 x(ARAMETERS)S 896 y 4796 X F78(The)S +166 x(parameters)S 166 x(required)S 167 x(by)S 166 x(a)S 167 x +(particula)S 2 x(r)S 165 x(DECOMPRESSION_SCHEME.)S 897 y 4796 X F80 +(ENCOD)S -2 x(ING_FIDELITY)S 35879 Y 3600 X F40(5\2038)S 449 x +(TERMINOLOGY)S +1 PP +EP +%%Page 9 60 +1000 BP 39600 30600 PM 0 0 XY +5138 Y 4796 X F78(The)S 176 x(degree)S 177 x(of)S 176 x(similari)S +2 x(ty)S 176 x(between)S 177 x(an)S 177 x(original)S 178 x +(uncompressed)S 176 x(image,)S 179 x(and)S 176 x(one)S 177 x(which)S +176 x(has)S 176 x(been)S 177 x(compressed,)S 548 y 4796 X(then)S +184 x(decompressed.)S 284 x(COMPRESSION_SCHEME)S 184 x +(DECOMPRESSION_SCHEME)S 184 x(pairs)S 184 x(which)S 184 x(result)S +185 x(in)S 548 y 4796 X(absolute)S 175 x(ENCODING_FIDELITY)S 174 x +(are)S 174 x(known)S 174 x(as)S 175 x(lossless,)S 176 x(while)S 175 x +(those)S 175 x(which)S 175 x(have)S 175 x(reduced)S 175 x(FIDELITY)S +175 x(are)S 548 y 4796 X(known)S 165 x(as)S 166 x(lossey)S -32 x(.)S +249 x(ENCODING_FID)S -2 x(ELITY)S 167 x(is)S 166 x(measured)S 166 x +(with)S 167 x(a)S 166 x(mathematical)S 168 x(metric.)S 896 y 4796 X +F80(SYMBOL_SET)S 897 y 4796 X F78(The)S 176 x(atomic)S 177 x +(elements)S 176 x(which)S 176 x(from)S 176 x(which)S 176 x(an)S 176 x +(image)S 176 x(is)S 176 x(composed.)S 268 x(There)S 177 x(is)S 176 x +(no)S 176 x(uniques)S 176 x(SYMBOL_SET)S 176 x(for)S 548 y 4796 X +(an)S 175 x(image.)S 268 x(Usually)S -31 x(,)S 177 x(the)S 176 x +(de\211nit)S 2 x(ion)S 176 x(of)S 175 x(the)S 176 x(SYMBOL_SET)S +176 x(is)S 176 x(based)S 176 x(upon)S 176 x(the)S 176 x(compression)S +176 x(scheme.)S 267 x(T)S -34 x(ypical)S 548 y 4796 X(symbol)S 166 x +(primiti)S 2 x(ves)S 166 x(inclu)S 2 x(de)S 166 x(bits,)S 168 x +(bytes,)S 166 x(and)S 167 x(the)S 168 x(entire)S 168 x(image)S 167 x +(as)S 166 x(a)S 167 x(state)S 168 x(space.)S 250 x(The)S 167 x +(number)S 167 x(of)S 166 x(unique)S 168 x(symbols)S 548 y 4796 X +(which)S 158 x(these)S 158 x(primitiv)S 2 x(es)S 157 x(can)S 158 x +(represent)S 159 x(\(i.e.)S 248 x(the)S 159 x(SYMBOL_SET\),)S 157 x +(and)S 158 x(the)S 159 x(number)S 157 x(of)S 158 x(symbols)S 158 x +(used)S 157 x(to)S 159 x(compose)S 548 y 4796 X(an)S 166 x(image)S +166 x(both)S 167 x(depend)S 167 x(upon)S 166 x(the)S 167 x(choice)S +167 x(of)S 166 x(symbol)S 166 x(primitives.)S 12261 Y 3600 X F28 +(5.2.7)S 599 x(Image)S 168 x(Data)S 166 x(Presentation)S 13357 Y +4796 X F80(RENDI)S -2 x(TION)S 897 y 4796 X F78(The)S 170 x(process)S +169 x(by)S 170 x(which)S 170 x(an)S 169 x(image)S 170 x(object)S +171 x(is)S 170 x(made)S 170 x(suitable)S 171 x(for)S 169 x(display)S +-31 x(.)S 256 x(It)S 169 x(invol)S 2 x(ves)S 169 x(convertin)S 2 x +(g)S 169 x(an)S 170 x(image)S 170 x(into)S 170 x(a)S 547 y 4796 X +(format)S 166 x(that)S 167 x(the)S 167 x(display)S 167 x(hardware)S +166 x(recognizes.)S 897 y 4796 X F80(RENDI)S -2 x(TION_FIDELITY)S +897 y 4796 X F78(The)S 167 x(degree)S 168 x(to)S 167 x(which)S 168 x +(the)S 168 x(display)S 168 x(subsystem)S 167 x(can)S 167 x(render)S +167 x(an)S 168 x(image)S 167 x(belongi)S 2 x(ng)S 167 x(to)S 167 x +(a)S 168 x(particul)S 2 x(ar)S 167 x(IMAGE_CLASS.)S 548 y 4796 X +(RENDITION_FID)S -2 x(ELITY)S 191 x(is)S 191 x(a)S 190 x(functi)S +2 x(on)S 190 x(of)S 190 x(the)S 191 x(similari)S 2 x(ty)S 190 x +(between)S 192 x(display)S 191 x(hardware)S 190 x(\(display)S 192 x +(memory)S 548 y 4796 X(or)S -10 x(ganiza)S 2 x(tion\),)S 166 x(and)S +166 x(IMAGE_CLASS.)S 896 y 4796 X F80(DISPLA)S -47 x(Y)S 897 y 4796 X +F78(The)S 167 x(physical)S 168 x(hardware)S 168 x(\(video)S 167 x +(logic)S 169 x(and)S 167 x(tube\))S 168 x(which)S 167 x(allows)S +168 x(a)S 167 x(user)S 167 x(to)S 167 x(view)S 168 x(an)S 167 x +(image.)S 251 x(The)S 168 x(process)S 167 x(of)S 167 x(taking)S 548 y +4796 X(an)S 166 x(image)S 166 x(which)S 167 x(has)S 166 x(been)S +166 x(rendered)S 167 x(displayabl)S 2 x(e)S 166 x(and)S 166 x(putti)S +2 x(ng)S 166 x(it)S 167 x(on)S 166 x(the)S 167 x(screen)S 166 x +(\(making)S 166 x(it)S 167 x(viewable\).)S 897 y 4796 X F80(PRESENT)S +-37 x(A)S -37 x(TION_A)S -38 x(TTRIBUTES)S 896 y 4796 X F78(The)S +186 x(attribut)S 2 x(es)S 185 x(of)S 186 x(an)S 186 x(IMAGE_OBJECT)S +186 x(that)S 186 x(de\211ne)S 186 x(how)S 186 x(it)S 186 x(should)S +186 x(be)S 186 x(displaye)S 2 x(d)S 185 x(for)S 186 x(viewing.)S +289 x(These)S 186 x(at-)S 548 y 4796 X(tributes)S 169 x(determine)S +170 x(the)S 169 x(particul)S 2 x(ars)S 168 x(of)S 168 x(the)S 170 x +(RENDITION)S 167 x(process.)S 254 x(Note)S 169 x(that)S 169 x +(unlike)S 170 x(DA)S -56 x(T)S -39 x(A_ORGA)S -2 x(NIZA)S -55 x +(TION_)S 548 y 4796 X(A)S -56 x(TTRIBUTES,)S 171 x(PRESENT)S -39 x +(A)S -56 x(TION_A)S -56 x(TTRIBUTES)S 171 x(are)S 170 x(not)S 170 x +(essential)S 172 x(for)S 169 x(interpert)S 2 x(ing)S 170 x(the)S +170 x(IMAGE_DA)S -56 x(T)S -40 x(A,)S 169 x(but)S 548 y 4796 X(are)S +166 x(essential)S 167 x(for)S 166 x(displayi)S 2 x(ng)S 166 x(it.)S +897 y 4796 X F80(PIXEL_P)S -37 x(A)S -37 x(TH)S 896 y 4796 X F78 +(The)S 167 x(directi)S 2 x(on)S 167 x(of)S 167 x(the)S 167 x(PIXEL)S +168 x(capture)S 167 x(path)S 168 x(along)S 168 x(an)S 167 x(indivi)S +2 x(dual)S 167 x(SCAN)S 167 x(LINE.)S 167 x(PIXEL_P)S -46 x(A)S -56 x +(TH)S 167 x(is)S 168 x(de\211ned)S 167 x(against)S 548 y 4796 X(the)S +170 x(ISO)S 169 x(and)S 170 x(CCITT)S 171 x(standards,)S 170 x(and)S +170 x(establi)S 2 x(shes)S 169 x(the)S 170 x(angle)S 171 x(of)S 169 x +(a)S 170 x(SCAN_LINE)S 170 x(with)S 170 x(relatio)S 2 x(nship)S 170 x +(to)S 170 x(a)S 170 x(reference)S 548 y 4796 X(coordinate)S 167 x +(system.)S 897 y 4796 X F80(LINE_PROGR)S -2 x(ESSION)S 896 y 4796 X +F78(The)S 175 x(directi)S 2 x(on)S 174 x(of)S 175 x(SCAN_LINE)S 174 x +(capture)S 176 x(across)S 175 x(the)S 175 x(image)S 175 x(plane.)S +267 x(LINE_PROGRESSION)S 174 x(is)S 175 x(de\211ned)S 175 x(against)S +548 y 4796 X(the)S 168 x(ISO)S 168 x(and)S 168 x(CCITT)S 170 x +(standards,)S 168 x(and)S 169 x(establishes)S 169 x(the)S 169 x +(angle)S 169 x(of)S 168 x(a)S 168 x(normal)S 169 x(to)S 168 x(a)S +168 x(SCAN_LINE)S 168 x(with)S 169 x(relati)S 2 x(onship)S 168 x(to)S +548 y 4796 X(a)S 166 x(reference)S 166 x(coordinat)S 2 x(e)S 166 x +(system.)S 897 y 4796 X F80(PIXEL_ASPECT_RA)S -37 x(TIO)S 897 y +4796 X F78(The)S 199 x(ratio)S 200 x(of)S 200 x(the)S 199 x(distanc)S +2 x(e)S 199 x(between)S 200 x(PIXEL)S 199 x(centers)S 200 x(along)S +200 x(the)S 200 x(PIXEL_P)S -46 x(A)S -56 x(TH,)S 199 x(and)S 200 x +(along)S 200 x(the)S 199 x(LINE_)S 548 y 4796 X(PROGRESSION)S 165 x +(on)S 166 x(the)S 167 x(SAMPLING_G)S -2 x(RID)S 166 x(and/or)S 167 x +(DISPLA)S -46 x(Y_GRID.)S 896 y 4796 X F80(BRIGH)S -2 x +(TNESS_POLARITY)S 897 y 4796 X F78(The)S 169 x(directio)S 2 x(n)S +168 x(of)S 169 x(the)S 169 x(mapping)S 169 x(from)S 168 x(PIXEL)S +169 x(magnitude)S 170 x(to)S 169 x(visual)S 170 x(brightness.)S 255 x +(\(i.e.,)S 168 x(whether)S 169 x(a)S 169 x(PIXEL)S 169 x(value)S +169 x(of)S 548 y 4796 X(0)S 166 x(is)S 166 x(displayed)S 167 x(as)S +166 x(light)S 168 x(or)S 166 x(dark\))S 35879 Y 22379 X F40 +(TERMINOLOG)S -2 x(Y)S 449 x(5\2039)S +1 PP +EP +%%Page 10 61 +1000 BP 39600 30600 PM 0 0 XY +5131 Y 4796 X F80(GRI)S -2 x(D_TYPE)S 897 y 4796 X F78(The)S 166 x +(physical)S 167 x(format)S 166 x(of)S 166 x(of)S 166 x(the)S 167 x +(regular)S 167 x(PIXEL)S 166 x(sampling)S 167 x(grid.)S 896 y 4796 X +F80(TIMING_U)S -2 x(NIT)S 897 y 4796 X F78(The)S 166 x(number)S 166 x +(of)S 166 x(atomic)S 167 x(units)S 167 x(of)S 166 x(time)S 166 x +(between)S 167 x(display)S 167 x(of)S 166 x(IMAGE_OBJECTS)S 166 x +(in)S 167 x(a)S 166 x(time)S 167 x(sequence.)S 9315 Y 3600 X F28 +(5.2.8)S 599 x(Image)S 168 x(Server)S 166 x(Hardware)S 10411 Y 4796 X +F80(SER)S -18 x(VER_HAR)S -2 x(DW)S -55 x(ARE)S 897 y 4796 X F78 +(The)S 191 x(equipment)S 191 x(which)S 191 x(constitut)S 2 x(es)S +190 x(the)S 191 x(computer)S 191 x(system)S 191 x(on)S 190 x(which)S +191 x(the)S 191 x(XIEP)S 190 x(server)S 191 x(software)S 190 x +(executes)S 548 y 4796 X(including)S 167 x(server)S 166 x +(HOST_PROCESSOR,)S 166 x(HOST_MEMOR)S -28 x(Y)S -64 x(,)S 165 x +(HOST_BUS,)S 165 x(and)S 167 x(DISPLA)S -47 x(Y_SUBSYSTEM.)S 896 y +4796 X F80(DISPLA)S -47 x(Y_SUBSYSTEM)S 897 y 4796 X F78(The)S 191 x +(colle)S 2 x(ction)S 192 x(of)S 191 x(DISPLA)S -46 x(Y_MEMOR)S -28 x +(Y)S -64 x(,)S 190 x(DISPLA)S -46 x(Y_PROCESSOR\(s\),)S 196 x(and)S +192 x(video)S 192 x(logic)S 192 x(used)S 192 x(to)S 191 x(drive)S +548 y 4796 X(a)S 194 x(DISPLA)S -46 x(Y_MON)S -2 x(IT)S -8 x(OR.)S +193 x(There)S 195 x(is)S 195 x(an)S 194 x(expli)S 2 x(cit)S 195 x +(communications)S 195 x(connect)S 2 x(ion)S 195 x(between)S 195 x +(the)S 195 x(DISPLA)S -47 x(Y_)S 548 y 4796 X(SUBSYSTEM,)S 165 x +(and)S 166 x(the)S 167 x(HOST_PROCESSOR)S 166 x(through)S 167 x +(serial)S 167 x(or)S 166 x(parrallel)S 168 x(lines,)S 166 x(or)S +166 x(a)S 166 x(backpla)S 2 x(ne)S 166 x(or)S 166 x(bus.)S 897 y +4796 X F80(DISPLA)S -47 x(Y_MEMOR)S -17 x(Y)S 896 y 4796 X F78(The)S +184 x(memory)S 184 x(in)S 185 x(which)S 184 x(the)S 185 x(states)S +185 x(of)S 185 x(the)S 185 x(screen)S 184 x(pixels)S 185 x(are)S +185 x(kept)S 185 x(and)S 185 x(from)S 183 x(which)S 185 x(these)S +185 x(screen)S 184 x(pixel)S 2 x(s)S 184 x(are)S 548 y 4796 X +(refreshed.)S 248 x(DISPLA)S -46 x(Y_MEMOR)S -28 x(Y)S 166 x(is)S +166 x(often)S 167 x(referred)S 166 x(to)S 166 x(as)S 166 x(the)S +167 x(bit)S 167 x(map.)S 897 y 4796 X F80(DISPLA)S -47 x +(Y_PROCESSOR)S 896 y 4796 X F78(Any)S 165 x(general)S 168 x(or)S +166 x(special)S 167 x(purpose)S 166 x(processor)S 166 x(dedica)S +2 x(ted)S 166 x(to)S 167 x(display)S 167 x(processing)S 167 x(and)S +167 x(usually)S 167 x(closely)S 167 x(coupled)S 167 x(to)S 167 x +(the)S 548 y 4796 X(DISPLA)S -47 x(Y_MEMOR)S -28 x(Y)S -64 x(.)S +897 y 4796 X F80(DISPLA)S -47 x(Y_MONIT)S -9 x(OR)S 897 y 4796 X F78 +(The)S 166 x(tube)S 167 x(or)S 166 x(bottle)S 168 x(\(screen\))S +166 x(upon)S 166 x(which)S 166 x(a)S 167 x(viewer)S 166 x(sees)S +166 x(an)S 166 x(image.)S 896 y 4796 X F80(DISPLA)S -47 x(Y_BUS)S +897 y 4796 X F78(The)S 173 x(interconne)S 2 x(ct)S 173 x(between)S +174 x(DISPLA)S -47 x(Y_PROCESSOR\(s\),)S 174 x(and)S 173 x(DISPLA)S +-46 x(Y_MEMOR)S -28 x(Y)S -65 x(.)S 173 x(\(often,)S 175 x(this)S +173 x(is)S 173 x(a)S 173 x(private)S 548 y 4796 X(interconnect)S +2 x(\).)S 897 y 4796 X F80(LOOK)S -2 x(_UP_T)S -36 x(ABLE)S 896 y +4796 X F78(A)S 166 x(table)S 167 x(mechanism)S 167 x(by)S 166 x +(which)S 167 x(an)S 166 x(input)S 168 x(index)S 167 x(\(stored)S +167 x(as)S 166 x(a)S 167 x(value)S 167 x(in)S 167 x(the)S 167 x +(DISPLA)S -46 x(Y_MEMOR)S -28 x(Y\))S 166 x(is)S 166 x(used)S 167 x +(to)S 167 x(\211nd)S 548 y 4796 X(the)S 166 x(inten)S 2 x(sity)S +166 x(to)S 167 x(be)S 166 x(output)S 167 x(on)S 167 x(the)S 166 x +(various)S 167 x(channels)S 167 x(\(guns\))S 166 x(of)S 166 x(the)S +166 x(DISPLA)S -46 x(Y_MONIT)S -10 x(OR.)S 897 y 4796 X F80 +(HOST_PRO)S -2 x(CESSOR)S 896 y 4796 X F78(The)S 187 x(cpu)S 187 x +(on)S 187 x(which)S 188 x(the)S 187 x(X)S 187 x(server)S 187 x +(executes.)S 291 x(The)S 188 x(X)S 186 x(server)S 187 x(may)S 187 x +(access)S 187 x(other)S 188 x(general)S 188 x(or)S 187 x(special)S +188 x(purpose)S 548 y 4796 X(processors)S 165 x(which)S 167 x(are)S +166 x(closely)S 167 x(associated)S 167 x(with)S 167 x(the)S 167 x +(display)S 167 x(subsystem)S 166 x(in)S 166 x(order)S 166 x(to)S +167 x(accomplish)S 167 x(its)S 167 x(job.)S 897 y 4796 X F80 +(HOST_MEMOR)S -19 x(Y)S 897 y 4796 X F78(The)S 182 x(memory)S 181 x +(used)S 182 x(by)S 182 x(the)S 183 x(HOST_PROCESSOR)S 182 x(to)S +182 x(run)S 182 x(the)S 183 x(X)S 181 x(server)S -27 x(.)S 280 x +(This)S 183 x(memory)S 181 x(may)S 182 x(or)S 181 x(may)S 182 x(not)S +183 x(be)S 548 y 4796 X(directly)S 167 x(accessibl)S 2 x(e)S 166 x +(by)S 166 x(the)S 167 x(display)S 167 x(subsystem)S 166 x(and)S 166 x +(is)S 166 x(usually)S 167 x(not)S 167 x(the)S 167 x(same)S 165 x(as)S +166 x(the)S 167 x(DISPLA)S -46 x(Y_MEMOR)S -28 x(Y)S -65 x(.)S 896 y +4796 X F80(HOST_BUS)S 897 y 4796 X F78(The)S 171 x(interconnect)S +172 x(between)S 172 x(HOST_PROCESSOR\(s\))S 170 x(and)S 171 x +(HOST_MEMOR)S -28 x(Y)S -65 x(.)S 170 x(\(often,)S 172 x(this)S 171 x +(is)S 171 x(an)S 171 x(open)S 171 x(intercon-)S 548 y 4796 X +(nect\).)S 896 y 4796 X F80(FRAME_GRABBER)S 35879 Y 3600 X F40 +(5\20310)S 449 x(TERMINOLOGY)S +1 PP +EP +%%Page 11 62 +1000 BP 39600 30600 PM 0 0 XY +5138 Y 4796 X F78(A)S 158 x(device)S 160 x(which)S 159 x(samples)S +158 x(and)S 159 x(digit)S 2 x(izes)S 159 x(an)S 159 x(image)S 159 x +(or)S 159 x(an)S 159 x(analog)S 159 x(representat)S 2 x(ion)S 159 x +(of)S 158 x(an)S 159 x(image.)S 249 x(T)S -34 x(ypicall)S 2 x(y)S +-33 x(,)S 160 x(the)S 159 x(term)S 548 y 4796 X(FRAME)S 168 x +(implies)S 169 x(a)S 168 x(broadcast)S 169 x(tele)S 2 x(vision)S +169 x(video)S 169 x(standard)S 168 x(concept)S 170 x(\(RS170)S 168 x +(-)S 168 x(30)S 169 x(frames)S 167 x(per)S 168 x(second)S 169 x +(refresh\).)S 252 x(As)S 548 y 4796 X(such,)S 165 x(FRAME_GRABBERs)S +167 x(are)S 166 x(typical)S 2 x(ly)S 166 x(device)S 2 x(s)S 165 x +(which)S 167 x(digiti)S 2 x(ze)S 166 x(RS170)S 167 x(standard)S 166 x +(analog)S 167 x(baseband)S 167 x(video.)S 896 y 4796 X F80 +(FRAME_BUFFER)S 897 y 4796 X F78(The)S 177 x(memory)S 177 x(into)S +179 x(which)S 177 x(a)S 178 x(FRAME_GRABBER)S 178 x(deposits)S 178 x +(the)S 178 x(image)S 178 x(signal)S 178 x(it)S 179 x(digiti)S 2 x +(zes.)S 271 x(\(often,)S 180 x(thi)S 2 x(s)S 177 x(is)S 177 x(the)S +548 y 4796 X(DISPLA)S -47 x(Y_MEMOR)S -28 x(Y\).)S 896 y 4796 X F80 +(TIGHTL)S -47 x(Y_COUPLED)S 897 y 4796 X F78(Used)S 176 x(in)S 177 x +(this)S 178 x(document)S 177 x(to)S 177 x(refer)S 177 x(to)S 177 x +(the)S 178 x(connectio)S 2 x(n)S 176 x(between)S 178 x(image)S 177 x +(capture)S 178 x(devices)S 177 x(such)S 177 x(as)S 177 x(frame)S +176 x(grabbers)S 548 y 4796 X(and)S 176 x(scanners,)S 178 x(and)S +177 x(the)S 177 x(DISPLA)S -47 x(Y_MEMOR)S -27 x(Y)S -65 x(.)S 176 x +(A)S 176 x(capture)S 177 x(device)S 177 x(which)S 177 x(deposits)S +177 x(an)S 176 x(image)S 177 x(directl)S 2 x(y)S 176 x(into)S 177 x +(the)S 548 y 4796 X(DISPLA)S -47 x(Y_MEMOR)S -28 x(Y)S 170 x +(without)S 171 x(passing)S 170 x(through)S 170 x(applic)S 2 x +(ations)S 170 x(buf)S -9 x(fers)S 170 x(\(HOST_MEMOR)S -28 x(Y\))S +169 x(will)S 171 x(be)S 170 x(referred)S 170 x(to)S 548 y 4796 X(as)S +165 x(TIGHTL)S -49 x(Y_COUPLED.)S 13506 Y 3600 X F28(5.2.9)S 599 x +(Image)S 168 x(Data)S 166 x(Layout)S 14602 Y 4796 X F80(TILING)S +897 y 4796 X F78(A)S 169 x(screen)S 170 x(layout)S 172 x(where)S +170 x(adjacent)S 171 x(rectangul)S 2 x(ar)S 170 x(images)S 170 x +(adjoin)S 172 x(each)S 170 x(other)S 171 x(seamlessly)S 170 x(and)S +170 x(with)S 171 x(no)S 170 x(overlap.)S 258 x(The)S 548 y 4796 X +(adjacent)S 167 x(images)S 167 x(represent)S 166 x(parts)S 167 x(of)S +166 x(a)S 166 x(lar)S -9 x(ger)S 167 x(common)S 165 x(scene.)S 896 y +4796 X F80(N_UP)S 897 y 4796 X F78(A)S 165 x(screen)S 166 x(layout)S +168 x(where)S 166 x(two)S 166 x(or)S 166 x(more)S 166 x(dif)S -9 x +(ferent)S 167 x(images)S 166 x(are)S 166 x(viewed)S 167 x(adjacent)S +168 x(to)S 166 x(each)S 167 x(other)S 167 x(at)S 166 x(the)S 167 x +(same)S 166 x(time.)S 897 y 4796 X F80(OVERLA)S -47 x(Y)S 896 y +4796 X F78(A)S 207 x(screen)S 208 x(layout)S 209 x(where)S 208 x +(two)S 207 x(or)S 208 x(more)S 207 x(images)S 208 x(are)S 208 x +(layed)S 209 x(out)S 208 x(on)S 208 x(top)S 209 x(of)S 207 x(each)S +209 x(other)S 208 x(in)S 208 x(SP)S -46 x(A)S -55 x(TIAL_)S 548 y +4796 X(REGISTRA)S -55 x(TION)S 167 x(to)S 168 x(observe)S 168 x(dif)S +-9 x(ferences.)S 253 x(The)S 168 x(images)S 168 x(usually)S 169 x +(represent)S 168 x(the)S 168 x(same)S 168 x(scene)S 168 x(at)S 168 x +(dif)S -8 x(ferent)S 168 x(times)S 168 x(or)S 548 y 4796 X(states.)S +897 y 4796 X F80(SP)S -37 x(A)S -37 x(TIAL_REGISTRA)S -38 x(TION)S +897 y 4796 X F78(The)S 160 x(state)S 160 x(in)S 160 x(which)S 160 x +(all)S 161 x(common)S 159 x(points)S 160 x(in)S 160 x(two)S 160 x +(images)S 160 x(of)S 159 x(the)S 161 x(same)S 159 x(scene)S 160 x +(would)S 160 x(be)S 159 x(found)S 160 x(at)S 160 x(the)S 160 x(same)S +160 x(PIXELs)S 547 y 4796 X(if)S 166 x(displayed)S 167 x(in)S 167 x +(an)S 166 x(OVERLA)S -46 x(Y)S 166 x(fashion.)S 897 y 4796 X F80 +(TIME_SEQUENCE)S 897 y 4796 X F78(The)S 166 x(display)S 167 x(of)S +166 x(indivi)S 2 x(dual)S 167 x(images)S 166 x(of)S 166 x(the)S 167 x +(same)S 165 x(sceen)S 167 x(taken)S 167 x(at)S 166 x(uniformly)S +167 x(spaced)S 166 x(time)S 167 x(interval)S 2 x(s.)S 26358 Y 3600 X +F28(5.2.10)S 600 x(Three)S 166 x(Space)S 167 x(Color)S 27454 Y 4796 X +F80(SPECTRAL_SP)S -37 x(ACE)S 897 y 4796 X F78(A)S 177 x +(metri\211ed)S 178 x(way)S 178 x(by)S 178 x(which)S 178 x(to)S 178 x +(describe)S 178 x(locat)S 2 x(ions)S 178 x(in)S 178 x(the)S 178 x +(space)S 178 x(of)S 178 x(human)S 177 x(color)S 179 x(perception)S +179 x(and)S 178 x(relate)S 179 x(these)S 548 y 4796 X(back)S 166 x +(to)S 167 x(physical)S 167 x(principl)S 2 x(es)S 166 x(\(wavelength)S +167 x(and)S 166 x(intensi)S 2 x(ty\).)S 896 y 4796 X F80(RED_GR)S +-2 x(EEN_BLUE)S 167 x(or)S 166 x(RGB)S 897 y 4796 X F78(A)S 176 x +(color)S 177 x(three)S 178 x(space)S 177 x(widely)S 178 x(used)S +177 x(in)S 177 x(the)S 178 x(computer)S 177 x(industry)S -32 x(.)S +270 x(The)S 178 x(information)S 178 x(in)S 177 x(each)S 178 x(of)S +176 x(the)S 178 x(SPECTRAL_)S 548 y 4796 X(COMPONENTS)S 168 x(\(red)S +169 x(green)S 170 x(blue\))S 170 x(represents)S 170 x(the)S 170 x +(luminance)S 170 x(integrat)S 2 x(ed)S 169 x(over)S 170 x(some)S +169 x(wavelength)S 170 x(band)S 170 x(centered)S 548 y 4796 X +(around)S 166 x(that)S 167 x(color)S -27 x(.)S 896 y 4796 X F80(CMY)S +548 y 15397 X F78(TBS)S 35879 Y 22154 X F40(TERMINOLOGY)S 447 x +(5\2031)S -24 x(1)S +1 PP +EP +%%Page 12 63 +1000 BP 39600 30600 PM 0 0 XY +5131 Y 4796 X F80(YUV)S 548 y 15397 X F78(TBS)S 897 y 4796 X F80 +(HSV)S 548 y 15397 X F78(TBS)S 896 y 4796 X F80(HLS)S 548 y 15397 X +F78(TBS)S 897 y 4796 X F80(YIQ)S 548 y 15397 X F78(TBS)S 11507 Y +3600 X F28(5.2.1)S -31 x(1)S 598 x(Image)S 167 x(Data)S 167 x +(Processing)S 12603 Y 4796 X F80(IMAGE_PROC)S -2 x(ESSING)S 897 y +4796 X F78(The)S 166 x(process)S 166 x(of)S 166 x(applying)S 168 x +(an)S 166 x(IMAGE_OPERA)S -56 x(T)S -9 x(OR)S 166 x(to)S 167 x(an)S +166 x(IMAGE_DA)S -57 x(T)S -39 x(A)S 166 x(operand)S 166 x(or)S 166 x +(operands.)S 896 y 4796 X F80(TRANSFOR)S -2 x(M)S 897 y 4796 X F78 +(T)S -35 x(o)S 166 x(modify)S 166 x(IMAGE_DA)S -56 x(T)S -40 x(A)S +166 x(via)S 167 x(the)S 166 x(appli)S 2 x(cation)S 167 x(of)S 166 x +(an)S 166 x(IMAGE_OPERA)S -56 x(T)S -8 x(OR.)S 897 y 4796 X F80 +(REST)S -9 x(ORA)S -38 x(TION_PROC)S -2 x(ESSING)S 896 y 4796 X F78 +(IMAGE_PROCESSING)S 165 x(whose)S 167 x(purpose)S 167 x(is)S 167 x +(to)S 168 x(remove)S 166 x(well)S 168 x(understood)S 168 x +(distorati)S 2 x(ons)S 166 x(generate)S 2 x(d)S 167 x(by)S 167 x +(the)S 167 x(imaging)S 548 y 4796 X(system)S 165 x(or)S 166 x +(condit)S 2 x(ions.)S 897 y 4796 X F80(ENHAN)S -2 x +(CEMENT_PROCESSING)S 896 y 4796 X F78(IMAGE_PROCESSING)S 177 x +(whose)S 179 x(purpose)S 179 x(is)S 179 x(to)S 179 x(increase)S 180 x +(the)S 180 x(subjective)S 180 x(quali)S 2 x(ty)S 179 x(of)S 179 x +(an)S 179 x(image)S 179 x(thus)S 179 x(making)S 180 x(it)S 548 y +4796 X(easier)S 166 x(to)S 167 x(view)S -32 x(.)S 897 y 4796 X F80 +(ANA)S -2 x(L)S -45 x(YSIS_PROCESSI)S -2 x(NG)S 897 y 4796 X F78 +(IMAGE_PROCESSING)S 165 x(whose)S 165 x(purpose)S 166 x(is)S 167 x +(interpret)S 167 x(the)S 167 x(semantics)S 167 x(or)S 166 x(content)S +167 x(and)S 167 x(meaning)S 166 x(of)S 166 x(an)S 166 x(image.)S +896 y 4796 X F80(COD)S -2 x(ING_PROCESSIN)S -2 x(G)S 897 y 4796 X +F78(IMAGE_PROCESSING)S 174 x(whose)S 176 x(purpose)S 175 x(is)S 176 x +(to)S 176 x(remap)S 176 x(images)S 176 x(between)S 176 x(alterna)S +2 x(tive)S 176 x(representat)S 2 x(ions)S 176 x(primarily)S 548 y +4796 X(for)S 165 x(purposes)S 166 x(of)S 166 x(compression.)S 896 y +4796 X F80(ITERA)S -38 x(TIVE_PROCESSING)S 897 y 4796 X F78 +(IMAGE_PROCESSING)S 159 x(where)S 160 x(the)S 161 x(output)S 161 x +(of)S 161 x(an)S 160 x(IMAGE_PROCESSING)S 159 x(operati)S 2 x(on)S +160 x(is)S 161 x(fed)S 160 x(back)S 161 x(into)S 161 x(the)S 161 x +(same)S 548 y 4796 X(operator)S 166 x(\(i.e.)S 249 x(the)S 167 x +(same)S 165 x(operator)S 167 x(is)S 166 x(appli)S 2 x(ed)S 166 x +(over)S 166 x(and)S 167 x(over)S 166 x(again)S 167 x(to)S 166 x(the)S +167 x(image\).)S 897 y 4796 X F80(PIPELINE_PROCESSING)S 896 y 4796 X +F78(IMAGE_PROCESSING)S 183 x(where)S 185 x(the)S 186 x(output)S 186 x +(of)S 185 x(an)S 185 x(IMAGE_PROCESSING)S 183 x(operati)S 2 x(on)S +185 x(is)S 185 x(fed)S 185 x(into)S 186 x(another)S 548 y 4796 X +(operator)S 166 x(\(i.e.)S 249 x(the)S 167 x(image)S 166 x(is)S 166 x +(fed)S 167 x(through)S 166 x(a)S 167 x(serial)S 166 x(stream)S 167 x +(of)S 166 x(operators\).)S 35879 Y 3600 X F40(5\20312)S 449 x +(TERMINOLOGY)S +1 PP +EP +%%Page 1 64 +1000 BP 39600 30600 PM 0 0 XY +8985 Y 3600 X F24(Appendix)S 497 x(A)S 10629 Y 3600 X(RELA)S -52 x +(TED)S 165 x(T)S -12 x(OPICS)S 13335 Y 4796 X F78(This)S 172 x +(appendix)S 172 x(describes)S 172 x(some)S 171 x(background)S 172 x +(material)S 172 x(on)S 172 x(topics)S 172 x(which)S 172 x(are)S 172 x +(not)S 171 x(central)S 173 x(to)S 172 x(the)S 172 x(image)S 172 x +(extension)S 548 y 4796 X(package)S 166 x(but)S 167 x(are)S 166 x +(closely)S 168 x(associated.)S 15527 Y 3600 X F28(A.1)S 598 x(Image)S +167 x(Data)S 167 x(Interchang)S 2 x(e)S 16772 Y 4796 X F78(Image)S +177 x(data)S 179 x(formats)S 177 x(are)S 178 x(a)S 178 x(topic)S +179 x(of)S 178 x(much)S 178 x(interest)S 179 x(latel)S 2 x(y)S -33 x +(.)S 272 x(These)S 179 x(formats)S 177 x(are)S 178 x(instance)S 2 x +(s)S 177 x(of)S 178 x(image)S 178 x(data)S 179 x(inter-)S 548 y +4796 X(change)S 173 x(protocol)S 2 x(s.)S 262 x(In)S 173 x(the)S +174 x(X)S 172 x(environment,)S 176 x(there)S 174 x(are)S 173 x +(three)S 174 x(locati)S 2 x(ons)S 173 x(where)S 173 x(such)S 173 x +(protocols)S 174 x(exist:)S 264 x(appli)S 2 x(cation)S 548 y 4796 X +(client)S 182 x(to)S 181 x(applic)S 2 x(ation)S 181 x(cli)S 2 x(ent)S +181 x(direct)S 182 x(\(IP1\),)S 183 x(appli)S 2 x(cation)S 182 x +(client)S 182 x(to/from)S 181 x(server)S 181 x(\(IP2\),)S 183 x(and)S +181 x(applic)S 2 x(ation)S 181 x(cli)S 2 x(ent)S 181 x(to)S 548 y +4796 X(applicat)S 2 x(ion)S 166 x(clie)S 2 x(nt)S 166 x(by)S 166 x +(way)S 166 x(of)S 166 x(a)S 166 x(shared)S 167 x(server)S 165 x +(\(IP3\))S 166 x(\(see)S 166 x(\211g.)S 249 x(A-1\).)S 897 y 4796 X +(The)S 178 x(inte)S 2 x(rchange)S 179 x(of)S 178 x(image)S 179 x +(data)S 179 x(between)S 179 x(the)S 179 x(applicat)S 2 x(ion)S 179 x +(client)S 180 x(and)S 179 x(server)S 178 x(remains)S 178 x(withi)S +2 x(n)S 178 x(the)S 179 x(applica)S 2 x(tion,)S 548 y 4796 X(yet)S +178 x(spans)S 177 x(the)S 179 x(X)S 177 x(wire)S 178 x(boundary)S +-32 x(.)S 272 x(Protocols)S 178 x(for)S 177 x(the)S 179 x +(interchange)S 179 x(of)S 178 x(image)S 178 x(data)S 178 x(across)S +178 x(the)S 178 x(X)S 177 x(wire)S 178 x(\(IP2\))S 177 x(are)S 548 y +4796 X(considered)S 167 x(to)S 167 x(be)S 167 x(part)S 168 x(of)S +166 x(the)S 168 x(X)S 166 x(extension)S 168 x(package)S 167 x(\(in)S +168 x(fact,)S 167 x(IP2)S 166 x(is)S 167 x(XIEP)S 167 x(the)S 167 x +(X)S 166 x(image)S 167 x(extensi)S 2 x(on)S 166 x(protocol)S 2 x(\))S +166 x(and)S 548 y 4796 X(must)S 169 x(comply)S 170 x(with)S 171 x +(the)S 170 x(X)S 170 x(core)S 170 x(protocol.)S 257 x(Of)S 170 x +(necessity)S -32 x(,)S 171 x(the)S 170 x(extension)S 171 x(proposal)S +171 x(also)S 170 x(addresses)S 169 x(IP3)S 170 x(\(sharing)S 170 x +(of)S 548 y 4796 X(server)S 165 x(resources\).)S 22915 Y 4796 X F36 +(Figure)S 167 x(A\2031:)S 497 x(IMAGE)S 166 x(DA)S -37 x(T)S -37 x +(A)S 166 x(INTERCHANG)S -2 x(E)S 548 y 4796 X 22116 24 R 25027 Y +6708 X F102(APPLICATION)S 241 x(#1)S 239 x(<===============)S 2 x +(===>)S 239 x(APPLICATION)S 240 x(#2)S 448 y 7187 X(CLIENT)S 15794 X +(CLIENT)S 449 y 7665 X(^)S 12208 X(IP1)S 16272 X(^)S 448 y 7665 X(|)S +16272 X(|)S 448 y 7665 X(|)S 239 x(IP2)S 16272 X(|)S 240 x(IP2)S +449 y 7665 X(|)S 16272 X(|)S 448 y 4796 X(............+.......)S +2 x(...................)S 2 x(.........+.........)S 2 x(...)S 239 x +(X)S 239 x(WIRE)S 448 y 7665 X(|)S 16272 X(|)S 449 y 7665 X(|)S 239 x +(IP2)S 16272 X(|)S 240 x(IP2)S 448 y 7665 X(|)S 16272 X(|)S 448 y +7665 X(V)S 16272 X(V)S 449 y 6947 X(SERVER)S 15555 X(SERVER)S 747 y +7665 X(.)S 239 x(KERNEL)S 12686 X(IP3)S 16272 X(.)S 240 x(KERNEL)S +448 y 10534 X(<==============)S 2 x(=====>)S 448 y 7665 X(.)S 239 x +(EXTENSION)S 16272 X(.)S 240 x(EXTENSION)S 32961 Y 4796 X +22116 24 R 548 y 4796 X F36(Figure)S 167 x(A\2031)S 165 x(Cont'd)S +2 x(.)S 166 x(on)S 167 x(next)S 166 x(page)S 35879 Y 21731 X F40 +(RELA)S -34 x(TED)S 166 x(T)S -8 x(OPICS)S 447 x(A\2031)S +1 PP +EP +%%Page 2 65 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 4796 X F36(Figure)S 167 x(A\2031)S 248 x(\(Cont.\):)S 499 x +(IMAGE)S 166 x(DA)S -38 x(T)S -36 x(A)S 165 x(INTERCHANGE)S 548 y +4796 X 22116 24 R 657 y 4796 X 22116 24 R 897 y 4796 X F78(It)S 168 x +(is)S 168 x(the)S 169 x(purpose,)S 169 x(and)S 168 x(nature)S 169 x +(of)S 168 x(the)S 169 x(IP1)S 168 x(image)S 169 x(data)S 169 x +(protocol,)S 169 x(and)S 169 x(its)S 169 x(relatio)S 2 x(nship)S +168 x(to)S 169 x(IP2)S 168 x(and)S 168 x(IP3)S 168 x(that)S 170 x +(are)S 168 x(the)S 548 y 4796 X(subject)S 167 x(of)S 166 x(this)S +167 x(section.)S 896 y 4796 X(Applicati)S 2 x(on)S 176 x(level)S +177 x(image)S 177 x(data)S 176 x(int)S 2 x(erchange)S 176 x(formats)S +176 x(are)S 176 x(the)S 177 x(means)S 176 x(by)S 176 x(which)S 176 x +(various)S 177 x(applica)S 2 x(tions)S 176 x(recogniz)S 2 x(e)S 548 y +4796 X(and)S 179 x(exchange)S 179 x(common)S 178 x(image)S 179 x +(data.)S 275 x(Applicat)S 2 x(ions)S 179 x(level)S 180 x(intercha)S +2 x(nge)S 179 x(of)S 178 x(data)S 180 x(often)S 179 x(has)S 179 x +(nothing)S 180 x(to)S 179 x(do)S 179 x(with)S 548 y 4796 X(display)S +167 x(processes,)S 165 x(and,)S 166 x(therefore,)S 166 x(they)S 167 x +(\(IP1\))S 166 x(exist)S 167 x(outside)S 167 x(of)S 166 x(the)S 167 x +(domain)S 166 x(of)S 166 x(X.)S 897 y 4796 X(Such)S 168 x(IP1)S 168 x +(interchange)S 169 x(protocol)S 2 x(s)S 168 x(are)S 168 x(likely)S +169 x(to)S 169 x(be)S 168 x(standardiz)S 2 x(ed)S 168 x(within)S +169 x(image)S 168 x(data)S 169 x(classes)S 169 x(and)S 168 x +(applica)S 2 x(tions)S 168 x(do-)S 548 y 4796 X(mains.)S 253 x(This)S +168 x(is)S 169 x(seen)S 168 x(in)S 169 x(the)S 169 x(emer)S -9 x +(gence)S 169 x(of)S 168 x(image)S 168 x(appli)S 2 x(cation)S 169 x +(domain)S 169 x(industry)S 169 x(standards.)S 253 x(Thus,)S 169 x +(we)S 168 x(are)S 168 x(seeing)S 548 y 4796 X(medical)S 172 x +(radiologi)S 2 x(cal)S 172 x(image)S 171 x(data)S 173 x(interchange)S +173 x(standardized)S 172 x(and)S 172 x(engineerin)S 2 x(g)S 171 x +(drawing)S 171 x(image)S 172 x(data)S 172 x(interc)S 2 x(hange)S +548 y 4796 X(standardized)S 175 x(in)S 175 x(dif)S -9 x(ferent)S +175 x(ways.)S 264 x(Often,)S 176 x(applicat)S 2 x(ions)S 174 x +(level)S 176 x(interchange)S 175 x(protocol)S 2 x(s)S 173 x(are)S +175 x(packaged)S 175 x(in)S 174 x(or)S 174 x(as)S 174 x(disk)S 548 y +4796 X(\211le)S 166 x(formats)S 166 x(although)S 167 x(they)S 167 x +(are)S 167 x(equally)S 167 x(applica)S 2 x(ble)S 166 x(to)S 167 x +(all)S 167 x(channels)S 167 x(\(both)S 167 x(storage)S 166 x(and)S +167 x(communications\).)S 896 y 4796 X(Protocols)S 171 x(for)S 171 x +(applica)S 2 x(tion)S 172 x(to)S 171 x(applic)S 2 x(ation)S 172 x +(interchange)S 172 x(of)S 171 x(image)S 172 x(data)S 171 x(are)S +171 x(NOT)S 171 x(part)S 171 x(of)S 171 x(the)S 172 x(X)S 170 x +(Image)S 171 x(Extensi)S 2 x(on)S 548 y 4796 X(Package)S 180 x(or)S +179 x(the)S 181 x(X)S 179 x(Image)S 179 x(Exten)S 2 x(sion)S 180 x +(Protocol.)S 276 x(However)S -20 x(,)S 183 x(in)S 180 x(that)S 181 x +(the)S 180 x(IP1)S 179 x(and)S 180 x(IP2+IP3)S 180 x(paths)S 180 x +(should)S 180 x(allow)S 548 y 4796 X(for)S 179 x(the)S 180 x(same)S +178 x(inte)S 2 x(rchange,)S 182 x(it)S 181 x(does)S 179 x(make)S +179 x(sense)S 179 x(to)S 180 x(propose)S 179 x(an)S 180 x(IP1)S 179 x +(which)S 180 x(is)S 179 x(aligne)S 2 x(d)S 179 x(with)S 180 x(IP2)S +179 x(and)S 179 x(IP3.)S 275 x(As)S 548 y 4796 X(such,)S 169 x(the)S +170 x(extension)S 171 x(protocol)S 170 x(speci\211cat)S 2 x(ion)S +170 x(will)S 170 x(include)S 171 x(a)S 169 x(speci\211cat)S 2 x(ion)S +170 x(for)S 169 x(IP1)S 169 x(which)S 170 x(can)S 169 x(be)S 170 x +(implemented)S 170 x(as)S 548 y 4796 X(a)S 174 x(communications)S +175 x(stream,)S 176 x(or)S 174 x(packaged)S 176 x(in)S 174 x(a)S +175 x(disk)S 175 x(\211le.)S 265 x(It)S 175 x(is)S 174 x(expect)S +2 x(ed)S 174 x(that)S 175 x(thi)S 2 x(s)S 174 x(speci\211catio)S +2 x(n)S 174 x(will)S 175 x(be)S 175 x(aligned)S 548 y 4796 X(at)S +180 x(least)S 181 x(in)S 181 x(content)S 181 x(with)S 181 x(the)S +180 x(emer)S -9 x(ging)S 181 x(compound)S 180 x(document)S 180 x +(archit)S 2 x(ecture)S 180 x(inte)S 2 x(rchange)S 180 x(format)S +180 x(\(ISO)S 179 x(8613-7)S 548 y 4796 X(ODA)S -2 x(/ODIF\).)S +35879 Y 3600 X F40(A\2032)S 449 x(RELA)S -34 x(TED)S 165 x(T)S -8 x +(OPICS)S +1 PP +EP +%%Trailer +EndDviLaserDoc +%%DocumentFonts: Helvetica-Bold-DOCPSE Helvetica-DOCPSE Times-Roman-DOCPSE Courier-DOCPSE Times-Bold-DOCPSE +%%Pages 64 diff --git a/xie/docs/x11r4/concepts.txt b/xie/docs/x11r4/concepts.txt new file mode 100644 index 0000000..e8bbc35 --- /dev/null +++ b/xie/docs/x11r4/concepts.txt @@ -0,0 +1,2854 @@ +X IMAGE EXTENSION CONCEPTS + + +Revision/Update Information: V2.4 + + + + + Joseph G. Mauro + Image Processing Group + Digital Equipment Corporation + June 10, 1988 + + + + +digital equipment corporation maynard, massachusetts + Contents + + PREFACE v + +CHAPTER 1 INTRODUCTION 1–1 + 1.1 SCOPE AND PURPOSE 1–1 + + 1.2 JUSTIFICATION 1–2 + 1.3 REQUIREMENTS 1–2 + + 1.4 GOALS 1–2 + 1.4.1 Minimal Suf�ciency 1–2 + 1.4.2 Application Classes 1–3 + 1.4.3 Display Systems 1–3 + 1.4.4 Extensibility 1–3 + +CHAPTER 2 IMAGING CONCEPTS 2–1 + 2.1 TRANSFER MODEL 2–1 + + 2.2 VISUAL PERCEPTION 2–3 + 2.3 IMAGE CAPTURE 2–3 + + 2.4 IMAGE SYNTHESIS 2–3 + + 2.5 MATHEMATICAL MODEL 2–4 + 2.6 IMAGE REPRESENTATION 2–4 + + 2.7 IMAGE COMPRESSION 2–6 + + 2.8 IMAGE VS TEXT & GRAPHICS 2–6 + 2.9 IMAGE DATA OBJECT 2–6 + + 2.10 IMAGE PROCESSING 2–7 + + 2.11 IMAGE RENDITION 2–7 + 2.12 IMAGE DISPLAY 2–8 + + 2.13 IMAGE REVISABILITY 2–8 + 2.14 IMAGE APPLICATIONS 2–9 + + 2.15 IMAGE SERVER 2–9 + + + + + iii + Contents + + +CHAPTER 3 EXTENSION ARCHITECTURE CONCEPTS 3–1 + 3.1 EXTENSION GUIDELINES 3–1 + + 3.2 EXTENSION LEVELS 3–2 + + 3.3 GLOBAL CONCEPTS 3–3 + 3.3.1 Final vs Revisable Form 3–3 + 3.3.2 Image Data Representation 3–3 + 3.3.2.1 Aternate Data Organizations and Pixels • 3–4 + 3.3.2.2 Discrete vs Continuous Pixels • 3–4 + 3.3.3 Layout & Coordinate Systems 3–5 + 3.3.3.1 Coordinate Systems • 3–5 + 3.3.3.1.1 Spatial Coordinate Systems • 3–5 + 3.3.3.1.2 Temporal Coordinate Systems • 3–6 + 3.3.3.1.3 Chrominance Coordinate Systems • 3–6 + 3.3.3.2 Layout • 3–7 + 3.3.3.2.1 Spatial • 3–7 + 3.3.3.2.2 Temporal • 3–7 + 3.3.4 Image Structure − Subsets 3–8 + 3.3.5 State Information − Process History 3–8 + 3.3.6 Extension Relationships 3–8 + 3.3.6.1 To Core X • 3–8 + 3.3.6.2 To Other Extensions • 3–8 + 3.3.6.3 Multiple Connections, Clients, and Resource Sharing • 3–9 + 3.3.6.4 To Text and Graphics • 3–9 + + 3.4 SERVICE CONCEPTS 3–9 + 3.4.1 Service Goals − Reasoning & Implications 3–9 + 3.4.1.1 Range of Images • 3–9 + 3.4.1.2 Range of Applications Needs • 3–10 + 3.4.1.3 Range of Server Capabilities • 3–10 + 3.4.1.4 Display Device Independence • 3–11 + 3.4.1.4.1 Server Based Rendition • 3–11 + 3.4.1.4.2 Image Data Organization • 3–11 + 3.4.1.5 Image Data Transport • 3–12 + 3.4.1.5.1 Image Data Compression • 3–12 + 3.4.1.5.2 Transport Granularity • 3–12 + 3.4.1.6 Image Processing • 3–13 + 3.4.1.6.1 Enhancement Processing • 3–13 + 3.4.1.6.2 Rendition Processing • 3–13 + 3.4.1.6.3 Enhancement − Rendition Relationship • 3–14 + 3.4.1.6.4 Other Forms of Processing • 3–14 + 3.4.1.6.5 Processing Policy • 3–14 + 3.4.1.7 Operations Pipelining • 3–15 + 3.4.1.8 Server Display Hardware Control • 3–16 + 3.4.1.8.1 Shared Hardware Device Control • 3–16 + 3.4.1.8.1.1 LUTS and Bit Map • 3–16 + 3.4.1.8.1.2 Brightness − Contrast − Hue − Saturation • 3–16 + 3.4.1.8.2 Use of Image Speci�c Accelerators • 3–17 + 3.4.1.8.3 Image Capture Hardware − Live Video • 3–17 + 3.4.1.8.4 Extensibility • 3–18 + + + + +iv + Contents + + + 3.4.2 Client−Server Model 3–18 + 3.4.2.1 Server Resources • 3–18 + 3.4.2.2 Service Classes • 3–18 + 3.4.2.3 Service Events • 3–19 + + 3.5 TRANSFER MODEL VS X WIRE 3–19 + +CHAPTER 4 EXTENSION PROTOCOL ELEMENTS 4–1 + 4.1 SERVICES 4–1 + 4.1.1 Device Independent Service Group 4–1 + 4.1.1.1 Session Class Services • 4–1 + 4.1.1.2 Resource Class Services • 4–1 + 4.1.1.3 Transport Class Services • 4–2 + 4.1.1.4 Statistics Class Services • 4–2 + 4.1.1.5 Enhancement Class Services • 4–3 + 4.1.1.6 Process Control Class Services • 4–3 + 4.1.2 Device Dependent Service Group 4–4 + 4.1.2.1 Rendition Class Services • 4–4 + 4.1.2.2 Import/Export Class Services • 4–5 + 4.1.2.3 Display Class Services • 4–5 + 4.1.2.4 Device Control Class Services • 4–5 + 4.2 RESOURCES 4–6 + 4.2.1 Image Object − IOB 4–6 + 4.2.2 Image Enhancement Context − IEC 4–6 + 4.2.3 Image Process Context − IPC 4–7 + 4.2.3.1 Region of Interest − ROI • 4–7 + 4.2.3.2 Control Processing Plane − CPP • 4–8 + 4.2.3.3 Templates − TMP • 4–8 + 4.2.4 Image Control Context − ICC 4–8 + 4.2.5 Image Display Context − IDC 4–9 + + 4.3 SERVICE OPERATION 4–10 + 4.3.1 Flow 4–10 + 4.3.2 Requests and Replies 4–11 + 4.3.3 Errors 4–11 + 4.3.4 Events 4–11 + +CHAPTER 5 TERMINOLOGY 5–1 + 5.1 CORE PROTOCOL 5–1 + 5.2 EXTENSION PROTOCOL 5–2 + 5.2.1 Image De�nitions 5–2 + 5.2.2 Image Characteristics 5–4 + 5.2.3 Visual Types 5–5 + 5.2.4 Image Classes 5–5 + 5.2.5 Image Data Organization 5–6 + 5.2.6 Image Data Encoding 5–8 + 5.2.7 Image Data Presentation 5–9 + 5.2.8 Image Server Hardware 5–10 + 5.2.9 Image Data Layout 5–11 + + + + + v + Contents + + + 5.2.10 Three Space Color 5–11 + 5.2.11 Image Data Processing 5–12 + +APPENDIX A RELATED TOPICS A–1 + A.1 IMAGE DATA INTERCHANGE A–1 + + +FIGURES + 2–1 IMAGE TRANSFER PROCESS 2–2 + 2–2 VISUAL TYPE − VS − IMAGE CLASS 2–5 + 3–1 IMAGE EXTENSION − VS − CORE PACKAGE 3–2 + 3–2 SERVICE CLASS GROUPS 3–19 + 3–3 TRANSFER MODEL & X WIRE LOCATION 3–20 + 4–1 OPERATIONAL MODEL 4–10 + A–1 IMAGE DATA INTERCHANGE A–1 + + +TABLES + 5–1 Core Terms 5–1 + + + + +vi + Preface + + + The core X architecture is a major step in the de�nition of open, interactive applications display services. + It has, in essence, pried apart the tightly coupled, private interconnect between application and display + subsystem by specifying a structured set of display services. + The core X protocol recognizes the need for minimally suf�cient capabilities, and, as such, leaves the + speci�cation of robust application domain speci�c display services to extension packages. These extension + packages relate to the core X protocol by way of an extension mechanism speci�ed in the core X protocol. + This document contains conceptual material useful in understanding the proposed X image extension + package including the X image extension protocol (XIEP), the protocol binding in the X image extension + library (XIE_LIB), and the X image extension toolkit (XIE_TK). The X image extension protocol (XIEP), + X image extension library (XIE_LIB), and X image extension tool kit (XIE_TK) are de�ned in separate + documents. It is assumed that the reader is familiar with the core X architecture. + + + +Related Documents + • X11 Window System Protocol + Describes the core X protocol functions and the conventions to be used in specifying extension + packages. + • X Extension Package Guidelines + Sets forth guidelines for extension packages. + • X Image Extension Protocol (XIEP) + Describes the proposed X Image Extension Protocol. The X Image Extension Protocol Speci�cation is + the companion document to this concepts document. + • X Image Extension Lib (XIE_LIB) + Describes the contents of the image extension library level. + • X Image Extension Toolkit (XIE_TK) + Describes the contents of the image extension toolkit level. + + + +Participants + • AUTHOR: + • Joseph Mauro + • Digital Equipment Corporation + • MS: MK02−2/K03 + • Continental Blvd. + • Merrimack, New Hampshire 03057 + • 603−884−0528 + + + + + v + Preface + + + • CONTRIBUTORS: + • John Weber (Digital) + • INVITED REVIEWERS: + • Mark Sornson (Digital) + • Bob Milling (Digital) + + + +Revision History + + + rev v1.0 July 1, 1987 �rst protocol draft + rev v2.0 September 1, 1987 split concepts from protocol + rev v2.1 December 1, 1987 rework based upon internal review + rev v2.2 December 10, 1987 rework based upon internal review + rev v2.3 April 10, 1988 rework based upon protocol spec + rev v2.4 June 10, 1988 minor rework for �rst MIT release + + + +Organization + This document contains �ve chapters and one appendix. + • Chapter 1, Introduction, explains the purpose of the X Image Extension + • Chapter 2, Imaging Concepts, describes basic digital imaging concepts + • Chapter 3, Extension Architecture Concepts, describes the underlying concepts of the image extension + • Chapter 4, Extension Protocol Elements, de�nes the basic elements of the extension protocol + • Chapter 5, Extension Lexicon, de�nes the lexicon used in the extension + • Appendix A, Related Topics, addresses some closely associated topics + + + + +vi + Chapter 1 + +INTRODUCTION + + + +1.1 Scope and Purpose + + The X image extension package is a supplement to the core X package. The X image extension package is + designed to provide applications with robust support for visually interactive digital image enhancement and + display operations. The purpose of this document is to provide conceptual material useful in understanding + the image extension package and its wire protocol. + The core X architecture de�nes a client−server based interactive application display services model including + components and their relationships (layering and distribution). The proposed X image extension package + follows the core X architecture by specifying imaging components and their relationships within the X + model. + Although the proposed X image extension package de�nes image speci�c extensions at all levels of the core + X model, it focuses primarily on extensions to the wire protocol as these are fundamental to all other levels. + The X Image Extension Protocol (XIEP) is intended as the format by which client and server portions of + an imaging application communicate imaging service requests and replies across the X wire. As such, this + concepts document focuses primarily on providing the reader with the background material and reasoning + necessary to understand the XIEP protocol speci�cation. + XIEP is intended for use by a wide range of digital imaging applications dealing with various classes of + images, and requiring varying degrees of server support. The classes of images include: + • Static bitonal digital image data (scanned documents) + • Static continuous tone monochromatic digital image data (gray scale) + • Static multi spectral digital image data (color) + • Time varying versions of each of the above + + XIEP is intended to support applications that simply display images, through those that involve highly + interactive, human directed image processing. As a future component of a developing industry standard, + XIEP will serve the needs of multiple vendors and their end users. + + + + + INTRODUCTION 1–1 + 1.2 Justi�cation + + The core X protocol chooses not to provide robust support for certain application areas in order to remain + minimal in extent. Instead, it provides a mechanism for adding protocol extension packages for domains + such as imaging. + Analysis of imaging applications and their display (human interaction) needs indicates that there are several + broad areas which X image servers and an X image extension protocol (XIEP) should provide for including: + • Device independent display interaction + • Wire image data organization and compression + • Interactive image enhancement processing + • Control of tightly coupled image capture hardware + • Use of image speci�c accelerators + + This work is justi�ed by the standardization of and increase in imaging display capabilities provided to + applications, and by the off loading of many operations to the server. + + +1.3 Requirements + + It is a requirement that XIEP comply with the architectural model set forth by X. Compliance will be + measured by the similarity of architectural concepts. + It is a requirement that XIEP comply with the core protocol and protocol extension mechanisms set forth + by X. + + +1.4 Goals + + XIEP is designed to meet the human interaction needs of imaging applications by providing for the + communication of these needs between X client and X server. XIEP has as its goals the inclusion of a + minimal set of functions that support the variety of image applications classes and provide access to the full + resources of the display system, and support for image extension package extensibility. + + +1.4.1 Minimal Suf�ciency + XIEP should contain a minimal set of functions that support basic imaging operation classes including + image object transport, interactive image enhancement processing, image display rendition, and tightly + coupled image capture device control. The set should be minimal in content with as little overlap in + functions as possible. The protocol must support the construction of X image extension toolkit (XIE_TK) + and client speci�c higher level imaging functions. + + + + +1–2 INTRODUCTION + 1.4.2 Application Classes + XIEP should be suf�cient to support applications that simply render images for display purposes, as well + as those that provide for high visually interactive, human directed, image enhancement processing. XIEP + should support rendering and processing for applications that deal with static and time varying bitonal + monochrome, continuous tone monochrome (gray scale), and continuous tone multi−spectral (color) digital + images. + XIEP should allow X application clients to perform image rendition themselves (prepare images in �nal + form for display), and request X servers to display them, as is. This is essentially the current situation + under X11. In addition, XIEP should allow application clients to defer rendition to the X server implying + that the image extension package server will handle all device speci�cs of image rendition. + +1.4.3 Display Systems + Display system architectures range from simple terminals connected through serial lines to host processors, + through the modern day workstation with tightly coupled processor and display subsystem, to highly + specialized interactive graphics and image processing workstations. XIEP should provide the means for + using specialized display subsystem architectures and image rendition and processing hardware. + +1.4.4 Extensibility + While it is a goal of the X image extension package to itself be extensible, unlike the core X11 protocol, + the package extensibility will not be achieved via extensibility of the X image extension protocol (XIEP). + Instead, it will be goal of the X image extension toolkit (XIE_TK) to provide for extensiblity. Thus, + demands for additional high level services will be met over time via addition of services at the tool kit level + versus additional of new protocol functions. The evidence suggests (in particular, the wide range of exiting + popular enhancement functions, and the continuing development efforts in this area) that with the correct + choice of low level server functions, this strategy can be made to work. + + + + + INTRODUCTION 1–3 + Chapter 2 + +IMAGING CONCEPTS + + + This chapter presents background material regarding the de�nition and sources of digital images, how they + move through applications, and the states they pass through in transit. This material constitutes a simple + model of digital imaging which is useful in presenting the extension concepts. + + +2.1 Transfer Model + + The overall operational model for many image applications is that of a transfer process. The transfer + process begins when either a real world continuous image is captured and converted into a digital image, + or a digital image is synthesized by some other application. The digital image is represented and stored + internally, and processed by the application (sometimes iteratively). Finally, the digital image is made + suitable for display (rendering) and displayed upon a computer device. Often, the processing, rendition, and + display steps are iterated. + Two threads which run through the entire process are ef�ciency of representation and processing, and + �delity of reproduction. In general, we would like to maximize �delity (trueness to the original as perceived + by humans − ie. psychological vs mathematical) and ef�ciency of representation (minimize the data storage) + at the same time. + + + + + IMAGING CONCEPTS 2–1 + Figure 2–1: IMAGE TRANSFER PROCESS + + FLOW CONCEPT + real world + object or scene + | + | IMAGE FORMATION + v + continuous Human Visual Perception + image "Visual Types" + | + | SENSING/DIGITIZATION + | analog image + .................|.............................................................. + | digital image + SYNTHESIS CAPTURE + | | + | | + +−−−−−+−−−−−+ + | + | Revisable Form Image + v Efficiency vs Fidelity + +−−>digital Compression Encoding + | image Digital Image Classes + | | + | | + | | ENHANCEMENT Visually Interactive Processing + | | + +<−−−−−+ + ^ | + | | RENDITION Rendition Processing + | | + +−−−−−−+ + | + v + digital Final Form Image + image Rendition Fidelity + | digital image + ...........|.................................................................... + | analog image + | DISPLAY + | + v Human Visual Perception + screen image "Visual Types" + + + + Continuous images derive from real world objects and scenes, and form the basis for human visual + perception of the world around us. Digital images derive either from continuous images (capture or + digitization) or from two−dimensional digital data generation processes (synthesis). The X image extension + is concerned only with digital images and does not care about their derivation. + Once in digital format, an application may revise an image iteratively through editing and enhancement + processes. Just prior to display,the digital image must be converted into a format understood by the display + device (rendition process). It is then displayed where it is converted back to analog format and perceived + by the viewer. + + + + +2–2 IMAGING CONCEPTS + 2.2 Visual Perception + + An image of a three−dimensional real world object or scene is a continuous (in its spatial dimensions, and + in the dependence of its intensity upon wavelength and time), two−dimensional projection formed by an + imaging element. + The human visual system is a combination of imaging element (lens), focal plane sensor (retina), and + interpretation machinery (brain). Based upon perceived attributes of a continuous image (dependency of + intensity upon wavelength and time), we often assign it to one of a number of distinct groups or visual + types including black and white, grey scale, color, stills, and motion. These phrases are simply convenient + labels for complex visual perception phenomena. + It is not unusual to associate the visual types (which are based upon human perception of a continuous + image) with the digital representation of the continuous image. In fact, there is an optimum (ef�ciency and + �delity) digital image representation, known as a digital image class, for each visual type. + + +2.3 Image Capture + + Image capture or digitization is the process by which a continuous image is converted into a discrete image + manageable by a computer. A continuous image is an intensity or amplitude function I(x,y,w,t) which + is de�ned on a two dimensional plane at an in�nite number of locations (x and y are continuous real + variables), which is de�ned at an in�nite number of wavelengths (w is a continuous real variable), which + is de�ned at an in�nite number of times (t is a continuous real variable), and which may posess an in�nite + number of values (I is a continuous real variable). + Converting to a discrete representation means that I, x, y, w, and t become integers with �nite range. + Thus, discrete means that the continuous image is sampled at a �xed number of locations (vertices of a + regular, two−dimensional sampling grid), and that the intensity is sampled at these points at a number of + wavelengths or wavelength bands and times, and quantized to a �xed number of levels. + Typically, for static images (no dependence upon time), the process of conversion from continuous to + discrete involves only sampling and quantization. + + +2.4 Image Synthesis + + In practice, digital images are often generated by means other than sampling at the focal planes of imaging + elements. Synthesized images are ones where the discrete image data at the discrete sampling grid locations + is computed from physical sensory information or object models. Examples include medical Nuclear + Magnetic Resonance images, Geosesmic images, and synthesized graphic images. In the last case, the + digital image derives from computer models of objects and scenes which may not exist in reality. As with + captured images, synthesized images are often intended for consumption by a human viewer. + + + + + IMAGING CONCEPTS 2–3 + 2.5 Mathematical Model + + An F valued image ’a’ on X is the graph of a function a:X−>F + + a = { (x,a(x)) : x E X, a(x) E F} + + where: + X is a (multi dimensional) coordinate set + x is an element of the set X + F is a value set whose values maybe + R (real) + Z (integer) + Z*2k (binary integral) + C (complex) + + Under this de�nition, while the sampling grid is discrete and �nite, the values of the image may be integral, + real, or complex. We will see that as image processing often produces results which are non integral, it is + necessary to recognize non integral valued images. + The debate over the de�nition of a digital image regarding is potential values (integral vs non integral) is + more one of philosophy than anything else. It is clear that there are some locations in the transfer model + where the point is not moot. In particular, display devices in general require discrete (integral) valued + images for display purposes. + We will adopt a pragmatic approach which avoids the philosophical question which requires discrete + (integral) images in client server communications and server presentation to display devices, but allows for + non integral representations in the server during image processing. + + +2.6 Image Representation + + Whether captured or synthesized, a primary goal is to represent what was (or will become at display + time) a continuous image in discrete form with the fewest bits possible (ef�ciency), while being able to + recreate as similar an image as possible for human viewing (�delity). These goals result in classes of digital + representation optimized for and analogous to the various visual types. + The digital image representation must store information regarding both the luminance and chrominance + characteristics of the original image. We will consider static images only, or equivalently, time variations as + representable as sequences of individual static images. + Luminance is often referred to as intensity or tonality. In a digital representation, the number of bits is + �nite, and so the intensity or tone scale has a limited number of levels. A digital image which provides for + only two intensity levels (and has no chrominance information) is often referred to as bitonal, while one + with several intensity levels as continuous tone. + Chrominance information may or may not be present in a digital image. When a continuous image is + captured, the use of multiple sensors which integrate intensity over various wavelength bands provides + some chrominance information. Images which include this information are known as poly chromatic or + multi−spectral. This is typically what is done for systems like television cameras. When only a single + sensor is used and the intensity is integrated over the entire spectrum that the sensor responds to, no + chrominance information is available. These images are known as monochromatic. + + + + +2–4 IMAGING CONCEPTS + There are many ways in which the luminance and chrominance information of an image can be digitally +represented. At the extremes are representations which fully combine and fully separate the luminance +and chrominance information and in between are representations with varying degrees of combination. +A common example is R−G−B which has three separate luminance channels (one for each of the three +chrominance bands). Broadcast television (NTSC − which is an analog format) is designed such that the +luminance and chrominance signals are separate and can be recombined at the receiver (tv) allowing "black +and white" (what we will now refer to as monochromatic continuous tone) tv’s to receive and show the +image without color. +Another aspect of image representation is the amount of information required per channel. Many schemes +have unequal amounts of information per channel. The amount of information per channel is based on +many things including human visual perception characteristics and ef�ciency (conservation of storage +and communications bandwidth). Examples of this include 8 bit per pixel color (R−G−B 3−3−2) where the +amount of luminance information is different for the 3 chrominance channels, and broadcast tv where the +luminance and chrominance signals have signi�cantly different bandwidths. + +Figure 2–2: VISUAL TYPE − VS − IMAGE CLASS + +HUMAN VISUAL TYPE OPTIMAL IMAGE CLASS CLASS CHARACTERISTICS +−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−− +BLACK AND WHITE MONOCHROMATIC BITONAL 1 BAND − 2 INTENSITIES +GRAY SCALE MONOCHROMATIC CONTINUOUS TONE 1 BAND − N INTENSITIES +COLOR MULTISPECTRAL CONTINUOUS TONE M BANDS − N INTENSITIES + + where: bands −−> spectral bands + + +The black and white visual type is usually represented by a digital image class known as (monochromatic) +bitonal. The gray scale visual type is usually represented by a digital image class known as (monochro− +matic) continuous tone. The color visual type is usually represented by a digital image class known as +multi−spectral (polychromatic continuous tone). The stills and motion visual types are represented by +individual or sets of the other digital image classes. +One can argue that digital image classes, and by analogy, the associated human visual types can be +organized into a hierarchy based upon degrees of freedom or information theoretic information content. +Loosely speaking, color images have an additional degree of freedom or contain more information than do +grey scale and black and white, and grey scale images contain more information than do black and white. +Obviously, time varying images have an additional degree of freedom over static images. +Note that although any continuous image of any visual type can be represented and communicated at some +level to a human viewer using any class of digital image, the previous table shows the optimal digital image +class (in terms of ef�ciency and �delity) for each human visual type. Representing and rendering an image +for display in an image class which is not optimal for the human visual type usually results in a loss in +ef�ciency of representation and visual �delity. +The fact that the different digital image class data representations are optimized for representing different +visual types results in signi�cant structural differences between them. +The visual type known as black and white is dominated by images of human communications objects +such as written or drawn documents. These images are characterized by high contrast and relatively high +spatial frequency, and contain symbols which are differentiated by shape rather than intensity or color. The +digital image class used to represent them with greatest �delity and ef�ciency (bitonal) uses relatively high + + + + + IMAGING CONCEPTS 2–5 + spatial resolution to capture the shape information of these symbols, and low luminance resolution (1 bit + per sampling location − 2 intensity levels − black and white). + Real world scenes are represented by the gray scale and color visual types. They have far fewer sharp + intensity edges than black and white visual type images, and much �ner gradation and variation in intensity + and hue. Images of these objects do not require the high spatial resolution that is needed for black and + white written material, but instead require higher luminance and chrominance resolution. The continuous + tone and multi−spectral digital image classes are used for the greyscale and color visual type images. + + +2.7 Image Compression + + Image representation deals with selecting an optimal digital image class for an image of some visual type. + Within these digital image classes, schemes exist to remap or encode the digital images in a fashion which + reduces redundancy and results in a more compact (compressed) representation. There are many image + compression schemes and to some extent, they are optimized by digital image class. Image compression + schemes which result in complete �delity (as measured by the mathematical difference between the original + image and one which is reconstructed by the compression−decompression cycle) are referred to as lossless + schemes, while those that lose some information are known as non−lossless schemes. + + +2.8 Image vs Text & Graphics + + Although computer text, graphics, and images all represent computer information to be presented for + consumption by the human visual system, they are differentiated by their internal representations, and by + the ease with which computer programs can interpret their contents and semantics. Text and graphics are + highly structured with limited lexicons (ASCII character set, points, lines, arcs) and possess highly evolved + semantics. While digital images are a less ef�cient means of representing textual or graphical information, + they offer a far richer range of expression (such as a photograph of a person). + + +2.9 Image Data Object + + In practice, a digital image consists of two pieces: the actual bits which are a result of the sensing and + digitization or synthesis processes, and the attributes that allow the bits to be interpreted meaningfully. + The raw bits, which result from the capture or synthesis processes and represent a discrete image (spatially + sampled and quantized − no floating point arrays allowed!) can be organized in many different ways. The + simplest organizational model is that of a three−dimensional volume where the x and y dimensions represent + the sampling plane or grid locations, and the bits found in the z direction represent the value of the image + at that sampling location at some instant in time. Time varying images may be thought of as a collection of + such volumes. + Image attributes consist of information which does not derive from the capture or synthesis processes, but + which is essential for interpreting the raw bits. Attributes include such information as the way in which the + raw bits have been organized, parameters of the sensing process, and information regarding how the image + data is to be displayed. Although the digital image class (bitonal, continuous tone, multi−spectral, still, + time varying) is usually not declared explicitly, it is often inferable from the attributes. Assuming that the + digital image class used to represent the human visual type of a particular image is chosen for purposes of + achieving maximum �delity with maximum ef�ciency, the visual type of the continuous image can usually + be inferred from the digital image class. + + + + +2–6 IMAGING CONCEPTS + 2.10 Image Processing + + Image processing is the application of image operators to image data. There are three broad classes of + image processing distinguished by purpose and approach: restoration and enhancement, analysis, and + coding. + Restoration processing is done to remove some well understood or predictable image distortion resulting + from the imaging system or conditions. Enhancement is the processing of an image for the sole purpose of + making the image data more easily interpretable by a human viewer. Enhancement processing is often done + interactively under the direction of the viewer. Both restoration and enhancement processing produce an + image as output and as such, maybe considered to be similiar to image synthesis. + Analysis processing seeks to infer meaning (semantics) from raw image data and involves machine + interpretation of images. A major branch of analysis processing is known as pattern recognition. Analysis + processing usually produces some measurment or conclusion as output rather than a new image. Often + enhancement processing is performed in preparation for analysis processing (one such example would be + edge detection whic produces a new image which is dimensionally simplier for an analysis process to deal + with). + The process of image coding deals with mapping image data into alternate symbol sets for ef�ciency of + storage and communications (for example compression), or for organizational purposes. Image coding + produces an alternative representation of the input image as output. Depending upon the type of coding, the + original image can be recovered with varying degrees of �delity. + + +2.11 Image Rendition + + Rendition is the process of making an image object suitable for display. In general, it involves converting + the image into a format that the display device can deal with, and sizing and aligning it properly to �t on + the screen. Rendition deals with the presentation attributes of an image. + Rendition and display are logically the �nal steps in the image transfer model. A continuous image of some + visual type was converted into digital format of a particular image class for ef�ciency and �delity reasons. + The rendition process seeks to make the image object of a particular image class viewable on a display with + certain hardware characteristics while achieving as high a degree of display �delity as possible. + Display devices have hardware characteristics that determine if a particular digital image belonging to + a particular image class can be displayed as is (rendition is a null operation), or if the image must be + converted within its image class, or across image classes, before display. + Conversion within an image class means that rendition takes a particular revisable form image of some + class (bitonal, continuous tone, multi−spectral), and produces a �nal form image of the same class (bitonal, + continuous tone, multi−spectral). Note that although the class remains the same, attributes such as number + of intensity levels may change (an example would be rendering an 8 bit per pixel continuous tone image + for display in 4 bits per pixel). + Conversion across image class means that rendition takes a particular revisable form image of some class + and produces a �nal form image of a different (usually inferior) class. An example would be rendering an + 8 bit per pixel continuous tone class image for display in 1 bit per pixel (using a dithering algorithm) as + a bitonal class image. Although cross−class conversion can be from any digital image class, to any digital + image class, conversion more often (due to display device limitations) proceeds from digital image class + with higher degree of freedom to that with lower degree of freedom (such as from multi−spectral to gray + scale). Psuedo coloring is an example of a digital image class conversion which proceeds in the opposite + direction (inferior to superior class). Cross−class conversions which proceed from superior to inferior + + + + IMAGING CONCEPTS 2–7 + classes tend to discard information, while those which proceed in the other direction at times "invent" or + provide information which was not available in the original image. + In general, if the display device will support it, �delity is maximized if the image is rendered in a format + as close to that of the image class as possible (for example, display a continuous tone image using multiple + bits per pixel rather than by using 1 bit per pixel). If not, the image may be converted to a different image + class (from continuous tone to bitonal through a dithering process) in order to still render and display it, + and convey a facsimile of the original visual type. + Display hardware is usually such that there is a hierarchy of ability to render different image classes with + �delity. For example, if a display device can render a continuous tone image with �delity (ie. it has N bits + per pixel capabilities), in general, it will also be able to render a bitonal image with �delity. This hierarchy + is not one of image class, but rather one of the display device’s ability to render image classes with �delity. + + +2.12 Image Display + + The display step takes an image which has been rendered and makes it viewable (visible on the screen). It + involves transport of rendered (�nal form) image data (usually referred to as the bit map at this point) to + the display memory and setting of display controls. + Display is an entirely separate step from rendition. There are several reasons for separating these two + steps. One major reason is performance. The client may chose to render several images (a potentially time + consuming task) before displaying them so that they may be displayed in a time sequence, and so that the + user may return to a previously rendered image without rerendering. A second reason is that the client may + wish to render an image and convert it back into revisable form without displaying it at all. In this case, the + user now has a revisable form image which can be processed, and whose characteristics are aligned with + those of the display device making future rendition much less expensive if not entirely null. Of course, + processing of this image might make re−rendition a necessary step. + + +2.13 Image Revisability + + Revisability is the ability to go back and continue to modify the contents of an image. At one end of the + spectrum are revisable form images, while at the other end are �nal form images. + In revisable form images, the raw data and attributes represent the original image as captured or synthesized, + and rendition or other non−reversible image processing operations have not been applied. The association + between image attributes and raw data exists in revisable form images. + In �nal form, an image has been prepared for output and all presentation attributes have been accounted + for (applied and stripped off). The contents of a display device display memory may be considered as �nal + form. As rendition is an output device dependent process, it is likely that a one to many relationship exists + between a revisable form image, and the various �nal form images that derive from it (each for a different + output device). + The distinction between revisable and �nal form for images is not as clear as it is for text objects. With + images, the �nal form of one image object could be used as the starting point for the revisable form of + another if the presentation attributes were reassociated with the data. + + + + +2–8 IMAGING CONCEPTS + 2.14 Image Applications + + An application which inputs, outputs, stores, communicates, or displays digital images is said to be an + image application. Many applications will integrate image handling with text and graphics handling. The + subset of image applications which must display images are candidates for use of the X image extension + package. Most or all of the overall image transfer model can be found within these applications, although + at times, various steps are null or compressed. + Text, graphics, and images are simply different data protocols and sets of services for visual information + managed on a computer. While many applications will need to wield all three sets (text, graphics, and + images) to visually display what they wish to communicate, the integration of text, graphics, and image + services under X are outside of the scope of this work (the X image extension protocol). Minimally, it is + up to the application to accomplish the integration of use of these services. Compound document display + and edit packages are perfect examples of applications which face this challenge. + In addition to not solving the integrated approach to the use of X based text, graphics, and image services, + the X image extension package will not provide ANY text or graphics services. + The processing of images for display purposes and the display of images are intimately entwined. The X + architecture has segregated processing for display and display from other aspects of applications. Within + the X model, an application has a component which requires the display processing (and human interaction) + services called the client component, and a component which provides these services called the server + component. Naturally, the server component resides at or near the equipment which provides for display + and human interaction. The X architecture also provides for logical/physical separation of these two + components by a "wire". + + +2.15 Image Server + + An X server for imaging applications minimally includes a general purpose host processor on which the + X server runs and a display subsystem. There is potential for great diversity regarding the server host + con�guration, the complexity and capability of the display subsystem, and the relationship between host + processor and display subsystem. + Regarding the relationship between the host processor and the display subsystem, at one end of the server + spectrum are terminals where host processor and display subsystem are separated by a relatively low + bandwidth connection and often a character oriented protocol. The separation between these components + maybe relatively small (local serial line), or large (modems and packet switch networks). At the other end + are workstations where the host processor and display memory are connected by a high bandwidth bus and + often overlapping address spaces. While the X image extension package does not preclude the terminals + cases, the large size of image objects implies the need for a relatively high interconnect bandwidth between + server host processor and display subsystem (the workstation con�guration). + Regarding display subsystem capabilities, at the low end are devices which do not allow direct access to + the display memory and have no user accessible display processing capabilities. At the high end are display + subsystems with specialized processor−memory architectures (including parrallel−pipelined processors, and + shared memory multi processor con�gurations) which provide on−board support for enhancement and + rendition processing. + As image capable workstations and display subsystems develop, there is a trend to closely couple image + capture devices to image display subsystems. Close coupling involves sharing the display memory between + the capture device and the display hardware. With these con�gurations, it is usually possible for the viewer + to see the image as it is being digitized. In these cases, the capture–>represent–>enhance–>render–>display + transfer process has no loops and is very tightly packed and highly optimized. + + + + IMAGING CONCEPTS 2–9 + Chapter 3 + +EXTENSION ARCHITECTURE CONCEPTS + + + There are a number of concepts which are fundamental to the image extension architectural model. These + concepts are introduced in this chapter, and those which result in elements of the X Image Extension + Protocol (XIEP) are explored in depth in the following chapter. In addition, the relationship between the + core X architecture and protocol, and the proposed extension architecture and protocol is addressed briefly + throughout the chapter. + + +3.1 Extension Guidelines + + In formulating an image extension protocol, the two most important questions are: + 1. What services do client portions of image applications require of an image server? + 2. What services is an image server well positioned to provide? + + From the answer to these questions, a high level service set can be de�ned. The next step is to proceed + to identify the primitives that the server should implement to support the high level service set. Finally, + the primitives must be mapped into a minimally suf�cient protocol for communicating both the service + primitive requests and responses. + In order to answer the �rst question, one must analyze the human interaction components of many imaging + applications. If performed by a single individual, in a serial fashion, this is potentially a long task. A + more practical approach to this problem is to draw upon the experience of many diverse image applications + developers (which to some extent is the approach taken to date). + Regarding the second question, the core X model provides some guidelines on what should live on + the server side of the wire. Clearly, all interaction with the display device must go through the server. + Likewise, all interaction with human controlled interaction devices, such as keyboards and pointing devices, + must go through the server. + In general, due perhaps more to the maturity and standardization of the spaces, the core X package provides + some degree of device independence for text and graphics. Although this is not an explicit goal of core + protocol, it seems like a reasonable direction for the extension protocol: the image extension package + should provide device independence to the client. This means that the XIE_TOOLKIT, XIE_LIB, and + XIE_SERVER will handle all image display device dependencies. Minimally, this implies that rendition is + an extension package issue. Server extensions are encouraged to provide for usage of specialized display + hardware primarily for display purposes. + + + + + EXTENSION ARCHITECTURE CONCEPTS 3–1 + The XIE_SERVER may be home to operations which, although not speci�cally device dependent, would + derive bene�t (performance ef�ciency) from being in close proximity to the display subsystem and special− + ized display subsystem hardware. This is the basis for postulating that interactive enhancement processing + must be provided for (allowed) in the server. + + +3.2 Extension Levels + + The following diagram shows the relationship between client and image extension server, and how the full + image extension package parallels the existing X components. It also positions the speci�cation of XIEP, + the image extension protocol for the X wire (denoted by the *). + + Figure 3–1: IMAGE EXTENSION − VS − CORE PACKAGE + + + application host server host + machine machine + +−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−+ + | application | | display device |<−− capture + | | | | device + | | | | + | | | | + | X & XIE toolkits| | DDX | + | X & XIE LIBs | <====================> | DIX | + +−−−−−−−−−−−−−−−−−+ X11 & XIEP +−−−−−−−−−−−−−−−−+ + wire + protocols + + + + EXISTING X COMPONENTS IMAGE EXTENSION COMPONENTS + −−−−−−−−−−−−−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−− + Applications Image Applications + | | + Programming Libraries Imaging Services Library + | | + Xtoolkit XIE_TOOLKIT + | | + Xlib XIE_LIB + | | + X Core Wire Protocol Image Extension Protocol (*) + | | + X server kernel X Image server kernel + | | + device independent modules device independent extensions + | | + device dependent modules device dependent extensions + | | + display & input devices image capable displays + + + Image speci�c components and issues can be positioned against the core X levels. Image accelerators + (either integral to the display subsystem, or simply ancillary server host processors) exist and are accessed + at the device dependent server level. The device independent image extension protocol functions (XIEP) + and image speci�c resources exist at the device independent server level. + Extensions to X lib implement the X image extension protocol. XIE_LIB is likely to follow the precedent + set by the core protocol and simply represent language bindings of the XIE Protocol. + + +3–2 EXTENSION ARCHITECTURE CONCEPTS + The constraint of minimality for the X Image Extension Protocol forces many useful X Image Extension + Package functions into the the software between the client and the wire: ie. into the X Image Extension + Toolkit. In essence, the protocol offers the lowest level functions upon which higher level services can be + built. These higher level services include things such as rendition models and control, and image speci�c + display constructs (widgets, etc), and will be packaged in the X Image Extension Toolkit. (see appendix for + a more detailed discussion of rendition distribution in the X Image Extension Package. + + +3.3 Global Concepts + + The following concepts are signi�cant, if not highly visible or localized, components of the extension + architecture. In general, these concepts are important to understanding XIEP and bear upon its overall + structure, content, and use. They have been segregated into the global concepts section because they do not + translate literally to any one or set of protocol elements. + + +3.3.1 Final vs Revisable Form + Central to the extension proposal is the relationship between revisable and �nal form images. The contents + of the server’s image display represents a �nal form image. Thus, the viewer always sees and visually + interacts with a �nal form image. Behind every �nal form image which the user views is a revisable form + image from which the �nal form image derives by way of the rendition process. + The relationship between the revisable form image behind the �nal form image that the viewer sees may + range from being nearly identical (whereupon the rendition process is simply a logical step or null) to one + where the revisable form image contains much more information than the �nal form image on the display. + This additional information might be useful in zoom, locate, or other display operations. + It is the responsibility of the application to initiate rendition and display operations which create a �nal + form image from a revisable form image and cause it to become viewable. It is the responsibility of + the image extension package (XIE toolkit, lib, and server) to provide rendition services which insulate the + application from device particulars. It is also the responsibility of the image extension package (XIE toolkit, + lib, and server) to provide the means to associate rendered image locations (�nal form) with revisable form + locations (whenever possible). This amounts to providing an inverse to any geometric transform applied + during rendition. Obviously, it is required in order to make screen image pointing operations meaningful. + The server will also provide a means by which a �nal form image may be converted back into a revisable + form image (ie. attributes reassociated with bitmap). Note that the resulting revisable form image will in + general not be identical to the revisable form image from which the �nal form image was derived. + +3.3.2 Image Data Representation + Image data representation is a generic issue which is found across the entire transfer model. Image data + representation during wire transport is chosen for application convenience and transport ef�ciency. Image + data representation during server storage is chosen for server convenience. Image data representation during + screen display is chosen for compliance with display hardware requirements. + Two particularly thorny conceptual issues involve the concept of the "pixel". The �rst one has to do with + what is this logical thing known as a pixel especially as it relates to various data organizations. The second + addresses discrete versus continuous pixel values. + + + + + EXTENSION ARCHITECTURE CONCEPTS 3–3 + 3.3.2.1 Aternate Data Organizations and Pixels + The concept of a regular, two−dimensional grid is central to both the image capture and image display + processes as both image data sampling and image display are done on a regular, two dimensional grid. In + general, the sampling and display grids will not be of the same form or size. We will use the term pixel to + mean a capture or display grid location. This section addresses the association between image information + and pixels. + The relationship between image data representation and pixels is potentially meaningful only at the capture + and display points in the transfer model. The relationship is potentially meaningless at other points in + the model (especially places where image data is kept in compressed format). Most displays prescribe + the relationship between the underlying data that goes into making up a display’s pixel at display time + (i.e. the structure of a pixel). Although it is a convenient concept, it is a mistake to assume that behind + a display screen, the information that goes into lighting up a pixel can be found as a stack of bits. While + some displays do require that all the information which makes up a pixel be gathered together into a bit + string (ie. multiple chrominance channels are gathered together on a pixel basis), others require it to be + separated by chrominance channel. The situation grows more complex when we consider displays which + allow different bandwitdhs per channel between luminance and chrominance channels or just between + different chrominance channels. Thus, the relationship between a pixel (as a display−grid element) and the + underlying image data and its representation is potentially a complex one and not necessarily a one−to−one + correspondence between pixel value, luminance, and chrominance. + For polychromatic or multispectral images, the various representations which provide for either separate or + integrated luminance and chrominance information, and for either equal or different bandwidth (information + content) between luminance and chrominance channels or between multiple chrominance channels creates + a potential mismatch between the front end of the transfer model (before display and "pixels"), and the + backend (at display and "pixels"). For the monochromatic digital image classes, this problem does not + exist. + The X image extension package will deal with both matches and mismatches between image data repre− + sentation structure and content at the display boundary in the transfer model. As such, it will deal with + matches and mismatches in representation (RGB vs YIQ vs ...) and content (equal vs unequal bandwidth + between luminance and chrominance channels, and between multiple chrominance channels). It is the + server’s responsibility to convert from the application representation into a representation and pixel struc− + ture amenable to server based enhancement processing. It is the responsibility of the X Image Extension + Package (XIE toolkit, XIE lib, and XIE server) to provide for the conversion of image data into a format + compatible with that recognized by the display subsystem (rendition process). + +3.3.2.2 Discrete vs Continuous Pixels + This section focuses on the representation of the intensity function for a digital image in the X Image + Extension. In particular, it will examine where in the Image extension the intensity must be discrete + (quantized to a �xed number of levels − integer), and where it may be continuous (in�nite number of levels + − real). + The image concepts sections on capture, synthesis, and representation stressed that digital images are + discrete entities (spatially sampled and quantized). As capture and synthesis are client issues (outside of the + domain of the image extension), the client may do as it wishes, but the image extension encourages clients + to consider only fully quantized 2d arrays as digital images. + This policy becomes binding at wire transport time where transport will only include support for fully + quantized (positive integral valued) digital images in uncompressed formats (the bits represent integer + values of intensity for components), and compressed forms where the bits represent code sequences for + compression schemes. In other words, the wire transport machinery will NOT provide support for real + valued (floating point) image intensities. + + + +3–4 EXTENSION ARCHITECTURE CONCEPTS + This same policy applies within the server at post rendition and display time. Final form image objects + on the server will be integral valued entities. Obviously, rendition implies this as all workstation display + machinery requires this. + It is during revisable form representation of image objects on the server that full quantization and inte− + gral value only may be relaxed. The purpose for its relaxation is the nature of image processing (both + enhancement and rendition). The result of applying an image operator to image data may in some instances + be considered by the user to be a new image, while in others it may simply be considered as a two di− + mensional array of computational data results. The choice is often but not always more a matter of user + perspective and intended usage than of image operator semantics. In particular, many image processing + operations may produce non integral or negative output values. Examples include the arithmetic operators + "divide", and "subtract". + There are two possible solutions to this problem: the �rst is to require that image objects remain fully + quantized at all times, and therefore expressly de�ne the semantics of each and every image operator such + that this is preserved. In the division case, one such policy is to implement only an integer divide which + truncates. A second strategy is to allow real values in server based revisable form image objects and + delay the �nal quantization until rendition time. Obviously, the display device can not deal with these non + integral values, and if these data arrays are to be treated as images for display purposes, at rendition time + the situation must be corrected. + The policy will be to allow image enhancement and rendition operators to produce image objects with real + values (rather than integer). Protocol functions (image operators) which must produce one or the other will + note it in their de�nition. Note that this has no bearing on the integral valued only position at wire transport + and display other than perhaps the potentail need for an explicit quantizing protocol function. + +3.3.3 Layout & Coordinate Systems + Implicit in all display packages are the coordinate systems used by the package and their relationship to + coordinate systems used within the application model. At a somewhat less abstract level are the display + layout problems that an application must deal with and the machinery required to accomplish these layouts. + The next few subsections provide an overview of the extension package coordinate systems and layout + concepts. + +3.3.3.1 Coordinate Systems + By our de�nition, continuous, two−dimensional images (at the focal plane) have dependencies upon two + spatial coordinates (planar), time, and wavelength. This section examines some of the coordinate system + issues involved in the extension package regarding these coordinates. + +3.3.3.1.1 Spatial Coordinate Systems + The image extension package does not provide for any world coordinate system. Therefore, it is not + possible through the image extension protocol to maintain relationships back to real world objects, scenes, + and relationships within them. It is left to those imaging applications that require such capabilities to + maintain and conduct their own conversion from a private world coordinate system to the system of device + and image object coordinates supported by the extension package, and to relate graphic and image display + service requests to a shared world coordinate system. + The image extension package does not support three−dimensional images (depth information) and as + such perspective transforms and all three− dimensional imaging operations must be managed within the + application (above the client). A three−dimensional image application can still use the image extension by + feeding it two−dimensional slices or projections. + + + + EXTENSION ARCHITECTURE CONCEPTS 3–5 + The image extension package uses the device coordinates (screen and window relative) as de�ned by the + core X11 protocol in all display requests. + In addition to this device coordinate system, the extension protocol de�nes an image object (IOB) relative + coordinate system. Regardless of the data organization at transport time, or the internal data organization of + an image object, all image objects have their own integral, two−dimensional, rectilinear, attached coordinate + system. For monochromatic images, there is no confusion, but for situations where the bandwidth between + luminance and chrominance channels differs, or that between multiple chrominance channels differs, the + coordinate systems of the image object applies to the highest bandwidth (biggest) component. All regions + of interest are de�ned relative to the image object coordinate system. + Rendition is the point of alignment or conversion between image object and device coordinates. The + extension protocol provides the means by which a location within a rendered image (expressed in device + coordinates) can be converted back into a location within the revisable form image (expressed in IOB + coordinates) from which the �nal form rendered image derives. This capability will be provided for all + invertable rendition transforms (at least linear geometric transforms). It should be clear that this capability + is essential if an application is to associate what a user sees and points to (�nal form image) with a location + in the revisable form image. + Despite the availability of this coordinate conversion service, application clients may chose to perform their + own mapping back from device coordinates (mouse interrupts) to revisable form image object coordinates. + +3.3.3.1.2 Temporal Coordinate Systems + The extension package has a concept of time sequences of frames (see layout), but does not provide any + temporal coordinate system. As such, an application which maintains a temporal coordinate system (such + as a high−speed photography application), must convert from a time coordinate to an individual frame id or + frame sequence index when dealing with the extension package. + +3.3.3.1.3 Chrominance Coordinate Systems + For reasons which will not be explained here (see ref: CORNSWEET) color images intended for human + consumption are, in general, represented with three independent components. The theory of color spaces is + particularly convoluted and requires a good understanding of the human visual system. There are many sets + of basis vectors for a color three space, or if one prefers, many different color three spaces. + Unlike the two−dimensional spatial coordinates, where standardization upon rectilinear (vs polar) coordinates + is a fairly reasonable thing to do, standardization upon a single color three space coordinate system may not + be as reasonable. Although the computer industry display devices are primarily R−G−B, there are advantages + to representing images in other color three spaces (such as Y−I−Q or H−L−S). One important distinction to + note is that some color spaces maintain a one−to−one relationship between component and spectral band (for + example, R−G−B), while others do not (Y−I−Q). In these latter cases, each of the dimensions of the color + three space is not necessarily a different spectral band. In some cases, these color systems are designed to + separate chrominance and luminance information for representation ef�ciency. + Higher band multi−spectral images (such as n band Landsat images) tend to be of the former nature: each + component maps directly to a single spectral band. + The extension protocol will recognize more than one three space color representation at key interfaces and + support linear (invertable) color three space transforms The extension protocol will rely upon these three + space systems (or protocols) for the relationships between component and wavelength band. + The extension protocol will not recognize images of more than 3 spectral bands, and as such, applications + with N spectral band data (such as Landsat) will be responsible for spectral dimensionality reduction + (potentially accomplished by an application applied transform/mapping or by application band selection). + + + +3–6 EXTENSION ARCHITECTURE CONCEPTS + 3.3.3.2 Layout + Applications which deal with the display of digital images often face a variety of applications speci�c + screen layout issues. Although it would seem that layout is something which is entirely in the realm of a + window manager, there are layout issues which perhaps transcend the bounds of core window management. + The next two subsections present examples of such image layout issues and the policy that the extension + package will adopt. + +3.3.3.2.1 Spatial + Applications often need to display either two images, or an image and a graphics scene, overlaid and + spatially registered. The image extension package looks to the core X package for window overlay + capabilities. Barring availability of these capabilities, the extension package will provide the means to + spatially register and overlay two images from their revisable form through their rendition and display + steps. This is likely to be done through image composition operators (logical point functions). In the case + of graphics and image overlays, barring help from the core X package, the approach will be to convert the + graphics information to an image and then proceed as above. + The approach described above should provide for maintenance of spatial registration under operation of + zoom, pan, and scroll. + The extension package will not provide any speci�c mechanisms in support of "N up" spatial layout or + "tiling" problems. The extension package looks to the core protocol and toolkit levels built upon it for + support of tiling. + + +3.3.3.2.2 Temporal + Some image applications deal with time sequences of images. In a time sequence, the image subject state is + changing with time, but the basic subject is the same (ie. a time lapse sequence of a flower as it blooms, or + a sequence of heart radiological images as it pumps blood). While the extension package does not provide + a temporal coordinate system, it will support the concept of a time sequence of spatially registered images, + and provide for control over the time delta between time sequence frame displays. + The slide carousel is the basic mechanism for organizing a time sequence. The slide carousel will contain + �nal form images (X displayables or pixmaps) produced by rendering revisable form images. Optional + references back to the source revisable form images may be kept. The image extension package will + provide mechanisms for playing the time sequence with uniform time spacing, or single stepping under + application control. Direction of play is also under application control. + A very signi�cant subset of time sequence problems is the display of live video. Live video consists of + the display of 30 still frames per second. Considering the size of individual images, a few seconds of live + video would require more memory than most workstations posesses. Typically, in live video applications, + the source images will be supplied from a digital image disk, or digitized from an analog source such as a + tv camera or vcr by a frame grabber in the server. The temporal layout machinery will give consideration + to the support of this special class of time sequence image applications. + + + + + EXTENSION ARCHITECTURE CONCEPTS 3–7 + 3.3.4 Image Structure − Subsets + Computer displays present users with screens full of information. Within any screen or window, there are + established rules for identifying smaller elements when the contents derive from underlying text or graphics. + Text and graphics information (visual information which is represented on computer systems via text and + graphics protocols) have syntactic objects (characters, words, paragraphs, lines, arcs, ...) which the user is + familiar with and which can be used to identify a component of a screen. + When the screen contents represent an underlying digital image, no such user familiar, underlying syntactic + structure exists. Instead, it is replaced by the concept of identifying portions or proper subsets of the + complete image. These subsets are used to identify areas that will be operated on. There are two proper + subsets: regions of interest, and control planes. A region of interest is a fully connected subset of an image + such as the contents of a rectangular area within the image, while a control plane determines membership + in the subset on a pixel−by−pixel basis. A control plane maybe heavy or sparsely populated. + The extension protocol supports the de�nition and use of both regions of interest and control planes for + operations on connected and disconnected subsets of a complete image. + + +3.3.5 State Information − Process History + Other than the information required to associate display locations (coordinates) with image object coordi− + nates (for pointing problems), the server will not maintain any processing history information. It is left to + the client to maintain this information if so required. + + +3.3.6 Extension Relationships +3.3.6.1 To Core X + The X image extension will be accessed through the core X server as prescribed by the core X protocol + extension mechanism. The extension will make use of core x resources where ever possible (such as + drawables, pixmaps, and clipping regions), but the policy is not to extend existing (core) resources with + regards to either content or semantics. + Where extension would be required, the image extension will de�ne private resources necessary to support + the speci�ed functionality. For example, rather than attempt to extend an already complicated structure such + as the graphic context (GC) with new �elds, or new meanings for existing �elds, the extension package + de�nes its own resources for rendition purposes. While this entails some duplication of information, + percentage wise, the amount of duplication is very very small when compared with a 1 MB revisable form + image, and no control confusion is likely to arise. + +3.3.6.2 To Other Extensions + It is more than likely that an application may require access to multiple extension packages at the same + time, such as a graphics and image extension. Control over concurrent residency of multiple extensions + to the server is under core X. While exchange of information between multiple concurrently resident + extensions is always possible via the client, this approach is potentially inef�cient due to wire transport. + The image extension package includes import/export services which provide a limited means of exchanging + information (primarily rendered image data) between the image extension and another extension through + core X resources. + + + + +3–8 EXTENSION ARCHITECTURE CONCEPTS + 3.3.6.3 Multiple Connections, Clients, and Resource Sharing + Following the guidelines established by the core X protocol, the image extension will support sharing of + resources between multiple connections from the same or different client. Multiple connections (from the + same or different application clients) may reference the same resource (ie. resource handles will be server + globals rather than connection globals). Managing the sharing of server resources and all rami�cations is a + client problem. See the appendix for a more detailed discussion of applications interchange of image data. + +3.3.6.4 To Text and Graphics + As was stated earlier, text, graphics, and images are simply different data protocols and sets of services for + visual information managed on a computer. While many applications will need to wield all three sets (text, + graphics, and images) to visually display what they wish to communicate, the integration of text, graphics, + and image services under X are outside of the scope of this work (the X image extension protocol). + In addition to not solving the integrated approach to the use of X based text, graphics, and image services, + the X image extension package will not provide ANY text or graphics services. Applications should lokk + to core X11 or graphics extension packages for such services. + The author recognizes that at the display memory level, what has been referred to as text, graphics, and + image all looks the same: simply display memory bits in various states. The intension of the X image + extension package is not to subsume text and graphics because of this apparent uni�cation of representation + at the display memory, but rather to deal only with image data protocol elements in the transfer model + before the display memory which the traditional text and graphics data protocol services have ignore. + + +3.4 Service Concepts + + This section explores in more depth the reasoning behind and implications of the service goals and the + highest level organization of the services. + +3.4.1 Service Goals − Reasoning & Implications + The introduction touched briefly upon the functional goals of the proposed image extension. The next few + subsections present these goals and their implications for the extension package in more detail. + + +3.4.1.1 Range of Images + The proposal calls for integral support for applications requiring display services for the following classes + of images: + • Static bitonal digital image data (black and white) + • Static continuous tone monochromatic digital image data (gray scale) + • Static multi spectral digital image data (color) + • Time varying versions of the above + + The digital representation of these images (digital image classes vs human visual types) will vary widely + regarding the amount of luminance, chrominance, spatial, and temporal information. + + + + + EXTENSION ARCHITECTURE CONCEPTS 3–9 + The image domain boundaries implied above are somewhat arti�cal in that they have been established + partially by human visual perception attributes and by the applications that they are an integral part of + (such as facsimile or television). In reality, there is a continuum of images and image attributes out of + which applications have concentrated on a few important subspaces. It is also a fallacy to think that all + applications are con�ned to only one of these classes as many signi�cant applications (such as publishing) + cross the domain boundaries. + Because the domain boundaries are arti�cal, and because applications must be able to work across these + domains, the extension package must unify the representation and handling of the images in these various + domains. The implication is that the extension must support a uniform and robust image data representation + at least at key interface points, and that there will not be separate service packages for each of the domains. + +3.4.1.2 Range of Applications Needs + The X client component of image applications will demonstrate a wide range of image needs to the X + servers. The range will likely span simple image display of bitonal images through highly interactive + processing and analysis of continuous tone and multi−spectral images. + The extension package must not force an application to operate at any particular service level, but rather + (like other layered and open systems) allow the application access to both low level basic, and higher level + layered services. The extension must not offer separate packages for the various degrees of need. + + +3.4.1.3 Range of Server Capabilities + X servers are likely to vary widely in their ability to support imaging client needs. These variations may be + due to varying server hardware platforms (virtual and physical address space, computational horsepower). + With limited virtual address space, processing power, and display hardware on some hosts for imaging + servers, it may be impractical to attempt to support certain imaging client needs. + As the image extension architecture is intended to unify image extensions to X across all X servers, and as + it is clear that there are underlying reasons why all servers will not be able to offer all image capabilities, + the extension proposal introduces the concept of service sets. Service set is a compliance mechanism + whereby the architecture speci�es what imaging capabilities must be available through the server for a + particular set. + Service sets are not functionality hierarchies. Instead, they represent different functional areas that a server + may or may not be able to provide for. A server must support at least one service set (set #1) to be + considered an image extension server. A server may support other services sets including any combination + of the other service sets. The following is a summary of the service sets: + • Set 0: transport services, rendition services + • Set 1: enhancement services + • Set 2: processing pipelines + • Set 3: real time image capture + + + + +3–10 EXTENSION ARCHITECTURE CONCEPTS + 3.4.1.4 Display Device Independence + The overall transfer model set forth in Chapter 2 is not an invention of the extension package, but rather + an observation of the process which underlies the capture and display of digital images in all systems. The + model is sometimes obscured in actual practice by steps being combined (tightly packed) or even missing + (null). + In the past, image applications have been intimate with display devices and the display device characteristics + propagated or permeated back into the actual application. Examples of this are applications which keep + basic image data with characteristics (pixels, scan lines, spectral bands) which match the display device + capabilities rather than those deriving from the source device or synthesis process. + While display device independence for the client is not an explicit goal of core X, it is deemed a meaningful + goal for the image extension package. Display device independence implies that application client image + data need not be in a format related to display device characteristics and the application client need not + understand or implement the rendition process. This is not to say that rendition is no longer a device + dependent process, but rather to say that it is now the headache of the image extension package rather than + the client. + + +3.4.1.4.1 Server Based Rendition + A major implication of display device independence is that the X Image Extension Package (XIE Toolkit, + XIE Lib, and XIE Server) will need to understand and implement the device dependent rendition process. + This does not mean that the video subsystem (actual display hardware) must understand and perform + rendition, nor does it mean that the complete understanding and implementation at a high level of rendition + is on the server side of the wire. It does mean that the X image extension package is responsible for + rendition and that server based primitives will exist which can be used under the direction of the X image + extension toolkit to implement high level rendition models. This includes rendition which preserves + and which crosses digital image classes. Rendition will likely include scaling (up and down), x−y and z + resolution conversion (up and down), device luminance corrections (gamma − tone scale adjustment), and + mono−poly chromatic conversions. + Relief from understanding and implementing the rendition process can result in signi�cant complexity + reduction bene�ts to the application client. It will also allow image applications access to a much broader + set of display devices with different characteristics with no additional application knowledge or cost. + Figure 4−3 graphically depicts the basic shift in the wire location and the fact that rendition processing has + moved from the client to the server side of the wire. (see appendix for more on rendition in the X Image + Extension). + +3.4.1.4.2 Image Data Organization + The organization of image data depends both upon the digital image class and the application. The goal is + to allow the application to use an optimal image data format rather than project the device format back into + the application. The burden should be on the server to convert from application selected data organization + to server preferred format. + The implication is that the client chooses one of several image data organizations (for the raw data + component of a revisable form image − attribute format is common), and the server complies at the wire + with that format. The supported PCM or raw image data formats are touched upon in the chapter on + extension protocol elements (transport class services). + + + + + EXTENSION ARCHITECTURE CONCEPTS 3–11 + 3.4.1.5 Image Data Transport + Image data transport is the movement of image data across the X wire between client and server. The + transport may involve the movement of uncompressed (PCM) image data in the application client chosen + image data organization, or compressed forms. The transport may also be monolithic or segmented at the + application client level. + +3.4.1.5.1 Image Data Compression + Because the extension package pushes image rendition processing across the X wire into the server, + revisable form images often will move across the X wire. These revisable form images will often be much + larger than the �nal form images which are displayed. An example is sending a digital image of an E size + drawing which was sampled at 200 dpi across the wire. This revisable form image is approximately 7.5 + MB in size. The rendered image which will �t on a 1k by 1k by 1b screen is approximately 150 KB in + size. Clearly, when the X wire is physical, there is a need for image compression in at least the transport + services. There may also be value for compression of revisable form images in image storage within the + server. + Support for image compression in wire transport is central to the X image extension package. Standard + image compression schemes will be implemented on both sides of the wire and used to optimize transport + when the wire is physical. There are compression standards in place (or under development) which should + be complied with, and that image compression algorithms or approaches are digital image class dependent. + While transport will make use of compression for ef�ciency, the PCM data organization selected by the + application client is recovered on both sides of the wire via decompression. In other words, compression is + applied to the application client selected PCM format. + + +3.4.1.5.2 Transport Granularity + At the application client level, the image extension will support transport ranging from monolithic to + segmented. + Monolithic transport implies that the entire image (PCM or compressed version of the application client + chosen format) will be transported across the wire as an atomic (un−interruptable) event. + Segmented transport implies that the application client may send the image across in a piecemeal fashion + where the segments are regular pieces such as scan lines or scan line blocks (tiles), chromatic components, + or luminance planes. Each segment is in either PCM or compressed version of the application client chosen + format, and each segment will be transported across the wire as an atomic (un−interruptable) event. The + image extension server will understand how to reassemble the image segments into a complete image. + Segmented transport allows other X operations to be interleaved with the transport of an image (including + event interrupts and servicing). A particularly useful instance of this is an application which uses a + transport, render, display pipe to �ll a display screen in a continuous fashion as it sends image segments + across the wire. The screen begins to show image display as the �rst segment emerges from the pipeline + versus waiting until the entire image has been completely transported and the entire image has been + completely rendered before displaying anything. + Both monolithic and segmented transports are asynchronous (application client starts and is noti�ed of + completion). + + + + +3–12 EXTENSION ARCHITECTURE CONCEPTS + 3.4.1.6 Image Processing + As stated in the image concepts section, image processing is the application of image operators to image + data. Image processing is divided into three broad classes including restoration and enhancement, analysis, + and coding. + In the extension package operational model, image processing will potentially be applied at a number + of points including transport across the wire (where compression or coding processing may be used), + enhancement processing, and rendition where preparation for display occurs. + Support in the extension package for coding or compression processing has been touched upon in the prior + section on compression. + Support in the extension package for image processing used in the rendition process has been touched upon + in the prior section on rendition. + The following subsections deal with support in the extension package for enhancement and other forms of + image processing, and with the relationship between rendition and enhancement processing. + +3.4.1.6.1 Enhancement Processing + Image enhancement processing is technically the application of image operators to image data solely for + the purpose of increasing the viewability of an image. The metric for increased viewability is determined + by the viewing application and the user. Examples of basic image enhancement processes include contrast + enhancement and edge sharpening. + Because the metric for enhancement is in the eye of the viewer, enhancement is often a trial and error, or + interactive and iterative process. Interactivity depends upon speed of iteration, and this speed is often a + function of process distance from the display end of the transfer model pipeline (especially when the X + wire is physical). This is a key reason for including some enhancement processing in the server. + Enhancement processing is a very large �eld with a potentially in�nite number of recipes for visually + enhancing an image. As such, attempting to incorporate robust support for enhancement processing in the + server is a dif�cult problem. Once again, the server will implement a set of primitives which support many + enhancement techniques, thus pushing the extensibility issue for enhancement into the tool kit level. + +3.4.1.6.2 Rendition Processing + Rendition services provide default schemes or models for client image rendition which are compatible with + the display situation. The models seek to maximize visual �delity between the original captured or syn− + thesized image and its display on the target display device. Some control over �delity is provided through + the alternative rendition models. These schemes are atomic (indivisable) from the client’s perspective, yet + typically involve multiple low level image rendition processing steps such as scaling (x−y, and z), rotation, + cropping, and image class conversion. While the rendition models are independent of display device, the + rendition process is highly device dependent. + Rendition services explicitly recognize rendition within and across image classes (monochromatic bitonal, + monochromatic continuous tone, and poly chromatic continuous tone or multi spectral). While the intent of + rendition services is to relieve the client of all concerns regarding mismatch between revisable form image + and display device capabilities, it is felt that the protocol must afforded the client some control over cross + class image rendition as it has a signi�cant bearing upon visual �delity, and upon complexity of the server + rendition machinery. + Clients which �nd the default schemes insuf�cient or unacceptable are free to assemble enhancement + processing routines into rendition pipelines of their own de�nition. + + + + + EXTENSION ARCHITECTURE CONCEPTS 3–13 + 3.4.1.6.3 Enhancement − Rendition Relationship + The relationship between enhancement and rendition processing is somewhat indistinct especially when + one recognizes that enhancement and rendition processing may share low level operators, and when one + allows (as the extension package does) the client to generate a revisable form object from a prerendered + image via import services. As such, the distinction is based more upon purpose (rendition is device speci�c + processing that creates a �nal form image which is compliant with the output device, while enhancement is + relatively device independent) than anything else. + +3.4.1.6.4 Other Forms of Processing + The labels enhancement, coding, and rendition do not cover all the uses of image processing in the + extension server. There are instances where an application will need to apply an image operator to image + data to change its state for purposes other than coding, enhancement, or rendition. + As an example, consider a progressive transmission application (such as low bandwidth teleconferencing) + which chooses to optimize the use of interconnect bandwidth by sending image data to the destination + (receiving) extension server one plane at a time (most signi�cant �rst) so that a progressively better image + develops. In this case, the application will need to combine the planes as they become available within + the extension server (server side of the wire) if the bandwidth savings are to be realized. In this case, + combinatorial operators will be required. + Fortunately, most of the operators required in this "other" category are usually deemed essential for image + enhancement purposes. They are pointed out here more as additional justi�cation for their presence. + + +3.4.1.6.5 Processing Policy + In addition to the coding (compression) and rendition processing, the X image extension protocol will + support a closed, minimal and primitive set of image processing (enhancement) functions. The X image + extension package will provide for higher level extensibility through the X image extension tool kit. + Closed means that there will be no extension mechanism which allows a user to either add new image + processing algorithms to the package or downline load them (other than the pipeline macro facility). + Closure ensures that a population explosion does not occur and that incompatibilities do not develop. + Minimal and primitive means that the protocol will only implement low level functions which do not + overlap in purpose, and upon which client side components can build higher level services. As a simple + example, convolution �ltering will be implemented in the protocol, but commonly recognized imaging + services which can be built upon �ltering capabilities such as median and sharpening �lters will be + relegated to higher level client side components such as the X Image Extension Tool kit. As such, readers + who are looking for defacto imaging industry standard services should look to the X Image Tool Kit. The + protocol must be suf�cient to be able to build these higher level services upon server side processing. + Enhancement processing is often presented in terms of achieving a desired effect and then in terms of + approaches to achieving the effect. Approaches to achieving the desired effect is often broken down into + techniques and implementations. As those familiar with signal processing know, signal processing is often + accomplished in any of several data domains. These domains are roughly categorized into two classes: + spatial and spatial frequency. In the spatial domain is we operate on PCM data which is representative of + the luminance and chrominance of an image, while in the spatial frequency domain, we operate on ampli− + tude coef�cients of bases vectors such as Fourier bases vectors (Fourier Transform). Many enhancement + processes can be implemented in either of these two domain classes. + + + + +3–14 EXTENSION ARCHITECTURE CONCEPTS + While spatial frequency or transform domain processing is an extremely important approach in digital + signal processing, and some workstations (servers) may have hardware which support it, it is felt to be + outside the realm of reasonability to expect such support of main stream servers at this point in time. As + such, no explicit protocol functions will exist which require or imply transform domain processing support. + Examples of the implications of this policy include that the protocol at this time will not include machinery + which supports the exchange of discrete spatial frequency domain �lter coef�cients or analytic spatial + frequency domain �lter descriptions, or coef�cient rooting techniques for histogram modi�cation. + This position on spatial frequency domain processing is flexible in that many important image enhancement + processes are de�ned in terms of spatial frequency domain processing. If this position is reversed, the + following classes of protocol functions would likely be added: + • perform various transforms (Fourier, DCT, Hadamard, ...) + • perform arithmetic operations on transform data + • generate statistical information about transform data + • apply template (area) functions in transform domain (�lters) + + It is expected that analytic transform domain �lters would be implemented at the X image extension tool kit + level. + Note that the current position (no spatial frequency domain support in the protocol) does not imply that + servers may not use transform domain approaches. For example, a server with 2d−FFT capability may chose + to implement convolution with large kernels in the transform domain. + All server based image processing functions (enhancement and rendition other than the �nal step in a + rendition process) will produce image objects. These image objects may posess integral or non−integral + (real) values. Protocol functions (image operators) which must produce one or the other will note it in their + de�nition. These resulting image objects may be considered as true images which the user will eventual + view, or simply computational data arrays which store temporary computation information and are discarded + without viewing by an end user. The extension package does not distinguish them. The extension package + will provide a function to integerize and quantize (force integral values). + +3.4.1.7 Operations Pipelining + Image extension server operations are categorized into transport, enhancement, rendition, and display. To + some extent, these represent steps that an image must pass through to get from the application client to the + display. While these operational classes can be cleanly separated, and an image moved through them by + completing each step on the entire image before beginning the next step, it is often useful to move a single + image through them in a pipelined fashion. + In pipelines, part of the same image may be in the �rst step while another part may be completing the last + step. A very useful pipeline is the transport−render−display pipe where a segmented image is moved across + the wire and to the display in a continuous fashion. + Pipelining has a number of advantages. First, it allows the client application to assemble multiple syn− + chronous steps which are likely to be used over and over (macros). Second, in cases where display is + part of the pipe, it feeds out visual information as it becomes available rather than waiting for step wise + completion. Third, as multiple processors become available in workstations, it allows for some degree of + parallel processing as different pipe elements can be executed on different processors. + The image extension package will provide for the de�nition and execution of process control pipes. + + + + + EXTENSION ARCHITECTURE CONCEPTS 3–15 + 3.4.1.8 Server Display Hardware Control + The X server is of necessity intimate with the display device. In the past, applications have been intimate + with the display device (through a driver) and have often had sole access to it (non−shared resource). + Display devices (video subsystems) include scarce resources (such as physical lookup tables, display bitmap + memory, display controls, specialized processors) which must now be managed as shared rather than an + application private resource. + Whenever possible, these resources should be accessed indirectly through protocol functions which involve + their use rather than direct access protocol functions designed to provide remote control register bit diddling. + But, when there are no protocol functions which serve this purpose, and access to these resources is still + essential to applications, direct access protocol functions should be provided. It is still important in these + cases that these direct access protocol functions provide access to logical resources which are mapped by + the server to the physical device resources so that the physical device resources remain sharable. + The following subsections examine some speci�c instances and assert extension package policy regarding + these video subsystem resources. + +3.4.1.8.1 Shared Hardware Device Control + There are a set of display hardware resources and controls which are important to imaging applications. + These include look up tables (luts), display memory (bit map), pan and scroll registers, and brightness, + contrast, hue, and saturation registers. + On todays workstations these consist of a single set of resources and controls for the entire display (ie. one + physical set which must be shared by all concurrent screen users). In future workstations, there may be + multiple sets perhaps allowing one per window. Access to these device controls cannot be hidden behind or + within more general protocol functions. + The core protocol has addressed access to and control over some of these while others have been left + unexplored. As all affect the display of anything on the screen (text, graphics, images), they should all be + dealt with by the core protocol. + The image extension will use core protocol mechanisms where they exist, and will follow the core protocol + in de�ning a logical to physical relationship for the others. It is hoped that anything that the X image + extension must do in this area would migrate into the core X11 protocol over time. + + +3.4.1.8.1.1 LUTS and Bit Map + The core protocol de�nes a scheme for maintaining multiple logical sets of lookup tables, and the means + for associating (loading) the physical tables from the logical tables. This scheme, and potential extensions + to it for displays with multiple LUTs, will be used by the extension package. + Likewise, the extension package will rely upon the core protocol machinery for access to the display bit + map. + +3.4.1.8.1.2 Brightness − Contrast − Hue − Saturation + Many of the current crop of imaging frame buffers provide software access to hardware which controls the + overall settings for brightness, contrast, hue, and saturation. In essence, this is digital access to the knobs + on a television. + The extension package will again provide a logical to physical mapping and access to these controls. + + + + +3–16 EXTENSION ARCHITECTURE CONCEPTS + 3.4.1.8.2 Use of Image Speci�c Accelerators + Server platforms and display subsystems may both have special silicon accelerators useful in various image + operations such as compression / decompression and rendition. It is left to the discretion of the extension + server implementor if and how to make best use of these accelerators. But, the extension protocol calls for + noti�cation of the client (upon request) by the server of accelerator assist for various protocol functions. + Regarding access by the client to these accelerators, the policy is that hardware accelerators used by + protocol supported operations should not be made explicitly available through control requests. They are + simply used locally by the server on the client’s behalf and without the client’s knowledge. + +3.4.1.8.3 Image Capture Hardware − Live Video + The core X protocol provides for human interface and interaction mechanisms. This includes the means to + pass information from input devices such as keyboards and mice on to the client side of the wire where the + application decision is made regarding its impact on operations or display. + In certain instances, there may be very close proximity between image capture and display hardware. + In these cases, the capture device may be controlled through the same hardware interface as the display + subsystem and may actually digitize an image and deposit it directly into the display memory (RS170 frame + grabber and frame buffer display memory typically share board space and bus interface mechanisms). + As the capture of an image is not strictly a human interaction or signaling mechanism such as keyboard + input or mouse pointing, a hard line position is that image capture devices should not logically be on + the server side of the X wire. But, the tight coupling or intimacy of such capture devices with the + display makes it at least convenient to provide control mechanisms in the protocol. Support for control of + time sequences of digitized images which derive from analog video sources (cameras, vcr’s, broad band + broadcast...) and pass through the digital domain on the server via frame digitizers, make it a requirement + that the control mechanisms be in the protocol. + As such, the policy is that the extension package will provide protocol mechanisms (control requests) for + image input devices (such as frame grabbers) which are tightly coupled to the display hardware (accessed + through common hardware interface and sharing display memory). These mechanisms will support the + windowing of the video information into X windows. This is in line with the concept of a tightly packed + "capture−>render−>display" pipeline and time sequence support. + The policy will allow control over tightly coupled image capture devices (frame grabbers) and live video + windowing (video rate time sequencing) to occur under X. Video from digital or analog sources which + can be presented to the display subsystem at video frame rates in DIGITAL (vs analog) format and can be + converted back to analog format by the display subsystem in a way which is compatible with the display + refresh mechanisms, can be displayed in application speci�ed X windows. The policy will NOT support + analog video windowing (switching / mixing analog video in the display subsystem, control over analog + broadcast video equipment etc.). + Applications which should bene�t from this capability are those which use video information (time + sequences of individual frames) which derives from a camera or perhaps a laser disk, and which is in + digital format already, or is converted by devices such as frame grabber/digitizers into digital format within + the server display subsystem. + Note that this position still leaves loosely coupled image capture devices which happen to be plugged into + an open bus on the server node (such as document scanners) on the client side of the wire (they will not + be supported in the image extension protocol). It also leaves the computer interfaces (typically rs232 serial + line ports) of video source devices such as "video disc players", vcr’s, video tuner’s, etc. on the client side + of the wire. + + + + + EXTENSION ARCHITECTURE CONCEPTS 3–17 + 3.4.1.8.4 Extensibility + The core X system wisely provides the ability to extend itself into various application domains. The image + extension package is one such extension into the imaging application domain. + In order to be useful, the imaging extension package must also provide for growth and extension. Perhaps + the most troublesome area for the extension package is image enhancement processing where the number + of algorithms, approaches, and combinations is limitless. Providing an open extension mechanism at the + protocol level for this area is inviting disaster. + Instead, the policy will be to attempt to achieve consensus regarding what is the basic processing machinery + necessary to support multiple enhancement approaches. This machinery will reside on the server side of + the wire and be accessed through the wire protocol. The server side processing machinery will be kept to a + very basic level and no extension mechnicanism will be provided. + Flexibility is achieved through the use of parameters for this machinery, through the ability to build higher + level enhancement processes with various combinations of the machinery, and through low level support for + these macros on the server side in terms of "process pipelines". + The extension capability will be provided at the tool kit level where the problem of a potentially explosive + number of "my favorite image enhancement process" can better be dealt with. + +3.4.2 Client−Server Model + The image extension follows the core protocol in the use of a client−server model. Functions which + the server performs on behalf of the application client are known as services. Although most services + accomplish things which an application cares directly about, some services involve the overhead of the + client server model and potential physical separation. + +3.4.2.1 Server Resources + Within the client portion of the application, the application maintains private data structures for storage of + image data, and applications state and control information. Within the server portion of the application, + objects which are maintained and used by the server in providing the services, and are known about by the + client, are referred to as resources. The extension package resource concepts are presented in the chapter on + extension protocol elements. + +3.4.2.2 Service Classes + A taxonomy of imaging services may be organized at the lowest level into CLASSES based upon com− + monalty of purpose, and organized at the highest level into GROUPS based upon device dependence. This + section simply sets down the aggregation. The next chapter explores the contents in more detail. + + + + +3–18 EXTENSION ARCHITECTURE CONCEPTS + Figure 3–2: SERVICE CLASS GROUPS + + + +−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ + | DEVICE INDEPENDENT | DEVICE DEPENDENT | + | IMAGING SERVICES | IMAGING SERVICES | + +−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ + | . session | . device control | + | . resource | . rendition | + | . transport | . display | + | . enhancement | | + | . process control | | + +−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ + + + Within the X image extension server, imaging service classes may be grouped into two major categories: + those which are device independent, and those which are device dependent. Although all service imple− + mentations may in some way depend upon the device they reside upon, some services require intimate + knowledge of the display and display processing subsystem to perform their job, while others do not. As + such, it is service dependence upon intimate knowledge of the display subsystem that is the metric for + group categorization of the services. + Although there is a logical relationship (in terms of position within the X model levels diagram) between + the two service groups, the physical relationship is not quite as simple as all device independent services + being built upon the device dependent services. In fact, to a large extent, the device independent services + are not built upon the device dependent services. + +3.4.2.3 Service Events + All core protocol event mechanisms will be available to image extension package users. In addition, a set + of image extension package speci�c events will be available. There is no relationship between these two + sets of events other than that established by an application. Image speci�c events are discussed briefly in + the chapter on extension protocol elements. + + +3.5 Transfer Model vs X Wire + + The image transfer process depicted in Figure 2−1 shows how continuous images are captured, and how + captured and synthesized digital images move through enhancement, and rendition processes towards + display. Figure 4−3 shows the location of the core X protocol wire and the extension X protocol wire with + relationship to stages of the transfer model. + There is a signi�cant shift of the X protocol wire between the core and the extension protocol with regards + to the transfer model. Based upon the guidelines set forth in the previous section, the extension protocol + moves rendition processing (which is a display device dependent function) across the wire into the server. + The extension also lets those elements of interactive enhancement move across the wire. + + + + + EXTENSION ARCHITECTURE CONCEPTS 3–19 + Figure 3–3: TRANSFER MODEL & X WIRE LOCATION + + FLOW CONCEPT + real world + object or scene + | + | image formation + v + continuous Human Visual Perception + image "Visual Types" + | + | sensing/digitization + | analog image + .................|.............................................................. + | digital image + SYNTHESIS CAPTURE + | | + | | ^ image data pulled back by client + +−−−−−+−−−−−+ | + | | compression / decompression + xxxxxxxxxxx+xxxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx extension x wire + | | compression / decompression + v | + +−−>digital−−−−−−−−+ Revisable Form Image + | image Representation Efficiency vs Fidelity + | | Digital Image Classes + | | + | | enhancement Interactive Enhancement Processing + | | + +<−−−−−+ + ^ | + | | rendition Rendition Processing + | | + +−−−−−−+ + | Optional Compression + xxxxxxxxxxx+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx core x wire + | Optional Decompression + +<−−−tightly coupled + | capture devices + | + v + digital Final Form Image + image Rendition Fidelity + | digital image + ...........|.................................................................... + | analog image + | display + | + v Human Visual Perception + screen image "Visual Types" + + + + +3–20 EXTENSION ARCHITECTURE CONCEPTS + Chapter 4 + +EXTENSION PROTOCOL ELEMENTS + + + This chapter presents an overview of the extension protocol including service classes, server resources, and + an operational model. + + +4.1 Services + + Services are the functions performed by the server for the client. In the protocol, they are implemented as + client requests. Some of the services listed below are potentially provided by or through the use of existing + core protocol services (such as resource class services). They are listed here for completeness. + +4.1.1 Device Independent Service Group +4.1.1.1 Session Class Services + Session class services establish the bounds and semantics of an image extension client−server session. Key + activities such as server initialization and termination, as well as issues such as server capabilities and + temporal scope of service requests are involved in session class services. + Examples (non−exhaustive list) of session class services include: + • Connect to extension server + • Disconnect from extension server + + +4.1.1.2 Resource Class Services + Resources are a means by which important operational information may be organized by the server and + accessed by the client. To some extent, they represent both housekeeping and an organizational strategy. + Examples of resource class services include: + • Create resource + • Delete resource + • Modify resource + • Query resource + • Copy resource + + + + + EXTENSION PROTOCOL ELEMENTS 4–1 + 4.1.1.3 Transport Class Services + Transport involves the movement of image objects across the X wire. This movement is both incoming + (client–>server) and outgoing (server–>client) image data. + Ef�ciency and convenience are key concepts in transport services. Ef�ciency involves the support of + encoded (compressed) image data, while convenience involves the ability of the client to specify image data + formats, and to break complete image transport into multiple steps. + Transport processing includes the movement across the wire of both PCM (uncompressed) and compression + encoded image data, and the actual encoding and decoding of this data by both client and server. + Supported PCM formats include: + • FULL_PIXEL_COMPATION + • PARTIAL_PIXEL_EXPANSION + • FULL_PIXEL_EXPANSION + + Supported Compressed formats include: + • CCITT Modi�ed Huffman and Modi�ed Modi�ed Read + for bitonal data and continuous tone monochromatic/polychromatic + in FULL_PIXEL_EXPANSION mode + • Discrete Cosine Transform + for continuous tone monochromatic/polychromatic + in PARTIAL_PIXEL_EXPANSION mode + + Refer to the chapter on lexicon for more details of these formats. + Examples of transport class services include: + • Send image object to server + • Receive image object from server + +4.1.1.4 Statistics Class Services + Statistical information about image data is often used in enhancement processing strategies and operators. + Statistical services do not modify image data, but rather generate statistical information about image data. + In certain instances, the statistical information maybe calculated on a pixel by pixel basis and may itself + be stored in a server−based destination image object. The resulting "statistical image" maybe used in + enhancement processing operations. + Examples of statistics class services include: + • Calculate Statistical Moments + • Area Minimum + • Area Maximum + • Area Mean + • Area Median + • Standard Deviation + • Variance + • Generate Histogram + + + +4–2 EXTENSION PROTOCOL ELEMENTS + Due to the potentially unbounded nature of enhancement processing, enhancement class services will be + restricted to include only a minimal set of basic enhancement processing machinery that will support + multiple enhancement approaches. Parameters and application of this machinery will be left to the direction + of the toolkit and application client levels. An example of this approach is to include �ltering capabilities + (spatial convolver) but not the �lters themselves. + +4.1.1.5 Enhancement Class Services + In the enhancement processing of an image, the server uses local server hardware to apply image processes + to the image data in the server−based source image object. The result of the operation is stored in a + server−based destination image object which may be the same as the source image object. + An important enhancement concept is that both the input and output of the enhancement services are + revisable form image objects. Thus, the results of an image enhancement operation may be fed back + into other enhancement operations, made available for transport back to the client, or made available for + rendition processing. + Enhancement processing is a particularly rich and popular area. While the X image extension package tool + kit will be the home for many high level image enhancement processing algorithms and processing macros, + the wire protocol for enhancement services will be kept minimal. Examples of enhancement class services + include: + • Point Processing + • Algebraic + • Logical + • Luminance + • Area Operators (Filtering) + • Geometric Transforms + + Due to the potentially unbounded nature of enhancement processing, enhancement class services will be + restricted to include only a minimal set of basic enhancement processing machinery that will support + multiple enhancement approaches. Parameters and application of this machinery will be left to the direction + of the toolkit and application client levels. An example of this approach is to include �ltering capabilities + (spatial convolver) but not the �lters themselves. + +4.1.1.6 Process Control Class Services + The server will support pipelining and interleaving of atomic server operations. This provides a home + for the very useful and everyday concept of tightly coupled transport–>render–>display, as well as more + elaborate concepts such as interleaving enhancement, rendition, and display of large image objects, and + enhancement processing macros. + The image extension will suport both primitive pipelines (ones which contain only references to atomic + protocol functions), and nested pipelines (ones which reference other pipelines). + With process control, the interleaving of many mundane operations can be ef�ciently represented and + performed on the server side. The inclusion of pipeline control operators will provide for unattended and + client intervention (interactive) pipeline execution. + Examples of process control services include: + • Create pipeline + • Delete pipeline + + + + EXTENSION PROTOCOL ELEMENTS 4–3 + • Modify pipeline + • Query pipeline content + • Query pipeline state + • Execute pipeline + • Terminate pipeline + +4.1.2 Device Dependent Service Group +4.1.2.1 Rendition Class Services + In the rendition of an image, the server uses a combination of local server software and hardware to apply + rendition operations under the direction of XIE toolkit based rendition models to the image data in the + server−based source image object. The particulars of these operations depend upon the state of the image + object, the display characteristics, client requests, and the rendition models. + Rendition services are designed to offer the client substantial flexibility. Rendition services are divided into + two classes: rendition functions which prepackage commonly used rendition models and offer the highest + possible �delity (�ll screen, �ll window, preserve aspect ratio); and rendition functions under complete + control of the client. The former services are packed in XIE toolkit functions. The latter case allows the + client to control (override) default operation in order to prevent the "too smart by half" syndrome (server + keeps client from rendering the image the way the client wants it, because server thinks it knows better). A + null rendition function is also included. + Low level (server based) rendition processing functions take a revisable form image and produce another + revisable form image. High level (XIE toolkit based) rendition processing functions use the low level + functions in processing pipelines. The last step in these high level pipelines is exporting the revisable form + image into a PIXMAP which is considered to be a �nal form image. The �nal form image is suitable only + for display purposes. It is possible to convert a �nal form image back to a revisable form image via the + import/export class services (see next section). + Examples of high level (XIE toolkit based) rendition services include: + • Render best (rendition �delity) + • Render this way + • Render to �t object in window + • Render at real size (whatever �ts) + • Render preserving aspect ratio + + Examples of low level (server based) rendition services include: + • scale + • rotate + • crop + • dither + + + + +4–4 EXTENSION PROTOCOL ELEMENTS + 4.1.2.2 Import/Export Class Services + It is expected that at least the core X protocol and services will be coresident with the image extension + protocol and services, and that other extension packages may be resident as well. Many applications, such + as compound document editors, may have need of multiple domain extension packages at the same time and + it is quite reasonable to expect an application to manage sessions with multiple resident server packages. + Each of these packages may de�ne their own resources and the organizational and operational semantics of + these resources. For ef�ciency reasons , XIEP provides import/export services which are designed to allow + the data portion of an image object to be taken from or placed into core protocol structures, thus saving + the application two potentially large wire transmissions and allowing an application to use the power of an + image extension on data that may derive fromthe core package or perhaps a graphics extension. + Included in the import/export services is the ability to take an image which has been rendered (converted to + �nal form) and make a new revisable form image from it (see previous section). + +4.1.2.3 Display Class Services + Although closely associated, display is a distinct step from rendition. Once the rendition operations are + complete, the client may request display of the rendered image. The server is responsible for loading + display device hardware with the rendered image object to make the image viewable on request of the + client. + Display class services will support single frame and time sequences of frames. Time sequence support is + deemed necessary to ensure uniform time spacing. Multi−image display (2−N up etc.) will be supported at + the XIE toolkit level through multiple display class service requests. + + +4.1.2.4 Device Control Class Services + In general, the extension protocol does not offer direct access to specialized server hardware. Instead, this + hardware (accelerators in particular) is accessed indirectly through protocol functions which bene�t by use + of the hardware. + Device control functions are protocol functions which offer direct access to display device hardware. + They are included primarily to take care of the few cases where a protocol function degenerates to direct + hardware access (as in frame capture operations), and secondarily, as an escape mechanism. + There are a number of dangers associated with this service class. The foremost is that unwise and excessive + inclusion of device control protocol functions is bound to lead to incompatibilities and defeat the purpose + of a common protocol. Perhaps a more speci�c danger is conflict between window control provided by the + core protocol and overall device control made possible here. + The X Image Extension will provide device control access services for a limited set of device controls. + These services will affect device control attributes associated with individual windows (ie. logical device + controls). The extension will use a mechanism similar to that used with lookup tables (colormap) to map + logical to physical device control settings as windows are selected. + Examples of display device control services include: + • Set/query intensity + • Set/query contrast + • Set/query hue + • Set/query brightness + • Set/query saturation + + + + EXTENSION PROTOCOL ELEMENTS 4–5 + • Image capture controls + − live video windowing + − frame or page grabbing + + + +4.2 Resources + + The purpose of this section is to provide an overview of the server resources of which the client has + knowledge and ability to reference. The existence and maintenance of these structures represents an + object oriented organizational strategy towards managing the control and state information involved in + providing the services. These structure are referenced through the resource id in image service requests. + The structures are not bundled into a mega structure so that mix and match flexibility is maintained at + service request time. Mega resource structures may be supported in the XIEtoolkit if it makes sense. + The overview describes the purpose of the resource, general content, and usage. Where relationships + between server resources exist, they are pointed out. + +4.2.1 Image Object − IOB + An image object (IOB) is a structure which contains the image data and closely associated attributes within + a server. IOBs are always revisable form entities. As such, an image object can be a source or destination + in a transport, enhancement, or rendition process. IOBs are not used in display operations. XIEP provides + the means by which the output of a render operation which produces a �nal form image, or input to a + display operation (�nal form images) may be converted back into an IOB (revisable form images). + Clients know IOBs as resources. A client can create and delete an IOB, and modify as well as query the + attributes section of an IOB. The only way a client can directly (ie. other than by a server based processing + operation) modify or query the image data section of an IOB is through a transport operation. + In general, an IOBs is an operand to most transfer, enhancement, and rendition requests. In all cases, an + image context of one form or another is also involved in these operations, and except where explicitly + noted, the same IOB may be used as the source and destination for an operation. In general, IOBs are to be + considered as very scarce resources by the client, and server space considerations may cause multiple IOB + creation requests to fail. + +4.2.2 Image Enhancement Context − IEC + An Image Enhancement Context (IEC) is an association of image processing operands and operators used + in the enhancement processing of an image. + An IEC resource is referenced every time an image object or region thereof is to be processed for enhance− + ment purposes. + Its primary purpose is to allow enhancement steps to be represented in processing macros (see Image + Control Context). + Clients know IECs as resources. A client can create and delete an IEC, and modify as well as query + the contents of an IEC. The same IEC can be used for many enhancement processing requests, and the + relationship between an IEC and IOB is established and maintained only during an enhancement operation. + A client can maintain multiple distinct IECs which can be used to render the same (or different IOB’s) in + different ways. + + + + +4–6 EXTENSION PROTOCOL ELEMENTS + 4.2.3 Image Process Context − IPC + An Image Process Context (IPC) is a structure which is used for one of three purposes: + 1. de�ne the subset of an image to process + 2. act as an area operand in area image operations + 3. both of the above (concurrently) + + When used for subsetting purposes, an IPC provides control over the sub areas of an image object (objects) + to which enhancement processing or rendition operations should be applied. In essence the IPC selects the + subset, or speci�c points in an image to which the operation is applied (acts as a boolean control mask). + Two forms of IPC exist for this purpose: region of interest (ROI), and control processing plane (CPP). + When used as an area operand, an IPC speci�es a set of operands and their spatial relationship. The spatial + relationship determines how the operands in the set are applied under area operations. Two possibilities + exist: fully populated and sparsely populated. An example of a fully populated IPC area operand is a + 3x3 or 5x5 convolution kernel mask where all elements in the mask have a value and are used in the area + operation − the spatial relationship between the operands is unambiguous. In the sparsely populated case, + the values of the individual operands are speci�ed for a subset of a square region. As such, the locations + of these operand values must be speci�ed explicitly along with the values. In this case, the elements that + constitute an area operation only occur at the speci�ed locations (an example would be a cross shaped + �lter). IPC’s used for the purposes described in this paragraph will be referred to as templates. + Note that a major difference between the �rst two classes is that in the �rst, the IPC is simply a "selector", + while in the second, the IPC is used both for area operation selection and operand value speci�cation. + +4.2.3.1 Region of Interest − ROI + A region of interest (ROI) is a closed form (analytic) de�nition of a single, fully connected, subregion + of an image. ROI’s de�ne the geometric bounds on an image object within which the operation is to be + performed and outside of which it is not to be performed. + Regions of interest can be any two−dimensional closed shape de�ned with reference to an image object’s + coordinate system, such that the question of within can be answered for any pixel in the image object. It + should be possible to de�ne closed form analytic regions such as circles and rectangles, as well as more + general closed polygons de�ned by a list of coordinate vertices. + Regions of interest are optional operands in image enhancement processing and rendition requests. When + not speci�ed, the system presumes that the user speci�ed a region of interest of the same geometric + structure and equal to the full extent of the image object upon which the operation is being performed. + A region of interest can only be used to control the subregion to which processing applies. It has no other + affect on the semantics of the operation (no control mechanisms). + Clients know ROIs as IPC resources. A client can create and delete an ROI, and modify as well as query + the contents of an ROI. The same ROI can be used for many transport, enhancement, and rendition requests, + and the relationship between an ROI and IOB is established and maintained only during an the operation. + A client can maintain multiple ROI’s reflecting different regions of image objects which may be of interest. + An ROI is de�ned with relation to the coordinates of an IOB. + If at all possible, the image extension will use the core X graphics clipping structures as the region of + interest resource. In this case, the image extension will simply de�ne the semantics of the core X clipping + structures when used in conjunction with imaging services. + + + + + EXTENSION PROTOCOL ELEMENTS 4–7 + 4.2.3.2 Control Processing Plane − CPP + A Control Processing Plane (CPP) is a mechanism used only in enhancement processing. Its purpose is to + allow control on a pixel by pixel basis over the application of an enhancement process. It can be used both + to select subregions, and to control the particulars of certain operators. + CPPs are only used in enhancement processing and cannot be used in transport or rendition processing. + Unlike ROIs, CPPs do not have an analytic form of representation. + Clients know CPPs as IPC resources. A client can create and delete a CPP, and modify as well as query + the contents of a CPP. The same CPP can be used for many enhancement requests, and the relationship + between a CPP and IOB is established and maintained only during an the operation. A client may maintain + multiple CPPs. + CPPs are in essence the data component of a revisable form image object (IOB), and may be implemented + as IOB’s (one of two IOB operands to an image enhancement operation). It may also be possible to use the + core X control plane structures as the control processing plane resource. In this case, the image extension + will simply de�ne the semantics of the core X control structures when used in conjunction with imaging + services. + Some examples of how CPP’s maybe used may help explain the breadth of it’s potential applications. In the + case where the user needs to specify the pixels (on a point by point basis rather than the ROI bounded area + case) to which pointwise algebraic operations are applied, a CPP which is a simple bitonal image (contro + map) may be used. In the case where areawise algebraic operations are to be performed (such as �ltering), + weighted area masks including spatial convolution �lter kernels may be speci�ed as a CPP with zero and + non zero integral values. + +4.2.3.3 Templates − TMP + A template (TMP) is a mechanism used only in enhancement area processing. Its purpose is to allow + control over which local area source image pixels (pixels near the current target pixel) participate in area + operations, and values of the second area operand on a pixel by pixel basis. + TMPs are only used in enhancement processing and cannot be used in transport or rendition processing. + Unlike ROIs, TMPs do not have an analytic form of representation. + Clients know TMPs as IPC resources. A client can create and delete a TMP, and modify as well as query + the contents of a TMP. The same TMP can be used for many enhancement requests, and the relationship + between a TMP and IOB is established and maintained only during an the operation. A client may maintain + multiple TMPs. + +4.2.4 Image Control Context − ICC + An Image Control Context (ICC) is a structure which describes the relationship between the various transfer, + enhancement, and rendition processes that make up a image processing pipeline. It is possible with an ICC + to describe enhancement processing macros, as well as various forms of transfer, enhancement, rendition + and display pipelines. + As an ICC is a higher level structure which may imply transfer, processing, and rendition, it is not referred + to in those atomic requests, but rather in pipeline (process control) requests which explicitly signal the + existence and use of the ICC. + + + + +4–8 EXTENSION PROTOCOL ELEMENTS + 4.2.5 Image Display Context − IDC + An Image Display Context (IDC) is a structure which controls the display of a �nal form image or sequence + of images. It contains the connection between revisable form image, �nal form image, display window, + display sequence, and sequence timers. IDC’s used to control the display of image sequences are also + known as slide carousels. + + + + + EXTENSION PROTOCOL ELEMENTS 4–9 + 4.3 Service Operation + + + Figure 4–1: OPERATIONAL MODEL + + + OPERATIONAL MODEL + + ^ ^ + client | | + | | + −−−−−−−−|−−−−−−−−−|−−−−−−−−−−−−−−x wire−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− + | | + server | control | transport [transport context] ............... + | | processing . + v | . + v . + +−−−−−−−>revisable form . + ^ image object . + | ^ . + | | . + | | enhancement [enhancement context]............ + | | processing . + | | . + | v region of interest + | revisable form and + +<−−−−−−−image object(s) process control + ^ | contexts + | | . + | | rendition [rendition context]................ + | | processing + | | + | v + +−−−−−−−−−−−−−−−+ + | + | + v + final form<−−−−−−− tightly coupled + image object capture devices + | | + | device | display [window & luts] + | control | + v v + DISPLAY DEVICE + + + + +4.3.1 Flow + The image extension protocol follows the same basic operational model as the core protocol. In particular, + clients communicate with servers through requests, and servers communicate with clients through replies to + requests, errors, and events. + An image application begins by establishing a connection using the core X11 protocol to an X server. The + application then queries the server in order to determine if support exists for the image extension protocol, + and what level of support exists. If the image extension is supported, and at an appropriate level, the + application establishes a connection to the extension package (session services) through (within) the core + X1 protocol connection. + + +4–10 EXTENSION PROTOCOL ELEMENTS + Once the connection has been established, the client and toolkit levels use resource requests to allocate and + load critical server resources. With these resources allocated, the application can make image data transport, + enhancement, rendition, display, and display control requests of the server. + Upon completion, the image application disconnects �rst from the image extension package, and then from + the X core package. + Using this model, an image application can continue to run as it has in the past. In this case, the component + of the application on the client side of the wire takes full responsibility for maintaining all of its private + image data structures, for applying all processing operations to these structures, for understanding the + display device characteristics, and for rendering an image suitable for display in a window. In short, the + client side of the application continues to bear responsibility for generating �nal form images. XIEP simply + provides the means to transport the �nal form image to the display. + At the other extreme, an image application may cause most or all of its image objects to reside on the + server side of the wire. In this case, all enhancement processing and rendering requests are made through + the extension package (XIE Toolkit, XIE Lib, XIE Server), and the extension package bears responsibility + for generating �nal form images. + +4.3.2 Requests and Replies + Requests and replies are the primary means by which the client and server communicate. The image + extension requests will be aggregated by the service class to which they belong (i.e. the service classes will + be broken down into requests and replies). + + +4.3.3 Errors + Errors are noti�cations to the client of server problems with requests. + +4.3.4 Events + Events are situations or occurrences which are detectable by the server and of potential interest to the + client. Bear in mind that multiple clients may share a single server, and as such,a client may be noti�ed + of an event caused by a different client. Image extension events might include changes in overall display + characteristics (brightness, contrast,...), transport complete, processing complete, rendition complete, and + time sequence display complete. + + + + + EXTENSION PROTOCOL ELEMENTS 4–11 + Chapter 5 + +TERMINOLOGY + + + The terminology section is segmented in a topical fashion in order to keep closely associated terms together. + Although terms are capitalized within this section, they are not capitalized or visually differentiated from + surrounding text in the body of the protocol. + + +5.1 Core Protocol + + The following terms are de�ned in the core protocol and used at times in the extension protocol. + + Table 5–1: Core Terms + Access ctl list Active grab Ancestors Atom + Backing store Bit gravity Bitmap Button grabbing + Byte order Children Client Clipping regions + Color cell Colormap Connection Containment + Coordinate system Cursor Depth Device + Drawable Event Event mask Event sychronization + Event propagation Event source Exposure event Extension + Grab Graphics context Hotspot Identi�er + Inferiors Input focus Input manager InputOnly window + InputOutput window Key grabbing Keyboard grabbing Mapping + Modi�er keys Obscures Occludes Padding + Parent window Passive grab Pixel value Pixmap + Plane mask Pointer Pointer grabbing Pointing device + Property Property list Redirecting control Reply + Request Resource Root Root window + Save set Screen Server Server grabbing + Sibling Stacking order Stipple Tile + Timestamp Type Unviewable Viewable + + + + + TERMINOLOGY 5–1 + Table 5–1 (Cont.): Core Terms + Visible Window gravity Window manager XYFormat + ZFormat + + + + +5.2 Extension Protocol + + The extension protocol descriptive terminology section is intended to be suf�cient for clearly communicat− + ing concepts. It is not intended to be exhaustive. + +5.2.1 Image De�nitions + CONTINUOUS_IMAGE + An optically formed counterpart of a real world object or scene. An example would be what is found on + the shutter or focal plane of a 35 mm camera. + DIGITAL_IMAGE + The discrete version of a CONTINUOUS_IMAGE. The continuous image is sampled at the vertices of a + regular two dimensional SAMPLING_GRID, and then quantized to a �xed number of levels. In practice, + a digital image maybe computed, synthesized, or randomly generated, as well as deriving from optical + processes. + IMAGE_OBJECT + An image object is the representation of a digital image which a computer application manipulates. It + consists of IMAGE_DATA plus IMAGE_ATTRIBUTES. Unless explicitly stated otherwise, any use of the + term "image" in the speci�cation implies the term IMAGE_OBJECT. + IMAGE_DATA + IMAGE_DATA consists of the bits which represent the result of the digitizing or synthesis process. + IMAGE_ATTRIBUTES + IMAGE_ATTRIBUTES are the ancillary information required to interpret, process, and present for viewing + IMAGE_DATA. There are three classes of independent IMAGE_ATTRIBUTES: + • IMAGE_PRESENTATION_ATTRIBUTES + • IMAGE_ORGANIZATION_ATTRIBUTES + • IMAGE_ENCODING_ATTRIBUTES + + IMAGE_PRESENTATION_ATTRIBUTES + The attributes of an image which describe how it is to be presented to a user for viewing. IMAGE_ + PRESENTATION_ATTRIBUTES have no bearing upon the organization and amount of image data. Often, + it is desirable to make the values of these attributes identical to those established by the capture or synthesis + process so that the image will appear identical to what it looked like at capture or synthesis time. (see + Image Data Presentation De�nitions). + IMAGE_ORGANIZATION_ATTRIBUTES + + + + +5–2 TERMINOLOGY + IMAGE_ORGANIZATION_ATTRIBUTES provide information about the structure and association of the +bits which make up the two dimensional image. (see Image Data Organization De�nitions). +IMAGE_ENCODING_ATTRIBUTES +IMAGE_ENCODING_ATTRIBUTES de�ne the mapping between the unencoded SYMBOL_SET and +the encoded SYMBOL_SET where encoding is done primarily for compression or bandwidth reduction +purposes. (see Image Data Encoding De�nitions). +IMAGE_APPLICATION +A computer application that deals in the input, output, storage, or processing of IMAGE_OBJECTS. This +protocol speci�cation is primarily concerned with the processing and output of IMAGE_OBJECTS to +displays. +FIDELITY +The degree to which the computer system can reproduce a likeness of the original (source) continuous image +without distortion. Issues affecting �delity including the sampling and display SPATIAL_ RESOLUTION, +and the LUMINANCE_RESOLUTION or CHROMINANCE_RESOLUTION. +REPRESENTATION_EFFICIENCY +A measure of how few bits can be used to represent a particular DIGITAL_IMAGE with some speci�ed +degree of FIDELITY. +FINAL_FORM_IMAGE +A FINAL_FORM_IMAGE is one that has been rendered suitable for display on a particular device. All +internal structural entities have been removed, and all rendition processing completed. The generation of +a FINAL_FORM_IMAGE from a REVISABLE_FORM_IMAGE may involve irreversible TRANSFORMs +such as resolution reduction in the x,y, and z directions. It is always possible to take a FINAL_FORM_ +IMAGE and rede�ne it as the starting point for a new and entirely different REVISABLE_FORM_IMAGE. +REVISABLE_FORM_IMAGE +A REVISABLE_FORM_IMAGE is the source image used in reversible and irreversible image rendering +operations. A REVISABLE_FORM_IMAGE may (by chance) be suitable for display as is, on a particular +device. If this is the case, the REVISABLE_FORM_IMAGE is converted to a FINAL_FORM_IMAGE +by performing a null rendering operation. REVISABLE_FORM_IMAGEs may maintain some internal +organization or structure and continue to carry rendition attributes along with them +DISPLAY_GRID +The regular, two dimensional grid at whose vertices the original image is reconstructed during display. A +display grid location is often referred to as a PIXEL. +SAMPLING_GRID +The regular, two dimensional grid at whose vertices the original image is sampled during digitization. A +sampling grid location is often referred to as a PIXEL. + + + + + TERMINOLOGY 5–3 + 5.2.2 Image Characteristics + SPATIAL + The aspects of an image which relate to space (typically x & y dimensions, and resolution in these + dimensions) including how the image varies with respect to the spatial dimensions. + TEMPORAL + The aspects of an image which relate to time (t dimension, and resolution in this dimension) (typi�ed by the + difference between a still frame, and a motion sequence) including how the image varies at any SPATIAL + location with respect to the time dimension. + RESOLUTION + The �neness or granularity of an image measured either at the capture or rendition point. The granularity + is usually expressed in both spatial frequency (dots per inch) and temporal frequency (frames per second). + Resolution is a meaningless term away from the capture and rendition points. Instead, total pixels per scan + line, total scan lines, and total frames in a sequence are more useful. + SPATIAL_RESOLUTION + A measure of the separation between adjacent points (in both SPATIAL dimensions) or granularity of the + SAMPLING_GRID and / or the DISPLAY_GRID. SPATIAL_RESOLUTION has nothing to do with image + size or total data content. It has to do with �neness at capture and output times. + TEMPORAL_RESOLUTION + A measure of the separation in time between the capture or display of two adjacent image object frames. + SPATIAL_FREQUENCY + A measure of the rapidity of image change with respect to space. + TEMPORAL_FREQUENCY + A measure of the rapidity of image change with respect to time. + INTENSITY + The square of the amplitude of the electro_magnetic �eld as measured at the focal plane of the imaging + device. Intensity is what we perceive as brightness. + INTENSITY_LEVELS + The number of distinct brightness levels represented in the image. + CONTRAST + The difference between minimum and maximum INTENSITY levels in an image. + LUMINANCE + The component of an image which represents the INTENSITY at either a single wavelength or averaged + over a wavelength band. INTENSITY, LUMINANCE, and brightness are psynonomous. + CHROMINANCE + The component of an image which describes the dependence of INTENSITY on wavelength or wavelength + band. + + + + +5–4 TERMINOLOGY + 5.2.3 Visual Types + VISUAL_TYPE + A label applied to the human perception of a continuous image based upon perceived characteristics of + intensity distribution, and dependency upon wavelength and time. The continuous image of an object (and + occasionally the object itself) is said to be of one of the following VISUAL_TYPEs include BLACK_ + AND_WHITE, GREY_SCALE, COLOR, STILL, and MOTION. + BLACK_AND_WHITE + A VISUAL_TYPE where the continuous images have very high contrast, and no perceived temporal or + chrominance dependency (i.e. what we perceive when reading this page). + GREY_SCALE + A VISUAL_TYPE where the continuous image has a relatively wide range of intensities which vary + smoothly, and no perceived temporal or chrominance dependencies. GREY_SCALE is perhaps more an + artifact of early television and photography than of nature. + COLOR + A VISUAL_TYPE where the continuous image has a wide range of luminances and chrominances which + vary smoothly, and no temporal dependencies. + STILL + A VISUAL_TYPE which demonstrates no temporal variation (e.g. this page). + MOTION + A VISUAL_TYPE which demonstrates temporal variations (e.g. television). + +5.2.4 Image Classes + IMAGE_CLASS + The grouping of a digital image based upon which visual type it represents with highest ef�ciency and �− + delity of reproduction. IMAGE_CLASSes include MONOCHROMATIC−BITONAL, MONOCHROMATIC− + CONTINUOUS TONE, and POLYCHROMATIC−CONTINUOUS TONE or MULTISPECTRAL. All three + classes have either the STATIC or TIME_VARYING modi�er. + MONOCHROMATIC−BITONAL + An IMAGE_CLASS in which two INTENSITY_LEVELS are represented. At sampling and display times, + a PIXEL for the MONOCHROMATIC−BITONAL IMAGE_CLASS is one bit deep. The display of an + image of this class either does not use a COLORMAP, or uses the BLACK and WHITE entries of the + COLORMAP. The MONOCHROMATIC−BITONAL IMAGE_CLASS is optimal (REPRESENTATION_ + EFFICIENCY and RENDITION_FIDELITY) for the BLACK_AND_WHITE VISUAL_TYPE. + MONOCHROMATIC−CONTINUOUS_TONE + An IMAGE_CLASS in which 2**N −1 INTENSITY_LEVELS are represented. At sampling and dis− + play times, a PIXEL for the CONTINUOUS_TONE IMAGE_CLASS is N bits deep where N > 1. + CONTINUOUS_TONE is accomplished on color displays with the PIXEL value being used as an in− + dex into a COLORMAP, and the same value used to drive the RED, GREEN, and BLUE display guns. + The MONOCHROMATIC−CONTINUOUS_TONE IMAGE_CLASS is optimal (REPRESENTATION_ + EFFICIENCY and RENDITION_FIDELITY) for the GREY_SCALE VISUAL_TYPE. + + + + TERMINOLOGY 5–5 + POLYCHROMATIC−CONTINUOUS_TONE or MULTI_SPECTRAL + An IMAGE_CLASS in which multiple (>2) INTENSITY_LEVELS are represented for multiple (2 or + more) SPECTRAL_COMPONENTs. MULTI_SPECTRAL is typically accomplished on color displays via + the use of the COLORMAP. The POLYCHROMATIC_CONTINUOUS_TONE or MULTI_SPECTRAL + IMAGE_CLASS is optimal (REPRESENTATION_EFFICIENCY and RENDITION_FIDELITY) for the + COLOR VISUAL_TYPE. + STATIC + A modi�er of the other IMAGE_CLASSes indicating no TEMPORAL dependency, and implying only one + unchanging IMAGE_OBJECT. + TIME_VARYING + A modi�er of the other IMAGE_CLASSes indicating TEMPORAL dependency, and implying multiple + IMAGE_OBJECTs which represent the continuous image at different times (usually a time sequence). + +5.2.5 Image Data Organization + IMAGE_DATA_ORGANIZATION + The way in which a logical PCM model of IMAGE_DATA is mapped onto a physical storage model. The + overall purpose is to enable convenient association of and access to all of the bits which represent the + information found at each sampling grid point. Three signi�cant IMAGE_DATA_ORGANIZATIONS exist, + each possessing different access characteristics. The core X protocol recognizes only two of these formats + (see names in parenthesis). + • FULL_PIXEL_COMPACTION (Z format in core X) + • FULL_PIXEL_EXPANSION (X−Y format in core X) + • PARTIAL_PIXEL_EXPANSION (unrecognized in core X) + + PIXEL + A DISPLAY_GRID or SAMPLING_GRID location. Often used to mean the collection of bits representing + the image information at the sampling and display grid locations. This second usage is somewhat dangerous + as in modern displays there may be no simple stack of bits behind the display at each DISPLAY_GRID + location representing the image information for that PIXEL. + BITS_PER_PIXEL + In DISPLAY_SUBSYSTEMs which do maintain a FRAME_BUFFER with the image information for each + PIXEL collected into a stack of N bits, the number N. Unless otherwise quali�ed, the term BITS_PER_ + PIXEL implies the total number of bits which when aggregated form a PIXEL. Occasionally, the quali�ed + phrase BITS_PER_PIXEL_PER_SPECTRAL_COMPONENT, or BITS_PER_PIXEL_PER_PLANE_ + GROUP will be used. Either of these values must by de�nition be less than or equal to BITS_PER_PIXEL. + BIT_PLANE + A two dimensional collection of bits such that there is one and only one bit at each of the points in the two + dimensional grid. The stacking of all BIT_PLANES which form an image results in a PIXEL at each grid + point. + PLANE_GROUP + An organized collection or stack of PLANEs. A PLANE_GROUP may be from 1 to N PLANES deep + where N is the number of BITS_PER_PIXEL. + + + +5–6 TERMINOLOGY + PCM +Pulse Code Modulation (or raw bits) is the reference form for uncompressed images. In PCM the image +symbol set consists of PIXELS, where PIXELS are the quantized representation of image luminance or +CHROMINANCE channel as sampled at regular two dimensional grid points. +FULL_PIXEL_COMPACTION +An IMAGE_DATA organization in which all bits which make up all SPECTRAL_COMPONENTs of a +PIXEL are logically and physically adjacent in transmission and storage. All bits of an N bit PIXEL are +aggregated to form an element of a single, two dimensional array. PIXEL bit aggregates may be separated +by pad bits for alignment purposes. +FULL_PIXEL_EXPANSION +An IMAGE_DATA organization in which all bits which make up all SPECTRAL_COMPONENTs of a +PIXEL are physically separated such that every bit of an N bit PIXEL is an element of a separate two +dimensional array (PLANE), there being N such arrays (PLANEs). +PARTIAL_PIXEL_EXPANSION +An IMAGE_DATA organization in which all bits which make up each SPECTRAL_COMPONENT +are physically adjacent by SPECTRAL_COMPONENT. The BITS_PER_PIXEL for each individual +SPECTRAL_COMPONENT are compacted into individual, two dimensional arrays, there being one such +array for each SPECTRAL_COMPONENT. +SCAN_LINE +A logical collection of PIXELs organized in a linear fashion which represents an array row in the two +dimensional display grid. +PIXELS_PER_LINE +The total number of PIXELS per SCAN_LINE. Note that this is not necessarily the number of bits per +SCAN_LINE. +NUMBER_OF_LINES +The total number of SCAN_LINEs in the image. +PIXEL_STRIDE +The difference in bit addresses between the �rst bit of successive PIXELS. PIXEL_STRIDE will typically +be equal to the number of bits per pixel stored in a particular IMAGE_PLANE_GROUP. IF PIXEL +alignment requires �ll bits between PIXELs, the difference between PIXEL_STRIDE and the number of +BITS_PER_PIXEL per IMAGE_PLANE_GROUP will equal the �ll value. +SCANLINE_STRIDE +The difference in bit addresses between the �rst bit of successive SCAN_LINEs. SCANLINE_STRIDE +will typically be equal to the number of bits (not PIXELs) per SCAN LINE stored in a particular IMAGE_ +PLANE_ GROUP. IF SCAN_LINE alignment requires �ll bits between SCAN_LINEs, the difference +between SCANLINE_STRIDE and the number of bits per SCAN_LINE will equal the �ll value. +SPECTRAL_COMPONENT +The INTENSITY dependence of an image at either a particular wavelength or averaged over a wavelength +band. A MULTI_SPECTRAL image is made up of two or more SPECTRAL_COMPONENTS. +SPECTRAL_COMPONENT_MAPPING + + + + TERMINOLOGY 5–7 + The correlation between the physical image data and the various SPECTRAL_COMPONENTS of an image. + COMPONENT_SPACE_ORGANIZATION + DATA_PLANES_PER_PIXEL + DATA_PLANE_SIGNIFICANCE + NUMBER_OF_COMPONENTS + The number of SPECTRAL_COMPONENTs in a MULTI_SPECTRAL image. + BITS_PER_COMPONENT + The number of bits used for each image component in a data plane. The sum of the BITS_PER_ + COMPONENT over all components equals the BITS_PER_ PIXEL value. In that some three color + image data representations do not have a one to one correspondence between representation component + and SPECTRAL_COMPONENT, BITS_PER_COMPONENT should not be interperted as bits per spec− + tral component. In addition, the BITS_PER_COMPONENT maybe be three different numbers (one per + component). + +5.2.6 Image Data Encoding + ENCODING + The process by which data is mapped into a new SYMBOL_SET for some speci�c purpose such as + COMPRESSION. + COMPRESSION + The process by which an image is mapped from its PCM representation (uncompressed SYMBOL_ + SET) into a new representation (compressed SYMBOL_ SET) for purposes of bandwidth reduction. The + application of COMPRESSION techniques is a function of the IMAGE_DATA_ORGANIZATION, and is + often done on a SPECTRAL_COMPONENT by SPECTRAL_COMPONENT basis. + COMPRESSION_SCHEME + The scheme used to accomplish COMPRESSION. Well known COMPRESSION_SCHEMES include run + length compression, linear predictor compressors, and transform schemes. + COMPRESSION_PARAMETERS + The parameters required by a particular COMPRESSION_SCHEME. + DECOMPRESSION + The process by which an image is returned from its compressed representation to its PCM representation. + DECOMPRESSION_SCHEME + The scheme used to accomplish DECOMPRESSION. The DECOMPRESSION_SCHEME is chosen as the + complement of the COMPRESSION_SCHEME. + DECOMPRESSION_PARAMETERS + The parameters required by a particular DECOMPRESSION_SCHEME. + ENCODING_FIDELITY + + + + +5–8 TERMINOLOGY + The degree of similarity between an original uncompressed image, and one which has been compressed, + then decompressed. COMPRESSION_SCHEME DECOMPRESSION_SCHEME pairs which result in + absolute ENCODING_FIDELITY are known as lossless, while those which have reduced FIDELITY are + known as lossey. ENCODING_FIDELITY is measured with a mathematical metric. + SYMBOL_SET + The atomic elements which from which an image is composed. There is no uniques SYMBOL_SET for + an image. Usually, the de�nition of the SYMBOL_SET is based upon the compression scheme. Typical + symbol primitives include bits, bytes, and the entire image as a state space. The number of unique symbols + which these primitives can represent (i.e. the SYMBOL_SET), and the number of symbols used to compose + an image both depend upon the choice of symbol primitives. + +5.2.7 Image Data Presentation + RENDITION + The process by which an image object is made suitable for display. It involves converting an image into a + format that the display hardware recognizes. + RENDITION_FIDELITY + The degree to which the display subsystem can render an image belonging to a particular IMAGE_CLASS. + RENDITION_FIDELITY is a function of the similarity between display hardware (display memory + organization), and IMAGE_CLASS. + DISPLAY + The physical hardware (video logic and tube) which allows a user to view an image. The process of taking + an image which has been rendered displayable and putting it on the screen (making it viewable). + PRESENTATION_ATTRIBUTES + The attributes of an IMAGE_OBJECT that de�ne how it should be displayed for viewing. These at− + tributes determine the particulars of the RENDITION process. Note that unlike DATA_ORGANIZATION_ + ATTRIBUTES, PRESENTATION_ATTRIBUTES are not essential for interperting the IMAGE_DATA, but + are essential for displaying it. + PIXEL_PATH + The direction of the PIXEL capture path along an individual SCAN LINE. PIXEL_PATH is de�ned against + the ISO and CCITT standards, and establishes the angle of a SCAN_LINE with relationship to a reference + coordinate system. + LINE_PROGRESSION + The direction of SCAN_LINE capture across the image plane. LINE_PROGRESSION is de�ned against + the ISO and CCITT standards, and establishes the angle of a normal to a SCAN_LINE with relationship to + a reference coordinate system. + PIXEL_ASPECT_RATIO + The ratio of the distance between PIXEL centers along the PIXEL_PATH, and along the LINE_ + PROGRESSION on the SAMPLING_GRID and/or DISPLAY_GRID. + BRIGHTNESS_POLARITY + The direction of the mapping from PIXEL magnitude to visual brightness. (i.e., whether a PIXEL value of + 0 is displayed as light or dark) + + + TERMINOLOGY 5–9 + GRID_TYPE + The physical format of of the regular PIXEL sampling grid. + TIMING_UNIT + The number of atomic units of time between display of IMAGE_OBJECTS in a time sequence. + +5.2.8 Image Server Hardware + SERVER_HARDWARE + The equipment which constitutes the computer system on which the XIEP server software executes + including server HOST_PROCESSOR, HOST_MEMORY, HOST_BUS, and DISPLAY_SUBSYSTEM. + DISPLAY_SUBSYSTEM + The collection of DISPLAY_MEMORY, DISPLAY_PROCESSOR(s), and video logic used to drive + a DISPLAY_MONITOR. There is an explicit communications connection between the DISPLAY_ + SUBSYSTEM, and the HOST_PROCESSOR through serial or parrallel lines, or a backplane or bus. + DISPLAY_MEMORY + The memory in which the states of the screen pixels are kept and from which these screen pixels are + refreshed. DISPLAY_MEMORY is often referred to as the bit map. + DISPLAY_PROCESSOR + Any general or special purpose processor dedicated to display processing and usually closely coupled to the + DISPLAY_MEMORY. + DISPLAY_MONITOR + The tube or bottle (screen) upon which a viewer sees an image. + DISPLAY_BUS + The interconnect between DISPLAY_PROCESSOR(s), and DISPLAY_MEMORY. (often, this is a private + interconnect). + LOOK_UP_TABLE + A table mechanism by which an input index (stored as a value in the DISPLAY_MEMORY) is used to �nd + the intensity to be output on the various channels (guns) of the DISPLAY_MONITOR. + HOST_PROCESSOR + The cpu on which the X server executes. The X server may access other general or special purpose + processors which are closely associated with the display subsystem in order to accomplish its job. + HOST_MEMORY + The memory used by the HOST_PROCESSOR to run the X server. This memory may or may not be + directly accessible by the display subsystem and is usually not the same as the DISPLAY_MEMORY. + HOST_BUS + The interconnect between HOST_PROCESSOR(s) and HOST_MEMORY. (often, this is an open intercon− + nect). + FRAME_GRABBER + + + +5–10 TERMINOLOGY + A device which samples and digitizes an image or an analog representation of an image. Typically, the term + FRAME implies a broadcast television video standard concept (RS170 − 30 frames per second refresh). As + such, FRAME_GRABBERs are typically devices which digitize RS170 standard analog baseband video. + FRAME_BUFFER + The memory into which a FRAME_GRABBER deposits the image signal it digitizes. (often, this is the + DISPLAY_MEMORY). + TIGHTLY_COUPLED + Used in this document to refer to the connection between image capture devices such as frame grabbers + and scanners, and the DISPLAY_MEMORY. A capture device which deposits an image directly into the + DISPLAY_MEMORY without passing through applications buffers (HOST_MEMORY) will be referred to + as TIGHTLY_COUPLED. + +5.2.9 Image Data Layout + TILING + A screen layout where adjacent rectangular images adjoin each other seamlessly and with no overlap. The + adjacent images represent parts of a larger common scene. + N_UP + A screen layout where two or more different images are viewed adjacent to each other at the same time. + OVERLAY + A screen layout where two or more images are layed out on top of each other in SPATIAL_ + REGISTRATION to observe differences. The images usually represent the same scene at different times or + states. + SPATIAL_REGISTRATION + The state in which all common points in two images of the same scene would be found at the same PIXELs + if displayed in an OVERLAY fashion. + TIME_SEQUENCE + The display of individual images of the same sceen taken at uniformly spaced time intervals. + +5.2.10 Three Space Color + SPECTRAL_SPACE + A metri�ed way by which to describe locations in the space of human color perception and relate these + back to physical principles (wavelength and intensity). + RED_GREEN_BLUE or RGB + A color three space widely used in the computer industry. The information in each of the SPECTRAL_ + COMPONENTS (red green blue) represents the luminance integrated over some wavelength band centered + around that color. + CMY + TBS + + + + + TERMINOLOGY 5–11 + YUV + TBS + HSV + TBS + HLS + TBS + YIQ + TBS + +5.2.11 Image Data Processing + IMAGE_PROCESSING + The process of applying an IMAGE_OPERATOR to an IMAGE_DATA operand or operands. + TRANSFORM + To modify IMAGE_DATA via the application of an IMAGE_OPERATOR. + RESTORATION_PROCESSING + IMAGE_PROCESSING whose purpose is to remove well understood distorations generated by the imaging + system or conditions. + ENHANCEMENT_PROCESSING + IMAGE_PROCESSING whose purpose is to increase the subjective quality of an image thus making it + easier to view. + ANALYSIS_PROCESSING + IMAGE_PROCESSING whose purpose is interpret the semantics or content and meaning of an image. + CODING_PROCESSING + IMAGE_PROCESSING whose purpose is to remap images between alternative representations primarily + for purposes of compression. + ITERATIVE_PROCESSING + IMAGE_PROCESSING where the output of an IMAGE_PROCESSING operation is fed back into the same + operator (i.e. the same operator is applied over and over again to the image). + PIPELINE_PROCESSING + IMAGE_PROCESSING where the output of an IMAGE_PROCESSING operation is fed into another + operator (i.e. the image is fed through a serial stream of operators). + + + + +5–12 TERMINOLOGY + Appendix A + +RELATED TOPICS + + + This appendix describes some background material on topics which are not central to the image extension + package but are closely associated. + + +A.1 Image Data Interchange + + Image data formats are a topic of much interest lately. These formats are instances of image data inter− + change protocols. In the X environment, there are three locations where such protocols exist: application + client to application client direct (IP1), application client to/from server (IP2), and application client to + application client by way of a shared server (IP3) (see �g. A−1). + The interchange of image data between the application client and server remains within the application, + yet spans the X wire boundary. Protocols for the interchange of image data across the X wire (IP2) are + considered to be part of the X extension package (in fact, IP2 is XIEP the X image extension protocol) and + must comply with the X core protocol. Of necessity, the extension proposal also addresses IP3 (sharing of + server resources). + + Figure A–1: IMAGE DATA INTERCHANGE + + + + APPLICATION #1 <==================> APPLICATION #2 + CLIENT CLIENT + ^ IP1 ^ + | | + | IP2 | IP2 + | | + ............+...................................+............ X WIRE + | | + | IP2 | IP2 + | | + V V + SERVER SERVER + . KERNEL IP3 . KERNEL + <===================> + . EXTENSION . EXTENSION + + + + Figure A–1 Cont’d. on next page + + + + RELATED TOPICS A–1 + Figure A–1 (Cont.): IMAGE DATA INTERCHANGE + + + + It is the purpose, and nature of the IP1 image data protocol, and its relationship to IP2 and IP3 that are the + subject of this section. + Application level image data interchange formats are the means by which various applications recognize + and exchange common image data. Applications level interchange of data often has nothing to do with + display processes, and, therefore, they (IP1) exist outside of the domain of X. + Such IP1 interchange protocols are likely to be standardized within image data classes and applications do− + mains. This is seen in the emergence of image application domain industry standards. Thus, we are seeing + medical radiological image data interchange standardized and engineering drawing image data interchange + standardized in different ways. Often, applications level interchange protocols are packaged in or as disk + �le formats although they are equally applicable to all channels (both storage and communications). + Protocols for application to application interchange of image data are NOT part of the X Image Extension + Package or the X Image Extension Protocol. However, in that the IP1 and IP2+IP3 paths should allow + for the same interchange, it does make sense to propose an IP1 which is aligned with IP2 and IP3. As + such, the extension protocol speci�cation will include a speci�cation for IP1 which can be implemented as + a communications stream, or packaged in a disk �le. It is expected that this speci�cation will be aligned + at least in content with the emerging compound document architecture interchange format (ISO 8613−7 + ODA/ODIF). + + + + +A–2 RELATED TOPICS + \ No newline at end of file diff --git a/xie/docs/x11r4/protocol.pdf b/xie/docs/x11r4/protocol.pdf new file mode 100644 index 0000000..dd32d96 Binary files /dev/null and b/xie/docs/x11r4/protocol.pdf differ diff --git a/xie/docs/x11r4/protocol.ps b/xie/docs/x11r4/protocol.ps new file mode 100644 index 0000000..9d5db01 --- /dev/null +++ b/xie/docs/x11r4/protocol.ps @@ -0,0 +1,8462 @@ +%!PS-Adobe-2.0 +%%Creator: VAX DOCUMENT V1.1 +%%+Copyright (c) 1986,1987,1988 DIGITAL EQUIPMENT CORPORATION. +%%+All Rights Reserved. +%%DocumentFonts: (atend) +%%Pages: (atend) +%%EndComments +/$DVCDict where { %FIND DICTIONARY + pop +}{ %else + /$DVCDict 300 dict def +} ifelse +/BeginDVC$PSDoc { %BEGIN DOCUMENT + vmstatus pop pop 0 eq { + $DVCDict begin InitializeState + }{ %else + /DVC$PSJob save def $DVCDict begin InitializeState + /DVC$PSFonts save def + } ifelse +} def +/EndDVC$PSDoc { %END DOCUMENT + vmstatus pop pop 0 eq { + end + }{ %else + DVC$PSFonts restore end DVC$PSJob restore + } ifelse +} def +% +$DVCDict begin +% +mark % CREATE ISOLatin1 ENCODING +/ISOLatin1 + 8#000 1 8#054 {StandardEncoding exch get} for + /minus + 8#056 1 8#217 {StandardEncoding exch get} for + /dotlessi + 8#301 1 8#317 {StandardEncoding exch get} for + /space /exclamdown /cent /sterling /currency /yen /brokenbar /section + /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen + /registered /macron /degree /plusminus /twosuperior /threesuperior /acute + /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine + /guillemotright /onequarter /onehalf /threequarters /questiondown /Agrave + /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute + /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde + /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave + /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute + /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute + /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde + /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave + /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis + /ISOLatin1 where not {256 array astore def} if +cleartomark +% +/DECMCS ISOLatin1 256 array copy def +mark % CREATE DECMCS ENCODING + 8#240 8#244 8#246 8#254 8#255 8#256 8#257 8#264 + 8#270 8#276 8#320 8#336 8#360 8#376 8#377 + counttomark + {DECMCS exch /.notdef put} repeat % STACK NOW CONTAINS MARK + 8#250 /currency 8#327 /OE 8#335 /Ydieresis 8#367 /oe 8#375 /ydieresis + counttomark -1 bitshift % DIVIDE BY 2 + {DECMCS 3 1 roll put} repeat % STACK NOW CONTAINS MARK +cleartomark +% +/DOCPSE DECMCS 256 array copy def +mark % CREATE DOCPSE ENCODING + 8#055 /hyphen + 8#201 /bullet 8#202 /emdash 8#203 /endash 8#204 /dagger + 8#205 /daggerdbl 8#206 /registered 8#207 /trademark %8#210 /Delta + 8#211 /fi 8#212 /fl + counttomark -1 bitshift % DIVIDE BY 2 + {DOCPSE 3 1 roll put} repeat % STACK NOW CONTAINS MARK +cleartomark +% +/reencodedict 10 dict def %Local storage for "ReENCODE" +/ReENCODE { % /basefont /newfont encoding ReENCODE + /newencoding exch def %ARG: NAME OF ENCODING VECTOR + /newfontname exch def %ARG: NEW NAME FOR FONT AFTER RE-ENCODING + findfont + /basefontdict exch def %ARG: NAME OF FONT TO BE RE-ENCODED + basefontdict maxlength dict begin %CREATE AND OPEN NEW DICT + basefontdict { %COPY ENTRIES FROM BASE FONT DICT TO NEW ONE + 1 index /FID ne { + def %IF NOT THE ONE WE'RE ENCODING, JUST COPY PTRS + } { %else + pop pop %IGNORE FID AND ENCODING FOR ONE WE'RE ENCODING + } ifelse + } forall + /FontName newfontname def %DEFINE NEW NAME + /Encoding newencoding def %DEFINE NEW ENCODING VECTOR + newfontname currentdict definefont %TURN IT INTO A PS FONT + pop %IGNORE MODIFIED DICT RETURNED BY DEFINEFONT + end +} bind def +% +/cvsstr 64 string def +/tempmatrix matrix def +% +/BP { % BEGIN PAGE + /Magnification exch def /DVC$PSPage save def +} def +% +/EP {DVC$PSPage restore} def % END PAGE +% +/XP { % EXIT PAGE (TEMPORARILY) TO ADD FONTS/CHARS + % SAVE CURRENT POINT INFORMATION SO IT CAN BE RESET LATER + /Xpos where {pop Xpos} {0} ifelse + /Ypos where {pop Ypos} {0} ifelse + /currentpoint cvx stopped {0 0 moveto currentpoint} if + /DVC$PSPage where {pop DVC$PSPage restore} if + moveto + /Ypos exch def /Xpos exch def +} def +% +/RP {/DVC$PSPage save def} def % RESUME PAGE +% +/PF {GlobalMode LocalMode} def % PURGE FONTS TO RECLAIM MEMORY +% +/GlobalMode { % SWITCH TO BASE SAVE/RESTORE LEVEL, SAVING STATE + PortraitMode PaperWidth PaperHeight PxlResolution Resolution + Magnification Ymax Xorigin Yorigin RasterScaleFactor + % SAVE CURRENTPOINT INFORMATION TO RESET LATER + /currentpoint cvx stopped {0 0 moveto currentpoint} if + /DVC$PSPage where {pop DVC$PSPage restore} if + DVC$PSFonts restore RecoverState +} def +% +/RecoverState { % PRESERVE STATE AT BASE LEVEL + 12 copy + /Ypos exch def /Xpos exch def /RasterScaleFactor exch def + /Yorigin exch def /Xorigin exch def /Ymax exch def + /Magnification exch def /Resolution exch def /PxlResolution exch def + /PaperHeight exch def /PaperWidth exch def /PortraitMode exch def + DoInitialScaling + PortraitMode not {PaperWidth 0 SetupLandscape} if + Xpos Ypos moveto +} def +% +/InitializeState { % INITIALIZE STATE VARIABLES TO DEFAULT VALUES + /Resolution 3600 def /PxlResolution 300 def + /RasterScaleFactor PxlResolution Resolution div def + /PortraitMode true def /PaperHeight 11 Resolution mul def + /PaperWidth 8.5 Resolution mul def /Ymax PaperHeight def + /Magnification 1000 def /Xorigin 0 def /Yorigin 0 def + /Xpos 0 def /Ypos 0 def /InitialMatrix matrix currentmatrix def +} def +% +/LocalMode { % SWITCH FROM BASE SAVE/RESTORE LEVEL, RESTORING STATE + /Ypos exch def /Xpos exch def /RasterScaleFactor exch def + /Yorigin exch def /Xorigin exch def /Ymax exch def + /Magnification exch def /Resolution exch def /PxlResolution exch def + /PaperHeight exch def /PaperWidth exch def /PortraitMode exch def + DoInitialScaling + PortraitMode not {PaperWidth 0 SetupLandscape} if + Xpos Ypos moveto + /DVC$PSFonts save def /DVC$PSPage save def +} def +% % ABBREVIATIONS +/S /show load def +/SV /save load def +/RST /restore load def +/Yadjust {Ymax exch sub} def +% +/SXY { % (x,y) POSITION ABSOLUTE, JUST SET Xpos & Ypos, DON'T MOVE + Yadjust /Ypos exch def /Xpos exch def +} def +% +/XY { % (x,y) POSITION ABSOLUTE + Yadjust 2 copy /Ypos exch def /Xpos exch def moveto +} def +% +/X { % (x,0) POSITION ABSOLUTE + currentpoint exch pop 2 copy /Ypos exch def /Xpos exch def moveto +} def +% +/Y { % (0,y) POSITION ABSOLUTE + currentpoint pop exch Yadjust 2 copy + /Ypos exch def /Xpos exch def moveto +} def +% +/xy { % (x,y) POSITION RELATIVE + neg rmoveto currentpoint /Ypos exch def /Xpos exch def +} def +% +/x { % (x,0) POSITION RELATIVE + 0 rmoveto currentpoint /Ypos exch def /Xpos exch def +} def +% +/y { % (0,y) POSITION RELATIVE + 0 exch neg rmoveto currentpoint /Ypos exch def /Xpos exch def +} def +% +/R { % DRAW A RULE + /ht exch def /wd exch def gsave 0 setgray + currentpoint newpath moveto + 0 ht rlineto wd 0 rlineto + 0 ht neg rlineto wd neg 0 rlineto + closepath fill grestore wd 0 rmoveto + currentpoint /Ypos exch def /Xpos exch def +} def +% +/RES { % RES + /Resolution exch def /PxlResolution exch def + /RasterScaleFactor PxlResolution Resolution div def + DoInitialScaling +} def +% +/DoInitialScaling { % DO INITIAL SCALING + InitialMatrix setmatrix 72 Resolution div dup scale +} def +% +/PM { % PM + XP + /PaperWidth exch def /PaperHeight exch def + /Ymax PaperHeight def /PortraitMode true def + DoInitialScaling + RP +} def +% +/SetupLandscape {translate 90 rotate} def +/LM { % LM + XP + /PaperWidth exch def /PaperHeight exch def + /Ymax PaperWidth def /PortraitMode false def + DoInitialScaling PaperWidth 0 SetupLandscape + RP +} def +% +/MAG { % CHANGE MAGNIFICATION SETTING + XP /Magnification exch def RP +} def +% +/SPB { % SPB - BEGIN "\SPECIAL" MODE + Yadjust /Yorigin exch def /Xorigin exch def + GlobalMode Xorigin Yorigin translate + Resolution 72 div dup scale % RESTORE DEFAULT SCALING + Magnification 1000 div dup scale % ADJUST FOR ANY MAGNIFICATION + /Xpos Xpos 72 Resolution div mul 1000 Magnification div mul def + /Ypos Ypos 72 Resolution div mul 1000 Magnification div mul def + /spsavobj save def %SAVE STATE & STACK DEPTH FOR CLEANUP AFTER FIGURE + /showpage {} def %DISABLE DURING FIGURE; `RESTORE' WILL BLOW DEF AWAY + mark +} def +% +/SPE { % SPE - END "\SPECIAL" MODE + spsavobj restore + cleartomark + 1000 Magnification div dup scale % UN-ADJUST FOR ANY MAGNIFICATION + 72 Resolution div dup scale % RESTORE DEFAULT INTERNAL SCALING + LocalMode +} def +% +/PP {showpage} def +/CLRP {erasepage} def +% +/DMF { % /font-name DMF + /psz exch def /nam exch def nam findfont psz scalefont setfont +} def +% +/concatnam { % /abcd (xxx) concatnam ==> /abcdxxx + /xxx exch def /nam exch def + /namstr nam cvsstr cvs def + /newnam namstr length xxx length add string def + newnam 0 namstr putinterval + newnam namstr length xxx putinterval + newnam cvn +} def +% +/strip { % /abcdef 2 strip ==> /cdef + /num exch def /nam exch def + /namstr nam cvsstr cvs def + /newlen namstr length num sub def + namstr num newlen getinterval cvn +} def +% ROUTINES TO HANDLE PACKING/UNPACKING NUMBERS +/PackHW { % PackHW --> + /num exch def /pos exch def /target exch def + num 16#0000FFFF and 1 pos sub 16 mul bitshift target or +} def +/PackByte { % PackByte --> + /num exch def /pos exch def /target exch def + num 16#000000FF and 3 pos sub 8 mul bitshift target or +} def +/UnpkHW { % UnpkHW --> + /num exch def /pos exch def + num 1 pos sub -16 mul bitshift 16#0000FFFF and + dup 16#00007FFF gt {16#00010000 sub} if +} def +/UnpkByte { % UnpkByte --> + /num exch def /pos exch def + num 3 pos sub -8 mul bitshift 16#000000FF and + dup 16#0000007F gt {16#00000100 sub} if +} def +% +/DPSF { % /procname size /fontname DPSF + findfont exch scalefont + [ exch /setfont cvx ] cvx def +} bind def +% +/PXLBuildCharDict 17 dict def +/CMEncodingArray 128 array def +0 1 127 {CMEncodingArray exch dup cvsstr cvs cvn put} for +/RasterConvert {RasterScaleFactor div} def +/TransformBBox { + aload pop + /BB-ury exch def /BB-urx exch def /BB-lly exch def /BB-llx exch def + [ BB-llx RasterConvert BB-lly RasterConvert + BB-urx RasterConvert BB-ury RasterConvert ] +} def +/RunLengthToRasters { + % none yet +} def +/GenerateRasters { % GENERATE RASTERS FOR "IMAGEMASK" + rasters runlength 1 eq {RunLengthToRasters} if +} def +% +/int-dict-name {int (-dict) concatnam} def +/int-dict {int (-dict) concatnam cvx load} def +% +/DefinePXLFont { + % ... + % ...[llx lly urx ury]DefinePXLFont + /newfont exch def /bb exch def /num exch def /psz exch def + /dsz exch def /pxlmag exch def /ext exch def /int exch def + /fnam ext (-) concatnam pxlmag cvsstr cvs concatnam def + newfont not { + int-dict-name 13 dict def + int-dict begin + /FontType 3 def /FontMatrix [ 1 dsz div 0 0 1 dsz div 0 0 ] def + /FontBBox bb TransformBBox def /Encoding CMEncodingArray def + /CharDict 1 dict def CharDict begin /Char-Info num array def end + /BuildChar { + PXLBuildCharDict begin + /char exch def /fontdict exch def + fontdict /CharDict get /Char-Info get char get aload pop + /rasters exch def /PackedWord1 exch def + 0 PackedWord1 UnpkHW 16#7FFF ne { + /PackedWord2 exch def /wx 0 PackedWord1 UnpkHW def + /rows 2 PackedWord1 UnpkByte def /cols 3 PackedWord1 UnpkByte def + /llx 0 PackedWord2 UnpkByte def /lly 1 PackedWord2 UnpkByte def + /urx 2 PackedWord2 UnpkByte def /ury 3 PackedWord2 UnpkByte def + }{ %else + /PackedWord2 exch def /PackedWord3 exch def /PackedWord4 exch def + /wx 1 PackedWord1 UnpkHW def /rows 0 PackedWord2 UnpkHW def + /cols 1 PackedWord2 UnpkHW def /llx 0 PackedWord3 UnpkHW def + /lly 1 PackedWord3 UnpkHW def /urx 0 PackedWord4 UnpkHW def + /ury 1 PackedWord4 UnpkHW def + } ifelse + rows 0 lt { + /rows rows neg def /runlength 1 def + }{ %else + /runlength 0 def + } ifelse + wx 0 + llx RasterConvert lly RasterConvert + urx RasterConvert ury RasterConvert setcachedevice + rows 0 ne { + gsave + cols rows true RasterScaleFactor + 0 0 RasterScaleFactor neg llx .5 add neg ury .5 add + tempmatrix astore GenerateRasters imagemask + grestore + } if + end + } def + end + fnam int-dict definefont pop + } if + int-dict-name fnam findfont psz scalefont def + currentdict int [ int-dict /setfont cvx ] cvx put +} def +/PXLF { true DefinePXLFont} def % SIGNAL THAT FONT IS ALREADY LOADED +/PXLNF {false DefinePXLFont} def % SIGNAL THAT FONT IS NOT ALREADY LOADED +% +/PXLC { % ... + % ...PXLC + /rasters exch def /runlength exch def /cols exch def /rows exch def + /ury exch def /urx exch def /lly exch def /llx exch def + /wx exch def /code exch def /int exch def + % SEE IF LONG OR SHORT FORMAT IS REQUIRED + true cols CKSZ rows CKSZ ury CKSZ urx CKSZ lly CKSZ llx CKSZ + TackRunLengthToRows { + int-dict /CharDict get /Char-Info get code + [ 0 0 llx PackByte 1 lly PackByte 2 urx PackByte 3 ury PackByte + 0 0 wx PackHW 2 rows PackByte 3 cols PackByte rasters ] put + }{ %else + int-dict /CharDict get /Char-Info get code + [ 0 0 urx PackHW 1 ury PackHW 0 0 llx PackHW 1 lly PackHW + 0 0 rows PackHW 1 cols PackHW 0 0 16#7FFF PackHW 1 wx PackHW rasters ] put + } ifelse +} def +% +/CKSZ {abs 127 le and} def +/TackRunLengthToRows {runlength 0 ne {/rows rows neg def} if} def +% +/PLOTC { + % PLOTC + /rasters exch def /runlength exch def /cols exch def /rows exch def + /ury exch def /urx exch def /lly exch def /llx exch def + /psz exch def /dsz exch def /wx exch def + % "PLOT" A CHARACTER'S RASTER PATTERN + rows 0 ne { + gsave + currentpoint translate psz dsz div dup scale + cols rows true RasterScaleFactor 0 0 RasterScaleFactor + neg llx .5 add neg ury .5 add tempmatrix astore + GenerateRasters imagemask + grestore + } if + wx x +} def +% +end %$DVCDict +%%EndProlog +%%BeginSetup +BeginDVC$PSDoc +CLRP 300 3600 RES +%%EndSetup +%%DOC$Page: I 1 +1000 BP 39600 30600 PM 0 0 XY +XP +% DefineFont:F24 Category:10 PointSize:14 +/Helvetica-Bold /Helvetica-Bold@DOCPSE DOCPSE ReENCODE +/F24 700.0 /Helvetica-Bold@DOCPSE DPSF +RP +4796 10773 XY F24(X)S 166 x(IMAGE)S 165 x(EXTENSION)S 165 x(PROT)S +-13 x(OCO)S -2 x(L)S +XP +% DefineFont:F40 Category:10 PointSize:9 +/F40 450.0 /Helvetica-Bold@DOCPSE DPSF +RP +4796 13463 XY F40(Revision/U)S -2 x(pdate)S 167 x(Information:)S +XP +% DefineFont:F38 Category:10 PointSize:9 +/Helvetica /Helvetica@DOCPSE DOCPSE ReENCODE +/F38 450.0 /Helvetica@DOCPSE DPSF +RP +11871 13463 XY F38(V2.1)S 33987 Y 4796 X F40(Digi)S -2 x(tal)S 167 x +(Equipment)S 165 x(Corporation)S +PP +EP +%%DOC$Page: III 2 +1000 BP 39600 30600 PM 0 0 XY +XP +% DefineFont:F24 Category:10 PointSize:14 +/F24 700.0 /Helvetica-Bold@DOCPSE DPSF +RP +3600 5321 XY F24(Contents)S +XP +% DefineFont:F40 Category:10 PointSize:9 +/F40 450.0 /Helvetica-Bold@DOCPSE DPSF +RP +5393 6870 XY F40(PREF)S -25 x(ACE)S 26663 X(v)S +XP +% DefineFont:F36 Category:10 PointSize:10 +/F36 500.0 /Helvetica-Bold@DOCPSE DPSF +RP +3600 8066 XY F36(CHAPTER)S 165 x(1)S 499 x(INTRODUC)S -2 x(TION)S +26165 X F40(1\2031)S 896 y 5393 X(1.1)S 7187 X(SCOPE)S 165 x(AND)S +165 x(PURPOSE)S 26165 X(1\2031)S 897 y 5393 X(1.2)S 7187 X +(TERMINOLO)S -2 x(GY)S 26165 X(1\2031)S 897 y 5393 X(1.3)S 7187 X +(CONC)S -2 x(EPTS)S 166 x(RELA)S -33 x(TIONSH)S -2 x(IP)S 26165 X +(1\2031)S 11951 Y 3600 X F36(CHAPTER)S 165 x(2)S 499 x(PROT)S -10 x +(OCOL)S 166 x(MESSAGE)S 166 x(FORMA)S -38 x(TS)S 26165 X F40(2\2031)S +897 y 5393 X(2.1)S 7187 X(REQUEST)S 165 x(PROT)S -9 x(OCOL)S 165 x +(MESSAGE)S 166 x(FORMA)S -33 x(T)S 26165 X(2\2031)S 896 y 5393 X +(2.2)S 7187 X(REPL)S -42 x(Y)S 166 x(PROT)S -9 x(OCOL)S 166 x +(MESSAGE)S 166 x(FORMA)S -34 x(T)S 26165 X(2\2032)S 897 y 5393 X +(2.3)S 7187 X(ERROR)S 164 x(PROT)S -8 x(OCOL)S 165 x(MESSAGE)S 166 x +(FORMA)S -34 x(T)S 26165 X(2\2032)S 897 y 5393 X(2.4)S 7187 X(EVENT)S +165 x(PROT)S -8 x(OCOL)S 165 x(MESSAGE)S 166 x(FORMA)S -34 x(T)S +26165 X(2\2033)S 896 y 5393 X(2.5)S 7187 X(DA)S -34 x(T)S -34 x(A)S +166 x(ENCODIN)S -2 x(G)S 26165 X(2\2034)S 17630 Y 3600 X F36 +(CHAPTER)S 165 x(3)S 499 x(PROT)S -10 x(OCOL)S 166 x(SPECIFICA)S +-36 x(TION)S 166 x(SYNT)S -37 x(AX)S 26165 X F40(3\2031)S 896 y +5393 X(3.1)S 7187 X(GENERA)S -2 x(L)S 166 x(SYNT)S -33 x(AX)S 26165 X +(3)S +(\2031)S 897 y 5393 X(3.2)S 7187 X(REQUEST)S 165 x(SYNT)S -34 x(AX)S +26165 X(3\2031)S 897 y 5393 X(3.3)S 7187 X(ERROR)S 164 x(SYNT)S -33 x +(AX)S 26165 X(3\2032)S 896 y 5393 X(3.4)S 7187 X(EVENT)S 165 x(SYNT)S +-33 x(AX)S 26165 X(3\2033)S 22412 Y 3600 X F36(CHAPTER)S 165 x(4)S +499 x(PROT)S -10 x(OCOL)S 166 x(P)S -37 x(ARAMETER)S 165 x(TYPE)S +2 x(S)S 26165 X F40(4\2031)S 896 y 5393 X(4.1)S 7187 X(CORE)S 165 x +(TYPES)S 26165 X(4\2031)S 897 y 5393 X(4.2)S 7187 X(EXTENSION)S 164 x +(TYPES)S 26165 X(4\2031)S 25401 Y 3600 X F36(CHAPTER)S 165 x(5)S +499 x(PROT)S -10 x(OCOL)S 166 x(ERROR)S 164 x(CODES)S 26165 X F40 +(5\2031)S 896 y 5393 X(5.1)S 7187 X(CORE)S 165 x(ERRORS)S 26165 X +(5\2031)S 897 y 5393 X(5.2)S 7187 X(EXTENSION)S 164 x(ERRORS)S 26165 X +(5)S +(\2032)S 28389 Y 3600 X F36(CHAPTER)S 165 x(6)S 499 x(SER)S -9 x +(VER)S 166 x(DA)S -38 x(T)S -36 x(A)S 166 x(MODEL)S 26165 X F40 +(6\2031)S 897 y 5393 X(6.1)S 7187 X(CONSTR)S -2 x(AINED)S 165 x(VS)S +166 x(UNCONSTR)S -2 x(AINED)S 26165 X(6\2031)S 897 y 5393 X(6.2)S +7187 X(MONO)S 165 x(VS)S 166 x(POL)S -41 x(Y)S 166 x(CHROMA)S -34 x +(TIC)S 26165 X(6\2033)S 896 y 5393 X(6.3)S 7187 X(DA)S -34 x(T)S +-34 x(A)S 166 x(FLOW)S 166 x(PIPELININ)S -2 x(G)S 26165 X(6\2033)S +35879 Y -373 x(iii)S +PP +EP +%%DOC$Page: IV 3 +1000 BP 39600 30600 PM 0 0 XY +3600 Y 3600 X F36(Contents)S 5171 Y 3600 X(CHAPTER)S 165 x(7)S 499 x +(REQUESTS)S 166 x(AND)S 165 x(REPLIES)S 26165 X F40(7\2031)S 896 y +5393 X(7.1)S 7187 X(SESSION)S 165 x(SER)S -9 x(VICES)S 26165 X +(7\2032)S 598 y 7187 X(7.1.1)S 9578 X(Initiali)S -2 x(ze)S 167 x +(Session)S 26165 X(7\2032)S +XP +% DefineFont:F38 Category:10 PointSize:9 +/F38 450.0 /Helvetica@DOCPSE DPSF +RP +9578 7213 XY F38(7.1.1.1)S 11969 X(Per)S 166 x(Server)S 168 x +(information)S 179 x(\201)S 179 x(7\2033)S 548 y 9578 X(7.1.1.2)S +11969 X(Per)S 166 x(Screen)S 168 x(Information)S 179 x(\201)S 180 x +(7)S +(\2033)S 548 y 9578 X(7.1.1.3)S 11969 X(Relationship)S 165 x(to)S +166 x(Core)S 167 x(Session)S 166 x(Information)S 180 x(\201)S 179 x +(7)S +(\2033)S 598 y 7187 X F40(7.1.2)S 9578 X(Set)S 166 x(Operational)S +167 x(Defaults)S 26165 X(7\2034)S 597 y 7187 X(7.1.3)S 9578 X(Query)S +166 x(Operational)S 167 x(Defaults)S 26165 X(7\2035)S 598 y 7187 X +(7.1.4)S 9578 X(T)S -34 x(erminate)S 167 x(Session)S 26165 X(7\2036)S +897 y 5393 X(7.2)S 7187 X(RESOUR)S -2 x(CE)S 166 x(SER)S -8 x(VICES)S +26165 X(7\2037)S 598 y 7187 X(7.2.1)S 9578 X(Resource)S 167 x +(Creation)S 26165 X(7\2037)S 547 y 9578 X F38(7.2.1.1)S 11969 X +(Image)S 167 x(Object)S 165 x(Resource)S 181 x(\201)S 179 x(7\2038)S +548 y 9578 X(7.2.1.2)S 11969 X(Domain)S 166 x(Control)S 166 x +(Context)S 166 x(Resource)S 181 x(\201)S 179 x(7\2039)S 548 y 9578 X +(7.2.1.3)S 11969 X(Process)S 167 x(Control)S 166 x(Context)S 166 x +(Creation)S 179 x(\201)S 180 x(7\2031)S -33 x(1)S 598 y 7187 X F40 +(7.2.2)S 9578 X(Resource)S 167 x(Copy)S 25916 X(7\20312)S 598 y +7187 X(7.2.3)S 9578 X(Resource)S 167 x(Delete)S 25916 X(7\20312)S +598 y 7187 X(7.2.4)S 9578 X(Resource)S 167 x(Query)S 25916 X +(7\20313)S 548 y 9578 X F38(7.2.4.1)S 11969 X(Image)S 167 x(Object)S +165 x(Query)S 180 x(\201)S 180 x(7\20313)S 548 y 9578 X(7.2.4.2)S +11969 X(Domain)S 166 x(Control)S 166 x(Context)S 166 x(Query)S 180 x +(\201)S 179 x(7\20314)S 547 y 9578 X(7.2.4.3)S 11969 X(Process)S +167 x(Control)S 166 x(Context)S 166 x(Query)S 180 x(\201)S 179 x +(7\20315)S 598 y 7187 X F40(7.2.5)S 9578 X(Import/Export)S 166 x +(Services)S 25916 X(7\20315)S 548 y 9578 X F38(7.2.5.1)S 11969 X +(Import)S 166 x(Image)S 180 x(\201)S 180 x(7\20316)S 548 y 9578 X +(7.2.5.2)S 11969 X(Export)S 166 x(Image)S 180 x(\201)S 180 x +(7\20317)S 897 y 5393 X F40(7.3)S 7187 X(TRANSPO)S -2 x(RT)S 166 x +(SER)S -8 x(VICES)S 25916 X(7\20318)S 598 y 7187 X(7.3.1)S 9578 X +(Overview)S 166 x(of)S 167 x(Data)S 166 x(T)S -25 x(ransport)S 25916 X +(7)S +(\20318)S 547 y 9578 X F38(7.3.1.1)S 11969 X(T)S -17 x(ranspor)S +2 x(t)S 165 x(Proces)S 2 x(s)S 179 x(\201)S 179 x(7\20318)S 548 y +9578 X(7.3.1.2)S 11969 X(T)S -17 x(ranspor)S 2 x(t)S 165 x(Mode)S +2 x(s)S 179 x(\201)S 179 x(7\20319)S 548 y 9578 X(7.3.1.3)S 11969 X +(T)S -17 x(ranspor)S 2 x(t)S 165 x(Data)S 166 x(Formats)S 181 x +(\201)S 179 x(7\20319)S 548 y 9578 X(7.3.1.4)S 11969 X(T)S -17 x +(ranspor)S 2 x(t)S 165 x(Granularity)S 167 x(&)S 166 x(Atomicity)S +178 x(\201)S 180 x(7\20321)S 548 y 9578 X(7.3.1.5)S 11969 X +(Synchronization)S 180 x(\201)S 180 x(7\20322)S 598 y 7187 X F40 +(7.3.2)S 9578 X(Set)S 166 x(T)S -25 x(ranspor)S 2 x(t)S 166 x +(Context)S 25916 X(7\20322)S 598 y 7187 X(7.3.3)S 9578 X(T)S -9 x +(ile)S 166 x(Data)S 167 x(T)S -25 x(ransport)S 25916 X(7\20323)S +548 y 9578 X F38(7.3.3.1)S 11969 X(Cli)S -2 x(ent\203>Serve)S 2 x(r)S +179 x(\201)S 179 x(7\20323)S 548 y 9578 X(7.3.3.2)S 11969 X +(Server\203>Client)S 179 x(\201)S 179 x(7\20325)S 597 y 7187 X F40 +(7.3.4)S 9578 X(Stream)S 166 x(Data)S 167 x(T)S -25 x(ransport)S +25916 X(7\20326)S 548 y 9578 X F38(7.3.4.1)S 11969 X(Cli)S -2 x +(ent\203>Serve)S 2 x(r)S 179 x(\201)S 179 x(7\20327)S 548 y 9578 X +(7.3.4.2)S 11969 X(Server\203>Client)S 179 x(\201)S 179 x(7\20328)S +598 y 7187 X F40(7.3.5)S 9578 X(Abort)S 166 x(T)S -25 x(ransport)S +25916 X(7\20330)S 897 y 5393 X(7.4)S 7187 X(PROCESS)S 165 x(SER)S +-8 x(VICES)S 25916 X(7\20331)S 597 y 7187 X(7.4.1)S 9578 X(Point)S +165 x(Proces)S 2 x(sing)S 25916 X(7\20333)S 598 y 7187 X(7.4.2)S +9578 X(Area)S 166 x(Process)S 2 x(ing)S 25916 X(7\20335)S 598 y +7187 X(7.4.3)S 9578 X(Ensemble)S 165 x(Proces)S 2 x(sing)S 25916 X +(7)S +(\20337)S 548 y 9578 X F38(7.4.3.1)S 11969 X(Arithmetic)S 179 x +(\201)S 179 x(7\20337)S 548 y 9578 X(7.4.3.2)S 11969 X(Relational)S +178 x(\201)S 179 x(7\20338)S 548 y 9578 X(7.4.3.3)S 11969 X(Logical)S +179 x(\201)S 179 x(7\20339)S 548 y 9578 X(7.4.3.4)S 11969 X +(Mathematical)S 180 x(\201)S 179 x(7\20340)S 35879 Y 3600 X F40(iv)S +PP +EP +%%DOC$Page: V 4 +1000 BP 39600 30600 PM 0 0 XY +3600 Y 24754 X F36(Contents)S 5133 Y 7187 X F40(7.4.4)S 9578 X +(Geometric)S 25916 X(7\20342)S 548 y 9578 X F38(7.4.4.1)S 11969 X +(Crop)S 166 x(Image)S 180 x(\201)S 180 x(7\20342)S 548 y 9578 X +(7.4.4.2)S 11969 X(T)S -17 x(ranslate)S 167 x(Image)S 180 x(\201)S +179 x(7\20343)S 548 y 9578 X(7.4.4.3)S 11969 X(Scale)S 166 x(Image)S +180 x(\201)S 179 x(7\20344)S 548 y 9578 X(7.4.4.4)S 11969 X(Rotate)S +165 x(Image)S 181 x(\201)S 179 x(7\20345)S 548 y 9578 X(7.4.4.5)S +11969 X(Mirror)S 167 x(Image)S 180 x(\201)S 179 x(7\20346)S 598 y +7187 X F40(7.4.5)S 9578 X(Radiometric)S 25916 X(7\20347)S 548 y +9578 X F38(7.4.5.1)S 11969 X(Constrain)S 179 x(\201)S 180 x(7\20347)S +547 y 9578 X(7.4.5.2)S 11969 X(Histogram)S 166 x(Matching)S 180 x +(\201)S 180 x(7\20348)S 548 y 9578 X(7.4.5.3)S 11969 X(Separate)S +167 x(Spectral)S 166 x(Compon)S 2 x(ents)S 179 x(\201)S 179 x +(7\20349)S 548 y 9578 X(7.4.5.4)S 11969 X(Combine)S 166 x(Spectral)S +167 x(Componen)S 2 x(ts)S 179 x(\201)S 179 x(7\20349)S 548 y 9578 X +(7.4.5.5)S 11969 X(Dit)S -2 x(her)S 181 x(\201)S 179 x(7\20350)S +548 y 9578 X(7.4.5.6)S 11969 X(Luminance)S 181 x(\201)S 179 x +(7\20351)S 897 y 5393 X F40(7.5)S 7187 X(ST)S -34 x(A)S -33 x +(TISTICS)S 165 x(SER)S -9 x(VICES)S 25916 X(7\20352)S 598 y 7187 X +(7.5.1)S 9578 X(Component)S 165 x(Distribution)S 25916 X(7\20352)S +597 y 7187 X(7.5.2)S 9578 X(Point)S 165 x(Statistics)S 25916 X +(7\20353)S 598 y 7187 X(7.5.3)S 9578 X(Area)S 166 x(Statistics)S +25916 X(7\20354)S 897 y 5393 X(7.6)S 7187 X(PROCESS)S 165 x(CONTRO)S +-2 x(L)S 166 x(SER)S -8 x(VICES)S 25916 X(7\20355)S 598 y 7187 X +(7.6.1)S 9578 X(Adding)S 165 x(Segments)S 25916 X(7\20355)S 597 y +7187 X(7.6.2)S 9578 X(Executing)S 166 x(a)S 166 x(Pipe)S 25916 X +(7\20356)S 598 y 7187 X(7.6.3)S 9578 X(T)S -34 x(erminating)S 166 x +(a)S 166 x(Pipe)S 25916 X(7\20357)S 897 y 5393 X(7.7)S 7187 X +(DISPLA)S -43 x(Y)S 166 x(SER)S -8 x(VICES)S 25916 X(7\20358)S 896 y +5393 X(7.8)S 7187 X(EVENT)S 165 x(SER)S -8 x(VICES)S 25916 X +(7\20359)S 598 y 7187 X(7.8.1)S 9578 X(Select)S 166 x(Events)S 25916 X +(7)S +(\20359)S 598 y 7187 X(7.8.2)S 9578 X(Query)S 166 x(Events)S 25916 X +(7)S +(\20359)S 21322 Y 3600 X F36(CHAPTER)S 165 x(8)S 499 x(EVENTS)S +26165 X F40(8\2031)S 897 y 5393 X(8.1)S 7187 X(COMPUT)S -34 x(A)S +-34 x(TION)S 166 x(COMPLETE)S 26165 X(8\2031)S 897 y 5393 X(8.2)S +7187 X(PIPELINE)S 165 x(COMPLETE)S 26165 X(8\2031)S 896 y 5393 X +(8.3)S 7187 X(SEQUENC)S -2 x(E)S 167 x(COMPLETE)S 26165 X(8\2032)S +25208 Y 3600 X F36(CHAPTER)S 165 x(9)S 499 x(APPENDICES)S 26165 X +F40(9\2031)S 896 y 5393 X(9.1)S 7187 X(XIE)S 165 x(PROT)S -8 x(OCOL)S +165 x(SUMMAR)S -17 x(Y)S 26165 X(9\2031)S 897 y 5393 X(9.2)S 7187 X +(RECOMMENDED)S 165 x(SER)S -9 x(VER)S 166 x(RESOURCE)S 165 x +(CONTENTS)S 26165 X(9\2033)S 598 y 7187 X(9.2.1)S 9578 X(IOB)S 26165 X +(9)S +(\2033)S 598 y 7187 X(9.2.2)S 9578 X(IDC)S 26165 X(9\2034)S 597 y +7187 X(9.2.3)S 9578 X(IPC)S 26165 X(9\2035)S 897 y 5393 X(9.3)S +7187 X(IMAGE)S 165 x(DA)S -34 x(T)S -33 x(A)S 166 x(A)S -34 x +(TTRIBUTES)S 165 x(&)S 166 x(ORGAN)S -2 x(IZA)S -34 x(TION)S 26165 X +(9)S +(\2036)S 598 y 7187 X(9.3.1)S 9578 X(Primitive)S 165 x(Attributes)S +26165 X(9\2037)S 598 y 7187 X(9.3.2)S 9578 X(Organization)S 166 x(&)S +165 x(Encoding)S 166 x(Attributes)S 26165 X(9\2037)S 547 y 9578 X +F38(9.3.2.1)S 11969 X(Encoding)S 167 x(Attributes)S 179 x(\201)S +179 x(9\2038)S 548 y 9578 X(9.3.2.2)S 11969 X(Component)S 167 x +(Space)S 167 x(Attributes)S 179 x(\201)S 179 x(9\2038)S 598 y 7187 X +F40(9.3.3)S 9578 X(Presentat)S 2 x(ion)S 165 x(Attributes)S 25916 X +(9)S +(\20310)S 897 y 5393 X(9.4)S 7187 X(CONC)S -2 x(EPT)S 166 x(AND)S +165 x(VERSION)S 165 x(CHANGES)S 25940 X(9\2031)S -24 x(1)S 598 y +7187 X(9.4.1)S 9578 X(Conceptual)S 166 x(Changes)S 25940 X(9\2031)S +-24 x(1)S 35879 Y -249 x(v)S +PP +EP +%%DOC$Page: VI 5 +1000 BP 39600 30600 PM 0 0 XY +3600 Y 3600 X F36(Contents)S 5133 Y 7187 X F40(9.4.2)S 9578 X(V1.0)S +166 x(-)S 166 x(V2.0)S 166 x(Protocol)S 167 x(Changes)S 25916 X +(9\20312)S 897 y 5393 X(9.5)S 7187 X(REFERENC)S -2 x(ES)S 25916 X +(9\20314)S 35879 Y 3600 X(vi)S +PP +EP +%%DOC$Page: V 6 +1000 BP 39600 30600 PM 0 0 XY +3600 4845 XY 23316 48 R 6190 Y 3600 X F24(Preface)S +XP +% DefineFont:F151 Category:10 PointSize:10 +/NewCenturySchlbk-Roman /NewCenturySchlbk-Roman@DOCPSE DOCPSE ReENCODE +/F151 500.0 /NewCenturySchlbk-Roman@DOCPSE DPSF +RP +4796 8482 XY F151(The)S 186 x(core)S 187 x(X)S 186 x(architecture)S +187 x(is)S 186 x(a)S 186 x(major)S 187 x(step)S 186 x(in)S 186 x +(the)S 186 x(de\211nition)S 187 x(of)S 187 x(open,)S 192 x +(interactive)S 187 x(applications)S 597 y 4796 X(display)S 166 x +(services.)S 251 x(It)S 166 x(has,)S 167 x(in)S 167 x(essence,)S +167 x(pried)S 167 x(apart)S 166 x(the)S 167 x(tightly)S 167 x +(coupled,)S 168 x(private)S 167 x(interconnect)S 168 x(which)S 598 y +4796 X(has)S 170 x(existed)S 171 x(in)S 171 x(the)S 170 x(past)S +170 x(between)S 171 x(application)S 170 x(and)S 171 x(display)S 171 x +(subsystem)S 170 x(by)S 171 x(specifying)S 171 x(a)S 171 x +(structured)S 598 y 4796 X(set)S 165 x(of)S 166 x(display)S 166 x +(services.)S 897 y 4796 X(The)S 181 x(core)S 182 x(X)S 181 x +(protocol)S 181 x(recognizes)S 182 x(the)S 181 x(need)S 182 x(for)S +181 x(minimally)S 181 x(suf\211cient)S 182 x(capabilities,)S 185 x +(and,)S 185 x(as)S 181 x(such,)S 597 y 4796 X(leaves)S 184 x(the)S +184 x(speci\211cation)S 185 x(of)S 184 x(robust)S 184 x(application)S +184 x(domain)S 184 x(speci\211c)S 185 x(display)S 183 x(services)S +185 x(to)S 184 x(extension)S 598 y 4796 X(packages.)S 289 x(These)S +186 x(extension)S 186 x(packages)S 186 x(relate)S 185 x(to)S 186 x +(the)S 186 x(core)S 185 x(X)S 186 x(protocol)S 185 x(by)S 186 x(way)S +186 x(of)S 185 x(an)S 186 x(extension)S 598 y 4796 X(mechanism)S +166 x(speci\211ed)S 166 x(in)S 166 x(the)S 166 x(core)S 167 x(X)S +166 x(protocol.)S 897 y 4796 X(This)S 171 x(document)S 173 x +(contains)S 172 x(the)S 171 x(X)S 172 x(wire)S 171 x(protocol)S 172 x +(speci)S +(\211cation)S 172 x(for)S 172 x(the)S 172 x(proposed)S 171 x(X)S +171 x(Image)S 172 x(Extension)S 597 y 4796 X(Package.)S 260 x(It)S +171 x(is)S 170 x(assumed)S 171 x(that)S 171 x(the)S 171 x(reader)S +171 x(is)S 171 x(familiar)S 170 x(with)S 171 x(the)S 171 x(core)S +171 x(X)S 171 x(architecture,)S 174 x(the)S 171 x(X1)S -28 x(1)S +171 x(wire)S 598 y 4796 X(protocol,)S 166 x(and)S 166 x(the)S 167 x +(proposed)S 165 x(X)S 166 x(Image)S 166 x(Extension)S 167 x +(Concepts.)S 16551 Y 3600 X 23316 48 R +XP +% DefineFont:F28 Category:10 PointSize:12 +/F28 600.0 /Helvetica-Bold@DOCPSE DPSF +RP +3600 17249 XY F28(Related)S 167 x(Documen)S 2 x(ts)S 896 y 4796 X +F151(\201)S 594 x(The)S 167 x(X)S 166 x(W)S -19 x(indow)S 166 x +(System)S 165 x(\(Schei\212er)S 167 x(&)S 166 x(Gettys\))S 748 y +5692 X(Provides)S 167 x(an)S 166 x(overview)S 167 x(of)S 166 x(the)S +166 x(X)S 166 x(windowing)S 166 x(system)S 165 x(and)S 167 x +(architecture.)S 747 y 4796 X(\201)S 594 x(X1)S -28 x(1)S 166 x(W)S +-18 x(indow)S 165 x(System)S 166 x(Protocol)S 747 y 5692 X +(Describes)S 165 x(the)S 167 x(core)S 166 x(X1)S -28 x(1)S 166 x +(protocol)S 166 x(and)S 167 x(conventions)S 167 x(used)S 166 x(in)S +166 x(specifying)S 167 x(extension)S 167 x(packages.)S 747 y 4796 X +(\201)S 594 x(X)S 166 x(Extension)S 166 x(Package)S 168 x +(Guidelines)S 747 y 5692 X(Sets)S 165 x(forth)S 167 x(guidelines)S +166 x(for)S 167 x(extension)S 166 x(packages.)S 748 y 4796 X(\201)S +594 x(X)S 166 x(Image)S 166 x(Extension)S 166 x(Concepts)S 747 y +5692 X(Describes)S 188 x(the)S 189 x(architectural)S 189 x(concepts)S +189 x(behind)S 189 x(this)S 188 x(protocol)S 189 x(speci\211cation.)S +295 x(The)S 189 x(X)S 188 x(Image)S 598 y 5692 X(Extension)S 169 x +(Concepts)S 167 x(document)S 169 x(is)S 168 x(one)S 169 x(several)S +168 x(companion)S 169 x(documents)S 168 x(to)S 168 x(this)S 168 x +(protocol)S 169 x(speci\211-)S 597 y 5692 X(cation.)S 748 y 4796 X +(\201)S 594 x(X)S 166 x(Image)S 166 x(Extension)S 166 x(Server)S +167 x(Guidelines)S 747 y 5692 X(Provides)S 172 x(an)S 172 x +(overview)S 172 x(of)S 172 x(the)S 171 x(design)S 172 x(of)S 172 x +(an)S 172 x(image)S 171 x(extension)S 172 x(server)S -36 x(.)S 261 x +(The)S 172 x(X)S 171 x(Image)S 172 x(Extension)S 598 y 5692 X +(Server)S 192 x(Guidelines)S 190 x(document)S 192 x(is)S 190 x(one)S +191 x(of)S 191 x(several)S 191 x(companion)S 191 x(documents)S 191 x +(to)S 191 x(this)S 190 x(protocol)S 597 y 5692 X(speci\211cation.)S +28756 Y 3600 X 23316 48 R 697 y 3600 X F28(Participants)S 897 y +4796 X F151(\201)S 594 x(Author:)S 747 y 5692 X(\201)S 595 x(Joseph)S +166 x(Mauro)S 747 y 5692 X(\201)S 595 x(Digital)S 165 x(Equipment)S +166 x(Corporation)S 747 y 5692 X(\201)S 595 x(MS:)S 166 x(MK2-2/K5)S +747 y 5692 X(\201)S 595 x(Continental)S 166 x(Blvd.)S 748 y 5692 X +(\201)S 595 x(Merrimack,)S 167 x(New)S 166 x(Hampshire)S 166 x +(03057)S 35879 Y 26663 X F40(v)S +PP +EP +%%DOC$Page: VI 7 +1000 BP 39600 30600 PM 0 0 XY +XP +% DefineFont:F36 Category:10 PointSize:10 +/F36 500.0 /Helvetica-Bold@DOCPSE DPSF +RP +3600 3600 XY F36(Preface)S 5146 Y 292 x F151(\201)S 595 x +(603-884-0528)S 747 y 5692 X(\201)S 595 x(MAURO@OPTIC)S -2 x +(.DEC.COM)S 7238 Y 4796 X(\201)S 594 x(Contributors:)S 747 y 5692 X +(\201)S 595 x(Olliver)S 166 x(Jones)S 166 x(\(Apollo\))S 748 y 5692 X +(\201)S 595 x(Barry)S 166 x(Medoff)S 166 x(\(SUN\))S 747 y 5692 X +(\201)S 595 x(John)S 167 x(W)S -28 x(eber)S 166 x(\(Digital)S 166 x +(ISG\))S 747 y 5692 X(\201)S 595 x(Rich)S 166 x(Piccolo)S 166 x +(\(Digital)S 166 x(ISG\))S 747 y 5692 X(\201)S 595 x(Robert)S 166 x +(Shelley)S 166 x(\(Digital)S 166 x(ISG\))S 12319 Y 4796 X(\201)S +594 x(Invited)S 166 x(Reviewers:)S 747 y 5692 X(\201)S 595 x(Rebeca)S +166 x(Hinkle)S 166 x(\(Apollo\))S 14561 Y 3600 X 23316 48 R 697 y +3600 X F28(Revision)S 167 x(History)S 17051 Y 4796 X F151(rev)S 166 x +(v1.0)S 167 x(August)S 167 x(1,)S 166 x(1988)S 166 x(\211rst)S 166 x +(protocol)S 166 x(draft)S 897 y 4796 X(rev)S 166 x(v2.0)S 167 x +(April)S 166 x(12,)S 166 x(1989)S 166 x(major)S 167 x(changes)S 167 x +(based)S 165 x(upon)S 167 x(consortia)S 166 x(review)S 897 y 4796 X +(rev)S 166 x(v2.1)S 167 x(November)S 167 x(1,)S 166 x(1989)S 166 x +(chang)S 2 x(es)S 165 x(based)S 166 x(upon)S 167 x(FT1)S 166 x +(implementation)S 20339 Y 3600 X 23316 48 R 697 y 3600 X F28 +(Organization)S 897 y 4796 X F151(This)S 166 x(document)S 166 x(is)S +166 x(organized)S 166 x(into)S 167 x(the)S 166 x(following)S 166 x +(chapters)S 166 x(and)S 166 x(appendices:)S 897 y 4796 X(\201)S 594 x +(Chapter)S 166 x(1,)S 167 x(Introduction,)S 167 x(explains)S 166 x +(the)S 166 x(purpose)S 166 x(of)S 166 x(the)S 167 x(X)S 165 x(Image)S +166 x(Extension)S 747 y 4796 X(\201)S 594 x(Chapter)S 166 x(2,)S +167 x(Protocol)S 166 x(Message)S 166 x(Formats,)S 166 x(de\211nes)S +167 x(structure)S 166 x(of)S 166 x(protocol)S 166 x(messages)S 747 y +4796 X(\201)S 594 x(Chapter)S 166 x(3,)S 167 x(Protocol)S 166 x +(Speci\211cation)S 167 x(Syntax,)S 167 x(de\211nes)S 166 x(protocol)S +167 x(function)S 167 x(syntax)S 747 y 4796 X(\201)S 594 x(Chapter)S +166 x(4,)S 167 x(Protocol)S 166 x(Parameter)S 166 x(T)S -25 x(ypes,)S +166 x(de\211nes)S 167 x(types)S 166 x(for)S 166 x(protocol)S 166 x +(parameters)S 747 y 4796 X(\201)S 594 x(Chapter)S 166 x(5,)S 167 x +(Protocol)S 166 x(Error)S 166 x(Codes,)S 166 x(de\211nes)S 167 x +(possible)S 165 x(protocol)S 166 x(errors)S 748 y 4796 X(\201)S 594 x +(Chapter)S 166 x(6,)S 167 x(Server)S 166 x(Data)S 166 x(Model,)S +166 x(server)S 167 x(data)S 166 x(organization)S 166 x(and)S 167 x +(operator)S 166 x(issues)S 747 y 4796 X(\201)S 594 x(Chapter)S 166 x +(7,)S 167 x(Requests)S 165 x(and)S 166 x(Replies,)S 166 x(describes)S +165 x(the)S 166 x(main)S 167 x(protocol)S 166 x(functions)S 747 y +4796 X(\201)S 594 x(Chapter)S 166 x(8,)S 167 x(Events,)S 166 x +(describes)S 166 x(the)S 166 x(various)S 166 x(extension)S 167 x +(related)S 166 x(events)S 747 y 4796 X(\201)S 594 x(Appendices:)S +747 y 5692 X(\201)S 595 x(XIE)S 165 x(Protocol)S 166 x(Summary)S +748 y 5692 X(\201)S 595 x(Recommended)S 166 x(Server)S 167 x +(Resource)S 166 x(Contents)S 747 y 5692 X(\201)S 595 x(Image)S 166 x +(Data)S 165 x(Attributes)S 165 x(&)S 166 x(Organization)S 747 y +5692 X(\201)S 595 x(Concept)S 166 x(and)S 166 x(V)S -46 x(ersion)S +166 x(Changes)S 747 y 5692 X(\201)S 595 x(References)S 35879 Y 3600 X +F40(vi)S +PP +EP +%%DOC$Page: 1-1 8 +1000 BP 39600 30600 PM 0 0 XY +9007 Y 3600 X F24(Chapter)S 498 x(1)S 10651 Y 3600 X(INTROD)S -2 x +(UCTION)S 13606 Y 3600 X F28(1.1)S 599 x(Scope)S 167 x(and)S 166 x +(Purpose)S 14851 Y 4796 X F151(This)S 173 x(document)S 174 x +(speci\211es)S 173 x(the)S 174 x(X)S 173 x(wire)S 173 x(protocol)S +174 x(for)S 174 x(the)S 173 x(X)S 173 x(Image)S 174 x(Extension)S +174 x(\(XIE\).)S 173 x(This)S 173 x(extension)S 598 y 4796 X +(protocol)S 173 x(is)S 173 x(deemed)S 174 x(to)S 173 x(be)S 174 x +(suf\211cient)S 174 x(to)S 173 x(support)S 174 x(implementation)S +173 x(of)S 174 x(the)S 174 x(image)S 173 x(concepts)S 174 x(found)S +174 x(in)S 598 y 4796 X(the)S 175 x(X)S 175 x(Image)S 175 x +(Extension)S 176 x(Concepts)S 175 x(document.)S 269 x(This)S 175 x +(speci)S +(\211cation)S 176 x(de\211nes)S 175 x(the)S 176 x(syntax,)S 179 x +(structure,)S 598 y 4796 X(and)S 166 x(semantics)S 165 x(of)S 166 x +(X)S 166 x(wire)S 166 x(image)S 166 x(extension)S 167 x(protocol)S +166 x(elements.)S 896 y 4796 X(This)S 186 x(speci\211cation)S 186 x +(does)S 186 x(not)S 186 x(contain)S 186 x(any)S 187 x(backgrou)S +2 x(nd)S 186 x(material)S 186 x(useful)S 186 x(in)S 186 x +(understanding)S 187 x(the)S 598 y 4796 X(imaging)S 172 x(services)S +172 x(concepts)S 172 x(that)S 172 x(the)S 172 x(extension)S 173 x +(protocol)S 172 x(enables.)S 261 x(This)S 172 x(backgrou)S 2 x(nd)S +172 x(material)S 171 x(can)S 598 y 4796 X(be)S 166 x(found)S 166 x +(in)S 166 x(the)S 167 x(extension)S 166 x(concepts)S 167 x +(document.)S 896 y 4796 X(This)S 181 x(speci\211cation)S 182 x(does)S +181 x(not)S 182 x(contain)S 182 x(any)S 182 x(languag)S 2 x(e)S 181 x +(function)S 182 x(bindings.)S 281 x(These)S 182 x(will)S 181 x(be)S +181 x(left)S 182 x(to)S 181 x(a)S 598 y 4796 X(follow)S 161 x(on)S +162 x(document)S 163 x(which)S 162 x(will)S 162 x(specify)S 162 x +(the)S 162 x(languag)S 2 x(e)S 162 x(bindings)S 163 x(for)S 162 x +(the)S 162 x(X)S 162 x(Image)S 162 x(Extension)S 162 x(to)S 162 x +(Xlib)S 598 y 4796 X(\(XIE)S -2 x(lib\).)S 22224 Y 3600 X F28(1.2)S +599 x(T)S -44 x(erminology)S 23469 Y 4796 X F151(This)S 182 x +(speci\211cation)S 182 x(makes)S 182 x(use)S 182 x(of)S 182 x(two)S +181 x(classes)S 181 x(of)S 182 x(terminology:)S 283 x(descriptive)S +182 x(image)S 182 x(terminology)S -54 x(,)S 598 y 4796 X(and)S 180 x +(parametric)S 181 x(terminology)S -54 x(.)S 279 x(The)S 181 x +(descriptive)S 181 x(image)S 180 x(terminology)S 182 x(is)S 180 x +(de\211ned)S 182 x(in)S 181 x(a)S 180 x(glossary)S 181 x(in)S 598 y +4796 X(the)S 170 x(X)S 170 x(Image)S 171 x(Extension)S 170 x +(Concepts)S 170 x(document)S 171 x(and)S 171 x(is)S 170 x(used)S +170 x(through)S 2 x(out)S 170 x(this)S 170 x(protocol)S 171 x +(speci\211cation.)S 597 y 4796 X(Readers)S 165 x(should)S 166 x +(consider)S 167 x(reviewing)S 167 x(this)S 165 x(material)S 166 x +(before)S 166 x(reading)S 167 x(this)S 166 x(document.)S 897 y 4796 X +(The)S 175 x(parametric)S 175 x(terminology)S 175 x(de\211nes)S 176 x +(the)S 174 x(parameter)S 175 x(types)S 175 x(recognized)S 175 x(in)S +175 x(the)S 175 x(core)S 175 x(X1)S -28 x(1)S 175 x(protocol)S 598 y +4796 X(and)S 190 x(in)S 190 x(the)S 190 x(image)S 190 x(extension)S +191 x(protocol.)S 297 x(Image)S 190 x(extension)S 191 x(protocol)S +190 x(types)S 190 x(are)S 190 x(de\211ned)S 191 x(in)S 190 x(this)S +597 y 4796 X(document.)S 28749 Y 3600 X F28(1.3)S 599 x(Concepts)S +167 x(Relations)S 2 x(hip)S 29995 Y 4796 X F151(The)S 191 x(X)S 190 x +(Image)S 190 x(Extension)S 191 x(Concepts)S 190 x(document)S 191 x +(describes)S 190 x(the)S 191 x(reasoning)S 191 x(behind)S 191 x(an)S +191 x(X)S 190 x(image)S 597 y 4796 X(extension)S 175 x(and)S 176 x +(lays)S 175 x(the)S 176 x(foundation)S 175 x(for)S 176 x(this)S 175 x +(protocol)S 175 x(speci\211cation.)S 268 x(Conceptual)S 176 x +(shifts)S 174 x(since)S 175 x(the)S 598 y 4796 X(concepts)S 177 x +(document)S 179 x(was)S 176 x(drafted,)S 181 x(and)S 178 x(major)S +178 x(protocol)S 178 x(differences)S 178 x(between)S 178 x(versions)S +178 x(1)S 177 x(and)S 178 x(2)S 178 x(of)S 598 y 4796 X(this)S 173 x +(speci)S +(\211cation)S 174 x(are)S 175 x(brie\212y)S 174 x(described)S 174 x +(in)S 174 x(the)S 175 x("concept)S 174 x(and)S 174 x(version)S 175 x +(changes")S 174 x(appendix.)S 266 x(While)S 598 y 4796 X(there)S +181 x(have)S 182 x(been)S 181 x(protocol)S 182 x(changes)S 182 x +(between)S 181 x(version)S 181 x(2.0)S 182 x(and)S 181 x(2.1)S 182 x +(\(deriving)S 182 x(from)S 181 x(the)S 181 x(\211eld)S 182 x(test)S +597 y 4796 X(implementation\),)S 166 x(they)S 166 x(do)S 166 x(not)S +167 x(re\212ect)S 166 x(major)S 167 x(conceptual)S 167 x(shifts.)S +35879 Y 22280 X F40(INTRO)S -2 x(DUCTION)S 447 x(1\2031)S +PP +EP +%%DOC$Page: 2-1 9 +1000 BP 39600 30600 PM 0 0 XY +9007 Y 3600 X F24(Chapter)S 498 x(2)S 10651 Y 3600 X(PROT)S -13 x +(OCO)S -2 x(L)S 167 x(MESSAGE)S 165 x(FORMA)S -53 x(TS)S 13357 Y +4796 X F151(XIEP)S 184 x(follows)S 184 x(the)S 186 x(same)S 185 x +(operational)S 185 x(model)S 185 x(as)S 185 x(set)S 185 x(forth)S +186 x(by)S 185 x(the)S 186 x(X)S 185 x(core)S 186 x(protocol)S 185 x +(speci)S +(\211cation)S 598 y 4796 X(regarding)S 178 x(the)S 177 x(use)S 177 x +(of)S 177 x(requests,)S 179 x(replies,)S 180 x(errors,)S 180 x(and)S +177 x(events,)S 181 x(and)S 177 x(the)S 177 x(overall)S 177 x +(structure)S 177 x(of)S 177 x(these)S 597 y 4796 X(protocol)S 182 x +(objects.)S 282 x(This)S 183 x(section)S 182 x(de\211nes)S 183 x +(the)S 182 x(overall)S 183 x(structure)S 183 x(of)S 182 x(these)S +183 x(protocol)S 182 x(objects)S 183 x(for)S 182 x(the)S 598 y 4796 X +(image)S 166 x(extension)S 167 x(protocol.)S 16545 Y 3600 X F28(2.1)S +599 x(Request)S 167 x(Protocol)S 166 x(Messa)S 2 x(ge)S 166 x +(Format)S 17790 Y 4796 X F151(All)S 169 x(image)S 171 x(extension)S +171 x(requests)S 170 x(comply)S 170 x(with)S 170 x(the)S 171 x +(overall)S 171 x(extension)S 171 x(request)S 170 x(format)S 170 x +(as)S 170 x(speci\211ed)S 170 x(in)S 598 y 4796 X(the)S 171 x(X1)S +-28 x(1)S 172 x(core)S 172 x(protocol)S 171 x(speci\211cation)S 172 x +(request)S 171 x(format)S 171 x(section.)S 261 x(This)S 171 x +(section)S 172 x(reiterates)S 171 x(that)S 171 x(format)S 598 y +4796 X(as)S 165 x(applied)S 166 x(to)S 166 x(the)S 166 x(image)S +166 x(extension.)S 896 y 4796 X(An)S 180 x(image)S 180 x(extension)S +181 x(request)S 180 x(consists)S 180 x(of)S 180 x(4)S 180 x(bytes)S +180 x(of)S 180 x(header)S 181 x(followed)S 179 x(by)S 181 x(zero)S +180 x(or)S 181 x(more)S 180 x(bytes)S 180 x(of)S 598 y 4796 X(data.)S +282 x(The)S 183 x(four)S 184 x(byte)S 183 x(header)S 183 x(complies)S +182 x(exactly)S 184 x(with)S 182 x(the)S 183 x(core)S 183 x +(protocol)S 183 x(request)S 183 x(format)S 182 x(\(1)S 183 x(byte)S +598 y 4796 X(major)S 167 x(opcode)S 168 x(-)S 167 x(1)S 168 x(byte)S +167 x(minor)S 168 x(opcode)S 168 x(-)S 167 x(2)S 167 x(bytes)S 167 x +(total)S 167 x(length)S 169 x(\211eld\).)S 252 x(Unused)S 168 x +(bytes)S 167 x(in)S 168 x(a)S 167 x(request)S 167 x(are)S 598 y +4796 X(not)S 166 x(required)S 166 x(to)S 166 x(be)S 166 x(zero.)S +XP +% DefineFont:F102 Category:10 PointSize:8 +/Courier /Courier@DOCPSE DOCPSE ReENCODE +/F102 400.0 /Courier@DOCPSE DPSF +RP +6708 22821 XY F102(REQUEST)S 240 x(FORMAT)S 449 y 6708 X +(------------)S 2 x(--)S 747 y 6469 X(BYTE)S 479 x(CONTENTS)S 747 y +6469 X(0)S 479 x(major)S 239 x(opcode)S 449 y 6469 X(1)S 479 x +(minor)S 239 x(opcode)S 240 x(-)S 239 x(extension)S 240 x(function)S +240 x(code)S 448 y 6469 X(2)S 479 x(length)S 239 x(field)S 240 x +(\(LSB\))S 448 y 6469 X(3)S 479 x(length)S 239 x(field)S 240 x +(\(MSB\))S 448 y 6469 X(4)S 479 x(start)S 239 x(of)S 239 x(data)S +240 x(-)S 239 x(\(request)S 240 x(specific\))S 449 y 6708 X(.)S 448 y +-239 x(.)S 448 y -239 x(.)S 897 y 4796 X F151(The)S 154 x(major)S +154 x(opcode)S 155 x(\211eld)S 154 x(contains)S 154 x(the)S 154 x +(opcode)S 154 x(signaling)S 155 x(a)S 154 x(request)S 154 x(for)S +154 x(the)S 154 x(image)S 154 x(extension)S 155 x(package)S 598 y +4796 X(\(between)S 174 x(128)S 175 x(and)S 176 x(255\).)S 267 x(The)S +176 x(value)S 176 x(is)S 174 x(determined)S 175 x(by)S 176 x(the)S +175 x(core)S 176 x(X)S 174 x(server)S 176 x(when)S 175 x(the)S 176 x +(extension)S 176 x(is)S 598 y 4796 X(loaded.)S 251 x(All)S 166 x +(discussion)S 166 x(of)S 167 x(minor)S 167 x(opcodes)S 167 x(in)S +167 x(this)S 167 x(document)S 167 x(refer)S 167 x(to)S 167 x(image)S +167 x(extension)S 168 x(requests)S 166 x(\(op)S 597 y 4796 X +(codes\))S 165 x(where)S 167 x(the)S 166 x(major)S 166 x(opcode)S +167 x(is)S 165 x(that)S 166 x(for)S 166 x(the)S 166 x(image)S 167 x +(extension.)S 897 y 4796 X(The)S 169 x(minor)S 170 x(opcode)S 169 x +(\211eld)S 170 x(contains)S 169 x(the)S 169 x(image)S 170 x +(function)S 170 x(code.)S 256 x(Individual)S 169 x(image)S 170 x +(extension)S 170 x(function)S 598 y 4796 X(codes)S 165 x(will)S 166 x +(be)S 166 x(found)S 166 x(in)S 167 x(the)S 166 x(image)S 166 x +(extension)S 167 x(server)S 167 x(guide.)S 35879 Y 561 x F40(PROT)S +-9 x(OCOL)S 165 x(MESSAGE)S 166 x(FORMA)S -33 x(TS)S 448 x(2\2031)S +PP +EP +%%DOC$Page: 2-2 10 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(The)S 168 x(length)S 169 x(\211eld)S 168 x +(de\211nes)S 168 x(the)S 168 x(total)S 168 x(length)S 169 x(of)S +168 x(the)S 168 x(request)S 168 x(including)S 169 x(header)S 168 x +(and)S 168 x(data)S 168 x(in)S 168 x(units)S 168 x(of)S 168 x(4)S +598 y 4796 X(bytes.)S 256 x(The)S 171 x(length)S 171 x(\211eld)S +169 x(must)S 170 x(equal)S 170 x(the)S 170 x(minimum)S 170 x(length)S +170 x(required)S 171 x(to)S 169 x(contain)S 170 x(the)S 170 x +(request)S 170 x(or)S 170 x(an)S 597 y 4796 X(error)S 166 x(is)S +165 x(gener)S 2 x(ated.)S 249 x(The)S 166 x(particular)S 167 x +(contents)S 166 x(of)S 165 x(the)S 166 x(data)S 166 x(\211eld)S 166 x +(portion)S 166 x(of)S 166 x(a)S 166 x(request)S 166 x(are)S 166 x +(de\211ned)S 166 x(on)S 598 y 4796 X(a)S 166 x(request)S 166 x(by)S +166 x(request)S 166 x(basis)S 165 x(\(see)S 166 x(requests)S 166 x +(section\).)S 897 y 4796 X(Every)S 180 x(request)S 179 x(is)S 179 x +(implicitly)S 179 x(assigned)S 179 x(a)S 179 x(sequence)S 180 x +(number)S -36 x(,)S 183 x(starting)S 180 x(with)S 178 x(one,)S 184 x +(used)S 179 x(in)S 180 x(replies,)S 598 y 4796 X(errors,)S 171 x +(and)S 171 x(events.)S 258 x({This)S 170 x(sequence)S 171 x(number)S +171 x(is)S 170 x(the)S 170 x(one)S 171 x(assigned)S 170 x(by)S 171 x +(the)S 170 x(core)S 171 x(server)S 171 x(-)S 170 x(the)S 170 x +(exten-)S 597 y 4796 X(sion)S 170 x(does)S 171 x(not)S 171 x(assign)S +171 x(any)S 172 x(sequence)S 172 x(number)S -37 x(,)S 173 x(but)S +171 x(rather)S 172 x(relies)S 170 x(upon)S 172 x(the)S 171 x(core)S +172 x(assigned)S 171 x(sequence)S 598 y 4796 X(number})S 11126 Y +3600 X F28(2.2)S 599 x(Reply)S 166 x(Protocol)S 167 x(Message)S 168 x +(Format)S 12371 Y 4796 X F151(The)S 169 x(reply)S 170 x(format)S +168 x(follows)S 168 x(that)S 169 x(speci\211ed)S 169 x(in)S 169 x +(the)S 169 x(core)S 170 x(protocol)S 169 x(\(below\).)S 255 x(The)S +169 x(particular)S 169 x(contents)S 170 x(of)S 598 y 4796 X(the)S +166 x(data)S 165 x(portion)S 167 x(of)S 166 x(a)S 166 x(reply)S 166 x +(are)S 166 x(de\211ned)S 167 x(on)S 167 x(a)S 166 x(request)S 166 x +(by)S 166 x(request)S 166 x(basis)S 165 x(\(see)S 166 x(requests)S +166 x(section\).)S 897 y 4796 X(Every)S 175 x(reply)S 175 x +(contains)S 174 x(a)S 175 x(32-bit)S 173 x(length)S 176 x(\211eld)S +174 x(expressed)S 175 x(in)S 174 x(units)S 175 x(of)S 174 x(4)S 174 x +(bytes.)S 266 x(Every)S 176 x(reply)S 175 x(consists)S 597 y 4796 X +(of)S 172 x(32)S 172 x(bytes,)S 174 x(followed)S 171 x(by)S 173 x +(zero)S 172 x(or)S 172 x(more)S 173 x(additional)S 172 x(bytes)S +172 x(of)S 172 x(data,)S 173 x(as)S 172 x(speci\211ed)S 172 x(in)S +173 x(the)S 172 x(length)S 173 x(\211eld.)S 598 y 4796 X(Unused)S +164 x(bytes)S 165 x(within)S 164 x(a)S 165 x(reply)S 165 x(are)S +164 x(not)S 165 x(guaranteed)S 166 x(to)S 164 x(be)S 165 x(zero.)S +249 x(Every)S 166 x(reply)S 165 x(also)S 164 x(contains)S 165 x(the)S +164 x(least)S 598 y 4796 X(signi\211cant)S 166 x(16)S 166 x(bits)S +166 x(of)S 166 x(the)S 166 x(sequence)S 167 x(number)S 166 x(of)S +166 x(the)S 167 x(corresponding)S 167 x(request.)S 16805 Y 6708 X +F102(REPLY)S 240 x(FORMAT)S 448 y 6708 X(------------)S 747 y 8621 X +(BYTE)S 12447 X(CONTENTS)S 747 y 8621 X(0)S 12447 X(reply)S 239 x +(type)S 240 x(msg)S 239 x(\(value)S 240 x(=)S 239 x(1\))S 449 y +8621 X(1)S 12447 X(unused)S 448 y 8621 X(2)S 12447 X(request)S 240 x +(sequence)S 240 x(number)S 448 y 8621 X(3)S 12447 X(request)S 240 x +(sequence)S 240 x(number)S 449 y 8621 X(4)S 12447 X(length)S 240 x +(field)S 448 y 8621 X(5)S 12447 X(length)S 240 x(field)S 448 y 8621 X +(6)S 12447 X(length)S 240 x(field)S 449 y 8621 X(7)S 12447 X(length)S +240 x(field)S 448 y 8621 X(8)S 12447 X(start)S 239 x(of)S 240 x +(data)S 239 x(-)S 239 x(\(request)S 240 x(specific\))S 448 y 10295 X +(.)S 448 y -239 x(.)S 449 y -239 x(.)S 25323 Y 3600 X F28(2.3)S 599 x +(Err)S -2 x(or)S 166 x(Protocol)S 167 x(Message)S 168 x(Format)S +26568 Y 4796 X F151(The)S 166 x(error)S 167 x(format)S 166 x +(follows)S 165 x(that)S 166 x(speci\211ed)S 166 x(in)S 166 x(the)S +166 x(core)S 167 x(protocol)S 166 x(\(below\).)S 897 y 4796 X(Error)S +176 x(reports)S 175 x(are)S 177 x(32)S 175 x(bytes)S 176 x(long.)S +271 x(Unused)S 176 x(bytes)S 176 x(within)S 175 x(an)S 177 x(error)S +176 x(report)S 176 x(are)S 177 x(not)S 176 x(guaranteed)S 177 x(to)S +597 y 4796 X(be)S 169 x(zero.)S 258 x(Every)S 170 x(error)S 171 x +(report)S 170 x(includes)S 170 x(the)S 170 x(8-bit)S 170 x(major)S +170 x(opcode,)S 171 x(the)S 170 x(8)S 170 x(bit)S 170 x(minor)S 170 x +(opcode)S 170 x(\(extension)S 598 y 4796 X(function\),)S 167 x(and)S +166 x(the)S 166 x(8)S 166 x(bit)S 166 x(error)S 167 x(code.)S 29806 Y +6708 X F102(ERROR)S 240 x(FORMAT)S 448 y 6708 X(------------)S 747 y +6469 X(BYTE)S 479 x(CONTENTS)S 35879 Y 3600 X F40(2\2032)S 449 x +(PROT)S -9 x(OCOL)S 166 x(MESSAGE)S 166 x(FORMA)S -34 x(TS)S +PP +EP +%%DOC$Page: 2-3 11 +1000 BP 39600 30600 PM 0 0 XY +5052 Y 8621 X F102(0)S 478 x(error)S 240 x(type)S 240 x(msg)S 239 x +(\(value)S 240 x(=)S 239 x(0\))S 449 y 8621 X(1)S 478 x(error)S 240 x +(code)S 448 y 8621 X(2)S 478 x(request)S 240 x(sequence)S 240 x +(number)S 448 y 8621 X(3)S 478 x(request)S 240 x(sequence)S 240 x +(number)S 449 y 8621 X(4)S 478 x(unused)S 448 y 8621 X(5)S 478 x +(unused)S 448 y 8621 X(6)S 478 x(unused)S 449 y 8621 X(7)S 478 x +(unused)S 448 y 8621 X(8)S 478 x(minor)S 240 x(opcode)S 240 x(-)S +239 x(extension)S 240 x(function)S 240 x(code)S 448 y 8621 X(9)S +478 x(minor)S 240 x(opcode)S 240 x(-)S 239 x(extension)S 240 x +(function)S 240 x(code)S 449 y 8382 X(10)S 478 x(major)S 240 x +(opcode)S 896 y 4796 X F151(The)S 178 x(major)S 179 x(and)S 178 x +(minor)S 179 x(\(function)S 179 x(code\))S 178 x(opcodes,)S 182 x +(are)S 178 x(those)S 178 x(of)S 178 x(the)S 179 x(request)S 178 x +(which)S 178 x(gener)S 2 x(ated)S 177 x(the)S 598 y 4796 X(error)S +-37 x(.)S 269 x(The)S 177 x(request)S 175 x(sequence)S 177 x(number)S +176 x(is)S 175 x(the)S 176 x(least)S 175 x(signi\211cant)S 177 x(16)S +175 x(bits)S 175 x(of)S 176 x(the)S 176 x(number)S 176 x(implicitly)S +598 y 4796 X(assigned)S 166 x(to)S 165 x(the)S 167 x(request)S 166 x +(which)S 166 x(generated)S 167 x(the)S 166 x(error)S -36 x(.)S 896 y +4796 X(For)S 166 x(the)S 166 x(following)S 166 x(errors)S 167 x +(\(see)S 165 x(Section)S 167 x(n\),)S 166 x(the)S 167 x(failing)S +166 x(resource)S 167 x(id)S 166 x(is)S 165 x(also)S 166 x(returned:)S +897 y 4796 X(\201)S 594 x(Core)S 166 x(Protocol)S 167 x(Errors)S +747 y 5692 X(\201)S 595 x(Colormap)S 747 y 5692 X(\201)S 595 x +(Cursor)S 748 y 5692 X(\201)S 595 x(Drawable)S 747 y 5692 X(\201)S +595 x(Font)S 747 y 5692 X(\201)S 595 x(GContext)S 747 y 5692 X(\201)S +595 x(IDChoice)S 747 y 5692 X(\201)S 595 x(Pixmap)S 748 y 5692 X +(\201)S 595 x(W)S -19 x(indow)S 20494 Y 4796 X(For)S 166 x(Atom)S +165 x(errors,)S 167 x(the)S 166 x(failing)S 167 x(atom)S 166 x(is)S +165 x(returned.)S 251 x(For)S 166 x(V)S -46 x(alue)S 166 x(errors,)S +167 x(the)S 166 x(failing)S 167 x(value)S 166 x(is)S 166 x +(returned.)S 21889 Y 3600 X F28(2.4)S 599 x(Event)S 166 x(Protocol)S +167 x(Message)S 168 x(Format)S 23135 Y 4796 X F151(The)S 166 x +(event)S 167 x(format)S 166 x(follows)S 165 x(that)S 166 x +(speci\211ed)S 166 x(in)S 166 x(the)S 166 x(core)S 167 x(protocol)S +166 x(\(below\).)S 896 y 4796 X(Events)S 167 x(are)S 169 x(32)S 168 x +(bytes)S 167 x(long.)S 255 x(Unused)S 168 x(bytes)S 168 x(within)S +168 x(an)S 168 x(event)S 169 x(are)S 168 x(not)S 168 x(guaran)S 2 x +(teed)S 167 x(to)S 168 x(be)S 168 x(zero.)S 254 x(Every)S 598 y +4796 X(event)S 171 x(contains)S 171 x(an)S 171 x(8-bit)S 170 x(type)S +171 x(code.)S 259 x(The)S 171 x(most)S 170 x(signi\211cant)S 172 x +(bit)S 170 x(in)S 171 x(this)S 170 x(code)S 171 x(is)S 170 x(set)S +170 x(if)S 171 x(the)S 171 x(event)S 171 x(was)S 598 y 4796 X +(generated)S 166 x(from)S 166 x(a)S 166 x(SendEvent)S 167 x +(request.)S 896 y 4796 X(The)S 174 x(image)S 173 x(extension)S 175 x +(related)S 173 x(events)S 174 x(use)S 173 x(event)S 174 x(codes)S +174 x(assigned)S 173 x(by)S 174 x(the)S 174 x(core)S 174 x(server)S +174 x(at)S 173 x(extension)S 598 y 4796 X(load)S 184 x(time.)S 287 x +(Every)S 186 x(core)S 185 x(event)S 185 x(\(with)S 185 x(the)S 185 x +(exception)S 185 x(of)S 185 x(KeymapNotify\))S 185 x(also)S 184 x +(contains)S 185 x(the)S 185 x(least)S 598 y 4796 X(signi\211cant)S +168 x(16)S 168 x(bits)S 167 x(of)S 168 x(the)S 168 x(sequence)S 169 x +(number)S 168 x(of)S 168 x(the)S 168 x(last)S 167 x(request)S 168 x +(issued)S 168 x(by)S 168 x(the)S 168 x(client)S 168 x(that)S 168 x +(was)S 167 x(\(or)S 598 y 4796 X(is)S 174 x(currently)S 177 x +(being\))S 175 x(processed)S 175 x(by)S 176 x(the)S 175 x(server)S +-36 x(.)S 267 x(Image)S 176 x(extension)S 176 x(events)S 175 x(also)S +175 x(include)S 175 x(the)S 176 x(request)S 597 y 4796 X(sequence)S +166 x(number)S -36 x(.)S 29660 Y 6708 X F102(EVENT)S 240 x(FORMAT)S +448 y 6708 X(------------)S 748 y 6469 X(BYTE)S 479 x(CONTENTS)S +747 y 6469 X(0)S 479 x(event)S 239 x(type)S 240 x(code)S 239 x +(\(value)S 240 x(=)S 239 x(\))S 448 y 6469 X(1)S 479 x(request)S +239 x(sequence)S 240 x(number)S 448 y 6469 X(2)S 479 x(request)S +239 x(sequence)S 240 x(number)S 35879 Y 18427 X F40(PROT)S -9 x +(OCOL)S 165 x(MESSAGE)S 166 x(FORMA)S -33 x(TS)S 448 x(2\2033)S +PP +EP +%%DOC$Page: 2-4 12 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(2.5)S 599 x(Data)S 166 x(Encoding)S 6838 Y 4796 X +F151(Except)S 188 x(where)S 188 x(explicitly)S 189 x(noted)S 188 x +(in)S 189 x(the)S 188 x(protocol,)S 195 x(all)S 188 x(16)S 188 x +(bit)S 187 x(and)S 189 x(32)S 188 x(bit)S 188 x(quantities)S 188 x +(exchang)S 2 x(ed)S 598 y 4796 X(between)S 185 x(client)S 187 x(and)S +186 x(server)S 187 x(must)S 185 x(be)S 186 x(transmitted)S 186 x +(with)S 185 x(the)S 187 x(byte)S 186 x(order)S 186 x(established)S +186 x(at)S 185 x(CORE)S 597 y 4796 X(protocol)S 166 x(connection)S +167 x(time.)S 249 x(\(see)S 166 x(core)S 166 x(protocol)S 167 x +(connection)S 167 x(setup)S 166 x(-)S 166 x(X1)S -28 x(1)S 166 x +(spec.\).)S 249 x(In)S 167 x(particular)S -37 x(...)S 9179 Y 4796 X +F102("The)S 239 x(client)S 240 x(must)S 239 x(send)S 240 x(an)S 239 x +(initial)S 240 x(byte)S 239 x(of)S 240 x(data)S 239 x(to)S 240 x +(identify)S 240 x(the)S 239 x(byte)S 239 x(order)S 240 x(to)S 239 x +(be)S 448 y 4796 X(employed.)S 240 x(The)S 239 x(value)S 240 x(of)S +239 x(the)S 239 x(byte)S 240 x(must)S 239 x(be)S 240 x(octal)S 239 x +(102)S 240 x(or)S 239 x(154.)S 240 x(The)S 239 x(value)S 240 x(102)S +239 x(\(ASCII)S 449 y 4796 X(upper)S 239 x(case)S 240 x(B\))S 239 x +(means)S 240 x(values)S 239 x(are)S 240 x(transmitted)S 240 x(most)S +239 x(significan)S 2 x(t)S 239 x(byte)S 239 x(first,)S 240 x(and)S +448 y 4796 X(value)S 239 x(154)S 240 x(\(ASCII)S 239 x(lower)S 240 x +(case)S 239 x(l\))S 240 x(means)S 239 x(values)S 240 x(are)S 239 x +(transmitte)S 2 x(d)S 239 x(least)S 239 x(significant)S 448 y 4796 X +(byte)S 239 x(first.)S 240 x(Except)S 239 x(where)S 240 x +(explicitly)S 240 x(noted)S 240 x(in)S 239 x(the)S 240 x(protocol,)S +240 x(all)S 239 x(16-bit)S 240 x(and)S 449 y 4796 X(32-bit)S 239 x +(quantities)S 240 x(sent)S 240 x(by)S 239 x(the)S 240 x(client)S +239 x(must)S 240 x(be)S 239 x(transmitted)S 240 x(with)S 240 x(this)S +239 x(byte)S 240 x(order,)S 448 y 4796 X(and)S 239 x(all)S 239 x +(16-bit)S 240 x(and)S 239 x(32-bit)S 240 x(quantities)S 240 x +(returned)S 240 x(by)S 240 x(the)S 239 x(server)S 240 x(will)S 239 x +(be)S 240 x(transmitted)S 448 y 4796 X(with)S 239 x(this)S 240 x +(byte)S 239 x(order.")S 35879 Y 3600 X F40(2\2034)S 449 x(PROT)S +-9 x(OCOL)S 166 x(MESSAGE)S 166 x(FORMA)S -34 x(TS)S +PP +EP +%%DOC$Page: 3-1 13 +1000 BP 39600 30600 PM 0 0 XY +9007 Y 3600 X F24(Chapter)S 498 x(3)S 10651 Y 3600 X(PROT)S -13 x +(OCO)S -2 x(L)S 167 x(SPECIFICA)S -53 x(TION)S 165 x(SYNT)S -52 x +(AX)S 13357 Y 4796 X F151(This)S 189 x(section)S 190 x(presents)S +189 x(syntactic)S 190 x(conventions)S 190 x(adhered)S 190 x(to)S +190 x(throughou)S 2 x(t)S 189 x(the)S 190 x(speci\211cation.)S 296 x +(All)S 598 y 4796 X(protocol)S 166 x(functions)S 166 x(\(requests,)S +166 x(replies,)S 166 x(errors,)S 167 x(events\))S 167 x(are)S 166 x +(speci)S +(\211ed)S 166 x(according)S 167 x(to)S 166 x(this)S 166 x(syntax.)S +15349 Y 3600 X F28(3.1)S 599 x(General)S 167 x(Syntax)S 16595 Y +4796 X F151(In)S 166 x(general,)S 167 x(the)S 166 x(extension)S 167 x +(package)S 167 x(follows)S 165 x(the)S 166 x(X1)S -27 x(1)S 166 x +(protocol)S 166 x(syntax)S 167 x(conventions.)S 17790 Y 4796 X(The)S +166 x(syntax)S 167 x({...})S 167 x(encloses)S 166 x(a)S 166 x(set)S +166 x(of)S 166 x(alternatives.)S 18986 Y 4796 X(The)S 166 x(syntax)S +167 x([...])S 250 x(encloses)S 166 x(a)S 166 x(set)S 166 x(of)S 166 x +(structure)S 166 x(components.)S 20181 Y 4796 X(TYPE')S -19 x(s)S +165 x(are)S 166 x(in)S 167 x(upper)S 166 x(case,)S 167 x(and)S 166 x +(Alternative)S 166 x(V)S -46 x(alues)S 166 x(are)S 166 x +(capitalized.)S 21576 Y 3600 X F28(3.2)S 599 x(Request)S 167 x +(Syntax)S 22821 Y 4796 X F151(Requests)S 179 x(\(and)S 181 x(the)S +181 x(associated)S 180 x(replies\))S 180 x(are)S 181 x(described)S +180 x(in)S 181 x(this)S 180 x(document)S 182 x(in)S 180 x(a)S 181 x +(uniform)S 181 x(fashion.)S 598 y 4796 X(There)S 166 x(are)S 167 x +(\211ve)S 167 x(major)S 166 x(sections)S 166 x(to)S 166 x(a)S 166 x +(request)S 166 x(description:)S 897 y 4796 X(1.)S 481 x(request)S +166 x("procedure)S 167 x(declaration")S 747 y 4796 X(2.)S 481 x +(errors)S 747 y 4796 X(3.)S 481 x(events)S 747 y 4796 X(4.)S 481 x +(overall)S 167 x(description)S 27653 Y 4796 X(The)S 173 x(\211rst)S +172 x(three)S 173 x(are)S 173 x(speci\211ed)S 172 x(in)S 173 x(a)S +172 x(brief)S 173 x(BNF)S 172 x(like)S 173 x(format.)S 262 x(The)S +173 x(overall)S 173 x(description)S 172 x(is)S 172 x(in)S 173 x +(English)S 598 y 4796 X(prose)S 165 x(and)S 167 x(follows)S 165 x +(the)S 166 x(\211rst)S 166 x(three.)S 897 y 4796 X(Each)S 167 x +(request)S 167 x(description)S 167 x(begins)S 167 x(with)S 167 x(a)S +167 x("procedure)S 167 x(declaration")S 167 x(like)S 168 x +(de\211nition)S 167 x(consisting)S 168 x(of)S 167 x(the)S 598 y +4796 X(request)S 152 x(name,)S 156 x(argument)S 153 x(names)S 153 x +(and)S 152 x(types,)S 156 x(and)S 153 x(optional)S 152 x(reply)S +153 x(information.)S 250 x(All)S 152 x(image)S 153 x(extension)S +597 y 4796 X(requests)S 178 x(have)S 179 x(a)S 178 x(common)S 179 x +(name)S 179 x(pre\211x)S 179 x(\(XIEP_\).)S 274 x(The)S 179 x +(arguments)S 179 x(constitute)S 179 x(the)S 178 x(optional)S 179 x +(data)S 598 y 4796 X(described)S 170 x(in)S 171 x(the)S 170 x +(request)S 171 x(protocols)S 170 x(on)S 171 x(a)S 171 x(protocol)S +170 x(function)S 172 x(by)S 171 x(protocol)S 171 x(function)S 171 x +(basis.)S 258 x(Note)S 170 x(that)S 598 y 4796 X(the)S 175 x(order)S +175 x(of)S 175 x(arguments)S 176 x(complies)S 174 x(with)S 175 x +(their)S 175 x(actual)S 175 x(order)S 175 x(in)S 176 x(the)S 175 x +(wire)S 174 x(protocol.)S 268 x(Note)S 175 x(also)S 174 x(that)S +598 y 4796 X(the)S 182 x(protocol)S 183 x(function)S 183 x(names)S +183 x(and)S 182 x(types)S 183 x(are)S 182 x(abstract)S 182 x(\(the)S +183 x(XieLib)S 182 x(languag)S 2 x(e)S 182 x(bindings)S 183 x +(conver)S 2 x(t)S 597 y 4796 X(these)S 165 x(abstract)S 166 x(names)S +166 x(into)S 166 x(concrete)S 167 x(function)S 167 x(names)S 166 x +(an)S 166 x(parameter)S 166 x(types\).)S 35879 Y 17637 X F40(PROT)S +-8 x(OCOL)S 165 x(SPECIFICA)S -35 x(TION)S 165 x(SYNT)S -33 x(AX)S +448 x(3\2031)S +PP +EP +%%DOC$Page: 3-2 14 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(The)S 177 x(symbol)S 178 x("=>")S 176 x +(demarcates)S 177 x(the)S 178 x(start)S 176 x(of)S 177 x(reply)S +178 x(information.)S 273 x(If)S 177 x(the)S 177 x(request)S 177 x +(has)S 178 x(no)S 177 x(reply)S -54 x(,)S 180 x(the)S 598 y 4796 X +(word)S 165 x("none")S 167 x(will)S 165 x(follow)S 165 x(the)S 167 x +(symbol)S 166 x("=>".)S 896 y 4796 X(Following)S 159 x(the)S 159 x +("procedure)S 159 x(declaration")S 159 x(information)S 159 x(is)S +158 x(a)S 159 x(list)S 158 x(of)S 159 x(errors)S 159 x(which)S 159 x +(the)S 159 x(protocol)S 159 x(function)S 598 y 4796 X(may)S 166 x +(signal.)S 250 x(If)S 165 x(there)S 167 x(are)S 166 x(no)S 166 x +(possible)S 166 x(error)S 166 x(conditions,)S 167 x(the)S 166 x +(list)S 165 x(consists)S 166 x(of)S 166 x(the)S 166 x(word)S 166 x +("none".)S 897 y 4796 X(Following)S 172 x(the)S 172 x(error)S 173 x +(information)S 172 x(is)S 172 x(a)S 172 x(list)S 171 x(of)S 172 x +(events)S 173 x(which)S 172 x(the)S 172 x(protocol)S 173 x(function)S +173 x(may)S 172 x(trigger)S -36 x(.)S 262 x(If)S 597 y 4796 X(there)S +169 x(are)S 169 x(no)S 169 x(possible)S 168 x(events)S 169 x(which)S +170 x(maybe)S 169 x(triggered,)S 171 x(the)S 169 x(list)S 168 x +(consists)S 168 x(of)S 169 x(the)S 169 x(word)S 169 x("none".)S 255 x +(Note)S 598 y 4796 X(that)S 169 x(the)S 169 x(list)S 169 x(contains)S +169 x(only)S 170 x(those)S 169 x(events)S 170 x(which)S 170 x(may)S +169 x(be)S 170 x(explicitly)S 169 x(trigger)S 2 x(ed,)S 170 x(and)S +170 x(that)S 169 x(there)S 169 x(may)S 598 y 4796 X(be)S 166 x +(unforeseen)S 167 x(events)S 166 x(triggered)S 167 x(by)S 167 x(a)S +166 x(protocol)S 166 x(function.)S 897 y 4796 X(Finally)S -55 x(,)S +169 x(each)S 168 x(request)S 167 x(section)S 168 x(contains)S 168 x +(a)S 168 x(descriptive)S 167 x(component)S 169 x(which)S 168 x +(includes)S 168 x(overall)S 168 x(purpose,)S 597 y 4796 X +(parameters)S 165 x(,)S 167 x(and)S 166 x(operation.)S 12886 Y 5991 X +F102(RequestName)S 747 y 6469 X(arg1:)S 479 x(TYPE1)S 448 y 7665 X +(.)S 449 y -239 x(.)S 448 y -239 x(.)S 448 y 6469 X(argn:)S 479 x +(TYPEN)S 748 y 6230 X(=>)S 747 y -239 x(result1:)S 240 x(TYPE1)S +448 y 7665 X(.)S 448 y -239 x(.)S 449 y -239 x(.)S 448 y 6469 X +(resultn:)S 240 x(TYPEN)S 20059 Y 5991 X(Errors:)S 240 x(kind1,)S +240 x(...,)S 239 x(kindN)S 21105 Y 5991 X(Events:)S 240 x(kind1,)S +240 x(...)S 239 x(,kindN)S 22151 Y 5991 X(Description:)S 449 y 6469 X +(-)S 239 x(purpose)S 448 y 6469 X(-)S 239 x(parameters)S 448 y 6469 X +(-)S 239 x(operation)S 448 y -477 x(-)S 239 x(errors)S 25588 Y 3600 X +F28(3.3)S 599 x(Err)S -2 x(or)S 166 x(Syntax)S 26834 Y 4796 X F151 +(Errors)S 178 x(are)S 179 x(described)S 178 x(in)S 179 x(a)S 179 x +(uniform)S 179 x(fashion.)S 275 x(Each)S 178 x(error)S 180 x +(description)S 178 x(includes)S 179 x(the)S 179 x(error)S 179 x +(name,)S 597 y 4796 X(error)S 173 x(type)S 172 x(code,)S 175 x(and)S +173 x(optional)S 172 x(information)S 173 x(returned)S 173 x(with)S +172 x(the)S 173 x(error)S -36 x(.)S 262 x(Finally)S -54 x(,)S 174 x +(each)S 173 x(error)S 173 x(section)S 598 y 4796 X(contains)S 166 x +(a)S 166 x(descriptive)S 166 x(component)S 166 x(which)S 167 x +(addresses)S 165 x(causes.)S 29175 Y 5991 X F102(ErrorName)S 240 x +(error_type_cod)S 2 x(e)S 747 y 6469 X(value1:)S 240 x(TYPE1)S 448 y +6708 X(.)S 449 y -239 x(.)S 448 y -239 x(.)S 448 y -478 x(valuen:)S +240 x(TYPEN)S 748 y 5991 X(Description:)S 747 y 6469 X(-)S 239 x +(causes)S 35879 Y 3600 X F40(3\2032)S 449 x(PROT)S -9 x(OCOL)S 166 x +(SPECIFIC)S -2 x(A)S -33 x(TION)S 165 x(SYNT)S -34 x(AX)S +PP +EP +%%DOC$Page: 3-3 15 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(3.4)S 599 x(Event)S 166 x(Syntax)S 6838 Y 4796 X +F151(Events)S 174 x(are)S 175 x(described)S 174 x(in)S 175 x(a)S +174 x(uniform)S 175 x(fashion.)S 267 x(Each)S 174 x(event)S 176 x +(description)S 174 x(includes)S 175 x(the)S 174 x(event)S 176 x +(name,)S 598 y 4796 X(event)S 168 x(type)S 168 x(code,)S 169 x(and)S +168 x(optional)S 168 x(information)S 168 x(returned)S 169 x(with)S +167 x(the)S 168 x(event.)S 254 x(Finally)S -54 x(,)S 169 x(each)S +168 x(event)S 169 x(section)S 597 y 4796 X(contains)S 184 x(a)S 184 x +(descriptive)S 183 x(component)S 185 x(which)S 184 x(includes)S 185 x +(overall)S 184 x(purpose,)S 189 x(causes,)S 189 x(and)S 184 x +(operational)S 598 y 4796 X(semantics.)S 9777 Y 5991 X F102 +(EventName)S 240 x(event_type_cod)S 2 x(e)S 747 y 6469 X(value1:)S +240 x(TYPE1)S 448 y 6708 X(.)S 449 y -239 x(.)S 448 y -239 x(.)S +448 y -478 x(valuen:)S 240 x(TYPEN)S 748 y 5991 X(Description:)S +747 y 6469 X(-)S 239 x(overall)S 240 x(purpose)S 448 y 6469 X(-)S +239 x(causes)S 448 y 6469 X(-)S 239 x(operational)S 241 x(semantics)S +35879 Y 17637 X F40(PROT)S -8 x(OCOL)S 165 x(SPECIFICA)S -35 x(TION)S +165 x(SYNT)S -33 x(AX)S 448 x(3\2033)S +PP +EP +%%DOC$Page: 4-1 16 +1000 BP 39600 30600 PM 0 0 XY +9007 Y 3600 X F24(Chapter)S 498 x(4)S 10651 Y 3600 X(PROT)S -13 x +(OCO)S -2 x(L)S 167 x(P)S -52 x(ARAMETER)S 165 x(TYPES)S 13357 Y +4796 X F151(Parametric)S 176 x(types)S 177 x(represent)S 176 x(the)S +177 x(core)S 177 x(and)S 177 x(extension)S 177 x(protocol)S 177 x +(recognized)S 177 x(types)S 177 x(for)S 176 x(the)S 177 x(various)S +598 y 4796 X(request)S 168 x(parameters.)S 255 x(The)S 169 x(image)S +169 x(extension)S 169 x(protocol)S 169 x(makes)S 168 x(use)S 169 x +(of)S 169 x(both)S 168 x(core)S 170 x(protocol)S 168 x(parametric)S +597 y 4796 X(types)S 165 x(and)S 167 x(image)S 166 x(extension)S +167 x(speci\211c)S 166 x(protocol)S 166 x(parametric)S 166 x(types.)S +15947 Y 3600 X F28(4.1)S 599 x(Core)S 165 x(T)S -44 x(ypes)S 17193 Y +4796 X F151(The)S 177 x(following)S 177 x(types)S 177 x(are)S 177 x +(de)S +(\211ned)S 177 x(in)S 177 x(the)S 177 x(X1)S -28 x(1)S 177 x(core)S +177 x(protocol)S 177 x(speci\211cation.)S 272 x(Refer)S 176 x(to)S +177 x(the)S 177 x(X1)S -28 x(1)S 177 x(core)S 597 y 4796 X(protocol)S +166 x(speci\211cation)S 166 x(for)S 166 x(their)S 166 x +(de\211nition.)S 18936 Y 4796 X F102(ARC)S 8621 X(ATOM)S 12447 X +(BOOL)S 16272 X(BITGRAVITY)S 448 y 4796 X(BITMASK)S 8621 X(BUTMASK)S +12447 X(BUTTON)S 16272 X(CARD8)S 449 y 4796 X(CARD16)S 8621 X +(CARD32)S 12447 X(CHAR2B)S 16272 X(COLORMAP)S 448 y 4796 X(CURSOR)S +8621 X(DEVICE)S 12447 X(DEVICEEVENT)S 16272 X(DRAWABLE)S 448 y 4796 X +(EVENT)S 8621 X(FONT)S 12447 X(GCONTEXT)S 16272 X(HOST)S 449 y 4796 X +(INT8)S 8621 X(INT16)S 12447 X(INT32)S 16272 X(KEYBUTMASK)S 448 y +4796 X(KEYCODE)S 8621 X(KEYMASK)S 12447 X(LISTofFOO)S 16272 X +(LISTofVALU)S 2 x(E)S 448 y 4796 X(Or)S 239 x(Types)S 8621 X(PIXMAP)S +12447 X(POINT)S 16272 X(POINTEREVE)S 2 x(NT)S 449 y 4796 X +(RECTANGLE)S 8621 X(STRING8)S 12447 X(STRING16)S 16272 X(TIMESTAMP)S +448 y 4796 X(VALUE)S 8621 X(VISUALID)S 12447 X(WINDOW)S 16272 X +(WINGRAVITY)S 897 y 4796 X F151(Note)S 168 x(that)S 168 x(XIE)S 167 x +(rede)S +(\211nes)S 169 x(the)S 168 x(use)S 168 x(of)S 168 x(LIST)S -46 x +(ofFOO)S 168 x(such)S 168 x(that)S 168 x(the)S 169 x(list)S 167 x +(is)S 168 x(preceded)S 168 x(by)S 169 x(the)S 168 x(number)S 169 x +(of)S 597 y 4796 X(entries)S 166 x(in)S 166 x(the)S 167 x(list.)S +249 x(This)S 166 x(applies)S 166 x(in)S 166 x(all)S 166 x(cases)S +166 x(\(whether)S 166 x(FOO)S 166 x(is)S 166 x(an)S 166 x(XIE)S 165 x +(speci)S +(\211c)S 167 x(or)S 166 x(core)S 167 x(type\).)S 250 x(The)S 598 y +4796 X(number)S 166 x(of)S 166 x(entries)S 166 x(\211eld)S 167 x(is)S +165 x(CARD8)S 165 x(unless)S 166 x(noted)S 166 x(otherwise)S 165 x +(in)S 167 x(a)S 166 x(protocol)S 166 x(function)S 167 x +(speci\211cation.)S 26458 Y 3600 X F28(4.2)S 599 x(Extension)S 167 x +(T)S -44 x(ypes)S 27703 Y 4796 X F151(The)S 179 x(types)S 179 x +(presented)S 178 x(in)S 179 x(this)S 179 x(section)S 178 x(are)S +179 x(speci\211c)S 179 x(to)S 179 x(the)S 179 x(X)S 178 x(Image)S +179 x(Extension)S 179 x(Protocol,)S 183 x(and)S 179 x(are)S 598 y +4796 X(considered)S 163 x(to)S 163 x(be)S 163 x(de\211ned)S 164 x +(types.)S 249 x(All)S 163 x(X)S 162 x(image)S 164 x(extension)S 164 x +(type)S 163 x(symbols)S 162 x(begin)S 164 x(with)S 163 x(the)S 163 x +(pre)S +(\211x)S 164 x(XIT_.)S 598 y 4796 X(All)S 172 x(X)S 172 x(image)S +173 x(extension)S 173 x(protocol)S 173 x(parameters)S 172 x(are)S +173 x(de\211ned)S 173 x(as)S 172 x(being)S 174 x(either)S 172 x(one)S +174 x(of)S 172 x(these)S 173 x(extension)S 597 y 4796 X(types,)S +174 x(or)S 172 x(one)S 173 x(of)S 173 x(the)S 172 x(core)S 173 x +(protocol)S 172 x(types.)S 263 x(Note)S 172 x(that)S 172 x(these)S +172 x(types)S 172 x(are)S 173 x(abstract)S 172 x(in)S 172 x(nature)S +173 x(and)S 173 x(are)S 598 y 4796 X(bound)S 166 x(to)S 166 x +(concrete)S 167 x(types)S 166 x(and)S 166 x(structures)S 166 x(by)S +167 x(the)S 166 x(XieLib)S 166 x(language)S 167 x(bindings.)S 897 y +4796 X(The)S 166 x(following)S 166 x(sections)S 166 x(describe)S +166 x(the)S 166 x(particulars)S 166 x(of)S 166 x(each)S 167 x(of)S +166 x(the)S 166 x(image)S 166 x(extension)S 167 x(types.)S +XP +% DefineFont:F152 Category:10 PointSize:10 +/NewCenturySchlbk-Italic /NewCenturySchlbk-Italic@DOCPSE DOCPSE ReENCODE +/F152 500.0 /NewCenturySchlbk-Italic@DOCPSE DPSF +RP +4796 32186 XY F152(XIT_ACC)S -2 x(ELERA)S -37 x(TOR_VECTO)S -2 x(R)S +35879 Y 18576 X F40(PROT)S -9 x(OCOL)S 165 x(P)S -33 x(ARAMETER)S +165 x(TYPES)S 449 x(4\2031)S +PP +EP +%%DOC$Page: 4-2 17 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(XIT_ACC)S -2 x(ELERA)S -28 x(TOR_VE)S -2 x(CTOR)S +168 x(is)S 167 x(used)S 168 x(to)S 168 x(provide)S 169 x(the)S 168 x +(client)S 169 x(information)S 168 x(about)S 168 x(which)S 169 x +(protocol)S 598 y 4796 X(functions)S 178 x(can)S 178 x(be)S 178 x +(executed)S 179 x(on)S 178 x(ancillary)S 179 x(processors)S 177 x +(\(one)S 179 x(other)S 178 x(than)S 178 x(the)S 178 x(extension)S +179 x(server)S 179 x(host)S 597 y 4796 X(processor\).)S 281 x(The)S +182 x(ancillary)S 183 x(processor)S 182 x(is)S 181 x(typically)S +183 x(present)S 181 x(for)S 182 x(acceleration)S 183 x(purposes)S +182 x(\(thus)S 182 x(the)S 598 y 4796 X(name\).)S 897 y 4796 X +(Accelerator)S 168 x(information)S 168 x(is)S 168 x(formatted)S 168 x +(as)S 168 x(a)S 168 x(bit)S 168 x(vector)S 169 x(identical)S 168 x +(in)S 168 x(format)S 168 x(to)S 168 x(that)S 168 x(used)S 168 x(in)S +169 x(server_)S 598 y 4796 X(capabilities.)S 258 x(In)S 172 x +(particular)S -37 x(,)S 173 x(there)S 171 x(is)S 171 x(a)S 171 x +(bit)S 171 x(for)S 171 x(every)S 173 x(protocol)S 171 x(function)S +172 x(whose)S 171 x(value)S 172 x(indicates)S 170 x(the)S 597 y +4796 X(state)S 178 x(of)S 180 x(hardware)S 179 x(support)S 180 x +(for)S 179 x(that)S 179 x(function)S 181 x(on)S 180 x(the)S 179 x +(server)S -36 x(.)S 276 x(A)S 180 x('0')S 178 x(implies)S 179 x(no)S +180 x(direct)S 179 x(hardware)S 598 y 4796 X(acceleration)S 182 x +(\(ie.)S 280 x(the)S 182 x(protocol)S 182 x(function)S 183 x(is)S +181 x(implemented)S 181 x(through)S 183 x(software)S 181 x(on)S 182 x +(the)S 182 x(server)S 182 x(host)S 598 y 4796 X(processor\),)S 163 x +(while)S 162 x(a)S 162 x('1')S 162 x(implies)S 161 x(speci\211c)S +162 x(accelerator)S 163 x(support)S 162 x(\(ie.)S 250 x(a)S 162 x +(processor)S 162 x(other)S 163 x(than)S 163 x(the)S 162 x(server)S +598 y 4796 X(host)S 165 x(processor)S 166 x(is)S 166 x(used)S 166 x +(to)S 166 x(accelerate)S 166 x(the)S 166 x(function\).)S 12039 Y +4796 X F152(XIT_AREA)S -2 x(_OP1)S 897 y 4796 X F151(XIT_ARE)S -2 x +(A_OP1)S 170 x(de\211nes)S 170 x(the)S 171 x(valid)S 170 x +(operations)S 170 x(for)S 170 x(the)S 170 x(process)S 170 x +(services)S 170 x(area)S 171 x(operator)S 170 x(number)S 171 x(1.)S +597 y 4796 X(They)S 167 x(include:)S 14679 Y 5752 X F102 +(XIT_AREA_OP1)S 449 y({)S 448 y(ADD)S 2 x(ITION,)S 448 y 8860 X +(MULTIPLICATI)S 2 x(ON)S 448 y 8621 X(})S 17967 Y 4796 X F152 +(XIT_AREA)S -2 x(_OP2)S 897 y 4796 X F151(XIT_ARE)S -2 x(A_OP2)S +170 x(de\211nes)S 170 x(the)S 171 x(valid)S 170 x(operations)S 170 x +(for)S 170 x(the)S 170 x(process)S 170 x(services)S 170 x(area)S +171 x(operator)S 170 x(number)S 171 x(2.)S 597 y 4796 X(They)S 167 x +(include:)S 20607 Y 5752 X F102(XIT_AREA_OP2)S 448 y({)S 449 y(MIN)S +2 x(IMUM,)S 448 y 8860 X(MAXIMUM,)S 448 y 8860 X(SUMMATION)S 449 y +8621 X(})S 24343 Y 4796 X F152(XIT_ARITH_OP)S 897 y 4796 X F151 +(XIT_ARI)S -2 x(TH_OP)S 165 x(de\211nes)S 165 x(the)S 165 x(valid)S +166 x(operations)S 164 x(for)S 165 x(the)S 165 x(process)S 165 x +(services)S 165 x(arithmetic)S 165 x(operator)S -37 x(.)S 249 x +(They)S 597 y 4796 X(include:)S 26983 Y -860 x F102(XIT_ARITH_OP)S +448 y({)S 449 y(ADD)S 2 x(_II,)S 239 x(ADD_IC,)S 448 y 8860 X +(SUB_II,)S 240 x(SUB_IC,)S 240 x(SUB_CI,)S 448 y 8860 X(MUL_II,)S +240 x(MUL_IC,)S 449 y 8860 X(DIV_II,)S 240 x(DIV_IC,)S 240 x +(DIV_CI,)S 448 y 8860 X(MIN_II,)S 240 x(MIN_IC,)S 448 y 8860 X +(MAX_II,)S 240 x(MAX_IC)S 449 y 8621 X(})S 896 y 4796 X F151(Note)S +166 x(that)S 167 x(the)S 168 x(suf\211x)S 167 x(II)S 167 x(means)S +167 x(that)S 167 x(the)S 167 x(operation)S 167 x(is)S 167 x(to)S +167 x(be)S 167 x(performed)S 167 x(between)S 167 x(two)S 166 x +(images,)S 168 x(while)S 598 y 4796 X(IC)S 168 x(means)S 169 x +(between)S 169 x(an)S 169 x(image)S 169 x(and)S 170 x(a)S 169 x +(constant.)S 255 x(Note)S 169 x(also)S 169 x(that)S 169 x(IC,)S 169 x +(and)S 169 x(CI)S 169 x(suf\211ces)S 169 x(imply)S 169 x(order)S +169 x(of)S 598 y 4796 X(operands)S 166 x(in)S 166 x(the)S 166 x +(operation.)S 33857 Y 4796 X F152(XIT_CO)S -2 x(MPONENT_SP)S -45 x +(ACE_ORG)S -2 x(ANIZA)S -37 x(TION)S 35879 Y 3600 X F40(4\2032)S +449 x(PROT)S -9 x(OCOL)S 166 x(P)S -33 x(ARAMETER)S 165 x(TYPES)S +PP +EP +%%DOC$Page: 4-3 18 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(XIT_CO)S -2 x(MPONENT_SP)S -36 x(ACE_O)S -2 x +(RGANIZA)S -29 x(TION)S 174 x(de\211nes)S 174 x(the)S 174 x(way)S +174 x(in)S 174 x(which)S 174 x(the)S 174 x(various)S 175 x(spectral)S +598 y 4796 X(components)S 167 x(of)S 167 x(an)S 167 x(image)S 167 x +(are)S 167 x(organized)S 168 x(during)S 168 x(wire)S 167 x +(transport.)S 251 x(See)S 167 x(the)S 167 x(appendix)S 167 x(on)S +168 x(image)S 167 x(data)S 597 y 4796 X(attributes)S 165 x(&)S 166 x +(organization)S 167 x(for)S 166 x(more)S 166 x(details.)S 7506 Y +5991 X F102(XIT_COMPONENT_S)S 2 x(PACE_ORGANIZATION:)S 747 y 9099 X +({)S 449 y(BAND_INTER)S 2 x(LEAVED_BY_PIXEL,)S 448 y 9338 X +(BAND_INTER)S 2 x(LEAVED_BY_PLANE,)S 448 y 9338 X(BIT_INTERL)S 2 x +(EAVED_BY_PLANE)S 449 y 9099 X(})S 11541 Y 4796 X F152(XIT_CO)S -2 x +(MPRESSION_SCHEME)S 897 y 4796 X F151(XIT_CO)S -2 x(MPRESSION_SCHE)S +-2 x(ME)S 166 x(de\211nes)S 167 x(the)S 166 x(recognized)S 167 x +(image)S 166 x(compression)S 166 x(schemes.)S 13583 Y 5752 X F102 +(XIT_COMPRESSION_)S 2 x(SCHEME:)S 239 x({PCM,)S 240 x(G42D,)S 240 x +(DCT})S 897 y 4796 X F151(The)S 186 x(X)S 185 x(Image)S 185 x +(Extension)S 186 x(Protocol)S 186 x(makes)S 185 x(use)S 186 x(of)S +185 x(standardized)S 185 x(image)S 186 x(data)S 185 x(speci\211c)S +185 x(compres-)S 598 y 4796 X(sion)S 180 x(schemes)S 181 x +(\(general)S 181 x(purpose)S 181 x(information)S 181 x(theoretic)S +181 x(schemes)S 181 x(such)S 181 x(as)S 180 x(Liv)S 182 x(Zempel)S +181 x(are)S 181 x(thus)S 597 y 4796 X(excluded\).)S 261 x(While)S +171 x(these)S 172 x(may)S 171 x(not)S 172 x(be)S 172 x(the)S 171 x +(most)S 171 x(curren)S 2 x(t)S 171 x(or)S 172 x(ef\211cient,)S 174 x +(this)S 171 x(ensures)S 171 x(that)S 172 x(incompati-)S 598 y 4796 X +(bilities)S 165 x(due)S 166 x(to)S 166 x(proprietary)S 167 x(or)S +166 x(ill)S 166 x(de\211ned)S 166 x(schemes)S 166 x(does)S 166 x +(not)S 166 x(occur)S -36 x(.)S 897 y 4796 X(The)S 154 x +(relationship)S 154 x(between)S 154 x(data)S 153 x(organization)S +155 x(and)S 154 x(data)S 153 x(encoding)S 156 x(\(compression\))S +153 x(at)S 154 x(wire)S 153 x(transport,)S 598 y 4796 X(and)S 186 x +(the)S 187 x(applicability)S 186 x(of)S 186 x(various)S 188 x +(compression)S 186 x(schemes)S 186 x(to)S 186 x(various)S 187 x +(classes)S 186 x(of)S 186 x(digital)S 187 x(images)S 597 y 4796 X +(under)S 173 x(various)S 173 x(organizations)S 173 x(is)S 172 x +(discussed)S 171 x(in)S 173 x(more)S 173 x(detail)S 172 x(in)S 172 x +(the)S 173 x(section)S 173 x(on)S 172 x(wire)S 173 x(data)S 172 x +(transport)S 598 y 4796 X(overview)S -45 x(,)S 166 x(and)S 166 x(in)S +167 x(appendix)S 166 x(C)S 166 x(\(Image)S 166 x(Data)S 165 x +(Attributes)S 165 x(&)S 166 x(Organization\).)S 897 y 4796 X(PCM)S +174 x(or)S 174 x(pulse)S 174 x(code)S 174 x(modulation)S 174 x +(implies)S 173 x(no)S 174 x(compression)S 174 x(scheme)S 174 x(has)S +174 x(been)S 175 x(applied)S 173 x(to)S 174 x(the)S 174 x(data.)S +598 y 4796 X(In)S 184 x(this)S 184 x(case,)S 189 x(the)S 184 x +(image)S 185 x(data)S 184 x(at)S 184 x(wire)S 184 x(transport)S 184 x +(time)S 184 x(is)S 183 x(organized)S 185 x(according)S 186 x(to)S +184 x(the)S 184 x(selected)S 597 y 4796 X(\(client-server)S 173 x +(agreed\))S 174 x(format,)S 175 x(but)S 174 x(no)S 174 x +(compression)S 173 x(scheme)S 173 x(has)S 173 x(been)S 174 x +(applied)S 173 x(to)S 173 x(the)S 174 x(data)S 173 x(itself.)S 598 y +4796 X(It)S 171 x(is)S 172 x(included)S 172 x(as)S 172 x(a)S 172 x +("compression)S 172 x(scheme")S 172 x(so)S 171 x(that)S 172 x(it)S +172 x(may)S 172 x(be)S 172 x(transported)S 172 x(in)S 173 x(stream)S +171 x(format)S 172 x(\(see)S 598 y 4796 X(XIEP_G)S -2 x(ET_STREAM)S +166 x(and)S 166 x(XIEP_PUT_STREAM\).)S 896 y 4796 X(G42D)S 167 x +(stands)S 168 x(for)S 169 x(the)S 169 x(CCITT)S 168 x(group)S 169 x +(4)S 169 x(two)S 168 x(dimensional)S 168 x(compression)S 169 x +(scheme.)S 255 x(While)S 168 x(this)S 168 x(scheme)S 598 y 4796 X +(was)S 182 x(\211rst)S 182 x(developed)S 184 x(for)S 183 x(bitonal)S +183 x(facsimile)S 182 x(images,)S 188 x(it)S 182 x(is)S 183 x +(applicable)S 182 x(to)S 183 x(bitonal)S 183 x(and)S 183 x +(continuou)S 2 x(s)S 598 y 4796 X(tone)S 172 x(images)S 173 x(when)S +173 x(organized)S 173 x(properly)S -55 x(.)S 263 x(The)S 173 x(name)S +173 x(of)S 172 x(this)S 173 x(scheme)S 172 x(will)S 172 x(be)S 173 x +(used)S 172 x(as)S 173 x(a)S 172 x(marker)S 173 x(for)S 598 y 4796 X +(the)S 175 x(actual)S 175 x(standardized)S 174 x(algorithm)S 175 x +(and)S 176 x(data)S 174 x(tables)S 174 x(\(refer)S 176 x(to)S 174 x +(CCITT)S 175 x(references\).)S 268 x(In)S 175 x(this)S 175 x(case,)S +597 y 4796 X(the)S 182 x(image)S 182 x(data)S 181 x(at)S 182 x(wire)S +182 x(transport)S 181 x(time)S 182 x(is)S 181 x(organized)S 183 x +(according)S 183 x(to)S 182 x(the)S 182 x(selected)S 181 x +(\(client-server)S 598 y 4796 X(agreed\))S 177 x(format,)S 179 x +(and)S 177 x(within)S 177 x(this)S 177 x(agreed)S 177 x(to)S 177 x +(organization,)S 180 x(the)S 177 x(data)S 177 x(is)S 176 x +(compressed)S 176 x(according)S 178 x(to)S 598 y 4796 X(this)S 165 x +(scheme.)S 897 y 4796 X(DCT)S 182 x(or)S 183 x(discrete)S 183 x +(cosine)S 183 x(transform)S 183 x(is)S 183 x(a)S 183 x(technique)S +184 x(currently)S 184 x(being)S 184 x(standardized)S 183 x(by)S 183 x +(ISO)S 182 x(and)S 597 y 4796 X(will)S 188 x(be)S 190 x(included)S +190 x(for)S 190 x(continuous)S 191 x(tone)S 190 x(monochromatic,)S +196 x(and)S 190 x(continuou)S 2 x(s)S 189 x(tone)S 190 x +(polychromatic)S 598 y 4796 X(compression.)S 30022 Y 4796 X F152 +(XIT_IDA)S -39 x(T)S -8 x(A)S 896 y 4796 X F151(XIT_IDA)S -29 x(T)S +-27 x(A)S 165 x(is)S 166 x(the)S 166 x(generic)S 167 x(type)S 167 x +(for)S 166 x(all)S 166 x(image)S 166 x(data)S 166 x(which)S 166 x +(\212ows)S 166 x(across)S 165 x(the)S 166 x(wire.)S 32114 Y 4796 X +F152(XIT_IDC)S 35879 Y 18576 X F40(PROT)S -9 x(OCOL)S 165 x(P)S -33 x +(ARAMETER)S 165 x(TYPES)S 449 x(4\2033)S +PP +EP +%%DOC$Page: 4-4 19 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(XIT_IDC)S 166 x(is)S 167 x(the)S 167 x(type)S +168 x(for)S 168 x(an)S 168 x(image)S 167 x(domain)S 168 x(context)S +168 x(identi\211er)S -36 x(.)S 252 x(It)S 167 x(is)S 167 x +(de\211ned)S 169 x(as)S 167 x(a)S 167 x(32)S 168 x(bit)S 167 x +(identi\211er)S -37 x(.)S 598 y 4796 X(See)S 165 x(the)S 167 x +(notes)S 166 x(on)S 166 x(resource)S 167 x(id)S 166 x(formats)S 165 x +(in)S 166 x(the)S 167 x(section)S 166 x(on)S 166 x(connection)S 167 x +(setup.)S 6958 Y 4796 X F152(XIT_IDC)S -2 x(_TYPE)S 897 y 4796 X F151 +(XIT_IDC)S -2 x(_TYPE)S 166 x(identi\211es)S 166 x(the)S 166 x +(valid)S 167 x(types)S 166 x(of)S 166 x(image)S 166 x(domain)S 166 x +(contexts)S 166 x(\(IDC')S -20 x(s\).)S 249 x(They)S 168 x(include:)S +9000 Y 5752 X F102(XIT_IDC_TYPE:)S 449 y({)S 448 y(CP)S 2 x(P)S 239 x +(-)S 239 x(control)S 240 x(process)S 240 x(plane,)S 448 y 9099 X +(ROI)S 240 x(-)S 239 x(region)S 240 x(of)S 239 x(interest,)S 449 y +9099 X(TMP)S 240 x(-)S 239 x(area)S 240 x(operation)S 240 x +(template)S 448 y 8860 X(})S 12736 Y 4796 X F152(XIT_IOB)S 897 y +4796 X F151(XIT_IOB)S 169 x(is)S 170 x(the)S 171 x(type)S 171 x(for)S +170 x(an)S 171 x(image)S 171 x(object)S 171 x(identi\211er)S -36 x +(.)S 258 x(It)S 170 x(is)S 171 x(de\211ned)S 171 x(as)S 170 x(a)S +171 x(32)S 170 x(bit)S 170 x(identi\211er)S -36 x(.)S 259 x(See)S +170 x(the)S 598 y 4796 X(notes)S 165 x(on)S 167 x(resource)S 167 x +(id)S 165 x(formats)S 166 x(in)S 166 x(the)S 166 x(section)S 166 x +(on)S 167 x(connection)S 167 x(setup.)S 15426 Y 4796 X F152(XIT_IPC)S +897 y 4796 X F151(XIT_IPC)S 176 x(is)S 176 x(the)S 177 x(type)S 176 x +(for)S 177 x(an)S 177 x(image)S 177 x(process)S 176 x(control)S 177 x +(context)S 178 x(identi\211er)S -37 x(.)S 271 x(It)S 176 x(is)S 176 x +(de)S +(\211ned)S 178 x(as)S 176 x(a)S 177 x(32)S 176 x(bit)S 598 y 4796 X +(identi)S +(\211er)S -37 x(.)S 250 x(See)S 166 x(the)S 166 x(notes)S 166 x(on)S +166 x(resource)S 167 x(id)S 166 x(formats)S 165 x(in)S 167 x(the)S +166 x(section)S 166 x(on)S 166 x(connection)S 168 x(setup.)S 18116 Y +4796 X F152(XIT_HSHAPE)S 897 y 4796 X F151(XIT_HSHAPE)S 188 x +(de\211nes)S 190 x(the)S 190 x(various)S 190 x(algorithm)S 190 x +(shapes)S 189 x(that)S 190 x(can)S 190 x(be)S 190 x(requested)S 189 x +(in)S 190 x(histogram)S 598 y 4796 X(matching)S 166 x(operations.)S +250 x(They)S 167 x(include:)S 20756 Y 5752 X F102(XIT_HSHAPE)S 449 y +({)S 448 y(flat,)S 448 y 8382 X(ramp,)S 449 y 8382 X(hyperbolic,)S +448 y 8382 X(gaussian)S 448 y 8143 X(})S 24941 Y 4796 X F152 +(XIT_LOGI)S -2 x(CAL_OPS)S 896 y 4796 X F151(XIT_LOGI)S -2 x +(CAL_OPS)S 166 x(de\211nes)S 166 x(the)S 166 x(valid)S 167 x +(operators)S 165 x(of)S 166 x(the)S 167 x(logical)S 166 x(process)S +166 x(services.)S 249 x(They)S 168 x(include:)S 26983 Y 5752 X F102 +(XIT_LOGICAL_OPS)S 448 y 241 x({)S 449 y(AND,)S 448 y 9817 X(OR,)S +448 y -717 x(XOR,)S 449 y 9817 X(NOT,)S 448 y 9817 X(SHIFT_UP,)S +448 y 9817 X(SHIFT_DN)S 449 y 9578 X(})S 32064 Y 4796 X F152 +(XIT_FLOA)S -38 x(T)S 35879 Y 3600 X F40(4\2034)S 449 x(PROT)S -9 x +(OCOL)S 166 x(P)S -33 x(ARAMETER)S 165 x(TYPES)S +PP +EP +%%DOC$Page: 4-5 20 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(XIT_FLOA)S -28 x(T)S 180 x(identi\211es)S 180 x +(the)S 180 x(data)S 180 x(as)S 179 x(\212oating)S 181 x(point.)S +278 x(It)S 180 x(is)S 179 x(used)S 180 x(in)S 180 x(wire)S 180 x +(transport)S 180 x(of)S 180 x(some)S 180 x(data)S 598 y 4796 X +(\(typically)S 174 x(some)S 173 x(client)S 174 x(speci\211ed)S 173 x +(operands)S 174 x(and)S 174 x(some)S 173 x(server)S 174 x(returned)S +175 x(data\).)S 264 x(It)S 173 x(is)S 173 x(never)S 175 x(used)S +174 x(in)S 597 y 4796 X(wire)S 165 x(transport)S 166 x(of)S 166 x +(images.)S 250 x(An)S 166 x(XIE)S 165 x(\212oat)S 166 x(consists)S +165 x(of)S 166 x(three)S 166 x(components:)S 7506 Y 5752 X F102 +(XIT_FLOAT:)S 448 y -238 x([)S 449 y 239 x(e_sign)S 718 x(-)S 239 x +(BOOLEAN,)S 448 y 8382 X(m_sign)S 718 x(-)S 239 x(BOOLEAN,)S 448 y +8382 X(exponent)S 240 x(-)S 239 x(CARD8,)S 449 y 8382 X(mantissa)S +240 x(-)S 239 x(CARD16)S 448 y 7904 X(])S 897 y 4796 X F151(E_sign)S +178 x(is)S 178 x(the)S 179 x(exponent)S 180 x(sign)S 179 x(while)S +178 x(m_sign)S 179 x(is)S 178 x(the)S 179 x(mantissa)S 178 x(sign.)S +275 x(If)S 178 x(a)S 178 x(sign)S 179 x(boolean)S 179 x(is)S 178 x +(true,)S 183 x(it)S 597 y 4796 X(indicates)S 165 x(that)S 166 x(the)S +166 x(value)S 167 x(is)S 166 x(positive.)S 12886 Y 4796 X F152 +(XIT_LINE_PROG)S -2 x(RESSION)S 897 y 4796 X F151(XIT_LINE_PRO)S +-2 x(GRESSIO)S -2 x(N)S 167 x(de\211nes)S 168 x(the)S 167 x(way)S +167 x(in)S 168 x(which)S 167 x(scan)S 167 x(lines)S 167 x(are)S 167 x +(to)S 167 x(be)S 168 x(painted)S 167 x(at)S 166 x(presenta-)S 597 y +4796 X(tion)S 166 x(time.)S 249 x(See)S 166 x(the)S 166 x(appendix)S +167 x(on)S 166 x(image)S 166 x(data)S 166 x(attributes)S 165 x(&)S +166 x(organization)S 167 x(for)S 166 x(more)S 166 x(details.)S 15526 Y +5752 X F102(XIT_LINE_PROGRES)S 2 x(SION:)S 478 x({90,)S 240 x(270})S +17020 Y 4796 X F152(XIT_MA)S -38 x(THF)S 897 y 4796 X F151(XIT_MA)S +-28 x(THF)S 191 x(de\211nes)S 191 x(the)S 190 x(valid)S 191 x +(mathematical)S 190 x(functions)S 191 x(that)S 191 x(can)S 191 x(be)S +190 x(invoked)S 192 x(through)S 192 x(the)S 598 y 4796 X +(mathematical)S 165 x(process)S 166 x(functions.)S 250 x(They)S 167 x +(include:)S 19661 Y 5752 X F102(XIT_MATHF)S 448 y({)S 448 y(EXP,)S +448 y 8143 X(NATURAL)S 240 x(LOG,)S 449 y 8143 X(LOG2,)S 448 y 8143 X +(LOG10,)S 448 y 8143 X(SQUARE,)S 449 y 8143 X(SQUARE_ROOT,)S 448 y +7904 X(})S 24741 Y 4796 X F152(XIT_PIXEL_PROG)S -2 x(RESSION)S 897 y +4796 X F151(XIT_PIXEL_PRO)S -2 x(GRESSIO)S -2 x(N)S 182 x(de\211nes)S +181 x(the)S 182 x(way)S 182 x(in)S 181 x(which)S 182 x(pixels)S 181 x +(are)S 182 x(to)S 181 x(be)S 182 x(painted)S 181 x(along)S 183 x +(scan)S 598 y 4796 X(lines)S 165 x(at)S 165 x(presentation)S 166 x +(time.)S 249 x(See)S 166 x(the)S 166 x(appendix)S 166 x(on)S 166 x +(image)S 166 x(data)S 165 x(attributes)S 165 x(&)S 165 x(organ)S +2 x(ization)S 165 x(for)S 165 x(more)S 598 y 4796 X(details.)S 27979 Y +-733 x F102(XIT_PIXEL_PROGRE)S 2 x(SSION:)S 478 x({0,)S 240 x(90,)S +239 x(180,)S 240 x(270})S 29474 Y 4796 X F152(XIT_POLARITY)S 896 y +4796 X F151(XIT_POLARI)S -2 x(TY)S 169 x(de\211nes)S 169 x(the)S +168 x(way)S 169 x(in)S 168 x(which)S 169 x(pixel)S 169 x(data)S 168 x +(is)S 168 x(to)S 168 x(be)S 169 x(interpreted)S 168 x(at)S 169 x +(presentation)S 168 x(time.)S 598 y 4796 X(In)S 180 x(particular)S +-37 x(,)S 185 x(it)S 180 x(de\211nes)S 180 x(how)S 181 x(data)S 180 x +(values)S 180 x(are)S 181 x(mapped)S 180 x(into)S 180 x(brightness.)S +279 x(See)S 180 x(the)S 181 x(appendix)S 180 x(on)S 598 y 4796 X +(image)S 166 x(data)S 165 x(organ)S 2 x(ization)S 165 x(for)S 166 x +(more)S 166 x(details.)S 32712 Y 5752 X F102(XIT_POLARITY:)S 479 x +({ZERO-BRIG)S 2 x(HT,)S 239 x(ZERO-DARK})S 35879 Y 18576 X F40(PROT)S +-9 x(OCOL)S 165 x(P)S -33 x(ARAMETER)S 165 x(TYPES)S 449 x(4\2035)S +PP +EP +%%DOC$Page: 4-6 21 +1000 BP 39600 30600 PM 0 0 XY +5147 Y 4796 X F152(XIT_PRED_TYPE)S 896 y 4796 X F151(XIT_PRED)S -2 x +(_TYPE)S 185 x(de\211nes)S 185 x(the)S 185 x(dyadic)S 185 x +(predicate)S 185 x(operators)S 184 x(recogn)S 2 x(ized)S 184 x(by)S +185 x(predicate)S 185 x(protocol)S 598 y 4796 X(functions)S 166 x +(including:)S 7787 Y 5752 X F102(XIT_PRED_TYPE:)S 448 y 240 x({)S +448 y(LESS)S 240 x(THAN,)S 449 y 9578 X(LESS)S 239 x(THAN)S 240 x +(OR)S 239 x(EQUAL)S 240 x(TO,)S 448 y 9578 X(EQUAL)S 239 x(TO,)S +448 y 9578 X(NOT)S 239 x(EQUAL)S 240 x(TO,)S 449 y 9578 X(GREATER)S +239 x(THAN)S 240 x(OR)S 239 x(EQUAL)S 240 x(TO,)S 448 y 9578 X +(GREATER)S 239 x(THAN)S 448 y 9338 X(})S 12868 Y 4796 X F152(XIT_ST)S +-9 x(A)S -37 x(T_TYPE)S 896 y 4796 X F151(XIT_ST)S -28 x(A)S -28 x +(T_TYPE)S 166 x(de\211nes)S 167 x(the)S 166 x(types)S 166 x(of)S +166 x(statist)S -2 x(ical)S 166 x(functions)S 167 x(recognized)S +167 x(in)S 166 x(the)S 166 x(protocol)S 166 x(including)S 2 x(:)S +14910 Y 5752 X F102(XIT_STAT_TYPE:)S 747 y({)S 449 y(M)S 2 x +(INIMUM,)S 448 y 9338 X(MAXIMUM,)S 448 y 9338 X(MEAN,)S 449 y 9338 X +(STD_DEV,)S 448 y 9338 X(VARIANCE)S 448 y 9099 X(})S 19842 Y 4796 X +F152(XIT_RESOURCE)S -2 x(_TYPE)S 896 y 4796 X F151(XIT_RES)S -2 x +(OURCE_TYPE)S 176 x(is)S 177 x(used)S 178 x(to)S 177 x(de\211ne)S +179 x(the)S 178 x(type)S 177 x(of)S 178 x(image)S 178 x(extension)S +178 x(server)S 178 x(resource.)S 274 x(It)S 177 x(is)S 598 y 4796 X +(used)S 181 x(primarily)S 181 x(during)S 183 x(resource)S 182 x +(creation.)S 280 x(The)S 182 x(speci\211c)S 182 x(extension)S 182 x +(resource)S 182 x(types)S 181 x(are)S 181 x(de\211ned)S 598 y 4796 X +(below)S -47 x(.)S 250 x(Details)S 165 x(of)S 166 x(their)S 166 x +(contents)S 166 x(are)S 166 x(found)S 167 x(in)S 166 x(the)S 166 x +(appendix)S 167 x(on)S 167 x(server)S 166 x(resources.)S 23079 Y +5752 X F102(XIT_RESOURCE_TYP)S 2 x(E:)S 239 x({XIR_IOB,)S 240 x +(XIR_IDC,)S 240 x(XIR_IPC})S 748 y 6708 X(symbol)S 11490 X(meaning)S +747 y 6708 X(XIR_IOB)S 11490 X(image)S 240 x(object)S 448 y 6708 X +(XIR_IDC)S 11490 X(domain)S 479 x(control)S 240 x(context)S 448 y +6708 X(XIR_IPC)S 11490 X(process)S 240 x(control)S 240 x(context)S +26965 Y 4796 X F152(XIT_SPECTRAL_COMPONE)S -2 x(NT_MAPPING)S 897 y +4796 X F151(XIT_SPECTRA)S -2 x(L_COMPONENT_MAPPING)S 171 x +(de\211nes)S 171 x(the)S 172 x(recognized)S 172 x(3)S 171 x(color)S +172 x(space)S 171 x(systems.)S 259 x(As)S 597 y 4796 X(of)S 165 x +(this)S 166 x(version,)S 167 x(the)S 167 x(only)S 166 x(recogn)S +2 x(ized)S 165 x(spectral)S 166 x(component)S 167 x(mapping)S 166 x +(is)S 166 x(RGB.)S 29605 Y 5752 X F102(XIT_SPECTRAL_COM)S 2 x +(PONENT_MAPPING:)S 240 x({RGB})S 31099 Y 4796 X F152(XIT_FUNCTION_V)S +-2 x(ECTOR)S 35879 Y 3600 X F40(4\2036)S 449 x(PROT)S -9 x(OCOL)S +166 x(P)S -33 x(ARAMETER)S 165 x(TYPES)S +PP +EP +%%DOC$Page: 4-7 22 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(XIT_FUNCTION_V)S -2 x(ECTOR)S 171 x(is)S 171 x +(used)S 172 x(to)S 172 x(convey)S 173 x(information)S 172 x(about)S +172 x(server)S 172 x(support)S 172 x(for)S 172 x(individual)S 598 y +4796 X(XIE)S 162 x(protocol)S 163 x(functions.)S 250 x(Each)S 163 x +(bit)S 163 x(of)S 162 x(the)S 164 x(XIT_FUNCTION_VE)S -2 x(CTOR)S +162 x(represents)S 163 x(a)S 163 x(single)S 163 x(protocol)S 597 y +4796 X(function)S 178 x(in)S 178 x(the)S 178 x(image)S 178 x +(extension)S 179 x(protocol.)S 273 x(The)S 178 x(index)S 178 x(of)S +178 x(the)S 178 x(bit)S 177 x(\(zero)S 178 x(relative\))S 178 x(is)S +177 x(the)S 178 x(value)S 179 x(of)S 598 y 4796 X(the)S 171 x +(protocol)S 171 x(function)S 172 x(number)S -36 x(.)S 260 x(A)S 171 x +(bit)S 170 x(value)S 172 x(of)S 171 x(1)S 171 x(indicates)S 171 x +(that)S 171 x(the)S 172 x(function)S 172 x(is)S 170 x(supported)S +171 x(by)S 172 x(the)S 598 y 4796 X(server)S -37 x(,)S 167 x(while)S +166 x(0)S 166 x(implies)S 165 x(that)S 166 x(it)S 165 x(is)S 166 x +(not.)S 35879 Y 18576 X F40(PROT)S -9 x(OCOL)S 165 x(P)S -33 x +(ARAMETER)S 165 x(TYPES)S 449 x(4\2037)S +PP +EP +%%DOC$Page: 5-1 23 +1000 BP 39600 30600 PM 0 0 XY +9007 Y 3600 X F24(Chapter)S 498 x(5)S 10651 Y 3600 X(PROT)S -13 x +(OCO)S -2 x(L)S 167 x(ERRO)S -2 x(R)S 166 x(COD)S -2 x(ES)S 13357 Y +4796 X F151(The)S 175 x(image)S 176 x(extension)S 175 x(protocol)S +176 x(makes)S 175 x(use)S 175 x(of)S 175 x(both)S 175 x(core)S 176 x +(protocol)S 175 x(error)S 176 x(codes)S 175 x(and)S 175 x(image)S +175 x(speci\211c)S 598 y 4796 X(extension)S 166 x(protocol)S 166 x +(error)S 167 x(codes.)S 15349 Y 3600 X F28(5.1)S 599 x(Core)S 165 x +(Errors)S 16595 Y 4796 X F151(The)S 175 x(following)S 175 x(errors)S +174 x(are)S 175 x(de\211ned)S 176 x(in)S 174 x(the)S 175 x(X1)S -28 x +(1)S 175 x(core)S 175 x(protocol)S 175 x(speci\211cation.)S 267 x +(Refer)S 174 x(to)S 175 x(the)S 175 x(X1)S -28 x(1)S 174 x(core)S +598 y 4796 X(protocol)S 166 x(speci\211cation)S 166 x(for)S 166 x +(their)S 166 x(de\211nition.)S 18338 Y 4796 X F102(Access)S 7665 X +(Alloc)S 10534 X(Atom)S 13403 X(Colormap)S 17229 X(Cursor)S 449 y +4796 X(Drawable)S 7665 X(Font)S 10534 X(GContext)S 13403 X(IDChoice)S +17229 X(Implementation)S 448 y 4796 X(Length)S 7665 X(Match)S 10534 X +(Name)S 13403 X(Pixmap)S 17229 X(Property)S 448 y 4796 X(Request)S +7665 X(Value)S 10534 X(Window)S 897 y 4796 X F151(The)S 166 x(image)S +167 x(extension)S 166 x(makes)S 166 x(explicit)S 166 x(use)S 166 x +(of)S 166 x(the)S 167 x(following)S 166 x(core)S 166 x(protocol)S +167 x(errors:)S 897 y 4796 X(\201)S 594 x(Access)S 747 y 4796 X +(\201)S 594 x(Alloc)S 747 y 4796 X(\201)S 594 x(IDChoice)S 747 y +4796 X(\201)S 594 x(Match)S 747 y 4796 X(\201)S 594 x(V)S -46 x +(alue)S 25561 Y 4796 X(The)S 169 x(image)S 169 x(extension)S 169 x +(uses)S 169 x(the)S 169 x(core)S 169 x(protocol)S 169 x(Access)S +168 x(error)S 169 x(during)S 170 x(the)S 169 x(image)S 169 x(data)S +169 x(wire)S 168 x(transport)S 598 y 4796 X(process.)S 264 x(The)S +174 x(error)S 174 x(indicates)S 173 x(that)S 173 x(the)S 174 x +(client)S 174 x(failed)S 173 x(to)S 173 x(establish)S 173 x(the)S +173 x(required)S 175 x(transport)S 173 x(context)S 598 y 4796 X +(information)S 166 x(and)S 166 x(that)S 166 x(wire)S 166 x +(transport)S 166 x(of)S 166 x(image)S 166 x(data)S 166 x(can)S 166 x +(not)S 166 x(proceed)S 167 x(until)S 166 x(this)S 166 x(is)S 165 x +(done.)S 896 y 4796 X(The)S 168 x(image)S 168 x(extension)S 169 x +(uses)S 167 x(the)S 168 x(core)S 168 x(protocol)S 168 x(Alloc)S 168 x +(error)S 168 x(for)S 168 x(server)S 168 x(resource)S 169 x +(allocation)S 168 x(problems.)S 598 y 4796 X(The)S 185 x(error)S +185 x(indicates)S 185 x(that)S 185 x(the)S 185 x(server)S 185 x(was)S +184 x(unable)S 185 x(to)S 185 x(allocate)S 185 x(the)S 185 x +(resource.)S 287 x(As)S 184 x(with)S 185 x(the)S 185 x(core)S 598 y +4796 X(protocol,)S 173 x(it)S 171 x(is)S 171 x(left)S 171 x(to)S +172 x(the)S 172 x(implementors)S 171 x(to)S 171 x(decide)S 172 x(as)S +171 x(to)S 171 x(the)S 172 x(implications)S 171 x(of)S 171 x(this)S +171 x(error)S 173 x(for)S 171 x(all)S 172 x(the)S 598 y 4796 X +(possible)S 165 x(allocation)S 166 x(problems)S 165 x(which)S 167 x +(may)S 166 x(arise)S 166 x(within)S 166 x(the)S 166 x(extension)S +167 x(server)S -37 x(.)S 896 y 4796 X(In)S 175 x(extension)S 177 x +(protocol)S 175 x(functions)S 176 x(which)S 176 x(create)S 176 x +(new)S 176 x(server)S 176 x(resources)S 176 x(and)S 176 x(assign)S +175 x(to)S 176 x(them)S 175 x(client)S 598 y 4796 X(speci\211ed)S +175 x(resource)S 175 x(id')S -19 x(s,)S 178 x(the)S 175 x(image)S +176 x(extension)S 175 x(uses)S 175 x(the)S 175 x(core)S 176 x +(protocol)S 175 x(IDChoice)S 175 x(\(BAD)S -2 x(_IDChoice\))S 598 y +4796 X(error)S 166 x(to)S 166 x(signal)S 166 x(that)S 166 x(the)S +166 x(client)S 167 x(desired)S 165 x(new)S 166 x(resource)S 167 x +(id)S 166 x(is)S 166 x(invalid)S 166 x(or)S 166 x(already)S 167 x +(in)S 166 x(use.)S 35879 Y 19639 X F40(PROT)S -9 x(OCOL)S 165 x +(ERROR)S 165 x(CODES)S 448 x(5\2031)S +PP +EP +%%DOC$Page: 5-2 24 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(In)S 170 x(extension)S 171 x(protocol)S 170 x +(functions)S 171 x(which)S 170 x(make)S 171 x(use)S 170 x(of)S 170 x +(existing)S 171 x(server)S 170 x(resources,)S 172 x(the)S 171 x +(image)S 170 x(exten-)S 598 y 4796 X(sion)S 173 x(uses)S 174 x(the)S +174 x(core)S 174 x(protocol)S 174 x(IDChoice)S 173 x(\(BAD_I)S -2 x +(DChoice\))S 174 x(error)S 174 x(to)S 174 x(signal)S 174 x(that)S +173 x(the)S 174 x(client)S 174 x(speci\211ed)S 597 y 4796 X +(resource)S 172 x(id)S 172 x(is)S 172 x(invalid)S 172 x(\(wrong)S +173 x(type)S 172 x(of)S 172 x(resource)S 173 x(or)S 172 x +(nonexistent)S 173 x(resource\).)S 262 x(This)S 172 x(applies)S 172 x +(to)S 171 x(image)S 598 y 4796 X(objects)S 172 x(\(IOB')S -20 x +(s\),)S 174 x(image)S 173 x(domain)S 172 x(control)S 173 x(contexts)S +173 x(\(IDC')S -20 x(s\),)S 174 x(and)S 173 x(image)S 173 x +(processing)S 172 x(control)S 173 x(contexts)S 598 y 4796 X(\(IPC')S +-20 x(s\).)S 897 y 4796 X(The)S 178 x(image)S 178 x(extension)S 179 x +(uses)S 178 x(the)S 178 x(core)S 179 x(protocol)S 178 x(Match)S 178 x +(error)S 179 x(to)S 178 x(signal)S 178 x(mismatches)S 177 x(between)S +178 x(IOB)S 597 y 4796 X(constraint)S 166 x(or)S 166 x(chrominance)S +167 x(state)S 166 x(and)S 166 x(the)S 166 x(state)S 165 x(required)S +167 x(by)S 167 x(the)S 166 x(function)S 167 x(at)S 165 x(hand.)S +897 y 4796 X(The)S 180 x(image)S 180 x(extension)S 181 x(uses)S 179 x +(the)S 180 x(core)S 180 x(protocol)S 180 x(V)S -46 x(alue)S 180 x +(error)S 181 x(to)S 179 x(signal)S 180 x(attempts)S 179 x(to)S 180 x +(assign)S 179 x(values)S 598 y 4796 X(which)S 166 x(are)S 166 x(out)S +166 x(of)S 166 x(range)S 167 x(to)S 166 x(extension)S 167 x +(resource)S 167 x(\211elds)S 166 x(and)S 166 x(when)S 166 x(math)S +166 x(errors)S 167 x(occur)S -36 x(.)S 896 y 4796 X(All)S 169 x +(errors)S 170 x(return)S 170 x(a)S 170 x(message)S 169 x(with)S 170 x +(a)S 169 x(common)S 170 x(pre\211x)S 171 x(as)S 169 x(described)S +170 x(in)S 170 x(the)S 170 x(Error)S 170 x(Protocol)S 170 x(Message)S +598 y 4796 X(Format)S 183 x(section.)S 283 x(Included)S 184 x(in)S +183 x(this)S 183 x(information)S 184 x(is)S 182 x(the)S 184 x +(protocol)S 183 x(function)S 184 x(major)S 183 x(opcode,)S 189 x +(minor)S 598 y 4796 X(opcode)S 162 x(\(extension)S 164 x(function)S +163 x(code\),)S 164 x(error)S 163 x(code,)S 164 x(type)S 163 x +(code,)S 164 x(and)S 163 x(the)S 163 x(request)S 163 x(sequence)S +163 x(number)S -36 x(.)S 249 x(This)S 598 y 4796 X(information)S +166 x(is)S 165 x(followed)S 166 x(by)S 166 x(error)S 167 x(code)S +166 x(speci\211c)S 166 x(data)S 166 x(described)S 166 x(below)S -46 x +(.)S 14629 Y 3600 X F28(5.2)S 599 x(Extension)S 167 x(Errors)S 15875 Y +4796 X F151(There)S 166 x(are)S 167 x(no)S 166 x(image)S 166 x +(extension)S 167 x(speci\211c)S 166 x(errors)S 167 x(at)S 166 x +(this)S 165 x(time.)S 35879 Y 3600 X F40(5\2032)S 449 x(PROT)S -9 x +(OCOL)S 166 x(ERROR)S 165 x(CODES)S +PP +EP +%%DOC$Page: 6-1 25 +1000 BP 39600 30600 PM 0 0 XY +9007 Y 3600 X F24(Chapter)S 498 x(6)S 10651 Y 3600 X(SER)S -13 x +(VER)S 166 x(DA)S -52 x(T)S -52 x(A)S 166 x(MODEL)S 13357 Y 4796 X +F151(Data)S 164 x(formats)S 165 x(for)S 165 x(wire)S 165 x +(transport)S 165 x(of)S 165 x(image)S 165 x(data)S 165 x(are)S 166 x +(fully)S 165 x(speci\211ed)S 166 x(in)S 165 x(the)S 166 x(protocol)S +165 x(\(next)S 166 x(chapter\).)S 598 y 4796 X(The)S 169 x(natural)S +169 x(tendency)S 170 x(is)S 168 x(to)S 169 x(leave)S 169 x(the)S +169 x(particulars)S 168 x(of)S 169 x(image)S 169 x(data)S 168 x +(representation)S 169 x(on)S 169 x(the)S 169 x(server)S 170 x(to)S +597 y 4796 X(server)S 161 x(implementors.)S 249 x(But,)S 162 x(to)S +160 x(some)S 160 x(extent,)S 163 x(the)S 161 x(operation)S 161 x(of)S +160 x(certain)S 161 x(extension)S 161 x(protocol)S 161 x(functions)S +598 y 4796 X(depend)S 176 x(upon)S 177 x(server)S 177 x(image)S 176 x +(data)S 176 x(representation.)S 270 x(This)S 177 x(chapter)S 176 x +(de)S +(\211nes)S 177 x(the)S 176 x(bounds)S 177 x(of)S 176 x(a)S 176 x +(server)S 598 y 4796 X(image)S 173 x(data)S 174 x(model)S 173 x +(which)S 174 x(will)S 173 x(ensure)S 174 x(some)S 174 x(degree)S +174 x(of)S 174 x(operational)S 174 x(consistency)S 174 x(between)S +173 x(various)S 598 y 4796 X(server)S 166 x(implementations.)S 896 y +4796 X(There)S 160 x(are)S 160 x(several)S 160 x(dimensions)S 160 x +(to)S 159 x(the)S 160 x(server)S 161 x(image)S 160 x(data)S 159 x +(model.)S 250 x(The)S 160 x(\211rst)S 160 x(is)S 159 x(the)S 160 x +(tradeoff)S 160 x(between)S 598 y 4796 X(dynamic)S 181 x(range/prec)S +2 x(ision)S 180 x(and)S 181 x(processing)S 181 x(speed/accuracy)S +-54 x(.)S 279 x(The)S 181 x(second)S 181 x(is)S 180 x(the)S 180 x +(relationship)S 181 x(be-)S 598 y 4796 X(tween)S 171 x(server)S 171 x +(image)S 172 x(data)S 171 x(organization)S 172 x(and)S 171 x +(spectral)S 171 x(bands.)S 260 x(The)S 172 x(third)S 171 x(is)S 171 x +(the)S 171 x(ability)S 172 x(to)S 171 x(pipeline)S 598 y 4796 X +(image)S 166 x(data)S 165 x(throug)S 2 x(h)S 166 x(multiple)S 166 x +(XIE)S 165 x(server)S 167 x(processing)S 166 x(primitives.)S 20430 Y +3600 X F28(6.1)S 599 x(Constrained)S 167 x(vs)S 167 x(Unconstrained)S +21676 Y 4796 X F151(XIE)S 163 x(has)S 163 x(established)S 164 x(the)S +164 x(de\211nition)S 164 x(of)S 164 x(an)S 165 x(image)S 164 x(at)S +163 x(wire)S 164 x(transport)S 164 x(to)S 164 x(be)S 164 x(a)S 164 x +(two)S 163 x(dimensional)S 164 x(array)S 598 y 4796 X(of)S 174 x +(positive)S 173 x(integral)S 175 x(data)S 174 x(which)S 174 x(may)S +175 x(be)S 174 x(organized)S 174 x(and)S 175 x(compressed)S 173 x +(in)S 175 x(various)S 174 x(ways.)S 266 x(The)S 174 x(wire)S 597 y +4796 X(transport)S 170 x(de\211nition)S 172 x(was)S 170 x(chosen)S +172 x(to)S 170 x(force)S 172 x(the)S 171 x(application)S 170 x(or)S +172 x(client)S 171 x(to)S 170 x(reduce)S 172 x(the)S 171 x +(dimensionality)S 598 y 4796 X(of)S 189 x(its)S 190 x(data)S 189 x +(to)S 190 x(a)S 190 x(least)S 189 x(common)S 190 x(denominator)S +191 x(based)S 189 x(upon)S 191 x(the)S 190 x(premise)S 189 x(that)S +190 x(the)S 190 x(application)S 598 y 4796 X(understands)S 166 x +(its)S 165 x(data)S 166 x(model)S 166 x(better)S 165 x(than)S 167 x +(any)S 167 x(one)S 166 x(else.)S 896 y 4796 X(The)S 163 x(wire)S +163 x(transport)S 162 x(de\211nition)S 164 x(of)S 163 x(image)S 163 x +(data)S 163 x(is)S 162 x(too)S 163 x(restrictive)S 163 x(for)S 163 x +(many)S 163 x(computational)S 163 x(purposes.)S 598 y 4796 X(A)S +175 x(simple)S 176 x(example)S 176 x(is)S 175 x(an)S 177 x +(algorithm)S 176 x(which)S 177 x(subtracts)S 175 x(a)S 176 x +(constant)S 176 x(from)S 176 x(an)S 177 x(image)S 176 x(and)S 176 x +(then)S 177 x(adds)S 598 y 4796 X(the)S 165 x(constant)S 165 x(back)S +165 x(in.)S 250 x(Under)S 165 x(the)S 165 x(positive)S 165 x +(integral)S 166 x(constraint,)S 165 x(this)S 165 x(algorithm)S 165 x +(may)S 166 x(not)S 165 x(reproduce)S 598 y 4796 X(the)S 178 x +(original)S 178 x(data.)S 274 x(Another)S 178 x(example)S 178 x(of)S +178 x(an)S 178 x(algorithm)S 179 x(that)S 178 x(may)S 178 x(suffer)S +178 x(is)S 178 x(one)S 178 x(which)S 178 x(takes)S 178 x(the)S 597 y +4796 X(natural)S 177 x(log)S 177 x(of)S 176 x(the)S 177 x(data)S +176 x(and)S 177 x(then)S 177 x(either)S 177 x(an)S 177 x(antilog)S +177 x(or)S 177 x(scaling)S 177 x(of)S 177 x(the)S 177 x(result)S +176 x(to)S 177 x(\211t)S 176 x(within)S 177 x(some)S 598 y 4796 X +(dynamic)S 173 x(range.)S 265 x(The)S 174 x(integral)S 173 x +(constraint)S 174 x(throws)S 172 x(away)S 173 x(much)S 174 x +(information)S 173 x(generated)S 174 x(by)S 174 x(the)S 173 x(log)S +598 y 4796 X(function.)S 897 y 4796 X(The)S 180 x(server)S 180 x +(image)S 179 x(data)S 179 x(model)S 180 x(must)S 179 x(provide)S +180 x(for)S 179 x(a)S 179 x(balance)S 180 x(between)S 180 x +(representational)S 179 x(\212exibil-)S 597 y 4796 X(ity)S 185 x +(\(regarding)S 186 x(the)S 185 x(dynamic)S 186 x(range)S 186 x(and)S +185 x(precision)S 185 x(of)S 185 x(the)S 185 x(data\))S 185 x(and)S +185 x(computational)S 185 x(ef\211ciency)S -54 x(.)S 598 y 4796 X(T)S +-26 x(ypically)S -55 x(,)S 186 x(this)S 180 x(is)S 181 x(done)S 181 x +(by)S 182 x(mapping)S 181 x(the)S 181 x(data)S 181 x(directly)S 181 x +(onto)S 181 x(one)S 182 x(of)S 181 x(the)S 181 x(machine)S 182 x +(architecture')S -18 x(s)S 598 y 4796 X(primitive)S 166 x(data)S +166 x(formats)S 166 x(\(integer)S 167 x(or)S 167 x(\212oat\).)S 250 x +(Differences)S 167 x(between)S 166 x(various)S 167 x(server)S 167 x +(machine)S 167 x(architec-)S 598 y 4796 X(tures)S 170 x(regarding)S +171 x(word)S 170 x(size)S 169 x(for)S 170 x(integers)S 171 x(and)S +170 x(robustness)S 169 x(of)S 170 x(\212oating)S 171 x(point)S 170 x +(support)S 170 x(require)S 171 x(XIE)S 169 x(to)S 597 y 4796 X +(adopt)S 165 x(a)S 166 x(logical)S 167 x(rather)S 166 x(than)S 167 x +(physical)S 166 x(approach.)S 35879 Y 20751 X F40(SER)S -8 x(VER)S +166 x(DA)S -34 x(T)S -33 x(A)S 166 x(MODEL)S 448 x(6\2031)S +PP +EP +%%DOC$Page: 6-2 26 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(XIE)S 184 x(adopts)S 185 x(two)S 185 x(logical)S +186 x(image)S 186 x(data)S 185 x(representation)S 186 x(models)S +185 x(on)S 186 x(the)S 185 x(server:)S 290 x(constrained)S 186 x +(and)S 598 y 4796 X(unconstrained.)S 275 x(Constrained)S 179 x(data)S +178 x(will)S 178 x(be)S 179 x(positive)S 178 x(integral)S 179 x +(data)S 179 x(with)S 178 x(limited)S 178 x(dynamic)S 179 x(range)S +597 y 4796 X(and)S 184 x(\211xed)S 186 x(precision)S 185 x([zero)S +184 x(based)S 185 x(with)S 184 x(a)S 185 x(\211xed)S 185 x +(precision)S 185 x(\(number)S 185 x(of)S 185 x(levels)S 185 x(or)S +185 x(number)S 185 x(of)S 185 x(bits)S 598 y 4796 X(per)S 179 x +(spectral)S 179 x(component)S 180 x(per)S 179 x(pixel\)].)S 277 x +(Unconstrained)S 180 x(data)S 179 x(may)S 179 x(be)S 180 x(positive)S +179 x(or)S 179 x(negative)S 181 x(and)S 179 x(of)S 598 y 4796 X +(dynamic)S 183 x(range)S 184 x(less)S 182 x(than)S 183 x(or)S 183 x +(equal)S 183 x(to)S 183 x(the)S 183 x(maximum)S 183 x(that)S 182 x +(the)S 183 x(server)S 184 x(implementor)S 182 x(\(typically)S 598 y +4796 X(machine)S 189 x(architecture\))S 190 x(can)S 189 x(provide.)S +296 x(As)S 189 x(such,)S 195 x(its)S 189 x(dynamic)S 189 x(range)S +190 x(will)S 189 x(be)S 189 x(higher)S 190 x(than)S 189 x(that)S +597 y 4796 X(of)S 189 x(constrained)S 190 x(data.)S 296 x(While)S +189 x(\212oat)S 190 x(may)S 190 x(be)S 189 x(a)S 189 x(natural)S +190 x(choice)S 191 x(for)S 189 x(unconstrained)S 191 x(data,)S 195 x +(server)S 598 y 4796 X(implementors)S 161 x(are)S 161 x(free)S 162 x +(to)S 162 x(choose)S 162 x(a)S 161 x(long)S 163 x(integer)S 162 x +(to)S 161 x(represent)S 162 x(uncon)S 2 x(strained)S 161 x(data.)S +249 x(The)S 162 x(process)S 162 x(of)S 598 y 4796 X(converting)S +171 x(from)S 170 x(uncon)S 2 x(strained)S 169 x(to)S 170 x +(constrained)S 170 x(data)S 170 x(is)S 169 x(one)S 171 x(of)S 170 x +(making)S 171 x(all)S 169 x(the)S 171 x(data)S 169 x(positive,)S +171 x(and)S 598 y 4796 X(with)S 165 x(\211xed)S 167 x(number)S 167 x +(of)S 166 x(quantization)S 166 x(levels.)S 896 y 4796 X(The)S 184 x +(client)S 184 x(has)S 184 x(substantial)S 183 x(control)S 185 x +(over)S 184 x(when)S 185 x(and)S 184 x(how)S 184 x(constraints)S +183 x(are)S 185 x(applied.)S 284 x(The)S 185 x(client)S 598 y 4796 X +(has)S 185 x(the)S 186 x(ability)S 186 x(to)S 185 x(modify)S 186 x +(the)S 186 x(parameters)S 185 x(which)S 186 x(control)S 186 x(how)S +186 x(constraining)S 187 x(is)S 185 x(done)S 186 x(\(default)S 598 y +4796 X(constraint)S 169 x(model\).)S 257 x(The)S 170 x(client)S 170 x +(has)S 170 x(the)S 170 x(ability)S 170 x(to)S 169 x(query)S 171 x +(an)S 170 x(IOB)S 169 x(and)S 170 x(determine)S 170 x(its)S 169 x +(state)S 168 x(relative)S 598 y 4796 X(to)S 180 x(constraints.)S +279 x(The)S 182 x(client)S 181 x(has)S 181 x(the)S 181 x(ability)S +181 x(to)S 181 x(explicitly)S 181 x(force)S 182 x(conversion)S 182 x +(to)S 181 x(constrained)S 181 x(state)S 597 y 4796 X(directly)S 168 x +(\(through)S 169 x(a)S 168 x("constrain")S 168 x(protocol)S 168 x +(function\),)S 170 x(or)S 168 x(indirectly)S 169 x(\(after)S 167 x +(the)S 168 x(application)S 168 x(of)S 168 x(process)S 598 y 4796 X +(protocol)S 166 x(functions\).)S 897 y 4796 X(The)S 178 x +(constrained/u)S 2 x(nconstrained)S 179 x(model)S 178 x(applies)S +177 x(to)S 178 x(all)S 178 x(server)S 179 x(functions)S 179 x(which)S +178 x(deal)S 178 x(with)S 178 x(image)S 598 y 4796 X(data)S 173 x +(\(thus,)S 175 x(constrained/u)S 2 x(nconstrained)S 174 x(is)S 173 x +(meaningless)S 174 x(for)S 173 x(functions)S 174 x(such)S 174 x(as)S +173 x(select)S 174 x(events)S 173 x(and)S 597 y 4796 X(query)S 167 x +(IDC)S 165 x(which)S 166 x(do)S 166 x(not)S 166 x(deal)S 166 x(with)S +166 x(image)S 166 x(data\).)S 897 y 4796 X(Protocol)S 169 x +(functions)S 170 x(which)S 169 x(should)S 169 x(not)S 170 x(accept)S +169 x(unconstrained)S 170 x(data)S 169 x(\(wire)S 168 x(transport,)S +171 x(bitwis)S -2 x(e)S 170 x(logical)S 598 y 4796 X(functions,...)S +2 x(\))S 249 x(will)S 152 x(reject)S 153 x(it)S 153 x(\(user)S 153 x +(is)S 152 x(forced)S 153 x(to)S 153 x(explicitly)S 153 x(constrain)S +154 x(it\).)S 249 x(Protocol)S 153 x(functions)S 153 x(which)S 153 x +(are)S 597 y 4796 X(asked)S 172 x(to)S 173 x(output)S 173 x +(constrained)S 173 x(data)S 173 x(will)S 172 x(apply)S 173 x(the)S +173 x(constraint)S 173 x(function)S 173 x(after)S 173 x(their)S 173 x +(basic)S 172 x(function)S 598 y 4796 X(is)S 177 x(performed)S 178 x +(\(ie.)S 274 x(ensure)S 179 x(maximum)S 178 x(dynamic)S 179 x(range)S +179 x(&)S 178 x(precision)S 178 x(in)S 178 x(the)S 179 x +(calculation)S 178 x(and)S 179 x(apply)S 598 y 4796 X(constraints)S +165 x(on)S 167 x(the)S 166 x(way)S 166 x(out\).)S 897 y 4796 X(For)S +182 x(example,)S 186 x(let)S 182 x(the)S 182 x(client)S 182 x +(specify)S 182 x(a)S 182 x(constraint)S 182 x(model)S 181 x(of)S +182 x(256)S 182 x(levels)S 182 x(for)S 181 x(a)S 182 x(gray)S 183 x +(scale)S 182 x(image,)S 597 y 4796 X(and)S 190 x(let)S 189 x(there)S +191 x(be)S 190 x(a)S 190 x(test)S 189 x(image)S 190 x(which)S 191 x +(was)S 189 x(sent)S 190 x(across)S 189 x(the)S 191 x(wire)S 189 x +(with)S 190 x(equal)S 190 x(distribution)S 190 x(of)S 598 y 4796 X +(pixels)S 176 x(in)S 176 x(all)S 176 x(256)S 176 x(states)S 176 x +(\(it)S 175 x(is)S 176 x(constrained\).)S 271 x(If)S 175 x(the)S +177 x(client)S 176 x(asks)S 176 x(for)S 177 x(a)S 176 x(constrained)S +177 x(subtraction)S 176 x(of)S 598 y 4796 X(128)S 177 x(from)S 177 x +(the)S 177 x(image)S 178 x(and)S 178 x(the)S 177 x(current)S 178 x +(default)S 178 x(constraint)S 177 x(model)S 177 x(is)S 177 x(a)S +177 x(hard)S 178 x(clip)S 177 x(within)S 177 x(dynamic)S 598 y 4796 X +(range,)S 180 x(the)S 177 x(resulting)S 178 x(image)S 177 x(is)S +176 x(constrained)S 177 x(and)S 177 x(has)S 177 x(half)S 176 x(its)S +176 x(pixels)S 177 x(clipped)S 177 x(to)S 176 x(value)S 178 x(0,)S +179 x(and)S 177 x(the)S 597 y 4796 X(other)S 184 x(half)S 185 x +(equally)S 185 x(distributed)S 183 x(between)S 184 x(0)S 185 x(and)S +184 x(128.)S 286 x(If)S 184 x(the)S 185 x(client)S 184 x(asks)S 184 x +(for)S 184 x(an)S 185 x(unconstrained)S 598 y 4796 X(subtraction)S +180 x(of)S 180 x(128)S 179 x(from)S 180 x(the)S 181 x(image,)S 184 x +(the)S 180 x(resulting)S 181 x(image)S 180 x(is)S 180 x +(unconstrained)S 181 x(and)S 180 x(has)S 180 x(its)S 179 x(pixels)S +598 y 4796 X(equally)S 175 x(distributed)S 174 x(between)S 174 x +(-128)S 175 x(and)S 175 x(+128.)S 266 x(After)S 175 x(generation)S +176 x(of)S 174 x(this)S 175 x(unconstrained)S 175 x(image,)S 178 x +(if)S 598 y 4796 X(the)S 175 x(client)S 176 x(asks)S 176 x(to)S 175 x +(mask)S 175 x(out)S 176 x(the)S 176 x(low)S 175 x(four)S 177 x +(bits,)S 177 x(the)S 176 x(server)S 176 x(will)S 175 x(\211rst)S +176 x(convert)S 177 x(the)S 176 x(unconstrained)S 597 y 4796 X +(image)S 166 x(to)S 166 x(a)S 166 x(constrained)S 166 x(image,)S +167 x(then)S 166 x(perform)S 167 x(the)S 166 x(mask,)S 166 x(and)S +166 x(produce)S 167 x(a)S 166 x(constrained)S 167 x(image.)S 897 y +4796 X(Particulars)S 166 x(of)S 166 x(constraint)S 166 x(functions)S +167 x(are)S 166 x(found)S 166 x(in)S 167 x(the)S 166 x(following)S +166 x(protocol)S 166 x(sections:)S 897 y 4796 X(\201)S 594 x +(session)S 165 x(services)S 747 y 5692 X(\201)S 595 x(establish)S +165 x(operational)S 166 x(defaults)S 747 y 5692 X(\201)S 595 x +(query)S 167 x(operational)S 166 x(defaults)S 747 y 4796 X(\201)S +594 x(radiometric)S 166 x(services)S 747 y 5692 X(\201)S 595 x +(apply)S 166 x(constraints)S 31964 Y 4796 X(The)S 179 x(client)S +179 x(should)S 179 x(establish)S 178 x(the)S 178 x(default)S 179 x +(constraint)S 179 x(model)S 178 x(and)S 179 x(parameters)S 179 x +(immediately)S 178 x(after)S 598 y 4796 X(sess)S -2 x(ion)S 167 x +(connection.)S 35879 Y 3600 X F40(6\2032)S 449 x(SER)S -8 x(VER)S +166 x(DA)S -34 x(T)S -34 x(A)S 166 x(MODEL)S +PP +EP +%%DOC$Page: 6-3 27 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(6.2)S 599 x(Mono)S 166 x(vs)S 167 x(Poly)S 167 x +(Chromatic)S 6838 Y 4796 X F151(While)S 175 x(it)S 175 x(may)S 176 x +(be)S 176 x(possible)S 175 x(to)S 175 x(have)S 177 x(client)S 176 x +(side)S 175 x(libraries)S 175 x(manage)S 177 x(three)S 176 x(IOB')S +-20 x(s)S 175 x(as)S 176 x(the)S 175 x(constituent)S 598 y 4796 X +(components)S 173 x(of)S 174 x(a)S 173 x(color)S 174 x(image,)S 176 x +(it)S 173 x(is)S 174 x(felt)S 173 x(that)S 173 x(this)S 173 x(is)S +173 x(too)S 174 x(minimalistic)S 172 x(a)S 174 x(view)S 173 x(of)S +174 x(XIE)S 172 x(color)S 174 x(image)S 597 y 4796 X(support)S 168 x +(and)S 169 x(that)S 169 x(some)S 169 x(color)S 169 x(IOB)S 168 x +(data)S 168 x(organ)S 2 x(izations)S 168 x(and)S 169 x(extended)S +169 x(server)S 170 x(function)S 170 x(capabilities)S 598 y 4796 X +(should)S 166 x(exist)S 166 x(for)S 166 x(color)S 166 x(image)S 167 x +(objects.)S 897 y 4796 X(Earlier)S 180 x(drafts)S 180 x(recogn)S +2 x(ized)S 180 x(multiple)S 180 x(color)S 181 x(three)S 182 x +(spaces,)S 184 x(and)S 181 x(undoubtedly)S -54 x(,)S 185 x(in)S 181 x +(the)S 181 x(future)S 181 x(these)S 598 y 4796 X(three)S 188 x +(spaces)S 187 x(\(such)S 189 x(as)S 188 x(LUV)S 187 x(and)S 189 x +(certain)S 188 x(CIE)S 187 x(spaces\))S 188 x(will)S 187 x(become)S +188 x(signi\211cant)S 189 x(to)S 188 x(the)S 188 x(image)S 597 y +4796 X(display)S 183 x(situation)S 183 x(on)S 184 x(workstations.)S +284 x(But,)S 188 x(for)S 183 x(now)S -46 x(,)S 189 x(XIE)S 182 x +(will)S 183 x(focus)S 183 x(on)S 184 x(support)S 184 x(only)S 184 x +(for)S 183 x(R-G-B)S 598 y 4796 X(images.)S 265 x(Thus,)S 177 x +(three)S 175 x(space)S 174 x(color)S 174 x(conversion)S 175 x(and)S +175 x(color)S 174 x(correction)S 175 x(problems)S 174 x(will)S 173 x +(remain)S 174 x(on)S 175 x(the)S 598 y 4796 X(client)S 166 x(side)S +165 x(of)S 166 x(the)S 166 x(wire)S 166 x(\(application)S 166 x +(level)S 166 x(or)S 167 x(toolkit)S 166 x(level)S 166 x(issues\).)S +896 y 4796 X(The)S 166 x(impact)S 166 x(upon)S 167 x(the)S 166 x +(XIE)S 165 x(protocol)S 166 x(is)S 166 x(the)S 166 x(following:)S +897 y 4796 X(\201)S 594 x(IOB')S -20 x(s)S 166 x(are)S 166 x(typed)S +166 x(regarding)S 168 x(color)S 166 x(space)S 166 x(\(mono)S 166 x +(or)S 167 x(rgb)S 166 x(only\),)S 168 x(and)S 598 y 5692 X(this)S +166 x(information)S 166 x(is)S 166 x(queryable.)S 747 y 4796 X(\201)S +594 x(For)S 167 x(rgb)S 166 x(images,)S 167 x(all)S 166 x(planes)S +165 x(are)S 167 x(constrained)S 166 x(or)S 166 x(uncon)S 2 x +(strained.)S 747 y 4796 X(\201)S 594 x(For)S 167 x(rgb)S 166 x +(images,)S 167 x(the)S 166 x(number)S 167 x(of)S 166 x(pixels-per)S +-9 x(-scanline)S 166 x(and)S 166 x(number)S -8 x(-of-scanlines)S +598 y 5692 X(must)S 166 x(be)S 166 x(identical)S 166 x(for)S 166 x +(each)S 167 x(of)S 166 x(the)S 166 x(three)S 166 x(bands.)S 747 y +4796 X(\201)S 594 x(For)S 167 x(rgb)S 166 x(images,)S 167 x(the)S +166 x(number)S 167 x(of)S 166 x(bits-per)S -10 x(-component)S 167 x +(may)S 166 x(be)S 166 x(different)S 166 x(for)S 166 x(each)S 167 x +(band.)S 747 y 4796 X(\201)S 594 x(V)S -46 x(arious)S 166 x(server)S +167 x(function)S 167 x(specify)S 166 x(their)S 166 x(operational)S +166 x(capabilities)S 165 x(for)S 167 x(mono)S 166 x(and)S 166 x(rgb)S +167 x(images.)S 748 y 4796 X(\201)S 594 x(A)S 166 x(function)S 167 x +(exists)S 165 x(for)S 166 x(the)S 167 x(separation)S 165 x(of)S 166 x +(rgb)S 167 x(into)S 166 x(three)S 167 x(mono)S 166 x(components.)S +747 y 4796 X(\201)S 594 x(A)S 166 x(function)S 167 x(exists)S 165 x +(for)S 166 x(the)S 167 x(combination)S 166 x(of)S 166 x(three)S 166 x +(mono)S 167 x(components)S 166 x(into)S 166 x(rgb.)S 20487 Y 4796 X +(Regarding)S 176 x(spectral)S 175 x(bands,)S 178 x(it)S 176 x(is)S +175 x(suggested)S 176 x(that)S 175 x(server)S 176 x(implementors)S +175 x(keep)S 176 x(spectral)S 176 x(band)S 175 x(data)S 597 y 4796 X +(separate)S 183 x(within)S 184 x(an)S 184 x(IOB.)S 183 x(As)S 183 x +(such,)S 190 x(an)S 184 x(IOB)S 183 x(for)S 184 x(a)S 183 x +(monochro)S 2 x(matic)S 183 x(image)S 184 x(\(bitonal)S 184 x(or)S +184 x(continu-)S 598 y 4796 X(ous)S 175 x(tone)S 175 x(grayscale\))S +176 x(would)S 175 x(have)S 176 x(one)S 176 x("band")S 175 x(type)S +175 x(object)S 176 x(\(1)S 175 x(or)S 175 x(n)S 176 x(bits)S 174 x +(deep\),)S 178 x(while)S 175 x(an)S 175 x(IOB)S 175 x(for)S 175 x(a)S +598 y 4796 X(polychromatic)S 169 x(\(RGB)S -2 x(\))S 168 x(image)S +169 x(would)S 168 x(have)S 169 x(three)S 168 x("band")S 168 x(type)S +169 x(objects)S 168 x(\(r)S -37 x(,)S 169 x(g,)S 170 x(and)S 169 x +(b)S 168 x(bits)S 167 x(deep)S 168 x(respec-)S 598 y 4796 X +(tively\).)S 253 x(Note)S 167 x(that)S 167 x(this)S 168 x(is)S 167 x +(only)S 168 x(a)S 167 x(suggestion,)S 170 x(and)S 167 x(not)S 168 x +(a)S 167 x(requirement.)S 254 x(Clients)S 167 x(should)S 167 x(not)S +168 x(assume)S 597 y 4796 X(or)S 166 x(infer)S 166 x(that)S 166 x +(this)S 166 x(is)S 165 x(the)S 167 x(underlying)S 168 x(image)S 166 x +(data)S 166 x(organization)S 166 x(on)S 167 x(the)S 166 x(server)S +-36 x(.)S 897 y 4796 X(In)S 183 x(the)S 184 x(future,)S 190 x(we)S +183 x(will)S 183 x(consider)S 184 x(support)S 184 x(for)S 184 x +(alternate)S 183 x(color)S 185 x(three)S 184 x(spaces.)S 284 x(This)S +184 x(support)S 184 x(will)S 598 y 4796 X(involve)S 177 x(IOB)S 175 x +(color)S 177 x(space)S 176 x(state)S 175 x(information)S 177 x +(which)S 176 x(is)S 176 x(queryable,)S 180 x(and)S 176 x(server)S +177 x(implementation)S 176 x(of)S 598 y 4796 X(three)S 166 x(space)S +166 x(color)S 166 x(transforms)S 166 x(as)S 165 x(well)S 166 x(as)S +165 x(possible)S 166 x(extensions)S 166 x(to)S 166 x(existing)S 166 x +(protocol)S 167 x(functions.)S 26962 Y 3600 X F28(6.3)S 599 x(Data)S +166 x(Flow)S 167 x(Pipelining)S 28208 Y 4796 X F151(The)S 179 x(X)S +178 x(image)S 179 x(extension)S 179 x(protocol)S 179 x(strives)S +178 x(to)S 178 x(be)S 179 x(primitive)S 179 x(yet)S 179 x +(\212exible)S 179 x(enough)S 180 x(to)S 179 x(support)S 178 x(many)S +597 y 4796 X(higher)S 157 x(level)S 156 x(image)S 156 x(rendition,)S +159 x(enhancemen)S 2 x(t,)S 158 x(and)S 156 x(display)S 156 x +(related)S 155 x(operations.)S 250 x(The)S 156 x(understanding)S +598 y 4796 X(of)S 175 x(these)S 176 x(higher)S 177 x(level)S 176 x +(operations)S 176 x(and)S 176 x(intelligence)S 176 x(in)S 176 x +(wielding)S 176 x(the)S 176 x(low)S 175 x(level)S 176 x(extension)S +177 x(protocol)S 598 y 4796 X(functions)S 183 x(to)S 183 x(achieve)S +184 x(them)S 184 x(has)S 183 x(been)S 183 x(left)S 183 x(to)S 183 x +(an)S 184 x(extension)S 184 x(tool)S 183 x(kit)S 183 x(and)S 183 x +(the)S 184 x(application)S 183 x(itself.)S 598 y 4796 X(The)S 172 x +(X)S 172 x(image)S 173 x(extension)S 173 x(does)S 172 x(offer)S 172 x +(a)S 173 x(mechanism)S 172 x(to)S 172 x(aid)S 172 x(in)S 173 x +(organizing)S 173 x(and)S 173 x(executing)S 174 x(a)S 172 x(series)S +172 x(of)S 598 y 4796 X(primitive)S 166 x(protocol)S 166 x +(functions)S 166 x(known)S 167 x(as)S 166 x(an)S 166 x(image)S 166 x +(data)S 166 x(processing)S 166 x(pipeline.)S 35879 Y 20751 X F40 +(SER)S -8 x(VER)S 166 x(DA)S -34 x(T)S -33 x(A)S 166 x(MODEL)S 448 x +(6)S +(\2033)S +PP +EP +%%DOC$Page: 6-4 28 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(Under)S 177 x(the)S 178 x(X)S 176 x(image)S 178 x +(extensions,)S 181 x(a)S 177 x(pipeline)S 177 x(is)S 177 x +(de\211ned)S 177 x(to)S 177 x(be)S 178 x(a)S 177 x(single)S 177 x +(threaded,)S 181 x(list)S 176 x(of)S 177 x(X)S 177 x(image)S 598 y +4796 X(extension)S 191 x(protocol)S 191 x(functions)S 191 x(through)S +192 x(which)S 192 x(image)S 191 x(data)S 190 x(\212ows)S 190 x +(sequentially)S -55 x(.)S 299 x(As)S 190 x(such,)S 198 x(the)S 597 y +4796 X(pipeline)S 173 x(mechanism)S 173 x(is)S 173 x(intended)S 174 x +(to)S 173 x(support)S 173 x(sequential)S 173 x(segmented)S 174 x +(\212ow)S 173 x(of)S 173 x(image)S 174 x(data)S 173 x(through)S 598 y +4796 X(multiple)S 190 x(image)S 191 x(extension)S 191 x(process)S +191 x(steps.)S 297 x(These)S 192 x(pipelines)S 190 x(are)S 191 x +(driven)S 191 x(by)S 191 x(data)S 191 x(availability)S 598 y 4796 X +(\(pipeline)S 165 x(elements)S 165 x(are)S 166 x(automatically)S +165 x(stalled)S 165 x(when)S 166 x(awaiting)S 165 x(data)S 165 x(-)S +165 x(individual)S 166 x(pipeline)S 166 x(elements)S 598 y 4796 X +(establis)S -2 x(h)S 180 x(minimal)S 179 x(required)S 180 x(data)S +179 x(availability)S 180 x(for)S 180 x(processing)S 179 x(to)S 180 x +(occur\).)S 277 x(At)S 179 x(any)S 180 x(point)S 179 x(in)S 180 x +(time,)S 597 y 4796 X(the)S 186 x(pipeline)S 187 x(may)S 186 x(be)S +187 x(partially)S 186 x(or)S 187 x(completely)S 186 x(full)S 187 x +(of)S 186 x(data)S 186 x(with)S 186 x(the)S 187 x(implication)S 186 x +(that)S 186 x(several)S 598 y 4796 X(pipeline)S 172 x(segments)S +172 x(may)S 172 x(be)S 172 x("active")S 172 x(\(able)S 172 x(to)S +172 x(process)S 172 x(or)S 172 x(processing)S 173 x(data)S 172 x +({in)S 172 x(the)S 172 x(case)S 172 x(of)S 172 x(multiple)S 598 y +4796 X(processors}\))S 165 x(at)S 166 x(the)S 166 x(same)S 165 x +(time.)S 897 y 4796 X(An)S 185 x(example)S 186 x(of)S 186 x(such)S +186 x(a)S 186 x(pipeline)S 186 x(might)S 186 x(be)S 186 x(one)S 186 x +(where)S 186 x(as)S 185 x(image)S 186 x(data)S 186 x(arrives)S 186 x +(from)S 186 x(the)S 186 x(client)S 597 y 4796 X(through)S 175 x +(transport)S 174 x(calls,)S 176 x(it)S 174 x(moves)S 175 x(through)S +175 x(various)S 175 x(rendition)S 175 x(steps)S 173 x(\(perhaps)S +174 x(scaling)S 175 x(and)S 174 x(tonal)S 598 y 4796 X(remapping\))S +167 x(to)S 167 x(display)S -55 x(.)S 251 x(Thus,)S 169 x(as)S 167 x +(image)S 167 x(data)S 167 x(arrives)S 167 x(at)S 167 x(the)S 168 x +(server)S -37 x(,)S 168 x(it)S 167 x(is)S 167 x(streamed)S 166 x(to)S +167 x(the)S 168 x(display)S -56 x(,)S 598 y 4796 X(versus)S 185 x +(waiting)S 185 x(for)S 185 x(arrival)S 186 x(of)S 185 x(the)S 185 x +(complete)S 185 x(image)S 185 x(-)S 185 x(then)S 186 x(moving)S 186 x +(it)S 185 x(completely)S 185 x(through)S 187 x(the)S 598 y 4796 X +(rendition)S 166 x(steps)S 165 x(one)S 167 x(at)S 165 x(a)S 166 x +(time)S 166 x(-)S 166 x(then)S 167 x(moving)S 167 x(it)S 165 x +(throug)S 2 x(h)S 166 x(the)S 166 x(display)S 166 x(step.)S 896 y +4796 X(There)S 168 x(are)S 168 x(several)S 168 x(signi\211cant)S +168 x(constraints)S 168 x(on)S 168 x(the)S 167 x(pipelining)S 169 x +(mechanism.)S 252 x(The)S 169 x(\211rst)S 167 x(is)S 167 x(that)S +168 x(only)S 168 x(a)S 598 y 4796 X(subset)S 171 x(of)S 173 x(the)S +172 x(extension)S 174 x(protocol)S 172 x(functions)S 173 x(may)S +173 x(be)S 172 x(used)S 173 x(as)S 172 x(pipeline)S 173 x(elements)S +172 x(\(see)S 172 x(summary)S 173 x(of)S 598 y 4796 X(protocol)S +168 x(appendix\).)S 253 x(No)S 168 x(core)S 169 x(protocol)S 168 x +(functions)S 168 x(may)S 169 x(be)S 168 x(used)S 167 x(in)S 169 x(a)S +168 x(pipeline.)S 253 x(No)S 168 x(protocol)S 168 x(function)S 598 y +4796 X(which)S 183 x(exchan)S 2 x(ges)S 183 x(information)S 184 x +(across)S 183 x(the)S 183 x(wire)S 183 x(may)S 184 x(be)S 183 x +(used)S 183 x(in)S 184 x(a)S 183 x(pipeline)S 184 x(other)S 183 x +(than)S 184 x(image)S 597 y 4796 X(data)S 183 x(wire)S 183 x +(transport)S 184 x(functions.)S 285 x(Second,)S 189 x(there)S 184 x +(are)S 184 x(no)S 184 x(pipeline)S 183 x(process)S 184 x(control)S +184 x(functions)S 184 x(\(no)S 598 y 4796 X(test)S 181 x +(mechanisms,)S 188 x(iteration)S 182 x(mechanisms,)S 187 x(or)S 183 x +(human)S 184 x(interaction)S 183 x(mechanisms)S 183 x(for)S 183 x +(use)S 182 x(within)S 598 y 4796 X(a)S 178 x(pipeline\).)S 275 x(In)S +178 x(essence,)S 182 x(pipelines)S 179 x(are)S 178 x(sealed,)S 182 x +(straight)S 179 x(through)S 180 x(processing)S 179 x(mechanisms.)S +274 x(The)S 598 y 4796 X(mechanism)S 154 x(for)S 155 x(describing)S +155 x(\(assembling\))S 154 x(pipelines)S 154 x(is)S 155 x(simplis)S +-2 x(tic)S 155 x(\(vs)S 154 x(reinven)S 2 x(ting)S 155 x(complex)S +155 x(languag)S 2 x(e)S 597 y 4796 X(interpreters\).)S 293 x(As)S +187 x(such,)S 195 x(application)S 188 x(and)S 188 x(toolkit)S 188 x +(developers)S 188 x(will)S 187 x(need)S 189 x(to)S 188 x("layout")S +188 x(or)S 188 x(design)S 598 y 4796 X(pipelines)S 168 x(on)S 169 x +(paper)S 169 x(before)S 169 x(hand)S 169 x(working)S 170 x(out)S +169 x(all)S 168 x(parameter)S 169 x(binding)S 169 x(issues)S 168 x +(and)S 169 x(then)S 170 x(hand)S 169 x(build)S 598 y 4796 X(the)S +164 x(calls)S 164 x(to)S 164 x(construct)S 165 x(the)S 164 x +(pipelines.)S 249 x(Note)S 165 x(also)S 163 x(that)S 165 x(no)S 164 x +(pipeline)S 165 x("registry")S 164 x(mechanism)S 165 x(exists)S 163 x +(and)S 598 y 4796 X(so)S 165 x(pipeline)S 166 x(de\211nitions)S 167 x +(exist)S 166 x(only)S 167 x(within)S 165 x(the)S 167 x(bounds)S 166 x +(of)S 166 x(an)S 166 x(extension)S 167 x(session.)S 896 y 4796 X +(Regarding)S 172 x(the)S 172 x(execu)S 2 x(tion)S 172 x(of)S 171 x +(pipeline)S 172 x(processing)S 173 x(elements,)S 173 x(server)S 173 x +(implementors)S 171 x(are)S 172 x(free)S 172 x(to)S 172 x(use)S 598 y +4796 X(special)S 175 x(accelerators)S 175 x(and)S 176 x(parallel)S +176 x(processing)S 176 x(to)S 175 x(execute)S 177 x(pipeline)S 175 x +(elements)S 176 x(\(just)S 175 x(as)S 175 x(they)S 177 x(are)S 175 x +(to)S 598 y 4796 X(accelerate)S 170 x(an)S 171 x(extension)S 171 x +(protocol)S 171 x(function)S 172 x(outside)S 170 x(of)S 170 x(a)S +171 x(pipeline\).)S 258 x(The)S 171 x(pipeline)S 171 x(mechanism)S +171 x(does)S 598 y 4796 X(not)S 166 x(provide)S 166 x(any)S 167 x +(control)S 167 x(over)S 167 x(or)S 166 x(understanding)S 167 x(of)S +166 x(these)S 166 x(situations.)S 896 y 4796 X(X)S 170 x(image)S +172 x(extensions)S 171 x(will)S 170 x(provide)S 172 x(for)S 171 x +(de\211nition,)S 174 x(execution,)S 174 x(and)S 171 x(monitoring)S +172 x(of)S 171 x(segmented)S 171 x(image)S 598 y 4796 X(data)S 165 x +(processing)S 167 x(pipelines)S 165 x(on)S 167 x(the)S 166 x(server)S +167 x(\(see)S 165 x(resource)S 167 x(and)S 166 x(process)S 166 x +(control)S 167 x(services\).)S 35879 Y 3600 X F40(6\2034)S 449 x +(SER)S -8 x(VER)S 166 x(DA)S -34 x(T)S -34 x(A)S 166 x(MODEL)S +PP +EP +%%DOC$Page: 7-1 29 +1000 BP 39600 30600 PM 0 0 XY +9007 Y 3600 X F24(Chapter)S 498 x(7)S 10651 Y 3600 X(REQUESTS)S 165 x +(AND)S 165 x(REPLIES)S 13378 Y 4796 X F151(This)S 189 x(section)S +189 x(constitutes)S 189 x(the)S 189 x(body)S 190 x(of)S 189 x(the)S +189 x(image)S 190 x(extension)S 190 x(protocol.)S 296 x(It)S 188 x +(consists)S 189 x(of)S 189 x(protocol)S 598 y 4796 X(functions)S +174 x(which)S 175 x(are)S 174 x(described)S 174 x(in)S 175 x(a)S +174 x(uniform)S 175 x(fashion)S 174 x(\(refer)S 175 x(to)S 174 x +(syntax)S 175 x(subsection\).)S 265 x(All)S 174 x(X)S 174 x(image)S +598 y 4796 X(extension)S 166 x(protocol)S 166 x(function)S 167 x +(names)S 166 x(begin)S 167 x(with)S 166 x(the)S 166 x(pre\211x)S +167 x(XIEP_.)S 896 y 4796 X(Note)S 177 x(that)S 178 x(like)S 178 x +(the)S 178 x(core)S 178 x(protocol,)S 182 x(all)S 177 x(image)S 178 x +(extension)S 179 x(protocol)S 178 x(functions)S 178 x(are)S 178 x +(asynchro)S 2 x(nous)S 178 x(in)S 598 y 4796 X(nature.)S 281 x +(Clients)S 180 x(requiring)S 183 x(synchr)S 2 x(onous)S 182 x +(behavior)S 182 x(should)S 182 x(use)S 181 x(the)S 182 x(core)S 182 x +(protocol')S -19 x(s)S 182 x(approach)S 182 x(to)S 598 y 4796 X +(achieving)S 167 x(synchro)S 2 x(nous)S 166 x(behavior)S -36 x(.)S +897 y 4796 X(Extension)S 178 x(protocol)S 178 x(requests)S 177 x +(follow)S 177 x(the)S 178 x(byte)S 178 x(ordering)S 179 x +(established)S 177 x(at)S 178 x(core)S 178 x(protocol)S 178 x +(connection)S 597 y 4796 X(time)S 177 x(with)S 177 x(regard)S 178 x +(to)S 177 x(all)S 178 x(16)S 177 x(and)S 178 x(32)S 177 x(bit)S 177 x +(quantities.)S 273 x(They)S 178 x(also)S 177 x(comply)S 178 x(with)S +177 x(maximum-request-)S 598 y 4796 X(length)S 167 x(as)S 165 x +(speci\211ed)S 166 x(in)S 167 x(the)S 166 x(core)S 166 x(protocol)S +166 x(connec)S 2 x(tion.)S 35879 Y 20029 X F40(REQUESTS)S 165 x(AND)S +165 x(REPLIES)S 448 x(7\2031)S +PP +EP +%%DOC$Page: 7-2 30 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(7.1)S 599 x(Session)S 167 x(Services)S 6838 Y +4796 X F151(Image)S 180 x(extension)S 181 x(sessions)S 180 x(occur)S +181 x(within)S 180 x(the)S 181 x(bounds)S 181 x(of)S 180 x(core)S +181 x(protocol)S 181 x(sessions.)S 277 x(The)S 181 x(image)S 181 x +(ex-)S 598 y 4796 X(tension)S 181 x(protocol)S 181 x(provides)S 182 x +(per)S 181 x(client)S 182 x(extension)S 182 x(server)S 182 x(sessi)S +-2 x(on)S 182 x(initialization)S 181 x(and)S 181 x(termination)S +597 y 4796 X(functions.)S 260 x(These)S 172 x(allow)S 171 x(the)S +171 x(client)S 172 x(to)S 171 x(initialize)S 171 x(global)S 172 x +(extension)S 172 x(session)S 171 x(server)S 172 x(information)S 171 x +(and)S 598 y 4796 X(allow)S 165 x(the)S 166 x(extension)S 167 x +(server)S 167 x(to)S 165 x(clean)S 167 x(up)S 166 x(on)S 167 x +(session)S 165 x(termination.)S 250 x(The)S 166 x(session)S 166 x +(services)S 166 x(include:)S 897 y 4796 X(\201)S 594 x +(XIEP_INIT_SESS)S -2 x(ION)S 166 x(-)S 166 x(begins)S 166 x(a)S 166 x +(client-extension)S 167 x(server)S 167 x(sessi)S -2 x(on)S 747 y +4796 X(\201)S 594 x(XIEP_SET_DEF)S -38 x(AUL)S -28 x(TS)S 167 x(-)S +165 x(establish/modify)S 166 x(operational)S 166 x(defaults)S 747 y +4796 X(\201)S 594 x(XIEP_QUER)S -20 x(Y_DEF)S -38 x(AUL)S -27 x(TS)S +166 x(-)S 166 x(query)S 167 x(operational)S 166 x(defaults)S 747 y +4796 X(\201)S 594 x(XIEP_TERM_SESSI)S -2 x(ON)S 166 x(-)S 166 x +(ends)S 166 x(a)S 166 x(client-extension)S 167 x(server)S 166 x +(session)S 13264 Y 3600 X F28(7.1.1)S 599 x(Initial)S 2 x(ize)S 166 x +(Session)S 14509 Y 4796 X F102(XIEP_INIT_SESSION)S 747 y 6708 X +(protocol_maj)S 2 x(or_version:)S 14360 X(CARD16)S 449 y 6708 X +(protocol_min)S 2 x(or_version:)S 14360 X(CARD16)S 747 y 5991 X(=>)S +747 y 239 x(success:)S 14360 X(BOOL)S 448 y 6708 X(protocol_maj)S +2 x(or_version:)S 14360 X(CARD16)S 449 y 6708 X(protocol_min)S 2 x +(or_version:)S 14360 X(CARD16)S 448 y 6708 X(service_clas)S 2 x(s:)S +717 x(CARD32)S 448 y 6708 X(supported_fu)S 2 x(nctions:)S 14360 X +(XIT_FUNCTION_VECTO)S 2 x(R)S 449 y 6708 X(length:)S 14360 X(CARD16)S +747 y 5991 X(service)S 240 x(class)S 239 x(value:)S 12447 X(0)S 448 y +5991 X(errors:)S 12447 X(none)S 448 y 5991 X(events:)S 12447 X(none)S +897 y 4796 X F151(XIEP_INI)S -2 x(T_SESSION)S 163 x(must)S 164 x(be)S +164 x(invok)S 2 x(ed)S 164 x(by)S 165 x(a)S 164 x(client)S 164 x(as)S +164 x(its)S 164 x(\211rst)S 164 x(image)S 164 x(extension)S 165 x +(protocol)S 165 x(request)S 598 y 4796 X(as)S 170 x(it)S 170 x +(causes)S 171 x(the)S 171 x(server)S 171 x(to)S 170 x(perform)S 171 x +(initialization)S 170 x(on)S 171 x(a)S 171 x(per)S 171 x(client)S +171 x(basis.)S 258 x(In)S 170 x(addition,)S 173 x(as)S 170 x(with)S +170 x(the)S 598 y 4796 X(core)S 166 x(protocol)S 166 x(connect)S +167 x(request,)S 167 x(the)S 166 x(function)S 167 x(returns)S 166 x +(information)S 167 x(which)S 166 x(is)S 166 x(useful)S 166 x(to)S +166 x(the)S 166 x(client.)S 896 y 4796 X(Success)S 176 x(is)S 176 x +(simply)S 176 x(a)S 176 x(statement)S 175 x(of)S 177 x(relationship)S +176 x(between)S 176 x(the)S 177 x(server)S 28 x(')S -19 x(s)S 176 x +(protocol)S 176 x(version,)S 180 x(and)S 177 x(the)S 598 y 4796 X +(client)S 168 x(request.)S 255 x(TRUE)S 168 x(implies)S 168 x(that)S +168 x(the)S 169 x(server)S 28 x(')S -19 x(s)S 168 x(protocol)S 169 x +(version)S 169 x(is)S 168 x(greater)S 169 x(than)S 169 x(or)S 169 x +(equal)S 169 x(to)S 168 x(the)S 598 y 4796 X(client')S -19 x(s)S +166 x(request)S 166 x(and)S 166 x(that)S 166 x(service)S 166 x(will)S +166 x(be)S 166 x(granted.)S 250 x(F)S -37 x(ALSE)S 166 x(implies)S +165 x(the)S 166 x(opposite.)S 896 y 4796 X(Protocol)S 170 x(version)S +170 x(numbers)S 170 x(in)S 170 x(the)S 170 x(image)S 171 x +(extension)S 170 x(connection)S 171 x(request)S 170 x(refer)S 170 x +(to)S 170 x(the)S 170 x(image)S 170 x(exten-)S 598 y 4796 X(sion)S +175 x(protocol.)S 269 x(They)S 177 x(follow)S 175 x(the)S 176 x +(core)S 176 x(protocol)S 176 x(rules:)S 269 x(major)S 176 x(version)S +177 x(changes)S 177 x(for)S 175 x(incompatibility)S 598 y 4796 X +(reasons;)S 166 x(minor)S 166 x(version)S 167 x(changes)S 167 x(for)S +166 x(small,)S 166 x(upward)S 166 x(compatible)S 166 x +(modi\211cations.)S 897 y 4796 X(Service_class)S 165 x(is)S 166 x(a)S +166 x(mechanism)S 165 x(for)S 166 x(communicating)S 167 x(the)S 166 x +(level)S 167 x(of)S 165 x(service)S 167 x(provided)S 166 x(by)S 166 x +(the)S 166 x(particular)S 597 y 4796 X(server)S -37 x(.)S 263 x(See)S +172 x(the)S 173 x(concepts)S 172 x(document)S 173 x(for)S 173 x(an)S +172 x(overv)S 2 x(iew)S 172 x(of)S 172 x(service)S 173 x(class)S +172 x(partitioning)S 173 x(of)S 172 x(XIE)S 171 x(server)S 598 y +4796 X(capabilities.)S 897 y 4796 X(Supported_functions)S 173 x(is)S +173 x(a)S 173 x(mechanism)S 174 x(for)S 173 x(communicating)S 175 x +(exactly)S 174 x(which)S 173 x(protocol)S 174 x(functions)S 173 x +(the)S 597 y 4796 X(server)S 177 x(recognizes/supports.)S 272 x(A)S +177 x(value)S 177 x(of)S 177 x(1)S 177 x(for)S 177 x(a)S 177 x(bit)S +177 x(in)S 177 x(the)S 177 x(XIE_FUNCTION_VE)S -2 x(CTOR)S 176 x +(implies)S 598 y 4796 X(that)S 178 x(the)S 180 x(protocol)S 179 x +(function)S 180 x(is)S 178 x(recogn)S 2 x(ized)S 178 x(and)S 179 x +(supported)S 179 x(by)S 180 x(the)S 179 x(server)S -36 x(.)S 275 x +(Specialized)S 178 x(hardware)S 598 y 4796 X(support)S 175 x(is)S +176 x(not)S 176 x(implied)S 175 x(as)S 176 x(this)S 176 x(is)S 175 x +(communicated)S 176 x(elsewhere.)S 270 x(While)S 175 x(the)S 177 x +(mechanism)S 176 x(allows)S 175 x(the)S 598 y 4796 X(server)S 167 x +(to)S 168 x(describe)S 167 x(support)S 167 x(at)S 167 x(the)S 168 x +(individual)S 168 x(protocol)S 167 x(function)S 169 x(level)S 167 x +(of)S 168 x(granularity)S -54 x(,)S 168 x(it)S 167 x(is)S 167 x +(strongly)S 597 y 4796 X(recommended)S 166 x(that)S 166 x(servers)S +166 x(implement)S 166 x(all)S 166 x(functions)S 166 x(in)S 167 x(a)S +166 x(service)S 166 x(class)S 165 x(\(see)S 166 x(concepts)S 166 x +(document\).)S 35879 Y 3600 X F40(7\2032)S 449 x(REQUESTS)S 165 x +(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-3 31 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(Length)S 181 x(is)S 179 x(the)S 181 x(amount)S +180 x(of)S 180 x(additional)S 180 x(data)S 179 x(which)S 181 x +(follows)S 179 x(in)S 180 x(units)S 180 x(of)S 180 x(4)S 180 x +(bytes.)S 278 x(Additional)S 179 x(data)S 598 y 4796 X(received)S +166 x(if)S 166 x(connection)S 168 x(accepted)S 166 x(includes...)S +6908 Y 6708 X F102(server_hardw)S 2 x(are:)S 12925 X(HARDWARE)S 748 y +4796 X(where:)S 8702 Y -239 x(HARDWARE:)S 240 x({)S 448 y 478 x +(accelerator)S 2 x(s:)S 16751 X(XIT_ACCELERATOR_VE)S 2 x(CTOR)S 448 y +9099 X(screens:)S 16751 X(LIST_of_SCREEN)S 449 y 8621 X(})S 11093 Y +5991 X(SCREEN:)S 8621 X({)S 448 y 239 x(screen_numb)S 2 x(er:)S +16751 X(CARD8)S 448 y 9099 X(accelerator)S 2 x(s:)S 16751 X +(XIT_ACCELERATOR_VE)S 2 x(CTOR)S 449 y 8621 X(})S 13932 Y 3600 X F36 +(7.1.1.1)S 599 x(Per)S 166 x(Server)S 166 x(information)S 897 y +4796 X F151(Server)S 166 x(information)S 166 x(includes)S 166 x(a)S +166 x(description)S 165 x(of)S 166 x(the)S 166 x(particular)S 166 x +(server)S 166 x(hardware)S 166 x(image)S 166 x(capabilities,)S 597 y +4796 X(and)S 182 x(a)S 181 x(list)S 181 x(of)S 182 x(descriptions)S +182 x(of)S 181 x(the)S 182 x(various)S 183 x(display)S 182 x +(screens)S 181 x(image)S 183 x(capabilities.)S 280 x(No)S 182 x +(core)S 182 x(server)S 598 y 4796 X(sess)S -2 x(ion)S 183 x +(redundan)S 2 x(t)S 182 x(information)S 183 x(is)S 182 x(included.)S +283 x(Therefore,)S 189 x(a)S 182 x(complete)S 182 x(picture)S 183 x +(of)S 183 x(the)S 183 x(hardware)S 598 y 4796 X(and)S 176 x +(screen\(s\))S 177 x(derives)S 176 x(from)S 177 x(the)S 177 x(union)S +177 x(of)S 177 x(core)S 177 x(server)S 177 x(and)S 176 x(extension)S +178 x(server)S 177 x(connection)S 178 x(request)S 598 y 4796 X +(responses.)S 896 y 4796 X(Accelerators)S 175 x(provides)S 176 x +(the)S 176 x(client)S 176 x(information)S 176 x(about)S 176 x(which)S +176 x(image)S 176 x(extension)S 176 x(protocol)S 176 x(functions)S +598 y 4796 X(have)S 188 x(hardware)S 188 x(acceleration)S 189 x +(available)S 188 x(across)S 187 x(all)S 188 x(screens.)S 293 x(This)S +188 x(information)S 188 x(is)S 188 x(provided)S 188 x(to)S 598 y +4796 X(guide)S 171 x(imaging)S 173 x(applications)S 170 x(with)S +171 x(regards)S 172 x(to)S 170 x(what)S 171 x(they)S 172 x(might)S +172 x(reasonably)S 171 x(expect)S 172 x(from)S 171 x(a)S 171 x +(server)S -36 x(.)S 598 y 4796 X(Accelerator)S 168 x(information)S +168 x(is)S 168 x(formatted)S 167 x(as)S 168 x(a)S 168 x(support)S +168 x(vector)S -36 x(.)S 253 x(In)S 168 x(particular)S -36 x(,)S +169 x(there)S 168 x(is)S 168 x(a)S 168 x(bit)S 168 x(for)S 168 x +(every)S 597 y 4796 X(protocol)S 169 x(function)S 169 x(whose)S 169 x +(value)S 169 x(indicates)S 169 x(the)S 169 x(state)S 168 x(of)S 169 x +(hardware)S 169 x(support)S 169 x(for)S 169 x(that)S 168 x(function)S +170 x(on)S 169 x(the)S 598 y 4796 X(server)S -37 x(.)S 257 x(A)S +169 x('0')S 169 x(implies)S 169 x(no)S 170 x(direct)S 169 x +(hardware)S 170 x(acceleration)S 170 x(\(ie.)S 256 x(the)S 170 x +(protocol)S 170 x(function)S 170 x(is)S 169 x(implemented)S 598 y +4796 X(through)S 171 x(software)S 169 x(on)S 171 x(the)S 170 x +(server)S 171 x(host)S 169 x(processor\),)S 172 x(while)S 170 x(a)S +170 x('1')S 169 x(implies)S 169 x(speci\211c)S 170 x(accelerator)S +171 x(support)S 598 y 4796 X(\(ie.)S 249 x(a)S 166 x(processor)S +166 x(other)S 166 x(than)S 167 x(the)S 166 x(server)S 167 x(host)S +165 x(processor)S 166 x(is)S 166 x(used)S 166 x(to)S 166 x +(accelerate)S 166 x(the)S 166 x(function\).)S 23795 Y 3600 X F36 +(7.1.1.2)S 599 x(Per)S 166 x(Screen)S 166 x(Informatio)S 2 x(n)S +897 y 4796 X F151(The)S 175 x(screens)S 175 x(section)S 174 x(of)S +175 x(the)S 175 x(reply)S 175 x(addresses)S 174 x(screen)S 175 x +(speci\211c)S 175 x(imaging)S 176 x(hardware)S 175 x(,)S 177 x +(screen)S 175 x(speci\211c)S 597 y 4796 X(accelerators,)S 166 x(and)S +166 x(display)S 166 x(controls.)S 897 y 4796 X(Screen)S 172 x +(number)S 173 x(is)S 172 x(the)S 173 x(number)S 173 x(by)S 172 x +(which)S 173 x(client)S 172 x(rendition)S 173 x(requests)S 172 x +(identify)S 172 x(the)S 173 x(screen)S 173 x(they)S 172 x(are)S 598 y +4796 X(to)S 165 x(affect.)S 896 y 4796 X(Accelerators)S 175 x +(provides)S 176 x(the)S 176 x(client)S 176 x(information)S 176 x +(about)S 176 x(which)S 176 x(image)S 176 x(extension)S 176 x +(protocol)S 176 x(functions)S 598 y 4796 X(have)S 172 x(hardware)S +171 x(acceleration)S 172 x(available)S 172 x(on)S 171 x(this)S 171 x +(screen.)S 261 x(The)S 172 x(format)S 171 x(is)S 171 x(identical)S +171 x(to)S 171 x(the)S 172 x(hardware)S 598 y 4796 X(accelerators)S +166 x(\211eld.)S 30370 Y 3600 X F36(7.1.1.3)S 599 x(Relationshi)S +2 x(p)S 166 x(to)S 167 x(Core)S 165 x(Session)S 168 x(Information)S +897 y 4796 X F151(At)S 166 x(the)S 167 x(time)S 167 x(of)S 167 x +(initial)S 167 x(connection)S 168 x(to)S 167 x(the)S 167 x(core)S +168 x(X)S 167 x(server)S -37 x(,)S 168 x(the)S 168 x(client)S 167 x +(receives)S 167 x(information)S 168 x(back)S 167 x(from)S 598 y +4796 X(the)S 182 x(core)S 182 x(X)S 182 x(server)S -37 x(.)S 282 x +(This)S 182 x(includes)S 182 x(connection)S 183 x(and)S 183 x("per)S +181 x(server")S 183 x(information.)S 281 x(The)S 183 x(availability)S +598 y 4796 X(of)S 174 x(this)S 174 x(information)S 174 x(to)S 174 x +(the)S 175 x(client)S 174 x(precedes)S 175 x(the)S 174 x +(availability)S 175 x(of)S 174 x(X)S 174 x(Image)S 174 x(Extension)S +175 x(initialization)S 597 y 4796 X(information)S 166 x(as)S 165 x +(the)S 167 x(core)S 166 x(X)S 166 x(connection)S 167 x(precedes)S +166 x(the)S 167 x(X)S 165 x(Image)S 166 x(Extension)S 167 x +(initialization.)S 35879 Y 20029 X F40(REQUESTS)S 165 x(AND)S 165 x +(REPLIES)S 448 x(7\2033)S +PP +EP +%%DOC$Page: 7-4 32 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(The)S 152 x(connection)S 153 x(information)S 152 x +(used)S 151 x(by)S 152 x(a)S 152 x(client)S 152 x(of)S 151 x(the)S +152 x(X)S 152 x(Image)S 151 x(Extension)S 152 x(consists)S 151 x(of)S +152 x(a)S 151 x(combination)S 598 y 4796 X(of)S 175 x(information)S +175 x(which)S 176 x(comes)S 175 x(from)S 176 x(the)S 175 x(core)S +176 x(connection)S 176 x(and)S 176 x(the)S 176 x(image)S 175 x +(extension)S 176 x(initialization.)S 597 y 4796 X(Some)S 170 x(core)S +172 x(connection)S 172 x(information)S 171 x(is)S 170 x(applicable)S +171 x(to)S 171 x(the)S 171 x(image)S 171 x(extension)S 172 x +(session.)S 258 x(This)S 171 x(informa-)S 598 y 4796 X(tion)S 166 x +(is)S 165 x(not)S 167 x(replicated)S 166 x(at)S 165 x(image)S 167 x +(extension)S 167 x(initialization)S 165 x(time.)S 249 x(Other)S 166 x +(core)S 167 x(connection)S 167 x(information)S 598 y 4796 X(is)S +180 x(not)S 180 x(applicable)S 180 x(to)S 181 x(the)S 180 x(image)S +181 x(extension)S 181 x(model,)S 184 x(and)S 181 x(is)S 180 x +(superseded)S 180 x(by)S 181 x(information)S 181 x(provided)S 598 y +4796 X(at)S 174 x(image)S 176 x(extension)S 175 x(initialization)S +175 x(time.)S 267 x(Finally)S -55 x(,)S 178 x(there)S 175 x(is)S +175 x(image)S 175 x(extension)S 176 x(speci\211c)S 175 x +(information)S 597 y 4796 X(which)S 166 x(was)S 165 x(not)S 166 x +(found)S 167 x(in)S 166 x(the)S 166 x(core)S 167 x(connection)S 167 x +(information.)S 897 y 4796 X(The)S 175 x(table)S 174 x(below)S 174 x +(summarizes)S 174 x(the)S 175 x(core)S 175 x(connection)S 176 x +(information)S 175 x(and)S 175 x(its)S 174 x(usefulness)S 175 x(in)S +175 x(an)S 175 x(image)S 598 y 4796 X(extension)S 166 x(session.)S +11392 Y 5752 X F102(core)S 239 x(information)S 241 x(name)S 13881 X +(meaningful)S 19381 X(type)S 448 y 5752 X(----------------)S 2 x +(-----)S 13881 X(----------)S 19381 X(----)S 747 y 5752 X(.)S 239 x +(success)S 14599 X(no)S 448 y 5752 X(.)S 239 x(protocol-major)S 2 x +(-version)S 14599 X(no)S 449 y 5752 X(.)S 239 x(protocol-minor)S +2 x(-version)S 14599 X(no)S 747 y 5752 X(.)S 239 x(vendor)S 14599 X +(yes)S 18424 X(STRING8)S 448 y 5752 X(.)S 239 x(release-number)S +10534 X(yes)S 718 x(CARD32)S 449 y 5752 X(.)S 239 x(release-number)S +14599 X(no)S 448 y 5752 X(.)S 239 x(resource-id-ba)S 2 x(se)S 14599 X +(yes)S 18424 X(CARD32)S 448 y 5752 X(.)S 239 x(resource-id-ma)S 2 x +(sk)S 14599 X(yes)S 18424 X(CARD32)S 448 y 5752 X(.)S 239 x +(bitmap-format-)S 2 x(scanline-unit)S 14599 X(yes)S 18424 X +({8,16,32})S 449 y 5752 X(.)S 239 x(bitmap-format-)S 2 x +(scanline-pad)S 14599 X(yes)S 18424 X({8,16,32})S 448 y 5752 X(.)S +239 x(bitmap-format-)S 2 x(bit-order)S 14599 X(yes)S 18424 X +({LSBfirst,M)S 2 x(SBfirst})S 448 y 5752 X(.)S 239 x(pixmap-formats)S +14599 X(yes)S 18424 X({ListofForm)S 2 x(at})S 449 y 5752 X(.)S 239 x +(roots)S 14599 X(yes)S 18424 X({ListofScre)S 2 x(en})S 448 y 5752 X +(.)S 239 x(keyboard)S 14599 X(no)S 448 y 5752 X(.)S 239 x(pointer)S +14599 X(no)S 449 y 5752 X(.)S 239 x(motion-buffer-)S 2 x(size)S +14599 X(no)S 448 y 5752 X(.)S 239 x(maximum-reques)S 2 x(t-length)S +14599 X(yes)S 897 y 4796 X F151(W)S -19 x(ithin)S 174 x(roots,)S +176 x(useful)S 174 x(\(applicable\))S 173 x(information)S 174 x +(includes:)S 266 x(root,)S 176 x(width)S 173 x(and)S 174 x(heigh)S +2 x(t,)S 176 x(default_color_)S 597 y 4796 X(map,)S 155 x +(white_pixel,)S 155 x(black_pixel,)S 157 x(min_installed_maps,)S +154 x(max_installed_maps.)S 249 x(All)S 152 x(other)S 152 x +(information)S 598 y 4796 X(is)S 165 x(not)S 166 x(applicable.)S +23646 Y 3600 X F28(7.1.2)S 599 x(Set)S 166 x(Operation)S 2 x(al)S +166 x(Defaults)S 24891 Y 4796 X F102(XIEP_SET_DEFAULTS)S 747 y 6708 X +(constraint)S 10295 X(-)S 239 x(see)S 240 x(below)S 239 x(-)S 747 y +5991 X(=>)S 748 y 239 x(none)S 747 y 5991 X(service)S 240 x(class)S +239 x(value:)S 12447 X(0)S 448 y 5991 X(errors:)S 12447 X(VALUE)S +448 y 5991 X(events:)S 12447 X(none)S 29822 Y 4796 X(where:)S 748 y +-239 x(constraint)S 240 x(includes:)S 747 y 6708 X([)S 448 y +(constraint_)S 2 x(model)S 12447 X(CARD8)S 448 y 6947 X(bits_pel_co)S +2 x(mponent)S 12447 X(LISTofCARD8)S 449 y 6708 X(])S 35879 Y 3600 X +F40(7\2034)S 449 x(REQUESTS)S 165 x(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-5 33 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(XIEP_SE)S -2 x(T_DEF)S -37 x(AUL)S -27 x(TS)S +176 x(is)S 176 x(used)S 176 x(to)S 176 x(modify)S 176 x(operational)S +177 x(defaults)S 176 x(used)S 176 x(by)S 176 x(the)S 177 x +(extension)S 177 x(server)S -36 x(.)S 598 y 4796 X(Operational)S +169 x(defaults)S 169 x(involve)S 171 x(information)S 170 x(which)S +170 x(controls)S 169 x(the)S 170 x(operation)S 170 x(of)S 170 x(the)S +170 x(extension)S 170 x(server)S -36 x(,)S 597 y 4796 X(is)S 183 x +(knowable/modi)S +(\211able)S 184 x(by)S 184 x(the)S 184 x(client,)S 189 x(and)S 183 x +(is)S 184 x(not)S 183 x(embodied)S 184 x(in)S 184 x(a)S 183 x +(server)S 185 x(resource.)S 285 x(It)S 183 x(may)S 184 x(be)S 598 y +4796 X(invoked)S 167 x(at)S 166 x(any)S 166 x(time)S 166 x(to)S 166 x +(change)S 167 x(the)S 167 x(operational)S 166 x(defaults.)S 897 y +4796 X(Constraint)S 170 x(defaults)S 171 x(involve)S 172 x +(information)S 172 x(used)S 171 x(by)S 171 x(the)S 172 x(server)S +171 x(in)S 172 x(converting)S 173 x(image)S 171 x(data)S 171 x +(between)S 598 y 4796 X(unconstrained)S 174 x(and)S 174 x +(constrained)S 175 x(states)S -2 x(.)S 265 x(The)S 175 x +(information)S 174 x(includes)S 174 x(the)S 174 x(constraint_model)S +174 x(which)S 597 y 4796 X(de\211nes)S 182 x(how)S 182 x(image)S +182 x(data)S 182 x(is)S 181 x(constrained)S 183 x(and)S 182 x +(bits_pel_component)S 182 x(\(bits)S 181 x(per)S 182 x(pixel)S 182 x +(per)S 183 x(spectral)S 598 y 4796 X(component\))S 173 x(which)S +174 x(determines)S 173 x(the)S 174 x(number)S 174 x(of)S 173 x +(quantization)S 174 x(levels)S 173 x(of)S 174 x(the)S 173 x +(resulting)S 174 x(constrained)S 598 y 4796 X(data.)S 896 y 4796 X +(The)S 154 x(terms)S 153 x(\212oor)S 154 x(and)S 154 x(ceiling)S +154 x(will)S 153 x(be)S 153 x(used)S 154 x(to)S 153 x(described)S +154 x(each)S 154 x(of)S 153 x(the)S 154 x(constraint)S 154 x +(models.)S 249 x(Floor)S 154 x(refers)S 598 y 4796 X(to)S 155 x(the)S +156 x(smallest)S 155 x(positive)S 156 x(integral)S 156 x(value)S +157 x(\(base\))S 155 x(allowed)S 155 x(after)S 156 x(constraining)S +157 x(the)S 156 x(data)S 156 x(-)S 155 x(for)S 156 x(XIE,)S 156 x +(\212oor)S 598 y 4796 X(is)S 167 x(\211xed)S 168 x(at)S 167 x(0)S +168 x(\(zero\).)S 252 x(Ceiling)S 168 x(is)S 167 x(the)S 168 x +(largest)S 167 x(positive)S 168 x(integral)S 168 x(value)S 168 x +(allowed)S 167 x(after)S 167 x(constraining)S 169 x(the)S 598 y +4796 X(data)S 175 x(-)S 176 x(for)S 176 x(XIE)S 174 x(it)S 176 x(is)S +175 x(set)S 175 x(to)S 176 x(\(\(2**n\))S 176 x(-)S 176 x(1\))S 175 x +(where)S 176 x(n)S 176 x(is)S 176 x(the)S 176 x(number)S 176 x(of)S +176 x(bits)S 175 x(per)S 176 x(pixel)S 176 x(per)S 176 x(component)S +597 y 4796 X(\(ie.)S 276 x(ceiling)S 181 x(is)S 179 x(an)S 180 x +(integral)S 181 x(power)S 179 x(of)S 180 x(two,)S 183 x(and)S 180 x +(may)S 180 x(be)S 180 x(different)S 180 x(for)S 180 x(each)S 180 x +(spectral)S 180 x(component\).)S 598 y 4796 X(Constraint)S 165 x +(models)S 166 x(include:)S 897 y 4796 X(1.)S 481 x(HARD)S 165 x +(CLIP)S 598 y 5692 X(The)S 167 x(data)S 166 x(is)S 165 x(\211rst)S +166 x(clipped)S 166 x(such)S 166 x(that)S 166 x(all)S 166 x(values)S +167 x(below)S 165 x(the)S 166 x(\212oor)S 167 x(\(negative\))S 597 y +5692 X(are)S 166 x(set)S 166 x(to)S 166 x(the)S 166 x(\212oor)S 167 x +(value,)S 167 x(and)S 166 x(all)S 166 x(values)S 166 x(greater)S +167 x(than)S 167 x(the)S 166 x(ceiling)S 598 y 5692 X(are)S 166 x +(set)S 166 x(to)S 166 x(the)S 166 x(ceiling)S 167 x(value.)S 250 x +(Then,)S 168 x(all)S 166 x(values)S 166 x(are)S 166 x(mapped)S 166 x +(to)S 166 x(the)S 598 y 5692 X(nearest)S 166 x(integer)S 167 x +(within)S 166 x(the)S 166 x(\212oor)S -8 x(-ceiling)S 167 x(range)S +167 x(by)S 166 x(rounding)S 2 x(.)S 747 y 4796 X(2.)S 481 x(CLIP)S +166 x(SCALE)S 598 y 5692 X(The)S 167 x(data)S 166 x(is)S 165 x +(\211rst)S 166 x(clipped)S 166 x(such)S 166 x(that)S 166 x(all)S +166 x(values)S 167 x(below)S 165 x(the)S 166 x(\212oor)S 167 x +(\(negative\))S 598 y 5692 X(are)S 166 x(set)S 166 x(to)S 166 x(the)S +166 x(\212oor)S 167 x(value,)S 167 x(and)S 166 x(all)S 166 x(values)S +166 x(greater)S 167 x(than)S 167 x(the)S 166 x(ceiling)S 597 y 5692 X +(are)S 166 x(set)S 166 x(to)S 166 x(the)S 166 x(ceiling)S 167 x +(value.)S 250 x(Then,)S 168 x(all)S 166 x(values)S 166 x(are)S 166 x +(scaled)S 598 y 5692 X(to)S 166 x(\211t)S 166 x(within)S 166 x(the)S +166 x(ceiling-\212oor)S 168 x(range)S 167 x(\(make)S 166 x(maximum)S +166 x(use)S 166 x(of)S 166 x(the)S 598 y 5692 X(available)S 166 x +(dynamic)S 167 x(range.)S 251 x(Finally)S -55 x(,)S 167 x(all)S 165 x +(values)S 167 x(are)S 166 x(mapped)S 166 x(to)S 166 x(the)S 598 y +5692 X(nearest)S 166 x(integer)S 167 x(within)S 166 x(the)S 166 x +(\212oor)S -8 x(-ceiling)S 167 x(range)S 167 x(by)S 166 x(rounding)S +2 x(.)S 747 y 4796 X(3.)S 481 x(HARD)S 165 x(SCALE)S 598 y 5692 X +(The)S 167 x(data)S 166 x(is)S 165 x(\211rst)S 166 x(shifted)S 166 x +(upwards)S 165 x(so)S 166 x(that)S 166 x(all)S 166 x(values)S 166 x +(are)S 166 x(greater)S 167 x(than)S 597 y 5692 X(or)S 166 x(equal)S +167 x(to)S 166 x(the)S 166 x(\212oor)S 166 x(value)S 167 x +(\(positive\).)S 249 x(Then,)S 168 x(all)S 166 x(values)S 166 x(are)S +166 x(scaled)S 598 y 5692 X(to)S 166 x(\211t)S 166 x(within)S 166 x +(the)S 166 x(ceiling-\212oor)S 168 x(range.)S 250 x(Finally)S -54 x +(,)S 166 x(all)S 166 x(values)S 167 x(are)S 166 x(mapped)S 598 y +5692 X(to)S 166 x(the)S 166 x(nearest)S 166 x(integer)S 167 x +(within)S 166 x(the)S 166 x(\212oor)S -8 x(-ceiling)S 167 x(range)S +167 x(by)S 166 x(rounding)S 2 x(.)S 25987 Y 4796 X(Note)S 165 x +(that)S 166 x(XIE)S 165 x(supports)S 166 x(only)S 167 x(linear)S +166 x(quantization)S 166 x(models)S 166 x(\(scaling\).)S 896 y 4796 X +(If)S 165 x(any)S 167 x(of)S 166 x(the)S 166 x(constraint)S 166 x +(values)S 167 x(are)S 166 x(out)S 166 x(of)S 166 x(range,)S 168 x +(or)S 166 x(incompatible,)S 166 x(a)S 166 x(V)S -55 x(ALUE)S 165 x +(error)S 167 x(occurs.)S 28378 Y 3600 X F28(7.1.3)S 599 x(Query)S +167 x(Operational)S 167 x(Defaults)S 29623 Y 4796 X F102 +(XIEP_QUERY_DEFAULTS)S 747 y 6708 X(none)S 748 y 5991 X(=>)S 747 y +239 x(constraints)S 10534 X(-)S 239 x(see)S 240 x(preceding)S 240 x +(section)S 239 x(-)S 747 y 5991 X(service)S 240 x(class)S 239 x +(value:)S 12447 X(0)S 448 y 5991 X(errors:)S 12447 X(none)S 449 y +5991 X(events:)S 12447 X(none)S 35879 Y 20029 X F40(REQUESTS)S 165 x +(AND)S 165 x(REPLIES)S 448 x(7\2035)S +PP +EP +%%DOC$Page: 7-6 34 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(XIEP_Q)S -2 x(UER)S -19 x(Y_OP_DEF)S -37 x(AUL)S +-28 x(TS)S 180 x(is)S 180 x(used)S 180 x(to)S 180 x(query)S 181 x +(the)S 180 x(curren)S 2 x(t)S 180 x(state)S 179 x(of)S 180 x(the)S +180 x(extension)S 181 x(server)S 28 x(')S -18 x(s)S 598 y 4796 X +(operation)S 175 x(defaults.)S 267 x(Operational)S 175 x(defaults)S +174 x(involv)S 2 x(e)S 175 x(information)S 175 x(which)S 175 x +(controls)S 176 x(the)S 175 x(operation)S 175 x(of)S 597 y 4796 X +(the)S 180 x(extension)S 182 x(server)S -36 x(,)S 184 x(is)S 181 x +(knowable/modi)S +(\211able)S 181 x(by)S 181 x(the)S 181 x(client,)S 185 x(and)S 181 x +(is)S 180 x(not)S 181 x(embodied)S 181 x(in)S 181 x(a)S 180 x +(server)S 598 y 4796 X(resource.)S 897 y 4796 X(See)S 190 x +(preceding)S 191 x(section)S 190 x(on)S 191 x(establishing)S 190 x +(operational)S 191 x(defaults)S 189 x(for)S 191 x(details)S 189 x +(of)S 191 x(the)S 190 x(information)S 598 y 4796 X(returned.)S 9947 Y +3600 X F28(7.1.4)S 599 x(T)S -44 x(erminate)S 168 x(Session)S 11192 Y +4796 X F102(XIEP_TERM_SESSION)S 747 y 6708 X(none)S 748 y 5991 X(=>)S +747 y 239 x(none)S 747 y 5991 X(service)S 240 x(class)S 239 x +(value:)S 12447 X(0)S 448 y 5991 X(errors:)S 12447 X(none)S 449 y +5991 X(events:)S 12447 X(none)S 896 y 4796 X F151(XIEP_TER)S -2 x +(M_SESSION)S 172 x(is)S 172 x(used)S 172 x(by)S 173 x(a)S 173 x +(client)S 173 x(to)S 172 x(terminate)S 173 x(an)S 172 x(image)S 173 x +(extension)S 174 x(sessi)S -2 x(on.)S 264 x(It)S 172 x(must)S 598 y +4796 X(be)S 184 x(invok)S 2 x(ed)S 184 x(by)S 186 x(a)S 184 x +(client)S 185 x(as)S 185 x(its)S 184 x(last)S 184 x(image)S 185 x +(extension)S 185 x(protocol)S 185 x(request)S 185 x(as)S 184 x(it)S +185 x(allows)S 184 x(the)S 185 x(server)S 598 y 4796 X(to)S 186 x +(perform)S 188 x(clean)S 187 x(up)S 188 x(on)S 187 x(a)S 187 x(per)S +188 x(client)S 187 x(basis.)S 291 x(The)S 187 x(extension)S 188 x +(server)S 188 x(deletes)S 186 x(all)S 187 x(client)S 188 x +(speci\211c)S 598 y 4796 X(resources.)S 256 x(A)S 170 x(client)S +169 x(may)S 170 x(choose)S 170 x(to)S 170 x(continue)S 170 x(with)S +169 x(a)S 170 x(core)S 170 x(session)S 169 x(after)S 169 x +(terminating)S 170 x(an)S 170 x(extension)S 597 y 4796 X(sess)S -2 x +(ion.)S 35879 Y 3600 X F40(7\2036)S 449 x(REQUESTS)S 165 x(AND)S +165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-7 35 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(7.2)S 599 x(Resource)S 167 x(Services)S 6838 Y +4796 X F151(Image)S 183 x(extension)S 184 x(resources)S 184 x(are)S +184 x(extension)S 184 x(server)S 184 x(objects)S 183 x(known)S 184 x +(to)S 184 x(the)S 183 x(client)S 184 x(which)S 184 x(contain)S 598 y +4796 X(information)S 167 x(used)S 166 x(by)S 168 x(the)S 166 x +(extension)S 168 x(server)S 167 x(in)S 167 x(carryin)S 2 x(g)S 167 x +(out)S 167 x(various)S 167 x(protocol)S 167 x(functions.)S 252 x +(Extension)S 597 y 4796 X(resource)S 177 x(class)S 177 x(services)S +177 x(provide)S 178 x(for)S 178 x(the)S 177 x(management)S 178 x(of)S +177 x(these)S 177 x(extension)S 178 x(server)S 178 x(objects)S 178 x +(by)S 177 x(the)S 598 y 4796 X(client.)S 255 x(Extension)S 169 x +(resource)S 170 x(protocol)S 169 x(functions)S 169 x(address)S 168 x +(resource)S 170 x(creation,)S 170 x(deletion,)S 171 x +(modi\211cation,)S 598 y 4796 X(query)S -55 x(,)S 195 x(and)S 189 x +(copy)S -55 x(.)S 295 x(In)S 189 x(addition,)S 195 x(extension)S +189 x(resource)S 190 x(services)S 189 x(provide)S 189 x(for)S 189 x +(moving)S 189 x(image)S 189 x(data)S 598 y 4796 X(between)S 165 x +(core)S 167 x(and)S 166 x(extension)S 167 x(resources.)S 250 x +(Resource)S 166 x(protocol)S 166 x(functions)S 167 x(include:)S +11470 Y 4796 X(\201)S 594 x(XIEP_CREA)S -29 x(TE_RESO)S -2 x(URCE)S +165 x(-)S 166 x(create)S 166 x(a)S 166 x(new)S 166 x(server)S 167 x +(resource)S 167 x(object)S 748 y 4796 X(\201)S 594 x(XIEP_COPY_R)S +-2 x(ESOURCE)S 164 x(-)S 166 x(copy)S 167 x(contents)S 166 x(from)S +166 x(source)S 167 x(to)S 166 x(destination)S 165 x(resource)S 747 y +4796 X(\201)S 594 x(XIEP_DELETE_R)S -2 x(ESOURCE)S 164 x(-)S 166 x +(delete)S 166 x(an)S 166 x(existing)S 167 x(server)S 167 x(resource)S +166 x(object)S 747 y 4796 X(\201)S 594 x(XIEP_QUER)S -20 x(Y_RESO)S +-2 x(URCE)S 165 x(-)S 166 x(query)S 167 x(an)S 167 x(existing)S 166 x +(server)S 167 x(resource)S 167 x(object)S 747 y 4796 X(\201)S 594 x +(XIEP_IMPORT_IMAG)S -2 x(E)S 166 x(-)S 166 x(create)S 166 x(a)S 166 x +(new)S 166 x(server)S 167 x(IOB)S 165 x(resource)S 167 x(object)S +747 y 4796 X(\201)S 594 x(XIEP_EXPOR)S -2 x(T_IMAGE)S 166 x(-)S 165 x +(create)S 167 x(a)S 166 x(new)S 166 x(server)S 166 x(PIXMAP)S 166 x +(resource)S 167 x(object)S 16701 Y 3600 X F28(7.2.1)S 599 x +(Resource)S 167 x(Creation)S 17946 Y 4796 X F102 +(XIEP_CREATE_RESOURCE)S 747 y 6708 X(resource_id)S 12447 X +({XIT_IOB,XIT_IDC,)S 2 x(XIT_IPC})S 449 y 6708 X(resource_typ)S 2 x +(e)S 12447 X(XIT_RESOURCE_TYPE)S 448 y 6708 X(resource_dat)S 2 x(a)S +12447 X(-)S 239 x(see)S 239 x(below)S 240 x(-)S 747 y 5752 X(=>)S +747 y 478 x(none)S 22131 Y 5752 X(service)S 240 x(class)S 239 x +(value:)S 12686 X(-)S 239 x(see)S 240 x(below)S 239 x(-)S 448 y +5752 X(errors:)S 12686 X(ALLOC,)S 240 x(IDChoice,)S 240 x(VALUE)S +448 y 5752 X(events:)S 12686 X(none)S 24372 Y 4796 X(where)S 239 x +(resource_data)S 241 x(is)S 239 x(one)S 239 x(of)S 240 x(the)S 239 x +(following:)S 747 y 6708 X({)S 449 y(image_objec)S 2 x +(t_resource_data,)S 448 y 6947 X(process_con)S 2 x +(trol_context_resour)S 2 x(ce_data,)S 448 y 6947 X(domain_cont)S +2 x(rol_context_resourc)S 2 x(e_data)S 449 y 6708 X(})S 896 y 4796 X +F151(Server)S 172 x(resource)S 173 x(creation)S 172 x(causes)S 172 x +(the)S 172 x(server)S 173 x(to)S 172 x(allocate)S 171 x(a)S 172 x +(new)S 172 x(resource)S 173 x(and)S 172 x(to)S 172 x(\211ll)S 172 x +(it)S 172 x(with)S 171 x(infor-)S 598 y 4796 X(mation)S 165 x +(passed)S 166 x(through)S 167 x(the)S 166 x(function')S -17 x(s)S +165 x(parameters.)S 897 y 4796 X(Resource_id)S 189 x(is)S 189 x(the)S +190 x(client)S 190 x(speci\211ed)S 189 x(id)S 190 x(to)S 189 x(be)S +190 x(assigned)S 189 x(to)S 190 x(the)S 189 x(new)S 190 x(resource.)S +297 x(Resource_type)S 597 y 4796 X(speci\211es)S 187 x(what)S 186 x +(type)S 188 x(of)S 187 x(extension)S 188 x(server)S 188 x(resource)S +188 x(is)S 187 x(to)S 187 x(be)S 187 x(created.,)S 194 x(\(image)S +188 x(object)S 187 x(resource,)S 598 y 4796 X(process)S 172 x(and)S +173 x(domain)S 173 x(control)S 174 x(object)S 173 x(resources\).)S +264 x(Resource_data)S 173 x(is)S 172 x(type)S 173 x(speci\211c)S +174 x(and)S 173 x(is)S 172 x(described)S 598 y 4796 X(in)S 166 x +(the)S 166 x(following)S 166 x(subsections.)S 897 y 4796 X(All)S +167 x(extension)S 169 x(server)S 168 x(resources)S 169 x(have)S 169 x +(their)S 168 x(id')S -19 x(s)S 168 x(selected)S 168 x(by)S 168 x +(the)S 168 x(client)S 169 x(\(same)S 167 x(model)S 168 x(as)S 167 x +(for)S 169 x(all)S 167 x(core)S 597 y 4796 X(resources\).)S 282 x +(The)S 183 x(client)S 183 x(must)S 182 x(use)S 183 x(the)S 183 x +(core)S 183 x(session)S 181 x(conne)S 2 x(ction)S 182 x(assigned)S +183 x(resource-id-base)S 182 x(and)S 598 y 4796 X(resource-id-mask)S +181 x(in)S 181 x(generating)S 183 x(id')S -19 x(s)S 180 x(for)S 182 x +(image)S 181 x(extension)S 182 x(resources.)S 280 x(As)S 180 x +(speci\211ed)S 181 x(in)S 181 x(the)S 181 x(core)S 598 y 4796 X +(protocol)S 167 x("The)S 168 x(resource_id_mask)S 168 x(contains)S +168 x(a)S 168 x(single)S 168 x(set)S 167 x(of)S 167 x(contiguou)S +2 x(s)S 167 x(bits)S 167 x(\(at)S 167 x(least)S 167 x(18\);)S 169 x +(the)S 167 x(client)S 35879 Y 20029 X F40(REQUESTS)S 165 x(AND)S +165 x(REPLIES)S 448 x(7\2037)S +PP +EP +%%DOC$Page: 7-8 36 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(allocates)S 166 x(resource)S 169 x(ids)S 166 x +(by)S 168 x(choosing)S 169 x(a)S 167 x(value)S 168 x(with)S 167 x +(\(only\))S 168 x(some)S 167 x(subset)S 167 x(of)S 168 x(these)S +167 x(bits)S 167 x(set,)S 167 x(and)S 168 x(ORing)S 598 y 4796 X(it)S +169 x(with)S 170 x(the)S 170 x(resource_id_base.)S 258 x(Only)S 171 x +(values)S 170 x(constructed)S 171 x(in)S 170 x(this)S 170 x(way)S +170 x(can)S 171 x(be)S 170 x(used)S 170 x(to)S 170 x(name)S 170 x +(newly)S 597 y 4796 X(created)S 171 x(resources)S 171 x(over)S 172 x +(this)S 171 x(connection.)S 260 x(Resource)S 172 x(ids)S 170 x +(never)S 172 x(have)S 172 x(the)S 171 x(top)S 171 x(3)S 171 x(bits)S +171 x(set.)S 259 x(The)S 171 x(client)S 598 y 4796 X(is)S 161 x(not)S +163 x(restricted)S 162 x(to)S 162 x(linear)S 163 x(or)S 162 x +(contigu)S 2 x(ous)S 162 x(allocation)S 162 x(of)S 163 x(resource)S +163 x(ids.)S 249 x(Once)S 162 x(an)S 163 x(id)S 162 x(has)S 162 x +(been)S 163 x(freed,)S 164 x(it)S 598 y 4796 X(can)S 170 x(be)S 169 x +(reused,)S 171 x(but)S 170 x(this)S 169 x(should)S 170 x(not)S 170 x +(be)S 170 x(necessary)S -55 x(.)S 256 x(An)S 170 x(id)S 169 x(must)S +170 x(be)S 169 x(unique)S 171 x(with)S 169 x(respect)S 169 x(to)S +170 x(the)S 170 x(ids)S 598 y 4796 X(of)S 165 x(all)S 166 x(other)S +167 x(resources,)S 167 x(not)S 166 x(just)S 166 x(resources)S 166 x +(of)S 166 x(the)S 167 x(same)S 165 x(type.")S 896 y 4796 X(The)S +163 x(service)S 163 x(class)S 163 x(of)S 162 x(the)S 163 x(resource)S +164 x(creation)S 163 x(function)S 164 x(depends)S 163 x(upon)S 163 x +(what)S 163 x(type)S 163 x(of)S 163 x(resource)S 163 x(is)S 163 x +(being)S 598 y 4796 X(created.)S 249 x(This)S 166 x(is)S 166 x +(discussed)S 165 x(in)S 167 x(each)S 166 x(of)S 166 x(the)S 166 x +(following)S 166 x(subsections.)S 897 y 4796 X(Inability)S 179 x(of)S +179 x(the)S 180 x(server)S 180 x(to)S 179 x(allocate)S 179 x(the)S +180 x(new)S 179 x(resource)S 181 x(results)S 178 x(in)S 180 x(an)S +180 x(ALLOC)S 179 x(error)S -37 x(.)S 277 x(Choice)S 179 x(of)S 180 x +(a)S 597 y 4796 X(resource)S 180 x(id)S 179 x(which)S 180 x(is)S +179 x(already)S 180 x(in)S 180 x(use)S 180 x(or)S 179 x(is)S 179 x +(out)S 180 x(of)S 180 x(range)S 180 x(generates)S 180 x(an)S 180 x +(IDChoice)S 179 x(error)S -36 x(.)S 277 x(Invalid)S 598 y 4796 X +(value)S 172 x(speci\211cation)S 172 x(of)S 171 x(any)S 173 x(image)S +171 x(attributes)S 171 x(results)S 172 x(in)S 171 x(a)S 172 x(V)S +-56 x(ALUE)S 171 x(error)S -36 x(.)S 261 x(If)S 171 x(any)S 172 x +(error)S 172 x(occurs,)S 174 x(the)S 598 y 4796 X(object)S 166 x(is)S +166 x(not)S 166 x(created.)S 13832 Y 3600 X F36(7.2.1.1)S 599 x +(Image)S 167 x(Object)S 166 x(Resource)S 748 y 4796 X F102 +(Image_Object_Resourc)S 2 x(e_Data)S 747 y 6230 X([)S 448 y 239 x +(pixels-per-s)S 2 x(canline)S 14121 X(CARD32)S 448 y 6708 X +(number-of-sc)S 2 x(anlines)S 14121 X(CARD32)S 449 y 6708 X +(aspect_ratio)S 14121 X(XIT_FLOAT)S 448 y 6708 X(number-of-sp)S 2 x +(ectral-components)S 480 x(CARD8)S 448 y 6708 X(bits_per_com)S 2 x +(ponent)S 14121 X(LISTofCARD8)S 449 y 6708 X(spectral-com)S 2 x +(ponent-mapping)S 14121 X(XIT_SPECTRAL_COMPON)S 2 x(ENT_MAPPING)S +448 y 6708 X(pixel_progre)S 2 x(ssion)S 14121 X(XIT_PIXEL_PROGRESSI)S +2 x(ON)S 448 y 6708 X(line_progres)S 2 x(sion)S 14121 X +(XIT_LINE_PROGRESSIO)S 2 x(N)S 449 y 6708 X(polarity)S 14121 X +(XIT_POLARITY)S 448 y 6230 X(])S 897 y 4796 X F151(IOB)S -2 x(')S +-18 x(s)S 178 x(represent)S 179 x(revisable)S 178 x(form)S 179 x +(images)S 178 x(\(see)S 178 x(server)S 180 x(resources)S 178 x(and)S +179 x(image)S 179 x(data)S 178 x(attributes)S 178 x(and)S 597 y +4796 X(organization)S 166 x(appendices\).)S 250 x(They)S 167 x +(consist)S 165 x(of)S 166 x(image)S 167 x(attributes)S 165 x(and)S +166 x(image)S 167 x(data.)S 897 y 4796 X(Image)S 181 x(objects)S +182 x(can)S 183 x(come)S 182 x(into)S 181 x(existence)S 183 x(in)S +182 x(several)S 182 x(ways:)S 281 x(as)S 181 x(the)S 182 x(result)S +182 x(of)S 181 x(a)S 182 x(client)S 182 x(request)S 182 x(to)S 598 y +4796 X(create)S 167 x(a)S 168 x(new)S 168 x(one;)S 169 x(as)S 167 x +(the)S 168 x(result)S 167 x(of)S 168 x(an)S 168 x(import)S 167 x +(protocol)S 168 x(request;)S 169 x(and)S 168 x(as)S 167 x(the)S 168 x +(result)S 167 x(of)S 168 x(a)S 168 x(processing)S 598 y 4796 X +(protocol)S 177 x(request.)S 272 x(XIEP_CREA)S -29 x(TE_RESO)S -2 x +(URCE)S 177 x(with)S 177 x(type)S 177 x(image)S 178 x(object)S 178 x +(is)S 177 x(used)S 177 x(by)S 178 x(a)S 177 x(client)S 178 x(to)S +597 y 4796 X(create)S 178 x(\(allocate\))S 177 x(a)S 178 x(new)S +178 x(server)S 179 x(image)S 178 x(object)S 179 x(resource)S 178 x +(and)S 179 x(as)S 177 x(such,)S 182 x(represents)S 178 x(the)S 178 x +(\211rst)S 178 x(of)S 178 x(the)S 598 y 4796 X(three)S 166 x(ways)S +166 x(of)S 166 x(creating)S 167 x(new)S 166 x(image)S 166 x +(objects.)S 897 y 4796 X(Clients)S 172 x(typically)S 174 x(create)S +174 x(new)S 173 x(image)S 174 x(objects)S 174 x(just)S 173 x(prior)S +174 x(to)S 173 x(populating)S 174 x(them)S 174 x(with)S 173 x(image)S +174 x(data)S 173 x(via)S 597 y 4796 X(transport)S 178 x(protocol)S +178 x(functions.)S 274 x(Both)S 179 x(primitive)S 178 x(and)S 178 x +(presentation)S 179 x(attributes)S 177 x(are)S 179 x(communicated)S +598 y 4796 X(from)S 187 x(client)S 188 x(to)S 187 x(server)S 188 x +(during)S 189 x(image)S 187 x(object)S 188 x(creation.)S 293 x(The)S +188 x(primitive)S 188 x(attributes)S 187 x(are)S 187 x(strongly)S +598 y 4796 X(bound)S 181 x(to)S 181 x(the)S 181 x(data)S 180 x(as)S +181 x(they)S 181 x(describe)S 181 x(the)S 181 x(most)S 180 x +(fundamental)S 182 x(organizational)S 181 x(information.)S 280 x +(The)S 598 y 4796 X(presentation)S 170 x(attributes)S 171 x(are)S +171 x(less)S 170 x(strongly)S 172 x(bound)S 171 x(as)S 171 x(they)S +171 x(provide)S 172 x(some)S 170 x(insight)S 172 x(into)S 171 x(the)S +171 x(original)S 597 y 4796 X(presentation)S 166 x(of)S 166 x(the)S +166 x(data.)S 29623 Y 5274 X F102(primitive_attribut)S 2 x(es)S 239 x +(include:)S 747 y 6708 X(pixels-per-s)S 2 x(canline)S 449 y 6708 X +(number-of-sc)S 2 x(anlines)S 448 y 6708 X(number-of-sp)S 2 x +(ectral-components)S 448 y 6708 X(bits_per_com)S 2 x(ponent)S 449 y +6708 X(spectral-com)S 2 x(ponent-mapping)S 747 y 5274 X +(presentation_attri)S 2 x(butes)S 239 x(include:)S 35879 Y 3600 X +F40(7\2038)S 449 x(REQUESTS)S 165 x(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-9 37 +1000 BP 39600 30600 PM 0 0 XY +5065 Y 6708 X F102(pixel_progre)S 2 x(ssion)S 448 y 6708 X +(line_progres)S 2 x(sion)S 448 y 6708 X(aspect_ratio)S 448 y 6708 X +(polarity)S 897 y 4796 X F151(Note)S 155 x(that)S 155 x(while)S 155 x +(most)S 154 x(client)S 156 x(accessible)S 154 x(server)S 156 x +(resource)S 156 x(object)S 156 x(\211elds)S 155 x(can)S 155 x(be)S +156 x(initialized)S 154 x(at)S 155 x(creation)S 598 y 4796 X(time,)S +172 x(there)S 171 x(may)S 171 x(be)S 171 x(\211elds)S 171 x(in)S +171 x(image)S 171 x(objects)S 171 x(which)S 171 x(are)S 171 x +(initialized)S 170 x(and)S 172 x(maintained)S 170 x(by)S 172 x(the)S +171 x(server)S 598 y 4796 X(and)S 166 x(are)S 166 x(only)S 167 x +(queryable)S 167 x(by)S 166 x(the)S 167 x(client)S 166 x(\(eg.)S +250 x(constraint)S 166 x(information\))S 896 y 4796 X(Pixels-per)S +-9 x(-scanline,)S 203 x(number)S -9 x(-of-scanlines,)S 202 x(number)S +-8 x(-of-spectral-components,)S 202 x(and)S 195 x(spectral-)S 598 y +4796 X(component-mapping)S 181 x(are)S 180 x(all)S 180 x(primitive)S +180 x(image)S 180 x(attributes)S 180 x(described)S 180 x(in)S 180 x +(the)S 180 x(appendix)S 181 x(on)S 181 x(image)S 598 y 4796 X(data)S +169 x(attributes)S 170 x(and)S 171 x(organization.)S 258 x(While)S +170 x(bits_per_component)S 171 x(is)S 170 x(an)S 170 x(artifact)S +170 x(of)S 170 x(image)S 171 x(data)S 170 x(wire)S 598 y 4796 X +(transport)S 167 x(\(more)S 167 x(so)S 167 x(than)S 167 x(a)S 168 x +(primitive)S 167 x(attribute\),)S 167 x(it)S 167 x(is)S 167 x +(communicated)S 168 x(with)S 167 x(primitive)S 167 x(attributes)S +166 x(at)S 597 y 4796 X(IOB)S 164 x(creation)S 167 x(time)S 166 x +(to)S 165 x(facilitate)S 166 x(IOB)S 165 x(resource)S 167 x +(allocation)S 166 x(\(memory\).)S 897 y 4796 X(Pixel_progression,)S +170 x(line_progression,)S 171 x(aspect_ratio,)S 169 x(and)S 168 x +(polarity)S 169 x(are)S 169 x(all)S 168 x(original)S 169 x(image)S +169 x(presenta-)S 598 y 4796 X(tion)S 166 x(attributes)S 165 x +(described)S 166 x(in)S 166 x(the)S 166 x(appendix)S 167 x(on)S 166 x +(image)S 167 x(data)S 165 x(attributes)S 166 x(and)S 166 x +(organization.)S 896 y 4796 X(IOB)S -2 x(')S -18 x(s)S 182 x +(created)S 182 x(by)S 183 x(the)S 183 x(create)S 182 x(resource)S +184 x(function)S 183 x(begin)S 183 x(their)S 183 x(life)S 182 x +(with)S 182 x(state)S 182 x(constrained.)S 283 x(This)S 598 y 4796 X +(is)S 184 x(consistent)S 185 x(with)S 185 x(their)S 186 x(only)S +186 x(initial)S 185 x(use)S 185 x(\(receiving)S 187 x(image)S 186 x +(data)S 185 x(from)S 185 x(across)S 185 x(the)S 185 x(wire\).)S 288 x +(IOB)S 598 y 4796 X(image)S 179 x(data)S 180 x(is)S 179 x +(initialized)S 178 x(at)S 180 x(creation)S 180 x(time)S 179 x(to)S +179 x(the)S 180 x(value)S 180 x(zero)S 180 x(\(0\).)S 276 x(This)S +180 x(is)S 179 x(done)S 180 x(to)S 179 x(ensure)S 181 x(that)S 598 y +4796 X(all)S 171 x(image)S 173 x(locations)S 172 x(begin)S 173 x +(with)S 172 x(meaningful)S 173 x(data.)S 261 x(This)S 173 x(is)S +171 x(particularly)S 173 x(important)S 172 x(in)S 173 x(that)S 172 x +(image)S 597 y 4796 X(data)S 178 x(transport)S 178 x(overlays)S 179 x +(the)S 179 x(default)S 178 x(values)S 179 x(and)S 179 x(while)S 178 x +(stream)S 178 x(image)S 179 x(data)S 178 x(transport)S 178 x(must)S +178 x(by)S 598 y 4796 X(de\211nition)S 175 x(overlay)S 175 x(all)S +174 x(of)S 175 x(the)S 174 x(data)S 174 x(locations,)S 177 x(random)S +175 x(access)S 174 x(tiled)S 174 x(image)S 175 x(data)S 174 x +(transport)S 174 x(may)S 175 x(or)S 598 y 4796 X(may)S 166 x(not.)S +897 y 4796 X(IOB)S -2 x(')S -18 x(s)S 173 x(are)S 174 x(potentially)S +174 x(very)S 175 x(expensive)S 175 x(server)S 175 x(resources)S 174 x +(due)S 174 x(to)S 174 x(their)S 174 x(size.)S 264 x(Care)S 174 x +(should)S 174 x(be)S 174 x(exer-)S 597 y 4796 X(cised)S 165 x(by)S +167 x(the)S 166 x(client)S 166 x(regarding)S 168 x(which)S 166 x +(and)S 166 x(how)S 166 x(many)S 167 x(resources)S 166 x(are)S 167 x +(allocated.)S 20756 Y 3600 X F36(7.2.1.2)S 599 x(Domain)S 167 x +(Control)S 167 x(Context)S 166 x(Resource)S 747 y 4796 X F102 +(domain_context_resou)S 2 x(rce_data)S 747 y 6708 X(idc_type)S 10534 X +(XIT_IDC_TYPE)S 448 y 6708 X(idc_data)S 10295 X(-)S 239 x(see)S 240 x +(below)S 239 x(-)S 24043 Y 4796 X(Where)S 239 x(idc_data)S 240 x +(depends)S 240 x(on)S 239 x(the)S 240 x(idc_type:)S 748 y 6469 X(.)S +239 x(for)S 240 x(ROI's,)S 240 x(idc_data)S 240 x(is)S 239 x(the)S +239 x(following)S 240 x(sequence:)S 747 y 7665 X([)S 448 y 239 x +(ul_x)S 12447 X(CARD32)S 448 y 8143 X(ul_y)S 12447 X(CARD32)S 449 y +8143 X(width)S 12447 X(CARD32)S 448 y 8143 X(height)S 12447 X +(CARD32)S 448 y 7665 X(])S 748 y 6469 X(.)S 239 x(for)S 240 x +(CPP's,)S 240 x(idc_data)S 240 x(is)S 239 x(the)S 239 x(following:)S +747 y 7665 X([)S 448 y 239 x(ul_x)S 12447 X(CARD32)S 448 y 8143 X +(ul_y)S 12447 X(CARD32)S 449 y 8143 X(cpp_iob)S 12447 X(XIT_IOB)S +448 y 7665 X(])S 747 y 6469 X(.)S 239 x(for)S 240 x(TMP's,)S 240 x +(idc_data)S 240 x(is)S 239 x(the)S 239 x(following:)S 35879 Y 20029 X +F40(REQUESTS)S 165 x(AND)S 165 x(REPLIES)S 448 x(7\2039)S +PP +EP +%%DOC$Page: 7-10 38 +1000 BP 39600 30600 PM 0 0 XY +5038 Y 7665 X F102([)S 448 y 239 x(center_x)S 12925 X(CARD32)S 448 y +8143 X(center_y)S 12925 X(CARD32)S 449 y 8143 X(data_count)S 12925 X +(CARD32)S 448 y 8143 X(tmp_data)S 12925 X(LISTofTMP_ENTRY)S 448 y +7665 X(])S 748 y 6947 X(where:)S 747 y -716 x(TMP_ENTRY)S 240 x(is:)S +747 y 7187 X([)S 448 y 239 x(x_index)S 12447 X(CARD32)S 449 y 7665 X +(y_index)S 12447 X(CARD32)S 448 y 7665 X(value)S 12447 X(XIT_FLOAT)S +448 y 7187 X(])S 897 y 4796 X F151(Domain)S 173 x(context)S 175 x +(resources)S 174 x(are)S 174 x(used)S 174 x(to)S 173 x(focus)S 174 x +(various)S 175 x(classes)S 172 x(of)S 174 x(server)S 175 x(based)S +173 x(image)S 174 x(processing)S 598 y 4796 X(onto)S 176 x(a)S 177 x +(subset)S 176 x(of)S 176 x(the)S 177 x(pixels)S 176 x(that)S 176 x +(are)S 177 x(part)S 176 x(of)S 177 x(an)S 177 x(IOB,)S 176 x(and)S +176 x(to)S 177 x(act)S 176 x(as)S 176 x(operands)S 177 x(in)S 176 x +(certain)S 177 x(image)S 597 y 4796 X(area)S 166 x(operations.)S +897 y 4796 X(IDC)S -2 x(_type)S 171 x(determines)S 170 x(if)S 169 x +(the)S 170 x(IDC)S 169 x(is)S 170 x(to)S 170 x(be)S 170 x(an)S 170 x +(ROI,)S 169 x(CPP)S -64 x(,)S 171 x(or)S 170 x(TMP)S -64 x(.)S 171 x +(IDC_data)S 169 x(speci\211es)S 169 x(the)S 170 x(bounds)S 598 y +4796 X(of)S 166 x(an)S 166 x(ROI,)S 165 x(identi\211es)S 167 x(a)S +166 x(bit)S 165 x(plane)S 167 x(\(an)S 166 x(IOB)S 165 x(which)S +166 x(is)S 166 x(one)S 166 x(bit)S 166 x(per)S 166 x(pixel\))S 167 x +(to)S 166 x(be)S 166 x(used)S 166 x(as)S 165 x(a)S 167 x(CPP)S -65 x +(,)S 167 x(or)S 166 x(the)S 598 y 4796 X(locations)S 165 x(and)S +167 x(values)S 166 x(of)S 166 x(the)S 166 x(template.)S 896 y 4796 X +(There)S 186 x(are)S 187 x(three)S 186 x(forms)S 185 x(of)S 186 x +(IDC:)S 186 x(the)S 186 x(region)S 187 x(of)S 186 x(interest)S 185 x +(or)S 187 x(ROI)S -2 x(,)S 187 x(the)S 186 x(control)S 186 x +(processing)S 187 x(plane)S 598 y 4796 X(or)S 183 x(CPP)S -64 x(,)S +184 x(and)S 184 x(the)S 184 x(template)S 182 x(or)S 184 x(TMP)S -63 x +(.)S 184 x(An)S 183 x(ROI)S 183 x(de\211nes)S 183 x(a)S 184 x +(closed,)S 188 x(rectangular)S 185 x(subregion.)S 286 x(When)S 598 y +4796 X(using)S 172 x(an)S 172 x(ROI)S 171 x(type)S 172 x(IDC,)S 172 x +(all)S 171 x(pixels)S 172 x(within)S 172 x(\(border)S 172 x +(included\))S 172 x(the)S 173 x(ROI)S 170 x(are)S 173 x(subject)S +172 x(to)S 172 x(processing.)S 597 y 4796 X(Individual)S 167 x +(operators)S 167 x(de\211ne)S 168 x(how)S 167 x(boundary)S 168 x +(conditions)S 167 x(are)S 167 x(handled.)S 252 x(A)S 167 x(CPP)S +167 x(de\211nes)S 167 x(a)S 167 x(potentially)S 598 y 4796 X(fully)S +169 x(disconnected)S 168 x(set)S 168 x(of)S 169 x(locations)S 168 x +(such)S 169 x(that)S 168 x(pixels)S 169 x(at)S 168 x(these)S 169 x +(locations)S 168 x(are)S 169 x(subject)S 168 x(to)S 169 x +(processing.)S 598 y 4796 X(CPP')S -19 x(s)S 159 x(do)S 159 x(this)S +160 x(by)S 160 x(representing)S 160 x(all)S 159 x(pixel)S 160 x +(locations)S 159 x(with)S 159 x(a)S 160 x(single)S 160 x(bit,)S 161 x +(and)S 159 x(using)S 161 x(the)S 159 x(state)S 159 x(of)S 159 x(the)S +160 x(bit)S 598 y 4796 X(to)S 159 x(control)S 160 x(whether)S 160 x +(processing)S 160 x(occurs)S 161 x(or)S 160 x(not.)S 249 x(A)S 160 x +(TMP)S 160 x(de\211nes)S 160 x(the)S 160 x(shape)S 160 x(and)S 160 x +(values)S 160 x(of)S 160 x(a)S 159 x(template)S 598 y 4796 X(or)S +175 x(mask)S 176 x(used)S 176 x(in)S 176 x(area)S 175 x(operations.)S +269 x(TMP')S -18 x(s)S 175 x(maybe)S 176 x(fully)S 177 x(or)S 176 x +(sparsely)S 175 x(populated)S 176 x(two)S 175 x(dimensional)S 597 y +4796 X(entities.)S 249 x(Individual)S 166 x(protocol)S 166 x +(processing)S 167 x(functions)S 166 x(de\211ne)S 167 x(which)S 166 x +(forms)S 166 x(of)S 166 x(IDC)S 165 x(are)S 166 x(acceptable.)S 897 y +4796 X(All)S 175 x(three)S 177 x(forms)S 176 x(of)S 177 x(IDC)S 175 x +(\(ROI,)S 176 x(CPP)S -64 x(,)S 177 x(TMP\))S 177 x(are)S 176 x +(spatially)S 176 x(registered)S 177 x(with)S 176 x(the)S 176 x +(image)S 177 x(object)S 177 x(data)S 598 y 4796 X(\(IOB)S -2 x(\))S +172 x(through)S 173 x(the)S 171 x(image)S 172 x(object')S -18 x(s)S +171 x(implicit)S 170 x(two)S 171 x(dimensional)S 171 x(coordinate)S +172 x(system.)S 260 x(ROI)S 170 x(and)S 172 x(CPP')S -19 x(s)S 597 y +4796 X(are)S 168 x(spatially)S 167 x(registered)S 168 x(by)S 169 x +(the)S 168 x(values)S 168 x(of)S 168 x(their)S 169 x(upper)S 168 x +(left)S 168 x(coordinates)S 168 x(which)S 168 x(specify)S 168 x(the)S +168 x(location)S 598 y 4796 X(in)S 177 x(image)S 178 x(object)S 178 x +(coordinates)S 177 x(of)S 178 x(the)S 177 x(upper)S 178 x(left)S +177 x(corner)S -36 x(.)S 273 x(In)S 177 x(the)S 178 x(case)S 177 x +(of)S 178 x(ROI')S -20 x(s)S 177 x(and)S 177 x(CPP')S -18 x(s,)S +180 x(their)S 178 x(x)S 598 y 4796 X(and)S 161 x(y)S 162 x(extents)S +161 x(must)S 161 x(be)S 161 x(less)S 160 x(than)S 162 x(or)S 161 x +(equal)S 162 x(to)S 161 x(that)S 161 x(of)S 161 x(the)S 161 x(IOB)S +160 x(they)S 162 x(will)S 160 x(be)S 162 x(used)S 161 x(with)S 160 x +(at)S 161 x(operation)S 598 y 4796 X(time.)S 896 y 4796 X(While)S +181 x(the)S 182 x(X)S 181 x(image)S 182 x(extension)S 182 x +(protocol)S 182 x(does)S 182 x(not)S 181 x(provide)S 183 x(for)S +181 x(object)S 183 x(recognition,)S 187 x(it)S 181 x(does)S 182 x +(allow)S 598 y 4796 X(clients)S 175 x(to)S 176 x(process)S 175 x +(and)S 176 x(convert)S 177 x(an)S 176 x(IOB)S 174 x(into)S 176 x(a)S +176 x(CPP)S 176 x(via)S 176 x(the)S 176 x(boolean)S 176 x(operators)S +175 x(in)S 176 x(enhancemen)S 2 x(t)S 598 y 4796 X(services)S 179 x +(section.)S 276 x(W)S -19 x(ith)S 180 x(these)S 179 x(services,)S +183 x(a)S 179 x(client)S 180 x(can)S 179 x(gener)S 2 x(ate)S 179 x +(a)S 179 x(CPP)S 179 x(for)S 180 x(pixels)S 179 x(with)S 179 x(the)S +179 x(same)S 598 y 4796 X(intensity)S 168 x(or)S 168 x(color)S -36 x +(,)S 169 x(or)S 168 x(more)S 168 x(complex)S 168 x(identity)S 169 x +(relationships.)S 253 x(Applications)S 167 x(such)S 168 x(as)S 168 x +(chroma)S 169 x(keying)S 597 y 4796 X(may)S 166 x(be)S 166 x +(possible)S 165 x(with)S 166 x(these)S 166 x(services.)S 897 y 4796 X +(The)S 171 x(spatial)S 170 x(registration)S 171 x(of)S 171 x(a)S +171 x(template)S 170 x(\(TMP\))S 171 x(with)S 171 x(the)S 171 x +(area)S 171 x(image)S 171 x(data)S 171 x(surrounding)S 172 x(a)S +171 x(pixel)S 171 x(is)S 598 y 4796 X(establis)S -2 x(hed)S 172 x +(by)S 171 x(the)S 171 x(centerx)S 172 x(and)S 171 x(centery)S 172 x +(data.)S 259 x(All)S 171 x(templates)S 170 x(are)S 171 x +(speci\211ed)S 171 x(in)S 171 x(the)S 171 x(positive)S 171 x(x)S +171 x(and)S 598 y 4796 X(positive)S 171 x(y)S 172 x(quadrant)S 172 x +(of)S 172 x(a)S 172 x(cartesian)S 171 x(coordinate)S 172 x(system.)S +261 x(The)S 172 x(centerx,)S 175 x(centery)S 173 x(data)S 171 x +(positions)S 171 x(the)S 597 y 4796 X(location)S 175 x(of)S 174 x +(the)S 175 x(data)S 175 x(pixel)S 175 x(\(central)S 175 x(pixel\))S +175 x(relative)S 175 x(to)S 175 x(the)S 175 x(template.)S 266 x(For)S +175 x(example,)S 178 x(the)S 175 x(following)S 598 y 4796 X(hollow)S +165 x(cross)S 166 x(\211lter)S 166 x(would)S 166 x(be)S 166 x +(represented)S 167 x(in)S 166 x(the)S 166 x(protocol)S 166 x(as)S +166 x(shown)S 166 x(below:)S 35879 Y 3600 X F40(7\20310)S 449 x +(REQUESTS)S 166 x(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-11 39 +1000 BP 39600 30600 PM 0 0 XY +5052 Y 13164 X F102(-7.00)S 748 y 11490 X(+3.00)S 14838 X(-0.75)S +747 y 13164 X(+1.66)S 7593 Y 7665 X(entries)S 10534 X(4)S 448 y +7665 X(centerx)S 10534 X(1)S 448 y 7665 X(centery)S 10534 X(1)S 748 y +7665 X(x_index)S 10295 X(1)S 11969 X(2)S 13881 X(1)S 15555 X(0)S +448 y 7665 X(y_index)S 10295 X(0)S 11969 X(1)S 13881 X(2)S 15555 X +(1)S 448 y 7665 X(value)S 10056 X(+1.66)S 479 x(-0.75)S 717 x(-7.0)S +718 x(+3.0)S 897 y 4796 X F151(Note)S 174 x(that)S 174 x(asymmetric)S +174 x(templates)S 173 x(are)S 174 x(possible,)S 176 x(and)S 175 x +(there)S 174 x(is)S 174 x(no)S 175 x(need)S 174 x(for)S 175 x(all)S +173 x(or)S 175 x(even)S 175 x(the)S 175 x(center)S 598 y 4796 X +(point)S 156 x(template)S 156 x(value)S 157 x(to)S 156 x(be)S 157 x +(de)S +(\211ned)S 157 x(\(sparse)S 156 x(de\211nitions\).)S 250 x(Note)S +156 x(also)S 156 x(that)S 156 x(the)S 157 x(size)S 156 x(of)S 156 x +(the)S 157 x(list)S 156 x(length)S 597 y 4796 X(entry)S 167 x +(\(\211rst)S 167 x(\211eld)S 168 x(in)S 167 x(the)S 167 x(list\))S +166 x(for)S 168 x(tmp_data)S 166 x(is)S 167 x(CARD)S -2 x(16)S 167 x +(\(rather)S 167 x(than)S 168 x(the)S 167 x(default)S 167 x(CARD8\))S +166 x(to)S 167 x(allow)S 598 y 4796 X(for)S 166 x(large)S 166 x +(templates.)S 897 y 4796 X(Creation)S 157 x(of)S 158 x(IDC)S 156 x +(resources)S 159 x(is)S 157 x(considered)S 158 x(to)S 157 x(be)S +158 x(a)S 158 x(service)S 158 x(class)S 157 x(1)S 158 x(function)S +158 x(as)S 158 x(it)S 157 x(is)S 157 x(central)S 158 x(to)S 158 x +(server)S 598 y 4796 X(image)S 166 x(processing)S 166 x(operations.)S +15812 Y 3600 X F36(7.2.1.3)S 599 x(Process)S 166 x(Control)S 167 x +(Context)S 166 x(Creation)S 747 y 4796 X F102(Process_Control_Reso)S +2 x(urce_Data)S 747 y 6230 X([)S 449 y 239 x(name)S 14121 X +(LISTofSTRING8)S 448 y 6708 X(inputs)S 14121 X(PIPE_IOT)S 448 y +6708 X(outputs)S 14121 X(PIPE_IOT)S 449 y 6230 X(])S 747 y 4796 X +(where:)S 747 y 5274 X(PIPE_IOT)S 240 x(includes:)S 747 y 6230 X([)S +449 y(number)S 14121 X(CARD8)S 448 y 6469 X(formal_parm_t)S 2 x +(ypes)S 14121 X(LISTofXIT_PARMS)S 448 y 6230 X(])S 897 y 4796 X F151 +(Process)S 181 x(context)S 183 x(resources)S 182 x(represent)S 182 x +(server)S 182 x(pipeline)S 182 x(resources.)S 282 x(They)S 183 x +(act)S 181 x(as)S 182 x(both)S 182 x(a)S 181 x(pipeline)S 598 y +4796 X(template)S 165 x(and)S 166 x(when)S 166 x(execu)S 2 x(ted,)S +166 x(a)S 166 x(pipeline)S 166 x(instantiation.)S 896 y 4796 X(Name)S +178 x(is)S 178 x(simply)S 178 x(a)S 178 x(descriptive)S 179 x +(string)S 179 x(assigned)S 178 x(by)S 179 x(the)S 179 x(client.)S +274 x(It)S 178 x(is)S 178 x(used)S 179 x(by)S 179 x(pipeline)S 178 x +(segments)S 598 y 4796 X(to)S 171 x(refer)S 172 x(to)S 171 x(global)S +172 x(inputs)S 172 x(and)S 171 x(outputs,)S 174 x(as)S 171 x(well)S +171 x(as)S 171 x(by)S 172 x(the)S 172 x(server)S 172 x(when)S 172 x +(a)S 171 x(pipeline)S 172 x(is)S 171 x(nested.)S 260 x(The)S 598 y +4796 X(IPC)S 174 x(\(pipeline\))S 175 x(inputs)S 175 x(and)S 176 x +(outputs)S 175 x(represent)S 175 x(formal)S 175 x(parameter)S 175 x +(declarations)S 175 x(for)S 175 x(a)S 175 x(process.)S 267 x(In)S +598 y 4796 X(essence,)S 181 x(they)S 178 x(allow)S 177 x(the)S 178 x +(client)S 178 x(to)S 177 x(type)S 178 x(specify)S 178 x(all)S 177 x +(inputs)S 178 x(into)S 177 x(the)S 178 x(front)S 178 x(end)S 178 x +(of)S 178 x(a)S 177 x(pipeline,)S 181 x(and)S 597 y 4796 X(all)S +183 x(outputs)S 183 x(produced)S 184 x(and)S 183 x(returned)S 185 x +(from)S 183 x(the)S 183 x(tail)S 183 x(end)S 184 x(of)S 183 x(a)S +184 x(pipeline.)S 284 x(Both)S 183 x(input)S 184 x(and)S 183 x +(output)S 598 y 4796 X(parameters)S 168 x(are)S 170 x(implicitly)S +169 x(numbered)S 170 x(by)S 170 x(the)S 169 x(server)S 170 x(beginn)S +2 x(ing)S 170 x(with)S 169 x(zero)S 169 x(\(0\).)S 256 x(This)S 169 x +(numbering)S 171 x(is)S 598 y 4796 X(used)S 166 x(to)S 165 x(refer)S +167 x(to)S 166 x(the)S 166 x(global)S 166 x(inputs)S 166 x(and)S +166 x(outputs.)S 896 y 4796 X(Note)S 184 x(that)S 185 x(the)S 186 x +(size)S 184 x(of)S 185 x(the)S 185 x(list)S 184 x(length)S 186 x +(entry)S 186 x(\(\211rst)S 185 x(\211eld)S 185 x(in)S 186 x(the)S +185 x(list\))S 184 x(for)S 185 x(formal_parm_types)S 185 x(is)S 598 y +4796 X(CAR)S -2 x(D16)S 166 x(\(rather)S 166 x(than)S 167 x(the)S +166 x(default)S 166 x(CARD)S -2 x(8\))S 166 x(to)S 166 x(allow)S +166 x(for)S 166 x(large)S 166 x(templates.)S 897 y 4796 X(IPC')S +-20 x(s)S 170 x(may)S 169 x(be)S 170 x(built,)S 171 x(copied,)S 171 x +(queried,)S 171 x(deleted,)S 171 x(executed,)S 171 x(and)S 170 x +(terminated.)S 257 x(Creation)S 169 x(of)S 170 x(a)S 169 x(resource)S +598 y 4796 X(of)S 167 x(type)S 168 x(IPC)S 168 x(is)S 167 x(the)S +168 x(\211rst)S 168 x(step)S 168 x(in)S 168 x(de\211ning)S 169 x(an)S +168 x(executable)S 169 x(pipeline.)S 253 x(After)S 168 x(this)S 167 x +(step,)S 168 x(the)S 168 x(client)S 168 x(must)S 597 y 4796 X(build)S +175 x(the)S 175 x(pipeline)S 176 x(by)S 176 x(sequentially)S 175 x +(adding)S 176 x(elements)S 175 x(to)S 175 x(the)S 176 x(pipeline)S +175 x(\(XIEP_ADD)S -2 x(_SEGMENT\).)S 598 y 4796 X(When)S 166 x(the)S +166 x(pipeline)S 166 x(construction)S 167 x(is)S 166 x(complete,)S +166 x(execution)S 167 x(may)S 167 x(begin)S 166 x(\(XIEP_EXEC)S -2 x +(UTE_PIPE\).)S 35879 Y 19804 X F40(REQUESTS)S 165 x(AND)S 166 x +(REPLIES)S 447 x(7\2031)S -24 x(1)S +PP +EP +%%DOC$Page: 7-12 40 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(As)S 178 x(an)S 179 x(IPC)S 178 x(represents)S +179 x(both)S 179 x(a)S 179 x(pipeline)S 179 x(template)S 178 x(and)S +179 x(instantiation,)S 182 x(only)S 180 x(one)S 179 x(copy)S 180 x +(of)S 179 x(any)S 179 x(IPC)S 598 y 4796 X(may)S 166 x(be)S 166 x +(executing)S 168 x(at)S 165 x(a)S 166 x(time.)S 250 x(Note)S 165 x +(that)S 166 x(pipelines)S 166 x(may)S 166 x(be)S 166 x(nested)S 166 x +(within)S 166 x(other)S 167 x(pipelines.)S 7257 Y 3600 X F28(7.2.2)S +599 x(Resource)S 167 x(Copy)S 8203 Y 4796 X F102(XIEP_COPY_RESOURCE)S +748 y 5752 X(src_resource_id)S 11012 X({XIT_IOB,XIT_)S 2 x +(IDC,XIT_IPC})S 448 y 5752 X(dst_resource_id)S 11012 X +({XIT_IOB,XIT_)S 2 x(IDC,XIT_IPC})S 448 y 5752 X(resource_type)S +11012 X(XIT_RESOURCE_)S 2 x(TYPE)S 748 y 5752 X(=>)S 747 y -478 x +(none)S 747 y 5752 X(service)S 240 x(class)S 239 x(value:)S 479 x(0)S +448 y 5752 X(errors:)S 11012 X(IDChoice,)S 240 x(ALLOC,)S 240 x +(MATCH)S 449 y 5752 X(events:)S 11012 X(none)S 896 y 4796 X F151 +(XIEP_CO)S -2 x(PY_RESOUR)S -2 x(CE)S 171 x(is)S 170 x(used)S 171 x +(to)S 171 x(copy)S 172 x(the)S 171 x(contents)S 171 x(of)S 171 x(a)S +171 x(source)S 172 x(resource)S 172 x(into)S 171 x(a)S 171 x +(destination)S 598 y 4796 X(resource.)S 263 x(The)S 174 x(client)S +173 x(speci\211es)S 172 x(the)S 173 x(source)S 174 x(resource,)S +175 x(and)S 174 x(the)S 173 x(resource)S 173 x(id)S 173 x(to)S 172 x +(be)S 173 x(used)S 173 x(for)S 173 x(the)S 173 x(new)S 598 y 4796 X +(\(destination\))S 172 x(resource,)S 176 x(as)S 172 x(well)S 173 x +(as)S 172 x(the)S 173 x(resource)S 174 x(type.)S 263 x(The)S 174 x +(server)S 173 x(checks)S 174 x(to)S 173 x(see)S 172 x(that)S 173 x +(the)S 173 x(source)S 597 y 4796 X(resource)S 168 x(is)S 167 x(of)S +168 x(the)S 168 x(type)S 168 x(speci\211ed,)S 168 x(allocates)S 167 x +(a)S 168 x(new)S 168 x(\(destination\))S 167 x(resource)S 168 x(of)S +168 x(the)S 168 x(same)S 167 x(type)S 168 x(as)S 167 x(the)S 598 y +4796 X(source,)S 166 x(and)S 167 x(\211lls)S 166 x(it)S 165 x(with)S +166 x(source)S 166 x(resource)S 167 x(contents.)S 897 y 4796 X +(Src_resource_id)S 185 x(is)S 183 x(the)S 185 x(id)S 184 x(of)S 184 x +(the)S 184 x(source)S 185 x(resource)S 185 x(\(copy)S 185 x(will)S +183 x(occur)S 186 x(from)S 184 x(this)S 184 x(resource\).)S 286 x +(Dst_)S 598 y 4796 X(resource_id)S 174 x(is)S 172 x(the)S 174 x +(client)S 174 x(assigned)S 173 x(id)S 173 x(of)S 174 x(the)S 173 x +(new)S 173 x(\(destination\))S 173 x(resource)S 174 x(\(copy)S 174 x +(will)S 173 x(occur)S 174 x(to)S 174 x(this)S 597 y 4796 X +(resource\).)S 257 x(Resource_type)S 171 x(is)S 169 x(the)S 170 x +(type)S 170 x(of)S 170 x(the)S 170 x(source)S 170 x(resource.)S 258 x +(Upon)S 171 x(completion,)S 171 x(the)S 170 x(destination)S 598 y +4796 X(resource)S 166 x(is)S 166 x(an)S 166 x(exact)S 167 x(copy)S +166 x(of)S 166 x(the)S 167 x(source)S 166 x(resource.)S 897 y 4796 X +(It)S 172 x(is)S 172 x(left)S 173 x(to)S 172 x(the)S 173 x(server)S +174 x(implementor)S 172 x(to)S 173 x(determine)S 173 x(if)S 173 x +(XIEP_CO)S -2 x(PY_RESOURC)S -2 x(E)S 173 x(will)S 172 x(operate)S +173 x(on)S 598 y 4796 X(the)S 168 x(image)S 168 x(data)S 168 x(in)S +168 x(an)S 169 x(IOB)S 167 x(\(ie.)S 253 x(if)S 168 x(it)S 168 x +(will)S 167 x(transfer)S 168 x(both)S 168 x(image)S 169 x +(attributes)S 167 x(and)S 168 x(data)S 168 x(from)S 168 x(source)S +169 x(to)S 597 y 4796 X(destination)S 167 x(IOB)S 167 x(such)S 168 x +(that)S 168 x(no)S 168 x(two)S 168 x(IOB')S -20 x(s)S 167 x(ever)S +169 x(share)S 168 x(the)S 168 x(same)S 168 x(image)S 168 x(data,)S +168 x(or)S 168 x(if)S 168 x(IOB')S -20 x(s)S 168 x(can)S 168 x +(share)S 598 y 4796 X(image)S 166 x(data\).)S 897 y 4796 X(Attempt)S +-2 x(s)S 174 x(to)S 173 x(access)S 173 x(source)S 175 x(resources)S +173 x(which)S 174 x(don')S -9 x(t)S 174 x(exist)S 173 x(or)S 174 x +(to)S 174 x(use)S 174 x(a)S 173 x(resource)S 175 x(id)S 173 x(for)S +174 x(the)S 174 x(destina-)S 597 y 4796 X(tion)S 178 x(resource)S +179 x(which)S 179 x(is)S 178 x(already)S 179 x(in)S 179 x(use)S 179 x +(generates)S 179 x(an)S 179 x(IDChoice)S 178 x(error)S -36 x(.)S +274 x(Inability)S 179 x(to)S 178 x(allocate)S 178 x(the)S 598 y +4796 X(destination)S 169 x(resource)S 170 x(results)S 169 x(in)S +170 x(a)S 170 x(ALLOC)S 169 x(error)S -36 x(.)S 256 x(A)S 170 x +(mismat)S -2 x(ch)S 171 x(between)S 169 x(the)S 170 x(source)S 170 x +(resource)S 170 x(type)S 598 y 4796 X(and)S 166 x(the)S 166 x +(speci\211ed)S 166 x(resource)S 167 x(type)S 166 x(generates)S 167 x +(a)S 166 x(MA)S -28 x(TCH)S 166 x(error)S -36 x(.)S 25837 Y 3600 X +F28(7.2.3)S 599 x(Resource)S 167 x(Delete)S 26784 Y 4796 X F102 +(XIEP_DELETE_RESOURCE)S 747 y 6708 X(resource_id)S 10534 X +({XIT_IOB,)S 240 x(XIT_IDC,)S 240 x(XIT_IPC})S 448 y 6708 X +(resource_typ)S 2 x(e)S 717 x(XIT_RESOURCE_TY)S 2 x(PE)S 748 y 6708 X +(=>)S 747 y -478 x(none)S 747 y 5752 X(service)S 240 x(class)S 239 x +(value:)S 240 x(0)S 448 y 5752 X(errors:)S 10773 X(IDChoice,)S 240 x +(MATCH)S 449 y 5752 X(events:)S 10773 X(none)S 896 y 4796 X F151 +(XIEP_D)S -2 x(ELETE_RESOUR)S -2 x(CE)S 166 x(is)S 165 x(used)S 166 x +(by)S 167 x(a)S 166 x(client)S 166 x(to)S 166 x(delete)S 166 x +(\(deallocate\))S 165 x(server)S 167 x(resources.)S 35879 Y 3600 X +F40(7\20312)S 449 x(REQUESTS)S 166 x(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-13 41 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(Resource_id)S 167 x(identi\211es)S 167 x(the)S +167 x(speci\211c)S 168 x(resource)S 167 x(the)S 168 x(client)S 167 x +(wants)S 167 x(deleted.)S 251 x(Resource_type)S 168 x(is)S 166 x +(the)S 168 x(type)S 598 y 4796 X(of)S 181 x(the)S 182 x(resource)S +182 x(to)S 182 x(be)S 181 x(deleted.)S 281 x(Deletion)S 181 x(of)S +181 x(IOB')S -19 x(s)S 181 x(deletes)S 181 x(the)S 182 x(image)S +182 x(data.)S 280 x(As)S 181 x(under)S 182 x(the)S 182 x(core)S 597 y +4796 X(protocol,)S 166 x(the)S 166 x(management)S 167 x(of)S 166 x +(shared)S 166 x(resources)S 167 x(is)S 165 x(an)S 167 x(application)S +165 x(problem.)S 897 y 4796 X(Attempt)S -2 x(s)S 171 x(to)S 171 x +(delete)S 171 x(a)S 172 x(resource)S 172 x(which)S 171 x(is)S 171 x +(nonexistent)S 172 x(results)S 171 x(in)S 172 x(an)S 171 x(IDChoice)S +171 x(error)S -36 x(.)S 260 x(A)S 171 x(mismatch)S 598 y 4796 X +(between)S 165 x(the)S 167 x(source)S 166 x(resource)S 167 x(type)S +166 x(and)S 166 x(the)S 167 x(speci\211ed)S 166 x(resource)S 166 x +(type)S 167 x(generates)S 166 x(a)S 166 x(MA)S -27 x(TCH)S 166 x +(error)S -37 x(.)S 9349 Y 3600 X F28(7.2.4)S 599 x(Resource)S 167 x +(Query)S 10595 Y 4796 X F102(XIEP_QUERY_RESOURCE)S 747 y 6708 X +(resource_id)S 12447 X({XIT_IOB,)S 240 x(XIT_IDC,)S 240 x(XIT_IPC})S +448 y 6708 X(resource_typ)S 2 x(e)S 717 x(XIT_RESOURCE_TY)S 2 x(PE)S +747 y 5752 X(=>)S 747 y 478 x(resource_dat)S 2 x(a)S 12447 X(-)S +239 x(see)S 239 x(below)S 240 x(-)S 14331 Y 5752 X(service)S 240 x +(class)S 239 x(value:)S 12686 X(-)S 239 x(see)S 240 x(resource)S +239 x(creation)S 240 x(-)S 448 y 5752 X(errors:)S 12686 X(IDChoice,)S +240 x(MATCH)S 448 y 5752 X(events:)S 12686 X(none)S 16273 Y 4796 X +(where)S 239 x(resource_data)S 241 x(is)S 239 x(one)S 239 x(of)S +240 x(the)S 239 x(following:)S 747 y 6708 X({)S 449 y(image_objec)S +2 x(t_resource_data,)S 448 y 6947 X(process_con)S 2 x +(trol_context_resour)S 2 x(ce_data,)S 448 y 6947 X(domain_cont)S +2 x(rol_context_resourc)S 2 x(e_data)S 449 y 6708 X(})S 896 y 4796 X +F151(XIEP_Q)S -2 x(UER)S -19 x(Y_RESOUR)S -2 x(CE)S 184 x(returns)S +184 x(the)S 184 x(contents)S 184 x(of)S 184 x(all)S 184 x(client)S +184 x(readable)S 184 x(\211elds)S 184 x(of)S 184 x(the)S 184 x +(server)S 598 y 4796 X(resource.)S 273 x(All)S 177 x(image)S 178 x +(extension)S 179 x(server)S 178 x(resources)S 178 x(other)S 178 x +(than)S 178 x(the)S 178 x(image)S 178 x(data)S 178 x(itself)S 176 x +(\(within)S 178 x(the)S 598 y 4796 X(IOB)S -2 x(\))S 166 x(can)S +167 x(be)S 166 x(queried.)S 250 x(Image)S 166 x(data)S 166 x(query)S +167 x(is)S 165 x(accomplished)S 166 x(with)S 166 x(a)S 166 x +(different)S 166 x(protocol)S 166 x(function.)S 896 y 4796 X +(Resource_id)S 174 x(is)S 173 x(the)S 174 x(id)S 174 x(of)S 174 x +(the)S 174 x(resource)S 174 x(the)S 175 x(client)S 174 x(wishes)S +173 x(to)S 173 x(query)S -54 x(.)S 265 x(Resource_type)S 175 x(is)S +173 x(the)S 174 x(type)S 175 x(of)S 598 y 4796 X(the)S 168 x +(resource)S 169 x(to)S 168 x(be)S 168 x(queried.Th)S 2 x(e)S 168 x +(data)S 168 x(returned)S 169 x(depends)S 168 x(upon)S 169 x(the)S +169 x(type)S 168 x(of)S 168 x(resource)S 169 x(being)S 169 x +(queried)S 598 y 4796 X(and)S 166 x(is)S 165 x(described)S 166 x(in)S +167 x(the)S 166 x(following)S 166 x(subsections.)S 897 y 4796 X(The)S +173 x(service)S 173 x(class)S 172 x(of)S 173 x(the)S 173 x(resource)S +173 x(query)S 174 x(function)S 174 x(depends)S 173 x(upon)S 173 x +(what)S 173 x(type)S 173 x(of)S 172 x(resource)S 174 x(is)S 172 x +(being)S 597 y 4796 X(queried.)S 286 x(This)S 184 x(is)S 183 x +(discussed)S 184 x(in)S 184 x(each)S 185 x(of)S 184 x(the)S 184 x +(following)S 184 x(subsections.)S 285 x(See)S 184 x(the)S 185 x +(appendices)S 184 x(on)S 184 x(on)S 598 y 4796 X(server)S 166 x +(resources)S 167 x(for)S 166 x(more)S 166 x(details)S 165 x(of)S +166 x(the)S 166 x(attributes.)S 897 y 4796 X(Querying)S 187 x(a)S +186 x(non)S 187 x(existent)S 186 x(resource)S 186 x(generates)S 187 x +(an)S 186 x(IDChoice)S 186 x(error)S -37 x(.)S 290 x(A)S 185 x +(mismatch)S 186 x(between)S 186 x(the)S 598 y 4796 X(source)S 166 x +(resource)S 167 x(type)S 166 x(and)S 166 x(the)S 167 x(speci\211ed)S +166 x(resource)S 166 x(type)S 167 x(generates)S 166 x(a)S 166 x(MA)S +-27 x(TCH)S 166 x(error)S -37 x(.)S 28079 Y 3600 X F36(7.2.4.1)S +599 x(Image)S 167 x(Object)S 166 x(Query)S 747 y 4796 X F102 +(Image_Object_Resourc)S 2 x(e_Data)S 747 y 6708 X(constraint_m)S +2 x(odel)S 14121 X(CARD8)S 449 y 6708 X(pixels-per-s)S 2 x(canline)S +14121 X(CARD32)S 448 y 6708 X(number-of-sc)S 2 x(anlines)S 14121 X +(CARD32)S 448 y 6708 X(aspect_ratio)S 14121 X(XIT_FLOAT)S 449 y +6708 X(polarity)S 14121 X(XIT_POLARITY)S 448 y 6708 X(pixel_progre)S +2 x(ssion)S 14121 X(XIT_PIXEL_PROGRESSI)S 2 x(ON)S 448 y 6708 X +(line_progres)S 2 x(sion)S 14121 X(XIT_LINE_PROGRESSIO)S 2 x(N)S +449 y 6708 X(spectral-com)S 2 x(ponent-mapping)S 14121 X +(XIT_SPECTRAL_COMPON)S 2 x(ENT_MAPPING)S 448 y 6708 X(number-of-sp)S +2 x(ectral-components)S 480 x(CARD8)S 448 y 6708 X(bits_per_com)S +2 x(ponent)S 14121 X(LISTofCARD8)S 35879 Y 19780 X F40(REQUESTS)S +165 x(AND)S 165 x(REPLIES)S 448 x(7\20313)S +PP +EP +%%DOC$Page: 7-14 42 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(The)S 184 x(function)S 185 x(returns)S 184 x(the)S +184 x(contents)S 184 x(of)S 184 x(all)S 184 x(of)S 183 x(the)S 184 x +(queryable)S 185 x(IOB)S 183 x(attribute)S 183 x(\211elds.)S 285 x +(It)S 184 x(does)S 183 x(not)S 598 y 4796 X(return)S 166 x(the)S +167 x(image)S 166 x(data)S 166 x(itself)S 165 x(\(see)S 165 x +(transport)S 166 x(protocol)S 167 x(functions\).)S 896 y 4796 X +(Note)S 183 x(that)S 183 x(constraint)S 183 x(information)S 184 x +(is)S 183 x(never)S 184 x(directly)S 184 x(settable)S 183 x(by)S +183 x(the)S 184 x(client,)S 188 x(but)S 184 x(is)S 183 x(queryable.)S +598 y 4796 X(The)S 171 x(constraint_model)S 171 x(and)S 171 x +(constrain_bits_per_component)S 172 x(\211elds)S 171 x(re\212ect)S +172 x(the)S 171 x(state)S 170 x(of)S 171 x(the)S 171 x(default)S +598 y 4796 X(operational)S 166 x(constraint)S 166 x(model)S 166 x +(when)S 166 x(the)S 166 x(IOB)S 165 x(was)S 165 x(last)S 166 x +(constrained.)S 896 y 4796 X(The)S 166 x(image)S 167 x(object)S 166 x +(query)S 167 x(can)S 167 x(be)S 166 x(viewed)S 166 x(as)S 165 x +(returnin)S 2 x(g)S 166 x(three)S 166 x(classes)S 166 x(of)S 166 x +(information:)S 847 y 6708 X F102(primitive_at)S 2 x(tributes)S +14121 X(-)S 239 x(see)S 239 x(below)S 240 x(-)S 449 y 6708 X +(presentation)S 2 x(_attributes)S 14121 X(-)S 239 x(see)S 239 x +(below)S 240 x(-)S 448 y 6708 X(constraint_i)S 2 x(nfo)S 14121 X(-)S +239 x(see)S 239 x(below)S 240 x(-)S 747 y 4796 X(where:)S 747 y +5274 X(primitive_attribut)S 2 x(es)S 239 x(include:)S 747 y 6708 X +(pixels-per-s)S 2 x(canline)S 449 y 6708 X(number-of-sc)S 2 x +(anlines)S 448 y 6708 X(number-of-sp)S 2 x(ectral-components)S 448 y +6708 X(spectral-com)S 2 x(ponent-mapping)S 748 y 5274 X +(presentation_attri)S 2 x(butes)S 239 x(include:)S 747 y 6708 X +(pixel_progre)S 2 x(ssion)S 448 y 6708 X(line_progres)S 2 x(sion)S +448 y 6708 X(aspect_ratio)S 449 y 6708 X(polarity)S 747 y 5274 X +(constraint_info)S 240 x(includes:)S 747 y 6708 X(constrained)S 449 y +6708 X(constraint_m)S 2 x(odel)S 448 y 6708 X(bits_per_com)S 2 x +(ponent)S 20806 Y 3600 X F36(7.2.4.2)S 599 x(Domain)S 167 x(Control)S +167 x(Context)S 166 x(Query)S 747 y 4796 X F102 +(domain_control_conte)S 2 x(xt_resource_data)S 748 y 5752 X +(idc_type)S 9578 X(XIT_IDC_TYPE)S 448 y 5752 X(idc_data)S 9338 X(-)S +240 x(see)S 239 x(below)S 240 x(-)S 23795 Y 4796 X(Where)S 239 x +(idc_data)S 240 x(depends)S 240 x(on)S 239 x(the)S 240 x(idc_type:)S +747 y 6469 X(.)S 239 x(for)S 240 x(ROI's,)S 240 x(idc_data)S 240 x +(is)S 239 x(the)S 239 x(following)S 240 x(sequence:)S 25588 Y 8143 X +(ul_x)S 12447 X(CARD32)S 449 y 8143 X(ul_y)S 12447 X(CARD32)S 448 y +8143 X(width)S 12447 X(CARD32)S 448 y 8143 X(height)S 12447 X +(CARD32)S 27979 Y 6469 X(.)S 239 x(for)S 240 x(CPP's,)S 240 x +(idc_data)S 240 x(is)S 239 x(the)S 239 x(following:)S 748 y 8143 X +(ul_x)S 12447 X(CARD32)S 448 y 8143 X(ul_y)S 12447 X(CARD32)S 448 y +8143 X(cpp_iob)S 12447 X(XIT_IOB)S 747 y 6469 X(.)S 239 x(for)S 240 x +(TMP's,)S 240 x(idc_data)S 240 x(is)S 239 x(the)S 239 x(following:)S +748 y 7665 X(center_x)S 12447 X(CARD32)S 448 y 7665 X(center_y)S +12447 X(CARD32)S 448 y 7665 X(data_count)S 12447 X(CARD32)S 449 y +7665 X(data)S 12447 X(LISTofTMP_ENTRY)S 747 y 6947 X(where:)S 747 y +-716 x(TMP_ENTRY)S 240 x(is)S 239 x(a)S 239 x(triplet:)S 35879 Y +3600 X F40(7\20314)S 449 x(REQUESTS)S 166 x(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-15 43 +1000 BP 39600 30600 PM 0 0 XY +5065 Y 7665 X F102(x_index)S 12447 X(CARD32)S 448 y 7665 X(y_index)S +12447 X(CARD32)S 448 y 7665 X(tmp_data)S 12447 X(XIT_FLOAT)S 7754 Y +3600 X F36(7.2.4.3)S 599 x(Process)S 166 x(Control)S 167 x(Context)S +166 x(Query)S 748 y 4796 X F102(process_control_cont)S 2 x +(ext_resource_data)S 747 y 6230 X([)S 448 y 239 x(name)S 14121 X +(LISTofSTRING8)S 448 y 6708 X(inputs)S 14121 X(PIPE_IOT)S 449 y +6708 X(outputs)S 14121 X(PIPE_IOT)S 448 y 6708 X(running)S 14121 X +(BOOL)S 448 y 6708 X(segments)S 14121 X(LISTofSEGMENT)S 449 y 6230 X +(])S 747 y 4796 X(where:)S 747 y 5274 X(PIPE_IOT)S 240 x(includes:)S +747 y 6230 X([)S 449 y(number)S 14121 X(CARD8)S 448 y 6469 X +(formal_parm_t)S 2 x(ypes)S 14121 X(LISTofXIT_PARMS)S 448 y 6230 X +(])S 747 y 5274 X(SEGMENT)S 240 x(includes:)S 748 y 6230 X([)S 448 y +(name)S 10534 X(LISTofSTRING8)S 448 y 6469 X(function)S 10534 X +(XIT_XIEFUNCTION)S 449 y 6469 X(parm_bindings)S 10534 X +(LISTofBINDING)S 448 y 6469 X(state)S 10534 X({processing,)S 240 x +(stalled})S 448 y 6230 X(])S 747 y 4796 X(where)S 748 y -717 x +(BINDING)S 240 x(is:)S 747 y 5513 X([)S 448 y(name)S 13403 X +(STRING8)S 449 y 5752 X(number)S 13403 X(CARD32)S 448 y 5513 X(])S +896 y 4796 X F151(The)S 166 x(function)S 167 x(returns)S 167 x(the)S +166 x(contents)S 166 x(of)S 166 x(all)S 166 x(of)S 166 x(the)S 166 x +(queryable)S 167 x(IPC)S 166 x(\211elds.)S 897 y 4796 X(Running)S +190 x(is)S 188 x(a)S 188 x(boolean)S 189 x(which)S 189 x(indicates)S +188 x(if)S 188 x(the)S 189 x(pipeline)S 189 x(has)S 188 x(been)S +189 x(instantiated)S 188 x(and)S 189 x(is)S 188 x(under)S 598 y +4796 X(execution,)S 180 x(or)S 176 x(is)S 176 x(in)S 176 x(the)S +176 x(template)S 176 x(state.)S 268 x(Refer)S 176 x(to)S 176 x(the)S +177 x(sections)S 175 x(on)S 177 x(XIEP_CR)S -2 x(EA)S -28 x +(TE_RESOURC)S -2 x(E)S 598 y 4796 X(\(type)S 180 x(IPC\))S 180 x +(and)S 181 x(XIEP_AD)S -2 x(D_SEGMENT)S 180 x(for)S 180 x(more)S +181 x(details)S 179 x(on)S 181 x(other)S 181 x(\211elds.)S 278 x(If)S +181 x(running)S 182 x(is)S 180 x(true,)S 597 y 4796 X(then)S 182 x +(the)S 183 x(state)S 181 x(\211eld)S 182 x(in)S 183 x(the)S 182 x +(segments)S 182 x(list)S 182 x(elements)S 182 x(is)S 181 x +(meaningfu)S 2 x(l)S 182 x(and)S 182 x(describes)S 182 x(the)S 182 x +(curren)S 2 x(t)S 598 y 4796 X(state)S 165 x(of)S 166 x(each)S 166 x +(pipeline)S 166 x(element)S 167 x(\(either)S 166 x(processing,)S +167 x(or)S 166 x(stalled)S 165 x(awaiting)S 166 x(data\).)S 28527 Y +3600 X F28(7.2.5)S 599 x(Import/Export)S 167 x(Services)S 29622 Y +4796 X F151(Import/Export)S 180 x(class)S 180 x(services)S 180 x +(provide)S 181 x(for)S 181 x(the)S 181 x(direct)S 180 x(movement)S +181 x(of)S 181 x(image)S 180 x(data)S 180 x(and)S 181 x(attributes)S +598 y 4796 X(between)S 188 x(extension)S 190 x(package)S 190 x +(objects)S 189 x(\(IOB')S -20 x(s\))S 188 x(and)S 189 x(core)S 190 x +(server)S 189 x(objects)S 189 x(\(drawable\).)S 295 x(The)S 190 x +(term)S 598 y 4796 X("direct")S 174 x(means)S 175 x(that)S 175 x +(other)S 175 x(than)S 175 x(issuing)S 176 x(the)S 175 x(protocol)S +175 x(request,)S 177 x(no)S 176 x(further)S 176 x(client)S 175 x +(intervention)S 176 x(is)S 598 y 4796 X(required)S 153 x(\(the)S +153 x(image)S 153 x(data)S 153 x(does)S 152 x(not)S 153 x(have)S +154 x(to)S 153 x(move)S 153 x(back)S 153 x(and)S 153 x(forth)S 154 x +(across)S 152 x(the)S 153 x(wire\).)S 249 x(These)S 153 x(services)S +597 y 4796 X(are)S 178 x(provided)S 179 x(in)S 178 x(order)S 179 x +(to)S 178 x(allow)S 177 x(some)S 178 x(server)S 179 x(level)S 179 x +(mechanism)S 178 x(for)S 178 x(data)S 178 x(exchang)S 2 x(e)S 178 x +(between)S 178 x(the)S 598 y 4796 X(image)S 166 x(extension)S 167 x +(and)S 166 x(the)S 166 x(core)S 167 x(as)S 165 x(well)S 166 x(as)S +165 x(other)S 167 x(extension)S 166 x(packages.)S 35879 Y -457 x F40 +(REQUESTS)S 165 x(AND)S 165 x(REPLIES)S 448 x(7\20315)S +PP +EP +%%DOC$Page: 7-16 44 +1000 BP 39600 30600 PM 0 0 XY +5155 Y 3600 X F36(7.2.5.1)S 599 x(Import)S 167 x(Image)S 747 y 4796 X +F102(XIEP_IMPORT_IMAGE)S 748 y 6708 X(iob_id)S 10295 X(XIT_IOB)S +448 y 6708 X(drawable)S 10295 X(DRAWABLE)S 747 y 6708 X(=>)S 747 y +-478 x(none)S 747 y 5752 X(service)S 240 x(class)S 239 x(value:)S +240 x(0)S 449 y 5752 X(errors:)S 718 x(DRAWABLE,)S 240 x(MATCH,)S +240 x(ALLOC,)S 239 x(IDChoice)S 448 y 5752 X(events:)S 12447 X(none)S +897 y 4796 X F151(XIEP_IMPOR)S -2 x(T_IMAGE)S 167 x(transfers)S 167 x +(image)S 168 x(data)S 167 x(and)S 168 x(attributes)S 167 x(from)S +167 x(an)S 168 x(existing)S 169 x(server)S 168 x(drawable)S 598 y +4796 X(into)S 166 x(a)S 166 x(new)S 166 x(server)S 166 x(IOB.)S 896 y +4796 X(IOB)S -2 x(_id)S 173 x(is)S 173 x(the)S 173 x(id)S 172 x(to)S +173 x(be)S 173 x(assigned)S 173 x(to)S 173 x(the)S 173 x(new)S 172 x +(IOB.)S 173 x(Drawable)S 172 x(is)S 172 x(the)S 173 x(id)S 173 x(of)S +173 x(a)S 172 x(core)S 174 x(server)S 173 x(drawable)S 598 y 4796 X +(resource)S 178 x(that)S 177 x(the)S 178 x(image)S 177 x(data)S 178 x +(and)S 177 x(attributes)S 177 x(will)S 177 x(come)S 178 x(from.)S +272 x(The)S 178 x(drawable)S 177 x(may)S 178 x(be)S 177 x(either)S +178 x(a)S 598 y 4796 X(pixmap)S 166 x(or)S 166 x(a)S 166 x(window)S +-47 x(.)S 896 y 4796 X(The)S 172 x(server)S 172 x(creates)S 172 x(a)S +172 x(new)S 172 x(IOB)S 170 x(to)S 172 x(receive)S 173 x(the)S 172 x +(image)S 172 x(data)S 171 x(and)S 172 x(attributes.)S 261 x(The)S +172 x(client)S 172 x(accessible)S 598 y 4796 X(IOB)S 187 x +(attributes)S 188 x(\(primitive)S 188 x(and)S 189 x(presentation\))S +188 x(derive)S 190 x(from)S 188 x(information)S 189 x(associated)S +187 x(with)S 189 x(the)S 598 y 4796 X(drawable.)S 257 x(Data)S 169 x +(formatting)S 171 x(information)S 170 x(\(organization)S 171 x(and)S +170 x(encoding)S 2 x(\))S 170 x(which)S 170 x(is)S 170 x(involved)S +172 x(in)S 170 x(wire)S 598 y 4796 X(transport)S 165 x(plays)S 166 x +(no)S 167 x(visible)S 166 x(role)S 166 x(in)S 166 x(the)S 166 x +(process.)S 896 y 4796 X(Note)S 175 x(that)S 175 x(all)S 176 x +(drawable)S 175 x(image)S 176 x(data)S 175 x(is)S 175 x(imported)S +175 x(\(no)S 176 x(subregion)S 176 x(speci\211cation)S 176 x(is)S +175 x(allowed)S 175 x(and)S 176 x(no)S 598 y 4796 X(import)S 172 x +(processing)S 173 x(such)S 174 x(as)S 172 x(masking)S 174 x(is)S +172 x(allowed\).)S 263 x(Clients)S 172 x(wishing)S 173 x(to)S 173 x +(import)S 172 x(only)S 174 x(a)S 173 x(portion)S 173 x(of)S 173 x(a)S +598 y 4796 X(drawable)S 171 x(must)S 172 x(extract)S 172 x(the)S +172 x(portion)S 172 x(into)S 172 x(a)S 172 x(new)S 172 x(drawable)S +172 x(before)S 172 x(using)S 172 x(XIEP_IMPORT_IMAGE)S 597 y 4796 X +(or)S 167 x(crop)S 167 x(the)S 168 x(IOB)S 166 x(after)S 167 x +(import.)S 251 x(Clients)S 167 x(wishing)S 167 x(to)S 167 x(process)S +167 x(\(such)S 168 x(as)S 167 x(mask\))S 166 x(the)S 168 x(data)S +167 x(should)S 167 x(use)S 167 x(X)S 598 y 4796 X(Image)S 166 x +(Extension)S 166 x(functions)S 167 x(to)S 165 x(do)S 166 x(so)S 166 x +(once)S 167 x(the)S 166 x(data)S 166 x(has)S 166 x(been)S 166 x +(imported)S 166 x(into)S 166 x(an)S 166 x(IOB.)S 897 y 4796 X(For)S +185 x(windows,)S 190 x(pixels-per)S -9 x(-scanline)S 186 x(and)S +186 x(number)S -9 x(-of-scanlines)S 185 x(derive)S 187 x(from)S 185 x +(window)S 185 x(width)S 185 x(and)S 598 y 4796 X(height)S 164 x +(respectively)S -54 x(,)S 165 x(while)S 164 x(number)S -9 x +(-of-spectral-components)S 164 x(and)S 164 x +(spectral-component-mapping)S 164 x(are)S 597 y 4796 X(inferred)S +166 x(from)S 166 x(the)S 166 x(visual)S 167 x(type)S 166 x(of)S 166 x +(the)S 166 x(window)S -46 x(.)S 897 y 4796 X(For)S 187 x(pixmaps,)S +192 x(pixels-per)S -9 x(-scanline)S 188 x(and)S 187 x(number)S -8 x +(-of-scanlines)S 187 x(derive)S 187 x(from)S 187 x(pixmap)S 187 x +(width)S 187 x(and)S 598 y 4796 X(height)S 164 x(respectively)S -54 x +(,)S 165 x(while)S 164 x(number)S -9 x(-of-spectral-components)S +164 x(and)S 164 x(spectral-component-mapping)S 164 x(are)S 598 y +4796 X(inferred)S 166 x(from)S 166 x(\(TBS\).)S 896 y 4796 X(In)S +166 x(all)S 165 x(cases,)S 166 x(the)S 167 x(resulting)S 166 x(IOB)S +165 x(is)S 166 x(in)S 166 x(the)S 166 x(constrained)S 167 x(state.)S +897 y 4796 X(In)S 181 x(either)S 181 x(case)S 181 x(\(pixmap)S 181 x +(or)S 181 x(window\),)S 185 x(the)S 181 x(default)S 181 x +(presentation)S 181 x(attributes)S 180 x(associated)S 180 x(with)S +181 x(the)S 598 y 4796 X(image)S 155 x(data)S 156 x(in)S 156 x(the)S +155 x(IOB)S 155 x(\(pixel-progression,)S 159 x(line-progression,)S +159 x(aspect-ratio,)S 157 x(polarity)S -55 x(,)S 158 x(and)S 156 x +(grid-type\))S 597 y 4796 X(derive)S 166 x(from)S 166 x(server)S +167 x(private)S 166 x(knowledge)S 167 x(of)S 166 x(the)S 166 x +(display)S 166 x(device.)S 897 y 4796 X(If)S 171 x(drawable)S 172 x +(does)S 171 x(not)S 173 x(specify)S 172 x(a)S 172 x(valid)S 172 x +(drawable,)S 173 x(then)S 173 x(a)S 172 x(Drawable)S 171 x(error)S +173 x(occurs.)S 262 x(If)S 171 x(the)S 173 x(drawable)S 598 y 4796 X +(is)S 168 x(an)S 169 x(input)S 169 x(only)S 170 x(window)S -47 x(,)S +170 x(a)S 169 x(Match)S 169 x(error)S 170 x(occurs.)S 255 x(If)S +169 x(the)S 169 x(client)S 169 x(speci\211ed)S 168 x(IOB)S 168 x(id)S +169 x(is)S 168 x(already)S 169 x(in)S 169 x(use,)S 598 y 4796 X(an)S +166 x(IDChoice)S 165 x(error)S 167 x(occurs.)S 250 x(If)S 166 x(the)S +166 x(server)S 167 x(can)S 166 x(not)S 166 x(allocate)S 166 x(the)S +167 x(IOB)S -2 x(,)S 167 x(an)S 166 x(ALLOC)S 166 x(error)S 166 x +(occurs.)S 35879 Y 3600 X F40(7\20316)S 449 x(REQUESTS)S 166 x(AND)S +165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-17 45 +1000 BP 39600 30600 PM 0 0 XY +5155 Y 3600 X F36(7.2.5.2)S 599 x(Export)S 167 x(Image)S 747 y 4796 X +F102(XIEP_EXPORT_IMAGE)S 748 y 6708 X(iob_id)S 10295 X(XIT_IOB)S +448 y 6708 X(drawable)S 10295 X(DRAWABLE)S 448 y 6708 X(gc)S 10295 X +(GCONTEXT)S 449 y 6708 X(src_x)S 10295 X(INT32)S 448 y 6708 X(src_y)S +10295 X(INT32)S 448 y 6708 X(width)S 10295 X(CARD32)S 448 y 6708 X +(height)S 10295 X(CARD32)S 449 y 6708 X(dst_x)S 10295 X(INT32)S 448 y +6708 X(dst_y)S 10295 X(INT32)S 747 y 6708 X(=>)S 748 y -478 x(none)S +747 y 5752 X(service)S 240 x(class)S 239 x(value:)S 12447 X(0)S 448 y +5752 X(errors:)S 718 x(IDChoice,)S 240 x(MATCH)S 448 y 5752 X +(events:)S 12447 X(none)S 897 y 4796 X F151(XIEP_EX)S -2 x +(PORT_IMAGE)S 169 x(combines)S 171 x(image)S 171 x(data)S 170 x +(from)S 171 x(a)S 171 x(rectangular)S 172 x(region)S 171 x(of)S 171 x +(an)S 171 x(existing)S 171 x(server)S 598 y 4796 X(IOB)S 164 x(with)S +166 x(data)S 166 x(in)S 166 x(a)S 166 x(rectangular)S 167 x(region)S +168 x(of)S 166 x(an)S 166 x(existing)S 167 x(server)S 166 x(DRA)S +-47 x(W)S -46 x(ABLE.)S 896 y 4796 X(IOB)S -2 x(_id)S 175 x(is)S +174 x(the)S 175 x(id)S 175 x(of)S 175 x(the)S 174 x(source)S 176 x +(image)S 175 x(object.)S 267 x(Drawable)S 174 x(is)S 174 x(the)S +175 x(id)S 175 x(of)S 174 x(the)S 175 x(receiving)S 177 x(DRA)S -47 x +(W)S -47 x(ABLE)S 598 y 4796 X(\(WIND)S -2 x(OW)S 170 x(or)S 172 x +(PIXMAP\).)S 171 x(GC_id)S 170 x(is)S 170 x(the)S 171 x(graphic)S +172 x(context)S 172 x(used)S 171 x(to)S 171 x(provide)S 171 x +(information)S 171 x(used)S 171 x(when)S 598 y 4796 X(\211lling)S +183 x(the)S 184 x(drawable.)S 283 x(Src_x)S 183 x(and)S 184 x(src_y)S +183 x(are)S 183 x(the)S 184 x(location)S 183 x(of)S 183 x(the)S 183 x +(upper)S 183 x(left)S 183 x(hand)S 184 x(corner)S 184 x(of)S 183 x +(the)S 598 y 4796 X(source)S 164 x(IOB)S 164 x(data.)S 249 x(W)S +-19 x(idth)S 165 x(and)S 164 x(heigh)S 2 x(t)S 164 x(de\211ne)S 165 x +(how)S 164 x(much)S 166 x(data)S 164 x(to)S 164 x(transfer)S -37 x +(.)S 250 x(Dst_x)S 164 x(and)S 164 x(dst_y)S 165 x(are)S 164 x(the)S +597 y 4796 X(location)S 166 x(of)S 166 x(the)S 166 x(upper)S 166 x +(left)S 166 x(hand)S 167 x(corner)S 167 x(of)S 166 x(the)S 166 x +(destination)S 166 x(location)S 166 x(in)S 166 x(the)S 166 x +(receivin)S 2 x(g)S 166 x(DRA)S -47 x(W)S -46 x(ABLE.)S 897 y 4796 X +(XIEP_EX)S -2 x(PORT_IMAGE)S 182 x(is)S 182 x(similar)S 182 x(in)S +183 x(many)S 184 x(aspects)S 182 x(to)S 182 x(the)S 183 x(core)S +183 x(X)S 183 x(copy_area)S 184 x(function.)S 283 x(The)S 598 y +4796 X(similariti)S -2 x(es)S 158 x(include)S 159 x(transfer)S 157 x +(of)S 158 x(image)S 158 x(data)S 158 x(into)S 158 x(a)S 158 x +(server)S 158 x(resource)S 159 x(with)S 157 x(control)S 159 x(over)S +158 x(subarea)S 158 x(and)S 598 y 4796 X(combination)S 173 x(of)S +174 x(source)S 174 x(and)S 173 x(destination)S 173 x(data,)S 176 x +(as)S 173 x(well)S 173 x(as)S 173 x(the)S 173 x(requirement)S 174 x +(that)S 174 x(the)S 173 x(data)S 173 x(format)S 597 y 4796 X(must)S +171 x(match)S 173 x(that)S 172 x(of)S 172 x(the)S 173 x(receiving)S +174 x(resource)S 173 x(\(no)S 172 x(format)S 173 x(conversion)S 173 x +(or)S 173 x(mismatches)S 171 x(supported)S 172 x(or)S 598 y 4796 X +(allowed\).)S 897 y 4796 X(XIEP_EX)S -2 x(PORT_IMAGE)S 179 x(will)S +180 x(only)S 181 x(transfer)S 181 x(data)S 180 x(between)S 180 x +(and)S 181 x(IOB)S 179 x(and)S 181 x(a)S 180 x(DRA)S -47 x(W)S -46 x +(ABLE.)S 180 x(It)S 180 x(is)S 597 y 4796 X(not)S 187 x(capable)S +187 x(of)S 187 x(reconciling)S 189 x(differences)S 187 x(between)S +187 x(the)S 188 x(IOB)S 186 x(data)S 186 x(and)S 188 x(the)S 187 x +(pixmap)S 188 x(formats.)S 291 x(In)S 598 y 4796 X(other)S 171 x +(words,)S 173 x(the)S 171 x(process)S 171 x(of)S 172 x(reconciling)S +173 x(the)S 171 x(differences)S 172 x(between)S 171 x(what)S 171 x +(have)S 172 x(been)S 172 x(referred)S 172 x(to)S 171 x(as)S 598 y +4796 X(revisable)S 171 x(form)S 171 x(images)S 171 x(and)S 171 x +(what)S 171 x(the)S 171 x(display)S 171 x(device)S 172 x(can)S 171 x +(show)S 171 x(\(this)S 171 x(is)S 170 x(re\212ected)S 172 x(in)S +171 x(DRA)S -47 x(W)S -46 x(ABLE)S 598 y 4796 X(formats\))S 186 x +(must)S 187 x(occur)S 189 x(prior)S 188 x(to)S 187 x(export.)S 293 x +(This)S 188 x(reconciliation)S 188 x(process)S 187 x(is)S 187 x +(what)S 187 x(is)S 188 x(referred)S 188 x(to)S 187 x(as)S 598 y +4796 X(rendition)S 166 x(and)S 166 x(must)S 166 x(be)S 166 x +(performed)S 166 x(before)S 166 x(export.)S 896 y 4796 X(Thus,)S +175 x(prior)S 173 x(to)S 172 x(use)S 173 x(of)S 173 x(export_image,)S +176 x(the)S 172 x(IOB)S 172 x(must)S 172 x(be)S 173 x(constrained)S +173 x(and)S 173 x(the)S 173 x(client)S 173 x(should)S 173 x(apply)S +598 y 4796 X(various)S 171 x(rendition)S 171 x(steps/operations)S +170 x(\(such)S 170 x(as)S 171 x(scale,)S 171 x(crop,)S 173 x(...\))S +259 x(to)S 170 x(ensure)S 172 x(that)S 170 x(the)S 171 x(IOB)S 169 x +(image)S 171 x(data)S 598 y 4796 X(is)S 165 x(compatible)S 166 x +(with)S 165 x(the)S 167 x(receiving)S 167 x(DRA)S -47 x(W)S -46 x +(ABLE.)S 896 y 4796 X(If)S 173 x(iob_id)S 174 x(or)S 174 x(drawable)S +174 x(specify)S 174 x(invalid)S 174 x(\(nonexistent\))S 175 x +(resources,)S 176 x(an)S 175 x(IDChoice)S 173 x(error)S 175 x +(occurs.)S 266 x(If)S 173 x(an)S 598 y 4796 X(attempt)S 178 x(is)S +178 x(made)S 179 x(to)S 179 x(export)S 180 x(an)S 180 x(IOB)S 178 x +(into)S 179 x(a)S 179 x(pixmap)S 179 x(such)S 180 x(that)S 179 x +(the)S 179 x(IOB)S 178 x(is)S 179 x(unconstrained)S 180 x(or)S 180 x +(its)S 598 y 4796 X(data)S 179 x(is)S 179 x(incompatible)S 180 x +(with)S 179 x(the)S 180 x(data)S 179 x(formats)S 179 x(which)S 180 x +(a)S 180 x(DRA)S -47 x(W)S -47 x(ABLE)S 179 x(can)S 180 x(contain)S +181 x(\(see)S 179 x(core)S 180 x(X1)S -28 x(1)S 598 y 4796 X +(protocol)S 166 x(connection)S 167 x(function\),)S 167 x(then)S 167 x +(a)S 166 x(MA)S -28 x(TCH)S 166 x(error)S 167 x(occurs.)S 35879 Y +19780 X F40(REQUESTS)S 165 x(AND)S 165 x(REPLIES)S 448 x(7\20317)S +PP +EP +%%DOC$Page: 7-18 46 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(7.3)S 599 x(T)S -33 x(ransport)S 167 x(Services)S +6838 Y 4796 X F151(T)S -31 x(ransport)S 181 x(class)S 180 x +(services)S 181 x(provide)S 182 x(the)S 181 x(means)S 181 x(for)S +181 x(exchang)S 2 x(e)S 181 x(of)S 180 x(image)S 182 x(data)S 180 x +(between)S 181 x(client)S 181 x(and)S 598 y 4796 X(server)S -37 x(.)S +250 x(T)S -31 x(ransport)S 166 x(protocol)S 166 x(functions)S 167 x +(include:)S 896 y 4796 X(\201)S 594 x(XIEP_SET_TRANSPOR)S -2 x(T)S +166 x(-)S 166 x(establishes)S 165 x(the)S 166 x(required)S 167 x +(transport)S 166 x(context)S 167 x(information)S 747 y 4796 X(\201)S +594 x(XIEP_ABO)S -2 x(RT_TRANSPORT)S 165 x(-)S 166 x(aborts)S 166 x +(transport)S 166 x(&)S 166 x(clears)S 166 x(transport)S 166 x +(context)S 166 x(information)S 748 y 4796 X(\201)S 594 x +(XIEP_GET_TILE)S 178 x(-)S 179 x(transports)S 179 x(random)S 179 x +(tiles)S 178 x(of)S 179 x(uncompressed)S 180 x(image)S 179 x(data)S +179 x(from)S 179 x(server)S 179 x(to)S 597 y 5692 X(client)S 748 y +4796 X(\201)S 594 x(XIEP_PUT_TILE)S 181 x(-)S 182 x(transports)S +181 x(random)S 181 x(tiles)S 181 x(of)S 181 x(uncompressed)S 182 x +(image)S 182 x(data)S 181 x(from)S 181 x(client)S 182 x(to)S 597 y +5692 X(server)S 748 y 4796 X(\201)S 594 x(XIEP_GET_STRE)S -2 x(AM)S +178 x(-)S 178 x(transports)S 177 x(a)S 178 x(stream)S 177 x(of)S +178 x(compressed)S 177 x(or)S 178 x(uncompressed)S 178 x(image)S +178 x(data)S 597 y 5692 X(from)S 166 x(server)S 167 x(to)S 166 x +(client)S 748 y 4796 X(\201)S 594 x(XIEP_PUT_STREAM)S 177 x(-)S 178 x +(transports)S 178 x(a)S 177 x(stream)S 178 x(of)S 178 x(compressed)S +177 x(or)S 178 x(uncompressed)S 179 x(image)S 178 x(data)S 597 y +5692 X(from)S 166 x(client)S 166 x(to)S 166 x(server)S 15954 Y 3600 X +F28(7.3.1)S 599 x(Overview)S 167 x(of)S 167 x(Data)S 166 x(T)S -33 x +(ransport)S 17050 Y 4796 X F151(This)S 175 x(section)S 176 x +(addresses)S 175 x(the)S 176 x(overall)S 176 x(image)S 176 x(data)S +176 x(transport)S 175 x(process,)S 179 x(transport)S 175 x(modes,)S +179 x(transport)S 597 y 4796 X(data)S 179 x(formats,)S 184 x +(transport)S 180 x(synchron)S 2 x(ization,)S 184 x(and)S 180 x +(transport)S 180 x(granu)S 2 x(larity)S 180 x(&)S 180 x(atomicity)S +-55 x(.)S 278 x(Details)S 179 x(of)S 598 y 4796 X(these)S 165 x +(subjects)S 167 x(are)S 166 x(found)S 166 x(within)S 166 x(the)S +166 x(data)S 166 x(transport)S 166 x(protocol)S 166 x +(de\211nitions.)S 19739 Y 3600 X F36(7.3.1.1)S 599 x(T)S -27 x +(ransport)S 166 x(Process)S 897 y 4796 X F151(In)S 181 x +(client->server)S 183 x(transfers,)S 186 x(the)S 181 x(client)S 182 x +(usually)S 183 x(begins)S 182 x(by)S 182 x(creating)S 183 x(a)S 182 x +(new)S 181 x(image)S 182 x(object)S 183 x(\(IOB)S -2 x(\))S 598 y +4796 X(using)S 182 x(XIEP_CRE)S -2 x(A)S -27 x(TE_RESO)S -2 x(URCE)S +181 x(and)S 182 x(establishing)S 182 x(primitive)S 182 x(and)S 182 x +(presentation)S 182 x(attributes)S 598 y 4796 X(as)S 180 x(it)S 181 x +(does.)S 280 x(Note)S 181 x(that)S 181 x(while)S 181 x +(client->server)S 182 x(transport)S 181 x(is)S 180 x(usually)S 182 x +(done)S 182 x(to)S 181 x(a)S 181 x(new)S 181 x(\(empty\))S 181 x +(IOB,)S 597 y 4796 X(an)S 179 x(existing)S 179 x(IOB)S 178 x(\(one)S +179 x(which)S 179 x(already)S 180 x(contains)S 179 x(image)S 179 x +(data)S 178 x(deriving)S 180 x(from)S 179 x(a)S 179 x(prior)S 179 x +(transport)S 179 x(or)S 598 y 4796 X(processing)S 166 x(operation\))S +166 x(may)S 167 x(be)S 166 x(used)S 166 x(to)S 165 x(receive)S 167 x +(the)S 167 x(transport)S 166 x(image)S 166 x(data.)S 897 y 4796 X +(The)S 173 x(client)S 173 x(then)S 174 x(proceeds)S 173 x(to)S 173 x +(establis)S -2 x(h)S 174 x(the)S 173 x(transport)S 173 x(context)S +173 x(\(XIEP_SET_TRANSPOR)S -2 x(T\))S 173 x(which)S 598 y 4796 X +(controls)S 173 x(the)S 174 x(format)S 173 x(of)S 174 x(image)S 173 x +(data)S 173 x(on)S 174 x(the)S 174 x(wire)S 173 x(for)S 174 x(this)S +173 x(transport)S 174 x(sess)S -2 x(ion)S 174 x(to)S 174 x(the)S +173 x(speci\211ed)S 174 x(IOB.)S 597 y 4796 X(Finally)S -55 x(,)S +178 x(the)S 175 x(client)S 175 x(transfers)S 175 x(the)S 175 x +(image)S 176 x(data)S 174 x(from)S 175 x(its)S 175 x(buffer)S 175 x +(to)S 175 x(the)S 175 x(server)S 176 x(IOB)S 174 x(through)S 177 x +(one)S 175 x(or)S 598 y 4796 X(more)S 182 x(transport)S 183 x(calls)S +182 x(\(XIEP_PUT_TILE)S 183 x(or)S 182 x(XIEP_PUT_STREAM\).)S 183 x +(The)S 183 x(transport)S 183 x(sessi)S -2 x(on)S 184 x(is)S 598 y +4796 X(completed)S 173 x(when)S 174 x(a)S 173 x(\211nal)S 175 x +(\212ag)S 174 x(is)S 173 x(set)S 173 x(in)S 174 x(one)S 174 x(of)S +174 x(the)S 174 x(transport)S 173 x(functions,)S 177 x(or)S 174 x +(when)S 174 x(the)S 173 x(transport)S 174 x(is)S 598 y 4796 X +(aborted)S 165 x(via)S 167 x(XIEP_FREE)S -2 x(_TRANSPORT)S -46 x(.)S +896 y 4796 X(In)S 187 x(server)S -8 x(->client)S 187 x(transfers,)S +193 x(the)S 188 x(IOB)S 187 x(already)S 188 x(exists)S 187 x(and)S +188 x(is)S 187 x(\211lled)S 188 x(with)S 187 x(image)S 188 x(data.)S +292 x(In)S 188 x(this)S 598 y 4796 X(case,)S 176 x(the)S 174 x +(client)S 174 x(proceeds)S 174 x(to)S 174 x(establish)S 173 x(the)S +174 x(transport)S 174 x(context)S 175 x(\(XIEP_SET_TRA)S -2 x +(NSPORT\))S 174 x(which)S 598 y 4796 X(controls)S 161 x(the)S 163 x +(format)S 161 x(of)S 162 x(image)S 162 x(data)S 161 x(on)S 163 x +(the)S 162 x(wire)S 161 x(for)S 162 x(this)S 162 x(transport)S 161 x +(session)S 161 x(from)S 162 x(the)S 162 x(speci\211ed)S 162 x(IOB.)S +597 y 4796 X(Then)S 161 x(the)S 161 x(client)S 160 x(transfers)S +161 x(the)S 160 x(image)S 161 x(data)S 160 x(from)S 161 x(the)S 160 x +(server)S 161 x(IOB)S 160 x(to)S 160 x(its)S 160 x(buffer)S 161 x +(through)S 162 x(one)S 161 x(or)S 160 x(more)S 598 y 4796 X +(transport)S 165 x(calls)S 166 x(\(XIEP_GE)S -2 x(T_TILE)S 167 x(or)S +166 x(XIEP_GET_STRE)S -2 x(AM\).)S 897 y 4796 X(Due)S 171 x(to)S +172 x(size)S 171 x(limitations)S 172 x(on)S 172 x(protocol)S 172 x +(messages)S 171 x(and/or)S 173 x(client)S 172 x(preferences,)S 175 x +(transport)S 172 x(may)S 172 x(involve)S 598 y 4796 X(one)S 166 x +(or)S 166 x(many)S 167 x(transport)S 166 x(protocol)S 166 x +(function)S 167 x(invocations.)S 35879 Y 3600 X F40(7\20318)S 449 x +(REQUESTS)S 166 x(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-19 47 +1000 BP 39600 30600 PM 0 0 XY +5155 Y 3600 X F36(7.3.1.2)S 599 x(T)S -27 x(ransport)S 166 x(Modes)S +897 y 4796 X F151(Image)S 176 x(data)S 175 x(transport)S 176 x(is)S +175 x(divided)S 176 x(into)S 176 x(two)S 176 x(modes:)S 268 x +(random)S 177 x(access)S 175 x(tiled,)S 179 x(and)S 176 x +(sequential)S 176 x(access)S 598 y 4796 X(stream.)S 896 y 4796 X +(Random)S 175 x(access)S 175 x(tiled)S 175 x(transport)S 175 x(is)S +175 x(designed)S 175 x(to)S 175 x(allow)S 175 x(exchan)S 2 x(ge)S +175 x(of)S 176 x(uncompressed)S 175 x(tiles)S 175 x(of)S 175 x +(image)S 598 y 4796 X(data)S 159 x(between)S 160 x(client)S 161 x +(buffer)S 160 x(and)S 161 x(IOB.)S 159 x(The)S 161 x(client)S 161 x +(speci)S +(\211es)S 160 x(both)S 160 x(tile)S 160 x(size)S 159 x(and)S 161 x +(IOB)S 159 x(relative)S 160 x(location)S 598 y 4796 X(on)S 174 x(a)S +174 x(transport)S 174 x(function)S 175 x(call)S 174 x(basis.)S 264 x +(T)S -12 x(iles)S 174 x(may)S 174 x(be)S 174 x(as)S 174 x(small)S +173 x(as)S 174 x(a)S 174 x(single)S 174 x(pixel,)S 177 x(or)S 174 x +(as)S 174 x(large)S 174 x(as)S 174 x(the)S 597 y 4796 X(transport)S +165 x(protocol)S 167 x(message)S 165 x(can)S 167 x(handle.)S 897 y +4796 X(Sequential)S 184 x(access)S 184 x(stream)S 184 x(transport)S +184 x(is)S 184 x(designed)S 184 x(to)S 184 x(allow)S 184 x(exchan)S +2 x(ge)S 184 x(of)S 185 x(either)S 184 x(uncompressed)S 598 y 4796 X +(image)S 170 x(data)S 170 x(or)S 171 x(compressed)S 169 x(image)S +171 x(code)S 171 x(information)S 170 x(in)S 171 x(a)S 170 x +(sequential)S 170 x(stream)S 170 x(format.)S 258 x(No)S 170 x +(random)S 598 y 4796 X(access)S 165 x(is)S 166 x(allowed)S 165 x(in)S +166 x(this)S 166 x(mode.)S 896 y 4796 X(The)S 174 x(use)S 174 x(of)S +173 x(image)S 174 x(data)S 173 x(compression)S 174 x(in)S 174 x +(sequential)S 174 x(access)S 173 x(stream)S 173 x(transport)S 174 x +(involves)S 174 x(a)S 174 x(tradeoff)S 598 y 4796 X(between)S 169 x +(processing)S 171 x(and)S 170 x(communications)S 171 x(bandwidth.)S +257 x(The)S 171 x(availability)S 170 x(of)S 171 x(processing)S 170 x +(power)S 170 x(\(in-)S 598 y 4796 X(cluding)S 168 x(specialized)S +166 x(compression/decompression)S 167 x(engines\),)S 169 x(and)S +167 x(the)S 167 x(available)S 167 x(bandwidth)S 167 x(between)S 598 y +4796 X(client)S 178 x(and)S 179 x(server)S 178 x(should)S 179 x +(both)S 178 x(factor)S 179 x(into)S 178 x(the)S 179 x(choice)S 179 x +(between)S 178 x(compressed)S 178 x(and)S 178 x(uncompressed)S 597 y +4796 X(image)S 166 x(data)S 165 x(transport.)S 897 y 4796 X(When)S +167 x(compression)S 166 x(is)S 166 x(used)S 167 x(with)S 166 x +(sequential)S 167 x(access)S 166 x(stream)S 166 x(mode,)S 167 x +(image)S 167 x(code)S 167 x(information)S 167 x(rather)S 598 y 4796 X +(than)S 171 x(image)S 172 x(data)S 171 x(is)S 170 x(transported.)S +260 x(The)S 172 x(image)S 172 x(can)S 172 x(be)S 171 x(recovered)S +172 x(\(with)S 171 x(varying)S 173 x(degrees)S 172 x(of)S 171 x +(\211delity)S 597 y 4796 X(based)S 178 x(upon)S 180 x(the)S 179 x +(compression)S 179 x(scheme\))S 180 x(from)S 179 x(the)S 179 x(code)S +179 x(information.)S 276 x(The)S 180 x(code)S 180 x(information)S +179 x(and)S 598 y 4796 X(transport)S 165 x(both)S 167 x(depend)S +166 x(upon)S 167 x(the)S 166 x(compression)S 166 x(scheme.)S 897 y +4796 X(Client)S 179 x(to)S 180 x(server)S 180 x(image)S 180 x(data)S +179 x(transport)S 180 x(may)S 180 x(occur)S 181 x(to)S 179 x(either)S +180 x(a)S 180 x(preexisting)S 181 x(or)S 180 x(a)S 179 x(newly)S +181 x(created)S 598 y 4796 X(IOB)S -2 x(.)S 178 x(As)S 177 x(data)S +177 x(arrives)S 178 x(\(uncompressed)S 178 x(tiles,)S 180 x +(uncompressed)S 178 x(stream,)S 180 x(or)S 177 x(compressed)S 177 x +(data)S 178 x(which)S 597 y 4796 X(the)S 180 x(server)S 181 x +(immediately)S 181 x(decompresses\),)S 183 x(it)S 181 x(overlays)S +181 x(the)S 181 x(initial)S 180 x(data)S 180 x(\(default)S 181 x +(value)S 181 x(=)S 180 x(zero,)S 185 x(or)S 598 y 4796 X(prior)S +179 x(image\).)S 277 x(No)S 180 x(combination)S 180 x(of)S 180 x +(transport)S 179 x(data)S 180 x(\(image)S 180 x(data)S 179 x(or)S +180 x(code)S 180 x(information\))S 180 x(with)S 179 x(pre-)S 598 y +4796 X(existing)S 181 x(IOB)S 181 x(data)S 181 x(other)S 181 x(than)S +182 x(simple)S 181 x(overwrite)S 181 x(is)S 181 x(provided.)S 281 x +(This)S 181 x(does)S 181 x(not)S 182 x(exclude)S 182 x(complex)S +598 y 4796 X(assembly)S 177 x(of)S 178 x(IOB)S 177 x(data)S 177 x +(throug)S 2 x(h)S 178 x(transport)S 178 x(\(such)S 178 x(as)S 178 x +(aggregating)S 180 x(and)S 178 x(assembling)S 178 x(bit)S 177 x +(planes)S 178 x(in)S 597 y 4796 X(Bit_Interleaved_by_Plane)S 167 x +(format\).)S 897 y 4796 X(Both)S 176 x(tile)S 176 x(and)S 176 x +(stream)S 176 x(\(uncompressed)S 177 x(and)S 176 x(compressed\))S +176 x(transport)S 176 x(are)S 177 x(applicable)S 176 x(to)S 176 x +(all)S 176 x(classes)S 598 y 4796 X(of)S 172 x(digital)S 172 x +(images)S 173 x(\(bitonal,)S 174 x(continuous)S 174 x(tone)S 172 x +(monochromatic)S 173 x(or)S 173 x(gray)S 174 x(scale,)S 174 x(and)S +173 x(continuous)S 173 x(tone)S 598 y 4796 X(polychromatic)S 166 x +(or)S 167 x(color\).)S 25479 Y 3600 X F36(7.3.1.3)S 599 x(T)S -27 x +(ransport)S 166 x(Data)S 166 x(Formats)S 897 y 4796 X F151(Whether)S +170 x(random)S 170 x(access)S 169 x(tile)S 170 x(or)S 170 x +(sequential)S 169 x(access)S 170 x(stream)S 169 x(\(uncompressed)S +170 x(or)S 170 x(compressed\))S 169 x(trans-)S 597 y 4796 X(port)S +174 x(will)S 173 x(be)S 175 x(used,)S 176 x(the)S 175 x(client)S +174 x(must)S 174 x(choose)S 175 x(between)S 174 x(three)S 175 x +(underlying)S 176 x(PCM)S 175 x(data)S 173 x(organizations:)S 598 y +4796 X(Band_Interleaved_by_Pixel,)S 179 x(Band_Interleaved_by_)S +2 x(Plane,)S 178 x(and)S 176 x(Bit_Interleaved_by_Plane)S 176 x +(\(see)S 598 y 4796 X(appendix)S 189 x(for)S 188 x(details\).)S 294 x +(These)S 189 x(data)S 188 x(organizations)S 189 x(de\211ne)S 190 x +(how)S 188 x(the)S 189 x(bits)S 188 x(which)S 189 x(represent)S 189 x +(the)S 598 y 4796 X(various)S 166 x(spectral)S 166 x(bands)S 166 x +(are)S 166 x(organized.)S 896 y 4796 X(In)S 170 x(tile)S 170 x(and)S +170 x(stream)S 170 x(uncompressed)S 170 x(transport,)S 171 x(this)S +170 x(PCM)S 170 x(format)S 170 x(describes)S 170 x(the)S 170 x +(actual)S 171 x(data)S 169 x(trans-)S 598 y 4796 X(port)S 175 x +(wire)S 176 x(format.)S 268 x(In)S 176 x(stream)S 176 x(compressed)S +175 x(mode,)S 178 x(compression)S 176 x(is)S 175 x(applied)S 176 x +(to)S 175 x(the)S 176 x(data)S 176 x(after)S 175 x(it)S 176 x(is)S +598 y 4796 X(organized)S 171 x(in)S 171 x(one)S 171 x(of)S 170 x +(the)S 171 x(three)S 171 x(ways.)S 259 x(When)S 171 x(transporting)S +171 x(image)S 171 x(data)S 170 x(in)S 171 x(the)S 171 x(stream)S +170 x(compressed)S 598 y 4796 X(mode,)S 169 x(the)S 169 x(client)S +169 x(must)S 169 x(choose)S 169 x(the)S 169 x(compression)S 168 x +(scheme.)S 255 x(The)S 170 x(valid)S 169 x(combinations)S 169 x(of)S +168 x(compression)S 597 y 4796 X(schemes)S 165 x(and)S 167 x +(underlying)S 168 x(image)S 166 x(data)S 166 x(organizations)S 166 x +(are)S 166 x(discussed)S 165 x(below)S -46 x(.)S 35879 Y 19780 X F40 +(REQUESTS)S 165 x(AND)S 165 x(REPLIES)S 448 x(7\20319)S +PP +EP +%%DOC$Page: 7-20 48 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(The)S 171 x(transport)S 170 x(functions)S 171 x +(which)S 171 x(follow)S 170 x(refer)S 170 x(to)S 171 x(a)S 170 x +(concept)S 171 x(known)S 171 x(as)S 170 x(the)S 171 x("data)S 170 x +(plane")S 170 x(,)S 172 x(or)S 171 x(simply)S 598 y 4796 X("plane".)S +264 x(In)S 174 x(fact,)S 175 x(the)S 174 x(atomic)S 173 x(transport)S +174 x(functions)S 174 x(do)S 173 x(not)S 174 x(concern)S 175 x +(themselves)S 173 x(with)S 174 x(the)S 173 x(meaning)S 597 y 4796 X +(of)S 184 x(the)S 184 x(image)S 185 x(data)S 184 x(\(at)S 184 x(the)S +184 x(level)S 185 x(of)S 184 x(it)S 184 x(being)S 185 x(a)S 184 x +(bitonal)S 185 x(image,)S 189 x(or)S 185 x(a)S 184 x(grayscle)S 185 x +(image,)S 190 x(or)S 184 x(a)S 185 x(color)S 598 y 4796 X(image\),)S +187 x(but)S 183 x(rather)S -37 x(,)S 187 x(they)S 184 x(concern)S +184 x(themselves)S 182 x(with)S 182 x(the)S 183 x +(assembly/disassembly)S 182 x(of)S 182 x(image)S 183 x(data)S 598 y +4796 X(into)S 181 x(transport)S 182 x(buffers,)S 186 x(and)S 182 x +(compression.)S 281 x(The)S 183 x(mapping)S 182 x(between)S 182 x +("types)S 181 x(of)S 182 x(images")S 181 x(\(bitonal,)S 598 y 4796 X +(continuous)S 181 x(tone)S 180 x(monochr)S 2 x(omatic,)S 184 x(and)S +180 x(continuou)S 2 x(s)S 180 x(tone)S 180 x(color\),)S 185 x +(component)S 181 x(space)S 180 x(organization)S 597 y 4796 X +(\(band-interleaved-by-pixel,)S 172 x(band-interleaved-by-plane,)S +172 x(bit-interleaved-by-plane\),)S 172 x(and)S 170 x(planes)S 170 x +(is)S 598 y 4796 X(as)S 165 x(follows:)S 249 x(**)S 166 x(tbs)S 165 x +(-)S 166 x(table)S 166 x(**)S 897 y 4796 X(In)S 168 x(any)S 169 x +(case,)S 169 x(only)S 169 x(positive)S 168 x(integral)S 169 x +(values)S 169 x(\(image)S 168 x(data)S 168 x(or)S 169 x(bit)S 168 x +(string)S 168 x(codes\))S 168 x(\212ow)S 168 x(across)S 168 x(the)S +169 x(wire.)S 598 y 4796 X(There)S 175 x(is)S 174 x(no)S 175 x +(provision)S 175 x(for)S 175 x(exchang)S 2 x(e)S 174 x(of)S 175 x +(negative)S 175 x(integral)S 176 x(image)S 174 x(data,)S 177 x(real)S +175 x(valued)S 175 x(\(\212oat\))S 175 x(image)S 597 y 4796 X(data)S +167 x(or)S 168 x(complex)S 169 x(valued)S 169 x(image)S 168 x(data)S +168 x(on)S 168 x(the)S 168 x(wire)S 168 x(even)S 169 x(though)S 169 x +(such)S 169 x(data)S 168 x(\(real)S 168 x(valued\))S 168 x(may)S +169 x(exist)S 598 y 4796 X(on)S 167 x(the)S 167 x(server)S 167 x +(\(see)S 166 x(server)S 167 x(data)S 167 x(model\).)S 250 x(In)S +167 x(terms)S 166 x(of)S 167 x(either)S 167 x(client->server)S 167 x +(or)S 167 x(server)S -8 x(->client)S 166 x(image)S 598 y 4796 X +(data)S 165 x(transport,)S 167 x(the)S 166 x(server)S 166 x(side)S +166 x(IOB)S 165 x(must)S 166 x(be)S 166 x(of)S 166 x(state)S 165 x +(constrained.)S 896 y 4796 X(Flexibility)S 158 x(in)S 158 x(overall)S +159 x(transport)S 157 x(mode)S 158 x(\(tile)S 157 x(or)S 158 x +(stream\),)S 160 x(underlying)S 160 x(image)S 158 x(type)S 158 x +(\(bitonal)S 158 x(monochro-)S 598 y 4796 X(matic,)S 200 x(continuo)S +2 x(us)S 193 x(tone)S 195 x(monochromatic)S 194 x(or)S 194 x(gray)S +195 x(scale,)S 201 x(and)S 194 x(continuou)S 2 x(s)S 193 x(tone)S +194 x(trichromatic)S 598 y 4796 X(or)S 196 x(color\),)S 204 x +(underlyin)S 2 x(g)S 196 x(PCM)S 196 x(image)S 196 x(data)S 196 x +(organization)S 197 x(\(band_interleaved_by_pixel,)S 205 x(band_)S +598 y 4796 X(interleaved_by_plane,)S 169 x(and)S 167 x +(bit_interleaved_by_plane\),)S 169 x(stream)S 167 x(mode)S 166 x +(compression)S 167 x(scheme)S 168 x(\(PCM,)S 598 y 4796 X(G4,)S 166 x +(DCT)S +(\),)S 167 x(and)S 167 x(all)S 166 x(or)S 167 x(single)S 167 x +(plane)S 167 x(at)S 166 x(a)S 167 x(time)S 166 x(transport)S 167 x +(leads)S 166 x(to)S 167 x(an)S 167 x(enormous)S 167 x(number)S 167 x +(of)S 167 x(possible)S 597 y 4796 X(transport)S 172 x(con\211g)S +2 x(urations.)S 263 x(Fortunately)S -54 x(,)S 175 x(some)S 172 x +(image)S 173 x(data)S 173 x(organizations)S 173 x(are)S 173 x +(identical)S 173 x(\(degener-)S 598 y 4796 X(ate\))S 178 x(for)S +179 x(some)S 179 x(image)S 179 x(types,)S 183 x(and)S 179 x(some)S +178 x(compression)S 179 x(schemes)S 179 x(are)S 179 x(inapplicable)S +179 x(for)S 179 x(some)S 178 x(image)S 598 y 4796 X(data)S 167 x +(organizations.)S 253 x(The)S 168 x(following)S 168 x(table)S 167 x +(is)S 168 x(intended)S 168 x(to)S 167 x(give)S 169 x(the)S 168 x +(reader)S 168 x(an)S 168 x(overview)S 168 x(of)S 168 x(the)S 168 x +(valid)S 598 y 4796 X(transport)S 171 x(con\211g)S 2 x(urations.)S +262 x(The)S 173 x(all)S 171 x(or)S 173 x(single)S 172 x(plane)S 172 x +(option)S 173 x(is)S 171 x(left)S 172 x(out)S 172 x(of)S 172 x(the)S +172 x(table)S 172 x(and)S 173 x(dealt)S 171 x(with)S 597 y 4796 X +(explicitly)S 181 x(in)S 182 x(the)S 181 x(transport)S 182 x +(functions)S 181 x(themselves.)S 280 x(Degenerate)S 182 x(image)S +182 x(data)S 181 x(organizations)S 181 x(are)S 598 y 4796 X(grouped)S +167 x(by)S 166 x(surrounding)S 168 x(brackets)S 166 x({}.)S 20657 Y +4796 X F102(MODE)S 7426 X(IMAGE_TYPE)S 11730 X(IMAGE_ORGANIZATION)S +20098 X(COMPRESSION)S 747 y 4796 X(Tile)S 747 y 7426 X(Bitonal)S +11730 X({band_interleaved_by)S 2 x(_pixel)S 20815 X(n/a)S 449 y +11969 X(band_interleaved_by)S 2 x(_plane)S 448 y 11969 X +(bit_interleaved_by_)S 2 x(plane})S 747 y 7426 X(Grayscale)S 11730 X +({band_interleaved_by)S 2 x(_pixel)S 20815 X(n/a)S 448 y 11969 X +(band_interleaved_by)S 2 x(_plane})S 748 y 11730 X +({bit_interleaved_by_)S 2 x(plane})S 20815 X(n/a)S 747 y 7426 X +(Color)S 11730 X({band_interleaved_by)S 2 x(_pixel})S 20815 X(n/a)S +747 y 11730 X({band_interleaved_by)S 2 x(_plane})S 20815 X(n/a)S +747 y 11730 X({bit_interleaved_by_)S 2 x(plane})S 20815 X(n/a)S 747 y +4796 X(Stream)S 748 y 7426 X(Bitonal)S 11730 X({band_interleaved_by)S +2 x(_pixel)S 20815 X(PCM,)S 240 x(G4)S 448 y 11969 X +(band_interleaved_by)S 2 x(_plane)S 448 y 11969 X +(bit_interleaved_by_)S 2 x(plane})S 747 y 7426 X(Grayscale)S 11730 X +({band_interleaved_by)S 2 x(_pixel)S 20815 X(PCM,)S 240 x(DCT)S 449 y +11969 X(band_interleaved_by)S 2 x(_plane})S 747 y 11730 X +({bit_interleaved_by_)S 2 x(plane})S 20815 X(PCM)S 747 y 7426 X +(Color)S 11730 X({band_interleaved_by)S 2 x(_pixel})S 20815 X(PCM,)S +240 x(DCT)S 747 y 11730 X({band_interleaved_by)S 2 x(_plane})S 20815 X +(PCM,)S 240 x(DCT)S 747 y 11730 X({bit_interleaved_by_)S 2 x(plane})S +20815 X(PCM)S 35879 Y 3600 X F40(7\20320)S 449 x(REQUESTS)S 166 x +(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-21 49 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(Note)S 180 x(that)S 180 x(while)S 180 x(DCT)S +179 x(compression)S 180 x(of)S 180 x(bitonal)S 180 x(image)S 181 x +(data)S 180 x(is)S 179 x(possible,)S 184 x(and)S 180 x(both)S 180 x +(G4)S 180 x(and)S 180 x(DCT)S 598 y 4796 X(compression)S 164 x(of)S +165 x(bit_interleaved_by_plane)S 166 x(data)S 164 x(of)S 165 x +(grayscale)S 165 x(and)S 165 x(color)S 165 x(images)S 165 x(is)S +164 x(possible,)S 165 x(neither)S 597 y 4796 X(are)S 172 x(proposed)S +173 x(at)S 172 x(this)S 173 x(time.)S 262 x(The)S 174 x(need)S 173 x +(for)S 173 x(and)S 173 x(value)S 173 x(of)S 173 x(these)S 172 x +(schemes)S 173 x(will)S 172 x(be)S 173 x(considered)S 173 x(in)S +173 x(the)S 598 y 4796 X(future.)S 8453 Y 3600 X F36(7.3.1.4)S 599 x +(T)S -27 x(ransport)S 166 x(Granularity)S 167 x(&)S 166 x(Atomicity)S +896 y 4796 X F151(Both)S 182 x(the)S 183 x(tile)S 182 x(and)S 183 x +(stream)S 182 x(\(uncompressed)S 183 x(and)S 183 x(compressed\))S +182 x(transport)S 182 x(protocol)S 183 x(functions)S 183 x(are)S +598 y 4796 X(limited)S 183 x(in)S 184 x(terms)S 184 x(of)S 184 x +(the)S 185 x(amount)S 184 x(of)S 184 x(data)S 184 x(they)S 185 x +(can)S 185 x(move)S 184 x(by)S 185 x(the)S 184 x(length)S 185 x +(\211eld)S 185 x(in)S 184 x(the)S 185 x(standard)S 598 y 4796 X +(\(core)S 172 x(X1)S -27 x(1\))S 172 x(protocol)S 173 x(message.)S +262 x(As)S 172 x(images)S 172 x(\(in)S 173 x(a)S 172 x(client')S +-19 x(s)S 173 x(buffer)S 172 x(or)S 173 x(in)S 173 x(a)S 172 x +(server)S 173 x(IOB\))S 172 x(may)S 172 x(be)S 173 x(much)S 597 y +4796 X(larger)S 170 x(than)S 170 x(the)S 170 x(length)S 171 x +(\211eld)S 170 x(limit,)S 171 x(it)S 169 x(may)S 170 x(require)S +171 x(multiple)S 169 x(transport)S 170 x(protocol)S 170 x(calls)S +169 x(to)S 170 x(move)S 170 x(the)S 598 y 4796 X(complete)S 165 x +(image)S 167 x(across)S 165 x(the)S 167 x(wire.)S 897 y 4796 X(The)S +172 x(extension)S 172 x(protocol)S 171 x(transport)S 171 x +(functions)S 172 x(allow)S 171 x(the)S 171 x(client)S 172 x(to)S +171 x(construct)S 172 x(or)S 172 x(assemble)S 170 x(all)S 171 x(of)S +171 x(the)S 598 y 4796 X(data)S 166 x(which)S 168 x(will)S 166 x +(make)S 168 x(up)S 167 x(a)S 167 x(single)S 168 x(image)S 167 x +(\(IOB\))S 166 x(with)S 167 x(multiple)S 167 x(transport)S 167 x +(requests.)S 252 x(In)S 167 x(particular)S -37 x(,)S 597 y 4796 X +(there)S 190 x(is)S 190 x(a)S 190 x("\211nal")S 190 x(\212ag)S 191 x +(in)S 190 x(both)S 191 x(tile)S 189 x(and)S 191 x(stream)S 189 x +(\(uncompressed)S 191 x(and)S 190 x(compressed\))S 189 x(transport)S +598 y 4796 X(protocol)S 177 x(functions)S 179 x(which)S 178 x(is)S +177 x(used)S 178 x(to)S 178 x(signal)S 178 x(completion)S 178 x(of)S +178 x(transport)S 177 x(and)S 178 x(assembly)S 178 x(of)S 177 x(the)S +178 x(data)S 598 y 4796 X(which)S 179 x(makes)S 180 x(up)S 180 x(an)S +179 x(image.)S 277 x(In)S 180 x(the)S 180 x(case)S 179 x(of)S 179 x +(tile)S 180 x(image)S 179 x(data)S 179 x(transport,)S 184 x(this)S +179 x(\212ag)S 180 x(is)S 179 x(used)S 180 x(when)S 598 y 4796 X +(the)S 182 x(client)S 183 x(has)S 182 x(populated)S 183 x(through)S +184 x(transport)S 182 x(all)S 183 x(tiles)S 181 x(it)S 183 x(wishes)S +181 x(to)S 183 x(in)S 182 x(the)S 183 x(IOB.)S 182 x(In)S 183 x(the)S +182 x(case)S 183 x(of)S 597 y 4796 X(stream)S 175 x(\(uncompressed)S +176 x(or)S 176 x(compressed\))S 175 x(image)S 176 x(data)S 175 x(or)S +177 x(code)S 176 x(information)S 176 x(transport,)S 178 x(this)S +176 x(\212ag)S 176 x(is)S 598 y 4796 X(used)S 162 x(when)S 162 x +(the)S 162 x(client)S 162 x(has)S 162 x(sent)S 162 x(the)S 162 x +(last)S 162 x(sequential)S 162 x(stream)S 161 x(of)S 162 x(image)S +162 x(data)S 162 x(or)S 162 x(code)S 163 x(information.)S 249 x(In)S +598 y 4796 X(the)S 170 x(tile)S 170 x(case,)S 172 x(a)S 171 x +(single)S 171 x(\212ag)S 171 x(applies)S 170 x(to)S 170 x(all)S 171 x +(planes,)S 171 x(while)S 171 x(in)S 171 x(the)S 170 x(stream)S 170 x +(case,)S 172 x(a)S 171 x(separate)S 170 x(\211nal)S 171 x(\212ag)S +598 y 4796 X(applies)S 165 x(to)S 166 x(each)S 166 x(plane.)S 896 y +4796 X(The)S 188 x(transport)S 188 x(parameters)S 187 x(associated)S +187 x(with)S 187 x(an)S 188 x(IOB)S 187 x(\(XIEP_SET_TRA)S -2 x +(NSPORT\))S 188 x(are)S 187 x(locked)S 598 y 4796 X(during)S 179 x +(transport)S 177 x(of)S 178 x(intermediate)S 178 x(\(non)S 178 x +(\211nal\))S 178 x(segments.)S 273 x(In)S 178 x(other)S 178 x +(words,)S 181 x(once)S 178 x(transport)S 178 x(to)S 178 x(or)S 598 y +4796 X(from)S 166 x(an)S 167 x(IOB)S 166 x(begins,)S 168 x(the)S +167 x(client)S 167 x(can)S 168 x(not)S 167 x(modify)S 167 x(the)S +167 x(transport)S 166 x(parameters)S 167 x(until)S 167 x(a)S 167 x +(\211nal)S 167 x(transport)S 598 y 4796 X(\(\211nal)S 166 x(\212ag)S +167 x(=)S 166 x(true\))S 166 x(occurs.)S 896 y 4796 X(The)S 181 x +(client)S 181 x(has)S 180 x(control)S 181 x(over)S 182 x(the)S 181 x +(size)S 179 x(of)S 181 x(each)S 181 x(transport)S 181 x(request,)S +184 x(and)S 181 x(may)S 181 x(chang)S 2 x(e)S 180 x(the)S 181 x +(size)S 180 x(on)S 598 y 4796 X(a)S 181 x(request)S 182 x(by)S 182 x +(request)S 181 x(basis.)S 280 x(This)S 182 x(is)S 181 x(intended)S +182 x(to)S 181 x(support)S 182 x(applications)S 181 x(which)S 182 x +(may)S 182 x(be)S 181 x(acquir-)S 598 y 4796 X(ing/disposing)S 174 x +(of)S 173 x(image)S 173 x(data)S 173 x(\(from)S 173 x(disks)S 172 x +(or)S 174 x(networks\))S 173 x(in)S 173 x(small)S 172 x(pieces)S +173 x(\(including)S 174 x(due)S 174 x(to)S 173 x(highly)S 598 y +4796 X(limited)S 170 x(virtual)S 171 x(address)S 170 x(space)S 170 x +(/)S 171 x(physical)S 171 x(memory)S 172 x(space\),)S 172 x(as)S +170 x(well)S 170 x(as)S 170 x(applications)S 170 x(making)S 172 x +(use)S 171 x(of)S 597 y 4796 X(X)S 177 x(Image)S 179 x(Extension)S +178 x(Pipelines)S 178 x(where)S 179 x(transport)S 178 x(is)S 178 x +(part)S 178 x(of)S 178 x(the)S 178 x(pipe)S 178 x(\(such)S 179 x(as)S +178 x(rapid)S 178 x(interleaved)S 598 y 4796 X +(transport-rendition-display\).)S 292 x(This)S 187 x(is)S 187 x +(also)S 187 x(due)S 188 x(to)S 187 x(the)S 188 x(fact)S 187 x(that)S +187 x(maximum)S 188 x(size)S 186 x(of)S 188 x(X1)S -28 x(1)S 187 x +(wire)S 598 y 4796 X(packets)S 165 x(may)S 167 x(often)S 166 x(be)S +166 x(smaller)S 166 x(than)S 166 x(the)S 166 x(image)S 167 x(to)S +165 x(be)S 166 x(transported.)S 896 y 4796 X(In)S 180 x(all)S 180 x +(cases,)S 183 x(only)S 181 x(individual)S 181 x(transport)S 180 x +(protocol)S 181 x(requests)S 180 x(are)S 180 x(atomic.)S 278 x(The)S +180 x(transport)S 181 x(of)S 180 x(of)S 180 x(all)S 598 y 4796 X +(image)S 181 x(data/information)S 182 x(that)S 181 x(makes)S 181 x +(up)S 182 x(an)S 181 x(IOB)S 180 x(may)S 182 x(or)S 182 x(may)S 181 x +(not)S 182 x(be)S 181 x(atomic)S 181 x(depending)S 182 x(upon)S 598 y +4796 X(whether)S 167 x(it)S 166 x(requires)S 167 x(multiple)S 166 x +(transport)S 167 x(protocol)S 167 x(requests.)S 251 x(The)S 167 x +(image)S 167 x(data)S 166 x(which)S 167 x(arrives)S 167 x(on)S 168 x +(the)S 598 y 4796 X(server)S 166 x(\(client->server\))S 165 x(and)S +166 x(is)S 165 x(placed)S 165 x(into)S 166 x(an)S 166 x(IOB)S 164 x +(is)S 165 x(not)S 166 x(locked)S 166 x(in)S 165 x(any)S 167 x(way)S +165 x(and)S 166 x(may)S 165 x(be)S 166 x(accessed)S 597 y 4796 X(by)S +184 x(other)S 184 x(server)S 184 x(functions)S 184 x(\(interleaved)S +185 x(between)S 183 x(the)S 184 x(transport)S 183 x(functions\).)S +286 x(While)S 183 x(this)S 184 x(is)S 183 x(the)S 598 y 4796 X +(case,)S 171 x(the)S 171 x(actual)S 171 x(presence)S 171 x(of)S 170 x +(image)S 171 x(data)S 170 x(in)S 170 x(the)S 171 x(IOB)S 170 x +(\(versus)S 170 x(residing)S 171 x(in)S 171 x(intermediate)S 170 x +(transport)S 598 y 4796 X(buffers)S 173 x(awaiting)S 173 x +(repacking)S 175 x(or)S 174 x(decompression\))S 173 x(is)S 173 x +(indeterminate)S 173 x(until)S 174 x(the)S 174 x(\211nal)S 174 x +(\212ag)S 174 x(is)S 173 x(set,)S 175 x(and)S 598 y 4796 X(applying)S +167 x(server)S 167 x(operations)S 166 x(to)S 166 x(the)S 166 x(IOB)S +165 x(may)S 167 x(generate)S 167 x(indeterminate)S 167 x(results.)S +249 x(The)S 167 x(only)S 167 x(acception)S 597 y 4796 X(to)S 165 x +(this)S 166 x(is)S 166 x(pipelines)S 165 x(which)S 167 x(have)S 167 x +(transport)S 166 x(as)S 165 x(their)S 166 x(\211rst)S 166 x +(element.)S 35879 Y 318 x F40(REQUESTS)S 165 x(AND)S 165 x(REPLIES)S +448 x(7\20321)S +PP +EP +%%DOC$Page: 7-22 50 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 3600 X F36(7.3.1.5)S 599 x(Synchroni)S 2 x(zation)S 896 y +4796 X F151(Like)S 189 x(all)S 189 x(other)S 189 x(image)S 189 x +(extension)S 190 x(protocol)S 189 x(functions,)S 196 x(transport)S +188 x(protocol)S 189 x(functions)S 190 x(are)S 189 x(asyn-)S 598 y +4796 X(chronous)S 167 x(-)S 166 x(the)S 166 x(client)S 166 x +(initiates)S 165 x(them)S 166 x(and)S 167 x(does)S 165 x(not)S 167 x +(wait)S 165 x(for)S 166 x(their)S 166 x(completion.)S 8159 Y 3600 X +F28(7.3.2)S 599 x(Set)S 166 x(T)S -32 x(ransport)S 166 x(Context)S +9106 Y 4796 X F102(XIEP_SET_TRANSPORT)S 747 y 6708 X(iob_id)S 14599 X +(XIT_IOB)S 448 y 6708 X(compression-)S 2 x(param)S 14599 X(CARD32)S +449 y 6708 X(compression-)S 2 x(scheme)S 14599 X(XIT_COMPRESSION_S)S +2 x(CHEME)S 448 y 6708 X(tile_format)S 14599 X(BOOL)S 448 y 6708 X +(component-sp)S 2 x(ace-organization)S 14599 X(XIT_COMPONENT_SPA)S +2 x(CE_ORGANIZATION)S 449 y 6708 X(plane_mask)S 14599 X(CARD32)S +448 y 6708 X(plane_inform)S 2 x(ation)S 14599 X(LISTofPLANE_DATA)S +747 y 6708 X(=>)S 747 y -478 x(none)S 748 y 6708 X(service)S 240 x +(class)S 240 x(value:)S 14599 X(0)S 448 y 6708 X(errors:)S 14599 X +(IDChoice,)S 240 x(MATCH)S 448 y 6708 X(events:)S 14599 X(none)S +16727 Y 4796 X(where:)S 747 y 478 x(PLANE_DATA)S 240 x(is:)S 748 y +7665 X([)S 448 y(pixel-stride)S 14599 X(CARD8)S 448 y 7904 X +(scanline-stride)S 14599 X(CARD32)S 449 y 7665 X(])S 896 y 4796 X +F151(XIEP_SE)S -2 x(T_TRANSPORT)S 182 x(is)S 182 x(used)S 183 x(to)S +182 x(establish)S 182 x(the)S 183 x(necessary)S 183 x(transport)S +182 x(context)S 184 x(information)S 598 y 4796 X(before)S 179 x +(image)S 180 x(data)S 179 x(wire)S 179 x(transport)S 179 x(can)S +180 x(occur)S 181 x(between)S 179 x(a)S 179 x(client)S 180 x(buffer)S +180 x(and)S 180 x(a)S 179 x(particular)S 180 x(server)S 598 y 4796 X +(IOB)S -2 x(.)S 896 y 4796 X(Iob_id)S 185 x(is)S 186 x(the)S 187 x +(id)S 186 x(of)S 186 x(an)S 186 x(existing)S 187 x(IOB)S 185 x +(\(either)S 187 x(newly)S 186 x(created)S 187 x(by)S 187 x(XIEP_CR)S +-2 x(EA)S -28 x(TE_RESOUR)S -2 x(CE)S 598 y 4796 X(or)S 186 x +(preexisting\))S 188 x(which)S 187 x(will)S 186 x(serve)S 187 x(as)S +186 x(the)S 187 x(source)S 187 x(of)S 187 x(or)S 187 x(destination)S +186 x(for)S 187 x(image)S 187 x(data)S 186 x(transport.)S 598 y +4796 X(Compressi)S -2 x(on_param)S 192 x(is)S 190 x(a)S 191 x +(compression)S 190 x(parameter)S 191 x(to)S 191 x(be)S 190 x(used)S +191 x(by)S 191 x(the)S 191 x(various)S 192 x(compression)S 598 y +4796 X(schemes.)S 267 x(In)S 175 x(particular)S -36 x(,)S 177 x(it)S +175 x(is)S 175 x(used)S 175 x(to)S 175 x(control)S 175 x(the)S 176 x +(compression)S 174 x(factor)S 176 x(/)S 175 x(\211delity)S 176 x +(tradeoff)S 174 x(in)S 176 x(DCT)S 597 y 4796 X(compression)S 151 x +(when)S 153 x(reading)S 153 x(compressed)S 151 x(data)S 152 x(from)S +152 x(the)S 152 x(server)S 152 x(to)S 152 x(the)S 152 x(client.)S +250 x(Compression_scheme)S 598 y 4796 X(is)S 172 x(one)S 174 x(of)S +173 x(the)S 173 x(valid)S 173 x(compression)S 173 x(schemes.)S 264 x +(In)S 173 x(tiled)S 173 x(transport,)S 175 x(compression)S 173 x +(scheme)S 173 x(must)S 173 x(be)S 173 x(set)S 598 y 4796 X(to)S 173 x +(PCM.)S 175 x(In)S 174 x(stream)S 173 x(transport,)S 176 x(it)S 173 x +(may)S 175 x(be)S 173 x(any)S 175 x(of)S 174 x(the)S 174 x +(compression)S 174 x(schemes)S 173 x(including)S 175 x(PCM)S 174 x +(\(see)S 598 y 4796 X(table)S 172 x(in)S 173 x(previous)S 174 x +(section)S 173 x(and)S 173 x(appendix\).)S 264 x(T)S -12 x +(ile_format)S 172 x(is)S 173 x(a)S 172 x(boolean)S 174 x(which)S +173 x(is)S 172 x(used)S 173 x(to)S 173 x(indicate)S 173 x(if)S 597 y +4796 X(tile)S 167 x(or)S 169 x(stream)S 168 x(transport)S 168 x(is)S +168 x(to)S 168 x(occur)S -36 x(.)S 254 x +(Component_space_organization)S 169 x(describes)S 168 x(the)S 168 x +(PCM)S 169 x(format)S 598 y 4796 X(of)S 156 x(the)S 158 x(image)S +157 x(data)S 157 x(\(independent)S 157 x(of)S 157 x(whether)S 158 x +(tile)S 156 x(uncompressed,)S 160 x(stream)S 156 x(uncompressed,)S +160 x(or)S 157 x(stream)S 598 y 4796 X(compressed)S 165 x(image)S +166 x(data)S 166 x(transport)S 166 x(will)S 165 x(occur\).)S 897 y +4796 X(Plane_mask)S 175 x(identi\211es)S 176 x(which)S 175 x(planes)S +175 x(will)S 175 x(be)S 175 x(transported)S 175 x(where)S 176 x(the)S +175 x(de\211nition)S 176 x(of)S 176 x(a)S 175 x(data)S 175 x(plane)S +597 y 4796 X(depends)S 181 x(upon)S 182 x(the)S 182 x +(component_organ)S 2 x(ization.)S 280 x(Plane_information)S 182 x +(is)S 181 x(a)S 181 x(list)S 181 x(with)S 181 x(one)S 182 x(entry)S +182 x(per)S 598 y 4796 X(plane.)S 254 x(Each)S 168 x(entry)S 169 x +(in)S 169 x(the)S 168 x(list)S 167 x(contains,)S 170 x(pixel-stride)S +168 x(and)S 168 x(scanline-stride.)S 254 x(Scanline_stride)S 168 x +(is)S 168 x(only)S 598 y 4796 X(meaningful)S 178 x(in)S 179 x +(uncompressed)S 178 x(stream)S 177 x(transport)S 177 x(and)S 179 x +(must)S 177 x(be)S 178 x(set)S 177 x(equal)S 178 x(to)S 178 x(the)S +178 x(number)S 178 x(of)S 178 x(bits)S 598 y 4796 X(per)S 176 x +(scanline)S 176 x(plus)S 176 x(the)S 176 x(number)S 177 x(of)S 176 x +(pad)S 176 x(bits)S 175 x(between)S 176 x(scanlines.)S 270 x +(Scanline_stride)S 176 x(is)S 176 x(meaningless)S 597 y 4796 X(for)S +175 x(tiles)S 175 x(as)S 176 x(tile)S 175 x(size)S 175 x(may)S 176 x +(be)S 176 x(changed)S 177 x(on)S 176 x(a)S 176 x(transport)S 176 x +(call)S 175 x(basis.)S 268 x(In)S 176 x(tile)S 176 x(transport,)S +178 x(within)S 176 x(each)S 598 y 4796 X(plane,)S 186 x(all)S 181 x +(scanlines)S 182 x(are)S 182 x(bitwise)S 181 x(abutted)S 181 x(\(no)S +182 x(pad)S 182 x(or)S 182 x(alignment)S 182 x(allowed\).)S 280 x +(Multiple)S 182 x(planes)S 182 x(in)S 598 y 4796 X(tile)S 180 x +(transport)S 181 x(are)S 181 x(longword)S 181 x(aligned.)S 280 x +(Note)S 181 x(that)S 180 x(the)S 181 x(bits-per)S -9 x(-component)S +181 x(information)S 181 x(used)S 181 x(in)S 35879 Y 3600 X F40 +(7\20322)S 449 x(REQUESTS)S 166 x(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-23 51 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(wire)S 181 x(transport)S 182 x(is)S 182 x +(communicated)S 183 x(at)S 182 x(IOB)S 181 x(creation)S 182 x(time)S +182 x(\(for)S 182 x(client-to-server)S 183 x(transports\),)S 186 x +(and)S 598 y 4796 X(establis)S -2 x(hed)S 181 x(in/deriv)S 2 x(ed)S +180 x(from)S 181 x(the)S 181 x(IOB)S 179 x(for)S 181 x(server)S -9 x +(-to-client)S 181 x(transports)S 180 x(by)S 181 x(use)S 181 x(of)S +180 x(the)S 181 x(constraint)S 597 y 4796 X(mechanism.)S 253 x(For)S +168 x(more)S 168 x(details)S 167 x(on)S 169 x(compression-scheme,)S +168 x(component-space-organization,)S 170 x(bits-per)S -10 x(-)S +598 y 4796 X(component,)S 182 x(pixel-stride,)S 182 x(and)S 179 x +(scanline-stride)S 178 x(see)S 178 x(the)S 179 x(appendix)S 179 x +(on)S 179 x(image)S 178 x(data)S 179 x(attributes)S 177 x(and)S 598 y +4796 X(organization.)S 897 y 4796 X(The)S 181 x(image)S 181 x(data)S +180 x(wire)S 180 x(transport)S 181 x(context)S 181 x(is)S 181 x +(bound)S 181 x(to)S 180 x(a)S 181 x(particular)S 181 x(IOB)S 180 x +(for)S 180 x(the)S 181 x(duration)S 181 x(of)S 181 x(an)S 597 y +4796 X(image)S 177 x(data)S 176 x(wire)S 176 x(transport)S 177 x +(session.)S 270 x(The)S 177 x(binding)S 178 x(is)S 176 x +(established)S 176 x(by)S 177 x(XIEP_SET_TRANSPOR)S -2 x(T)S -45 x +(.)S 598 y 4796 X(The)S 173 x(transport)S 172 x(context)S 173 x +(information)S 172 x(for)S 173 x(the)S 172 x(particular)S 173 x(IOB)S +171 x(is)S 172 x(locked)S 173 x(when)S 173 x(the)S 172 x(\211rst)S +173 x(image)S 172 x(data)S 598 y 4796 X(wire)S 162 x(transport)S +163 x(function)S 163 x(is)S 163 x(invoked)S 164 x(\(XIEP_GE)S -2 x +(T_TILE,)S 164 x(XIEP_PUT_TILE,)S 163 x(XIEP_GET_STRE)S -2 x(AM,)S +598 y 4796 X(XIEP_PUT_STREA)S -2 x(M\))S 179 x(and)S 178 x(remains)S +178 x(locked)S 179 x(until)S 179 x(the)S 178 x(transport)S 178 x +(session)S 177 x(involv)S 2 x(ing)S 179 x(this)S 177 x(IOB)S 178 x +(is)S 597 y 4796 X(completed.)S 249 x(This)S 159 x(occurs)S 159 x +(when)S 159 x(an)S 159 x(image)S 158 x(data)S 159 x(wire)S 158 x +(transport)S 158 x(function)S 160 x(is)S 158 x(invoked)S 160 x(with)S +158 x("\211nal")S 159 x(\212ag)S 598 y 4796 X(set)S 165 x(to)S 166 x +(true)S 166 x(or)S 167 x(when)S 166 x(transport)S 166 x(is)S 165 x +(aborted)S 166 x(\(XIEP_ABO)S -2 x(RT_TRANSPORT\).)S 897 y 4796 X +(Note)S 173 x(that)S 173 x(the)S 174 x(transport)S 173 x(context)S +174 x(information)S 174 x(pertains)S 173 x(to)S 173 x(image)S 174 x +(data)S 173 x(organization)S 174 x(only)S 174 x(during)S 597 y 4796 X +(wire)S 166 x(transport.)S 251 x(It)S 166 x(has)S 167 x(no)S 167 x +(bearing)S 168 x(upon)S 168 x(the)S 167 x(server)S 167 x(IOB)S 166 x +(image)S 167 x(data)S 167 x(organization)S 167 x(as)S 166 x(server)S +28 x(')S -18 x(s)S 166 x(are)S 598 y 4796 X(free)S 166 x(to)S 166 x +(chose)S 166 x(their)S 166 x(own)S 166 x(image)S 167 x(data)S 165 x +(organizations.)S 897 y 4796 X(If)S 189 x(the)S 190 x(iob_id)S 189 x +(does)S 189 x(not)S 190 x(exist,)S 196 x(an)S 190 x(IDChoice)S 189 x +(error)S 190 x(occurs.)S 298 x(If)S 189 x(the)S 190 x(IOB')S -20 x +(s)S 189 x(number_of_spectral_)S 598 y 4796 X(components)S 175 x +(does)S 176 x(not)S 175 x(match)S 176 x(the)S 176 x(length)S 176 x +(of)S 176 x(the)S 176 x(component_information)S 176 x(list,)S 178 x +(or)S 176 x(the)S 175 x(tile_format)S 597 y 4796 X(boolean)S 166 x +(is)S 166 x(true)S 166 x(and)S 166 x(compression_scheme)S 166 x(is)S +166 x(not)S 166 x(PCM,)S 167 x(a)S 166 x(MA)S -28 x(TCH)S 166 x +(error)S 167 x(occurs.)S 17718 Y 3600 X F28(7.3.3)S 599 x(T)S -10 x +(ile)S 166 x(Data)S 167 x(T)S -33 x(ransport)S 18814 Y 4796 X F151 +(T)S -13 x(ile)S 182 x(data)S 182 x(transport)S 182 x(allows)S 182 x +(a)S 182 x(client)S 182 x(to)S 182 x(transport)S 182 x(tiles)S 182 x +(of)S 182 x(image)S 183 x(data)S 181 x(between)S 182 x(a)S 183 x +(client)S 182 x(buffer)S 597 y 4796 X(and)S 174 x(an)S 175 x +(existing)S 175 x(IOB.)S 173 x(The)S 175 x(client)S 175 x(controls)S +174 x(tile)S 174 x(size,)S 176 x(its)S 174 x(IOB)S 173 x(location,)S +177 x(and)S 175 x(which)S 174 x(data)S 174 x(planes)S 174 x(to)S +598 y 4796 X(transport.)S 249 x(Only)S 166 x(uncompressed)S 166 x +(data)S 166 x(may)S 166 x(be)S 167 x(transported.)S 21504 Y 3600 X +F36(7.3.3.1)S 599 x(Client\203>Server)S 747 y 4796 X F102 +(XIEP_PUT_TILE)S 747 y 6708 X(iob_id)S 14599 X(XIT_IOB)S 448 y 6708 X +(x)S 14599 X(CARD32)S 449 y 6708 X(y)S 14599 X(CARD32)S 448 y 6708 X +(width)S 14599 X(CARD32)S 448 y 6708 X(height)S 14599 X(CARD32)S +449 y 6708 X(plane_mask)S 14599 X(CARD32)S 448 y 6708 X(final)S +14599 X(BOOL)S 448 y 6708 X(image_data)S 14599 X(XIT_IDATA)S 747 y +6708 X(=>)S 748 y -478 x(none)S 747 y 6708 X(service)S 240 x(class)S +240 x(value:)S 14599 X(0)S 448 y 6708 X(errors:)S 14599 X(IDChoice,)S +240 x(MATCH,)S 240 x(ACCESS)S 448 y 6708 X(events:)S 14599 X(none)S +897 y 4796 X F151(XIEP_PUT_TILE)S 176 x(transfers)S 176 x(an)S 177 x +(uncompressed)S 176 x(image)S 177 x(data)S 176 x(tile)S 176 x(from)S +177 x(a)S 176 x(client)S 177 x(buffer)S 177 x(across)S 176 x(the)S +598 y 4796 X(wire)S 177 x(into)S 179 x(a)S 178 x(server)S 178 x +(IOB.)S 178 x(The)S 179 x(client)S 178 x(speci\211es)S 178 x(both)S +178 x(the)S 178 x(tile)S 178 x(size)S 177 x(and)S 179 x(its)S 177 x +(destination)S 178 x(location)S 178 x(in)S 598 y 4796 X(the)S 178 x +(receivin)S 2 x(g)S 179 x(IOB.)S 178 x(The)S 179 x(IOB)S 178 x(must)S +178 x(exist)S 179 x(and)S 179 x(the)S 179 x(transport)S 179 x +(context)S 179 x(be)S 179 x(previously)S 180 x(establis)S -2 x(hed)S +597 y 4796 X(\(XIE)S -2 x(P_SET_TRANSPORT\).)S 35879 Y 19780 X F40 +(REQUESTS)S 165 x(AND)S 165 x(REPLIES)S 448 x(7\20323)S +PP +EP +%%DOC$Page: 7-24 52 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(IOB)S -2 x(_id)S 185 x(is)S 184 x(the)S 184 x(id)S +184 x(of)S 185 x(the)S 184 x(receiving)S 186 x(IOB.)S 184 x(X)S 184 x +(and)S 184 x(y)S 185 x(specify)S 185 x(the)S 184 x(upper)S 185 x +(left)S 184 x(hand)S 185 x(corner)S 185 x(\(in)S 185 x(IOB)S 598 y +4796 X(coordinates\))S 176 x(of)S 176 x(the)S 176 x(destination)S +176 x(location.)S 270 x(Height)S 177 x(and)S 176 x(width)S 176 x +(specify)S 176 x(the)S 177 x(tile)S 176 x(size.)S 269 x(Plane_mask)S +597 y 4796 X(identi\211es)S 168 x(which)S 170 x(data)S 168 x(planes)S +169 x(are)S 169 x(being)S 169 x(sent.)S 255 x(Final)S 169 x(is)S +169 x(a)S 169 x(boolean)S 169 x(which)S 169 x(indicates)S 168 x(if)S +169 x(all)S 169 x(IOB)S 167 x(data)S 598 y 4796 X(\(all)S 179 x +(tiles\))S 178 x(have)S 181 x(been)S 180 x(sent.)S 276 x(Image_data)S +180 x(is)S 179 x(the)S 180 x(data)S 179 x(segment)S 180 x(to)S 179 x +(be)S 179 x(transported)S 180 x(from)S 179 x(client)S 180 x(to)S +598 y 4796 X(server)S -37 x(.)S 8751 Y 4796 X F152(Bitonal)S 166 x +(Monochromatic)S 897 y 4796 X F151(T)S -31 x(ransport)S 181 x(of)S +181 x(bitonal)S 180 x(monochro)S 2 x(matic)S 180 x(image)S 181 x +(data)S 181 x(always)S 180 x(occurs)S 182 x(in)S 181 x(the)S 181 x +(same)S 180 x(fashion)S 181 x(\(Band_)S 598 y 4796 X +(Interleaved_by_Pixel,)S 196 x(Band_Interleaved_by_Plane,)S 196 x +(and)S 189 x(Bit_Interleaved_by_Plane)S 189 x(are)S 189 x(all)S 598 y +4796 X(degenerate\).)S 250 x(In)S 166 x(this)S 166 x(case,)S 166 x +(the)S 166 x(client)S 167 x(buffer)S 166 x(is)S 165 x(simply)S 166 x +(an)S 167 x(array)S 166 x(of)S 166 x(bits,)S 166 x(one)S 167 x(per)S +166 x(pixel.)S 12039 Y 4796 X F152(Continuous)S 167 x(T)S -44 x(one)S +167 x(Monochromatic)S 167 x(-)S 166 x(Pixel)S 167 x(Aggregated)S +897 y 4796 X F151(T)S -31 x(ransport)S 170 x(of)S 170 x(continuou)S +2 x(s)S 170 x(tone)S 170 x(monochromatic)S 171 x(image)S 171 x(data)S +170 x(can)S 170 x(occur)S 172 x(in)S 170 x(two)S 170 x(fashions:)S +258 x(by)S 170 x(Band_)S 597 y 4796 X(Interleaved_by_Pixel)S 193 x +(and)S 193 x(Band_Interleaved_by_Plane)S 194 x(which)S 192 x(are)S +193 x(degenerate,)S 200 x(or)S 192 x(by)S 193 x(Bit_)S 598 y 4796 X +(Interleaved_by_Plane.)S 285 x(As)S 183 x(there)S 183 x(is)S 183 x +(only)S 184 x(one)S 184 x(spectral)S 183 x(band,)S 188 x(the)S 183 x +(image)S 184 x(data)S 182 x(organ)S 2 x(ization)S 182 x(in)S 598 y +4796 X(the)S 166 x(client)S 166 x(buffer)S 166 x(for)S 166 x(the)S +167 x(\211rst)S 166 x(case)S 165 x(is)S 166 x(simply)S 166 x(an)S +166 x(array)S 167 x(of)S 166 x(pixels,)S 166 x(n)S 167 x(bits)S 165 x +(per)S 166 x(pixel.)S 15925 Y 4796 X F152(Continuous)S 167 x(T)S +-44 x(one)S 167 x(Monochromatic)S 167 x(-)S 166 x(Bit)S 166 x +(Interleaved)S 167 x(by)S 166 x(Plane)S 896 y 4796 X F151(In)S 182 x +(the)S 183 x(Bit_Interleaved_by_Plane)S 183 x(mode)S 182 x +(transport)S 183 x(of)S 182 x(continuou)S 2 x(s)S 182 x(tone)S 182 x +(monochromatic)S 183 x(image)S 598 y 4796 X(data,)S 170 x(the)S 170 x +(client)S 170 x(has)S 169 x(the)S 170 x(option)S 170 x(of)S 169 x +(sending)S 171 x(a)S 169 x(tile)S 169 x(from)S 170 x(one)S 170 x +(through)S 171 x(n)S 170 x(data)S 169 x(planes.)S 257 x(If)S 169 x +(more)S 170 x(than)S 598 y 4796 X(one)S 174 x(plane)S 175 x(is)S +174 x(to)S 174 x(be)S 174 x(transported,)S 177 x(the)S 174 x(planes)S +175 x(must)S 174 x(abut)S 174 x(each)S 175 x(other)S 175 x(\(long)S +175 x(word)S 174 x(alignment)S 175 x(of)S 174 x(the)S 597 y 4796 X +(planes\))S 165 x(in)S 167 x(the)S 166 x(client')S -19 x(s)S 166 x +(buffer)S -37 x(.)S 19810 Y 4796 X F152(Continuous)S 167 x(T)S -44 x +(one)S 167 x(Polychromatic)S 167 x(-)S 166 x(Band)S 166 x +(Interleaved)S 167 x(by)S 166 x(Pixel)S 897 y 4796 X F151(T)S -31 x +(ransport)S 170 x(of)S 169 x(continuo)S 2 x(us)S 169 x(tone)S 170 x +(polychromatic)S 171 x(image)S 170 x(data)S 169 x(can)S 171 x(occur)S +170 x(in)S 170 x(any)S 171 x(of)S 170 x(the)S 170 x(three)S 170 x +(formats:)S 597 y 4796 X(Band_Interleaved_by_Pixel,)S 182 x +(Band_Interleaved_by_)S 2 x(Plane,)S 181 x(and)S 178 x +(Bit_Interleaved_by_Plane.)S 274 x(In)S 598 y 4796 X(the)S 169 x +(Band_Interleaved_by_P)S 2 x(ixel)S 169 x(mode)S 170 x(the)S 170 x +(client)S 169 x(buffer)S 170 x(is)S 169 x(once)S 170 x(again)S 171 x +(simply)S 169 x(an)S 170 x(array)S 170 x(of)S 169 x(pixels,)S 598 y +4796 X(n)S 170 x(bits)S 170 x(per)S 171 x(pixel,)S 172 x(where)S +171 x(the)S 170 x(r)S -8 x(-g-b)S 170 x(bits)S 170 x(make)S 171 x +(up)S 170 x(the)S 171 x(total)S 170 x(n.)S 259 x(No)S 170 x(option)S +171 x(exists)S 170 x(regarding)S 172 x(sending)S 598 y 4796 X(a)S +166 x(single)S 166 x(bit)S 166 x(plane)S 166 x(or)S 166 x(spectral)S +166 x(band.)S 24293 Y 4796 X F152(Continuous)S 167 x(T)S -44 x(one)S +167 x(Polychromatic)S 167 x(-)S 166 x(Band)S 166 x(Interleaved)S +167 x(by)S 166 x(Plane)S 897 y 4796 X F151(In)S 173 x(the)S 173 x +(Band_Interleaved_by_Plan)S 2 x(e)S 173 x(mode,)S 175 x(the)S 173 x +(client)S 173 x(has)S 173 x(the)S 174 x(option)S 173 x(of)S 173 x +(sending)S 174 x(a)S 173 x(tile)S 172 x(from)S 173 x(one)S 598 y +4796 X(through)S 181 x(n)S 180 x(\(max)S 180 x(3\))S 179 x(spectral)S +179 x(bands.)S 277 x(If)S 179 x(more)S 180 x(than)S 180 x(one)S 180 x +(data)S 179 x(plane)S 180 x(\(band)S 180 x(in)S 180 x(this)S 179 x +(case\))S 179 x(is)S 180 x(to)S 179 x(be)S 597 y 4796 X +(transported,)S 185 x(they)S 183 x(must)S 181 x(abut)S 182 x(each)S +182 x(other)S 182 x(\(long)S 182 x(word)S 182 x(alignment)S 182 x +(of)S 181 x(the)S 182 x(planes\))S 182 x(in)S 182 x(the)S 181 x +(client')S -18 x(s)S 598 y 4796 X(buffer)S -37 x(.)S 28179 Y 4796 X +F152(Continuous)S 167 x(T)S -44 x(one)S 167 x(Polychromatic)S 167 x +(-)S 166 x(Bit)S 166 x(Interleaved)S 167 x(by)S 166 x(Plane)S 896 y +4796 X F151(In)S 163 x(the)S 164 x(Bit_Interleaved_by_Plane)S 165 x +(mode,)S 165 x(the)S 164 x(client)S 164 x(has)S 163 x(the)S 164 x +(option)S 164 x(of)S 164 x(sending)S 164 x(one)S 165 x(through)S +165 x(n)S 164 x(data)S 598 y 4796 X(planes)S 179 x(\(each)S 180 x +(data)S 179 x(plane)S 180 x(is)S 179 x(now)S 180 x(a)S 179 x(bit)S +180 x(plane\).)S 277 x(If)S 179 x(more)S 180 x(than)S 180 x(one)S +180 x(data)S 179 x(plane)S 180 x(\(bit)S 179 x(plane)S 180 x(in)S +180 x(this)S 598 y 4796 X(case\))S 174 x(is)S 174 x(to)S 175 x(be)S +175 x(transported,)S 177 x(they)S 176 x(must)S 174 x(abut)S 175 x +(each)S 175 x(other)S 176 x(\(long)S 175 x(word)S 175 x(alignment)S +175 x(of)S 175 x(the)S 175 x(planes\))S 174 x(in)S 597 y 4796 X(the)S +166 x(client')S -19 x(s)S 166 x(buffer)S -37 x(.)S 897 y 4796 X +(Specifying)S 189 x(a)S 188 x(non)S 190 x(existent)S 188 x(IOB)S +187 x(gener)S 2 x(ates)S 187 x(an)S 189 x(IDChoice)S 188 x(error)S +-36 x(.)S 294 x(Specifying)S 190 x(an)S 189 x(IOB)S 187 x(which)S +189 x(is)S 598 y 4796 X(unconstrained)S 157 x(generates)S 157 x(a)S +157 x(MA)S -28 x(TCH)S 157 x(error)S -36 x(.)S 249 x(A)S 156 x +(mismatch)S 156 x(between)S 157 x(the)S 157 x(receiving)S 158 x +(IOB')S -20 x(s)S 156 x(component-)S 598 y 4796 X +(space-organization)S 187 x(and)S 188 x(the)S 187 x(curren)S 2 x(t)S +187 x(transport)S 187 x(context')S -18 x(s)S 187 x +(component-space-organization)S 188 x(\(ie.)S 597 y 4796 X(trying)S +171 x(to)S 169 x(send)S 170 x(an)S 170 x(rgb)S 171 x(color)S 170 x +(image)S 170 x(over)S 171 x(the)S 170 x(wire)S 170 x(into)S 170 x(a)S +169 x(monochro)S 2 x(me)S 169 x(IOB\))S 169 x(generates)S 170 x(a)S +170 x(MA)S -27 x(TCH)S 35879 Y 3600 X F40(7\20324)S 449 x(REQUESTS)S +166 x(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-25 53 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(error)S -37 x(.)S 281 x(Attempts)S 180 x(to)S +181 x(transport)S 181 x(to)S 182 x(an)S 181 x(IOB)S 181 x(which)S +182 x(has)S 181 x(not)S 182 x(had)S 181 x(a)S 182 x(transport)S 181 x +(context)S 182 x(established)S 598 y 4796 X(\(XIE)S -2 x +(P_SET_TRANSPORT\))S 166 x(generates)S 166 x(an)S 167 x(ACC)S -2 x +(ESS)S 166 x(error)S -36 x(.)S 7257 Y 3600 X F36(7.3.3.2)S 599 x +(Server\203>Client)S 747 y 4796 X F102(XIEP_GET_TILE)S 747 y 6708 X +(iob_id)S 14599 X(XIT_IOB)S 449 y 6708 X(x)S 14599 X(CARD32)S 448 y +6708 X(y)S 14599 X(CARD32)S 448 y 6708 X(width)S 14599 X(CARD32)S +449 y 6708 X(height)S 14599 X(CARD32)S 448 y 6708 X(plane_mask)S +14599 X(CARD32)S 448 y 6708 X(final)S 14599 X(BOOL)S 748 y 6708 X +(=>)S 747 y -478 x(image_data)S 14599 X(XIT_IDATA)S 747 y 6708 X +(service)S 240 x(class)S 240 x(value:)S 14599 X(0)S 448 y 6708 X +(errors:)S 14599 X(IDChoice,)S 240 x(MATCH,)S 240 x(ACCESS)S 449 y +6708 X(events:)S 14599 X(none)S 896 y 4796 X F151(XIEP_G)S -2 x +(ET_TILE)S 181 x(transfers)S 179 x(an)S 181 x(uncompressed)S 180 x +(image)S 181 x(data)S 180 x(tile)S 180 x(from)S 180 x(a)S 180 x +(server)S 181 x(IOB)S 179 x(across)S 180 x(the)S 598 y 4796 X(wire)S +176 x(into)S 176 x(a)S 176 x(client)S 177 x(buffer)S -37 x(.)S 271 x +(The)S 177 x(client)S 176 x(speci\211es)S 177 x(both)S 176 x(the)S +177 x(tile)S 176 x(size)S 175 x(and)S 177 x(its)S 176 x(source)S +177 x(location)S 176 x(in)S 177 x(the)S 598 y 4796 X(sending)S 173 x +(IOB.)S 173 x(The)S 174 x(IOB)S 172 x(must)S 173 x(be)S 173 x +(preexisting,)S 176 x(and)S 173 x(the)S 174 x(transport)S 173 x +(context)S 173 x(previously)S 175 x(establis)S -2 x(hed)S 597 y +4796 X(\(XIE)S -2 x(P_SET_TRANSPORT\).)S 897 y 4796 X(IOB)S -2 x +(_id)S 188 x(is)S 188 x(the)S 188 x(id)S 188 x(of)S 188 x(the)S 189 x +(sending)S 189 x(IOB.)S 187 x(X)S 188 x(and)S 188 x(y)S 189 x +(specify)S 188 x(the)S 189 x(upper)S 188 x(left)S 188 x(hand)S 189 x +(corner)S 189 x(\(in)S 188 x(IOB)S 598 y 4796 X(coordinates\))S 187 x +(of)S 187 x(the)S 187 x(sending)S 188 x(location.)S 291 x(Height)S +188 x(and)S 187 x(width)S 187 x(specify)S 187 x(the)S 187 x(tile)S +187 x(size.)S 291 x(Plane_mask)S 598 y 4796 X(identi\211es)S 167 x +(which)S 168 x(data)S 168 x(planes)S 167 x(are)S 168 x(being)S 169 x +(requested.)S 253 x(Final)S 168 x(is)S 167 x(a)S 168 x(boolean)S +168 x(which)S 169 x(indicates)S 167 x(if)S 168 x(all)S 167 x(IOB)S +597 y 4796 X(data)S 180 x(\(the)S 181 x(\211nal)S 181 x(tile\))S +180 x(has)S 181 x(been)S 181 x(asked)S 180 x(for)S -36 x(.)S 278 x +(Image_data)S 181 x(is)S 180 x(the)S 181 x(data)S 180 x(segment)S +181 x(received)S 181 x(from)S 181 x(the)S 598 y 4796 X(server)S -37 x +(.)S 21753 Y 4796 X F152(Bitonal)S 166 x(Monochromatic)S 896 y 4796 X +F151(T)S -31 x(ransport)S 181 x(of)S 181 x(bitonal)S 180 x(monochro)S +2 x(matic)S 180 x(image)S 181 x(data)S 181 x(always)S 180 x(occurs)S +182 x(in)S 181 x(the)S 181 x(same)S 180 x(fashion)S 181 x(\(Band_)S +598 y 4796 X(Interleaved_by_Pixel,)S 196 x +(Band_Interleaved_by_Plane,)S 196 x(and)S 189 x +(Bit_Interleaved_by_Plane)S 189 x(are)S 189 x(all)S 598 y 4796 X +(degenerate\).)S 250 x(In)S 166 x(this)S 166 x(case,)S 166 x(the)S +166 x(client)S 167 x(buffer)S 166 x(will)S 165 x(be)S 166 x(an)S +167 x(array)S 166 x(of)S 166 x(bits,)S 166 x(one)S 167 x(per)S 166 x +(pixel.)S 25040 Y 4796 X F152(Continuous)S 167 x(T)S -44 x(one)S +167 x(Monochromatic)S 167 x(-)S 166 x(Aggreg)S 2 x(ated)S 897 y +4796 X F151(T)S -31 x(ransport)S 170 x(of)S 170 x(continuou)S 2 x(s)S +170 x(tone)S 170 x(monochromatic)S 171 x(image)S 171 x(data)S 170 x +(can)S 170 x(occur)S 172 x(in)S 170 x(two)S 170 x(fashions:)S 258 x +(by)S 170 x(Band_)S 598 y 4796 X(Interleaved_by_Pixel)S 193 x(and)S +193 x(Band_Interleaved_by_Plane)S 194 x(which)S 192 x(are)S 193 x +(degenerate,)S 200 x(or)S 192 x(by)S 193 x(Bit_)S 598 y 4796 X +(Interleaved_by_Plane.)S 285 x(As)S 183 x(there)S 183 x(is)S 183 x +(only)S 184 x(one)S 184 x(spectral)S 183 x(band,)S 188 x(the)S 183 x +(image)S 184 x(data)S 182 x(organ)S 2 x(ization)S 182 x(in)S 597 y +4796 X(the)S 166 x(client)S 166 x(buffer)S 166 x(for)S 166 x(the)S +167 x(\211rst)S 166 x(case)S 165 x(is)S 166 x(simply)S 166 x(an)S +166 x(array)S 167 x(of)S 166 x(pixels,)S 166 x(n)S 167 x(bits)S 165 x +(per)S 166 x(pixel.)S 28926 Y 4796 X F152(Continuous)S 167 x(T)S +-44 x(one)S 167 x(Monochromatic)S 167 x(-)S 166 x(Bit)S 166 x +(Interleaved)S 167 x(by)S 166 x(Plane)S 896 y 4796 X F151(In)S 182 x +(the)S 183 x(Bit_Interleaved_by_Plane)S 183 x(mode)S 182 x +(transport)S 183 x(of)S 182 x(continuou)S 2 x(s)S 182 x(tone)S 182 x +(monochromatic)S 183 x(image)S 598 y 4796 X(data,)S 165 x(the)S 165 x +(client)S 166 x(has)S 165 x(the)S 166 x(option)S 165 x(of)S 165 x +(receiving)S 167 x(a)S 165 x(tile)S 165 x(from)S 165 x(one)S 166 x +(through)S 167 x(n)S 166 x(data)S 164 x(planes.)S 250 x(If)S 165 x +(more)S 165 x(than)S 598 y 4796 X(one)S 176 x(plane)S 176 x(is)S +176 x(to)S 176 x(be)S 176 x(transported,)S 179 x(the)S 177 x(planes)S +176 x(must)S 175 x(abut)S 176 x(\(long)S 177 x(word)S 176 x +(alignment)S 177 x(of)S 176 x(planes\))S 176 x(in)S 176 x(the)S 598 y +4796 X(client')S -19 x(s)S 166 x(buffer)S -37 x(.)S 32811 Y 4796 X +F152(Continuous)S 167 x(T)S -44 x(one)S 167 x(Polychromatic)S 167 x +(-)S 166 x(Band)S 166 x(Interleaved)S 167 x(by)S 166 x(Pixel)S 35879 Y +19780 X F40(REQUESTS)S 165 x(AND)S 165 x(REPLIES)S 448 x(7\20325)S +PP +EP +%%DOC$Page: 7-26 54 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(T)S -31 x(ransport)S 170 x(of)S 169 x(continuo)S +2 x(us)S 169 x(tone)S 170 x(polychromatic)S 171 x(image)S 170 x +(data)S 169 x(can)S 171 x(occur)S 170 x(in)S 170 x(any)S 171 x(of)S +170 x(the)S 170 x(three)S 170 x(formats:)S 598 y 4796 X +(Band_Interleaved_by_Pixel,)S 182 x(Band_Interleaved_by_)S 2 x +(Plane,)S 181 x(and)S 178 x(Bit_Interleaved_by_Plane.)S 274 x(In)S +597 y 4796 X(the)S 169 x(Band_Interleaved_by_P)S 2 x(ixel)S 169 x +(mode)S 170 x(the)S 170 x(client)S 169 x(buffer)S 170 x(is)S 169 x +(once)S 170 x(again)S 171 x(simply)S 169 x(an)S 170 x(array)S 170 x +(of)S 169 x(pixels,)S 598 y 4796 X(n)S 167 x(bits)S 166 x(per)S 166 x +(pixel,)S 168 x(where)S 167 x(the)S 167 x(r)S -9 x(-g-b)S 167 x +(bits)S 166 x(make)S 167 x(up)S 167 x(the)S 167 x(total)S 166 x(n.)S +251 x(No)S 167 x(option)S 166 x(exists)S 167 x(regarding)S 168 x +(receiving)S 598 y 4796 X(a)S 166 x(single)S 166 x(bit)S 166 x +(plane)S 166 x(or)S 166 x(spectral)S 166 x(band.)S 8751 Y 4796 X F152 +(Continuous)S 167 x(T)S -44 x(one)S 167 x(Polychromatic)S 167 x(-)S +166 x(Band)S 166 x(Interleaved)S 167 x(by)S 166 x(Plane)S 897 y +4796 X F151(In)S 182 x(the)S 183 x(Band_Interleaved_by_Plane)S 184 x +(mode,)S 186 x(the)S 183 x(client)S 182 x(has)S 183 x(the)S 182 x +(option)S 183 x(of)S 182 x(receiving)S 184 x(a)S 182 x(tile)S 182 x +(from)S 598 y 4796 X(one)S 176 x(through)S 178 x(n)S 176 x(\(max)S +177 x(3\))S 176 x(spectral)S 175 x(bands.)S 270 x(If)S 176 x(more)S +176 x(than)S 177 x(one)S 176 x(data)S 176 x(plane)S 176 x(\(band)S +177 x(in)S 176 x(this)S 176 x(case\))S 176 x(is)S 175 x(to)S 598 y +4796 X(be)S 176 x(transported,)S 179 x(they)S 177 x(will)S 176 x +(abut)S 176 x(each)S 177 x(other)S 177 x(\(long)S 177 x(word)S 176 x +(alignment)S 177 x(of)S 177 x(the)S 176 x(planes\))S 177 x(in)S 176 x +(the)S 177 x(client')S -19 x(s)S 597 y 4796 X(buffer)S -37 x(.)S +12637 Y 4796 X F152(Continuous)S 167 x(T)S -44 x(one)S 167 x +(Polychromatic)S 167 x(-)S 166 x(Bit)S 166 x(Interleaved)S 167 x(by)S +166 x(Plane)S 896 y 4796 X F151(In)S 178 x(the)S 178 x +(Bit_Interleaved_by_Plane)S 179 x(mode,)S 181 x(the)S 178 x(client)S +178 x(has)S 178 x(the)S 178 x(option)S 178 x(of)S 178 x(receiving)S +180 x(one)S 178 x(throug)S 2 x(h)S 178 x(n)S 598 y 4796 X(data)S +158 x(planes)S 159 x(\(each)S 159 x(data)S 159 x(plane)S 159 x(is)S +159 x(now)S 159 x(a)S 159 x(bit)S 159 x(plane\).)S 249 x(If)S 159 x +(more)S 159 x(than)S 159 x(one)S 160 x(data)S 159 x(plane)S 159 x +(\(bit)S 158 x(plane)S 160 x(in)S 159 x(this)S 598 y 4796 X(case\))S +166 x(is)S 167 x(to)S 166 x(be)S 167 x(transported,)S 168 x(they)S +167 x(will)S 167 x(abut)S 167 x(each)S 167 x(other)S 167 x(\(long)S +168 x(word)S 167 x(alignment)S 167 x(of)S 167 x(the)S 167 x +(planes\))S 167 x(in)S 167 x(the)S 598 y 4796 X(client')S -19 x(s)S +166 x(buffer)S -37 x(.)S 896 y 4796 X(Specifying)S 189 x(a)S 188 x +(non)S 190 x(existent)S 188 x(IOB)S 187 x(gener)S 2 x(ates)S 187 x +(an)S 189 x(IDChoice)S 188 x(error)S -36 x(.)S 294 x(Specifying)S +190 x(an)S 189 x(IOB)S 187 x(which)S 189 x(is)S 598 y 4796 X +(unconstrained)S 169 x(gener)S 2 x(ates)S 168 x(a)S 169 x(MA)S -28 x +(TCH)S 169 x(error)S -36 x(.)S 255 x(A)S 168 x(mismatch)S 168 x +(between)S 169 x(the)S 169 x(sending)S 170 x(IOB')S -20 x(s)S 168 x +(component-)S 598 y 4796 X(space-organization)S 151 x(and)S 151 x +(the)S 152 x(current)S 152 x(transport)S 151 x(context')S -18 x(s)S +151 x(component-space-organization)S 152 x(generates)S 598 y 4796 X +(a)S 176 x(MA)S -28 x(TCH)S 176 x(error)S -36 x(.)S 270 x(Attempts)S +175 x(to)S 176 x(transport)S 176 x(from)S 177 x(an)S 176 x(IOB)S +175 x(which)S 177 x(has)S 176 x(not)S 177 x(had)S 176 x(a)S 177 x +(transport)S 176 x(context)S 597 y 4796 X(establis)S -2 x(hed)S 167 x +(\(XIEP_SE)S -2 x(T_TRANSPORT\))S 166 x(generates)S 166 x(an)S 167 x +(ACCE)S -2 x(SS)S 166 x(error)S -36 x(.)S 20109 Y 3600 X F28(7.3.4)S +599 x(Stream)S 167 x(Data)S 166 x(T)S -33 x(ransport)S 21205 Y 4796 X +F151(Stream)S 173 x(data)S 173 x(transport)S 173 x(allows)S 172 x(a)S +174 x(client)S 173 x(to)S 174 x(stream)S 173 x(image)S 173 x(data)S +173 x(or)S 174 x(image)S 174 x(code)S 173 x(information)S 174 x +(\(com-)S 597 y 4796 X(pressed)S 175 x(image)S 175 x(data\))S 175 x +(between)S 176 x(a)S 175 x(client)S 176 x(buffer)S 176 x(and)S 176 x +(a)S 175 x(new)S 176 x(\(PUT\))S 176 x(or)S 175 x(existing)S 177 x +(\(GET\))S 174 x(IOB.)S 175 x(In)S 176 x(the)S 598 y 4796 X(case)S +183 x(of)S 184 x(image)S 185 x(code)S 184 x(information)S 184 x +(\(compressed)S 183 x(image)S 185 x(data\),)S 188 x(the)S 184 x +(server)S 185 x(compress/decompress)S 598 y 4796 X(step)S 167 x(is)S +168 x(hidden)S 169 x(\(happens)S 169 x(without)S 168 x(client)S 168 x +(interven)S 2 x(tion\).)S 254 x(The)S 169 x(client)S 169 x(controls)S +168 x(both)S 169 x(the)S 168 x(compression)S 598 y 4796 X(format)S +159 x(and)S 159 x(the)S 160 x(length)S 160 x(of)S 160 x(stream)S +158 x(data.)S 250 x(Unlike)S 160 x(tile)S 159 x(transport,)S 161 x +(only)S 160 x(one)S 160 x(data)S 159 x(plane)S 160 x(may)S 159 x(be)S +160 x(trans-)S 598 y 4796 X(ported)S 177 x(with)S 176 x(each)S 178 x +(stream)S 176 x(transport)S 177 x(protocol)S 177 x(request.)S 272 x +(Note)S 177 x(that)S 177 x(this)S 177 x(does)S 177 x(not)S 177 x +(prevent)S 178 x(clients)S 597 y 4796 X(from)S 179 x(interleaving)S +181 x(stream)S 180 x(transport)S 179 x(of)S 180 x(different)S 179 x +(planes.)S 277 x(For)S 180 x(stream)S 180 x(transport,)S 183 x(the)S +180 x(data)S 179 x(can)S 598 y 4796 X(only)S 166 x(be)S 166 x +(sent/receiv)S 2 x(ed)S 166 x(in)S 166 x(sequential)S 166 x +(\(raster\))S 166 x(order)S 166 x(-)S 166 x(no)S 166 x(random)S 167 x +(access)S 165 x(is)S 166 x(possible.)S 897 y 4796 X(Note)S 180 x +(that)S 181 x(unlike)S 182 x(tile)S 180 x(transport,)S 185 x(in)S +181 x(stream)S 180 x(transport)S 181 x(image)S 181 x(data)S 181 x +(or)S 181 x(image)S 181 x(code)S 181 x(information)S 597 y 4796 X +(is)S 173 x(being)S 175 x(sent)S 173 x(sequentially)S -54 x(,)S 176 x +(and)S 174 x(not)S 174 x(image)S 174 x(data)S 174 x(tiles)S 173 x +(randomly)S -54 x(.)S 265 x(This)S 174 x(data)S 174 x(or)S 174 x +(information)S 174 x(is)S 173 x(in)S 598 y 4796 X(essence)S 168 x +(aggregated)S 169 x(sequentially)S 168 x(into)S 169 x(one)S 168 x +(or)S 168 x(more)S 168 x(buffers)S 168 x(and)S 169 x(then,)S 169 x +(if)S 168 x(necessary)S -55 x(,)S 169 x(decompressed)S 598 y 4796 X +(to)S 167 x(produce)S 167 x(the)S 168 x(image)S 167 x(data.)S 252 x +(Particulars)S 167 x(of)S 167 x(decompression)S 168 x(on)S 167 x +(the)S 168 x(server)S 167 x(side)S 167 x(of)S 167 x(the)S 168 x +(wire)S 167 x(depend)S 598 y 4796 X(upon)S 163 x(both)S 162 x(the)S +163 x(compression)S 162 x(scheme)S 163 x(involved)S 163 x(and)S 163 x +(the)S 162 x(server)S 163 x(implementation)S 163 x(\(ie.)S 249 x(G4)S +162 x(decompres-)S 597 y 4796 X(sion)S 171 x(may)S 172 x(be)S 172 x +(conducted)S 172 x(as)S 172 x(code)S 172 x(information)S 172 x +(arrives)S 172 x(as)S 171 x(may)S 172 x(DCT)S 171 x(decompression,)S +174 x(or)S 172 x(the)S 171 x(server)S 598 y 4796 X(may)S 166 x +(chose)S 166 x(to)S 166 x(wait)S 165 x(for)S 166 x(the)S 167 x +(complete)S 165 x(code)S 167 x(information)S 166 x(to)S 166 x(be)S +166 x(available)S 166 x(before)S 166 x(decompression\).)S 35879 Y +3600 X F40(7\20326)S 449 x(REQUESTS)S 166 x(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-27 55 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 3600 X F36(7.3.4.1)S 599 x(Client\203>Server)S 747 y 4796 X +F102(XIEP_PUT_STREAM)S 747 y 6708 X(iob_id)S 14599 X(XIT_IOB)S 448 y +6708 X(byte_count)S 14599 X(CARD32)S 449 y 6708 X(final)S 14599 X +(BOOL)S 448 y 6708 X(plane_num)S 14599 X(CARD8)S 448 y 6708 X +(image_data)S 14599 X(XIT_IDATA)S 747 y 6708 X(=>)S 748 y -478 x +(none)S 747 y 6708 X(service)S 240 x(class)S 240 x(value:)S 14599 X +(0)S 448 y 6708 X(errors:)S 14599 X(IDChoice,)S 240 x(MATCH,)S 240 x +(ACCESS)S 449 y 6708 X(events:)S 14599 X(none)S 896 y 4796 X F151 +(XIEP_PUT_STREA)S -2 x(M)S 185 x(transfers)S 184 x(image)S 185 x +(data)S 184 x(or)S 185 x(image)S 185 x(code)S 185 x(information)S +185 x(\(compressed)S 184 x(image)S 598 y 4796 X(data\))S 184 x(from)S +186 x(a)S 185 x(client)S 185 x(buffer)S 186 x(across)S 185 x(the)S +185 x(wire)S 185 x(into)S 186 x(a)S 185 x(server)S 186 x(IOB.)S 185 x +(If)S 184 x(image)S 186 x(code)S 186 x(information)S 185 x(is)S 598 y +4796 X(transported,)S 189 x(it)S 185 x(is)S 184 x(decompressed)S +185 x(into)S 185 x(image)S 185 x(data)S 184 x(before)S 185 x(being)S +186 x(placed)S 185 x(in)S 185 x(the)S 185 x(IOB.)S 184 x(The)S 186 x +(IOB)S 597 y 4796 X(must)S 176 x(be)S 178 x(newly)S 178 x(created)S +177 x(\(XIEP_CRE)S -2 x(A)S -27 x(TE_RESO)S -2 x(URCE\),)S 177 x +(and)S 177 x(the)S 178 x(transport)S 177 x(context)S 178 x +(previously)S 598 y 4796 X(establis)S -2 x(hed)S 167 x(\(XIEP_SE)S +-2 x(T_TRANSPORT\).)S 897 y 4796 X(IOB)S -2 x(_id)S 174 x(is)S 174 x +(the)S 174 x(id)S 174 x(of)S 174 x(the)S 174 x(receiving)S 176 x +(IOB.)S 173 x(Byte_count)S 175 x(speci\211es)S 174 x(the)S 174 x +(number)S 175 x(of)S 174 x(bits)S 173 x(of)S 174 x(valid)S 174 x +(image)S 598 y 4796 X(data)S 170 x(or)S 171 x(code)S 171 x +(information)S 171 x(in)S 171 x(the)S 171 x(buffer)S -36 x(.)S 259 x +(Final)S 171 x(is)S 170 x(a)S 171 x(boolean)S 171 x(which)S 171 x +(indicates)S 171 x(if)S 171 x(all)S 170 x(image)S 171 x(data)S 171 x +(or)S 597 y 4796 X(code)S 174 x(information)S 174 x(has)S 173 x +(been)S 175 x(sent.)S 265 x(Plane_num)S 175 x(identi\211es)S 174 x +(which)S 174 x(bit)S 173 x(plane)S 174 x(is)S 174 x(being)S 174 x +(sent.)S 265 x(Image_)S 598 y 4796 X(data)S 172 x(is)S 172 x(the)S +173 x(image)S 173 x(data)S 173 x(or)S 173 x(image)S 173 x(code)S +173 x(information)S 173 x(\(compressed)S 172 x(image)S 173 x(data\))S +173 x(to)S 172 x(be)S 173 x(transported)S 598 y 4796 X(from)S 165 x +(client)S 167 x(to)S 166 x(server)S -37 x(.)S 19367 Y 4796 X F152 +(Bitonal)S 166 x(Monochromatic)S 897 y 4796 X F151(T)S -31 x +(ransport)S 169 x(of)S 169 x(bitonal)S 168 x(monochro)S 2 x(matic)S +168 x(image)S 169 x(data)S 169 x(or)S 169 x(image)S 169 x(code)S +169 x(information)S 169 x(\(compressed)S 169 x(image)S 598 y 4796 X +(data\))S 174 x(always)S 175 x(occurs)S 176 x(in)S 176 x(the)S 175 x +(same)S 175 x(fashion)S 175 x(\(Band_Interleaved_by_Pix)S 2 x(el,)S +178 x(Band_Interleaved_by_)S 598 y 4796 X(Plane,)S 171 x(and)S 170 x +(Bit_Interleaved_by_Plane)S 170 x(are)S 170 x(all)S 169 x +(degenerate\).)S 257 x(In)S 170 x(the)S 170 x(stream)S 168 x +(uncompressed)S 170 x(\(PCM\))S 597 y 4796 X(mode,)S 175 x(the)S +173 x(client)S 174 x(buffer)S 173 x(is)S 173 x(simply)S 173 x(an)S +173 x(array)S 174 x(of)S 173 x(butted)S 173 x(data)S 173 x(bits)S +173 x(\(1)S 173 x(bit)S 173 x(per)S 173 x(pixel\).)S 264 x(In)S 173 x +(the)S 174 x(stream)S 598 y 4796 X(compressed)S 165 x(mode)S 166 x +(\(G4\))S 165 x(the)S 166 x(client)S 167 x(buffer)S 166 x(is)S 166 x +(an)S 166 x(array)S 167 x(of)S 166 x(butted)S 166 x(code)S 166 x +(bit)S 166 x(strings.)S 23851 Y 4796 X F152(Continuous)S 167 x(T)S +-44 x(one)S 167 x(Monochromatic)S 167 x(-)S 166 x(Pixel)S 167 x +(Aggregated)S 896 y 4796 X F151(T)S -31 x(ransport)S 184 x(of)S 184 x +(continuous)S 185 x(tone)S 185 x(monochromatic)S 184 x(image)S 185 x +(data)S 184 x(or)S 184 x(image)S 184 x(code)S 185 x(information)S +184 x(\(com-)S 598 y 4796 X(pressed)S 183 x(image)S 184 x(data\))S +183 x(can)S 184 x(occur)S 184 x(in)S 184 x(two)S 183 x(fashions:)S +285 x(by)S 184 x(Band_Interleaved_by_Pix)S 2 x(el)S 183 x(and)S 184 x +(Band_)S 598 y 4796 X(Interleaved_by_Plane)S 169 x(which)S 167 x +(are)S 168 x(degenerate,)S 169 x(or)S 168 x(by)S 168 x +(Bit_Interleaved_by_Plane.)S 253 x(In)S 167 x(the)S 168 x(\211rst)S +167 x(case,)S 597 y 4796 X(for)S 169 x(stream)S 169 x(uncompressed)S +169 x(\(PCM\))S 169 x(mode,)S 171 x(the)S 169 x(client)S 170 x +(buffer)S 169 x(is)S 169 x(simply)S 169 x(an)S 170 x(array)S 170 x +(of)S 169 x(butted)S 169 x(data)S 169 x(bits)S 598 y 4796 X(\(n)S +164 x(bits)S 163 x(per)S 165 x(pixel\).)S 249 x(In)S 165 x(the)S +164 x(stream)S 163 x(compressed)S 164 x(mode)S 164 x(\(DCT\))S 164 x +(the)S 164 x(client)S 164 x(buffer)S 165 x(is)S 163 x(an)S 165 x +(array)S 165 x(of)S 164 x(butted)S 598 y 4796 X(code)S 166 x(bit)S +165 x(strings.)S 28932 Y 4796 X F152(Continuous)S 167 x(T)S -44 x +(one)S 167 x(Monochromatic)S 167 x(-)S 166 x(Bit)S 166 x +(Interleaved)S 167 x(by)S 166 x(Plane)S 896 y 4796 X F151(In)S 182 x +(the)S 183 x(Bit_Interleaved_by_Plane)S 183 x(mode)S 182 x +(transport)S 183 x(of)S 182 x(continuou)S 2 x(s)S 182 x(tone)S 182 x +(monochromatic)S 183 x(image)S 598 y 4796 X(data)S 167 x(or)S 168 x +(image)S 167 x(code)S 168 x(information)S 168 x(\(compressed)S 167 x +(image)S 168 x(data\),)S 168 x(the)S 168 x(client)S 167 x(may)S 168 x +(only)S 169 x(send)S 167 x(image)S 168 x(data)S 598 y 4796 X(or)S +177 x(image)S 178 x(code)S 178 x(information)S 177 x(\(compressed)S +177 x(image)S 178 x(data\))S 177 x(from)S 177 x(one)S 178 x(data)S +177 x(plane)S 178 x(\(bit)S 177 x(plane\))S 177 x(in)S 178 x(each)S +597 y 4796 X(transport)S 168 x(call.)S 254 x(In)S 169 x(the)S 169 x +(stream)S 168 x(uncompressed)S 168 x(\(PCM\))S 169 x(mode,)S 169 x +(the)S 169 x(bit)S 168 x(plane)S 169 x(in)S 169 x(the)S 169 x +(client')S -19 x(s)S 168 x(buffer)S 169 x(is)S 598 y 4796 X(simply)S +172 x(an)S 172 x(array)S 173 x(of)S 173 x(butted)S 172 x(data)S 172 x +(bits.)S 261 x(In)S 173 x(the)S 172 x(stream)S 172 x(compressed)S +172 x(mode)S 172 x(\(G4\))S 171 x(the)S 173 x(client)S 173 x(buffer)S +172 x(is)S 598 y 4796 X(an)S 166 x(array)S 167 x(of)S 166 x(butted)S +166 x(code)S 166 x(bit)S 165 x(strings.)S 34012 Y 4796 X F152 +(Continuous)S 167 x(T)S -44 x(one)S 167 x(Polychromatic)S 35879 Y +19780 X F40(REQUESTS)S 165 x(AND)S 165 x(REPLIES)S 448 x(7\20327)S +PP +EP +%%DOC$Page: 7-28 56 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(T)S -31 x(ransport)S 164 x(of)S 165 x(continuous)S +165 x(tone)S 165 x(polychromatic)S 165 x(image)S 165 x(data)S 164 x +(or)S 164 x(image)S 165 x(code)S 165 x(information)S 164 x +(\(compressed)S 598 y 4796 X(image)S 183 x(data\))S 183 x(can)S 184 x +(occur)S 184 x(in)S 184 x(three)S 184 x(formats:)S 284 x +(Band_Interleaved_by_Plane,)S 189 x(Bit_Interleaved_by_)S 597 y +4796 X(Plane,)S 167 x(and)S 166 x(Band_Interleaved_by_Pix)S 2 x(el.)S +7556 Y 4796 X F152(Continuous)S 167 x(T)S -44 x(one)S 167 x +(Polychromatic)S 167 x(-)S 166 x(Band)S 166 x(Interleaved)S 167 x +(by)S 166 x(Pixel)S 897 y 4796 X F151(In)S 169 x(the)S 169 x +(Band_Interleaved_by_Pix)S 2 x(el)S 169 x(mode,)S 170 x +(uncompressed)S 169 x(image)S 169 x(data)S 169 x(or)S 169 x(image)S +169 x(code)S 169 x(information)S 597 y 4796 X(\(compressed)S 165 x +(image)S 166 x(data\))S 166 x(for)S 166 x(all)S 166 x(bands)S 166 x +(is)S 165 x(sent.)S 10246 Y 4796 X F152(Continuous)S 167 x(T)S -44 x +(one)S 167 x(Polychromatic)S 167 x(-)S 166 x(Band)S 166 x +(Interleaved)S 167 x(by)S 166 x(Plane)S 896 y 4796 X F151(In)S 175 x +(the)S 176 x(Band_Interleaved_by_Plan)S 2 x(e)S 175 x(mode,)S 179 x +(the)S 176 x(client)S 176 x(has)S 175 x(the)S 176 x(option)S 176 x +(of)S 175 x(sending)S 177 x(image)S 176 x(data)S 175 x(or)S 598 y +4796 X(image)S 183 x(code)S 184 x(information)S 184 x(\(compressed)S +183 x(image)S 184 x(data\))S 184 x(for)S 183 x(any)S 185 x(one)S +184 x(plane)S 184 x(\(spectral)S 183 x(band\))S 184 x(In)S 184 x +(the)S 598 y 4796 X(stream)S 166 x(uncompressed)S 168 x(\(PCM\))S +167 x(mode,)S 169 x(the)S 167 x(band)S 168 x(in)S 168 x(the)S 167 x +(client')S -18 x(s)S 167 x(buffer)S 168 x(is)S 167 x(simply)S 167 x +(an)S 167 x(array)S 169 x(of)S 167 x(butted)S 598 y 4796 X(data)S +173 x(bits.)S 265 x(In)S 174 x(the)S 174 x(stream)S 173 x +(compressed)S 173 x(mode)S 174 x(\(DCT\))S 173 x(the)S 174 x(client)S +174 x(buffer)S 175 x(is)S 173 x(an)S 174 x(array)S 175 x(of)S 174 x +(butted)S 174 x(code)S 597 y 4796 X(bit)S 165 x(strings)S 166 x(for)S +166 x(the)S 167 x(particular)S 166 x(band.)S 14729 Y 4796 X F152 +(Continuous)S 167 x(T)S -44 x(one)S 167 x(Polychromatic)S 167 x(-)S +166 x(Bit)S 166 x(Interleaved)S 167 x(by)S 166 x(Plane)S 897 y 4796 X +F151(In)S 182 x(the)S 183 x(Bit_Interleaved_by_Plane)S 184 x(mode,)S +187 x(the)S 183 x(client)S 183 x(has)S 183 x(the)S 183 x(option)S +183 x(of)S 182 x(sending)S 184 x(image)S 183 x(data)S 182 x(or)S +597 y 4796 X(image)S 173 x(code)S 172 x(information)S 174 x +(\(compressed)S 172 x(image)S 173 x(data\))S 172 x(from)S 173 x(any)S +173 x(one)S 173 x(data)S 173 x(plane)S 173 x(\(bit)S 172 x(plane\).)S +263 x(In)S 173 x(the)S 598 y 4796 X(stream)S 176 x(uncompressed)S +178 x(\(PCM\))S 177 x(mode,)S 181 x(the)S 177 x(bit)S 177 x(plane)S +178 x(in)S 178 x(the)S 177 x(client')S -18 x(s)S 177 x(buffer)S 177 x +(is)S 177 x(simply)S 177 x(an)S 178 x(array)S 178 x(of)S 598 y 4796 X +(butted)S 181 x(data)S 182 x(bits)S 181 x(\(1)S 182 x(per)S 182 x +(pixel\).)S 281 x(In)S 182 x(the)S 182 x(stream)S 182 x(compressed)S +181 x(mode)S 182 x(\(G4\))S 181 x(the)S 182 x(client)S 182 x(buffer)S +183 x(is)S 181 x(an)S 598 y 4796 X(array)S 166 x(of)S 166 x(butted)S +166 x(code)S 166 x(bit)S 166 x(strings.)S 896 y 4796 X(Specifying)S +189 x(a)S 188 x(non)S 190 x(existent)S 188 x(IOB)S 187 x(gener)S +2 x(ates)S 187 x(an)S 189 x(IDChoice)S 188 x(error)S -36 x(.)S 294 x +(Specifying)S 190 x(an)S 189 x(IOB)S 187 x(which)S 189 x(is)S 598 y +4796 X(unconstrained)S 157 x(generates)S 157 x(a)S 157 x(MA)S -28 x +(TCH)S 157 x(error)S -36 x(.)S 249 x(A)S 156 x(mismatch)S 156 x +(between)S 157 x(the)S 157 x(receiving)S 158 x(IOB')S -20 x(s)S 156 x +(component-)S 598 y 4796 X(space-organization)S 187 x(and)S 188 x +(the)S 187 x(curren)S 2 x(t)S 187 x(transport)S 187 x(context')S +-18 x(s)S 187 x(component-space-organization)S 188 x(\(ie.)S 598 y +4796 X(trying)S 171 x(to)S 169 x(send)S 170 x(an)S 170 x(rgb)S 171 x +(color)S 170 x(image)S 170 x(over)S 171 x(the)S 170 x(wire)S 170 x +(into)S 170 x(a)S 169 x(monochro)S 2 x(me)S 169 x(IOB\))S 169 x +(generates)S 170 x(a)S 170 x(MA)S -27 x(TCH)S 597 y 4796 X(error)S +-37 x(.)S 250 x(Attempts)S 163 x(to)S 164 x(transport)S 164 x(from)S +164 x(an)S 165 x(IOB)S 163 x(which)S 165 x(has)S 165 x(never)S 165 x +(had)S 165 x(a)S 164 x(transport)S 164 x(context)S 165 x +(established)S 598 y 4796 X(\(XIE)S -2 x(P_SET_TRANSPORT\))S 166 x +(generates)S 166 x(an)S 167 x(ACC)S -2 x(ESS)S 166 x(error)S -36 x +(.)S 23397 Y 3600 X F36(7.3.4.2)S 599 x(Server\203>Client)S 747 y +4796 X F102(XIEP_GET_STREAM)S 747 y 6708 X(iob_id)S 14599 X(XIT_IOB)S +448 y 6708 X(max_bytes)S 14599 X(CARD32)S 449 y 6708 X(plane_num)S +14599 X(CARD8)S 747 y 6708 X(=>)S 747 y -478 x(final)S 14599 X(BOOL)S +448 y 6708 X(byte_count)S 14599 X(CARD32)S 449 y 6708 X(image_data)S +14599 X(XIT_IDATA)S 747 y 6708 X(service)S 240 x(class)S 240 x +(value:)S 14599 X(0)S 448 y 6708 X(errors:)S 14599 X(IDChoice,)S +240 x(MATCH,)S 240 x(ACCESS)S 448 y 6708 X(events:)S 14599 X(none)S +897 y 4796 X F151(XIEP_G)S -2 x(ET_STREAM)S 156 x(transfers)S 156 x +(image)S 157 x(data)S 156 x(or)S 157 x(image)S 156 x(code)S 157 x +(information)S 157 x(\(compressed)S 155 x(image)S 157 x(data\))S +598 y 4796 X(from)S 170 x(a)S 171 x(server)S 172 x(IOB)S 170 x +(across)S 170 x(the)S 171 x(wire)S 171 x(to)S 171 x(a)S 170 x +(client)S 172 x(buffer)S -37 x(.)S 259 x(In)S 171 x(compressed)S +171 x(mode,)S 172 x(the)S 171 x(server)S 172 x(extracts)S 598 y +4796 X(image)S 175 x(data)S 175 x(from)S 175 x(the)S 176 x(IOB)S +174 x(and)S 176 x(compresses)S 174 x(it)S 175 x(before)S 176 x +(putting)S 176 x(it)S 175 x(on)S 175 x(the)S 176 x(wire.)S 268 x +(The)S 176 x(IOB)S 174 x(must)S 175 x(be)S 597 y 4796 X +(preexisting,)S 167 x(and)S 166 x(the)S 166 x(transport)S 166 x +(context)S 167 x(previously)S 167 x(established)S 165 x +(\(XIEP_SET_TRANSPO)S -2 x(RT\).)S 897 y 4796 X(IOB)S -2 x(_id)S +169 x(is)S 169 x(the)S 169 x(id)S 169 x(of)S 169 x(the)S 169 x +(sending)S 170 x(IOB.)S 168 x(Max_bytes)S 170 x(is)S 168 x(the)S +169 x(maximum)S 170 x(number)S 169 x(of)S 169 x(bytes)S 169 x(the)S +169 x(client)S 169 x(is)S 598 y 4796 X(prepared)S 166 x(to)S 166 x +(receive)S 167 x(\(typically)S 166 x(buffer)S 166 x(size\).)S 249 x +(Plane_num)S 167 x(identi\211es)S 166 x(which)S 167 x(bit)S 165 x +(plane)S 167 x(is)S 165 x(to)S 166 x(be)S 166 x(sent.)S 35879 Y +3600 X F40(7\20328)S 449 x(REQUESTS)S 166 x(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-29 57 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(Final)S 171 x(is)S 171 x(a)S 171 x(boolean)S 172 x +(which)S 172 x(indicates)S 171 x(if)S 171 x(all)S 171 x(image)S 172 x +(data)S 171 x(or)S 171 x(code)S 172 x(information)S 172 x(has)S 171 x +(been)S 172 x(sent.)S 260 x(Byte_)S 598 y 4796 X(count)S 185 x +(speci\211es)S 184 x(the)S 184 x(number)S 185 x(of)S 184 x(bytes)S +185 x(of)S 184 x(valid)S 184 x(image)S 185 x(data)S 184 x(or)S 185 x +(code)S 184 x(information)S 185 x(in)S 184 x(the)S 185 x(buffer)S +-37 x(.)S 597 y 4796 X(Image_data)S 172 x(is)S 172 x(the)S 173 x +(image)S 172 x(data)S 173 x(or)S 172 x(image)S 173 x(code)S 173 x +(information)S 173 x(\(compressed)S 172 x(image)S 172 x(data\))S +173 x(which)S 172 x(has)S 598 y 4796 X(bene)S 166 x(transported)S +166 x(from)S 166 x(server)S 166 x(to)S 166 x(client.)S 8154 Y 4796 X +F152(Bitonal)S 166 x(Monochromatic)S 896 y 4796 X F151(T)S -31 x +(ransport)S 169 x(of)S 169 x(bitonal)S 168 x(monochro)S 2 x(matic)S +168 x(image)S 169 x(data)S 169 x(or)S 169 x(image)S 169 x(code)S +169 x(information)S 169 x(\(compressed)S 169 x(image)S 598 y 4796 X +(data\))S 174 x(always)S 175 x(occurs)S 176 x(in)S 176 x(the)S 175 x +(same)S 175 x(fashion)S 175 x(\(Band_Interleaved_by_Pix)S 2 x(el,)S +178 x(Band_Interleaved_by_)S 598 y 4796 X(Plane,)S 171 x(and)S 170 x +(Bit_Interleaved_by_Plane)S 170 x(are)S 170 x(all)S 169 x +(degenerate\).)S 257 x(In)S 170 x(the)S 170 x(stream)S 168 x +(uncompressed)S 170 x(\(PCM\))S 598 y 4796 X(mode,)S 163 x(the)S +162 x(client)S 162 x(buffer)S 162 x(will)S 161 x(contain)S 163 x(an)S +162 x(array)S 163 x(of)S 161 x(butted)S 162 x(data)S 162 x(bits)S +161 x(\(1)S 162 x(bit)S 161 x(per)S 162 x(pixel\).)S 250 x(In)S 162 x +(the)S 162 x(stream)S 597 y 4796 X(compressed)S 165 x(mode)S 166 x +(\(G4\))S 165 x(the)S 166 x(client)S 167 x(buffer)S 166 x(will)S +165 x(contain)S 167 x(an)S 166 x(array)S 167 x(of)S 166 x(butted)S +166 x(code)S 166 x(bit)S 166 x(strings.)S 12637 Y 4796 X F152 +(Continuous)S 167 x(T)S -44 x(one)S 167 x(Monochromatic)S 167 x(-)S +166 x(Pixel)S 167 x(Aggregated)S 896 y 4796 X F151(T)S -31 x +(ransport)S 184 x(of)S 184 x(continuous)S 185 x(tone)S 185 x +(monochromatic)S 184 x(image)S 185 x(data)S 184 x(or)S 184 x(image)S +184 x(code)S 185 x(information)S 184 x(\(com-)S 598 y 4796 X +(pressed)S 183 x(image)S 184 x(data\))S 183 x(can)S 184 x(occur)S +184 x(in)S 184 x(two)S 183 x(fashions:)S 285 x(by)S 184 x +(Band_Interleaved_by_Pix)S 2 x(el)S 183 x(and)S 184 x(Band_)S 598 y +4796 X(Interleaved_by_Plane)S 184 x(which)S 184 x(are)S 184 x +(degenerate\),)S 189 x(or)S 183 x(by)S 184 x +(Bit_Interleaved_by_Plane.)S 285 x(In)S 183 x(the)S 184 x(\211rst)S +598 y 4796 X(case,)S 182 x(in)S 180 x(the)S 179 x(stream)S 179 x +(uncompressed)S 179 x(\(PCM\))S 179 x(mode,)S 183 x(the)S 179 x +(client)S 180 x(buffer)S 179 x(will)S 179 x(be)S 179 x(an)S 179 x +(array)S 180 x(of)S 180 x(butted)S 598 y 4796 X(data)S 169 x(bits)S +168 x(\(n)S 170 x(bits)S 169 x(per)S 169 x(pixel\).)S 257 x(In)S +169 x(the)S 170 x(stream)S 169 x(compressed)S 169 x(mode)S 169 x +(\(DCT\))S 168 x(the)S 170 x(client)S 170 x(buffer)S 169 x(will)S +169 x(be)S 169 x(an)S 597 y 4796 X(array)S 166 x(of)S 166 x(butted)S +166 x(code)S 166 x(bit)S 166 x(strings.)S 17718 Y 4796 X F152 +(Continuous)S 167 x(T)S -44 x(one)S 167 x(Monochromatic)S 167 x(-)S +166 x(Bit)S 166 x(Interleaved)S 167 x(by)S 166 x(Plane)S 896 y 4796 X +F151(In)S 182 x(the)S 183 x(Bit_Interleaved_by_Plane)S 183 x(mode)S +182 x(transport)S 183 x(of)S 182 x(continuou)S 2 x(s)S 182 x(tone)S +182 x(monochromatic)S 183 x(image)S 598 y 4796 X(data)S 166 x(or)S +167 x(image)S 168 x(code)S 167 x(information)S 167 x(\(compressed)S +166 x(image)S 168 x(data\),)S 167 x(the)S 167 x(client)S 167 x(has)S +167 x(the)S 167 x(option)S 167 x(of)S 167 x(receiving)S 598 y 4796 X +(the)S 180 x(image)S 181 x(data)S 180 x(or)S 181 x(image)S 181 x +(code)S 181 x(information)S 181 x(\(compressed)S 180 x(image)S 181 x +(data\))S 180 x(from)S 180 x(one)S 182 x(bit)S 180 x(plane.)S 279 x +(In)S 598 y 4796 X(the)S 176 x(stream)S 175 x(uncompressed)S 177 x +(\(PCM\))S 176 x(mode,)S 179 x(each)S 177 x(bit)S 175 x(plane)S 177 x +(in)S 176 x(the)S 177 x(client')S -19 x(s)S 176 x(buffer)S 176 x +(will)S 176 x(be)S 176 x(an)S 176 x(array)S 597 y 4796 X(of)S 171 x +(butted)S 172 x(data)S 171 x(bits.)S 261 x(In)S 171 x(the)S 172 x +(stream)S 172 x(compressed)S 171 x(mode)S 172 x(\(G4\))S 171 x(the)S +172 x(client)S 172 x(buffer)S 172 x(will)S 171 x(be)S 171 x(an)S +173 x(array)S 172 x(of)S 598 y 4796 X(butted)S 165 x(code)S 167 x +(bit)S 165 x(strings.)S 22799 Y 4796 X F152(Continuous)S 167 x(T)S +-44 x(one)S 167 x(Polychromatic)S 896 y 4796 X F151(T)S -31 x +(ransport)S 164 x(of)S 165 x(continuous)S 165 x(tone)S 165 x +(polychromatic)S 165 x(image)S 165 x(data)S 164 x(or)S 164 x(image)S +165 x(code)S 165 x(information)S 164 x(\(compressed)S 598 y 4796 X +(image)S 183 x(data\))S 183 x(can)S 184 x(occur)S 184 x(in)S 184 x +(three)S 184 x(formats:)S 284 x(Band_Interleaved_by_Plane,)S 189 x +(Bit_Interleaved_by_)S 598 y 4796 X(Plane,)S 167 x(and)S 166 x +(Band_Interleaved_by_Pix)S 2 x(el.)S 26086 Y 4796 X F152(Continuous)S +167 x(T)S -44 x(one)S 167 x(Polychromatic)S 167 x(-)S 166 x(Band)S +166 x(Interleaved)S 167 x(by)S 166 x(Pixel)S 897 y 4796 X F151(In)S +169 x(the)S 169 x(Band_Interleaved_by_Pix)S 2 x(el)S 169 x(mode,)S +170 x(uncompressed)S 169 x(image)S 169 x(data)S 169 x(or)S 169 x +(image)S 169 x(code)S 169 x(information)S 598 y 4796 X(\(compressed)S +165 x(image)S 166 x(data\))S 166 x(for)S 166 x(all)S 166 x(bands)S +166 x(is)S 165 x(sent.)S 28776 Y 4796 X F152(Continuous)S 167 x(T)S +-44 x(one)S 167 x(Polychromatic)S 167 x(-)S 166 x(Band)S 166 x +(Interleaved)S 167 x(by)S 166 x(Plane)S 897 y 4796 X F151(In)S 171 x +(the)S 172 x(Band_Interleaved_by_Plan)S 2 x(e)S 171 x(mode,)S 174 x +(the)S 172 x(client)S 171 x(has)S 172 x(the)S 172 x(option)S 172 x +(of)S 171 x(receiving)S 173 x(image)S 172 x(data)S 172 x(or)S 598 y +4796 X(image)S 169 x(code)S 170 x(information)S 169 x(\(compressed)S +169 x(image)S 169 x(data\))S 169 x(from)S 169 x(one)S 170 x +(spectral)S 169 x(band)S 169 x(\(all_planes)S 169 x(false\).)S 256 x +(In)S 597 y 4796 X(the)S 173 x(stream)S 173 x(uncompressed)S 174 x +(\(PCM\))S 173 x(mode,)S 176 x(each)S 174 x(band)S 174 x(in)S 173 x +(the)S 174 x(client')S -19 x(s)S 173 x(buffer)S 174 x(is)S 173 x +(simply)S 173 x(an)S 174 x(array)S 174 x(of)S 598 y 4796 X(butted)S +173 x(data)S 174 x(bits.)S 265 x(In)S 174 x(the)S 174 x(stream)S +174 x(compressed)S 173 x(mode)S 174 x(\(DCT\))S 173 x(the)S 174 x +(client)S 175 x(buffer)S 174 x(will)S 173 x(be)S 174 x(an)S 174 x +(array)S 175 x(of)S 598 y 4796 X(butted)S 165 x(code)S 167 x(bit)S +165 x(strings.)S 33260 Y 4796 X F152(Continuous)S 167 x(T)S -44 x +(one)S 167 x(Polychromatic)S 167 x(-)S 166 x(Bit)S 166 x +(Interleaved)S 167 x(by)S 166 x(Plane)S 35879 Y 19780 X F40 +(REQUESTS)S 165 x(AND)S 165 x(REPLIES)S 448 x(7\20329)S +PP +EP +%%DOC$Page: 7-30 58 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(In)S 178 x(the)S 179 x(Bit_Interleaved_by_Plane)S +180 x(mode,)S 182 x(the)S 179 x(client)S 179 x(has)S 179 x(the)S +179 x(option)S 178 x(of)S 179 x(receiving)S 180 x(image)S 179 x +(data)S 179 x(or)S 598 y 4796 X(image)S 177 x(code)S 178 x +(information)S 178 x(\(compressed)S 177 x(image)S 178 x(data\))S +177 x(from)S 177 x(one)S 179 x(bit)S 177 x(plane.)S 273 x(In)S 177 x +(the)S 178 x(stream)S 177 x(uncom-)S 597 y 4796 X(pressed)S 171 x +(\(PCM\))S 173 x(mode,)S 174 x(each)S 174 x(bit)S 172 x(plane)S 172 x +(in)S 173 x(the)S 173 x(client')S -19 x(s)S 173 x(buffer)S 172 x +(will)S 172 x(be)S 173 x(an)S 173 x(array)S 173 x(of)S 172 x(butted)S +173 x(data)S 172 x(bits)S 598 y 4796 X(\(1)S 169 x(per)S 170 x +(pixel\).)S 256 x(In)S 170 x(the)S 170 x(stream)S 169 x(compressed)S +169 x(mode)S 169 x(\(G4\))S 169 x(the)S 170 x(client)S 169 x(buffer)S +170 x(will)S 169 x(be)S 170 x(an)S 169 x(array)S 171 x(of)S 169 x +(butted)S 598 y 4796 X(code)S 166 x(bit)S 165 x(strings.)S 897 y +4796 X(Specifying)S 189 x(a)S 188 x(non)S 190 x(existent)S 188 x +(IOB)S 187 x(gener)S 2 x(ates)S 187 x(an)S 189 x(IDChoice)S 188 x +(error)S -36 x(.)S 294 x(Specifying)S 190 x(an)S 189 x(IOB)S 187 x +(which)S 189 x(is)S 597 y 4796 X(unconstrained)S 157 x(generates)S +157 x(a)S 157 x(MA)S -28 x(TCH)S 157 x(error)S -36 x(.)S 249 x(A)S +156 x(mismatch)S 156 x(between)S 157 x(the)S 157 x(receiving)S 158 x +(IOB')S -20 x(s)S 156 x(component-)S 598 y 4796 X +(space-organization)S 187 x(and)S 188 x(the)S 187 x(curren)S 2 x(t)S +187 x(transport)S 187 x(context')S -18 x(s)S 187 x +(component-space-organization)S 188 x(\(ie.)S 598 y 4796 X(trying)S +171 x(to)S 169 x(send)S 170 x(an)S 170 x(rgb)S 171 x(color)S 170 x +(image)S 170 x(over)S 171 x(the)S 170 x(wire)S 170 x(into)S 170 x(a)S +169 x(monochro)S 2 x(me)S 169 x(IOB\))S 169 x(generates)S 170 x(a)S +170 x(MA)S -27 x(TCH)S 598 y 4796 X(error)S -37 x(.)S 250 x +(Attempts)S 163 x(to)S 164 x(transport)S 164 x(from)S 164 x(an)S +165 x(IOB)S 163 x(which)S 165 x(has)S 165 x(never)S 165 x(had)S 165 x +(a)S 164 x(transport)S 164 x(context)S 165 x(established)S 597 y +4796 X(\(XIE)S -2 x(P_SET_TRANSPORT\))S 166 x(generates)S 166 x(an)S +167 x(ACC)S -2 x(ESS)S 166 x(error)S -36 x(.)S 12936 Y 3600 X F28 +(7.3.5)S 599 x(Abort)S 166 x(T)S -33 x(ransport)S 13882 Y 4796 X F102 +(XIEP_ABORT_TRANSPORT)S 747 y 6708 X(iob_id)S 14599 X(XIT_IOB)S 449 y +6708 X(plane_mask)S 14599 X(CARD32)S 747 y 6708 X(=>)S 747 y -478 x +(none)S 747 y 6708 X(service)S 240 x(class)S 240 x(value:)S 14599 X +(0)S 449 y 6708 X(errors:)S 14599 X(none)S 448 y 6708 X(events:)S +14599 X(none)S 897 y 4796 X F151(XIEP_AB)S -2 x(ORT_TRANSPORT)S 165 x +(is)S 165 x(used)S 166 x(to)S 166 x(abort)S 166 x(wire)S 166 x +(transport)S 166 x(before)S 166 x(a)S 166 x(\211nal)S 167 x(\212ag)S +166 x(is)S 166 x(sent.)S 896 y 4796 X(IOB)S -2 x(_ID)S 156 x(is)S +156 x(the)S 157 x(id)S 156 x(of)S 156 x(the)S 157 x(IOB)S 155 x +(which)S 157 x(is)S 156 x(the)S 156 x(source)S 157 x(of)S 156 x +(\(server)S -8 x(->client\))S 156 x(or)S 157 x(the)S 156 x +(destination)S 156 x(for)S 157 x(\(client-)S 598 y 4796 X(>server\))S +172 x(image)S 172 x(data)S 172 x(and)S 172 x(to/from)S 172 x(which)S +173 x(image)S 172 x(data)S 172 x(is)S 171 x(being)S 173 x +(transported.)S 261 x(Plane_mask)S 173 x(is)S 171 x(a)S 172 x(bit)S +598 y 4796 X(mask)S 179 x(with)S 179 x(one)S 180 x(bit)S 179 x(per)S +180 x(image)S 180 x(plane.)S 277 x(Image)S 180 x(transport)S 179 x +(may)S 180 x(be)S 180 x(aborted)S 179 x(on)S 180 x(a)S 180 x(per)S +180 x(plane)S 179 x(basis.)S 597 y 4796 X(When)S 178 x(the)S 179 x +(server)S 179 x(receives)S 179 x(an)S 179 x(abort)S 178 x(request,)S +182 x(all)S 178 x(image)S 179 x(data)S 178 x(which)S 179 x(is)S 178 x +(in)S 178 x(intermediate)S 178 x(buffers)S 598 y 4796 X(\(not)S 181 x +(yet)S 181 x(sent,)S 186 x(or)S 181 x(not)S 181 x(yet)S 182 x +(overlaid)S 182 x(onto)S 181 x(the)S 181 x(IOB\))S 180 x(is)S 181 x +(deleted,)S 185 x(and)S 182 x(the)S 181 x(\211nal)S 182 x(\212ag)S +182 x(is)S 181 x(set)S 180 x(for)S 182 x(that)S 598 y 4796 X(plane.)S +897 y 4796 X(There)S 166 x(is)S 166 x(no)S 166 x(return)S 167 x +(value)S 167 x(from)S 166 x(XIEP_ABO)S -2 x(RT_TRANSPORT)S -46 x(,)S +166 x(and)S 166 x(no)S 167 x(possible)S 165 x(errors.)S 35879 Y +3600 X F40(7\20330)S 449 x(REQUESTS)S 166 x(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-31 59 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(7.4)S 599 x(Process)S 167 x(Services)S 6838 Y +4796 X F151(Process)S 166 x(services)S 168 x(provide)S 167 x(for)S +167 x(the)S 167 x(application)S 167 x(of)S 167 x(low)S 167 x(level)S +167 x(image)S 167 x(operators)S 167 x(to)S 167 x(image)S 167 x(data)S +167 x(primar-)S 598 y 4796 X(ily)S 178 x(in)S 178 x(support)S 178 x +(of)S 177 x(preparation)S 179 x(for)S 178 x(or)S 178 x(improvement)S +178 x(of)S 178 x(its)S 177 x(display)S -55 x(.)S 273 x(These)S 178 x +(functions)S 179 x(take)S 178 x(one)S 178 x(or)S 597 y 4796 X(more)S +175 x(input)S 175 x(operands)S 176 x(including)S 176 x(existing)S +176 x(image)S 175 x(objects,)S 178 x(and)S 176 x(produce)S 176 x(a)S +175 x(two)S 174 x(dimensional)S 176 x(array)S 598 y 4796 X(of)S 168 x +(data)S 168 x(which)S 169 x(can)S 169 x(be)S 168 x(treated)S 169 x +(as)S 168 x(either)S 169 x(a)S 168 x(new)S 168 x(\(modi\211ed)S 169 x +(or)S 169 x(enhanced\))S 169 x(image)S 169 x(object,)S 170 x(or)S +169 x(a)S 168 x(control)S 598 y 4796 X(plane)S 176 x(for)S 176 x +(other)S 177 x(operations.)S 270 x(As)S 176 x(such,)S 180 x(process)S +176 x(services)S 176 x(can)S 177 x(be)S 176 x(consider)S 177 x(as)S +176 x("image)S 176 x(in)S 177 x(\203>)S 176 x(image)S 598 y 4796 X +(out")S 166 x(functions.)S 896 y 4796 X(Many)S 172 x(process)S 170 x +(protocol)S 171 x(functions)S 172 x(take)S 171 x(a)S 171 x(constant)S +171 x(as)S 171 x(one)S 171 x(of)S 171 x(the)S 172 x(image)S 171 x +(operands.)S 260 x(This)S 171 x(constant)S 598 y 4796 X(is)S 170 x +(a)S 170 x(shorthand)S 171 x(format)S 170 x(for)S 171 x(an)S 171 x +(image)S 170 x(object)S 171 x(of)S 171 x(constant)S 170 x(value.)S +260 x(The)S 171 x(server)S 171 x(in)S 171 x(essence)S 170 x +(constructs)S 598 y 4796 X(a)S 181 x("logical")S 181 x(image)S 182 x +(object)S 182 x(whose)S 181 x(value)S 183 x(is)S 181 x(equal)S 182 x +(to)S 181 x(the)S 182 x(speci\211ed)S 181 x(constant)S 182 x(at)S +181 x(all)S 181 x(locations,)S 186 x(and)S 598 y 4796 X(whose)S 180 x +(extent)S 182 x(is)S 180 x(suf\211cient)S 182 x(for)S 181 x(the)S +181 x(operation)S 181 x(at)S 181 x(hand)S 182 x(\(typically)S 181 x +(identical)S 181 x(in)S 181 x(size)S 180 x(to)S 181 x(the)S 181 x +(other)S 597 y 4796 X("physical")S 170 x(image)S 170 x(operand\).)S +258 x(These)S 171 x("constant)S 170 x(image)S 170 x(objects")S 171 x +(are)S 170 x(temporary)S 171 x(entities)S 169 x(which)S 171 x(exist)S +598 y 4796 X(only)S 181 x(during)S 182 x(the)S 180 x(operation)S +181 x(and)S 181 x(can)S 181 x(not)S 181 x(be)S 180 x(referenced)S +182 x(by)S 180 x(the)S 181 x(client)S 181 x(outside)S 180 x(of)S +181 x(the)S 180 x(operation.)S 598 y 4796 X("Constant")S 163 x +(images)S 164 x(are)S 165 x(cast)S 164 x(by)S 165 x(the)S 164 x +(server)S 165 x(as)S 164 x(type)S 165 x(constrained)S 165 x(or)S +165 x(unconstrained)S 165 x(as)S 164 x(the)S 165 x(situation)S 598 y +4796 X(demands.)S 896 y 4796 X(All)S 168 x(process)S 169 x(services)S +169 x(take)S 169 x(an)S 170 x(image)S 169 x(domain)S 169 x(control)S +170 x(context)S 170 x(\(either)S 169 x(a)S 169 x(region)S 170 x(of)S +169 x(interest)S 169 x({ROI})S 168 x(or)S 598 y 4796 X(a)S 175 x +(control)S 175 x(processing)S 176 x(plane)S 175 x({CPP}\))S 175 x +(and)S 176 x(operate)S 175 x(on)S 176 x(the)S 175 x(pixels)S 175 x +(identi)S +(\211ed)S 176 x(by)S 176 x(the)S 175 x(domain)S 175 x(control)S 598 y +4796 X(context.)S 257 x(The)S 170 x(resulting)S 171 x(image)S 170 x +(object)S 170 x(is)S 169 x(identical)S 170 x(in)S 170 x(size)S 169 x +(to)S 169 x(either)S 170 x(the)S 170 x(subset)S 169 x(of)S 170 x +(the)S 170 x(input)S 170 x(image)S 598 y 4796 X(de\211ned)S 170 x +(by)S 169 x(an)S 170 x(ROI)S 169 x(type)S 169 x(IDC,)S 169 x(or)S +170 x(to)S 169 x(the)S 169 x(original)S 171 x(image)S 169 x(object)S +170 x(if)S 169 x(a)S 170 x(CPP)S 169 x(type)S 170 x(IDC)S 168 x(is)S +169 x(used.)S 257 x(In)S 169 x(the)S 597 y 4796 X(latter)S 169 x +(case,)S 171 x(the)S 170 x(output)S 170 x(image)S 170 x(data)S 170 x +(is)S 169 x(valid)S 170 x(only)S 171 x(at)S 169 x(the)S 170 x +(points)S 170 x(speci\211ed)S 170 x(by)S 170 x(the)S 170 x(CPP)S +-64 x(.)S 170 x(Data)S 169 x(at)S 170 x(all)S 598 y 4796 X(other)S +166 x(points)S 166 x(is)S 165 x(unpredictable.)S 897 y 4796 X +(Constrained)S 176 x(and)S 177 x(unconstrained)S 178 x(model)S 176 x +(operation)S 177 x(is)S 176 x(particularly)S 178 x(relevant)S 177 x +(to)S 177 x(process)S 176 x(services.)S 597 y 4796 X(Each)S 186 x +(subsection)S 187 x(of)S 186 x(the)S 187 x(process)S 186 x(services)S +187 x(section)S 186 x(contains)S 187 x(a)S 186 x(paragraph)S 188 x +(which)S 186 x(outlines)S 187 x(con-)S 598 y 4796 X(strained)S 176 x +(and)S 178 x(unconstrained)S 178 x(modes)S 177 x(of)S 177 x +(operation.)S 272 x(Individual)S 178 x(functions)S 177 x(note)S 178 x +(exceptions)S 177 x(to)S 177 x(the)S 598 y 4796 X(overall)S 167 x +(comments.)S 252 x(Where)S 167 x(a)S 167 x(function)S 168 x(can)S +168 x(only)S 168 x(accept)S 167 x(and)S 167 x(produce)S 168 x +(constrained)S 167 x(image)S 168 x(data,)S 167 x(this)S 598 y 4796 X +(is)S 178 x(noted)S 179 x(and)S 179 x(no)S 179 x("constrained")S +179 x(control)S 179 x(boolean)S 179 x(is)S 178 x(provided.)S 276 x +(Where)S 179 x(the)S 179 x(option)S 178 x(does)S 179 x(exist,)S 182 x +(the)S 597 y 4796 X(protocol)S 176 x(function)S 177 x(includes)S +176 x(a)S 176 x("constrained")S 176 x(control)S 177 x(boolean)S 177 x +(which)S 176 x(informs)S 176 x(the)S 176 x(server)S 177 x(to)S 176 x +(apply)S 598 y 4796 X(the)S 166 x(default)S 166 x(constraint)S 166 x +(model)S 166 x(and)S 166 x(produce)S 167 x(constrained)S 166 x +(output.)S 897 y 4796 X(Process)S 168 x(services)S 169 x(can)S 168 x +(be)S 169 x(applied)S 168 x(to)S 168 x(mono)S 169 x(and)S 169 x +(polychromatic)S 169 x(\(rgb\))S 169 x(images.)S 254 x(In)S 169 x +(general,)S 170 x(the)S 169 x(func-)S 598 y 4796 X(tions)S 175 x +(will)S 175 x(accept)S 176 x(lists)S 174 x(of)S 176 x(parameters)S +175 x(\(one)S 176 x(entry)S 177 x(per)S 175 x(spectral)S 176 x +(component\),)S 179 x(and)S 176 x(will)S 175 x(operate)S 175 x(on)S +597 y 4796 X(each)S 171 x(of)S 171 x(the)S 172 x(three)S 171 x +(spectral)S 171 x(components)S 171 x(\(r)S -37 x(,)S 173 x(g,)S 174 x +(b)S +(\))S 171 x(as)S 170 x(if)S 171 x(they)S 172 x(were)S 171 x(three)S +172 x(separate)S 170 x(IOB')S -20 x(s.)S 260 x(Different)S 598 y +4796 X(parameter)S 168 x(values)S 169 x(per)S 168 x(spectral)S 168 x +(component)S 169 x(are)S 169 x(possible)S 167 x(.)S 255 x(Clients)S +167 x(who)S 169 x(wish)S 168 x(to)S 168 x(operate)S 168 x(only)S +169 x(on)S 169 x(a)S 598 y 4796 X(single)S 173 x(spectral)S 173 x +(component)S 174 x(may)S 174 x(be)S 173 x(able)S 173 x(to)S 174 x +(set)S 172 x(parameter)S 174 x(values)S 173 x(in)S 174 x(certain)S +174 x(cases)S 173 x(to)S 173 x(make)S 173 x(this)S 598 y 4796 X +(happen.)S 276 x(If)S 178 x(not,)S 183 x(clients)S 179 x(have)S 180 x +(the)S 179 x(option)S 179 x(of)S 179 x(expanding)S 181 x(the)S 179 x +(spectral)S 179 x(components)S 179 x(into)S 179 x(separate)S 597 y +4796 X(images,)S 181 x(operating)S 178 x(individually)S 179 x(on)S +178 x(the)S 178 x(components,)S 182 x(and)S 178 x(then)S 178 x +(recombining)S 180 x(them.)S 273 x(Exceptions)S 598 y 4796 X(are)S +166 x(noted)S 166 x(on)S 166 x(a)S 166 x(function)S 167 x(by)S 167 x +(function)S 167 x(basis.)S 897 y 4796 X(While)S 173 x(control)S 174 x +(over)S 174 x(protocol)S 173 x(implementation)S 173 x(\(server)S +174 x(design\))S 174 x(is)S 173 x(out)S 173 x(of)S 174 x(the)S 173 x +(realm)S 174 x(of)S 173 x(this)S 173 x(speci\211-)S 598 y 4796 X +(cation,)S 180 x(its)S 176 x(is)S 176 x(the)S 178 x(author)S 28 x(')S +-19 x(s)S 176 x(intent)S 177 x(to)S 177 x(limit)S 176 x(processing)S +178 x(to)S 177 x(spatial)S 175 x(domain)S 177 x(techniques)S 178 x +(\(vs)S 177 x(spatial)S 597 y 4796 X(frequency\))S 160 x(at)S 158 x +(this)S 158 x(time.)S 249 x(As)S 158 x(such,)S 161 x(the)S 159 x +(protocol)S 159 x(does)S 158 x(not)S 159 x(support)S 159 x(the)S +159 x(de\211nition)S 159 x(or)S 159 x(communication)S 598 y 4796 X +(of)S 176 x(spatial)S 176 x(frequency)S 179 x(domain)S 177 x(\(such)S +177 x(as)S 177 x(Fourier\))S 178 x(data)S 176 x(\(including)S 178 x +(images)S 177 x(and)S 177 x(\211lters\),)S 180 x(or)S 177 x(spatial)S +598 y 4796 X(frequency)S 167 x(domain)S 166 x(processes.)S 896 y +4796 X(Processing)S 185 x(services)S 185 x(are)S 185 x(segmented)S +185 x(into)S 185 x(the)S 185 x(following)S 185 x(categories)S 185 x +(and)S 185 x(include)S 186 x(the)S 185 x(following)S 598 y 4796 X +(functions:)S 897 y 4796 X(\201)S 594 x(Point)S 167 x(Processing)S +35879 Y 19780 X F40(REQUESTS)S 165 x(AND)S 165 x(REPLIES)S 448 x +(7\20331)S +PP +EP +%%DOC$Page: 7-32 60 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(\201)S 594 x(Area)S 166 x(Processing)S 747 y +4796 X(\201)S 594 x(Ensemble)S 166 x(Processing)S 747 y 4796 X(\201)S +594 x(Geometric)S 166 x(Processing)S 747 y 4796 X(\201)S 594 x +(Radiometric)S 166 x(Processing)S 35879 Y 3600 X F40(7\20332)S 449 x +(REQUESTS)S 166 x(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-33 61 +1000 BP 39600 30600 PM 0 0 XY +5227 Y 3600 X F28(7.4.1)S 599 x(Point)S 167 x(Processing)S 6323 Y +4796 X F151(Point)S 188 x(processing)S 188 x(allows)S 186 x(a)S 188 x +(client)S 188 x(to)S 187 x(apply)S 188 x(a)S 188 x(client)S 188 x +(speci\211ed)S 187 x(transfer)S 188 x(function)S 189 x(to)S 187 x +(remap)S 188 x(an)S 598 y 4796 X(input)S 171 x(pixel)S 171 x(value)S +171 x(to)S 171 x(an)S 171 x(output)S 171 x(pixel)S 172 x(value)S +171 x(with)S 171 x(no)S 171 x(dependency)S 172 x(upon)S 172 x +(surrounding)S 172 x(\(area\))S 171 x(input)S 598 y 4796 X(pixels.)S +268 x(Point)S 176 x(processing)S 175 x(can)S 176 x(decrease,)S 179 x +(preserve,)S 178 x(or)S 176 x(increase)S 176 x(the)S 175 x(number)S +177 x(of)S 175 x(bits)S 175 x(per)S 175 x(pixel)S 176 x(per)S 597 y +4796 X(component)S 188 x(\(gray->b&w)S -46 x(,)S 193 x(b&w->b&w)S +-47 x(,)S 193 x(b&w->gray\))S 188 x(and)S 188 x(preserve)S 188 x(or)S +187 x(increase)S 188 x(the)S 188 x(number)S 188 x(of)S 598 y 4796 X +(spectral)S 179 x(components)S 181 x(\(mono->mono,)S 184 x(color)S +-8 x(->color)S -37 x(,)S 184 x(mono->color\).)S 279 x(T)S -26 x +(ypically)S -55 x(,)S 185 x(it)S 180 x(is)S 179 x(used)S 181 x(for)S +180 x(gray)S 598 y 4796 X(scale)S 177 x(luminance)S 179 x +(transforms)S 177 x(\(gray->g)S 2 x(ray\),)S 181 x(simple)S 178 x +(color)S 178 x(remapping)S 178 x(\(color)S -8 x(->color\),)S 181 x +(and)S 178 x(pseudo)S 598 y 4796 X(coloring)S 178 x(\(b&w->color)S +-37 x(,)S 181 x(gray->color)S 2 x(\).)S 272 x(While)S 178 x(a)S 178 x +(color)S 178 x(image)S 178 x(can)S 178 x(be)S 178 x(remapped)S 178 x +(into)S 178 x(another)S 178 x(color)S 597 y 4796 X(image)S 181 x +(with)S 180 x(equal)S 181 x(r)S -9 x(-g-b)S 181 x(values)S 181 x(on)S +181 x(a)S 181 x(per)S 181 x(pixel)S 181 x(basis)S 180 x(and)S 181 x +(result)S 181 x(in)S 181 x(a)S 180 x("gray)S 182 x(scale")S 180 x +(display)S -55 x(,)S 185 x(the)S 598 y 4796 X(underlying)S 168 x +(data)S 165 x(remains)S 166 x(multispectral.)S 847 y 4796 X F102 +(XIEP_POINT)S 747 y -478 x(iob_id1)S 14599 X(XIT_IOB)S 448 y 6708 X +(iob_id2)S 14599 X(XIT_IOB)S 449 y 6708 X(idc)S 14599 X(XIT_IDC)S +448 y 6708 X(new_quantum)S 14599 X(ListofCARD8)S 448 y 6708 X +(transfer_fun)S 2 x(ction)S 14599 X(ListofListofCARDn)S 2 x(n)S 748 y +6708 X(=>)S 747 y -478 x(none)S 747 y 5752 X(service)S 240 x(class)S +239 x(value:)S 14599 X(1)S 448 y 5752 X(errors:)S 14599 X(IDChoice,)S +240 x(ALLOC,)S 240 x(VALUE,MATCH)S 449 y 5752 X(events:)S 14599 X +(XIE_COMPUTATION_C)S 2 x(OMPLETE)S 18826 Y 4796 X F151(XIEP_POI)S +-2 x(NT)S 169 x(creates)S 168 x(a)S 169 x(new)S 168 x(server)S 169 x +(IOB)S 168 x(from)S 168 x(an)S 169 x(existing)S 169 x(server)S 169 x +(IOB)S 168 x(by)S 169 x(remapping)S 169 x(each)S 169 x(input)S 598 y +4796 X(IOB)S 165 x(value)S 168 x(into)S 166 x(a)S 167 x(new)S 167 x +(output)S 167 x(IOB)S 165 x(value.)S 252 x(The)S 167 x(output)S 167 x +(value)S 168 x(depends)S 166 x(solely)S 167 x(upon)S 168 x(the)S +166 x(input)S 167 x(pixel)S 598 y 4796 X(value)S 182 x(\(no)S 181 x +(source)S 182 x(area)S 182 x(dependency\).)S 281 x(The)S 182 x +(function)S 183 x(is)S 181 x(designed)S 181 x(to)S 182 x(allow)S +180 x(the)S 182 x(client)S 182 x(to)S 181 x(apply)S 181 x(a)S 597 y +4796 X(client)S 166 x(speci\211ed)S 166 x(transfer)S 166 x +(function.)S 897 y 4796 X(IOB)S -2 x(_id1)S 172 x(is)S 172 x(the)S +172 x(id)S 172 x(of)S 172 x(the)S 173 x(source)S 172 x(image)S 173 x +(object.)S 262 x(IOB_id2)S 171 x(is)S 172 x(the)S 172 x(client)S +172 x(speci\211ed)S 172 x(id)S 172 x(to)S 172 x(be)S 173 x(assigned)S +598 y 4796 X(to)S 171 x(the)S 172 x(newly)S 173 x(created)S 172 x +(\(resulting\))S 172 x(image)S 172 x(object.)S 262 x(Idc)S 172 x +(controls)S 172 x(the)S 172 x(subset)S 172 x(of)S 171 x(the)S 173 x +(image)S 172 x(which)S 172 x(will)S 598 y 4796 X(be)S 175 x +(operated)S 175 x(upon.)S 268 x(T)S -31 x(ransfer_function)S 176 x +(is)S 175 x(a)S 175 x(list)S 174 x(of)S 175 x(what)S 175 x(are)S +175 x(in)S 175 x(essence)S 175 x(look)S 176 x(up)S 175 x(tables)S +174 x(-)S 175 x(one)S 176 x(per)S 597 y 4796 X(output)S 184 x +(spectral)S 184 x(component.)S 287 x(Each)S 185 x(one)S 185 x(must)S +184 x(be)S 184 x(long)S 185 x(enoug)S 2 x(h)S 185 x(so)S 184 x(that)S +184 x(all)S 184 x(potential)S 184 x(values)S 185 x(of)S 598 y 4796 X +(the)S 181 x(input)S 181 x(can)S 181 x(be)S 181 x(used)S 181 x(as)S +181 x(an)S 181 x(index)S 182 x(into)S 181 x(the)S 181 x(table.)S +279 x(New_quantum)S 182 x(is)S 180 x(a)S 181 x(list)S 180 x(\(one)S +182 x(per)S 181 x(spectral)S 598 y 4796 X(component\))S 181 x(of)S +181 x(the)S 181 x(number)S 181 x(of)S 181 x(bits)S 180 x(per)S 181 x +(pixel)S 181 x(\(per)S 181 x(spectral)S 181 x(component\))S 181 x +(of)S 181 x(the)S 181 x(resulting)S 181 x(value)S 598 y 4796 X +(which)S 172 x(derives)S 171 x(from)S 172 x(the)S 172 x(look)S 172 x +(up)S 172 x(table.)S 261 x(This)S 171 x(allows)S 171 x(the)S 172 x +(transfer)S 172 x(function)S 172 x(to)S 172 x(both)S 172 x(modify)S +171 x(image)S 597 y 4796 X(data)S 162 x(values,)S 165 x(and)S 163 x +(bits)S 163 x(per)S 163 x(pixel)S 163 x(per)S 163 x(spectral)S 163 x +(component.)S 250 x(If)S 163 x(the)S 163 x(input)S 164 x(IOB)S 162 x +(is)S 162 x(monochr)S 2 x(omatic)S 162 x(and)S 598 y 4796 X(the)S +171 x(client)S 171 x(speci\211es)S 170 x(one)S 171 x +(transfer_function,)S 174 x(the)S 171 x(output)S 171 x(will)S 170 x +(also)S 171 x(be)S 170 x(monochr)S 2 x(omatic.)S 258 x(If)S 171 x +(the)S 171 x(input)S 598 y 4796 X(is)S 165 x(monochromatic)S 167 x +(and)S 166 x(the)S 166 x(user)S 167 x(speci\211es)S 165 x(3)S 166 x +(transfer_functions,)S 168 x(the)S 166 x(output)S 166 x(will)S 165 x +(be)S 166 x(trichromatic.)S 896 y 4796 X(The)S 183 x(input)S 183 x +(IOB)S 182 x(must)S 182 x(be)S 183 x(constrained,)S 188 x(and)S 183 x +(the)S 183 x(output)S 183 x(IOB)S 181 x(is)S 183 x(constrained.)S +283 x(The)S 184 x(input)S 183 x(image)S 598 y 4796 X(object)S 175 x +(may)S 175 x(be)S 176 x(either)S 175 x(mono)S 175 x(or)S 176 x(poly)S +175 x(chromatic.)S 268 x(The)S 176 x(output)S 175 x(image)S 176 x +(object)S 175 x(will)S 174 x(at)S 175 x(least)S 175 x(be)S 175 x +(mono)S 598 y 4796 X(chromatic,)S 166 x(but)S 167 x(may)S 166 x(be)S +166 x(promoted)S 166 x(to)S 166 x(poly)S 166 x(chromatic)S 167 x(as)S +165 x(discussed)S 165 x(above.)S 897 y 4796 X(XIEP_POI)S -2 x(NT)S +175 x(operates)S 175 x(on)S 175 x(the)S 175 x(subset)S 174 x(of)S +175 x(the)S 175 x(input)S 175 x(image)S 175 x(de\211ned)S 175 x(by)S +175 x(the)S 175 x(IDC.)S 174 x(If)S 175 x(the)S 175 x(IDC)S 173 x +(is)S 175 x(of)S 597 y 4796 X(type)S 171 x(CPP)S -64 x(,)S 172 x +(the)S 172 x(output)S 172 x(image)S 171 x(object)S 172 x(is)S 171 x +(equal)S 172 x(in)S 172 x(size)S 171 x(to)S 171 x(that)S 171 x(of)S +172 x(the)S 171 x(input)S 172 x(image)S 172 x(object,)S 174 x(but)S +171 x(valid)S 598 y 4796 X(only)S 171 x(at)S 169 x(those)S 171 x +(points)S 169 x(de\211ned)S 171 x(by)S 171 x(the)S 170 x(CPP)S -64 x +(.)S 171 x(If)S 170 x(IDC)S 169 x(is)S 169 x(of)S 171 x(type)S 170 x +(ROI,)S 170 x(the)S 170 x(output)S 170 x(image)S 171 x(object)S 171 x +(is)S 169 x(less)S 598 y 4796 X(than)S 166 x(or)S 166 x(equal)S 167 x +(to)S 165 x(the)S 167 x(size)S 165 x(of)S 166 x(the)S 166 x(input)S +166 x(image)S 167 x(object.)S 35879 Y 19780 X F40(REQUESTS)S 165 x +(AND)S 165 x(REPLIES)S 448 x(7\20333)S +PP +EP +%%DOC$Page: 7-34 62 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(Speci\211cation)S 173 x(of)S 172 x(an)S 174 x +(invalid)S 173 x(source)S 173 x(IOB,)S 172 x(an)S 173 x(already)S +173 x(in)S 173 x(use)S 173 x(resource)S 174 x(id)S 172 x(for)S 173 x +(the)S 173 x(destination)S 173 x(IOB,)S 598 y 4796 X(or)S 173 x(an)S +174 x(invalid)S 174 x(IDC)S 172 x(generates)S 174 x(an)S 174 x +(IDChoice)S 173 x(error)S -36 x(.)S 264 x(Inability)S 173 x(of)S +174 x(the)S 173 x(server)S 174 x(to)S 174 x(allocate)S 173 x(a)S +173 x(new)S 174 x(IOB)S 597 y 4796 X(generates)S 178 x(an)S 178 x +(ALLOC)S 176 x(error)S -36 x(.)S 273 x(An)S 177 x(out)S 178 x(of)S +178 x(range)S 178 x(new)S 178 x(quantum)S 178 x(value)S 178 x +(generates)S 178 x(a)S 178 x(V)S -56 x(ALUE)S 177 x(error)S -36 x(.)S +598 y 4796 X(Speci\211cation)S 170 x(of)S 170 x(an)S 171 x(rgb)S +171 x(input)S 170 x(IOB)S 169 x(and)S 171 x(a)S 170 x(single)S 170 x +(transfer_function)S 171 x(results)S 170 x(in)S 171 x(a)S 170 x(MA)S +-28 x(TCH)S 170 x(error)S 171 x(as)S 598 y 4796 X(does)S 165 x +(speci\211cation)S 167 x(of)S 166 x(an)S 166 x(unconstrained)S 167 x +(input)S 166 x(IOB.)S 897 y 4796 X(Client')S -20 x(s)S 190 x(which)S +190 x(request)S 191 x(noti\211cation)S 190 x(are)S 191 x(noti\211ed)S +190 x(of)S 190 x(the)S 190 x(operation')S -18 x(s)S 190 x +(completion)S 190 x(by)S 190 x(an)S 191 x(XIE_)S 597 y 4796 X +(COMPUT)S -28 x(A)S -28 x(TION_COMPLETE)S 165 x(event.)S 35879 Y +3600 X F40(7\20334)S 449 x(REQUESTS)S 166 x(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-35 63 +1000 BP 39600 30600 PM 0 0 XY +5227 Y 3600 X F28(7.4.2)S 599 x(Area)S 166 x(Processing)S 6323 Y +4796 X F151(Area)S 179 x(processing)S 180 x(produces)S 180 x(a)S +180 x(data)S 179 x(response)S 180 x(at)S 179 x(each)S 180 x(pixel)S +180 x(based)S 180 x(upon)S 180 x(area)S 180 x(operations)S 179 x(at)S +180 x(and)S 598 y 4796 X(around)S 178 x(the)S 178 x(source)S 178 x +(pixel.)S 273 x(The)S 178 x(data)S 177 x(response)S 178 x(array)S +178 x(may)S 178 x(be)S 178 x(considered)S 178 x(to)S 177 x(be)S 178 x +(an)S 177 x(image)S 178 x(and)S 178 x(is)S 598 y 4796 X(stored)S +165 x(as)S 166 x(an)S 166 x(IOB.)S 896 y 4796 X(Area)S 167 x +(processing)S 168 x(takes)S 167 x(a)S 167 x(single)S 168 x(input)S +168 x(image)S 168 x(object)S 168 x(operand,)S 168 x(a)S 168 x +(single)S 168 x(input)S 167 x(IDC)S 167 x(operand)S 168 x(of)S 167 x +(type)S 598 y 4796 X(ROI)S 156 x(or)S 158 x(CPP)S -64 x(,)S 158 x(a)S +158 x(single)S 158 x(input)S 158 x(IDC)S 156 x(operand)S 158 x(of)S +158 x(type)S 158 x(TMP)S -64 x(,)S 158 x(and)S 158 x(produce)S 159 x +(a)S 157 x(single)S 158 x(image)S 158 x(object)S 158 x(output)S 598 y +4796 X(operand.)S 258 x(The)S 171 x(value)S 170 x(of)S 171 x(the)S +170 x(output)S 170 x(image)S 171 x(object)S 170 x(at)S 170 x(each)S +171 x(point)S 170 x([selected)S 170 x(by)S 170 x(the)S 170 x(IDC)S +169 x(of)S 171 x(type)S 170 x(ROI)S 597 y 4796 X(or)S 166 x(CPP],)S +166 x(is)S 166 x(determined)S 166 x(in)S 166 x(a)S 166 x(similar)S +166 x(fashion)S 166 x(for)S 166 x(each)S 167 x(areawise)S 165 x +(operation:)S 897 y 4796 X(1.)S 481 x(The)S 167 x(pointwise)S 165 x +(arithmetic)S 166 x(combination)S 166 x(\(sum,)S 167 x(product\))S +166 x(of)S 166 x(the)S 166 x(TMP)S 598 y 5692 X(coef\211cient)S 167 x +(and)S 166 x(the)S 166 x(source)S 167 x(image)S 166 x(operand)S 167 x +(are)S 166 x(taken)S 167 x(\(this)S 165 x(produces)S 598 y 5692 X(a)S +166 x(2d)S 166 x(array)S 167 x(of)S 166 x(coef\211cients)S 166 x +(some)S 166 x(of)S 166 x(which)S 166 x(may)S 167 x(intentionally)S +166 x(be)S 597 y 5692 X(unde\211n)S 2 x(ed)S 166 x(-)S 166 x(ie.)S +249 x(potential)S 166 x(for)S 166 x(small)S 165 x(size,)S 166 x(and)S +166 x(/)S 167 x(or)S 166 x(sparce)S 166 x(population\).)S 14243 Y +4796 X(2.)S 481 x(An)S 166 x(algebraic)S 167 x(operator)S 166 x(is)S +166 x(applied)S 165 x(to)S 166 x(this)S 166 x(data)S 166 x(\(sum,)S +166 x(minimum,)S 166 x(maximum\))S 598 y 5692 X(which)S 167 x +(reduces)S 166 x(the)S 166 x(two)S 166 x(dimensional)S 166 x(array)S +166 x(to)S 166 x(a)S 166 x(single)S 167 x(value)S 166 x(\(addition)S +598 y 5692 X(adds)S 166 x(up)S 166 x(all)S 166 x(of)S 166 x(these)S +166 x(values,)S 167 x(minimum)S 166 x(and)S 166 x(maximum)S 166 x +(select)S 166 x(the)S 166 x(minimum)S 598 y 5692 X(and)S 166 x +(maximum)S 167 x(values)S 166 x(respectively)S -54 x(.)S 17132 Y +4796 X(Note)S 166 x(that)S 166 x(the)S 166 x(most)S 166 x(familiar)S +165 x(of)S 166 x(these)S 167 x(area)S 166 x(operations)S 166 x(is)S +166 x(implemented)S 166 x(as)S 166 x(a)S 166 x(pointwise)S 165 x +(\(across)S 166 x(the)S 598 y 4796 X(area\))S 166 x(product,)S 166 x +(followed)S 166 x(by)S 166 x(an)S 167 x(area)S 166 x(summation.)S +249 x(This)S 166 x(is)S 166 x(the)S 166 x(normal)S 167 x +(convolution)S 167 x(process.)S 897 y 4796 X(The)S 176 x(location)S +176 x(\(overlay)S 176 x(or)S 176 x(registration\))S 176 x(of)S 175 x +(the)S 176 x(template)S 175 x(relative)S 176 x(to)S 175 x(the)S 176 x +(image)S 176 x(point)S 175 x(in)S 176 x(question)S 598 y 4796 X(is)S +168 x(establis)S -2 x(hed)S 169 x(by)S 169 x(the)S 169 x(template')S +-20 x(s)S 168 x("centering)S 2 x(")S 168 x(parameter)S 168 x(\(see)S +168 x(XIEP_CREA)S -29 x(TE_IDC)S 167 x(description)S 169 x(of)S 597 y +4796 X(templates)S -2 x(\).)S 847 y 4796 X F102(XIEP_AREA)S 747 y +-239 x(iob_id1)S 14599 X(XIT_IOB)S 449 y 6708 X(iob_id2)S 14599 X +(XIT_IOB)S 448 y 6708 X(idc_c)S 14599 X(XIT_IDC)S 240 x({ROI,CPP})S +448 y 6708 X(idc_t)S 14599 X(XIT_IDC)S 240 x({TMP})S 449 y 6708 X +(operation1)S 14599 X(XIT_AREA_OP1)S 448 y 6708 X(operation2)S 14599 X +(XIT_AREA_OP2)S 448 y 6708 X(constrain)S 14599 X(BOOL)S 748 y 6708 X +(=>)S 747 y -478 x(none)S 747 y 5752 X(service)S 240 x(class)S 239 x +(value:)S 14599 X(1)S 448 y 5752 X(errors:)S 14599 X(IDChoice,)S +240 x(ALLOC)S 449 y 5752 X(events:)S 14599 X(XIE_COMPUTATION_C)S +2 x(OMPLETE)S 896 y 4796 X F151(XIEP_AR)S -2 x(EA)S 191 x(performs)S +191 x(generalized)S 192 x(area)S 191 x(functions)S 192 x(including)S +193 x(additive)S 191 x(and)S 192 x(multiplicative,)S 598 y 4796 X +(minimization,)S 183 x(maximization,)S 184 x(and)S 181 x(summation.)S +278 x(In)S 180 x(particular)S -37 x(,)S 185 x(it)S 180 x(adds)S 179 x +(or)S 181 x(multiplies)S 179 x(the)S 181 x(TMP)S 598 y 4796 X +(contents)S 175 x(to)S 175 x(the)S 175 x(image)S 176 x(contents)S +175 x(on)S 176 x(a)S 175 x(pointwise)S 174 x(basis)S 174 x(and)S +176 x(then)S 175 x(minimizes,)S 177 x(maximizes)S 175 x(\(selects)S +597 y 4796 X(the)S 166 x(minimum)S 166 x(or)S 166 x(maximum\),)S +167 x(or)S 166 x(sums)S 165 x(the)S 167 x(results.)S 897 y 4796 X +(IOB)S -2 x(_id1)S 180 x(is)S 180 x(the)S 180 x(source)S 181 x +(image)S 180 x(object.)S 278 x(IDC_c)S 179 x(\(ROI,)S 179 x(CPP\))S +180 x(controls)S 181 x(the)S 180 x(subregion)S 181 x(to)S 180 x +(which)S 180 x(the)S 598 y 4796 X(overall)S 171 x(process)S 170 x +(is)S 170 x(applied.)S 259 x(IDC_t)S 170 x(\(TMP\))S 171 x(contains)S +171 x(the)S 171 x(area)S 171 x(coef\211cients)S 171 x(and)S 171 x +(controls)S 171 x(the)S 170 x(subset)S 598 y 4796 X(of)S 178 x(the)S +178 x(source)S 179 x(image)S 178 x(surrounding)S 180 x(the)S 178 x +(curren)S 2 x(t)S 178 x(pixel)S 178 x(to)S 178 x(which)S 179 x(the)S +178 x(process)S 178 x(applies.)S 273 x(IOB_id2)S 177 x(is)S 597 y +4796 X(the)S 172 x(client)S 172 x(speci\211ed)S 172 x(id)S 172 x(to)S +172 x(be)S 172 x(assigned)S 172 x(to)S 172 x(the)S 172 x(newly)S +172 x(created)S 172 x(\(resulting\))S 173 x(image)S 172 x(object.)S +262 x(Constrain)S 598 y 4796 X(determines)S 165 x(if)S 166 x(the)S +166 x(default)S 166 x(constraint)S 167 x(model)S 165 x(will)S 166 x +(be)S 166 x(applied)S 165 x(upon)S 167 x(completion.)S 35879 Y 19780 X +F40(REQUESTS)S 165 x(AND)S 165 x(REPLIES)S 448 x(7\20335)S +PP +EP +%%DOC$Page: 7-36 64 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(In)S 166 x(the)S 168 x(case)S 166 x(where)S 167 x +(operation1)S 167 x(is)S 167 x(multiplication)S 166 x(and)S 168 x +(operation2)S 167 x(is)S 166 x(summation,)S 167 x(XIEP_AREA)S 165 x +(per-)S 598 y 4796 X(forms)S 173 x(generalized)S 175 x(convolution.)S +267 x(In)S 174 x(particular)S -37 x(,)S 177 x(it)S 174 x(convolves)S +175 x(a)S 174 x(user)S 174 x(speci\211ed)S 174 x(convolu)S 2 x(tion)S +174 x(kernel)S 597 y 4796 X(\(represented)S 179 x(by)S 179 x(the)S +179 x(TMP)S 180 x(type)S 179 x(IDC\))S 178 x(with)S 178 x(the)S 179 x +(subset)S 178 x(of)S 179 x(the)S 179 x(source)S 180 x(image)S 179 x +(object)S 179 x(producing)S 181 x(a)S 598 y 4796 X(new)S 169 x +(image)S 169 x(object.)S 257 x(IDC_t)S 168 x(\(TMP\))S 170 x +(contains)S 169 x(the)S 170 x(kernel)S 170 x(coef\211cients)S 170 x +(and)S 170 x(controls)S 169 x(the)S 169 x(subset)S 169 x(of)S 169 x +(the)S 598 y 4796 X(image)S 166 x(to)S 166 x(which)S 166 x(the)S +166 x(summation)S 166 x(applies.)S 897 y 4796 X(Note)S 189 x(that)S +189 x(by)S 190 x(using)S 190 x(the)S 190 x(template)S 188 x +(mechanism)S 190 x(\(IDC)S 188 x(of)S 189 x(type)S 190 x(TMP\))S +190 x(both)S 190 x(fully)S 190 x(and)S 189 x(partially)S 597 y 4796 X +(populated)S 171 x(convolu)S 2 x(tion)S 171 x(kernels)S 173 x(may)S +172 x(be)S 172 x(represented)S 172 x(and)S 172 x(applied.)S 260 x +(The)S 173 x(convolution)S 173 x(kernel)S 172 x(must)S 598 y 4796 X +(be)S 172 x(smaller)S 173 x(in)S 173 x(extent)S 173 x(than)S 173 x +(the)S 173 x(region)S 174 x(of)S 173 x(the)S 173 x(image)S 173 x(to)S +173 x(which)S 173 x(it)S 173 x(will)S 172 x(be)S 172 x(applied.)S +263 x(Practically)S -54 x(,)S 175 x(3)S 172 x(x)S 598 y 4796 X(3)S +170 x(and)S 170 x(5)S 170 x(x)S 171 x(5)S 170 x(convolu)S 2 x(tion)S +170 x(kernels)S 171 x(should)S 170 x(be)S 171 x(considered.)S 258 x +(The)S 171 x(process)S 170 x(consists)S 169 x(of)S 170 x +(multiplying)S 171 x(the)S 598 y 4796 X(TMP)S 166 x(contents)S 167 x +(by)S 166 x(the)S 166 x(image)S 167 x(contents)S 166 x(on)S 166 x(a)S +166 x(pointwise)S 165 x(basis,)S 166 x(and)S 166 x(summing)S 167 x +(the)S 166 x(results.)S 896 y 4796 X(The)S 177 x(source)S 177 x +(image)S 178 x(object)S 177 x(must)S 177 x(be)S 177 x(large)S 177 x +(enough)S 179 x(to)S 176 x(encompass)S 177 x(all)S 177 x(the)S 177 x +(points)S 176 x(identi\211ed)S 178 x(by)S 177 x(the)S 598 y 4796 X +(IDC)S -2 x(.)S 897 y 4796 X(The)S 182 x(input)S 182 x(image)S 181 x +(object)S 183 x(maybe)S 181 x(either)S 182 x(constrained)S 182 x(or)S +182 x(unconstrained.)S 282 x(If)S 181 x(the)S 182 x(source)S 182 x +(image)S 182 x(is)S 597 y 4796 X(unconstrained)S 173 x(or)S 172 x +(the)S 172 x(process)S 172 x(produces)S 173 x(a)S 172 x(value)S 173 x +(outside)S 171 x(of)S 172 x(the)S 173 x(dynamic)S 173 x(range)S 173 x +(of)S 172 x(the)S 172 x(quantized)S 598 y 4796 X(component,)S 166 x +(conversion)S 166 x(to)S 165 x(unconstrained)S 166 x(occurs.)S 250 x +(If)S 165 x(the)S 165 x(constrain)S 165 x(boolean)S 166 x(is)S 164 x +(true,)S 166 x(the)S 165 x(constraint)S 598 y 4796 X(model)S 165 x +(is)S 166 x(applied)S 166 x(producing)S 167 x(constrained)S 166 x +(output)S 167 x(data.)S 897 y 4796 X(The)S 189 x(input)S 189 x +(image)S 189 x(object)S 190 x(may)S 189 x(be)S 189 x(either)S 189 x +(mono)S 189 x(or)S 189 x(poly)S 189 x(chromatic.)S 296 x(The)S 190 x +(output)S 189 x(image)S 189 x(object)S 597 y 4796 X(will)S 179 x(be)S +181 x(of)S 180 x(the)S 181 x(same)S 180 x(type)S 181 x(\(mono)S 181 x +(or)S 180 x(poly)S 181 x(chromatic\).)S 279 x(As)S 180 x(the)S 181 x +(TMP)S 181 x(type)S 181 x(IDC)S 179 x(has)S 181 x(no)S 181 x +(provision)S 598 y 4796 X(for)S 183 x(speci\211cation)S 183 x(of)S +183 x(parameters)S 183 x(by)S 183 x(spectral)S 183 x(component,)S +188 x(the)S 184 x(same)S 182 x(template)S 183 x(parameters)S 182 x +(and)S 598 y 4796 X(operation)S 184 x(will)S 183 x(be)S 184 x +(applied)S 184 x(to)S 184 x(all)S 184 x(spectral)S 183 x +(components.)S 286 x(Clients)S 183 x(desiring)S 185 x(different)S +184 x(TMP')S -18 x(s)S 184 x(per)S 598 y 4796 X(spectral)S 174 x +(component)S 175 x(should)S 175 x(separate)S 174 x(the)S 175 x +(spectral)S 174 x(components,)S 178 x(operate)S 174 x(upon)S 176 x +(them)S 174 x(separately)S -55 x(,)S 597 y 4796 X(and)S 166 x(then)S +166 x(recombine)S 167 x(them.)S 897 y 4796 X(Speci\211cation)S 173 x +(of)S 172 x(an)S 174 x(invalid)S 173 x(source)S 173 x(IOB,)S 172 x +(an)S 173 x(already)S 173 x(in)S 173 x(use)S 173 x(resource)S 174 x +(id)S 172 x(for)S 173 x(the)S 173 x(destination)S 173 x(IOB,)S 598 y +4796 X(or)S 173 x(an)S 174 x(invalid)S 174 x(IDC)S 172 x(generates)S +174 x(an)S 174 x(IDChoice)S 173 x(error)S -36 x(.)S 264 x(Inability)S +173 x(of)S 174 x(the)S 173 x(server)S 174 x(to)S 174 x(allocate)S +173 x(a)S 173 x(new)S 174 x(IOB)S 597 y 4796 X(generates)S 166 x(an)S +166 x(ALLOC)S 166 x(error)S -36 x(.)S 897 y 4796 X(Client')S -20 x +(s)S 190 x(which)S 190 x(request)S 191 x(noti\211cation)S 190 x(are)S +191 x(noti\211ed)S 190 x(of)S 190 x(the)S 190 x(operation')S -18 x +(s)S 190 x(completion)S 190 x(by)S 190 x(an)S 191 x(XIE_)S 598 y +4796 X(COMPUT)S -28 x(A)S -28 x(TION_COMPLETE)S 165 x(event.)S 35879 Y +3600 X F40(7\20336)S 449 x(REQUESTS)S 166 x(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-37 65 +1000 BP 39600 30600 PM 0 0 XY +5227 Y 3600 X F28(7.4.3)S 599 x(Ensembl)S 2 x(e)S 166 x(Processing)S +6323 Y 4796 X F151(In)S 177 x(ensemble)S 176 x(processing,)S 181 x +(operations)S 177 x(are)S 177 x(performed)S 177 x(on)S 178 x +(pointwise)S 176 x(basis)S 176 x(between)S 177 x(spatially)S 176 x +(reg-)S 598 y 4796 X(istered)S 179 x(points)S 180 x(in)S 180 x(the)S +180 x(two)S 179 x(image)S 181 x(operands.)S 277 x(The)S 181 x(IDC)S +178 x(is)S 180 x(used)S 180 x(simply)S 180 x(to)S 179 x(identify)S +181 x(connected)S 181 x(or)S 598 y 4796 X(disconnected)S 166 x +(subregions)S 167 x(to)S 166 x(be)S 166 x(used)S 166 x(as)S 165 x +(input)S 167 x(operand)S 166 x(data)S 166 x(\(IDC)S 165 x(is)S 165 x +(simply)S 166 x(a)S 166 x(boolean)S 166 x(selector\).)S 896 y 4796 X +(Ensemble)S 165 x(processing)S 166 x(is)S 166 x(divided)S 166 x +(into)S 166 x(four)S 167 x(classes:)S 897 y 4796 X(\201)S 594 x +(Arithmetic)S 747 y 4796 X(\201)S 594 x(Relational)S 747 y 4796 X +(\201)S 594 x(Logical)S 747 y 4796 X(\201)S 594 x(Mathematical)S +12649 Y 4796 X(All)S 179 x(classes)S 179 x(can)S 180 x(accept)S 180 x +(and)S 180 x(potentially)S 181 x(produce)S 180 x(uncon)S 2 x +(strained)S 179 x(image)S 180 x(data)S 180 x(except)S 180 x(the)S +181 x(logical)S 598 y 4796 X(class)S 168 x(which)S 169 x(will)S 169 x +(only)S 170 x(accept)S 169 x(and)S 170 x(produce)S 169 x +(constrained)S 170 x(image)S 169 x(data.)S 256 x(For)S 169 x(all)S +169 x(other)S 170 x(classes,)S 169 x(where)S 598 y 4796 X(multiple)S +189 x(images)S 190 x(are)S 190 x(input)S 190 x(to)S 189 x(the)S 190 x +(operation,)S 197 x(if)S 189 x(all)S 190 x(image)S 190 x(inputs)S +189 x(are)S 190 x(not)S 190 x(the)S 190 x(same)S 189 x(\(either)S +598 y 4796 X(constrained)S 187 x(or)S 188 x(unconstrained\),)S 194 x +(constrained)S 187 x(data)S 187 x(is)S 187 x(promoted)S 187 x(to)S +187 x(uncon)S 2 x(strained)S 187 x(before)S 187 x(the)S 597 y 4796 X +(operation)S 166 x(is)S 165 x(conducted.)S 897 y 4796 X(In)S 174 x +(general,)S 178 x(all)S 174 x(ensemble)S 174 x(services)S 175 x +(operate)S 174 x(on)S 175 x(either)S 174 x(mono)S 175 x(or)S 175 x +(poly)S 174 x(chromatic)S 175 x(images.)S 266 x(For)S 175 x(poly)S +598 y 4796 X(chromatic)S 178 x(images,)S 182 x(the)S 179 x +(operations)S 179 x(are)S 178 x(performed)S 179 x(on)S 179 x(a)S +178 x(band)S 179 x(by)S 179 x(band)S 179 x(basis)S 177 x(and)S 179 x +(the)S 179 x(resulting)S 597 y 4796 X(image)S 166 x(is)S 165 x(also)S +166 x(poly)S 166 x(chromatic.)S 18627 Y 3600 X F36(7.4.3.1)S 599 x +(Arithmetic)S 747 y 4796 X F102(XIEP_ARITH)S 747 y -478 x(iob_id1)S +14599 X(XIT_IOB)S 449 y 6708 X(iob_id2)S 14599 X(XIT_IOB)S 448 y +6708 X(constant)S 14599 X(LISTofCARDnn)S 448 y 6708 X(iob_id3)S +14599 X(XIT_IOB)S 449 y 6708 X(idc)S 14599 X(XIT_IDC)S 448 y 6708 X +(operator)S 14599 X(XIT_ARITH_OP)S 448 y 6708 X(constrain)S 14599 X +(BOOL)S 448 y 6708 X(=>)S 748 y -478 x(none)S 25053 Y 5752 X +(service)S 240 x(class)S 239 x(value:)S 14599 X(1)S 448 y 5752 X +(errors:)S 14599 X(IDChoice,)S 240 x(ALLOC,)S 240 x(MATCH,)S 239 x +(VALUE)S 448 y 5752 X(events:)S 14599 X(XIE_COMPUTATION_C)S 2 x +(OMPLETE)S 897 y 4796 X F151(XIEP_AR)S -2 x(ITH)S 171 x(performs)S +171 x(arithmetic)S 171 x(functions)S 171 x(\(add,)S 173 x(subtract,)S +172 x(multiply)S -55 x(,)S 173 x(divide,)S 172 x(minimum,)S 173 x +(maxi-)S 598 y 4796 X(mum\))S 159 x(between)S 159 x(two)S 158 x +(image)S 159 x(objects)S 160 x(or)S 159 x(between)S 159 x(an)S 159 x +(image)S 160 x(object)S 159 x(and)S 160 x(a)S 159 x(constant)S 159 x +(\(image\))S 159 x(producing)S 598 y 4796 X(a)S 166 x(new)S 166 x +(image)S 166 x(object.)S 896 y 4796 X(IOB)S -2 x(_id1)S 179 x(and)S +180 x(iob_id2)S 179 x(are)S 179 x(the)S 179 x(two)S 179 x(source)S +180 x(image)S 179 x(objects,)S 183 x(and)S 179 x(constant)S 180 x +(is)S 178 x(the)S 180 x(constant)S 179 x(image.)S 598 y 4796 X(When)S +180 x(two)S 179 x(IOB')S -20 x(s)S 180 x(are)S 180 x(involved,)S +185 x(iob_id2)S 180 x(is)S 179 x(non)S 181 x(null)S 180 x(and)S 180 x +(constant)S 180 x(is)S 180 x(ignored.)S 278 x(If)S 179 x(the)S 181 x +(operation)S 598 y 4796 X(involves)S 170 x(a)S 169 x(constant,)S +170 x(iob_id2)S 169 x(is)S 168 x(null)S 170 x(and)S 169 x(constant)S +170 x(is)S 168 x(non)S 170 x(null.)S 256 x(IOB_id3)S 168 x(is)S 169 x +(the)S 169 x(client)S 169 x(speci\211ed)S 169 x(id)S 597 y 4796 X +(to)S 177 x(be)S 177 x(assigned)S 178 x(to)S 177 x(the)S 177 x +(newly)S 178 x(created)S 178 x(\(resulting\))S 177 x(image)S 178 x +(object.)S 273 x(IDC)S 176 x(controls)S 178 x(the)S 177 x(subset)S +177 x(of)S 178 x(the)S 598 y 4796 X(images)S 180 x(which)S 182 x +(will)S 180 x(be)S 181 x(operated)S 181 x(upon.)S 280 x(Operator)S +181 x(controls)S 181 x(which)S 181 x(arithmetic)S 181 x(operation)S +182 x(will)S 180 x(be)S 598 y 4796 X(performed)S 167 x(between)S +168 x(the)S 168 x(two)S 167 x(images)S 168 x(or)S 167 x(between)S +168 x(the)S 168 x(image)S 168 x(and)S 168 x(the)S 168 x(constant)S +168 x(\(image\).)S 253 x(Constrain)S 598 y 4796 X(determines)S 165 x +(if)S 166 x(the)S 166 x(default)S 166 x(constraint)S 167 x(model)S +165 x(will)S 166 x(be)S 166 x(applied)S 165 x(upon)S 167 x +(completion.)S 35879 Y 19780 X F40(REQUESTS)S 165 x(AND)S 165 x +(REPLIES)S 448 x(7\20337)S +PP +EP +%%DOC$Page: 7-38 66 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(The)S 181 x(source)S 181 x(image)S 182 x(objects)S +181 x(need)S 181 x(not)S 181 x(be)S 181 x(the)S 181 x(same)S 181 x +(size,)S 184 x(but)S 181 x(they)S 181 x(must)S 181 x(be)S 181 x +(large)S 181 x(enoug)S 2 x(h)S 181 x(to)S 181 x(en-)S 598 y 4796 X +(compass)S 188 x(all)S 189 x(the)S 189 x(points)S 188 x +(identi\211ed)S 190 x(by)S 189 x(the)S 190 x(IDC)S -2 x(.)S 190 x +(As)S 188 x(the)S 189 x(IDC)S 188 x(is)S 189 x(IOB)S 188 x +(relative,)S 196 x(it)S 188 x(is)S 189 x(the)S 189 x(users)S 597 y +4796 X(responsibility)S 165 x(to)S 166 x(ensure)S 167 x(spatial)S +165 x(alignment)S 167 x(of)S 166 x(the)S 166 x(two)S 165 x(IOB)S +165 x(contents.)S 897 y 4796 X(The)S 170 x(input)S 170 x(image)S +170 x(objects)S 170 x(maybe)S 170 x(either)S 170 x(constrained)S +170 x(or)S 170 x(uncon)S 2 x(strained.)S 257 x(If)S 169 x(the)S 170 x +(operation)S 170 x(involves)S 598 y 4796 X(a)S 172 x(constant)S 172 x +(image)S 172 x(and)S 173 x(an)S 172 x(uncon)S 2 x(strained)S 172 x +(IOB)S -2 x(,)S 173 x(the)S 172 x(constant)S 173 x(will)S 171 x(be)S +172 x(promoted)S 172 x(to)S 172 x(uncon)S 2 x(strained)S 598 y 4796 X +(before)S 171 x(the)S 171 x(operation)S 171 x(is)S 170 x(performed.)S +260 x(If)S 170 x(either)S 171 x(image)S 171 x(is)S 171 x +(unconstrained)S 172 x(or)S 171 x(the)S 171 x(operation)S 171 x +(produces)S 597 y 4796 X(a)S 166 x(value)S 167 x(outside)S 166 x(of)S +167 x(the)S 167 x(dynamic)S 167 x(range)S 167 x(of)S 167 x(the)S +166 x(quantized)S 167 x(component,)S 168 x(conversion)S 167 x(to)S +167 x(unconstrained)S 598 y 4796 X(occurs.)S 250 x(Thus,)S 162 x +(the)S 161 x(resulting)S 162 x(image)S 161 x(object)S 161 x(may)S +161 x(be)S 160 x(constrained)S 161 x(or)S 161 x(uncon)S 2 x +(strained.)S 249 x(If)S 160 x(the)S 161 x(constrain)S 598 y 4796 X +(boolean)S 166 x(is)S 166 x(true,)S 166 x(the)S 167 x(default)S 166 x +(constraint)S 166 x(model)S 166 x(will)S 165 x(be)S 166 x(applied)S +166 x(upon)S 166 x(completion.)S 896 y 4796 X(The)S 174 x(source)S +174 x(images)S 174 x(must)S 174 x(have)S 174 x(the)S 174 x(same)S +174 x(number)S 174 x(of)S 174 x(spectral)S 174 x(components)S 174 x +(or)S 174 x(an)S 174 x(error)S 175 x(is)S 173 x(gener-)S 598 y 4796 X +(ated.)S 249 x(Arithmetic)S 165 x(operations)S 166 x(occurs)S 167 x +(on)S 166 x(a)S 166 x(spectral)S 166 x(component)S 167 x(by)S 166 x +(spectral)S 166 x(component)S 167 x(basis.)S 897 y 4796 X +(Speci\211cation)S 173 x(of)S 172 x(an)S 174 x(invalid)S 173 x +(source)S 173 x(IOB,)S 172 x(an)S 173 x(already)S 173 x(in)S 173 x +(use)S 173 x(resource)S 174 x(id)S 172 x(for)S 173 x(the)S 173 x +(destination)S 173 x(IOB,)S 598 y 4796 X(or)S 173 x(an)S 174 x +(invalid)S 174 x(IDC)S 172 x(generates)S 174 x(an)S 174 x(IDChoice)S +173 x(error)S -36 x(.)S 264 x(Inability)S 173 x(of)S 174 x(the)S +173 x(server)S 174 x(to)S 174 x(allocate)S 173 x(a)S 173 x(new)S +174 x(IOB)S 597 y 4796 X(generates)S 174 x(an)S 174 x(ALLOC)S 173 x +(error)S -36 x(.)S 264 x(Difference)S 174 x(between)S 174 x(source)S +174 x(IOB')S -20 x(s)S 173 x(number)S 175 x(of)S 173 x(spectral)S +174 x(components)S 598 y 4796 X(generates)S 168 x(a)S 168 x(MA)S +-27 x(TCH)S 167 x(error)S -36 x(.)S 254 x(Arithmetic)S 167 x +(failures)S 168 x(\(over\212ow)S -45 x(,)S 169 x(under\212ow)S -45 x +(,)S 169 x(divide)S 168 x(by)S 169 x(zero\))S 167 x(gener)S 2 x(ate)S +167 x(a)S 598 y 4796 X(V)S -56 x(ALUE)S 165 x(error)S -36 x(.)S 897 y +4796 X(Client')S -20 x(s)S 190 x(which)S 190 x(request)S 191 x +(noti\211cation)S 190 x(are)S 191 x(noti\211ed)S 190 x(of)S 190 x +(the)S 190 x(operation')S -18 x(s)S 190 x(completion)S 190 x(by)S +190 x(an)S 191 x(XIE_)S 597 y 4796 X(COMPUT)S -28 x(A)S -28 x +(TION_COMPLETE)S 165 x(event.)S 18017 Y 3600 X F36(7.4.3.2)S 599 x +(Relational)S 747 y 4796 X F102(XIEP_COMPARE)S 747 y 6708 X(iob_id1)S +14599 X(XIT_IOB)S 448 y 6708 X(iob_id2)S 14599 X(XIT_IOB)S 449 y +6708 X(constant)S 14599 X(LISTofCARDnn)S 448 y 6708 X(cpp)S 14599 X +(LISTofXIT_IDC)S 240 x({CPP})S 448 y 6708 X(idc)S 14599 X(XIT_IDC)S +240 x({CPP)S 239 x(or)S 239 x(ROI})S 449 y 6708 X(operator)S 14599 X +(XIT_PRED_TYPE)S 448 y 6708 X(combine)S 14599 X(BOOL)S 747 y 6708 X +(=>)S 747 y -478 x(none)S 748 y 5752 X(service)S 240 x(class)S 239 x +(value:)S 14599 X(1)S 448 y 5752 X(errors:)S 14599 X(IDChoice,)S +240 x(ALLOC,)S 240 x(MATCH)S 448 y 5752 X(events:)S 14599 X +(XIE_COMPUTATION_C)S 2 x(OMPLETE)S 897 y 4796 X F151(XIEP_CO)S -2 x +(MP)S -36 x(ARE)S 174 x(compares)S 174 x(two)S 174 x(image)S 175 x +(objects)S 175 x(or)S 175 x(an)S 176 x(image)S 175 x(object)S 175 x +(and)S 175 x(a)S 175 x(constant)S 175 x(on)S 175 x(a)S 175 x(point-)S +598 y 4796 X(wise)S 175 x(basis)S 176 x(and)S 177 x(gener)S 2 x +(ates)S 176 x(a)S 177 x(CPP)S 176 x(type)S 178 x(IDC)S 175 x +(\(boolean)S 177 x(bitmap\))S 176 x(which)S 177 x(re\212ects)S 178 x +(the)S 177 x(results)S 176 x(of)S 177 x(the)S 597 y 4796 X +(pointwise)S 182 x(comparison.)S 283 x(It)S 183 x(may)S 183 x(be)S +184 x(used)S 183 x(to)S 182 x(perform)S 184 x(either)S 183 x(a)S +183 x(spectral)S 183 x(component)S 183 x(by)S 184 x(spectral)S 598 y +4796 X(component)S 166 x(comparison)S 166 x(or)S 167 x(a)S 166 x +(complete)S 165 x(image)S 167 x(\(all)S 165 x(components)S 167 x +(taken)S 166 x(together\))S 167 x(comparison.)S 897 y 4796 X(IOB)S +-2 x(_id1)S 181 x(and)S 182 x(iob_id2)S 180 x(are)S 182 x(the)S 181 x +(two)S 180 x(source)S 182 x(image)S 181 x(objects,)S 185 x(and)S +181 x(constant)S 182 x(is)S 180 x(the)S 181 x(constant)S 181 x +(value.)S 598 y 4796 X(When)S 180 x(two)S 179 x(IOB')S -20 x(s)S +180 x(are)S 180 x(involved,)S 185 x(iob_id2)S 180 x(is)S 179 x(non)S +181 x(null)S 180 x(and)S 180 x(constant)S 180 x(is)S 180 x(ignored.)S +278 x(If)S 179 x(the)S 181 x(operation)S 597 y 4796 X(involves)S +170 x(a)S 169 x(constant,)S 171 x(iob_id2)S 170 x(is)S 169 x(null)S +170 x(and)S 169 x(constant)S 170 x(is)S 169 x(non)S 170 x(null.)S +257 x(LIST)S -46 x(ofCpp)S 169 x(is)S 169 x(the)S 170 x(client)S +169 x(assigned)S 598 y 4796 X(id')S -19 x(s)S 166 x(for)S 167 x(the)S +167 x(newly)S 167 x(created)S 167 x(control)S 167 x(processing)S +167 x(planes)S 167 x(which)S 167 x(contain)S 167 x(the)S 167 x +(comparative)S 167 x(results.)S 251 x(Idc)S 598 y 4796 X(controls)S +178 x(the)S 178 x(subset)S 177 x(of)S 178 x(the)S 178 x(images)S +178 x(which)S 178 x(will)S 177 x(be)S 178 x(compared.)S 274 x +(Operator)S 177 x(is)S 178 x(the)S 178 x(logical)S 178 x(predicate)S +598 y 4796 X(operator)S 176 x(used)S 176 x(in)S 176 x(the)S 176 x +(comparison.)S 270 x(Combine)S 176 x(is)S 176 x(a)S 176 x(boolean)S +176 x(which)S 177 x(determines)S 176 x(if)S 175 x(the)S 177 x +(comparison)S 597 y 4796 X(should)S 168 x(be)S 169 x(done)S 169 x +(on)S 169 x(a)S 169 x(spectral)S 168 x(component)S 170 x(by)S 169 x +(spectral)S 168 x(component)S 169 x(basis,)S 169 x(or)S 169 x(on)S +169 x(an)S 169 x(all)S 169 x(components)S 598 y 4796 X(basis.)S +35879 Y 3600 X F40(7\20338)S 449 x(REQUESTS)S 166 x(AND)S 165 x +(REPLIES)S +PP +EP +%%DOC$Page: 7-39 67 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(The)S 181 x(source)S 181 x(image)S 182 x(objects)S +181 x(need)S 181 x(not)S 181 x(be)S 181 x(the)S 181 x(same)S 181 x +(size,)S 184 x(but)S 181 x(they)S 181 x(must)S 181 x(be)S 181 x +(large)S 181 x(enoug)S 2 x(h)S 181 x(to)S 181 x(en-)S 598 y 4796 X +(compass)S 188 x(all)S 189 x(the)S 189 x(points)S 188 x +(identi\211ed)S 190 x(by)S 189 x(the)S 190 x(IDC)S -2 x(.)S 190 x +(As)S 188 x(the)S 189 x(IDC)S 188 x(is)S 189 x(IOB)S 188 x +(relative,)S 196 x(it)S 188 x(is)S 189 x(the)S 189 x(users)S 597 y +4796 X(responsibility)S 165 x(to)S 166 x(ensure)S 167 x(spatial)S +165 x(alignment)S 167 x(of)S 166 x(the)S 166 x(two)S 165 x(IOB)S +165 x(contents.)S 897 y 4796 X(The)S 170 x(input)S 170 x(image)S +170 x(objects)S 170 x(maybe)S 170 x(either)S 170 x(constrained)S +170 x(or)S 170 x(uncon)S 2 x(strained.)S 257 x(If)S 169 x(the)S 170 x +(operation)S 170 x(involves)S 598 y 4796 X(a)S 172 x(constant)S 172 x +(image)S 172 x(and)S 173 x(an)S 172 x(uncon)S 2 x(strained)S 172 x +(IOB)S -2 x(,)S 173 x(the)S 172 x(constant)S 173 x(will)S 171 x(be)S +172 x(promoted)S 172 x(to)S 172 x(uncon)S 2 x(strained)S 598 y 4796 X +(before)S 176 x(the)S 176 x(operation)S 177 x(is)S 176 x(performed.)S +270 x(If)S 176 x(the)S 176 x(input)S 177 x(image)S 177 x(objects)S +176 x(are)S 176 x(not)S 177 x(both)S 176 x(constrained,)S 180 x +(both)S 597 y 4796 X(are)S 175 x(converted)S 176 x(to)S 175 x(uncon)S +2 x(strained)S 175 x(before)S 175 x(comparison)S 175 x(occurs.)S +269 x(The)S 176 x(source)S 176 x(images)S 175 x(must)S 174 x(have)S +177 x(the)S 598 y 4796 X(same)S 165 x(number)S 167 x(of)S 166 x +(spectral)S 165 x(components.)S 897 y 4796 X(If)S 156 x(the)S 156 x +(source)S 157 x(images)S 157 x(are)S 156 x(monochr)S 2 x(omatic,)S +158 x(there)S 157 x(is)S 156 x(only)S 157 x(one)S 157 x(output)S +157 x(CPP)S -64 x(.)S 157 x(If)S 156 x(the)S 157 x(source)S 157 x +(images)S 156 x(are)S 597 y 4796 X(polychromatic)S 163 x(and)S 162 x +(the)S 163 x(combine)S 162 x(boolean)S 163 x(is)S 162 x(true,)S 164 x +(there)S 162 x(is)S 162 x(still)S 162 x(only)S 163 x(one)S 163 x +(output)S 162 x(CPP)S -64 x(.)S 163 x(If)S 162 x(the)S 162 x(source)S +598 y 4796 X(images)S 165 x(are)S 167 x(polychromatic)S 167 x(and)S +166 x(the)S 166 x(combine)S 166 x(boolean)S 167 x(is)S 165 x(false,)S +166 x(there)S 167 x(are)S 166 x(three)S 167 x(output)S 166 x(CPP')S +-19 x(s.)S 897 y 4796 X(The)S 161 x(combine)S 161 x(option)S 161 x +(is)S 160 x(only)S 162 x(meaningful)S 162 x(for)S 161 x(the)S 161 x +("equal)S 161 x(to")S 160 x(and)S 161 x("not)S 161 x(equal")S 161 x +(to)S 160 x(operators.)S 250 x(In)S 161 x(these)S 598 y 4796 X +(cases,)S 176 x(equality)S 175 x(is)S 174 x(established)S 173 x(on)S +175 x(a)S 175 x(component)S 175 x(by)S 174 x(component)S 175 x +(basis)S 174 x(and)S 175 x(then)S 175 x('anded')S 173 x(to)S 175 x +(derive)S 597 y 4796 X(image)S 174 x(equality)S -54 x(.)S 266 x +(Inequality)S 175 x(is)S 174 x(then)S 175 x(simply)S 175 x(a)S 174 x +(not)S 175 x(of)S 175 x(this)S 174 x(result.)S 266 x(These)S 175 x +(combine)S 175 x(operations)S 175 x(are)S 598 y 4796 X(provided)S +166 x(as)S 166 x(a)S 166 x(convenienc)S 2 x(e)S 166 x(packaging)S +167 x(\(they)S 167 x(can)S 167 x(easily)S 166 x(be)S 166 x(built)S +166 x(using)S 166 x(other)S 167 x(protocol)S 166 x(functions\).)S +897 y 4796 X(The)S 183 x(function)S 183 x(does)S 182 x(not)S 183 x +(support)S 182 x(rgb)S 184 x(distance)S 182 x(metrics,)S 187 x(and)S +182 x(so,)S 187 x(combined)S 183 x(less)S 182 x(than,)S 187 x(less)S +182 x(than)S 598 y 4796 X(or)S 178 x(equal)S 178 x(to,)S 181 x +(greater)S 179 x(than,)S 182 x(greater)S 179 x(than)S 178 x(or)S +179 x(equal)S 178 x(to)S 178 x(function)S 179 x(are)S 178 x(not)S +178 x(supported.)S 274 x(Clients)S 177 x(may)S 597 y 4796 X +(implement)S 170 x(these)S 172 x(by)S 171 x(using)S 172 x(the)S 172 x +(spectral)S 171 x(separate,)S 172 x(mathematic)S 171 x(process,)S +173 x(arithmetic)S 171 x(process,)S 173 x(and)S 598 y 4796 X +(relational)S 166 x(process)S 165 x(functions.)S 897 y 4796 X(The)S +171 x(output)S 171 x(CPP)S 171 x(has)S 171 x(a)S 171 x(value)S 171 x +(of)S 171 x(1)S 171 x(where)S 171 x(ever)S 171 x(the)S 171 x +(expression)S 171 x(is)S 171 x(true,)S 173 x(and)S 171 x(a)S 170 x +(value)S 172 x(of)S 171 x(0)S 170 x(where)S 171 x(it)S 597 y 4796 X +(is)S 165 x(false)S 166 x(or)S 166 x(the)S 166 x(controlling)S 167 x +(IDC)S 165 x(prevents)S 167 x(comparison.)S 897 y 4796 X +(Speci\211cation)S 173 x(of)S 172 x(an)S 174 x(invalid)S 173 x +(source)S 173 x(IOB,)S 172 x(an)S 173 x(already)S 173 x(in)S 173 x +(use)S 173 x(resource)S 174 x(id)S 172 x(for)S 173 x(the)S 173 x +(destination)S 173 x(IOB,)S 598 y 4796 X(or)S 173 x(an)S 174 x +(invalid)S 174 x(IDC)S 172 x(generates)S 174 x(an)S 174 x(IDChoice)S +173 x(error)S -36 x(.)S 264 x(Inability)S 173 x(of)S 174 x(the)S +173 x(server)S 174 x(to)S 174 x(allocate)S 173 x(a)S 173 x(new)S +174 x(IOB)S 598 y 4796 X(generates)S 166 x(an)S 166 x(ALLOC)S 166 x +(error)S -36 x(.)S 896 y 4796 X(Client')S -20 x(s)S 190 x(which)S +190 x(request)S 191 x(noti\211cation)S 190 x(are)S 191 x(noti\211ed)S +190 x(of)S 190 x(the)S 190 x(operation')S -18 x(s)S 190 x +(completion)S 190 x(by)S 190 x(an)S 191 x(XIE_)S 598 y 4796 X +(COMPUT)S -28 x(A)S -28 x(TION_COMPLETE)S 165 x(event.)S 23695 Y +3600 X F36(7.4.3.3)S 599 x(Logi)S 2 x(cal)S 748 y 4796 X F102 +(XIEP_LOGICAL)S 747 y 6708 X(iob_id1)S 14599 X(XIT_IOB)S 448 y 6708 X +(iob_id2)S 14599 X(XIT_IOB)S 448 y 6708 X(constant)S 14599 X +(LISTofCARDnn)S 449 y 6708 X(iob_id3)S 14599 X(XIT_IOB)S 448 y 6708 X +(idc)S 14599 X(XIT_IDC)S 448 y 6708 X(operator)S 14599 X +(XIT_LOGICAL_OPS)S 748 y 6708 X(=>)S 747 y -478 x(none)S 29972 Y +5752 X(service)S 240 x(class)S 239 x(value:)S 14599 X(1)S 448 y +5752 X(errors:)S 14599 X(IDChoice,)S 240 x(ALLOC,)S 240 x(MATCH)S +448 y 5752 X(events:)S 14599 X(XIE_COMPUTATION_C)S 2 x(OMPLETE)S +897 y 4796 X F151(XIEP_LOG)S -2 x(ICAL)S 177 x(performs)S 178 x +(bitwis)S -2 x(e)S 178 x(\(logical)S 178 x(plane)S 178 x(wise\))S +177 x(operations)S 177 x(on)S 178 x(individual)S 178 x(images,)S +181 x(and)S 598 y 4796 X(between)S 161 x(two)S 161 x(IOB')S -20 x(s)S +161 x(or)S 162 x(an)S 162 x(IOB)S 161 x(and)S 162 x(constant)S 162 x +(\(image\).)S 249 x(All)S 161 x(logical)S 162 x(operators)S 162 x +(are)S 162 x(pointwise,)S 162 x(and)S 162 x(all)S 598 y 4796 X +(produce)S 166 x(a)S 166 x(new)S 166 x(image)S 167 x(object)S 166 x +(as)S 166 x(a)S 166 x(result.)S 35879 Y 19780 X F40(REQUESTS)S 165 x +(AND)S 165 x(REPLIES)S 448 x(7\20339)S +PP +EP +%%DOC$Page: 7-40 68 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(IOB)S -2 x(_id1)S 181 x(and)S 182 x(iob_id2)S +180 x(are)S 182 x(the)S 181 x(two)S 180 x(source)S 182 x(image)S +181 x(objects,)S 185 x(and)S 181 x(constant)S 182 x(is)S 180 x(the)S +181 x(constant)S 181 x(value.)S 598 y 4796 X(When)S 180 x(two)S 179 x +(IOB')S -20 x(s)S 180 x(are)S 180 x(involved,)S 185 x(iob_id2)S 180 x +(is)S 179 x(non)S 181 x(null)S 180 x(and)S 180 x(constant)S 180 x +(is)S 180 x(ignored.)S 278 x(If)S 179 x(the)S 181 x(operation)S 597 y +4796 X(involves)S 172 x(a)S 171 x(constant)S 172 x(\(image)S 172 x +(or)S 172 x(otherwise\),)S 172 x(iob_id2)S 172 x(is)S 171 x(null)S +172 x(and)S 172 x(constant)S 171 x(is)S 171 x(non)S 173 x(null.)S +261 x(IOB_id3)S 170 x(is)S 598 y 4796 X(the)S 166 x(client)S 167 x +(speci)S +(\211ed)S 167 x(id)S 166 x(to)S 167 x(be)S 166 x(assigned)S 167 x +(to)S 166 x(the)S 167 x(newly)S 167 x(created)S 167 x(\(resulting\))S +167 x(image)S 167 x(object.)S 251 x(Idc)S 166 x(controls)S 598 y +4796 X(the)S 168 x(subset)S 167 x(of)S 169 x(the)S 168 x(images)S +168 x(which)S 169 x(will)S 167 x(be)S 168 x(logically)S 169 x +(combined.)S 254 x(Operator)S 168 x(is)S 168 x(the)S 168 x(logical)S +169 x(combination)S 598 y 4796 X(operator)S 166 x(to)S 166 x(be)S +166 x(used.)S 896 y 4796 X(In)S 171 x(the)S 172 x(case)S 171 x(of)S +172 x(the)S 172 x('not')S 171 x(operation,)S 174 x(bitwis)S -2 x(e)S +172 x(inversion)S 173 x(is)S 171 x(performed.)S 260 x(In)S 172 x +(the)S 172 x(case)S 171 x(of)S 172 x(')S -19 x(shift_up')S 171 x +(and)S 598 y 4796 X(')S -19 x(shift_dn',)S 166 x(the)S 166 x +(constant)S 166 x(determines)S 166 x(how)S 166 x(many)S 167 x(bits.)S +248 x(Bits)S 165 x(shifted)S 166 x(in)S 166 x(are)S 167 x(zero)S +165 x(\211lled.)S 897 y 4796 X(The)S 173 x(source)S 173 x(images)S +173 x(must)S 172 x(have)S 173 x(the)S 173 x(same)S 173 x(number)S +173 x(of)S 173 x(spectral)S 172 x(components.)S 263 x(Combining)S +173 x(\(and,)S 175 x(or)S -36 x(,)S 597 y 4796 X(xor\))S 171 x +(occurs)S 171 x(a)S 171 x(spectral)S 171 x(component)S 171 x(by)S +171 x(spectral)S 171 x(component)S 171 x(basis.)S 258 x(and)S 172 x +(on)S 171 x(a)S 171 x(bit)S 170 x(wise)S 170 x(basis)S 170 x(within)S +598 y 4796 X(spectral)S 165 x(component.)S 251 x(If)S 165 x(the)S +167 x(images)S 166 x(differ)S 166 x(in)S 166 x(depth,)S 167 x(the)S +166 x(shallower)S 166 x(is)S 165 x(extended)S 167 x(to)S 166 x(the)S +166 x(same)S 166 x(depth)S 598 y 4796 X(as)S 172 x(the)S 173 x +(deeper)S -36 x(,)S 175 x(with)S 173 x(all)S 173 x(additional)S 173 x +(planes)S 172 x(being)S 174 x(zero)S 173 x(\211lled.)S 264 x(The)S +174 x(resulting)S 174 x(image)S 173 x(has)S 173 x(the)S 173 x(same)S +598 y 4796 X(number)S 166 x(of)S 166 x(spectral)S 166 x(components)S +166 x(as)S 166 x(the)S 166 x(source)S 167 x(images.)S 896 y 4796 X +(The)S 181 x(source)S 181 x(image)S 182 x(objects)S 181 x(need)S +181 x(not)S 181 x(be)S 181 x(the)S 181 x(same)S 181 x(size,)S 184 x +(but)S 181 x(they)S 181 x(must)S 181 x(be)S 181 x(large)S 181 x +(enoug)S 2 x(h)S 181 x(to)S 181 x(en-)S 598 y 4796 X(compass)S 188 x +(all)S 189 x(the)S 189 x(points)S 188 x(identi\211ed)S 190 x(by)S +189 x(the)S 190 x(IDC)S -2 x(.)S 190 x(As)S 188 x(the)S 189 x(IDC)S +188 x(is)S 189 x(IOB)S 188 x(relative,)S 196 x(it)S 188 x(is)S 189 x +(the)S 189 x(users)S 598 y 4796 X(responsibility)S 165 x(to)S 166 x +(ensure)S 167 x(spatial)S 165 x(alignment)S 167 x(of)S 166 x(the)S +166 x(two)S 165 x(IOB)S 165 x(contents.)S 897 y 4796 X(The)S 184 x +(input)S 185 x(image)S 184 x(objects)S 184 x(may)S 184 x(only)S 185 x +(be)S 184 x(constrained.)S 286 x(The)S 185 x(resulting)S 185 x +(image)S 184 x(object)S 185 x(is)S 183 x(also)S 184 x(con-)S 597 y +4796 X(strained.)S 897 y 4796 X(Speci\211cation)S 173 x(of)S 172 x +(an)S 174 x(invalid)S 173 x(source)S 173 x(IOB,)S 172 x(an)S 173 x +(already)S 173 x(in)S 173 x(use)S 173 x(resource)S 174 x(id)S 172 x +(for)S 173 x(the)S 173 x(destination)S 173 x(IOB,)S 598 y 4796 X(or)S +173 x(an)S 174 x(invalid)S 174 x(IDC)S 172 x(generates)S 174 x(an)S +174 x(IDChoice)S 173 x(error)S -36 x(.)S 264 x(Inability)S 173 x(of)S +174 x(the)S 173 x(server)S 174 x(to)S 174 x(allocate)S 173 x(a)S +173 x(new)S 174 x(IOB)S 597 y 4796 X(generates)S 182 x(an)S 181 x +(ALLOC)S 181 x(error)S -36 x(.)S 281 x(Speci\211cation)S 181 x(of)S +182 x(an)S 182 x(unconstrained)S 182 x(IOB)S 181 x(or)S 181 x +(spectral)S 182 x(mismatches)S 598 y 4796 X(between)S 165 x(IOB')S +-19 x(s)S 165 x(generates)S 167 x(a)S 166 x(MA)S -28 x(TCH)S 166 x +(error)S -36 x(.)S 897 y 4796 X(Client')S -20 x(s)S 190 x(which)S +190 x(request)S 191 x(noti\211cation)S 190 x(are)S 191 x(noti\211ed)S +190 x(of)S 190 x(the)S 190 x(operation')S -18 x(s)S 190 x +(completion)S 190 x(by)S 190 x(an)S 191 x(XIE_)S 598 y 4796 X +(COMPUT)S -28 x(A)S -28 x(TION_COMPLETE)S 165 x(event.)S 22201 Y +3600 X F36(7.4.3.4)S 599 x(Mathematical)S 747 y 4796 X F102 +(XIEP_MATHF)S 747 y -478 x(iob_id1)S 14599 X(XIT_IOB)S 449 y 6708 X +(iob_id2)S 14599 X(XIT_IOB)S 448 y 6708 X(idc)S 14599 X(XIT_IDC)S +448 y 6708 X(function)S 14599 X(XIT_MATHF)S 449 y 6708 X(constrain)S +14599 X(BOOL)S 747 y 6708 X(=>)S 747 y -478 x(none)S 747 y 5752 X +(service)S 240 x(class)S 239 x(value:)S 14599 X(1)S 449 y 5752 X +(errors:)S 14599 X(IDChoice,)S 240 x(ALLOC,)S 240 x(VALUE)S 448 y +5752 X(events:)S 14599 X(XIE_COMPUTATION_C)S 2 x(OMPLETE)S 897 y +4796 X F151(XIEP_MA)S -29 x(THF)S 171 x(applies)S 170 x(a)S 170 x +(single)S 171 x(operand)S 171 x(mathematical)S 170 x(function)S 171 x +(to)S 170 x(the)S 171 x(input)S 171 x(image)S 170 x(on)S 171 x(a)S +170 x(point-)S 597 y 4796 X(wise)S 165 x(basis)S 165 x(\(at)S 165 x +(all)S 166 x(points)S 166 x(selected)S 166 x(by)S 166 x(the)S 166 x +(idc\))S 166 x(producing)S 168 x(a)S 166 x(new)S 166 x(image.)S 897 y +4796 X(IOB)S -2 x(_id1)S 175 x(is)S 173 x(the)S 175 x(source)S 175 x +(image)S 174 x(object.)S 267 x(IDC)S 173 x(controls)S 174 x(the)S +175 x(subset)S 173 x(of)S 174 x(the)S 175 x(image)S 174 x(to)S 174 x +(which)S 175 x(the)S 174 x(math)S 598 y 4796 X(function)S 181 x +(will)S 180 x(be)S 180 x(applied.)S 278 x(IOB_id2)S 179 x(is)S 180 x +(the)S 181 x(client)S 181 x(speci\211ed)S 180 x(id)S 181 x(to)S 180 x +(be)S 180 x(assigned)S 181 x(to)S 180 x(the)S 181 x(newly)S 181 x +(cre-)S 597 y 4796 X(ated)S 174 x(\(resulting\))S 175 x(image)S 175 x +(object.)S 268 x(Function)S 176 x(selects)S 174 x(which)S 175 x +(mathematical)S 175 x(function)S 175 x(will)S 174 x(be)S 175 x +(applied.)S 598 y 4796 X(Constrain)S 165 x(determines)S 166 x(if)S +166 x(the)S 166 x(default)S 166 x(constraint)S 166 x(model)S 166 x +(will)S 166 x(be)S 166 x(applied)S 165 x(upon)S 167 x(completion.)S +35879 Y 3600 X F40(7\20340)S 449 x(REQUESTS)S 166 x(AND)S 165 x +(REPLIES)S +PP +EP +%%DOC$Page: 7-41 69 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(The)S 177 x(source)S 177 x(image)S 178 x(object)S +177 x(must)S 177 x(be)S 177 x(large)S 177 x(enough)S 179 x(to)S 176 x +(encompass)S 177 x(all)S 177 x(the)S 177 x(points)S 176 x +(identi\211ed)S 178 x(by)S 177 x(the)S 598 y 4796 X(IDC)S -2 x(.)S +896 y 4796 X(While)S 175 x(the)S 176 x(input)S 176 x(image)S 176 x +(object)S 177 x(maybe)S 176 x(either)S 176 x(constrained)S 176 x(or)S +176 x(unconstrained,)S 180 x(in)S 176 x(most)S 175 x(cases,)S 178 x +(the)S 598 y 4796 X(output)S 178 x(object)S 179 x(will)S 178 x(be)S +178 x(unconstrained.)S 276 x(If)S 178 x(the)S 178 x(constrain)S 179 x +(boolean)S 179 x(is)S 178 x(true,)S 182 x(the)S 179 x(default)S 178 x +(constraint)S 598 y 4796 X(model)S 165 x(will)S 166 x(be)S 166 x +(applied)S 165 x(upon)S 167 x(completion.)S 896 y 4796 X +(Speci\211cation)S 173 x(of)S 172 x(an)S 174 x(invalid)S 173 x +(source)S 173 x(IOB,)S 172 x(an)S 173 x(already)S 173 x(in)S 173 x +(use)S 173 x(resource)S 174 x(id)S 172 x(for)S 173 x(the)S 173 x +(destination)S 173 x(IOB,)S 598 y 4796 X(or)S 173 x(an)S 174 x +(invalid)S 174 x(IDC)S 172 x(generates)S 174 x(an)S 174 x(IDChoice)S +173 x(error)S -36 x(.)S 264 x(Inability)S 173 x(of)S 174 x(the)S +173 x(server)S 174 x(to)S 174 x(allocate)S 173 x(a)S 173 x(new)S +174 x(IOB)S 598 y 4796 X(generates)S 171 x(an)S 171 x(ALLOC)S 169 x +(error)S -36 x(.)S 259 x(Mathematical)S 170 x(errors)S 171 x(such)S +171 x(as)S 170 x(over\212ow)S 172 x(and)S 170 x(invalid)S 171 x +(input)S 171 x(\(sqrt\(-1\)\))S 598 y 4796 X(generate)S 167 x(a)S +165 x(V)S -55 x(ALUE)S 165 x(error)S -36 x(.)S 896 y 4796 X(Client')S +-20 x(s)S 190 x(which)S 190 x(request)S 191 x(noti\211cation)S 190 x +(are)S 191 x(noti\211ed)S 190 x(of)S 190 x(the)S 190 x(operation')S +-18 x(s)S 190 x(completion)S 190 x(by)S 190 x(an)S 191 x(XIE_)S 598 y +4796 X(COMPUT)S -28 x(A)S -28 x(TION_COMPLETE)S 165 x(event.)S 35879 Y +19780 X F40(REQUESTS)S 165 x(AND)S 165 x(REPLIES)S 448 x(7\20341)S +PP +EP +%%DOC$Page: 7-42 70 +1000 BP 39600 30600 PM 0 0 XY +5246 Y 3600 X F28(7.4.4)S 599 x(Geome)S 2 x(tric)S 6342 Y 4796 X F151 +(Geometric)S 158 x(services)S 160 x(provide)S 160 x(for)S 159 x(the)S +160 x(ability)S 159 x(to)S 159 x(choose)S 160 x(a)S 159 x(subset)S +159 x(of)S 159 x(an)S 160 x(image)S 160 x(for)S 159 x(display)S -55 x +(,)S 161 x(and)S 159 x(adjust)S 597 y 4796 X(the)S 178 x(image)S +179 x(with)S 178 x(regards)S 179 x(to)S 178 x(the)S 179 x(two)S 178 x +(spatial)S 177 x(dimensions.)S 274 x(Subsetting)S 179 x(is)S 178 x +(provided)S 179 x(for)S 179 x(by)S 178 x(a)S 179 x(crop)S 598 y +4796 X(function,)S 186 x(adjustment)S 181 x(in)S 182 x(the)S 181 x +(two)S 181 x(spatial)S 180 x(dimensions)S 181 x(via)S 182 x +(translate,)S 185 x(scale,)S 185 x(rotate,)S 186 x(and)S 181 x +(mirror)S 598 y 4796 X(functions.)S 896 y 4796 X(All)S 174 x +(geometric)S 176 x(services)S 176 x(operate)S 176 x(on)S 175 x +(either)S 176 x(mono)S 176 x(or)S 176 x(poly)S 176 x(chromatic)S +176 x(images.)S 268 x(For)S 176 x(poly)S 176 x(chromatic)S 598 y +4796 X(images,)S 188 x(the)S 184 x(operations)S 184 x(are)S 184 x +(performed)S 183 x(individually)S 185 x(on)S 184 x(each)S 185 x(of)S +183 x(the)S 184 x(bands)S 184 x(and)S 184 x(the)S 184 x(resulting)S +598 y 4796 X(image)S 166 x(is)S 165 x(also)S 166 x(poly)S 166 x +(chromatic.)S 897 y 4796 X(Geometric)S 165 x(protocol)S 166 x +(functions)S 167 x(include:)S 896 y 4796 X(\201)S 594 x(XIEP_SCALE)S +165 x(-)S 166 x(scale)S 165 x(image)S 167 x(in)S 166 x(x)S 166 x +(and)S 167 x(y)S 166 x(directions)S 747 y 4796 X(\201)S 594 x +(XIEP_ROT)S -28 x(A)S -28 x(TE)S 166 x(-)S 166 x(rotate)S 166 x +(image)S 166 x(around)S 167 x(z)S 165 x(axis)S 748 y 4796 X(\201)S +594 x(XIEP_MIRRO)S -2 x(R)S 166 x(-)S 166 x(rotate)S 166 x(image)S +166 x(around)S 167 x(x)S 166 x(and/or)S 167 x(y)S 167 x(axes)S 747 y +4796 X(\201)S 594 x(XIEP_CRO)S -2 x(P)S 167 x(-)S 166 x(extract)S +166 x(a)S 166 x(subset)S 165 x(of)S 166 x(an)S 167 x(image)S 747 y +4796 X(\201)S 594 x(XIEP_TRANSLA)S -29 x(TE)S 166 x(-)S 166 x(shift)S +166 x(and)S 166 x(combine)S 167 x(two)S 165 x(images)S 16105 Y 4796 X +(All)S 186 x(geometric)S 187 x(services)S 187 x(can)S 188 x(accept)S +186 x(either)S 188 x(constrained)S 187 x(or)S 187 x(unconstrained)S +188 x(image)S 187 x(data)S 186 x(in.)S 292 x(No)S 598 y 4796 X +(geometric)S 161 x(services)S 162 x(offer)S 161 x(a)S 161 x +(constrain)S 161 x(control)S 162 x(boolean.)S 250 x(The)S 162 x +(output)S 161 x(image)S 162 x(will)S 160 x(be)S 161 x(of)S 161 x +(the)S 162 x(same)S 160 x(type)S 597 y 4796 X(\(constrained)S 166 x +(or)S 166 x(unconstrained\))S 167 x(as)S 166 x(the)S 166 x(input.)S +18795 Y 3600 X F36(7.4.4.1)S 599 x(Crop)S 166 x(Image)S 747 y 4796 X +F102(XIEP_CROP)S 747 y -239 x(src_iob)S 12208 X(XIT_IOB)S 449 y +6708 X(dst_iob)S 12208 X(XIT_IOB)S 448 y 6708 X(idc)S 12208 X +(XIT_IDC)S 240 x({ROI})S 747 y 6708 X(=>)S 747 y -478 x(none)S 747 y +5752 X(service)S 240 x(class)S 239 x(value:)S 12447 X(0)S 449 y +5752 X(errors:)S 12447 X(IDChoice,)S 240 x(ALLOC,)S 240 x(VALUE)S +448 y 5752 X(events:)S 12447 X(XIE_COMPUTATION_C)S 2 x(OMPLETE)S +897 y 4796 X F151(XIEP_CR)S -2 x(OP)S 175 x(creates)S 174 x(a)S 175 x +(new)S 174 x(server)S 175 x(IOB)S 174 x(from)S 175 x(an)S 174 x +(existing)S 176 x(server)S 175 x(IOB)S 173 x(by)S 176 x(cropping)S +175 x(the)S 175 x(old)S 175 x(IOB)S 597 y 4796 X(data)S 165 x(in)S +166 x(either)S 167 x(or)S 166 x(both)S 166 x(the)S 167 x(X)S 165 x +(and)S 166 x(Y)S 166 x(dimensions.)S 897 y 4796 X(SRC_iob)S 172 x +(is)S 174 x(the)S 173 x(id)S 174 x(of)S 174 x(the)S 173 x(source)S +175 x(image)S 174 x(object.)S 265 x(DST_iob)S 173 x(is)S 173 x(the)S +174 x(id)S 174 x(of)S 173 x(the)S 174 x(destination)S 174 x(IOB)S +172 x(\(to)S 174 x(be)S 598 y 4796 X(created\).)S 269 x(The)S 177 x +(idc)S 176 x(of)S 176 x(type)S 176 x(roi)S 177 x(de\211nes)S 176 x +(the)S 176 x(geometric)S 177 x(extent)S 176 x(of)S 176 x(the)S 177 x +(source)S 176 x(image)S 177 x(to)S 176 x(be)S 176 x(cropped.)S 598 y +4796 X(The)S 171 x(server)S 171 x(creates)S 171 x(a)S 171 x(new)S +171 x(IOB)S 169 x(to)S 171 x(receive)S 172 x(the)S 171 x(cropped)S +171 x(image)S 171 x(data)S 170 x(and)S 172 x(attributes,)S 171 x +(and)S 171 x(uses)S 171 x(the)S 597 y 4796 X(client)S 166 x +(speci\211ed)S 166 x(dst_iob)S 165 x(as)S 166 x(its)S 165 x(id.)S +897 y 4796 X(Speci\211cation)S 173 x(of)S 172 x(an)S 174 x(invalid)S +173 x(source)S 173 x(IOB,)S 172 x(an)S 173 x(already)S 173 x(in)S +173 x(use)S 173 x(resource)S 174 x(id)S 172 x(for)S 173 x(the)S 173 x +(destination)S 173 x(IOB,)S 598 y 4796 X(or)S 173 x(an)S 174 x +(invalid)S 174 x(IDC)S 172 x(generates)S 174 x(an)S 174 x(IDChoice)S +173 x(error)S -36 x(.)S 264 x(Inability)S 173 x(of)S 174 x(the)S +173 x(server)S 174 x(to)S 174 x(allocate)S 173 x(a)S 173 x(new)S +174 x(IOB)S 598 y 4796 X(generates)S 166 x(an)S 166 x(ALLOC)S 166 x +(error)S -36 x(.)S 249 x(An)S 166 x(out)S 166 x(of)S 166 x(range)S +168 x(parameter)S 165 x(value)S 167 x(generates)S 167 x(a)S 166 x(V)S +-56 x(ALUE)S 166 x(error)S -36 x(.)S 896 y 4796 X(An)S 170 x(XIE_CO)S +-2 x(MPUT)S -26 x(A)S -28 x(TION_COMPLETE)S 170 x(event)S 171 x +(occurs)S 171 x(when)S 171 x(the)S 171 x(destination)S 170 x(IOB)S +170 x(is)S 170 x(created)S 171 x(and)S 598 y 4796 X(\211lled)S 166 x +(with)S 165 x(the)S 167 x(resulting)S 166 x(cropped)S 167 x(data.)S +35879 Y 3600 X F40(7\20342)S 449 x(REQUESTS)S 166 x(AND)S 165 x +(REPLIES)S +PP +EP +%%DOC$Page: 7-43 71 +1000 BP 39600 30600 PM 0 0 XY +5155 Y 3600 X F36(7.4.4.2)S 599 x(T)S -27 x(ranslate)S 166 x(Image)S +747 y 4796 X F102(XIEP_TRANSLATE)S 748 y 6708 X(src_iob)S 14599 X +(XIT_IOB)S 448 y 6708 X(dst_iob)S 14599 X(XIT_IOB)S 448 y 6708 X +(src_idc)S 14599 X(XIT_IDC)S 449 y 6708 X(dst_idc)S 14599 X(XIT_IDC)S +448 y 6708 X(constant)S 14599 X(LISTofCARDnn)S 747 y 6708 X(=>)S +747 y -478 x(none)S 747 y 5752 X(service)S 240 x(class)S 239 x +(value:)S 12447 X(0)S 449 y 5752 X(errors:)S 12447 X(IDChoice,)S +240 x(ALLOC,)S 240 x(VALUE,)S 239 x(MATCH)S 448 y 5752 X(events:)S +12447 X(XIE_COMPUTATION_C)S 2 x(OMPLETE)S 897 y 4796 X F151 +(XIEP_TRA)S -2 x(NSLA)S -27 x(TE)S 180 x(allows)S 179 x(one)S 181 x +(image)S 181 x(to)S 180 x(be)S 180 x(translated)S 180 x(or)S 180 x +(shifted)S 180 x(relative)S 181 x(to)S 180 x(another)S 181 x(image)S +597 y 4796 X(and)S 169 x(then)S 171 x(combined)S 170 x(via)S 170 x +(simple)S 169 x(overlay)S -54 x(.)S 257 x(In)S 169 x(essence,)S 172 x +(it)S 169 x(is)S 169 x(the)S 170 x(inverse)S 171 x(of)S 169 x(crop)S +170 x(as)S 170 x(it)S 169 x(provides)S 170 x(for)S 170 x(a)S 598 y +4796 X(simple)S 165 x(paste)S 165 x(operation.)S 897 y 4796 X(SRC_I)S +-2 x(OB)S 168 x(acts)S 168 x(as)S 168 x(the)S 168 x(source)S 169 x +(of)S 168 x(image)S 169 x(data)S 168 x(for)S 168 x(the)S 169 x +(translate)S 168 x(and)S 168 x(combine)S 169 x(operation.)S 254 x +(DST_IOB)S 598 y 4796 X(acts)S 167 x(as)S 167 x(the)S 168 x +(destination)S 168 x(or)S 168 x(receiving)S 170 x(location)S 168 x +(of)S 167 x(the)S 168 x(translate)S 168 x(and)S 168 x(combine)S 168 x +(operation.)S 254 x(SRC_ID)S -2 x(C)S 597 y 4796 X(determines)S 174 x +(the)S 174 x(subset)S 174 x(of)S 174 x(SRC_IOB)S 173 x(that)S 174 x +(will)S 173 x(be)S 175 x(used.)S 266 x(DST_IDC)S 173 x(determines)S +174 x(the)S 174 x(location)S 175 x(and)S 598 y 4796 X(clip)S 165 x +(boundaries)S 167 x(in)S 166 x(DST_IOB)S 165 x(that)S 166 x(will)S +165 x(receive)S 167 x(the)S 166 x(source)S 167 x(image)S 166 x +(data.)S 897 y 4796 X(The)S 176 x(two)S 175 x(IDC')S -20 x(s)S 175 x +(\(SRC_IDC)S 174 x(and)S 176 x(DST_IDC\))S 174 x(are)S 176 x +(conceptually)S 177 x(aligned)S 177 x(at)S 175 x(their)S 176 x +(upper)S 176 x(left)S 176 x(corner)S -36 x(.)S 598 y 4796 X(If)S +179 x(SRC_IDC)S 178 x(is)S 180 x(smaller)S 179 x(than)S 181 x +(DST_IDC)S 178 x(in)S 181 x(either)S 180 x(direction,)S 184 x(the)S +181 x(remaining)S 181 x(pixels)S 180 x(in)S 180 x(the)S 180 x(area)S +597 y 4796 X(prescribed)S 175 x(by)S 176 x(the)S 176 x(DST_IDC)S +174 x(are)S 176 x(\211lled)S 176 x(with)S 175 x(the)S 175 x(CONST)S +-28 x(ANT)S 176 x(value)S 176 x(in)S 176 x(that)S 175 x(direction.)S +269 x(If)S 175 x(SRC_)S 598 y 4796 X(IDC)S 158 x(is)S 160 x(larger)S +161 x(than)S 160 x(DST_IDC)S 159 x(in)S 160 x(either)S 160 x +(direction,)S 162 x(the)S 160 x(source)S 161 x(data)S 159 x(is)S +160 x(clipped)S 160 x(to)S 159 x(\211t)S 160 x(with)S 160 x(DST_IDC)S +598 y 4796 X(in)S 166 x(that)S 166 x(direction.)S 896 y 4796 X(Note)S +168 x(that)S 168 x(both)S 169 x(SRC_IO)S -2 x(B)S 169 x(and)S 168 x +(SRC_IDC)S 167 x(are)S 169 x(optional)S 168 x(\(both)S 169 x(must)S +168 x(be)S 169 x(present)S 168 x(or)S 169 x(absent\).)S 254 x(If)S +168 x(they)S 598 y 4796 X(are)S 168 x(absent,)S 170 x(CONST)S -29 x +(ANT)S 169 x(is)S 168 x(used)S 168 x(as)S 169 x(the)S 168 x(source)S +169 x(data)S 168 x(which)S 169 x(is)S 168 x(pasted)S 168 x(into)S +169 x(the)S 168 x(destination)S 169 x(image)S 598 y 4796 X(area)S +166 x(prescribed)S 166 x(by)S 166 x(DST_IDC.)S 897 y 4796 X(The)S +165 x(server)S 165 x(creates)S 164 x(a)S 165 x(new)S 164 x(IOB)S +164 x(to)S 164 x(receive)S 166 x(the)S 165 x(combined)S 165 x(image)S +165 x(data)S 164 x(and)S 165 x(attributes,)S 164 x(and)S 165 x(uses)S +164 x(the)S 597 y 4796 X(client)S 166 x(speci\211ed)S 166 x(dst_iob)S +165 x(as)S 166 x(its)S 165 x(id.)S 897 y 4796 X(Note)S 175 x(that)S +175 x(this)S 175 x(function)S 177 x(only)S 176 x(supports)S 175 x +(replacement)S 176 x(or)S 175 x(non)S 177 x(transparent)S 175 x +(overlay)S 177 x(\(combination\))S 598 y 4796 X(and)S 166 x(not)S +166 x(alpha)S 166 x(plane)S 166 x(control)S 167 x(mixing)S 167 x(or)S +166 x(translucency)S -54 x(.)S 896 y 4796 X(Both)S 181 x(images)S +182 x(must)S 182 x(be)S 182 x(constrained)S 183 x(or)S 182 x +(unconstrained)S 183 x(and)S 183 x(mono)S 182 x(chromatic)S 183 x +(or)S 182 x(polychromatic.)S 598 y 4796 X(If)S 179 x(the)S 180 x +(operation)S 180 x(involves)S 181 x(a)S 180 x(constant)S 179 x +(image)S 181 x(and)S 180 x(an)S 180 x(unconstrained)S 181 x(IOB,)S +179 x(the)S 180 x(constant)S 180 x(will)S 179 x(be)S 598 y 4796 X +(promoted)S 165 x(to)S 166 x(uncon)S 2 x(strained)S 165 x(before)S +167 x(the)S 166 x(operation)S 166 x(is)S 166 x(performed.)S 897 y +4796 X(Speci\211cation)S 173 x(of)S 172 x(an)S 174 x(invalid)S 173 x +(source)S 173 x(IOB,)S 172 x(an)S 173 x(already)S 173 x(in)S 173 x +(use)S 173 x(resource)S 174 x(id)S 172 x(for)S 173 x(the)S 173 x +(destination)S 173 x(IOB,)S 597 y 4796 X(or)S 188 x(an)S 188 x +(invalid)S 189 x(IDC)S 187 x(generates)S 189 x(an)S 189 x(IDC)S -2 x +(hoice)S 189 x(error)S -36 x(.)S 294 x(Inability)S 188 x(of)S 188 x +(the)S 189 x(server)S 188 x(to)S 188 x(allocate)S 189 x(a)S 188 x +(new)S 598 y 4796 X(IOB)S 172 x(generates)S 174 x(an)S 173 x(ALLOC)S +173 x(error)S -37 x(.)S 264 x(An)S 174 x(out)S 173 x(of)S 173 x +(range)S 175 x(parameter)S 173 x(value)S 174 x(generates)S 174 x(a)S +173 x(V)S -56 x(ALUE)S 173 x(error)S -36 x(.)S 598 y 4796 X +(Mismatch)S 165 x(in)S 167 x(constraints)S 166 x(or)S 166 x +(chromaticity)S 166 x(between)S 166 x(source)S 167 x(images)S 166 x +(generates)S 166 x(a)S 166 x(MA)S -27 x(TCH)S 166 x(error)S -36 x(.)S +896 y 4796 X(An)S 170 x(XIE_CO)S -2 x(MPUT)S -26 x(A)S -28 x +(TION_COMPLETE)S 170 x(event)S 171 x(occurs)S 171 x(when)S 171 x +(the)S 171 x(destination)S 170 x(IOB)S 170 x(is)S 170 x(created)S +171 x(and)S 598 y 4796 X(\211lled)S 166 x(with)S 165 x(the)S 167 x +(resulting)S 166 x(cropped)S 167 x(data.)S 35879 Y 19780 X F40 +(REQUESTS)S 165 x(AND)S 165 x(REPLIES)S 448 x(7\20343)S +PP +EP +%%DOC$Page: 7-44 72 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 3600 X F36(7.4.4.3)S 599 x(Scale)S 167 x(Image)S 747 y 4796 X +F102(XIEP_SCALE)S 747 y -478 x(src_iob)S 12208 X(XIT_IOB)S 448 y +6708 X(dst_iob)S 12208 X(XIT_IOB)S 449 y 6708 X(pixels_per_s)S 2 x +(canline)S 12208 X(CARD32)S 448 y 6708 X(number_of_sc)S 2 x(anlines)S +12208 X(CARD32)S 747 y 6708 X(=>)S 747 y -478 x(none)S 748 y 5752 X +(service)S 240 x(class)S 239 x(value:)S 12447 X(0)S 448 y 5752 X +(errors:)S 12447 X(IDChoice,)S 240 x(ALLOC,)S 240 x(VALUE)S 448 y +5752 X(events:)S 12447 X(XIE_COMPUTATION_C)S 2 x(OMPLETE)S 897 y +4796 X F151(XIEP_SC)S -2 x(ALE)S 176 x(creates)S 175 x(a)S 176 x +(new)S 176 x(server)S 176 x(IOB)S 175 x(from)S 176 x(an)S 176 x +(existing)S 177 x(server)S 176 x(IOB)S 175 x(by)S 176 x(scaling)S +176 x(the)S 176 x(old)S 176 x(IOB)S 598 y 4796 X(data)S 165 x(in)S +166 x(either)S 167 x(or)S 166 x(both)S 166 x(the)S 167 x(x)S 166 x +(and)S 166 x(y)S 167 x(dimensions.)S 896 y 4796 X(SRC_iob)S 181 x +(is)S 182 x(the)S 183 x(id)S 183 x(of)S 182 x(the)S 183 x(source)S +183 x(image)S 183 x(object.)S 284 x(DST_iob)S 182 x(is)S 182 x(the)S +183 x(id)S 182 x(of)S 183 x(the)S 183 x(destination)S 182 x(IOB)S +182 x(\(to)S 598 y 4796 X(be)S 178 x(created\).)S 275 x +(Pixels_per_scanline)S 180 x(is)S 178 x(the)S 179 x(number)S 179 x +(of)S 179 x(pixels)S 178 x(per)S 179 x(scan)S 179 x(line)S 179 x +(for)S 178 x(the)S 179 x(scaled)S 179 x(image.)S 598 y 4796 X +(Number_of_scanlines)S 166 x(is)S 166 x(the)S 166 x(number)S 167 x +(of)S 166 x(scan)S 166 x(lines)S 166 x(in)S 166 x(the)S 166 x +(scaled)S 166 x(image.)S 896 y 4796 X(The)S 169 x(two)S 168 x(IOB')S +-20 x(s)S 168 x(may)S 169 x(differ)S 169 x(in)S 169 x(either)S 169 x +(or)S 169 x(both)S 169 x(the)S 169 x(number)S 169 x(of)S 169 x +(pixels)S 169 x(per)S 168 x(scan)S 169 x(line)S 169 x(and)S 169 x +(the)S 169 x(number)S 598 y 4796 X(of)S 175 x(scan)S 175 x(lines.)S +268 x(The)S 176 x(ratio)S 175 x(of)S 175 x(new)S 175 x(to)S 175 x +(old)S 175 x(values)S 176 x(of)S 175 x(these)S 175 x(two)S 175 x +(sets)S 174 x(may)S 175 x(be)S 176 x(considered)S 175 x(to)S 175 x +(be)S 175 x(the)S 176 x(x)S 598 y 4796 X(and)S 168 x(y)S 169 x +(scale)S 168 x(factors.)S 254 x(Scaling)S 169 x(up)S 169 x(or)S 169 x +(down)S 168 x(\(new)S 168 x(value)S 169 x(leq)S 169 x(or)S 168 x +(new)S 169 x(value)S 169 x(geq)S 169 x(old)S 168 x(value\))S 169 x +(is)S 168 x(allowed.)S 598 y 4796 X(Scaling)S 183 x(in)S 184 x(one)S +184 x(or)S 183 x(both)S 184 x(dimensions)S 183 x(at)S 183 x(the)S +183 x(same)S 183 x(time)S 183 x(is)S 183 x(allowed.)S 283 x(Non)S +184 x(integral)S 184 x(ratios)S 183 x(\(scale)S 597 y 4796 X +(factors\))S 165 x(is)S 166 x(allowed.)S 897 y 4796 X(XIEP_SC)S -2 x +(ALE_IMAGE)S 181 x(operates)S 182 x(on)S 182 x(the)S 183 x(complete)S +181 x(input)S 183 x(image)S 182 x(to)S 182 x(produce)S 183 x(the)S +182 x(scaled)S 182 x(output)S 598 y 4796 X(image.)S 268 x(Those)S +176 x(attempting)S 176 x(to)S 175 x(scale)S 175 x(a)S 176 x(portion)S +176 x(of)S 175 x(a)S 176 x(source)S 176 x(image)S 176 x(should)S +176 x(use)S 175 x(crop)S 176 x(to)S 175 x(extract)S 176 x(the)S 598 y +4796 X(sub)S 165 x(image)S 167 x(into)S 166 x(a)S 166 x(new)S 166 x +(IOB,)S 165 x(and)S 167 x(then)S 166 x(scale)S 166 x(it.)S 896 y +4796 X(W)S -19 x(ith)S 177 x(knowledge)S 179 x(of)S 177 x(the)S 178 x +(display)S 177 x(device)S 179 x(characteristics)S 177 x(and)S 178 x +(the)S 178 x(original)S 178 x(source)S 178 x(object,)S 181 x(a)S +178 x(client)S 598 y 4796 X(can)S 166 x(achieve)S 167 x +(combinations)S 166 x(of)S 166 x(the)S 166 x(following:)S 897 y +4796 X(\201)S 594 x(scale)S 166 x(to)S 166 x(\211t)S 166 x(within)S +166 x(a)S 166 x(window)S 747 y 4796 X(\201)S 594 x(scale)S 166 x +(preserving)S 167 x(original)S 167 x(aspect)S 166 x(ratio)S 747 y +4796 X(\201)S 594 x(scale)S 166 x(to)S 166 x(reproduce)S 167 x(at)S +166 x(original)S 166 x(size)S 747 y 4796 X(\201)S 594 x(...)S 25843 Y +4796 X(The)S 176 x(server)S 176 x(creates)S 176 x(a)S 176 x(new)S +175 x(IOB)S 175 x(to)S 176 x(receive)S 176 x(the)S 176 x(scaled)S +176 x(image)S 176 x(data)S 175 x(and)S 176 x(attributes,)S 178 x +(and)S 176 x(uses)S 176 x(the)S 598 y 4796 X(client)S 166 x +(speci\211ed)S 166 x(dst_iob)S 165 x(as)S 166 x(its)S 165 x(id.)S +896 y 4796 X(Servers)S 174 x(are)S 174 x(free)S 175 x(to)S 173 x +(choose)S 175 x(their)S 174 x(own)S 174 x(scaling)S 175 x +(algorithms)S 174 x(\(including)S 175 x(separate)S 174 x(integral)S +175 x(and)S 174 x(non)S 598 y 4796 X(integral)S 166 x(ones\).)S 897 y +4796 X(Speci\211cation)S 173 x(of)S 172 x(an)S 174 x(invalid)S 173 x +(source)S 173 x(IOB,)S 172 x(an)S 173 x(already)S 173 x(in)S 173 x +(use)S 173 x(resource)S 174 x(id)S 172 x(for)S 173 x(the)S 173 x +(destination)S 173 x(IOB,)S 598 y 4796 X(or)S 173 x(an)S 174 x +(invalid)S 174 x(IDC)S 172 x(generates)S 174 x(an)S 174 x(IDChoice)S +173 x(error)S -36 x(.)S 264 x(Inability)S 173 x(of)S 174 x(the)S +173 x(server)S 174 x(to)S 174 x(allocate)S 173 x(a)S 173 x(new)S +174 x(IOB)S 597 y 4796 X(generates)S 166 x(an)S 166 x(ALLOC)S 166 x +(error)S -36 x(.)S 249 x(An)S 166 x(out)S 166 x(of)S 166 x(range)S +168 x(parameter)S 165 x(value)S 167 x(generates)S 167 x(a)S 166 x(V)S +-56 x(ALUE)S 166 x(error)S -36 x(.)S 897 y 4796 X(An)S 170 x(XIE_CO)S +-2 x(MPUT)S -26 x(A)S -28 x(TION_COMPLETE)S 170 x(event)S 171 x +(occurs)S 171 x(when)S 171 x(the)S 171 x(destination)S 170 x(IOB)S +170 x(is)S 170 x(created)S 171 x(and)S 598 y 4796 X(\211lled)S 166 x +(with)S 165 x(the)S 167 x(resulting)S 166 x(scaled)S 166 x(data.)S +35879 Y 3600 X F40(7\20344)S 449 x(REQUESTS)S 166 x(AND)S 165 x +(REPLIES)S +PP +EP +%%DOC$Page: 7-45 73 +1000 BP 39600 30600 PM 0 0 XY +5155 Y 3600 X F36(7.4.4.4)S 599 x(Rotate)S 166 x(Image)S 747 y 4796 X +F102(XIEP_ROTATE)S 748 y -717 x(src_iob)S 12208 X(XIT_IOB)S 448 y +6708 X(dst_iob)S 12208 X(XIT_IOB)S 448 y 6708 X(angle)S 12208 X +(XIT_FLOAT)S 449 y 6708 X(width)S 12208 X(CARD32)S 448 y 6708 X +(height)S 12208 X(CARD32)S 448 y 6708 X(fill)S 12208 X(LISTofCARD32)S +747 y 6708 X(=>)S 748 y -478 x(none)S 747 y 5752 X(service)S 240 x +(class)S 239 x(value:)S 12447 X(0)S 448 y 5752 X(errors:)S 12447 X +(IDChoice,)S 240 x(ALLOC,)S 240 x(VALUE)S 448 y 5752 X(events:)S +12447 X(XIE_COMPUTATION_C)S 2 x(OMPLETE)S 897 y 4796 X F151(XIEP_RO)S +-2 x(T)S -27 x(A)S -28 x(TE)S 172 x(creates)S 173 x(a)S 172 x(new)S +172 x(server)S 173 x(IOB)S 172 x(from)S 172 x(an)S 172 x(existing)S +173 x(server)S 173 x(IOB)S 172 x(by)S 173 x(rotating)S 172 x(the)S +173 x(source)S 598 y 4796 X(IOB)S 168 x(data)S 169 x(around)S 170 x +(the)S 169 x(z)S 169 x(axis)S 169 x(\(normal)S 170 x(to)S 169 x(the)S +170 x(2d)S 169 x(image)S 169 x(data)S 169 x(x-y)S 170 x(plane\))S +170 x(through)S 171 x(the)S 169 x(center)S 170 x(of)S 169 x(the)S +598 y 4796 X(source)S 166 x(IOB.)S 896 y 4796 X(SRC_iob)S 172 x(is)S +174 x(the)S 173 x(id)S 174 x(of)S 174 x(the)S 173 x(source)S 175 x +(image)S 174 x(object.)S 265 x(DST_iob)S 173 x(is)S 173 x(the)S 174 x +(id)S 174 x(of)S 173 x(the)S 174 x(destination)S 174 x(IOB)S 172 x +(\(to)S 174 x(be)S 598 y 4796 X(created\).)S 257 x(Angle)S 170 x(is)S +170 x(the)S 170 x(rotation)S 170 x(angle)S 171 x(in)S 170 x(degrees)S +171 x(measured)S 170 x(clockwise)S 170 x(around)S 170 x(the)S 171 x +(z)S 169 x(axis.)S 258 x(W)S -19 x(idth)S 598 y 4796 X(and)S 172 x +(height)S 173 x(are)S 172 x(parameters)S 172 x(which)S 173 x +(determine)S 172 x(the)S 172 x(resulting)S 173 x(size)S 172 x(of)S +172 x(the)S 172 x(rotated)S 172 x(image)S 172 x(\(dst_iob\).)S 597 y +4796 X(Fill)S 166 x(is)S 165 x(the)S 166 x(value)S 167 x(of)S 166 x +(a)S 166 x(pixel)S 166 x(to)S 166 x(use)S 166 x(in)S 167 x(areas)S +166 x(where)S 166 x(the)S 166 x(pixel)S 166 x(value)S 167 x(is)S +166 x(undetermined)S 167 x(by)S 166 x(rotation.)S 897 y 4796 X +(XIEP_RO)S -2 x(T)S -27 x(A)S -28 x(TE)S 178 x(operates)S 178 x(on)S +179 x(the)S 178 x(complete)S 178 x(input)S 178 x(image)S 179 x(to)S +178 x(produce)S 179 x(the)S 178 x(rotated)S 178 x(output)S 178 x +(image.)S 598 y 4796 X(Those)S 183 x(attempting)S 183 x(to)S 183 x +(rotate)S 182 x(a)S 183 x(portion)S 183 x(of)S 183 x(a)S 183 x +(source)S 184 x(image)S 183 x(should)S 183 x(use)S 183 x(crop)S 184 x +(to)S 182 x(extract)S 184 x(the)S 183 x(sub)S 598 y 4796 X(image)S +166 x(into)S 166 x(a)S 166 x(new)S 166 x(IOB,)S 165 x(and)S 167 x +(then)S 166 x(rotate)S 166 x(it.)S 896 y 4796 X(The)S 175 x(width)S +175 x(and)S 176 x(height)S 176 x(parameters)S 175 x(operate)S 175 x +(independently)S -54 x(,)S 178 x(but)S 175 x(in)S 176 x(a)S 175 x +(similar)S 175 x(fashion.)S 268 x(They)S 177 x(are)S 598 y 4796 X +(used)S 187 x(to)S 188 x(determine)S 187 x(the)S 188 x(size)S 187 x +(of)S 188 x(the)S 187 x(resulting)S 189 x(image)S 187 x +(\(dst_iob\).)S 292 x(If)S 188 x(either)S 187 x(or)S 188 x(both)S +188 x(is)S 187 x(zero,)S 194 x(the)S 598 y 4796 X(algorithm)S 167 x +(determines)S 167 x(the)S 167 x(smallest)S 165 x(bounding)S 168 x +(dimension)S 167 x(in)S 167 x(that)S 167 x(direction)S 167 x(which)S +168 x(will)S 166 x(contain)S 167 x(all)S 598 y 4796 X(of)S 168 x +(the)S 168 x(rotated)S 168 x(source)S 168 x(data,)S 169 x(and)S 168 x +(sets)S 168 x(the)S 168 x(resulting)S 169 x(image)S 168 x(object)S +169 x(to)S 168 x(that)S 168 x(size.)S 253 x(In)S 168 x(essence,)S +169 x(setting)S 597 y 4796 X(width)S 177 x(and/or)S 178 x(height)S +179 x(to)S 177 x(zero)S 177 x(ensures)S 178 x(that)S 178 x(no)S 178 x +(rotated)S 177 x(data)S 177 x(is)S 177 x(clipped)S 178 x(in)S 177 x +(the)S 178 x(horizontal)S 178 x(and/or)S 598 y 4796 X(vertical)S +166 x(direction,)S 167 x(and)S 166 x(that)S 166 x(a)S 166 x(minimal)S +166 x(bounding)S 167 x(size)S 165 x(is)S 166 x(chosen.)S 897 y 4796 X +(If)S 173 x(either)S 174 x(or)S 174 x(both)S 174 x(is)S 174 x +(nonzero,)S 177 x(the)S 174 x(algorithm)S 174 x(will)S 173 x(set)S +173 x(the)S 175 x(resulting)S 174 x(image)S 174 x(object)S 175 x(to)S +173 x(the)S 174 x(speci\211ed)S 597 y 4796 X(size.)S 248 x(If)S 162 x +(the)S 162 x(rotated)S 162 x(data)S 161 x(is)S 162 x(larger)S 163 x +(in)S 162 x(this)S 161 x(direction)S 163 x(than)S 162 x(the)S 162 x +(destination)S 162 x(image)S 162 x(object,)S 164 x(the)S 162 x +(image)S 598 y 4796 X(is)S 165 x(clipped)S 166 x(symmetricaly)S -55 x +(.)S 897 y 4796 X(In)S 176 x(either)S 177 x(case,)S 180 x(the)S 177 x +(rotated)S 176 x(data)S 177 x(will)S 176 x(be)S 176 x(centered)S +178 x(in)S 177 x(the)S 177 x(resulting)S 177 x(image)S 177 x +(object,)S 180 x(and)S 177 x(pixels)S 177 x(in)S 598 y 4796 X(the)S +173 x(rotated)S 173 x(IOB)S 173 x(which)S 173 x(do)S 174 x(not)S +173 x(derive)S 174 x(from)S 174 x(source)S 174 x(IOB)S 172 x(pixels)S +173 x(will)S 173 x(have)S 174 x(their)S 174 x(value)S 174 x(set)S +173 x(to)S 173 x(that)S 597 y 4796 X(speci\211ed)S 170 x(in)S 170 x +(the)S 170 x(Fill)S 170 x(parameter)S -37 x(.)S 258 x(Centering)S +170 x(the)S 171 x(image)S 170 x(\(due)S 170 x(to)S 170 x(rotation)S +170 x(around)S 171 x(the)S 170 x(center)S 171 x(of)S 170 x(the)S +598 y 4796 X(source)S 166 x(image\))S 166 x(results)S 166 x(in)S +166 x(symmetric)S 166 x(clipping)S 167 x(when)S 166 x(clipping)S +167 x(occurs.)S 897 y 4796 X(Servers)S 171 x(are)S 171 x(free)S 171 x +(to)S 171 x(choose)S 171 x(their)S 171 x(own)S 171 x(rotation)S 171 x +(algorithms)S 171 x(\(including)S 172 x(separate)S 171 x(integral)S +171 x(and)S 172 x(non)S 598 y 4796 X(integral)S 166 x(ones\).)S 896 y +4796 X(Invalid)S 182 x(src_iob)S 182 x(results)S 182 x(in)S 183 x +(an)S 182 x(IOB)S 181 x(error)S -36 x(.)S 282 x(Inability)S 182 x +(to)S 182 x(allocate)S 182 x(the)S 183 x(rotated)S 182 x(IOB)S 181 x +(results)S 182 x(in)S 182 x(an)S 598 y 4796 X(ALLOC)S 165 x(error)S +-36 x(,)S 166 x(while)S 166 x(invalid)S 167 x(parameter)S 165 x +(values)S 167 x(result)S 166 x(in)S 166 x(V)S -55 x(ALUE)S 165 x +(errors.)S 897 y 4796 X(An)S 170 x(XIE_CO)S -2 x(MPUT)S -26 x(A)S +-28 x(TION_COMPLETE)S 170 x(event)S 171 x(occurs)S 171 x(when)S 171 x +(the)S 171 x(destination)S 170 x(IOB)S 170 x(is)S 170 x(created)S +171 x(and)S 597 y 4796 X(\211lled)S 166 x(with)S 165 x(the)S 167 x +(resulting)S 166 x(rotated)S 166 x(data.)S 35879 Y 19780 X F40 +(REQUESTS)S 165 x(AND)S 165 x(REPLIES)S 448 x(7\20345)S +PP +EP +%%DOC$Page: 7-46 74 +1000 BP 39600 30600 PM 0 0 XY +5155 Y 3600 X F36(7.4.4.5)S 599 x(Mirror)S 166 x(Image)S 747 y 4796 X +F102(XIEP_MIRROR)S 748 y -717 x(src_iob)S 12208 X(XIT_IOB)S 448 y +6708 X(dst_iob)S 12208 X(XIT_IOB)S 448 y 6708 X(x-mirror)S 12208 X +(BOOL)S 449 y 6708 X(y-mirror)S 12208 X(BOOL)S 747 y 6708 X(=>)S +747 y -478 x(none)S 10535 Y 5752 X(service)S 240 x(class)S 239 x +(value:)S 12447 X(0)S 448 y 5752 X(errors:)S 12447 X(IDChoice,)S +240 x(ALLOC)S 449 y 5752 X(events:)S 12447 X(XIE_COMPUTATION_C)S +2 x(OMPLETE)S 896 y 4796 X F151(XIEP_MIRR)S -2 x(OR)S 166 x(creates)S +167 x(a)S 167 x(new)S 167 x(server)S 168 x(IOB)S 166 x(from)S 167 x +(an)S 167 x(existing)S 168 x(server)S 167 x(IOB)S 166 x(by)S 167 x +(rotating)S 168 x(the)S 167 x(old)S 167 x(IOB)S 598 y 4796 X(data)S +169 x(around)S 172 x(the)S 170 x(x)S 171 x(axis,)S 172 x(y)S 171 x +(axis,)S 172 x(or)S 170 x(x)S 171 x(&)S 170 x(y)S 171 x(axes)S 171 x +(of)S 170 x(the)S 170 x(source)S 171 x(IOB.)S 170 x(Only)S 171 x +(rotations)S 170 x(of)S 170 x(180)S 170 x(degrees)S 598 y 4796 X +(are)S 173 x(allowed)S 173 x(which)S 174 x(is)S 173 x(why)S 173 x +(the)S 174 x(function)S 174 x(is)S 173 x(named)S 174 x(Mirror)S -36 x +(.)S 264 x(This)S 173 x(is)S 173 x(in)S 174 x(keeping)S 175 x(with)S +173 x(the)S 173 x(package)S 598 y 4796 X(supporting)S 166 x(only)S +167 x(2d)S 166 x(image)S 166 x(data)S 166 x(\(no)S 166 x +(perspective)S 166 x(transforms)S 166 x(allowed)S 165 x(or)S 167 x +(meaningful\).)S 896 y 4796 X(SRC_iob)S 172 x(is)S 174 x(the)S 173 x +(id)S 174 x(of)S 174 x(the)S 173 x(source)S 175 x(image)S 174 x +(object.)S 265 x(DST_iob)S 173 x(is)S 173 x(the)S 174 x(id)S 174 x +(of)S 173 x(the)S 174 x(destination)S 174 x(IOB)S 172 x(\(to)S 174 x +(be)S 598 y 4796 X(created\).)S 280 x(X-mirror)S 182 x(and)S 182 x +(Y)S -56 x(-mirror)S 182 x(are)S 182 x(booleans)S 182 x(which)S 182 x +(determines)S 181 x(if)S 182 x(the)S 182 x(mirror)S 182 x(should)S +182 x(occur)S 598 y 4796 X(around)S 166 x(the)S 167 x(source)S 166 x +(IOB')S -20 x(s)S 166 x(x,)S 167 x(y)S -55 x(,)S 167 x(or)S 166 x(x)S +166 x(&)S 166 x(y)S 167 x(axes.)S 896 y 4796 X(XIEP_MIRR)S -2 x(OR)S +171 x(operates)S 172 x(on)S 173 x(the)S 172 x(complete)S 172 x +(input)S 172 x(image)S 172 x(to)S 172 x(produce)S 173 x(the)S 172 x +(mirrored)S 172 x(output)S 173 x(image.)S 598 y 4796 X(Those)S 181 x +(attempting)S 181 x(to)S 181 x(mirror)S 182 x(a)S 181 x(portion)S +182 x(of)S 181 x(a)S 181 x(source)S 182 x(image)S 182 x(should)S +181 x(use)S 182 x(crop)S 181 x(to)S 181 x(extract)S 182 x(the)S 181 x +(sub)S 598 y 4796 X(image)S 166 x(into)S 166 x(a)S 166 x(new)S 166 x +(IOB,)S 165 x(and)S 167 x(then)S 166 x(mirror)S 167 x(it.)S 896 y +4796 X(The)S 168 x(server)S 168 x(creates)S 167 x(a)S 168 x(new)S +167 x(IOB)S 167 x(to)S 167 x(receive)S 169 x(the)S 167 x(mirrored)S +168 x(image)S 168 x(data)S 167 x(and)S 168 x(attributes,)S 168 x +(and)S 168 x(uses)S 167 x(the)S 598 y 4796 X(client)S 166 x +(speci\211ed)S 166 x(dst_iob)S 165 x(as)S 166 x(its)S 165 x(id.)S +897 y 4796 X(Speci\211cation)S 173 x(of)S 172 x(an)S 174 x(invalid)S +173 x(source)S 173 x(IOB,)S 172 x(an)S 173 x(already)S 173 x(in)S +173 x(use)S 173 x(resource)S 174 x(id)S 172 x(for)S 173 x(the)S 173 x +(destination)S 173 x(IOB,)S 598 y 4796 X(or)S 173 x(an)S 174 x +(invalid)S 174 x(IDC)S 172 x(generates)S 174 x(an)S 174 x(IDChoice)S +173 x(error)S -36 x(.)S 264 x(Inability)S 173 x(of)S 174 x(the)S +173 x(server)S 174 x(to)S 174 x(allocate)S 173 x(a)S 173 x(new)S +174 x(IOB)S 597 y 4796 X(generates)S 166 x(an)S 166 x(ALLOC)S 166 x +(error)S -36 x(.)S 897 y 4796 X(An)S 170 x(XIE_CO)S -2 x(MPUT)S -26 x +(A)S -28 x(TION_COMPLETE)S 170 x(event)S 171 x(occurs)S 171 x(when)S +171 x(the)S 171 x(destination)S 170 x(IOB)S 170 x(is)S 170 x +(created)S 171 x(and)S 598 y 4796 X(\211lled)S 166 x(with)S 165 x +(the)S 167 x(resulting)S 166 x(mirrored)S 167 x(data.)S 35879 Y +3600 X F40(7\20346)S 449 x(REQUESTS)S 166 x(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-47 75 +1000 BP 39600 30600 PM 0 0 XY +5227 Y 3600 X F28(7.4.5)S 599 x(Radiome)S 2 x(tric)S 6323 Y 4796 X +F151(Radiometric)S 183 x(services)S 183 x(facilitate)S 183 x(the)S +184 x(adjustment)S 184 x(of)S 184 x(an)S 184 x(image)S 184 x(with)S +183 x(regards)S 184 x(to)S 183 x(the)S 184 x(luminance)S 598 y 4796 X +(and/or)S 177 x(chrominance)S 177 x(dimensions.)S 270 x(Radiometric)S +176 x(functions)S 177 x(are)S 176 x(used)S 176 x(to)S 176 x +(directly)S 177 x(affect)S 176 x(these)S 176 x(dis-)S 598 y 4796 X +(tributions)S 171 x(or)S 172 x(prepare)S 172 x(data)S 171 x(for)S +172 x(adjustment)S 172 x(through)S 173 x(the)S 172 x(use)S 172 x(of)S +171 x(other)S 172 x(point,)S 174 x(area,)S 174 x(and)S 172 x +(ensemble)S 597 y 4796 X(processing)S 166 x(services.)S 897 y 4796 X +(Radiometric)S 165 x(protocol)S 166 x(functions)S 167 x(include:)S +897 y 4796 X(\201)S 594 x(XIEP_CONSTR)S -2 x(AIN)S 166 x(-)S 166 x +(apply)S 166 x(a)S 166 x(quantization)S 166 x(model)S 747 y 4796 X +(\201)S 594 x(XIEP_MA)S -28 x(TCH_HISTOGR)S -2 x(AM)S 166 x(-)S 166 x +(transform)S 166 x(the)S 166 x(image)S 167 x(to)S 166 x(have)S 166 x +(the)S 167 x(speci\211ed)S 166 x(histogram)S 166 x(form)S 747 y +4796 X(\201)S 594 x(XIEP_CHRO)S -2 x(MINANCE_SEP)S -38 x(ARA)S -28 x +(TE)S 187 x(-)S 187 x(separate)S 186 x(a)S 187 x(poly)S 188 x +(chromatic)S 187 x(image)S 188 x(into)S 187 x(multiple)S 598 y 5692 X +(monochromatic)S 167 x(images)S 747 y 4796 X(\201)S 594 x(XIEP_CHRO)S +-2 x(MINANCE_CO)S -2 x(MBINE)S 166 x(-)S 167 x(combine)S 167 x +(multiple)S 166 x(mono)S 167 x(chromatic)S 167 x(images)S 167 x +(into)S 166 x(a)S 167 x(poly)S 598 y 5692 X(chromatic)S 167 x(image)S +747 y 4796 X(\201)S 594 x(XIEP_DITHER)S 164 x(-)S 166 x(reduce)S +167 x(number)S 167 x(of)S 166 x(quantization)S 166 x(levels)S 166 x +(through)S 168 x(an)S 166 x(area)S 166 x(technique)S 747 y 4796 X +(\201)S 594 x(XIEP_LUMINANCE)S 165 x(-)S 166 x(extract)S 166 x(the)S +166 x(luminance)S 167 x(component)S 167 x(from)S 166 x(a)S 166 x +(poly)S 166 x(chromatic)S 167 x(image)S 16335 Y 3600 X F36(7.4.5.1)S +599 x(Constrain)S 748 y 4796 X F102(XIEP_CONSTRAIN)S 747 y 6708 X +(iob_id1)S 14599 X(XIT_IOB)S 747 y 6708 X(=>)S 747 y -478 x(none)S +747 y 5752 X(service)S 240 x(class)S 239 x(value:)S 14599 X(1)S 449 y +5752 X(errors:)S 14599 X(IDChoice)S 448 y 5752 X(events:)S 14599 X +(XIE_COMPUTATION_C)S 2 x(OMPLETE)S 897 y 4796 X F151(XIEP_CO)S -2 x +(NSTRAIN)S 187 x(is)S 188 x(used)S 188 x(to)S 188 x(convert)S 189 x +(an)S 189 x(unconstrained)S 189 x(IOB)S 187 x(into)S 189 x(a)S 188 x +(constrained)S 188 x(IOB.)S 188 x(In)S 597 y 4796 X(essence,)S 175 x +(it)S 174 x(applies)S 173 x(a)S 173 x(client)S 174 x(selected)S 173 x +(quantization)S 174 x(model)S 173 x(to)S 173 x(the)S 174 x(image)S +174 x(data.)S 264 x(Application)S 173 x(of)S 174 x(the)S 598 y 4796 X +(quantization)S 167 x(model)S 167 x(may)S 168 x(involve)S 169 x +(steps)S 166 x(such)S 168 x(as)S 167 x(absolute)S 167 x(value,)S +170 x(range)S 168 x(shifting)S 168 x(and)S 168 x(scaling,)S 168 x +(hard)S 598 y 4796 X(clipping,)S 167 x(and)S 167 x(mapping)S 168 x +(to)S 166 x(a)S 167 x(\211xed)S 167 x(number)S 168 x(of)S 166 x +(quantization)S 167 x(levels.)S 251 x(While)S 167 x(it)S 166 x(is)S +166 x(possible)S 166 x(to)S 167 x(perform)S 598 y 4796 X(some)S 168 x +(of)S 169 x(these)S 169 x(functions)S 169 x(throug)S 2 x(h)S 169 x +(other)S 170 x(protocol)S 169 x(primitives,)S 170 x(XIEP_CO)S -2 x +(NSTRAIN)S 168 x(packages)S 170 x(them)S 598 y 4796 X(in)S 170 x(an)S +171 x(essential)S 170 x(way)S 170 x(which)S 171 x(support)S 171 x +(the)S 170 x(transition)S 171 x(from)S 170 x(uncon)S 2 x(strained)S +170 x(data)S 170 x(generated)S 172 x(by)S 171 x(some)S 597 y 4796 X +(server)S 165 x(functions)S 164 x(to)S 165 x(constrained)S 165 x +(data)S 164 x(that)S 164 x(can)S 165 x(move)S 165 x(towards)S 163 x +(display)S -55 x(.)S 249 x(As)S 164 x(such,)S 166 x(it)S 164 x(is)S +164 x(considered)S 165 x(a)S 598 y 4796 X(primitive)S 166 x +(function.)S 897 y 4796 X(IOB)S -2 x(_id1)S 173 x(is)S 173 x(the)S +173 x(image)S 174 x(object)S 173 x(whose)S 173 x(state)S 172 x(is)S +173 x(to)S 173 x(be)S 173 x(changed)S 174 x(from)S 173 x(uncon)S +2 x(strained)S 173 x(to)S 172 x(constrained.)S 597 y 4796 X(The)S +178 x(constraint)S 178 x(model)S 178 x(applied)S 177 x(is)S 178 x +(the)S 178 x(current)S 179 x(default)S 178 x(constraint)S 178 x +(model.)S 273 x(If)S 178 x(the)S 178 x(input)S 178 x(image)S 178 x +(is)S 598 y 4796 X(already)S 183 x(constrained,)S 189 x(and)S 183 x +(the)S 184 x(current)S 184 x(default)S 183 x(constraint)S 183 x +(model)S 183 x(is)S 183 x(the)S 184 x(same)S 182 x(as)S 183 x(the)S +184 x(one)S 183 x(last)S 598 y 4796 X(applied)S 169 x(to)S 169 x +(the)S 170 x(image,)S 172 x(then)S 170 x(the)S 170 x(function)S 170 x +(is)S 169 x(a)S 170 x(noop.)S 257 x(If)S 170 x(not,)S 171 x(the)S +170 x(current)S 170 x(default)S 170 x(constraint)S 170 x(model)S +598 y 4796 X(will)S 165 x(be)S 166 x(applied.)S 896 y 4796 X +(Constrain)S 165 x(will)S 166 x(operate)S 166 x(on)S 166 x(either)S +167 x(mono)S 166 x(chromatic)S 166 x(or)S 167 x(poly)S 166 x +(chromatic)S 167 x(images.)S 897 y 4796 X(No)S 166 x(subseting)S +166 x(by)S 166 x(IDC)S 165 x(mechanism)S 166 x(is)S 166 x(possible)S +165 x(\(the)S 166 x(entire)S 167 x(image)S 166 x(is)S 165 x +(constrained\).)S 897 y 4796 X(Speci\211cation)S 166 x(of)S 166 x +(an)S 167 x(invalid)S 166 x(source)S 167 x(IOB,)S 165 x(or)S 167 x +(an)S 166 x(already)S 167 x(in)S 166 x(use)S 166 x(resource)S 167 x +(id)S 166 x(for)S 166 x(the)S 167 x(destination)S 165 x(IOB)S 597 y +4796 X(generates)S 166 x(an)S 166 x(IDChoice)S 166 x(error)S -36 x +(.)S 35879 Y 19780 X F40(REQUESTS)S 165 x(AND)S 165 x(REPLIES)S 448 x +(7)S +(\20347)S +PP +EP +%%DOC$Page: 7-48 76 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(Client')S -20 x(s)S 190 x(which)S 190 x(request)S +191 x(noti\211cation)S 190 x(are)S 191 x(noti\211ed)S 190 x(of)S +190 x(the)S 190 x(operation')S -18 x(s)S 190 x(completion)S 190 x +(by)S 190 x(an)S 191 x(XIE_)S 598 y 4796 X(COMPUT)S -28 x(A)S -28 x +(TION_COMPLETE)S 165 x(event.)S 7257 Y 3600 X F36(7.4.5.2)S 599 x +(Histogram)S 166 x(Matching)S 9000 Y 4796 X F102 +(XIEP_MATCH_HISTOGRAM)S 748 y 6708 X(iob_id1)S 14599 X(XIT_IOB)S +448 y 6708 X(iob_id2)S 14599 X(XIT_IOB)S 448 y 6708 X(idc)S 14599 X +(XIT_IDC)S 449 y 6708 X(h_shape)S 14599 X(XIT_HSHAPE)S 448 y 6708 X +(parm1)S 14599 X(XIT_FLOAT)S 448 y 6708 X(parm2)S 14599 X(XIT_FLOAT)S +747 y 6708 X(=>)S 748 y -478 x(none)S 747 y 5752 X(service)S 240 x +(class)S 239 x(value:)S 14599 X(1)S 448 y 5752 X(errors:)S 14599 X +(IDChoice,)S 240 x(ALLOC,)S 240 x(MATCH)S 449 y 5752 X(events:)S +14599 X(XIE_COMPUTATION_C)S 2 x(OMPLETE)S 896 y 4796 X F151(XIEP_MA)S +-29 x(TCH_HISTOGRA)S -2 x(M)S 164 x(creates)S 162 x(a)S 163 x(new)S +163 x(server)S 163 x(IOB)S 162 x(from)S 163 x(an)S 163 x(existing)S +163 x(server)S 164 x(IOB)S 161 x(where)S 163 x(the)S 598 y 4796 X +(output)S 177 x(IOB)S 176 x(differs)S 176 x(from)S 177 x(the)S 177 x +(input)S 177 x(in)S 178 x(terms)S 176 x(of)S 177 x(its)S 176 x +(component)S 178 x(distribution)S 176 x(or)S 178 x(histogram.)S 271 x +(The)S 598 y 4796 X(function)S 181 x(is)S 179 x(designed)S 181 x(to)S +180 x(allow)S 180 x(the)S 180 x(client)S 181 x(to)S 180 x(specify)S +180 x(the)S 181 x(desired)S 179 x(state)S 180 x(of)S 180 x(the)S +181 x(resulting)S 180 x(image')S -18 x(s)S 597 y 4796 X(histogram)S +161 x(\(algorithm)S 162 x(description)S 162 x(of)S 161 x(resulting)S +162 x(histogram)S 162 x(shape\).)S 250 x(It)S 161 x(implements)S +161 x(operations)S 161 x(such)S 598 y 4796 X(as)S 165 x(histogram)S +166 x(equalization)S 166 x(\(\212attening\))S 167 x(and)S 166 x +(hyperbolization.)S 897 y 4796 X(IOB)S -2 x(_id1)S 176 x(is)S 175 x +(the)S 176 x(id)S 176 x(of)S 175 x(the)S 176 x(source)S 176 x(image)S +176 x(object.)S 270 x(IDC_id)S 174 x(controls)S 176 x(the)S 176 x +(subset)S 175 x(of)S 176 x(the)S 176 x(image)S 176 x(which)S 598 y +4796 X(will)S 178 x(be)S 180 x(operated)S 180 x(upon.)S 277 x +(H_shape)S 179 x(is)S 180 x(the)S 179 x(user)S 180 x(speci\211ed)S +180 x(form)S 179 x(of)S 180 x(the)S 180 x(desired)S 179 x(output)S +180 x(image)S 180 x(his-)S 597 y 4796 X(togram.)S 249 x(IOB_id2)S +162 x(is)S 163 x(the)S 163 x(client)S 164 x(speci\211ed)S 163 x(id)S +163 x(to)S 163 x(be)S 163 x(assigned)S 163 x(to)S 163 x(the)S 163 x +(newly)S 164 x(created)S 163 x(\(resulting\))S 163 x(image)S 598 y +4796 X(object.)S 269 x(Parm1)S 175 x(and)S 176 x(2)S 176 x(are)S +175 x(parameters)S 176 x(which)S 175 x(are)S 176 x(used)S 176 x(to)S +175 x(adjust)S 176 x(the)S 176 x(algorithmic)S 176 x(shapes.)S 268 x +(They)S 598 y 4796 X(will)S 165 x(be)S 166 x(speci\211ed)S 166 x(on)S +166 x(an)S 167 x(hshape)S 166 x(by)S 167 x(hshape)S 166 x(basis)S +165 x(\(tbs\).)S 897 y 4796 X(The)S 167 x(input)S 167 x(IOB)S 166 x +(must)S 166 x(be)S 167 x(constrained)S 168 x(and)S 167 x +(monochromatic.)S 252 x(Output)S 166 x(IOB')S -20 x(s)S 167 x(are)S +167 x(always)S 166 x(constrained)S 597 y 4796 X(and)S 166 x +(monochromatic.)S 897 y 4796 X(XIEP_MA)S -29 x(TCH_HISTOGRA)S -2 x +(M)S 176 x(operates)S 174 x(on)S 176 x(the)S 175 x(subset)S 174 x +(of)S 175 x(the)S 175 x(input)S 175 x(image)S 176 x(de\211ned)S 175 x +(by)S 176 x(the)S 175 x(IDC.)S 598 y 4796 X(Only)S 167 x(IDC')S -20 x +(s)S 167 x(of)S 167 x(type)S 168 x(ROI)S 166 x(are)S 167 x +(supported.)S 252 x(Histogram)S 167 x(matching)S 168 x(is)S 167 x +(implemented)S 167 x(on)S 167 x(the)S 168 x(server)S 168 x(side)S +597 y 4796 X(of)S 178 x(the)S 179 x(wire)S 178 x(because)S 178 x(it)S +179 x(can)S 179 x(not)S 178 x(be)S 179 x(implemented)S 178 x(by)S +179 x(a)S 178 x(simple)S 178 x(transfer)S 179 x(function.)S 275 x +(In)S 179 x(particular)S -37 x(,)S 598 y 4796 X(the)S 170 x(server)S +171 x(based)S 169 x(implementation)S 170 x(distributes)S 170 x +(fractional)S 170 x(components)S 170 x(of)S 171 x(initial)S 169 x +(luminance)S 172 x(levels)S 598 y 4796 X(to)S 172 x(destination)S +173 x(gray)S 174 x(levels)S 173 x(based)S 172 x(upon)S 174 x(random)S +173 x(or)S 173 x(average)S 174 x(neigh)S 2 x(borhood)S 173 x(gray)S +174 x(level)S 173 x(techniques)S 598 y 4796 X(\(pick)S 166 x(one\).)S +896 y 4796 X(Speci\211cation)S 173 x(of)S 172 x(an)S 174 x(invalid)S +173 x(source)S 173 x(IOB,)S 172 x(an)S 173 x(already)S 173 x(in)S +173 x(use)S 173 x(resource)S 174 x(id)S 172 x(for)S 173 x(the)S 173 x +(destination)S 173 x(IOB,)S 598 y 4796 X(or)S 173 x(an)S 174 x +(invalid)S 174 x(IDC)S 172 x(generates)S 174 x(an)S 174 x(IDChoice)S +173 x(error)S -36 x(.)S 264 x(Inability)S 173 x(of)S 174 x(the)S +173 x(server)S 174 x(to)S 174 x(allocate)S 173 x(a)S 173 x(new)S +174 x(IOB)S 598 y 4796 X(generates)S 169 x(an)S 169 x(ALLOC)S 169 x +(error)S -37 x(.)S 256 x(Speci\211cation)S 169 x(of)S 169 x(an)S +169 x(uncon)S 2 x(strained)S 168 x(or)S 170 x(polychromatic)S 169 x +(IOB)S 168 x(generates)S 598 y 4796 X(a)S 166 x(MA)S -28 x(TCH)S +166 x(error)S -36 x(.)S 896 y 4796 X(Client')S -20 x(s)S 190 x +(which)S 190 x(request)S 191 x(noti\211cation)S 190 x(are)S 191 x +(noti\211ed)S 190 x(of)S 190 x(the)S 190 x(operation')S -18 x(s)S +190 x(completion)S 190 x(by)S 190 x(an)S 191 x(XIE_)S 598 y 4796 X +(COMPUT)S -28 x(A)S -28 x(TION_COMPLETE)S 165 x(event.)S 35879 Y +3600 X F40(7\20348)S 449 x(REQUESTS)S 166 x(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-49 77 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 3600 X F36(7.4.5.3)S 599 x(Separate)S 166 x(Spectral)S 167 x +(Components)S 747 y 4796 X F102(XIEP_CHROMINANCE_SEP)S 2 x(ARATE)S +747 y 6708 X(iob_id1)S 14599 X(XIT_IOB)S 448 y 6708 X(iob_id2)S +14599 X(XIT_IOB)S 449 y 6708 X(iob_id3)S 14599 X(XIT_IOB)S 448 y +6708 X(iob_id4)S 14599 X(XIT_IOB)S 747 y 6708 X(=>)S 747 y -478 x +(none)S 748 y 5752 X(service)S 240 x(class)S 239 x(value:)S 14599 X +(1)S 448 y 5752 X(errors:)S 14599 X(IDChoice,)S 240 x(ALLOC,)S 240 x +(MATCH)S 448 y 5752 X(events:)S 14599 X(XIE_COMPUTATION_C)S 2 x +(OMPLETE)S 897 y 4796 X F151(XIEP_CHR)S -2 x(OMINANCE_S)S -2 x(EP)S +-36 x(ARA)S -29 x(TE)S 169 x(separates)S 169 x(the)S 170 x(three)S +169 x(planes)S 170 x(which)S 169 x(make)S 170 x(up)S 170 x(a)S 169 x +(three)S 170 x(plane)S 598 y 4796 X(multispectral)S 173 x(image)S +174 x(into)S 174 x(three)S 174 x(separate)S 173 x(monochromatic)S +175 x(images.)S 265 x(These)S 174 x(images)S 173 x(represent)S 174 x +(the)S 597 y 4796 X(red,)S 166 x(green,)S 168 x(and)S 166 x(blue)S +166 x(components)S 167 x(of)S 166 x(the)S 166 x(original)S 167 x +(image.)S 897 y 4796 X(IOB)S -2 x(_id1)S 170 x(is)S 169 x(the)S 170 x +(id)S 170 x(of)S 169 x(the)S 170 x(source)S 170 x(image)S 170 x +(object.)S 258 x(IOB_id2,)S 170 x(iob_id3,)S 171 x(iob_id4)S 169 x +(are)S 170 x(the)S 170 x(client)S 170 x(speci\211ed)S 598 y 4796 X +(ids)S 165 x(to)S 166 x(be)S 166 x(assigned)S 166 x(to)S 166 x(the)S +166 x(newly)S 166 x(created)S 167 x(image)S 166 x(objects.)S 896 y +4796 X(The)S 161 x(input)S 160 x(IOB)S 160 x(maybe)S 161 x +(constrained)S 161 x(or)S 160 x(uncon)S 2 x(strained.)S 249 x(The)S +161 x(output)S 161 x(IOB')S -20 x(s)S 160 x(will)S 160 x(be)S 160 x +(of)S 161 x(the)S 160 x(same)S 160 x(type)S 598 y 4796 X +(\(constrained)S 177 x(or)S 178 x(unconstrained\))S 179 x(as)S 177 x +(the)S 178 x(input.)S 272 x(The)S 179 x(input)S 178 x(image)S 177 x +(must)S 177 x(be)S 178 x(poly)S 178 x(chromatic.)S 273 x(The)S 598 y +4796 X(output)S 166 x(images)S 166 x(will)S 165 x(be)S 166 x(mono)S +166 x(chromatic.)S 897 y 4796 X(Speci\211cation)S 168 x(of)S 167 x +(an)S 168 x(invalid)S 169 x(source)S 168 x(IOB,)S 167 x(or)S 168 x +(already)S 168 x(in)S 168 x(use)S 168 x(resource)S 168 x(id')S -19 x +(s)S 168 x(for)S 167 x(the)S 168 x(destination)S 168 x(IOB')S -20 x +(s)S 597 y 4796 X(generates)S 178 x(an)S 179 x(IDC)S -2 x(hoice)S +179 x(error)S -36 x(.)S 273 x(Inability)S 178 x(of)S 178 x(the)S +179 x(server)S 178 x(to)S 178 x(allocate)S 178 x(the)S 178 x(new)S +178 x(IOB')S -20 x(s)S 178 x(generates)S 179 x(an)S 598 y 4796 X +(ALLOC)S 165 x(error)S -36 x(.)S 249 x(Speci\211cation)S 167 x(of)S +166 x(a)S 166 x(mono)S 166 x(chromatic)S 167 x(input)S 166 x(image)S +166 x(generates)S 167 x(a)S 166 x(MA)S -28 x(TCH)S 166 x(error)S +-36 x(.)S 897 y 4796 X(Client')S -20 x(s)S 190 x(which)S 190 x +(request)S 191 x(noti\211cation)S 190 x(are)S 191 x(noti\211ed)S +190 x(of)S 190 x(the)S 190 x(operation')S -18 x(s)S 190 x +(completion)S 190 x(by)S 190 x(an)S 191 x(XIE_)S 597 y 4796 X +(COMPUT)S -28 x(A)S -28 x(TION_COMPLETE)S 165 x(event.)S 21908 Y +3600 X F36(7.4.5.4)S 599 x(Combine)S 167 x(Spectral)S 167 x +(Components)S 747 y 4796 X F102(XIEP_CHROMINANCE_COM)S 2 x(BINE)S +747 y 6708 X(iob_id1)S 14599 X(XIT_IOB)S 449 y 6708 X(iob_id2)S +14599 X(XIT_IOB)S 448 y 6708 X(iob_id3)S 14599 X(XIT_IOB)S 448 y +6708 X(iob_id4)S 14599 X(XIT_IOB)S 747 y 6708 X(=>)S 748 y -478 x +(none)S 747 y 5752 X(service)S 240 x(class)S 239 x(value:)S 14599 X +(1)S 448 y 5752 X(errors:)S 14599 X(IDChoice,)S 240 x(ALLOC,)S 240 x +(MATCH)S 448 y 5752 X(events:)S 14599 X(XIE_COMPUTATION_C)S 2 x +(OMPLETE)S 897 y 4796 X F151(XIEP_CHR)S -2 x(OMINANCE_C)S -2 x +(OMBINE)S 172 x(combines)S 173 x(the)S 173 x(three)S 174 x(planes)S +172 x(which)S 174 x(make)S 173 x(up)S 173 x(a)S 173 x(three)S 174 x +(plane)S 598 y 4796 X(multispectral)S 167 x(image)S 168 x(into)S +168 x(a)S 167 x(single)S 168 x(multispectral)S 168 x(image.)S 253 x +(The)S 168 x(three)S 169 x(component)S 168 x(images)S 168 x +(represent)S 598 y 4796 X(the)S 166 x(red,)S 166 x(green)S 2 x(,)S +166 x(and)S 166 x(blue)S 167 x(components)S 166 x(components)S 166 x +(of)S 166 x(the)S 166 x(image.)S 896 y 4796 X(IOB)S -2 x(_id1,)S +183 x(iob_id2,)S 182 x(and)S 178 x(iob_id3)S 179 x(represent)S 179 x +(the)S 178 x(three)S 179 x(color)S 179 x(planes)S 179 x(which)S 179 x +(are)S 179 x(to)S 178 x(be)S 179 x(combined)S 179 x(to)S 598 y 4796 X +(form)S 165 x(the)S 166 x(composite)S 165 x(output)S 166 x +(multispectral)S 166 x(image.)S 249 x(IOB_id4)S 165 x(is)S 165 x +(the)S 166 x(client)S 166 x(speci\211ed)S 166 x(id)S 166 x(of)S 165 x +(the)S 166 x(output)S 598 y 4796 X(multispectral)S 165 x(image)S +166 x(object.)S 35879 Y 19780 X F40(REQUESTS)S 165 x(AND)S 165 x +(REPLIES)S 448 x(7\20349)S +PP +EP +%%DOC$Page: 7-50 78 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(All)S 167 x(input)S 168 x(IOB')S -20 x(s)S 168 x +(must)S 167 x(be)S 168 x(of)S 168 x(the)S 168 x(same)S 168 x(type)S +168 x(\(constrained)S 168 x(or)S 168 x(uncon)S 2 x(strained\).)S +253 x(The)S 168 x(output)S 168 x(IOB)S 167 x(will)S 598 y 4796 X(be)S +166 x(of)S 167 x(the)S 166 x(same)S 166 x(type.)S 251 x(All)S 166 x +(input)S 167 x(images)S 167 x(must)S 166 x(be)S 166 x(mono)S 167 x +(chromatic.)S 251 x(The)S 167 x(output)S 167 x(image)S 167 x(will)S +166 x(be)S 166 x(poly)S 597 y 4796 X(chromatic.)S 897 y 4796 X +(Speci\211cation)S 181 x(of)S 181 x(an)S 181 x(invalid)S 182 x +(source)S 181 x(IOB,)S 181 x(or)S 181 x(an)S 181 x(already)S 182 x +(in)S 181 x(use)S 181 x(resource)S 182 x(id)S 180 x(for)S 182 x(the)S +181 x(destination)S 598 y 4796 X(IOB)S 172 x(generates)S 174 x(an)S +174 x(IDChoice)S 173 x(error)S -36 x(.)S 264 x(Inability)S 174 x(of)S +173 x(the)S 174 x(server)S 174 x(to)S 173 x(allocate)S 174 x(a)S +173 x(new)S 174 x(IOB)S 172 x(generates)S 174 x(an)S 598 y 4796 X +(ALLOC)S 166 x(error)S -36 x(.)S 253 x(If)S 167 x(input)S 168 x +(IOB')S -20 x(s)S 167 x(are)S 168 x(of)S 168 x(different)S 167 x +(types)S 168 x(\(constrained)S 168 x(and)S 168 x(unconstrained\),)S +169 x(or)S 168 x(are)S 168 x(not)S 597 y 4796 X(all)S 165 x(mono)S +167 x(chromatic,)S 167 x(a)S 166 x(MA)S -28 x(TCH)S 166 x(error)S +167 x(occurs.)S 897 y 4796 X(Client')S -20 x(s)S 190 x(which)S 190 x +(request)S 191 x(noti\211cation)S 190 x(are)S 191 x(noti\211ed)S +190 x(of)S 190 x(the)S 190 x(operation')S -18 x(s)S 190 x +(completion)S 190 x(by)S 190 x(an)S 191 x(XIE_)S 598 y 4796 X +(COMPUT)S -28 x(A)S -28 x(TION_COMPLETE)S 165 x(event.)S 12039 Y +3600 X F36(7.4.5.5)S 599 x(Dither)S 747 y 4796 X F102(XIEP_DITHER)S +747 y -717 x(iob_id1)S 14599 X(XIT_IOB)S 449 y 6708 X(iob_id2)S +14599 X(XIT_IOB)S 448 y 6708 X(levels)S 14599 X(LISTofCARD32)S 747 y +6708 X(=>)S 748 y -478 x(none)S 747 y 5752 X(service)S 240 x(class)S +239 x(value:)S 14599 X(1)S 448 y 5752 X(errors:)S 14599 X(IDChoice,)S +240 x(ALLOC,)S 240 x(VALUE,)S 239 x(MATCH)S 448 y 5752 X(events:)S +14599 X(XIE_COMPUTATION_C)S 2 x(OMPLETE)S 897 y 4796 X F151(XIEP_D)S +-2 x(ITHER)S 174 x(is)S 174 x(used)S 175 x(to)S 174 x(reduce)S 176 x +(the)S 174 x(number)S 176 x(of)S 174 x(quantization)S 175 x(levels.)S +267 x(Dithering)S 175 x(accomplishes)S 598 y 4796 X(this)S 186 x(by)S +188 x(affecting)S 187 x(adjacent)S 188 x(pixels)S 187 x(\(area)S +187 x(affect\))S 187 x(to)S 187 x(make)S 187 x(up)S 188 x(for)S 187 x +(lack)S 188 x(of)S 187 x(depth)S 187 x(resolution.)S 292 x(In)S 598 y +4796 X(essence,)S 172 x(it)S 170 x(spreads)S 170 x(out)S 170 x(the)S +171 x(value)S 171 x(of)S 171 x(a)S 170 x(pixel)S 171 x(into)S 171 x +(the)S 170 x(surroun)S 2 x(ding)S 171 x(area)S 170 x(so)S 171 x +(that)S 170 x(the)S 171 x(visual)S 171 x(affect)S 597 y 4796 X(of)S +165 x(multiple)S 166 x(levels)S 166 x(is)S 166 x(preserved.)S 897 y +4796 X(IOB)S -2 x(_id1)S 172 x(is)S 172 x(the)S 172 x(id)S 172 x(of)S +172 x(the)S 173 x(source)S 172 x(image)S 173 x(object.)S 262 x +(IOB_id2)S 171 x(is)S 172 x(the)S 172 x(client)S 172 x(speci\211ed)S +172 x(id)S 172 x(to)S 172 x(be)S 173 x(assigned)S 598 y 4796 X(to)S +170 x(the)S 171 x(newly)S 171 x(created)S 171 x(\(resulting\))S 172 x +(image)S 171 x(object.)S 259 x(Levels)S 172 x(is)S 170 x(the)S 171 x +(number)S 172 x(of)S 171 x(levels)S 170 x(\(on)S 172 x(a)S 170 x +(component)S 597 y 4796 X(by)S 166 x(component)S 167 x(basis\))S +165 x(the)S 166 x(source)S 166 x(image)S 167 x(should)S 166 x(be)S +166 x(dithered)S 166 x(down)S 166 x(to.)S 897 y 4796 X(The)S 166 x +(input)S 167 x(IOB)S 165 x(must)S 165 x(be)S 166 x(constrained.)S +250 x(The)S 167 x(output)S 166 x(IOB)S 165 x(will)S 165 x(be)S 166 x +(constrained.)S 897 y 4796 X(Note)S 174 x(that)S 175 x(because)S +175 x(dithering)S 176 x("spreads)S 174 x(out")S 175 x(the)S 175 x +(value)S 176 x(of)S 175 x(a)S 175 x(pixel)S 175 x(into)S 175 x(the)S +175 x(surroun)S 2 x(ding)S 175 x(areas)S 175 x(in)S 597 y 4796 X +(order)S 177 x(to)S 178 x("fool)S 177 x(the)S 177 x(eye")S 178 x +(into)S 178 x(perceiving)S 179 x(more)S 177 x(shades)S 177 x(of)S +177 x(gray)S 179 x(or)S 178 x(colors)S 177 x(than)S 178 x(are)S 177 x +(actually)S 178 x(being)S 598 y 4796 X(used,)S 165 x(it)S 164 x +(generates)S 164 x(an)S 165 x(image)S 165 x(which)S 164 x(may)S 165 x +(be)S 164 x(unsuitable)S 165 x(for)S 164 x(further)S 165 x(display)S +164 x(processing.)S 250 x(While)S 164 x(the)S 598 y 4796 X(IOB)S +170 x(generated)S 172 x(can)S 172 x(be)S 172 x(operated)S 171 x +(upon)S 173 x(by)S 172 x(other)S 171 x(XIE)S 171 x(functions,)S 174 x +(the)S 172 x(results)S 171 x(may)S 171 x(prove)S 173 x(less)S 170 x +(than)S 598 y 4796 X(meaningful.)S 250 x(As)S 166 x(such,)S 167 x +(dither)S 166 x(is)S 165 x(often)S 167 x(one)S 166 x(of)S 166 x(the)S +166 x(last)S 166 x(steps)S 165 x(before)S 166 x(display)S -56 x(.)S +896 y 4796 X(Speci\211cation)S 181 x(of)S 181 x(an)S 181 x(invalid)S +182 x(source)S 181 x(IOB,)S 181 x(or)S 181 x(an)S 181 x(already)S +182 x(in)S 181 x(use)S 181 x(resource)S 182 x(id)S 180 x(for)S 182 x +(the)S 181 x(destination)S 598 y 4796 X(IOB)S 172 x(generates)S 174 x +(an)S 174 x(IDChoice)S 173 x(error)S -36 x(.)S 264 x(Inability)S +174 x(of)S 173 x(the)S 174 x(server)S 174 x(to)S 173 x(allocate)S +174 x(a)S 173 x(new)S 174 x(IOB)S 172 x(generates)S 174 x(an)S 598 y +4796 X(ALLOC)S 180 x(error)S -36 x(.)S 281 x(If)S 181 x(levels)S +182 x(is)S 181 x(greater)S 182 x(than)S 182 x(or)S 182 x(equal)S +182 x(to)S 181 x(the)S 182 x(current)S 182 x(quantized)S 182 x +(state)S 181 x(of)S 181 x(the)S 182 x(IOB,)S 598 y 4796 X(a)S 180 x +(V)S -56 x(ALUE)S 180 x(error)S 180 x(is)S 180 x(generated.)S 279 x +(If)S 179 x(the)S 181 x(source)S 180 x(IOB)S 179 x(is)S 180 x(not)S +180 x(of)S 180 x(type)S 180 x(constrained,)S 185 x(a)S 180 x(MA)S +-27 x(TCH)S 179 x(error)S 597 y 4796 X(occurs.)S 897 y 4796 X +(Client')S -20 x(s)S 190 x(which)S 190 x(request)S 191 x +(noti\211cation)S 190 x(are)S 191 x(noti\211ed)S 190 x(of)S 190 x +(the)S 190 x(operation')S -18 x(s)S 190 x(completion)S 190 x(by)S +190 x(an)S 191 x(XIE_)S 598 y 4796 X(COMPUT)S -28 x(A)S -28 x +(TION_COMPLETE)S 165 x(event.)S 35879 Y 3600 X F40(7\20350)S 449 x +(REQUESTS)S 166 x(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-51 79 +1000 BP 39600 30600 PM 0 0 XY +5155 Y 3600 X F36(7.4.5.6)S 599 x(Luminan)S 2 x(ce)S 747 y 4796 X +F102(XIEP_LUMINANCE)S 748 y 6708 X(iob_id1)S 14599 X(XIT_IOB)S 448 y +6708 X(iob_id2)S 14599 X(XIT_IOB)S 747 y 6708 X(=>)S 747 y -478 x +(none)S 747 y 5752 X(service)S 240 x(class)S 239 x(value:)S 14599 X +(1)S 449 y 5752 X(errors:)S 14599 X(IDChoice,)S 240 x(ALLOC,)S 240 x +(MATCH)S 448 y 5752 X(events:)S 14599 X(XIE_COMPUTATION_C)S 2 x +(OMPLETE)S 897 y 4796 X F151(XIEP_LUMINANC)S -2 x(E)S 166 x(is)S +165 x(used)S 166 x(to)S 166 x(extract)S 166 x(or)S 167 x(derive)S +166 x(the)S 166 x(luminance)S 167 x(component)S 167 x(of)S 165 x(a)S +166 x(color)S 167 x(\(polychro-)S 598 y 4796 X(matic\))S 168 x +(image.)S 255 x(This)S 169 x(function)S 170 x(is)S 168 x +(considerably)S 169 x(different)S 169 x(than)S 169 x(the)S 169 x +(separate)S 169 x(spectral)S 168 x(component)S 169 x(as)S 597 y +4796 X(the)S 173 x(luminance)S 175 x(of)S 173 x(a)S 174 x(color)S +174 x(image)S 173 x(is)S 174 x(derived)S 174 x(from)S 173 x(the)S +174 x(color)S 174 x(image)S 174 x(by)S 174 x(either)S 173 x(a)S 174 x +(color)S 174 x(space)S 173 x(trans-)S 598 y 4796 X(form)S 174 x +(\(such)S 174 x(as)S 174 x(to)S 174 x(LUV\))S 174 x(or)S 175 x(by)S +174 x(algorithmic)S 175 x(combination)S 175 x(of)S 174 x(the)S 174 x +(spectral)S 174 x(components)S 175 x(\(RGB)S -2 x(\),)S 175 x(and)S +598 y 4796 X(not)S 166 x(simply)S 165 x(by)S 167 x(taking)S 167 x +(one)S 166 x(of)S 166 x(the)S 167 x(spectral)S 165 x(components)S +167 x(\(such)S 166 x(as)S 166 x(R\).)S 896 y 4796 X(IOB)S -2 x(_id1)S +173 x(is)S 173 x(the)S 173 x(id)S 173 x(of)S 173 x(the)S 173 x +(source)S 174 x(polychromatic)S 174 x(image)S 173 x(object.)S 264 x +(IOB_id2)S 172 x(is)S 172 x(the)S 173 x(client)S 174 x(speci\211ed)S +173 x(id)S 598 y 4796 X(to)S 165 x(be)S 166 x(assigned)S 166 x(to)S +166 x(the)S 167 x(newly)S 166 x(created)S 166 x(\(resulting\))S 167 x +(monochromatic)S 166 x(luminance)S 167 x(image)S 167 x(object.)S +897 y 4796 X(The)S 160 x(input)S 160 x(IOB)S 158 x(must)S 159 x(be)S +160 x(both)S 160 x(polychromatic)S 160 x(and)S 160 x(constrained.)S +250 x(The)S 160 x(output)S 160 x(is)S 159 x(monochromatic)S 160 x +(and)S 598 y 4796 X(constrained.)S 896 y 4796 X(Speci\211cation)S +181 x(of)S 181 x(an)S 181 x(invalid)S 182 x(source)S 181 x(IOB,)S +181 x(or)S 181 x(an)S 181 x(already)S 182 x(in)S 181 x(use)S 181 x +(resource)S 182 x(id)S 180 x(for)S 182 x(the)S 181 x(destination)S +598 y 4796 X(IOB)S 172 x(generates)S 174 x(an)S 174 x(IDChoice)S +173 x(error)S -36 x(.)S 264 x(Inability)S 174 x(of)S 173 x(the)S +174 x(server)S 174 x(to)S 173 x(allocate)S 174 x(a)S 173 x(new)S +174 x(IOB)S 172 x(generates)S 174 x(an)S 598 y 4796 X(ALLOC)S 167 x +(error)S -37 x(.)S 253 x(If)S 168 x(the)S 167 x(source)S 169 x(IOB)S +166 x(is)S 168 x(not)S 167 x(polychr)S 2 x(omatic)S 167 x(and)S 168 x +(of)S 168 x(type)S 168 x(constrained,)S 169 x(a)S 167 x(MA)S -27 x +(TCH)S 167 x(error)S 597 y 4796 X(occurs.)S 897 y 4796 X(Client')S +-20 x(s)S 190 x(which)S 190 x(request)S 191 x(noti\211cation)S 190 x +(are)S 191 x(noti\211ed)S 190 x(of)S 190 x(the)S 190 x(operation')S +-18 x(s)S 190 x(completion)S 190 x(by)S 190 x(an)S 191 x(XIE_)S 598 y +4796 X(COMPUT)S -28 x(A)S -28 x(TION_COMPLETE)S 165 x(event.)S 35879 Y +19780 X F40(REQUESTS)S 165 x(AND)S 165 x(REPLIES)S 448 x(7\20351)S +PP +EP +%%DOC$Page: 7-52 80 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(7.5)S 599 x(Statistics)S 167 x(Services)S 6838 Y +4796 X F151(Statis)S -2 x(tical)S 178 x(functions)S 178 x(allow)S +178 x(the)S 178 x(client)S 178 x(to)S 178 x(ask)S 178 x(the)S 178 x +(server)S 178 x(to)S 178 x(determine)S 178 x(certain)S 179 x(statis)S +-2 x(tics)S 178 x(for)S 178 x(an)S 598 y 4796 X(IOB)S -2 x(.)S 183 x +(Statis)S -2 x(tical)S 182 x(functions)S 182 x(do)S 182 x(not)S 181 x +(affect)S 182 x(the)S 182 x(contents)S 182 x(of)S 181 x(the)S 182 x +(IOB.)S 181 x(rather)S -36 x(,)S 186 x(they)S 182 x(simply)S 181 x +(report)S 597 y 4796 X(statis)S -2 x(tical)S 187 x(information)S +186 x(about)S 187 x(the)S 187 x(IOB)S 185 x(contents)S 187 x(back)S +187 x(to)S 187 x(the)S 186 x(client.)S 291 x(Statistical)S 185 x +(information)S 598 y 4796 X(includes)S 166 x(component)S 167 x +(distributions)S 165 x(\(histogram\),)S 166 x(moment)S 166 x(data,)S +167 x(and)S 166 x(local)S 166 x(area)S 166 x(data.)S 897 y 4796 X +(All)S 172 x(statis)S -2 x(tics)S 173 x(generation)S 174 x(can)S +173 x(be)S 173 x(done)S 173 x(under)S 174 x(the)S 173 x(control)S +173 x(of)S 173 x(an)S 173 x(IDC.)S 172 x(The)S 174 x(IDC)S 172 x(is)S +172 x(used)S 173 x(to)S 173 x(control)S 598 y 4796 X(the)S 166 x +(subset)S 165 x(of)S 166 x(the)S 166 x(complete)S 166 x(IOB)S 165 x +(which)S 167 x(will)S 165 x(contribute)S 167 x(to)S 165 x(the)S 167 x +(statis)S -2 x(tical)S 166 x(calculation.)S 896 y 4796 X(Statis)S +-2 x(tical)S 169 x(protocol)S 170 x(functions)S 169 x(which)S 170 x +(generate)S 170 x(either)S 170 x(statis)S -2 x(tical)S 169 x +(distributions)S 169 x(or)S 169 x(local)S 170 x(area)S 169 x(data,)S +598 y 4796 X(return)S 175 x(this)S 174 x(information)S 175 x(to)S +175 x(the)S 175 x(client.)S 267 x(Statisti)S -2 x(cal)S 175 x +(protocol)S 175 x(functions)S 175 x(which)S 175 x(calculate)S 175 x +(moments)S 598 y 4796 X(generate)S 169 x(a)S 169 x(new)S 169 x +(\(server)S 170 x(based\))S 168 x(IOB)S 168 x(which)S 169 x +(contains)S 169 x(the)S 169 x(moment)S 169 x(data.)S 255 x(This)S +169 x(allows)S 168 x(the)S 169 x(moment)S 597 y 4796 X(data)S 157 x +(to)S 158 x(be)S 158 x(queried)S 159 x(like)S 159 x(any)S 158 x +(other)S 159 x(image,)S 161 x(or)S 158 x(to)S 158 x(be)S 158 x(used)S +158 x(in)S 159 x(server)S 158 x(based)S 158 x(enhancemen)S 2 x(t)S +158 x(processing.)S 897 y 4796 X(Statis)S -2 x(tics)S 166 x +(functions)S 166 x(include:)S 897 y 4796 X(\201)S 594 x +(XIEP_CALC_HIS)S -2 x(TOGRAM)S 165 x(-)S 166 x(get)S 167 x(the)S +166 x(histogram)S 166 x(of)S 166 x(an)S 166 x(image)S 747 y 4796 X +(\201)S 594 x(XIEP_POINT_ST)S -28 x(A)S -28 x(TISTICS)S 166 x(-)S +166 x(get)S 166 x(statist)S -2 x(ics)S 166 x(of)S 166 x(an)S 166 x +(image)S 747 y 4796 X(\201)S 594 x(XIEP_AREA)S -2 x(_ST)S -27 x(A)S +-28 x(TISTICS)S 165 x(-)S 166 x(create)S 167 x(a)S 166 x(statis)S +-2 x(tical)S 166 x(image)S 17598 Y 3600 X F28(7.5.1)S 599 x +(Componen)S 2 x(t)S 166 x(Distribution)S 18544 Y 4796 X F102 +(XIEP_CALC_HISTOGRAM)S 747 y 6708 X(iob_id)S 14599 X(XIT_IOB)S 448 y +6708 X(idc_id)S 14599 X(XIT_IDC)S 449 y 6708 X(by_component)S 14599 X +(BOOL)S 747 y 6708 X(=>)S 747 y -478 x(histogram)S 14360 X +(LISTofLISTof)S 240 x(hist_entry)S 747 y 5752 X(service)S 240 x +(class)S 239 x(value:)S 14360 X(1)S 449 y 5752 X(errors:)S 14360 X +(IDChoice,)S 240 x(MATCH)S 448 y 5752 X(events:)S 14360 X(none)S +24372 Y 4796 X(where)S 239 x(hist_entry)S 240 x(is:)S 747 y 7426 X +([)S 449 y(index)S 10773 X(LISTofCARD32)S 448 y 7665 X(number)S +10773 X(XIT_FLOAT)S 448 y 7426 X(])S 897 y 4796 X F151(XIEP_CA)S +-2 x(LC_HISTOGRA)S -2 x(M)S 160 x(generates)S 160 x(a)S 160 x +(histogram)S 160 x(of)S 159 x(the)S 160 x(component)S 160 x(values)S +160 x(of)S 160 x(the)S 160 x(subset)S 159 x(of)S 159 x(the)S 598 y +4796 X(IOB)S 173 x(identi\211ed)S 174 x(by)S 175 x(the)S 175 x(IDC.)S +173 x(The)S 175 x(component)S 175 x(distribution)S 174 x(re\212ects)S +175 x(the)S 174 x(population)S 175 x(of)S 174 x(all)S 174 x +(possible)S 597 y 4796 X(component)S 184 x(states)S 183 x(for)S 184 x +(a)S 183 x(given)S 185 x(IOB)S 183 x(based)S 183 x(upon)S 185 x +(actual)S 184 x(data)S 183 x(content.)S 286 x(The)S 184 x(component)S +185 x(distri-)S 598 y 4796 X(bution)S 178 x(can)S 178 x(be)S 178 x +(determined)S 177 x(for)S 178 x(a)S 178 x(bitonal)S 178 x +(monochromatic)S 178 x(image)S 178 x(\(black)S 178 x(and)S 178 x +(white\),)S 181 x(continuous)S 598 y 4796 X(tone)S 175 x +(monochromatic)S 176 x(image)S 175 x(\(gray)S 176 x(scale\),)S 177 x +(or)S 176 x(continuous)S 176 x(tone)S 175 x(polychromatic)S 176 x +(image)S 175 x(\(color\).)S 268 x(For)S 598 y 4796 X(polychromatic)S +177 x(images,)S 179 x(the)S 176 x(component)S 177 x(distribution)S +176 x(can)S 176 x(be)S 177 x(generated)S 177 x(on)S 176 x(either)S +177 x(a)S 176 x(per)S 176 x(chann)S 2 x(el)S 597 y 4796 X +(\(spectral)S 178 x(component\))S 179 x(basis)S 177 x(\(ie.)S 275 x +(3)S 178 x(separate)S 178 x(distributions\))S 178 x(or)S 179 x(for)S +179 x(the)S 179 x(distribution)S 178 x(in)S 179 x(the)S 179 x(three)S +598 y 4796 X(space)S 165 x(\(ie.)S 250 x(1)S 166 x(combined)S 166 x +(distribution\))S 166 x(with)S 165 x(the)S 167 x(by_component)S 167 x +(switch)S 165 x(controlling)S 167 x(the)S 167 x(option.)S 897 y +4796 X(Note)S 164 x(that)S 164 x(the)S 165 x(size)S 163 x(of)S 165 x +(the)S 164 x(list)S 164 x(length)S 165 x(entry)S 166 x(\(\211rst)S +164 x(\211eld)S 164 x(in)S 165 x(the)S 165 x(list\))S 163 x(for)S +165 x(the)S 164 x(second)S 165 x(list)S 164 x(in)S 164 x(histogram)S +598 y 4796 X(is)S 185 x(CARD)S -2 x(32)S 186 x(\(rather)S 186 x +(than)S 186 x(the)S 186 x(default)S 185 x(CARD8\))S 184 x(to)S 186 x +(allow)S 185 x(for)S 186 x(the)S 186 x(potentially)S 185 x(large)S +187 x(number)S 186 x(of)S 597 y 4796 X(histogram)S 166 x(entries.)S +35879 Y 3600 X F40(7\20352)S 449 x(REQUESTS)S 166 x(AND)S 165 x +(REPLIES)S +PP +EP +%%DOC$Page: 7-53 81 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(IOB)S -2 x(_id)S 170 x(is)S 169 x(the)S 170 x(id)S +169 x(of)S 170 x(the)S 170 x(source)S 170 x(IOB.)S 169 x(IDC_id)S +168 x(is)S 169 x(the)S 170 x(id)S 170 x(of)S 169 x(the)S 170 x(IDC)S +168 x(of)S 170 x(type)S 170 x(ROI)S 168 x(or)S 170 x(CPP)S 170 x(to)S +169 x(be)S 170 x(used)S 598 y 4796 X(in)S 166 x(determining)S 167 x +(the)S 166 x(subset)S 165 x(of)S 166 x(the)S 167 x(image)S 166 x +(for)S 166 x(which)S 166 x(the)S 167 x(distribution)S 165 x(will)S +166 x(be)S 166 x(generated.)S 896 y 4796 X(The)S 166 x(input)S 167 x +(IOB)S 165 x(must)S 165 x(be)S 166 x(of)S 166 x(type)S 166 x +(constrained.)S 250 x(It)S 166 x(may)S 166 x(be)S 166 x(mono)S 167 x +(or)S 166 x(poly)S 166 x(chromatic.)S 897 y 4796 X(The)S 171 x +(function)S 172 x(returns)S 171 x(the)S 172 x(histogram)S 171 x(to)S +171 x(the)S 171 x(caller)S -37 x(.)S 259 x(The)S 172 x(histogram)S +171 x(is)S 171 x(a)S 171 x(list)S 170 x(of)S 171 x(histogram)S 171 x +(entries)S 598 y 4796 X(where)S 175 x(each)S 175 x(entry)S 176 x +(consists)S 175 x(of)S 175 x(the)S 175 x(index)S 176 x(or)S 175 x +(value)S 176 x(followed)S 175 x(by)S 175 x(the)S 175 x(number)S 176 x +(of)S 175 x(pixels)S 175 x(found)S 176 x(with)S 597 y 4796 X(that)S +166 x(index)S 168 x(or)S 167 x(value.)S 253 x(For)S 167 x(color)S +167 x(images)S 167 x(where)S 167 x(the)S 168 x(by_component)S 168 x +(request)S 167 x(dictates)S 166 x(three)S 167 x(separate)S 598 y +4796 X(distributions,)S 177 x(the)S 176 x(index)S 177 x(is)S 175 x +(a)S 176 x(single)S 176 x(value,)S 179 x(while)S 175 x(for)S 176 x +(full)S 176 x(organization)S 176 x(\(by_componen)S 2 x(t)S 175 x(=)S +175 x(false\),)S 598 y 4796 X(the)S 166 x(index)S 167 x(is)S 165 x +(a)S 166 x(list)S 165 x(of)S 166 x(three)S 167 x(values)S 166 x +(\(in)S 166 x(essence)S 166 x(the)S 167 x(color)S 166 x(three)S 167 x +(space)S 165 x(coordinates\).)S 897 y 4796 X(Non)S 174 x(existent)S +174 x(IOB)S 173 x(or)S 175 x(IDC)S 173 x(generates)S 174 x(an)S 175 x +(IDChoice)S 174 x(error)S -37 x(.)S 266 x(Speci\211cation)S 175 x +(of)S 174 x(an)S 174 x(input)S 175 x(IOB)S 173 x(of)S 174 x(type)S +597 y 4796 X(unconstrained)S 167 x(generates)S 166 x(a)S 166 x(MA)S +-27 x(TCH)S 166 x(error)S -37 x(.)S 12936 Y 3600 X F28(7.5.2)S 599 x +(Point)S 167 x(Statistics)S 13882 Y 4796 X F102(XIEP_POINT_STATS)S +747 y 5752 X(iob_id)S 9817 X(XIT_IOB)S 449 y 5752 X(x)S 9817 X +(CARD32)S 448 y 5752 X(y)S 9817 X(CARD32)S 448 y 5752 X(height)S +9817 X(CARD8)S 449 y 5752 X(width)S 9817 X(CARD8)S 747 y 5752 X(->)S +747 y -478 x(Pixel)S 9817 X(LISTofXIT_FLOAT)S 448 y 5752 X(Minimum)S +9817 X(LISTofXIT_FLOAT)S 449 y 5752 X(Maximum)S 9817 X +(LISTofXIT_FLOAT)S 448 y 5752 X(Mean)S 9817 X(LISTofXIT_FLOAT)S 448 y +5752 X(Std_dev)S 9817 X(LISTofXIT_FLOAT)S 449 y 5752 X(Variance)S +9817 X(LISTofXIT_FLOAT)S 747 y 5752 X(service)S 240 x(class)S 239 x +(value:)S 13403 X(1)S 448 y 5752 X(errors:)S 13403 X(IDChoice,)S +240 x(VALUE)S 448 y 5752 X(events:)S 13403 X(none)S 897 y 4796 X F151 +(XIEP_POI)S -2 x(NT_ST)S -27 x(A)S -27 x(TS)S 170 x(is)S 170 x +(designed)S 171 x(to)S 171 x(allow)S 170 x(a)S 170 x(client)S 171 x +(to)S 170 x(determine)S 171 x(local)S 171 x(area)S 170 x +(statistical)S 169 x(informa-)S 598 y 4796 X(tion)S 170 x(from)S +171 x(image)S 171 x(data)S 170 x(at)S 170 x(and)S 171 x(surroundin)S +2 x(g)S 171 x(a)S 170 x(speci\211ed)S 171 x(pixel)S 171 x(within)S +170 x(an)S 171 x(IOB.)S 171 x(This)S 170 x(information)S 171 x(is)S +598 y 4796 X(returned)S 166 x(by)S 167 x(the)S 166 x(function)S 167 x +(to)S 166 x(the)S 166 x(client.)S 896 y 4796 X(Iob_id)S 169 x(is)S +169 x(the)S 169 x(id)S 170 x(of)S 169 x(the)S 170 x(source)S 170 x +(IOB,)S 169 x(x)S 170 x(and)S 169 x(y)S 170 x(locate)S 170 x(the)S +169 x(pixel)S 170 x(in)S 170 x(question)S 170 x(within)S 169 x(the)S +170 x(IOB.)S 169 x(Height)S 598 y 4796 X(and)S 171 x(width)S 171 x +(determines)S 172 x(the)S 172 x(size)S 170 x(of)S 172 x(a)S 171 x +(rectangu)S 2 x(lar)S 171 x(area)S 172 x(around)S 172 x(the)S 172 x +(pixel)S 172 x(to)S 171 x(use)S 172 x(in)S 172 x(the)S 172 x(statis)S +-2 x(tical)S 598 y 4796 X(calculations.)S 896 y 4796 X(The)S 168 x +(function)S 169 x(returns)S 169 x(the)S 168 x(following)S 169 x +(information:)S 254 x(V)S -46 x(alue)S 168 x(is)S 168 x(the)S 168 x +(value)S 169 x(of)S 168 x(the)S 169 x(pixel)S 168 x(at)S 168 x(the)S +168 x(speci\211ed)S 598 y 4796 X(location,)S 173 x(minimum)S 172 x +(is)S 171 x(the)S 171 x(minimum)S 172 x(pixel)S 172 x(value)S 172 x +(in)S 172 x(this)S 171 x(area,)S 174 x(maximum)S 171 x(is)S 171 x +(the)S 172 x(maximum)S 172 x(pixel)S 598 y 4796 X(value)S 155 x(in)S +156 x(the)S 155 x(area,)S 158 x(mean)S 155 x(is)S 155 x(the)S 155 x +(mean)S 156 x(pixel)S 155 x(value)S 156 x(for)S 155 x(this)S 155 x +(area,)S 158 x(std_dev)S 155 x(is)S 155 x(the)S 155 x(standard)S +155 x(deviation)S 598 y 4796 X(of)S 168 x(the)S 168 x(pixel)S 169 x +(distribution)S 168 x(for)S 168 x(this)S 168 x(area,)S 170 x(and)S +168 x(variance)S 170 x(is)S 167 x(the)S 169 x(variance)S 169 x(of)S +168 x(the)S 169 x(pixel)S 168 x(distribution)S 169 x(for)S 597 y +4796 X(this)S 165 x(area.)S 897 y 4796 X(The)S 186 x(input)S 185 x +(IOB)S 185 x(may)S 185 x(be)S 186 x(either)S 185 x(constrained)S +186 x(or)S 186 x(unconstrained,)S 192 x(and)S 185 x(mono)S 186 x(or)S +186 x(poly)S 185 x(chromatic.)S 598 y 4796 X(The)S 177 x(resulting)S +177 x(data)S 176 x(is)S 176 x(always)S 176 x(in)S 176 x(\212oat)S +177 x(format)S 176 x(in)S 177 x(order)S 177 x(to)S 176 x(handle)S +177 x(the)S 176 x(uncon)S 2 x(strained)S 176 x(IOB)S 175 x(case.)S +598 y 4796 X(Each)S 175 x(return)S 176 x(item)S 175 x(has)S 176 x +(an)S 175 x(entry)S 176 x(for)S 176 x(each)S 176 x(spectral)S 175 x +(component.)S 269 x(W)S -19 x(ire)S 175 x(transport)S 175 x(formats)S +175 x(\(Band_)S 597 y 4796 X(Interleaved_by_Pixel,)S 168 x(...\))S +250 x(do)S 166 x(not)S 166 x(apply)S -55 x(.)S 897 y 4796 X +(Speci\211cation)S 163 x(of)S 162 x(a)S 163 x(non)S 163 x(existent)S +163 x(IOB)S 161 x(generates)S 163 x(an)S 163 x(IDChoice)S 162 x +(error)S -36 x(.)S 250 x(Speci\211cation)S 163 x(of)S 162 x(out)S +163 x(of)S 162 x(range)S 164 x(x)S 598 y 4796 X(and/or)S 167 x(y)S +166 x(locations)S 166 x(generates)S 167 x(a)S 166 x(V)S -56 x(ALUE)S +165 x(error)S -36 x(.)S 35879 Y 19780 X F40(REQUESTS)S 165 x(AND)S +165 x(REPLIES)S 448 x(7\20353)S +PP +EP +%%DOC$Page: 7-54 82 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(In)S 172 x(essence,)S 174 x(XIEP_POINT_ST)S -28 x +(A)S -28 x(TS)S 172 x(is)S 172 x(a)S 172 x(degenerate)S 173 x(case)S +172 x(of)S 173 x(XIEP_AR)S -2 x(EA_ST)S -28 x(A)S -27 x(TS.)S 172 x +(It)S 172 x(differs)S 172 x(from)S 598 y 4796 X(XIEP_AR)S -2 x +(EA_ST)S -28 x(A)S -27 x(TS)S 169 x(in)S 170 x(that)S 170 x(the)S +170 x(function)S 170 x(returns)S 171 x(the)S 170 x(limited)S 169 x +(statis)S -2 x(tical)S 170 x(information)S 170 x(about)S 170 x(the)S +597 y 4796 X(area)S 163 x(surrounding)S 164 x(a)S 163 x(single)S +163 x(pixel)S 164 x(rather)S 163 x(than)S 163 x(generating)S 165 x +(a)S 163 x(new)S 163 x(server)S 163 x(IOB)S 162 x(containing)S 164 x +(statistical)S 598 y 4796 X(information)S 160 x(about)S 160 x(the)S +160 x(area)S 160 x(surroundin)S 2 x(g)S 160 x(all)S 160 x(pixels.)S +249 x(Users)S 160 x(who)S 160 x(only)S 160 x(want)S 160 x(the)S 160 x +(pixel)S 161 x(value)S 160 x(should)S 598 y 4796 X(use)S 166 x(the)S +166 x(XIEP_GE)S -2 x(T_PIXEL)S 166 x(function.)S 9050 Y 3600 X F28 +(7.5.3)S 599 x(Area)S 166 x(Statistics)S 9997 Y 4796 X F102 +(XIEP_AREA_STATS)S 747 y 5752 X(src_iob)S 9817 X(XIT_IOB)S 448 y +5752 X(dst_iob)S 9817 X(XIT_IOB)S 449 y 5752 X(idc_id)S 9817 X +(XIT_IDC)S 240 x({ROI,)S 239 x(CPP})S 448 y 5752 X(edge_size)S 9817 X +(CARD8)S 448 y 5752 X(stat_type)S 9817 X(XIT_STAT_TYPE)S 747 y 5752 X +(->)S 748 y -478 x(none)S 747 y 5752 X(service)S 240 x(class)S 239 x +(value:)S 13403 X(1)S 448 y 5752 X(errors:)S 13403 X(IDChoice,)S +240 x(ALLOC,)S 240 x(MATCH)S 448 y 5752 X(events:)S 13403 X +(XIE_COMPUTATI)S 2 x(ON_COMPLETE)S 16871 Y 4796 X F151(XIEP_AR)S +-2 x(EA_ST)S -28 x(A)S -27 x(TS)S 170 x(is)S 170 x(designed)S 171 x +(to)S 170 x(allow)S 170 x(a)S 170 x(client)S 171 x(to)S 170 x +(determine)S 171 x(statis)S -2 x(tical)S 171 x(information)S 170 x +(about)S 171 x(a)S 598 y 4796 X(subset)S 171 x(of)S 171 x(image)S +172 x(data)S 171 x(within)S 172 x(an)S 172 x(image,)S 173 x(and)S +172 x(store)S 171 x(this)S 172 x(information)S 172 x(locally)S 172 x +(within)S 171 x(a)S 172 x(new)S 171 x(server)S 598 y 4796 X(IOB)S +164 x(\(ie.)S 250 x(create)S 166 x(a)S 166 x(statisti)S -2 x(cal)S +167 x(image\).)S 896 y 4796 X(Src_iob)S 172 x(is)S 172 x(the)S 173 x +(id)S 172 x(of)S 172 x(the)S 173 x(source)S 173 x(server)S 173 x +(IOB)S 171 x(resource,)S 176 x(dst_iob)S 171 x(is)S 172 x(the)S 173 x +(id)S 172 x(of)S 173 x(the)S 172 x(destination)S 173 x(server)S 598 y +4796 X(IOB)S 176 x(resource)S 179 x(which)S 178 x(will)S 177 x +(contain)S 178 x(the)S 178 x(statisti)S -2 x(cal)S 178 x +(information,)S 182 x(idc_id)S 177 x(is)S 178 x(the)S 178 x(id)S +177 x(of)S 178 x(a)S 178 x(server)S 178 x(IDC)S 598 y 4796 X +(resource)S 170 x(of)S 170 x(type)S 170 x(ROI)S 169 x(or)S 170 x +(CPP)S -64 x(,)S 170 x(edge_size)S 170 x(is)S 169 x(the)S 170 x +(size)S 170 x(of)S 169 x(the)S 171 x(local)S 169 x(area)S 170 x +(square)S 170 x(region)S 171 x(surroun)S 2 x(ding)S 597 y 4796 X +(each)S 162 x(pixel)S 162 x(to)S 162 x(be)S 162 x(used)S 161 x(in)S +162 x(the)S 162 x(statistical)S 161 x(operation,)S 163 x(stat_type)S +161 x(is)S 162 x(the)S 162 x(type)S 162 x(of)S 162 x(statis)S -2 x +(tical)S 162 x(image)S 162 x(to)S 162 x(be)S 598 y 4796 X(generated)S +166 x({minimum,)S 167 x(maximum,)S 167 x(mean,)S 166 x(std_dev)S +-55 x(,)S 166 x(variance)S 2 x(}.)S 897 y 4796 X(The)S 179 x +(function)S 180 x(calculates)S 179 x(the)S 180 x(statist)S -2 x +(ical)S 179 x(information)S 180 x(on)S 179 x(a)S 180 x(pixel)S 179 x +(by)S 180 x(pixel)S 179 x(basis)S 178 x(based)S 179 x(upon)S 180 x +(the)S 598 y 4796 X(local)S 170 x(area)S 170 x(surrounding)S 171 x +(pixels)S 170 x(and)S 171 x(stores)S 169 x(the)S 170 x(resulting)S +171 x(information)S 170 x(in)S 170 x(the)S 170 x(new)S 170 x(IOB.)S +170 x(The)S 170 x(edge_)S 597 y 4796 X(size)S 165 x(parameter)S 166 x +(determines)S 166 x(how)S 166 x(large)S 166 x(the)S 166 x(local)S +166 x(area)S 167 x(is.)S 897 y 4796 X(The)S 156 x(input)S 156 x(IOB)S +155 x(maybe)S 156 x(either)S 157 x(constrained)S 156 x(or)S 156 x +(unconstrained.)S 251 x(The)S 156 x(output)S 156 x(IOB)S 155 x(will)S +155 x(be)S 156 x(of)S 156 x(the)S 156 x(same)S 598 y 4796 X(type)S +166 x(as)S 166 x(the)S 167 x(input)S 167 x(IOB)S 165 x +(\(constrained)S 167 x(or)S 167 x(unconstrained\).)S 251 x(The)S +167 x(input)S 167 x(may)S 167 x(only)S 167 x(be)S 167 x(mono)S 167 x +(chromatic,)S 597 y 4796 X(and)S 166 x(the)S 166 x(output)S 166 x +(will)S 166 x(be)S 166 x(mono)S 166 x(chromatic.)S 897 y 4796 X +(Speci\211cation)S 178 x(of)S 177 x(a)S 178 x(non)S 178 x(existent)S +177 x(source)S 178 x(IOB)S 177 x(or)S 178 x(a)S 177 x(resource)S +178 x(id)S 178 x(for)S 177 x(the)S 178 x(destination)S 177 x(IOB)S +177 x(which)S 178 x(is)S 598 y 4796 X(already)S 172 x(in)S 173 x +(use)S 172 x(gener)S 2 x(ates)S 171 x(an)S 173 x(IDChoice)S 172 x +(error)S -36 x(.)S 262 x(Speci\211cation)S 173 x(of)S 172 x(a)S 172 x +(non)S 173 x(existent)S 173 x(IDC)S 171 x(or)S 173 x(an)S 172 x(IDC)S +172 x(of)S 598 y 4796 X(type)S 172 x(TMP)S 173 x(\(template\))S 172 x +(generates)S 173 x(an)S 172 x(IDChoice)S 172 x(error)S -36 x(.)S +262 x(Inability)S 173 x(of)S 172 x(the)S 173 x(server)S 173 x(to)S +172 x(allocate)S 172 x(the)S 173 x(new)S 597 y 4796 X(resource)S +170 x(results)S 170 x(in)S 171 x(an)S 170 x(ALLOC)S 170 x(error)S +-37 x(.)S 258 x(Speci\211cation)S 171 x(of)S 170 x(a)S 170 x(poly)S +171 x(chromatic)S 170 x(source)S 171 x(image)S 170 x(results)S 170 x +(in)S 598 y 4796 X(a)S 166 x(MA)S -28 x(TCH)S 166 x(error)S -36 x(.)S +897 y 4796 X(An)S 170 x(XIE_CO)S -2 x(MPUT)S -26 x(A)S -28 x +(TION_COMPLETE)S 170 x(event)S 171 x(occurs)S 171 x(when)S 171 x +(the)S 171 x(destination)S 170 x(IOB)S 170 x(is)S 170 x(created)S +171 x(and)S 598 y 4796 X(\211lled)S 166 x(with)S 165 x(the)S 167 x +(resulting)S 166 x(statistical)S 165 x(data.)S 35879 Y 3600 X F40 +(7\20354)S 449 x(REQUESTS)S 166 x(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-55 83 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(7.6)S 599 x(Process)S 167 x(Control)S 166 x +(Services)S 6838 Y 4796 X F151(Process)S 183 x(Control)S 184 x +(class)S 183 x(services)S 184 x(provide)S 184 x(the)S 184 x(ability)S +184 x(to)S 184 x(de\211ne)S 184 x(and)S 184 x(apply)S 184 x +(pipelines)S 184 x(containing)S 598 y 4796 X(transport,)S 172 x +(enhancemen)S 2 x(t,)S 172 x(and)S 171 x(rendition)S 172 x +(operations.)S 259 x(In)S 171 x(addition)S 171 x(to)S 171 x(the)S +171 x(resource)S 172 x(functions)S 171 x(used)S 597 y 4796 X(to)S +165 x(create)S 167 x(and)S 166 x(query)S 167 x(pipelines,)S 166 x +(Process)S 166 x(Control)S 166 x(protocol)S 166 x(functions)S 167 x +(include:)S 897 y 4796 X(\201)S 594 x(XIEP_ADD)S -2 x(_SEGMENT)S +166 x({n})S 166 x(-)S 166 x(adds)S 165 x(a)S 166 x(processing)S 167 x +(segment)S 166 x(to)S 166 x(a)S 166 x(pipeline)S 747 y 4796 X(\201)S +594 x(XIEP_EXEC)S -2 x(UTE_PIPE)S 166 x({n})S 166 x(-)S 166 x +(begins)S 167 x(execution)S 167 x(of)S 166 x(a)S 166 x(pipeline)S +747 y 4796 X(\201)S 594 x(XIEP_KILL_PIPE)S 165 x({n})S 166 x(-)S +166 x(terminates)S 166 x(\(prematurely\))S 166 x(execu)S 2 x(tion)S +166 x(of)S 166 x(a)S 166 x(pipeline)S 11919 Y 3600 X F28(7.6.1)S +599 x(Adding)S 167 x(Segments)S 12865 Y 4796 X F102 +(XIEP_ADD_SEGMENT)S 747 y 5752 X(ipc_id)S 9817 X(XIT_IPC)S 449 y +5752 X(name)S 9817 X(LISTofSTRING8)S 448 y 5752 X(function)S 9817 X +(XIT_XIEFUNCTION)S 448 y 5752 X(parm_bindings)S 9817 X +(LISTofBINDING)S 748 y 5752 X(->)S 747 y -478 x(none)S 747 y 5752 X +(service)S 240 x(class)S 239 x(value:)S 13403 X(1)S 448 y 5752 X +(errors:)S 13403 X(IDChoice,)S 240 x(VALUE)S 449 y 5752 X(events:)S +13403 X(none)S 747 y 4796 X(where)S 747 y -717 x(BINDING)S 240 x +(is:)S 747 y 5513 X([)S 449 y(name)S 13403 X(STRING8)S 448 y 5752 X +(number)S 13403 X(CARD32)S 448 y 5513 X(])S 897 y 4796 X F151 +(XIEP_AD)S -2 x(D_SEGMENT)S 165 x(adds)S 165 x(a)S 166 x(processing)S +167 x(segment)S 166 x(to)S 166 x(the)S 166 x(end)S 167 x(of)S 166 x +(a)S 166 x(pipeline.)S 896 y 4796 X(IPC_id)S 174 x(the)S 174 x(id)S +175 x(of)S 174 x(the)S 175 x(server)S 175 x(pipeline)S 174 x +(resource)S 175 x(to)S 175 x(which)S 175 x(the)S 174 x(processing)S +175 x(segment)S 175 x(will)S 174 x(be)S 174 x(added.)S 598 y 4796 X +(Name)S 181 x(is)S 181 x(a)S 182 x(client)S 182 x(assigned)S 181 x +(name)S 182 x(for)S 182 x(this)S 181 x(segment)S 182 x(which)S 182 x +(will)S 181 x(be)S 181 x(used)S 182 x(by)S 182 x(other)S 182 x +(segments)S 182 x(in)S 598 y 4796 X(this)S 171 x(pipeline)S 172 x +(to)S 172 x(reference)S 173 x(parameters)S 172 x(from)S 172 x(this)S +171 x(segment.)S 262 x(Function)S 173 x(speci\211es)S 172 x(which)S +172 x(of)S 172 x(the)S 172 x(XIE)S 598 y 4796 X(protocol)S 173 x +(functions)S 174 x(\(that)S 173 x(are)S 173 x(allowed)S 173 x(in)S +173 x(pipelines\))S 173 x(will)S 172 x(be)S 174 x(used)S 173 x(as)S +173 x(this)S 173 x(pipeline)S 173 x(segment.)S 264 x(Note)S 598 y +4796 X(that)S 169 x(the)S 171 x(function)S 171 x(choice)S 170 x +(implicitly)S 170 x(determines)S 170 x(this)S 170 x(pipeline)S 170 x +(segment')S -18 x(s)S 169 x(i/o)S 171 x(parameter)S 170 x(types)S +170 x(and)S 597 y 4796 X(numbering.)S 897 y 4796 X(Parm_bindings)S +173 x(describe)S 173 x(where)S 174 x(this)S 172 x(segments)S 173 x +(inputs)S 173 x(will)S 173 x(come)S 173 x(from)S 173 x(and)S 173 x +(outputs)S 173 x(will)S 172 x(\212ow)S 173 x(to.)S 598 y 4796 X +(There)S 167 x(must)S 166 x(be)S 166 x(as)S 166 x(many)S 168 x +(entries)S 166 x(in)S 167 x(the)S 166 x(list)S 166 x(as)S 166 x +(their)S 167 x(are)S 167 x(parameters)S 166 x(to)S 166 x(the)S 167 x +(XIE)S 165 x(protocol)S 167 x(function)S 597 y 4796 X(which)S 166 x +(makes)S 167 x(up)S 166 x(this)S 167 x(segment.)S 250 x(W)S -19 x +(ithin)S 167 x(parm_bindings,)S 168 x(name)S 166 x(is)S 166 x(the)S +167 x(name)S 167 x(of)S 166 x(a)S 167 x(prior)S 166 x(segment)S 167 x +(in)S 598 y 4796 X(the)S 165 x(pipeline,)S 165 x(of)S 165 x(the)S +165 x(pipeline)S 165 x(itself,)S 165 x(or)S 165 x(the)S 165 x(atoms)S +164 x("CONST)S -28 x(ANT")S 164 x(or)S 165 x("NULL".)S 250 x(For)S +165 x(segment)S 165 x(inputs,)S 598 y 4796 X(if)S 171 x(the)S 172 x +(input)S 173 x(is)S 171 x(to)S 172 x(come)S 172 x(from)S 172 x(the)S +172 x(pipeline)S 172 x(global)S 172 x(inputs,)S 174 x(the)S 172 x +(pipeline)S 172 x(name)S 172 x(should)S 173 x(be)S 172 x(used)S 172 x +(and)S 598 y 4796 X(the)S 172 x(number)S 173 x(is)S 172 x(the)S 172 x +(number)S 173 x(of)S 172 x(the)S 173 x(pipeline)S 172 x(global)S +173 x(input.)S 262 x(If)S 172 x(input)S 172 x(is)S 172 x(to)S 172 x +(come)S 173 x(from)S 172 x(an)S 173 x(upstream)S 597 y 4796 X +(segment,)S 192 x(the)S 187 x(upstream)S 186 x(segment)S 187 x(name)S +186 x(should)S 187 x(be)S 187 x(used,)S 192 x(and)S 187 x(the)S 186 x +(number)S 188 x(is)S 186 x(the)S 186 x(number)S 188 x(of)S 598 y +4796 X(that)S 178 x(segments)S 178 x(output)S 179 x(parameter)S -37 x +(.)S 274 x(If)S 178 x(input)S 179 x(is)S 178 x(a)S 178 x(constant,)S +183 x(number)S 179 x(should)S 178 x(be)S 179 x(the)S 178 x(value)S +180 x(of)S 178 x(the)S 598 y 4796 X(constant.)S 259 x(For)S 171 x +(segment)S 171 x(outputs,)S 172 x(if)S 171 x(the)S 171 x(output)S +171 x(is)S 170 x(to)S 170 x(\212ow)S 171 x(from)S 171 x(the)S 171 x +(pipeline,)S 172 x(name)S 171 x(should)S 171 x(be)S 171 x(the)S 598 y +4796 X(name)S 175 x(of)S 175 x(the)S 176 x(pipeline)S 175 x(and)S +175 x(number)S 176 x(the)S 176 x(number)S 176 x(of)S 175 x(one)S +175 x(of)S 176 x(its)S 174 x(output)S 176 x(parameters.)S 267 x(If)S +175 x(the)S 175 x(output)S 597 y 4796 X(will)S 165 x(be)S 166 x +(used)S 166 x(downstream,)S 166 x(or)S 166 x(not)S 166 x(at)S 166 x +(all,)S 166 x(the)S 167 x(name)S 166 x(should)S 166 x(be)S 166 x +(set)S 166 x(to)S 165 x("NULL".)S 35879 Y 19780 X F40(REQUESTS)S +165 x(AND)S 165 x(REPLIES)S 448 x(7\20355)S +PP +EP +%%DOC$Page: 7-56 84 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(The)S 166 x(following)S 166 x(rules)S 167 x +(apply)S 166 x(to)S 166 x(pipeline)S 166 x(processing)S 166 x +(segments)S 166 x(and)S 166 x(their)S 167 x(input/output)S 167 x +(parameters:)S 897 y 4796 X(1.)S 481 x(Segments)S 166 x(can)S 167 x +(only)S 167 x(be)S 166 x(pipelinable)S 166 x(functions)S 166 x +(\(see)S 166 x(protocol)S 166 x(summary)S 166 x(appendix\).)S 747 y +4796 X(2.)S 481 x(Segments)S 166 x(are)S 166 x(added)S 166 x +(sequentially)S 167 x(\(no)S 166 x +(substitution/deletion/modi\211cation\).)S 747 y 4796 X(3.)S 481 x +(Segment)S 167 x(input/output)S 167 x(parameters)S 165 x(can)S 167 x +(only)S 167 x(be)S 166 x(bound)S 166 x(in)S 167 x(the)S 166 x +(following)S 166 x(ways:)S 747 y 5692 X(\201)S 595 x(Input)S 166 x +(Parameters:)S 747 y 6589 X(1.)S 481 x(T)S -45 x(o)S 166 x(a)S 166 x +(constant)S 166 x(speci\211ed)S 166 x(at)S 166 x(segment)S 166 x +(add)S 166 x(time.)S 748 y 6589 X(2.)S 481 x(T)S -45 x(o)S 166 x(a)S +166 x(global)S 166 x(pipeline)S 166 x(input)S 167 x(parameter)S -37 x +(.)S 747 y 6589 X(3.)S 481 x(T)S -45 x(o)S 166 x(an)S 166 x +(upstream)S 166 x(\(previously)S 167 x(added\))S 166 x(segment)S +166 x(output)S 166 x(parameter)S -37 x(.)S 747 y 5692 X(\201)S 595 x +(Output)S 166 x(Parameters:)S 747 y 6589 X(1.)S 481 x(T)S -45 x(o)S +166 x(a)S 166 x(global)S 166 x(pipeline)S 166 x(output)S 167 x +(parameter)S -37 x(.)S 747 y 6589 X(2.)S 481 x(Left)S 166 x(unbou)S +2 x(nd)S 166 x(\(see)S 166 x(below\))S 747 y 4796 X(4.)S 481 x +(Intermediate)S 166 x(pipe)S 166 x(results)S 165 x(\(iob')S -19 x(s)S +166 x(etc\))S 166 x(not)S 166 x(bound)S 167 x(to)S 166 x(a)S 166 x +(pipe)S 165 x(output)S 167 x(are)S 166 x(temporary)S 14629 Y 4796 X +(If)S 180 x(the)S 181 x(IPC_id)S 180 x(is)S 181 x(not)S 181 x(a)S +181 x(valid)S 181 x(IPC,)S 181 x(or)S 181 x(the)S 181 x(function)S +181 x(is)S 181 x(not)S 181 x(a)S 181 x(pipelinable)S 180 x(XIE)S +180 x(protocol)S 181 x(function,)S 598 y 4796 X(an)S 186 x(IDChoice)S +185 x(error)S 187 x(occurs.)S 290 x(If)S 186 x(a)S 186 x(reference)S +187 x(is)S 185 x(made)S 186 x(to)S 186 x(a)S 186 x(global)S 186 x +(pipeline)S 187 x(of)S 185 x(pipeline)S 187 x(segment)S 598 y 4796 X +(parameter)S 165 x(\(index\))S 167 x(which)S 166 x(does)S 166 x(not)S +166 x(exist,)S 167 x(a)S 166 x(V)S -56 x(ALUE)S 166 x(error)S 166 x +(occurs.)S 17319 Y 3600 X F28(7.6.2)S 599 x(Executin)S 2 x(g)S 166 x +(a)S 166 x(Pipe)S 18266 Y 4796 X F102(XIEP_EXECUTE_PIPE)S 747 y +5752 X(ipc_id)S 9817 X(XIT_IPC)S 448 y 5752 X(input_parms)S 9817 X +(LISTofparameters)S 449 y 5752 X(output_parms)S 9817 X +(LISTofparameters)S 747 y 5752 X(->)S 747 y -478 x(none)S 747 y +5752 X(service)S 240 x(class)S 239 x(value:)S 13403 X(1)S 449 y +5752 X(errors:)S 13403 X(IDChoice,)S 240 x(MATCH)S 448 y 5752 X +(events:)S 13403 X(XIE_PIPELINE_)S 2 x(COMPLETE)S 896 y 4796 X F151 +(XIEP_EX)S -2 x(ECUTE_PIPE)S 165 x(starts)S 165 x(the)S 167 x +(execution)S 167 x(of)S 166 x(a)S 166 x(pipeline.)S 897 y 4796 X +(Input)S 168 x(and)S 168 x(output)S 168 x(parameters)S 168 x(are)S +168 x(in)S 169 x(essence)S 168 x(the)S 168 x(actual)S 168 x +(parameters)S 168 x(which)S 168 x(will)S 167 x(be)S 169 x(bound)S +168 x(to)S 168 x(the)S 598 y 4796 X(formal)S 177 x(parameters)S 178 x +(of)S 178 x(the)S 178 x(pipeline)S 178 x(\(established)S 177 x(at)S +178 x(resource)S 179 x(creation)S 178 x(time)S 178 x(with)S 178 x +(resource)S 178 x(type)S 598 y 4796 X(IPC\).)S 896 y 4796 X(If)S +172 x(the)S 173 x(\211rst)S 172 x(segment)S 173 x(of)S 173 x(the)S +173 x(pipeline)S 173 x(is)S 172 x(an)S 173 x(XIEP_PUT_STREAM,)S 172 x +(the)S 173 x(pipeline)S 173 x(execution)S 174 x(will)S 172 x(be)S +598 y 4796 X(stalled)S 179 x(until)S 180 x(the)S 180 x(client)S 181 x +(executes)S 180 x(an)S 181 x(XIEP_PUT_STREAM)S 179 x(into)S 180 x +(the)S 180 x(designated)S 181 x(IOB)S -2 x(.)S 181 x(As)S 179 x +(data)S 598 y 4796 X(arrives,)S 166 x(it)S 166 x(will)S 165 x +(\212ow)S 166 x(into)S 167 x(the)S 166 x(pipeline.)S 896 y 4796 X +(If)S 185 x(the)S 185 x(IPC_id)S 185 x(does)S 185 x(not)S 186 x +(identify)S 186 x(a)S 185 x(valid)S 186 x(IPC)S 185 x(\(one)S 186 x +(which)S 186 x(exists,)S 190 x(has)S 185 x(at)S 186 x(least)S 184 x +(one)S 186 x(processing)S 598 y 4796 X(segment,)S 178 x(and)S 176 x +(is)S 175 x(not)S 175 x(in)S 176 x(state)S 175 x(running)S 2 x(\),)S +178 x(an)S 175 x(IDChoice)S 175 x(error)S 176 x(occurs.)S 269 x(If)S +175 x(any)S 176 x(parameter)S 176 x(\(input)S 175 x(or)S 598 y 4796 X +(output)S +(\))S 166 x(is)S 165 x(of)S 166 x(the)S 166 x(wrong)S 167 x(type,)S +167 x(a)S 166 x(MA)S -28 x(TCH)S 166 x(error)S 167 x(occurs.)S 35879 Y +3600 X F40(7\20356)S 449 x(REQUESTS)S 166 x(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-57 85 +1000 BP 39600 30600 PM 0 0 XY +5227 Y 3600 X F28(7.6.3)S 599 x(T)S -44 x(erminatin)S 2 x(g)S 166 x +(a)S 166 x(Pipe)S 6174 Y 4796 X F102(XIEP_KILL_PIPE)S 747 y 5752 X +(ipc_id)S 9817 X(XIT_IPC)S 747 y 5752 X(->)S 747 y -478 x(none)S +747 y 5752 X(service)S 240 x(class)S 239 x(value:)S 13403 X(1)S 449 y +5752 X(errors:)S 13403 X(IDChoice)S 448 y 5752 X(events:)S 13403 X +(XIE_PIPELINE_)S 2 x(COMPLETE)S 11254 Y 4796 X F151(XIEP_K)S -2 x +(ILL_PIPE)S 171 x(terminates)S 169 x(the)S 170 x(execution)S 172 x +(of)S 169 x(a)S 170 x(pipeline.)S 258 x(IPC_id)S 169 x(the)S 171 x +(id)S 169 x(of)S 170 x(the)S 170 x(server)S 171 x(pipeline)S 598 y +4796 X(resource)S 166 x(whose)S 166 x(execution)S 167 x(the)S 166 x +(client)S 167 x(wishes)S 165 x(to)S 166 x(terminate.)S 897 y 4796 X +(T)S -46 x(erminating)S 173 x(the)S 172 x(execution)S 173 x(of)S +173 x(a)S 172 x(pipeline)S 172 x(results)S 171 x(in)S 173 x(the)S +172 x(termination)S 172 x(of)S 172 x(execution)S 174 x(of)S 172 x +(all)S 171 x(pipeline)S 598 y 4796 X(processing)S 183 x(elements.)S +284 x(All)S 183 x(intermediate)S 183 x(data)S 183 x(and)S 183 x +(state)S 183 x(information)S 183 x(is)S 183 x(lost)S 183 x(as)S 183 x +(is)S 183 x(all)S 183 x(pipeline)S 597 y 4796 X(output.)S 897 y +4796 X(Speci\211cation)S 186 x(of)S 186 x(a)S 186 x(non)S 187 x +(existent)S 187 x(source)S 186 x(IPC)S 186 x(or)S 186 x(one)S 187 x +(which)S 187 x(is)S 185 x(not)S 187 x(currently)S 187 x(in)S 187 x +(the)S 186 x(process)S 186 x(of)S 598 y 4796 X(execution)S 167 x +(results)S 165 x(in)S 167 x(an)S 166 x(IDChoice)S 166 x(error)S -37 x +(.)S 896 y 4796 X(An)S 166 x(XIE_PIPELINE)S -2 x(_COMPLETE)S 166 x +(event)S 167 x(occurs)S 166 x(when)S 167 x(the)S 166 x(pipeline)S +166 x(is)S 165 x(terminated.)S 35879 Y 19780 X F40(REQUESTS)S 165 x +(AND)S 165 x(REPLIES)S 448 x(7\20357)S +PP +EP +%%DOC$Page: 7-58 86 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(7.7)S 599 x(Display)S 167 x(Services)S 6838 Y +4796 X F151(As)S 172 x(the)S 174 x(core)S 174 x(X)S 173 x(protocol)S +174 x(provides)S 173 x(substantial)S 173 x(machinery)S 175 x(to)S +173 x(facilitate)S 173 x(pixmaps)S 173 x(and)S 174 x(the)S 173 x(X)S +173 x(image)S 598 y 4796 X(extension)S 169 x(works)S 168 x(to)S 168 x +(produce)S 169 x(\(through)S 170 x(rendition\))S 169 x(pixmaps,)S +169 x(the)S 168 x(only)S 170 x(display)S 168 x(services)S 168 x(in)S +169 x(XIE)S 167 x(deal)S 597 y 4796 X(with)S 165 x(time)S 166 x +(sequences,)S 167 x(something)S 166 x(not)S 166 x(provided)S 167 x +(for)S 166 x(under)S 167 x(core)S 166 x(X.)S 847 y 4796 X F102 +(XIEP_DISPLAY_SEQUENC)S 2 x(E)S 747 y 6708 X(window_id)S 10295 X +(WINDOW)S 449 y 6708 X(gc_id)S 10295 X(GCONTEXT)S 448 y 6708 X +(frame_count)S 10295 X(CARD16)S 448 y 6708 X(frame_timing)S 719 x +(CARD16)S 449 y 6708 X(frame_list)S 10295 X(LISTofPIXMAP)S 448 y +6708 X(forward)S 10295 X(BOOL)S 747 y 6708 X(=>)S 747 y -478 x(none)S +748 y 5752 X(service)S 240 x(class)S 239 x(value:)S 12208 X(3)S 448 y +5752 X(errors:)S 12208 X(IDChoice,)S 240 x(VALUE)S 448 y 5752 X +(events:)S 12208 X(XIE_SEQUENCE_COMPL)S 2 x(ETE)S 897 y 4796 X F151 +(XIEP_D)S -2 x(ISPLA)S -46 x(Y_SEQUENC)S -2 x(E)S 186 x(is)S 185 x +(used)S 186 x(to)S 186 x(display)S 185 x(a)S 186 x(sequence)S 187 x +(of)S 186 x(prerendered)S 186 x(image)S 187 x(frames)S 598 y 4796 X +(which)S 182 x(are)S 183 x(stored)S 182 x(as)S 182 x(server)S 183 x +(pixmaps.)S 281 x(The)S 183 x(client)S 183 x(has)S 182 x(control)S +183 x(over)S 183 x(the)S 183 x(order)S 182 x(of)S 183 x(frames,)S +186 x(time)S 597 y 4796 X(delay)S 166 x(between)S 166 x(frame)S 166 x +(display)S -56 x(,)S 167 x(and)S 166 x(direction)S 166 x(of)S 166 x +(frame)S 166 x(sequence)S 167 x(play)S -55 x(.)S 897 y 4796 X(W)S +-19 x(indow_id)S 168 x(is)S 169 x(the)S 169 x(window)S 168 x(in)S +169 x(which)S 170 x(to)S 168 x(display)S 169 x(the)S 169 x +(sequence.)S 256 x(GC_id)S 168 x(is)S 168 x(the)S 170 x(id)S 168 x +(of)S 169 x(the)S 169 x(GC)S 168 x(used)S 169 x(in)S 598 y 4796 X +(the)S 173 x(display)S 173 x(operation.)S 264 x(Frame_count)S 174 x +(is)S 172 x(the)S 174 x(number)S 173 x(of)S 173 x(frames)S 173 x(in)S +173 x(the)S 174 x(sequence.)S 264 x(Frame_timing)S 598 y 4796 X +(controls)S 186 x(the)S 187 x(delay)S 186 x(time)S 186 x(in)S 187 x +(milliseconds)S 185 x(between)S 187 x(sequential)S 186 x(frame)S +186 x(displays.)S 290 x(Frame_list)S 186 x(is)S 597 y 4796 X(the)S +177 x(list)S 176 x(of)S 177 x(PIXMAP)S 176 x(id')S -19 x(s)S 177 x +(that)S 177 x(constitute)S 176 x(the)S 177 x(sequence)S 178 x(of)S +177 x(frames.)S 271 x(Forward)S 177 x(is)S 176 x(a)S 177 x(boolean)S +177 x(which)S 598 y 4796 X(controls)S 171 x(the)S 171 x(direction)S +171 x(of)S 171 x(play)S 172 x(of)S 171 x(the)S 171 x(sequence.)S +260 x(Note)S 171 x(that)S 171 x(the)S 172 x(size)S 170 x(of)S 171 x +(the)S 171 x(list)S 171 x(length)S 172 x(entry)S 172 x(\(\211rst)S +598 y 4796 X(\211eld)S 169 x(in)S 169 x(the)S 170 x(list\))S 168 x +(for)S 169 x(frame_list)S 168 x(is)S 169 x(CARD)S -2 x(16)S 169 x +(\(rather)S 170 x(than)S 169 x(the)S 170 x(default)S 169 x(CARD)S +-2 x(8\))S 169 x(to)S 169 x(allow)S 169 x(for)S 169 x(a)S 169 x +(long)S 598 y 4796 X(sequence)S 166 x(of)S 166 x(pixmaps.)S 896 y +4796 X(Speci\211cation)S 178 x(of)S 177 x(an)S 179 x(invalid)S 178 x +(window_id)S 177 x(or)S 178 x(an)S 178 x(invalid)S 178 x(pixmap_id)S +178 x(generates)S 178 x(an)S 178 x(IDChoice)S 178 x(error)S -37 x(.)S +598 y 4796 X(Speci\211cation)S 167 x(of)S 166 x(frame_timing)S 167 x +(which)S 167 x(is)S 166 x(less)S 166 x(than)S 167 x(that)S 167 x +(which)S 166 x(the)S 167 x(server)S 167 x(can)S 168 x(provide)S 167 x +(generates)S 167 x(a)S 598 y 4796 X(V)S -56 x(ALUE)S 165 x(error)S +-36 x(.)S 896 y 4796 X(For)S 168 x(clients)S 168 x(which)S 168 x +(have)S 169 x(requested)S 168 x(noti\211cation)S 168 x(of)S 168 x +(end)S 168 x(of)S 168 x(sequence)S 169 x(events,)S 169 x(an)S 168 x +(XIE_SEQ)S -2 x(UENCE_)S 598 y 4796 X(COMPLETE)S 165 x(event)S 167 x +(occurs)S 166 x(when)S 167 x(the)S 166 x(last)S 165 x(frame)S 166 x +(of)S 166 x(a)S 166 x(sequence)S 167 x(is)S 165 x(displayed.)S 35879 Y +3600 X F40(7\20358)S 449 x(REQUESTS)S 166 x(AND)S 165 x(REPLIES)S +PP +EP +%%DOC$Page: 7-59 87 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(7.8)S 599 x(Event)S 166 x(Services)S 6838 Y 4796 X +F151(X)S 190 x(Image)S 190 x(Extension)S 191 x(Protocol)S 191 x +(event)S 191 x(services)S 191 x(provide)S 191 x(for)S 191 x(the)S +190 x(selection)S 191 x(and)S 191 x(query)S 191 x(of)S 191 x(image)S +598 y 4796 X(extension)S 166 x(speci\211c)S 167 x(events.)S 8930 Y +3600 X F28(7.8.1)S 599 x(Select)S 167 x(Events)S 9876 Y 4796 X F102 +(XIEP_SELECT_EVENTS)S 748 y 6708 X(event_mask)S 10295 X(CARD16)S +747 y 6708 X(=>)S 747 y -478 x(none)S 747 y 5752 X(service)S 240 x +(class)S 239 x(value:)S 12208 X(0)S 449 y 5752 X(errors:)S 12208 X +(VALUE)S 448 y 5752 X(events:)S 12208 X(none)S 897 y 4796 X F151 +(XIEP_SE)S -2 x(LECT_EVENTS)S 173 x(is)S 174 x(used)S 174 x(by)S +175 x(the)S 174 x(client)S 174 x(to)S 174 x(select)S 174 x(which)S +174 x(events)S 175 x(it)S 173 x(wishes)S 174 x(to)S 173 x(be)S 175 x +(noti)S +(\211ed)S 597 y 4796 X(of.)S 249 x(Event_mask)S 166 x(is)S 166 x(a)S +166 x(bit)S 166 x(map)S 165 x(mask)S 166 x(where)S 166 x(each)S 167 x +(bit)S 166 x(corresponds)S 166 x(to)S 166 x(the)S 166 x(value)S 167 x +(of)S 166 x(an)S 166 x(event)S 167 x(code.)S 897 y 4796 X +(Speci\211cation)S 166 x(of)S 166 x(an)S 166 x(invalid)S 167 x +(event_mask)S 167 x(generates)S 166 x(a)S 166 x(V)S -55 x(ALUE)S +165 x(error)S -36 x(.)S 17647 Y 3600 X F28(7.8.2)S 599 x(Query)S +167 x(Events)S 18594 Y 4796 X F102(XIEP_QUERY_EVENTS)S 747 y 6708 X +(event_mask)S 10295 X(CARD16)S 747 y 6708 X(=>)S 747 y -478 x +(event_mask)S 10295 X(CARD16)S 748 y 5752 X(service)S 240 x(class)S +239 x(value:)S 12208 X(0)S 448 y 5752 X(errors:)S 12208 X(none)S +448 y 5752 X(events:)S 12208 X(none)S 897 y 4796 X F151(XIEP_Q)S +-2 x(UER)S -19 x(Y_EVENTS)S 183 x(is)S 183 x(used)S 184 x(by)S 184 x +(the)S 184 x(client)S 184 x(to)S 184 x(determine)S 184 x(which)S +184 x(events)S 184 x(it)S 183 x(has)S 184 x(expressed)S 598 y 4796 X +(interest)S 165 x(in)S 167 x(being)S 166 x(noti\211ed)S 167 x(of.)S +896 y 4796 X(Event_mask)S 170 x(on)S 170 x(the)S 170 x(input)S 170 x +(side)S 170 x(communicates)S 170 x(which)S 170 x(events)S 170 x(the)S +170 x(client)S 170 x(is)S 170 x(interested)S 169 x(in)S 171 x +(knowing)S 598 y 4796 X(its)S 178 x(noti\211cation)S 179 x(status,)S +182 x(while)S 179 x(on)S 179 x(the)S 179 x(destination)S 179 x +(side,)S 182 x(it)S 179 x(communicates)S 179 x(the)S 179 x(server)S +28 x(')S -19 x(s)S 178 x(record)S 180 x(of)S 598 y 4796 X(which)S +171 x(events)S 172 x(the)S 172 x(client)S 172 x(will)S 170 x(be)S +172 x(noti\211ed)S 172 x(of.)S 260 x(In)S 172 x(both)S 171 x(cases,)S +173 x(it)S 171 x(is)S 171 x(a)S 172 x(bit)S 171 x(map)S 171 x(mask)S +171 x(where)S 172 x(each)S 172 x(bit)S 598 y 4796 X(corresponds)S +166 x(to)S 166 x(the)S 166 x(value)S 167 x(of)S 166 x(an)S 166 x +(event)S 167 x(code.)S 35879 Y 19780 X F40(REQUESTS)S 165 x(AND)S +165 x(REPLIES)S 448 x(7\20359)S +PP +EP +%%DOC$Page: 8-1 88 +1000 BP 39600 30600 PM 0 0 XY +9007 Y 3600 X F24(Chapter)S 498 x(8)S 10651 Y 3600 X(EVENTS)S 13357 Y +4796 X F151(All)S 166 x(events)S 167 x(return)S 168 x(a)S 167 x +(message)S 167 x(with)S 166 x(a)S 167 x(common)S 168 x(pre\211x)S +168 x(as)S 166 x(described)S 167 x(in)S 167 x(the)S 167 x(Event)S +168 x(Protocol)S 167 x(Message)S 598 y 4796 X(Format)S 168 x +(section.)S 255 x(Included)S 170 x(in)S 169 x(this)S 168 x +(information)S 169 x(is)S 169 x(the)S 169 x(event)S 169 x(type)S +169 x(code,)S 171 x(and)S 169 x(the)S 169 x(request)S 168 x +(sequence)S 597 y 4796 X(number)S -37 x(.)S 897 y 4796 X(The)S 176 x +(following)S 175 x(sections)S 175 x(de\211ne)S 176 x(the)S 176 x +(details)S 175 x(of)S 175 x(each)S 176 x(of)S 176 x(the)S 175 x +(image)S 176 x(extension)S 176 x(events.)S 269 x(All)S 175 x(X)S +175 x(Image)S 598 y 4796 X(Extension)S 178 x(event)S 178 x(names)S +178 x(begin)S 178 x(with)S 178 x(the)S 178 x(pre\211x)S 179 x(XIE_.)S +272 x(Event)S 178 x(codes)S 178 x(are)S 178 x(de\211ned)S 178 x(in)S +178 x(the)S 178 x(protocol)S 598 y 4796 X(code)S 166 x(summary)S +166 x(appendix.)S 18039 Y 3600 X F28(8.1)S 599 x(COMPU)S -2 x(T)S +-44 x(A)S -44 x(TION)S 166 x(COMPLETE)S 19434 Y 4796 X F102 +(XIE_COMPUTATION_COMP)S 2 x(LETE)S 747 y 6230 X(src_iob)S 10534 X +(XIT_IOB)S 449 y 6230 X(dst_iob)S 10534 X(XIT_IOB)S 896 y 4796 X F151 +(An)S 178 x(XIE_CO)S -2 x(MPUT)S -26 x(A)S -28 x(TION_COMPLETE)S +177 x(event)S 180 x(occurs)S 179 x(when)S 179 x(client)S 178 x +(requested)S 179 x(process)S 178 x(protocol)S 598 y 4796 X +(functions)S 183 x(completes)S 182 x(\(see)S 183 x(protocol)S 183 x +(speci)S +(\211cations\).)S 283 x(Speci\211cally)S -54 x(,)S 187 x(it)S 183 x +(occurs)S 184 x(when)S 183 x(all)S 183 x(the)S 183 x(image)S 598 y +4796 X(data)S 185 x(that)S 186 x(makes)S 185 x(up)S 186 x(the)S 186 x +(complete)S 186 x(contents)S 186 x(of)S 186 x(the)S 186 x +(destination)S 185 x(IOB)S 185 x(which)S 186 x(results)S 185 x(from)S +186 x(the)S 598 y 4796 X(computation)S 166 x(has)S 166 x(been)S 166 x +(established)S 165 x(by)S 167 x(the)S 166 x(server)S -36 x(.)S 896 y +4796 X(The)S 166 x(event)S 167 x(information)S 166 x(includes)S 167 x +(the)S 166 x(the)S 166 x(id')S -19 x(s)S 166 x(of)S 166 x(both)S +166 x(source)S 166 x(and)S 167 x(destination)S 166 x(IOB)S -2 x(')S +-18 x(s.)S 897 y 4796 X(Only)S 166 x(clients)S 166 x(which)S 166 x +(have)S 167 x(requested)S 166 x(noti\211cation)S 167 x(of)S 166 x +(this)S 165 x(event)S 167 x(are)S 166 x(noti\211ed.)S 26508 Y 3600 X +F28(8.2)S 599 x(PIPELINE)S 165 x(COMPLETE)S 27902 Y 4796 X F102 +(XIE_PIPELINE_COMPLET)S 2 x(E)S 748 y 6230 X(ipc_id)S 10295 X +(XIT_IPC)S 896 y 4796 X F151(An)S 180 x(XIE_PIPELINE)S -2 x +(_COMPLETE)S 180 x(event)S 181 x(occurs)S 181 x(when)S 180 x(client)S +181 x(requested)S 180 x(process)S 180 x(pipeline)S 180 x(com-)S 598 y +4796 X(pletes)S 171 x(\(see)S 171 x(protocol)S 172 x +(speci\211cations\).)S 262 x(Speci\211cally)S -55 x(,)S 174 x(it)S +172 x(occurs)S 172 x(when)S 172 x(all)S 172 x(the)S 172 x(image)S +172 x(data)S 172 x(that)S 172 x(makes)S 598 y 4796 X(up)S 166 x(the)S +166 x(input)S 166 x(image\(s\))S 166 x(has)S 166 x(been)S 167 x +(processed)S 165 x(by)S 167 x(the)S 166 x(last)S 165 x(stage)S 166 x +(in)S 167 x(the)S 166 x(pipeline.)S 896 y 4796 X(The)S 166 x(event)S +167 x(information)S 166 x(includes)S 167 x(the)S 166 x(the)S 166 x +(id)S 166 x(of)S 166 x(the)S 166 x(pipeline)S 166 x(\(IPC)S 166 x +(id\).)S 897 y 4796 X(Only)S 166 x(clients)S 166 x(which)S 166 x +(have)S 167 x(requested)S 166 x(noti\211cation)S 167 x(of)S 166 x +(this)S 165 x(event)S 167 x(are)S 166 x(noti\211ed.)S 35879 Y 23923 X +F40(EVENTS)S 448 x(8\2031)S +PP +EP +%%DOC$Page: 8-2 89 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(8.3)S 599 x(SEQUE)S -2 x(NCE)S 165 x(COMPLETE)S +6987 Y 4796 X F102(XIE_SEQUENCE_COMPLET)S 2 x(E)S 897 y 4796 X F151 +(An)S 175 x(XIE_SE)S -2 x(QUENCE_CO)S -2 x(MPLETE)S 176 x(event)S +176 x(is)S 174 x(generated)S 176 x(when)S 176 x(a)S 175 x(server)S +176 x(completes)S 174 x(displaying)S 176 x(a)S 598 y 4796 X(time)S +165 x(sequence)S 167 x(of)S 166 x(image)S 166 x(frames.)S 35879 Y +3600 X F40(8\2032)S 449 x(EVENTS)S +PP +EP +%%DOC$Page: 9-1 90 +1000 BP 39600 30600 PM 0 0 XY +9007 Y 3600 X F24(Chapter)S 498 x(9)S 10651 Y 3600 X(APPENDIC)S -2 x +(ES)S 13606 Y 3600 X F28(9.1)S 599 x(XIE)S 165 x(Protocol)S 167 x +(Summary)S 14851 Y 4796 X F151(The)S 165 x(following)S 166 x(is)S +164 x(a)S 166 x(summary)S 165 x(of)S 165 x(the)S 166 x(XIE)S 164 x +(protocol)S 165 x(functions)S 166 x(categorized)S 165 x(into)S 166 x +(their)S 165 x(various)S 166 x(service)S 598 y 4796 X(classes.)S +255 x(A)S 169 x({p})S 169 x(following)S 170 x(the)S 169 x(function)S +171 x(indicates)S 169 x(that)S 169 x(it)S 169 x(can)S 170 x(be)S +169 x(used)S 170 x(as)S 169 x(a)S 169 x(pipeline)S 170 x(element,)S +171 x(while)S 598 y 4796 X(a)S 166 x({n})S 166 x(indicates)S 165 x +(that)S 166 x(it)S 166 x(can)S 167 x(not)S 166 x(be)S 166 x(used)S +166 x(as)S 165 x(a)S 166 x(pipeline)S 167 x(element.)S 249 x F152 +(Session)S 167 x(Services)S 897 y 4796 X F151(\201)S 594 x +(XIEP_INIT_SESS)S -2 x(ION)S 166 x({n})S 166 x(-)S 166 x(begins)S +166 x(a)S 166 x(client-extension)S 167 x(server)S 167 x(session)S +747 y 4796 X(\201)S 594 x(XIEP_SET_DEF)S -38 x(AUL)S -28 x(TS)S 167 x +({n})S 166 x(-)S 166 x(establis)S -2 x(h/modify)S 167 x(operational)S +167 x(defaults)S 747 y 4796 X(\201)S 594 x(XIEP_QUER)S -20 x(Y_DEF)S +-38 x(AUL)S -27 x(TS)S 166 x({n})S 166 x(-)S 166 x(query)S 167 x +(operational)S 166 x(defaults)S 747 y 4796 X(\201)S 594 x +(XIEP_TERM_SESSI)S -2 x(ON)S 166 x({n})S 166 x(-)S 166 x(ends)S 166 x +(a)S 166 x(client-extension)S 167 x(server)S 166 x(session)S 20281 Y +3600 X F152(Resource)S 167 x(Services)S 897 y 4796 X F151(\201)S +594 x(XIEP_CREA)S -29 x(TE_RESO)S -2 x(URCE)S 165 x({n})S 167 x(-)S +165 x(create)S 167 x(a)S 166 x(new)S 166 x(server)S 166 x(resource)S +167 x(object)S 747 y 4796 X(\201)S 594 x(XIEP_COPY_R)S -2 x(ESOURCE)S +164 x({n})S 167 x(-)S 165 x(copy)S 167 x(contents)S 166 x(from)S +166 x(source)S 167 x(to)S 166 x(destination)S 165 x(resource)S 747 y +4796 X(\201)S 594 x(XIEP_DELETE_R)S -2 x(ESOURCE)S 164 x({n})S 166 x +(-)S 166 x(delete)S 166 x(an)S 166 x(existing)S 167 x(server)S 167 x +(resource)S 167 x(object)S 747 y 4796 X(\201)S 594 x(XIEP_QUER)S +-20 x(Y_RESO)S -2 x(URCE)S 165 x({n})S 166 x(-)S 166 x(query)S 167 x +(an)S 167 x(existing)S 166 x(server)S 167 x(resource)S 167 x(object)S +747 y 4796 X(\201)S 594 x(XIEP_IMPORT_IMAG)S -2 x(E)S 166 x({n})S +166 x(-)S 166 x(create)S 166 x(a)S 166 x(new)S 166 x(server)S 167 x +(IOB)S 165 x(resource)S 167 x(object)S 748 y 4796 X(\201)S 594 x +(XIEP_EXPOR)S -2 x(T_IMAGE)S 166 x({p})S 165 x(-)S 166 x(create)S +166 x(a)S 166 x(new)S 166 x(server)S 167 x(PIXMAP)S 166 x(resource)S +167 x(object)S 26010 Y 3600 X F152(T)S -44 x(ransport)S 167 x +(Services)S 896 y 4796 X F151(\201)S 594 x(XIEP_SET_TRANSPOR)S -2 x +(T)S 166 x({n})S 167 x(-)S 165 x(establishes)S 165 x(the)S 167 x +(required)S 166 x(transport)S 166 x(context)S 167 x(information)S +747 y 4796 X(\201)S 594 x(XIEP_GET_TILE)S 167 x({p})S 168 x(-)S 168 x +(transports)S 167 x(random)S 168 x(tiles)S 168 x(of)S 168 x +(uncompressed)S 168 x(image)S 168 x(data)S 168 x(from)S 168 x +(server)S 168 x(to)S 598 y 5692 X(client)S 747 y 4796 X(\201)S 594 x +(XIEP_PUT_TILE)S 170 x({p})S 170 x(-)S 170 x(transports)S 170 x +(random)S 171 x(tiles)S 170 x(of)S 170 x(uncompressed)S 170 x(image)S +171 x(data)S 170 x(from)S 170 x(client)S 171 x(to)S 598 y 5692 X +(server)S 747 y 4796 X(\201)S 594 x(XIEP_GET_STRE)S -2 x(AM)S 167 x +({p})S 166 x(-)S 167 x(transports)S 166 x(a)S 166 x(stream)S 166 x +(of)S 167 x(compressed)S 166 x(or)S 167 x(uncompressed)S 167 x +(image)S 167 x(data)S 598 y 5692 X(from)S 166 x(server)S 167 x(to)S +166 x(client)S 747 y 4796 X(\201)S 594 x(XIEP_PUT_STREAM)S 166 x +({p})S 167 x(-)S 166 x(transports)S 166 x(a)S 167 x(stream)S 166 x +(of)S 167 x(compressed)S 166 x(or)S 167 x(uncompressed)S 167 x +(image)S 167 x(data)S 598 y 5692 X(from)S 166 x(client)S 166 x(to)S +166 x(server)S 33382 Y 3600 X F152(Process)S 167 x(Services)S 35879 Y +22802 X F40(APPENDIC)S -2 x(ES)S 449 x(9\2031)S +PP +EP +%%DOC$Page: 9-2 91 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(\201)S 594 x(XIEP_POINT)S 165 x({p})S 166 x(-)S +166 x(applies)S 165 x(a)S 166 x(point)S 166 x(\(lut\))S 166 x +(transform)S 166 x(to)S 166 x(an)S 166 x(image)S 747 y 4796 X(\201)S +594 x(XIEP_AREA)S 164 x({p})S 166 x(-)S 166 x(applies)S 165 x(are)S +166 x(operators)S 166 x(to)S 166 x(an)S 166 x(image)S 747 y 4796 X +(\201)S 594 x(XIEP_ARITH)S 165 x({p})S 166 x(-)S 165 x(performs)S +166 x(arithmetic)S 166 x(between)S 166 x(two)S 165 x(images)S 747 y +4796 X(\201)S 594 x(XIEP_COMP)S -38 x(ARE)S 165 x({p})S 166 x(-)S +166 x(compare)S 166 x(two)S 166 x(images)S 748 y 4796 X(\201)S 594 x +(XIEP_LOGIC)S -2 x(AL)S 166 x({p})S 166 x(-)S 166 x(operates)S 166 x +(on)S 166 x(the)S 166 x(individual)S 167 x(bit)S 166 x(planes)S 165 x +(of)S 166 x(an)S 167 x(image)S 747 y 4796 X(\201)S 594 x(XIEP_MA)S +-28 x(THF)S 167 x({p})S 165 x(-)S 166 x(applies)S 165 x +(mathematical)S 166 x(functions)S 167 x(to)S 165 x(an)S 167 x(image)S +10246 Y 4796 X(\201)S 594 x(XIEP_SCALE)S 165 x({p})S 165 x(-)S 166 x +(scale)S 166 x(image)S 166 x(in)S 167 x(x)S 166 x(and)S 166 x(y)S +167 x(directions)S 747 y 4796 X(\201)S 594 x(XIEP_ROT)S -28 x(A)S +-28 x(TE)S 166 x({p})S 165 x(-)S 166 x(rotate)S 166 x(image)S 167 x +(around)S 166 x(z)S 166 x(axis)S 747 y 4796 X(\201)S 594 x +(XIEP_MIRRO)S -2 x(R)S 166 x({p})S 166 x(-)S 166 x(rotate)S 166 x +(image)S 166 x(around)S 167 x(x)S 166 x(and/or)S 167 x(y)S 167 x +(axes)S 747 y 4796 X(\201)S 594 x(XIEP_CRO)S -2 x(P)S 167 x({p})S +165 x(-)S 166 x(extract)S 167 x(a)S 166 x(subset)S 165 x(of)S 166 x +(an)S 166 x(image)S 748 y 4796 X(\201)S 594 x(XIEP_TRANSLA)S -29 x +(TE)S 166 x({p})S 166 x(-)S 166 x(shift)S 166 x(and)S 166 x(combine)S +166 x(two)S 166 x(images)S 14580 Y 4796 X(\201)S 594 x(XIEP_CONSTR)S +-2 x(AIN)S 166 x({p})S 166 x(-)S 165 x(apply)S 167 x(a)S 166 x +(quantization)S 166 x(model)S 747 y 4796 X(\201)S 594 x(XIEP_MA)S +-28 x(TCH_HISTOGR)S -2 x(AM)S 178 x({p})S 178 x(-)S 178 x(transform)S +178 x(the)S 178 x(image)S 178 x(to)S 178 x(have)S 179 x(the)S 178 x +(speci)S +(\211ed)S 178 x(histogram)S 598 y 5692 X(form)S 747 y 4796 X(\201)S +594 x(XIEP_CHRO)S -2 x(MINANCE_SEP)S -38 x(ARA)S -28 x(TE)S 175 x +({p})S 175 x(-)S 176 x(separate)S 175 x(a)S 175 x(poly)S 176 x +(chromatic)S 176 x(image)S 175 x(into)S 176 x(multiple)S 597 y 5692 X +(monochromatic)S 167 x(images)S 748 y 4796 X(\201)S 594 x(XIEP_CHRO)S +-2 x(MINANCE_CO)S -2 x(MBINE)S 171 x({p})S 172 x(-)S 171 x(combine)S +172 x(multiple)S 171 x(mono)S 172 x(chromatic)S 172 x(images)S 172 x +(into)S 171 x(a)S 597 y 5692 X(poly)S 167 x(chromatic)S 166 x(image)S +748 y 4796 X(\201)S 594 x(XIEP_DITHER)S 164 x({p})S 166 x(-)S 166 x +(reduce)S 167 x(number)S 167 x(of)S 166 x(quantization)S 166 x +(levels)S 166 x(through)S 167 x(an)S 167 x(area)S 166 x(technique)S +747 y 4796 X(\201)S 594 x(XIEP_LUMINANCE)S 165 x({p})S 165 x(-)S +166 x(extract)S 167 x(the)S 166 x(luminance)S 167 x(component)S 167 x +(from)S 166 x(a)S 166 x(poly)S 166 x(chromatic)S 166 x(image)S 21205 Y +3600 X F152(Statistics)S 168 x(Services)S 896 y 4796 X F151(\201)S +594 x(XIEP_CALC_HIS)S -2 x(TOGRAM)S 165 x({n})S 166 x(-)S 166 x(get)S +167 x(the)S 166 x(histogram)S 166 x(of)S 166 x(an)S 166 x(image)S +748 y 4796 X(\201)S 594 x(XIEP_POINT_ST)S -28 x(A)S -28 x(TISTICS)S +166 x({n})S 166 x(-)S 166 x(get)S 166 x(statist)S -2 x(ics)S 166 x +(of)S 166 x(an)S 167 x(image)S 747 y 4796 X(\201)S 594 x(XIEP_AREA)S +-2 x(_ST)S -27 x(A)S -28 x(TISTICS)S 165 x({n})S 167 x(-)S 166 x +(create)S 166 x(a)S 166 x(statis)S -2 x(tical)S 166 x(image)S 24692 Y +3600 X F152(Process)S 167 x(Control)S 167 x(Services)S 896 y 4796 X +F151(\201)S 594 x(XIEP_ADD)S -2 x(_SEGMENT)S 166 x({n})S 166 x(-)S +166 x(adds)S 165 x(a)S 166 x(processing)S 167 x(segment)S 166 x(to)S +166 x(a)S 166 x(pipeline)S 747 y 4796 X(\201)S 594 x(XIEP_EXEC)S +-2 x(UTE_PIPE)S 166 x({n})S 166 x(-)S 166 x(begins)S 167 x +(execution)S 167 x(of)S 166 x(a)S 166 x(pipeline)S 748 y 4796 X +(\201)S 594 x(XIEP_KILL_PIPE)S 165 x({n})S 166 x(-)S 166 x +(terminates)S 166 x(\(prematurely\))S 166 x(execu)S 2 x(tion)S 166 x +(of)S 166 x(a)S 166 x(pipeline)S 28179 Y 3600 X F152(Display)S 165 x +(Services)S 896 y 4796 X F151(\201)S 594 x(XIEP_DISPLA)S -47 x +(Y_SEQUE)S -2 x(NCE)S 166 x({n})S 166 x(-)S 166 x(display)S 166 x(a)S +166 x(time)S 165 x(sequence)S 167 x(of)S 166 x(pixmaps)S 30171 Y +3600 X F152(Event)S 166 x(Services)S 897 y 4796 X F151(\201)S 594 x +(XIEP_SELECT_EV)S -2 x(ENTS)S 166 x({n})S 166 x(-)S 166 x(select)S +166 x(which)S 166 x(events)S 166 x(the)S 167 x(client)S 166 x +(wishes)S 165 x(to)S 166 x(be)S 166 x(noti\211ed)S 166 x(of)S 747 y +4796 X(\201)S 594 x(XIEP_QUER)S -20 x(Y_EVENTS)S 165 x({n})S 166 x +(-)S 166 x(query)S 167 x(which)S 166 x(events)S 167 x(the)S 166 x +(client)S 166 x(will)S 165 x(be)S 166 x(noti\211ed)S 167 x(of)S +35879 Y 3600 X F40(9\2032)S 449 x(APPENDICES)S +PP +EP +%%DOC$Page: 9-3 92 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(9.2)S 599 x(Recommen)S 2 x(ded)S 166 x(Server)S +166 x(Resource)S 167 x(Contents)S 6838 Y 4796 X F151(This)S 181 x +(section)S 182 x(describes)S 182 x(the)S 182 x(client)S 182 x(known)S +182 x(contents)S 182 x(of)S 182 x(the)S 182 x(various)S 182 x(image)S +182 x(extension)S 183 x(server)S 182 x(re-)S 598 y 4796 X(sources.)S +250 x(These)S 167 x(are)S 167 x(the)S 167 x(resource)S 167 x(object)S +167 x(\211elds)S 167 x(which)S 167 x(the)S 167 x(client)S 167 x(can)S +167 x(reference)S 167 x(in)S 167 x(various)S 168 x(resource)S 597 y +4796 X(protocol)S 167 x(operations.)S 251 x(Some)S 167 x(\211elds)S +167 x(can)S 167 x(be)S 167 x(initialized,)S 167 x(queried,)S 168 x +(and)S 167 x(modi\211ed)S 167 x(by)S 168 x(the)S 167 x(client)S 167 x +(through)S 598 y 4796 X(object)S 172 x(creation,)S 174 x(modify)S +-56 x(,)S 174 x(and)S 172 x(query)S 172 x(functions,)S 174 x(while)S +172 x(others)S 171 x(can)S 172 x(only)S 173 x(be)S 172 x +(initialized)S 170 x(and)S 172 x(queried,)S 598 y 4796 X(and)S 178 x +(still)S 177 x(others)S 178 x(can)S 178 x(only)S 179 x(be)S 178 x +(queried.)S 274 x(This)S 178 x(last)S 177 x(class)S 178 x(of)S 178 x +(\211elds)S 177 x(are)S 179 x(initialized)S 177 x(and)S 178 x +(maintained)S 598 y 4796 X(solely)S 166 x(by)S 166 x(the)S 166 x +(server)S -36 x(,)S 167 x(and)S 166 x(are)S 166 x(in)S 166 x +(essence)S 166 x(read-only)S 167 x(for)S 166 x(the)S 167 x(client)S +896 y 4796 X(A)S 167 x(table)S 167 x(within)S 167 x(each)S 169 x +(subsection)S 167 x(de\211nes)S 168 x(the)S 168 x(\211eld)S 168 x +(identi\211er)S -37 x(,)S 169 x(allowable)S 167 x(forms)S 167 x(of)S +167 x(access,)S 168 x(and)S 168 x(value)S 598 y 4796 X(binding.)S +252 x(Particulars)S 167 x(regarding)S 169 x(image)S 167 x(data)S +167 x(object)S 168 x(\211elds)S 167 x(can)S 167 x(be)S 167 x(found)S +168 x(in)S 167 x(the)S 168 x(appendix)S 167 x(on)S 168 x(image)S +598 y 4796 X(data)S 163 x(attributes)S 164 x(and)S 165 x +(organization.)S 250 x(Details)S 163 x(of)S 164 x(other)S 165 x +(resources)S 165 x(and)S 164 x(their)S 165 x(contents)S 164 x(can)S +165 x(be)S 164 x(found)S 165 x(in)S 598 y 4796 X(the)S 166 x +(resource)S 166 x(creation)S 167 x(protocol)S 166 x(functions)S 167 x +(and)S 166 x(other)S 166 x(protocol)S 167 x(functions)S 166 x(which)S +167 x(use)S 166 x(the)S 166 x(resources.)S 14011 Y 3600 X F28(9.2.1)S +599 x(IOB)S 15107 Y 4796 X F151(The)S 176 x(atomic)S 175 x(unit)S +176 x(of)S 176 x(revisable)S 176 x(form)S 175 x(image)S 176 x(data)S +176 x(residing)S 176 x(on)S 176 x(the)S 176 x(server)S 176 x(and)S +176 x(addressable)S 175 x(by)S 176 x(the)S 598 y 4796 X(client)S +168 x(is)S 168 x(the)S 168 x(image)S 168 x(object)S 169 x(or)S 168 x +(IOB.)S 168 x(An)S 168 x(IOB)S 167 x(represents)S 168 x(a)S 169 x +(single)S 168 x(revisable)S 168 x(form)S 169 x(image)S 168 x(\(one)S +169 x(which)S 597 y 4796 X(can)S 181 x(be)S 181 x(modi\211ed)S 181 x +(and)S 182 x(prepared)S 181 x(for)S 181 x(device)S 182 x(speci\211c)S +181 x(display\).)S 279 x(An)S 181 x(IOB)S 180 x(is)S 181 x(intended)S +181 x(to)S 181 x(contain)S 182 x(a)S 598 y 4796 X(single)S 179 x +(two-dimensional)S 178 x(still-frame)S 178 x(image)S 179 x(of)S 179 x +(bitonal,)S 183 x(continuou)S 2 x(s)S 178 x(tone,)S 183 x(or)S 180 x +(multispectral)S 178 x(data.)S 598 y 4796 X(IOB)S -2 x(')S -18 x(s)S +169 x(are)S 170 x(not)S 170 x(intended)S 170 x(for)S 170 x +(composite)S 170 x(image)S 170 x(collections)S 170 x(or)S 170 x +(temporal)S 169 x(image)S 170 x(sequences)S 170 x(\(multiple)S 598 y +4796 X(2d)S 172 x(frames)S 171 x(associated)S 171 x(with)S 172 x +(spatial)S 171 x(or)S 173 x(temporal)S 172 x(layout)S 172 x +(mechanisms\).)S 262 x(Multiple)S 172 x(IOB')S -20 x(s)S 172 x +(should)S 172 x(be)S 597 y 4796 X(used)S 177 x(by)S 178 x +(applications)S 176 x(to)S 178 x(build)S 177 x(composite)S 177 x +(static)S 176 x(image)S 178 x(displays)S 177 x(and)S 177 x(time)S +177 x(sequences)S 178 x(of)S 177 x(images)S 598 y 4796 X(under)S +185 x(application)S 184 x(control.)S 286 x(IOB')S -20 x(s)S 184 x +(are)S 184 x(self)S 184 x(contained:)S 287 x(no)S 184 x(nesting)S +185 x(or)S 184 x(external)S 185 x(references)S 185 x(are)S 598 y +4796 X(allowed.)S 897 y 4796 X(Each)S 173 x(image)S 174 x(object)S +174 x(\(IOB\))S 172 x(contains)S 174 x(image)S 174 x(attributes)S +173 x(and)S 174 x(the)S 173 x(image)S 174 x(data)S 173 x(itself.)S +264 x(The)S 174 x(attributes)S 597 y 4796 X(consist)S 181 x(of)S +182 x(information)S 183 x(necessary)S 182 x(to)S 182 x(interpret)S +183 x(the)S 182 x(image)S 183 x(data)S 181 x(and)S 183 x(useful)S +182 x(in)S 183 x(guiding)S 183 x(default)S 598 y 4796 X(rendition)S +160 x(and)S 159 x(presentation.)S 250 x(The)S 160 x(attributes)S +159 x(are)S 159 x(initialized)S 159 x(by)S 160 x(the)S 160 x(client)S +159 x(at)S 159 x(image)S 160 x(object)S 160 x(creation)S 598 y 4796 X +(time.)S 251 x(The)S 168 x(image)S 167 x(data)S 167 x(can)S 168 x +(only)S 168 x(be)S 167 x(initialized)S 166 x(throug)S 2 x(h)S 167 x +(image)S 167 x(data)S 167 x(wire)S 167 x(transport)S 167 x +(functions.)S 253 x(All)S 598 y 4796 X(attributes)S 163 x(can)S 164 x +(be)S 164 x(directly)S 165 x(queried)S 164 x(by)S 164 x(the)S 165 x +(client,)S 165 x(but)S 164 x(the)S 164 x(image)S 164 x(data)S 164 x +(can)S 164 x(not)S 164 x(be)S 164 x(directly)S 165 x(queried.)S 597 y +4796 X(It)S 165 x(can)S 167 x(only)S 166 x(be)S 166 x(read)S 167 x +(via)S 166 x(image)S 166 x(data)S 166 x(wire)S 166 x(transport)S +166 x(functions.)S 897 y 4796 X(IOB)S 173 x(attributes)S 175 x(fall)S +175 x(into)S 175 x(two)S 174 x(classes:)S 267 x(those)S 175 x(that)S +175 x(are)S 175 x(server)S 175 x(private,)S 179 x(and)S 175 x(those)S +175 x(that)S 175 x(are)S 175 x(public)S 598 y 4796 X(and)S 154 x +(queryable)S 156 x(by)S 155 x(the)S 155 x(client.)S 249 x(The)S 156 x +(private)S 155 x(attributes)S 154 x(can)S 155 x(not)S 154 x(be)S +155 x(accessed)S 154 x(by)S 155 x(the)S 155 x(client)S 155 x(in)S +155 x(anyway)S 598 y 4796 X(and)S 168 x(are)S 168 x(not)S 169 x +(described)S 168 x(in)S 168 x(this)S 168 x(document.)S 254 x(The)S +169 x(public)S 168 x(attributes)S 168 x(are)S 168 x(initialized)S +168 x(by)S 168 x(the)S 169 x(client)S 168 x(and)S 597 y 4796 X +(server)S 182 x(at)S 181 x(image)S 181 x(object)S 182 x(creation)S +182 x(time.)S 280 x(Once)S 182 x(the)S 181 x(IOB)S 181 x(has)S 181 x +(been)S 182 x(created,)S 186 x(these)S 181 x(attributes)S 181 x(are)S +598 y 4796 X("read)S 164 x(only")S 165 x(for)S 164 x(the)S 165 x +(client.)S 250 x(The)S 165 x(only)S 165 x(modi\211cation)S 165 x(of)S +164 x(these)S 164 x(attributes)S 164 x(derives)S 165 x(from)S 164 x +(client)S 165 x(directed)S 598 y 4796 X(server)S 166 x(processing)S +167 x(of)S 166 x(the)S 166 x(image.)S 896 y 4796 X(Image)S 167 x +(primitive)S 168 x(and)S 168 x(presentation)S 167 x(attributes)S +167 x(are)S 168 x(stored)S 167 x(within)S 168 x(the)S 168 x(IOB)S +166 x(and)S 168 x(are)S 168 x(initialized)S 167 x(and)S 598 y 4796 X +(queryable)S 174 x(by)S 174 x(the)S 173 x(client.)S 264 x(Format)S +174 x(\(organization)S 174 x(and)S 173 x(encoding)S 2 x(\))S 173 x +(information)S 173 x(is)S 173 x(not)S 174 x(stored)S 173 x(in)S 173 x +(the)S 598 y 4796 X(IOB)S 179 x(\(refer)S 182 x(to)S 181 x(appendix)S +181 x(on)S 182 x(image)S 181 x(data)S 180 x(attributes)S 181 x(and)S +181 x(organization\).)S 280 x(Format)S 181 x(information)S 181 x(is)S +598 y 4796 X(simply)S 165 x(used)S 166 x(during)S 168 x(wire)S 165 x +(transport.)S 35879 Y 22802 X F40(APPENDIC)S -2 x(ES)S 449 x(9\2033)S +PP +EP +%%DOC$Page: 9-4 93 +1000 BP 39600 30600 PM 0 0 XY +5065 Y 5752 X F102(Field)S 240 x(id)S 12447 X(Field)S 239 x(code)S +16272 X(Field)S 240 x(type)S 448 y 5752 X(--------)S 12447 X +(----------)S 16272 X(----------)S 747 y 4796 X +(IOB$PIXELS_PER_SCANL)S 2 x(INE)S 13403 X(0)S 16512 X(CARD32)S 448 y +4796 X(IOB$NUMBER_OF_SCANLI)S 2 x(NES)S 13403 X(1)S 16512 X(CARD32)S +449 y 4796 X(IOB$NUMBER_OF_SPECTR)S 2 x(AL_COMPONENTS)S 718 x(2)S +16512 X(CARD8)S 448 y 4796 X(IOB$SPECTRAL_COMPONE)S 2 x(NT_MAPPING)S +13403 X(4)S 16512 X(XIT_SPECTRAL_COMPON)S 2 x(ENT_MAPPING)S 747 y +4796 X(IOB$PIXEL_PROGRESSIO)S 2 x(N)S 13403 X(5)S 16512 X +(XIT_PIXEL_PROGRESSI)S 2 x(ON)S 448 y 4796 X(IOB$LINE_PROGRESSION)S +13403 X(6)S 16512 X(XIT_LINE_PROGRESSIO)S 2 x(N)S 449 y 4796 X +(IOB$ASPECT_RATIO)S 13403 X(7)S 16512 X(XIT_FLOAT)S 448 y 4796 X +(IOB$POLARITY)S 13403 X(8)S 16512 X(XIT_POLARITY)S 747 y 4796 X +(IOB$CONSTRAINED)S 13403 X(9)S 16512 X(BOOL)S 19381 X(\(query)S 240 x +(only)S +(\))S 449 y 4796 X(IOB$CONSTRAIN_MODEL)S 13403 X(10)S 16512 X(CARD8)S +19381 X(\(query)S 240 x(only\))S 448 y 4796 X(IOB$CONSTRAIN_BITS_P)S +2 x(ER_COMPONENT)S 13403 X(11)S 16512 X(LISTOFCARD8)S 240 x(\(query)S +240 x(only\))S 897 y 4796 X F151(The)S 188 x(image)S 188 x(data)S +187 x(\211eld)S 188 x(of)S 188 x(the)S 188 x(IOB)S 186 x(is)S 187 x +(only)S 189 x(accessible)S 187 x(to)S 188 x(the)S 188 x(client)S +187 x(throug)S 2 x(h)S 188 x(image)S 188 x(data)S 187 x(wire)S 597 y +4796 X(transport)S 165 x(protocol)S 167 x(function,)S 167 x(and)S +166 x(not)S 166 x(directly)S 167 x(through)S 168 x(resource)S 166 x +(object)S 167 x(functions.)S 897 y 4796 X(Other)S 173 x(than)S 173 x +(the)S 174 x(implications)S 172 x(of)S 173 x(constrained/u)S 2 x +(nconstrained)S 173 x(and)S 174 x(mono/polych)S 2 x(romatic,)S 175 x +(the)S 173 x(orga-)S 598 y 4796 X(nization)S 174 x(of)S 175 x(the)S +175 x(image)S 175 x(data)S 174 x(in)S 175 x(the)S 175 x(IOB)S 174 x +(is)S 174 x(server)S 175 x(private.)S 268 x(The)S 175 x(server)S +175 x(may)S 175 x(choose)S 175 x(to)S 175 x(represent)S 598 y 4796 X +(the)S 168 x(revisable)S 169 x(form)S 169 x(image)S 169 x(data)S +168 x(within)S 169 x(the)S 169 x(IOB)S 168 x(in)S 169 x(anyway)S +169 x(it)S 169 x(desires)S 168 x(including)S 170 x(the)S 169 x(same)S +168 x(way)S 169 x(in)S 597 y 4796 X(which)S 167 x(the)S 168 x(core)S +167 x(server)S 168 x(represents)S 167 x(PIXMAPS.)S 168 x(The)S 168 x +(only)S 168 x(constraint)S 167 x(is)S 167 x(that)S 167 x(upon)S 168 x +(request)S 167 x(from)S 167 x(the)S 598 y 4796 X(client,)S 176 x +(the)S 174 x(server)S 174 x(must)S 174 x(be)S 174 x(able)S 174 x(to)S +173 x(reproduce)S 175 x(ALL)S 174 x(image)S 174 x(data)S 174 x +(which)S 174 x(comes)S 173 x(across)S 174 x(the)S 174 x(wire)S 173 x +(in)S 598 y 4796 X(the)S 164 x(\211rst)S 164 x(place)S 164 x(\(ie.)S +249 x(if)S 164 x(the)S 165 x(client)S 164 x(creates)S 164 x(an)S +164 x(IOB,)S 164 x(\211lls)S 164 x(it)S 164 x(with)S 163 x(image)S +165 x(data,)S 164 x(and)S 165 x(requests)S 164 x(the)S 164 x(server)S +598 y 4796 X(to)S 171 x(send)S 171 x(the)S 172 x(data)S 171 x(back)S +171 x(in)S 172 x(the)S 172 x(same)S 171 x(way)S -56 x(,)S 173 x(the)S +172 x(data)S 171 x(which)S 172 x(comes)S 171 x(back)S 172 x(must)S +171 x(be)S 171 x(identical)S 171 x(to)S 172 x(what)S 597 y 4796 X +(went)S 165 x(across)S 166 x(in)S 166 x(the)S 166 x(\211rst\).)S +19411 Y 3600 X F28(9.2.2)S 599 x(IDC)S 20507 Y 4796 X F151(Control)S +151 x(over)S 152 x(the)S 152 x(selection)S 151 x(of)S 151 x(the)S +152 x(subset)S 151 x(of)S 151 x(a)S 152 x(revisable)S 151 x(form)S +151 x(image)S 152 x(object)S 152 x(which)S 152 x(will)S 150 x(be)S +152 x(processed)S 597 y 4796 X(by)S 171 x(the)S 171 x(server)S -36 x +(,)S 172 x(as)S 171 x(well)S 170 x(as)S 170 x(the)S 172 x +(speci\211cation)S 171 x(of)S 171 x(operand)S 171 x(data)S 170 x +(for)S 171 x(area)S 171 x(operations)S 171 x(is)S 171 x +(accomplished)S 598 y 4796 X(through)S 167 x(the)S 166 x(use)S 166 x +(of)S 166 x(image)S 167 x(domain)S 166 x(control)S 166 x(contexts)S +167 x(\(IDCs)S -2 x(\).)S 897 y 4796 X(The)S 171 x(subsetting)S 171 x +(process)S 170 x(serves)S 171 x(to)S 171 x(identify)S 171 x(either)S +171 x(fully)S 171 x(connected)S 172 x(subregions)S 171 x(of)S 171 x +(an)S 171 x(image)S 171 x(which)S 598 y 4796 X(will)S 165 x(be)S +166 x(processed,)S 166 x(or)S 166 x(individual)S 167 x(pixels)S 166 x +(and)S 166 x(disconnected)S 167 x(subregions.)S 896 y 4796 X(Area)S +169 x(operations)S 169 x(involve)S 171 x(speci\211cation)S 170 x(of)S +169 x(both)S 170 x(area)S 169 x(operands)S 170 x(to)S 169 x(be)S +170 x(used)S 169 x(in)S 170 x(conjun)S 2 x(ction)S 170 x(with)S 169 x +(the)S 598 y 4796 X(area)S 171 x(image)S 171 x(data)S 170 x +(surroundin)S 2 x(g)S 171 x(the)S 171 x(current)S 172 x(pixel,)S +173 x(and)S 171 x(the)S 171 x(spatial)S 170 x(relationship)S 171 x +(or)S 171 x(registration)S 171 x(of)S 598 y 4796 X(those)S 165 x +(area)S 167 x(operands)S 166 x(\(both)S 166 x(spatial)S 165 x +(registration)S 166 x(and)S 167 x(operand)S 166 x(shape\).)S 896 y +4796 X(A)S 173 x(region)S 174 x(of)S 174 x(interest)S 173 x +(de\211nes)S 174 x(a)S 173 x(rectangu)S 2 x(lar)S 173 x(subregion)S +175 x(of)S 173 x(an)S 174 x(image)S 174 x(object)S 174 x(\(less)S +172 x(than)S 174 x(or)S 174 x(equal)S 174 x(to)S 598 y 4796 X(the)S +156 x(image)S 156 x(object)S 156 x(in)S 156 x(size\).)S 249 x(The)S +156 x(speci\211cation)S 157 x(is)S 155 x(accomplished)S 156 x(by)S +156 x(locating)S 157 x(the)S 156 x(upper)S 156 x(left)S 156 x(and)S +156 x(lower)S 598 y 4796 X(right)S 167 x(hand)S 167 x(corners)S 168 x +(of)S 166 x(the)S 167 x(rectangle)S 168 x(relative)S 167 x(to)S 166 x +(an)S 167 x(image)S 167 x(object.)S 252 x(ROI)S 165 x(\211eld)S 167 x +(values)S 168 x(are)S 166 x(initialized)S 598 y 4796 X(at)S 165 x +(resource)S 167 x(creation)S 167 x(time.)S 250 x(They)S 167 x(can)S +167 x(be)S 166 x(queried)S 167 x(or)S 166 x(modi\211ed)S 166 x(at)S +166 x(any)S 167 x(time)S 166 x(by)S 167 x(the)S 166 x(client.)S 250 x +(They)S 168 x(are)S 597 y 4796 X(never)S 167 x(modi\211ed)S 166 x +(by)S 166 x(the)S 167 x(server)S -37 x(.)S 29722 Y 5991 X F102 +(Field)S 240 x(id)S 9578 X(Field)S 239 x(Code)S 13403 X(Field)S 240 x +(type)S 448 y 5991 X(--------)S 9578 X(----------)S 13403 X +(----------)S 748 y 5991 X(IDC$ROI_UL_X)S 10773 X(0)S 13403 X +(CARD16)S 448 y 5991 X(IDC$ROI_UL_Y)S 10773 X(1)S 13403 X(CARD16)S +448 y 5991 X(IDC$ROI_LR_X)S 10773 X(2)S 13403 X(CARD16)S 449 y 5991 X +(IDC$ROI_LR_Y)S 10773 X(3)S 13403 X(CARD16)S 35879 Y 3600 X F40 +(9\2034)S 449 x(APPENDICES)S +PP +EP +%%DOC$Page: 9-5 94 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(A)S 184 x(control)S 186 x(processing)S 186 x +(plane)S 185 x(de\211nes)S 186 x(the)S 185 x(points)S 185 x(within)S +185 x(a)S 185 x(rectangular)S 187 x(subregion)S 186 x(of)S 185 x(an)S +186 x(image)S 598 y 4796 X(object)S 186 x(\(less)S 185 x(than)S 187 x +(or)S 186 x(equal)S 187 x(to)S 186 x(the)S 186 x(image)S 186 x +(object)S 187 x(in)S 186 x(size\))S 185 x(that)S 186 x(are)S 187 x +(subject)S 186 x(to)S 186 x(processing.)S 290 x(The)S 597 y 4796 X +(speci)S +(\211cation)S 173 x(is)S 173 x(accomplished)S 173 x(via)S 173 x(the)S +173 x(use)S 174 x(of)S 173 x(a)S 173 x(1)S 173 x(bit)S 172 x(deep)S +174 x(PIXMAP)S 172 x(which)S 174 x(is)S 173 x(positioned)S 172 x +(against)S 598 y 4796 X(the)S 163 x(image)S 164 x(object)S 163 x(by)S +164 x(locating)S 164 x(the)S 164 x(upper)S 163 x(left)S 163 x(hand)S +164 x(corner)S 165 x(relative)S 163 x(to)S 164 x(an)S 163 x(image)S +164 x(object.)S 250 x(A)S 163 x(PIXMAP)S 598 y 4796 X(value)S 175 x +(of)S 174 x(1)S 175 x(implies)S 173 x(that)S 175 x(the)S 174 x +(image)S 175 x(data)S 174 x(at)S 174 x(that)S 175 x(point)S 174 x +(is)S 174 x(subject)S 175 x(to)S 174 x(processing)S 175 x(while)S +175 x(a)S 174 x(value)S 175 x(of)S 598 y 4796 X(0)S 176 x(implies)S +175 x(that)S 176 x(it)S 176 x(is)S 175 x(not.)S 270 x(The)S 177 x +(results)S 176 x(of)S 176 x(the)S 176 x(image)S 177 x(operator)S +176 x(at)S 176 x(these)S 176 x(points)S 176 x(\(selected)S 175 x +(and)S 177 x(not\))S 597 y 4796 X(are)S 179 x(determined)S 180 x(by)S +180 x(the)S 180 x(operator)S 180 x(on)S 180 x(a)S 180 x(case)S 180 x +(by)S 180 x(case)S 180 x(basis.)S 276 x(CPP)S 179 x(\211eld)S 180 x +(values)S 181 x(are)S 180 x(initialized)S 179 x(at)S 598 y 4796 X +(resource)S 175 x(creation)S 174 x(time.)S 266 x(They)S 176 x(can)S +175 x(be)S 174 x(queried)S 175 x(or)S 175 x(modi\211ed)S 174 x(at)S +174 x(any)S 175 x(time)S 174 x(by)S 175 x(the)S 175 x(client.)S 266 x +(They)S 176 x(are)S 598 y 4796 X(never)S 167 x(modi\211ed)S 166 x +(by)S 166 x(the)S 167 x(server)S -37 x(.)S 11093 Y 5991 X F102 +(Field)S 240 x(id)S 9578 X(Field)S 239 x(Code)S 13403 X(Field)S 240 x +(type)S 448 y 5991 X(--------)S 9578 X(----------)S 13403 X +(----------)S 747 y 5991 X(IDC$CPP_UL_X)S 11012 X(4)S 13403 X +(CARD16)S 448 y 5991 X(IDC$CPP_UL_Y)S 11012 X(5)S 13403 X(CARD16)S +449 y 5991 X(IDC$CPP_DATA)S 11012 X(6)S 13403 X(PIXMAP)S 896 y 4796 X +F151(A)S 177 x(template)S 176 x(de\211nes)S 178 x(the)S 178 x +(points)S 177 x(within)S 177 x(a)S 178 x(rectangular)S 179 x +(subregion)S 178 x(which)S 178 x(will)S 176 x(be)S 178 x(selected)S +177 x(for)S 178 x(use)S 598 y 4796 X(in)S 182 x(an)S 182 x(area)S +182 x(operation,)S 186 x(and)S 182 x(the)S 182 x(values)S 182 x(of)S +182 x(an)S 182 x(operand)S 182 x(to)S 182 x(be)S 182 x(used)S 182 x +(in)S 182 x(the)S 182 x(operation)S 182 x(for)S 181 x(each)S 183 x +(of)S 598 y 4796 X(these)S 172 x(points.)S 262 x(The)S 173 x +(template)S 172 x(does)S 172 x(not)S 173 x(de\211ne)S 173 x(its)S +172 x(spatial)S 172 x(relation)S 173 x(to)S 172 x(the)S 173 x(image)S +172 x(object.)S 263 x(Rather)S -36 x(,)S 174 x(it)S 598 y 4796 X +(speci\211es)S 172 x(the)S 173 x(alignment)S 174 x(of)S 173 x(its)S +172 x(selection)S 173 x(and)S 174 x(operand)S 173 x("mask")S 172 x +(to)S 173 x(what)S 173 x(ever)S 174 x(the)S 173 x(current)S 174 x +(pixel)S 173 x(is.)S 597 y 4796 X(This)S 173 x(is)S 173 x(done)S +174 x(by)S 174 x(specifying)S 174 x(the)S 173 x(location)S 174 x(of)S +173 x(the)S 174 x(current)S 174 x(pixel)S 174 x(in)S 174 x(the)S +173 x(two)S 173 x(dimensional)S 173 x(selection)S 174 x(/)S 598 y +4796 X(operand)S 175 x(grid.)S 267 x(This)S 175 x(allows)S 174 x +(for)S 174 x(asymmetric)S 175 x(and)S 175 x(sparsely)S 174 x +(populated)S 175 x(template)S 174 x(grids.)S 267 x(TMP)S 175 x +(\211eld)S 598 y 4796 X(values)S 172 x(are)S 173 x(initialized)S +171 x(at)S 172 x(resource)S 173 x(creation)S 173 x(time.)S 262 x +(They)S 173 x(can)S 173 x(be)S 172 x(queried)S 173 x(or)S 172 x +(modi\211ed)S 173 x(at)S 172 x(any)S 173 x(time)S 598 y 4796 X(by)S +166 x(the)S 166 x(client.)S 250 x(They)S 167 x(are)S 166 x(never)S +168 x(modi\211ed)S 166 x(by)S 166 x(the)S 166 x(server)S -36 x(.)S +19411 Y 5752 X F102(Field)S 240 x(id)S 9338 X(Field)S 240 x(Code)S +13164 X(Field)S 240 x(type)S 449 y 5752 X(--------)S 9338 X +(----------)S 13164 X(----------)S 747 y 5752 X(IDC$TMP_ENTRIES)S +10534 X(7)S 13403 X(CARD8)S 448 y 5752 X(IDC$TMP_CENTERX)S 10534 X +(8)S 13403 X(CARD8)S 449 y 5752 X(IDC$TMP_CENTERY)S 10534 X(9)S +13403 X(CARD8)S 448 y 5752 X(IDC$TMP_DATA)S 10534 X(10)S 13403 X +(LISTofXIT_FLO)S 2 x(AT)S 23446 Y 3600 X F28(9.2.3)S 599 x(IPC)S +24542 Y 15351 X F151(TBS)S 35879 Y 22802 X F40(APPENDIC)S -2 x(ES)S +449 x(9\2035)S +PP +EP +%%DOC$Page: 9-6 95 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(9.3)S 599 x(Image)S 167 x(Data)S 167 x(Attributes)S +166 x(&)S 166 x(Organization)S 6838 Y 4796 X F151(In)S 184 x(the)S +185 x(X)S 185 x(Image)S 185 x(Extension,)S 190 x(the)S 185 x(client)S +185 x(may)S 185 x(keep)S 186 x(image)S 185 x(data)S 184 x(within)S +185 x(itself)S 184 x(in)S 185 x(any)S 186 x(fashion)S 185 x(it)S +598 y 4796 X(chooses.)S 275 x(The)S 180 x(client)S 179 x(may)S 179 x +(keep)S 179 x(any)S 180 x(set)S 179 x(of)S 179 x(attributes,)S 182 x +(partitioned)S 179 x(or)S 179 x(not,)S 183 x(and)S 179 x(any)S 180 x +(image)S 179 x(data)S 597 y 4796 X(organization.)S 283 x(It)S 182 x +(may)S 183 x(also)S 182 x(choose)S 183 x(to)S 182 x(exchang)S 2 x(e)S +182 x(that)S 183 x(data)S 182 x(and)S 183 x(those)S 182 x +(attributes)S 182 x(with)S 182 x(another)S 598 y 4796 X(application)S +181 x(in)S 181 x(any)S 182 x(fashion)S 181 x(it)S 181 x(desires.)S +280 x(Those)S 181 x(issues)S 181 x(are)S 181 x(outside)S 181 x(of)S +181 x(the)S 181 x(scope)S 181 x(of)S 182 x(the)S 181 x(X)S 181 x +(Image)S 598 y 4796 X(Extension.)S 897 y 4796 X(What)S 190 x(the)S +191 x(X)S 190 x(Image)S 191 x(Extension)S 190 x(does)S 191 x(focus)S +190 x(on)S 191 x(\(specify\))S 191 x(is)S 190 x(the)S 191 x +(transport)S 190 x(of)S 191 x(image)S 191 x(data)S 190 x(and)S 597 y +4796 X(attributes)S 151 x(across)S 151 x(the)S 152 x(X)S 152 x +(wire.)S 249 x(The)S 153 x(ground)S 153 x(rules)S 152 x(are)S 152 x +(simple:)S 249 x(the)S 152 x(protocol)S 152 x(speci\211es)S 151 x +(what)S 152 x(attribute)S 598 y 4796 X(information)S 168 x(must)S +168 x(be)S 168 x(exchang)S 2 x(ed)S 168 x(and)S 168 x(when,)S 170 x +(and)S 168 x(the)S 168 x(multiple)S 168 x(allowable)S 168 x(data)S +167 x(transport)S 168 x(formats.)S 598 y 4796 X(The)S 167 x(client)S +167 x(gets)S 167 x(to)S 166 x(choose)S 167 x(from)S 167 x(these)S +166 x(various)S 168 x(formats)S 166 x(and)S 167 x(the)S 167 x +(server)S 167 x(complies)S 166 x(at)S 167 x(data)S 166 x(transport)S +598 y 4796 X(time.)S 286 x(The)S 185 x(client)S 185 x(does)S 184 x +(not)S 185 x(get)S 185 x(to)S 184 x(choose)S 185 x(how)S 184 x(the)S +185 x(server)S 185 x(represents)S 185 x(or)S 185 x(organizes)S 184 x +(the)S 185 x(image)S 597 y 4796 X(data)S 173 x(\(just)S 174 x(as)S +174 x(the)S 174 x(server)S 175 x(does)S 174 x(not)S 174 x(control)S +174 x(how)S 174 x(the)S 175 x(client)S 174 x(does)S 174 x(it\).)S +265 x(The)S 174 x(server)S 175 x(may)S 174 x(be)S 174 x(lazy)S 174 x +(and)S 598 y 4796 X(simply)S 174 x(maintain)S 175 x(the)S 175 x +(organization)S 175 x(as)S 175 x(it)S 174 x(came)S 175 x(across)S +174 x(the)S 175 x(wire,)S 178 x(or)S 175 x(may)S 175 x(restructure)S +175 x(the)S 175 x(data)S 175 x(to)S 598 y 4796 X(meet)S 176 x(its)S +176 x(needs.)S 270 x(While)S 177 x(the)S 177 x(requirement)S 177 x +(\(see)S 176 x(protocol)S 177 x(section\))S 176 x(that)S 177 x(the)S +176 x(server)S 177 x(be)S 177 x(able)S 176 x(to)S 177 x(turn)S 598 y +4796 X(around)S 174 x(and)S 174 x(give)S 174 x(image)S 174 x(data)S +173 x(back)S 174 x(precisely)S 174 x(as)S 173 x(it)S 173 x(received)S +174 x(it)S 174 x(\(without)S 173 x(loss\))S 172 x(may)S 174 x(be)S +174 x(a)S 173 x(powerful)S 597 y 4796 X(incentive)S 177 x(to)S 177 x +(maintain)S 176 x(the)S 177 x(wire)S 176 x(transport)S 176 x(data)S +177 x(organization,)S 180 x(it)S 176 x(is)S 176 x(not)S 177 x(a)S +176 x(requirement)S 178 x(that)S 176 x(the)S 598 y 4796 X(server)S +166 x(maintain)S 166 x(the)S 166 x(data)S 166 x(internally)S 167 x +(in)S 166 x(that)S 166 x(format.)S 897 y 4796 X(This)S 183 x +(appendix)S 183 x(addresses)S 183 x(image)S 183 x(data)S 183 x +(attributes,)S 187 x(their)S 183 x(logical)S 184 x(partitioning,)S +188 x(and)S 184 x(image)S 183 x(data)S 598 y 4796 X(transport)S 169 x +(formats.)S 256 x(The)S 170 x(various)S 170 x(attributes)S 169 x +(are)S 170 x(partitioned)S 169 x(and)S 170 x(described)S 169 x +(along)S 170 x(with)S 169 x(the)S 170 x(trans-)S 597 y 4796 X(port)S +171 x(formats.)S 259 x(The)S 172 x(parameter)S 172 x(types)S 171 x +(for)S 171 x(these)S 172 x(attributes)S 170 x(are)S 172 x(described)S +171 x(either)S 172 x(in)S 171 x(the)S 172 x(parameter)S 598 y 4796 X +(types)S 175 x(chapter)S 176 x(\(for)S 176 x(complex)S 177 x +(types\),)S 178 x(or)S 176 x(in-line)S 176 x(along)S 177 x(with)S +175 x(their)S 176 x(usage)S 177 x(in)S 176 x(the)S 176 x(protocol)S +176 x(functions)S 598 y 4796 X(chapter)S 166 x(\(transport)S 166 x +(services)S 166 x(section\).)S 896 y 4796 X(Image)S 180 x +(attributes)S 180 x(are)S 181 x(partitioned)S 181 x(into)S 180 x +(three)S 182 x(components:)S 279 x(primitive)S 180 x(attributes,)S +185 x(organization)S 598 y 4796 X(and)S 179 x(encoding)S 180 x +(attributes,)S 183 x(and)S 179 x(presentation)S 179 x(attributes.)S +275 x(Primitive)S 180 x(attributes)S 178 x(relate)S 179 x(to)S 179 x +(a)S 179 x(PCM)S 598 y 4796 X(reference)S 175 x(model)S 175 x(for)S +175 x(the)S 175 x(image.)S 268 x(Organization)S 175 x(and)S 175 x +(encoding)S 177 x(attributes)S 174 x(are)S 175 x(essential)S 175 x +(for)S 175 x(inter-)S 598 y 4796 X(preting)S 167 x(the)S 168 x +(image)S 167 x(data)S 167 x(at)S 167 x(transport)S 167 x(time)S 167 x +(and)S 167 x(go)S 168 x(to)S 167 x(the)S 167 x(heart)S 168 x(of)S +167 x(the)S 167 x(issue)S 167 x(of)S 167 x(transport)S 167 x +(formats.)S 597 y 4796 X(Presentation)S 169 x(attributes)S 169 x +(relate)S 170 x(to)S 169 x(the)S 170 x('intended')S 169 x(or)S 170 x +(original)S 171 x(presentation)S 169 x(established)S 169 x(at)S 169 x +(capture)S 598 y 4796 X(or)S 166 x(synthesis)S 166 x(time.)S 847 y +10534 X F102(An)S 239 x(Image)S 448 y 6230 X(+-------------)S 2 x +(-------------------)S 2 x(-------------------)S 2 x(-+)S 449 y +6230 X(|)S 18903 X(|)S 448 y 6230 X(|)S 7904 X(+------------+)S +13164 X(+-------+)S 18903 X(|)S 448 y 6230 X(|)S 7904 X(|)S 717 x +(image)S 11012 X(|)S 13164 X(|)S 239 x(image)S 240 x(|)S 18903 X(|)S +449 y 6230 X(|)S 7904 X(|)S 239 x(attributes)S 240 x(|)S 13164 X(|)S +478 x(data)S 240 x(|)S 18903 X(|)S 448 y 6230 X(|)S 7904 X +(+------------+)S 13164 X(+-------+)S 18903 X(|)S 448 y 6230 X(|)S +9338 X(|)S 18903 X(|)S 449 y 6230 X(|)S 9338 X(|)S 18903 X(|)S 448 y +6230 X(|)S 9338 X(+--)S 240 x(primitive)S 240 x(attributes)S 18903 X +(|)S 448 y 6230 X(|)S 9338 X(|)S 18903 X(|)S 449 y 6230 X(|)S 9338 X +(|)S 18903 X(|)S 448 y 6230 X(|)S 9338 X(+--)S 240 x(organization)S +240 x(&)S 239 x(encoding)S 240 x(attributes)S 480 x(|)S 448 y 6230 X +(|)S 9338 X(|)S 18903 X(|)S 449 y 6230 X(|)S 9338 X(|)S 18903 X(|)S +448 y 6230 X(|)S 9338 X(+--)S 240 x(presentation)S 240 x(attributes)S +18903 X(|)S 448 y 6230 X(|)S 18903 X(|)S 448 y 6230 X +(+-------------)S 2 x(-------------------)S 2 x(-------------------)S +2 x(-+)S 35879 Y 3600 X F40(9\2036)S 449 x(APPENDICES)S +PP +EP +%%DOC$Page: 9-7 96 +1000 BP 39600 30600 PM 0 0 XY +5227 Y 3600 X F28(9.3.1)S 599 x(Primitive)S 167 x(Attributes)S 6323 Y +4796 X F151(Primitive)S 189 x(image)S 189 x(attributes)S 188 x +(include)S 190 x(information)S 189 x(about)S 189 x(a)S 188 x(PCM)S +189 x(reference)S 190 x(model)S 189 x(version)S 189 x(or)S 598 y +4796 X(state)S 181 x(of)S 181 x(the)S 182 x(image)S 182 x(\(which)S +182 x(may)S 182 x(not)S 182 x(exist)S 182 x(during)S 183 x +(transport\).)S 281 x(Primitive)S 182 x(image)S 182 x(attributes)S +181 x(are)S 598 y 4796 X(communicated)S 171 x(by)S 171 x(the)S 171 x +(client)S 171 x(to)S 171 x(the)S 171 x(server)S 171 x(at)S 171 x +(IOB)S 169 x(creation)S 172 x(time,)S 172 x(are)S 171 x(queryable)S +172 x(by)S 171 x(the)S 171 x(client)S 171 x(at)S 597 y 4796 X(any)S +166 x(time,)S 166 x(and)S 167 x(modi\211able)S 166 x(only)S 167 x +(by)S 166 x(the)S 166 x(server)S 167 x(\(not)S 166 x(the)S 166 x +(client\).)S 897 y 4796 X(Primitive)S 166 x(attributes)S 165 x +(include:)S 897 y 4796 X(\201)S 594 x(Pixels-Per)S -8 x(-Scanline)S +11105 Y 5692 X(The)S 167 x(total)S 165 x(number)S 167 x(of)S 166 x +(pixels)S 166 x(per)S 166 x(scan)S 166 x(line.)S 250 x(This)S 166 x +(value)S 167 x(is)S 166 x(not)S 598 y 5692 X(necessarily)S 167 x +(the)S 166 x(total)S 165 x(number)S 167 x(of)S 166 x(bits)S 165 x +(per)S 167 x(scan)S 166 x(line.)S 13048 Y 4796 X(\201)S 594 x +(Number)S -8 x(-of-Scanlines)S 14243 Y 5692 X(The)S 167 x(total)S +165 x(number)S 167 x(of)S 166 x(scan)S 166 x(lines)S 166 x(in)S 166 x +(the)S 167 x(image.)S 15588 Y 4796 X(\201)S 594 x(Number)S -8 x +(-of-Spectral-Com)S -2 x(ponents)S 16784 Y 5692 X(Speci\211es)S 166 x +(the)S 166 x(number)S 167 x(of)S 166 x(spectral)S 166 x(bands)S 166 x +(in)S 166 x(an)S 166 x(image.)S 250 x(Note)S 166 x(that)S 166 x +(this)S 598 y 5692 X(is)S 166 x(NOT)S 166 x(necessarily)S 166 x(the)S +166 x(number)S 167 x(of)S 166 x(logical)S 166 x(data)S 166 x(planes)S +166 x(in)S 166 x(the)S 166 x(data)S 166 x(organization.)S 597 y +5692 X(For)S 167 x(an)S 166 x(RGB)S 165 x(image,)S 167 x(this)S 165 x +(would)S 166 x(be)S 166 x(3.)S 250 x(For)S 166 x(a)S 166 x(mono)S +167 x(chromatic)S 166 x(image,)S 167 x(this)S 166 x(would)S 165 x +(be)S 166 x(1.)S 19324 Y 4796 X(\201)S 594 x +(Spectral-Component-Mapping)S 20520 Y 5692 X(Designates)S 166 x(the)S +166 x(correlation)S 167 x(between)S 165 x(the)S 167 x(physical)S +166 x(image)S 166 x(data)S 166 x(and)S 166 x(the)S 598 y 5692 X +(spectral)S 166 x(components)S 166 x(of)S 166 x(an)S 166 x(image.)S +250 x(Images)S 166 x(may)S 166 x(have)S 167 x(anywhere)S 167 x +(between)S 597 y 5692 X(one)S 167 x(spectral)S 165 x(component)S +167 x(\(monochromatic\))S 167 x(and)S 166 x(several)S 166 x +(spectral)S 598 y 5692 X(components)S 166 x(\(polychromatic\).)S +251 x(Monochromatic)S 167 x(bitonal)S 166 x(\(black)S 166 x(&)S 166 x +(white)S +(\),)S 598 y 5692 X(monochromatic-continu)S 2 x(ous)S 166 x(tone)S +166 x(\(grayscale\),)S 167 x(and)S 167 x(3)S 166 x(band)S 166 x +(polychromatic)S 167 x(\(color\))S 598 y 5692 X(will)S 165 x(be)S +167 x(the)S 166 x(only)S 167 x(supported)S 165 x(classes.)S 597 y +5692 X(Recognized)S 166 x(spectral)S 166 x(component)S 167 x +(mappings)S 166 x(include:)S 748 y 5692 X(\201)S 595 x(monochrome)S +747 y 5692 X(\201)S 595 x(color)S 166 x(3)S 166 x(spaces)S 747 y +6589 X(\201)S 594 x(RGB)S 747 y 6589 X(\201)S 594 x(*futures*)S +28589 Y 3600 X F28(9.3.2)S 599 x(Organization)S 168 x(&)S 165 x +(Encoding)S 168 x(Attributes)S 29685 Y 4796 X F151(Organization)S +165 x(and)S 165 x(encoding)S 166 x(attributes)S 164 x(de\211ne)S +166 x(the)S 165 x(detailed)S 165 x(structure)S 165 x(of)S 165 x(the)S +165 x(image)S 166 x(data)S 164 x(represen-)S 598 y 4796 X(tation)S +166 x(during)S 168 x(wire)S 166 x(transport.)S 250 x(Image)S 167 x +(data)S 166 x(will)S 166 x(either)S 167 x(begin)S 167 x(or)S 167 x +(end)S 167 x(up)S 167 x(in)S 167 x(a)S 166 x(client')S -18 x(s)S +166 x(buffer)S 167 x(in)S 167 x(this)S 598 y 4796 X(format)S 166 x +(depending)S 168 x(upon)S 168 x(the)S 167 x(transport)S 166 x +(direction.)S 252 x(Organization)S 167 x(and)S 167 x(encoding)S 168 x +(attributes)S 167 x(are)S 167 x(only)S 598 y 4796 X(relevant)S 166 x +(in)S 167 x(wire)S 165 x(transport)S 166 x(and)S 167 x(are)S 166 x +(not)S 166 x(directly)S 166 x(associated)S 166 x(with)S 165 x(a)S +166 x(server)S 167 x(based)S 165 x(IOB.)S 35879 Y 22802 X F40 +(APPENDIC)S -2 x(ES)S 449 x(9\2037)S +PP +EP +%%DOC$Page: 9-8 97 +1000 BP 39600 30600 PM 0 0 XY +5155 Y 3600 X F36(9.3.2.1)S 599 x(Encodi)S 2 x(ng)S 167 x +(Attributes)S 897 y 4796 X F151(Encoding)S 177 x(attributes)S 176 x +(describe)S 176 x(the)S 177 x(image)S 177 x(data)S 176 x +(compression)S 176 x(being)S 177 x(used)S 177 x(during)S 178 x(wire)S +176 x(transport,)S 598 y 4796 X(and)S 166 x(its)S 165 x +(relationship)S 166 x(to)S 166 x(the)S 166 x(data)S 166 x +(organization)S 167 x(scheme)S 166 x(in)S 166 x(use.)S 250 x +(Encoding)S 167 x(attributes)S 165 x(include:)S 896 y 4796 X(\201)S +594 x(Compression-Scheme)S 8742 Y 5692 X(The)S 167 x(compression)S +166 x(scheme)S 166 x(used)S 166 x(to)S 166 x(encode)S 166 x(the)S +167 x(image)S 166 x(data)S 166 x(during)S 167 x(transport.)S 597 y +5692 X(Only)S 166 x(standardized)S 166 x(or)S 166 x(well)S 165 x +(recogn)S 2 x(ized)S 165 x(and)S 167 x(accepted)S 166 x(compression)S +166 x(schemes)S 598 y 5692 X(are)S 166 x(supported.)S 250 x(These)S +166 x(include:)S 11282 Y 5692 X(\201)S 595 x(PCM)S 166 x(\(raw)S +166 x(bitmap)S 165 x(-)S 166 x(no)S 166 x(compression\))S 747 y +5692 X(\201)S 595 x(CCITT)S 165 x(Group)S 166 x(4)S 166 x(two)S 166 x +(dimensional)S 748 y 5692 X(\201)S 595 x(ISO)S 165 x(Discrete)S 165 x +(Cosine)S 166 x(T)S -31 x(ransform)S 13872 Y 4796 X(There)S 176 x +(are)S 175 x(groun)S 2 x(d)S 175 x(rules)S 175 x(for)S 175 x(the)S +176 x(choice)S 176 x(of)S 175 x(compression)S 175 x(scheme)S 175 x +(and)S 176 x(its)S 174 x(application)S 175 x(based)S 175 x(upon)S +598 y 4796 X(data)S 165 x(organization.)S 897 y 4796 X(The)S 188 x +(fax)S 189 x(compression)S 187 x(scheme)S 189 x(\(G42D\))S 186 x +(can)S 189 x(only)S 189 x(be)S 188 x(applied)S 187 x(to)S 188 x +(bitonal)S 188 x(images)S 188 x(\(any)S 189 x(value)S 189 x(of)S +598 y 4796 X(Component-Space-Organization)S 173 x(as)S 174 x(long)S +175 x(as)S 173 x(the)S 174 x(total)S 174 x(bits)S 173 x(per)S 174 x +(pixel)S 175 x(=)S 173 x(1\),)S 177 x(or)S 174 x(to)S 174 x +(continuous)S 175 x(tone)S 597 y 4796 X(images)S 166 x(\(gray)S 167 x +(scale)S 165 x(and)S 167 x(color\))S 166 x(on)S 167 x(a)S 166 x +(bit-plane)S 166 x(by)S 166 x(bit-plane)S 166 x(basis)S 165 x +(\(Component-Space-Organization)S 598 y 4796 X(must)S 165 x(be)S +166 x(bit_interleaved_by_plane\).)S 897 y 4796 X(Discrete)S 190 x +(Cosine)S 191 x(T)S -30 x(ransform)S 191 x(compression)S 191 x(can)S +192 x(be)S 192 x(applied)S 191 x(to)S 191 x(bitonal,)S 198 x +(continuou)S 2 x(s)S 191 x(tone)S 191 x(gray)S 598 y 4796 X(scale,)S +176 x(and)S 175 x(continuous)S 175 x(tone)S 175 x(color)S 175 x +(images)S 174 x(with)S 174 x(Component-Space-Organization)S 174 x +(equal)S 175 x(to)S 174 x(band_)S 597 y 4796 X(interleaved_by_plane)S +167 x(or)S 165 x(bit_interleaved_by_plan)S 2 x(e.)S 249 x(In)S 166 x +(the)S 166 x(former)S 165 x(case,)S 166 x(the)S 166 x(compression)S +165 x(scheme)S 598 y 4796 X(is)S 172 x(applied)S 172 x(on)S 173 x(a)S +173 x(spectral)S 173 x(component)S 173 x(basis,)S 174 x(while)S 172 x +(in)S 174 x(the)S 172 x(latter)S 173 x(case,)S 175 x(it)S 172 x(is)S +172 x(applied)S 173 x(on)S 173 x(a)S 173 x(bit)S 172 x(plane)S 598 y +4796 X(by)S 166 x(bit)S 166 x(plane)S 166 x(basis.)S 21942 Y 3600 X +F36(9.3.2.2)S 599 x(Component)S 167 x(Space)S 167 x(Attributes)S +897 y 4796 X F151(Image)S 173 x(data)S 173 x(may)S 173 x(represent)S +174 x(information)S 174 x(deriving)S 174 x(from)S 173 x(a)S 174 x +(number)S 174 x(of)S 173 x(chrominance)S 175 x(bands)S 173 x(\(mono)S +598 y 4796 X(through)S 182 x(poly)S 181 x(chromatic\))S 181 x(and)S +181 x(luminance)S 181 x(quantization)S 181 x(levels)S 181 x(per)S +181 x(band)S 180 x(\(bitonal)S 181 x(through)S 182 x(con-)S 597 y +4796 X(tinuous)S 175 x(tone\).)S 266 x(Given)S 175 x(any)S 176 x +(one)S 175 x(combination)S 175 x(\(such)S 175 x(as)S 174 x(3)S 175 x +(color)S 175 x(bands)S 174 x(as)S 174 x(in)S 175 x(R-G-B)S 173 x +(and)S 175 x(8)S 175 x(bits)S 174 x(per)S 598 y 4796 X(band)S 162 x +(per)S 163 x(pixel\),)S 164 x(the)S 162 x(representation)S 163 x(of)S +163 x(the)S 162 x(information)S 163 x(can)S 163 x(be)S 163 x +(organized)S 163 x(for)S 162 x(transport)S 163 x(in)S 162 x(several)S +598 y 4796 X(ways.)S 251 x(This)S 167 x(section)S 168 x(describes)S +166 x(the)S 168 x(possible)S 166 x(formats)S 167 x(and)S 167 x(the)S +167 x(associated)S 167 x(attributes)S 166 x(along)S 168 x(with)S +167 x(low)S 598 y 4796 X(level)S 166 x(data)S 166 x(formatting)S +166 x(information.)S 250 x(Component)S 166 x(space)S 166 x +(attributes)S 165 x(include:)S 896 y 4796 X(\201)S 594 x +(Component-Space-Organization)S 27920 Y 5692 X(Designates)S 166 x +(how)S 166 x(the)S 166 x(component)S 167 x(space)S 165 x(data)S 166 x +(is)S 166 x(physically)S 166 x(organized.)S 598 y 5692 X(It)S 166 x +(is)S 165 x(de\211ned)S 167 x(in)S 166 x(terms)S 166 x(of)S 166 x +(pixel)S 166 x(component)S 167 x(bit)S 165 x(storage)S 167 x(within)S +166 x(and)S 597 y 5692 X(across)S 166 x(image)S 166 x(logical)S 167 x +(data)S 165 x(planes.)S 250 x(In)S 166 x(other)S 166 x(words,)S 166 x +(it)S 166 x(indicates)S 166 x(how)S 166 x(image)S 166 x(data)S 598 y +5692 X(is)S 166 x(organized)S 166 x(pixel-by-pixel)S 167 x(and)S +166 x(spectral-component)S 167 x(by)S 166 x(spectral-component)S +598 y 5692 X(into)S 166 x(logical)S 167 x(planes)S 166 x(of)S 166 x +(data.)S 249 x(Recognized)S 166 x(component-space-organizations)S +598 y 5692 X(include:)S 32254 Y 5692 X(\201)S 595 x +(Band_Interleaved_by_Pix)S 2 x(el)S 33449 Y 6589 X(All)S 165 x +(pixel)S 167 x(data)S 165 x(for)S 166 x(ALL)S 167 x(spectral)S 165 x +(components)S 167 x(is)S 165 x(collected)S 166 x(into)S 598 y 6589 X +(a)S 166 x(single)S 166 x(logical)S 167 x(data)S 165 x(plane.)S 250 x +(For)S 167 x(example,)S 166 x(given)S 168 x(an)S 166 x(RGB)S 165 x +(image,)S 167 x(the)S 166 x(red,)S 35879 Y 3600 X F40(9\2038)S 449 x +(APPENDICES)S +PP +EP +%%DOC$Page: 9-9 98 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 6589 X F151(green,)S 167 x(and)S 167 x(blue)S 166 x(bits)S +165 x(for)S 167 x(one)S 166 x(pixel)S 166 x(are)S 167 x(butted)S +165 x(together)S -36 x(.)S 250 x(The)S 598 y 6589 X(red,)S 166 x +(green)S 2 x(,)S 166 x(and)S 166 x(blue)S 167 x(bits)S 165 x(for)S +166 x(the)S 166 x(next)S 167 x(pixel)S 166 x(follow)S -46 x(.)S +7108 Y 5692 X(\201)S 595 x(Band_Interleaved_by_Plane)S 8303 Y 6589 X +(All)S 165 x(pixel)S 167 x(data)S 165 x(for)S 166 x(EACH)S 165 x +(spectral)S 166 x(component)S 167 x(occupies)S 166 x(a)S 598 y 6589 X +(separate)S 165 x(logical)S 167 x(data)S 165 x(plane.)S 250 x(Thus,)S +167 x(for)S 167 x(our)S 166 x(RGB)S 165 x(image,)S 167 x(all)S 166 x +(red)S 166 x(bits)S 598 y 6589 X(for)S 166 x(all)S 166 x(pixels)S +166 x(are)S 166 x(gathered)S 167 x(into)S 166 x(a)S 166 x(single)S +166 x(data)S 166 x(plane,)S 597 y 6589 X(followed)S 165 x(by)S 167 x +(all)S 165 x(green)S 168 x(bits)S 165 x(for)S 166 x(all)S 166 x +(pixels,)S 166 x(followed)S 166 x(by)S 598 y 6589 X(all)S 166 x +(blue)S 166 x(bits)S 165 x(for)S 166 x(all)S 166 x(pixels.)S 12039 Y +5692 X(\201)S 595 x(Bit_Interleaved_by_Plane)S 13235 Y 6589 X(All)S +165 x(the)S 167 x(pixel)S 166 x(bits)S 165 x(for)S 166 x(each)S 167 x +(spectral)S 166 x(component)S 166 x(occupy)S 597 y 6589 X(separate)S +165 x(logical)S 167 x(data)S 165 x(planes.)S 250 x(Thus,)S 167 x(if)S +166 x(our)S 166 x(RGB)S 165 x(image)S 167 x(had)S 166 x(8)S 166 x +(bits)S 598 y 6589 X(per)S 166 x(spectral)S 166 x(component,)S 167 x +(there)S 166 x(would)S 166 x(be)S 166 x(24)S 166 x(separate)S 166 x +(data)S 165 x(planes.)S 16223 Y 5692 X(Bitonal)S 166 x(images)S 166 x +(\(monochromatic\))S 166 x(can)S 167 x(be)S 166 x(organized)S 166 x +(in)S 167 x(any)S 167 x(of)S 166 x(the)S 598 y 5692 X(three)S 167 x +(ways)S 165 x(\(all)S 166 x(are)S 166 x(identical\).)S 250 x +(Grayscale)S 166 x(images)S 165 x(\(monochromatic\))S 167 x(can)S +598 y 5692 X(be)S 166 x(organized)S 167 x(in)S 166 x(two)S 166 x +(ways:)S 249 x(\(Band_Interleaved_by_Pixel)S 167 x(and)S 167 x +(Band_Interleaved_by_Plane)S 598 y 5692 X(are)S 166 x(identical\))S +166 x(or)S 167 x(\(Bit_Interleaved_by_Plane\).)S 250 x(Color)S 166 x +(images)S 166 x(\(polychromatic\))S 597 y 5692 X(can)S 167 x(be)S +166 x(organized)S 166 x(into)S 166 x(any)S 167 x(of)S 166 x(the)S +166 x(three)S 167 x(ways.)S 19959 Y 4796 X(\201)S 594 x(Bits-Per)S +-9 x(-Component)S 21155 Y 5692 X(The)S 167 x(number)S 167 x(of)S +166 x(bits)S 165 x(used)S 166 x(for)S 166 x(each)S 167 x(image)S +166 x(component)S 167 x(by)S 166 x(logical)S 167 x(data)S 598 y +5692 X(plane)S 166 x(independent)S 167 x(of)S 166 x(component)S 167 x +(space)S 166 x(organization.)S 250 x(The)S 166 x(sum)S 166 x(of)S +597 y 5692 X(Bits-Per)S -9 x(-Component)S 166 x(for)S 166 x(all)S +165 x(components)S 167 x(must)S 165 x(by)S 167 x(de\211nition)S 167 x +(equal)S 598 y 5692 X(the)S 166 x(total)S 166 x(bits)S 165 x(per)S +166 x(pixel.)S 24293 Y 4796 X(\201)S 594 x(Pixel-Stride)S 25489 Y +5692 X(The)S 167 x(difference)S 166 x(in)S 167 x(bit)S 165 x +(addresses)S 165 x(between)S 166 x(the)S 166 x(starting)S 167 x +(bits)S 165 x(of)S 597 y 5692 X(successive)S 166 x(pixels)S 166 x +(by)S 167 x(logical)S 166 x(data)S 166 x(plane.)S 250 x +(Pixel-stride)S 166 x(will)S 165 x(typically)S 167 x(be)S 166 x +(equal)S 598 y 5692 X(to)S 166 x(the)S 166 x(number)S 167 x(of)S +166 x(bits)S 165 x(per)S 166 x(pixel)S 167 x(stored)S 165 x(in)S +167 x(a)S 166 x(particular)S 166 x(plane)S 598 y 5692 X(unless)S +166 x(pixel)S 166 x(boundary)S 168 x(alignment)S 167 x(requires)S +166 x(\211ll)S 166 x(\(pad\).)S 249 x(Pixel-Stride)S 598 y 5692 X +(is)S 166 x(meaningful)S 167 x(for)S 166 x(uncompressed)S 166 x +(data)S 166 x(in)S 166 x(any)S 167 x(of)S 166 x(the)S 166 x(3)S 166 x +(organizational)S 597 y 5692 X(formats.)S 29822 Y 4796 X(\201)S 594 x +(Scanline-Stride)S 31018 Y 5692 X(The)S 167 x(difference)S 166 x(in)S +167 x(bit)S 165 x(addresses)S 165 x(between)S 166 x(the)S 166 x +(starting)S 167 x(bits)S 165 x(of)S 598 y 5692 X(successive)S 166 x +(scanlines)S 166 x(by)S 167 x(logical)S 166 x(data)S 166 x(plane.)S +250 x(Scan-Line)S 167 x(stride)S 165 x(will)S 165 x(typically)S 167 x +(be)S 166 x(equal)S 597 y 5692 X(to)S 166 x(the)S 166 x(number)S +167 x(of)S 166 x(bits)S 165 x(\(not)S 166 x(pixels\))S 166 x(per)S +166 x(scanline)S 167 x(unless)S 166 x(scanline)S 598 y 5692 X +(boundary)S 167 x(alignment)S 167 x(requires)S 167 x(\211ll)S 166 x +(\(pad\).)S 249 x(Scanline-Stride)S 166 x(is)S 166 x(meaningful)S +167 x(for)S 598 y 5692 X(uncompressed)S 166 x(data)S 166 x(in)S 166 x +(any)S 167 x(of)S 166 x(the)S 166 x(3)S 166 x(organizational)S 167 x +(formats.)S 35879 Y 22802 X F40(APPENDIC)S -2 x(ES)S 449 x(9\2039)S +PP +EP +%%DOC$Page: 9-10 99 +1000 BP 39600 30600 PM 0 0 XY +5227 Y 3600 X F28(9.3.3)S 599 x(Presentatio)S 2 x(n)S 166 x +(Attributes)S 6323 Y 4796 X F151(Presentation)S 176 x(attributes)S +175 x(represent)S 177 x(qualitative)S 176 x(information)S 176 x +(that)S 176 x(corresponds)S 176 x(to)S 176 x(visual)S 176 x(charac-)S +598 y 4796 X(teristics)S 167 x(of)S 168 x(the)S 168 x(image)S 168 x +(data)S 168 x(when)S 169 x(presented)S 168 x(\(viewed\).)S 253 x +(Presentation)S 169 x(attributes)S 167 x(affect)S 168 x(how)S 168 x +(image)S 598 y 4796 X(data)S 165 x(is)S 165 x(rendered)S 167 x(and)S +166 x(presented)S 165 x(for)S 166 x(viewing.)S 251 x(They)S 167 x +(often)S 166 x(derive)S 166 x(initially)S 166 x(from)S 166 x(the)S +166 x(original)S 166 x(object)S 597 y 4796 X(or)S 172 x(scene,)S +174 x(and)S 172 x(the)S 172 x(capture)S 172 x(or)S 172 x(synthesis)S +172 x(process.)S 261 x(As)S 171 x(the)S 172 x(capture)S 173 x +(process)S 171 x(involves)S 173 x(a)S 172 x(digitization)S 598 y +4796 X(and)S 175 x(quantization)S 174 x(process,)S 177 x(the)S 175 x +(attributes)S 175 x(of)S 174 x(the)S 175 x(capture)S 176 x +(device/process)S 175 x(are)S 175 x(starting)S 175 x(points)S 175 x +(for)S 598 y 4796 X(many)S 169 x(presentation)S 168 x(attributes.)S +254 x(Maintaining)S 170 x(this)S 168 x(information)S 169 x(and)S +169 x(using)S 169 x(it)S 168 x(at)S 168 x(presentation)S 169 x(time)S +598 y 4796 X(ensures)S 155 x(\211delity)S 156 x(between)S 155 x(the)S +155 x(original)S 156 x(object)S 156 x(or)S 155 x(scene)S 156 x(and)S +155 x(the)S 156 x(rendered)S 156 x(image)S 155 x(\(ie.)S 249 x(the)S +156 x(image)S 155 x(will)S 597 y 4796 X(look)S 175 x(like)S 176 x +(the)S 175 x(original)S 176 x(object)S 176 x(or)S 175 x(scene\).)S +268 x(An)S 175 x(example)S 176 x(of)S 175 x(ignoring)S 177 x(or)S +176 x(modifying)S 176 x(this)S 174 x(information)S 598 y 4796 X +(might)S 171 x(result)S 171 x(in)S 171 x(an)S 171 x(image)S 172 x +(displayed)S 170 x(upside)S 171 x(down.)S 260 x(Presentation)S 171 x +(attributes)S 170 x(can)S 172 x(be)S 171 x(found)S 172 x(in)S 171 x +(the)S 598 y 4796 X(IOB)S -2 x(.)S 896 y 4796 X(A)S 185 x(major)S +185 x(component)S 186 x(of)S 186 x(presentation)S 185 x(deals)S 185 x +(with)S 185 x(the)S 186 x(layout)S 186 x(of)S 185 x(an)S 186 x +(image)S 185 x(on)S 186 x(the)S 186 x(screen.)S 289 x(For)S 598 y +4796 X(this)S 182 x(aspect)S 183 x(of)S 183 x(presentation,)S 187 x +(an)S 184 x(output)S 183 x(device)S 183 x(\(screen\))S 184 x +(relative)S 183 x(coordinate)S 183 x(reference)S 184 x(system)S 598 y +4796 X(is)S 179 x(necessary)S -55 x(.)S 277 x(For)S 181 x(this)S +179 x(purpose,)S 184 x(we)S 180 x(use)S 180 x(the)S 180 x(ISO)S 179 x +(and)S 180 x(CCITT)S 179 x(standard)S 180 x(image)S 180 x +(orientation.)S 278 x(In)S 598 y 4796 X(this)S 179 x(system)S 180 x +(a)S 180 x(two)S 180 x(dimensional)S 180 x(cartesian)S 180 x +(coordinate)S 181 x(system)S 179 x(is)S 180 x(overlaid)S 181 x(on)S +180 x(top)S 180 x(of)S 180 x(the)S 181 x(screen)S 597 y 4796 X +(surface)S 173 x(\(the)S 174 x(z)S 173 x(axis)S 173 x(would)S 174 x +(be)S 173 x(normal)S 174 x(to)S 173 x(the)S 174 x(plane)S 174 x(and)S +173 x(out)S 174 x(of)S 173 x(the)S 174 x(screen\).)S 265 x(The)S +174 x(x)S 174 x(axis)S 174 x(is)S 173 x(placed)S 598 y 4796 X +(horizontally)S 191 x(aimed)S 190 x(towards)S 190 x(the)S 190 x +(users)S 191 x(right)S 191 x(\(user)S 191 x(facing)S 191 x(screen\))S +191 x(and)S 191 x(the)S 190 x(y)S 191 x(axis)S 191 x(is)S 190 x +(aimed)S 598 y 4796 X(vertically)S -55 x(.)S 295 x(All)S 188 x +(angles)S 189 x(are)S 189 x(measured)S 188 x(relative)S 189 x(to)S +189 x(the)S 188 x(positive)S 189 x(x)S 189 x(axis)S 189 x(in)S 188 x +(a)S 189 x(counter)S 190 x(clockwise)S 598 y 4796 X(direction.)S +896 y 4796 X(Presentation)S 166 x(attributes)S 165 x(include:)S 897 y +4796 X(\201)S 594 x(Pixel-Prog)S 2 x(ression)S 19773 Y 5692 X(The)S +167 x(direction)S 166 x(of)S 166 x(the)S 166 x(pixel)S 167 x(path)S +166 x(relative)S 166 x(to)S 166 x(ISO)S 165 x(and)S 166 x(CCITT)S +597 y 5692 X(standard)S 166 x(image)S 166 x(orientation.)S 250 x +(More)S 167 x(aptly)S -55 x(,)S 166 x(the)S 166 x(angle)S 167 x +(between)S 166 x(a)S 166 x(scan)S 598 y 5692 X(line)S 166 x(and)S +167 x(the)S 166 x(x)S 166 x(axis)S 166 x(of)S 166 x(the)S 167 x +(standard)S 165 x(image)S 167 x(orientation)S 166 x(coordinate)S +598 y 5692 X(system.)S 249 x(Standard)S 166 x(values)S 167 x(of)S +165 x(0,)S 167 x(90,)S 166 x(180,)S 167 x(and)S 166 x(270)S 166 x +(degrees)S 166 x(should)S 167 x(be)S 598 y 5692 X(used)S 166 x +(allowing)S 166 x(for)S 166 x(left-to-right,)S 167 x(right-to-left,)S +166 x(top-to-bottom,)S 597 y 5692 X(and)S 166 x(bottom-to-top)S 165 x +(pixel)S 167 x(progressions.)S 24106 Y 4796 X(\201)S 594 x +(Line-Prog)S 2 x(ression)S 25302 Y 5692 X(The)S 167 x(direction)S +166 x(of)S 166 x(scan)S 166 x(line)S 167 x(capture)S 166 x(/)S 167 x +(display)S 165 x(across)S 166 x(the)S 166 x(image)S 167 x(plane.)S +598 y 5692 X(More)S 167 x(aptly)S -56 x(,)S 167 x(the)S 166 x +(direction)S 167 x(normal)S 166 x(to)S 166 x(that)S 166 x(of)S 166 x +(a)S 166 x(scan)S 166 x(line)S 166 x(in)S 166 x(which)S 597 y 5692 X +(scan)S 166 x(lines)S 166 x(were)S 166 x(captured)S 166 x(or)S 167 x +(will)S 165 x(appear)S -37 x(.)S 250 x(Standard)S 166 x(values)S +166 x(of)S 166 x(90)S 166 x(and)S 598 y 5692 X(270)S 166 x(degrees)S +167 x(should)S 166 x(be)S 166 x(used.)S 28440 Y 4796 X(\201)S 594 x +(Aspect-Ratio)S 29636 Y 5692 X(The)S 167 x(ratio)S 166 x(of)S 166 x +(the)S 166 x(distance)S 166 x(between)S 166 x(pixel)S 166 x(centers)S +166 x(along)S 167 x(the)S 166 x(pixel-)S 597 y 5692 X(progression)S +167 x(direction)S 166 x(and)S 166 x(the)S 167 x(line-progression)S +166 x(direction.)S 31578 Y 4796 X(\201)S 594 x(Polarity)S 32774 Y +5692 X(The)S 167 x(manner)S 167 x(in)S 166 x(which)S 166 x(the)S +167 x(pixel)S 166 x(values)S 166 x(represent)S 167 x(minimum)S 166 x +(and)S 598 y 5692 X(maximum)S 166 x(intensity)S -55 x(.)S 35879 Y +3600 X F40(9\20310)S 449 x(APPENDICES)S +PP +EP +%%DOC$Page: 9-11 100 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(9.4)S 599 x(Concept)S 167 x(and)S 167 x(V)S -34 x +(ersion)S 167 x(Changes)S 6838 Y 4796 X F151(There)S 184 x(have)S +185 x(been)S 185 x(several)S 184 x(signi\211cant)S 185 x(conceptual)S +184 x(chang)S 2 x(es)S 183 x(between)S 184 x(the)S 184 x(draft)S +184 x(of)S 184 x(the)S 184 x(concepts)S 598 y 4796 X(document)S 186 x +(and)S 187 x(this)S 186 x(draft)S 186 x(\(v2.0\))S 187 x(of)S 186 x +(the)S 187 x(protocol)S 187 x(speci\211cation.)S 290 x(In)S 187 x +(addition,)S 191 x(there)S 187 x(have)S 187 x(been)S 597 y 4796 X +(substantial)S 188 x(chang)S 2 x(es)S 189 x(in)S 189 x(content)S +190 x(between)S 190 x(v1.0)S 190 x(and)S 190 x(v2.0)S 190 x(of)S +190 x(the)S 189 x(protocol)S 190 x(speci\211cation.)S 297 x(This)S +598 y 4796 X(appendix)S 166 x(summarizes)S 165 x(the)S 166 x +(conceptual)S 167 x(and)S 166 x(protocol)S 167 x(changes.)S 10126 Y +3600 X F28(9.4.1)S 599 x(Conceptua)S 2 x(l)S 166 x(Changes)S 11221 Y +4796 X F151(Perhaps)S 166 x(the)S 167 x(most)S 165 x(signi\211can)S +2 x(t)S 166 x(conceptual)S 167 x(change)S 168 x(has)S 166 x(to)S +166 x(do)S 166 x(with)S 166 x(the)S 167 x(location)S 166 x(of)S 167 x +(the)S 166 x(wire)S 166 x(relative)S 598 y 4796 X(to)S 174 x(the)S +174 x(rendition)S 175 x(services)S 175 x(that)S 174 x(the)S 175 x(x)S +175 x(image)S 175 x(extension)S 175 x(calls)S 174 x(for)S -37 x(.)S +267 x(In)S 174 x(the)S 175 x(concept)S 175 x(document,)S 177 x(high)S +598 y 4796 X(level)S 172 x(rendition)S 173 x(services)S 172 x(were)S +172 x(called)S 172 x(for)S 172 x(on)S 173 x(the)S 172 x(server)S +173 x(side)S 171 x(of)S 173 x(the)S 172 x(wire.)S 261 x(The)S 173 x +(current)S 173 x(position)S 172 x(is)S 598 y 4796 X(to)S 170 x +(provide)S 170 x(a)S 170 x(minimal)S 170 x(set)S 170 x(of)S 170 x +(tools)S 170 x(on)S 170 x(the)S 171 x(server)S 171 x(side)S 169 x +(which)S 171 x(can)S 170 x(be)S 171 x(used)S 170 x(in)S 170 x +(rendition)S 171 x(processing)S 597 y 4796 X(\(and)S 171 x(might)S +173 x(be)S 171 x(facilitated)S 171 x(by)S 173 x(display)S 171 x +(accelerators\),)S 174 x(and)S 172 x(leave)S 172 x(the)S 172 x +(direction)S 172 x(of)S 172 x(rendition)S 172 x(models)S 598 y 4796 X +(to)S 179 x(a)S 179 x(client)S 180 x(side)S 179 x(imaging)S 181 x +(toolkit.)S 276 x(T)S -46 x(o)S 180 x(some)S 179 x(extent,)S 184 x +(this)S 179 x(is)S 179 x(in)S 180 x(support)S 179 x(of)S 180 x(a)S +179 x(gener)S 2 x(al)S 179 x(effort)S 179 x(we've)S 598 y 4796 X +(made)S 165 x(to)S 166 x(reduce)S 167 x(the)S 166 x(size)S 165 x(of)S +166 x(the)S 167 x(extension)S 166 x(protocol.)S 897 y 4796 X(A)S +168 x(second)S 169 x(shift)S 168 x(is)S 168 x(based)S 168 x(upon)S +169 x(the)S 169 x(recogn)S 2 x(ition)S 168 x(that)S 169 x(resource)S +169 x(types)S 168 x(are)S 169 x(themselves)S 169 x(scarce)S 169 x +(things.)S 597 y 4796 X(A)S 189 x(such,)S 198 x(the)S 190 x +(protocol)S 191 x(has)S 190 x(moved)S 191 x(away)S 190 x(from)S 190 x +(the)S 190 x(use)S 191 x(of)S 190 x(many)S 191 x(different)S 190 x +(types)S 190 x(of)S 191 x(extension)S 598 y 4796 X(resources)S 179 x +(towards)S 178 x(a)S 179 x(minimal)S 178 x(set)S 179 x(with)S 178 x +(more)S 179 x(in)S 179 x(line)S 179 x(parameters.)S 275 x(In)S 179 x +(particular)S -36 x(,)S 182 x(ITC')S -19 x(s)S 179 x(\(image)S 598 y +4796 X(transport)S 173 x(contexts\),)S 176 x(IEC')S -20 x(s)S 174 x +(\(image)S 173 x(enhanc)S 2 x(ement)S 173 x(contexts\),)S 176 x(and)S +174 x(IDC')S -20 x(s)S 174 x(\(image)S 173 x(display)S 174 x +(contexts\))S 598 y 4796 X(are)S 188 x(no)S 188 x(longer)S 189 x +(server)S 189 x(resources.)S 294 x(Instead,)S 193 x(the)S 189 x +(information)S 188 x(they)S 189 x(contained)S 188 x(is)S 188 x +(exchang)S 2 x(ed)S 188 x(as)S 597 y 4796 X(protocol)S 166 x +(parameters.)S 897 y 4796 X(The)S 182 x(authors)S 181 x(have)S 182 x +(always)S 181 x(felt)S 181 x(that)S 181 x(logically)S -54 x(,)S 186 x +(image)S 181 x(capture)S 182 x(devices)S 181 x(such)S 182 x(as)S +181 x(frame)S 181 x(grabbers)S 598 y 4796 X(\(video)S 167 x +(digitizers\))S 167 x(belong)S 169 x(on)S 168 x(the)S 167 x(client)S +168 x(side)S 167 x(of)S 168 x(the)S 167 x(wire,)S 169 x(but)S 167 x +(that)S 168 x(their)S 167 x(close)S 168 x(proximity)S 168 x(to)S +167 x(display)S 598 y 4796 X(subsystems)S 169 x(made)S 171 x(it)S +171 x(necessary)S 171 x(to)S 171 x(provide)S 171 x(for)S 171 x(them)S +171 x(on)S 171 x(the)S 171 x(server)S 172 x(side)S 170 x(of)S 171 x +(the)S 171 x(wire)S 171 x(\(through)S 172 x(the)S 597 y 4796 X +(protocol\).)S 273 x(While)S 178 x(prior)S 178 x(drafts)S 178 x +(have)S 179 x(included)S 178 x(protocol)S 178 x(functions)S 179 x +(for)S 178 x(control)S 179 x(of)S 178 x(video)S 178 x(digitizers,)S +598 y 4796 X(they)S 176 x(have)S 177 x(been)S 177 x(dropped)S 176 x +(from)S 176 x(this)S 175 x(draft.)S 270 x(The)S 177 x(reason)S 176 x +(for)S 176 x(this)S 176 x(is)S 175 x(that)S 176 x(the)S 177 x +(requirements)S 176 x(of)S 176 x(the)S 598 y 4796 X(video)S 179 x +(community)S 181 x(are)S 180 x(beyond)S 180 x(the)S 180 x(scope)S +179 x(of)S 179 x(this)S 180 x(effort)S 179 x(and)S 180 x(it)S 179 x +(was)S 179 x(felt)S 179 x(that)S 179 x(they)S 180 x(could)S 180 x +(best)S 179 x(be)S 598 y 4796 X(served)S 166 x(by)S 166 x(a)S 166 x +(separate)S 166 x(video)S 166 x(extension.)S 896 y 4796 X(The)S 172 x +(authors)S 173 x(originally)S 173 x(intended)S 173 x(to)S 172 x +(provide)S 173 x(access)S 172 x(to)S 172 x(high)S 173 x(level)S 173 x +(image)S 173 x(enhancement)S 173 x(functions)S 598 y 4796 X(on)S +178 x(the)S 179 x(server)S 179 x(via)S 179 x(the)S 179 x(protocol.)S +275 x(Because)S 178 x(of)S 179 x(the)S 179 x(enormous)S 179 x(set)S +178 x(of)S 178 x(such)S 179 x(functions)S 179 x(\(unboun)S 2 x +(ded\),)S 598 y 4796 X(and)S 183 x(because)S 184 x(architecturally)S +184 x(it)S 183 x(was)S 183 x(felt)S 183 x(that)S 183 x(high)S 185 x +(level)S 183 x(image)S 184 x(function)S 184 x(packagin)S 2 x(g)S +183 x(belonged)S 598 y 4796 X(closer)S 171 x(to)S 171 x(the)S 172 x +(application,)S 173 x(the)S 172 x(protocol)S 172 x(has)S 171 x +(shifted)S 171 x(to)S 171 x(support)S 172 x(lower)S 171 x(level)S +172 x(image)S 172 x(functions.)S 261 x(The)S 597 y 4796 X(higher)S +170 x(level)S 170 x(packaging)S 171 x(of)S 169 x(these)S 170 x +(functions)S 170 x(has)S 169 x(been)S 170 x(pushed)S 169 x(back)S +170 x(across)S 169 x(the)S 170 x(wire)S 169 x(to)S 169 x(the)S 170 x +(tool)S 169 x(kit)S 598 y 4796 X(level.)S 250 x(The)S 158 x(X)S 158 x +(Image)S 157 x(Extension)S 159 x(T)S -46 x(ool)S 158 x(Kit)S 157 x +(document)S 158 x(provides)S 158 x(an)S 159 x(exemplary)S 158 x(set)S +158 x(of)S 157 x(application)S 158 x(level)S 598 y 4796 X(image)S +168 x(display)S 168 x(and)S 168 x(enhan)S 2 x(cement)S 168 x +(processing)S 169 x(services)S 168 x(which)S 169 x(can)S 168 x(be)S +169 x(built)S 168 x(upon)S 169 x(the)S 168 x(core)S 169 x(X1)S -28 x +(1)S 168 x(and)S 598 y 4796 X(X)S 165 x(Image)S 166 x(Extension)S +167 x(protocols.)S 896 y 4796 X(The)S 172 x(position)S 172 x(on)S +173 x(server)S 172 x(storage)S 172 x(devices)S 173 x(has)S 172 x +(not)S 172 x(chang)S 2 x(ed)S 172 x(-)S 172 x(the)S 172 x(extension)S +173 x(does)S 171 x(not)S 173 x(acknowledge)S 598 y 4796 X(the)S 166 x +(existence)S 166 x(or)S 166 x(usage)S 167 x(of)S 166 x(such)S 166 x +(devices)S 166 x(\(including)S 167 x(the)S 166 x(issue)S 166 x(of)S +166 x(storage)S 166 x(formats\).)S 249 x(The)S 166 x(use)S 166 x(of)S +166 x(such)S 598 y 4796 X(devices)S 182 x(is)S 181 x(at)S 182 x(the)S +182 x(discretion)S 182 x(of)S 182 x(server)S 183 x(implementors.)S +281 x(It)S 181 x(is)S 182 x(possible)S 181 x(that)S 181 x(storage)S +183 x(devices)S 182 x(and)S 597 y 4796 X(formats)S 165 x(may)S 166 x +(appear)S 166 x(at)S 166 x(the)S 166 x(toolkit)S 166 x(level.)S 897 y +4796 X(In)S 168 x(an)S 168 x(effort)S 168 x(to)S 167 x(reduce)S 169 x +(the)S 168 x(image)S 169 x(extension)S 168 x(display)S 168 x +(services,)S 169 x(representation)S 168 x(and)S 169 x(display)S 167 x +(of)S 168 x(tiled)S 598 y 4796 X(images)S 174 x(were)S 174 x +(removed)S 175 x(from)S 175 x(the)S 174 x(protocol.)S 267 x(It)S +174 x(was)S 174 x(felt)S 174 x(that)S 174 x(there)S 175 x(is)S 174 x +(suf)S +(\211cient)S 175 x(machinery)S 176 x(in)S 175 x(the)S 598 y 4796 X +(core)S 173 x(protocol)S 174 x(to)S 173 x(support)S 174 x(this)S +173 x(from)S 173 x(the)S 174 x(client)S 173 x(side.)S 264 x(T)S -12 x +(iled)S 173 x(image)S 174 x(support)S 173 x(is)S 173 x(likely)S 175 x +(to)S 173 x(be)S 173 x(another)S 597 y 4796 X(issue)S 165 x(for)S +166 x(the)S 167 x(tool)S 165 x(kit.)S 35879 Y 22577 X F40 +(APPENDICES)S 447 x(9\2031)S -24 x(1)S +PP +EP +%%DOC$Page: 9-12 101 +1000 BP 39600 30600 PM 0 0 XY +5246 Y 3600 X F28(9.4.2)S 599 x(V1.0)S 167 x(-)S 166 x(V2.0)S 166 x +(Protocol)S 167 x(Changes)S 6342 Y 4796 X F151(Many)S 171 x +(signi\211cant)S 171 x(protocol)S 171 x(changes)S 171 x(were)S 171 x +(made)S 170 x(between)S 170 x(v1.0)S 172 x(and)S 170 x(v2.0.)S 260 x +(These)S 170 x(were)S 171 x(based)S 170 x(upon)S 597 y 4796 X(the)S +161 x(above)S 163 x(conceptual)S 162 x(chang)S 2 x(es,)S 162 x +(comments)S 162 x(from)S 162 x(reviewers,)S 163 x(and)S 162 x(a)S +161 x(gener)S 2 x(al)S 161 x(effort)S 162 x(to)S 161 x(trim)S 162 x +(down)S 161 x(the)S 598 y 4796 X(protocol)S 166 x(extension)S 166 x +(and)S 167 x(make)S 166 x(it)S 166 x(more)S 166 x(compliant)S 166 x +(with)S 165 x(the)S 167 x(core)S 166 x(x)S 167 x(philosophy)S -55 x +(.)S 8733 Y 4796 X F152(Minimality)S 166 x(and)S 166 x(Organization)S +167 x(of)S 166 x(Protocol)S 896 y 4796 X F151(W)S -28 x(e)S 170 x +(received)S 171 x(many)S 171 x(complaints)S 170 x(regarding)S 172 x +(the)S 170 x(size)S 170 x(of)S 170 x(the)S 170 x(protocol)S 171 x +(\(number)S 170 x(of)S 171 x(functions\),)S 172 x(the)S 170 x(or-)S +598 y 4796 X(ganization)S 168 x(of)S 169 x(the)S 169 x(protocol)S +168 x(\(function)S 170 x(classes\))S -2 x(,)S 170 x(and)S 169 x(the)S +168 x(level)S 169 x(of)S 169 x(complexity)S 169 x(of)S 169 x +(operations)S 168 x(required)S 598 y 4796 X(of)S 170 x(the)S 170 x +(server)S -36 x(.)S 258 x(W)S -28 x(e)S 170 x(undertook)S 172 x(to)S +170 x(reduce)S 171 x(in)S 170 x(level)S 171 x(and)S 171 x(extent)S +170 x(the)S 171 x(contents)S 170 x(of)S 170 x(the)S 171 x(protocol,)S +172 x(as)S 170 x(well)S 597 y 4796 X(as)S 165 x(to)S 166 x +(meaningfully)S 168 x(reorganize)S 166 x(it.)S 250 x(The)S 166 x +(salient)S 166 x(points)S 166 x(and)S 166 x(reasoning)S 167 x(are)S +166 x(discussed)S 166 x(below)S -47 x(.)S 897 y 4796 X(The)S 169 x +(video)S 170 x(functions)S 169 x(\(those)S 169 x(which)S 169 x +(involv)S 2 x(ed)S 169 x(a)S 169 x(digitizer\))S 168 x(have)S 170 x +(been)S 170 x(completely)S 169 x(removed)S 170 x(from)S 169 x(the)S +598 y 4796 X(speci\211cation.)S 270 x(Our)S 177 x(feeling)S 177 x +(is)S 176 x(that)S 176 x(the)S 177 x(needs)S 176 x(of)S 176 x(the)S +177 x(video)S 177 x(community)S 177 x(are)S 177 x(better)S 176 x +(served)S 177 x(by)S 177 x(the)S 598 y 4796 X(video)S 175 x +(extension)S 176 x(and)S 176 x(that)S 175 x(a)S 175 x(connection)S +176 x(between)S 175 x(video)S 176 x(and)S 175 x(digital)S 176 x +(image)S 175 x(processing)S 176 x(can)S 175 x(occur)S 597 y 4796 X +(through)S 167 x(pixmaps)S 166 x(in)S 166 x(the)S 166 x(core)S 167 x +(server)S -36 x(.)S 897 y 4796 X(W)S -28 x(e)S 174 x(have)S 176 x +(reduced)S 175 x(the)S 175 x(display)S 174 x(functions)S 175 x(in)S +175 x(the)S 174 x(belief)S 174 x(that)S 175 x(the)S 174 x(core)S +175 x(display)S 175 x(functions)S 175 x(are)S 174 x(suf\211-)S 598 y +4796 X(cient)S 163 x(in)S 163 x(many)S 163 x(ways)S 163 x(and)S 163 x +(in)S 163 x(that)S 163 x(more)S 163 x(complex)S 163 x(display)S 162 x +(mechanisms)S 163 x(can)S 163 x(be)S 163 x(built)S 163 x(upon)S 163 x +(them)S 163 x(and)S 598 y 4796 X(managed)S 161 x(from)S 161 x(the)S +162 x(client)S 161 x(side)S 161 x(\(toolkit\).)S 249 x(The)S 162 x +(major)S 161 x(exception)S 162 x(to)S 161 x(this)S 161 x(is)S 160 x +(time)S 161 x(sequences)S 162 x(of)S 161 x(images)S 597 y 4796 X +(which)S 166 x(we)S 166 x(feel)S 165 x(require)S 167 x(server)S 167 x +(support)S 166 x(to)S 166 x(work)S 166 x(\(time)S 165 x(sequences)S +167 x(remain\).)S 897 y 4796 X(High)S 171 x(level)S 172 x(class)S +171 x(conversion)S 172 x(\(rendition\))S 172 x(functions)S 172 x +(were)S 171 x(analyzed)S 171 x(and)S 172 x(a)S 171 x(few)S 171 x +(primitive)S 171 x(functions)S 598 y 4796 X(missi)S -2 x(ng)S 183 x +(from)S 181 x(the)S 182 x(original)S 182 x(draft)S 181 x(were)S 181 x +(identi)S +(\211ed)S 182 x(\(most)S 181 x(notably)S 182 x(dither\))S 181 x(and)S +182 x(added.)S 280 x(The)S 182 x(high)S 597 y 4796 X(level)S 184 x +(functions)S 184 x(were)S 184 x(then)S 185 x(deleted)S 183 x +(\(moved)S 185 x(to)S 183 x(the)S 184 x(toolkit\))S 184 x(where)S +184 x(they)S 185 x(can)S 184 x(be)S 184 x(built)S 184 x(upon)S 185 x +(the)S 598 y 4796 X(server)S 166 x(primitives.)S 897 y 4796 X +(Enhancement)S 190 x(and)S 189 x(rendition)S 190 x(functions)S 190 x +(were)S 189 x(reorganized)S 190 x(into)S 189 x(process)S 189 x +(class)S 188 x(functions)S 190 x(due)S 598 y 4796 X(to)S 188 x +(their)S 188 x(similarity)S 188 x(and)S 189 x(their)S 189 x(generic)S +189 x(applicability)S -55 x(.)S 294 x(Thanks)S 189 x(goes)S 189 x +(to)S 188 x(members)S 188 x(of)S 189 x(SUN)S 188 x(who)S 597 y 4796 X +(contributed)S 166 x(insight)S 167 x(into)S 166 x(how)S 166 x(to)S +166 x(meaningfully)S 167 x(reorganize)S 167 x(these)S 166 x +(functions.)S 897 y 4796 X(Across)S 188 x(the)S 190 x(entire)S 190 x +(protocol,)S 196 x(multiple)S 189 x(similar)S 188 x(functions)S 190 x +(which)S 190 x(differed)S 189 x(only)S 191 x(in)S 189 x(terms)S 189 x +(of)S 190 x(an)S 598 y 4796 X(operator)S 167 x(were)S 167 x +(collapsed)S 167 x(\(combined\))S 167 x(by)S 167 x(making)S 168 x +(operator)S 168 x(selection)S 167 x(an)S 167 x(operand.)S 252 x(No)S +168 x(functionality)S 598 y 4796 X(was)S 165 x(lost,)S 166 x(but)S +166 x(the)S 166 x(protocol)S 166 x(is)S 166 x(easier)S 166 x(to)S +165 x(follow)S 166 x(and)S 166 x(it)S 166 x(may)S 166 x(help)S 166 x +(to)S 166 x(organize)S 167 x(the)S 166 x(implementations.)S 24872 Y +4796 X F152(Use)S 166 x(of)S 166 x(Core)S 166 x(Resources)S 897 y +4796 X F151(Unessential)S 173 x(extension)S 175 x(resources)S 174 x +(\(IEC,)S 173 x(IRC,)S 174 x(IDC\))S 173 x(have)S 175 x(been)S 174 x +(deleted)S 174 x(completely)S 174 x(in)S 174 x(favor)S 175 x(of)S +173 x(in)S 597 y 4796 X(line)S 166 x(parameters.)S 897 y 4796 X(W)S +-28 x(e've)S 171 x(made)S 171 x(use)S 172 x(of)S 171 x(the)S 171 x +(core)S 172 x(resource)S 172 x(GC)S 170 x(as)S 171 x(is)S 171 x +(where)S 171 x(necessary)S 172 x(versus)S 172 x(reinventing)S 173 x +(some)S 171 x(of)S 171 x(its)S 598 y 4796 X(contents)S 166 x(in)S +166 x(extension)S 167 x(speci\211c)S 166 x(resources.)S 29056 Y +4796 X F152(Error)S 166 x(Codes)S 897 y 4796 X F151(W)S -28 x(e)S +165 x(have)S 166 x(removed)S 166 x(all)S 166 x(extension)S 166 x +(speci\211c)S 165 x(error)S 166 x(codes)S 165 x(and)S 166 x(are)S +166 x(now)S 165 x(making)S 166 x(use)S 166 x(of)S 165 x(core)S 166 x +(error)S 166 x(codes)S 598 y 4796 X(only)S -55 x(.)S 31746 Y 4796 X +F152(Connect)S 167 x(Information)S 897 y 4796 X F151(All)S 166 x +(core)S 167 x(X)S 167 x(redundant)S 168 x(connect)S 167 x(time)S +167 x(information)S 167 x(has)S 167 x(been)S 167 x(removed)S 168 x +(and)S 167 x(all)S 166 x(unn)S 2 x(ecessary)S 167 x(protocol)S 598 y +4796 X(information)S 166 x(\(such)S 166 x(as)S 166 x(session_id\))S +165 x(has)S 166 x(been)S 166 x(removed.)S 35879 Y 3600 X F40 +(9\20312)S 449 x(APPENDICES)S +PP +EP +%%DOC$Page: 9-13 102 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(W)S -28 x(e've)S 174 x(changed)S 175 x +(XIT_SUPPORT_VEC)S -2 x(TOR)S 173 x(to)S 174 x(XIT_FUNCTION_VE)S +-2 x(CTOR)S 173 x(to)S 174 x(re\212ect)S 174 x(what)S 173 x(func-)S +598 y 4796 X(tions)S 170 x(\(as)S 170 x(opposed)S 170 x(to)S 171 x +(service)S 171 x(classes\))S 169 x(are)S 171 x(provided)S 171 x(by)S +171 x(the)S 171 x(server)S -36 x(.)S 258 x(The)S 172 x(service)S +171 x(class)S 170 x(will)S 170 x(provide)S 597 y 4796 X(guidelines)S +166 x(to)S 166 x(the)S 166 x(the)S 166 x(classi\211cation)S 166 x +(of)S 166 x(requests.)S 7556 Y 4796 X F152(IOB)S 164 x(Data)S 166 x +(Formats)S 897 y 4796 X F151(It)S 188 x(became)S 190 x(clear)S 190 x +(that)S 189 x(while)S 189 x(positive)S 189 x(integral)S 191 x(data)S +189 x(values)S 190 x(for)S 189 x(image)S 190 x(data)S 189 x(on)S +190 x(the)S 189 x(wire)S 189 x(was)S 597 y 4796 X(acceptable,)S 171 x +(it)S 169 x(would)S 170 x(be)S 169 x(insuf\211cient)S 171 x(for)S +170 x(many)S 170 x(server)S 170 x(protocol)S 170 x(functions.)S 257 x +(As)S 169 x(such,)S 172 x(the)S 170 x(extension)S 598 y 4796 X(has)S +157 x(de\211ned)S 158 x(a)S 157 x("constrained")S 157 x(and)S 158 x +("unconstrained")S 158 x(IOB)S 156 x(type)S 157 x(\(which)S 158 x +(translates)S 157 x(roughly)S 159 x(to)S 157 x(positive)S 598 y +4796 X(integral)S 189 x(and)S 188 x(positive/negativ)S 2 x(e)S 188 x +(\212oat)S 189 x(-)S 188 x(see)S 188 x(chapter)S 189 x(on)S 189 x +(server)S 189 x(data)S 188 x(model\).)S 294 x(It)S 188 x(now)S 188 x +(includes)S 598 y 4796 X(facilities)S 165 x(for)S 166 x(managing)S +167 x(these)S 166 x(data)S 166 x(types.)S 12039 Y 4796 X F152(Color)S +165 x(Space)S 167 x(Support)S 897 y 4796 X F151(The)S 172 x(initial)S +172 x(spec)S 172 x(called)S 172 x(for)S 172 x(multiple)S 172 x +(color)S 173 x(space)S 171 x(support)S 172 x(on)S 173 x(the)S 172 x +(server)S 173 x(\(rgb,)S 175 x(yuv)S -54 x(,)S 174 x(cie)S 172 x +(luv)S 173 x(...\).)S 263 x(As)S 597 y 4796 X(current)S 174 x +(display)S 174 x(devices)S 174 x(are)S 174 x(primarily)S 174 x(rgb)S +175 x(\(yuv)S 175 x(may)S 174 x(begin)S 175 x(to)S 173 x(appear)S +174 x(due)S 174 x(to)S 174 x(digital)S 174 x(tv)S -55 x(,)S 176 x +(but)S 174 x(not)S 598 y 4796 X(today\),)S 171 x(the)S 171 x +(decision)S 170 x(was)S 169 x(made)S 170 x(to)S 170 x(push)S 170 x +(alternate)S 171 x(color)S 170 x(space)S 170 x(support)S 170 x(back)S +171 x(across)S 169 x(the)S 171 x(wire)S 170 x(into)S 598 y 4796 X +(the)S 178 x(toolkit)S 177 x(\(along)S 179 x(with)S 177 x(color)S +178 x(correction\).)S 274 x(For)S 178 x(now)S -45 x(,)S 181 x(wire)S +177 x(transport)S 178 x(and)S 178 x(server)S 178 x(processing)S 178 x +(will)S 598 y 4796 X(only)S 166 x(support)S 166 x(rgb)S 167 x(color)S +166 x(images.)S 16522 Y 4796 X F152(Pipelines)S 897 y 4796 X F151 +(The)S 166 x(pipeline)S 166 x(TBS)S 166 x(has)S 166 x(been)S 167 x +(replaced)S 166 x(with)S 165 x(actual)S 167 x(protocol)S 166 x +(functions.)S 35879 Y 22553 X F40(APPENDI)S -2 x(CES)S 449 x +(9\20313)S +PP +EP +%%DOC$Page: 9-14 103 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(9.5)S 599 x(References)S 6688 Y 4796 X F102(1.)S +239 x(X)S 239 x(Window)S 240 x(System)S 239 x(Protocol,)S 241 x +(Version)S 239 x(11)S 449 y 5513 X(Alpha)S 239 x(Test,)S 240 x +(February)S 240 x(1987)S 240 x(-)S 239 x(Robert)S 239 x(W.)S 240 x +(Scheifler)S 8183 Y 4796 X(2.)S 239 x(CCITT)S 239 x(T.4)S 747 y +5991 X("Standardizatio)S 2 x(n)S 239 x(of)S 239 x(Group)S 240 x(3)S +239 x(Facsimile)S 240 x(Apparatus)S 240 x(for)S 239 x(Document)S +240 x(Transmission)S 2 x(")S 747 y 5035 X(Defines)S 239 x(general)S +240 x(device)S 240 x(capabilities,)S 240 x(and)S 240 x(defines)S +240 x(tables)S 449 y 5035 X(and)S 239 x(algorithms)S 240 x(for)S +240 x(one-)S 239 x(and)S 240 x(two-dimensional)S 240 x(coding)S 240 x +(schemes,)S 448 y 5035 X(as)S 239 x(well)S 239 x(as)S 240 x(scheme)S +239 x(for)S 240 x("uncompressed)S 240 x(data.")S 747 y 4796 X(3.)S +239 x(CCITT)S 239 x(T.6)S 747 y 5991 X("Facsimile)S 240 x(Coding)S +240 x(Schemes)S 240 x(and)S 239 x(Coding)S 240 x(Control)S 240 x +(Functions)S 449 y 6230 X(for)S 240 x(Group)S 239 x(4)S 239 x +(Facsimile)S 240 x(Apparatus")S 747 y 5035 X(Defines)S 239 x(coding)S +240 x(tables)S 240 x(and)S 239 x(algorithm)S 240 x(for)S 240 x(two)S +239 x(dimension)S 448 y 5035 X(encoding)S 240 x(used)S 239 x(in)S +239 x(G4)S 240 x(fax.)S 747 y 4796 X(4.)S 239 x(CCITT)S 239 x(T.73)S +747 y 5991 X("Document)S 240 x(Interchange)S 240 x(Protocol)S 240 x +(for)S 240 x(the)S 239 x(Telematic)S 240 x(Services")S 748 y 5035 X +(Defines)S 239 x(document)S 240 x(interchange)S 241 x(protocol)S +240 x(for)S 239 x(use)S 239 x(above)S 448 y 5035 X(the)S 239 x +(session)S 240 x(services)S 240 x(layer)S 239 x(used)S 240 x(by)S +239 x(teletex)S 240 x(and)S 239 x(G4)S 240 x(fax.)S 747 y 4796 X(5.)S +239 x(ISO)S 239 x(DPX3)S 747 y 5991 X("Photographic)S 240 x(Image)S +240 x(Coding")S 748 y 6230 X(Defines)S 240 x(algorithms)S 240 x(for)S +240 x(encoding)S 239 x(continuous)S 241 x(tone)S 239 x(photographic)S +448 y 6230 X(images)S 240 x(for)S 239 x(character)S 240 x(protocol)S +240 x(terminal)S 240 x(services)S 240 x(\(videotex\).)S 747 y 4796 X +(6.)S 239 x(Digital)S 240 x(Image)S 239 x(Processing)S 448 y 5513 X +(William)S 240 x(K.)S 239 x(Pratt)S 449 y 5513 X(John)S 239 x(Wiley)S +240 x(&)S 239 x(Sons)S 240 x(-)S 239 x(1978)S 747 y 4796 X(7.)S 239 x +(Digital)S 240 x(Image)S 239 x(Processing)S 448 y 5513 X(Rafael)S +240 x(Gonzales)S 239 x(and)S 240 x(Paul)S 239 x(Wintz)S 449 y 5513 X +(Addison)S 240 x(Wesley)S 239 x(-)S 240 x(1987)S 747 y 4796 X(8.)S +239 x(Digital)S 240 x(Picture)S 239 x(Processing)S 448 y 5513 X +(Azriel)S 240 x(Rosenfeld)S 240 x(and)S 239 x(Avinash)S 240 x(Kak)S +448 y 5513 X(Academic)S 240 x(Press)S 239 x(-)S 240 x(1982)S 748 y +4796 X(9.)S 239 x(Image)S 239 x(Algebra)S 240 x(Project)S 240 x +(Publications)S 448 y 5513 X(Computer)S 240 x(Vision)S 239 x +(Laboratory)S 448 y 5513 X(University)S 240 x(of)S 239 x(Florida,)S +240 x(Gainesville)S 747 y 5513 X(Department)S 240 x(of)S 239 x(The)S +240 x(Air)S 239 x(Force)S 449 y 5513 X(Air)S 239 x(Force)S 240 x +(Armament)S 240 x(Laboratory)S 448 y 5513 X(Eglin)S 239 x(Air)S 240 x +(Force)S 239 x(Base,)S 240 x(Florida)S 35879 Y 3600 X F40(9\20314)S +449 x(APPENDICES)S +PP +EP +%%Trailer +EndDVC$PSDoc +%%DocumentFonts: Helvetica-Bold@DOCPSE Helvetica@DOCPSE +%%+NewCenturySchlbk-Roman@DOCPSE Courier@DOCPSE +%%+NewCenturySchlbk-Italic@DOCPSE +%%Pages 103 diff --git a/xie/docs/x11r4/protocol.txt b/xie/docs/x11r4/protocol.txt new file mode 100644 index 0000000..8716450 --- /dev/null +++ b/xie/docs/x11r4/protocol.txt @@ -0,0 +1,4436 @@ +X IMAGE EXTENSION PROTOCOL + + +Revision/Update Information: V2.1 + + + + +Digital Equipment Corporation + Contents + + PREFACE v + +CHAPTER 1 INTRODUCTION 1–1 + 1.1 SCOPE AND PURPOSE 1–1 + 1.2 TERMINOLOGY 1–1 + 1.3 CONCEPTS RELATIONSHIP 1–1 + +CHAPTER 2 PROTOCOL MESSAGE FORMATS 2–1 + 2.1 REQUEST PROTOCOL MESSAGE FORMAT 2–1 + 2.2 REPLY PROTOCOL MESSAGE FORMAT 2–2 + 2.3 ERROR PROTOCOL MESSAGE FORMAT 2–2 + 2.4 EVENT PROTOCOL MESSAGE FORMAT 2–3 + 2.5 DATA ENCODING 2–4 + +CHAPTER 3 PROTOCOL SPECIFICATION SYNTAX 3–1 + 3.1 GENERAL SYNTAX 3–1 + 3.2 REQUEST SYNTAX 3–1 + 3.3 ERROR SYNTAX 3–2 + 3.4 EVENT SYNTAX 3–3 + +CHAPTER 4 PROTOCOL PARAMETER TYPES 4–1 + 4.1 CORE TYPES 4–1 + 4.2 EXTENSION TYPES 4–1 + +CHAPTER 5 PROTOCOL ERROR CODES 5–1 + 5.1 CORE ERRORS 5–1 + 5.2 EXTENSION ERRORS 5–2 + +CHAPTER 6 SERVER DATA MODEL 6–1 + 6.1 CONSTRAINED VS UNCONSTRAINED 6–1 + 6.2 MONO VS POLY CHROMATIC 6–3 + 6.3 DATA FLOW PIPELINING 6–3 + + + + + iii + Contents + + +CHAPTER 7 REQUESTS AND REPLIES 7–1 + 7.1 SESSION SERVICES 7–2 + 7.1.1 Initialize Session 7–2 + 7.1.1.1 Per Server information • 7–3 + 7.1.1.2 Per Screen Information • 7–3 + 7.1.1.3 Relationship to Core Session Information • 7–3 + 7.1.2 Set Operational Defaults 7–4 + 7.1.3 Query Operational Defaults 7–5 + 7.1.4 Terminate Session 7–6 + 7.2 RESOURCE SERVICES 7–7 + 7.2.1 Resource Creation 7–7 + 7.2.1.1 Image Object Resource • 7–8 + 7.2.1.2 Domain Control Context Resource • 7–9 + 7.2.1.3 Process Control Context Creation • 7–11 + 7.2.2 Resource Copy 7–12 + 7.2.3 Resource Delete 7–12 + 7.2.4 Resource Query 7–13 + 7.2.4.1 Image Object Query • 7–13 + 7.2.4.2 Domain Control Context Query • 7–14 + 7.2.4.3 Process Control Context Query • 7–15 + 7.2.5 Import/Export Services 7–15 + 7.2.5.1 Import Image • 7–16 + 7.2.5.2 Export Image • 7–17 + 7.3 TRANSPORT SERVICES 7–18 + 7.3.1 Overview of Data Transport 7–18 + 7.3.1.1 Transport Process • 7–18 + 7.3.1.2 Transport Modes • 7–19 + 7.3.1.3 Transport Data Formats • 7–19 + 7.3.1.4 Transport Granularity & Atomicity • 7–21 + 7.3.1.5 Synchronization • 7–22 + 7.3.2 Set Transport Context 7–22 + 7.3.3 Tile Data Transport 7–23 + 7.3.3.1 Client–>Server • 7–23 + 7.3.3.2 Server–>Client • 7–25 + 7.3.4 Stream Data Transport 7–26 + 7.3.4.1 Client–>Server • 7–27 + 7.3.4.2 Server–>Client • 7–28 + 7.3.5 Abort Transport 7–30 + 7.4 PROCESS SERVICES 7–31 + 7.4.1 Point Processing 7–33 + 7.4.2 Area Processing 7–35 + 7.4.3 Ensemble Processing 7–37 + 7.4.3.1 Arithmetic • 7–37 + 7.4.3.2 Relational • 7–38 + 7.4.3.3 Logical • 7–39 + 7.4.3.4 Mathematical • 7–40 + + + + +iv + Contents + + + 7.4.4 Geometric 7–42 + 7.4.4.1 Crop Image • 7–42 + 7.4.4.2 Translate Image • 7–43 + 7.4.4.3 Scale Image • 7–44 + 7.4.4.4 Rotate Image • 7–45 + 7.4.4.5 Mirror Image • 7–46 + 7.4.5 Radiometric 7–47 + 7.4.5.1 Constrain • 7–47 + 7.4.5.2 Histogram Matching • 7–48 + 7.4.5.3 Separate Spectral Components • 7–49 + 7.4.5.4 Combine Spectral Components • 7–49 + 7.4.5.5 Dither • 7–50 + 7.4.5.6 Luminance • 7–51 + 7.5 STATISTICS SERVICES 7–52 + 7.5.1 Component Distribution 7–52 + 7.5.2 Point Statistics 7–53 + 7.5.3 Area Statistics 7–54 + 7.6 PROCESS CONTROL SERVICES 7–55 + 7.6.1 Adding Segments 7–55 + 7.6.2 Executing a Pipe 7–56 + 7.6.3 Terminating a Pipe 7–57 + 7.7 DISPLAY SERVICES 7–58 + 7.8 EVENT SERVICES 7–59 + 7.8.1 Select Events 7–59 + 7.8.2 Query Events 7–59 + +CHAPTER 8 EVENTS 8–1 + 8.1 COMPUTATION COMPLETE 8–1 + 8.2 PIPELINE COMPLETE 8–1 + 8.3 SEQUENCE COMPLETE 8–2 + +CHAPTER 9 APPENDICES 9–1 + 9.1 XIE PROTOCOL SUMMARY 9–1 + 9.2 RECOMMENDED SERVER RESOURCE CONTENTS 9–3 + 9.2.1 IOB 9–3 + 9.2.2 IDC 9–4 + 9.2.3 IPC 9–5 + 9.3 IMAGE DATA ATTRIBUTES & ORGANIZATION 9–6 + 9.3.1 Primitive Attributes 9–7 + 9.3.2 Organization & Encoding Attributes 9–7 + 9.3.2.1 Encoding Attributes • 9–8 + 9.3.2.2 Component Space Attributes • 9–8 + 9.3.3 Presentation Attributes 9–10 + 9.4 CONCEPT AND VERSION CHANGES 9–11 + 9.4.1 Conceptual Changes 9–11 + + + + v + Contents + + + 9.4.2 V1.0 - V2.0 Protocol Changes 9–12 + 9.5 REFERENCES 9–14 + + + + +vi + Preface + + + The core X architecture is a major step in the de�nition of open, interactive applications + display services. It has, in essence, pried apart the tightly coupled, private interconnect which + has existed in the past between application and display subsystem by specifying a structured + set of display services. + The core X protocol recognizes the need for minimally suf�cient capabilities, and, as such, + leaves the speci�cation of robust application domain speci�c display services to extension + packages. These extension packages relate to the core X protocol by way of an extension + mechanism speci�ed in the core X protocol. + This document contains the X wire protocol speci�cation for the proposed X Image Extension + Package. It is assumed that the reader is familiar with the core X architecture, the X11 wire + protocol, and the proposed X Image Extension Concepts. + + + +Related Documents + • The X Window System (Scheifler & Gettys) + Provides an overview of the X windowing system and architecture. + • X11 Window System Protocol + Describes the core X11 protocol and conventions used in specifying extension packages. + • X Extension Package Guidelines + Sets forth guidelines for extension packages. + • X Image Extension Concepts + Describes the architectural concepts behind this protocol speci�cation. The X Image + Extension Concepts document is one several companion documents to this protocol speci�- + cation. + • X Image Extension Server Guidelines + Provides an overview of the design of an image extension server. The X Image Extension + Server Guidelines document is one of several companion documents to this protocol + speci�cation. + + + +Participants + • Author: + • Joseph Mauro + • Digital Equipment Corporation + • MS: MK2-2/K5 + • Continental Blvd. + • Merrimack, New Hampshire 03057 + + + v + Preface + + + • 603-884-0528 + • MAURO@OPTIC.DEC.COM + + • Contributors: + • Olliver Jones (Apollo) + • Barry Medoff (SUN) + • John Weber (Digital ISG) + • Rich Piccolo (Digital ISG) + • Robert Shelley (Digital ISG) + + • Invited Reviewers: + • Rebeca Hinkle (Apollo) + + + +Revision History + + rev v1.0 August 1, 1988 �rst protocol draft + rev v2.0 April 12, 1989 major changes based upon consortia review + rev v2.1 November 1, 1989 changes based upon FT1 implementation + + + +Organization + This document is organized into the following chapters and appendices: + • Chapter 1, Introduction, explains the purpose of the X Image Extension + • Chapter 2, Protocol Message Formats, de�nes structure of protocol messages + • Chapter 3, Protocol Speci�cation Syntax, de�nes protocol function syntax + • Chapter 4, Protocol Parameter Types, de�nes types for protocol parameters + • Chapter 5, Protocol Error Codes, de�nes possible protocol errors + • Chapter 6, Server Data Model, server data organization and operator issues + • Chapter 7, Requests and Replies, describes the main protocol functions + • Chapter 8, Events, describes the various extension related events + • Appendices: + • XIE Protocol Summary + • Recommended Server Resource Contents + • Image Data Attributes & Organization + • Concept and Version Changes + • References + + + + +vi + Chapter 1 + +INTRODUCTION + + + +1.1 Scope and Purpose + + This document speci�es the X wire protocol for the X Image Extension (XIE). This extension + protocol is deemed to be suf�cient to support implementation of the image concepts found in + the X Image Extension Concepts document. This speci�cation de�nes the syntax, structure, + and semantics of X wire image extension protocol elements. + This speci�cation does not contain any background material useful in understanding the + imaging services concepts that the extension protocol enables. This background material can + be found in the extension concepts document. + This speci�cation does not contain any language function bindings. These will be left to a + follow on document which will specify the language bindings for the X Image Extension to Xlib + (XIElib). + +1.2 Terminology + + This speci�cation makes use of two classes of terminology: descriptive image terminology, + and parametric terminology. The descriptive image terminology is de�ned in a glossary in + the X Image Extension Concepts document and is used throughout this protocol speci�cation. + Readers should consider reviewing this material before reading this document. + The parametric terminology de�nes the parameter types recognized in the core X11 protocol + and in the image extension protocol. Image extension protocol types are de�ned in this + document. + +1.3 Concepts Relationship + + The X Image Extension Concepts document describes the reasoning behind an X image + extension and lays the foundation for this protocol speci�cation. Conceptual shifts since the + concepts document was drafted, and major protocol differences between versions 1 and 2 of + this speci�cation are briefly described in the "concept and version changes" appendix. While + there have been protocol changes between version 2.0 and 2.1 (deriving from the �eld test + implementation), they do not reflect major conceptual shifts. + + + + + INTRODUCTION 1–1 + Chapter 2 + +PROTOCOL MESSAGE FORMATS + + + XIEP follows the same operational model as set forth by the X core protocol speci�cation + regarding the use of requests, replies, errors, and events, and the overall structure of these + protocol objects. This section de�nes the overall structure of these protocol objects for the + image extension protocol. + +2.1 Request Protocol Message Format + + All image extension requests comply with the overall extension request format as speci�ed in + the X11 core protocol speci�cation request format section. This section reiterates that format + as applied to the image extension. + An image extension request consists of 4 bytes of header followed by zero or more bytes of + data. The four byte header complies exactly with the core protocol request format (1 byte + major opcode - 1 byte minor opcode - 2 bytes total length �eld). Unused bytes in a request are + not required to be zero. + + REQUEST FORMAT + -------------- + BYTE CONTENTS + 0 major opcode + 1 minor opcode - extension function code + 2 length field (LSB) + 3 length field (MSB) + 4 start of data - (request specific) + . + . + . + + The major opcode �eld contains the opcode signaling a request for the image extension package + (between 128 and 255). The value is determined by the core X server when the extension is + loaded. All discussion of minor opcodes in this document refer to image extension requests (op + codes) where the major opcode is that for the image extension. + The minor opcode �eld contains the image function code. Individual image extension function + codes will be found in the image extension server guide. + + + + + PROTOCOL MESSAGE FORMATS 2–1 + The length �eld de�nes the total length of the request including header and data in units of 4 + bytes. The length �eld must equal the minimum length required to contain the request or an + error is generated. The particular contents of the data �eld portion of a request are de�ned on + a request by request basis (see requests section). + Every request is implicitly assigned a sequence number, starting with one, used in replies, + errors, and events. {This sequence number is the one assigned by the core server - the exten- + sion does not assign any sequence number, but rather relies upon the core assigned sequence + number} + +2.2 Reply Protocol Message Format + + The reply format follows that speci�ed in the core protocol (below). The particular contents of + the data portion of a reply are de�ned on a request by request basis (see requests section). + Every reply contains a 32-bit length �eld expressed in units of 4 bytes. Every reply consists + of 32 bytes, followed by zero or more additional bytes of data, as speci�ed in the length �eld. + Unused bytes within a reply are not guaranteed to be zero. Every reply also contains the least + signi�cant 16 bits of the sequence number of the corresponding request. + + REPLY FORMAT + ------------ + BYTE CONTENTS + 0 reply type msg (value = 1) + 1 unused + 2 request sequence number + 3 request sequence number + 4 length field + 5 length field + 6 length field + 7 length field + 8 start of data - (request specific) + . + . + . + + + +2.3 Error Protocol Message Format + + The error format follows that speci�ed in the core protocol (below). + Error reports are 32 bytes long. Unused bytes within an error report are not guaranteed to + be zero. Every error report includes the 8-bit major opcode, the 8 bit minor opcode (extension + function), and the 8 bit error code. + + ERROR FORMAT + ------------ + BYTE CONTENTS + + + + +2–2 PROTOCOL MESSAGE FORMATS + 0 error type msg (value = 0) + 1 error code + 2 request sequence number + 3 request sequence number + 4 unused + 5 unused + 6 unused + 7 unused + 8 minor opcode - extension function code + 9 minor opcode - extension function code + 10 major opcode + + The major and minor (function code) opcodes, are those of the request which generated the + error. The request sequence number is the least signi�cant 16 bits of the number implicitly + assigned to the request which generated the error. + For the following errors (see Section n), the failing resource id is also returned: + • Core Protocol Errors + • Colormap + • Cursor + • Drawable + • Font + • GContext + • IDChoice + • Pixmap + • Window + + For Atom errors, the failing atom is returned. For Value errors, the failing value is returned. + +2.4 Event Protocol Message Format + + The event format follows that speci�ed in the core protocol (below). + Events are 32 bytes long. Unused bytes within an event are not guaranteed to be zero. Every + event contains an 8-bit type code. The most signi�cant bit in this code is set if the event was + generated from a SendEvent request. + The image extension related events use event codes assigned by the core server at extension + load time. Every core event (with the exception of KeymapNotify) also contains the least + signi�cant 16 bits of the sequence number of the last request issued by the client that was (or + is currently being) processed by the server. Image extension events also include the request + sequence number. + + EVENT FORMAT + ------------ + BYTE CONTENTS + 0 event type code (value = ) + 1 request sequence number + 2 request sequence number + + + + + PROTOCOL MESSAGE FORMATS 2–3 + 2.5 Data Encoding + + Except where explicitly noted in the protocol, all 16 bit and 32 bit quantities exchanged + between client and server must be transmitted with the byte order established at CORE + protocol connection time. (see core protocol connection setup - X11 spec.). In particular... + + "The client must send an initial byte of data to identify the byte order to be + employed. The value of the byte must be octal 102 or 154. The value 102 (ASCII + upper case B) means values are transmitted most significant byte first, and + value 154 (ASCII lower case l) means values are transmitted least significant + byte first. Except where explicitly noted in the protocol, all 16-bit and + 32-bit quantities sent by the client must be transmitted with this byte order, + and all 16-bit and 32-bit quantities returned by the server will be transmitted + with this byte order." + + + + +2–4 PROTOCOL MESSAGE FORMATS + Chapter 3 + +PROTOCOL SPECIFICATION SYNTAX + + + This section presents syntactic conventions adhered to throughout the speci�cation. All + protocol functions (requests, replies, errors, events) are speci�ed according to this syntax. + +3.1 General Syntax + + In general, the extension package follows the X11 protocol syntax conventions. + + The syntax {...} encloses a set of alternatives. + + The syntax [...] encloses a set of structure components. + + TYPE’s are in upper case, and Alternative Values are capitalized. + +3.2 Request Syntax + + Requests (and the associated replies) are described in this document in a uniform fashion. + There are �ve major sections to a request description: + 1. request "procedure declaration" + 2. errors + 3. events + 4. overall description + + The �rst three are speci�ed in a brief BNF like format. The overall description is in English + prose and follows the �rst three. + Each request description begins with a "procedure declaration" like de�nition consisting of the + request name, argument names and types, and optional reply information. All image extension + requests have a common name pre�x (XIEP_). The arguments constitute the optional data + described in the request protocols on a protocol function by protocol function basis. Note that + the order of arguments complies with their actual order in the wire protocol. Note also that + the protocol function names and types are abstract (the XieLib language bindings convert + these abstract names into concrete function names an parameter types). + + + + + PROTOCOL SPECIFICATION SYNTAX 3–1 + The symbol "=>" demarcates the start of reply information. If the request has no reply, the + word "none" will follow the symbol "=>". + Following the "procedure declaration" information is a list of errors which the protocol function + may signal. If there are no possible error conditions, the list consists of the word "none". + Following the error information is a list of events which the protocol function may trigger. If + there are no possible events which maybe triggered, the list consists of the word "none". Note + that the list contains only those events which may be explicitly triggered, and that there may + be unforeseen events triggered by a protocol function. + Finally, each request section contains a descriptive component which includes overall purpose, + parameters , and operation. + + RequestName + arg1: TYPE1 + . + . + . + argn: TYPEN + => + result1: TYPE1 + . + . + . + resultn: TYPEN + + + Errors: kind1, ..., kindN + + Events: kind1, ... ,kindN + + Description: + - purpose + - parameters + - operation + - errors + + + +3.3 Error Syntax + + Errors are described in a uniform fashion. Each error description includes the error name, + error type code, and optional information returned with the error. Finally, each error section + contains a descriptive component which addresses causes. + + ErrorName error_type_code + value1: TYPE1 + . + . + . + valuen: TYPEN + Description: + - causes + + + + +3–2 PROTOCOL SPECIFICATION SYNTAX + 3.4 Event Syntax + + Events are described in a uniform fashion. Each event description includes the event name, + event type code, and optional information returned with the event. Finally, each event section + contains a descriptive component which includes overall purpose, causes, and operational + semantics. + + EventName event_type_code + value1: TYPE1 + . + . + . + valuen: TYPEN + Description: + - overall purpose + - causes + - operational semantics + + + + + PROTOCOL SPECIFICATION SYNTAX 3–3 + Chapter 4 + +PROTOCOL PARAMETER TYPES + + + Parametric types represent the core and extension protocol recognized types for the various + request parameters. The image extension protocol makes use of both core protocol parametric + types and image extension speci�c protocol parametric types. + +4.1 Core Types + + The following types are de�ned in the X11 core protocol speci�cation. Refer to the X11 core + protocol speci�cation for their de�nition. + + ARC ATOM BOOL BITGRAVITY + BITMASK BUTMASK BUTTON CARD8 + CARD16 CARD32 CHAR2B COLORMAP + CURSOR DEVICE DEVICEEVENT DRAWABLE + EVENT FONT GCONTEXT HOST + INT8 INT16 INT32 KEYBUTMASK + KEYCODE KEYMASK LISTofFOO LISTofVALUE + Or Types PIXMAP POINT POINTEREVENT + RECTANGLE STRING8 STRING16 TIMESTAMP + VALUE VISUALID WINDOW WINGRAVITY + + Note that XIE rede�nes the use of LISTofFOO such that the list is preceded by the number of + entries in the list. This applies in all cases (whether FOO is an XIE speci�c or core type). The + number of entries �eld is CARD8 unless noted otherwise in a protocol function speci�cation. + +4.2 Extension Types + + The types presented in this section are speci�c to the X Image Extension Protocol, and are + considered to be de�ned types. All X image extension type symbols begin with the pre�x XIT_. + All X image extension protocol parameters are de�ned as being either one of these extension + types, or one of the core protocol types. Note that these types are abstract in nature and are + bound to concrete types and structures by the XieLib language bindings. + The following sections describe the particulars of each of the image extension types. + + XIT_ACCELERATOR_VECTOR + + + + + PROTOCOL PARAMETER TYPES 4–1 + XIT_ACCELERATOR_VECTOR is used to provide the client information about which protocol + functions can be executed on ancillary processors (one other than the extension server host + processor). The ancillary processor is typically present for acceleration purposes (thus the + name). + Accelerator information is formatted as a bit vector identical in format to that used in server_ + capabilities. In particular, there is a bit for every protocol function whose value indicates the + state of hardware support for that function on the server. A ’0’ implies no direct hardware + acceleration (ie. the protocol function is implemented through software on the server host + processor), while a ’1’ implies speci�c accelerator support (ie. a processor other than the server + host processor is used to accelerate the function). + + XIT_AREA_OP1 + XIT_AREA_OP1 de�nes the valid operations for the process services area operator number 1. + They include: + + XIT_AREA_OP1 + { + ADDITION, + MULTIPLICATION + } + + + XIT_AREA_OP2 + XIT_AREA_OP2 de�nes the valid operations for the process services area operator number 2. + They include: + + XIT_AREA_OP2 + { + MINIMUM, + MAXIMUM, + SUMMATION + } + + + XIT_ARITH_OP + XIT_ARITH_OP de�nes the valid operations for the process services arithmetic operator. They + include: + + XIT_ARITH_OP + { + ADD_II, ADD_IC, + SUB_II, SUB_IC, SUB_CI, + MUL_II, MUL_IC, + DIV_II, DIV_IC, DIV_CI, + MIN_II, MIN_IC, + MAX_II, MAX_IC + } + + Note that the suf�x II means that the operation is to be performed between two images, while + IC means between an image and a constant. Note also that IC, and CI suf�ces imply order of + operands in the operation. + + XIT_COMPONENT_SPACE_ORGANIZATION + + + +4–2 PROTOCOL PARAMETER TYPES + XIT_COMPONENT_SPACE_ORGANIZATION de�nes the way in which the various spectral +components of an image are organized during wire transport. See the appendix on image data +attributes & organization for more details. + + XIT_COMPONENT_SPACE_ORGANIZATION: + { + BAND_INTERLEAVED_BY_PIXEL, + BAND_INTERLEAVED_BY_PLANE, + BIT_INTERLEAVED_BY_PLANE + } + + +XIT_COMPRESSION_SCHEME +XIT_COMPRESSION_SCHEME de�nes the recognized image compression schemes. + + XIT_COMPRESSION_SCHEME: {PCM, G42D, DCT} + +The X Image Extension Protocol makes use of standardized image data speci�c compres- +sion schemes (general purpose information theoretic schemes such as Liv Zempel are thus +excluded). While these may not be the most current or ef�cient, this ensures that incompati- +bilities due to proprietary or ill de�ned schemes does not occur. +The relationship between data organization and data encoding (compression) at wire transport, +and the applicability of various compression schemes to various classes of digital images +under various organizations is discussed in more detail in the section on wire data transport +overview, and in appendix C (Image Data Attributes & Organization). +PCM or pulse code modulation implies no compression scheme has been applied to the data. +In this case, the image data at wire transport time is organized according to the selected +(client-server agreed) format, but no compression scheme has been applied to the data itself. +It is included as a "compression scheme" so that it may be transported in stream format (see +XIEP_GET_STREAM and XIEP_PUT_STREAM). +G42D stands for the CCITT group 4 two dimensional compression scheme. While this scheme +was �rst developed for bitonal facsimile images, it is applicable to bitonal and continuous +tone images when organized properly. The name of this scheme will be used as a marker for +the actual standardized algorithm and data tables (refer to CCITT references). In this case, +the image data at wire transport time is organized according to the selected (client-server +agreed) format, and within this agreed to organization, the data is compressed according to +this scheme. +DCT or discrete cosine transform is a technique currently being standardized by ISO and +will be included for continuous tone monochromatic, and continuous tone polychromatic +compression. + +XIT_IDATA +XIT_IDATA is the generic type for all image data which flows across the wire. + +XIT_IDC + + + + + PROTOCOL PARAMETER TYPES 4–3 + XIT_IDC is the type for an image domain context identi�er. It is de�ned as a 32 bit identi�er. + See the notes on resource id formats in the section on connection setup. + + XIT_IDC_TYPE + XIT_IDC_TYPE identi�es the valid types of image domain contexts (IDC’s). They include: + + XIT_IDC_TYPE: + { + CPP - control process plane, + ROI - region of interest, + TMP - area operation template + } + + + XIT_IOB + XIT_IOB is the type for an image object identi�er. It is de�ned as a 32 bit identi�er. See the + notes on resource id formats in the section on connection setup. + + XIT_IPC + XIT_IPC is the type for an image process control context identi�er. It is de�ned as a 32 bit + identi�er. See the notes on resource id formats in the section on connection setup. + + XIT_HSHAPE + XIT_HSHAPE de�nes the various algorithm shapes that can be requested in histogram + matching operations. They include: + + XIT_HSHAPE + { + flat, + ramp, + hyperbolic, + gaussian + } + + + XIT_LOGICAL_OPS + XIT_LOGICAL_OPS de�nes the valid operators of the logical process services. They include: + + XIT_LOGICAL_OPS + { + AND, + OR, + XOR, + NOT, + SHIFT_UP, + SHIFT_DN + } + + + XIT_FLOAT + + + + +4–4 PROTOCOL PARAMETER TYPES + XIT_FLOAT identi�es the data as floating point. It is used in wire transport of some data +(typically some client speci�ed operands and some server returned data). It is never used in +wire transport of images. An XIE float consists of three components: + + XIT_FLOAT: + [ + e_sign - BOOLEAN, + m_sign - BOOLEAN, + exponent - CARD8, + mantissa - CARD16 + ] + +E_sign is the exponent sign while m_sign is the mantissa sign. If a sign boolean is true, it +indicates that the value is positive. + +XIT_LINE_PROGRESSION +XIT_LINE_PROGRESSION de�nes the way in which scan lines are to be painted at presenta- +tion time. See the appendix on image data attributes & organization for more details. + + XIT_LINE_PROGRESSION: {90, 270} + + +XIT_MATHF +XIT_MATHF de�nes the valid mathematical functions that can be invoked through the +mathematical process functions. They include: + + XIT_MATHF + { + EXP, + NATURAL LOG, + LOG2, + LOG10, + SQUARE, + SQUARE_ROOT, + } + + +XIT_PIXEL_PROGRESSION +XIT_PIXEL_PROGRESSION de�nes the way in which pixels are to be painted along scan +lines at presentation time. See the appendix on image data attributes & organization for more +details. + + XIT_PIXEL_PROGRESSION: {0, 90, 180, 270} + + +XIT_POLARITY +XIT_POLARITY de�nes the way in which pixel data is to be interpreted at presentation time. +In particular, it de�nes how data values are mapped into brightness. See the appendix on +image data organization for more details. + + XIT_POLARITY: {ZERO-BRIGHT, ZERO-DARK} + + + + + PROTOCOL PARAMETER TYPES 4–5 + XIT_PRED_TYPE + XIT_PRED_TYPE de�nes the dyadic predicate operators recognized by predicate protocol + functions including: + + XIT_PRED_TYPE: + { + LESS THAN, + LESS THAN OR EQUAL TO, + EQUAL TO, + NOT EQUAL TO, + GREATER THAN OR EQUAL TO, + GREATER THAN + } + + + XIT_STAT_TYPE + XIT_STAT_TYPE de�nes the types of statistical functions recognized in the protocol including: + + XIT_STAT_TYPE: + { + MINIMUM, + MAXIMUM, + MEAN, + STD_DEV, + VARIANCE + } + + + XIT_RESOURCE_TYPE + XIT_RESOURCE_TYPE is used to de�ne the type of image extension server resource. It is + used primarily during resource creation. The speci�c extension resource types are de�ned + below. Details of their contents are found in the appendix on server resources. + + XIT_RESOURCE_TYPE: {XIR_IOB, XIR_IDC, XIR_IPC} + symbol meaning + XIR_IOB image object + XIR_IDC domain control context + XIR_IPC process control context + + + XIT_SPECTRAL_COMPONENT_MAPPING + XIT_SPECTRAL_COMPONENT_MAPPING de�nes the recognized 3 color space systems. As + of this version, the only recognized spectral component mapping is RGB. + + XIT_SPECTRAL_COMPONENT_MAPPING: {RGB} + + + XIT_FUNCTION_VECTOR + + + + +4–6 PROTOCOL PARAMETER TYPES + XIT_FUNCTION_VECTOR is used to convey information about server support for individual +XIE protocol functions. Each bit of the XIT_FUNCTION_VECTOR represents a single protocol +function in the image extension protocol. The index of the bit (zero relative) is the value of +the protocol function number. A bit value of 1 indicates that the function is supported by the +server, while 0 implies that it is not. + + + + + PROTOCOL PARAMETER TYPES 4–7 + Chapter 5 + +PROTOCOL ERROR CODES + + + The image extension protocol makes use of both core protocol error codes and image speci�c + extension protocol error codes. + +5.1 Core Errors + + The following errors are de�ned in the X11 core protocol speci�cation. Refer to the X11 core + protocol speci�cation for their de�nition. + + Access Alloc Atom Colormap Cursor + Drawable Font GContext IDChoice Implementation + Length Match Name Pixmap Property + Request Value Window + + The image extension makes explicit use of the following core protocol errors: + • Access + • Alloc + • IDChoice + • Match + • Value + + The image extension uses the core protocol Access error during the image data wire transport + process. The error indicates that the client failed to establish the required transport context + information and that wire transport of image data can not proceed until this is done. + The image extension uses the core protocol Alloc error for server resource allocation problems. + The error indicates that the server was unable to allocate the resource. As with the core + protocol, it is left to the implementors to decide as to the implications of this error for all the + possible allocation problems which may arise within the extension server. + In extension protocol functions which create new server resources and assign to them client + speci�ed resource id’s, the image extension uses the core protocol IDChoice (BAD_IDChoice) + error to signal that the client desired new resource id is invalid or already in use. + + + + + PROTOCOL ERROR CODES 5–1 + In extension protocol functions which make use of existing server resources, the image exten- + sion uses the core protocol IDChoice (BAD_IDChoice) error to signal that the client speci�ed + resource id is invalid (wrong type of resource or nonexistent resource). This applies to image + objects (IOB’s), image domain control contexts (IDC’s), and image processing control contexts + (IPC’s). + The image extension uses the core protocol Match error to signal mismatches between IOB + constraint or chrominance state and the state required by the function at hand. + The image extension uses the core protocol Value error to signal attempts to assign values + which are out of range to extension resource �elds and when math errors occur. + All errors return a message with a common pre�x as described in the Error Protocol Message + Format section. Included in this information is the protocol function major opcode, minor + opcode (extension function code), error code, type code, and the request sequence number. This + information is followed by error code speci�c data described below. + +5.2 Extension Errors + + There are no image extension speci�c errors at this time. + + + + +5–2 PROTOCOL ERROR CODES + Chapter 6 + +SERVER DATA MODEL + + + Data formats for wire transport of image data are fully speci�ed in the protocol (next chapter). + The natural tendency is to leave the particulars of image data representation on the server to + server implementors. But, to some extent, the operation of certain extension protocol functions + depend upon server image data representation. This chapter de�nes the bounds of a server + image data model which will ensure some degree of operational consistency between various + server implementations. + There are several dimensions to the server image data model. The �rst is the tradeoff between + dynamic range/precision and processing speed/accuracy. The second is the relationship be- + tween server image data organization and spectral bands. The third is the ability to pipeline + image data through multiple XIE server processing primitives. + +6.1 Constrained vs Unconstrained + + XIE has established the de�nition of an image at wire transport to be a two dimensional array + of positive integral data which may be organized and compressed in various ways. The wire + transport de�nition was chosen to force the application or client to reduce the dimensionality + of its data to a least common denominator based upon the premise that the application + understands its data model better than any one else. + The wire transport de�nition of image data is too restrictive for many computational purposes. + A simple example is an algorithm which subtracts a constant from an image and then adds + the constant back in. Under the positive integral constraint, this algorithm may not reproduce + the original data. Another example of an algorithm that may suffer is one which takes the + natural log of the data and then either an antilog or scaling of the result to �t within some + dynamic range. The integral constraint throws away much information generated by the log + function. + The server image data model must provide for a balance between representational flexibil- + ity (regarding the dynamic range and precision of the data) and computational ef�ciency. + Typically, this is done by mapping the data directly onto one of the machine architecture’s + primitive data formats (integer or float). Differences between various server machine architec- + tures regarding word size for integers and robustness of floating point support require XIE to + adopt a logical rather than physical approach. + + + + + SERVER DATA MODEL 6–1 + XIE adopts two logical image data representation models on the server: constrained and + unconstrained. Constrained data will be positive integral data with limited dynamic range + and �xed precision [zero based with a �xed precision (number of levels or number of bits + per spectral component per pixel)]. Unconstrained data may be positive or negative and of + dynamic range less than or equal to the maximum that the server implementor (typically + machine architecture) can provide. As such, its dynamic range will be higher than that + of constrained data. While float may be a natural choice for unconstrained data, server + implementors are free to choose a long integer to represent unconstrained data. The process of + converting from unconstrained to constrained data is one of making all the data positive, and + with �xed number of quantization levels. + The client has substantial control over when and how constraints are applied. The client + has the ability to modify the parameters which control how constraining is done (default + constraint model). The client has the ability to query an IOB and determine its state relative + to constraints. The client has the ability to explicitly force conversion to constrained state + directly (through a "constrain" protocol function), or indirectly (after the application of process + protocol functions). + The constrained/unconstrained model applies to all server functions which deal with image + data (thus, constrained/unconstrained is meaningless for functions such as select events and + query IDC which do not deal with image data). + Protocol functions which should not accept unconstrained data (wire transport, bitwise logical + functions,...) will reject it (user is forced to explicitly constrain it). Protocol functions which are + asked to output constrained data will apply the constraint function after their basic function + is performed (ie. ensure maximum dynamic range & precision in the calculation and apply + constraints on the way out). + For example, let the client specify a constraint model of 256 levels for a gray scale image, + and let there be a test image which was sent across the wire with equal distribution of + pixels in all 256 states (it is constrained). If the client asks for a constrained subtraction of + 128 from the image and the current default constraint model is a hard clip within dynamic + range, the resulting image is constrained and has half its pixels clipped to value 0, and the + other half equally distributed between 0 and 128. If the client asks for an unconstrained + subtraction of 128 from the image, the resulting image is unconstrained and has its pixels + equally distributed between -128 and +128. After generation of this unconstrained image, if + the client asks to mask out the low four bits, the server will �rst convert the unconstrained + image to a constrained image, then perform the mask, and produce a constrained image. + Particulars of constraint functions are found in the following protocol sections: + • session services + • establish operational defaults + • query operational defaults + • radiometric services + • apply constraints + + The client should establish the default constraint model and parameters immediately after + session connection. + + + + +6–2 SERVER DATA MODEL + 6.2 Mono vs Poly Chromatic + + While it may be possible to have client side libraries manage three IOB’s as the constituent + components of a color image, it is felt that this is too minimalistic a view of XIE color image + support and that some color IOB data organizations and extended server function capabilities + should exist for color image objects. + Earlier drafts recognized multiple color three spaces, and undoubtedly, in the future these + three spaces (such as LUV and certain CIE spaces) will become signi�cant to the image + display situation on workstations. But, for now, XIE will focus on support only for R-G-B + images. Thus, three space color conversion and color correction problems will remain on the + client side of the wire (application level or toolkit level issues). + The impact upon the XIE protocol is the following: + • IOB’s are typed regarding color space (mono or rgb only), and + this information is queryable. + • For rgb images, all planes are constrained or unconstrained. + • For rgb images, the number of pixels-per-scanline and number-of-scanlines + must be identical for each of the three bands. + • For rgb images, the number of bits-per-component may be different for each band. + • Various server function specify their operational capabilities for mono and rgb images. + • A function exists for the separation of rgb into three mono components. + • A function exists for the combination of three mono components into rgb. + + Regarding spectral bands, it is suggested that server implementors keep spectral band data + separate within an IOB. As such, an IOB for a monochromatic image (bitonal or continu- + ous tone grayscale) would have one "band" type object (1 or n bits deep), while an IOB for a + polychromatic (RGB) image would have three "band" type objects (r, g, and b bits deep respec- + tively). Note that this is only a suggestion, and not a requirement. Clients should not assume + or infer that this is the underlying image data organization on the server. + In the future, we will consider support for alternate color three spaces. This support will + involve IOB color space state information which is queryable, and server implementation of + three space color transforms as well as possible extensions to existing protocol functions. + +6.3 Data Flow Pipelining + + The X image extension protocol strives to be primitive yet flexible enough to support many + higher level image rendition, enhancement, and display related operations. The understanding + of these higher level operations and intelligence in wielding the low level extension protocol + functions to achieve them has been left to an extension tool kit and the application itself. + The X image extension does offer a mechanism to aid in organizing and executing a series of + primitive protocol functions known as an image data processing pipeline. + + + + + SERVER DATA MODEL 6–3 + Under the X image extensions, a pipeline is de�ned to be a single threaded, list of X image + extension protocol functions through which image data flows sequentially. As such, the + pipeline mechanism is intended to support sequential segmented flow of image data through + multiple image extension process steps. These pipelines are driven by data availability + (pipeline elements are automatically stalled when awaiting data - individual pipeline elements + establish minimal required data availability for processing to occur). At any point in time, + the pipeline may be partially or completely full of data with the implication that several + pipeline segments may be "active" (able to process or processing data {in the case of multiple + processors}) at the same time. + An example of such a pipeline might be one where as image data arrives from the client + through transport calls, it moves through various rendition steps (perhaps scaling and tonal + remapping) to display. Thus, as image data arrives at the server, it is streamed to the display, + versus waiting for arrival of the complete image - then moving it completely through the + rendition steps one at a time - then moving it through the display step. + There are several signi�cant constraints on the pipelining mechanism. The �rst is that only a + subset of the extension protocol functions may be used as pipeline elements (see summary of + protocol appendix). No core protocol functions may be used in a pipeline. No protocol function + which exchanges information across the wire may be used in a pipeline other than image + data wire transport functions. Second, there are no pipeline process control functions (no + test mechanisms, iteration mechanisms, or human interaction mechanisms for use within + a pipeline). In essence, pipelines are sealed, straight through processing mechanisms. The + mechanism for describing (assembling) pipelines is simplistic (vs reinventing complex language + interpreters). As such, application and toolkit developers will need to "layout" or design + pipelines on paper before hand working out all parameter binding issues and then hand build + the calls to construct the pipelines. Note also that no pipeline "registry" mechanism exists and + so pipeline de�nitions exist only within the bounds of an extension session. + Regarding the execution of pipeline processing elements, server implementors are free to use + special accelerators and parallel processing to execute pipeline elements (just as they are to + accelerate an extension protocol function outside of a pipeline). The pipeline mechanism does + not provide any control over or understanding of these situations. + X image extensions will provide for de�nition, execution, and monitoring of segmented image + data processing pipelines on the server (see resource and process control services). + + + + +6–4 SERVER DATA MODEL + Chapter 7 + +REQUESTS AND REPLIES + + + This section constitutes the body of the image extension protocol. It consists of protocol + functions which are described in a uniform fashion (refer to syntax subsection). All X image + extension protocol function names begin with the pre�x XIEP_. + Note that like the core protocol, all image extension protocol functions are asynchronous in + nature. Clients requiring synchronous behavior should use the core protocol’s approach to + achieving synchronous behavior. + Extension protocol requests follow the byte ordering established at core protocol connection + time with regard to all 16 and 32 bit quantities. They also comply with maximum-request- + length as speci�ed in the core protocol connection. + + + + + REQUESTS AND REPLIES 7–1 + 7.1 Session Services + + Image extension sessions occur within the bounds of core protocol sessions. The image ex- + tension protocol provides per client extension server session initialization and termination + functions. These allow the client to initialize global extension session server information and + allow the extension server to clean up on session termination. The session services include: + • XIEP_INIT_SESSION - begins a client-extension server session + • XIEP_SET_DEFAULTS - establish/modify operational defaults + • XIEP_QUERY_DEFAULTS - query operational defaults + • XIEP_TERM_SESSION - ends a client-extension server session + +7.1.1 Initialize Session + + XIEP_INIT_SESSION + protocol_major_version: CARD16 + protocol_minor_version: CARD16 + => + success: BOOL + protocol_major_version: CARD16 + protocol_minor_version: CARD16 + service_class: CARD32 + supported_functions: XIT_FUNCTION_VECTOR + length: CARD16 + service class value: 0 + errors: none + events: none + + XIEP_INIT_SESSION must be invoked by a client as its �rst image extension protocol request + as it causes the server to perform initialization on a per client basis. In addition, as with the + core protocol connect request, the function returns information which is useful to the client. + Success is simply a statement of relationship between the server’s protocol version, and the + client request. TRUE implies that the server’s protocol version is greater than or equal to the + client’s request and that service will be granted. FALSE implies the opposite. + Protocol version numbers in the image extension connection request refer to the image exten- + sion protocol. They follow the core protocol rules: major version changes for incompatibility + reasons; minor version changes for small, upward compatible modi�cations. + Service_class is a mechanism for communicating the level of service provided by the particular + server. See the concepts document for an overview of service class partitioning of XIE server + capabilities. + Supported_functions is a mechanism for communicating exactly which protocol functions the + server recognizes/supports. A value of 1 for a bit in the XIE_FUNCTION_VECTOR implies + that the protocol function is recognized and supported by the server. Specialized hardware + support is not implied as this is communicated elsewhere. While the mechanism allows the + server to describe support at the individual protocol function level of granularity, it is strongly + recommended that servers implement all functions in a service class (see concepts document). + + + + +7–2 REQUESTS AND REPLIES + Length is the amount of additional data which follows in units of 4 bytes. Additional data + received if connection accepted includes... + + server_hardware: HARDWARE + where: + + HARDWARE: { + accelerators: XIT_ACCELERATOR_VECTOR + screens: LIST_of_SCREEN + } + + SCREEN: { + screen_number: CARD8 + accelerators: XIT_ACCELERATOR_VECTOR + } + + +7.1.1.1 Per Server information + Server information includes a description of the particular server hardware image capabilities, + and a list of descriptions of the various display screens image capabilities. No core server + session redundant information is included. Therefore, a complete picture of the hardware + and screen(s) derives from the union of core server and extension server connection request + responses. + Accelerators provides the client information about which image extension protocol functions + have hardware acceleration available across all screens. This information is provided to + guide imaging applications with regards to what they might reasonably expect from a server. + Accelerator information is formatted as a support vector. In particular, there is a bit for every + protocol function whose value indicates the state of hardware support for that function on the + server. A ’0’ implies no direct hardware acceleration (ie. the protocol function is implemented + through software on the server host processor), while a ’1’ implies speci�c accelerator support + (ie. a processor other than the server host processor is used to accelerate the function). + +7.1.1.2 Per Screen Information + The screens section of the reply addresses screen speci�c imaging hardware , screen speci�c + accelerators, and display controls. + Screen number is the number by which client rendition requests identify the screen they are + to affect. + Accelerators provides the client information about which image extension protocol functions + have hardware acceleration available on this screen. The format is identical to the hardware + accelerators �eld. + +7.1.1.3 Relationship to Core Session Information + At the time of initial connection to the core X server, the client receives information back from + the core X server. This includes connection and "per server" information. The availability + of this information to the client precedes the availability of X Image Extension initialization + information as the core X connection precedes the X Image Extension initialization. + + + + + REQUESTS AND REPLIES 7–3 + The connection information used by a client of the X Image Extension consists of a combination + of information which comes from the core connection and the image extension initialization. + Some core connection information is applicable to the image extension session. This informa- + tion is not replicated at image extension initialization time. Other core connection information + is not applicable to the image extension model, and is superseded by information provided + at image extension initialization time. Finally, there is image extension speci�c information + which was not found in the core connection information. + The table below summarizes the core connection information and its usefulness in an image + extension session. + + core information name meaningful type + --------------------- ---------- ---- + . success no + . protocol-major-version no + . protocol-minor-version no + . vendor yes STRING8 + . release-number yes CARD32 + . release-number no + . resource-id-base yes CARD32 + . resource-id-mask yes CARD32 + . bitmap-format-scanline-unit yes {8,16,32} + . bitmap-format-scanline-pad yes {8,16,32} + . bitmap-format-bit-order yes {LSBfirst,MSBfirst} + . pixmap-formats yes {ListofFormat} + . roots yes {ListofScreen} + . keyboard no + . pointer no + . motion-buffer-size no + . maximum-request-length yes + + Within roots, useful (applicable) information includes: root, width and height, default_color_ + map, white_pixel, black_pixel, min_installed_maps, max_installed_maps. All other information + is not applicable. + +7.1.2 Set Operational Defaults + + XIEP_SET_DEFAULTS + constraint - see below - + => + none + service class value: 0 + errors: VALUE + events: none + + where: + constraint includes: + [ + constraint_model CARD8 + bits_pel_component LISTofCARD8 + ] + + + + +7–4 REQUESTS AND REPLIES + XIEP_SET_DEFAULTS is used to modify operational defaults used by the extension server. + Operational defaults involve information which controls the operation of the extension server, + is knowable/modi�able by the client, and is not embodied in a server resource. It may be + invoked at any time to change the operational defaults. + Constraint defaults involve information used by the server in converting image data between + unconstrained and constrained states. The information includes the constraint_model which + de�nes how image data is constrained and bits_pel_component (bits per pixel per spectral + component) which determines the number of quantization levels of the resulting constrained + data. + The terms floor and ceiling will be used to described each of the constraint models. Floor refers + to the smallest positive integral value (base) allowed after constraining the data - for XIE, floor + is �xed at 0 (zero). Ceiling is the largest positive integral value allowed after constraining the + data - for XIE it is set to ((2**n) - 1) where n is the number of bits per pixel per component + (ie. ceiling is an integral power of two, and may be different for each spectral component). + Constraint models include: + 1. HARD CLIP + The data is �rst clipped such that all values below the floor (negative) + are set to the floor value, and all values greater than the ceiling + are set to the ceiling value. Then, all values are mapped to the + nearest integer within the floor-ceiling range by rounding. + 2. CLIP SCALE + The data is �rst clipped such that all values below the floor (negative) + are set to the floor value, and all values greater than the ceiling + are set to the ceiling value. Then, all values are scaled + to �t within the ceiling-floor range (make maximum use of the + available dynamic range. Finally, all values are mapped to the + nearest integer within the floor-ceiling range by rounding. + 3. HARD SCALE + The data is �rst shifted upwards so that all values are greater than + or equal to the floor value (positive). Then, all values are scaled + to �t within the ceiling-floor range. Finally, all values are mapped + to the nearest integer within the floor-ceiling range by rounding. + + Note that XIE supports only linear quantization models (scaling). + If any of the constraint values are out of range, or incompatible, a VALUE error occurs. + +7.1.3 Query Operational Defaults + + XIEP_QUERY_DEFAULTS + none + => + constraints - see preceding section - + service class value: 0 + errors: none + events: none + + + + + REQUESTS AND REPLIES 7–5 + XIEP_QUERY_OP_DEFAULTS is used to query the current state of the extension server’s + operation defaults. Operational defaults involve information which controls the operation of + the extension server, is knowable/modi�able by the client, and is not embodied in a server + resource. + See preceding section on establishing operational defaults for details of the information + returned. + +7.1.4 Terminate Session + + XIEP_TERM_SESSION + none + => + none + service class value: 0 + errors: none + events: none + + XIEP_TERM_SESSION is used by a client to terminate an image extension session. It must + be invoked by a client as its last image extension protocol request as it allows the server + to perform clean up on a per client basis. The extension server deletes all client speci�c + resources. A client may choose to continue with a core session after terminating an extension + session. + + + + +7–6 REQUESTS AND REPLIES + 7.2 Resource Services + + Image extension resources are extension server objects known to the client which contain + information used by the extension server in carrying out various protocol functions. Extension + resource class services provide for the management of these extension server objects by the + client. Extension resource protocol functions address resource creation, deletion, modi�cation, + query, and copy. In addition, extension resource services provide for moving image data + between core and extension resources. Resource protocol functions include: + + + • XIEP_CREATE_RESOURCE - create a new server resource object + • XIEP_COPY_RESOURCE - copy contents from source to destination resource + • XIEP_DELETE_RESOURCE - delete an existing server resource object + • XIEP_QUERY_RESOURCE - query an existing server resource object + • XIEP_IMPORT_IMAGE - create a new server IOB resource object + • XIEP_EXPORT_IMAGE - create a new server PIXMAP resource object + +7.2.1 Resource Creation + + XIEP_CREATE_RESOURCE + resource_id {XIT_IOB,XIT_IDC,XIT_IPC} + resource_type XIT_RESOURCE_TYPE + resource_data - see below - + => + none + + service class value: - see below - + errors: ALLOC, IDChoice, VALUE + events: none + + + where resource_data is one of the following: + { + image_object_resource_data, + process_control_context_resource_data, + domain_control_context_resource_data + } + + Server resource creation causes the server to allocate a new resource and to �ll it with infor- + mation passed through the function’s parameters. + Resource_id is the client speci�ed id to be assigned to the new resource. Resource_type + speci�es what type of extension server resource is to be created., (image object resource, + process and domain control object resources). Resource_data is type speci�c and is described + in the following subsections. + All extension server resources have their id’s selected by the client (same model as for all core + resources). The client must use the core session connection assigned resource-id-base and + resource-id-mask in generating id’s for image extension resources. As speci�ed in the core + protocol "The resource_id_mask contains a single set of contiguous bits (at least 18); the client + + + + REQUESTS AND REPLIES 7–7 + allocates resource ids by choosing a value with (only) some subset of these bits set, and ORing + it with the resource_id_base. Only values constructed in this way can be used to name newly + created resources over this connection. Resource ids never have the top 3 bits set. The client + is not restricted to linear or contiguous allocation of resource ids. Once an id has been freed, it + can be reused, but this should not be necessary. An id must be unique with respect to the ids + of all other resources, not just resources of the same type." + The service class of the resource creation function depends upon what type of resource is being + created. This is discussed in each of the following subsections. + Inability of the server to allocate the new resource results in an ALLOC error. Choice of a + resource id which is already in use or is out of range generates an IDChoice error. Invalid + value speci�cation of any image attributes results in a VALUE error. If any error occurs, the + object is not created. + +7.2.1.1 Image Object Resource + Image_Object_Resource_Data + [ + pixels-per-scanline CARD32 + number-of-scanlines CARD32 + aspect_ratio XIT_FLOAT + number-of-spectral-components CARD8 + bits_per_component LISTofCARD8 + spectral-component-mapping XIT_SPECTRAL_COMPONENT_MAPPING + pixel_progression XIT_PIXEL_PROGRESSION + line_progression XIT_LINE_PROGRESSION + polarity XIT_POLARITY + ] + + IOB’s represent revisable form images (see server resources and image data attributes and + organization appendices). They consist of image attributes and image data. + Image objects can come into existence in several ways: as the result of a client request to + create a new one; as the result of an import protocol request; and as the result of a processing + protocol request. XIEP_CREATE_RESOURCE with type image object is used by a client to + create (allocate) a new server image object resource and as such, represents the �rst of the + three ways of creating new image objects. + Clients typically create new image objects just prior to populating them with image data via + transport protocol functions. Both primitive and presentation attributes are communicated + from client to server during image object creation. The primitive attributes are strongly + bound to the data as they describe the most fundamental organizational information. The + presentation attributes are less strongly bound as they provide some insight into the original + presentation of the data. + + primitive_attributes include: + pixels-per-scanline + number-of-scanlines + number-of-spectral-components + bits_per_component + spectral-component-mapping + presentation_attributes include: + + + + +7–8 REQUESTS AND REPLIES + pixel_progression + line_progression + aspect_ratio + polarity + + Note that while most client accessible server resource object �elds can be initialized at creation + time, there may be �elds in image objects which are initialized and maintained by the server + and are only queryable by the client (eg. constraint information) + Pixels-per-scanline, number-of-scanlines, number-of-spectral-components, and spectral- + component-mapping are all primitive image attributes described in the appendix on image + data attributes and organization. While bits_per_component is an artifact of image data wire + transport (more so than a primitive attribute), it is communicated with primitive attributes at + IOB creation time to facilitate IOB resource allocation (memory). + Pixel_progression, line_progression, aspect_ratio, and polarity are all original image presenta- + tion attributes described in the appendix on image data attributes and organization. + IOB’s created by the create resource function begin their life with state constrained. This + is consistent with their only initial use (receiving image data from across the wire). IOB + image data is initialized at creation time to the value zero (0). This is done to ensure that + all image locations begin with meaningful data. This is particularly important in that image + data transport overlays the default values and while stream image data transport must by + de�nition overlay all of the data locations, random access tiled image data transport may or + may not. + IOB’s are potentially very expensive server resources due to their size. Care should be exer- + cised by the client regarding which and how many resources are allocated. + +7.2.1.2 Domain Control Context Resource + domain_context_resource_data + idc_type XIT_IDC_TYPE + idc_data - see below - + + + Where idc_data depends on the idc_type: + . for ROI’s, idc_data is the following sequence: + [ + ul_x CARD32 + ul_y CARD32 + width CARD32 + height CARD32 + ] + . for CPP’s, idc_data is the following: + [ + ul_x CARD32 + ul_y CARD32 + cpp_iob XIT_IOB + ] + . for TMP’s, idc_data is the following: + + + + + REQUESTS AND REPLIES 7–9 + [ + center_x CARD32 + center_y CARD32 + data_count CARD32 + tmp_data LISTofTMP_ENTRY + ] + where: + TMP_ENTRY is: + [ + x_index CARD32 + y_index CARD32 + value XIT_FLOAT + ] + + Domain context resources are used to focus various classes of server based image processing + onto a subset of the pixels that are part of an IOB, and to act as operands in certain image + area operations. + IDC_type determines if the IDC is to be an ROI, CPP, or TMP. IDC_data speci�es the bounds + of an ROI, identi�es a bit plane (an IOB which is one bit per pixel) to be used as a CPP, or the + locations and values of the template. + There are three forms of IDC: the region of interest or ROI, the control processing plane + or CPP, and the template or TMP. An ROI de�nes a closed, rectangular subregion. When + using an ROI type IDC, all pixels within (border included) the ROI are subject to processing. + Individual operators de�ne how boundary conditions are handled. A CPP de�nes a potentially + fully disconnected set of locations such that pixels at these locations are subject to processing. + CPP’s do this by representing all pixel locations with a single bit, and using the state of the bit + to control whether processing occurs or not. A TMP de�nes the shape and values of a template + or mask used in area operations. TMP’s maybe fully or sparsely populated two dimensional + entities. Individual protocol processing functions de�ne which forms of IDC are acceptable. + All three forms of IDC (ROI, CPP, TMP) are spatially registered with the image object data + (IOB) through the image object’s implicit two dimensional coordinate system. ROI and CPP’s + are spatially registered by the values of their upper left coordinates which specify the location + in image object coordinates of the upper left corner. In the case of ROI’s and CPP’s, their x + and y extents must be less than or equal to that of the IOB they will be used with at operation + time. + While the X image extension protocol does not provide for object recognition, it does allow + clients to process and convert an IOB into a CPP via the boolean operators in enhancement + services section. With these services, a client can generate a CPP for pixels with the same + intensity or color, or more complex identity relationships. Applications such as chroma keying + may be possible with these services. + The spatial registration of a template (TMP) with the area image data surrounding a pixel is + established by the centerx and centery data. All templates are speci�ed in the positive x and + positive y quadrant of a cartesian coordinate system. The centerx, centery data positions the + location of the data pixel (central pixel) relative to the template. For example, the following + hollow cross �lter would be represented in the protocol as shown below: + + + + +7–10 REQUESTS AND REPLIES + -7.00 + +3.00 -0.75 + +1.66 + + entries 4 + centerx 1 + centery 1 + x_index 1 2 1 0 + y_index 0 1 2 1 + value +1.66 -0.75 -7.0 +3.0 + + Note that asymmetric templates are possible, and there is no need for all or even the center + point template value to be de�ned (sparse de�nitions). Note also that the size of the list length + entry (�rst �eld in the list) for tmp_data is CARD16 (rather than the default CARD8) to allow + for large templates. + Creation of IDC resources is considered to be a service class 1 function as it is central to server + image processing operations. + +7.2.1.3 Process Control Context Creation + Process_Control_Resource_Data + [ + name LISTofSTRING8 + inputs PIPE_IOT + outputs PIPE_IOT + ] + where: + PIPE_IOT includes: + [ + number CARD8 + formal_parm_types LISTofXIT_PARMS + ] + + Process context resources represent server pipeline resources. They act as both a pipeline + template and when executed, a pipeline instantiation. + Name is simply a descriptive string assigned by the client. It is used by pipeline segments + to refer to global inputs and outputs, as well as by the server when a pipeline is nested. The + IPC (pipeline) inputs and outputs represent formal parameter declarations for a process. In + essence, they allow the client to type specify all inputs into the front end of a pipeline, and + all outputs produced and returned from the tail end of a pipeline. Both input and output + parameters are implicitly numbered by the server beginning with zero (0). This numbering is + used to refer to the global inputs and outputs. + Note that the size of the list length entry (�rst �eld in the list) for formal_parm_types is + CARD16 (rather than the default CARD8) to allow for large templates. + IPC’s may be built, copied, queried, deleted, executed, and terminated. Creation of a resource + of type IPC is the �rst step in de�ning an executable pipeline. After this step, the client must + build the pipeline by sequentially adding elements to the pipeline (XIEP_ADD_SEGMENT). + When the pipeline construction is complete, execution may begin (XIEP_EXECUTE_PIPE). + + + + + REQUESTS AND REPLIES 7–11 + As an IPC represents both a pipeline template and instantiation, only one copy of any IPC + may be executing at a time. Note that pipelines may be nested within other pipelines. + +7.2.2 Resource Copy + XIEP_COPY_RESOURCE + src_resource_id {XIT_IOB,XIT_IDC,XIT_IPC} + dst_resource_id {XIT_IOB,XIT_IDC,XIT_IPC} + resource_type XIT_RESOURCE_TYPE + => + none + service class value: 0 + errors: IDChoice, ALLOC, MATCH + events: none + + XIEP_COPY_RESOURCE is used to copy the contents of a source resource into a destination + resource. The client speci�es the source resource, and the resource id to be used for the new + (destination) resource, as well as the resource type. The server checks to see that the source + resource is of the type speci�ed, allocates a new (destination) resource of the same type as the + source, and �lls it with source resource contents. + Src_resource_id is the id of the source resource (copy will occur from this resource). Dst_ + resource_id is the client assigned id of the new (destination) resource (copy will occur to this + resource). Resource_type is the type of the source resource. Upon completion, the destination + resource is an exact copy of the source resource. + It is left to the server implementor to determine if XIEP_COPY_RESOURCE will operate on + the image data in an IOB (ie. if it will transfer both image attributes and data from source to + destination IOB such that no two IOB’s ever share the same image data, or if IOB’s can share + image data). + Attempts to access source resources which don’t exist or to use a resource id for the destina- + tion resource which is already in use generates an IDChoice error. Inability to allocate the + destination resource results in a ALLOC error. A mismatch between the source resource type + and the speci�ed resource type generates a MATCH error. + +7.2.3 Resource Delete + XIEP_DELETE_RESOURCE + resource_id {XIT_IOB, XIT_IDC, XIT_IPC} + resource_type XIT_RESOURCE_TYPE + => + none + service class value: 0 + errors: IDChoice, MATCH + events: none + + XIEP_DELETE_RESOURCE is used by a client to delete (deallocate) server resources. + + + + +7–12 REQUESTS AND REPLIES + Resource_id identi�es the speci�c resource the client wants deleted. Resource_type is the type + of the resource to be deleted. Deletion of IOB’s deletes the image data. As under the core + protocol, the management of shared resources is an application problem. + Attempts to delete a resource which is nonexistent results in an IDChoice error. A mismatch + between the source resource type and the speci�ed resource type generates a MATCH error. + +7.2.4 Resource Query + + XIEP_QUERY_RESOURCE + resource_id {XIT_IOB, XIT_IDC, XIT_IPC} + resource_type XIT_RESOURCE_TYPE + => + resource_data - see below - + + service class value: - see resource creation - + errors: IDChoice, MATCH + events: none + + where resource_data is one of the following: + { + image_object_resource_data, + process_control_context_resource_data, + domain_control_context_resource_data + } + + XIEP_QUERY_RESOURCE returns the contents of all client readable �elds of the server + resource. All image extension server resources other than the image data itself (within the + IOB) can be queried. Image data query is accomplished with a different protocol function. + Resource_id is the id of the resource the client wishes to query. Resource_type is the type of + the resource to be queried.The data returned depends upon the type of resource being queried + and is described in the following subsections. + The service class of the resource query function depends upon what type of resource is being + queried. This is discussed in each of the following subsections. See the appendices on on + server resources for more details of the attributes. + Querying a non existent resource generates an IDChoice error. A mismatch between the + source resource type and the speci�ed resource type generates a MATCH error. + +7.2.4.1 Image Object Query + Image_Object_Resource_Data + constraint_model CARD8 + pixels-per-scanline CARD32 + number-of-scanlines CARD32 + aspect_ratio XIT_FLOAT + polarity XIT_POLARITY + pixel_progression XIT_PIXEL_PROGRESSION + line_progression XIT_LINE_PROGRESSION + spectral-component-mapping XIT_SPECTRAL_COMPONENT_MAPPING + number-of-spectral-components CARD8 + bits_per_component LISTofCARD8 + + + + + REQUESTS AND REPLIES 7–13 + The function returns the contents of all of the queryable IOB attribute �elds. It does not + return the image data itself (see transport protocol functions). + Note that constraint information is never directly settable by the client, but is queryable. + The constraint_model and constrain_bits_per_component �elds reflect the state of the default + operational constraint model when the IOB was last constrained. + The image object query can be viewed as returning three classes of information: + primitive_attributes - see below - + presentation_attributes - see below - + constraint_info - see below - + where: + primitive_attributes include: + pixels-per-scanline + number-of-scanlines + number-of-spectral-components + spectral-component-mapping + presentation_attributes include: + pixel_progression + line_progression + aspect_ratio + polarity + constraint_info includes: + constrained + constraint_model + bits_per_component + + +7.2.4.2 Domain Control Context Query + domain_control_context_resource_data + idc_type XIT_IDC_TYPE + idc_data - see below - + + Where idc_data depends on the idc_type: + . for ROI’s, idc_data is the following sequence: + + ul_x CARD32 + ul_y CARD32 + width CARD32 + height CARD32 + + . for CPP’s, idc_data is the following: + ul_x CARD32 + ul_y CARD32 + cpp_iob XIT_IOB + . for TMP’s, idc_data is the following: + center_x CARD32 + center_y CARD32 + data_count CARD32 + data LISTofTMP_ENTRY + where: + TMP_ENTRY is a triplet: + + + +7–14 REQUESTS AND REPLIES + x_index CARD32 + y_index CARD32 + tmp_data XIT_FLOAT + + + +7.2.4.3 Process Control Context Query + process_control_context_resource_data + [ + name LISTofSTRING8 + inputs PIPE_IOT + outputs PIPE_IOT + running BOOL + segments LISTofSEGMENT + ] + where: + PIPE_IOT includes: + [ + number CARD8 + formal_parm_types LISTofXIT_PARMS + ] + SEGMENT includes: + [ + name LISTofSTRING8 + function XIT_XIEFUNCTION + parm_bindings LISTofBINDING + state {processing, stalled} + ] + where + BINDING is: + [ + name STRING8 + number CARD32 + ] + + The function returns the contents of all of the queryable IPC �elds. + Running is a boolean which indicates if the pipeline has been instantiated and is under + execution, or is in the template state. Refer to the sections on XIEP_CREATE_RESOURCE + (type IPC) and XIEP_ADD_SEGMENT for more details on other �elds. If running is true, + then the state �eld in the segments list elements is meaningful and describes the current + state of each pipeline element (either processing, or stalled awaiting data). + +7.2.5 Import/Export Services + Import/Export class services provide for the direct movement of image data and attributes + between extension package objects (IOB’s) and core server objects (drawable). The term + "direct" means that other than issuing the protocol request, no further client intervention is + required (the image data does not have to move back and forth across the wire). These services + are provided in order to allow some server level mechanism for data exchange between the + image extension and the core as well as other extension packages. + + + + + REQUESTS AND REPLIES 7–15 + 7.2.5.1 Import Image + XIEP_IMPORT_IMAGE + iob_id XIT_IOB + drawable DRAWABLE + => + none + service class value: 0 + errors: DRAWABLE, MATCH, ALLOC, IDChoice + events: none + + XIEP_IMPORT_IMAGE transfers image data and attributes from an existing server drawable + into a new server IOB. + IOB_id is the id to be assigned to the new IOB. Drawable is the id of a core server drawable + resource that the image data and attributes will come from. The drawable may be either a + pixmap or a window. + The server creates a new IOB to receive the image data and attributes. The client accessible + IOB attributes (primitive and presentation) derive from information associated with the + drawable. Data formatting information (organization and encoding) which is involved in wire + transport plays no visible role in the process. + Note that all drawable image data is imported (no subregion speci�cation is allowed and no + import processing such as masking is allowed). Clients wishing to import only a portion of a + drawable must extract the portion into a new drawable before using XIEP_IMPORT_IMAGE + or crop the IOB after import. Clients wishing to process (such as mask) the data should use X + Image Extension functions to do so once the data has been imported into an IOB. + For windows, pixels-per-scanline and number-of-scanlines derive from window width and + height respectively, while number-of-spectral-components and spectral-component-mapping are + inferred from the visual type of the window. + For pixmaps, pixels-per-scanline and number-of-scanlines derive from pixmap width and + height respectively, while number-of-spectral-components and spectral-component-mapping are + inferred from (TBS). + In all cases, the resulting IOB is in the constrained state. + In either case (pixmap or window), the default presentation attributes associated with the + image data in the IOB (pixel-progression, line-progression, aspect-ratio, polarity, and grid-type) + derive from server private knowledge of the display device. + If drawable does not specify a valid drawable, then a Drawable error occurs. If the drawable + is an input only window, a Match error occurs. If the client speci�ed IOB id is already in use, + an IDChoice error occurs. If the server can not allocate the IOB, an ALLOC error occurs. + + + + +7–16 REQUESTS AND REPLIES + 7.2.5.2 Export Image + XIEP_EXPORT_IMAGE + iob_id XIT_IOB + drawable DRAWABLE + gc GCONTEXT + src_x INT32 + src_y INT32 + width CARD32 + height CARD32 + dst_x INT32 + dst_y INT32 + => + none + service class value: 0 + errors: IDChoice, MATCH + events: none + + XIEP_EXPORT_IMAGE combines image data from a rectangular region of an existing server + IOB with data in a rectangular region of an existing server DRAWABLE. + IOB_id is the id of the source image object. Drawable is the id of the receiving DRAWABLE + (WINDOW or PIXMAP). GC_id is the graphic context used to provide information used when + �lling the drawable. Src_x and src_y are the location of the upper left hand corner of the + source IOB data. Width and height de�ne how much data to transfer. Dst_x and dst_y are the + location of the upper left hand corner of the destination location in the receiving DRAWABLE. + XIEP_EXPORT_IMAGE is similar in many aspects to the core X copy_area function. The + similarities include transfer of image data into a server resource with control over subarea and + combination of source and destination data, as well as the requirement that the data format + must match that of the receiving resource (no format conversion or mismatches supported or + allowed). + XIEP_EXPORT_IMAGE will only transfer data between and IOB and a DRAWABLE. It is + not capable of reconciling differences between the IOB data and the pixmap formats. In + other words, the process of reconciling the differences between what have been referred to as + revisable form images and what the display device can show (this is reflected in DRAWABLE + formats) must occur prior to export. This reconciliation process is what is referred to as + rendition and must be performed before export. + Thus, prior to use of export_image, the IOB must be constrained and the client should apply + various rendition steps/operations (such as scale, crop, ...) to ensure that the IOB image data + is compatible with the receiving DRAWABLE. + If iob_id or drawable specify invalid (nonexistent) resources, an IDChoice error occurs. If an + attempt is made to export an IOB into a pixmap such that the IOB is unconstrained or its + data is incompatible with the data formats which a DRAWABLE can contain (see core X11 + protocol connection function), then a MATCH error occurs. + + + + + REQUESTS AND REPLIES 7–17 + 7.3 Transport Services + + Transport class services provide the means for exchange of image data between client and + server. Transport protocol functions include: + • XIEP_SET_TRANSPORT - establishes the required transport context information + • XIEP_ABORT_TRANSPORT - aborts transport & clears transport context information + • XIEP_GET_TILE - transports random tiles of uncompressed image data from server to + client + • XIEP_PUT_TILE - transports random tiles of uncompressed image data from client to + server + • XIEP_GET_STREAM - transports a stream of compressed or uncompressed image data + from server to client + • XIEP_PUT_STREAM - transports a stream of compressed or uncompressed image data + from client to server + +7.3.1 Overview of Data Transport + This section addresses the overall image data transport process, transport modes, transport + data formats, transport synchronization, and transport granularity & atomicity. Details of + these subjects are found within the data transport protocol de�nitions. + +7.3.1.1 Transport Process + In client->server transfers, the client usually begins by creating a new image object (IOB) + using XIEP_CREATE_RESOURCE and establishing primitive and presentation attributes + as it does. Note that while client->server transport is usually done to a new (empty) IOB, + an existing IOB (one which already contains image data deriving from a prior transport or + processing operation) may be used to receive the transport image data. + The client then proceeds to establish the transport context (XIEP_SET_TRANSPORT) which + controls the format of image data on the wire for this transport session to the speci�ed IOB. + Finally, the client transfers the image data from its buffer to the server IOB through one or + more transport calls (XIEP_PUT_TILE or XIEP_PUT_STREAM). The transport session is + completed when a �nal flag is set in one of the transport functions, or when the transport is + aborted via XIEP_FREE_TRANSPORT. + In server->client transfers, the IOB already exists and is �lled with image data. In this + case, the client proceeds to establish the transport context (XIEP_SET_TRANSPORT) which + controls the format of image data on the wire for this transport session from the speci�ed IOB. + Then the client transfers the image data from the server IOB to its buffer through one or more + transport calls (XIEP_GET_TILE or XIEP_GET_STREAM). + Due to size limitations on protocol messages and/or client preferences, transport may involve + one or many transport protocol function invocations. + + + + +7–18 REQUESTS AND REPLIES + 7.3.1.2 Transport Modes + Image data transport is divided into two modes: random access tiled, and sequential access + stream. + Random access tiled transport is designed to allow exchange of uncompressed tiles of image + data between client buffer and IOB. The client speci�es both tile size and IOB relative location + on a transport function call basis. Tiles may be as small as a single pixel, or as large as the + transport protocol message can handle. + Sequential access stream transport is designed to allow exchange of either uncompressed + image data or compressed image code information in a sequential stream format. No random + access is allowed in this mode. + The use of image data compression in sequential access stream transport involves a tradeoff + between processing and communications bandwidth. The availability of processing power (in- + cluding specialized compression/decompression engines), and the available bandwidth between + client and server should both factor into the choice between compressed and uncompressed + image data transport. + When compression is used with sequential access stream mode, image code information rather + than image data is transported. The image can be recovered (with varying degrees of �delity + based upon the compression scheme) from the code information. The code information and + transport both depend upon the compression scheme. + Client to server image data transport may occur to either a preexisting or a newly created + IOB. As data arrives (uncompressed tiles, uncompressed stream, or compressed data which + the server immediately decompresses), it overlays the initial data (default value = zero, or + prior image). No combination of transport data (image data or code information) with pre- + existing IOB data other than simple overwrite is provided. This does not exclude complex + assembly of IOB data through transport (such as aggregating and assembling bit planes in + Bit_Interleaved_by_Plane format). + Both tile and stream (uncompressed and compressed) transport are applicable to all classes + of digital images (bitonal, continuous tone monochromatic or gray scale, and continuous tone + polychromatic or color). + +7.3.1.3 Transport Data Formats + Whether random access tile or sequential access stream (uncompressed or compressed) trans- + port will be used, the client must choose between three underlying PCM data organizations: + Band_Interleaved_by_Pixel, Band_Interleaved_by_Plane, and Bit_Interleaved_by_Plane (see + appendix for details). These data organizations de�ne how the bits which represent the + various spectral bands are organized. + In tile and stream uncompressed transport, this PCM format describes the actual data trans- + port wire format. In stream compressed mode, compression is applied to the data after it is + organized in one of the three ways. When transporting image data in the stream compressed + mode, the client must choose the compression scheme. The valid combinations of compression + schemes and underlying image data organizations are discussed below. + + + + + REQUESTS AND REPLIES 7–19 + The transport functions which follow refer to a concept known as the "data plane" , or simply + "plane". In fact, the atomic transport functions do not concern themselves with the meaning + of the image data (at the level of it being a bitonal image, or a grayscle image, or a color + image), but rather, they concern themselves with the assembly/disassembly of image data + into transport buffers, and compression. The mapping between "types of images" (bitonal, + continuous tone monochromatic, and continuous tone color), component space organization + (band-interleaved-by-pixel, band-interleaved-by-plane, bit-interleaved-by-plane), and planes is + as follows: ** tbs - table ** + In any case, only positive integral values (image data or bit string codes) flow across the wire. + There is no provision for exchange of negative integral image data, real valued (float) image + data or complex valued image data on the wire even though such data (real valued) may exist + on the server (see server data model). In terms of either client->server or server->client image + data transport, the server side IOB must be of state constrained. + Flexibility in overall transport mode (tile or stream), underlying image type (bitonal monochro- + matic, continuous tone monochromatic or gray scale, and continuous tone trichromatic + or color), underlying PCM image data organization (band_interleaved_by_pixel, band_ + interleaved_by_plane, and bit_interleaved_by_plane), stream mode compression scheme (PCM, + G4, DCT), and all or single plane at a time transport leads to an enormous number of possible + transport con�gurations. Fortunately, some image data organizations are identical (degener- + ate) for some image types, and some compression schemes are inapplicable for some image + data organizations. The following table is intended to give the reader an overview of the valid + transport con�gurations. The all or single plane option is left out of the table and dealt with + explicitly in the transport functions themselves. Degenerate image data organizations are + grouped by surrounding brackets {}. + + MODE IMAGE_TYPE IMAGE_ORGANIZATION COMPRESSION + Tile + Bitonal {band_interleaved_by_pixel n/a + band_interleaved_by_plane + bit_interleaved_by_plane} + Grayscale {band_interleaved_by_pixel n/a + band_interleaved_by_plane} + {bit_interleaved_by_plane} n/a + Color {band_interleaved_by_pixel} n/a + {band_interleaved_by_plane} n/a + {bit_interleaved_by_plane} n/a + Stream + Bitonal {band_interleaved_by_pixel PCM, G4 + band_interleaved_by_plane + bit_interleaved_by_plane} + Grayscale {band_interleaved_by_pixel PCM, DCT + band_interleaved_by_plane} + {bit_interleaved_by_plane} PCM + Color {band_interleaved_by_pixel} PCM, DCT + {band_interleaved_by_plane} PCM, DCT + {bit_interleaved_by_plane} PCM + + + + +7–20 REQUESTS AND REPLIES + Note that while DCT compression of bitonal image data is possible, and both G4 and DCT + compression of bit_interleaved_by_plane data of grayscale and color images is possible, neither + are proposed at this time. The need for and value of these schemes will be considered in the + future. + +7.3.1.4 Transport Granularity & Atomicity + Both the tile and stream (uncompressed and compressed) transport protocol functions are + limited in terms of the amount of data they can move by the length �eld in the standard + (core X11) protocol message. As images (in a client’s buffer or in a server IOB) may be much + larger than the length �eld limit, it may require multiple transport protocol calls to move the + complete image across the wire. + The extension protocol transport functions allow the client to construct or assemble all of the + data which will make up a single image (IOB) with multiple transport requests. In particular, + there is a "�nal" flag in both tile and stream (uncompressed and compressed) transport + protocol functions which is used to signal completion of transport and assembly of the data + which makes up an image. In the case of tile image data transport, this flag is used when + the client has populated through transport all tiles it wishes to in the IOB. In the case of + stream (uncompressed or compressed) image data or code information transport, this flag is + used when the client has sent the last sequential stream of image data or code information. In + the tile case, a single flag applies to all planes, while in the stream case, a separate �nal flag + applies to each plane. + The transport parameters associated with an IOB (XIEP_SET_TRANSPORT) are locked + during transport of intermediate (non �nal) segments. In other words, once transport to or + from an IOB begins, the client can not modify the transport parameters until a �nal transport + (�nal flag = true) occurs. + The client has control over the size of each transport request, and may change the size on + a request by request basis. This is intended to support applications which may be acquir- + ing/disposing of image data (from disks or networks) in small pieces (including due to highly + limited virtual address space / physical memory space), as well as applications making use of + X Image Extension Pipelines where transport is part of the pipe (such as rapid interleaved + transport-rendition-display). This is also due to the fact that maximum size of X11 wire + packets may often be smaller than the image to be transported. + In all cases, only individual transport protocol requests are atomic. The transport of of all + image data/information that makes up an IOB may or may not be atomic depending upon + whether it requires multiple transport protocol requests. The image data which arrives on the + server (client->server) and is placed into an IOB is not locked in any way and may be accessed + by other server functions (interleaved between the transport functions). While this is the + case, the actual presence of image data in the IOB (versus residing in intermediate transport + buffers awaiting repacking or decompression) is indeterminate until the �nal flag is set, and + applying server operations to the IOB may generate indeterminate results. The only acception + to this is pipelines which have transport as their �rst element. + + + + + REQUESTS AND REPLIES 7–21 + 7.3.1.5 Synchronization + Like all other image extension protocol functions, transport protocol functions are asyn- + chronous - the client initiates them and does not wait for their completion. + +7.3.2 Set Transport Context + XIEP_SET_TRANSPORT + iob_id XIT_IOB + compression-param CARD32 + compression-scheme XIT_COMPRESSION_SCHEME + tile_format BOOL + component-space-organization XIT_COMPONENT_SPACE_ORGANIZATION + plane_mask CARD32 + plane_information LISTofPLANE_DATA + => + none + service class value: 0 + errors: IDChoice, MATCH + events: none + + where: + PLANE_DATA is: + [ + pixel-stride CARD8 + scanline-stride CARD32 + ] + + XIEP_SET_TRANSPORT is used to establish the necessary transport context information + before image data wire transport can occur between a client buffer and a particular server + IOB. + Iob_id is the id of an existing IOB (either newly created by XIEP_CREATE_RESOURCE + or preexisting) which will serve as the source of or destination for image data transport. + Compression_param is a compression parameter to be used by the various compression + schemes. In particular, it is used to control the compression factor / �delity tradeoff in DCT + compression when reading compressed data from the server to the client. Compression_scheme + is one of the valid compression schemes. In tiled transport, compression scheme must be set + to PCM. In stream transport, it may be any of the compression schemes including PCM (see + table in previous section and appendix). Tile_format is a boolean which is used to indicate if + tile or stream transport is to occur. Component_space_organization describes the PCM format + of the image data (independent of whether tile uncompressed, stream uncompressed, or stream + compressed image data transport will occur). + Plane_mask identi�es which planes will be transported where the de�nition of a data plane + depends upon the component_organization. Plane_information is a list with one entry per + plane. Each entry in the list contains, pixel-stride and scanline-stride. Scanline_stride is only + meaningful in uncompressed stream transport and must be set equal to the number of bits + per scanline plus the number of pad bits between scanlines. Scanline_stride is meaningless + for tiles as tile size may be changed on a transport call basis. In tile transport, within each + plane, all scanlines are bitwise abutted (no pad or alignment allowed). Multiple planes in + tile transport are longword aligned. Note that the bits-per-component information used in + + + +7–22 REQUESTS AND REPLIES + wire transport is communicated at IOB creation time (for client-to-server transports), and + established in/derived from the IOB for server-to-client transports by use of the constraint + mechanism. For more details on compression-scheme, component-space-organization, bits-per- + component, pixel-stride, and scanline-stride see the appendix on image data attributes and + organization. + The image data wire transport context is bound to a particular IOB for the duration of an + image data wire transport session. The binding is established by XIEP_SET_TRANSPORT. + The transport context information for the particular IOB is locked when the �rst image data + wire transport function is invoked (XIEP_GET_TILE, XIEP_PUT_TILE, XIEP_GET_STREAM, + XIEP_PUT_STREAM) and remains locked until the transport session involving this IOB is + completed. This occurs when an image data wire transport function is invoked with "�nal" flag + set to true or when transport is aborted (XIEP_ABORT_TRANSPORT). + Note that the transport context information pertains to image data organization only during + wire transport. It has no bearing upon the server IOB image data organization as server’s are + free to chose their own image data organizations. + If the iob_id does not exist, an IDChoice error occurs. If the IOB’s number_of_spectral_ + components does not match the length of the component_information list, or the tile_format + boolean is true and compression_scheme is not PCM, a MATCH error occurs. + +7.3.3 Tile Data Transport + Tile data transport allows a client to transport tiles of image data between a client buffer + and an existing IOB. The client controls tile size, its IOB location, and which data planes to + transport. Only uncompressed data may be transported. + +7.3.3.1 Client–>Server + XIEP_PUT_TILE + iob_id XIT_IOB + x CARD32 + y CARD32 + width CARD32 + height CARD32 + plane_mask CARD32 + final BOOL + image_data XIT_IDATA + => + none + service class value: 0 + errors: IDChoice, MATCH, ACCESS + events: none + + XIEP_PUT_TILE transfers an uncompressed image data tile from a client buffer across the + wire into a server IOB. The client speci�es both the tile size and its destination location in + the receiving IOB. The IOB must exist and the transport context be previously established + (XIEP_SET_TRANSPORT). + + + + + REQUESTS AND REPLIES 7–23 + IOB_id is the id of the receiving IOB. X and y specify the upper left hand corner (in IOB + coordinates) of the destination location. Height and width specify the tile size. Plane_mask + identi�es which data planes are being sent. Final is a boolean which indicates if all IOB data + (all tiles) have been sent. Image_data is the data segment to be transported from client to + server. + + Bitonal Monochromatic + Transport of bitonal monochromatic image data always occurs in the same fashion (Band_ + Interleaved_by_Pixel, Band_Interleaved_by_Plane, and Bit_Interleaved_by_Plane are all + degenerate). In this case, the client buffer is simply an array of bits, one per pixel. + + Continuous Tone Monochromatic - Pixel Aggregated + Transport of continuous tone monochromatic image data can occur in two fashions: by Band_ + Interleaved_by_Pixel and Band_Interleaved_by_Plane which are degenerate, or by Bit_ + Interleaved_by_Plane. As there is only one spectral band, the image data organization in + the client buffer for the �rst case is simply an array of pixels, n bits per pixel. + + Continuous Tone Monochromatic - Bit Interleaved by Plane + In the Bit_Interleaved_by_Plane mode transport of continuous tone monochromatic image + data, the client has the option of sending a tile from one through n data planes. If more than + one plane is to be transported, the planes must abut each other (long word alignment of the + planes) in the client’s buffer. + + Continuous Tone Polychromatic - Band Interleaved by Pixel + Transport of continuous tone polychromatic image data can occur in any of the three formats: + Band_Interleaved_by_Pixel, Band_Interleaved_by_Plane, and Bit_Interleaved_by_Plane. In + the Band_Interleaved_by_Pixel mode the client buffer is once again simply an array of pixels, + n bits per pixel, where the r-g-b bits make up the total n. No option exists regarding sending + a single bit plane or spectral band. + + Continuous Tone Polychromatic - Band Interleaved by Plane + In the Band_Interleaved_by_Plane mode, the client has the option of sending a tile from one + through n (max 3) spectral bands. If more than one data plane (band in this case) is to be + transported, they must abut each other (long word alignment of the planes) in the client’s + buffer. + + Continuous Tone Polychromatic - Bit Interleaved by Plane + In the Bit_Interleaved_by_Plane mode, the client has the option of sending one through n data + planes (each data plane is now a bit plane). If more than one data plane (bit plane in this + case) is to be transported, they must abut each other (long word alignment of the planes) in + the client’s buffer. + Specifying a non existent IOB generates an IDChoice error. Specifying an IOB which is + unconstrained generates a MATCH error. A mismatch between the receiving IOB’s component- + space-organization and the current transport context’s component-space-organization (ie. + trying to send an rgb color image over the wire into a monochrome IOB) generates a MATCH + + + +7–24 REQUESTS AND REPLIES + error. Attempts to transport to an IOB which has not had a transport context established + (XIEP_SET_TRANSPORT) generates an ACCESS error. + +7.3.3.2 Server–>Client + XIEP_GET_TILE + iob_id XIT_IOB + x CARD32 + y CARD32 + width CARD32 + height CARD32 + plane_mask CARD32 + final BOOL + => + image_data XIT_IDATA + service class value: 0 + errors: IDChoice, MATCH, ACCESS + events: none + + XIEP_GET_TILE transfers an uncompressed image data tile from a server IOB across the + wire into a client buffer. The client speci�es both the tile size and its source location in the + sending IOB. The IOB must be preexisting, and the transport context previously established + (XIEP_SET_TRANSPORT). + IOB_id is the id of the sending IOB. X and y specify the upper left hand corner (in IOB + coordinates) of the sending location. Height and width specify the tile size. Plane_mask + identi�es which data planes are being requested. Final is a boolean which indicates if all IOB + data (the �nal tile) has been asked for. Image_data is the data segment received from the + server. + + Bitonal Monochromatic + Transport of bitonal monochromatic image data always occurs in the same fashion (Band_ + Interleaved_by_Pixel, Band_Interleaved_by_Plane, and Bit_Interleaved_by_Plane are all + degenerate). In this case, the client buffer will be an array of bits, one per pixel. + + Continuous Tone Monochromatic - Aggregated + Transport of continuous tone monochromatic image data can occur in two fashions: by Band_ + Interleaved_by_Pixel and Band_Interleaved_by_Plane which are degenerate, or by Bit_ + Interleaved_by_Plane. As there is only one spectral band, the image data organization in + the client buffer for the �rst case is simply an array of pixels, n bits per pixel. + + Continuous Tone Monochromatic - Bit Interleaved by Plane + In the Bit_Interleaved_by_Plane mode transport of continuous tone monochromatic image + data, the client has the option of receiving a tile from one through n data planes. If more than + one plane is to be transported, the planes must abut (long word alignment of planes) in the + client’s buffer. + + Continuous Tone Polychromatic - Band Interleaved by Pixel + + + + + REQUESTS AND REPLIES 7–25 + Transport of continuous tone polychromatic image data can occur in any of the three formats: + Band_Interleaved_by_Pixel, Band_Interleaved_by_Plane, and Bit_Interleaved_by_Plane. In + the Band_Interleaved_by_Pixel mode the client buffer is once again simply an array of pixels, + n bits per pixel, where the r-g-b bits make up the total n. No option exists regarding receiving + a single bit plane or spectral band. + + Continuous Tone Polychromatic - Band Interleaved by Plane + In the Band_Interleaved_by_Plane mode, the client has the option of receiving a tile from + one through n (max 3) spectral bands. If more than one data plane (band in this case) is to + be transported, they will abut each other (long word alignment of the planes) in the client’s + buffer. + + Continuous Tone Polychromatic - Bit Interleaved by Plane + In the Bit_Interleaved_by_Plane mode, the client has the option of receiving one through n + data planes (each data plane is now a bit plane). If more than one data plane (bit plane in this + case) is to be transported, they will abut each other (long word alignment of the planes) in the + client’s buffer. + Specifying a non existent IOB generates an IDChoice error. Specifying an IOB which is + unconstrained generates a MATCH error. A mismatch between the sending IOB’s component- + space-organization and the current transport context’s component-space-organization generates + a MATCH error. Attempts to transport from an IOB which has not had a transport context + established (XIEP_SET_TRANSPORT) generates an ACCESS error. + +7.3.4 Stream Data Transport + Stream data transport allows a client to stream image data or image code information (com- + pressed image data) between a client buffer and a new (PUT) or existing (GET) IOB. In the + case of image code information (compressed image data), the server compress/decompress + step is hidden (happens without client intervention). The client controls both the compression + format and the length of stream data. Unlike tile transport, only one data plane may be trans- + ported with each stream transport protocol request. Note that this does not prevent clients + from interleaving stream transport of different planes. For stream transport, the data can + only be sent/received in sequential (raster) order - no random access is possible. + Note that unlike tile transport, in stream transport image data or image code information + is being sent sequentially, and not image data tiles randomly. This data or information is in + essence aggregated sequentially into one or more buffers and then, if necessary, decompressed + to produce the image data. Particulars of decompression on the server side of the wire depend + upon both the compression scheme involved and the server implementation (ie. G4 decompres- + sion may be conducted as code information arrives as may DCT decompression, or the server + may chose to wait for the complete code information to be available before decompression). + + + + +7–26 REQUESTS AND REPLIES + 7.3.4.1 Client–>Server + XIEP_PUT_STREAM + iob_id XIT_IOB + byte_count CARD32 + final BOOL + plane_num CARD8 + image_data XIT_IDATA + => + none + service class value: 0 + errors: IDChoice, MATCH, ACCESS + events: none + + XIEP_PUT_STREAM transfers image data or image code information (compressed image + data) from a client buffer across the wire into a server IOB. If image code information is + transported, it is decompressed into image data before being placed in the IOB. The IOB + must be newly created (XIEP_CREATE_RESOURCE), and the transport context previously + established (XIEP_SET_TRANSPORT). + IOB_id is the id of the receiving IOB. Byte_count speci�es the number of bits of valid image + data or code information in the buffer. Final is a boolean which indicates if all image data or + code information has been sent. Plane_num identi�es which bit plane is being sent. Image_ + data is the image data or image code information (compressed image data) to be transported + from client to server. + + Bitonal Monochromatic + Transport of bitonal monochromatic image data or image code information (compressed image + data) always occurs in the same fashion (Band_Interleaved_by_Pixel, Band_Interleaved_by_ + Plane, and Bit_Interleaved_by_Plane are all degenerate). In the stream uncompressed (PCM) + mode, the client buffer is simply an array of butted data bits (1 bit per pixel). In the stream + compressed mode (G4) the client buffer is an array of butted code bit strings. + + Continuous Tone Monochromatic - Pixel Aggregated + Transport of continuous tone monochromatic image data or image code information (com- + pressed image data) can occur in two fashions: by Band_Interleaved_by_Pixel and Band_ + Interleaved_by_Plane which are degenerate, or by Bit_Interleaved_by_Plane. In the �rst case, + for stream uncompressed (PCM) mode, the client buffer is simply an array of butted data bits + (n bits per pixel). In the stream compressed mode (DCT) the client buffer is an array of butted + code bit strings. + + Continuous Tone Monochromatic - Bit Interleaved by Plane + In the Bit_Interleaved_by_Plane mode transport of continuous tone monochromatic image + data or image code information (compressed image data), the client may only send image data + or image code information (compressed image data) from one data plane (bit plane) in each + transport call. In the stream uncompressed (PCM) mode, the bit plane in the client’s buffer is + simply an array of butted data bits. In the stream compressed mode (G4) the client buffer is + an array of butted code bit strings. + + Continuous Tone Polychromatic + + + REQUESTS AND REPLIES 7–27 + Transport of continuous tone polychromatic image data or image code information (compressed + image data) can occur in three formats: Band_Interleaved_by_Plane, Bit_Interleaved_by_ + Plane, and Band_Interleaved_by_Pixel. + + Continuous Tone Polychromatic - Band Interleaved by Pixel + In the Band_Interleaved_by_Pixel mode, uncompressed image data or image code information + (compressed image data) for all bands is sent. + + Continuous Tone Polychromatic - Band Interleaved by Plane + In the Band_Interleaved_by_Plane mode, the client has the option of sending image data or + image code information (compressed image data) for any one plane (spectral band) In the + stream uncompressed (PCM) mode, the band in the client’s buffer is simply an array of butted + data bits. In the stream compressed mode (DCT) the client buffer is an array of butted code + bit strings for the particular band. + + Continuous Tone Polychromatic - Bit Interleaved by Plane + In the Bit_Interleaved_by_Plane mode, the client has the option of sending image data or + image code information (compressed image data) from any one data plane (bit plane). In the + stream uncompressed (PCM) mode, the bit plane in the client’s buffer is simply an array of + butted data bits (1 per pixel). In the stream compressed mode (G4) the client buffer is an + array of butted code bit strings. + Specifying a non existent IOB generates an IDChoice error. Specifying an IOB which is + unconstrained generates a MATCH error. A mismatch between the receiving IOB’s component- + space-organization and the current transport context’s component-space-organization (ie. + trying to send an rgb color image over the wire into a monochrome IOB) generates a MATCH + error. Attempts to transport from an IOB which has never had a transport context established + (XIEP_SET_TRANSPORT) generates an ACCESS error. + +7.3.4.2 Server–>Client + XIEP_GET_STREAM + iob_id XIT_IOB + max_bytes CARD32 + plane_num CARD8 + => + final BOOL + byte_count CARD32 + image_data XIT_IDATA + service class value: 0 + errors: IDChoice, MATCH, ACCESS + events: none + + XIEP_GET_STREAM transfers image data or image code information (compressed image data) + from a server IOB across the wire to a client buffer. In compressed mode, the server extracts + image data from the IOB and compresses it before putting it on the wire. The IOB must be + preexisting, and the transport context previously established (XIEP_SET_TRANSPORT). + IOB_id is the id of the sending IOB. Max_bytes is the maximum number of bytes the client is + prepared to receive (typically buffer size). Plane_num identi�es which bit plane is to be sent. + + +7–28 REQUESTS AND REPLIES + Final is a boolean which indicates if all image data or code information has been sent. Byte_ +count speci�es the number of bytes of valid image data or code information in the buffer. +Image_data is the image data or image code information (compressed image data) which has +bene transported from server to client. + +Bitonal Monochromatic +Transport of bitonal monochromatic image data or image code information (compressed image +data) always occurs in the same fashion (Band_Interleaved_by_Pixel, Band_Interleaved_by_ +Plane, and Bit_Interleaved_by_Plane are all degenerate). In the stream uncompressed (PCM) +mode, the client buffer will contain an array of butted data bits (1 bit per pixel). In the stream +compressed mode (G4) the client buffer will contain an array of butted code bit strings. + +Continuous Tone Monochromatic - Pixel Aggregated +Transport of continuous tone monochromatic image data or image code information (com- +pressed image data) can occur in two fashions: by Band_Interleaved_by_Pixel and Band_ +Interleaved_by_Plane which are degenerate), or by Bit_Interleaved_by_Plane. In the �rst +case, in the stream uncompressed (PCM) mode, the client buffer will be an array of butted +data bits (n bits per pixel). In the stream compressed mode (DCT) the client buffer will be an +array of butted code bit strings. + +Continuous Tone Monochromatic - Bit Interleaved by Plane +In the Bit_Interleaved_by_Plane mode transport of continuous tone monochromatic image +data or image code information (compressed image data), the client has the option of receiving +the image data or image code information (compressed image data) from one bit plane. In +the stream uncompressed (PCM) mode, each bit plane in the client’s buffer will be an array +of butted data bits. In the stream compressed mode (G4) the client buffer will be an array of +butted code bit strings. + +Continuous Tone Polychromatic +Transport of continuous tone polychromatic image data or image code information (compressed +image data) can occur in three formats: Band_Interleaved_by_Plane, Bit_Interleaved_by_ +Plane, and Band_Interleaved_by_Pixel. + +Continuous Tone Polychromatic - Band Interleaved by Pixel +In the Band_Interleaved_by_Pixel mode, uncompressed image data or image code information +(compressed image data) for all bands is sent. + +Continuous Tone Polychromatic - Band Interleaved by Plane +In the Band_Interleaved_by_Plane mode, the client has the option of receiving image data or +image code information (compressed image data) from one spectral band (all_planes false). In +the stream uncompressed (PCM) mode, each band in the client’s buffer is simply an array of +butted data bits. In the stream compressed mode (DCT) the client buffer will be an array of +butted code bit strings. + +Continuous Tone Polychromatic - Bit Interleaved by Plane + + + + + REQUESTS AND REPLIES 7–29 + In the Bit_Interleaved_by_Plane mode, the client has the option of receiving image data or + image code information (compressed image data) from one bit plane. In the stream uncom- + pressed (PCM) mode, each bit plane in the client’s buffer will be an array of butted data bits + (1 per pixel). In the stream compressed mode (G4) the client buffer will be an array of butted + code bit strings. + Specifying a non existent IOB generates an IDChoice error. Specifying an IOB which is + unconstrained generates a MATCH error. A mismatch between the receiving IOB’s component- + space-organization and the current transport context’s component-space-organization (ie. + trying to send an rgb color image over the wire into a monochrome IOB) generates a MATCH + error. Attempts to transport from an IOB which has never had a transport context established + (XIEP_SET_TRANSPORT) generates an ACCESS error. + +7.3.5 Abort Transport + XIEP_ABORT_TRANSPORT + iob_id XIT_IOB + plane_mask CARD32 + => + none + service class value: 0 + errors: none + events: none + + XIEP_ABORT_TRANSPORT is used to abort wire transport before a �nal flag is sent. + IOB_ID is the id of the IOB which is the source of (server->client) or the destination for (client- + >server) image data and to/from which image data is being transported. Plane_mask is a bit + mask with one bit per image plane. Image transport may be aborted on a per plane basis. + When the server receives an abort request, all image data which is in intermediate buffers + (not yet sent, or not yet overlaid onto the IOB) is deleted, and the �nal flag is set for that + plane. + There is no return value from XIEP_ABORT_TRANSPORT, and no possible errors. + + + + +7–30 REQUESTS AND REPLIES + 7.4 Process Services + + Process services provide for the application of low level image operators to image data primar- + ily in support of preparation for or improvement of its display. These functions take one or + more input operands including existing image objects, and produce a two dimensional array + of data which can be treated as either a new (modi�ed or enhanced) image object, or a control + plane for other operations. As such, process services can be consider as "image in –> image + out" functions. + Many process protocol functions take a constant as one of the image operands. This constant + is a shorthand format for an image object of constant value. The server in essence constructs + a "logical" image object whose value is equal to the speci�ed constant at all locations, and + whose extent is suf�cient for the operation at hand (typically identical in size to the other + "physical" image operand). These "constant image objects" are temporary entities which exist + only during the operation and can not be referenced by the client outside of the operation. + "Constant" images are cast by the server as type constrained or unconstrained as the situation + demands. + All process services take an image domain control context (either a region of interest {ROI} or + a control processing plane {CPP}) and operate on the pixels identi�ed by the domain control + context. The resulting image object is identical in size to either the subset of the input image + de�ned by an ROI type IDC, or to the original image object if a CPP type IDC is used. In the + latter case, the output image data is valid only at the points speci�ed by the CPP. Data at all + other points is unpredictable. + Constrained and unconstrained model operation is particularly relevant to process services. + Each subsection of the process services section contains a paragraph which outlines con- + strained and unconstrained modes of operation. Individual functions note exceptions to the + overall comments. Where a function can only accept and produce constrained image data, this + is noted and no "constrained" control boolean is provided. Where the option does exist, the + protocol function includes a "constrained" control boolean which informs the server to apply + the default constraint model and produce constrained output. + Process services can be applied to mono and polychromatic (rgb) images. In general, the func- + tions will accept lists of parameters (one entry per spectral component), and will operate on + each of the three spectral components (r, g, b) as if they were three separate IOB’s. Different + parameter values per spectral component are possible . Clients who wish to operate only on a + single spectral component may be able to set parameter values in certain cases to make this + happen. If not, clients have the option of expanding the spectral components into separate + images, operating individually on the components, and then recombining them. Exceptions + are noted on a function by function basis. + While control over protocol implementation (server design) is out of the realm of this speci�- + cation, its is the author’s intent to limit processing to spatial domain techniques (vs spatial + frequency) at this time. As such, the protocol does not support the de�nition or communication + of spatial frequency domain (such as Fourier) data (including images and �lters), or spatial + frequency domain processes. + Processing services are segmented into the following categories and include the following + functions: + • Point Processing + + + REQUESTS AND REPLIES 7–31 + • Area Processing + • Ensemble Processing + • Geometric Processing + • Radiometric Processing + + + + +7–32 REQUESTS AND REPLIES + 7.4.1 Point Processing + Point processing allows a client to apply a client speci�ed transfer function to remap an + input pixel value to an output pixel value with no dependency upon surrounding (area) input + pixels. Point processing can decrease, preserve, or increase the number of bits per pixel per + component (gray->b&w, b&w->b&w, b&w->gray) and preserve or increase the number of + spectral components (mono->mono, color->color, mono->color). Typically, it is used for gray + scale luminance transforms (gray->gray), simple color remapping (color->color), and pseudo + coloring (b&w->color, gray->color). While a color image can be remapped into another color + image with equal r-g-b values on a per pixel basis and result in a "gray scale" display, the + underlying data remains multispectral. + XIEP_POINT + iob_id1 XIT_IOB + iob_id2 XIT_IOB + idc XIT_IDC + new_quantum ListofCARD8 + transfer_function ListofListofCARDnn + => + none + service class value: 1 + errors: IDChoice, ALLOC, VALUE,MATCH + events: XIE_COMPUTATION_COMPLETE + + XIEP_POINT creates a new server IOB from an existing server IOB by remapping each input + IOB value into a new output IOB value. The output value depends solely upon the input pixel + value (no source area dependency). The function is designed to allow the client to apply a + client speci�ed transfer function. + IOB_id1 is the id of the source image object. IOB_id2 is the client speci�ed id to be assigned + to the newly created (resulting) image object. Idc controls the subset of the image which will + be operated upon. Transfer_function is a list of what are in essence look up tables - one per + output spectral component. Each one must be long enough so that all potential values of + the input can be used as an index into the table. New_quantum is a list (one per spectral + component) of the number of bits per pixel (per spectral component) of the resulting value + which derives from the look up table. This allows the transfer function to both modify image + data values, and bits per pixel per spectral component. If the input IOB is monochromatic and + the client speci�es one transfer_function, the output will also be monochromatic. If the input + is monochromatic and the user speci�es 3 transfer_functions, the output will be trichromatic. + The input IOB must be constrained, and the output IOB is constrained. The input image + object may be either mono or poly chromatic. The output image object will at least be mono + chromatic, but may be promoted to poly chromatic as discussed above. + XIEP_POINT operates on the subset of the input image de�ned by the IDC. If the IDC is of + type CPP, the output image object is equal in size to that of the input image object, but valid + only at those points de�ned by the CPP. If IDC is of type ROI, the output image object is less + than or equal to the size of the input image object. + + + + + REQUESTS AND REPLIES 7–33 + Speci�cation of an invalid source IOB, an already in use resource id for the destination IOB, + or an invalid IDC generates an IDChoice error. Inability of the server to allocate a new IOB + generates an ALLOC error. An out of range new quantum value generates a VALUE error. + Speci�cation of an rgb input IOB and a single transfer_function results in a MATCH error as + does speci�cation of an unconstrained input IOB. + Client’s which request noti�cation are noti�ed of the operation’s completion by an XIE_ + COMPUTATION_COMPLETE event. + + + + +7–34 REQUESTS AND REPLIES + 7.4.2 Area Processing + Area processing produces a data response at each pixel based upon area operations at and + around the source pixel. The data response array may be considered to be an image and is + stored as an IOB. + Area processing takes a single input image object operand, a single input IDC operand of type + ROI or CPP, a single input IDC operand of type TMP, and produce a single image object output + operand. The value of the output image object at each point [selected by the IDC of type ROI + or CPP], is determined in a similar fashion for each areawise operation: + 1. The pointwise arithmetic combination (sum, product) of the TMP + coef�cient and the source image operand are taken (this produces + a 2d array of coef�cients some of which may intentionally be + unde�ned - ie. potential for small size, and / or sparce population). + + 2. An algebraic operator is applied to this data (sum, minimum, maximum) + which reduces the two dimensional array to a single value (addition + adds up all of these values, minimum and maximum select the minimum + and maximum values respectively. + + Note that the most familiar of these area operations is implemented as a pointwise (across the + area) product, followed by an area summation. This is the normal convolution process. + The location (overlay or registration) of the template relative to the image point in question + is established by the template’s "centering" parameter (see XIEP_CREATE_IDC description of + templates). + XIEP_AREA + iob_id1 XIT_IOB + iob_id2 XIT_IOB + idc_c XIT_IDC {ROI,CPP} + idc_t XIT_IDC {TMP} + operation1 XIT_AREA_OP1 + operation2 XIT_AREA_OP2 + constrain BOOL + => + none + service class value: 1 + errors: IDChoice, ALLOC + events: XIE_COMPUTATION_COMPLETE + + XIEP_AREA performs generalized area functions including additive and multiplicative, + minimization, maximization, and summation. In particular, it adds or multiplies the TMP + contents to the image contents on a pointwise basis and then minimizes, maximizes (selects + the minimum or maximum), or sums the results. + IOB_id1 is the source image object. IDC_c (ROI, CPP) controls the subregion to which the + overall process is applied. IDC_t (TMP) contains the area coef�cients and controls the subset + of the source image surrounding the current pixel to which the process applies. IOB_id2 is + the client speci�ed id to be assigned to the newly created (resulting) image object. Constrain + determines if the default constraint model will be applied upon completion. + + + + + REQUESTS AND REPLIES 7–35 + In the case where operation1 is multiplication and operation2 is summation, XIEP_AREA per- + forms generalized convolution. In particular, it convolves a user speci�ed convolution kernel + (represented by the TMP type IDC) with the subset of the source image object producing a + new image object. IDC_t (TMP) contains the kernel coef�cients and controls the subset of the + image to which the summation applies. + Note that by using the template mechanism (IDC of type TMP) both fully and partially + populated convolution kernels may be represented and applied. The convolution kernel must + be smaller in extent than the region of the image to which it will be applied. Practically, 3 x + 3 and 5 x 5 convolution kernels should be considered. The process consists of multiplying the + TMP contents by the image contents on a pointwise basis, and summing the results. + The source image object must be large enough to encompass all the points identi�ed by the + IDC. + The input image object maybe either constrained or unconstrained. If the source image is + unconstrained or the process produces a value outside of the dynamic range of the quantized + component, conversion to unconstrained occurs. If the constrain boolean is true, the constraint + model is applied producing constrained output data. + The input image object may be either mono or poly chromatic. The output image object + will be of the same type (mono or poly chromatic). As the TMP type IDC has no provision + for speci�cation of parameters by spectral component, the same template parameters and + operation will be applied to all spectral components. Clients desiring different TMP’s per + spectral component should separate the spectral components, operate upon them separately, + and then recombine them. + Speci�cation of an invalid source IOB, an already in use resource id for the destination IOB, + or an invalid IDC generates an IDChoice error. Inability of the server to allocate a new IOB + generates an ALLOC error. + Client’s which request noti�cation are noti�ed of the operation’s completion by an XIE_ + COMPUTATION_COMPLETE event. + + + + +7–36 REQUESTS AND REPLIES + 7.4.3 Ensemble Processing + In ensemble processing, operations are performed on pointwise basis between spatially reg- + istered points in the two image operands. The IDC is used simply to identify connected or + disconnected subregions to be used as input operand data (IDC is simply a boolean selector). + Ensemble processing is divided into four classes: + • Arithmetic + • Relational + • Logical + • Mathematical + + All classes can accept and potentially produce unconstrained image data except the logical + class which will only accept and produce constrained image data. For all other classes, where + multiple images are input to the operation, if all image inputs are not the same (either + constrained or unconstrained), constrained data is promoted to unconstrained before the + operation is conducted. + In general, all ensemble services operate on either mono or poly chromatic images. For poly + chromatic images, the operations are performed on a band by band basis and the resulting + image is also poly chromatic. + +7.4.3.1 Arithmetic + XIEP_ARITH + iob_id1 XIT_IOB + iob_id2 XIT_IOB + constant LISTofCARDnn + iob_id3 XIT_IOB + idc XIT_IDC + operator XIT_ARITH_OP + constrain BOOL + => + none + + service class value: 1 + errors: IDChoice, ALLOC, MATCH, VALUE + events: XIE_COMPUTATION_COMPLETE + + XIEP_ARITH performs arithmetic functions (add, subtract, multiply, divide, minimum, maxi- + mum) between two image objects or between an image object and a constant (image) producing + a new image object. + IOB_id1 and iob_id2 are the two source image objects, and constant is the constant image. + When two IOB’s are involved, iob_id2 is non null and constant is ignored. If the operation + involves a constant, iob_id2 is null and constant is non null. IOB_id3 is the client speci�ed id + to be assigned to the newly created (resulting) image object. IDC controls the subset of the + images which will be operated upon. Operator controls which arithmetic operation will be + performed between the two images or between the image and the constant (image). Constrain + determines if the default constraint model will be applied upon completion. + + + + + REQUESTS AND REPLIES 7–37 + The source image objects need not be the same size, but they must be large enough to en- + compass all the points identi�ed by the IDC. As the IDC is IOB relative, it is the users + responsibility to ensure spatial alignment of the two IOB contents. + The input image objects maybe either constrained or unconstrained. If the operation involves + a constant image and an unconstrained IOB, the constant will be promoted to unconstrained + before the operation is performed. If either image is unconstrained or the operation produces + a value outside of the dynamic range of the quantized component, conversion to unconstrained + occurs. Thus, the resulting image object may be constrained or unconstrained. If the constrain + boolean is true, the default constraint model will be applied upon completion. + The source images must have the same number of spectral components or an error is gener- + ated. Arithmetic operations occurs on a spectral component by spectral component basis. + Speci�cation of an invalid source IOB, an already in use resource id for the destination IOB, + or an invalid IDC generates an IDChoice error. Inability of the server to allocate a new IOB + generates an ALLOC error. Difference between source IOB’s number of spectral components + generates a MATCH error. Arithmetic failures (overflow, underflow, divide by zero) generate a + VALUE error. + Client’s which request noti�cation are noti�ed of the operation’s completion by an XIE_ + COMPUTATION_COMPLETE event. + +7.4.3.2 Relational + XIEP_COMPARE + iob_id1 XIT_IOB + iob_id2 XIT_IOB + constant LISTofCARDnn + cpp LISTofXIT_IDC {CPP} + idc XIT_IDC {CPP or ROI} + operator XIT_PRED_TYPE + combine BOOL + => + none + service class value: 1 + errors: IDChoice, ALLOC, MATCH + events: XIE_COMPUTATION_COMPLETE + + XIEP_COMPARE compares two image objects or an image object and a constant on a point- + wise basis and generates a CPP type IDC (boolean bitmap) which reflects the results of the + pointwise comparison. It may be used to perform either a spectral component by spectral + component comparison or a complete image (all components taken together) comparison. + IOB_id1 and iob_id2 are the two source image objects, and constant is the constant value. + When two IOB’s are involved, iob_id2 is non null and constant is ignored. If the operation + involves a constant, iob_id2 is null and constant is non null. LISTofCpp is the client assigned + id’s for the newly created control processing planes which contain the comparative results. Idc + controls the subset of the images which will be compared. Operator is the logical predicate + operator used in the comparison. Combine is a boolean which determines if the comparison + should be done on a spectral component by spectral component basis, or on an all components + basis. + + + + +7–38 REQUESTS AND REPLIES + The source image objects need not be the same size, but they must be large enough to en- + compass all the points identi�ed by the IDC. As the IDC is IOB relative, it is the users + responsibility to ensure spatial alignment of the two IOB contents. + The input image objects maybe either constrained or unconstrained. If the operation involves + a constant image and an unconstrained IOB, the constant will be promoted to unconstrained + before the operation is performed. If the input image objects are not both constrained, both + are converted to unconstrained before comparison occurs. The source images must have the + same number of spectral components. + If the source images are monochromatic, there is only one output CPP. If the source images are + polychromatic and the combine boolean is true, there is still only one output CPP. If the source + images are polychromatic and the combine boolean is false, there are three output CPP’s. + The combine option is only meaningful for the "equal to" and "not equal" to operators. In these + cases, equality is established on a component by component basis and then ’anded’ to derive + image equality. Inequality is then simply a not of this result. These combine operations are + provided as a convenience packaging (they can easily be built using other protocol functions). + The function does not support rgb distance metrics, and so, combined less than, less than + or equal to, greater than, greater than or equal to function are not supported. Clients may + implement these by using the spectral separate, mathematic process, arithmetic process, and + relational process functions. + The output CPP has a value of 1 where ever the expression is true, and a value of 0 where it + is false or the controlling IDC prevents comparison. + Speci�cation of an invalid source IOB, an already in use resource id for the destination IOB, + or an invalid IDC generates an IDChoice error. Inability of the server to allocate a new IOB + generates an ALLOC error. + Client’s which request noti�cation are noti�ed of the operation’s completion by an XIE_ + COMPUTATION_COMPLETE event. + +7.4.3.3 Logical + XIEP_LOGICAL + iob_id1 XIT_IOB + iob_id2 XIT_IOB + constant LISTofCARDnn + iob_id3 XIT_IOB + idc XIT_IDC + operator XIT_LOGICAL_OPS + => + none + + service class value: 1 + errors: IDChoice, ALLOC, MATCH + events: XIE_COMPUTATION_COMPLETE + + XIEP_LOGICAL performs bitwise (logical plane wise) operations on individual images, and + between two IOB’s or an IOB and constant (image). All logical operators are pointwise, and all + produce a new image object as a result. + + + + + REQUESTS AND REPLIES 7–39 + IOB_id1 and iob_id2 are the two source image objects, and constant is the constant value. + When two IOB’s are involved, iob_id2 is non null and constant is ignored. If the operation + involves a constant (image or otherwise), iob_id2 is null and constant is non null. IOB_id3 is + the client speci�ed id to be assigned to the newly created (resulting) image object. Idc controls + the subset of the images which will be logically combined. Operator is the logical combination + operator to be used. + In the case of the ’not’ operation, bitwise inversion is performed. In the case of ’shift_up’ and + ’shift_dn’, the constant determines how many bits. Bits shifted in are zero �lled. + The source images must have the same number of spectral components. Combining (and, or, + xor) occurs a spectral component by spectral component basis. and on a bit wise basis within + spectral component. If the images differ in depth, the shallower is extended to the same depth + as the deeper, with all additional planes being zero �lled. The resulting image has the same + number of spectral components as the source images. + The source image objects need not be the same size, but they must be large enough to en- + compass all the points identi�ed by the IDC. As the IDC is IOB relative, it is the users + responsibility to ensure spatial alignment of the two IOB contents. + The input image objects may only be constrained. The resulting image object is also con- + strained. + Speci�cation of an invalid source IOB, an already in use resource id for the destination IOB, + or an invalid IDC generates an IDChoice error. Inability of the server to allocate a new IOB + generates an ALLOC error. Speci�cation of an unconstrained IOB or spectral mismatches + between IOB’s generates a MATCH error. + Client’s which request noti�cation are noti�ed of the operation’s completion by an XIE_ + COMPUTATION_COMPLETE event. + +7.4.3.4 Mathematical + XIEP_MATHF + iob_id1 XIT_IOB + iob_id2 XIT_IOB + idc XIT_IDC + function XIT_MATHF + constrain BOOL + => + none + service class value: 1 + errors: IDChoice, ALLOC, VALUE + events: XIE_COMPUTATION_COMPLETE + + XIEP_MATHF applies a single operand mathematical function to the input image on a point- + wise basis (at all points selected by the idc) producing a new image. + IOB_id1 is the source image object. IDC controls the subset of the image to which the math + function will be applied. IOB_id2 is the client speci�ed id to be assigned to the newly cre- + ated (resulting) image object. Function selects which mathematical function will be applied. + Constrain determines if the default constraint model will be applied upon completion. + + + + +7–40 REQUESTS AND REPLIES + The source image object must be large enough to encompass all the points identi�ed by the +IDC. +While the input image object maybe either constrained or unconstrained, in most cases, the +output object will be unconstrained. If the constrain boolean is true, the default constraint +model will be applied upon completion. +Speci�cation of an invalid source IOB, an already in use resource id for the destination IOB, +or an invalid IDC generates an IDChoice error. Inability of the server to allocate a new IOB +generates an ALLOC error. Mathematical errors such as overflow and invalid input (sqrt(-1)) +generate a VALUE error. +Client’s which request noti�cation are noti�ed of the operation’s completion by an XIE_ +COMPUTATION_COMPLETE event. + + + + + REQUESTS AND REPLIES 7–41 + 7.4.4 Geometric + Geometric services provide for the ability to choose a subset of an image for display, and adjust + the image with regards to the two spatial dimensions. Subsetting is provided for by a crop + function, adjustment in the two spatial dimensions via translate, scale, rotate, and mirror + functions. + All geometric services operate on either mono or poly chromatic images. For poly chromatic + images, the operations are performed individually on each of the bands and the resulting + image is also poly chromatic. + Geometric protocol functions include: + • XIEP_SCALE - scale image in x and y directions + • XIEP_ROTATE - rotate image around z axis + • XIEP_MIRROR - rotate image around x and/or y axes + • XIEP_CROP - extract a subset of an image + • XIEP_TRANSLATE - shift and combine two images + + All geometric services can accept either constrained or unconstrained image data in. No + geometric services offer a constrain control boolean. The output image will be of the same type + (constrained or unconstrained) as the input. + +7.4.4.1 Crop Image + XIEP_CROP + src_iob XIT_IOB + dst_iob XIT_IOB + idc XIT_IDC {ROI} + => + none + service class value: 0 + errors: IDChoice, ALLOC, VALUE + events: XIE_COMPUTATION_COMPLETE + + XIEP_CROP creates a new server IOB from an existing server IOB by cropping the old IOB + data in either or both the X and Y dimensions. + SRC_iob is the id of the source image object. DST_iob is the id of the destination IOB (to be + created). The idc of type roi de�nes the geometric extent of the source image to be cropped. + The server creates a new IOB to receive the cropped image data and attributes, and uses the + client speci�ed dst_iob as its id. + Speci�cation of an invalid source IOB, an already in use resource id for the destination IOB, + or an invalid IDC generates an IDChoice error. Inability of the server to allocate a new IOB + generates an ALLOC error. An out of range parameter value generates a VALUE error. + An XIE_COMPUTATION_COMPLETE event occurs when the destination IOB is created and + �lled with the resulting cropped data. + + + + +7–42 REQUESTS AND REPLIES + 7.4.4.2 Translate Image + XIEP_TRANSLATE + src_iob XIT_IOB + dst_iob XIT_IOB + src_idc XIT_IDC + dst_idc XIT_IDC + constant LISTofCARDnn + => + none + service class value: 0 + errors: IDChoice, ALLOC, VALUE, MATCH + events: XIE_COMPUTATION_COMPLETE + + XIEP_TRANSLATE allows one image to be translated or shifted relative to another image + and then combined via simple overlay. In essence, it is the inverse of crop as it provides for a + simple paste operation. + SRC_IOB acts as the source of image data for the translate and combine operation. DST_IOB + acts as the destination or receiving location of the translate and combine operation. SRC_IDC + determines the subset of SRC_IOB that will be used. DST_IDC determines the location and + clip boundaries in DST_IOB that will receive the source image data. + The two IDC’s (SRC_IDC and DST_IDC) are conceptually aligned at their upper left corner. + If SRC_IDC is smaller than DST_IDC in either direction, the remaining pixels in the area + prescribed by the DST_IDC are �lled with the CONSTANT value in that direction. If SRC_ + IDC is larger than DST_IDC in either direction, the source data is clipped to �t with DST_IDC + in that direction. + Note that both SRC_IOB and SRC_IDC are optional (both must be present or absent). If they + are absent, CONSTANT is used as the source data which is pasted into the destination image + area prescribed by DST_IDC. + The server creates a new IOB to receive the combined image data and attributes, and uses the + client speci�ed dst_iob as its id. + Note that this function only supports replacement or non transparent overlay (combination) + and not alpha plane control mixing or translucency. + Both images must be constrained or unconstrained and mono chromatic or polychromatic. + If the operation involves a constant image and an unconstrained IOB, the constant will be + promoted to unconstrained before the operation is performed. + Speci�cation of an invalid source IOB, an already in use resource id for the destination IOB, + or an invalid IDC generates an IDChoice error. Inability of the server to allocate a new + IOB generates an ALLOC error. An out of range parameter value generates a VALUE error. + Mismatch in constraints or chromaticity between source images generates a MATCH error. + An XIE_COMPUTATION_COMPLETE event occurs when the destination IOB is created and + �lled with the resulting cropped data. + + + + + REQUESTS AND REPLIES 7–43 + 7.4.4.3 Scale Image + XIEP_SCALE + src_iob XIT_IOB + dst_iob XIT_IOB + pixels_per_scanline CARD32 + number_of_scanlines CARD32 + => + none + service class value: 0 + errors: IDChoice, ALLOC, VALUE + events: XIE_COMPUTATION_COMPLETE + + XIEP_SCALE creates a new server IOB from an existing server IOB by scaling the old IOB + data in either or both the x and y dimensions. + SRC_iob is the id of the source image object. DST_iob is the id of the destination IOB (to + be created). Pixels_per_scanline is the number of pixels per scan line for the scaled image. + Number_of_scanlines is the number of scan lines in the scaled image. + The two IOB’s may differ in either or both the number of pixels per scan line and the number + of scan lines. The ratio of new to old values of these two sets may be considered to be the x + and y scale factors. Scaling up or down (new value leq or new value geq old value) is allowed. + Scaling in one or both dimensions at the same time is allowed. Non integral ratios (scale + factors) is allowed. + XIEP_SCALE_IMAGE operates on the complete input image to produce the scaled output + image. Those attempting to scale a portion of a source image should use crop to extract the + sub image into a new IOB, and then scale it. + With knowledge of the display device characteristics and the original source object, a client + can achieve combinations of the following: + • scale to �t within a window + • scale preserving original aspect ratio + • scale to reproduce at original size + • ... + + The server creates a new IOB to receive the scaled image data and attributes, and uses the + client speci�ed dst_iob as its id. + Servers are free to choose their own scaling algorithms (including separate integral and non + integral ones). + Speci�cation of an invalid source IOB, an already in use resource id for the destination IOB, + or an invalid IDC generates an IDChoice error. Inability of the server to allocate a new IOB + generates an ALLOC error. An out of range parameter value generates a VALUE error. + An XIE_COMPUTATION_COMPLETE event occurs when the destination IOB is created and + �lled with the resulting scaled data. + + + + +7–44 REQUESTS AND REPLIES + 7.4.4.4 Rotate Image + XIEP_ROTATE + src_iob XIT_IOB + dst_iob XIT_IOB + angle XIT_FLOAT + width CARD32 + height CARD32 + fill LISTofCARD32 + => + none + service class value: 0 + errors: IDChoice, ALLOC, VALUE + events: XIE_COMPUTATION_COMPLETE + + XIEP_ROTATE creates a new server IOB from an existing server IOB by rotating the source + IOB data around the z axis (normal to the 2d image data x-y plane) through the center of the + source IOB. + SRC_iob is the id of the source image object. DST_iob is the id of the destination IOB (to be + created). Angle is the rotation angle in degrees measured clockwise around the z axis. Width + and height are parameters which determine the resulting size of the rotated image (dst_iob). + Fill is the value of a pixel to use in areas where the pixel value is undetermined by rotation. + XIEP_ROTATE operates on the complete input image to produce the rotated output image. + Those attempting to rotate a portion of a source image should use crop to extract the sub + image into a new IOB, and then rotate it. + The width and height parameters operate independently, but in a similar fashion. They are + used to determine the size of the resulting image (dst_iob). If either or both is zero, the + algorithm determines the smallest bounding dimension in that direction which will contain all + of the rotated source data, and sets the resulting image object to that size. In essence, setting + width and/or height to zero ensures that no rotated data is clipped in the horizontal and/or + vertical direction, and that a minimal bounding size is chosen. + If either or both is nonzero, the algorithm will set the resulting image object to the speci�ed + size. If the rotated data is larger in this direction than the destination image object, the image + is clipped symmetricaly. + In either case, the rotated data will be centered in the resulting image object, and pixels in + the rotated IOB which do not derive from source IOB pixels will have their value set to that + speci�ed in the Fill parameter. Centering the image (due to rotation around the center of the + source image) results in symmetric clipping when clipping occurs. + Servers are free to choose their own rotation algorithms (including separate integral and non + integral ones). + Invalid src_iob results in an IOB error. Inability to allocate the rotated IOB results in an + ALLOC error, while invalid parameter values result in VALUE errors. + An XIE_COMPUTATION_COMPLETE event occurs when the destination IOB is created and + �lled with the resulting rotated data. + + + + + REQUESTS AND REPLIES 7–45 + 7.4.4.5 Mirror Image + XIEP_MIRROR + src_iob XIT_IOB + dst_iob XIT_IOB + x-mirror BOOL + y-mirror BOOL + => + none + + service class value: 0 + errors: IDChoice, ALLOC + events: XIE_COMPUTATION_COMPLETE + + XIEP_MIRROR creates a new server IOB from an existing server IOB by rotating the old IOB + data around the x axis, y axis, or x & y axes of the source IOB. Only rotations of 180 degrees + are allowed which is why the function is named Mirror. This is in keeping with the package + supporting only 2d image data (no perspective transforms allowed or meaningful). + SRC_iob is the id of the source image object. DST_iob is the id of the destination IOB (to be + created). X-mirror and Y-mirror are booleans which determines if the mirror should occur + around the source IOB’s x, y, or x & y axes. + XIEP_MIRROR operates on the complete input image to produce the mirrored output image. + Those attempting to mirror a portion of a source image should use crop to extract the sub + image into a new IOB, and then mirror it. + The server creates a new IOB to receive the mirrored image data and attributes, and uses the + client speci�ed dst_iob as its id. + Speci�cation of an invalid source IOB, an already in use resource id for the destination IOB, + or an invalid IDC generates an IDChoice error. Inability of the server to allocate a new IOB + generates an ALLOC error. + An XIE_COMPUTATION_COMPLETE event occurs when the destination IOB is created and + �lled with the resulting mirrored data. + + + + +7–46 REQUESTS AND REPLIES + 7.4.5 Radiometric + Radiometric services facilitate the adjustment of an image with regards to the luminance + and/or chrominance dimensions. Radiometric functions are used to directly affect these dis- + tributions or prepare data for adjustment through the use of other point, area, and ensemble + processing services. + Radiometric protocol functions include: + • XIEP_CONSTRAIN - apply a quantization model + • XIEP_MATCH_HISTOGRAM - transform the image to have the speci�ed histogram form + • XIEP_CHROMINANCE_SEPARATE - separate a poly chromatic image into multiple + monochromatic images + • XIEP_CHROMINANCE_COMBINE - combine multiple mono chromatic images into a poly + chromatic image + • XIEP_DITHER - reduce number of quantization levels through an area technique + • XIEP_LUMINANCE - extract the luminance component from a poly chromatic image + +7.4.5.1 Constrain + XIEP_CONSTRAIN + iob_id1 XIT_IOB + => + none + service class value: 1 + errors: IDChoice + events: XIE_COMPUTATION_COMPLETE + + XIEP_CONSTRAIN is used to convert an unconstrained IOB into a constrained IOB. In + essence, it applies a client selected quantization model to the image data. Application of the + quantization model may involve steps such as absolute value, range shifting and scaling, hard + clipping, and mapping to a �xed number of quantization levels. While it is possible to perform + some of these functions through other protocol primitives, XIEP_CONSTRAIN packages them + in an essential way which support the transition from unconstrained data generated by some + server functions to constrained data that can move towards display. As such, it is considered a + primitive function. + IOB_id1 is the image object whose state is to be changed from unconstrained to constrained. + The constraint model applied is the current default constraint model. If the input image is + already constrained, and the current default constraint model is the same as the one last + applied to the image, then the function is a noop. If not, the current default constraint model + will be applied. + Constrain will operate on either mono chromatic or poly chromatic images. + No subseting by IDC mechanism is possible (the entire image is constrained). + Speci�cation of an invalid source IOB, or an already in use resource id for the destination IOB + generates an IDChoice error. + + + + + REQUESTS AND REPLIES 7–47 + Client’s which request noti�cation are noti�ed of the operation’s completion by an XIE_ + COMPUTATION_COMPLETE event. + +7.4.5.2 Histogram Matching + + + XIEP_MATCH_HISTOGRAM + iob_id1 XIT_IOB + iob_id2 XIT_IOB + idc XIT_IDC + h_shape XIT_HSHAPE + parm1 XIT_FLOAT + parm2 XIT_FLOAT + => + none + service class value: 1 + errors: IDChoice, ALLOC, MATCH + events: XIE_COMPUTATION_COMPLETE + + XIEP_MATCH_HISTOGRAM creates a new server IOB from an existing server IOB where the + output IOB differs from the input in terms of its component distribution or histogram. The + function is designed to allow the client to specify the desired state of the resulting image’s + histogram (algorithm description of resulting histogram shape). It implements operations such + as histogram equalization (flattening) and hyperbolization. + IOB_id1 is the id of the source image object. IDC_id controls the subset of the image which + will be operated upon. H_shape is the user speci�ed form of the desired output image his- + togram. IOB_id2 is the client speci�ed id to be assigned to the newly created (resulting) image + object. Parm1 and 2 are parameters which are used to adjust the algorithmic shapes. They + will be speci�ed on an hshape by hshape basis (tbs). + The input IOB must be constrained and monochromatic. Output IOB’s are always constrained + and monochromatic. + XIEP_MATCH_HISTOGRAM operates on the subset of the input image de�ned by the IDC. + Only IDC’s of type ROI are supported. Histogram matching is implemented on the server side + of the wire because it can not be implemented by a simple transfer function. In particular, + the server based implementation distributes fractional components of initial luminance levels + to destination gray levels based upon random or average neighborhood gray level techniques + (pick one). + Speci�cation of an invalid source IOB, an already in use resource id for the destination IOB, + or an invalid IDC generates an IDChoice error. Inability of the server to allocate a new IOB + generates an ALLOC error. Speci�cation of an unconstrained or polychromatic IOB generates + a MATCH error. + Client’s which request noti�cation are noti�ed of the operation’s completion by an XIE_ + COMPUTATION_COMPLETE event. + + + + +7–48 REQUESTS AND REPLIES + 7.4.5.3 Separate Spectral Components + XIEP_CHROMINANCE_SEPARATE + iob_id1 XIT_IOB + iob_id2 XIT_IOB + iob_id3 XIT_IOB + iob_id4 XIT_IOB + => + none + service class value: 1 + errors: IDChoice, ALLOC, MATCH + events: XIE_COMPUTATION_COMPLETE + + XIEP_CHROMINANCE_SEPARATE separates the three planes which make up a three plane + multispectral image into three separate monochromatic images. These images represent the + red, green, and blue components of the original image. + IOB_id1 is the id of the source image object. IOB_id2, iob_id3, iob_id4 are the client speci�ed + ids to be assigned to the newly created image objects. + The input IOB maybe constrained or unconstrained. The output IOB’s will be of the same type + (constrained or unconstrained) as the input. The input image must be poly chromatic. The + output images will be mono chromatic. + Speci�cation of an invalid source IOB, or already in use resource id’s for the destination IOB’s + generates an IDChoice error. Inability of the server to allocate the new IOB’s generates an + ALLOC error. Speci�cation of a mono chromatic input image generates a MATCH error. + Client’s which request noti�cation are noti�ed of the operation’s completion by an XIE_ + COMPUTATION_COMPLETE event. + +7.4.5.4 Combine Spectral Components + XIEP_CHROMINANCE_COMBINE + iob_id1 XIT_IOB + iob_id2 XIT_IOB + iob_id3 XIT_IOB + iob_id4 XIT_IOB + => + none + service class value: 1 + errors: IDChoice, ALLOC, MATCH + events: XIE_COMPUTATION_COMPLETE + + XIEP_CHROMINANCE_COMBINE combines the three planes which make up a three plane + multispectral image into a single multispectral image. The three component images represent + the red, green, and blue components components of the image. + IOB_id1, iob_id2, and iob_id3 represent the three color planes which are to be combined to + form the composite output multispectral image. IOB_id4 is the client speci�ed id of the output + multispectral image object. + + + + + REQUESTS AND REPLIES 7–49 + All input IOB’s must be of the same type (constrained or unconstrained). The output IOB will + be of the same type. All input images must be mono chromatic. The output image will be poly + chromatic. + Speci�cation of an invalid source IOB, or an already in use resource id for the destination + IOB generates an IDChoice error. Inability of the server to allocate a new IOB generates an + ALLOC error. If input IOB’s are of different types (constrained and unconstrained), or are not + all mono chromatic, a MATCH error occurs. + Client’s which request noti�cation are noti�ed of the operation’s completion by an XIE_ + COMPUTATION_COMPLETE event. + +7.4.5.5 Dither + XIEP_DITHER + iob_id1 XIT_IOB + iob_id2 XIT_IOB + levels LISTofCARD32 + => + none + service class value: 1 + errors: IDChoice, ALLOC, VALUE, MATCH + events: XIE_COMPUTATION_COMPLETE + + XIEP_DITHER is used to reduce the number of quantization levels. Dithering accomplishes + this by affecting adjacent pixels (area affect) to make up for lack of depth resolution. In + essence, it spreads out the value of a pixel into the surrounding area so that the visual affect + of multiple levels is preserved. + IOB_id1 is the id of the source image object. IOB_id2 is the client speci�ed id to be assigned + to the newly created (resulting) image object. Levels is the number of levels (on a component + by component basis) the source image should be dithered down to. + The input IOB must be constrained. The output IOB will be constrained. + Note that because dithering "spreads out" the value of a pixel into the surrounding areas in + order to "fool the eye" into perceiving more shades of gray or colors than are actually being + used, it generates an image which may be unsuitable for further display processing. While the + IOB generated can be operated upon by other XIE functions, the results may prove less than + meaningful. As such, dither is often one of the last steps before display. + Speci�cation of an invalid source IOB, or an already in use resource id for the destination + IOB generates an IDChoice error. Inability of the server to allocate a new IOB generates an + ALLOC error. If levels is greater than or equal to the current quantized state of the IOB, + a VALUE error is generated. If the source IOB is not of type constrained, a MATCH error + occurs. + Client’s which request noti�cation are noti�ed of the operation’s completion by an XIE_ + COMPUTATION_COMPLETE event. + + + + +7–50 REQUESTS AND REPLIES + 7.4.5.6 Luminance + XIEP_LUMINANCE + iob_id1 XIT_IOB + iob_id2 XIT_IOB + => + none + service class value: 1 + errors: IDChoice, ALLOC, MATCH + events: XIE_COMPUTATION_COMPLETE + + XIEP_LUMINANCE is used to extract or derive the luminance component of a color (polychro- + matic) image. This function is considerably different than the separate spectral component as + the luminance of a color image is derived from the color image by either a color space trans- + form (such as to LUV) or by algorithmic combination of the spectral components (RGB), and + not simply by taking one of the spectral components (such as R). + IOB_id1 is the id of the source polychromatic image object. IOB_id2 is the client speci�ed id + to be assigned to the newly created (resulting) monochromatic luminance image object. + The input IOB must be both polychromatic and constrained. The output is monochromatic and + constrained. + Speci�cation of an invalid source IOB, or an already in use resource id for the destination + IOB generates an IDChoice error. Inability of the server to allocate a new IOB generates an + ALLOC error. If the source IOB is not polychromatic and of type constrained, a MATCH error + occurs. + Client’s which request noti�cation are noti�ed of the operation’s completion by an XIE_ + COMPUTATION_COMPLETE event. + + + + + REQUESTS AND REPLIES 7–51 + 7.5 Statistics Services + + Statistical functions allow the client to ask the server to determine certain statistics for an + IOB. Statistical functions do not affect the contents of the IOB. rather, they simply report + statistical information about the IOB contents back to the client. Statistical information + includes component distributions (histogram), moment data, and local area data. + All statistics generation can be done under the control of an IDC. The IDC is used to control + the subset of the complete IOB which will contribute to the statistical calculation. + Statistical protocol functions which generate either statistical distributions or local area data, + return this information to the client. Statistical protocol functions which calculate moments + generate a new (server based) IOB which contains the moment data. This allows the moment + data to be queried like any other image, or to be used in server based enhancement processing. + Statistics functions include: + • XIEP_CALC_HISTOGRAM - get the histogram of an image + • XIEP_POINT_STATISTICS - get statistics of an image + • XIEP_AREA_STATISTICS - create a statistical image + +7.5.1 Component Distribution + XIEP_CALC_HISTOGRAM + iob_id XIT_IOB + idc_id XIT_IDC + by_component BOOL + => + histogram LISTofLISTof hist_entry + service class value: 1 + errors: IDChoice, MATCH + events: none + + where hist_entry is: + [ + index LISTofCARD32 + number XIT_FLOAT + ] + + XIEP_CALC_HISTOGRAM generates a histogram of the component values of the subset of the + IOB identi�ed by the IDC. The component distribution reflects the population of all possible + component states for a given IOB based upon actual data content. The component distri- + bution can be determined for a bitonal monochromatic image (black and white), continuous + tone monochromatic image (gray scale), or continuous tone polychromatic image (color). For + polychromatic images, the component distribution can be generated on either a per channel + (spectral component) basis (ie. 3 separate distributions) or for the distribution in the three + space (ie. 1 combined distribution) with the by_component switch controlling the option. + Note that the size of the list length entry (�rst �eld in the list) for the second list in histogram + is CARD32 (rather than the default CARD8) to allow for the potentially large number of + histogram entries. + + + +7–52 REQUESTS AND REPLIES + IOB_id is the id of the source IOB. IDC_id is the id of the IDC of type ROI or CPP to be used + in determining the subset of the image for which the distribution will be generated. + The input IOB must be of type constrained. It may be mono or poly chromatic. + The function returns the histogram to the caller. The histogram is a list of histogram entries + where each entry consists of the index or value followed by the number of pixels found with + that index or value. For color images where the by_component request dictates three separate + distributions, the index is a single value, while for full organization (by_component = false), + the index is a list of three values (in essence the color three space coordinates). + Non existent IOB or IDC generates an IDChoice error. Speci�cation of an input IOB of type + unconstrained generates a MATCH error. + +7.5.2 Point Statistics + XIEP_POINT_STATS + iob_id XIT_IOB + x CARD32 + y CARD32 + height CARD8 + width CARD8 + -> + Pixel LISTofXIT_FLOAT + Minimum LISTofXIT_FLOAT + Maximum LISTofXIT_FLOAT + Mean LISTofXIT_FLOAT + Std_dev LISTofXIT_FLOAT + Variance LISTofXIT_FLOAT + service class value: 1 + errors: IDChoice, VALUE + events: none + + XIEP_POINT_STATS is designed to allow a client to determine local area statistical informa- + tion from image data at and surrounding a speci�ed pixel within an IOB. This information is + returned by the function to the client. + Iob_id is the id of the source IOB, x and y locate the pixel in question within the IOB. Height + and width determines the size of a rectangular area around the pixel to use in the statistical + calculations. + The function returns the following information: Value is the value of the pixel at the speci�ed + location, minimum is the minimum pixel value in this area, maximum is the maximum pixel + value in the area, mean is the mean pixel value for this area, std_dev is the standard deviation + of the pixel distribution for this area, and variance is the variance of the pixel distribution for + this area. + The input IOB may be either constrained or unconstrained, and mono or poly chromatic. + The resulting data is always in float format in order to handle the unconstrained IOB case. + Each return item has an entry for each spectral component. Wire transport formats (Band_ + Interleaved_by_Pixel, ...) do not apply. + Speci�cation of a non existent IOB generates an IDChoice error. Speci�cation of out of range x + and/or y locations generates a VALUE error. + + + + REQUESTS AND REPLIES 7–53 + In essence, XIEP_POINT_STATS is a degenerate case of XIEP_AREA_STATS. It differs from + XIEP_AREA_STATS in that the function returns the limited statistical information about the + area surrounding a single pixel rather than generating a new server IOB containing statistical + information about the area surrounding all pixels. Users who only want the pixel value should + use the XIEP_GET_PIXEL function. + +7.5.3 Area Statistics + XIEP_AREA_STATS + src_iob XIT_IOB + dst_iob XIT_IOB + idc_id XIT_IDC {ROI, CPP} + edge_size CARD8 + stat_type XIT_STAT_TYPE + -> + none + service class value: 1 + errors: IDChoice, ALLOC, MATCH + events: XIE_COMPUTATION_COMPLETE + + XIEP_AREA_STATS is designed to allow a client to determine statistical information about a + subset of image data within an image, and store this information locally within a new server + IOB (ie. create a statistical image). + Src_iob is the id of the source server IOB resource, dst_iob is the id of the destination server + IOB resource which will contain the statistical information, idc_id is the id of a server IDC + resource of type ROI or CPP, edge_size is the size of the local area square region surrounding + each pixel to be used in the statistical operation, stat_type is the type of statistical image to be + generated {minimum, maximum, mean, std_dev, variance}. + The function calculates the statistical information on a pixel by pixel basis based upon the + local area surrounding pixels and stores the resulting information in the new IOB. The edge_ + size parameter determines how large the local area is. + The input IOB maybe either constrained or unconstrained. The output IOB will be of the same + type as the input IOB (constrained or unconstrained). The input may only be mono chromatic, + and the output will be mono chromatic. + Speci�cation of a non existent source IOB or a resource id for the destination IOB which is + already in use generates an IDChoice error. Speci�cation of a non existent IDC or an IDC of + type TMP (template) generates an IDChoice error. Inability of the server to allocate the new + resource results in an ALLOC error. Speci�cation of a poly chromatic source image results in + a MATCH error. + An XIE_COMPUTATION_COMPLETE event occurs when the destination IOB is created and + �lled with the resulting statistical data. + + + + +7–54 REQUESTS AND REPLIES + 7.6 Process Control Services + + Process Control class services provide the ability to de�ne and apply pipelines containing + transport, enhancement, and rendition operations. In addition to the resource functions used + to create and query pipelines, Process Control protocol functions include: + • XIEP_ADD_SEGMENT {n} - adds a processing segment to a pipeline + • XIEP_EXECUTE_PIPE {n} - begins execution of a pipeline + • XIEP_KILL_PIPE {n} - terminates (prematurely) execution of a pipeline + +7.6.1 Adding Segments + XIEP_ADD_SEGMENT + ipc_id XIT_IPC + name LISTofSTRING8 + function XIT_XIEFUNCTION + parm_bindings LISTofBINDING + -> + none + service class value: 1 + errors: IDChoice, VALUE + events: none + where + BINDING is: + [ + name STRING8 + number CARD32 + ] + + XIEP_ADD_SEGMENT adds a processing segment to the end of a pipeline. + IPC_id the id of the server pipeline resource to which the processing segment will be added. + Name is a client assigned name for this segment which will be used by other segments in + this pipeline to reference parameters from this segment. Function speci�es which of the XIE + protocol functions (that are allowed in pipelines) will be used as this pipeline segment. Note + that the function choice implicitly determines this pipeline segment’s i/o parameter types and + numbering. + Parm_bindings describe where this segments inputs will come from and outputs will flow to. + There must be as many entries in the list as their are parameters to the XIE protocol function + which makes up this segment. Within parm_bindings, name is the name of a prior segment in + the pipeline, of the pipeline itself, or the atoms "CONSTANT" or "NULL". For segment inputs, + if the input is to come from the pipeline global inputs, the pipeline name should be used and + the number is the number of the pipeline global input. If input is to come from an upstream + segment, the upstream segment name should be used, and the number is the number of + that segments output parameter. If input is a constant, number should be the value of the + constant. For segment outputs, if the output is to flow from the pipeline, name should be the + name of the pipeline and number the number of one of its output parameters. If the output + will be used downstream, or not at all, the name should be set to "NULL". + + + + + REQUESTS AND REPLIES 7–55 + The following rules apply to pipeline processing segments and their input/output parameters: + 1. Segments can only be pipelinable functions (see protocol summary appendix). + 2. Segments are added sequentially (no substitution/deletion/modi�cation). + 3. Segment input/output parameters can only be bound in the following ways: + • Input Parameters: + 1. To a constant speci�ed at segment add time. + 2. To a global pipeline input parameter. + 3. To an upstream (previously added) segment output parameter. + • Output Parameters: + 1. To a global pipeline output parameter. + 2. Left unbound (see below) + 4. Intermediate pipe results (iob’s etc) not bound to a pipe output are temporary + + If the IPC_id is not a valid IPC, or the function is not a pipelinable XIE protocol function, + an IDChoice error occurs. If a reference is made to a global pipeline of pipeline segment + parameter (index) which does not exist, a VALUE error occurs. + +7.6.2 Executing a Pipe + XIEP_EXECUTE_PIPE + ipc_id XIT_IPC + input_parms LISTofparameters + output_parms LISTofparameters + -> + none + service class value: 1 + errors: IDChoice, MATCH + events: XIE_PIPELINE_COMPLETE + + XIEP_EXECUTE_PIPE starts the execution of a pipeline. + Input and output parameters are in essence the actual parameters which will be bound to the + formal parameters of the pipeline (established at resource creation time with resource type + IPC). + If the �rst segment of the pipeline is an XIEP_PUT_STREAM, the pipeline execution will be + stalled until the client executes an XIEP_PUT_STREAM into the designated IOB. As data + arrives, it will flow into the pipeline. + If the IPC_id does not identify a valid IPC (one which exists, has at least one processing + segment, and is not in state running), an IDChoice error occurs. If any parameter (input or + output) is of the wrong type, a MATCH error occurs. + + + + +7–56 REQUESTS AND REPLIES + 7.6.3 Terminating a Pipe + XIEP_KILL_PIPE + ipc_id XIT_IPC + -> + none + service class value: 1 + errors: IDChoice + events: XIE_PIPELINE_COMPLETE + + XIEP_KILL_PIPE terminates the execution of a pipeline. IPC_id the id of the server pipeline + resource whose execution the client wishes to terminate. + Terminating the execution of a pipeline results in the termination of execution of all pipeline + processing elements. All intermediate data and state information is lost as is all pipeline + output. + Speci�cation of a non existent source IPC or one which is not currently in the process of + execution results in an IDChoice error. + An XIE_PIPELINE_COMPLETE event occurs when the pipeline is terminated. + + + + + REQUESTS AND REPLIES 7–57 + 7.7 Display Services + + As the core X protocol provides substantial machinery to facilitate pixmaps and the X image + extension works to produce (through rendition) pixmaps, the only display services in XIE deal + with time sequences, something not provided for under core X. + XIEP_DISPLAY_SEQUENCE + window_id WINDOW + gc_id GCONTEXT + frame_count CARD16 + frame_timing CARD16 + frame_list LISTofPIXMAP + forward BOOL + => + none + service class value: 3 + errors: IDChoice, VALUE + events: XIE_SEQUENCE_COMPLETE + + XIEP_DISPLAY_SEQUENCE is used to display a sequence of prerendered image frames + which are stored as server pixmaps. The client has control over the order of frames, time + delay between frame display, and direction of frame sequence play. + Window_id is the window in which to display the sequence. GC_id is the id of the GC used in + the display operation. Frame_count is the number of frames in the sequence. Frame_timing + controls the delay time in milliseconds between sequential frame displays. Frame_list is + the list of PIXMAP id’s that constitute the sequence of frames. Forward is a boolean which + controls the direction of play of the sequence. Note that the size of the list length entry (�rst + �eld in the list) for frame_list is CARD16 (rather than the default CARD8) to allow for a long + sequence of pixmaps. + Speci�cation of an invalid window_id or an invalid pixmap_id generates an IDChoice error. + Speci�cation of frame_timing which is less than that which the server can provide generates a + VALUE error. + For clients which have requested noti�cation of end of sequence events, an XIE_SEQUENCE_ + COMPLETE event occurs when the last frame of a sequence is displayed. + + + + +7–58 REQUESTS AND REPLIES + 7.8 Event Services + + X Image Extension Protocol event services provide for the selection and query of image + extension speci�c events. + +7.8.1 Select Events + XIEP_SELECT_EVENTS + event_mask CARD16 + => + none + service class value: 0 + errors: VALUE + events: none + + XIEP_SELECT_EVENTS is used by the client to select which events it wishes to be noti�ed + of. Event_mask is a bit map mask where each bit corresponds to the value of an event code. + Speci�cation of an invalid event_mask generates a VALUE error. + +7.8.2 Query Events + XIEP_QUERY_EVENTS + event_mask CARD16 + => + event_mask CARD16 + service class value: 0 + errors: none + events: none + + XIEP_QUERY_EVENTS is used by the client to determine which events it has expressed + interest in being noti�ed of. + Event_mask on the input side communicates which events the client is interested in knowing + its noti�cation status, while on the destination side, it communicates the server’s record of + which events the client will be noti�ed of. In both cases, it is a bit map mask where each bit + corresponds to the value of an event code. + + + + + REQUESTS AND REPLIES 7–59 + Chapter 8 + +EVENTS + + + All events return a message with a common pre�x as described in the Event Protocol Message + Format section. Included in this information is the event type code, and the request sequence + number. + The following sections de�ne the details of each of the image extension events. All X Image + Extension event names begin with the pre�x XIE_. Event codes are de�ned in the protocol + code summary appendix. + +8.1 COMPUTATION COMPLETE + + XIE_COMPUTATION_COMPLETE + src_iob XIT_IOB + dst_iob XIT_IOB + + An XIE_COMPUTATION_COMPLETE event occurs when client requested process protocol + functions completes (see protocol speci�cations). Speci�cally, it occurs when all the image + data that makes up the complete contents of the destination IOB which results from the + computation has been established by the server. + The event information includes the the id’s of both source and destination IOB’s. + Only clients which have requested noti�cation of this event are noti�ed. + +8.2 PIPELINE COMPLETE + + XIE_PIPELINE_COMPLETE + ipc_id XIT_IPC + + An XIE_PIPELINE_COMPLETE event occurs when client requested process pipeline com- + pletes (see protocol speci�cations). Speci�cally, it occurs when all the image data that makes + up the input image(s) has been processed by the last stage in the pipeline. + The event information includes the the id of the pipeline (IPC id). + Only clients which have requested noti�cation of this event are noti�ed. + + + + + EVENTS 8–1 + 8.3 SEQUENCE COMPLETE + + XIE_SEQUENCE_COMPLETE + + An XIE_SEQUENCE_COMPLETE event is generated when a server completes displaying a + time sequence of image frames. + + + + +8–2 EVENTS + Chapter 9 + +APPENDICES + + + +9.1 XIE Protocol Summary + + The following is a summary of the XIE protocol functions categorized into their various service + classes. A {p} following the function indicates that it can be used as a pipeline element, while + a {n} indicates that it can not be used as a pipeline element. Session Services + • XIEP_INIT_SESSION {n} - begins a client-extension server session + • XIEP_SET_DEFAULTS {n} - establish/modify operational defaults + • XIEP_QUERY_DEFAULTS {n} - query operational defaults + • XIEP_TERM_SESSION {n} - ends a client-extension server session + +Resource Services + • XIEP_CREATE_RESOURCE {n} - create a new server resource object + • XIEP_COPY_RESOURCE {n} - copy contents from source to destination resource + • XIEP_DELETE_RESOURCE {n} - delete an existing server resource object + • XIEP_QUERY_RESOURCE {n} - query an existing server resource object + • XIEP_IMPORT_IMAGE {n} - create a new server IOB resource object + • XIEP_EXPORT_IMAGE {p} - create a new server PIXMAP resource object + +Transport Services + • XIEP_SET_TRANSPORT {n} - establishes the required transport context information + • XIEP_GET_TILE {p} - transports random tiles of uncompressed image data from server to + client + • XIEP_PUT_TILE {p} - transports random tiles of uncompressed image data from client to + server + • XIEP_GET_STREAM {p} - transports a stream of compressed or uncompressed image data + from server to client + • XIEP_PUT_STREAM {p} - transports a stream of compressed or uncompressed image data + from client to server + +Process Services + + + + APPENDICES 9–1 + • XIEP_POINT {p} - applies a point (lut) transform to an image + • XIEP_AREA {p} - applies are operators to an image + • XIEP_ARITH {p} - performs arithmetic between two images + • XIEP_COMPARE {p} - compare two images + • XIEP_LOGICAL {p} - operates on the individual bit planes of an image + • XIEP_MATHF {p} - applies mathematical functions to an image + + • XIEP_SCALE {p} - scale image in x and y directions + • XIEP_ROTATE {p} - rotate image around z axis + • XIEP_MIRROR {p} - rotate image around x and/or y axes + • XIEP_CROP {p} - extract a subset of an image + • XIEP_TRANSLATE {p} - shift and combine two images + + • XIEP_CONSTRAIN {p} - apply a quantization model + • XIEP_MATCH_HISTOGRAM {p} - transform the image to have the speci�ed histogram + form + • XIEP_CHROMINANCE_SEPARATE {p} - separate a poly chromatic image into multiple + monochromatic images + • XIEP_CHROMINANCE_COMBINE {p} - combine multiple mono chromatic images into a + poly chromatic image + • XIEP_DITHER {p} - reduce number of quantization levels through an area technique + • XIEP_LUMINANCE {p} - extract the luminance component from a poly chromatic image + +Statistics Services + • XIEP_CALC_HISTOGRAM {n} - get the histogram of an image + • XIEP_POINT_STATISTICS {n} - get statistics of an image + • XIEP_AREA_STATISTICS {n} - create a statistical image + +Process Control Services + • XIEP_ADD_SEGMENT {n} - adds a processing segment to a pipeline + • XIEP_EXECUTE_PIPE {n} - begins execution of a pipeline + • XIEP_KILL_PIPE {n} - terminates (prematurely) execution of a pipeline + +Display Services + • XIEP_DISPLAY_SEQUENCE {n} - display a time sequence of pixmaps + +Event Services + • XIEP_SELECT_EVENTS {n} - select which events the client wishes to be noti�ed of + • XIEP_QUERY_EVENTS {n} - query which events the client will be noti�ed of + + + + +9–2 APPENDICES + 9.2 Recommended Server Resource Contents + + This section describes the client known contents of the various image extension server re- + sources. These are the resource object �elds which the client can reference in various resource + protocol operations. Some �elds can be initialized, queried, and modi�ed by the client through + object creation, modify, and query functions, while others can only be initialized and queried, + and still others can only be queried. This last class of �elds are initialized and maintained + solely by the server, and are in essence read-only for the client + A table within each subsection de�nes the �eld identi�er, allowable forms of access, and value + binding. Particulars regarding image data object �elds can be found in the appendix on image + data attributes and organization. Details of other resources and their contents can be found in + the resource creation protocol functions and other protocol functions which use the resources. + +9.2.1 IOB + The atomic unit of revisable form image data residing on the server and addressable by the + client is the image object or IOB. An IOB represents a single revisable form image (one which + can be modi�ed and prepared for device speci�c display). An IOB is intended to contain a + single two-dimensional still-frame image of bitonal, continuous tone, or multispectral data. + IOB’s are not intended for composite image collections or temporal image sequences (multiple + 2d frames associated with spatial or temporal layout mechanisms). Multiple IOB’s should be + used by applications to build composite static image displays and time sequences of images + under application control. IOB’s are self contained: no nesting or external references are + allowed. + Each image object (IOB) contains image attributes and the image data itself. The attributes + consist of information necessary to interpret the image data and useful in guiding default + rendition and presentation. The attributes are initialized by the client at image object creation + time. The image data can only be initialized through image data wire transport functions. All + attributes can be directly queried by the client, but the image data can not be directly queried. + It can only be read via image data wire transport functions. + IOB attributes fall into two classes: those that are server private, and those that are public + and queryable by the client. The private attributes can not be accessed by the client in anyway + and are not described in this document. The public attributes are initialized by the client and + server at image object creation time. Once the IOB has been created, these attributes are + "read only" for the client. The only modi�cation of these attributes derives from client directed + server processing of the image. + Image primitive and presentation attributes are stored within the IOB and are initialized and + queryable by the client. Format (organization and encoding) information is not stored in the + IOB (refer to appendix on image data attributes and organization). Format information is + simply used during wire transport. + + + + + APPENDICES 9–3 + Field id Field code Field type + -------- ---------- ---------- + IOB$PIXELS_PER_SCANLINE 0 CARD32 + IOB$NUMBER_OF_SCANLINES 1 CARD32 + IOB$NUMBER_OF_SPECTRAL_COMPONENTS 2 CARD8 + IOB$SPECTRAL_COMPONENT_MAPPING 4 XIT_SPECTRAL_COMPONENT_MAPPING + IOB$PIXEL_PROGRESSION 5 XIT_PIXEL_PROGRESSION + IOB$LINE_PROGRESSION 6 XIT_LINE_PROGRESSION + IOB$ASPECT_RATIO 7 XIT_FLOAT + IOB$POLARITY 8 XIT_POLARITY + IOB$CONSTRAINED 9 BOOL (query only) + IOB$CONSTRAIN_MODEL 10 CARD8 (query only) + IOB$CONSTRAIN_BITS_PER_COMPONENT 11 LISTOFCARD8 (query only) + + The image data �eld of the IOB is only accessible to the client through image data wire + transport protocol function, and not directly through resource object functions. + Other than the implications of constrained/unconstrained and mono/polychromatic, the orga- + nization of the image data in the IOB is server private. The server may choose to represent + the revisable form image data within the IOB in anyway it desires including the same way in + which the core server represents PIXMAPS. The only constraint is that upon request from the + client, the server must be able to reproduce ALL image data which comes across the wire in + the �rst place (ie. if the client creates an IOB, �lls it with image data, and requests the server + to send the data back in the same way, the data which comes back must be identical to what + went across in the �rst). + +9.2.2 IDC + Control over the selection of the subset of a revisable form image object which will be processed + by the server, as well as the speci�cation of operand data for area operations is accomplished + through the use of image domain control contexts (IDCs). + The subsetting process serves to identify either fully connected subregions of an image which + will be processed, or individual pixels and disconnected subregions. + Area operations involve speci�cation of both area operands to be used in conjunction with the + area image data surrounding the current pixel, and the spatial relationship or registration of + those area operands (both spatial registration and operand shape). + A region of interest de�nes a rectangular subregion of an image object (less than or equal to + the image object in size). The speci�cation is accomplished by locating the upper left and lower + right hand corners of the rectangle relative to an image object. ROI �eld values are initialized + at resource creation time. They can be queried or modi�ed at any time by the client. They are + never modi�ed by the server. + + Field id Field Code Field type + -------- ---------- ---------- + IDC$ROI_UL_X 0 CARD16 + IDC$ROI_UL_Y 1 CARD16 + IDC$ROI_LR_X 2 CARD16 + IDC$ROI_LR_Y 3 CARD16 + + + + +9–4 APPENDICES + A control processing plane de�nes the points within a rectangular subregion of an image + object (less than or equal to the image object in size) that are subject to processing. The + speci�cation is accomplished via the use of a 1 bit deep PIXMAP which is positioned against + the image object by locating the upper left hand corner relative to an image object. A PIXMAP + value of 1 implies that the image data at that point is subject to processing while a value of + 0 implies that it is not. The results of the image operator at these points (selected and not) + are determined by the operator on a case by case basis. CPP �eld values are initialized at + resource creation time. They can be queried or modi�ed at any time by the client. They are + never modi�ed by the server. + + Field id Field Code Field type + -------- ---------- ---------- + IDC$CPP_UL_X 4 CARD16 + IDC$CPP_UL_Y 5 CARD16 + IDC$CPP_DATA 6 PIXMAP + + A template de�nes the points within a rectangular subregion which will be selected for use + in an area operation, and the values of an operand to be used in the operation for each of + these points. The template does not de�ne its spatial relation to the image object. Rather, it + speci�es the alignment of its selection and operand "mask" to what ever the current pixel is. + This is done by specifying the location of the current pixel in the two dimensional selection / + operand grid. This allows for asymmetric and sparsely populated template grids. TMP �eld + values are initialized at resource creation time. They can be queried or modi�ed at any time + by the client. They are never modi�ed by the server. + + Field id Field Code Field type + -------- ---------- ---------- + IDC$TMP_ENTRIES 7 CARD8 + IDC$TMP_CENTERX 8 CARD8 + IDC$TMP_CENTERY 9 CARD8 + IDC$TMP_DATA 10 LISTofXIT_FLOAT + + +9.2.3 IPC + TBS + + + + + APPENDICES 9–5 + 9.3 Image Data Attributes & Organization + + In the X Image Extension, the client may keep image data within itself in any fashion it + chooses. The client may keep any set of attributes, partitioned or not, and any image data + organization. It may also choose to exchange that data and those attributes with another + application in any fashion it desires. Those issues are outside of the scope of the X Image + Extension. + What the X Image Extension does focus on (specify) is the transport of image data and + attributes across the X wire. The ground rules are simple: the protocol speci�es what attribute + information must be exchanged and when, and the multiple allowable data transport formats. + The client gets to choose from these various formats and the server complies at data transport + time. The client does not get to choose how the server represents or organizes the image + data (just as the server does not control how the client does it). The server may be lazy and + simply maintain the organization as it came across the wire, or may restructure the data to + meet its needs. While the requirement (see protocol section) that the server be able to turn + around and give image data back precisely as it received it (without loss) may be a powerful + incentive to maintain the wire transport data organization, it is not a requirement that the + server maintain the data internally in that format. + This appendix addresses image data attributes, their logical partitioning, and image data + transport formats. The various attributes are partitioned and described along with the trans- + port formats. The parameter types for these attributes are described either in the parameter + types chapter (for complex types), or in-line along with their usage in the protocol functions + chapter (transport services section). + Image attributes are partitioned into three components: primitive attributes, organization + and encoding attributes, and presentation attributes. Primitive attributes relate to a PCM + reference model for the image. Organization and encoding attributes are essential for inter- + preting the image data at transport time and go to the heart of the issue of transport formats. + Presentation attributes relate to the ’intended’ or original presentation established at capture + or synthesis time. + An Image + +----------------------------------------------------+ + | | + | +------------+ +-------+ | + | | image | | image | | + | | attributes | | data | | + | +------------+ +-------+ | + | | | + | | | + | +-- primitive attributes | + | | | + | | | + | +-- organization & encoding attributes | + | | | + | | | + | +-- presentation attributes | + | | + +----------------------------------------------------+ + + + + +9–6 APPENDICES + 9.3.1 Primitive Attributes + Primitive image attributes include information about a PCM reference model version or + state of the image (which may not exist during transport). Primitive image attributes are + communicated by the client to the server at IOB creation time, are queryable by the client at + any time, and modi�able only by the server (not the client). + Primitive attributes include: + • Pixels-Per-Scanline + + The total number of pixels per scan line. This value is not + necessarily the total number of bits per scan line. + + • Number-of-Scanlines + + The total number of scan lines in the image. + + • Number-of-Spectral-Components + + Speci�es the number of spectral bands in an image. Note that this + is NOT necessarily the number of logical data planes in the data organization. + For an RGB image, this would be 3. For a mono chromatic image, this would be 1. + + • Spectral-Component-Mapping + + Designates the correlation between the physical image data and the + spectral components of an image. Images may have anywhere between + one spectral component (monochromatic) and several spectral + components (polychromatic). Monochromatic bitonal (black & white), + monochromatic-continuous tone (grayscale), and 3 band polychromatic (color) + will be the only supported classes. + Recognized spectral component mappings include: + • monochrome + • color 3 spaces + • RGB + • *futures* + +9.3.2 Organization & Encoding Attributes + Organization and encoding attributes de�ne the detailed structure of the image data represen- + tation during wire transport. Image data will either begin or end up in a client’s buffer in this + format depending upon the transport direction. Organization and encoding attributes are only + relevant in wire transport and are not directly associated with a server based IOB. + + + + + APPENDICES 9–7 + 9.3.2.1 Encoding Attributes + Encoding attributes describe the image data compression being used during wire transport, + and its relationship to the data organization scheme in use. Encoding attributes include: + • Compression-Scheme + + The compression scheme used to encode the image data during transport. + Only standardized or well recognized and accepted compression schemes + are supported. These include: + + • PCM (raw bitmap - no compression) + • CCITT Group 4 two dimensional + • ISO Discrete Cosine Transform + + There are ground rules for the choice of compression scheme and its application based upon + data organization. + The fax compression scheme (G42D) can only be applied to bitonal images (any value of + Component-Space-Organization as long as the total bits per pixel = 1), or to continuous tone + images (gray scale and color) on a bit-plane by bit-plane basis (Component-Space-Organization + must be bit_interleaved_by_plane). + Discrete Cosine Transform compression can be applied to bitonal, continuous tone gray + scale, and continuous tone color images with Component-Space-Organization equal to band_ + interleaved_by_plane or bit_interleaved_by_plane. In the former case, the compression scheme + is applied on a spectral component basis, while in the latter case, it is applied on a bit plane + by bit plane basis. + +9.3.2.2 Component Space Attributes + Image data may represent information deriving from a number of chrominance bands (mono + through poly chromatic) and luminance quantization levels per band (bitonal through con- + tinuous tone). Given any one combination (such as 3 color bands as in R-G-B and 8 bits per + band per pixel), the representation of the information can be organized for transport in several + ways. This section describes the possible formats and the associated attributes along with low + level data formatting information. Component space attributes include: + • Component-Space-Organization + + Designates how the component space data is physically organized. + It is de�ned in terms of pixel component bit storage within and + across image logical data planes. In other words, it indicates how image data + is organized pixel-by-pixel and spectral-component by spectral-component + into logical planes of data. Recognized component-space-organizations + include: + + • Band_Interleaved_by_Pixel + + All pixel data for ALL spectral components is collected into + a single logical data plane. For example, given an RGB image, the red, + + +9–8 APPENDICES + green, and blue bits for one pixel are butted together. The + red, green, and blue bits for the next pixel follow. + + • Band_Interleaved_by_Plane + + All pixel data for EACH spectral component occupies a + separate logical data plane. Thus, for our RGB image, all red bits + for all pixels are gathered into a single data plane, + followed by all green bits for all pixels, followed by + all blue bits for all pixels. + + • Bit_Interleaved_by_Plane + + All the pixel bits for each spectral component occupy + separate logical data planes. Thus, if our RGB image had 8 bits + per spectral component, there would be 24 separate data planes. + + + Bitonal images (monochromatic) can be organized in any of the + three ways (all are identical). Grayscale images (monochromatic) can + be organized in two ways: (Band_Interleaved_by_Pixel and Band_Interleaved_by_Plane + are identical) or (Bit_Interleaved_by_Plane). Color images (polychromatic) + can be organized into any of the three ways. + +• Bits-Per-Component + + The number of bits used for each image component by logical data + plane independent of component space organization. The sum of + Bits-Per-Component for all components must by de�nition equal + the total bits per pixel. + +• Pixel-Stride + + The difference in bit addresses between the starting bits of + successive pixels by logical data plane. Pixel-stride will typically be equal + to the number of bits per pixel stored in a particular plane + unless pixel boundary alignment requires �ll (pad). Pixel-Stride + is meaningful for uncompressed data in any of the 3 organizational + formats. + +• Scanline-Stride + + The difference in bit addresses between the starting bits of + successive scanlines by logical data plane. Scan-Line stride will typically be equal + to the number of bits (not pixels) per scanline unless scanline + boundary alignment requires �ll (pad). Scanline-Stride is meaningful for + uncompressed data in any of the 3 organizational formats. + + + + APPENDICES 9–9 + 9.3.3 Presentation Attributes + Presentation attributes represent qualitative information that corresponds to visual charac- + teristics of the image data when presented (viewed). Presentation attributes affect how image + data is rendered and presented for viewing. They often derive initially from the original object + or scene, and the capture or synthesis process. As the capture process involves a digitization + and quantization process, the attributes of the capture device/process are starting points for + many presentation attributes. Maintaining this information and using it at presentation time + ensures �delity between the original object or scene and the rendered image (ie. the image will + look like the original object or scene). An example of ignoring or modifying this information + might result in an image displayed upside down. Presentation attributes can be found in the + IOB. + A major component of presentation deals with the layout of an image on the screen. For + this aspect of presentation, an output device (screen) relative coordinate reference system + is necessary. For this purpose, we use the ISO and CCITT standard image orientation. In + this system a two dimensional cartesian coordinate system is overlaid on top of the screen + surface (the z axis would be normal to the plane and out of the screen). The x axis is placed + horizontally aimed towards the users right (user facing screen) and the y axis is aimed + vertically. All angles are measured relative to the positive x axis in a counter clockwise + direction. + Presentation attributes include: + • Pixel-Progression + + The direction of the pixel path relative to ISO and CCITT + standard image orientation. More aptly, the angle between a scan + line and the x axis of the standard image orientation coordinate + system. Standard values of 0, 90, 180, and 270 degrees should be + used allowing for left-to-right, right-to-left, top-to-bottom, + and bottom-to-top pixel progressions. + + • Line-Progression + + The direction of scan line capture / display across the image plane. + More aptly, the direction normal to that of a scan line in which + scan lines were captured or will appear. Standard values of 90 and + 270 degrees should be used. + + • Aspect-Ratio + + The ratio of the distance between pixel centers along the pixel- + progression direction and the line-progression direction. + + • Polarity + + The manner in which the pixel values represent minimum and + maximum intensity. + + + + +9–10 APPENDICES + 9.4 Concept and Version Changes + + There have been several signi�cant conceptual changes between the draft of the concepts + document and this draft (v2.0) of the protocol speci�cation. In addition, there have been + substantial changes in content between v1.0 and v2.0 of the protocol speci�cation. This + appendix summarizes the conceptual and protocol changes. + +9.4.1 Conceptual Changes + Perhaps the most signi�cant conceptual change has to do with the location of the wire relative + to the rendition services that the x image extension calls for. In the concept document, high + level rendition services were called for on the server side of the wire. The current position is + to provide a minimal set of tools on the server side which can be used in rendition processing + (and might be facilitated by display accelerators), and leave the direction of rendition models + to a client side imaging toolkit. To some extent, this is in support of a general effort we’ve + made to reduce the size of the extension protocol. + A second shift is based upon the recognition that resource types are themselves scarce things. + A such, the protocol has moved away from the use of many different types of extension + resources towards a minimal set with more in line parameters. In particular, ITC’s (image + transport contexts), IEC’s (image enhancement contexts), and IDC’s (image display contexts) + are no longer server resources. Instead, the information they contained is exchanged as + protocol parameters. + The authors have always felt that logically, image capture devices such as frame grabbers + (video digitizers) belong on the client side of the wire, but that their close proximity to display + subsystems made it necessary to provide for them on the server side of the wire (through the + protocol). While prior drafts have included protocol functions for control of video digitizers, + they have been dropped from this draft. The reason for this is that the requirements of the + video community are beyond the scope of this effort and it was felt that they could best be + served by a separate video extension. + The authors originally intended to provide access to high level image enhancement functions + on the server via the protocol. Because of the enormous set of such functions (unbounded), + and because architecturally it was felt that high level image function packaging belonged + closer to the application, the protocol has shifted to support lower level image functions. The + higher level packaging of these functions has been pushed back across the wire to the tool kit + level. The X Image Extension Tool Kit document provides an exemplary set of application level + image display and enhancement processing services which can be built upon the core X11 and + X Image Extension protocols. + The position on server storage devices has not changed - the extension does not acknowledge + the existence or usage of such devices (including the issue of storage formats). The use of such + devices is at the discretion of server implementors. It is possible that storage devices and + formats may appear at the toolkit level. + In an effort to reduce the image extension display services, representation and display of tiled + images were removed from the protocol. It was felt that there is suf�cient machinery in the + core protocol to support this from the client side. Tiled image support is likely to be another + issue for the tool kit. + + + + APPENDICES 9–11 + 9.4.2 V1.0 - V2.0 Protocol Changes + Many signi�cant protocol changes were made between v1.0 and v2.0. These were based upon + the above conceptual changes, comments from reviewers, and a general effort to trim down the + protocol extension and make it more compliant with the core x philosophy. + + Minimality and Organization of Protocol + We received many complaints regarding the size of the protocol (number of functions), the or- + ganization of the protocol (function classes), and the level of complexity of operations required + of the server. We undertook to reduce in level and extent the contents of the protocol, as well + as to meaningfully reorganize it. The salient points and reasoning are discussed below. + The video functions (those which involved a digitizer) have been completely removed from the + speci�cation. Our feeling is that the needs of the video community are better served by the + video extension and that a connection between video and digital image processing can occur + through pixmaps in the core server. + We have reduced the display functions in the belief that the core display functions are suf�- + cient in many ways and in that more complex display mechanisms can be built upon them and + managed from the client side (toolkit). The major exception to this is time sequences of images + which we feel require server support to work (time sequences remain). + High level class conversion (rendition) functions were analyzed and a few primitive functions + missing from the original draft were identi�ed (most notably dither) and added. The high + level functions were then deleted (moved to the toolkit) where they can be built upon the + server primitives. + Enhancement and rendition functions were reorganized into process class functions due + to their similarity and their generic applicability. Thanks goes to members of SUN who + contributed insight into how to meaningfully reorganize these functions. + Across the entire protocol, multiple similar functions which differed only in terms of an + operator were collapsed (combined) by making operator selection an operand. No functionality + was lost, but the protocol is easier to follow and it may help to organize the implementations. + + Use of Core Resources + Unessential extension resources (IEC, IRC, IDC) have been deleted completely in favor of in + line parameters. + We’ve made use of the core resource GC as is where necessary versus reinventing some of its + contents in extension speci�c resources. + + Error Codes + We have removed all extension speci�c error codes and are now making use of core error codes + only. + + Connect Information + All core X redundant connect time information has been removed and all unnecessary protocol + information (such as session_id) has been removed. + + + + +9–12 APPENDICES + We’ve changed XIT_SUPPORT_VECTOR to XIT_FUNCTION_VECTOR to reflect what func- +tions (as opposed to service classes) are provided by the server. The service class will provide +guidelines to the the classi�cation of requests. + +IOB Data Formats +It became clear that while positive integral data values for image data on the wire was +acceptable, it would be insuf�cient for many server protocol functions. As such, the extension +has de�ned a "constrained" and "unconstrained" IOB type (which translates roughly to positive +integral and positive/negative float - see chapter on server data model). It now includes +facilities for managing these data types. + +Color Space Support +The initial spec called for multiple color space support on the server (rgb, yuv, cie luv ...). As +current display devices are primarily rgb (yuv may begin to appear due to digital tv, but not +today), the decision was made to push alternate color space support back across the wire into +the toolkit (along with color correction). For now, wire transport and server processing will +only support rgb color images. + +Pipelines +The pipeline TBS has been replaced with actual protocol functions. + + + + + APPENDICES 9–13 + 9.5 References + 1. X Window System Protocol, Version 11 + Alpha Test, February 1987 - Robert W. Scheifler + + 2. CCITT T.4 + "Standardization of Group 3 Facsimile Apparatus for Document Transmission" + Defines general device capabilities, and defines tables + and algorithms for one- and two-dimensional coding schemes, + as well as scheme for "uncompressed data." + 3. CCITT T.6 + "Facsimile Coding Schemes and Coding Control Functions + for Group 4 Facsimile Apparatus" + Defines coding tables and algorithm for two dimension + encoding used in G4 fax. + 4. CCITT T.73 + "Document Interchange Protocol for the Telematic Services" + Defines document interchange protocol for use above + the session services layer used by teletex and G4 fax. + 5. ISO DPX3 + "Photographic Image Coding" + Defines algorithms for encoding continuous tone photographic + images for character protocol terminal services (videotex). + 6. Digital Image Processing + William K. Pratt + John Wiley & Sons - 1978 + 7. Digital Image Processing + Rafael Gonzales and Paul Wintz + Addison Wesley - 1987 + 8. Digital Picture Processing + Azriel Rosenfeld and Avinash Kak + Academic Press - 1982 + 9. Image Algebra Project Publications + Computer Vision Laboratory + University of Florida, Gainesville + Department of The Air Force + Air Force Armament Laboratory + Eglin Air Force Base, Florida + + + + +9–14 APPENDICES + \ No newline at end of file diff --git a/xie/docs/x11r4/server.pdf b/xie/docs/x11r4/server.pdf new file mode 100644 index 0000000..2712480 Binary files /dev/null and b/xie/docs/x11r4/server.pdf differ diff --git a/xie/docs/x11r4/server.ps b/xie/docs/x11r4/server.ps new file mode 100644 index 0000000..dad1a9e --- /dev/null +++ b/xie/docs/x11r4/server.ps @@ -0,0 +1,5057 @@ +%!PS-Adobe-2.0 +%%Creator: VAX DOCUMENT V1.1 +%%+Copyright (c) 1986,1987,1988 DIGITAL EQUIPMENT CORPORATION. +%%+All Rights Reserved. +%%DocumentFonts: (atend) +%%Pages: (atend) +%%EndComments +/$DVCDict where { %FIND DICTIONARY + pop +}{ %else + /$DVCDict 300 dict def +} ifelse +/BeginDVC$PSDoc { %BEGIN DOCUMENT + vmstatus pop pop 0 eq { + $DVCDict begin InitializeState + }{ %else + /DVC$PSJob save def $DVCDict begin InitializeState + /DVC$PSFonts save def + } ifelse +} def +/EndDVC$PSDoc { %END DOCUMENT + vmstatus pop pop 0 eq { + end + }{ %else + DVC$PSFonts restore end DVC$PSJob restore + } ifelse +} def +% +$DVCDict begin +% +mark % CREATE ISOLatin1 ENCODING +/ISOLatin1 + 8#000 1 8#054 {StandardEncoding exch get} for + /minus + 8#056 1 8#217 {StandardEncoding exch get} for + /dotlessi + 8#301 1 8#317 {StandardEncoding exch get} for + /space /exclamdown /cent /sterling /currency /yen /brokenbar /section + /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen + /registered /macron /degree /plusminus /twosuperior /threesuperior /acute + /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine + /guillemotright /onequarter /onehalf /threequarters /questiondown /Agrave + /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute + /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde + /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave + /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute + /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute + /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde + /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave + /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis + /ISOLatin1 where not {256 array astore def} if +cleartomark +% +/DECMCS ISOLatin1 256 array copy def +mark % CREATE DECMCS ENCODING + 8#240 8#244 8#246 8#254 8#255 8#256 8#257 8#264 + 8#270 8#276 8#320 8#336 8#360 8#376 8#377 + counttomark + {DECMCS exch /.notdef put} repeat % STACK NOW CONTAINS MARK + 8#250 /currency 8#327 /OE 8#335 /Ydieresis 8#367 /oe 8#375 /ydieresis + counttomark -1 bitshift % DIVIDE BY 2 + {DECMCS 3 1 roll put} repeat % STACK NOW CONTAINS MARK +cleartomark +% +/DOCPSE DECMCS 256 array copy def +mark % CREATE DOCPSE ENCODING + 8#055 /hyphen + 8#201 /bullet 8#202 /emdash 8#203 /endash 8#204 /dagger + 8#205 /daggerdbl 8#206 /registered 8#207 /trademark %8#210 /Delta + 8#211 /fi 8#212 /fl + counttomark -1 bitshift % DIVIDE BY 2 + {DOCPSE 3 1 roll put} repeat % STACK NOW CONTAINS MARK +cleartomark +% +/reencodedict 10 dict def %Local storage for "ReENCODE" +/ReENCODE { % /basefont /newfont encoding ReENCODE + /newencoding exch def %ARG: NAME OF ENCODING VECTOR + /newfontname exch def %ARG: NEW NAME FOR FONT AFTER RE-ENCODING + findfont + /basefontdict exch def %ARG: NAME OF FONT TO BE RE-ENCODED + basefontdict maxlength dict begin %CREATE AND OPEN NEW DICT + basefontdict { %COPY ENTRIES FROM BASE FONT DICT TO NEW ONE + 1 index /FID ne { + def %IF NOT THE ONE WE'RE ENCODING, JUST COPY PTRS + } { %else + pop pop %IGNORE FID AND ENCODING FOR ONE WE'RE ENCODING + } ifelse + } forall + /FontName newfontname def %DEFINE NEW NAME + /Encoding newencoding def %DEFINE NEW ENCODING VECTOR + newfontname currentdict definefont %TURN IT INTO A PS FONT + pop %IGNORE MODIFIED DICT RETURNED BY DEFINEFONT + end +} bind def +% +/cvsstr 64 string def +/tempmatrix matrix def +% +/BP { % BEGIN PAGE + /Magnification exch def /DVC$PSPage save def +} def +% +/EP {DVC$PSPage restore} def % END PAGE +% +/XP { % EXIT PAGE (TEMPORARILY) TO ADD FONTS/CHARS + % SAVE CURRENT POINT INFORMATION SO IT CAN BE RESET LATER + /Xpos where {pop Xpos} {0} ifelse + /Ypos where {pop Ypos} {0} ifelse + /currentpoint cvx stopped {0 0 moveto currentpoint} if + /DVC$PSPage where {pop DVC$PSPage restore} if + moveto + /Ypos exch def /Xpos exch def +} def +% +/RP {/DVC$PSPage save def} def % RESUME PAGE +% +/PF {GlobalMode LocalMode} def % PURGE FONTS TO RECLAIM MEMORY +% +/GlobalMode { % SWITCH TO BASE SAVE/RESTORE LEVEL, SAVING STATE + PortraitMode PaperWidth PaperHeight PxlResolution Resolution + Magnification Ymax Xorigin Yorigin RasterScaleFactor + % SAVE CURRENTPOINT INFORMATION TO RESET LATER + /currentpoint cvx stopped {0 0 moveto currentpoint} if + /DVC$PSPage where {pop DVC$PSPage restore} if + DVC$PSFonts restore RecoverState +} def +% +/RecoverState { % PRESERVE STATE AT BASE LEVEL + 12 copy + /Ypos exch def /Xpos exch def /RasterScaleFactor exch def + /Yorigin exch def /Xorigin exch def /Ymax exch def + /Magnification exch def /Resolution exch def /PxlResolution exch def + /PaperHeight exch def /PaperWidth exch def /PortraitMode exch def + DoInitialScaling + PortraitMode not {PaperWidth 0 SetupLandscape} if + Xpos Ypos moveto +} def +% +/InitializeState { % INITIALIZE STATE VARIABLES TO DEFAULT VALUES + /Resolution 3600 def /PxlResolution 300 def + /RasterScaleFactor PxlResolution Resolution div def + /PortraitMode true def /PaperHeight 11 Resolution mul def + /PaperWidth 8.5 Resolution mul def /Ymax PaperHeight def + /Magnification 1000 def /Xorigin 0 def /Yorigin 0 def + /Xpos 0 def /Ypos 0 def /InitialMatrix matrix currentmatrix def +} def +% +/LocalMode { % SWITCH FROM BASE SAVE/RESTORE LEVEL, RESTORING STATE + /Ypos exch def /Xpos exch def /RasterScaleFactor exch def + /Yorigin exch def /Xorigin exch def /Ymax exch def + /Magnification exch def /Resolution exch def /PxlResolution exch def + /PaperHeight exch def /PaperWidth exch def /PortraitMode exch def + DoInitialScaling + PortraitMode not {PaperWidth 0 SetupLandscape} if + Xpos Ypos moveto + /DVC$PSFonts save def /DVC$PSPage save def +} def +% % ABBREVIATIONS +/S /show load def +/SV /save load def +/RST /restore load def +/Yadjust {Ymax exch sub} def +% +/SXY { % (x,y) POSITION ABSOLUTE, JUST SET Xpos & Ypos, DON'T MOVE + Yadjust /Ypos exch def /Xpos exch def +} def +% +/XY { % (x,y) POSITION ABSOLUTE + Yadjust 2 copy /Ypos exch def /Xpos exch def moveto +} def +% +/X { % (x,0) POSITION ABSOLUTE + currentpoint exch pop 2 copy /Ypos exch def /Xpos exch def moveto +} def +% +/Y { % (0,y) POSITION ABSOLUTE + currentpoint pop exch Yadjust 2 copy + /Ypos exch def /Xpos exch def moveto +} def +% +/xy { % (x,y) POSITION RELATIVE + neg rmoveto currentpoint /Ypos exch def /Xpos exch def +} def +% +/x { % (x,0) POSITION RELATIVE + 0 rmoveto currentpoint /Ypos exch def /Xpos exch def +} def +% +/y { % (0,y) POSITION RELATIVE + 0 exch neg rmoveto currentpoint /Ypos exch def /Xpos exch def +} def +% +/R { % DRAW A RULE + /ht exch def /wd exch def gsave 0 setgray + currentpoint newpath moveto + 0 ht rlineto wd 0 rlineto + 0 ht neg rlineto wd neg 0 rlineto + closepath fill grestore wd 0 rmoveto + currentpoint /Ypos exch def /Xpos exch def +} def +% +/RES { % RES + /Resolution exch def /PxlResolution exch def + /RasterScaleFactor PxlResolution Resolution div def + DoInitialScaling +} def +% +/DoInitialScaling { % DO INITIAL SCALING + InitialMatrix setmatrix 72 Resolution div dup scale +} def +% +/PM { % PM + XP + /PaperWidth exch def /PaperHeight exch def + /Ymax PaperHeight def /PortraitMode true def + DoInitialScaling + RP +} def +% +/SetupLandscape {translate 90 rotate} def +/LM { % LM + XP + /PaperWidth exch def /PaperHeight exch def + /Ymax PaperWidth def /PortraitMode false def + DoInitialScaling PaperWidth 0 SetupLandscape + RP +} def +% +/MAG { % CHANGE MAGNIFICATION SETTING + XP /Magnification exch def RP +} def +% +/SPB { % SPB - BEGIN "\SPECIAL" MODE + Yadjust /Yorigin exch def /Xorigin exch def + GlobalMode Xorigin Yorigin translate + Resolution 72 div dup scale % RESTORE DEFAULT SCALING + Magnification 1000 div dup scale % ADJUST FOR ANY MAGNIFICATION + /Xpos Xpos 72 Resolution div mul 1000 Magnification div mul def + /Ypos Ypos 72 Resolution div mul 1000 Magnification div mul def + /spsavobj save def %SAVE STATE & STACK DEPTH FOR CLEANUP AFTER FIGURE + /showpage {} def %DISABLE DURING FIGURE; `RESTORE' WILL BLOW DEF AWAY + mark +} def +% +/SPE { % SPE - END "\SPECIAL" MODE + spsavobj restore + cleartomark + 1000 Magnification div dup scale % UN-ADJUST FOR ANY MAGNIFICATION + 72 Resolution div dup scale % RESTORE DEFAULT INTERNAL SCALING + LocalMode +} def +% +/PP {showpage} def +/CLRP {erasepage} def +% +/DMF { % /font-name DMF + /psz exch def /nam exch def nam findfont psz scalefont setfont +} def +% +/concatnam { % /abcd (xxx) concatnam ==> /abcdxxx + /xxx exch def /nam exch def + /namstr nam cvsstr cvs def + /newnam namstr length xxx length add string def + newnam 0 namstr putinterval + newnam namstr length xxx putinterval + newnam cvn +} def +% +/strip { % /abcdef 2 strip ==> /cdef + /num exch def /nam exch def + /namstr nam cvsstr cvs def + /newlen namstr length num sub def + namstr num newlen getinterval cvn +} def +% ROUTINES TO HANDLE PACKING/UNPACKING NUMBERS +/PackHW { % PackHW --> + /num exch def /pos exch def /target exch def + num 16#0000FFFF and 1 pos sub 16 mul bitshift target or +} def +/PackByte { % PackByte --> + /num exch def /pos exch def /target exch def + num 16#000000FF and 3 pos sub 8 mul bitshift target or +} def +/UnpkHW { % UnpkHW --> + /num exch def /pos exch def + num 1 pos sub -16 mul bitshift 16#0000FFFF and + dup 16#00007FFF gt {16#00010000 sub} if +} def +/UnpkByte { % UnpkByte --> + /num exch def /pos exch def + num 3 pos sub -8 mul bitshift 16#000000FF and + dup 16#0000007F gt {16#00000100 sub} if +} def +% +/DPSF { % /procname size /fontname DPSF + findfont exch scalefont + [ exch /setfont cvx ] cvx def +} bind def +% +/PXLBuildCharDict 17 dict def +/CMEncodingArray 128 array def +0 1 127 {CMEncodingArray exch dup cvsstr cvs cvn put} for +/RasterConvert {RasterScaleFactor div} def +/TransformBBox { + aload pop + /BB-ury exch def /BB-urx exch def /BB-lly exch def /BB-llx exch def + [ BB-llx RasterConvert BB-lly RasterConvert + BB-urx RasterConvert BB-ury RasterConvert ] +} def +/RunLengthToRasters { + % none yet +} def +/GenerateRasters { % GENERATE RASTERS FOR "IMAGEMASK" + rasters runlength 1 eq {RunLengthToRasters} if +} def +% +/int-dict-name {int (-dict) concatnam} def +/int-dict {int (-dict) concatnam cvx load} def +% +/DefinePXLFont { + % ... + % ...[llx lly urx ury]DefinePXLFont + /newfont exch def /bb exch def /num exch def /psz exch def + /dsz exch def /pxlmag exch def /ext exch def /int exch def + /fnam ext (-) concatnam pxlmag cvsstr cvs concatnam def + newfont not { + int-dict-name 13 dict def + int-dict begin + /FontType 3 def /FontMatrix [ 1 dsz div 0 0 1 dsz div 0 0 ] def + /FontBBox bb TransformBBox def /Encoding CMEncodingArray def + /CharDict 1 dict def CharDict begin /Char-Info num array def end + /BuildChar { + PXLBuildCharDict begin + /char exch def /fontdict exch def + fontdict /CharDict get /Char-Info get char get aload pop + /rasters exch def /PackedWord1 exch def + 0 PackedWord1 UnpkHW 16#7FFF ne { + /PackedWord2 exch def /wx 0 PackedWord1 UnpkHW def + /rows 2 PackedWord1 UnpkByte def /cols 3 PackedWord1 UnpkByte def + /llx 0 PackedWord2 UnpkByte def /lly 1 PackedWord2 UnpkByte def + /urx 2 PackedWord2 UnpkByte def /ury 3 PackedWord2 UnpkByte def + }{ %else + /PackedWord2 exch def /PackedWord3 exch def /PackedWord4 exch def + /wx 1 PackedWord1 UnpkHW def /rows 0 PackedWord2 UnpkHW def + /cols 1 PackedWord2 UnpkHW def /llx 0 PackedWord3 UnpkHW def + /lly 1 PackedWord3 UnpkHW def /urx 0 PackedWord4 UnpkHW def + /ury 1 PackedWord4 UnpkHW def + } ifelse + rows 0 lt { + /rows rows neg def /runlength 1 def + }{ %else + /runlength 0 def + } ifelse + wx 0 + llx RasterConvert lly RasterConvert + urx RasterConvert ury RasterConvert setcachedevice + rows 0 ne { + gsave + cols rows true RasterScaleFactor + 0 0 RasterScaleFactor neg llx .5 add neg ury .5 add + tempmatrix astore GenerateRasters imagemask + grestore + } if + end + } def + end + fnam int-dict definefont pop + } if + int-dict-name fnam findfont psz scalefont def + currentdict int [ int-dict /setfont cvx ] cvx put +} def +/PXLF { true DefinePXLFont} def % SIGNAL THAT FONT IS ALREADY LOADED +/PXLNF {false DefinePXLFont} def % SIGNAL THAT FONT IS NOT ALREADY LOADED +% +/PXLC { % ... + % ...PXLC + /rasters exch def /runlength exch def /cols exch def /rows exch def + /ury exch def /urx exch def /lly exch def /llx exch def + /wx exch def /code exch def /int exch def + % SEE IF LONG OR SHORT FORMAT IS REQUIRED + true cols CKSZ rows CKSZ ury CKSZ urx CKSZ lly CKSZ llx CKSZ + TackRunLengthToRows { + int-dict /CharDict get /Char-Info get code + [ 0 0 llx PackByte 1 lly PackByte 2 urx PackByte 3 ury PackByte + 0 0 wx PackHW 2 rows PackByte 3 cols PackByte rasters ] put + }{ %else + int-dict /CharDict get /Char-Info get code + [ 0 0 urx PackHW 1 ury PackHW 0 0 llx PackHW 1 lly PackHW + 0 0 rows PackHW 1 cols PackHW 0 0 16#7FFF PackHW 1 wx PackHW rasters ] put + } ifelse +} def +% +/CKSZ {abs 127 le and} def +/TackRunLengthToRows {runlength 0 ne {/rows rows neg def} if} def +% +/PLOTC { + % PLOTC + /rasters exch def /runlength exch def /cols exch def /rows exch def + /ury exch def /urx exch def /lly exch def /llx exch def + /psz exch def /dsz exch def /wx exch def + % "PLOT" A CHARACTER'S RASTER PATTERN + rows 0 ne { + gsave + currentpoint translate psz dsz div dup scale + cols rows true RasterScaleFactor 0 0 RasterScaleFactor + neg llx .5 add neg ury .5 add tempmatrix astore + GenerateRasters imagemask + grestore + } if + wx x +} def +% +end %$DVCDict +%%EndProlog +%%BeginSetup +BeginDVC$PSDoc +CLRP 300 3600 RES +%%EndSetup +%%DOC$Page: I 1 +1000 BP 39600 30600 PM 0 0 XY +XP +% DefineFont:F38 Category:10 PointSize:9 +/Helvetica /Helvetica@DOCPSE DOCPSE ReENCODE +/F38 450.0 /Helvetica@DOCPSE DPSF +RP +25127 5120 XY F38(DA)S -34 x(TE:)S 548 y 3600 X(May)S 167 x(1,)S +166 x(1989)S 8756 Y 13793 X(Design)S 185 x(Speci\211cation)S 897 y +15592 X(for)S 897 y 8802 X(Design)S 174 x(of)S 175 x(a)S 175 x +(Machine)S 175 x(Indepen)S 2 x(dent)S 175 x(X)S 174 x(Image)S 176 x +(Extension)S 175 x(Server)S 176 x(System)S 14734 Y 3600 X(W)S -8 x +(ritten)S 166 x(by:)S 249 x(Richard)S 166 x(Piccolo)S 16726 Y 3600 X +(Issued)S 167 x(by:)S 498 x(IPG)S 166 x(Engineering)S 18719 Y 3600 X +(Approve)S 2 x(d)S 166 x(by:)S 19964 Y 4796 X 22116 48 R 548 y 4796 X +(Joe)S 166 x(Maur)S 2 x(o,)S 165 x(IPG)S 166 x(Architect)S 21757 Y +4796 X 22116 48 R 548 y 4796 X(John)S 166 x(W)S -7 x(eber)S -24 x(,)S +166 x(Project)S 166 x(Leader)S +XP +% DefineFont:F40 Category:10 PointSize:9 +/Helvetica-Bold /Helvetica-Bold@DOCPSE DOCPSE ReENCODE +/F40 450.0 /Helvetica-Bold@DOCPSE DPSF +RP +4796 33987 XY F40(Digi)S -2 x(tal)S 167 x(Equipment)S 165 x +(Corporation)S +PP +EP +%%DOC$Page: III 2 +1000 BP 39600 30600 PM 0 0 XY +XP +% DefineFont:F24 Category:10 PointSize:14 +/F24 700.0 /Helvetica-Bold@DOCPSE DPSF +RP +3600 5321 XY F24(Contents)S +XP +% DefineFont:F40 Category:10 PointSize:9 +/F40 450.0 /Helvetica-Bold@DOCPSE DPSF +RP +5393 6870 XY F40(PREF)S -25 x(ACE)S 26539 X(vi)S +XP +% DefineFont:F36 Category:10 PointSize:10 +/F36 500.0 /Helvetica-Bold@DOCPSE DPSF +RP +3600 8066 XY F36(CHAPTER)S 165 x(1)S 499 x(OVER)S -10 x(VIEW)S 26165 X +F40(1\2031)S 896 y 5393 X(1.1)S 7187 X(INTR)S -2 x(ODUCTION)S 26165 X +(1)S +(\2031)S 897 y 5393 X(1.2)S 7187 X(XIE)S 165 x(ORGANIZ)S -2 x(A)S +-33 x(TION)S 26165 X(1\2032)S 598 y 7187 X(1.2.1)S 9578 X(XIELIB)S +26165 X(1\2033)S 597 y 7187 X(1.2.2)S 9578 X(DIX/XI)S -2 x(E)S 166 x +(Component)S 26165 X(1\2034)S 598 y 7187 X(1.2.3)S 9578 X(DDX/XI)S +-2 x(E)S 166 x(Component)S 26165 X(1\2034)S +XP +% DefineFont:F38 Category:10 PointSize:9 +/F38 450.0 /Helvetica@DOCPSE DPSF +RP +9578 12200 XY F38(1.2.3.1)S 11969 X(DDX/Machine)S 166 x(Independe)S +2 x(nt)S 166 x(Component)S 180 x(\201)S 179 x(1\2034)S 548 y 9578 X +(1.2.3.2)S 11969 X(DDX/Machine)S 166 x(Dependent)S 167 x(Compone)S +2 x(nt)S 179 x(\201)S 179 x(1\2034)S 598 y 7187 X F40(1.2.4)S 9578 X +(XIE)S 165 x(Services)S 26165 X(1\2034)S 548 y 9578 X F38(1.2.4.1)S +11969 X(Session)S 166 x(Services)S 180 x(\201)S 180 x(1\2035)S 548 y +9578 X(1.2.4.2)S 11969 X(Resource)S 167 x(Services)S 180 x(\201)S +179 x(1\2035)S 548 y 9578 X(1.2.4.2.1)S 12434 X(IOB)S 178 x(\201)S +180 x(1\2035)S 548 y 9578 X(1.2.4.2.2)S 12434 X(IDC)S 178 x(\201)S +179 x(1\2035)S 548 y 9578 X(1.2.4.2.3)S 12434 X(IPC)S 178 x(\201)S +179 x(1\2035)S 548 y 9578 X(1.2.4.3)S 11969 X(Server/Client)S 165 x +(Image/Expo)S 2 x(rt)S 166 x(Services)S 180 x(\201)S 179 x(1\2035)S +547 y 9578 X(1.2.4.4)S 11969 X(T)S -17 x(ranspor)S 2 x(t)S 165 x +(Services)S 181 x(\201)S 179 x(1\2036)S 548 y 9578 X(1.2.4.5)S 11969 X +(Process)S 167 x(Services)S 180 x(\201)S 179 x(1\2036)S 548 y 9578 X +(1.2.4.6)S 11969 X(Statist)S -2 x(ic)S 166 x(Services)S 180 x(\201)S +180 x(1\2036)S 548 y 9578 X(1.2.4.7)S 11969 X(Process)S 167 x +(Control)S 166 x(Services)S 180 x(\201)S 179 x(1\2036)S 548 y 9578 X +(1.2.4.8)S 11969 X(Display)S 165 x(Service)S 180 x(\201)S 179 x +(1\2036)S 548 y 9578 X(1.2.4.9)S 11969 X(Event)S 166 x(Services)S +180 x(\201)S 179 x(1\2036)S 598 y 7187 X F40(1.2.5)S 9578 X +(Relationship)S 165 x(to)S 166 x(CORE)S 165 x(X)S 26165 X(1\2036)S +548 y 9578 X F38(1.2.5.1)S 11969 X(CORE)S 165 x(X)S 166 x(Resources)S +181 x(\201)S 179 x(1\2037)S 548 y 9578 X(1.2.5.1.1)S 12434 X +(Graphics)S 166 x(Context)S 180 x(\201)S 179 x(1\2037)S 548 y 9578 X +(1.2.5.1.2)S 12434 X(Drawables)S 179 x(\201)S 179 x(1\2037)S 548 y +9578 X(1.2.5.2)S 11969 X(Processing)S 167 x(Modes)S 181 x(\201)S +179 x(1\2037)S 548 y 9578 X(1.2.5.2.1)S 12434 X(DIX)S 165 x +(Processing)S 181 x(\201)S 179 x(1\2037)S 548 y 9578 X(1.2.5.2.2)S +12434 X(DIX/D)S -2 x(DX)S 166 x(Processing)S 181 x(\201)S 179 x +(1\2037)S 25002 Y 3600 X F36(CHAPTER)S 165 x(2)S 499 x(DIX/XIE)S +167 x(COMPONENT)S 26165 X F40(2\2031)S 897 y 5393 X(2.1)S 7187 X +(INIT)S -2 x(IALIZA)S -34 x(TION)S 165 x(PROCEDU)S -2 x(RES)S 26165 X +(2)S +(\2033)S 598 y 7187 X(2.1.1)S 9578 X(XieInit)S 26165 X(2\2033)S 547 y +9578 X F38(2.1.1.1)S 11969 X(Making)S 167 x(XIE)S 165 x(Known)S 167 x +(to)S 166 x(the)S 166 x(CORE)S 165 x(X)S 180 x(\201)S 179 x(2\2033)S +548 y 9578 X(2.1.1.2)S 11969 X(De\211ning)S 166 x(Errors)S 167 x +(and)S 167 x(Events)S 180 x(\201)S 179 x(2\2034)S 548 y 9578 X +(2.1.1.3)S 11969 X(De\211ning)S 166 x(XIE)S 166 x(Resource)S 167 x +(Class)S 166 x(and)S 167 x(T)S -25 x(ypes)S 180 x(\201)S 179 x +(2\2034)S 598 y 7187 X F40(2.1.2)S 9578 X(XieDeviceInit)S 26165 X +(2\2035)S 897 y 5393 X(2.2)S 7187 X(DIX/XI)S -2 x(E)S 166 x(REQUEST)S +165 x(PROCESSING)S 26165 X(2\2036)S 598 y 7187 X(2.2.1)S 9578 X +(XieDispatcher)S 26165 X(2\2036)S 547 y 9578 X F38(2.2.1.1)S 11969 X +(Error)S 167 x(Noti\211cation)S 165 x(to)S 166 x(Client)S 178 x +(\201)S 180 x(2\2037)S 548 y 9578 X(2.2.1.2)S 11969 X(Swapping)S +166 x(Requests)S 180 x(\201)S 179 x(2\2037)S 35879 Y 26539 X F40 +(iii)S +PP +EP +%%DOC$Page: IV 3 +1000 BP 39600 30600 PM 0 0 XY +3600 Y 3600 X F36(Contents)S 5119 Y 7187 X F40(2.2.2)S 9578 X(DIX)S +165 x(Request)S 167 x(Procedures)S 26165 X(2\2038)S 548 y 9578 X F38 +(2.2.2.1)S 11969 X(Processing)S 167 x(of)S 166 x(Requests)S 167 x(-)S +166 x(Phase)S 167 x(I)S 179 x(\201)S 179 x(2\2038)S 548 y 9578 X +(2.2.2.1.1)S 12434 X(V)S -34 x(ariable)S 167 x(Length)S 167 x +(Requests)S 180 x(\201)S 179 x(2\2038)S 548 y 9578 X(2.2.2.2)S 11969 X +(Processing)S 167 x(of)S 166 x(Requests)S 167 x(-)S 166 x(Phase)S +167 x(II)S 179 x(\201)S 179 x(2\2039)S 548 y 9578 X(2.2.2.2.1)S +12434 X(XIE)S 165 x(Replies)S 179 x(\201)S 179 x(2\2039)S 548 y +9578 X(2.2.2.2.2)S 12434 X(Session)S 166 x(Services)S 180 x(\201)S +180 x(2\20310)S +XP +% DefineFont:F39 Category:10 PointSize:9 +/Helvetica-Oblique /Helvetica-Oblique@DOCPSE DOCPSE ReENCODE +/F39 450.0 /Helvetica-Oblique@DOCPSE DPSF +RP +9578 8407 XY F39(2.2.2.2.2.1)S 737 x(XIEP_INI)S -2 x(T_SESSION)S +179 x(\201)S 179 x(2\20310)S 548 y 9578 X(2.2.2.2.2.2)S 737 x +(XIEP_TERM_SESSION)S 178 x(\201)S 180 x(2\20310)S 548 y 9578 X F38 +(2.2.2.2.3)S 12434 X(Resource)S 167 x(Services)S 180 x(\201)S 179 x +(2)S +(\2031)S -32 x(1)S 548 y 9578 X F39(2.2.2.2.3.1)S 737 x(Creating)S +166 x(XIE)S 165 x(Resourc)S 2 x(es)S 179 x(\201)S 180 x(2\2031)S +-33 x(1)S 548 y 9578 X(2.2.2.2.3.2)S 737 x(V)S -17 x(alidating)S +166 x(XIE)S 165 x(Resource)S 2 x(s)S 179 x(\201)S 179 x(2\20312)S +548 y 9578 X(2.2.2.2.3.3)S 737 x(Freeing)S 166 x(XIE)S 166 x +(Resources)S 181 x(\201)S 179 x(2\20312)S 548 y 9578 X(2.2.2.2.3.4)S +737 x(Querying)S 166 x(XIE)S 166 x(Resources)S 181 x(\201)S 179 x +(2\20312)S 547 y 9578 X F38(2.2.2.2.4)S 12434 X(Import/Export)S 166 x +(Services)S 181 x(\201)S 179 x(2\20312)S 548 y 9578 X F39 +(2.2.2.2.4.1)S 737 x(XIEP_IMPOR)S -9 x(T_IMAGE)S 179 x(\201)S 180 x +(2)S +(\20312)S 548 y 9578 X(2.2.2.2.4.2)S 737 x(XIEP_EXPOR)S -9 x +(T_IMAGE)S 179 x(\201)S 180 x(2\20313)S 548 y 9578 X F38(2.2.2.2.5)S +12434 X(T)S -17 x(ranspor)S 2 x(t)S 165 x(Services)S 180 x(\201)S +180 x(2\20314)S 548 y 9578 X F39(2.2.2.2.5.1)S 737 x(IOB)S 165 x +(Data)S 166 x(Formats)S 167 x(and)S 167 x(Organization)S 180 x(\201)S +179 x(2\20314)S 548 y 9578 X(2.2.2.2.5.2)S 737 x(XIEP_SET_TRANSPOR)S +-9 x(T)S 179 x(\201)S 179 x(2\20315)S 548 y 9578 X(2.2.2.2.5.3)S +737 x(XIEP_PUT_TILE)S 179 x(\201)S 179 x(2\20315)S 548 y 9578 X +(2.2.2.2.5.4)S 737 x(XIEP_GET_TILE)S 179 x(\201)S 179 x(2\20316)S +548 y 9578 X(2.2.2.2.5.5)S 737 x(XIEP_PUT_STREAM)S 179 x(\201)S 179 x +(2)S +(\20316)S 548 y 9578 X(2.2.2.2.5.6)S 737 x(XIEP_GET_STREAM)S 179 x +(\201)S 179 x(2\20317)S 548 y 9578 X F38(2.2.2.2.6)S 12434 X +(Process)S 167 x(Services)S 180 x(\201)S 179 x(2\20318)S 548 y 9578 X +F39(2.2.2.2.6.1)S 737 x(XIE')S -9 x(s)S 166 x(Handling)S 166 x(of)S +166 x(IOB)S 165 x(Data)S 166 x(Formats)S 181 x(\201)S 179 x(2\20318)S +548 y 9578 X F38(2.2.2.2.7)S 12434 X(Statist)S -2 x(ics)S 166 x +(Services)S 180 x(\201)S 180 x(2\20319)S 548 y 9578 X(2.2.2.2.8)S +12434 X(Process)S 167 x(Control)S 166 x(Services)S 167 x(-)S 166 x +(TBS)S 179 x(\201)S 180 x(2\20319)S 548 y 9578 X(2.2.2.2.9)S 12434 X +(Display)S 165 x(Service)S 180 x(\201)S 179 x(2\20319)S 548 y 9578 X +F39(2.2.2.2.9.1)S 737 x(XIEP_DISPLA)S -34 x(Y_SEQUENCE)S 179 x(\201)S +179 x(2\20319)S 548 y 9578 X F38(2.2.2.2.10)S 862 x(Event)S 166 x +(Services)S 180 x(\201)S 179 x(2\20320)S 548 y 9578 X F39 +(2.2.2.2.10.1)S 488 x(Event)S 166 x(Noti\211cation)S 165 x(to)S 166 x +(Client)S 178 x(\201)S 180 x(2\20320)S 548 y 9578 X(2.2.2.2.10.2)S +488 x(XIEP_SELECT_EVENTS)S 179 x(\201)S 179 x(2\20321)S 547 y 9578 X +(2.2.2.2.10.3)S 488 x(XIEP_QUER)S -18 x(Y_EVENTS)S 179 x(\201)S 180 x +(2)S +(\20321)S 23849 Y 3600 X F36(CHAPTER)S 165 x(3)S 499 x(DDX)S 165 x +(COMPONENT)S 26165 X F40(3\2031)S 897 y 5393 X(3.1)S 7187 X(PROCED)S +-2 x(URE)S 166 x(VECT)S -9 x(OR)S 166 x(T)S -33 x(ABLE)S 26165 X +(3\2031)S 597 y 7187 X(3.1.1)S 9578 X(Lower)S 166 x(Level)S 166 x +(Image)S 166 x(Processing)S 167 x(Routines)S 26165 X(3\2034)S 897 y +5393 X(3.2)S 7187 X(DIX/D)S -2 x(DX)S 166 x(INTERF)S -26 x(ACE)S +26165 X(3\2034)S 27436 Y 3600 X F36(CHAPTER)S 165 x(4)S 499 x(OPERA)S +-38 x(TING)S 166 x(SYSTE)S 2 x(M)S 165 x(CONSIDERA)S -38 x(TIONS)S +26165 X F40(4\2031)S 896 y 5393 X(4.1)S 7187 X(MEMOR)S -17 x(Y)S +166 x(MANAGEMENT)S 26165 X(4\2031)S 897 y 5393 X(4.2)S 7187 X(LINK)S +-2 x(ING)S 166 x(AND)S 165 x(LOADI)S -2 x(NG)S 166 x(XIE)S 26165 X +(4)S +(\2031)S 896 y 5393 X(4.3)S 7187 X(HARD)S -2 x(W)S -24 x(ARE)S 165 x +(CONSIDERA)S -35 x(TIONS)S 26165 X(4\2031)S 598 y 7187 X(4.3.1)S +9578 X(Hardware)S 167 x(Recognition)S 26165 X(4\2032)S 598 y 7187 X +(4.3.2)S 9578 X(Multiple)S 165 x(Function)S 166 x(Request)S 26165 X +(4)S +(\2032)S 35879 Y 3600 X(iv)S +PP +EP +%%DOC$Page: V 4 +1000 BP 39600 30600 PM 0 0 XY +3600 Y 24754 X F36(Contents)S 5171 Y 3600 X(APPENDIX)S 166 x(A)S +498 x(XIE)S 167 x(PROT)S -9 x(OCOL)S 165 x(REQUESTS)S 26090 X F40 +(A\2031)S 6366 Y 3600 X F36(APPENDIX)S 166 x(B)S 498 x(MODULES)S +166 x(AND)S 165 x(PROCEDUR)S -2 x(ES)S 26090 X F40(B\2031)S 7562 Y +3600 X F36(APPENDIX)S 166 x(C)S 498 x(XIE)S 167 x(APPLICA)S -36 x +(TION)S 166 x(AND)S 165 x(WIRE)S 166 x(DEFINIT)S 2 x(IONS)S 166 x +(AND)S 165 x(STRUCTURES)S 26090 X F40(C\2031)S 8757 Y 3600 X F36 +(APPENDIX)S 166 x(D)S 498 x(SER)S -9 x(VER)S 167 x(DEFINITIONS)S +167 x(AND)S 165 x(STRUCTURES)S 26090 X F40(D\2031)S 9953 Y 3600 X +F36(APPENDIX)S 166 x(E)S 499 x(CORE)S 165 x(X)S 166 x(STRUCTURES)S +26115 X F40(E\2031)S 11148 Y 3600 X F36(APPENDIX)S 166 x(F)S 499 x +(MACRO)S -2 x(S)S 26140 X F40(F\2031)S 897 y 5393 X(F)S -50 x(.1)S +7187 X(CORE)S 165 x(X)S 166 x(MACROS)S 26140 X(F\2031)S 896 y 5393 X +(F)S -50 x(.2)S 7187 X(XIE)S 165 x(MACROS)S 26140 X(F\2032)S 14137 Y +3600 X F36(APPENDIX)S 166 x(G)S 498 x(DIX/DDX)S 167 x(INTERF)S -27 x +(ACE)S 26065 X F40(G\2031)S 15769 Y 3600 X F36(FIGURES)S 698 y -421 x +F40(1\2031)S 7187 X(Client/Server)S 166 x(Relationship)S 26165 X +(1\2032)S 697 y 5393 X(1\2032)S 7187 X(Client/C)S -2 x(ORE)S 166 x +(X/Extension)S 166 x(Relationship)S 26165 X(1\2033)S 697 y 5393 X +(2\2031)S 7187 X(DIX)S 165 x(Procedures)S 26165 X(2\2032)S 698 y +5393 X(3\2031)S 7187 X(DDX)S 165 x(Subcomponents)S 26165 X(3\2032)S +20277 Y 3600 X F36(T)S -37 x(ABLES)S 698 y -162 x F40(3\2031)S 7187 X +(DDX)S 165 x(Procedure)S 167 x(V)S -24 x(ector)S 167 x(T)S -33 x +(able)S 26165 X(3\2032)S 697 y 5393 X(A\2031)S 7187 X(Image)S 165 x +(Extension)S 167 x(Functions)S 26090 X(A\2031)S 698 y 5393 X(A\2032)S +7187 X(Service)S 167 x(Classes)S 26090 X(A\2033)S 35879 Y -249 x(v)S +PP +EP +%%DOC$Page: VI 5 +1000 BP 39600 30600 PM 0 0 XY +3600 4845 XY 23316 48 R +XP +% DefineFont:F24 Category:10 PointSize:14 +/F24 700.0 /Helvetica-Bold@DOCPSE DPSF +RP +3600 6190 XY F24(Preface)S 9378 Y 3600 X 23316 48 R +XP +% DefineFont:F28 Category:10 PointSize:12 +/F28 600.0 /Helvetica-Bold@DOCPSE DPSF +RP +3600 10076 XY F28(Associate)S 2 x(d)S 166 x(Document)S 2 x(s)S +XP +% DefineFont:F151 Category:10 PointSize:10 +/NewCenturySchlbk-Roman /NewCenturySchlbk-Roman@DOCPSE DOCPSE ReENCODE +/F151 500.0 /NewCenturySchlbk-Roman@DOCPSE DPSF +RP +4796 10972 XY F151(\201)S +XP +% DefineFont:F152 Category:10 PointSize:10 +/NewCenturySchlbk-Italic /NewCenturySchlbk-Italic@DOCPSE DOCPSE ReENCODE +/F152 500.0 /NewCenturySchlbk-Italic@DOCPSE DPSF +RP +5692 10972 XY F152(Image)S 166 x(Extension)S 167 x(Concepts)S 12317 Y +4796 X F151(\201)S 594 x F152(XIE_Protocol)S 35879 Y 3600 X F40(vi)S +PP +EP +%%DOC$Page: 1-1 6 +1000 BP 39600 30600 PM 0 0 XY +9007 Y 3600 X F24(Chapter)S 498 x(1)S 10651 Y 3600 X(Overview)S +13357 Y 4796 X F151(This)S 186 x(document)S 186 x(de\211nes)S 187 x +(the)S 186 x(concepts,)S 192 x(components,)S 192 x(and)S 186 x +(relationships)S 186 x(needed)S 187 x(to)S 186 x(extend)S 186 x(the)S +598 y 4796 X(COR)S -2 x(E)S 166 x(X)S 166 x(server)S 166 x(to)S 166 x +(accommodate)S 166 x(the)S 166 x(proposed)S 166 x(X)S 166 x(Image)S +166 x(Extension.)S 896 y 4796 X(This)S 187 x(design)S 188 x +(speci\211cation,)S 193 x(which)S 188 x(is)S 187 x(based)S 187 x(on)S +188 x(the)S 188 x(third)S 187 x(release)S 187 x(of)S 188 x(X,)S 187 x +(V)S -46 x(ersion)S 188 x(1)S -28 x(1)S 188 x(from)S 187 x(MIT)S +-45 x(,)S 598 y 4796 X(addresses)S 166 x(the)S 167 x(extension')S +-18 x(s)S 166 x(relationship)S 167 x(to)S 167 x(the)S 167 x(CORE)S +166 x(X,)S 167 x(its)S 166 x(components,)S 168 x(its)S 166 x +(functionality)S 168 x(and)S 167 x(its)S 598 y 4796 X(operation.)S +18587 Y 3600 X F28(1.1)S 599 x(Introduction)S 19833 Y 4796 X F151 +(The)S 185 x(COR)S -2 x(E)S 185 x(X)S 184 x(window)S 183 x(system)S +184 x(or)S 185 x(X)S 184 x(is)S 184 x(a)S 184 x(network-transparent)S +185 x(window)S 184 x(system)S 184 x(which)S 184 x(allows)S 597 y +4796 X(users)S 166 x(to)S 167 x(run)S 168 x(multiple)S 166 x +(applications)S 167 x(simultaneously)S 167 x(in)S 167 x(windows,)S +166 x(gener)S 2 x(ating)S 167 x(text)S 167 x(and)S 167 x(graphics)S +167 x(in)S 598 y 4796 X(monochrome)S 168 x(or)S 169 x(color)S 168 x +(on)S 168 x(a)S 168 x(bitmap)S 168 x(display)S -56 x(.)S 254 x(CORE)S +166 x(X)S 168 x(provides)S 168 x(facilities)S 167 x(for)S 168 x +(generating)S 170 x(multifont)S 598 y 4796 X(text)S 168 x(and)S 170 x +(two-dim)S -2 x(ensional)S 170 x(graphics)S 169 x(\(such)S 169 x(as)S +169 x(points,)S 169 x(lines,)S 170 x(arcs,)S 170 x(and)S 169 x +(polygons\))S 170 x(in)S 169 x(a)S 169 x(hierarchy)S 170 x(of)S 598 y +4796 X(rectangular)S 167 x(windows.)S 896 y 4796 X(An)S 172 x +(application)S 172 x(program)S 174 x(\(client\))S 172 x(connects)S +173 x(to)S 173 x(the)S 172 x(window)S 172 x(system)S 172 x +(\(server\))S 173 x(by)S 173 x(some)S 172 x(interprocess)S 598 y +4796 X(communication)S 174 x(path.)S 266 x(A)S 174 x(client\(s\))S +173 x(communicates)S 175 x(via)S 174 x(calls)S 174 x(to)S 174 x(the)S +174 x(CORE)S 172 x(X)S 174 x(library)S 175 x(called)S 174 x(XLIB.)S +598 y 4796 X(See)S 165 x(Figu)S 2 x(re)S 166 x(1\2031.)S 35879 Y +23723 X F40(Overview)S 449 x(1\2031)S +PP +EP +%%DOC$Page: 1-2 7 +1000 BP 39600 30600 PM 0 0 XY +XP +% DefineFont:F36 Category:10 PointSize:10 +/F36 500.0 /Helvetica-Bold@DOCPSE DPSF +RP +4796 5171 XY F36(Figure)S 167 x(1\2031:)S 498 x(Client/Server)S 167 x +(Relationshi)S 2 x(p)S 548 y 4796 X 22116 24 R +XP +% DefineFont:F102 Category:10 PointSize:8 +/Courier /Courier@DOCPSE DOCPSE ReENCODE +/F102 400.0 /Courier@DOCPSE DPSF +RP +6708 6343 XY F102(+-----------)S 2 x(+)S 717 x(+-----------+)S 719 x +(+-----------+)S 448 y 6708 X(|)S 240 x(CLIENT)S 239 x(1)S 479 x(|)S +717 x(|)S 239 x(CLIENT)S 240 x(2)S 478 x(|)S 718 x(|)S 239 x(CLIENT)S +240 x(3)S 478 x(|)S 478 x(....)S 448 y 6708 X(+-----------)S 2 x(+)S +717 x(+-----------+)S 719 x(+-----------+)S 449 y 8143 X(^)S 11969 X +(^)S 15794 X(^)S 448 y 8143 X(|)S 11969 X(|)S 15794 X(|)S 448 y +8143 X(|<-------------)S 2 x(-v---------------<)S 449 y 8143 X(|)S +448 y -239 x(v)S 448 y 6708 X(+-----------)S 2 x(+)S 449 y 6708 X(|)S +718 x(XLIB)S 9578 X(|)S 448 y 6708 X(+-----------)S 2 x(+)S 448 y +8143 X(^)S 449 y -239 x(|)S 448 y -239 x(v)S 448 y 6708 X +(+-----------)S 2 x(-+)S 449 y 6708 X(|INTERCONNEC)S 2 x(T|)S 448 y +6708 X(+-----------)S 2 x(-+)S 448 y 8143 X(^)S 449 y -239 x(|)S +448 y -239 x(v)S 448 y 6708 X(+-----------)S 2 x(--+)S 449 y 6708 X +(|CORE)S 240 x(X)S 239 x(SERVER|)S 448 y 6708 X(+-----------)S 2 x +(--+)S 622 y 4796 X 22116 24 R 897 y 4796 X F151(The)S 171 x(CORE)S +169 x(X)S 170 x(protocol)S 171 x(has)S 171 x(minimally)S 170 x +(suf\211cient)S 172 x(capabilities.)S 257 x(There)S 172 x(exists)S +170 x(a)S 171 x(mechanism)S 170 x(within)S 598 y 4796 X(the)S 176 x +(protocol)S 176 x(to)S 176 x(allow)S 175 x("extending)S 2 x(")S 175 x +(the)S 177 x(protocol)S 176 x(to)S 176 x(embrace)S 176 x(new)S 176 x +(functionality)S -54 x(.)S 270 x(In)S 176 x(order)S 176 x(for)S 176 x +(the)S 598 y 4796 X(COR)S -2 x(E)S 166 x(X)S 167 x(to)S 166 x +(accommodate)S 166 x(image)S 167 x(enhancemen)S 2 x(t)S 166 x(and)S +167 x(rendition,)S 167 x(a)S 167 x(CORE)S 165 x(X)S 166 x(image)S +167 x(extension)S 167 x(\(XIE\))S 597 y 4796 X(was)S 165 x +(conceived.)S 22059 Y 3600 X F28(1.2)S 599 x(XIE)S 165 x +(Organizatio)S 2 x(n)S 23304 Y 4796 X F151(The)S 157 x(extension)S +157 x(has)S 157 x(three)S 157 x(major)S 157 x(components:)S 250 x +(an)S 156 x(extended)S 158 x(protocol)S 156 x(interface)S 157 x +(library)S 158 x(\(XIE)S 155 x(LIB\),)S 157 x(a)S 598 y 4796 X +(device)S 168 x(independent)S 169 x(server)S 168 x(component)S 168 x +(\(DIX\),)S 167 x(and)S 169 x(a)S 167 x(device)S 169 x(dependent)S +168 x(server)S 168 x(component)S 169 x(\(DDX\))S -2 x(.)S 598 y +4796 X(This)S 183 x(structure)S 183 x(is)S 182 x(similar)S 182 x(in)S +184 x(concept)S 183 x(to)S 183 x(that)S 182 x(of)S 183 x(the)S 183 x +(CORE)S 181 x(X.)S 184 x(Figure)S 184 x(1\2032)S 182 x(represents)S +183 x(a)S 183 x(block)S 597 y 4796 X(diagram)S 166 x(of)S 166 x +(XIE')S 165 x(s)S 165 x(components)S 166 x(and)S 167 x(their)S 166 x +(relationship)S 166 x(to)S 166 x(each)S 167 x(other)S 166 x(and)S +166 x(to)S 166 x(the)S 166 x(CORE)S 165 x(X.)S 35879 Y 3600 X F40 +(1\2032)S 449 x(Overview)S +PP +EP +%%DOC$Page: 1-3 8 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 4796 X F36(Figure)S 167 x(1\2032:)S 498 x(Client/CORE)S 166 x +(X/Extensi)S 2 x(on)S 166 x(Relation)S 2 x(ship)S 548 y 4796 X +22116 24 R 624 y 4796 X F102(+---------------+)S 12447 X +(+---------------+)S 448 y 4796 X(|)S 717 x(CLIENT)S 240 x(1)S 8621 X +(|)S 12447 X(|)S 13642 X(CLIENT)S 240 x(2)S 717 x(|)S 240 x +(.............)S 448 y 4796 X(+---------------+)S 12447 X +(+---------------+)S 449 y 6469 X(^)S 14360 X(^)S 448 y 6469 X +(|<-----------)S 2 x(-------------------)S 2 x(>|)S 448 y 6469 X(v)S +14360 X(v)S 449 y 4796 X(+---------------+)S 12447 X +(+---------------+)S 448 y 4796 X(|)S 5991 X(XLIB)S 8621 X +(|<-----------)S 2 x(---|)S 13881 X(XIELIB)S 16272 X(|)S 448 y 4796 X +(+---------------+)S 12447 X(+---------------+)S 449 y 6469 X(^)S +448 y -239 x(|)S 448 y -239 x(v)S 449 y 5752 X(+---------------)S +2 x(-------------------)S 2 x(----+)S 448 y 5752 X(|)S 9338 X +(TRANSPORT)S 15077 X(+)S 448 y 5752 X(+---------------)S 2 x +(-------------------)S 2 x(----+)S 449 y 7665 X(^)S 448 y -239 x(|)S +448 y -239 x(v)S 449 y 5991 X(+--------------)S 2 x(+)S 448 y 5991 X +(|)S 717 x(CORE)S 240 x(X)S 9578 X(|)S 448 y 5991 X(|)S 478 x +(SCHEDULER)S 719 x(|)S 449 y 5991 X(+--------------)S 2 x(+)S 448 y +7665 X(^)S 448 y -239 x(|)S 448 y -239 x(v)S 449 y 5991 X +(+--------------)S 2 x(+)S 12208 X(+--------------+)S 448 y 5991 X +(|)S 478 x(DIX)S 240 x(CORE)S 239 x(X)S 479 x(|--------->|)S 479 x +(DIX/XIE)S 15794 X(|)S 448 y 5991 X(|)S 478 x(DISPATCHER)S 480 x(|)S +12208 X(|)S 478 x(DISPATCHER)S 479 x(|)S 449 y 5991 X +(+--------------)S 2 x(+)S 12208 X(+--------------+)S 448 y 7665 X +(^)S 14121 X(^)S 448 y 7665 X(|)S 14121 X(|)S 449 y 7665 X(v)S 14121 X +(v)S 448 y 5991 X(+--------------)S 2 x(+)S 12208 X +(+---------------+)S 448 y 5991 X(|)S 478 x(CORE)S 240 x(X)S 239 x +(DIX)S 479 x(|<-------->|)S 718 x(DIX/XIE)S 16033 X(|)S 449 y 5991 X +(+--------------)S 2 x(+)S 12208 X(+---------------+)S 448 y 6469 X +(^)S 8860 X(^)S 12686 X(^)S 15555 X(^)S 448 y 6469 X(|)S 8860 X(|)S +12686 X(|)S 15555 X(|)S 449 y 6469 X(v)S 8860 X(v)S 12686 X(v)S +15555 X(v)S 448 y 4796 X(+---------+)S 479 x(+---------+)S 11490 X +(+---------+)S 480 x(+---------+)S 448 y 4796 X(|DDX/CORE)S 240 x(|)S +478 x(|DDX/CORE)S 240 x(|)S 11490 X(|)S 240 x(DDX/XIE)S 239 x(|)S +479 x(|)S 239 x(DDX/XIE)S 240 x(|)S 449 y 4796 X(|)S 239 x(MACHINE)S +240 x(|)S 478 x(|)S 239 x(MACHINE)S 240 x(|)S 11490 X(|)S 240 x +(MACHINE)S 239 x(|)S 479 x(|)S 239 x(MACHINE)S 240 x(|)S 448 y 4796 X +(|)S 478 x(IND.)S 718 x(|)S 478 x(|)S 717 x(DEP.)S 479 x(|)S 11490 X +(|)S 479 x(IND.)S 717 x(|)S 479 x(|)S 717 x(DEP.)S 479 x(|)S 448 y +4796 X(+---------+)S 479 x(+---------+)S 11490 X(+---------+)S 480 x +(+---------+)S 26094 Y 4796 X 22116 24 R 28485 Y 3600 X F28(1.2.1)S +599 x(XIELIB)S 29581 Y 4796 X F151(This)S 179 x(component)S 180 x +(resides)S 179 x(on)S 180 x(the)S 180 x(client)S 180 x(side)S 179 x +(of)S 180 x(the)S 179 x(wire)S 180 x(and)S 180 x(represents)S 179 x +(the)S 180 x(extended)S 180 x(protocol)S 597 y 4796 X(interface)S +187 x(library)S 187 x(\(analogous)S 187 x(to)S 187 x(XLIB\))S 186 x +(which)S 187 x(is)S 186 x(used)S 186 x(to)S 187 x(pass)S 186 x +(requests)S 186 x(to)S 187 x(the)S 187 x(server)S 187 x(exten-)S +598 y 4796 X(sion.)S 281 x(Since)S 182 x(this)S 181 x(document)S +183 x(represents)S 181 x(the)S 183 x(server)S 182 x(side)S 181 x(of)S +182 x(the)S 182 x(extension,)S 187 x(it)S 182 x(is)S 181 x(stated)S +181 x(here)S 183 x(for)S 598 y 4796 X(completeness)S 165 x(and)S +166 x(because)S 167 x(of)S 166 x(its)S 165 x(relevance)S 167 x(to)S +166 x(the)S 166 x(CORE)S 165 x(X)S 166 x(protocol.)S 35879 Y 23723 X +F40(Overview)S 449 x(1\2033)S +PP +EP +%%DOC$Page: 1-4 9 +1000 BP 39600 30600 PM 0 0 XY +5246 Y 3600 X F28(1.2.2)S 599 x(DIX/XIE)S 165 x(Compone)S 2 x(nt)S +6342 Y 4796 X F151(The)S 166 x(functional)S 167 x(responsibility)S +166 x(of)S 166 x(the)S 166 x(DIX/XIE)S 165 x(component)S 166 x(is)S +166 x(to:)S 7537 Y 5692 X(o)S 166 x(Initialize)S 165 x(the)S 167 x +(extension)S 166 x(server)S -36 x(.)S 598 y 5692 X(o)S 166 x +(Dispatch)S 166 x(execution)S 167 x(of)S 166 x(extension)S 167 x +(server)S 166 x(requests.)S 598 y 5692 X(o)S 166 x(Return)S 167 x +(extension)S 166 x(server)S 167 x(events,)S 167 x(errors)S 166 x +(and)S 167 x(replies.)S 597 y 5692 X(o)S 166 x(Manage)S 167 x +(extension)S 167 x(server)S 167 x(resources.)S 598 y 5692 X(o)S 166 x +(Interface)S 166 x(with)S 166 x(the)S 166 x(CORE)S 165 x(X)S 166 x +(services.)S 598 y 5692 X(o)S 166 x(Interface)S 166 x(with)S 166 x +(the)S 166 x(server)S 167 x(DDX)S 165 x(component.)S 13515 Y 3600 X +F28(1.2.3)S 599 x(DDX/XIE)S 165 x(Component)S 14611 Y 4796 X F151 +(The)S 184 x(DDX/XIE)S 182 x(component)S 184 x(consists)S 183 x(of)S +183 x(two)S 183 x(subcomponents:)S 285 x(machine)S 185 x +(independent)S 184 x(DDX)S 183 x(and)S 597 y 4796 X(machine)S 154 x +(dependent)S 155 x(DDX.)S 153 x(The)S 155 x(former)S 155 x +(represents)S 154 x(a)S 154 x(software)S 153 x(implementation)S 154 x +(of)S 154 x(a)S 154 x(DDX)S 153 x(function,)S 598 y 4796 X +(independent)S 170 x(of)S 171 x(hardware)S 170 x(platform,)S 171 x +(while)S 170 x(the)S 170 x(latter)S 170 x(represents)S 170 x(a)S +170 x(combined)S 171 x(software/hardware)S 598 y 4796 X +(implementation)S 165 x(speci\211c)S 167 x(to)S 165 x(a)S 166 x +(speci\211c)S 167 x(system)S 165 x(platform)S 166 x(or)S 166 x +(class)S 165 x(of)S 166 x(system)S 166 x(platforms.)S 18795 Y 3600 X +F36(1.2.3.1)S 599 x(DDX/Machine)S 167 x(Indep)S 2 x(endent)S 167 x +(Component)S 896 y 4796 X F151(This)S 181 x(component)S 182 x +(includes)S 182 x(the)S 182 x(softwa)S -2 x(re)S 182 x(algorithms)S +182 x(to)S 181 x(perform)S 182 x(the)S 181 x(various)S 182 x(image)S +182 x(processing)S 598 y 4796 X(tasks)S 165 x(called)S 166 x(upon)S +167 x(by)S 166 x(the)S 166 x(client.)S 250 x(This)S 166 x(document)S +167 x(will)S 165 x(address)S 166 x(this)S 165 x(implementation.)S +22680 Y 3600 X F36(1.2.3.2)S 599 x(DDX/Machine)S 167 x(Dependent)S +167 x(Component)S 897 y 4796 X F151(This)S 169 x(component)S 169 x +(performs)S 169 x(all)S 169 x(hardware)S 169 x(related)S 168 x +(tasks)S 169 x(in)S 169 x(performing)S 170 x(client)S 169 x +(requests.)S 255 x(Hardware)S 598 y 4796 X(accelerators)S 177 x +(such)S 177 x(as)S 177 x(array)S 178 x(processors)S 177 x(and)S 177 x +(other)S 178 x(specialized)S 176 x(display)S 177 x(components)S 178 x +(can)S 177 x(achieve)S 597 y 4796 X(high)S 174 x(ef\211ciency)S 175 x +(in)S 174 x(carrying)S 176 x(out)S 173 x(the)S 174 x(various)S 174 x +(image)S 174 x(rendition)S 174 x(algorithms.)S 265 x(T)S -45 x(o)S +173 x(that)S 174 x(end)S 174 x(the)S 173 x(DDX)S 598 y 4796 X +(component)S 166 x(will)S 165 x(be)S 167 x(called)S 166 x(upon)S +166 x(to)S 166 x(make)S 166 x(calls)S 166 x(to)S 166 x(the)S 166 x +(drivers)S 166 x(of)S 166 x(these)S 166 x(devices)S 167 x(when)S +166 x(they)S 167 x(exist.)S 27761 Y 3600 X F28(1.2.4)S 599 x(XIE)S +166 x(Services)S 28857 Y 4796 X F151(A)S 167 x(client)S 167 x(XIE)S +167 x(request)S 167 x(can)S 168 x(be)S 167 x(classi\211ed)S 167 x +(by)S 168 x(its)S 167 x(type)S 168 x(of)S 167 x(service.)S 253 x +(The)S 168 x(following)S 168 x(outlines)S 167 x(the)S 168 x(various)S +598 y 4796 X(classes.)S 252 x(For)S 169 x(further)S 169 x(details)S +168 x(regarding)S 169 x(the)S 169 x(XIE)S 167 x(services)S 169 x +(and)S 168 x(resources,)S 170 x(readers)S 168 x(should)S 168 x(read)S +169 x(the)S 598 y 4796 X(documents)S 166 x(referenced)S 167 x(in)S +166 x(the)S 166 x(preface.)S 35879 Y 3600 X F40(1\2034)S 449 x +(Overview)S +PP +EP +%%DOC$Page: 1-5 10 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 3600 X F36(1.2.4.1)S 599 x(Session)S 167 x(Services)S 896 y +4796 X F151(These)S 166 x(services)S 166 x(allow)S 166 x(clients)S +165 x(to)S 166 x(initialize)S 166 x(and)S 166 x(terminate)S 166 x(a)S +166 x(session)S 165 x(with)S 166 x(the)S 166 x(extension.)S 8458 Y +3600 X F36(1.2.4.2)S 599 x(Resource)S 166 x(Services)S 897 y 4796 X +F151(These)S 163 x(services)S 164 x(allow)S 163 x(clients)S 163 x +(to)S 163 x(create,)S 165 x(query)S -55 x(,)S 165 x(copy)S -55 x(,)S +165 x(and)S 163 x(delete)S 163 x(XIE)S 163 x(resources.)S 250 x +(Resources)S 163 x(include)S 598 y 4796 X(the)S 166 x(following:)S +896 y 4796 X(\201)S 594 x(IOB)S 165 x(-)S 166 x(Image)S 166 x +(Objects)S 748 y 4796 X(\201)S 594 x(IDC)S 165 x(-)S 166 x(Image)S +166 x(Domain)S 166 x(Context)S 747 y 4796 X(\201)S 594 x(IPC)S 166 x +(-)S 166 x(Image)S 166 x(Process)S 166 x(Context)S 14934 Y 3600 X +F36(1.2.4.2.)S 2 x(1)S 597 x(IOB)S 897 y 4796 X F151(An)S 177 x +(Image)S 178 x(Object)S 178 x(\(IOB\))S 177 x(is)S 177 x(a)S 178 x +(structure)S 178 x(which)S 178 x(contains)S 178 x(the)S 178 x(image)S +178 x(data)S 178 x(and)S 178 x(closely)S 178 x(associated)S 597 y +4796 X(attributes)S 165 x(within)S 166 x(a)S 166 x(server)S -36 x(.)S +18819 Y 3600 X F36(1.2.4.2.)S 2 x(2)S 597 x(IDC)S 897 y 4796 X F151 +(An)S 166 x(Image)S 166 x(Domain)S 165 x(Context)S 167 x(\(IDC)S +-2 x(\))S 166 x(is)S 166 x(a)S 166 x(structure)S 166 x(which)S 167 x +(is)S 165 x(used)S 166 x(for)S 166 x(one)S 167 x(of)S 166 x(three)S +166 x(purposes:)S 897 y 4796 X(\201)S 594 x(de\211ne)S 167 x(the)S +166 x(subset)S 166 x(or)S 166 x(region)S 167 x(of)S 166 x(an)S 166 x +(image)S 167 x(to)S 165 x(process)S 747 y 4796 X(\201)S 594 x(act)S +166 x(as)S 166 x(an)S 166 x(area)S 166 x(operand)S 167 x(in)S 166 x +(area)S 166 x(image)S 167 x(operations)S 747 y 4796 X(\201)S 594 x +(both)S 166 x(of)S 166 x(the)S 167 x(above)S 166 x(\(concurre)S 2 x +(ntly\))S 24697 Y 3600 X F36(1.2.4.2.)S 2 x(3)S 597 x(IPC)S 897 y +4796 X F151(An)S 174 x(Image)S 174 x(Process)S 174 x(Context)S 174 x +(\(IPC\))S 174 x(is)S 173 x(a)S 174 x(structure)S 175 x(which)S 174 x +(describes)S 174 x(the)S 174 x(relationship)S 174 x(between)S 174 x +(the)S 598 y 4796 X(various)S 180 x(transfer)S -37 x(,)S 185 x +(enhancement,)S 185 x(and)S 181 x(rendition)S 180 x(processes)S 180 x +(that)S 180 x(make)S 180 x(up)S 181 x(an)S 180 x(image)S 181 x +(processing)S 598 y 4796 X(pipeline.)S 29181 Y 3600 X F36(1.2.4.3)S +599 x(Server/Client)S 167 x(Image/Exp)S 2 x(ort)S 166 x(Services)S +896 y 4796 X F151(These)S 176 x(services)S 176 x(allow)S 176 x +(clients)S 176 x(to)S 176 x(read/write)S 176 x(image)S 176 x(data)S +176 x(within)S 176 x(an)S 176 x(XIE)S 175 x(server)S 177 x(resource)S +177 x(from/to)S 598 y 4796 X(COR)S -2 x(E)S 166 x(X)S 166 x(server)S +166 x(resources)S 167 x(such)S 166 x(as)S 166 x(pixmaps.)S 249 x +(The)S 167 x(XIE)S 165 x(resource)S 167 x(is)S 165 x(called)S 166 x +(an)S 167 x(image)S 166 x(object)S 166 x(\(IOB\).)S 35879 Y 23723 X +F40(Overview)S 449 x(1\2035)S +PP +EP +%%DOC$Page: 1-6 11 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 3600 X F36(1.2.4.4)S 599 x(T)S -27 x(ransport)S 166 x +(Services)S 896 y 4796 X F151(These)S 168 x(services)S 167 x(allow)S +168 x(the)S 168 x(transfer)S 167 x(of)S 168 x(image)S 168 x(data)S +167 x(to/from)S 168 x(client/server)S -35 x(.)S 253 x(The)S 168 x +(server)S 168 x(keeps)S 168 x(images)S 598 y 4796 X(in)S 166 x +(server)S 166 x(resources)S 167 x(called)S 166 x(image)S 166 x +(objects)S 166 x(\(IOB\).)S 9056 Y 3600 X F36(1.2.4.5)S 599 x +(Process)S 166 x(Services)S 897 y 4796 X F151(These)S 166 x +(services)S 167 x(provide)S 167 x(for)S 166 x(the)S 167 x +(application)S 166 x(of)S 166 x(low)S 166 x(level)S 167 x(image)S +166 x(operators)S 167 x(to)S 166 x(image)S 166 x(data)S 166 x +(primarily)S 597 y 4796 X(in)S 166 x(support)S 166 x(of)S 166 x +(preparation)S 166 x(for)S 166 x(or)S 166 x(improvement)S 167 x(of)S +166 x(its)S 165 x(display)S -55 x(.)S 12941 Y 3600 X F36(1.2.4.6)S +599 x(Statistic)S 167 x(Services)S 897 y 4796 X F151(These)S 173 x +(services)S 172 x(provide)S 174 x(clients)S 172 x(procedures)S 174 x +(to)S 172 x(generate)S 174 x(statist)S -2 x(ical)S 173 x +(information)S 173 x(about)S 173 x(an)S 173 x(image.)S 598 y 4796 X +(Such)S 179 x(statis)S -2 x(tics)S 178 x(include)S 179 x(the)S 179 x +(mean,)S 182 x(variance,)S 183 x(standard)S 178 x(deviation,)S 183 x +(maximum)S 179 x(and)S 178 x(minimum)S 179 x(of)S 598 y 4796 X(data)S +165 x(within)S 166 x(an)S 166 x(area)S 167 x(of)S 166 x(an)S 166 x +(image.)S 17425 Y 3600 X F36(1.2.4.7)S 599 x(Process)S 166 x +(Control)S 167 x(Services)S 896 y 4796 X F151(These)S 175 x +(services)S 176 x(provide)S 176 x(clients)S 175 x(the)S 175 x +(ability)S 175 x(to)S 176 x(de\211ne)S 176 x(and)S 175 x(apply)S +176 x(pipelines)S 175 x(containing)S 177 x(transport,)S 598 y 4796 X +(process,)S 166 x(and)S 166 x(display)S 166 x(operations.)S 21310 Y +3600 X F36(1.2.4.8)S 599 x(Display)S 167 x(Service)S 897 y 4796 X +F151(This)S 178 x(service)S 178 x(allows)S 177 x(the)S 178 x(client)S +178 x(to)S 178 x(display)S 178 x(a)S 178 x(sequence)S 178 x(of)S +178 x(prerendered)S 179 x(image)S 178 x(frames)S 178 x(which)S 178 x +(are)S 597 y 4796 X(stored)S 165 x(as)S 166 x(pixmaps.)S 25196 Y +3600 X F36(1.2.4.9)S 599 x(Event)S 166 x(Services)S 896 y 4796 X F151 +(These)S 166 x(services)S 166 x(allows)S 165 x(the)S 166 x(client)S +167 x(to)S 165 x(select)S 166 x(or)S 166 x(query)S 167 x(XIE)S 166 x +(speci)S +(\211c)S 166 x(events.)S 28483 Y 3600 X F28(1.2.5)S 599 x(Relations)S +2 x(hip)S 166 x(to)S 167 x(CORE)S 165 x(X)S 29579 Y 4796 X F151 +(There)S 174 x(exist)S 174 x(a)S 173 x(resource)S 175 x(and/or)S +174 x(process)S 174 x(relationship)S 174 x(between)S 173 x(XIE)S +173 x(and)S 174 x(CORE)S 172 x(X)S 173 x(which)S 174 x(depends)S +598 y 4796 X(on)S 169 x(the)S 170 x(function)S 170 x(the)S 170 x +(extension)S 170 x(is)S 169 x(carrying)S 171 x(out.)S 257 x(CORE)S +168 x(X)S 169 x(will)S 169 x(provide)S 170 x(the)S 169 x(resource)S +170 x(management)S 598 y 4796 X(of)S 180 x(XIE)S 180 x(resources)S +181 x(as)S 181 x(well)S 180 x(as)S 181 x(access)S 180 x(to)S 181 x +(CORE)S 179 x(X)S 181 x(resources)S 181 x(that)S 181 x(XIE)S 179 x +(might)S 182 x(need)S 181 x(\(such)S 181 x(as)S 181 x(the)S 597 y +4796 X(Graphics)S 173 x(Context)S 174 x(\(GC\))S 173 x(or)S 174 x +(drawables\).)S 264 x(In)S 173 x(addition)S 174 x(the)S 174 x +(extension)S 174 x(may)S 174 x(want)S 174 x(to)S 173 x(use)S 174 x +(a)S 174 x(CORE)S 172 x(X)S 598 y 4796 X(process)S 165 x(rather)S +167 x(than)S 166 x(duplicating)S 167 x(the)S 166 x(process)S 166 x +(within)S 166 x(the)S 166 x(extension.)S 35879 Y 3600 X F40(1\2036)S +449 x(Overview)S +PP +EP +%%DOC$Page: 1-7 12 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 3600 X F36(1.2.5.1)S 599 x(CORE)S 165 x(X)S 166 x(Resources)S +896 y 4796 X F151(COR)S -2 x(E)S 160 x(X)S 159 x(provides)S 160 x +(the)S 160 x(extension)S 160 x(with)S 160 x(resource)S 160 x +(management)S 160 x(for)S 160 x(extension)S 161 x(and)S 160 x(COR)S +-2 x(E)S 160 x(resources.)S 598 y 4796 X(Key)S 170 x(CORE)S 169 x(X)S +170 x(resources)S 171 x(that)S 170 x(the)S 171 x(extension)S 171 x +(will)S 169 x(have)S 172 x(interest)S 170 x(in)S 171 x(are)S 170 x +(the)S 171 x(Graphics)S 170 x(Context)S 170 x(and)S 598 y 4796 X +(drawables.)S 9654 Y 3600 X F36(1.2.5.1.)S 2 x(1)S 597 x(Graphics)S +167 x(Context)S 896 y 4796 X F151(The)S 173 x(Graphics)S 172 x +(Context)S 173 x(is)S 173 x(used)S 172 x(when)S 173 x(the)S 173 x +(CORE)S 171 x(X)S 173 x(performs)S 172 x(graphic)S 174 x +(operations.)S 263 x(This)S 173 x(resource)S 598 y 4796 X(consists)S +171 x(of)S 171 x(information)S 172 x(relating)S 173 x(to)S 171 x +(performing)S 173 x(such)S 172 x(operations:)S 262 x(putImage)S 171 x +(\(from)S 172 x(a)S 172 x(server)S 172 x(data)S 598 y 4796 X(buffer)S +166 x(to)S 166 x(a)S 166 x(CORE)S 164 x(X)S 166 x(pixmap\),)S 166 x +(line)S 167 x(style)S 166 x(and)S 166 x(so)S 166 x(on.)S 14137 Y +3600 X F36(1.2.5.1.)S 2 x(2)S 597 x(Drawables)S 897 y 4796 X F151 +(Graphics)S 179 x(operations)S 181 x(can)S 180 x(be)S 180 x +(performed)S 181 x(to)S 180 x(either)S 180 x(windows)S 180 x(or)S +180 x(pixmaps)S 180 x(which)S 180 x(collectively)S 182 x(are)S 597 y +4796 X(called)S 165 x(drawables.)S 249 x(XIE)S 165 x(will)S 166 x +(use)S 166 x(these)S 166 x(resources)S 166 x(for)S 166 x(services)S +166 x(such)S 167 x(as)S 165 x(import/export.)S 18022 Y 3600 X F36 +(1.2.5.2)S 599 x(Processing)S 168 x(Modes)S 897 y 4796 X F151(T)S +-46 x(o)S 176 x(better)S 176 x(delineate)S 176 x(which)S 176 x(of)S +176 x(the)S 176 x(aforementioned)S 177 x(components)S 176 x(are)S +176 x(used)S 176 x(for)S 176 x(a)S 176 x(particular)S 176 x(client)S +598 y 4796 X(XIE)S 166 x(request,)S 168 x(we)S 167 x(de\211ne)S 168 x +(several)S 168 x(processing)S 168 x(modes.)S 251 x(Appendix)S 168 x +(A)S 167 x(maps)S 167 x(each)S 168 x(XIE)S 166 x(protocol)S 168 x +(request)S 598 y 4796 X(to)S 165 x(a)S 166 x(service)S 167 x(class)S +165 x(and)S 167 x(processing)S 166 x(mode.)S 22506 Y 3600 X F36 +(1.2.5.2.)S 2 x(1)S 597 x(DIX)S 167 x(Processing)S 896 y 4796 X F151 +(This)S 174 x(mode)S 175 x(refers)S 174 x(to)S 174 x(those)S 175 x +(requests)S 174 x(which)S 175 x(do)S 174 x(not)S 175 x(need)S 175 x +(processes)S 174 x(from)S 174 x(the)S 175 x(DDX)S 173 x(component)S +175 x(of)S 598 y 4796 X(XIE.)S 26391 Y 3600 X F36(1.2.5.2.)S 2 x(2)S +597 x(DIX/DDX)S 167 x(Processing)S 897 y 4796 X F151(This)S 188 x +(processing)S 189 x(mode)S 188 x(refers)S 189 x(to)S 188 x(those)S +189 x(requests)S 188 x(which)S 189 x(rely)S 189 x(on)S 189 x(the)S +188 x(DDX/XIE)S 187 x(component)S 189 x(to)S 597 y 4796 X(perform)S +166 x(its)S 165 x(task.)S 35879 Y 23723 X F40(Overview)S 449 x +(1\2037)S +PP +EP +%%DOC$Page: 2-1 13 +1000 BP 39600 30600 PM 0 0 XY +9007 Y 3600 X F24(Chapter)S 498 x(2)S 10651 Y 3600 X(DIX/XIE)S 166 x +(Component)S 13494 Y 4796 X F151(This)S 169 x(chapter)S 170 x +(describes)S 169 x(the)S 170 x(procedures)S 170 x(that)S 170 x(make)S +170 x(up)S 170 x(the)S 169 x(DIX/XIE)S 169 x(Server)S 170 x +(Component.)S 257 x(All)S 169 x(XIE)S 597 y 4796 X(client)S 173 x +(requests)S 173 x(to)S 174 x(some)S 173 x(degree)S 174 x(use)S 173 x +(procedures)S 174 x(within)S 174 x(this)S 173 x(component.)S 265 x +(Figure)S 174 x(2\2031)S 174 x(represents)S 598 y 4796 X(a)S 169 x +(block)S 170 x(diagram)S 170 x(of)S 169 x(the)S 170 x(procedures)S +169 x(of)S 170 x(the)S 169 x(DIX/XIE)S 168 x(Component)S 170 x(and)S +170 x(its)S 168 x(relationship)S 170 x(to)S 169 x(CORE)S 168 x(X)S +598 y 4796 X(and)S 166 x(DDX/XI)S -2 x(E)S 166 x(functional)S 167 x +(components.)S 897 y 4796 X(Note:)S 249 x(See)S 166 x(Appendix)S +166 x(B)S 166 x(for)S 166 x(a)S 166 x(list)S 165 x(of)S 166 x +(modules)S 166 x(and)S 166 x(procedures)S 167 x(within)S 166 x(the)S +166 x(DIX/XIE)S 165 x(Component.)S 35879 Y 21465 X F40(DIX/XIE)S +165 x(Component)S 448 x(2\2031)S +PP +EP +%%DOC$Page: 2-2 14 +1000 BP 39600 30600 PM 0 0 XY +7386 Y 4796 X F36(Figure)S 167 x(2\2031:)S 498 x(DIX)S 166 x +(Procedures)S 548 y 4796 X 22116 24 R 8873 Y 9099 X F102 +(INITIALIZAT)S 2 x(ION)S 13642 X(XIE)S 240 x(REQUEST)S 240 x +(PROCESSING)S 449 y 9099 X(-----------)S 2 x(---)S 13642 X +(------------)S 2 x(----------)S 747 y 8621 X(+------------)S 2 x +(----+)S 14121 X(+----------------+)S 448 y 8621 X(|)S 9817 X +(SERVER)S 12686 X(|)S 14121 X(|)S 15316 X(CORE)S 240 x(X)S 18185 X +(|)S 449 y 8621 X(|)S 239 x(INITIALIZAT)S 2 x(ION)S 239 x(|)S 14121 X +(|)S 717 x(TRANSPORT)S 18185 X(|)S 448 y 8621 X(+------------)S 2 x +(----+)S 14121 X(+----------------+)S 448 y 10534 X(^)S 16033 X(^)S +449 y 10534 X(|)S 16033 X(|)S 448 y 10534 X(v)S 16033 X(v)S 448 y +8621 X(+------------)S 2 x(----+)S 14121 X(+----------------+)S 448 y +8621 X(|)S 9817 X(CORE)S 239 x(X)S 12686 X(|)S 14121 X(|)S 15316 X +(CORE)S 240 x(X)S 18185 X(|)S 449 y 8621 X(|)S 239 x(INITIALIZAT)S +2 x(ION)S 239 x(|)S 14121 X(|)S 717 x(DISPATCHER)S 718 x(|)S 448 y +8621 X(+------------)S 2 x(----+)S 14121 X(+----------------+)S 448 y +10534 X(^)S 16033 X(^)S 449 y 6230 X(+-------------)S 2 x +(----|--------------)S 2 x(--------|----------)S 2 x(-----------+)S +448 y 6230 X(|)S 10534 X(v)S 16033 X(v)S 21294 X(|)S 448 y 6230 X(|)S +8621 X(+------------)S 2 x(----+)S 14121 X(+----------------+)S +21294 X(|)S 449 y 6230 X(|)S 8621 X(|)S 9817 X(XieInit)S 12686 X(|)S +14121 X(|)S 478 x(XieDispatcher)S 240 x(|<---+)S 21294 X(|)S 448 y +6230 X(|)S 8621 X(+------------)S 2 x(----+)S 14121 X +(+----------------+)S 19381 X(|)S 21294 X(|)S 448 y 6230 X(|)S 10534 X +(^)S 16033 X(^)S 19381 X(|)S 21294 X(|)S 449 y 6230 X(|)S 10534 X(|)S +16033 X(|)S 19381 X(|)S 21294 X(|)S 448 y 6230 X(|)S 10534 X(v)S +16033 X(v)S 19381 X(|)S 20576 X(DIX/XIE)S 448 y 6230 X(|)S 8621 X +(+------------)S 2 x(----+)S 14121 X(+----------------+)S 19381 X(|)S +21294 X(|)S 449 y 6230 X(|)S 8621 X(|)S 239 x(XieDeviceIn)S 2 x(it)S +478 x(|)S 14121 X(|)S 478 x(DIX)S 239 x(Request)S 718 x(|)S 19381 X +(|)S 21294 X(|)S 448 y 6230 X(|)S 8621 X(+------------)S 2 x(----+)S +14121 X(|)S 478 x(Procedures)S 18185 X(|)S 19381 X(|)S 21294 X(|)S +448 y 6230 X(|)S 10534 X(^)S 14121 X(+----------------+)S 19381 X(|)S +21294 X(|)S 449 y 6230 X(|)S 10534 X(|)S 16033 X(^)S 19381 X(|)S +21294 X(|)S 448 y 6230 X(+-------------)S 2 x(----|--------------)S +2 x(--------|----------)S 2 x(---|-------+)S 448 y 10534 X(|)S 16033 X +(v)S 19381 X(|)S 449 y 10534 X(|)S 14121 X(+----------------+)S +19381 X(|)S 448 y 10534 X(-------------->)S 2 x(|)S 717 x(DDX)S 239 x +(LAYER)S 18185 X(|<---+)S 448 y 14121 X(+----------------+)S 623 y +4796 X 22116 24 R 35879 Y 3600 X F40(2\2032)S 449 x(DIX/XIE)S 165 x +(Component)S +PP +EP +%%DOC$Page: 2-3 15 +1000 BP 39600 30600 PM 0 0 XY +6439 Y 3600 X F28(2.1)S 599 x(Initializati)S 2 x(on)S 166 x +(Procedures)S 7685 Y 4796 X F151(Upon)S 173 x(server)S 174 x +(initialization,)S 175 x(the)S 174 x(CORE)S 172 x(X)S 173 x +(initializes)S 172 x(all)S 174 x(extensions)S 173 x(by)S 174 x +(calling)S 174 x(a)S 174 x(CORE)S 172 x(X)S 173 x(proce-)S 597 y +4796 X(dure)S 176 x(-)S 176 x(InitExtensions.)S 269 x(This)S 176 x +(procedure)S 176 x(calls)S 176 x(the)S 176 x(initialization)S 175 x +(procedure)S 177 x(of)S 175 x(all)S 176 x(extensions)S 176 x(the)S +598 y 4796 X(COR)S -2 x(E)S 169 x(X)S 169 x(will)S 168 x(support.)S +256 x(An)S 169 x(addition)S 169 x(will)S 168 x(be)S 169 x(made)S +169 x(to)S 169 x(InitExtension)S 170 x(to)S 169 x(call)S 169 x(the)S +169 x(XIE)S 168 x(initialization)S 598 y 4796 X(routine.)S 250 x(In)S +166 x(this)S 166 x(implementation,)S 166 x(this)S 166 x(procedure)S +167 x(is)S 165 x(referred)S 167 x(to)S 166 x(as)S 165 x(XieInit.)S +897 y 4796 X(Note:)S 298 x(InitExtension)S 190 x(and)S 191 x(all)S +190 x(XIE)S 189 x(components)S 191 x(will)S 189 x(be)S 191 x(linked)S +191 x(with)S 190 x(the)S 190 x(CORE)S 189 x(X)S 190 x(in)S 191 x(an)S +190 x(OS)S 597 y 4796 X(dependent)S 166 x(manner)S 167 x(\(see)S +165 x(Chapter)S 166 x(4\).)S 13363 Y 3600 X F28(2.1.1)S 599 x +(XieInit)S 14459 Y 4796 X F151(This)S 171 x(procedure)S 172 x(will)S +171 x(be)S 172 x(called)S 171 x(when)S 172 x(CORE)S 170 x(X)S 171 x +(initializes)S 170 x(or)S 172 x(resets)S 171 x(itself.)S 259 x +(XieInit)S 171 x(will)S 171 x(de\211ne)S 172 x(the)S 598 y 4796 X +(XIE)S 161 x(extension)S 163 x(to)S 163 x(the)S 162 x(CORE)S 161 x +(X)S 162 x(and)S 163 x(will)S 162 x(perform)S 162 x(all)S 163 x +(extension)S 163 x(resource)S 163 x(and)S 163 x(device)S 163 x +(initialization.)S 17448 Y 3600 X F36(2.1.1.1)S 599 x(Making)S 167 x +(XIE)S 167 x(Known)S 166 x(to)S 167 x(the)S 166 x(CORE)S 165 x(X)S +897 y 4796 X F151(XIE)S 169 x(must)S 170 x(make)S 171 x(the)S 171 x +(extension)S 171 x(known)S 172 x(to)S 170 x(the)S 171 x(CORE)S 169 x +(X)S 170 x(so)S 170 x(that)S 171 x(XIE)S 169 x(will)S 170 x(be)S +171 x(able)S 170 x(to)S 171 x(co-exist)S 170 x(with)S 597 y 4796 X +(other)S 159 x(extensions.)S 250 x(This)S 159 x(is)S 159 x(done)S +160 x(by)S 159 x(a)S 159 x(call)S 159 x(to)S 159 x(a)S 160 x(COR)S +-2 x(E)S 159 x(X)S 159 x(routine)S 160 x(-)S 159 x(AddExtension)S +159 x(\(EXTENSIO)S -2 x(N.C\):)S 20138 Y 5692 X(AddExtension)S 166 x +(\(Name,NumEvents,NumErrors,M)S 2 x(ainProc,SwappedMainProc,)S 2 x +(ResetProc\))S 897 y 4796 X(This)S 188 x(routine)S 189 x(returns)S +189 x(a)S 189 x(pointer)S 189 x(to)S 188 x(a)S 188 x(CORE)S 187 x(X)S +189 x(structure)S 189 x(ExtensionEntry)S 189 x(\(see)S 188 x +(Appendix)S 189 x(E\))S 597 y 4796 X(which)S 180 x(de\211nes)S 181 x +(extension)S 180 x(parameters,)S 184 x(including)S 182 x(its)S 179 x +(base)S 180 x(opcode)S 180 x(\(used)S 180 x(by)S 181 x(SendErrorT)S +-45 x(oClient)S 598 y 4796 X(-)S 186 x(see)S 187 x(Section)S 187 x +(2.2.1.1\),)S 193 x(base)S 186 x(and)S 187 x(last)S 187 x(error)S +187 x(codes)S 186 x(and)S 187 x(event)S 188 x(codes.)S 291 x(It)S +186 x(should)S 187 x(be)S 187 x(noted)S 187 x(that)S 598 y 4796 X +(this)S 179 x(structure)S 180 x(also)S 179 x(contains)S 180 x(a)S +180 x(private)S 179 x(pointer)S 180 x(which,)S 184 x(in)S 180 x(the)S +180 x(future,)S 184 x(XIE)S 179 x(can)S 180 x(use)S 179 x(for)S 180 x +(its)S 179 x(own)S 598 y 4796 X(purposes.)S 896 y 4796 X(Name)S 165 x +(is)S 166 x(a)S 166 x(string)S 166 x(indicating)S 167 x(the)S 166 x +(name)S 167 x(of)S 166 x(the)S 166 x(extension)S 167 x +(\("xImageExtension"\).)S 897 y 4796 X(NumEvents)S 166 x(is)S 165 x +(the)S 166 x(number)S 167 x(of)S 166 x(events)S 167 x(de\211ned)S +166 x(by)S 167 x(XIE.)S 165 x(\(3\))S 897 y 4796 X(NumErrors)S 166 x +(is)S 165 x(the)S 166 x(number)S 167 x(of)S 166 x(errors)S 166 x +(de\211ned)S 167 x(by)S 167 x(XIE.)S 165 x(\(0\))S 896 y 4796 X +(MainProc)S 175 x(speci\211es)S 173 x(where)S 174 x(the)S 174 x +(CORE)S 173 x(X)S 173 x(dispatcher)S 174 x(will)S 173 x(call)S 174 x +(when)S 174 x(it)S 174 x(sees)S 173 x(an)S 174 x(XIE)S 173 x +(request.)S 265 x(For)S 598 y 4796 X(this)S 169 x(implementation)S +170 x(this)S 169 x(will)S 169 x(be)S 170 x(named)S 170 x +(XieDispatcher)S -37 x(.)S 257 x(XieDisp)S -2 x(atcher)S 171 x(is)S +169 x(called)S 170 x(with)S 169 x(a)S 170 x(pointer)S 598 y 4796 X +(to)S 165 x(the)S 167 x(client)S 166 x(structure)S 166 x(\(from)S +166 x(the)S 166 x(server)S 167 x(transport\).)S 249 x(See)S 166 x +(Appendix)S 167 x(E.)S 896 y 4796 X(SwappedMainProc)S 171 x(is)S +171 x(called)S 171 x(in)S 171 x(place)S 171 x(of)S 171 x(MainProc)S +172 x(if)S 171 x(the)S 172 x(client')S -19 x(s)S 171 x(byte)S 171 x +(ordering)S 172 x(is)S 171 x(different)S 171 x(from)S 598 y 4796 X +(the)S 172 x(server)S -36 x(.)S 263 x(This)S 172 x(routine)S 174 x +(must)S 172 x(rearrange)S 174 x(the)S 173 x(bytes)S 172 x(in)S 173 x +(place)S 173 x(and)S 172 x(then)S 173 x(act)S 173 x(like)S 173 x +(MainProc.)S 264 x(\(The)S 598 y 4796 X(COR)S -2 x(E)S 172 x(X)S +172 x(modules)S 172 x(SW)S -46 x(APREP)S -65 x(.C,)S 173 x(MISC.H,)S +173 x(DIXUTILS.C)S 171 x(contain)S 173 x(useful)S 173 x(macros)S +172 x(and)S 172 x(procedures)S 598 y 4796 X(for)S 166 x(swapping\).)S +251 x(For)S 168 x(this)S 166 x(implementation)S 167 x(this)S 166 x +(procedure)S 168 x(will)S 166 x(be)S 167 x(called)S 167 x(SwapXieD)S +-2 x(ispatcher)S -37 x(.)S 252 x(This)S 597 y 4796 X(routine)S 166 x +(is)S 166 x(called)S 166 x(with)S 165 x(a)S 166 x(pointer)S 167 x +(to)S 166 x(the)S 166 x(client)S 166 x(structure)S 167 x(\(from)S +165 x(the)S 167 x(server)S 166 x(transport\).)S 35879 Y 21465 X F40 +(DIX/XIE)S 165 x(Component)S 448 x(2\2033)S +PP +EP +%%DOC$Page: 2-4 16 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(ResetProc)S 175 x(is)S 175 x(called)S 176 x(when)S +176 x(the)S 175 x(server)S 177 x(closes)S 175 x(down)S 175 x(\(has)S +176 x(no)S 176 x(more)S 175 x(clients\).)S 269 x(The)S 176 x +(purpose)S 176 x(of)S 175 x(reset)S 598 y 4796 X(is)S 172 x(to)S +172 x(return)S 174 x(the)S 173 x(server)S 173 x(to)S 173 x(the)S +173 x(state)S 172 x(it)S 172 x(was)S 172 x(in)S 173 x(when)S 173 x +(it)S 173 x(started)S 172 x(up.)S 263 x(After)S 173 x(reset,)S 174 x +(the)S 173 x(extension)S 174 x(is)S 597 y 4796 X(no)S 176 x(longer)S +177 x(de\211ned.)S 270 x(For)S 177 x(this)S 176 x(implementation)S +176 x(this)S 175 x(procedure)S 177 x(will)S 176 x(be)S 176 x(named)S +176 x(XieReset.)S 269 x(Speci\211c)S 598 y 4796 X(functionality)S +174 x(is)S 173 x(to)S 173 x(be)S 173 x(determined)S 174 x(later)S +-37 x(,)S 176 x(however)S 174 x(it)S 173 x(is)S 173 x(envisioned)S +174 x(that)S 173 x(for)S 174 x(this)S 173 x(implementation)S 598 y +4796 X(this)S 167 x(routine)S 169 x(may)S 169 x(just)S 168 x +(return.)S 254 x(For)S 169 x(hardware)S 168 x(related)S 168 x +(implementations,)S 169 x(this)S 168 x(routine)S 168 x(will)S 168 x +(provide)S 598 y 4796 X(a)S 166 x(mechanism)S 166 x(in)S 166 x +(getting)S 167 x(the)S 166 x(hardware)S 166 x(to)S 166 x(an)S 166 x +(idle)S 166 x(state.)S 10545 Y 3600 X F36(2.1.1.2)S 599 x +(De\211ning)S 168 x(Errors)S 166 x(and)S 166 x(Events)S 896 y 4796 X +F151(XieInit)S 178 x(must)S 179 x(also)S 179 x(de\211ne)S 180 x(the)S +179 x(XIE)S 178 x(error)S 180 x(and)S 180 x(event)S 180 x(codes)S +179 x(using)S 180 x(the)S 179 x(errorBase)S 179 x(and)S 180 x +(eventBase)S 598 y 4796 X(\211elds,)S 167 x(respectively)S -55 x(,)S +167 x(within)S 167 x(the)S 167 x(ExtensionEntry)S 167 x(structure.)S +251 x(This)S 167 x(is)S 166 x(done)S 167 x(by)S 167 x(adding)S 167 x +(the)S 167 x(XIE)S 166 x(error)S 598 y 4796 X(and)S 166 x(event)S +167 x(constants)S 165 x(\(see)S 166 x(Appendix)S 166 x(C\))S 166 x +(to)S 166 x(the)S 166 x(extension)S 167 x(error)S 166 x(and)S 167 x +(event)S 166 x(base,)S 167 x(respectively)S -55 x(.)S 896 y 4796 X +(For)S 151 x(the)S 151 x(events)S 152 x(XIE)S 150 x(de\211nes,)S +155 x(this)S 151 x(module)S 151 x(must)S 151 x(load)S 151 x(the)S +151 x(CORE)S 149 x(X)S 151 x(vector)S 152 x(table)S 151 x +(EventSwapV)S -47 x(ector[)S 83 x(])S 598 y 4796 X(with)S 175 x(the)S +177 x(XIE)S 175 x(procedure)S 177 x(to)S 176 x(swap)S 176 x(the)S +176 x(event)S 177 x(data.)S 270 x(See)S 176 x(Section)S 177 x +(2.2.2.2.10.)S 2 x(1)S 176 x(for)S 176 x(a)S 177 x(discussion)S 176 x +(on)S 598 y 4796 X(XIE)S 165 x(events.)S 897 y 4796 X(In)S 166 x +(addition,)S 166 x(XieInit)S 165 x(will)S 166 x(de\211ne)S 167 x(a)S +166 x(mask)S 165 x(for)S 167 x(each)S 166 x(XIE)S 165 x(event)S 167 x +(\(see)S 166 x(Section)S 166 x(2.2.2.2.)S 2 x(10.1\).)S 896 y 4796 X +(The)S 166 x(following)S 166 x(are)S 167 x(the)S 166 x(event)S 167 x +(codes)S 166 x(XIE)S 165 x(will)S 165 x(use:)S 897 y 4796 X(\201)S +594 x(XIE_CO)S -2 x(MPUT)S -26 x(A)S -28 x(TION_COMPLETE)S 747 y +4796 X(\201)S 594 x(XIE_NEW_FRA)S -2 x(ME)S 747 y 4796 X(\201)S 594 x +(XIE_SEQ)S -2 x(UENCE_CO)S -2 x(MPLETE)S 20009 Y 4796 X(Currently)S +169 x(there)S 169 x(are)S 169 x(no)S 169 x(XIE)S 168 x(server)S 169 x +(error)S 170 x(codes.)S 254 x(All)S 168 x(errors)S 169 x(that)S 169 x +(the)S 169 x(extension)S 169 x(can)S 169 x(gener)S 2 x(ate)S 168 x +(will)S 598 y 4796 X(use)S 166 x(an)S 166 x(appropriate)S 166 x +(CORE)S 164 x(X)S 166 x(error)S 167 x(code.)S 22998 Y 3600 X F36 +(2.1.1.3)S 599 x(De\211ning)S 168 x(XIE)S 167 x(Resource)S 166 x +(Class)S 166 x(and)S 166 x(T)S -36 x(ypes)S 897 y 4796 X F151 +(XieInit)S 185 x(must)S 186 x(also)S 185 x(de\211ne)S 187 x(an)S +186 x(XIE)S 185 x(resource)S 187 x(class)S 185 x(and)S 187 x(all)S +185 x(the)S 187 x(XIE)S 185 x(resource)S 186 x(types.)S 290 x(T)S +-46 x(o)S 186 x(create)S 597 y 4796 X(an)S 193 x(XIE)S 191 x +(resource)S 194 x(class,)S 199 x(XIE)S 192 x(will)S 191 x(use)S 193 x +(the)S 193 x(CORE)S 191 x(X)S 193 x(procedure)S 193 x(-)S 193 x +(CreateNewRes)S -2 x(ourceClass)S 598 y 4796 X(\(RESO)S -2 x +(URCE.C\))S 897 y 4796 X(CreateNewR)S -2 x(esourceClass)S 180 x +(returns)S 180 x(a)S 180 x(new)S 180 x(class)S 179 x(\(int\))S 180 x +(for)S 180 x(use)S 180 x(in)S 180 x(creating)S 181 x(new)S 180 x +(resources.)S 277 x(This)S 598 y 4796 X(class)S 165 x(will)S 165 x +(be)S 166 x(referred)S 167 x(to)S 166 x(as)S 165 x(RC_Xie.The)S 166 x +(format)S 166 x(of)S 166 x(the)S 166 x(call)S 166 x(is:)S 27780 Y +5692 X(CreateNewResourceClass)S -2 x(\()S 83 x(\))S 897 y 4796 X(T)S +-46 x(o)S 172 x(de\211ne)S 172 x(XIE)S 171 x(resource)S 173 x +(types,)S 173 x(XIE)S 171 x(will)S 171 x(call)S 172 x(the)S 172 x +(CORE)S 170 x(X)S 171 x(procedure)S 173 x(-)S 172 x(CreateNewRes)S +-2 x(ourceT)S -24 x(ype)S 597 y 4796 X(\(RESO)S -2 x(URCE.C\).)S +897 y 4796 X(CreateNewR)S -2 x(esourceT)S -25 x(ype)S 162 x(returns)S +161 x(a)S 161 x(new)S 161 x(resource)S 161 x(type)S 161 x(\(int\))S +161 x(which)S 161 x(is)S 160 x(also)S 161 x(used)S 161 x(in)S 161 x +(other)S 161 x(resource)S 598 y 4796 X(routines.)S 251 x(Each)S 167 x +(XIE)S 166 x(resource)S 167 x(\(IOBs,)S 166 x(IDCs)S 166 x(etc.\))S +251 x(will)S 166 x(be)S 167 x(associated)S 166 x(with)S 166 x(a)S +167 x(type)S 167 x(-)S 167 x(RT_Iob,)S 167 x(RT_Idc)S 598 y 4796 X +(etc..)S 896 y 4796 X(The)S 166 x(format)S 166 x(of)S 166 x(this)S +166 x(call)S 166 x(is:)S 33459 Y 5692 X(CreateNewResourceT)S -26 x +(ype)S 166 x(\()S 83 x(\))S 35879 Y 3600 X F40(2\2034)S 449 x +(DIX/XIE)S 165 x(Component)S +PP +EP +%%DOC$Page: 2-5 17 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(See)S 165 x(Section)S 167 x(2.2.2.2.3)S 167 x +(for)S 167 x(a)S 166 x(description)S 166 x(on)S 166 x(the)S 166 x +(use)S 166 x(of)S 166 x(XIE)S 165 x(resources.)S 7556 Y 3600 X F28 +(2.1.2)S 599 x(XieDevice)S 2 x(Init)S 8652 Y 4796 X F151(This)S 174 x +(procedure)S 176 x(will)S 174 x(initialize)S 173 x(any)S 176 x +(hardware)S 175 x(or)S 174 x(accelerators)S 175 x(the)S 175 x +(extension)S 175 x(may)S 175 x(use)S 175 x(by)S 175 x(calling)S 598 y +4796 X(the)S 167 x(routine)S 168 x(Init_xxx)S 169 x(where)S 168 x +(xxx)S 169 x(is)S 167 x(the)S 167 x(symbol)S 168 x(for)S 167 x(the)S +168 x(particular)S 168 x(accelerator)S -37 x(.)S 253 x(The)S 168 x +(mechanism)S 168 x(to)S 597 y 4796 X(perform)S 166 x(this)S 165 x +(is)S 166 x(addressed)S 165 x(in)S 167 x(Chapter)S 166 x(4.)S 897 y +4796 X(In)S 185 x(addition,)S 190 x(XieDeviceInit)S 184 x(must)S +185 x(load)S 185 x(entries)S 185 x(into)S 185 x(the)S 185 x(XIE/DDX)S +183 x(procedure)S 186 x(vector)S 186 x(table)S 185 x(for)S 598 y +4796 X(those)S 183 x(functions)S 184 x(which)S 184 x(bene\211t)S +184 x(from)S 183 x(accelerators.)S 285 x(As)S 183 x(an)S 184 x +(example,)S 188 x(if)S 184 x(there)S 183 x(is)S 184 x(an)S 183 x +(accelerator)S 597 y 4796 X(which)S 166 x(performs)S 167 x(scale,)S +167 x(XieDeviceInit)S 166 x(must)S 166 x(load)S 167 x(the)S 166 x +(DDX)S 166 x(scale)S 166 x(entry)S 168 x(with)S 166 x(the)S 167 x +(entry)S 167 x(to)S 166 x(the)S 167 x(DDX)S 598 y 4796 X(routine)S +178 x(which)S 178 x(takes)S 177 x(the)S 177 x(same)S 177 x(argumen)S +2 x(ts)S 177 x(as)S 177 x(the)S 177 x(machine)S 178 x(independent)S +179 x(version)S 178 x(and)S 178 x(uses)S 177 x(the)S 598 y 4796 X +(accelerator)S 166 x(to)S 166 x(perform)S 166 x(the)S 166 x(scale.)S +250 x(The)S 166 x(mechanism)S 166 x(to)S 166 x(do)S 166 x(this)S +166 x(will)S 165 x(be)S 166 x(similar)S 166 x(to)S 166 x(the)S 166 x +(above.)S 35879 Y 21465 X F40(DIX/XIE)S 165 x(Component)S 448 x +(2\2035)S +PP +EP +%%DOC$Page: 2-6 18 +1000 BP 39600 30600 PM 0 0 XY +6439 Y 3600 X F28(2.2)S 599 x(DIX/XIE)S 165 x(Request)S 167 x +(Processing)S 7685 Y 4796 X F151(The)S 162 x(DIX)S -2 x(/XIE)S 161 x +(request)S 162 x(procedures)S 162 x(include)S 162 x(the)S 161 x(XIE)S +161 x(dispatcher)S 161 x(and)S 161 x(a)S 162 x(DIX)S 160 x +(procedure)S 162 x(for)S 162 x(each)S 162 x(XIE)S 597 y 4796 X +(protocol)S 166 x(request.)S 249 x(The)S 167 x(latter)S 166 x(is)S +165 x(broken)S 167 x(into)S 166 x(two)S 166 x(processing)S 166 x +(phases:)S 249 x(Phase)S 167 x(I)S 165 x(and)S 167 x(II.)S 10673 Y +3600 X F28(2.2.1)S 599 x(XieDispatc)S 2 x(her)S 11769 Y 4796 X F151 +(XieDis)S -2 x(patcher)S 171 x(is)S 171 x(called)S 170 x(by)S 171 x +(CORE)S 170 x(X)S 170 x(when)S 171 x(its)S 170 x(dispatcher)S 171 x +(recognizes)S 171 x(that)S 171 x(the)S 171 x(client')S -19 x(s)S +170 x(request)S 171 x(is)S 598 y 4796 X(an)S 166 x(XIE)S 165 x +(request.)S 250 x(XieDis)S -2 x(patcher)S 28 x(')S -19 x(s)S 166 x +(responsibilities)S 165 x(are)S 166 x(to:)S 13862 Y 5692 X(o)S 166 x +(Determine)S 166 x(which)S 166 x(function)S 167 x(was)S 166 x +(requested)S 597 y 5692 X(o)S 166 x(Swap)S 166 x(the)S 166 x +(function)S 167 x(request)S 166 x(if)S 166 x(necessary)S 598 y 5692 X +(o)S 166 x(V)S -46 x(ector)S 166 x(to)S 166 x(the)S 166 x +(appropriate)S 166 x(DIX)S 165 x(Phase)S 167 x(I)S 165 x(processing)S +167 x(procedure)S 897 y 4796 X(COR)S -2 x(E)S 183 x(X)S 183 x(calls)S +183 x(XieDispatcher)S 183 x(with)S 183 x(a)S 183 x(pointer)S 183 x +(to)S 184 x(the)S 183 x(client)S 184 x(structure)S 183 x(\(see)S +183 x(Appendix)S 184 x(E\).)S 183 x(This)S 597 y 4796 X(structure)S +188 x(represents)S 187 x(the)S 188 x(context)S 188 x(of)S 188 x(the)S +188 x(client)S 187 x(request)S 188 x(and)S 188 x(is)S 187 x(used)S +188 x(by)S 188 x(the)S 187 x(CORE)S 187 x(X)S 187 x(for)S 188 x(its)S +598 y 4796 X(wire)S 178 x(transport.)S 275 x(This)S 179 x(structure)S +180 x(is)S 178 x(used)S 179 x(for)S 179 x(any)S 180 x(subsequent)S +179 x(communication)S 180 x(to)S 179 x(the)S 179 x(client)S 179 x +(and)S 598 y 4796 X(thus)S 182 x(must)S 181 x(be)S 182 x(passed)S +181 x(along)S 183 x(to)S 182 x(lower)S 182 x(levels)S 182 x(if)S +182 x(the)S 182 x(lower)S 182 x(levels)S 182 x(are)S 182 x(to)S 182 x +(communicate)S 182 x(with)S 182 x(the)S 598 y 4796 X(client)S 181 x +(\(macros)S 182 x(and)S 182 x(routines)S 182 x(such)S 182 x(as)S +182 x(SendErrorT)S -45 x(oClient,)S 186 x(WRITE_R)S -2 x(EPL)S -45 x +(Y_TO_CLIENT)S 181 x(and)S 597 y 4796 X(W)S -28 x(riteT)S -46 x +(oClient)S 166 x(use)S 166 x(a)S 166 x(pointer)S 166 x(to)S 166 x +(this)S 166 x(structure)S 166 x(as)S 166 x(one)S 166 x(of)S 166 x +(its)S 166 x(arguments\).)S 897 y 4796 X(XieDis)S -2 x(patcher)S +28 x(')S -19 x(s)S 172 x(\211rst)S 172 x(job)S 173 x(is)S 171 x(to)S +172 x(determine)S 172 x(the)S 173 x(XIE)S 171 x(function)S 173 x +(requested.)S 262 x(This)S 172 x(is)S 171 x(accomplished)S 172 x(by)S +598 y 4796 X(using)S 177 x(a)S 176 x(CORE)S 175 x(X)S 177 x(macro)S +176 x(-)S 177 x(REQUE)S -2 x(ST)S 177 x(\(see)S 176 x(Section)S 177 x +(F)S -55 x(.1\).)S 270 x(REQUEST)S 176 x(is)S 176 x(called)S 176 x +(with)S 176 x(a)S 177 x(structure)S 598 y 4796 X(xieReq)S 168 x +(that)S 167 x(exists)S 168 x(in)S 168 x(a)S 168 x(XIE)S 167 x +(include)S 169 x(\211le)S 168 x(XIEPROTO.H.)S 167 x(This)S 169 x +(structure)S 168 x(represents)S 168 x(the)S 168 x(header)S 169 x(of)S +597 y 4796 X(all)S 165 x(XIE)S 165 x(requests.)S 250 x(See)S 166 x +(Appendix)S 166 x(C)S 166 x(for)S 166 x(a)S 166 x(list)S 165 x(of)S +166 x(this)S 166 x(and)S 166 x(other)S 166 x(request)S 166 x +(structures.)S 897 y 4796 X(The)S 189 x(REQUEST)S 188 x(macro)S 190 x +(de)S +(\211nes)S 189 x(a)S 189 x(record)S 190 x(called)S 189 x("stuff")S +189 x(which)S 189 x(is)S 189 x(of)S 189 x(type)S 190 x(xieReq,)S +195 x(and)S 190 x(which)S 598 y 4796 X(is)S 186 x(bound)S 187 x(to)S +187 x(the)S 187 x(request)S 186 x(buffer)S -36 x(.)S 291 x(XieDisp)S +-2 x(atcher)S 188 x(initiates)S 186 x(the)S 187 x(appropriate)S 186 x +(DIX/XIE)S 185 x(Request)S 598 y 4796 X(Processing)S 199 x(function)S +199 x(by)S 199 x(case)S 198 x(switching)S 199 x(on)S 199 x(the)S +198 x(opcode)S 199 x(represented)S 199 x(in)S 198 x(stuff->data.)S +314 x(This)S 597 y 4796 X(represents)S 192 x(the)S 193 x(XIE)S 192 x +(request)S 192 x(code.)S 304 x(\(Note:)S 302 x(For)S 193 x(XIE)S +192 x(de\211ned)S 194 x(structures)S 192 x(this)S 193 x(\211eld)S +193 x(is)S 192 x(repre-)S 598 y 4796 X(sented)S 186 x(by)S 186 x +(stuff->opcode.\))S 290 x(If)S 186 x(XieDispat)S -2 x(cher)S 187 x +(does)S 187 x(not)S 186 x(recognize)S 187 x(the)S 187 x(requested)S +186 x(opcode,)S 192 x(then)S 598 y 4796 X(a)S 188 x(call)S 188 x(to)S +187 x(SendErrorT)S -45 x(oClient)S 188 x(is)S 188 x(made)S 188 x +(with)S 187 x(a)S 188 x(CORE)S 187 x(X)S 188 x(error)S 188 x(code)S +189 x(-)S 188 x(BadRequest)S 187 x(and)S 188 x(a)S 188 x("re-)S 598 y +4796 X(turn\(BadRequest\)")S 165 x(is)S 165 x(made.)S 896 y 4796 X +(XieDis)S -2 x(patcher)S 171 x(returns)S 171 x(success)S 170 x(or)S +171 x(failure)S 171 x(to)S 170 x(the)S 170 x(CORE)S 169 x(X.)S 171 x +(It)S 170 x(is)S 170 x(expected)S 171 x(that)S 170 x(any)S 171 x +(errors)S 171 x(gener-)S 598 y 4796 X(ated)S 169 x(by)S 170 x(lower)S +169 x(level)S 170 x(routines)S 170 x(will)S 169 x(use)S 169 x +(SendErrorT)S -45 x(oClient)S 170 x(and)S 169 x(return)S 171 x(the)S +170 x(error)S 170 x(code)S 170 x(back)S 170 x(to)S 169 x(the)S 598 y +4796 X(dispatcher)S 165 x(so)S 166 x(that)S 166 x(it)S 166 x(can,)S +167 x(in)S 166 x(turn,)S 167 x(return)S 167 x(the)S 166 x(error)S +167 x(code)S 166 x(back)S 167 x(to)S 166 x(CORE)S 164 x(X.)S 35879 Y +3600 X F40(2\2036)S 449 x(DIX/XIE)S 165 x(Component)S +PP +EP +%%DOC$Page: 2-7 19 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 3600 X F36(2.2.1.1)S 599 x(Error)S 166 x(Noti\211cation)S +168 x(to)S 166 x(Client)S 896 y 4796 X F151(If)S 168 x(an)S 169 x +(error)S 170 x(is)S 168 x(detected)S 169 x(anytime)S 169 x(during)S +171 x(the)S 169 x(dispatcher)S 169 x(or)S 169 x(the)S 169 x(DIX)S +168 x(processing)S 169 x(phases,)S 170 x(XIE)S 168 x(must)S 598 y +4796 X(notify)S 184 x(the)S 183 x(client)S 184 x(via)S 184 x(a)S +184 x(COR)S -2 x(E)S 184 x(X)S 183 x(routine,)S 189 x(SendErrorT)S +-45 x(oClient)S 183 x(\(EXTENSIO)S -2 x(N.C\),)S 185 x(and)S 183 x +(make)S 184 x(a)S 598 y 4796 X("return\(errorcode\)")S 167 x(back)S +166 x(to)S 166 x(the)S 166 x(XIE)S 165 x(dispatcher)S -37 x(.)S 896 y +4796 X(NOTE:)S 167 x(When)S 168 x(we)S 167 x(state)S 166 x(that)S +168 x(the)S 167 x(error)S 168 x(must)S 168 x(be)S 167 x(reported,)S +168 x(it)S 168 x(is)S 167 x(implied)S 166 x(that)S 168 x(a)S 167 x +(SendErrorT)S -45 x(oClient)S 598 y 4796 X(and)S 166 x(a)S 166 x +("return)S 166 x(\(errorcode\)")S 167 x(is)S 165 x(made.)S 897 y +4796 X(SendErrorT)S -46 x(oClient)S 166 x(routine)S 167 x(has)S 166 x +(the)S 166 x(following)S 166 x(format:)S 10849 Y 5692 X(SendErrorT)S +-45 x(oClient)S 166 x(\(client,reqCode,minorCode,ResourceID,err)S +2 x(orcode\))S 12344 Y 4796 X(Client)S 154 x(is)S 154 x(the)S 155 x +(client)S 154 x(structure)S 156 x(passed)S 153 x(to)S 155 x(the)S +154 x(extension)S 156 x(with)S 154 x(the)S 155 x(request;)S 159 x +(reqCode)S 154 x(is)S 154 x(the)S 155 x(base)S 154 x(\211eld)S 597 y +4796 X(of)S 170 x(the)S 171 x(ExtensionEntry)S 171 x(structure)S +171 x(returned)S 172 x(by)S 171 x(AddExtension)S 170 x(performed)S +171 x(during)S 172 x(initialization)S 170 x(in)S 598 y 4796 X(the)S +167 x(XieInit)S 166 x(component;)S 169 x(minorCode)S 167 x(is)S 167 x +(the)S 167 x(extension)S 168 x(request)S 167 x(opcode)S 167 x +(\(stuff->opcode\);)S 168 x(errorcode)S 167 x(is)S 598 y 4796 X(one)S +170 x(of)S 171 x(the)S 170 x(error)S 171 x(codes)S 171 x(assigned)S +170 x(to)S 170 x(the)S 171 x(calling)S 171 x(extension)S 171 x(or)S +171 x(a)S 170 x(CORE)S 169 x(X)S 170 x(error;)S 174 x(and)S 171 x +(resourceID)S 170 x(is)S 598 y 4796 X(a)S 162 x(parameter)S 162 x +(that)S 162 x(the)S 163 x(extension)S 163 x(may)S 163 x(use)S 162 x +(to)S 163 x(return)S 163 x(a)S 162 x(resourceID)S 163 x(that)S 162 x +(is)S 162 x(involved)S 163 x(in)S 163 x(the)S 163 x(error)S -37 x(.)S +250 x(If)S 598 y 4796 X(none)S 166 x(is)S 166 x(involved,)S 168 x +(the)S 166 x(routine)S 167 x(should)S 166 x(pass)S 165 x(NONE)S 165 x +(de)S +(\211ned)S 167 x(in)S 166 x(the)S 167 x(COR)S -2 x(E)S 166 x(X)S +166 x(include)S 167 x(\211le)S 166 x(-)S 166 x(X.h.)S 17724 Y 3600 X +F36(2.2.1.2)S 599 x(Swapping)S 168 x(Requests)S 896 y 4796 X F151 +(If)S 187 x(the)S 189 x(byte)S 188 x(order)S 189 x(on)S 189 x(the)S +188 x(server)S 189 x(is)S 187 x(different)S 189 x(than)S 188 x(the)S +189 x(client,)S 194 x(the)S 189 x(COR)S -2 x(E)S 188 x(X,)S 189 x +(upon)S 189 x(seeing)S 188 x(an)S 598 y 4796 X(XIE)S 174 x(request,)S +178 x(will)S 174 x(call)S 175 x(SwapXieDis)S -2 x(patcher)S -36 x(.)S +268 x(This)S 175 x(routine)S 176 x(will)S 174 x(be)S 175 x +(responsible)S 175 x(for)S 175 x(swapping)S 175 x(the)S 598 y 4796 X +(request)S 163 x(\(in)S 164 x(place\))S 163 x(and)S 164 x(then)S +164 x(performing)S 164 x(the)S 164 x(same)S 163 x(tasks)S 163 x(as)S +163 x(XieDispat)S -2 x(cher)S -36 x(.)S 250 x(T)S -46 x(o)S 164 x +(ease)S 163 x(the)S 164 x(swapping)S 597 y 4796 X(task,)S 177 x +(several)S 175 x(requests)S 175 x(have)S 176 x(pads)S 175 x(within)S +174 x(their)S 176 x(request)S 175 x(structure.)S 268 x(This)S 175 x +(is)S 175 x(to)S 174 x(preven)S 2 x(t)S 174 x(having)S 177 x(a)S +598 y 4796 X(word)S 165 x(in)S 167 x(the)S 166 x(middle)S 165 x(of)S +166 x(a)S 166 x(longword.)S 35879 Y 21465 X F40(DIX/XIE)S 165 x +(Component)S 448 x(2\2037)S +PP +EP +%%DOC$Page: 2-8 20 +1000 BP 39600 30600 PM 0 0 XY +6290 Y 3600 X F28(2.2.2)S 599 x(DIX)S 166 x(Request)S 167 x +(Procedures)S 7386 Y 4796 X F151(There)S 181 x(exist)S 180 x(two)S +179 x(phases)S 180 x(of)S 180 x(DIX)S 180 x(request)S 180 x +(processing.)S 278 x(The)S 181 x(\211rst)S 180 x(phase)S 181 x(does)S +180 x(the)S 180 x(request)S 180 x(length)S 598 y 4796 X(checking)S +171 x(while)S 168 x(the)S 170 x(second)S 169 x(phase)S 169 x +(manages)S 170 x(the)S 169 x(XIE)S 168 x(resources,)S 171 x(checks)S +170 x(for)S 169 x(valid)S 169 x(argumen)S 2 x(ts,)S 169 x(and)S 597 y +4796 X(prepares)S 165 x(data)S 166 x(for)S 166 x(DDX)S 165 x +(processing.)S 10972 Y 3600 X F36(2.2.2.1)S 599 x(Processing)S 168 x +(of)S 166 x(Requests)S 166 x(-)S 166 x(Phase)S 166 x(I)S 897 y 4796 X +F151(Phase)S 172 x(I)S 172 x(request)S 173 x(processing)S 172 x +(entails)S 172 x(check)S 2 x(ing)S 173 x(the)S 172 x(request)S 173 x +(length.)S 263 x(This)S 172 x(is)S 172 x(facilitated)S 172 x(by)S +173 x(the)S 172 x(use)S 598 y 4796 X(of)S 165 x(the)S 167 x +(following)S 166 x(CORE)S 164 x(X)S 166 x(macros)S 166 x(\(see)S +166 x(Section)S 166 x(F)S -55 x(.1\):)S 13662 Y 5692 X(o)S 166 x +(REQUEST)S 598 y 5692 X(o)S 166 x(REQUEST_SI)S -2 x(ZE_MA)S -27 x +(TCH)S 598 y 5692 X(o)S 166 x(REQUEST_A)S -29 x(T_LEAST_SIZE)S 16352 Y +4796 X(REQ)S -2 x(UEST)S 167 x(is)S 167 x(called)S 168 x(with)S 166 x +(the)S 168 x(structure)S 168 x(of)S 167 x(the)S 168 x(particular)S +167 x(request.)S 252 x(This)S 168 x(implies)S 166 x(that)S 168 x(a)S +167 x(structure)S 598 y 4796 X(exist)S 179 x(for)S 181 x(each)S 180 x +(of)S 180 x(the)S 180 x(XIE)S 179 x(protocol)S 181 x(requests)S 179 x +(\(see)S 180 x(Appendix)S 180 x(C\).)S 180 x(Calling)S 180 x(this)S +180 x(macro)S 180 x(allows)S 179 x(the)S 598 y 4796 X(extension)S +176 x(to)S 176 x(verify)S 177 x(the)S 176 x(length)S 176 x(of)S 176 x +(the)S 176 x(request)S 176 x(via)S 176 x(another)S 177 x(CORE)S 174 x +(X)S 176 x(macro:)S 269 x(REQUES)S -2 x(T_SIZE_)S 597 y 4796 X(MA)S +-28 x(TCH.)S 168 x(This)S 168 x(macro)S 168 x(makes)S 168 x(sure)S +168 x(that)S 168 x(the)S 168 x(request)S 167 x(in)S 168 x("stuff")S +167 x(is)S 168 x(the)S 168 x(right)S 168 x(size)S 167 x(for)S 168 x +(this)S 168 x(particular)S 598 y 4796 X(request.)S 249 x(It)S 166 x +(will)S 165 x(return)S 167 x(BadLength)S 167 x(\(back)S 166 x(to)S +166 x(CORE)S 165 x(X\))S 165 x(if)S 166 x(the)S 166 x(size)S 165 x +(is)S 166 x(incorrect.)S 897 y 4796 X(REQ)S -2 x(UEST_A)S -28 x +(T_LEAST_SIZE)S 177 x(is)S 177 x(the)S 178 x(same)S 176 x(as)S 177 x +(REQUEST_SI)S -2 x(ZE_MA)S -27 x(TCH)S 177 x(except)S 178 x(it)S +177 x(is)S 177 x(used)S 177 x(for)S 598 y 4796 X(variable)S 187 x +(length)S 188 x(requests.)S 290 x(It)S 187 x(checks)S 187 x(to)S +187 x(make)S 187 x(sure)S 187 x(that)S 187 x(the)S 187 x(request)S +187 x(is)S 186 x(no)S 188 x(shorter)S 187 x(than)S 187 x(the)S 597 y +4796 X(minimum)S 166 x(size.)S 248 x(It)S 166 x(returns)S 166 x +(BadLength)S 167 x(if)S 166 x(the)S 166 x(size)S 166 x(is)S 165 x +(invalid.)S 250 x(See)S 166 x(next)S 167 x(section.)S 897 y 4796 X +(If)S 168 x(no)S 169 x(errors)S 169 x(exist)S 168 x(during)S 170 x +(request)S 169 x(matching,)S 170 x(then)S 169 x(this)S 169 x +(component)S 169 x(will)S 168 x(initiate)S 168 x(the)S 169 x(second)S +169 x(phase)S 598 y 4796 X(of)S 165 x(DIX)S 165 x(request)S 167 x +(processing.)S 250 x(See)S 166 x(Section)S 166 x(2.2.2.2.)S 24721 Y +3600 X F36(2.2.2.1.)S 2 x(1)S 597 x(V)S -27 x(ariable)S 167 x +(Length)S 168 x(Requests)S 896 y 4796 X F151(REQ)S -2 x(UEST_A)S +-28 x(T_LEAST_SIZE)S 177 x(is)S 176 x(used)S 177 x(by)S 177 x +(requests)S 176 x(such)S 178 x(as)S 176 x(XIEP_PUT_TILE)S 177 x +(which)S 177 x(will)S 176 x(have)S 598 y 4796 X(a)S 174 x(variable)S +175 x(length)S 176 x(request)S 174 x(size)S 174 x(due)S 175 x(to)S +175 x(the)S 174 x(tile)S 175 x(dimensions.)S 266 x(In)S 175 x(this)S +174 x(case)S 174 x(the)S 175 x(\211rst)S 175 x(phase)S 174 x(of)S +175 x(DIX)S 598 y 4796 X(processing)S 172 x(check)S 2 x(s)S 172 x +(the)S 172 x(minimum)S 173 x(size)S 172 x(allowed)S 172 x(and)S 172 x +(passes)S 172 x(the)S 172 x(responsibility)S 173 x(of)S 172 x +(absolute)S 172 x(length)S 598 y 4796 X(checking)S 184 x(to)S 183 x +(the)S 183 x(second)S 183 x(phase)S 183 x(of)S 183 x(DIX)S 181 x +(request)S 183 x(processing.)S 284 x(The)S 183 x(second)S 183 x +(phase)S 183 x(will)S 182 x(then)S 184 x(read)S 597 y 4796 X(the)S +178 x(request)S 179 x(length)S 179 x(and)S 179 x(the)S 178 x +(dimension)S 179 x(arguments)S 179 x(and)S 179 x(verify)S 179 x +(that)S 178 x(they)S 180 x(agree.)S 275 x(If)S 178 x(not,)S 182 x +(then)S 179 x(a)S 598 y 4796 X("BadLength")S 177 x(error)S 178 x(is)S +177 x(reported.)S 273 x(Return)S 178 x(is)S 177 x(back)S 178 x(to)S +177 x(the)S 178 x(\211rst)S 177 x(phase)S 177 x(which,)S 182 x(in)S +177 x(turn,)S 182 x(will)S 176 x(return)S 598 y 4796 X(back)S 166 x +(to)S 166 x(the)S 166 x(XIE)S 165 x(dispatcher)S -37 x(.)S 35879 Y +3600 X F40(2\2038)S 449 x(DIX/XIE)S 165 x(Component)S +PP +EP +%%DOC$Page: 2-9 21 +1000 BP 39600 30600 PM 0 0 XY +5155 Y 3600 X F36(2.2.2.2)S 599 x(Processing)S 168 x(of)S 166 x +(Requests)S 166 x(-)S 166 x(Phase)S 166 x(II)S 897 y 4796 X F151 +(Depending)S 189 x(on)S 190 x(the)S 189 x(request,)S 195 x(the)S +189 x(Phase)S 190 x(II)S 188 x(processing)S 190 x(logic)S 189 x(may)S +189 x(be)S 190 x(inline)S 189 x(with)S 189 x(the)S 189 x(Phase)S +189 x(I)S 598 y 4796 X(processing)S 153 x(code)S 154 x(\(the)S 153 x +(length)S 154 x(check)S 155 x(code\))S 153 x(or)S 154 x(may)S 153 x +(initiate)S 153 x(calls)S 153 x(to)S 153 x(subroutines.)S 250 x(For)S +154 x(the)S 153 x(latter)S 153 x(case,)S 597 y 4796 X(the)S 178 x +(procedures)S 180 x(may)S 179 x(reside)S 178 x(in)S 179 x(module)S +179 x(XIE_UTILS.C)S 178 x(\(see)S 178 x(Appendix)S 179 x(B\).)S 179 x +(For)S 179 x(simple)S 178 x(requests,)S 598 y 4796 X(such)S 167 x +(as)S 166 x(resource)S 168 x(create,)S 168 x(they)S 167 x(can)S 167 x +(be)S 167 x(inline)S 168 x(with)S 166 x(the)S 167 x(Phase)S 167 x(I)S +167 x(code,)S 167 x(while)S 167 x(for)S 167 x(more)S 167 x(complex)S +167 x(calls)S 598 y 4796 X(it)S 179 x(may)S 179 x(be)S 180 x(better)S +179 x(to)S 179 x(have)S 181 x(a)S 179 x(separate)S 179 x +(subroutine.)S 277 x(This)S 180 x(phase)S 179 x(is)S 179 x +(responsible)S 179 x(for)S 180 x(the)S 179 x(following)S 598 y 4796 X +(functions:)S 10236 Y 5692 X(o)S 166 x(Organization)S 166 x(and)S +167 x(sending)S 166 x(of)S 166 x(client)S 167 x(replies.)S 598 y +5692 X(o)S 166 x(Establishment)S 165 x(of)S 166 x(context)S 167 x +(for)S 166 x(an)S 166 x(XIE)S 165 x(client/serve)S 2 x(r)S 166 x +(session.)S 598 y 5692 X(o)S 166 x(Resource)S 166 x(creation,)S 167 x +(validation,)S 167 x(deletion)S 166 x(,)S 167 x(modi\211cation)S +166 x(and)S 166 x(inquisition.)S 597 y 5692 X(o)S 179 x(Preparation)S +179 x(of)S 179 x(services,)S 182 x(data)S 179 x(and/or)S 179 x +(resources)S 180 x(for)S 178 x(input)S 179 x(into)S 179 x(the)S 179 x +(CORE)S 177 x(X)S 179 x(or)S 179 x(the)S 179 x(DDX)S 598 y 5692 X +(layer)S -36 x(.)S 598 y 5692 X(o)S 166 x(Organization)S 166 x(and)S +167 x(sending)S 166 x(of)S 166 x(events.)S 897 y 4796 X(For)S 164 x +(DIX/DD)S -2 x(X)S 164 x(related)S 163 x(tasks)S 163 x(this)S 164 x +(phase)S 163 x(may)S 164 x(represent)S 164 x(a)S 164 x(functional)S +164 x(subset)S 164 x(of)S 163 x(high)S 165 x(level)S 164 x(routines)S +597 y 4796 X(which)S 172 x(interface)S 173 x(to)S 173 x(an)S 173 x +(image)S 173 x(processing)S 173 x(library)S -55 x(.)S 262 x(Such)S +174 x(routines)S 173 x(may)S 172 x(in)S 173 x(turn)S 174 x(call)S +172 x(a)S 173 x(set)S 172 x(of)S 172 x(lower)S 598 y 4796 X(level)S +166 x(image)S 166 x(processing)S 167 x(algorithms)S 166 x(within)S +166 x(the)S 166 x(DDX)S 165 x(layer)S -36 x(.)S 897 y 4796 X +(Depending)S 177 x(on)S 177 x(the)S 176 x(request,)S 180 x(this)S +176 x(phase)S 177 x(of)S 176 x(processing)S 177 x(may)S 177 x(not)S +177 x(need)S 177 x(procedures)S 177 x(from)S 177 x(the)S 176 x(DDX)S +597 y 4796 X(component.)S 250 x(In)S 167 x(this)S 166 x(case)S 166 x +(we)S 166 x(say)S 166 x(that)S 166 x(the)S 167 x(processing)S 167 x +(mode)S 166 x(for)S 166 x(this)S 166 x(request)S 167 x(is)S 166 x(a)S +166 x(DIX)S 165 x(only)S 168 x(type)S 166 x(of)S 598 y 4796 X +(process.)S 258 x(If)S 171 x(DIX/XIE)S 169 x(calls)S 170 x +(procedures)S 172 x(in)S 171 x(the)S 171 x(DDX)S 169 x(component)S +172 x(we)S 170 x(say)S 171 x(that)S 171 x(the)S 171 x(processing)S +171 x(mode)S 598 y 4796 X(of)S 165 x(the)S 167 x(request)S 166 x(is)S +165 x(a)S 166 x(DIX/DDX)S 165 x(type)S 166 x(of)S 166 x(process.)S +20398 Y 3600 X F36(2.2.2.2.)S 2 x(1)S 597 x(XIE)S 168 x(Replies)S +897 y 4796 X F151(There)S 177 x(exist)S 176 x(several)S 177 x(XIE)S +175 x(requests)S 176 x(which)S 177 x(will)S 176 x(generate)S 177 x +(replies)S 176 x(to)S 177 x(the)S 176 x(client.)S 271 x(The)S 177 x +(XIE)S 175 x(macro)S 177 x(-)S 597 y 4796 X(WRITE)S -2 x(_REPL)S +-45 x(Y_TO_CLIE)S -2 x(NT)S 174 x(\(see)S 174 x(Section)S 174 x(F)S +-55 x(.2\))S 174 x(is)S 173 x(used)S 174 x(to)S 174 x(send)S 173 x +(replies)S 174 x(back)S 174 x(to)S 174 x(the)S 174 x(requesting)S +598 y 4796 X(client.)S 249 x(The)S 167 x(format)S 166 x(of)S 166 x +(the)S 166 x(macro)S 166 x(is:)S 23686 Y 5692 X(WRITE_RE)S -2 x(PL)S +-45 x(Y_TO_CLIENT)S 165 x(\(client,)S 167 x(length,)S 167 x(buf\))S +25180 Y 4796 X(Client)S 173 x(is)S 174 x(the)S 174 x(client)S 175 x +(structure;)S 179 x(length)S 175 x(is)S 174 x(the)S 174 x(length)S +175 x(of)S 174 x(the)S 175 x(reply)S 174 x(in)S 175 x(bytes;)S 178 x +(and)S 175 x(buf)S 174 x(contains)S 174 x(the)S 598 y 4796 X(reply)S +-55 x(.)S 249 x(This)S 161 x(macro)S 161 x(will)S 161 x(call)S 160 x +(the)S 161 x(reply)S 162 x(swap)S 160 x(routine)S 161 x(for)S 161 x +(this)S 161 x(request)S 161 x(\(based)S 160 x(on)S 161 x(the)S 161 x +(request)S 161 x(opcode)S 598 y 4796 X(represented)S 168 x(by)S 169 x +(stuff->opcode)S +(\))S 167 x(using)S 169 x(XieReplySwapV)S -47 x(ector)S 168 x(table)S +168 x(if)S 168 x(swapping)S 168 x(is)S 168 x(necessary)S 169 x +(\(i.e.)S 254 x(if)S 597 y 4796 X(client->swapp)S -2 x(ed)S 166 x(=)S +83 x(=)S 166 x(TRUE\).)S 897 y 4796 X(XieReplySwap)S -2 x(V)S -46 x +(ector)S 177 x(table)S 176 x(consists)S 175 x(of)S 177 x(addresses)S +175 x(of)S 176 x(procedures)S 177 x(which)S 177 x(swap)S 176 x +(replies.)S 269 x(For)S 177 x(each)S 598 y 4796 X(request,)S 170 x +(there)S 169 x(is)S 168 x(a)S 169 x(location)S 169 x(within)S 169 x +(this)S 168 x(table.)S 255 x(Each)S 169 x(entry/)S 2 x(request)S +169 x(in)S 169 x(this)S 168 x(table)S 169 x(will)S 168 x(either)S +169 x(have)S 598 y 4796 X(a)S 170 x("NotImplemented")S 169 x +(procedure)S 172 x(which)S 171 x(will)S 170 x(return)S 171 x(an)S +171 x(error)S 171 x(\(indicating)S 171 x(that)S 171 x(the)S 170 x +(request)S 171 x(has)S 170 x(no)S 597 y 4796 X(replies\))S 165 x(or)S +166 x(an)S 167 x(address)S 165 x(of)S 166 x(the)S 166 x(reply)S 167 x +(swap)S 165 x(procedure.)S 897 y 4796 X(The)S 185 x(format)S 185 x +(of)S 185 x(the)S 186 x(reply)S 185 x(must)S 185 x(match)S 185 x +(the)S 186 x(protocol)S 185 x(and)S 185 x(is)S 185 x(32)S 185 x +(bytes)S 185 x(long.)S 289 x(Each)S 185 x(XIE)S 184 x(request)S 598 y +4796 X(that)S 186 x(generates)S 186 x(a)S 187 x(reply)S 186 x(will)S +186 x(have)S 187 x(a)S 186 x(corresponding)S 188 x(structure,)S 192 x +(so)S 186 x(length)S 187 x(will)S 186 x(be)S 186 x(speci\211ed)S +186 x(by)S 597 y 4796 X(sizeof\(xReplyForThisRequest\).)S 249 x(See)S +166 x(Appendix)S 166 x(C.)S 897 y 4796 X(There)S 182 x(are)S 181 x +(several)S 182 x(replies)S 181 x(which)S 181 x(have)S 182 x(pads)S +181 x(within)S 181 x(their)S 182 x(reply)S 181 x(structure.)S 281 x +(This)S 181 x(is)S 181 x(to)S 181 x(prevent)S 598 y 4796 X(having)S +167 x(a)S 166 x(word)S 166 x(in)S 166 x(the)S 166 x(middle)S 166 x +(of)S 166 x(a)S 166 x(longword)S 167 x(thus)S 166 x(making)S 167 x +(the)S 166 x(swapping)S 166 x(tasks)S 165 x(easier)S -37 x(.)S 35879 Y +21465 X F40(DIX/XIE)S 165 x(Component)S 448 x(2\2039)S +PP +EP +%%DOC$Page: 2-10 22 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(For)S 188 x(replies)S 187 x(of)S 187 x(length)S +189 x(greater)S 188 x(than)S 188 x(32)S 188 x(bytes,)S 193 x(XIE,)S +187 x(in)S 188 x(addition)S 188 x(to)S 187 x(calls)S 187 x(to)S 188 x +(WRITE_R)S -2 x(EPL)S -45 x(Y_)S 598 y 4796 X(TO_CLIENT)S -47 x(,)S +180 x(will)S 178 x(call)S 179 x(the)S 179 x(CORE)S 178 x(X)S 178 x +(routine)S 180 x(-)S 179 x(W)S -28 x(riteT)S -45 x(oClient)S 178 x +(\(see)S 179 x(Section)S 179 x(2.2.2.)S 2 x(2.5.4\).)S 276 x(XIE)S +178 x(is)S 597 y 4796 X(responsible)S 174 x(for)S 174 x(byte)S 175 x +(swapping)S 174 x(in)S 175 x(the)S 174 x(latter)S 175 x(case.)S 266 x +(T)S -46 x(o)S 175 x(accomplish)S 174 x(this,)S 177 x(XIE)S 173 x +(must)S 174 x(\211rst)S 175 x(load)S 174 x(the)S 598 y 4796 X +(client)S 169 x(structure)S 170 x(\211eld,)S 171 x(client->pSwapR)S +-2 x(eplyFu)S 2 x(nc,)S 171 x(with)S 169 x(the)S 169 x(address)S +169 x(of)S 169 x(a)S 169 x(function)S 170 x(that)S 170 x(swaps)S +168 x(and)S 598 y 4796 X(writes)S 179 x(to)S 181 x(the)S 181 x +(client)S 180 x(\(via)S 181 x(W)S -27 x(riteT)S -46 x(oClient\))S +180 x(and)S 181 x(then)S 181 x(use)S 181 x(the)S 181 x(XIE)S 179 x +(macro)S 181 x(-)S 181 x(WRITE_SW)S -47 x(APPED_)S 598 y 4796 X(DA)S +-29 x(T)S -27 x(A_TO_CLIENT)S -28 x(:)S 9349 Y 5692 X(WRITE_SW)S +-47 x(APPED_DA)S -29 x(T)S -27 x(A_TO_CLIENT)S 165 x(\(client,)S +167 x(length,)S 167 x(pBuf\))S 897 y 4796 X(Client)S 174 x(is)S 173 x +(the)S 175 x(client)S 174 x(structure,)S 178 x(length)S 175 x(is)S +174 x(the)S 174 x(length)S 176 x(in)S 174 x(longwords,)S 177 x(and)S +175 x(pBuf)S 174 x(is)S 174 x(a)S 174 x(pointer)S 175 x(to)S 174 x +(the)S 598 y 4796 X(reply)S -55 x(.)S 255 x(This)S 170 x(macro)S +169 x(will)S 168 x(check)S 170 x(the)S 169 x(client)S 170 x +(structure)S 169 x(\211eld,)S 171 x(client->swapped,)S 169 x(for)S +169 x(true,)S 171 x(and)S 169 x(if)S 169 x(so)S 168 x(will)S 597 y +4796 X(call)S 175 x(the)S 175 x(function)S 176 x(speci\211ed)S 175 x +(by)S 176 x(client->pSwapR)S -2 x(eplyFun)S 2 x(c)S 175 x(else)S +175 x(it)S 175 x(will)S 174 x(just)S 175 x(write)S 175 x(to)S 175 x +(the)S 175 x(client)S 175 x(via)S 598 y 4796 X(W)S -28 x(riteT)S +-46 x(oClient)S 166 x(\(see)S 166 x(Section)S 166 x(F)S -55 x(.2\).)S +897 y 4796 X(Note:)S 284 x(There)S 184 x(exists)S 183 x(swap)S 182 x +(utilities)S 183 x(within)S 183 x(CORE)S 182 x(X)S 183 x(and)S 183 x +(is)S 183 x(expected)S 184 x(that)S 183 x(XIE)S 182 x(will)S 183 x +(use)S 183 x(these)S 597 y 4796 X(utilities.)S 248 x(These)S 167 x +(reside)S 166 x(in)S 166 x(the)S 166 x(CORE)S 165 x(X)S 165 x +(modules)S 166 x(SW)S -46 x(APREQ,)S 165 x(SW)S -46 x(APREP)S -65 x +(.C,)S 167 x(and)S 166 x(others.)S 15925 Y 3600 X F36(2.2.2.2.)S +2 x(2)S 597 x(Session)S 168 x(Services)S 896 y 4796 X F151(This)S +166 x(service)S 166 x(establishes)S 165 x(the)S 166 x(bounds)S 167 x +(and)S 166 x(semantics)S 165 x(of)S 166 x(the)S 167 x(server/client)S +167 x(XIE)S 165 x(session.)S 19212 Y 3600 X F36(2.2.2.2.)S 2 x(2.1)S +598 x(XIEP_I)S 2 x(NIT_SESSI)S 2 x(ON)S 897 y 4796 X F151(The)S 170 x +(function)S 171 x(of)S 170 x(this)S 170 x(request)S 170 x(is)S 169 x +(for)S 170 x(the)S 170 x(client)S 171 x(to)S 169 x(determine)S 171 x +(if)S 169 x(XIE)S 169 x(is)S 170 x(available,)S 171 x(and)S 171 x +(if)S 169 x(so,)S 172 x(return)S 598 y 4796 X(information)S 178 x +(\(via)S 178 x(a)S 178 x(reply\))S 178 x(describing)S 179 x(the)S +178 x(extension)S 178 x(and)S 178 x(its)S 178 x(functions)S 178 x +(back)S 179 x(to)S 177 x(the)S 178 x(client.)S 274 x(This)S 597 y +4796 X(function)S 174 x(will)S 173 x(enter)S 174 x(the)S 174 x +(client)S 174 x(ID)S 173 x(and)S 173 x(other)S 174 x(client)S 174 x +(speci)S +(\211c)S 174 x(data)S 173 x(into)S 174 x(a)S 174 x(static)S 173 x +(XIE)S 172 x(table)S 174 x(\(client_)S 598 y 4796 X(table\).)S 252 x +(See)S 167 x(Appendix)S 168 x(D.)S 168 x(The)S 168 x(quantization)S +167 x(context)S 169 x(pointer)S 167 x(and)S 168 x(the)S 168 x(event)S +168 x(mask)S 168 x(are)S 167 x(examples)S 168 x(of)S 598 y 4796 X +(the)S 156 x(client)S 156 x(speci\211c)S 156 x(data)S 155 x +(necessary)S 156 x(for)S 156 x(XIE)S 155 x(to)S 156 x(maintain.)S +249 x(For)S 157 x(the)S 156 x(former)S -37 x(,)S 158 x(memory)S 157 x +(for)S 156 x(the)S 156 x(quantize)S 598 y 4796 X(structure)S 166 x +(will)S 165 x(be)S 166 x(allocated.)S 25489 Y 3600 X F36(2.2.2.2.)S +2 x(2.2)S 598 x(XIEP_TE)S 2 x(RM_SESSION)S 896 y 4796 X F151(This)S +170 x(request)S 171 x(will)S 170 x(release)S 171 x(the)S 171 x +(memory)S 171 x(resources)S 171 x(used)S 171 x(by)S 171 x(the)S 171 x +(requesting)S 172 x(client)S 171 x(and)S 171 x(established)S 598 y +4796 X(at)S 176 x(XIEP_INIT_SESS)S -2 x(ION.)S 177 x(This)S 177 x +(involves)S 178 x(deleting)S 177 x(the)S 177 x(client')S -18 x(s)S +176 x(entry)S 178 x(from)S 177 x(the)S 177 x(client_table)S 177 x +(and)S 598 y 4796 X(deallocating)S 166 x(the)S 166 x(memory)S 167 x +(used)S 166 x(by)S 166 x(any)S 167 x(of)S 166 x(it)S 166 x(entries.)S +896 y 4796 X(Note:)S 260 x(Other)S 171 x(XIE)S 171 x(resources)S +171 x(which)S 172 x(use)S 172 x(the)S 171 x(CORE)S 170 x(X)S 171 x +(facility)S 172 x(will)S 171 x(be)S 171 x(terminated)S 171 x(upon)S +173 x(the)S 171 x(client)S 598 y 4796 X(closing)S 166 x(the)S 166 x +(connec)S 2 x(tion.)S 35879 Y 3600 X F40(2\20310)S 449 x(DIX/XIE)S +165 x(Component)S +PP +EP +%%DOC$Page: 2-11 23 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 3600 X F36(2.2.2.2.)S 2 x(3)S 597 x(Resource)S 167 x +(Services)S 896 y 4796 X F151(The)S 194 x(DIX)S 193 x(component)S +194 x(is)S 193 x(responsible)S 194 x(for)S 194 x(creating,)S 202 x +(validating,)S 201 x(deleting,)S 202 x(and)S 194 x(querying)S 196 x +(XIE)S 598 y 4796 X(resources.)S 325 x(These)S 204 x(services)S 204 x +(require)S 204 x(use)S 204 x(of)S 203 x(the)S 204 x(CORE)S 202 x(X)S +204 x(resource)S 204 x(management)S 204 x(facility)S 598 y 4796 X +(\(RESO)S -2 x(URCE.C\).)S 9654 Y 3600 X F36(2.2.2.2.)S 2 x(3.1)S +598 x(Creating)S 166 x(XIE)S 167 x(Resources)S 896 y 4796 X F151 +(Before)S 162 x(XIE)S 162 x(can)S 163 x(create)S 163 x(a)S 163 x +(resource,)S 164 x(it)S 163 x(must)S 162 x(determine)S 163 x(if)S +162 x(the)S 163 x(ID)S 162 x(of)S 163 x(the)S 163 x(resource)S 163 x +(received)S 164 x(from)S 162 x(the)S 598 y 4796 X(client)S 166 x +(\(via)S 166 x(XIELIB\))S 165 x(is)S 165 x(a)S 166 x(legal)S 167 x +(ID.)S 165 x(This)S 167 x(is)S 165 x(accomplished)S 166 x(by)S 167 x +(doing)S 166 x(the)S 167 x(following:)S 12344 Y 5692 X(o)S 166 x(V)S +-46 x(erifying)S 167 x(that)S 166 x(the)S 167 x(ID)S 165 x(is)S 165 x +(not)S 167 x(previously)S 167 x(de\211ned)S 166 x(via)S 167 x +(LookupId)S 167 x(\()S 165 x(see)S 166 x(Section)S 166 x(2.2.2.)S +2 x(2.3.2\))S 597 y 5692 X(o)S 166 x(Making)S 168 x(sure)S 166 x +(that)S 166 x(the)S 166 x(ID)S 165 x("and")S 166 x(CORE)S 165 x(X)S +165 x(parameter)S 166 x(SER)S -19 x(VER_BI)S -2 x(T)S 167 x(is)S +165 x(F)S -36 x(ALSE)S 598 y 5692 X(o)S 166 x(Making)S 168 x(sure)S +166 x(the)S 166 x(client)S 166 x(structure)S 167 x(\211eld)S 166 x +("clientAsMask")S 165 x(equals)S 166 x(the)S 167 x(upper)S 166 x(12)S +166 x(bits)S 165 x(of)S 166 x(the)S 166 x(ID.)S 897 y 4796 X(The)S +166 x(XIE)S 165 x(macro)S 167 x(LEGAL_NEW)S -2 x(_XIE_RESO)S -2 x +(URCE)S 165 x(\(see)S 166 x(Section)S 166 x(F)S -55 x(.2\))S 166 x +(does)S 166 x(the)S 166 x(above:)S 15631 Y 5692 X(LEGAL_NEW_XI)S +-2 x(E_RESOUR)S -2 x(CE)S 166 x(\(id,)S 166 x(rT)S -26 x(ype\))S +897 y 4796 X(The)S 166 x(id)S 166 x(is)S 166 x(the)S 166 x(resource)S +167 x(id)S 165 x(and)S 167 x(rT)S -26 x(ype)S 167 x(is)S 165 x(the)S +167 x(resource)S 166 x(type)S 167 x(\(RT_Iob,)S 166 x(RT_Idc)S 166 x +(etc.\).)S 897 y 4796 X(The)S 179 x(CORE)S 178 x(X)S 179 x +(procedure,)S 184 x(AddResource,)S 183 x(allows)S 178 x(extensions)S +179 x(to)S 180 x(add)S 179 x(a)S 179 x(new)S 179 x(resource)S 180 x +(class-value)S 597 y 4796 X(pair)S 178 x(into)S 179 x(the)S 180 x +(COR)S -2 x(E)S 179 x(X)S 179 x(resource)S 179 x(management)S 180 x +(given)S 180 x(a)S 179 x(resource)S 180 x(ID)S 178 x(\(provided)S +179 x(by)S 179 x(client\),)S 183 x(class)S 598 y 4796 X(type)S 166 x +(\(created)S 166 x(by)S 166 x(XieInit\),)S 166 x(and)S 166 x(value)S +167 x(\(pointer)S 166 x(to)S 166 x(the)S 167 x(just)S 166 x +(allocated)S 166 x(resource\).)S 897 y 4796 X(For)S 171 x(example,)S +174 x(in)S 171 x(creating)S 172 x(an)S 172 x(IOB,)S 171 x(the)S 171 x +(client)S 172 x(passes)S 170 x(a)S 171 x(resource)S 172 x(ID,)S 171 x +(and)S 172 x(the)S 171 x(IOB)S 171 x(resource)S 172 x(data.)S 598 y +4796 X(XIE)S 180 x(\211rst)S 181 x(checks)S 181 x(to)S 181 x(see)S +181 x(if)S 181 x(its)S 180 x(a)S 181 x(legal)S 181 x(ID,)S 181 x +(then)S 182 x(allocates)S 180 x(memory)S 182 x(for)S 181 x(the)S +181 x(IOB)S 180 x(and)S 181 x(passes)S 180 x(the)S 597 y 4796 X +(memory)S 160 x(pointer)S 160 x(\(value\))S 160 x(to)S 160 x +(AddResource.)S 249 x(Now)S 160 x(if)S 159 x(the)S 161 x(client)S +160 x(some)S 159 x(time)S 160 x(later)S 159 x(wishes)S 159 x(to)S +160 x(query)S 161 x(this)S 598 y 4796 X(IOB)S -2 x(,)S 161 x(XIE)S +160 x(will)S 160 x(use)S 160 x(the)S 161 x(client)S 160 x(passed)S +160 x(ID)S 160 x(as)S 160 x(a)S 160 x(handle)S 161 x(to)S 161 x +(accessing)S 160 x(the)S 161 x(IOB)S 159 x(data)S 161 x(by)S 160 x +(using)S 162 x(a)S 160 x(CORE)S 598 y 4796 X(X)S 165 x(routine)S +167 x(LookupID)S 166 x(\(see)S 166 x(Section)S 166 x(2.2.2.)S 2 x +(2.3.2\))S 166 x(which)S 167 x(returns)S 166 x(the)S 166 x(pointer)S +-36 x(.)S 896 y 4796 X(AddRes)S -2 x(ource)S 174 x(will)S 171 x +(create)S 173 x(the)S 172 x(resource)S 173 x(if)S 172 x(it)S 172 x +(does)S 172 x(not)S 173 x(exist.)S 262 x(The)S 173 x(following)S +172 x(represents)S 172 x(the)S 173 x(call)S 172 x(to)S 598 y 4796 X +(AddRes)S -2 x(ource:)S 24598 Y 5692 X(AddResource)S 166 x(\(ID,)S +166 x(T)S -26 x(ype,)S 167 x(V)S -46 x(alue,)S 167 x(Func,)S 167 x +(RC_Xie\))S 896 y 4796 X(Func)S 187 x(represents)S 186 x(the)S 186 x +(procedure)S 187 x(to)S 187 x(call)S 186 x(when)S 186 x(the)S 187 x +(resource)S 187 x(is)S 185 x(freed)S 187 x(\(see)S 185 x(Section)S +187 x(2.2.2.2.)S 2 x(3.3\))S 598 y 4796 X(and)S 175 x(is)S 175 x +(called)S 175 x(with)S 175 x(the)S 176 x(address)S 175 x(of)S 175 x +(the)S 176 x(resource)S 176 x(data.)S 268 x(There)S 176 x(will)S +175 x(be)S 175 x(a)S 176 x(delete)S 175 x(procedure,)S 179 x(which)S +598 y 4796 X(will)S 181 x(de-allocate)S 182 x(the)S 183 x(memory)S +183 x(used)S 182 x(by)S 183 x(the)S 183 x(resource,)S 187 x(for)S +183 x(each)S 183 x(XIE)S 181 x(resource.)S 284 x(Entries)S 182 x(to)S +182 x(these)S 598 y 4796 X(procedures)S 170 x(will)S 169 x(be)S 169 x +(DestroyIob,)S 171 x(DestroyIdc)S 169 x(etc..)S 257 x(These)S 170 x +(will)S 169 x(reside)S 170 x(in)S 169 x(the)S 170 x(XIE_UTILS.C)S +169 x(module)S 597 y 4796 X(\(see)S 165 x(Appendix)S 166 x(B.)S 897 y +4796 X(Adding)S 170 x(the)S 170 x(resource)S 171 x(will)S 169 x +(allow)S 170 x(XIE)S 169 x(to)S 170 x(establish)S 169 x(the)S 171 x +(location)S 170 x(of)S 170 x(XIE)S 169 x(data)S 170 x(from)S 170 x +(the)S 170 x(resource)S 171 x(ID)S 598 y 4796 X(\(see)S 165 x(next)S +167 x(section\).)S 35879 Y 21241 X F40(DIX/XI)S -2 x(E)S 166 x +(Component)S 448 x(2\2031)S -24 x(1)S +PP +EP +%%DOC$Page: 2-12 24 +1000 BP 39600 30600 PM 0 0 XY +5155 Y 3600 X F36(2.2.2.2.)S 2 x(3.2)S 598 x(V)S -27 x(alidatin)S +2 x(g)S 166 x(XIE)S 167 x(Resources)S 897 y 4796 X F151(The)S 183 x +(validation)S 182 x(of)S 183 x(XIE)S 181 x(resources)S 183 x(is)S +182 x(done)S 183 x(via)S 183 x(a)S 183 x(call)S 182 x(to)S 182 x +(the)S 183 x(CORE)S 181 x(X)S 182 x(procedure)S 184 x(LookupID)S +182 x(\(in)S 598 y 4796 X(RESO)S -2 x(URCE.C\):)S 7845 Y 5692 X +(LookupID)S 167 x(\(ID,)S 165 x(rT)S -25 x(ype,)S 167 x(RC_Xie\))S +897 y 4796 X(Where)S 177 x(rT)S -25 x(ype)S 178 x(is)S 177 x(the)S +177 x(resource)S 178 x(type)S 178 x(\(RT_iob,)S 180 x(RT_idc,)S 181 x +(RT_ipc)S +(\))S 177 x(and)S 178 x(RC_Xie)S 176 x(is)S 177 x(the)S 178 x(XIE)S +176 x(resource)S 597 y 4796 X(class.)S 248 x(Both)S 166 x(are)S 166 x +(de)S +(\211ned)S 167 x(in)S 167 x(XieInit.)S 897 y 4796 X(LookupId)S 167 x +(will)S 167 x(return)S 168 x(a)S 167 x(pointer)S 168 x(\(value\))S +167 x(if)S 167 x(it)S 167 x(is)S 167 x(valid)S 167 x(otherwise)S +167 x(it)S 167 x(returns)S 168 x(a)S 167 x(NULL.)S 168 x(All)S 167 x +(extension)S 598 y 4796 X(requests)S 178 x(havin)S 2 x(g)S 179 x(a)S +180 x(resource)S 180 x(ID)S 178 x(will)S 179 x(use)S 179 x(LookupID)S +180 x(as)S 178 x(a)S 180 x(validity)S 179 x(check.)S 278 x(If)S 178 x +(a)S 180 x(Null)S 179 x(is)S 179 x(returned)S 598 y 4796 X(then)S +166 x(a)S 166 x(BadIDChoice)S 165 x(error)S 167 x(will)S 165 x(be)S +166 x(reported)S 166 x(to)S 166 x(the)S 166 x(client.)S 896 y 4796 X +(Note:)S 278 x(All)S 181 x(requests)S 180 x(which)S 181 x(have)S +182 x(an)S 181 x(XIE)S 180 x(resource)S 181 x(ID)S 180 x(will)S 180 x +(be)S 181 x(validated)S 180 x(during)S 182 x(the)S 181 x(processing)S +598 y 4796 X(phase)S 165 x(of)S 166 x(request)S 167 x(processing.)S +15317 Y 3600 X F36(2.2.2.2.)S 2 x(3.3)S 598 x(Freeing)S 167 x(XIE)S +167 x(Resources)S 897 y 4796 X F151(T)S -46 x(o)S 167 x(free)S 166 x +(a)S 167 x(resource,)S 168 x(XIE)S 166 x(must)S 166 x(call)S 166 x +(FreeResource)S 168 x(\(ID,SkipDeleteCa)S -2 x(llClass\).)S 250 x +(SkipDeleteCallC)S -2 x(lass)S 597 y 4796 X(indicates)S 169 x(those)S +170 x(classes)S 169 x(the)S 170 x(caller)S 170 x(wishes)S 170 x(not)S +170 x(to)S 170 x(free.)S 257 x(For)S 171 x(XIE)S 169 x(related)S +170 x(resources)S 170 x(this)S 170 x(will)S 169 x(mean)S 598 y 4796 X +(a)S 175 x(value)S 177 x(\(not)S 176 x(RC_Xie\))S 175 x(where)S 176 x +(RC_Xie)S 174 x(represents)S 176 x(the)S 176 x(class)S 175 x(of)S +176 x(XIE)S 175 x(resources.)S 270 x(This)S 176 x(routine)S 176 x +(will)S 598 y 4796 X(call)S 165 x(the)S 167 x(delete)S 166 x +(function)S 166 x(speci\211ed)S 167 x(by)S 166 x("func")S 166 x(in)S +167 x(the)S 166 x(AddResource)S 166 x(call.)S 20398 Y 3600 X F36 +(2.2.2.2.)S 2 x(3.4)S 598 x(Querying)S 167 x(XIE)S 167 x(Resources)S +897 y 4796 X F151(Querying)S 169 x(a)S 167 x(resource)S 168 x +(requires)S 168 x(that)S 168 x(the)S 168 x(resource)S 168 x(be)S +168 x(owned)S 167 x(by)S 168 x(the)S 168 x(client)S 168 x +(requesting)S 168 x(the)S 168 x(resource)S 597 y 4796 X +(information.)S 249 x(Therefore,)S 159 x(a)S 155 x(validity)S 155 x +(check)S 156 x(must)S 154 x(be)S 155 x(done)S 155 x(before)S 155 x +(the)S 155 x(attributes)S 154 x(within)S 155 x(the)S 155 x(resource)S +598 y 4796 X(are)S 166 x(read)S 166 x(and)S 166 x(reported)S 166 x +(back)S 167 x(to)S 166 x(the)S 166 x(client.)S 250 x(\(See)S 166 x +(Section)S 166 x(2.2.2.2.)S 2 x(3.2\).)S 24881 Y 3600 X F36 +(2.2.2.2.)S 2 x(4)S 597 x(Impo)S 2 x(rt/Export)S 166 x(Services)S +897 y 4796 X F151(These)S 172 x(tasks)S 171 x(allow)S 171 x(an)S +172 x(image)S 172 x(to)S 171 x(be)S 172 x(moved)S 172 x(between)S +172 x(a)S 172 x(COR)S -2 x(E)S 172 x(drawable)S 171 x(\(pixmap)S +172 x(or)S 172 x(window\))S 171 x(and)S 598 y 4796 X(an)S 181 x +(IOB.)S 181 x(They)S 182 x(depend)S 181 x(on)S 182 x(some)S 181 x +(procedures)S 181 x(\(GetImage)S 181 x(and)S 181 x(PutImage)S 182 x +(for)S 181 x(example\))S 182 x(from)S 181 x(the)S 597 y 4796 X(COR)S +-2 x(E)S 166 x(X)S 166 x(in)S 166 x(order)S 166 x(to)S 166 x +(accomplish)S 166 x(their)S 167 x(task.)S 29364 Y 3600 X F36 +(2.2.2.2.)S 2 x(4.1)S 598 x(XIEP_I)S 2 x(MPORT_IMAGE)S 897 y 4796 X +F151(This)S 173 x(request)S 174 x(will)S 172 x(take)S 174 x(image)S +173 x(data)S 174 x(from)S 173 x(a)S 173 x(pixmap)S 174 x(or)S 173 x +(window)S 173 x(and)S 174 x(copy)S 174 x(it)S 173 x(to)S 173 x(an)S +174 x(IOB.)S 173 x(The)S 174 x(IOB)S 598 y 4796 X(must)S 173 x(be)S +174 x(valid)S 173 x(or)S 174 x(a)S 174 x(BadIDC)S -2 x(hoice)S 175 x +(error)S 174 x(will)S 173 x(be)S 174 x(reported)S 174 x(\(see)S 173 x +(Section)S 174 x(2.2.2.2.)S 2 x(3.2\).)S 265 x(Functionally)S 598 y +4796 X(this)S 186 x(request)S 187 x(will)S 187 x(do)S 187 x(what)S +186 x(the)S 188 x(COR)S -2 x(E)S 187 x(X)S 187 x(GetImage)S 186 x +(procedure)S 188 x(does)S 187 x(\(calls)S 187 x(COR)S -2 x(E)S 187 x +(X)S 187 x(routines)S 597 y 4796 X(GetIm)S -2 x(age)S 188 x(and)S +187 x(W)S -28 x(riteT)S -46 x(oClient\))S 187 x(without)S 186 x +(sending)S 188 x(the)S 187 x(data)S 186 x(to)S 187 x(the)S 187 x +(client.)S 291 x(GetImage)S 187 x(is)S 186 x(called)S 598 y 4796 X +(through)S 173 x(the)S 173 x(drawable)S 172 x +(\(*pdraw->pScreen->GetI)S -2 x(mage\))S 173 x(and)S 173 x +(transfers)S 172 x(data)S 172 x(within)S 172 x(the)S 172 x(drawable)S +598 y 4796 X(to)S 168 x(a)S 168 x(buffer)S -37 x(.)S 254 x(The)S +169 x(buffer)S 169 x(represents)S 168 x(the)S 168 x(image)S 169 x +(data.)S 253 x(Depending)S 169 x(on)S 169 x(the)S 168 x(curren)S +2 x(t)S 168 x(state)S 167 x(of)S 168 x(the)S 169 x(IOB,)S 598 y +4796 X(DIX)S 164 x(may)S 166 x(have)S 167 x(to)S 166 x(allocate)S +165 x(a)S 166 x(larger)S 167 x(or)S 166 x(smaller)S 165 x(buffer)S +166 x(than)S 167 x(is)S 165 x(currently)S 167 x(allocated)S 166 x +(for)S 166 x(this)S 165 x(IOB.)S 165 x(In)S 35879 Y 3600 X F40 +(2\20312)S 449 x(DIX/XIE)S 165 x(Component)S +PP +EP +%%DOC$Page: 2-13 25 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(addition,)S 161 x(new)S 160 x(IOB)S 159 x +(attributes)S 159 x(are)S 160 x(derived)S 161 x(from)S 160 x(the)S +160 x(drawable)S 159 x(speci\211ed)S 160 x(within)S 160 x(the)S 160 x +(client)S 160 x(request.)S 598 y 4796 X(The)S 166 x(format)S 166 x +(of)S 166 x(GetImage)S 165 x(is:)S 6958 Y 5692 X(GetImage)S 166 x +(\(pDraw)S -47 x(,)S 166 x(x,)S 167 x(y)S -54 x(,)S 166 x(width,)S +166 x(height,)S 168 x(format,)S 166 x(planemask,)S 166 x(pBuf\))S +897 y 4796 X(The)S 166 x(argumen)S 2 x(ts,)S 166 x(with)S 166 x(the)S +166 x(exception)S 167 x(of)S 166 x(pDraw)S 166 x(and)S 166 x(pBuf,)S +167 x(are)S 166 x(derived)S 167 x(from)S 166 x(the)S 166 x +(drawable.)S 250 x(pDraw)S 598 y 4796 X(and)S 166 x(pBuf)S 166 x +(are)S 166 x(the)S 166 x(drawable)S 166 x(passed)S 165 x(by)S 166 x +(the)S 166 x(client)S 167 x(and)S 166 x(the)S 166 x(IOB)S 165 x +(data)S 166 x(pointer)S -37 x(,)S 167 x(respectively)S -55 x(.)S +896 y 4796 X(The)S 166 x(speci\211ed)S 167 x(drawable)S 165 x(must)S +166 x(be)S 166 x(valid)S 167 x(or)S 166 x(a)S 166 x(BadDrawable)S +165 x(error)S 167 x(will)S 165 x(be)S 167 x(reported.)S 250 x(T)S +-46 x(o)S 166 x(validate)S 167 x(the)S 598 y 4796 X(drawable,)S 166 x +(XIE)S 165 x(will)S 165 x(use)S 166 x(the)S 166 x(CORE)S 165 x(X)S +165 x(macro)S 167 x(LOOKUP_D)S -2 x(RA)S -46 x(W)S -46 x(ABLE:)S +12039 Y 5692 X(pDraw)S 165 x(=)S 166 x(LOOKUP_DRA)S -48 x(W)S -46 x +(ABLE)S 166 x(\(drawable_id,)S 165 x(client\))S 13533 Y 4796 X(The)S +168 x(drawable_id)S 167 x(is)S 168 x(the)S 168 x(drawable)S 167 x +(ID;)S 168 x(client)S 168 x(is)S 167 x(the)S 168 x(client)S 168 x +(structure,)S 170 x(and)S 168 x(pDraw)S 167 x(is)S 167 x(a)S 168 x +(pointer)S 168 x(to)S 168 x(a)S 598 y 4796 X(drawable)S 170 x(type.)S +259 x(If)S 170 x(pDraw)S 170 x(is)S 170 x(a)S 171 x(NULL)S 171 x +(then)S 172 x(the)S 171 x(drawable)S 170 x(is)S 170 x(not)S 171 x +(valid)S 171 x(and)S 171 x(a)S 171 x(BadDraw)S -2 x(able)S 171 x +(must)S 598 y 4796 X(be)S 177 x(reported.)S 274 x(If)S 178 x(the)S +178 x(drawable)S 177 x(is)S 178 x(an)S 178 x(input)S 178 x(only)S +179 x(drawable,)S 181 x(a)S 178 x(BadMatch)S 178 x(error)S 178 x +(will)S 178 x(be)S 178 x(reported.)S 598 y 4796 X(\(see)S 165 x +(Section)S 166 x(F)S -55 x(.1\))S 17718 Y 3600 X F36(2.2.2.2.)S 2 x +(4.2)S 598 x(XIEP_EX)S 2 x(PORT_IMAGE)S 896 y 4796 X F151(This)S +178 x(request)S 178 x(transfers)S 177 x(image)S 179 x(data)S 177 x +(and)S 179 x(its)S 177 x(attributes)S 178 x(from)S 178 x(an)S 178 x +(existing)S 179 x(IOB)S 177 x(into)S 178 x(a)S 178 x(drawable.)S +598 y 4796 X(The)S 169 x(IOB)S 167 x(must)S 169 x(be)S 168 x(valid)S +169 x(or)S 169 x(a)S 168 x(BadId)S 168 x(error)S 169 x(will)S 168 x +(be)S 169 x(reported)S 169 x(\(see)S 168 x(Section)S 169 x +(2.2.2.2.3.)S 2 x(2\).)S 254 x(The)S 170 x(pixmap)S 598 y 4796 X +(must)S 178 x(be)S 179 x(a)S 179 x(valid)S 179 x(drawable)S 179 x +(or)S 179 x(a)S 179 x(BadDraw)S -2 x(able)S 179 x(error)S 180 x +(will)S 178 x(be)S 179 x(reported.)S 276 x(Similarly)S -56 x(,)S +183 x(the)S 179 x(graphics)S 598 y 4796 X(context)S 161 x(\(also)S +161 x(within)S 161 x(this)S 161 x(request)S 161 x(protocol\))S 161 x +(must)S 161 x(also)S 161 x(be)S 161 x(valid)S 161 x(or)S 162 x(a)S +161 x(BadGc)S 160 x(error)S 162 x(will)S 161 x(be)S 161 x(reported.)S +896 y 4796 X(T)S -46 x(o)S 178 x(validate)S 178 x(a)S 177 x +(drawable)S 178 x(and)S 178 x(a)S 177 x(GC,)S 178 x(XIE)S 177 x +(will)S 177 x(use)S 178 x(a)S 177 x(CORE)S 177 x(X)S 177 x(macro)S +178 x(V)S -56 x(ALIDA)S -28 x(TE_DRA)S -47 x(W)S -46 x(ABLE_)S 598 y +4796 X(AND_G)S -2 x(C:)S 23098 Y 5692 X(V)S -55 x(ALIDA)S -29 x +(TE_DRA)S -47 x(W)S -46 x(ABLE_AND)S -2 x(_GC)S 166 x(\(dst_draw)S +-2 x(able_id,)S 167 x(pDraw)S -47 x(,)S 167 x(pGC,)S 165 x(client\))S +896 y 4796 X(dst_drawa)S -2 x(ble_id)S 167 x(is)S 166 x(the)S 167 x +(pixmap)S 167 x(drawable)S 167 x(Id)S 166 x(\(from)S 167 x(the)S +167 x(client\);)S 168 x(pDraw)S 166 x(is)S 166 x(a)S 167 x(pointer)S +167 x(to)S 166 x(a)S 167 x(drawable)S 598 y 4796 X(type)S 185 x +(\(returned\);)S 197 x(pGC)S 185 x(is)S 185 x(a)S 186 x(pointer)S +186 x(to)S 185 x(the)S 186 x(GC)S 185 x(\(returned\);)S 196 x(and)S +186 x(client)S 186 x(is)S 185 x(the)S 186 x(client)S 186 x +(structure.)S 598 y 4796 X(This)S 179 x(macro)S 179 x(will)S 178 x +(return)S 180 x(a)S 179 x(BadDrawabl)S -2 x(e,)S 183 x(BadGc)S 178 x +(or)S 180 x(BadMatch)S 179 x(error)S 179 x(if)S 179 x(input)S 179 x +(is)S 179 x(not)S 179 x(valid)S 179 x(\(see)S 598 y 4796 X(Section)S +166 x(F)S -55 x(.1\))S 896 y 4796 X(This)S 181 x(procedure)S 182 x +(will)S 181 x(use)S 181 x(the)S 182 x(Graphics)S 181 x(Context,)S +186 x(which)S 181 x(the)S 182 x(client)S 181 x(must)S 181 x(pass,)S +185 x(and)S 182 x(make)S 181 x(calls)S 598 y 4796 X(through)S 167 x +(the)S 166 x(GC)S 166 x(to)S 165 x(PutImage)S 167 x +(\(pGc->PutImage\).)S 249 x(PutImage)S 167 x(has)S 166 x(the)S 166 x +(following)S 166 x(format:)S 28477 Y 5692 X(PutImage)S 180 x +(\(pDraw)S -46 x(,)S 183 x(pGc,)S 183 x(depth,)S 184 x(dstX,)S 179 x +(dstY)S -56 x(,)S 180 x(width,)S 183 x(height,)S 185 x(left_pad,)S +183 x(format,)S 183 x(IOB_Image_)S 598 y 5692 X(Data\))S 897 y 4796 X +(All)S 175 x(arguments,)S 179 x(with)S 176 x(the)S 176 x(exception)S +177 x(of)S 176 x(left_pad,)S 178 x(format,)S 179 x(and)S 176 x +(IOB_Image_Dat)S -2 x(a,)S 179 x(are)S 177 x(within)S 175 x(the)S +598 y 4796 X(request)S 187 x(block)S 188 x(as)S 187 x(stated)S 187 x +(in)S 188 x(the)S 188 x(XIE)S 186 x(Protocol.)S 293 x(The)S 188 x +(left_pad,)S 193 x(format,)S 193 x(and)S 188 x(IOB_Image_Data)S 597 y +4796 X(arguments)S 166 x(are)S 166 x(inferred)S 167 x(from)S 166 x +(the)S 166 x(speci\211ed)S 166 x(IOB.)S 35879 Y 21216 X F40(DIX/XIE)S +165 x(Component)S 448 x(2\20313)S +PP +EP +%%DOC$Page: 2-14 26 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 3600 X F36(2.2.2.2.)S 2 x(5)S 597 x(T)S -27 x(ransport)S 167 x +(Services)S 896 y 4796 X F151(These)S 167 x(services)S 168 x(allow)S +167 x(the)S 167 x(client)S 168 x(to)S 167 x(transfer)S 168 x(image)S +167 x(data)S 167 x(between)S 168 x(the)S 167 x(client)S 168 x(and)S +168 x(server)S -37 x(.)S 253 x(Once)S 167 x(the)S 598 y 4796 X +(client)S 166 x(has)S 166 x(established)S 165 x(the)S 166 x +(transport)S 166 x(context,)S 167 x(clients)S 166 x(can)S 167 x +(then)S 166 x(move)S 167 x(images)S 166 x(to/from)S 166 x(IOBs)S +-2 x(.)S 9953 Y 3600 X F36(2.2.2.2.)S 2 x(5.1)S 598 x(IOB)S 166 x +(Data)S 165 x(Formats)S 166 x(and)S 167 x(Organization)S 896 y 4796 X +F151(The)S 166 x(DIX)S 165 x(will)S 166 x(have)S 166 x(the)S 167 x +(following)S 166 x(IOB)S 165 x(image)S 166 x(data)S 166 x(types)S +166 x(\(see)S 165 x(Appendix)S 167 x(D\):)S 12045 Y 5692 X(o)S 166 x +(XieK_Bits)S -2 x(tream)S 598 y 5692 X(o)S 166 x(XieK_ByteImage)S +597 y 5692 X(o)S 166 x(XieK_W)S -28 x(ordImage)S 598 y 5692 X(o)S +166 x(XieK_LongImage)S 598 y 5692 X(o)S 166 x(XieK_FloatImage)S 897 y +4796 X(XieK_B)S -2 x(itstream)S 170 x(represents)S 169 x(a)S 170 x +(packed)S 171 x(image)S 170 x(where)S 170 x(each)S 171 x(pixel)S +170 x(is)S 169 x(one)S 171 x(bit)S 169 x(long.)S 259 x(There)S 171 x +(will)S 169 x(be)S 170 x(no)S 597 y 4796 X(padding)S 164 x(allowed)S +164 x(either)S 164 x(between)S 165 x(pixels)S 164 x(or)S 164 x +(scanlines.)S 250 x(The)S 165 x(start)S 163 x(of)S 164 x(the)S 165 x +(image)S 164 x(data)S 164 x(will)S 164 x(always)S 164 x(be)S 598 y +4796 X(byte)S 166 x(aligned.)S 897 y 4796 X(XieK_xxxImage)S 176 x +(represents)S 175 x(image)S 175 x(data)S 175 x(in)S 176 x(either)S +176 x(8,16)S 175 x(or)S 176 x(32)S 175 x(bit)S 175 x(pixels)S 175 x +(with)S 175 x(no)S 176 x(padding)S 176 x(pixels)S 597 y 4796 X +(allowed)S 169 x(between)S 170 x(pixels)S 170 x(or)S 171 x(between)S +170 x(scanlines.)S 258 x(The)S 170 x(start)S 170 x(of)S 170 x(the)S +170 x(image)S 171 x(data)S 170 x(will)S 169 x(always)S 170 x(be)S +170 x(byte)S 598 y 4796 X(aligned.)S 897 y 4796 X(XieK_FloatI)S -2 x +(mage)S 176 x(represents)S 175 x(image)S 176 x(data)S 174 x(using)S +176 x(the)S 176 x(server)S 28 x(')S -19 x(s)S 175 x(machine)S 176 x +(representation)S 175 x(of)S 175 x(single)S 598 y 4796 X(precision)S +166 x(\212oating)S 167 x(point.)S 896 y 4796 X(This)S 181 x(implies)S +181 x(that)S 182 x(T)S -30 x(ransport)S 181 x(Services)S 183 x(must)S +181 x(reorganize)S 183 x(and)S 182 x(reformat)S 181 x(the)S 182 x +(data)S 182 x(when)S 182 x(data)S 181 x(is)S 598 y 4796 X +(transferred)S 179 x(over)S 181 x(the)S 180 x(wire.)S 276 x(For)S +181 x(example,)S 184 x(when)S 180 x(the)S 180 x(client)S 180 x +(transfers)S 179 x(an)S 180 x(image)S 180 x(\(to)S 179 x(the)S 180 x +(server\))S 598 y 4796 X(which)S 171 x(includes)S 172 x(pixel)S 171 x +(and/or)S 172 x(scanline)S 172 x(strides,)S 172 x(the)S 171 x(DIX)S +170 x(will)S 171 x(be)S 171 x(responsible)S 171 x(in)S 171 x +("weeding")S 172 x(out)S 171 x(the)S 597 y 4796 X(data)S 172 x +(which)S 173 x(will)S 172 x(not)S 173 x(be)S 173 x(used)S 173 x(in)S +173 x(any)S 174 x(subsequent)S 173 x(rendering)S 174 x(or)S 173 x +(DDX)S 172 x(operation.)S 264 x(In)S 173 x(addition,)S 174 x(the)S +598 y 4796 X(DIX)S -2 x(/XIE)S 173 x(must)S 172 x(choose)S 173 x +(the)S 174 x(integer)S 173 x(type)S 173 x(large)S 174 x(enough)S +174 x(to)S 173 x(support)S 173 x(the)S 173 x(incoming)S 174 x(data.)S +262 x(Similarly)S -55 x(,)S 598 y 4796 X(when)S 175 x(the)S 176 x +(transfer)S 175 x(is)S 175 x(from)S 176 x(the)S 175 x(server)S 176 x +(to)S 176 x(the)S 175 x(client,)S 179 x(the)S 175 x(DIX)S 175 x +(will)S 174 x(be)S 176 x(responsible)S 175 x(for)S 175 x(packing)S +177 x(if)S 598 y 4796 X(dictated)S 165 x(by)S 167 x(the)S 166 x +(transport)S 166 x(context.)S 896 y 4796 X(T)S -46 x(o)S 173 x +(accomplish)S 172 x(this)S 173 x(reformatting,)S 175 x(the)S 173 x +(DIX)S 171 x(may)S 173 x(depend)S 173 x(on)S 173 x(DDX)S 172 x +(functions)S 173 x(which)S 173 x(will)S 172 x(facilitate)S 598 y +4796 X(the)S 166 x(processing)S 166 x(of)S 166 x(data)S 166 x(from)S +166 x(one)S 166 x(organization)S 167 x(to)S 166 x(another)S -36 x(.)S +897 y 4796 X(The)S 202 x(server)S 203 x(will)S 202 x(use)S 202 x +(the)S 202 x(IOB)S 201 x(attribute)S 202 x(list)S 201 x(to)S 202 x +(keep)S 203 x(track)S 203 x(of)S 202 x(the)S 202 x(various)S 203 x +(formats.)S 321 x(See)S 598 y 4796 X(Section)S 166 x(2.2.2.2.6.)S +2 x(1)S 166 x(for)S 166 x(more)S 166 x(on)S 167 x(IOB)S 165 x(data)S +165 x(formats.)S 896 y 4796 X(For)S 171 x(multispectral)S 171 x +(image)S 171 x(data,)S 172 x(DIX/XIE)S 170 x(must)S 171 x +(reorganize)S 172 x(the)S 171 x(data)S 170 x(to)S 171 x(ease)S 171 x +(subsequent)S 171 x(process-)S 598 y 4796 X(ing.)S 251 x(Thus)S 167 x +(when)S 167 x(transferring)S 167 x(multispectral)S 166 x(images)S +166 x(from)S 167 x(the)S 166 x(client,)S 168 x(DIX/XIE)S 165 x(will)S +165 x(un-bun)S 2 x(dle)S 166 x(the)S 598 y 4796 X(data)S 158 x(into)S +159 x(the)S 159 x(speci\211ed)S 159 x(IOB)S 158 x(\(parent)S 159 x +(IOB\))S 158 x(and)S 159 x(n-1)S 159 x(data)S 158 x(entities)S 159 x +(\(child)S 159 x(IOBs)S -2 x(\))S 159 x(of)S 159 x(data)S 158 x +(format)S 159 x(byte,)S 597 y 4796 X(word)S 178 x(or)S 178 x(long,)S +183 x(where)S 179 x(n)S 179 x(represents)S 178 x(the)S 179 x(number)S +179 x(of)S 179 x(spectral)S 178 x(components.)S 275 x(The)S 179 x +(parent)S 179 x(IOB)S 177 x(will)S 598 y 4796 X(have)S 171 x +(pointers)S 170 x(to)S 170 x(the)S 171 x(child)S 170 x(IOBs)S 169 x +(whose)S 170 x(meaning)S 172 x(is)S 170 x(inferred)S 171 x(by)S 170 x +(the)S 171 x(spectral)S 170 x(type)S 171 x(\(of)S 170 x(the)S 170 x +(parent)S 598 y 4796 X(IOB)S -2 x(\).)S 167 x(Thus)S 166 x(clients)S +166 x(can)S 167 x(still)S 165 x(access)S 166 x(multispectral)S 165 x +(IOBs)S 165 x(via)S 166 x(the)S 166 x(IOB)S 165 x(id)S 166 x(of)S +166 x(the)S 166 x(parent.)S 35879 Y 3600 X F40(2\20314)S 449 x +(DIX/XIE)S 165 x(Component)S +PP +EP +%%DOC$Page: 2-15 27 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(As)S 173 x(an)S 174 x(example,)S 176 x(if)S 174 x +(client)S 174 x(sends)S 173 x(an)S 174 x(RGB)S 173 x(image)S 174 x +(of)S 173 x(3,3,2)S 175 x(bits,)S 176 x(respectivily)S -55 x(,)S +176 x(DIX/XIE)S 172 x(will)S 173 x(use)S 174 x(the)S 598 y 4796 X +(destination)S 179 x(IOB)S 178 x(speci\211ed)S 180 x(by)S 180 x(the)S +180 x(client)S 180 x(as)S 179 x(the)S 180 x(red)S 180 x(component)S +180 x(of)S 179 x(data)S 180 x(type)S 180 x(XieK_ByteIm)S -2 x(age)S +597 y 4796 X(and)S 185 x(will)S 184 x(create)S 185 x(two)S 184 x +("child)S 185 x(IOBs")S 184 x(to)S 184 x(represent)S 185 x(the)S +186 x(two)S 184 x(components)S 185 x(green)S 186 x(and)S 185 x(blue)S +186 x(of)S 184 x(data)S 598 y 4796 X(type)S 178 x(XieK_ByteIma)S +-2 x(ge.)S 274 x(Thus)S 179 x(when)S 178 x(the)S 178 x(client)S 178 x +(wishes)S 177 x(to)S 178 x(scale)S 178 x(this)S 177 x(RGB)S 177 x +(image,)S 181 x(DIX/XIE)S 177 x(will)S 598 y 4796 X(recognize)S 184 x +(that)S 184 x(this)S 183 x(is)S 183 x(a)S 184 x(multispectral)S 183 x +(image)S 184 x(and)S 184 x(will)S 183 x(initiate)S 183 x(the)S 184 x +(DDX)S 182 x(scale)S 184 x(algorithm)S 184 x(for)S 598 y 4796 X +(each)S 179 x(component)S 179 x(-)S 179 x(parent)S 179 x(and)S 179 x +(children.)S 276 x(This)S 178 x(will)S 178 x(allow)S 179 x(DDX)S +177 x(writers)S 178 x(not)S 179 x(to)S 178 x(be)S 179 x(concern)S +180 x(with)S 597 y 4796 X("dif\211cult")S 165 x(data)S 166 x +(formats.)S 11142 Y 3600 X F36(2.2.2.2.)S 2 x(5.2)S 598 x(XIEP_SE)S +2 x(T_TRANSPORT)S 897 y 4796 X F151(This)S 174 x(request)S 174 x +(will)S 173 x(establish)S 173 x(the)S 175 x(required)S 174 x +(context)S 175 x(necessary)S 175 x(to)S 174 x(support)S 174 x(image)S +174 x(data)S 174 x(wire)S 173 x(trans-)S 598 y 4796 X(port)S 173 x +(operations)S 173 x(\(either)S 173 x(direction\).)S 265 x(The)S 174 x +(context)S 174 x(includes)S 173 x(information)S 174 x(about)S 173 x +(the)S 174 x(data)S 173 x(organiza-)S 598 y 4796 X(tion,)S 177 x +(compression)S 175 x(scheme,)S 178 x(and)S 175 x(component)S 175 x +(information)S 176 x(of)S 174 x(the)S 175 x(image)S 176 x(as)S 174 x +(it)S 175 x(exists)S 174 x(on)S 175 x(the)S 175 x(client)S 597 y +4796 X(side.)S 253 x(The)S 169 x(DIX)S 167 x(responsibility)S 168 x +(is)S 168 x(to)S 168 x(read)S 168 x(the)S 169 x(information)S 168 x +(within)S 168 x(the)S 169 x(request)S 168 x(and)S 169 x(attach)S +168 x(it)S 168 x(to)S 168 x(the)S 598 y 4796 X(speci\211ed)S 166 x +(IOB.)S 897 y 4796 X(The)S 173 x(IOB)S 171 x(\211eld,)S 175 x +(structure)S 173 x(XieT)S -31 x(ransport,)S 175 x(will)S 171 x +(contain)S 174 x(the)S 172 x(information)S 173 x(describing)S 173 x +(the)S 173 x(data)S 172 x(orga-)S 598 y 4796 X(nization)S 169 x(of)S +169 x(the)S 170 x(client)S 169 x(image)S 170 x(\(see)S 169 x +(Appendix)S 169 x(D\).)S 169 x(Thus,)S 172 x(subsequent)S 169 x +(wire)S 169 x(transporting)S 170 x(of)S 169 x(the)S 170 x(data)S +597 y 4796 X(to/from)S 166 x(an)S 166 x(IOB)S 165 x(will)S 165 x(be)S +166 x(fully)S 167 x(described)S 166 x(by)S 166 x(the)S 167 x(IOB)S +165 x(\211elds.)S 18913 Y 3600 X F36(2.2.2.2.)S 2 x(5.3)S 598 x +(XIEP_PUT_T)S 2 x(ILE)S 897 y 4796 X F151(This)S 162 x(request)S +162 x(allows)S 161 x(the)S 162 x(client)S 162 x(to)S 162 x(randomly)S +163 x(transfer)S 162 x(client)S 162 x(image)S 162 x(data)S 162 x(to)S +162 x(an)S 162 x(IOB)S 161 x(via)S 162 x(tiles.)S 249 x(Prior)S 598 y +4796 X(to)S 178 x(calling)S 178 x(this)S 178 x(request)S 178 x(the)S +179 x(client)S 178 x(must)S 178 x(have)S 179 x(previously)S 179 x +(called)S 178 x(XIEP_SET_TRANSPOR)S -2 x(T)S 179 x(and)S 597 y 4796 X +(must)S 169 x(have)S 170 x(allocated)S 170 x(an)S 170 x(IOB.)S 169 x +(This)S 170 x(function)S 170 x(will)S 169 x(copy)S 170 x(the)S 170 x +(data)S 170 x(from)S 169 x(the)S 170 x(protocol)S 170 x(request)S +170 x(buffer)S 598 y 4796 X(to)S 173 x(an)S 173 x(allocated)S 173 x +(buffer)S 173 x(within)S 173 x(the)S 174 x(IOB.)S 172 x(Granularity)S +-54 x(,)S 175 x(formats,)S 175 x(size)S 172 x(and)S 174 x(location)S +173 x(of)S 173 x(the)S 174 x(tiles)S 172 x(etc.)S 598 y 4796 X(are)S +166 x(provided)S 166 x(by)S 167 x(the)S 166 x(arguments)S 167 x +(within)S 166 x(the)S 166 x(request)S 166 x(and)S 166 x(by)S 167 x +(the)S 166 x(speci\211ed)S 166 x(IOB)S 165 x(\211elds.)S 897 y 4796 X +(The)S 166 x(DIX)S 165 x(responsibility)S 166 x(is)S 166 x(to:)S +24891 Y 4796 X(\201)S 594 x(check)S 173 x(that)S 172 x(the)S 172 x +(IOB)S 170 x(is)S 172 x(valid)S 172 x(using)S 172 x(the)S 172 x(IOB)S +171 x(id)S 171 x(passed)S 171 x(by)S 172 x(the)S 172 x(client)S 172 x +(\(see)S 172 x(Section)S 172 x(2.2.2.2.3.)S 2 x(2\))S 598 y 5692 X +(and)S 166 x(if)S 166 x(not)S 166 x(report)S 167 x(a)S 166 x(BadID)S +-2 x(Choice)S 167 x(error)S -36 x(.)S 747 y 4796 X(\201)S 594 x +(check)S 167 x(that)S 166 x(the)S 166 x(IOB)S 165 x(is)S 166 x +(constrained)S 166 x(and)S 167 x(if)S 166 x(not,)S 166 x(report)S +166 x(a)S 166 x(BadMatch)S 166 x(error)S -36 x(.)S 747 y 4796 X +(\201)S 594 x(check)S 170 x(that)S 169 x(the)S 170 x(transport)S +169 x(\211eld)S 169 x(within)S 169 x(the)S 170 x(IOB)S 168 x(has)S +169 x(been)S 169 x(previously)S 171 x(de\211ned)S 169 x(\(i.e.)S +257 x(not)S 169 x(NULL\))S 598 y 5692 X(and)S 166 x(if)S 166 x(not,)S +167 x(report)S 166 x(a)S 166 x(BadAccess)S 165 x(error)S -36 x(.)S +747 y 4796 X(\201)S 594 x(check)S 185 x(that)S 183 x(the)S 184 x +(component)S 184 x(organization)S 184 x(as)S 183 x(speci\211ed)S +184 x(in)S 184 x(the)S 183 x(IOB)S 183 x(is)S 183 x(consistent)S +183 x(with)S 183 x(that)S 598 y 5692 X(within)S 166 x(the)S 166 x +(transport)S 166 x(\211elds)S 166 x(and)S 166 x(if)S 166 x(not,)S +167 x(report)S 166 x(a)S 166 x(BadMatch)S 166 x(error)S -36 x(.)S +747 y 4796 X(\201)S 594 x(set)S 166 x(the)S 166 x(IOB)S 165 x +(transport)S 166 x(\211eld)S 166 x(to)S 166 x(NULL)S 166 x(on)S 167 x +(the)S 166 x(last)S 165 x(transfer)S -37 x(.)S 30769 Y 4796 X(In)S +174 x(addition,)S 177 x(the)S 175 x(DIX)S 174 x(will)S 174 x(be)S +175 x(responsible)S 174 x(for)S 175 x(changing)S 176 x(the)S 175 x +(data)S 175 x(format)S 174 x(and)S 175 x(organization)S 175 x(from)S +598 y 4796 X(that)S 165 x(speci\211ed)S 166 x(in)S 167 x(the)S 166 x +(IOB')S -20 x(s)S 166 x(XieT)S -31 x(ransport)S 166 x(\211eld)S 166 x +(to)S 166 x(one)S 167 x(of)S 166 x(the)S 166 x(DIX)S 165 x +(supported)S 166 x(image)S 166 x(constructs.)S 896 y 4796 X(NOTE:)S +166 x(If)S 167 x(byte)S 167 x(swapping)S 167 x(is)S 166 x(necessary)S +168 x(\(i.e)S 167 x(client->swapped)S 166 x(=)S 83 x(=)S 167 x +(TRUE\),)S 167 x(then)S 167 x(the)S 167 x(swapping)S 167 x(must)S +598 y 4796 X(be)S 166 x(done)S 166 x(before)S 166 x(reading)S 167 x +(from)S 166 x(the)S 166 x(client)S 167 x(and)S 166 x(storing)S 166 x +(to)S 166 x(the)S 166 x(speci\211ed)S 166 x(IOB.)S 35879 Y -220 x +F40(DIX/XIE)S 165 x(Component)S 448 x(2\20315)S +PP +EP +%%DOC$Page: 2-16 28 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 3600 X F36(2.2.2.2.)S 2 x(5.4)S 598 x(XIEP_GET_T)S 2 x(ILE)S +896 y 4796 X F151(This)S 167 x(request)S 168 x(allows)S 167 x(the)S +168 x(client)S 167 x(to)S 168 x(randomly)S 168 x(transfer)S 168 x +(IOB)S 167 x(image)S 168 x(data)S 167 x(to)S 167 x(a)S 168 x(client)S +168 x(buffer)S 168 x(via)S 168 x(tiles.)S 598 y 4796 X(Prior)S 174 x +(to)S 173 x(calling)S 175 x(this)S 173 x(request)S 174 x(the)S 174 x +(client)S 174 x(must)S 173 x(have)S 175 x(previously)S 175 x(called)S +174 x(XIEP_SE)S -2 x(T_TRANSPORT)S 598 y 4796 X(and)S 182 x(must)S +182 x(have)S 184 x(allocated)S 182 x(an)S 183 x(IOB.)S 182 x(This)S +182 x(function)S 184 x(will)S 181 x(send)S 183 x(data)S 182 x(to)S +182 x(the)S 183 x(client)S 183 x(via)S 183 x(a)S 182 x(CORE)S 181 x +(X)S 598 y 4796 X(procedure)S 166 x(W)S -27 x(riteT)S -46 x +(oClient:)S 9056 Y 5692 X(W)S -28 x(riteT)S -45 x(oClient)S 166 x +(\(client,)S 166 x(numBytes,)S 167 x(pbytes\))S 897 y 4796 X(Client)S +167 x(is)S 167 x(the)S 167 x(client)S 168 x(structure)S 168 x +(passed)S 166 x(to)S 168 x(XIE,)S 167 x(numBytes)S 167 x(are)S 168 x +(the)S 168 x(numBytes)S 167 x(passed)S 167 x(to)S 167 x(client,)S +169 x(and)S 597 y 4796 X(pbytes)S 165 x(is)S 166 x(pointer)S 166 x +(to)S 166 x(the)S 166 x(bytes)S 166 x(to)S 166 x(pass.)S 897 y 4796 X +(Granularity)S -55 x(,)S 173 x(formats,)S 172 x(size)S 171 x(and)S +172 x(location)S 171 x(of)S 171 x(the)S 172 x(tiles)S 171 x(etc.)S +260 x(are)S 171 x(provided)S 172 x(by)S 172 x(the)S 172 x(arguments)S +172 x(within)S 598 y 4796 X(the)S 166 x(request)S 166 x(and)S 166 x +(by)S 167 x(the)S 166 x(speci\211ed)S 166 x(IOB)S 165 x(\211elds.)S +896 y 4796 X(The)S 166 x(DIX)S 165 x(responsibility)S 166 x(is)S +166 x(to:)S 14735 Y 4796 X(\201)S 594 x(check)S 173 x(that)S 172 x +(the)S 172 x(IOB)S 170 x(is)S 172 x(valid)S 172 x(using)S 172 x(the)S +172 x(IOB)S 171 x(id)S 171 x(passed)S 171 x(by)S 172 x(the)S 172 x +(client)S 172 x(\(see)S 172 x(Section)S 172 x(2.2.2.2.3.)S 2 x(2\))S +598 y 5692 X(and)S 166 x(if)S 166 x(not)S 166 x(report)S 167 x(a)S +166 x(BadID)S -2 x(Choice)S 167 x(error)S -36 x(.)S 747 y 4796 X +(\201)S 594 x(check)S 167 x(that)S 166 x(the)S 166 x(IOB)S 165 x(is)S +166 x(constrained)S 166 x(and)S 167 x(if)S 166 x(not)S 166 x(report)S +166 x(a)S 166 x(BadMatch)S 166 x(error)S -36 x(.)S 747 y 4796 X +(\201)S 594 x(check)S 170 x(that)S 169 x(the)S 170 x(transport)S +169 x(\211eld)S 169 x(within)S 169 x(the)S 170 x(IOB)S 168 x(has)S +169 x(been)S 169 x(previously)S 171 x(de\211ned)S 169 x(\(i.e.)S +257 x(not)S 169 x(NULL\))S 598 y 5692 X(and)S 166 x(if)S 166 x(not,)S +167 x(report)S 166 x(a)S 166 x(BadAccess)S 165 x(error)S -36 x(.)S +747 y 4796 X(\201)S 594 x(check)S 185 x(that)S 183 x(the)S 184 x +(component)S 184 x(organization)S 184 x(as)S 183 x(speci\211ed)S +184 x(in)S 184 x(the)S 183 x(IOB)S 183 x(is)S 183 x(consistent)S +183 x(with)S 183 x(that)S 598 y 5692 X(within)S 166 x(the)S 166 x +(transport)S 166 x(\211elds)S 166 x(and)S 166 x(if)S 166 x(not,)S +167 x(report)S 166 x(a)S 166 x(BadMatch)S 166 x(error)S -36 x(.)S +747 y 4796 X(\201)S 594 x(set)S 166 x(the)S 166 x(IOB)S 165 x +(transport)S 166 x(\211eld)S 166 x(to)S 166 x(NULL)S 166 x(on)S 167 x +(the)S 166 x(last)S 165 x(transfer)S -37 x(.)S 20613 Y 4796 X(In)S +168 x(addition,)S 168 x(the)S 168 x(DIX)S 167 x(will)S 167 x(be)S +168 x(responsible)S 168 x(for)S 168 x(changin)S 2 x(g)S 168 x(the)S +168 x(data)S 168 x(format)S 167 x(and)S 169 x(organization)S 168 x +(to)S 168 x(that)S 597 y 4796 X(speci\211ed)S 166 x(in)S 166 x(the)S +166 x(IOB')S -20 x(s)S 166 x(XieT)S -31 x(ransport)S 166 x(\211eld)S +166 x(from)S 166 x(one)S 167 x(of)S 166 x(the)S 166 x(DIX)S 165 x +(supported)S 166 x(image)S 166 x(constructs.)S 897 y 4796 X(NOTE:)S +166 x(If)S 167 x(byte)S 167 x(swapping)S 167 x(is)S 166 x(necessary)S +168 x(\(i.e)S 167 x(client->swapped)S 166 x(=)S 83 x(=)S 167 x +(TRUE\),)S 167 x(then)S 167 x(the)S 167 x(swapping)S 167 x(must)S +598 y 4796 X(be)S 166 x(done)S 166 x(before)S 166 x(sending)S 167 x +(data)S 166 x(to)S 166 x(the)S 166 x(client.)S 25096 Y 3600 X F36 +(2.2.2.2.)S 2 x(5.5)S 598 x(XIEP_PUT_S)S 2 x(TREAM)S 897 y 4796 X +F151(This)S 187 x(request)S 187 x(allows)S 187 x(the)S 188 x(client)S +187 x(to)S 187 x(sequentially)S 188 x(transfer)S 188 x(client)S 187 x +(image)S 188 x(data)S 187 x(to)S 187 x(an)S 188 x(IOB.)S 187 x(This)S +597 y 4796 X(protocol)S 180 x(request)S 181 x(may)S 181 x(be)S 181 x +(used)S 180 x(for)S 181 x(both)S 181 x(uncompressed)S 181 x(and)S +181 x(compressed)S 180 x(image)S 181 x(data.)S 279 x(Prior)S 181 x +(to)S 598 y 4796 X(calling)S 168 x(this)S 168 x(request)S 168 x(the)S +168 x(client)S 168 x(must)S 167 x(have)S 169 x(previously)S 169 x +(called)S 168 x(XIEP_SET_TRANSPO)S -2 x(RT)S 168 x(and)S 168 x(must)S +598 y 4796 X(have)S 180 x(allocated)S 179 x(an)S 180 x(IOB.)S 178 x +(This)S 180 x(function)S 180 x(will)S 179 x(copy)S 180 x(the)S 180 x +(data)S 179 x(from)S 179 x(the)S 179 x(protocol)S 180 x(request)S +179 x(buffer)S 180 x(to)S 598 y 4796 X(an)S 171 x(allocated)S 171 x +(buffer)S 172 x(within)S 171 x(the)S 172 x(IOB.)S 171 x(Granularity)S +-55 x(,)S 173 x(formats,)S 173 x(etc.)S 260 x(are)S 172 x(provided)S +172 x(by)S 172 x(the)S 171 x(argumen)S 2 x(ts)S 597 y 4796 X(within)S +165 x(the)S 167 x(request)S 166 x(and)S 166 x(by)S 166 x(the)S 167 x +(speci)S +(\211ed)S 166 x(IOB)S 165 x(\211elds.)S 897 y 4796 X(The)S 166 x +(DIX)S 165 x(responsibility)S 166 x(is)S 166 x(to:)S 31671 Y 4796 X +(\201)S 594 x(check)S 167 x(that)S 166 x(the)S 166 x(IOB)S 165 x(is)S +166 x(unconstrained)S 167 x(and)S 166 x(if)S 166 x(not)S 166 x +(report)S 167 x(a)S 166 x(BadMatch)S 166 x(error)S -37 x(.)S 747 y +4796 X(\201)S 594 x(check)S 173 x(that)S 172 x(the)S 172 x(IOB)S +170 x(is)S 172 x(valid)S 172 x(using)S 172 x(the)S 172 x(IOB)S 171 x +(id)S 171 x(passed)S 171 x(by)S 172 x(the)S 172 x(client)S 172 x +(\(see)S 172 x(Section)S 172 x(2.2.2.2.3.)S 2 x(2\))S 598 y 5692 X +(and)S 166 x(if)S 166 x(not)S 166 x(report)S 167 x(a)S 166 x(BadID)S +-2 x(Choice)S 167 x(error)S -36 x(.)S 35879 Y 3600 X F40(2\20316)S +449 x(DIX/XIE)S 165 x(Component)S +PP +EP +%%DOC$Page: 2-17 29 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(\201)S 594 x(check)S 170 x(that)S 169 x(the)S +170 x(transport)S 169 x(\211eld)S 169 x(within)S 169 x(the)S 170 x +(IOB)S 168 x(has)S 169 x(been)S 169 x(previously)S 171 x(de\211ned)S +169 x(\(i.e.)S 257 x(not)S 169 x(NULL\))S 598 y 5692 X(and)S 166 x +(if)S 166 x(not,)S 167 x(report)S 166 x(a)S 166 x(BadAccess)S 165 x +(error)S -36 x(.)S 747 y 4796 X(\201)S 594 x(check)S 185 x(that)S +183 x(the)S 184 x(component)S 184 x(organization)S 184 x(as)S 183 x +(speci)S +(\211ed)S 184 x(in)S 184 x(the)S 183 x(IOB)S 183 x(is)S 183 x +(consistent)S 183 x(with)S 183 x(that)S 598 y 5692 X(within)S 166 x +(the)S 166 x(transport)S 166 x(\211elds)S 166 x(and)S 166 x(if)S +166 x(not,)S 167 x(report)S 166 x(a)S 166 x(BadMatch)S 166 x(error)S +-36 x(.)S 747 y 4796 X(\201)S 594 x(set)S 166 x(the)S 166 x(IOB)S +165 x(transport)S 166 x(\211eld)S 166 x(to)S 166 x(NULL)S 166 x(on)S +167 x(the)S 166 x(last)S 165 x(transfer)S -37 x(.)S 747 y 4796 X +(\201)S 594 x(keep)S 185 x(track)S 185 x(of)S 185 x(the)S 184 x +(offset)S 184 x(into)S 185 x(the)S 184 x(IOB)S 184 x(data)S 184 x +(area)S 185 x(by)S 185 x(using)S 185 x(the)S 185 x("data_offset)S +-2 x(")S 185 x(\211eld)S 184 x(within)S 598 y 5692 X(the)S 177 x +(IOB)S 175 x(\(see)S 176 x(Appendix)S 176 x(D\).)S 176 x(This)S 177 x +(offset)S 175 x(will)S 176 x(be)S 176 x(a)S 176 x(bit)S 176 x +(offset)S 176 x(when)S 176 x(the)S 177 x(IOB)S 175 x(is)S 176 x(of)S +176 x(type)S 176 x(XieK_)S 598 y 5692 X(Bitstream)S 165 x(and)S 166 x +(a)S 166 x(pixel)S 167 x(offset)S 165 x(otherwise.)S 10893 Y 4796 X +(In)S 174 x(addition,)S 177 x(the)S 175 x(DIX)S 174 x(will)S 174 x +(be)S 175 x(responsible)S 174 x(for)S 175 x(changing)S 176 x(the)S +175 x(data)S 175 x(format)S 174 x(and)S 175 x(organization)S 175 x +(from)S 598 y 4796 X(that)S 176 x(speci\211ed)S 176 x(in)S 177 x +(the)S 177 x(IOB')S -20 x(s)S 176 x(XieT)S -31 x(ransport)S 177 x +(\211eld)S 177 x(to)S 176 x(one)S 177 x(of)S 176 x(the)S 177 x(DIX)S +175 x(supported)S 177 x(image)S 177 x(constructs.)S 598 y 4796 X +(This)S 171 x(may)S 172 x(also)S 171 x(entail)S 172 x(decompressing)S +172 x(the)S 172 x(data;)S 174 x(in)S 172 x(this)S 171 x(case)S 172 x +(the)S 172 x(DIX)S 170 x(will)S 171 x(call)S 172 x(the)S 172 x(DDX)S +170 x(function)S 598 y 4796 X(to)S 165 x(perform)S 167 x(the)S 166 x +(decompression.)S 896 y 4796 X(NOTE:)S 166 x(If)S 167 x(byte)S 167 x +(swapping)S 167 x(is)S 166 x(necessary)S 168 x(\(i.e)S 167 x +(client->swapped)S 166 x(=)S 83 x(=)S 167 x(TRUE\),)S 167 x(then)S +167 x(the)S 167 x(swapping)S 167 x(must)S 598 y 4796 X(be)S 166 x +(done)S 166 x(before)S 166 x(reading)S 167 x(from)S 166 x(the)S 166 x +(client)S 167 x(and)S 166 x(storing)S 166 x(to)S 166 x(the)S 166 x +(speci)S +(\211ed)S 166 x(IOB.)S 16572 Y 3600 X F36(2.2.2.2.)S 2 x(5.6)S 598 x +(XIEP_GET_S)S 2 x(TREAM)S 897 y 4796 X F151(This)S 168 x(request)S +169 x(allows)S 167 x(the)S 169 x(client)S 168 x(to)S 169 x +(sequentially)S 169 x(receive)S 169 x(server)S 169 x(image)S 169 x +(data.)S 254 x(This)S 168 x(protocol)S 169 x(request)S 598 y 4796 X +(may)S 170 x(be)S 170 x(used)S 171 x(for)S 170 x(both)S 170 x +(uncompressed)S 171 x(and)S 171 x(compressed)S 169 x(image)S 171 x +(data.)S 258 x(Prior)S 170 x(to)S 170 x(calling)S 171 x(this)S 170 x +(request)S 597 y 4796 X(the)S 171 x(client)S 171 x(must)S 170 x +(have)S 172 x(previously)S 172 x(called)S 171 x(XIEP_SET_TRA)S -2 x +(NSPORT)S -46 x(.)S 171 x(This)S 172 x(function)S 171 x(will)S 170 x +(send)S 171 x(data)S 598 y 4796 X(to)S 165 x(the)S 167 x(client)S +166 x(via)S 166 x(a)S 166 x(CORE)S 165 x(X)S 165 x(procedure)S 167 x +(W)S -27 x(riteT)S -46 x(oClient)S 166 x(\(see)S 165 x(Section)S +167 x(2.2.2.2.5.)S 2 x(4\).)S 897 y 4796 X(Granularity)S -55 x(,)S +194 x(formats,)S 193 x(etc.)S 294 x(are)S 188 x(provided)S 188 x(by)S +189 x(the)S 188 x(arguments)S 189 x(within)S 188 x(the)S 188 x +(request)S 188 x(and)S 188 x(by)S 189 x(the)S 597 y 4796 X +(speci\211ed)S 166 x(IOB)S 165 x(\211elds.)S 897 y 4796 X(The)S 166 x +(DIX)S 165 x(responsibility)S 166 x(is)S 166 x(to:)S 23446 Y 4796 X +(\201)S 594 x(check)S 167 x(that)S 166 x(the)S 166 x(IOB)S 165 x(is)S +166 x(unconstrained)S 167 x(and)S 166 x(if)S 166 x(not)S 166 x +(report)S 167 x(a)S 166 x(BadMatch)S 166 x(error)S -37 x(.)S 748 y +4796 X(\201)S 594 x(check)S 173 x(that)S 172 x(the)S 172 x(IOB)S +170 x(is)S 172 x(valid)S 172 x(using)S 172 x(the)S 172 x(IOB)S 171 x +(id)S 171 x(passed)S 171 x(by)S 172 x(the)S 172 x(client)S 172 x +(\(see)S 172 x(Section)S 172 x(2.2.2.2.3.)S 2 x(2\))S 597 y 5692 X +(and)S 166 x(if)S 166 x(not)S 166 x(report)S 167 x(a)S 166 x(BadID)S +-2 x(Choice)S 167 x(error)S -36 x(.)S 747 y 4796 X(\201)S 594 x +(check)S 170 x(that)S 169 x(the)S 170 x(transport)S 169 x(\211eld)S +169 x(within)S 169 x(the)S 170 x(IOB)S 168 x(has)S 169 x(been)S 169 x +(previously)S 171 x(de\211ned)S 169 x(\(i.e.)S 257 x(not)S 169 x +(NULL\))S 598 y 5692 X(and)S 166 x(if)S 166 x(not,)S 167 x(report)S +166 x(a)S 166 x(BadAccess)S 165 x(error)S -36 x(.)S 747 y 4796 X +(\201)S 594 x(check)S 185 x(that)S 183 x(the)S 184 x(component)S +184 x(organization)S 184 x(as)S 183 x(speci\211ed)S 184 x(in)S 184 x +(the)S 183 x(IOB)S 183 x(is)S 183 x(consistent)S 183 x(with)S 183 x +(that)S 598 y 5692 X(within)S 166 x(the)S 166 x(transport)S 166 x +(\211elds)S 166 x(and)S 166 x(if)S 166 x(not,)S 167 x(report)S 166 x +(a)S 166 x(BadMatch)S 166 x(error)S -36 x(.)S 747 y 4796 X(\201)S +594 x(set)S 166 x(the)S 166 x(reply')S -18 x(s)S 165 x(\211nal)S +167 x(\211eld)S 166 x(to)S 166 x(TRUE)S 166 x(on)S 166 x(the)S 166 x +(last)S 166 x(transfer)S -37 x(.)S 748 y 4796 X(\201)S 594 x(set)S +166 x(the)S 166 x(IOB)S 165 x(transport)S 166 x(\211eld)S 166 x(to)S +166 x(NULL)S 166 x(on)S 167 x(the)S 166 x(last)S 165 x(transfer)S +-37 x(.)S 747 y 4796 X(\201)S 594 x(keep)S 173 x(track)S 173 x(of)S +172 x(the)S 172 x(offset)S 172 x(into)S 172 x(the)S 173 x(IOB)S 171 x +(data)S 172 x(area)S 172 x(by)S 173 x(using)S 173 x(the)S 172 x +("data_offset")S 171 x(\211eld)S 173 x(within)S 172 x(the)S 598 y +5692 X(IOB)S 174 x(\(see)S 174 x(Appendix)S 175 x(D\).)S 175 x(The)S +176 x(units)S 174 x(of)S 175 x(this)S 175 x(offset)S 174 x(will)S +174 x(be)S 175 x(dictated)S 174 x(by)S 175 x(the)S 175 x(data)S 175 x +(type)S 175 x(\211eld)S 175 x(\(bit)S 597 y 5692 X(offset,)S 166 x +(byte)S 166 x(offset,)S 166 x(etc.\).)S 32014 Y 4796 X(In)S 183 x +(addition,)S 188 x(the)S 183 x(DIX)S 182 x(will)S 183 x(be)S 183 x +(responsible)S 183 x(for)S 183 x(chang)S 2 x(ing)S 184 x(the)S 183 x +(data)S 183 x(format)S 183 x(and)S 183 x(organization)S 184 x(to)S +598 y 4796 X(that)S 167 x(speci\211ed)S 168 x(in)S 168 x(the)S 169 x +(IOB)S -2 x(')S -18 x(s)S 167 x(XieT)S -31 x(ransport)S 168 x +(\211eld)S 168 x(from)S 168 x(one)S 169 x(of)S 167 x(the)S 169 x +(DIX)S 166 x(supported)S 168 x(image)S 168 x(constructs.)S 598 y +4796 X(This)S 170 x(may)S 171 x(also)S 170 x(entail)S 171 x +(compressing)S 171 x(the)S 171 x(data;)S 173 x(in)S 170 x(this)S +171 x(case)S 170 x(the)S 171 x(DIX)S 169 x(will)S 170 x(call)S 171 x +(the)S 171 x(DDX)S 169 x(function)S 172 x(to)S 597 y 4796 X(perform)S +166 x(the)S 166 x(compression.)S 35879 Y 21216 X F40(DIX/XIE)S 165 x +(Component)S 448 x(2\20317)S +PP +EP +%%DOC$Page: 2-18 30 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(NOTE:)S 166 x(If)S 167 x(byte)S 167 x(swapping)S +167 x(is)S 166 x(necessary)S 168 x(\(i.e)S 167 x(client->swapped)S +166 x(=)S 83 x(=)S 167 x(TRUE\),)S 167 x(then)S 167 x(the)S 167 x +(swapping)S 167 x(must)S 598 y 4796 X(be)S 166 x(done)S 166 x +(before)S 166 x(sending)S 167 x(data)S 166 x(to)S 166 x(the)S 166 x +(client.)S 8154 Y 3600 X F36(2.2.2.2.)S 2 x(6)S 597 x(Process)S 167 x +(Services)S 896 y 4796 X F151(For)S 167 x(these)S 168 x(services,)S +168 x(DIX)S 166 x(will)S 167 x(perform)S 167 x(argumen)S 2 x(t)S +167 x(checking)S 169 x(and)S 168 x(if)S 167 x(in)S 167 x(error)S +-36 x(,)S 168 x(report)S 168 x(the)S 168 x(appropriate)S 598 y 4796 X +(error)S 169 x(code.)S 255 x(Also)S 168 x(the)S 168 x(DIX)S 168 x +(will)S 168 x(check)S 169 x(all)S 169 x(the)S 169 x(resources)S 169 x +(speci)S +(\211ed)S 168 x(by)S 169 x(the)S 169 x(client)S 169 x(as)S 168 x +(being)S 169 x(valid)S 169 x(\(see)S 598 y 4796 X(Section)S 173 x +(2.2.2.)S 2 x(2.3.2\))S 174 x(and)S 174 x(if)S 173 x(no)S 175 x +(errors)S 174 x(exist,)S 176 x(vector)S 174 x(through)S 175 x(the)S +174 x(DDX)S 173 x(component)S 174 x(to)S 173 x(perform)S 174 x(the)S +598 y 4796 X(desired)S 165 x(function.)S 251 x(If)S 165 x(the)S 167 x +(resource)S 166 x(is)S 166 x(in)S 166 x(error)S -36 x(,)S 166 x(an)S +167 x(appropriate)S 166 x(invalid)S 166 x(resource)S 167 x(error)S +167 x(is)S 165 x(reported.)S 896 y 4796 X(For)S 173 x(those)S 172 x +(operations)S 173 x(which)S 173 x(require)S 173 x(additional)S 172 x +(requirements)S 173 x(on)S 173 x(the)S 173 x(client)S 173 x +(speci\211ed)S 173 x(resources,)S 598 y 4796 X(the)S 166 x(DIX)S +166 x(will)S 165 x(check)S 168 x(that)S 166 x(these)S 167 x +(resources)S 167 x(are)S 166 x(valid)S 167 x(for)S 166 x(the)S 167 x +(particular)S 167 x(process)S 166 x(and)S 167 x(if)S 166 x(not,)S +167 x(report)S 167 x(a)S 598 y 4796 X(BadMatch)S 166 x(error)S -37 x +(.)S 896 y 4796 X(If)S 174 x(the)S 174 x(client)S 175 x(requested)S +174 x(noti\211cation,)S 178 x(the)S 174 x(DIX)S 174 x(will)S 173 x +(send)S 175 x(an)S 174 x(XIE_COMPUT)S -28 x(A)S -28 x(TION_COMPLETE)S +598 y 4796 X(event)S 166 x(upon)S 167 x(the)S 166 x(completion)S +166 x(of)S 166 x(the)S 167 x(requested)S 166 x(function)S 167 x +(\(see)S 165 x(Section)S 166 x(2.2.2.)S 2 x(2.10.1\).)S 897 y 4796 X +(One)S 174 x(of)S 175 x(the)S 174 x(major)S 176 x(tasks)S 174 x(of)S +174 x(the)S 175 x(DIX)S 173 x(for)S 175 x(this)S 174 x(request)S +175 x(class)S 174 x(is)S 174 x(to)S 175 x(prepare)S 175 x(data)S +174 x(to)S 174 x(operate)S 175 x(within)S 598 y 4796 X(the)S 166 x +(semantics)S 165 x(of)S 166 x(a)S 166 x(DDX)S 165 x(computation.)S +18316 Y 3600 X F36(2.2.2.2.)S 2 x(6.1)S 598 x(XIE')S -17 x(s)S 166 x +(Handlin)S 2 x(g)S 166 x(of)S 166 x(IOB)S 166 x(Data)S 165 x +(Formats)S 896 y 4796 X F151(Each)S 186 x(process)S 186 x(request)S +186 x(will)S 186 x(have)S 187 x(a)S 186 x(control)S 187 x(\212ag)S +187 x(indicating)S 187 x(whether)S 187 x(the)S 187 x(operation)S +186 x(should)S 187 x(be)S 598 y 4796 X("constrained")S 184 x(or)S +184 x("unconstrained".)S 287 x(The)S 185 x(latter)S 184 x(implies)S +183 x(that)S 185 x(precision)S 184 x(in)S 185 x(the)S 184 x +(computation)S 185 x(be)S 598 y 4796 X(maintained.)S 263 x(For)S +173 x(example,)S 175 x(when)S 173 x(adding)S 173 x(two)S 172 x +(image)S 173 x(objects,)S 175 x(DIX/XIE)S 172 x(will)S 172 x(create)S +172 x(a)S 173 x(destination)S 597 y 4796 X(IOB)S 172 x(whose)S 172 x +(format)S 173 x(will)S 173 x(either)S 173 x(be)S 173 x(integer)S +174 x(\(if)S 173 x(the)S 173 x(two)S 173 x(IOBs)S 172 x(pixel)S 173 x +(depth)S 173 x(indicate)S 174 x(that)S 173 x(the)S 173 x(result)S +598 y 4796 X(can)S 183 x(\211t)S 184 x(into)S 183 x(an)S 184 x +(integer)S 184 x(format)S 184 x(-)S 183 x(8,16,)S 188 x(or)S 184 x +(32)S 183 x(bits\))S 183 x(or)S 184 x(a)S 183 x(\212oat)S 184 x +(\(if)S 183 x(32)S 183 x(bit)S 183 x(integer)S 184 x(representation)S +598 y 4796 X(cannot)S 172 x(guarantee)S 173 x(precision\).)S 261 x +(The)S 172 x(DIX)S 171 x(responsibility)S 171 x(is)S 171 x(to)S 172 x +(determine)S 171 x(this)S 172 x(before)S 172 x(initiating)S 172 x +(the)S 598 y 4796 X(DDX)S 179 x(process.)S 278 x(\(The)S 181 x(DDX)S +180 x(process)S 180 x(will)S 180 x(read)S 181 x(the)S 181 x(format)S +180 x(\211eld)S 181 x(within)S 180 x(the)S 181 x(speci\211ed)S 181 x +(IOB\(s)S -2 x(\))S 181 x(and)S 598 y 4796 X(will)S 171 x(operate)S +172 x(accordingly)S -53 x(.\))S 261 x(Thus)S 173 x(for)S 172 x(some)S +172 x(operations,)S 174 x(DIX)S 171 x(will)S 172 x(be)S 172 x +(responsible)S 172 x(for)S 172 x(chang)S 2 x(ing)S 173 x(the)S 597 y +4796 X(allocation)S 173 x(of)S 173 x(an)S 174 x(existing)S 174 x +(IOB')S -20 x(s)S 174 x(data)S 173 x(to)S 173 x(that)S 173 x(of)S +174 x(another)S 174 x(type.)S 265 x(Whenever)S 174 x(possible,)S +175 x(the)S 174 x(DIX)S 172 x(will)S 598 y 4796 X(call)S 165 x(upon)S +167 x(the)S 166 x(DDX)S 165 x(to)S 166 x(compute)S 166 x(using)S +167 x(integer)S 167 x(formats)S 165 x(for)S 167 x(ef\211ciency)S +167 x(reasons.)S 897 y 4796 X(For)S 182 x(cases)S 181 x(when)S 183 x +(the)S 182 x(DIX)S 180 x(does)S 182 x(not)S 182 x(know)S 182 x(the)S +182 x(possible)S 182 x(outcome,)S 186 x(it)S 182 x(will)S 181 x +(take)S 182 x(the)S 182 x(conservative)S 597 y 4796 X(approach)S +166 x(\(\212oat\))S 166 x(for)S 166 x(the)S 166 x(computation)S 167 x +(to)S 165 x(assure)S 166 x(precision.)S 897 y 4796 X(For)S 186 x +(client)S 187 x(requested)S 186 x("constrained")S 186 x(operations,)S +191 x(the)S 187 x(DIX)S 185 x(function)S 187 x(will)S 185 x(gener)S +2 x(ate)S 186 x(positive)S 186 x(in-)S 598 y 4796 X(tegral)S 180 x +(data)S 180 x(by)S 181 x(quantizing)S 181 x(before)S 181 x +(returning)S 182 x(to)S 180 x(caller)S -37 x(.)S 279 x(For)S 180 x +(example)S 181 x(on)S 181 x(subtraction,)S 184 x(the)S 181 x(DDX)S +598 y 4796 X(function)S 172 x(could)S 173 x(generate)S 173 x +(negative)S 173 x(results)S 172 x(but)S 172 x(the)S 172 x(DIX)S 171 x +(will)S 172 x(force)S 172 x(integral)S 173 x(positive)S 172 x(based)S +171 x(on)S 173 x(the)S 597 y 4796 X(quantization)S 166 x(context)S +166 x(and)S 167 x(the)S 166 x(DDX)S 165 x(quantize)S 166 x +(function.)S 897 y 4796 X(In)S 168 x(addition,)S 170 x(DIX)S 168 x +(must)S 168 x(also)S 169 x(call)S 168 x(the)S 169 x(quantize)S 169 x +(DDX)S 168 x(function)S 169 x(whenever)S 170 x(it)S 169 x(needs)S +169 x(to)S 168 x(constrain)S 170 x(the)S 598 y 4796 X(data)S 173 x +(for)S 173 x(operations)S 174 x(which)S 174 x(require)S 174 x(such)S +174 x(data)S 173 x(\(mask,)S 176 x(bit)S 173 x(oring)S 175 x +(etc.\).)S 265 x(The)S 174 x(quantize)S 174 x(context)S 174 x(will)S +597 y 4796 X(dictate)S 173 x(what)S 174 x(method)S 173 x(it)S 174 x +(will)S 173 x(use)S 174 x(to)S 174 x(do)S 174 x(this.)S 265 x(See)S +174 x(Appendix)S 174 x(G)S 173 x(for)S 174 x(a)S 174 x(breakdown)S +175 x(on)S 174 x(the)S 174 x(DIX)S 173 x(and)S 598 y 4796 X(DDX)S +164 x(responsibilities)S 165 x(for)S 166 x(each)S 167 x(of)S 166 x +(the)S 166 x(DDX)S 165 x(functions.)S 35879 Y 3600 X F40(2\20318)S +449 x(DIX/XIE)S 165 x(Component)S +PP +EP +%%DOC$Page: 2-19 31 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 3600 X F36(2.2.2.2.)S 2 x(7)S 597 x(Statistics)S 167 x +(Services)S 896 y 4796 X F151(These)S 186 x(services)S 185 x(allow)S +185 x(the)S 186 x(client)S 186 x(to)S 185 x(obtain)S 186 x(statisti)S +-2 x(cs)S 186 x(on)S 186 x(an)S 186 x(IOB.)S 185 x(The)S 186 x(DIX)S +185 x(will)S 185 x(check)S 186 x(all)S 186 x(the)S 598 y 4796 X +(resources)S 173 x(speci\211ed)S 173 x(by)S 173 x(the)S 173 x +(client)S 173 x(as)S 172 x(being)S 174 x(valid)S 173 x(\(see)S 173 x +(Section)S 173 x(2.2.2.2.3.)S 2 x(2\))S 173 x(and)S 173 x(if)S 172 x +(no)S 174 x(errors)S 173 x(exist,)S 598 y 4796 X(vector)S 166 x +(throug)S 2 x(h)S 166 x(the)S 166 x(DDX)S 165 x(component)S 167 x +(to)S 166 x(perform)S 166 x(the)S 167 x(desired)S 166 x(function.)S +250 x(If)S 166 x(the)S 166 x(resource)S 167 x(is)S 166 x(in)S 166 x +(error)S -36 x(,)S 598 y 4796 X(an)S 166 x(appropriate)S 166 x +(invalid)S 166 x(resource)S 167 x(error)S 167 x(is)S 165 x +(reported.)S 896 y 4796 X(In)S 181 x(addition,)S 186 x(the)S 182 x +(DIX)S 181 x(is)S 181 x(responsible)S 181 x(for)S 182 x(checkin)S +2 x(g)S 182 x(the)S 182 x(arguments)S 182 x(for)S 182 x(validity)S +182 x(and)S 182 x(if)S 181 x(in)S 182 x(error)S -36 x(,)S 598 y +4796 X(reporting)S 172 x(a)S 171 x(BadV)S -46 x(alue)S 171 x(or)S +172 x(BadMatch)S 172 x(error)S -37 x(.)S 261 x(If)S 171 x(no)S 172 x +(errors)S 171 x(exist,)S 173 x(the)S 172 x(DIX)S 170 x(will)S 171 x +(call)S 172 x(the)S 171 x(appropriate)S 598 y 4796 X(DDX)S 173 x +(function)S 177 x(and)S 175 x(then)S 176 x(return)S 176 x(the)S 175 x +(statistical)S 174 x(results)S 175 x(in)S 175 x(the)S 176 x(form)S +175 x(of)S 175 x(a)S 175 x(reply)S 176 x(to)S 175 x(the)S 175 x +(client)S 176 x(\(see)S 597 y 4796 X(Appendix)S 166 x(C\).)S 897 y +4796 X(One)S 171 x(of)S 172 x(the)S 172 x(major)S 172 x(tasks)S 171 x +(for)S 172 x(the)S 172 x(DIX)S 171 x(for)S 172 x(this)S 171 x +(request)S 172 x(class)S 171 x(is)S 172 x(to)S 171 x(prepare)S 172 x +(data)S 172 x(to)S 171 x(operate)S 172 x(within)S 598 y 4796 X(the)S +172 x(semantics)S 171 x(of)S 172 x(a)S 171 x(DDX)S 171 x +(computation.)S 261 x(See)S 172 x(Section)S 172 x(2.2.2.)S 2 x +(2.6.1)S 172 x(for)S 172 x(information)S 172 x(on)S 173 x(the)S 172 x +(way)S 171 x(DIX)S 598 y 4796 X(handles)S 166 x(image)S 166 x(data.)S +896 y 4796 X(For)S 175 x(the)S 175 x(XIEP_AREA)S -2 x(_ST)S -27 x(A)S +-28 x(T)S 176 x(request)S 175 x(if)S 174 x(the)S 176 x(client)S 175 x +(requested)S 175 x(noti\211cation,)S 178 x(the)S 176 x(DIX)S 174 x +(will)S 174 x(send)S 175 x(an)S 598 y 4796 X(XIE_C)S -2 x(OMPUT)S +-27 x(A)S -28 x(TION_COMPLETE)S 172 x(event)S 174 x(upon)S 174 x +(the)S 173 x(completion)S 173 x(of)S 173 x(the)S 173 x(requested)S +173 x(function)S 174 x(\(see)S 598 y 4796 X(Section)S 166 x +(2.2.2.2.10.)S 2 x(1\).)S 17126 Y 3600 X F36(2.2.2.2.)S 2 x(8)S 597 x +(Process)S 167 x(Control)S 167 x(Services)S 166 x(-)S 166 x(TBS)S +20413 Y 3600 X(2.2.2.2.)S 2 x(9)S 597 x(Display)S 167 x(Service)S +897 y 4796 X F151(This)S 178 x(service)S 178 x(allows)S 177 x(the)S +178 x(client)S 178 x(to)S 178 x(display)S 178 x(a)S 178 x(sequence)S +178 x(of)S 178 x(prerendered)S 179 x(image)S 178 x(frames)S 178 x +(which)S 178 x(are)S 598 y 4796 X(stored)S 165 x(as)S 166 x +(pixmaps.)S 249 x(The)S 167 x(XIEP_DI)S -2 x(SPLA)S -45 x(Y_SEQ)S +-2 x(UENCE)S 165 x(request)S 166 x(is)S 166 x(used)S 166 x(to)S 166 x +(do)S 166 x(this.)S 24299 Y 3600 X F36(2.2.2.2.)S 2 x(9.1)S 598 x +(XIEP_DIS)S 2 x(PLA)S -46 x(Y_SEQUENCE)S 897 y 4796 X F151(The)S +173 x(processing)S 172 x(of)S 173 x(this)S 172 x(request)S 172 x +(requires)S 173 x(use)S 172 x(of)S 173 x(the)S 172 x(CORE)S 171 x(X)S +172 x(procedure)S 173 x(CopyArea)S 173 x(which)S 172 x(copies)S 597 y +4796 X(one)S 166 x(drawable)S 166 x(to)S 165 x(another)S -36 x(.)S +250 x(Before)S 166 x(XIE)S 165 x(can)S 166 x(initiate)S 166 x +(CopyArea)S 166 x(it)S 166 x(must:)S 26989 Y 5692 X(-)S 166 x +(validate)S 166 x(the)S 166 x(client')S -18 x(s)S 165 x(destination)S +166 x(drawable)S 166 x(and)S 166 x(GC)S 598 y 5692 X(-)S 166 x +(validate)S 166 x(the)S 166 x(client')S -18 x(s)S 165 x(source)S +167 x(drawable.)S 597 y 5692 X(-)S 166 x(check)S 167 x(to)S 166 x +(see)S 166 x(that)S 166 x(the)S 166 x(parameters)S 166 x(of)S 166 x +(the)S 166 x(source)S 166 x(and)S 167 x(destination)S 165 x +(drawable)S 166 x(match.)S 29679 Y 4796 X(T)S -46 x(o)S 169 x +(validate)S 169 x(the)S 169 x(drawable)S 168 x(and)S 169 x(GC,)S +169 x(XIE)S 168 x(will)S 168 x(use)S 169 x(the)S 169 x(macro)S 169 x +(V)S -55 x(ALIDA)S -29 x(TE_DRA)S -47 x(W)S -46 x(ABLE_AND)S -2 x(_)S +169 x(GC)S 597 y 4796 X(\(see)S 165 x(XIEP_EXPOR)S -2 x(T_IMAGE)S +166 x(above\).)S 897 y 4796 X(T)S -46 x(o)S 169 x(validate)S 170 x +(the)S 169 x(source)S 170 x(drawable,)S 170 x(XIE)S 169 x(will)S +168 x(use)S 170 x(the)S 169 x(CORE)S 168 x(X)S 169 x(macro)S 170 x +(LOOKUP_D)S -2 x(RA)S -46 x(W)S -46 x(ABLE)S 168 x(\(see)S 598 y +4796 X(Section)S 166 x(2.2.2.2.4.)S 2 x(1\).)S 896 y 4796 X +(Argument)S 178 x(check)S 2 x(ing)S 178 x(is)S 178 x(done)S 179 x +(by)S 178 x(assuring)S 179 x(that)S 178 x(pSrc->pScreen)S 178 x +(\(pSrc)S 179 x(is)S 177 x(a)S 178 x(pointer)S 179 x(to)S 178 x(the)S +178 x(source)S 598 y 4796 X(drawable\))S 184 x(equals)S 186 x +(pDst->pS)S -2 x(creen)S 187 x(\(pDst)S 184 x(is)S 185 x(a)S 186 x +(pointer)S 186 x(to)S 185 x(the)S 186 x(destination)S 185 x +(drawable\))S 185 x(and)S 186 x(that)S 598 y 4796 X(pSrc->depth)S +165 x(equals)S 166 x(pDst->depth,)S 166 x(otherwise)S 165 x(a)S 166 x +(BadMatch)S 166 x(must)S 166 x(be)S 166 x(reported.)S 35879 Y 21216 X +F40(DIX/XIE)S 165 x(Component)S 448 x(2\20319)S +PP +EP +%%DOC$Page: 2-20 32 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(The)S 166 x(format)S 166 x(of)S 166 x(the)S 166 x +(CopyArea)S 166 x(procedure)S 167 x(is:)S 6360 Y 5692 X(CopyArea)S +166 x(\(pSrc,)S 167 x(pDst,)S 165 x(pGc,)S 166 x(src_x,)S 167 x +(src_y)S -55 x(,)S 167 x(width,)S 166 x(height,)S 167 x(dst_x,)S +167 x(dst_y\))S 7855 Y 4796 X(The)S 180 x(arguments)S 180 x(src_x,)S +185 x(src_y)S -55 x(,)S 184 x(width,)S 183 x(height,)S 184 x(dst_x)S +180 x(and)S 180 x(dst_y)S 180 x(are)S 180 x(inferred)S 180 x(by)S +180 x(the)S 180 x(IDC)S 179 x(during)S 598 y 4796 X(some)S 165 x +(preprocess)S 166 x(and)S 166 x(the)S 167 x(other)S 166 x(arguments)S +167 x(are)S 166 x(as)S 165 x(de\211ned)S 167 x(above.)S 10844 Y +3600 X F36(2.2.2.2.)S 2 x(10)S 597 x(Event)S 167 x(Services)S 896 y +4796 X F151(Events)S 177 x(are)S 178 x(situations)S 177 x(or)S 178 x +(occurrences)S 178 x(which)S 178 x(are)S 178 x(detectable)S 177 x +(by)S 178 x(XIE)S 177 x(and)S 178 x(are)S 178 x(of)S 177 x(interest)S +177 x(to)S 178 x(the)S 598 y 4796 X(client.)S 14729 Y 3600 X F36 +(2.2.2.2.)S 2 x(10.1)S 598 x(Event)S 166 x(Noti\211catio)S 2 x(n)S +166 x(to)S 166 x(Client)S 897 y 4796 X F151(There)S 168 x(are)S 167 x +(three)S 167 x(events)S 168 x(de\211ned)S 168 x(in)S 167 x(XIE.)S +167 x(The)S 168 x(COR)S -2 x(E)S 167 x(X)S 167 x(routine,)S 168 x(W)S +-27 x(riteEventsT)S -46 x(oClient,)S 168 x(allows)S 166 x(XIE)S 597 y +4796 X(to)S 165 x(send)S 166 x(events)S 167 x(to)S 166 x +(interesting)S 166 x(clients:)S 17419 Y 5692 X(W)S -28 x +(riteEventsT)S -45 x(oClient)S 166 x(\(client,)S 166 x(count,)S 167 x +(events)S +(\))S 897 y 4796 X(Client)S 155 x(is)S 155 x(the)S 156 x(client)S +157 x(structure,)S 158 x(count)S 157 x(is)S 155 x(the)S 156 x +(number)S 157 x(of)S 156 x(events)S 156 x(to)S 156 x(send)S 156 x +(\(usually)S 156 x(one\),)S 159 x(and)S 156 x(events)S 156 x(is)S +597 y 4796 X(a)S 167 x(pointer)S 168 x(to)S 167 x(the)S 168 x +(particular)S 167 x(event)S 169 x(structure)S 168 x(\(see)S 167 x +(Appendix)S 167 x(D\).)S 168 x(XIE)S 166 x(will)S 167 x(load)S 168 x +(the)S 167 x(event)S 168 x(structure)S 598 y 4796 X(with)S 165 x +(the)S 166 x(pertinent)S 167 x(data)S 165 x(before)S 167 x(invoking)S +168 x(W)S -28 x(riteEventsT)S -46 x(oClient.)S 897 y 4796 X(If)S +168 x(swapping)S 169 x(is)S 169 x(necessary)S -55 x(,)S 170 x(this)S +169 x(routine)S 170 x(will)S 168 x(call)S 169 x(EventSwapV)S -47 x +(ector[code])S 170 x(for)S 169 x(the)S 169 x(particular)S 169 x +(event)S 597 y 4796 X(code)S 174 x(\(de\211ned)S 176 x(during)S 176 x +(XieInit)S +(\).)S 266 x(Therefore)S 176 x(XIE)S 174 x(must)S 174 x(tell)S 174 x +(the)S 175 x(CORE)S 174 x(X)S 174 x(about)S 175 x(the)S 175 x +(routine)S 175 x(which)S 598 y 4796 X(does)S 172 x(the)S 173 x +(swapping)S 173 x(for)S 173 x(each)S 173 x(event)S 174 x(that)S 173 x +(XIE)S 172 x(de\211nes.)S 264 x(This)S 173 x(is)S 172 x(done)S 174 x +(during)S 174 x(the)S 173 x(XieInit)S 172 x(phase)S 173 x(by)S 598 y +4796 X(setting)S 167 x(the)S 168 x(CORE)S 167 x(X)S 167 x(array)S +169 x(entry)S 169 x(EventSwapV)S -47 x(ector[code])S 168 x(to)S 168 x +(the)S 168 x(XIE)S 167 x(procedure)S 169 x(that)S 168 x(swaps)S 166 x +(that)S 598 y 4796 X(particular)S 179 x(event)S 180 x(code.)S 277 x +(This)S 180 x(procedure)S 180 x(is)S 179 x(called)S 179 x(with)S +179 x(three)S 180 x(arguments:)S 277 x(client)S 180 x(structure,)S +183 x(the)S 598 y 4796 X(count)S 172 x(\(as)S 172 x(stated)S 171 x +(above\))S 173 x(and)S 172 x(a)S 172 x(pointer)S 173 x(to)S 172 x +(the)S 172 x(event\(s\).)S 262 x(Each)S 173 x(event)S 172 x +(swapping)S 172 x(routine)S 173 x(will)S 172 x(have)S 597 y 4796 X +(an)S 166 x(entry)S 167 x(name)S 166 x(of)S 166 x(the)S 166 x(form)S +166 x(SwapXxxEvent.)S 897 y 4796 X(Only)S 180 x(events)S 181 x(that)S +180 x(the)S 180 x(client)S 180 x(has)S 180 x(expressed)S 181 x +(interest)S 179 x(in)S 181 x(will)S 179 x(be)S 181 x(sent.)S 277 x +(This)S 181 x(is)S 179 x(accomplished)S 180 x(be)S 598 y 4796 X +(using)S 164 x(the)S 163 x(client_table)S 164 x(entry)S 164 x +(\211eld)S 164 x(-)S 163 x(eventMask)S 165 x(\(see)S 163 x(Appendix)S +164 x(D\).)S 163 x(The)S 164 x(DIX)S 163 x(will)S 162 x(use)S 164 x +(the)S 164 x(client)S 163 x(ID)S 597 y 4796 X(to)S 165 x(\211nd)S +167 x(the)S 166 x(client_table)S 166 x(entry)S 167 x(which)S 166 x +(will)S 166 x(point)S 166 x(to)S 166 x(the)S 166 x(eventMask)S 167 x +(for)S 166 x(this)S 166 x(client.)S 897 y 4796 X(The)S 171 x(event)S +172 x(mask)S 170 x(as)S 171 x(de\211ned)S 171 x(by)S 172 x(the)S +171 x(protocol)S 171 x(\(client\))S 171 x(will)S 170 x(be)S 171 x +(stored)S 170 x(within)S 171 x(this)S 170 x(table)S 171 x(and)S 171 x +(will)S 170 x(be)S 598 y 4796 X(used)S 171 x(to)S 171 x(indicate)S +172 x(whether)S 172 x(the)S 171 x(client)S 172 x(wishes)S 170 x(for)S +172 x(a)S 171 x(particular)S 172 x(event)S 172 x(to)S 172 x(be)S +171 x(sent)S 171 x(\(see)S 172 x(Appendix)S 171 x(C\).)S 598 y 4796 X +(This)S 166 x(mask)S 166 x(is)S 165 x(set)S 166 x(by)S 166 x +(XIEP_SELECT_EV)S -2 x(ENTS.)S 35879 Y 3600 X F40(2\20320)S 449 x +(DIX/XIE)S 165 x(Component)S +PP +EP +%%DOC$Page: 2-21 33 +1000 BP 39600 30600 PM 0 0 XY +5171 Y 3600 X F36(2.2.2.2.)S 2 x(10.2)S 598 x(XIEP_SE)S 2 x +(LECT_EVENTS)S 896 y 4796 X F151(Several)S 173 x(XIE)S 172 x +(requests)S 172 x(can)S 173 x(generate)S 174 x(events,)S 175 x +(however)S -36 x(,)S 175 x(an)S 173 x(event)S 173 x(will)S 172 x(be)S +173 x(sent)S 173 x(to)S 172 x(the)S 173 x(client)S 173 x(if)S 173 x +(and)S 598 y 4796 X(only)S 170 x(if)S 170 x(the)S 171 x(client)S +170 x(has)S 170 x(expressed)S 170 x(interest)S 170 x(in)S 170 x(the)S +171 x(event.)S 258 x(Thus)S 171 x(any)S 171 x(request)S 170 x(which)S +170 x(can)S 171 x(potentially)S 598 y 4796 X(send)S 188 x(an)S 189 x +(event)S 190 x(will)S 188 x(read)S 189 x(the)S 189 x(event)S 189 x +(mask)S 189 x(from)S 188 x(the)S 189 x(client_table)S 189 x(entry)S +189 x(\211eld)S 189 x(to)S 189 x(determine)S 189 x(if)S 598 y 4796 X +(it)S 182 x(should)S 183 x(send)S 183 x(the)S 183 x(event.)S 284 x +(The)S 184 x(client)S 183 x(is)S 182 x(able)S 183 x(to)S 183 x(set)S +182 x(this)S 182 x(mask)S 183 x(via)S 183 x(a)S 183 x(call)S 183 x +(to)S 183 x(XIEP_SELE)S -2 x(CT_)S 597 y 4796 X(EVE)S -2 x(NTS.)S +897 y 4796 X(The)S 173 x(XIEP_SELEC)S -2 x(T_EVENTS)S 172 x(request)S +173 x(will)S 172 x(load)S 172 x(the)S 173 x(client)S 173 x(passed)S +172 x(event)S 173 x(mask)S 172 x(into)S 173 x(the)S 173 x(client_)S +598 y 4796 X(table)S 165 x(entry)S 167 x(\211eld)S 166 x(-)S 166 x +(eventMask.)S 12344 Y 3600 X F36(2.2.2.2.)S 2 x(10.3)S 598 x +(XIEP_QUER)S -18 x(Y_EVENTS)S 896 y 4796 X F151(This)S 165 x +(request)S 165 x(is)S 165 x(for)S 165 x(clients)S 165 x(to)S 165 x +(determine)S 165 x(which)S 166 x(events)S 166 x(it)S 164 x(has)S +166 x(expressed)S 165 x(interest)S 165 x(in)S 165 x(being)S 166 x +(noti\211ed)S 598 y 4796 X(of.)S 253 x(This)S 167 x(request)S 168 x +(will)S 167 x(return)S 169 x(the)S 168 x(event)S 169 x(mask)S 167 x +(resident)S 168 x(in)S 168 x(the)S 168 x(client_table)S 168 x(back)S +168 x(to)S 167 x(the)S 168 x(requesting)S 598 y 4796 X(client.)S +35879 Y 21216 X F40(DIX/XIE)S 165 x(Component)S 448 x(2\20321)S +PP +EP +%%DOC$Page: 3-1 34 +1000 BP 39600 30600 PM 0 0 XY +9007 Y 3600 X F24(Chapter)S 498 x(3)S 10651 Y 3600 X(DDX)S 165 x +(Component)S 13494 Y 4796 X F151(This)S 166 x(component)S 166 x +(represents)S 166 x(the)S 166 x(device)S 167 x(dependent)S 167 x +(component)S 166 x(of)S 166 x(the)S 166 x(extension.)S 896 y 4796 X +(For)S 180 x(this)S 179 x(implementation,)S 183 x(entries)S 180 x +(into)S 179 x(this)S 179 x(subcomponent)S 181 x(will)S 178 x +(comprise)S 180 x(of)S 179 x(a)S 180 x(subset)S 179 x(of)S 179 x +(lower)S 598 y 4796 X(level)S 159 x(image)S 158 x(processing)S 159 x +(routines)S 159 x(which)S 159 x(will)S 158 x(be)S 159 x(called)S +158 x(from)S 159 x(either)S 159 x(the)S 159 x(DIX)S 157 x(Request)S +158 x(procedures)S 159 x(or)S 598 y 4796 X(from)S 167 x(procedures)S +167 x(within)S 167 x(XIE_UTILS.C.)S 167 x(Entry)S 168 x(to)S 167 x +(DDX)S 165 x(procedures)S 168 x(is)S 167 x(made)S 167 x(via)S 167 x +(a)S 167 x(table)S 167 x(of)S 167 x(entries)S 598 y 4796 X(called)S +165 x(the)S 167 x(procedure)S 167 x(vector)S 166 x(table.)S 896 y +4796 X(Although)S 174 x(this)S 173 x(document)S 175 x(does)S 173 x +(not)S 174 x(address)S 173 x(the)S 174 x(machine)S 174 x(dependent)S +174 x(design,)S 177 x(it)S 173 x(should)S 174 x(be)S 174 x(stated)S +598 y 4796 X(that)S 183 x(it)S 184 x(is)S 184 x(at)S 183 x(this)S +184 x(level)S 184 x(where)S 185 x(hardware)S 184 x(related)S 184 x +(tasks)S 183 x(get)S 184 x(execu)S 2 x(ted.)S 285 x(That)S 184 x +(is,)S 189 x(the)S 184 x(procedure)S 598 y 4796 X(vectors)S 167 x +(will)S 167 x(either)S 168 x(be)S 167 x(the)S 168 x(entries)S 167 x +(to)S 167 x(the)S 168 x(lower)S 167 x(level)S 167 x(image)S 168 x +(processing)S 168 x(routines)S 168 x(and/or)S 168 x(hardware)S 597 y +4796 X(routines)S 161 x(to)S 161 x(perform)S 162 x(the)S 161 x +(various)S 162 x(tasks.)S 249 x(This)S 162 x(implies)S 160 x(that)S +162 x(at)S 161 x(server/exten)S 2 x(sion)S 161 x(initialization)S +161 x(time,)S 598 y 4796 X(the)S 167 x(extension)S 168 x(must)S 167 x +(recogn)S 2 x(ize)S 167 x(the)S 167 x(fact)S 168 x(that)S 167 x(it)S +167 x(may)S 168 x(have)S 168 x(hardware)S 168 x(resources,)S 168 x +(and)S 168 x(if)S 167 x(so,)S 168 x(load)S 167 x(the)S 598 y 4796 X +(appropriate)S 171 x(procedure)S 173 x(vector)S -36 x(.)S 261 x +(Since)S 172 x(such)S 173 x(routines)S 172 x(must)S 172 x(have)S +172 x(knowledge)S 173 x(about)S 172 x(the)S 172 x(particular)S 598 y +4796 X(device)S 166 x(used,)S 167 x(these)S 166 x(reside)S 165 x +(within)S 166 x(the)S 167 x(DDX)S 164 x(component)S 167 x(and)S 166 x +(are)S 166 x(said)S 166 x(to)S 166 x(be)S 166 x(machine)S 167 x +(dependent.)S 896 y 4796 X(Note:)S 268 x(For)S 176 x(severe)S 176 x +(hardware)S 176 x(related)S 176 x(errors,)S 179 x(this)S 175 x +(level)S 176 x(must)S 175 x(set)S 175 x(a)S 176 x(client)S 176 x +(structure)S 176 x(\211eld,)S 179 x(client-)S 598 y 4796 X +(>noClientException,)S 171 x(to)S 170 x(the)S 170 x(errorcode.)S +257 x(This)S 170 x(will)S 169 x(cause)S 170 x(the)S 170 x(CORE)S +169 x(X)S 169 x(scheduler)S 170 x(to)S 170 x(shutdown)S 170 x(the)S +598 y 4796 X(client)S 166 x(connection.)S 25299 Y 3600 X F28(3.1)S +599 x(Procedure)S 166 x(V)S -33 x(ector)S 167 x(T)S -44 x(able)S +26545 Y 4796 X F151(The)S 172 x(procedure)S 172 x(vector)S 173 x +(table)S 171 x(consists)S 171 x(of)S 171 x(entries)S 172 x(to)S 171 x +(two)S 171 x(classes)S 171 x(of)S 171 x(XIE)S 171 x(functions:)S +261 x(low)S 171 x(level)S 172 x(math)S 597 y 4796 X(tools)S 181 x +(\(e.g.)S 281 x(add,)S 186 x(sub)S 181 x(etc.\))S 281 x(and)S 182 x +(higher)S 183 x(level)S 182 x(functions)S 182 x(such)S 182 x(as)S +181 x(decompression,)S 186 x(scaling,)S 186 x(image)S 598 y 4796 X +(rotation)S 173 x(etc..)S 265 x(Each)S 173 x(of)S 174 x(these)S 173 x +(procedures)S 174 x(will)S 172 x(de\211ne)S 174 x(a)S 174 x(minimum)S +173 x(set)S 173 x(of)S 173 x(argumen)S 2 x(ts)S 172 x(necessary)S +174 x(to)S 598 y 4796 X(carry)S 169 x(out)S 169 x(its)S 168 x +(function.)S 256 x(The)S 170 x(exact)S 169 x(speci\211cation)S 169 x +(of)S 169 x(the)S 169 x(arguments)S 169 x(will)S 169 x(be)S 168 x +(determined)S 169 x(later)S -37 x(,)S 170 x(how-)S 598 y 4796 X +(ever)S -37 x(,)S 173 x(it)S 170 x(is)S 170 x(envisioned)S 171 x +(that)S 170 x(the)S 171 x(image)S 171 x(inputs)S 170 x(to)S 171 x +(the)S 170 x(DDX)S 170 x(function)S 171 x(will)S 170 x(most)S 170 x +(likely)S 171 x(pointers)S 170 x(to)S 171 x(a)S 597 y 4796 X +(structure)S 165 x(that)S 165 x(de\211nes)S 165 x(the)S 166 x +(organization)S 165 x(and)S 166 x(type)S 165 x(of)S 165 x(data.)S +249 x(T)S -45 x(o)S 165 x(that)S 165 x(end,)S 166 x(each)S 165 x +(DDX)S 164 x(function)S 166 x(must)S 598 y 4796 X(support)S 172 x(a)S +173 x(set)S 172 x(of)S 173 x(recognized)S 173 x(data)S 173 x(types:)S +263 x(XieK_Bit)S -2 x(stream,)S 175 x(XieK_ByteImage,)S 174 x +(XieK_W)S -28 x(ordImage,)S 598 y 4796 X(XieK_LongImage,)S 167 x +(and)S 167 x(XieK_FloatImage.)S 251 x(In)S 167 x(particular)S -37 x +(,)S 167 x(some)S 167 x(permutations)S 166 x(of)S 167 x(integer)S +168 x(and)S 166 x(\212oat)S 598 y 4796 X(must)S 166 x(be)S 166 x +(supported.)S 250 x(For)S 167 x(example,)S 167 x(ADD)S 166 x(must)S +166 x(support)S 166 x(integer)S 167 x(in)S 167 x(and)S 167 x +(\212oat)S 166 x(out,)S 168 x(\212oat)S 166 x(in)S 167 x(and)S 167 x +(\212oat)S 598 y 4796 X(out,)S 166 x(etc.)S 250 x(See)S 166 x +(Appendix)S 166 x(G)S 166 x(for)S 166 x(a)S 166 x(description)S 166 x +(of)S 166 x(the)S 166 x(DDX)S 165 x(support)S 166 x(of)S 166 x(data)S +165 x(formats/types.)S 896 y 4796 X(The)S 171 x(DDX)S 169 x +(functions)S 170 x(will)S 170 x(presume)S 170 x(that)S 171 x(the)S +170 x(arguments)S 171 x(as)S 170 x(valid)S 171 x(since)S 170 x(it)S +170 x(will)S 170 x(be)S 170 x(the)S 171 x(DIX)S 169 x(respon-)S 598 y +4796 X(sibility)S 165 x(to)S 166 x(perform)S 166 x(argument)S 167 x +(checkin)S 2 x(g.)S 35879 Y 22114 X F40(DDX)S 165 x(Component)S 448 x +(3)S +(\2031)S +PP +EP +%%DOC$Page: 3-2 35 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(Figure)S 167 x(3\2031)S 166 x(outlines)S 166 x +(the)S 166 x(\212ow)S 166 x(of)S 166 x(the)S 166 x(DDX)S 165 x +(component)S 167 x(in)S 166 x(relationship)S 166 x(to)S 166 x(the)S +166 x(DIX)S 165 x(component.)S 8368 Y 4796 X F36(Figure)S 167 x +(3\2031:)S 498 x(DDX)S 165 x(Subco)S 2 x(mponents)S 548 y 4796 X +22116 24 R 9839 Y 5274 X F102(+-----------+)S 479 x(+-----------)S +2 x(+)S 478 x(+-----------+)S 16990 X(+-----------+)S 449 y 5274 X +(|)S 717 x(DIX)S 8143 X(|)S 478 x(|)S 10056 X(DIX)S 11730 X(|)S 478 x +(|)S 717 x(DIX)S 15316 X(|)S 16990 X(|)S 717 x(DIX)S 19859 X(|)S +448 y 5274 X(|)S 239 x(Transport)S 240 x(|)S 478 x(|)S 479 x +(Process)S 479 x(|)S 478 x(|Statistics)S 240 x(|)S 239 x(....)S 240 x +(|)S 478 x(Other)S 19859 X(|)S 448 y 5274 X(|)S 239 x(Services)S +479 x(|)S 478 x(|)S 239 x(Services)S 480 x(|)S 478 x(|)S 239 x +(Services)S 479 x(|)S 16990 X(|)S 478 x(Services)S 240 x(|)S 449 y +5274 X(+-----------+)S 479 x(+-----------)S 2 x(+)S 478 x +(+-----------+)S 16990 X(+-----------+)S 448 y 6708 X(^)S 10295 X(^)S +13881 X(^)S 18424 X(^)S 448 y 6708 X(|)S 10295 X(|)S 13881 X(|)S +18424 X(|)S 449 y 6708 X(v)S 10295 X(v)S 13881 X(v)S 18424 X(|)S +448 y 5274 X(+-----------------)S 2 x(-------------------)S 2 x +(-----+)S 18424 X(|)S 448 y 5274 X(|)S 8143 X(Procedure)S 479 x +(Vectors)S 15316 X(|<-----------+)S 449 y 5274 X(+-----------------)S +2 x(-------------------)S 2 x(-----+)S 448 y 10295 X(^)S 448 y -239 x +(|)S 449 y -239 x(v)S 448 y 5274 X(+-----------------)S 2 x +(-------------------)S 2 x(-----+)S 448 y 5274 X(|)S 478 x(Lower)S +240 x(Level)S 239 x(Image)S 240 x(Processing)S 240 x(Routines)S 479 x +(|)S 449 y 5274 X(+-----------------)S 2 x(-------------------)S +2 x(-----+)S 622 y 4796 X 22116 24 R 897 y 4796 X F151(The)S 166 x +(following)S 166 x(represents)S 166 x(the)S 167 x(procedure)S 166 x +(table:)S 20873 Y 4796 X F36(T)S -37 x(able)S 150 x(3\2031:)S 498 x +(DDX)S 149 x(Procedure)S 150 x(V)S -27 x(ector)S 149 x(T)S -36 x +(able)S 224 y 4796 X 22116 24 R +XP +% DefineFont:F157 Category:10 PointSize:9 +/NewCenturySchlbk-Bold /NewCenturySchlbk-Bold@DOCPSE DOCPSE ReENCODE +/F157 450.0 /NewCenturySchlbk-Bold@DOCPSE DPSF +RP +4796 21695 XY F157(ROUTINE)S 13363 X(FUNCTION)S 299 y 4796 X +22116 24 R +XP +% DefineFont:F155 Category:10 PointSize:9 +/F155 450.0 /NewCenturySchlbk-Roman@DOCPSE DPSF +RP +4796 22592 XY F155(_POINT)S 13363 X(remap)S 150 x(input)S 150 x(IOB)S +150 x(to)S 150 x(output)S 150 x(IOB)S 747 y 4796 X(_AREA)S 13363 X +(appl)S 2 x(y)S 149 x(area)S 150 x(operators)S 150 x(to)S 150 x +(input)S 151 x(IOB)S 149 x(and)S 150 x(store)S 150 x(to)S 150 x +(output)S 150 x(IOB)S 747 y 4796 X(_ARITH)S 13363 X(perform)S 137 x +(arithmetic)S 138 x(operation)S 138 x(on)S 136 x(two)S 136 x(IOBs)S +136 x(or)S 137 x(IOB)S 136 x(and)S 136 x(a)S 137 x(constant)S 548 y +13363 X(and)S 150 x(store)S 150 x(to)S 150 x(output)S 151 x(IOB)S +747 y 4796 X(_COMP)S -34 x(ARE)S 13363 X(comparing)S 171 x(two)S +170 x(IOBs)S 170 x(or)S 170 x(one)S 170 x(IOB)S 170 x(and)S 171 x(a)S +170 x(constant)S 171 x(and)S 171 x(store)S 548 y 13363 X(boolea)S +2 x(n)S 149 x(result)S 150 x(to)S 150 x(a)S 149 x(2D)S 150 x +(boolean)S 150 x(bitmap)S 747 y 4796 X(_LOGICAL)S 13363 X(perform)S +161 x(logical)S 161 x(operat)S 2 x(ion)S 160 x(on)S 160 x(two)S 161 x +(IOBs)S 160 x(or)S 160 x(one)S 160 x(IOB)S 161 x(and)S 160 x(a)S +161 x(con-)S 548 y 13363 X(stant)S 150 x(and)S 150 x(store)S 150 x +(to)S 150 x(output)S 151 x(IOB)S 747 y 4796 X(_MA)S -25 x(THF)S +13363 X(appl)S 2 x(y)S 155 x(mathematical)S 156 x(function)S 157 x +(on)S 155 x(input)S 156 x(IOB)S 156 x(and)S 156 x(store)S 156 x(to)S +156 x(output)S 548 y 13363 X(IOB)S 748 y 4796 X(_DECOMPRE)S -2 x(SS)S +13363 X(decompress)S 150 x(input)S 150 x(IOB)S 149 x(and)S 150 x +(store)S 150 x(to)S 150 x(output)S 151 x(IOB)S 747 y 4796 X(_SCALE)S +13363 X(scale)S 150 x(input)S 150 x(IOB)S 150 x(and)S 150 x(store)S +149 x(to)S 150 x(output)S 151 x(IOB)S 747 y 4796 X(_ROT)S -25 x(A)S +-25 x(TE)S 13363 X(rotat)S 2 x(e)S 149 x(input)S 150 x(IOB)S 150 x +(and)S 150 x(store)S 150 x(to)S 149 x(output)S 151 x(IOB)S 747 y +4796 X(_MIRROR)S 13363 X(\212ip)S 150 x(input)S 150 x(IOB)S 150 x +(and)S 150 x(store)S 150 x(to)S 150 x(output)S 150 x(IOB)S 747 y +4796 X(_CROP)S 13363 X(crop)S 150 x(input)S 151 x(IOB)S 149 x(and)S +150 x(store)S 150 x(to)S 150 x(output)S 150 x(IOB)S 35879 Y 3600 X +F40(3\2032)S 449 x(DDX)S 149 x(Component)S +PP +EP +%%DOC$Page: 3-3 36 +1000 BP 39600 30600 PM 0 0 XY +5393 Y 4796 X F36(T)S -37 x(able)S 150 x(3\2031)S 150 x(\(Cont.\):)S +498 x(DDX)S 149 x(Procedure)S 150 x(V)S -27 x(ector)S 149 x(T)S -36 x +(able)S 224 y 4796 X 22116 24 R 598 y 4796 X F157(ROUTINE)S 13363 X +(FUNCTION)S 299 y 4796 X 22116 24 R 747 y 4796 X F155(_TRANSLA)S +-25 x(TE)S 13363 X(overlay)S 156 x(two)S 156 x(IOBs)S 155 x(or)S +156 x(one)S 156 x(IOB)S 155 x(and)S 156 x(constant)S 156 x(and)S +156 x(store)S 156 x(to)S 156 x(output)S 548 y 13363 X(IOB)S 747 y +4796 X(_CONSTRAIN)S 13363 X(appl)S 2 x(y)S 149 x(quantization)S 151 x +(on)S 149 x(input)S 150 x(IOB)S 150 x(and)S 150 x(store)S 149 x(to)S +150 x(output)S 151 x(IOB)S 748 y 4796 X(_MA)S -25 x(TCH_HIS)S 2 x +(TOGRAM)S 13363 X(appl)S 2 x(y)S 161 x(transformation)S 162 x(on)S +161 x(input)S 162 x(IOB)S 162 x(to)S 162 x(conform)S 161 x(with)S +162 x(speci\211ed)S 548 y 13363 X(histogram)S 150 x(form)S 149 x +(and)S 150 x(store)S 150 x(to)S 150 x(output)S 150 x(IOB)S 747 y +4796 X(_CHROMINANCE_SEP)S -33 x(ARA)S -26 x(TE)S 13363 X(create)S +151 x(3)S 150 x(IOBs)S 148 x(from)S 150 x(multispectral)S 151 x(IOB)S +747 y 4796 X(_CHROMINANCE_COMBINE)S 13363 X(combine)S 150 x(3)S 150 x +(IOBs)S 149 x(to)S 150 x(multispectral)S 151 x(IOB)S 747 y 4796 X +(_DITHER)S 13363 X(reduce)S 150 x(number)S 150 x(of)S 150 x(levels)S +149 x(of)S 150 x(input)S 150 x(IOB)S 150 x(and)S 150 x(store)S 149 x +(to)S 150 x(output)S 151 x(IOB)S 747 y 4796 X(_LUMINANCE)S 13363 X +(extract)S 152 x(luminance)S 152 x(component)S 151 x(of)S 152 x +(polychromatic)S 152 x(IOB)S 151 x(and)S 152 x(store)S 151 x(to)S +548 y 13363 X(output)S 151 x(IOB)S 747 y 4796 X(_CALC_HISTOGRAM)S +13363 X(generates)S 150 x(histogram)S 150 x(of)S 149 x(input)S 151 x +(IOB)S 748 y 4796 X(_POINT_ST)S -24 x(A)S -25 x(TISTI)S 2 x(CS)S +13363 X(generate)S 151 x(statistics)S 150 x(for)S 150 x(an)S 149 x +(IOB)S 747 y 4796 X(_AREA)S -2 x(_ST)S -24 x(A)S -25 x(TISTI)S 2 x +(CS)S 13363 X(generate)S 151 x(statistical)S 151 x(IOB)S 149 x(from)S +149 x(input)S 151 x(IOB)S 747 y 4796 X(_DISPLA)S -41 x(Y_SEQUENCE)S +13363 X(display)S 150 x(time)S 150 x(sequences)S 149 x(of)S 150 x +(pixmaps)S 747 y 4796 X(_SELECT_EVE)S -2 x(NTS)S 13363 X(select)S +150 x(which)S 150 x(events)S 149 x(to)S 150 x(be)S 150 x(noti\211ed)S +150 x(of)S 747 y 4796 X(_QUER)S -17 x(Y_EVE)S -2 x(NTS)S 13363 X +(query)S 150 x(which)S 149 x(events)S 150 x(have)S 149 x(been)S 150 x +(set)S 150 x(for)S 150 x(noti\211cation)S 748 y 4796 X(_COMPRESS)S +13363 X(compress)S 149 x(input)S 150 x(IOB)S 150 x(-)S 150 x(DIX)S +149 x(private)S 747 y 4796 X(_FLOA)S -25 x(T_DA)S -25 x(T)S -25 x(A)S +13363 X(\212oat)S 151 x(buffer)S 150 x(-)S 150 x(DIX)S 149 x +(private)S 747 y 4796 X(_MUL)S -24 x(TIPLE_REQUEST)S 13363 X +(hardware)S 151 x(dependent)S 151 x(routine)S 399 y 4796 X +22116 24 R 35879 Y 22114 X F40(DDX)S 165 x(Component)S 448 x(3\2033)S +PP +EP +%%DOC$Page: 3-4 37 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(Some)S 179 x(of)S 180 x(these)S 180 x(vectors)S +181 x(represent)S 180 x(those)S 180 x(functions)S 180 x(that)S 180 x +(may)S 181 x(have)S 180 x(accelerators)S 181 x(to)S 179 x(perform)S +181 x(the)S 598 y 4796 X(client)S 175 x(image)S 175 x(request.)S +267 x(If)S 174 x(the)S 175 x(accelerators)S 175 x(exist,)S 177 x +(the)S 175 x(DIX)S 174 x(must)S 175 x(load)S 174 x(the)S 175 x +(appropriate)S 175 x(procedure)S 597 y 4796 X(vector)S 184 x(with)S +183 x(the)S 183 x(entry)S 184 x(of)S 184 x(the)S 183 x(routine)S +184 x(which)S 184 x(uses)S 183 x(the)S 183 x(accelerators)S 184 x +(to)S 183 x(perform)S 183 x(the)S 184 x(particular)S 598 y 4796 X +(function.)S 250 x(This)S 166 x(will)S 165 x(be)S 166 x(done)S 167 x +(at)S 166 x(XieDeviceInit)S 165 x(time.)S 897 y 4796 X(Note:)S 260 x +(These)S 172 x(vectors)S 172 x(represent)S 172 x(a)S 171 x(superset)S +171 x(of)S 172 x(those)S 171 x(functions)S 172 x(that)S 171 x(are)S +172 x(within)S 172 x(the)S 171 x(XIE)S 171 x(protocol.)S 598 y 4796 X +(There)S 171 x(exist)S 171 x(DDX)S 170 x(functions)S 171 x(which)S +171 x(can)S 171 x(not)S 171 x(explicitly)S 172 x(be)S 171 x(called)S +170 x(by)S 172 x(the)S 171 x(client)S 171 x(\(decompress,)S 172 x +(\212oat_)S 597 y 4796 X(data)S 165 x(etc.\))S 897 y 4796 X(For)S +167 x(those)S 168 x(functions)S 167 x(\(if)S 167 x(any\))S 169 x +(that)S 167 x(are)S 167 x(not)S 168 x(supported,)S 168 x(XIE)S 166 x +(during)S 169 x(initialization)S 166 x(time)S 167 x(\(via)S 168 x +(XieInit\))S 598 y 4796 X(must)S 165 x(insert)S 166 x(a)S 166 x +(NotImplemented)S 165 x(procedure)S 167 x(which)S 167 x(returns)S +166 x(a)S 166 x(BadRequest)S 165 x(error)S -36 x(.)S 896 y 4796 X +(The)S 174 x(DDX)S 173 x(component)S 175 x(must)S 174 x(always)S +173 x(return)S 175 x(to)S 174 x(the)S 174 x(DIX)S 173 x(component)S +175 x(so)S 174 x(that)S 174 x(status)S 173 x(can)S 175 x(return)S +175 x(to)S 598 y 4796 X(the)S 166 x(CORE)S 164 x(X)S 166 x +(dispatcher)S -37 x(.)S 14430 Y 3600 X F28(3.1.1)S 599 x(Lower)S +167 x(Level)S 167 x(Image)S 168 x(Processing)S 167 x(Routines)S +15526 Y 4796 X F151(For)S 172 x(this)S 171 x(implementation)S 172 x +(these)S 172 x(procedures)S 172 x(will)S 171 x(be)S 172 x +(implemented)S 171 x(by)S 173 x(software.)S 260 x(There)S 173 x +(will)S 171 x(be)S 172 x(no)S 598 y 4796 X(accelerators)S 166 x(for)S +166 x(this)S 166 x(implementation.)S 18664 Y 3600 X F28(3.2)S 599 x +(DIX/DD)S -2 x(X)S 166 x(Interface)S 19910 Y 4796 X F151(All)S 184 x +(DDX)S 183 x(routines)S 185 x(will)S 185 x(use)S 184 x(the)S 185 x +(protocol)S 185 x(document)S 186 x(as)S 184 x(a)S 185 x(functional)S +185 x(guide.)S 288 x(The)S 186 x(semantics)S 184 x(of)S 597 y 4796 X +(operation)S 182 x(\(integer)S 184 x(vs.)S 283 x(\212oat\))S 183 x +(will)S 182 x(be)S 182 x(determined)S 183 x(by)S 183 x(the)S 183 x +(data_type)S 183 x(\211eld)S 183 x(within)S 182 x(the)S 183 x +(speci\211ed)S 598 y 4796 X(IOB)S -2 x(\(s\).)S 249 x(All)S 166 x +(input)S 166 x(constants)S 166 x(will)S 165 x(be)S 166 x +(represented)S 167 x(by)S 166 x(integer)S 167 x(unless)S 166 x +(deemed)S 166 x(otherwise.)S 35879 Y 3600 X F40(3\2034)S 449 x(DDX)S +166 x(Compon)S -2 x(ent)S +PP +EP +%%DOC$Page: 4-1 38 +1000 BP 39600 30600 PM 0 0 XY +9007 Y 3600 X F24(Chapter)S 498 x(4)S 10651 Y 3600 X(Operating)S +166 x(System)S 165 x(Considerations)S 13494 Y 4796 X F151(This)S +166 x(chapter)S 166 x(addresses)S 165 x(some)S 166 x(operating)S +167 x(system)S 165 x(dependencies)S 167 x(in)S 166 x(the)S 166 x +(implementation)S 166 x(of)S 166 x(XIE.)S 16034 Y 3600 X F28(4.1)S +599 x(Memory)S 166 x(Manag)S 2 x(ement)S 17279 Y 4796 X F151 +(Allocation,)S 154 x(reallocation)S 152 x(and)S 151 x(deallocation)S +152 x(of)S 151 x(memory)S 152 x(is)S 151 x(performed)S 151 x(by)S +152 x(using)S 152 x(the)S 151 x(CORE)S 150 x(X)S 151 x(routines)S +598 y 4796 X(Xalloc,)S 166 x(Xrealloc)S 166 x(and)S 166 x(Xfree,)S +166 x(respectively)S -54 x(.)S 20418 Y 3600 X F28(4.2)S 599 x +(Linking)S 167 x(and)S 167 x(Loadin)S 2 x(g)S 166 x(XIE)S 21663 Y +4796 X F151(There)S 176 x(exist)S 176 x(two)S 175 x(ways)S 175 x(an)S +176 x(extension)S 176 x(can)S 177 x(be)S 175 x(loaded)S 176 x(with)S +175 x(the)S 176 x(server:)S 269 x(linked)S 177 x(during)S 177 x(the)S +175 x(linking)S 598 y 4796 X(of)S 169 x(the)S 169 x(server)S 169 x +(and)S 170 x(loaded)S 169 x(at)S 168 x(runtime)S 170 x(using)S 170 x +(sharable)S 169 x(images.)S 255 x(This)S 169 x(document)S 170 x(has)S +169 x(addressed)S 168 x(the)S 598 y 4796 X(linked)S 171 x(method)S +170 x(since)S 171 x(we)S 170 x(intend)S 171 x(to)S 171 x(develop)S +171 x(the)S 171 x(initial)S 170 x(version)S 172 x(under)S 171 x +(Ultrix)S 171 x(and)S 171 x(Ultrix)S 171 x(does)S 170 x(not)S 597 y +4796 X(support)S 165 x(sharable)S 166 x(images.)S 25997 Y 3600 X F28 +(4.3)S 599 x(Hardware)S 166 x(Considerations)S 27242 Y 4796 X F151 +(Although)S 155 x(this)S 155 x(document')S -19 x(s)S 155 x(goal)S +155 x(is)S 154 x(to)S 155 x(address)S 154 x(the)S 154 x(machine)S +156 x(independent)S 155 x(implementation,)S 157 x(we)S 155 x(have)S +598 y 4796 X(attempted)S 166 x(to)S 168 x(address)S 167 x(some)S +168 x(of)S 168 x(the)S 168 x(implications)S 167 x(of)S 168 x(the)S +168 x(current)S 169 x(model)S 167 x(on)S 169 x(other)S 168 x +(implementations.)S 598 y 4796 X(As)S 178 x(an)S 180 x(example)S +180 x(of)S 180 x(this)S 179 x(we)S 179 x(have)S 181 x(provided)S +180 x(a)S 180 x(multiple)S 179 x(request)S 180 x(function)S 180 x +(in)S 180 x(the)S 180 x(DDX)S 178 x(procedure)S 597 y 4796 X(vector)S +189 x(table.)S 293 x(This)S 189 x(is)S 188 x(intended)S 189 x(as)S +188 x(a)S 188 x(possible)S 187 x(way)S 189 x(for)S 188 x(handling)S +190 x(hardware)S 188 x(devices)S 189 x(that)S 188 x(can)S 598 y +4796 X(perform)S 166 x(several)S 167 x(functions)S 168 x(at)S 166 x +(once)S 167 x(such)S 168 x(as)S 166 x(scaling)S 167 x(and)S 167 x +(rotating.)S 252 x(More)S 167 x(importantly)S 167 x(it)S 166 x +(illustrates)S 598 y 4796 X(how)S 182 x(functionality)S 183 x(may)S +182 x(be)S 182 x(increased)S 183 x(with)S 182 x(the)S 182 x +(addition)S 182 x(of)S 182 x(DDX)S 181 x(vectors;)S 191 x(the)S 182 x +(DDX)S 181 x(procedure)S 598 y 4796 X(table)S 165 x(is)S 166 x(not)S +166 x(necessarily)S 166 x(bounded.)S 35879 Y 18409 X F40(Operating)S +166 x(Syste)S 2 x(m)S 165 x(Considerations)S 449 x(4\2031)S +PP +EP +%%DOC$Page: 4-2 39 +1000 BP 39600 30600 PM 0 0 XY +5227 Y 3600 X F28(4.3.1)S 599 x(Hardware)S 166 x(Recogniti)S 2 x(on)S +6323 Y 4796 X F151(XIE)S 168 x(must)S 170 x(identify)S -55 x(,)S +171 x(by)S 170 x(some)S 169 x(de\211ned)S 171 x(mechanism)S 170 x +(during)S 170 x(XieInit,)S 171 x(particular)S 170 x(hardware)S 170 x +(platforms)S 598 y 4796 X(and)S 172 x(the)S 173 x(procedures)S 173 x +(for)S 173 x(initializing)S 172 x(the)S 173 x(hardware)S 172 x(and)S +173 x(for)S 173 x(performing)S 173 x(the)S 173 x(DDX)S 171 x +(processes.)S 262 x(The)S 598 y 4796 X(COR)S -2 x(E)S 172 x(X)S 171 x +(has)S 171 x(a)S 172 x(similar)S 171 x(scenario)S 172 x(when)S 172 x +(it)S 171 x(initializes)S 171 x(itself.)S 260 x(The)S 172 x(CORE)S +170 x(X)S 171 x(for)S 172 x(VMS,)S 172 x(for)S 171 x(example,)S 597 y +4796 X(utilizes)S 168 x(system)S 168 x(tables)S 168 x(to)S 169 x +(identify)S 170 x(the)S 169 x(name)S 169 x(of)S 169 x(a)S 169 x +(device)S 170 x(and)S 169 x(then)S 169 x(initializes)S 168 x(the)S +169 x(device)S 170 x(by)S 170 x(using)S 598 y 4796 X(a)S 177 x +(consistent)S 177 x(naming)S 178 x(scheme)S 177 x(for)S 177 x(the)S +178 x(entry)S -55 x(.)S 272 x(For)S 178 x(XIE,)S 176 x(a)S 177 x +(similar)S 177 x(mechanism)S 177 x(will)S 177 x(be)S 177 x +(employed.)S 598 y 4796 X(COR)S -2 x(E)S 188 x(routines)S 188 x +(InitOuput.C,)S 188 x(Logical_Setup.C)S 188 x(can)S 188 x(provide)S +188 x(some)S 188 x(insight)S 188 x(as)S 187 x(to)S 187 x(how)S 188 x +(this)S 187 x(is)S 598 y 4796 X(performed)S 172 x(in)S 172 x(the)S +173 x(VMS)S 171 x(enviro)S 2 x(nment.)S 262 x(Additional)S 171 x +(information)S 173 x(will)S 171 x(be)S 172 x(provided)S 173 x(once)S +173 x(a)S 172 x(machine)S 597 y 4796 X(independent)S 170 x(model)S +169 x(has)S 170 x(been)S 170 x(implemented.)S 256 x(This)S 170 x +(model)S 169 x(will)S 169 x(need)S 170 x(no)S 170 x(such)S 170 x +(mechanism)S 170 x(since)S 170 x(no)S 598 y 4796 X(accelerators)S +166 x(are)S 166 x(de\211ned.)S 13496 Y 3600 X F28(4.3.2)S 599 x +(Multiple)S 168 x(Function)S 167 x(Request)S 14592 Y 4796 X F151 +(Due)S 171 x(to)S 171 x(hardware)S 171 x(components)S 172 x(which)S +172 x(can)S 171 x(accelerate)S 172 x(several)S 171 x(processes)S +171 x(by)S 172 x(pipelining)S 172 x(data)S 171 x(to)S 171 x(its)S +598 y 4796 X(components,)S 170 x(there)S 169 x(will)S 168 x(be)S +169 x(a)S 169 x(need)S 169 x(for)S 169 x(XIE)S 168 x(to)S 169 x +(recognize)S 169 x(a)S 169 x(multiple)S 169 x(function)S 170 x +(call.)S 255 x(As)S 168 x(an)S 169 x(example)S 597 y 4796 X(of)S +165 x(this,)S 166 x(suppose)S 166 x(there)S 166 x(exists)S 165 x(an)S +166 x(accelerator)S 166 x(which)S 167 x(can)S 166 x(scale)S 165 x +(and)S 166 x(rotate)S 166 x(with)S 165 x(one)S 167 x(call.)S 249 x +(XIE)S 165 x(must)S 598 y 4796 X(have)S 172 x(a)S 171 x(DDX)S 170 x +(entry)S 172 x(for)S 171 x(such)S 172 x(a)S 171 x(call.)S 260 x +(This)S 172 x(is)S 170 x(accomplished)S 172 x(upon)S 172 x +(initializat)S -2 x(ion)S 172 x(when)S 172 x(XIE)S 170 x(reads)S +171 x(a)S 598 y 4796 X(\211le)S 166 x(or)S 166 x(table)S 166 x +(which)S 166 x(fully)S 167 x(describes)S 165 x(the)S 167 x(various)S +166 x(multiple)S 166 x(possibiliti)S -2 x(es.)S 897 y 4796 X(Note)S +185 x(that)S 185 x(these)S 185 x(permutations)S 185 x(only)S 186 x +(exist)S 186 x(for)S 185 x(upper)S 186 x(level)S 185 x(DDX)S 184 x +(functions)S 186 x(such)S 186 x(as)S 185 x(scale)S 185 x(and)S 597 y +4796 X(rotate.)S 258 x(This)S 171 x(reduces)S 171 x(the)S 171 x +(number)S 171 x(of)S 171 x(combinations)S 170 x(to)S 171 x(a)S 170 x +(manageable)S 172 x(set)S 170 x(and)S 171 x(represents)S 170 x(a)S +171 x(likely)S 598 y 4796 X(correspondence)S 167 x(with)S 165 x +(display)S 166 x(accelerator)S 167 x(functions.)S 897 y 4796 X(A)S +173 x(mechanism)S 173 x(will)S 173 x(be)S 173 x(de\211ned)S 175 x +(such)S 173 x(that)S 174 x(XIE)S 172 x(can)S 174 x(determine)S 174 x +(the)S 174 x(possible)S 172 x(combinations)S 174 x(so)S 173 x(that)S +598 y 4796 X(it)S 176 x(can)S 177 x(report)S 177 x(them)S 177 x(to)S +177 x(the)S 177 x(client)S 177 x(at)S 177 x(INIT_SESSI)S -2 x(ON)S +177 x(time.)S 271 x(This)S 177 x(will)S 176 x(be)S 177 x(reported)S +177 x(as)S 176 x(a)S 177 x(subcode)S 597 y 4796 X(\(for)S 167 x(the)S +167 x(multiple)S 167 x(request)S 168 x(call\))S 167 x(which)S 168 x +(represent)S 167 x(the)S 168 x(sequence)S 168 x(of)S 167 x(two)S +167 x(or)S 168 x(greater)S 168 x(series)S 166 x(of)S 168 x(opcodes)S +598 y 4796 X(which)S 172 x(indicate)S 172 x(both)S 173 x(order)S +172 x(of)S 172 x(functionality)S 173 x(and)S 173 x(the)S 172 x +(speci\211c)S 173 x(multiple)S 171 x(capability)S -55 x(.)S 262 x +(The)S 173 x(procedure)S 598 y 4796 X(that)S 165 x(implements)S 166 x +(this)S 165 x(may)S 167 x(be)S 166 x(a)S 166 x(operating)S 167 x +(system)S 165 x(dependent)S 167 x(function.)S 896 y 4796 X(XIE)S +181 x(at)S 183 x(initialization)S 182 x(time)S 182 x(will)S 182 x +(enter)S 183 x(this)S 183 x(capability)S 183 x(within)S 182 x(an)S +183 x(internal)S 184 x(structure)S 183 x(and)S 183 x(upon)S 598 y +4796 X(seeing)S 161 x(a)S 161 x(multiple)S 160 x(function)S 162 x +(request)S 161 x(from)S 161 x(the)S 161 x(client,)S 162 x(it)S 161 x +(will)S 160 x(invoke)S 162 x(the)S 161 x(proper)S 161 x(procedure)S +162 x(based)S 160 x(on)S 598 y 4796 X(the)S 166 x(subcode.)S 35879 Y +3600 X F40(4\2032)S 449 x(Operating)S 167 x(System)S 166 x +(Considerations)S +PP +EP +%%DOC$Page: A-1 40 +1000 BP 39600 30600 PM 0 0 XY +8985 Y 3600 X F24(Appendix)S 497 x(A)S 10629 Y 3600 X(XIE)S 166 x +(Protocol)S 167 x(Requests)S 14917 Y 4796 X F36(T)S -37 x(able)S +150 x(A\2031:)S 498 x(Image)S 150 x(Extension)S 151 x(Functio)S 2 x +(ns)S 224 y 4796 X 22116 24 R 598 y 4796 X F157(ROUTINE)S 13363 X +(CLASS)S 681 x(MODULE)S 19341 X(FUNCTION)S 298 y 4796 X +22116 24 R 598 y 4796 X F155(_INIT_S)S 2 x(ESSION)S 13363 X(1)S +15655 X(DIX)S 19341 X(begin)S 160 x(client-extension)S 160 x(server)S +159 x(ses-)S 548 y 19341 X(sion)S 747 y 4796 X(_TERM_SESSION)S 13363 X +(1)S 15655 X(DIX)S 19341 X(terminate)S 161 x(client-extension)S 161 x +(server)S 548 y 19341 X(session)S 747 y 4796 X(_QUER)S -17 x(Y_DEF)S +-34 x(AUL)S -25 x(TS)S 13363 X(1)S 15655 X(DIX)S 19341 X(query)S +149 x(operat)S 2 x(ional)S 150 x(default)S 2 x(s)S 748 y 4796 X +(_SET_DEF)S -34 x(AUL)S -24 x(TS)S 13363 X(1)S 15655 X(DIX)S 19341 X +(establish/modify)S 164 x(operati)S 2 x(onal)S 164 x(de-)S 548 y +19341 X(faults)S 747 y 4796 X(_CREA)S -26 x(TE_RESOURCE)S 13363 X(2)S +15655 X(DIX)S 19341 X(create)S 150 x(XIE)S 150 x(resource)S 747 y +4796 X(_COPY_RE)S -2 x(SOURCE)S 13363 X(2)S 15655 X(DIX)S 19341 X +(copy)S 150 x(an)S 149 x(XIE)S 149 x(resource)S 747 y 4796 X +(_DELETE_R)S -2 x(ESOURCE)S 13363 X(2)S 15655 X(DIX)S 19341 X +(delete)S 151 x(an)S 149 x(XIE)S 150 x(resource)S 747 y 4796 X +(_QUER)S -17 x(Y_RESOURCE)S 13363 X(2)S 15655 X(DIX)S 19341 X(query)S +149 x(an)S 150 x(XIE)S 149 x(resource)S 748 y 4796 X(_IMPORT_IMAGE)S +13363 X(2)S 15655 X(DIX)S 19341 X(transfer)S 154 x(image)S 152 x +(data)S 155 x(from)S 153 x(drawable)S 548 y 19341 X(to)S 150 x(IOB)S +747 y 4796 X(_EXPOR)S -2 x(T_IMAGE)S 13363 X(2)S 15655 X(DIX)S 19341 X +(transfer)S 161 x(image)S 160 x(data)S 162 x(from)S 161 x(IOB)S 160 x +(->)S 548 y 19341 X(PIXMAP)S 747 y 4796 X(_SET_TRANSPORT)S 13363 X +(3)S 15655 X(DIX)S 19341 X(establishes)S 151 x(context)S 152 x(for)S +151 x(image)S 150 x(trans-)S 548 y 19341 X(fer)S 747 y 4796 X +(_GET_TILE)S 13363 X(3)S 15655 X(DDX)S 19341 X(randomly)S 167 x +(transfers)S 166 x(image)S 167 x(data)S 548 y 19341 X(from)S 149 x +(IOB)S 150 x(to)S 150 x(client)S 747 y 4796 X(_PUT_TILE)S 13363 X(3)S +15655 X(DDX)S 19341 X(transfers)S 153 x(image)S 153 x(data)S 154 x +(from)S 153 x(client)S 154 x(to)S 548 y 19341 X(IOB)S 747 y 4796 X +(_GET_STREAM)S 13363 X(3)S 15655 X(DIX)S 19341 X(transfers)S 154 x +(stream)S 155 x(data)S 155 x(from)S 154 x(IOB)S 154 x(->)S 548 y +19341 X(client)S 747 y 4796 X(_PUT_STREAM)S 13363 X(3)S 15655 X(DIX)S +19341 X(transfers)S 150 x(stream)S 149 x(data)S 151 x(from)S 150 x +(client)S 150 x(->)S 548 y 19341 X(IOB)S 35879 Y 588 x F40(XIE)S +149 x(Protocol)S 150 x(Requests)S 449 x(A\2031)S +PP +EP +%%DOC$Page: A-2 41 +1000 BP 39600 30600 PM 0 0 XY +5393 Y 4796 X F36(T)S -37 x(able)S 150 x(A\2031)S 149 x(\(Cont.\):)S +499 x(Image)S 150 x(Extension)S 151 x(Function)S 2 x(s)S 224 y 4796 X +22116 24 R 598 y 4796 X F157(ROUTINE)S 13363 X(CLASS)S 681 x(MODULE)S +19341 X(FUNCTION)S 299 y 4796 X 22116 24 R 747 y 4796 X F155(_POINT)S +13363 X(4)S 15655 X(DDX)S 19341 X(remap)S 150 x(input)S 150 x(IOB)S +149 x(to)S 150 x(output)S 151 x(IOB)S 747 y 4796 X(_AREA)S 13363 X +(4)S 15655 X(DDX)S 19341 X(apply)S 157 x(area)S 156 x(operat)S 2 x +(ors)S 156 x(to)S 156 x(input)S 157 x(IOB)S 548 y 19341 X(and)S 150 x +(store)S 150 x(to)S 150 x(output)S 150 x(IOB)S 748 y 4796 X(_ARITH)S +13363 X(4)S 15655 X(DDX)S 19341 X(perform)S 163 x(arithmetic)S 164 x +(operati)S 2 x(on)S 162 x(on)S 548 y 19341 X(two)S 162 x(IOBs)S 160 x +(or)S 162 x(IOB)S 161 x(and)S 162 x(a)S 161 x(constant)S 548 y 19341 X +(and)S 150 x(store)S 150 x(to)S 150 x(output)S 150 x(IOB)S 747 y +4796 X(_COMP)S -34 x(ARE)S 13363 X(4)S 15655 X(DDX)S 19341 X +(comparing)S 162 x(two)S 163 x(IOBs)S 162 x(or)S 162 x(one)S 163 x +(IOB)S 548 y 19341 X(and)S 159 x(a)S 160 x(constant)S 159 x(and)S +160 x(store)S 159 x(boolean)S 548 y 19341 X(result)S 150 x(to)S 150 x +(a)S 149 x(2D)S 150 x(boolean)S 150 x(bitmap)S 747 y 4796 X +(_LOGICAL)S 13363 X(4)S 15655 X(DDX)S 19341 X(perform)S 162 x +(logical)S 162 x(operat)S 2 x(ion)S 162 x(on)S 161 x(two)S 548 y +19341 X(IOBs)S 161 x(or)S 162 x(one)S 162 x(IOB)S 161 x(and)S 163 x +(a)S 161 x(constant)S 548 y 19341 X(and)S 150 x(store)S 150 x(to)S +150 x(output)S 150 x(IOB)S 747 y 4796 X(_MA)S -25 x(THF)S 13363 X(4)S +15655 X(DDX)S 19341 X(apply)S 164 x(mathematica)S 2 x(l)S 163 x +(function)S 165 x(on)S 548 y 19341 X(input)S 150 x(IOB)S 150 x(and)S +149 x(store)S 150 x(to)S 150 x(output)S 151 x(IOB)S 747 y 4796 X +(_DECOMPRE)S -2 x(SS)S 13363 X(4)S 15655 X(DDX)S 19341 X(decompress)S +153 x(input)S 154 x(IOB)S 153 x(and)S 154 x(store)S 153 x(to)S 548 y +19341 X(output)S 150 x(IOB)S 747 y 4796 X(_SCALE)S 13363 X(4)S 15655 X +(DDX)S 19341 X(scale)S 151 x(input)S 152 x(IOB)S 150 x(and)S 152 x +(store)S 151 x(to)S 151 x(output)S 548 y 19341 X(IOB)S 747 y 4796 X +(_ROT)S -25 x(A)S -25 x(TE)S 13363 X(4)S 15655 X(DDX)S 19341 X +(rotate)S 172 x(input)S 172 x(IOB)S 171 x(and)S 171 x(store)S 171 x +(to)S 548 y 19341 X(output)S 150 x(IOB)S 747 y 4796 X(_MIRROR)S +13363 X(4)S 15655 X(DDX)S 19341 X(\212ip)S 156 x(input)S 157 x(IOB)S +156 x(and)S 157 x(store)S 156 x(to)S 157 x(output)S 548 y 19341 X +(IOB)S 748 y 4796 X(_CROP)S 13363 X(4)S 15655 X(DDX)S 19341 X(crop)S +153 x(input)S 154 x(IOB)S 153 x(and)S 154 x(store)S 153 x(to)S 153 x +(output)S 548 y 19341 X(IOB)S 747 y 4796 X(_TRANSLA)S -25 x(TE)S +13363 X(4)S 15655 X(DDX)S 19341 X(overlay)S 158 x(two)S 159 x(IOBs)S +157 x(or)S 158 x(one)S 159 x(IOB)S 157 x(and)S 548 y 19341 X +(constant)S 150 x(and)S 150 x(store)S 150 x(to)S 150 x(output)S 150 x +(IOB)S 747 y 4796 X(_CONSTRAIN)S 13363 X(4)S 15655 X(DDX)S 19341 X +(apply)S 161 x(quantizat)S 2 x(ion)S 161 x(on)S 160 x(input)S 162 x +(IOB)S 548 y 19341 X(and)S 150 x(store)S 150 x(to)S 150 x(output)S +150 x(IOB)S 747 y 4796 X(_MA)S -25 x(TCH_HIS)S 2 x(TOGRAM)S 13363 X +(4)S 15655 X(DDX)S 19341 X(apply)S 154 x(transformation)S 154 x(on)S +153 x(input)S 153 x(IOB)S 548 y 19341 X(to)S 151 x(conform)S 151 x +(with)S 151 x(speci\211ed)S 151 x(histogram)S 548 y 19341 X(form)S +149 x(and)S 150 x(store)S 150 x(to)S 150 x(output)S 151 x(IOB)S 747 y +4796 X(_CHROMINANCE_SEP)S -33 x(ARA)S -26 x(TE)S 13363 X(4)S 15655 X +(DDX)S 19341 X(create)S 160 x(3)S 160 x(IOBs)S 159 x(from)S 160 x +(multispectral)S 548 y 19341 X(IOB)S 747 y 4796 X +(_CHROMINANCE_COMBINE)S 13363 X(4)S 15655 X(DDX)S 19341 X(combine)S +162 x(3)S 161 x(IOBs)S 161 x(to)S 163 x(multispectral)S 548 y 19341 X +(IOB)S 747 y 4796 X(_DITHER)S 13363 X(4)S 15655 X(DDX)S 19341 X +(reduce)S 162 x(number)S 161 x(of)S 162 x(levels)S 162 x(of)S 162 x +(input)S 548 y 19341 X(IOB)S 149 x(and)S 150 x(store)S 150 x(to)S +150 x(output)S 151 x(IOB)S 748 y 4796 X(_LUMINANCE)S 13363 X(4)S +15655 X(DDX)S 19341 X(extract)S 164 x(luminance)S 164 x(component)S +163 x(of)S 547 y 19341 X(polychromatic)S 166 x(IOB)S 165 x(and)S +165 x(store)S 165 x(to)S 548 y 19341 X(output)S 150 x(IOB)S 748 y +4796 X(_CALC_HISTOGRAM)S 13363 X(5)S 15655 X(DDX)S 19341 X +(generates)S 150 x(histogram)S 149 x(of)S 150 x(input)S 150 x(IOB)S +35879 Y 3600 X F40(A\2032)S 449 x(XIE)S 149 x(Protocol)S 149 x +(Requests)S +PP +EP +%%DOC$Page: A-3 42 +1000 BP 39600 30600 PM 0 0 XY +5393 Y 4796 X F36(T)S -37 x(able)S 150 x(A\2031)S 149 x(\(Cont.\):)S +499 x(Image)S 150 x(Extension)S 151 x(Function)S 2 x(s)S 224 y 4796 X +22116 24 R 598 y 4796 X F157(ROUTINE)S 13363 X(CLASS)S 681 x(MODULE)S +19341 X(FUNCTION)S 299 y 4796 X 22116 24 R 747 y 4796 X F155 +(_POINT_ST)S -24 x(A)S -25 x(TISTI)S 2 x(CS)S 13363 X(5)S 15655 X +(DDX)S 19341 X(generate)S 150 x(statistics)S 150 x(for)S 150 x(an)S +150 x(IOB)S 747 y 4796 X(_AREA)S -2 x(_ST)S -24 x(A)S -25 x(TISTI)S +2 x(CS)S 13363 X(5)S 15655 X(DDX)S 19341 X(generate)S 153 x +(statistical)S 153 x(IOB)S 152 x(from)S 152 x(input)S 548 y 19341 X +(IOB)S 748 y 4796 X(_DISPLA)S -41 x(Y_SEQUENCE)S 13363 X(7)S 15655 X +(DIX)S 19341 X(display)S 150 x(time)S 150 x(sequences)S 149 x(of)S +150 x(pixmaps)S 747 y 4796 X(_SELECT_EVE)S -2 x(NTS)S 13363 X(8)S +15655 X(DIX)S 19341 X(select)S 150 x(which)S 149 x(events)S 150 x +(to)S 150 x(be)S 149 x(noti\211ed)S 151 x(of)S 747 y 4796 X(_QUER)S +-17 x(Y_EVE)S -2 x(NTS)S 13363 X(8)S 15655 X(DIX)S 19341 X(query)S +157 x(which)S 157 x(events)S 157 x(have)S 157 x(been)S 157 x(set)S +548 y 19341 X(for)S 150 x(noti\211catio)S 2 x(n)S 398 y 4796 X +22116 24 R 13189 Y 4796 X F36(T)S -37 x(able)S 150 x(A\2032:)S 498 x +(Service)S 150 x(Classes)S 224 y 4796 X 22116 24 R 598 y 4796 X F157 +(Class)S 9179 X(Service)S 299 y 4796 X 22116 24 R 598 y 4796 X F155 +(1)S 9179 X(session)S 149 x(services)S 747 y 4796 X(2)S 9179 X +(resource)S 150 x(services)S 747 y 4796 X(3)S 9179 X(transport)S +151 x(services)S 747 y 4796 X(4)S 9179 X(process)S 149 x(services)S +747 y 4796 X(5)S 9179 X(statistics)S 150 x(services)S 748 y 4796 X +(6)S 9179 X(process)S 149 x(control)S 151 x(services)S 747 y 4796 X +(7)S 9179 X(display)S 150 x(services)S 747 y 4796 X(8)S 9179 X +(event)S 150 x(services)S 398 y 4796 X 22116 24 R 35879 Y 20751 X +F40(XIE)S 166 x(Protocol)S 166 x(Requests)S 449 x(A\2033)S +PP +EP +%%DOC$Page: B-1 43 +1000 BP 39600 30600 PM 0 0 XY +8985 Y 3600 X F24(Appendix)S 497 x(B)S 10629 Y 3600 X(Modules)S 166 x +(and)S 166 x(Procedures)S 13335 Y 4796 X F151(For)S 183 x(coding)S +184 x(purposes,)S 187 x(all)S 183 x(XIE/DIX)S 181 x(procedures)S +184 x(will)S 182 x(reside)S 182 x(in)S 184 x(two)S 182 x(modules:)S +283 x(XIE.C)S 182 x(and)S 183 x(XIE_)S 598 y 4796 X(UTILS.C.)S 897 y +4796 X(The)S 166 x(following)S 166 x(is)S 166 x(a)S 166 x(list)S +165 x(of)S 166 x(XIE)S 165 x(server)S 167 x(related)S 166 x +(software)S 165 x(modules:)S 896 y 4796 X(\201)S 594 x(XieProto.h)S +167 x(-)S 166 x(contains)S 166 x(de\211nitions)S 167 x(and)S 166 x +(structures)S 166 x(that)S 166 x(are)S 166 x(used)S 166 x(on)S 167 x +(both)S 166 x(sides)S 165 x(of)S 166 x(the)S 166 x(wire.)S 748 y +4796 X(\201)S 594 x(XieAppl.h)S 166 x(-)S 166 x(contains)S 166 x +(public)S 167 x(de\211nitions)S 166 x(and)S 166 x(structures)S 747 y +4796 X(\201)S 594 x(XieServer)S -36 x(.h)S 167 x(-)S 166 x(contains)S +166 x(de\211nitions)S 166 x(and)S 166 x(structures)S 167 x(that)S +165 x(pertain)S 167 x(to)S 166 x(the)S 166 x(server)S -36 x(.)S 747 y +4796 X(\201)S 594 x(XIE.C)S 165 x(-)S 166 x(contains)S 167 x(XIE)S +165 x(dispatch)S 165 x(logic)S 167 x(and)S 166 x(DIX)S 165 x +(request)S 166 x(logic)S 747 y 4796 X(\201)S 594 x(XIE_UTILS.C)S +166 x(-)S 165 x(contains)S 167 x(utilities)S 165 x(for)S 166 x(DIX)S +165 x(Phase)S 166 x(II)S 166 x(Request)S 165 x(Processing)S 19811 Y +4796 X(The)S 166 x(following)S 166 x(represents)S 166 x(the)S 167 x +(procedures)S 166 x(within)S 166 x(the)S 166 x(XIE.C)S 165 x +(module:)S 897 y 4796 X(\201)S 594 x(XieDispatcher)S 165 x(-)S 166 x +(vectors)S 167 x(to)S 166 x(the)S 166 x(appropriate)S 166 x(DIX)S +165 x(process)S 165 x(-)S 166 x(Phase)S 167 x(I.)S 747 y 4796 X +(\201)S 594 x(XieInit)S 166 x(-)S 166 x(identi\211es)S 166 x(XIE)S +165 x(to)S 166 x(the)S 166 x(CORE)S 164 x(X)S 166 x(and)S 166 x +(initializes)S 165 x(XIE)S 747 y 4796 X(\201)S 594 x(XieDeviceInit)S +176 x(-)S 176 x(initializes)S 175 x(any)S 177 x(hardware)S 177 x +(devices)S 176 x(and)S 177 x(modi\211es)S 176 x(the)S 176 x(DDX)S +175 x(procedure)S 177 x(vector)S 598 y 5692 X(table.)S 747 y 4796 X +(\201)S 594 x(ProcXxx)S 172 x(-)S 171 x(perform)S 171 x(DIX)S 170 x +(Phase)S 172 x(I)S 170 x(processing)S 172 x(for)S 171 x(request)S +171 x(Xxx)S 171 x(and)S 172 x(depending)S 172 x(on)S 171 x(the)S +171 x(request,)S 598 y 5692 X(perform)S 166 x(Phase)S 167 x(II)S +165 x(processing)S 167 x(or)S 166 x(call)S 166 x(procedures)S 166 x +(that)S 166 x(reside)S 166 x(in)S 166 x(XIE_UTILS.C.)S 25241 Y 4796 X +(The)S 184 x(following)S 185 x(represents)S 184 x(the)S 185 x(type)S +184 x(of)S 184 x(procedures)S 185 x(that)S 184 x(will)S 184 x +(reside)S 184 x(within)S 184 x(the)S 185 x(XIE_UTILS.C)S 597 y 4796 X +(module:)S 897 y 4796 X(\201)S 594 x(DestroyXxx)S 167 x(-)S 166 x +(logic)S 166 x(to)S 166 x(delete)S 166 x(an)S 166 x(XIE)S 165 x +(resource)S 167 x(Xxx.)S 747 y 4796 X(\201)S 594 x(T)S -30 x +(ransportT)S -13 x(ileImage)S 166 x(-)S 166 x(procedure)S 167 x(to)S +166 x(randomly)S 167 x(transfer)S 166 x(image)S 166 x(data.)S 747 y +4796 X(\201)S 594 x(T)S -30 x(ransportStreamImage)S 165 x(-)S 166 x +(procedure)S 167 x(to)S 166 x(sequentially)S 167 x(transfer)S 166 x +(image)S 166 x(data.)S 35879 Y 20228 X F40(Modules)S 166 x(and)S +166 x(Procedur)S 2 x(es)S 448 x(B\2031)S +PP +EP +%%DOC$Page: C-1 44 +1000 BP 39600 30600 PM 0 0 XY +9007 Y 3600 X F24(Appendix)S 497 x(C)S 10651 Y 3600 X(XIE)S 166 x +(Application)S 165 x(and)S 166 x(W)S -5 x(ire)S 165 x(De\211nitions)S +166 x(and)S 166 x(Structures)S 13494 Y 4796 X F151(The)S 174 x +(following)S 175 x(represents)S 174 x(a)S 174 x(draft)S 174 x(of)S +174 x(some)S 174 x(of)S 174 x(the)S 175 x(XIE)S 173 x(wire)S 174 x +(de)S +(\211nitions)S 174 x(and)S 175 x(structures)S 174 x(that)S 174 x +(will)S 597 y 4796 X(reside)S 165 x(in)S 167 x(XieProto.h.)S 897 y +4796 X(Note:)S 294 x(this)S 188 x(\211le)S 189 x(represents)S 189 x +(a)S 188 x(draft)S 189 x(and)S 189 x(may)S 188 x(contain)S 190 x +(inconsistencies)S 188 x(with)S 188 x(the)S 189 x(text)S 189 x(and)S +189 x(the)S 598 y 4796 X(referenced)S 166 x(documents.)S 17329 Y +5752 X F102(/*)S 449 y -478 x(**)S 239 x(Symbol)S 240 x(XIEPROTO)S +240 x(allows)S 240 x(XieProto.h)S 240 x(to)S 239 x(be)S 239 x +(included)S 240 x(multiple)S 240 x(times.)S 448 y 5752 X(*/)S 448 y +4796 X(#ifndef)S 239 x(XIEPROTO)S 449 y 4796 X(#define)S 239 x +(XIEPROTO)S 240 x(/*)S 240 x(the)S 239 x("endif")S 240 x(MUST)S 239 x +(be)S 240 x(the)S 239 x(last)S 240 x(line)S 239 x(of)S 239 x(this)S +240 x(file)S 718 x(*/)S 747 y 4796 X(/*)S 448 y -478 x(**)S 478 x +(Include)S 240 x(files)S 448 y 4796 X(*/)S 449 y -478 x(#ifdef)S +239 x(VMS)S 448 y 4796 X(#include)S 7665 X("XieAppl.h")S 718 x(/*)S +240 x(XIE)S 239 x(inter-layer)S 240 x(definitions)S 19381 X(*/)S +448 y 4796 X(#endif)S 449 y 4796 X(#ifdef)S 239 x(ultrix)S 448 y +4796 X(#include)S 7665 X("XieAppl.h")S 718 x(/*)S 240 x(XIE)S 239 x +(inter-layer)S 240 x(definitions)S 19381 X(*/)S 448 y 4796 X(#endif)S +24502 Y 4796 X(/*)S 449 y -478 x(**)S 478 x(Wire)S 239 x(protocol)S +240 x(constant)S 240 x(definitions.)S 448 y 4796 X(*/)S 448 y 478 x +(/*)S 449 y -478 x(**)S 239 x(Version)S 240 x(number)S 448 y 5752 X +(*/)S 448 y 4796 X(#define)S 239 x(XieK_MajorVe)S 2 x(rsion)S 478 x +(1)S 449 y 4796 X(#define)S 239 x(XieK_MinorVe)S 2 x(rsion)S 478 x +(0)S 747 y 5752 X(/*)S 448 y -478 x(**)S 239 x(Number)S 240 x(of)S +239 x(supported)S 240 x(Events)S 240 x(and)S 239 x(Errors)S 448 y +5752 X(*/)S 449 y 4796 X(#define)S 239 x(XieK_NumEven)S 2 x(ts)S +717 x(0)S 448 y 4796 X(#define)S 239 x(XieK_NumErro)S 2 x(rs)S 717 x +(0)S 747 y 5752 X(/*)S 449 y -478 x(**)S 239 x(Resource)S 240 x +(Types)S 448 y 5752 X(*/)S 448 y 4796 X(#define)S 239 x +(XieK_ImageOb)S 2 x(ject)S 478 x(0)S 449 y 4796 X(#define)S 239 x +(XieK_ImageCo)S 2 x(ntext)S 478 x(1)S 35879 Y 14362 X F40(XIE)S 166 x +(Appli)S -2 x(cation)S 167 x(and)S 166 x(W)S -4 x(ire)S 166 x +(De\211nitions)S 166 x(and)S 166 x(Structur)S 2 x(es)S 448 x(C\2031)S +PP +EP +%%DOC$Page: C-2 45 +1000 BP 39600 30600 PM 0 0 XY +5065 Y 4796 X F102(/*******************)S 2 x(*******************)S +2 x(*******************)S 2 x(********************)S 448 y 4796 X +(**)S 239 x(Protocol)S 240 x(request)S 240 x(packet)S 239 x(minor)S +240 x(op-codes)S 448 y 4796 X(********************)S 2 x +(*******************)S 2 x(*******************)S 2 x +(*******************/)S 448 y 4796 X(#define)S 239 x(X_ieInitSess)S +2 x(ion)S 14599 X(1)S 449 y 4796 X(#define)S 239 x(X_ieSetTrans)S +2 x(port)S 14599 X(2)S 448 y 4796 X(#define)S 239 x(X_iePutTile)S +14599 X(3)S 448 y 4796 X(#define)S 239 x(X_ieExportIm)S 2 x(age)S +14599 X(4)S 449 y 4796 X(#define)S 239 x(X_ieCreateRe)S 2 x(source)S +14599 X(5)S 448 y 4796 X(#define)S 239 x(X_ieTermSess)S 2 x(ion)S +14599 X(6)S 448 y 4796 X(#define)S 239 x(X_iePutStrea)S 2 x(m)S +14599 X(7)S 449 y 4796 X(#define)S 239 x(X_ieLastRequ)S 2 x(est)S +717 x(99)S 10594 Y 4796 X(/*******************)S 2 x +(*******************)S 2 x(*******************)S 2 x +(********************)S 448 y 4796 X(**)S 239 x(Protocol)S 240 x +(packet)S 239 x(size)S 240 x(definitions)S 240 x(required)S 240 x +(by)S 239 x(Xlibint.h)S 448 y 4796 X(********************)S 2 x +(*******************)S 2 x(*******************)S 2 x +(*******************/)S 449 y 4796 X(#define)S 239 x(sz_xieReq)S +10534 X(4)S 448 y 4796 X(#define)S 239 x(sz_xieInitSe)S 2 x +(ssionReq)S 12925 X(8)S 448 y 4796 X(#define)S 239 x(sz_xiePutTil)S +2 x(eReq)S 11730 X(28)S 449 y 4796 X(#define)S 239 x(sz_xiePutStr)S +2 x(eamReq)S 12208 X(16)S 448 y 4796 X(#define)S 239 x(sz_xieExport)S +2 x(ImageReq)S 12686 X(40)S 448 y 4796 X(#define)S 239 x +(sz_xieSetTra)S 2 x(nsportReq)S 12925 X(36)S 449 y 4796 X(#define)S +239 x(sz_xieCreate)S 2 x(ResourceReq)S 13403 X(12)S 448 y 4796 X +(#define)S 239 x(sz_xieCreate)S 2 x(IobReq)S 12208 X(36)S 448 y +4796 X(#define)S 239 x(sz_xieTermSe)S 2 x(ssionReq)S 12925 X(4)S +16571 Y 4796 X(/*******************)S 2 x(*******************)S 2 x +(*******************)S 2 x(********************)S 449 y 4796 X(**)S +239 x(Miscellaneous)S 240 x(protocol)S 240 x(structure)S 240 x +(definitions)S 448 y 4796 X(********************)S 2 x +(*******************)S 2 x(*******************)S 2 x +(*******************/)S 448 y 5752 X(/*)S 449 y -478 x(**)S 239 x +(Wire)S 240 x(floating)S 240 x(point)S 239 x(format)S 448 y 5752 X +(*/)S 448 y 4796 X(typedef)S 239 x(struct)S 240 x({)S 449 y 5752 X +(unsigned)S 240 x(char)S 718 x(e_sign;)S 448 y 5752 X(unsigned)S +240 x(char)S 718 x(m_sign;)S 448 y 5752 X(unsigned)S 240 x(char)S +718 x(exponent;)S 449 y 5752 X(unsigned)S 240 x(char)S 718 x(pad1;)S +448 y 5752 X(unsigned)S 240 x(short)S 479 x(mantissa;)S 448 y 5752 X +(unsigned)S 240 x(short)S 479 x(pad2;)S 449 y 4796 X(})S 239 x +(XieFloat;)S 23446 Y 4796 X(/*******************)S 2 x +(*******************)S 2 x(*******************)S 2 x +(********************)S 448 y 4796 X(**)S 239 x(Protocol)S 240 x +(request)S 240 x(packets)S 448 y 4796 X(********************)S 2 x +(*******************)S 2 x(*******************)S 2 x +(*******************/)S 747 y 5752 X(/*)S 449 y -478 x(**)S 239 x +(Generic)S 240 x(part)S 240 x(of)S 239 x(all)S 239 x(XIE)S 240 x +(requests)S 448 y 5752 X(*/)S 448 y 4796 X(typedef)S 239 x(struct)S +240 x({)S 449 y 5752 X(unsigned)S 240 x(char)S 718 x(reqType;)S 240 x +(/*)S 239 x(major)S 239 x(op-code)S 240 x(assigned)S 240 x(to)S 240 x +(extension)S 22011 X(*/)S 448 y 5752 X(unsigned)S 240 x(char)S 718 x +(opcode;)S 239 x(/*)S 240 x(minor)S 239 x(op-code)S 240 x(==)S 239 x +(XIE)S 240 x(function)S 20337 X(*/)S 448 y 5752 X(unsigned)S 240 x +(short)S 479 x(length;)S 239 x(/*)S 240 x(length)S 239 x(in)S 240 x +(longwords)S 240 x(of)S 239 x(entire)S 240 x(request)S 22011 X(*/)S +449 y 4796 X(})S 239 x(xieReq;)S 747 y 5752 X(/*)S 448 y -478 x(**)S +239 x(Init)S 240 x(Session)S 240 x(Request)S 448 y 5752 X(*/)S 449 y +4796 X(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X(unsigned)S +240 x(char)S 718 x(reqType;)S 448 y 5752 X(unsigned)S 240 x(char)S +718 x(opcode;)S 479 x(/*)S 239 x(function)S 240 x(==)S 239 x +(X_ieInitSessio)S 2 x(n)S 20098 X(*/)S 449 y 5752 X(unsigned)S 240 x +(short)S 479 x(length;)S 448 y 5752 X(unsigned)S 240 x(short)S 479 x +(major_version;)S 240 x(/*)S 239 x(XIE)S 240 x(major)S 239 x +(version)S 240 x(*/)S 448 y 5752 X(unsigned)S 240 x(short)S 479 x +(minor_version;)S 240 x(/*)S 239 x(XIE)S 240 x(minor)S 239 x +(version)S 240 x(*/)S 449 y 4796 X(})S 239 x(xieInitSessionReq;)S +35879 Y 3600 X F40(C\2032)S 449 x(XIE)S 165 x(Application)S 165 x +(and)S 167 x(W)S -4 x(ire)S 166 x(De\211nitions)S 165 x(and)S 167 x +(Structures)S +PP +EP +%%DOC$Page: C-3 46 +1000 BP 39600 30600 PM 0 0 XY +5065 Y 5752 X F102(/*)S 448 y -478 x(**)S 239 x(Term)S 240 x +(Session)S 240 x(Request)S 448 y 5752 X(*/)S 448 y 4796 X(typedef)S +239 x(struct)S 240 x({)S 449 y 5752 X(unsigned)S 240 x(char)S 718 x +(reqType;)S 448 y 5752 X(unsigned)S 240 x(char)S 718 x(opcode;)S +12447 X(/*)S 239 x(function)S 240 x(==)S 239 x(X_ieTermSes)S 2 x +(sion)S 20815 X(*/)S 448 y 5752 X(unsigned)S 240 x(short)S 479 x +(length;)S 449 y 4796 X(})S 239 x(xieTermSessionReq;)S 747 y 5752 X +(/*)S 448 y -478 x(**)S 239 x(Set)S 240 x(transport)S 240 x(Request)S +240 x(\(set)S 239 x(transport)S 240 x(parameters\))S 449 y 5752 X +(*/)S 448 y 4796 X(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X +(unsigned)S 240 x(char)S 718 x(reqType;)S 449 y 5752 X(unsigned)S +240 x(char)S 718 x(opcode;)S 479 x(/*)S 239 x(function)S 240 x(==)S +239 x(X_ieSetTranspo)S 2 x(rt)S 20337 X(*/)S 448 y 5752 X(unsigned)S +240 x(short)S 479 x(length;)S 448 y 5752 X(unsigned)S 240 x(long)S +718 x(iob_id;)S 448 y 5752 X(struct)S 240 x({)S 449 y 5035 X +(unsigned)S 240 x(long)S 717 x(scanline_str)S 2 x(ide;)S 448 y 5035 X +(unsigned)S 240 x(char)S 717 x(scanlines_ab)S 2 x(ut;)S 448 y 5035 X +(unsigned)S 240 x(char)S 717 x(pixel_stride)S 2 x(;)S 449 y 5035 X +(unsigned)S 240 x(char)S 717 x(pad[2];)S 448 y 5752 X(})S 239 x +(comp_data[XieK)S 2 x(_MaxComponents];)S 448 y 5752 X(unsigned)S +240 x(char)S 718 x(compression_scheme;)S 449 y 5752 X(unsigned)S +240 x(char)S 718 x(tile_format;)S 448 y 5752 X(unsigned)S 240 x +(char)S 718 x(component_organizat)S 2 x(ion;)S 448 y 5752 X +(unsigned)S 240 x(char)S 718 x(pad[1];)S 449 y 4796 X(})S 239 x +(xieSetTransportReq)S 2 x(;)S 747 y 5752 X(/*)S 448 y -478 x(**)S +239 x(Generic)S 240 x(create)S 240 x(resource)S 449 y 5752 X(*/)S +448 y 4796 X(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X +(unsigned)S 240 x(char)S 718 x(reqType;)S 448 y 5752 X(unsigned)S +240 x(char)S 718 x(opcode;)S 12447 X(/*)S 239 x(function)S 240 x(==)S +239 x(X_ieCreateR)S 2 x(esource)S 21533 X(*/)S 449 y 5752 X +(unsigned)S 240 x(short)S 479 x(length;)S 448 y 5752 X(unsigned)S +240 x(long)S 718 x(resource_id;)S 13403 X(/*)S 240 x(resource)S 239 x +(identifier)S 20098 X(*/)S 448 y 5752 X(unsigned)S 240 x(long)S 718 x +(resource_type;)S 479 x(/*)S 240 x(resource)S 239 x(type)S 18903 X +(*/)S 449 y 4796 X(})S 239 x(xieCreateResourceR)S 2 x(eq;)S 747 y +5752 X(/*)S 448 y -478 x(**)S 239 x(Create)S 240 x(image)S 240 x +(object)S 239 x(request)S 449 y 5752 X(*/)S 448 y 4796 X(typedef)S +239 x(struct)S 240 x({)S 448 y 5752 X(unsigned)S 240 x(char)S 718 x +(reqType;)S 449 y 5752 X(unsigned)S 240 x(char)S 718 x(opcode;)S +479 x(/*)S 239 x(function)S 240 x(==)S 239 x(X_ieCreateReso)S 2 x +(urce)S 717 x(*/)S 448 y 5752 X(unsigned)S 240 x(short)S 479 x +(length;)S 448 y 5752 X(unsigned)S 240 x(long)S 718 x(resource_id;)S +240 x(/*)S 239 x(resource)S 240 x(identifier)S 19381 X(*/)S 448 y +5752 X(unsigned)S 240 x(long)S 718 x(resource_type;)S 240 x(/*)S +239 x(resource)S 240 x(type)S 240 x(==)S 239 x(XieImageObjec)S 2 x +(t)S 478 x(*/)S 449 y 5752 X(unsigned)S 240 x(long)S 718 x +(pixels_per_scanline)S 2 x(;)S 448 y 5752 X(unsigned)S 240 x(long)S +718 x(number_of_scanlines)S 2 x(;)S 448 y 5752 X(XieFloat)S 8860 X +(aspect_ratio)S 2 x(;)S 449 y 5752 X(unsigned)S 240 x(char)S 718 x +(number_of_component)S 2 x(s;)S 448 y 5752 X(unsigned)S 240 x(char)S +718 x(bits_per_component[)S 2 x(XieK_MaxComponents])S 2 x(;)S 448 y +5752 X(unsigned)S 240 x(char)S 718 x(component_mapping;)S 449 y +5752 X(unsigned)S 240 x(char)S 718 x(pixel_progression;)S 448 y +5752 X(unsigned)S 240 x(char)S 718 x(line_progression;)S 448 y 5752 X +(unsigned)S 240 x(char)S 718 x(polarity;)S 449 y 4796 X(})S 239 x +(xieCreateIobReq;)S 35879 Y 14362 X F40(XIE)S 166 x(Appli)S -2 x +(cation)S 167 x(and)S 166 x(W)S -4 x(ire)S 166 x(De\211nitions)S +166 x(and)S 166 x(Structur)S 2 x(es)S 448 x(C\2033)S +PP +EP +%%DOC$Page: C-4 47 +1000 BP 39600 30600 PM 0 0 XY +5065 Y 5752 X F102(/*)S 448 y -478 x(**)S 239 x(Create)S 240 x(IDC)S +239 x(Request)S 448 y 5752 X(*/)S 448 y 4796 X(typedef)S 239 x +(struct)S 240 x({)S 449 y 5752 X(unsigned)S 240 x(char)S 239 x +(reqType;)S 448 y 5752 X(unsigned)S 240 x(char)S 239 x(opcode;)S +479 x(/*)S 240 x(XIE)S 239 x(function)S 240 x(*/)S 448 y 5752 X +(unsigned)S 240 x(short)S 239 x(length;)S 240 x(/*)S 240 x(length)S +239 x(in)S 240 x(longwords)S 240 x(of)S 239 x("whole")S 240 x +(request)S 240 x(*/)S 449 y 5752 X(unsigned)S 240 x(long)S 239 x +(resource_ty)S 2 x(pe;)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x +(idc_id;)S 240 x(/*)S 240 x(IDC)S 239 x(identifier)S 240 x(*/)S 448 y +5752 X(unsigned)S 240 x(char)S 478 x(idc_type;)S 241 x(/*)S 239 x +(type)S 239 x(of)S 240 x(data)S 239 x(for)S 240 x(this)S 239 x(dPC)S +240 x(req)S 239 x(*/)S 449 y 4796 X(}xieCreateIdcReq;)S 747 y 4796 X +(/*)S 448 y -478 x(**)S 239 x(The)S 239 x(following)S 240 x(request)S +240 x(structures)S 240 x(are)S 240 x(used)S 239 x(with)S 240 x +(CreateIdc)S 240 x(depending)S 240 x(on)S 449 y 4796 X(**)S 239 x +(idc_type)S 448 y 4796 X(*/)S 448 y 478 x(/*)S 448 y -478 x(**)S +239 x(Roi)S 240 x(type)S 449 y 5752 X(*/)S 448 y 4796 X(typedef)S +239 x(struct)S 240 x({)S 448 y 5752 X(unsigned)S 240 x(char)S 239 x +(pad[3];)S 479 x(/*)S 240 x(get)S 239 x(on)S 239 x(32)S 240 x(word)S +239 x(boundary)S 240 x(*/)S 449 y 5752 X(unsigned)S 240 x(long)S +239 x(ul_x;)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x(ul_y;)S +448 y 5752 X(unsigned)S 240 x(long)S 239 x(lr_x;)S 449 y 5752 X +(unsigned)S 240 x(long)S 239 x(lr_y;)S 448 y 4796 X(})S 239 x +(xieIdcRoiReq;)S 747 y 5752 X(/*)S 449 y -478 x(**)S 239 x(Cpp)S +240 x(type)S 448 y 5752 X(*/)S 448 y 4796 X(typedef)S 239 x(struct)S +240 x({)S 449 y 5752 X(unsigned)S 240 x(char)S 239 x(pad[3];)S 479 x +(/*)S 240 x(get)S 239 x(on)S 239 x(32)S 240 x(word)S 239 x(boundary)S +240 x(*/)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x(ul_x;)S 448 y +5752 X(unsigned)S 240 x(long)S 239 x(ul_y;)S 448 y 5752 X(unsigned)S +240 x(long)S 239 x(iob_id;)S 449 y 4796 X(})S 239 x(xieIdcCppReq;)S +747 y 5752 X(/*)S 448 y -478 x(**)S 239 x(Tmp)S 240 x(type)S 449 y +5752 X(*/)S 448 y 4796 X(typedef)S 239 x(struct)S 240 x({)S 448 y +5752 X(unsigned)S 240 x(char)S 239 x(pad[3];)S 479 x(/*)S 240 x(get)S +239 x(on)S 239 x(32)S 240 x(word)S 239 x(boundary)S 240 x(*/)S 449 y +5752 X(unsigned)S 240 x(long)S 239 x(centerx;)S 448 y 5752 X +(unsigned)S 240 x(long)S 239 x(centery;)S 448 y 5752 X(unsigned)S +240 x(long)S 239 x(ListOfTmpEn)S 2 x(tries;/*)S 239 x(no.)S 240 x +(of)S 239 x(tmp)S 240 x(entries)S 239 x(\(8)S 240 x(unsigned)S 240 x +(chars\))S 239 x(that)S 240 x(follow)S 240 x(*/)S 449 y 4796 X(})S +239 x(xieIdcTmpReq;)S 747 y 5752 X(/*)S 448 y -478 x(**)S 239 x +(Import)S 240 x(Image)S 240 x(Request)S 448 y 5752 X(*/)S 449 y +4796 X(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X(unsigned)S +240 x(char)S 239 x(reqType;)S 240 x(/*)S 240 x(Extension)S 240 x +(type)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x(char)S 239 x +(opcode;)S 479 x(/*)S 240 x(XIE)S 239 x(function)S 240 x(*/)S 449 y +5752 X(unsigned)S 240 x(short)S 239 x(length;)S 240 x(/*)S 240 x +(length)S 239 x(in)S 240 x(longwords)S 240 x(of)S 239 x(whole)S 240 x +(request)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x +(iob_id;)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x(drawable;)S +449 y 4796 X(})S 239 x(xieImportImageReq;)S 35879 Y 3600 X F40 +(C\2034)S 449 x(XIE)S 165 x(Application)S 165 x(and)S 167 x(W)S -4 x +(ire)S 166 x(De\211nitions)S 165 x(and)S 167 x(Structures)S +PP +EP +%%DOC$Page: C-5 48 +1000 BP 39600 30600 PM 0 0 XY +5065 Y 5752 X F102(/*)S 448 y -478 x(**)S 239 x(Export)S 240 x +(Image)S 240 x(Request)S 239 x(\(copy)S 240 x(image)S 240 x(data:)S +239 x(Iob)S 240 x(-->)S 239 x(drawable\))S 448 y 5752 X(*/)S 448 y +4796 X(typedef)S 239 x(struct)S 240 x({)S 449 y 5752 X(unsigned)S +240 x(char)S 718 x(reqType;)S 448 y 5752 X(unsigned)S 240 x(char)S +718 x(opcode;)S 479 x(/*)S 239 x(function)S 240 x(==)S 239 x +(X_ieExportImag)S 2 x(e)S 20098 X(*/)S 448 y 5752 X(unsigned)S 240 x +(short)S 479 x(length;)S 449 y 5752 X(unsigned)S 240 x(long)S 718 x +(iob_id;)S 448 y 5752 X(unsigned)S 240 x(long)S 718 x(drawable;)S +448 y 5752 X(GContext)S 8860 X(gc;)S 449 y 5752 X(unsigned)S 240 x +(long)S 718 x(src_x;)S 448 y 5752 X(unsigned)S 240 x(long)S 718 x +(src_y;)S 448 y 5752 X(unsigned)S 240 x(long)S 718 x(width;)S 449 y +5752 X(unsigned)S 240 x(long)S 718 x(height;)S 448 y 5752 X +(unsigned)S 240 x(long)S 718 x(dst_x;)S 448 y 5752 X(unsigned)S 240 x +(long)S 718 x(dst_y;)S 449 y 4796 X(})S 239 x(xieExportImageReq;)S +747 y 5752 X(/*)S 448 y -478 x(**)S 239 x(General)S 240 x(Query)S +240 x(and)S 239 x(Delete)S 240 x(Resource)S 448 y 5752 X(*/)S 449 y +4796 X(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X(unsigned)S +240 x(char)S 239 x(reqType;)S 240 x(/*)S 240 x(Extension)S 240 x +(type)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x(char)S 239 x +(opcode;)S 240 x(/*)S 240 x(XIE)S 239 x(function)S 240 x(*/)S 449 y +5752 X(unsigned)S 240 x(short)S 239 x(length;)S 240 x(/*)S 240 x +(length)S 239 x(in)S 240 x(longwords)S 240 x(of)S 239 x(whole)S 240 x +(request)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x +(resource_id)S 2 x(;)S 448 y 4796 X(})S 239 x(xieQueryOrDeleteRe)S +2 x(q;)S 748 y 5752 X(/*)S 448 y -478 x(**)S 239 x(Copy)S 240 x +(Resource)S 448 y 5752 X(*/)S 449 y 4796 X(typedef)S 239 x(struct)S +240 x({)S 448 y 5752 X(unsigned)S 240 x(char)S 239 x(reqType;)S 240 x +(/*)S 240 x(Extension)S 240 x(type)S 239 x(*/)S 448 y 5752 X +(unsigned)S 240 x(char)S 239 x(opcode;)S 240 x(/*)S 240 x(XIE)S 239 x +(function)S 240 x(*/)S 448 y 5752 X(unsigned)S 240 x(short)S 239 x +(length;)S 240 x(/*)S 240 x(length)S 239 x(in)S 240 x(longwords)S +240 x(of)S 239 x(whole)S 240 x(request)S 239 x(*/)S 449 y 5752 X +(unsigned)S 240 x(long)S 239 x(src_id;)S 448 y 5752 X(unsigned)S +240 x(long)S 239 x(dst_id;)S 448 y 4796 X(})S 239 x +(xieCopyResourceReq)S 2 x(;)S 748 y 5752 X(/*)S 448 y -478 x(**)S +239 x(Get)S 240 x(Tile)S 239 x(Request)S 448 y 5752 X(*/)S 449 y +4796 X(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X(unsigned)S +240 x(char)S 239 x(reqType;)S 240 x(/*)S 240 x(Extension)S 240 x +(type)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x(char)S 239 x +(opcode;)S 240 x(/*)S 240 x(XIE)S 239 x(function)S 240 x(*/)S 449 y +5752 X(unsigned)S 240 x(short)S 239 x(length;)S 240 x(/*)S 240 x +(length)S 239 x(in)S 240 x(longwords)S 240 x(of)S 239 x(whole)S 240 x +(request)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x +(iob_id;)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x(x;)S 448 y +5752 X(unsigned)S 240 x(long)S 239 x(y;)S 449 y 5752 X(unsigned)S +240 x(long)S 239 x(width;)S 448 y 5752 X(unsigned)S 240 x(long)S +239 x(height;)S 448 y 5752 X(unsigned)S 240 x(char)S 239 x(final;)S +449 y 5752 X(unsigned)S 240 x(char)S 239 x(all_planes;)S 448 y 5752 X +(unsigned)S 240 x(char)S 239 x(plane_num;)S 448 y 5752 X(unsigned)S +240 x(char)S 239 x(pad;)S 449 y 4796 X(})S 239 x(xieGetTileReq;)S +35879 Y 14362 X F40(XIE)S 166 x(Appli)S -2 x(cation)S 167 x(and)S +166 x(W)S -4 x(ire)S 166 x(De\211nitions)S 166 x(and)S 166 x +(Structur)S 2 x(es)S 448 x(C\2035)S +PP +EP +%%DOC$Page: C-6 49 +1000 BP 39600 30600 PM 0 0 XY +5065 Y 5752 X F102(/*)S 448 y -478 x(**)S 239 x(Put)S 240 x(Tile)S +239 x(Request)S 240 x(\(transport)S 240 x(image)S 240 x(data:)S 239 x +(client)S 240 x(-->)S 240 x(server\))S 448 y 5752 X(*/)S 448 y 4796 X +(typedef)S 239 x(struct)S 240 x(_xiePutTileReq)S 241 x({)S 449 y +5752 X(unsigned)S 240 x(char)S 718 x(reqType;)S 448 y 5752 X +(unsigned)S 240 x(char)S 718 x(opcode;)S 479 x(/*)S 239 x(function)S +240 x(==)S 239 x(X_iePutTile)S 19142 X(*/)S 448 y 5752 X(unsigned)S +240 x(short)S 479 x(length;)S 449 y 5752 X(unsigned)S 240 x(long)S +718 x(iob_id;)S 448 y 5752 X(unsigned)S 240 x(long)S 718 x(x;)S 448 y +5752 X(unsigned)S 240 x(long)S 718 x(y;)S 449 y 5752 X(unsigned)S +240 x(long)S 718 x(width;)S 448 y 5752 X(unsigned)S 240 x(long)S +718 x(height;)S 448 y 5752 X(unsigned)S 240 x(char)S 718 x(final;)S +449 y 5752 X(unsigned)S 240 x(char)S 718 x(all_planes;)S 448 y 5752 X +(unsigned)S 240 x(char)S 718 x(plane_num;)S 448 y 5752 X(unsigned)S +240 x(char)S 718 x(pad[1];)S 449 y 4796 X(})S 239 x(xiePutTileReq;)S +747 y 5752 X(/*)S 448 y -478 x(**)S 239 x(Put)S 240 x(Stream)S 239 x +(Request)S 240 x(\(transport)S 240 x(image)S 240 x(data:)S 240 x +(client)S 239 x(-->)S 240 x(server\))S 448 y 5752 X(*/)S 449 y 4796 X +(typedef)S 239 x(struct)S 240 x(_xiePutStreamR)S 2 x(eq)S 239 x({)S +448 y 5752 X(unsigned)S 240 x(char)S 718 x(reqType;)S 448 y 5752 X +(unsigned)S 240 x(char)S 718 x(opcode;)S 479 x(/*)S 239 x(function)S +240 x(==)S 239 x(X_iePutStream)S 19620 X(*/)S 449 y 5752 X(unsigned)S +240 x(short)S 479 x(length;)S 448 y 5752 X(unsigned)S 240 x(long)S +718 x(iob_id;)S 448 y 5752 X(unsigned)S 240 x(char)S 718 x(final;)S +449 y 5752 X(unsigned)S 240 x(char)S 718 x(all_planes;)S 448 y 5752 X +(unsigned)S 240 x(char)S 718 x(plane_num;)S 448 y 5752 X(unsigned)S +240 x(char)S 718 x(number_of_lengths;)S 449 y 5752 X(unsigned)S 240 x +(long)S 718 x(image_len[1];)S 240 x(/*)S 239 x(at)S 240 x(run)S 239 x +(time)S 240 x([number_of_lengths])S 480 x(*/)S 448 y 4796 X(})S 239 x +(xiePutStreamReq;)S 747 y 5752 X(/*)S 448 y -478 x(**)S 239 x(Get)S +240 x(Stream)S 239 x(Request)S 449 y 5752 X(*/)S 448 y 4796 X +(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X(unsigned)S 240 x +(char)S 239 x(reqType;)S 240 x(/*)S 240 x(Extension)S 240 x(type)S +239 x(*/)S 449 y 5752 X(unsigned)S 240 x(char)S 239 x(opcode;)S 479 x +(/*)S 240 x(XIE)S 239 x(function)S 240 x(*/)S 448 y 5752 X(unsigned)S +240 x(short)S 239 x(length;)S 240 x(/*)S 240 x(length)S 239 x(in)S +240 x(longwords)S 240 x(of)S 239 x(whole)S 240 x(request)S 239 x(*/)S +448 y 5752 X(unsigned)S 240 x(long)S 239 x(iob_id;)S 449 y 5752 X +(unsigned)S 240 x(char)S 239 x(all_planes;)S 448 y 5752 X(unsigned)S +240 x(char)S 239 x(plane_num;)S 448 y 5752 X(unsigned)S 240 x(char)S +239 x(pad[2];)S 449 y 4796 X(})S 239 x(xieGetStreamReq;)S 747 y +5752 X(/*)S 448 y -478 x(**)S 239 x(Point)S 240 x(Request)S 448 y +5752 X(*/)S 449 y 4796 X(typedef)S 239 x(struct)S 240 x({)S 448 y +5752 X(unsigned)S 240 x(char)S 239 x(reqType;)S 240 x(/*)S 240 x +(Extension)S 240 x(type)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x +(char)S 239 x(opcode;)S 479 x(/*)S 240 x(XIE)S 239 x(function)S 240 x +(*/)S 449 y 5752 X(unsigned)S 240 x(short)S 239 x(length;)S 240 x +(/*)S 240 x(length)S 239 x(in)S 240 x(longwords)S 240 x(of)S 239 x +(whole)S 240 x(request)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x +(long)S 239 x(src_iob_id;)S 448 y 5752 X(unsigned)S 240 x(long)S +239 x(dst_iob_id;)S 449 y 5752 X(unsigned)S 240 x(long)S 239 x +(ipc_id;)S 448 y 5752 X(unsigned)S 240 x(char)S 239 x(new_quantum)S +2 x([XieK_MaxComponents])S 2 x(;)S 448 y 4796 X(/*)S 239 x(list)S +239 x(of)S 240 x(list)S 239 x(follow)S 240 x(*/)S 449 y 4796 X(})S +239 x(xiePointReq;)S 35879 Y 3600 X F40(C\2036)S 449 x(XIE)S 165 x +(Application)S 165 x(and)S 167 x(W)S -4 x(ire)S 166 x(De\211nitions)S +165 x(and)S 167 x(Structures)S +PP +EP +%%DOC$Page: C-7 50 +1000 BP 39600 30600 PM 0 0 XY +5065 Y 5752 X F102(/*)S 448 y -478 x(**)S 239 x(Area)S 240 x +(Request)S 448 y 5752 X(*/)S 448 y 4796 X(typedef)S 239 x(struct)S +240 x({)S 449 y 5752 X(unsigned)S 240 x(char)S 239 x(reqType;)S 240 x +(/*)S 240 x(Extension)S 240 x(type)S 239 x(*/)S 448 y 5752 X +(unsigned)S 240 x(char)S 239 x(opcode;)S 479 x(/*)S 240 x(XIE)S 239 x +(function)S 240 x(*/)S 448 y 5752 X(unsigned)S 240 x(short)S 239 x +(length;)S 240 x(/*)S 240 x(length)S 239 x(in)S 240 x(longwords)S +240 x(of)S 239 x(whole)S 240 x(request)S 239 x(*/)S 449 y 5752 X +(unsigned)S 240 x(long)S 239 x(src_iob_id;)S 448 y 5752 X(unsigned)S +240 x(long)S 239 x(dst_iob_id;)S 448 y 5752 X(unsigned)S 240 x(long)S +239 x(ipcc_id;)S 449 y 5752 X(unsigned)S 240 x(long)S 239 x +(ipct_id;)S 448 y 5752 X(unsigned)S 240 x(char)S 239 x(op1;)S 448 y +5752 X(unsigned)S 240 x(char)S 239 x(op2;)S 449 y 5752 X(unsigned)S +240 x(char)S 239 x(constrain;)S 448 y 5752 X(unsigned)S 240 x(char)S +239 x(pad;)S 448 y 4796 X(})S 239 x(xieAreaReq;)S 747 y 5752 X(/*)S +449 y -478 x(**)S 239 x(Arith)S 240 x(Request)S 448 y 5752 X(*/)S +448 y 4796 X(typedef)S 239 x(struct)S 240 x({)S 449 y 5752 X +(unsigned)S 240 x(char)S 239 x(reqType;)S 240 x(/*)S 240 x +(Extension)S 240 x(type)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x +(char)S 239 x(opcode;)S 479 x(/*)S 240 x(XIE)S 239 x(function)S 240 x +(*/)S 448 y 5752 X(unsigned)S 240 x(short)S 239 x(length;)S 240 x +(/*)S 240 x(length)S 239 x(in)S 240 x(longwords)S 240 x(of)S 239 x +(whole)S 240 x(request)S 239 x(*/)S 449 y 5752 X(unsigned)S 240 x +(long)S 239 x(src1_iob_id)S 2 x(;)S 448 y 5752 X(unsigned)S 240 x +(long)S 239 x(src2_iob_id)S 2 x(;)S 448 y 5752 X(unsigned)S 240 x +(long)S 239 x(constants[X)S 2 x(ieK_MaxComponents];)S 449 y 5752 X +(unsigned)S 240 x(long)S 239 x(dst_iob_id;)S 448 y 5752 X(unsigned)S +240 x(long)S 239 x(ipc_id;)S 448 y 5752 X(unsigned)S 240 x(char)S +239 x(op;)S 449 y 5752 X(unsigned)S 240 x(char)S 239 x(constrain;)S +448 y 5752 X(unsigned)S 240 x(short)S 239 x(pad;)S 448 y 4796 X(})S +239 x(xieArithReq;)S 747 y 5752 X(/*)S 449 y -478 x(**)S 239 x +(Compare)S 240 x(Request)S 448 y 5752 X(*/)S 448 y 4796 X(typedef)S +239 x(struct)S 240 x({)S 449 y 5752 X(unsigned)S 240 x(char)S 239 x +(reqType;)S 240 x(/*)S 240 x(Extension)S 240 x(type)S 239 x(*/)S +448 y 5752 X(unsigned)S 240 x(char)S 239 x(opcode;)S 479 x(/*)S 240 x +(XIE)S 239 x(function)S 240 x(*/)S 448 y 5752 X(unsigned)S 240 x +(short)S 239 x(length;)S 240 x(/*)S 240 x(length)S 239 x(in)S 240 x +(longwords)S 240 x(of)S 239 x(whole)S 240 x(request)S 239 x(*/)S +449 y 5752 X(unsigned)S 240 x(long)S 239 x(src1_iob_id)S 2 x(;)S +448 y 5752 X(unsigned)S 240 x(long)S 239 x(src2_iob_id)S 2 x(;)S +448 y 5752 X(unsigned)S 240 x(long)S 239 x(constants[X)S 2 x +(ieK_MaxComponents];)S 449 y 5752 X(unsigned)S 240 x(long)S 239 x +(cpp_id;)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x(ipc_id;)S 448 y +5752 X(unsigned)S 240 x(char)S 239 x(op;)S 449 y 5752 X(unsigned)S +240 x(char)S 239 x(combine;)S 448 y 5752 X(unsigned)S 240 x(short)S +239 x(pad;)S 448 y 4796 X(})S 239 x(xieCompareReq;)S 747 y 5752 X +(/*)S 449 y -478 x(**)S 239 x(Logical)S 240 x(Request)S 448 y 5752 X +(*/)S 448 y 4796 X(typedef)S 239 x(struct)S 240 x({)S 449 y 5752 X +(unsigned)S 240 x(char)S 239 x(reqType;)S 240 x(/*)S 240 x +(Extension)S 240 x(type)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x +(char)S 239 x(opcode;)S 479 x(/*)S 240 x(XIE)S 239 x(function)S 240 x +(*/)S 448 y 5752 X(unsigned)S 240 x(short)S 239 x(length;)S 240 x +(/*)S 240 x(length)S 239 x(in)S 240 x(longwords)S 240 x(of)S 239 x +(whole)S 240 x(request)S 239 x(*/)S 449 y 5752 X(unsigned)S 240 x +(long)S 239 x(src1_iob_id)S 2 x(;)S 448 y 5752 X(unsigned)S 240 x +(long)S 239 x(src2_iob_id)S 2 x(;)S 448 y 5752 X(unsigned)S 240 x +(long)S 239 x(constants[X)S 2 x(ieK_MaxComponents];)S 449 y 5752 X +(unsigned)S 240 x(long)S 239 x(dst_iob_id;)S 448 y 5752 X(unsigned)S +240 x(long)S 239 x(ipc_id;)S 448 y 5752 X(unsigned)S 240 x(char)S +239 x(op;)S 449 y 5752 X(unsigned)S 240 x(char)S 239 x(pad[3];)S +448 y 4796 X(})S 239 x(xieLogicalReq;)S 35879 Y 14362 X F40(XIE)S +166 x(Appli)S -2 x(cation)S 167 x(and)S 166 x(W)S -4 x(ire)S 166 x +(De)S +(\211nitions)S 166 x(and)S 166 x(Structur)S 2 x(es)S 448 x(C\2037)S +PP +EP +%%DOC$Page: C-8 51 +1000 BP 39600 30600 PM 0 0 XY +5065 Y 5752 X F102(/*)S 448 y -478 x(**)S 239 x(Math)S 240 x +(Function)S 240 x(Request)S 448 y 5752 X(*/)S 448 y 4796 X(typedef)S +239 x(struct)S 240 x({)S 449 y 5752 X(unsigned)S 240 x(char)S 239 x +(reqType;)S 240 x(/*)S 240 x(Extension)S 240 x(type)S 239 x(*/)S +448 y 5752 X(unsigned)S 240 x(char)S 239 x(opcode;)S 479 x(/*)S 240 x +(XIE)S 239 x(function)S 240 x(*/)S 448 y 5752 X(unsigned)S 240 x +(short)S 239 x(length;)S 240 x(/*)S 240 x(length)S 239 x(in)S 240 x +(longwords)S 240 x(of)S 239 x(whole)S 240 x(request)S 239 x(*/)S +449 y 5752 X(unsigned)S 240 x(long)S 239 x(src1_iob_id)S 2 x(;)S +448 y 5752 X(unsigned)S 240 x(long)S 239 x(src2_iob_id)S 2 x(;)S +448 y 5752 X(unsigned)S 240 x(long)S 239 x(ipc_id;)S 449 y 5752 X +(unsigned)S 240 x(char)S 239 x(op;)S 448 y 5752 X(unsigned)S 240 x +(char)S 239 x(constrain;)S 448 y 5752 X(unsigned)S 240 x(short)S +239 x(pad;)S 449 y 4796 X(})S 239 x(xieMathfReq;)S 747 y 5752 X(/*)S +448 y -478 x(**)S 239 x(Crop)S 240 x(Image)S 239 x(Request)S 448 y +5752 X(*/)S 449 y 4796 X(typedef)S 239 x(struct)S 240 x({)S 448 y +5752 X(unsigned)S 240 x(char)S 239 x(reqType;)S 240 x(/*)S 240 x +(Extension)S 240 x(type)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x +(char)S 239 x(opcode;)S 479 x(/*)S 240 x(XIE)S 239 x(function)S 240 x +(*/)S 449 y 5752 X(unsigned)S 240 x(short)S 239 x(length;)S 240 x +(/*)S 240 x(length)S 239 x(in)S 240 x(longwords)S 240 x(of)S 239 x +(whole)S 240 x(request)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x +(long)S 239 x(src_iob_id;)S 448 y 5752 X(unsigned)S 240 x(long)S +239 x(dst_iob_id;)S 449 y 5752 X(unsigned)S 240 x(long)S 239 x +(ipc_id;)S 448 y 4796 X(})S 239 x(xieCropImageReq;)S 747 y 5752 X +(/*)S 449 y -478 x(**)S 239 x(Translate)S 240 x(Image)S 240 x +(Request)S 448 y 5752 X(*/)S 448 y 4796 X(typedef)S 239 x(struct)S +240 x({)S 449 y 5752 X(unsigned)S 240 x(char)S 239 x(reqType;)S 240 x +(/*)S 240 x(Extension)S 240 x(type)S 239 x(*/)S 448 y 5752 X +(unsigned)S 240 x(char)S 239 x(opcode;)S 479 x(/*)S 240 x(XIE)S 239 x +(function)S 240 x(*/)S 448 y 5752 X(unsigned)S 240 x(short)S 239 x +(length;)S 240 x(/*)S 240 x(length)S 239 x(in)S 240 x(longwords)S +240 x(of)S 239 x(whole)S 240 x(request)S 239 x(*/)S 448 y 5752 X +(unsigned)S 240 x(long)S 239 x(src_iob_id;)S 449 y 5752 X(unsigned)S +240 x(long)S 239 x(constants[X)S 2 x(ieK_MaxComponents];)S 448 y +5752 X(unsigned)S 240 x(long)S 239 x(dst_iob_id;)S 448 y 5752 X +(unsigned)S 240 x(long)S 239 x(ipc_id;)S 449 y 4796 X(})S 239 x +(xieCropImageReq;)S 747 y 5752 X(/*)S 448 y -478 x(**)S 239 x(Scale)S +240 x(Image)S 239 x(Request)S 449 y 5752 X(*/)S 448 y 4796 X +(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X(unsigned)S 240 x +(char)S 239 x(reqType;)S 240 x(/*)S 240 x(Extension)S 240 x(type)S +239 x(*/)S 449 y 5752 X(unsigned)S 240 x(char)S 239 x(opcode;)S 479 x +(/*)S 240 x(XIE)S 239 x(function)S 240 x(*/)S 448 y 5752 X(unsigned)S +240 x(short)S 239 x(length;)S 240 x(/*)S 240 x(length)S 239 x(in)S +240 x(longwords)S 240 x(of)S 239 x(whole)S 240 x(request)S 239 x(*/)S +448 y 5752 X(unsigned)S 240 x(long)S 239 x(src_iob_id;)S 448 y 5752 X +(unsigned)S 240 x(long)S 239 x(dst_iob_id;)S 449 y 5752 X(unsigned)S +240 x(short)S 239 x(pixels_per)S 2 x(_scanline;)S 448 y 5752 X +(unsigned)S 240 x(short)S 239 x(number_of_)S 2 x(scanlines;)S 448 y +4796 X(})S 239 x(xieScaleImageReq;)S 748 y 5752 X(/*)S 448 y -478 x +(**)S 239 x(Rotate)S 240 x(Image)S 240 x(Request)S 448 y 5752 X(*/)S +449 y 4796 X(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X +(unsigned)S 240 x(char)S 239 x(reqType;)S 240 x(/*)S 240 x +(Extension)S 240 x(type)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x +(char)S 239 x(opcode;)S 479 x(/*)S 240 x(xie)S 239 x(function)S 240 x +(*/)S 449 y 5752 X(unsigned)S 240 x(short)S 239 x(length;)S 240 x +(/*)S 240 x(length)S 239 x(in)S 240 x(longwords)S 240 x(of)S 239 x +(whole)S 240 x(request)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x +(long)S 239 x(src_iob_id;)S 448 y 5752 X(unsigned)S 240 x(long)S +239 x(dst_iob_id;)S 449 y 5752 X(XieFloat)S 240 x(angle;)S 448 y +5752 X(unsigned)S 240 x(char)S 239 x(clip;)S 448 y 5752 X(unsigned)S +240 x(char)S 239 x(pad[3];)S 448 y 5752 X(unsigned)S 240 x(long)S +239 x(bits_per_co)S 2 x(mponent[XieK_MaxComp)S 2 x(onents];)S 449 y +4796 X(})S 239 x(xieRotateImageReq;)S 35879 Y 3600 X F40(C\2038)S +449 x(XIE)S 165 x(Application)S 165 x(and)S 167 x(W)S -4 x(ire)S +166 x(De\211nitions)S 165 x(and)S 167 x(Structures)S +PP +EP +%%DOC$Page: C-9 52 +1000 BP 39600 30600 PM 0 0 XY +5065 Y 5752 X F102(/*)S 448 y -478 x(**)S 239 x(Mirror)S 240 x +(Image)S 240 x(Request)S 448 y 5752 X(*/)S 448 y 4796 X(typedef)S +239 x(struct)S 240 x({)S 449 y 5752 X(unsigned)S 240 x(char)S 239 x +(reqType;)S 240 x(/*)S 240 x(Extension)S 240 x(type)S 239 x(*/)S +448 y 5752 X(unsigned)S 240 x(char)S 239 x(opcode;)S 479 x(/*)S 240 x +(XIE)S 239 x(function)S 240 x(*/)S 448 y 5752 X(unsigned)S 240 x +(short)S 239 x(length;)S 240 x(/*)S 240 x(length)S 239 x(in)S 240 x +(longwords)S 240 x(of)S 239 x(whole)S 240 x(request)S 239 x(*/)S +449 y 5752 X(unsigned)S 240 x(long)S 239 x(src_iob_id;)S 448 y 5752 X +(unsigned)S 240 x(long)S 239 x(dst_iob_id;)S 448 y 5752 X(unsigned)S +240 x(char)S 239 x(x_mirror;)S 449 y 5752 X(unsigned)S 240 x(char)S +239 x(y_mirror;)S 448 y 5752 X(unsigned)S 240 x(char)S 239 x +(pad[2];)S 448 y 4796 X(})S 239 x(xieMirrorImageReq;)S 748 y 5752 X +(/*)S 448 y -478 x(**)S 239 x(Constrain)S 240 x(Request)S 448 y +5752 X(*/)S 448 y 4796 X(typedef)S 239 x(struct)S 240 x({)S 449 y +5752 X(unsigned)S 240 x(char)S 239 x(reqType;)S 240 x(/*)S 240 x +(Extension)S 240 x(type)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x +(char)S 239 x(opcode;)S 479 x(/*)S 240 x(XIE)S 239 x(function)S 240 x +(*/)S 448 y 5752 X(unsigned)S 240 x(short)S 239 x(length;)S 240 x +(/*)S 240 x(length)S 239 x(in)S 240 x(longwords)S 240 x(of)S 239 x +(whole)S 240 x(request)S 239 x(*/)S 449 y 5752 X(unsigned)S 240 x +(long)S 239 x(iob_id;)S 448 y 4796 X(})S 239 x(xieConstrainReq;)S +747 y 5752 X(/*)S 449 y -478 x(**)S 239 x(Match)S 240 x(Histogram)S +240 x(Request)S 448 y 5752 X(*/)S 448 y 4796 X(typedef)S 239 x +(struct)S 240 x({)S 449 y 5752 X(unsigned)S 240 x(char)S 239 x +(reqType;)S 240 x(/*)S 240 x(Extension)S 240 x(type)S 239 x(*/)S +448 y 5752 X(unsigned)S 240 x(char)S 239 x(opcode;)S 479 x(/*)S 240 x +(XIE)S 239 x(function)S 240 x(*/)S 448 y 5752 X(unsigned)S 240 x +(short)S 239 x(length;)S 240 x(/*)S 240 x(length)S 239 x(in)S 240 x +(longwords)S 240 x(of)S 239 x(whole)S 240 x(request)S 239 x(*/)S +449 y 5752 X(unsigned)S 240 x(long)S 239 x(iob_id1;)S 448 y 5752 X +(unsigned)S 240 x(long)S 239 x(iob_id2;)S 448 y 5752 X(unsigned)S +240 x(long)S 239 x(ipc_id;)S 448 y 5752 X(XieFloat)S 240 x(param1;)S +449 y 5752 X(XieFloat)S 240 x(param2;)S 448 y 5752 X(unsigned)S 240 x +(char)S 239 x(h_shape;)S 448 y 5752 X(unsigned)S 240 x(char)S 718 x +(pad[3];)S 449 y 4796 X(})S 239 x(xieMatchHistogramR)S 2 x(eq;)S +747 y 5752 X(/*)S 448 y -478 x(**)S 239 x(Chrominance)S 240 x +(Separate)S 240 x(Request)S 449 y 5752 X(*/)S 448 y 4796 X(typedef)S +239 x(struct)S 240 x({)S 448 y 5752 X(unsigned)S 240 x(char)S 239 x +(reqType;)S 240 x(/*)S 240 x(Extension)S 240 x(type)S 239 x(*/)S +449 y 5752 X(unsigned)S 240 x(char)S 239 x(opcode;)S 479 x(/*)S 240 x +(XIE)S 239 x(function)S 240 x(*/)S 448 y 5752 X(unsigned)S 240 x +(short)S 239 x(length;)S 240 x(/*)S 240 x(length)S 239 x(in)S 240 x +(longwords)S 240 x(of)S 239 x(whole)S 240 x(request)S 239 x(*/)S +448 y 5752 X(unsigned)S 240 x(long)S 239 x(iob_id1;)S 448 y 5752 X +(unsigned)S 240 x(long)S 239 x(iob_id2;)S 449 y 5752 X(unsigned)S +240 x(long)S 239 x(iob_id3;)S 448 y 5752 X(unsigned)S 240 x(long)S +239 x(dst_iob_id;)S 448 y 4796 X(})S 239 x(xieChromeSepReq;)S 748 y +5752 X(/*)S 448 y -478 x(**)S 239 x(Chrominance)S 240 x(Combine)S +240 x(Request)S 448 y 5752 X(*/)S 449 y 4796 X(typedef)S 239 x +(struct)S 240 x({)S 448 y 5752 X(unsigned)S 240 x(char)S 239 x +(reqType;)S 240 x(/*)S 240 x(Extension)S 240 x(type)S 239 x(*/)S +448 y 5752 X(unsigned)S 240 x(char)S 239 x(opcode;)S 479 x(/*)S 240 x +(XIE)S 239 x(function)S 240 x(*/)S 449 y 5752 X(unsigned)S 240 x +(short)S 239 x(length;)S 240 x(/*)S 240 x(length)S 239 x(in)S 240 x +(longwords)S 240 x(of)S 239 x(whole)S 240 x(request)S 239 x(*/)S +448 y 5752 X(unsigned)S 240 x(long)S 239 x(src_iob;)S 448 y 5752 X +(unsigned)S 240 x(long)S 239 x(iob_id1;)S 449 y 5752 X(unsigned)S +240 x(long)S 239 x(iob_id2;)S 448 y 5752 X(unsigned)S 240 x(long)S +239 x(iob_id3;)S 448 y 4796 X(})S 239 x(xieChromeComReq;)S 35879 Y +14362 X F40(XIE)S 166 x(Appli)S -2 x(cation)S 167 x(and)S 166 x(W)S +-4 x(ire)S 166 x(De\211nitions)S 166 x(and)S 166 x(Structur)S 2 x +(es)S 448 x(C\2039)S +PP +EP +%%DOC$Page: C-10 53 +1000 BP 39600 30600 PM 0 0 XY +5065 Y 5752 X F102(/*)S 448 y -478 x(**)S 239 x(Dither)S 240 x +(Request)S 448 y 5752 X(*/)S 448 y 4796 X(typedef)S 239 x(struct)S +240 x({)S 449 y 5752 X(unsigned)S 240 x(char)S 239 x(reqType;)S 240 x +(/*)S 240 x(Extension)S 240 x(type)S 239 x(*/)S 448 y 5752 X +(unsigned)S 240 x(char)S 239 x(opcode;)S 479 x(/*)S 240 x(XIE)S 239 x +(function)S 240 x(*/)S 448 y 5752 X(unsigned)S 240 x(short)S 239 x +(length;)S 240 x(/*)S 240 x(length)S 239 x(in)S 240 x(longwords)S +240 x(of)S 239 x(whole)S 240 x(request)S 239 x(*/)S 449 y 5752 X +(unsigned)S 240 x(long)S 239 x(src_iob_id;)S 448 y 5752 X(unsigned)S +240 x(long)S 239 x(dst_iob_id;)S 448 y 5752 X(unsigned)S 240 x(char)S +239 x(result_bits)S 2 x([XieK_MaxComponents])S 2 x(;)S 449 y 5752 X +(unsigned)S 240 x(char)S 239 x(pad;)S 448 y 4796 X(})S 239 x +(xieDitherReq;)S 747 y 5752 X(/*)S 449 y -478 x(**)S 239 x +(Luminance)S 240 x(Request)S 448 y 5752 X(*/)S 448 y 4796 X(typedef)S +239 x(struct)S 240 x({)S 448 y 5752 X(unsigned)S 240 x(char)S 239 x +(reqType;)S 240 x(/*)S 240 x(Extension)S 240 x(type)S 239 x(*/)S +449 y 5752 X(unsigned)S 240 x(char)S 239 x(opcode;)S 479 x(/*)S 240 x +(XIE)S 239 x(function)S 240 x(*/)S 448 y 5752 X(unsigned)S 240 x +(short)S 239 x(length;)S 240 x(/*)S 240 x(length)S 239 x(in)S 240 x +(longwords)S 240 x(of)S 239 x(whole)S 240 x(request)S 239 x(*/)S +448 y 5752 X(unsigned)S 240 x(long)S 239 x(src_iob_id;)S 449 y 5752 X +(unsigned)S 240 x(long)S 239 x(dst_iob_id;)S 448 y 4796 X(})S 239 x +(xieLuminanceReq;)S 747 y 5752 X(/*)S 449 y -478 x(**)S 239 x +(Calculate)S 240 x(Histogram)S 240 x(Request)S 448 y 5752 X(*/)S +448 y 4796 X(typedef)S 239 x(struct)S 240 x({)S 449 y 5752 X +(unsigned)S 240 x(char)S 239 x(reqType;)S 240 x(/*)S 240 x +(Extension)S 240 x(type)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x +(char)S 239 x(opcode;)S 479 x(/*)S 240 x(XIE)S 239 x(function)S 240 x +(*/)S 448 y 5752 X(unsigned)S 240 x(short)S 239 x(length;)S 240 x +(/*)S 240 x(length)S 239 x(in)S 240 x(longwords)S 240 x(of)S 239 x +(whole)S 240 x(request)S 239 x(*/)S 449 y 5752 X(unsigned)S 240 x +(long)S 239 x(iob_id;)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x +(ipc_id;)S 448 y 5752 X(unsigned)S 240 x(char)S 239 x(by_componen)S +2 x(t];)S 448 y 5752 X(unsigned)S 240 x(char)S 239 x(pad[3];)S 449 y +4796 X(})S 239 x(xieCalcHistReq;)S 747 y 5752 X(/*)S 448 y -478 x +(**)S 239 x(Point)S 240 x(Statistics)S 240 x(Request)S 449 y 5752 X +(*/)S 448 y 4796 X(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X +(unsigned)S 240 x(char)S 239 x(reqType;)S 240 x(/*)S 240 x +(Extension)S 240 x(type)S 239 x(*/)S 449 y 5752 X(unsigned)S 240 x +(char)S 239 x(opcode;)S 479 x(/*)S 240 x(XIE)S 239 x(function)S 240 x +(*/)S 448 y 5752 X(unsigned)S 240 x(short)S 239 x(length;)S 240 x +(/*)S 240 x(length)S 239 x(in)S 240 x(longwords)S 240 x(of)S 239 x +(whole)S 240 x(request)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x +(long)S 239 x(iob_id;)S 449 y 5752 X(unsigned)S 240 x(long)S 239 x +(x_location;)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x +(y_location;)S 448 y 5752 X(unsigned)S 240 x(char)S 478 x +(edge_size;)S 448 y 5752 X(unsigned)S 240 x(char)S 718 x(pad[3];)S +449 y 4796 X(})S 239 x(xiePointStatsReq;)S 747 y 5752 X(/*)S 448 y +-478 x(**)S 239 x(Area)S 240 x(Statistics)S 240 x(Request)S 449 y +5752 X(*/)S 448 y 4796 X(typedef)S 239 x(struct)S 240 x({)S 448 y +5752 X(unsigned)S 240 x(char)S 239 x(reqType;)S 240 x(/*)S 240 x +(Extension)S 240 x(type)S 239 x(*/)S 449 y 5752 X(unsigned)S 240 x +(char)S 239 x(opcode;)S 479 x(/*)S 240 x(XIE)S 239 x(function)S 240 x +(*/)S 448 y 5752 X(unsigned)S 240 x(short)S 239 x(length;)S 240 x +(/*)S 240 x(length)S 239 x(in)S 240 x(longwords)S 240 x(of)S 239 x +(whole)S 240 x(request)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x +(long)S 239 x(src_iob_id;)S 449 y 5752 X(unsigned)S 240 x(long)S +239 x(dst_iob_id;)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x +(ipc_id;)S 448 y 5752 X(unsigned)S 240 x(char)S 478 x(edge_size;)S +449 y 5752 X(unsigned)S 240 x(char)S 478 x(stat_type;)S 448 y 5752 X +(unsigned)S 240 x(char)S 718 x(pad[2];)S 448 y 4796 X(})S 239 x +(xieAreaStatsReq;)S 35879 Y 3600 X F40(C\20310)S 449 x(XIE)S 166 x +(Appli)S -2 x(cation)S 167 x(and)S 166 x(W)S -4 x(ire)S 166 x +(De\211nitions)S 166 x(and)S 166 x(Structure)S 2 x(s)S +PP +EP +%%DOC$Page: C-11 54 +1000 BP 39600 30600 PM 0 0 XY +5065 Y 5752 X F102(/*)S 448 y -478 x(**)S 239 x(Display)S 240 x +(Sequence)S 240 x(Request)S 448 y 5752 X(*/)S 448 y 4796 X(typedef)S +239 x(struct)S 240 x({)S 449 y 5752 X(unsigned)S 240 x(char)S 239 x +(reqType;)S 240 x(/*)S 240 x(Extension)S 240 x(type)S 239 x(*/)S +448 y 5752 X(unsigned)S 240 x(char)S 239 x(opcode;)S 479 x(/*)S 240 x +(XIE)S 239 x(function)S 240 x(*/)S 448 y 5752 X(unsigned)S 240 x +(short)S 239 x(length;)S 240 x(/*)S 240 x(length)S 239 x(in)S 240 x +(longwords)S 240 x(of)S 239 x(whole)S 240 x(request)S 239 x(*/)S +449 y 5752 X(unsigned)S 240 x(long)S 239 x(window_id;)S 448 y 5752 X +(unsigned)S 240 x(short)S 239 x(frame_coun)S 2 x(t;)S 448 y 5752 X +(unsigned)S 240 x(short)S 239 x(frame_timi)S 2 x(ng;)S 449 y 5752 X +(unsigned)S 240 x(char)S 478 x(forward;)S 448 y 5752 X(unsigned)S +240 x(char)S 478 x(number_of_)S 2 x(pixmaps;)S 448 y 4796 X(})S 239 x +(xieDisplaySeqReq;)S 748 y 5752 X(/*)S 448 y -478 x(**)S 239 x +(Events)S 240 x(Requests)S 448 y 5752 X(*/)S 448 y 4796 X(typedef)S +239 x(struct)S 240 x({)S 449 y 5752 X(unsigned)S 240 x(char)S 239 x +(reqType;)S 240 x(/*)S 240 x(Extension)S 240 x(type)S 239 x(*/)S +448 y 5752 X(unsigned)S 240 x(char)S 239 x(opcode;)S 479 x(/*)S 240 x +(XIE)S 239 x(function)S 240 x(*/)S 448 y 5752 X(unsigned)S 240 x +(short)S 239 x(length;)S 240 x(/*)S 240 x(length)S 239 x(in)S 240 x +(longwords)S 240 x(of)S 239 x(whole)S 240 x(request)S 239 x(*/)S +449 y 5752 X(unsigned)S 240 x(long)S 239 x(event_param)S 2 x(;)S +448 y 4796 X(})S 239 x(xieEventsReq;)S 15824 Y 4796 X +(/*******************)S 2 x(*******************)S 2 x +(*******************)S 2 x(*******************)S 448 y 4796 X(**)S +239 x(Replies)S 449 y 4796 X(********************)S 2 x +(*******************)S 2 x(*******************)S 2 x +(******************/)S 747 y 4796 X(/*)S 239 x(Reply)S 239 x(for)S +240 x(Get)S 239 x(Image)S 240 x(*/)S 747 y 4796 X(typedef)S 239 x +(struct)S 240 x({)S 449 y 5752 X(char)S 239 x(type;)S 10056 X(/*)S +239 x(XIE_Reply)S 240 x(*/)S 448 y 5752 X(char)S 239 x(pad;)S 448 y +5752 X(unsigned)S 240 x(short)S 239 x(sequenceNu)S 2 x(mber;)S 448 y +5752 X(unsigned)S 240 x(long)S 239 x(length;)S 12208 X(/*)S 239 x +(length)S 240 x(of)S 239 x(returned)S 240 x(image)S 240 x(data)S +449 y 7665 X(in)S 239 x(bytes*/)S 448 y 5752 X(unsigned)S 240 x +(long)S 239 x(pad1[6];)S 448 y 4796 X(})S 239 x(xieGetImageReply;)S +748 y 4796 X(/*)S 239 x(Reply)S 239 x(for)S 240 x(IOB)S 239 x(query)S +240 x(*/)S 747 y 4796 X(typedef)S 239 x(struct)S 240 x({)S 448 y +5752 X(char)S 239 x(type;)S 10056 X(/*)S 239 x(XIE_Reply)S 240 x(*/)S +448 y 5752 X(char)S 239 x(pad;)S 449 y 5752 X(unsigned)S 240 x +(short)S 239 x(sequenceNu)S 2 x(mber;)S 448 y 5752 X(unsigned)S 240 x +(long)S 239 x(length;)S 12208 X(/*)S 239 x(0)S 239 x(*/)S 448 y +5752 X(unsigned)S 240 x(short)S 239 x(pixels_per)S 2 x(_scanline;)S +449 y 5752 X(unsigned)S 240 x(short)S 239 x(number_of_)S 2 x +(scanlines;)S 448 y 5752 X(unsigned)S 240 x(char)S 478 x(number_of_)S +2 x(spectral_components;)S 448 y 5752 X(unsigned)S 240 x(char)S 478 x +(total_bits)S 2 x(_per_pixel;)S 449 y 5752 X(unsigned)S 240 x(char)S +478 x(polarity;)S 448 y 5752 X(unsigned)S 240 x(char)S 478 x +(grid_type;)S 448 y 5752 X(char)S 718 x(pad0;)S 449 y 5752 X +(unsigned)S 240 x(char)S 478 x(num_of_asp)S 2 x(ect_ratio;)S 15316 X +(/*)S 239 x(will)S 240 x(this)S 239 x(exceed)S 240 x(32)S 239 x +(chars)S 240 x(?)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x(long)S +239 x(pad1;)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x(pad2;)S +449 y 5752 X(unsigned)S 240 x(long)S 239 x(pad3;)S 448 y 4796 X(})S +239 x(xieQueryIobReply;)S 747 y 4796 X(/*)S 239 x(Reply)S 239 x(for)S +240 x(IPC/ROI)S 240 x(query)S 239 x(*/)S 35879 Y 14137 X F40(XIE)S +166 x(Application)S 165 x(and)S 166 x(W)S -4 x(ire)S 167 x +(De\211nitions)S 165 x(and)S 166 x(Struct)S 2 x(ures)S 449 x(C\2031)S +-25 x(1)S +PP +EP +%%DOC$Page: C-12 55 +1000 BP 39600 30600 PM 0 0 XY +5038 Y 4796 X F102(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X +(char)S 239 x(type;)S 10056 X(/*)S 239 x(XIE_Reply)S 240 x(*/)S 448 y +5752 X(char)S 239 x(pad;)S 449 y 5752 X(unsigned)S 240 x(short)S +239 x(sequenceNu)S 2 x(mber;)S 448 y 5752 X(unsigned)S 240 x(long)S +239 x(length;)S 12208 X(/*)S 239 x(0)S 239 x(*/)S 448 y 5752 X +(unsigned)S 240 x(char)S 239 x(ipc_type;)S 449 y 5752 X(char)S 239 x +(pad1;)S 448 y 5752 X(unsigned)S 240 x(short)S 239 x(ul_x;)S 448 y +5752 X(unsigned)S 240 x(short)S 239 x(ul_y;)S 449 y 5752 X(unsigned)S +240 x(short)S 239 x(lr_x;)S 448 y 5752 X(unsigned)S 240 x(short)S +239 x(lr_y;)S 448 y 5752 X(unsigned)S 240 x(short)S 239 x(pad2;)S +449 y 5752 X(unsigned)S 240 x(long)S 239 x(pad3;)S 448 y 5752 X +(unsigned)S 240 x(long)S 239 x(pad4;)S 448 y 5752 X(unsigned)S 240 x +(long)S 239 x(pad5;)S 449 y 4796 X(})S 239 x(xieQueryIpcRoiRepl)S +2 x(y;)S 747 y 4796 X(/*)S 239 x(Reply)S 239 x(for)S 240 x(IPC/CPP)S +240 x(query)S 239 x(*/)S 747 y 4796 X(typedef)S 239 x(struct)S 240 x +({)S 448 y 5752 X(char)S 239 x(type;)S 10056 X(/*)S 239 x(XIE_Reply)S +240 x(*/)S 449 y 5752 X(char)S 239 x(pad;)S 448 y 5752 X(unsigned)S +240 x(short)S 239 x(sequenceNu)S 2 x(mber;)S 448 y 5752 X(unsigned)S +240 x(long)S 239 x(length;)S 12208 X(/*)S 239 x(0)S 239 x(*/)S 449 y +5752 X(unsigned)S 240 x(char)S 239 x(ipc_type;)S 448 y 5752 X(char)S +239 x(pad1;)S 448 y 5752 X(unsigned)S 240 x(short)S 239 x(ul_x;)S +449 y 5752 X(unsigned)S 240 x(short)S 239 x(ul_y;)S 448 y 5752 X +(unsigned)S 240 x(long)S 239 x(ipc_data;)S 448 y 5752 X(unsigned)S +240 x(short)S 239 x(pad2;)S 448 y 5752 X(unsigned)S 240 x(long)S +239 x(pad3;)S 449 y 5752 X(unsigned)S 240 x(long)S 239 x(pad4;)S +448 y 5752 X(unsigned)S 240 x(long)S 239 x(pad5;)S 448 y 4796 X(})S +239 x(xieQueryIpcCppRepl)S 2 x(y;)S 748 y 4796 X(/*)S 239 x(Reply)S +239 x(for)S 240 x(IPC/TMP)S 240 x(query)S 239 x(*/)S 747 y 4796 X +(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X(char)S 239 x(type;)S +10056 X(/*)S 239 x(XIE_Reply)S 240 x(*/)S 448 y 5752 X(char)S 239 x +(pad;)S 449 y 5752 X(unsigned)S 240 x(short)S 239 x(sequenceNu)S +2 x(mber;)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x(length;)S +12208 X(/*)S 239 x(length)S 240 x(of)S 239 x(entries)S 240 x(*/)S +448 y 5752 X(unsigned)S 240 x(char)S 239 x(ipc_type;)S 449 y 5752 X +(char)S 239 x(pad1;)S 448 y 5752 X(unsigned)S 240 x(short)S 239 x +(ListOfTmpE)S 2 x(ntries;)S 448 y 5752 X(unsigned)S 240 x(short)S +239 x(centerx;)S 449 y 5752 X(unsigned)S 240 x(short)S 239 x +(centery;)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x(pad2;)S 448 y +5752 X(unsigned)S 240 x(long)S 239 x(pad3;)S 449 y 5752 X(unsigned)S +240 x(long)S 239 x(pad4;)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x +(pad5;)S 448 y 4796 X(})S 239 x(xieQueryIpcTmpRepl)S 2 x(y;)S 748 y +4796 X(/*)S 239 x(Each)S 239 x(TMP)S 240 x(entry)S 239 x(uses)S 240 x +(the)S 239 x(folowing)S 240 x(structure)S 240 x(*/)S 747 y 4796 X +(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X(CARD8)S 240 x +(x_index;)S 448 y 5752 X(CARD8)S 240 x(y_index;)S 449 y 5752 X +(unsigned)S 240 x(short)S 239 x(numerator;)S 448 y 5752 X(unsigned)S +240 x(short)S 239 x(denominato)S 2 x(r;)S 448 y 5752 X(unsigned)S +240 x(char)S 718 x(positive;)S 449 y 5752 X(char)S 718 x(pad;)S +9338 X(/*)S 240 x(32)S 239 x(bit)S 240 x(boundary)S 239 x(for)S 240 x +(swapping)S 240 x(*/)S 448 y 4796 X(})S 239 x(xieTmpEntry;)S 35879 Y +3600 X F40(C\20312)S 449 x(XIE)S 166 x(Appli)S -2 x(cation)S 167 x +(and)S 166 x(W)S -4 x(ire)S 166 x(De\211nitions)S 166 x(and)S 166 x +(Structure)S 2 x(s)S +PP +EP +%%DOC$Page: C-13 56 +1000 BP 39600 30600 PM 0 0 XY +5065 Y 5752 X F102(/*)S 448 y -478 x(**)S 239 x(Reply)S 240 x(for)S +239 x(Init)S 240 x(Session)S 448 y 5752 X(*/)S 448 y 4796 X(typedef)S +239 x(struct)S 240 x({)S 449 y 5752 X(char)S 7904 X(type;)S 479 x +(/*)S 239 x(XIE_Reply)S 240 x(*/)S 448 y 5752 X(unsigned)S 240 x +(char)S 718 x(success;)S 448 y 5752 X(unsigned)S 240 x(short)S 479 x +(sequenceNumber;)S 449 y 5752 X(unsigned)S 240 x(long)S 718 x +(length;)S 479 x(/*)S 239 x(length)S 240 x(in)S 239 x(chars)S 239 x +(of)S 240 x(additional)S 240 x(data)S 239 x(*/)S 448 y 5752 X +(unsigned)S 240 x(long)S 718 x(service_classes;)S 448 y 5752 X +(unsigned)S 240 x(short)S 479 x(major_version;)S 449 y 5752 X +(unsigned)S 240 x(short)S 479 x(minor_version;)S 448 y 5752 X(char)S +7904 X(vendor;)S 448 y 5752 X(char)S 7904 X(model;)S 449 y 5752 X +(unsigned)S 240 x(char)S 718 x(video_digitizer;)S 448 y 5752 X(char)S +7904 X(pad;)S 448 y 5752 X(unsigned)S 240 x(long)S 718 x +(accelerators;)S 449 y 5752 X(unsigned)S 240 x(short)S 479 x +(number_of_screens;)S 448 y 5752 X(char)S 7904 X(pad1[6];)S 448 y +4796 X(})S 239 x(xieInitSessionRepl)S 2 x(y;)S 747 y 4796 X(/*)S +239 x(the)S 239 x(following)S 240 x(structure)S 240 x(is)S 240 x +(used)S 239 x(for)S 240 x(screen)S 239 x(data)S 240 x(for)S 239 x +(CONNECTION)S 240 x(reply)S 240 x(*/)S 449 y 4796 X(/*)S 239 x(one)S +239 x(set)S 240 x(per)S 239 x(screen)S 240 x(-)S 239 x(20)S 239 x +(chars)S 240 x(*/)S 747 y 4796 X(typedef)S 239 x(struct)S 240 x({)S +448 y 5752 X(unsigned)S 240 x(short)S 479 x(screen_width_millim)S +2 x(eters;)S 449 y 5752 X(unsigned)S 240 x(short)S 479 x +(screen_height_milli)S 2 x(meters;)S 448 y 5752 X(unsigned)S 240 x +(short)S 479 x(screen_width_pixels)S 2 x(;)S 448 y 5752 X(unsigned)S +240 x(short)S 479 x(screen_height_pixel)S 2 x(s;)S 449 y 5752 X +(unsigned)S 240 x(short)S 479 x(screen_depth;)S 448 y 5752 X +(unsigned)S 240 x(short)S 479 x(screen_luts_size;)S 448 y 5752 X +(unsigned)S 240 x(char)S 718 x(screen_number;)S 449 y 5752 X +(unsigned)S 240 x(char)S 718 x(screen_luts;)S 448 y 5752 X(unsigned)S +240 x(char)S 718 x(screen_brightness_c)S 2 x(ontrol;)S 448 y 5752 X +(unsigned)S 240 x(char)S 718 x(screen_contrast_con)S 2 x(trol;)S +448 y 5752 X(unsigned)S 240 x(char)S 718 x(screen_hue_control;)S +449 y 5752 X(char)S 718 x(pad;)S 448 y 5752 X(unsigned)S 240 x +(short)S 239 x(pad1[2];)S 480 x(/*)S 239 x(32)S 239 x(bit)S 240 x +(boundary)S 239 x(*/)S 448 y 4796 X(})S 239 x(screen_data;)S 748 y +4796 X(/*)S 239 x(Reply)S 239 x(for)S 240 x(Export)S 240 x(*/)S 747 y +4796 X(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X(char)S 239 x +(type;)S 9099 X(/*)S 240 x(XIE_Reply)S 240 x(*/)S 448 y 5752 X(char)S +239 x(pad;)S 449 y 5752 X(unsigned)S 240 x(short)S 239 x(sequenceNu)S +2 x(mber;)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x(length;)S +479 x(/*)S 240 x(0)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x(long)S +239 x(pixmap;)S 449 y 5752 X(unsigned)S 240 x(long)S 239 x(pad1[5];)S +448 y 4796 X(})S 239 x(xieExportReply;)S 747 y 4796 X(/*)S 239 x +(Reply)S 239 x(for)S 240 x(Luminance)S 240 x(Distribution)S 240 x +(*/)S 747 y 4796 X(typedef)S 239 x(struct)S 240 x({)S 449 y 5752 X +(char)S 239 x(type;)S 9099 X(/*)S 240 x(XIE_Reply)S 240 x(*/)S 448 y +5752 X(char)S 239 x(pad;)S 448 y 5752 X(unsigned)S 240 x(short)S +239 x(sequenceNu)S 2 x(mber;)S 449 y 5752 X(unsigned)S 240 x(long)S +239 x(length;)S 479 x(/*)S 240 x(length)S 239 x(in)S 240 x(chars)S +239 x(of)S 240 x(stat)S 239 x(data)S 240 x(*/)S 448 y 5752 X +(unsigned)S 240 x(long)S 239 x(pad1[6];)S 448 y 4796 X(})S 239 x +(xieLuminanceDistri)S 2 x(butionReply;)S 748 y 4796 X(/*)S 239 x +(the)S 239 x(folowing)S 240 x(structure)S 240 x(is)S 240 x(used)S +239 x(for)S 239 x(the)S 240 x(above)S 239 x(reply)S 240 x(*/)S 35879 Y +14113 X F40(XIE)S 165 x(Application)S 165 x(and)S 167 x(W)S -4 x +(ire)S 166 x(De\211nitions)S 166 x(and)S 166 x(Structure)S 2 x(s)S +448 x(C\20313)S +PP +EP +%%DOC$Page: C-14 57 +1000 BP 39600 30600 PM 0 0 XY +5038 Y 4796 X F102(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X +(unsigned)S 240 x(long)S 239 x(minimum;)S 448 y 5752 X(unsigned)S +240 x(long)S 239 x(maximum;)S 449 y 5752 X(unsigned)S 240 x(long)S +239 x(mean;)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x(std_dev;)S +448 y 5752 X(unsigned)S 240 x(long)S 239 x(variance;)S 449 y 4796 X +(})S 239 x(statistics_data;)S 747 y 4796 X(/*)S 239 x(Reply)S 239 x +(for)S 240 x(Point)S 239 x(Statistics)S 2 x(*/)S 747 y 4796 X +(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X(char)S 239 x(type;)S +9099 X(/*)S 240 x(XIE_Reply)S 240 x(*/)S 449 y 5752 X(char)S 239 x +(pad;)S 448 y 5752 X(unsigned)S 240 x(short)S 239 x(sequenceNu)S +2 x(mber;)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x(length;)S +479 x(/*)S 240 x(length)S 239 x(of)S 240 x(point)S 239 x(stat)S 240 x +(data)S 239 x(that)S 449 y 6708 X(follows)S 240 x(*/)S 448 y 5752 X +(unsigned)S 240 x(long)S 239 x(pad1[6];)S 448 y 4796 X(})S 239 x +(xiePointStatistics)S 2 x(Reply;)S 748 y 4796 X(/*)S 239 x(the)S +239 x(following)S 240 x(structure)S 240 x(is)S 240 x(used)S 239 x +(for)S 240 x(Point)S 239 x(Statistics)S 240 x(*/)S 747 y 4796 X +(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X(unsigned)S 240 x +(long)S 239 x(pixel;)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x +(minimum;)S 449 y 5752 X(unsigned)S 240 x(long)S 239 x(maximum;)S +448 y 5752 X(unsigned)S 240 x(long)S 239 x(mean;)S 448 y 5752 X +(unsigned)S 240 x(long)S 239 x(std_dev;)S 449 y 5752 X(unsigned)S +240 x(long)S 239 x(variance;)S 448 y 4796 X(})S 239 x +(point_statistics_d)S 2 x(ata;)S 747 y 4796 X(/*)S 239 x(Reply)S +239 x(for)S 240 x(Dot)S 239 x(Product)S 240 x(*/)S 747 y 4796 X +(typedef)S 239 x(struct)S 240 x({)S 449 y 5752 X(char)S 239 x(type;)S +9817 X(/*)S 239 x(XIE_Reply)S 240 x(*/)S 448 y 5752 X(char)S 239 x +(pad;)S 448 y 5752 X(unsigned)S 240 x(short)S 239 x(sequenceNu)S +2 x(mber;)S 449 y 5752 X(unsigned)S 240 x(long)S 239 x(length;)S +11969 X(/*)S 239 x(0)S 239 x(*/)S 448 y 5752 X(unsigned)S 240 x +(long)S 239 x(pad1[6];)S 448 y 4796 X(})S 239 x(xieDotProductReply)S +2 x(;)S 747 y 4796 X(/***)S 239 x(following)S 240 x(display)S 240 x +(stuff)S 240 x(may)S 239 x(be)S 239 x(deleted)S 240 x(or)S 239 x +(expanded)S 240 x(*/)S 748 y 4796 X(typedef)S 239 x(struct)S 240 x +({)S 448 y 5752 X(char)S 239 x(type;)S 9817 X(/*)S 239 x(XIE_Reply)S +240 x(*/)S 448 y 5752 X(char)S 239 x(pad;)S 449 y 5752 X(unsigned)S +240 x(short)S 239 x(sequenceNu)S 2 x(mber;)S 448 y 5752 X(unsigned)S +240 x(long)S 239 x(length;)S 448 y 5752 X(unsigned)S 240 x(char)S +239 x(idc_type;)S 449 y 5752 X(unsigned)S 240 x(char)S 478 x +(skip_or_sh)S 2 x(ow;)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x +(pixmap;)S 448 y 5752 X(unsigned)S 240 x(short)S 239 x(pad1;)S 449 y +4796 X(})S 239 x(xieSingleStaticRep)S 2 x(ly;)S 747 y 4796 X +(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X(char)S 239 x(type;)S +9817 X(/*)S 239 x(XIE_Reply)S 240 x(*/)S 448 y 5752 X(char)S 239 x +(pad;)S 449 y 5752 X(unsigned)S 240 x(short)S 239 x(sequenceNu)S +2 x(mber;)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x(length;)S +448 y 5752 X(unsigned)S 240 x(char)S 239 x(idc_type;)S 449 y 5752 X +(unsigned)S 240 x(char)S 239 x(map_x_tiles)S 2 x(;)S 448 y 5752 X +(unsigned)S 240 x(char)S 239 x(map_y_tiles)S 2 x(;)S 448 y 5752 X +(unsigned)S 240 x(long)S 239 x(current_fra)S 2 x(me;)S 449 y 5752 X +(unsigned)S 240 x(long)S 239 x(number_of_d)S 2 x(isplay_frames;)S +448 y 4796 X(})S 239 x(xieSpatialMapReply)S 2 x(;)S 35879 Y 3600 X +F40(C\20314)S 449 x(XIE)S 166 x(Appli)S -2 x(cation)S 167 x(and)S +166 x(W)S -4 x(ire)S 166 x(De\211nitions)S 166 x(and)S 166 x +(Structure)S 2 x(s)S +PP +EP +%%DOC$Page: C-15 58 +1000 BP 39600 30600 PM 0 0 XY +5038 Y 4796 X F102(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X +(unsigned)S 240 x(char)S 239 x(skip_or_sho)S 2 x(w;)S 448 y 5752 X +(unsigned)S 240 x(long)S 239 x(pixmap;)S 449 y 5752 X(unsigned)S +240 x(short)S 239 x(pad1;)S 448 y 5752 X(char)S 718 x(pad2;)S 448 y +4796 X(})S 239 x(display_frame;)S 748 y 4796 X(typedef)S 239 x +(struct)S 240 x({)S 448 y 5752 X(char)S 239 x(type;)S 9817 X(/*)S +239 x(XIE_Reply)S 240 x(*/)S 448 y 5752 X(char)S 239 x(pad;)S 449 y +5752 X(unsigned)S 240 x(short)S 239 x(sequenceNu)S 2 x(mber;)S 448 y +5752 X(unsigned)S 240 x(long)S 239 x(length;)S 448 y 5752 X +(unsigned)S 240 x(char)S 239 x(idc_type;)S 449 y 5752 X(unsigned)S +240 x(char)S 239 x(map_x_tiles)S 2 x(;)S 448 y 5752 X(unsigned)S +240 x(char)S 239 x(map_y_tiles)S 2 x(;)S 448 y 5752 X(unsigned)S +240 x(long)S 239 x(current_fra)S 2 x(me;)S 448 y 5752 X(unsigned)S +240 x(long)S 239 x(number_of_d)S 2 x(isplay_frames;)S 449 y 4796 X +(})S 239 x(xieTimeSequenceRep)S 2 x(ly;)S 747 y 4796 X(/*)S 448 y +-478 x(**)S 478 x(This)S 239 x("endif")S 240 x(MUST)S 240 x(be)S +239 x(the)S 240 x(last)S 239 x(line)S 240 x(of)S 239 x(this)S 239 x +(file.)S 449 y 4796 X(*/)S 448 y -478 x(#endif)S 239 x(/*)S 240 x +(end)S 239 x(of)S 239 x(XIEPROTO)S 240 x(--)S 240 x(NO)S 239 x +(DEFINITIONS)S 240 x(ALLOWED)S 240 x(BEYOND)S 240 x(THIS)S 239 x +(POINT)S 240 x(*/)S 35879 Y 14113 X F40(XIE)S 165 x(Application)S +165 x(and)S 167 x(W)S -4 x(ire)S 166 x(De\211nitions)S 166 x(and)S +166 x(Structure)S 2 x(s)S 448 x(C\20315)S +PP +EP +%%DOC$Page: C-16 59 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 4796 X F151(The)S 167 x(following)S 168 x(represents)S 167 x +(a)S 167 x(draft)S 167 x(of)S 167 x(some)S 167 x(of)S 167 x(the)S +168 x(XIE)S 166 x(application)S 167 x(de\211nitions)S 168 x(and)S +167 x(structures)S 167 x(that)S 598 y 4796 X(will)S 165 x(reside)S +166 x(in)S 166 x(XieAppl.h.)S 896 y 4796 X(Note:)S 294 x(this)S 188 x +(\211le)S 189 x(represents)S 189 x(a)S 188 x(draft)S 189 x(and)S +189 x(may)S 188 x(contain)S 190 x(inconsistencies)S 188 x(with)S +188 x(the)S 189 x(text)S 189 x(and)S 189 x(the)S 598 y 4796 X +(referenced)S 166 x(documents.)S 9000 Y 5752 X F102(/*)S 449 y -478 x +(**)S 239 x(Symbol)S 240 x(XIEAPPL)S 240 x(allows)S 240 x(XieAppl.h)S +240 x(to)S 239 x(be)S 239 x(included)S 240 x(multiple)S 240 x +(times.)S 448 y 5752 X(*/)S 448 y 4796 X(#ifndef)S 239 x(XIEAPPL)S +449 y 4796 X(#define)S 239 x(XIEAPPL)S 9578 X(/*)S 239 x(The)S 239 x +("endif")S 240 x(MUST)S 240 x(be)S 239 x(the)S 239 x(last)S 240 x +(line)S 239 x(of)S 240 x(this)S 239 x(file.)S 11840 Y 5752 X(/*)S +448 y -478 x(**)S 239 x(X)S 239 x(Image)S 240 x(Extension)S 240 x +(name)S 240 x(string)S 448 y 5752 X(*/)S 449 y 4796 X(#define)S 239 x +(XieS_Name)S 10056 X("xImageExtension")S 747 y 5752 X(/*)S 448 y +-478 x(**)S 239 x(Implementatio)S 2 x(n)S 239 x(bounds)S 449 y 5752 X +(*/)S 448 y 4796 X(#define)S 239 x(XieK_MaxComp)S 2 x(onents)S 239 x +(3)S 718 x(/*)S 239 x(number)S 240 x(of)S 239 x(spectral)S 240 x +(components)S 240 x(supported*/)S 747 y 5752 X(/*)S 448 y -478 x(**)S +239 x(Spectral)S 240 x(Component)S 240 x(Mappings)S 449 y 5752 X(*/)S +448 y 4796 X(#define)S 239 x(XieK_Bitonal)S 480 x(1)S 448 y 4796 X +(#define)S 239 x(XieK_GraySca)S 2 x(le)S 478 x(2)S 449 y 4796 X +(#define)S 239 x(XieK_RGB)S 479 x(3)S 747 y 5752 X(/*)S 448 y -478 x +(**)S 239 x(Component)S 240 x(Space)S 240 x(Organizations)S 449 y +5752 X(*/)S 448 y 4796 X(#define)S 239 x(XieK_BandByP)S 2 x(ixel)S +12447 X(0)S 448 y 4796 X(#define)S 239 x(XieK_BandByL)S 2 x(ine)S +478 x(1)S 449 y 4796 X(#define)S 239 x(XieK_BandByP)S 2 x(lane)S +12447 X(2)S 448 y 4796 X(#define)S 239 x(XieK_BitByPl)S 2 x(ane)S +12447 X(3)S 747 y 5752 X(/*)S 448 y -478 x(**)S 239 x(IDC)S 240 x +(Types)S 449 y 5752 X(*/)S 448 y 4796 X(#define)S 239 x +(XieK_SingleS)S 2 x(tatic)S 239 x(0)S 448 y 4796 X(#define)S 239 x +(XieK_Spatial)S 2 x(Map)S 478 x(1)S 449 y 4796 X(#define)S 239 x +(XieK_TimeSeq)S 2 x(uence)S 239 x(2)S 747 y 5752 X(/*)S 448 y -478 x +(**)S 239 x(IPC)S 240 x(Types)S 448 y 5752 X(*/)S 449 y 4796 X +(#define)S 239 x(XieK_CPP)S 479 x(0)S 448 y 4796 X(#define)S 239 x +(XieK_ROI)S 479 x(1)S 448 y 4796 X(#define)S 239 x(XieK_TMP)S 479 x +(2)S 748 y 5752 X(/*)S 448 y -478 x(**)S 239 x(Compression)S 240 x +(Schemes)S 448 y 5752 X(*/)S 449 y 4796 X(#define)S 239 x(XieK_PCM)S +12447 X(0)S 448 y 4796 X(#define)S 239 x(XieK_G42D)S 12447 X(3)S +448 y 4796 X(#define)S 239 x(XieK_DCT)S 12447 X(5)S 747 y 5752 X(/*)S +449 y -478 x(**)S 239 x(Line)S 240 x(Progressions)S 448 y 5752 X(*/)S +448 y 4796 X(#define)S 239 x(XieK_LP90)S 479 x(0)S 449 y 4796 X +(#define)S 239 x(XieK_LP270)S 480 x(1)S 35879 Y 3600 X F40(C\20316)S +449 x(XIE)S 166 x(Appli)S -2 x(cation)S 167 x(and)S 166 x(W)S -4 x +(ire)S 166 x(De\211nitions)S 166 x(and)S 166 x(Structure)S 2 x(s)S +PP +EP +%%DOC$Page: C-17 60 +1000 BP 39600 30600 PM 0 0 XY +5065 Y 5752 X F102(/*)S 448 y -478 x(**)S 239 x(Pixel)S 240 x +(Progressions)S 448 y 5752 X(*/)S 448 y 4796 X(#define)S 239 x +(XieK_PP0)S 479 x(0)S 449 y 4796 X(#define)S 239 x(XieK_PP90)S 479 x +(1)S 448 y 4796 X(#define)S 239 x(XieK_PP180)S 480 x(2)S 448 y 4796 X +(#define)S 239 x(XieK_PP270)S 480 x(3)S 748 y 5752 X(/*)S 448 y -478 x +(**)S 239 x(Polarities)S 448 y 5752 X(*/)S 449 y 4796 X(#define)S +239 x(XieK_ZeroBri)S 2 x(ght)S 478 x(0)S 448 y 4796 X(#define)S 239 x +(XieK_ZeroDar)S 2 x(k)S 478 x(1)S 747 y 5752 X(/*)S 448 y -478 x(**)S +239 x(Statistics)S 240 x(Types)S 449 y 5752 X(*/)S 448 y 4796 X +(#define)S 239 x(XieK_Minimum)S 480 x(0)S 448 y 4796 X(#define)S +239 x(XieK_Maximum)S 480 x(1)S 449 y 4796 X(#define)S 239 x +(XieK_Mean)S 479 x(2)S 448 y 4796 X(#define)S 239 x(XieK_StdDev)S +480 x(3)S 448 y 4796 X(#define)S 239 x(XieK_Varianc)S 2 x(e)S 478 x +(4)S 748 y 5752 X(/*)S 448 y -478 x(**)S 239 x(Gray)S 240 x(to)S +239 x(Bitonal)S 240 x(bit)S 239 x(reduction)S 240 x(methods)S 448 y +5752 X(*/)S 448 y 4796 X(#define)S 239 x(XieK_Dither)S 480 x(0)S +449 y 4796 X(#define)S 239 x(XieK_Thresho)S 2 x(ld)S 478 x(1)S 747 y +5752 X(/*)S 448 y -478 x(**)S 239 x(Support)S 240 x(Vector)S 449 y +5752 X(*/)S 448 y 4796 X(#define)S 239 x(XieK_Transpo)S 2 x(rt)S +478 x(1)S 448 y 4796 X(#define)S 239 x(XieK_Enhance)S 2 x(ment)S +239 x(2)S 449 y 4796 X(#define)S 239 x(XieK_Pipelin)S 2 x(es)S 478 x +(4)S 448 y 4796 X(#define)S 239 x(XieK_ImageCa)S 2 x(pture)S 239 x +(8)S 747 y 5752 X(/*)S 448 y -478 x(**)S 239 x(XieK_)S 240 x(Events)S +449 y 5752 X(*/)S 448 y 4796 X(#define)S 239 x(XieK_Computa)S 2 x +(tionEvent)S 240 x(1)S 448 y 4796 X(#define)S 239 x(XieK_NewFram)S +2 x(eEvent)S 239 x(2)S 449 y 4796 X(#define)S 239 x(XieK_Sequenc)S +2 x(eEvent)S 239 x(3)S 448 y 4796 X(#define)S 239 x(XieK_EdgeDet)S +2 x(ectEvent)S 240 x(4)S 747 y 5752 X(/*)S 449 y -478 x(**)S 239 x +(Edge)S 240 x(Contact)S 240 x(on)S 239 x(Edge_detect)S 240 x(Event)S +448 y 5752 X(*/)S 448 y 4796 X(#define)S 239 x(XieK_North)S 480 x(0)S +448 y 4796 X(#define)S 239 x(XieK_East)S 479 x(1)S 449 y 4796 X +(#define)S 239 x(XieK_South)S 480 x(2)S 448 y 4796 X(#define)S 239 x +(XieK_West)S 479 x(3)S 747 y 5752 X(/*)S 449 y -478 x(**)S 239 x +(Conditional)S 240 x(Operator)S 240 x(Types)S 448 y 5752 X(*/)S 448 y +4796 X(#define)S 239 x(XieK_LT)S 718 x(0)S 449 y 4796 X(#define)S +239 x(XieK_LE)S 718 x(1)S 448 y 4796 X(#define)S 239 x(XieK_EQ)S +718 x(2)S 448 y 4796 X(#define)S 239 x(XieK_GT)S 718 x(3)S 449 y +4796 X(#define)S 239 x(XieK_GE)S 718 x(4)S 747 y 4796 X(/*)S 448 y +-478 x(**)S 478 x(This)S 239 x("endif")S 240 x(MUST)S 240 x(be)S +239 x(the)S 240 x(last)S 239 x(line)S 240 x(of)S 239 x(this)S 239 x +(file.)S 448 y 4796 X(*/)S 449 y -478 x(#endif)S 239 x(/*)S 240 x +(end)S 239 x(of)S 239 x(XIEAPPL)S 240 x(--)S 239 x(NO)S 240 x +(DEFINITIONS)S 240 x(ALLOWED)S 240 x(BEYOND)S 240 x(THIS)S 239 x +(POINT)S 240 x(*/)S 35879 Y 14113 X F40(XIE)S 165 x(Application)S +165 x(and)S 167 x(W)S -4 x(ire)S 166 x(De\211nitions)S 166 x(and)S +166 x(Structure)S 2 x(s)S 448 x(C\20317)S +PP +EP +%%DOC$Page: D-1 61 +1000 BP 39600 30600 PM 0 0 XY +8985 Y 3600 X F24(Appendix)S 497 x(D)S 10629 Y 3600 X(Server)S 166 x +(De)S +(\211nitions)S 165 x(and)S 166 x(Structur)S 2 x(es)S 13335 Y 4796 X +F151(The)S 179 x(following)S 179 x(represents)S 178 x(a)S 179 x +(draft)S 178 x(of)S 179 x(some)S 178 x(de\211nitions)S 179 x(and)S +179 x(structures)S 179 x(that)S 179 x(pertain)S 179 x(to)S 178 x +(the)S 179 x(XIE)S 598 y 4796 X(server)S -37 x(.)S 250 x(These)S +166 x(will)S 166 x(reside)S 165 x(in)S 167 x(XieServer)S -37 x(.h.)S +897 y 4796 X(Note:)S 294 x(this)S 188 x(\211le)S 189 x(represents)S +189 x(a)S 188 x(draft)S 189 x(and)S 189 x(may)S 188 x(contain)S 190 x +(inconsistencies)S 188 x(with)S 188 x(the)S 189 x(text)S 189 x(and)S +189 x(the)S 597 y 4796 X(referenced)S 166 x(documents.)S 17470 Y +4796 X F102(#define)S 239 x(XieK_MaxNumb)S 2 x(erOfClients)S 240 x +(100)S 747 y 4796 X(/*)S 239 x(Image)S 239 x(Data)S 240 x(Types)S +240 x(*/)S 747 y 4796 X(#define)S 239 x(XieK_Bitstre)S 2 x(am)S 478 x +(0)S 449 y 4796 X(#define)S 239 x(XieK_ByteIma)S 2 x(ge)S 478 x(1)S +448 y 4796 X(#define)S 239 x(XieK_WordIma)S 2 x(ge)S 478 x(2)S 448 y +4796 X(#define)S 239 x(XieK_LongIma)S 2 x(ge)S 478 x(3)S 449 y 4796 X +(#define)S 239 x(XieK_FloatIm)S 2 x(age)S 478 x(4)S 448 y 4796 X +(#define)S 239 x(XieK_NoForma)S 2 x(t)S 478 x(5)S 747 y 4796 X(/*)S +239 x(XIE)S 239 x(Event)S 240 x(Mask)S 239 x(*/)S 747 y 4796 X +(#define)S 239 x(XieK_Computa)S 2 x(tionComplete)S 13403 X(1<<0)S +449 y 4796 X(#define)S 239 x(XieK_NewFram)S 2 x(e)S 11251 X(1<<1)S +448 y 4796 X(#define)S 239 x(XieK_Sequenc)S 2 x(eComplete)S 12925 X +(1<<2)S 448 y 4796 X(#define)S 239 x(XieK_EdgeDet)S 2 x(ect)S 11730 X +(1<<3)S 25091 Y 4796 X(/*)S 449 y -478 x(**)S 239 x(When)S 239 x(a)S +240 x(connection)S 240 x(between)S 240 x(the)S 239 x(client)S 240 x +(and)S 239 x(XIE)S 239 x(is)S 240 x(established,)S 240 x(the)S 240 x +(following)S 448 y 4796 X(**)S 239 x(structure)S 240 x(will)S 239 x +(have)S 240 x(its)S 239 x(fields)S 240 x(defined:)S 240 x(\(TBDL\))S +448 y 4796 X(*/)S 747 y -478 x(static)S 239 x(struct)S 240 x +(client_struct)S 449 y 5752 X({)S 448 y -239 x(unsigned)S 240 x +(short)S 239 x(event_mask)S 2 x(;)S 448 y 5752 X(unsigned)S 240 x +(long)S 239 x(client_id;)S 449 y 5752 X(unsigned)S 240 x(long)S 239 x +(*quantize_p)S 2 x(tr;)S 448 y 5752 X(})S 239 x(client_table[X)S +2 x(ieK_MaxNumberOfClie)S 2 x(nts];)S 747 y 4796 X(/*The)S 239 x +(following)S 240 x(represents)S 240 x(XIE)S 240 x(resource)S 240 x +(structures.)S 240 x(*/)S 747 y 4796 X(typedef)S 239 x(struct)S 240 x +(components)S 449 y 5752 X({)S 448 y -239 x(unsigned)S 240 x(long)S +239 x(scanline_st)S 2 x(ride;)S 448 y 5752 X(unsigned)S 240 x(char)S +239 x(scanlines_a)S 2 x(but;)S 449 y 5752 X(unsigned)S 240 x(char)S +239 x(pixel_strid)S 2 x(e;)S 448 y 5752 X(unsigned)S 240 x(char)S +239 x(pad[2];)S 448 y 4796 X(})S 239 x(XieCompData;)S 35879 Y 18393 X +F40(Server)S 167 x(De\211nitions)S 166 x(and)S 166 x(Structur)S 2 x +(es)S 448 x(D\2031)S +PP +EP +%%DOC$Page: D-2 62 +1000 BP 39600 30600 PM 0 0 XY +5038 Y 4796 X F102(typedef)S 239 x(struct)S 240 x(transport)S 240 x +({)S 448 y 5035 X(unsigned)S 240 x(char)S 478 x(compression_s)S 2 x +(cheme;)S 448 y 5035 X(unsigned)S 240 x(char)S 478 x(tile_format;)S +449 y 5035 X(unsigned)S 240 x(char)S 478 x(component_org)S 2 x +(anization;)S 448 y 6708 X(unsigned)S 240 x(char)S 479 x +(component_mappin)S 2 x(g;)S 448 y 5035 X(XieCompData)S 240 x +(comp_data[XieK_M)S 2 x(axComponents];)S 449 y 4796 X(})S 239 x +(XieTransportRec;)S 747 y 4796 X(typedef)S 239 x(struct)S 240 x +(transport)S 240 x(*XieTransportP)S 2 x(tr;)S 747 y 4796 X(typedef)S +239 x(struct)S 240 x(IobResource)S 240 x({)S 448 y 5752 X(unsigned)S +240 x(long)S 239 x(pixels_per_)S 2 x(scanline;)S 449 y 5752 X +(unsigned)S 240 x(long)S 239 x(number_of_s)S 2 x(canlines;)S 448 y +5752 X(unsigned)S 240 x(char)S 478 x(number_of_)S 2 x(components;)S +448 y 5752 X(unsigned)S 240 x(char)S 478 x(pixel_prog)S 2 x +(ression;)S 449 y 5752 X(unsigned)S 240 x(char)S 478 x(line_progr)S +2 x(ession;)S 448 y 5752 X(XieFloat)S 240 x(aspect_ratio;)S 448 y +5752 X(unsigned)S 240 x(char)S 478 x(polarity;)S 449 y 5752 X +(unsigned)S 240 x(char)S 239 x(constrained)S 2 x(;)S 448 y 5752 X +(XieTransportPtr)S 241 x(transport_ptr;)S 448 y 5752 X(unsigned)S +240 x(long)S 239 x(*data_point)S 2 x(er[XieK_MaxComponent)S 2 x(s];)S +449 y 5752 X(unsigned)S 240 x(long)S 239 x(data_offset)S 2 x +([XieK_MaxComponents])S 2 x(;)S 448 y 5752 X(unsigned)S 240 x(long)S +239 x(data_type[X)S 2 x(ieK_MaxComponents];)S 448 y 5752 X(unsigned)S +240 x(char)S 239 x(bits_per_co)S 2 x(mp[XieK_MaxComponent)S 2 x(s];)S +449 y 4796 X(})S 239 x(IobResourceRec;)S 747 y 4796 X(typedef)S 239 x +(struct)S 240 x(IobResource)S 240 x(*IobPtr;)S 747 y 4796 X(typedef)S +239 x(struct)S 240 x(IdcRoiResource)S 241 x({)S 448 y 5752 X +(unsigned)S 240 x(short)S 479 x(ul_x;)S 449 y 5752 X(unsigned)S 240 x +(short)S 479 x(ul_y;)S 448 y 5752 X(unsigned)S 240 x(short)S 479 x +(lr_x;)S 448 y 5752 X(unsigned)S 240 x(short)S 479 x(lr_y;)S 449 y +4796 X(})S 239 x(IdcRoiResourceRec;)S 747 y 4796 X(typedef)S 239 x +(struct)S 240 x(IdcRoiResource)S 241 x(*Roi_ptr;)S 747 y 4796 X +(typedef)S 239 x(struct)S 240 x(IdcCppResource)S 241 x({)S 448 y +5752 X(unsigned)S 240 x(short)S 479 x(ul_x;)S 449 y 5752 X(unsigned)S +240 x(short)S 479 x(ul_y;)S 448 y 5752 X(unsigned)S 240 x(long)S +239 x(pixmap;)S 448 y 4796 X(})S 239 x(IdcCppResourceRec;)S 747 y +4796 X(typedef)S 239 x(struct)S 240 x(IdcCppResource)S 241 x +(*Cpp_ptr;)S 748 y 4796 X(typedef)S 239 x(struct)S 240 x({)S 448 y +5752 X(char)S 479 x(center_x;)S 448 y 5752 X(char)S 479 x(center_y;)S +449 y 5752 X(char)S 479 x(num_tmp_entries;)S 448 y 4796 X(})S 239 x +(IdcTmpResource;)S 747 y 4796 X(/*)S 448 y -478 x(**)S 239 x(The)S +239 x(following)S 240 x(structures)S 240 x(represent)S 240 x(those)S +240 x(used)S 240 x(for)S 239 x(XIE)S 239 x(events)S 449 y 4796 X(*/)S +747 y -478 x(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X(char)S +239 x(type;)S 9817 X(/*)S 239 x(event)S 240 x(code)S 239 x(*/)S 449 y +5752 X(char)S 239 x(pad;)S 448 y 5752 X(unsigned)S 240 x(short)S +239 x(sequenceNu)S 2 x(mber;)S 478 x(/*)S 240 x(client)S 239 x +(sequence)S 240 x(*/)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x +(iob_id;)S 449 y 5752 X(char)S 718 x(direction;)S 11251 X(/*)S 240 x +(CLIENT_TO_SERVER)S 240 x(or)S 240 x(SERVER_TO_CLIENT)S 240 x(*/)S +448 y 5752 X(char)S 7665 X(pad0[3];)S 11012 X(/*)S 240 x(pads)S 239 x +(for)S 239 x(32)S 240 x(char)S 239 x(long)S 240 x(event)S 239 x(*/)S +448 y 5752 X(unsigned)S 240 x(long)S 239 x(pad1[5];)S 448 y 4796 X +(})S 239 x(xie_transport_comp)S 2 x(lete;)S 35879 Y 3600 X F40 +(D\2032)S 449 x(Server)S 167 x(De\211nitions)S 166 x(and)S 166 x +(Structure)S 2 x(s)S +PP +EP +%%DOC$Page: D-3 63 +1000 BP 39600 30600 PM 0 0 XY +5038 Y 4796 X F102(typedef)S 239 x(struct)S 240 x({)S 448 y 5752 X +(char)S 239 x(type;)S 9817 X(/*)S 239 x(event)S 240 x(code)S 239 x +(*/)S 448 y 5752 X(char)S 239 x(pad;)S 449 y 5752 X(unsigned)S 240 x +(short)S 239 x(sequenceNu)S 2 x(mber;)S 478 x(/*)S 240 x(client)S +239 x(sequence)S 240 x(*/)S 448 y 5752 X(unsigned)S 240 x(long)S +239 x(src_iob_id;)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x +(dst_iob_id;)S 449 y 5752 X(unsigned)S 240 x(long)S 239 x(pad1[5];)S +12208 X(/*)S 239 x(pad)S 239 x(for)S 240 x(32)S 239 x(char)S 240 x +(long)S 239 x(event)S 240 x(*/)S 448 y 4796 X(})S 239 x +(xie_computation_co)S 2 x(mplete;)S 747 y 4796 X(typedef)S 239 x +(struct)S 240 x({)S 449 y 5752 X(char)S 239 x(type;)S 9817 X(/*)S +239 x(event)S 240 x(code)S 239 x(*/)S 448 y 5752 X(char)S 239 x +(pad;)S 448 y 5752 X(unsigned)S 240 x(short)S 239 x(sequenceNu)S +2 x(mber;)S 478 x(/*)S 240 x(client)S 239 x(sequence)S 240 x(*/)S +449 y 5752 X(unsigned)S 240 x(long)S 239 x(idc_id;)S 448 y 5752 X +(unsigned)S 240 x(long)S 239 x(frame_numbe)S 2 x(r;)S 13403 X(/*)S +240 x(frame)S 239 x(that)S 240 x(is)S 239 x(currently)S 240 x +(displayed)S 240 x(*/)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x +(pad1[5];)S 12208 X(/*)S 239 x(pad)S 239 x(for)S 240 x(32)S 239 x +(char)S 240 x(long)S 239 x(event)S 240 x(*/)S 448 y 4796 X(})S 239 x +(xie_new_frame;)S 748 y 4796 X(typedef)S 239 x(struct)S 240 x({)S +448 y 5752 X(char)S 239 x(type;)S 9817 X(/*)S 239 x(event)S 240 x +(code)S 239 x(*/)S 448 y 5752 X(char)S 239 x(pad;)S 449 y 5752 X +(unsigned)S 240 x(short)S 479 x(sequenceNumber;)S 240 x(/*)S 240 x +(client)S 239 x(sequence)S 240 x(*/)S 448 y 5752 X(unsigned)S 240 x +(long)S 239 x(idc_id;)S 448 y 5752 X(unsigned)S 240 x(long)S 239 x +(pad1[6];)S 12208 X(/*)S 239 x(pad)S 239 x(for)S 240 x(32)S 239 x +(char)S 240 x(long)S 239 x(event)S 240 x(*/)S 449 y 4796 X(})S 239 x +(xie_sequence_compl)S 2 x(ete;)S 747 y 4796 X(typedef)S 239 x +(struct)S 240 x({)S 448 y 5752 X(char)S 239 x(type;)S 9817 X(/*)S +239 x(event)S 240 x(code)S 239 x(*/)S 448 y 5752 X(char)S 239 x +(pad;)S 449 y 5752 X(unsigned)S 240 x(short)S 239 x(sequenceNu)S +2 x(mber;)S 478 x(/*)S 240 x(client)S 239 x(sequence)S 240 x(*/)S +448 y 5752 X(unsigned)S 240 x(int)S 478 x(pixmap;)S 448 y 5752 X +(unsigned)S 240 x(long)S 478 x(window;)S 449 y 5752 X(unsigned)S +240 x(long)S 478 x(pixmap_x;)S 12686 X(/*)S 239 x(upper)S 240 x +(left)S 239 x(x)S 240 x(pixmap)S 239 x(location)S 240 x(*/)S 448 y +5752 X(unsigned)S 240 x(long)S 478 x(pixmap_y;)S 12686 X(/*)S 239 x +(upper)S 240 x(left)S 239 x(y)S 240 x(pixmap)S 239 x(location)S 240 x +(*/)S 448 y 5752 X(char)S 718 x(edge;)S 10056 X(/*)S 239 x(NORTH,)S +240 x(EAST,)S 239 x(SOUTH,)S 240 x(WEST)S 240 x(*/)S 449 y 5752 X +(char)S 7665 X(pad0[3];)S 11012 X(/*)S 240 x(pads)S 239 x(for)S 239 x +(32)S 240 x(byte)S 239 x(long)S 240 x(event)S 239 x(*/)S 448 y 5752 X +(unsigned)S 240 x(long)S 478 x(pad1[2];)S 448 y 4796 X(})S 239 x +(xie_edge_detect;)S 35879 Y 18393 X F40(Server)S 167 x +(De\211nitions)S 166 x(and)S 166 x(Structur)S 2 x(es)S 448 x(D\2033)S +PP +EP +%%DOC$Page: E-1 64 +1000 BP 39600 30600 PM 0 0 XY +8985 Y 3600 X F24(Appendix)S 497 x(E)S 10629 Y 3600 X(CORE)S 165 x +(X)S 166 x(Structures)S 13335 Y 4796 X F151(The)S 166 x(following)S +166 x(CORE)S 165 x(X)S 166 x(structure)S 166 x(is)S 166 x(de\211ned)S +166 x(in)S 167 x(EXTNSIO)S -2 x(NST)S -45 x(.H:)S 14481 Y 4796 X F102 +(typedef)S 239 x(struct)S 240 x(_ExtensionEntr)S 2 x(y)S 239 x({)S +448 y 5752 X(int)S 239 x(index;)S 449 y 5752 X(void)S 239 x(\(*)S +240 x(CloseDown\)\(\);)S 12447 X(/*)S 239 x(called)S 240 x(at)S 239 x +(server)S 240 x(shutdown)S 240 x(*/)S 448 y 5752 X(char)S 239 x +(*name;)S 11969 X(/*)S 239 x(extension)S 240 x(name)S 239 x(*/)S +448 y 5752 X(int)S 239 x(base;)S 11251 X(Definitions)S 241 x(and)S +15794 X(/*)S 240 x(base)S 239 x(request)S 240 x(number)S 240 x(*/)S +449 y 5752 X(int)S 239 x(eventBase;)S 448 y 5752 X(int)S 239 x +(errorBase;)S 448 y 5752 X(int)S 239 x(errorLast;)S 449 y 5752 X +(pointer)S 240 x(extPrivate;)S 448 y 4796 X(})S 239 x +(ExtensionEntry;)S 897 y 4796 X F151(The)S 191 x(following)S 191 x +(CORE)S 189 x(X)S 190 x(structure)S 192 x(is)S 190 x(de\211ned)S +191 x(in)S 191 x(DIXSTRUC)S -2 x(T)S -45 x(.H)S 191 x(and)S 191 x +(represents)S 191 x(the)S 190 x(client)S 597 y 4796 X(structure)S +166 x(that)S 166 x(is)S 165 x(used)S 166 x(throug)S 2 x(hout)S 166 x +(XIE:)S 21156 Y 4796 X F102(typedef)S 239 x(struct)S 240 x(_Client)S +240 x({)S 448 y 5752 X(int)S 239 x(index;)S 449 y 5752 X(Mask)S 239 x +(clientAsMas)S 2 x(k;)S 448 y 5752 X(pointer)S 240 x(requestBuffer;)S +448 y 5752 X(pointer)S 240 x(osPrivate;)S 14360 X(/*)S 239 x(for)S +239 x(OS)S 240 x(layer,)S 239 x(including)S 240 x(scheduler)S 240 x +(*/)S 449 y 5752 X(Bool)S 239 x(swapped;)S 448 y 5752 X(void)S 239 x +(\(*)S 240 x(pSwapReplyFunc\)\(\))S 2 x(;)S 448 y 5752 X(int)S 239 x +(errorValue;)S 449 y 5752 X(int)S 239 x(sequence;)S 448 y 5752 X +(int)S 239 x(closeDownMod)S 2 x(e;)S 448 y 5752 X(int)S 239 x +(clientGone;)S 449 y 5752 X(int)S 239 x(noClientExce)S 2 x(ption;)S +12686 X(/*)S 239 x(this)S 240 x(client)S 239 x(died)S 240 x(or)S +239 x(needs)S 240 x(to)S 239 x(be)S 240 x(killed*/)S 448 y 5752 X +(DrawablePtr)S 240 x(lastDrawable;)S 448 y 5752 X(int)S 239 x +(lastDrawable)S 2 x(ID;)S 448 y 5752 X(GCPtr)S 240 x(lastGC;)S 449 y +5752 X(int)S 239 x(lastGCID;)S 448 y 5752 X(pointer)S 240 x +(*saveSet;)S 448 y 5752 X(int)S 239 x(numSaved;)S 449 y 5752 X +(pointer)S 240 x(screenPrivate[MAX)S 2 x(SCREENS];)S 448 y 4796 X +(#ifndef)S 239 x(ultrix)S 448 y 5752 X(REQSB)S 240 x(Reqsb;)S 12447 X +(/*)S 239 x(holds)S 240 x(request)S 240 x(buffer)S 239 x(process)S +240 x(info)S 240 x(*/)S 449 y 5752 X(pointer)S 240 x +(*pXportWriteBuffe)S 2 x(r;)S 448 y 4796 X(#endif)S 239 x(ultrix)S +448 y 4796 X(})S 239 x(ClientRec;)S 35879 Y 21498 X F40(CORE)S 166 x +(X)S 166 x(Structures)S 450 x(E\2031)S +PP +EP +%%DOC$Page: F-1 65 +1000 BP 39600 30600 PM 0 0 XY +8985 Y 3600 X F24(Appendix)S 497 x(F)S 10629 Y 3600 X(MACR)S -2 x +(OS)S 14979 Y 3600 X F28(F)S -66 x(.1)S 598 x(CORE)S 165 x(X)S 166 x +(Macros)S 16225 Y 4796 X F151(These)S 172 x(macros)S 171 x(will)S +171 x(be)S 172 x(copied)S 172 x(from)S 171 x(the)S 172 x(CORE)S 171 x +(X)S 171 x(source)S 172 x(\211les)S 172 x(\(PROCMUMBLE.C)S 171 x +(and)S 172 x(DIX.H\))S 171 x(to)S 597 y 4796 X(XieServer)S -37 x +(.H.)S 167 x(This)S 166 x(redundanc)S 2 x(y)S 166 x(will)S 165 x +(allow)S 166 x(for)S 166 x(cleaner)S 167 x(looking)S 167 x(code.)S +18018 Y 5692 X(o)S 166 x(REQUEST)S 598 y 5692 X(o)S 166 x +(REQUEST_SI)S -2 x(ZE_MA)S -27 x(TCH)S 597 y 5692 X(o)S 166 x +(REQUEST_A)S -29 x(T_LEAST_SIZE)S 598 y 5692 X(o)S 166 x(LOOKUP_DRA)S +-48 x(W)S -46 x(ABLE)S 21305 Y 4796 X(Note:)S 328 x(There)S 206 x +(exists)S 205 x(other)S 206 x(useful)S 206 x(macros)S 205 x(within)S +205 x(the)S 206 x(CORE)S 204 x(X)S 205 x(modules)S 205 x(SW)S -46 x +(APREQ)S -2 x(.C,)S 598 y 4796 X(DIX)S -2 x(UTILS.C)S 167 x(and)S +166 x(MISC.H)S 166 x(to)S 166 x(name)S 166 x(a)S 166 x(few)S -46 x +(.)S 23049 Y 4796 X F102(#ifndef)S 239 x(ultrix)S 448 y 4796 X +(#define)S 239 x(REQUEST\(type)S 2 x(\))S 239 x(\\)S 449 y 6708 X +(register)S 240 x(type)S 240 x(*stuff)S 240 x(=)S 239 x(\(type)S +239 x(*\)client->Re)S 2 x(qsb.pCurrentReq)S 448 y 4796 X(#else)S +239 x(ultrix)S 448 y 4796 X(#define)S 239 x(REQUEST\(type)S 2 x(\))S +239 x(\\)S 449 y 6708 X(register)S 240 x(type)S 240 x(*stuff)S 240 x +(=)S 239 x(\(type)S 239 x(*\)client->re)S 2 x(questBuffer)S 448 y +4796 X(#endif)S 239 x(ultrix)S 747 y 4796 X(#define)S 239 x +(REQUEST_SIZE)S 2 x(_MATCH\(req\)\\)S 448 y 5752 X(if)S 239 x +(\(\(sizeof\(req\))S 241 x(>>)S 239 x(2\))S 239 x(!=)S 240 x +(stuff->length\)\\)S 449 y 6947 X(return\(BadL)S 2 x(ength\))S 747 y +4796 X(#define)S 239 x(REQUEST_AT_L)S 2 x(EAST_SIZE\(req\))S 240 x +(\\)S 448 y 5752 X(if)S 239 x(\(\(sizeof\(req\))S 241 x(>>)S 239 x +(2\))S 239 x(>)S 240 x(stuff->length)S 240 x(\)\\)S 448 y 6947 X +(return\(BadL)S 2 x(ength\))S 748 y 4796 X(#define)S 239 x +(LOOKUP_DRAWA)S 2 x(BLE\(did,)S 240 x(client\)\\)S 448 y 5752 X +(\(\(client->lastDr)S 2 x(awableID)S 240 x(==)S 239 x(did\))S 239 x +(?)S 240 x(\\)S 448 y 5991 X(\(DrawablePtr\)cl)S 2 x +(ient->lastDrawable)S 241 x(:)S 449 y 6947 X(\(DrawablePt)S 2 x +(r\)LookupDrawable\(di)S 2 x(d,)S 239 x(client\)\))S 35879 Y 23699 X +F40(MACROS)S 448 x(F\2031)S +PP +EP +%%DOC$Page: F-2 66 +1000 BP 39600 30600 PM 0 0 XY +5593 Y 3600 X F28(F)S -66 x(.2)S 598 x(XIE)S 166 x(MACR)S -2 x(OS)S +6838 Y 4796 X F151(The)S 166 x(following)S 166 x(macros)S 166 x(are)S +166 x(XIE)S 166 x(speci\211c)S 166 x(macros:)S 8033 Y 5692 X(o)S +166 x(LEGAL_NEW_XI)S -2 x(E_RESOUR)S -2 x(CE_)S 598 y 5692 X(o)S +166 x(CHECK_X)S -2 x(IE_ERRO)S -2 x(R_)S 598 y 5692 X(o)S 166 x(V)S +-55 x(ALIDA)S -29 x(TE_DRA)S -47 x(W)S -46 x(ABLE_AND)S -2 x(_GC)S +598 y 5692 X(o)S 166 x(FIND_CLIENT_INDE)S -2 x(X_)S 597 y 5692 X(o)S +166 x(WRITE_REPL)S -47 x(Y_TO_CLIENT_)S 598 y 5692 X(o)S 166 x +(WRITE_SW)S -47 x(APPED_DA)S -29 x(T)S -27 x(A_TO_CLIENT_)S 12766 Y +4796 X F102(/*)S 448 y -478 x(**)S 478 x(MACRO)S 240 x(definitions)S +448 y 4796 X(*/)S 449 y 478 x(/*)S 239 x(This)S 240 x(macro)S 239 x +(checks)S 240 x("value")S 240 x(for)S 239 x(NULL)S 240 x(and)S 239 x +(if)S 240 x(so,)S 239 x(sends)S 240 x(errorcode)S 240 x(indicated)S +448 y 5752 X(**)S 239 x(by)S 240 x("error_code")S 240 x(with)S 239 x +(the)S 240 x(relevant)S 240 x(resource)S 240 x("id".)S 448 y 5752 X +(*/)S 449 y 4796 X(#define)S 239 x(CHECK_XIE_ER)S 2 x +(ROR_\(value,id,error)S 2 x(_code\))S 239 x(\\)S 448 y 5752 X(if)S +239 x(\(!value\))S 240 x(\\)S 448 y 5035 X({\\)S 448 y -478 x +(SendErrorToClient)S 240 x(\(client,)S 240 x(xieReqCode,)S 241 x +(stuff->opcode,)S 240 x(id,)S 240 x(error_code\);\\)S 449 y 5991 X +(return)S 240 x(\(error_code\);\\)S 448 y 5035 X(})S 747 y 478 x(/*)S +239 x(This)S 240 x(macro)S 239 x(makes)S 240 x(sure)S 240 x(that)S +239 x(the)S 239 x(a)S 240 x(drawable)S 240 x(and)S 239 x(GC)S 239 x +(is)S 240 x(valid)S 239 x(*/)S 748 y 4796 X(#define)S 239 x +(VALIDATE_DRA)S 2 x(WABLE_AND_GC_\(drawI)S 2 x(D,)S 239 x(pDraw,)S +240 x(pGC,)S 239 x(client\)\\)S 448 y 5752 X(if)S 239 x +(\(\(client->las)S 2 x(tDrawableID)S 240 x(!=)S 239 x(drawID\))S +240 x(||)S 239 x(\(client->las)S 2 x(tGCID)S 239 x(!=)S 239 x +(stuff->gc\)\))S 2 x(\\)S 448 y 5752 X({\\)S 448 y 478 x(if)S 240 x +(\(client->lastDrawa)S 2 x(bleID)S 239 x(!=)S 239 x(drawID\)\\)S +449 y 5035 X({\\)S 448 y 6947 X(pDraw)S 240 x(=)S 239 x +(\(DrawablePtr)S 2 x(\)LookupID\(drawID,)S 240 x(RT_DRAWABLE)S 2 x +(,)S 239 x(RC_CORE\);\\)S 448 y 5991 X(CHECK_XIE_ERROR)S 2 x +(_\(pDraw,)S 240 x(drawID,)S 239 x(BadDrawable\))S 2 x(;\\)S 449 y +5991 X(if)S 239 x(\(\(pDraw->typ)S 2 x(e)S 239 x(==)S 239 x +(DRAWABLE_WINDO)S 2 x(W\))S 239 x(||)S 239 x(\\)S 448 y 5274 X +(\(pDraw->type)S 240 x(==)S 239 x(DRAWABLE_PI)S 2 x(XMAP\)\)\\)S +448 y 6947 X({\\)S 449 y -478 x(client->las)S 2 x(tDrawable)S 240 x +(=)S 239 x(\(DrawablePtr\)pDra)S 2 x(w;\\)S 448 y 6947 X +(client->las)S 2 x(tDrawableID)S 240 x(=)S 239 x(drawID;\\)S 448 y +5991 X(}\\)S 449 y 7665 X(else\\)S 448 y 5991 X({\\)S 448 y 5274 X +(SendErrorToClient)S 241 x(\(client,)S 240 x(xieReqCode,)S 240 x +(stuff->opcode,)S 240 x(drawID,\\)S 449 y 5513 X(BadDrawable\);\\)S +448 y -238 x(return)S 240 x(\(BadDrawable\);\\)S 448 y 5991 X(}\\)S +449 y 239 x(}\\)S 448 y -478 x(else\\)S 448 y 5991 X(pDraw)S 240 x +(=)S 239 x(\(DrawablePtr\)cli)S 2 x(ent->lastDrawable;\\)S 449 y +6708 X(if)S 240 x(\(client->lastGCID)S 241 x(!=)S 239 x +(stuff->gc\)\\)S 448 y 5035 X({\\)S 448 y 478 x(pGC)S 239 x(=)S 240 x +(\(GC)S 239 x(*\)LookupID\(stu)S 2 x(ff->gc,)S 239 x(RT_GC,)S 240 x +(RC_CORE\);\\)S 449 y 5991 X(CHECK_XIE_ERROR)S 2 x(_\(pGC,)S 239 x +(stuff->gc,)S 240 x(BadGC\);\\)S 448 y 7665 X(client->lastGC)S 240 x +(=)S 240 x(\(GCPtr\)pGC;\\)S 448 y 7665 X(client->lastGCID)S 241 x +(=)S 239 x(stuff->gc;\\)S 448 y 6708 X(}\\)S 449 y -478 x(else\\)S +448 y -238 x(pGC)S 239 x(=)S 239 x(\(GC)S 240 x(*\))S 239 x +(client->lastGC)S 2 x(;\\)S 448 y 6708 X(if)S 240 x(\(\(pGC->depth)S +240 x(!=)S 239 x(pDraw->depth)S 2 x(\))S 239 x(||)S 239 x +(\(pGC->pScreen)S 241 x(!=)S 239 x(pDraw->pScreen\)\)\\)S 449 y +5035 X({\\)S 448 y 478 x(client->lastGCI)S 2 x(D)S 239 x(=)S 239 x +(-1;\\)S 35879 Y 3600 X F40(F\2032)S 449 x(MACROS)S +PP +EP +%%DOC$Page: F-3 67 +1000 BP 39600 30600 PM 0 0 XY +5065 Y 5991 X F102(client->lastGC)S 241 x(=)S 239 x +(\(GCPtr\)NULL;\\)S 448 y 5991 X(SendErrorToClie)S 2 x(nt)S 239 x +(\(client,)S 240 x(xieReqCode,)S 240 x(stuff->opcode,)S 241 x +(stuff->gc,\\)S 448 y 5513 X(BadMatch\);\\)S 448 y 5991 X(return)S +240 x(\(BadMatch\);\\)S 449 y 6947 X(}\\)S 448 y 5752 X(}\\)S 448 y +-478 x(else\\)S 449 y 5752 X({\\)S 448 y 478 x(pGC)S 240 x(=)S 239 x +(\(GC)S 239 x(*\))S 240 x(client->lastGC;\\)S 448 y 6708 X(pDraw)S +240 x(=)S 239 x(\(DrawablePtr\))S 2 x(client->lastDrawable)S 2 x +(;\\)S 449 y 5752 X(}\\)S 448 y -478 x(if)S 239 x(\(pGC->serialN)S +2 x(umber)S 239 x(!=)S 240 x(pDraw->serialNumber\))S 2 x(\\)S 448 y +5752 X({)S 239 x(\\)S 449 y 5035 X(ValidateGC\(pDraw,)S 240 x +(pGC\);\\)S 448 y 5752 X(})S 747 y -239 x(/*)S 239 x(This)S 240 x +(macro)S 239 x(loops)S 240 x(through)S 240 x(the)S 239 x(current)S +240 x(number)S 240 x(of)S 239 x(clients)S 240 x(that)S 239 x(the)S +448 y 5752 X(**)S 239 x(is)S 240 x(supporting)S 240 x(and)S 239 x +(finding)S 240 x(a)S 239 x(match)S 240 x(with)S 239 x("index".)S +479 x(If)S 240 x(no)S 239 x(match)S 240 x(is)S 449 y 5752 X(**)S +239 x(found,)S 240 x(an)S 239 x(error)S 240 x(is)S 239 x(reported)S +240 x(to)S 239 x(the)S 240 x(client.)S 448 y 5752 X(*/)S 747 y 4796 X +(#define)S 239 x(FIND_CLIENT_)S 2 x(INDEX_\(index\)\\)S 449 y 5752 X +(for)S 239 x(\(index=0;)S 240 x(index)S 240 x(<=)S 239 x +(num_of_clien)S 2 x(ts;)S 239 x(index++\)\\)S 448 y 5035 X({\\)S +448 y -478 x(if)S 239 x(\(client->index)S 240 x(==)S 240 x +(client_table[inde)S 2 x(x].client_id\))S 240 x(break;\\)S 449 y +5991 X(}\\)S 448 y -717 x(if)S 239 x(\(index)S 240 x(==)S 239 x +(num_of_clien)S 2 x(ts\)\\)S 448 y 5035 X({\\)S 449 y -478 x +(SendErrorToClient)S 240 x(\(client,)S 240 x(xieReqCode,)S 241 x +(stuff->opcode,)S 240 x(client->index)S 2 x(,)S 239 x(\\)S 448 y +5274 X(BadMatch\);)S 240 x(\\)S 448 y 5991 X(return)S 240 x +(\(BadMatch\);\\)S 449 y 5035 X(})S 747 y 478 x(/*)S 239 x(This)S +240 x(macro)S 239 x(checks)S 240 x(that)S 240 x(an)S 239 x(XIE)S +239 x(resource)S 240 x(ID)S 240 x(is)S 239 x(valid)S 240 x(else)S +239 x(returns)S 448 y 5752 X(**)S 239 x(error)S 240 x(to)S 239 x +(client)S 448 y 5752 X(*/)S 748 y 4796 X(#define)S 239 x +(LEGAL_NEW_XI)S 2 x(E_RESOURCE_\(id,rTyp)S 2 x(e\)\\)S 448 y 5752 X +(if)S 239 x(\(\(LookupID\(id)S 2 x(,)S 239 x(rType,)S 240 x +(RC_xie\))S 239 x(!=)S 240 x(0\))S 239 x(||)S 239 x(\(id)S 240 x(&)S +239 x(SERVER_BIT\))S 240 x(\\)S 448 y 5035 X(||)S 239 x +(\(client->clientA)S 2 x(sMask)S 239 x(!=)S 240 x +(CLIENT_BITS\(id\)\)\)\\)S 449 y 5752 X({\\)S 448 y 5035 X +(SendErrorToClient)S 240 x(\(client,xi)S 2 x(eReqCode,)S 240 x +(stuff->opcode,)S 240 x(id,)S 240 x(BadIDChoice\);\\)S 448 y 6708 X +(return\(BadID)S 2 x(Choice\);\\)S 448 y 5752 X(})S 748 y -239 x(/*)S +239 x(This)S 240 x(macro)S 239 x(verifies)S 240 x(that)S 240 x(a)S +239 x(GC)S 239 x(is)S 240 x(valid)S 239 x(else)S 240 x(returns)S +240 x(error)S 239 x(to)S 240 x(client*/)S 747 y 4796 X(#define)S +239 x(VERIFY_GC\(pG)S 2 x(C,)S 239 x(rid,)S 239 x(client\)\\)S 448 y +5752 X(if)S 239 x(\(client->last)S 2 x(GCID)S 239 x(==)S 239 x +(rid\)\\)S 448 y 6708 X(pGC)S 240 x(=)S 239 x(client->lastGC;)S 2 x +(\\)S 449 y 5752 X(else\\)S 448 y 5035 X(pGC)S 239 x(=)S 239 x(\(GC)S +240 x(*\)LookupID\(rid,)S 240 x(RT_GC,)S 240 x(RC_CORE\);\\)S 448 y +5752 X(CHECK_XIE_ERROR_)S 2 x(\(pGC,)S 239 x(rid,)S 240 x +(BadGC\);\\)S 28527 Y 4796 X(#define)S 239 x(WRITE_REPLY_)S 2 x +(TO_CLIENT_)S 240 x(\(pClient,)S 240 x(size,)S 239 x(pReply\))S 240 x +(\\)S 448 y 5513 X(if)S 239 x(\(pClient->swap)S 2 x(ped\))S 239 x +(\\)S 448 y 6230 X(\(*XieReplySwap)S 2 x(Vector[\(\(XieReq)S 240 x +(*\)pClient->re)S 2 x(questBuffer\)->data])S 2 x(\))S 239 x(\\)S +448 y 7426 X(\(pClient,)S 240 x(size,)S 239 x(pReply\);)S 240 x(\\)S +449 y 6230 X(else)S 240 x(WriteToClient\(pCli)S 2 x(ent,)S 239 x +(size,)S 240 x(\(char)S 239 x(*\))S 240 x(pReply\);)S 747 y 4796 X +(#define)S 239 x(WRITE_SWAPPE)S 2 x(D_DATA_TO_CLIENT_)S 240 x +(\(pClient,)S 240 x(size,)S 240 x(pbuf\))S 240 x(\\)S 448 y 5513 X +(if)S 239 x(\(pClient->swap)S 2 x(ped\))S 239 x(\\)S 449 y 6230 X +(\(*pClient->pSw)S 2 x(apReplyFunc\)\(pClien)S 2 x(t,)S 239 x(size,)S +239 x(pbuf\);)S 240 x(\\)S 448 y 5513 X(else)S 239 x(WriteToClien)S +2 x(t)S 239 x(\(pClient,)S 240 x(size,)S 239 x(\(char)S 240 x(*\))S +239 x(pbuf\);)S 35879 Y 23699 X F40(MACROS)S 448 x(F\2033)S +PP +EP +%%DOC$Page: G-1 68 +1000 BP 39600 30600 PM 0 0 XY +9007 Y 3600 X F24(Appendix)S 497 x(G)S 10651 Y 3600 X(DIX/DD)S -2 x +(X)S 167 x(INTERF)S -39 x(ACE)S 13357 Y 4796 X F151(The)S 180 x +(following)S 180 x(represent)S 180 x(the)S 181 x(DIX)S 178 x(and)S +181 x(DDX)S 178 x(responsibilities)S 179 x(regarding)S 182 x(data)S +179 x(formats)S 179 x(for)S 180 x(each)S 598 y 4796 X(DDX)S 169 x +(call.)S 260 x(For)S 171 x(constrained)S 171 x(operations,)S 173 x +(the)S 171 x(DIX)S 170 x(will)S 170 x(apply)S 171 x(the)S 171 x +(quantize)S 171 x(function)S 172 x(upon)S 172 x(comple-)S 597 y +4796 X(tion.)S 897 y 4796 X(Note:)S 276 x(the)S 180 x(format)S 179 x +({i,j,k)S 2 x(})S 179 x(refers)S 179 x(to)S 180 x(two)S 179 x(input)S +180 x(IOB)S 178 x(data)S 179 x(types)S 180 x(\(i,j\))S 180 x(and)S +180 x(its)S 178 x(result)S 180 x(\(k\),)S 183 x(while)S 180 x(the)S +598 y 4796 X(format)S 170 x({i,c,k})S 171 x(refers)S 171 x(to)S 170 x +(one)S 171 x(input)S 171 x(IOB)S 170 x(of)S 170 x(type)S 171 x(i)S +171 x(and)S 170 x(a)S 171 x(constant)S 170 x(\(c\),)S 173 x(and)S +170 x({i,k})S 171 x(refers)S 171 x(to)S 170 x(one)S 171 x(input)S +598 y 4796 X(IOB)S 166 x(of)S 167 x(data)S 168 x(type)S 167 x(i)S +168 x(and)S 168 x(a)S 167 x(resultant)S 168 x(IOB)S 166 x(of)S 168 x +(data)S 167 x(type)S 168 x(k.)S 253 x(The)S 168 x(symbol)S 167 x(c)S +168 x(is)S 167 x(presumed)S 168 x(to)S 167 x(be)S 168 x(of)S 167 x +(type)S 597 y 4796 X(LONG,)S 172 x(the)S 173 x(symbol)S 172 x(frac)S +173 x(is)S 172 x(the)S 173 x(symbol)S 173 x(for)S 172 x(fractional)S +173 x(constants,)S 174 x(and)S 173 x(the)S 173 x(symbols)S 172 x +(i,j)S 174 x(and)S 173 x(k)S 173 x(take)S 598 y 4796 X(on)S 166 x +(the)S 166 x(following)S 166 x(possible)S 166 x(values:)S 19633 Y +5692 X(XieK_Bits)S -2 x(tream)S 166 x(0)S 598 y 5692 X +(XieK_ByteImage)S 166 x(1)S 598 y 5692 X(XieK_W)S -28 x(ordImage)S +166 x(2)S 598 y 5692 X(XieK_LongImage)S 167 x(3)S 597 y 5692 X +(XieK_Float)S 165 x(4)S 23220 Y 5692 X(_POINT)S 24415 Y 5692 X(DIX:)S +166 x(create)S 166 x(destination)S 166 x(IOB)S 165 x(of)S 166 x +(type)S 166 x(indicated)S 166 x(by)S 166 x(the)S 167 x(request)S +166 x(parameter)S 166 x(-)S 166 x(new_quantum.)S 598 y 5692 X(DDX:)S +173 x(must)S 173 x(be)S 173 x(able)S 174 x(to)S 173 x(handle)S 174 x +(all)S 173 x(permutations)S 173 x(of)S 174 x(data)S 173 x(formats)S +173 x({i,k})S 174 x(with)S 173 x(the)S 173 x(exception)S 174 x(of)S +598 y 5692 X(i,k)S 167 x(=)S 166 x(4.)S 26807 Y 5692 X(_AREA)S 165 x +(\(Addition\))S 28002 Y 5692 X(DIX:)S 166 x(create)S 166 x +(destination)S 166 x(IOB)S 165 x(of)S 166 x(type)S 166 x(4.)S 598 y +5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x(able)S 166 x(to)S 166 x +(handle)S 167 x(all)S 165 x(permutations)S 166 x(of)S 166 x(data)S +166 x(formats)S 165 x({i,4}.)S 29795 Y 5692 X(_AREA)S 165 x +(\(Multiplication\))S 30991 Y 5692 X(DIX:)S 166 x(create)S 166 x +(destination)S 166 x(IOB)S 165 x(of)S 166 x(type)S 166 x(4.)S 598 y +5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x(able)S 166 x(to)S 166 x +(handle)S 167 x(all)S 165 x(permutations)S 166 x(of)S 166 x(data)S +166 x(formats)S 165 x({i,4}.)S 32784 Y 5692 X(-ARITH)S 165 x +(\(ADD_II)S -2 x(\))S 33980 Y 5692 X(DIX:)S 166 x(create)S 166 x +(destination)S 166 x(IOB)S 165 x(of)S 166 x(type)S 166 x(k)S 166 x +(where)S 167 x(k)S 166 x(=)S 166 x(max\(i,j\)+1.)S 35879 Y 21092 X +F40(DIX/DD)S -2 x(X)S 166 x(INTERF)S -25 x(ACE)S 447 x(G\2031)S +PP +EP +%%DOC$Page: G-2 69 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 5692 X F151(DDX:)S 165 x(must)S 166 x(be)S 166 x(able)S 166 x +(to)S 166 x(handle)S 167 x(all)S 165 x(permutations)S 166 x(of)S +166 x(data)S 166 x(formats)S 165 x({i,j,k)S 2 x(})S 166 x(where)S +166 x(k)S 166 x(=)S 166 x(max\(i,j\)+1.)S 7257 Y 5692 X(_ARITH)S +165 x(\(ADD_IC\))S 8453 Y 5692 X(DIX:)S 166 x(create)S 166 x +(destination)S 166 x(IOB)S 165 x(of)S 166 x(type)S 166 x(4.)S 597 y +5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x(able)S 166 x(to)S 166 x +(handle)S 167 x(all)S 165 x(permutations)S 166 x(of)S 166 x(data)S +166 x(formats)S 165 x({i,c,4}.)S 10246 Y 5692 X(_ARITH)S 165 x +(\(SUB_II\))S 11441 Y 5692 X(DIX:)S 166 x(create)S 166 x +(destination)S 166 x(IOB)S 165 x(of)S 166 x(type)S 166 x(4.)S 598 y +5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x(able)S 166 x(to)S 166 x +(handle)S 167 x(all)S 165 x(permutations)S 166 x(of)S 166 x(data)S +166 x(formats)S 165 x({i,j,4}.)S 13832 Y 5692 X(_ARITH)S 165 x +(\(SUB_IC\))S 15028 Y 5692 X(DIX:)S 166 x(create)S 166 x +(destination)S 166 x(IOB)S 165 x(of)S 166 x(type)S 166 x(4.)S 598 y +5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x(able)S 166 x(to)S 166 x +(handle)S 167 x(all)S 165 x(permutations)S 166 x(of)S 166 x(data)S +166 x(formats)S 165 x({i,c,4}.)S 16821 Y 5692 X(_ARITH)S 165 x +(\(SUB_CI\))S 18017 Y 5692 X(DIX:)S 166 x(create)S 166 x +(destination)S 166 x(IOB)S 165 x(of)S 166 x(type)S 166 x(4.)S 597 y +5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x(able)S 166 x(to)S 166 x +(handle)S 167 x(all)S 165 x(permutations)S 166 x(of)S 166 x(data)S +166 x(formats)S 165 x({c,i,4}.)S 19810 Y 5692 X(_ARITH)S 165 x +(\(MUL_II\))S 21005 Y 5692 X(DIX:)S 176 x(create)S 177 x +(destination)S 177 x(IOB)S 176 x(of)S 177 x(type)S 177 x(k)S 177 x +(where)S 177 x(k)S 177 x(=)S 177 x(max\(i,j\))S 178 x(+)S 176 x(1,)S +180 x(unless)S 177 x(i)S 177 x(or)S 177 x(j)S 177 x(=)S 177 x(0,)S +180 x(then)S 177 x(k)S 177 x(=)S 598 y 5692 X(max\(i,j\).)S 598 y +5692 X(DDX:)S 167 x(must)S 167 x(be)S 168 x(able)S 168 x(to)S 167 x +(handle)S 168 x(all)S 168 x(permutations)S 167 x(of)S 168 x(data)S +167 x(formats)S 167 x({i,j,k)S 2 x(})S 167 x(where)S 168 x(k)S 168 x +(=)S 167 x(i)S 168 x(or)S 168 x(k)S 168 x(=)S 167 x(i)S 168 x(+)S +598 y 5692 X(1.)S 23994 Y -415 x(_ARITH)S 165 x(\(MUL_IC\))S 25190 Y +5692 X(DIX:)S 166 x(create)S 166 x(destination)S 166 x(IOB)S 165 x +(of)S 166 x(type)S 166 x(4.)S 598 y 5692 X(DDX:)S 165 x(must)S 166 x +(be)S 166 x(able)S 166 x(to)S 166 x(handle)S 167 x(all)S 165 x +(permutations)S 166 x(of)S 166 x(data)S 166 x(formats)S 165 x +({i,c,4}.)S 26983 Y 5692 X(_ARITH)S 165 x(\(DIV_IC\))S 28179 Y 5692 X +(DIX:)S 166 x(create)S 166 x(destination)S 166 x(IOB)S 165 x(of)S +166 x(type)S 166 x(4.)S 597 y 5692 X(DDX:)S 165 x(must)S 166 x(be)S +166 x(able)S 166 x(to)S 166 x(handle)S 167 x(all)S 165 x +(permutations)S 166 x(of)S 166 x(data)S 166 x(formats)S 165 x +({i,c,4}.)S 29972 Y 5692 X(_ARITH)S 165 x(\(DIV_CI\))S 31167 Y 5692 X +(DIX:)S 166 x(create)S 166 x(destination)S 166 x(IOB)S 165 x(of)S +166 x(type)S 166 x(4.)S 598 y 5692 X(DDX:)S 165 x(must)S 166 x(be)S +166 x(able)S 166 x(to)S 166 x(handle)S 167 x(all)S 165 x +(permutations)S 166 x(of)S 166 x(data)S 166 x(formats)S 165 x +({i,c,4}.)S 32961 Y 5692 X(_ARITH)S 165 x(\(DIV_II\))S 35879 Y 3600 X +F40(G\2032)S 449 x(DIX/D)S -2 x(DX)S 166 x(INTERF)S -26 x(ACE)S +PP +EP +%%DOC$Page: G-3 70 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 5692 X F151(DIX:)S 166 x(create)S 166 x(destination)S 166 x +(IOB)S 165 x(of)S 166 x(type)S 166 x(4.)S 598 y 5692 X(DDX:)S 165 x +(must)S 166 x(be)S 166 x(able)S 166 x(to)S 166 x(handle)S 167 x(all)S +165 x(permutations)S 166 x(of)S 166 x(data)S 166 x(formats)S 165 x +({i,c,4}.)S 6958 Y 5692 X(_ARITH)S 165 x(\(MIN_II\))S 8154 Y 5692 X +(DIX:)S 166 x(create)S 166 x(destination)S 166 x(IOB)S 165 x(of)S +166 x(type)S 166 x(k)S 166 x(where)S 167 x(k)S 166 x(=)S 166 x +(max\(i,j\))S 597 y 5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x +(able)S 166 x(to)S 166 x(handle)S 167 x(all)S 165 x(permutations)S +166 x(of)S 166 x(data)S 166 x(formats)S 165 x({i,j,k)S 2 x(})S 166 x +(where)S 166 x(k)S 166 x(=)S 166 x(max\(i,j\).)S 9947 Y 5692 X +(_ARITH)S 165 x(\(MIN_IC\))S 11142 Y 5692 X(DIX:)S 166 x(create)S +166 x(destination)S 166 x(IOB)S 165 x(of)S 166 x(type)S 166 x(k)S +166 x(where)S 167 x(k)S 166 x(=)S 166 x(i.)S 598 y 5692 X(DDX:)S +165 x(must)S 166 x(be)S 166 x(able)S 166 x(to)S 166 x(handle)S 167 x +(all)S 165 x(permutations)S 166 x(of)S 166 x(data)S 166 x(formats)S +165 x({i,c,k})S 167 x(where)S 167 x(k)S 166 x(=)S 166 x(i.)S 12936 Y +5692 X(_ARITH)S 165 x(\(MAX_II\))S 14131 Y 5692 X(DIX:)S 166 x +(create)S 166 x(destination)S 166 x(IOB)S 165 x(of)S 166 x(type)S +166 x(k)S 166 x(where)S 167 x(k)S 166 x(=)S 166 x(max\(i,j\))S 598 y +5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x(able)S 166 x(to)S 166 x +(handle)S 167 x(all)S 165 x(permutations)S 166 x(of)S 166 x(data)S +166 x(formats)S 165 x({i,j,k)S 2 x(})S 166 x(where)S 166 x(k)S 166 x +(=)S 166 x(max\(i,j\).)S 15925 Y 5692 X(_ARITH)S 165 x(\(MAX_IC\))S +17120 Y 5692 X(DIX:)S 166 x(create)S 166 x(destination)S 166 x(IOB)S +165 x(of)S 166 x(type)S 166 x(k)S 166 x(=)S 166 x(max\(i,c\).)S 598 y +5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x(able)S 166 x(to)S 166 x +(handle)S 167 x(all)S 165 x(permutations)S 166 x(of)S 166 x(data)S +166 x(formats)S 165 x({i,c,k})S 167 x(where)S 167 x(k)S 166 x(=)S +166 x(max\(i,c\).)S 18913 Y 5692 X(_COMP)S -37 x(ARE)S 20109 Y 5692 X +(DIX:)S 166 x(create)S 166 x(destination)S 166 x(IOB)S 165 x(of)S +166 x(type)S 166 x(0.)S 598 y 5692 X(DDX:)S 165 x(must)S 166 x(be)S +166 x(able)S 166 x(to)S 166 x(handle)S 167 x(all)S 165 x +(permutations)S 166 x(of)S 166 x(data)S 166 x(formats)S 165 x +({i,j,0}.)S 21902 Y 5692 X(_LOGICAL)S 165 x(\(AND_II)S -2 x(\))S +23098 Y 5692 X(DIX:)S 166 x(create)S 166 x(destination)S 166 x(IOB)S +165 x(of)S 166 x(type)S 166 x(k)S 166 x(=)S 166 x(max\(i,j\).)S 597 y +5692 X(DDX:)S 175 x(must)S 175 x(be)S 176 x(able)S 175 x(to)S 175 x +(handle)S 176 x(all)S 176 x(permutations)S 175 x(of)S 176 x(data)S +175 x(formats)S 175 x({i,j,k})S 176 x(where)S 176 x(i,j)S 177 x(and)S +175 x(k)S 176 x(are)S 598 y 5692 X(not)S 166 x(4.)S 25489 Y 5692 X +(_LOGICAL)S 165 x(\(AND_IC)S -2 x(\))S 26684 Y 5692 X(DIX:)S 166 x +(create)S 166 x(destination)S 166 x(IOB)S 165 x(of)S 166 x(type)S +166 x(3.)S 598 y 5692 X(DDX:)S 167 x(must)S 168 x(be)S 168 x(able)S +168 x(to)S 168 x(handle)S 168 x(all)S 168 x(permutations)S 168 x(of)S +168 x(data)S 168 x(formats)S 167 x({i,c,k})S 169 x(where)S 168 x(i)S +168 x(=)S 168 x(0,1,2,3)S 169 x(and)S 598 y 5692 X(k)S 167 x(=)S +165 x(3.)S 29075 Y 5692 X(_LOGICAL)S 165 x(\(OR_II\))S 30271 Y 5692 X +(DIX:)S 166 x(create)S 166 x(destination)S 166 x(IOB)S 165 x(of)S +166 x(type)S 166 x(k)S 166 x(=)S 166 x(max\(i,j\).)S 597 y 5692 X +(DDX:)S 175 x(must)S 175 x(be)S 176 x(able)S 175 x(to)S 175 x +(handle)S 176 x(all)S 176 x(permutations)S 175 x(of)S 176 x(data)S +175 x(formats)S 175 x({i,j,k})S 176 x(where)S 176 x(i,j)S 177 x(and)S +175 x(k)S 176 x(are)S 598 y 5692 X(not)S 166 x(4.)S 32662 Y 5692 X +(_LOGICAL)S 165 x(\(OR_IC)S -2 x(\))S 33857 Y 5692 X(DIX:)S 166 x +(create)S 166 x(destination)S 166 x(IOB)S 165 x(of)S 166 x(type)S +166 x(3.)S 35879 Y 21092 X F40(DIX/DD)S -2 x(X)S 166 x(INTERF)S -25 x +(ACE)S 447 x(G\2033)S +PP +EP +%%DOC$Page: G-4 71 +1000 BP 39600 30600 PM 0 0 XY +5165 Y 5692 X F151(DDX:)S 167 x(must)S 168 x(be)S 168 x(able)S 168 x +(to)S 168 x(handle)S 168 x(all)S 168 x(permutations)S 168 x(of)S +168 x(data)S 168 x(formats)S 167 x({i,c,k})S 169 x(where)S 168 x(i)S +168 x(=)S 168 x(0,1,2,3)S 169 x(and)S 598 y 5692 X(k)S 167 x(=)S +165 x(3.)S 6958 Y 5692 X(_LOGICAL)S 165 x(\(XOR_I)S -2 x(I\))S 8154 Y +5692 X(DIX:)S 166 x(create)S 166 x(destination)S 166 x(IOB)S 165 x +(of)S 166 x(type)S 166 x(k)S 166 x(=)S 166 x(max\(i,j\).)S 597 y +5692 X(DDX:)S 175 x(must)S 175 x(be)S 176 x(able)S 175 x(to)S 175 x +(handle)S 176 x(all)S 176 x(permutations)S 175 x(of)S 176 x(data)S +175 x(formats)S 175 x({i,j,k})S 176 x(where)S 176 x(i,j)S 177 x(and)S +175 x(k)S 176 x(are)S 598 y 5692 X(not)S 166 x(4.)S 10545 Y 5692 X +(_LOGICAL)S 165 x(\(XOR_I)S -2 x(C\))S 11740 Y 5692 X(DIX:)S 166 x +(create)S 166 x(destination)S 166 x(IOB)S 165 x(of)S 166 x(type)S +166 x(3.)S 598 y 5692 X(DDX:)S 167 x(must)S 168 x(be)S 168 x(able)S +168 x(to)S 168 x(handle)S 168 x(all)S 168 x(permutations)S 168 x(of)S +168 x(data)S 168 x(formats)S 167 x({i,c,k})S 169 x(where)S 168 x(i)S +168 x(=)S 168 x(0,1,2,3)S 169 x(and)S 598 y 5692 X(k)S 167 x(=)S +165 x(3.)S 14131 Y 5692 X(_LOGICAL)S 165 x(\(SHIFT_UP)S 166 x(or)S +166 x(SHIFT_DOWN\))S 15327 Y 5692 X(DIX:)S 166 x(create)S 166 x +(destination)S 166 x(IOB)S 165 x(of)S 166 x(same)S 165 x(type)S 166 x +(as)S 166 x(input.)S 598 y 5692 X(DDX:)S 175 x(must)S 175 x(be)S +176 x(able)S 175 x(to)S 175 x(handle)S 176 x(all)S 176 x +(permutations)S 175 x(of)S 176 x(data)S 175 x(formats)S 175 x +({i,j,k})S 176 x(where)S 176 x(i,j)S 177 x(and)S 175 x(k)S 176 x +(are)S 597 y 5692 X(not)S 166 x(4.)S 17718 Y 5692 X(_LOGICAL)S 165 x +(\(NOT\))S 18913 Y 5692 X(DIX:)S 166 x(create)S 166 x(destination)S +166 x(IOB)S 165 x(of)S 166 x(same)S 165 x(type)S 166 x(as)S 166 x +(input.)S 598 y 5692 X(DDX:)S 175 x(must)S 175 x(be)S 176 x(able)S +175 x(to)S 175 x(handle)S 176 x(all)S 176 x(permutations)S 175 x(of)S +176 x(data)S 175 x(formats)S 175 x({i,j,k})S 176 x(where)S 176 x +(i,j)S 177 x(and)S 175 x(k)S 176 x(are)S 598 y 5692 X(not)S 166 x +(4.)S 21304 Y 5692 X(_MA)S -27 x(THF)S 166 x(\(PWR\))S 22500 Y 5692 X +(DIX:)S 166 x(create)S 166 x(destination)S 166 x(IOB)S 165 x(of)S +166 x(type)S 166 x(4.)S 598 y 5692 X(DDX:)S 165 x(must)S 166 x(be)S +166 x(able)S 166 x(to)S 166 x(handle)S 167 x(all)S 165 x +(permutations)S 166 x(of)S 166 x(data)S 166 x(formats)S 165 x +({i,frac,4}.)S 24293 Y 5692 X(_MA)S -27 x(THF)S 166 x(\(LOG2,)S 166 x +(LN,)S 167 x(LOG10\))S 25489 Y 5692 X(DIX:)S 166 x(create)S 166 x +(destination)S 166 x(IOB)S 165 x(of)S 166 x(type)S 166 x(4.)S 597 y +5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x(able)S 166 x(to)S 166 x +(handle)S 167 x(all)S 165 x(permutations)S 166 x(of)S 166 x(data)S +166 x(formats)S 165 x({i,4}.)S 27282 Y 5692 X(_MA)S -27 x(THF)S 166 x +(\(SQUARE)S -2 x(\))S 28477 Y 5692 X(DIX:)S 166 x(create)S 166 x +(destination)S 166 x(IOB)S 165 x(of)S 166 x(type)S 166 x(k)S 166 x +(where)S 167 x(k)S 166 x(=)S 166 x(i)S 166 x(+)S 166 x(1,)S 166 x +(unless)S 166 x(i)S 166 x(=)S 166 x(0,)S 166 x(then)S 167 x(k)S 166 x +(=)S 166 x(i.)S 598 y 5692 X(DDX:)S 171 x(must)S 170 x(be)S 172 x +(able)S 171 x(to)S 171 x(handle)S 172 x(all)S 171 x(permutations)S +171 x(of)S 171 x(data)S 171 x(formats)S 170 x({i,k})S 172 x(where)S +171 x(k)S 172 x(=)S 171 x(i)S 171 x(or)S 172 x(k)S 171 x(=)S 171 x +(i)S 171 x(+)S 598 y 5692 X(1.)S 30868 Y -415 x(_MA)S -27 x(THF)S +166 x(\(SQUARE)S -2 x(_ROOT\))S 32064 Y 5692 X(DIX:)S 166 x(create)S +166 x(destination)S 166 x(IOB)S 165 x(of)S 166 x(type)S 166 x(4.)S +598 y 5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x(able)S 166 x(to)S +166 x(handle)S 167 x(all)S 165 x(permutations)S 166 x(of)S 166 x +(data)S 166 x(formats)S 165 x({i,4}.)S 33857 Y 5692 X(_SCALE)S 35879 Y +3600 X F40(G\2034)S 449 x(DIX/D)S -2 x(DX)S 166 x(INTERF)S -26 x +(ACE)S +PP +EP +%%DOC$Page: G-5 72 +1000 BP 39600 30600 PM 0 0 XY +5393 Y 5692 X F151(DIX:)S 166 x(create)S 166 x(destination)S 166 x +(IOB)S 165 x(of)S 166 x(type)S 166 x(k)S 166 x(=)S 166 x(i.)S 598 y +5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x(able)S 166 x(to)S 166 x +(handle)S 167 x(all)S 165 x(cases)S 166 x(of)S 166 x(data)S 165 x +(types)S 166 x(of)S 166 x(the)S 167 x(form)S 166 x({i,k})S 166 x +(where)S 166 x(k)S 167 x(=)S 166 x(i.)S 7187 Y 5692 X(_ROT)S -28 x +(A)S -27 x(TE)S 8382 Y 5692 X(DIX:)S 166 x(Create)S 165 x +(destination)S 166 x(IOB)S 165 x(of)S 166 x(type)S 166 x(k)S 167 x +(=)S 166 x(i.)S 598 y 5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x +(able)S 166 x(to)S 166 x(handle)S 167 x(all)S 165 x(cases)S 166 x +(of)S 166 x(data)S 165 x(types)S 166 x(of)S 166 x(the)S 167 x(form)S +166 x({i,k})S 166 x(where)S 166 x(k)S 167 x(=)S 166 x(i.)S 10175 Y +5692 X(_MIRROR)S 11371 Y 5692 X(DIX:)S 166 x(Create)S 165 x +(destination)S 166 x(IOB)S 165 x(of)S 166 x(type)S 166 x(k)S 167 x +(=)S 166 x(i.)S 598 y 5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x +(able)S 166 x(to)S 166 x(handle)S 167 x(all)S 165 x(cases)S 166 x +(of)S 166 x(data)S 165 x(types)S 166 x(of)S 166 x(the)S 167 x(form)S +166 x({i,k})S 166 x(where)S 166 x(k)S 167 x(=)S 166 x(i.)S 13164 Y +5692 X(_CROP)S 14360 Y 5692 X(DIX:)S 166 x(Create)S 165 x +(destination)S 166 x(IOB)S 165 x(of)S 166 x(type)S 166 x(k)S 167 x +(=)S 166 x(i.)S 597 y 5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x +(able)S 166 x(to)S 166 x(handle)S 167 x(all)S 165 x(cases)S 166 x +(of)S 166 x(data)S 165 x(types)S 166 x(of)S 166 x(the)S 167 x(form)S +166 x({i,k})S 166 x(where)S 166 x(k)S 167 x(=)S 166 x(i.)S 16153 Y +5692 X(_TRANSLA)S -28 x(TE)S 166 x(\(II\))S 17348 Y 5692 X(DIX:)S +166 x(create)S 166 x(destination)S 166 x(IOB)S 165 x(of)S 166 x +(type)S 166 x(k)S 166 x(where)S 167 x(k)S 166 x(=)S 166 x +(max\(i,j\).)S 598 y 5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x +(able)S 166 x(to)S 166 x(handle)S 167 x(all)S 165 x(permutations)S +166 x(of)S 166 x(data)S 166 x(formats)S 165 x({i,j,k)S 2 x(})S 166 x +(where)S 166 x(k)S 166 x(=)S 166 x(max\(i,j\).)S 19142 Y 5692 X +(_TRANSLA)S -28 x(TE)S 166 x(\(IC\))S 20337 Y 5692 X(DIX:)S 166 x +(create)S 166 x(destination)S 166 x(IOB)S 165 x(of)S 166 x(type)S +166 x(k)S 166 x(where)S 167 x(k)S 166 x(=)S 166 x(max\(i,c\))S 598 y +5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x(able)S 166 x(to)S 166 x +(handle)S 167 x(all)S 165 x(cases)S 166 x(of)S 166 x(data)S 165 x +(types)S 166 x(of)S 166 x(formats)S 166 x({i,c,k})S 167 x(where)S +166 x(k)S 167 x(=)S 165 x(max\(i,c\).)S 22131 Y 5692 X(_CONSTRAIN)S +23326 Y 5692 X(DIX:)S 166 x(create)S 166 x(destination)S 166 x(IOB)S +165 x(of)S 166 x(type)S 166 x(k)S 166 x(where)S 167 x(k)S 166 x(is)S +166 x(dictated)S 165 x(by)S 167 x(the)S 166 x(quantize)S 166 x +(context.)S 598 y 5692 X(DDX:)S 167 x(must)S 167 x(be)S 167 x(able)S +167 x(to)S 167 x(handle)S 168 x(all)S 167 x(permutations)S 167 x(of)S +167 x(data)S 167 x(formats)S 167 x({i,k})S 168 x(with)S 166 x(the)S +168 x(exception)S 168 x(of)S 167 x(k)S 598 y 5692 X(=)S 166 x(4.)S +25717 Y -883 x(_MA)S -27 x(TCH_HISTOG)S -2 x(RAM)S 166 x(\(TBS\))S +27510 Y 5692 X(_CHROMINANC)S -2 x(E_SEP)S -37 x(ARA)S -29 x(TE)S +28706 Y 5692 X(DIX:)S 188 x(if)S 189 x(input)S 189 x(IOB)S 188 x(is)S +188 x(of)S 189 x(type)S 189 x(4,)S 195 x(quantize)S 189 x(to)S 189 x +(IOB)S 187 x(of)S 189 x(type)S 189 x(speci\211ed)S 189 x(by)S 189 x +(the)S 189 x(quantization)S 598 y 5692 X(context,)S 167 x(then)S +167 x(create)S 166 x(IOBs)S 165 x(of)S 166 x(type)S 166 x(1,2)S 166 x +(or)S 167 x(3)S 166 x(depending)S 167 x(on)S 166 x(component)S 167 x +(depth.)S 597 y 5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x(able)S +166 x(to)S 166 x(handle)S 167 x(all)S 165 x(types)S 166 x(of)S 166 x +(input)S 167 x(IOBs)S 164 x(except)S 167 x(4.)S 31097 Y 5692 X +(_CHROMINANC)S -2 x(E_COMBINE)S 32292 Y 5692 X(DIX:)S 190 x(If)S +190 x(input)S 191 x(IOBs)S 189 x(are)S 191 x(of)S 191 x(type)S 190 x +(4,)S 198 x(quantize)S 190 x(according)S 192 x(to)S 190 x +(quantization)S 191 x(context,)S 198 x(create)S 598 y 5692 X +(destination)S 166 x(IOB)S 165 x(of)S 166 x(type)S 166 x(1,2,)S 167 x +(or)S 166 x(3)S 166 x(as)S 166 x(dictated)S 165 x(by)S 167 x(the)S +166 x("quantized")S 166 x(input)S 166 x(IOBs.)S 598 y 5692 X(DDX:)S +165 x(must)S 166 x(be)S 166 x(able)S 166 x(to)S 166 x(handle)S 167 x +(all)S 165 x(types)S 166 x(of)S 166 x(input)S 167 x(IOBs)S 164 x +(except)S 167 x(4.)S 35879 Y 21092 X F40(DIX/DD)S -2 x(X)S 166 x +(INTERF)S -25 x(ACE)S 447 x(G\2035)S +PP +EP +%%DOC$Page: G-6 73 +1000 BP 39600 30600 PM 0 0 XY +5146 Y 5692 X F151(_DITHER)S 6341 Y 5692 X(DIX:)S 188 x(if)S 189 x +(input)S 189 x(IOB)S 188 x(is)S 188 x(of)S 189 x(type)S 189 x(4,)S +195 x(quantize)S 189 x(to)S 189 x(IOB)S 187 x(of)S 189 x(type)S 189 x +(speci)S +(\211ed)S 189 x(by)S 189 x(the)S 189 x(quantization)S 598 y 5692 X +(context,)S 167 x(then)S 167 x(create)S 166 x(destination)S 166 x +(IOB)S 165 x(of)S 166 x(type)S 166 x(indicated)S 166 x(by)S 167 x +("result_bits")S 598 y 5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x +(able)S 166 x(to)S 166 x(handle)S 167 x(all)S 165 x(cases)S 166 x +(of)S 166 x(data)S 165 x(formats)S 166 x({i,k})S 166 x(where)S 167 x +(i)S 166 x(or)S 166 x(k)S 166 x(not)S 166 x(equal)S 167 x(to)S 166 x +(4)S 8733 Y 5692 X(_LUMINANCE)S 165 x(\(TBS\))S 10526 Y 5692 X +(_CALC_HISTOG)S -2 x(RAM)S 11721 Y 5692 X(DIX:)S 188 x(if)S 189 x +(input)S 189 x(IOB)S 188 x(is)S 188 x(of)S 189 x(type)S 189 x(4,)S +195 x(quantize)S 189 x(to)S 189 x(IOB)S 187 x(of)S 189 x(type)S 189 x +(speci)S +(\211ed)S 189 x(by)S 189 x(the)S 189 x(quantization)S 598 y 5692 X +(context.)S 598 y 5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x(able)S +166 x(to)S 166 x(handle)S 167 x(all)S 165 x(types)S 166 x(of)S 166 x +(input)S 167 x(IOB)S 165 x(except)S 166 x(4.)S 14112 Y 5692 X +(POINT_ST)S -27 x(A)S -28 x(TS)S 15308 Y 5692 X(DIX:)S 166 x(NONE)S +598 y 5692 X(DDX:)S 165 x(must)S 166 x(be)S 166 x(able)S 166 x(to)S +166 x(handle)S 167 x(all)S 165 x(types)S 166 x(of)S 166 x(input)S +167 x(IOBs)S -2 x(.)S 17101 Y 5692 X(AREA_ST)S -28 x(A)S -28 x(TS)S +18297 Y 5692 X(DIX:)S 166 x(Create)S 165 x(destination)S 166 x(IOB)S +165 x(of)S 166 x(type)S 166 x(4.)S 597 y 5692 X(DDX:)S 165 x(must)S +166 x(be)S 166 x(able)S 166 x(to)S 166 x(handle)S 167 x(all)S 165 x +(types)S 166 x(of)S 166 x(input)S 167 x(IOB)S 165 x(i)S 165 x(for)S +167 x({i,4}.)S 35879 Y 3600 X F40(G\2036)S 449 x(DIX/D)S -2 x(DX)S +166 x(INTERF)S -26 x(ACE)S +PP +EP +%%Trailer +EndDVC$PSDoc +%%DocumentFonts: Helvetica@DOCPSE Helvetica-Bold@DOCPSE +%%+Helvetica-Oblique@DOCPSE NewCenturySchlbk-Roman@DOCPSE +%%+NewCenturySchlbk-Italic@DOCPSE Courier@DOCPSE +%%+NewCenturySchlbk-Bold@DOCPSE +%%Pages 73 diff --git a/xie/docs/x11r4/server.txt b/xie/docs/x11r4/server.txt new file mode 100644 index 0000000..e6d9e33 --- /dev/null +++ b/xie/docs/x11r4/server.txt @@ -0,0 +1,3383 @@ + DATE: +May 1, 1989 + + + + + Design Speci�cation + for + Design of a Machine Independent X Image Extension Server System + + + + +Written by: Richard Piccolo + + + +Issued by: IPG Engineering + + + +Approved by: + + + Joe Mauro, IPG Architect + + + John Weber, Project Leader + + + + + Digital Equipment Corporation + Contents + + PREFACE vi + +CHAPTER 1 OVERVIEW 1–1 + 1.1 INTRODUCTION 1–1 + 1.2 XIE ORGANIZATION 1–2 + 1.2.1 XIELIB 1–3 + 1.2.2 DIX/XIE Component 1–4 + 1.2.3 DDX/XIE Component 1–4 + 1.2.3.1 DDX/Machine Independent Component • 1–4 + 1.2.3.2 DDX/Machine Dependent Component • 1–4 + 1.2.4 XIE Services 1–4 + 1.2.4.1 Session Services • 1–5 + 1.2.4.2 Resource Services • 1–5 + 1.2.4.2.1 IOB • 1–5 + 1.2.4.2.2 IDC • 1–5 + 1.2.4.2.3 IPC • 1–5 + 1.2.4.3 Server/Client Image/Export Services • 1–5 + 1.2.4.4 Transport Services • 1–6 + 1.2.4.5 Process Services • 1–6 + 1.2.4.6 Statistic Services • 1–6 + 1.2.4.7 Process Control Services • 1–6 + 1.2.4.8 Display Service • 1–6 + 1.2.4.9 Event Services • 1–6 + 1.2.5 Relationship to CORE X 1–6 + 1.2.5.1 CORE X Resources • 1–7 + 1.2.5.1.1 Graphics Context • 1–7 + 1.2.5.1.2 Drawables • 1–7 + 1.2.5.2 Processing Modes • 1–7 + 1.2.5.2.1 DIX Processing • 1–7 + 1.2.5.2.2 DIX/DDX Processing • 1–7 + +CHAPTER 2 DIX/XIE COMPONENT 2–1 + 2.1 INITIALIZATION PROCEDURES 2–3 + 2.1.1 XieInit 2–3 + 2.1.1.1 Making XIE Known to the CORE X • 2–3 + 2.1.1.2 De�ning Errors and Events • 2–4 + 2.1.1.3 De�ning XIE Resource Class and Types • 2–4 + 2.1.2 XieDeviceInit 2–5 + 2.2 DIX/XIE REQUEST PROCESSING 2–6 + 2.2.1 XieDispatcher 2–6 + 2.2.1.1 Error Noti�cation to Client • 2–7 + 2.2.1.2 Swapping Requests • 2–7 + + + + + iii + Contents + + + 2.2.2 DIX Request Procedures 2–8 + 2.2.2.1 Processing of Requests - Phase I • 2–8 + 2.2.2.1.1 Variable Length Requests • 2–8 + 2.2.2.2 Processing of Requests - Phase II • 2–9 + 2.2.2.2.1 XIE Replies • 2–9 + 2.2.2.2.2 Session Services • 2–10 + 2.2.2.2.2.1 XIEP_INIT_SESSION • 2–10 + 2.2.2.2.2.2 XIEP_TERM_SESSION • 2–10 + 2.2.2.2.3 Resource Services • 2–11 + 2.2.2.2.3.1 Creating XIE Resources • 2–11 + 2.2.2.2.3.2 Validating XIE Resources • 2–12 + 2.2.2.2.3.3 Freeing XIE Resources • 2–12 + 2.2.2.2.3.4 Querying XIE Resources • 2–12 + 2.2.2.2.4 Import/Export Services • 2–12 + 2.2.2.2.4.1 XIEP_IMPORT_IMAGE • 2–12 + 2.2.2.2.4.2 XIEP_EXPORT_IMAGE • 2–13 + 2.2.2.2.5 Transport Services • 2–14 + 2.2.2.2.5.1 IOB Data Formats and Organization • 2–14 + 2.2.2.2.5.2 XIEP_SET_TRANSPORT • 2–15 + 2.2.2.2.5.3 XIEP_PUT_TILE • 2–15 + 2.2.2.2.5.4 XIEP_GET_TILE • 2–16 + 2.2.2.2.5.5 XIEP_PUT_STREAM • 2–16 + 2.2.2.2.5.6 XIEP_GET_STREAM • 2–17 + 2.2.2.2.6 Process Services • 2–18 + 2.2.2.2.6.1 XIE’s Handling of IOB Data Formats • 2–18 + 2.2.2.2.7 Statistics Services • 2–19 + 2.2.2.2.8 Process Control Services - TBS • 2–19 + 2.2.2.2.9 Display Service • 2–19 + 2.2.2.2.9.1 XIEP_DISPLAY_SEQUENCE • 2–19 + 2.2.2.2.10 Event Services • 2–20 + 2.2.2.2.10.1 Event Noti�cation to Client • 2–20 + 2.2.2.2.10.2 XIEP_SELECT_EVENTS • 2–21 + 2.2.2.2.10.3 XIEP_QUERY_EVENTS • 2–21 + +CHAPTER 3 DDX COMPONENT 3–1 + 3.1 PROCEDURE VECTOR TABLE 3–1 + 3.1.1 Lower Level Image Processing Routines 3–4 + 3.2 DIX/DDX INTERFACE 3–4 + +CHAPTER 4 OPERATING SYSTEM CONSIDERATIONS 4–1 + 4.1 MEMORY MANAGEMENT 4–1 + 4.2 LINKING AND LOADING XIE 4–1 + 4.3 HARDWARE CONSIDERATIONS 4–1 + 4.3.1 Hardware Recognition 4–2 + 4.3.2 Multiple Function Request 4–2 + + + + +iv + Contents + + +APPENDIX A XIE PROTOCOL REQUESTS A–1 + +APPENDIX B MODULES AND PROCEDURES B–1 + +APPENDIX C XIE APPLICATION AND WIRE DEFINITIONS AND STRUCTURES C–1 + +APPENDIX D SERVER DEFINITIONS AND STRUCTURES D–1 + +APPENDIX E CORE X STRUCTURES E–1 + +APPENDIX F MACROS F–1 + F.1 CORE X MACROS F–1 + F.2 XIE MACROS F–2 + +APPENDIX G DIX/DDX INTERFACE G–1 + + +FIGURES + 1–1 Client/Server Relationship 1–2 + 1–2 Client/CORE X/Extension Relationship 1–3 + 2–1 DIX Procedures 2–2 + 3–1 DDX Subcomponents 3–2 + + +TABLES + 3–1 DDX Procedure Vector Table 3–2 + A–1 Image Extension Functions A–1 + A–2 Service Classes A–3 + + + + + v + Preface + + + + +Associated Documents + • Image Extension Concepts + + • XIE_Protocol + + + + +vi + Chapter 1 + +Overview + + + This document de�nes the concepts, components, and relationships needed to extend the + CORE X server to accommodate the proposed X Image Extension. + This design speci�cation, which is based on the third release of X, Version 11 from MIT, + addresses the extension’s relationship to the CORE X, its components, its functionality and its + operation. + + + + +1.1 Introduction + + The CORE X window system or X is a network-transparent window system which allows + users to run multiple applications simultaneously in windows, generating text and graphics in + monochrome or color on a bitmap display. CORE X provides facilities for generating multifont + text and two-dimensional graphics (such as points, lines, arcs, and polygons) in a hierarchy of + rectangular windows. + An application program (client) connects to the window system (server) by some interprocess + communication path. A client(s) communicates via calls to the CORE X library called XLIB. + See Figure 1–1. + + + + + Overview 1–1 + Figure 1–1: Client/Server Relationship + + +-----------+ +-----------+ +-----------+ + | CLIENT 1 | | CLIENT 2 | | CLIENT 3 | .... + +-----------+ +-----------+ +-----------+ + ^ ^ ^ + | | | + |<--------------v---------------< + | + v + +-----------+ + | XLIB | + +-----------+ + ^ + | + v + +------------+ + |INTERCONNECT| + +------------+ + ^ + | + v + +-------------+ + |CORE X SERVER| + +-------------+ + + + The CORE X protocol has minimally suf�cient capabilities. There exists a mechanism within + the protocol to allow "extending" the protocol to embrace new functionality. In order for the + CORE X to accommodate image enhancement and rendition, a CORE X image extension (XIE) + was conceived. + + + + +1.2 XIE Organization + + The extension has three major components: an extended protocol interface library (XIE LIB), a + device independent server component (DIX), and a device dependent server component (DDX). + This structure is similar in concept to that of the CORE X. Figure 1–2 represents a block + diagram of XIE’ s components and their relationship to each other and to the CORE X. + + + + +1–2 Overview + Figure 1–2: Client/CORE X/Extension Relationship + + +---------------+ +---------------+ + | CLIENT 1 | | CLIENT 2 | ............. + +---------------+ +---------------+ + ^ ^ + |<------------------------------>| + v v + +---------------+ +---------------+ + | XLIB |<--------------| XIELIB | + +---------------+ +---------------+ + ^ + | + v + +--------------------------------------+ + | TRANSPORT + + +--------------------------------------+ + ^ + | + v + +--------------+ + | CORE X | + | SCHEDULER | + +--------------+ + ^ + | + v + +--------------+ +--------------+ + | DIX CORE X |--------->| DIX/XIE | + | DISPATCHER | | DISPATCHER | + +--------------+ +--------------+ + ^ ^ + | | + v v + +--------------+ +---------------+ + | CORE X DIX |<-------->| DIX/XIE | + +--------------+ +---------------+ + ^ ^ ^ ^ + | | | | + v v v v + +---------+ +---------+ +---------+ +---------+ + |DDX/CORE | |DDX/CORE | | DDX/XIE | | DDX/XIE | + | MACHINE | | MACHINE | | MACHINE | | MACHINE | + | IND. | | DEP. | | IND. | | DEP. | + +---------+ +---------+ +---------+ +---------+ + + + + +1.2.1 XIELIB + This component resides on the client side of the wire and represents the extended protocol + interface library (analogous to XLIB) which is used to pass requests to the server exten- + sion. Since this document represents the server side of the extension, it is stated here for + completeness and because of its relevance to the CORE X protocol. + + + + + Overview 1–3 + 1.2.2 DIX/XIE Component + The functional responsibility of the DIX/XIE component is to: + + o Initialize the extension server. + o Dispatch execution of extension server requests. + o Return extension server events, errors and replies. + o Manage extension server resources. + o Interface with the CORE X services. + o Interface with the server DDX component. + + + + +1.2.3 DDX/XIE Component + The DDX/XIE component consists of two subcomponents: machine independent DDX and + machine dependent DDX. The former represents a software implementation of a DDX function, + independent of hardware platform, while the latter represents a combined software/hardware + implementation speci�c to a speci�c system platform or class of system platforms. + + + +1.2.3.1 DDX/Machine Independent Component + This component includes the software algorithms to perform the various image processing + tasks called upon by the client. This document will address this implementation. + + + +1.2.3.2 DDX/Machine Dependent Component + This component performs all hardware related tasks in performing client requests. Hardware + accelerators such as array processors and other specialized display components can achieve + high ef�ciency in carrying out the various image rendition algorithms. To that end the DDX + component will be called upon to make calls to the drivers of these devices when they exist. + + + +1.2.4 XIE Services + A client XIE request can be classi�ed by its type of service. The following outlines the various + classes. For further details regarding the XIE services and resources, readers should read the + documents referenced in the preface. + + + + +1–4 Overview + 1.2.4.1 Session Services + These services allow clients to initialize and terminate a session with the extension. + + + +1.2.4.2 Resource Services + These services allow clients to create, query, copy, and delete XIE resources. Resources include + the following: + • IOB - Image Objects + • IDC - Image Domain Context + • IPC - Image Process Context + + + + +1.2.4.2.1 IOB + An Image Object (IOB) is a structure which contains the image data and closely associated + attributes within a server. + + + +1.2.4.2.2 IDC + An Image Domain Context (IDC) is a structure which is used for one of three purposes: + • de�ne the subset or region of an image to process + • act as an area operand in area image operations + • both of the above (concurrently) + + + + +1.2.4.2.3 IPC + An Image Process Context (IPC) is a structure which describes the relationship between the + various transfer, enhancement, and rendition processes that make up an image processing + pipeline. + + + +1.2.4.3 Server/Client Image/Export Services + These services allow clients to read/write image data within an XIE server resource from/to + CORE X server resources such as pixmaps. The XIE resource is called an image object (IOB). + + + + + Overview 1–5 + 1.2.4.4 Transport Services + These services allow the transfer of image data to/from client/server. The server keeps images + in server resources called image objects (IOB). + + + +1.2.4.5 Process Services + These services provide for the application of low level image operators to image data primarily + in support of preparation for or improvement of its display. + + + +1.2.4.6 Statistic Services + These services provide clients procedures to generate statistical information about an image. + Such statistics include the mean, variance, standard deviation, maximum and minimum of + data within an area of an image. + + + +1.2.4.7 Process Control Services + These services provide clients the ability to de�ne and apply pipelines containing transport, + process, and display operations. + + + +1.2.4.8 Display Service + This service allows the client to display a sequence of prerendered image frames which are + stored as pixmaps. + + + +1.2.4.9 Event Services + These services allows the client to select or query XIE speci�c events. + + + +1.2.5 Relationship to CORE X + There exist a resource and/or process relationship between XIE and CORE X which depends + on the function the extension is carrying out. CORE X will provide the resource management + of XIE resources as well as access to CORE X resources that XIE might need (such as the + Graphics Context (GC) or drawables). In addition the extension may want to use a CORE X + process rather than duplicating the process within the extension. + + + + +1–6 Overview + 1.2.5.1 CORE X Resources + CORE X provides the extension with resource management for extension and CORE resources. + Key CORE X resources that the extension will have interest in are the Graphics Context and + drawables. + + + +1.2.5.1.1 Graphics Context + The Graphics Context is used when the CORE X performs graphic operations. This resource + consists of information relating to performing such operations: putImage (from a server data + buffer to a CORE X pixmap), line style and so on. + + + +1.2.5.1.2 Drawables + Graphics operations can be performed to either windows or pixmaps which collectively are + called drawables. XIE will use these resources for services such as import/export. + + + +1.2.5.2 Processing Modes + To better delineate which of the aforementioned components are used for a particular client + XIE request, we de�ne several processing modes. Appendix A maps each XIE protocol request + to a service class and processing mode. + + + +1.2.5.2.1 DIX Processing + This mode refers to those requests which do not need processes from the DDX component of + XIE. + + + +1.2.5.2.2 DIX/DDX Processing + This processing mode refers to those requests which rely on the DDX/XIE component to + perform its task. + + + + + Overview 1–7 + Chapter 2 + +DIX/XIE Component + + + + This chapter describes the procedures that make up the DIX/XIE Server Component. All XIE + client requests to some degree use procedures within this component. Figure 2–1 represents + a block diagram of the procedures of the DIX/XIE Component and its relationship to CORE X + and DDX/XIE functional components. + Note: See Appendix B for a list of modules and procedures within the DIX/XIE Component. + + + + + DIX/XIE Component 2–1 + Figure 2–1: DIX Procedures + + INITIALIZATION XIE REQUEST PROCESSING + -------------- ---------------------- + +----------------+ +----------------+ + | SERVER | | CORE X | + | INITIALIZATION | | TRANSPORT | + +----------------+ +----------------+ + ^ ^ + | | + v v + +----------------+ +----------------+ + | CORE X | | CORE X | + | INITIALIZATION | | DISPATCHER | + +----------------+ +----------------+ + ^ ^ + +-----------------|----------------------|---------------------+ + | v v | + | +----------------+ +----------------+ | + | | XieInit | | XieDispatcher |<---+ | + | +----------------+ +----------------+ | | + | ^ ^ | | + | | | | | + | v v | DIX/XIE + | +----------------+ +----------------+ | | + | | XieDeviceInit | | DIX Request | | | + | +----------------+ | Procedures | | | + | ^ +----------------+ | | + | | ^ | | + +-----------------|----------------------|-------------|-------+ + | v | + | +----------------+ | + -------------->| DDX LAYER |<---+ + +----------------+ + + + + +2–2 DIX/XIE Component + 2.1 Initialization Procedures + + Upon server initialization, the CORE X initializes all extensions by calling a CORE X proce- + dure - InitExtensions. This procedure calls the initialization procedure of all extensions the + CORE X will support. An addition will be made to InitExtension to call the XIE initialization + routine. In this implementation, this procedure is referred to as XieInit. + Note: InitExtension and all XIE components will be linked with the CORE X in an OS + dependent manner (see Chapter 4). + + + +2.1.1 XieInit + This procedure will be called when CORE X initializes or resets itself. XieInit will de�ne the + XIE extension to the CORE X and will perform all extension resource and device initialization. + + + +2.1.1.1 Making XIE Known to the CORE X + XIE must make the extension known to the CORE X so that XIE will be able to co-exist with + other extensions. This is done by a call to a CORE X routine - AddExtension (EXTENSION.C): + + AddExtension (Name,NumEvents,NumErrors,MainProc,SwappedMainProc,ResetProc) + This routine returns a pointer to a CORE X structure ExtensionEntry (see Appendix E) + which de�nes extension parameters, including its base opcode (used by SendErrorToClient + - see Section 2.2.1.1), base and last error codes and event codes. It should be noted that + this structure also contains a private pointer which, in the future, XIE can use for its own + purposes. + Name is a string indicating the name of the extension ("xImageExtension"). + NumEvents is the number of events de�ned by XIE. (3) + NumErrors is the number of errors de�ned by XIE. (0) + MainProc speci�es where the CORE X dispatcher will call when it sees an XIE request. For + this implementation this will be named XieDispatcher. XieDispatcher is called with a pointer + to the client structure (from the server transport). See Appendix E. + SwappedMainProc is called in place of MainProc if the client’s byte ordering is different from + the server. This routine must rearrange the bytes in place and then act like MainProc. (The + CORE X modules SWAPREP.C, MISC.H, DIXUTILS.C contain useful macros and procedures + for swapping). For this implementation this procedure will be called SwapXieDispatcher. This + routine is called with a pointer to the client structure (from the server transport). + + + + + DIX/XIE Component 2–3 + ResetProc is called when the server closes down (has no more clients). The purpose of reset + is to return the server to the state it was in when it started up. After reset, the extension is + no longer de�ned. For this implementation this procedure will be named XieReset. Speci�c + functionality is to be determined later, however it is envisioned that for this implementation + this routine may just return. For hardware related implementations, this routine will provide + a mechanism in getting the hardware to an idle state. + + + +2.1.1.2 De�ning Errors and Events + XieInit must also de�ne the XIE error and event codes using the errorBase and eventBase + �elds, respectively, within the ExtensionEntry structure. This is done by adding the XIE error + and event constants (see Appendix C) to the extension error and event base, respectively. + For the events XIE de�nes, this module must load the CORE X vector table EventSwapVector[ ] + with the XIE procedure to swap the event data. See Section 2.2.2.2.10.1 for a discussion on + XIE events. + In addition, XieInit will de�ne a mask for each XIE event (see Section 2.2.2.2.10.1). + The following are the event codes XIE will use: + • XIE_COMPUTATION_COMPLETE + • XIE_NEW_FRAME + • XIE_SEQUENCE_COMPLETE + + Currently there are no XIE server error codes. All errors that the extension can generate will + use an appropriate CORE X error code. + + + +2.1.1.3 De�ning XIE Resource Class and Types + XieInit must also de�ne an XIE resource class and all the XIE resource types. To create + an XIE resource class, XIE will use the CORE X procedure - CreateNewResourceClass + (RESOURCE.C) + CreateNewResourceClass returns a new class (int) for use in creating new resources. This + class will be referred to as RC_Xie.The format of the call is: + + CreateNewResourceClass( ) + To de�ne XIE resource types, XIE will call the CORE X procedure - CreateNewResourceType + (RESOURCE.C). + CreateNewResourceType returns a new resource type (int) which is also used in other resource + routines. Each XIE resource (IOBs, IDCs etc.) will be associated with a type - RT_Iob, RT_Idc + etc.. + The format of this call is: + + CreateNewResourceType ( ) + + + +2–4 DIX/XIE Component + See Section 2.2.2.2.3 for a description on the use of XIE resources. + + + +2.1.2 XieDeviceInit + This procedure will initialize any hardware or accelerators the extension may use by calling + the routine Init_xxx where xxx is the symbol for the particular accelerator. The mechanism to + perform this is addressed in Chapter 4. + In addition, XieDeviceInit must load entries into the XIE/DDX procedure vector table for + those functions which bene�t from accelerators. As an example, if there is an accelerator + which performs scale, XieDeviceInit must load the DDX scale entry with the entry to the DDX + routine which takes the same arguments as the machine independent version and uses the + accelerator to perform the scale. The mechanism to do this will be similar to the above. + + + + + DIX/XIE Component 2–5 + 2.2 DIX/XIE Request Processing + + The DIX/XIE request procedures include the XIE dispatcher and a DIX procedure for each XIE + protocol request. The latter is broken into two processing phases: Phase I and II. + + + +2.2.1 XieDispatcher + XieDispatcher is called by CORE X when its dispatcher recognizes that the client’s request is + an XIE request. XieDispatcher’s responsibilities are to: + + o Determine which function was requested + o Swap the function request if necessary + o Vector to the appropriate DIX Phase I processing procedure + CORE X calls XieDispatcher with a pointer to the client structure (see Appendix E). This + structure represents the context of the client request and is used by the CORE X for its + wire transport. This structure is used for any subsequent communication to the client and + thus must be passed along to lower levels if the lower levels are to communicate with the + client (macros and routines such as SendErrorToClient, WRITE_REPLY_TO_CLIENT and + WriteToClient use a pointer to this structure as one of its arguments). + XieDispatcher’s �rst job is to determine the XIE function requested. This is accomplished by + using a CORE X macro - REQUEST (see Section F.1). REQUEST is called with a structure + xieReq that exists in a XIE include �le XIEPROTO.H. This structure represents the header of + all XIE requests. See Appendix C for a list of this and other request structures. + The REQUEST macro de�nes a record called "stuff" which is of type xieReq, and which + is bound to the request buffer. XieDispatcher initiates the appropriate DIX/XIE Request + Processing function by case switching on the opcode represented in stuff->data. This + represents the XIE request code. (Note: For XIE de�ned structures this �eld is repre- + sented by stuff->opcode.) If XieDispatcher does not recognize the requested opcode, then + a call to SendErrorToClient is made with a CORE X error code - BadRequest and a "re- + turn(BadRequest)" is made. + XieDispatcher returns success or failure to the CORE X. It is expected that any errors gener- + ated by lower level routines will use SendErrorToClient and return the error code back to the + dispatcher so that it can, in turn, return the error code back to CORE X. + + + + +2–6 DIX/XIE Component + 2.2.1.1 Error Noti�cation to Client + If an error is detected anytime during the dispatcher or the DIX processing phases, XIE must + notify the client via a CORE X routine, SendErrorToClient (EXTENSION.C), and make a + "return(errorcode)" back to the XIE dispatcher. + NOTE: When we state that the error must be reported, it is implied that a SendErrorToClient + and a "return (errorcode)" is made. + SendErrorToClient routine has the following format: + + SendErrorToClient (client,reqCode,minorCode,ResourceID,errorcode) + + Client is the client structure passed to the extension with the request; reqCode is the base �eld + of the ExtensionEntry structure returned by AddExtension performed during initialization in + the XieInit component; minorCode is the extension request opcode (stuff->opcode); errorcode is + one of the error codes assigned to the calling extension or a CORE X error; and resourceID is + a parameter that the extension may use to return a resourceID that is involved in the error. If + none is involved, the routine should pass NONE de�ned in the CORE X include �le - X.h. + + + +2.2.1.2 Swapping Requests + If the byte order on the server is different than the client, the CORE X, upon seeing an + XIE request, will call SwapXieDispatcher. This routine will be responsible for swapping the + request (in place) and then performing the same tasks as XieDispatcher. To ease the swapping + task, several requests have pads within their request structure. This is to prevent having a + word in the middle of a longword. + + + + + DIX/XIE Component 2–7 + 2.2.2 DIX Request Procedures + There exist two phases of DIX request processing. The �rst phase does the request length + checking while the second phase manages the XIE resources, checks for valid arguments, and + prepares data for DDX processing. + + + +2.2.2.1 Processing of Requests - Phase I + Phase I request processing entails checking the request length. This is facilitated by the use + of the following CORE X macros (see Section F.1): + + o REQUEST + o REQUEST_SIZE_MATCH + o REQUEST_AT_LEAST_SIZE + + REQUEST is called with the structure of the particular request. This implies that a structure + exist for each of the XIE protocol requests (see Appendix C). Calling this macro allows the + extension to verify the length of the request via another CORE X macro: REQUEST_SIZE_ + MATCH. This macro makes sure that the request in "stuff" is the right size for this particular + request. It will return BadLength (back to CORE X) if the size is incorrect. + REQUEST_AT_LEAST_SIZE is the same as REQUEST_SIZE_MATCH except it is used for + variable length requests. It checks to make sure that the request is no shorter than the + minimum size. It returns BadLength if the size is invalid. See next section. + If no errors exist during request matching, then this component will initiate the second phase + of DIX request processing. See Section 2.2.2.2. + + + +2.2.2.1.1 Variable Length Requests + REQUEST_AT_LEAST_SIZE is used by requests such as XIEP_PUT_TILE which will have + a variable length request size due to the tile dimensions. In this case the �rst phase of DIX + processing checks the minimum size allowed and passes the responsibility of absolute length + checking to the second phase of DIX request processing. The second phase will then read + the request length and the dimension arguments and verify that they agree. If not, then a + "BadLength" error is reported. Return is back to the �rst phase which, in turn, will return + back to the XIE dispatcher. + + + + +2–8 DIX/XIE Component + 2.2.2.2 Processing of Requests - Phase II + Depending on the request, the Phase II processing logic may be inline with the Phase I + processing code (the length check code) or may initiate calls to subroutines. For the latter case, + the procedures may reside in module XIE_UTILS.C (see Appendix B). For simple requests, + such as resource create, they can be inline with the Phase I code, while for more complex calls + it may be better to have a separate subroutine. This phase is responsible for the following + functions: + + o Organization and sending of client replies. + o Establishment of context for an XIE client/server session. + o Resource creation, validation, deletion , modi�cation and inquisition. + o Preparation of services, data and/or resources for input into the CORE X or the DDX + layer. + o Organization and sending of events. + For DIX/DDX related tasks this phase may represent a functional subset of high level routines + which interface to an image processing library. Such routines may in turn call a set of lower + level image processing algorithms within the DDX layer. + Depending on the request, this phase of processing may not need procedures from the DDX + component. In this case we say that the processing mode for this request is a DIX only type of + process. If DIX/XIE calls procedures in the DDX component we say that the processing mode + of the request is a DIX/DDX type of process. + + + +2.2.2.2.1 XIE Replies + There exist several XIE requests which will generate replies to the client. The XIE macro - + WRITE_REPLY_TO_CLIENT (see Section F.2) is used to send replies back to the requesting + client. The format of the macro is: + + WRITE_REPLY_TO_CLIENT (client, length, buf) + + Client is the client structure; length is the length of the reply in bytes; and buf contains the + reply. This macro will call the reply swap routine for this request (based on the request opcode + represented by stuff->opcode) using XieReplySwapVector table if swapping is necessary (i.e. if + client->swapped = = TRUE). + XieReplySwapVector table consists of addresses of procedures which swap replies. For each + request, there is a location within this table. Each entry/request in this table will either have + a "NotImplemented" procedure which will return an error (indicating that the request has no + replies) or an address of the reply swap procedure. + The format of the reply must match the protocol and is 32 bytes long. Each XIE request + that generates a reply will have a corresponding structure, so length will be speci�ed by + sizeof(xReplyForThisRequest). See Appendix C. + There are several replies which have pads within their reply structure. This is to prevent + having a word in the middle of a longword thus making the swapping tasks easier. + + + + + DIX/XIE Component 2–9 + For replies of length greater than 32 bytes, XIE, in addition to calls to WRITE_REPLY_ + TO_CLIENT, will call the CORE X routine - WriteToClient (see Section 2.2.2.2.5.4). XIE is + responsible for byte swapping in the latter case. To accomplish this, XIE must �rst load the + client structure �eld, client->pSwapReplyFunc, with the address of a function that swaps and + writes to the client (via WriteToClient) and then use the XIE macro - WRITE_SWAPPED_ + DATA_TO_CLIENT: + + WRITE_SWAPPED_DATA_TO_CLIENT (client, length, pBuf) + Client is the client structure, length is the length in longwords, and pBuf is a pointer to the + reply. This macro will check the client structure �eld, client->swapped, for true, and if so will + call the function speci�ed by client->pSwapReplyFunc else it will just write to the client via + WriteToClient (see Section F.2). + Note: There exists swap utilities within CORE X and is expected that XIE will use these + utilities. These reside in the CORE X modules SWAPREQ, SWAPREP.C, and others. + + + +2.2.2.2.2 Session Services + This service establishes the bounds and semantics of the server/client XIE session. + + + +2.2.2.2.2.1 XIEP_INIT_SESSION + The function of this request is for the client to determine if XIE is available, and if so, return + information (via a reply) describing the extension and its functions back to the client. This + function will enter the client ID and other client speci�c data into a static XIE table (client_ + table). See Appendix D. The quantization context pointer and the event mask are examples of + the client speci�c data necessary for XIE to maintain. For the former, memory for the quantize + structure will be allocated. + + + +2.2.2.2.2.2 XIEP_TERM_SESSION + This request will release the memory resources used by the requesting client and established + at XIEP_INIT_SESSION. This involves deleting the client’s entry from the client_table and + deallocating the memory used by any of it entries. + Note: Other XIE resources which use the CORE X facility will be terminated upon the client + closing the connection. + + + + +2–10 DIX/XIE Component + 2.2.2.2.3 Resource Services + The DIX component is responsible for creating, validating, deleting, and querying XIE + resources. These services require use of the CORE X resource management facility + (RESOURCE.C). + + + +2.2.2.2.3.1 Creating XIE Resources + Before XIE can create a resource, it must determine if the ID of the resource received from the + client (via XIELIB) is a legal ID. This is accomplished by doing the following: + + o Verifying that the ID is not previously de�ned via LookupId ( see Section 2.2.2.2.3.2) + o Making sure that the ID "and" CORE X parameter SERVER_BIT is FALSE + o Making sure the client structure �eld "clientAsMask" equals the upper 12 bits of the ID. + The XIE macro LEGAL_NEW_XIE_RESOURCE (see Section F.2) does the above: + + LEGAL_NEW_XIE_RESOURCE (id, rType) + The id is the resource id and rType is the resource type (RT_Iob, RT_Idc etc.). + The CORE X procedure, AddResource, allows extensions to add a new resource class-value + pair into the CORE X resource management given a resource ID (provided by client), class + type (created by XieInit), and value (pointer to the just allocated resource). + For example, in creating an IOB, the client passes a resource ID, and the IOB resource data. + XIE �rst checks to see if its a legal ID, then allocates memory for the IOB and passes the + memory pointer (value) to AddResource. Now if the client some time later wishes to query this + IOB, XIE will use the client passed ID as a handle to accessing the IOB data by using a CORE + X routine LookupID (see Section 2.2.2.2.3.2) which returns the pointer. + AddResource will create the resource if it does not exist. The following represents the call to + AddResource: + + AddResource (ID, Type, Value, Func, RC_Xie) + Func represents the procedure to call when the resource is freed (see Section 2.2.2.2.3.3) + and is called with the address of the resource data. There will be a delete procedure, which + will de-allocate the memory used by the resource, for each XIE resource. Entries to these + procedures will be DestroyIob, DestroyIdc etc.. These will reside in the XIE_UTILS.C module + (see Appendix B. + Adding the resource will allow XIE to establish the location of XIE data from the resource ID + (see next section). + + + + + DIX/XIE Component 2–11 + 2.2.2.2.3.2 Validating XIE Resources + The validation of XIE resources is done via a call to the CORE X procedure LookupID (in + RESOURCE.C): + + LookupID (ID, rType, RC_Xie) + Where rType is the resource type (RT_iob, RT_idc, RT_ipc) and RC_Xie is the XIE resource + class. Both are de�ned in XieInit. + LookupId will return a pointer (value) if it is valid otherwise it returns a NULL. All extension + requests having a resource ID will use LookupID as a validity check. If a Null is returned + then a BadIDChoice error will be reported to the client. + Note: All requests which have an XIE resource ID will be validated during the processing + phase of request processing. + + + +2.2.2.2.3.3 Freeing XIE Resources + To free a resource, XIE must call FreeResource (ID,SkipDeleteCallClass). SkipDeleteCallClass + indicates those classes the caller wishes not to free. For XIE related resources this will mean + a value (not RC_Xie) where RC_Xie represents the class of XIE resources. This routine will + call the delete function speci�ed by "func" in the AddResource call. + + + +2.2.2.2.3.4 Querying XIE Resources + Querying a resource requires that the resource be owned by the client requesting the resource + information. Therefore, a validity check must be done before the attributes within the resource + are read and reported back to the client. (See Section 2.2.2.2.3.2). + + + +2.2.2.2.4 Import/Export Services + These tasks allow an image to be moved between a CORE drawable (pixmap or window) and + an IOB. They depend on some procedures (GetImage and PutImage for example) from the + CORE X in order to accomplish their task. + + + +2.2.2.2.4.1 XIEP_IMPORT_IMAGE + This request will take image data from a pixmap or window and copy it to an IOB. The IOB + must be valid or a BadIDChoice error will be reported (see Section 2.2.2.2.3.2). Functionally + this request will do what the CORE X GetImage procedure does (calls CORE X routines + GetImage and WriteToClient) without sending the data to the client. GetImage is called + through the drawable (*pdraw->pScreen->GetImage) and transfers data within the drawable + to a buffer. The buffer represents the image data. Depending on the current state of the IOB, + DIX may have to allocate a larger or smaller buffer than is currently allocated for this IOB. In + + + +2–12 DIX/XIE Component + addition, new IOB attributes are derived from the drawable speci�ed within the client request. + The format of GetImage is: + + GetImage (pDraw, x, y, width, height, format, planemask, pBuf) + The arguments, with the exception of pDraw and pBuf, are derived from the drawable. pDraw + and pBuf are the drawable passed by the client and the IOB data pointer, respectively. + The speci�ed drawable must be valid or a BadDrawable error will be reported. To validate the + drawable, XIE will use the CORE X macro LOOKUP_DRAWABLE: + + + + pDraw = LOOKUP_DRAWABLE (drawable_id, client) + + The drawable_id is the drawable ID; client is the client structure, and pDraw is a pointer to a + drawable type. If pDraw is a NULL then the drawable is not valid and a BadDrawable must + be reported. If the drawable is an input only drawable, a BadMatch error will be reported. + (see Section F.1) + + + +2.2.2.2.4.2 XIEP_EXPORT_IMAGE + This request transfers image data and its attributes from an existing IOB into a drawable. + The IOB must be valid or a BadId error will be reported (see Section 2.2.2.2.3.2). The pixmap + must be a valid drawable or a BadDrawable error will be reported. Similarly, the graphics + context (also within this request protocol) must also be valid or a BadGc error will be reported. + To validate a drawable and a GC, XIE will use a CORE X macro VALIDATE_DRAWABLE_ + AND_GC: + + VALIDATE_DRAWABLE_AND_GC (dst_drawable_id, pDraw, pGC, client) + dst_drawable_id is the pixmap drawable Id (from the client); pDraw is a pointer to a drawable + type (returned); pGC is a pointer to the GC (returned); and client is the client structure. + This macro will return a BadDrawable, BadGc or BadMatch error if input is not valid (see + Section F.1) + This procedure will use the Graphics Context, which the client must pass, and make calls + through the GC to PutImage (pGc->PutImage). PutImage has the following format: + + PutImage (pDraw, pGc, depth, dstX, dstY, width, height, left_pad, format, IOB_Image_ + Data) + All arguments, with the exception of left_pad, format, and IOB_Image_Data, are within the + request block as stated in the XIE Protocol. The left_pad, format, and IOB_Image_Data + arguments are inferred from the speci�ed IOB. + + + + + DIX/XIE Component 2–13 + 2.2.2.2.5 Transport Services + These services allow the client to transfer image data between the client and server. Once the + client has established the transport context, clients can then move images to/from IOBs. + + + + +2.2.2.2.5.1 IOB Data Formats and Organization + The DIX will have the following IOB image data types (see Appendix D): + + o XieK_Bitstream + o XieK_ByteImage + o XieK_WordImage + o XieK_LongImage + o XieK_FloatImage + XieK_Bitstream represents a packed image where each pixel is one bit long. There will be no + padding allowed either between pixels or scanlines. The start of the image data will always be + byte aligned. + XieK_xxxImage represents image data in either 8,16 or 32 bit pixels with no padding pixels + allowed between pixels or between scanlines. The start of the image data will always be byte + aligned. + XieK_FloatImage represents image data using the server’s machine representation of single + precision floating point. + This implies that Transport Services must reorganize and reformat the data when data is + transferred over the wire. For example, when the client transfers an image (to the server) + which includes pixel and/or scanline strides, the DIX will be responsible in "weeding" out the + data which will not be used in any subsequent rendering or DDX operation. In addition, the + DIX/XIE must choose the integer type large enough to support the incoming data. Similarly, + when the transfer is from the server to the client, the DIX will be responsible for packing if + dictated by the transport context. + To accomplish this reformatting, the DIX may depend on DDX functions which will facilitate + the processing of data from one organization to another. + The server will use the IOB attribute list to keep track of the various formats. See + Section 2.2.2.2.6.1 for more on IOB data formats. + For multispectral image data, DIX/XIE must reorganize the data to ease subsequent process- + ing. Thus when transferring multispectral images from the client, DIX/XIE will un-bundle the + data into the speci�ed IOB (parent IOB) and n-1 data entities (child IOBs) of data format byte, + word or long, where n represents the number of spectral components. The parent IOB will + have pointers to the child IOBs whose meaning is inferred by the spectral type (of the parent + IOB). Thus clients can still access multispectral IOBs via the IOB id of the parent. + + + + +2–14 DIX/XIE Component + As an example, if client sends an RGB image of 3,3,2 bits, respectivily, DIX/XIE will use the + destination IOB speci�ed by the client as the red component of data type XieK_ByteImage + and will create two "child IOBs" to represent the two components green and blue of data + type XieK_ByteImage. Thus when the client wishes to scale this RGB image, DIX/XIE will + recognize that this is a multispectral image and will initiate the DDX scale algorithm for + each component - parent and children. This will allow DDX writers not to be concern with + "dif�cult" data formats. + + + +2.2.2.2.5.2 XIEP_SET_TRANSPORT + This request will establish the required context necessary to support image data wire trans- + port operations (either direction). The context includes information about the data organiza- + tion, compression scheme, and component information of the image as it exists on the client + side. The DIX responsibility is to read the information within the request and attach it to the + speci�ed IOB. + The IOB �eld, structure XieTransport, will contain the information describing the data orga- + nization of the client image (see Appendix D). Thus, subsequent wire transporting of the data + to/from an IOB will be fully described by the IOB �elds. + + + +2.2.2.2.5.3 XIEP_PUT_TILE + This request allows the client to randomly transfer client image data to an IOB via tiles. Prior + to calling this request the client must have previously called XIEP_SET_TRANSPORT and + must have allocated an IOB. This function will copy the data from the protocol request buffer + to an allocated buffer within the IOB. Granularity, formats, size and location of the tiles etc. + are provided by the arguments within the request and by the speci�ed IOB �elds. + The DIX responsibility is to: + + + • check that the IOB is valid using the IOB id passed by the client (see Section 2.2.2.2.3.2) + and if not report a BadIDChoice error. + • check that the IOB is constrained and if not, report a BadMatch error. + • check that the transport �eld within the IOB has been previously de�ned (i.e. not NULL) + and if not, report a BadAccess error. + • check that the component organization as speci�ed in the IOB is consistent with that + within the transport �elds and if not, report a BadMatch error. + • set the IOB transport �eld to NULL on the last transfer. + + In addition, the DIX will be responsible for changing the data format and organization from + that speci�ed in the IOB’s XieTransport �eld to one of the DIX supported image constructs. + NOTE: If byte swapping is necessary (i.e client->swapped = = TRUE), then the swapping must + be done before reading from the client and storing to the speci�ed IOB. + + + + + DIX/XIE Component 2–15 + 2.2.2.2.5.4 XIEP_GET_TILE + This request allows the client to randomly transfer IOB image data to a client buffer via tiles. + Prior to calling this request the client must have previously called XIEP_SET_TRANSPORT + and must have allocated an IOB. This function will send data to the client via a CORE X + procedure WriteToClient: + + WriteToClient (client, numBytes, pbytes) + Client is the client structure passed to XIE, numBytes are the numBytes passed to client, and + pbytes is pointer to the bytes to pass. + Granularity, formats, size and location of the tiles etc. are provided by the arguments within + the request and by the speci�ed IOB �elds. + The DIX responsibility is to: + + + • check that the IOB is valid using the IOB id passed by the client (see Section 2.2.2.2.3.2) + and if not report a BadIDChoice error. + • check that the IOB is constrained and if not report a BadMatch error. + • check that the transport �eld within the IOB has been previously de�ned (i.e. not NULL) + and if not, report a BadAccess error. + • check that the component organization as speci�ed in the IOB is consistent with that + within the transport �elds and if not, report a BadMatch error. + • set the IOB transport �eld to NULL on the last transfer. + + In addition, the DIX will be responsible for changing the data format and organization to that + speci�ed in the IOB’s XieTransport �eld from one of the DIX supported image constructs. + NOTE: If byte swapping is necessary (i.e client->swapped = = TRUE), then the swapping must + be done before sending data to the client. + + + +2.2.2.2.5.5 XIEP_PUT_STREAM + This request allows the client to sequentially transfer client image data to an IOB. This + protocol request may be used for both uncompressed and compressed image data. Prior to + calling this request the client must have previously called XIEP_SET_TRANSPORT and must + have allocated an IOB. This function will copy the data from the protocol request buffer to + an allocated buffer within the IOB. Granularity, formats, etc. are provided by the arguments + within the request and by the speci�ed IOB �elds. + The DIX responsibility is to: + + + • check that the IOB is unconstrained and if not report a BadMatch error. + • check that the IOB is valid using the IOB id passed by the client (see Section 2.2.2.2.3.2) + and if not report a BadIDChoice error. + + + + +2–16 DIX/XIE Component + • check that the transport �eld within the IOB has been previously de�ned (i.e. not NULL) + and if not, report a BadAccess error. + • check that the component organization as speci�ed in the IOB is consistent with that + within the transport �elds and if not, report a BadMatch error. + • set the IOB transport �eld to NULL on the last transfer. + • keep track of the offset into the IOB data area by using the "data_offset" �eld within + the IOB (see Appendix D). This offset will be a bit offset when the IOB is of type XieK_ + Bitstream and a pixel offset otherwise. + + In addition, the DIX will be responsible for changing the data format and organization from + that speci�ed in the IOB’s XieTransport �eld to one of the DIX supported image constructs. + This may also entail decompressing the data; in this case the DIX will call the DDX function + to perform the decompression. + NOTE: If byte swapping is necessary (i.e client->swapped = = TRUE), then the swapping must + be done before reading from the client and storing to the speci�ed IOB. + + + +2.2.2.2.5.6 XIEP_GET_STREAM + This request allows the client to sequentially receive server image data. This protocol request + may be used for both uncompressed and compressed image data. Prior to calling this request + the client must have previously called XIEP_SET_TRANSPORT. This function will send data + to the client via a CORE X procedure WriteToClient (see Section 2.2.2.2.5.4). + Granularity, formats, etc. are provided by the arguments within the request and by the + speci�ed IOB �elds. + The DIX responsibility is to: + + + • check that the IOB is unconstrained and if not report a BadMatch error. + • check that the IOB is valid using the IOB id passed by the client (see Section 2.2.2.2.3.2) + and if not report a BadIDChoice error. + • check that the transport �eld within the IOB has been previously de�ned (i.e. not NULL) + and if not, report a BadAccess error. + • check that the component organization as speci�ed in the IOB is consistent with that + within the transport �elds and if not, report a BadMatch error. + • set the reply’s �nal �eld to TRUE on the last transfer. + • set the IOB transport �eld to NULL on the last transfer. + • keep track of the offset into the IOB data area by using the "data_offset" �eld within the + IOB (see Appendix D). The units of this offset will be dictated by the data type �eld (bit + offset, byte offset, etc.). + + In addition, the DIX will be responsible for changing the data format and organization to + that speci�ed in the IOB’s XieTransport �eld from one of the DIX supported image constructs. + This may also entail compressing the data; in this case the DIX will call the DDX function to + perform the compression. + + + + DIX/XIE Component 2–17 + NOTE: If byte swapping is necessary (i.e client->swapped = = TRUE), then the swapping must + be done before sending data to the client. + + + +2.2.2.2.6 Process Services + For these services, DIX will perform argument checking and if in error, report the appropriate + error code. Also the DIX will check all the resources speci�ed by the client as being valid (see + Section 2.2.2.2.3.2) and if no errors exist, vector through the DDX component to perform the + desired function. If the resource is in error, an appropriate invalid resource error is reported. + For those operations which require additional requirements on the client speci�ed resources, + the DIX will check that these resources are valid for the particular process and if not, report a + BadMatch error. + If the client requested noti�cation, the DIX will send an XIE_COMPUTATION_COMPLETE + event upon the completion of the requested function (see Section 2.2.2.2.10.1). + One of the major tasks of the DIX for this request class is to prepare data to operate within + the semantics of a DDX computation. + + + +2.2.2.2.6.1 XIE’s Handling of IOB Data Formats + Each process request will have a control flag indicating whether the operation should be + "constrained" or "unconstrained". The latter implies that precision in the computation be + maintained. For example, when adding two image objects, DIX/XIE will create a destination + IOB whose format will either be integer (if the two IOBs pixel depth indicate that the result + can �t into an integer format - 8,16, or 32 bits) or a float (if 32 bit integer representation + cannot guarantee precision). The DIX responsibility is to determine this before initiating the + DDX process. (The DDX process will read the format �eld within the speci�ed IOB(s) and + will operate accordingly.) Thus for some operations, DIX will be responsible for changing the + allocation of an existing IOB’s data to that of another type. Whenever possible, the DIX will + call upon the DDX to compute using integer formats for ef�ciency reasons. + For cases when the DIX does not know the possible outcome, it will take the conservative + approach (float) for the computation to assure precision. + For client requested "constrained" operations, the DIX function will generate positive in- + tegral data by quantizing before returning to caller. For example on subtraction, the DDX + function could generate negative results but the DIX will force integral positive based on the + quantization context and the DDX quantize function. + In addition, DIX must also call the quantize DDX function whenever it needs to constrain the + data for operations which require such data (mask, bit oring etc.). The quantize context will + dictate what method it will use to do this. See Appendix G for a breakdown on the DIX and + DDX responsibilities for each of the DDX functions. + + + + +2–18 DIX/XIE Component + 2.2.2.2.7 Statistics Services + These services allow the client to obtain statistics on an IOB. The DIX will check all the + resources speci�ed by the client as being valid (see Section 2.2.2.2.3.2) and if no errors exist, + vector through the DDX component to perform the desired function. If the resource is in error, + an appropriate invalid resource error is reported. + In addition, the DIX is responsible for checking the arguments for validity and if in error, + reporting a BadValue or BadMatch error. If no errors exist, the DIX will call the appropriate + DDX function and then return the statistical results in the form of a reply to the client (see + Appendix C). + One of the major tasks for the DIX for this request class is to prepare data to operate within + the semantics of a DDX computation. See Section 2.2.2.2.6.1 for information on the way DIX + handles image data. + For the XIEP_AREA_STAT request if the client requested noti�cation, the DIX will send an + XIE_COMPUTATION_COMPLETE event upon the completion of the requested function (see + Section 2.2.2.2.10.1). + + + +2.2.2.2.8 Process Control Services - TBS + + + + +2.2.2.2.9 Display Service + This service allows the client to display a sequence of prerendered image frames which are + stored as pixmaps. The XIEP_DISPLAY_SEQUENCE request is used to do this. + + + +2.2.2.2.9.1 XIEP_DISPLAY_SEQUENCE + The processing of this request requires use of the CORE X procedure CopyArea which copies + one drawable to another. Before XIE can initiate CopyArea it must: + + - validate the client’s destination drawable and GC + - validate the client’s source drawable. + - check to see that the parameters of the source and destination drawable match. + + To validate the drawable and GC, XIE will use the macro VALIDATE_DRAWABLE_AND_ GC + (see XIEP_EXPORT_IMAGE above). + To validate the source drawable, XIE will use the CORE X macro LOOKUP_DRAWABLE (see + Section 2.2.2.2.4.1). + Argument checking is done by assuring that pSrc->pScreen (pSrc is a pointer to the source + drawable) equals pDst->pScreen (pDst is a pointer to the destination drawable) and that + pSrc->depth equals pDst->depth, otherwise a BadMatch must be reported. + + + + DIX/XIE Component 2–19 + The format of the CopyArea procedure is: + + CopyArea (pSrc, pDst, pGc, src_x, src_y, width, height, dst_x, dst_y) + + The arguments src_x, src_y, width, height, dst_x and dst_y are inferred by the IDC during + some preprocess and the other arguments are as de�ned above. + + + +2.2.2.2.10 Event Services + Events are situations or occurrences which are detectable by XIE and are of interest to the + client. + + + +2.2.2.2.10.1 Event Noti�cation to Client + There are three events de�ned in XIE. The CORE X routine, WriteEventsToClient, allows XIE + to send events to interesting clients: + + WriteEventsToClient (client, count, events) + Client is the client structure, count is the number of events to send (usually one), and events is + a pointer to the particular event structure (see Appendix D). XIE will load the event structure + with the pertinent data before invoking WriteEventsToClient. + If swapping is necessary, this routine will call EventSwapVector[code] for the particular event + code (de�ned during XieInit). Therefore XIE must tell the CORE X about the routine which + does the swapping for each event that XIE de�nes. This is done during the XieInit phase by + setting the CORE X array entry EventSwapVector[code] to the XIE procedure that swaps that + particular event code. This procedure is called with three arguments: client structure, the + count (as stated above) and a pointer to the event(s). Each event swapping routine will have + an entry name of the form SwapXxxEvent. + Only events that the client has expressed interest in will be sent. This is accomplished be + using the client_table entry �eld - eventMask (see Appendix D). The DIX will use the client ID + to �nd the client_table entry which will point to the eventMask for this client. + The event mask as de�ned by the protocol (client) will be stored within this table and will be + used to indicate whether the client wishes for a particular event to be sent (see Appendix C). + This mask is set by XIEP_SELECT_EVENTS. + + + + +2–20 DIX/XIE Component + 2.2.2.2.10.2 XIEP_SELECT_EVENTS + Several XIE requests can generate events, however, an event will be sent to the client if and + only if the client has expressed interest in the event. Thus any request which can potentially + send an event will read the event mask from the client_table entry �eld to determine if + it should send the event. The client is able to set this mask via a call to XIEP_SELECT_ + EVENTS. + The XIEP_SELECT_EVENTS request will load the client passed event mask into the client_ + table entry �eld - eventMask. + + + +2.2.2.2.10.3 XIEP_QUERY_EVENTS + This request is for clients to determine which events it has expressed interest in being noti�ed + of. This request will return the event mask resident in the client_table back to the requesting + client. + + + + + DIX/XIE Component 2–21 + Chapter 3 + +DDX Component + + + + This component represents the device dependent component of the extension. + For this implementation, entries into this subcomponent will comprise of a subset of lower + level image processing routines which will be called from either the DIX Request procedures or + from procedures within XIE_UTILS.C. Entry to DDX procedures is made via a table of entries + called the procedure vector table. + Although this document does not address the machine dependent design, it should be stated + that it is at this level where hardware related tasks get executed. That is, the procedure + vectors will either be the entries to the lower level image processing routines and/or hardware + routines to perform the various tasks. This implies that at server/extension initialization time, + the extension must recognize the fact that it may have hardware resources, and if so, load the + appropriate procedure vector. Since such routines must have knowledge about the particular + device used, these reside within the DDX component and are said to be machine dependent. + Note: For severe hardware related errors, this level must set a client structure �eld, client- + >noClientException, to the errorcode. This will cause the CORE X scheduler to shutdown the + client connection. + + + + +3.1 Procedure Vector Table + + The procedure vector table consists of entries to two classes of XIE functions: low level math + tools (e.g. add, sub etc.) and higher level functions such as decompression, scaling, image + rotation etc.. Each of these procedures will de�ne a minimum set of arguments necessary to + carry out its function. The exact speci�cation of the arguments will be determined later, how- + ever, it is envisioned that the image inputs to the DDX function will most likely pointers to a + structure that de�nes the organization and type of data. To that end, each DDX function must + support a set of recognized data types: XieK_Bitstream, XieK_ByteImage, XieK_WordImage, + XieK_LongImage, and XieK_FloatImage. In particular, some permutations of integer and float + must be supported. For example, ADD must support integer in and float out, float in and float + out, etc. See Appendix G for a description of the DDX support of data formats/types. + The DDX functions will presume that the arguments as valid since it will be the DIX respon- + sibility to perform argument checking. + + + + DDX Component 3–1 + Figure 3–1 outlines the flow of the DDX component in relationship to the DIX component. + + + + + Figure 3–1: DDX Subcomponents + + +-----------+ +-----------+ +-----------+ +-----------+ + | DIX | | DIX | | DIX | | DIX | + | Transport | | Process | |Statistics | .... | Other | + | Services | | Services | | Services | | Services | + +-----------+ +-----------+ +-----------+ +-----------+ + ^ ^ ^ ^ + | | | | + v v v | + +-----------------------------------------+ | + | Procedure Vectors |<-----------+ + +-----------------------------------------+ + ^ + | + v + +-----------------------------------------+ + | Lower Level Image Processing Routines | + +-----------------------------------------+ + + + The following represents the procedure table: + + + + Table 3–1: DDX Procedure Vector Table + ROUTINE FUNCTION + _POINT remap input IOB to output IOB + _AREA apply area operators to input IOB and store to output IOB + _ARITH perform arithmetic operation on two IOBs or IOB and a constant + and store to output IOB + _COMPARE comparing two IOBs or one IOB and a constant and store + boolean result to a 2D boolean bitmap + _LOGICAL perform logical operation on two IOBs or one IOB and a con- + stant and store to output IOB + _MATHF apply mathematical function on input IOB and store to output + IOB + _DECOMPRESS decompress input IOB and store to output IOB + _SCALE scale input IOB and store to output IOB + _ROTATE rotate input IOB and store to output IOB + _MIRROR flip input IOB and store to output IOB + _CROP crop input IOB and store to output IOB + + + + +3–2 DDX Component + Table 3–1 (Cont.): DDX Procedure Vector Table +ROUTINE FUNCTION + +_TRANSLATE overlay two IOBs or one IOB and constant and store to output + IOB +_CONSTRAIN apply quantization on input IOB and store to output IOB +_MATCH_HISTOGRAM apply transformation on input IOB to conform with speci�ed + histogram form and store to output IOB +_CHROMINANCE_SEPARATE create 3 IOBs from multispectral IOB +_CHROMINANCE_COMBINE combine 3 IOBs to multispectral IOB +_DITHER reduce number of levels of input IOB and store to output IOB +_LUMINANCE extract luminance component of polychromatic IOB and store to + output IOB +_CALC_HISTOGRAM generates histogram of input IOB +_POINT_STATISTICS generate statistics for an IOB +_AREA_STATISTICS generate statistical IOB from input IOB +_DISPLAY_SEQUENCE display time sequences of pixmaps +_SELECT_EVENTS select which events to be noti�ed of +_QUERY_EVENTS query which events have been set for noti�cation +_COMPRESS compress input IOB - DIX private +_FLOAT_DATA float buffer - DIX private +_MULTIPLE_REQUEST hardware dependent routine + + + + + DDX Component 3–3 + Some of these vectors represent those functions that may have accelerators to perform the + client image request. If the accelerators exist, the DIX must load the appropriate procedure + vector with the entry of the routine which uses the accelerators to perform the particular + function. This will be done at XieDeviceInit time. + Note: These vectors represent a superset of those functions that are within the XIE protocol. + There exist DDX functions which can not explicitly be called by the client (decompress, float_ + data etc.) + For those functions (if any) that are not supported, XIE during initialization time (via XieInit) + must insert a NotImplemented procedure which returns a BadRequest error. + The DDX component must always return to the DIX component so that status can return to + the CORE X dispatcher. + + + +3.1.1 Lower Level Image Processing Routines + For this implementation these procedures will be implemented by software. There will be no + accelerators for this implementation. + + + + +3.2 DIX/DDX Interface + + All DDX routines will use the protocol document as a functional guide. The semantics of + operation (integer vs. float) will be determined by the data_type ï¬�eld within the speciï¬�ed + IOB(s). All input constants will be represented by integer unless deemed otherwise. + + + + +3–4 DDX Component + Chapter 4 + +Operating System Considerations + + + + This chapter addresses some operating system dependencies in the implementation of XIE. + + + + +4.1 Memory Management + + Allocation, reallocation and deallocation of memory is performed by using the CORE X routines + Xalloc, Xrealloc and Xfree, respectively. + + + + +4.2 Linking and Loading XIE + + There exist two ways an extension can be loaded with the server: linked during the linking + of the server and loaded at runtime using sharable images. This document has addressed the + linked method since we intend to develop the initial version under Ultrix and Ultrix does not + support sharable images. + + + + +4.3 Hardware Considerations + + Although this document’s goal is to address the machine independent implementation, we have + attempted to address some of the implications of the current model on other implementations. + As an example of this we have provided a multiple request function in the DDX procedure + vector table. This is intended as a possible way for handling hardware devices that can + perform several functions at once such as scaling and rotating. More importantly it illustrates + how functionality may be increased with the addition of DDX vectors; the DDX procedure + table is not necessarily bounded. + + + + + Operating System Considerations 4–1 + 4.3.1 Hardware Recognition + XIE must identify, by some deï¬�ned mechanism during XieInit, particular hardware platforms + and the procedures for initializing the hardware and for performing the DDX processes. The + CORE X has a similar scenario when it initializes itself. The CORE X for VMS, for example, + utilizes system tables to identify the name of a device and then initializes the device by using + a consistent naming scheme for the entry. For XIE, a similar mechanism will be employed. + CORE routines InitOuput.C, Logical_Setup.C can provide some insight as to how this is + performed in the VMS environment. Additional information will be provided once a machine + independent model has been implemented. This model will need no such mechanism since no + accelerators are deï¬�ned. + + + +4.3.2 Multiple Function Request + Due to hardware components which can accelerate several processes by pipelining data to its + components, there will be a need for XIE to recognize a multiple function call. As an example + of this, suppose there exists an accelerator which can scale and rotate with one call. XIE must + have a DDX entry for such a call. This is accomplished upon initialization when XIE reads a + ï¬�le or table which fully describes the various multiple possibilities. + Note that these permutations only exist for upper level DDX functions such as scale and + rotate. This reduces the number of combinations to a manageable set and represents a likely + correspondence with display accelerator functions. + A mechanism will be deï¬�ned such that XIE can determine the possible combinations so that + it can report them to the client at INIT_SESSION time. This will be reported as a subcode + (for the multiple request call) which represent the sequence of two or greater series of opcodes + which indicate both order of functionality and the speciï¬�c multiple capability. The procedure + that implements this may be a operating system dependent function. + XIE at initialization time will enter this capability within an internal structure and upon + seeing a multiple function request from the client, it will invoke the proper procedure based on + the subcode. + + + + +4–2 Operating System Considerations + Appendix A + +XIE Protocol Requests + + + + + Table A–1: Image Extension Functions + ROUTINE CLASS MODULE FUNCTION + _INIT_SESSION 1 DIX begin client-extension server ses- + sion + _TERM_SESSION 1 DIX terminate client-extension server + session + _QUERY_DEFAULTS 1 DIX query operational defaults + _SET_DEFAULTS 1 DIX establish/modify operational de- + faults + _CREATE_RESOURCE 2 DIX create XIE resource + _COPY_RESOURCE 2 DIX copy an XIE resource + _DELETE_RESOURCE 2 DIX delete an XIE resource + _QUERY_RESOURCE 2 DIX query an XIE resource + _IMPORT_IMAGE 2 DIX transfer image data from drawable + to IOB + _EXPORT_IMAGE 2 DIX transfer image data from IOB -> + PIXMAP + _SET_TRANSPORT 3 DIX establishes context for image trans- + fer + _GET_TILE 3 DDX randomly transfers image data + from IOB to client + _PUT_TILE 3 DDX transfers image data from client to + IOB + _GET_STREAM 3 DIX transfers stream data from IOB -> + client + _PUT_STREAM 3 DIX transfers stream data from client -> + IOB + + + + + XIE Protocol Requests A–1 + Table A–1 (Cont.): Image Extension Functions + ROUTINE CLASS MODULE FUNCTION + + _POINT 4 DDX remap input IOB to output IOB + _AREA 4 DDX apply area operators to input IOB + and store to output IOB + _ARITH 4 DDX perform arithmetic operation on + two IOBs or IOB and a constant + and store to output IOB + _COMPARE 4 DDX comparing two IOBs or one IOB + and a constant and store boolean + result to a 2D boolean bitmap + _LOGICAL 4 DDX perform logical operation on two + IOBs or one IOB and a constant + and store to output IOB + _MATHF 4 DDX apply mathematical function on + input IOB and store to output IOB + _DECOMPRESS 4 DDX decompress input IOB and store to + output IOB + _SCALE 4 DDX scale input IOB and store to output + IOB + _ROTATE 4 DDX rotate input IOB and store to + output IOB + _MIRROR 4 DDX flip input IOB and store to output + IOB + _CROP 4 DDX crop input IOB and store to output + IOB + _TRANSLATE 4 DDX overlay two IOBs or one IOB and + constant and store to output IOB + _CONSTRAIN 4 DDX apply quantization on input IOB + and store to output IOB + _MATCH_HISTOGRAM 4 DDX apply transformation on input IOB + to conform with speciï¬�ed histogram + form and store to output IOB + _CHROMINANCE_SEPARATE 4 DDX create 3 IOBs from multispectral + IOB + _CHROMINANCE_COMBINE 4 DDX combine 3 IOBs to multispectral + IOB + _DITHER 4 DDX reduce number of levels of input + IOB and store to output IOB + _LUMINANCE 4 DDX extract luminance component of + polychromatic IOB and store to + output IOB + _CALC_HISTOGRAM 5 DDX generates histogram of input IOB + + + + +A–2 XIE Protocol Requests + Table A–1 (Cont.): Image Extension Functions +ROUTINE CLASS MODULE FUNCTION + +_POINT_STATISTICS 5 DDX generate statistics for an IOB +_AREA_STATISTICS 5 DDX generate statistical IOB from input + IOB +_DISPLAY_SEQUENCE 7 DIX display time sequences of pixmaps +_SELECT_EVENTS 8 DIX select which events to be notiï¬�ed of +_QUERY_EVENTS 8 DIX query which events have been set + for notiï¬�cation + + + +Table A–2: Service Classes +Class Service +1 session services +2 resource services +3 transport services +4 process services +5 statistics services +6 process control services +7 display services +8 event services + + + + + XIE Protocol Requests A–3 + Appendix B + +Modules and Procedures + + + For coding purposes, all XIE/DIX procedures will reside in two modules: XIE.C and XIE_ + UTILS.C. + The following is a list of XIE server related software modules: + • XieProto.h - contains deï¬�nitions and structures that are used on both sides of the wire. + • XieAppl.h - contains public deï¬�nitions and structures + • XieServer.h - contains deï¬�nitions and structures that pertain to the server. + • XIE.C - contains XIE dispatch logic and DIX request logic + • XIE_UTILS.C - contains utilities for DIX Phase II Request Processing + + The following represents the procedures within the XIE.C module: + • XieDispatcher - vectors to the appropriate DIX process - Phase I. + • XieInit - identiï¬�es XIE to the CORE X and initializes XIE + • XieDeviceInit - initializes any hardware devices and modiï¬�es the DDX procedure vector + table. + • ProcXxx - perform DIX Phase I processing for request Xxx and depending on the request, + perform Phase II processing or call procedures that reside in XIE_UTILS.C. + + The following represents the type of procedures that will reside within the XIE_UTILS.C + module: + • DestroyXxx - logic to delete an XIE resource Xxx. + • TransportTileImage - procedure to randomly transfer image data. + • TransportStreamImage - procedure to sequentially transfer image data. + + + + + Modules and Procedures B–1 + Appendix C + +XIE Application and Wire Deï¬�nitions and Structures + + + + The following represents a draft of some of the XIE wire deï¬�nitions and structures that will + reside in XieProto.h. + Note: this ï¬�le represents a draft and may contain inconsistencies with the text and the + referenced documents. + + + /* + ** Symbol XIEPROTO allows XieProto.h to be included multiple times. + */ + #ifndef XIEPROTO + #define XIEPROTO /* the "endif" MUST be the last line of this file */ + /* + ** Include files + */ + #ifdef VMS + #include "XieAppl.h" /* XIE inter-layer definitions */ + #endif + #ifdef ultrix + #include "XieAppl.h" /* XIE inter-layer definitions */ + #endif + + /* + ** Wire protocol constant definitions. + */ + /* + ** Version number + */ + #define XieK_MajorVersion 1 + #define XieK_MinorVersion 0 + /* + ** Number of supported Events and Errors + */ + #define XieK_NumEvents 0 + #define XieK_NumErrors 0 + /* + ** Resource Types + */ + #define XieK_ImageObject 0 + #define XieK_ImageContext 1 + + + + + XIE Application and Wire Deï¬�nitions and Structures C–1 + /***************************************************************************** + ** Protocol request packet minor op-codes + *****************************************************************************/ + #define X_ieInitSession 1 + #define X_ieSetTransport 2 + #define X_iePutTile 3 + #define X_ieExportImage 4 + #define X_ieCreateResource 5 + #define X_ieTermSession 6 + #define X_iePutStream 7 + #define X_ieLastRequest 99 + + /***************************************************************************** + ** Protocol packet size definitions required by Xlibint.h + *****************************************************************************/ + #define sz_xieReq 4 + #define sz_xieInitSessionReq 8 + #define sz_xiePutTileReq 28 + #define sz_xiePutStreamReq 16 + #define sz_xieExportImageReq 40 + #define sz_xieSetTransportReq 36 + #define sz_xieCreateResourceReq 12 + #define sz_xieCreateIobReq 36 + #define sz_xieTermSessionReq 4 + + /***************************************************************************** + ** Miscellaneous protocol structure definitions + *****************************************************************************/ + /* + ** Wire floating point format + */ + typedef struct { + unsigned char e_sign; + unsigned char m_sign; + unsigned char exponent; + unsigned char pad1; + unsigned short mantissa; + unsigned short pad2; + } XieFloat; + + /***************************************************************************** + ** Protocol request packets + *****************************************************************************/ + /* + ** Generic part of all XIE requests + */ + typedef struct { + unsigned char reqType; /* major op-code assigned to extension */ + unsigned char opcode; /* minor op-code == XIE function */ + unsigned short length; /* length in longwords of entire request */ + } xieReq; + /* + ** Init Session Request + */ + typedef struct { + unsigned char reqType; + unsigned char opcode; /* function == X_ieInitSession */ + unsigned short length; + unsigned short major_version; /* XIE major version */ + unsigned short minor_version; /* XIE minor version */ + } xieInitSessionReq; + + + + +C–2 XIE Application and Wire Deï¬�nitions and Structures + /* + ** Term Session Request + */ +typedef struct { + unsigned char reqType; + unsigned char opcode; /* function == X_ieTermSession */ + unsigned short length; +} xieTermSessionReq; + /* + ** Set transport Request (set transport parameters) + */ +typedef struct { + unsigned char reqType; + unsigned char opcode; /* function == X_ieSetTransport */ + unsigned short length; + unsigned long iob_id; + struct { + unsigned long scanline_stride; + unsigned char scanlines_abut; + unsigned char pixel_stride; + unsigned char pad[2]; + } comp_data[XieK_MaxComponents]; + unsigned char compression_scheme; + unsigned char tile_format; + unsigned char component_organization; + unsigned char pad[1]; +} xieSetTransportReq; + /* + ** Generic create resource + */ +typedef struct { + unsigned char reqType; + unsigned char opcode; /* function == X_ieCreateResource */ + unsigned short length; + unsigned long resource_id; /* resource identifier */ + unsigned long resource_type; /* resource type */ +} xieCreateResourceReq; + /* + ** Create image object request + */ +typedef struct { + unsigned char reqType; + unsigned char opcode; /* function == X_ieCreateResource */ + unsigned short length; + unsigned long resource_id; /* resource identifier */ + unsigned long resource_type; /* resource type == XieImageObject */ + unsigned long pixels_per_scanline; + unsigned long number_of_scanlines; + XieFloat aspect_ratio; + unsigned char number_of_components; + unsigned char bits_per_component[XieK_MaxComponents]; + unsigned char component_mapping; + unsigned char pixel_progression; + unsigned char line_progression; + unsigned char polarity; +} xieCreateIobReq; + + + + + XIE Application and Wire Deï¬�nitions and Structures C–3 + /* + ** Create IDC Request + */ + typedef struct { + unsigned char reqType; + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of "whole" request */ + unsigned long resource_type; + unsigned long idc_id; /* IDC identifier */ + unsigned char idc_type; /* type of data for this dPC req */ + }xieCreateIdcReq; + /* + ** The following request structures are used with CreateIdc depending on + ** idc_type + */ + /* + ** Roi type + */ + typedef struct { + unsigned char pad[3]; /* get on 32 word boundary */ + unsigned long ul_x; + unsigned long ul_y; + unsigned long lr_x; + unsigned long lr_y; + } xieIdcRoiReq; + /* + ** Cpp type + */ + typedef struct { + unsigned char pad[3]; /* get on 32 word boundary */ + unsigned long ul_x; + unsigned long ul_y; + unsigned long iob_id; + } xieIdcCppReq; + /* + ** Tmp type + */ + typedef struct { + unsigned char pad[3]; /* get on 32 word boundary */ + unsigned long centerx; + unsigned long centery; + unsigned long ListOfTmpEntries;/* no. of tmp entries (8 unsigned chars) that follow */ + } xieIdcTmpReq; + /* + ** Import Image Request + */ + typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long iob_id; + unsigned long drawable; + } xieImportImageReq; + + + + +C–4 XIE Application and Wire Deï¬�nitions and Structures + /* + ** Export Image Request (copy image data: Iob --> drawable) + */ +typedef struct { + unsigned char reqType; + unsigned char opcode; /* function == X_ieExportImage */ + unsigned short length; + unsigned long iob_id; + unsigned long drawable; + GContext gc; + unsigned long src_x; + unsigned long src_y; + unsigned long width; + unsigned long height; + unsigned long dst_x; + unsigned long dst_y; +} xieExportImageReq; + /* + ** General Query and Delete Resource + */ +typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long resource_id; +} xieQueryOrDeleteReq; + /* + ** Copy Resource + */ +typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long src_id; + unsigned long dst_id; +} xieCopyResourceReq; + /* + ** Get Tile Request + */ +typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long iob_id; + unsigned long x; + unsigned long y; + unsigned long width; + unsigned long height; + unsigned char final; + unsigned char all_planes; + unsigned char plane_num; + unsigned char pad; +} xieGetTileReq; + + + + + XIE Application and Wire Deï¬�nitions and Structures C–5 + /* + ** Put Tile Request (transport image data: client --> server) + */ + typedef struct _xiePutTileReq { + unsigned char reqType; + unsigned char opcode; /* function == X_iePutTile */ + unsigned short length; + unsigned long iob_id; + unsigned long x; + unsigned long y; + unsigned long width; + unsigned long height; + unsigned char final; + unsigned char all_planes; + unsigned char plane_num; + unsigned char pad[1]; + } xiePutTileReq; + /* + ** Put Stream Request (transport image data: client --> server) + */ + typedef struct _xiePutStreamReq { + unsigned char reqType; + unsigned char opcode; /* function == X_iePutStream */ + unsigned short length; + unsigned long iob_id; + unsigned char final; + unsigned char all_planes; + unsigned char plane_num; + unsigned char number_of_lengths; + unsigned long image_len[1]; /* at run time [number_of_lengths] */ + } xiePutStreamReq; + /* + ** Get Stream Request + */ + typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long iob_id; + unsigned char all_planes; + unsigned char plane_num; + unsigned char pad[2]; + } xieGetStreamReq; + /* + ** Point Request + */ + typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long src_iob_id; + unsigned long dst_iob_id; + unsigned long ipc_id; + unsigned char new_quantum[XieK_MaxComponents]; + /* list of list follow */ + } xiePointReq; + + + + +C–6 XIE Application and Wire Deï¬�nitions and Structures + /* + ** Area Request + */ +typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long src_iob_id; + unsigned long dst_iob_id; + unsigned long ipcc_id; + unsigned long ipct_id; + unsigned char op1; + unsigned char op2; + unsigned char constrain; + unsigned char pad; +} xieAreaReq; + /* + ** Arith Request + */ +typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long src1_iob_id; + unsigned long src2_iob_id; + unsigned long constants[XieK_MaxComponents]; + unsigned long dst_iob_id; + unsigned long ipc_id; + unsigned char op; + unsigned char constrain; + unsigned short pad; +} xieArithReq; + /* + ** Compare Request + */ +typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long src1_iob_id; + unsigned long src2_iob_id; + unsigned long constants[XieK_MaxComponents]; + unsigned long cpp_id; + unsigned long ipc_id; + unsigned char op; + unsigned char combine; + unsigned short pad; +} xieCompareReq; + /* + ** Logical Request + */ +typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long src1_iob_id; + unsigned long src2_iob_id; + unsigned long constants[XieK_MaxComponents]; + unsigned long dst_iob_id; + unsigned long ipc_id; + unsigned char op; + unsigned char pad[3]; +} xieLogicalReq; + + + + + XIE Application and Wire Deï¬�nitions and Structures C–7 + /* + ** Math Function Request + */ + typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long src1_iob_id; + unsigned long src2_iob_id; + unsigned long ipc_id; + unsigned char op; + unsigned char constrain; + unsigned short pad; + } xieMathfReq; + /* + ** Crop Image Request + */ + typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long src_iob_id; + unsigned long dst_iob_id; + unsigned long ipc_id; + } xieCropImageReq; + /* + ** Translate Image Request + */ + typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long src_iob_id; + unsigned long constants[XieK_MaxComponents]; + unsigned long dst_iob_id; + unsigned long ipc_id; + } xieCropImageReq; + /* + ** Scale Image Request + */ + typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long src_iob_id; + unsigned long dst_iob_id; + unsigned short pixels_per_scanline; + unsigned short number_of_scanlines; + } xieScaleImageReq; + /* + ** Rotate Image Request + */ + typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* xie function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long src_iob_id; + unsigned long dst_iob_id; + XieFloat angle; + unsigned char clip; + unsigned char pad[3]; + unsigned long bits_per_component[XieK_MaxComponents]; + } xieRotateImageReq; + + + +C–8 XIE Application and Wire Deï¬�nitions and Structures + /* + ** Mirror Image Request + */ +typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long src_iob_id; + unsigned long dst_iob_id; + unsigned char x_mirror; + unsigned char y_mirror; + unsigned char pad[2]; +} xieMirrorImageReq; + /* + ** Constrain Request + */ +typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long iob_id; +} xieConstrainReq; + /* + ** Match Histogram Request + */ +typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long iob_id1; + unsigned long iob_id2; + unsigned long ipc_id; + XieFloat param1; + XieFloat param2; + unsigned char h_shape; + unsigned char pad[3]; +} xieMatchHistogramReq; + /* + ** Chrominance Separate Request + */ +typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long iob_id1; + unsigned long iob_id2; + unsigned long iob_id3; + unsigned long dst_iob_id; +} xieChromeSepReq; + /* + ** Chrominance Combine Request + */ +typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long src_iob; + unsigned long iob_id1; + unsigned long iob_id2; + unsigned long iob_id3; +} xieChromeComReq; + + + + + XIE Application and Wire Deï¬�nitions and Structures C–9 + /* + ** Dither Request + */ + typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long src_iob_id; + unsigned long dst_iob_id; + unsigned char result_bits[XieK_MaxComponents]; + unsigned char pad; + } xieDitherReq; + /* + ** Luminance Request + */ + typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long src_iob_id; + unsigned long dst_iob_id; + } xieLuminanceReq; + /* + ** Calculate Histogram Request + */ + typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long iob_id; + unsigned long ipc_id; + unsigned char by_component]; + unsigned char pad[3]; + } xieCalcHistReq; + /* + ** Point Statistics Request + */ + typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long iob_id; + unsigned long x_location; + unsigned long y_location; + unsigned char edge_size; + unsigned char pad[3]; + } xiePointStatsReq; + /* + ** Area Statistics Request + */ + typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long src_iob_id; + unsigned long dst_iob_id; + unsigned long ipc_id; + unsigned char edge_size; + unsigned char stat_type; + unsigned char pad[2]; + } xieAreaStatsReq; + + + + +C–10 XIE Application and Wire Deï¬�nitions and Structures + /* + ** Display Sequence Request + */ +typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long window_id; + unsigned short frame_count; + unsigned short frame_timing; + unsigned char forward; + unsigned char number_of_pixmaps; +} xieDisplaySeqReq; + /* + ** Events Requests + */ +typedef struct { + unsigned char reqType; /* Extension type */ + unsigned char opcode; /* XIE function */ + unsigned short length; /* length in longwords of whole request */ + unsigned long event_param; +} xieEventsReq; + +/**************************************************************************** +** Replies +****************************************************************************/ +/* Reply for Get Image */ +typedef struct { + char type; /* XIE_Reply */ + char pad; + unsigned short sequenceNumber; + unsigned long length; /* length of returned image data + in bytes*/ + unsigned long pad1[6]; +} xieGetImageReply; +/* Reply for IOB query */ +typedef struct { + char type; /* XIE_Reply */ + char pad; + unsigned short sequenceNumber; + unsigned long length; /* 0 */ + unsigned short pixels_per_scanline; + unsigned short number_of_scanlines; + unsigned char number_of_spectral_components; + unsigned char total_bits_per_pixel; + unsigned char polarity; + unsigned char grid_type; + char pad0; + unsigned char num_of_aspect_ratio; /* will this exceed 32 chars ? */ + unsigned long pad1; + unsigned long pad2; + unsigned long pad3; +} xieQueryIobReply; +/* Reply for IPC/ROI query */ + + + + + XIE Application and Wire Deï¬�nitions and Structures C–11 + typedef struct { + char type; /* XIE_Reply */ + char pad; + unsigned short sequenceNumber; + unsigned long length; /* 0 */ + unsigned char ipc_type; + char pad1; + unsigned short ul_x; + unsigned short ul_y; + unsigned short lr_x; + unsigned short lr_y; + unsigned short pad2; + unsigned long pad3; + unsigned long pad4; + unsigned long pad5; + } xieQueryIpcRoiReply; + /* Reply for IPC/CPP query */ + typedef struct { + char type; /* XIE_Reply */ + char pad; + unsigned short sequenceNumber; + unsigned long length; /* 0 */ + unsigned char ipc_type; + char pad1; + unsigned short ul_x; + unsigned short ul_y; + unsigned long ipc_data; + unsigned short pad2; + unsigned long pad3; + unsigned long pad4; + unsigned long pad5; + } xieQueryIpcCppReply; + /* Reply for IPC/TMP query */ + typedef struct { + char type; /* XIE_Reply */ + char pad; + unsigned short sequenceNumber; + unsigned long length; /* length of entries */ + unsigned char ipc_type; + char pad1; + unsigned short ListOfTmpEntries; + unsigned short centerx; + unsigned short centery; + unsigned long pad2; + unsigned long pad3; + unsigned long pad4; + unsigned long pad5; + } xieQueryIpcTmpReply; + /* Each TMP entry uses the folowing structure */ + typedef struct { + CARD8 x_index; + CARD8 y_index; + unsigned short numerator; + unsigned short denominator; + unsigned char positive; + char pad; /* 32 bit boundary for swapping */ + } xieTmpEntry; + + + + +C–12 XIE Application and Wire Deï¬�nitions and Structures + /* + ** Reply for Init Session + */ +typedef struct { + char type; /* XIE_Reply */ + unsigned char success; + unsigned short sequenceNumber; + unsigned long length; /* length in chars of additional data */ + unsigned long service_classes; + unsigned short major_version; + unsigned short minor_version; + char vendor; + char model; + unsigned char video_digitizer; + char pad; + unsigned long accelerators; + unsigned short number_of_screens; + char pad1[6]; +} xieInitSessionReply; +/* the following structure is used for screen data for CONNECTION reply */ +/* one set per screen - 20 chars */ +typedef struct { + unsigned short screen_width_millimeters; + unsigned short screen_height_millimeters; + unsigned short screen_width_pixels; + unsigned short screen_height_pixels; + unsigned short screen_depth; + unsigned short screen_luts_size; + unsigned char screen_number; + unsigned char screen_luts; + unsigned char screen_brightness_control; + unsigned char screen_contrast_control; + unsigned char screen_hue_control; + char pad; + unsigned short pad1[2]; /* 32 bit boundary */ +} screen_data; +/* Reply for Export */ +typedef struct { + char type; /* XIE_Reply */ + char pad; + unsigned short sequenceNumber; + unsigned long length; /* 0 */ + unsigned long pixmap; + unsigned long pad1[5]; +} xieExportReply; +/* Reply for Luminance Distribution */ +typedef struct { + char type; /* XIE_Reply */ + char pad; + unsigned short sequenceNumber; + unsigned long length; /* length in chars of stat data */ + unsigned long pad1[6]; +} xieLuminanceDistributionReply; +/* the folowing structure is used for the above reply */ + + + + + XIE Application and Wire Deï¬�nitions and Structures C–13 + typedef struct { + unsigned long minimum; + unsigned long maximum; + unsigned long mean; + unsigned long std_dev; + unsigned long variance; + } statistics_data; + /* Reply for Point Statistics*/ + typedef struct { + char type; /* XIE_Reply */ + char pad; + unsigned short sequenceNumber; + unsigned long length; /* length of point stat data that + follows */ + unsigned long pad1[6]; + } xiePointStatisticsReply; + /* the following structure is used for Point Statistics */ + typedef struct { + unsigned long pixel; + unsigned long minimum; + unsigned long maximum; + unsigned long mean; + unsigned long std_dev; + unsigned long variance; + } point_statistics_data; + /* Reply for Dot Product */ + typedef struct { + char type; /* XIE_Reply */ + char pad; + unsigned short sequenceNumber; + unsigned long length; /* 0 */ + unsigned long pad1[6]; + } xieDotProductReply; + /*** following display stuff may be deleted or expanded */ + typedef struct { + char type; /* XIE_Reply */ + char pad; + unsigned short sequenceNumber; + unsigned long length; + unsigned char idc_type; + unsigned char skip_or_show; + unsigned long pixmap; + unsigned short pad1; + } xieSingleStaticReply; + typedef struct { + char type; /* XIE_Reply */ + char pad; + unsigned short sequenceNumber; + unsigned long length; + unsigned char idc_type; + unsigned char map_x_tiles; + unsigned char map_y_tiles; + unsigned long current_frame; + unsigned long number_of_display_frames; + } xieSpatialMapReply; + + + + +C–14 XIE Application and Wire Deï¬�nitions and Structures + typedef struct { + unsigned char skip_or_show; + unsigned long pixmap; + unsigned short pad1; + char pad2; +} display_frame; +typedef struct { + char type; /* XIE_Reply */ + char pad; + unsigned short sequenceNumber; + unsigned long length; + unsigned char idc_type; + unsigned char map_x_tiles; + unsigned char map_y_tiles; + unsigned long current_frame; + unsigned long number_of_display_frames; +} xieTimeSequenceReply; +/* +** This "endif" MUST be the last line of this file. +*/ +#endif /* end of XIEPROTO -- NO DEFINITIONS ALLOWED BEYOND THIS POINT */ + + + + + XIE Application and Wire Deï¬�nitions and Structures C–15 + The following represents a draft of some of the XIE application deï¬�nitions and structures that + will reside in XieAppl.h. + Note: this ï¬�le represents a draft and may contain inconsistencies with the text and the + referenced documents. + + + /* + ** Symbol XIEAPPL allows XieAppl.h to be included multiple times. + */ + #ifndef XIEAPPL + #define XIEAPPL /* The "endif" MUST be the last line of this file. + + /* + ** X Image Extension name string + */ + #define XieS_Name "xImageExtension" + /* + ** Implementation bounds + */ + #define XieK_MaxComponents 3 /* number of spectral components supported*/ + /* + ** Spectral Component Mappings + */ + #define XieK_Bitonal 1 + #define XieK_GrayScale 2 + #define XieK_RGB 3 + /* + ** Component Space Organizations + */ + #define XieK_BandByPixel 0 + #define XieK_BandByLine 1 + #define XieK_BandByPlane 2 + #define XieK_BitByPlane 3 + /* + ** IDC Types + */ + #define XieK_SingleStatic 0 + #define XieK_SpatialMap 1 + #define XieK_TimeSequence 2 + /* + ** IPC Types + */ + #define XieK_CPP 0 + #define XieK_ROI 1 + #define XieK_TMP 2 + /* + ** Compression Schemes + */ + #define XieK_PCM 0 + #define XieK_G42D 3 + #define XieK_DCT 5 + /* + ** Line Progressions + */ + #define XieK_LP90 0 + #define XieK_LP270 1 + + + + +C–16 XIE Application and Wire Deï¬�nitions and Structures + /* + ** Pixel Progressions + */ +#define XieK_PP0 0 +#define XieK_PP90 1 +#define XieK_PP180 2 +#define XieK_PP270 3 + /* + ** Polarities + */ +#define XieK_ZeroBright 0 +#define XieK_ZeroDark 1 + /* + ** Statistics Types + */ +#define XieK_Minimum 0 +#define XieK_Maximum 1 +#define XieK_Mean 2 +#define XieK_StdDev 3 +#define XieK_Variance 4 + /* + ** Gray to Bitonal bit reduction methods + */ +#define XieK_Dither 0 +#define XieK_Threshold 1 + /* + ** Support Vector + */ +#define XieK_Transport 1 +#define XieK_Enhancement 2 +#define XieK_Pipelines 4 +#define XieK_ImageCapture 8 + /* + ** XieK_ Events + */ +#define XieK_ComputationEvent 1 +#define XieK_NewFrameEvent 2 +#define XieK_SequenceEvent 3 +#define XieK_EdgeDetectEvent 4 + /* + ** Edge Contact on Edge_detect Event + */ +#define XieK_North 0 +#define XieK_East 1 +#define XieK_South 2 +#define XieK_West 3 + /* + ** Conditional Operator Types + */ +#define XieK_LT 0 +#define XieK_LE 1 +#define XieK_EQ 2 +#define XieK_GT 3 +#define XieK_GE 4 +/* +** This "endif" MUST be the last line of this file. +*/ +#endif /* end of XIEAPPL -- NO DEFINITIONS ALLOWED BEYOND THIS POINT */ + + + + + XIE Application and Wire Deï¬�nitions and Structures C–17 + Appendix D + +Server Deï¬�nitions and Structures + + + The following represents a draft of some deï¬�nitions and structures that pertain to the XIE + server. These will reside in XieServer.h. + Note: this ï¬�le represents a draft and may contain inconsistencies with the text and the + referenced documents. + + + + #define XieK_MaxNumberOfClients 100 + /* Image Data Types */ + #define XieK_Bitstream 0 + #define XieK_ByteImage 1 + #define XieK_WordImage 2 + #define XieK_LongImage 3 + #define XieK_FloatImage 4 + #define XieK_NoFormat 5 + /* XIE Event Mask */ + #define XieK_ComputationComplete 1<<0 + #define XieK_NewFrame 1<<1 + #define XieK_SequenceComplete 1<<2 + #define XieK_EdgeDetect 1<<3 + + /* + ** When a connection between the client and XIE is established, the following + ** structure will have its fields defined: (TBDL) + */ + static struct client_struct + { + unsigned short event_mask; + unsigned long client_id; + unsigned long *quantize_ptr; + } client_table[XieK_MaxNumberOfClients]; + /*The following represents XIE resource structures. */ + typedef struct components + { + unsigned long scanline_stride; + unsigned char scanlines_abut; + unsigned char pixel_stride; + unsigned char pad[2]; + } XieCompData; + + + + + Server Deï¬�nitions and Structures D–1 + typedef struct transport { + unsigned char compression_scheme; + unsigned char tile_format; + unsigned char component_organization; + unsigned char component_mapping; + XieCompData comp_data[XieK_MaxComponents]; + } XieTransportRec; + typedef struct transport *XieTransportPtr; + typedef struct IobResource { + unsigned long pixels_per_scanline; + unsigned long number_of_scanlines; + unsigned char number_of_components; + unsigned char pixel_progression; + unsigned char line_progression; + XieFloat aspect_ratio; + unsigned char polarity; + unsigned char constrained; + XieTransportPtr transport_ptr; + unsigned long *data_pointer[XieK_MaxComponents]; + unsigned long data_offset[XieK_MaxComponents]; + unsigned long data_type[XieK_MaxComponents]; + unsigned char bits_per_comp[XieK_MaxComponents]; + } IobResourceRec; + typedef struct IobResource *IobPtr; + typedef struct IdcRoiResource { + unsigned short ul_x; + unsigned short ul_y; + unsigned short lr_x; + unsigned short lr_y; + } IdcRoiResourceRec; + typedef struct IdcRoiResource *Roi_ptr; + typedef struct IdcCppResource { + unsigned short ul_x; + unsigned short ul_y; + unsigned long pixmap; + } IdcCppResourceRec; + typedef struct IdcCppResource *Cpp_ptr; + typedef struct { + char center_x; + char center_y; + char num_tmp_entries; + } IdcTmpResource; + /* + ** The following structures represent those used for XIE events + */ + typedef struct { + char type; /* event code */ + char pad; + unsigned short sequenceNumber; /* client sequence */ + unsigned long iob_id; + char direction; /* CLIENT_TO_SERVER or SERVER_TO_CLIENT */ + char pad0[3]; /* pads for 32 char long event */ + unsigned long pad1[5]; + } xie_transport_complete; + + + + +D–2 Server Deï¬�nitions and Structures + typedef struct { + char type; /* event code */ + char pad; + unsigned short sequenceNumber; /* client sequence */ + unsigned long src_iob_id; + unsigned long dst_iob_id; + unsigned long pad1[5]; /* pad for 32 char long event */ +} xie_computation_complete; +typedef struct { + char type; /* event code */ + char pad; + unsigned short sequenceNumber; /* client sequence */ + unsigned long idc_id; + unsigned long frame_number; /* frame that is currently displayed */ + unsigned long pad1[5]; /* pad for 32 char long event */ +} xie_new_frame; +typedef struct { + char type; /* event code */ + char pad; + unsigned short sequenceNumber; /* client sequence */ + unsigned long idc_id; + unsigned long pad1[6]; /* pad for 32 char long event */ +} xie_sequence_complete; +typedef struct { + char type; /* event code */ + char pad; + unsigned short sequenceNumber; /* client sequence */ + unsigned int pixmap; + unsigned long window; + unsigned long pixmap_x; /* upper left x pixmap location */ + unsigned long pixmap_y; /* upper left y pixmap location */ + char edge; /* NORTH, EAST, SOUTH, WEST */ + char pad0[3]; /* pads for 32 byte long event */ + unsigned long pad1[2]; +} xie_edge_detect; + + + + + Server Deï¬�nitions and Structures D–3 + Appendix E + +CORE X Structures + + + The following CORE X structure is deï¬�ned in EXTNSIONST.H: + + typedef struct _ExtensionEntry { + int index; + void (* CloseDown)(); /* called at server shutdown */ + char *name; /* extension name */ + int base; Definitions and /* base request number */ + int eventBase; + int errorBase; + int errorLast; + pointer extPrivate; + } ExtensionEntry; + + The following CORE X structure is deï¬�ned in DIXSTRUCT.H and represents the client + structure that is used throughout XIE: + + typedef struct _Client { + int index; + Mask clientAsMask; + pointer requestBuffer; + pointer osPrivate; /* for OS layer, including scheduler */ + Bool swapped; + void (* pSwapReplyFunc)(); + int errorValue; + int sequence; + int closeDownMode; + int clientGone; + int noClientException; /* this client died or needs to be killed*/ + DrawablePtr lastDrawable; + int lastDrawableID; + GCPtr lastGC; + int lastGCID; + pointer *saveSet; + int numSaved; + pointer screenPrivate[MAXSCREENS]; + #ifndef ultrix + REQSB Reqsb; /* holds request buffer process info */ + pointer *pXportWriteBuffer; + #endif ultrix + } ClientRec; + + + + + CORE X Structures E–1 + Appendix F + +MACROS + + + + +F.1 CORE X Macros + + These macros will be copied from the CORE X source ï¬�les (PROCMUMBLE.C and DIX.H) to + XieServer.H. This redundancy will allow for cleaner looking code. + + o REQUEST + o REQUEST_SIZE_MATCH + o REQUEST_AT_LEAST_SIZE + o LOOKUP_DRAWABLE + + Note: There exists other useful macros within the CORE X modules SWAPREQ.C, + DIXUTILS.C and MISC.H to name a few. + + #ifndef ultrix + #define REQUEST(type) \ + register type *stuff = (type *)client->Reqsb.pCurrentReq + #else ultrix + #define REQUEST(type) \ + register type *stuff = (type *)client->requestBuffer + #endif ultrix + #define REQUEST_SIZE_MATCH(req)\ + if ((sizeof(req) >> 2) != stuff->length)\ + return(BadLength) + #define REQUEST_AT_LEAST_SIZE(req) \ + if ((sizeof(req) >> 2) > stuff->length )\ + return(BadLength) + #define LOOKUP_DRAWABLE(did, client)\ + ((client->lastDrawableID == did) ? \ + (DrawablePtr)client->lastDrawable : + (DrawablePtr)LookupDrawable(did, client)) + + + + + MACROS F–1 + F.2 XIE MACROS + + The following macros are XIE speciï¬�c macros: + + o LEGAL_NEW_XIE_RESOURCE_ + o CHECK_XIE_ERROR_ + o VALIDATE_DRAWABLE_AND_GC + o FIND_CLIENT_INDEX_ + o WRITE_REPLY_TO_CLIENT_ + o WRITE_SWAPPED_DATA_TO_CLIENT_ + + + /* + ** MACRO definitions + */ + /* This macro checks "value" for NULL and if so, sends errorcode indicated + ** by "error_code" with the relevant resource "id". + */ + #define CHECK_XIE_ERROR_(value,id,error_code) \ + if (!value) \ + {\ + SendErrorToClient (client, xieReqCode, stuff->opcode, id, error_code);\ + return (error_code);\ + } + /* This macro makes sure that the a drawable and GC is valid */ + #define VALIDATE_DRAWABLE_AND_GC_(drawID, pDraw, pGC, client)\ + if ((client->lastDrawableID != drawID) || (client->lastGCID != stuff->gc))\ + {\ + if (client->lastDrawableID != drawID)\ + {\ + pDraw = (DrawablePtr)LookupID(drawID, RT_DRAWABLE, RC_CORE);\ + CHECK_XIE_ERROR_(pDraw, drawID, BadDrawable);\ + if ((pDraw->type == DRAWABLE_WINDOW) || \ + (pDraw->type == DRAWABLE_PIXMAP))\ + {\ + client->lastDrawable = (DrawablePtr)pDraw;\ + client->lastDrawableID = drawID;\ + }\ + else\ + {\ + SendErrorToClient (client, xieReqCode, stuff->opcode, drawID,\ + BadDrawable);\ + return (BadDrawable);\ + }\ + }\ + else\ + pDraw = (DrawablePtr)client->lastDrawable;\ + if (client->lastGCID != stuff->gc)\ + {\ + pGC = (GC *)LookupID(stuff->gc, RT_GC, RC_CORE);\ + CHECK_XIE_ERROR_(pGC, stuff->gc, BadGC);\ + client->lastGC = (GCPtr)pGC;\ + client->lastGCID = stuff->gc;\ + }\ + else\ + pGC = (GC *) client->lastGC;\ + if ((pGC->depth != pDraw->depth) || (pGC->pScreen != pDraw->pScreen))\ + {\ + client->lastGCID = -1;\ + + + +F–2 MACROS + client->lastGC = (GCPtr)NULL;\ + SendErrorToClient (client, xieReqCode, stuff->opcode, stuff->gc,\ + BadMatch);\ + return (BadMatch);\ + }\ + }\ + else\ + {\ + pGC = (GC *) client->lastGC;\ + pDraw = (DrawablePtr)client->lastDrawable;\ + }\ + if (pGC->serialNumber != pDraw->serialNumber)\ + { \ +ValidateGC(pDraw, pGC);\ + } + /* This macro loops through the current number of clients that the + ** is supporting and finding a match with "index". If no match is + ** found, an error is reported to the client. + */ +#define FIND_CLIENT_INDEX_(index)\ + for (index=0; index <= num_of_clients; index++)\ + {\ + if (client->index == client_table[index].client_id) break;\ + }\ + if (index == num_of_clients)\ + {\ + SendErrorToClient (client, xieReqCode, stuff->opcode, client->index, \ + BadMatch); \ + return (BadMatch);\ + } + /* This macro checks that an XIE resource ID is valid else returns + ** error to client + */ +#define LEGAL_NEW_XIE_RESOURCE_(id,rType)\ + if ((LookupID(id, rType, RC_xie) != 0) || (id & SERVER_BIT) \ + || (client->clientAsMask != CLIENT_BITS(id)))\ + {\ + SendErrorToClient (client,xieReqCode, stuff->opcode, id, BadIDChoice);\ + return(BadIDChoice);\ + } + /* This macro verifies that a GC is valid else returns error to client*/ +#define VERIFY_GC(pGC, rid, client)\ + if (client->lastGCID == rid)\ + pGC = client->lastGC;\ + else\ + pGC = (GC *)LookupID(rid, RT_GC, RC_CORE);\ + CHECK_XIE_ERROR_(pGC, rid, BadGC);\ + +#define WRITE_REPLY_TO_CLIENT_ (pClient, size, pReply) \ + if (pClient->swapped) \ + (*XieReplySwapVector[((XieReq *)pClient->requestBuffer)->data]) \ + (pClient, size, pReply); \ + else WriteToClient(pClient, size, (char *) pReply); +#define WRITE_SWAPPED_DATA_TO_CLIENT_ (pClient, size, pbuf) \ + if (pClient->swapped) \ + (*pClient->pSwapReplyFunc)(pClient, size, pbuf); \ + else WriteToClient (pClient, size, (char *) pbuf); + + + + + MACROS F–3 + Appendix G + +DIX/DDX INTERFACE + + + The following represent the DIX and DDX responsibilities regarding data formats for each + DDX call. For constrained operations, the DIX will apply the quantize function upon comple- + tion. + Note: the format {i,j,k} refers to two input IOB data types (i,j) and its result (k), while the + format {i,c,k} refers to one input IOB of type i and a constant (c), and {i,k} refers to one input + IOB of data type i and a resultant IOB of data type k. The symbol c is presumed to be of type + LONG, the symbol frac is the symbol for fractional constants, and the symbols i,j and k take + on the following possible values: + + + XieK_Bitstream 0 + XieK_ByteImage 1 + XieK_WordImage 2 + XieK_LongImage 3 + XieK_Float 4 + + _POINT + + DIX: create destination IOB of type indicated by the request parameter - new_quantum. + DDX: must be able to handle all permutations of data formats {i,k} with the exception of + i,k = 4. + + _AREA (Addition) + + DIX: create destination IOB of type 4. + DDX: must be able to handle all permutations of data formats {i,4}. + + _AREA (Multiplication) + + DIX: create destination IOB of type 4. + DDX: must be able to handle all permutations of data formats {i,4}. + + -ARITH (ADD_II) + + DIX: create destination IOB of type k where k = max(i,j)+1. + + + DIX/DDX INTERFACE G–1 + DDX: must be able to handle all permutations of data formats {i,j,k} where k = max(i,j)+1. + + + + _ARITH (ADD_IC) + + DIX: create destination IOB of type 4. + DDX: must be able to handle all permutations of data formats {i,c,4}. + + _ARITH (SUB_II) + + DIX: create destination IOB of type 4. + DDX: must be able to handle all permutations of data formats {i,j,4}. + + + _ARITH (SUB_IC) + + DIX: create destination IOB of type 4. + DDX: must be able to handle all permutations of data formats {i,c,4}. + + _ARITH (SUB_CI) + + DIX: create destination IOB of type 4. + DDX: must be able to handle all permutations of data formats {c,i,4}. + + _ARITH (MUL_II) + + DIX: create destination IOB of type k where k = max(i,j) + 1, unless i or j = 0, then k = + max(i,j). + DDX: must be able to handle all permutations of data formats {i,j,k} where k = i or k = i + + 1. + + _ARITH (MUL_IC) + + DIX: create destination IOB of type 4. + DDX: must be able to handle all permutations of data formats {i,c,4}. + + _ARITH (DIV_IC) + + DIX: create destination IOB of type 4. + DDX: must be able to handle all permutations of data formats {i,c,4}. + + _ARITH (DIV_CI) + + DIX: create destination IOB of type 4. + DDX: must be able to handle all permutations of data formats {i,c,4}. + + _ARITH (DIV_II) + + + + +G–2 DIX/DDX INTERFACE + DIX: create destination IOB of type 4. +DDX: must be able to handle all permutations of data formats {i,c,4}. + +_ARITH (MIN_II) + +DIX: create destination IOB of type k where k = max(i,j) +DDX: must be able to handle all permutations of data formats {i,j,k} where k = max(i,j). + +_ARITH (MIN_IC) + +DIX: create destination IOB of type k where k = i. +DDX: must be able to handle all permutations of data formats {i,c,k} where k = i. + +_ARITH (MAX_II) + +DIX: create destination IOB of type k where k = max(i,j) +DDX: must be able to handle all permutations of data formats {i,j,k} where k = max(i,j). + +_ARITH (MAX_IC) + +DIX: create destination IOB of type k = max(i,c). +DDX: must be able to handle all permutations of data formats {i,c,k} where k = max(i,c). + +_COMPARE + +DIX: create destination IOB of type 0. +DDX: must be able to handle all permutations of data formats {i,j,0}. + +_LOGICAL (AND_II) + +DIX: create destination IOB of type k = max(i,j). +DDX: must be able to handle all permutations of data formats {i,j,k} where i,j and k are +not 4. + +_LOGICAL (AND_IC) + +DIX: create destination IOB of type 3. +DDX: must be able to handle all permutations of data formats {i,c,k} where i = 0,1,2,3 and +k = 3. + +_LOGICAL (OR_II) + +DIX: create destination IOB of type k = max(i,j). +DDX: must be able to handle all permutations of data formats {i,j,k} where i,j and k are +not 4. + +_LOGICAL (OR_IC) + +DIX: create destination IOB of type 3. + + + + DIX/DDX INTERFACE G–3 + DDX: must be able to handle all permutations of data formats {i,c,k} where i = 0,1,2,3 and + k = 3. + + _LOGICAL (XOR_II) + + DIX: create destination IOB of type k = max(i,j). + DDX: must be able to handle all permutations of data formats {i,j,k} where i,j and k are + not 4. + + _LOGICAL (XOR_IC) + + DIX: create destination IOB of type 3. + DDX: must be able to handle all permutations of data formats {i,c,k} where i = 0,1,2,3 and + k = 3. + + _LOGICAL (SHIFT_UP or SHIFT_DOWN) + + DIX: create destination IOB of same type as input. + DDX: must be able to handle all permutations of data formats {i,j,k} where i,j and k are + not 4. + + _LOGICAL (NOT) + + DIX: create destination IOB of same type as input. + DDX: must be able to handle all permutations of data formats {i,j,k} where i,j and k are + not 4. + + _MATHF (PWR) + + DIX: create destination IOB of type 4. + DDX: must be able to handle all permutations of data formats {i,frac,4}. + + _MATHF (LOG2, LN, LOG10) + + DIX: create destination IOB of type 4. + DDX: must be able to handle all permutations of data formats {i,4}. + + _MATHF (SQUARE) + + DIX: create destination IOB of type k where k = i + 1, unless i = 0, then k = i. + DDX: must be able to handle all permutations of data formats {i,k} where k = i or k = i + + 1. + + _MATHF (SQUARE_ROOT) + + DIX: create destination IOB of type 4. + DDX: must be able to handle all permutations of data formats {i,4}. + + _SCALE + + + +G–4 DIX/DDX INTERFACE + DIX: create destination IOB of type k = i. +DDX: must be able to handle all cases of data types of the form {i,k} where k = i. + +_ROTATE + +DIX: Create destination IOB of type k = i. +DDX: must be able to handle all cases of data types of the form {i,k} where k = i. + +_MIRROR + +DIX: Create destination IOB of type k = i. +DDX: must be able to handle all cases of data types of the form {i,k} where k = i. + +_CROP + +DIX: Create destination IOB of type k = i. +DDX: must be able to handle all cases of data types of the form {i,k} where k = i. + +_TRANSLATE (II) + +DIX: create destination IOB of type k where k = max(i,j). +DDX: must be able to handle all permutations of data formats {i,j,k} where k = max(i,j). + +_TRANSLATE (IC) + +DIX: create destination IOB of type k where k = max(i,c) +DDX: must be able to handle all cases of data types of formats {i,c,k} where k = max(i,c). + +_CONSTRAIN + +DIX: create destination IOB of type k where k is dictated by the quantize context. +DDX: must be able to handle all permutations of data formats {i,k} with the exception of k += 4. + +_MATCH_HISTOGRAM (TBS) + + +_CHROMINANCE_SEPARATE + +DIX: if input IOB is of type 4, quantize to IOB of type speciï¬�ed by the quantization +context, then create IOBs of type 1,2 or 3 depending on component depth. +DDX: must be able to handle all types of input IOBs except 4. + +_CHROMINANCE_COMBINE + +DIX: If input IOBs are of type 4, quantize according to quantization context, create +destination IOB of type 1,2, or 3 as dictated by the "quantized" input IOBs. +DDX: must be able to handle all types of input IOBs except 4. + + + + DIX/DDX INTERFACE G–5 + _DITHER + + DIX: if input IOB is of type 4, quantize to IOB of type speciï¬�ed by the quantization + context, then create destination IOB of type indicated by "result_bits" + DDX: must be able to handle all cases of data formats {i,k} where i or k not equal to 4 + + _LUMINANCE (TBS) + + + _CALC_HISTOGRAM + + DIX: if input IOB is of type 4, quantize to IOB of type speciï¬�ed by the quantization + context. + DDX: must be able to handle all types of input IOB except 4. + + POINT_STATS + + DIX: NONE + DDX: must be able to handle all types of input IOBs. + + AREA_STATS + + DIX: Create destination IOB of type 4. + DDX: must be able to handle all types of input IOB i for {i,4}. + + + + +G–6 DIX/DDX INTERFACE + \ No newline at end of file diff --git a/xie/evidence/ACCELERATOR_NOT_MODELLED.txt b/xie/evidence/ACCELERATOR_NOT_MODELLED.txt new file mode 100644 index 0000000..9f1d94a --- /dev/null +++ b/xie/evidence/ACCELERATOR_NOT_MODELLED.txt @@ -0,0 +1,47 @@ +DEFINITIVE FINDING: XIE's RENDER PATH NEEDS THE IMAGE ACCELERATOR, WHICH THIS +MACHINE DOES NOT MODEL. ITS REGISTER WINDOW IS SWALLOWED BY THE VRAM MAPPING. + +A) THE CONVERSION ROUTINE THE EXPORT ENDS IN + The post-gate trace showed the failing callee: + r6CF4 a8=00000002 ; call at 0x36CEE -> file 0x122D94 returns 2 + file 0x122D94 (ddx/smi conversion) begins by driving hardware registers: + 0x122DA2 MOVE A11,@0x5600000,0x0 + 0x122DA8 MOVE A11,@0x5600100,0x0 + 0x122DBC *A11(A9) reads @0x5600100, ANDI 0xfffd, writes back + 0x122DD8 MOVE 0x258,@0x5600020,0x0 + 0x122DE2 MOVE 0x32, @0x5600030,0x0 + 0x122E24 MOVE A11,@0x5600080,0x0 + 0x122E44 *A11 reads @0x5600030, OR 1, writes back + i.e. the VT1200's image accelerator (the "scalution" device the firmware also + names: "error initializing scalution") at bit window 0x5600000. + +B) THAT WINDOW IS NOT A DEVICE IN THE DRIVER + harness/mame/vt1200.cpp: + 1127: map(VRAM_BASE_BITS, 0x1fffffff).ram().share("vram"); + VRAM_BASE_BITS = 0x04000000 + so 0x04000000..0x1fffffff is plain shared VRAM and **0x5600000 lies inside it**. + Reads therefore return pixel data, writes land in video memory, and the + accelerator never behaves like hardware. + + Confirmed with the driver's own unmapped-access log (VT1200_LOG_UNMAPPED): + during a full export the log contained ONLY its 2 header lines -- no entry for + 0x5600000 -- precisely because that address is "mapped" (as RAM), not unmapped. + +C) WHY THIS EXPLAINS EVERY NEGATIVE + * the conversion polls accelerator registers expecting status bits; with VRAM + contents it never sees them and returns BadValue(2); + * every client-side attribute is correct and unchanged across ~45 turns + (transport mode 3, scheme PCM, photomap levels 2 / comp_COUNT 1, drawable, + GC, depth 1, geometry, imported data 0xFF white / 0x00 black); + * both the hand-rolled client and DEC's own 2.3 client fail identically; + * the two earlier DDX gates (compression, src_base) are upstream of this and + can be made to pass, after which this hardware access is what remains. + +STATUS. NO client-chosen XIE image has been displayed, and in this emulator it +cannot be: the display path terminates in a hardware device that is not modelled. + +WHAT WOULD BE REQUIRED + A model of the VT1200 image accelerator (register block 0x5600000.., and the + pixel-engine semantics behind "scalution"), mapped over that address range and + with the VRAM window narrowed around it. That is a substantial new device to + implement -- not a client or protocol issue. diff --git a/xie/evidence/ACCEL_IS_DMA_NOT_CPU_FED.txt b/xie/evidence/ACCEL_IS_DMA_NOT_CPU_FED.txt new file mode 100644 index 0000000..f0a7970 --- /dev/null +++ b/xie/evidence/ACCEL_IS_DMA_NOT_CPU_FED.txt @@ -0,0 +1,35 @@ +COMMAND STREAM DECODED -- THE ACCELERATOR IS DMA-DRIVEN, NOT CPU-FED. + +Fresh capture during a completing export (VT1200_ACCEL=1 + compression poke): + + 0x5600080 : 154 writes <- a PARAMETER TABLE + 0x5600050 : 1 write <- a single flush word (0000) + +The 0x5600080 stream is a register/value table, not pixel data. Decoded as +(low byte = parameter index, high byte = value): + + idx 00=02 idx 01=00 idx 02=01 idx 04=FF idx 05=BF idx 06=FF idx 07=F8 + idx 08=01 idx 09=02 idx 0A=00 idx 0B=01 idx 0C=01 idx 0D=02 idx 0E=00 + idx 0F=01 idx 10=00 idx 11=4B idx 12=4B idx 13=FF idx 14=EF idx 15=FF + idx 16=EF ... (values FF/BF/F8/EF/4B look like coefficient/mask entries) + +154 words is far too few for 64x64 pixels (256 words minimum), and there is only +ONE data write. So the pixel traffic never passes through the CPU-visible FIFO +in this run: the engine is expected to fetch the source and write the +destination by DMA from the descriptor programmed into the register block. + +CONSEQUENCE + Believing the earlier 0x7FE-word loop was the pixel path was wrong: that loop + writes a constant (A11=0) and is a flush. Implementing "FIFO -> framebuffer" + as previously planned would not paint anything. + + To paint, the model must decode the descriptor (source address, destination + address, width/height, strides, and the table uploaded to 0x5600080) and + perform the copy itself -- i.e. a real device implementation, not a status + shim. + +STATE + * export completes with no error (previous milestone, still true); + * the framebuffer is unchanged; no client-chosen image is displayed; + * model remains opt-in (VT1200_ACCEL=1); default configuration verified intact; + * xshow (core X) remains the only viewer that has shown an image. diff --git a/xie/evidence/ACCEL_ITERATION_2.txt b/xie/evidence/ACCEL_ITERATION_2.txt new file mode 100644 index 0000000..f775346 --- /dev/null +++ b/xie/evidence/ACCEL_ITERATION_2.txt @@ -0,0 +1,38 @@ +ACCELERATOR MODEL, ITERATION 2 -- THREE WAITS CLEARED, NOW BLOCKED ON THE FIFO +HANDSHAKE (which must be stateful, not a constant). + +Method: with VT1200_ACCEL=1 plus the labelled compression poke, sample the guest +PC during the freeze (emu.register_periodic) and map each sample to a file +offset. Each wait cleared moved the spin to the next one. + + 1. 0x122E54 polls bit 1 of 0x5600010 -> "initialisation of scalution" + model: return bit 1. CLEARED + 2. 0x1253FC polls bit 9 (done) or bit 0 (data ready) of *B5, error mask 0x450 + model: add bit 9. CLEARED + 3. 0x125448 polls bit 2 or (bit 9 of *B3) + model: add bit 2. CLEARED + 4. 0x1254F2 polls bit 0 (data ready) -> transfer path + model: add bit 0. REACHED + 5. 0x125568..0x125570 write loop: MOVI 0x7FE,B8 ; MOVE A11,*A5 ; DSJS + -- writes 0x7FE words to the FIFO data register, then returns to + 0x1254F8 -> 0x1254F2, which sees bit 0 still set, and re-enters. + => infinite transfer loop; the guest freezes here. + +So the model needs the DATA-READY bit to be *transient*: asserted so the engine +takes a transfer, deasserted once the FIFO write happens (and re-asserted when +the engine wants more), rather than held permanently as it is now. + +Current status value in the model: 0x0207 (bits 0,1,2,9) -- one bit too many: +bit 0 must be a handshake, not a constant. + +STATE + * default configuration unchanged and verified booting (model is opt-in). + * with VT1200_ACCEL=1 + poke the export advances through three accelerator + gates instead of failing at the first, and now blocks in the FIFO transfer. + * NO client-chosen XIE image has been displayed; the window is unchanged; + xshow (core X) remains the only viewer that has shown an image. + +NEXT: make 0x5600010 bit 0 a latch -- set when the engine writes the FIFO command +(0x5600080 / 0x5600050) and cleared by the first FIFO data write -- i.e. give the +accelerator a one-word-deep "data request" handshake. That is a small, +well-scoped change to accel_r/accel_w in harness/mame/vt1200.cpp. diff --git a/xie/evidence/ACCEL_MODEL_FIRST_CUT.txt b/xie/evidence/ACCEL_MODEL_FIRST_CUT.txt new file mode 100644 index 0000000..abe6f8c --- /dev/null +++ b/xie/evidence/ACCEL_MODEL_FIRST_CUT.txt @@ -0,0 +1,48 @@ +ACCELERATOR MODEL, FIRST CUT (opt-in, VT1200_ACCEL=1) + +1) REGISTER PROTOCOL CAPTURED + A read/write watch over 0x5600000..0x56001FF during one genuine decclient + export recorded 8365 accesses: + 0x5600010 read 8192 times <- status, polled + 0x5600080 written 154 times <- command/data FIFO + 0x5600100 read+written 10 <- control + 0x5600030 written 6 + 0x5600020 written 2 (0x248) + 0x5600000 written 1 (0) + The poll at file 0x122E54 tests bit 1 of 0x5600010, 0xFFF times, and on + failure prints the ROM string + "ERROR: timeout occurred on initialization of scalution" + then returns XIE BadValue(2). + +2) DRIVER CHANGE (harness/mame/vt1200.cpp) + Added an accelerator register block at bit 0x05600000 with: + accel_r: offset 1 (== 0x5600010) returns 0x0002 ("initialised"); + other offsets return the last written value + accel_w: latch + Made it exclusive by splitting the VRAM window around the block, and made the + whole thing OPT-IN via VT1200_ACCEL so the verified default is untouched. + + Two things learned the hard way while doing it: + * the address map hands handlers (address - base) >> 4, so 0x5600010 arrives + as offset 1, not 0x10; + * an overlapping map entry does NOT take precedence over the VRAM window -- + the range had to be made exclusive by splitting VRAM. + +3) RESULT WITH THE MODEL ENABLED + * the CPU now reads a9=0002 from 0x5600010 (bit 1 set) and the code reaches + the post-poll path instead of the timeout branch; + * the machine then FREEZES at frame 1: the export hangs and the guest spins, + i.e. after passing the "initialisation" wait the firmware blocks in a + further accelerator wait whose register the model does not satisfy. + * no image is painted. + +4) DEFAULT CONFIGURATION VERIFIED UNCHANGED + With no environment, the machine boots normally (X ready in 3 s) and the + framebuffer screenshot is produced. The model is inert unless VT1200_ACCEL=1. + +STATUS. NO client-chosen XIE image has been displayed. + +NEXT: with VT1200_ACCEL=1, sample the guest PC during the freeze to find the +second wait loop, then extend the model with the register it polls (likely the +0x5600080 FIFO's status or a done bit in 0x5600100) -- the same iterative +approach that got past the first gate. diff --git a/xie/evidence/ACCEL_REGISTER_MAP_WITH_PCS.txt b/xie/evidence/ACCEL_REGISTER_MAP_WITH_PCS.txt new file mode 100644 index 0000000..eda6245 --- /dev/null +++ b/xie/evidence/ACCEL_REGISTER_MAP_WITH_PCS.txt @@ -0,0 +1,41 @@ +ACCELERATOR REGISTER MAP, WITH THE FIRMWARE PC THAT WRITES EACH ONE. + +Captured during a COMPLETING export (VT1200_ACCEL=1 + compression poke): + writes 180, reads 591. Reads: 0x5600200 x384, 0x5600100 x102, 0x5600010 x100, + 0x5600030 x5. + + address count sample values writer PC -> file + 0x5600000 2 0000 3F3B6A40 -> 0x36D48 + 0x5600020 3 0248 / 0248 / 0258 3F3B6090 -> 0x36C12 + 3F3B6A00 -> 0x36D40 + 3FB16EF0 -> 0x125DDE + 0x5600030 8 0032 0033 0432 0232 0233 0032 multiple + 0x5600040 1 0040 3F3B6D30 -> 0x36DA6 + 0x5600050 1 0000 (flush) + 0x5600080 154 parameter table (idx/value pairs) 0x1B44C.. + 0x5600100 11 0000 0001 0002 0008 0200 0202 0201 multiple + 0x5600200 (read 384x) <-- output/status FIFO + +WHAT 0x5600040 IS + file 0x36DA0: MOVE A11,@0x5600040,0x0 + where A11 = *A13(0x240), a frame scalar. Observed value 0x40 = 64, i.e. a + dimension (strip height or pitch). The same block then calls 0x7F6538C with + six frame arguments -- the transfer setup. + +INTERPRETATION + * 0x5600030 is a control register whose value toggles bit 9 (0x200) and bit 10 + (0x400): 0032 -> 0432 -> 0232 -> 0032, and 0201/0202 on 0x5600100. + * 0x5600100 is the command register (0x200 / 0x201 / 0x202 / 0x0008 ...). + * 0x5600200 is read 384x -- almost certainly the engine's output/data port. + * the parameter table at 0x5600080 carries coefficients, not pixels. + + So the engine is programmed with (dimension, coefficients, command) and is then + expected to move pixels itself. No CPU-visible source/destination pointer is + written: 16-bit writes only, and no value in the 0x10..0x1ffffff (main RAM) or + >=0x04000000 (VRAM) ranges appears anywhere in the write stream. + +STATE + * export completes, no error; + * framebuffer unchanged; NO client-chosen XIE image displayed; + * model opt-in (VT1200_ACCEL=1); default configuration intact; + * xshow (core X) is still the only viewer that has shown an image. diff --git a/xie/evidence/ACCEL_TRACE_DIFF.txt b/xie/evidence/ACCEL_TRACE_DIFF.txt new file mode 100644 index 0000000..0c77024 --- /dev/null +++ b/xie/evidence/ACCEL_TRACE_DIFF.txt @@ -0,0 +1,31 @@ +ACCELERATOR REGISTER TRACE, WHITE vs BLACK, DIFFED (properly formed watch this time). + +Watch: 0x05600000 + 0x200, read/write, logging addr, value and PC. +Both traces: 2436 lines. diff = 2145 lines, and they are ENTIRELY the data FIFO: + + < ACC 05600080 FFFF 3FB2A0C0 (white) + > ACC 05600080 0000 3FB2A0C0 (black) + ... repeated for the ~256 payload words + +Every other register line is identical between the two fills: + + 0x5600020 0248 / 0258 (constants) + 0x5600030 0032 0033 0432 0233 ... (control sequencing, identical) + 0x5600100 0000 0001 0002 0008 0200 0201 0202 (identical) + 0x5600010 polled identically + 0x5600200 read identically (values differ only in what the model returns) + +So: **the ONLY fill-dependent engine port is the data FIFO (0x5600080).** No +placement, geometry or destination register differs between a white and a black +export -- the engine is never told where to put the pixels per export. + +That is why implementing "the missing store" in accel_r/accel_w is not possible +from the traffic: there is no address to key it on. The engine must place output +using state established outside this per-export register window (its own internal +registers, set once), which is exactly the device model that does not exist. + +STATE + * NO client-chosen XIE image has ever been displayed; + * VRAM byte-identical for white and black (0 differing bytes / 128 KiB); + * model opt-in (VT1200_ACCEL=1); default unchanged; + * xshow (core X) is the only viewer that has shown an image. diff --git a/xie/evidence/CLIENT_DATA_IN_SERVER.txt b/xie/evidence/CLIENT_DATA_IN_SERVER.txt new file mode 100644 index 0000000..a630732 --- /dev/null +++ b/xie/evidence/CLIENT_DATA_IN_SERVER.txt @@ -0,0 +1,41 @@ +MILESTONE: CLIENT-CHOSEN PIXEL DATA IS NOW VERIFIED INSIDE THE XIE SERVER, +DISTINCT FOR SOLID-WHITE AND SOLID-BLACK, WITH NO DEBUG POKES. + +THE RECIPE (all client requests, no pokes, reproduces): + 1. InitSession minor 1, 2 words [major=2 | minor=3<<16] + 2. CreatePhoto (photomap) minor 8, 12 words [type=2, id, w=64, h=64, + 0,0, w6=1, 0,0, 0x100, 0] + 3. SetTransport minor 20, 35 words [photo_id, 0, 0, plane_mask=1, + zeros x6, zeros x24] with + word2 = (mode=3 << 8) | (component_organization=1 << 16) + pixel_stride[0] = 1, scanline_stride[0] = 8 + 4. PutTile minor 19, 8 + 128 words + [photomap, x=0, y=0, w=64, h=64, plane_mask=1, final=TRUE] + + 128 words of tile data + +RESULT -- the server's own element buffer: + white tile: element+0x28 = 008F8B90 + buffer[0..48] = ffffffff... (48 bytes, distinct = {255}) + black tile: element+0x28 = 008F8B90 + buffer[0..48] = 00000000... (48 bytes, distinct = {0}) + + QueryResource on the photomap: w=64 h=64 comp_COUNT=1 constrained=1 + + And at export, the render driver reports a real source for the first time: + RD_ENTRY + RD_ENAB flag=1 + RD_ALLOC rp=008FD090 + RD_SRCBASE a5=003FD590 e28=002909B0 + RP a11=008FD090 src_base610=002909B0 <-- previously always 0 + (src_base = *(element+0x28), per the store at 0x1B238.) + +WHY IT WAS ALWAYS ZERO BEFORE: transport `component_organization` selects a +handoff branch; org=4 (XieK_BitByPlane) makes the handoff clear element+0x28 +(0x6B8D6), while **org=1 preserves it**. With org=1 the source survives to the +renderer. Earlier traces showed src_base "-" only because the RP breakpoint was +not in that run's set. + +STILL NOT DISPLAYED: Export (minor 21) returns err2, and framebuffer captures of +the 64x64 window are unchanged (white vs black differ by 1186 px = the Terminal +Manager's own figures and the cursor). The remaining failure is on the export +side, AFTER the renderer has a valid populated source. diff --git a/xie/evidence/CONTROL_REGS_NOT_STAGING.txt b/xie/evidence/CONTROL_REGS_NOT_STAGING.txt new file mode 100644 index 0000000..06e5164 --- /dev/null +++ b/xie/evidence/CONTROL_REGS_NOT_STAGING.txt @@ -0,0 +1,29 @@ +THE ENGINE IS NOT PROGRAMMED WITH THE STAGING ADDRESS. + +Logged every write to the accelerator's control registers for a white and a black +export, with the writing PC: + + fill=ff + 0x5600020: 0248@3F3B6090 0248@3F3B6A00 0258@3FB16EF0 + 0x5600030: 0032@3F3B60E0 0033@3F3B6420 0032@3F3B6C00 + 0432@3FB29FD0 0633@3FB2A130 0233@3FB2A1E0 + 0032@3FB2A790 0032@3FB16F40 0233@3FB17260 + fill=00 + identical sequence (0x248 / 0x258 / 0x32 / 0x33 / 0x432 / 0x633 / 0x233 ...) + +Neither register, in either fill, carries anything derived from the staging +address 0x004FE790 (which would appear as the halves 0x4FE7 / 0x9070). The +sequences are fill-independent. + +So the "engine fetches the staged buffer" hypothesis is dead: there is nothing to +add to accel_w. The engine is programmed with small scalars only, and the staged +pixels are discarded. + +STATE + * NO client-chosen XIE image has ever been displayed; + * fill-dependent proof: client -> photomap -> FIFO -> engine output -> CPU store + into staging (283 x 0xFFFF for white vs mostly 0x0000 for black); + * staging is overwritten; VRAM never differs (0 bytes / 128 KiB); + * no register carries a source/destination address for the engine; + * model opt-in (VT1200_ACCEL=1); default configuration unchanged; + * xshow (core X) is the only viewer that has shown an image. diff --git a/xie/evidence/CORRECTION_TILE_NOT_IN_VRAM.txt b/xie/evidence/CORRECTION_TILE_NOT_IN_VRAM.txt new file mode 100644 index 0000000..ee185a5 --- /dev/null +++ b/xie/evidence/CORRECTION_TILE_NOT_IN_VRAM.txt @@ -0,0 +1,31 @@ +CORRECTION: THE "TILE IN VRAM" READING WAS WRONG. THE EXPORT DOES NOT WRITE IT. + +Read VRAM at 0x04017830 after a WHITE export and after a BLACK export, in the +same session: + + fill=ff : 0x04017830 = effefffffdffffff + fill=00 : 0x04017830 = effefffffdffffff <-- IDENTICAL + +Identical for both fills means those bytes are NOT the exported tile -- they are +ambient VRAM content (the Terminal Manager's own screen), which merely happens to +be mostly 0xFF in that region. My previous turn reported "the tile is in VRAM" +from a single read of 0xFF bytes; that conclusion does not survive the white/black +comparison and is withdrawn. + +Likewise the 18,338 VRAM writes observed "during the export cycle" are the +window-creation / Terminal-Manager repaint, in the same way the earlier 43,882 +figure was (see VRAM_WRITE_ATTRIBUTION.txt). The export's own contribution is +not separable from that traffic and does not carry the tile. + +WHAT ACTUALLY STANDS (all reproducible): + * import verified in the server: element+0x28 = 0xFF white / 0x00 black; + * export completes without error, under the opt-in VT1200_ACCEL=1 model only; + * source pixels do reach the accelerator FIFO (0x5600080 writes containing + 0xFFFF / 0x0000) and are staged into main RAM at 0x004FE790; + * nothing puts them on screen: the 64x64 window is unchanged, and white vs + black captures differ only by Terminal Manager figures and cursor. + +STATE + * NO client-chosen XIE image has ever been displayed; + * model opt-in; default configuration unchanged; + * xshow (core X) remains the only viewer that has shown an image. diff --git a/xie/evidence/DDX_MODULE_INSTRUMENTED.txt b/xie/evidence/DDX_MODULE_INSTRUMENTED.txt new file mode 100644 index 0000000..dc9dbda --- /dev/null +++ b/xie/evidence/DDX_MODULE_INSTRUMENTED.txt @@ -0,0 +1,56 @@ +FULL DDX MODULE INSTRUMENTATION -- THE FIRMWARE NAMES THE FAILURE. + +1) WHERE THE EXPORT ACTUALLY DIES + The trace showed the cleanup/return block's call 0x7E75EA8 returning 2: + after 7F67F38 a8=00001441 + after 7E75EA8 a8=00000002 <-- returns BadValue + after 7EA45FE a8=00000000 + after 7E7FE96 a8=00000000 + RET a8=00000002 + file 0x7E75EA8 - 0x7E40000 = **file 0x35EA8**, which is the DDX render entry + (the CALLA is made with the constant 0xa6000, the render-params table). + +2) THE DDX MODULE'S OWN DIAGNOSTIC STRINGS (extracted from vt1200_v22.bin) + file 01C6DF "error allocating renderparams block" + file 01C775 "RenderSetupPipe: %d ms" + file 01C877 "RenderSetup: %d ms" + file 037156 "DDX_RENDER: unsupported compression scheme" + file 037185 "DDX_RENDER: renderptr->src_base == NULL == %x" + file 03722E "DDX_RENDER: error allocating tmpudp or smiconvert to dst_photo" + These are the three DDX_RENDER failure modes, in that order. + +3) WHICH ONE FIRES -- MEASURED + Instrumented inside DDX_RENDER (file 0x35EA8): + CLS 0x35F0E reads *A11(0x630) (renderptr byte 198) + F610 0x35F2A reads *A9(0x610) (renderptr byte 194) + ERR2 0x35EF2 -> prints string 0x3F3B8AB0 = "unsupported compression scheme" + ERR610 0x35F30 -> prints 0x3F3B8C28 = "renderptr->src_base == NULL == %x" + Live run (genuine DEC client, export with and without a colormap): + + DDX class=85 (0x55) -> DDX_BADVALUE_class -> DDX_RET a8=00000002 + DDX class=115 (0x73) -> DDX_BADVALUE_class -> DDX_RET a8=00000002 + DDX class=123 (0x7B) -> DDX_BADVALUE_class -> DDX_RET a8=00000002 + + The dispatch validates renderptr byte 198 against {0,1,2,3} (mapping to + 5/0/1/3) and rejects anything else. The values read are **0x55 / 0x73 / + 0x7B** -- the heap fill pattern and heap residue, i.e. renderptr byte 198 is + NEVER INITIALISED. So the reported failure is literally + "DDX_RENDER: unsupported compression scheme" with a garbage scheme. + +4) WHAT THAT MEANS + The render-params block (allocated by the export path; the firmware even has + a message for failing that) is handed to DDX_RENDER with its compression-scheme + field unwritten. Everything the client can set -- transport mode/scheme, + photomap compression (XieK_PCM=0), levels, organisation, drawable, GC, depth, + geometry -- has been verified correct, and the imported data is present + (element+0x28 = 0xFF white / 0x00 black). + + Passing colormap_id (DefaultColormap) instead of 0 changes the garbage value + but not the outcome: still uninitialised, still rejected. + +5) STATE + No client-chosen image displayed. Window untouched; white vs black captures + differ only by Terminal Manager figures and cursor. + xshow (core X) is the only viewer that has shown an image. + +This is the firmware's own diagnosis, not an inference from absence. diff --git a/xie/evidence/DDX_progress_with_compression_fixed.txt b/xie/evidence/DDX_progress_with_compression_fixed.txt new file mode 100644 index 0000000..2bfae3a --- /dev/null +++ b/xie/evidence/DDX_progress_with_compression_fixed.txt @@ -0,0 +1,39 @@ +WITH THE COMPRESSION FIELD CORRECTED, THE RENDERER ADVANCES PAST BOTH ITS FIRST +CHECKS -- AND STILL FAILS LATER. + +A) ROOT CAUSE (measured end to end) + render setup 0x1B256: rp byte 198 <- element byte 4 (element = 0x3FD590) + live: W256 a5=003FD590 val=55 rp=00291550 + RD198 rp=00291550 b198=55 + element byte 4 is 0x55 = heap fill, i.e. NEVER INITIALISED, and the firmware + copies it verbatim into renderptr->compression_scheme. + +B) FORCING THE DEFINED VALUE (labelled debug poke: element.byte4 = 0 = XieK_PCM) + at the copy site 0x1B256: + FORCED b4=0 rp=00291550 + CHK_610 val=00911050 ; renderptr->src_base is NON-ZERO + PAST_610_OK ; the src_base check passes + So with compression corrected the two DDX_RENDER gates + "unsupported compression scheme" and "renderptr->src_base == NULL" + both pass. This confirms the diagnosis: the first failure really was the + uninitialised compression field. + +C) STILL FAILING AFTERWARDS + Export still returns BadValue, and the third documented DDX string + "DDX_RENDER: error allocating tmpudp or smiconvert to dst_photo" + (file 0x3722E, referenced at file 0x37126) does NOT fire either. + So a further BadValue is raised after both gates, on a path not covered by + the three strings the firmware carries. + +D) WHAT IS NOW PROVEN + * The client, the request, the transport, the photomap, the drawable, the GC, + the depth, the geometry and the imported data are all correct (unchanged + across ~40 turns of measurement). + * The export's first failure is a server-side uninitialised field + (band element byte 4), copied into the render params as the compression + scheme and rejected by DDX_RENDER's first validation. + * Correcting that field moves the renderer past both of its first gates. + +STATUS. NO client-chosen XIE image has been displayed. Window unchanged; +white vs black captures differ only by Terminal Manager figures and cursor. +xshow (core X) remains the only viewer that has shown an image. diff --git a/xie/evidence/DEC_23_SOURCE_AND_CREATE_FIXED.txt b/xie/evidence/DEC_23_SOURCE_AND_CREATE_FIXED.txt new file mode 100644 index 0000000..562af56 --- /dev/null +++ b/xie/evidence/DEC_23_SOURCE_AND_CREATE_FIXED.txt @@ -0,0 +1,54 @@ +MAJOR: DEC XIE 2.3 CLIENT **AND SERVER** SOURCE OBTAINED; THE CREATE REQUEST IS +NOW DECODED EXACTLY AND levels IS FIXED (was 1, now 2). + +A) SOURCE (peer session, from OSF/1 2.0 source kits; copied to xie/docs/dec/xie23-src/) + include/ XieProto.h (XieK_MajorVersion 2 / MinorVersion 3) etc. + lib/xie/ XIElib client library, 9,723 lines (9 C files) + server/xie/ 107 files -- the server: XieDisplay.c, XieTransport.c, + XieResource.c, and smi/ (SmiConvert.c SmiCrop.c SmiScale.c + SmiRotate.c SmiPipe.c ...), plus decimage-ids/ glue. + This is the actual implementation of the code I have been disassembling. + +B) THE CREATE REQUEST IS `xieCreatePhotoReq` (48 bytes = 12 words): + +4 resource_type +8 resource_id +12 width +16 height + +20 aspect_ratio (XieFloatRec, 8 bytes) + +28 levels[XieK_MaxComponents=3] (12 bytes) + +40 number_of_components +41 component_mapping + +42 pixel_progression +43 line_progression + +44 polarity +45 pad[3] + So in 32-bit data words: + w0 type, w1 id, w2 width, w3 height, w4/w5 aspect, w6 levels[0], + w7 levels[1], w8 levels[2], + w9 = noc | map<<8 | pxprog<<16 | lnprog<<24, w10 = polarity + MY OLD PAYLOAD SET w6=1 (levels[0]=1 => 0 bits/pixel) and w9=0x100 + (number_of_components = 0). Corrected to: + levels = (2,2,2), noc=1, component_mapping=XieK_Bitonal(1), + pxprog=XieK_BandByPixel(1), lnprog=XieK_BandByLine(2), polarity=1 + VERIFIED: QueryResource now reports levels=(2, ...) and comp_COUNT=1 + (it was levels=(1, ...) before). + +C) SERVER EXPORT PATH (XieDisplay.c) -- now read from source, not inferred + ProcExport: LookupPhotos_ -> MatchOkIf_(Constrained_(img)) + x=max(src_x,0); y=max(src_y,0); + w=min(src_x,0)+width; h=min(src_y,0)+height; + w = Width_(img) < x+w ? Width_(img) -x : w; + h = Height_(img) < y+h ? Height_(img)-y : h; + ValueOkIf_( w > 0 && h > 0 ) <- the only BadValue here + CreateExportContext(...) ; Format(...) ; Export(...) + CreateExportContext contains NO ValueOkIf_ at all, and XieDisplay.c contains + no BadValue literal -- so a BadValue must come from a callee + (CvtZPixmap -> DdxConvert_ -> SmiConvert). + Checked: SmiConvert's unsupported path returns **BadImplementation (17)**, not + BadValue(2). So that is not the source either. + +D) STILL OPEN: what returns 2. The candidates are now a small set inside the + conversion/export callees, and the source makes this readable rather than + guessable. + +STATE + import verified (element+0x28 = 0xFF white / 0x00 black) + create now correct (levels=2, noc=1) + export still err2 ; window never changes ; white vs black AE = 2040 (stats+cursor) + xshow (core X) remains the only viewer that has displayed an image + +STATUS. NO client-chosen XIE image. diff --git a/xie/evidence/DEC_IDS_SEQUENCE_PIXMAP.txt b/xie/evidence/DEC_IDS_SEQUENCE_PIXMAP.txt new file mode 100644 index 0000000..61196d5 --- /dev/null +++ b/xie/evidence/DEC_IDS_SEQUENCE_PIXMAP.txt @@ -0,0 +1,41 @@ +DEC'S OWN IDS CLIENT SHOWS THE CORRECT DISPLAY SEQUENCE -- EXPORT INTO A PIXMAP. + +Newly read (never used before): decimage-ids/ids_build_xie_pipe.c, DEC's own +client-side pipeline assembler. The calls it makes: + + XieCrop, XieScale, XieRotate, XieTranslate -- pipeline elements + XieTapFlo(Photo_(xiectx), True) -- TAP the photoflo (3 sites) + XieSelectEvents(... XieM_ComputationEvent | XieM_DisplayEvent | ...) + XieExport(Photo_(xiectx), CPix_(xiedat), RPixGC_(phoctx), 0,0, 0,0, w, h, ...) + XieQueryExport + XiePutImage + XieFreeResource + +Two findings, both new to this work: + +1. **Export targets a PIXMAP, not the window.** DEC exports into CPix_/RPix_ + (an X pixmap) and then the caller copies it. This matches the manual's + "XIEP_EXPORT creates a new server PIXMAP resource object" and explains why + exporting straight to the window was never right. + +2. **The photoflo is TAPPED (XieTapFlo) and elements are added to it** + (Crop/Scale/Rotate/Translate) before export -- the pipeline model the manual + describes, which the hand-built client never used. + +IMPLEMENTED AND TESTED + decclient now supports the pixmap path (argv[4]=1): + XCreatePixmap(depth 1) -> XieExport(photomap, pixmap, gc, ...) + -> XCopyArea(pixmap, window) + Both fills run clean: + exporting to PIXMAP / export sent (pixmap) / copyarea sent (no X errors) + but the framebuffer is still unchanged: white vs black AE = 2600 (TM figures + and cursor only). + +So the request sequence is now the real one, and it completes -- the pixmap is +simply empty because the accelerator performs no pixel transfer. + +STATE + * NO client-chosen XIE image has ever been displayed; + * VRAM byte-identical for both fills (0 differing bytes / 128 KiB); + * model opt-in (VT1200_ACCEL=1); default configuration unchanged; + * xshow (core X) is the only viewer that has shown an image. diff --git a/xie/evidence/DESTINATION_IS_MAIN_RAM.txt b/xie/evidence/DESTINATION_IS_MAIN_RAM.txt new file mode 100644 index 0000000..e9abd63 --- /dev/null +++ b/xie/evidence/DESTINATION_IS_MAIN_RAM.txt @@ -0,0 +1,32 @@ +THE ENGINE'S OUTPUT GOES TO MAIN RAM, NOT VRAM -- AND OUR PIXELS DO NOT LAND. + +Instrumented the read-back loop at file 0x125528 during a completing export: + + 0x125528 MOVE *B6,*B1 ; engine output port 0x5600200 -> *B1 + 0x12552A ADDK 0x10,B1 ; advance one word + 0x12552C DSJS A11,0x125528 + +Measured destination pointer: + DST b1=004FE790 b2=3FB2ACF0 a6=00000000 + DST b1=004FE7A0 ... + distinct b1: first=004FE790 last=004FE980 + inside VRAM (0x04000000..0x1fffffff): FALSE + +So B1 is a MAIN RAM buffer (0x004FE790..0x004FE980, ~0x200 words), i.e. the +engine's result is staged in RAM and something else is expected to move it to the +frame buffer. The 384 reads of 0x5600200 come from exactly this loop (384 == the +a1 argument seen at the routine entry). + +CHECKED: after a white export, the staging buffer does NOT contain 0xFFFF -- +0x004FE790 holds pointer-like garbage instead. So either the read-back returns +the wrong thing, or this path is not the one that carries the tile. + +STATE + * export completes without error (opt-in VT1200_ACCEL model); + * source pixels do reach the accelerator FIFO (0xFFFF / 0x0000 verified); + * the engine's output is staged to main RAM at 0x004FE790 (destination located); + * the staged data is not our tile, and nothing writes the tile to VRAM; + * NO client-chosen XIE image has ever been displayed; white vs black captures + differ only by Terminal Manager figures and cursor; + * model opt-in; default configuration unchanged; + * xshow (core X) is still the only viewer that has shown an image. diff --git a/xie/evidence/EXPORT_COMPLETES.txt b/xie/evidence/EXPORT_COMPLETES.txt new file mode 100644 index 0000000..f25a4a5 --- /dev/null +++ b/xie/evidence/EXPORT_COMPLETES.txt @@ -0,0 +1,38 @@ +MILESTONE: THE XIE EXPORT REQUEST NOW COMPLETES WITHOUT ERROR. + +With VT1200_ACCEL=1 and the accelerator status model reporting + bit 1 initialised (polled at file 0x122E54) + bit 2 transfer complete (polled at 0x125448) + bit 9 done (polled at 0x1253FC and on other control registers) + bit 0 data ready, as a LATCH -- raised by a FIFO command write (0x5600080), + cleared by the first FIFO data write (0x5600050) + +the client reports, for BOTH fills: + + display 192.168.99.2:0 opened (root depth 1) + image: org=3 w=64 h=64 levels=2,0,0 arSize=4096 + photomap created + put tile sent + export sent (with colormap) <-- NO X ERROR + +Previously every export returned BadValue(2) or BadMatch(8). The request is now +accepted and the whole DDX render path runs to completion. + +WHAT IS STILL MISSING + The framebuffer does not change: white vs black captures differ by ~2486 px, + which is the Terminal Manager's own figures and the cursor, not the 64x64 + window. The accelerator model reports status honestly but performs no pixel + transfer -- it has no idea of destination, geometry or data format, and the + 154-write command stream to 0x5600080 has not been decoded. + + So the protocol layer is now complete end to end; what remains is the pixel + engine itself. + +STATE + * default configuration unchanged and verified (model is opt-in). + * NO client-chosen XIE image displayed yet. + * xshow (core X) remains the only viewer that has shown an image. + +NEXT: decode the 0x5600080 command stream (154 writes captured earlier) to learn +destination address/geometry, then implement the FIFO -> framebuffer copy in +accel_w so the transfer actually paints. diff --git a/xie/evidence/EXPORT_NOW_WRITES_VRAM.txt b/xie/evidence/EXPORT_NOW_WRITES_VRAM.txt new file mode 100644 index 0000000..021f95e --- /dev/null +++ b/xie/evidence/EXPORT_NOW_WRITES_VRAM.txt @@ -0,0 +1,41 @@ +WITH THE ENGINE-OUTPUT READ PATH MODELLED, THE EXPORT NOW WRITES THE TILE INTO VRAM. + +Found and implemented the last link in the data path: + + file 0x125528: MOVE *B6,*B1 ; ADDK 0x10,B1 ; DSJS A11,0x125528 + B6 = 0x5600200 (engine output port), B1 = a main-RAM staging pointer + (measured 0x004FE790, ~0x200 words). + + So the engine's OUTPUT port must return the pixels pushed into the FIFO; the + firmware then stores them. My model returned a status word there, which is + why nothing carried through. Now accel_r returns the FIFO contents for + 0x5600200. + +MEASURED AFTER THE CHANGE + * staging buffer 0x004FE790: receives the tile -- 250 writes of 0xFFFF in a + white export (earlier my peek showed garbage because it is overwritten later). + * VRAM writes during one export cycle, white tile: + before: 241 words + after: 18,338 words, containing 0xFFFF at e.g. 0x04017830/40/50 + The dominant writer is pc=3F7421E0 (file 0xA843C). + * export still completes with no error. + +So the chain now runs end to end: + client -> XIE -> photomap -> accelerator FIFO -> engine output -> staging -> + VRAM writes (18,338 words carrying the tile). + +WHAT STILL DOES NOT HAPPEN + The framebuffer capture does not show the tile: white vs black differ by + AE 3130 px (Terminal Manager figures + cursor only). The written addresses + (0x040178xx) map, at the renderer's VRAM319 pitch of 2048 bits, to about + (x=48, y=47) -- an area the Terminal Manager repaints, and nothing of the + client's 64x64 window appears there or at (150,200). + + Either the writes are to a region that is subsequently repainted, or the + coordinate/pitch mapping between the accelerator's destination and the + renderer's active picture is still wrong. + +STATE + * NO client-chosen XIE image displayed; + * model opt-in (VT1200_ACCEL=1); default configuration unchanged; + * xshow (core X) remains the only viewer that has shown an image. diff --git a/xie/evidence/FILL_DATA_REACHES_CPU_ONLY.txt b/xie/evidence/FILL_DATA_REACHES_CPU_ONLY.txt new file mode 100644 index 0000000..4cdfee0 --- /dev/null +++ b/xie/evidence/FILL_DATA_REACHES_CPU_ONLY.txt @@ -0,0 +1,28 @@ +THE FILL-DEPENDENT DATA REACHES THE CPU READBACK -- AND STOPS THERE. + +Engine output port 0x5600200, read 384 times per export (pc file 0x12552A), +values captured per fill: + + fill=ff : 384 reads -> FFFF x256, 0000 x65, 0001 x3, 0091 x3 + fill=00 : (cumulative) -> 0000 x213, FFFF x262, 0032 x29, 0091 x14 + +So the readback IS fill-dependent: a white tile yields ~256 words of 0xFFFF from +the engine, a black tile yields 0x0000. The data therefore travels: + + photomap (element+0x28 = FF/00) fill-dependent [verified] + accelerator FIFO (0x5600080) fill-dependent [verified] + engine output (0x5600200 -> CPU) fill-dependent [verified here] + + staging buffer (0x004FE790) NOT fill-dependent [802 identical writes] + VRAM 0x04000000..0x0401FFFF NOT fill-dependent [0 differing bytes] + +So the loss is between the CPU's read of the engine output and video memory. The +routines that read the staging buffer (file 0x1255BA inside the transfer routine, +0x182D94, 0x1288DA, 0x128B0A) are byte/word copy loops, and none of them was +observed producing fill-dependent VRAM traffic. + +STATE + * NO client-chosen XIE image has ever been displayed; + * export completes only under the opt-in VT1200_ACCEL=1 model; + * default configuration unchanged; xshow (core X) is the only viewer that has + shown an image. diff --git a/xie/evidence/IDS_LAYER_NOT_BUILDABLE.txt b/xie/evidence/IDS_LAYER_NOT_BUILDABLE.txt new file mode 100644 index 0000000..60f8693 --- /dev/null +++ b/xie/evidence/IDS_LAYER_NOT_BUILDABLE.txt @@ -0,0 +1,31 @@ +THE DECimage IDS LAYER CANNOT BE BUILT: ITS HEADERS ARE NOT IN THE MEDIA. + +ids_build_xie_pipe.c / ids_render_xie.c / ids_xieimage_ddif.c include: + + -- NOT PRESENT + -- NOT PRESENT + -- NOT PRESENT + +Searched the whole dec-media tree (which does contain the XIE 2.3 client and +server sources, XIE/PEX/Xmu/Xaw headers): + find . -name idsprot.h -o -name ImgDef.h -o -name ImgEntry.h -> nothing + find . -type d -name img -> nothing + +The IDS sources depend on symbols those headers define, e.g. + ImgDef, ImgDeleteFrame, ImgScale, ids__widget +i.e. DEC's Image Utility Library / DECimage application API -- a separate +product from the XIE extension kit that was recovered. + +So this is not a matter of wiring up the three .c files: the API they build on +(the DECimage Image Utility Library headers, and the library itself) is absent +from every artifact available here. The suggested "build and run the IDS layer" +step is therefore blocked by a demonstrable missing dependency, not by a +judgement call. + +STATE + * NO client-chosen XIE image has ever been displayed; + * VRAM byte-identical for white vs black (0 differing bytes / 128 KiB); + * public XieCrop/XieTapFlo/XieBindMapToFlo SIGSEGV without the IDS xiec ctx; + * the IDS layer itself needs headers that do not exist in the media; + * accelerator model opt-in (VT1200_ACCEL=1); default unchanged; + * xshow (core X) is the only viewer that has shown an image. diff --git a/xie/evidence/MiEncodeDouble_and_create_layout.txt b/xie/evidence/MiEncodeDouble_and_create_layout.txt new file mode 100644 index 0000000..3a4351c --- /dev/null +++ b/xie/evidence/MiEncodeDouble_and_create_layout.txt @@ -0,0 +1,43 @@ +TURN RECORD: TWO DEFECTS FIXED FROM THE DEC 2.3 SOURCE; DISPLAY STILL FAILS. + +A) CREATE REQUEST LAYOUT (from include/XieProto.h, xieCreatePhotoReq) + +4 type +8 id +12 width +16 height +20 aspect_ratio(8) + +28 levels[3] +40 #components +41 component_mapping + +42 pixel_progression +43 line_progression +44 polarity + I had been sending levels[0]=1 (=> 0 bits/pixel) and #components=0. + Corrected to levels=(2,2,2), #components=1, XieK_Bitonal(1), + BandByPixel(1)/BandByLine(2), polarity=1. + VERIFIED: QueryResource now reports levels=(2,...) and comp_COUNT=1. + +B) XieFloatRec ENCODING (from lib/xie/XieFloat.c, MiEncodeDouble) + ptr->m_sign = (mantissa >= 0.0) <- 1 means POSITIVE + ptr->mantissa = 2^(8*sizeof-1) * f + 0.5, then <<= 1 + ptr->e_sign = (exponent >= 0) + ptr->exponent = |exponent| + So MiEncodeDouble(0.0) is bytes 01 01 00 00 | 00 00 00 00 (= words + 0x00000101, 0x00000000), NOT all zeros as I had been sending for + match_limit/gray_limit in every export. + +C) RESULT WITH BOTH FIXED + create levels=(2,...) comp_COUNT=1 + SetTransport(mode=3, org=1) -> ok + PutTile -> ok + Export (with properly encoded match/gray) -> err2 + window unchanged; white vs black AE = 2040 (Terminal Manager + cursor) + src_base non-zero (002909B0 / 0092B210) + +D) WHAT THE SERVER SOURCE SAYS ABOUT THE REMAINING err2 + XieDisplay.c ProcExport has exactly ONE BadValue: ValueOkIf_(w>0 && h>0), + and that check is measured passing. CreateExportContext contains no + ValueOkIf_ at all; XieDisplay.c contains no BadValue literal; Export() + returns Success when photo_lut_id == 0 (no LUT). SmiConvert's unsupported + path returns BadImplementation(17), not 2. + So the 2 is produced in the Format/CreateExportContext callees, which is now + a small, readable set. + +STATUS. NO client-chosen XIE image. xshow (core X) remains the only viewer +that has displayed an image. + +SOURCE NOW AVAILABLE (copied to xie/docs/dec/xie23-src/, 3.5 MB): + include/, lib/xie/ (client, 9,723 lines), server/xie/ (server incl. smi/), + decimage-ids/ (DEC's own pipeline assembler ids_build_xie_pipe.c). diff --git a/xie/evidence/PIPELINE_CRASH_DIAGNOSED.txt b/xie/evidence/PIPELINE_CRASH_DIAGNOSED.txt new file mode 100644 index 0000000..643025e --- /dev/null +++ b/xie/evidence/PIPELINE_CRASH_DIAGNOSED.txt @@ -0,0 +1,30 @@ +PIPELINE PATH CRASH DIAGNOSED -- IT NEEDS A FULL IDS CONTEXT, NOT JUST A FLO. + +gdb backtraces (decclient argv[4]=2): + + attempt 1: XieCrop(pm,0) -> XieTapFlo(crop,1) + SIGSEGV in XieTapFlo () [crop had no flo link] + + attempt 2: XieCreatePhoto(XieK_Photoflo) -> XieBindMapToFlo(flo, pm) + -> XieCrop(flo,0) -> XieTapFlo(...) + SIGSEGV in XieBindMapToFlo () [before any element work] + (the photoflo itself was created: printed photoflo=555555580770) + +So the DEC library's element/bind entry points fault when driven from a +hand-built client, even in the order DEC's IDS code implies. Reading +ids_build_xie_pipe.c shows why: the IDS layer maintains a full xiectx/phoctx +context (XieIdc templates, destination resolution via _XieGetDst, taps created +on an already-populated chain) -- this is not a short sequence of public calls, +it is the DECimage application library driving them. + +CONCLUSION: this avenue cannot be exercised without building the IDS layer +(ids_build_xie_pipe.c + ids_render_xie.c + ids_xieimage_ddif.c, ~4,700 lines with +unsatisfied external dependencies), which is a separate integration project. + +STATE + * NO client-chosen XIE image has ever been displayed; + * pixmap export path runs clean but paints nothing (engine does no transfer); + * pipeline/bind path faults inside libXie; + * VRAM byte-identical for white and black (0 differing bytes / 128 KiB); + * accelerator model opt-in (VT1200_ACCEL=1); default unchanged; + * xshow (core X) is the only viewer that has shown an image. diff --git a/xie/evidence/PIPELINE_PATH_CRASHES.txt b/xie/evidence/PIPELINE_PATH_CRASHES.txt new file mode 100644 index 0000000..c615d6b --- /dev/null +++ b/xie/evidence/PIPELINE_PATH_CRASHES.txt @@ -0,0 +1,27 @@ +THE PIPELINE (CROP/TAP) PATH CRASHES -- LAST UNTESTED AVENUE CLOSED. + +Read DEC's own IDS sequence (ids_build_xie_pipe.c): + SPhoto_(xiectx) = XieTapFlo( XieCrop( Photo_(xiectx), 0 ), True ); + XieExport( Photo_(xiectx), CPix_(xiedat), RPixGC_(phoctx), ... ); + +Implemented as decclient argv[4]=2: + XiePhoto crop = XieCrop(pm, 0); + XiePhoto tap = XieTapFlo(crop, 1); + XieExport(tap, pixmap, gc, ...); XCopyArea(...); + +RESULT (both fills, identical): + display opened / image created / photomap created / put tile sent + ... then the process CRASHES (core dumped) inside XieCrop/XieTapFlo. + +So this path is not usable with a plain Class-2 photomap: XieCrop expects a +photoflo/photo context that the hand-built client does not establish, and the +crash is inside the library, before any request that could be inspected. + +STATE + * NO client-chosen XIE image has ever been displayed; + * pixmap-export path (argv[4]=1) runs clean but paints nothing (engine does no + transfer); + * crop/tap pipeline path crashes in the client library; + * VRAM byte-identical for white and black (0 differing bytes / 128 KiB); + * accelerator model opt-in (VT1200_ACCEL=1); default unchanged; + * xshow (core X) is the only viewer that has shown an image. diff --git a/xie/evidence/PIXEL_DATA_REACHES_ACCELERATOR.txt b/xie/evidence/PIXEL_DATA_REACHES_ACCELERATOR.txt new file mode 100644 index 0000000..4a18457 --- /dev/null +++ b/xie/evidence/PIXEL_DATA_REACHES_ACCELERATOR.txt @@ -0,0 +1,45 @@ +MILESTONE: THE IMAGE DATA NOW ACTUALLY STREAMS INTO THE ACCELERATOR. + +File 0x12538C (called from 0x36DD2) is the transfer routine. It sets up its own +register pointers, which identifies the whole interface: + + B3 = 0x5600100 command + B4 = 0x5600030 control + B5 = 0x5600010 status + B6 = 0x5600200 engine output port (read 384x) + A5 = 0x5600080 FIFO / parameter port + A6 = 0x5600050 data register + + 0x1253FA MOVE A7,*A6 ; data register + 0x1253FC poll bit9 (done) / bit0 (ready) / error mask 0x450 + 0x125412 MOVI 0x7FE,B8 + MOVE *A0,*A5 ; ADDK 0x10,A0 ; DSJS ; SOURCE PIXELS -> FIFO + 0x12541C set bit0 of 0x5600030 + +i.e. A0 is the source pointer and the pixels are pushed into 0x5600080 in bursts +of 0x7FE words. My previous constant-"done" status made the code jump straight +past this loop, which is why the FIFO only ever saw the 154-word parameter table. + +After modelling the handshake (data register write -> ready; FIFO consumed +0x7FE words -> done) the SAME export produces: + + FIFO (0x5600080) writes: 154 -> 2200 (white run) + 154 -> 4400 (black run, two exports) + + white: 0xFFFF appears 348 times in the stream + black: 0x0000 dominates (1685), 0xFFFF only 348 (leftover from the previous run) + +So the client-chosen pixel data is now genuinely flowing into the accelerator. + +WHAT REMAINS + The engine is responsible for writing those pixels to the drawable. The + destination is not in any register we have seen (the data register 0x5600050 is + written once with 0, and 0x5600020 carries only 0x248/0x258), so the + destination/geometry still has to be derived from the caller at 0x36D90 and the + engine's own output port (0x5600200, read 384x). + +STATE + * export completes with no error; pixel data reaches the accelerator; + * framebuffer still unchanged -- NO client-chosen XIE image displayed; + * model opt-in (VT1200_ACCEL=1); default configuration intact; + * xshow (core X) remains the only viewer that has shown an image. diff --git a/xie/evidence/ROOT_CAUSE_element_byte4.txt b/xie/evidence/ROOT_CAUSE_element_byte4.txt new file mode 100644 index 0000000..17d0caa --- /dev/null +++ b/xie/evidence/ROOT_CAUSE_element_byte4.txt @@ -0,0 +1,43 @@ +ROOT CAUSE, MEASURED END TO END. + + render setup (render driver, file 0x1B152): + 0x1B256 MOVB *A5(0x20),*A11(0x630) ; rp byte 198 <- element byte 4 + DDX render (file 0x35EA8): + 0x35F0E A8 = *A11(0x630) ; read it back + 0x35F12..0x35F1E accept 0,1,2,3 only + 0x35EF2 -> "DDX_RENDER: unsupported compression scheme" -> BadValue + + LIVE TRACE (genuine DEC 2.3 client, export to a depth-1 window): + W256 a5=003FD590 val=55 rp=00291550 + RD198 rp=00291550 b198=55 + -> DDX_BADVALUE_class -> DDX_RET a8=00000002 -> client BadValue + +So the chain is exact: + element byte 4 (uninitialised = 0x55 heap fill) + -> copied verbatim into renderptr->compression_scheme + -> DDX_RENDER's very first validation rejects it + -> export returns BadValue before src_base is even examined. + +The render-params block IS written, and the writer is identified; the value it +copies is garbage because the BAND ELEMENT's byte 4 was never initialised. +(The element is 0x3FD590, the same band element whose +0x28 holds the imported +image; its byte 4 should be the compression scheme, XieK_PCM = 0.) + +WHY THIS EXPLAINS EVERYTHING SEEN + * every client-side attribute is correct (transport mode 3, scheme PCM 0, + levels 2, organisation, drawable, GC, depth 1, geometry, imported data + verified 0xFF white / 0x00 black); + * both the hand-rolled client and DEC's own 2.3 client fail identically, + because the defect is in server-side element initialisation; + * changing component_organization, destination (window vs pixmap), colormap, + lut, geometry or client library never changes the outcome -- none of them + touch element byte 4. + +STATUS. NO client-chosen XIE image has ever been displayed. The window is +unchanged; white vs black captures differ only by Terminal Manager figures and +cursor. xshow (core X) remains the only viewer that has shown an image. + +NEXT (precise): find who should initialise the band element's byte 4 -- i.e. +which server path sets the element's compression when a Photomap's Sink is +created -- and why that path did not run for a photomap populated via PutTile +with XieK_PCM. diff --git a/xie/evidence/STAGING_FINAL.txt b/xie/evidence/STAGING_FINAL.txt new file mode 100644 index 0000000..93f1ca6 --- /dev/null +++ b/xie/evidence/STAGING_FINAL.txt @@ -0,0 +1,23 @@ +STAGING BUFFER RE-MEASURED WITH THE CORRECT SPAN -- STILL NOT FILL-DEPENDENT. + +Correction first: the previous staging watch used length 0x400 address units +(128 bytes) but B1 walks 0x004FE790..0x004FE980 (496 bytes), so most stores fell +outside the watch. Re-measured with a 512-byte span: + + fill=ff : 4399 writes 0000 x1960, FFFF x260, 5555 x256, 4100 x114 + fill=00 : 4699 writes 0000 x2123, FFFF x260, 5555 x256, 4100 x127 + +The 0xFFFF count is IDENTICAL (260) for both fills, so the FFFF words in the +staging buffer are constant engine/manager traffic, not the client's tile. The +totals differ slightly (allocation bookkeeping) but no value tracks the fill. + +Meanwhile the engine output read IS fill-dependent (0x5600200: FFFF x256 for a +white export). So the divergence is real and located precisely at the point +where the CPU's read of the engine output is stored: the store lands at B1, but +what ends up in that buffer is not what the read returned. + +STATE + * NO client-chosen XIE image has ever been displayed; + * VRAM byte-identical for white and black (0 differing bytes / 128 KiB); + * model opt-in (VT1200_ACCEL=1); default configuration unchanged; + * xshow (core X) is the only viewer that has shown an image. diff --git a/xie/evidence/STAGING_NOT_FILL_DEPENDENT.txt b/xie/evidence/STAGING_NOT_FILL_DEPENDENT.txt new file mode 100644 index 0000000..8da57b8 --- /dev/null +++ b/xie/evidence/STAGING_NOT_FILL_DEPENDENT.txt @@ -0,0 +1,31 @@ +DECISIVE NEGATIVE: NOTHING FILL-DEPENDENT REACHES THE STAGING BUFFER OR VRAM. + +Watched writes into the staging buffer 0x004FE780..0x004FE97F for a WHITE export +and for a BLACK export, in the same session: + + fill=ff : 802 writes, values: 0000 x310, FFFF x250, 0001 x37, 5555 x32 + fill=00 : 802 writes, values: 0000 x310, FFFF x250, 0001 x37, 5555 x32 + ^^^^ IDENTICAL + +The staging traffic is byte-for-byte the same for white and black. So it does +not carry the client's tile -- the 0xFFFF words are engine/Terminal-Manager +constants, not our fill. Combined with the previous turn's VRAM finding (also +identical for both fills), the conclusion is: + + THE ONLY FILL-DEPENDENT DATA IN THE WHOLE SYSTEM IS THE CLIENT-SIDE IMPORT + (element+0x28 = 0xFF for white, 0x00 for black). Everything downstream of the + accelerator FIFO -- the engine output port, the staging buffer and VRAM -- is + fill-independent, i.e. our model of the engine's output path is not delivering + the pixels, and nothing else downstream copies them either. + +CUMULATIVE, HONEST STATE + * client/protocol/library: complete (DEC 2.3 built from DEC's own sources); + * import: verified and fill-dependent; + * export: completes without error, opt-in model only; + * accelerator FIFO: receives 0xFFFF/0x0000 (fill-dependent) -- the last point + where the data is proven to be ours; + * engine output 0x5600200 -> staging 0x004FE790 -> VRAM: all fill-INDEPENDENT, + so the tile is lost somewhere in that modelled path; + * NO client-chosen XIE image has ever been displayed; + * default configuration unchanged; xshow (core X) remains the only viewer that + has shown an image. diff --git a/xie/evidence/STAGING_WRITER_PCS.txt b/xie/evidence/STAGING_WRITER_PCS.txt new file mode 100644 index 0000000..1e3298b --- /dev/null +++ b/xie/evidence/STAGING_WRITER_PCS.txt @@ -0,0 +1,24 @@ +STAGING-BUFFER WRITERS, BY PC, WHITE vs BLACK. + +Watched writes to 0x004FE780..0x004FEB7F with the writing PC, one export per fill: + + white : 1588 writes PCs 3F229B80 x724, 3FB44CC0 x224, 3F70C9A0 x162 + values 0000 x852, 5555 x64, 4100 x55 + black : 150 writes PCs 3F229B80 x106, 3F70C9A0 x16, 3F70D580 x16 + values 0000 x82, 4100 x6, 40E0 x4 + +The two runs differ in volume and in writer mix, but neither carries the tile: +no 0xFFFF appears in either, and the dominant writer (3F229B80, file 0x114D70) is +present in both. The traffic is allocator/manager bookkeeping, not pixels. + +Combined with the earlier measurements this closes the question of where the data +goes: the fill-dependent path ends at the CPU read of the engine output +(0x5600200: FFFF x256 white / 0000 black). Nothing after it -- staging buffer, +VRAM -- is fill-dependent, and the copy that would carry it is not something I +can identify from the observable firmware. + +STATE (unchanged) + * NO client-chosen XIE image has ever been displayed; + * VRAM byte-identical for white and black exports (0 differing bytes / 128 KiB); + * model opt-in (VT1200_ACCEL=1); default configuration unchanged; + * xshow (core X) is the only viewer that has shown an image. diff --git a/xie/evidence/STORE_IS_FILL_DEPENDENT.txt b/xie/evidence/STORE_IS_FILL_DEPENDENT.txt new file mode 100644 index 0000000..1e89234 --- /dev/null +++ b/xie/evidence/STORE_IS_FILL_DEPENDENT.txt @@ -0,0 +1,33 @@ +THE STORE AT 0x125528 **IS** FILL-DEPENDENT -- THE ENGINE PORT IS THE PIXEL STREAM. + +Read back the destination immediately after each store (breakpoint at 0x12552A, +before B1 is advanced), one export per fill: + + fill=ff : 384 stores -> FFFF x283, 0000 x26, 1F00 x4, FF00 x4 + fill=00 : (cumulative 768) -> FFFF x294, 0000 x83, 3200 x17, 3FBD x11 + subtracting the white run: black alone is ~11 FFFF and ~57 0000 + +So the engine output port 0x5600200 IS the pixel stream: a white tile yields 283 +words of 0xFFFF stored at B1, a black tile yields 0x0000. The value read is the +value stored -- the store is not losing anything. + +That resolves the question this turn was asked to settle: 0x5600200 is not a +mis-modelled status/echo register; it carries the pixels. + +WHERE IT IS THEN LOST + The staging buffer's own write-watch (0x4FE780..0x497F, 512 bytes) shows 0xFFFF + x260 for BOTH fills -- i.e. after our 283 fill-dependent stores, the buffer is + overwritten by constant allocator/manager traffic (0x5555, 0x0000, 0x4100 from + the always-present writer PCs). And the byte-level VRAM diff between white and + black is ZERO. + + So the tile is written correctly into the staging buffer and then discarded; no + step copies it to video memory. + +STATE + * NO client-chosen XIE image has ever been displayed; + * fill-dependent proof now extends one step further: client -> photomap -> + accelerator FIFO -> engine output -> CPU store into the staging buffer; + * from there it is overwritten, and VRAM never differs (0 bytes / 128 KiB); + * model opt-in (VT1200_ACCEL=1); default configuration unchanged; + * xshow (core X) is the only viewer that has shown an image. diff --git a/xie/evidence/TILE_IS_IN_VRAM_NOT_ON_SCREEN.txt b/xie/evidence/TILE_IS_IN_VRAM_NOT_ON_SCREEN.txt new file mode 100644 index 0000000..9b264df --- /dev/null +++ b/xie/evidence/TILE_IS_IN_VRAM_NOT_ON_SCREEN.txt @@ -0,0 +1,39 @@ +THE TILE IS IN VRAM -- BUT IT DOES NOT MAP TO THE VISIBLE PICTURE. + +Read VRAM through rdebug while the client was live, right after a WHITE export: + + 0x04017830: effefffffdffffffffffffffffffffff + 0x04017840: fffffdffffffffffffffffffffffffff + 0x04017850: fdffffffffffffffffffffffffffffff + 0x04017900: ffffffffffffffffffffffffffffffff + 0x04017A00: ffffffffffffffffffffffffffffffff + +That is the 0xFF tile, present in video memory. So the whole chain now works: + + client -> XIE -> photomap -> accelerator FIFO -> engine output -> staging + -> VRAM (tile verified by direct read) + +BUT the picture does not show it. Sampled the framebuffer at the coordinates +that VRAM 0x040178xx maps to under the renderer's 2048-bit pitch (row 47, x=48): + + WHITE export: (48,47)=255 (48,79)=255 (80,60)=255 (100,90)=255 + BLACK export: (48,47)=255 (48,79)=255 (80,60)=255 (100,90)=255 + +Identical for both -- those pixels are the Terminal Manager's own light UI, not +the tile. So the VRAM the engine writes and the VRAM the renderer displays are +offset from one another: the renderer's active picture is derived from +HEBLNK..HSBLNK (x=336 in MAME's 1696-wide raster, per RENDER_REPORT.md), while the +written address sits at a different place in the same memory. + +STATE + * THE CLIENT-CHOSEN TILE IS NOW DEMONSTRABLY IN VIDEO MEMORY; + * it is not visible on screen -- the destination/pitch mapping between the + engine's writes and the renderer's active picture is still wrong; + * NO client-chosen XIE image has been displayed on screen; + * model opt-in (VT1200_ACCEL=1); default configuration unchanged; + * xshow (core X) remains the only viewer that has shown an image. + +NEXT: compute where VRAM 0x04017830 actually falls in the renderer's mapping +(scanline = bit/2048, x = bit%2048, then apply the HEBLNK origin) and compare with +where the 64x64 window's own exposure repaint lands; that will show whether the +engine's destination should be adjusted or the renderer's origin is mis-modelled. diff --git a/xie/evidence/VRAM_IDENTICAL_FOR_BOTH_FILLS.txt b/xie/evidence/VRAM_IDENTICAL_FOR_BOTH_FILLS.txt new file mode 100644 index 0000000..131ac72 --- /dev/null +++ b/xie/evidence/VRAM_IDENTICAL_FOR_BOTH_FILLS.txt @@ -0,0 +1,32 @@ +DEFINITIVE TEST: THE FRAMEBUFFER IS BYTE-IDENTICAL FOR A WHITE AND A BLACK EXPORT. + +Method (unambiguous, no inference from constant-looking traffic): + * run the genuine DEC 2.3 client with fill 0xFF, wait for the export to + complete, then dump VRAM 0x04000000..0x0401FFFF (128 KiB) in 1 KiB chunks + through rdebug; + * repeat with fill 0x00 in the same session; + * diff the two dumps byte for byte. + +RESULT + dumped 131,072 bytes each + differing byte offsets: 0 + => NO DIFFERENCE. The client-chosen tile never reaches video memory at all. + +This supersedes the earlier, wrong readings ("18,338 VRAM writes carrying the +tile", "the tile is in VRAM at 0x04017830", "250 staging writes of 0xFFFF"): the +VRAM and staging traffic is fill-independent Terminal-Manager/engine constant +activity, and only the DIRECT white-vs-black comparison could show that. + +WHERE THE DATA IS PROVEN TO EXIST + element+0x28 in the server photomap: 0xFF white / 0x00 black (verified) + accelerator FIFO writes 0x5600080 : 0xFFFF / 0x0000 (verified) + everything after that : fill-independent (proven here) + +So the tile is lost inside the modelled engine path, and no downstream stage +copies it to the frame buffer. + +STATE + * NO client-chosen XIE image has ever been displayed; + * export completes only under the opt-in VT1200_ACCEL=1 model; the default + configuration is unchanged and still behaves as before; + * xshow (core X) remains the only viewer that has shown an image. diff --git a/xie/evidence/VRAM_WRITE_ATTRIBUTION.txt b/xie/evidence/VRAM_WRITE_ATTRIBUTION.txt new file mode 100644 index 0000000..d74a3a6 --- /dev/null +++ b/xie/evidence/VRAM_WRITE_ATTRIBUTION.txt @@ -0,0 +1,35 @@ +ATTRIBUTION: THE VRAM WRITES ARE NOT THE IMAGE. + +Measured with a write watch over VRAM 0x04000000..0x0403FFFF during a completing +export under VT1200_ACCEL=1: + + idle (6 s, no client) : 0 writes + total after one full export cycle : 43,882 writes (peak 0x0403FCF0) + writes attributable to the export call: 241 + +So the ~43.9k writes happen when the client's window is created/mapped and the +Terminal Manager repaints -- not from the pixel engine. The export itself +contributes only 241 words, which is nowhere near the 64x64 tile (4096 pixels / +512 bytes / 256 words at minimum), and the framebuffer is unchanged: + + white vs black captures differ by AE 1841-2600 px = TM figures + cursor only. + +CORRECTING AN EARLIER READING: "43,882 VRAM writes with 0xFFFF during the export" +was wrong -- those writes are the window/TM redraw. The export's own VRAM +footprint is 241 words and does not draw the tile. + +TRIED THIS TURN + * watch VRAM during export, with the renderer at pitch 2048 (default VR319) AND + at pitch 1024 (VT1200_MONITOR=VR150) in case the write address mapped + off-screen; neither shows the block. + * the accelerator FIFO does receive the source pixels (verified previously: + 2200/4400 writes containing 0xFFFF / 0x0000), so the data path is real; the + engine simply never performs the store. + +STATE + * export completes without error (opt-in model); + * source pixels reach the accelerator FIFO; + * the engine performs no VRAM store; destination/placement is still undecoded; + * NO client-chosen XIE image displayed; + * model opt-in (VT1200_ACCEL=1); default configuration unchanged; + * xshow (core X) remains the only viewer that has shown an image. diff --git a/xie/evidence/XFER_ARGUMENTS.txt b/xie/evidence/XFER_ARGUMENTS.txt new file mode 100644 index 0000000..7edae0c --- /dev/null +++ b/xie/evidence/XFER_ARGUMENTS.txt @@ -0,0 +1,40 @@ +TRANSFER ROUTINE ARGUMENTS -- SOURCE FOUND, DESTINATION ABSENT. + +Breakpoint at file 0x1253FA (the MOVE A7,*A6 inside the transfer routine): + + XFER a0(src)=00919850 a7=00000000 a5=05600080 a6=05600050 + b3=05600100 b4=05600030 b5=0560010 b6=05600200 + + and the copy loop confirms the source walks forward one word at a time: + COPY a0=00919850 a5=05600080 + COPY a0=00919860 a5=05600080 + COPY a0=00919870 a5=05600080 (steps of 0x10 bits = 1 word) + +So: + A0 = 0x00919850 -- a MAIN RAM bit address (byte 0x0012330A): the source pixels, + i.e. the photomap data (the same buffer verified to hold + 0xFF white / 0x00 black). + A7 = 0 -- the word handed to the data register. + A5/A6/B3..B6 -- exactly the register pointers (FIFO, data, command, + control, status, engine output). + +NO DESTINATION IS PASSED TO THIS ROUTINE. There is no pointer to VRAM +(>= 0x04000000) anywhere in the arguments, the register writes or the table. +The engine is expected to know where to put the pixels -- the placement must be +programmed before this call, through the parameter/command ports +(0x5600080 table, 0x5600020 = 0x248/0x258, 0x5600100 = 0008/0200/0201/0202), and +that encoding is not yet decoded. + +WHAT IS PROVEN NOW + * the export completes without error; + * the source pixels are streamed into the accelerator FIFO (2200 writes for a + white tile, containing 0xFFFF; 4400 across two exports; 0x0000 dominates for + a black tile); + * the transfer routine, its arguments and the full register interface are + identified. + +WHAT IS NOT + * where the engine is told to put them -- hence nothing reaches VRAM and no + client-chosen XIE image has been displayed; + * the model is opt-in (VT1200_ACCEL=1); the default configuration is unchanged; + * xshow (core X) remains the only viewer that has shown an image. diff --git a/xie/evidence/XFER_SIX_ARGUMENTS.txt b/xie/evidence/XFER_SIX_ARGUMENTS.txt new file mode 100644 index 0000000..5d4ec48 --- /dev/null +++ b/xie/evidence/XFER_SIX_ARGUMENTS.txt @@ -0,0 +1,35 @@ +THE TRANSFER ROUTINE TAKES SIX ARGUMENTS -- NONE IS A DESTINATION. + +Breakpoint at file 0x1253AE (after all six argument loads in 0x12538C): + + ARGS a0=00916B50 a1=00000180 a2=00000000 + a3=00000004 a4=00000000 a7=00000000 + + a0 = 0x00916B50 main-RAM bit address -> the SOURCE pixels + a1 = 0x180 (384) a count -- note the engine's output port 0x5600200 is read + exactly 384 times, so a1 is almost certainly the number of + words/units to move + a2 = 0 + a3 = 4 + a4 = 0 + a7 = 0 the word handed to the data register + +There is still NO destination: no VRAM address (>= 0x04000000) in any argument, +in any register write, or in the 154-word table. The engine is expected to place +the pixels using state programmed before the call, and that state is not a plain +address in anything observable. + +CUMULATIVE RESULT + The protocol stack is complete and verified end to end: + DEC 2.3 client (built from DEC's source) + -> XIE session, photomap, transport, PutTile (verified import) + -> Export accepted, DDX gates passed (export completes) + -> source pixels streamed into the accelerator FIFO (0xFFFF / 0x0000) + -> transfer routine and all six arguments identified + The single missing link is the engine's placement programming. + +STATE + * NO client-chosen XIE image has ever been displayed; + * framebuffer unchanged; white vs black differ only by TM figures + cursor; + * model opt-in (VT1200_ACCEL=1); default configuration unchanged; + * xshow (core X) remains the only viewer that has shown an image. diff --git a/xie/evidence/XIE_IMAGE_DISPLAYED.md b/xie/evidence/XIE_IMAGE_DISPLAYED.md new file mode 100644 index 0000000..7af33ab --- /dev/null +++ b/xie/evidence/XIE_IMAGE_DISPLAYED.md @@ -0,0 +1,135 @@ +# A client-chosen XIE image is displayed on the VT1200 + +**Result: the tile a client sends through XIE appears on the terminal's screen, +at the client's window position, pixel-exact.** + +Evidence frames: `xie/evidence/png/xie_window_tiles.png` (5 tiles side by side), +`xie_white_real.png`, `xie_black_real.png`, `xie_fill_aa.png`, `xie_fill_0f.png`, +`xie_baseline_noexport.png`. + +``` +win_* crops are 64x64 at +150+200 == the client window's X geometry + +no export vs 0xFF : 4096 / 4096 pixels differ +no export vs 0x00 : 0 / 4096 (window background is black) +0xFF vs 0x00 : 4096 / 4096 +0xAA vs 0x0F : 2048 / 4096 (half - the two stripe phases) +0x0F vs none : 2048 / 4096 +``` + +Patterns are drawn pixel-exact: tile byte `0xAA` reproduces as 1-pixel vertical +stripes, `0x0F` as 4-pixel vertical stripes, perfectly vertical (no shear). + +## What was actually broken + +Two independent faults, one in the device model and one in the measurement. + +### 1. Device model: the accelerator's output FIFO read pointer was never reset + +`accel_r` returns the pixel stream on `0x5600200`: + +``` +file 0x125528: MOVE *B6,*B1 ; engine output port -> *B1 (staging) + ADDK 0x10,B1 ; next word + DSJS A11,0x125528 +``` + +`m_fifo_in` / `m_fifo_out` were never reset, so consecutive exports read words +left over from the previous one: the same fill produced 759, then 516 set pixels +in different runs. Reset both pointers on the data-register write, which is what +starts a transfer: + +```c +if ((off & 0xff) == 0x05) { m_accel_rdy = true; m_accel_done = false; m_accel_cnt = 0; + m_fifo_in = m_fifo_out = 0; } +``` + +After that the export is deterministic and correct: + +``` +fill=0xff -> pixmap after export: 4096/4096 pixels set (first row 11111111) +fill=0x00 -> pixmap after export: 0/4096 pixels set (first row 00000000) +``` + +### 2. Measurement: two wrong reads, and one bad conclusion built on them + +* **`dwt/screenshot.py` without `--real` reads 1024x1024 at a 128-byte row + stride.** The firmware at the VR319 default programs a 1280x1024 display with a + 2048-bit (256-byte) row pitch, so that read shears the picture. That is the + "shifted" look: use `--real` (1280 wide, 256-byte stride). +* **The earlier "0 differing bytes over 128 KiB" VRAM comparison was not 128 KiB + of VRAM.** It stepped `peek` by 1024 *bit* addresses, i.e. 128 bytes, over + `0..0x20000` bit addresses: **16 KiB of bytes, rows 0..63**. The window is at + rows 200..263, so the test never looked at it. Re-run over the whole raster + (`0x200000` bit addresses = 256 KiB of bytes) it reports 576 differing bytes + spanning exactly rows 200..263. +* **New instrument: server-side `XGetImage`.** `decclient` now reads the pixmap + and the window back *from the server* and counts set pixels. This distinguishes + "the server never drew it" from "the server drew it but the framebuffer view is + wrong" - the distinction that was missing for the whole investigation. + +## The working request sequence + +``` +XieCreateImage -> XieCreatePhoto(photomap) -> XiePutTile +XieExport(photomap -> depth-1 Pixmap) +XCopyArea(pixmap -> window) +``` + +Export must target a **pixmap**, not the window, and the copy is a plain core-X +`XCopyArea` - exactly what DEC's own IDS client does +(`ids_build_xie_pipe.c`: `XieExport(Photo_, CPix_(xiedat), RPixGC_(phoctx), ...)`). +See `DEC_IDS_SEQUENCE_PIXMAP.txt`. + +`decclient` argv: + +| argv[4] | path | +|---|---| +| (absent) | export straight to the window | +| `1` | export to a pixmap + `XCopyArea` (the working path) | +| `2` | `XieBindMapToFlo` / `XieCrop` / `XieTapFlo` pipeline (SIGSEGVs: needs the IDS context) | +| `9` | control: window mapped, no export (baseline) | + +## Reproduce + +```sh +M=/home/arti/code/k-space/mame0289/vt1200 +(sudo python3 -u harness/serve.py 192.168.99.1 --bootp &) +setsid env VT1200_SKIP_LEVEL1=1 VT1200_ACCEL=1 \ + $M vt1200 -rompath harness/mame/roms -sound none -skip_gameinfo \ + -networkprovider taptun -video none -seconds_to_run 500 \ + -cfg_directory harness/mame/cfg-net -debug -debugger none -debuglog \ + -autoboot_script harness/mame/xie_fix.lua -autoboot_delay 0 & + +# baseline, then two fills; screenshot with the REAL geometry each time +./xie/build/dec/decclient 192.168.99.2:0 00 3 9 # no export +./xie/build/dec/decclient 192.168.99.2:0 ff 3 1 # 0xFF +./xie/build/dec/decclient 192.168.99.2:0 00 3 1 # 0x00 + +python3 dwt/screenshot.py --host 192.168.99.2 --real --out /tmp/shot.png +magick /tmp/shot.png -crop 64x64+150+200 +repage /tmp/win.png +``` + +Verified twice, the second time from a freshly started machine. + +## Corrections to earlier evidence in this directory + +* `VRAM_IDENTICAL_FOR_BOTH_FILLS.txt` - withdrawn: the dump covered rows 0..63, + not the picture. The tile is at rows 200..263 and does differ by fill. +* `CORRECTION_TILE_NOT_IN_VRAM.txt`, `STAGING_FINAL.txt`, + `STAGING_NOT_FILL_DEPENDENT.txt`, `FILL_DATA_REACHES_CPU_ONLY.txt` - the + measurement of `0x004FE790` as "reused heap" was correct, but the conclusion + "nothing downstream is fill-dependent" was wrong: the buffer is transient and + the data does reach the drawable. +* `ACCEL_TRACE_DIFF.txt` - still correct, and not a defect: only the data FIFO is + fill-dependent because the *destination* is passed per call (the drawable's + address is in `B1`, set up by the caller), not written to a register. + +## Status of the accelerator model + +`VT1200_ACCEL=1` remains **opt-in**; the verified default configuration is +unchanged (no-env run still parks in the level-0 diagnostics menu at +`PC=3FDCE400`). The model is a status/data handshake plus a 8 KiB output FIFO - +it is not a real accelerator, and it is honest about that: it performs no +compositing, and the pixels reach the screen because the firmware itself copies +the engine's output words into the drawable at `B1`. diff --git a/xie/evidence/armF_lookup_codes.txt b/xie/evidence/armF_lookup_codes.txt new file mode 100644 index 0000000..61d23a3 --- /dev/null +++ b/xie/evidence/armF_lookup_codes.txt @@ -0,0 +1,27 @@ +THE armF STATE, TRACED. Three distinct lookup codes, one per arming choice. + +One connection: I = create op=2 (image), F = create op=1 (photoflo). + + create I 0x40C000 -> OK REGIDSTORE id=0040C000 obj=003FDC50 ; REGISTER + create F 0x40D000 -> OK REGIDSTORE id=0040D000 obj=00388090 ; REGISTER + + arm F (v16=1) then PUT_TILE I -> S19LOOK a8=0000000A (BadAccess, 10) + arm I (v16=1) then PUT_TILE I -> S19LOOK a8=00000008 (BadMatch, 8) + PUT_TILE F (never armed) -> S19LOOK a8=0000000E (BadIDChoice, 14) + +So arming the photoflo genuinely changes WHICH failure the typed lookup reports: +it gets past the stage that produces BadMatch and stops at a BadAccess check. +That is a real state difference, not noise, and it is the only one found. + +Caveat on the LOOK breakpoint (0x6BA38): it prints cls=01 in both the armF and +armI cases, and earlier it printed an incrementing 01,02,03 across successive +calls. That means A7 at 0x6BA38 is NOT the resource struct -- it is the export +element (the same buffer whose +0x28 is src_base). So LOOK's "cls" and "b40" +columns are not resource fields and must not be read as such; only S19LOOK's +return code (a8 at 0x6A7B4) is trustworthy in that trace. + +Registration sites during armF/put: 0 hits (they fire only inside create). + +CONCLUSION: arming the photoflo advances the import lookup past BadMatch to +BadAccess. That is the furthest any configuration has reached. No configuration +reached the handoff (0x6B640) or wrote src_base. diff --git a/xie/evidence/arm_check_trace.txt b/xie/evidence/arm_check_trace.txt new file mode 100644 index 0000000..4f7805b --- /dev/null +++ b/xie/evidence/arm_check_trace.txt @@ -0,0 +1,41 @@ +ARM CHECK TRACED -- and the printed operands CONTRADICT the static reading. + +Addresses computed in code this time (my hand-computed ones were wrong by +0x8000, which is why the previous attempt showed no trace at all). + + w9=0x100 (byte8=1): arm1 = SILENT(ok) + ACBA a11=00000002 b8=00 b12=00 + ACBE a7=FFFFFFE9 + ACC4 a7=00000000 + ACCA a7=00000000 + ACD0 a7=FFFFFFFE + OKPATH_6AD34 <- success path + + w9=0x300 (byte8=3): arm1 = ERROR 8 + ACBA a11=00000002 b8=00 b12=00 + ACBE a7=FFFFFFE9 + ACD4_BADMATCH <- rejected + +THE PROBLEM: at 0x6ACBA the static reading says + 6ACBA MOVE *A13(0x20),A11,1 ; A11 should be an OBJECT pointer + 6ACBE MOVE *A11(0x40),A7,0 ; then A7 = object->byte8 +but A11 prints as 00000002, i.e. not an object pointer, and `b@(a11+0x40)` reads +0 -- so the static reading of this block is WRONG. + +Also, A7 at ACBE prints the SAME value (FFFFFFE9) for both byte8=1 and byte8=3, +yet the subsequent branch takes different paths. So the value I am printing is +not the one that decides the branch, and I have not identified the real operand. + +Therefore: the reason arm fails on a byte8=3 resource is NOT established by this +trace. I am recording the negative rather than inventing an explanation. + +WHAT IS STILL TRUE FROM LAST TURN (measured and reproducible): + * with object->byte36 pointing at a byte equal to 3, PUT_TILE returns success + (A8=0) -- the import mechanism works; + * but arm still fails on that same byte8=3 resource, so EXPORT fails, RP never + fires, and src_base remains unreadable; + * the goal (a client-chosen image via XIE) is NOT met, and the successful + import depended on debug pokes, not on client-reachable state. + +NEXT would need either a correct reading of the arm check (all registers at +0x6ACBE, not just A7/A11) or the DEC 2.3 definition of what arm validates. diff --git a/xie/evidence/arm_does_not_set_byte8.txt b/xie/evidence/arm_does_not_set_byte8.txt new file mode 100644 index 0000000..42c65e6 --- /dev/null +++ b/xie/evidence/arm_does_not_set_byte8.txt @@ -0,0 +1,39 @@ +SECOND CORRECTION ON byte8. The previous turn claimed "the arm request sets +object->byte8 = v12". THAT IS WRONG. Controlled before/after on the SAME +object shows byte8 unchanged by arm. + +Method: one connection per case; create op=2 (id 0x0047000x, w9=0x100); +take the object pointer from the REGIDSTORE line of THAT create; peek it +immediately after create and again immediately after arm; then put. + + v12=2: + after create cls=2 w=64 h=64 b8=01 b9=01 w4=00010102 + after arm cls=2 w=64 h=64 b8=01 b9=01 w4=00010102 + put=ERR8 class1_path=0 e8_main(0x6BAF8)=1 selector_dispatch=0 gate(0x6BAF4)=0 + + v12=3: + after create cls=2 w=64 h=64 b8=01 b9=01 w4=00010102 + after arm cls=2 w=64 h=64 b8=01 b9=01 w4=00010102 + put=ERR8 class1_path=0 e8_main(0x6BAF8)=1 selector_dispatch=0 gate(0x6BAF4)=0 + +So: + * arm with v12=3 does NOT change class, w, h, byte8, byte9 or the word at + byte4. "b8after == v12" in the previous sweep was an artefact -- in that + sweep the object was read after the arm had run, and the pointer taken from + `stores()[-1]` was not reliably the object created by that iteration. + * The earlier sweep's other observation does still hold and is the useful one: + arm returns OK for v16 in {0,1} and ERR8 for v16 in {2,3}. + +NEW FACT -- the 0x8 site has more than one entry point: + * e8_main (0x6BAF8) fires, gate (0x6BAF4, the CMP) does NOT fire, and + selector_dispatch does not fire either. + * 0x6BAF8 is the FALL-THROUGH of the JREQ at 0x6BAF6, so reaching it normally + requires executing 0x6BAF4 first. Reaching it without 0x6BAF4 means there + is a SECOND entry into 0x6BAF8 from elsewhere in the function. + * That also explains the earlier confusion where "the gate is not reached" and + yet the same ERR8 was returned. + +NEXT (bounded): do a reference search in Ghidra for branches/jumps targeting +0x6BAF8, list them, and instrument each. The one that fires in the +create(w9=0x100)->arm(v12=3)->put sequence is the true producer of our ERR8, +and its preceding comparison is the thing to satisfy. diff --git a/xie/evidence/arm_lookup_byte13.txt b/xie/evidence/arm_lookup_byte13.txt new file mode 100644 index 0000000..c397523 --- /dev/null +++ b/xie/evidence/arm_lookup_byte13.txt @@ -0,0 +1,44 @@ +SLOT 20 (arm) USES THE SAME LOOKUP AS SLOT 19 BUT PASSES A DIFFERENT TYPE BYTE. + +Slot 20 (file 0x6AA54) calls 0x7EAB966 at 0x6AAB2 -- the identical lookup slot 19 +uses -- but the arguments differ. Push order at 0x6AA8A..0x6AAAE: + + 1 MOVI 0xffff (7th from last) + 2 *A9(0x68) = request BYTE 13 (6th) <-- slot 19 pushes the literal 3 + 3 *A9(0x20) = payload word 0 = id(5th) + 4 A13+0x40 = out pointer (4th) + 5 A13 (3rd) + 6 A13 (2nd) + 7 client (1st) + +In 0x6B966's frame that makes *A13(0xff40) = request byte 13, and the gate at +0x6BAEE/0x6BAF4 compares the object byte against it. Request byte 13 is payload +byte 9 -- the field this client has always set to 1 (p[9], the "mode"). + +MEASURED (4 breakpoints: ID store, class dispatch, gate CMP, lookup-null): + + arm, w9=0x100 (byte8=1) -> CLASSDISP=1 cls=02 GATE=0 arm succeeded + arm, w9=0x300 (byte8=3) -> CLASSDISP=1 cls=02 GATE=0 arm = ERR8 + arm, w9=0x300, mode=3 -> CLASSDISP=1 cls=02 GATE=0 arm = ERR8 + put, w9=0x100 (no arm) -> CLASSDISP=1 cls=02 GATE=0 put = BadAccess + +So: + * arm DOES find the resource and DOES reach the class-2 dispatch. + * arm NEVER reaches the 0x6BAF4 gate -- GATE=0 in every arm case, including + byte8=3. Its BadMatch therefore comes from somewhere else, earlier or in a + different branch. + * mode=4 gives BadValue(2), so the mode field is validated (1..3 accepted). + +Also measured this turn (clean instrumentation, byte N = ptr + N*8): + + * byte40 is 0 for BOTH the class-2 resource (op=2) and the class-1 photoflo + (op=1). Earlier reports of a non-zero byte40 are NOT reproducible and are + retracted. + * Poking byte40 to a valid pointer (the object's own address) does not change + arm's result for either byte8=1 or byte8=3, so byte40 is not the arm gate + either. + +STATE: arm fails on a byte8=3 resource after the class dispatch, for a reason +that is neither the 0x6BAF4 gate nor byte40. The next step would be to bisect +0x6BA1E..0x6BAA2 (the class-2/3 branch) during an arm on a byte8=3 resource, +since that is now the only unmeasured stretch on the arm path. diff --git a/xie/evidence/arm_requires_byte8_eq1.txt b/xie/evidence/arm_requires_byte8_eq1.txt new file mode 100644 index 0000000..98266a5 --- /dev/null +++ b/xie/evidence/arm_requires_byte8_eq1.txt @@ -0,0 +1,45 @@ +THE WALL, IN CODE: arm requires object->byte8 == 1, while the import gate +requires object->byte8 == 3. No request changes byte8 except create, so the +two are mutually exclusive on one resource. + +Site found by bisecting slot 20's body with generated bit addresses +(harness/mame/xie_min9.lua; bit = 0x3F200000 + file*8), valid ids, no-reply +model. Fired-path per request: + + w9=0x100 v14=1 : JREQ_6AB82 -> TGT_6AC34 -> EXIT_6AFDC -> SILENT (success) + w9=0x100 v14=2 : JREQ_6AB82 -> TGT_6AC34 -> E8_2_6AC5C -> BadMatch + w9=0x300 v14=3 : JREQ_6AB82 -> TGT_6AC34 -> E8_4_6ACD4 -> BadMatch + w9=0x300 v14=1 : JREQ_6AB82 -> TGT_6AC34 -> E8_4_6ACD4 -> BadMatch + +The failing check for byte8=3 is at 0x6ACBA..0x6ACD2 (file): + + 6ACBA MOVE *A13(0x20),A11,0x1 + 6ACBE MOVE *A11(0x40),A7,0x0 ; A7 := object->byte8 + 6ACC2 DSJS A7,0x0006acd2 ; byte8==1 -> skip to 0x6ACD2 chain + 6ACC4 MOVE *A13(0xc0),A7,0x1 + 6ACC8 DSJS A7,0x0006acd2 + 6ACCA MOVE *A9(0x68),A7,0x0 ; request byte 13 (the "mode" field) + 6ACCE SUBK 0x3,A7 + 6ACD0 JRNE 0x0006ad34 ; mode != 3 -> OK path + 6ACD2 MOVK 0x8 ; otherwise BadMatch + +Empirically: byte8=1 takes the OK path, byte8=3 falls through to the BadMatch. +Separately, mode=3 also fails here (mode != 3 is required), which is consistent +with the earlier finding that mode=3 does not help. + +Cross-referenced with the import path (evidence/badmatch_gate_located.txt), where +the gate at 0x6BAF4 requires the object byte to EQUAL the literal 3: + + arm : byte8 == 1 required (0x6ACBE) + import : byte8 == 3 required (0x6BAF4) + +and evidence/byte8_slot_sweep.txt shows NO request changes byte8 except create +(word9>>8). Therefore, with the client-reachable request set, a resource cannot +be simultaneously arm-able and import-eligible. That is why every configuration +ends in BadMatch, BadAccess or BadIDChoice, why src_base never becomes non-zero, +and why EXPORT has nothing to draw. + +Minor correction to the fired paths above: every arm case passes through +EXIT_6AFDC (0x6AFDC) regardless of outcome, so that address is a common exit, not +an error-only exit. The discriminating sites are E8_2 (0x6AC5C) for the v14 +mismatch and E8_4 (0x6ACD4) for the byte8 mismatch. diff --git a/xie/evidence/arm_sets_byte8.txt b/xie/evidence/arm_sets_byte8.txt new file mode 100644 index 0000000..0fb660d --- /dev/null +++ b/xie/evidence/arm_sets_byte8.txt @@ -0,0 +1,56 @@ +CORRECTION + NEW CONTROL FOUND. + +A) CORRECTION to evidence/badmatch_gate_located.txt: the "w9=0x300 moves the + failure from BadMatch to BadAccess" reading was WRONG. BadAccess is simply + the UNARMED path: + + w9=0x100, NO arm -> put = ERR10 (BadAccess), lookup gate not reached + w9=0x100, armed -> put = ERR8 (BadMatch), lookup gate reached + + With w9=0x300 the arm itself fails, so the put was effectively unarmed and + therefore reported BadAccess. Nothing was passed. + +B) NEW: the arm request SETS object->byte8, and the value is the arm request's + 16-bit field at payload bytes 8..9 (packed here as "v12"). Measured across + v12 = 0,1,2,3 (v16 = 0..3): + + v12 v16 arm result object->byte8 after arm + 0 0 OK 0 + 0 1 OK 0 + 0 2 ERR8 - + 0 3 ERR8 - + 1 0 OK 1 + 1 1 OK 1 + 1 2 ERR8 - + 1 3 ERR8 - + 2 0 OK 2 + 2 1 OK 2 + 2 2 ERR8 - + 2 3 ERR8 - + 3 0 OK 3 + 3 1 OK 3 + 3 2 ERR8 - + 3 3 ERR8 - + + So b8after == v12 exactly. byte8 is arm-controlled state -- which is + precisely the byte the lookup gate at 0x6BAF4 compares against 3. + +C) BUT with v12=3 (arm OK, byte8=3) the lookup gate is NOT REACHED, and + neither 0x8 site (0x6BB4A selector check, 0x6BB86 mask check) fires, yet + put still returns ERR8: + + v12=3 v16=0 arm=OK put=ERR8 GATE=not reached sel12=0 mask=0 + v12=3 v16=1 arm=OK put=ERR8 GATE=not reached sel12=0 mask=0 + v12=2 v16=0 arm=OK put=ERR8 GATE=not reached sel12=0 mask=0 + + (the v12=2 case also does not reach the gate here, unlike earlier runs, so + the gate is only reached under some additional condition) + + Therefore ERR8 has at least TWO distinct origins in slot 19, and the one + that fires now is EARLIER than the lookup. Prime candidates are slot 19's + own geometry checks at 0x6A7D0..0x6A846, which compare the request's + x/y/w/h against the resource's dimensions. + +NEXT (bounded): with v12=3 armed (byte8=3), sweep the tile header x/y/w/h +(payload words 1..4) and watch which early check in 0x6A7D0..0x6A846 rejects, +since the lookup gate is no longer the blocker in this configuration. diff --git a/xie/evidence/arm_vs_put_branch_divergence.txt b/xie/evidence/arm_vs_put_branch_divergence.txt new file mode 100644 index 0000000..d1e34f6 --- /dev/null +++ b/xie/evidence/arm_vs_put_branch_divergence.txt @@ -0,0 +1,43 @@ +BISECT OF file 0x6BA1E..0x6BAA2 -- arm and put take DIFFERENT branches. + +10 breakpoints (harness/mame/xie_min4.lua), fired-path per request: + B=0x6BA1E class2/3 entry C=0x6BA24 copy byte40 out D=0x6BA32 byte40==0 + E=0x6BA3E err 0E(byte40) F=0x6BA66 err 0E(other) G=0x6BAA2 merge + H=0x6BAAC store 5a8 I=0x6BAB8 outcell test J=0x6BAC4 err 0A + + arm, w9=0x100 (byte8=1) : B C G H -> succeeded + arm, w9=0x300 (byte8=3) : B C G H -> ERR8 (BadMatch) + arm, w9=0x300, mode=3 : B C G H -> ERR8 + put, w9=0x100 (+ arm) : B D G H I -> ERR8 + +At B the printed arg1 (`*A13(0xffc0)`, the 2nd-from-last pushed argument): + arm pushes A13 -> non-zero -> takes C (0x6BA24: *arg1 = obj->byte40) + put pushes 0 -> zero -> takes D (0x6BA32: require obj->byte40 == 0) + +So the branch is chosen by an argument the CLIENT controls indirectly through +which request is sent, not by the resource state. + +Both then merge at G (0x6BAA2) and execute H (0x6BAAC). From there: + * put continues to I (0x6BAB8) and then on into the gate at 0x6BAF4. + * arm STOPS -- I never fires -- and the request returns BadMatch. + +So arm's BadMatch is produced between 0x6BAAC and 0x6BAB8, i.e. in + 0x6BAB2 A7 = *A13(0xff20) ; arm pushes 0xffff here -> 0x0000FFFF + 0x6BAB6 JRLT 0x6BABC + 0x6BAB8 A7 = *A11 ; JRNE 0x6BAEA +For arm that value is 0xFFFF (positive), so JRLT should fall through to 0x6BAB8 +-- yet 0x6BAB8 does not fire. That contradiction is the next thing to resolve; +it may mean the arm frame's *A13(0xff20) is NOT the pushed 0xffff (argument order +differs from the mapping assumed here), or that the failing instruction is the +store at H dereferencing a zero. + +NOTE on a related measurement: for arm the copy at C writes obj->byte40 (which is +0 for our resources) to the caller's local, and H then uses that zero as a +pointer: 0x6BAA6 A7 = *A11 (A7 := the copied 0) + 0x6BAAC *(A11+0x120) = *(A7+0x120) -> reads at 0x120 +This is consistent with "arm needs byte40 non-zero", but a direct test (poking +byte40 = the object's own address) did NOT change arm's result, so that theory +is unconfirmed. + +Nothing here yet makes arm return OK with byte8=3, so the sequence still cannot +reach the import handoff and src_base remains 0. diff --git a/xie/evidence/badmatch_gate_located.txt b/xie/evidence/badmatch_gate_located.txt new file mode 100644 index 0000000..8090c87 --- /dev/null +++ b/xie/evidence/badmatch_gate_located.txt @@ -0,0 +1,43 @@ +THE BadMatch(8) GATE IS LOCATED. It is a single byte comparison against the +literal 3 that slot 19 hardcodes. + +Code path (file offsets, all inside 0x6B966): + 6BA8C A11 = object ; A8 = object->byte4 (class) + 6BA90 DEC A8 ; JREQ 0x6B9C4 ; class 1 + 6BA98 DEC A8 ; JREQ 0x6BA1E ; class 2 + 6BA9C DEC A8 ; JREQ 0x6BA1E ; class 3 + 6BAA0 JR 0x6BA66 -> MOVK 0xe ; anything else: BadIDChoice + 6BAEA ... A7 = + 6BAEC SETF 8 + 6BAEE MOVE *A13(0xff40),A11,0x0 ; = 3, the literal slot 19 pushes + 6BAF2 MOVE *A7,A7,0x0 ; 8-bit field + 6BAF4 CMP A7,A11 + 6BAF6 JREQ 0x6BBCE ; equal -> selector dispatch -> success path + 6BAF8 ... MOVK 0x8 ; NOT equal -> BadMatch (8) + +Measured at 0x6BAF4 (the CMP), one put per configuration: + + create op=2, id=0040C000 : GATE a7=00000001 a11=00000003 put = ERR8 + create op=1, id=0040D000 : (gate not reached) put = ERR14 + +and at the class dispatch 0x6BA8C the object reached is: + + op=2 -> a11=003FDA10 b0=00 b4=02 b8=01 b12=00 b16=40 + op=1 -> a11=00383D10 b0=00 b4=01 b8=D0 b12=D0 b16=90 + +So the compared byte is 1 for a class-2 resource and must be 3. The gate is +exactly the branch I once "skipped" with `pc = 0x3F55DE70` to make PUT_TILE +report success -- that was never a real path, and now we know what it bypassed. + +Note the object reached here is 0x003FDA10, the SAME buffer whose +0x28 is +src_base and which EXPORT builds. So the import and the export are looking at +the same object, and the import refuses it because one of its bytes is 1, not 3. + +Not yet determined: which named field that byte is, and what request sets it to +3. Candidates from the create code (file 0x6CA82): + 6CB0A MOVB *A13(0xffe0),*A9(0x40) ; byte8 := arg (low byte of an argument) + 6CB12 MOVE *A9(0x40),A7 ; SUBK 3 ; byte9 := (byte8==3) ? 3 : 1 + 6CB04 MOVK 1 ; MOVE A11,*A9(0x30) ; word at byte 6 := 1 +so byte8 is copied from an argument of the create, and byte9 is derived from it. +Making byte8 == 3 is therefore the concrete next probe: find which create +argument feeds it and supply 3. diff --git a/xie/evidence/band_d8_zero.txt b/xie/evidence/band_d8_zero.txt new file mode 100644 index 0000000..3fa6914 --- /dev/null +++ b/xie/evidence/band_d8_zero.txt @@ -0,0 +1,21 @@ +Bit/byte correction: *A9(0xd8) is byte 27, not byte 216. + +Live band array entry from the BAND breakpoint: + BAND a11=00290C30 + band entry bytes: + 05 00 00 00 00 00 50 00 70 48 90 00 30 b1 3d 00 + 00 00 00 00 10 21 35 3f 00 00 00 00 04 00 00 00 + ... + byte 27 (0xd8/8) = 0x00 + u32 @24 = 0x00000000 + +The import handoff at 0x6B688 does: + 0x6B684 MOVE *A9(0xd8),A9,1 + 0x6B688 JREQ 0x6B84C ; zero -> no-op + +So with band+0xd8 == 0 the tile payload is never handed to an element. +The create path that should store it is 0x6CC48/0x6CC4E: + CALLA 0x7EAC660 ; allocate 0x39-byte band record + MOVE A8,*A9(0xd8) ; store at band entry + 27 +Our class-2 resource has this zero; class-3 PUT_TILE still fails +BadIDChoice. The band-record allocation path is the remaining unknown. diff --git a/xie/evidence/band_element_dump.txt b/xie/evidence/band_element_dump.txt new file mode 100644 index 0000000..8899d81 --- /dev/null +++ b/xie/evidence/band_element_dump.txt @@ -0,0 +1,36 @@ +BAND / ELEMENT STRUCTURE DUMPED, BEFORE AND AFTER A BIND ATTEMPT. + +Setup: valid c.new_id ids; object pointers taken from the REGIDSTORE breakpoint +(fix: the log line starts "REGIDSTORE", not "IDSTORE" -- my earlier anchored +grep silently matched nothing). + + IMG = 00403000 -> obj 003FD110 class=2 b8=1 b9=1 p44=003DC4B0 + FLO = 00404000 -> obj 00382B90 class=1 b8=0x80 b9=0x32 p44=00386510 + +The IMAGE resource ALREADY has an element pointer at band_array+0xd8, before any +bind: + + band[] at 003DC4B0: 00000000 00000000 00050029 40002005 48000000 48003DC5 + elem = *(003DC4B0 + 0xd8) = 003FD7D0 + elem[]: 01050001 00000002 00100000 00000100 00004000 00000000 + + (0x01050001 as bytes = 01 00 05 01; then 2; then 0x00100000; then 0x100 = 256; + then 0x4000 = 16384. 256 and 16384 are plausibly pitch/geometry values.) + +The PHOTOflo (class 1) has no element (*(p44+0xd8) reads 0x55555555, the heap +fill), and its band array is two pointers: 00382CD0 00382F50. + +BIND attempts: + slot 11 [img,flo] -> BadIDChoice(14) + slot 11 [flo,img] -> BadIDChoice(14) + (both orders rejected here, although the previous turn recorded a REPLY for + the same request shape -- that difference was not explained) + +Effect on the photoflo: its p44 changed 00386510 -> 00382E10 and its band array +became 00382CD0 00386510 ... , i.e. the bind DID touch the photoflo even though +the request reported an error. The image resource was unchanged. + +NOT RESOLVED: what the element record's field layout is (its first word 0x01050001 +does not decompose into a recognisable type/flag pair), what the bind is meant to +write, or how the element chain is meant to be constructed. Without the 2.3 +element encoding these dumps cannot be turned into a conforming pipeline. diff --git a/xie/evidence/baseline_and_arm_failure_after_lookup.txt b/xie/evidence/baseline_and_arm_failure_after_lookup.txt new file mode 100644 index 0000000..a8bfa19 --- /dev/null +++ b/xie/evidence/baseline_and_arm_failure_after_lookup.txt @@ -0,0 +1,41 @@ +TRUSTWORTHY BASELINE ESTABLISHED, and arm's BadMatch localised to AFTER the +shared lookup. + +Protocol model used (established last turn, re-confirmed here): + * create and arm are NO-REPLY requests -- silence means success; + * only errors emit a packet (type=0 | code | seq | bad | minor | major=0x81); + * ids MUST come from c.new_id(...) (the client id base changes per connection). + +BASELINE -- 3 independent trials, one connection each, each step asserted: + + create silent + arm silent + put err BadMatch + (id=00404000 in all three trials; trace: A_IDSTORE once per trial) + +That is reproducible and is now the reference sequence. + +ARM FAILURE LOCALISED (4 breakpoints: ID store, lookup success 0x6BBE2, +DD dispatcher entry 0x40008, DD worker call 0x40086): + + arm w9=0x100 (byte8=1) -> silent (success) trace: LK_SUCCESS + arm w9=0x300 (byte8=3) -> err BadMatch trace: LK_SUCCESS + put w9=0x100 (armed) -> err BadMatch trace: (none) + +Readings: + * For BOTH arm cases the shared lookup REACHES 0x6BBE2 (its success return, + `SUB A8,A8`). So the lookup does not reject a byte8=3 resource. + * Arm with byte8=3 still returns BadMatch, and the DD dispatcher (0x40008) and + its worker call (0x40086) are NOT entered. So the error is produced after the + lookup, but not via the device-dependent dispatcher. + * Put with byte8=1 returns BadMatch WITHOUT reaching 0x6BBE2 -- consistent with + the gate at 0x6BAF4 failing (1 != 3) and returning at 0x6BAF8. + +Also note a correction to the previous turn's instrumented run: that run included +a stray breakpoint at the ROM entry 0x3F200000 which suppressed the trace. This +run (4 breakpoints, no junk) is the valid one. + +NEXT: the arm error is in slot 20's body between the lookup return (0x6AAB8) and +the DD dispatcher, excluding the four MOVK 0x8 sites (0x6ABD2/0x6AC5C/0x6AC96/ +0x6ACD4, which do not fire). Bisect 0x6AAC2..0x6AD1A with valid ids and the +no-reply model. diff --git a/xie/evidence/bind_672a4.txt b/xie/evidence/bind_672a4.txt new file mode 100644 index 0000000..a753268 --- /dev/null +++ b/xie/evidence/bind_672a4.txt @@ -0,0 +1,19 @@ +0x672A4 (called by slots 11, 33, 40, 43, 44) is a bind/copy helper: + + 0x673E2..0x673F2 checks the resource class at +0x20 + 0x673F4 MOVE *A13(0xffe0),*A11(0x140),0x1 + ; resource byte 40 = source pointer (for class 2 or 3) + 0x673FA stores the target pointer back into the caller's local + +Slot 11 is a two-resource bind: + lookup id@4 (type any) + lookup id@8 (type any) + call 0x672A4 with (0, second, first, client) + +So any class-2/3 resource created or bound through this helper gets a +**non-zero byte 40** (the source pointer). That is why class-3 PUT_TILE +returns BadIDChoice: the lookup requires byte40 == 0. + +No request in the recovered set produces a class-3 resource with byte 40 +clear. Slot 43 calls the same helper; its type descriptors/inputs remain the +only untried route. diff --git a/xie/evidence/byte40_and_outcell.txt b/xie/evidence/byte40_and_outcell.txt new file mode 100644 index 0000000..454ee9a --- /dev/null +++ b/xie/evidence/byte40_and_outcell.txt @@ -0,0 +1,42 @@ +TWO VERIFIED FACTS ABOUT THE IMPORT LOOKUP'S INTERNAL TESTS. + +Matrix run under the validated harness (byte8 gate trace + asserted replies). +byte40 is poked only in the DEBUG-only cases, and labelled as such. + + w9=0x100 byte8=1 byte40=0 -> arm1 ok ; put ERROR 8 ; trace ...T_MERGE T_GATE + w9=0x100 byte8=1 byte40=self * -> arm1 ok ; put ERROR 14; trace ...T_B32_zerochk (no MERGE) + w9=0x300 byte8=3 byte40=0 -> arm1 ERR 8; put ERROR 8 ; trace ...T_MERGE (no GATE) + w9=0x300 byte8=3 byte40=self * -> arm1 ERR 8; put ERROR 8 ; trace ...T_B32_zerochk (no MERGE) + + (* debug-only poke, not a client-driven state) + +FACT 1 -- byte40 MUST BE ZERO for the class-2 path. + With byte40 poked non-zero the trace stops at T_B32_zerochk (0x6BA32) and the + request returns BadIDChoice(14). That matches the code: + 6BA38 MOVE *A7(0x140),A7 ; A7 = object->byte40 + 6BA3C JREQ 0x6BAA2 ; zero -> continue + 6BA3E ... MOVK 0xe ; non-zero -> BadIDChoice + So a non-zero byte40 is a fast rejection for this request. (This is the + opposite of what the bind helper 0x672A4 writes into byte40 -- so a bound + resource cannot be used for PUT_TILE in this path.) + +FACT 2 -- with byte8 == 3 the flow reaches T_MERGE but NOT the gate. + For byte8=1 the trace is ...T_MERGE T_GATE; for byte8=3 it is ...T_MERGE then + exit with BadMatch. The only code between is + 6BAA2..6BAAC setup / store + 6BAB2 A7 = *A13(0xff20) ; 6BAB6 JRLT + 6BAC0 A7 = *A11 ; 6BABA JRNE 0x6BAEA <-- reaches the gate only if non-zero + so the "out-cell" test at 0x6BAB8 succeeds with byte8=1 and fails with byte8=3, + on the same request and the same slot-19 frame. I cannot yet explain that + difference, and I am not going to assert a mechanism for it. + +FACT 3 -- arming via slot 33 / slot 44 does not help. + create w9=0x300 (byte8=3) then slot33 [A,B,0]: + arming ERROR 2, byte8 stays 3, PUT_TILE ERROR 2, trace stops before T_GATE + create w9=0x300 then slot44 [A,B,1,1]: + arming ERROR 10, byte8 stays 3, PUT_TILE ERROR 10, trace stops before T_GATE + Neither is an arming path: byte8 is unchanged and the gate is never reached. + +STATUS: no client-chosen XIE image. The import path needs byte8==3 AND a +successful out-cell test at 0x6BAB8, and no client-driven state produces that +combination. src_base remains 0. diff --git a/xie/evidence/byte8_no_writer_final.txt b/xie/evidence/byte8_no_writer_final.txt new file mode 100644 index 0000000..63c60da --- /dev/null +++ b/xie/evidence/byte8_no_writer_final.txt @@ -0,0 +1,44 @@ +FINAL TEST OF THE byte8 TRANSITION HYPOTHESIS -- VALIDATED AND NEGATIVE. + +Setup (harness/mame/xie_b8t.lua): write watchpoints on BOTH resources' byte8, plus +the stack positive control, under the asserting harness (byte(N)=ptr+N*8, every +reply read). + + installed: A byte8 003FDA50, B byte8 003FD5D0, stack 000052A0 + + before: + id 00401000 byte8=1 byte9=1 p44=003DBAF0 elem=003FD7D0 elem0=01 + id 00402000 byte8=1 byte9=1 p44=003DB7B0 elem=003FD350 elem0=01 + + slot33 [A,B,0] -> ERROR 2 (BadValue) no state change + slot40 [A,B,0] -> ERROR 2 (BadValue) no state change + slot44 [A,B,1,1] -> ERROR 2 (BadValue) no state change + + after: identical for both resources (byte8=1, byte9=1, p44 and elem unchanged) + + byte8 watch hits: 0 stack control hits: 2968 + +READINGS: + * The watch mechanism is proven working (2968 stack hits in the same window). + * NOTHING in these three accepted shapes writes byte8 (0 hits on two watched + objects), and none of them changes the element record. + * All three shapes reproducibly return BadValue(2) under the asserting harness + -- earlier "reply" readings for them were the stale SET_OP_DEFAULTS ack. + * The element record IS populated from create (elem0 = 0x01) and is static; it + was never unpopulated, and nothing here populates it further. + +CONCLUSION (validated): among every request shape that can be driven from this +client -- create opcodes, all implemented slots, single- and multi-operand forms, +the bind-family accepted shapes, and the full import/export cycle -- NO request +writes object->byte8 except create. Since + + arm (slot 20) requires byte8 == 1 + import gate (0x6BAF4) requires byte8 == 3 + create sets byte8 = word9 >> 8 + +there is no reachable configuration in which a single resource can be both armed +and import-eligible. That is the wall, and it is now measured rather than +inferred, with a positive control for every watch used. + +Status: no client-chosen XIE image; src_base 0; window still the stipple; +xshow (core X) is the only verified viewer. diff --git a/xie/evidence/byte8_slot_sweep.txt b/xie/evidence/byte8_slot_sweep.txt new file mode 100644 index 0000000..d573275 --- /dev/null +++ b/xie/evidence/byte8_slot_sweep.txt @@ -0,0 +1,36 @@ +CAN ANY OTHER REQUEST RAISE byte8 FROM 1 TO 3? No. + +Clean instrumentation: harness/mame/xie_min.lua (ONE breakpoint: the ID store, +used only to learn the object pointer). All object fields read via rdebug at +the CORRECTED offsets (byte N = ptr + N*8, because ptr is a bit address). + +Per slot: fresh connection, create op=2 with w9=0x100 (which gives byte8=1), +read byte8, send with payload [id,0,...] at that slot's required length, +read byte8 again, then arm. + + slot len request byte8 before -> after arm + 43 10 BadValue(2) 1 -> 1 (no reply read) + 44 5 BadValue(2) 1 -> 1 (no reply read) + 40 4 BadValue(2) 1 -> 1 (no reply read) + 33 4 BadValue(2) 1 -> 1 (no reply read) + 24 4 REPLY 1 -> 1 (no reply read) + 19 8 BadAccess(10) 1 -> 1 (no reply read) + +No implemented request moves byte8. Only create does, and only through word 9's +high byte: byte8 = (word9 >> 8) & 0xFF, with byte9 = (byte8==3) ? 3 : 1 +(verified: w9 = 0x000,0x100,0x200,0x300,0x400 -> byte8 = 0,1,2,3,4). + +Combined with the arm sweep (v12 = 0..6 x v16 = 0..3, 28 shapes): + byte8=1 -> arm OK, put = BadMatch (gate compares 1 with 3) + byte8=3 -> arm ERR8 for every shape, put = BadAccess (unarmed) + +HARNESS NOTE: in these runs the arm (and sometimes create) replies were often +not read back -- the reply stream gets misaligned once several requests are +outstanding on one connection. That does NOT affect this result, because byte8 +and the put error codes are read independently (rdebug peek / slot-19 reply on a +fresh connection). Future runs should read replies with a drain between +requests, or use one request per connection. + +CONCLUSION: within the client-reachable request set, byte8 cannot be raised to 3 +while keeping the resource arm-able. The import therefore cannot be driven to +the handoff, src_base stays 0, and EXPORT has nothing to draw. diff --git a/xie/evidence/byte8_watch_validated.txt b/xie/evidence/byte8_watch_validated.txt new file mode 100644 index 0000000..c4bd703 --- /dev/null +++ b/xie/evidence/byte8_watch_validated.txt @@ -0,0 +1,41 @@ +byte8 WRITE WATCH, NOW WITH A PROVABLE POSITIVE CONTROL. + +Previous attempts at this watch had no control that could be shown to fire, so the +"0 writes" result was not trustworthy (and one VRAM control also read 0, which +told us nothing). + +This run installs, alongside the byte8 watch, a control watchpoint on the STACK +region just below SP -- any function call pushes there, so it must fire if +watchpoints work at all: + + installed: byte8 watch at 003FDA50 ; stack control at 000052A0 (sp=000053A0) + + arm1 -> SILENT(ok) stack control hits: 1218 + PUT_TILE -> ERROR 8 + arm2 -> ERROR 8 + + TOTALS: stack-control hits: 1820 byte8 hits: 0 + +So: + * write watchpoints DO work in this MAME build (1820 positive hits); + * NOTHING writes object->byte8 during create -> arm1 -> PUT_TILE -> arm2 + (0 hits against that control). + +This CONFIRMS, on validated instrumentation, the earlier claim that only create +sets byte8 (via word9 >> 8), and therefore confirms the mutual exclusion: + + arm (slot 20) requires byte8 == 1 + import gate (0x6BAF4) requires byte8 == 3 + only create can set byte8 + +Together with the previous turn's validated gate trace (T_ENTRY -> T_DISP -> T_C2 +-> T_J1 -> T_B32 -> T_MERGE -> T_GATE -> a8=8), the model is now: + + byte8 = 1 : arm succeeds; PUT_TILE reaches 0x6BAF4 and fails there (BadMatch) + byte8 = 3 : arm fails; PUT_TILE never reaches the gate + +and no client request can move byte8 between those values. Within the request +surface I can construct, the two requests are mutually exclusive. + +Status: no client-chosen XIE image; src_base 0; window still the stipple; +xshow (core X) is the only verified viewer. diff --git a/xie/evidence/byte8_write_watch_closure.txt b/xie/evidence/byte8_write_watch_closure.txt new file mode 100644 index 0000000..56d5721 --- /dev/null +++ b/xie/evidence/byte8_write_watch_closure.txt @@ -0,0 +1,42 @@ +CLOSURE: no client request writes object->byte8. The transition into the +importable state is unreachable from the request set. + +Method: valid c.new_id ids, no-reply model (silence = success), generated bit +addresses. A single breakpoint captured the object pointer from create, then a +WRITE WATCHPOINT was installed on byte 8 of that object and left armed across a +complete cycle. + + create -> silent (success) obj = 003FDC50 + watch installed at 003FDC90 (= obj + 8 bytes), byte8 read-back = 1 + arm1 -> silent (success) + put -> BadMatch + arm2 -> BadMatch + export -> silent (success) + + byte8 WRITE EVENTS AFTER CREATE: 0 + byte8 value throughout : 1 + +So nothing in create-after, arm, import, re-arm or export writes byte8. Combined +with the code findings: + + arm requires obj->byte8 == 1 (slot 20, file 0x6ACBE/0x6ACC2) + import requires obj->byte8 == 3 (slot 19, file 0x6BAF4/0x6BAF6) + create sets byte8 = word9 >> 8 (file 0x6CB0A/0x6CB12) + +the only way to obtain byte8 == 3 is create with word9 = 0x300, and such a +resource cannot be armed (arm returns BadMatch at 0x6ACD4 for every one of the 25 +(v12,v14) combinations tried). An unarmed resource's import returns BadAccess +without reaching the gate. + +CONCLUSION (with evidence, not assertion): a byte8 transition into the importable +state is NOT reachable from the client request set. Therefore the import cannot +be driven, src_base remains 0, and EXPORT has nothing to draw. This closes the +last request-level door identified in this investigation. + +Residual possibilities, all outside the client request set: + * an internal code path that writes byte8 (the watch shows none occurs in a + normal cycle, but a path we cannot trigger could exist); + * a request form with a shape never constructed (every implemented slot has + been swept, so this would have to be an unimplemented minor); + * the DEC XIE 2.3 protocol may define a different intended sequence entirely, + which the documentation would state directly. diff --git a/xie/evidence/chain_arm_import_export_ok.txt b/xie/evidence/chain_arm_import_export_ok.txt new file mode 100644 index 0000000..a7e21f2 --- /dev/null +++ b/xie/evidence/chain_arm_import_export_ok.txt @@ -0,0 +1,37 @@ +FIRST CHAIN WHERE arm1, PUT_TILE AND EXPORT ALL RETURN SUCCESS. + +Key realisation from the register dump: the two checks read DIFFERENT fields, so +they are NOT mutually exclusive after all -- + arm requires object->byte8 == 1 (DSJS at 0x6ACC2, a7 = byte8) + import requires *(object->byte36) == 3 (dereferenced byte, 0x6BAF2) +Earlier turns concluded they conflicted only because I assumed both were byte8. + +CHAIN (create w9=0x100 -> byte8=1; byte36/scratch poked to satisfy the import +gate; debug pokes labelled): + + white tile black tile + arm1 SILENT(ok) SILENT(ok) + PUT_TILE SILENT(ok) <- import accepted SILENT(ok) + arm2 ERROR 8 ERROR 8 + EXPORT SILENT(ok) <- export accepted SILENT(ok) + RP src_base610=00000000 src_base610=00000000 + window nz 512 -> 512, changed=False changed=False + first=888888888888888822222222... same + +So for the first time the import AND the export both report success -- but + * src_base (rp+0x610) is STILL 0, + * the window is unchanged, white and black identical, + * arm2 (the second execute) still returns BadMatch. + +WHAT THIS MEANS: the import being accepted does not populate the export's source +buffer. The handoff that should fill element+0x28 (the import-element executor +0x7EAB640, which the earlier analysis tied to this path) evidently does not run, +or runs without a destination. arm2 failing may be part of the same gap. + +NEXT: instrument 0x7EAB640 (file 0x6B640) during this now-successful PUT_TILE to +confirm whether the import handoff executes at all, and if it does, what it +writes -- since that is the only remaining step between "import accepted" and +"src_base non-zero". + +Status: no client-chosen XIE image yet; the window remains the stipple; xshow is +still the only viewer that has displayed an image. diff --git a/xie/evidence/class3_b40_patch.txt b/xie/evidence/class3_b40_patch.txt new file mode 100644 index 0000000..2e00ed7 --- /dev/null +++ b/xie/evidence/class3_b40_patch.txt @@ -0,0 +1,17 @@ +Deterministic resource pointer from breakpoint 0x6CC0E (RESPTR a7=...): + + create op 1 (class 3): + resource 0x003FDC50 class 3 byte40 before 0x003C73D0 + patch byte40 -> 0x00000000 + arm1 OK + put -> ERR14 (BadIDChoice) + S19LOOK a8=0000000E (BadIDChoice) + no S19HANDOFF + +Second run: + resource 0x003FC810 class 3 byte40 0x00320C10 -> 0 + put -> ERR14, S19LOOK a8=0x0E + +So even a class-3 resource with byte 40 forced to 0 is not found by the +lookup table slot 19 uses. Class-3 resources live in a different table or +namespace; patching the struct does not register them for PUT_TILE. diff --git a/xie/evidence/class3_id_not_stored.txt b/xie/evidence/class3_id_not_stored.txt new file mode 100644 index 0000000..fb58fc8 --- /dev/null +++ b/xie/evidence/class3_id_not_stored.txt @@ -0,0 +1,57 @@ +WHY CLASS 3 IS UNREACHABLE -- the ID is never stored. This also retracts the +"byte 40 == 0" explanation: byte 40 is a copy-out field, not a gate. + +A. slot 8 (create, file 0x668E4) dispatches on request word 0: + 6696C DEC A8 ; JREQ -> 0x66912 op 1 ---\ + 66970 DEC A8 ; JREQ -> 0x66912 op 2 ---/ SAME routine 0x7EA78DA + 66974 SUBK 2 ; JREQ -> 0x66902 op 4 -> 0x7EA76CA + 66978 DEC ; JREQ -> 0x66922 op 5 -> 0x7EA7B46 + 6697C DEC ; JREQ -> 0x66932 op 6 -> 0x7EA7DA8 + So op 1 and op 2 are the SAME create code (file 0x678DA). + +B. Inside 0x678DA (file), the only op-dependent value is: + 6799C MOVE *A9(0x20),A11,1 ; word0 = op + 679A2 SUBK 0x2,A11 + 679A4 MOVK 0x1,A11 + 679A6 JREQ 0x679AA ; op==2 -> arg = 1 + 679A8 SUB A11,A11 ; else -> arg = 0 + 679AA ... push arg, w, h, and bytes at request offsets 44/43/42 + 679D6 CALLA 0x7F638C2 ; allocator + 67A20 MOVE *A9(0x20),A11,1 + 67A24 DSJ A11,0x67AFC ; loop runs `op` times (op = level count) + +C. Measured objects (RESPTR 0x6CC0E gives the allocation deterministically): + + create op=1 ID=0040B301 object=003FCC90 + words: 00000000 00010103 00000101 00000000 00000040 00000040 ... + word1 = 0x00010103 -> class byte 3 + id@0 = 0x00000000 *** ID NOT STORED *** + ID string 0040B301 appears NOWHERE in the object's first 0x100 bytes + slot24 query -> ERR10 (BadAccess), PUT_TILE -> ERR14 (BadIDChoice) + + create op=2 ID=0040B302 object=003FDA10 + words: 0040b302 00010102 00000101 00000000 00000040 00000040 ... + word1 = 0x00010102 -> class byte 2 + id@0 = 0x0040B302 ID stored + slot24 query -> REPLY, PUT_TILE -> ERR10 / ERR8 + + ID position sweep: only payload word 1 is accepted. Putting the ID in any + other word makes create fail with ERR14, so word 1 IS the ID field. + +D. Retraction of the byte-40 rule. The shared lookup helper (file 0x66FA0) + has two variants: + 6707E MOVE *A7(0x140),*A11(0x0),1 ; non-NULL out-param: COPY byte40 out + 6708C MOVE *A7(0x140),A7,1 ; JREQ ; NULL out-param: require byte40 == 0 + The "must be 0" test only exists in the variant with a NULL out-parameter, + and it raises 0xE, not 0x8. The 0x8 (BadMatch) we observe comes from the + table lookup 0x7F174A4 / the class compare, not from byte 40. So patching + byte 40 could never have fixed PUT_TILE, which is exactly what was measured. + +E. Falsified during this check: the word at parent+48 is NOT a child object. + At 003FD6F0 it reads as heap-block metadata followed by the terminal message + "Connection request from IP host 192.168.99.1". There is no class-3 child. + +CONCLUSION: PUT_TILE demands a class-3 resource that is registered by ID, and +the only class-3 creator (create op=1) never stores the ID, so it can never be +found. The missing piece is the request that both selects class 3 and stores +an ID -- the create routine's `(op==2)?1:0` flag is the only knob found so far. diff --git a/xie/evidence/class3_registration_impossible.txt b/xie/evidence/class3_registration_impossible.txt new file mode 100644 index 0000000..bec58aa --- /dev/null +++ b/xie/evidence/class3_registration_impossible.txt @@ -0,0 +1,78 @@ +STRUCTURAL RESULT: a class-3 resource with a stored ID cannot be created through +slot 8 at all. The class and the registration are mutually exclusive inside the +only routine that produces either. + +All offsets are FILE offsets (Ghidra addresses); the CALLA convention is +file = immediate - 0x7E40000 (verified: 0x7EA78DA -> 0x678DA). + +1) slot 8 dispatches op 1 and op 2 to the SAME routine, file 0x678DA: + 6696C DEC A8 ; JREQ 0x66912 op 1 ---\ + 66970 DEC A8 ; JREQ 0x66912 op 2 ---/ -> 0x7EA78DA + +2) The only op-dependent value passed on is (op == 2) ? 1 : 0: + 6799C MOVE *A9(0x20),A11,1 ; word0 = op + 679A2 SUBK 0x2,A11 + 679A4 MOVK 0x1,A11 + 679A6 JREQ 0x679AA ; op==2 -> arg = 1 + 679A8 SUB A11,A11 ; else -> arg = 0 + +3) That flag alone decides the class, at 0x6CAF2 in file 0x6CA82: + 6CAF2 MOVE *A13(0xfec0),A11,1 ; the flag + 6CAF6 JREQ 0x6CAFC + 6CAF8 MOVK 0x2,A11 ; flag != 0 -> class 2 + 6CAFA JR 0x6CAFE + 6CAFC MOVK 0x3,A11 ; flag == 0 -> class 3 + 6CAFE MOVB *A11,*A9(0x20) ; obj->byte4 = class (0x20 bits = 4 bytes) + + So class = 3 iff op == 1, and class = 2 iff op == 2. + +4) The ID store and the table registration live ONLY in the loop body at 0x67AFC, + which is reached only when DSJ jumps: + 67A20 MOVE *A9(0x20),A11,1 ; A11 = op + 67A24 DSJ A11,0x00067afc ; op-1 != 0 -> jump to the registering body + 67A28 ... ; op-1 == 0 -> photoflo path (see 5) + + 67AFC MOVE *A13(0x20),A11,1 + 67B00 JRNE 0x67B04 + 67B02 MOVE *A13,A11,1 + 67B04 MOVE *A9(0x40),*A11(0x0),1 ; *** ID -> obj+0 *** + 67B0E MOVE @0x1ad980,A11,0 + 67B16 MOVI 0x3f566ed0,A7 ; the XIE handler pointer + 67B1E MOVE *A13(0x20),A7,1 + 67B22 JRNE 0x67B26 + 67B24 MOVE *A13,A7,1 + 67B26 MOVE A7,*A14+ + 67B28 MOVE @0x1ad990,A7,0 + 67B30 MOVE *A9(0x40),*A14+ ; the id + 67B34 CALLA 0x07f16ca2 ; *** register in the resource table *** + + op = 1 -> DSJ decrements to 0, does not jump -> 0x67A28: the ID is NEVER + stored and the resource is NEVER registered. + op = 2 -> DSJ decrements to 1, jumps -> ID stored at obj+0 and registered. + +5) What op=1 does instead is create a PHOTOflo, not a resource: + 67A28 MOVK 0x14,A11 ; 20-word allocation + 67A32 CALLA 0x07f63a30 + 67A42 MOVI 0x3f544b10,A8 ; "error allocating photoflo" string + 67A88 MOVK 0x1,A7 + 67A8A MOVB *A7,*A11(0x20) ; that object's class = 1 + 67AB0 CALLA 0x07ea72a4 ; bind helper + + This is why every measured create op=1 object has class 3 (from step 3) but + id@0 == 0 (step 4): they are two different objects, and the class-3 one was + never registered. + +6) Measured consequence, reproduced many times this session: + create op=2 -> class 2, id@0 = ID, query OK, PUT_TILE -> BadMatch (8) + create op=1 -> class 3, id@0 = 0, query BadIDChoice, PUT_TILE -> BadIDChoice + + PUT_TILE's lookup demands class 3 (slot 19 pushes MOVK 0x3 before the typed + lookup). The only class-3 producer never registers. So the import is + unreachable: not because a request shape is missing, but because the two + properties the lookup requires are mutually exclusive in the implementation. + +7) Also measured, and it rules out the remaining "add levels" idea: + op=4 [newid, existing] increments a 16-bit counter on the existing resource + (obj word at byte 6): 1 -> 2 -> 3 after two calls, and RESPTR shows NO new + allocation. PUT_TILE on that resource stays BadMatch (8) at every count, + including when the counter is 3. diff --git a/xie/evidence/class_skip_false_success.txt b/xie/evidence/class_skip_false_success.txt new file mode 100644 index 0000000..7f1f93c --- /dev/null +++ b/xie/evidence/class_skip_false_success.txt @@ -0,0 +1,15 @@ +Instrumentation during create -> arm -> PUT_TILE: + + breakpoint 0x6A76E slot 19 entry -> no hit logged + 0x6A7B4 after resource lookup -> no hit logged + 0x6A9A2 call to 0x7EAB640 -> no hit (HANDOFF absent) + 0x6B688 band+0xd8 load -> no hit + 0x6B6EA call to 0x7E80008 -> no hit (DEARG absent) + 0x7E80008 entry / 0x4001E / 0x40042 / 0x40086 -> no hit (DE/DDCALL absent) + +So the import handoff 0x7EAB640 is never called. The "PUT_TILE OK" seen +earlier is the debugger branch-skip at 0x6BAF6 taking an early success path, +not a real import. The class-2 resource cannot reach the band handoff; the +legitimate path requires a class-3 resource with resource byte 40 == 0. + +This invalidates the earlier "put OK" results as evidence of import. diff --git a/xie/evidence/conversion_helpers_probed.txt b/xie/evidence/conversion_helpers_probed.txt new file mode 100644 index 0000000..d1daedb --- /dev/null +++ b/xie/evidence/conversion_helpers_probed.txt @@ -0,0 +1,39 @@ +TURN RECORD: FIRMWARE CONVERSION HELPERS PROBED DURING A REAL EXPORT. + +Addresses derived from the CALLA immediates (file = cal - 0x7E40000): + 0x07FC229C -> file 0x18229C (bit 0x3FE114E0) + 0x07FC1EB2 -> file 0x181EB2 (bit 0x3FE0F590) + 0x07FC1F5E -> file 0x181F5E (bit 0x3FE0FAF0) + 0x07FC2210 -> file 0x182210 (bit 0x3FE11080) + +Run: ./xie/build/dec/decclient 192.168.99.2:0 ff 3 (the genuine 2.3 client, + org=BandByPlane, export straight to the window) + +MEASURED: + image: org=3 w=64 h=64 levels=2,0,0 arSize=4096 + photomap created + put tile sent + X Error: BadValue, Major 129 (Xie), Minor 21 (Export) + + trace: + H1EB2 a0=003F09B0 a1=00000000 a8=40C4D134 + H1EB2 a0=003F09B0 a1=00000000 a8=44CFF000 + + H229C (0x7FC229C) never fired, H1F5E and H2210 never fired, and none of the + post-call sites (R_C4 / R_E2 / R_10 / R_44) fired either. + +So with org=BandByPlane the export does NOT go through the per-element block at +0x1B3C4..0x1B43E at all -- the only conversion helper reached is 0x7FC1EB2, twice, +with the same source pointer (0x3F09B0) and a1 = 0, and float-looking results in +A8 (0x40C4D134 / 0x44CFF000). Those are the only two conversion calls observed. + +INTERPRETATION (not yet proven): 0x7FC1EB2 is being used as a numeric helper +(its outputs look like IEEE singles), not as the pixel mover; the pixel-moving +call that would fail is not reached, which is consistent with BadValue being +raised before any real conversion. + +STATE (unchanged): no client-chosen image displayed; window untouched; white vs +black captures differ only by Terminal Manager figures and cursor. +xshow (core X) remains the only viewer that has shown an image. + +STATUS. NO client-chosen XIE image. diff --git a/xie/evidence/create_by_reference_and_arm_loop.txt b/xie/evidence/create_by_reference_and_arm_loop.txt new file mode 100644 index 0000000..1d77612 --- /dev/null +++ b/xie/evidence/create_by_reference_and_arm_loop.txt @@ -0,0 +1,57 @@ +TURN RECORD: ops 4/5/6 DECODED (CREATE_BY_REFERENCE family), AND SLOT 20 IS THE +ELEMENT EXECUTOR. + +A) ops 4/5/6 ARE LENGTH-KEYED (static, then confirmed on the wire) + Each routine opens with the same prologue and compares the REQUEST LENGTH: + op4 0x676CA: MOVE *A9(0x10) = length ; SUBK 0x6 ; -> must be 6 words + op5 0x67B46: SUBK 0x7 ; -> must be 7 words + op6 0x67DA8: SUBK 0x6 ; -> must be 6 words + Wire confirmation (asserting replies): + op=4 len=12 -> err16 (BadLength) <- wrong length rejected + op=4 len=6 -> not a length error + +B) WITH THE RIGHT LENGTH THEY VALIDATE AN EXISTING ID AND CREATE NOTHING + Source = a real op=2 resource (SRC, byte36=0). New id = NEW (never used). + op=4 [NEW, SRC] -> silent arm(NEW) -> BadIDChoice(14) bad=NEW + op=4 [SRC, NEW] -> err14 bad=NEW (so w2 is the id it validates) + op=5 [NEW, SRC] -> err2 (BadValue) + op=5 [SRC, NEW] -> err2 + op=6 [NEW, SRC] -> err14 bad=NEW + op=6 [SRC, NEW] -> silent arm(NEW) -> BadIDChoice(14) bad=NEW + In NO case does the REGIDSTORE breakpoint (0x67B04) fire, and the new id is + never resolvable afterwards. So these requests are accepted but produce no + registered resource -- the same "allocate without registering" behaviour seen + for the by-value path. + +C) THE REFERENCE MUST BE AN XIE ID, NOT A CORE-X DRAWABLE + Passing a mapped core-X window (0x70D000) and its GC (0x70D100): + op=4 [NEW, window] -> silent, then queued errors + err14 bad=0070D000 (the window id) + err14 bad=0070D100 (the GC id) + So the routine does look up a DRAWABLE + GC pair by id -- the create-by- + reference signature -- but the server's lookup rejects core-X ids. + +D) SLOT 20 (arm / execute) IS THE ELEMENT EXECUTOR -- it loops over elements + 6AAE4 A7 = *A5(0xd8) ; element pointer for band index + 6AAE8 JREQ 0x6AB46 ; no element -> A7 = 0 + 6AB0A A8 = *A7(0x1a8) + 6AB0E CALLA 0x07FC22DE ; 6AB14 CALLA 0x07FC2C34 ; 6AB2A CALLA 0x07FC2C34 + 6AB30 CALLA 0x07FC1ACA ; 6AB36 CALLA 0x07FC288A ; 6AB3C CALLA 0x07FC216A + 6AB48 MOVE A7,*A11(0x120) ; A11 = A13 + idx*0x20 -> PER-ELEMENT FRAME SLOT + 6AB5C A11 = *A11(0x120) ; A7 = *A13(0x100) ; A11 += A7 ; store -> accumulator + 6AB6E SUBK 0x3 ; JRC 0x6AACC ; loop over (up to) THREE elements + So arm walks up to three elements taken from the band array at +0xd8, runs a + chain of routines on each, and accumulates an output pointer. The element + pointers ARE populated by create (e.g. 0x3FD7D0), so arm has elements to run + -- but the element carries no process-block chain (nothing ever wrote one), + and src_base (rp+0x610) stays 0. + +E) WHAT THIS SETTLES + * op 4/5/6 are not the missing "photomap with a band descriptor": they are + reference-based creation that registers nothing on this server. + * The import gate's object->byte36 is still never written by any request. + * The pipeline elements at band_array+0xd8 exist but are empty; nothing in the + tested request surface adds a process block to them. + +STATUS. No client-chosen XIE image; src_base (rp+0x610) 0; window still the +stipple; xshow (core X) is the only viewer that has displayed an image. diff --git a/xie/evidence/create_is_fixed_and_puttile_not_reproducible.txt b/xie/evidence/create_is_fixed_and_puttile_not_reproducible.txt new file mode 100644 index 0000000..7349c04 --- /dev/null +++ b/xie/evidence/create_is_fixed_and_puttile_not_reproducible.txt @@ -0,0 +1,41 @@ +TURN RECORD: CREATE IS A FIXED-SIZE REQUEST, SLOT 20 USES ONLY 4 WORDS, AND THE +ONE "SUCCESSFUL" PUT_TILE DOES NOT REPRODUCE. + +A) CREATE IS EXACTLY 11 DATA WORDS FOR BOTH OPS -- NO ELEMENT LIST + Previously I had only swept payload lengths with op=2. Swept op=1 now: + L=11 -> ok/silent, REGISTERS (cls=1, b8=D0, b9=09, b36=00385990, + b44=00385890, elem=55555555) + L=12,13,14,15,16,18,20,22,24 -> err16 (BadLength), NO registration + Same for op=1 with element-ish words (2,1,1,0) at every length >= 12. + So the create request is a fixed 11-data-word structure and CANNOT carry the + "supplied list of elements" described in xieSIarch.txt 8.3.4.1. That + hypothesis is closed. + +B) SLOT 20 READS ONLY w0..w3 + All request words slot 20 touches: 0x20 (w0), 0x40 (w1), 0x60 (w2), + 0x68 (byte 13), 0x70 (byte 14), 0x80 (w3), plus 0x8 (minor) and 0x10 + (length, must be exactly 0x23 = 35). The other 28 data words are unused + padding -- the 35 is a fixed wire struct, not an element array. + Swept w0/w1/w2/w3 with a registered photoflo, a registered photomap and a + mapped core-X window in every position: + every combination -> err2 (BadValue); TYPE1..TYPE5, RP and GATE never fire. + +C) SLOT 18'S BadAccess IS NOT ITS OWN + slot 18 contains no `MOVK 0xa,A8`; its request words are only w0 (0x20) and + w2 (0x60) plus byte 13 (0x68). The BadAccess(10) therefore comes from the + shared lookup callee (0x7EAB966 / 0x7EABEFA / 0x7EABC2A), i.e. from the + object's state rather than from an operand. + +D) THE EARLIER PUT_TILE SUCCESS DOES NOT REPRODUCE + Re-ran the exact configuration that once returned SILENT(ok) with + element+0x28 = 0x00929990 (create op=2, arm, byte36 -> scratch with + [0]=3 [1]=1 [8]=1, band=1, 64x64 white and black tiles): + white: arm1 ok/silent, PUT_TILE = err2, elem+0x28 = 00000000 + black: arm1 ok/silent, PUT_TILE = err2, elem+0x28 = 00000000 + So that lone success was an artefact of uninitialised heap state (byte36 and + the byte it pointed at), not a reproducible protocol path. No tile data is in + server memory and white/black are still identical. + +STATUS. No client-chosen XIE image. src_base (rp+0x610) has been 00000000 in +every run; the window has never differed from the no-export baseline; the only +viewer that has displayed an image is xshow, which is core X. diff --git a/xie/evidence/create_opcode_sweep.txt b/xie/evidence/create_opcode_sweep.txt new file mode 100644 index 0000000..96aee76 --- /dev/null +++ b/xie/evidence/create_opcode_sweep.txt @@ -0,0 +1,39 @@ +CREATE OPCODE SWEEP -- all accepted ops tested; none yields an addressable +class-3 resource. + +slot 8 (create) dispatch, file 0x668E4: + 6696C DEC A8 ; JREQ 0x66912 op 1 -> 0x7EA78DA + 66970 DEC A8 ; JREQ 0x66912 op 2 -> 0x7EA78DA (SAME routine as op 1) + 66974 SUBK 2 ; JREQ 0x66902 op 4 -> 0x7EA76CA + 66978 DEC ; JREQ 0x66922 op 5 -> 0x7EA7B46 + 6697C DEC ; JREQ 0x66932 op 6 -> 0x7EA7DA8 + 66980 JR 0x66942 anything else -> BadValue + +Required lengths, read from each routine's own prologue: + op 1/2 -> exactly 12 words (0x678F8 SUBK 0xc) + op 4 -> exactly 6 words (0x676E2 SUBK 0x6 ; JREQ) + op 5 -> exactly 7 words (0x67B5E SUBK 0x7 ; JREQ) + op 6 -> >= 6 words (0x67DC0 SUBK 0x6 ; JRNC) + +Measured (single instance, RESPTR breakpoint at 0x6CC0E as the create tell): + + op=1 [1,ID,64,64,...] create OK RESPTR 1 query ERR14 put ERR14 + op=2 [2,ID,64,64,...] create OK RESPTR 1 query REPLY put ERR10/ERR8 + op=3 [3,...] ERR14 (BadIDChoice) RESPTR 0 + op=4 [4,newID,existingID,0,0] create OK RESPTR 0 query ERR14 put ERR14 + op=5 [5,ID,64,64,1,1] create OK RESPTR 0 query ERR14 put ERR14 + op=6 [6,existingID,0,0,0] OK RESPTR 0 existing stays REPLY + +Readings: + * op 4 and op 5 return OK but allocate NOTHING that the create tell sees, and + their ID is never addressable, so they are not creates -- both first act on + an existing resource (op 4 starts with a lookup of payload word 2 via + 0x7EA6FA0 at 0x676FE; op 6 looks up payload word 1 via 0x7F174A4). + * op 6 leaves the existing resource intact and queryable, so it is not a + destroy either. + * op 3 is rejected outright. + * Only op 2 produces an addressable resource, and its class is 2. + +Therefore the whole accepted create opcode space {1,2,4,5,6} has been tested and +none of it produces a class-3 resource that is registered by ID. This closes +the "try another create opcode" route to the PUT_TILE lookup. diff --git a/xie/evidence/dec_23_client_built.txt b/xie/evidence/dec_23_client_built.txt new file mode 100644 index 0000000..99ce1d3 --- /dev/null +++ b/xie/evidence/dec_23_client_built.txt @@ -0,0 +1,42 @@ +TURN RECORD: DEC'S OWN XIE 2.3 CLIENT LIBRARY IS BUILT AND RUNNING AGAINST THE +TERMINAL. ITS EXPORT FAILS WITH BadMatch (8), NOT BadValue (2). + +A) BUILD + Sources: xie/docs/dec/xie23-src/lib/xie/*.c (9 files, 9,723 lines) + Headers shimmed into xie/build/dec/{,X11/extensions/} and X.h copied. + Compile: gcc -std=gnu89 -fcommon -w -I xie/build/dec -I /include \ + -I /lib/xie + 8/9 files built clean; XieConvert.c needed X.h. All 9 linked into + xie/build/dec/libXie.a (140,164 bytes), exporting the full client API + (XieCreateImage, XieCreatePhoto, XiePutImage, XiePutTile, XieExport, + XieQueryExport, XieCrop, XieScale, ...). + Client program: xie/decclient.c -> xie/build/dec/decclient + (needs one stub: unsigned long (*xieDdxProc[1])() = {0}; the client never + calls the DDX dispatch table.) + +B) RUN AGAINST THE VT1200 (192.168.99.2:0) + display opened; root depth = 1 (xdpyinfo: "depths (1): 1", + "depth of root window: 1 plane") -- so drawable depth MATCHES the 1-bit image. + XieCreateImage -> ok (w=64 h=64) + XiePutImage -> photomap created + XieExport -> **BadMatch (invalid parameter attributes)** + Major opcode 129 (Xie), Minor opcode 21 (Export) + + That is a DIFFERENT error from my hand-rolled client, which got BadValue (2). + Per the server source, ProcExport's MatchOkIf_ is + MatchOkIf_( Constrained_(img), stuff->photo_id ) + and Constrained_(img) = ( *cmplvl > 0 ) set at photomap creation. + +C) VARIANT ATTEMPTED + Replaced XiePutImage with XieCreatePhoto + XiePutTile + XieExport (the + library's own encoding of the sequence my hand-rolled probe uses). + The process CRASHED (core dumped) in that combination -- not yet diagnosed. + +D) STATE + No client-chosen image has been displayed. Window unchanged. + xshow (core X) remains the only viewer that has shown an image. + +WHAT THIS BUYS: a genuine 2.3 client now exercises the terminal, so the wire +format is no longer in question -- the remaining difference is server-side state +(the photomap's Constrained_ flag / creation attributes) or an incompatibility +between the image and the drawable that BadMatch is telling us about. diff --git a/xie/evidence/dispatch_entry19.txt b/xie/evidence/dispatch_entry19.txt new file mode 100644 index 0000000..d66b971 --- /dev/null +++ b/xie/evidence/dispatch_entry19.txt @@ -0,0 +1,22 @@ +Live XIE dispatch table, read at RAM bit 0xD3F90 + idx*32: + + entry 1 handler=3F545260 file=0x68a4c + entry 8 handler=3F534720 file=0x668e4 + entry 19 handler=3F553B70 file=0x6a76e + entry 20 handler=3F5552A0 file=0x6aa54 + entry 21 handler=3F516A00 file=0x62d40 + entry 24 handler=3F518AF0 file=0x6315e + +So minor 19 really is 0x6A76E. + +PUT_TILE without the 0x6BAF6 branch skip: + + XIEHIT ... 1381 0088 ... (minor 19 reaches XieProc) + S19ENTRY (0x6A76E reached) + S19LOOK a8=00000008 (resource lookup returns BadMatch/8) + put -> ERR8 bad=id minor=19 + no S19HANDOFF (0x7EAB640 never called) + +The earlier "put OK" was the branch skip bypassing this lookup and returning +early. The real path requires a resource that passes the lookup: class 3 with +byte 40 == 0. diff --git a/xie/evidence/element_byte4_never_written.txt b/xie/evidence/element_byte4_never_written.txt new file mode 100644 index 0000000..bf6cc26 --- /dev/null +++ b/xie/evidence/element_byte4_never_written.txt @@ -0,0 +1,36 @@ +ANSWER: NOTHING INITIALISES THE BAND ELEMENT'S BYTE 4. + +Test: photomap created with the correct xieCreatePhotoReq (levels 2,2,2, +#components 1, bitonal), then SetTransport(mode=3, org=1) and PutTile(64x64, +plane_mask=1, final=1). A write watchpoint was armed on element+0x20 (byte 4) +as soon as the element existed, with the stack control watch proving the +mechanism was live (952 control hits). + + obj=003FD7D0 band=003DBAF0 elem=003FD590 elem.b4=55 + after PutTile: elem.b4=55 <-- UNCHANGED + watch hits: 1, at pc=3F4019D0 (file 0x4033A), val=0000B055 + -- that instruction is `MOVE A8,*A9(0x28)`, i.e. it stores byte 5, the + adjacent field, not byte 4. + +So across create -> SetTransport -> PutTile the element's compression byte stays +at the heap fill value 0x55. The import path never initialises it, and the +export path later copies it verbatim into renderptr->compression_scheme +(0x1B256: MOVB *A5(0x20),*A11(0x630)), where DDX_RENDER rejects it with +"unsupported compression scheme". + +That is the complete, measured causal chain from a correct client request to the +BadValue the client receives. + +STATE + import verified: element+0x28 = 0xFF white / 0x00 black, QueryResource + comp_COUNT=1, 64x64, constrained + export: BadValue in every configuration, from both the hand-rolled client and + DEC's own 2.3 client built from source + with a labelled poke setting element byte 4 = 0 (XieK_PCM), the renderer + passes both DDX gates (CHK_610 val=00911050, PAST_610_OK) and then fails on a + further, undocumented path + window: unchanged in every run; white vs black captures differ only by + Terminal Manager figures and cursor + xshow (core X) remains the only viewer that has shown an image + +STATUS. NO client-chosen XIE image has been displayed. diff --git a/xie/evidence/element_list_handler_hunt.txt b/xie/evidence/element_list_handler_hunt.txt new file mode 100644 index 0000000..973ea14 --- /dev/null +++ b/xie/evidence/element_list_handler_hunt.txt @@ -0,0 +1,52 @@ +HUNT FOR THE ELEMENT-LIST HANDLER: NO VARIABLE-LENGTH ELEMENT REQUEST EXISTS +IN THE IMPLEMENTED SURFACE. + +A) STATIC: every handler's length gate was extracted and classified + slot 0 EXACT(4) slot 1 EXACT(2) slot 3 EXACT(2) slot 4 EXACT(2) + slot 5 EXACT(5) slot 7 EXACT(4) slot 8 MIN(>=3) slot 9 EXACT(3) + slot 10 EXACT(3) slot 11 EXACT(3) slot 12 EXACT(2) slot 13 EXACT(2) + slot 14 EXACT(4) slot 15 EXACT(3) slot 18 MIN(>=4) slot 19 MIN(>=8) + slot 20 EXACT(35) slot 21 EXACT(16) slot 22 EXACT(2) slot 24 EXACT(4) + slot 33 EXACT(4) slot 40 EXACT(4) slot 43 EXACT(10) slot 44 EXACT(5) + Only slots 8, 18, 19 accept a variable length. A photoflo-create request + carrying "the supplied list of elements" (xieSIarch.txt 8.3.3.1 / 8.3.4.1) + would have to be variable length or a very large fixed layout. + +B) SLOT 20 IS THE ONLY LARGE FIXED REQUEST: length must be EXACTLY 35 words + 0x6AA6E MOVE *A9(0x10),A7,0x0 ; request length + 0x6AA72 CMPI 0x23,A7 ; 0x23 = 35 + 0x6AA76 JREQ 0x6AA7E else MOVK 0x10 (BadLength) + It then does the generic resource lookup (0x7EAB966) on w0 with byte13 as a + class argument, and loops over up to 3 band-array elements (*A5(0xd8)). + + Measured (photoflo + image both registered, 35-word payload, 32 data words): + w0=FLO w2hi=0 -> err2 (BadValue) renderer trace: (none) + w0=FLO w2hi=1 -> err8 (BadMatch) renderer trace: (none) + w0=FLO w2hi=2 -> err8 (BadMatch) renderer trace: (none) + w0=FLO w2hi=3 -> err8 (BadMatch) renderer trace: (none) + w0=IMA w2hi=2 -> err8 (BadMatch) renderer trace: (none) + No TYPE1..TYPE5 store fired, the RP (0x1B296) breakpoint never fired, and the + GATE never ran. So slot 20 rejects before building anything. + +C) THE TWO VARIABLE-LENGTH HANDLERS DO NOT FIT EITHER + slot 8 MIN(>=3): parses 4 request words, has NO element loop, and an + over-long payload simply fails to register (length sweep 11..27). + slot 18 MIN(>=4): the only handler that touches *A7(0xd8) and writes + element+0x20, but it returns BadAccess(10) with the resource id for + BOTH a class-2 resource and a class-1 photoflo. + +D) CONSEQUENCE + Within the request surface this server implements and that I can drive, there + is no request that accepts a list of elements with phototags, no request that + writes the element record, and no request that makes the renderer produce a + non-zero source (src_base = rp+0x610 has been 00000000 in every run). + +STATUS. No client-chosen XIE image. The window has never differed from the +no-export baseline; solid-white and solid-black readbacks are identical; xshow +(core X) is the only viewer that has displayed an image. + +WHAT IS STILL MISSING, precisely: the WIRE ENCODING of the photoflo element list +(phototag / element type / parameter field order and the DAG connection fields) +plus the minor opcode of the request that carries it. xieSIarch.txt documents +the semantics (7.3 Photo Element Definition; 8.3.4.1 Create) but is a server +architecture document and does not specify the protocol encoding. diff --git a/xie/evidence/element_pointer_timing.txt b/xie/evidence/element_pointer_timing.txt new file mode 100644 index 0000000..37b20f7 --- /dev/null +++ b/xie/evidence/element_pointer_timing.txt @@ -0,0 +1,35 @@ +WHERE element+0x28 COMES FROM -- a timing measurement. + +Setup: watch registered by reading the live resource, then + band_array = *(res+44) (bit offsets: *8) + element = *(band_array + 0xd8) +and installing a write watchpoint on element+0x28. + +Measured: + after create (before arm1) band=00291D70 p44=003DC4B0 element = 0 + after arm1 (same) element = 0 + after PUT_TILE (same) element = 0 + WPELEM write hits on element+0x28: 0 + +But inside EXPORT (breakpoint 0x1B234, i.e. 0x1B238's predecessor) the SAME +read gives a non-zero element: + + EX_BAND a5=003DC4B0 elem@d8=003FDA10 + EX_ELEM a5=003FDA10 f28=00000000 + +So the element record does not exist until the export path runs: EXPORT itself +creates/binds it. Consequences for the model: + + * PUT_TILE does not fill element+0x28 -- the element is not there yet while + PUT_TILE runs. The earlier reading ("PUT_TILE fills/clears element+0x28") + is therefore wrong for this configuration. + * Nothing writes element+0x28 at all (0 watch hits), which is consistent with + export painting nothing: the element it builds has no source image. + * So the source for export has to be established on the band array BEFORE + export, and export only mirrors what is already there. + +NEXT LEVER: dump the band array (p44) immediately before EXPORT and compare its +fields with what export expects; the source pointer must be one of the fields +export copies into renderparams (0x1B222..0x1B292 writes 0x5a8, 0x5c8, 0x5d0, +0x5f0, 0x610, 0x630, 0x638, 0x658, 0x6b8, 0x6d8, 0x6f8, 0x718, 0x738, 0x758, +0x778, 0x788, 0x790). diff --git a/xie/evidence/element_poke_no_effect.txt b/xie/evidence/element_poke_no_effect.txt new file mode 100644 index 0000000..db2f138 --- /dev/null +++ b/xie/evidence/element_poke_no_effect.txt @@ -0,0 +1,15 @@ +Populating the +36 element record by rdebug poke: + + resource 0x003FDC50 + r36 0x00291D70 (+36 element array) + r44 0x003DD9D0 (+44 band array) + band record 0x003FDA10 (u32 at r44+27) + poke r36+27 <- 0x003FDA10 + +Then create -> arm1 -> PUT_TILE -> arm2(v16=0) -> export: + put=OK arm2=OK export=OK + solid-white: nz=512 first=88888888888888882222222222222222 + solid-black: nz=512 first=88888888888888882222222222222222 + +The poke does not make export depend on the tile data. Even with the element +record populated, the export remains the fixed XIE default pattern. diff --git a/xie/evidence/element_types_and_render_gate.txt b/xie/evidence/element_types_and_render_gate.txt new file mode 100644 index 0000000..f514882 --- /dev/null +++ b/xie/evidence/element_types_and_render_gate.txt @@ -0,0 +1,42 @@ +ELEMENT-TYPE STORES AND THE RENDER GATE -- measured, and both are dead ends so far. + +A) The element-type stores at file 0x1B2B8 (type 1) and 0x1B362 (type 2) are in + the EXPORT-side render driver (0x1B152), not in arm. Instrumented through a + full create -> arm1 -> put -> arm2 -> export cycle: + + TYPE1 / TYPE2 stores fired: NONE + + So no element type is ever written for our requests; the types array at + rp+0x58 stays zero. + +B) The persistent element record at band_array+0xd8 does not change either: + + elem before export : 01050001 00000055 00100000 00000100 00004000 00000000 00003F00 + elem after export : 01050001 00000055 00100000 00000100 00004000 00000000 00003F00 + + Note word 1 = 0x00000055, the heap fill pattern -- the record is PARTIALLY + UNINITIALISED, so it is not a populated element descriptor and cannot be used + to infer a field layout. + +C) The render-enable flag @0xA6220 is 1 at every step and never changes: + + session init 1 | SET_OP_DEFAULTS 1 | create 1 | arm1 1 | put 1 | arm2 1 | + window+gc 1 | EXPORT 1 + + So the render path is not gated off by that flag. + +D) rp (the render-params block, @0xA6000) reads 0 after export -- but that is + expected: export ALLOCATES it (0x1B18A) and FREES it in its tail + (CALLA 0x7F63B00). Reading it from outside is therefore always 0; it must be + sampled at the in-export breakpoint 0x1B296 (which earlier showed + rp+0x5a8=src_res_id, rp+0x610=0). + +CONCLUSION FROM THIS TURN: the element record is uninitialised, no element type +is ever written, and the render flag is always on -- so nothing in the observed +flow constructs a pipeline at all. The missing piece remains the 2.3 encoding of +element records (what XIEP_SCALE/CROP/ROTATE/MIRROR/EXPORT carry), which these +probes cannot reveal: a malformed element and a missing element both produce the +same documented BadValue. + +NOT PROVEN IMPOSSIBLE -- but no request shape tried so far causes an element type +to be written, and the struct fields do not self-describe. diff --git a/xie/evidence/element_writes_and_dec_doc.txt b/xie/evidence/element_writes_and_dec_doc.txt new file mode 100644 index 0000000..88997ff --- /dev/null +++ b/xie/evidence/element_writes_and_dec_doc.txt @@ -0,0 +1,68 @@ +TURN RECORD: NO REQUEST WRITES THE ELEMENT RECORD, AND THE DEC XIE SERVER +DOCUMENT WAS FOUND (it confirms the missing request shape). + +A) WATCHPOINTS ON THE ELEMENT RECORD -- ZERO WRITES FROM 33/40/43/44 + Live write watchpoints (proven: stack control fired 3052 times) on + band_array+0xd8 and the whole element block (+0x800 bits), issuing: + slot33 [A,B,0] -> err2 elem_changed=False writes=0 + slot40 [A,B,0] -> err2 elem_changed=False writes=0 + slot44 [A,B,1,1] -> err2 elem_changed=False writes=0 + slot43 len 3/5 -> err16 (BadLength) + Full slot sweep at each handler's REQUIRED length, watching the photoflo's + p44 block: no slot produced a pipeline element. + +B) SLOT 43 IS THE ONE THAT REACHES THE RENDERER -- AND STOPS THERE + Slot 43 requires length EXACTLY 10 (0x65614: MOVE *A9(0x10) ; SUBK 0xa ; + JREQ). With len=10 and two valid ids: + reply: err2 (BadValue) + RP breakpoint at 0x1B296 FIRES: RP a11=00291AF0 src_base610=00000000 + i.e. it enters the export/render driver, finds no elements, and returns + BadValue. src_base stays 0. TYPE1/TYPE2 (the element-type stores) never fire. + +C) SLOT 18 REJECTS EVEN A PHOTOFLO + Slot 18 is the only large handler with a MINIMUM length (>=4) and it does + touch *A7(0xd8) and write element+0x20. Tested against a class-2 resource + and against a class-1 photoflo: + err10 (BadAccess) with bad = the resource id, in both cases. + So it finds the resource and refuses access; its accepted shape is unknown. + +D) THE MISSING DOCUMENT WAS FOUND + xie/docs/dec/xieSIarch.txt (fetched from + https://ftp5.gwdg.de/pub/xfree86/XFree86/4.2.0/doc/xieSIarch.TXT) + 147 occurrences of "photoflo" -- this is the DEC XIE Server Interpretation + architecture document, i.e. the right lineage (the X Consortium specs in + xie/docs/x11r4 have ZERO). + + What it settles: + * XIE defines six resources: ColorList, LUT, Photoflo, Photomap, + Photospace, ROI. + * 7.2.3 Photomap: stores a complete image; populated by an ExportPhotomap + element; attributes inherited from that element. + * 7.2.6 Photoflo (flo-def): "the number of elements received from the + client" and "an array of pointers to client elements in PHOTOTAG ORDER", + plus a definition DAG and an optimized DAG. + * 7.3 Photo Element (pe-def): "the element phototag number received from + the client" and "the element TYPE received from the client"; class + Booleans import/process/export; input connections carry the phototag of + the source element. + * 8.3.3.1 ExecuteImmediate / 8.3.4.1 Create: "Create a flo-def, copy the + SUPPLIED LIST OF ELEMENTS to the flo-def while verifying that the list + is a DAG". + * 8.3.4.2 Modify replaces element PARAMETERS only; 8.3.4.3 Redefine + destroys and recreates under the same id. + + So elements are NOT added one at a time by scale/crop/rotate requests: the + whole element list arrives in ONE photoflo create/redefine request, each + element carrying {phototag, type, params}, wired by phototag. + +E) WHAT THIS MEANS FOR THE REMAINING WORK + The create path we drive (slot 8, op=1/2) checks only length >= 3 and has no + element loop, so it is not the photoflo-create request that carries elements. + The request that does carry them is still unidentified, and this document -- + being a SERVER ARCHITECTURE description -- deliberately does not give the + wire encoding of that list (phototag/type/param field order), which is what + a request has to match. + +STATUS. No client-chosen XIE image. src_base (rp+0x610) 0 in every run; the +window is unchanged from the no-export baseline; xshow (core X) is still the only +viewer that has displayed an image. diff --git a/xie/evidence/err2_is_the_render_driver.txt b/xie/evidence/err2_is_the_render_driver.txt new file mode 100644 index 0000000..fe6c84f --- /dev/null +++ b/xie/evidence/err2_is_the_render_driver.txt @@ -0,0 +1,40 @@ +TURN RECORD: err2 IS THE RENDER DRIVER'S RETURN CODE. EVERY EXPORT-SIDE STEP +SUCCEEDS. + +Instrumented the whole export tail (slot 21, file 0x62D40) during a working +client-driven sequence: + + ALLOC ret=00321C50 ; 0x6301C..0x6302A allocate the export context: OK + SETUP_before_render ; 0x63072 fills it (type 5, photo_id at +0x48, + ; geometry at +0x88/+0xa8) + CALL_RD ; 0x63098 CALLA 0x07E5B152 == render driver 0x1B152 + AFTER_RD a8=00000002 ; <-- the RENDER DRIVER RETURNS 2 (BadValue) + EPI a8=00000002 ; handler returns that value unchanged + +Also confirmed on the same run: + * the drawable lookup at 0x62F7E (0x7EA3432) SUCCEEDS, so the handler jumps to + 0x62FBC; + * at 0x62FBC the frame word is zero, so the second lookup (0x62FDC, the one I + was told to instrument) is SKIPPED -- it is never called on this path; + * the extent check at 0x62F12 passes; + * no BadValue site in the handler fires (EX_BADVALUE_1/2/3 never reached). + +So the client's err2 is produced INSIDE 0x1B152, after that function has already: + * allocated rp (@0xa6000), + * stored src_base = *(element+0x28) = 00915FD0 at 0x1B238 (RP 0x1B296 fires + with src_base610 = 00915FD0), + * and with the element buffer verified to contain 0xFF for a white tile and + 0x00 for a black tile. + +MEANING: the export request, the drawable, the GC, the depth (window is depth 1), +the geometry, the extents and the source buffer are all correct. The single +remaining failure is inside the render driver's own processing of a valid, +populated source. + +STATUS. NO client-chosen XIE image. The 64x64 window is unchanged; white and +black captures are byte-identical (AE = 0). + +WHAT WOULD FINISH IT + The next instrumented range is 0x1B296.. the end of 0x1B152 (the render driver + is ~0x500 bytes of dense code and calls five helper routines). That is the + only place left where the BadValue can be produced. diff --git a/xie/evidence/events_and_bind_attempt.txt b/xie/evidence/events_and_bind_attempt.txt new file mode 100644 index 0000000..16ce9c7 --- /dev/null +++ b/xie/evidence/events_and_bind_attempt.txt @@ -0,0 +1,42 @@ +EVENT PATH AND BIND-PHOTOFLO ATTEMPT. + +A) EVENTS: EXPORT EMITS NOTHING. + Collected every packet with timestamps instead of draining (my earlier drains + were discarding packets -- this run captured them): + before export: 3 packets + reply (type 1, seq 3) + err 08 minor 0x13 (19 = PUT_TILE) major 0x81 <- the expected BadMatch + err 08 minor 0x0000 major 0x81 + after export : 0 packets + So EXPORT produces no event and no reply. Nothing carries a pixmap XID. + (XIEP_SELECT_EVENTS / QUERY_EVENTS were never identified among the + implemented slots, so the selection could not be issued either.) + +B) BIND_PHOTOFLO SUCCEEDS (first time measured). + slot 11 with TWO LIVE ids ([img,flo] and [flo,img]) returns a REPLY -- i.e. + success. Earlier BadIDChoice results for slot 11 were caused by my invalid + hardcoded ids / a zero second operand, not by the request being wrong. + +C) FULL MANUAL-ORDER ATTEMPT + SET_OP_DEFAULTS(bpp=1) -> create img (op=2) + photoflo (op=1) -> BIND -> + PUT_TILE -> EXPORT -> EXECUTE_PHOTOFLO -> EXPORT -> QUERY_EXPORT -> XCopyArea + -> GetImage, for solid-white and solid-black, both bind orders: + + bind(img,flo)=reply put=err14 exec=silent pix=00310101 copy=err9 chg=True(nz -1->512) + bind(img,flo)=reply put=err14 exec=silent pix=00380101 copy=err9 chg=True + bind(flo,img)=reply put=err14 exec=silent pix=00910101 copy=err9 chg=False + bind(flo,img)=reply put=err14 exec=silent pix=00910101 copy=err9 chg=False + white==black in every case: True + + Notes: + * after a successful BIND, PUT_TILE changes from BadMatch(8) to + BadIDChoice(14) -- the bind does change resource state, but not into a + state where the tile import succeeds. + * QUERY_EXPORT still returns a heap-pointer-like field (00310101, 00380101, + 00910101 -- different every run), and XCopyArea still reports BadDrawable. + * the window readback is still the stipple (88888888888888882222222222222222) + and identical for white and black. + +STATUS: still no client-chosen image. Two new facts were established (export +emits no events; slot-11 BIND does succeed with two live ids and perturbs the +import state), but neither yields a usable pixmap or an import that succeeds. diff --git a/xie/evidence/export_badvalue_geometry_ruled_out.txt b/xie/evidence/export_badvalue_geometry_ruled_out.txt new file mode 100644 index 0000000..2bac542 --- /dev/null +++ b/xie/evidence/export_badvalue_geometry_ruled_out.txt @@ -0,0 +1,45 @@ +TURN RECORD: EXPORT'S BadValue IS NOT A GEOMETRY/RANGE CHECK EITHER. + +Decoded the export handler's frame use (slot 21, file 0x62D40): + 0x62D4E A9 = request base (0x62D54 reads *A9(0x10) = the LENGTH + field and requires exactly 0x10 words) + 0x62D78 CALLA 0x7EA6FA0 ; lookup photo_id (*A9(0x20) = w0) + 0x62D88 A11 = *A13(0x20) ; the looked-up resource object + 0x62D8E A7 = *A11(0x28) ; object byte 5 + 0x62D92 JRNE 0x62DBC ; non-zero -> do the range checks + ; zero -> MOVK 0x8 (BadMatch) + 0x62DBC *A9(0x80) vs *A11(0x80) ; src_x vs object byte 16 (= width) + 0x62DF8 *A9(0xa0) vs *A11(0xa0) ; src_y vs object byte 20 (= height) + 0x62E30 *A9(0xc0) != 0 and *A9(0xe0) != 0 ; width and height non-zero +So the three BadValue sites compare src_x/src_y against the photomap's +width/height and require width,height non-zero. + +TESTED (full working sequence each time: CreatePhoto(w6=1) -> SetTransport(mode=3) +-> PutTile -> Export onto a mapped 64x64 window + GC): + + w=64 h=64 sx=0 sy=0 -> err2 src_base=00000000 RP/TYPE5 + w=32 h=64 -> err2 src_base=00000000 RP/TYPE5 + w=64 h=32 -> err2 src_base=00000000 RP/TYPE5 + w= 1 h=64 -> err2 src_base=00000000 RP/TYPE5 + w=63 h=64 -> err2 src_base=00000000 RP/TYPE5 + w=32 h=32 -> err2 src_base=00000000 RP/TYPE5 + +Every geometry satisfies those comparisons (0 < 64, width/height non-zero), yet +the answer is always BadValue. So the rejection happens BEFORE or AROUND those +sites -- most plausibly in the photomap lookup at 0x7EA6FA0 returning a non-zero +code that I have not been printing, or in object byte 5 being zero. + +FINAL STATE OF THE INVESTIGATION + * Import half: COMPLETE and independently verified by the server's own + QueryResource reply (comp_COUNT=1, 64x64, constrained=1), reproduced with no + debug pokes (CreatePhoto w6=1 -> SetTransport mode=3 -> PutTile). + * Display half: never painted. Unbound photomap -> export err2 (BadValue), + renderer entered (RP + TYPE5) with src_base (rp+0x610) = 00000000. + Bound photomap -> export/execute err1 (BadRequest). + * The window is provably drawable (core-X PutImage into it shows a visible + block), so the absence of change is real. + * Nothing I can send makes rp+0x610 non-zero; the renderer always reports no + source. + +STATUS. NO client-chosen XIE image. xshow (core X) remains the only viewer +that has displayed an image. diff --git a/xie/evidence/export_badvalue_is_in_firmware_ddx.txt b/xie/evidence/export_badvalue_is_in_firmware_ddx.txt new file mode 100644 index 0000000..d75dbe5 --- /dev/null +++ b/xie/evidence/export_badvalue_is_in_firmware_ddx.txt @@ -0,0 +1,46 @@ +TURN RECORD: THE Genuine 2.3 CLIENT NOW RUNS THE WHOLE EXPORT PATH CORRECTLY, AND +THE REMAINING BadValue IS IN THE FIRMWARE DDX -- DEC'S PORTABLE SOURCE HAS NONE. + +A) CLIENT FIXED AND RUNNING THE INTENDED SEQUENCE + xie/decclient.c now does: + XieCreateImage(w,h, XieK_PCM, XieK_BandByPlane, XieK_Bitonal, 1, + unsigned long lvl[3]={2,2,2}, ...) + XieCreatePhoto(dpy, XieK_Photomap, w,h, XieK_Bitonal, 1, lvl, ...) + XiePutTile(pm, img, XieK_AllPlanes, 0,0,0,0, w,h) + XieExport(pm, win, gc, 0,0, 0,0, 64,64, 0,0, 0.0, 0.0) + Output: "image: w=64 h=64 levels=2,0,0 arSize=4096" / "photomap created" / + "put tile sent" -- all three steps succeed. + +B) THE SERVER-SIDE CHECKS ALL PASS + With xie_ext.lua armed during the C client's export: + EX_EF8 f80=00000000 fA0=00000040 fC0=00000040 a11=003FD7D0 + EX_F0E a7=00000040 a5=00000040 + EX_F12 a5=00000040 + EX_CONTINUE_TO_RENDER + i.e. ProcExport's ValueOkIf_(w>0 && h>0) PASSES (w=h=64). + +C) EXHAUSTIVE SEARCH OF THE PORTABLE SERVER SOURCE FOR BadValue ON THIS PATH + XieDisplay.c : exactly one ValueOkIf_ (line 301, measured passing); + no BadValue literal at all. + CreateExportContext : no ValueOkIf_ (only Match/Access/Alloc/Color). + LookupPhotos (XieResource.c:576) : returns only BadIDChoice / BadAccess. + BePCM_ (XieMacros.h:111) -> UtilBePCM : BadAccess / BadAlloc only. + Export() : returns Success when photo_lut_id == 0. + SmiConvert unsupported path : BadImplementation (17). + Only BadValue_ sites in the whole server: XieTransport.c:626 + (SetTransport's unknown compression_scheme) and XieTransport.c:1012 + (LookupTransport's unknown mode). Export calls neither. + => The BadValue the client receives CANNOT come from DEC's portable server + code. It comes from the device-dependent layer (DdxConvert_ and the + terminal's image accelerator), which exists only in the VT1200 firmware. + +D) STATE + No client-chosen image displayed. Window unchanged; white vs black AE + ~2895 px = Terminal Manager figures + cursor. + Import still verified (element+0x28 = 0xFF white / 0x00 black). + xshow (core X) remains the only viewer that has shown an image. + +CONCLUSION: the export request, the drawable, the GC, the depth (root is depth 1), +the geometry, the photomap attributes and every portable check are now correct, +and both a hand-rolled and a genuine DEC 2.3 client fail identically inside the +firmware's own conversion routine. diff --git a/xie/evidence/export_badvalue_sites.txt b/xie/evidence/export_badvalue_sites.txt new file mode 100644 index 0000000..c4b4d7a --- /dev/null +++ b/xie/evidence/export_badvalue_sites.txt @@ -0,0 +1,48 @@ +TURN RECORD: WHERE EXPORT'S BadValue COMES FROM, AND WHY IT IS NOT THE FLOATS. + +A) EXACT REJECTION SITES IN THE EXPORT HANDLER (server, file 0x62D40) + BadValue (MOVK 0x2) is emitted at 0x62DCA, 0x62E06 and 0x62E3E, each preceded + by a comparison of a request word against a field of a looked-up object: + + 0x62DBC A7 = *A9(0x80) ; a request word (16 bytes into the data) + A11 = *A11(0x80) ; the same offset in the looked-up object + CMP A11,A7 ; JRC 0x62DF4 else BadValue + 0x62DF8 A7 = *A9(0xa0) / A11 = *A11(0xa0) ; CMP ; JRC else BadValue + 0x62E30 A11 = *A9(0xc0) ; JREQ 0x62E3C ; word == 0 + A11 = *A9(0xe0) ; JRNE 0x62E68 ; and the next word == 0 + else BadValue + So the rejection is a RANGE/COMPATIBILITY comparison between export operands + and the resource's own attributes -- not a decode failure. + +B) THE XieFloatRec HYPOTHESIS IS DEAD + Sent match_limit and gray_limit as properly encoded 1.0 + (e_sign=0, m_sign=0, exponent=1, mantissa=0x80000000 -> words + 0x00010000,0x80000000) and as 0.0, full 15 data words, everything else + identical: + match/gray = 1.0/1.0 -> export err2, src_base 00000000, RP/TYPE5 + match/gray = 0/0 -> export err2, src_base 00000000, RP/TYPE5 + Identical. The floats are not the cause. + +C) WHY THE LIBRARY WOULD NOT HAVE HELPED EITHER + The 2.3 client library on disk is MIPS (osf1-2.0-decstation/libXie.a) and + Alpha (osf1-1.2-alpha/libXie.a). It builds requests by filling the very + structs already read out of XieProto.h (photo_id, drawable_id, gc_id, src_x, + src_y, width, height, dst_x, dst_y, photo_lut_id, colormap_id, then the two + XieFloatRecs), so disassembling it cannot change the byte layout -- only + confirm it. The failing comparison is server-side range checking, which the + library does not encode. + +D) STATE OF THE TWO PATHS (unchanged, re-measured this turn) + unbound photomap: transport ok, puttile ok, export err2, renderer entered + (RP + TYPE5) with src_base = 00000000 + bound photomap : bind ok, export err1 x6, execute err1 x6, no renderer trace + +STATUS. Still NO client-chosen XIE image. The window is unchanged by XIE; +solid-white and solid-black captures differ only by the Terminal Manager's own +figures and the cursor; xshow (core X) remains the only viewer that has displayed +an image. + +NEXT, concretely: identify which object the export handler looks up at 0x62DBC +(it is not obviously the photomap) and which of its fields at 0x80/0xa0/0xc0/0xe0 +is being compared, then set the export operands inside those ranges. That is a +register/field identification in one handler, not a protocol question. diff --git a/xie/evidence/export_before_put.txt b/xie/evidence/export_before_put.txt new file mode 100644 index 0000000..30c82c7 --- /dev/null +++ b/xie/evidence/export_before_put.txt @@ -0,0 +1,17 @@ +Export context before PUT_TILE: + + create -> arm1 -> create window+GC -> slot21 EXPORT -> PUT_TILE -> arm2(v16=0) + + arm1=OK export-before-put=OK put=OK arm2=OK + solid-white: nz=512 first=88888888888888882222222222222222 + solid-black: nz=512 first=88888888888888882222222222222222 + +Slot 21 allocates a 0xC8-byte export context, fills it (type 5, resource, +request id, params) and calls 0x7E5B152; on success it immediately frees the +context at 0x630B0 and returns. The export process block reads the band's +transient payload pointer at band+0x28 (byte 5); slot 19 clears it after the +handoff. Creating the export before the put therefore still captures no data. + +The export element that would read the band's retained UDP during the handoff +is not defined by any request field tried. The fixed 8888...2222... pattern +is the export default/dither. diff --git a/xie/evidence/export_chain_trace.log b/xie/evidence/export_chain_trace.log new file mode 100644 index 0000000..b9e9ae3 --- /dev/null +++ b/xie/evidence/export_chain_trace.log @@ -0,0 +1,4 @@ +EXPORTENTRY +EXPORTFLAG f=01 +EX_BAND a5=003DC4B0 elem@d8=003FDA10 +EX_ELEM a5=003FDA10 f28=00000000 diff --git a/xie/evidence/export_fourth_badvalue.txt b/xie/evidence/export_fourth_badvalue.txt new file mode 100644 index 0000000..6f5bba7 --- /dev/null +++ b/xie/evidence/export_fourth_badvalue.txt @@ -0,0 +1,43 @@ +TURN RECORD: WITH org=1 THE EXPORT DIES AT A FOURTH BadValue SITE, AFTER ALL THE +CHECKS I HAD BEEN INSTRUMENTING. + +A) org=1 RE-RUN OF THE EXPORT HANDLER (full working sequence, elem+0x28=002909B0) + EX_LK ret=00000000 obj=003FD7D0 ; lookup OK + EX_F5 f5=01000101 ; byte5 != 0, BadMatch route skipped + EX_CK1 req=00000000 obj=00000040 ; src_x < width -> pass + EX_CK2 req=00000000 obj=00000040 ; src_y < height -> pass + EX_CK3 c0=00000040 e0=00000040 ; w,h non-zero -> pass + and NONE of EX_BADVALUE_1/2/3 fired. + Export still returns err2 and RP (0x1B296) never fires. + +B) THE SITE THAT ACTUALLY REJECTS + slot21 listing, 0x62F0E: + 0x62F0E A5 = *A13(0xa0) + 0x62F12 JRLE 0x62F18 ; A5 <= 0 -> BadValue + 0x62F14 A8 = A7 + 0x62F16 JRGT 0x62F40 ; A7 > 0 -> continue to the render + 0x62F18..0x62F1A MOVK 0x2,A5 -> BadValue + where A7 is computed just above as a difference between a request field and a + looked-up object field (0x62EFA: A7 = obj->0xa0 - frame[0x80]; + 0x62F06: A7 = frame[0xc0]), i.e. a remaining-extent/clip computation. + +C) TESTED EVERY GEOMETRY AT org=1 -- ALL REJECT IDENTICALLY + 32x32, 63x63, 1x1, 64x32, 32x64 -> err2, and the trace always stops right + after EX_CK3, never reaching the render driver. + So the value tested at 0x62F12 is <= 0 no matter what source rectangle I ask + for, which points at a failing comparison against a looked-up object field + rather than at my width/height. + +FINAL STATE + * Import half: complete, client-driven, verified by QueryResource. + * Export request: all instrumented checks pass; the handler rejects later, in a + remaining-extent computation, before the render driver. + * With org=4 the renderer IS reached but element+0x28 was cleared by the + handoff, so src_base is 0; with org=1/3 element+0x28 survives but export + never reaches the renderer. + * src_base (rp+0x610) has never been non-zero. + +STATUS. NO client-chosen XIE image. The 64x64 window is unchanged in every +run; solid-white and solid-black captures differ only by the Terminal Manager's +own figures and the cursor; xshow (core X) remains the only viewer that has +displayed an image. diff --git a/xie/evidence/export_half_still_fails.txt b/xie/evidence/export_half_still_fails.txt new file mode 100644 index 0000000..d803212 --- /dev/null +++ b/xie/evidence/export_half_still_fails.txt @@ -0,0 +1,56 @@ +TURN RECORD: THE DISPLAY HALF STILL FAILS; TWO STRUCT FACTS CORRECTED. + +A) QueryExport RETURNS PIXELS, NOT A PIXMAP + xieQueryExportReply (XieProto.h) = { type, _reserved, sequenceNumber, length, + pixel_count, lut_id, lut_mapping, _pad[15] }. + So minor 24 reports how many colormap pixels the export allocated (plus an + optional LUT id). There is NO pixmap id to XCopyArea -- "export paints + straight to the drawable". My earlier plan of copying a pixmap to the window + was based on a wrong assumption and is dropped. + +B) XieExport.3X ERROR TABLE (read in full) + BadIDChoice Invalid identifier + BadAlloc Insufficient server resources + BadDrawable Invalid X11 drawable + BadGC Invalid graphics context + BadMatch source image is not constrained / gc not compatible with the + drawable / LUT has fewer levels than the source / LUT not + compatible with the drawable levels / source image not + compatible with the drawable + Note there is no BadValue in this list, yet a correctly-idded export returns + err2 (BadValue), so the failure is not one of the documented export + conditions. + +C) THE BadDrawable WAS MY BUG + In the previous A/B run I hard-coded window/gc ids (0x55300/0x55400) instead + of using c.new_id(), so the drawable id was never valid. Re-run with real + ids: + white/black: transport=ok puttile=ok export=err2 src_base=00000000 + trace RP/TYPE5 + i.e. BadDrawable disappears; BadValue remains. + +D) BOUND PATH WITH THE CORRECTED OPERAND ORDER + xieBindPhotomapReq = { photoflo_id, photomap_id }. Sequence + create photomap(w6=1) -> SetTransport(mode=3) -> PutTile(ok) + -> create photoflo(type=1, w6=1) (ok) -> BindPhotomap {flo,map} (ok) + -> Export -> ExecutePhotoflo(13) + gives: export = err1 (BadRequest) x6, execute = err1 x6, renderer trace + (none). So once bound, minor 21/13 are rejected outright -- the bound path is + not usable with the operand shapes I have. + +E) WINDOW IS PROVABLY DRAWABLE + Control (unchanged): core-X PutImage into the same 64x64 window produces a + visible block in dwt/screenshot.py. So any successful XIE paint would be + visible; the absence of change is real. + White vs black captures continue to differ only by the Terminal Manager's own + figures and the cursor (2697-2950 px). + +STATUS. Still NO client-chosen XIE image. src_base (rp+0x610) 00000000 in every +run; the window is unchanged by XIE; xshow (core X) remains the only viewer that +has displayed an image. + +WHERE IT STANDS: the import half is complete and verified by the server's own +QueryResource (comp_COUNT=1, 64x64, constrained). The display half has exactly +two observable failure modes left -- unbound photomap => renderer entered but +src_base 0, bound photomap => BadRequest on export/execute -- and the documented +error conditions in XieExport.3X do not cover either. diff --git a/xie/evidence/export_paints_nothing.txt b/xie/evidence/export_paints_nothing.txt new file mode 100644 index 0000000..6edad12 --- /dev/null +++ b/xie/evidence/export_paints_nothing.txt @@ -0,0 +1,37 @@ +EXPORT PAINTS NOTHING -- the "XIE output pattern" was the window's default +background. Measured on one MAME instance, one X connection, 64x64 window. + +1) Baseline: window created + mapped + GC created, NO export at all: + BASELINE no-export nz=512 first=88888888888888882222222222222222 + +2) Full sequence create -> arm1 -> PUT_TILE -> arm2(v16=0) -> EXPORT, + then read back the same window: + AFTER export nz=512 first=88888888888888882222222222222222 + identical to baseline: True + +So every earlier "export OK ... 8888...2222..." result measured the window +background (a stipple), not XIE output. The white-vs-black comparisons were +therefore vacuous: export has never drawn anything. + +3) Why: the export chain is present but has no source image. + Breakpoints in the export driver (file 0x1B152 = bit 0x3F2D8A90): + + EXPORTENTRY + EXPORTFLAG f=01 ; global @0xA6220 non-zero, render taken + EX_BAND a5=003DC4B0 elem@d8=003FDA10 ; photoflo->band->element IS present + EX_ELEM a5=003FDA10 f28=00000000 ; element+0x28 == 0 + + The driver copies element+0x28 into the render params + (0x1B238 MOVE *A5(0x28),*A11(0x610)), i.e. it is the imported source + image. It is zero because the import never ran: PUT_TILE (minor 19) is + rejected at the class lookup with BadMatch (S19LOOK a8=00000008), so the + handoff that fills/uses element+0x28 (0x6B640) is never called. + +4) The per-element render loop (file 0x1BC38..0x1BF30) is never reached: + its breakpoints (ELTYPE / PIPE_T1..T4 / PIPE_LOOPEND / BADFUNC) do not + fire during the export. + +Conclusion: export produces no pixels because the source image pointer at +element+0x28 is NULL. The single remaining blocker is unchanged and is +upstream of export: PUT_TILE's lookup requires a class-3 resource with +resource byte 40 == 0, which no reachable request produces. diff --git a/xie/evidence/export_query_copyarea.txt b/xie/evidence/export_query_copyarea.txt new file mode 100644 index 0000000..c721443 --- /dev/null +++ b/xie/evidence/export_query_copyarea.txt @@ -0,0 +1,44 @@ +DOCUMENTED DISPLAY PATH IMPLEMENTED: export -> QUERY_EXPORT -> XCopyArea -> GetImage. + +Source of the model: docs/EK-V120I-IN-001_installing-DECimage-1200.txt, +Appendix C, Table C-1: + XIEP_EXPORT "Creates a new server PIXMAP resource object." + XIEP_QUERY_EXPORT "Queries the export context." + and: "When displaying an image by copying from a pixmap ... using XCopyArea + or XCopyPlane ..." +So export does NOT paint a window; the client must copy from the created pixmap. + +IMPLEMENTED AND MEASURED (valid c.new_id ids, no-reply model, one connection; +core-X requests sent on the same socket so the pixmap is in the right client): + + EXPORT (slot 21) -> no reply (success) + QUERY_EXPORT (minor 10, op 3) -> REPLY with 4 words + 4 extra: + head : 0x40, 0x40, , 0x80000000, 0x01000000, + extra: 2, 0, , + op 3 and op 4 reply; ops 1,2,5,6 -> BadIDChoice. w/h = 64,64 correct. + XCopyArea(pixmap_candidate -> window, gc) -> BadDrawable every time + GetImage(window) -> unchanged + + The "" field VARIES every run: 0x00920101, 0x00380101, 0x00330101, + 0x00360101 across four runs. Values like 0x00330101 are 0x33xxxx, which on + this bit-addressed machine look like HEAP POINTERS (bit 0x330101 = byte + 0x66020), not XIDs. XCopyArea rejects each with BadDrawable. + + Result, both tile contents: + solid-white tile: window nz 512 -> 512, changed=False + solid-black tile: window nz 512 -> 512, changed=False + white vs black identical: True + first bytes both: 88888888888888882222222222222222 (the window stipple) + +CONCLUSION: the documented model is confirmed in principle -- export creates a +server pixmap and the client is expected to copy it -- but the export context +reply does not expose a usable pixmap XID (it carries 64x64, server pointers and +the resource id). The pixmap is therefore not reachable through the field +identified, or it is owned/freed elsewhere. The window still never changes. + +NEXT: determine whether the export context's first pointer field is the pixmap +object (read its header via rdebug and look for an XID at a known offset), or +whether the pixmap only becomes valid after a pipeline ends in export per the +documented rules (the pipeline must END with export; ours is not a valid +pipeline: it has no explicit scale/crop elements and was never bound via +XIEP_BIND_PHOTOFLO). diff --git a/xie/evidence/export_renderparams_map.txt b/xie/evidence/export_renderparams_map.txt new file mode 100644 index 0000000..5bb4932 --- /dev/null +++ b/xie/evidence/export_renderparams_map.txt @@ -0,0 +1,60 @@ +WHAT EXPORT ACTUALLY HAS -- render-params map, and the one missing field. + +Breakpoint after the export copy block (0x1B296, file) prints the values the +driver just wrote into the render-params block: + + RP 5a8=0040C000 5d0=00000040 5f0=00000040 610=00000000 + 6f8=00000000 718=00000000 738=00000040 758=00000040 + +Named against the firmware's own dump format strings (file 0x1C8B6..0x1CA79, +which print in this order: floID, flo, active, crop, scale, rotate, mirror, +export, func_count, src_img[][PWIDTH/PHEIGHT], dst_img[][PWIDTH/PHEIGHT], +src_res_id, src_delete, src_base, src_width, src_height, comp format, pGC, +pDraw, drw_x, drw_y, PxlsPerScn, NumOfScns, src_x, src_y, src_w, src_h, +rot_indx, x_mirror, y_mirror): + + rp+0x5a8 = 0x0040C000 src_res_id -> OUR RESOURCE, correctly resolved + rp+0x5d0 = 64 src_width + rp+0x5f0 = 64 src_height + rp+0x610 = 0 src_base <-- the pixel buffer: MISSING + rp+0x738 = 64 dst_img PWIDTH + rp+0x758 = 64 dst_img PHEIGHT + rp+0x6f8 / 0x718 = 0 (pipeline intermediate width/height, unused with no + crop/scale element) + +So EXPORT is not failing to find the resource: it resolves the source resource +id and its 64x64 size correctly. The only empty field is src_base, which is +loaded at 0x1B238 as `MOVE *A5(0x28),*A11(0x610)` -- i.e. element+0x28, which +we measured as 0 (evidence/element_pointer_timing.txt), and which no write +watchpoint ever saw being written. + +CONCLUSION: the single missing datum is a pixel buffer base for the source +image (src_base / element+0x28). The only request that would produce it is the +import (slot 19 PUT_TILE), which cannot enter because its typed lookup +requests class 3 and no addressable class-3 resource is producible. + +Band array (*(res+44) = 0x003DC4B0) dumped immediately before EXPORT: + + +000: 00000000 00000000 00050029 40002005 + +010: 00000000 00050029 40002005 48000000 + +020: 00050029 40002005 48000000 48003DC5 + +030: 40002005 48000000 48003DC5 10003DC5 + +040: 48000000 48003DC5 10003DC5 00004007 + +050: 48003DC5 10003DC5 00004007 00000000 + +060: 10003DC5 00004007 00000000 18000000 + +070: 00004007 00000000 18000000 3FB90900 + +Note element+0x28 is NOT at band_array+0xd8 (that read yields 0x40 etc.); the +element pointer EXPORT uses is reached after the 0x1B230 `MOVE *A5(0x160)` +deref chain, so the earlier "element = *(res+44 + 0xd8)" shortcut was wrong. +The authoritative element pointer is the one EXPORT loads at 0x1B234 +(EX_BAND a5=003DC4B0 elem@d8=003FDA10). + +SIDE FINDING -- slot 47 is a dispatch trampoline, not a request: + file 0x697B4 swaps the bytes of request words at bit offsets 0x10/0x18 then + 0x20/0x28 then 0x30/0x38, then does + MOVE *A10(0x8),A11 (byte 1 = minor) ; SLL 5 ; ADDI 0xd3f90 ; + MOVE *A11,A11 ; CALL A11 + i.e. it re-dispatches through the SAME table at 0xD3F90 after byte-swapping + the first argument words. It is the byte-swapped entry point for other + requests, which is why a plain 3-word probe of minor 47 returned BadRequest. diff --git a/xie/evidence/export_reports_badvalue_unconditionally.txt b/xie/evidence/export_reports_badvalue_unconditionally.txt new file mode 100644 index 0000000..9993e49 --- /dev/null +++ b/xie/evidence/export_reports_badvalue_unconditionally.txt @@ -0,0 +1,40 @@ +TURN RECORD: THE EXPORT PATH ENDS IN AN UNCONDITIONAL BadValue REPORT. + +Traced with the genuine DEC 2.3 client (decclient, org=BandByPlane): + + J884 b9=01 ; rp byte 9 non-zero -> JREQ NOT taken + CONT_1B888 ; normal continuation + J9F2 a8=00000000 ; the call at 0x1B9EC RETURNED 0 (success) + ERR_1BA30 ; ...and execution then jumps to 0x1BA30 anyway + ERR_1BA68 MOVK2 ; 0x1BA68 MOVK 0x2,A11 -> report BadValue + DRIVER_RET a8=00000002 ; the driver returns 2; the export handler + ; (0x630BC: A5 = *A13(0x120); JREQ -> success) + ; therefore reports BadValue to the client + +The code at the junction (file 0x1B9D4..0x1B9F2): + 0x1B9D4 push MOVK 0x2 ; operation code 2 + 0x1B9D6..0x1B9EA push five frame values + 0x1B9EC CALLA 0x07E5BBCA ; the actual export-to-drawable operation + 0x1B9F2 JR 0x0001BA30 ; UNCONDITIONAL jump into the report/cleanup block +and 0x1BA30 is: + 0x1BA30 CALLA 0x07F67F38 ; 0x1BA44 CALLA 0x07E75EA8 (called with 0xa6000, frees rp) + 0x1BA60 CALLA 0x07EA45FE + 0x1BA68 MOVK 0x2,A11 ... 0x1BA78 CALLA 0x07E7FE96 ; send BadValue + +So on this path the driver performs the operation, gets 0 (no error), then jumps +unconditionally into a block whose only exit is "report BadValue (2) and return +2". The export handler faithfully propagates that 2. + +This is consistent with the terminal firmware's export-to-drawable being +unimplemented (or gated behind a precondition that is always false here), rather +than with any defect in the client, the request, the drawable, the GC, the depth +(1), the geometry, the photomap attributes or the imported data. + +EVIDENCE ACCUMULATED ACROSS THE INVESTIGATION + import: element+0x28 = 0xFF white / 0x00 black ; QueryResource comp_COUNT=1 + request: passes every check in DEC's portable server source + clients: hand-rolled AND DEC's own 2.3 client fail identically at this point + window: depth 1 (root is depth 1), drawable, and proven paintable by core X + +STATUS. NO client-chosen XIE image has ever been displayed. xshow (core X) is +the only viewer that has shown one. diff --git a/xie/evidence/export_request_is_correct.txt b/xie/evidence/export_request_is_correct.txt new file mode 100644 index 0000000..2442937 --- /dev/null +++ b/xie/evidence/export_request_is_correct.txt @@ -0,0 +1,38 @@ +TURN RECORD: THE EXPORT REQUEST IS CORRECT. ALL OF THE HANDLER'S CHECKS PASS +AND NONE OF ITS BadValue SITES FIRE -- THE err2 COMES FROM THE RENDER DRIVER. + +Instrumented the export handler (slot 21, file 0x62D40) during a full working +sequence, with the photomap already populated and a mapped 64x64 window + GC: + + MAP=00402200 object=003FDA10 object byte5 (0x28) = 01000101 + + EX_LK ret=00000000 obj=003FDA10 ; photomap lookup SUCCEEDS + EX_F5 obj=003FDA10 f5=01000101 ; byte5 != 0 -> JRNE 0x62DBC taken + ; (the BadMatch route at 0x62D94 is + ; NOT taken) + EX_CK1 req80=00000000 obj80=00000040 ; src_x 0 < width 64 -> pass + EX_CK2 req_a0=00000000 obj_a0=00000040 ; src_y 0 < height 64 -> pass + EX_CK3 req_c0=00000040 req_e0=00000040 ; width,height non-zero -> pass + (EX_BADVALUE_1 at 0x62DCA never fired) + +So every documented condition on the export request is satisfied, and the +handler's own error paths are not taken. Yet the client still receives +err2 (BadValue), and the renderer trace is RP(0x1B296) + TYPE5 with +src_base (rp+0x610) = 00000000. + +CONCLUSION: the BadValue is produced DOWNSTREAM, by the render driver that +slot 21 calls (0x1B152), when it fails to resolve a source for the export +element. The export packet itself is not the problem -- the byte layout, +operand order, geometry, float encoding and bounds are all now verified correct +against DEC's own 2.3 structs and against the handler's own comparisons. + +WHAT THAT MEANS + * Import half: complete, client-driven, verified by QueryResource. + * Export request: correct and accepted (this turn). + * Remaining failure: the renderer cannot bind a source for the export element, + which is what leaves src_base = 0 and stops the paint. + +STATUS. NO client-chosen XIE image. The 64x64 window is unchanged by XIE; +solid-white and solid-black captures differ only by the Terminal Manager's own +figures and the cursor; xshow (core X) remains the only viewer that has displayed +an image. diff --git a/xie/evidence/export_side_state.txt b/xie/evidence/export_side_state.txt new file mode 100644 index 0000000..0b9a55b --- /dev/null +++ b/xie/evidence/export_side_state.txt @@ -0,0 +1,36 @@ +TURN RECORD: EXPORT-SIDE STATE AFTER THE IMPORT MILESTONE. + +CONFIRMED AGAIN (client-driven, no pokes): + InitSession -> CreatePhoto(w6=1) -> SetTransport(mode=3, org=1) + -> PutTile => element+0x28 buffer holds 0xFF (white) / 0x00 (black) + Export(21) => err2 (BadValue); renderer runs with src_base = 00915FD0 + (non-zero, verified at RP 0x1B296) + framebuffer => white and black captures byte-identical (AE = 0) + +WHERE THE err2 COMES FROM -- narrowed this turn + slot21 between the extent check and the render call: + 0x62F7E CALLA 0x7EA3432 ; drawable resource init/lookup + 0x62F88 A5 = A8 ; JREQ 0x62FBC ; zero => continue, non-zero => return A5 + and the callee (file 0x63432) returns: + 0x634B0 MOVK 0x9 (BadDrawable) if *A11(0x160) == 0 + So a failed drawable init would give err9, NOT err2. The err2 must therefore + come from a later path (0x62FDC CALLA 0x7EA47B6, or the render driver itself + returning 2 after 0x1B296). + Also checked: the target window's geometry is depth=1, 80x64 -- it MATCHES the + 1-bit image, so depth mismatch is ruled out. + Creating the GC explicitly with function=GXcopy and plane-mask=1 changes + nothing (still err2, still no paint, AE=0). + +STATUS. NO client-chosen image displayed. The window never changes. + +WHAT IS SOLID + * The XIE import path is fully client-driven and verified inside the server + (element+0x28 -> 0xFF for white, 0x00 for black). + * src_base at rp+0x610 is non-zero (00915FD0 / 002909B0) with org=1. + * The export request passes every check the handler performs. + * The window is depth 1 and provably drawable (core-X PutImage control). + +WHAT IS STILL UNKNOWN + The single remaining failure is inside the export/render completion path: the + renderer has a correct, populated source and still the client receives + BadValue, and the composited result never reaches the window. diff --git a/xie/evidence/export_variants_exhausted.txt b/xie/evidence/export_variants_exhausted.txt new file mode 100644 index 0000000..1deaa00 --- /dev/null +++ b/xie/evidence/export_variants_exhausted.txt @@ -0,0 +1,34 @@ +TURN RECORD: EXPORT DESTINATION/ORGANISATION VARIANTS ALL FAIL IDENTICALLY. + +With the working DEC 2.3 client (XieCreatePhoto + XiePutTile + XieExport): + + cmp_org = XieK_BandByPixel (1) -> photomap created, put tile sent, Export BadValue + cmp_org = XieK_BandByLine (2) -> client aborted before export (no output) + cmp_org = XieK_BandByPlane (3) -> photomap created, put tile sent, Export BadValue + +And exporting to a **depth-1 Pixmap** (then XCopyArea to the window) instead of +directly to the window: + "exporting to PIXMAP depth 1" -> X Error BadValue (integer parameter out of range) + +So the destination type (Window vs depth-1 Pixmap) makes no difference, and the +component organisation makes no difference. Every attempt reaches the identical +BadValue. + +CUMULATIVE EVIDENCE THAT THIS IS FIRMWARE-SIDE + * Every check in DEC's portable server (ProcExport, LookupPhotos, BePCM_, + CreateExportContext, Export, SmiConvert) passes or cannot return BadValue. + * The server's only two BadValue_ sites are in XieTransport.c and are not + called by export. + * The request, drawable, GC, depth (root is depth 1), geometry, photomap + attributes, levels (2) and the imported data (element+0x28 = 0xFF white / + 0x00 black) are all correct and measured. + * Both a hand-rolled client and DEC's own 2.3 client fail identically inside + the same routine. + +STATUS. NO client-chosen XIE image has ever been displayed. The 64x64 window +never changes; white vs black captures differ only by the Terminal Manager's own +figures and the cursor (AE 1131-2950). + +What remains is the VT1200's device-dependent conversion (DdxConvert_ / +xieDdxProc dispatch), which is not present in DEC's portable source and exists +only in the terminal firmware. diff --git a/xie/evidence/finalize_returns_zero.txt b/xie/evidence/finalize_returns_zero.txt new file mode 100644 index 0000000..cf3254a --- /dev/null +++ b/xie/evidence/finalize_returns_zero.txt @@ -0,0 +1,34 @@ +TURN RECORD: THE FINALIZER RETURNS 0, SO THE err2 IS STILL FURTHER OUT. + +Instrumented the render driver's finalizer path (0x1B842 -> CALLA 0x07E79F32) +and the helper's own BadValue site (file 0x39F32): + + 0x39F54 A11 = rp + 0x39F58 A11 = *A11(0x20) ; rp byte 4 + 0x39F5C JRNE 0x39F64 ; non-zero -> continue + 0x39F5E MOVK 0x2,A8 ; else -> return 2 + +MEASURED on a live export: + RP20 rp=008FD510 byte4=01 -> forcing 1 + RP20_OK_CONTINUE + AFTER_FINALIZE a8=00000000 ; the finalizer SUCCEEDS + +So: + * rp byte 4 was already 1 -- that BadValue site is NOT the one firing; + * the finalizer returns 0 (success); + * the client still receives err2 and the window still does not change + (white vs black AE = 2040 px, i.e. the Terminal Manager's own figures and + the cursor, not the 64x64 window). + +The err2 therefore originates even later in the chain than 0x1B842 -- after a +successful finalize -- or in the export handler's post-render cleanup +(0x630B0 CALLA 0x07F63B00) before it reaches 0x630E8 (which would return 0). + +STATE OF THE OBJECTIVE (unchanged) + import: verified in the server (element+0x28 = 0xFF white / 0x00 black) + src_base: non-zero (008FD510 / 00915FD0) + export: always err2; window never changes; white and black captures identical + apart from the Terminal Manager's own figures and the cursor + viewer: xshow (core X) is the only thing that has ever displayed an image + +STATUS. NO client-chosen XIE image. diff --git a/xie/evidence/gate_model_reconfirmed.txt b/xie/evidence/gate_model_reconfirmed.txt new file mode 100644 index 0000000..82be8ce --- /dev/null +++ b/xie/evidence/gate_model_reconfirmed.txt @@ -0,0 +1,40 @@ +INSTRUMENTATION VALIDATED, AND THE byte8 GATE MODEL IS RECONFIRMED. + +A) INSTRUMENT VALIDATION (harness/mame/xie_val.lua, 10 breakpoints) + All 10 reported "Breakpoint N set", 0 "Error in command", and the control + breakpoint CTRL_REGIDSTORE fired on create. With this set, a single PUT_TILE + produces the FULL ordered trace: + + T_ENTRY(0x6B966) -> T_DISP(0x6BA8C) -> T_C2(0x6BA1E) -> T_J1(0x6BA22) + -> T_B32(0x6BA32) -> T_MERGE(0x6BAA2) -> T_GATE(0x6BAF4) -> S19RET a8=8 + + The gate at 0x6BAF4 DOES execute. My previous turn reported 0 hits for it and + I withdrew the model on that basis -- that was a dropped-breakpoint artifact, + and the withdrawal was wrong. + +B) THE MODEL, RE-MEASURED (asserting replies, byte(N)=ptr+N*8): + + create w9=0x100 -> byte8=1, byte9=1 + arm1 -> SILENT(ok) + PUT_TILE -> ERROR 8 ; trace reaches T_GATE ; byte8 after = 1 + + create w9=0x300 -> byte8=3, byte9=3 + arm1 -> ERROR 8 <-- arm fails + PUT_TILE -> ERROR 8 ; trace does NOT reach T_GATE ; byte8 after = 3 + + So, with trustworthy instrumentation: + * byte8 == 1 : arm succeeds, PUT_TILE reaches the gate and fails there + * byte8 == 3 : arm FAILS, and PUT_TILE does not even reach the gate + + That is the same mutual exclusion reported earlier in the session: + arm requires object->byte8 == 1 + import requires object->byte8 == 3 (gate 0x6BAF4) + and only create (word9>>8) sets byte8; a write watch on byte8 across a full + cycle recorded zero writers. + +C) NET: the model is RESTORED and now rests on validated instrumentation and + asserted replies. The blocker is unchanged and re-verified: the two requests + need opposite values of a byte that nothing but create can set. + +Status: no client-chosen XIE image; window still the stipple; src_base 0; +xshow (core X) is the only verified viewer. diff --git a/xie/evidence/gate_reached_with_byte8_3.txt b/xie/evidence/gate_reached_with_byte8_3.txt new file mode 100644 index 0000000..1e0ff32 --- /dev/null +++ b/xie/evidence/gate_reached_with_byte8_3.txt @@ -0,0 +1,45 @@ +GATE REACHED WITH byte8 == 3 (first time) -- AND ITS OPERAND IS NOT byte8. + +Method: create w9=0x300 (byte8=3), then force object->byte36 non-zero with a +LABELLED DEBUG POKE (not a client-driven state), then PUT_TILE. + + poke byte36 = 0 (control): + STORE src120=00000000 ; OUTCEL star=00000000 ; (no T_GATE) ; ERROR 10 + + poke byte36 = 1: + STORE src120=00000001 ; OUTCEL star=00000001 ; + T_GATE a7=00000000 a11=00000003 ; ERROR 8 <-- GATE REACHED + + poke byte36 = p44 (003DBAF0): + STORE src120=003DBAF0 ; OUTCEL star=003DBAF0 ; + T_GATE a7=00000000 a11=00000003 ; ERROR 8 <-- GATE REACHED + +So the out-cell hypothesis is CONFIRMED: byte36 non-zero => out-cell non-zero => +the out-cell test at 0x6BAB8 passes => the gate at 0x6BAF4 executes even with +byte8 = 3. + +BUT THE GATE STILL FAILS: it compares + a7 = 00000000 with a11 = 00000003 +and 0 != 3 -> BadMatch. + +THIS OVERTURNS MY GATE MODEL: a7 is NOT byte8. + byte8 = 1 -> a7 = 1 + byte8 = 3 -> a7 = 0 (not 3!) +So the "3" the gate wants belongs to some OTHER field, whose value happens to be +1 when byte8 is 1 and 0 when byte8 is 3. Every earlier statement of the form +"the import gate requires byte8 == 3" was therefore wrong -- the gate does not +read byte8, it reads whatever a7 is derived from. + +WHAT IS NOW ESTABLISHED (all measured): + * object->byte36 is uninitialised by create (0 for every w9 in one run, and + non-zero for one allocation in an earlier run); + * out-cell := object->byte36 (store at 0x6BAAC); + * non-zero byte36 makes the gate REACHABLE at byte8=3; + * the gate then compares a7 (0 at byte8=3, 1 at byte8=1) against 3 and fails. + +NEXT: identify what a7 is derived from at 0x6BAEA..0x6BAF2 + (6BAEA MOVE *A11,A7,1 ; 6BAEC SETF 8 ; 6BAEE MOVE *A13(0xff40),A11,0 ; + 6BAF2 MOVE *A7,A7,0 ; 6BAF4 CMP A7,A11) +where A11 = *A13(0xffa0), and find the field that must equal 3. + +Status: no client-chosen XIE image; src_base 0; window still the stipple. diff --git a/xie/evidence/handler_propagates_render_code.txt b/xie/evidence/handler_propagates_render_code.txt new file mode 100644 index 0000000..73d9090 --- /dev/null +++ b/xie/evidence/handler_propagates_render_code.txt @@ -0,0 +1,34 @@ +TURN RECORD: THE EXPORT HANDLER SIMPLY PROPAGATES THE RENDER DRIVER'S CODE. +(Undecoded code at 0x630BC..0x630E7 was the missing link; now read.) + + 0x630B6 CALLA 0x07F63B00 ; free the export context + 0x630BC A5 = *A13(0x120) ; <-- the RENDER DRIVER's return value + 0x630C0 JREQ 0x630E8 ; zero -> SUB A8,A8 -> return 0 (success) + 0x630C2 ... error report ... + 0x630E2 A8 = *A13(0x120) + 0x630E6 JR 0x630EA ; return the render driver's code unchanged + +So everything the export handler does -- lookup, three range checks, extent +computation, drawable init, context allocation, finalize -- either succeeds or is +not reached, and the value the client sees is precisely what 0x1B152 returned. + +Combined with previous turns: + 0x1B852 AFTER_FINALIZE a8 = 0 (finalizer succeeds) + 0x39F5E BadValue site NOT firing (rp byte 4 already 1) + err2 therefore comes from elsewhere inside 0x1B152 after 0x1B852. + +CLIENT-SIDE STATE (unchanged, reproducible): + CreatePhoto(w6=1) -> SetTransport(mode=3, component_organization=1) -> PutTile + element+0x28 buffer = 0xFF (white) / 0x00 (black) + QueryResource: comp_COUNT=1, 64x64, constrained + Export(minor 21): + src_base (rp+0x610) = 008FD510 / 00915FD0 (non-zero) + returns err2; window unchanged; white vs black captures differ only by the + Terminal Manager's own figures and the cursor (AE 1186-2950) + +STATUS. NO client-chosen XIE image. xshow (core X) remains the only viewer that +has displayed an image. + +REMAINING SCOPE: strictly inside one function (0x1B152, ~0x500 bytes) after +0x1B852, on a code path that has a valid source, a successful finalize, and still +produces 2. diff --git a/xie/evidence/handoff_dispatch_and_create_shape.txt b/xie/evidence/handoff_dispatch_and_create_shape.txt new file mode 100644 index 0000000..a23ca9e --- /dev/null +++ b/xie/evidence/handoff_dispatch_and_create_shape.txt @@ -0,0 +1,75 @@ +TURN RECORD: THE HANDOFF'S REAL DISPATCH, CREATE'S TRUE WIRE SHAPE, AND A +TYPE-SIGNATURE GATE. Two earlier claims are CORRECTED here. + +A) CORRECTION: 0x6B84C IS NOT A "band+0xd8 GUARD". IT IS THE SUCCESS RETURN. + The handoff at file 0x6B640 begins: + 6B640 MMTM SP,0x154 / MOVE A14,A13 / ADDI 0x230,A14 + 6B64A JR 0x6B834 <-- jumps to the real entry + and 0x6B834 dispatches on *object->byte8: + 6B834 A11 = *A13(0xffe0) ; SETF 8 + 6B83A A8 = *A11(8) <-- BIT OFFSET 8 = BYTE 1 + 6B83E DEC A8 ; JREQ 0x6B64E ; byte1 == 1 + 6B844 SUBK 2 ; JREQ 0x6B75E ; byte1 == 3 + 6B848 DEC ; JREQ 0x6B7E8 ; byte1 == 4 + 6B84C SUB A8,A8 -> epilogue <-- A8 = 0 = SUCCESS + So 0x6B84C is the shared success return, reached from three places + (0x6B674, 0x6B688, 0x6B746/0x6B75C). My long-standing "H_84C_NOOP" label + was wrong: an H_84C hit after real work is a SUCCESSFUL completion. + + Also: why H_684 never fired in earlier runs -- 0x6B684 lies in the byte1==1 + block (0x6B64E...), which is only entered when the dispatch value is 1. + The dispatch value was 0, so control fell straight through to 0x6B84C. + +B) THE HANDOFF'S OBJECT IS *(object->byte36), NOT THE RESOURCE. + Measured at 0x6B83E with the import gate satisfied: + H_83E ddobj=00010100 b1=00 a8=0 -> H_84C_default (byte1 not in {1,3,4}) + ddobj 0x00010100 was my scratch pointer == *(byte36). So the handoff + dispatches on BYTE 1 OF THE STRUCTURE THAT byte36 POINTS AT. + + Setting that byte made the handoff run its real body: + ddobj[1]=1 -> H_64E -> H_674(cnt=0) -> H_684(d8=) + -> H_688 -> CALLA 0x7EAC356 -> CALLA 0x7E80008 -> success + ddobj[1]=3 -> dispatch reached, PUT_TILE BadValue(2) + ddobj[1]=4 -> dispatch reached, PUT_TILE BadMatch(8) + and in that run element+0x28 (bits) became NON-ZERO (0x00929990) -- the first + time any element source pointer was populated. + +C) CREATE'S TRUE SHAPE (new, measured) + - The request must be EXACTLY 12 words (11 data words). Length 11 works; + 13, 15, 17, 19, 23, 27 words all produce NO OBJECT. + - word0 (op) dispatches to four routines: + op 1,2 -> CALLA 0x7EA78DA op 4 -> 0x7EA76CA + op 5 -> 0x7EA7B46 op 6 -> 0x7EA7DA8 else BadValue + - ops 4,5,6 are accepted (no error) but register NOTHING: a following arm + returns BadIDChoice(14) with bad = the id. Only ops 1 and 2 register. + - Field attribution for op=2 (vary one word, diff 64 object bytes): + w2 -> bytes 16..19 (width) + w3 -> bytes 20..23 (height) + w8/w9 -> byte 8 (bits/pixel = w9>>8; must be 1) + w10 -> byte 10 + w5 -> bytes 24..31 + w1 -> the id at bytes 0..3 ; byte 4 = class (2 for op=2) + bytes 32..39 (incl. byte 36) are ALL ZERO for every value tried. + +D) object->byte36 IS NEVER SET BY ANY CLIENT REQUEST. + Swept: op in 0..15; payload length 11..27; w2/w3 geometry 0x0, 1x1, 64x1, + 1x64, 64x64, 640x480, 1024x1024, 32768x1; w4 in 0..4; w5 in 0..6; w6 in 0..8. + byte36 == 00000000 in EVERY class-2 object. The import gate dereferences it + (0x6BAF2 `A7 = *A7`), so on a client-created resource the gate reads address 0. + Only the class-1 object (op=1) has a non-zero byte36, and its other fields at + those offsets are not meaningful (b8=0xD0, b44=0x02410092), i.e. that object's + layout differs by class. + +E) NEW GATE FOUND: TYPE-SIGNATURE VALIDATION IN THE ELEMENT EXECUTOR. + The helper the failing handoff calls is file 0x40008 (CALLA 0x07E80008): + 40018 CALLA 0x07E80162 ; get a signature for arg object + 40026 SUBI 0x9ED8014,A8 ; JREQ 0x40022 -> MOVK 2,A8 (return BadValue) + 4002E SUBK 8 ; JREQ 0x40022 ; 0x9ED801C also rejected + 40032 SUBK 8 ; JREQ 0x40022 ; 0x9ED8024 also rejected + So the executor type-checks the objects it is handed and returns 2 on a + mismatch. Our PUT_TILE BadValue(2) comes from here. + +STATUS. No client-chosen XIE image; src_base (rp+0x610) still 0 in every run +where it could be read; the window is still the stipple; xshow (core X) remains +the only viewer that has displayed an image. Everything in this file is measured +against the running emulator; D and C are exhaustive for the shapes listed. diff --git a/xie/evidence/handoff_never_runs.txt b/xie/evidence/handoff_never_runs.txt new file mode 100644 index 0000000..73d6881 --- /dev/null +++ b/xie/evidence/handoff_never_runs.txt @@ -0,0 +1,38 @@ +PUT_TILE "SUCCESS" IS A NO-OP: THE IMPORT HANDOFF NEVER RUNS. + +Instrumented the handoff (file 0x6B640) and slot 19's own path during a +PUT_TILE that now returns success (byte8=1, byte36 pointed at a byte == 3): + + handle breakpoints set: HANDOFF_ENTRY 0x6B640, H_684, H_688, H_6EA, H_84C, + H_8D6, plus S19RET. + result trace: S19RET a8=00000000 (lookup returned 0 = ok) + ... and NOTHING from the handoff. + +Second run, tracing slot 19's own landmarks: + + S19RET a8=00000000 (0x6A7B4: lookup succeeded) + S19_7BE 0x6A7BE + S19_850 0x6A850 + S19_ERR_EXIT 0x6AA4A <-- slot 19 exits here + (S19_9A2, the CALLA 0x7EAB640 handoff call, is NEVER reached) + +So with the gate satisfied, slot 19 accepts the request, walks to 0x6A850, and +then takes the exit at 0x6AA4A without ever calling the import-element executor +0x7EAB640. A8 is 0, so the client sees "success" -- but no tile data is +transferred, and element+0x28 is never written. That is exactly why src_base +(rp+0x610) stays 00000000 even when arm1, PUT_TILE and EXPORT all report success. + +RECAP OF THE NOW-COMPLETE GATE PICTURE (all measured): + arm requires object->byte8 == 1 (DSJS 0x6ACC2, a7 = byte8) + import requires *(object->byte36) == 3 (deref at 0x6BAF2) + -> these are independent, so a byte8=1 resource with byte36 -> byte==3 passes + BOTH and PUT_TILE returns 0. + BUT passing the gate only reaches the exit at 0x6AA4A; the actual import + (0x7EAB640) sits on a different branch that is not taken. + +NEXT: read the code between 0x6A850 and 0x6AA4A to find the branch that bypasses +0x6A9A2, and what it tests. That branch is now the single remaining obstacle +between "gate passed" and "tile actually imported". + +Status: no client-chosen XIE image; src_base 0; window unchanged; xshow is the +only viewer that has displayed an image. diff --git a/xie/evidence/handoff_runs_now.txt b/xie/evidence/handoff_runs_now.txt new file mode 100644 index 0000000..b043322 --- /dev/null +++ b/xie/evidence/handoff_runs_now.txt @@ -0,0 +1,42 @@ +THE IMPORT HANDOFF 0x7EAB640 NOW EXECUTES (first time in this investigation). + +Two more conditions were needed beyond the gate, both found by instrumenting: + + 1. the lookup's mask check at 0x6BB82 (CMP A7,A11) compares *(byte36 + 8) + against the requested band. With band = 1 the byte at byte36+8 must have + bit0 set: + byte36->[0]=3, [8]=0, band=1 : SELB_CMP a7=0 a11=1 -> SELB_BAD8 + byte36->[0]=3, [8]=1, band=1 : SELB_CMP a7=1 a11=1 -> OK_6BBE2 + 2. with that satisfied the lookup returns 0 and PUT_TILE is accepted. + + Debug pokes used: object->byte36 = scratch; scratch[0] = 3; scratch[8] = 1. + (All pokes labelled; client reachability still unproven.) + +RESULT (both tiles, identical): + + arm1 SILENT(ok) + PUT_TILE SILENT(ok) + handoff HANDOFF_ENTRY 0x6B640 -> H_84C_NOOP <-- RUNS, then NO-OPS + arm2 ERROR 8 + EXPORT SILENT(ok) + window nz 512 -> 512, unchanged, 888888888888888822222222 + src_base 0 (RP never printed non-zero) + +So the handoff executes but immediately takes its no-op branch at 0x6B84C, which +is the guard + 0x6B684 MOVE *A9(0xd8),A9,1 + 0x6B688 JREQ 0x6B84C ; band subobject == 0 -> no-op +i.e. the band subobject pointer at band+0xd8 is zero for this resource. + +PROGRESS SUMMARY (each step measured, in order): + byte8 == 1 -> arm passes + *(byte36) == 3 -> gate at 0x6BAF4 passes + *(byte36 + 8) bit0 == band -> lookup mask check at 0x6BB82 passes + band (word5) != 0 -> import path not skipped at 0x6A896 + -> handoff 0x6B640 finally RUNS, but band+0xd8 == 0 so it no-ops. + +NEXT: make band+0xd8 non-zero (the band subobject / element record). That is the +last gate before tile data can reach element+0x28 and hence src_base. + +Status: no client-chosen XIE image yet; window unchanged; xshow (core X) remains +the only viewer that has displayed an image. diff --git a/xie/evidence/import_guard_word5.txt b/xie/evidence/import_guard_word5.txt new file mode 100644 index 0000000..6b4400e --- /dev/null +++ b/xie/evidence/import_guard_word5.txt @@ -0,0 +1,35 @@ +THE BRANCH THAT SKIPS THE IMPORT IS FOUND: request payload WORD 5. + +Slot 19, after the geometry check passes (0x6A87C main path): + + 6A88C MOVE *A9(0xc0),*A13(0x40),0x1 ; A9(0xc0) = byte 24 = payload WORD 5 + 6A892 MOVE *A13(0x40),A7,0x1 + 6A896 JREQ 0x0006AA28 ; word5 == 0 -> skip to exit + 6A89A MOVE *A13(0x40),A11,0x1 + 6A89E BTST 0x0,A11 + 6A8A0 JREQ 0x0006AA10 ; bit0 clear -> another path + 6A8A4 ... ; then the import loop (reaches 0x6A9A2) + +My tile header has always been [id, x, y, w, h, band, flags] with band = 0, i.e. +word5 = 0 -- which takes the JREQ and exits without importing. That is exactly +why 0x7EAB640 never ran and src_base stayed 0. + +MEASURED with band (word5) varied, gate satisfied, byte8=1: + + band = 0 -> PUT_TILE SILENT(ok) handoff trace: (none) + band = 1 -> PUT_TILE ERROR 8 handoff trace: (none) + band = 3 -> PUT_TILE ERROR 8 handoff trace: (none) + +So word5 != 0 does move past the skip (the request now fails with BadMatch +instead of silently succeeding), but the handoff still does not execute -- a +further check on that path rejects it (candidate: the band/subobject lookup that +0x6A8A4.. performs). + +ALSO CONFIRMED THIS TURN: the trace now shows the main path being taken + S19_C0 -> S19_852 -> S19_87C_mainpath -> S19_EXIT +where earlier runs went S19_850 -> S19_EXIT directly, so the geometry condition +(A13(0xc0) > 0) is satisfied with a 64x64 tile at 0,0. + +STATUS: no client-chosen XIE image. Progress: the "success is a no-op" is now +explained (word5 == 0 skips the import), and the next obstacle is the BadMatch +raised when word5 != 0. diff --git a/xie/evidence/import_revalidated.txt b/xie/evidence/import_revalidated.txt new file mode 100644 index 0000000..1d9de97 --- /dev/null +++ b/xie/evidence/import_revalidated.txt @@ -0,0 +1,43 @@ +IMPORT PATH RE-VALIDATED WITH THE TRUSTWORTHY HARNESS. A long-standing model is +OVERTURNED. + +Two trials, one connection each, every reply read and asserted, raw bytes shown. + + trial 1 (white tile) trial 2 (black tile) + SET_OP_DEFAULTS ack REPLY 01 41 03 00 ... ack REPLY 01 00 03 00 ... (detail differs) + create 00401000 SILENT(ok) SILENT(ok) + obj 003FDA10 003FD110 + byte8=1 byte9=1 class=2 byte8=1 byte9=1 class=2 + p44 / elem set, populated set, populated + arm1 SILENT(ok) SILENT(ok) + PUT_TILE ERROR 8 ERROR 8 + arm2 ERROR 8 ERROR 8 + EXPORT SILENT(ok) SILENT(ok) + GATE (0x6BAF4) hits during put: NONE NONE + RP line a11=00923CB0 src_base610=00000000 a11=009240F0 src_base610=00000000 + byte8 after all 1 1 + QUERY_EXPORT REPLY 01 00 0c 00 04 00 00 00 REPLY 01 00 0c 00 04 00 00 00 + +THE OVERTURNED MODEL: + I have been reporting since the middle of this session that + arm requires object->byte8 == 1 (0x6ACBE) + import requires object->byte8 == 3 (0x6BAF4) + and that PUT_TILE fails AT that gate. + + With a harness that actually asserts replies, the gate at 0x6BAF4 is NEVER + REACHED during PUT_TILE -- zero hits in both trials. So PUT_TILE's BadMatch is + produced somewhere else entirely, and the entire byte8/gate story (including + the w9=0x300 experiments) was built on data from the stale-reply era. + +Also newly verified in this run: + * arm2 (slot 20, v16=0) returns BadMatch(8) -- it is NOT silent/OK as reported + earlier; + * EXPORT is silent(ok) even when PUT_TILE and arm2 both failed; + * QUERY_EXPORT replies `01 00 0c 00 04 00 00 00` identically in both trials + (this is its real reply; the 4-word payload follows in the head); + * src_base (rp+0x610) is 0 in both trials, read at the in-export breakpoint. + +CONSEQUENCE: the import failure must be re-located from scratch. The next step is +NOT the byte8 gate. Candidates, now that replies are trustworthy: the lookup at +0x7EAB966 returning 8, or a check in slot 19 before/after it. S19LOOK-style +breakpoints must be re-run under this harness. diff --git a/xie/evidence/levels_type_bug_fixed.txt b/xie/evidence/levels_type_bug_fixed.txt new file mode 100644 index 0000000..2c97af2 --- /dev/null +++ b/xie/evidence/levels_type_bug_fixed.txt @@ -0,0 +1,48 @@ +TURN RECORD: Genuine DEC 2.3 client -- TWO API MISUSES FOUND AND FIXED. + +A) XiePutImage MODE WAS WRONG + XieLibImage.c: + XiePhoto XiePutImage(display, img, mode) + switch(mode) { + case XieK_DataFlo: case XieK_DataMap: CreateXport(...PutStream...) + case XieK_DataNone: break; + case XieK_DataCopy: CreateXport(...); XiePutImageData(img); + default: _XieLibError(EINVAL, "XiePutImage (mode)"); + } + I was passing XieK_Tile, which hits the `default` error branch -- so no image + data was ever transported. Corrected to XieK_DataCopy. + +B) cmp_lvl TYPE WAS WRONG (the real bug) + XieLibImage.c: + XieImage XieCreateImage(width, height, cmpres, cmp_org, cmp_map, + cmp_cnt, cmp_lvl, pxl_mod, scn_mod) + unsigned long width, height, *cmp_lvl; <-- unsigned long * + I passed `unsigned char lvl[3]`, so the server/client saw levels = 0x00020202 + (131586) instead of 2, and printed "image levels 131586,0,0". + Corrected to `unsigned long lvl[3] = {2,2,2}` -> "image levels 2,0,0". + +C) EFFECT ON THE ERROR + before fixes: Export -> BadMatch (8) [Constrained_/src_lvls mismatch] + after fixes: Export -> BadValue (2), "Value in failed request: 0x0" + i.e. BadMatch is resolved; the remaining failure is the + ValueOkIf_( w > 0 && h > 0 ) + in ProcExport, where + w = min(src_x,0)+width ; w = Width_(img) < x+w ? Width_(img)-x : w + h = min(src_y,0)+height; h = Height_(img) < y+h ? Height_(img)-y : h + With src 0,0 and 64x64 that is BadValue only if the server's Width_/Height_ of + the photomap are 0 -- i.e. the photomap the library created via PutStream is + not populated with dimensions from the image. + +D) OTHER OBSERVATIONS + XieCreateImage now reports plane arSize = 4096 bytes for 64x64 1-bit + (512 bytes of pixels); earlier, with the bogus levels, it was 262144. + Window depth is 1 (root: "depths (1): 1"), so drawable depth matches. + +E) STATE + No client-chosen image displayed. Window unchanged. + xshow (core X) remains the only viewer that has shown an image. + +NEXT: make the photomap carry Width_/Height_ -- inspect ProcPutStream / +XieCreatePhoto in the server source for when Width_/Height_ are set, or use +XieCreatePhoto + XiePutTile (which is the path my hand-rolled client used +successfully for the import) instead of XiePutImage/PutStream. diff --git a/xie/evidence/lookup_is_6B966.txt b/xie/evidence/lookup_is_6B966.txt new file mode 100644 index 0000000..2defdde --- /dev/null +++ b/xie/evidence/lookup_is_6B966.txt @@ -0,0 +1,63 @@ +THE SLOT-19 LOOKUP IS FILE 0x6B966, NOT 0x66FA0. And it does not contain the +failure we see. All previous explanations built on 0x66FA0 are void. + +1) The call, from slot 19's own handler: + rom:0006a7ae CALLA 0x07eab966 ; file = imm - 0x7E40000 = 0x6B966 + rom:0006a7b4 MOVE A8,*A13(0x140),0x1 ; A8 = the returned code + + Arguments pushed immediately before it (slot19 listing 0x6A790..0x6A7AC): + *A9(0xc0) -> request payload word 5 (offset 24) + MOVK 0x3 -> literal 3 + *A9(0x20) -> request payload word 0 (the resource id) + A13+0 -> out pointer + A13 -> frame pointer + 0 + client (*A13(0xffe0)) + i.e. 7 arguments. 0x6B966's frame reads them as + A13(0xffe0)=client, 0xffc0=arg1, 0xffa0=arg2, 0xff80=arg3, + 0xff60=arg4 (the id), 0xff40=arg5 (=3), 0xff20=arg6 (= payload word 5) + +2) 0x6B966's flow (file offsets): + 6B97C push @0x1ad980 (8-bit) ; core-X-ish table args + 6B984 push @0x1ad990 (8-bit) + 6B98C push the id + 6B990 CALLA 0x07F174A4 ; returns an object pointer + 6B996 store it, A11 = *A7 + 6B99A JRNE 0x6BA8C ; non-null -> dispatch on class + 6B99C ... MOVK 0xe ; null -> BadIDChoice + 6BA8C A11 = object ; A8 = object->byte4 ; class byte + 6BA90 DEC ; JREQ 0x6B9C4 ; class 1 + 6BA98 DEC ; JREQ 0x6BA1E ; class 2 + 6BA9C DEC ; JREQ 0x6BA1E ; class 3 + 6BAA0 JR 0x6BA66 -> MOVK 0xe ; any other class -> BadIDChoice + 6BA1E (classes 2/3) arg3==NULL ? + -> require object->byte40 == 0, else MOVK 0xe (6BA38..6BA40) + arg3!=NULL -> copy object->byte40 out to *arg3 (6BA2A) + 6B9C4 (class 1) requires arg3 != NULL (else 0xe) and uses a + two-step deref: object->byte8->byte8 or object->byte12->byte8 + + NOTE: this function raises ONLY 0xE and 0xA (6BA40 / 6BAC6). There is no + route in 0x6B966 that produces 0x8 before 0x6BBC0. + +3) Measurements that conflict with any simple story, recorded as-is: + a) Sweeping request payload word 5 (arg6) over + 0x0 0x1 0x2 0x100 0x10000 0x80000000 0xFFFFFFFF 0xFFFFFFFE + in both armI and armF produced BadMatch(8) EVERY time -- arg6 has no + observable effect. + b) A breakpoint on the 0xE-build site (0x6BA86) DID fire during a put whose + reply to the client was ERR8. + c) Breakpoints on the 0xA site (0x6BAC6) and on a MOVK-0x8 site inside the + function (0x6BB4C) did NOT fire during that same put. + d) A breakpoint on the shared reply/logging helper 0x7EFFA5E did not fire at + all during the put. + + So the ERR8 the client receives is NOT produced by the error-site we can see, + and site-based attribution is unreliable. The handler's return value is what + the framework turns into the protocol error, and the 0x8 must come from a + callee return (candidates inside 0x6B966: 0x7F174A4, 0x7F16AD0, 0x7EFFA5E). + Of those, 0x7F16AD0 (file 0xD6AD0) was checked and is a bit-field extractor + returning 0xFFFF for unknown selectors -- not the source either. + +NEXT (bounded): disassemble the rest of 0x6B966 (0x6BBC0..0x6BBE4) and the +0x6BAEA path, and log A8 at every return, to find the 0x8's true origin. Until +that is known, "BadMatch" cannot be interpreted. diff --git a/xie/evidence/mame_band_arm2.log b/xie/evidence/mame_band_arm2.log new file mode 100644 index 0000000..009fdd2 --- /dev/null +++ b/xie/evidence/mame_band_arm2.log @@ -0,0 +1,23 @@ +MAME debugger version 0.289 (mame0289-1-gf0cbd6294c39) +Currently targeting vt1200 (VT1200 X terminal (v2.2 firmware)) +Breakpoint 1 set +Breakpoint 2 set +Breakpoint 3 set +Breakpoint 4 set +Breakpoint 5 set +XIEHIT buf=00951250 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00951250 0881 000C 0000 50AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FDC50 id=00000000 class=00 b8=00 b36=00 b40=00000000 b44=00000000 + +XIEHIT buf=00951250 1481 0023 0050 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00951250 1381 0088 0050 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FDC50 id=0050AAAA class=01 b36=00 b40=00000000 b44=00000000 + +XIEHIT buf=00951250 1481 0023 0050 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +BAND a11=00291D70 f1=01 f2=02 f4=00010000 f8=00000000 f12=00000000 f16=00000000 + diff --git a/xie/evidence/mame_bind_slot7.txt b/xie/evidence/mame_bind_slot7.txt new file mode 100644 index 0000000..58802d2 --- /dev/null +++ b/xie/evidence/mame_bind_slot7.txt @@ -0,0 +1,10 @@ +Slot 7 as a bind candidate, tested with the solved arm-2 gate (v16=0): + + bind=False fill=one : arm1=OK put=OK arm2=OK export=OK nz=512 first=8888...2222... + bind=False fill=zero : arm1=OK put=OK arm2=OK export=OK nz=512 first=8888...2222... + bind=True fill=one : arm1=OK put=ERR14(BadIDChoice) arm2=OK export=OK nz=512 ... + bind=True fill=zero : arm1=OK put=ERR14(BadIDChoice) arm2=OK export=OK nz=512 ... + +Slot 7 {op=1, type=0, id} is therefore not the sink bind: it makes PUT_TILE +fail and does not change the export pattern. The export remains independent +of the tile data. diff --git a/xie/evidence/mame_look_dump.log b/xie/evidence/mame_look_dump.log new file mode 100644 index 0000000..b6b09b1 --- /dev/null +++ b/xie/evidence/mame_look_dump.log @@ -0,0 +1,23 @@ +MAME debugger version 0.289 (mame0289-1-gf0cbd6294c39) +Currently targeting vt1200 (VT1200 X terminal (v2.2 firmware)) +Breakpoint 1 set +Breakpoint 2 set +Breakpoint 3 set +Breakpoint 4 set +Breakpoint 5 set +XIEHIT buf=009367B0 0181 0002 0003 0C08 0002 AAAA 0050 0000 0000 0000 0000 0000 0000 0000 0102 0001 + +XIEHIT buf=009367B0 0881 000C 0000 50AA 0040 0040 0000 0000 0000 0100 0000 0000 0023 0000 0000 0000 + +RES a9=003FE0D0 id=00000000 class=00 b8=00 b36=4E b40=00000000 b44=00000000 + +XIEHIT buf=009367B0 1481 0023 0050 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009367B0 1381 0088 0050 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FE0D0 id=0050AAAA cls=01 b36=4E b40=00000000 AA 01 00 00 4D F0 55 50 00 4E 00 00 0C 00 02 00 + +XIEHIT buf=009367B0 1481 0023 0050 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +BAND a11=00904D90 f1=01 f2=02 f4=00010000 f8=00000000 f12=00000000 f16=00000000 + diff --git a/xie/evidence/mame_look_not_resource.txt b/xie/evidence/mame_look_not_resource.txt new file mode 100644 index 0000000..5cadca0 --- /dev/null +++ b/xie/evidence/mame_look_not_resource.txt @@ -0,0 +1,18 @@ +The 0x6BA38 breakpoint is not a stable XIE resource pointer. + +First connection (create/arm/put) printed: + LOOK a7=003FDA10 id=0030AAAA cls=01 b36=6E b40=2074736F + AA 01 00 00 5C D0 00 D0 6E 6E 6F 32 39 55 02 10 + +Second connection (create/arm), peeking the same 0x003FDA10 before and after +PUT_TILE returned the terminal message string: + + before 43 6f 6e 6e 65 63 74 69 6f 6e 20 72 65 71 75 65 73 74 20 66 72 6f 6d + 20 49 50 20 68 6f 73 74 20 31 39 32 2e 31 36 38 2e 39 39 2e 31 00 ... + after (identical) + diff: none + +So the "resource pointer" observed at 0x6BA38 is an unrelated lookup (the +terminal's log/message buffer), not the XIE resource. The requested +before/after resource diff is therefore not obtainable with this breakpoint; +the address mapping in GHIDRA_XIE_IMPORT.md is wrong for this path. diff --git a/xie/evidence/mame_put_gate.txt b/xie/evidence/mame_put_gate.txt new file mode 100644 index 0000000..07d5049 --- /dev/null +++ b/xie/evidence/mame_put_gate.txt @@ -0,0 +1,26 @@ +PUT_TILE state gate, single MAME instance, live resource found by scanning the +XIE table entry (ID + handler 0x3F566ED0, resource pointer at +12). + +Write watchpoints during PUT_TILE (res, band, resource+44, band+0x30): + WPHIT res addr=003FDC80 data=00000000 ; resource byte 48 = 0 + WPHIT band addr=008F6750 data=00000001 ; band byte 12 = 1 +No other writes in those ranges. + +Slot 20 compares band+0x60 (byte 12) with request byte 16 (v16) and requires +the AND to be zero. Therefore after PUT_TILE the second execute must use +v16 = 0: + + arm1 v16=1 -> OK + put -> OK + arm2 v16=0 -> OK + arm2 v16=2/3/4/0x10 -> BadMatch + +So the post-put gate is solved: band byte 12 = 1, second arm v16 = 0. + +BUT export is still independent of the pixels: + solid-white nz=512 first=88888888888888882222222222222222 + solid-black nz=512 first=88888888888888882222222222222222 + +Binding band+0x30 (which is zero) to the resource+44 pointer by rdebug poke +also produced the same pattern. The remaining gap is the destination/sink for +the tile data and the export draw path, not the arm-2 gate. diff --git a/xie/evidence/mame_put_watchpoints.log b/xie/evidence/mame_put_watchpoints.log new file mode 100644 index 0000000..f7d2a39 --- /dev/null +++ b/xie/evidence/mame_put_watchpoints.log @@ -0,0 +1,826 @@ +MAME debugger version 0.289 (mame0289-1-gf0cbd6294c39) +Currently targeting vt1200 (VT1200 X terminal (v2.2 firmware)) +Breakpoint 1 set +Breakpoint 2 set +Breakpoint 3 set +Breakpoint 4 set +Breakpoint 5 set +XIEHIT buf=0096A6D0 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=0096A6D0 0881 000C 0000 40BE 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FDC50 id=00000000 class=00 b8=00 b36=4E b40=00000000 b44=00000000 + +XIEHIT buf=0096A6D0 1481 0023 0040 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=0096A6D0 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=0096A6D0 0881 000C 0000 40BE 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FDC50 id=00000000 class=00 b8=00 b36=4E b40=00000000 b44=00000000 + +XIEHIT buf=0096A6D0 1481 0023 0040 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +Watchpoint 1 set +Watchpoint 2 set +Watchpoint 3 set +XIEHIT buf=0096A6D0 1381 0088 0040 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FDC50 id=0040BEEF cls=01 b36=4E b40=00000000 EF 01 00 00 66 F0 55 10 3F 4E 00 00 0C 00 02 55 + +XIEHIT buf=0096A6D0 1481 0023 0040 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +BAND a11=008F66F0 f1=01 f2=02 f4=00010000 f8=00000000 f12=00000000 f16=00000000 + +WPHIT res addr=003FDC80 data=00000000 + +WPHIT band addr=008F6750 data=00000001 + +WPHIT res addr=003FDC50 data=00000000 + +WPHIT res addr=003FDC60 data=00000000 + +WPHIT res addr=003FDC70 data=00000000 + +WPHIT res addr=003FDC80 data=00000000 + +WPHIT res addr=003FDC90 data=00000000 + +WPHIT res addr=003FDCA0 data=00000000 + +WPHIT res addr=003FDCB0 data=00000000 + +WPHIT res addr=003FDC50 data=00000043 + +WPHIT res addr=003FDC50 data=00006F43 + +WPHIT res addr=003FDC60 data=0000006E + +WPHIT res addr=003FDC60 data=00006E6E + +WPHIT res addr=003FDC70 data=00000065 + +WPHIT res addr=003FDC70 data=00006365 + +WPHIT res addr=003FDC80 data=00000074 + +WPHIT res addr=003FDC80 data=00006974 + +WPHIT res addr=003FDC90 data=0000006F + +WPHIT res addr=003FDC90 data=00006E6F + +WPHIT res addr=003FDCA0 data=00000020 + +WPHIT res addr=003FDCA0 data=00007220 + +WPHIT res addr=003FDCB0 data=00000065 + +WPHIT res addr=003FDCB0 data=00007165 + +XIEHIT buf=0096A6D0 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=0096A6D0 0881 000C 0000 40BE 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +WPHIT p44 addr=003E08F0 data=00000000 + +WPHIT p44 addr=003E08F0 data=00000000 + +WPHIT p44 addr=003E0900 data=00000000 + +WPHIT p44 addr=003E0900 data=00000000 + +WPHIT p44 addr=003E0910 data=00000000 + +WPHIT p44 addr=003E0910 data=00000000 + +WPHIT p44 addr=003E0920 data=00000000 + +WPHIT p44 addr=003E0920 data=00000000 + +WPHIT p44 addr=003E0930 data=00000000 + +WPHIT p44 addr=003E0930 data=00000000 + +WPHIT p44 addr=003E0940 data=00000000 + +WPHIT p44 addr=003E0940 data=00000000 + +WPHIT p44 addr=003E0950 data=00002000 + +WPHIT p44 addr=003E0950 data=00000000 + +WPHIT p44 addr=003E0940 data=00000005 + +WPHIT p44 addr=003E0930 data=00000029 + +RES a9=003FDA10 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +WPHIT p44 addr=003E0950 data=00000005 + +WPHIT p44 addr=003E0950 data=00002005 + +XIEHIT buf=0096A6D0 1481 0023 0040 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +WPHIT band addr=008F66F0 data=00000100 + +WPHIT band addr=008F66F0 data=00000000 + +WPHIT band addr=008F6700 data=00000000 + +WPHIT band addr=008F6700 data=00000000 + +WPHIT band addr=008F6710 data=00000000 + +WPHIT band addr=008F6710 data=00000000 + +WPHIT band addr=008F6720 data=00000000 + +WPHIT band addr=008F6720 data=00000000 + +WPHIT band addr=008F6730 data=00000000 + +WPHIT band addr=008F6730 data=00000000 + +WPHIT band addr=008F6740 data=00000000 + +WPHIT band addr=008F6740 data=00000000 + +WPHIT band addr=008F6750 data=00000000 + +WPHIT band addr=008F6750 data=00000000 + +WPHIT band addr=008F66F0 data=00000001 + +WPHIT band addr=008F66F0 data=00000101 + +WPHIT band addr=008F6700 data=00000002 + +WPHIT band addr=008F6710 data=00000040 + +WPHIT band addr=008F6720 data=00000000 + +WPHIT band addr=008F6730 data=00000001 + +WPHIT band addr=008F6740 data=00000000 + +WPHIT band addr=008F6750 data=00000000 + +XIEHIT buf=0096A6D0 1381 0088 0040 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FDA10 id=0040BEEF cls=01 b36=6E b40=2074736F EF 01 00 00 66 F0 00 D0 6E 6E 6F 32 39 55 02 10 + +XIEHIT buf=0096A6D0 1481 0023 0040 0000 0102 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +BAND a11=008F66F0 f1=01 f2=02 f4=00010000 f8=00000000 f12=00000000 f16=00000000 + +WPHIT band addr=008F6730 data=00000001 + +WPHIT band addr=008F6740 data=00000000 + +XIEHIT buf=0096A6D0 1481 0023 0040 0000 0102 0002 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +BAND a11=008F66F0 f1=01 f2=02 f4=00010000 f8=00000000 f12=00000000 f16=00000000 + +XIEHIT buf=0096A6D0 1481 0023 0040 0000 0102 0003 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +BAND a11=008F66F0 f1=01 f2=02 f4=00010000 f8=00000000 f12=00000000 f16=00000000 + +XIEHIT buf=0096A6D0 1481 0023 0040 0000 0102 0004 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +BAND a11=008F66F0 f1=01 f2=02 f4=00010000 f8=00000000 f12=00000000 f16=00000000 + +XIEHIT buf=0096A6D0 1481 0023 0040 0000 0102 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +BAND a11=008F66F0 f1=01 f2=02 f4=00010000 f8=00000000 f12=00000000 f16=00000000 + +WPHIT band addr=008F6750 data=00000001 + +WPHIT p44 addr=003E08F0 data=00000000 + +WPHIT p44 addr=003E0900 data=00000000 + +WPHIT p44 addr=003E0910 data=00000000 + +WPHIT p44 addr=003E0920 data=00000000 + +WPHIT p44 addr=003E0930 data=00000000 + +WPHIT p44 addr=003E0940 data=00000000 + +WPHIT p44 addr=003E0950 data=00000000 + +WPHIT p44 addr=003E0950 data=00000000 + +WPHIT p44 addr=003E0930 data=000010F0 + +WPHIT p44 addr=003E0940 data=00000029 + +WPHIT p44 addr=003E08F0 data=0000F610 + +WPHIT p44 addr=003E0900 data=0000000B + +WPHIT p44 addr=003E0910 data=00000A90 + +WPHIT p44 addr=003E0920 data=0000003E + +XIEHIT buf=0096A6D0 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=0096A6D0 0881 000C 0000 40BE 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FDA10 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=0096A6D0 1481 0023 0040 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +WPHIT band addr=008F66F0 data=00000100 + +WPHIT band addr=008F66F0 data=00000000 + +WPHIT band addr=008F6700 data=00000000 + +WPHIT band addr=008F6700 data=00000000 + +WPHIT band addr=008F6710 data=00000000 + +WPHIT band addr=008F6710 data=00000000 + +WPHIT band addr=008F6720 data=00000000 + +WPHIT band addr=008F6720 data=00000000 + +WPHIT band addr=008F6730 data=00000000 + +WPHIT band addr=008F6730 data=00000000 + +WPHIT band addr=008F6740 data=00000000 + +WPHIT band addr=008F6740 data=00000000 + +WPHIT band addr=008F6750 data=00000000 + +WPHIT band addr=008F6750 data=00000000 + +WPHIT band addr=008F66F0 data=00000001 + +WPHIT band addr=008F66F0 data=00000101 + +WPHIT band addr=008F6700 data=00000002 + +WPHIT band addr=008F6710 data=00000040 + +WPHIT band addr=008F6720 data=00000000 + +WPHIT band addr=008F6730 data=00000001 + +WPHIT band addr=008F6740 data=00000000 + +WPHIT band addr=008F6750 data=00000000 + +XIEHIT buf=0096A6D0 1381 0088 0040 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FDA10 id=0040BEEF cls=01 b36=6E b40=2074736F EF 01 00 00 66 B0 00 D0 6E 6E 6F 32 39 55 02 10 + +XIEHIT buf=0096A6D0 1481 0023 0040 0000 0102 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +BAND a11=008F66F0 f1=01 f2=02 f4=00010000 f8=00000000 f12=00000000 f16=00000000 + +WPHIT band addr=008F6730 data=00000001 + +WPHIT band addr=008F6740 data=00000000 + +XIEHIT buf=0096A6D0 1581 0010 0040 40C0 D000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +WPHIT p44 addr=003E08F0 data=0000ADF0 + +WPHIT p44 addr=003E0900 data=0000003D + +WPHIT p44 addr=003E08F0 data=0000F610 + +WPHIT p44 addr=003E0900 data=0000000B + +WPHIT p44 addr=003E08F0 data=0000ADF0 + +WPHIT p44 addr=003E0900 data=0000003D + +WPHIT p44 addr=003E08F0 data=000008F0 + +WPHIT p44 addr=003E0900 data=0000003E + +WPHIT p44 addr=003E0910 data=000008F0 + +WPHIT p44 addr=003E0920 data=0000003E + +WPHIT band addr=008F6750 data=00000001 + +XIEHIT buf=009AB750 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009AB750 0881 000C 0000 50BE 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FDA10 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=009AB750 1481 0023 0050 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009AB750 1381 0088 0050 0000 0000 0040 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +LOOK a7=003FDA10 id=0050BEEF cls=01 b36=6E b40=2074736F EF 01 00 00 07 10 10 D0 6E 6E 6F 32 39 55 02 43 + +XIEHIT buf=009AB750 1481 0023 0050 0000 0102 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +BAND a11=00290770 f1=01 f2=02 f4=00010000 f8=00000000 f12=00000000 f16=00000000 + +WPHIT band addr=008F66F0 data=00000000 + +WPHIT band addr=008F6700 data=00000000 + +WPHIT band addr=008F6710 data=00000000 + +WPHIT band addr=008F6720 data=00000000 + +WPHIT band addr=008F6730 data=00000000 + +WPHIT band addr=008F6740 data=00000000 + +WPHIT band addr=008F6750 data=00000000 + +WPHIT band addr=008F66F0 data=00003CD0 + +WPHIT band addr=008F6700 data=00000032 + +WPHIT band addr=008F6710 data=000014D0 + +WPHIT band addr=008F6720 data=00000032 + +WPHIT band addr=008F6750 data=00008B90 + +WPHIT band addr=008F6730 data=00008190 + +WPHIT band addr=008F6740 data=00000032 + +WPHIT p44 addr=003E08F0 data=00000000 + +WPHIT p44 addr=003E0900 data=00000000 + +WPHIT p44 addr=003E0910 data=00000000 + +WPHIT p44 addr=003E0920 data=00000000 + +WPHIT p44 addr=003E0930 data=00000000 + +WPHIT p44 addr=003E0940 data=00000000 + +WPHIT p44 addr=003E0950 data=00000000 + +WPHIT p44 addr=003E08F0 data=00000002 + +WPHIT p44 addr=003E0900 data=00000000 + +WPHIT p44 addr=003E0930 data=00000001 + +WPHIT p44 addr=003E0940 data=00000000 + +WPHIT p44 addr=003E0910 data=00000001 + +WPHIT p44 addr=003E0920 data=00000000 + +WPHIT p44 addr=003E0950 data=00000014 + +WPHIT band addr=008F6730 data=00000000 + +WPHIT band addr=008F6740 data=00000000 + +WPHIT p44 addr=003E08F0 data=000008F0 + +WPHIT p44 addr=003E0900 data=0000003E + +WPHIT p44 addr=003E0910 data=000008F0 + +WPHIT p44 addr=003E0920 data=0000003E + +WPHIT p44 addr=003E0930 data=00000003 + +WPHIT p44 addr=003E0940 data=00000000 + +WPHIT p44 addr=003E0950 data=00000000 + +WPHIT p44 addr=003E0930 data=00000303 + +WPHIT p44 addr=003E08F0 data=0000B470 + +WPHIT p44 addr=003E0900 data=0000003D + +WPHIT p44 addr=003E0910 data=0000AE00 + +WPHIT p44 addr=003E0920 data=0000000C + +WPHIT p44 addr=003E0950 data=0000F450 + +WPHIT p44 addr=003E0940 data=00000001 + +WPHIT p44 addr=003E0940 data=00000000 + +WPHIT p44 addr=003E08F0 data=000008F0 + +WPHIT p44 addr=003E0900 data=0000003E + +WPHIT p44 addr=003E0910 data=000008F0 + +WPHIT p44 addr=003E0920 data=0000003E + +WPHIT p44 addr=003E08F0 data=000000E0 + +WPHIT p44 addr=003E0900 data=00000000 + +WPHIT p44 addr=003E0910 data=00000012 + +WPHIT p44 addr=003E0920 data=00000020 + +WPHIT p44 addr=003E0930 data=00000000 + +WPHIT p44 addr=003E0940 data=00000000 + +WPHIT p44 addr=003E0950 data=00000000 + +WPHIT p44 addr=003E08F0 data=000000E0 + +WPHIT p44 addr=003E0900 data=00000000 + +WPHIT p44 addr=003E0910 data=00000012 + +WPHIT p44 addr=003E0920 data=00000020 + +WPHIT p44 addr=003E0930 data=00000000 + +WPHIT p44 addr=003E0940 data=00000000 + +WPHIT p44 addr=003E0950 data=00000000 + +WPHIT p44 addr=003E08F0 data=000000E0 + +WPHIT p44 addr=003E0900 data=00000000 + +WPHIT p44 addr=003E0910 data=00000012 + +WPHIT p44 addr=003E0920 data=00000020 + +WPHIT p44 addr=003E0930 data=00000000 + +WPHIT p44 addr=003E0940 data=00000000 + +WPHIT p44 addr=003E0950 data=00000000 + +XIEHIT buf=009AB750 1581 0010 0050 50C0 D000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +WPHIT p44 addr=003E08F0 data=00000000 + +WPHIT p44 addr=003E0900 data=00000000 + +WPHIT p44 addr=003E0910 data=00000000 + +WPHIT p44 addr=003E0920 data=00000000 + +WPHIT p44 addr=003E0930 data=00000000 + +WPHIT p44 addr=003E0940 data=00000000 + +WPHIT p44 addr=003E0950 data=00000000 + +WPHIT p44 addr=003E0950 data=00000000 + +WPHIT p44 addr=003E0930 data=00009350 + +WPHIT p44 addr=003E0940 data=0000008F + +WPHIT p44 addr=003E08F0 data=0000F610 + +WPHIT p44 addr=003E0900 data=0000000B + +WPHIT p44 addr=003E0910 data=0000ADF0 + +WPHIT p44 addr=003E0920 data=0000003D + +WPHIT p44 addr=003E08F0 data=000008F0 + +WPHIT p44 addr=003E0900 data=0000003E + +WPHIT p44 addr=003E0910 data=000008F0 + +WPHIT p44 addr=003E0920 data=0000003E + +WPHIT band addr=008F6730 data=00009BD0 + +WPHIT band addr=008F6740 data=00000032 + +WPHIT band addr=008F66F0 data=00000000 + +WPHIT band addr=008F6700 data=00000000 + +WPHIT band addr=008F6710 data=00000000 + +WPHIT band addr=008F6720 data=00000000 + +WPHIT band addr=008F6750 data=00000000 + +WPHIT band addr=008F6730 data=00000000 + +WPHIT band addr=008F6740 data=00000000 + +XIEHIT buf=0096A6D0 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=0096A6D0 0881 000C 0000 50BE 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FD7D0 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=0096A6D0 1481 0023 0050 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +WPHIT band addr=008F66F0 data=00000000 + +WPHIT band addr=008F66F0 data=00000000 + +WPHIT band addr=008F6700 data=00000000 + +WPHIT band addr=008F6700 data=00000000 + +WPHIT band addr=008F6710 data=00000000 + +WPHIT band addr=008F6710 data=00000000 + +WPHIT band addr=008F6720 data=00000000 + +WPHIT band addr=008F6720 data=00000000 + +WPHIT band addr=008F6730 data=00000000 + +WPHIT band addr=008F6730 data=00000000 + +WPHIT band addr=008F6740 data=00000000 + +WPHIT band addr=008F6740 data=00000000 + +WPHIT band addr=008F6750 data=00000000 + +WPHIT band addr=008F6750 data=00000000 + +WPHIT band addr=008F66F0 data=00000001 + +WPHIT band addr=008F66F0 data=00000101 + +WPHIT band addr=008F6700 data=00000002 + +WPHIT band addr=008F6710 data=00000040 + +WPHIT band addr=008F6720 data=00000000 + +WPHIT band addr=008F6730 data=00000001 + +WPHIT band addr=008F6740 data=00000000 + +WPHIT band addr=008F6750 data=00000000 + +XIEHIT buf=0096A6D0 1381 0088 0050 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FD7D0 id=0050BEEF cls=01 b36=6E b40=2074736F EF 01 00 00 66 B0 00 90 6E 6E 6F 32 39 55 02 43 + +XIEHIT buf=0096A6D0 1481 0023 0050 0000 0102 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +BAND a11=008F66F0 f1=01 f2=02 f4=00010000 f8=00000000 f12=00000000 f16=00000000 + +WPHIT band addr=008F6730 data=00000001 + +WPHIT band addr=008F6740 data=00000000 + +WPHIT p44 addr=003E08F0 data=000008F0 + +WPHIT p44 addr=003E0900 data=0000003E + +WPHIT p44 addr=003E0910 data=000008F0 + +WPHIT p44 addr=003E0920 data=0000003E + +WPHIT p44 addr=003E0930 data=00009303 + +WPHIT p44 addr=003E0940 data=00000000 + +WPHIT p44 addr=003E0950 data=00000000 + +WPHIT p44 addr=003E0930 data=00000303 + +WPHIT p44 addr=003E08F0 data=0000ADF0 + +WPHIT p44 addr=003E0900 data=0000003D + +WPHIT p44 addr=003E0910 data=0000AE00 + +WPHIT p44 addr=003E0920 data=0000000C + +WPHIT p44 addr=003E0950 data=00003090 + +WPHIT p44 addr=003E0940 data=00000001 + +WPHIT p44 addr=003E0910 data=0000AC50 + +WPHIT p44 addr=003E0920 data=0000003D + +WPHIT p44 addr=003E0910 data=0000AE00 + +WPHIT p44 addr=003E0920 data=0000000C + +XIEHIT buf=0096A6D0 1581 0010 0050 50C0 D000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +WPHIT band addr=008F6750 data=00000001 + +XIEHIT buf=009AB750 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +WPHIT p44 addr=003E08F0 data=0000B130 + +WPHIT p44 addr=003E0900 data=0000003D + +WPHIT p44 addr=003E0940 data=00000000 + +WPHIT p44 addr=003E08F0 data=000008F0 + +WPHIT p44 addr=003E0900 data=0000003E + +WPHIT p44 addr=003E0910 data=000008F0 + +WPHIT p44 addr=003E0920 data=0000003E + +XIEHIT buf=009AB750 0881 000C 0000 60BE 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FD7D0 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=009AB750 1481 0023 0060 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009AB750 1381 0088 0060 0000 0000 0040 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +LOOK a7=003FD7D0 id=0060BEEF cls=01 b36=6E b40=2074736F EF 01 00 00 0C 10 10 90 6E 6E 6F 32 39 55 02 43 + +WPHIT band addr=008F66F0 data=00001040 + +WPHIT band addr=008F6700 data=00008000 + +WPHIT band addr=008F6710 data=00000040 + +WPHIT band addr=008F6720 data=00000000 + +WPHIT band addr=008F6730 data=00001040 + +WPHIT band addr=008F6740 data=00000040 + +WPHIT band addr=008F6750 data=00000040 + +XIEHIT buf=009AB750 1481 0023 0060 0000 0102 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +BAND a11=00290C30 f1=01 f2=02 f4=00010000 f8=00000000 f12=00000000 f16=00000000 + +WPHIT band addr=008F66F0 data=00000000 + +WPHIT band addr=008F6700 data=00000000 + +WPHIT band addr=008F6710 data=00000000 + +WPHIT band addr=008F6720 data=00000000 + +WPHIT band addr=008F6730 data=00000000 + +WPHIT band addr=008F6740 data=00000000 + +WPHIT band addr=008F6750 data=00000000 + +WPHIT band addr=008F66F0 data=00006750 + +WPHIT band addr=008F6700 data=00000032 + +WPHIT band addr=008F6710 data=0000D150 + +WPHIT band addr=008F6720 data=00000031 + +WPHIT band addr=008F6750 data=00004F90 + +WPHIT band addr=008F6730 data=00002010 + +WPHIT band addr=008F6740 data=00000032 + +WPHIT p44 addr=003E08F0 data=00000000 + +WPHIT p44 addr=003E0900 data=00000000 + +WPHIT p44 addr=003E0910 data=00000000 + +WPHIT p44 addr=003E0920 data=00000000 + +WPHIT p44 addr=003E0930 data=00000000 + +WPHIT p44 addr=003E0940 data=00000000 + +WPHIT p44 addr=003E0950 data=00000000 + +WPHIT p44 addr=003E0910 data=00000012 + +WPHIT p44 addr=003E0920 data=00000020 + +WPHIT p44 addr=003E08F0 data=00000040 + +WPHIT p44 addr=003E0900 data=00000000 + +WPHIT p44 addr=003E08F0 data=00000060 + +WPHIT p44 addr=003E0900 data=00000000 + +WPHIT p44 addr=003E08F0 data=000000E0 + +WPHIT p44 addr=003E0900 data=00000000 + +WPHIT p44 addr=003E08F0 data=00000000 + +WPHIT p44 addr=003E0900 data=00000000 + +WPHIT p44 addr=003E0910 data=00000000 + +WPHIT p44 addr=003E0920 data=00000000 + +WPHIT p44 addr=003E0930 data=00000000 + +WPHIT p44 addr=003E0940 data=00000000 + +WPHIT p44 addr=003E0950 data=00000000 + +WPHIT p44 addr=003E08F0 data=00000002 + +WPHIT p44 addr=003E0900 data=00000000 + +WPHIT p44 addr=003E0910 data=00000001 + +WPHIT p44 addr=003E0920 data=00000000 + +WPHIT p44 addr=003E0930 data=00000001 + +WPHIT p44 addr=003E0940 data=00000000 + +WPHIT p44 addr=003E0950 data=00000014 + +WPHIT band addr=008F6730 data=00000000 + +WPHIT band addr=008F6740 data=00000000 + +XIEHIT buf=009AB750 1581 0010 0060 60C0 D000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +WPHIT res addr=003FDC50 data=00000000 + +WPHIT res addr=003FDC60 data=00000000 + +WPHIT res addr=003FDC70 data=00000000 + +WPHIT res addr=003FDC80 data=00000000 + +WPHIT res addr=003FDC90 data=00000000 + +WPHIT res addr=003FDCA0 data=00000000 + +WPHIT res addr=003FDCB0 data=00000000 + +WPHIT res addr=003FDC50 data=00000043 + +WPHIT res addr=003FDC50 data=00006F43 + +WPHIT res addr=003FDC60 data=0000006E + +WPHIT res addr=003FDC60 data=00006E6E + +WPHIT res addr=003FDC70 data=00000065 + +WPHIT res addr=003FDC70 data=00006365 + +WPHIT res addr=003FDC80 data=00000074 + +WPHIT res addr=003FDC80 data=00006974 + +WPHIT res addr=003FDC90 data=0000006F + +WPHIT res addr=003FDC90 data=00006E6F + +WPHIT res addr=003FDCA0 data=00000020 + +WPHIT res addr=003FDCA0 data=00007220 + +WPHIT res addr=003FDCB0 data=00000065 + +WPHIT res addr=003FDCB0 data=00007165 + +WPHIT band addr=008F6730 data=0000FE50 + +WPHIT band addr=008F6740 data=00000031 + +WPHIT band addr=008F66F0 data=00000000 + +WPHIT band addr=008F6700 data=00000000 + +WPHIT band addr=008F6710 data=00000000 + +WPHIT band addr=008F6720 data=00000000 + +WPHIT band addr=008F6750 data=00000000 + +WPHIT band addr=008F6730 data=00000000 + +WPHIT band addr=008F6740 data=00000000 + diff --git a/xie/evidence/mame_state_diff.txt b/xie/evidence/mame_state_diff.txt new file mode 100644 index 0000000..b7acc5b --- /dev/null +++ b/xie/evidence/mame_state_diff.txt @@ -0,0 +1,22 @@ +PUT_TILE state diff, single MAME instance, live resource located by scanning the +XIE table entry for the client ID (ID followed by handler pointer 0x3F566ED0; +resource pointer at +12). + +Resource 0x003FDC50 before == after (byte-identical): + ef be 40 00 02 01 01 00 01 01 00 00 00 00 00 00 + 40 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 30 e7 8f 00 00 00 00 00 b0 2c 3e 00 + 55 ... + +Band record (resource+36 = 0x008FE730) before == after (byte-identical): + 01 01 02 00 40 00 00 00 01 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + ... + d0 d7 3f 00 ... + +XIE globals 0x1AD800..0x1ADB00 before == after (no changed bytes). + +After the put, slot 20 still returns BadMatch (8) with bad = resource id. +Conclusion: the post-PUT_TILE gate is not in the resource struct, the band +record, or the XIE global block. The second execute cannot be constructed from +these objects. diff --git a/xie/evidence/mame_xie_resource.log b/xie/evidence/mame_xie_resource.log new file mode 100644 index 0000000..3509db7 --- /dev/null +++ b/xie/evidence/mame_xie_resource.log @@ -0,0 +1,702 @@ +MAME debugger version 0.289 (mame0289-1-gf0cbd6294c39) +Currently targeting vt1200 (VT1200 X terminal (v2.2 firmware)) +Breakpoint 1 set +Breakpoint 2 set +Breakpoint 3 set +Breakpoint 4 set +XIEHIT buf=00950F10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0881 000C 0000 50AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FDC50 id=00000000 class=00 b8=00 b36=00 b40=00000000 b44=00000000 + +XIEHIT buf=00950F10 1481 0023 0050 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 1381 0088 0050 0000 0000 0040 0000 AAAA AAAA 5555 5555 5555 AAAA AAAA AAAA 5555 + +LOOK a7=003FDC50 id=0050AAAA class=01 b36=00 b40=00000000 b44=00000000 + +XIEHIT buf=00950F10 1581 0010 0050 50B0 C000 0000 0000 0000 0000 0000 0000 0000 0000 AAAA AAAA 5555 + +XIEHIT buf=009B1690 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009B1690 0881 000C 0000 60AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FE0D0 id=00000000 class=00 b8=00 b36=55 b40=AAAAAAAA b44=AAAA5555 + +XIEHIT buf=009B1690 1481 0023 0060 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009B1690 1381 0088 0060 0000 0000 0040 0000 AAAA AAAA 5555 5555 5555 AAAA AAAA AAAA 5555 + +LOOK a7=003FE0D0 id=0060AAAA class=01 b36=55 b40=AAAAAAAA b44=AAAA5555 + +XIEHIT buf=009B1690 1581 0010 0060 60B0 C000 0000 0000 0000 0000 0000 0000 0000 0000 AAAA AAAA 5555 + +XIEHIT buf=009F2710 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009F2710 0881 000C 0000 70AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FB850 id=00000000 class=00 b8=00 b36=4E b40=00000000 b44=00000000 + +XIEHIT buf=009F2710 1481 0023 0070 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009F2710 1381 0088 0070 0000 0000 0040 0000 AAAA AAAA 5555 5555 5555 AAAA AAAA AAAA 5555 + +LOOK a7=003FB850 id=0070AAAA class=01 b36=4E b40=00000000 b44=00000000 + +XIEHIT buf=009F2710 1581 0010 0070 70B0 C000 0000 0000 0000 0000 0000 0000 0000 0000 AAAA AAAA 5555 + +XIEHIT buf=00950F10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0881 000C 0000 50AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FD590 id=00000000 class=00 b8=00 b36=00 b40=00000000 b44=40000000 + +XIEHIT buf=00950F10 1481 0023 0050 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 1381 0088 0050 0000 0000 0040 0000 AAAA AAAA 5555 5555 5555 AAAA AAAA AAAA 5555 + +LOOK a7=003FD590 id=0050AAAA class=01 b36=00 b40=00000000 b44=40000000 + +XIEHIT buf=00950F10 1581 0010 0050 50B0 C000 0000 0000 0000 0000 0000 0000 0000 0000 AAAA AAAA 5555 + +XIEHIT buf=00950F10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0881 000C 0000 50AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FD590 id=00000000 class=00 b8=00 b36=00 b40=00000000 b44=40000000 + +XIEHIT buf=00950F10 1481 0023 0050 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 1381 0088 0050 0000 0000 0040 0000 AAAA AAAA 5555 5555 5555 AAAA AAAA AAAA 5555 + +LOOK a7=003FD590 id=0050AAAA class=01 b36=00 b40=00000000 b44=40000000 + +XIEHIT buf=00950F10 1581 0010 0050 50B0 C000 0000 0000 0000 0000 0000 0000 0000 0000 AAAA AAAA 5555 + +XIEHIT buf=00950F10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0881 000C 0000 70AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FAF50 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00950F10 1481 0023 0070 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 1381 0088 0070 0000 0000 0040 0000 AAAA AAAA 5555 5555 5555 AAAA AAAA AAAA 5555 + +LOOK a7=003FAF50 id=0070AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00950F10 1481 0023 0070 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 1581 0010 0070 70B0 C000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0881 000C 0000 70AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FB610 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00950F10 1481 0023 0070 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 1381 0088 0070 0000 0000 0040 0000 AAAA AAAA 5555 5555 5555 AAAA AAAA AAAA 5555 + +LOOK a7=003FB610 id=0070AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00950F10 1481 0023 0070 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 1581 0010 0070 70B0 C000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009B1690 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009B1690 0881 000C 0000 80AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FCC90 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=009B1690 2B81 000A 0080 80BB 0000 0000 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FAD10 id=00000000 class=00 b8=00 b36=00 b40=00000000 b44=8DA00000 + +XIEHIT buf=009B1690 1881 0004 0080 0000 0000 0000 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009B1690 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009B1690 0881 000C 0000 80AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FBF10 id=00000000 class=00 b8=00 b36=00 b40=00000000 b44=40000000 + +XIEHIT buf=009B1690 2B81 000A 0080 0000 BBBB 0000 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FBCD0 id=00000000 class=00 b8=00 b36=01 b40=00000000 b44=00000000 + +XIEHIT buf=009B1690 1881 0004 0080 0000 0000 0000 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009B1690 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009B1690 0881 000C 0000 80AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FBF10 id=00000000 class=00 b8=00 b36=00 b40=00000000 b44=40000000 + +XIEHIT buf=009B1690 2B81 000A 0080 0000 0000 BBBB 0080 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FBCD0 id=00000000 class=00 b8=00 b36=01 b40=00000000 b44=00000000 + +XIEHIT buf=009B1690 1881 0004 0080 0000 0000 BBBB 0080 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009B1690 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009B1690 0881 000C 0000 80AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FBF10 id=00000000 class=00 b8=00 b36=00 b40=00000000 b44=40000000 + +XIEHIT buf=009B1690 2B81 000A 0080 0000 0000 0000 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FBCD0 id=00000000 class=00 b8=00 b36=01 b40=00000000 b44=00000000 + +XIEHIT buf=009B1690 1881 0004 0080 0000 0000 0000 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009B1690 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009B1690 0881 000C 0000 80AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FBF10 id=00000000 class=00 b8=00 b36=00 b40=00000000 b44=40000000 + +XIEHIT buf=009B1690 2B81 000A 0080 0000 0000 0000 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FBCD0 id=00000000 class=00 b8=00 b36=01 b40=00000000 b44=00000000 + +XIEHIT buf=009B1690 1881 0004 0080 0000 0000 0000 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009B1690 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009B1690 0881 000C 0000 80AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FBF10 id=00000000 class=00 b8=00 b36=00 b40=00000000 b44=40000000 + +XIEHIT buf=009B1690 2B81 000A 0080 0000 0000 0000 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FBCD0 id=00000000 class=00 b8=00 b36=01 b40=00000000 b44=00000000 + +XIEHIT buf=009B1690 1881 0004 0080 0000 0000 0000 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0881 000C 0000 80AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FBF10 id=00000000 class=00 b8=00 b36=00 b40=00000000 b44=40000000 + +XIEHIT buf=00950F10 2B81 000A 0080 0000 0000 0000 0000 0080 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FAF50 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00950F10 1881 0004 0080 0000 0000 0000 0000 0080 0000 0100 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0881 000C 0000 80AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FBF10 id=00000000 class=00 b8=00 b36=00 b40=00000000 b44=40000000 + +XIEHIT buf=00950F10 2B81 000A 0080 0000 0000 0000 0000 0000 80BB 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FAF50 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00950F10 1881 0004 0080 0000 0000 0000 0000 0000 80BB 0100 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0881 000C 0000 80AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FAD10 id=00000000 class=00 b8=00 b36=01 b40=00000000 b44=00000000 + +XIEHIT buf=00950F10 2B81 000A 0080 0000 0000 0000 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FAAD0 id=00000000 class=00 b8=00 b36=01 b40=00000000 b44=00000000 + +XIEHIT buf=00950F10 1881 0004 0000 0000 0000 0000 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 1381 0088 0000 0000 0000 0040 0000 AAAA AAAA 5555 5555 5555 AAAA AAAA AAAA 5555 + +XIEHIT buf=00950F10 1881 0004 0080 0000 0000 0040 0000 AAAA AAAA 5555 5555 5555 AAAA AAAA AAAA 5555 + +XIEHIT buf=00950F10 1381 0088 0080 0000 0000 0040 0000 AAAA AAAA 5555 5555 5555 AAAA AAAA AAAA 5555 + +LOOK a7=003FAD10 id=0080AAAA class=01 b36=00 b40=00000000 b44=40000000 + +XIEHIT buf=00950F10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0881 000C 0000 80AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FAD10 id=00000000 class=00 b8=00 b36=00 b40=00000000 b44=40000000 + +XIEHIT buf=00950F10 1481 0023 0080 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 1381 0088 0080 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FAD10 id=0080AAAA class=01 b36=00 b40=00000000 b44=40000000 + +XIEHIT buf=00950F10 1481 0023 0080 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 1581 0010 0080 80B0 C000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009B1690 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009B1690 0881 000C 0000 90AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FE550 id=00000000 class=00 b8=00 b36=4E b40=00000000 b44=00000000 + +XIEHIT buf=009B1690 1481 0023 0090 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009B1690 1381 0088 0090 0000 0000 0040 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +LOOK a7=003FE550 id=0090AAAA class=01 b36=4E b40=00000000 b44=00000000 + +XIEHIT buf=009B1690 1481 0023 0090 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009B1690 1581 0010 0090 90B0 C000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0881 000C 0000 90AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FD590 id=00000000 class=00 b8=00 b36=00 b40=00000000 b44=40000000 + +XIEHIT buf=00950F10 1481 0023 0090 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 1381 0088 0090 0000 0000 0040 0000 AAAA AAAA 5555 5555 5555 AAAA AAAA AAAA 5555 + +LOOK a7=003FD590 id=0090AAAA class=01 b36=00 b40=00000000 b44=40000000 + +XIEHIT buf=00950F10 1481 0023 0090 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 1581 0010 0090 90B0 C000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0A81 0003 0000 90AA C000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0A81 0003 0000 90AA C000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0A81 0003 0000 90AA C000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0A81 0003 0000 90AA C000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0A81 0003 0000 90AA C000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 2181 0004 0090 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +RES a9=003FBCD0 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00950F10 2881 0004 0090 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +RES a9=003FB610 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00950F10 2C81 0005 0090 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0881 000C 0000 90AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FB3D0 id=00000000 class=00 b8=00 b36=01 b40=00000000 b44=00000000 + +XIEHIT buf=00950F10 1481 0023 0090 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 1381 0088 0090 0000 0000 0040 0000 AAAA AAAA 5555 5555 5555 AAAA AAAA AAAA 5555 + +LOOK a7=003FB3D0 id=0090AAAA class=01 b36=01 b40=00000000 b44=00000000 + +XIEHIT buf=00950F10 1481 0023 0090 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 1581 0010 0090 90B0 C000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0A81 0003 0000 90AA C000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0881 000C 0000 A0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FA890 id=00000000 class=00 b8=00 b36=4E b40=00000000 b44=00000000 + +XIEHIT buf=00950F10 1481 0023 00A0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 1381 0088 00A0 0000 0000 0040 0000 AAAA AAAA 5555 5555 5555 AAAA AAAA AAAA 5555 + +LOOK a7=003FA890 id=00A0AAAA class=01 b36=00 b40=00000000 b44=40000000 + +XIEHIT buf=00950F10 1481 0023 00A0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 1581 0010 00A0 A0B0 C000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0A81 0003 0000 A0AA C000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0A81 0003 0000 A0AA C000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 0881 000C 0000 A0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FB610 id=00000000 class=00 b8=00 b36=B8 b40=00977E10 b44=69E00099 + +XIEHIT buf=00950F10 0781 0004 0000 0000 AAAA 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00950F10 2B81 000A 00A0 0000 0000 0000 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FC150 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00950F10 1381 0088 00A0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FB610 id=00A0AAAA class=02 b36=B8 b40=00977E10 b44=69E00099 + +XIEHIT buf=00950F10 1581 0010 00A0 A0B0 C000 0000 0000 0000 0000 0000 0000 0000 0000 FFFF FFFF FFFF + +XIEHIT buf=009B1690 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009B1690 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FBF10 id=00000000 class=00 b8=00 b36=01 b40=00000000 b44=00000000 + +XIEHIT buf=009B1690 0781 0004 0000 0000 AAAA 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=009B1690 2B81 000A 00B0 0000 0000 0000 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FAAD0 id=00000000 class=00 b8=00 b36=00 b40=00000000 b44=40000000 + +XIEHIT buf=009B1690 1381 0088 00B0 0000 0000 0040 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +LOOK a7=003FBF10 id=00B0AAAA class=02 b36=01 b40=00000000 b44=00000000 + +XIEHIT buf=009B1690 1581 0010 00B0 B0B0 C000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FD350 id=00000000 class=00 b8=00 b36=4E b40=00000000 b44=00000000 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FD350 id=00B0AAAA class=01 b36=4E b40=00000000 b44=00000000 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0101 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FD350 id=00000000 class=00 b8=00 b36=4E b40=00000000 b44=00000000 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FD350 id=00B0AAAA class=01 b36=4E b40=00000000 b44=00000000 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0201 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FD350 id=00000000 class=00 b8=00 b36=4E b40=00000000 b44=00000000 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FD350 id=00B0AAAA class=01 b36=4E b40=00000000 b44=00000000 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0101 0003 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FD350 id=00000000 class=00 b8=00 b36=4E b40=00000000 b44=00000000 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FD350 id=00B0AAAA class=01 b36=4E b40=00000000 b44=00000000 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0201 0003 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FBCD0 id=00000000 class=00 b8=00 b36=01 b40=00000000 b44=00000093 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FBCD0 id=00B0AAAA class=01 b36=01 b40=00000000 b44=00000093 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0101 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FC810 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FC810 id=00B0AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0201 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FC810 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FC810 id=00B0AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0101 0003 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FC810 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FC810 id=00B0AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0201 0003 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FC810 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FC810 id=00B0AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FC810 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FC810 id=00B0AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0202 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FC810 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FC810 id=00B0AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0003 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FC810 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FC810 id=00B0AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0202 0003 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FC810 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FC810 id=00B0AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FC810 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FC810 id=00B0AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0202 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FC810 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FC810 id=00B0AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0003 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FC810 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FC810 id=00B0AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0202 0003 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FC810 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FC810 id=00B0AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0103 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FC810 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FC810 id=00B0AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0203 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FC810 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FC810 id=00B0AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0103 0003 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FC810 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FC810 id=00B0AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0203 0003 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FC810 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FC810 id=00B0AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0103 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FC810 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FC810 id=00B0AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0203 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FC810 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FC810 id=00B0AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0103 0003 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0181 0002 0003 6569 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 0881 000C 0000 B0AA 0040 0040 0000 0000 0000 0100 0000 0000 0000 0000 0000 0000 + +RES a9=003FC810 id=00000000 class=00 b8=00 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0102 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + +XIEHIT buf=00954D10 1381 0088 00B0 0000 0000 0040 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF + +LOOK a7=003FC810 id=00B0AAAA class=01 b36=6E b40=2074736F b44=36312E32 + +XIEHIT buf=00954D10 1481 0023 00B0 0000 0203 0003 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 + diff --git a/xie/evidence/multi_operand_shapes.txt b/xie/evidence/multi_operand_shapes.txt new file mode 100644 index 0000000..fea7699 --- /dev/null +++ b/xie/evidence/multi_operand_shapes.txt @@ -0,0 +1,36 @@ +MULTI-OPERAND SHAPES -- also fail, and always at the same typed-lookup wall. + +Live ids: A=0040C000 B=0040D000 C=0040E000 (all class 2, all queryable). + +A) The third operand of the bind-family calls is an ID, not a flag. + slot 33 [A,B,t] for t=0..9: + t=0 -> BadValue (2) (id 0 is invalid) + t=1..9 -> BadIDChoice (14) with bad = t + i.e. the handler looks t up as a resource id and reports that id as bad. + +B) With three VALID ids the lookup still fails -- because it is typed: + slot33 [A,B,A] -> BadIDChoice bad=0040C000 + slot33 [A,B,B] -> BadIDChoice bad=0040D000 + slot33 [A,B,C] -> BadIDChoice bad=0040E000 + slot33 [A,A,A] -> BadIDChoice bad=0040C000 + (query B still REPLY: the resources themselves are untouched) + + slot40 [A,B,A] -> BadValue bad=0040C000 + slot40 [A,B,B] -> BadValue bad=0040C000 + slot44 [A,B,A,0] / [A,B,B,0] -> BadValue bad=0040C000 + + slot18 [A,B,0] -> BadMatch (8); slot43 [A,B,0...] -> BadValue + +So every multi-operand request fails at a *typed lookup of one of its own +operands*. The operand exists and is queryable, but it does not have the class +the handler asks for, so the lookup rejects it. That is the same wall as +PUT_TILE, reached from four more directions. + +Combined with the single-operand sweep, the whole client-reachable surface -- +every implemented slot, with both one- and multi-operand shapes constructed from +each handler's own length check and operand reads -- fails for the same reason: +the server's resource model needs a resource class that its create path will not +issue with a stored id. + +(src_base stayed 00000000 and no window changed in any of these runs; the +export render params are unchanged from evidence/export_renderparams_map.txt.) diff --git a/xie/evidence/no_dd_worker.txt b/xie/evidence/no_dd_worker.txt new file mode 100644 index 0000000..27b1210 --- /dev/null +++ b/xie/evidence/no_dd_worker.txt @@ -0,0 +1,11 @@ +DD dispatcher breakpoint 0x40086 (file 0x40008 + 0x7E), the CALL A11 to the +device-dependent worker, was armed during create -> arm -> PUT_TILE. + +Result: no DDCALL line. The dispatcher's worker is never called for our +resource. The dispatcher's early type checks (0x40012..0x40034 and +0x4004C..0x4005A) reject before the worker call, or the handoff does not reach +0x7E80008 at all. + +So the tile data is not merely mis-bound at export: it does not reach a DD +element worker during PUT_TILE. The element/type setup that would pass the +dispatcher's checks is the missing piece. diff --git a/xie/evidence/outcell_is_object_byte36.txt b/xie/evidence/outcell_is_object_byte36.txt new file mode 100644 index 0000000..c77a08c --- /dev/null +++ b/xie/evidence/outcell_is_object_byte36.txt @@ -0,0 +1,35 @@ +THE OUT-CELL IS FILLED FROM object->byte36 -- AND THAT FIELD IS NOT INITIALISED +BY CREATE. + +A) SOURCE IDENTIFIED (store at 0x6BAAC, breakpoint at 0x3F55D560): + byte8=1 : obj=0028E050 b36=00290510 STORE src120=00290510 -> out-cell = 00290510 + byte8=3 : obj=003FD7D0 b36=00000000 STORE src120=00000000 -> out-cell = 00000000 + The store's source register A7 IS the object pointer, and it reads + d@(A7+0x120) = u32(obj, byte 36). So out-cell := object->byte36. + +B) BUT byte36 IS NOT SET BY CREATE. Creating with every w9 value in one run: + w9=000000 byte8=0 b36=00000000 + w9=000100 byte8=1 b36=00000000 + w9=000200 byte8=2 b36=00000000 + w9=000300 byte8=3 b36=00000000 + w9=000400 byte8=4 b36=00000000 + w9=000500 byte8=5 b36=00000000 + All zero -- yet an earlier run's w9=0x100 object had b36=00290510. So byte36 + is whatever the heap block contained; it is NOT a field the create path sets. + +C) CONSEQUENCE: whether the import gate at 0x6BAF4 is even REACHED depends on + uninitialised object memory. The "byte8=1 fills the out-cell, byte8=3 does + not" correlation I reported last turn was an artefact of which allocation + happened to carry a non-zero byte36 -- not a property of byte8. + +D) WHAT THIS MEANS FOR THE GOAL: to reach AND pass the gate we need a byte8=3 + object whose byte36 happens to be non-zero. Create does not control byte36, + and a 27-combination sweep of the other create fields (positions 2..10, values + 1/2/3, w9=0x300) produced byte36 != 0 in NO case. + +So the import path depends on an uninitialised field, and the only lever is heap +layout (what the allocator hands back), not any request parameter. That is +consistent with a firmware-side uninitialised-field dependency in this path. + +Status unchanged: no client-chosen XIE image; src_base 0; window still the +stipple; xshow (core X) is the only verified viewer. diff --git a/xie/evidence/outcell_writer.txt b/xie/evidence/outcell_writer.txt new file mode 100644 index 0000000..c67a39d --- /dev/null +++ b/xie/evidence/outcell_writer.txt @@ -0,0 +1,43 @@ +THE OUT-CELL WRITER IDENTIFIED -- and its source is not what it looked like. + +Method: write watchpoint at the out-cell address itself (00415720, stable across +runs), plus the stack positive control (3528 hits, so the watch mechanism is +proven live), under the asserting harness. + +RESULT (byte8=1 resource): + OUTWRITE pc=3F55D590 val=00001D70 <- pc = file 0x6BAB2 + OUTCEL a11=00415720 star=00291D70 + T_GATE a7=00000001 a11=00000003 + S19RET a8=00000008 + +RESULT (byte8=3 resource): + OUTWRITE pc=3F55D590 val=00000000 + OUTCEL a11=00415720 star=00000000 + S19RET a8=0000000A + + (later OUTWRITEs at pc=3FB41C20 and 3F22A300 are unrelated late writes after + the request had already returned.) + +So a SINGLE store fills the out-cell, at file 0x6BAB2 = the store at 0x6BAAC +(`MOVE *A7(0x120),*A11(0x120)`), writing the low word of a pointer (0x1D70) for +byte8=1 and 0 for byte8=3. + +WHAT THE SOURCE IS NOT: + * not object->byte36 -- measured 00000000 for BOTH w9=0x100 and w9=0x300; + * not object->byte44 -- 003DBAF0 for both; + * not the band element pointer. + +WHAT I TRIED TO GET byte8=3 WITH A FILLED OUT-CELL: + swept create payload words 4,5,6,7,8,10 with values 1,2,0x100 alongside + w9=0x300: no combination produced byte8=3 with a non-zero out-cell. + +STATE: the out-cell is filled by `*(A7+0x120)` where A7 descends from the caller +frame, and the source object field was not identified. The two states remain +mutually exclusive in every configuration reachable from this client. + +This is the point where I stop probing. Sixteen-plus turns of request-level +experiments have produced a complete map of the implemented surface, a validated +harness, and a measured statement of the wall -- but not a displayed image. The +one thing that would resolve it is the definition of what is supposed to fill +that out-cell / how byte8 is meant to transition, i.e. the DEC XIE 2.3 headers or +client binary. Further black-box probes return the same two documented errors. diff --git a/xie/evidence/payload_handoff_6b640.txt b/xie/evidence/payload_handoff_6b640.txt new file mode 100644 index 0000000..dee4b37 --- /dev/null +++ b/xie/evidence/payload_handoff_6b640.txt @@ -0,0 +1,30 @@ +Static decode of 0x7EAB640 (file 0x6B640), the payload handoff called by slot 19. + +Key instructions: + + 0x6B64A JR 0x6B834 + 0x6B834 MOVE *A13(0xffe0),A11,1 ; client + 0x6B83A MOVE *A11(0x8),A8,0 ; element selector + 0x6B83E DEC; JEQ 0x6B64E ; type 1 + 0x6B844 SUBK 2; JEQ 0x6B75E ; type 2 + 0x6B848 DEC; JEQ 0x6B7E8 ; type 3 + + type 1: + 0x6B678 MOVE *A13(0xffc0),A11,1 ; band array + 0x6B684 MOVE *A9(0xd8),A9,1 ; band subobject + 0x6B688 JREQ 0x6B84C ; none -> no-op + 0x6B6A0 CALLA 0x7EAC356 + 0x6B6DC MOVE A11,*A13(0x1d0) + 0x6B6EA CALLA 0x7E80008 ; DD input + 0x6B882 MOVE *A9(0x1a8),*A13(0x20) + 0x6B8C2 MOVE *A11(0x28),A11,1 ; band+0x28 payload pointer + 0x6B8D6 MOVE A9,*A11(0x28) ; cleared after the handoff + +So: +- the payload is handed to the band subobject at band+0xd8, +- band+0x28 (byte 5) is the transient payload pointer and is cleared, +- band+0x30 is not used by this function. + +The export still returns the fixed pattern, so the missing piece is the +three-element pipeline definition / export element and its destination, not +the payload handoff itself. diff --git a/xie/evidence/photoflo_chain_no_id.txt b/xie/evidence/photoflo_chain_no_id.txt new file mode 100644 index 0000000..2747f19 --- /dev/null +++ b/xie/evidence/photoflo_chain_no_id.txt @@ -0,0 +1,49 @@ +ANSWERING THE ASSIGNED QUESTION: the class-3 object is NOT reachable through any +client id, because nothing ever registers an id on it. + +1) Registration audit (breakpoints on file 0x67B04 ID-store and 0x67B34 table + register), one connection: + + create op=2 (image) id=0040C000 -> REGIDSTORE obj=003FDA10 (class 2) + create op=1 (photoflo) id=0040D000 -> REGIDSTORE obj=00385890 (class 1) + + arm1 / put / arm2 / slot43 / export / arm1(photoflo) / put(photoflo) + -> 0 registration hits each + + Registration happens ONLY inside create, and only these two objects are ever + given an id. The class-3 object produced by the allocator (file 0x6CA82, + class = 3 when the flag is 0) never appears in a REGIDSTORE. + +2) Walking the photoflo's +0x160 chain the way export does + (0x1B230 MOVE *A5(0x160),A5), from the registered photoflo 0x00385890: + + lvl0 obj 00385890 id@0=0040D000 class=1 w=3692048 h=9948 p44=00386010 + lvl1 obj 00386010 id@0=003859D0 class=80 w=0 h=0x55555555 p44=00386290 + lvl2 obj 00386290 id@0=00386150 class=144 w=0 h=0x55555555 p44=003C7150 + lvl3 obj 003C7150 id@0=003863D0 class=144 w=0 h=1 p44=00000000 + +0x160 -> 00000000 (chain ends) + + Only lvl0 has a resource-like layout. From lvl1 onward the first word is a + POINTER (0x003859D0, 0x00386150, 0x003863D0) and the "class" byte is 0x50 / + 0x90, so these are not resource structs and carry no client id. The chain + therefore does not lead to an addressable class-3 resource; it leads to + internal blocks. + + (Honest caveat: the garbage-looking w/h and rotated-looking pointers at + lvl1+ mean I cannot claim what those blocks ARE -- only that they are not + resource structs and have no id field holding a client id.) + +3) Reachability probes with the two ids we do have: + + query image 0040C000 -> REPLY (addressable) + query photoflo 0040D000 -> BadAccess (registered but not a resource) + + and from the earlier runs: PUT_TILE with the photoflo armed gives + BadAccess(10); with the image armed gives BadMatch(8); with an unregistered + id gives BadIDChoice(14). + +CONCLUSION: there is no client-visible id whose registered object is class 3. +The import's typed lookup wants class 3; the two ids the client can obtain are +registered to class 2 (resource) and class 1 (photoflo). Whatever EXPORT needs +for src_base lives behind an id-less internal object, so it cannot be driven +from the client request surface using any id obtainable through slot 8. diff --git a/xie/evidence/photomap_query_and_corex_control.txt b/xie/evidence/photomap_query_and_corex_control.txt new file mode 100644 index 0000000..043a593 --- /dev/null +++ b/xie/evidence/photomap_query_and_corex_control.txt @@ -0,0 +1,49 @@ +TURN RECORD: THE PHOTOMAP **IS** POPULATED (QueryResource), AND A CORE-X CONTROL +PROVES THE WINDOW IS DISPLAYABLE -- SO THE EXPORT REALLY IS NOT PAINTING. + +A) QueryResource (minor 10) WORKS AND REPORTS THE IMAGE + Request = {resource_type, resource_id} (12 bytes); photomap reply layout from + XieProto.h (width@8, height@12, polarity@24, pixel_prog@25, line_prog@26, + constrained@27, comp_mapping@28, component_count@29, levels[3]@32, photo_id@44). + + after create -> w=64 h=64 polarity=0 pxprog=0 lnprog=0 constrained=1 + comp_map=1 comp_COUNT=1 levels=(1, ...) photo_id=00406600 + after transport -> same, levels=(1,0,0) + after puttile -> same, comp_COUNT=1 + + So the photomap IS populated: 1 component, 64x64, constrained. The tile data + landed. (levels[0] is always 1 and does not change for w4/w5/w6/w7/w8 or for + w9 = 0x100/0x102/0x202/0x201/0x101, so it is not settable through those + words; and w9=0x200+ breaks the transport.) + +B) THAT REMOVES "UNPOPULATED PHOTOMAP" AS THE EXPLANATION FOR src_base == 0 + Full client path still reproduces: + InitSession -> CreatePhoto(w6=1) -> SetTransport(mode=3) -> PutTile = ok + Export(21, w=64 h=64) -> ok/silent, RP(0x1B296) fires, TYPE5 store fires, + src_base (rp+0x610) = 00000000 + Export with w=0,h=0 skips the renderer entirely. + +C) CORE-X CONTROL: THE WINDOW IS VISIBLE, SO THE ABSENCE OF CHANGE IS REAL + On the SAME 64x64 window: + core-X PutImage (opcode 72, depth 1, 64x64 0xFF) -> a visible white block + appears in the framebuffer (dwt/screenshot.py). + So the window is mapped and drawable, and a successful paint IS observable. + Exporting a black photomap onto that same window then produced err9 + (BadDrawable) x3 followed by err1, and the block did not change. + +D) NEW STRUCT FACT THAT CORRECTS AN EARLIER ERROR + xieBindPhotomapReq = { photoflo_id, photomap_id } -- I had been sending + [photomap, photoflo], i.e. the operands reversed. + +STATUS. Still NO client-chosen XIE image. src_base (rp+0x610) 00000000; the +window is unchanged by XIE; solid-white and solid-black captures differ only by +the Terminal Manager's own figures and the cursor; xshow (core X) remains the +only viewer that has displayed an image. + +WHERE THIS LEAVES IT: the import half is complete and verified by QueryResource +(data is in the server), and the display half is the only gap. The renderer is +entered (RP + TYPE5) but reports no source, and exporting onto a window that +demonstrably accepts core-X drawing gives BadDrawable/err1. The next thing to +read is XieExport.3X's error table plus xieQueryExportReq/Reply, and to bind with +the corrected operand order before executing, since the immediate (unbound) path +is the one that yields src_base 0. diff --git a/xie/evidence/pipeline_3_elements.txt b/xie/evidence/pipeline_3_elements.txt new file mode 100644 index 0000000..a6491d7 --- /dev/null +++ b/xie/evidence/pipeline_3_elements.txt @@ -0,0 +1,25 @@ +Three-element pipeline attempt: + +create request: + op=2, id, w=64@12, h=64@16, + levels[0..2]@28/32/36, + byte41 = band count (1 or 3) + +Results: + + bands=3, levels=[2,2,2]: + create=OK + arm1=BadMatch(8) + put=BadAccess(10) + arm2=BadMatch(8) + export=BadMatch(8) + window nz=512 first=8888...2222... + + bands=1, levels=[2,0,0]: + create=OK arm1=OK put=OK arm2(v16=0)=OK export=OK + window nz=512 first=8888...2222... (same for solid-white and solid-black) + +So the 3-band create does not match slot 20's element comparisons, and the +1-band path still exports a data-independent pattern. The element descriptors +that would make the export depend on the tile are not recoverable from the +request fields tried. diff --git a/xie/evidence/png/win_baseline.png b/xie/evidence/png/win_baseline.png new file mode 100644 index 0000000..a176257 Binary files /dev/null and b/xie/evidence/png/win_baseline.png differ diff --git a/xie/evidence/png/win_black.png b/xie/evidence/png/win_black.png new file mode 100644 index 0000000..cb38104 Binary files /dev/null and b/xie/evidence/png/win_black.png differ diff --git a/xie/evidence/png/win_fill_0f.png b/xie/evidence/png/win_fill_0f.png new file mode 100644 index 0000000..16fac38 Binary files /dev/null and b/xie/evidence/png/win_fill_0f.png differ diff --git a/xie/evidence/png/win_fill_aa.png b/xie/evidence/png/win_fill_aa.png new file mode 100644 index 0000000..48694b0 Binary files /dev/null and b/xie/evidence/png/win_fill_aa.png differ diff --git a/xie/evidence/png/win_white.png b/xie/evidence/png/win_white.png new file mode 100644 index 0000000..e60625d Binary files /dev/null and b/xie/evidence/png/win_white.png differ diff --git a/xie/evidence/png/xie_baseline_noexport.png b/xie/evidence/png/xie_baseline_noexport.png new file mode 100644 index 0000000..a1cc332 Binary files /dev/null and b/xie/evidence/png/xie_baseline_noexport.png differ diff --git a/xie/evidence/png/xie_baseline_window.png b/xie/evidence/png/xie_baseline_window.png new file mode 100644 index 0000000..403907f Binary files /dev/null and b/xie/evidence/png/xie_baseline_window.png differ diff --git a/xie/evidence/png/xie_black_fb.png b/xie/evidence/png/xie_black_fb.png new file mode 100644 index 0000000..da7b6dd Binary files /dev/null and b/xie/evidence/png/xie_black_fb.png differ diff --git a/xie/evidence/png/xie_black_real.png b/xie/evidence/png/xie_black_real.png new file mode 100644 index 0000000..be2af03 Binary files /dev/null and b/xie/evidence/png/xie_black_real.png differ diff --git a/xie/evidence/png/xie_black_window.png b/xie/evidence/png/xie_black_window.png new file mode 100644 index 0000000..8182f83 Binary files /dev/null and b/xie/evidence/png/xie_black_window.png differ diff --git a/xie/evidence/png/xie_fill_0f.png b/xie/evidence/png/xie_fill_0f.png new file mode 100644 index 0000000..7795003 Binary files /dev/null and b/xie/evidence/png/xie_fill_0f.png differ diff --git a/xie/evidence/png/xie_fill_0f_window.png b/xie/evidence/png/xie_fill_0f_window.png new file mode 100644 index 0000000..4313ffa Binary files /dev/null and b/xie/evidence/png/xie_fill_0f_window.png differ diff --git a/xie/evidence/png/xie_fill_aa.png b/xie/evidence/png/xie_fill_aa.png new file mode 100644 index 0000000..acb6704 Binary files /dev/null and b/xie/evidence/png/xie_fill_aa.png differ diff --git a/xie/evidence/png/xie_fill_aa_window.png b/xie/evidence/png/xie_fill_aa_window.png new file mode 100644 index 0000000..21edb53 Binary files /dev/null and b/xie/evidence/png/xie_fill_aa_window.png differ diff --git a/xie/evidence/png/xie_white_fb.png b/xie/evidence/png/xie_white_fb.png new file mode 100644 index 0000000..f0bac01 Binary files /dev/null and b/xie/evidence/png/xie_white_fb.png differ diff --git a/xie/evidence/png/xie_white_real.png b/xie/evidence/png/xie_white_real.png new file mode 100644 index 0000000..9e0b2b7 Binary files /dev/null and b/xie/evidence/png/xie_white_real.png differ diff --git a/xie/evidence/png/xie_white_window.png b/xie/evidence/png/xie_white_window.png new file mode 100644 index 0000000..d68f1a3 Binary files /dev/null and b/xie/evidence/png/xie_white_window.png differ diff --git a/xie/evidence/png/xie_window_tiles.png b/xie/evidence/png/xie_window_tiles.png new file mode 100644 index 0000000..ef8338c Binary files /dev/null and b/xie/evidence/png/xie_window_tiles.png differ diff --git a/xie/evidence/protocol_model_corrected.txt b/xie/evidence/protocol_model_corrected.txt new file mode 100644 index 0000000..d9e4e53 --- /dev/null +++ b/xie/evidence/protocol_model_corrected.txt @@ -0,0 +1,48 @@ +THE REPLY MODEL WAS WRONG. This is the most consequential correction of the +session and it explains the ERR8/ERR10/ERR14 inconsistencies and several +retractions. + +1) SUCCESSFUL create AND arm SEND NO PACKET AT ALL. + Measured with a strict one-request-per-read probe on valid ids: + create -> (no packet) and the resource really is created + arm -> (no packet) when it succeeds + put -> BadMatch packet when it fails + Only ERRORS produce a packet. So "no-reply" in earlier runs meant SUCCESS, + not a lost reply, and my reader was silently consuming nothing. + +2) HARDCODED IDS ARE INVALID. The client id base differs per connection + (0x004xxxxx, 0x005xxxxx, 0x006xxxxx were all observed). Every request using + a literal id such as 0x0047xxxx or 0x0048xxxx was rejected: + create id=0x00470001 -> BadIDChoice + create id=0x00470002 -> BadIDChoice + create id=0x00470100 -> BadIDChoice + create id=0x00480002 -> BadIDChoice (also has bit 19 set) + while c.new_id(...) works. Consequences: many sequences in earlier turns + created NOTHING and then "measured" arm/put against a non-existent resource; + the ERR14 results and several contradictions come from this. + +3) ERROR PACKET LAYOUT (from a raw hexdump, no parsing assumptions): + type=0 | error_code | sequence | bad_value | minor | major=0x81 + e.g. 00 0e 03 00 | 02 10 47 00 | 08 00 81 00 -> code 14, minor 8 (create) + So the error vocabulary in the tooling was correct; the ATTRIBUTION was not, + because with several requests outstanding the first packet read may belong to + an earlier request. + +RE-VERIFIED WITH THE CORRECT MODEL (valid ids, one request per read): + + w9=0x100 (byte8=1): create silent OK, arm silent OK, put = BadMatch + w9=0x300 (byte8=3): create silent OK, arm = BadMatch, put = BadMatch + +and on the arm path the shared lookup still SUCCEEDS in both cases: + + w9=0x100 : H_STORE -> K -> L(a7=FFFFFFFF) -> N(jrlt) -> P_6BBE2_SUCCESS + w9=0x300 : H_STORE -> K -> L(a7=FFFFFFFF) -> N(jrlt) -> P_6BBE2_SUCCESS + +So for arm the lookup returns 0 in both cases and the BadMatch with byte8=3 is +produced later, in slot 20's body. Instrumenting slot 20's four MOVK 0x8 sites +(0x6ABD2, 0x6AC5C, 0x6AC96, 0x6ACD4) with valid ids: NONE of them fires. + +NEXT: find the callee in slot 20's post-lookup body that returns 8 -- candidates +are the DD dispatcher 0x7E80008 and the per-element helpers -- now that valid ids +and the no-reply model are in place. Every earlier measurement that used a +literal id must be considered void until re-run. diff --git a/xie/evidence/put_tile_succeeds.txt b/xie/evidence/put_tile_succeeds.txt new file mode 100644 index 0000000..3df40c0 --- /dev/null +++ b/xie/evidence/put_tile_succeeds.txt @@ -0,0 +1,41 @@ +PUT_TILE SUCCEEDS -- FIRST TIME IN THIS INVESTIGATION. + +The gate operand chain is now fully decoded: + + 0x6BAEA A11 = *(caller frame slot) -> A11 = the out-cell's ADDRESS + 0x6BAEC SETF 8 -> 8-bit field + 0x6BAF2 A7 = *A7 -> ** A7 := *(object->byte36) ** (deref!) + 0x6BAF4 CMP A7,A11 (A11 = 3) -> requires the BYTE AT (byte36) == 3 + +Measured: + SCRATCH=0x00010100 ; poke *SCRATCH = 0 and 3 ; poke object->byte36 = SCRATCH + + *scratch = 0 : F2 a7=00010100 star7=00000000 ; GATE a7=0 a11=3 ; PUT_TILE ERROR 8 + *scratch = 3 : F2 a7=00010100 star7=00000003 ; GATE a7=3 a11=3 ; PUT_TILE SILENT(ok) + +So when the byte pointed to by object->byte36 equals 3, the gate compares 3 with 3, +passes, and the import request returns success (A8=0, no error packet). + +FULL CHAIN ATTEMPT (both tiles, debug pokes labelled): + + white: create w9=0x300 -> arm1 ERROR 8 -> PUT_TILE SILENT(ok) -> arm2 ERROR 8 -> EXPORT ERROR 8 + black: create w9=0x300 -> arm1 ERROR 8 -> PUT_TILE SILENT(ok) -> arm2 ERROR 8 -> EXPORT ERROR 8 + +So: + * the IMPORT now works, + * arm (slot 20) still fails on a byte8=3 resource (its own check at 0x6ACBE), + * EXPORT consequently fails, RP never fires, src_base cannot be read. + +IMPORTANT CAVEAT: the successful import depended on two DEBUG-ONLY pokes +(object->byte36 and the byte it points at). Nothing here shows a client request +can produce that state. It proves the mechanism, not reachability. + +WHERE THIS LEADS: exactly the same structure almost certainly applies to arm's +check at 0x6ACBE (`A7 = *A11(0x40),0` then DSJS), which I previously read as +"requires byte8 == 1". Given that the import gate turned out to be a DEREFERENCED +byte rather than byte8 itself, arm's check should be re-read the same way before +concluding it needs byte8==1. + +Status: PUT_TILE success achieved (debug-poked state); no image yet; src_base +still unread because export fails; xshow remains the only viewer that has shown +an image. diff --git a/xie/evidence/raw_packet_parse_and_partial_create.txt b/xie/evidence/raw_packet_parse_and_partial_create.txt new file mode 100644 index 0000000..4f17833 --- /dev/null +++ b/xie/evidence/raw_packet_parse_and_partial_create.txt @@ -0,0 +1,45 @@ +RAW SOCKET DUMP -- the reply parser is correct, but a CREATE CAN FAIL *AFTER* +it has already allocated and registered the object. That invalidates a large +class of earlier measurements. + +Method: one connection, then send raw requests and hexdump whatever comes back +(no parsing assumptions). + + create (minor 8, 12 words): + 00 0e 03 00 | 02 10 47 00 | 08 00 81 00 | 20 00 00 00 | e0 56 41 00 ... + arm (minor 20, 35 words): + 00 0e 04 00 | 02 10 47 00 | 14 00 81 00 | 00 00 00 00 | 20 00 00 00 ... + put (minor 19, 23 words): + 00 0e 05 00 | 02 10 47 00 | 13 00 81 00 | 40 57 41 00 | 30 22 29 00 ... + +Decoding as an X11 Error packet (type, error_code, sequence, bad_value, +minor_code, major_code): + create: type=0 code=0x0e (14 BadIDChoice) seq=3 bad=0x00471002 minor=0x0008 major=0x0081 + arm : type=0 code=0x0e (14 BadIDChoice) seq=4 bad=0x00471002 minor=0x0014 major=0x0081 + put : type=0 code=0x0e (14 BadIDChoice) seq=5 bad=0x00471002 minor=0x0013 major=0x0081 + +So the parser's error vocabulary is CORRECT (byte 1 is the error code; bytes 8-9 +are the minor; byte 10 is 0x81 = the XIE extension opcode). That part of the +tooling is sound. + +BUT: in this very same run the REGIDSTORE breakpoint (file 0x67B04, the ID-store +inside create) fired -- i.e. the server DID allocate an object and register it +under id 0x00471002 -- and the create request still returned BadIDChoice(14), +with bad_value = that same id. + +That means create can fail LATE: the resource is allocated/registered first and a +subsequent validation rejects the request. Consequences for earlier work: + + * Any sequence where "create = no-reply" was recorded (the reply was very often + not read back) must be treated as UNKNOWN, and may in fact have been this + late BadIDChoice. + * Measurements that attributed an error to arm or put may instead be reporting a + resource whose create had failed -- the arm/put then correctly answer + BadIDChoice because the id is not usable, even though an object exists. + * This is the most likely root of the ERR8 / ERR10 / ERR14 inconsistency across + runs that caused several retractions. + +NEXT REQUIRED FIX before any further conclusions: read EVERY reply and assert it +is a success before proceeding (fail the step otherwise). The earlier +"create=no-reply" lines must be re-run with reply checking; only sequences whose +create, arm and put all report success are usable evidence. diff --git a/xie/evidence/registration_hits_corrected.txt b/xie/evidence/registration_hits_corrected.txt new file mode 100644 index 0000000..354bd82 --- /dev/null +++ b/xie/evidence/registration_hits_corrected.txt @@ -0,0 +1,55 @@ +CORRECTION to evidence/class3_registration_impossible.txt. + +That file claimed op=1 never reaches the registering body and that class and +registration are "mutually exclusive". THAT IS WRONG. Breakpoints on the two +registration sites show op=1 DOES register: + + bpset 0x3F53D820 (file 0x67B04 MOVE *A9(0x40),*A11(0x0)) ID store + bpset 0x3F53D9A0 (file 0x67B34 CALLA 0x07F16CA2) table register + +Hits per request (one connection, real sequence): + + create op=2 0040D000 -> REGIDSTORE id=0040D000 obj=003FDC50 ; REGISTER + create op=1 0040C000 -> REGIDSTORE id=0040C000 obj=0036A950 ; REGISTER + arm1 / put / arm2 / slot43 / export / arm1(C1) / put(C1) -> 0 hits each + +So the registration sites are reached ONLY by create, and BOTH opcodes reach +them. What differs is WHICH object gets registered -- measured by peeking the +pointer each REGIDSTORE reports: + + op=2 id=0040C002 -> obj 003FD7D0 + id@0=0040C002 class=2 w=64 h=64 b8=01 b9=01 b40=00000000 + slot24 query -> REPLY (addressable) + + op=1 id=0040C001 -> obj 0032F210 + id@0=0040C001 class=1 w=3259088 h=1 b8=90 b9=AF b40=00790352 + slot24 query -> BadAccess (10) (registered, but not a drawable + resource -- the fields are not a + resource layout) + +So: + * op=2 registers a class-2 RESOURCE, correctly laid out, addressable. + * op=1 registers a class-1 PHOTOflo under the client's id. Its w/h are not a + geometry, and query returns BadAccess because the found object is not a + resource of the requested kind. + * The class-3 object measured earlier (e.g. 0x3FD110, class 3, id@0 = 0) is an + INTERMEDIATE that is never the registered object. + +Therefore the accurate statement is NOT "class 3 is never registered" but: + + the id is registered to a class-1 photoflo (op=1) or to a class-2 resource + (op=2); no create opcode registers a class-3 object. + +Separating photoflo from image was then tested across five configurations +(I = op=2 image id, F = op=1 photoflo id), each with a 64x64 window and the +export render-params breakpoint still armed: + + armF putI expF white : arm1 OK put BadAccess(10) arm2 OK exp OK src_base=00000000 chg=False + armF putI expF black : arm1 OK put BadAccess(10) arm2 OK exp OK src_base=00000000 chg=False + armF putF expF white : arm1 OK put BadIDChoice(14) exp OK src_base=00000000 chg=False + armI putI expF white : arm1 OK put BadMatch(8) exp OK src_base=00000000 chg=False + armF putI expI white : arm1 OK put BadAccess(10) exp OK src_base=00000000 chg=False + +Arming the photoflo changes the import error from BadMatch (8) to BadAccess +(10) -- a distinct state, and the only new behaviour found -- but src_base +stays 0 and no window changed in any configuration. diff --git a/xie/evidence/render_driver_callers.txt b/xie/evidence/render_driver_callers.txt new file mode 100644 index 0000000..9fac49a --- /dev/null +++ b/xie/evidence/render_driver_callers.txt @@ -0,0 +1,43 @@ +RENDER-DRIVER CALLER MAP, and why no element type is ever written. + +My earlier ROM scans were wrong: CALLA stores the BIT address, not the file +offset (the decode of the slot-21 call site at file 0x63098 is + 5f 0d 90 8a 2d 3f -> CALLA 0x3F2D8A90 = file 0x1B152 +which is the form Ghidra mis-prints as "0x07e5b152"). Scanning for bit +addresses instead of file numbers yields the real caller list. + +EVERY reference into the render-driver region targets the ENTRY 0x1B152: + + caller file 06309A -> 0x1B152 (slot 21 = EXPORT) + caller file 065186 -> 0x1B152 (slot 33 body) + caller file 065550 -> 0x1B152 (slot 40 body) + caller file 065BFA -> 0x1B152 (slot 43) + caller file 065F54 -> 0x1B152 (slot 44) + +No reference anywhere targets the per-element blocks (0x1B29A / 0x1B342 / +0x1B46A-entry / 0x1B4F4-entry / 0x1B582-entry). Those are therefore reachable +ONLY by control flow inside 0x1B152 itself. + +Element-type stores, one per type, all the same instruction shape: + 0x1B2B8/0x1B2BA MOVK 0x1,A11 ; MOVB *A11,*A5(0x58) type 1 + 0x1B360/0x1B362 MOVK 0x2,A11 ; MOVB *A11,*A5(0x58) type 2 + 0x1B46A/0x1B46C MOVK 0x3,A11 ; MOVB *A11,*A5(0x58) type 3 + 0x1B4F4/0x1B4F6 MOVK 0x4,A11 ; MOVB *A11,*A5(0x58) type 4 + 0x1B582/0x1B584 MOVK 0x5,A11 ; MOVB *A11,*A5(0x58) type 5 + +CONSEQUENCE (structural): the CLIENT does not select an element type by calling +these blocks -- there is no such call. The type is chosen inside 0x1B152 from +whatever pipeline/band data it is given. Since our band element record is +uninitialised (word1 = 0x00000055 heap fill) and no TYPE store ever fires, the +server finds no elements to add: the pipeline is empty because the band +descriptor is empty, not because an element request is missing. + +Five requests can drive the renderer: slots 21, 33, 40, 43, 44. Slots 33/40/44 +are the bind-family handlers that call both the resource lookup (0x7EA6FA0) and +the bind helper (0x7EA72A4); their operand requirements are what I have not been +able to satisfy (they reject with BadValue/BadIDChoice before reaching the +renderer). + +NET: the missing capability is still the 2.3 encoding of the pipeline/band +descriptor that these five requests carry. The call-graph is now fully mapped, +which is real structure, but it does not by itself yield a working request. diff --git a/xie/evidence/render_driver_returns_2.txt b/xie/evidence/render_driver_returns_2.txt new file mode 100644 index 0000000..256b748 --- /dev/null +++ b/xie/evidence/render_driver_returns_2.txt @@ -0,0 +1,42 @@ +THE RENDER DRIVER ITSELF RETURNS 2 TO SLOT 43. + +Instrumented tail of slot 43 with a live class-2 resource (9 breakpoints, +generated addresses, valid ids, isolated connection, create drained first): + + T_LOOKUP_OK 0x65646 lookup returned 0 + T_RENDER_RET 0x65BFE a8 = 00000002 <-- the driver returned 2 + T_JREQ 0x65C02 (non-zero path) + T_FREE 0x65C06 + (T_MERGE 0x65C46 did not fire) + +So slot 43 calls 0x07E5B152 (= file 0x1B152, the render/export driver) and that +call returns 2. The client then receives BadValue(2) -- and neither of slot 43's +own MOVK 0x2 sites (0x658C0, 0x6598C) is involved. + +Inside 0x1B152 the first 240 instructions contain only ONE `MOVK 0x2`, at +0x1B360, and its context shows it is NOT an error return: + + 1B358 MOVE *A7(0x50),A5,0 ; element index + 1B35C SLL 0x3,A5 + 1B35E ADD A7,A5 + 1B360 MOVK 0x2,A11 + 1B362 MOVB *A11,*A5(0x58) ; element type := 2 (not an error code) + +so the returned 2 comes from some other exit of 0x1B152 that was not identified. + +HONEST CAVEAT -- instrumentation inconsistency observed again: after T_FREE +(0x65C06) the code at 0x65C0C calls a free and then FALLS THROUGH to 0x65C46, +yet the breakpoint at 0x65C46 did not fire. Either that breakpoint was dropped +(despite only 9 being armed) or the free call does not return normally. I did +not resolve which, so the tail path after 0x65C06 is NOT fully established. + +WHAT IS ESTABLISHED THIS TURN + * slot 43 reaches the render driver 0x1B152 (already known) and + * the driver returns 2 to it (NEW), which is what the client sees as BadValue. + * The failure is therefore inside the render driver, not in slot 43's own checks, + not in the import lookup, and not in the byte8 gate. + +NEXT: find 0x1B152's exit points and which returns 2 -- i.e. trace A8 at every +`MOVE ...A8` / final epilogue of 0x1B152 (0x1B81A..0x1BBC0 region holds most of +them), since an accepted slot 43 would drive the render path directly and bypass +the byte8 gate entirely. diff --git a/xie/evidence/render_driver_tail_scan.txt b/xie/evidence/render_driver_tail_scan.txt new file mode 100644 index 0000000..9c05929 --- /dev/null +++ b/xie/evidence/render_driver_tail_scan.txt @@ -0,0 +1,38 @@ +TURN RECORD: SCAN OF THE RENDER DRIVER AFTER 0x1B296. + +Static scan of 0x1B296..0x1B6E0 for everything that could yield the A8=2 the +export handler returns: + + 0x1B360 MOVK 0x2,A11 ; 0x1B362 MOVB *A11,*A5(0x58) + -- this is the ELEMENT-TYPE store (type 2), NOT an error. It writes + the element type into the render-params block; I had earlier + chased this as a possible BadValue and it is not one. + + 0x1B3C4..0x1B43E the render worker's helper calls + CALLA 0x07FC229C (x5), 0x07FC1EB2 (x2), 0x07FC1F5E (x2), 0x07FC2210 (x2) + -- the actual per-element processing; these return codes are the + remaining candidates for A8=2. + + 0x1B5FA..0x1B67A drawable-bind path: returns MOVK 0x18 and then MOVK 0x9 + (BadDrawable), NOT 2. + 0x1B68C..0x1B6E2 gc-bind path: returns MOVK 0xd (BadGC), NOT 2. + 0x1B612 / 0x1B6A0 CALLA 0x07F174A4 (bind helper) + 0x1B672 CALLA 0x07EFFA5E (send-error helper) + +So there is NO `MOVK 0x2` that sets A8 anywhere in the scanned range: the A8=2 +observed at AFTER_RD (0x6309E) is a value RETURNED by one of the 0x7FC2xxx +helpers and propagated out of the driver unchanged. + +MEASURED (unchanged, reproducible): + import: element+0x28 -> 0xFF (white) / 0x00 (black), QueryResource comp_COUNT=1 + export: all handler checks pass, context alloc OK (ret=00321C50), + render driver called at 0x63098, returns a8=2, handler returns it + window: 64x64, depth 1, provably drawable (core-X PutImage control) + framebuffer: white vs black byte-identical (AE = 0) + +STATUS. NO client-chosen XIE image. xshow (core X) remains the only viewer +that has displayed an image. + +WHERE IT IS NOW: the last unidentified return is inside the 0x7FC2xxx helper +family invoked between 0x1B3C4 and 0x1B43E. That is the only place left that +can produce the 2. diff --git a/xie/evidence/residual_items_tested.txt b/xie/evidence/residual_items_tested.txt new file mode 100644 index 0000000..c558fd6 --- /dev/null +++ b/xie/evidence/residual_items_tested.txt @@ -0,0 +1,46 @@ +ALL THREE RESIDUAL ITEMS TESTED. None provides the byte8 transition or an +alternate import path. + +A) STATIC SEARCH for internal writers of a resource's byte-8 field + (pattern: store whose destination is *A?(0x40), across every disassembled XIE + handler): + + slot01 0x68D04 MOVE A5,*A7(0x40) (A7 = frame/temp, not resource) + slot03 0x3FDBC MOVE *A5(0x0),*A13(0x40) (frame local) + slot05 0x68EAA MOVE *A5(0x40),*A7(0x40) (block -> block copy) + slot11 0x667F2 / 0x66816 (frame local) + slot14 0x66C74 (frame local) + slot19 0x6A88C / 0x6AA20 (frame local) + slot20 0x6AC00 MOVE A7,*A11(0x40),0x1 <-- the only real candidate + slot20 0x6ADB4 MOVE *A9(0x80),*A5(0x40) (params block, not resource) + slot21 0x6302A / slot22 0x6313C / slot24 0x631DE (frame locals) + + The one candidate, 0x6ABF6..0x6AC00 in slot 20: + 6ABF6 MOVE *A11(0x40),A7,1 ; 16-bit field at byte 8 + 6ABFA MOVE *A9(0x80),A5,1 ; request payload byte 16 + 6ABFE OR A5,A7 + 6AC00 MOVE A7,*A11(0x40),1 ; ORs the request into byte8/byte9 + is DEAD CODE as written: it is reached only if `*A13(0x40) != 0` (0x6AB82 + MOVE *A13(0x40),A11 ; JREQ 0x6AC34), and `*A13(0x40)` is only ever ASSIGNED + later, at 0x6AD92 (`MOVE *A11(0x120),*A13(0x40)`), from a freshly allocated + params block. The read at 0x6AB82 therefore always sees 0 and takes the + JREQ. Measured fired-path confirms it: every arm goes + 0x6AB82 -> 0x6AC34 and never enters 0x6AB88..0x6AC00. + +B) RUNTIME WATCH on a w9=0x300 resource (byte8=3), four arm attempts + (v12,v14) = (2,1) (3,3) (2,2) (1,1), all BadMatch: + + byte8 WRITE EVENTS: 0 + + So even on the resource type the import wants, no arm attempt writes byte8. + +C) UNIMPLEMENTED MINORS as an alternate import path. All 21 unassigned minors + (16,17,23,25..32,34..39,41,42,45,46) probed at lengths 2,3,4,6,8,12 with a + live resource id: 126 requests, EVERY ONE returned err1 (BadRequest). + No alternate import path exists among them. + +RESULT: the static search finds no executing internal writer, the runtime watch +finds no writer at all, and the minor space offers no alternative. The byte8 +transition into the importable state is therefore unreachable from the client, +and there is no second import entry point. src_base stays 0 and EXPORT has +nothing to draw. diff --git a/xie/evidence/resource_scan_fail.txt b/xie/evidence/resource_scan_fail.txt new file mode 100644 index 0000000..92220f6 --- /dev/null +++ b/xie/evidence/resource_scan_fail.txt @@ -0,0 +1,15 @@ +Live-resource scan attempts: + + 0x60000..0x180000, filter ID + +36/+44 non-zero: + hits 0x7FB8A and 0x7FAB2, but byte4 (class) = 0 + -> these are copies/table entries, not the resource + + 0x3E0000..0x400000, filter ID + class2 + width=64 + height=64 + +36/+44: + no match + +The live resource pointer is not stable across runs and the field-filtered +scan does not find it reliably. The earlier known address (0x3FDC50) was a +heap allocation from a previous run; it is not present in this run. + +Consequently the class-byte patch test could not be applied to the real +resource, and the real PUT_TILE still returns BadMatch (S19LOOK a8=8). diff --git a/xie/evidence/rp48_is_set_and_block_is_shared.txt b/xie/evidence/rp48_is_set_and_block_is_shared.txt new file mode 100644 index 0000000..b9bc0b8 --- /dev/null +++ b/xie/evidence/rp48_is_set_and_block_is_shared.txt @@ -0,0 +1,29 @@ +TURN RECORD: THE rp+0x48 TEST PASSES; 0x1BA30 IS A SHARED REPORT BLOCK REACHED BY +AN UNCONDITIONAL JUMP, AND IT REPORTS WHATEVER CODE WAS ALREADY IN FRAME 0x120. + +MEASURED (both id low-bytes, with instrumentation on the branch itself): + MAP=00400B00 J884 rp=009261D0 b9=01 -> CONT_1B888 ... ERRCHAIN_1BA30 RET a8=2 + MAP=00400B01 J884 rp=00926910 b9=01 -> CONT_1B888 ... ERRCHAIN_1BA30 RET a8=2 + +So: + * rp byte 9 is ALREADY 1 in both cases -- the 0x1B884 JREQ 0x1BA30 is NOT taken; + the earlier "flag is zero" reading was wrong. + * 0x1BA30 is nevertheless reached, from 0x1B9F2 `JR 0x0001BA30` -- an + UNCONDITIONAL jump that is the normal continuation after + `CALLA 0x07E5BBCA` returns 0. + * 0x1BA30 is therefore not an error branch but a shared epilogue that: + 0x1BA30 CALLA 0x07F67F38 -> @0xa5e60 + 0x1BA44 CALLA 0x07E75EA8 (called with 0xa6000 -- frees/marks the rp) + 0x1BA60 CALLA 0x07EA45FE + 0x1BA68 MOVK 0x2,A11 ; ... ; 0x1BA78 CALLA 0x07E7FE96 + i.e. it REPORTS THE CODE ALREADY HELD IN FRAME SLOT *A13(0x120), which is 2. + +CONCLUSION: the 2 is decided earlier in the driver and merely reported here. +The chain to chase is whatever stores 2 into *A13(0x120) before 0x1B9F2. + +STATE (unchanged): + import verified (element+0x28 = 0xFF white / 0x00 black, comp_COUNT=1) + export: err2 in every configuration; window never changes + viewer: xshow (core X) is the only thing that has displayed an image + +STATUS. NO client-chosen XIE image. diff --git a/xie/evidence/rp48_low_byte_tested.txt b/xie/evidence/rp48_low_byte_tested.txt new file mode 100644 index 0000000..b04322b --- /dev/null +++ b/xie/evidence/rp48_low_byte_tested.txt @@ -0,0 +1,31 @@ +TURN RECORD: THE ERROR CHAIN IS ENTERED AT 0x1BA30 BECAUSE rp+0x48 TESTS ZERO. +HYPOTHESIS (LOW BYTE OF THE ID) TESTED AND REJECTED. + +Trace of the composition path: + r9F2 a8=00000000 ; the call at 0x1B9EC returns 0 + ERRCHAIN_1BA30 ; <-- 0x1B884 JREQ 0x1BA30 taken (rp+0x48 == 0) + ERR_1BAA6 / ERR_1BAC6 / ERR_1BB96 + DRIVER_RET a8=00000002 ; the chain reports 2 (0x1BA68 MOVK 0x2,A11) + +The tests: + 0x1B878 A5 = @0xa6000 + 0x1B87E MOVE *A5(0x48),A11,0x0 ; NOTE: SETF 8 -- an 8-BIT read of byte 9 + 0x1B884 JREQ 0x1BA30 ; zero -> the BadValue error chain +and the caller had stored a 32-bit value there: + 0x63080 MOVE *A9(0x20),*A8(0x48) ; rp+0x48 <- request w0 = photo_id +So an 8-bit test against the low byte of the photomap id looked plausible. + +TESTED: created the photomap with an id whose low byte is non-zero + MAP = 00400B01 (previously 00400B00) + full sequence: CreatePhoto(w6=1) -> SetTransport(mode=3, org=1) -> PutTile + -> Export(21) + RESULT: export = err2,err2 ; white vs black framebuffer AE = 0 +So the low-byte theory is WRONG: the id's low byte is not what that flag reads, +or rp is a table entry (0xa6000 + index*32) whose 0x48 field is set elsewhere. + +STATE (unchanged and reproducible) + import: element+0x28 = 0xFF white / 0x00 black ; QueryResource comp_COUNT=1 + export: err2 in every configuration tried; window never changes + viewer: xshow (core X) is the only thing that has displayed an image + +STATUS. NO client-chosen XIE image. diff --git a/xie/evidence/s19_lookup_retrace.txt b/xie/evidence/s19_lookup_retrace.txt new file mode 100644 index 0000000..7e5a0eb --- /dev/null +++ b/xie/evidence/s19_lookup_retrace.txt @@ -0,0 +1,47 @@ +SLOT-19 LOOKUP RE-TRACED WITH ASSERTING HARNESS -- and it produces an +INTERNALLY INCONSISTENT result that I could not resolve. + +REPRODUCIBLE TOP-LEVEL FACTS (two trials, identical): + create -> SILENT(ok); arm1 -> SILENT(ok); PUT_TILE -> ERROR 8 (BadMatch) + +TRACE (trial 1 and trial 2 identical): + S19CALL 0x6A7AE slot 19 calls 0x7EAB966 (file 0x6B966) + CALLEE_ENTRY 0x6B966 callee entered + CALLEE_DISP 0x6BA8C class dispatch reached (class 2) + CALLEE_C2 0x6BA1E class-2/3 branch entered + S19RET 0x6A7B4 a8 = 00000008 + +So the callee IS entered, DOES reach the class dispatch and the class-2/3 branch, +and returns 8. + +THE CONTRADICTION: + A full scan of 0x6B966 (330 instructions) finds exactly THREE sites that set 8: + 0x6BAFA MOVK 0x8,A7 (fall-through of the JREQ at 0x6BAF6) + 0x6BB4C MOVK 0x8,A11 + 0x6BB88 MOVK 0x8,A7 + Instrumented with breakpoints at the corresponding points (0x6BAF4 the CMP + before the first, 0x6BB4A, 0x6BB86) in this run: + SEL_DISP 0x6BBCE -> 0 hits + MASK_A_8 0x6BB4A -> 0 hits + MASK_B_8 0x6BB86 -> 0 hits + ERR_0A 0x6BAC4 -> 0 hits + OK_PATH 0x6BBE2 -> 0 hits + and in the previous run the gate CMP 0x6BAF4 also had 0 hits. + + So the function returns 8 without executing ANY of the three 8-producing sites, + and without reaching the selector dispatch, the 0xA site, or the success exit. + Every transition I can see between 0x6BA1E and the exits is accounted for, and + none of them yields 8. + +WHAT I AM NOT GOING TO DO: pick one of those sites and assert it is the source. +The measurement says they do not run. + +Conclusion: the same class of instrumented-vs-observed contradiction that has +recurred through this session is present here, and I have not found its cause +(candidates: dropped breakpoints in this MAME build, or the return value being +delivered by a path outside 0x6B966). Until that is understood, the origin of +PUT_TILE's BadMatch(8) is NOT established, and the byte8/gate model remains +withdrawn. + +Status unchanged: no client-chosen XIE image; window still the stipple; +xshow (core X) is the only verified viewer. diff --git a/xie/evidence/setopdefaults_and_export_ctx.txt b/xie/evidence/setopdefaults_and_export_ctx.txt new file mode 100644 index 0000000..28149d7 --- /dev/null +++ b/xie/evidence/setopdefaults_and_export_ctx.txt @@ -0,0 +1,37 @@ +CONFORMING ATTEMPT (SET_OP_DEFAULTS bits/pixel=1) + export-context read. + +1) SET_OP_DEFAULTS located: slot 3, length must be EXACTLY 2 words + (3 words -> BadLength 16). Its payload is one word, so the value is carried + directly rather than as selector+value: + slot 3, 2 words, payload = 1 -> SILENT (accepted) + Slots 3/4 are the set/get pair of client-attribute (op-defaults) requests. + +2) Full documented-ish sequence with that issued first: + SET_OP_DEFAULTS(1) + create op=2 bitonal (w9=0x100 -> byte8=1, i.e. bits/pixel 1) + arm1 / PUT_TILE / arm2 / EXPORT + QUERY_EXPORT (minor 10, op 3) -> reply + XCopyArea( -> window, gc) -> BadDrawable every time + GetImage(window) -> 88888888888888882222222222222222 (stipple, unchanged) + solid-white and solid-black readbacks IDENTICAL + +3) THE QUERY_EXPORT REPLY DOES NOT CARRY A PIXMAP XID. Read via rdebug: + head words : 00000040 00000040 03FD0100 80000000 01000000 00310101 + (64,64 = w,h; then three pointer-like values) + extra words: 00000002 00000000 0031BAD0 00401000 (00401000 = resource id) + + Reading the last head field (00310101) as an address yields IMAGE DATA: + 00310101: AAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA 00A02AAA 80280000 AAAA8018 + and 03FD0100 / 80000000 read as zero-filled blocks, 01000000 contains 0x800000. + + So the field I was feeding to XCopyArea is a POINTER INTO IMAGE/HEAP DATA, not + an XID. That is why every CopyArea attempt returned BadDrawable: there is no + client-visible pixmap id in this reply at all. + +CONCLUSION: issuing SET_OP_DEFAULTS(bpp=1) does not change the outcome, and the +export context does not expose the server pixmap as an XID. The window still +never changes and white/black are identical. If the exported pixmap is to be +used at all it must be reachable some other way -- the manual's XCopyArea advice +assumes a pixmap id the server never returns here, so either the id is delivered +by an event (XIEP_SELECT_EVENTS / QUERY_EVENTS are listed in Table C-1 and were +never exercised) or export is meant to target the drawable directly. diff --git a/xie/evidence/slot11_bind_and_second_allocator.txt b/xie/evidence/slot11_bind_and_second_allocator.txt new file mode 100644 index 0000000..c11f930 --- /dev/null +++ b/xie/evidence/slot11_bind_and_second_allocator.txt @@ -0,0 +1,49 @@ +TWO ROUTES TESTED: slot 11 as a class-3 bind, and a second allocator for the +op-1 object. Both negative, with reasons. + +1) SLOT 11 as bind. slot 11 requires exactly 3 words = 2 payload ids. + (0x667CE SUBK 0x3 ; JREQ). It performs TWO lookups (0x667EC and 0x66810, + both CALLA 0x7EA6FA0) before calling the bind helper. + + Earlier attempts used a fresh id as the second operand, which was invalid. + This run used TWO EXISTING class-2 resources: + + A=0040C000 id=0040C000 class=2 w=64 h=64 b36=00000000 b40=00000000 + B=0040D000 id=0040D000 class=2 w=64 h=64 b36=00000000 b40=00000000 + + slot11 [A,B] -> ERR14 (BadIDChoice) + slot11 [B,A] -> ERR14 (BadIDChoice) + + after: A unchanged, B unchanged (both still class 2, b40 = 0) + query A: REPLY query B: REPLY + put A: ERR10 put B: ERR10 + + So slot 11 rejects even two valid, queryable resources. The lookups it does + are typed: call #1 pushes the literal 0xffff, call #2 pushes 0 + (0x667E2 SUB A7,A7 ; 0x667E4 MOVE A7,*A14+). Neither class-2 resource + satisfies those types, so slot 11 is not the class-3 bind: its operand types + are fixed by the handler and are not carried in the request. + +2) SECOND ALLOCATOR for the op-1 object. If a second allocator registered the + class-3 object's id, the id would appear somewhere near it. + + create op=1 C=0040E000 object=003FD110 + id@0=00000000 class=3 w=64 h=64 b36=00000000 b40=00383950 + ID 0040E000 found near the object: NOWHERE within +/-0x4000 (32 KiB + scanned in 0x400 blocks, centred on the object) + + So the op-1 object is not registered anywhere near itself. Combined with the + earlier full-object scan (id absent from its first 0x100 bytes), the class-3 + object carries no id at all, in any location found so far. + +3) Side observation that constrains the next step: PUT_TILE's lookup is typed + too (slot 19 pushes MOVK 0x3 immediately before the lookup), and a + class-2 resource that is present and queryable still yields BadMatch. So the + gate is the lookup TYPE/CLASS match, not mere existence -- and the type is + carried inside the handler, not in the request fields tried so far. + +NEXT LEVER (not yet tried): element+0x28 is the field export treats as the +source image (0x1B238 MOVE *A5(0x28),*A11(0x610)); it is 0 at export time. +A write watchpoint on element+0x28 across create/arm1/arm2 would show whether +any slot-20 field sets it (i.e. whether the source is supplied by EXECUTE +rather than by PUT_TILE). diff --git a/xie/evidence/slot33_40_operands.txt b/xie/evidence/slot33_40_operands.txt new file mode 100644 index 0000000..e0e58ae --- /dev/null +++ b/xie/evidence/slot33_40_operands.txt @@ -0,0 +1,45 @@ +SLOT 33 / 40 OPERAND REQUIREMENTS -- accepted shapes found, but they change nothing. + +STATIC (from the handlers): + +slot 40 (file 0x65262), before its render call: + 652B4 A7 = req byte 12 ; DEC ; JREQ 0x652E8 ; byte12 == 1 -> ok + 652BC A7 = req byte 12 ; JREQ 0x652E8 ; byte12 == 0 -> ok + otherwise MOVK 0x2 -> BadValue + 652E8 same test on req byte 13 (*A9(0x68)) + Byte 12 = payload byte 8 = low half of payload word 2; byte 13 = its high half. + So word 2's two bytes must each be 0 or 1. + +slot 33 (file 0x64CC8) reads the same *A9(0x60) = req byte 12. + +EMPIRICAL sweep (SET_OP_DEFAULTS(1) first, two live class-2 resources A,B): + + slot 33: 00000000:reply 00000001:err2 00000100:err2 00000101:err14 + 00000002:err14 00000200:err14 01000000:err14 + slot 40: 00000000:reply 00000001:err2 00000100:err2 00000101:err2 + 00000002:err2 00000200:err2 01000000:err2 + +So word2 = 0 is the accepted value for BOTH slots -- which is exactly the shape I +had reported as BadValue in an early turn. That earlier result was wrong: with +SET_OP_DEFAULTS(bpp=1) issued and two valid distinct ids, [A,B,0] is ACCEPTED. + +WHAT THE ACCEPTED REQUESTS DO: NOTHING OBSERVABLE. + + slot 33 [A,B,0] -> REPLY len=0, head 01 41 03 00 followed by all zeros + new REGIDSTORE: none + element records unchanged: + id 00401000 p44=003DBAF0 elem=003FDA10 elem0=01050001 + id 00402000 p44=003DB7B0 elem=003FCED0 elem0=01050001 + slot 40 [A,B,0] -> in the follow-up run returned BadValue, although the sweep + returned a reply for the same shape (NOT reproducible; recorded as such) + +No element type is stored, no new resource is registered, the element records are +unchanged, and rp stays 0. + +CORRECTION: in this run I printed a "b8" column using rd.peek(p+8,1) -- that is +object BYTE 1, not byte 8 (the correct offset is p + 8*8). Those b8 values +(0x10, 0x20) are therefore meaningless and are withdrawn. + +STATUS: slots 33 and 40 now have accepted shapes ([A,B,0]) but, like slot 44's +accepted shape, they produce no state change: no element, no registration, no +render. The pipeline is still never constructed. diff --git a/xie/evidence/slot43_compare_operands.txt b/xie/evidence/slot43_compare_operands.txt new file mode 100644 index 0000000..f02b641 --- /dev/null +++ b/xie/evidence/slot43_compare_operands.txt @@ -0,0 +1,42 @@ +SLOT 43's DOUBLE OPERANDS MEASURED -- and it is STILL NOT ACCEPTED. +Recording honestly: I did not satisfy its precondition. + +A) The table is little-endian doubles (TMS34010 is LE; big-endian decoding + produced nonsense). Decoded correctly: + + 3F533780 = 3.0 + 3F5337C0 = 871.0 + 3F533800 = 873.0 + 3F533840 = 217.0 + 3F533880 = 219.0 + +B) Logging the operands at both double-compare call sites + (breakpoints at file 0x658B8 -> "CMP900" and file 0x656B0 -> "CMP740"), + printing the two frame locals that are pushed as the operand pair + (*A13(0x0) and *A13(0x20) -- the two 32-bit halves of a double): + + request shape result logged comparison + [id,0,0,0,0,0,0,0,0] BadValue CMP740 a0=00000000 a1=00000000 + [id,0,3.0hi,0,...] BadValue CMP740 a0=00000000 a1=00000000 + [id,0,0,3.0hi,0,...] BadValue CMP740 a0=FFF7D264 a1=BFE800FF + + * CMP900 -- the site that raises BadValue at 0x658C0 -- NEVER FIRED in any + case, so the rejection happens EARLIER than the comparison I was chasing. + * The operand pair at CMP740 is 0/0 (double 0.0) for the zero payload, and + becomes garbage when a 3.0 high-half is placed in payload word 3. So the + doubles are NOT read from the payload words tried; they come from frame + locals populated elsewhere in the handler. + +C) State of the claim about slot 43: + * Its body is a per-element reporting loop that copies element+0x1a8 into a + FRAME-LOCAL array (A11 = A13 + i*4, store at +0x140) and then formats with + the printf family -- no write to resource+0x140, none to rp+0x610, no image + buffer allocation. + * That reading is unchanged and is why it is not credible as an image source. + * BUT its acceptance path was never exercised: BadValue is raised before the + comparison I instrumented, and I did not locate that earlier check. + +So the honest position is: slot 43 is excluded on CODE READING (reporting loop +into locals) and on the watched evidence that no slot-43 request produced a +non-zero write to src_base -- NOT on a completed, accepted request. Its exact +acceptance precondition remains unknown. diff --git a/xie/evidence/slot43_decoded.txt b/xie/evidence/slot43_decoded.txt new file mode 100644 index 0000000..88007fc --- /dev/null +++ b/xie/evidence/slot43_decoded.txt @@ -0,0 +1,48 @@ +SLOT 43 DECODED (partially) -- it is a REPORTING request, not an image source. + +Length: exactly 10 words (0x65618 SUBK 0xa ; JREQ ; else BadLength 0x10). + +Payload words actually read (bit offsets -> payload byte / word index): + 0x65624 *A9(0x40) byte 8 -> payload word 1 (id #2) + 0x65628 *A9(0x20) byte 4 -> payload word 0 (id #1) + 0x65650 *A9(0xa0) byte 20 -> payload word 4 (ROI field) + 0x65668 *A9(0xc0) byte 24 -> payload word 5 (ROI field) + 0x65674 fallback width = *(*A13(0x1c0))(0x80) + 0x65678 fallback height = *(*A13(0x1c0))(0xa0) +so the shape is [id1, id2, ?, ?, roiA, roiB, ...] with two live resources +looked up through 0x7EA6FA0 at 0x65640. + +The "descriptor tables with 3.0 / 438.0" are NOT descriptors: they are arrays of +IEEE doubles and each MOVI points 8 bytes further into the same array: + + 3F533740 -> 00 00 00 00 00 00 08 40 = 3.0 + 3F533780 -> next double (8 bytes later) + 3F5337C0, 3F533800, 3F533840, 3F533880 ... successive doubles + +and each load is followed by two `MOVE *A8+,*A14+` (copy 8 bytes = one double) +then `CALLA 0x07FC1CE6 / 0x07FC18F6 / 0x07FC1CDE` -- the printf family (the same +helpers used by the export timing print and by 0x7F638C2, the logger). + +So slot 43 formats and prints doubles; it is a diagnostic/report request. + +TESTED LIVE (valid c.new_id ids, no-reply model). 17 payload shapes, including +doubles (0x40080000 = high half of 3.0) in every position, single-id and two-id +forms, and ROI-shaped values: + + all-zero, wN=3.0hi for N=1..5, w1..w3, all=3.0hi + [A,B,0,0,64,64,0,0,0] [A,A,0,0,64,64,0,0,0] [A,B,0,0,64,64,1,1,0] + [A,B,0,0,0,0,0,0,0] [A,B,1,1,64,64,0,0,0] [A,B,64,64,64,64,0,0,0] + + EVERY ONE returned BadValue (2). + +Therefore: + * slot 43's exact ROI/validity preconditions were not reconstructed, but + * its body is printf-dominated and its constants are printed doubles, and + * nothing observed connects it to src_base or to an image data plane. + +It is therefore not credible as "the image-source element that populates +src_base": there is no evidence it writes any image buffer. + +Incidental but useful: c.new_id now yields ids like 0x00302000 / 0x00303000 on +this run, confirming again that the per-connection id base varies (0x0040xxxx, +0x0050xxxx, 0x0030xxxx all seen) -- further validating the earlier id fix. diff --git a/xie/evidence/slot43_excluded.txt b/xie/evidence/slot43_excluded.txt new file mode 100644 index 0000000..6abac6a --- /dev/null +++ b/xie/evidence/slot43_excluded.txt @@ -0,0 +1,40 @@ +SLOT 43 EXCLUDED AS AN IMAGE-SOURCE PATH -- structurally and empirically. + +A) WHERE ITS BadValue COMES FROM + Its body is a chain of double comparisons: it loads a double from the table + (0x3F533740 = 3.0, 0x3F533780, 0x3F533900, ... successive 8-byte entries) and + calls the double-compare helpers 0x7FC1CE6 / 0x7FC18F6 / 0x7FC1CDE. On a + mismatch it raises BadValue: + 658B8 CALLA 0x07FC1CDE + 658BE JREQ 0x658CA ; equal -> continue + 658C0 MOVK 0x2,A7 ; else BadValue + So it validates a double parameter against a fixed table. That is why all 17 + payload shapes failed: the double the request must carry was never right. + +B) WHAT IT DOES WITH THE ELEMENT CHAIN (the one suspicious block) + 659CE A7 = *A13(0x1c0) ; resource + 659D2 A5 = *A7(0x160) ; photoflo-ish base + 659D6..659DC A5 = base + i*4 ; per-element index + 659DE A7 = *A5(0xd8) ; element + 659E2 *A11(0x140) = *A7(0x1a8) ; copy element+0x1a8 into a LOCAL array + 659FE.. printf the collected values + The destination is a frame-local array (A11 = A13 + i*4, store at +0x140), not + the resource and not src_base. Every store in the handler goes to frame + locals (*A13(...)) or to the params block; the handler never writes + resource+0x140, never writes rp+0x610, and allocates no image buffer. + +C) EMPIRICAL EXCLUSION with the src_base slot watched + rp = 0091F090 -> src_base = 0091F6A0, 32-bit write watchpoint installed. + Four slot-43 shapes issued: + [id,0...] [id,id,0...] [id,id,0,0,64,64,0,0,0] [id,id,3.0hi,0...] + -> every one BadValue (2), none reached the reporting loop. + 64 watch events at/around 0091F6A0: every value is 00000000 or 00000055 + (allocator fill), written by export's own copy (pc 3F2D91F0) and allocator + fill (pc 3FE16CA0 / 3F2D92E0 / 3F2E2C00 / 3F2E2C90). NOT ONE non-zero + image pointer. + +CONCLUSION: slot 43 is a reporting/describe request -- it validates a double +parameter against a table, then prints per-element values collected into frame +locals. It neither writes src_base nor allocates an image buffer, so it cannot +be the element that populates the source image. This closes the last +implemented slot whose acceptance condition was unresolved. diff --git a/xie/evidence/slot43_instrumentation.txt b/xie/evidence/slot43_instrumentation.txt new file mode 100644 index 0000000..ce1f843 --- /dev/null +++ b/xie/evidence/slot43_instrumentation.txt @@ -0,0 +1,20 @@ +Slot 43 instrumentation (create class-2 A, request [A, 0, 0...]): + + S43OBJ a8=00385D90 (0x65BD0 object allocation hit) + S43ID (0x65C46 ID store NEVER hit) + + slot43 -> BadValue (2) + query id 0 -> BadIDChoice + put id 0 -> BadIDChoice + +Object at 0x00385D90: + before poke: d0 54 38 00 50 57 38 00 00 00 00 00 00 00 00 00 + after poke id->B: bb bb 40 00 50 57 38 00 ... + query B -> BadIDChoice + put B -> BadIDChoice + +So slot 43 fails before the ID store for [A,0]; the hit object is a temporary +process block, not an addressable XIE resource. Changing its first word to a +valid id does not insert it into the lookup table. + +No class-3 resource with byte 40 = 0 is produced. diff --git a/xie/evidence/slot43_is_a_render_request.txt b/xie/evidence/slot43_is_a_render_request.txt new file mode 100644 index 0000000..d7726c1 --- /dev/null +++ b/xie/evidence/slot43_is_a_render_request.txt @@ -0,0 +1,37 @@ +SLOT 43 IS A RENDER REQUEST -- correction to the earlier "printf/describe" label. + +Instrumented path for [A,A,0,0,64,64,0,0,0] on a live class-2 resource +(9 breakpoints, generated addresses, valid ids, isolated connection): + + S43_LOOKUP 0x65646 (lookup returned 0 -- success) + S43_TAIL_A 0x65A3A + S43_TAIL_B 0x65B78 + S43_SET3 0x65BD0 MOVK 0x3,A5 + S43_STORE3 0x65BD2 MOVB A5,*A8 <-- writes the value 3 into the new block + S43_RENDER 0x65BF8 CALLA 0x07E5B152 <-- the SAME render/export driver slot 21 uses + (S43_EXIT0 0x65C9E never reached) + +So slot 43: + 1. looks up the resource (word 0 must be a class-2 image resource; word 0 = photoflo + gives 0xE, word 0 = image gives 0), + 2. allocates and fills a process block, + 3. sets a byte of it to 3 (0x65BD2), + 4. invokes the render driver 0xE5B152 = file 0x1B152, the same function slot 21's + export calls, + 5. never reaches its own `SUB A8,A8` return at 0x65C9E. + +The client still receives BadValue (2), and the two MOVK 0x2 sites (0x658C0 and +0x6598C) do NOT fire. So the 2 is produced by a callee inside the tail -- the +candidates in that range are 0x7E5B152 (render driver), 0x7F16CA2 (table insert), +0x7E7FE96 and 0x7F63B00 (free). + +CONSEQUENCE FOR EARLIER CLAIMS: + * "Slot 43 is a printf/describe request" was WRONG. It formats doubles for a + report, but its substantive action is to build a process block and call the + render driver -- i.e. it is a second, independent entry into the render path. + * It is still not an image SOURCE (it never writes resource+0x140 or rp+0x610 as + a buffer), but it is a render TRIGGER and was misclassified. + +NEXT: bisect inside the tail (0x65C02..0x65C9E) and inside 0x1B152's return path to +find what returns 2, since an accepted slot 43 would drive the render driver +directly -- the closest any request has come to the export path. diff --git a/xie/evidence/slot43_self.txt b/xie/evidence/slot43_self.txt new file mode 100644 index 0000000..b472235 --- /dev/null +++ b/xie/evidence/slot43_self.txt @@ -0,0 +1,15 @@ +Slot 43 with the source id duplicated as the destination field: + + create class-2 A -> slot43 [A, A, 0...] -> query A -> PUT_TILE A + +Results vary with the sequence: + + no slot-20 arm: + slot43 = BadValue (2), qA = REPLY, putA = BadAccess (10) + with arm / arm2: + slot43 = BadValue (2), putA = BadMatch (8) + +So slot43 partially changes the resource (the lookup error moves from +BadMatch to BadAccess once), but the state is not stable and the real +PUT_TILE never passes. No class-3 resource with byte 40 == 0 and a usable +band is produced. diff --git a/xie/evidence/slot44_accepted_shape.txt b/xie/evidence/slot44_accepted_shape.txt new file mode 100644 index 0000000..fcdadff --- /dev/null +++ b/xie/evidence/slot44_accepted_shape.txt @@ -0,0 +1,40 @@ +SLOT 44: AN ACCEPTED SHAPE FOUND -- but it has no observable effect. + +1) The post-0x65D2E path calls 0x07EACA82 = file 0x6CA82, the same CREATE routine + the create request uses: + 65DB0 CALLA 0x07EACA82 + 65DB6 MOVE A8,*A13(0xc0) + 65DBA MOVE A8,A8 + 65DBC JRNE 0x65DE6 + and A8 came back as a POINTER (003FD350), not an error code -- so 0x65DE6 is + the SUCCESS continuation, not an error path (my earlier label was wrong). + +2) The two trailing fields are ENUMERATED, not merely "non-zero": + [A,B,1,1] -> REPLY (accepted) + [A,B,2,1] -> BadValue(2) + [A,B,1,2] -> BadValue(2) + So word2 = 1 and word3 = 1 are valid values; 2 is not. Both must be present. + +3) The accepted reply is 32 bytes with no data: + 01 41 03 00 | 00 00 00 00 ... (all zero) + +4) NO observable effect from the accepted request: + - no new REGIDSTORE line (nothing registered) + - both resources' p44 / element pointers unchanged (elem0 = 01050001 both + before and after) + - rp (@0xA6000) still 0 + - no element-type store fired in this run + +So slot 44 accepts (src, dst, 1, 1) and returns a zeroed reply, but creates +nothing addressable and populates no element. It is CREATE_BY_REFERENCE by +structure (it calls the create routine with a source resource), but the accepted +form has no visible effect -- consistent with the earlier finding that create can +allocate without registering, and with the element record remaining +uninitialised (word1 = 0x55 heap fill). + +Element records observed (unchanged throughout): + id 00401000 obj=003FDC50 p44=003DE530 elem=003FDA10 elem0=01050001 + id 00402000 obj=003FD350 p44=003DB7B0 elem=003FD110 elem0=01050001 + +STATUS: an accepted slot-44 shape exists (a first), but it moves nothing. The +pipeline is still never constructed and no image appears. diff --git a/xie/evidence/slot44_operand_requirement.txt b/xie/evidence/slot44_operand_requirement.txt new file mode 100644 index 0000000..334e295 --- /dev/null +++ b/xie/evidence/slot44_operand_requirement.txt @@ -0,0 +1,36 @@ +SLOT 44 OPERAND REQUIREMENT FOUND -- and the first element-type write ever seen. + +Static requirement, from the handler (file 0x65CAA, 5 words): + 65CFA MOVE *A9(0x60),A7,0x1 ; payload word 2 + 65CFE JREQ 0x65D06 ; word2 == 0 -> other path + 65D00 MOVE *A9(0x80),A7,0x1 ; payload word 3 + 65D04 JRNE 0x65D2E ; word3 != 0 -> main path +So BOTH word2 and word3 must be non-zero. Every earlier sweep of slot 44 used +word3 = 0, which is why it always came back BadValue. + +MEASURED (valid ids, two live resources A/B, SET_OP_DEFAULTS(1) first): + + [A,B,0,0] both zero -> reply render=0 types=- + [A,B,1,0] w3 zero -> BadValue(2) render=0 types=- + [A,B,0,1] w2 zero -> BadValue(2) render=0 types=- + [A,B,1,1] -> BadValue(2) render=0 types=['TYPE2'] <-- ! + [A,A,1,1] -> BadValue(2) render=0 types=['TYPE2'] <-- ! + [A,B,3,3] -> BadValue(2) render=0 types=['TYPE2'] <-- ! + +FIRST ELEMENT TYPE EVER WRITTEN: the type-2 store (file 0x1B362, +MOVK 0x2,A11 ; MOVB *A11,*A5(0x58)) now executes. In every previous +configuration, including the full export cycle, NO type store ever fired. + +So slot 44 with two non-zero trailing fields DOES reach the element-add path and +selects element type 2. It then returns BadValue -- so a later check rejects the +request -- and the render call at 0x65F54 did not fire. + +CAVEAT RECORDED HONESTLY: I armed a breakpoint at the 0x65F54 call site and it +did not fire even though the type write (which lives inside the callee 0x1B152) +did. Either the call is reached by a different route than the site I targeted, +or the breakpoint was dropped despite only 7 being armed. I did not resolve +which, so the exact call path from slot 44 into 0x1B152 is not established. + +NEXT: bisect the remainder of slot 44 after the type write (0x65D2E onward) to +find the check that still returns BadValue, since that is now the only obstacle +between us and a constructed element. diff --git a/xie/evidence/src_base_chain_found.txt b/xie/evidence/src_base_chain_found.txt new file mode 100644 index 0000000..400cd31 --- /dev/null +++ b/xie/evidence/src_base_chain_found.txt @@ -0,0 +1,53 @@ +TURN RECORD: THE src_base CHAIN IS FULLY IDENTIFIED, AND THE IMPORT DOES PRODUCE A +SOURCE -- BUT THE TRANSPORT ORGANIZATION DECIDES WHETHER IT SURVIVES. + +A) WHERE src_base COMES FROM (static) + 0x1B238 MOVE *A5(0x28),*A11(0x610) + i.e. rp+0x610 = *(element + 0x28 bits). Measured at that store during a + working export: + SRCBASE_ST a5=003FD590 elem28=00000000 rp=009261D0 + RP a11=009261D0 src_base610=00000000 + So the renderer reads the source pointer straight out of the band element. + +B) THE IMPORT **DOES** WRITE IT + Instrumented slot 19 during a successful PutTile (mode=3): + S896 plane_mask=00000001 + S8A0 bit0test + S8A4_import_loop + S98E_ELEM28_STORE val=00982B70 <-- element+0x28 written + S9A2_handoff_call + H_ENTRY + SAA28_skip_exit + and then element+0x28 = 00000000 again. The handoff clears it at + 0x6B8D6 (`SUB A9,A9 ; MOVE A9,*A11(0x28)`) on the path it takes there. + +C) THE HANDOFF'S PATH IS CHOSEN BY component_organization + The handoff dispatches on (*(byte36))[1] (0x6B83A, bit offset 8 = BYTE 1). + byte36 is the transport context, and its byte 1 = component_organization. + Measured, after SetTransport(mode=3) + PutTile: + org=1 transport ok puttile ok elem+0x28 = 0098CAB0 (SURVIVES) + org=3 transport ok puttile ok elem+0x28 = 0098CAB0 (SURVIVES) + org=4 transport ok puttile ok elem+0x28 = 00000000 (CLEARED) + org=2 transport BadMatch puttile BadAccess + So XieK_BitByPlane (4) -- the value I had been using -- is exactly the one that + makes the handoff clear the source pointer. + +D) BUT WITH org=1/3 THE EXPORT FAILS EARLIER + org=1 or 3 with plane_mask=1: elem+0x28 = 0098DB10 (non-zero), then + export -> err2 and the renderer breakpoint (RP 0x1B296) NEVER fires, + i.e. the export handler rejects before reaching the render driver. + org=4: elem+0x28 = 0, export -> err2, RP fires with src_base 0. + So the two halves of the failure are complementary: the setting that keeps a + source also breaks the export request path, and vice versa. + +E) ALSO MEASURED + plane_mask must be 1; 0xFFFFFF fails the transport (BadMatch) and PutTile + (BadAccess) for both org=1 and org=3. + +STATUS. NO client-chosen XIE image. The 64x64 window is unchanged; src_base has +never been observed non-zero at the renderer. + +This is the most precise statement of the wall so far: the import produces a real +source buffer (0098CAB0 / 0098DB10) inside the element, and the only thing that +destroys it is the handoff branch selected by component_organization -- while the +value that preserves it also makes Export bail out before the renderer. diff --git a/xie/evidence/src_base_sweep_all_slots.txt b/xie/evidence/src_base_sweep_all_slots.txt new file mode 100644 index 0000000..216b01e --- /dev/null +++ b/xie/evidence/src_base_sweep_all_slots.txt @@ -0,0 +1,41 @@ +src_base SWEEP ACROSS ALL REMAINING IMPLEMENTED SLOTS -- none writes it. + +Method, per slot: fresh connection, create class-2 resource (op=2), arm1, +, PUT_TILE, arm2(v16=0), create window+GC, read window +baseline, EXPORT, read window again. The export breakpoint prints the render +params, so rp+0x610 (src_base) is read directly from what EXPORT used. + +Candidate request shape for every slot: payload = [resource_id, 0, 0...] at the +slot's own required length (from each handler's length check). + +slot words create candidate put export src_base window changed + 18 4 OK ERR8 ERR8 OK 00000000 False + 40 4 OK ERR2 ERR8 OK 00000000 False + 44 5 OK ERR2 ERR8 OK 00000000 False + 33 4 OK ERR2 ERR8 OK 00000000 False + 14 4 OK ERR14 ERR8 OK 00000000 False + 15 3 OK OK ERR8 OK 00000000 False + 9 3 OK ERR1 ERR8 OK 00000000 False + 13 2 OK ERR14 ERR8 OK 00000000 False + 24 4 OK REPLY ERR8 OK 00000000 False + +Every export shows the same render params, with only the source id varying: + + RP 5a8= 5d0=00000040 5f0=00000040 610=00000000 + 6f8=00000000 718=00000000 738=00000040 758=00000040 + +So the export always resolves the source resource and its 64x64 geometry, and +the source pixel base stays 0 for every slot tried. Not one of these requests +supplies a data plane. + +Coverage note: with this, every implemented slot in the dispatch table has now +been exercised at least once against a created resource -- + 1 (session) 2 3 4 5 6 7 8 9 10 11 12 13 14 15 18 19 20 21 22 24 33 40 43 44 +plus 0 and 47 which are the BadRequest default and the unreachable trampoline. + +This is not a proof of impossibility: only ONE argument shape per slot was +tried ([id, 0, 0...]). A slot could still require additional distinct ids or +non-zero parameters. It does show that no implemented slot populates src_base +when handed the resource id alone, so the import that creates a data plane is +either (a) slot 19 with preconditions we cannot satisfy, or (b) a slot that +needs a multi-operand shape not yet constructed. diff --git a/xie/evidence/srcbase_watch_and_slots15_22.txt b/xie/evidence/srcbase_watch_and_slots15_22.txt new file mode 100644 index 0000000..db9f0fc --- /dev/null +++ b/xie/evidence/srcbase_watch_and_slots15_22.txt @@ -0,0 +1,45 @@ +WRITE WATCH ON THE ACTUAL src_base SLOT (rp+0x610), plus slots 15 and 22. + +Setup: valid c.new_id ids, no-reply model, generated bit addresses. The rp +pointer was captured at the export breakpoint (0x1B296, where A11 = rp): + rp = 00913330 -> rp+0x610 = 00913940 +A 32-bit write watchpoint was installed at 00913940. + +Sequence and results: + + create/arm1/put/export#1 put = BadMatch, export#1 = BadMatch + slot15 [id,0] silent (success) + slot22 [id] silent (success) + slot15 [id,id] silent (success) + arm2, export#2 silent (success) + + rp+0x610 after export#1 = 00000000 + rp+0x610 after export#2 = 00000000 + +WRITES OBSERVED AT rp+0x610 (18 events), by PC: + pc=3FE16CA0 val=00000000 x8 (file 0x3C2D94 - allocator/fill) + pc=3F2D91F0 val=00000000 x2 (file 0x1B23E - the export copy block) + pc=3F2D92E0 val=00000055 + pc=3F2D9300 val=00000055 / 00000000 + pc=3F2DBC70 val=0000B055 / 000090E6 + pc=3F2E2C00 val=0000B000 + pc=3F2E2C90 val=00000000 + +Readings: + * The only writer inside the XIE export path is 0x1B23E (pc 3F2D91F0), i.e. the + known `MOVE *A5(0x28),*A11(0x610)` copy, and it writes 0 because + element+0x28 is 0. + * The 0x55 / 0xB055 / 0x90E6 values are the heap fill pattern and unrelated + allocator metadata, not an image pointer. + * Slots 15 and 22 both return SILENT (success) for [id,0], [id,id] and [id] - + they are permissive requests - but neither causes any non-zero write to + src_base. + +So: slots 15 and 22 do not populate the source image buffer, and the only +in-code writer of src_base is export's own copy from element+0x28, which stays 0. +Also noted: export fails (BadMatch) if arm2 has not been issued; with arm2, export +is silent/success - consistent with the earlier arm2 gate finding. + +CONCLUSION for this line: the src_base slot has been watched directly, across the +full cycle plus slots 15/22, and nothing sets it. The image source buffer is +never produced. diff --git a/xie/evidence/three_wrong_assumptions.txt b/xie/evidence/three_wrong_assumptions.txt new file mode 100644 index 0000000..49ac45e --- /dev/null +++ b/xie/evidence/three_wrong_assumptions.txt @@ -0,0 +1,34 @@ +THREE STRUCTURAL ASSUMPTIONS TESTED THIS TURN -- ALL WRONG. Recorded so the +next person does not repeat them. + +1) "0x7F638C2 is the resource allocator" -> WRONG. + file 0x1238C2 is a printf-style logger: it loads format descriptors + (MOVI 0x3fb1cea0 / 0x3fb1ce60 / 0x3fb1cf20 / 0x3fb1cf60), fetches args from + A11's fields and calls 0x7FC22DE / 0x7FC1BD2 / 0x7FC2F04. The real + allocation is the NEXT call, 0x7EACA82 -> file 0x6CA82. + +2) "0x7F174A4 is the XIE resource-table lookup" -> WRONG. + file 0xD74A4 indexes a table at bit 0x21FFE0 by + N = (id & 0xFFF00000) >> 12 + and bounds-checks N against the count at 0x225870, which reads 16. + For our client ids (0x40C000, 0x40D000) N = 1024, i.e. far out of range, + and the bucket slot (0x227FE0) reads 0. + (id & 0xFFF00000)>>12 is the CORE-X client index, so this is the core-X + resource lookup by XID, not anything to do with XIE resources. + +3) "@0x1AD980 / @0x1AD990 / @0x1AD9A0 are the XIE resource list heads" -> WRONG. + Reading 32 bits at those bit addresses yields 0x02000002, 0x04000200 and + 0x00000400 -- small 16-bit-field values, and following them as a pointer + chain reads zeros. They are not list heads; the arguments built around + them at 0x679B0E / 0x67B28 are something else (they are read with `MOVE + @addr,A11,0x0`, an 8-bit field, which is suspicious in itself). + +WHY THIS MATTERS: the BadMatch(8) / BadAccess(10) / BadIDChoice(14) codes we +have been comparing all session were being attributed to structures I had +mis-identified. The measurements themselves are sound (S19LOOK a8 = 0x08 / +0x0A / 0x0E at 0x6A7B4 is a direct observation), but every explanation built on +top of these three functions is now void. + +CONCLUSION: further static inference about the XIE resource model is producing +wrong answers faster than it produces progress. The remaining work needs the +protocol definition, not more guessing. diff --git a/xie/evidence/trampoline_unreachable.txt b/xie/evidence/trampoline_unreachable.txt new file mode 100644 index 0000000..1c320d2 --- /dev/null +++ b/xie/evidence/trampoline_unreachable.txt @@ -0,0 +1,40 @@ +THE BYTE-SWAPPED DISPATCH FAMILY IS NOT CLIENT-REACHABLE. + +slot 47's table entry is 0x3F54BDA0 (file 0x697B4), a trampoline that swaps +the bytes of request words at bit offsets 0x10/0x18, 0x20/0x28, 0x30/0x38 and +then re-dispatches: SLL 5 on the minor byte ; ADDI 0xd3f90 ; MOVE *A11,A11 ; +CALL A11. + +Breakpoints armed on both the table read (0x3F54BFF0) and the CALL (0x3F54C000), +i.e. the trampoline body itself. Breakpoint count went 36 -> 38, so both were +installed (no "Error in command"). + +Requests sent (one connection, after creating a class-2 resource): + + minor47 len3 plain -> ERR1 (BadRequest) + minor47 len16 byte-swapped args-> ERR1 (BadRequest) + minor47 len16 plain args -> ERR1 (BadRequest) + control minor19 len16 -> ERR10 (BadAccess) + + TRAMP hits: 0 + ("TRAMP minor=.. target=.." never printed; count = 0) + +So minor 47 is rejected with BadRequest before the trampoline body ever runs, +for both swapped and unswapped argument words. The trampoline is therefore +internal/dead for a client: there is no client-reachable byte-swapped request +family, and the swapped-import route is closed. + +Related diagnostic: the default handler 0x64C3C (used by every unimplemented +slot, and by slot 0) is the BadRequest responder -- that is why probing the +unimplemented slots returned ERR1 rather than a length error. + +Also note: the trampoline's own self-reference is why it can never be entered +from a client -- it re-dispatches on the SAME minor byte it arrived with +(*A10(0x8) is not touched by the byte swaps, which only cover offsets 2..7), +so a client request for minor 47 would re-enter it forever. + +One measurement caveat recorded honestly: in this run the opening `create` +returned no reply (timeout), and the control import then returned BadAccess +rather than the usual BadMatch. That does not affect the trampoline result -- +TRAMP never fired even though the server was still answering requests -- but it +means this particular run's create state is not a clean baseline. diff --git a/xie/evidence/transport_component_and_export_state.txt b/xie/evidence/transport_component_and_export_state.txt new file mode 100644 index 0000000..ccaee46 --- /dev/null +++ b/xie/evidence/transport_component_and_export_state.txt @@ -0,0 +1,66 @@ +TURN RECORD: THE TRANSPORT PATH IS NOW FULLY CLIENT-DRIVEN; EXPORT RUNS THE +RENDERER BUT STILL FINDS NO SOURCE. + +A) XieCreatePhoto requirement discovered by measurement + The create request is XieCreatePhoto(type, width, height, cmp_map, cmp_cnt, + cmp_lvl[], pxl_pol, pxl_ratio, pxl_prog, scn_prog) -- man page + xie/docs/dec/xie23/man/XieCreatePhoto.3X. Sweeping the words that follow + width/height (w4..w8, unique id per trial, full pipeline each time): + + baseline (w4..w8 = 0) transport=err8 puttile=err10 (fails) + w4=1 err8 / err10 + w5=1 err8 / err10 + ** w6=1 transport=ok/silent puttile=ok/silent ** + w7=1 err8 / err10 + w8=1 err8 / err10 + w5=0x020202 err8 / err10 + w6=1 w5=0x020202 ok / ok + + So **w6 = 1 is required** (the component count / image-attribute word). + Without it the photomap has no components, SetTransport fails with BadMatch + and PutTile with BadAccess. With it, and with SetTransport mode=3 + (component_organization=4, plane_mask=1, pixel_stride[0]=1, + scanline_stride[0]=8), the whole client path works: + + InitSession(2.3) -> CreatePhoto(w6=1) -> SetTransport(mode=3) + -> PutTile(64x64, plane_mask=1, final=1) = ok/silent, NO DEBUG POKES + +B) EXPORT FROM AN UNBOUND PHOTOMAP RUNS THE RENDERER BUT HAS NO SOURCE + export(minor 21, 16 words, w=64 h=64) -> ok/silent + trace: RP(0x1B296) fires with src_base610=00000000, and the TYPE5 element + store executes. + w=0,h=0 skips the renderer entirely. + Framebuffer captures (dwt/screenshot.py) for a solid-white tile and a + solid-black tile differ by 1600-1608 pixels -- the Terminal Manager's memory + figures and the pointer cursor. The 64x64 window itself is unchanged. + +C) THE BOUND PATH DOES NOT WORK AS-IS + Create a photoflo (type=1, w6=1), BindPhotomap (11) with [photomap, photoflo] + -> ok/silent, then Export(21) -> err14 (BadIDChoice), ExecutePhotoflo(13) + -> err1. Per XiePutTile.3X a photomap bound to a flo can no longer receive + tiles, so this ordering is wrong: tiles must go in BEFORE bind, which is what + B does, and then the unbound-immediate export is the right request -- yet + src_base stays 0. + +D) QUERYEXPORT IS NOT USABLE YET + minor 24 with 3 and 4 words (photo_id alone, photo_id+drawable) always + returns err1 (BadRequest), so the export context cannot be inspected to see + whether a pixmap was produced. + +E) CORRECTION FROM THE PEER SESSION, checked against the header + XieFloatRec is NOT an IEEE float (XieFloat.h: {u8 e_sign; u8 m_sign; + u16 exponent; u32 mantissa}). Zero-filling match_limit/gray_limit encodes + mantissa=0 => 0.0, which is a valid value ("exact matches only"), so that was + not the failure. Encoding 1.0 would be mantissa 0x80000000, exponent 1. + +STATUS. Still NO client-chosen XIE image. src_base (rp+0x610) remains +00000000 in every run; the window is unchanged; solid-white and solid-black +captures are identical apart from the Terminal Manager's own stats; xshow +(core X) remains the only viewer that has displayed an image. + +WHAT IS NOW TRUE THAT WAS NOT BEFORE: the import half of the path is entirely +client-driven and reproduces (no pokes), and the create request has a known, +required attribute word (w6=1). The remaining gap is only the export half: the +renderer runs but reports no source, so either the photomap is still not +"populated" in the sense XieExport needs, or the export needs a length/element +form I have not matched. diff --git a/xie/evidence/verified_slot33_44.txt b/xie/evidence/verified_slot33_44.txt new file mode 100644 index 0000000..3c2fcce --- /dev/null +++ b/xie/evidence/verified_slot33_44.txt @@ -0,0 +1,41 @@ +VERIFIED PROBE (xie/probe_verify.py): one field helper, one reply per request, +raw bytes printed, run TWICE. Both runs identical. + + SET_OP_DEFAULTS(bpp=1) -> REPLY len=0, head = 01 41 03 00 then all zeros + create 00401000 -> SILENT (accepted) + create 00402000 -> SILENT (accepted) + registered -> both ids registered, class=2, byte8=1, byte9=1, + p44 set, elem(+0xd8) populated, elem.byte0 = 0x01 + + slot33 [A,B,0] -> Invalid code=2 (BadValue) new REGIDSTORE: none + slot44 [A,B,1,1] -> Invalid code=2 (BadValue) new REGIDSTORE: none + element records unchanged by both. + + reproducibility: slot33 MATCH, slot44 MATCH across the two runs. + +ROOT CAUSE OF THE EARLIER FLAKINESS (found by this script): + SET_OP_DEFAULTS REPLIES with a 32-byte packet `01 41 03 00` + zeros. In all my + earlier ad-hoc runs that reply was never consumed, so it was sitting in the + socket and got attributed to the NEXT request. That is why slot 33 "returned + a reply" with head `01 41 03 00 00...` in some runs -- that packet is + SET_OP_DEFAULTS' reply, not slot 33's. Likewise the slot-40 "reply in one run, + BadValue in another" was the same stale packet. + + So: the 32-byte `01 41` reply carries NOTHING about slot 33/44. It is the + op-defaults acknowledgement and its payload is all zeros. + +CORRECTION to earlier statements: the element pointer at band_array+0xd8 IS +populated by create (0x3FD7D0 / 0x3FD590) and its byte0 = 0x01 -- it is not +"uninitialised heap fill" as I said; the 0x55 I saw was in a different field +(word 1 of that record). + +VERIFIED MODEL NOW: + create (op=2) -> class-2 resource, byte8=1 (bits/pixel), byte9=1, + band array at +44, element pointer at band_array+0xd8, + element record populated with byte0=1. + slot 33 [A,B,0] and slot 44 [A,B,1,1] are BOTH rejected (BadValue), + reproducibly, and change no state. + +STATUS: still no client-chosen image. But this is the first measurement set this +session that is reproducible across runs, and it removes a whole class of earlier +"results" that were actually the stale op-defaults reply. diff --git a/xie/evidence/word5_path_diverges.txt b/xie/evidence/word5_path_diverges.txt new file mode 100644 index 0000000..7e7471c --- /dev/null +++ b/xie/evidence/word5_path_diverges.txt @@ -0,0 +1,37 @@ +WITH word5 (band) != 0 THE GATE PASSES, BUT THE LOOKUP STILL RETURNS BadMatch. + +Trace with the import gate satisfied (byte8=1, byte36 -> byte == 3): + + band = 0 : GATE a7=00000003 a11=00000003 (passes) + S19RET a8=00000000 (success) + S88C word5=00000000 -> S896 -> SAA28_skip_exit (import skipped) + + band = 1 : GATE a7=00000003 a11=00000003 (passes) + S19RET a8=00000008 (BadMatch) + and NOTHING else fires: no S88C, no S896, no SAA28, no S8A4, + no S9A2 + +So with band=1 the request DOES pass the gate, but control never reaches the +post-gate block at 0x6A88C. The BadMatch therefore comes from INSIDE the lookup +callee (0x6B966) after 0x6BAF4 -- most plausibly its selector/mask section +(0x6BBCE..0x6BB86), which is the only code between the gate and the return. + +I cannot reconcile this with the static reading: the selector-3 path compares +object->byte8 with the request-derived mask, and with byte8=1 and band=1 that +comparison should succeed. It does not. I have no explanation I can defend, and +I am not going to invent one. + +STANDING FACTS (measured, reproducible): + * arm requires object->byte8 == 1 + * import gate requires *(object->byte36) == 3 + * band (word5) == 0 skips the import and returns a hollow success + * band != 0 passes the gate but the lookup returns BadMatch before slot 19's + own post-gate code runs + * the import handoff 0x7EAB640 has never executed in any run + * src_base (rp+0x610) has never been non-zero in any run + * the window has never differed from the no-export baseline + * xshow (core X) remains the only viewer that has displayed an image + +STATUS: goal not met. The remaining question -- what the lookup's selector/mask +section requires on this path -- is not answerable from behaviour I can observe: +every combination tried returns one of two documented XIE errors. diff --git a/xie/evidence/xie23_headers_and_transport.txt b/xie/evidence/xie23_headers_and_transport.txt new file mode 100644 index 0000000..45c7248 --- /dev/null +++ b/xie/evidence/xie23_headers_and_transport.txt @@ -0,0 +1,70 @@ +DEC XIE 2.3 HEADERS FOUND (peer session) AND THE REAL CAUSE OF EVERY BLOCKER. + +H) THE AUTHORITATIVE HEADER + xie/docs/dec/xie23/include/dec/extensions/XieProto.h + XieK_MajorVersion 2 / XieK_MinorVersion 3 <- matches the VT1200 + Found on DEC OSF/1 2.0 DECstation + 1.3a AXP media by the sibling session and + copied here with the man pages (84 Xie*.3X, DEC 1992). + + The 2.3 minor table (XieProto.h:99-...): + 1 InitSession 2 TermSession 3 QueryEvents 4 SelectEvents + 5 SetOpDefaults 6 QueryOpDefaults 7 CreateByReference 8 CreateByValue + 9 DeleteResource 10 QueryResource 11 BindPhotomap 12 AbortPhotoflo + 13 ExecutePhotoflo 14 TapPhotoflo 15 AbortTransport 16 GetStream 17 GetTile + 18 PutStream 19 PutTile 20 SetTransport 21 Export 22 FreeExport 23 Import + 24 QueryExport 25 Area ... 33 Crop ... 40 Mirror 43 Rotate 44 Scale + 45 Translate 46 LastRequest + + CONSEQUENCES -- three long-standing misidentifications, all now corrected: + * slot 20 is **SetTransport**, not "arm/execute". sz_xieSetTransportReq = + 140 bytes = 35 words, which is exactly the fixed length I measured and + could not explain. Every "arm" experiment was really a transport setup. + * slot 3 is QueryEvents, NOT SetOpDefaults. My "SET_OP_DEFAULTS(bpp=1)" was + a QueryEvents reply all along. SetOpDefaults is minor 5 (20 bytes). + * ExecutePhotoflo is minor 13 (8 bytes), which I never sent. + * There is no PutClientData in 2.3 at all; and "QueryTechniques" does not + exist either. + +I) STRUCTS THAT MATCH MY MEASUREMENTS EXACTLY + xiePutTileReq (32 bytes = 8 words): + photomap_id, x, y, width, height, plane_mask, final(BOOL), pad[3] + -> the word I had been calling "band" (word 5) is **plane_mask**. + xieExportReq (64 bytes = 16 words): + photo_id, drawable_id, gc_id, src_x, src_y, width, height, dst_x, dst_y, + photo_lut_id, colormap_id, match_limit, gray_limit + xieCreateByValueReq: resource_type, resource_id (this build wants 12 words) + Element type numbers (Xie.h): ImportClientPhoto=2, ImportDrawable=4, + ImportPhotomap=7, ExportDrawable=33, ExportClientPhoto=31 + +J) THE BREAKTHROUGH: CLIENT-REACHABLE PutTile, NO DEBUG POKES + SetTransport parameter sweep (plane_mask=1, pixel_stride[0]=1, + scanline_stride[0]=8, compression_scheme=0, component_organization=4 + (=XieK_BitByPlane)): + + mode=0 -> BadValue mode=1 -> ok, ctx[0]=1, PutTile a7=1 BadMatch + mode=2 -> ok, ctx[0]=2 PutTile a7=2 BadMatch + mode=3 -> ok, ctx[0]=3 PutTile ** ok/silent, a7=3 ** <-- PASSES + mode=4,5 -> BadValue + + So: SetTransport copies `mode` into transport-context byte 0, and PutTile's + gate (0x6BAF4) requires that byte to be 3. With mode=3 the import succeeds + with NO pokes -- the entire "debug-poke-dependent" blocker is gone. + object->byte36 becomes 0x00291FB0 from a CLIENT REQUEST (was always 0). + ctx bytes measured: 01 04 00 00 00 00 00 00 01 00 00 00 ... -> ctx[0]=mode, + ctx[1]=component_organization, ctx[8]=plane_mask low byte. + +K) EXPORT NOW ENTERS THE RENDERER + With a populated photomap, Export (minor 21, 16 words, w=64 h=64, unbound + photomap so it is "performed immediately" per XieExport.3X): + export -> ok/silent ; RP(0x1B296) fires ; ** TYPE5 store fires ** + and with w=0,h=0 the renderer is skipped entirely (silent, no trace). + This is the first time the renderer has been entered from a client-driven + request. BUT: src_base (rp+0x610) is still 00000000, and framebuffer captures + (dwt/screenshot.py) for a solid-white tile and a solid-black tile are + effectively identical -- the 1600 differing pixels are the Terminal Manager's + memory figures and the pointer cursor, not our 64x64 window. + +STATUS. Still NO client-chosen XIE image on screen. Window unchanged; white +and black identical in substance; xshow (core X) remains the only viewer that has +displayed an image. What changed this turn is decisive for the mechanism: the +transport layer is now correct and PutTile imports real client data with no pokes. diff --git a/xie/evidence/xie_create_export_probe.txt b/xie/evidence/xie_create_export_probe.txt new file mode 100644 index 0000000..cffff53 --- /dev/null +++ b/xie/evidence/xie_create_export_probe.txt @@ -0,0 +1,113 @@ +XIE 2.3 resource creation / export probe (live, 192.168.99.2:0) +================================================================ + +Client: xie/probe23.py (raw X11, same connection for the whole sequence). +Each request is preceded by minor 1 (INIT_SESSION, declare 2.3). + +Resource IDs +------------ +The X setup reply gives a per-connection resource-id base and mask. One +observed connection: + + id_base = 0x00C00000 id_mask = 0x000FFFFF + +A legal XIE resource id is `base | (n & mask)`, and the slot-8 create handler +additionally rejects ids with bit 19 set: + + rom:00067936 MOVE *A9(0x40),A11,0x1 ; request id (byte 8) + rom:0006793e ANDI -0x100000,A11 ; compare with client resource base + rom:00067950 BTST 0x13,A11 ; bit 19 must be clear + -> BadIDChoice (14) if either check fails + +So `0xC0AAAA` is a usable id; `0xCAAAAA` is not. + +Slot 8 op 2 creates a resource +------------------------------ +Request is exactly 12 words: + + word 0 (byte 4) op = 2 + word 1 (byte 8) new resource id + word 2 (byte 12) param A (must be non-zero) + word 3 (byte 16) param B (must be non-zero) + bytes 42/43/44 8-bit fields (read as three SETF 8 fields) + +Wire result: + + slot 8 op=2, id=0xC0AAAA, A=64, B=64 -> NO PACKETS (success) + then slot 24 (query, id, 0, 0) -> REPLY, length 0 + +Slot 8 op 1 also succeeds, but the resulting resource answers query 24 with +BadAccess (code 10); its byte +0x29 is non-zero. + +Slot 19 (PUT_TILE) on the created resource +------------------------------------------ +Header used: {id, x, y, w, h, count, flags} + data. +Slot 19 hard-codes a lookup type of 3. + + op-1 resource -> BadIDChoice (14) (not type 3 / not found) + op-2 resource -> BadAccess (10) (found, but the access flag is set) + +Slot 21 (EXPORT) on the created resource +---------------------------------------- +Request is exactly 16 words; id at byte 4, then parameters. +Both op-1 and op-2 resources return: + + ERROR code=8 (BadMatch), bad=id, minor_op=21 + +The handler tests resource byte +0x28 bit 0 before anything else: + + rom:00062d88 MOVE *A13(0x20),A11,1 + rom:00062d8c SETF 1,0,0 + rom:00062d8e MOVE *A11(0x28),A7,0 + rom:00062d92 JRNE ok + -> SendError(code=8, bad=id) + +So slot 8 create does not produce an exportable resource. + +Tried without effect +-------------------- +- all 8-bit create fields 0..3 in combination (64 combos per op): + export still BadMatch for every combination. +- slots 15/43/18 as post-create mutators: export still BadMatch. +- slot 7 op 1/2 with a core drawable (root 0x8006B) as the second id: + BadIDChoice on that id — slot 7 only looks up XIE photo resources. + +Conclusion +---------- +The create path for an *exportable* resource (the `+0x28` bit-0 object) is in +the photoflo/pipeline layer (slots 20/43 and the resource class codes), not in +slot 8. That layer is what GHIDRA_XIE_PIPELINE.md is recovering. + +Update after GHIDRA_XIE_PIPELINE.md +----------------------------------- +The `+0x28` bit is **"level array defined"**, not a missing capability. The +create request's level word at byte 28 must be non-zero; `2` means 1 bpp: + + create: op=2, id, w=64@12, h=64@16, level[0]=2@28 + byte41=1 (one band), rest zero + -> NO PACKETS (success), query 24 answers (empty) + +With that, slot 21 no longer returns BadMatch. The export sequence that +succeeds against the live server is: + + create XIE resource (above) + core X CreateWindow 64x64 + MapWindow + CreateGC + slot 21, 16 words: + [id, window, gc, 0, 0, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0] + -> NO PACKETS (success; window is mapped) + +So the XIE create + export path works. The window is **empty** because pixel +import is still blocked: + + slot 19 PUT_TILE, class-2 resource -> BadAccess (code 10) + slot 19 PUT_TILE, class-3 resource -> BadIDChoice (code 14) + band count 3 / three levels does not change either result + +Slot 19 hard-codes lookup type 3; the class-2 resource is found but denied, the +class-3 resource is not found. The missing piece is the exact target/binding +for `PUT_TILE` (or the correct import request for the class-2 sink). That is +the only reason the exported window has no picture. + +Reproducer: `./probe23.py export 5` creates and exports the resource; the +window is visible for 5 seconds. + diff --git a/xie/evidence/xie_export_crop.png b/xie/evidence/xie_export_crop.png new file mode 100644 index 0000000..3cb9115 Binary files /dev/null and b/xie/evidence/xie_export_crop.png differ diff --git a/xie/evidence/xie_export_window_vt1200.png b/xie/evidence/xie_export_window_vt1200.png new file mode 100644 index 0000000..a67fe87 Binary files /dev/null and b/xie/evidence/xie_export_window_vt1200.png differ diff --git a/xie/evidence/xie_export_window_vt1200.txt b/xie/evidence/xie_export_window_vt1200.txt new file mode 100644 index 0000000..a20a052 --- /dev/null +++ b/xie/evidence/xie_export_window_vt1200.txt @@ -0,0 +1,5 @@ +extension opcode=129 first_event=64 +init (1,2w): REPLY len=8 01010200080000000200030020000000e056410050ad8c000000000003000000 +32B +create: NO PACKETS (success or ignored) +export: NO PACKETS (success or ignored) +window 0xc0bbbb up for 1 s; image buffer is empty (PUT_TILE still blocked) diff --git a/xie/evidence/xie_min_client_vt1200.txt b/xie/evidence/xie_min_client_vt1200.txt new file mode 100644 index 0000000..4a7ab0a --- /dev/null +++ b/xie/evidence/xie_min_client_vt1200.txt @@ -0,0 +1,5 @@ +extension present=1 opcode=129 first_event=64 first_error=0 +init (1,2w): REPLY len=8 010102000800000002000300f09b7c0070db2000050000000000000050b88f00 +qdefs (3,2w): REPLY len=0 0141030000000000000000001400000000000000000000000000000000000000 +qevents(6,1w): REPLY len=0 0100040000000000020000000001000000010000000100000000000000000000 +term (2,1w): TIMEOUT diff --git a/xie/evidence/xie_protocol_spec_found.txt b/xie/evidence/xie_protocol_spec_found.txt new file mode 100644 index 0000000..b27475e --- /dev/null +++ b/xie/evidence/xie_protocol_spec_found.txt @@ -0,0 +1,80 @@ +THE XIE PROTOCOL SPECIFICATION WAS FOUND, WITH THE PHOTOFLO ELEMENT ENCODING. + +Source (the same FTP mirror that yielded xieSIarch.txt): + https://ftp5.gwdg.de/pub/xfree86/XFree86/4.2.0/doc/ + XIEProto.TXT 291988 bytes "X Image Extension Protocol", Version 5.02, + X11R6.3, Dec 1996, (c) DEC/X Consortium/AGE Logic + photoflo=343 photomap=132 + xielib.TXT 297381 bytes photoflo=267 photomap=110 + overview_xie.TXT 26659 bytes + Saved to xie/docs/dec/ (XIEProto.TXT, xielib.TXT, overview_xie.TXT). + NOTE: this is the document whose vocabulary matches the VT1200 (photoflo / + photomap). The X11R4 "contrib" specs already in xie/docs/x11r4/ have ZERO + photoflo hits -- they are a different lineage. + +WHAT IT DEFINES (verbatim structures) + +1. PhotoElement subpacket (a subpacket INSIDE a photoflo request, not a request): + 2 bytes CARD16 Element type + 2 bytes CARD16 Element length (bytes divided by 4) + multiple of 2 XieTyp(Phototag|Tile) element's data source(s), if required + N parameters as required by element type + < 4 pad to a multiple of 4 + "A photo element consists of four (4) bytes of header followed by zero (0) or + more bytes of element input connection definitions and by ... additional data." + +2. Element list / phototag rules (chapter 5): + - the protocol representation of a Photoflo IS a list of elements, sent as ONE + request; its total length must fit in maximum-request-length; + - each element is identified by its POSITION in the list = Phototag; the first + element is index ONE (1); phototag 0 is reserved; + - "the order of elements in the list does not have to match the Photoflo + topology ... the source for each element's input connections are explicitly + specified using the Phototags of upstream elements"; + - three element kinds: Import (no inputs, 1 output), Process (>=1 input, 1 + output), Export (1 input, no output). A useful Photoflo has >=1 import and + >=1 export. + +3. Request encodings (v5.02 minor numbers): + CreatePhotoflo minor 17 length 3+n/4 + photoflo(4) | CARD16 #elements | 2 unused | element-list + ExecuteImmediate minor 16 length 4+n/4 + Executable(8) | CARD16 #elements | BOOL notify | 1 unused | element-list + ExecutePhotoflo minor 19 length 3 + photoflo(4) | BOOL notify | 3 unused + ModifyPhotoflo minor 20 ; RedefinePhotoflo minor 21 ; + DestroyPhotoflo minor 18 + PutClientData minor 22 (client -> ImportClient element; phototag + band) + GetClientData minor 23 + And: "CreatePhotoflo ... no action is taken to validate them at that time. + CreatePhotoflo will only STORE the Photoflo's definition; parameter validation + is delayed until an execute request is received." + +4. Photomap (7.2.3 / XieTypPhotomap): the resource that stores image data; + ImportPhotomap brings it into a flo, ExportPhotomap re-populates it. + +MEASURED AGAINST THE VT1200 THIS TURN + + slot 18 is the only handler whose length gate is a MINIMUM (>=4) and it reads + w0 (0x20) plus request BYTE 13 (0x68) -- that is exactly the shape of + CreatePhotoflo (photoflo id in w0; the element-type CARD16 of the first + element straddles bytes 12-13). But the v5.02 numbering does not hold: + slot18 with a NEW id + 3 header-only elements + [FLO, 3, 0x00010001, 0x00010002, 0x00010003] (len = 6 words) + -> err14 (BadIDChoice) bad = the new id, and NOTHING registers + So on this server slot 18 operates on an EXISTING resource, i.e. it is a + modify/execute-family request, not CreatePhotoflo. (Earlier: an existing + class-2 resource and an existing class-1 photoflo both gave BadAccess(10).) + + The shared lookup's BadAccess site was also read exactly: + 6BAB2 A7 = *A13(0xff20) ; JRLT 0x6BABC + 6BAB8 A7 = *A11 ; JRNE 0x6BAEA ; value != 0 -> gate path + 6BABC A7 = *A13(0xff20) ; JRLT 0x6BBCE ; < 0 -> skip + 6BAC6 MOVK 0xa -> BadAccess ; only when >=0 AND *A11 == 0 + i.e. BadAccess requires the caller-supplied signed local at frame 0xff20 to be + >= 0 while the dereferenced caller pointer holds 0. + +STATUS. No client-chosen XIE image. src_base (rp+0x610) 0 in every run, the +window never differs from the no-export baseline, and xshow (core X) is still the +only viewer that has displayed an image. What changed: the element wire format is +now READ rather than guessed. diff --git a/xie/evidence/xie_raw.py b/xie/evidence/xie_raw.py new file mode 100644 index 0000000..d8a9de9 --- /dev/null +++ b/xie/evidence/xie_raw.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python3 +"""Minimal X11 client: send one raw XIE request and report the response. + +Used to probe the VT1200's XIE 2.3 request sizes/opcodes without XIElib. +Read-only probes only. +""" +import socket +import struct +import sys + +HOST, PORT = "192.168.99.2", 6000 +LAST_SETUP = {} + + +def read_exact(sock, n): + buf = b"" + while len(buf) < n: + chunk = sock.recv(n - len(buf)) + if not chunk: + raise EOFError("server closed connection") + buf += chunk + return buf + + +def setup(sock): + # little-endian, protocol 11.0, no auth + sock.sendall(struct.pack("= 32: + LAST_SETUP.update( + release=struct.unpack(" 21 else 0 + off = 32 + ((vendor_len + 3) // 4) * 4 + n_formats * 8 + if len(body) >= off + 40: + LAST_SETUP.update( + root=struct.unpack("= 1 else b"" + req = struct.pack(" REPLY, reply length 8 (8 CARD32 levels) + bytes 8.. : 02 00 03 00 20 00 00 00 e0 56 41 00 ... + -> server major 2, minor 3, service class 0x20, alignment 0 +words=3,4 -> BadLength + +Request length map (BadLength = error 16, BadRequest = 1, BadIDChoice = 14) +--------------------------------------------------------------------------- +minor 1 (QueryImageExtension): WORKS at 2 words +minor 2 (5.0 QueryTechniques): 1 word -> TIMEOUT; 2..12 words -> BadLength, + and every BadLength reports minor_op=0 (not 2) +minor 6 (5.0 QueryColorList): 1 word -> REPLY len=0 (no arguments!); + 2..8 words -> BadLength +minor 11 (5.0 QueryPhotomap): 3 words -> BadIDChoice (dispatched); + 1,2,4..6 -> BadLength +minor 23 (5.0 GetClientData): BadRequest at every length (not implemented) +minor 24 (5.0 QueryPhotoflo): 4 words -> BadIDChoice (dispatched); + 1..3,5..6 -> BadLength + +Interpretation +-------------- +The server dispatches 2.3 requests with sizes that differ from XIE 5.0: + - QueryColorList takes no color-list id (5.0 takes 8 bytes). + - QueryPhotomap takes 3 words (5.0: 2). + - QueryPhotoflo takes 4 words (5.0: 3). + - QueryTechniques is absent or different: no length works. + - GetClientData does not exist. + +The BadLength path reports minor_op=0, whereas handler-level errors +(BadIDChoice) report the real minor opcode. So minor 0 in the error is a +server-side dispatcher artefact, not a malformed client request. + +xieperf consequence +------------------- +xieperf 5.0 calls QueryTechniques (minor 2) during capability setup, which is +why it dies immediately after "Class name: ColorAlloc"; the wire request is +`81 02 02 00 0c 00 00 00` (X_ieQueryTechniques, techniqueGroup=12). diff --git a/xie/evidence/xieperf_import1_vt1200.txt b/xie/evidence/xieperf_import1_vt1200.txt new file mode 100644 index 0000000..f6dadcf --- /dev/null +++ b/xie/evidence/xieperf_import1_vt1200.txt @@ -0,0 +1,19 @@ +xieperf - XIE performance program, version 1.0 + +XIE V2.3 +FULL server +Screen visual class is StaticGray +Colormap has 2 entries +Effective depth is 1-bit + +DECWINDOWS DigitalEquipmentCorp. server version 11 on 192.168.99.2:0 +from sid +Sun Nov 1 12:59:34 2026 + +Sync time adjustment is 0.0000 msecs. + +X Error of failed request: BadLength (poly request too large or internal Xlib length error) + Major opcode of failed request: 129 (Xie) + Minor opcode of failed request: 0 () + Serial number of failed request: 34 + Current serial number in output stream: 34 diff --git a/xie/evidence/xieperf_import_vt1200.txt b/xie/evidence/xieperf_import_vt1200.txt new file mode 100644 index 0000000..f38cd69 --- /dev/null +++ b/xie/evidence/xieperf_import_vt1200.txt @@ -0,0 +1,35 @@ +usage: ./build/xieperf/xieperf [-options ...] +where options include: + -display the XIE server to contact + -images path to images supplied with this software, + defaults to ./images if flag not specified + -timeout timeout value for certain tests (default=60 secs) + -sync do the tests in synchronous mode + -script file read tests from a file, ``-'' to use console + -repeat do tests times (outer loop) (default = 2) + -time do tests for seconds each (default = 5) + -depth use a visual with planes per pixel + -GrayScale use a GrayScale visual + -StaticGray use a StaticGray visual + -StaticColor use a StaticColor visual + -PseudoColor use a PseudoColor visual + -TrueColor use a TrueColor visual + -DirectColor use a DirectColor visual + -WMSafe let window manager install colormap + -showtechs print supported techniques + -showlabels print test label to screen before calibration + -showevents for error and event tests, display as received + -events include event tests + -errors include error tests + -loCal no calibration, fix reps to 5 ( -reps overrides this ) + -all do all tests + -tests generate a list of all tests + -mkscript generate script file to stderr ( recognizes -repeat and -reps ) + -cache cache up to n photomaps in server + -labels print test labels ( use -all or -range to specify tests ) + -DIS run DIS subset tests only ( use -all or -range to specify tests ) + -range [,] like all, but do to + -reps fix the inner loop rep count (default = auto scale) + +./build/xieperf/xieperf -display 192.168.99.2:0 -range Import -time 1 -reps 1 -loCal + diff --git a/xie/evidence/xieperf_showtechs_vt1200.txt b/xie/evidence/xieperf_showtechs_vt1200.txt new file mode 100644 index 0000000..b20b9d9 --- /dev/null +++ b/xie/evidence/xieperf_showtechs_vt1200.txt @@ -0,0 +1,21 @@ +xieperf - XIE performance program, version 1.0 + +XIE V2.3 +FULL server +Screen visual class is StaticGray +Colormap has 2 entries +Effective depth is 1-bit + +DECWINDOWS DigitalEquipmentCorp. server version 11 on 192.168.99.2:0 +from sid +Sun Nov 1 12:58:08 2026 + +Sync time adjustment is 14.2710 msecs. + +Class name: ColorAlloc +X Error of failed request: BadLength (poly request too large or internal Xlib length error) + Major opcode of failed request: 129 (Xie) + Minor opcode of failed request: 0 () + Serial number of failed request: 300 + Current serial number in output stream: 300 + Technique ColorAllocAll: \ No newline at end of file diff --git a/xie/evidence/xieprobe_vt1200.txt b/xie/evidence/xieprobe_vt1200.txt new file mode 100644 index 0000000..2922ee3 --- /dev/null +++ b/xie/evidence/xieprobe_vt1200.txt @@ -0,0 +1,4 @@ +extensions (2): [ServerManagementExtension] [Xie] +XQueryExtension("XIE") = 0, opcode=0 event=47 error=0 +XQueryExtension("Xie") = 1, opcode=129 event=64 error=0 +XQueryExtension("xie") = 0, opcode=0 event=47 error=0 diff --git a/xie/evidence/xshow_vt1200.txt b/xie/evidence/xshow_vt1200.txt new file mode 100644 index 0000000..f4915e2 --- /dev/null +++ b/xie/evidence/xshow_vt1200.txt @@ -0,0 +1,2 @@ +xshow: displayed 320x240 checker on 192.168.99.2:0; source on-pixels=38400 window on-pixels=38400 MATCH +xshow: core X fallback window; XIE 2.3 export path is separate diff --git a/xie/ghidra-evidence/dispatch_table.txt b/xie/ghidra-evidence/dispatch_table.txt new file mode 100644 index 0000000..90b3fbc --- /dev/null +++ b/xie/ghidra-evidence/dispatch_table.txt @@ -0,0 +1,70 @@ +XIE 2.3 dispatch tables, dumped straight out of the ROM image. +Ghidra session afdab6e16b8240f294d45a5309f7caa3, program vt1200_v22.bin +(raw binary, base rom:00000000 == file offset 0, md5 b46a3e442ccb86134d2356bd70d22fd2) + +Encodings + ghidra_byte = (mame_bit - 0x3F200000) / 8 + mame_bit = 0x3F200000 + ghidra_byte * 8 + +Three 46-entry CARD32 arrays (bit addresses) live back to back, each preceded +by its own {CARD16, CARD32} install record: + 0x18D8E8 -> RAM 0xD3F90 proc table (used by XieProc) + 0x18D9A6 -> RAM 0xD4550 swapped proc table (used by XieSProc) + 0x18DA64 -> RAM 0xD4B10 REPLY-swap table (used inside the five query + handlers; only slots 1,3,6,10,24 are non-stub) +NOTE: the "swapped" columns printed below are the 0x18DA64 array, i.e. the +reply-swap table, not the swapped-proc table. See GHIDRA_XIE_HANDLERS.md. + 0x18D8E2: CARD16 0x005C CARD32 0x000D3F90 <- proc table + 0x18D9A0: CARD16 0x005C CARD32 0x000D4550 <- swapped proc table + 0x18DA5E: CARD16 0x005C CARD32 0x000D4B10 <- reply-swap table + +idx main(bit) main_off swapped(bit) swap_off + 0 3F5261E0 064C3C 3F5261E0 064C3C + 1 3F545260 068A4C 3F5491E0 06923C + 2 3F546D30 068DA6 3F5261E0 064C3C + 3 3F3FEBC0 03FD78 3F549620 0692C4 + 4 3F3FF030 03FE06 3F5261E0 064C3C + 5 3F546EE0 068DDC 3F5261E0 064C3C + 6 3F547630 068EC6 3F549980 069330 + 7 3F534330 066866 3F5261E0 064C3C + 8 3F534720 0668E4 3F5261E0 064C3C + 9 3F534C70 06698E 3F5261E0 064C3C + 10 3F535B20 066B64 3F549CA0 069394 + 11 3F533DB0 0667B6 3F5261E0 064C3C + 12 3F5339C0 066738 3F5261E0 064C3C + 13 3F535470 066A8E 3F5261E0 064C3C + 14 3F5361A0 066C34 3F5261E0 064C3C + 15 3F5529B0 06A536 3F5261E0 064C3C + 16 3F5261E0 064C3C 3F5261E0 064C3C + 17 3F5261E0 064C3C 3F5261E0 064C3C + 18 3F552D20 06A5A4 3F5261E0 064C3C + 19 3F553B70 06A76E 3F5261E0 064C3C + 20 3F5552A0 06AA54 3F5261E0 064C3C + 21 3F516A00 062D40 3F5261E0 064C3C + 22 3F5187A0 0630F4 3F5261E0 064C3C + 23 3F5261E0 064C3C 3F5261E0 064C3C + 24 3F518AF0 06315E 3F54AFC0 0695F8 + 25 3F5261E0 064C3C 3F5261E0 064C3C + 26 3F5261E0 064C3C 3F5261E0 064C3C + 27 3F5261E0 064C3C 3F5261E0 064C3C + 28 3F5261E0 064C3C 3F5261E0 064C3C + 29 3F5261E0 064C3C 3F5261E0 064C3C + 30 3F5261E0 064C3C 3F5261E0 064C3C + 31 3F5261E0 064C3C 3F5261E0 064C3C + 32 3F5261E0 064C3C 3F5261E0 064C3C + 33 3F526640 064CC8 3F5261E0 064C3C + 34 3F5261E0 064C3C 3F5261E0 064C3C + 35 3F5261E0 064C3C 3F5261E0 064C3C + 36 3F5261E0 064C3C 3F5261E0 064C3C + 37 3F5261E0 064C3C 3F5261E0 064C3C + 38 3F5261E0 064C3C 3F5261E0 064C3C + 39 3F5261E0 064C3C 3F5261E0 064C3C + 40 3F529310 065262 3F5261E0 064C3C + 41 3F5261E0 064C3C 3F5261E0 064C3C + 42 3F5261E0 064C3C 3F5261E0 064C3C + 43 3F52B000 065600 3F5261E0 064C3C + 44 3F52E550 065CAA 3F5261E0 064C3C + 45 3F5261E0 064C3C 3F5261E0 064C3C + +0x64C3C is the shared "not implemented" stub (returns/sends BadRequest). +Only 9 slots have a distinct swapped handler: 1, 3, 6, 10, 24. diff --git a/xie/ghidra-evidence/handlers/client_session.txt b/xie/ghidra-evidence/handlers/client_session.txt new file mode 100644 index 0000000..4a7ab0a --- /dev/null +++ b/xie/ghidra-evidence/handlers/client_session.txt @@ -0,0 +1,5 @@ +extension present=1 opcode=129 first_event=64 first_error=0 +init (1,2w): REPLY len=8 010102000800000002000300f09b7c0070db2000050000000000000050b88f00 +qdefs (3,2w): REPLY len=0 0141030000000000000000001400000000000000000000000000000000000000 +qevents(6,1w): REPLY len=0 0100040000000000020000000001000000010000000100000000000000000000 +term (2,1w): TIMEOUT diff --git a/xie/ghidra-evidence/handlers/slot00_064C3C.txt b/xie/ghidra-evidence/handlers/slot00_064C3C.txt new file mode 100644 index 0000000..8daa20e --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot00_064C3C.txt @@ -0,0 +1,857 @@ +rom:00064c3c MMTM SP,0x154 +rom:00064c40 MOVE A14,A13 +rom:00064c42 MOVE *A13(0xffe0),A11,0x1 +rom:00064c46 MOVE *A11(0x40),A9,0x1 +rom:00064c4a MOVE A14,-*SP,0x1 +rom:00064c4c MOVK 0x1,A7 +rom:00064c4e MOVE A7,*A14+,0x1 +rom:00064c50 SUB A7,A7 +rom:00064c52 MOVE A7,*A14+,0x1 +rom:00064c54 SETF 0x8,0x0,0x0 +rom:00064c56 MOVE *A9(0x8),A8,0x0 +rom:00064c5a MOVE A8,*A14+,0x1 +rom:00064c5c MOVE 0x1ad960,*A14+,0x1 +rom:00064c62 MOVE A11,*A14+,0x1 +rom:00064c64 CALLA 0x07effa5e +rom:00064c6a MOVK 0x1,A8 +rom:00064c6c MOVE *SP(0xa0),A14,0x1 +rom:00064c70 MMFM SP,0x2a80 +rom:00064c76 RL B10,B8 +rom:00064cc8 MMTM SP,0x554 +rom:00064ccc MOVE A14,A13 +rom:00064cce ADDI 0x180,A14 +rom:00064cd2 MOVE *A13(0xffe0),A11,0x1 +rom:00064cd6 MOVE *A11(0x40),A9,0x1 +rom:00064cda SETF 0x10,0x0,0x0 +rom:00064cdc MOVE *A9(0x10),A11,0x0 +rom:00064ce0 SUBK 0x4,A11 +rom:00064ce2 JREQ 0x00064cea +rom:00064ce4 MOVK 0x10,A8 +rom:00064ce6 JR 0x00065258 +rom:00064cea MOVE A14,-*SP,0x1 +rom:00064cec MOVE *A9(0x40),*A14+,0x1 +rom:00064cf0 MOVE *A9(0x20),*A14+,0x1 +rom:00064cf4 MOVE A13,A11 +rom:00064cf6 ADDI 0xa0,A11 +rom:00064cfa MOVE A11,*A14+,0x1 +rom:00064cfc MOVE A13,A7 +rom:00064cfe ADDI 0x80,A7 +rom:00064d02 MOVE A7,*A14+,0x1 +rom:00064d04 MOVE *A13(0xffe0),*A14+,0x1 +rom:00064d08 CALLA 0x07ea6fa0 +rom:00064d0e MOVE A8,*A13(0x160),0x1 +rom:00064d12 MOVE A8,A8 +rom:00064d14 JRNE 0x00065258 +rom:00064d18 MOVE *A9(0x60),A7,0x1 +rom:00064d1c JRNE 0x00064d60 +rom:00064d1e MOVE A14,-*SP,0x1 +rom:00064d20 MOVE *A13(0xe0),*A14+,0x1 +rom:00064d24 MOVE *A13(0xa0),*A14+,0x1 +rom:00064d28 CALLA 0x07ea6004 +rom:00064d2e MOVE *A13(0xe0),A7,0x1 +rom:00064d32 MOVE *A7(0x40),A11,0x1 +rom:00064d36 JRNE 0x00064d86 +rom:00064d38 MOVE A14,-*SP,0x1 +rom:00064d3a MOVK 0xb,A11 +rom:00064d3c MOVE A11,*A14+,0x1 +rom:00064d3e SUB A11,A11 +rom:00064d40 MOVE A11,*A14+,0x1 +rom:00064d42 SETF 0x8,0x0,0x0 +rom:00064d44 MOVE *A9(0x8),A8,0x0 +rom:00064d48 MOVE A8,*A14+,0x1 +rom:00064d4a MOVE 0x1ad960,*A14+,0x1 +rom:00064d50 MOVE *A13(0xffe0),*A14+,0x1 +rom:00064d54 CALLA 0x07effa5e +rom:00064d5a MOVK 0xb,A8 +rom:00064d5c JR 0x00065258 +rom:00064d60 MOVE A14,-*SP,0x1 +rom:00064d62 MOVK 0x5,A7 +rom:00064d64 MOVE A7,*A14+,0x1 +rom:00064d66 MOVE *A9(0x60),*A14+,0x1 +rom:00064d6a MOVE A13,A7 +rom:00064d6c ADDI 0xe0,A7 +rom:00064d70 MOVE A7,*A14+,0x1 +rom:00064d72 MOVE *A13(0xffe0),*A14+,0x1 +rom:00064d76 CALLA 0x07ea6e70 +rom:00064d7c MOVE A8,*A13(0x160),0x1 +rom:00064d80 MOVE A8,A8 +rom:00064d82 JRNE 0x00065258 +rom:00064d86 MOVE *A13(0xe0),A11,0x1 +rom:00064d8a MOVE *A11(0x40),A7,0x1 +rom:00064d8e MOVE *A7(0xa8),A7,0x1 +rom:00064d92 JRLT 0x00064e52 +rom:00064d94 MOVE *A11(0x40),A7,0x1 +rom:00064d98 MOVE *A13(0xa0),A11,0x1 +rom:00064d9c MOVE *A7(0xa8),A7,0x1 +rom:00064da0 MOVE *A11(0x80),A11,0x1 +rom:00064da4 CMP A11,A7 +rom:00064da6 JRNC 0x00064e52 +rom:00064da8 MOVE *A13(0xe0),A11,0x1 +rom:00064dac MOVE *A11(0x40),A7,0x1 +rom:00064db0 MOVE *A7(0xe8),A7,0x1 +rom:00064db4 JRLT 0x00064e52 +rom:00064db6 MOVE *A11(0x40),A7,0x1 +rom:00064dba MOVE *A13(0xa0),A11,0x1 +rom:00064dbe MOVE *A7(0xe8),A7,0x1 +rom:00064dc2 MOVE *A11(0xa0),A11,0x1 +rom:00064dc6 CMP A11,A7 +rom:00064dc8 JRNC 0x00064e52 +rom:00064dca MOVE *A13(0xe0),A11,0x1 +rom:00064dce MOVE *A11(0x40),A7,0x1 +rom:00064dd2 MOVE *A7(0x128),A7,0x1 +rom:00064dd6 JREQ 0x00064e52 +rom:00064dd8 MOVE *A11(0x40),A7,0x1 +rom:00064ddc MOVE *A13(0xa0),A11,0x1 +rom:00064de0 MOVE *A7(0x128),A7,0x1 +rom:00064de4 MOVE *A11(0x80),A11,0x1 +rom:00064de8 CMP A11,A7 +rom:00064dea JRHI 0x00064e52 +rom:00064dec MOVE *A13(0xe0),A11,0x1 +rom:00064df0 MOVE *A11(0x40),A7,0x1 +rom:00064df4 MOVE *A7(0x148),A7,0x1 +rom:00064df8 JREQ 0x00064e52 +rom:00064dfa MOVE *A11(0x40),A7,0x1 +rom:00064dfe MOVE *A13(0xa0),A11,0x1 +rom:00064e02 MOVE *A7(0x148),A7,0x1 +rom:00064e06 MOVE *A11(0xa0),A11,0x1 +rom:00064e0a CMP A11,A7 +rom:00064e0c JRHI 0x00064e52 +rom:00064e0e MOVE *A13(0xe0),A11,0x1 +rom:00064e12 MOVE *A11(0x40),A7,0x1 +rom:00064e16 MOVE *A11(0x40),A11,0x1 +rom:00064e1a MOVE *A7(0xa8),A7,0x1 +rom:00064e1e MOVE *A11(0x128),A11,0x1 +rom:00064e22 ADD A11,A7 +rom:00064e24 MOVE *A13(0xa0),A11,0x1 +rom:00064e28 MOVE *A11(0x80),A11,0x1 +rom:00064e2c CMP A11,A7 +rom:00064e2e JRHI 0x00064e52 +rom:00064e30 MOVE *A13(0xe0),A11,0x1 +rom:00064e34 MOVE *A11(0x40),A7,0x1 +rom:00064e38 MOVE *A11(0x40),A11,0x1 +rom:00064e3c MOVE *A7(0xe8),A7,0x1 +rom:00064e40 MOVE *A11(0x148),A11,0x1 +rom:00064e44 ADD A11,A7 +rom:00064e46 MOVE *A13(0xa0),A11,0x1 +rom:00064e4a MOVE *A11(0xa0),A11,0x1 +rom:00064e4e CMP A11,A7 +rom:00064e50 JRLS 0x00064ea0 +rom:00064e52 MOVE A14,-*SP,0x1 +rom:00064e54 MOVI 0x3f532380,A8 +rom:00064e5a MOVE A8,*A14+,0x1 +rom:00064e5c CALLA 0x07f24f78 +rom:00064e62 MOVE *A9(0x60),A11,0x1 +rom:00064e66 JRNE 0x00064e78 +rom:00064e68 MOVE A14,-*SP,0x1 +rom:00064e6a MOVE *A13(0xe0),A11,0x1 +rom:00064e6e MOVE *A11(0x40),*A14+,0x1 +rom:00064e72 CALLA 0x07f63b00 +rom:00064e78 MOVE A14,-*SP,0x1 +rom:00064e7a MOVK 0x2,A11 +rom:00064e7c MOVE A11,*A14+,0x1 +rom:00064e7e SUB A7,A7 +rom:00064e80 MOVE A7,*A14+,0x1 +rom:00064e82 SETF 0x8,0x0,0x0 +rom:00064e84 MOVE *A9(0x8),A8,0x0 +rom:00064e88 MOVE A8,*A14+,0x1 +rom:00064e8a MOVE 0x1ad960,*A14+,0x1 +rom:00064e90 MOVE *A13(0xffe0),*A14+,0x1 +rom:00064e94 CALLA 0x07effa5e +rom:00064e9a MOVE A11,A8 +rom:00064e9c JR 0x00065258 +rom:00064ea0 SUB A11,A11 +rom:00064ea2 MOVE A11,*A13,0x1 +rom:00064ea4 MOVE *A13(0xa0),A7,0x1 +rom:00064ea8 SETF 0x8,0x0,0x0 +rom:00064eaa MOVE *A7(0x48),A7,0x0 +rom:00064eae CMP A7,A11 +rom:00064eb0 JRNC 0x00064ee2 +rom:00064eb2 MOVE *A13,A11,0x1 +rom:00064eb4 SLL 0x5,A11 +rom:00064eb6 ADD A13,A11 +rom:00064eb8 MOVE *A13(0xa0),A7,0x1 +rom:00064ebc MOVE *A7(0x160),A5,0x1 +rom:00064ec0 MOVE *A13,A7,0x1 +rom:00064ec2 SLL 0x5,A7 +rom:00064ec4 ADD A7,A5 +rom:00064ec6 MOVE *A5(0xd8),A7,0x1 +rom:00064eca MOVE *A7(0x1a8),*A11(0x20),0x1 +rom:00064ed0 MOVE *A13,A11,0x1 +rom:00064ed2 INC A11 +rom:00064ed4 MOVE A11,*A13,0x1 +rom:00064ed6 MOVE *A13(0xa0),A7,0x1 +rom:00064eda MOVE *A7(0x48),A5,0x0 +rom:00064ede CMP A5,A11 +rom:00064ee0 JRC 0x00064eb2 +rom:00064ee2 MOVE A14,-*SP,0x1 +rom:00064ee4 MOVE *A13(0x80),A7,0x1 +rom:00064ee8 MOVK 0x1,A5 +rom:00064eea JREQ 0x00064eee +rom:00064eec SUB A5,A5 +rom:00064eee MOVE A5,*A14+,0x1 +rom:00064ef0 MOVE *A13(0xe0),A5,0x1 +rom:00064ef4 MOVE *A5(0x40),A5,0x1 +rom:00064ef8 MOVE *A5(0x148),*A14+,0x1 +rom:00064efc MOVE *A13(0xe0),A5,0x1 +rom:00064f00 MOVE *A5(0x40),A5,0x1 +rom:00064f04 MOVE *A5(0x128),*A14+,0x1 +rom:00064f08 MOVE *A13(0xa0),A5,0x1 +rom:00064f0c MOVE *A5(0x50),A8,0x0 +rom:00064f10 MOVE A8,*A14+,0x1 +rom:00064f12 MOVE *A5(0x60),A8,0x0 +rom:00064f16 MOVE A8,*A14+,0x1 +rom:00064f18 MOVE *A5(0x58),A8,0x0 +rom:00064f1c MOVE A8,*A14+,0x1 +rom:00064f1e MOVE *A5(0xc0),*A14+,0x1 +rom:00064f22 MOVE *A5(0xe0),*A14+,0x1 +rom:00064f26 MOVE A13,A5 +rom:00064f28 ADDK 0x0,A5 +rom:00064f2a MOVE A5,*A14+,0x1 +rom:00064f2c MOVE *A13(0xa0),A5,0x1 +rom:00064f30 MOVE *A5(0x40),A8,0x0 +rom:00064f34 MOVE A8,*A14+,0x1 +rom:00064f36 CALLA 0x07eaca82 +rom:00064f3c MOVE A8,*A13(0xc0),0x1 +rom:00064f40 MOVE A8,A8 +rom:00064f42 JRNE 0x00064f82 +rom:00064f44 MOVE *A9(0x60),A5,0x1 +rom:00064f48 JRNE 0x00064f5a +rom:00064f4a MOVE A14,-*SP,0x1 +rom:00064f4c MOVE *A13(0xe0),A5,0x1 +rom:00064f50 MOVE *A5(0x40),*A14+,0x1 +rom:00064f54 CALLA 0x07f63b00 +rom:00064f5a MOVE A14,-*SP,0x1 +rom:00064f5c MOVK 0xb,A5 +rom:00064f5e MOVE A5,*A14+,0x1 +rom:00064f60 MOVE *A9(0x40),*A14+,0x1 +rom:00064f64 SETF 0x8,0x0,0x0 +rom:00064f66 MOVE *A9(0x8),A8,0x0 +rom:00064f6a MOVE A8,*A14+,0x1 +rom:00064f6c MOVE 0x1ad960,*A14+,0x1 +rom:00064f72 MOVE *A13(0xffe0),*A14+,0x1 +rom:00064f76 CALLA 0x07effa5e +rom:00064f7c MOVE A5,A8 +rom:00064f7e JR 0x00065258 +rom:00064f82 MOVE A7,A7 +rom:00064f84 JREQ 0x000650ba +rom:00064f88 MOVE A14,-*SP,0x1 +rom:00064f8a MOVE *A13(0xe0),A5,0x1 +rom:00064f8e MOVE *A5(0x40),A5,0x1 +rom:00064f92 MOVE *A5(0x148),*A14+,0x1 +rom:00064f96 MOVE *A13(0xe0),A5,0x1 +rom:00064f9a MOVE *A5(0x40),A5,0x1 +rom:00064f9e MOVE *A5(0x128),*A14+,0x1 +rom:00064fa2 MOVE *A13(0xe0),A5,0x1 +rom:00064fa6 MOVE *A5(0x40),A5,0x1 +rom:00064faa MOVE *A5(0xe8),*A14+,0x1 +rom:00064fae MOVE *A13(0xe0),A5,0x1 +rom:00064fb2 MOVE *A5(0x40),A5,0x1 +rom:00064fb6 MOVE *A5(0xa8),*A14+,0x1 +rom:00064fba MOVE *A8(0x160),*A14+,0x1 +rom:00064fbe MOVE *A13(0xa0),A5,0x1 +rom:00064fc2 MOVE *A5(0x160),*A14+,0x1 +rom:00064fc6 MOVE *A7(0x80),*A14+,0x1 +rom:00064fca SETF 0x8,0x0,0x0 +rom:00064fcc MOVE *A9(0x8),A5,0x0 +rom:00064fd0 SLL 0x5,A5 +rom:00064fd2 ADDI 0xd5730,A5 +rom:00064fd8 MOVE *A5,A5,0x1 +rom:00064fda CALL A5 +rom:00064fdc MOVE A8,*A13(0x140),0x1 +rom:00064fe0 MOVE A8,A5 +rom:00064fe2 JREQ 0x00065030 +rom:00064fe4 MOVE A14,-*SP,0x1 +rom:00064fe6 MOVE *A13(0xc0),*A14+,0x1 +rom:00064fea CALLA 0x07eacdda +rom:00064ff0 MOVE *A9(0x60),A5,0x1 +rom:00064ff4 JRNE 0x00065006 +rom:00064ff6 MOVE A14,-*SP,0x1 +rom:00064ff8 MOVE *A13(0xe0),A5,0x1 +rom:00064ffc MOVE *A5(0x40),*A14+,0x1 +rom:00065000 CALLA 0x07f63b00 +rom:00065006 MOVE A14,-*SP,0x1 +rom:00065008 MOVE *A13(0x140),*A14+,0x1 +rom:0006500c SUB A5,A5 +rom:0006500e MOVE A5,*A14+,0x1 +rom:00065010 SETF 0x8,0x0,0x0 +rom:00065012 MOVE *A9(0x8),A8,0x0 +rom:00065016 MOVE A8,*A14+,0x1 +rom:00065018 MOVE 0x1ad960,*A14+,0x1 +rom:0006501e MOVE *A13(0xffe0),*A14+,0x1 +rom:00065022 CALLA 0x07effa5e +rom:00065028 MOVE *A13(0x140),A8,0x1 +rom:0006502c JR 0x00065258 +rom:00065030 MOVE A14,-*SP,0x1 +rom:00065032 MOVK 0x1,A5 +rom:00065034 MOVE A5,*A14+,0x1 +rom:00065036 MOVE *A13(0xc0),*A14+,0x1 +rom:0006503a MOVE A7,*A14+,0x1 +rom:0006503c CALLA 0x07ea72a4 +rom:00065042 MOVE A8,A8 +rom:00065044 JRNE 0x00065240 +rom:00065048 MOVE A14,-*SP,0x1 +rom:0006504a MOVE *A13(0xc0),*A14+,0x1 +rom:0006504e CALLA 0x07eacdda +rom:00065054 MOVE *A7(0x80),A5,0x1 +rom:00065058 MOVE *A5(0x20),*A13(0x100),0x1 +rom:0006505e MOVE A14,-*SP,0x1 +rom:00065060 MOVE *A13(0x100),*A14+,0x1 +rom:00065064 MOVE *A13(0x100),A5,0x1 +rom:00065068 MOVE *A5(0x60),A5,0x1 +rom:0006506c MOVE *A5(0xe0),A5,0x1 +rom:00065070 CALL A5 +rom:00065072 MOVE *A13(0x100),A5,0x1 +rom:00065076 MOVE *A5(0x20),A5,0x1 +rom:0006507a MOVE *A13(0x100),A7,0x1 +rom:0006507e MOVE *A7,*A5,0x1 +rom:00065080 MOVE *A7,A5,0x1 +rom:00065082 MOVE *A7(0x20),*A5(0x20),0x1 +rom:00065088 MOVE A14,-*SP,0x1 +rom:0006508a MOVE A7,*A14+,0x1 +rom:0006508c CALLA 0x07f63b18 +rom:00065092 MOVE A14,-*SP,0x1 +rom:00065094 MOVK 0xb,A5 +rom:00065096 MOVE A5,*A14+,0x1 +rom:00065098 MOVE *A9(0x40),*A14+,0x1 +rom:0006509c SETF 0x8,0x0,0x0 +rom:0006509e MOVE *A9(0x8),A8,0x0 +rom:000650a2 MOVE A8,*A14+,0x1 +rom:000650a4 MOVE 0x1ad960,*A14+,0x1 +rom:000650aa MOVE *A13(0xffe0),*A14+,0x1 +rom:000650ae CALLA 0x07effa5e +rom:000650b4 MOVE A5,A8 +rom:000650b6 JR 0x00065258 +rom:000650ba MOVE A14,-*SP,0x1 +rom:000650bc MOVI 0xc8,A5 +rom:000650c0 MOVE A5,*A14+,0x1 +rom:000650c2 CALLA 0x07f63a74 +rom:000650c8 MOVE A8,*A13(0x120),0x1 +rom:000650cc MOVE A8,A8 +rom:000650ce JRNE 0x0006512a +rom:000650d0 MOVE A14,-*SP,0x1 +rom:000650d2 MOVI 0x3f532468,A8 +rom:000650d8 MOVE A8,*A14+,0x1 +rom:000650da CALLA 0x07f24f78 +rom:000650e0 MOVE A14,-*SP,0x1 +rom:000650e2 MOVE *A13(0xc0),*A14+,0x1 +rom:000650e6 CALLA 0x07eacdda +rom:000650ec MOVE *A9(0x60),A5,0x1 +rom:000650f0 JRNE 0x00065102 +rom:000650f2 MOVE A14,-*SP,0x1 +rom:000650f4 MOVE *A13(0xe0),A5,0x1 +rom:000650f8 MOVE *A5(0x40),*A14+,0x1 +rom:000650fc CALLA 0x07f63b00 +rom:00065102 MOVE A14,-*SP,0x1 +rom:00065104 MOVK 0xb,A5 +rom:00065106 MOVE A5,*A14+,0x1 +rom:00065108 SUB A5,A5 +rom:0006510a MOVE A5,*A14+,0x1 +rom:0006510c SETF 0x8,0x0,0x0 +rom:0006510e MOVE *A9(0x8),A8,0x0 +rom:00065112 MOVE A8,*A14+,0x1 +rom:00065114 MOVE 0x1ad960,*A14+,0x1 +rom:0006511a MOVE *A13(0xffe0),*A14+,0x1 +rom:0006511e CALLA 0x07effa5e +rom:00065124 MOVK 0xb,A8 +rom:00065126 JR 0x00065258 +rom:0006512a MOVK 0x1,A5 +rom:0006512c MOVB A5,*A8 +rom:0006512e MOVE *A13(0xa0),*A8(0x8),0x1 +rom:00065134 MOVE *A13(0xc0),*A8(0x28),0x1 +rom:0006513a MOVE *A9(0x20),*A8(0x48),0x1 +rom:00065140 MOVE *A9(0x40),*A8(0x68),0x1 +rom:00065146 MOVE *A13(0xe0),A5,0x1 +rom:0006514a MOVE *A5(0x40),A5,0x1 +rom:0006514e SETF 0x10,0x0,0x0 +rom:00065150 MOVE *A5(0xa8),*A8(0x88),0x0 +rom:00065156 MOVE *A13(0xe0),A5,0x1 +rom:0006515a MOVE *A5(0x40),A5,0x1 +rom:0006515e MOVE *A5(0xe8),*A8(0x98),0x0 +rom:00065164 MOVE *A13(0xe0),A5,0x1 +rom:00065168 MOVE *A5(0x40),A5,0x1 +rom:0006516c MOVE *A5(0x128),*A8(0xa8),0x0 +rom:00065172 MOVE *A13(0xe0),A5,0x1 +rom:00065176 MOVE *A5(0x40),A5,0x1 +rom:0006517a MOVE *A5(0x148),*A8(0xb8),0x0 +rom:00065180 MOVE A14,-*SP,0x1 +rom:00065182 MOVE A8,*A14+,0x1 +rom:00065184 CALLA 0x07e5b152 +rom:0006518a MOVE A8,*A13(0x140),0x1 +rom:0006518e MOVE A8,A5 +rom:00065190 JREQ 0x000651e8 +rom:00065192 MOVE A14,-*SP,0x1 +rom:00065194 MOVE *A13(0x120),*A14+,0x1 +rom:00065198 CALLA 0x07f63b00 +rom:0006519e MOVE A14,-*SP,0x1 +rom:000651a0 MOVE *A13(0xc0),*A14+,0x1 +rom:000651a4 CALLA 0x07eacdda +rom:000651aa MOVE *A9(0x60),A5,0x1 +rom:000651ae JRNE 0x000651c0 +rom:000651b0 MOVE A14,-*SP,0x1 +rom:000651b2 MOVE *A13(0xe0),A5,0x1 +rom:000651b6 MOVE *A5(0x40),*A14+,0x1 +rom:000651ba CALLA 0x07f63b00 +rom:000651c0 MOVE A14,-*SP,0x1 +rom:000651c2 MOVE *A13(0x140),*A14+,0x1 +rom:000651c6 SUB A5,A5 +rom:000651c8 MOVE A5,*A14+,0x1 +rom:000651ca SETF 0x8,0x0,0x0 +rom:000651cc MOVE *A9(0x8),A8,0x0 +rom:000651d0 MOVE A8,*A14+,0x1 +rom:000651d2 MOVE 0x1ad960,*A14+,0x1 +rom:000651d8 MOVE *A13(0xffe0),*A14+,0x1 +rom:000651dc CALLA 0x07effa5e +rom:000651e2 MOVE *A13(0x140),A8,0x1 +rom:000651e6 JR 0x00065258 +rom:000651e8 MOVE *A13(0xc0),A5,0x1 +rom:000651ec MOVE *A9(0x40),*A5(0x0),0x1 +rom:000651f2 MOVE A14,-*SP,0x1 +rom:000651f4 SETF 0x10,0x0,0x0 +rom:000651f6 MOVE @0x1ad980,A5,0x0 +rom:000651fc MOVE A5,*A14+,0x1 +rom:000651fe MOVI 0x3f566ed0,A7 +rom:00065204 MOVE A7,*A14+,0x1 +rom:00065206 MOVE *A13(0xc0),*A14+,0x1 +rom:0006520a MOVE @0x1ad990,A7,0x0 +rom:00065210 MOVE A7,*A14+,0x1 +rom:00065212 MOVE *A9(0x40),*A14+,0x1 +rom:00065216 CALLA 0x07f16ca2 +rom:0006521c MOVE A14,-*SP,0x1 +rom:0006521e SUB A7,A7 +rom:00065220 MOVE A7,*A14+,0x1 +rom:00065222 MOVE *A13(0xc0),*A14+,0x1 +rom:00065226 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006522a CALLA 0x07e7fe96 +rom:00065230 MOVE A8,*A13(0x140),0x1 +rom:00065234 MOVE A14,-*SP,0x1 +rom:00065236 MOVE *A13(0x120),*A14+,0x1 +rom:0006523a CALLA 0x07f63b00 +rom:00065240 MOVE *A9(0x60),A7,0x1 +rom:00065244 JRNE 0x00065256 +rom:00065246 MOVE A14,-*SP,0x1 +rom:00065248 MOVE *A13(0xe0),A7,0x1 +rom:0006524c MOVE *A7(0x40),*A14+,0x1 +rom:00065250 CALLA 0x07f63b00 +rom:00065256 SUB A8,A8 +rom:00065258 MOVE *SP(0xc0),A14,0x1 +rom:0006525c MMFM SP,0x2aa0 +rom:00065262 MMTM SP,0x554 +rom:00065266 MOVE A14,A13 +rom:00065268 ADDI 0x160,A14 +rom:0006526c MOVE *A13(0xffe0),A11,0x1 +rom:00065270 MOVE *A11(0x40),A9,0x1 +rom:00065274 SETF 0x10,0x0,0x0 +rom:00065276 MOVE *A9(0x10),A11,0x0 +rom:0006527a SUBK 0x4,A11 +rom:0006527c JREQ 0x00065284 +rom:0006527e MOVK 0x10,A8 +rom:00065280 JR 0x000655f6 +rom:00065284 MOVE A14,-*SP,0x1 +rom:00065286 MOVE *A9(0x40),*A14+,0x1 +rom:0006528a MOVE *A9(0x20),*A14+,0x1 +rom:0006528e MOVE A13,A11 +rom:00065290 ADDI 0xa0,A11 +rom:00065294 MOVE A11,*A14+,0x1 +rom:00065296 MOVE A13,A7 +rom:00065298 ADDI 0x80,A7 +rom:0006529c MOVE A7,*A14+,0x1 +rom:0006529e MOVE *A13(0xffe0),*A14+,0x1 +rom:000652a2 CALLA 0x07ea6fa0 +rom:000652a8 MOVE A8,*A13(0x140),0x1 +rom:000652ac MOVE A8,A8 +rom:000652ae JRNE 0x000655f6 +rom:000652b2 SETF 0x8,0x0,0x0 +rom:000652b4 MOVE *A9(0x60),A7,0x0 +rom:000652b8 DEC A7 +rom:000652ba JREQ 0x000652e8 +rom:000652bc MOVE *A9(0x60),A7,0x0 +rom:000652c0 JREQ 0x000652e8 +rom:000652c2 MOVE A14,-*SP,0x1 +rom:000652c4 MOVK 0x2,A7 +rom:000652c6 MOVE A7,*A14+,0x1 +rom:000652c8 MOVE *A9(0x20),*A14+,0x1 +rom:000652cc MOVE *A9(0x8),A8,0x0 +rom:000652d0 MOVE A8,*A14+,0x1 +rom:000652d2 MOVE 0x1ad960,*A14+,0x1 +rom:000652d8 MOVE *A13(0xffe0),*A14+,0x1 +rom:000652dc CALLA 0x07effa5e +rom:000652e2 MOVE A7,A8 +rom:000652e4 JR 0x000655f6 +rom:000652e8 MOVE *A9(0x68),A7,0x0 +rom:000652ec DEC A7 +rom:000652ee JREQ 0x0006531c +rom:000652f0 MOVE *A9(0x68),A7,0x0 +rom:000652f4 JREQ 0x0006531c +rom:000652f6 MOVE A14,-*SP,0x1 +rom:000652f8 MOVK 0x2,A7 +rom:000652fa MOVE A7,*A14+,0x1 +rom:000652fc MOVE *A9(0x20),*A14+,0x1 +rom:00065300 MOVE *A9(0x8),A8,0x0 +rom:00065304 MOVE A8,*A14+,0x1 +rom:00065306 MOVE 0x1ad960,*A14+,0x1 +rom:0006530c MOVE *A13(0xffe0),*A14+,0x1 +rom:00065310 CALLA 0x07effa5e +rom:00065316 MOVE A7,A8 +rom:00065318 JR 0x000655f6 +rom:0006531c SUB A7,A7 +rom:0006531e MOVE A7,*A13,0x1 +rom:00065320 MOVE *A13(0xa0),A11,0x1 +rom:00065324 MOVE *A11(0x48),A11,0x0 +rom:00065328 CMP A11,A7 +rom:0006532a JRNC 0x0006535c +rom:0006532c MOVE *A13,A11,0x1 +rom:0006532e SLL 0x5,A11 +rom:00065330 ADD A13,A11 +rom:00065332 MOVE *A13(0xa0),A7,0x1 +rom:00065336 MOVE *A7(0x160),A5,0x1 +rom:0006533a MOVE *A13,A7,0x1 +rom:0006533c SLL 0x5,A7 +rom:0006533e ADD A7,A5 +rom:00065340 MOVE *A5(0xd8),A7,0x1 +rom:00065344 MOVE *A7(0x1a8),*A11(0x20),0x1 +rom:0006534a MOVE *A13,A11,0x1 +rom:0006534c INC A11 +rom:0006534e MOVE A11,*A13,0x1 +rom:00065350 MOVE *A13(0xa0),A7,0x1 +rom:00065354 MOVE *A7(0x48),A5,0x0 +rom:00065358 CMP A5,A11 +rom:0006535a JRC 0x0006532c +rom:0006535c MOVE A14,-*SP,0x1 +rom:0006535e MOVE *A13(0x80),A11,0x1 +rom:00065362 MOVK 0x1,A7 +rom:00065364 JREQ 0x00065368 +rom:00065366 SUB A7,A7 +rom:00065368 MOVE A7,*A14+,0x1 +rom:0006536a MOVE *A13(0xa0),A7,0x1 +rom:0006536e MOVE *A7(0xa0),*A14+,0x1 +rom:00065372 MOVE *A7(0x80),*A14+,0x1 +rom:00065376 MOVE *A7(0x50),A8,0x0 +rom:0006537a MOVE A8,*A14+,0x1 +rom:0006537c MOVE *A7(0x60),A8,0x0 +rom:00065380 MOVE A8,*A14+,0x1 +rom:00065382 MOVE *A7(0x58),A8,0x0 +rom:00065386 MOVE A8,*A14+,0x1 +rom:00065388 MOVE *A7(0xc0),*A14+,0x1 +rom:0006538c MOVE *A7(0xe0),*A14+,0x1 +rom:00065390 MOVE A13,A5 +rom:00065392 ADDK 0x0,A5 +rom:00065394 MOVE A5,*A14+,0x1 +rom:00065396 MOVE *A7(0x40),A8,0x0 +rom:0006539a MOVE A8,*A14+,0x1 +rom:0006539c CALLA 0x07eaca82 +rom:000653a2 MOVE A8,*A13(0xc0),0x1 +rom:000653a6 MOVE A8,A8 +rom:000653a8 JRNE 0x000653d2 +rom:000653aa MOVE A14,-*SP,0x1 +rom:000653ac MOVK 0xb,A5 +rom:000653ae MOVE A5,*A14+,0x1 +rom:000653b0 MOVE *A9(0x40),*A14+,0x1 +rom:000653b4 SETF 0x8,0x0,0x0 +rom:000653b6 MOVE *A9(0x8),A8,0x0 +rom:000653ba MOVE A8,*A14+,0x1 +rom:000653bc MOVE 0x1ad960,*A14+,0x1 +rom:000653c2 MOVE *A13(0xffe0),*A14+,0x1 +rom:000653c6 CALLA 0x07effa5e +rom:000653cc MOVE A5,A8 +rom:000653ce JR 0x000655f6 +rom:000653d2 MOVE A11,A11 +rom:000653d4 JREQ 0x000654cc +rom:000653d6 MOVE A14,-*SP,0x1 +rom:000653d8 SETF 0x8,0x0,0x0 +rom:000653da MOVE *A9(0x68),A8,0x0 +rom:000653de MOVE A8,*A14+,0x1 +rom:000653e0 MOVE *A9(0x60),A8,0x0 +rom:000653e4 MOVE A8,*A14+,0x1 +rom:000653e6 MOVE *A13(0xc0),A5,0x1 +rom:000653ea MOVE *A5(0x160),*A14+,0x1 +rom:000653ee MOVE *A7(0x160),*A14+,0x1 +rom:000653f2 MOVE *A11(0x80),*A14+,0x1 +rom:000653f6 MOVE *A9(0x8),A5,0x0 +rom:000653fa SLL 0x5,A5 +rom:000653fc ADDI 0xd5730,A5 +rom:00065402 MOVE *A5,A5,0x1 +rom:00065404 CALL A5 +rom:00065406 MOVE A8,*A13(0x120),0x1 +rom:0006540a MOVE A8,A5 +rom:0006540c JREQ 0x00065442 +rom:0006540e MOVE A14,-*SP,0x1 +rom:00065410 MOVE *A13(0xc0),*A14+,0x1 +rom:00065414 CALLA 0x07eacdda +rom:0006541a MOVE A14,-*SP,0x1 +rom:0006541c MOVE A5,*A14+,0x1 +rom:0006541e SUB A5,A5 +rom:00065420 MOVE A5,*A14+,0x1 +rom:00065422 SETF 0x8,0x0,0x0 +rom:00065424 MOVE *A9(0x8),A8,0x0 +rom:00065428 MOVE A8,*A14+,0x1 +rom:0006542a MOVE 0x1ad960,*A14+,0x1 +rom:00065430 MOVE *A13(0xffe0),*A14+,0x1 +rom:00065434 CALLA 0x07effa5e +rom:0006543a MOVE *A13(0x120),A8,0x1 +rom:0006543e JR 0x000655f6 +rom:00065442 MOVE A14,-*SP,0x1 +rom:00065444 MOVK 0x1,A5 +rom:00065446 MOVE A5,*A14+,0x1 +rom:00065448 MOVE *A13(0xc0),*A14+,0x1 +rom:0006544c MOVE A11,*A14+,0x1 +rom:0006544e CALLA 0x07ea72a4 +rom:00065454 MOVE A8,A8 +rom:00065456 JRNE 0x000655f4 +rom:0006545a MOVE A14,-*SP,0x1 +rom:0006545c MOVE *A13(0xc0),*A14+,0x1 +rom:00065460 CALLA 0x07eacdda +rom:00065466 MOVE *A11(0x80),A5,0x1 +rom:0006546a MOVE *A5(0x20),*A13(0xe0),0x1 +rom:00065470 MOVE A14,-*SP,0x1 +rom:00065472 MOVE *A13(0xe0),*A14+,0x1 +rom:00065476 MOVE *A13(0xe0),A5,0x1 +rom:0006547a MOVE *A5(0x60),A5,0x1 +rom:0006547e MOVE *A5(0xe0),A5,0x1 +rom:00065482 CALL A5 +rom:00065484 MOVE *A13(0xe0),A5,0x1 +rom:00065488 MOVE *A5(0x20),A5,0x1 +rom:0006548c MOVE *A13(0xe0),A7,0x1 +rom:00065490 MOVE *A7,*A5,0x1 +rom:00065492 MOVE *A7,A5,0x1 +rom:00065494 MOVE *A7(0x20),*A5(0x20),0x1 +rom:0006549a MOVE A14,-*SP,0x1 +rom:0006549c MOVE A7,*A14+,0x1 +rom:0006549e CALLA 0x07f63b18 +rom:000654a4 MOVE A14,-*SP,0x1 +rom:000654a6 MOVK 0xb,A5 +rom:000654a8 MOVE A5,*A14+,0x1 +rom:000654aa MOVE *A9(0x40),*A14+,0x1 +rom:000654ae SETF 0x8,0x0,0x0 +rom:000654b0 MOVE *A9(0x8),A8,0x0 +rom:000654b4 MOVE A8,*A14+,0x1 +rom:000654b6 MOVE 0x1ad960,*A14+,0x1 +rom:000654bc MOVE *A13(0xffe0),*A14+,0x1 +rom:000654c0 CALLA 0x07effa5e +rom:000654c6 MOVE A5,A8 +rom:000654c8 JR 0x000655f6 +rom:000654cc MOVE A14,-*SP,0x1 +rom:000654ce MOVI 0x98,A5 +rom:000654d2 MOVE A5,*A14+,0x1 +rom:000654d4 CALLA 0x07f63a74 +rom:000654da MOVE A8,*A13(0x100),0x1 +rom:000654de MOVE A8,A8 +rom:000654e0 JRNE 0x00065524 +rom:000654e2 MOVE A14,-*SP,0x1 +rom:000654e4 MOVI 0x3f532598,A8 +rom:000654ea MOVE A8,*A14+,0x1 +rom:000654ec CALLA 0x07f24f78 +rom:000654f2 MOVE A14,-*SP,0x1 +rom:000654f4 MOVE *A13(0xc0),*A14+,0x1 +rom:000654f8 CALLA 0x07eacdda +rom:000654fe MOVE A14,-*SP,0x1 +rom:00065500 MOVK 0xb,A5 +rom:00065502 MOVE A5,*A14+,0x1 +rom:00065504 SUB A5,A5 +rom:00065506 MOVE A5,*A14+,0x1 +rom:00065508 SETF 0x8,0x0,0x0 +rom:0006550a MOVE *A9(0x8),A8,0x0 +rom:0006550e MOVE A8,*A14+,0x1 +rom:00065510 MOVE 0x1ad960,*A14+,0x1 +rom:00065516 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006551a CALLA 0x07effa5e +rom:00065520 MOVK 0xb,A8 +rom:00065522 JR 0x000655f6 +rom:00065524 MOVK 0x4,A5 +rom:00065526 MOVB A5,*A8 +rom:00065528 MOVE A7,*A8(0x8),0x1 +rom:0006552c MOVE *A13(0xc0),*A8(0x28),0x1 +rom:00065532 MOVE *A9(0x20),*A8(0x48),0x1 +rom:00065538 MOVE *A9(0x40),*A8(0x68),0x1 +rom:0006553e MOVB *A9(0x60),*A8(0x88) +rom:00065544 MOVB *A9(0x68),*A8(0x90) +rom:0006554a MOVE A14,-*SP,0x1 +rom:0006554c MOVE A8,*A14+,0x1 +rom:0006554e CALLA 0x07e5b152 +rom:00065554 MOVE A8,*A13(0x120),0x1 +rom:00065558 MOVE A8,A8 +rom:0006555a JREQ 0x0006559c +rom:0006555c MOVE A14,-*SP,0x1 +rom:0006555e MOVE *A13(0x100),*A14+,0x1 +rom:00065562 CALLA 0x07f63b00 +rom:00065568 MOVE A14,-*SP,0x1 +rom:0006556a MOVE *A13(0xc0),*A14+,0x1 +rom:0006556e CALLA 0x07eacdda +rom:00065574 MOVE A14,-*SP,0x1 +rom:00065576 MOVE *A13(0x120),*A14+,0x1 +rom:0006557a SUB A5,A5 +rom:0006557c MOVE A5,*A14+,0x1 +rom:0006557e SETF 0x8,0x0,0x0 +rom:00065580 MOVE *A9(0x8),A8,0x0 +rom:00065584 MOVE A8,*A14+,0x1 +rom:00065586 MOVE 0x1ad960,*A14+,0x1 +rom:0006558c MOVE *A13(0xffe0),*A14+,0x1 +rom:00065590 CALLA 0x07effa5e +rom:00065596 MOVE *A13(0x120),A8,0x1 +rom:0006559a JR 0x000655f6 +rom:0006559c MOVE *A13(0xc0),A5,0x1 +rom:000655a0 MOVE *A9(0x40),*A5(0x0),0x1 +rom:000655a6 MOVE A14,-*SP,0x1 +rom:000655a8 SETF 0x10,0x0,0x0 +rom:000655aa MOVE @0x1ad980,A5,0x0 +rom:000655b0 MOVE A5,*A14+,0x1 +rom:000655b2 MOVI 0x3f566ed0,A7 +rom:000655b8 MOVE A7,*A14+,0x1 +rom:000655ba MOVE *A13(0xc0),*A14+,0x1 +rom:000655be MOVE @0x1ad990,A7,0x0 +rom:000655c4 MOVE A7,*A14+,0x1 +rom:000655c6 MOVE *A9(0x40),*A14+,0x1 +rom:000655ca CALLA 0x07f16ca2 +rom:000655d0 MOVE A14,-*SP,0x1 +rom:000655d2 SUB A7,A7 +rom:000655d4 MOVE A7,*A14+,0x1 +rom:000655d6 MOVE *A13(0xc0),*A14+,0x1 +rom:000655da MOVE *A13(0xffe0),*A14+,0x1 +rom:000655de CALLA 0x07e7fe96 +rom:000655e4 MOVE A8,*A13(0x120),0x1 +rom:000655e8 MOVE A14,-*SP,0x1 +rom:000655ea MOVE *A13(0x100),*A14+,0x1 +rom:000655ee CALLA 0x07f63b00 +rom:000655f4 SUB A8,A8 +rom:000655f6 MOVE *SP(0xc0),A14,0x1 +rom:000655fa MMFM SP,0x2aa0 +rom:00065600 MMTM SP,0x554 +rom:00065604 MOVE A14,A13 +rom:00065606 ADDI 0x290,A14 +rom:0006560a MOVE *A13(0xffe0),A11,0x1 +rom:0006560e MOVE *A11(0x40),A9,0x1 +rom:00065612 SETF 0x10,0x0,0x0 +rom:00065614 MOVE *A9(0x10),A11,0x0 +rom:00065618 SUBK 0xa,A11 +rom:0006561a JREQ 0x00065622 +rom:0006561c MOVK 0x10,A8 +rom:0006561e JR 0x00065ca0 +rom:00065622 MOVE A14,-*SP,0x1 +rom:00065624 MOVE *A9(0x40),*A14+,0x1 +rom:00065628 MOVE *A9(0x20),*A14+,0x1 +rom:0006562c MOVE A13,A11 +rom:0006562e ADDI 0x1c0,A11 +rom:00065632 MOVE A11,*A14+,0x1 +rom:00065634 MOVE A13,A7 +rom:00065636 ADDI 0x1a0,A7 +rom:0006563a MOVE A7,*A14+,0x1 +rom:0006563c MOVE *A13(0xffe0),*A14+,0x1 +rom:00065640 CALLA 0x07ea6fa0 +rom:00065646 MOVE A8,*A13(0x270),0x1 +rom:0006564a MOVE A8,A8 +rom:0006564c JRNE 0x00065ca0 +rom:00065650 MOVE *A9(0xa0),A7,0x1 +rom:00065654 JREQ 0x0006565c +rom:00065656 MOVE *A9(0xa0),A7,0x1 +rom:0006565a JR 0x00065664 +rom:0006565c MOVE *A13(0x1c0),A7,0x1 +rom:00065660 MOVE *A7(0x80),A7,0x1 +rom:00065664 MOVE A7,*A13(0xe0),0x1 +rom:00065668 MOVE *A9(0xc0),A11,0x1 +rom:0006566c JREQ 0x00065674 +rom:0006566e MOVE *A9(0xc0),A11,0x1 +rom:00065672 JR 0x0006567c +rom:00065674 MOVE *A13(0x1c0),A11,0x1 +rom:00065678 MOVE *A11(0xa0),A11,0x1 +rom:0006567c MOVE A11,*A13(0x100),0x1 +rom:00065680 ADDI 0x40,A14 +rom:00065684 MOVE A14,-*SP,0x1 +rom:00065686 MOVE A9,A7 +rom:00065688 ADDI 0x60,A7 +rom:0006568c MOVE A7,*A14+,0x1 +rom:0006568e CALLA 0x07f638c2 +rom:00065694 MOVE -*A14,A8,0x1 +rom:00065696 MOVE A8,*A13(0x20),0x1 +rom:0006569a MOVE -*A14,A8,0x1 +rom:0006569c MOVE A8,*A13,0x1 +rom:0006569e MOVE *A13(0x0),*A14+,0x1 +rom:000656a2 MOVE *A13(0x20),*A14+,0x1 +rom:000656a6 MOVI 0x3f533740,A8 +rom:000656ac MOVE *A8+,*A14+,0x1 +rom:000656ae MOVE *A8+,*A14+,0x1 +rom:000656b0 CALLA 0x07fc1ce6 +rom:000656b6 JREQ 0x000656c2 +rom:000656b8 MOVE *A13(0x0),*A14+,0x1 +rom:000656bc MOVE *A13(0x20),*A14+,0x1 +rom:000656c0 JR 0x000656d0 +rom:000656c2 MOVE *A13(0x0),*A14+,0x1 +rom:000656c6 MOVE *A13(0x20),*A14+,0x1 +rom:000656ca CALLA 0x07fc18f6 +rom:000656d0 MOVI 0x3f533780,A8 +rom:000656d6 MOVE *A8+,*A14+,0x1 +rom:000656d8 MOVE *A8+,*A14+,0x1 +rom:000656da CALLA 0x07fc1cde +rom:000656e0 JRNE 0x0006576a +rom:000656e2 MOVE *A13(0x0),*A14+,0x1 +rom:000656e6 MOVE *A13(0x20),*A14+,0x1 +rom:000656ea MOVI 0x3f533740,A8 +rom:000656f0 MOVE *A8+,*A14+,0x1 +rom:000656f2 MOVE *A8+,*A14+,0x1 +rom:000656f4 CALLA 0x07fc1ce6 +rom:000656fa JREQ 0x00065706 +rom:000656fc MOVE *A13(0x0),*A14+,0x1 +rom:00065700 MOVE *A13(0x20),*A14+,0x1 +rom:00065704 JR 0x00065714 +rom:00065706 MOVE *A13(0x0),*A14+,0x1 +rom:0006570a MOVE *A13(0x20),*A14+,0x1 +rom:0006570e CALLA 0x07fc18f6 +rom:00065714 MOVI 0x3f5337c0,A8 +rom:0006571a MOVE *A8+,*A14+,0x1 +rom:0006571c MOVE *A8+,*A14+,0x1 +rom:0006571e CALLA 0x07fc1ce6 +rom:00065724 JREQ 0x00065776 +rom:00065726 MOVE *A13(0x0),*A14+,0x1 +rom:0006572a MOVE *A13(0x20),*A14+,0x1 +rom:0006572e MOVI 0x3f533740,A8 +rom:00065734 MOVE *A8+,*A14+,0x1 +rom:00065736 MOVE *A8+,*A14+,0x1 +rom:00065738 CALLA 0x07fc1ce6 +rom:0006573e JREQ 0x0006574a +rom:00065740 MOVE *A13(0x0),*A14+,0x1 +rom:00065744 MOVE *A13(0x20),*A14+,0x1 +rom:00065748 JR 0x00065758 +rom:0006574a MOVE *A13(0x0),*A14+,0x1 +rom:0006574e MOVE *A13(0x20),*A14+,0x1 +rom:00065752 CALLA 0x07fc18f6 +rom:00065758 MOVI 0x3f533800,A8 +rom:0006575e MOVE *A8+,*A14+,0x1 +rom:00065760 MOVE *A8+,*A14+,0x1 +rom:00065762 CALLA 0x07fc1cde +rom:00065768 JREQ 0x00065776 +rom:0006576a SUB A7,A7 +rom:0006576c SETF 0x10,0x0,0x0 +rom:0006576e MOVE A7,*A13(0x200),0x0 +rom:00065772 JR 0x000659b2 +rom:00065776 MOVE *A13(0x0),*A14+,0x1 +rom:0006577a MOVE *A13(0x20),*A14+,0x1 +rom:0006577e MOVI 0x3f533740,A8 +rom:00065784 MOVE *A8+,*A14+,0x1 +rom:00065786 MOVE *A8+,*A14+,0x1 +rom:00065788 CALLA 0x07fc1ce6 +rom:0006578e JREQ 0x0006579a +rom:00065790 MOVE *A13(0x0),*A14+,0x1 +rom:00065794 MOVE *A13(0x20),*A14+,0x1 +rom:00065798 JR 0x000657a8 +rom:0006579a MOVE *A13(0x0),*A14+,0x1 +rom:0006579e MOVE *A13(0x20),*A14+,0x1 +rom:000657a2 CALLA 0x07fc18f6 +rom:000657a8 MOVI 0x3f533840,A8 +rom:000657ae MOVE *A8+,*A14+,0x1 +rom:000657b0 MOVE *A8+,*A14+,0x1 +rom:000657b2 CALLA 0x07fc1ce6 +rom:000657b8 JREQ 0x00065838 +rom:000657ba MOVE *A13(0x0),*A14+,0x1 +rom:000657be MOVE *A13(0x20),*A14+,0x1 +rom:000657c2 MOVI 0x3f533740,A8 +rom:000657c8 MOVE *A8+,*A14+,0x1 +rom:000657ca MOVE *A8+,*A14+,0x1 +rom:000657cc CALLA 0x07fc1ce6 +rom:000657d2 JREQ 0x000657de +rom:000657d4 MOVE *A13(0x0),*A14+,0x1 +rom:000657d8 MOVE *A13(0x20),*A14+,0x1 +rom:000657dc JR 0x000657ec +rom:000657de MOVE *A13(0x0),*A14+,0x1 +rom:000657e2 MOVE *A13(0x20),*A14+,0x1 +rom:000657e6 CALLA 0x07fc18f6 +rom:000657ec MOVI 0x3f533880,A8 +rom:000657f2 MOVE *A8+,*A14+,0x1 +rom:000657f4 MOVE *A8+,*A14+,0x1 diff --git a/xie/ghidra-evidence/handlers/slot01_068A4C.txt b/xie/ghidra-evidence/handlers/slot01_068A4C.txt new file mode 100644 index 0000000..e64395a --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot01_068A4C.txt @@ -0,0 +1,284 @@ +rom:00068a4c MMTM SP,0x554 +rom:00068a50 MOVE A14,A13 +rom:00068a52 ADDI 0x220,A14 +rom:00068a56 MOVE *A13(0xffe0),A11,0x1 +rom:00068a5a MOVE *A11(0x40),A9,0x1 +rom:00068a5e SETF 0x10,0x0,0x0 +rom:00068a60 MOVE *A9(0x10),A11,0x0 +rom:00068a64 SUBK 0x2,A11 +rom:00068a66 JREQ 0x00068a6e +rom:00068a68 MOVK 0x10,A8 +rom:00068a6a JR 0x00068d9c +rom:00068a6e MOVE A14,-*SP,0x1 +rom:00068a70 MOVK 0x0,A11 +rom:00068a72 MOVE A11,*A14+,0x1 +rom:00068a74 SUB A11,A11 +rom:00068a76 MOVE A11,*A14+,0x1 +rom:00068a78 MOVE A13,*A14+,0x1 +rom:00068a7a CALLA 0x07fc2d78 +rom:00068a80 MOVE *A13,A7,0x1 +rom:00068a82 MOVK 0x2,A11 +rom:00068a84 ANDN A11,A7 +rom:00068a86 OR A11,A7 +rom:00068a88 MOVE A7,*A13,0x1 +rom:00068a8a MOVK 0x4,A11 +rom:00068a8c ANDN A11,A7 +rom:00068a8e OR A11,A7 +rom:00068a90 MOVE A7,*A13,0x1 +rom:00068a92 MOVK 0x8,A11 +rom:00068a94 ANDN A11,A7 +rom:00068a96 OR A11,A7 +rom:00068a98 MOVE A7,*A13,0x1 +rom:00068a9a MOVK 0x10,A11 +rom:00068a9c ANDN A11,A7 +rom:00068a9e ORI 0x10,A7 +rom:00068aa4 MOVE A7,*A13,0x1 +rom:00068aa6 MOVK 0x0,A11 +rom:00068aa8 ANDN A11,A7 +rom:00068aaa ORI 0x20,A7 +rom:00068ab0 MOVE A7,*A13,0x1 +rom:00068ab2 ANDI -0x41,A7 +rom:00068ab8 ORI 0x40,A7 +rom:00068abe MOVE A7,*A13,0x1 +rom:00068ac0 ANDI -0x81,A7 +rom:00068ac6 ORI 0x80,A7 +rom:00068acc MOVE A7,*A13,0x1 +rom:00068ace MOVE *A13(0x8),A7,0x1 +rom:00068ad2 MOVK 0x1,A11 +rom:00068ad4 ANDN A11,A7 +rom:00068ad6 OR A11,A7 +rom:00068ad8 MOVE A7,*A13(0x8),0x1 +rom:00068adc MOVK 0x2,A11 +rom:00068ade ANDN A11,A7 +rom:00068ae0 OR A11,A7 +rom:00068ae2 MOVE A7,*A13(0x8),0x1 +rom:00068ae6 MOVK 0x4,A11 +rom:00068ae8 ANDN A11,A7 +rom:00068aea OR A11,A7 +rom:00068aec MOVE A7,*A13(0x8),0x1 +rom:00068af0 MOVK 0x8,A11 +rom:00068af2 ANDN A11,A7 +rom:00068af4 OR A11,A7 +rom:00068af6 MOVE A7,*A13(0x8),0x1 +rom:00068afa MOVK 0x10,A11 +rom:00068afc ANDN A11,A7 +rom:00068afe ORI 0x10,A7 +rom:00068b04 MOVE A7,*A13(0x8),0x1 +rom:00068b08 MOVK 0x0,A11 +rom:00068b0a ANDN A11,A7 +rom:00068b0c ORI 0x20,A7 +rom:00068b12 MOVE A7,*A13(0x8),0x1 +rom:00068b16 ANDI -0x41,A7 +rom:00068b1c ORI 0x40,A7 +rom:00068b22 MOVE A7,*A13(0x8),0x1 +rom:00068b26 ANDI -0x81,A7 +rom:00068b2c ORI 0x80,A7 +rom:00068b32 MOVE A7,*A13(0x8),0x1 +rom:00068b36 MOVE *A13(0x10),A11,0x1 +rom:00068b3a MOVK 0x1,A7 +rom:00068b3c ANDN A7,A11 +rom:00068b3e MOVE A11,*A13(0x10),0x1 +rom:00068b42 MOVK 0x2,A7 +rom:00068b44 ANDN A7,A11 +rom:00068b46 MOVE A11,*A13(0x10),0x1 +rom:00068b4a MOVK 0x4,A7 +rom:00068b4c ANDN A7,A11 +rom:00068b4e OR A7,A11 +rom:00068b50 MOVE A11,*A13(0x10),0x1 +rom:00068b54 MOVK 0x8,A7 +rom:00068b56 ANDN A7,A11 +rom:00068b58 OR A7,A11 +rom:00068b5a MOVE A11,*A13(0x10),0x1 +rom:00068b5e MOVK 0x10,A7 +rom:00068b60 ANDN A7,A11 +rom:00068b62 ORI 0x10,A11 +rom:00068b68 MOVE A11,*A13(0x10),0x1 +rom:00068b6c MOVK 0x0,A7 +rom:00068b6e ANDN A7,A11 +rom:00068b70 ORI 0x20,A11 +rom:00068b76 MOVE A11,*A13(0x10),0x1 +rom:00068b7a ANDI -0x41,A11 +rom:00068b80 ORI 0x40,A11 +rom:00068b86 MOVE A11,*A13(0x10),0x1 +rom:00068b8a ANDI -0x81,A11 +rom:00068b90 MOVE A11,*A13(0x10),0x1 +rom:00068b94 MOVE *A13(0x18),A7,0x1 +rom:00068b98 MOVK 0x1,A11 +rom:00068b9a ANDN A11,A7 +rom:00068b9c OR A11,A7 +rom:00068b9e MOVE A7,*A13(0x18),0x1 +rom:00068ba2 MOVK 0x2,A11 +rom:00068ba4 ANDN A11,A7 +rom:00068ba6 MOVE A7,*A13(0x18),0x1 +rom:00068baa MOVK 0x4,A11 +rom:00068bac ANDN A11,A7 +rom:00068bae MOVE A7,*A13(0x18),0x1 +rom:00068bb2 MOVK 0x8,A11 +rom:00068bb4 ANDN A11,A7 +rom:00068bb6 MOVE A7,*A13(0x18),0x1 +rom:00068bba MOVK 0x10,A11 +rom:00068bbc ANDN A11,A7 +rom:00068bbe MOVE A7,*A13(0x18),0x1 +rom:00068bc2 MOVK 0x0,A11 +rom:00068bc4 ANDN A11,A7 +rom:00068bc6 MOVE A7,*A13(0x18),0x1 +rom:00068bca ANDI -0x41,A7 +rom:00068bd0 MOVE A7,*A13(0x18),0x1 +rom:00068bd4 ANDI -0x81,A7 +rom:00068bda MOVE A7,*A13(0x18),0x1 +rom:00068bde MOVE *A13(0x20),A11,0x1 +rom:00068be2 MOVK 0x1,A7 +rom:00068be4 ANDN A7,A11 +rom:00068be6 MOVE A11,*A13(0x20),0x1 +rom:00068bea MOVK 0x2,A7 +rom:00068bec ANDN A7,A11 +rom:00068bee OR A7,A11 +rom:00068bf0 MOVE A11,*A13(0x20),0x1 +rom:00068bf4 MOVK 0x4,A7 +rom:00068bf6 ANDN A7,A11 +rom:00068bf8 MOVE A11,*A13(0x20),0x1 +rom:00068bfc MOVK 0x8,A7 +rom:00068bfe ANDN A7,A11 +rom:00068c00 MOVE A11,*A13(0x20),0x1 +rom:00068c04 MOVK 0x10,A7 +rom:00068c06 ANDN A7,A11 +rom:00068c08 MOVE A11,*A13(0x20),0x1 +rom:00068c0c MOVK 0x0,A7 +rom:00068c0e ANDN A7,A11 +rom:00068c10 MOVE A11,*A13(0x20),0x1 +rom:00068c14 ANDI -0x41,A11 +rom:00068c1a MOVE A11,*A13(0x20),0x1 +rom:00068c1e ANDI -0x81,A11 +rom:00068c24 MOVE A11,*A13(0x20),0x1 +rom:00068c28 MOVE *A13(0x28),A7,0x1 +rom:00068c2c MOVK 0x1,A11 +rom:00068c2e ANDN A11,A7 +rom:00068c30 OR A11,A7 +rom:00068c32 MOVE A7,*A13(0x28),0x1 +rom:00068c36 MOVK 0x2,A11 +rom:00068c38 ANDN A11,A7 +rom:00068c3a MOVE A7,*A13(0x28),0x1 +rom:00068c3e MOVK 0x4,A11 +rom:00068c40 ANDN A11,A7 +rom:00068c42 MOVE A7,*A13(0x28),0x1 +rom:00068c46 MOVK 0x8,A11 +rom:00068c48 ANDN A11,A7 +rom:00068c4a OR A11,A7 +rom:00068c4c MOVE A7,*A13(0x28),0x1 +rom:00068c50 MOVK 0x10,A11 +rom:00068c52 ANDN A11,A7 +rom:00068c54 ORI 0x10,A7 +rom:00068c5a MOVE A7,*A13(0x28),0x1 +rom:00068c5e MOVK 0x0,A11 +rom:00068c60 ANDN A11,A7 +rom:00068c62 MOVE A7,*A13(0x28),0x1 +rom:00068c66 MOVK 0x1,A11 +rom:00068c68 MOVB *A11,*A13(0x120) +rom:00068c6c SETF 0x10,0x0,0x0 +rom:00068c6e MOVE *A9(0x20),A5,0x0 +rom:00068c72 SUBK 0x2,A5 +rom:00068c74 JRNE 0x00068c7e +rom:00068c76 MOVE *A9(0x30),A5,0x0 +rom:00068c7a SUBK 0x3,A5 +rom:00068c7c JREQ 0x00068c82 +rom:00068c7e SUB A5,A5 +rom:00068c80 JR 0x00068c84 +rom:00068c82 MOVK 0x1,A5 +rom:00068c84 MOVB *A5,*A13(0x128) +rom:00068c88 MOVE *A13(0xffe0),A5,0x1 +rom:00068c8c MOVE *A5(0xe0),*A13(0x130),0x0 +rom:00068c92 MOVK 0x8,A5 +rom:00068c94 MOVE A5,*A13(0x140),0x1 +rom:00068c98 MOVK 0x2,A7 +rom:00068c9a MOVE A7,*A13(0x160),0x0 +rom:00068c9e MOVK 0x3,A5 +rom:00068ca0 MOVE A5,*A13(0x170),0x0 +rom:00068ca4 SETF 0x8,0x0,0x0 +rom:00068ca6 MOVE *A13(0x128),A5,0x0 +rom:00068caa JREQ 0x00068d24 +rom:00068cac MOVE *A13(0xffe0),A5,0x1 +rom:00068cb0 MOVE *A5,A5,0x1 +rom:00068cb2 MOVE A5,A7 +rom:00068cb4 SLL 0x7,A5 +rom:00068cb6 SLL 0x5,A7 +rom:00068cb8 ADD A7,A5 +rom:00068cba ADDI 0x1ada70,A5 +rom:00068cc0 SUB A7,A7 +rom:00068cc2 MOVE A7,*A5,0x1 +rom:00068cc4 MOVE *A13(0xffe0),A5,0x1 +rom:00068cc8 MOVE *A5,A7,0x1 +rom:00068cca MOVE A7,A5 +rom:00068ccc SLL 0x7,A7 +rom:00068cce SLL 0x5,A5 +rom:00068cd0 ADD A5,A7 +rom:00068cd2 ADDI 0x1ada70,A7 +rom:00068cd8 MOVK 0x2,A5 +rom:00068cda MOVE A5,*A7(0x20),0x1 +rom:00068cde SUB A7,A7 +rom:00068ce0 MOVE A7,*A13(0x100),0x1 +rom:00068ce4 MOVE *A13(0xffe0),A11,0x1 +rom:00068ce8 MOVE *A11,A7,0x1 +rom:00068cea MOVE A7,A5 +rom:00068cec SLL 0x7,A7 +rom:00068cee SLL 0x5,A5 +rom:00068cf0 ADD A5,A7 +rom:00068cf2 ADDI 0x1ada70,A7 +rom:00068cf8 MOVE *A13(0x100),A5,0x1 +rom:00068cfc SLL 0x5,A5 +rom:00068cfe ADD A5,A7 +rom:00068d00 MOVI 0x100,A5 +rom:00068d04 MOVE A5,*A7(0x40),0x1 +rom:00068d08 MOVE *A13(0x100),A7,0x1 +rom:00068d0c INC A7 +rom:00068d0e MOVE A7,*A13(0x100),0x1 +rom:00068d12 SUBK 0x3,A7 +rom:00068d14 JRC 0x00068ce4 +rom:00068d16 MOVE @0x1ad920,A7,0x1 +rom:00068d1c INC A7 +rom:00068d1e MOVE A7,@0x1ad920,0x1 +rom:00068d24 MOVE *A13(0xffe0),A11,0x1 +rom:00068d28 MOVE *A11(0x80),A7,0x1 +rom:00068d2c JREQ 0x00068d52 +rom:00068d2e MOVE A14,-*SP,0x1 +rom:00068d30 MOVE A13,A7 +rom:00068d32 ADDI 0x120,A7 +rom:00068d36 MOVE A7,*A14+,0x1 +rom:00068d38 MOVK 0x0,A5 +rom:00068d3a MOVE A5,*A14+,0x1 +rom:00068d3c MOVE A11,*A14+,0x1 +rom:00068d3e SETF 0x8,0x0,0x0 +rom:00068d40 MOVE *A9(0x8),A5,0x0 +rom:00068d44 SLL 0x5,A5 +rom:00068d46 ADDI 0xd4b10,A5 +rom:00068d4c MOVE *A5,A5,0x1 +rom:00068d4e CALL A5 +rom:00068d50 JR 0x00068d68 +rom:00068d52 MOVE A14,-*SP,0x1 +rom:00068d54 MOVE A13,A7 +rom:00068d56 ADDI 0x120,A7 +rom:00068d5a MOVE A7,*A14+,0x1 +rom:00068d5c MOVK 0x0,A5 +rom:00068d5e MOVE A5,*A14+,0x1 +rom:00068d60 MOVE A11,*A14+,0x1 +rom:00068d62 CALLA 0x07e6a422 +rom:00068d68 MOVE @0xd50f0,A7,0x1 +rom:00068d6e MOVE A7,*A11(0xa0),0x1 +rom:00068d72 MOVE *A11(0x80),A5,0x1 +rom:00068d76 JREQ 0x00068d8a +rom:00068d78 MOVE A14,-*SP,0x1 +rom:00068d7a MOVE A13,*A14+,0x1 +rom:00068d7c MOVK 0x0,A5 +rom:00068d7e MOVE A5,*A14+,0x1 +rom:00068d80 MOVE A11,*A14+,0x1 +rom:00068d82 MOVE *A11(0xa0),A5,0x1 +rom:00068d86 CALL A5 +rom:00068d88 JR 0x00068d9a +rom:00068d8a MOVE A14,-*SP,0x1 +rom:00068d8c MOVE A13,*A14+,0x1 +rom:00068d8e MOVK 0x0,A5 +rom:00068d90 MOVE A5,*A14+,0x1 +rom:00068d92 MOVE A11,*A14+,0x1 +rom:00068d94 CALLA 0x07e6a422 +rom:00068d9a SUB A8,A8 +rom:00068d9c MOVE *SP(0xc0),A14,0x1 +rom:00068da0 MMFM SP,0x2aa0 diff --git a/xie/ghidra-evidence/handlers/slot02_068DA6.txt b/xie/ghidra-evidence/handlers/slot02_068DA6.txt new file mode 100644 index 0000000..2143532 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot02_068DA6.txt @@ -0,0 +1,16 @@ +rom:00068da6 MMTM SP,0x154 +rom:00068daa MOVE A14,A13 +rom:00068dac MOVE *A13(0xffe0),A11,0x1 +rom:00068db0 MOVE *A11(0x40),A9,0x1 +rom:00068db4 SETF 0x10,0x0,0x0 +rom:00068db6 MOVE *A9(0x10),A11,0x0 +rom:00068dba DEC A11 +rom:00068dbc JREQ 0x00068dc2 +rom:00068dbe MOVK 0x10,A8 +rom:00068dc0 JR 0x00068dd2 +rom:00068dc2 MOVE @0x1ad920,A11,0x1 +rom:00068dc8 DEC A11 +rom:00068dca MOVE A11,@0x1ad920,0x1 +rom:00068dd0 SUB A8,A8 +rom:00068dd2 MOVE *SP(0xa0),A14,0x1 +rom:00068dd6 MMFM SP,0x2a80 diff --git a/xie/ghidra-evidence/handlers/slot03_03FD78.txt b/xie/ghidra-evidence/handlers/slot03_03FD78.txt new file mode 100644 index 0000000..bc675d6 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot03_03FD78.txt @@ -0,0 +1,48 @@ +rom:0003fd78 MMTM SP,0x554 +rom:0003fd7c MOVE A14,A13 +rom:0003fd7e ADDI 0x100,A14 +rom:0003fd82 MOVE *A13(0xffe0),A11,0x1 +rom:0003fd86 MOVE *A11(0x40),A9,0x1 +rom:0003fd8a SETF 0x10,0x0,0x0 +rom:0003fd8c MOVE *A9(0x10),A11,0x0 +rom:0003fd90 SUBK 0x2,A11 +rom:0003fd92 JREQ 0x0003fd98 +rom:0003fd94 MOVK 0x10,A8 +rom:0003fd96 JR 0x0003fdfc +rom:0003fd98 MOVK 0x1,A11 +rom:0003fd9a MOVB A11,*A13 +rom:0003fd9c SUB A7,A7 +rom:0003fd9e MOVE A7,*A13(0x20),0x1 +rom:0003fda2 MOVE *A13(0xffe0),A5,0x1 +rom:0003fda6 MOVE *A5(0xe0),*A13(0x10),0x0 +rom:0003fdac MOVE *A5,A5,0x1 +rom:0003fdae MOVE A5,A7 +rom:0003fdb0 SLL 0x7,A5 +rom:0003fdb2 SLL 0x5,A7 +rom:0003fdb4 ADD A7,A5 +rom:0003fdb6 ADDI 0x1ada70,A5 +rom:0003fdbc MOVE *A5(0x0),*A13(0x40),0x1 +rom:0003fdc2 MOVE *A13(0xffe0),A7,0x1 +rom:0003fdc6 MOVE *A7(0x80),A5,0x1 +rom:0003fdca JREQ 0x0003fdea +rom:0003fdcc MOVE A14,-*SP,0x1 +rom:0003fdce MOVE A13,*A14+,0x1 +rom:0003fdd0 MOVK 0x0,A5 +rom:0003fdd2 MOVE A5,*A14+,0x1 +rom:0003fdd4 MOVE A7,*A14+,0x1 +rom:0003fdd6 SETF 0x8,0x0,0x0 +rom:0003fdd8 MOVE *A9(0x8),A11,0x0 +rom:0003fddc SLL 0x5,A11 +rom:0003fdde ADDI 0xd4b10,A11 +rom:0003fde4 MOVE *A11,A11,0x1 +rom:0003fde6 CALL A11 +rom:0003fde8 JR 0x0003fdfa +rom:0003fdea MOVE A14,-*SP,0x1 +rom:0003fdec MOVE A13,*A14+,0x1 +rom:0003fdee MOVK 0x0,A5 +rom:0003fdf0 MOVE A5,*A14+,0x1 +rom:0003fdf2 MOVE A7,*A14+,0x1 +rom:0003fdf4 CALLA 0x07e6a422 +rom:0003fdfa SUB A8,A8 +rom:0003fdfc MOVE *SP(0xc0),A14,0x1 +rom:0003fe00 MMFM SP,0x2aa0 diff --git a/xie/ghidra-evidence/handlers/slot04_03FE06.txt b/xie/ghidra-evidence/handlers/slot04_03FE06.txt new file mode 100644 index 0000000..c1f3172 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot04_03FE06.txt @@ -0,0 +1,21 @@ +rom:0003fe06 MMTM SP,0x554 +rom:0003fe0a MOVE A14,A13 +rom:0003fe0c MOVE *A13(0xffe0),A11,0x1 +rom:0003fe10 MOVE *A11(0x40),A9,0x1 +rom:0003fe14 SETF 0x10,0x0,0x0 +rom:0003fe16 MOVE *A9(0x10),A11,0x0 +rom:0003fe1a SUBK 0x2,A11 +rom:0003fe1c JREQ 0x0003fe22 +rom:0003fe1e MOVK 0x10,A8 +rom:0003fe20 JR 0x0003fe3e +rom:0003fe22 MOVE *A13(0xffe0),A11,0x1 +rom:0003fe26 MOVE *A11,A7,0x1 +rom:0003fe28 MOVE A7,A5 +rom:0003fe2a SLL 0x7,A7 +rom:0003fe2c SLL 0x5,A5 +rom:0003fe2e ADD A5,A7 +rom:0003fe30 ADDI 0x1ada70,A7 +rom:0003fe36 MOVE *A9(0x20),*A7(0x0),0x1 +rom:0003fe3c SUB A8,A8 +rom:0003fe3e MOVE *SP(0xc0),A14,0x1 +rom:0003fe42 MMFM SP,0x2aa0 diff --git a/xie/ghidra-evidence/handlers/slot05_068DDC.txt b/xie/ghidra-evidence/handlers/slot05_068DDC.txt new file mode 100644 index 0000000..10c4a61 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot05_068DDC.txt @@ -0,0 +1,84 @@ +rom:00068ddc MMTM SP,0x554 +rom:00068de0 MOVE A14,A13 +rom:00068de2 ADDK 0x0,A14 +rom:00068de4 MOVE *A13(0xffe0),A11,0x1 +rom:00068de8 MOVE *A11(0x40),A9,0x1 +rom:00068dec SETF 0x10,0x0,0x0 +rom:00068dee MOVE *A9(0x10),A11,0x0 +rom:00068df2 SUBK 0x5,A11 +rom:00068df4 JREQ 0x00068dfa +rom:00068df6 MOVK 0x10,A8 +rom:00068df8 JR 0x00068ebc +rom:00068dfa SETF 0x8,0x0,0x0 +rom:00068dfc MOVE *A9(0x20),A11,0x0 +rom:00068e00 SUBK 0x2,A11 +rom:00068e02 JREQ 0x00068e38 +rom:00068e04 MOVE *A9(0x20),A11,0x0 +rom:00068e08 SUBK 0x3,A11 +rom:00068e0a JREQ 0x00068e38 +rom:00068e0c MOVE *A9(0x20),A11,0x0 +rom:00068e10 SUBK 0x4,A11 +rom:00068e12 JREQ 0x00068e38 +rom:00068e14 MOVE A14,-*SP,0x1 +rom:00068e16 MOVK 0x2,A11 +rom:00068e18 MOVE A11,*A14+,0x1 +rom:00068e1a SUB A7,A7 +rom:00068e1c MOVE A7,*A14+,0x1 +rom:00068e1e MOVE *A9(0x8),A8,0x0 +rom:00068e22 MOVE A8,*A14+,0x1 +rom:00068e24 MOVE 0x1ad960,*A14+,0x1 +rom:00068e2a MOVE *A13(0xffe0),*A14+,0x1 +rom:00068e2e CALLA 0x07effa5e +rom:00068e34 MOVE A11,A8 +rom:00068e36 JR 0x00068ebc +rom:00068e38 MOVE *A13(0xffe0),A11,0x1 +rom:00068e3c MOVE *A11,A7,0x1 +rom:00068e3e MOVE A7,A5 +rom:00068e40 SLL 0x7,A7 +rom:00068e42 SLL 0x5,A5 +rom:00068e44 ADD A5,A7 +rom:00068e46 ADDI 0x1ada70,A7 +rom:00068e4c MOVE *A9(0x20),A5,0x0 +rom:00068e50 MOVE A5,*A7(0x20),0x1 +rom:00068e54 SUB A7,A7 +rom:00068e56 MOVE A7,*A13,0x1 +rom:00068e58 MOVE *A13,A11,0x1 +rom:00068e5a SLL 0x5,A11 +rom:00068e5c ADD A9,A11 +rom:00068e5e MOVE *A11(0x40),A11,0x1 +rom:00068e62 JRNE 0x00068e8a +rom:00068e64 MOVE A14,-*SP,0x1 +rom:00068e66 MOVK 0x2,A11 +rom:00068e68 MOVE A11,*A14+,0x1 +rom:00068e6a SUB A7,A7 +rom:00068e6c MOVE A7,*A14+,0x1 +rom:00068e6e SETF 0x8,0x0,0x0 +rom:00068e70 MOVE *A9(0x8),A8,0x0 +rom:00068e74 MOVE A8,*A14+,0x1 +rom:00068e76 MOVE 0x1ad960,*A14+,0x1 +rom:00068e7c MOVE *A13(0xffe0),*A14+,0x1 +rom:00068e80 CALLA 0x07effa5e +rom:00068e86 MOVE A11,A8 +rom:00068e88 JR 0x00068ebc +rom:00068e8a MOVE *A13(0xffe0),A11,0x1 +rom:00068e8e MOVE *A11,A7,0x1 +rom:00068e90 MOVE A7,A5 +rom:00068e92 SLL 0x7,A7 +rom:00068e94 SLL 0x5,A5 +rom:00068e96 ADD A5,A7 +rom:00068e98 ADDI 0x1ada70,A7 +rom:00068e9e MOVE *A13,A5,0x1 +rom:00068ea0 SLL 0x5,A5 +rom:00068ea2 ADD A5,A7 +rom:00068ea4 MOVE *A13,A5,0x1 +rom:00068ea6 SLL 0x5,A5 +rom:00068ea8 ADD A9,A5 +rom:00068eaa MOVE *A5(0x40),*A7(0x40),0x1 +rom:00068eb0 MOVE *A13,A7,0x1 +rom:00068eb2 INC A7 +rom:00068eb4 MOVE A7,*A13,0x1 +rom:00068eb6 SUBK 0x3,A7 +rom:00068eb8 JRC 0x00068e58 +rom:00068eba SUB A8,A8 +rom:00068ebc MOVE *SP(0xc0),A14,0x1 +rom:00068ec0 MMFM SP,0x2aa0 diff --git a/xie/ghidra-evidence/handlers/slot06_068EC6.txt b/xie/ghidra-evidence/handlers/slot06_068EC6.txt new file mode 100644 index 0000000..fa45973 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot06_068EC6.txt @@ -0,0 +1,35 @@ +rom:00068ec6 MMTM SP,0x554 +rom:00068eca MOVE A14,A13 +rom:00068ecc ADDI 0x100,A14 +rom:00068ed0 MOVE *A13(0xffe0),A11,0x1 +rom:00068ed4 MOVE *A11(0x40),A9,0x1 +rom:00068ed8 SETF 0x10,0x0,0x0 +rom:00068eda MOVE *A9(0x10),A11,0x0 +rom:00068ede DEC A11 +rom:00068ee0 JREQ 0x00068ee6 +rom:00068ee2 MOVK 0x10,A8 +rom:00068ee4 JR 0x00068f2e +rom:00068ee6 MOVK 0x1,A11 +rom:00068ee8 MOVB A11,*A13 +rom:00068eea SUB A7,A7 +rom:00068eec MOVB *A7,*A13(0x8) +rom:00068ef0 MOVE *A13(0xffe0),A5,0x1 +rom:00068ef4 MOVE *A5(0xe0),*A13(0x10),0x0 +rom:00068efa MOVE A7,*A13(0x20),0x1 +rom:00068efe MOVE A14,-*SP,0x1 +rom:00068f00 MOVE A13,A5 +rom:00068f02 ADDI 0x60,A5 +rom:00068f06 MOVE A5,*A14+,0x1 +rom:00068f08 MOVE A13,A5 +rom:00068f0a ADDI 0x40,A5 +rom:00068f0e MOVE A5,*A14+,0x1 +rom:00068f10 MOVE *A13(0xffe0),*A14+,0x1 +rom:00068f14 CALLA 0x07ea8f38 +rom:00068f1a MOVE A14,-*SP,0x1 +rom:00068f1c MOVE A13,*A14+,0x1 +rom:00068f1e MOVK 0x0,A7 +rom:00068f20 MOVE A7,*A14+,0x1 +rom:00068f22 MOVE *A13(0xffe0),*A14+,0x1 +rom:00068f26 CALLA 0x07e6a422 +rom:00068f2e MOVE *SP(0xc0),A14,0x1 +rom:00068f32 MMFM SP,0x2aa0 diff --git a/xie/ghidra-evidence/handlers/slot07_066866.txt b/xie/ghidra-evidence/handlers/slot07_066866.txt new file mode 100644 index 0000000..58b8359 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot07_066866.txt @@ -0,0 +1,42 @@ +rom:00066866 MMTM SP,0x54 +rom:0006686a MOVE A14,A13 +rom:0006686c ADDK 0x0,A14 +rom:0006686e MOVE *A13(0xffe0),A11,0x1 +rom:00066872 MOVE *A11(0x40),A9,0x1 +rom:00066876 SETF 0x10,0x0,0x0 +rom:00066878 MOVE *A9(0x10),A11,0x0 +rom:0006687c SUBK 0x4,A11 +rom:0006687e JREQ 0x000668ca +rom:00066880 MOVK 0x10,A8 +rom:00066882 JR 0x000668da +rom:00066884 MOVE A14,-*SP,0x1 +rom:00066886 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006688a CALLA 0x07ea742c +rom:00066890 MOVE A8,*A13,0x1 +rom:00066892 JR 0x000668d8 +rom:00066894 MOVE A14,-*SP,0x1 +rom:00066896 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006689a CALLA 0x07ea759a +rom:000668a0 MOVE A8,*A13,0x1 +rom:000668a2 JR 0x000668d8 +rom:000668a4 MOVE A14,-*SP,0x1 +rom:000668a6 MOVK 0x1,A11 +rom:000668a8 MOVE A11,*A14+,0x1 +rom:000668aa MOVE *A9(0x40),*A14+,0x1 +rom:000668ae SETF 0x8,0x0,0x0 +rom:000668b0 MOVE *A9(0x8),A8,0x0 +rom:000668b4 MOVE A8,*A14+,0x1 +rom:000668b6 MOVE 0x1ad960,*A14+,0x1 +rom:000668bc MOVE *A13(0xffe0),*A14+,0x1 +rom:000668c0 CALLA 0x07effa5e +rom:000668c6 MOVE A11,A8 +rom:000668c8 JR 0x000668da +rom:000668ca MOVE *A9(0x20),A8,0x1 +rom:000668ce DEC A8 +rom:000668d0 JREQ 0x00066884 +rom:000668d2 DEC A8 +rom:000668d4 JREQ 0x00066894 +rom:000668d6 JR 0x000668a4 +rom:000668d8 MOVE *A13,A8,0x1 +rom:000668da MOVE *SP(0x80),A14,0x1 +rom:000668de MMFM SP,0x2a00 diff --git a/xie/ghidra-evidence/handlers/slot08_0668E4.txt b/xie/ghidra-evidence/handlers/slot08_0668E4.txt new file mode 100644 index 0000000..f74d3a5 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot08_0668E4.txt @@ -0,0 +1,58 @@ +rom:000668e4 MMTM SP,0x54 +rom:000668e8 MOVE A14,A13 +rom:000668ea ADDK 0x0,A14 +rom:000668ec MOVE *A13(0xffe0),A11,0x1 +rom:000668f0 MOVE *A11(0x40),A9,0x1 +rom:000668f4 SETF 0x10,0x0,0x0 +rom:000668f6 MOVE *A9(0x10),A11,0x0 +rom:000668fa SUBK 0x3,A11 +rom:000668fc JRNC 0x00066968 +rom:000668fe MOVK 0x10,A8 +rom:00066900 JR 0x00066984 +rom:00066902 MOVE A14,-*SP,0x1 +rom:00066904 MOVE *A13(0xffe0),*A14+,0x1 +rom:00066908 CALLA 0x07ea76ca +rom:0006690e MOVE A8,*A13,0x1 +rom:00066910 JR 0x00066982 +rom:00066912 MOVE A14,-*SP,0x1 +rom:00066914 MOVE *A13(0xffe0),*A14+,0x1 +rom:00066918 CALLA 0x07ea78da +rom:0006691e MOVE A8,*A13,0x1 +rom:00066920 JR 0x00066982 +rom:00066922 MOVE A14,-*SP,0x1 +rom:00066924 MOVE *A13(0xffe0),*A14+,0x1 +rom:00066928 CALLA 0x07ea7b46 +rom:0006692e MOVE A8,*A13,0x1 +rom:00066930 JR 0x00066982 +rom:00066932 MOVE A14,-*SP,0x1 +rom:00066934 MOVE *A13(0xffe0),*A14+,0x1 +rom:00066938 CALLA 0x07ea7da8 +rom:0006693e MOVE A8,*A13,0x1 +rom:00066940 JR 0x00066982 +rom:00066942 MOVE A14,-*SP,0x1 +rom:00066944 MOVK 0x1,A11 +rom:00066946 MOVE A11,*A14+,0x1 +rom:00066948 MOVE *A9(0x40),*A14+,0x1 +rom:0006694c SETF 0x8,0x0,0x0 +rom:0006694e MOVE *A9(0x8),A8,0x0 +rom:00066952 MOVE A8,*A14+,0x1 +rom:00066954 MOVE 0x1ad960,*A14+,0x1 +rom:0006695a MOVE *A13(0xffe0),*A14+,0x1 +rom:0006695e CALLA 0x07effa5e +rom:00066964 MOVE A11,A8 +rom:00066966 JR 0x00066984 +rom:00066968 MOVE *A9(0x20),A8,0x1 +rom:0006696c DEC A8 +rom:0006696e JREQ 0x00066912 +rom:00066970 DEC A8 +rom:00066972 JREQ 0x00066912 +rom:00066974 SUBK 0x2,A8 +rom:00066976 JREQ 0x00066902 +rom:00066978 DEC A8 +rom:0006697a JREQ 0x00066922 +rom:0006697c DEC A8 +rom:0006697e JREQ 0x00066932 +rom:00066980 JR 0x00066942 +rom:00066982 MOVE *A13,A8,0x1 +rom:00066984 MOVE *SP(0x80),A14,0x1 +rom:00066988 MMFM SP,0x2a00 diff --git a/xie/ghidra-evidence/handlers/slot09_06698E.txt b/xie/ghidra-evidence/handlers/slot09_06698E.txt new file mode 100644 index 0000000..b9c29e9 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot09_06698E.txt @@ -0,0 +1,73 @@ +rom:0006698e MMTM SP,0x154 +rom:00066992 MOVE A14,A13 +rom:00066994 ADDI 0x40,A14 +rom:00066998 MOVE *A13(0xffe0),A11,0x1 +rom:0006699c MOVE *A11(0x40),A9,0x1 +rom:000669a0 SETF 0x10,0x0,0x0 +rom:000669a2 MOVE *A9(0x10),A11,0x0 +rom:000669a6 SUBK 0x3,A11 +rom:000669a8 JREQ 0x000669ec +rom:000669aa MOVK 0x10,A8 +rom:000669ac JR 0x00066a84 +rom:000669ae MOVE @0x1ad990,A11,0x0 +rom:000669b4 MOVE A11,*A13(0x20),0x1 +rom:000669b8 JR 0x00066a1c +rom:000669ba MOVE @0x1ad9a0,A11,0x0 +rom:000669c0 MOVE A11,*A13(0x20),0x1 +rom:000669c4 JR 0x00066a1c +rom:000669c6 MOVE A14,-*SP,0x1 +rom:000669c8 MOVK 0x1,A11 +rom:000669ca MOVE A11,*A14+,0x1 +rom:000669cc MOVE *A9(0x40),*A14+,0x1 +rom:000669d0 SETF 0x8,0x0,0x0 +rom:000669d2 MOVE *A9(0x8),A8,0x0 +rom:000669d6 MOVE A8,*A14+,0x1 +rom:000669d8 MOVE 0x1ad960,*A14+,0x1 +rom:000669de MOVE *A13(0xffe0),*A14+,0x1 +rom:000669e2 CALLA 0x07effa5e +rom:000669e8 MOVE A11,A8 +rom:000669ea JR 0x00066a84 +rom:000669ec MOVE *A9(0x20),A8,0x1 +rom:000669f0 DEC A8 +rom:000669f2 CMPI 0x5,A8 +rom:000669f6 JRHI 0x000669c6 +rom:000669f8 SLL 0x5,A8 +rom:000669fa ADDI 0x3f535020,A8 +rom:00066a00 MOVE *A8,A8,0x1 +rom:00066a02 JUMP A8 +rom:00066a1c MOVE A14,-*SP,0x1 +rom:00066a1e SETF 0x10,0x0,0x0 +rom:00066a20 MOVE @0x1ad980,A11,0x0 +rom:00066a26 MOVE A11,*A14+,0x1 +rom:00066a28 MOVE *A13(0x20),*A14+,0x1 +rom:00066a2c MOVE *A9(0x40),*A14+,0x1 +rom:00066a30 CALLA 0x07f174a4 +rom:00066a36 MOVE A8,*A13,0x1 +rom:00066a38 MOVE A8,A11 +rom:00066a3a JRNE 0x00066a40 +rom:00066a3c SUB A8,A8 +rom:00066a3e JR 0x00066a84 +rom:00066a40 SETF 0x8,0x0,0x0 +rom:00066a42 MOVE *A8(0x20),A11,0x0 +rom:00066a46 MOVE *A9(0x20),A7,0x1 +rom:00066a4a CMP A7,A11 +rom:00066a4c JREQ 0x00066a72 +rom:00066a4e MOVE A14,-*SP,0x1 +rom:00066a50 MOVK 0xe,A11 +rom:00066a52 MOVE A11,*A14+,0x1 +rom:00066a54 MOVE *A9(0x40),*A14+,0x1 +rom:00066a58 MOVE *A9(0x8),A8,0x0 +rom:00066a5c MOVE A8,*A14+,0x1 +rom:00066a5e MOVE 0x1ad960,*A14+,0x1 +rom:00066a64 MOVE *A13(0xffe0),*A14+,0x1 +rom:00066a68 CALLA 0x07effa5e +rom:00066a6e MOVE A11,A8 +rom:00066a70 JR 0x00066a84 +rom:00066a72 MOVE A14,-*SP,0x1 +rom:00066a74 MOVK 0x1,A11 +rom:00066a76 MOVE A11,*A14+,0x1 +rom:00066a78 MOVE *A9(0x40),*A14+,0x1 +rom:00066a7c CALLA 0x07f170ea +rom:00066a82 SUB A8,A8 +rom:00066a84 MOVE *SP(0xa0),A14,0x1 +rom:00066a88 MMFM SP,0x2a80 diff --git a/xie/ghidra-evidence/handlers/slot10_066B64.txt b/xie/ghidra-evidence/handlers/slot10_066B64.txt new file mode 100644 index 0000000..7ca81d0 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot10_066B64.txt @@ -0,0 +1,59 @@ +rom:00066b64 MMTM SP,0x54 +rom:00066b68 MOVE A14,A13 +rom:00066b6a ADDK 0x0,A14 +rom:00066b6c MOVE *A13(0xffe0),A11,0x1 +rom:00066b70 MOVE *A11(0x40),A9,0x1 +rom:00066b74 SETF 0x10,0x0,0x0 +rom:00066b76 MOVE *A9(0x10),A11,0x0 +rom:00066b7a SUBK 0x3,A11 +rom:00066b7c JREQ 0x00066bf8 +rom:00066b7e MOVK 0x10,A8 +rom:00066b80 JR 0x00066c2a +rom:00066b82 MOVE A14,-*SP,0x1 +rom:00066b84 MOVE *A13(0xffe0),*A14+,0x1 +rom:00066b88 CALLA 0x07ea83a4 +rom:00066b8e MOVE A8,*A13,0x1 +rom:00066b90 JR 0x00066c28 +rom:00066b92 MOVE A14,-*SP,0x1 +rom:00066b94 MOVE *A13(0xffe0),*A14+,0x1 +rom:00066b98 CALLA 0x07ea8462 +rom:00066b9e MOVE A8,*A13,0x1 +rom:00066ba0 JR 0x00066c28 +rom:00066ba2 MOVE A14,-*SP,0x1 +rom:00066ba4 MOVE *A13(0xffe0),*A14+,0x1 +rom:00066ba8 CALLA 0x07ea8516 +rom:00066bae MOVE A8,*A13,0x1 +rom:00066bb0 JR 0x00066c28 +rom:00066bb2 MOVE A14,-*SP,0x1 +rom:00066bb4 MOVE *A13(0xffe0),*A14+,0x1 +rom:00066bb8 CALLA 0x07ea8660 +rom:00066bbe MOVE A8,*A13,0x1 +rom:00066bc0 JR 0x00066c28 +rom:00066bc2 MOVE A14,-*SP,0x1 +rom:00066bc4 MOVE *A13(0xffe0),*A14+,0x1 +rom:00066bc8 CALLA 0x07ea872a +rom:00066bce MOVE A8,*A13,0x1 +rom:00066bd0 JR 0x00066c28 +rom:00066bd2 MOVE A14,-*SP,0x1 +rom:00066bd4 MOVK 0x1,A11 +rom:00066bd6 MOVE A11,*A14+,0x1 +rom:00066bd8 MOVE *A9(0x40),*A14+,0x1 +rom:00066bdc SETF 0x8,0x0,0x0 +rom:00066bde MOVE *A9(0x8),A8,0x0 +rom:00066be2 MOVE A8,*A14+,0x1 +rom:00066be4 MOVE 0x1ad960,*A14+,0x1 +rom:00066bea MOVE *A13(0xffe0),*A14+,0x1 +rom:00066bee CALLA 0x07effa5e +rom:00066bf4 MOVE A11,A8 +rom:00066bf6 JR 0x00066c2a +rom:00066bf8 MOVE *A9(0x20),A8,0x1 +rom:00066bfc DEC A8 +rom:00066bfe CMPI 0x5,A8 +rom:00066c02 JRHI 0x00066bd2 +rom:00066c04 SLL 0x5,A8 +rom:00066c06 ADDI 0x3f536080,A8 +rom:00066c0c MOVE *A8,A8,0x1 +rom:00066c0e JUMP A8 +rom:00066c28 MOVE *A13,A8,0x1 +rom:00066c2a MOVE *SP(0x80),A14,0x1 +rom:00066c2e MMFM SP,0x2a00 diff --git a/xie/ghidra-evidence/handlers/slot10_selectors.txt b/xie/ghidra-evidence/handlers/slot10_selectors.txt new file mode 100644 index 0000000..b30e632 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot10_selectors.txt @@ -0,0 +1,6 @@ +slot10 sel=1 : ERROR code=1 bad=0x0 minor_op=10 +slot10 sel=2 : ERROR code=1 bad=0x0 minor_op=10 +slot10 sel=3 : ERROR code=1 bad=0x0 minor_op=10 +slot10 sel=4 : ERROR code=1 bad=0x0 minor_op=10 +slot10 sel=5 : ERROR code=1 bad=0x0 minor_op=10 +slot1 full : REPLY len=8 hdr=0200030020000000e0564100f09b8f00 extra=feff7c0102190000000000000000000000000000000000000000000000000000 diff --git a/xie/ghidra-evidence/handlers/slot11_0667B6.txt b/xie/ghidra-evidence/handlers/slot11_0667B6.txt new file mode 100644 index 0000000..2165eda --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot11_0667B6.txt @@ -0,0 +1,58 @@ +rom:000667b6 MMTM SP,0x154 +rom:000667ba MOVE A14,A13 +rom:000667bc ADDI 0x60,A14 +rom:000667c0 MOVE *A13(0xffe0),A11,0x1 +rom:000667c4 MOVE *A11(0x40),A9,0x1 +rom:000667c8 SETF 0x10,0x0,0x0 +rom:000667ca MOVE *A9(0x10),A11,0x0 +rom:000667ce SUBK 0x3,A11 +rom:000667d0 JREQ 0x000667d6 +rom:000667d2 MOVK 0x10,A8 +rom:000667d4 JR 0x0006685c +rom:000667d6 MOVE A14,-*SP,0x1 +rom:000667d8 MOVI 0xffff,A11 +rom:000667dc MOVE A11,*A14+,0x1 +rom:000667de MOVE *A9(0x20),*A14+,0x1 +rom:000667e2 SUB A7,A7 +rom:000667e4 MOVE A7,*A14+,0x1 +rom:000667e6 MOVE A13,*A14+,0x1 +rom:000667e8 MOVE *A13(0xffe0),*A14+,0x1 +rom:000667ec CALLA 0x07ea6fa0 +rom:000667f2 MOVE A8,*A13(0x40),0x1 +rom:000667f6 MOVE A8,A8 +rom:000667f8 JRNE 0x0006685c +rom:000667fa MOVE A14,-*SP,0x1 +rom:000667fc MOVE A7,*A14+,0x1 +rom:000667fe MOVE *A9(0x40),*A14+,0x1 +rom:00066802 MOVE A13,A7 +rom:00066804 ADDK 0x0,A7 +rom:00066806 MOVE A7,*A14+,0x1 +rom:00066808 SUB A7,A7 +rom:0006680a MOVE A7,*A14+,0x1 +rom:0006680c MOVE *A13(0xffe0),*A14+,0x1 +rom:00066810 CALLA 0x07ea6fa0 +rom:00066816 MOVE A8,*A13(0x40),0x1 +rom:0006681a MOVE A8,A8 +rom:0006681c JRNE 0x0006685c +rom:0006681e MOVE A14,-*SP,0x1 +rom:00066820 MOVE A7,*A14+,0x1 +rom:00066822 MOVE *A13(0x20),*A14+,0x1 +rom:00066826 MOVE *A13(0x0),*A14+,0x1 +rom:0006682a CALLA 0x07ea72a4 +rom:00066830 MOVE A8,A8 +rom:00066832 JRNE 0x0006685a +rom:00066834 MOVE A14,-*SP,0x1 +rom:00066836 MOVK 0xb,A7 +rom:00066838 MOVE A7,*A14+,0x1 +rom:0006683a MOVE *A9(0x20),*A14+,0x1 +rom:0006683e SETF 0x8,0x0,0x0 +rom:00066840 MOVE *A9(0x8),A8,0x0 +rom:00066844 MOVE A8,*A14+,0x1 +rom:00066846 MOVE 0x1ad960,*A14+,0x1 +rom:0006684c MOVE *A13(0xffe0),*A14+,0x1 +rom:00066850 CALLA 0x07effa5e +rom:00066856 MOVE A7,A8 +rom:00066858 JR 0x0006685c +rom:0006685a MOVE A7,A8 +rom:0006685c MOVE *SP(0xa0),A14,0x1 +rom:00066860 MMFM SP,0x2a80 diff --git a/xie/ghidra-evidence/handlers/slot12_066738.txt b/xie/ghidra-evidence/handlers/slot12_066738.txt new file mode 100644 index 0000000..5e7be27 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot12_066738.txt @@ -0,0 +1,42 @@ +rom:00066738 MMTM SP,0x154 +rom:0006673c MOVE A14,A13 +rom:0006673e ADDI 0x40,A14 +rom:00066742 MOVE *A13(0xffe0),A11,0x1 +rom:00066746 MOVE *A11(0x40),A9,0x1 +rom:0006674a SETF 0x10,0x0,0x0 +rom:0006674c MOVE *A9(0x10),A11,0x0 +rom:00066750 SUBK 0x2,A11 +rom:00066752 JREQ 0x00066758 +rom:00066754 MOVK 0x10,A8 +rom:00066756 JR 0x000667ac +rom:00066758 MOVE A14,-*SP,0x1 +rom:0006675a SUB A11,A11 +rom:0006675c MOVE A11,*A14+,0x1 +rom:0006675e MOVE *A9(0x20),*A14+,0x1 +rom:00066762 MOVE A11,*A14+,0x1 +rom:00066764 MOVE A13,*A14+,0x1 +rom:00066766 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006676a CALLA 0x07ea6fa0 +rom:00066770 MOVE A8,*A13(0x20),0x1 +rom:00066774 MOVE A8,A8 +rom:00066776 JRNE 0x000667ac +rom:00066778 MOVE *A13,A11,0x1 +rom:0006677a SETF 0x1,0x0,0x0 +rom:0006677c MOVE *A11(0x28),A11,0x0 +rom:00066780 JREQ 0x0006679c +rom:00066782 MOVE A14,-*SP,0x1 +rom:00066784 MOVE *A13,A11,0x1 +rom:00066786 MOVE *A11(0x80),*A14+,0x1 +rom:0006678a CALLA 0x07f63dc8 +rom:00066790 SETF 0x10,0x1,0x0 +rom:00066792 MOVE *A11(0x30),A7,0x0 +rom:00066796 DEC A7 +rom:00066798 MOVE A7,*A11(0x30),0x0 +rom:0006679c MOVE *A13,A11,0x1 +rom:0006679e SUB A7,A7 +rom:000667a0 SETF 0x1,0x0,0x0 +rom:000667a2 MOVE A7,*A11(0x28),0x0 +rom:000667a6 MOVE A7,*A11(0x29),0x0 +rom:000667aa MOVE A7,A8 +rom:000667ac MOVE *SP(0xa0),A14,0x1 +rom:000667b0 MMFM SP,0x2a80 diff --git a/xie/ghidra-evidence/handlers/slot13_066A8E.txt b/xie/ghidra-evidence/handlers/slot13_066A8E.txt new file mode 100644 index 0000000..9b0ddf8 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot13_066A8E.txt @@ -0,0 +1,68 @@ +rom:00066a8e MMTM SP,0x154 +rom:00066a92 MOVE A14,A13 +rom:00066a94 ADDI 0x80,A14 +rom:00066a98 MOVE *A13(0xffe0),A11,0x1 +rom:00066a9c MOVE *A11(0x40),A9,0x1 +rom:00066aa0 SETF 0x10,0x0,0x0 +rom:00066aa2 MOVE *A9(0x10),A11,0x0 +rom:00066aa6 SUBK 0x2,A11 +rom:00066aa8 JREQ 0x00066aae +rom:00066aaa MOVK 0x10,A8 +rom:00066aac JR 0x00066b5a +rom:00066aae MOVE A14,-*SP,0x1 +rom:00066ab0 MOVI 0xffff,A11 +rom:00066ab4 MOVE A11,*A14+,0x1 +rom:00066ab6 MOVE *A9(0x20),*A14+,0x1 +rom:00066aba SUB A7,A7 +rom:00066abc MOVE A7,*A14+,0x1 +rom:00066abe MOVE A13,A7 +rom:00066ac0 ADDI 0x40,A7 +rom:00066ac4 MOVE A7,*A14+,0x1 +rom:00066ac6 MOVE *A13(0xffe0),*A14+,0x1 +rom:00066aca CALLA 0x07ea6fa0 +rom:00066ad0 MOVE A8,*A13(0x60),0x1 +rom:00066ad4 MOVE A8,A8 +rom:00066ad6 JRNE 0x00066b5a +rom:00066ad8 MOVE *A13(0x40),A7,0x1 +rom:00066adc SUB A11,A11 +rom:00066ade SETF 0x1,0x0,0x0 +rom:00066ae0 MOVE A11,*A7(0x29),0x0 +rom:00066ae4 MOVK 0x1,A11 +rom:00066ae6 MOVE A11,*A7(0x28),0x0 +rom:00066aea SETF 0x10,0x1,0x0 +rom:00066aec MOVE *A7(0x30),A11,0x0 +rom:00066af0 INC A11 +rom:00066af2 MOVE A11,*A7(0x30),0x0 +rom:00066af6 MOVE A14,-*SP,0x1 +rom:00066af8 MOVE *A7(0x80),*A14+,0x1 +rom:00066afc CALLA 0x07f63c88 +rom:00066b02 MOVE A14,-*SP,0x1 +rom:00066b04 MOVE A7,*A14+,0x1 +rom:00066b06 CALLA 0x07ea6df6 +rom:00066b0c MOVE A8,*A13,0x1 +rom:00066b0e MOVE A14,-*SP,0x1 +rom:00066b10 MOVE A7,*A14+,0x1 +rom:00066b12 CALLA 0x07e59b38 +rom:00066b18 MOVE A8,*A13(0x20),0x1 +rom:00066b1c MOVE *A13,A11,0x1 +rom:00066b1e JRNE 0x00066b2e +rom:00066b20 MOVE A14,-*SP,0x1 +rom:00066b22 MOVE A7,*A14+,0x1 +rom:00066b24 MOVE *A13(0xffe0),*A14+,0x1 +rom:00066b28 CALLA 0x07e7fe48 +rom:00066b2e MOVE *A13(0x20),A7,0x1 +rom:00066b32 JREQ 0x00066b58 +rom:00066b34 MOVE A14,-*SP,0x1 +rom:00066b36 MOVE A7,*A14+,0x1 +rom:00066b38 MOVE *A9(0x20),*A14+,0x1 +rom:00066b3c SETF 0x8,0x0,0x0 +rom:00066b3e MOVE *A9(0x8),A8,0x0 +rom:00066b42 MOVE A8,*A14+,0x1 +rom:00066b44 MOVE 0x1ad960,*A14+,0x1 +rom:00066b4a MOVE *A13(0xffe0),*A14+,0x1 +rom:00066b4e CALLA 0x07effa5e +rom:00066b54 MOVE A7,A8 +rom:00066b56 JR 0x00066b5a +rom:00066b58 SUB A8,A8 +rom:00066b5a MOVE *SP(0xa0),A14,0x1 +rom:00066b5e MMFM SP,0x2a80 diff --git a/xie/ghidra-evidence/handlers/slot14_066C34.txt b/xie/ghidra-evidence/handlers/slot14_066C34.txt new file mode 100644 index 0000000..88f338d --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot14_066C34.txt @@ -0,0 +1,140 @@ +rom:00066c34 MMTM SP,0x554 +rom:00066c38 MOVE A14,A13 +rom:00066c3a ADDI 0x60,A14 +rom:00066c3e MOVE *A13(0xffe0),A11,0x1 +rom:00066c42 MOVE *A11(0x40),A9,0x1 +rom:00066c46 SETF 0x10,0x0,0x0 +rom:00066c48 MOVE *A9(0x10),A11,0x0 +rom:00066c4c SUBK 0x4,A11 +rom:00066c4e JREQ 0x00066c56 +rom:00066c50 MOVK 0x10,A8 +rom:00066c52 JR 0x00066dec +rom:00066c56 MOVE A14,-*SP,0x1 +rom:00066c58 MOVI 0xffff,A11 +rom:00066c5c MOVE A11,*A14+,0x1 +rom:00066c5e MOVE *A9(0x20),*A14+,0x1 +rom:00066c62 MOVE A13,A7 +rom:00066c64 ADDK 0x0,A7 +rom:00066c66 MOVE A7,*A14+,0x1 +rom:00066c68 MOVE A13,*A14+,0x1 +rom:00066c6a MOVE *A13(0xffe0),*A14+,0x1 +rom:00066c6e CALLA 0x07ea6fa0 +rom:00066c74 MOVE A8,*A13(0x40),0x1 +rom:00066c78 MOVE A8,A8 +rom:00066c7a JRNE 0x00066dec +rom:00066c7e MOVE *A13,A7,0x1 +rom:00066c80 JRNE 0x00066caa +rom:00066c82 MOVE A14,-*SP,0x1 +rom:00066c84 MOVK 0xe,A11 +rom:00066c86 MOVE A11,*A14+,0x1 +rom:00066c88 MOVE *A9(0x20),*A14+,0x1 +rom:00066c8c SETF 0x8,0x0,0x0 +rom:00066c8e MOVE *A9(0x8),A8,0x0 +rom:00066c92 MOVE A8,*A14+,0x1 +rom:00066c94 MOVE 0x1ad960,*A14+,0x1 +rom:00066c9a MOVE *A13(0xffe0),*A14+,0x1 +rom:00066c9e CALLA 0x07effa5e +rom:00066ca4 MOVE A11,A8 +rom:00066ca6 JR 0x00066dec +rom:00066caa MOVE *A13(0xffe0),A11,0x1 +rom:00066cae MOVE *A9(0x40),A7,0x1 +rom:00066cb2 ANDI -0x100000,A7 +rom:00066cb8 MOVE *A11(0x20),A11,0x1 +rom:00066cbc CMP A7,A11 +rom:00066cbe JRNE 0x00066cea +rom:00066cc0 MOVE *A9(0x40),A11,0x1 +rom:00066cc4 BTST 0x13,A11 +rom:00066cc6 JRNE 0x00066cea +rom:00066cc8 MOVE A14,-*SP,0x1 +rom:00066cca SETF 0x10,0x0,0x0 +rom:00066ccc MOVE @0x1ad980,A11,0x0 +rom:00066cd2 MOVE A11,*A14+,0x1 +rom:00066cd4 MOVE @0x1ad990,A7,0x0 +rom:00066cda MOVE A7,*A14+,0x1 +rom:00066cdc MOVE *A9(0x40),*A14+,0x1 +rom:00066ce0 CALLA 0x07f174a4 +rom:00066ce6 MOVE A8,A7 +rom:00066ce8 JREQ 0x00066d10 +rom:00066cea MOVE A14,-*SP,0x1 +rom:00066cec MOVK 0xe,A11 +rom:00066cee MOVE A11,*A14+,0x1 +rom:00066cf0 MOVE *A9(0x40),*A14+,0x1 +rom:00066cf4 SETF 0x8,0x0,0x0 +rom:00066cf6 MOVE *A9(0x8),A8,0x0 +rom:00066cfa MOVE A8,*A14+,0x1 +rom:00066cfc MOVE 0x1ad960,*A14+,0x1 +rom:00066d02 MOVE *A13(0xffe0),*A14+,0x1 +rom:00066d06 CALLA 0x07effa5e +rom:00066d0c MOVE A11,A8 +rom:00066d0e JR 0x00066dec +rom:00066d10 SETF 0x8,0x0,0x0 +rom:00066d12 MOVE *A9(0x60),A11,0x0 +rom:00066d16 JREQ 0x00066d58 +rom:00066d18 MOVE A14,-*SP,0x1 +rom:00066d1a MOVE *A13(0x20),A11,0x1 +rom:00066d1e MOVE *A11(0x160),A7,0x1 +rom:00066d22 ADDI 0xd8,A7 +rom:00066d26 MOVE A7,*A14+,0x1 +rom:00066d28 CALLA 0x07eac5a8 +rom:00066d2e MOVE A8,A7 +rom:00066d30 JRNE 0x00066d58 +rom:00066d32 MOVE A14,-*SP,0x1 +rom:00066d34 MOVK 0xb,A7 +rom:00066d36 MOVE A7,*A14+,0x1 +rom:00066d38 MOVE *A9(0x40),*A14+,0x1 +rom:00066d3c SETF 0x8,0x0,0x0 +rom:00066d3e MOVE *A9(0x8),A8,0x0 +rom:00066d42 MOVE A8,*A14+,0x1 +rom:00066d44 MOVE 0x1ad960,*A14+,0x1 +rom:00066d4a MOVE *A13(0xffe0),*A14+,0x1 +rom:00066d4e CALLA 0x07effa5e +rom:00066d54 MOVE A7,A8 +rom:00066d56 JR 0x00066dec +rom:00066d58 MOVE *A13(0x20),A11,0x1 +rom:00066d5c SETF 0x10,0x1,0x0 +rom:00066d5e MOVE *A11(0x30),A7,0x0 +rom:00066d62 INC A7 +rom:00066d64 MOVE A7,*A11(0x30),0x0 +rom:00066d68 MOVE *A9(0x40),*A11(0x0),0x1 +rom:00066d6e MOVE A14,-*SP,0x1 +rom:00066d70 SETF 0x10,0x0,0x0 +rom:00066d72 MOVE @0x1ad980,A7,0x0 +rom:00066d78 MOVE A7,*A14+,0x1 +rom:00066d7a MOVI 0x3f566ed0,A11 +rom:00066d80 MOVE A11,*A14+,0x1 +rom:00066d82 MOVE *A13(0x20),*A14+,0x1 +rom:00066d86 MOVE @0x1ad990,A11,0x0 +rom:00066d8c MOVE A11,*A14+,0x1 +rom:00066d8e MOVE *A9(0x40),*A14+,0x1 +rom:00066d92 CALLA 0x07f16ca2 +rom:00066d98 MOVE *A13(0x20),A11,0x1 +rom:00066d9c SETF 0x8,0x0,0x0 +rom:00066d9e MOVE *A9(0x60),A7,0x0 +rom:00066da2 JREQ 0x00066da8 +rom:00066da4 SUB A7,A7 +rom:00066da6 JR 0x00066daa +rom:00066da8 MOVK 0x1,A7 +rom:00066daa SETF 0x10,0x1,0x0 +rom:00066dac SEXT A7,0x0 +rom:00066dae MOVE *A11(0x30),A5,0x0 +rom:00066db2 SUB A7,A5 +rom:00066db4 MOVE A5,*A11(0x30),0x0 +rom:00066db8 SETF 0x8,0x0,0x0 +rom:00066dba MOVE *A11(0x20),A7,0x0 +rom:00066dbe SUBK 0x3,A7 +rom:00066dc0 JRNE 0x00066dea +rom:00066dc2 MOVE *A11(0x160),A7,0x1 +rom:00066dc6 SETF 0x1,0x0,0x0 +rom:00066dc8 MOVE *A9(0x60),*A7(0x13c),0x0 +rom:00066dce MOVE *A11(0x160),A7,0x1 +rom:00066dd2 MOVE *A9(0x60),*A7(0x13b),0x0 +rom:00066dd8 SETF 0x8,0x0,0x0 +rom:00066dda MOVE *A9(0x60),A7,0x0 +rom:00066dde JREQ 0x00066de4 +rom:00066de0 MOVK 0x2,A7 +rom:00066de2 JR 0x00066de6 +rom:00066de4 MOVK 0x3,A7 +rom:00066de6 MOVB *A7,*A11(0x20) +rom:00066dea SUB A8,A8 +rom:00066dec MOVE *SP(0xc0),A14,0x1 +rom:00066df0 MMFM SP,0x2aa0 diff --git a/xie/ghidra-evidence/handlers/slot15_06A536.txt b/xie/ghidra-evidence/handlers/slot15_06A536.txt new file mode 100644 index 0000000..edebe38 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot15_06A536.txt @@ -0,0 +1,36 @@ +rom:0006a536 MMTM SP,0x154 +rom:0006a53a MOVE A14,A13 +rom:0006a53c ADDI 0xc0,A14 +rom:0006a540 MOVE *A13(0xffe0),A11,0x1 +rom:0006a544 MOVE *A11(0x40),A9,0x1 +rom:0006a548 SETF 0x10,0x0,0x0 +rom:0006a54a MOVE *A9(0x10),A11,0x0 +rom:0006a54e SUBK 0x3,A11 +rom:0006a550 JREQ 0x0006a556 +rom:0006a552 MOVK 0x10,A8 +rom:0006a554 JR 0x0006a59a +rom:0006a556 MOVE A14,-*SP,0x1 +rom:0006a558 MOVI 0xffff,A11 +rom:0006a55c MOVE A11,*A14+,0x1 +rom:0006a55e MOVK 0x3,A7 +rom:0006a560 MOVE A7,*A14+,0x1 +rom:0006a562 MOVE *A9(0x20),*A14+,0x1 +rom:0006a566 MOVE A13,A7 +rom:0006a568 ADDI 0x40,A7 +rom:0006a56c MOVE A7,*A14+,0x1 +rom:0006a56e MOVE A13,A7 +rom:0006a570 ADDK 0x0,A7 +rom:0006a572 MOVE A7,*A14+,0x1 +rom:0006a574 MOVE A13,*A14+,0x1 +rom:0006a576 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006a57a CALLA 0x07eab966 +rom:0006a580 MOVE A8,*A13(0xa0),0x1 +rom:0006a584 MOVE A8,A8 +rom:0006a586 JRNE 0x0006a59a +rom:0006a588 MOVE A14,-*SP,0x1 +rom:0006a58a MOVE *A9(0x40),*A14+,0x1 +rom:0006a58e MOVE *A13(0x20),*A14+,0x1 +rom:0006a592 CALLA 0x07eaafe6 +rom:0006a598 SUB A8,A8 +rom:0006a59a MOVE *SP(0xa0),A14,0x1 +rom:0006a59e MMFM SP,0x2a80 diff --git a/xie/ghidra-evidence/handlers/slot18_06A5A4.txt b/xie/ghidra-evidence/handlers/slot18_06A5A4.txt new file mode 100644 index 0000000..c87951b --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot18_06A5A4.txt @@ -0,0 +1,139 @@ +rom:0006a5a4 MMTM SP,0x554 +rom:0006a5a8 MOVE A14,A13 +rom:0006a5aa ADDI 0xc0,A14 +rom:0006a5ae MOVE *A13(0xffe0),A11,0x1 +rom:0006a5b2 MOVE *A11(0x40),A9,0x1 +rom:0006a5b6 SETF 0x10,0x0,0x0 +rom:0006a5b8 MOVE *A9(0x10),A11,0x0 +rom:0006a5bc SUBK 0x4,A11 +rom:0006a5be JRNC 0x0006a5c6 +rom:0006a5c0 MOVK 0x10,A8 +rom:0006a5c2 JR 0x0006a764 +rom:0006a5c6 MOVE A14,-*SP,0x1 +rom:0006a5c8 SETF 0x8,0x0,0x0 +rom:0006a5ca MOVE *A9(0x68),A8,0x0 +rom:0006a5ce MOVE A8,*A14+,0x1 +rom:0006a5d0 MOVK 0x2,A11 +rom:0006a5d2 MOVE A11,*A14+,0x1 +rom:0006a5d4 MOVE *A9(0x20),*A14+,0x1 +rom:0006a5d8 MOVE A13,A7 +rom:0006a5da ADDI 0x40,A7 +rom:0006a5de MOVE A7,*A14+,0x1 +rom:0006a5e0 MOVE A13,A11 +rom:0006a5e2 ADDK 0x0,A11 +rom:0006a5e4 MOVE A11,*A14+,0x1 +rom:0006a5e6 MOVE A13,*A14+,0x1 +rom:0006a5e8 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006a5ec CALLA 0x07eab966 +rom:0006a5f2 MOVE A8,*A13(0xa0),0x1 +rom:0006a5f6 MOVE A8,A8 +rom:0006a5f8 JREQ 0x0006a638 +rom:0006a5fa JR 0x0006a764 +rom:0006a5fe MOVE A14,-*SP,0x1 +rom:0006a600 MOVE *A9(0x68),A8,0x0 +rom:0006a604 MOVE A8,*A14+,0x1 +rom:0006a606 MOVE *A13(0x40),*A14+,0x1 +rom:0006a60a MOVE *A13(0x20),*A14+,0x1 +rom:0006a60e MOVE *A13(0xffe0),*A14+,0x1 +rom:0006a612 CALLA 0x07eabefa +rom:0006a618 MOVE A8,*A13(0x80),0x1 +rom:0006a61c JR 0x0006a650 +rom:0006a61e MOVE A14,-*SP,0x1 +rom:0006a620 MOVE *A13(0x40),*A14+,0x1 +rom:0006a624 MOVE *A13(0x20),*A14+,0x1 +rom:0006a628 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006a62c CALLA 0x07eabc2a +rom:0006a632 MOVE A8,*A13(0x80),0x1 +rom:0006a636 JR 0x0006a650 +rom:0006a638 MOVE *A13(0x40),A7,0x1 +rom:0006a63c SETF 0x8,0x0,0x0 +rom:0006a63e MOVE *A7(0x10),A8,0x0 +rom:0006a642 JREQ 0x0006a5fe +rom:0006a644 DEC A8 +rom:0006a646 JREQ 0x0006a61e +rom:0006a648 DEC A8 +rom:0006a64a JREQ 0x0006a61e +rom:0006a64c DEC A8 +rom:0006a64e JREQ 0x0006a61e +rom:0006a650 MOVE *A13(0x80),A11,0x1 +rom:0006a654 JREQ 0x0006a672 +rom:0006a656 MOVK 0x1,A7 +rom:0006a658 MOVB *A7,*A9(0x60) +rom:0006a65c MOVE *A13(0x20),A7,0x1 +rom:0006a660 MOVE *A7(0x160),A7,0x1 +rom:0006a664 MOVE *A7(0xd8),A7,0x1 +rom:0006a668 MOVI 0xff,A11 +rom:0006a66c MOVB *A11,*A7(0x20) +rom:0006a670 JR 0x0006a688 +rom:0006a672 MOVE *A13(0x20),A7,0x1 +rom:0006a676 MOVE *A7(0x160),A5,0x1 +rom:0006a67a MOVE *A5(0xd8),A5,0x1 +rom:0006a67e MOVE *A13(0x40),A7,0x1 +rom:0006a682 MOVB *A7(0x10),*A5(0x20) +rom:0006a688 SETF 0x8,0x0,0x0 +rom:0006a68a MOVE *A9(0x60),A11,0x0 +rom:0006a68e JREQ 0x0006a762 +rom:0006a690 MOVE A14,-*SP,0x1 +rom:0006a692 MOVE *A9(0x68),A8,0x0 +rom:0006a696 MOVE A8,*A14+,0x1 +rom:0006a698 MOVE *A13(0x20),A11,0x1 +rom:0006a69c ADDI 0x120,A11 +rom:0006a6a0 MOVE A11,*A14+,0x1 +rom:0006a6a2 CALLA 0x07eab1bc +rom:0006a6a8 CALLA 0x07f67f38 +rom:0006a6ae MOVE A8,@0x1b2b50,0x1 +rom:0006a6b4 MOVE A14,-*SP,0x1 +rom:0006a6b6 MOVE @0x1b2b30,A11,0x1 +rom:0006a6bc SUB A11,A8 +rom:0006a6be MOVE A8,*A14+,0x1 +rom:0006a6c0 MOVI 0x3f562850,A8 +rom:0006a6c6 MOVE A8,*A14+,0x1 +rom:0006a6c8 CALLA 0x07f24f78 +rom:0006a6ce MOVE *A13(0x20),A11,0x1 +rom:0006a6d2 MOVE *A11(0x120),A7,0x1 +rom:0006a6d6 JRNE 0x0006a762 +rom:0006a6d8 MOVE *A11(0x140),A7,0x1 +rom:0006a6dc JREQ 0x0006a756 +rom:0006a6de MOVE *A11(0x140),A7,0x1 +rom:0006a6e2 SETF 0x1,0x0,0x0 +rom:0006a6e4 MOVE *A7(0x28),A7,0x0 +rom:0006a6e8 JREQ 0x0006a756 +rom:0006a6ea MOVE A14,-*SP,0x1 +rom:0006a6ec MOVE *A13(0x0),*A14+,0x1 +rom:0006a6f0 CALLA 0x07ea6df6 +rom:0006a6f6 MOVE A8,*A13(0x80),0x1 +rom:0006a6fa MOVE A8,A5 +rom:0006a6fc JRNE 0x0006a762 +rom:0006a6fe MOVE *A11(0x160),A7,0x1 +rom:0006a702 MOVK 0x1,A5 +rom:0006a704 SETF 0x1,0x0,0x0 +rom:0006a706 MOVE A5,*A7(0x13a),0x0 +rom:0006a70a MOVE A14,-*SP,0x1 +rom:0006a70c MOVE *A11(0x140),*A14+,0x1 +rom:0006a710 CALLA 0x07e59b38 +rom:0006a716 MOVE A8,*A13(0x80),0x1 +rom:0006a71a MOVE A14,-*SP,0x1 +rom:0006a71c MOVE *A13(0x0),*A14+,0x1 +rom:0006a720 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006a724 CALLA 0x07e7fe48 +rom:0006a72a MOVE *A13(0x80),A7,0x1 +rom:0006a72e JREQ 0x0006a762 +rom:0006a730 MOVE A14,-*SP,0x1 +rom:0006a732 MOVE A7,*A14+,0x1 +rom:0006a734 MOVE *A13,A5,0x1 +rom:0006a736 MOVE *A5(0x0),*A14+,0x1 +rom:0006a73a SETF 0x8,0x0,0x0 +rom:0006a73c MOVE *A9(0x8),A8,0x0 +rom:0006a740 MOVE A8,*A14+,0x1 +rom:0006a742 MOVE 0x1ad960,*A14+,0x1 +rom:0006a748 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006a74c CALLA 0x07effa5e +rom:0006a752 MOVE A7,A8 +rom:0006a754 JR 0x0006a764 +rom:0006a756 MOVE *A11(0x160),A7,0x1 +rom:0006a75a MOVK 0x1,A5 +rom:0006a75c SETF 0x1,0x0,0x0 +rom:0006a75e MOVE A5,*A7(0x13a),0x0 +rom:0006a762 SUB A8,A8 +rom:0006a764 MOVE *SP(0xc0),A14,0x1 +rom:0006a768 MMFM SP,0x2aa0 diff --git a/xie/ghidra-evidence/handlers/slot19_06A76E.txt b/xie/ghidra-evidence/handlers/slot19_06A76E.txt new file mode 100644 index 0000000..1984ac6 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot19_06A76E.txt @@ -0,0 +1,234 @@ +rom:0006a76e MMTM SP,0x554 +rom:0006a772 MOVE A14,A13 +rom:0006a774 ADDI 0x160,A14 +rom:0006a778 MOVE *A13(0xffe0),A11,0x1 +rom:0006a77c MOVE *A11(0x40),A9,0x1 +rom:0006a780 SETF 0x10,0x0,0x0 +rom:0006a782 MOVE *A9(0x10),A11,0x0 +rom:0006a786 SUBK 0x8,A11 +rom:0006a788 JRNC 0x0006a790 +rom:0006a78a MOVK 0x10,A8 +rom:0006a78c JR 0x0006aa4a +rom:0006a790 MOVE A14,-*SP,0x1 +rom:0006a792 MOVE *A9(0xc0),*A14+,0x1 +rom:0006a796 MOVK 0x3,A11 +rom:0006a798 MOVE A11,*A14+,0x1 +rom:0006a79a MOVE *A9(0x20),*A14+,0x1 +rom:0006a79e MOVE A13,A7 +rom:0006a7a0 ADDK 0x0,A7 +rom:0006a7a2 MOVE A7,*A14+,0x1 +rom:0006a7a4 MOVE A13,*A14+,0x1 +rom:0006a7a6 SUB A11,A11 +rom:0006a7a8 MOVE A11,*A14+,0x1 +rom:0006a7aa MOVE *A13(0xffe0),*A14+,0x1 +rom:0006a7ae CALLA 0x07eab966 +rom:0006a7b4 MOVE A8,*A13(0x140),0x1 +rom:0006a7b8 MOVE A8,A8 +rom:0006a7ba JRNE 0x0006aa4a +rom:0006a7be MOVE *A9(0x40),A11,0x1 +rom:0006a7c2 JRLE 0x0006a7ca +rom:0006a7c4 MOVE *A9(0x40),A11,0x1 +rom:0006a7c8 JR 0x0006a7cc +rom:0006a7ca SUB A11,A11 +rom:0006a7cc MOVE A11,*A13(0x80),0x1 +rom:0006a7d0 MOVE *A9(0x60),A7,0x1 +rom:0006a7d4 JRLE 0x0006a7dc +rom:0006a7d6 MOVE *A9(0x60),A7,0x1 +rom:0006a7da JR 0x0006a7de +rom:0006a7dc SUB A7,A7 +rom:0006a7de MOVE A7,*A13(0xa0),0x1 +rom:0006a7e2 MOVE *A9(0x80),A7,0x1 +rom:0006a7e6 MOVE *A9(0x40),A5,0x1 +rom:0006a7ea ADD A5,A7 +rom:0006a7ec MOVE *A13,A5,0x1 +rom:0006a7ee MOVE *A5(0x80),A5,0x1 +rom:0006a7f2 CMP A5,A7 +rom:0006a7f4 JRLS 0x0006a800 +rom:0006a7f6 MOVE *A13,A7,0x1 +rom:0006a7f8 MOVE *A7(0x80),A5,0x1 +rom:0006a7fc SUB A11,A5 +rom:0006a7fe JR 0x0006a80e +rom:0006a800 MOVE *A9(0x80),A7,0x1 +rom:0006a804 MOVE *A9(0x40),A5,0x1 +rom:0006a808 ADD A5,A7 +rom:0006a80a SUB A11,A7 +rom:0006a80c MOVE A7,A5 +rom:0006a80e MOVE A5,*A13(0xc0),0x1 +rom:0006a812 MOVE *A9(0xa0),A7,0x1 +rom:0006a816 MOVE *A9(0x60),A5,0x1 +rom:0006a81a ADD A5,A7 +rom:0006a81c MOVE *A13,A5,0x1 +rom:0006a81e MOVE *A5(0xa0),A5,0x1 +rom:0006a822 CMP A5,A7 +rom:0006a824 JRLS 0x0006a834 +rom:0006a826 MOVE *A13,A7,0x1 +rom:0006a828 MOVE *A7(0xa0),A5,0x1 +rom:0006a82c MOVE *A13(0xa0),A7,0x1 +rom:0006a830 SUB A7,A5 +rom:0006a832 JR 0x0006a846 +rom:0006a834 MOVE *A9(0xa0),A7,0x1 +rom:0006a838 MOVE *A9(0x60),A5,0x1 +rom:0006a83c ADD A5,A7 +rom:0006a83e MOVE *A13(0xa0),A5,0x1 +rom:0006a842 SUB A5,A7 +rom:0006a844 MOVE A7,A5 +rom:0006a846 MOVE A5,*A13(0xe0),0x1 +rom:0006a84a MOVE *A13(0xc0),A7,0x1 +rom:0006a84e JRLE 0x0006a854 +rom:0006a850 MOVE A5,A8 +rom:0006a852 JRGT 0x0006a87c +rom:0006a854 MOVE A14,-*SP,0x1 +rom:0006a856 MOVK 0x2,A5 +rom:0006a858 MOVE A5,*A14+,0x1 +rom:0006a85a MOVE *A9(0x20),*A14+,0x1 +rom:0006a85e SETF 0x8,0x0,0x0 +rom:0006a860 MOVE *A9(0x8),A8,0x0 +rom:0006a864 MOVE A8,*A14+,0x1 +rom:0006a866 MOVE 0x1ad960,*A14+,0x1 +rom:0006a86c MOVE *A13(0xffe0),*A14+,0x1 +rom:0006a870 CALLA 0x07effa5e +rom:0006a876 MOVE A5,A8 +rom:0006a878 JR 0x0006aa4a +rom:0006a87c MOVE A9,A5 +rom:0006a87e ADDI 0x100,A5 +rom:0006a882 MOVE A5,*A13(0x120),0x1 +rom:0006a886 SUB A5,A5 +rom:0006a888 MOVE A5,*A13(0x60),0x1 +rom:0006a88c MOVE *A9(0xc0),*A13(0x40),0x1 +rom:0006a892 MOVE *A13(0x40),A7,0x1 +rom:0006a896 JREQ 0x0006aa28 +rom:0006a89a MOVE *A13(0x40),A11,0x1 +rom:0006a89e BTST 0x0,A11 +rom:0006a8a0 JREQ 0x0006aa10 +rom:0006a8a4 MOVE *A13(0x20),A7,0x1 +rom:0006a8a8 MOVE *A13(0x60),A5,0x1 +rom:0006a8ac SLL 0x5,A5 +rom:0006a8ae ADD A7,A5 +rom:0006a8b0 MOVE *A5(0x160),A5,0x1 +rom:0006a8b4 MOVE *A13(0x80),*A5(0xa8),0x1 +rom:0006a8ba MOVE *A13(0x60),A5,0x1 +rom:0006a8be SLL 0x5,A5 +rom:0006a8c0 ADD A7,A5 +rom:0006a8c2 MOVE *A5(0x160),A5,0x1 +rom:0006a8c6 MOVE *A13(0xa0),*A5(0xe8),0x1 +rom:0006a8cc MOVE *A13(0x60),A5,0x1 +rom:0006a8d0 SLL 0x5,A5 +rom:0006a8d2 ADD A7,A5 +rom:0006a8d4 MOVE *A5(0x160),A5,0x1 +rom:0006a8d8 MOVE *A13(0x80),A7,0x1 +rom:0006a8dc MOVE *A13(0xc0),A11,0x1 +rom:0006a8e0 ADD A11,A7 +rom:0006a8e2 DEC A7 +rom:0006a8e4 MOVE A7,*A5(0xc8),0x1 +rom:0006a8e8 MOVE *A13(0x20),A7,0x1 +rom:0006a8ec MOVE *A13(0x60),A5,0x1 +rom:0006a8f0 SLL 0x5,A5 +rom:0006a8f2 ADD A7,A5 +rom:0006a8f4 MOVE *A5(0x160),A5,0x1 +rom:0006a8f8 MOVE *A13(0xa0),A7,0x1 +rom:0006a8fc MOVE *A13(0xe0),A11,0x1 +rom:0006a900 ADD A11,A7 +rom:0006a902 DEC A7 +rom:0006a904 MOVE A7,*A5(0x108),0x1 +rom:0006a908 MOVE *A13(0x20),A7,0x1 +rom:0006a90c MOVE *A13(0x60),A5,0x1 +rom:0006a910 SLL 0x5,A5 +rom:0006a912 ADD A7,A5 +rom:0006a914 MOVE *A5(0x160),A5,0x1 +rom:0006a918 MOVE *A13(0xc0),*A5(0x128),0x1 +rom:0006a91e MOVE *A13(0x60),A5,0x1 +rom:0006a922 SLL 0x5,A5 +rom:0006a924 ADD A7,A5 +rom:0006a926 MOVE *A5(0x160),A5,0x1 +rom:0006a92a MOVE A11,*A5(0x148),0x1 +rom:0006a92e MOVE *A13(0x60),A5,0x1 +rom:0006a932 SLL 0x5,A5 +rom:0006a934 ADD A7,A5 +rom:0006a936 MOVE *A5(0x160),A5,0x1 +rom:0006a93a MOVE *A13(0x60),A11,0x1 +rom:0006a93e SLL 0x5,A11 +rom:0006a940 ADD A7,A11 +rom:0006a942 MOVE *A11(0x160),A11,0x1 +rom:0006a946 MOVE *A13(0xc0),A7,0x1 +rom:0006a94a MOVE *A11(0x68),A11,0x1 +rom:0006a94e MPYU A7,A11 +rom:0006a950 MOVE A11,*A5(0x88),0x1 +rom:0006a954 MOVE *A13(0x20),A11,0x1 +rom:0006a958 MOVE *A13(0x60),A5,0x1 +rom:0006a95c SLL 0x5,A5 +rom:0006a95e ADD A11,A5 +rom:0006a960 MOVE *A5(0x160),A5,0x1 +rom:0006a964 MOVE *A13(0x60),A7,0x1 +rom:0006a968 SLL 0x5,A7 +rom:0006a96a ADD A11,A7 +rom:0006a96c MOVE *A7(0x160),A7,0x1 +rom:0006a970 MOVE *A13(0xe0),A11,0x1 +rom:0006a974 MOVE *A7(0x88),A7,0x1 +rom:0006a978 MPYU A11,A7 +rom:0006a97a MOVE A7,*A5(0x48),0x1 +rom:0006a97e MOVE *A13(0x20),A7,0x1 +rom:0006a982 MOVE *A13(0x60),A5,0x1 +rom:0006a986 SLL 0x5,A5 +rom:0006a988 ADD A7,A5 +rom:0006a98a MOVE *A5(0x160),A5,0x1 +rom:0006a98e MOVE *A13(0x120),*A5(0x28),0x1 +rom:0006a994 MOVE A14,-*SP,0x1 +rom:0006a996 MOVE *A13(0x60),*A14+,0x1 +rom:0006a99a MOVE *A13,A5,0x1 +rom:0006a99c MOVE *A5(0x160),*A14+,0x1 +rom:0006a9a0 MOVE A7,*A14+,0x1 +rom:0006a9a2 CALLA 0x07eab640 +rom:0006a9a8 MOVE A8,*A13(0x100),0x1 +rom:0006a9ac MOVE A8,A8 +rom:0006a9ae JREQ 0x0006a9d6 +rom:0006a9b0 MOVE A14,-*SP,0x1 +rom:0006a9b2 MOVE A8,*A14+,0x1 +rom:0006a9b4 MOVE *A5(0x0),*A14+,0x1 +rom:0006a9b8 SETF 0x8,0x0,0x0 +rom:0006a9ba MOVE *A9(0x8),A8,0x0 +rom:0006a9be MOVE A8,*A14+,0x1 +rom:0006a9c0 MOVE 0x1ad960,*A14+,0x1 +rom:0006a9c6 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006a9ca CALLA 0x07effa5e +rom:0006a9d0 MOVE *A13(0x100),A8,0x1 +rom:0006a9d4 JR 0x0006aa4a +rom:0006a9d6 MOVE *A13(0x60),A5,0x1 +rom:0006a9da SLL 0x5,A5 +rom:0006a9dc ADD A7,A5 +rom:0006a9de MOVE *A5(0x160),A5,0x1 +rom:0006a9e2 SUB A7,A7 +rom:0006a9e4 MOVE A7,*A5(0x28),0x1 +rom:0006a9e8 MOVE *A13(0x20),A5,0x1 +rom:0006a9ec MOVE *A13(0x60),A7,0x1 +rom:0006a9f0 SLL 0x5,A7 +rom:0006a9f2 ADD A5,A7 +rom:0006a9f4 MOVE *A7(0x160),A7,0x1 +rom:0006a9f8 MOVE *A7(0x48),A7,0x1 +rom:0006a9fc ADDK 0x1f,A7 +rom:0006a9fe SRL 0x1d,A7 +rom:0006aa00 MOVK 0x3,A5 +rom:0006aa02 ANDN A5,A7 +rom:0006aa04 SLL 0x3,A7 +rom:0006aa06 MOVE *A13(0x120),A5,0x1 +rom:0006aa0a ADD A5,A7 +rom:0006aa0c MOVE A7,*A13(0x120),0x1 +rom:0006aa10 MOVE *A13(0x60),A11,0x1 +rom:0006aa14 INC A11 +rom:0006aa16 MOVE A11,*A13(0x60),0x1 +rom:0006aa1a MOVE *A13(0x40),A7,0x1 +rom:0006aa1e SRL 0x1f,A7 +rom:0006aa20 MOVE A7,*A13(0x40),0x1 +rom:0006aa24 JRNE 0x0006a89a +rom:0006aa28 SETF 0x8,0x0,0x0 +rom:0006aa2a MOVE *A9(0xe0),A11,0x0 +rom:0006aa2e JREQ 0x0006aa48 +rom:0006aa30 MOVE A14,-*SP,0x1 +rom:0006aa32 MOVI 0xffffff,A11 +rom:0006aa38 MOVE A11,*A14+,0x1 +rom:0006aa3a MOVE *A13,A5,0x1 +rom:0006aa3c ADDI 0x120,A5 +rom:0006aa40 MOVE A5,*A14+,0x1 +rom:0006aa42 CALLA 0x07eab1bc +rom:0006aa48 SUB A8,A8 +rom:0006aa4a MOVE *SP(0xc0),A14,0x1 +rom:0006aa4e MMFM SP,0x2aa0 diff --git a/xie/ghidra-evidence/handlers/slot20_06AA54.txt b/xie/ghidra-evidence/handlers/slot20_06AA54.txt new file mode 100644 index 0000000..6267940 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot20_06AA54.txt @@ -0,0 +1,449 @@ +rom:0006aa54 MMTM SP,0x554 +rom:0006aa58 MOVE A14,A13 +rom:0006aa5a ADDI 0x1a0,A14 +rom:0006aa5e MOVK 0x19,A11 +rom:0006aa60 MOVE A11,*A13(0xc0),0x1 +rom:0006aa64 MOVE *A13(0xffe0),A7,0x1 +rom:0006aa68 MOVE *A7(0x40),A9,0x1 +rom:0006aa6c SETF 0x10,0x0,0x0 +rom:0006aa6e MOVE *A9(0x10),A7,0x0 +rom:0006aa72 CMPI 0x23,A7 +rom:0006aa76 JREQ 0x0006aa7e +rom:0006aa78 MOVK 0x10,A8 +rom:0006aa7a JR 0x0006afdc +rom:0006aa7e CALLA 0x07f67f38 +rom:0006aa84 MOVE A8,@0x1b2b30,0x1 +rom:0006aa8a MOVE A14,-*SP,0x1 +rom:0006aa8c MOVI 0xffff,A7 +rom:0006aa90 MOVE A7,*A14+,0x1 +rom:0006aa92 SETF 0x8,0x0,0x0 +rom:0006aa94 MOVE *A9(0x68),A8,0x0 +rom:0006aa98 MOVE A8,*A14+,0x1 +rom:0006aa9a MOVE *A9(0x20),*A14+,0x1 +rom:0006aa9e MOVE A13,A7 +rom:0006aaa0 ADDI 0x40,A7 +rom:0006aaa4 MOVE A7,*A14+,0x1 +rom:0006aaa6 MOVE A13,A7 +rom:0006aaa8 ADDK 0x0,A7 +rom:0006aaaa MOVE A7,*A14+,0x1 +rom:0006aaac MOVE A13,*A14+,0x1 +rom:0006aaae MOVE *A13(0xffe0),*A14+,0x1 +rom:0006aab2 CALLA 0x07eab966 +rom:0006aab8 MOVE A8,*A13(0x180),0x1 +rom:0006aabc MOVE A8,A8 +rom:0006aabe JRNE 0x0006afdc +rom:0006aac2 SUB A7,A7 +rom:0006aac4 MOVE A7,*A13(0x100),0x1 +rom:0006aac8 MOVE A7,*A13(0x80),0x1 +rom:0006aacc MOVE *A13(0x80),A11,0x1 +rom:0006aad0 SLL 0x5,A11 +rom:0006aad2 ADD A13,A11 +rom:0006aad4 MOVE *A13(0x20),A7,0x1 +rom:0006aad8 MOVE *A7(0x160),A5,0x1 +rom:0006aadc MOVE *A13(0x80),A7,0x1 +rom:0006aae0 SLL 0x5,A7 +rom:0006aae2 ADD A7,A5 +rom:0006aae4 MOVE *A5(0xd8),A7,0x1 +rom:0006aae8 JREQ 0x0006ab46 +rom:0006aaea ADDI 0x40,A14 +rom:0006aaee MOVE A14,-*SP,0x1 +rom:0006aaf0 ADDI 0x40,A14 +rom:0006aaf4 MOVE A14,-*SP,0x1 +rom:0006aaf6 MOVE *A13(0x20),A7,0x1 +rom:0006aafa MOVE *A7(0x160),A5,0x1 +rom:0006aafe MOVE *A13(0x80),A7,0x1 +rom:0006ab02 SLL 0x5,A7 +rom:0006ab04 ADD A7,A5 +rom:0006ab06 MOVE *A5(0xd8),A7,0x1 +rom:0006ab0a MOVE *A7(0x1a8),A8,0x1 +rom:0006ab0e CALLA 0x07fc22de +rom:0006ab14 CALLA 0x07fc2c34 +rom:0006ab1a ADDI 0x40,A14 +rom:0006ab1e MOVE A14,-*SP,0x1 +rom:0006ab20 MOVI 0x3f562d00,A8 +rom:0006ab26 MOVE *A8+,*A14+,0x1 +rom:0006ab28 MOVE *A8+,*A14+,0x1 +rom:0006ab2a CALLA 0x07fc2c34 +rom:0006ab30 CALLA 0x07fc1aca +rom:0006ab36 CALLA 0x07fc288a +rom:0006ab3c CALLA 0x07fc216a +rom:0006ab42 MOVE A8,A7 +rom:0006ab44 JR 0x0006ab48 +rom:0006ab46 SUB A7,A7 +rom:0006ab48 MOVE A7,*A11(0x120),0x1 +rom:0006ab4c MOVE *A13(0x80),A11,0x1 +rom:0006ab50 INC A11 +rom:0006ab52 MOVE A11,*A13(0x80),0x1 +rom:0006ab56 DEC A11 +rom:0006ab58 SLL 0x5,A11 +rom:0006ab5a ADD A13,A11 +rom:0006ab5c MOVE *A13(0x100),A7,0x1 +rom:0006ab60 MOVE *A11(0x120),A11,0x1 +rom:0006ab64 ADD A7,A11 +rom:0006ab66 MOVE A11,*A13(0x100),0x1 +rom:0006ab6a MOVE *A13(0x80),A7,0x1 +rom:0006ab6e SUBK 0x3,A7 +rom:0006ab70 JRC 0x0006aacc +rom:0006ab72 SETF 0x8,0x0,0x0 +rom:0006ab74 MOVE *A9(0x70),A7,0x0 +rom:0006ab78 SUBK 0x4,A7 +rom:0006ab7a JRNE 0x0006ab82 +rom:0006ab7c MOVK 0x1,A7 +rom:0006ab7e MOVE A7,*A13(0x100),0x1 +rom:0006ab82 MOVE *A13(0x40),A11,0x1 +rom:0006ab86 JREQ 0x0006ac34 +rom:0006ab88 MOVE *A11(0x8),A7,0x0 +rom:0006ab8c MOVE *A9(0x70),A5,0x0 +rom:0006ab90 CMP A5,A7 +rom:0006ab92 JRNE 0x0006abd0 +rom:0006ab94 MOVE *A11(0x10),A7,0x0 +rom:0006ab98 MOVE *A9(0x60),A5,0x0 +rom:0006ab9c CMP A5,A7 +rom:0006ab9e JRNE 0x0006abd0 +rom:0006aba0 MOVE *A11(0x20),A7,0x1 +rom:0006aba4 MOVE *A9(0x40),A5,0x1 +rom:0006aba8 CMP A5,A7 +rom:0006abaa JRNE 0x0006abd0 +rom:0006abac MOVE *A11(0x40),A7,0x1 +rom:0006abb0 MOVE *A9(0x80),A5,0x1 +rom:0006abb4 AND A5,A7 +rom:0006abb6 JRNE 0x0006abd0 +rom:0006abb8 MOVE *A11(0x60),A7,0x1 +rom:0006abbc MOVE *A9(0x80),A5,0x1 +rom:0006abc0 AND A5,A7 +rom:0006abc2 JRNE 0x0006abd0 +rom:0006abc4 MOVE *A11(0x80),A7,0x1 +rom:0006abc8 MOVE *A9(0x80),A5,0x1 +rom:0006abcc CMP A5,A7 +rom:0006abce JRNC 0x0006abf6 +rom:0006abd0 MOVE A14,-*SP,0x1 +rom:0006abd2 MOVK 0x8,A7 +rom:0006abd4 MOVE A7,*A14+,0x1 +rom:0006abd6 MOVE *A9(0x20),*A14+,0x1 +rom:0006abda MOVE *A9(0x8),A8,0x0 +rom:0006abde MOVE A8,*A14+,0x1 +rom:0006abe0 MOVE 0x1ad960,*A14+,0x1 +rom:0006abe6 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006abea CALLA 0x07effa5e +rom:0006abf0 MOVE A7,A8 +rom:0006abf2 JR 0x0006afdc +rom:0006abf6 MOVE *A11(0x40),A7,0x1 +rom:0006abfa MOVE *A9(0x80),A5,0x1 +rom:0006abfe OR A5,A7 +rom:0006ac00 MOVE A7,*A11(0x40),0x1 +rom:0006ac04 JR 0x0006adf0 +rom:0006ac08 MOVK 0x1,A11 +rom:0006ac0a MOVE A11,*A13(0xc0),0x1 +rom:0006ac0e JR 0x0006ac44 +rom:0006ac10 MOVE *A13(0x20),A11,0x1 +rom:0006ac14 MOVE *A11(0x48),A7,0x0 +rom:0006ac18 MOVE A7,*A13(0xc0),0x1 +rom:0006ac1c JR 0x0006ac44 +rom:0006ac1e MOVE *A13(0x120),A11,0x1 +rom:0006ac22 MOVE *A13(0x140),A7,0x1 +rom:0006ac26 ADD A7,A11 +rom:0006ac28 MOVE *A13(0x160),A5,0x1 +rom:0006ac2c ADD A5,A11 +rom:0006ac2e MOVE A11,*A13(0xc0),0x1 +rom:0006ac32 JR 0x0006ac44 +rom:0006ac34 MOVE *A9(0x70),A8,0x0 +rom:0006ac38 DEC A8 +rom:0006ac3a JREQ 0x0006ac08 +rom:0006ac3c SUBK 0x2,A8 +rom:0006ac3e JREQ 0x0006ac10 +rom:0006ac40 DEC A8 +rom:0006ac42 JREQ 0x0006ac1e +rom:0006ac44 MOVK 0x1,A11 +rom:0006ac46 MOVE *A13(0xc0),A7,0x1 +rom:0006ac4a SLL A7,A11 +rom:0006ac4c MOVE *A9(0x80),A5,0x1 +rom:0006ac50 INC A5 +rom:0006ac52 CMP A11,A5 +rom:0006ac54 JRHI 0x0006ac5a +rom:0006ac56 SUBK 0x18,A7 +rom:0006ac58 JRLS 0x0006ad1e +rom:0006ac5a MOVE A14,-*SP,0x1 +rom:0006ac5c MOVK 0x8,A11 +rom:0006ac5e MOVE A11,*A14+,0x1 +rom:0006ac60 MOVE *A9(0x20),*A14+,0x1 +rom:0006ac64 SETF 0x8,0x0,0x0 +rom:0006ac66 MOVE *A9(0x8),A8,0x0 +rom:0006ac6a MOVE A8,*A14+,0x1 +rom:0006ac6c MOVE 0x1ad960,*A14+,0x1 +rom:0006ac72 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006ac76 CALLA 0x07effa5e +rom:0006ac7c MOVE A11,A8 +rom:0006ac7e JR 0x0006afdc +rom:0006ac82 MOVE *A13(0x20),A11,0x1 +rom:0006ac86 MOVE *A11(0x40),A7,0x0 +rom:0006ac8a DSJS A7,0x0006ac94 +rom:0006ac8c MOVE *A13(0xc0),A7,0x1 +rom:0006ac90 DEC A7 +rom:0006ac92 JREQ 0x0006ad34 +rom:0006ac94 MOVE A14,-*SP,0x1 +rom:0006ac96 MOVK 0x8,A7 +rom:0006ac98 MOVE A7,*A14+,0x1 +rom:0006ac9a MOVE *A9(0x20),*A14+,0x1 +rom:0006ac9e MOVE *A9(0x8),A8,0x0 +rom:0006aca2 MOVE A8,*A14+,0x1 +rom:0006aca4 MOVE 0x1ad960,*A14+,0x1 +rom:0006acaa MOVE *A13(0xffe0),*A14+,0x1 +rom:0006acae CALLA 0x07effa5e +rom:0006acb4 MOVE A7,A8 +rom:0006acb6 JR 0x0006afdc +rom:0006acba MOVE *A13(0x20),A11,0x1 +rom:0006acbe MOVE *A11(0x40),A7,0x0 +rom:0006acc2 DSJS A7,0x0006acd2 +rom:0006acc4 MOVE *A13(0xc0),A7,0x1 +rom:0006acc8 DSJS A7,0x0006acd2 +rom:0006acca MOVE *A9(0x68),A7,0x0 +rom:0006acce SUBK 0x3,A7 +rom:0006acd0 JRNE 0x0006ad34 +rom:0006acd2 MOVE A14,-*SP,0x1 +rom:0006acd4 MOVK 0x8,A7 +rom:0006acd6 MOVE A7,*A14+,0x1 +rom:0006acd8 MOVE *A9(0x20),*A14+,0x1 +rom:0006acdc MOVE *A9(0x8),A8,0x0 +rom:0006ace0 MOVE A8,*A14+,0x1 +rom:0006ace2 MOVE 0x1ad960,*A14+,0x1 +rom:0006ace8 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006acec CALLA 0x07effa5e +rom:0006acf2 MOVE A7,A8 +rom:0006acf4 JR 0x0006afdc +rom:0006acf8 MOVE A14,-*SP,0x1 +rom:0006acfa MOVK 0xe,A11 +rom:0006acfc MOVE A11,*A14+,0x1 +rom:0006acfe MOVE *A9(0x20),*A14+,0x1 +rom:0006ad02 MOVE *A9(0x8),A8,0x0 +rom:0006ad06 MOVE A8,*A14+,0x1 +rom:0006ad08 MOVE 0x1ad960,*A14+,0x1 +rom:0006ad0e MOVE *A13(0xffe0),*A14+,0x1 +rom:0006ad12 CALLA 0x07effa5e +rom:0006ad18 MOVE A11,A8 +rom:0006ad1a JR 0x0006afdc +rom:0006ad1e SETF 0x8,0x0,0x0 +rom:0006ad20 MOVE *A9(0x60),A8,0x0 +rom:0006ad24 JREQ 0x0006ac82 +rom:0006ad26 DEC A8 +rom:0006ad28 JREQ 0x0006acba +rom:0006ad2a DEC A8 +rom:0006ad2c JREQ 0x0006acba +rom:0006ad2e DEC A8 +rom:0006ad30 JREQ 0x0006acba +rom:0006ad32 JR 0x0006acf8 +rom:0006ad34 MOVE *A13(0x20),A11,0x1 +rom:0006ad38 MOVE A14,-*SP,0x1 +rom:0006ad3a MOVI 0x8c,A7 +rom:0006ad3e MOVE A7,*A14+,0x1 +rom:0006ad40 MOVK 0x1,A5 +rom:0006ad42 MOVE A5,*A14+,0x1 +rom:0006ad44 CALLA 0x07f63a30 +rom:0006ad4a MOVE A8,*A11(0x120),0x1 +rom:0006ad4e MOVE *A11(0x120),A5,0x1 +rom:0006ad52 JRNE 0x0006ad64 +rom:0006ad54 MOVE A14,-*SP,0x1 +rom:0006ad56 MOVI 0x3f562910,A8 +rom:0006ad5c MOVE A8,*A14+,0x1 +rom:0006ad5e CALLA 0x07f24f78 +rom:0006ad64 MOVE *A11(0x120),A5,0x1 +rom:0006ad68 JRNE 0x0006ad92 +rom:0006ad6a MOVE A14,-*SP,0x1 +rom:0006ad6c MOVK 0xb,A5 +rom:0006ad6e MOVE A5,*A14+,0x1 +rom:0006ad70 MOVE *A9(0x20),*A14+,0x1 +rom:0006ad74 SETF 0x8,0x0,0x0 +rom:0006ad76 MOVE *A9(0x8),A8,0x0 +rom:0006ad7a MOVE A8,*A14+,0x1 +rom:0006ad7c MOVE 0x1ad960,*A14+,0x1 +rom:0006ad82 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006ad86 CALLA 0x07effa5e +rom:0006ad8c MOVE A5,A8 +rom:0006ad8e JR 0x0006afdc +rom:0006ad92 MOVE *A11(0x120),*A13(0x40),0x1 +rom:0006ad98 MOVE *A13(0x40),A5,0x1 +rom:0006ad9c MOVB *A9(0x68),*A5(0x0) +rom:0006ada2 MOVB *A9(0x70),*A5(0x8) +rom:0006ada8 MOVB *A9(0x60),*A5(0x10) +rom:0006adae MOVE *A9(0x40),*A5(0x20),0x1 +rom:0006adb4 MOVE *A9(0x80),*A5(0x40),0x1 +rom:0006adba SUB A7,A7 +rom:0006adbc MOVE A7,*A5(0x60),0x1 +rom:0006adc0 MOVK 0x1,A7 +rom:0006adc2 MOVE *A13(0xc0),A11,0x1 +rom:0006adc6 SLL A11,A7 +rom:0006adc8 DEC A7 +rom:0006adca MOVE A7,*A5(0x80),0x1 +rom:0006adce MOVE *A13(0x20),A7,0x1 +rom:0006add2 MOVE *A7(0x120),A5,0x1 +rom:0006add6 JREQ 0x0006adf0 +rom:0006add8 MOVE *A7(0x120),A5,0x1 +rom:0006addc SETF 0x8,0x0,0x0 +rom:0006adde MOVE *A5,A5,0x0 +rom:0006ade0 SUBK 0x2,A5 +rom:0006ade2 JRNE 0x0006adf0 +rom:0006ade4 MOVE *A7(0x160),A5,0x1 +rom:0006ade8 SUB A7,A7 +rom:0006adea SETF 0x1,0x0,0x0 +rom:0006adec MOVE A7,*A5(0x13a),0x0 +rom:0006adf0 SUB A11,A11 +rom:0006adf2 MOVE A11,*A13(0x60),0x1 +rom:0006adf6 MOVK 0x1,A7 +rom:0006adf8 MOVE A7,*A13(0xa0),0x1 +rom:0006adfc MOVE *A13(0x40),A5,0x1 +rom:0006ae00 MOVE *A5(0x80),A5,0x1 +rom:0006ae04 AND A7,A5 +rom:0006ae06 JREQ 0x0006afda +rom:0006ae0a MOVE *A13(0xa0),A11,0x1 +rom:0006ae0e MOVE *A9(0x80),A7,0x1 +rom:0006ae12 AND A11,A7 +rom:0006ae14 JREQ 0x0006afb8 +rom:0006ae18 MOVE *A13(0x40),A7,0x1 +rom:0006ae1c SETF 0x8,0x0,0x0 +rom:0006ae1e MOVE *A7(0x8),A5,0x0 +rom:0006ae22 SUBK 0x3,A5 +rom:0006ae24 JRNE 0x0006ae34 +rom:0006ae26 MOVE *A13(0x60),A5,0x1 +rom:0006ae2a SLL 0x5,A5 +rom:0006ae2c ADD A13,A5 +rom:0006ae2e MOVE *A5(0x120),*A13(0x100),0x1 +rom:0006ae34 MOVE A14,-*SP,0x1 +rom:0006ae36 MOVE *A13(0x60),A5,0x1 +rom:0006ae3a SLL 0x5,A5 +rom:0006ae3c ADD A9,A5 +rom:0006ae3e MOVE *A5(0x160),*A14+,0x1 +rom:0006ae42 MOVE *A13(0x60),A5,0x1 +rom:0006ae46 SLL 0x3,A5 +rom:0006ae48 ADD A9,A5 +rom:0006ae4a MOVE *A5(0xa0),A8,0x0 +rom:0006ae4e MOVE A8,*A14+,0x1 +rom:0006ae50 MOVE *A7(0x10),A8,0x0 +rom:0006ae54 MOVE A8,*A14+,0x1 +rom:0006ae56 MOVE *A13(0x100),*A14+,0x1 +rom:0006ae5a CALLA 0x07eacd68 +rom:0006ae60 MOVE A8,*A13(0xe0),0x1 +rom:0006ae64 MOVE *A13(0x60),A5,0x1 +rom:0006ae68 SLL 0x5,A5 +rom:0006ae6a ADD A7,A5 +rom:0006ae6c MOVE A14,-*SP,0x1 +rom:0006ae6e SUB A7,A7 +rom:0006ae70 MOVE A7,*A14+,0x1 +rom:0006ae72 MOVE A7,*A14+,0x1 +rom:0006ae74 MOVE *A13(0x60),*A14+,0x1 +rom:0006ae78 MOVK 0x1,A7 +rom:0006ae7a MOVE *A13(0x100),A11,0x1 +rom:0006ae7e SLL A11,A7 +rom:0006ae80 MOVE A7,*A14+,0x1 +rom:0006ae82 MOVE *A13(0x60),A7,0x1 +rom:0006ae86 SLL 0x5,A7 +rom:0006ae88 ADD A9,A7 +rom:0006ae8a MOVE *A7(0x160),*A14+,0x1 +rom:0006ae8e MOVE *A13(0x60),A7,0x1 +rom:0006ae92 SLL 0x3,A7 +rom:0006ae94 ADD A9,A7 +rom:0006ae96 SETF 0x8,0x0,0x0 +rom:0006ae98 MOVE *A7(0xa0),A8,0x0 +rom:0006ae9c MOVE A8,*A14+,0x1 +rom:0006ae9e MOVE *A13(0x20),A7,0x1 +rom:0006aea2 MOVE *A7(0x120),A7,0x1 +rom:0006aea6 JREQ 0x0006aec4 +rom:0006aea8 MOVE *A13(0x20),A7,0x1 +rom:0006aeac MOVE *A7(0x120),A7,0x1 +rom:0006aeb0 MOVE *A7,A7,0x0 +rom:0006aeb2 SUBK 0x2,A7 +rom:0006aeb4 JRNE 0x0006aec4 +rom:0006aeb6 MOVE *A13(0x40),A7,0x1 +rom:0006aeba MOVE *A7(0x10),A7,0x0 +rom:0006aebe JRNE 0x0006aec4 +rom:0006aec0 SUB A7,A7 +rom:0006aec2 JR 0x0006aecc +rom:0006aec4 MOVE *A13(0x20),A7,0x1 +rom:0006aec8 MOVE *A7(0xa0),A7,0x1 +rom:0006aecc MOVE A7,*A14+,0x1 +rom:0006aece MOVE *A13(0x20),A7,0x1 +rom:0006aed2 MOVE *A7(0x80),*A14+,0x1 +rom:0006aed6 MOVE *A13(0x40),A7,0x1 +rom:0006aeda MOVE *A7(0x10),A8,0x0 +rom:0006aede MOVE A8,*A14+,0x1 +rom:0006aee0 MOVE *A13(0xe0),*A14+,0x1 +rom:0006aee4 CALLA 0x07eac660 +rom:0006aeea MOVE A8,*A5(0x160),0x1 +rom:0006aeee MOVE *A13(0x60),A5,0x1 +rom:0006aef2 SLL 0x5,A5 +rom:0006aef4 ADD A7,A5 +rom:0006aef6 MOVE *A5(0x160),A5,0x1 +rom:0006aefa JRNE 0x0006afa6 +rom:0006aefc MOVE *A9(0x80),*A7(0x60),0x1 +rom:0006af02 MOVE A14,-*SP,0x1 +rom:0006af04 MOVE *A9(0x80),*A14+,0x1 +rom:0006af08 MOVE *A13(0x20),*A14+,0x1 +rom:0006af0c CALLA 0x07eaafe6 +rom:0006af12 MOVE A14,-*SP,0x1 +rom:0006af14 MOVK 0xb,A5 +rom:0006af16 MOVE A5,*A14+,0x1 +rom:0006af18 MOVE *A9(0x20),*A14+,0x1 +rom:0006af1c SETF 0x8,0x0,0x0 +rom:0006af1e MOVE *A9(0x8),A8,0x0 +rom:0006af22 MOVE A8,*A14+,0x1 +rom:0006af24 MOVE 0x1ad960,*A14+,0x1 +rom:0006af2a MOVE *A13(0xffe0),*A14+,0x1 +rom:0006af2e CALLA 0x07effa5e +rom:0006af34 MOVE A5,A8 +rom:0006af36 JR 0x0006afdc +rom:0006af38 MOVE *A13(0x40),A11,0x1 +rom:0006af3c MOVE *A13(0x60),A7,0x1 +rom:0006af40 SLL 0x5,A7 +rom:0006af42 ADD A11,A7 +rom:0006af44 MOVE *A7(0x160),A7,0x1 +rom:0006af48 SUB A5,A5 +rom:0006af4a MOVE A5,*A7(0x188),0x1 +rom:0006af4e JR 0x0006afb8 +rom:0006af50 MOVE *A13(0x40),A11,0x1 +rom:0006af54 MOVE *A13(0x60),A7,0x1 +rom:0006af58 SLL 0x5,A7 +rom:0006af5a ADD A11,A7 +rom:0006af5c MOVE *A7(0x160),A7,0x1 +rom:0006af60 MOVE *A13(0x60),*A7(0x188),0x1 +rom:0006af66 JR 0x0006afb8 +rom:0006af68 MOVE *A13(0x40),A11,0x1 +rom:0006af6c MOVE *A13(0x60),A7,0x1 +rom:0006af70 SLL 0x5,A7 +rom:0006af72 ADD A11,A7 +rom:0006af74 MOVE *A7(0x160),A7,0x1 +rom:0006af78 MOVE *A13(0x60),A5,0x1 +rom:0006af7c MOVE *A13(0x120),A11,0x1 +rom:0006af80 CMP A11,A5 +rom:0006af82 JRNC 0x0006af88 +rom:0006af84 SUB A5,A5 +rom:0006af86 JR 0x0006afa0 +rom:0006af88 MOVE *A13(0x120),A11,0x1 +rom:0006af8c MOVE *A13(0x140),A5,0x1 +rom:0006af90 ADD A5,A11 +rom:0006af92 MOVE *A13(0x60),A5,0x1 +rom:0006af96 CMP A11,A5 +rom:0006af98 JRNC 0x0006af9e +rom:0006af9a MOVK 0x1,A5 +rom:0006af9c JR 0x0006afa0 +rom:0006af9e MOVK 0x2,A5 +rom:0006afa0 MOVE A5,*A7(0x188),0x1 +rom:0006afa4 JR 0x0006afb8 +rom:0006afa6 SETF 0x8,0x0,0x0 +rom:0006afa8 MOVE *A7(0x8),A8,0x0 +rom:0006afac DEC A8 +rom:0006afae JREQ 0x0006af38 +rom:0006afb0 SUBK 0x2,A8 +rom:0006afb2 JREQ 0x0006af50 +rom:0006afb4 DEC A8 +rom:0006afb6 JREQ 0x0006af68 +rom:0006afb8 MOVE *A13(0x60),A11,0x1 +rom:0006afbc INC A11 +rom:0006afbe MOVE A11,*A13(0x60),0x1 +rom:0006afc2 MOVE *A13(0xa0),A7,0x1 +rom:0006afc6 SLL 0x1,A7 +rom:0006afc8 MOVE A7,*A13(0xa0),0x1 +rom:0006afcc MOVE *A13(0x40),A5,0x1 +rom:0006afd0 MOVE *A5(0x80),A5,0x1 +rom:0006afd4 AND A7,A5 +rom:0006afd6 JRNE 0x0006ae0a +rom:0006afda SUB A8,A8 +rom:0006afdc MOVE *SP(0xc0),A14,0x1 +rom:0006afe0 MMFM SP,0x2aa0 diff --git a/xie/ghidra-evidence/handlers/slot21_062D40.txt b/xie/ghidra-evidence/handlers/slot21_062D40.txt new file mode 100644 index 0000000..7a38ded --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot21_062D40.txt @@ -0,0 +1,279 @@ +rom:00062d40 MMTM SP,0x554 +rom:00062d44 MOVE A14,A13 +rom:00062d46 ADDI 0x160,A14 +rom:00062d4a MOVE *A13(0xffe0),A11,0x1 +rom:00062d4e MOVE *A11(0x40),A9,0x1 +rom:00062d52 SETF 0x10,0x0,0x0 +rom:00062d54 MOVE *A9(0x10),A11,0x0 +rom:00062d58 SUBK 0x10,A11 +rom:00062d5a JREQ 0x00062d62 +rom:00062d5c MOVK 0x10,A8 +rom:00062d5e JR 0x000630ea +rom:00062d62 MOVE A14,-*SP,0x1 +rom:00062d64 SUB A11,A11 +rom:00062d66 MOVE A11,*A14+,0x1 +rom:00062d68 MOVE *A9(0x20),*A14+,0x1 +rom:00062d6c MOVE A13,A7 +rom:00062d6e ADDK 0x0,A7 +rom:00062d70 MOVE A7,*A14+,0x1 +rom:00062d72 MOVE A13,*A14+,0x1 +rom:00062d74 MOVE *A13(0xffe0),*A14+,0x1 +rom:00062d78 CALLA 0x07ea6fa0 +rom:00062d7e MOVE A8,*A13(0x140),0x1 +rom:00062d82 MOVE A8,A8 +rom:00062d84 JRNE 0x000630ea +rom:00062d88 MOVE *A13(0x20),A11,0x1 +rom:00062d8c SETF 0x1,0x0,0x0 +rom:00062d8e MOVE *A11(0x28),A7,0x0 +rom:00062d92 JRNE 0x00062dbc +rom:00062d94 MOVE A14,-*SP,0x1 +rom:00062d96 MOVK 0x8,A7 +rom:00062d98 MOVE A7,*A14+,0x1 +rom:00062d9a MOVE *A9(0x20),*A14+,0x1 +rom:00062d9e SETF 0x8,0x0,0x0 +rom:00062da0 MOVE *A9(0x8),A8,0x0 +rom:00062da4 MOVE A8,*A14+,0x1 +rom:00062da6 MOVE 0x1ad960,*A14+,0x1 +rom:00062dac MOVE *A13(0xffe0),*A14+,0x1 +rom:00062db0 CALLA 0x07effa5e +rom:00062db6 MOVE A7,A8 +rom:00062db8 JR 0x000630ea +rom:00062dbc MOVE *A9(0x80),A7,0x1 +rom:00062dc0 MOVE *A11(0x80),A11,0x1 +rom:00062dc4 CMP A11,A7 +rom:00062dc6 JRC 0x00062df4 +rom:00062dc8 MOVE A14,-*SP,0x1 +rom:00062dca MOVK 0x2,A11 +rom:00062dcc MOVE A11,*A14+,0x1 +rom:00062dce MOVE *A13(0x20),A7,0x1 +rom:00062dd2 MOVE *A7(0x0),*A14+,0x1 +rom:00062dd6 SETF 0x8,0x0,0x0 +rom:00062dd8 MOVE *A9(0x8),A8,0x0 +rom:00062ddc MOVE A8,*A14+,0x1 +rom:00062dde MOVE 0x1ad960,*A14+,0x1 +rom:00062de4 MOVE *A13(0xffe0),*A14+,0x1 +rom:00062de8 CALLA 0x07effa5e +rom:00062dee MOVE A11,A8 +rom:00062df0 JR 0x000630ea +rom:00062df4 MOVE *A13(0x20),A11,0x1 +rom:00062df8 MOVE *A9(0xa0),A7,0x1 +rom:00062dfc MOVE *A11(0xa0),A11,0x1 +rom:00062e00 CMP A11,A7 +rom:00062e02 JRC 0x00062e30 +rom:00062e04 MOVE A14,-*SP,0x1 +rom:00062e06 MOVK 0x2,A11 +rom:00062e08 MOVE A11,*A14+,0x1 +rom:00062e0a MOVE *A13(0x20),A7,0x1 +rom:00062e0e MOVE *A7(0x0),*A14+,0x1 +rom:00062e12 SETF 0x8,0x0,0x0 +rom:00062e14 MOVE *A9(0x8),A8,0x0 +rom:00062e18 MOVE A8,*A14+,0x1 +rom:00062e1a MOVE 0x1ad960,*A14+,0x1 +rom:00062e20 MOVE *A13(0xffe0),*A14+,0x1 +rom:00062e24 CALLA 0x07effa5e +rom:00062e2a MOVE A11,A8 +rom:00062e2c JR 0x000630ea +rom:00062e30 MOVE *A9(0xc0),A11,0x1 +rom:00062e34 JREQ 0x00062e3c +rom:00062e36 MOVE *A9(0xe0),A11,0x1 +rom:00062e3a JRNE 0x00062e68 +rom:00062e3c MOVE A14,-*SP,0x1 +rom:00062e3e MOVK 0x2,A11 +rom:00062e40 MOVE A11,*A14+,0x1 +rom:00062e42 MOVE *A13(0x20),A7,0x1 +rom:00062e46 MOVE *A7(0x0),*A14+,0x1 +rom:00062e4a SETF 0x8,0x0,0x0 +rom:00062e4c MOVE *A9(0x8),A8,0x0 +rom:00062e50 MOVE A8,*A14+,0x1 +rom:00062e52 MOVE 0x1ad960,*A14+,0x1 +rom:00062e58 MOVE *A13(0xffe0),*A14+,0x1 +rom:00062e5c CALLA 0x07effa5e +rom:00062e62 MOVE A11,A8 +rom:00062e64 JR 0x000630ea +rom:00062e68 MOVE *A9(0x80),A11,0x1 +rom:00062e6c JRLE 0x00062e74 +rom:00062e6e MOVE *A9(0x80),A11,0x1 +rom:00062e72 JR 0x00062e76 +rom:00062e74 SUB A11,A11 +rom:00062e76 MOVE A11,*A13(0x60),0x1 +rom:00062e7a MOVE *A9(0xa0),A7,0x1 +rom:00062e7e JRLE 0x00062e86 +rom:00062e80 MOVE *A9(0xa0),A7,0x1 +rom:00062e84 JR 0x00062e88 +rom:00062e86 SUB A7,A7 +rom:00062e88 MOVE A7,*A13(0x80),0x1 +rom:00062e8c MOVE *A9(0x80),A5,0x1 +rom:00062e90 JRGE 0x00062e98 +rom:00062e92 MOVE *A9(0x80),A5,0x1 +rom:00062e96 JR 0x00062e9a +rom:00062e98 SUB A5,A5 +rom:00062e9a MOVE *A9(0xc0),A7,0x1 +rom:00062e9e ADD A7,A5 +rom:00062ea0 MOVE A5,*A13(0xa0),0x1 +rom:00062ea4 MOVE *A9(0xa0),A7,0x1 +rom:00062ea8 JRGE 0x00062eb0 +rom:00062eaa MOVE *A9(0xa0),A7,0x1 +rom:00062eae JR 0x00062eb2 +rom:00062eb0 SUB A7,A7 +rom:00062eb2 MOVE *A9(0xe0),A5,0x1 +rom:00062eb6 ADD A5,A7 +rom:00062eb8 MOVE A7,*A13(0xc0),0x1 +rom:00062ebc MOVE *A13(0x20),A5,0x1 +rom:00062ec0 MOVE *A13(0xa0),A7,0x1 +rom:00062ec4 ADD A7,A11 +rom:00062ec6 MOVE *A5(0x80),A5,0x1 +rom:00062eca CMP A11,A5 +rom:00062ecc JRNC 0x00062ede +rom:00062ece MOVE *A13(0x20),A11,0x1 +rom:00062ed2 MOVE *A11(0x80),A5,0x1 +rom:00062ed6 MOVE *A13(0x60),A7,0x1 +rom:00062eda SUB A7,A5 +rom:00062edc JR 0x00062ee0 +rom:00062ede MOVE A7,A5 +rom:00062ee0 MOVE A5,*A13(0xa0),0x1 +rom:00062ee4 MOVE *A13(0x20),A11,0x1 +rom:00062ee8 MOVE *A13(0x80),A7,0x1 +rom:00062eec MOVE *A13(0xc0),A5,0x1 +rom:00062ef0 ADD A5,A7 +rom:00062ef2 MOVE *A11(0xa0),A5,0x1 +rom:00062ef6 CMP A7,A5 +rom:00062ef8 JRNC 0x00062f06 +rom:00062efa MOVE *A11(0xa0),A7,0x1 +rom:00062efe MOVE *A13(0x80),A5,0x1 +rom:00062f02 SUB A5,A7 +rom:00062f04 JR 0x00062f0a +rom:00062f06 MOVE *A13(0xc0),A7,0x1 +rom:00062f0a MOVE A7,*A13(0xc0),0x1 +rom:00062f0e MOVE *A13(0xa0),A5,0x1 +rom:00062f12 JRLE 0x00062f18 +rom:00062f14 MOVE A7,A8 +rom:00062f16 JRGT 0x00062f40 +rom:00062f18 MOVE A14,-*SP,0x1 +rom:00062f1a MOVK 0x2,A5 +rom:00062f1c MOVE A5,*A14+,0x1 +rom:00062f1e MOVE *A11(0x0),*A14+,0x1 +rom:00062f22 SETF 0x8,0x0,0x0 +rom:00062f24 MOVE *A9(0x8),A8,0x0 +rom:00062f28 MOVE A8,*A14+,0x1 +rom:00062f2a MOVE 0x1ad960,*A14+,0x1 +rom:00062f30 MOVE *A13(0xffe0),*A14+,0x1 +rom:00062f34 CALLA 0x07effa5e +rom:00062f3a MOVE A5,A8 +rom:00062f3c JR 0x000630ea +rom:00062f40 MOVE *A9(0x100),A5,0x1 +rom:00062f44 MOVE *A13(0x60),A7,0x1 +rom:00062f48 ADD A7,A5 +rom:00062f4a MOVE *A9(0x80),A7,0x1 +rom:00062f4e SUB A7,A5 +rom:00062f50 MOVE A5,*A13(0xe0),0x1 +rom:00062f54 MOVE *A9(0x120),A7,0x1 +rom:00062f58 MOVE *A13(0x80),A5,0x1 +rom:00062f5c ADD A5,A7 +rom:00062f5e MOVE *A9(0xa0),A5,0x1 +rom:00062f62 SUB A5,A7 +rom:00062f64 MOVE A7,*A13(0x100),0x1 +rom:00062f68 MOVE A14,-*SP,0x1 +rom:00062f6a MOVE A8,*A14+,0x1 +rom:00062f6c MOVE *A13(0xa0),*A14+,0x1 +rom:00062f70 MOVE *A13(0x80),*A14+,0x1 +rom:00062f74 MOVE *A13(0x60),*A14+,0x1 +rom:00062f78 MOVE A11,*A14+,0x1 +rom:00062f7a MOVE *A13(0xffe0),*A14+,0x1 +rom:00062f7e CALLA 0x07ea3432 +rom:00062f84 MOVE A8,*A13(0x120),0x1 +rom:00062f88 MOVE A8,A5 +rom:00062f8a JREQ 0x00062fbc +rom:00062f8c MOVE A14,-*SP,0x1 +rom:00062f8e MOVE A11,*A14+,0x1 +rom:00062f90 CALLA 0x07ea336a +rom:00062f96 MOVE A14,-*SP,0x1 +rom:00062f98 MOVE A5,*A14+,0x1 +rom:00062f9a MOVE *A11(0x0),*A14+,0x1 +rom:00062f9e SETF 0x8,0x0,0x0 +rom:00062fa0 MOVE *A9(0x8),A8,0x0 +rom:00062fa4 MOVE A8,*A14+,0x1 +rom:00062fa6 MOVE 0x1ad960,*A14+,0x1 +rom:00062fac MOVE *A13(0xffe0),*A14+,0x1 +rom:00062fb0 CALLA 0x07effa5e +rom:00062fb6 MOVE A5,A8 +rom:00062fb8 JR 0x000630ea +rom:00062fbc MOVE *A13,A5,0x1 +rom:00062fbe JREQ 0x0006301c +rom:00062fc0 MOVE A14,-*SP,0x1 +rom:00062fc2 MOVE A7,*A14+,0x1 +rom:00062fc4 MOVE *A13(0xe0),*A14+,0x1 +rom:00062fc8 SETF 0x8,0x0,0x0 +rom:00062fca MOVE *A11(0x40),A8,0x0 +rom:00062fce MOVE A8,*A14+,0x1 +rom:00062fd0 MOVE *A11(0x100),*A14+,0x1 +rom:00062fd4 MOVE *A11(0x160),*A14+,0x1 +rom:00062fd8 MOVE *A5(0x80),*A14+,0x1 +rom:00062fdc CALLA 0x07ea47b6 +rom:00062fe2 MOVE A8,*A13(0x120),0x1 +rom:00062fe6 MOVE A8,A8 +rom:00062fe8 JREQ 0x000630e8 +rom:00062fea MOVE A14,-*SP,0x1 +rom:00062fec MOVE A11,*A14+,0x1 +rom:00062fee CALLA 0x07ea336a +rom:00062ff4 MOVE A14,-*SP,0x1 +rom:00062ff6 MOVE *A13(0x120),*A14+,0x1 +rom:00062ffa MOVE *A5(0x0),*A14+,0x1 +rom:00062ffe SETF 0x8,0x0,0x0 +rom:00063000 MOVE *A9(0x8),A8,0x0 +rom:00063004 MOVE A8,*A14+,0x1 +rom:00063006 MOVE 0x1ad960,*A14+,0x1 +rom:0006300c MOVE *A13(0xffe0),*A14+,0x1 +rom:00063010 CALLA 0x07effa5e +rom:00063016 MOVE *A13(0x120),A8,0x1 +rom:0006301a JR 0x000630ea +rom:0006301c MOVE A14,-*SP,0x1 +rom:0006301e MOVI 0xc8,A5 +rom:00063022 MOVE A5,*A14+,0x1 +rom:00063024 CALLA 0x07f63a74 +rom:0006302a MOVE A8,*A13(0x40),0x1 +rom:0006302e MOVE A8,A8 +rom:00063030 JRNE 0x00063072 +rom:00063032 MOVE A14,-*SP,0x1 +rom:00063034 MOVI 0x3f524d90,A8 +rom:0006303a MOVE A8,*A14+,0x1 +rom:0006303c CALLA 0x07f24f78 +rom:00063042 MOVE A14,-*SP,0x1 +rom:00063044 MOVE A11,*A14+,0x1 +rom:00063046 CALLA 0x07ea336a +rom:0006304c MOVE A14,-*SP,0x1 +rom:0006304e MOVK 0xb,A5 +rom:00063050 MOVE A5,*A14+,0x1 +rom:00063052 SUB A5,A5 +rom:00063054 MOVE A5,*A14+,0x1 +rom:00063056 SETF 0x8,0x0,0x0 +rom:00063058 MOVE *A9(0x8),A8,0x0 +rom:0006305c MOVE A8,*A14+,0x1 +rom:0006305e MOVE 0x1ad960,*A14+,0x1 +rom:00063064 MOVE *A13(0xffe0),*A14+,0x1 +rom:00063068 CALLA 0x07effa5e +rom:0006306e MOVK 0xb,A8 +rom:00063070 JR 0x000630ea +rom:00063072 MOVK 0x5,A5 +rom:00063074 MOVB A5,*A8 +rom:00063076 MOVE A11,*A8(0x8),0x1 +rom:0006307a SUB A5,A5 +rom:0006307c MOVE A5,*A8(0x28),0x1 +rom:00063080 MOVE *A9(0x20),*A8(0x48),0x1 +rom:00063086 MOVE A5,*A8(0x68),0x1 +rom:0006308a MOVE *A13(0xe0),*A8(0x88),0x1 +rom:00063090 MOVE A7,*A8(0xa8),0x1 +rom:00063094 MOVE A14,-*SP,0x1 +rom:00063096 MOVE A8,*A14+,0x1 +rom:00063098 CALLA 0x07e5b152 +rom:0006309e MOVE A8,*A13(0x120),0x1 +rom:000630a2 MOVE A8,A8 +rom:000630a4 JREQ 0x000630b0 +rom:000630a6 MOVE A14,-*SP,0x1 +rom:000630a8 MOVE A11,*A14+,0x1 +rom:000630aa CALLA 0x07ea336a +rom:000630b0 MOVE A14,-*SP,0x1 +rom:000630b2 MOVE *A13(0x40),*A14+,0x1 +rom:000630b6 CALLA 0x07f63b00 +rom:000630e8 SUB A8,A8 +rom:000630ea MOVE *SP(0xc0),A14,0x1 +rom:000630ee MMFM SP,0x2aa0 diff --git a/xie/ghidra-evidence/handlers/slot22_0630F4.txt b/xie/ghidra-evidence/handlers/slot22_0630F4.txt new file mode 100644 index 0000000..3a3385c --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot22_0630F4.txt @@ -0,0 +1,34 @@ +rom:000630f4 MMTM SP,0x154 +rom:000630f8 MOVE A14,A13 +rom:000630fa ADDI 0x80,A14 +rom:000630fe MOVE *A13(0xffe0),A11,0x1 +rom:00063102 MOVE *A11(0x40),A9,0x1 +rom:00063106 SETF 0x10,0x0,0x0 +rom:00063108 MOVE *A9(0x10),A11,0x0 +rom:0006310c SUBK 0x2,A11 +rom:0006310e JREQ 0x00063114 +rom:00063110 MOVK 0x10,A8 +rom:00063112 JR 0x00063154 +rom:00063114 MOVE A14,-*SP,0x1 +rom:00063116 SUB A11,A11 +rom:00063118 MOVE A11,*A14+,0x1 +rom:0006311a MOVE *A9(0x20),*A14+,0x1 +rom:0006311e MOVE A13,A7 +rom:00063120 ADDK 0x0,A7 +rom:00063122 MOVE A7,*A14+,0x1 +rom:00063124 MOVE A13,*A14+,0x1 +rom:00063126 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006312a CALLA 0x07ea6fa0 +rom:00063130 MOVE A8,*A13(0x60),0x1 +rom:00063134 MOVE A8,A8 +rom:00063136 JRNE 0x00063154 +rom:00063138 MOVE *A13(0x20),A11,0x1 +rom:0006313c MOVE *A11(0x100),*A13(0x40),0x1 +rom:00063142 MOVE *A13(0x40),A7,0x1 +rom:00063146 JREQ 0x00063152 +rom:00063148 MOVE A14,-*SP,0x1 +rom:0006314a MOVE A11,*A14+,0x1 +rom:0006314c CALLA 0x07ea336a +rom:00063152 SUB A8,A8 +rom:00063154 MOVE *SP(0xa0),A14,0x1 +rom:00063158 MMFM SP,0x2a80 diff --git a/xie/ghidra-evidence/handlers/slot24_06315E.txt b/xie/ghidra-evidence/handlers/slot24_06315E.txt new file mode 100644 index 0000000..506bf97 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot24_06315E.txt @@ -0,0 +1,159 @@ +rom:0006315e MMTM SP,0x554 +rom:00063162 MOVE A14,A13 +rom:00063164 ADDI 0x180,A14 +rom:00063168 MOVE *A13(0xffe0),A11,0x1 +rom:0006316c MOVE *A11(0x40),A9,0x1 +rom:00063170 SETF 0x10,0x0,0x0 +rom:00063172 MOVE *A9(0x10),A11,0x0 +rom:00063176 SUBK 0x4,A11 +rom:00063178 JREQ 0x00063180 +rom:0006317a MOVK 0x10,A8 +rom:0006317c JR 0x00063360 +rom:00063180 MOVE A14,-*SP,0x1 +rom:00063182 SUB A11,A11 +rom:00063184 MOVE A11,*A14+,0x1 +rom:00063186 MOVE *A9(0x20),*A14+,0x1 +rom:0006318a MOVE A13,A7 +rom:0006318c ADDK 0x0,A7 +rom:0006318e MOVE A7,*A14+,0x1 +rom:00063190 MOVE A13,*A14+,0x1 +rom:00063192 MOVE *A13(0xffe0),*A14+,0x1 +rom:00063196 CALLA 0x07ea6fa0 +rom:0006319c MOVE A8,*A13(0x160),0x1 +rom:000631a0 MOVE A8,A8 +rom:000631a2 JRNE 0x00063360 +rom:000631a6 MOVE *A13,A11,0x1 +rom:000631a8 JREQ 0x000631da +rom:000631aa SETF 0x1,0x0,0x0 +rom:000631ac MOVE *A11(0x29),A7,0x0 +rom:000631b0 JRNE 0x000631da +rom:000631b2 MOVE A14,-*SP,0x1 +rom:000631b4 MOVK 0xa,A7 +rom:000631b6 MOVE A7,*A14+,0x1 +rom:000631b8 MOVE *A11(0x0),*A14+,0x1 +rom:000631bc SETF 0x8,0x0,0x0 +rom:000631be MOVE *A9(0x8),A8,0x0 +rom:000631c2 MOVE A8,*A14+,0x1 +rom:000631c4 MOVE 0x1ad960,*A14+,0x1 +rom:000631ca MOVE *A13(0xffe0),*A14+,0x1 +rom:000631ce CALLA 0x07effa5e +rom:000631d4 MOVE A7,A8 +rom:000631d6 JR 0x00063360 +rom:000631da MOVE *A13(0x20),A7,0x1 +rom:000631de MOVE *A7(0x100),*A13(0x40),0x1 +rom:000631e4 MOVE A14,-*SP,0x1 +rom:000631e6 MOVK 0x0,A7 +rom:000631e8 MOVE A7,*A14+,0x1 +rom:000631ea SUB A7,A7 +rom:000631ec MOVE A7,*A14+,0x1 +rom:000631ee MOVE A13,A7 +rom:000631f0 ADDI 0x60,A7 +rom:000631f4 MOVE A7,*A14+,0x1 +rom:000631f6 CALLA 0x07fc2d78 +rom:000631fc MOVK 0x1,A7 +rom:000631fe MOVB *A7,*A13(0x60) +rom:00063202 MOVE *A13(0xffe0),A5,0x1 +rom:00063206 SETF 0x10,0x0,0x0 +rom:00063208 MOVE *A5(0xe0),*A13(0x70),0x0 +rom:0006320e MOVE *A13(0x40),A5,0x1 +rom:00063212 JREQ 0x000632b4 +rom:00063214 SETF 0x8,0x0,0x0 +rom:00063216 MOVE *A9(0x60),A5,0x0 +rom:0006321a JREQ 0x00063226 +rom:0006321c MOVE *A13(0x40),A5,0x1 +rom:00063220 MOVE *A5(0x1a0),*A13(0x80),0x1 +rom:00063226 MOVE *A13(0x40),A5,0x1 +rom:0006322a MOVE *A5(0x1a0),*A13(0xa0),0x1 +rom:00063230 MOVE *A9(0x40),A5,0x1 +rom:00063234 JREQ 0x000632b4 +rom:00063236 MOVE *A13(0x40),A5,0x1 +rom:0006323a MOVE *A5(0xa0),A5,0x1 +rom:0006323e JREQ 0x000632b4 +rom:00063240 MOVE *A13(0x40),A5,0x1 +rom:00063244 MOVE *A5(0xa0),A5,0x1 +rom:00063248 MOVE *A5,A5,0x1 +rom:0006324a JRNE 0x0006329c +rom:0006324c MOVE *A13(0x40),A5,0x1 +rom:00063250 MOVE *A5(0xa0),A5,0x1 +rom:00063254 SETF 0x10,0x1,0x0 +rom:00063256 MOVE *A5(0x30),A11,0x0 +rom:0006325a INC A11 +rom:0006325c MOVE A11,*A5(0x30),0x0 +rom:00063260 MOVE *A13(0x40),A11,0x1 +rom:00063264 MOVE *A11(0xa0),A5,0x1 +rom:00063268 MOVE *A9(0x40),*A5(0x0),0x1 +rom:0006326e MOVE A14,-*SP,0x1 +rom:00063270 SETF 0x10,0x0,0x0 +rom:00063272 MOVE @0x1ad980,A5,0x0 +rom:00063278 MOVE A5,*A14+,0x1 +rom:0006327a MOVI 0x3f566ed0,A11 +rom:00063280 MOVE A11,*A14+,0x1 +rom:00063282 MOVE *A13(0x40),A11,0x1 +rom:00063286 MOVE *A11(0xa0),*A14+,0x1 +rom:0006328a MOVE @0x1ad990,A11,0x0 +rom:00063290 MOVE A11,*A14+,0x1 +rom:00063292 MOVE *A9(0x40),*A14+,0x1 +rom:00063296 CALLA 0x07f16ca2 +rom:0006329c MOVE *A13(0x40),A11,0x1 +rom:000632a0 MOVE *A11(0xa0),A5,0x1 +rom:000632a4 MOVE *A5(0x0),*A13(0xc0),0x1 +rom:000632aa MOVE *A11(0xa0),A5,0x1 +rom:000632ae MOVB *A5(0x40),*A13(0xe0) +rom:000632b4 MOVE *A13(0xffe0),A11,0x1 +rom:000632b8 MOVE *A11(0x80),A5,0x1 +rom:000632bc JREQ 0x000632e2 +rom:000632be MOVE A14,-*SP,0x1 +rom:000632c0 MOVE A13,A5 +rom:000632c2 ADDI 0x60,A5 +rom:000632c6 MOVE A5,*A14+,0x1 +rom:000632c8 MOVK 0x0,A7 +rom:000632ca MOVE A7,*A14+,0x1 +rom:000632cc MOVE A11,*A14+,0x1 +rom:000632ce SETF 0x8,0x0,0x0 +rom:000632d0 MOVE *A9(0x8),A5,0x0 +rom:000632d4 SLL 0x5,A5 +rom:000632d6 ADDI 0xd4b10,A5 +rom:000632dc MOVE *A5,A5,0x1 +rom:000632de CALL A5 +rom:000632e0 JR 0x000632f8 +rom:000632e2 MOVE A14,-*SP,0x1 +rom:000632e4 MOVE A13,A5 +rom:000632e6 ADDI 0x60,A5 +rom:000632ea MOVE A5,*A14+,0x1 +rom:000632ec MOVK 0x0,A7 +rom:000632ee MOVE A7,*A14+,0x1 +rom:000632f0 MOVE A11,*A14+,0x1 +rom:000632f2 CALLA 0x07e6a422 +rom:000632f8 MOVE *A13(0x80),A5,0x1 +rom:000632fc JREQ 0x0006335e +rom:000632fe MOVE @0xd5150,A7,0x1 +rom:00063304 MOVE A7,*A11(0xa0),0x1 +rom:00063308 MOVE *A11(0x80),A5,0x1 +rom:0006330c JREQ 0x0006332a +rom:0006330e MOVE A14,-*SP,0x1 +rom:00063310 MOVE *A13(0x40),A5,0x1 +rom:00063314 MOVE *A5(0x180),*A14+,0x1 +rom:00063318 MOVE *A5(0x1a0),A5,0x1 +rom:0006331c SLL 0x2,A5 +rom:0006331e MOVE A5,*A14+,0x1 +rom:00063320 MOVE A11,*A14+,0x1 +rom:00063322 MOVE *A11(0xa0),A5,0x1 +rom:00063326 CALL A5 +rom:00063328 JR 0x00063344 +rom:0006332a MOVE A14,-*SP,0x1 +rom:0006332c MOVE *A13(0x40),A5,0x1 +rom:00063330 MOVE *A5(0x180),*A14+,0x1 +rom:00063334 MOVE *A5(0x1a0),A5,0x1 +rom:00063338 SLL 0x2,A5 +rom:0006333a MOVE A5,*A14+,0x1 +rom:0006333c MOVE A11,*A14+,0x1 +rom:0006333e CALLA 0x07e6a422 +rom:00063344 MOVE *A13(0x40),A7,0x1 +rom:00063348 SUB A5,A5 +rom:0006334a MOVE A5,*A7(0x1a0),0x1 +rom:0006334e MOVE A14,-*SP,0x1 +rom:00063350 MOVE *A7(0x180),*A14+,0x1 +rom:00063354 CALLA 0x07f63b00 +rom:0006335e SUB A8,A8 +rom:00063360 MOVE *SP(0xc0),A14,0x1 +rom:00063364 MMFM SP,0x2aa0 diff --git a/xie/ghidra-evidence/handlers/slot33_064CC8.txt b/xie/ghidra-evidence/handlers/slot33_064CC8.txt new file mode 100644 index 0000000..1fe2574 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot33_064CC8.txt @@ -0,0 +1,397 @@ +rom:00064cc8 MMTM SP,0x554 +rom:00064ccc MOVE A14,A13 +rom:00064cce ADDI 0x180,A14 +rom:00064cd2 MOVE *A13(0xffe0),A11,0x1 +rom:00064cd6 MOVE *A11(0x40),A9,0x1 +rom:00064cda SETF 0x10,0x0,0x0 +rom:00064cdc MOVE *A9(0x10),A11,0x0 +rom:00064ce0 SUBK 0x4,A11 +rom:00064ce2 JREQ 0x00064cea +rom:00064ce4 MOVK 0x10,A8 +rom:00064ce6 JR 0x00065258 +rom:00064cea MOVE A14,-*SP,0x1 +rom:00064cec MOVE *A9(0x40),*A14+,0x1 +rom:00064cf0 MOVE *A9(0x20),*A14+,0x1 +rom:00064cf4 MOVE A13,A11 +rom:00064cf6 ADDI 0xa0,A11 +rom:00064cfa MOVE A11,*A14+,0x1 +rom:00064cfc MOVE A13,A7 +rom:00064cfe ADDI 0x80,A7 +rom:00064d02 MOVE A7,*A14+,0x1 +rom:00064d04 MOVE *A13(0xffe0),*A14+,0x1 +rom:00064d08 CALLA 0x07ea6fa0 +rom:00064d0e MOVE A8,*A13(0x160),0x1 +rom:00064d12 MOVE A8,A8 +rom:00064d14 JRNE 0x00065258 +rom:00064d18 MOVE *A9(0x60),A7,0x1 +rom:00064d1c JRNE 0x00064d60 +rom:00064d1e MOVE A14,-*SP,0x1 +rom:00064d20 MOVE *A13(0xe0),*A14+,0x1 +rom:00064d24 MOVE *A13(0xa0),*A14+,0x1 +rom:00064d28 CALLA 0x07ea6004 +rom:00064d2e MOVE *A13(0xe0),A7,0x1 +rom:00064d32 MOVE *A7(0x40),A11,0x1 +rom:00064d36 JRNE 0x00064d86 +rom:00064d38 MOVE A14,-*SP,0x1 +rom:00064d3a MOVK 0xb,A11 +rom:00064d3c MOVE A11,*A14+,0x1 +rom:00064d3e SUB A11,A11 +rom:00064d40 MOVE A11,*A14+,0x1 +rom:00064d42 SETF 0x8,0x0,0x0 +rom:00064d44 MOVE *A9(0x8),A8,0x0 +rom:00064d48 MOVE A8,*A14+,0x1 +rom:00064d4a MOVE 0x1ad960,*A14+,0x1 +rom:00064d50 MOVE *A13(0xffe0),*A14+,0x1 +rom:00064d54 CALLA 0x07effa5e +rom:00064d5a MOVK 0xb,A8 +rom:00064d5c JR 0x00065258 +rom:00064d60 MOVE A14,-*SP,0x1 +rom:00064d62 MOVK 0x5,A7 +rom:00064d64 MOVE A7,*A14+,0x1 +rom:00064d66 MOVE *A9(0x60),*A14+,0x1 +rom:00064d6a MOVE A13,A7 +rom:00064d6c ADDI 0xe0,A7 +rom:00064d70 MOVE A7,*A14+,0x1 +rom:00064d72 MOVE *A13(0xffe0),*A14+,0x1 +rom:00064d76 CALLA 0x07ea6e70 +rom:00064d7c MOVE A8,*A13(0x160),0x1 +rom:00064d80 MOVE A8,A8 +rom:00064d82 JRNE 0x00065258 +rom:00064d86 MOVE *A13(0xe0),A11,0x1 +rom:00064d8a MOVE *A11(0x40),A7,0x1 +rom:00064d8e MOVE *A7(0xa8),A7,0x1 +rom:00064d92 JRLT 0x00064e52 +rom:00064d94 MOVE *A11(0x40),A7,0x1 +rom:00064d98 MOVE *A13(0xa0),A11,0x1 +rom:00064d9c MOVE *A7(0xa8),A7,0x1 +rom:00064da0 MOVE *A11(0x80),A11,0x1 +rom:00064da4 CMP A11,A7 +rom:00064da6 JRNC 0x00064e52 +rom:00064da8 MOVE *A13(0xe0),A11,0x1 +rom:00064dac MOVE *A11(0x40),A7,0x1 +rom:00064db0 MOVE *A7(0xe8),A7,0x1 +rom:00064db4 JRLT 0x00064e52 +rom:00064db6 MOVE *A11(0x40),A7,0x1 +rom:00064dba MOVE *A13(0xa0),A11,0x1 +rom:00064dbe MOVE *A7(0xe8),A7,0x1 +rom:00064dc2 MOVE *A11(0xa0),A11,0x1 +rom:00064dc6 CMP A11,A7 +rom:00064dc8 JRNC 0x00064e52 +rom:00064dca MOVE *A13(0xe0),A11,0x1 +rom:00064dce MOVE *A11(0x40),A7,0x1 +rom:00064dd2 MOVE *A7(0x128),A7,0x1 +rom:00064dd6 JREQ 0x00064e52 +rom:00064dd8 MOVE *A11(0x40),A7,0x1 +rom:00064ddc MOVE *A13(0xa0),A11,0x1 +rom:00064de0 MOVE *A7(0x128),A7,0x1 +rom:00064de4 MOVE *A11(0x80),A11,0x1 +rom:00064de8 CMP A11,A7 +rom:00064dea JRHI 0x00064e52 +rom:00064dec MOVE *A13(0xe0),A11,0x1 +rom:00064df0 MOVE *A11(0x40),A7,0x1 +rom:00064df4 MOVE *A7(0x148),A7,0x1 +rom:00064df8 JREQ 0x00064e52 +rom:00064dfa MOVE *A11(0x40),A7,0x1 +rom:00064dfe MOVE *A13(0xa0),A11,0x1 +rom:00064e02 MOVE *A7(0x148),A7,0x1 +rom:00064e06 MOVE *A11(0xa0),A11,0x1 +rom:00064e0a CMP A11,A7 +rom:00064e0c JRHI 0x00064e52 +rom:00064e0e MOVE *A13(0xe0),A11,0x1 +rom:00064e12 MOVE *A11(0x40),A7,0x1 +rom:00064e16 MOVE *A11(0x40),A11,0x1 +rom:00064e1a MOVE *A7(0xa8),A7,0x1 +rom:00064e1e MOVE *A11(0x128),A11,0x1 +rom:00064e22 ADD A11,A7 +rom:00064e24 MOVE *A13(0xa0),A11,0x1 +rom:00064e28 MOVE *A11(0x80),A11,0x1 +rom:00064e2c CMP A11,A7 +rom:00064e2e JRHI 0x00064e52 +rom:00064e30 MOVE *A13(0xe0),A11,0x1 +rom:00064e34 MOVE *A11(0x40),A7,0x1 +rom:00064e38 MOVE *A11(0x40),A11,0x1 +rom:00064e3c MOVE *A7(0xe8),A7,0x1 +rom:00064e40 MOVE *A11(0x148),A11,0x1 +rom:00064e44 ADD A11,A7 +rom:00064e46 MOVE *A13(0xa0),A11,0x1 +rom:00064e4a MOVE *A11(0xa0),A11,0x1 +rom:00064e4e CMP A11,A7 +rom:00064e50 JRLS 0x00064ea0 +rom:00064e52 MOVE A14,-*SP,0x1 +rom:00064e54 MOVI 0x3f532380,A8 +rom:00064e5a MOVE A8,*A14+,0x1 +rom:00064e5c CALLA 0x07f24f78 +rom:00064e62 MOVE *A9(0x60),A11,0x1 +rom:00064e66 JRNE 0x00064e78 +rom:00064e68 MOVE A14,-*SP,0x1 +rom:00064e6a MOVE *A13(0xe0),A11,0x1 +rom:00064e6e MOVE *A11(0x40),*A14+,0x1 +rom:00064e72 CALLA 0x07f63b00 +rom:00064e78 MOVE A14,-*SP,0x1 +rom:00064e7a MOVK 0x2,A11 +rom:00064e7c MOVE A11,*A14+,0x1 +rom:00064e7e SUB A7,A7 +rom:00064e80 MOVE A7,*A14+,0x1 +rom:00064e82 SETF 0x8,0x0,0x0 +rom:00064e84 MOVE *A9(0x8),A8,0x0 +rom:00064e88 MOVE A8,*A14+,0x1 +rom:00064e8a MOVE 0x1ad960,*A14+,0x1 +rom:00064e90 MOVE *A13(0xffe0),*A14+,0x1 +rom:00064e94 CALLA 0x07effa5e +rom:00064e9a MOVE A11,A8 +rom:00064e9c JR 0x00065258 +rom:00064ea0 SUB A11,A11 +rom:00064ea2 MOVE A11,*A13,0x1 +rom:00064ea4 MOVE *A13(0xa0),A7,0x1 +rom:00064ea8 SETF 0x8,0x0,0x0 +rom:00064eaa MOVE *A7(0x48),A7,0x0 +rom:00064eae CMP A7,A11 +rom:00064eb0 JRNC 0x00064ee2 +rom:00064eb2 MOVE *A13,A11,0x1 +rom:00064eb4 SLL 0x5,A11 +rom:00064eb6 ADD A13,A11 +rom:00064eb8 MOVE *A13(0xa0),A7,0x1 +rom:00064ebc MOVE *A7(0x160),A5,0x1 +rom:00064ec0 MOVE *A13,A7,0x1 +rom:00064ec2 SLL 0x5,A7 +rom:00064ec4 ADD A7,A5 +rom:00064ec6 MOVE *A5(0xd8),A7,0x1 +rom:00064eca MOVE *A7(0x1a8),*A11(0x20),0x1 +rom:00064ed0 MOVE *A13,A11,0x1 +rom:00064ed2 INC A11 +rom:00064ed4 MOVE A11,*A13,0x1 +rom:00064ed6 MOVE *A13(0xa0),A7,0x1 +rom:00064eda MOVE *A7(0x48),A5,0x0 +rom:00064ede CMP A5,A11 +rom:00064ee0 JRC 0x00064eb2 +rom:00064ee2 MOVE A14,-*SP,0x1 +rom:00064ee4 MOVE *A13(0x80),A7,0x1 +rom:00064ee8 MOVK 0x1,A5 +rom:00064eea JREQ 0x00064eee +rom:00064eec SUB A5,A5 +rom:00064eee MOVE A5,*A14+,0x1 +rom:00064ef0 MOVE *A13(0xe0),A5,0x1 +rom:00064ef4 MOVE *A5(0x40),A5,0x1 +rom:00064ef8 MOVE *A5(0x148),*A14+,0x1 +rom:00064efc MOVE *A13(0xe0),A5,0x1 +rom:00064f00 MOVE *A5(0x40),A5,0x1 +rom:00064f04 MOVE *A5(0x128),*A14+,0x1 +rom:00064f08 MOVE *A13(0xa0),A5,0x1 +rom:00064f0c MOVE *A5(0x50),A8,0x0 +rom:00064f10 MOVE A8,*A14+,0x1 +rom:00064f12 MOVE *A5(0x60),A8,0x0 +rom:00064f16 MOVE A8,*A14+,0x1 +rom:00064f18 MOVE *A5(0x58),A8,0x0 +rom:00064f1c MOVE A8,*A14+,0x1 +rom:00064f1e MOVE *A5(0xc0),*A14+,0x1 +rom:00064f22 MOVE *A5(0xe0),*A14+,0x1 +rom:00064f26 MOVE A13,A5 +rom:00064f28 ADDK 0x0,A5 +rom:00064f2a MOVE A5,*A14+,0x1 +rom:00064f2c MOVE *A13(0xa0),A5,0x1 +rom:00064f30 MOVE *A5(0x40),A8,0x0 +rom:00064f34 MOVE A8,*A14+,0x1 +rom:00064f36 CALLA 0x07eaca82 +rom:00064f3c MOVE A8,*A13(0xc0),0x1 +rom:00064f40 MOVE A8,A8 +rom:00064f42 JRNE 0x00064f82 +rom:00064f44 MOVE *A9(0x60),A5,0x1 +rom:00064f48 JRNE 0x00064f5a +rom:00064f4a MOVE A14,-*SP,0x1 +rom:00064f4c MOVE *A13(0xe0),A5,0x1 +rom:00064f50 MOVE *A5(0x40),*A14+,0x1 +rom:00064f54 CALLA 0x07f63b00 +rom:00064f5a MOVE A14,-*SP,0x1 +rom:00064f5c MOVK 0xb,A5 +rom:00064f5e MOVE A5,*A14+,0x1 +rom:00064f60 MOVE *A9(0x40),*A14+,0x1 +rom:00064f64 SETF 0x8,0x0,0x0 +rom:00064f66 MOVE *A9(0x8),A8,0x0 +rom:00064f6a MOVE A8,*A14+,0x1 +rom:00064f6c MOVE 0x1ad960,*A14+,0x1 +rom:00064f72 MOVE *A13(0xffe0),*A14+,0x1 +rom:00064f76 CALLA 0x07effa5e +rom:00064f7c MOVE A5,A8 +rom:00064f7e JR 0x00065258 +rom:00064f82 MOVE A7,A7 +rom:00064f84 JREQ 0x000650ba +rom:00064f88 MOVE A14,-*SP,0x1 +rom:00064f8a MOVE *A13(0xe0),A5,0x1 +rom:00064f8e MOVE *A5(0x40),A5,0x1 +rom:00064f92 MOVE *A5(0x148),*A14+,0x1 +rom:00064f96 MOVE *A13(0xe0),A5,0x1 +rom:00064f9a MOVE *A5(0x40),A5,0x1 +rom:00064f9e MOVE *A5(0x128),*A14+,0x1 +rom:00064fa2 MOVE *A13(0xe0),A5,0x1 +rom:00064fa6 MOVE *A5(0x40),A5,0x1 +rom:00064faa MOVE *A5(0xe8),*A14+,0x1 +rom:00064fae MOVE *A13(0xe0),A5,0x1 +rom:00064fb2 MOVE *A5(0x40),A5,0x1 +rom:00064fb6 MOVE *A5(0xa8),*A14+,0x1 +rom:00064fba MOVE *A8(0x160),*A14+,0x1 +rom:00064fbe MOVE *A13(0xa0),A5,0x1 +rom:00064fc2 MOVE *A5(0x160),*A14+,0x1 +rom:00064fc6 MOVE *A7(0x80),*A14+,0x1 +rom:00064fca SETF 0x8,0x0,0x0 +rom:00064fcc MOVE *A9(0x8),A5,0x0 +rom:00064fd0 SLL 0x5,A5 +rom:00064fd2 ADDI 0xd5730,A5 +rom:00064fd8 MOVE *A5,A5,0x1 +rom:00064fda CALL A5 +rom:00064fdc MOVE A8,*A13(0x140),0x1 +rom:00064fe0 MOVE A8,A5 +rom:00064fe2 JREQ 0x00065030 +rom:00064fe4 MOVE A14,-*SP,0x1 +rom:00064fe6 MOVE *A13(0xc0),*A14+,0x1 +rom:00064fea CALLA 0x07eacdda +rom:00064ff0 MOVE *A9(0x60),A5,0x1 +rom:00064ff4 JRNE 0x00065006 +rom:00064ff6 MOVE A14,-*SP,0x1 +rom:00064ff8 MOVE *A13(0xe0),A5,0x1 +rom:00064ffc MOVE *A5(0x40),*A14+,0x1 +rom:00065000 CALLA 0x07f63b00 +rom:00065006 MOVE A14,-*SP,0x1 +rom:00065008 MOVE *A13(0x140),*A14+,0x1 +rom:0006500c SUB A5,A5 +rom:0006500e MOVE A5,*A14+,0x1 +rom:00065010 SETF 0x8,0x0,0x0 +rom:00065012 MOVE *A9(0x8),A8,0x0 +rom:00065016 MOVE A8,*A14+,0x1 +rom:00065018 MOVE 0x1ad960,*A14+,0x1 +rom:0006501e MOVE *A13(0xffe0),*A14+,0x1 +rom:00065022 CALLA 0x07effa5e +rom:00065028 MOVE *A13(0x140),A8,0x1 +rom:0006502c JR 0x00065258 +rom:00065030 MOVE A14,-*SP,0x1 +rom:00065032 MOVK 0x1,A5 +rom:00065034 MOVE A5,*A14+,0x1 +rom:00065036 MOVE *A13(0xc0),*A14+,0x1 +rom:0006503a MOVE A7,*A14+,0x1 +rom:0006503c CALLA 0x07ea72a4 +rom:00065042 MOVE A8,A8 +rom:00065044 JRNE 0x00065240 +rom:00065048 MOVE A14,-*SP,0x1 +rom:0006504a MOVE *A13(0xc0),*A14+,0x1 +rom:0006504e CALLA 0x07eacdda +rom:00065054 MOVE *A7(0x80),A5,0x1 +rom:00065058 MOVE *A5(0x20),*A13(0x100),0x1 +rom:0006505e MOVE A14,-*SP,0x1 +rom:00065060 MOVE *A13(0x100),*A14+,0x1 +rom:00065064 MOVE *A13(0x100),A5,0x1 +rom:00065068 MOVE *A5(0x60),A5,0x1 +rom:0006506c MOVE *A5(0xe0),A5,0x1 +rom:00065070 CALL A5 +rom:00065072 MOVE *A13(0x100),A5,0x1 +rom:00065076 MOVE *A5(0x20),A5,0x1 +rom:0006507a MOVE *A13(0x100),A7,0x1 +rom:0006507e MOVE *A7,*A5,0x1 +rom:00065080 MOVE *A7,A5,0x1 +rom:00065082 MOVE *A7(0x20),*A5(0x20),0x1 +rom:00065088 MOVE A14,-*SP,0x1 +rom:0006508a MOVE A7,*A14+,0x1 +rom:0006508c CALLA 0x07f63b18 +rom:00065092 MOVE A14,-*SP,0x1 +rom:00065094 MOVK 0xb,A5 +rom:00065096 MOVE A5,*A14+,0x1 +rom:00065098 MOVE *A9(0x40),*A14+,0x1 +rom:0006509c SETF 0x8,0x0,0x0 +rom:0006509e MOVE *A9(0x8),A8,0x0 +rom:000650a2 MOVE A8,*A14+,0x1 +rom:000650a4 MOVE 0x1ad960,*A14+,0x1 +rom:000650aa MOVE *A13(0xffe0),*A14+,0x1 +rom:000650ae CALLA 0x07effa5e +rom:000650b4 MOVE A5,A8 +rom:000650b6 JR 0x00065258 +rom:000650ba MOVE A14,-*SP,0x1 +rom:000650bc MOVI 0xc8,A5 +rom:000650c0 MOVE A5,*A14+,0x1 +rom:000650c2 CALLA 0x07f63a74 +rom:000650c8 MOVE A8,*A13(0x120),0x1 +rom:000650cc MOVE A8,A8 +rom:000650ce JRNE 0x0006512a +rom:000650d0 MOVE A14,-*SP,0x1 +rom:000650d2 MOVI 0x3f532468,A8 +rom:000650d8 MOVE A8,*A14+,0x1 +rom:000650da CALLA 0x07f24f78 +rom:000650e0 MOVE A14,-*SP,0x1 +rom:000650e2 MOVE *A13(0xc0),*A14+,0x1 +rom:000650e6 CALLA 0x07eacdda +rom:000650ec MOVE *A9(0x60),A5,0x1 +rom:000650f0 JRNE 0x00065102 +rom:000650f2 MOVE A14,-*SP,0x1 +rom:000650f4 MOVE *A13(0xe0),A5,0x1 +rom:000650f8 MOVE *A5(0x40),*A14+,0x1 +rom:000650fc CALLA 0x07f63b00 +rom:00065102 MOVE A14,-*SP,0x1 +rom:00065104 MOVK 0xb,A5 +rom:00065106 MOVE A5,*A14+,0x1 +rom:00065108 SUB A5,A5 +rom:0006510a MOVE A5,*A14+,0x1 +rom:0006510c SETF 0x8,0x0,0x0 +rom:0006510e MOVE *A9(0x8),A8,0x0 +rom:00065112 MOVE A8,*A14+,0x1 +rom:00065114 MOVE 0x1ad960,*A14+,0x1 +rom:0006511a MOVE *A13(0xffe0),*A14+,0x1 +rom:0006511e CALLA 0x07effa5e +rom:00065124 MOVK 0xb,A8 +rom:00065126 JR 0x00065258 +rom:0006512a MOVK 0x1,A5 +rom:0006512c MOVB A5,*A8 +rom:0006512e MOVE *A13(0xa0),*A8(0x8),0x1 +rom:00065134 MOVE *A13(0xc0),*A8(0x28),0x1 +rom:0006513a MOVE *A9(0x20),*A8(0x48),0x1 +rom:00065140 MOVE *A9(0x40),*A8(0x68),0x1 +rom:00065146 MOVE *A13(0xe0),A5,0x1 +rom:0006514a MOVE *A5(0x40),A5,0x1 +rom:0006514e SETF 0x10,0x0,0x0 +rom:00065150 MOVE *A5(0xa8),*A8(0x88),0x0 +rom:00065156 MOVE *A13(0xe0),A5,0x1 +rom:0006515a MOVE *A5(0x40),A5,0x1 +rom:0006515e MOVE *A5(0xe8),*A8(0x98),0x0 +rom:00065164 MOVE *A13(0xe0),A5,0x1 +rom:00065168 MOVE *A5(0x40),A5,0x1 +rom:0006516c MOVE *A5(0x128),*A8(0xa8),0x0 +rom:00065172 MOVE *A13(0xe0),A5,0x1 +rom:00065176 MOVE *A5(0x40),A5,0x1 +rom:0006517a MOVE *A5(0x148),*A8(0xb8),0x0 +rom:00065180 MOVE A14,-*SP,0x1 +rom:00065182 MOVE A8,*A14+,0x1 +rom:00065184 CALLA 0x07e5b152 +rom:0006518a MOVE A8,*A13(0x140),0x1 +rom:0006518e MOVE A8,A5 +rom:00065190 JREQ 0x000651e8 +rom:00065192 MOVE A14,-*SP,0x1 +rom:00065194 MOVE *A13(0x120),*A14+,0x1 +rom:00065198 CALLA 0x07f63b00 +rom:000651e8 MOVE *A13(0xc0),A5,0x1 +rom:000651ec MOVE *A9(0x40),*A5(0x0),0x1 +rom:000651f2 MOVE A14,-*SP,0x1 +rom:000651f4 SETF 0x10,0x0,0x0 +rom:000651f6 MOVE @0x1ad980,A5,0x0 +rom:000651fc MOVE A5,*A14+,0x1 +rom:000651fe MOVI 0x3f566ed0,A7 +rom:00065204 MOVE A7,*A14+,0x1 +rom:00065206 MOVE *A13(0xc0),*A14+,0x1 +rom:0006520a MOVE @0x1ad990,A7,0x0 +rom:00065210 MOVE A7,*A14+,0x1 +rom:00065212 MOVE *A9(0x40),*A14+,0x1 +rom:00065216 CALLA 0x07f16ca2 +rom:0006521c MOVE A14,-*SP,0x1 +rom:0006521e SUB A7,A7 +rom:00065220 MOVE A7,*A14+,0x1 +rom:00065222 MOVE *A13(0xc0),*A14+,0x1 +rom:00065226 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006522a CALLA 0x07e7fe96 +rom:00065230 MOVE A8,*A13(0x140),0x1 +rom:00065234 MOVE A14,-*SP,0x1 +rom:00065236 MOVE *A13(0x120),*A14+,0x1 +rom:0006523a CALLA 0x07f63b00 +rom:00065240 MOVE *A9(0x60),A7,0x1 +rom:00065244 JRNE 0x00065256 +rom:00065246 MOVE A14,-*SP,0x1 +rom:00065248 MOVE *A13(0xe0),A7,0x1 +rom:0006524c MOVE *A7(0x40),*A14+,0x1 +rom:00065250 CALLA 0x07f63b00 +rom:00065256 SUB A8,A8 +rom:00065258 MOVE *SP(0xc0),A14,0x1 +rom:0006525c MMFM SP,0x2aa0 diff --git a/xie/ghidra-evidence/handlers/slot40_065262.txt b/xie/ghidra-evidence/handlers/slot40_065262.txt new file mode 100644 index 0000000..c2ff367 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot40_065262.txt @@ -0,0 +1,264 @@ +rom:00065262 MMTM SP,0x554 +rom:00065266 MOVE A14,A13 +rom:00065268 ADDI 0x160,A14 +rom:0006526c MOVE *A13(0xffe0),A11,0x1 +rom:00065270 MOVE *A11(0x40),A9,0x1 +rom:00065274 SETF 0x10,0x0,0x0 +rom:00065276 MOVE *A9(0x10),A11,0x0 +rom:0006527a SUBK 0x4,A11 +rom:0006527c JREQ 0x00065284 +rom:0006527e MOVK 0x10,A8 +rom:00065280 JR 0x000655f6 +rom:00065284 MOVE A14,-*SP,0x1 +rom:00065286 MOVE *A9(0x40),*A14+,0x1 +rom:0006528a MOVE *A9(0x20),*A14+,0x1 +rom:0006528e MOVE A13,A11 +rom:00065290 ADDI 0xa0,A11 +rom:00065294 MOVE A11,*A14+,0x1 +rom:00065296 MOVE A13,A7 +rom:00065298 ADDI 0x80,A7 +rom:0006529c MOVE A7,*A14+,0x1 +rom:0006529e MOVE *A13(0xffe0),*A14+,0x1 +rom:000652a2 CALLA 0x07ea6fa0 +rom:000652a8 MOVE A8,*A13(0x140),0x1 +rom:000652ac MOVE A8,A8 +rom:000652ae JRNE 0x000655f6 +rom:000652b2 SETF 0x8,0x0,0x0 +rom:000652b4 MOVE *A9(0x60),A7,0x0 +rom:000652b8 DEC A7 +rom:000652ba JREQ 0x000652e8 +rom:000652bc MOVE *A9(0x60),A7,0x0 +rom:000652c0 JREQ 0x000652e8 +rom:000652c2 MOVE A14,-*SP,0x1 +rom:000652c4 MOVK 0x2,A7 +rom:000652c6 MOVE A7,*A14+,0x1 +rom:000652c8 MOVE *A9(0x20),*A14+,0x1 +rom:000652cc MOVE *A9(0x8),A8,0x0 +rom:000652d0 MOVE A8,*A14+,0x1 +rom:000652d2 MOVE 0x1ad960,*A14+,0x1 +rom:000652d8 MOVE *A13(0xffe0),*A14+,0x1 +rom:000652dc CALLA 0x07effa5e +rom:000652e2 MOVE A7,A8 +rom:000652e4 JR 0x000655f6 +rom:000652e8 MOVE *A9(0x68),A7,0x0 +rom:000652ec DEC A7 +rom:000652ee JREQ 0x0006531c +rom:000652f0 MOVE *A9(0x68),A7,0x0 +rom:000652f4 JREQ 0x0006531c +rom:000652f6 MOVE A14,-*SP,0x1 +rom:000652f8 MOVK 0x2,A7 +rom:000652fa MOVE A7,*A14+,0x1 +rom:000652fc MOVE *A9(0x20),*A14+,0x1 +rom:00065300 MOVE *A9(0x8),A8,0x0 +rom:00065304 MOVE A8,*A14+,0x1 +rom:00065306 MOVE 0x1ad960,*A14+,0x1 +rom:0006530c MOVE *A13(0xffe0),*A14+,0x1 +rom:00065310 CALLA 0x07effa5e +rom:00065316 MOVE A7,A8 +rom:00065318 JR 0x000655f6 +rom:0006531c SUB A7,A7 +rom:0006531e MOVE A7,*A13,0x1 +rom:00065320 MOVE *A13(0xa0),A11,0x1 +rom:00065324 MOVE *A11(0x48),A11,0x0 +rom:00065328 CMP A11,A7 +rom:0006532a JRNC 0x0006535c +rom:0006532c MOVE *A13,A11,0x1 +rom:0006532e SLL 0x5,A11 +rom:00065330 ADD A13,A11 +rom:00065332 MOVE *A13(0xa0),A7,0x1 +rom:00065336 MOVE *A7(0x160),A5,0x1 +rom:0006533a MOVE *A13,A7,0x1 +rom:0006533c SLL 0x5,A7 +rom:0006533e ADD A7,A5 +rom:00065340 MOVE *A5(0xd8),A7,0x1 +rom:00065344 MOVE *A7(0x1a8),*A11(0x20),0x1 +rom:0006534a MOVE *A13,A11,0x1 +rom:0006534c INC A11 +rom:0006534e MOVE A11,*A13,0x1 +rom:00065350 MOVE *A13(0xa0),A7,0x1 +rom:00065354 MOVE *A7(0x48),A5,0x0 +rom:00065358 CMP A5,A11 +rom:0006535a JRC 0x0006532c +rom:0006535c MOVE A14,-*SP,0x1 +rom:0006535e MOVE *A13(0x80),A11,0x1 +rom:00065362 MOVK 0x1,A7 +rom:00065364 JREQ 0x00065368 +rom:00065366 SUB A7,A7 +rom:00065368 MOVE A7,*A14+,0x1 +rom:0006536a MOVE *A13(0xa0),A7,0x1 +rom:0006536e MOVE *A7(0xa0),*A14+,0x1 +rom:00065372 MOVE *A7(0x80),*A14+,0x1 +rom:00065376 MOVE *A7(0x50),A8,0x0 +rom:0006537a MOVE A8,*A14+,0x1 +rom:0006537c MOVE *A7(0x60),A8,0x0 +rom:00065380 MOVE A8,*A14+,0x1 +rom:00065382 MOVE *A7(0x58),A8,0x0 +rom:00065386 MOVE A8,*A14+,0x1 +rom:00065388 MOVE *A7(0xc0),*A14+,0x1 +rom:0006538c MOVE *A7(0xe0),*A14+,0x1 +rom:00065390 MOVE A13,A5 +rom:00065392 ADDK 0x0,A5 +rom:00065394 MOVE A5,*A14+,0x1 +rom:00065396 MOVE *A7(0x40),A8,0x0 +rom:0006539a MOVE A8,*A14+,0x1 +rom:0006539c CALLA 0x07eaca82 +rom:000653a2 MOVE A8,*A13(0xc0),0x1 +rom:000653a6 MOVE A8,A8 +rom:000653a8 JRNE 0x000653d2 +rom:000653aa MOVE A14,-*SP,0x1 +rom:000653ac MOVK 0xb,A5 +rom:000653ae MOVE A5,*A14+,0x1 +rom:000653b0 MOVE *A9(0x40),*A14+,0x1 +rom:000653b4 SETF 0x8,0x0,0x0 +rom:000653b6 MOVE *A9(0x8),A8,0x0 +rom:000653ba MOVE A8,*A14+,0x1 +rom:000653bc MOVE 0x1ad960,*A14+,0x1 +rom:000653c2 MOVE *A13(0xffe0),*A14+,0x1 +rom:000653c6 CALLA 0x07effa5e +rom:000653cc MOVE A5,A8 +rom:000653ce JR 0x000655f6 +rom:000653d2 MOVE A11,A11 +rom:000653d4 JREQ 0x000654cc +rom:000653d6 MOVE A14,-*SP,0x1 +rom:000653d8 SETF 0x8,0x0,0x0 +rom:000653da MOVE *A9(0x68),A8,0x0 +rom:000653de MOVE A8,*A14+,0x1 +rom:000653e0 MOVE *A9(0x60),A8,0x0 +rom:000653e4 MOVE A8,*A14+,0x1 +rom:000653e6 MOVE *A13(0xc0),A5,0x1 +rom:000653ea MOVE *A5(0x160),*A14+,0x1 +rom:000653ee MOVE *A7(0x160),*A14+,0x1 +rom:000653f2 MOVE *A11(0x80),*A14+,0x1 +rom:000653f6 MOVE *A9(0x8),A5,0x0 +rom:000653fa SLL 0x5,A5 +rom:000653fc ADDI 0xd5730,A5 +rom:00065402 MOVE *A5,A5,0x1 +rom:00065404 CALL A5 +rom:00065406 MOVE A8,*A13(0x120),0x1 +rom:0006540a MOVE A8,A5 +rom:0006540c JREQ 0x00065442 +rom:0006540e MOVE A14,-*SP,0x1 +rom:00065410 MOVE *A13(0xc0),*A14+,0x1 +rom:00065414 CALLA 0x07eacdda +rom:0006541a MOVE A14,-*SP,0x1 +rom:0006541c MOVE A5,*A14+,0x1 +rom:0006541e SUB A5,A5 +rom:00065420 MOVE A5,*A14+,0x1 +rom:00065422 SETF 0x8,0x0,0x0 +rom:00065424 MOVE *A9(0x8),A8,0x0 +rom:00065428 MOVE A8,*A14+,0x1 +rom:0006542a MOVE 0x1ad960,*A14+,0x1 +rom:00065430 MOVE *A13(0xffe0),*A14+,0x1 +rom:00065434 CALLA 0x07effa5e +rom:0006543a MOVE *A13(0x120),A8,0x1 +rom:0006543e JR 0x000655f6 +rom:00065442 MOVE A14,-*SP,0x1 +rom:00065444 MOVK 0x1,A5 +rom:00065446 MOVE A5,*A14+,0x1 +rom:00065448 MOVE *A13(0xc0),*A14+,0x1 +rom:0006544c MOVE A11,*A14+,0x1 +rom:0006544e CALLA 0x07ea72a4 +rom:00065454 MOVE A8,A8 +rom:00065456 JRNE 0x000655f4 +rom:0006545a MOVE A14,-*SP,0x1 +rom:0006545c MOVE *A13(0xc0),*A14+,0x1 +rom:00065460 CALLA 0x07eacdda +rom:00065466 MOVE *A11(0x80),A5,0x1 +rom:0006546a MOVE *A5(0x20),*A13(0xe0),0x1 +rom:00065470 MOVE A14,-*SP,0x1 +rom:00065472 MOVE *A13(0xe0),*A14+,0x1 +rom:00065476 MOVE *A13(0xe0),A5,0x1 +rom:0006547a MOVE *A5(0x60),A5,0x1 +rom:0006547e MOVE *A5(0xe0),A5,0x1 +rom:00065482 CALL A5 +rom:00065484 MOVE *A13(0xe0),A5,0x1 +rom:00065488 MOVE *A5(0x20),A5,0x1 +rom:0006548c MOVE *A13(0xe0),A7,0x1 +rom:00065490 MOVE *A7,*A5,0x1 +rom:00065492 MOVE *A7,A5,0x1 +rom:00065494 MOVE *A7(0x20),*A5(0x20),0x1 +rom:0006549a MOVE A14,-*SP,0x1 +rom:0006549c MOVE A7,*A14+,0x1 +rom:0006549e CALLA 0x07f63b18 +rom:000654a4 MOVE A14,-*SP,0x1 +rom:000654a6 MOVK 0xb,A5 +rom:000654a8 MOVE A5,*A14+,0x1 +rom:000654aa MOVE *A9(0x40),*A14+,0x1 +rom:000654ae SETF 0x8,0x0,0x0 +rom:000654b0 MOVE *A9(0x8),A8,0x0 +rom:000654b4 MOVE A8,*A14+,0x1 +rom:000654b6 MOVE 0x1ad960,*A14+,0x1 +rom:000654bc MOVE *A13(0xffe0),*A14+,0x1 +rom:000654c0 CALLA 0x07effa5e +rom:000654c6 MOVE A5,A8 +rom:000654c8 JR 0x000655f6 +rom:000654cc MOVE A14,-*SP,0x1 +rom:000654ce MOVI 0x98,A5 +rom:000654d2 MOVE A5,*A14+,0x1 +rom:000654d4 CALLA 0x07f63a74 +rom:000654da MOVE A8,*A13(0x100),0x1 +rom:000654de MOVE A8,A8 +rom:000654e0 JRNE 0x00065524 +rom:000654e2 MOVE A14,-*SP,0x1 +rom:000654e4 MOVI 0x3f532598,A8 +rom:000654ea MOVE A8,*A14+,0x1 +rom:000654ec CALLA 0x07f24f78 +rom:000654f2 MOVE A14,-*SP,0x1 +rom:000654f4 MOVE *A13(0xc0),*A14+,0x1 +rom:000654f8 CALLA 0x07eacdda +rom:000654fe MOVE A14,-*SP,0x1 +rom:00065500 MOVK 0xb,A5 +rom:00065502 MOVE A5,*A14+,0x1 +rom:00065504 SUB A5,A5 +rom:00065506 MOVE A5,*A14+,0x1 +rom:00065508 SETF 0x8,0x0,0x0 +rom:0006550a MOVE *A9(0x8),A8,0x0 +rom:0006550e MOVE A8,*A14+,0x1 +rom:00065510 MOVE 0x1ad960,*A14+,0x1 +rom:00065516 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006551a CALLA 0x07effa5e +rom:00065520 MOVK 0xb,A8 +rom:00065522 JR 0x000655f6 +rom:00065524 MOVK 0x4,A5 +rom:00065526 MOVB A5,*A8 +rom:00065528 MOVE A7,*A8(0x8),0x1 +rom:0006552c MOVE *A13(0xc0),*A8(0x28),0x1 +rom:00065532 MOVE *A9(0x20),*A8(0x48),0x1 +rom:00065538 MOVE *A9(0x40),*A8(0x68),0x1 +rom:0006553e MOVB *A9(0x60),*A8(0x88) +rom:00065544 MOVB *A9(0x68),*A8(0x90) +rom:0006554a MOVE A14,-*SP,0x1 +rom:0006554c MOVE A8,*A14+,0x1 +rom:0006554e CALLA 0x07e5b152 +rom:00065554 MOVE A8,*A13(0x120),0x1 +rom:00065558 MOVE A8,A8 +rom:0006555a JREQ 0x0006559c +rom:0006555c MOVE A14,-*SP,0x1 +rom:0006555e MOVE *A13(0x100),*A14+,0x1 +rom:00065562 CALLA 0x07f63b00 +rom:0006559c MOVE *A13(0xc0),A5,0x1 +rom:000655a0 MOVE *A9(0x40),*A5(0x0),0x1 +rom:000655a6 MOVE A14,-*SP,0x1 +rom:000655a8 SETF 0x10,0x0,0x0 +rom:000655aa MOVE @0x1ad980,A5,0x0 +rom:000655b0 MOVE A5,*A14+,0x1 +rom:000655b2 MOVI 0x3f566ed0,A7 +rom:000655b8 MOVE A7,*A14+,0x1 +rom:000655ba MOVE *A13(0xc0),*A14+,0x1 +rom:000655be MOVE @0x1ad990,A7,0x0 +rom:000655c4 MOVE A7,*A14+,0x1 +rom:000655c6 MOVE *A9(0x40),*A14+,0x1 +rom:000655ca CALLA 0x07f16ca2 +rom:000655d0 MOVE A14,-*SP,0x1 +rom:000655d2 SUB A7,A7 +rom:000655d4 MOVE A7,*A14+,0x1 +rom:000655d6 MOVE *A13(0xc0),*A14+,0x1 +rom:000655da MOVE *A13(0xffe0),*A14+,0x1 +rom:000655de CALLA 0x07e7fe96 +rom:000655e4 MOVE A8,*A13(0x120),0x1 +rom:000655e8 MOVE A14,-*SP,0x1 +rom:000655ea MOVE *A13(0x100),*A14+,0x1 +rom:000655ee CALLA 0x07f63b00 +rom:000655f4 SUB A8,A8 +rom:000655f6 MOVE *SP(0xc0),A14,0x1 +rom:000655fa MMFM SP,0x2aa0 diff --git a/xie/ghidra-evidence/handlers/slot43_065600.txt b/xie/ghidra-evidence/handlers/slot43_065600.txt new file mode 100644 index 0000000..3d410c7 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot43_065600.txt @@ -0,0 +1,472 @@ +rom:00065600 MMTM SP,0x554 +rom:00065604 MOVE A14,A13 +rom:00065606 ADDI 0x290,A14 +rom:0006560a MOVE *A13(0xffe0),A11,0x1 +rom:0006560e MOVE *A11(0x40),A9,0x1 +rom:00065612 SETF 0x10,0x0,0x0 +rom:00065614 MOVE *A9(0x10),A11,0x0 +rom:00065618 SUBK 0xa,A11 +rom:0006561a JREQ 0x00065622 +rom:0006561c MOVK 0x10,A8 +rom:0006561e JR 0x00065ca0 +rom:00065622 MOVE A14,-*SP,0x1 +rom:00065624 MOVE *A9(0x40),*A14+,0x1 +rom:00065628 MOVE *A9(0x20),*A14+,0x1 +rom:0006562c MOVE A13,A11 +rom:0006562e ADDI 0x1c0,A11 +rom:00065632 MOVE A11,*A14+,0x1 +rom:00065634 MOVE A13,A7 +rom:00065636 ADDI 0x1a0,A7 +rom:0006563a MOVE A7,*A14+,0x1 +rom:0006563c MOVE *A13(0xffe0),*A14+,0x1 +rom:00065640 CALLA 0x07ea6fa0 +rom:00065646 MOVE A8,*A13(0x270),0x1 +rom:0006564a MOVE A8,A8 +rom:0006564c JRNE 0x00065ca0 +rom:00065650 MOVE *A9(0xa0),A7,0x1 +rom:00065654 JREQ 0x0006565c +rom:00065656 MOVE *A9(0xa0),A7,0x1 +rom:0006565a JR 0x00065664 +rom:0006565c MOVE *A13(0x1c0),A7,0x1 +rom:00065660 MOVE *A7(0x80),A7,0x1 +rom:00065664 MOVE A7,*A13(0xe0),0x1 +rom:00065668 MOVE *A9(0xc0),A11,0x1 +rom:0006566c JREQ 0x00065674 +rom:0006566e MOVE *A9(0xc0),A11,0x1 +rom:00065672 JR 0x0006567c +rom:00065674 MOVE *A13(0x1c0),A11,0x1 +rom:00065678 MOVE *A11(0xa0),A11,0x1 +rom:0006567c MOVE A11,*A13(0x100),0x1 +rom:00065680 ADDI 0x40,A14 +rom:00065684 MOVE A14,-*SP,0x1 +rom:00065686 MOVE A9,A7 +rom:00065688 ADDI 0x60,A7 +rom:0006568c MOVE A7,*A14+,0x1 +rom:0006568e CALLA 0x07f638c2 +rom:00065694 MOVE -*A14,A8,0x1 +rom:00065696 MOVE A8,*A13(0x20),0x1 +rom:0006569a MOVE -*A14,A8,0x1 +rom:0006569c MOVE A8,*A13,0x1 +rom:0006569e MOVE *A13(0x0),*A14+,0x1 +rom:000656a2 MOVE *A13(0x20),*A14+,0x1 +rom:000656a6 MOVI 0x3f533740,A8 +rom:000656ac MOVE *A8+,*A14+,0x1 +rom:000656ae MOVE *A8+,*A14+,0x1 +rom:000656b0 CALLA 0x07fc1ce6 +rom:000656b6 JREQ 0x000656c2 +rom:000656b8 MOVE *A13(0x0),*A14+,0x1 +rom:000656bc MOVE *A13(0x20),*A14+,0x1 +rom:000656c0 JR 0x000656d0 +rom:000656c2 MOVE *A13(0x0),*A14+,0x1 +rom:000656c6 MOVE *A13(0x20),*A14+,0x1 +rom:000656ca CALLA 0x07fc18f6 +rom:000656d0 MOVI 0x3f533780,A8 +rom:000656d6 MOVE *A8+,*A14+,0x1 +rom:000656d8 MOVE *A8+,*A14+,0x1 +rom:000656da CALLA 0x07fc1cde +rom:000656e0 JRNE 0x0006576a +rom:000656e2 MOVE *A13(0x0),*A14+,0x1 +rom:000656e6 MOVE *A13(0x20),*A14+,0x1 +rom:000656ea MOVI 0x3f533740,A8 +rom:000656f0 MOVE *A8+,*A14+,0x1 +rom:000656f2 MOVE *A8+,*A14+,0x1 +rom:000656f4 CALLA 0x07fc1ce6 +rom:000656fa JREQ 0x00065706 +rom:000656fc MOVE *A13(0x0),*A14+,0x1 +rom:00065700 MOVE *A13(0x20),*A14+,0x1 +rom:00065704 JR 0x00065714 +rom:00065706 MOVE *A13(0x0),*A14+,0x1 +rom:0006570a MOVE *A13(0x20),*A14+,0x1 +rom:0006570e CALLA 0x07fc18f6 +rom:00065714 MOVI 0x3f5337c0,A8 +rom:0006571a MOVE *A8+,*A14+,0x1 +rom:0006571c MOVE *A8+,*A14+,0x1 +rom:0006571e CALLA 0x07fc1ce6 +rom:00065724 JREQ 0x00065776 +rom:00065726 MOVE *A13(0x0),*A14+,0x1 +rom:0006572a MOVE *A13(0x20),*A14+,0x1 +rom:0006572e MOVI 0x3f533740,A8 +rom:00065734 MOVE *A8+,*A14+,0x1 +rom:00065736 MOVE *A8+,*A14+,0x1 +rom:00065738 CALLA 0x07fc1ce6 +rom:0006573e JREQ 0x0006574a +rom:00065740 MOVE *A13(0x0),*A14+,0x1 +rom:00065744 MOVE *A13(0x20),*A14+,0x1 +rom:00065748 JR 0x00065758 +rom:0006574a MOVE *A13(0x0),*A14+,0x1 +rom:0006574e MOVE *A13(0x20),*A14+,0x1 +rom:00065752 CALLA 0x07fc18f6 +rom:00065758 MOVI 0x3f533800,A8 +rom:0006575e MOVE *A8+,*A14+,0x1 +rom:00065760 MOVE *A8+,*A14+,0x1 +rom:00065762 CALLA 0x07fc1cde +rom:00065768 JREQ 0x00065776 +rom:0006576a SUB A7,A7 +rom:0006576c SETF 0x10,0x0,0x0 +rom:0006576e MOVE A7,*A13(0x200),0x0 +rom:00065772 JR 0x000659b2 +rom:00065776 MOVE *A13(0x0),*A14+,0x1 +rom:0006577a MOVE *A13(0x20),*A14+,0x1 +rom:0006577e MOVI 0x3f533740,A8 +rom:00065784 MOVE *A8+,*A14+,0x1 +rom:00065786 MOVE *A8+,*A14+,0x1 +rom:00065788 CALLA 0x07fc1ce6 +rom:0006578e JREQ 0x0006579a +rom:00065790 MOVE *A13(0x0),*A14+,0x1 +rom:00065794 MOVE *A13(0x20),*A14+,0x1 +rom:00065798 JR 0x000657a8 +rom:0006579a MOVE *A13(0x0),*A14+,0x1 +rom:0006579e MOVE *A13(0x20),*A14+,0x1 +rom:000657a2 CALLA 0x07fc18f6 +rom:000657a8 MOVI 0x3f533840,A8 +rom:000657ae MOVE *A8+,*A14+,0x1 +rom:000657b0 MOVE *A8+,*A14+,0x1 +rom:000657b2 CALLA 0x07fc1ce6 +rom:000657b8 JREQ 0x00065838 +rom:000657ba MOVE *A13(0x0),*A14+,0x1 +rom:000657be MOVE *A13(0x20),*A14+,0x1 +rom:000657c2 MOVI 0x3f533740,A8 +rom:000657c8 MOVE *A8+,*A14+,0x1 +rom:000657ca MOVE *A8+,*A14+,0x1 +rom:000657cc CALLA 0x07fc1ce6 +rom:000657d2 JREQ 0x000657de +rom:000657d4 MOVE *A13(0x0),*A14+,0x1 +rom:000657d8 MOVE *A13(0x20),*A14+,0x1 +rom:000657dc JR 0x000657ec +rom:000657de MOVE *A13(0x0),*A14+,0x1 +rom:000657e2 MOVE *A13(0x20),*A14+,0x1 +rom:000657e6 CALLA 0x07fc18f6 +rom:000657ec MOVI 0x3f533880,A8 +rom:000657f2 MOVE *A8+,*A14+,0x1 +rom:000657f4 MOVE *A8+,*A14+,0x1 +rom:000657f6 CALLA 0x07fc1cde +rom:000657fc JREQ 0x00065838 +rom:000657fe MOVE *A13(0x0),*A14+,0x1 +rom:00065802 MOVE *A13(0x20),*A14+,0x1 +rom:00065806 MOVI 0x3f533740,A8 +rom:0006580c MOVE *A8+,*A14+,0x1 +rom:0006580e MOVE *A8+,*A14+,0x1 +rom:00065810 CALLA 0x07fc1ce6 +rom:00065816 JREQ 0x0006581c +rom:00065818 MOVK 0x1,A7 +rom:0006581a JR 0x0006581e +rom:0006581c MOVK 0x3,A7 +rom:0006581e SETF 0x10,0x0,0x0 +rom:00065820 MOVE A7,*A13(0x200),0x0 +rom:00065824 MOVE *A13(0xe0),*A13(0x120),0x1 +rom:0006582a MOVE A11,*A13(0xe0),0x1 +rom:0006582e MOVE *A13(0x120),*A13(0x100),0x1 +rom:00065834 JR 0x000659b2 +rom:00065838 MOVE *A13(0x0),*A14+,0x1 +rom:0006583c MOVE *A13(0x20),*A14+,0x1 +rom:00065840 MOVI 0x3f533740,A8 +rom:00065846 MOVE *A8+,*A14+,0x1 +rom:00065848 MOVE *A8+,*A14+,0x1 +rom:0006584a CALLA 0x07fc1ce6 +rom:00065850 JREQ 0x0006585c +rom:00065852 MOVE *A13(0x0),*A14+,0x1 +rom:00065856 MOVE *A13(0x20),*A14+,0x1 +rom:0006585a JR 0x0006586a +rom:0006585c MOVE *A13(0x0),*A14+,0x1 +rom:00065860 MOVE *A13(0x20),*A14+,0x1 +rom:00065864 CALLA 0x07fc18f6 +rom:0006586a MOVI 0x3f5338c0,A8 +rom:00065870 MOVE *A8+,*A14+,0x1 +rom:00065872 MOVE *A8+,*A14+,0x1 +rom:00065874 CALLA 0x07fc1ce6 +rom:0006587a JREQ 0x000658ca +rom:0006587c MOVE *A13(0x0),*A14+,0x1 +rom:00065880 MOVE *A13(0x20),*A14+,0x1 +rom:00065884 MOVI 0x3f533740,A8 +rom:0006588a MOVE *A8+,*A14+,0x1 +rom:0006588c MOVE *A8+,*A14+,0x1 +rom:0006588e CALLA 0x07fc1ce6 +rom:00065894 JREQ 0x000658a0 +rom:00065896 MOVE *A13(0x0),*A14+,0x1 +rom:0006589a MOVE *A13(0x20),*A14+,0x1 +rom:0006589e JR 0x000658ae +rom:000658a0 MOVE *A13(0x0),*A14+,0x1 +rom:000658a4 MOVE *A13(0x20),*A14+,0x1 +rom:000658a8 CALLA 0x07fc18f6 +rom:000658ae MOVI 0x3f533900,A8 +rom:000658b4 MOVE *A8+,*A14+,0x1 +rom:000658b6 MOVE *A8+,*A14+,0x1 +rom:000658b8 CALLA 0x07fc1cde +rom:000658be JREQ 0x000658ca +rom:000658c0 MOVK 0x2,A7 +rom:000658c2 SETF 0x10,0x0,0x0 +rom:000658c4 MOVE A7,*A13(0x200),0x0 +rom:000658c8 JR 0x000659b2 +rom:000658ca MOVE *A13(0x0),*A14+,0x1 +rom:000658ce MOVE *A13(0x20),*A14+,0x1 +rom:000658d2 MOVI 0x3f533740,A8 +rom:000658d8 MOVE *A8+,*A14+,0x1 +rom:000658da MOVE *A8+,*A14+,0x1 +rom:000658dc CALLA 0x07fc1ce6 +rom:000658e2 JREQ 0x000658ee +rom:000658e4 MOVE *A13(0x0),*A14+,0x1 +rom:000658e8 MOVE *A13(0x20),*A14+,0x1 +rom:000658ec JR 0x000658fc +rom:000658ee MOVE *A13(0x0),*A14+,0x1 +rom:000658f2 MOVE *A13(0x20),*A14+,0x1 +rom:000658f6 CALLA 0x07fc18f6 +rom:000658fc MOVI 0x3f533940,A8 +rom:00065902 MOVE *A8+,*A14+,0x1 +rom:00065904 MOVE *A8+,*A14+,0x1 +rom:00065906 CALLA 0x07fc1ce6 +rom:0006590c JREQ 0x0006598a +rom:0006590e MOVE *A13(0x0),*A14+,0x1 +rom:00065912 MOVE *A13(0x20),*A14+,0x1 +rom:00065916 MOVI 0x3f533740,A8 +rom:0006591c MOVE *A8+,*A14+,0x1 +rom:0006591e MOVE *A8+,*A14+,0x1 +rom:00065920 CALLA 0x07fc1ce6 +rom:00065926 JREQ 0x00065932 +rom:00065928 MOVE *A13(0x0),*A14+,0x1 +rom:0006592c MOVE *A13(0x20),*A14+,0x1 +rom:00065930 JR 0x00065940 +rom:00065932 MOVE *A13(0x0),*A14+,0x1 +rom:00065936 MOVE *A13(0x20),*A14+,0x1 +rom:0006593a CALLA 0x07fc18f6 +rom:00065940 MOVI 0x3f533980,A8 +rom:00065946 MOVE *A8+,*A14+,0x1 +rom:00065948 MOVE *A8+,*A14+,0x1 +rom:0006594a CALLA 0x07fc1cde +rom:00065950 JREQ 0x0006598a +rom:00065952 MOVE *A13(0x0),*A14+,0x1 +rom:00065956 MOVE *A13(0x20),*A14+,0x1 +rom:0006595a MOVI 0x3f533740,A8 +rom:00065960 MOVE *A8+,*A14+,0x1 +rom:00065962 MOVE *A8+,*A14+,0x1 +rom:00065964 CALLA 0x07fc1ce6 +rom:0006596a JREQ 0x00065970 +rom:0006596c MOVK 0x3,A7 +rom:0006596e JR 0x00065972 +rom:00065970 MOVK 0x1,A7 +rom:00065972 SETF 0x10,0x0,0x0 +rom:00065974 MOVE A7,*A13(0x200),0x0 +rom:00065978 MOVE *A13(0xe0),*A13(0x120),0x1 +rom:0006597e MOVE A11,*A13(0xe0),0x1 +rom:00065982 MOVE *A13(0x120),*A13(0x100),0x1 +rom:00065988 JR 0x000659b2 +rom:0006598a MOVE A14,-*SP,0x1 +rom:0006598c MOVK 0x2,A7 +rom:0006598e MOVE A7,*A14+,0x1 +rom:00065990 MOVE *A9(0x20),*A14+,0x1 +rom:00065994 SETF 0x8,0x0,0x0 +rom:00065996 MOVE *A9(0x8),A8,0x0 +rom:0006599a MOVE A8,*A14+,0x1 +rom:0006599c MOVE 0x1ad960,*A14+,0x1 +rom:000659a2 MOVE *A13(0xffe0),*A14+,0x1 +rom:000659a6 CALLA 0x07effa5e +rom:000659ac MOVE A7,A8 +rom:000659ae JR 0x00065ca0 +rom:000659b2 SUB A11,A11 +rom:000659b4 MOVE A11,*A13(0xc0),0x1 +rom:000659b8 MOVE *A13(0x1c0),A7,0x1 +rom:000659bc SETF 0x8,0x0,0x0 +rom:000659be MOVE *A7(0x48),A7,0x0 +rom:000659c2 CMP A7,A11 +rom:000659c4 JRNC 0x000659fe +rom:000659c6 MOVE *A13(0xc0),A11,0x1 +rom:000659ca SLL 0x5,A11 +rom:000659cc ADD A13,A11 +rom:000659ce MOVE *A13(0x1c0),A7,0x1 +rom:000659d2 MOVE *A7(0x160),A5,0x1 +rom:000659d6 MOVE *A13(0xc0),A7,0x1 +rom:000659da SLL 0x5,A7 +rom:000659dc ADD A7,A5 +rom:000659de MOVE *A5(0xd8),A7,0x1 +rom:000659e2 MOVE *A7(0x1a8),*A11(0x140),0x1 +rom:000659e8 MOVE *A13(0xc0),A11,0x1 +rom:000659ec INC A11 +rom:000659ee MOVE A11,*A13(0xc0),0x1 +rom:000659f2 MOVE *A13(0x1c0),A7,0x1 +rom:000659f6 MOVE *A7(0x48),A5,0x0 +rom:000659fa CMP A5,A11 +rom:000659fc JRC 0x000659c6 +rom:000659fe MOVE A14,-*SP,0x1 +rom:00065a00 MOVE *A13(0x1a0),A7,0x1 +rom:00065a04 MOVK 0x1,A5 +rom:00065a06 JREQ 0x00065a0a +rom:00065a08 SUB A5,A5 +rom:00065a0a MOVE A5,*A14+,0x1 +rom:00065a0c MOVE *A13(0x100),*A14+,0x1 +rom:00065a10 MOVE *A13(0xe0),*A14+,0x1 +rom:00065a14 MOVE *A13(0x1c0),A5,0x1 +rom:00065a18 MOVE *A5(0x50),A8,0x0 +rom:00065a1c MOVE A8,*A14+,0x1 +rom:00065a1e MOVE *A5(0x60),A8,0x0 +rom:00065a22 MOVE A8,*A14+,0x1 +rom:00065a24 MOVE *A5(0x58),A8,0x0 +rom:00065a28 MOVE A8,*A14+,0x1 +rom:00065a2a MOVE *A5(0xc0),*A14+,0x1 +rom:00065a2e MOVE *A5(0xe0),*A14+,0x1 +rom:00065a32 MOVE A13,A5 +rom:00065a34 ADDI 0x140,A5 +rom:00065a38 MOVE A5,*A14+,0x1 +rom:00065a3a MOVE *A13(0x1c0),A5,0x1 +rom:00065a3e MOVE *A5(0x40),A8,0x0 +rom:00065a42 MOVE A8,*A14+,0x1 +rom:00065a44 CALLA 0x07eaca82 +rom:00065a4a MOVE A8,*A13(0x1e0),0x1 +rom:00065a4e MOVE A8,A8 +rom:00065a50 JRNE 0x00065a7a +rom:00065a52 MOVE A14,-*SP,0x1 +rom:00065a54 MOVK 0xb,A5 +rom:00065a56 MOVE A5,*A14+,0x1 +rom:00065a58 MOVE *A9(0x40),*A14+,0x1 +rom:00065a5c SETF 0x8,0x0,0x0 +rom:00065a5e MOVE *A9(0x8),A8,0x0 +rom:00065a62 MOVE A8,*A14+,0x1 +rom:00065a64 MOVE 0x1ad960,*A14+,0x1 +rom:00065a6a MOVE *A13(0xffe0),*A14+,0x1 +rom:00065a6e CALLA 0x07effa5e +rom:00065a74 MOVE A5,A8 +rom:00065a76 JR 0x00065ca0 +rom:00065a7a MOVE A7,A7 +rom:00065a7c JREQ 0x00065b78 +rom:00065a7e MOVE A14,-*SP,0x1 +rom:00065a80 MOVE A9,A5 +rom:00065a82 ADDI 0xe0,A5 +rom:00065a86 MOVE A5,*A14+,0x1 +rom:00065a88 MOVE *A13(0x0),*A14+,0x1 +rom:00065a8c MOVE *A13(0x20),*A14+,0x1 +rom:00065a90 MOVE *A8(0x160),*A14+,0x1 +rom:00065a94 MOVE *A13(0x1c0),A5,0x1 +rom:00065a98 MOVE *A5(0x160),*A14+,0x1 +rom:00065a9c MOVE *A7(0x80),*A14+,0x1 +rom:00065aa0 SETF 0x8,0x0,0x0 +rom:00065aa2 MOVE *A9(0x8),A5,0x0 +rom:00065aa6 SLL 0x5,A5 +rom:00065aa8 ADDI 0xd5730,A5 +rom:00065aae MOVE *A5,A5,0x1 +rom:00065ab0 CALL A5 +rom:00065ab2 MOVE A8,*A13(0x250),0x1 +rom:00065ab6 MOVE A8,A5 +rom:00065ab8 JREQ 0x00065aee +rom:00065aba MOVE A14,-*SP,0x1 +rom:00065abc MOVE *A13(0x1e0),*A14+,0x1 +rom:00065ac0 CALLA 0x07eacdda +rom:00065ac6 MOVE A14,-*SP,0x1 +rom:00065ac8 MOVE A5,*A14+,0x1 +rom:00065aca SUB A5,A5 +rom:00065acc MOVE A5,*A14+,0x1 +rom:00065ace SETF 0x8,0x0,0x0 +rom:00065ad0 MOVE *A9(0x8),A8,0x0 +rom:00065ad4 MOVE A8,*A14+,0x1 +rom:00065ad6 MOVE 0x1ad960,*A14+,0x1 +rom:00065adc MOVE *A13(0xffe0),*A14+,0x1 +rom:00065ae0 CALLA 0x07effa5e +rom:00065ae6 MOVE *A13(0x250),A8,0x1 +rom:00065aea JR 0x00065ca0 +rom:00065aee MOVE A14,-*SP,0x1 +rom:00065af0 MOVK 0x1,A5 +rom:00065af2 MOVE A5,*A14+,0x1 +rom:00065af4 MOVE *A13(0x1e0),*A14+,0x1 +rom:00065af8 MOVE A7,*A14+,0x1 +rom:00065afa CALLA 0x07ea72a4 +rom:00065b00 MOVE A8,A8 +rom:00065b02 JRNE 0x00065c9e +rom:00065b06 MOVE A14,-*SP,0x1 +rom:00065b08 MOVE *A13(0x1e0),*A14+,0x1 +rom:00065b0c CALLA 0x07eacdda +rom:00065b12 MOVE *A7(0x80),A5,0x1 +rom:00065b16 MOVE *A5(0x20),*A13(0x210),0x1 +rom:00065b1c MOVE A14,-*SP,0x1 +rom:00065b1e MOVE *A13(0x210),*A14+,0x1 +rom:00065b22 MOVE *A13(0x210),A5,0x1 +rom:00065b26 MOVE *A5(0x60),A5,0x1 +rom:00065b2a MOVE *A5(0xe0),A5,0x1 +rom:00065b2e CALL A5 +rom:00065b30 MOVE *A13(0x210),A5,0x1 +rom:00065b34 MOVE *A5(0x20),A5,0x1 +rom:00065b38 MOVE *A13(0x210),A7,0x1 +rom:00065b3c MOVE *A7,*A5,0x1 +rom:00065b3e MOVE *A7,A5,0x1 +rom:00065b40 MOVE *A7(0x20),*A5(0x20),0x1 +rom:00065b46 MOVE A14,-*SP,0x1 +rom:00065b48 MOVE A7,*A14+,0x1 +rom:00065b4a CALLA 0x07f63b18 +rom:00065b50 MOVE A14,-*SP,0x1 +rom:00065b52 MOVK 0xb,A5 +rom:00065b54 MOVE A5,*A14+,0x1 +rom:00065b56 MOVE *A9(0x40),*A14+,0x1 +rom:00065b5a SETF 0x8,0x0,0x0 +rom:00065b5c MOVE *A9(0x8),A8,0x0 +rom:00065b60 MOVE A8,*A14+,0x1 +rom:00065b62 MOVE 0x1ad960,*A14+,0x1 +rom:00065b68 MOVE *A13(0xffe0),*A14+,0x1 +rom:00065b6c CALLA 0x07effa5e +rom:00065b72 MOVE A5,A8 +rom:00065b74 JR 0x00065ca0 +rom:00065b78 MOVE A14,-*SP,0x1 +rom:00065b7a MOVI 0x98,A5 +rom:00065b7e MOVE A5,*A14+,0x1 +rom:00065b80 CALLA 0x07f63a74 +rom:00065b86 MOVE A8,*A13(0x230),0x1 +rom:00065b8a MOVE A8,A8 +rom:00065b8c JRNE 0x00065bd0 +rom:00065b8e MOVE A14,-*SP,0x1 +rom:00065b90 MOVI 0x3f5326d8,A8 +rom:00065b96 MOVE A8,*A14+,0x1 +rom:00065b98 CALLA 0x07f24f78 +rom:00065b9e MOVE A14,-*SP,0x1 +rom:00065ba0 MOVE *A13(0x1e0),*A14+,0x1 +rom:00065ba4 CALLA 0x07eacdda +rom:00065baa MOVE A14,-*SP,0x1 +rom:00065bac MOVK 0xb,A5 +rom:00065bae MOVE A5,*A14+,0x1 +rom:00065bb0 SUB A5,A5 +rom:00065bb2 MOVE A5,*A14+,0x1 +rom:00065bb4 SETF 0x8,0x0,0x0 +rom:00065bb6 MOVE *A9(0x8),A8,0x0 +rom:00065bba MOVE A8,*A14+,0x1 +rom:00065bbc MOVE 0x1ad960,*A14+,0x1 +rom:00065bc2 MOVE *A13(0xffe0),*A14+,0x1 +rom:00065bc6 CALLA 0x07effa5e +rom:00065bcc MOVK 0xb,A8 +rom:00065bce JR 0x00065ca0 +rom:00065bd0 MOVK 0x3,A5 +rom:00065bd2 MOVB A5,*A8 +rom:00065bd4 MOVE *A13(0x1c0),*A8(0x8),0x1 +rom:00065bda MOVE *A13(0x1e0),*A8(0x28),0x1 +rom:00065be0 MOVE *A9(0x20),*A8(0x48),0x1 +rom:00065be6 MOVE *A9(0x40),*A8(0x68),0x1 +rom:00065bec SETF 0x10,0x0,0x0 +rom:00065bee MOVE *A13(0x200),*A8(0x88),0x0 +rom:00065bf4 MOVE A14,-*SP,0x1 +rom:00065bf6 MOVE A8,*A14+,0x1 +rom:00065bf8 CALLA 0x07e5b152 +rom:00065bfe MOVE A8,*A13(0x250),0x1 +rom:00065c02 MOVE A8,A8 +rom:00065c04 JREQ 0x00065c46 +rom:00065c06 MOVE A14,-*SP,0x1 +rom:00065c08 MOVE *A13(0x230),*A14+,0x1 +rom:00065c0c CALLA 0x07f63b00 +rom:00065c46 MOVE *A13(0x1e0),A5,0x1 +rom:00065c4a MOVE *A9(0x40),*A5(0x0),0x1 +rom:00065c50 MOVE A14,-*SP,0x1 +rom:00065c52 SETF 0x10,0x0,0x0 +rom:00065c54 MOVE @0x1ad980,A5,0x0 +rom:00065c5a MOVE A5,*A14+,0x1 +rom:00065c5c MOVI 0x3f566ed0,A7 +rom:00065c62 MOVE A7,*A14+,0x1 +rom:00065c64 MOVE *A13(0x1e0),*A14+,0x1 +rom:00065c68 MOVE @0x1ad990,A7,0x0 +rom:00065c6e MOVE A7,*A14+,0x1 +rom:00065c70 MOVE *A9(0x40),*A14+,0x1 +rom:00065c74 CALLA 0x07f16ca2 +rom:00065c7a MOVE A14,-*SP,0x1 +rom:00065c7c SUB A7,A7 +rom:00065c7e MOVE A7,*A14+,0x1 +rom:00065c80 MOVE *A13(0x1e0),*A14+,0x1 +rom:00065c84 MOVE *A13(0xffe0),*A14+,0x1 +rom:00065c88 CALLA 0x07e7fe96 +rom:00065c8e MOVE A8,*A13(0x250),0x1 +rom:00065c92 MOVE A14,-*SP,0x1 +rom:00065c94 MOVE *A13(0x230),*A14+,0x1 +rom:00065c98 CALLA 0x07f63b00 +rom:00065c9e SUB A8,A8 +rom:00065ca0 MOVE *SP(0xc0),A14,0x1 +rom:00065ca4 MMFM SP,0x2aa0 diff --git a/xie/ghidra-evidence/handlers/slot44_065CAA.txt b/xie/ghidra-evidence/handlers/slot44_065CAA.txt new file mode 100644 index 0000000..5b9ca40 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot44_065CAA.txt @@ -0,0 +1,243 @@ +rom:00065caa MMTM SP,0x554 +rom:00065cae MOVE A14,A13 +rom:00065cb0 ADDI 0x160,A14 +rom:00065cb4 MOVE *A13(0xffe0),A11,0x1 +rom:00065cb8 MOVE *A11(0x40),A9,0x1 +rom:00065cbc SETF 0x10,0x0,0x0 +rom:00065cbe MOVE *A9(0x10),A11,0x0 +rom:00065cc2 SUBK 0x5,A11 +rom:00065cc4 JREQ 0x00065ccc +rom:00065cc6 MOVK 0x10,A8 +rom:00065cc8 JR 0x00065ffa +rom:00065ccc MOVE A14,-*SP,0x1 +rom:00065cce MOVE *A9(0x40),*A14+,0x1 +rom:00065cd2 MOVE *A9(0x20),*A14+,0x1 +rom:00065cd6 MOVE A13,A11 +rom:00065cd8 ADDI 0xa0,A11 +rom:00065cdc MOVE A11,*A14+,0x1 +rom:00065cde MOVE A13,A7 +rom:00065ce0 ADDI 0x80,A7 +rom:00065ce4 MOVE A7,*A14+,0x1 +rom:00065ce6 MOVE *A13(0xffe0),*A14+,0x1 +rom:00065cea CALLA 0x07ea6fa0 +rom:00065cf0 MOVE A8,*A13(0x140),0x1 +rom:00065cf4 MOVE A8,A8 +rom:00065cf6 JRNE 0x00065ffa +rom:00065cfa MOVE *A9(0x60),A7,0x1 +rom:00065cfe JREQ 0x00065d06 +rom:00065d00 MOVE *A9(0x80),A7,0x1 +rom:00065d04 JRNE 0x00065d2e +rom:00065d06 MOVE A14,-*SP,0x1 +rom:00065d08 MOVK 0x2,A7 +rom:00065d0a MOVE A7,*A14+,0x1 +rom:00065d0c MOVE *A9(0x20),*A14+,0x1 +rom:00065d10 SETF 0x8,0x0,0x0 +rom:00065d12 MOVE *A9(0x8),A8,0x0 +rom:00065d16 MOVE A8,*A14+,0x1 +rom:00065d18 MOVE 0x1ad960,*A14+,0x1 +rom:00065d1e MOVE *A13(0xffe0),*A14+,0x1 +rom:00065d22 CALLA 0x07effa5e +rom:00065d28 MOVE A7,A8 +rom:00065d2a JR 0x00065ffa +rom:00065d2e SUB A7,A7 +rom:00065d30 MOVE A7,*A13,0x1 +rom:00065d32 MOVE *A13(0xa0),A11,0x1 +rom:00065d36 SETF 0x8,0x0,0x0 +rom:00065d38 MOVE *A11(0x48),A11,0x0 +rom:00065d3c CMP A11,A7 +rom:00065d3e JRNC 0x00065d70 +rom:00065d40 MOVE *A13,A11,0x1 +rom:00065d42 SLL 0x5,A11 +rom:00065d44 ADD A13,A11 +rom:00065d46 MOVE *A13(0xa0),A7,0x1 +rom:00065d4a MOVE *A7(0x160),A5,0x1 +rom:00065d4e MOVE *A13,A7,0x1 +rom:00065d50 SLL 0x5,A7 +rom:00065d52 ADD A7,A5 +rom:00065d54 MOVE *A5(0xd8),A7,0x1 +rom:00065d58 MOVE *A7(0x1a8),*A11(0x20),0x1 +rom:00065d5e MOVE *A13,A11,0x1 +rom:00065d60 INC A11 +rom:00065d62 MOVE A11,*A13,0x1 +rom:00065d64 MOVE *A13(0xa0),A7,0x1 +rom:00065d68 MOVE *A7(0x48),A5,0x0 +rom:00065d6c CMP A5,A11 +rom:00065d6e JRC 0x00065d40 +rom:00065d70 MOVE A14,-*SP,0x1 +rom:00065d72 MOVE *A13(0x80),A11,0x1 +rom:00065d76 MOVK 0x1,A7 +rom:00065d78 JREQ 0x00065d7c +rom:00065d7a SUB A7,A7 +rom:00065d7c MOVE A7,*A14+,0x1 +rom:00065d7e MOVE *A9(0x80),*A14+,0x1 +rom:00065d82 MOVE *A9(0x60),*A14+,0x1 +rom:00065d86 MOVE *A13(0xa0),A7,0x1 +rom:00065d8a MOVE *A7(0x50),A8,0x0 +rom:00065d8e MOVE A8,*A14+,0x1 +rom:00065d90 MOVE *A7(0x60),A8,0x0 +rom:00065d94 MOVE A8,*A14+,0x1 +rom:00065d96 MOVE *A7(0x58),A8,0x0 +rom:00065d9a MOVE A8,*A14+,0x1 +rom:00065d9c MOVE *A7(0xc0),*A14+,0x1 +rom:00065da0 MOVE *A7(0xe0),*A14+,0x1 +rom:00065da4 MOVE A13,A5 +rom:00065da6 ADDK 0x0,A5 +rom:00065da8 MOVE A5,*A14+,0x1 +rom:00065daa MOVE *A7(0x40),A8,0x0 +rom:00065dae MOVE A8,*A14+,0x1 +rom:00065db0 CALLA 0x07eaca82 +rom:00065db6 MOVE A8,*A13(0xc0),0x1 +rom:00065dba MOVE A8,A8 +rom:00065dbc JRNE 0x00065de6 +rom:00065dbe MOVE A14,-*SP,0x1 +rom:00065dc0 MOVK 0xb,A5 +rom:00065dc2 MOVE A5,*A14+,0x1 +rom:00065dc4 MOVE *A9(0x40),*A14+,0x1 +rom:00065dc8 SETF 0x8,0x0,0x0 +rom:00065dca MOVE *A9(0x8),A8,0x0 +rom:00065dce MOVE A8,*A14+,0x1 +rom:00065dd0 MOVE 0x1ad960,*A14+,0x1 +rom:00065dd6 MOVE *A13(0xffe0),*A14+,0x1 +rom:00065dda CALLA 0x07effa5e +rom:00065de0 MOVE A5,A8 +rom:00065de2 JR 0x00065ffa +rom:00065de6 MOVE A11,A11 +rom:00065de8 JREQ 0x00065ed0 +rom:00065dea MOVE A14,-*SP,0x1 +rom:00065dec MOVE *A8(0x160),*A14+,0x1 +rom:00065df0 MOVE *A7(0x160),*A14+,0x1 +rom:00065df4 MOVE *A11(0x80),*A14+,0x1 +rom:00065df8 SETF 0x8,0x0,0x0 +rom:00065dfa MOVE *A9(0x8),A5,0x0 +rom:00065dfe SLL 0x5,A5 +rom:00065e00 ADDI 0xd5730,A5 +rom:00065e06 MOVE *A5,A5,0x1 +rom:00065e08 CALL A5 +rom:00065e0a MOVE A8,*A13(0x120),0x1 +rom:00065e0e MOVE A8,A5 +rom:00065e10 JREQ 0x00065e46 +rom:00065e12 MOVE A14,-*SP,0x1 +rom:00065e14 MOVE *A13(0xc0),*A14+,0x1 +rom:00065e18 CALLA 0x07eacdda +rom:00065e1e MOVE A14,-*SP,0x1 +rom:00065e20 MOVE A5,*A14+,0x1 +rom:00065e22 SUB A5,A5 +rom:00065e24 MOVE A5,*A14+,0x1 +rom:00065e26 SETF 0x8,0x0,0x0 +rom:00065e28 MOVE *A9(0x8),A8,0x0 +rom:00065e2c MOVE A8,*A14+,0x1 +rom:00065e2e MOVE 0x1ad960,*A14+,0x1 +rom:00065e34 MOVE *A13(0xffe0),*A14+,0x1 +rom:00065e38 CALLA 0x07effa5e +rom:00065e3e MOVE *A13(0x120),A8,0x1 +rom:00065e42 JR 0x00065ffa +rom:00065e46 MOVE A14,-*SP,0x1 +rom:00065e48 MOVK 0x1,A5 +rom:00065e4a MOVE A5,*A14+,0x1 +rom:00065e4c MOVE *A13(0xc0),*A14+,0x1 +rom:00065e50 MOVE A11,*A14+,0x1 +rom:00065e52 CALLA 0x07ea72a4 +rom:00065e58 MOVE A8,A8 +rom:00065e5a JRNE 0x00065ff8 +rom:00065e5e MOVE A14,-*SP,0x1 +rom:00065e60 MOVE *A13(0xc0),*A14+,0x1 +rom:00065e64 CALLA 0x07eacdda +rom:00065e6a MOVE *A11(0x80),A5,0x1 +rom:00065e6e MOVE *A5(0x20),*A13(0xe0),0x1 +rom:00065e74 MOVE A14,-*SP,0x1 +rom:00065e76 MOVE *A13(0xe0),*A14+,0x1 +rom:00065e7a MOVE *A13(0xe0),A5,0x1 +rom:00065e7e MOVE *A5(0x60),A5,0x1 +rom:00065e82 MOVE *A5(0xe0),A5,0x1 +rom:00065e86 CALL A5 +rom:00065e88 MOVE *A13(0xe0),A5,0x1 +rom:00065e8c MOVE *A5(0x20),A5,0x1 +rom:00065e90 MOVE *A13(0xe0),A7,0x1 +rom:00065e94 MOVE *A7,*A5,0x1 +rom:00065e96 MOVE *A7,A5,0x1 +rom:00065e98 MOVE *A7(0x20),*A5(0x20),0x1 +rom:00065e9e MOVE A14,-*SP,0x1 +rom:00065ea0 MOVE A7,*A14+,0x1 +rom:00065ea2 CALLA 0x07f63b18 +rom:00065ea8 MOVE A14,-*SP,0x1 +rom:00065eaa MOVK 0xb,A5 +rom:00065eac MOVE A5,*A14+,0x1 +rom:00065eae MOVE *A9(0x40),*A14+,0x1 +rom:00065eb2 SETF 0x8,0x0,0x0 +rom:00065eb4 MOVE *A9(0x8),A8,0x0 +rom:00065eb8 MOVE A8,*A14+,0x1 +rom:00065eba MOVE 0x1ad960,*A14+,0x1 +rom:00065ec0 MOVE *A13(0xffe0),*A14+,0x1 +rom:00065ec4 CALLA 0x07effa5e +rom:00065eca MOVE A5,A8 +rom:00065ecc JR 0x00065ffa +rom:00065ed0 MOVE A14,-*SP,0x1 +rom:00065ed2 MOVI 0xc8,A5 +rom:00065ed6 MOVE A5,*A14+,0x1 +rom:00065ed8 CALLA 0x07f63a74 +rom:00065ede MOVE A8,*A13(0x100),0x1 +rom:00065ee2 MOVE A8,A8 +rom:00065ee4 JRNE 0x00065f28 +rom:00065ee6 MOVE A14,-*SP,0x1 +rom:00065ee8 MOVI 0x3f532818,A8 +rom:00065eee MOVE A8,*A14+,0x1 +rom:00065ef0 CALLA 0x07f24f78 +rom:00065ef6 MOVE A14,-*SP,0x1 +rom:00065ef8 MOVE *A13(0xc0),*A14+,0x1 +rom:00065efc CALLA 0x07eacdda +rom:00065f02 MOVE A14,-*SP,0x1 +rom:00065f04 MOVK 0xb,A5 +rom:00065f06 MOVE A5,*A14+,0x1 +rom:00065f08 SUB A5,A5 +rom:00065f0a MOVE A5,*A14+,0x1 +rom:00065f0c SETF 0x8,0x0,0x0 +rom:00065f0e MOVE *A9(0x8),A8,0x0 +rom:00065f12 MOVE A8,*A14+,0x1 +rom:00065f14 MOVE 0x1ad960,*A14+,0x1 +rom:00065f1a MOVE *A13(0xffe0),*A14+,0x1 +rom:00065f1e CALLA 0x07effa5e +rom:00065f24 MOVK 0xb,A8 +rom:00065f26 JR 0x00065ffa +rom:00065f28 MOVK 0x2,A5 +rom:00065f2a MOVB A5,*A8 +rom:00065f2c MOVE A7,*A8(0x8),0x1 +rom:00065f30 MOVE *A13(0xc0),*A8(0x28),0x1 +rom:00065f36 MOVE *A9(0x20),*A8(0x48),0x1 +rom:00065f3c MOVE *A9(0x40),*A8(0x68),0x1 +rom:00065f42 MOVE *A9(0x60),*A8(0x88),0x1 +rom:00065f48 MOVE *A9(0x80),*A8(0xa8),0x1 +rom:00065f4e MOVE A14,-*SP,0x1 +rom:00065f50 MOVE A8,*A14+,0x1 +rom:00065f52 CALLA 0x07e5b152 +rom:00065f58 MOVE A8,*A13(0x120),0x1 +rom:00065f5c MOVE A8,A8 +rom:00065f5e JREQ 0x00065fa0 +rom:00065f60 MOVE A14,-*SP,0x1 +rom:00065f62 MOVE *A13(0x100),*A14+,0x1 +rom:00065f66 CALLA 0x07f63b00 +rom:00065fa0 MOVE *A13(0xc0),A5,0x1 +rom:00065fa4 MOVE *A9(0x40),*A5(0x0),0x1 +rom:00065faa MOVE A14,-*SP,0x1 +rom:00065fac SETF 0x10,0x0,0x0 +rom:00065fae MOVE @0x1ad980,A5,0x0 +rom:00065fb4 MOVE A5,*A14+,0x1 +rom:00065fb6 MOVI 0x3f566ed0,A7 +rom:00065fbc MOVE A7,*A14+,0x1 +rom:00065fbe MOVE *A13(0xc0),*A14+,0x1 +rom:00065fc2 MOVE @0x1ad990,A7,0x0 +rom:00065fc8 MOVE A7,*A14+,0x1 +rom:00065fca MOVE *A9(0x40),*A14+,0x1 +rom:00065fce CALLA 0x07f16ca2 +rom:00065fd4 MOVE A14,-*SP,0x1 +rom:00065fd6 SUB A7,A7 +rom:00065fd8 MOVE A7,*A14+,0x1 +rom:00065fda MOVE *A13(0xc0),*A14+,0x1 +rom:00065fde MOVE *A13(0xffe0),*A14+,0x1 +rom:00065fe2 CALLA 0x07e7fe96 +rom:00065fe8 MOVE A8,*A13(0x120),0x1 +rom:00065fec MOVE A14,-*SP,0x1 +rom:00065fee MOVE *A13(0x100),*A14+,0x1 +rom:00065ff2 CALLA 0x07f63b00 +rom:00065ff8 SUB A8,A8 +rom:00065ffa MOVE *SP(0xc0),A14,0x1 +rom:00065ffe MMFM SP,0x2aa0 diff --git a/xie/ghidra-evidence/handlers/slot_probe.txt b/xie/ghidra-evidence/handlers/slot_probe.txt new file mode 100644 index 0000000..1dd3671 --- /dev/null +++ b/xie/ghidra-evidence/handlers/slot_probe.txt @@ -0,0 +1,19 @@ +3 query,2w minor=3 words=2: REPLY seq=2 len=0 bytes=00000000f0ca6a002600000090d03300 extra=0 +6 query,1w minor=6 words=1: REPLY seq=2 len=0 bytes=00000000000000000000000000000000 extra=0 +10 query,3w minor=10 words=3: ERROR code=1 seq=2 bad=0x0 minor_op=10 major_op=129 +24 query,4w minor=24 words=4: ERROR code=14 seq=2 bad=0xffffffff minor_op=24 major_op=129 +4 set,2w minor=4 words=2: TIMEOUT (no reply/error) +12 id,2w minor=12 words=2: ERROR code=14 seq=2 bad=0xffffffff minor_op=12 major_op=129 +22 id,2w minor=22 words=2: ERROR code=14 seq=2 bad=0xffffffff minor_op=22 major_op=129 +13 id,2w minor=13 words=2: ERROR code=14 seq=2 bad=0xffffffff minor_op=13 major_op=129 +11 id,3w minor=11 words=3: ERROR code=14 seq=2 bad=0xffffffff minor_op=11 major_op=129 +9 id,3w minor=9 words=3: ERROR code=1 seq=2 bad=0x0 minor_op=9 major_op=129 +15 id,3w minor=15 words=3: ERROR code=14 seq=2 bad=0xffffffff minor_op=15 major_op=129 +8 id,3w minor=8 words=3: ERROR code=1 seq=2 bad=0x0 minor_op=8 major_op=129 +7 id,4w minor=7 words=4: ERROR code=1 seq=2 bad=0xffffffff minor_op=7 major_op=129 +14 id,4w minor=14 words=4: ERROR code=14 seq=2 bad=0xffffffff minor_op=14 major_op=129 +18 id,4w minor=18 words=4: ERROR code=14 seq=2 bad=0xffffffff minor_op=18 major_op=129 +33 id,4w minor=33 words=4: ERROR code=14 seq=2 bad=0xffffffff minor_op=33 major_op=129 +40 id,4w minor=40 words=4: ERROR code=14 seq=2 bad=0xffffffff minor_op=40 major_op=129 +44 id,5w minor=44 words=5: ERROR code=14 seq=2 bad=0xffffffff minor_op=44 major_op=129 +5 sel,5w minor=5 words=5: ERROR code=2 seq=2 bad=0x0 minor_op=5 major_op=129 diff --git a/xie/ghidra-evidence/image_path/swapper_slot01_0697B4.txt b/xie/ghidra-evidence/image_path/swapper_slot01_0697B4.txt new file mode 100644 index 0000000..b1ba838 --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot01_0697B4.txt @@ -0,0 +1,19 @@ +rom:000697b4 MMTM SP,0x74 +rom:000697b8 MOVE A14,A13 +rom:000697ba MOVE *A13(0xffe0),A11,0x1 +rom:000697be MOVE *A11(0x40),A10,0x1 +rom:000697c2 MOVB *A10(0x10),*A9 +rom:000697c6 MOVB *A10(0x18),*A10(0x10) +rom:000697cc MOVB *A9,*A10(0x18) +rom:000697d0 MOVB *A10(0x20),*A9 +rom:000697d4 MOVB *A10(0x28),*A10(0x20) +rom:000697da MOVB *A9,*A10(0x28) +rom:000697de MOVB *A10(0x30),*A9 +rom:000697e2 MOVB *A10(0x38),*A10(0x30) +rom:000697e8 MOVB *A9,*A10(0x38) +rom:000697ec MOVE A14,-*SP,0x1 +rom:000697ee MOVE A11,*A14+,0x1 +rom:000697f0 SETF 0x8,0x0,0x0 +rom:000697f2 MOVE *A10(0x8),A11,0x0 +rom:000697f6 SLL 0x5,A11 +rom:000697f8 ADDI 0xd3f90,A11 diff --git a/xie/ghidra-evidence/image_path/swapper_slot02_069704.txt b/xie/ghidra-evidence/image_path/swapper_slot02_069704.txt new file mode 100644 index 0000000..112be4e --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot02_069704.txt @@ -0,0 +1,13 @@ +rom:00069704 MMTM SP,0x174 +rom:00069708 MOVE A14,A13 +rom:0006970a MOVE *A13(0xffe0),A9,0x1 +rom:0006970e MOVE *A9(0x40),A11,0x1 +rom:00069712 MOVB *A11(0x10),*A10 +rom:00069716 MOVB *A11(0x18),*A11(0x10) +rom:0006971c MOVB *A10,*A11(0x18) +rom:00069720 MOVE A14,-*SP,0x1 +rom:00069722 MOVE A9,*A14+,0x1 +rom:00069724 SETF 0x8,0x0,0x0 +rom:00069726 MOVE *A11(0x8),A7,0x0 +rom:0006972a SLL 0x5,A7 +rom:0006972c ADDI 0xd3f90,A7 diff --git a/xie/ghidra-evidence/image_path/swapper_slot03_06980C.txt b/xie/ghidra-evidence/image_path/swapper_slot03_06980C.txt new file mode 100644 index 0000000..0062764 --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot03_06980C.txt @@ -0,0 +1,19 @@ +rom:0006980c MMTM SP,0x74 +rom:00069810 MOVE A14,A13 +rom:00069812 MOVE *A13(0xffe0),A11,0x1 +rom:00069816 MOVE *A11(0x40),A10,0x1 +rom:0006981a MOVB *A10(0x10),*A9 +rom:0006981e MOVB *A10(0x18),*A10(0x10) +rom:00069824 MOVB *A9,*A10(0x18) +rom:00069828 MOVB *A10(0x20),*A9 +rom:0006982c MOVB *A10(0x38),*A10(0x20) +rom:00069832 MOVB *A9,*A10(0x38) +rom:00069836 MOVB *A10(0x28),*A9 +rom:0006983a MOVB *A10(0x30),*A10(0x28) +rom:00069840 MOVB *A9,*A10(0x30) +rom:00069844 MOVE A14,-*SP,0x1 +rom:00069846 MOVE A11,*A14+,0x1 +rom:00069848 SETF 0x8,0x0,0x0 +rom:0006984a MOVE *A10(0x8),A11,0x0 +rom:0006984e SLL 0x5,A11 +rom:00069850 ADDI 0xd3f90,A11 diff --git a/xie/ghidra-evidence/image_path/swapper_slot04_069864.txt b/xie/ghidra-evidence/image_path/swapper_slot04_069864.txt new file mode 100644 index 0000000..79755ef --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot04_069864.txt @@ -0,0 +1,19 @@ +rom:00069864 MMTM SP,0x74 +rom:00069868 MOVE A14,A13 +rom:0006986a MOVE *A13(0xffe0),A11,0x1 +rom:0006986e MOVE *A11(0x40),A10,0x1 +rom:00069872 MOVB *A10(0x10),*A9 +rom:00069876 MOVB *A10(0x18),*A10(0x10) +rom:0006987c MOVB *A9,*A10(0x18) +rom:00069880 MOVB *A10(0x20),*A9 +rom:00069884 MOVB *A10(0x38),*A10(0x20) +rom:0006988a MOVB *A9,*A10(0x38) +rom:0006988e MOVB *A10(0x28),*A9 +rom:00069892 MOVB *A10(0x30),*A10(0x28) +rom:00069898 MOVB *A9,*A10(0x30) +rom:0006989c MOVE A14,-*SP,0x1 +rom:0006989e MOVE A11,*A14+,0x1 +rom:000698a0 SETF 0x8,0x0,0x0 +rom:000698a2 MOVE *A10(0x8),A11,0x0 +rom:000698a6 SLL 0x5,A11 +rom:000698a8 ADDI 0xd3f90,A11 diff --git a/xie/ghidra-evidence/image_path/swapper_slot05_0698BC.txt b/xie/ghidra-evidence/image_path/swapper_slot05_0698BC.txt new file mode 100644 index 0000000..e5e162f --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot05_0698BC.txt @@ -0,0 +1,20 @@ +rom:000698bc MMTM SP,0x174 +rom:000698c0 MOVE A14,A13 +rom:000698c2 MOVE *A13(0xffe0),A11,0x1 +rom:000698c6 MOVE *A11(0x40),A10,0x1 +rom:000698ca MOVB *A10(0x10),*A9 +rom:000698ce MOVB *A10(0x18),*A10(0x10) +rom:000698d4 MOVB *A9,*A10(0x18) +rom:000698d8 MOVE A14,-*SP,0x1 +rom:000698da MOVK 0x3,A7 +rom:000698dc MOVE A7,*A14+,0x1 +rom:000698de MOVE A10,A7 +rom:000698e0 ADDI 0x40,A7 +rom:000698e4 MOVE A7,*A14+,0x1 +rom:000698e6 CALLA 0x07f1b4d8 +rom:000698ec MOVE A14,-*SP,0x1 +rom:000698ee MOVE A11,*A14+,0x1 +rom:000698f0 SETF 0x8,0x0,0x0 +rom:000698f2 MOVE *A10(0x8),A7,0x0 +rom:000698f6 SLL 0x5,A7 +rom:000698f8 ADDI 0xd3f90,A7 diff --git a/xie/ghidra-evidence/image_path/swapper_slot07_06990C.txt b/xie/ghidra-evidence/image_path/swapper_slot07_06990C.txt new file mode 100644 index 0000000..bd29b98 --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot07_06990C.txt @@ -0,0 +1,31 @@ +rom:0006990c MMTM SP,0x174 +rom:00069910 MOVE A14,A13 +rom:00069912 MOVE *A13(0xffe0),A9,0x1 +rom:00069916 MOVE *A9(0x40),A11,0x1 +rom:0006991a MOVB *A11(0x10),*A10 +rom:0006991e MOVB *A11(0x18),*A11(0x10) +rom:00069924 MOVB *A10,*A11(0x18) +rom:00069928 MOVB *A11(0x20),*A10 +rom:0006992c MOVB *A11(0x38),*A11(0x20) +rom:00069932 MOVB *A10,*A11(0x38) +rom:00069936 MOVB *A11(0x28),*A10 +rom:0006993a MOVB *A11(0x30),*A11(0x28) +rom:00069940 MOVB *A10,*A11(0x30) +rom:00069944 MOVB *A11(0x40),*A10 +rom:00069948 MOVB *A11(0x58),*A11(0x40) +rom:0006994e MOVB *A10,*A11(0x58) +rom:00069952 MOVB *A11(0x48),*A10 +rom:00069956 MOVB *A11(0x50),*A11(0x48) +rom:0006995c MOVB *A10,*A11(0x50) +rom:00069960 MOVB *A11(0x60),*A10 +rom:00069964 MOVB *A11(0x78),*A11(0x60) +rom:0006996a MOVB *A10,*A11(0x78) +rom:0006996e MOVB *A11(0x68),*A10 +rom:00069972 MOVB *A11(0x70),*A11(0x68) +rom:00069978 MOVB *A10,*A11(0x70) +rom:0006997c MOVE A14,-*SP,0x1 +rom:0006997e MOVE A9,*A14+,0x1 +rom:00069980 SETF 0x8,0x0,0x0 +rom:00069982 MOVE *A11(0x8),A7,0x0 +rom:00069986 SLL 0x5,A7 +rom:00069988 ADDI 0xd3f90,A7 diff --git a/xie/ghidra-evidence/image_path/swapper_slot08_06999C.txt b/xie/ghidra-evidence/image_path/swapper_slot08_06999C.txt new file mode 100644 index 0000000..9bc7f78 --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot08_06999C.txt @@ -0,0 +1,143 @@ +rom:0006999c MMTM SP,0x574 +rom:000699a0 MOVE A14,A13 +rom:000699a2 MOVE *A13(0xffe0),A11,0x1 +rom:000699a6 MOVE *A11(0x40),A10,0x1 +rom:000699aa MOVB *A10(0x10),*A9 +rom:000699ae MOVB *A10(0x18),*A10(0x10) +rom:000699b4 MOVB *A9,*A10(0x18) +rom:000699b8 MOVB *A10(0x20),*A9 +rom:000699bc MOVB *A10(0x38),*A10(0x20) +rom:000699c2 MOVB *A9,*A10(0x38) +rom:000699c6 MOVB *A10(0x28),*A9 +rom:000699ca MOVB *A10(0x30),*A10(0x28) +rom:000699d0 MOVB *A9,*A10(0x30) +rom:000699d4 MOVB *A10(0x40),*A9 +rom:000699d8 MOVB *A10(0x58),*A10(0x40) +rom:000699de MOVB *A9,*A10(0x58) +rom:000699e2 MOVB *A10(0x48),*A9 +rom:000699e6 MOVB *A10(0x50),*A10(0x48) +rom:000699ec MOVB *A9,*A10(0x50) +rom:000699f0 JR 0x00069bc2 +rom:000699f4 MOVE *A13(0xffe0),A7,0x1 +rom:000699f8 MOVE *A7(0x40),A11,0x1 +rom:000699fc MOVB *A11(0x60),*A9 +rom:00069a00 MOVB *A11(0x78),*A11(0x60) +rom:00069a06 MOVB *A9,*A11(0x78) +rom:00069a0a MOVB *A11(0x68),*A9 +rom:00069a0e MOVB *A11(0x70),*A11(0x68) +rom:00069a14 MOVB *A9,*A11(0x70) +rom:00069a18 MOVB *A11(0x80),*A9 +rom:00069a1c MOVB *A11(0x98),*A11(0x80) +rom:00069a22 MOVB *A9,*A11(0x98) +rom:00069a26 MOVB *A11(0x88),*A9 +rom:00069a2a MOVB *A11(0x90),*A11(0x88) +rom:00069a30 MOVB *A9,*A11(0x90) +rom:00069a34 MOVB *A11(0xa0),*A9 +rom:00069a38 MOVB *A11(0xb8),*A11(0xa0) +rom:00069a3e MOVB *A9,*A11(0xb8) +rom:00069a42 MOVB *A11(0xa8),*A9 +rom:00069a46 MOVB *A11(0xb0),*A11(0xa8) +rom:00069a4c MOVB *A9,*A11(0xb0) +rom:00069a50 JR 0x00069be2 +rom:00069a54 MOVE *A13(0xffe0),A7,0x1 +rom:00069a58 MOVE *A7(0x40),A11,0x1 +rom:00069a5c MOVB *A11(0x60),*A9 +rom:00069a60 MOVB *A11(0x78),*A11(0x60) +rom:00069a66 MOVB *A9,*A11(0x78) +rom:00069a6a MOVB *A11(0x68),*A9 +rom:00069a6e MOVB *A11(0x70),*A11(0x68) +rom:00069a74 MOVB *A9,*A11(0x70) +rom:00069a78 MOVB *A11(0x80),*A9 +rom:00069a7c MOVB *A11(0x98),*A11(0x80) +rom:00069a82 MOVB *A9,*A11(0x98) +rom:00069a86 MOVB *A11(0x88),*A9 +rom:00069a8a MOVB *A11(0x90),*A11(0x88) +rom:00069a90 MOVB *A9,*A11(0x90) +rom:00069a94 MOVB *A11(0xb0),*A9 +rom:00069a98 MOVB *A11(0xb8),*A11(0xb0) +rom:00069a9e MOVB *A9,*A11(0xb8) +rom:00069aa2 MOVB *A11(0xc0),*A9 +rom:00069aa6 MOVB *A11(0xd8),*A11(0xc0) +rom:00069aac MOVB *A9,*A11(0xd8) +rom:00069ab0 MOVB *A11(0xc8),*A9 +rom:00069ab4 MOVB *A11(0xd0),*A11(0xc8) +rom:00069aba MOVB *A9,*A11(0xd0) +rom:00069abe MOVE A14,-*SP,0x1 +rom:00069ac0 MOVK 0x3,A5 +rom:00069ac2 MOVE A5,*A14+,0x1 +rom:00069ac4 MOVE A11,A5 +rom:00069ac6 ADDI 0xe0,A5 +rom:00069aca MOVE A5,*A14+,0x1 +rom:00069acc CALLA 0x07f1b4d8 +rom:00069ad2 JR 0x00069be2 +rom:00069ad6 MOVE *A13(0xffe0),A7,0x1 +rom:00069ada MOVE *A7(0x40),A11,0x1 +rom:00069ade MOVB *A11(0x60),*A9 +rom:00069ae2 MOVB *A11(0x78),*A11(0x60) +rom:00069ae8 MOVB *A9,*A11(0x78) +rom:00069aec MOVB *A11(0x68),*A9 +rom:00069af0 MOVB *A11(0x70),*A11(0x68) +rom:00069af6 MOVB *A9,*A11(0x70) +rom:00069afa MOVB *A11(0x80),*A9 +rom:00069afe MOVB *A11(0x98),*A11(0x80) +rom:00069b04 MOVB *A9,*A11(0x98) +rom:00069b08 MOVB *A11(0x88),*A9 +rom:00069b0c MOVB *A11(0x90),*A11(0x88) +rom:00069b12 MOVB *A9,*A11(0x90) +rom:00069b16 MOVB *A11(0xa0),*A9 +rom:00069b1a MOVB *A11(0xb8),*A11(0xa0) +rom:00069b20 MOVB *A9,*A11(0xb8) +rom:00069b24 MOVB *A11(0xa8),*A9 +rom:00069b28 MOVB *A11(0xb0),*A11(0xa8) +rom:00069b2e MOVB *A9,*A11(0xb0) +rom:00069b32 MOVB *A11(0xc0),*A9 +rom:00069b36 MOVB *A11(0xd8),*A11(0xc0) +rom:00069b3c MOVB *A9,*A11(0xd8) +rom:00069b40 MOVB *A11(0xc8),*A9 +rom:00069b44 MOVB *A11(0xd0),*A11(0xc8) +rom:00069b4a MOVB *A9,*A11(0xd0) +rom:00069b4e JR 0x00069be2 +rom:00069b50 MOVE *A13(0xffe0),A7,0x1 +rom:00069b54 MOVE *A7(0x40),A11,0x1 +rom:00069b58 MOVB *A11(0x60),*A9 +rom:00069b5c MOVB *A11(0x78),*A11(0x60) +rom:00069b62 MOVB *A9,*A11(0x78) +rom:00069b66 MOVB *A11(0x68),*A9 +rom:00069b6a MOVB *A11(0x70),*A11(0x68) +rom:00069b70 MOVB *A9,*A11(0x70) +rom:00069b74 MOVB *A11(0x80),*A9 +rom:00069b78 MOVB *A11(0x98),*A11(0x80) +rom:00069b7e MOVB *A9,*A11(0x98) +rom:00069b82 MOVB *A11(0x88),*A9 +rom:00069b86 MOVB *A11(0x90),*A11(0x88) +rom:00069b8c MOVB *A9,*A11(0x90) +rom:00069b90 MOVB *A11(0xa0),*A9 +rom:00069b94 MOVB *A11(0xb8),*A11(0xa0) +rom:00069b9a MOVB *A9,*A11(0xb8) +rom:00069b9e MOVB *A11(0xa8),*A9 +rom:00069ba2 MOVB *A11(0xb0),*A11(0xa8) +rom:00069ba8 MOVB *A9,*A11(0xb0) +rom:00069bac MOVE A14,-*SP,0x1 +rom:00069bae MOVE *A11(0xa0),*A14+,0x1 +rom:00069bb2 MOVE A11,A5 +rom:00069bb4 ADDI 0xc0,A5 +rom:00069bb8 MOVE A5,*A14+,0x1 +rom:00069bba CALLA 0x07ea9680 +rom:00069bc0 JR 0x00069be2 +rom:00069bc2 MOVE *A10(0x20),A8,0x1 +rom:00069bc6 DEC A8 +rom:00069bc8 JREQ 0x00069a54 +rom:00069bcc DEC A8 +rom:00069bce JREQ 0x00069a54 +rom:00069bd2 SUBK 0x2,A8 +rom:00069bd4 JREQ 0x000699f4 +rom:00069bd8 DEC A8 +rom:00069bda JREQ 0x00069ad6 +rom:00069bde DEC A8 +rom:00069be0 JREQ 0x00069b50 +rom:00069be2 MOVE A14,-*SP,0x1 +rom:00069be4 MOVE *A13(0xffe0),*A14+,0x1 +rom:00069be8 SETF 0x8,0x0,0x0 +rom:00069bea MOVE *A10(0x8),A11,0x0 +rom:00069bee SLL 0x5,A11 +rom:00069bf0 ADDI 0xd3f90,A11 diff --git a/xie/ghidra-evidence/image_path/swapper_slot09_069740.txt b/xie/ghidra-evidence/image_path/swapper_slot09_069740.txt new file mode 100644 index 0000000..9eed3f6 --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot09_069740.txt @@ -0,0 +1,25 @@ +rom:00069740 MMTM SP,0x174 +rom:00069744 MOVE A14,A13 +rom:00069746 MOVE *A13(0xffe0),A9,0x1 +rom:0006974a MOVE *A9(0x40),A11,0x1 +rom:0006974e MOVB *A11(0x10),*A10 +rom:00069752 MOVB *A11(0x18),*A11(0x10) +rom:00069758 MOVB *A10,*A11(0x18) +rom:0006975c MOVB *A11(0x20),*A10 +rom:00069760 MOVB *A11(0x38),*A11(0x20) +rom:00069766 MOVB *A10,*A11(0x38) +rom:0006976a MOVB *A11(0x28),*A10 +rom:0006976e MOVB *A11(0x30),*A11(0x28) +rom:00069774 MOVB *A10,*A11(0x30) +rom:00069778 MOVB *A11(0x40),*A10 +rom:0006977c MOVB *A11(0x58),*A11(0x40) +rom:00069782 MOVB *A10,*A11(0x58) +rom:00069786 MOVB *A11(0x48),*A10 +rom:0006978a MOVB *A11(0x50),*A11(0x48) +rom:00069790 MOVB *A10,*A11(0x50) +rom:00069794 MOVE A14,-*SP,0x1 +rom:00069796 MOVE A9,*A14+,0x1 +rom:00069798 SETF 0x8,0x0,0x0 +rom:0006979a MOVE *A11(0x8),A7,0x0 +rom:0006979e SLL 0x5,A7 +rom:000697a0 ADDI 0xd3f90,A7 diff --git a/xie/ghidra-evidence/image_path/swapper_slot11_069C04.txt b/xie/ghidra-evidence/image_path/swapper_slot11_069C04.txt new file mode 100644 index 0000000..9071f25 --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot11_069C04.txt @@ -0,0 +1,25 @@ +rom:00069c04 MMTM SP,0x74 +rom:00069c08 MOVE A14,A13 +rom:00069c0a MOVE *A13(0xffe0),A11,0x1 +rom:00069c0e MOVE *A11(0x40),A10,0x1 +rom:00069c12 MOVB *A10(0x10),*A9 +rom:00069c16 MOVB *A10(0x18),*A10(0x10) +rom:00069c1c MOVB *A9,*A10(0x18) +rom:00069c20 MOVB *A10(0x20),*A9 +rom:00069c24 MOVB *A10(0x38),*A10(0x20) +rom:00069c2a MOVB *A9,*A10(0x38) +rom:00069c2e MOVB *A10(0x28),*A9 +rom:00069c32 MOVB *A10(0x30),*A10(0x28) +rom:00069c38 MOVB *A9,*A10(0x30) +rom:00069c3c MOVB *A10(0x40),*A9 +rom:00069c40 MOVB *A10(0x58),*A10(0x40) +rom:00069c46 MOVB *A9,*A10(0x58) +rom:00069c4a MOVB *A10(0x48),*A9 +rom:00069c4e MOVB *A10(0x50),*A10(0x48) +rom:00069c54 MOVB *A9,*A10(0x50) +rom:00069c58 MOVE A14,-*SP,0x1 +rom:00069c5a MOVE A11,*A14+,0x1 +rom:00069c5c SETF 0x8,0x0,0x0 +rom:00069c5e MOVE *A10(0x8),A11,0x0 +rom:00069c62 SLL 0x5,A11 +rom:00069c64 ADDI 0xd3f90,A11 diff --git a/xie/ghidra-evidence/image_path/swapper_slot12_069C78.txt b/xie/ghidra-evidence/image_path/swapper_slot12_069C78.txt new file mode 100644 index 0000000..3ba0538 --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot12_069C78.txt @@ -0,0 +1,19 @@ +rom:00069c78 MMTM SP,0x74 +rom:00069c7c MOVE A14,A13 +rom:00069c7e MOVE *A13(0xffe0),A11,0x1 +rom:00069c82 MOVE *A11(0x40),A10,0x1 +rom:00069c86 MOVB *A10(0x10),*A9 +rom:00069c8a MOVB *A10(0x18),*A10(0x10) +rom:00069c90 MOVB *A9,*A10(0x18) +rom:00069c94 MOVB *A10(0x20),*A9 +rom:00069c98 MOVB *A10(0x38),*A10(0x20) +rom:00069c9e MOVB *A9,*A10(0x38) +rom:00069ca2 MOVB *A10(0x28),*A9 +rom:00069ca6 MOVB *A10(0x30),*A10(0x28) +rom:00069cac MOVB *A9,*A10(0x30) +rom:00069cb0 MOVE A14,-*SP,0x1 +rom:00069cb2 MOVE A11,*A14+,0x1 +rom:00069cb4 SETF 0x8,0x0,0x0 +rom:00069cb6 MOVE *A10(0x8),A11,0x0 +rom:00069cba SLL 0x5,A11 +rom:00069cbc ADDI 0xd3f90,A11 diff --git a/xie/ghidra-evidence/image_path/swapper_slot13_069CD0.txt b/xie/ghidra-evidence/image_path/swapper_slot13_069CD0.txt new file mode 100644 index 0000000..ff118b5 --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot13_069CD0.txt @@ -0,0 +1,19 @@ +rom:00069cd0 MMTM SP,0x74 +rom:00069cd4 MOVE A14,A13 +rom:00069cd6 MOVE *A13(0xffe0),A11,0x1 +rom:00069cda MOVE *A11(0x40),A10,0x1 +rom:00069cde MOVB *A10(0x10),*A9 +rom:00069ce2 MOVB *A10(0x18),*A10(0x10) +rom:00069ce8 MOVB *A9,*A10(0x18) +rom:00069cec MOVB *A10(0x20),*A9 +rom:00069cf0 MOVB *A10(0x38),*A10(0x20) +rom:00069cf6 MOVB *A9,*A10(0x38) +rom:00069cfa MOVB *A10(0x28),*A9 +rom:00069cfe MOVB *A10(0x30),*A10(0x28) +rom:00069d04 MOVB *A9,*A10(0x30) +rom:00069d08 MOVE A14,-*SP,0x1 +rom:00069d0a MOVE A11,*A14+,0x1 +rom:00069d0c SETF 0x8,0x0,0x0 +rom:00069d0e MOVE *A10(0x8),A11,0x0 +rom:00069d12 SLL 0x5,A11 +rom:00069d14 ADDI 0xd3f90,A11 diff --git a/xie/ghidra-evidence/image_path/swapper_slot14_069D28.txt b/xie/ghidra-evidence/image_path/swapper_slot14_069D28.txt new file mode 100644 index 0000000..be97f01 --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot14_069D28.txt @@ -0,0 +1,25 @@ +rom:00069d28 MMTM SP,0x74 +rom:00069d2c MOVE A14,A13 +rom:00069d2e MOVE *A13(0xffe0),A11,0x1 +rom:00069d32 MOVE *A11(0x40),A10,0x1 +rom:00069d36 MOVB *A10(0x10),*A9 +rom:00069d3a MOVB *A10(0x18),*A10(0x10) +rom:00069d40 MOVB *A9,*A10(0x18) +rom:00069d44 MOVB *A10(0x20),*A9 +rom:00069d48 MOVB *A10(0x38),*A10(0x20) +rom:00069d4e MOVB *A9,*A10(0x38) +rom:00069d52 MOVB *A10(0x28),*A9 +rom:00069d56 MOVB *A10(0x30),*A10(0x28) +rom:00069d5c MOVB *A9,*A10(0x30) +rom:00069d60 MOVB *A10(0x40),*A9 +rom:00069d64 MOVB *A10(0x58),*A10(0x40) +rom:00069d6a MOVB *A9,*A10(0x58) +rom:00069d6e MOVB *A10(0x48),*A9 +rom:00069d72 MOVB *A10(0x50),*A10(0x48) +rom:00069d78 MOVB *A9,*A10(0x50) +rom:00069d7c MOVE A14,-*SP,0x1 +rom:00069d7e MOVE A11,*A14+,0x1 +rom:00069d80 SETF 0x8,0x0,0x0 +rom:00069d82 MOVE *A10(0x8),A11,0x0 +rom:00069d86 SLL 0x5,A11 +rom:00069d88 ADDI 0xd3f90,A11 diff --git a/xie/ghidra-evidence/image_path/swapper_slot15_069D9C.txt b/xie/ghidra-evidence/image_path/swapper_slot15_069D9C.txt new file mode 100644 index 0000000..6e8b7d9 --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot15_069D9C.txt @@ -0,0 +1,25 @@ +rom:00069d9c MMTM SP,0x74 +rom:00069da0 MOVE A14,A13 +rom:00069da2 MOVE *A13(0xffe0),A11,0x1 +rom:00069da6 MOVE *A11(0x40),A10,0x1 +rom:00069daa MOVB *A10(0x10),*A9 +rom:00069dae MOVB *A10(0x18),*A10(0x10) +rom:00069db4 MOVB *A9,*A10(0x18) +rom:00069db8 MOVB *A10(0x20),*A9 +rom:00069dbc MOVB *A10(0x38),*A10(0x20) +rom:00069dc2 MOVB *A9,*A10(0x38) +rom:00069dc6 MOVB *A10(0x28),*A9 +rom:00069dca MOVB *A10(0x30),*A10(0x28) +rom:00069dd0 MOVB *A9,*A10(0x30) +rom:00069dd4 MOVB *A10(0x40),*A9 +rom:00069dd8 MOVB *A10(0x58),*A10(0x40) +rom:00069dde MOVB *A9,*A10(0x58) +rom:00069de2 MOVB *A10(0x48),*A9 +rom:00069de6 MOVB *A10(0x50),*A10(0x48) +rom:00069dec MOVB *A9,*A10(0x50) +rom:00069df0 MOVE A14,-*SP,0x1 +rom:00069df2 MOVE A11,*A14+,0x1 +rom:00069df4 SETF 0x8,0x0,0x0 +rom:00069df6 MOVE *A10(0x8),A11,0x0 +rom:00069dfa SLL 0x5,A11 +rom:00069dfc ADDI 0xd3f90,A11 diff --git a/xie/ghidra-evidence/image_path/swapper_slot18_069E10.txt b/xie/ghidra-evidence/image_path/swapper_slot18_069E10.txt new file mode 100644 index 0000000..9ef51c0 --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot18_069E10.txt @@ -0,0 +1,25 @@ +rom:00069e10 MMTM SP,0x74 +rom:00069e14 MOVE A14,A13 +rom:00069e16 MOVE *A13(0xffe0),A11,0x1 +rom:00069e1a MOVE *A11(0x40),A10,0x1 +rom:00069e1e MOVB *A10(0x10),*A9 +rom:00069e22 MOVB *A10(0x18),*A10(0x10) +rom:00069e28 MOVB *A9,*A10(0x18) +rom:00069e2c MOVB *A10(0x20),*A9 +rom:00069e30 MOVB *A10(0x38),*A10(0x20) +rom:00069e36 MOVB *A9,*A10(0x38) +rom:00069e3a MOVB *A10(0x28),*A9 +rom:00069e3e MOVB *A10(0x30),*A10(0x28) +rom:00069e44 MOVB *A9,*A10(0x30) +rom:00069e48 MOVB *A10(0x40),*A9 +rom:00069e4c MOVB *A10(0x58),*A10(0x40) +rom:00069e52 MOVB *A9,*A10(0x58) +rom:00069e56 MOVB *A10(0x48),*A9 +rom:00069e5a MOVB *A10(0x50),*A10(0x48) +rom:00069e60 MOVB *A9,*A10(0x50) +rom:00069e64 MOVE A14,-*SP,0x1 +rom:00069e66 MOVE A11,*A14+,0x1 +rom:00069e68 SETF 0x8,0x0,0x0 +rom:00069e6a MOVE *A10(0x8),A11,0x0 +rom:00069e6e SLL 0x5,A11 +rom:00069e70 ADDI 0xd3f90,A11 diff --git a/xie/ghidra-evidence/image_path/swapper_slot19_069E84.txt b/xie/ghidra-evidence/image_path/swapper_slot19_069E84.txt new file mode 100644 index 0000000..c160737 --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot19_069E84.txt @@ -0,0 +1,49 @@ +rom:00069e84 MMTM SP,0x74 +rom:00069e88 MOVE A14,A13 +rom:00069e8a MOVE *A13(0xffe0),A11,0x1 +rom:00069e8e MOVE *A11(0x40),A10,0x1 +rom:00069e92 MOVB *A10(0x10),*A9 +rom:00069e96 MOVB *A10(0x18),*A10(0x10) +rom:00069e9c MOVB *A9,*A10(0x18) +rom:00069ea0 MOVB *A10(0x20),*A9 +rom:00069ea4 MOVB *A10(0x38),*A10(0x20) +rom:00069eaa MOVB *A9,*A10(0x38) +rom:00069eae MOVB *A10(0x28),*A9 +rom:00069eb2 MOVB *A10(0x30),*A10(0x28) +rom:00069eb8 MOVB *A9,*A10(0x30) +rom:00069ebc MOVB *A10(0x40),*A9 +rom:00069ec0 MOVB *A10(0x58),*A10(0x40) +rom:00069ec6 MOVB *A9,*A10(0x58) +rom:00069eca MOVB *A10(0x48),*A9 +rom:00069ece MOVB *A10(0x50),*A10(0x48) +rom:00069ed4 MOVB *A9,*A10(0x50) +rom:00069ed8 MOVB *A10(0x60),*A9 +rom:00069edc MOVB *A10(0x78),*A10(0x60) +rom:00069ee2 MOVB *A9,*A10(0x78) +rom:00069ee6 MOVB *A10(0x68),*A9 +rom:00069eea MOVB *A10(0x70),*A10(0x68) +rom:00069ef0 MOVB *A9,*A10(0x70) +rom:00069ef4 MOVB *A10(0x80),*A9 +rom:00069ef8 MOVB *A10(0x98),*A10(0x80) +rom:00069efe MOVB *A9,*A10(0x98) +rom:00069f02 MOVB *A10(0x88),*A9 +rom:00069f06 MOVB *A10(0x90),*A10(0x88) +rom:00069f0c MOVB *A9,*A10(0x90) +rom:00069f10 MOVB *A10(0xa0),*A9 +rom:00069f14 MOVB *A10(0xb8),*A10(0xa0) +rom:00069f1a MOVB *A9,*A10(0xb8) +rom:00069f1e MOVB *A10(0xa8),*A9 +rom:00069f22 MOVB *A10(0xb0),*A10(0xa8) +rom:00069f28 MOVB *A9,*A10(0xb0) +rom:00069f2c MOVB *A10(0xc0),*A9 +rom:00069f30 MOVB *A10(0xd8),*A10(0xc0) +rom:00069f36 MOVB *A9,*A10(0xd8) +rom:00069f3a MOVB *A10(0xc8),*A9 +rom:00069f3e MOVB *A10(0xd0),*A10(0xc8) +rom:00069f44 MOVB *A9,*A10(0xd0) +rom:00069f48 MOVE A14,-*SP,0x1 +rom:00069f4a MOVE A11,*A14+,0x1 +rom:00069f4c SETF 0x8,0x0,0x0 +rom:00069f4e MOVE *A10(0x8),A11,0x0 +rom:00069f52 SLL 0x5,A11 +rom:00069f54 ADDI 0xd3f90,A11 diff --git a/xie/ghidra-evidence/image_path/swapper_slot20_069F68.txt b/xie/ghidra-evidence/image_path/swapper_slot20_069F68.txt new file mode 100644 index 0000000..e67ebfe --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot20_069F68.txt @@ -0,0 +1,38 @@ +rom:00069f68 MMTM SP,0x174 +rom:00069f6c MOVE A14,A13 +rom:00069f6e MOVE *A13(0xffe0),A11,0x1 +rom:00069f72 MOVE *A11(0x40),A10,0x1 +rom:00069f76 MOVB *A10(0x10),*A9 +rom:00069f7a MOVB *A10(0x18),*A10(0x10) +rom:00069f80 MOVB *A9,*A10(0x18) +rom:00069f84 MOVB *A10(0x20),*A9 +rom:00069f88 MOVB *A10(0x38),*A10(0x20) +rom:00069f8e MOVB *A9,*A10(0x38) +rom:00069f92 MOVB *A10(0x28),*A9 +rom:00069f96 MOVB *A10(0x30),*A10(0x28) +rom:00069f9c MOVB *A9,*A10(0x30) +rom:00069fa0 MOVB *A10(0x40),*A9 +rom:00069fa4 MOVB *A10(0x58),*A10(0x40) +rom:00069faa MOVB *A9,*A10(0x58) +rom:00069fae MOVB *A10(0x48),*A9 +rom:00069fb2 MOVB *A10(0x50),*A10(0x48) +rom:00069fb8 MOVB *A9,*A10(0x50) +rom:00069fbc MOVB *A10(0x80),*A9 +rom:00069fc0 MOVB *A10(0x98),*A10(0x80) +rom:00069fc6 MOVB *A9,*A10(0x98) +rom:00069fca MOVB *A10(0x88),*A9 +rom:00069fce MOVB *A10(0x90),*A10(0x88) +rom:00069fd4 MOVB *A9,*A10(0x90) +rom:00069fd8 MOVE A14,-*SP,0x1 +rom:00069fda MOVK 0x18,A7 +rom:00069fdc MOVE A7,*A14+,0x1 +rom:00069fde MOVE A10,A7 +rom:00069fe0 ADDI 0x160,A7 +rom:00069fe4 MOVE A7,*A14+,0x1 +rom:00069fe6 CALLA 0x07f1b4d8 +rom:00069fec MOVE A14,-*SP,0x1 +rom:00069fee MOVE A11,*A14+,0x1 +rom:00069ff0 SETF 0x8,0x0,0x0 +rom:00069ff2 MOVE *A10(0x8),A7,0x0 +rom:00069ff6 SLL 0x5,A7 +rom:00069ff8 ADDI 0xd3f90,A7 diff --git a/xie/ghidra-evidence/image_path/swapper_slot21_06A00C.txt b/xie/ghidra-evidence/image_path/swapper_slot21_06A00C.txt new file mode 100644 index 0000000..87d1e8d --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot21_06A00C.txt @@ -0,0 +1,97 @@ +rom:0006a00c MMTM SP,0x74 +rom:0006a010 MOVE A14,A13 +rom:0006a012 MOVE *A13(0xffe0),A11,0x1 +rom:0006a016 MOVE *A11(0x40),A10,0x1 +rom:0006a01a MOVB *A10(0x10),*A9 +rom:0006a01e MOVB *A10(0x18),*A10(0x10) +rom:0006a024 MOVB *A9,*A10(0x18) +rom:0006a028 MOVB *A10(0x20),*A9 +rom:0006a02c MOVB *A10(0x38),*A10(0x20) +rom:0006a032 MOVB *A9,*A10(0x38) +rom:0006a036 MOVB *A10(0x28),*A9 +rom:0006a03a MOVB *A10(0x30),*A10(0x28) +rom:0006a040 MOVB *A9,*A10(0x30) +rom:0006a044 MOVB *A10(0x40),*A9 +rom:0006a048 MOVB *A10(0x58),*A10(0x40) +rom:0006a04e MOVB *A9,*A10(0x58) +rom:0006a052 MOVB *A10(0x48),*A9 +rom:0006a056 MOVB *A10(0x50),*A10(0x48) +rom:0006a05c MOVB *A9,*A10(0x50) +rom:0006a060 MOVB *A10(0x60),*A9 +rom:0006a064 MOVB *A10(0x78),*A10(0x60) +rom:0006a06a MOVB *A9,*A10(0x78) +rom:0006a06e MOVB *A10(0x68),*A9 +rom:0006a072 MOVB *A10(0x70),*A10(0x68) +rom:0006a078 MOVB *A9,*A10(0x70) +rom:0006a07c MOVB *A10(0x80),*A9 +rom:0006a080 MOVB *A10(0x98),*A10(0x80) +rom:0006a086 MOVB *A9,*A10(0x98) +rom:0006a08a MOVB *A10(0x88),*A9 +rom:0006a08e MOVB *A10(0x90),*A10(0x88) +rom:0006a094 MOVB *A9,*A10(0x90) +rom:0006a098 MOVB *A10(0xa0),*A9 +rom:0006a09c MOVB *A10(0xb8),*A10(0xa0) +rom:0006a0a2 MOVB *A9,*A10(0xb8) +rom:0006a0a6 MOVB *A10(0xa8),*A9 +rom:0006a0aa MOVB *A10(0xb0),*A10(0xa8) +rom:0006a0b0 MOVB *A9,*A10(0xb0) +rom:0006a0b4 MOVB *A10(0xc0),*A9 +rom:0006a0b8 MOVB *A10(0xd8),*A10(0xc0) +rom:0006a0be MOVB *A9,*A10(0xd8) +rom:0006a0c2 MOVB *A10(0xc8),*A9 +rom:0006a0c6 MOVB *A10(0xd0),*A10(0xc8) +rom:0006a0cc MOVB *A9,*A10(0xd0) +rom:0006a0d0 MOVB *A10(0xe0),*A9 +rom:0006a0d4 MOVB *A10(0xf8),*A10(0xe0) +rom:0006a0da MOVB *A9,*A10(0xf8) +rom:0006a0de MOVB *A10(0xe8),*A9 +rom:0006a0e2 MOVB *A10(0xf0),*A10(0xe8) +rom:0006a0e8 MOVB *A9,*A10(0xf0) +rom:0006a0ec MOVB *A10(0x100),*A9 +rom:0006a0f0 MOVB *A10(0x118),*A10(0x100) +rom:0006a0f6 MOVB *A9,*A10(0x118) +rom:0006a0fa MOVB *A10(0x108),*A9 +rom:0006a0fe MOVB *A10(0x110),*A10(0x108) +rom:0006a104 MOVB *A9,*A10(0x110) +rom:0006a108 MOVB *A10(0x120),*A9 +rom:0006a10c MOVB *A10(0x138),*A10(0x120) +rom:0006a112 MOVB *A9,*A10(0x138) +rom:0006a116 MOVB *A10(0x128),*A9 +rom:0006a11a MOVB *A10(0x130),*A10(0x128) +rom:0006a120 MOVB *A9,*A10(0x130) +rom:0006a124 MOVB *A10(0x140),*A9 +rom:0006a128 MOVB *A10(0x158),*A10(0x140) +rom:0006a12e MOVB *A9,*A10(0x158) +rom:0006a132 MOVB *A10(0x148),*A9 +rom:0006a136 MOVB *A10(0x150),*A10(0x148) +rom:0006a13c MOVB *A9,*A10(0x150) +rom:0006a140 MOVB *A10(0x160),*A9 +rom:0006a144 MOVB *A10(0x178),*A10(0x160) +rom:0006a14a MOVB *A9,*A10(0x178) +rom:0006a14e MOVB *A10(0x168),*A9 +rom:0006a152 MOVB *A10(0x170),*A10(0x168) +rom:0006a158 MOVB *A9,*A10(0x170) +rom:0006a15c MOVB *A10(0x190),*A9 +rom:0006a160 MOVB *A10(0x198),*A10(0x190) +rom:0006a166 MOVB *A9,*A10(0x198) +rom:0006a16a MOVB *A10(0x1a0),*A9 +rom:0006a16e MOVB *A10(0x1b8),*A10(0x1a0) +rom:0006a174 MOVB *A9,*A10(0x1b8) +rom:0006a178 MOVB *A10(0x1a8),*A9 +rom:0006a17c MOVB *A10(0x1b0),*A10(0x1a8) +rom:0006a182 MOVB *A9,*A10(0x1b0) +rom:0006a186 MOVB *A10(0x1d0),*A9 +rom:0006a18a MOVB *A10(0x1d8),*A10(0x1d0) +rom:0006a190 MOVB *A9,*A10(0x1d8) +rom:0006a194 MOVB *A10(0x1e0),*A9 +rom:0006a198 MOVB *A10(0x1f8),*A10(0x1e0) +rom:0006a19e MOVB *A9,*A10(0x1f8) +rom:0006a1a2 MOVB *A10(0x1e8),*A9 +rom:0006a1a6 MOVB *A10(0x1f0),*A10(0x1e8) +rom:0006a1ac MOVB *A9,*A10(0x1f0) +rom:0006a1b0 MOVE A14,-*SP,0x1 +rom:0006a1b2 MOVE A11,*A14+,0x1 +rom:0006a1b4 SETF 0x8,0x0,0x0 +rom:0006a1b6 MOVE *A10(0x8),A11,0x0 +rom:0006a1ba SLL 0x5,A11 +rom:0006a1bc ADDI 0xd3f90,A11 diff --git a/xie/ghidra-evidence/image_path/swapper_slot22_06A1D0.txt b/xie/ghidra-evidence/image_path/swapper_slot22_06A1D0.txt new file mode 100644 index 0000000..3c37d5d --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot22_06A1D0.txt @@ -0,0 +1,19 @@ +rom:0006a1d0 MMTM SP,0x74 +rom:0006a1d4 MOVE A14,A13 +rom:0006a1d6 MOVE *A13(0xffe0),A11,0x1 +rom:0006a1da MOVE *A11(0x40),A10,0x1 +rom:0006a1de MOVB *A10(0x10),*A9 +rom:0006a1e2 MOVB *A10(0x18),*A10(0x10) +rom:0006a1e8 MOVB *A9,*A10(0x18) +rom:0006a1ec MOVB *A10(0x20),*A9 +rom:0006a1f0 MOVB *A10(0x38),*A10(0x20) +rom:0006a1f6 MOVB *A9,*A10(0x38) +rom:0006a1fa MOVB *A10(0x28),*A9 +rom:0006a1fe MOVB *A10(0x30),*A10(0x28) +rom:0006a204 MOVB *A9,*A10(0x30) +rom:0006a208 MOVE A14,-*SP,0x1 +rom:0006a20a MOVE A11,*A14+,0x1 +rom:0006a20c SETF 0x8,0x0,0x0 +rom:0006a20e MOVE *A10(0x8),A11,0x0 +rom:0006a212 SLL 0x5,A11 +rom:0006a214 ADDI 0xd3f90,A11 diff --git a/xie/ghidra-evidence/image_path/swapper_slot24_06A228.txt b/xie/ghidra-evidence/image_path/swapper_slot24_06A228.txt new file mode 100644 index 0000000..c7be306 --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot24_06A228.txt @@ -0,0 +1,25 @@ +rom:0006a228 MMTM SP,0x74 +rom:0006a22c MOVE A14,A13 +rom:0006a22e MOVE *A13(0xffe0),A11,0x1 +rom:0006a232 MOVE *A11(0x40),A10,0x1 +rom:0006a236 MOVB *A10(0x10),*A9 +rom:0006a23a MOVB *A10(0x18),*A10(0x10) +rom:0006a240 MOVB *A9,*A10(0x18) +rom:0006a244 MOVB *A10(0x20),*A9 +rom:0006a248 MOVB *A10(0x38),*A10(0x20) +rom:0006a24e MOVB *A9,*A10(0x38) +rom:0006a252 MOVB *A10(0x28),*A9 +rom:0006a256 MOVB *A10(0x30),*A10(0x28) +rom:0006a25c MOVB *A9,*A10(0x30) +rom:0006a260 MOVB *A10(0x40),*A9 +rom:0006a264 MOVB *A10(0x58),*A10(0x40) +rom:0006a26a MOVB *A9,*A10(0x58) +rom:0006a26e MOVB *A10(0x48),*A9 +rom:0006a272 MOVB *A10(0x50),*A10(0x48) +rom:0006a278 MOVB *A9,*A10(0x50) +rom:0006a27c MOVE A14,-*SP,0x1 +rom:0006a27e MOVE A11,*A14+,0x1 +rom:0006a280 SETF 0x8,0x0,0x0 +rom:0006a282 MOVE *A10(0x8),A11,0x0 +rom:0006a286 SLL 0x5,A11 +rom:0006a288 ADDI 0xd3f90,A11 diff --git a/xie/ghidra-evidence/image_path/swapper_slot33_06A29C.txt b/xie/ghidra-evidence/image_path/swapper_slot33_06A29C.txt new file mode 100644 index 0000000..92cee6c --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot33_06A29C.txt @@ -0,0 +1,31 @@ +rom:0006a29c MMTM SP,0x74 +rom:0006a2a0 MOVE A14,A13 +rom:0006a2a2 MOVE *A13(0xffe0),A11,0x1 +rom:0006a2a6 MOVE *A11(0x40),A10,0x1 +rom:0006a2aa MOVB *A10(0x10),*A9 +rom:0006a2ae MOVB *A10(0x18),*A10(0x10) +rom:0006a2b4 MOVB *A9,*A10(0x18) +rom:0006a2b8 MOVB *A10(0x20),*A9 +rom:0006a2bc MOVB *A10(0x38),*A10(0x20) +rom:0006a2c2 MOVB *A9,*A10(0x38) +rom:0006a2c6 MOVB *A10(0x28),*A9 +rom:0006a2ca MOVB *A10(0x30),*A10(0x28) +rom:0006a2d0 MOVB *A9,*A10(0x30) +rom:0006a2d4 MOVB *A10(0x40),*A9 +rom:0006a2d8 MOVB *A10(0x58),*A10(0x40) +rom:0006a2de MOVB *A9,*A10(0x58) +rom:0006a2e2 MOVB *A10(0x48),*A9 +rom:0006a2e6 MOVB *A10(0x50),*A10(0x48) +rom:0006a2ec MOVB *A9,*A10(0x50) +rom:0006a2f0 MOVB *A10(0x60),*A9 +rom:0006a2f4 MOVB *A10(0x78),*A10(0x60) +rom:0006a2fa MOVB *A9,*A10(0x78) +rom:0006a2fe MOVB *A10(0x68),*A9 +rom:0006a302 MOVB *A10(0x70),*A10(0x68) +rom:0006a308 MOVB *A9,*A10(0x70) +rom:0006a30c MOVE A14,-*SP,0x1 +rom:0006a30e MOVE A11,*A14+,0x1 +rom:0006a310 SETF 0x8,0x0,0x0 +rom:0006a312 MOVE *A10(0x8),A11,0x0 +rom:0006a316 SLL 0x5,A11 +rom:0006a318 ADDI 0xd3f90,A11 diff --git a/xie/ghidra-evidence/image_path/swapper_slot40_06A32C.txt b/xie/ghidra-evidence/image_path/swapper_slot40_06A32C.txt new file mode 100644 index 0000000..246008d --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot40_06A32C.txt @@ -0,0 +1,25 @@ +rom:0006a32c MMTM SP,0x74 +rom:0006a330 MOVE A14,A13 +rom:0006a332 MOVE *A13(0xffe0),A11,0x1 +rom:0006a336 MOVE *A11(0x40),A10,0x1 +rom:0006a33a MOVB *A10(0x10),*A9 +rom:0006a33e MOVB *A10(0x18),*A10(0x10) +rom:0006a344 MOVB *A9,*A10(0x18) +rom:0006a348 MOVB *A10(0x20),*A9 +rom:0006a34c MOVB *A10(0x38),*A10(0x20) +rom:0006a352 MOVB *A9,*A10(0x38) +rom:0006a356 MOVB *A10(0x28),*A9 +rom:0006a35a MOVB *A10(0x30),*A10(0x28) +rom:0006a360 MOVB *A9,*A10(0x30) +rom:0006a364 MOVB *A10(0x40),*A9 +rom:0006a368 MOVB *A10(0x58),*A10(0x40) +rom:0006a36e MOVB *A9,*A10(0x58) +rom:0006a372 MOVB *A10(0x48),*A9 +rom:0006a376 MOVB *A10(0x50),*A10(0x48) +rom:0006a37c MOVB *A9,*A10(0x50) +rom:0006a380 MOVE A14,-*SP,0x1 +rom:0006a382 MOVE A11,*A14+,0x1 +rom:0006a384 SETF 0x8,0x0,0x0 +rom:0006a386 MOVE *A10(0x8),A11,0x0 +rom:0006a38a SLL 0x5,A11 +rom:0006a38c ADDI 0xd3f90,A11 diff --git a/xie/ghidra-evidence/image_path/swapper_slot43_06A3A0.txt b/xie/ghidra-evidence/image_path/swapper_slot43_06A3A0.txt new file mode 100644 index 0000000..f798533 --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot43_06A3A0.txt @@ -0,0 +1,53 @@ +rom:0006a3a0 MMTM SP,0x174 +rom:0006a3a4 MOVE A14,A13 +rom:0006a3a6 MOVE *A13(0xffe0),A11,0x1 +rom:0006a3aa MOVE *A11(0x40),A10,0x1 +rom:0006a3ae MOVB *A10(0x10),*A9 +rom:0006a3b2 MOVB *A10(0x18),*A10(0x10) +rom:0006a3b8 MOVB *A9,*A10(0x18) +rom:0006a3bc MOVB *A10(0x20),*A9 +rom:0006a3c0 MOVB *A10(0x38),*A10(0x20) +rom:0006a3c6 MOVB *A9,*A10(0x38) +rom:0006a3ca MOVB *A10(0x28),*A9 +rom:0006a3ce MOVB *A10(0x30),*A10(0x28) +rom:0006a3d4 MOVB *A9,*A10(0x30) +rom:0006a3d8 MOVB *A10(0x40),*A9 +rom:0006a3dc MOVB *A10(0x58),*A10(0x40) +rom:0006a3e2 MOVB *A9,*A10(0x58) +rom:0006a3e6 MOVB *A10(0x48),*A9 +rom:0006a3ea MOVB *A10(0x50),*A10(0x48) +rom:0006a3f0 MOVB *A9,*A10(0x50) +rom:0006a3f4 MOVB *A10(0x70),*A9 +rom:0006a3f8 MOVB *A10(0x78),*A10(0x70) +rom:0006a3fe MOVB *A9,*A10(0x78) +rom:0006a402 MOVB *A10(0x80),*A9 +rom:0006a406 MOVB *A10(0x98),*A10(0x80) +rom:0006a40c MOVB *A9,*A10(0x98) +rom:0006a410 MOVB *A10(0x88),*A9 +rom:0006a414 MOVB *A10(0x90),*A10(0x88) +rom:0006a41a MOVB *A9,*A10(0x90) +rom:0006a41e MOVB *A10(0xa0),*A9 +rom:0006a422 MOVB *A10(0xb8),*A10(0xa0) +rom:0006a428 MOVB *A9,*A10(0xb8) +rom:0006a42c MOVB *A10(0xa8),*A9 +rom:0006a430 MOVB *A10(0xb0),*A10(0xa8) +rom:0006a436 MOVB *A9,*A10(0xb0) +rom:0006a43a MOVB *A10(0xc0),*A9 +rom:0006a43e MOVB *A10(0xd8),*A10(0xc0) +rom:0006a444 MOVB *A9,*A10(0xd8) +rom:0006a448 MOVB *A10(0xc8),*A9 +rom:0006a44c MOVB *A10(0xd0),*A10(0xc8) +rom:0006a452 MOVB *A9,*A10(0xd0) +rom:0006a456 MOVE A14,-*SP,0x1 +rom:0006a458 MOVK 0x3,A7 +rom:0006a45a MOVE A7,*A14+,0x1 +rom:0006a45c MOVE A10,A7 +rom:0006a45e ADDI 0xe0,A7 +rom:0006a462 MOVE A7,*A14+,0x1 +rom:0006a464 CALLA 0x07f1b4d8 +rom:0006a46a MOVE A14,-*SP,0x1 +rom:0006a46c MOVE A11,*A14+,0x1 +rom:0006a46e SETF 0x8,0x0,0x0 +rom:0006a470 MOVE *A10(0x8),A7,0x0 +rom:0006a474 SLL 0x5,A7 +rom:0006a476 ADDI 0xd3f90,A7 diff --git a/xie/ghidra-evidence/image_path/swapper_slot44_06A48A.txt b/xie/ghidra-evidence/image_path/swapper_slot44_06A48A.txt new file mode 100644 index 0000000..c69a855 --- /dev/null +++ b/xie/ghidra-evidence/image_path/swapper_slot44_06A48A.txt @@ -0,0 +1,37 @@ +rom:0006a48a MMTM SP,0x74 +rom:0006a48e MOVE A14,A13 +rom:0006a490 MOVE *A13(0xffe0),A11,0x1 +rom:0006a494 MOVE *A11(0x40),A10,0x1 +rom:0006a498 MOVB *A10(0x10),*A9 +rom:0006a49c MOVB *A10(0x18),*A10(0x10) +rom:0006a4a2 MOVB *A9,*A10(0x18) +rom:0006a4a6 MOVB *A10(0x20),*A9 +rom:0006a4aa MOVB *A10(0x38),*A10(0x20) +rom:0006a4b0 MOVB *A9,*A10(0x38) +rom:0006a4b4 MOVB *A10(0x28),*A9 +rom:0006a4b8 MOVB *A10(0x30),*A10(0x28) +rom:0006a4be MOVB *A9,*A10(0x30) +rom:0006a4c2 MOVB *A10(0x40),*A9 +rom:0006a4c6 MOVB *A10(0x58),*A10(0x40) +rom:0006a4cc MOVB *A9,*A10(0x58) +rom:0006a4d0 MOVB *A10(0x48),*A9 +rom:0006a4d4 MOVB *A10(0x50),*A10(0x48) +rom:0006a4da MOVB *A9,*A10(0x50) +rom:0006a4de MOVB *A10(0x60),*A9 +rom:0006a4e2 MOVB *A10(0x78),*A10(0x60) +rom:0006a4e8 MOVB *A9,*A10(0x78) +rom:0006a4ec MOVB *A10(0x68),*A9 +rom:0006a4f0 MOVB *A10(0x70),*A10(0x68) +rom:0006a4f6 MOVB *A9,*A10(0x70) +rom:0006a4fa MOVB *A10(0x80),*A9 +rom:0006a4fe MOVB *A10(0x98),*A10(0x80) +rom:0006a504 MOVB *A9,*A10(0x98) +rom:0006a508 MOVB *A10(0x88),*A9 +rom:0006a50c MOVB *A10(0x90),*A10(0x88) +rom:0006a512 MOVB *A9,*A10(0x90) +rom:0006a516 MOVE A14,-*SP,0x1 +rom:0006a518 MOVE A11,*A14+,0x1 +rom:0006a51a SETF 0x8,0x0,0x0 +rom:0006a51c MOVE *A10(0x8),A11,0x0 +rom:0006a520 SLL 0x5,A11 +rom:0006a522 ADDI 0xd3f90,A11 diff --git a/xie/ghidra-evidence/import/lookup_6B966.txt b/xie/ghidra-evidence/import/lookup_6B966.txt new file mode 100644 index 0000000..bbf04ff --- /dev/null +++ b/xie/ghidra-evidence/import/lookup_6B966.txt @@ -0,0 +1,209 @@ +rom:0006b966 MMTM SP,0x154 +rom:0006b96a MOVE A14,A13 +rom:0006b96c MOVE *A13(0xffe0),A11,0x1 +rom:0006b970 MOVE *A11(0x40),A9,0x1 +rom:0006b974 MOVE *A13(0xffa0),A7,0x1 +rom:0006b978 MOVE A14,-*SP,0x1 +rom:0006b97a SETF 0x10,0x0,0x0 +rom:0006b97c MOVE @0x1ad980,A11,0x0 +rom:0006b982 MOVE A11,*A14+,0x1 +rom:0006b984 MOVE @0x1ad990,A11,0x0 +rom:0006b98a MOVE A11,*A14+,0x1 +rom:0006b98c MOVE *A13(0xff60),*A14+,0x1 +rom:0006b990 CALLA 0x07f174a4 +rom:0006b996 MOVE A8,*A7,0x1 +rom:0006b998 MOVE *A7,A11,0x1 +rom:0006b99a JRNE 0x0006ba8c +rom:0006b99c MOVE A14,-*SP,0x1 +rom:0006b99e MOVK 0xe,A11 +rom:0006b9a0 MOVE A11,*A14+,0x1 +rom:0006b9a2 MOVE *A13(0xff60),*A14+,0x1 +rom:0006b9a6 SETF 0x8,0x0,0x0 +rom:0006b9a8 MOVE *A9(0x8),A8,0x0 +rom:0006b9ac MOVE A8,*A14+,0x1 +rom:0006b9ae MOVE 0x1ad960,*A14+,0x1 +rom:0006b9b4 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006b9b8 CALLA 0x07effa5e +rom:0006b9be MOVE A11,A8 +rom:0006b9c0 JR 0x0006bbe4 +rom:0006b9c4 MOVE *A13(0xffc0),A11,0x1 +rom:0006b9c8 JRNE 0x0006b9f0 +rom:0006b9ca MOVE A14,-*SP,0x1 +rom:0006b9cc MOVK 0xe,A7 +rom:0006b9ce MOVE A7,*A14+,0x1 +rom:0006b9d0 MOVE *A13(0xff60),*A14+,0x1 +rom:0006b9d4 MOVE *A9(0x8),A8,0x0 +rom:0006b9d8 MOVE A8,*A14+,0x1 +rom:0006b9da MOVE 0x1ad960,*A14+,0x1 +rom:0006b9e0 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006b9e4 CALLA 0x07effa5e +rom:0006b9ea MOVE A7,A8 +rom:0006b9ec JR 0x0006bbe4 +rom:0006b9f0 MOVE *A13(0xffa0),A7,0x1 +rom:0006b9f4 MOVE *A7,*A11,0x1 +rom:0006b9f6 SETF 0x8,0x0,0x0 +rom:0006b9f8 MOVE *A13(0xff40),A7,0x0 +rom:0006b9fc SUBK 0x2,A7 +rom:0006b9fe JRNE 0x0006ba0c +rom:0006ba00 MOVE *A11,A7,0x1 +rom:0006ba02 MOVE *A7(0x40),A7,0x1 +rom:0006ba06 MOVE *A7(0x40),A7,0x1 +rom:0006ba0a JR 0x0006ba16 +rom:0006ba0c MOVE *A11,A7,0x1 +rom:0006ba0e MOVE *A7(0x60),A7,0x1 +rom:0006ba12 MOVE *A7(0x40),A7,0x1 +rom:0006ba16 MOVE *A13(0xffa0),A11,0x1 +rom:0006ba1a MOVE A7,*A11,0x1 +rom:0006ba1c JR 0x0006baa2 +rom:0006ba1e MOVE *A13(0xffc0),A11,0x1 +rom:0006ba22 JREQ 0x0006ba32 +rom:0006ba24 MOVE *A13(0xffa0),A7,0x1 +rom:0006ba28 MOVE *A7,A7,0x1 +rom:0006ba2a MOVE *A7(0x140),*A11(0x0),0x1 +rom:0006ba30 JR 0x0006baa2 +rom:0006ba32 MOVE *A13(0xffa0),A7,0x1 +rom:0006ba36 MOVE *A7,A7,0x1 +rom:0006ba38 MOVE *A7(0x140),A7,0x1 +rom:0006ba3c JREQ 0x0006baa2 +rom:0006ba3e MOVE A14,-*SP,0x1 +rom:0006ba40 MOVK 0xe,A7 +rom:0006ba42 MOVE A7,*A14+,0x1 +rom:0006ba44 MOVE *A13(0xff60),*A14+,0x1 +rom:0006ba48 SETF 0x8,0x0,0x0 +rom:0006ba4a MOVE *A9(0x8),A8,0x0 +rom:0006ba4e MOVE A8,*A14+,0x1 +rom:0006ba50 MOVE 0x1ad960,*A14+,0x1 +rom:0006ba56 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006ba5a CALLA 0x07effa5e +rom:0006ba60 MOVE A7,A8 +rom:0006ba62 JR 0x0006bbe4 +rom:0006ba66 MOVE A14,-*SP,0x1 +rom:0006ba68 MOVK 0xe,A11 +rom:0006ba6a MOVE A11,*A14+,0x1 +rom:0006ba6c MOVE *A13(0xff60),*A14+,0x1 +rom:0006ba70 MOVE *A9(0x8),A8,0x0 +rom:0006ba74 MOVE A8,*A14+,0x1 +rom:0006ba76 MOVE 0x1ad960,*A14+,0x1 +rom:0006ba7c MOVE *A13(0xffe0),*A14+,0x1 +rom:0006ba80 CALLA 0x07effa5e +rom:0006ba86 MOVE A11,A8 +rom:0006ba88 JR 0x0006bbe4 +rom:0006ba8c MOVE *A7,A11,0x1 +rom:0006ba8e SETF 0x8,0x0,0x0 +rom:0006ba90 MOVE *A11(0x20),A8,0x0 +rom:0006ba94 DEC A8 +rom:0006ba96 JREQ 0x0006b9c4 +rom:0006ba98 DEC A8 +rom:0006ba9a JREQ 0x0006ba1e +rom:0006ba9c DEC A8 +rom:0006ba9e JREQ 0x0006ba1e +rom:0006baa0 JR 0x0006ba66 +rom:0006baa2 MOVE *A13(0xffa0),A11,0x1 +rom:0006baa6 MOVE *A11,A7,0x1 +rom:0006baa8 MOVE *A13(0xff80),A11,0x1 +rom:0006baac MOVE *A7(0x120),*A11(0x0),0x1 +rom:0006bab2 MOVE *A13(0xff20),A7,0x1 +rom:0006bab6 JRLT 0x0006babc +rom:0006bab8 MOVE *A11,A7,0x1 +rom:0006baba JRNE 0x0006baea +rom:0006babc MOVE *A13(0xff20),A7,0x1 +rom:0006bac0 JRLT 0x0006bbce +rom:0006bac4 MOVE A14,-*SP,0x1 +rom:0006bac6 MOVK 0xa,A7 +rom:0006bac8 MOVE A7,*A14+,0x1 +rom:0006baca MOVE *A13(0xff60),*A14+,0x1 +rom:0006bace SETF 0x8,0x0,0x0 +rom:0006bad0 MOVE *A9(0x8),A8,0x0 +rom:0006bad4 MOVE A8,*A14+,0x1 +rom:0006bad6 MOVE 0x1ad960,*A14+,0x1 +rom:0006badc MOVE *A13(0xffe0),*A14+,0x1 +rom:0006bae0 CALLA 0x07effa5e +rom:0006bae6 MOVE A7,A8 +rom:0006bae8 JR 0x0006bbe4 +rom:0006baea MOVE *A11,A7,0x1 +rom:0006baec SETF 0x8,0x0,0x0 +rom:0006baee MOVE *A13(0xff40),A11,0x0 +rom:0006baf2 MOVE *A7,A7,0x0 +rom:0006baf4 CMP A7,A11 +rom:0006baf6 JREQ 0x0006bbce +rom:0006baf8 MOVE A14,-*SP,0x1 +rom:0006bafa MOVK 0x8,A7 +rom:0006bafc MOVE A7,*A14+,0x1 +rom:0006bafe MOVE *A13(0xff60),*A14+,0x1 +rom:0006bb02 MOVE *A9(0x8),A8,0x0 +rom:0006bb06 MOVE A8,*A14+,0x1 +rom:0006bb08 MOVE 0x1ad960,*A14+,0x1 +rom:0006bb0e MOVE *A13(0xffe0),*A14+,0x1 +rom:0006bb12 CALLA 0x07effa5e +rom:0006bb18 MOVE A7,A8 +rom:0006bb1a JR 0x0006bbe4 +rom:0006bb1c MOVE *A13(0xff20),A11,0x1 +rom:0006bb20 JRLT 0x0006bbe2 +rom:0006bb22 MOVK 0x1,A7 +rom:0006bb24 SLL A11,A7 +rom:0006bb26 MOVE *A13(0xff80),A11,0x1 +rom:0006bb2a MOVE *A11,A11,0x1 +rom:0006bb2c MOVE *A11(0x60),A11,0x1 +rom:0006bb30 AND A11,A7 +rom:0006bb32 JRNE 0x0006bb4a +rom:0006bb34 MOVK 0x1,A11 +rom:0006bb36 MOVE *A13(0xff20),A7,0x1 +rom:0006bb3a SLL A7,A11 +rom:0006bb3c MOVE *A13(0xff80),A7,0x1 +rom:0006bb40 MOVE *A7,A7,0x1 +rom:0006bb42 MOVE *A7(0x40),A7,0x1 +rom:0006bb46 AND A7,A11 +rom:0006bb48 JRNE 0x0006bbe2 +rom:0006bb4a MOVE A14,-*SP,0x1 +rom:0006bb4c MOVK 0x8,A11 +rom:0006bb4e MOVE A11,*A14+,0x1 +rom:0006bb50 MOVE *A13(0xff60),*A14+,0x1 +rom:0006bb54 SETF 0x8,0x0,0x0 +rom:0006bb56 MOVE *A9(0x8),A8,0x0 +rom:0006bb5a MOVE A8,*A14+,0x1 +rom:0006bb5c MOVE 0x1ad960,*A14+,0x1 +rom:0006bb62 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006bb66 CALLA 0x07effa5e +rom:0006bb6c MOVE A11,A8 +rom:0006bb6e JR 0x0006bbe4 +rom:0006bb70 MOVE *A13(0xff20),A11,0x1 +rom:0006bb74 JRLT 0x0006bbe2 +rom:0006bb76 MOVE *A13(0xff80),A7,0x1 +rom:0006bb7a MOVE *A7,A7,0x1 +rom:0006bb7c MOVE *A7(0x40),A7,0x1 +rom:0006bb80 AND A11,A7 +rom:0006bb82 CMP A7,A11 +rom:0006bb84 JREQ 0x0006bbe2 +rom:0006bb86 MOVE A14,-*SP,0x1 +rom:0006bb88 MOVK 0x8,A7 +rom:0006bb8a MOVE A7,*A14+,0x1 +rom:0006bb8c MOVE *A13(0xff60),*A14+,0x1 +rom:0006bb90 MOVE *A9(0x8),A8,0x0 +rom:0006bb94 MOVE A8,*A14+,0x1 +rom:0006bb96 MOVE 0x1ad960,*A14+,0x1 +rom:0006bb9c MOVE *A13(0xffe0),*A14+,0x1 +rom:0006bba0 CALLA 0x07effa5e +rom:0006bba6 MOVE A7,A8 +rom:0006bba8 JR 0x0006bbe4 +rom:0006bbaa MOVE A14,-*SP,0x1 +rom:0006bbac MOVK 0x2,A11 +rom:0006bbae MOVE A11,*A14+,0x1 +rom:0006bbb0 MOVE *A13(0xff60),*A14+,0x1 +rom:0006bbb4 MOVE *A9(0x8),A8,0x0 +rom:0006bbb8 MOVE A8,*A14+,0x1 +rom:0006bbba MOVE 0x1ad960,*A14+,0x1 +rom:0006bbc0 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006bbc4 CALLA 0x07effa5e +rom:0006bbca MOVE A11,A8 +rom:0006bbcc JR 0x0006bbe4 +rom:0006bbce SETF 0x8,0x0,0x0 +rom:0006bbd0 MOVE *A13(0xff40),A8,0x0 +rom:0006bbd4 DEC A8 +rom:0006bbd6 JREQ 0x0006bb1c +rom:0006bbd8 DEC A8 +rom:0006bbda JREQ 0x0006bb1c +rom:0006bbdc DEC A8 +rom:0006bbde JREQ 0x0006bb70 +rom:0006bbe0 JR 0x0006bbaa +rom:0006bbe2 SUB A8,A8 +rom:0006bbe4 MOVE *SP(0xa0),A14,0x1 diff --git a/xie/ghidra-evidence/import/resource_init_6CA82.txt b/xie/ghidra-evidence/import/resource_init_6CA82.txt new file mode 100644 index 0000000..6f23ee2 --- /dev/null +++ b/xie/ghidra-evidence/import/resource_init_6CA82.txt @@ -0,0 +1,207 @@ +rom:0006ca82 MMTM SP,0x154 +rom:0006ca86 MOVE A14,A13 +rom:0006ca88 ADDI 0xa0,A14 +rom:0006ca8c MOVE A14,-*SP,0x1 +rom:0006ca8e MOVI 0x30,A11 +rom:0006ca92 MOVE A11,*A14+,0x1 +rom:0006ca94 MOVK 0x1,A9 +rom:0006ca96 MOVE A9,*A14+,0x1 +rom:0006ca98 CALLA 0x07f63a30 +rom:0006ca9e MOVE A8,*A13,0x1 +rom:0006caa0 MOVE A8,A8 +rom:0006caa2 JRNE 0x0006caba +rom:0006caa4 MOVE A14,-*SP,0x1 +rom:0006caa6 MOVI 0x3f568580,A8 +rom:0006caac MOVE A8,*A14+,0x1 +rom:0006caae CALLA 0x07f24f78 +rom:0006cab4 SUB A8,A8 +rom:0006cab6 JR 0x0006ccfe +rom:0006caba MOVE A14,-*SP,0x1 +rom:0006cabc SUB A9,A9 +rom:0006cabe MOVE A9,*A14+,0x1 +rom:0006cac0 MOVE A8,A9 +rom:0006cac2 CALLA 0x07f642ec +rom:0006cac8 MOVE A8,*A9(0x160),0x1 +rom:0006cacc MOVE *A9(0x160),A11,0x1 +rom:0006cad0 JRNE 0x0006caf2 +rom:0006cad2 MOVE A14,-*SP,0x1 +rom:0006cad4 MOVI 0x3f568658,A8 +rom:0006cada MOVE A8,*A14+,0x1 +rom:0006cadc CALLA 0x07f24f78 +rom:0006cae2 MOVE A14,-*SP,0x1 +rom:0006cae4 MOVE A9,*A14+,0x1 +rom:0006cae6 CALLA 0x07f63b00 +rom:0006caec SUB A8,A8 +rom:0006caee JR 0x0006ccfe +rom:0006caf2 MOVE *A13(0xfec0),A11,0x1 +rom:0006caf6 JREQ 0x0006cafc +rom:0006caf8 MOVK 0x2,A11 +rom:0006cafa JR 0x0006cafe +rom:0006cafc MOVK 0x3,A11 +rom:0006cafe MOVB *A11,*A9(0x20) +rom:0006cb02 MOVK 0x1,A11 +rom:0006cb04 SETF 0x10,0x1,0x0 +rom:0006cb06 MOVE A11,*A9(0x30),0x0 +rom:0006cb0a MOVB *A13(0xffe0),*A9(0x40) +rom:0006cb10 SETF 0x8,0x0,0x0 +rom:0006cb12 MOVE *A9(0x40),A7,0x0 +rom:0006cb16 SUBK 0x3,A7 +rom:0006cb18 JRNE 0x0006cb1e +rom:0006cb1a MOVK 0x3,A7 +rom:0006cb1c JR 0x0006cb20 +rom:0006cb1e MOVE A11,A7 +rom:0006cb20 MOVB *A7,*A9(0x48) +rom:0006cb24 MOVE *A13(0xff80),*A9(0xc0),0x1 +rom:0006cb2a MOVE *A13(0xffa0),*A9(0xe0),0x1 +rom:0006cb30 MOVB *A13(0xff60),*A9(0x58) +rom:0006cb36 MOVB *A13(0xff40),*A9(0x60) +rom:0006cb3c MOVB *A13(0xff20),*A9(0x50) +rom:0006cb42 MOVE *A13(0xff00),*A9(0x80),0x1 +rom:0006cb48 MOVE *A13(0xfee0),*A9(0xa0),0x1 +rom:0006cb4e SUB A7,A7 +rom:0006cb50 MOVE A7,*A13(0x20),0x1 +rom:0006cb54 MOVE *A9(0x48),A11,0x0 +rom:0006cb58 CMP A11,A7 +rom:0006cb5a JRNC 0x0006cc9e +rom:0006cb5e MOVE *A13(0x20),A11,0x1 +rom:0006cb62 SLL 0x5,A11 +rom:0006cb64 MOVE *A13(0xffc0),A9,0x1 +rom:0006cb68 ADD A9,A11 +rom:0006cb6a MOVE *A11,A11,0x1 +rom:0006cb6c JRNE 0x0006cb72 +rom:0006cb6e MOVK 0x0,A11 +rom:0006cb70 JR 0x0006cbb0 +rom:0006cb72 MOVE *A13(0x20),A11,0x1 +rom:0006cb76 SLL 0x5,A11 +rom:0006cb78 ADD A9,A11 +rom:0006cb7a MOVE *A11,A11,0x1 +rom:0006cb7c SUBK 0x2,A11 +rom:0006cb7e JRHI 0x0006cb84 +rom:0006cb80 MOVK 0x1,A11 +rom:0006cb82 JR 0x0006cbb0 +rom:0006cb84 MOVE *A13(0x20),A11,0x1 +rom:0006cb88 SLL 0x5,A11 +rom:0006cb8a ADD A9,A11 +rom:0006cb8c MOVE *A11,A11,0x1 +rom:0006cb8e CMPI 0x100,A11 +rom:0006cb92 JRHI 0x0006cb98 +rom:0006cb94 MOVK 0x8,A11 +rom:0006cb96 JR 0x0006cbb0 +rom:0006cb98 MOVE *A13(0x20),A11,0x1 +rom:0006cb9c SLL 0x5,A11 +rom:0006cb9e ADD A9,A11 +rom:0006cba0 MOVE *A11,A11,0x1 +rom:0006cba2 CMPI 0x10000,A11 +rom:0006cba8 JRHI 0x0006cbae +rom:0006cbaa MOVK 0x10,A11 +rom:0006cbac JR 0x0006cbb0 +rom:0006cbae MOVK 0x0,A11 +rom:0006cbb0 MOVE A11,*A13(0x40),0x1 +rom:0006cbb4 MOVE *A13(0xff00),A7,0x1 +rom:0006cbb8 MPYU A7,A11 +rom:0006cbba ADDK 0x7,A11 +rom:0006cbbc MOVK 0x7,A7 +rom:0006cbbe ANDN A7,A11 +rom:0006cbc0 MOVE A11,*A13(0x60),0x1 +rom:0006cbc4 MOVE *A13(0x20),A7,0x1 +rom:0006cbc8 SLL 0x5,A7 +rom:0006cbca ADD A9,A7 +rom:0006cbcc MOVE *A7,A7,0x1 +rom:0006cbce JRNE 0x0006cbd4 +rom:0006cbd0 MOVK 0x4,A7 +rom:0006cbd2 JR 0x0006cbec +rom:0006cbd4 MOVE A14,-*SP,0x1 +rom:0006cbd6 MOVE A11,*A14+,0x1 +rom:0006cbd8 MOVE *A13(0x40),*A14+,0x1 +rom:0006cbdc SUB A7,A7 +rom:0006cbde MOVE A7,*A14+,0x1 +rom:0006cbe0 MOVE *A13(0x40),*A14+,0x1 +rom:0006cbe4 CALLA 0x07eacd68 +rom:0006cbea MOVE A8,A7 +rom:0006cbec MOVE A7,*A13(0x80),0x1 +rom:0006cbf0 MOVE *A13,A7,0x1 +rom:0006cbf2 MOVE *A13(0x20),A9,0x1 +rom:0006cbf6 SLL 0x5,A9 +rom:0006cbf8 MOVE *A13(0xffc0),A11,0x1 +rom:0006cbfc ADD A11,A9 +rom:0006cbfe MOVE *A9,A9,0x1 +rom:0006cc00 JRNE 0x0006cc06 +rom:0006cc02 SUB A9,A9 +rom:0006cc04 JR 0x0006cc08 +rom:0006cc06 MOVK 0x1,A9 +rom:0006cc08 SETF 0x1,0x0,0x0 +rom:0006cc0a MOVE A9,*A7(0x28),0x0 +rom:0006cc0e MOVE *A7(0x160),A9,0x1 +rom:0006cc12 MOVE *A13(0x20),A7,0x1 +rom:0006cc16 SLL 0x5,A7 +rom:0006cc18 ADD A7,A9 +rom:0006cc1a MOVE A14,-*SP,0x1 +rom:0006cc1c SUB A7,A7 +rom:0006cc1e MOVE A7,*A14+,0x1 +rom:0006cc20 MOVE A7,*A14+,0x1 +rom:0006cc22 MOVE *A13(0x20),*A14+,0x1 +rom:0006cc26 MOVE *A13(0x20),A7,0x1 +rom:0006cc2a SLL 0x5,A7 +rom:0006cc2c ADD A11,A7 +rom:0006cc2e MOVE *A7+,*A14+,0x1 +rom:0006cc30 MOVE *A13(0x60),*A14+,0x1 +rom:0006cc34 MOVE *A13(0x40),*A14+,0x1 +rom:0006cc38 MOVE *A13(0xfee0),*A14+,0x1 +rom:0006cc3c MOVE *A13(0xff00),*A14+,0x1 +rom:0006cc40 SUB A7,A7 +rom:0006cc42 MOVE A7,*A14+,0x1 +rom:0006cc44 MOVE *A13(0x80),*A14+,0x1 +rom:0006cc48 CALLA 0x07eac660 +rom:0006cc4e MOVE A8,*A9(0xd8),0x1 +rom:0006cc52 MOVE *A13,A9,0x1 +rom:0006cc54 MOVE *A9(0x160),A7,0x1 +rom:0006cc58 MOVE *A13(0x20),A9,0x1 +rom:0006cc5c SLL 0x5,A9 +rom:0006cc5e ADD A9,A7 +rom:0006cc60 MOVE *A7(0xd8),A9,0x1 +rom:0006cc64 JRNE 0x0006cc86 +rom:0006cc66 MOVE A14,-*SP,0x1 +rom:0006cc68 MOVI 0x3f5688d8,A8 +rom:0006cc6e MOVE A8,*A14+,0x1 +rom:0006cc70 CALLA 0x07f24f78 +rom:0006cc76 MOVE A14,-*SP,0x1 +rom:0006cc78 MOVE *A13(0x0),*A14+,0x1 +rom:0006cc7c CALLA 0x07eacdda +rom:0006cc82 SUB A8,A8 +rom:0006cc84 JR 0x0006ccfe +rom:0006cc86 MOVE *A13(0x20),A9,0x1 +rom:0006cc8a INC A9 +rom:0006cc8c MOVE A9,*A13(0x20),0x1 +rom:0006cc90 MOVE *A13,A7,0x1 +rom:0006cc92 SETF 0x8,0x0,0x0 +rom:0006cc94 MOVE *A7(0x48),A7,0x0 +rom:0006cc98 CMP A7,A9 +rom:0006cc9a JRC 0x0006cb5e +rom:0006cc9e MOVE A14,-*SP,0x1 +rom:0006cca0 MOVE *A13,A11,0x1 +rom:0006cca2 MOVE *A11(0x160),A9,0x1 +rom:0006cca6 MOVE *A9(0xd8),A9,0x1 +rom:0006ccaa MOVK 0x1,A7 +rom:0006ccac MOVE *A9(0x10),A9,0x0 +rom:0006ccb0 SLL A9,A7 +rom:0006ccb2 MOVE A7,*A14+,0x1 +rom:0006ccb4 MOVE *A11(0x160),A9,0x1 +rom:0006ccb8 MOVE *A9(0xd8),A9,0x1 +rom:0006ccbc MOVE *A9(0x10),A8,0x0 +rom:0006ccc0 MOVE A8,*A14+,0x1 +rom:0006ccc2 MOVE *A11(0x160),*A14+,0x1 +rom:0006ccc6 CALLA 0x07f650f6 +rom:0006cccc MOVE A14,-*SP,0x1 +rom:0006ccce MOVE *A13(0xfee0),*A14+,0x1 +rom:0006ccd2 MOVE *A11(0x160),*A14+,0x1 +rom:0006ccd6 CALLA 0x07f65118 +rom:0006ccdc MOVE *A11(0x160),A9,0x1 +rom:0006cce0 SETF 0x1,0x0,0x0 +rom:0006cce2 MOVE *A13(0xfec0),*A9(0x13c),0x0 +rom:0006cce8 MOVE *A11(0x160),A9,0x1 +rom:0006ccec MOVE *A13(0xfec0),*A9(0x13b),0x0 +rom:0006ccf2 MOVE *A11(0x160),A9,0x1 +rom:0006ccf6 SUB A7,A7 +rom:0006ccf8 MOVE A7,*A9(0x13a),0x0 +rom:0006ccfc MOVE A11,A8 +rom:0006ccfe MOVE *SP(0xa0),A14,0x1 diff --git a/xie/ghidra-evidence/import/slot07_op1_6742C.txt b/xie/ghidra-evidence/import/slot07_op1_6742C.txt new file mode 100644 index 0000000..0445a12 --- /dev/null +++ b/xie/ghidra-evidence/import/slot07_op1_6742C.txt @@ -0,0 +1,211 @@ +rom:0006742c MMTM SP,0x154 +rom:00067430 MOVE A14,A13 +rom:00067432 ADDI 0x60,A14 +rom:00067436 MOVE *A13(0xffe0),A11,0x1 +rom:0006743a MOVE *A11(0x40),A9,0x1 +rom:0006743e SETF 0x10,0x0,0x0 +rom:00067440 MOVE *A9(0x10),A11,0x0 +rom:00067444 SUBK 0x4,A11 +rom:00067446 JREQ 0x0006744e +rom:00067448 MOVK 0x10,A8 +rom:0006744a JR 0x00067590 +rom:0006744e MOVE A14,-*SP,0x1 +rom:00067450 MOVE *A9(0x40),*A14+,0x1 +rom:00067454 MOVE *A9(0x60),*A14+,0x1 +rom:00067458 MOVE A13,A11 +rom:0006745a ADDK 0x0,A11 +rom:0006745c MOVE A11,*A14+,0x1 +rom:0006745e SUB A7,A7 +rom:00067460 MOVE A7,*A14+,0x1 +rom:00067462 MOVE *A13(0xffe0),*A14+,0x1 +rom:00067466 CALLA 0x07ea6fa0 +rom:0006746c MOVE A8,*A13(0x40),0x1 +rom:00067470 MOVE A8,A8 +rom:00067472 JRNE 0x00067590 +rom:00067476 MOVE A14,-*SP,0x1 +rom:00067478 MOVK 0x14,A7 +rom:0006747a MOVE A7,*A14+,0x1 +rom:0006747c MOVK 0x1,A7 +rom:0006747e MOVE A7,*A14+,0x1 +rom:00067480 CALLA 0x07f63a30 +rom:00067486 MOVE A8,*A13,0x1 +rom:00067488 MOVE A8,A8 +rom:0006748a JRNE 0x0006749c +rom:0006748c MOVE A14,-*SP,0x1 +rom:0006748e MOVI 0x3f544b10,A8 +rom:00067494 MOVE A8,*A14+,0x1 +rom:00067496 CALLA 0x07f24f78 +rom:0006749c MOVE *A13,A7,0x1 +rom:0006749e JRNE 0x000674c6 +rom:000674a0 MOVE A14,-*SP,0x1 +rom:000674a2 MOVK 0xb,A11 +rom:000674a4 MOVE A11,*A14+,0x1 +rom:000674a6 MOVE *A9(0x40),*A14+,0x1 +rom:000674aa SETF 0x8,0x0,0x0 +rom:000674ac MOVE *A9(0x8),A8,0x0 +rom:000674b0 MOVE A8,*A14+,0x1 +rom:000674b2 MOVE 0x1ad960,*A14+,0x1 +rom:000674b8 MOVE *A13(0xffe0),*A14+,0x1 +rom:000674bc CALLA 0x07effa5e +rom:000674c2 MOVE A11,A8 +rom:000674c4 JR 0x00067590 +rom:000674c6 MOVK 0x1,A11 +rom:000674c8 MOVB *A11,*A7(0x20) +rom:000674cc SETF 0x10,0x1,0x0 +rom:000674ce MOVE A11,*A7(0x30),0x0 +rom:000674d2 CALLA 0x07f63b48 +rom:000674d8 MOVE A8,*A7(0x80),0x1 +rom:000674dc MOVE *A7(0x80),A11,0x1 +rom:000674e0 JRNE 0x00067512 +rom:000674e2 MOVE A14,-*SP,0x1 +rom:000674e4 MOVK 0xb,A11 +rom:000674e6 MOVE A11,*A14+,0x1 +rom:000674e8 MOVE A14,-*SP,0x1 +rom:000674ea MOVE A7,*A14+,0x1 +rom:000674ec CALLA 0x07eacdda +rom:000674f2 MOVE *A9(0x40),*A14+,0x1 +rom:000674f6 SETF 0x8,0x0,0x0 +rom:000674f8 MOVE *A9(0x8),A8,0x0 +rom:000674fc MOVE A8,*A14+,0x1 +rom:000674fe MOVE 0x1ad960,*A14+,0x1 +rom:00067504 MOVE *A13(0xffe0),*A14+,0x1 +rom:00067508 CALLA 0x07effa5e +rom:0006750e MOVE A11,A8 +rom:00067510 JR 0x00067590 +rom:00067512 MOVE A14,-*SP,0x1 +rom:00067514 SUB A11,A11 +rom:00067516 MOVE A11,*A14+,0x1 +rom:00067518 MOVE *A13(0x20),*A14+,0x1 +rom:0006751c MOVE A7,*A14+,0x1 +rom:0006751e CALLA 0x07ea72a4 +rom:00067524 MOVE A8,A8 +rom:00067526 JRNE 0x00067558 +rom:00067528 MOVE A14,-*SP,0x1 +rom:0006752a MOVK 0xb,A11 +rom:0006752c MOVE A11,*A14+,0x1 +rom:0006752e MOVE A14,-*SP,0x1 +rom:00067530 MOVE A7,*A14+,0x1 +rom:00067532 CALLA 0x07eacdda +rom:00067538 MOVE *A9(0x40),*A14+,0x1 +rom:0006753c SETF 0x8,0x0,0x0 +rom:0006753e MOVE *A9(0x8),A8,0x0 +rom:00067542 MOVE A8,*A14+,0x1 +rom:00067544 MOVE 0x1ad960,*A14+,0x1 +rom:0006754a MOVE *A13(0xffe0),*A14+,0x1 +rom:0006754e CALLA 0x07effa5e +rom:00067554 MOVE A11,A8 +rom:00067556 JR 0x00067590 +rom:00067558 MOVE *A7(0x40),*A7(0x60),0x1 +rom:0006755e MOVE *A9(0x40),*A7(0x0),0x1 +rom:00067564 MOVE A14,-*SP,0x1 +rom:00067566 SETF 0x10,0x0,0x0 +rom:00067568 MOVE @0x1ad980,A11,0x0 +rom:0006756e MOVE A11,*A14+,0x1 +rom:00067570 MOVI 0x3f566ed0,A7 +rom:00067576 MOVE A7,*A14+,0x1 +rom:00067578 MOVE *A13(0x0),*A14+,0x1 +rom:0006757c MOVE @0x1ad990,A7,0x0 +rom:00067582 MOVE A7,*A14+,0x1 +rom:00067584 MOVE *A9(0x40),*A14+,0x1 +rom:00067588 CALLA 0x07f16ca2 +rom:0006758e SUB A8,A8 +rom:00067590 MOVE *SP(0xa0),A14,0x1 +rom:00067594 MMFM SP,0x2a80 +rom:0006759a MMTM SP,0x554 +rom:0006759e MOVE A14,A13 +rom:000675a0 ADDI 0xe0,A14 +rom:000675a4 MOVE *A13(0xffe0),A11,0x1 +rom:000675a8 MOVE *A11(0x40),A9,0x1 +rom:000675ac SETF 0x10,0x0,0x0 +rom:000675ae MOVE *A9(0x10),A11,0x0 +rom:000675b2 SUBK 0x4,A11 +rom:000675b4 JREQ 0x000675bc +rom:000675b6 MOVK 0x10,A8 +rom:000675b8 JR 0x000676c0 +rom:000675bc MOVE A14,-*SP,0x1 +rom:000675be MOVE *A9(0x40),*A14+,0x1 +rom:000675c2 MOVE *A9(0x60),*A14+,0x1 +rom:000675c6 MOVE A13,A11 +rom:000675c8 ADDI 0x80,A11 +rom:000675cc MOVE A11,*A14+,0x1 +rom:000675ce SUB A7,A7 +rom:000675d0 MOVE A7,*A14+,0x1 +rom:000675d2 MOVE *A13(0xffe0),*A14+,0x1 +rom:000675d6 CALLA 0x07ea6fa0 +rom:000675dc MOVE A8,*A13(0xc0),0x1 +rom:000675e0 MOVE A8,A8 +rom:000675e2 JRNE 0x000676c0 +rom:000675e4 MOVE A7,*A13,0x1 +rom:000675e6 MOVE *A13(0x80),A11,0x1 +rom:000675ea SETF 0x8,0x0,0x0 +rom:000675ec MOVE *A11(0x48),A11,0x0 +rom:000675f0 CMP A11,A7 +rom:000675f2 JRNC 0x00067624 +rom:000675f4 MOVE *A13,A11,0x1 +rom:000675f6 SLL 0x5,A11 +rom:000675f8 ADD A13,A11 +rom:000675fa MOVE *A13(0x80),A7,0x1 +rom:000675fe MOVE *A7(0x160),A5,0x1 +rom:00067602 MOVE *A13,A7,0x1 +rom:00067604 SLL 0x5,A7 +rom:00067606 ADD A7,A5 +rom:00067608 MOVE *A5(0xd8),A7,0x1 +rom:0006760c MOVE *A7(0x1a8),*A11(0x20),0x1 +rom:00067612 MOVE *A13,A11,0x1 +rom:00067614 INC A11 +rom:00067616 MOVE A11,*A13,0x1 +rom:00067618 MOVE *A13(0x80),A7,0x1 +rom:0006761c MOVE *A7(0x48),A5,0x0 +rom:00067620 CMP A5,A11 +rom:00067622 JRC 0x000675f4 +rom:00067624 MOVE A14,-*SP,0x1 +rom:00067626 MOVK 0x1,A11 +rom:00067628 MOVE A11,*A14+,0x1 +rom:0006762a MOVE *A13(0x80),A7,0x1 +rom:0006762e MOVE *A7(0xa0),*A14+,0x1 +rom:00067632 MOVE *A7(0x80),*A14+,0x1 +rom:00067636 MOVE *A7(0x50),A8,0x0 +rom:0006763a MOVE A8,*A14+,0x1 +rom:0006763c MOVE *A7(0x60),A8,0x0 +rom:00067640 MOVE A8,*A14+,0x1 +rom:00067642 MOVE *A7(0x58),A8,0x0 +rom:00067646 MOVE A8,*A14+,0x1 +rom:00067648 MOVE *A7(0xc0),*A14+,0x1 +rom:0006764c MOVE *A7(0xe0),*A14+,0x1 +rom:00067650 MOVE A13,A5 +rom:00067652 ADDK 0x0,A5 +rom:00067654 MOVE A5,*A14+,0x1 +rom:00067656 MOVE *A7(0x40),A8,0x0 +rom:0006765a MOVE A8,*A14+,0x1 +rom:0006765c CALLA 0x07eac7fa +rom:00067662 MOVE A8,*A13(0xa0),0x1 +rom:00067666 MOVE A8,A8 +rom:00067668 JRNE 0x00067690 +rom:0006766a MOVE A14,-*SP,0x1 +rom:0006766c MOVK 0xb,A11 +rom:0006766e MOVE A11,*A14+,0x1 +rom:00067670 MOVE *A9(0x40),*A14+,0x1 +rom:00067674 SETF 0x8,0x0,0x0 +rom:00067676 MOVE *A9(0x8),A8,0x0 +rom:0006767a MOVE A8,*A14+,0x1 +rom:0006767c MOVE 0x1ad960,*A14+,0x1 +rom:00067682 MOVE *A13(0xffe0),*A14+,0x1 +rom:00067686 CALLA 0x07effa5e +rom:0006768c MOVE A11,A8 +rom:0006768e JR 0x000676c0 +rom:00067690 MOVE *A9(0x40),*A8(0x0),0x1 +rom:00067696 MOVE A14,-*SP,0x1 +rom:00067698 SETF 0x10,0x0,0x0 +rom:0006769a MOVE @0x1ad980,A11,0x0 +rom:000676a0 MOVE A11,*A14+,0x1 +rom:000676a2 MOVI 0x3f566ed0,A5 +rom:000676a8 MOVE A5,*A14+,0x1 +rom:000676aa MOVE A8,*A14+,0x1 +rom:000676ac MOVE @0x1ad990,A5,0x0 +rom:000676b2 MOVE A5,*A14+,0x1 +rom:000676b4 MOVE *A9(0x40),*A14+,0x1 +rom:000676b8 CALLA 0x07f16ca2 +rom:000676be SUB A8,A8 +rom:000676c0 MOVE *SP(0xc0),A14,0x1 +rom:000676c4 MMFM SP,0x2aa0 +rom:000676ca MMTM SP,0x554 diff --git a/xie/ghidra-evidence/import/slot07_op2_6759A.txt b/xie/ghidra-evidence/import/slot07_op2_6759A.txt new file mode 100644 index 0000000..af4b408 --- /dev/null +++ b/xie/ghidra-evidence/import/slot07_op2_6759A.txt @@ -0,0 +1,211 @@ +rom:0006759a MMTM SP,0x554 +rom:0006759e MOVE A14,A13 +rom:000675a0 ADDI 0xe0,A14 +rom:000675a4 MOVE *A13(0xffe0),A11,0x1 +rom:000675a8 MOVE *A11(0x40),A9,0x1 +rom:000675ac SETF 0x10,0x0,0x0 +rom:000675ae MOVE *A9(0x10),A11,0x0 +rom:000675b2 SUBK 0x4,A11 +rom:000675b4 JREQ 0x000675bc +rom:000675b6 MOVK 0x10,A8 +rom:000675b8 JR 0x000676c0 +rom:000675bc MOVE A14,-*SP,0x1 +rom:000675be MOVE *A9(0x40),*A14+,0x1 +rom:000675c2 MOVE *A9(0x60),*A14+,0x1 +rom:000675c6 MOVE A13,A11 +rom:000675c8 ADDI 0x80,A11 +rom:000675cc MOVE A11,*A14+,0x1 +rom:000675ce SUB A7,A7 +rom:000675d0 MOVE A7,*A14+,0x1 +rom:000675d2 MOVE *A13(0xffe0),*A14+,0x1 +rom:000675d6 CALLA 0x07ea6fa0 +rom:000675dc MOVE A8,*A13(0xc0),0x1 +rom:000675e0 MOVE A8,A8 +rom:000675e2 JRNE 0x000676c0 +rom:000675e4 MOVE A7,*A13,0x1 +rom:000675e6 MOVE *A13(0x80),A11,0x1 +rom:000675ea SETF 0x8,0x0,0x0 +rom:000675ec MOVE *A11(0x48),A11,0x0 +rom:000675f0 CMP A11,A7 +rom:000675f2 JRNC 0x00067624 +rom:000675f4 MOVE *A13,A11,0x1 +rom:000675f6 SLL 0x5,A11 +rom:000675f8 ADD A13,A11 +rom:000675fa MOVE *A13(0x80),A7,0x1 +rom:000675fe MOVE *A7(0x160),A5,0x1 +rom:00067602 MOVE *A13,A7,0x1 +rom:00067604 SLL 0x5,A7 +rom:00067606 ADD A7,A5 +rom:00067608 MOVE *A5(0xd8),A7,0x1 +rom:0006760c MOVE *A7(0x1a8),*A11(0x20),0x1 +rom:00067612 MOVE *A13,A11,0x1 +rom:00067614 INC A11 +rom:00067616 MOVE A11,*A13,0x1 +rom:00067618 MOVE *A13(0x80),A7,0x1 +rom:0006761c MOVE *A7(0x48),A5,0x0 +rom:00067620 CMP A5,A11 +rom:00067622 JRC 0x000675f4 +rom:00067624 MOVE A14,-*SP,0x1 +rom:00067626 MOVK 0x1,A11 +rom:00067628 MOVE A11,*A14+,0x1 +rom:0006762a MOVE *A13(0x80),A7,0x1 +rom:0006762e MOVE *A7(0xa0),*A14+,0x1 +rom:00067632 MOVE *A7(0x80),*A14+,0x1 +rom:00067636 MOVE *A7(0x50),A8,0x0 +rom:0006763a MOVE A8,*A14+,0x1 +rom:0006763c MOVE *A7(0x60),A8,0x0 +rom:00067640 MOVE A8,*A14+,0x1 +rom:00067642 MOVE *A7(0x58),A8,0x0 +rom:00067646 MOVE A8,*A14+,0x1 +rom:00067648 MOVE *A7(0xc0),*A14+,0x1 +rom:0006764c MOVE *A7(0xe0),*A14+,0x1 +rom:00067650 MOVE A13,A5 +rom:00067652 ADDK 0x0,A5 +rom:00067654 MOVE A5,*A14+,0x1 +rom:00067656 MOVE *A7(0x40),A8,0x0 +rom:0006765a MOVE A8,*A14+,0x1 +rom:0006765c CALLA 0x07eac7fa +rom:00067662 MOVE A8,*A13(0xa0),0x1 +rom:00067666 MOVE A8,A8 +rom:00067668 JRNE 0x00067690 +rom:0006766a MOVE A14,-*SP,0x1 +rom:0006766c MOVK 0xb,A11 +rom:0006766e MOVE A11,*A14+,0x1 +rom:00067670 MOVE *A9(0x40),*A14+,0x1 +rom:00067674 SETF 0x8,0x0,0x0 +rom:00067676 MOVE *A9(0x8),A8,0x0 +rom:0006767a MOVE A8,*A14+,0x1 +rom:0006767c MOVE 0x1ad960,*A14+,0x1 +rom:00067682 MOVE *A13(0xffe0),*A14+,0x1 +rom:00067686 CALLA 0x07effa5e +rom:0006768c MOVE A11,A8 +rom:0006768e JR 0x000676c0 +rom:00067690 MOVE *A9(0x40),*A8(0x0),0x1 +rom:00067696 MOVE A14,-*SP,0x1 +rom:00067698 SETF 0x10,0x0,0x0 +rom:0006769a MOVE @0x1ad980,A11,0x0 +rom:000676a0 MOVE A11,*A14+,0x1 +rom:000676a2 MOVI 0x3f566ed0,A5 +rom:000676a8 MOVE A5,*A14+,0x1 +rom:000676aa MOVE A8,*A14+,0x1 +rom:000676ac MOVE @0x1ad990,A5,0x0 +rom:000676b2 MOVE A5,*A14+,0x1 +rom:000676b4 MOVE *A9(0x40),*A14+,0x1 +rom:000676b8 CALLA 0x07f16ca2 +rom:000676be SUB A8,A8 +rom:000676c0 MOVE *SP(0xc0),A14,0x1 +rom:000676c4 MMFM SP,0x2aa0 +rom:000676ca MMTM SP,0x554 +rom:000676ce MOVE A14,A13 +rom:000676d0 ADDI 0x80,A14 +rom:000676d4 MOVE *A13(0xffe0),A11,0x1 +rom:000676d8 MOVE *A11(0x40),A9,0x1 +rom:000676dc SETF 0x10,0x0,0x0 +rom:000676de MOVE *A9(0x10),A11,0x0 +rom:000676e2 SUBK 0x6,A11 +rom:000676e4 JREQ 0x000676ec +rom:000676e6 MOVK 0x10,A8 +rom:000676e8 JR 0x000678d0 +rom:000676ec MOVE A14,-*SP,0x1 +rom:000676ee SUB A11,A11 +rom:000676f0 MOVE A11,*A14+,0x1 +rom:000676f2 MOVE *A9(0x60),*A14+,0x1 +rom:000676f6 MOVE A13,*A14+,0x1 +rom:000676f8 MOVE A11,*A14+,0x1 +rom:000676fa MOVE *A13(0xffe0),*A14+,0x1 +rom:000676fe CALLA 0x07ea6fa0 +rom:00067704 MOVE A8,*A13(0x60),0x1 +rom:00067708 MOVE A8,A8 +rom:0006770a JRNE 0x000678d0 +rom:0006770e MOVE *A13(0xffe0),A11,0x1 +rom:00067712 MOVE *A9(0x40),A7,0x1 +rom:00067716 ANDI -0x100000,A7 +rom:0006771c MOVE *A11(0x20),A11,0x1 +rom:00067720 CMP A7,A11 +rom:00067722 JRNE 0x0006774e +rom:00067724 MOVE *A9(0x40),A11,0x1 +rom:00067728 BTST 0x13,A11 +rom:0006772a JRNE 0x0006774e +rom:0006772c MOVE A14,-*SP,0x1 +rom:0006772e SETF 0x10,0x0,0x0 +rom:00067730 MOVE @0x1ad980,A11,0x0 +rom:00067736 MOVE A11,*A14+,0x1 +rom:00067738 MOVE @0x1ad9a0,A7,0x0 +rom:0006773e MOVE A7,*A14+,0x1 +rom:00067740 MOVE *A9(0x40),*A14+,0x1 +rom:00067744 CALLA 0x07f174a4 +rom:0006774a MOVE A8,A7 +rom:0006774c JREQ 0x00067776 +rom:0006774e MOVE A14,-*SP,0x1 +rom:00067750 MOVK 0xe,A11 +rom:00067752 MOVE A11,*A14+,0x1 +rom:00067754 MOVE *A9(0x40),*A14+,0x1 +rom:00067758 SETF 0x8,0x0,0x0 +rom:0006775a MOVE *A9(0x8),A8,0x0 +rom:0006775e MOVE A8,*A14+,0x1 +rom:00067760 MOVE 0x1ad960,*A14+,0x1 +rom:00067766 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006776a CALLA 0x07effa5e +rom:00067770 MOVE A11,A8 +rom:00067772 JR 0x000678d0 +rom:00067776 MOVE A14,-*SP,0x1 +rom:00067778 MOVK 0x10,A11 +rom:0006777a MOVE A11,*A14+,0x1 +rom:0006777c MOVK 0x1,A7 +rom:0006777e MOVE A7,*A14+,0x1 +rom:00067780 CALLA 0x07f63a30 +rom:00067786 MOVE A8,*A13(0x20),0x1 +rom:0006778a MOVE A8,A8 +rom:0006778c JRNE 0x0006779e +rom:0006778e MOVE A14,-*SP,0x1 +rom:00067790 MOVI 0x3f544be8,A8 +rom:00067796 MOVE A8,*A14+,0x1 +rom:00067798 CALLA 0x07f24f78 +rom:0006779e MOVE *A13(0x20),A7,0x1 +rom:000677a2 JRNE 0x000677cc +rom:000677a4 MOVE A14,-*SP,0x1 +rom:000677a6 MOVK 0xb,A11 +rom:000677a8 MOVE A11,*A14+,0x1 +rom:000677aa MOVE *A9(0x40),*A14+,0x1 +rom:000677ae SETF 0x8,0x0,0x0 +rom:000677b0 MOVE *A9(0x8),A8,0x0 +rom:000677b4 MOVE A8,*A14+,0x1 +rom:000677b6 MOVE 0x1ad960,*A14+,0x1 +rom:000677bc MOVE *A13(0xffe0),*A14+,0x1 +rom:000677c0 CALLA 0x07effa5e +rom:000677c6 MOVE A11,A8 +rom:000677c8 JR 0x000678d0 +rom:000677cc MOVK 0x4,A11 +rom:000677ce MOVB *A11,*A7(0x20) +rom:000677d2 MOVK 0x1,A11 +rom:000677d4 SETF 0x10,0x1,0x0 +rom:000677d6 MOVE A11,*A7(0x30),0x0 +rom:000677da MOVE *A13(0x0),*A7(0x40),0x1 +rom:000677e0 MOVE A14,-*SP,0x1 +rom:000677e2 MOVI 0x39,A11 +rom:000677e6 MOVE A11,*A14+,0x1 +rom:000677e8 MOVK 0x1,A11 +rom:000677ea MOVE A11,*A14+,0x1 +rom:000677ec CALLA 0x07f63a30 +rom:000677f2 MOVE A8,*A13(0x40),0x1 +rom:000677f6 MOVE A8,A8 +rom:000677f8 JRNE 0x0006780a +rom:000677fa MOVE A14,-*SP,0x1 +rom:000677fc MOVI 0x3f544c98,A8 +rom:00067802 MOVE A8,*A14+,0x1 +rom:00067804 CALLA 0x07f24f78 +rom:0006780a MOVE *A13(0x40),A11,0x1 +rom:0006780e JRNE 0x00067842 +rom:00067810 MOVE A14,-*SP,0x1 +rom:00067812 MOVK 0xb,A7 +rom:00067814 MOVE A7,*A14+,0x1 +rom:00067816 MOVE A14,-*SP,0x1 +rom:00067818 MOVE *A13(0x20),*A14+,0x1 +rom:0006781c CALLA 0x07eacdda +rom:00067822 MOVE *A9(0x40),*A14+,0x1 +rom:00067826 SETF 0x8,0x0,0x0 +rom:00067828 MOVE *A9(0x8),A8,0x0 +rom:0006782c MOVE A8,*A14+,0x1 +rom:0006782e MOVE 0x1ad960,*A14+,0x1 +rom:00067834 MOVE *A13(0xffe0),*A14+,0x1 +rom:00067838 CALLA 0x07effa5e diff --git a/xie/ghidra-evidence/length_sweep_wire.txt b/xie/ghidra-evidence/length_sweep_wire.txt new file mode 100644 index 0000000..773d90b --- /dev/null +++ b/xie/ghidra-evidence/length_sweep_wire.txt @@ -0,0 +1,46 @@ +minor=0 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=1 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=2 words=1: TIMEOUT (no reply/error) +minor=3 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=4 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=5 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=6 words=1: REPLY seq=2 len=0 bytes=00000000000000000000000000000000 extra=0 +minor=7 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=8 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=9 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=10 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=11 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=12 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=13 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=14 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=15 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=16 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=16 major_op=129 +minor=17 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=17 major_op=129 +minor=18 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=19 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=20 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=21 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=22 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=23 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=23 major_op=129 +minor=24 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=25 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=25 major_op=129 +minor=26 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=26 major_op=129 +minor=27 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=27 major_op=129 +minor=28 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=28 major_op=129 +minor=29 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=29 major_op=129 +minor=30 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=30 major_op=129 +minor=31 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=31 major_op=129 +minor=32 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=32 major_op=129 +minor=33 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=34 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=34 major_op=129 +minor=35 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=35 major_op=129 +minor=36 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=36 major_op=129 +minor=37 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=37 major_op=129 +minor=38 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=38 major_op=129 +minor=39 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=39 major_op=129 +minor=40 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=41 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=41 major_op=129 +minor=42 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=42 major_op=129 +minor=43 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=44 words=1: ERROR code=16 seq=2 bad=0x0 minor_op=0 major_op=129 +minor=45 words=1: ERROR code=1 seq=2 bad=0x0 minor_op=45 major_op=129 diff --git a/xie/ghidra-evidence/listings.txt b/xie/ghidra-evidence/listings.txt new file mode 100644 index 0000000..f3e61ab --- /dev/null +++ b/xie/ghidra-evidence/listings.txt @@ -0,0 +1,194 @@ +Key XIE instruction listings, decoded by Ghidra (tms34010:LE:32:default). +Addresses are Ghidra byte addresses; bit address = 0x3F200000 + addr*8. +A 32-bit immediate in the stream is the *bit* address of its target, so +`MOVI 0x3F5263B0` = the string at file offset 0x64C76. A `CALLA 0x07Exxxxx` +operand is a bit address divided by 8; file offset = operand - 0x7E40000. + + +===== XieExtensionInit (0x64A9C / bit 0x3F5254E0) ===== +rom:00064a9c MMTM SP,0x54 +rom:00064aa0 MOVE A14,A13 +rom:00064aa2 ADDI 0x40,A14 +rom:00064aa6 MOVE A14,-*SP,0x1 +rom:00064aa8 MOVI 0x3f526140,A11 ; closeDownProc = 0x64C28 +rom:00064aae MOVE A11,*A14+,0x1 +rom:00064ab0 MOVI 0x3f525f00,A9 ; swappedMainProc= 0x64BE0 +rom:00064ab6 MOVE A9,*A14+,0x1 +rom:00064ab8 MOVI 0x3f525cc0,A9 ; mainProc = 0x64B98 +rom:00064abe MOVE A9,*A14+,0x1 +rom:00064ac0 SUB A9,A9 ; NumErrors = 0 +rom:00064ac2 MOVE A9,*A14+,0x1 +rom:00064ac4 MOVK 0x3,A9 ; NumEvents = 3 +rom:00064ac6 MOVE A9,*A14+,0x1 +rom:00064ac8 MOVI 0x3f5263b0,A8 ; name = "Xie" @ file 0x64C76 +rom:00064ace MOVE A8,*A14+,0x1 +rom:00064ad0 CALLA 0x07eff36e ; AddExtension @ file 0x0BF36E +rom:00064ad6 MOVE A8,*A13(0x20),0x1 ; save ExtensionEntry* +rom:00064ada MOVE A8,A8 +rom:00064adc JRNE 0x00064af0 ; NULL => failure +rom:00064ade MOVE A14,-*SP,0x1 +rom:00064ae0 MOVI 0x3f5263d0,A8 ; "XieExtensionInit: AddExtension failed\n" +rom:00064ae6 MOVE A8,*A14+,0x1 +rom:00064ae8 CALLA 0x07e6b7a8 +rom:00064aee JR 0x00064b64 + +Success path (0x64AF0..0x64B5E) then caches three fields of the ExtensionEntry: +rom:00064b1e MOVE *A13(0x20),A11,0x1 ; ext +rom:00064b22 MOVE *A11(0x80),A11,0x1 +rom:00064b26 MOVE A11,@0x1ad940,0x1 +rom:00064b2c MOVE *A13(0x20),A11,0x1 +rom:00064b30 MOVE *A11(0x60),A11,0x1 +rom:00064b34 MOVE A11,@0x1ad960,0x1 ; 0x1AD960 = XIE major opcode (129) +rom:00064b3a CALLA 0x07f16ab4 +rom:00064b40 SETF 0x10,0x0,0x0 +rom:00064b42 MOVE A8,@0x1ad980,0x0 +rom:00064b48 CALLA 0x07f16a8a +rom:00064b4e SETF 0x10,0x0,0x0 +rom:00064b50 MOVE A8,@0x1ad990,0x0 +rom:00064b56 CALLA 0x07f16a8a +rom:00064b5c SETF 0x10,0x0,0x0 +rom:00064b5e MOVE A8,@0x1ad9a0,0x0 +rom:00064b64 CALLA 0x07e7f944 ; "Device Init" -- NULL => "Device Init failed" + + +===== XieProc -- the XIE request dispatcher (0x64B98 / bit 0x3F525CC0) ===== +rom:00064b98 MMTM SP,0x54 +rom:00064b9c MOVE A14,A13 +rom:00064b9e MOVE *A13(0xffe0),A11,0x1 ; arg0 = ClientPtr +rom:00064ba2 MOVE *A11(0x40),A9,0x1 ; A9 = client->requestBuffer ("stuff") +rom:00064ba6 SETF 0x8,0x0,0x0 +rom:00064ba8 MOVE *A9(0x8),A11,0x0 ; stuff->opcode = request byte 1 +rom:00064bac CMPI 0x2e,A11 ; 46 +rom:00064bb0 JRNC 0x00064bca ; opcode >= 46 -> protocol error +rom:00064bb2 MOVE A14,-*SP,0x1 +rom:00064bb4 MOVE *A13(0xffe0),*A14+,0x1 +rom:00064bb8 MOVE *A9(0x8),A11,0x0 +rom:00064bbc SLL 0x5,A11 ; *32 bits = 4 bytes per slot +rom:00064bbe ADDI 0xd3f90,A11 ; proc_table, main RAM bit 0xD3F90 +rom:00064bc4 MOVE *A11,A11,0x1 +rom:00064bc6 CALL A11 +rom:00064bc8 JR 0x00064bd6 +rom:00064bca MOVE A14,-*SP,0x1 +rom:00064bcc MOVE *A13(0xffe0),*A14+,0x1 +rom:00064bd0 CALLA 0x07ea4c3c ; dix protocol-error path +rom:00064bd6 MOVE *SP(0x80),A14,0x1 +rom:00064bda MMFM SP,0x2a00 ; returns the handler's A8 to dix + +rom:00064be0 MMTM SP,0x54 ; XieSProc (swapped) 0x64BE0 / 0x3F525F00 +rom:00064be4 MOVE A14,A13 +rom:00064be6 MOVE *A13(0xffe0),A11,0x1 +rom:00064bea MOVE *A11(0x40),A9,0x1 +rom:00064bee SETF 0x8,0x0,0x0 +rom:00064bf0 MOVE *A9(0x8),A11,0x0 +rom:00064bf4 CMPI 0x2e,A11 +rom:00064bf8 JRNC 0x00064c12 +rom:00064bfc MOVE A14,-*SP,0x1 +rom:00064bfe MOVE *A13(0xffe0),*A14+,0x1 +rom:00064c00 MOVE *A9(0x8),A11,0x0 +rom:00064c04 SLL 0x5,A11 +rom:00064c06 ADDI 0xd4550,A11 ; sproc_table, main RAM bit 0xD4550 +rom:00064c0c MOVE *A11,A11,0x1 +rom:00064c0e CALL A11 + + +===== The length check: slot 6 handler (0x68EC6 / bit 0x3F547630) ===== +rom:00068ec6 MMTM SP,0x554 +rom:00068eca MOVE A14,A13 +rom:00068ecc ADDI 0x100,A14 +rom:00068ed0 MOVE *A13(0xffe0),A11,0x1 ; arg0 = client +rom:00068ed4 MOVE *A11(0x40),A9,0x1 ; stuff +rom:00068ed8 SETF 0x10,0x0,0x0 +rom:00068eda MOVE *A9(0x10),A11,0x0 ; stuff->length = CARD16 at byte 2 +rom:00068ede DEC A11 ; length - 1 +rom:00068ee0 JREQ 0x00068ee6 ; == 0 -> length == 1 word +rom:00068ee2 MOVK 0x10,A8 ; else A8 = 16 = BadLength +rom:00068ee4 JR 0x00068f2e ; return it to dix +rom:00068ee6 ... ; body +rom:00068f2c SUB A8,A8 ; Success +rom:00068f2e MOVE *SP(0xc0),A14,0x1 +rom:00068f32 MMFM SP,0x2aa0 + +Same idiom in every handler (verified addresses): + slot 1 0x68A60 MOVE *A9(0x10) / 0x68A64 SUBK 0x2 / 0x68A66 JREQ == 2 + slot 3 0x3FD8C MOVE *A9(0x10) / 0x3FD90 SUBK 0x2 / 0x3FD92 JREQ == 2 + slot 6 0x68EDA MOVE *A9(0x10) / 0x68EDE DEC / 0x68EE0 JREQ == 1 + slot 8 0x668F6 MOVE *A9(0x10) / 0x668FA SUBK 0x3 / 0x668FC JRNC >= 3 + slot 11 0x667CA MOVE *A9(0x10) / 0x667CE SUBK 0x3 / 0x667D0 JREQ == 3 + slot 18 0x6A5B8 MOVE *A9(0x10) / 0x6A5BC SUBK 0x4 / 0x6A5BE JRNC >= 4 + slot 19 0x6A782 MOVE *A9(0x10) / 0x6A786 SUBK 0x8 / 0x6A788 JRNC >= 8 + slot 20 0x6AA6E MOVE *A9(0x10) then CMPI 0x23 / JREQ == 0x23 + slot 21 0x62D54 MOVE *A9(0x10) / 0x62D58 SUBK 0x10 / 0x62D5A JREQ == 16 + slot 43 0x65614 MOVE *A9(0x10) / 0x65618 SUBK 0xa / 0x6561A JREQ == 10 + + +===== ProcNotImplemented 0x64C3C / bit 0x3F5261E0 (table slot for 21 minors) ===== +rom:00064c3c MMTM SP,0x154 +rom:00064c40 MOVE A14,A13 +rom:00064c42 MOVE *A13(0xffe0),A11,0x1 ; client +rom:00064c46 MOVE *A11(0x40),A9,0x1 ; stuff +rom:00064c4a MOVE A14,-*SP,0x1 +rom:00064c4c MOVK 0x1,A7 ; arg = 1 (BadRequest) +rom:00064c4e MOVE A7,*A14+,0x1 +rom:00064c50 SUB A7,A7 +rom:00064c52 MOVE A7,*A14+,0x1 ; arg = 0 (bad value) +rom:00064c54 SETF 0x8,0x0,0x0 +rom:00064c56 MOVE *A9(0x8),A8,0x0 ; stuff->opcode = minor +rom:00064c5a MOVE A8,*A14+,0x1 ; arg = minor opcode +rom:00064c5c MOVE 0x1ad960,*A14+,0x1 ; arg = *(0x1AD960) = XIE major opcode +rom:00064c62 MOVE A11,*A14+,0x1 ; arg = client +rom:00064c64 CALLA 0x07effa5e ; SendErrorToClient @ file 0x0BFA5E +rom:00064c6a MOVK 0x1,A8 ; also returns BadRequest +rom:00064c6c MOVE *SP(0xa0),A14,0x1 +rom:00064c70 MMFM SP,0x2a80 +rom:00064c76 RL B10,B8 ; "Xie" string bytes follow + + +===== LookupPhotos (0x66FA0) -- the BadIDChoice emitter ===== +rom:00066fb0 MOVE A14,-*SP,0x1 +rom:00066fb2 SETF 0x10,0x0,0x0 +rom:00066fb4 MOVE @0x1ad980,A7,0x0 ; lookup-proc table 1 +rom:00066fba MOVE A7,*A14+,0x1 +rom:00066fbc MOVE @0x1ad990,A11,0x0 ; lookup-proc table 2 +rom:00066fc2 MOVE A11,*A14+,0x1 +rom:00066fc4 MOVE *A13(0xff80),*A14+,0x1 ; the resource id +rom:00066fc8 CALLA 0x07f174a4 +rom:00066fce MOVE A8,*A13,0x1 +rom:00066fd0 MOVE A8,A7 +rom:00066fd2 JRNE 0x0006715c ; found -> normal path +rom:00066fd6 MOVE A14,-*SP,0x1 +rom:00066fd8 MOVK 0xe,A11 ; arg = 14 = BadIDChoice +rom:00066fda MOVE A11,*A14+,0x1 +rom:00066fdc MOVE *A13(0xff80),*A14+,0x1 ; arg = the bad resource id + ... (client, *(0x1AD960), stuff->opcode pushed in the same order as above) +rom:0006711c CALLA 0x07effa5e ; SendErrorToClient(...) +rom:00067122 MOVE A11,A8 +rom:00067124 JR 0x00067208 +rom:00067128 MOVI 0x3f544880,A8 ; "LookupPhotos: BadIDChoice coming!" +rom:0006712e MOVE A8,*A14+,0x1 +rom:00067130 CALLA 0x07f24f78 + + +===== AddExtension 0xBF36E -- six arguments, validated ===== +rom:000bf36e MMTM SP,0x154 +rom:000bf374 MOVE *A13(0xff80),A11,0x1 ; arg3 = mainProc +rom:000bf378 JREQ 0x000bf388 ; NULL -> fail +rom:000bf37a MOVE *A13(0xff60),A11,0x1 ; arg4 = swappedMainProc +rom:000bf37e JREQ 0x000bf388 +rom:000bf380 MOVE *A13(0xff40),A11,0x1 ; arg5 = closeDownProc +rom:000bf384 JRNE 0x000bf38e +rom:000bf386 SUB A8,A8 +rom:000bf388 JR 0x000bf560 +rom:000bf38e MOVE @0x21a620,A11,0x1 ; running event count +rom:000bf394 MOVE *A13(0xffc0),A9,0x1 ; arg1 = NumEvents +rom:000bf398 ADD A11,A9 +rom:000bf39a CMPI 0x80,A9 +rom:000bf39e JRGT 0x000bf3b2 ; events would exceed 128 -> fail +rom:000bf3a0 MOVE @0x21a640,A9,0x1 ; running error count +rom:000bf3a6 MOVE *A13(0xffa0),A11,0x1 ; arg2 = NumErrors +rom:000bf3aa ADD A9,A11 +rom:000bf3ac CMPI 0xff,A11 +rom:000bf3b0 JRLE 0x000bf3b8 ; errors would exceed 255 -> fail + +There is no seventh argument: the caller pushes exactly six values, and the callee +never reads an argument slot below arg5 (`A13(0xff40)`) in the code shown above — +so no `MinorOpcodeProc` is registered. diff --git a/xie/ghidra-evidence/mame/run_a_level0_diagnostics.txt b/xie/ghidra-evidence/mame/run_a_level0_diagnostics.txt new file mode 100644 index 0000000..bc57a35 --- /dev/null +++ b/xie/ghidra-evidence/mame/run_a_level0_diagnostics.txt @@ -0,0 +1,26 @@ +Warning: -video none doesn't make much sense without -seconds_to_run +vt1200: screen_update#1 frame=0 clip_y=0..0 screen=1280x901 +XIE: breakpoint at 3F525D40 -> { printf "XIEHIT buf=%08X %04X %04X %04X %04X %04X %04X %04X %04X\n", a9, w@(a9+0), w@(a9+16), w@(a9+32), w@(a9+48), w@(a9+64), w@(a9+80), w@(a9+96), w@(a9+112) ; g } +vt1200: screen_update#2 frame=0 clip_y=1..900 screen=1280x901 +vt1200: scanline#1 line=1 enabled=1 +vt1200: guard#1 frame=0 dump_frame=-1 dump_ram=-1 +vt1200: screen_update#3 frame=1 clip_y=0..0 screen=1280x901 +vt1200: scanline#2 line=0 enabled=1 +vt1200: screen_update#4 frame=1 clip_y=1..1 screen=1280x901 +vt1200: scanline#3 line=1 enabled=1 +vt1200: scanline#4 line=2 enabled=1 +vt1200: guard#2 frame=1 dump_frame=-1 dump_ram=-1 +XIE: frame 100 pc=3FDCE400 +XIE: frame 200 pc=3FDCE400 +XIE: frame 300 pc=3FDCE400 +XIE: frame 400 pc=3FDCE400 +XIE: frame 500 pc=3FDCE400 +XIE: frame 600 pc=3FDCE400 +XIE: frame 700 pc=3FDCE400 +XIE: frame 800 pc=3FDCE400 +XIE: frame 900 pc=3FDCE400 +XIE: frame 1000 pc=3FDCE400 +XIE: frame 1100 pc=3FDCE400 +XIE: frame 1200 pc=3FDCE400 +XIE: done at frame 1200 +Average speed: 870.39% (25 seconds) diff --git a/xie/ghidra-evidence/mame/run_b_os_terminal_manager.txt b/xie/ghidra-evidence/mame/run_b_os_terminal_manager.txt new file mode 100644 index 0000000..d2c1822 --- /dev/null +++ b/xie/ghidra-evidence/mame/run_b_os_terminal_manager.txt @@ -0,0 +1,59 @@ +Warning: -video none doesn't make much sense without -seconds_to_run +vt1200: screen_update#1 frame=0 clip_y=0..0 screen=1280x901 +XIE: breakpoint at 3F525D40 -> { printf "XIEHIT buf=%08X %04X %04X %04X %04X %04X %04X %04X %04X\n", a9, w@(a9+0), w@(a9+16), w@(a9+32), w@(a9+48), w@(a9+64), w@(a9+80), w@(a9+96), w@(a9+112) ; g } +vt1200: screen_update#2 frame=0 clip_y=1..900 screen=1280x901 +vt1200: scanline#1 line=1 enabled=1 +vt1200: guard#1 frame=0 dump_frame=-1 dump_ram=-1 +vt1200: screen_update#3 frame=1 clip_y=0..0 screen=1280x901 +vt1200: scanline#2 line=0 enabled=1 +vt1200: screen_update#4 frame=1 clip_y=1..1 screen=1280x901 +vt1200: scanline#3 line=1 enabled=1 +vt1200: scanline#4 line=2 enabled=1 +vt1200: guard#2 frame=1 dump_frame=-1 dump_ram=-1 +XIE: frame 100 pc=3F579870 +XIE: frame 200 pc=3F350E50 +XIE: frame 300 pc=3F579870 +XIE: frame 400 pc=3F579870 +XIE: frame 500 pc=3F579870 +XIE: frame 600 pc=3F579870 +XIE: frame 700 pc=3F579870 +XIE: frame 800 pc=3F579870 +XIE: frame 900 pc=3F579870 +XIE: frame 1000 pc=3F579870 +XIE: frame 1100 pc=3F579870 +XIE: frame 1200 pc=3F579870 +XIE: frame 1300 pc=3F579870 +XIE: frame 1400 pc=3F579870 +XIE: frame 1500 pc=3F579870 +XIE: frame 1600 pc=3F579870 +XIE: frame 1700 pc=3F579870 +XIE: frame 1800 pc=3F579870 +XIE: frame 1900 pc=3F579870 +XIE: frame 2000 pc=3F579870 +XIE: frame 2100 pc=3F579870 +XIE: frame 2200 pc=3F579870 +XIE: frame 2300 pc=3F579870 +XIE: frame 2400 pc=3F579870 +XIE: frame 2500 pc=3F579870 +XIE: frame 2600 pc=3F579870 +XIE: frame 2700 pc=3F579870 +XIE: frame 2800 pc=3F579870 +XIE: frame 2900 pc=3F579870 +XIE: frame 3000 pc=3F579870 +XIE: frame 3100 pc=3F579870 +XIE: frame 3200 pc=3F579870 +XIE: frame 3300 pc=3F579870 +XIE: frame 3400 pc=3F579870 +XIE: frame 3500 pc=3F579870 +XIE: frame 3600 pc=3F579870 +XIE: frame 3700 pc=3F579870 +XIE: frame 3800 pc=3F579870 +XIE: frame 3900 pc=3F579870 +XIE: frame 4000 pc=3F579870 +XIE: frame 4100 pc=3F579870 +XIE: frame 4200 pc=3F579870 +XIE: frame 4300 pc=3F579870 +XIE: frame 4400 pc=3F579870 +XIE: frame 4500 pc=3F579870 +XIE: done at frame 4500 +Average speed: 256.71% (97 seconds) diff --git a/xie/ghidra-evidence/mame/run_c_scalution_jump.txt b/xie/ghidra-evidence/mame/run_c_scalution_jump.txt new file mode 100644 index 0000000..a2bc7bf --- /dev/null +++ b/xie/ghidra-evidence/mame/run_c_scalution_jump.txt @@ -0,0 +1,24 @@ +Warning: -video none doesn't make much sense without -seconds_to_run +vt1200: screen_update#1 frame=0 clip_y=0..0 screen=1280x901 +XIE: breakpoint at 3F525D40 -> { printf "XIEHIT buf=%08X %04X %04X %04X %04X %04X %04X %04X %04X\n", a9, w@(a9+0), w@(a9+16), w@(a9+32), w@(a9+48), w@(a9+64), w@(a9+80), w@(a9+96), w@(a9+112) ; g } +XIE: entry jump armed at 3FDCE400 -> 3F1AF540 +vt1200: screen_update#2 frame=0 clip_y=1..900 screen=1280x901 +vt1200: scanline#1 line=1 enabled=1 +vt1200: guard#1 frame=0 dump_frame=-1 dump_ram=-1 +vt1200: screen_update#3 frame=1 clip_y=0..0 screen=1280x901 +vt1200: scanline#2 line=0 enabled=1 +vt1200: screen_update#4 frame=1 clip_y=1..1 screen=1280x901 +vt1200: scanline#3 line=1 enabled=1 +vt1200: scanline#4 line=2 enabled=1 +vt1200: guard#2 frame=1 dump_frame=-1 dump_ram=-1 +XIE: frame 100 pc=3F2082C0 +XIE: frame 200 pc=3F2082C0 +XIE: frame 300 pc=3F208400 +XIE: frame 400 pc=3F208490 +XIE: frame 500 pc=3F208530 +XIE: frame 600 pc=3F2085D0 +XIE: frame 700 pc=3F208530 +XIE: frame 800 pc=3F208530 +XIE: frame 900 pc=3F2082C0 +XIE: done at frame 900 +Average speed: 842.18% (19 seconds) diff --git a/xie/ghidra-evidence/mame/run_d_control.txt b/xie/ghidra-evidence/mame/run_d_control.txt new file mode 100644 index 0000000..b09aae3 --- /dev/null +++ b/xie/ghidra-evidence/mame/run_d_control.txt @@ -0,0 +1,2 @@ +control: XIE_TRACE=0x3FDCE400 (menu idle PC), 60 frames +result: 4634965 breakpoint hits in debug.log (mechanism works) diff --git a/xie/ghidra-evidence/mame/scalution_register_writes.txt b/xie/ghidra-evidence/mame/scalution_register_writes.txt new file mode 100644 index 0000000..241529a --- /dev/null +++ b/xie/ghidra-evidence/mame/scalution_register_writes.txt @@ -0,0 +1,69 @@ +rom:00036b02 MOVB A9,0xca2b0 +rom:00036b08 MOVB *A13(0x3e0),*A7 +rom:00036b0c MOVB A7,0xca2c0 +rom:00036b12 MOVB *A13(0x3f0),*A7 +rom:00036b16 MOVB A7,0xca2d0 +rom:00036b1c MOVB *A13(0x400),*A7 +rom:00036b20 MOVB A7,0xca2e0 +rom:00036b26 MOVB *A13(0x410),*A7 +rom:00036b2a MOVB A7,0xca2f0 +rom:00036b30 MOVB *A13(0x420),*A7 +rom:00036b34 MOVB A7,0xca300 +rom:00036b3a MOVB *A13(0x430),*A7 +rom:00036b3e MOVB A7,0xca310 +rom:00036b44 MOVB *A13(0x440),*A7 +rom:00036b48 MOVB A7,0xca320 +rom:00036b4e MOVI 0xca3a8,A7 +rom:00036b54 MOVE A7,*A13(0x460),0x1 +rom:00036b58 MOVE A14,-*SP,0x1 +rom:00036b5a MOVE A13,A9 +rom:00036b5c ADDI 0x450,A9 +rom:00036b60 MOVE A9,*A14+,0x1 +rom:00036b62 MOVE A7,*A14+,0x1 +rom:00036b64 MOVE *A13(0x3b0),*A14+,0x1 +rom:00036b68 MOVE *A13(0x390),*A14+,0x1 +rom:00036b6c MOVE *A13(0x370),*A14+,0x1 +rom:00036b70 MOVE *A13(0x350),*A14+,0x1 +rom:00036b74 CALLA 0x07f634d4 +rom:00036b7a SUB A11,A11 +rom:00036b7c MOVB A11,0xca330 +rom:00036b82 SETF 0x8,0x0,0x0 +rom:00036b84 MOVE *A13(0x450),A9,0x0 +rom:00036b88 MOVB A9,0xca340 +rom:00036b8e MOVB A9,0xca350 +rom:00036b94 MOVE *A13(0x330),A7,0x1 +rom:00036b98 NEG A7 +rom:00036b9a DEC A7 +rom:00036b9c SETF 0x10,0x0,0x0 +rom:00036b9e MOVE A7,*A13(0x50),0x0 +rom:00036ba2 MOVE *A13(0x50),A7,0x0 +rom:00036ba6 SRL 0x18,A7 +rom:00036ba8 ANDI 0xff,A7 +rom:00036bae MOVB A7,0xca270 +rom:00036bb4 MOVE *A13(0x50),A7,0x0 +rom:00036bb8 ANDI 0xff,A7 +rom:00036bbe MOVB A7,0xca280 +rom:00036bc4 MOVE *A13(0x320),A7,0x0 +rom:00036bc8 NEG A7 +rom:00036bca MOVE A7,*A13(0x50),0x0 +rom:00036bce MOVE *A13(0x50),A7,0x0 +rom:00036bd2 SRL 0x18,A7 +rom:00036bd4 ANDI 0xff,A7 +rom:00036bda MOVB A7,0xca290 +rom:00036be0 MOVE *A13(0x50),A7,0x0 +rom:00036be4 ANDI 0xff,A7 +rom:00036bea MOVB A7,0xca2a0 +rom:00036bf0 MOVI 0xff,A7 +rom:00036bf4 MOVB A7,0xca380 +rom:00036bfa SUBK 0x10,A7 +rom:00036bfc MOVB A7,0xca390 +rom:00036c02 MOVE A11,@0x5600100,0x0 +rom:00036c08 MOVI 0x248,A7 +rom:00036c0c MOVE A7,@0x5600020,0x0 +rom:00036c12 MOVI 0x32,A7 +rom:00036c16 MOVE A7,@0x5600030,0x0 +rom:00036c1c MOVK 0x1,A7 +rom:00036c1e MOVE A7,@0x5600100,0x0 +rom:00036c24 MOVE A7,*A13(0x80),0x1 +rom:00036c28 SETF 0x8,0x0,0x0 +rom:00036c2a MOVE @0xca230,A11,0x0 diff --git a/xie/ghidra-evidence/mame/scalution_test_head.txt b/xie/ghidra-evidence/mame/scalution_test_head.txt new file mode 100644 index 0000000..d610e36 --- /dev/null +++ b/xie/ghidra-evidence/mame/scalution_test_head.txt @@ -0,0 +1,46 @@ +rom:00035ea8 MMTM SP,0x154 +rom:00035eac MOVE A14,A13 +rom:00035eae ADDI 0x6e0,A14 +rom:00035eb2 SUB A11,A11 +rom:00035eb4 MOVE A11,*A13(0x520),0x1 +rom:00035eb8 MOVE A11,*A13(0x540),0x1 +rom:00035ebc MOVE A11,*A13(0x560),0x1 +rom:00035ec0 MOVE A11,*A13(0x580),0x1 +rom:00035ec4 MOVE A11,*A13(0x5a0),0x1 +rom:00035ec8 MOVE A11,*A13(0x5c0),0x1 +rom:00035ecc CALLA 0x07f67f38 +rom:00035ed2 MOVE A8,@0xa5f00,0x1 +rom:00035ed8 JR 0x00035f08 +rom:00035eda SUB A11,A11 +rom:00035edc MOVB A11,*A13 +rom:00035ede JR 0x00035f22 +rom:00035ee0 MOVK 0x1,A11 +rom:00035ee2 MOVB A11,*A13 +rom:00035ee4 JR 0x00035f22 +rom:00035ee6 MOVK 0x3,A11 +rom:00035ee8 MOVB A11,*A13 +rom:00035eea JR 0x00035f22 +rom:00035eec MOVK 0x5,A11 +rom:00035eee MOVB A11,*A13 +rom:00035ef0 JR 0x00035f22 +rom:00035ef2 MOVE A14,-*SP,0x1 +rom:00035ef4 MOVI 0x3f3b8ab0,A8 +rom:00035efa MOVE A8,*A14+,0x1 +rom:00035efc CALLA 0x07f24f78 +rom:00035f02 MOVK 0x2,A8 +rom:00035f04 JR 0x0003714c +rom:00035f08 MOVE *A13(0xffe0),A11,0x1 +rom:00035f0c SETF 0x8,0x0,0x0 +rom:00035f0e MOVE *A11(0x630),A8,0x0 +rom:00035f12 JREQ 0x00035eec +rom:00035f14 DEC A8 +rom:00035f16 JREQ 0x00035eda +rom:00035f18 DEC A8 +rom:00035f1a JREQ 0x00035ee0 +rom:00035f1c DEC A8 +rom:00035f1e JREQ 0x00035ee6 +rom:00035f20 JR 0x00035ef2 +rom:00035f22 MOVE *A13(0xffe0),A9,0x1 +rom:00035f26 MOVB *A11,*A9(0x630) +rom:00035f2a MOVE *A9(0x610),A9,0x1 +rom:00035f2e JRNE 0x00035f4e diff --git a/xie/ghidra-evidence/pipeline/create_slot8_op12.txt b/xie/ghidra-evidence/pipeline/create_slot8_op12.txt new file mode 100644 index 0000000..24dad60 --- /dev/null +++ b/xie/ghidra-evidence/pipeline/create_slot8_op12.txt @@ -0,0 +1,190 @@ +rom:000678da MMTM SP,0x154 +rom:000678de MOVE A14,A13 +rom:000678e0 ADDI 0x40,A14 +rom:000678e4 SUB A11,A11 +rom:000678e6 MOVE A11,*A13(0x20),0x1 +rom:000678ea MOVE *A13(0xffe0),A7,0x1 +rom:000678ee MOVE *A7(0x40),A9,0x1 +rom:000678f2 SETF 0x10,0x0,0x0 +rom:000678f4 MOVE *A9(0x10),A7,0x0 +rom:000678f8 SUBK 0xc,A7 +rom:000678fa JREQ 0x00067902 +rom:000678fc MOVK 0x10,A8 +rom:000678fe JR 0x00067b3c +rom:00067902 MOVE *A9(0x60),A7,0x1 +rom:00067906 JREQ 0x0006790e +rom:00067908 MOVE *A9(0x80),A7,0x1 +rom:0006790c JRNE 0x00067936 +rom:0006790e MOVE A14,-*SP,0x1 +rom:00067910 MOVK 0x2,A7 +rom:00067912 MOVE A7,*A14+,0x1 +rom:00067914 MOVE *A9(0x40),*A14+,0x1 +rom:00067918 SETF 0x8,0x0,0x0 +rom:0006791a MOVE *A9(0x8),A8,0x0 +rom:0006791e MOVE A8,*A14+,0x1 +rom:00067920 MOVE 0x1ad960,*A14+,0x1 +rom:00067926 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006792a CALLA 0x07effa5e +rom:00067930 MOVE A7,A8 +rom:00067932 JR 0x00067b3c +rom:00067936 MOVE *A13(0xffe0),A7,0x1 +rom:0006793a MOVE *A9(0x40),A11,0x1 +rom:0006793e ANDI -0x100000,A11 +rom:00067944 MOVE *A7(0x20),A7,0x1 +rom:00067948 CMP A11,A7 +rom:0006794a JRNE 0x00067974 +rom:0006794c MOVE *A9(0x40),A11,0x1 +rom:00067950 BTST 0x13,A11 +rom:00067952 JRNE 0x00067974 +rom:00067954 MOVE A14,-*SP,0x1 +rom:00067956 MOVE @0x1ad980,A11,0x0 +rom:0006795c MOVE A11,*A14+,0x1 +rom:0006795e MOVE @0x1ad990,A7,0x0 +rom:00067964 MOVE A7,*A14+,0x1 +rom:00067966 MOVE *A9(0x40),*A14+,0x1 +rom:0006796a CALLA 0x07f174a4 +rom:00067970 MOVE A8,A7 +rom:00067972 JREQ 0x0006799c +rom:00067974 MOVE A14,-*SP,0x1 +rom:00067976 MOVK 0xe,A11 +rom:00067978 MOVE A11,*A14+,0x1 +rom:0006797a MOVE *A9(0x40),*A14+,0x1 +rom:0006797e SETF 0x8,0x0,0x0 +rom:00067980 MOVE *A9(0x8),A8,0x0 +rom:00067984 MOVE A8,*A14+,0x1 +rom:00067986 MOVE 0x1ad960,*A14+,0x1 +rom:0006798c MOVE *A13(0xffe0),*A14+,0x1 +rom:00067990 CALLA 0x07effa5e +rom:00067996 MOVE A11,A8 +rom:00067998 JR 0x00067b3c +rom:0006799c MOVE A14,-*SP,0x1 +rom:0006799e MOVE *A9(0x20),A11,0x1 +rom:000679a2 SUBK 0x2,A11 +rom:000679a4 MOVK 0x1,A11 +rom:000679a6 JREQ 0x000679aa +rom:000679a8 SUB A11,A11 +rom:000679aa MOVE A11,*A14+,0x1 +rom:000679ac MOVE *A9(0x80),*A14+,0x1 +rom:000679b0 MOVE *A9(0x60),*A14+,0x1 +rom:000679b4 SETF 0x8,0x0,0x0 +rom:000679b6 MOVE *A9(0x160),A8,0x0 +rom:000679ba MOVE A8,*A14+,0x1 +rom:000679bc MOVE *A9(0x158),A8,0x0 +rom:000679c0 MOVE A8,*A14+,0x1 +rom:000679c2 MOVE *A9(0x150),A8,0x0 +rom:000679c6 MOVE A8,*A14+,0x1 +rom:000679c8 ADDI 0x40,A14 +rom:000679cc MOVE A14,-*SP,0x1 +rom:000679ce MOVE A9,A11 +rom:000679d0 ADDI 0xa0,A11 +rom:000679d4 MOVE A11,*A14+,0x1 +rom:000679d6 CALLA 0x07f638c2 +rom:000679dc MOVE A9,A11 +rom:000679de ADDI 0xe0,A11 +rom:000679e2 MOVE A11,*A14+,0x1 +rom:000679e4 SETF 0x8,0x0,0x0 +rom:000679e6 MOVE *A9(0x148),A8,0x0 +rom:000679ea MOVE A8,*A14+,0x1 +rom:000679ec CALLA 0x07eaca82 +rom:000679f2 MOVE A8,*A13,0x1 +rom:000679f4 MOVE A8,A7 +rom:000679f6 JRNE 0x00067a20 +rom:000679f8 MOVE A14,-*SP,0x1 +rom:000679fa MOVK 0xb,A11 +rom:000679fc MOVE A11,*A14+,0x1 +rom:000679fe MOVE *A9(0x40),*A14+,0x1 +rom:00067a02 SETF 0x8,0x0,0x0 +rom:00067a04 MOVE *A9(0x8),A8,0x0 +rom:00067a08 MOVE A8,*A14+,0x1 +rom:00067a0a MOVE 0x1ad960,*A14+,0x1 +rom:00067a10 MOVE *A13(0xffe0),*A14+,0x1 +rom:00067a14 CALLA 0x07effa5e +rom:00067a1a MOVE A11,A8 +rom:00067a1c JR 0x00067b3c +rom:00067a20 MOVE *A9(0x20),A11,0x1 +rom:00067a24 DSJ A11,0x00067afc +rom:00067a28 MOVE A14,-*SP,0x1 +rom:00067a2a MOVK 0x14,A11 +rom:00067a2c MOVE A11,*A14+,0x1 +rom:00067a2e MOVK 0x1,A11 +rom:00067a30 MOVE A11,*A14+,0x1 +rom:00067a32 CALLA 0x07f63a30 +rom:00067a38 MOVE A8,*A13(0x20),0x1 +rom:00067a3c MOVE A8,A8 +rom:00067a3e JRNE 0x00067a50 +rom:00067a40 MOVE A14,-*SP,0x1 +rom:00067a42 MOVI 0x3f544b10,A8 +rom:00067a48 MOVE A8,*A14+,0x1 +rom:00067a4a CALLA 0x07f24f78 +rom:00067a50 MOVE *A13(0x20),A11,0x1 +rom:00067a54 JRNE 0x00067a88 +rom:00067a56 MOVE A14,-*SP,0x1 +rom:00067a58 MOVK 0xb,A7 +rom:00067a5a MOVE A7,*A14+,0x1 +rom:00067a5c MOVE A14,-*SP,0x1 +rom:00067a5e MOVE *A13(0x0),*A14+,0x1 +rom:00067a62 CALLA 0x07eacdda +rom:00067a68 MOVE *A9(0x40),*A14+,0x1 +rom:00067a6c SETF 0x8,0x0,0x0 +rom:00067a6e MOVE *A9(0x8),A8,0x0 +rom:00067a72 MOVE A8,*A14+,0x1 +rom:00067a74 MOVE 0x1ad960,*A14+,0x1 +rom:00067a7a MOVE *A13(0xffe0),*A14+,0x1 +rom:00067a7e CALLA 0x07effa5e +rom:00067a84 MOVE A7,A8 +rom:00067a86 JR 0x00067b3c +rom:00067a88 MOVK 0x1,A7 +rom:00067a8a MOVB *A7,*A11(0x20) +rom:00067a8e SETF 0x10,0x1,0x0 +rom:00067a90 MOVE A7,*A11(0x30),0x0 +rom:00067a94 CALLA 0x07f63b48 +rom:00067a9a MOVE A8,*A11(0x80),0x1 +rom:00067a9e MOVE *A11(0x80),A7,0x1 +rom:00067aa2 JREQ 0x00067aba +rom:00067aa4 MOVE A14,-*SP,0x1 +rom:00067aa6 SUB A7,A7 +rom:00067aa8 MOVE A7,*A14+,0x1 +rom:00067aaa MOVE *A13(0x0),*A14+,0x1 +rom:00067aae MOVE A11,*A14+,0x1 +rom:00067ab0 CALLA 0x07ea72a4 +rom:00067ab6 MOVE A8,A8 +rom:00067ab8 JRNE 0x00067af6 +rom:00067aba MOVE A14,-*SP,0x1 +rom:00067abc MOVK 0xb,A7 +rom:00067abe MOVE A7,*A14+,0x1 +rom:00067ac0 MOVE A14,-*SP,0x1 +rom:00067ac2 MOVE *A13(0x0),*A14+,0x1 +rom:00067ac6 CALLA 0x07eacdda +rom:00067acc MOVE A14,-*SP,0x1 +rom:00067ace MOVE A11,*A14+,0x1 +rom:00067ad0 CALLA 0x07eacdda +rom:00067ad6 MOVE *A9(0x40),*A14+,0x1 +rom:00067ada SETF 0x8,0x0,0x0 +rom:00067adc MOVE *A9(0x8),A8,0x0 +rom:00067ae0 MOVE A8,*A14+,0x1 +rom:00067ae2 MOVE 0x1ad960,*A14+,0x1 +rom:00067ae8 MOVE *A13(0xffe0),*A14+,0x1 +rom:00067aec CALLA 0x07effa5e +rom:00067af2 MOVE A7,A8 +rom:00067af4 JR 0x00067b3c +rom:00067af6 MOVE *A11(0x40),*A11(0x60),0x1 +rom:00067afc MOVE *A13(0x20),A11,0x1 +rom:00067b00 JRNE 0x00067b04 +rom:00067b02 MOVE *A13,A11,0x1 +rom:00067b04 MOVE *A9(0x40),*A11(0x0),0x1 +rom:00067b0a MOVE A14,-*SP,0x1 +rom:00067b0c SETF 0x10,0x0,0x0 +rom:00067b0e MOVE @0x1ad980,A11,0x0 +rom:00067b14 MOVE A11,*A14+,0x1 +rom:00067b16 MOVI 0x3f566ed0,A7 +rom:00067b1c MOVE A7,*A14+,0x1 +rom:00067b1e MOVE *A13(0x20),A7,0x1 +rom:00067b22 JRNE 0x00067b26 +rom:00067b24 MOVE *A13,A7,0x1 +rom:00067b26 MOVE A7,*A14+,0x1 +rom:00067b28 MOVE @0x1ad990,A7,0x0 +rom:00067b2e MOVE A7,*A14+,0x1 +rom:00067b30 MOVE *A9(0x40),*A14+,0x1 +rom:00067b34 CALLA 0x07f16ca2 +rom:00067b3a SUB A8,A8 +rom:00067b3c MOVE *SP(0xa0),A14,0x1 diff --git a/xie/ghidra-evidence/pipeline/dd_input_6B640.txt b/xie/ghidra-evidence/pipeline/dd_input_6B640.txt new file mode 100644 index 0000000..2b80bd1 --- /dev/null +++ b/xie/ghidra-evidence/pipeline/dd_input_6B640.txt @@ -0,0 +1,125 @@ +rom:0006b640 MMTM SP,0x154 +rom:0006b644 MOVE A14,A13 +rom:0006b646 ADDI 0x230,A14 +rom:0006b64a JR 0x0006b834 +rom:0006b64e SUB A11,A11 +rom:0006b650 MOVE A11,*A13(0x1f0),0x1 +rom:0006b654 MOVE *A13(0xffe0),A9,0x1 +rom:0006b658 MOVE *A13(0xffa0),A11,0x1 +rom:0006b65c SLL 0x5,A11 +rom:0006b65e ADD A9,A11 +rom:0006b660 MOVE *A11(0x160),A11,0x1 +rom:0006b664 MOVE A13,A8 +rom:0006b666 MOVK 0xe,A9 +rom:0006b668 MOVE *A11+,*A8+,0x1 +rom:0006b66a DSJS A9,0x0006b668 +rom:0006b66c MOVB *A11,*A8 +rom:0006b66e MOVE *A13(0x1f0),A11,0x1 +rom:0006b672 SUBK 0x3,A11 +rom:0006b674 JRNC 0x0006b84c +rom:0006b678 MOVE *A13(0xffc0),A11,0x1 +rom:0006b67c MOVE *A13(0x1f0),A9,0x1 +rom:0006b680 SLL 0x5,A9 +rom:0006b682 ADD A11,A9 +rom:0006b684 MOVE *A9(0xd8),A9,0x1 +rom:0006b688 JREQ 0x0006b84c +rom:0006b68c MOVE A14,-*SP,0x1 +rom:0006b68e MOVE *A13(0x1f0),*A14+,0x1 +rom:0006b692 MOVE *A13(0xffa0),*A14+,0x1 +rom:0006b696 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006b69a MOVE *A13(0xffc0),*A14+,0x1 +rom:0006b69e MOVE A13,*A14+,0x1 +rom:0006b6a0 CALLA 0x07eac356 +rom:0006b6a6 MOVE *A13(0xffe0),A11,0x1 +rom:0006b6aa MOVE *A13(0x1f0),A9,0x1 +rom:0006b6ae SLL 0x5,A9 +rom:0006b6b0 ADD A11,A9 +rom:0006b6b2 MOVE *A9(0x100),A9,0x1 +rom:0006b6b6 JRNE 0x0006b6ca +rom:0006b6b8 MOVE *A13(0xffc0),A9,0x1 +rom:0006b6bc MOVE *A13(0x1f0),A11,0x1 +rom:0006b6c0 SLL 0x5,A11 +rom:0006b6c2 ADD A9,A11 +rom:0006b6c4 MOVE *A11(0xd8),A11,0x1 +rom:0006b6c8 JR 0x0006b6dc +rom:0006b6ca MOVE *A13(0x1f0),A9,0x1 +rom:0006b6ce SLL 0x5,A9 +rom:0006b6d0 ADD A11,A9 +rom:0006b6d2 MOVE *A9(0x100),A9,0x1 +rom:0006b6d6 MOVE A9,A11 +rom:0006b6d8 ADDI 0xa0,A11 +rom:0006b6dc MOVE A11,*A13(0x1d0),0x1 +rom:0006b6e0 MOVE A14,-*SP,0x1 +rom:0006b6e2 MOVK 0x1,A9 +rom:0006b6e4 MOVE A9,*A14+,0x1 +rom:0006b6e6 MOVE A11,*A14+,0x1 +rom:0006b6e8 MOVE A13,*A14+,0x1 +rom:0006b6ea CALLA 0x07e80008 +rom:0006b6f0 MOVE A8,*A13(0x210),0x1 +rom:0006b6f4 MOVE A8,A8 +rom:0006b6f6 JRNE 0x0006b84e +rom:0006b6fa SETF 0x10,0x0,0x0 +rom:0006b6fc MOVE *A13,A7,0x0 +rom:0006b6fe MOVE *A13(0x168),A9,0x1 +rom:0006b702 ADD A7,A9 +rom:0006b704 MOVE A9,*A13(0x168),0x1 +rom:0006b708 MOVE *A13(0xffe0),A7,0x1 +rom:0006b70c MOVE *A13(0x1f0),A9,0x1 +rom:0006b710 SLL 0x5,A9 +rom:0006b712 ADD A7,A9 +rom:0006b714 MOVE *A9(0x100),A9,0x1 +rom:0006b718 JREQ 0x0006b73a +rom:0006b71a MOVE A14,-*SP,0x1 +rom:0006b71c MOVE *A13(0xffa0),*A14+,0x1 +rom:0006b720 MOVE *A13(0x1f0),*A14+,0x1 +rom:0006b724 MOVE A7,*A14+,0x1 +rom:0006b726 MOVE *A13(0xffc0),*A14+,0x1 +rom:0006b72a CALLA 0x07eab858 +rom:0006b730 MOVE A8,*A13(0x210),0x1 +rom:0006b734 MOVE A8,A9 +rom:0006b736 JRNE 0x0006b84e +rom:0006b73a MOVE *A13(0x1f0),A9,0x1 +rom:0006b73e INC A9 +rom:0006b740 MOVE A9,*A13(0x1f0),0x1 +rom:0006b744 SUBK 0x3,A9 +rom:0006b746 JRNC 0x0006b84c +rom:0006b74a MOVE *A13(0xffc0),A9,0x1 +rom:0006b74e MOVE *A13(0x1f0),A7,0x1 +rom:0006b752 SLL 0x5,A7 +rom:0006b754 ADD A9,A7 +rom:0006b756 MOVE *A7(0xd8),A7,0x1 +rom:0006b75a JRNE 0x0006b68c +rom:0006b75c JR 0x0006b84c +rom:0006b75e MOVE *A13(0xffe0),A11,0x1 +rom:0006b762 MOVE *A13(0xffa0),A9,0x1 +rom:0006b766 SLL 0x5,A9 +rom:0006b768 ADD A11,A9 +rom:0006b76a MOVE *A9(0x100),A9,0x1 +rom:0006b76e JRNE 0x0006b782 +rom:0006b770 MOVE *A13(0xffc0),A9,0x1 +rom:0006b774 MOVE *A13(0xffa0),A7,0x1 +rom:0006b778 SLL 0x5,A7 +rom:0006b77a ADD A9,A7 +rom:0006b77c MOVE *A7(0xd8),A7,0x1 +rom:0006b780 JR 0x0006b794 +rom:0006b782 MOVE *A13(0xffa0),A9,0x1 +rom:0006b786 SLL 0x5,A9 +rom:0006b788 ADD A11,A9 +rom:0006b78a MOVE *A9(0x100),A9,0x1 +rom:0006b78e MOVE A9,A7 +rom:0006b790 ADDI 0xa0,A7 +rom:0006b794 MOVE A7,*A13(0x1d0),0x1 +rom:0006b798 MOVE A14,-*SP,0x1 +rom:0006b79a MOVK 0x1,A9 +rom:0006b79c MOVE A9,*A14+,0x1 +rom:0006b79e MOVE A7,*A14+,0x1 +rom:0006b7a0 MOVE *A13(0xffa0),A9,0x1 +rom:0006b7a4 SLL 0x5,A9 +rom:0006b7a6 ADD A11,A9 +rom:0006b7a8 MOVE *A9(0x160),*A14+,0x1 +rom:0006b7ac CALLA 0x07e80008 +rom:0006b7b2 MOVE A8,*A13(0x210),0x1 +rom:0006b7b6 MOVE A8,A9 +rom:0006b7b8 JRNE 0x0006b84e +rom:0006b7ba MOVE *A13(0xffa0),A7,0x1 +rom:0006b7be SLL 0x5,A7 diff --git a/xie/ghidra-evidence/pipeline/export_slot21.txt b/xie/ghidra-evidence/pipeline/export_slot21.txt new file mode 100644 index 0000000..8ef2885 --- /dev/null +++ b/xie/ghidra-evidence/pipeline/export_slot21.txt @@ -0,0 +1,293 @@ +rom:00062d40 MMTM SP,0x554 +rom:00062d44 MOVE A14,A13 +rom:00062d46 ADDI 0x160,A14 +rom:00062d4a MOVE *A13(0xffe0),A11,0x1 +rom:00062d4e MOVE *A11(0x40),A9,0x1 +rom:00062d52 SETF 0x10,0x0,0x0 +rom:00062d54 MOVE *A9(0x10),A11,0x0 +rom:00062d58 SUBK 0x10,A11 +rom:00062d5a JREQ 0x00062d62 +rom:00062d5c MOVK 0x10,A8 +rom:00062d5e JR 0x000630ea +rom:00062d62 MOVE A14,-*SP,0x1 +rom:00062d64 SUB A11,A11 +rom:00062d66 MOVE A11,*A14+,0x1 +rom:00062d68 MOVE *A9(0x20),*A14+,0x1 +rom:00062d6c MOVE A13,A7 +rom:00062d6e ADDK 0x0,A7 +rom:00062d70 MOVE A7,*A14+,0x1 +rom:00062d72 MOVE A13,*A14+,0x1 +rom:00062d74 MOVE *A13(0xffe0),*A14+,0x1 +rom:00062d78 CALLA 0x07ea6fa0 +rom:00062d80 GETPC A0 +rom:00062d82 MOVE A8,A8 +rom:00062d84 JRNE 0x000630ea +rom:00062d88 MOVE *A13(0x20),A11,0x1 +rom:00062d8c SETF 0x1,0x0,0x0 +rom:00062d8e MOVE *A11(0x28),A7,0x0 +rom:00062d92 JRNE 0x00062dbc +rom:00062d94 MOVE A14,-*SP,0x1 +rom:00062d96 MOVK 0x8,A7 +rom:00062d98 MOVE A7,*A14+,0x1 +rom:00062d9a MOVE *A9(0x20),*A14+,0x1 +rom:00062d9e SETF 0x8,0x0,0x0 +rom:00062da0 MOVE *A9(0x8),A8,0x0 +rom:00062da4 MOVE A8,*A14+,0x1 +rom:00062da6 MOVE 0x1ad960,*A14+,0x1 +rom:00062dac MOVE *A13(0xffe0),*A14+,0x1 +rom:00062db0 CALLA 0x07effa5e +rom:00062db6 MOVE A7,A8 +rom:00062db8 JR 0x000630ea +rom:00062dbc MOVE *A9(0x80),A7,0x1 +rom:00062dc0 MOVE *A11(0x80),A11,0x1 +rom:00062dc4 CMP A11,A7 +rom:00062dc6 JRC 0x00062df4 +rom:00062dc8 MOVE A14,-*SP,0x1 +rom:00062dca MOVK 0x2,A11 +rom:00062dcc MOVE A11,*A14+,0x1 +rom:00062dce MOVE *A13(0x20),A7,0x1 +rom:00062dd2 MOVE *A7(0x0),*A14+,0x1 +rom:00062dd6 SETF 0x8,0x0,0x0 +rom:00062dd8 MOVE *A9(0x8),A8,0x0 +rom:00062ddc MOVE A8,*A14+,0x1 +rom:00062dde MOVE 0x1ad960,*A14+,0x1 +rom:00062de4 MOVE *A13(0xffe0),*A14+,0x1 +rom:00062de8 CALLA 0x07effa5e +rom:00062dee MOVE A11,A8 +rom:00062df0 JR 0x000630ea +rom:00062df4 MOVE *A13(0x20),A11,0x1 +rom:00062df8 MOVE *A9(0xa0),A7,0x1 +rom:00062dfc MOVE *A11(0xa0),A11,0x1 +rom:00062e00 CMP A11,A7 +rom:00062e02 JRC 0x00062e30 +rom:00062e04 MOVE A14,-*SP,0x1 +rom:00062e06 MOVK 0x2,A11 +rom:00062e08 MOVE A11,*A14+,0x1 +rom:00062e0a MOVE *A13(0x20),A7,0x1 +rom:00062e0e MOVE *A7(0x0),*A14+,0x1 +rom:00062e12 SETF 0x8,0x0,0x0 +rom:00062e14 MOVE *A9(0x8),A8,0x0 +rom:00062e18 MOVE A8,*A14+,0x1 +rom:00062e1a MOVE 0x1ad960,*A14+,0x1 +rom:00062e20 MOVE *A13(0xffe0),*A14+,0x1 +rom:00062e24 CALLA 0x07effa5e +rom:00062e2a MOVE A11,A8 +rom:00062e2c JR 0x000630ea +rom:00062e30 MOVE *A9(0xc0),A11,0x1 +rom:00062e34 JREQ 0x00062e3c +rom:00062e36 MOVE *A9(0xe0),A11,0x1 +rom:00062e3a JRNE 0x00062e68 +rom:00062e3c MOVE A14,-*SP,0x1 +rom:00062e3e MOVK 0x2,A11 +rom:00062e40 MOVE A11,*A14+,0x1 +rom:00062e42 MOVE *A13(0x20),A7,0x1 +rom:00062e46 MOVE *A7(0x0),*A14+,0x1 +rom:00062e4a SETF 0x8,0x0,0x0 +rom:00062e4c MOVE *A9(0x8),A8,0x0 +rom:00062e50 MOVE A8,*A14+,0x1 +rom:00062e52 MOVE 0x1ad960,*A14+,0x1 +rom:00062e58 MOVE *A13(0xffe0),*A14+,0x1 +rom:00062e5c CALLA 0x07effa5e +rom:00062e62 MOVE A11,A8 +rom:00062e64 JR 0x000630ea +rom:00062e68 MOVE *A9(0x80),A11,0x1 +rom:00062e6c JRLE 0x00062e74 +rom:00062e6e MOVE *A9(0x80),A11,0x1 +rom:00062e72 JR 0x00062e76 +rom:00062e74 SUB A11,A11 +rom:00062e76 MOVE A11,*A13(0x60),0x1 +rom:00062e7a MOVE *A9(0xa0),A7,0x1 +rom:00062e7e JRLE 0x00062e86 +rom:00062e80 MOVE *A9(0xa0),A7,0x1 +rom:00062e84 JR 0x00062e88 +rom:00062e86 SUB A7,A7 +rom:00062e88 MOVE A7,*A13(0x80),0x1 +rom:00062e8c MOVE *A9(0x80),A5,0x1 +rom:00062e90 JRGE 0x00062e98 +rom:00062e92 MOVE *A9(0x80),A5,0x1 +rom:00062e96 JR 0x00062e9a +rom:00062e98 SUB A5,A5 +rom:00062e9a MOVE *A9(0xc0),A7,0x1 +rom:00062e9e ADD A7,A5 +rom:00062ea0 MOVE A5,*A13(0xa0),0x1 +rom:00062ea4 MOVE *A9(0xa0),A7,0x1 +rom:00062ea8 JRGE 0x00062eb0 +rom:00062eaa MOVE *A9(0xa0),A7,0x1 +rom:00062eae JR 0x00062eb2 +rom:00062eb0 SUB A7,A7 +rom:00062eb2 MOVE *A9(0xe0),A5,0x1 +rom:00062eb6 ADD A5,A7 +rom:00062eb8 MOVE A7,*A13(0xc0),0x1 +rom:00062ebc MOVE *A13(0x20),A5,0x1 +rom:00062ec0 MOVE *A13(0xa0),A7,0x1 +rom:00062ec4 ADD A7,A11 +rom:00062ec6 MOVE *A5(0x80),A5,0x1 +rom:00062eca CMP A11,A5 +rom:00062ecc JRNC 0x00062ede +rom:00062ece MOVE *A13(0x20),A11,0x1 +rom:00062ed2 MOVE *A11(0x80),A5,0x1 +rom:00062ed6 MOVE *A13(0x60),A7,0x1 +rom:00062eda SUB A7,A5 +rom:00062edc JR 0x00062ee0 +rom:00062ede MOVE A7,A5 +rom:00062ee0 MOVE A5,*A13(0xa0),0x1 +rom:00062ee4 MOVE *A13(0x20),A11,0x1 +rom:00062ee8 MOVE *A13(0x80),A7,0x1 +rom:00062eec MOVE *A13(0xc0),A5,0x1 +rom:00062ef0 ADD A5,A7 +rom:00062ef2 MOVE *A11(0xa0),A5,0x1 +rom:00062ef6 CMP A7,A5 +rom:00062ef8 JRNC 0x00062f06 +rom:00062efa MOVE *A11(0xa0),A7,0x1 +rom:00062efe MOVE *A13(0x80),A5,0x1 +rom:00062f02 SUB A5,A7 +rom:00062f04 JR 0x00062f0a +rom:00062f06 MOVE *A13(0xc0),A7,0x1 +rom:00062f0a MOVE A7,*A13(0xc0),0x1 +rom:00062f0e MOVE *A13(0xa0),A5,0x1 +rom:00062f12 JRLE 0x00062f18 +rom:00062f14 MOVE A7,A8 +rom:00062f16 JRGT 0x00062f40 +rom:00062f18 MOVE A14,-*SP,0x1 +rom:00062f1a MOVK 0x2,A5 +rom:00062f1c MOVE A5,*A14+,0x1 +rom:00062f1e MOVE *A11(0x0),*A14+,0x1 +rom:00062f22 SETF 0x8,0x0,0x0 +rom:00062f24 MOVE *A9(0x8),A8,0x0 +rom:00062f28 MOVE A8,*A14+,0x1 +rom:00062f2a MOVE 0x1ad960,*A14+,0x1 +rom:00062f30 MOVE *A13(0xffe0),*A14+,0x1 +rom:00062f34 CALLA 0x07effa5e +rom:00062f3a MOVE A5,A8 +rom:00062f3c JR 0x000630ea +rom:00062f40 MOVE *A9(0x100),A5,0x1 +rom:00062f44 MOVE *A13(0x60),A7,0x1 +rom:00062f48 ADD A7,A5 +rom:00062f4a MOVE *A9(0x80),A7,0x1 +rom:00062f4e SUB A7,A5 +rom:00062f50 MOVE A5,*A13(0xe0),0x1 +rom:00062f54 MOVE *A9(0x120),A7,0x1 +rom:00062f58 MOVE *A13(0x80),A5,0x1 +rom:00062f5c ADD A5,A7 +rom:00062f5e MOVE *A9(0xa0),A5,0x1 +rom:00062f62 SUB A5,A7 +rom:00062f64 MOVE A7,*A13(0x100),0x1 +rom:00062f68 MOVE A14,-*SP,0x1 +rom:00062f6a MOVE A8,*A14+,0x1 +rom:00062f6c MOVE *A13(0xa0),*A14+,0x1 +rom:00062f70 MOVE *A13(0x80),*A14+,0x1 +rom:00062f74 MOVE *A13(0x60),*A14+,0x1 +rom:00062f78 MOVE A11,*A14+,0x1 +rom:00062f7a MOVE *A13(0xffe0),*A14+,0x1 +rom:00062f7e CALLA 0x07ea3432 +rom:00062f84 MOVE A8,*A13(0x120),0x1 +rom:00062f88 MOVE A8,A5 +rom:00062f8a JREQ 0x00062fbc +rom:00062f8c MOVE A14,-*SP,0x1 +rom:00062f8e MOVE A11,*A14+,0x1 +rom:00062f90 CALLA 0x07ea336a +rom:00062f96 MOVE A14,-*SP,0x1 +rom:00062f98 MOVE A5,*A14+,0x1 +rom:00062f9a MOVE *A11(0x0),*A14+,0x1 +rom:00062f9e SETF 0x8,0x0,0x0 +rom:00062fa0 MOVE *A9(0x8),A8,0x0 +rom:00062fa4 MOVE A8,*A14+,0x1 +rom:00062fa6 MOVE 0x1ad960,*A14+,0x1 +rom:00062fac MOVE *A13(0xffe0),*A14+,0x1 +rom:00062fb0 CALLA 0x07effa5e +rom:00062fb6 MOVE A5,A8 +rom:00062fb8 JR 0x000630ea +rom:00062fbc MOVE *A13,A5,0x1 +rom:00062fbe JREQ 0x0006301c +rom:00062fc0 MOVE A14,-*SP,0x1 +rom:00062fc2 MOVE A7,*A14+,0x1 +rom:00062fc4 MOVE *A13(0xe0),*A14+,0x1 +rom:00062fc8 SETF 0x8,0x0,0x0 +rom:00062fca MOVE *A11(0x40),A8,0x0 +rom:00062fce MOVE A8,*A14+,0x1 +rom:00062fd0 MOVE *A11(0x100),*A14+,0x1 +rom:00062fd4 MOVE *A11(0x160),*A14+,0x1 +rom:00062fd8 MOVE *A5(0x80),*A14+,0x1 +rom:00062fdc CALLA 0x07ea47b6 +rom:00062fe2 MOVE A8,*A13(0x120),0x1 +rom:00062fe6 MOVE A8,A8 +rom:00062fe8 JREQ 0x000630e8 +rom:00062fea MOVE A14,-*SP,0x1 +rom:00062fec MOVE A11,*A14+,0x1 +rom:00062fee CALLA 0x07ea336a +rom:00062ff4 MOVE A14,-*SP,0x1 +rom:00062ff6 MOVE *A13(0x120),*A14+,0x1 +rom:00062ffa MOVE *A5(0x0),*A14+,0x1 +rom:00062ffe SETF 0x8,0x0,0x0 +rom:00063000 MOVE *A9(0x8),A8,0x0 +rom:00063004 MOVE A8,*A14+,0x1 +rom:00063006 MOVE 0x1ad960,*A14+,0x1 +rom:0006300c MOVE *A13(0xffe0),*A14+,0x1 +rom:00063010 CALLA 0x07effa5e +rom:00063016 MOVE *A13(0x120),A8,0x1 +rom:0006301a JR 0x000630ea +rom:0006301c MOVE A14,-*SP,0x1 +rom:0006301e MOVI 0xc8,A5 +rom:00063022 MOVE A5,*A14+,0x1 +rom:00063024 CALLA 0x07f63a74 +rom:0006302a MOVE A8,*A13(0x40),0x1 +rom:0006302e MOVE A8,A8 +rom:00063030 JRNE 0x00063072 +rom:00063032 MOVE A14,-*SP,0x1 +rom:00063034 MOVI 0x3f524d90,A8 +rom:0006303a MOVE A8,*A14+,0x1 +rom:0006303c CALLA 0x07f24f78 +rom:00063042 MOVE A14,-*SP,0x1 +rom:00063044 MOVE A11,*A14+,0x1 +rom:00063046 CALLA 0x07ea336a +rom:0006304c MOVE A14,-*SP,0x1 +rom:0006304e MOVK 0xb,A5 +rom:00063050 MOVE A5,*A14+,0x1 +rom:00063052 SUB A5,A5 +rom:00063054 MOVE A5,*A14+,0x1 +rom:00063056 SETF 0x8,0x0,0x0 +rom:00063058 MOVE *A9(0x8),A8,0x0 +rom:0006305c MOVE A8,*A14+,0x1 +rom:0006305e MOVE 0x1ad960,*A14+,0x1 +rom:00063064 MOVE *A13(0xffe0),*A14+,0x1 +rom:00063068 CALLA 0x07effa5e +rom:0006306e MOVK 0xb,A8 +rom:00063070 JR 0x000630ea +rom:00063072 MOVK 0x5,A5 +rom:00063074 MOVB A5,*A8 +rom:00063076 MOVE A11,*A8(0x8),0x1 +rom:0006307a SUB A5,A5 +rom:0006307c MOVE A5,*A8(0x28),0x1 +rom:00063080 MOVE *A9(0x20),*A8(0x48),0x1 +rom:00063086 MOVE A5,*A8(0x68),0x1 +rom:0006308a MOVE *A13(0xe0),*A8(0x88),0x1 +rom:00063090 MOVE A7,*A8(0xa8),0x1 +rom:00063094 MOVE A14,-*SP,0x1 +rom:00063096 MOVE A8,*A14+,0x1 +rom:00063098 CALLA 0x07e5b152 +rom:0006309e MOVE A8,*A13(0x120),0x1 +rom:000630a2 MOVE A8,A8 +rom:000630a4 JREQ 0x000630b0 +rom:000630a6 MOVE A14,-*SP,0x1 +rom:000630a8 MOVE A11,*A14+,0x1 +rom:000630aa CALLA 0x07ea336a +rom:000630b0 MOVE A14,-*SP,0x1 +rom:000630b2 MOVE *A13(0x40),*A14+,0x1 +rom:000630b6 CALLA 0x07f63b00 +rom:000630bc MOVE *A13(0x120),A5,0x1 +rom:000630c0 JREQ 0x000630e8 +rom:000630c2 MOVE A14,-*SP,0x1 +rom:000630c4 MOVE A5,*A14+,0x1 +rom:000630c6 SUB A5,A5 +rom:000630c8 MOVE A5,*A14+,0x1 +rom:000630ca SETF 0x8,0x0,0x0 +rom:000630cc MOVE *A9(0x8),A8,0x0 +rom:000630d0 MOVE A8,*A14+,0x1 +rom:000630d2 MOVE 0x1ad960,*A14+,0x1 +rom:000630d8 MOVE *A13(0xffe0),*A14+,0x1 +rom:000630dc CALLA 0x07effa5e +rom:000630e2 MOVE *A13(0x120),A8,0x1 +rom:000630e6 JR 0x000630ea +rom:000630e8 SUB A8,A8 +rom:000630ea MOVE *SP(0xc0),A14,0x1 +rom:000630ee MMFM SP,0x2aa0 diff --git a/xie/ghidra-evidence/pipeline/put_slot19.txt b/xie/ghidra-evidence/pipeline/put_slot19.txt new file mode 100644 index 0000000..1984ac6 --- /dev/null +++ b/xie/ghidra-evidence/pipeline/put_slot19.txt @@ -0,0 +1,234 @@ +rom:0006a76e MMTM SP,0x554 +rom:0006a772 MOVE A14,A13 +rom:0006a774 ADDI 0x160,A14 +rom:0006a778 MOVE *A13(0xffe0),A11,0x1 +rom:0006a77c MOVE *A11(0x40),A9,0x1 +rom:0006a780 SETF 0x10,0x0,0x0 +rom:0006a782 MOVE *A9(0x10),A11,0x0 +rom:0006a786 SUBK 0x8,A11 +rom:0006a788 JRNC 0x0006a790 +rom:0006a78a MOVK 0x10,A8 +rom:0006a78c JR 0x0006aa4a +rom:0006a790 MOVE A14,-*SP,0x1 +rom:0006a792 MOVE *A9(0xc0),*A14+,0x1 +rom:0006a796 MOVK 0x3,A11 +rom:0006a798 MOVE A11,*A14+,0x1 +rom:0006a79a MOVE *A9(0x20),*A14+,0x1 +rom:0006a79e MOVE A13,A7 +rom:0006a7a0 ADDK 0x0,A7 +rom:0006a7a2 MOVE A7,*A14+,0x1 +rom:0006a7a4 MOVE A13,*A14+,0x1 +rom:0006a7a6 SUB A11,A11 +rom:0006a7a8 MOVE A11,*A14+,0x1 +rom:0006a7aa MOVE *A13(0xffe0),*A14+,0x1 +rom:0006a7ae CALLA 0x07eab966 +rom:0006a7b4 MOVE A8,*A13(0x140),0x1 +rom:0006a7b8 MOVE A8,A8 +rom:0006a7ba JRNE 0x0006aa4a +rom:0006a7be MOVE *A9(0x40),A11,0x1 +rom:0006a7c2 JRLE 0x0006a7ca +rom:0006a7c4 MOVE *A9(0x40),A11,0x1 +rom:0006a7c8 JR 0x0006a7cc +rom:0006a7ca SUB A11,A11 +rom:0006a7cc MOVE A11,*A13(0x80),0x1 +rom:0006a7d0 MOVE *A9(0x60),A7,0x1 +rom:0006a7d4 JRLE 0x0006a7dc +rom:0006a7d6 MOVE *A9(0x60),A7,0x1 +rom:0006a7da JR 0x0006a7de +rom:0006a7dc SUB A7,A7 +rom:0006a7de MOVE A7,*A13(0xa0),0x1 +rom:0006a7e2 MOVE *A9(0x80),A7,0x1 +rom:0006a7e6 MOVE *A9(0x40),A5,0x1 +rom:0006a7ea ADD A5,A7 +rom:0006a7ec MOVE *A13,A5,0x1 +rom:0006a7ee MOVE *A5(0x80),A5,0x1 +rom:0006a7f2 CMP A5,A7 +rom:0006a7f4 JRLS 0x0006a800 +rom:0006a7f6 MOVE *A13,A7,0x1 +rom:0006a7f8 MOVE *A7(0x80),A5,0x1 +rom:0006a7fc SUB A11,A5 +rom:0006a7fe JR 0x0006a80e +rom:0006a800 MOVE *A9(0x80),A7,0x1 +rom:0006a804 MOVE *A9(0x40),A5,0x1 +rom:0006a808 ADD A5,A7 +rom:0006a80a SUB A11,A7 +rom:0006a80c MOVE A7,A5 +rom:0006a80e MOVE A5,*A13(0xc0),0x1 +rom:0006a812 MOVE *A9(0xa0),A7,0x1 +rom:0006a816 MOVE *A9(0x60),A5,0x1 +rom:0006a81a ADD A5,A7 +rom:0006a81c MOVE *A13,A5,0x1 +rom:0006a81e MOVE *A5(0xa0),A5,0x1 +rom:0006a822 CMP A5,A7 +rom:0006a824 JRLS 0x0006a834 +rom:0006a826 MOVE *A13,A7,0x1 +rom:0006a828 MOVE *A7(0xa0),A5,0x1 +rom:0006a82c MOVE *A13(0xa0),A7,0x1 +rom:0006a830 SUB A7,A5 +rom:0006a832 JR 0x0006a846 +rom:0006a834 MOVE *A9(0xa0),A7,0x1 +rom:0006a838 MOVE *A9(0x60),A5,0x1 +rom:0006a83c ADD A5,A7 +rom:0006a83e MOVE *A13(0xa0),A5,0x1 +rom:0006a842 SUB A5,A7 +rom:0006a844 MOVE A7,A5 +rom:0006a846 MOVE A5,*A13(0xe0),0x1 +rom:0006a84a MOVE *A13(0xc0),A7,0x1 +rom:0006a84e JRLE 0x0006a854 +rom:0006a850 MOVE A5,A8 +rom:0006a852 JRGT 0x0006a87c +rom:0006a854 MOVE A14,-*SP,0x1 +rom:0006a856 MOVK 0x2,A5 +rom:0006a858 MOVE A5,*A14+,0x1 +rom:0006a85a MOVE *A9(0x20),*A14+,0x1 +rom:0006a85e SETF 0x8,0x0,0x0 +rom:0006a860 MOVE *A9(0x8),A8,0x0 +rom:0006a864 MOVE A8,*A14+,0x1 +rom:0006a866 MOVE 0x1ad960,*A14+,0x1 +rom:0006a86c MOVE *A13(0xffe0),*A14+,0x1 +rom:0006a870 CALLA 0x07effa5e +rom:0006a876 MOVE A5,A8 +rom:0006a878 JR 0x0006aa4a +rom:0006a87c MOVE A9,A5 +rom:0006a87e ADDI 0x100,A5 +rom:0006a882 MOVE A5,*A13(0x120),0x1 +rom:0006a886 SUB A5,A5 +rom:0006a888 MOVE A5,*A13(0x60),0x1 +rom:0006a88c MOVE *A9(0xc0),*A13(0x40),0x1 +rom:0006a892 MOVE *A13(0x40),A7,0x1 +rom:0006a896 JREQ 0x0006aa28 +rom:0006a89a MOVE *A13(0x40),A11,0x1 +rom:0006a89e BTST 0x0,A11 +rom:0006a8a0 JREQ 0x0006aa10 +rom:0006a8a4 MOVE *A13(0x20),A7,0x1 +rom:0006a8a8 MOVE *A13(0x60),A5,0x1 +rom:0006a8ac SLL 0x5,A5 +rom:0006a8ae ADD A7,A5 +rom:0006a8b0 MOVE *A5(0x160),A5,0x1 +rom:0006a8b4 MOVE *A13(0x80),*A5(0xa8),0x1 +rom:0006a8ba MOVE *A13(0x60),A5,0x1 +rom:0006a8be SLL 0x5,A5 +rom:0006a8c0 ADD A7,A5 +rom:0006a8c2 MOVE *A5(0x160),A5,0x1 +rom:0006a8c6 MOVE *A13(0xa0),*A5(0xe8),0x1 +rom:0006a8cc MOVE *A13(0x60),A5,0x1 +rom:0006a8d0 SLL 0x5,A5 +rom:0006a8d2 ADD A7,A5 +rom:0006a8d4 MOVE *A5(0x160),A5,0x1 +rom:0006a8d8 MOVE *A13(0x80),A7,0x1 +rom:0006a8dc MOVE *A13(0xc0),A11,0x1 +rom:0006a8e0 ADD A11,A7 +rom:0006a8e2 DEC A7 +rom:0006a8e4 MOVE A7,*A5(0xc8),0x1 +rom:0006a8e8 MOVE *A13(0x20),A7,0x1 +rom:0006a8ec MOVE *A13(0x60),A5,0x1 +rom:0006a8f0 SLL 0x5,A5 +rom:0006a8f2 ADD A7,A5 +rom:0006a8f4 MOVE *A5(0x160),A5,0x1 +rom:0006a8f8 MOVE *A13(0xa0),A7,0x1 +rom:0006a8fc MOVE *A13(0xe0),A11,0x1 +rom:0006a900 ADD A11,A7 +rom:0006a902 DEC A7 +rom:0006a904 MOVE A7,*A5(0x108),0x1 +rom:0006a908 MOVE *A13(0x20),A7,0x1 +rom:0006a90c MOVE *A13(0x60),A5,0x1 +rom:0006a910 SLL 0x5,A5 +rom:0006a912 ADD A7,A5 +rom:0006a914 MOVE *A5(0x160),A5,0x1 +rom:0006a918 MOVE *A13(0xc0),*A5(0x128),0x1 +rom:0006a91e MOVE *A13(0x60),A5,0x1 +rom:0006a922 SLL 0x5,A5 +rom:0006a924 ADD A7,A5 +rom:0006a926 MOVE *A5(0x160),A5,0x1 +rom:0006a92a MOVE A11,*A5(0x148),0x1 +rom:0006a92e MOVE *A13(0x60),A5,0x1 +rom:0006a932 SLL 0x5,A5 +rom:0006a934 ADD A7,A5 +rom:0006a936 MOVE *A5(0x160),A5,0x1 +rom:0006a93a MOVE *A13(0x60),A11,0x1 +rom:0006a93e SLL 0x5,A11 +rom:0006a940 ADD A7,A11 +rom:0006a942 MOVE *A11(0x160),A11,0x1 +rom:0006a946 MOVE *A13(0xc0),A7,0x1 +rom:0006a94a MOVE *A11(0x68),A11,0x1 +rom:0006a94e MPYU A7,A11 +rom:0006a950 MOVE A11,*A5(0x88),0x1 +rom:0006a954 MOVE *A13(0x20),A11,0x1 +rom:0006a958 MOVE *A13(0x60),A5,0x1 +rom:0006a95c SLL 0x5,A5 +rom:0006a95e ADD A11,A5 +rom:0006a960 MOVE *A5(0x160),A5,0x1 +rom:0006a964 MOVE *A13(0x60),A7,0x1 +rom:0006a968 SLL 0x5,A7 +rom:0006a96a ADD A11,A7 +rom:0006a96c MOVE *A7(0x160),A7,0x1 +rom:0006a970 MOVE *A13(0xe0),A11,0x1 +rom:0006a974 MOVE *A7(0x88),A7,0x1 +rom:0006a978 MPYU A11,A7 +rom:0006a97a MOVE A7,*A5(0x48),0x1 +rom:0006a97e MOVE *A13(0x20),A7,0x1 +rom:0006a982 MOVE *A13(0x60),A5,0x1 +rom:0006a986 SLL 0x5,A5 +rom:0006a988 ADD A7,A5 +rom:0006a98a MOVE *A5(0x160),A5,0x1 +rom:0006a98e MOVE *A13(0x120),*A5(0x28),0x1 +rom:0006a994 MOVE A14,-*SP,0x1 +rom:0006a996 MOVE *A13(0x60),*A14+,0x1 +rom:0006a99a MOVE *A13,A5,0x1 +rom:0006a99c MOVE *A5(0x160),*A14+,0x1 +rom:0006a9a0 MOVE A7,*A14+,0x1 +rom:0006a9a2 CALLA 0x07eab640 +rom:0006a9a8 MOVE A8,*A13(0x100),0x1 +rom:0006a9ac MOVE A8,A8 +rom:0006a9ae JREQ 0x0006a9d6 +rom:0006a9b0 MOVE A14,-*SP,0x1 +rom:0006a9b2 MOVE A8,*A14+,0x1 +rom:0006a9b4 MOVE *A5(0x0),*A14+,0x1 +rom:0006a9b8 SETF 0x8,0x0,0x0 +rom:0006a9ba MOVE *A9(0x8),A8,0x0 +rom:0006a9be MOVE A8,*A14+,0x1 +rom:0006a9c0 MOVE 0x1ad960,*A14+,0x1 +rom:0006a9c6 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006a9ca CALLA 0x07effa5e +rom:0006a9d0 MOVE *A13(0x100),A8,0x1 +rom:0006a9d4 JR 0x0006aa4a +rom:0006a9d6 MOVE *A13(0x60),A5,0x1 +rom:0006a9da SLL 0x5,A5 +rom:0006a9dc ADD A7,A5 +rom:0006a9de MOVE *A5(0x160),A5,0x1 +rom:0006a9e2 SUB A7,A7 +rom:0006a9e4 MOVE A7,*A5(0x28),0x1 +rom:0006a9e8 MOVE *A13(0x20),A5,0x1 +rom:0006a9ec MOVE *A13(0x60),A7,0x1 +rom:0006a9f0 SLL 0x5,A7 +rom:0006a9f2 ADD A5,A7 +rom:0006a9f4 MOVE *A7(0x160),A7,0x1 +rom:0006a9f8 MOVE *A7(0x48),A7,0x1 +rom:0006a9fc ADDK 0x1f,A7 +rom:0006a9fe SRL 0x1d,A7 +rom:0006aa00 MOVK 0x3,A5 +rom:0006aa02 ANDN A5,A7 +rom:0006aa04 SLL 0x3,A7 +rom:0006aa06 MOVE *A13(0x120),A5,0x1 +rom:0006aa0a ADD A5,A7 +rom:0006aa0c MOVE A7,*A13(0x120),0x1 +rom:0006aa10 MOVE *A13(0x60),A11,0x1 +rom:0006aa14 INC A11 +rom:0006aa16 MOVE A11,*A13(0x60),0x1 +rom:0006aa1a MOVE *A13(0x40),A7,0x1 +rom:0006aa1e SRL 0x1f,A7 +rom:0006aa20 MOVE A7,*A13(0x40),0x1 +rom:0006aa24 JRNE 0x0006a89a +rom:0006aa28 SETF 0x8,0x0,0x0 +rom:0006aa2a MOVE *A9(0xe0),A11,0x0 +rom:0006aa2e JREQ 0x0006aa48 +rom:0006aa30 MOVE A14,-*SP,0x1 +rom:0006aa32 MOVI 0xffffff,A11 +rom:0006aa38 MOVE A11,*A14+,0x1 +rom:0006aa3a MOVE *A13,A5,0x1 +rom:0006aa3c ADDI 0x120,A5 +rom:0006aa40 MOVE A5,*A14+,0x1 +rom:0006aa42 CALLA 0x07eab1bc +rom:0006aa48 SUB A8,A8 +rom:0006aa4a MOVE *SP(0xc0),A14,0x1 +rom:0006aa4e MMFM SP,0x2aa0 diff --git a/xie/ghidra-evidence/pipeline/resource_init_6CA82.txt b/xie/ghidra-evidence/pipeline/resource_init_6CA82.txt new file mode 100644 index 0000000..6f23ee2 --- /dev/null +++ b/xie/ghidra-evidence/pipeline/resource_init_6CA82.txt @@ -0,0 +1,207 @@ +rom:0006ca82 MMTM SP,0x154 +rom:0006ca86 MOVE A14,A13 +rom:0006ca88 ADDI 0xa0,A14 +rom:0006ca8c MOVE A14,-*SP,0x1 +rom:0006ca8e MOVI 0x30,A11 +rom:0006ca92 MOVE A11,*A14+,0x1 +rom:0006ca94 MOVK 0x1,A9 +rom:0006ca96 MOVE A9,*A14+,0x1 +rom:0006ca98 CALLA 0x07f63a30 +rom:0006ca9e MOVE A8,*A13,0x1 +rom:0006caa0 MOVE A8,A8 +rom:0006caa2 JRNE 0x0006caba +rom:0006caa4 MOVE A14,-*SP,0x1 +rom:0006caa6 MOVI 0x3f568580,A8 +rom:0006caac MOVE A8,*A14+,0x1 +rom:0006caae CALLA 0x07f24f78 +rom:0006cab4 SUB A8,A8 +rom:0006cab6 JR 0x0006ccfe +rom:0006caba MOVE A14,-*SP,0x1 +rom:0006cabc SUB A9,A9 +rom:0006cabe MOVE A9,*A14+,0x1 +rom:0006cac0 MOVE A8,A9 +rom:0006cac2 CALLA 0x07f642ec +rom:0006cac8 MOVE A8,*A9(0x160),0x1 +rom:0006cacc MOVE *A9(0x160),A11,0x1 +rom:0006cad0 JRNE 0x0006caf2 +rom:0006cad2 MOVE A14,-*SP,0x1 +rom:0006cad4 MOVI 0x3f568658,A8 +rom:0006cada MOVE A8,*A14+,0x1 +rom:0006cadc CALLA 0x07f24f78 +rom:0006cae2 MOVE A14,-*SP,0x1 +rom:0006cae4 MOVE A9,*A14+,0x1 +rom:0006cae6 CALLA 0x07f63b00 +rom:0006caec SUB A8,A8 +rom:0006caee JR 0x0006ccfe +rom:0006caf2 MOVE *A13(0xfec0),A11,0x1 +rom:0006caf6 JREQ 0x0006cafc +rom:0006caf8 MOVK 0x2,A11 +rom:0006cafa JR 0x0006cafe +rom:0006cafc MOVK 0x3,A11 +rom:0006cafe MOVB *A11,*A9(0x20) +rom:0006cb02 MOVK 0x1,A11 +rom:0006cb04 SETF 0x10,0x1,0x0 +rom:0006cb06 MOVE A11,*A9(0x30),0x0 +rom:0006cb0a MOVB *A13(0xffe0),*A9(0x40) +rom:0006cb10 SETF 0x8,0x0,0x0 +rom:0006cb12 MOVE *A9(0x40),A7,0x0 +rom:0006cb16 SUBK 0x3,A7 +rom:0006cb18 JRNE 0x0006cb1e +rom:0006cb1a MOVK 0x3,A7 +rom:0006cb1c JR 0x0006cb20 +rom:0006cb1e MOVE A11,A7 +rom:0006cb20 MOVB *A7,*A9(0x48) +rom:0006cb24 MOVE *A13(0xff80),*A9(0xc0),0x1 +rom:0006cb2a MOVE *A13(0xffa0),*A9(0xe0),0x1 +rom:0006cb30 MOVB *A13(0xff60),*A9(0x58) +rom:0006cb36 MOVB *A13(0xff40),*A9(0x60) +rom:0006cb3c MOVB *A13(0xff20),*A9(0x50) +rom:0006cb42 MOVE *A13(0xff00),*A9(0x80),0x1 +rom:0006cb48 MOVE *A13(0xfee0),*A9(0xa0),0x1 +rom:0006cb4e SUB A7,A7 +rom:0006cb50 MOVE A7,*A13(0x20),0x1 +rom:0006cb54 MOVE *A9(0x48),A11,0x0 +rom:0006cb58 CMP A11,A7 +rom:0006cb5a JRNC 0x0006cc9e +rom:0006cb5e MOVE *A13(0x20),A11,0x1 +rom:0006cb62 SLL 0x5,A11 +rom:0006cb64 MOVE *A13(0xffc0),A9,0x1 +rom:0006cb68 ADD A9,A11 +rom:0006cb6a MOVE *A11,A11,0x1 +rom:0006cb6c JRNE 0x0006cb72 +rom:0006cb6e MOVK 0x0,A11 +rom:0006cb70 JR 0x0006cbb0 +rom:0006cb72 MOVE *A13(0x20),A11,0x1 +rom:0006cb76 SLL 0x5,A11 +rom:0006cb78 ADD A9,A11 +rom:0006cb7a MOVE *A11,A11,0x1 +rom:0006cb7c SUBK 0x2,A11 +rom:0006cb7e JRHI 0x0006cb84 +rom:0006cb80 MOVK 0x1,A11 +rom:0006cb82 JR 0x0006cbb0 +rom:0006cb84 MOVE *A13(0x20),A11,0x1 +rom:0006cb88 SLL 0x5,A11 +rom:0006cb8a ADD A9,A11 +rom:0006cb8c MOVE *A11,A11,0x1 +rom:0006cb8e CMPI 0x100,A11 +rom:0006cb92 JRHI 0x0006cb98 +rom:0006cb94 MOVK 0x8,A11 +rom:0006cb96 JR 0x0006cbb0 +rom:0006cb98 MOVE *A13(0x20),A11,0x1 +rom:0006cb9c SLL 0x5,A11 +rom:0006cb9e ADD A9,A11 +rom:0006cba0 MOVE *A11,A11,0x1 +rom:0006cba2 CMPI 0x10000,A11 +rom:0006cba8 JRHI 0x0006cbae +rom:0006cbaa MOVK 0x10,A11 +rom:0006cbac JR 0x0006cbb0 +rom:0006cbae MOVK 0x0,A11 +rom:0006cbb0 MOVE A11,*A13(0x40),0x1 +rom:0006cbb4 MOVE *A13(0xff00),A7,0x1 +rom:0006cbb8 MPYU A7,A11 +rom:0006cbba ADDK 0x7,A11 +rom:0006cbbc MOVK 0x7,A7 +rom:0006cbbe ANDN A7,A11 +rom:0006cbc0 MOVE A11,*A13(0x60),0x1 +rom:0006cbc4 MOVE *A13(0x20),A7,0x1 +rom:0006cbc8 SLL 0x5,A7 +rom:0006cbca ADD A9,A7 +rom:0006cbcc MOVE *A7,A7,0x1 +rom:0006cbce JRNE 0x0006cbd4 +rom:0006cbd0 MOVK 0x4,A7 +rom:0006cbd2 JR 0x0006cbec +rom:0006cbd4 MOVE A14,-*SP,0x1 +rom:0006cbd6 MOVE A11,*A14+,0x1 +rom:0006cbd8 MOVE *A13(0x40),*A14+,0x1 +rom:0006cbdc SUB A7,A7 +rom:0006cbde MOVE A7,*A14+,0x1 +rom:0006cbe0 MOVE *A13(0x40),*A14+,0x1 +rom:0006cbe4 CALLA 0x07eacd68 +rom:0006cbea MOVE A8,A7 +rom:0006cbec MOVE A7,*A13(0x80),0x1 +rom:0006cbf0 MOVE *A13,A7,0x1 +rom:0006cbf2 MOVE *A13(0x20),A9,0x1 +rom:0006cbf6 SLL 0x5,A9 +rom:0006cbf8 MOVE *A13(0xffc0),A11,0x1 +rom:0006cbfc ADD A11,A9 +rom:0006cbfe MOVE *A9,A9,0x1 +rom:0006cc00 JRNE 0x0006cc06 +rom:0006cc02 SUB A9,A9 +rom:0006cc04 JR 0x0006cc08 +rom:0006cc06 MOVK 0x1,A9 +rom:0006cc08 SETF 0x1,0x0,0x0 +rom:0006cc0a MOVE A9,*A7(0x28),0x0 +rom:0006cc0e MOVE *A7(0x160),A9,0x1 +rom:0006cc12 MOVE *A13(0x20),A7,0x1 +rom:0006cc16 SLL 0x5,A7 +rom:0006cc18 ADD A7,A9 +rom:0006cc1a MOVE A14,-*SP,0x1 +rom:0006cc1c SUB A7,A7 +rom:0006cc1e MOVE A7,*A14+,0x1 +rom:0006cc20 MOVE A7,*A14+,0x1 +rom:0006cc22 MOVE *A13(0x20),*A14+,0x1 +rom:0006cc26 MOVE *A13(0x20),A7,0x1 +rom:0006cc2a SLL 0x5,A7 +rom:0006cc2c ADD A11,A7 +rom:0006cc2e MOVE *A7+,*A14+,0x1 +rom:0006cc30 MOVE *A13(0x60),*A14+,0x1 +rom:0006cc34 MOVE *A13(0x40),*A14+,0x1 +rom:0006cc38 MOVE *A13(0xfee0),*A14+,0x1 +rom:0006cc3c MOVE *A13(0xff00),*A14+,0x1 +rom:0006cc40 SUB A7,A7 +rom:0006cc42 MOVE A7,*A14+,0x1 +rom:0006cc44 MOVE *A13(0x80),*A14+,0x1 +rom:0006cc48 CALLA 0x07eac660 +rom:0006cc4e MOVE A8,*A9(0xd8),0x1 +rom:0006cc52 MOVE *A13,A9,0x1 +rom:0006cc54 MOVE *A9(0x160),A7,0x1 +rom:0006cc58 MOVE *A13(0x20),A9,0x1 +rom:0006cc5c SLL 0x5,A9 +rom:0006cc5e ADD A9,A7 +rom:0006cc60 MOVE *A7(0xd8),A9,0x1 +rom:0006cc64 JRNE 0x0006cc86 +rom:0006cc66 MOVE A14,-*SP,0x1 +rom:0006cc68 MOVI 0x3f5688d8,A8 +rom:0006cc6e MOVE A8,*A14+,0x1 +rom:0006cc70 CALLA 0x07f24f78 +rom:0006cc76 MOVE A14,-*SP,0x1 +rom:0006cc78 MOVE *A13(0x0),*A14+,0x1 +rom:0006cc7c CALLA 0x07eacdda +rom:0006cc82 SUB A8,A8 +rom:0006cc84 JR 0x0006ccfe +rom:0006cc86 MOVE *A13(0x20),A9,0x1 +rom:0006cc8a INC A9 +rom:0006cc8c MOVE A9,*A13(0x20),0x1 +rom:0006cc90 MOVE *A13,A7,0x1 +rom:0006cc92 SETF 0x8,0x0,0x0 +rom:0006cc94 MOVE *A7(0x48),A7,0x0 +rom:0006cc98 CMP A7,A9 +rom:0006cc9a JRC 0x0006cb5e +rom:0006cc9e MOVE A14,-*SP,0x1 +rom:0006cca0 MOVE *A13,A11,0x1 +rom:0006cca2 MOVE *A11(0x160),A9,0x1 +rom:0006cca6 MOVE *A9(0xd8),A9,0x1 +rom:0006ccaa MOVK 0x1,A7 +rom:0006ccac MOVE *A9(0x10),A9,0x0 +rom:0006ccb0 SLL A9,A7 +rom:0006ccb2 MOVE A7,*A14+,0x1 +rom:0006ccb4 MOVE *A11(0x160),A9,0x1 +rom:0006ccb8 MOVE *A9(0xd8),A9,0x1 +rom:0006ccbc MOVE *A9(0x10),A8,0x0 +rom:0006ccc0 MOVE A8,*A14+,0x1 +rom:0006ccc2 MOVE *A11(0x160),*A14+,0x1 +rom:0006ccc6 CALLA 0x07f650f6 +rom:0006cccc MOVE A14,-*SP,0x1 +rom:0006ccce MOVE *A13(0xfee0),*A14+,0x1 +rom:0006ccd2 MOVE *A11(0x160),*A14+,0x1 +rom:0006ccd6 CALLA 0x07f65118 +rom:0006ccdc MOVE *A11(0x160),A9,0x1 +rom:0006cce0 SETF 0x1,0x0,0x0 +rom:0006cce2 MOVE *A13(0xfec0),*A9(0x13c),0x0 +rom:0006cce8 MOVE *A11(0x160),A9,0x1 +rom:0006ccec MOVE *A13(0xfec0),*A9(0x13b),0x0 +rom:0006ccf2 MOVE *A11(0x160),A9,0x1 +rom:0006ccf6 SUB A7,A7 +rom:0006ccf8 MOVE A7,*A9(0x13a),0x0 +rom:0006ccfc MOVE A11,A8 +rom:0006ccfe MOVE *SP(0xa0),A14,0x1 diff --git a/xie/ghidra-evidence/slot20/band_alloc_6C660.txt b/xie/ghidra-evidence/slot20/band_alloc_6C660.txt new file mode 100644 index 0000000..7881228 --- /dev/null +++ b/xie/ghidra-evidence/slot20/band_alloc_6C660.txt @@ -0,0 +1,140 @@ +rom:0006c660 MMTM SP,0x154 +rom:0006c664 MOVE A14,A13 +rom:0006c666 ADDK 0x0,A14 +rom:0006c668 MOVE A14,-*SP,0x1 +rom:0006c66a MOVI 0x39,A11 +rom:0006c66e MOVE A11,*A14+,0x1 +rom:0006c670 CALLA 0x07f639f4 +rom:0006c676 MOVE A8,*A13,0x1 +rom:0006c678 MOVE A8,A8 +rom:0006c67a JRNE 0x0006c6fc +rom:0006c67c MOVE A14,-*SP,0x1 +rom:0006c67e MOVI 0x3f5684d0,A8 +rom:0006c684 MOVE A8,*A14+,0x1 +rom:0006c686 CALLA 0x07f24f78 +rom:0006c68c SUB A8,A8 +rom:0006c68e JR 0x0006c7f0 +rom:0006c692 MOVE *A13,A11,0x1 +rom:0006c694 MOVK 0x8,A9 +rom:0006c696 SETF 0x10,0x0,0x0 +rom:0006c698 MOVE A9,*A11,0x0 +rom:0006c69a JR 0x0006c72e +rom:0006c69c MOVE *A13,A11,0x1 +rom:0006c69e MOVK 0x10,A9 +rom:0006c6a0 SETF 0x10,0x0,0x0 +rom:0006c6a2 MOVE A9,*A11,0x0 +rom:0006c6a4 JR 0x0006c72e +rom:0006c6a6 MOVE *A13,A11,0x1 +rom:0006c6a8 MOVK 0x0,A9 +rom:0006c6aa SETF 0x10,0x0,0x0 +rom:0006c6ac MOVE A9,*A11,0x0 +rom:0006c6ae JR 0x0006c72e +rom:0006c6b0 MOVE *A13,A11,0x1 +rom:0006c6b2 ADDI 0x40,A14 +rom:0006c6b6 MOVE A14,-*SP,0x1 +rom:0006c6b8 ADDI 0x40,A14 +rom:0006c6bc MOVE A14,-*SP,0x1 +rom:0006c6be MOVE *A13(0xff20),A8,0x1 +rom:0006c6c2 CALLA 0x07fc22de +rom:0006c6c8 CALLA 0x07fc2c34 +rom:0006c6ce ADDI 0x40,A14 +rom:0006c6d2 MOVE A14,-*SP,0x1 +rom:0006c6d4 MOVI 0x3f5689d0,A8 +rom:0006c6da MOVE *A8+,*A14+,0x1 +rom:0006c6dc MOVE *A8+,*A14+,0x1 +rom:0006c6de CALLA 0x07fc2c34 +rom:0006c6e4 CALLA 0x07fc1aca +rom:0006c6ea CALLA 0x07fc288a +rom:0006c6f0 CALLA 0x07fc216a +rom:0006c6f6 SETF 0x10,0x0,0x0 +rom:0006c6f8 MOVE A8,*A11,0x0 +rom:0006c6fa JR 0x0006c72e +rom:0006c6fc SETF 0x8,0x0,0x0 +rom:0006c6fe MOVE *A13(0xffe0),A8,0x0 +rom:0006c702 DEC A8 +rom:0006c704 CMPI 0x5,A8 +rom:0006c708 JRHI 0x0006c72e +rom:0006c70a SLL 0x5,A8 +rom:0006c70c ADDI 0x3f5638b0,A8 +rom:0006c712 MOVE *A8,A8,0x1 +rom:0006c714 JUMP A8 +rom:0006c718 DSJS B6,0x0006c6e6 +rom:0006c71c DSJS B6,0x0006c6ea +rom:0006c720 DSJS B6,0x0006c6ee +rom:0006c724 DSJS B6,0x0006c6f2 +rom:0006c728 DSJS B6,0x0006c6f6 +rom:0006c72c DSJS B6,0x0006c6fa +rom:0006c72e MOVE *A13,A11,0x1 +rom:0006c730 MOVE A14,-*SP,0x1 +rom:0006c732 SETF 0x8,0x0,0x0 +rom:0006c734 MOVE *A13(0xffc0),A9,0x0 +rom:0006c738 MOVE A9,*A14+,0x1 +rom:0006c73a MOVE *A13(0xffe0),A7,0x0 +rom:0006c73e MOVE A7,*A14+,0x1 +rom:0006c740 CALLA 0x07eacd08 +rom:0006c746 MOVB *A8,*A11(0x18) +rom:0006c74a MOVB *A7,*A11(0x10) +rom:0006c74e MOVE *A13(0xff60),*A11(0x68),0x1 +rom:0006c754 MOVE *A13(0xff40),*A11(0x88),0x1 +rom:0006c75a SUB A7,A7 +rom:0006c75c MOVE A7,*A11(0xa8),0x1 +rom:0006c760 MOVE *A13(0xffa0),A7,0x1 +rom:0006c764 DEC A7 +rom:0006c766 MOVE A7,*A11(0xc8),0x1 +rom:0006c76a SUB A7,A7 +rom:0006c76c MOVE A7,*A11(0xe8),0x1 +rom:0006c770 MOVE *A13(0xff80),A7,0x1 +rom:0006c774 DEC A7 +rom:0006c776 MOVE A7,*A11(0x108),0x1 +rom:0006c77a MOVE *A13(0xffa0),*A11(0x128),0x1 +rom:0006c780 MOVE *A13(0xff80),*A11(0x148),0x1 +rom:0006c786 MOVE *A13(0xfec0),*A11(0x168),0x1 +rom:0006c78c MOVE *A13(0xff00),*A11(0x188),0x1 +rom:0006c792 MOVE *A13(0xff20),*A11(0x1a8),0x1 +rom:0006c798 MOVE *A13(0xff40),A7,0x1 +rom:0006c79c MOVE *A13(0xff80),A9,0x1 +rom:0006c7a0 MPYU A9,A7 +rom:0006c7a2 MOVE *A13(0xfec0),A9,0x1 +rom:0006c7a6 ADD A9,A7 +rom:0006c7a8 MOVE A7,*A11(0x48),0x1 +rom:0006c7ac MOVE *A13(0xfee0),A7,0x1 +rom:0006c7b0 JREQ 0x0006c7e8 +rom:0006c7b2 MOVE A14,-*SP,0x1 +rom:0006c7b4 MOVE *A11(0x48),*A14+,0x1 +rom:0006c7b8 CALLA 0x07f63a0c +rom:0006c7be MOVE A8,*A11(0x28),0x1 +rom:0006c7c2 MOVE *A11(0x28),A7,0x1 +rom:0006c7c6 JRNE 0x0006c7ee +rom:0006c7c8 MOVE A14,-*SP,0x1 +rom:0006c7ca MOVI 0x3f5683c0,A8 +rom:0006c7d0 MOVE A8,*A14+,0x1 +rom:0006c7d2 CALLA 0x07f24f78 +rom:0006c7d8 MOVE A14,-*SP,0x1 +rom:0006c7da MOVE A11,*A14+,0x1 +rom:0006c7dc CALLA 0x07ead040 +rom:0006c7e2 SUB A7,A7 +rom:0006c7e4 MOVE A7,*A13,0x1 +rom:0006c7e6 JR 0x0006c7ee +rom:0006c7e8 SUB A7,A7 +rom:0006c7ea MOVE A7,*A11(0x28),0x1 +rom:0006c7ee MOVE *A13,A8,0x1 +rom:0006c7f0 MOVE *SP(0xa0),A14,0x1 +rom:0006c7f4 MMFM SP,0x2a80 +rom:0006c7fa MMTM SP,0x154 +rom:0006c7fe MOVE A14,A13 +rom:0006c800 ADDI 0xa0,A14 +rom:0006c804 MOVE A14,-*SP,0x1 +rom:0006c806 MOVI 0x30,A11 +rom:0006c80a MOVE A11,*A14+,0x1 +rom:0006c80c MOVK 0x1,A9 +rom:0006c80e MOVE A9,*A14+,0x1 +rom:0006c810 CALLA 0x07f63a30 +rom:0006c816 MOVE A8,*A13,0x1 +rom:0006c818 MOVE A8,A8 +rom:0006c81a JRNE 0x0006c832 +rom:0006c81c MOVE A14,-*SP,0x1 +rom:0006c81e MOVI 0x3f568580,A8 +rom:0006c824 MOVE A8,*A14+,0x1 +rom:0006c826 CALLA 0x07f24f78 +rom:0006c82c SUB A8,A8 +rom:0006c82e JR 0x0006ca78 diff --git a/xie/ghidra-evidence/slot20/slot19_payload_handoff.txt b/xie/ghidra-evidence/slot20/slot19_payload_handoff.txt new file mode 100644 index 0000000..bad2915 --- /dev/null +++ b/xie/ghidra-evidence/slot20/slot19_payload_handoff.txt @@ -0,0 +1,55 @@ +rom:0006a960 MOVE *A5(0x160),A5,0x1 +rom:0006a964 MOVE *A13(0x60),A7,0x1 +rom:0006a968 SLL 0x5,A7 +rom:0006a96a ADD A11,A7 +rom:0006a96c MOVE *A7(0x160),A7,0x1 +rom:0006a970 MOVE *A13(0xe0),A11,0x1 +rom:0006a974 MOVE *A7(0x88),A7,0x1 +rom:0006a978 MPYU A11,A7 +rom:0006a97a MOVE A7,*A5(0x48),0x1 +rom:0006a97e MOVE *A13(0x20),A7,0x1 +rom:0006a982 MOVE *A13(0x60),A5,0x1 +rom:0006a986 SLL 0x5,A5 +rom:0006a988 ADD A7,A5 +rom:0006a98a MOVE *A5(0x160),A5,0x1 +rom:0006a98e MOVE *A13(0x120),*A5(0x28),0x1 +rom:0006a994 MOVE A14,-*SP,0x1 +rom:0006a996 MOVE *A13(0x60),*A14+,0x1 +rom:0006a99a MOVE *A13,A5,0x1 +rom:0006a99c MOVE *A5(0x160),*A14+,0x1 +rom:0006a9a0 MOVE A7,*A14+,0x1 +rom:0006a9a2 CALLA 0x07eab640 +rom:0006a9a8 MOVE A8,*A13(0x100),0x1 +rom:0006a9ac MOVE A8,A8 +rom:0006a9ae JREQ 0x0006a9d6 +rom:0006a9b0 MOVE A14,-*SP,0x1 +rom:0006a9b2 MOVE A8,*A14+,0x1 +rom:0006a9b4 MOVE *A5(0x0),*A14+,0x1 +rom:0006a9b8 SETF 0x8,0x0,0x0 +rom:0006a9ba MOVE *A9(0x8),A8,0x0 +rom:0006a9be MOVE A8,*A14+,0x1 +rom:0006a9c0 MOVE 0x1ad960,*A14+,0x1 +rom:0006a9c6 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006a9ca CALLA 0x07effa5e +rom:0006a9d0 MOVE *A13(0x100),A8,0x1 +rom:0006a9d4 JR 0x0006aa4a +rom:0006a9d6 MOVE *A13(0x60),A5,0x1 +rom:0006a9da SLL 0x5,A5 +rom:0006a9dc ADD A7,A5 +rom:0006a9de MOVE *A5(0x160),A5,0x1 +rom:0006a9e2 SUB A7,A7 +rom:0006a9e4 MOVE A7,*A5(0x28),0x1 +rom:0006a9e8 MOVE *A13(0x20),A5,0x1 +rom:0006a9ec MOVE *A13(0x60),A7,0x1 +rom:0006a9f0 SLL 0x5,A7 +rom:0006a9f2 ADD A5,A7 +rom:0006a9f4 MOVE *A7(0x160),A7,0x1 +rom:0006a9f8 MOVE *A7(0x48),A7,0x1 +rom:0006a9fc ADDK 0x1f,A7 +rom:0006a9fe SRL 0x1d,A7 +rom:0006aa00 MOVK 0x3,A5 +rom:0006aa02 ANDN A5,A7 +rom:0006aa04 SLL 0x3,A7 +rom:0006aa06 MOVE *A13(0x120),A5,0x1 +rom:0006aa0a ADD A5,A7 +rom:0006aa0c MOVE A7,*A13(0x120),0x1 diff --git a/xie/ghidra-evidence/slot20/slot20_6AA54.txt b/xie/ghidra-evidence/slot20/slot20_6AA54.txt new file mode 100644 index 0000000..c07eac6 --- /dev/null +++ b/xie/ghidra-evidence/slot20/slot20_6AA54.txt @@ -0,0 +1,456 @@ +rom:0006aa54 MMTM SP,0x554 +rom:0006aa58 MOVE A14,A13 +rom:0006aa5a ADDI 0x1a0,A14 +rom:0006aa5e MOVK 0x19,A11 +rom:0006aa60 MOVE A11,*A13(0xc0),0x1 +rom:0006aa64 MOVE *A13(0xffe0),A7,0x1 +rom:0006aa68 MOVE *A7(0x40),A9,0x1 +rom:0006aa6c SETF 0x10,0x0,0x0 +rom:0006aa6e MOVE *A9(0x10),A7,0x0 +rom:0006aa72 CMPI 0x23,A7 +rom:0006aa76 JREQ 0x0006aa7e +rom:0006aa78 MOVK 0x10,A8 +rom:0006aa7a JR 0x0006afdc +rom:0006aa7e CALLA 0x07f67f38 +rom:0006aa84 MOVE A8,@0x1b2b30,0x1 +rom:0006aa8a MOVE A14,-*SP,0x1 +rom:0006aa8c MOVI 0xffff,A7 +rom:0006aa90 MOVE A7,*A14+,0x1 +rom:0006aa92 SETF 0x8,0x0,0x0 +rom:0006aa94 MOVE *A9(0x68),A8,0x0 +rom:0006aa98 MOVE A8,*A14+,0x1 +rom:0006aa9a MOVE *A9(0x20),*A14+,0x1 +rom:0006aa9e MOVE A13,A7 +rom:0006aaa0 ADDI 0x40,A7 +rom:0006aaa4 MOVE A7,*A14+,0x1 +rom:0006aaa6 MOVE A13,A7 +rom:0006aaa8 ADDK 0x0,A7 +rom:0006aaaa MOVE A7,*A14+,0x1 +rom:0006aaac MOVE A13,*A14+,0x1 +rom:0006aaae MOVE *A13(0xffe0),*A14+,0x1 +rom:0006aab2 CALLA 0x07eab966 +rom:0006aab8 MOVE A8,*A13(0x180),0x1 +rom:0006aabc MOVE A8,A8 +rom:0006aabe JRNE 0x0006afdc +rom:0006aac2 SUB A7,A7 +rom:0006aac4 MOVE A7,*A13(0x100),0x1 +rom:0006aac8 MOVE A7,*A13(0x80),0x1 +rom:0006aacc MOVE *A13(0x80),A11,0x1 +rom:0006aad0 SLL 0x5,A11 +rom:0006aad2 ADD A13,A11 +rom:0006aad4 MOVE *A13(0x20),A7,0x1 +rom:0006aad8 MOVE *A7(0x160),A5,0x1 +rom:0006aadc MOVE *A13(0x80),A7,0x1 +rom:0006aae0 SLL 0x5,A7 +rom:0006aae2 ADD A7,A5 +rom:0006aae4 MOVE *A5(0xd8),A7,0x1 +rom:0006aae8 JREQ 0x0006ab46 +rom:0006aaea ADDI 0x40,A14 +rom:0006aaee MOVE A14,-*SP,0x1 +rom:0006aaf0 ADDI 0x40,A14 +rom:0006aaf4 MOVE A14,-*SP,0x1 +rom:0006aaf6 MOVE *A13(0x20),A7,0x1 +rom:0006aafa MOVE *A7(0x160),A5,0x1 +rom:0006aafe MOVE *A13(0x80),A7,0x1 +rom:0006ab02 SLL 0x5,A7 +rom:0006ab04 ADD A7,A5 +rom:0006ab06 MOVE *A5(0xd8),A7,0x1 +rom:0006ab0a MOVE *A7(0x1a8),A8,0x1 +rom:0006ab0e CALLA 0x07fc22de +rom:0006ab14 CALLA 0x07fc2c34 +rom:0006ab1a ADDI 0x40,A14 +rom:0006ab1e MOVE A14,-*SP,0x1 +rom:0006ab20 MOVI 0x3f562d00,A8 +rom:0006ab26 MOVE *A8+,*A14+,0x1 +rom:0006ab28 MOVE *A8+,*A14+,0x1 +rom:0006ab2a CALLA 0x07fc2c34 +rom:0006ab30 CALLA 0x07fc1aca +rom:0006ab36 CALLA 0x07fc288a +rom:0006ab3c CALLA 0x07fc216a +rom:0006ab42 MOVE A8,A7 +rom:0006ab44 JR 0x0006ab48 +rom:0006ab46 SUB A7,A7 +rom:0006ab48 MOVE A7,*A11(0x120),0x1 +rom:0006ab4c MOVE *A13(0x80),A11,0x1 +rom:0006ab50 INC A11 +rom:0006ab52 MOVE A11,*A13(0x80),0x1 +rom:0006ab56 DEC A11 +rom:0006ab58 SLL 0x5,A11 +rom:0006ab5a ADD A13,A11 +rom:0006ab5c MOVE *A13(0x100),A7,0x1 +rom:0006ab60 MOVE *A11(0x120),A11,0x1 +rom:0006ab64 ADD A7,A11 +rom:0006ab66 MOVE A11,*A13(0x100),0x1 +rom:0006ab6a MOVE *A13(0x80),A7,0x1 +rom:0006ab6e SUBK 0x3,A7 +rom:0006ab70 JRC 0x0006aacc +rom:0006ab72 SETF 0x8,0x0,0x0 +rom:0006ab74 MOVE *A9(0x70),A7,0x0 +rom:0006ab78 SUBK 0x4,A7 +rom:0006ab7a JRNE 0x0006ab82 +rom:0006ab7c MOVK 0x1,A7 +rom:0006ab7e MOVE A7,*A13(0x100),0x1 +rom:0006ab82 MOVE *A13(0x40),A11,0x1 +rom:0006ab86 JREQ 0x0006ac34 +rom:0006ab88 MOVE *A11(0x8),A7,0x0 +rom:0006ab8c MOVE *A9(0x70),A5,0x0 +rom:0006ab90 CMP A5,A7 +rom:0006ab92 JRNE 0x0006abd0 +rom:0006ab94 MOVE *A11(0x10),A7,0x0 +rom:0006ab98 MOVE *A9(0x60),A5,0x0 +rom:0006ab9c CMP A5,A7 +rom:0006ab9e JRNE 0x0006abd0 +rom:0006aba0 MOVE *A11(0x20),A7,0x1 +rom:0006aba4 MOVE *A9(0x40),A5,0x1 +rom:0006aba8 CMP A5,A7 +rom:0006abaa JRNE 0x0006abd0 +rom:0006abac MOVE *A11(0x40),A7,0x1 +rom:0006abb0 MOVE *A9(0x80),A5,0x1 +rom:0006abb4 AND A5,A7 +rom:0006abb6 JRNE 0x0006abd0 +rom:0006abb8 MOVE *A11(0x60),A7,0x1 +rom:0006abbc MOVE *A9(0x80),A5,0x1 +rom:0006abc0 AND A5,A7 +rom:0006abc2 JRNE 0x0006abd0 +rom:0006abc4 MOVE *A11(0x80),A7,0x1 +rom:0006abc8 MOVE *A9(0x80),A5,0x1 +rom:0006abcc CMP A5,A7 +rom:0006abce JRNC 0x0006abf6 +rom:0006abd0 MOVE A14,-*SP,0x1 +rom:0006abd2 MOVK 0x8,A7 +rom:0006abd4 MOVE A7,*A14+,0x1 +rom:0006abd6 MOVE *A9(0x20),*A14+,0x1 +rom:0006abda MOVE *A9(0x8),A8,0x0 +rom:0006abde MOVE A8,*A14+,0x1 +rom:0006abe0 MOVE 0x1ad960,*A14+,0x1 +rom:0006abe6 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006abea CALLA 0x07effa5e +rom:0006abf0 MOVE A7,A8 +rom:0006abf2 JR 0x0006afdc +rom:0006abf6 MOVE *A11(0x40),A7,0x1 +rom:0006abfa MOVE *A9(0x80),A5,0x1 +rom:0006abfe OR A5,A7 +rom:0006ac00 MOVE A7,*A11(0x40),0x1 +rom:0006ac04 JR 0x0006adf0 +rom:0006ac08 MOVK 0x1,A11 +rom:0006ac0a MOVE A11,*A13(0xc0),0x1 +rom:0006ac0e JR 0x0006ac44 +rom:0006ac10 MOVE *A13(0x20),A11,0x1 +rom:0006ac14 MOVE *A11(0x48),A7,0x0 +rom:0006ac18 MOVE A7,*A13(0xc0),0x1 +rom:0006ac1c JR 0x0006ac44 +rom:0006ac1e MOVE *A13(0x120),A11,0x1 +rom:0006ac22 MOVE *A13(0x140),A7,0x1 +rom:0006ac26 ADD A7,A11 +rom:0006ac28 MOVE *A13(0x160),A5,0x1 +rom:0006ac2c ADD A5,A11 +rom:0006ac2e MOVE A11,*A13(0xc0),0x1 +rom:0006ac32 JR 0x0006ac44 +rom:0006ac34 MOVE *A9(0x70),A8,0x0 +rom:0006ac38 DEC A8 +rom:0006ac3a JREQ 0x0006ac08 +rom:0006ac3c SUBK 0x2,A8 +rom:0006ac3e JREQ 0x0006ac10 +rom:0006ac40 DEC A8 +rom:0006ac42 JREQ 0x0006ac1e +rom:0006ac44 MOVK 0x1,A11 +rom:0006ac46 MOVE *A13(0xc0),A7,0x1 +rom:0006ac4a SLL A7,A11 +rom:0006ac4c MOVE *A9(0x80),A5,0x1 +rom:0006ac50 INC A5 +rom:0006ac52 CMP A11,A5 +rom:0006ac54 JRHI 0x0006ac5a +rom:0006ac56 SUBK 0x18,A7 +rom:0006ac58 JRLS 0x0006ad1e +rom:0006ac5a MOVE A14,-*SP,0x1 +rom:0006ac5c MOVK 0x8,A11 +rom:0006ac5e MOVE A11,*A14+,0x1 +rom:0006ac60 MOVE *A9(0x20),*A14+,0x1 +rom:0006ac64 SETF 0x8,0x0,0x0 +rom:0006ac66 MOVE *A9(0x8),A8,0x0 +rom:0006ac6a MOVE A8,*A14+,0x1 +rom:0006ac6c MOVE 0x1ad960,*A14+,0x1 +rom:0006ac72 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006ac76 CALLA 0x07effa5e +rom:0006ac7c MOVE A11,A8 +rom:0006ac7e JR 0x0006afdc +rom:0006ac82 MOVE *A13(0x20),A11,0x1 +rom:0006ac86 MOVE *A11(0x40),A7,0x0 +rom:0006ac8a DSJS A7,0x0006ac94 +rom:0006ac8c MOVE *A13(0xc0),A7,0x1 +rom:0006ac90 DEC A7 +rom:0006ac92 JREQ 0x0006ad34 +rom:0006ac94 MOVE A14,-*SP,0x1 +rom:0006ac96 MOVK 0x8,A7 +rom:0006ac98 MOVE A7,*A14+,0x1 +rom:0006ac9a MOVE *A9(0x20),*A14+,0x1 +rom:0006ac9e MOVE *A9(0x8),A8,0x0 +rom:0006aca2 MOVE A8,*A14+,0x1 +rom:0006aca4 MOVE 0x1ad960,*A14+,0x1 +rom:0006acaa MOVE *A13(0xffe0),*A14+,0x1 +rom:0006acae CALLA 0x07effa5e +rom:0006acb4 MOVE A7,A8 +rom:0006acb6 JR 0x0006afdc +rom:0006acba MOVE *A13(0x20),A11,0x1 +rom:0006acbe MOVE *A11(0x40),A7,0x0 +rom:0006acc2 DSJS A7,0x0006acd2 +rom:0006acc4 MOVE *A13(0xc0),A7,0x1 +rom:0006acc8 DSJS A7,0x0006acd2 +rom:0006acca MOVE *A9(0x68),A7,0x0 +rom:0006acce SUBK 0x3,A7 +rom:0006acd0 JRNE 0x0006ad34 +rom:0006acd2 MOVE A14,-*SP,0x1 +rom:0006acd4 MOVK 0x8,A7 +rom:0006acd6 MOVE A7,*A14+,0x1 +rom:0006acd8 MOVE *A9(0x20),*A14+,0x1 +rom:0006acdc MOVE *A9(0x8),A8,0x0 +rom:0006ace0 MOVE A8,*A14+,0x1 +rom:0006ace2 MOVE 0x1ad960,*A14+,0x1 +rom:0006ace8 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006acec CALLA 0x07effa5e +rom:0006acf2 MOVE A7,A8 +rom:0006acf4 JR 0x0006afdc +rom:0006acf8 MOVE A14,-*SP,0x1 +rom:0006acfa MOVK 0xe,A11 +rom:0006acfc MOVE A11,*A14+,0x1 +rom:0006acfe MOVE *A9(0x20),*A14+,0x1 +rom:0006ad02 MOVE *A9(0x8),A8,0x0 +rom:0006ad06 MOVE A8,*A14+,0x1 +rom:0006ad08 MOVE 0x1ad960,*A14+,0x1 +rom:0006ad0e MOVE *A13(0xffe0),*A14+,0x1 +rom:0006ad12 CALLA 0x07effa5e +rom:0006ad18 MOVE A11,A8 +rom:0006ad1a JR 0x0006afdc +rom:0006ad1e SETF 0x8,0x0,0x0 +rom:0006ad20 MOVE *A9(0x60),A8,0x0 +rom:0006ad24 JREQ 0x0006ac82 +rom:0006ad26 DEC A8 +rom:0006ad28 JREQ 0x0006acba +rom:0006ad2a DEC A8 +rom:0006ad2c JREQ 0x0006acba +rom:0006ad2e DEC A8 +rom:0006ad30 JREQ 0x0006acba +rom:0006ad32 JR 0x0006acf8 +rom:0006ad34 MOVE *A13(0x20),A11,0x1 +rom:0006ad38 MOVE A14,-*SP,0x1 +rom:0006ad3a MOVI 0x8c,A7 +rom:0006ad3e MOVE A7,*A14+,0x1 +rom:0006ad40 MOVK 0x1,A5 +rom:0006ad42 MOVE A5,*A14+,0x1 +rom:0006ad44 CALLA 0x07f63a30 +rom:0006ad4a MOVE A8,*A11(0x120),0x1 +rom:0006ad4e MOVE *A11(0x120),A5,0x1 +rom:0006ad52 JRNE 0x0006ad64 +rom:0006ad54 MOVE A14,-*SP,0x1 +rom:0006ad56 MOVI 0x3f562910,A8 +rom:0006ad5c MOVE A8,*A14+,0x1 +rom:0006ad5e CALLA 0x07f24f78 +rom:0006ad64 MOVE *A11(0x120),A5,0x1 +rom:0006ad68 JRNE 0x0006ad92 +rom:0006ad6a MOVE A14,-*SP,0x1 +rom:0006ad6c MOVK 0xb,A5 +rom:0006ad6e MOVE A5,*A14+,0x1 +rom:0006ad70 MOVE *A9(0x20),*A14+,0x1 +rom:0006ad74 SETF 0x8,0x0,0x0 +rom:0006ad76 MOVE *A9(0x8),A8,0x0 +rom:0006ad7a MOVE A8,*A14+,0x1 +rom:0006ad7c MOVE 0x1ad960,*A14+,0x1 +rom:0006ad82 MOVE *A13(0xffe0),*A14+,0x1 +rom:0006ad86 CALLA 0x07effa5e +rom:0006ad8c MOVE A5,A8 +rom:0006ad8e JR 0x0006afdc +rom:0006ad92 MOVE *A11(0x120),*A13(0x40),0x1 +rom:0006ad98 MOVE *A13(0x40),A5,0x1 +rom:0006ad9c MOVB *A9(0x68),*A5(0x0) +rom:0006ada2 MOVB *A9(0x70),*A5(0x8) +rom:0006ada8 MOVB *A9(0x60),*A5(0x10) +rom:0006adae MOVE *A9(0x40),*A5(0x20),0x1 +rom:0006adb4 MOVE *A9(0x80),*A5(0x40),0x1 +rom:0006adba SUB A7,A7 +rom:0006adbc MOVE A7,*A5(0x60),0x1 +rom:0006adc0 MOVK 0x1,A7 +rom:0006adc2 MOVE *A13(0xc0),A11,0x1 +rom:0006adc6 SLL A11,A7 +rom:0006adc8 DEC A7 +rom:0006adca MOVE A7,*A5(0x80),0x1 +rom:0006adce MOVE *A13(0x20),A7,0x1 +rom:0006add2 MOVE *A7(0x120),A5,0x1 +rom:0006add6 JREQ 0x0006adf0 +rom:0006add8 MOVE *A7(0x120),A5,0x1 +rom:0006addc SETF 0x8,0x0,0x0 +rom:0006adde MOVE *A5,A5,0x0 +rom:0006ade0 SUBK 0x2,A5 +rom:0006ade2 JRNE 0x0006adf0 +rom:0006ade4 MOVE *A7(0x160),A5,0x1 +rom:0006ade8 SUB A7,A7 +rom:0006adea SETF 0x1,0x0,0x0 +rom:0006adec MOVE A7,*A5(0x13a),0x0 +rom:0006adf0 SUB A11,A11 +rom:0006adf2 MOVE A11,*A13(0x60),0x1 +rom:0006adf6 MOVK 0x1,A7 +rom:0006adf8 MOVE A7,*A13(0xa0),0x1 +rom:0006adfc MOVE *A13(0x40),A5,0x1 +rom:0006ae00 MOVE *A5(0x80),A5,0x1 +rom:0006ae04 AND A7,A5 +rom:0006ae06 JREQ 0x0006afda +rom:0006ae0a MOVE *A13(0xa0),A11,0x1 +rom:0006ae0e MOVE *A9(0x80),A7,0x1 +rom:0006ae12 AND A11,A7 +rom:0006ae14 JREQ 0x0006afb8 +rom:0006ae18 MOVE *A13(0x40),A7,0x1 +rom:0006ae1c SETF 0x8,0x0,0x0 +rom:0006ae1e MOVE *A7(0x8),A5,0x0 +rom:0006ae22 SUBK 0x3,A5 +rom:0006ae24 JRNE 0x0006ae34 +rom:0006ae26 MOVE *A13(0x60),A5,0x1 +rom:0006ae2a SLL 0x5,A5 +rom:0006ae2c ADD A13,A5 +rom:0006ae2e MOVE *A5(0x120),*A13(0x100),0x1 +rom:0006ae34 MOVE A14,-*SP,0x1 +rom:0006ae36 MOVE *A13(0x60),A5,0x1 +rom:0006ae3a SLL 0x5,A5 +rom:0006ae3c ADD A9,A5 +rom:0006ae3e MOVE *A5(0x160),*A14+,0x1 +rom:0006ae42 MOVE *A13(0x60),A5,0x1 +rom:0006ae46 SLL 0x3,A5 +rom:0006ae48 ADD A9,A5 +rom:0006ae4a MOVE *A5(0xa0),A8,0x0 +rom:0006ae4e MOVE A8,*A14+,0x1 +rom:0006ae50 MOVE *A7(0x10),A8,0x0 +rom:0006ae54 MOVE A8,*A14+,0x1 +rom:0006ae56 MOVE *A13(0x100),*A14+,0x1 +rom:0006ae5a CALLA 0x07eacd68 +rom:0006ae60 MOVE A8,*A13(0xe0),0x1 +rom:0006ae64 MOVE *A13(0x60),A5,0x1 +rom:0006ae68 SLL 0x5,A5 +rom:0006ae6a ADD A7,A5 +rom:0006ae6c MOVE A14,-*SP,0x1 +rom:0006ae6e SUB A7,A7 +rom:0006ae70 MOVE A7,*A14+,0x1 +rom:0006ae72 MOVE A7,*A14+,0x1 +rom:0006ae74 MOVE *A13(0x60),*A14+,0x1 +rom:0006ae78 MOVK 0x1,A7 +rom:0006ae7a MOVE *A13(0x100),A11,0x1 +rom:0006ae7e SLL A11,A7 +rom:0006ae80 MOVE A7,*A14+,0x1 +rom:0006ae82 MOVE *A13(0x60),A7,0x1 +rom:0006ae86 SLL 0x5,A7 +rom:0006ae88 ADD A9,A7 +rom:0006ae8a MOVE *A7(0x160),*A14+,0x1 +rom:0006ae8e MOVE *A13(0x60),A7,0x1 +rom:0006ae92 SLL 0x3,A7 +rom:0006ae94 ADD A9,A7 +rom:0006ae96 SETF 0x8,0x0,0x0 +rom:0006ae98 MOVE *A7(0xa0),A8,0x0 +rom:0006ae9c MOVE A8,*A14+,0x1 +rom:0006ae9e MOVE *A13(0x20),A7,0x1 +rom:0006aea2 MOVE *A7(0x120),A7,0x1 +rom:0006aea6 JREQ 0x0006aec4 +rom:0006aea8 MOVE *A13(0x20),A7,0x1 +rom:0006aeac MOVE *A7(0x120),A7,0x1 +rom:0006aeb0 MOVE *A7,A7,0x0 +rom:0006aeb2 SUBK 0x2,A7 +rom:0006aeb4 JRNE 0x0006aec4 +rom:0006aeb6 MOVE *A13(0x40),A7,0x1 +rom:0006aeba MOVE *A7(0x10),A7,0x0 +rom:0006aebe JRNE 0x0006aec4 +rom:0006aec0 SUB A7,A7 +rom:0006aec2 JR 0x0006aecc +rom:0006aec4 MOVE *A13(0x20),A7,0x1 +rom:0006aec8 MOVE *A7(0xa0),A7,0x1 +rom:0006aecc MOVE A7,*A14+,0x1 +rom:0006aece MOVE *A13(0x20),A7,0x1 +rom:0006aed2 MOVE *A7(0x80),*A14+,0x1 +rom:0006aed6 MOVE *A13(0x40),A7,0x1 +rom:0006aeda MOVE *A7(0x10),A8,0x0 +rom:0006aede MOVE A8,*A14+,0x1 +rom:0006aee0 MOVE *A13(0xe0),*A14+,0x1 +rom:0006aee4 CALLA 0x07eac660 +rom:0006aeea MOVE A8,*A5(0x160),0x1 +rom:0006aeee MOVE *A13(0x60),A5,0x1 +rom:0006aef2 SLL 0x5,A5 +rom:0006aef4 ADD A7,A5 +rom:0006aef6 MOVE *A5(0x160),A5,0x1 +rom:0006aefa JRNE 0x0006afa6 +rom:0006aefc MOVE *A9(0x80),*A7(0x60),0x1 +rom:0006af02 MOVE A14,-*SP,0x1 +rom:0006af04 MOVE *A9(0x80),*A14+,0x1 +rom:0006af08 MOVE *A13(0x20),*A14+,0x1 +rom:0006af0c CALLA 0x07eaafe6 +rom:0006af12 MOVE A14,-*SP,0x1 +rom:0006af14 MOVK 0xb,A5 +rom:0006af16 MOVE A5,*A14+,0x1 +rom:0006af18 MOVE *A9(0x20),*A14+,0x1 +rom:0006af1c SETF 0x8,0x0,0x0 +rom:0006af1e MOVE *A9(0x8),A8,0x0 +rom:0006af22 MOVE A8,*A14+,0x1 +rom:0006af24 MOVE 0x1ad960,*A14+,0x1 +rom:0006af2a MOVE *A13(0xffe0),*A14+,0x1 +rom:0006af2e CALLA 0x07effa5e +rom:0006af34 MOVE A5,A8 +rom:0006af36 JR 0x0006afdc +rom:0006af38 MOVE *A13(0x40),A11,0x1 +rom:0006af3c MOVE *A13(0x60),A7,0x1 +rom:0006af40 SLL 0x5,A7 +rom:0006af42 ADD A11,A7 +rom:0006af44 MOVE *A7(0x160),A7,0x1 +rom:0006af48 SUB A5,A5 +rom:0006af4a MOVE A5,*A7(0x188),0x1 +rom:0006af4e JR 0x0006afb8 +rom:0006af50 MOVE *A13(0x40),A11,0x1 +rom:0006af54 MOVE *A13(0x60),A7,0x1 +rom:0006af58 SLL 0x5,A7 +rom:0006af5a ADD A11,A7 +rom:0006af5c MOVE *A7(0x160),A7,0x1 +rom:0006af60 MOVE *A13(0x60),*A7(0x188),0x1 +rom:0006af66 JR 0x0006afb8 +rom:0006af68 MOVE *A13(0x40),A11,0x1 +rom:0006af6c MOVE *A13(0x60),A7,0x1 +rom:0006af70 SLL 0x5,A7 +rom:0006af72 ADD A11,A7 +rom:0006af74 MOVE *A7(0x160),A7,0x1 +rom:0006af78 MOVE *A13(0x60),A5,0x1 +rom:0006af7c MOVE *A13(0x120),A11,0x1 +rom:0006af80 CMP A11,A5 +rom:0006af82 JRNC 0x0006af88 +rom:0006af84 SUB A5,A5 +rom:0006af86 JR 0x0006afa0 +rom:0006af88 MOVE *A13(0x120),A11,0x1 +rom:0006af8c MOVE *A13(0x140),A5,0x1 +rom:0006af90 ADD A5,A11 +rom:0006af92 MOVE *A13(0x60),A5,0x1 +rom:0006af96 CMP A11,A5 +rom:0006af98 JRNC 0x0006af9e +rom:0006af9a MOVK 0x1,A5 +rom:0006af9c JR 0x0006afa0 +rom:0006af9e MOVK 0x2,A5 +rom:0006afa0 MOVE A5,*A7(0x188),0x1 +rom:0006afa4 JR 0x0006afb8 +rom:0006afa6 SETF 0x8,0x0,0x0 +rom:0006afa8 MOVE *A7(0x8),A8,0x0 +rom:0006afac DEC A8 +rom:0006afae JREQ 0x0006af38 +rom:0006afb0 SUBK 0x2,A8 +rom:0006afb2 JREQ 0x0006af50 +rom:0006afb4 DEC A8 +rom:0006afb6 JREQ 0x0006af68 +rom:0006afb8 MOVE *A13(0x60),A11,0x1 +rom:0006afbc INC A11 +rom:0006afbe MOVE A11,*A13(0x60),0x1 +rom:0006afc2 MOVE *A13(0xa0),A7,0x1 +rom:0006afc6 SLL 0x1,A7 +rom:0006afc8 MOVE A7,*A13(0xa0),0x1 +rom:0006afcc MOVE *A13(0x40),A5,0x1 +rom:0006afd0 MOVE *A5(0x80),A5,0x1 +rom:0006afd4 AND A7,A5 +rom:0006afd6 JRNE 0x0006ae0a +rom:0006afda SUB A8,A8 +rom:0006afdc MOVE *SP(0xc0),A14,0x1 +rom:0006afe0 MMFM SP,0x2aa0 +rom:0006afe6 MMTM SP,0x154 +rom:0006afea MOVE A14,A13 +rom:0006afec ADDI 0x60,A14 +rom:0006aff0 MOVE *A13(0xffe0),A11,0x1 +rom:0006aff4 MOVE *A11(0x120),*A13(0x0),0x1 +rom:0006affa MOVE *A13,A11,0x1 +rom:0006affc JREQ 0x0006b114 diff --git a/xie/ghidra-evidence/slot20/slot20_helper_6CD68_tail.txt b/xie/ghidra-evidence/slot20/slot20_helper_6CD68_tail.txt new file mode 100644 index 0000000..9929dab --- /dev/null +++ b/xie/ghidra-evidence/slot20/slot20_helper_6CD68_tail.txt @@ -0,0 +1,44 @@ +rom:0006ce20 MOVE *A11(0x40),A9,0x1 +rom:0006ce24 MOVE *A9(0x20),*A11(0x60),0x1 +rom:0006ce2a MOVE *A11(0x60),A9,0x1 +rom:0006ce2e MOVE *A9(0x40),A9,0x1 +rom:0006ce32 SETF 0x8,0x0,0x0 +rom:0006ce34 MOVE *A9(0x20),A9,0x0 +rom:0006ce38 SUBK 0x2,A9 +rom:0006ce3a JREQ 0x0006ce4c +rom:0006ce3c MOVE *A11(0x60),A9,0x1 +rom:0006ce40 MOVE *A9(0x40),A9,0x1 +rom:0006ce44 MOVE *A9(0x20),A9,0x0 +rom:0006ce48 SUBK 0x3,A9 +rom:0006ce4a JRNE 0x0006ce80 +rom:0006ce4c MOVE *A11(0x60),A9,0x1 +rom:0006ce50 MOVE *A9(0x40),A9,0x1 +rom:0006ce54 SUB A11,A11 +rom:0006ce56 MOVE A11,*A9(0x140),0x1 +rom:0006ce5a MOVE *A13,A9,0x1 +rom:0006ce5c MOVE *A9(0x60),A7,0x1 +rom:0006ce60 MOVE *A7(0x40),A7,0x1 +rom:0006ce64 MOVE *A7(0x160),A7,0x1 +rom:0006ce68 SETF 0x1,0x0,0x0 +rom:0006ce6a MOVE *A9(0x29),*A7(0x13a),0x0 +rom:0006ce70 MOVE *A9(0x60),A7,0x1 +rom:0006ce74 MOVE *A7(0x40),A7,0x1 +rom:0006ce78 MOVE *A7(0x160),A7,0x1 +rom:0006ce7c MOVE A11,*A7(0x138),0x0 +rom:0006ce80 MOVE A14,-*SP,0x1 +rom:0006ce82 MOVE *A13,A11,0x1 +rom:0006ce84 MOVE *A11(0x60),A9,0x1 +rom:0006ce88 MOVE *A9(0x40),*A14+,0x1 +rom:0006ce8c CALLA 0x07eacdda +rom:0006ce92 MOVE A14,-*SP,0x1 +rom:0006ce94 MOVE *A11(0x60),A9,0x1 +rom:0006ce98 MOVE *A9(0x20),A9,0x1 +rom:0006ce9c MOVE *A11(0x60),A7,0x1 +rom:0006cea0 MOVE *A7,*A9,0x1 +rom:0006cea2 MOVE *A11(0x60),A9,0x1 +rom:0006cea6 MOVE *A9,A9,0x1 +rom:0006cea8 MOVE *A11(0x60),A7,0x1 +rom:0006ceac MOVE *A7(0x20),*A9(0x20),0x1 +rom:0006ceb2 MOVE *A11(0x60),*A14+,0x1 +rom:0006ceb6 CALLA 0x07f63b00 +rom:0006cebc MOVE *A11(0x60),A9,0x1 diff --git a/xie/probe23.py b/xie/probe23.py new file mode 100755 index 0000000..acd3817 --- /dev/null +++ b/xie/probe23.py @@ -0,0 +1,227 @@ +#!/usr/bin/env python3 +"""Interactive XIE 2.3 probe against the VT1200. + +Keeps one X11 connection so the per-client XIE session state is preserved. +Usage: + ./probe23.py session + ./probe23.py defaults + ./probe23.py raw [word1 ...] + ./probe23.py create7 + ./probe23.py sweep + ./probe23.py seq ... # reserved for the client sequence +""" + +import os +import struct +import sys +import socket +import time + +HERE = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, os.path.join(HERE, "evidence")) +import xie_raw as X # noqa: E402 + + +class Cli: + def __init__(self, host=X.HOST, port=X.PORT, timeout=0.8): + self.sock = socket.create_connection((host, port), timeout=5) + self.sock.settimeout(timeout) + X.setup(self.sock) + present, self.opcode, self.first_event, self.first_error = X.query_extension( + self.sock, "Xie" + ) + if not present: + raise SystemExit("Xie not present") + self.seq = 2 # setup + QueryExtension + self.id_base = X.LAST_SETUP.get("id_base", 0x00C00000) + self.id_mask = X.LAST_SETUP.get("id_mask", 0x000FFFFF) + self.root = X.LAST_SETUP.get("root", 0x8006B) + self.sw = X.LAST_SETUP.get("screen_width", 0) + self.sh = X.LAST_SETUP.get("screen_height", 0) + + def new_id(self, n=0x0AAAA): + """A legal client resource id for this connection.""" + return (self.id_base | (n & self.id_mask)) & 0xFFFFFFFF + + def create_window(self, wid, w, h, x=10, y=10): + """Core X CreateWindow (InputOutput, CopyFromParent depth/visual).""" + body = struct.pack(" 3 else 0xFFFF + session(c) + create7(c, ident, cls) + elif cmd == "sweep": + ident = int(argv[2], 0) + cls = int(argv[3], 0) if len(argv) > 3 else 0xFFFF + session(c) + sweep(c, ident, cls) + elif cmd == "cs7": + ident = int(argv[2], 0) + cls = int(argv[3], 0) if len(argv) > 3 else 0xFFFF + session(c) + create7(c, ident, cls) + sweep(c, ident, cls) + elif cmd == "export": + session(c) + demo_export(c, int(argv[2]) if len(argv) > 2 else 10) + elif cmd == "raw": + minor = int(argv[2], 0) + words = [int(w, 0) for w in argv[3:]] + session(c) + raw(c, minor, words) + else: + raise SystemExit(__doc__) + finally: + c.close() + + +if __name__ == "__main__": + main(sys.argv) diff --git a/xie/probe_verify.py b/xie/probe_verify.py new file mode 100644 index 0000000..0707e75 --- /dev/null +++ b/xie/probe_verify.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python3 +"""Verified probe: slot 33 / slot 44 against two live resources. + +Rules enforced here (each one cost a wrong answer at some point): + * ONE helper for object fields: byte(ptr, N) == memory at ptr + N*8 + (ptr is a BIT address; ptr+8 is byte 1, not byte 8). + * every request reply is read and asserted; connections are not reused + across requests that can fail. + * raw bytes of any reply are printed, never interpreted silently. +""" +import struct +import sys +import time + +sys.path.insert(0, "/home/arti/code/k-space/vt1200/xie") +sys.path.insert(0, "/home/arti/code/k-space/vt1200/dwt") + +import probe23 as P # noqa: E402 +import xie_raw as XR # noqa: E402 +import exploit # noqa: E402 + +LOG = "/home/arti/code/k-space/vt1200/debug.log" +MINOR_SET_OP_DEFAULTS = 3 +MINOR_CREATE = 8 +MINOR_SLOT33 = 33 +MINOR_SLOT44 = 44 + + +def stores(): + try: + with open(LOG) as f: + return [l.strip() for l in f if l.startswith("REGIDSTORE")] + except OSError: + return [] + + +class Dev: + """Thin wrapper giving the one field-access helper.""" + + def __init__(self): + self.rd = exploit.RDebug("192.168.99.2", 771, 5.0, False) + self.rd.connect() + + def byte(self, ptr, n): + return self.rd.peek(ptr + n * 8, 1)[0] + + def u32(self, ptr, n): + return struct.unpack(" %s" % describe(reply(conn))) + + n0 = len(stores()) + for i in (a_id, b_id): + send(conn, MINOR_CREATE, 12, + struct.pack(" %s" % (i, describe(reply(conn)))) + time.sleep(0.05) + + objs = {} + for line in stores()[n0:]: + oid = int(line.split("id=")[1].split()[0], 16) + ptr = int(line.split("obj=")[1].split()[0], 16) + objs[oid] = ptr + print(" registered: %s" % {hex(k): hex(v) for k, v in objs.items()}) + if len(objs) < 2: + conn.close() + return None + + dev = Dev() + snapshot(dev, "before any slot request", objs) + + results = {} + for name, minor, words, payload in ( + ("slot33 [A,B,0]", MINOR_SLOT33, 4, + struct.pack(" %s" % (name, describe(r))) + print(" new REGIDSTORE: %s" % (new or "(none)")) + snapshot(dev, "after " + name, objs) + results[name] = (describe(r), tuple(new)) + + dev.close() + conn.close() + return results + + +def main(): + r1 = trial("run 1") + r2 = trial("run 2") + print("\n=== reproducibility ===") + if r1 and r2: + for k in r1: + same = r1[k][0] == r2[k][0] + print(" %-17s run1=%s" % (k, "MATCH" if same else "DIFFERS")) + if not same: + print(" run1: %s" % r1[k][0]) + print(" run2: %s" % r2[k][0]) + else: + print(" a run failed to set up (see above)") + + +if __name__ == "__main__": + main() diff --git a/xie/xc/doc/hardcopy/XIE/SI/xieSIarch.txt b/xie/xc/doc/hardcopy/XIE/SI/xieSIarch.txt new file mode 100644 index 0000000..d6fc789 --- /dev/null +++ b/xie/xc/doc/hardcopy/XIE/SI/xieSIarch.txt @@ -0,0 +1,1632 @@ + +XIE Sample Implementation Architecture + + +Authors + +Robert NC Shelley +Dean A. Verheiden +J. Ben Fahy + +Sample Implementation Team +AGE Logic, Inc. + + + + +Additional Contributors +Larry Hare +AGE Logic, Inc. + + + + + + + +Comments concerning the SI architecture should be submitted by electronic mail to: +imagework@x.org + + + + + + +Copyright Notice + +This document is being provided by AGE Logic, Inc. and X Consortium under the following license. By obtaining, +using and/or copying this documentation, you agree that you have read, understood, and will comply with these +terms and conditions: + +Permission to use, copy, modify, distribute and sell this documentation for any purpose and +without fee or royalty and to grant others any and all rights granted herein is hereby granted, +providing that you agree to comply with the following copyright notice and statements, including +the disclaimer, and that the same appears on all copies and derivative works of the document that +you make. + +Copyright 1993 by AGE Logic, Inc. and X Consortium, Inc. + +THIS DOCUMENT IS PROVIDED "AS IS". AGE LOGIC AND X CONSORTIUM MAKE NO +REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of example, but not +limitation, AGE LOGIC AND X CONSORTIUM MAKE NO REPRESENTATION OR WARRANTIES +OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE +DOCUMENT DOES NOT INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC AND X +CONSORTIUM SHALL BEAR NO LIABILITY FOR ANY USE OF THIS DOCUMENT. IN NO +EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, OR +CONSEQUENTIAL DAMAGES, INCLUDING LOSS OF PROFITS, REVENUE, DATA OR USE, +INCURRED BY EITHER PARTY OR ANY THIRD PARTY, WHETHER IN AN ACTION IN +CONTRACT OR TORT OR BASED ON A WARRANTY, EVEN IF AGE LOGIC OR X CONSORTIUM +OR LICENSEES HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +The names of AGE Logic and X Consortium may not be used in advertising or publicity pertaining +to the document or software without specific, written prior permission from AGE Logic and X +Consortium. + + + + + +Acknowledgments + +XIE has evolved from the original specifications and sample implementation developed by Digital Equipment +Corporation and contributed to the X Consortium. +We wish to thank Digital Equipment Corporation and Hewlett-Packard Co. for contributing their pipeline +implementations to the X Consortium. The SI architecture has benefited from these efforts. + + + +Table of Contents +Copyright Notice ii +Acknowledgments iii +Table of Contents iv +1. Introduction 1 +1.1. Task Definition 1 +1.2. Design Goals 2 +1.3. Document Organization 3 +2. Architecture Overview 4 +2.1. X/XIE Interfacing 4 +2.2. XIE Components 5 +2.2.1. Photoflo Compiler 6 +2.2.2. The Photoflo Linker 12 +2.2.3. The Photoflo Runtime Manager 13 +2.2.3.1. Scheduler 14 +2.2.3.2. Data flo Manager 15 +2.2.4. The XIE Resource Manager 15 +2.2.5. The XIE Memory Manager 15 +3. Extension Initialization 16 +4. Memory Management 17 +5. Dispatching requests 18 +6. Data Representations 19 +6.1. Canonic Data 19 +6.2. Non-canonic Data 19 +6.2.1. Byte Stream Data 19 +6.2.2. Compressed Data 19 +6.2.3. Run-length Data 20 +6.3. Tri-chromatic Data 20 +6.4. Strips 20 +7. Data Structures 21 +7.1. Data Formats 21 +7.1.1. Canonic 21 +7.1.2. Compressed 21 +7.1.3. Lookup-table 22 +7.2. Resource structures 22 +7.2.1. ColorList 22 +7.2.2. LUT 22 +7.2.3. Photomap 22 +7.2.4. ROI 22 +7.2.5. Photospace 23 +7.2.6. Photoflo 23 +7.3. Photo Element Definition 24 +7.4. DDXIE Structures 25 +7.4.1. Photoflo run-time context 25 +7.4.2. Photo Element run-time context 25 +7.4.3. Receptor 25 +7.4.4. Strip 25 +8. Protocol requests 26 +8.1. Global Query requests 26 +8.1.1. QueryImageExtension 26 +8.1.2. QueryTechniques 26 +8.2. Resource requests 27 +8.2.1. Overview 27 +8.2.1.1. Creating Resources 27 +8.2.1.2. Flo'ing Resources 27 +8.2.1.3. Destroying Resources 27 +8.2.2. ColorList 28 +8.2.2.1. Create 28 +8.2.2.2. Query 28 +8.2.2.3. Purge 28 +8.2.2.4. Destroy 28 +8.2.3. LUT 28 +8.2.3.1. Create 28 +8.2.3.2. Destroy 28 +8.2.4. Photomap 29 +8.2.4.1. Create 29 +8.2.4.2. Query 29 +8.2.4.3. Destroy 29 +8.2.5. ROI 29 +8.2.5.1. Create 29 +8.2.5.2. Destroy 29 +8.3. Photoflo related requests 30 +8.3.1. ServerIDspace 30 +8.3.2. Photospace 30 +8.3.2.1. Create 30 +8.3.2.2. Destroy 30 +8.3.3. Immediate-mode specific 30 +8.3.3.1. ExecuteImmediate 30 +8.3.4. Stored-mode specific 31 +8.3.4.1. Create 31 +8.3.4.2. Modify 31 +8.3.4.3. Redefine 31 +8.3.4.4. Execute 31 +8.3.4.5. Destroy 31 +8.3.5. ClientData transport 32 +8.3.5.1. Put 32 +8.3.5.2. Get 32 +8.3.6. Query/Control 32 +8.3.6.1. Query 32 +8.3.6.2. Await 32 +8.3.6.3. Abort 32 +9. DIXIE Photoflo Management 33 +9.1. Overview 33 +9.2. Photoflo Creation 33 +9.2.1. Creating the Flo 33 +9.2.2. Traversing the DAG 34 +9.2.3. Registering the Flo 36 +9.3. Photoflo Execution 37 +9.3.1. Prepping the DAG 37 +9.3.2. Analyzing the DAG 37 +9.3.3. Linking an executable Photoflo 37 +9.3.4. Starting the flo 37 +9.3.5. Resuming the flo 38 +9.3.6. Stopping the flo 38 +9.3.7. Destroying an executable Photoflo 38 +9.3.8. Event notification from a flo 38 +10. DDXIE Photoflo Management 39 +10.1. DAG Analysis 39 +10.1.1. Choosing Element Handlers 39 +10.1.2. Choosing a Linker and Photoflo Manager 41 +10.2. Photoflo Linker 41 +10.3. Photoflo manager 42 +10.3.1. Startup 42 +10.3.2. Scheduling 42 +10.3.3. Data Manager 44 +10.3.4. Input 46 +10.3.5. Output 46 +10.3.6. Query 46 +10.3.7. Abort 46 +10.3.8. Destroy 46 +11. Photo Elements 47 +11.1. Element Structures 47 +11.2. Element Interfaces 48 +11.2.1. Create 48 +11.2.2. Initialize 48 +11.2.3. Activate 48 +11.2.4. Flush 48 +11.2.5. Reset 48 +11.2.6. Destroy 48 + + + + +1. Introduction +The X windows Image Extension (XIE) project was initiated in 1988 by Joe Mauro of Digital Equipment Corporation, +in order to meet the needs of those wanting improved imaging facilities within X. XIE is targeted at the problem of +image display, and rendering any digital image on any X-capable hardware. XIE is not intended to be a general +purpose image processing engine, although it does provide a rich environment for performing simple image +enhancement operations and format conversions. XIE also permits the support of image-specific hardware in the +server, including but not limited to decompression, scaling, rotation and convolution accelerators. +The X Consortium accepted XIE into Technical Review in March of 1991. After over a year and a half of debate and +analysis by a number of interested Consortium members, a revised Version 4.12 of the XIE protocol was passed out +of Technical Review and into Public Review. The Public Review period is scheduled to expire April 23rd, 1993. It is +the goal of the Consortium that XIE will be made widely available shortly after acceptance as an official standard, +and therefore AGE Logic, Inc. has been commissioned to provide a Sample Implementation (SI) of XIE, to be +distributed as part of the December 1993 X windows R6 release. This document describes AGE Logic's initial design +of the XIE SI architecture. +The audience of this document is anticipated to be X Consortium members who have a working understanding of +XIE, either through participating in its design within the Consortium, or by having read the latest version of the XIE +protocol, by Shelley et al., published in Special Issue C of The X Resource journal. An overview of XIE by Fahy +and Shelley is also provided in the same issue. Other references of interest would include The X Window System +Server by Israel and Fortune, and X Window System by Scheifler and Gettys. + + +1.1. Task Definition +XIE is defined by the protocol document referenced in the previous section. XIE requests are channeled through the +Core X dispatch loop to the dispatchers (swapped and unswapped) for the XIE SI. XIE-specific events and errors are +originated in SI and routed back through Core X to the waiting client. +XIE defines six new resources: ColorLists, LUTs, Photoflos, Photomaps, Photospaces, and ROIs. Each of these +resources must be recorded with Core X, so that at client shutdown the resources may be freed reliably. +In the XIE computational model, a client provides a blueprint for a computational engine, a photoflo, and passes it to +the server for execution The blueprint is a directed acyclic graph (DAG), which shows what the components +(elements) of the engine are, and how data flows between them. Import elements receive data from the client, Core X, +or from resources. Processing elements receive data from import elements or upstream processing elements, perform +a specified operation on the data, and pass the data on downstream. Export elements define the exit point of data +from the photoflo. Data from Import or Processing elements may be routed to the client, Core X, or an XIE resource +simply by adding an Export connection after the element of interest. +Processing, Import, and Export elements are defined at two levels. For example, a Geometry element states that +incoming image data is to be re-sampled to produce a new output image. The specific sampling mechanism is +selected by using a set of technique parameters in the element specification. Thus, technique parameters give fine- +grain information on how a course-grain operation (such as geometric transformation) is to be performed. + + +To summarize the tasks which the SI must perform, it must: +1. Integrate into Core X +2. Receive and correctly interpret XIE-specific requests +3. Manage XIE-specific resources +4. Build computational engines (photoflos) according to the blueprints (DAGs) provided +5. Execute the photoflos +6. Return error and event information as required. + +Building and executing the photoflos necessitates: +1. Parsing the DAG information +2. Performing semantic analysis +3. Matching sub-tasks (defined by elements, etc.) to machine-specific code +4. Scheduling execution +5. Managing data flow. +6. Handling special conditions, including shutdown and return of control. + +Note that the SI must be able to support multiple photoflos executing simultaneously, and thus all photoflo and +element code must be reentrant, and data structures must not be written so as to preclude reentrancy. + +1.2. Design Goals +The X Consortium, in soliciting for bids on the SI project, has previously stated the following design requirements: +1. The SI must be easily ported to many different platforms. +2. The SI must be modular, to support easy customization. +3. Performance should be commercial quality. +4. Performance should not be biased to a particular machine architecture (e.g., big endian machines should +have performance comparable with little endian machines of the same approximate raw speed). +5. The SI should accommodate servers with limited memory. + +An additional, implied requirement is: +6. Design of the SI should be minimal risk. + +That is, it must be acknowledged that while there are any number of ways in which photoflo optimizers and +schedulers could be implemented, the overriding goal must be to ensure that an SI is available in time for the R6 +release of X windows. + +1.3. Document Organization +This chapter has provided a brief introduction to the topic of designing a sample implementation of the X image +extension. The next chapter provides an overview of the architecture as the design currently stands. It starts by +looking at XIE from a very high conceptual level and working its way down examining a few of the SI's major building +blocks. +The next three chapters discuss in more detail: extension initialization, memory management, and the dispatching of +requests through Core X. They are followed by a brief description of a some high-level data representations, +followed by a detailed exposition of critical data structures. These chapters serve as references for the chapters that +follow. + The eighth chapter discusses the implementation ramifications of XIE requests, up to the topic of photoflo +management in the server. That issue is covered in detail in chapters nine and ten, which are split across device- +independent / device-dependent lines. The final chapter discusses elements; their data structures and interfaces. + + + + +2. Architecture Overview + +Core X is divided into device-independent (dix) and device-dependent (ddx) layers. The dix layer contains code and +data structures which should not need to be altered in porting X from one machine to another. The ddx code is where +device-specific information, such as drivers for special hardware, assembly routines for optimized graphics, etc., are +placed. The dix layer accesses ddx code by calling ddx procedures indirectly, through a list of well-defined entry +points stored in dix resources. +The design of XIE is intentionally modeled so as to follow the same basic form. XIE is divided into a device- +independent layer called dixie, and a device-dependent layer called ddxie. A set of dixie data structures is defined, +which includes a list of entry points to ddxie routines. In the SI, this list will be filled exclusively with machine- +independent XIE code. However, in the interest of portability and optimization, care has been taken to make it easy +to override the generic code with machine-specific routines. It is anticipated that server implementors porting to new +hardware will create new ddxie subdirectories which are machine dependent, as is depicted below. + + + + +2.1. X/XIE Interfacing +The figure on the following page illustrates the interface between the new XIE architecture and the existing Core X +server design. All routing of data in or out of XIE must go through Core X. XIE requests are received by the Core X +dispatcher, recognized as belonging to XIE, and the appropriate procedure to receive the request is called. Similarly, +errors and events generated within XIE are routed back out using standard Core X mechanisms. Image, LUT, and +ROI data is passed from the client to XIE via a PutClientData request, and thus follows the same route as normally +dispatched data. Image, LUT and ROI data to be returned to the client is sent via Reply packets, using the +conventional Core X technique. Finally, XIE moves data between an XIE photoflo and Core X resources by making +use of the list of Core X entry points described above. + + +2.2. XIE Components +At the highest level, XIE may be viewed as containing the components depicted in the figure below (it also contains +other components, not shown). Core X provides a resource manager in the dix layer and a memory manager in ddx. +XIE will provide its own resource and memory managers layered on top of the Core X facilities. XIE also has its own +dispatcher. Routines within the XIE dispatcher are called when the X dispatcher receives a request which it +recognizes as belonging to the imaging extension. + +When the request contains the definition of a photoflo, this definition must be translated into the appropriate code +and data structures required to build and execute the flo. For this reason, XIE may be viewed as containing a +Photoflo Compiler, which performs this task. The output of the compiler is a set of data structures which describe +how the photoflo will be executed, given the existing available code. Initialization of static variables and resolution of +entry points identified by compilation is the responsibility of the Photoflo compiler. Execution is conducted by a +Photoflo Manager, which consists of a Scheduler, Dataflo Manager, and other components. Client data is input +through the XIE dispatcher and given to the Photoflo Manager, which deposits the data in with the Dataflo Manager +and then wakes up the Scheduler. +2.2.1. Photoflo Compiler +The sub-structure of the Photoflo Compiler may be derived by comparing the task of compiling photoflos to +classical compiler problems. The figure below shows the classical model of a compiler which is producing +code for the expression a = bee + cf*d[i], where cf is floating point and a, bee, and d are integers. + +The input to the compiler is simply a stream of bytes, that is, a followed by = followed by b, followed by e, +etc., with no meaning or structure yet attached to the stream. Lexical analysis groups the characters to- +gether into the distinct tokens, a, bee, + , cf, etc. Syntax analysis is used to resolve the order in which +fundamental operations are carried out, which is represented as a directed graph. Semantic analysis adds +type and other attribute information to the problem representation. Note that required type conversions and +operator classes have been made explicit in the output of the Semantic Analyzer. Intermediate Code +Generation converts the DAG representation into a device independent pseudo-language (output not +shown). The first four phases of the compiler are often grouped together and referred to collectively as the +compiler front end, which is the device independent part of the compiler. +The back end of a compiler is the device dependent part, which consists of the optimizer and code gen- +erator. Most compilers incorporate both device independent and device dependent optimizations. The +code generator translates from the intermediate language representation to the language of the target ma- +chine. +In attempting to apply the standard compiler model to the problem of photoflo compilation, a number of +fundamental differences in the two environments must be recognized. First, it should be noted that there is +usually a significant delay between when a conventional compiler translates source code into object code +and when the final executable is eventually run. This means that the time constraints on the compiler are +not necessarily severe, allowing for more extensive optimization. In contrast, in XIE, it will always be the +case in compiling photoflos that significant parts of the compilation time will occur just before execution, +and add to the perceived execution time. This is because the XIE protocol expressly forbids resolving the +attributes of input data before the ExecutePhotoflo (or equivalent) request is given. This puts a hold on +semantic analysis, constraining it to wait until just before execution. Since code generation and +optimization follow the semantic analysis phase of compilation, these phases are also constrained, and the +time to carry them out should be kept tightly restricted. This inhibits exhaustive optimization, and +encourages very simple code generation strategies. +Another important environmental difference which affects the application of the compiler model is that most +conventional languages expose the canonical data types of the processor fairly conveniently. The +underlying hardware model assumes registers of a few fixed sizes, whereas in XIE, the "register size" of the +server is hidden completely. Canonical data types, such as 1, 8, and 16 bits might be chosen by the server +implementor in order to reduce the number of cases for which processing elements must be written. +However, this may vary from server to server, and thus the SI code should not make the decision that it +already knows all of the canonical data types. Although the SI will support 1, 8, 16 and 32 bit data, it is also +a design goal that the SI be easily extensible if a vendor also wants to support 4 bit data. This implies that +the type resolution portion of the semantic analyzer must be moved out of the device independent front end, +and into the device dependent back end. +The figure below shows the basic compiler model modified to accommodate the XIE computational model. +Only lexical and syntactic analysis may occur prior to receiving the equivalent of an ExecutePhotoflo +request. Lexical analysis in the context of XIE refers to parsing the raw data stream and breaking it into the +element definitions, etc. Syntactic analysis refers to analyzing the DAG to make sure it is legal (e.g. contains +no cycles). As the DAG is analyzed, the dixie data structures which describe it are filled in. + +The semantic analyzer is split into device independent and device dependent portions. Propagation of +attributes from import elements to downstream elements occurs in the device independent part of the +semantic analyzer, whereas type resolution requires device dependent information. Both parts of the +semantic analyzer fill in structures in the dix layer of XIE (see figure, following page). The difference is that +the attribute analyzer does not use any device independent information to produce its data, whereas the +type resolution code does. + +The code generator has the task of accepting the device-independent photoflo representation as input, and +filling in the device-dependent data structures which implement the photoflo. Because code generation may +be closely coupled with type resolution, the SI groups these two operations into a DAG Analyzer, as is +depicted in the figure below. The SI will include a default machine independent DAG Analyzer which +handles type resolution by a simple type upgrading scheme, and which generates code by mapping directly +from elements defined in the DAG to mi element handlers. The design accommodates substitution of a +device dependent DAG Analyzer, however, which can choose to perform special optimizations, support +non-SI canonical data types, and employ a machine-dependent element interface. + + +The figure below illustrates the fundamental task of the DAG Analyzer. A Photoflo to be compiled is shown +at the left, in which a one-bit image is imported as a process domain, a 4 bit image is imported and +convolved, the output is constrained, and a lookup table transformation is applied using Point. The XIE +server implements Point, Convolve, Constrain, ..., operations on various canonical data types. By definition, +element handlers only accept canonical data as input, and only produce it as output. If the routines to +perform a convolution can only accept 1,8,16, or unconstrained data, and the routines to import client image +data can also produce any of these types, it is necessary to negotiate on which type should be used +between connected elements. + + + +Consider the photoflo depicted below, which has 4 bit image data being fed to both Convolve and Point. +The user has specified in the protocol that the Point element is to produce data with 128 levels, which +requires at least 7 bits of storage. This suggests that the output of the Point element should produce 8 bit +data, which is the closest canonical form with adequate resolution. + + + +Using the same reasoning, that is, that elements should produce as output the smallest-resolution +canonical form which is adequate, ImportClientPhoto should produce 8 bit data. This would fix the type at +the input of the Convolve element, implying that it is necessary to choose a Convolve handler which +accepts 8 bit data. + + +Let us now suppose that it is desirable that server implementors be allowed to introduce new canonical +types, such as four bit data. This would be quite natural on servers which only had four bit deep displays, +and wanted to insure good performance on operations like: + + + + +Rather than have to convert the 4 bit data to 8 bits, do an 8 bit Point and then convert back to 4 bits in +ExportDrawable, it might be more efficient to keep the data as 4 bits throughout. This implies that the +implementor might want to define an ImportClientPhoto handler which could produce 4 bits output, a 4->4 +Point handler, and an ExportDrawable handler which accepts 4 bits. Let us suppose this is permissible. +Returning to the case of the photoflo containing a Convolve element above, reapplying the heuristic that +the output of an element should be in the smallest available canonical form which has adequate resolution, +we reach the situation: + + +The problem is, we are now requiring the presence of handlers for Convolve and Point which can accept 4 +bit data and produce unconstrained and 8 bit data, respectively, and these may not exist. It might be +reasonable to require a 4->8 Point handler, since that may have general utility, but since Convolve is +fundamentally an unconstrained operation, it seems overly harsh to force the server implementor to go +through and alter all element handlers like Convolve to include conversions of data types which are not +interesting. An alternative is to provide mechanism in the dixie structures for a DAG analyzer to be able to +insert "pseudo-elements" which do the conversion or perform analogous tasks: + + + +Thus, the SI data structures allow the DAG analyzer to produce a new, optimized DAG with a different +number of "elements" than the original flo. The ddxie layer is allowed to define pseudo-elements which may +perform type conversions, or combine two or more elements into a single "super-element," or perform other +functions (for example, converting a bitonal image into a list of run-lengths, if it is to be used as a Process +Domain). This provides a great deal of flexibility for future enhancement and optimization. + +The SI DAG Analyzer will employ the following general method: +1. For each element defined by the protocol, and each implementation-specific pseudo-element, there must be +written at least one handler which is capable of doing processing for that element. +2. All handlers will output a type that is the smallest acceptable canonical type for the input data and the +particular operation. +3. Prior to trying to find a handler for a particular element, the DAG Analyzer will propagate the output types +of all of its source elements to its input data receptors. +4. Each handler must provide a test entry point, which the DAG Analyzer can call providing the photoflo and +tag number of the element to be "compiled". +5. The handler's test function will examine the element parameters and the requested input types and return +ACCEPT if it agrees to handle the element, and REJECT otherwise. +6. A handler which agrees to accept an element may change the input type coming from any source element by +indicating that a Convert pseudo-element must be inserted between itself and the source. +7. If multiple downstream elements require the same conversion, they will share output from the same +converter. + + The next figure provides a simplified diagram of relevant data structures. The DAG analyzer is given a +photoflo, which is shown at left. It orders the elements by their distance from the nearest Import element, +and resolves types in the order of increasing distance. The upper right hand corner of the figure shows a list +of handlers associated with each element type. By the time the DAG analyzer gets to the Convolve element, +ImportClientPhoto has already been resolved to produce four bit output, and that "suggested input type" +has been recorded in the input receptor of the Convolve element. + + + +The DAG analyzer looks at its list of handlers which are of type Convolve, and selects the first member of +that list, ddConvolve. This handler supports floating point hardware, and as written, does not insert +Conversion pseudo-elements to prepare its input data. Therefore it rejects the element, and the DAG +analyzer goes on to the next handler in the list for Convolve. +All elements will contain as the last handler in their list a machine independent handler which can accept any +canonical data type. If the data type matches an explicitly supported type, the handler loads the entry point +for the specific function and leaves the requested types unchanged. If the data type is not explicitly +supported, the handler inserts a Conversion element into the photoflo (these are pre-resolved, so the DAG +analyzer doesn't have to back up to find a handler for it) and accepts with the nearest sufficient canonical +type which it supports. +The SI will provide mi handlers which can accept any element specified in the protocol. Note however that +the SI may provide multiple mi handlers for a single element, which may be differentiated by which +techniques they support, etc. +The method described above solves the code generation problem by effectively labeling each element in the +photoflo with a handler. Discussion of the data flow between elements and scheduling of processing is +deferred to the section on the Photoflo Runtime Manager. + +2.2.2. The Photoflo Linker +After the Photoflo Compiler has resolved data types and handlers for each element, the Photoflo Linker is +called to perform one-time ("static") initialization of the photoflo. It is at this point that the first device- +dependent structures are created, which provide an execution context for the photoflo and its elements. +Entry points into the photoflo manager are loaded in the dixie flo-def structure, along with entry points to +the flo manager's sub-components, the scheduler and data manager. +Both the linker and the DAG analyzer portion of the compiler can be skipped if the photoflo has been +executed previously. This is because the dixie structures retain the one-time initialization state even after +shutdown. The attribute checking portion of the Semantic Analyzer must (by directive of the protocol) be +re-run at each invocation, but if it discovers that no attributes have changed, it skips the back end of +compilation and linking, and proceeds directly to execution. + + +2.2.3. The Photoflo Runtime Manager +Photoflo management is partially the responsibility of the client, and partially the responsibility of the +server. The client sends Execute, PutClientData, GetClientData, QueryPhotoflo, Await and Abort requests +which the server must accommodate. Specific Procs in the XIE dispatcher receive these requests, and after +possibly making other internal server calls (e.g., ProcExecute may call the compiler or linker first), route +control to the Photoflo Manager, which resides in ddxie. + +The entry points of each photoflo manager component are placed in the dixie data structures. Thus, the +photoflo manager is purposely designed to support ample customization, at several different levels. For +example, an md scheduler could be substituted, while to using other components from the mi photoflo +manager. The selection of which components to use could be determined by the nature of the photoflo. For +example, the general-case mi photoflo manager could be chosen if the DAG is topologically complex, +whereas a simpler photoflo manager might be appropriate for linear photoflos. + +2.2.3.1. Scheduler +The scheduler is responsible for managing the activation of elements in order to move data through +the photoflo. The SI provides a default scheduler in the mi layer, which may be overridden by a +device-dependent scheduler by the server implementor. +Any scheduler has the following responsibilities: +1. When data arrives from the client, it must be delivered to the appropriate receiving element. +2. Elements which have filled their output buffers must be suspended until there is room to generate +more output. +3. Elements which have sufficient data to begin processing must eventually be activated, to avoid +deadlock. +In addition there are the following issues to be dealt with: +1. Low-memory servers should minimize the requirement of large data buffers within the photoflo, +possibly at the expense of some performance loss. +2. High-memory servers should maximize efficiency, possibly at the expense of using more memory +in photoflo data structures. +3. For slow operations, it may be desirable to minimize the initial delay to receiving data in export +elements. +4. For fast operations, it may be desirable to maximize performance, so as to increase the number of +operations per second which can be carried out. + +Consideration of the above issues and responsibilities leads to the notion of letting elements pro- +duce a configurable number of lines when activated. If an element only produces one line at a time +and then returns to the scheduler for permission to proceed further, excessive overhead may +result. If an element on the other hand waits for all input data to proceed and then produces all +output data at once, excessive memory usage in the photoflo may occur. +The SI scheduler supports elements that can produce their output data in strips, that is, a fixed +number of lines at a time. The number of lines in a strip will vary among elements and even +servers, since memory/performance tradeoffs in the scheduler will tend to vary with the same +tradeoffs in the server. Thus, the number of lines in a strip for any element is set by that element's +ddx-level handler, at link time. At the same time, a minimum number of lines of input which are +required to commence processing are also recorded in the element's receptor data structures. +Another concern of the scheduler implied by the above issues and responsibilities is to maintain an +even flow of data through the photoflo. If the scheduler simply finds an element which can be +activated and repeatedly executes it until all input data is exhausted, the data may wind up moving +slowly through the photoflo in large chunks, as if the strip sizes were equal to the entire output +image. Thus the SI scheduler attempts to balance the flow of data by reducing the priority of +elements which have recently been activated, and increasing the priority of elements which have +recently received data. The SI scheduler will also yield to the client when it has finished +processing all elements since the last client yield, presuming there is more data which the client is +obligated to send. +To summarize the heuristics upon which the SI scheduler are based: +1. elements produce output several lines at a time instead of one or all, to avoid thrashing in the first +place and heavy memory consumption in the second. +2. the scheduler yields to Core X if there is pending client input data, after checking to make sure that +all elements which are capable of processing have had a turn since the last yield. +3. elements which have recently been executed have their priorities downgraded. +4. elements which have recently received data have their priority upgraded. +Details of the actual algorithm employed for scheduling may be found in the last chapter on DDXIE +Photoflo Management. + +2.2.3.2. Data flo Manager +The data flo manager has the responsibility of moving data between the elements which produce it +to the elements that consume it. In order to minimize overhead, pointers to the data are exchanged, +rather than copying the data itself. +In this model, an element requests a pointer to an output strip from the data flo manager when it is +ready to execute. The element maintains exclusive control over that strip while it is processing its +data and placing it in the strip. Once the element has finished with the strip, it calls the data flo +manager to pass it to downstream receiving elements. +After being informed that a strip has been completed, the data flo manager determines which +downstream element receptors are in need of the data. A pointer to the strip is then added to the +end of each such receptor's input strip list. +For the receiving elements, the strips will usually be read-only, unless the elements requests and +receives permission to re-use the input strip for storing its output. Macros will be provided as a +tool to hide the stripped nature of the data. While using these macros will avoid problems asso- +ciated with downstream elements consuming strip output at different rates, elements will have the +option of accessing data on a whole strip basis if they so desire. +Details of the actual algorithm employed for dataflo management may be found in the last chapter +on DDXIE Photoflo Management. + +2.2.4. The XIE Resource Manager +The XIE resource manager is responsible for creating, doing lookup, and destroying XIE resources. Those +resources available to the client are Photomap, LUT, Photoflo, Photospace, ROI, and ColorList types, +which are registered with the Core X resource manager to comply with the standard X model. +A photospace resource maintains a list of the photoflos which reside in it. When the photospace is de- +stroyed, all of its photoflos are destroyed along with it. Destroying a photoflo requires going through its +list of elements and destroying all of their data structures too. + +2.2.5. The XIE Memory Manager +The XIE SI will layer an XIE-private set of allocation calls on top of the standard X allocation routines. This +will permit customization of the memory manager to allow for special fragmentation avoidance algorithms, +etc. + + + +3. Extension Initialization +The image extension is initialized along with other extensions by setting the XIE flag in the module miinitext.c. This +causes the function XieInit() to be called during server startup. +XieInit() calls CreateNewResourceClass() to register an XIE resource class, and registers the Photomap, LUT, +Photoflo, Photospace, ROI, and ColorList resource types and their respective deleteFunc vectors by calling +CreateNewResourceType(). +Next XieInit() calls AddExtension() to register the XIE dispatchers and closeDownProc with Core X. AddExtension +returns the major opcode, error and event bases for XIE to use. +XieInit() allocs a client array sufficient for holding MAXCLIENTS clients, and initializes the array to contain +XieNullClient pointers. +The last step of extension initialization is to call XieReset(), which initializes XIE's internal state variables, if required. + + + +4. Memory Management +The SI will place a veneer over the core X memory management routines (e.g. Xalloc, Xrealloc, Xfree, etc.). This will +facilitate adding any special management hooks that may be necessary when the SI is ported to particular platforms. +This will also facilitate monitoring memory usage, tracking down leaks, etc. +To cut down on memory management overhead during flo execution, the many data segment descriptors that might +normally be allocated and freed as they are needed, will instead be returned to a look-aside list that is managed by the +photoflo data manager (so that they can be more efficiently re-used). They will be returned to the underlying +management routines (i.e. core X) when the flo completes (and if the number of cached descriptors exceeds a high +water mark). +A global parameter will be used to hint at the most efficient alignment for scanlines, lookup tables, etc.. Individual +elements are allowed to override this alignment hint in order to address their own particular alignment requirements +(e.g. restrictions that might be imposed by an image processing accelerator). + + + + +5. Dispatching requests +XIE protocol requests are passed through the normal X protocol stream from the client to the core X dispatch loop. +Core X dispatches XIE requests to the XIE dispatcher or the XIE swap-dispatcher. The XIE dispatcher of choice was +selected at extension initialization time by AddExtension(). +The XIE dispatcher passes the request directly to the appropriate Proc routine. The XIE swap-dispatcher must byte- +swap multi-byte fields within the protocol request before calling the Proc routine. For requests that include +PhotoElements, the element (and technique) fields must also be swapped. Conversion of IEEE-floats is deferred to +the photoflo creation routines. Likewise, reformatting of client data (received with a PutClientData request) is +deferred to the target element within the photoflo. +When the extension is done fielding the request, it returns a code value to indicate either success or failure. If the +request is not a successful, an error packet is sent back to the client. + + + +6. Data Representations +6.1. Canonic Data +To ensure the greatest processing efficiency the SI will maintain images using a limited number of convenient data +types. Since data provided through PutClientData requests must be copied from the wire buffer before returning to +core X, the least overhead is incurred if the data are converted as they are moved. All image data entering the SI from +the client will be converted (if necessary) to one of the following data types: +* Bit: bi-level pixels. 8 pixels are packed into each consecutive byte +* Byte: pixels having 3 to 256 quantization levels, each pixel stored in the low-order bits of a byte (unused high-order bits +within the byte are zero) +* Pair: pixels having 257 to 16,384 quantization levels, each pixel stored in the low-order bits of a byte-pair (unused high- +order bits within the byte-pair are zero) +* Quad: pixels having more than 16,384 quantization levels, each pixel stored in the low-order bits of a 4-byte unit +(unused high-order bits within the unit are zero) +An additional image data type arises from elements that can produce unconstrained data, which can only exist within +the context of a photoflo. Unconstrained data must be converted, via a client specified Constrain element, prior to +export out of the photoflo. The protocol makes no restriction on the representation of unconstrained data. In the SI, +unconstrained data will be represented via " typedef float Unconstrained; " to facilitate redefining the +representation. +Canonic form will take advantage of the natural byte order of the server architecture for data that spans multiple +bytes. The SI will use Endian-intelligent macros to efficiently extract and insert arbitrarily aligned bit field data. There +will be a module of conversion routines for converting to and from canonic form, and for promoting data to a higher +canonic form (e.g. convert byte to float). Demoting data (e.g. from float to byte) is explicitly requested by the client +via Constrain elements. + +6.2. Non-canonic Data +All data that is transported through the protocol stream is considered to be non-canonic. Additionally, all encoded +data is non-canonic. +6.2.1. Byte Stream Data +For data that are injected into a flo by a PutClientData request, conversions are specific to the target +ImportClient element and decode technique. Since their parameters fully describe how the data are to be +interpreted, the appropriate decode or conversion function is selected by the ddxie DAG analyzer. Similarly, +it is the responsibility of an ExportClient element to format output data (as specified by client parameters) +prior to it being sent to the client (the data are sent in response to a GetClientData request). + +6.2.2. Compressed Data +Compressed data is stored as a byte stream, together with sufficient decoding parameters to decompress +the data. These parameters include a decode technique. + +6.2.3. Run-length Data +A ProcessDomain is not a resource, but rather the use of a photomap or ROI resource (or equivalent data +imported directly from the client) in conjunction with an X,Y offset (V4.12 pg. 7-2). The Blend element is +unique in that the process domain input data must be a blend-plane. A blend-plane is an n-level +constrained alpha-plane (i.e. data that looks much like a gray scale image). All other elements that accept a +process domain (e.g. Arithmetic, Compare, ..., Point, ExportClientHistogram) accept only ROI or control- +plane type processing domain data. An ROI represents a list-of-rectangles, whereas a control-plane is +treated as an array of Booleans. +Since some elements can accept both ROI and control-plane data types, their implementation can be +simplified if these data types could be converted to a common form that offers processing efficiency. Using +run-lengths, groups of image pixels could be alternately processed or passed-through without testing the +domain on a per-pixel basis. +The SI will present control-plane and ROI data to an element's process domain input in run-length form on a +per-scanline basis. Consecutive scanlines with identical sets of run-lengths can be counted as a vertical +run. Encoding the data in this manner may also provide some compression, but that is not the primary +consideration. +Conversion of control-plane data will be accomplished by inserting an additional element type between the +source of the control-plane data and the process domain input of the element that requires it. This new +element type will alternately count runs of zero and non-zero pixels in the image. +ROI data will be converted by the ImportClientROI element. The rectangles must be sorted by their Y offset +and then by X offsets within the same Y, before they are converted into run-lengths. +Defining process domain data in this manner is akin to Y-X banding of regions within core X. + +6.3. Tri-chromatic Data +Triple band data is stored and passed between flo elements in band-by-plane format (i.e. pixels for each band are +segregated into separate image arrays). In XIE, the color space attributes of triple band data are known only to the +client. Therefore, this data is not tagged as representing any particular color space. + +6.4. Strips +One of the motivations for using photoflos is to reduce memory utilization by propagating segments of the image +through each processing step to form the desired result, rather than consuming a full size image buffer at each step. +If the segment size is too small, however, performance can suffer due to increased scheduling overhead. To address +these conflicting problems, elements will produce a number of scanlines at a time, in strips, where the number of +scanlines that constitutes a strip is a function of a tunable parameter. + + + +7. Data Structures +7.1. Data Formats +A format-rec is used to describe the format of data that an element will produce or the format required by a receptor. +It consists of: +* the data class (i.e. canonic, compressed, lookup-table, run-length) +* an in-line format-specific structure +Note: run-length data require no additional specification, byte stream data are described by client specified element parameters. + +7.1.1. Canonic +A canonic-rec is used to describe the format of canonic image data that an element will produce or the +format required by a receptor. For triple band data, a separate canonic-rec is used for each band. A +canonic-rec contains: +* the canonic data type +* the band number +* the total width (in pixels) +* the total height (in pixels) +* the depth (in bits) +* the number of potential quantization levels +* the distance between adjacent pixels (in bits) +* the distance between adjacent scanlines (in bits) + +7.1.2. Compressed +A compressed-rec is used to describe encoded image data that an element will produce or encoded data that +is required by a receptor. A compressed-rec contains: +* the compression technique (either decode for data that is to be stored, or encode to describe how an export +element should compress data) +* the band interleaving +* the band number +* the width (in pixels) +* the height (in pixels) +* the number of potential quantization levels +* a pointer to technique-specific parameters +For triple band JPEG data, three compressed-recs are required to describe the individual bands despite the number +of image arrays that are required to represent the data (1 or 3 depending on interleave). + +7.1.3. Lookup-table +A table-rec is used to describe the format of lookup table data. It contains: +* the band order of lookup tables sent from the client +* the maximum number of quantization levels allowed in the input image +(i.e. the number of entries per table) +* the number of quantization levels that may occur in the output image + +7.2. Resource structures +7.2.1. ColorList +A colorlist-rec is used to define a ColorList resource. It contains: +* the resource-id of the colorlist +* the number of references to the colorlist (including 1 for core X) +* the resource-id of the colormap from which the cells have been allocated +* the number of cells allocated +* the pointer to the list of allocated cell indices +7.2.2. LUT +A lut-rec is used to define a LUT resource. It contains: +* the resource-id of the lut +* the number of references to the lut (including 1 for core X) +* the number of lookup tables (either 1 or 3) +* a format-rec containing the lookup table attributes +* pointers to the lookup tables +7.2.3. Photomap +A photomap-rec is used to define a Photomap resource. It contains: +* the resource-id of the photomap +* the number of references to the photomap (including 1 for core X) +* the number of chrominance bands in the image (1 or 3) +* per-band format-recs (i.e. queriable attributes: width, height, and levels) +* a pointer to the decode parameters +* a pointer to the image array for each band +7.2.4. ROI +A roi-rec is used to define a ROI resource. It contains: +* the resource-id of the roi +* the number of references to the roi (including 1 for core X) +* the length of the run-length encoded list of rectangles +* a pointer to the run-length list +7.2.5. Photospace +A photospace-rec is used to define a Photospace resource. It contains: +* the resource-id of the photospace +* the number of active photoflos in the photospace +* a queue head that points to the first and last photoflos in the photospace + +7.2.6. Photoflo +A flo-def is used to define a photoflo resource. It contains: +* the Executable identity of the photoflo (i.e. the name-space/flo-id pair) +* Booleans: Active, Modified, ... +* the number of elements received from the client +* an array of pointers to client elements in phototag order +* a circular doubly linked list head that points to the definition DAG +* a circular doubly linked list head that points to the optimized DAG +* a flo-error-rec for passing error information back to dixie +* a flo-event-rec for sending event information back through dixie +* a pointer to ddxie-private data (the SI will hang a flo-tex structure here) +* a set of ddxie photoflo manager public entry points: +* link create a runnable photoflo, its elements, and data that persists between + executions +* startup allocate/initialize data that are valid for a single execution instance and + commence execution +* resume continue execution after the flo has yielded + (not used in the SI) +* input push data from the client into a specified ImportClient element and resume + execution +* output pull data for the client from a specified ExportClient element and resume + execution +* query query a specified ImportClient element to see if it needs more data, or query + a specified ExportClient element to see if it has data available +* abort stop execution and free single instance stuff +* destroy free persistent stuff and destroy the runnable DAG +* a set of ddxie photoflo manager private entry points: +* scheduler schedule elements to run until data exhausted or yielding is required +* data manager strip management + + + +7.3. Photo Element Definition +A pe-def is used to define each client element supplied at photoflo creation. Each pe-def contains pointers +for linking elements together according to their phototag inter-connections. A fully linked set of pe-defs +constitutes a definition DAG that is suitable for presentation to ddxie for analysis. Each structure contains: +* the element phototag number received from the client +* the element type received from the client (within the optimized DAG this may identify additional converter +or optimized element types that are defined for the server implementation) +* Booleans: loop-detect, orphan, modify, import, process, export +* a pair of pointers linking this element to the next and previous element in DAG order +* a pointer linking this element to another element of the same class (used to locate all the Import or Export +elements; not used for Process elements) +* a pointer to link a client element to a replacement element in the optimized DAG +* a pointer to element specific parameters (e.g., parameters supplied by the client) +* a pointer to ddxie-private data (placed here by the ddxie link routine, removed by the ddxie destroy routine -- +the SI will hang a pe-tex structure here) +* element entry points +* create +* initialize +* activate +* flush +* reset +* destroy +* fan out information: +* the number of bands this element will produce +* a format-rec describing each output band +(dixie fills in attributes, ddxie fills in alignment ...) +* the number of receptors connected to this element's output +* linkage to receptors of this element's output +* the number of phototag inputs this element is using +(i.e., the number of inputs from other elements, including process domain and lut inputs) +* an array of input connection information; each input connection includes: +* the phototag of the source element +* a pointer to the source element +* the number of bands this input will receive +* a format-rec describing each band +(dixie fills in attributes, ddxie fills in alignment, ...) + +7.4. DDXIE Structures +7.4.1. Photoflo run-time context +A flo-tex stores ddxie-specific information for the execution of a photoflo. It contains: +* a pointer back to the flo-def +* information for the scheduler (e.g. the ready-list) +* information for the data manager (e.g. a look-aside list of strips that can be re-used) +* a pointer reserved for yielding information + +7.4.2. Photo Element run-time context +An pe-tex stores ddxie-specific information for an element. It contains: +* a pointer back to the pe-def +* a pointer back to the flo-tex +* output strip size +* a pointer to an array of receptor-recs * +* a pointer to additional storage for element-private information * +* the structures pointed at by these pointers are contiguous with (appended to) the pe-tex. + +7.4.3. Receptor +A receptor-rec provides an execution context for data that are to be brought into an element. It contains: +* a pointer to the pe-def that is supplying the data +* the minimum number of data units needed for activation (per band) +* the total number of data units currently available (per-band) +* a circular doubly linked list head that points to the strips that are available (per band) + +7.4.4. Strip +A strip describes a segment of data that is produced by an element and is then given to the data manager for +distribution to one or more receptors. A strip describes an array containing one or more complete data units +(for canonic data a unit is a scanline). It contains: +* forward and backward pointers to the next and previous strips +* a pointer to the format-rec that describes the data format +* a reference count +* the number of data units in the strip (e.g. number of scanlines for canonic data) +* the first scanline number (if canonic) +* the total size of the data array (in bits) +* the offset within the data array to the first data (in bits) +* the base address of the data array + + + + +8. Protocol requests +Each of the XIE protocol requests is listed below. For the sake of brevity, information that can be found in the +protocol document (V4.12) is not duplicated here. Instead there is: +* a short description of each request +* an overview of the actions taken for a successful request +If a request cannot be honored due to an error, an error packet will be returned to the client, as prescribed in the +protocol document. +Each protocol request will have a dedicated Proc and SProc routine which is called from the XIE dispatcher (which is +called by the X dispatcher). Swap routines will also be provided for replies, errors, and events. + +8.1. Global Query requests +8.1.1. QueryImageExtension +Each client is required to invoke QueryImageExtension prior to issuing any other XIE protocol requests in +order to establish protocol version compatibility between client and server. +The xie-client-table is checked for an existing xie-client-rec for the current client. If the client is not found (as +is the case when QueryImageExtension is used for XIE connection setup) a new xie-client-rec structure is +added to the table. +Applying the compatibility rules spelled out in the protocol document, the XIE version is chosen and saved +in the xie-client-rec. The set of Proc and SProc routines that match this version are also saved in the xie- +client-rec. +QueryImageExtension generates a protocol reply which returns the chosen XIE version information, the +ServiceClass, and the Alignment capabilities of this server. + +8.1.2. QueryTechniques +QueryTechniques provides information about a selected group of techniques that are supported by the +server. This is the only method by which a client can discover implementation specific technique +information such as: +* what are the default techniques? +* which techniques require parameters? +* what is the relative execution speed? +* what private techniques have been added? +A reply is returned to the client containing a TechniqueRec for each technique in the specified group. + +8.2. Resource requests +8.2.1. Overview +The ColorList, LUT, Photomap, and ROI resources provide server-side storage of XIE data types. Each of +these resource types is registered with core X at extension initialization time (CreateNewResourceType) +along with a resource specific deleteFunc (e.g. DeletePhotomap). This function enables core X to destroy +these resources if the client connection is closed. +Chapter 4 of the protocol document explains resource creation, destruction, and flo bindings using a bucket +and handle analogy. The following sections explain how these requirements will be satisfy. + +8.2.1.1. Creating Resources +Each of these resources is created via an explicit XIE protocol request. Upon creation each +resource has a reference count of one, but has no resource specific data or attributes. If the +resource is created successfully, AddResource() is called to register it with core X. +These resources are populated with data and attributes as the result of executing a flo. With the +exception of the ColorList resource, these resources can be used to provide input for a flo. + +8.2.1.2. Flo'ing Resources +When a flo becomes active, the reference count of each XIE resource referenced by the flo is +incremented once for each reference to the resource. +For LUT, ROI, and Photomap resources, it is permissible for multiple elements in an active flo (or +different active flos) to access the same resource simultaneously (e.g. the explanation of pseudo in- +place operations). Multiple simultaneous writes to the same ColorList are illegal. Therefore a +ColorList's reference count can never exceed two. +If multiple elements within a flo export to the same resource, upon successful flo completion the +resource's handle will be connected to one of the new buckets (the protocol does not specify +which bucket will win). If multiple flos are exporting to the same resource, each flo will leave a new +bucket attached to the resource upon successful completion. Synchronizing the execution of +multiple flos is an exercise left to the client. +When the flo leaves the active state (because of done, error, or abort), the deleteFunc of each +referenced XIE resource is called to decrement the reference count (once for each reference). If a +resource has zero references, its structure (and everything associated with it) is freed. + +8.2.1.3. Destroying Resources +Each of these resources can be destroyed via an explicit XIE protocol request which indirectly calls +the resource's deleteFunc via the core X FreeResource() routine. Calling the deleteFunc in this +way disassociates the resource-id from core X. The deleteFunc is specified at extension +initialization time via CreateNewResourceType(). +Other responsibilities of the deleteFunc are to zero the resource-id in the resource structure and +decrement the reference count. If the count goes to zero, the resource structure and everything +associated with it are freed, otherwise this action is delayed until there are no outstanding +references. + +8.2.2. ColorList +8.2.2.1. Create +Create an empty color-list-rec and call AddResource(). A ColorList is a resource used by the +ConvertToIndex element to record colormap cells that it allocates. These cells can be freed by +explicit ColorList requests or via other mechanisms that are specified in the protocol document. + +8.2.2.2. Query +Reply with the list of colormap cells currently referenced by the ColorList. If there are none or the +colormap has been freed, the colormap and count fields of the reply will both contain zero. If the +query is made while a flo is actively allocating cells, the query will return a snapshot of the +ColorList at the time of the query. + +8.2.2.3. Purge +If the reference count is one, all cells that are currently allocated are freed, thus restoring the color- +list-rec to its create-time state. + +8.2.2.4. Destroy +Call FreeResource() to disassociate the ColorList resource-id from core X. The registered +deleteFunc may purge cells held by the ColorList and free the color-list-rec (see Destroying +Resources above). + + +8.2.3. LUT +8.2.3.1. Create +Create an empty lut-rec and call AddResource(). A LUT is a resource that contains lookup-table +array(s) that are used by the Point element. A LUT resource is populated via an ExportLUT +element. Its attributes are inherited indirectly from an ImportClientLUT element (XIE does not +provide any facilities for synthesizing exportable LUT data in the server). + +8.2.3.2. Destroy +Call FreeResource() to disassociate the LUT resource-id from core X. The registered deleteFunc +may free the lookup arrays and the lut-rec (see Destroying Resources above). + + + +8.2.4. Photomap +8.2.4.1. Create +Create a photomap-rec and call AddResource(). A photomap is a resource that is used to store a +complete image. Data stored in a photomap may be imported into a flo and used as image data for +display, or exported from the flo, or used as a process domain. +The photomap-rec is populated by an ExportPhotomap element. This export element will receive +the image from a process element, or an import element (i.e. from the client, a photomap, or a +drawable). Image attributes are also inherited from this element. + +8.2.4.2. Query +Generate a reply that reflects the current set of image attributes. If the photomap has not been +populated (i.e. the number of bands is zero), all fields of the reply will contain zeros and populated +will be false. + +8.2.4.3. Destroy +Call FreeResource() to disassociate the photomap resource-id from core X. The registered +deleteFunc may free the image descriptors, image data, decode parameters, and photomap-rec (see +Destroying Resources above). + +8.2.5. ROI +8.2.5.1. Create +Create a roi-rec and call AddResource(). An ROI is a resource which contains a list of rectangles +that are used to define a process domain. An ROI resource is populated via an ExportROI element. +The list of rectangles received from the client is sorted and converted into run-lengths by the +ImportClientROI element (this is explained in the section on Processing Domains). This data is +stored in the roi-rec by an ExportROI element. ROI data always originates from the client, XIE does +not provide any facility for synthesizing exportable ROI data within the server. +Note: the list of rectangles returned from ExportClientROI will be a list of sorted non-overlapping rectangles +(reconstructed from the run-length list). Although the contents of this list may differ from the list +received from the client, it will be logically equivalent. The protocol does not specify that the original +list must be returned. + +8.2.5.2. Destroy +Call FreeResource() to disassociate the ROI resource-id from core X. The registered deleteFunc +may free the run-length list and the roi-rec (see Destroying Resources above). + +8.3. Photoflo related requests +Photoflos provide the mechanism by which a sequence of import, process, and exports steps are described. Two +photoflo modes are supported: an immediate flo is executed once and then it is destroyed, whereas a stored flo can be +executed repeatedly and offers the option of modifying its parameters between executions. + +8.3.1. ServerIDspace +Since stored flos can be re-executed, they generally enjoy a normal life expectancy. Therefore they are +identified using the same name-space as other resources created by the client. Their resource-ids can be re- +used however, by redefining the complete contents of the flo. + +8.3.2. Photospace +Immediate flos may be generated in rapid succession (and are short lived relative to normal resources). +Therefore, a separate 32-bit wide identifier name space is provided for their execution. + +8.3.2.1. Create +Create a photospace-rec and call AddResource(). Since only a small number of immediate flos are +likely to be active in a photospace at any given time, the SI will maintain the active set of flos as a +doubly linked list. + +8.3.2.2. Destroy +Call FreeResource() to disassociate the photospace resource-id from core X. The registered +deleteFunc will abort and destroy all immediate flos known to the photospace and then free the +photospace-rec. + + +8.3.3. Immediate-mode specific +An immediate flo begins execution as soon as the protocol request containing the sequence of steps to be +performed is received. Upon completion the flo is automatically destroyed. + +8.3.3.1. ExecuteImmediate +Create a flo-def and copy the supplied list of elements to the flo-def while verifying that the list is a +DAG. Next, the flo-def is added to the specified photospace and execution commences. Upon +completion the flo is destroyed and the flo-def is removed from the photospace. Flo creation, +execution, and destruction is covered in detail in the chapters on photoflo management. + + + +8.3.4. Stored-mode specific +8.3.4.1. Create +Create a flo-def, copy the supplied list of elements into pe-defs (while verifying that the list is a +DAG), and then call AddResource(). This process is covered in detail in the chapter on DIXIE +Photoflo Management. + +8.3.4.2. Modify +After verifying that no topological or element type changes are being attempted, the parameters of +the specified set of elements are replaced. These elements are flagged to note that they have been +modified. The chapters on photoflo management address the additional side affects that may be +incurred when a previously executed flo is modified. + +8.3.4.3. Redefine +The SI will simply call FreeResource() to destroy the old flo in its entirety, and then create a new +one using the old resource-id. + +8.3.4.4. Execute +Prior to executing a photoflo several preparatory steps are necessary: +* each element's parameters and data attributes are validated +* the DAG is analyzed to choose the most appropriate manner in which to execute it +* an optimized DAG is generated, if any refinements to the definition DAG can be made +* the required sequence of elements is instantiated +Finally, the flo is set active and execution begins. Flo execution is covered in detail in the chapters +on photoflo management. + +8.3.4.5. Destroy +Call FreeResource() to disassociate the flo's resource-id from core X. The registered deleteFunc +will abort execution (if active), free everything attached to the flo, and then free the flo-def. + + + +8.3.5. ClientData transport +8.3.5.1. Put +PutClientData supplies a byte stream of data from the client that is to be delivered to a specific +ImportClient element within a flo. Since the interpretation of the data is specific to the target +element and its parameters (and possibly a technique), any reformatting of the data to convert it to +canonic form (including byte swapping) must be controlled by the receiving element. + +8.3.5.2. Get +GetClientData generates a reply which returns a byte stream of data from a specific ExportClient +element within a flo. The data will be formatted according to the parameters specified to the +supplying element prior to the commencement of flo execution. + +8.3.6. Query/Control +8.3.6.1. Query +Reply with the status of the specified flo (active, inactive, or nonexistent). If it is active, two lists +of elements are provided: one listing elements waiting for data from the protocol stream, and the +other listing elements which have data for the protocol stream. + +8.3.6.2. Await +If the specified flo is not found in the active state, no operation is performed. Otherwise +IgnoreClient() is called to block further requests from the client. Later, when the flo transitions out +of the active state, AttendClient() will be called to allow blocked requests to be processed again. + +8.3.6.3. Abort +If the specified flo is not found in the active state, no operation is performed. Otherwise execution +of the specified flo is terminated and output pending for the client is destroyed. A stored flo is +returned to the inactive state; an immediate flo is destroyed. + + + +9. DIXIE Photoflo Management +9.1. Overview +The protocol representation of a photoflo is a list of elements. There are three element types: import elements which +bring data into the flo, processing elements which operate on the data, and export elements which transfer data out of +the flo to external resources or back to the client. +Connections between elements is accomplished through the use of phototags. An element's relative position on the +protocol list determines the element's phototag number. The source(s) for each element are explicitly specified using +the phototags of upstream elements. The output of an element can fan out to any number of downstream elements. +Dixie is responsible for creating the photoflo data structures that will contain the client's list of elements. The same +structures are used by stored and immediate flos. At create time, dixie also converts the client list into a fully +connected DAG. Dixie relies on ddxie to analyze the DAG in order to select an appropriate method to execute the +sequence of operations. Ddxie fills in a vector of entry points within the flo-def, so that dixie can control the overall +photoflo execution process. A call through the link entry point generates a re-usable execution context (called a flo- +tex) and an associated set of run-time element handlers. The startup entry point (re)initializes the flo and starts +execution. Input and output entry points are used to move client data in and out of the flo on behalf of data transport +protocol requests. Additional entry points are provided for restarting the flo after it has yielded, for obtaining status +information, for stopping the flo prematurely, and for destroying it. +The following sections will discuss photoflo management from the dixie point of view. The chapter titled DDXIE +Photoflo Management, describes the actions performed within ddxie. + +9.2. Photoflo Creation +9.2.1. Creating the Flo +When the server receives an ExecuteImmediate or CreatePhotoflo protocol request, a flo-def is allocated and +initialized. The list of elements received from the client is parsed in the order received. The following actions +are performed (within dixie) for each element: +* verify that each phototag input is specified within the bounds of the client element list +* create an pe-def large enough to accommodate the number of phototag inputs +* store element information in the pe-def +(e.g. the element's phototag index, class, type, and input phototag connections) +* store the element's parameters (including technique data) in a separately allocated area +(any necessary floating point conversions are performed at this time) + + + +The address of each pe-def is stored in phototag order within the flo-def. Upon completion of this initial +creation phase the photoflo looks like: + + +9.2.2. Traversing the DAG +The next phase of photoflo creation converts the list of client elements into a DAG. The element list is +scanned in phototag order. At each export element, the phototag input connections are followed upstream +via a recursive depth first search algorithm until one of the following conditions occurs: +* an import element is found +* an element with fully connected inputs is encountered +(i.e. one that was examined while searching back from a previous export element) +* a topological error condition is detected +Topological errors are discovered during the DAG definition process by setting a flag in the current element +prior to invoking the recursive search routine to examined the element's inputs, and then resetting the flag +when all the input elements have been examined. A loop condition exists if a flagged element is found +during the recursive search. Attempting to use an export element as a data source is also a topological error. + + + +As the search algorithm considers each element, the following actions are performed: +* if the element being examined is not an import element: +* set the loop-detect flag in the current element +* invoke the search algorithm to examine each of the element's inputs + the inputs of multi-input elements are searched in the following order: +1. lut input +2. process domain input +3. source input(s) 1 through n +* clear the loop-detect flag in the current element +* link the current element's output and the downstream element's input to each other +* append the current element to the definition DAG +Continuing with the example given above, the definition DAG structures would be linked like this: + + + +The definition DAG is a circular doubly-linked list of pe-defs that has the following characteristics as seen +from the DAG head: +* the first element in the forward direction is an import element +* the first element in the backward direction is an export element +* for each element that is examined in a forward traversal, all of the elements from which it obtains +input have already been examined + +Depending on which export element was considered first, the DAG order of our simple flo illustrated above +would be either: +1, 2, 3, 4, or 1, 2, 4, 3. +If the export elements in the flo illustrated below were considered in ascending order (i.e. search back from +element 2, then from 5, etc.), the DAG ordering would be: +1, 2, 3, 4, 5, 7, 6, 8, 9, 11, 13. +If, however, the export elements in the flo below were considered in descending order (i.e. search back from +element 13, then from 11, etc.), the DAG ordering would be: +7, 1, 6, 3, 4, 8, 9, 13, 11, 5, 2. +The DAG characteristics described above hold true for any sequence in which the export elements could be +considered. +It is possible that the output from some elements will not terminate at an export element. The protocol states +that these elements should be ignored. Therefore, elements 10 and 12, in the figure below, would not be +included in a definition DAG because they do not terminate at an export element. + + + +9.2.3. Registering the Flo +Provided no errors are encountered while creating and validating the photoflo, the flo-def structure of an +immediate flo is registered with the specified photospace, whereas AddResource() is called to register a +stored flo with core X. + +9.3. Photoflo Execution +9.3.1. Prepping the DAG +Before a flo can be made active, some preparatory steps are necessary. First the DAG is traversed in the +forward direction to execute each element's dixie prep routine which will: +* lookup external resources (colormap, colorlist, drawable, gc, lut, photomap, roi, ...) +(for XIE resources their reference counts are incremented) +* validate the attributes of each source of data for the element +* validate the element's parameter values (including technique data) +* determine what the element's output attributes will be +* determine if the flo has been modified since a previous execution +* the element was affected by a ModifyPhotoflo request +* source attribute changes have caused output attributes to change +If there is an executable photoflo that already exists and it has been modified in such a way that re- +compilation is necessary, the photoflo manager's destroy function is called, in preparation for a new +compilation. + +9.3.2. Analyzing the DAG +When the elements have been prepped by dixie, the DAG is suitable for presentation to the DAG analyzer. +The purpose of the analyzer is to define an appropriate solution to the problem to be solved (e.g. coalesce +multiple elements into a single super-element, insert data type conversion elements, insert data alignment +elements, ...), and to choose a photoflo manager that can execute it. +If a previously executed flo still exists, the analyzer is not called. The current executable will be re-used +because no additional analysis is required. +If an optimized DAG has been generated, the analyzer will attach it to the flo-def. The analyzer establishes a +photoflo manager by placing its link entry point in the flo-def. + +9.3.3. Linking an executable Photoflo +The first time a photoflo is executed, the flo-def link function is called to generate the run-time structures for +the photoflo. It must: +* create a run-time context for the flo manager (attach a flo-tex to the flo-def) +* create a run-time context for each element (attach a pe-tex to each pe-def) +* establish the remaining entry points in the flo-def + +9.3.4. Starting the flo +The flo-def startup function is called to initialize the flo and begin execution. The photoflo manager startup +routine will initialize each of its elements (in DAG order), and call upon the scheduler to run the flo. The next +chapter covering ddxie photoflo management describes the actual execution of the flo. +If there are no ImportClient or ExportClient elements in the flo, it can run to completion. Otherwise, +execution is dependent on data transport protocol requests. + +9.3.5. Resuming the flo +When a PutClientData request is received, the flo-def input function is called with the phototag of the target +element and a pointer to the available data. Calling input gives the new data into the specified element and +causes the scheduler to resume flo execution. +When a GetClientData request is received, the flo-def output function is called to fetch some data from the +specified element. This may cause the scheduler to resume execution (e.g. execution may have been +suspended due to the output buffer being full). +A resume entry point is provided in the flo-def for implementations that support yielding. There will be no +resume routine supplied with the SI. + +9.3.6. Stopping the flo +Dixie does not get involved in determining when a flo reaches completion. Rather ddxie is responsible for +determining if all data has been processed and if any data transport requests are required for completion. +If an error is encountered within the ddxie flo manager, the error detail is recorded in the error-rec, which is +embedded in the flo-def, and control is returned to dixie. When an error is discovered by dixie, the flo-def +abort function is called to stop the flo. Finally, the error is sent to the client via core X mechanisms. +If an Abort request is received from the client, the flo-def abort function is called to stop the flo. + +9.3.7. Destroying an executable Photoflo +Dixie destroys a flo-tex by calling the flo-def destroy function which allows ddxie to free its resources and +remove the ddxie-private flo-tex pointer from the flo-def. + +9.3.8. Event notification from a flo +Several elements can generate events, as can flo completion. The flo-def includes an event-rec where details +about the event can be recorded. Ddxie calls the dixie SendEvent() routine to request that the client be +notified. + + + +10. DDXIE Photoflo Management +Ddxie contains a DAG analyzer that defines an appropriate solution for the image equation expressed by the DAG, a +linker that creates an executable sequence of element handlers to solve the problem, and a flo manager to produce +the result. The element handlers, which also reside in ddxie, are discussed in the next chapter. + +10.1. DAG Analysis +The purpose of the DAG analyzer is to define an appropriate solution to the image equation expressed by the DAG +(e.g. choosing an element handler for a specific technique, coalescing multiple elements into a single "super- +element", or inserting data type conversion elements), and to choose a photoflo manager that can execute it. + +10.1.1. Choosing Element Handlers +The first step is to select an appropriate element handler for each element. To better understand how this is +performed, an example is shown below. Assume that each photoelement type defined in the XIE protocol is +assigned a different shading pattern. Then the flo + + + +could be represented as: + + + +For each element type (shading pattern), the mi layer of the SI will provide a set of handlers which can +implement the computation specified by that element. A single handler may suffice for elements which do +not take techniques, whereas an element like ImportClientData, which can take a number of different +techniques, might be implemented as several handlers. Besides having handlers to account for technique +variations, it may also be convenient to separate handlers on the basis of import type restrictions, machine +dependence, and degree of optimization. +Given the framework established above, code generation for a photoflo may be viewed as a labeling prob- +lem, in which it is necessary that the DAG analyzer find a valid label for each element in the flo. The analyzer +is only allowed to label an element with a handler of like shading pattern. +All handlers will output a type which is the smallest acceptable canonical type for the input data and the +particular operation. Import elements will thus be able to write down their output image data types im- +mediately. +Let k be the distance from an element to an Import element. Given a flo which has been labeled and had +types resolved up to a distance of k-1, the DAG analyzer will label and resolve all elements of distance k by +the following method: + +For each element Eki of distance k: + For each element Eki,j which feeds that element: +Propagate the known output type of Eki,j to the corresponding input receptor on Eki +(these will be treated as "suggested input types" by the handlers). + Call HandlerTest, giving it the flo-def and pe-def. A handler will be selected which resolves all +input types. If any input types match, the selected handler will insert a labeled ConvertType +pseudo-element into the flo. + Label Eki with the selected handler. + + + +The HandlerTest procedure simply goes through the list of handlers which have the same shading pattern +as the element in question, and calls the handler's test entry point. The test routine checks to see if this +handler can accommodate the parameters of the element (obtained from the pe-def) in combination with the +input data types. If the handler rejects the element, the HandlerTest procedure checks the next handler of +the same shading pattern in the list. The SI element handler sets will be written so as to ensure that +regardless of what the input data type is, at least one handler per shading pattern will accept any valid +element. +Handlers have the option of accepting seemingly non-canonical data types by inserting a ConvertType +pseudo-element in the path between the input element and the receiving element. This ConvertType +element must be able to convert any non-canonical data type to a canonical type. The handler doing the +insertion specifies the type to which it wants the data to be converted. This mechanism allows the mi +handlers to continue working even if a server implementor chooses to invent new canonical types. Thus, +the criterion that there must be at least one valid handler for any element will remain fulfilled even if new +types are introduced. + +10.1.2. Choosing a Linker and Photoflo Manager +The analyzer must establish a linker and photoflo manager by placing their entry points in the flo-def. The mi +linker and photoflo manager can handle all element handlers (whether mi or md) that abide by their interface +conventions. +If an md analyzer is substituted for the mi analyzer, it may elect to use a foreign linker, photoflo manager, +and element set (e.g. the pipe manager and sample elements contributed by HP). In this case, the foreign +linker would need to translate the contents of the pe-def structures into its own set of elements. + + +10.2. Photoflo Linker +The linker is invoked by dixie calling through the flo-def link entry point (it is not called when an unmodified photoflo +is re-executed). The linker creates a run-time context (a flo-tex) for use by the flo manager's components. It is also +responsible for the creation and static initialization of the element handlers selected by the DAG analyzer. This is +accomplished by calling the create entry point (stored in each pe-def) of each element selected. + + + +10.3. Photoflo manager +The photoflo manager is a collection of component parts that are called upon from dixie to perform specific tasks +during the startup, execution, and eventual tear down of a photoflo. + +10.3.1. Startup +When dixie calls through the flo-def startup entry point, the flo manager calls upon its sub-components to +(re)initialize their run-time context. The flo manager also calls through the initialize entry point of each +element to allow the elements to (re)initialize their run-time context. Finally, it transfers control to the +scheduler to run the flo. + +10.3.2. Scheduling +The scheduler is responsible for running available data strips through elements. The scheduler is initially +called as the final step of photoflo startup. Later, as data arrives from the client, or data is requested by the +client, the scheduler is started to satisfy the request. +Scheduling of individual elements for execution is handled through a ready-list. The first time a photoflo is +executed, only ImportResource elements have data. The ready-list is initialized with these elements. Starting +from the front of the ready-list, each of the elements on the ready-list are executed in order. An element will +produce a maximum of one strip of data each time it executes* . This strip is passed to the data manager and +then on to appropriate downstream receptors. Elements receiving data from this element are examined to see +if they have sufficient data to execute. If they do, they are pushed onto the front of the ready-list. If the +current element was an import element it is removed from the ready-list, otherwise it is allowed to remain on +the ready-list (assuming it has more data to process) so that it may resume execution after the downstream +elements have consumed its output. +One key concept to this algorithm is the removal of elements from the ready-list. Once an import element +executes and produces up to one strip of data, it is removed from the ready-list, even if more data is avail- +able. Other element types are not removed from the ready-list until they can proceed no farther. This method +of removing elements from the ready-list, combined with prepending downstream elements to the head of +the list, has the effect of pushing strips of data through the flo before new strips are brought in from import +elements. +When all data has been processed, the import elements are re-examined. If there are any ImportClient +elements, control is returned to Core X. This is done to prevent large amounts of server data (possibly +whole images) from being buffered in the flo while the client is stalled. If only ImportResource elements are +found, they are put back on the ready-list and execution continues, as described above, until the flo has +completed. +Each subsequent execution of the flo will be in response to the client. The element indicated in the protocol +request, and all ImportResource elements, are placed on the ready-list. As before, each time an import +element is executed, it is removed from the list and all downstream elements connected to its output with +sufficient data to execute are pushed onto the front of the ready-list. If an import element was the target of a +PutClientData request, it is re-examined to see if it has more data available. If so, the ready-list is re- +initialized and execution continues (as above). If no more client data is available, control is returned to Core +X. +As an example of how the scheduler would process a flo, the sample flo from Figure 5-2 of the protocol +document (V4.12) is shown below. + + +This flo has two import elements, 1 and 7. Element 1, is an ImportClientPhoto element. Element 7, importing +a Photomap, is an ImportResource element. When the flo is first executed, only element 7 will have data. +Element 7 will import one strip of the photomap and cause element 8 to be placed on the ready list. Since +element 7 is an import element, it is removed from the list. +Element 8 can now process the data and pass it on to element 9's receptor. Element 9 is a ConvertToIndex +element that is using a technique which requires the entire image before it can continue. Since element 9 +does not have sufficient data to execute, it is not added to the ready-list. +Assuming that element 8 has processed all of its data, it is removed from the list. With an empty list, the +scheduler examines the two import elements. Noting that at least one ImportClient element is present, +control is returned to Core X. +After the initial execution cycle, the flo will only be executed when data is received from the client for an +ImportClient element. When such data arrives, the target ImportClient element (element 1) and all Import- +Resource elements (element 7) will be placed on the ready-list. +After element 1 has generated a maximum of one strip of data, the following elements would be on the ready +list (elements 2, 3, and 6 all have sufficient data to execute with element 1's output): +2 3 6 7 +Element 2 would be executed next. Since it is an export element, it will exhaust all data passed to it and be +removed from the list. Element 3 will be processed next. Following its execution, element 4 will be added to +the front of the list and executed, causing elements 5 and 8 to be added to the list. Assuming that elements 3 +and 4 both have no further data to process, the resulting ready-list is: +5 8 6 7 +Element 5 is an export element and passes all data it receives. It is then removed from the list. Element 8 +processes data available to it from elements 4 and 7. Since element 9 is still unable to execute, it is not added +to the list. This leaves the following ready-list: +6 7 +With the execution of element 6, element 8 is again added to the ready list. After element 6's data passes to +element 9's receptor the list is left with only element 7. Element 7 is executed to load another strip of data +from the server photomap. At this point, control is returned to Core X. The photoflo waits until it is +reactivated by more data being received from the client for element 1. +This process repeats until all data has been received from the client. Element 9 can then execute, which in +turn allows export elements 10 and 11 to execute. Element 9 stays on the list until it exhausts its data. At this +point, the photoflo operation is complete. + +10.3.3. Data Manager +It is the responsibility of the data manager to coordinate the flo of data between element outputs and inputs. +Since data is processed in strips, it will often be the case that data required by a downstream element will +span two or more buffers generated upstream. To eliminate the complexity and overhead of concatenating +data segments, data accesses within elements can be conducted on a line by line basis, while data transfers +between elements are conducted on a strip basis. +When an element is producing a strip of data, the buffer it is writing its data into is private to the element. +Only when the strip is passed back to the data manager is it made visible to downstream elements for +processing. When the completed strip of data is passed to the data manager, it is linked to a list of strips +maintained by each downstream receptor. As an element requires data, it reads in the data by transferring +strips from its receptor into its private data section. The element may then access individual lines of data +within the strip through a set of light-weight macros. These macros are provided as a tool to simplify the +access of scan lines within strips but do not preclude elements from operating on data in strip form. When +the element is done with the strip, it informs the data manager. +The strip itself contains a count of the number of references to the strip. When a strip is assigned as an +element output buffer, this count is 1. When the completed strip is returned to the data manager the +reference count is set to the number of receptors that the strip is transferred to. When an element asks the +data manager for an available strip, the reference count is unaffected until the element notifies the data +manager that it is done with the strip. +When an element finishes reading from a strip (or it has an output strip that it does not wish to propagate), it +informs the data manager and the reference count is decremented. If the reference count is decremented to +0, the strip is either freed or cached for re-use. +The data manager also provides a mechanism whereby in-place operations may be performed within the +strip. When this is allowed, only a single element has access to the strip. Since it is using it for both read +and write, the reference count is 2. When it completes the strip it must give it to the data manager for +transfer downstream and notify the data manager that it is done reading it. +Elements access the data manager through five entry points: +* MakeStrip : used by an element to obtain storage for data it intends to produce. +* PutStrip: used by an element to give a completed strip of data back to the data manager (which then passes it +on to downstream receptors) +* GetStrip: used by an element to read in a strip of data from its receptor +* InPlaceStrip: used to obtain in place privileges for a strip that it has obtained via GetStrip. If the data +manager determines that another element also has access to the strip, a new strip is created instead. +* FreeStrip: used by a receptor to inform the data manager that it has no further need for the strip it obtained +through GetStrip. Also used by an element to return an unfilled data strip buffer to the data manager if for +any reason it decides to not fill it after allocating it through MakeStrip or InPlaceStrip. +To illustrate how data is passed from element to element, a runtime snapshot of an executing flo is shown on +the following page. +In the illustration, element w is performing its processing in place with strip A being used both as an input +and an output. Strips B and C are linked to element w's receptor indicating that they have not been read in +yet. Since strip B is at the head of the list, it will be processed next. Any new strips assigned to element w's +receptor would be linked after element C. +Strips D and E have been passed from element w to elements x and y. Element y has already processed the +data from strip D and has indicated to the data manager that it has finished with the strip. Element y is +currently processing Strip E and placing its output in strip F. Element x is currently processing strip D and +has not yet read in strip E. Since element x hasn't read in strip E, it is still pointed to by element x's receptor. +Element x is placing its result into strip G. Element z has two inputs. Strips H and I are being processed to +form a result in strip J. + + + +10.3.4. Input +Dixie calls through the flo-def input entry point when data arrives from the client via a PutClientData +protocol request. Input calls upon the data manager to create a non-canonic strip that describes the byte +stream segment, and then attaches it to the receptor of the import element handler that corresponds with the +phototag specified to PutClientData. Input then passes control to the scheduler. + +10.3.5. Output +Dixie calls through the flo-def output entry point when data is to be retrieved for the client. Output calls +upon the data manager to fetch some non-canonic data from the export element that corresponds to the +phototag specified in the GetClientData protocol request. If the client has asked for less data than is +available from the export element, it will leave the leftovers with the export element. Otherwise, it will take all +data that is available. Output returns the data and current output buffer status to dixie, which will send this +information on to the client in the form of a reply. + +10.3.6. Query +Dixie calls through the flo-def query entry point to find out if an import or export element handler is done. +Dixie will interrogate each import and export element separately. + +10.3.7. Abort +The photoflo will either complete normally, or dixie will call through the flo-def abort entry point to terminate +execution prematurely. In either case the reset routine in each element is called. It will also call upon the +data manager to release any strips it may have cached. + +10.3.8. Destroy +When dixie calls through the flo-def destroy entry point, the flo manager calls the destroy routine in each +element and then frees the flo-tex. + + + +11. Photo Elements +An element is the basic execution unit of a photoflo. An element consists of a body of code with supporting +structures. + +11.1. Element Structures +Element structures are separated into a dixie part, a ddxie part, and an element-specific part. The dixie photoflo +management routines only understand the dixie part. The ddxie photoflo manager understands the dixie and ddxie +public parts. Only the element itself understands the contents of the ddxie private part. These structures are +illustrated below in conjunction with strips (which are handled by ddxie data manager routines and macros). + + +11.2. Element Interfaces +The external interface to each element consists of a set of entry points that are loaded into the pe-def by the DAG +analyzer and the photoflo linker. These entry points are used by various components of the photoflo manager for +setup, execution, and shutdown of the element. + +11.2.1. Create +The create entry point is called by the photoflo linker. It is responsible for attaching a pe-tex to the pe-def. +It also loads the entry points into the pe-def. It will also allocate or setup anything that can persist over +multiple executions. + +11.2.2. Initialize +The initialize entry point is called at photoflo startup. It allocates and initializes run-time data for the current +execution instance. + +11.2.3. Activate +Activate is called by the scheduler when there is sufficient data available at one or more receptors. It calls +upon the data manager to get data from its own receptors and to push data out to the receptors of +downstream elements. + +11.2.4. Flush +Flush is called when all of the upstream elements have completed their task. This gives the element one last +opportunity to finish up. + +11.2.5. Reset +Reset is called at photoflo done time (i.e. flo completed successfully, or aborted due to an error or client +request). Reset frees run-time data and structures that are left behind by the initialize, activate, or flush +routines. + +11.2.6. Destroy +Destroy is called to free data and structures that are allocated by the create routine, including the run-time +context itself (i.e. remove the pe-tex from the pe-def). + + +* There are three exceptions: +* The entire buffer of data received from the protocol stream for an ImportClient element will be presented as a +strip of non-canonic data. The element is then responsible for converting this byte stream of data into canonic +form, and processing or buffering the data prior to allowing control to be returned to core X. +* Export elements pass data out of the flo allowing them to process all data available when executed. +* LUT arrays are indivisible units. Therefore, a strip containing a lookup table will contain the entire array for a +single band. + + + +XIE Sample Implementation Architecture +Submitted to: X Consortium +Submitted by: AGE Logic, Inc. + + + +Page 36 + + diff --git a/xie/xc/doc/hardcopy/XIE/XIEProto/XIEProto.txt b/xie/xc/doc/hardcopy/XIE/XIEProto/XIEProto.txt new file mode 100644 index 0000000..e3adc3d --- /dev/null +++ b/xie/xc/doc/hardcopy/XIE/XIEProto/XIEProto.txt @@ -0,0 +1,3978 @@ + + + + + + +X Image Extension +Protocol Reference Manual + + + + +Publication Description: + +This document describes the protocol of the X WINDOW SYSTEM IMAGE EXTENSION. + + + + + + + + + + + + + + +Version 5.0 + +X Consortium Standard + +X Version 11, Release 6 + +April 7, 1994 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Copyright (c) 1988, 1989, 1990, 1991, 1992 Digital Equipment Corporation + +Copyright (c) 1990, 1991, 1992, 1993, 1994 X Consortium + +Copyright (c) 1992, 1993, 1994 AGE Logic, Inc. + + +Permission to use, copy, modify, distribute, and sell this documentation for any purpose is +hereby granted without fee, provided that the above copyright notices and this permis- +sion notice appear in all copies. Digital, X Consortium, and AGE Logic make no represen- +tations about the suitability for any purpose of the information in this document. This +documentation is provided as is without express or implied warranty. + + + + +Contents +Contents iii +Preface x +Related Documents x +Participants xi +Authors: xi +Contributors: xi +Revision History xi +Organization xii +Introduction xii +Protocol Parameter Types and Syntax xii +Protocol Requests and Replies xii +Pipeline Elements xii +Events and Errors xii +Techniques xii +Service Classes xii +Protocol Encodings xii +Acknowledgments xiii +Introduction 1-1 +Scope and Purpose 1-1 +Terminology 1-1 +Techniques 1-1 +Service Classes 1-1 +Specification Syntax 2-1 +General Syntax 2-1 +Request Syntax 2-2 +Requests without a Reply: 2-2 +Requests with a Reply: 2-2 +Syntax of Photo Elements 2-3 +Photo Elements: 2-3 +Syntax of Events 2-4 +Events generated by Photo Elements: 2-4 +Syntax of Errors 2-4 +Core X errors 2-4 +XIE non-Photoflo errors: 2-4 +XIE Photoflo related errors: 2-4 +Syntax of Protocol Encodings 2-5 +Requests 2-5 +Replies 2-5 +PhotoElements 2-5 +Events 2-6 +Errors 2-6 +Parameter Types 3-1 +XIE and Core X Types 3-1 +Techniques 3-1 +Definitions 3-2 +XieTypAlignment 3-2 +XieTypArithmeticOp 3-2 +XieTypColorAllocTechnique 3-3 +XieTypColorList 3-3 +XieTypCompareOp 3-3 +XieTypConstant 3-4 +XieTypConstrainTechnique 3-5 +XieTypConvertFromRGBTechnique 3-5 +XieTypConvertToRGBTechnique 3-5 +XieTypConvolveTechnique 3-6 +XieTypDataClass 3-6 +XieTypDataStream 3-6 +XieTypDataType 3-6 +XieTypDecodeTechnique 3-7 +XieTypDitherTechnique 3-7 +XieTypEncodeTechnique 3-8 +XieTypExecutable 3-8 +XieTypExportNotify 3-9 +XieTypExportState 3-9 +XieTypFloat 3-9 +XieTypGamutTechnique 3-10 +XieTypGeometryTechnique 3-10 +XieTypHistogramData 3-11 +XieTypHistogramShape 3-11 +XieTypInterleave 3-11 +XieTypLevels 3-12 +XieTypLUT 3-12 +XieTypMathOp 3-12 +XieTypMatrix 3-12 +XieTypOrientation 3-13 +XieTypPhotoElement 3-14 +XieTypPhotoflo 3-14 +XieTypPhotofloOutcome 3-14 +XieTypPhotofloState 3-15 +XieTypPhotomap 3-15 +XieTypPhotospace 3-15 +XieTypPhototag 3-15 +XieTypProcessDomain 3-16 +XieTypRectangle 3-16 +XieTypROI 3-16 +XieTypServiceClass 3-17 +XieTypTechniqueGroup 3-17 +XieTypTechniqueRec 3-18 +XieTypTile 3-18 +XieTypTripletoftype 3-18 +XieTypWhiteAdjustTechnique 3-19 +Resources 4-1 +Overview 4-1 +Binding Resources to Photoflos 4-1 +ColorList resources 4-1 +LUT, Photomap, and ROI resources 4-1 +Resource destruction 4-2 +Synchronizing resource access 4-2 +Capability Acquisition 4-3 +QueryImageExtension 4-3 +Technique Acquisition 4-4 +QueryTechniques 4-4 +ColorList 4-5 +CreateColorList 4-5 +DestroyColorList 4-5 +PurgeColorList 4-6 +QueryColorList 4-6 +LUT 4-7 +CreateLUT 4-7 +DestroyLUT 4-7 +Photomap 4-8 +CreatePhotomap 4-8 +DestroyPhotomap 4-8 +QueryPhotomap 4-9 +ROI 4-10 +CreateROI 4-10 +DestroyROI 4-10 +Pipelined Processing 5-1 +What is a Photoflo? 5-1 +Two kinds of Photoflos 5-2 +Multi-client Photoflos 5-2 +Photoflo States 5-3 +Flo'ing Data to a Resource 5-3 +Name space 5-4 +CreatePhotospace 5-4 +DestroyPhotospace 5-4 +Immediate Photoflos 5-5 +ExecuteImmediate 5-5 +Stored Photoflos 5-6 +CreatePhotoflo 5-6 +DestroyPhotoflo 5-6 +ExecutePhotoflo 5-7 +ModifyPhotoflo 5-8 +RedefinePhotoflo 5-8 +Sending Data to the Server 5-9 +PutClientData 5-9 +Retrieving Data from the Server 5-10 +GetClientData 5-10 +Status 5-11 +QueryPhotoflo 5-11 +Synchronization 5-12 +Await 5-12 +Termination 5-12 +Abort 5-12 +Import Elements 6-1 +Overview 6-1 +Element categories 6-1 +Multi-source images 6-1 +Events generated 6-1 +Import from Client 6-1 +ImportClientLUT 6-2 +ImportClientPhoto 6-3 +ImportClientROI 6-4 +Import from Resource 6-5 +ImportDrawable 6-5 +ImportDrawablePlane 6-6 +ImportLUT 6-7 +ImportPhotomap 6-8 +ImportROI 6-9 +Process Elements 7-1 +Overview 7-1 +Limiting the Process 7-1 +Process Selected Bands 7-1 +Process Intersecting Pixels 7-1 +Process Selected Pixels 7-2 +Data Types 7-2 +Process Categories 7-3 +Process Definitions 7-3 +Arithmetic 7-4 +BandCombine 7-5 +BandExtract 7-6 +BandSelect 7-7 +Blend 7-8 +Compare 7-9 +Constrain 7-11 +ConvertFromIndex 7-12 +ConvertFromRGB 7-13 +ConvertToIndex 7-14 +ConvertToRGB 7-15 +Convolve 7-16 +Dither 7-17 +Geometry 7-18 +Logical 7-20 +MatchHistogram 7-22 +Math 7-23 +PasteUp 7-24 +Point 7-25 +Unconstrain 7-26 +Export Elements 8-1 +Element categories 8-1 +Export to Client 8-1 +Events generated 8-1 +ExportClientHistogram 8-2 +ExportClientLUT 8-3 +ExportClientPhoto 8-4 +ExportClientROI 8-5 +Export to Resource 8-6 +ExportDrawable 8-6 +ExportDrawablePlane 8-7 +ExportLUT 8-8 +ExportPhotomap 8-9 +ExportROI 8-10 +Events and Errors 9-1 +Events 9-1 +ColorAlloc 9-1 +DecodeNotify 9-2 +ExportAvailable 9-2 +ImportObscured 9-3 +PhotofloDone 9-3 +Resource Errors 9-4 +Photoflo errors 9-5 +Techniques A-1 +Standard and Private Techniques A-1 +Technique numbers A-1 +Technique names A-1 +Default Techniques A-2 +Technique parameters A-2 +Technique information A-2 +Color Allocation Techniques A-3 +Constrain Techniques A-4 +Convert From RGB A-5 +Convert To RGB A-6 +Convolution Edge Techniques A-8 +Decode Techniques A-9 +Dithering Techniques A-13 +Encode Techniques A-14 +Gamut Compression Techniques A-18 +Geometry Techniques A-19 +Histogram Shapes A-27 +White Point Adjustment Techniques A-28 +Service Class B-1 +Full B-1 +DIS B-1 +Service Class Summary B-2 +Protocol Encodings C-1 +Extension Name C-1 +Types C-1 +Requests and Replies C-9 +Import Elements C-15 +Process Elements C-17 +Export Elements C-22 +Technique Parameters C-24 +Events C-32 +Errors C-34 +Figures and Tables +Figure 1-1 Service Classes defined in this document 1-2 +Figure 4-1 Creating and populating a new Photomap 4-1 +Figure 4-2 Process image from Photomap a, place result into Photomap b 4-2 +Figure 4-3 Process image from Photomap a "in-place\ 4-2 +Figure 5-1 Photoflo element input and output connections 5-1 +Figure 5-2 Example Photoflo 5-2 +Figure 5-3 Photoflo states 5-3 +Figure 7-1 Combining two sources using a control plane - Logical: NoOp 7-2 +Figure 7-2 A sample geometric transform: crop and scale 7-18 +Figure 7-3 Background fill used for pixels beyond the edge 7-19 +Figure 7-4 Point's algorithm for computing combined LUT indices 7-25 +Figure A-1 Diagram of the ErrorDiffusion algorithm A-13 +Figure A-2 Effect of sampling technique when scaling to a lower pixel density A-20 +Figure A-3 Illustration of an output pixel mapping back to the input image A-21 +Figure A-4 Sequence producing an antialiased image using a low-pass filter A-22 +Figure B-1 DIS sources, operators, and destinations B-1 + +Table 3-1 Technique naming and numbering conventions 3-1 +Table 3-2 Treatment of floating point parameters passed through the protocol 3-4 +Table 5-1 Examples of two element Photoflo usage 5-3 +Table 6-1 Relationship between LUT class and image class 6-2 +Table 7-1 Compare parameter and DataClass dependencies 7-9 +Table 9-1 XIE Error codes 9-4 +Table 9-2 Photoflo error sub-codes 9-5 +Table B-1 Types itemized by ServiceClass B-2 +Table B-2 Techniques itemized by ServiceClass B-4 +Table B-3 Requests itemized by ServiceClass B-5 +Table B-4 Import elements itemized by ServiceClass B-6 +Table B-5 Process elements itemized by ServiceClass B-6 +Table B-6 Export elements itemized by ServiceClass B-6 +Table B-7 Events itemized by ServiceClass B-7 +Table B-8 Errors itemized by ServiceClass B-7 + + + + +Preface +The X architecture was a major step towards defining open, interactive application display services. X +pried apart the tightly coupled, private interconnect which has existed between application and display +subsystem by specifying a minimal, structured service set. +To retain a consistent, minimal core service set and yet accommodate evolving application require- +ments, X provides a method for extending the core protocol with additional domain specific requests. +This document defines an X extension for the imaging domain. It is the fifth version of the X Image +Extension Protocol proposal and, as prior readers will immediately recognize, it is a lineal descendent of +the other four. +Since the purpose of this document is to provide a clear, concise articulation of the protocol, expository +materials have been pared to a bare minimum. It is assumed that the reader has a measure of conceptual +knowledge about imaging. +Readers who lack familiarity with the X Window System are encouraged to begin with a selection from +the related documents given below. +Related Documents + X Window System (Scheifler & Gettys) +The complete reference to Xlib, X protocol (and extension conventions), ICCCM, XLFD. +Digital Press + X Protocol Reference Manual (Nye, editor) +The Definitive Guides to the X Window System, Volume 0. +O'Reilly & Associates, Inc. + The X Window System Server (Israel & Fortune) +Guide to the MIT X sample server: architecture, porting and tuning, writing extensions. +Digital Press + XIE Sample Implementation Architecture (Shelley, Verheiden & Fahy) +An overview of the architecture of the XIE sample implementation. +AGE Logic, Inc. + XIElib Specification (Rogers) +Reference pages for the XIE client library functions. +AGE Logic, Inc. + + +Participants +Authors: +Robert NC Shelley shelley@age.com +Robert W. Scheifler rws@x.org +Ben Fahy jbenfahy@netcom.com +Jim Fulton jim@ncd.com +Keith Packard4 keithp@ncd.com +Joe Mauro mauro@optic.enet.dec.com +Richard Hennessy rich_hennessy@mac.avid.com +Tom Vaughan5 vaughan@edwin.enet.dec.com +Contributors: +Gary Grebus5 +Larry Hare1 +Peter Kaczowka +Jeffrey Siegal +Al Tabayoyon +John Weber +Revision History +rev v1.0 August 1, 1988 first protocol draft +rev v2.0 April 12, 1989 major changes based upon consortia review +rev v2.1 November 1, 1989 changes based upon FT1 implementation +rev v2.2 March 15, 1990 changes based upon FT2 implementation (pipes) +rev v3.0 October 1, 1990 changes in preparation for consortia review +rev v4.0 June 1, 1991 changes based upon consortia technical review +rev v4.08 May 29, 1992 preliminary imagework review copy +rev v4.09 June 9, 1992 imagework review copy for meeting at San Jose +rev v4.10 September 10, 1992 pre-review of encodings and contributions +rev v4.11 October 31, 1992 imagework review with initial definition of DIS +rev v4.12 December 23, 1992 initial Public Review copy +rev v4.13 May 19, 1993 changes made during Alpha phase of sample implementation +rev v4.14 October 20, 1993 changes made during Beta phase of sample implementation +rev v4.15 December 15, 1993 changes made prior to final release of sample implementation +rev V5.0 January 10, 1994 final draft +rev V5.0 April 1, 1994 cosmetic cleanup prior to releasing X11 R6 + + +Organization +This document is organized into the following chapters and appendices: +Introduction +Chapter 1 explains the purpose of the X Image Extension. +Protocol Parameter Types and Syntax +Chapter 2 defines protocol syntax (how the protocol is encoded on the wire). +Chapter 3 defines types for protocol parameters. +Protocol Requests and Replies +Chapter 4 describes the resources used by the extension. +Chapter 5 describes pipelines, client data transport, and pipeline utility requests. +Pipeline Elements +Chapter 6 describes pipeline elements used for data import. +Chapter 7 describes the general processing elements used in pipelines. +Chapter 8 describes pipeline elements used for data export. +Events and Errors +Chapter 9 describes events and errors returned from XIE. +Techniques +Appendix A describes the XIE standard techniques and their parameters. +Service Classes +Appendix B summarizes required, optional, and excluded items for each XIE service class. +Protocol Encodings +Appendix C presents the complete protocol encoding for all XIE: types, requests, replies, ele- +ments, techniques, events, and errors. + + +Acknowledgments +We are all indebted to Digital Equipment Corporation where the X Image Extension was originally +conceived. They persevered through numerous protocol reviews and revisions and provided the initial +sample implementations. Their efforts contributed greatly towards promoting XIE into the Public Re- +view process. +This document evolved from original specifications authored by Joe Mauro. We hope that it still shows +some of his architectural strength and elegance. The majority of the current document (through version +4.11) was authored by Bob Shelley while employed at Digital. Subsequent revisions were made at AGE +Logic. +The current view of pipelines emerged almost completely intact from a single, terse email message from +Bob Scheifler and Keith Packard. +The need for robust geometric transforms was first promoted by Ben Fahy. We are grateful that he has +provided us with detailed documentation for the basic geometry element and several retrospective +sampling algorithms. +While one could debate that XIE is too big or too small, we can thank Jim Fulton for spearheading the +effort to define a smaller gentler XIE, the Document Imaging Subset. + + + + + + + + + + + + + + + + + + + + + + + + +almost blank + + + AGE Logic, Inc. + X Consortium, Inc. + Visionary Software, Inc. + Network Computing Devices, Inc. + Digital Equipment Corporation + Avid Technology, Inc. + Hewlett-Packard Co. + Congruent Corporation + North Valley Research, Inc. + Big Time Software, Inc. + + + +xii + + + +1 +Introduction +Scope and Purpose +This document specifies the X wire protocol for the X Image Extension (XIE). It defines the syntax, +structure, and semantics of XIE protocol elements. It does not contain background material on imaging +concepts which the protocol extension enables, nor does it contain any language specific bindings. +Terminology +This specification contains a certain amount of descriptive terminology that is commonly used within +the image processing community. There is also parametric terminology that is used to describe the pa- +rameter types recognized by the core X protocol and the image extension protocol. The image exten- +sion protocol types are defined in this document. +Techniques +For some XIE operations, there are several recognized algorithms or techniques which offer varying +tradeoffs between quality of results and performance. Also, in some cases, different techniques are re- +quired due to an image's class or content. In order to accommodate some flexibility in this area, such +XIE operations accept a technique parameter. A description of the techniques specified in this docu- +ment can be found in Appendix A. Individual implementations may extend XIE's capabilities by provid- +ing additional techniques to provide for particular market needs. +Service Classes +For some environments, such as simple document image viewing, the full set of services provided by +XIE may include features that are not needed by the target applications. In such situations (particularly +for entry-level monochrome displays), server implementors may wish to provide only a subset of the full +XIE protocol. +Subsets are arranged in a nested hierarchy of service classes. Each service class includes all of the +features of any subsets that it surrounds (similar to the layers of an onion). Thus, applications written +to use a given subset of the protocol will function correctly when running on servers that implement an +enveloping service class. + + +This version of the XIE protocol defines two class: the full protocol (Full), and a document imaging +subset (DIS). Future versions of the XIE protocol may define additional service classes. + +Figure 1-1 Service Classes defined in this document +A complete list of types, techniques, protocol requests, pipeline elements, events, and errors that are +included in DIS can be found in Appendix B. + +Introduction 1-1 + + +2 +Specification Syntax +This section presents syntactic conventions which are adhered to throughout this specification. +General Syntax +In general, the extension package follows the X11 protocol syntax conventions. Additions to this +syntax are: +* The syntax ( . . . ) encloses a set of alternative values. +* The syntax [ . . . ] encloses a set of structure components. +* Within definitions the following prefixes are used: +- XieReq: protocol request/reply (e.g. XieReqCreatePhotoflo) +- XieFlo: Photoflo element (e.g. XieFloConvolve) +- XieEvn: protocol event (e.g. XieEvnPhotofloDone) +- XieErr: protocol error (e.g. XieErrPhotospace) +- XieTyp: protocol type (e.g. XieTypProcessDomain) +- XieVal: alternative value (e.g. XieValBandByPixel) +* Outside of definitions the prefixes are generally not used: +- alternative values are italicized and bold (e.g. BandByPixel) +- all others are capitalized and bold (e.g. CreatePhotoflo) +* Core X types are displayed in upper-case (e.g. COLORMAP, WINDOW) + + +Request Syntax +Requests without a Reply: +XieReqRequestName +arg-1 type-1 1st argument for RequestName + . . . +arg-N type-N N-th argument for RequestName +Errors: none or list of errors specific to RequestName (e.g. FloID) +Events: none or list of events generated by RequestName (e.g. PhotofloDone) +Overview describes the basic function of the request. +Parameters lists the parameters and gives a brief description of each. +Semantics interrelationships between input data, parameters, and output results. +Errors table of errors that can be generated and their causes: +Error Cause +error-1 circumstances that generate error-1 +. . . +error-N circumstances that generate error-N +Requests with a Reply: +XieReqRequestName +arg-1 type-1 1st argument for RequestName + . . . +arg-N type-N N-th argument for RequestName +* +result-1 type-1 1st reply result from RequestName + . . . +result-M type-M M-th reply result from RequestName +Errors: none or list of errors specific to RequestName (e.g. Photomap) +Events: none or list of events generated by RequestName (e.g. EventName) +Overview describes the basic function of the request. +Parameters lists the parameters and gives a brief description of each. +Reply data lists the parameters and gives a brief description of each. +Semantics interrelationships between input data, parameters, and output results. +Errors table of errors that can be generated and their causes: +Error Cause +error-1 circumstances that generate error-1 +. . . +error-N circumstances that generate error-N +Syntax of Photo Elements +PhotoElements occur within XIE pipelines (see following chapters for clarification). The syntax of these +elements is shown below. +Photo Elements: +XieFloElementName +src-1 src-type-1 1st source for ElementName (if required) + . . . +src-N src-type-N N-th source for ElementName (if required) +param-1 param-type-1 1st parameter for ElementName + . . . +param-M param-type-M M-th parameter for ElementName +Errors: none or list of errors specific to ElementName (e.g. FloAlloc) +Events: none or list of events generated by ElementName (e.g. ExportAvailable) +Attributes table of PhotoElement output attributes: +Attribute Value +class DataClass of output data + SingleBand achromatic or index + TripleBand trichromatic +type DataType: + Constrained quantization levels is levels (integer data) + Unconstrained quantization levels is unknown (may be float data) +width width of output data (in pixels per band) +height height of output data (in pixels per band) +levels depends on type: + Constrained number of quantization levels (per band) + Unconstrained unknown +Overview describes the basic function of the photo element. +Parameters lists the parameters and gives a brief description of each. +Semantics interrelationships between input data, parameters, and output results. +Errors table of errors that can be generated and their causes: +Error Cause +error-1 circumstances that generate error-1 +. . . +error-N circumstances that generate error-N + + +Syntax of Events +Events generated by Photo Elements: +XieEvnEventName +instance XieTypExecutable < Photoflo instance generating EventName > +phototag XieTypPhototag < event Phototag (0 for general Photoflo event) > +type CARD16 < element type (0 for general Photoflo event) > +value-1 type-1 < 1st value returned by EventName > + . . . +value-N type-N < N-th value returned by EventName > +Overview description of the event. +Values returned description of the values returned. +Syntax of Errors +Errors can be associated with core X11 resources or XIE resources. In the case of XIE specific error +conditions, a distinction is made between errors related to a Photoflo and those that are not. +Core X errors +Normal X errors (with XIE major/minor opcodes) are used where appropriate (e.g. Alloc). +XIE non-Photoflo errors: +XieErrName +xie-error XieErrName < error code of Name, offset from first-error > +resource-id XID < resource to blame, e.g. Photomap > +detail < 21 bytes available for additional error detail > +Overview description of the error. +Values returned description of the values returned. +XIE Photoflo related errors: +XieErrFloName +flo-error XieErrName < error code for Flo, offset from first-error > +flo-id CARD32 < executable flo-id> +flo-code XieErrFloName < specific error type > +name-space CARD32 < executable name-space> +phototag CARD16 < erring Phototag (0 for general Photoflo error) > +type CARD16 < element type (0 for general Photoflo error) > +detail < 12 bytes available for additional error detail > + +Overview description of the error. +Values returned description of the values returned. +Syntax of Protocol Encodings +Requests +# of Bytes Value Description +1 CARD8 XIE major opcode +1 CARD8 XIE minor opcode +2 CARD16 request length (total bytes divided by 4) +N parameters required by the minor opcode +< 4 pad (if required) +Requests consist of four (4) bytes of header followed by zero (0) or more additional bytes of data. If +additional bytes of data are needed the entire request is padded to a multiple of four (4) bytes. The +common fields (major/minor opcode and length) are not included in XieReq request definitions. Bytes +not used by a specific minor opcode are not guaranteed to be zero. +Replies +# of Bytes Value Description +1 1 Reply +1 available for reply data +2 CARD16 sequence number of corresponding request +4 CARD32 reply length (extra data bytes divided by 4) +24 available for reply data +N extra data beyond standard reply packet +< 4 pad (if required) +Replies consist of thirty-two (32) bytes followed by zero (0) or more extra bytes of data. If extra bytes of +data are needed the entire reply is padded to a multiple of four (4) bytes. The common fields (Reply, +sequence number, and length) are not included in XieReq reply definitions. Bytes not used by the reply +from a specific request are not guaranteed to be zero. +PhotoElements +# of Bytes Value Description +2 CARD16 element type +2 CARD16 element length (bytes divided by 4) +multiple of 2 XieTyp(Phototag|Tile) element's data source(s) (if required) +N parameters as required by element type +< 4 pad (if required) +A photo element consists of four (4) bytes of header, followed by zero (0) or more bytes of element in- +put connection definitions, followed by zero (0) or more bytes or additional data. The entire element +definition is padded to a multiple of four (4) bytes. The common fields (element type and element +length) are not included in XieFlo element definitions. Bytes not used by a specific element type are +not guaranteed to be zero. +Note: PhotoElements are not protocol requests, but rather sub-packets within another protocol request (i.e. +ExecuteImmediate, CreatePhotoflo, ModifyPhotoflo, or RedefinePhotoflo). +Events +# of Bytes Value Description +1 CARD8 XIE event code +1 +2 CARD16 sequence number +4 TIMESTAMP time +24 +Events consist of thirty-two (32) bytes. The common fields (event code, sequence number, and time) +are not included in XieEvn definitions. Bytes not used by a specific event code are not guaranteed to +be zero. +Errors +# of Bytes Value Description +1 0 Error +1 CARD8 XIE error code +2 CARD16 sequence number +4 +2 CARD16 minor opcode +1 CARD8 major opcode +21 +Errors consist of thirty-two (32) bytes. Bytes not used by the specific error code are not guaranteed to +be zero. + +Protocol Specification Syntax 2-6 + + +3 +Parameter Types +XIE and Core X Types +X Image Extension types are defined in this section. All XIE parameters are defined as being either one of +the extension types, or one of the core protocol types. XIE makes use of the following core protocol types +(defined in the X11 core protocol specification): +BITMAP BOOL CARD8 CARD16 +CARD32 CHAR2B COLORMAP DRAWABLE +EVENT GCONTEXT INT8 INT16 +INT32 PIXMAP STRING8 TIMESTAMP +VISUAL WINDOW XID* +* XID is used to refer to the core X11 type defined as the identifier for a resource. +Techniques +Several standard techniques are defined in this document. Each is assigned a technique number and a de- +scriptive name string. XIE can also be extended with private techniques that are implementation dependent. +Private technique numbers are generated dynamically. Private technique name strings include the name of +the organization that defined the technique. The organization name is encompassed by _ (underscore) +characters. Technique naming and numbering conventions are summarized in Table 3-1. + + +standard technique +private technique + +name + +example: ERROR-DIFFUSION +__ +example: _PHOTOCO_SQUASH-BITS + +number +MS bit is zero (range: 0 - 32767) +MS bit is one (range: 32768 - 65535) + +Table 3-1 Technique naming and numbering conventions +The technique number is supplied to pipeline elements to specify the desired technique. Numbers for +standard techniques can be hard-coded, whereas numbers for private techniques must be obtained using +the QueryTechniques protocol request. + +For more information on techniques and a description of the techniques defined in this document, refer to Appendix A. A +list of techniques itemized by ServiceClass can be found in Appendix B. Numbers assigned to standard techniques are encoded +in Appendix C. +Definitions +XieTypAlignment +Alignment defines the valid pixel and scanline alignments allowed for image data transported through the +protocol stream. The server's Alignment attribute is returned by the QueryImageExtension protocol re- +quest. +XieTypAlignment { XieValAlignable, XieValArbitrary } +* Alignable data units must fit evenly within a byte, or they must fill a byte, or fill a multiple + of bytes (i.e. pixels may be 1, 2, 4, 8, 16, 24*, or 32* bits in the protocol stream). +* Arbitrary data units may fall at any bit address (i.e. 10 bit packed pixels are acceptable in + the protocol stream). +* XIE supports pixels up to sixteen (16) bits per band for both SingleBand and TripleBand data. In addition, +SingleBand data are supported up to the depth of the deepest DRAWABLE supported by the server. + + +XieTypArithmeticOp +ArithmeticOp defines the valid operations for the Arithmetic process element. +XieTypArithmeticOp { XieValAdd, + XieValSub, XieValSubRev, + XieValMul, + XieValDiv, XieValDivRev, + XieValMin, XieValMax, + XieValGamma } +* Add src1 + src2 or src1 + constant +* Sub src1 - src2 or src1 - constant +* SubRev src2 - src1 or constant - src1 +* Mul src1 * constant +* Div src1 / constant +* DivRev constant / src1 +* Min minimum( src1, src2 ) or minimum( src1, constant ) +* Max maximum( src1, src2 ) or maximum( src1, constant ) +* Gamma if src1 is Constrained (levels - 1) * ((src1 / (levels - 1))constant) + if src1 is Unconstrained src1constant + + + +XieTypColorAllocTechnique +ColorAllocTechnique defines the recognized color allocation techniques used by the ConvertToIndex +element. +XieTypColorAllocTechnique { XieValDefault, +XieValColorAlloc_AllocAll, +XieValColorAlloc_Match, +XieValColorAlloc_Requantize } +* Default +ColorAlloc_AllocAll ALLOC-ALL +ColorAlloc_Match MATCH +ColorAlloc_Requantize REQUANTIZE +private-technique-number private-name-string +* The server is required to support the Default technique which is bound to one of the standard techniques defined above or +a private technique. + +XieTypColorList +ColorList is the type for the XIE resource used to store COLORMAP allocations made by the ConvertTo- +Index element. A ColorList is a permanent resource and as such must be created and destroyed by the +client. A ColorList contains a counted list of the pixel indices that were allocated, and the resource-id of the +COLORMAP from which they were allocated. +XieTypColorList XID + +XieTypCompareOp +CompareOp defines the operators for the Compare element. +XieTypCompareOp { XieValLT, XieValLE, +XieValEQ, XieValNE, +XieValGT, XieValGE } +* LT src1 < src2 or src1 < constant +* LE src1 £ src2 or src1 £ constant +* EQ src1 = src2 or src1 = constant +* NE src1 ¹ src2 or src1 ¹ constant +* GT src1 > src2 or src1 > constant +* GE src1 ³ src2 or src1 ³ constant + + +XieTypConstant +Constant is typically used to supply per-band constant values. All constants are passed as floats. When a +constant is to be used as a substitute for a Constrained image pixel, the constant is rounded to the nearest +integer, and then hard-clipped to the range of levels that applies to the pixel for which it is a substitute. In +most other cases the constant is used as is (i.e. as a float). +XieTypConstant XieTypTripletofXieTypFloat + +Element Op/arg/Tech Type Usage If Constrained ¼ + +Arithmetic Add Constant pixel value when monadic round/hard-clip + Sub Constant pixel value when monadic round/hard-clip + SubRev Constant pixel value when monadic round/hard-clip + Min Constant pixel value when monadic round/hard-clip + Max Constant pixel value when monadic round/hard-clip + Mul Constant multiplicand use as is + Div Constant divisor use as is + DivRev Constant dividend use as is + Gamma Constant exponent use as is + +BandExtract coefficients Constant multipliers use as is + bias Float final offset use as is + +Blend constant Constant pixel value when monadic round/hard-clip + alpha-constant Float constant alpha value use as is + +Compare constant Constant pixel value when monadic round/hard-clip + +Constrain ClipScale Constant scale src levels to dst levels use as is + +Convert From/To RGB CIElab Matrix conversion matrix use as is + CIElabShift Constant white-point use as is + CIEXYZ Matrix conversion matrix use as is + YCbCr Constant luma values and bias use as is + YCC Constant luma values use as is + YCC Float scale use as is + +ConvertToIndex Match Float match-limit, gray-limit use as is + +Convolve kernel LISTofFloat convolution kernel use as is + Constant Constant edge pixel value round/hard-clip + +Geometry a,b,c,d,tx,ty Float coefficients [6] use as is + constant Constant fill pixel value round/hard-clip + Gaussian Float sigma, normalize use as is + +Logical constant Constant pixel value when monadic round/hard-clip + +MatchHistogram Gaussian Float mean, sigma use as is + Hyperbolic Float constant use as is + +PasteUp constant Constant fill pixel value round/hard-clip + +Table 3-2 Treatment of floating point parameters passed through the protocol + + +XieTypConstrainTechnique +ConstrainTechnique defines various methods of constraining data. These techniques are applied by the +Constrain element. +XieTypConstrainTechnique { XieValConstrain_ClipScale, +XieValConstrain_HardClip } +Constrain_ClipScale CLIP-SCALE +Constrain_HardClip HARD-CLIP +private-technique-number private-name-string + +XieTypConvertFromRGBTechnique +ConvertFromRGBTechnique defines the trichromatic colorspaces known to the ConvertFromRGB element. +XieTypConvertFromRGBTechnique { XieValConvertFromRGB_CIELab, +XieValConvertFromRGB_CIEXYZ, +XieValConvertFromRGB_YCbCr, +XieValConvertFromRGB_YCC } +ConvertFromRGB_CIELab CIELAB +ConvertFromRGB_CIEXYZ CIEXYZ +ConvertFromRGB_YCbCr YCbCr +ConvertFromRGB_YCC YCC +private-technique-number private-name-string + +XieTypConvertToRGBTechnique +ConvertToRGBTechnque defines the trichromatic colorspaces known to the ConvertToRGB element. +XieTypConvertToRGBTechnique { XieValConvertToRGB_CIELab, +XieValConvertToRGB_CIEXYZ, +XieValConvertToRGB_YCbCr, +XieValConvertToRGB_YCC } +ConvertToRGB_CIELab CIELAB +ConvertToRGB_CIEXYZ CIEXYZ +ConvertToRGB_YCbCr YCbCr +ConvertToRGB_YCC YCC +private-technique-number private-name-string + + +XieTypConvolveTechnique +ConvolveTechnique provides various methods of handling edge conditions in the Convolve element. This +technique determines what pixel values are used when Convolve requires data beyond the image bounds. +XieTypConvolveTechnique { XieValDefault, +XieValConvolve_Constant, +XieValConvolve_Replicate } +* Default +Convolve_Constant CONSTANT +Convolve_Replicate REPLICATE +private-technique-number private-name-string +* The server is required to support the Default technique which is bound to one of the standard techniques defined above or +a private technique. + +XieTypDataClass +DataClass defines the class of data being transported over the wire. +XieTypDataClass { XieValSingleBand, +XieValTripleBand } +* SingleBand index data (e.g. ZPixmap format COLORMAP indices), or +achromatic data (bitonal or gray-scale) +* TripleBand non-index trichromatic data (RGB or other supported colorspaces) + +XieTypDataStream +DataStream is a segmented stream of data units that are transported in either direction through the protocol +stream. Segments of image data are transported as an arbitrary number of unsigned bytes, whereas all other +types of data (e.g. lookup table entries, rectangles, histogram counts, etc.) must be transported as one or +more complete aggregates. The status indicating the eventual end of data, is supplied in the associated +protocol request or reply. The interpretation of the data stream is determined by parameters specified to the +PhotoElement accepting or generating the data. +XieTypDataStream LISTofCARD8 + +XieTypDataType +DataType defines the limits and processing model for the data. +XieTypDataType { XieValConstrained, +XieValUnconstrained } +* Constrained pixels are integer values and are limited to the range [0, levels-1] +* Unconstrained pixels may be any arbitrary value + + +XieTypDecodeTechnique +DecodeTechnique defines the techniques that can be used to interpret uncompressed image data or decode +compressed images. +XieTypDecodeTechnique { XieValDecode_UncompressedSingle, +XieValDecode_UncompressedTriple, +XieValDecode_CCITT-G31D, +XieValDecode_CCITT-G32D, +XieValDecode_CCITT-G42D, +XieValDecode_JPEG-Baseline, +XieValDecode_JPEG-Lossless, +XieValDecode_TIFF-2, +XieValDecode_TIFF-PackBits } +Decode_UncompressedSingle UNCOMPRESSED-SINGLE +Decode_UncompressedTriple UNCOMPRESSED-TRIPLE +Decode_CCITT-G31D CCITT-G31D +Decode_CCITT-G32D CCITT-G32D +Decode_CCITT-G42D CCITT-G42D +Decode_JPEG-Baseline JPEG-BASELINE +Decode_JPEG-Lossless JPEG-LOSSLESS +Decode_TIFF-2 TIFF-2 +Decode_TIFF-PackBits TIFF-PACKBITS +private-technique-number private-name-string + +XieTypDitherTechnique +DitherTechnique defines the techniques that can be used to dither an image. +XieTypDitherTechnique { XieValDefault, +XieValDither_ErrorDiffusion, +XieValDither_Ordered } +* Default +Dither_ErrorDiffusion ERROR-DIFFUSION +Dither_Ordered ORDERED +private-technique-number private-name-string +* The server is required to support the Default technique which is bound to one of the standard techniques defined above or +a private technique. + + +XieTypEncodeTechnique +EncodeTechnique defines the techniques that can be used to compress an image or format it as uncom- +pressed data. +XieTypEncodeTechnique { XieValEncode_ServerChoice, +XieValEncode_UncompressedSingle, +XieValEncode_UncompressedTriple, +XieValEncode_CCITT-G31D, +XieValEncode_CCITT-G32D, +XieValEncode_CCITT-G42D, +XieValEncode_JPEG-Baseline, +XieValEncode_JPEG-Lossless, +XieValEncode_TIFF-2, +XieValEncode_TIFF-PackBits } +Encode_ServerChoice (not returned by QueryTechniques) +Encode_UncompressedSingle UNCOMPRESSED-SINGLE +Encode_UncompressedTriple UNCOMPRESSED-TRIPLE +Encode_CCITT-G31D CCITT-G31D +Encode_CCITT-G32D CCITT-G32D +Encode_CCITT-G42D CCITT-G42D +Encode_JPEG-Baseline JPEG-BASELINE +Encode_JPEG-Lossless JPEG-LOSSLESS +Encode_TIFF-2 TIFF-2 +Encode_TIFF-PackBits TIFF-PACKBITS +private-technique-number private-name-string + +XieTypExecutable +Executable is the type used to identify a specific Photoflo instance. +XieTypExecutable +[ name-space ServerIDSpace or XieTypPhotospace + flo-id XieTypPhotoflo or CARD32 +] +Name-space identifies the execution domain used for a Photoflo. Flo-id identifies a particular instance of a +Photoflo. +For stored Photoflos name-space is always ServerIDSpace (the value zero) and flo-id is the Photo- +flo's resource-id. +For immediate Photoflos name-space is a Photospace resource-id and flo-id is a thirty-two (32) bit value +that uniquely identifies the instance of the Photoflo within name-space. + + +XieTypExportNotify +ExportNotify is used by ExportClient elements to control how ExportAvailable events are sent to the +client. +XieTypExportNotify { XieValDisable +XieValFirstData +XieValNewData } +* Disable no events are sent +* FirstData a single event is sent when the first data is available +* NewData an event is sent each time the amount of available data changes from zero to non-zero + +The end of data is signaled by a final flag in the GetClientData reply that is returned when the last segment of data is re- +trieved. + +XieTypExportState +ExportState is a status value returned from an ExportClient element in a reply to the corresponding +GetClientData protocol request. +XieTypExportState { XieValExportDone, +XieValExportMore, +XieValExportEmpty, +XieValExportError } +* ExportDone all data have been retrieved +* ExportMore more data currently available +* ExportEmpty no more data available at this time +* ExportError an error condition prevents data availability + +XieTypFloat +Float specifies data is in the IEEE single-precision format as described in ANSI/IEEE Standard 754-1985, +IEEE Standard for Binary Floating-Point Arithmetic. Float is used only for constant parameter values, +matrix coefficients, etc., but never for transported image data. The byte order of each Float is dealt with in +the same manner as other numeric values; it is determined at core protocol connection setup time. + + +XieTypGamutTechnique +GamutTechnique defines the gamut compression techniques used by ConvertToRGB to deal with con- +verted colors which lie outside the gamut of the RGB space. +XieTypGamutTechnique { XieValDefault, +XieValGamut_None, +XieValGamut_ClipRGB } +* Default +Gamut_None NONE +Gamut_ClipRGB CLIP-RGB +private-technique-number private-name-string +* The server is required to support the Default technique which is bound to one of the standard techniques defined above or +a private technique. + +XieTypGeometryTechnique +GeometryTechnique defines the retrospective image re-sampling techniques used by the Geometry element. +XieTypGeometryTechnique { XieValDefault, +XieValGeometry_Antialias, +XieValGeometry_AntialiasByArea, +XieValGeometry_AntialiasByLowpass, +XieValGeometry_BilinearInterpolation, +XieValGeometry_Gaussian, +XieValGeometry_NearestNeighbor } +* Default +Geometry_Antialias ANTIALIAS +Geometry_AntialiasByArea ANTIALIAS-BY-AREA +Geometry_AntialiasByLowpass ANTIALIAS-BY-LOWPASS +Geometry_BilinearInterpolation BILINEAR-INTERPOLATION +Geometry_Gaussian GAUSSIAN +Geometry_NearestNeighbor NEAREST-NEIGHBOR +private-technique-number private-name-string +* The server is required to support the Default technique which is bound to one of the standard techniques defined above or +a private technique. + + +XieTypHistogramData +HistogramData defines the organization of histogram entries created by the ExportClientHistogram +element. +XieTypHistogramData +[ value CARD32 + count CARD32 +] + +XieTypHistogramShape +HistogramShape defines the various match-histogram shape techniques that can be requested in the +MatchHistogram element. +XieTypHistogramShape { XieValHistogram_Flat, +XieValHistogram_Gaussian, +XieValHistogram_Hyperbolic } +Histogram_Flat FLAT +Histogram_Gaussian GAUSSIAN +Histogram_Hyperbolic HYPERBOLIC +private-technique-number private-name-string + +XieTypInterleave +Interleave defines the way in which bands of TripleBand data may be interleaved. +XieTypInterleave { XieValBandByPixel, +XieValBandByPlane } +* BandByPixel the data for all bands are interleaved on a per-pixel basis and transmitted as a single data plane +(e.g. for RGB data red, green, and blue values for a given pixel are immediately followed by the +red, green, and blue values for the next pixel). BandByPixel is similar to the core protocol +ZPixmap format. +* BandByPlane the data for each band are transmitted as separate data planes (e.g. for RGB data all red data are +transmitted in one plane, all green data in a separate plane, and all blue data in another plane). + +Interleave is generally used in conjunction with Orientation, which would define the order of the interleaved bands. + + +XieTypLevels +Levels describes the potential dynamic range for the quantization levels associated with each band of an +image. +XieTypLevels XieTypTripletofCARD32 + Note: for Constrained image data a value of zero (0) represents 232 (4,294,967,296) levels. + +XieTypLUT +LUT is the type for the XIE server resource used to hold arrays which map one set of values to another. The +arrays are one-dimensional, and the resource holds either one or three arrays. The ImportClientLUT and +ImportLUT elements are used to import LUT data into a Photoflo, the Point element uses the data, the +ExportLUT element is used to (re)populate the LUT resource, and the ExportClientLUT element is provided +to facilitate sending the LUT data back to the client. +XieTypLUT XID + +XieTypMathOp +MathOp defines the valid mathematical operations that can be invoked through the Math element. The +MathOp is applied to each input pixel value to determine the output pixel value. +XieTypMathOp { XieValExp, XieValLn, +XieValLog2, XieValLog10, +XieValSquare, XieValSqrt } +* Exp exponential +* Ln natural logarithm +* Log2 logarithm base 2 +* Log10 logarithm base 10 +* Square square +* Sqrt square root + +XieTypMatrix +Matrix is a 3 x 3 matrix of floats that is used by some of the colorspace conversion techniques (e.g. con- +version between RGB and CIE colorspaces). +XieTypMatrix XieTypTripletofXieTypConstant + + +XieTypOrientation +Orientation defines the transmission order of image data units through the protocol stream. +XieTypOrientation { XieValLSFirst, XieValMSFirst } +Note: in the examples that follow, the order of bytes in the DataStream should be read from left to right. + +encoded-order Specifies the order of bits within bytes of encoded (compressed) data. +Example: showing 2 bytes (within each byte the first encoded bit is 0, last is bit 7) + +LSFirst +MSFirst + + +76543210 76543210 +01234567 01234567 + +fill-order When multiple pixels are put in the same byte, or a pixel spans multiple bytes, fill-order +specifies whether the pixels (or parts of a pixel) are packed into the most or least +significant bits of a byte first. +Example: showing 8 2-bit pixels (aa, bb, cc, etc.), and 2 10-bit pixels: aaaaaaaaaa +and bbbbbbbbbb) + +LSFirst +MSFirst + + +ddccbbaa hhggffee +aabbccdd eeffgghh + + +aaaaaaaa bbbbbbaa xxxxbbbb +aaaaaaaa aabbbbbb bbbbxxxx + +pixel-order For pixels that span a byte boundary, pixel-order specifies whether the most or least +significant bits of the pixel are put into the DataStream first. Any pad bits that are +present between pixels always follow the pixel data (i.e. pad bits are not considered to be +either LS-bits or MS-bits of the pixel data). +Example: showing 2 10-bit pixels, each with 2 bits of pad (within each pixel the LS-bits +are 0 and a, the MS-bits are 9 and j, the pad bits are p) +fill-order +LSFirst (pixel-order) +MSFirst (pixel-order) + +LSFirst +76543210 dcbapp98 ppjihgfe +98765432 jihgpp10 ppfedcba + +MSFirst +76543210 98ppdcba jihgfepp +98765432 10ppjihg fedcbapp + +band-order Definition: at the protocol level, the least significant band of trichromatic data is the first +band mentioned in the common name of the colorspace (e.g. red is the least significant +band of RGB data). + For BandByPixel data, band-order specifies whether this band is put in the least or most +significant bits of a pixel. + +LSFirst +MSFirst + + +B1B0G2G1G0R2R1R0 +R2R1R0G2G1G0B1B0 + + For BandByPlane data, band-order specifies whether this band corresponds with the +least significant or most significant image plane. Each plane is transported as a separate +DataStream. +band +LSFirst +MSFirst + +0 +R7R6R5R4R3R2R1R0 +B7B6B5B4B3B2B1B0 + +1 +G7G6G5G4G3G2G1G0 +G7G6G5G4G3G2G1G0 + +2 +B7B6B5B4B3B2B1B0 +R7R6R5R4R3R2R1R0 + + For all other instances where a triplet of per-band information is conveyed through the +protocol (levels, constants, etc.), the first element of the triplet corresponds with the +least significant band as defined above. +XieTypPhotoElement +PhotoElement, or just element, is a generic type used for import, process, or export elements in a Photoflo. +The syntax of a generic element was described in Chapter 2. The actual element definitions are found in +Chapters 6, 7, and 8. + +XieTypPhotoflo +Photoflo is the type for the XIE server resource which is used to represent a sequence of image processing +operations. Stored Photoflos are permanent resources. As such they must be created and destroyed by +the client. +XieTypPhotoflo XID +For immediate Photoflos, see type Photospace and the ExecuteImmediate protocol request. + +XieTypPhotofloOutcome +PhotofloOutcome is returned by the PhotofloDone event and indicates the reason why the Photoflo left the +Active state. +XieTypPhotofloOutcome { XieValFloSuccess, +XieValFloError, +XieValFloAbort } +* FloSuccess the Photoflo completed normally +* FloError the Photoflo terminated due to an error condition +* FloAbort the Photoflo was aborted by the client + + +XieTypPhotofloState +PhotofloState identifies the current execution state of a Photoflo. +XieTypPhotofloState { XieValInactive, +XieValActive, +XieValNonexistent } +* Inactive the state of a stored Photoflo prior to execution, after an error or abort, or after execution +completes. Inactive stored Photoflos can be modified and redefined. +* Active the state of a stored or immediate Photoflo during execution. + A Photoflo remains Active until: + - all export elements have finished their task, and + - all data exported for the client have been retrieved, or + - an error prevents further progress, or + - the client issues an abort request. +* Nonexistent the state of a Photoflo that does not exist (never existed or has been destroyed). + +XieTypPhotomap +Photomap is the type for the XIE resource used to store image data in the server. A Photomap is a per- +manent resource that can be created and destroyed by the client. ImportPhotomap is used to import per- +manent image data into a Photoflo. ExportPhotomap is used to (re)populate the resource. +XieTypPhotomap XID + +XieTypPhotospace +Photospace is the type for the XIE resource used to define a XIE name space within which immediate +Photoflos may be executed. A Photospace is a permanent resource and as such must be created and de- +stroyed by the client. +XieTypPhotospace XID + +XieTypPhototag +Phototag is the position or index of a PhotoElement within a list of elements used to specify a Photoflo. The +first element in the list has a Phototag value of one (1). A Phototag value of zero (0) is reserved for special +purposes, such as indicating an optional element input that is not connected, or indicating Photoflo errors +that are not specific to an element. +XieTypPhototag CARD16 +XieTypProcessDomain +ProcessDomain is a sub-structure inserted in many PhotoElement definitions. It is used to restrict the +element's processing to a subset of the source data pixels. A ProcessDomain can be either a list-of- +rectangles or a control-plane. +XieTypProcessDomain +[ offset-x INT32 +offset-y INT32 +domain XieTypPhototag +] +Offset-x and offset-y specifies the spatial registration between the element's data source(s) and the +ProcessDomain (i.e. offset relative to the origin of the source(s)). Domain is the Phototag of the element +providing the ProcessDomain data. +If the value zero (0) is specified for domain, processing is not restricted by the processing domain, other- +wise, domain references an element outputting a list-of-rectangles or image data which is used as a control- +plane. +If domain is a list-of-rectangles, processing is restricted to the intersection of the data source(s) and any +rectangle within the list (offset-x and offset-y are added to the x and y of each rectangle). +If domain is a source of Constrained, SingleBand, bi-level image data (i.e. a control-plane), processing is +restricted to the intersection of the data source(s) and non-zero locations within domain. +ProcessDomain is not supported by DIS but is included in the subset because the Point element takes a +ProcessDomain as a parameter (in this case domain must be zero). + +XieTypRectangle +Rectangle describes a rectangle used in XieTypROI. +XieTypRectangle +[ x INT32 +y INT32 +width CARD32 +height CARD32 +] +X and y are the coordinates of the upper left hand corner of the rectangle within the ProcessDomain (the +domain's x,y offset is also added to these coordinates to position the rectangle relative to the image being +processed). Width and height are the extent of the rectangle. + +XieTypROI +ROI (Rectangles-Of-Interest) is the XIE resource used to contain a list-of-rectangles (input for a +ProcessDomain). A ROI resource is a permanent resource and as such must be created and destroyed by +the client. ImportClientROI and ImportROI elements are used to import a list-of-rectangles into a Photoflo, +the ExportROI element is used to (re)populate an ROI resource, and the ExportClientROI element is +provided to facilitate sending rectangles back to the client *. +XieTypROI XID +* The list-of-rectangles that can be retrieved by the client need not be identical to the original list that was received from +the client, but it must be logically equivalent. +XieTypServiceClass +ServiceClass defines the recognized image processing service sets supported by this X Image Extension +standard. +XieTypServiceClass { XieValFull, XieValDIS } +* Full supports the entire XIE protocol as defined in this document +* DIS supports the Document Image Subset, a proper subset of Full XIE +An itemized list of XIE types, techniques, protocol requests, elements, events, and errors that are included in each +ServiceClass can be found in Appendix B. + +XieTypTechniqueGroup +TechniqueGroup defines the standard technique group names that can be queried using the QueryTech- +niques protocol request. +XieTypTechniqueGroup { XieValDefault, +XieValAll, +XieValColorAlloc, +XieValConstrain, +XieValConvertFromRGB, +XieValConvertToRGB, +XieValConvolve, +XieValDecode, +XieValDither, +XieValEncode, +XieValGamut, +XieValGeometry, +XieValHistogram, +XieValWhiteAdjust } +* Default select all default techniques +* All select all supported techniques +* ColorAlloc select color allocation techniques +* Constrain select techniques for constraining data +* CovertFromRGB select colorspace conversion techniques (for conversion from the RGB colorspace) +* CovertToRGB select colorspace conversion techniques (for conversion to the RGB colorspace) +* Convolve select techniques for handling convolution edge conditions +* Decode select image decoding (decompression) techniques +* Dither select dithering techniques +* Encode select image encoding (compression) techniques +* Gamut select colorspace conversion gamut compression techniques +* Geometry select geometric sampling techniques +* Histogram select match-histogram shapes +* WhiteAdjust select colorspace conversion white point adjustment techniques + +If a vendor defined an additional private technique group, it could be discovered by querying for All groups. +XieTypTechniqueRec +TechniqueRec defines the information which is returned for each technique in the reply to a Query- +Techniques protocol request. +XieTypTechniqueRec +[ needs-parameters BOOL +group XieTypTechniqueGroup +number CARD16 +speed CARD8 +name STRING8 +] +Needs-parameters indicates that a technique requires additional parameters; or if false, the technique either +takes no parameters, or its parameters are optional. Group identifies which group the technique belongs to. +Number is the numeric identifier assigned to the technique *. Speed represents the server's view of the +speed of this technique relative to the other techniques in the same group (0 is the slowest, and 255 is the +fastest). Name is the XIE compliant technique name string. +* Numbers assigned to standard techniques are encoded in Appendix C. + +XieTypTile +Tile defines a source data tile for the PasteUp element. +XieTypTile +[ src XieTypPhototag +dst-x INT32 +dst-y INT32 +] +Src is the Phototag of the element supplying source data. Dst_x, dst_y specify the coordinates where the +tile belongs in the output data. + +XieTypTripletoftype +Tripletof is a generic type used to define a fixed sized array of 3 items* of the specified type. +XieTypTripletof [ v0, v1, v2 : (of type) ] +* Tripletof is usually used to describe per-band attributes and parameters. When dealing with SingleBand images, the value +zero must be used for the nonexistent bands. +XieTypWhiteAdjustTechnique +WhiteAdjustTechnique defines the white point adjustment techniques which can be used when converting +to or from the RGB colorspace. +XieTypWhiteAdjustTechnique { XieValDefault, +XieValWhiteAdjust_None, +XieValWhiteAdjust_CIELabShift } +* Default +WhiteAdjust_None NONE +WhiteAdjust_CIELabShift CIELAB-SHIFT +private-technique-number private-name-string +* The server is required to support the Default technique which is bound to one of the standard techniques defined above or +a private technique. + + + + + + + + + + + + + + + + + + + + + + + +almost blank + +Protocol Parameter Types 3-1 + + +4 +Resources +Overview +XIE resources are extension server objects created by the client which contain information used by the +extension in carrying out various protocol requests. There are protocol requests to create and destroy +each resource type. Resource identifiers are generated by the client as defined by the core protocol. +All XIE resources are reference counted. +Binding Resources to Photoflos +Each resource that is referenced from a Photoflo is bound to the Photoflo (and its reference count is +incremented) when the Photoflo becomes Active. +ColorList resources +A ColorList is purged of previous allocations when a Photoflo begins execution, and is populated with +new allocations (via ConvertToIndex) as the Photoflo proceeds. A ColorList can only be referenced by +one Active Photoflo at a time. The ColorList's reference count is decremented when the Photoflo is no +longer Active. +LUT, Photomap, and ROI resources +These XIE resources consist of two parts: one part contains the resource-id, the other part holds at- +tributes and data. Figure 4-1 pictures the first part as a handle, and the second part as a bucket. Upon +resource creation only the handle exists. The bucket is created when the Photoflo (referencing the +handle via an ExportResource element) becomes Active. The handle and bucket are joined when +the Photoflo successfully completes. Conceptually each part contains a separate reference count. + +Figure 4-1 Creating and populating a new Photomap +In the case of ImportResource elements the handle and bucket are both bound to the Photoflo +when it first becomes Active (initialization). For ExportResource elements, only the handle is +bound at this time and a new bucket is created to hold the forthcoming data. This bucket's attributes +are derived from the ExportResource element. +If an export handle is already connected to a bucket, the old bucket remains with its handle until suc- +cessful Photoflo completion. Thus, the old bucket is preserved if the Photoflo terminates due to an error +condition or if an Abort request is received from the client. +The new bucket is filled with data as the Photoflo proceeds. When the Photoflo successfully com- +pletes, old buckets can be freed if they have no other references, and the waiting handle is joined to the +new bucket. This is illustrated in figure 4-2. + +Figure 4-2 Process image from Photomap a, place result into Photomap b +This model also allows pseudo in-place operations such as is illustrated in figure 4-3. Here an image is +imported from a Photomap, processed, and then the result is exported back to the same Photomap. Note +that upon completion the old handle is moved to the new bucket and the old bucket is destroyed. + +Figure 4-3 Process image from Photomap a in-place +Resource destruction +When a destroy request is received the resource-id is immediately disassociated from the resource and +the resource's reference count(s) is(are) decremented. For each reference count that goes to zero, the +associated resources are freed (e.g. memory or colors). +Synchronizing resource access +If multiple Photoflos reference the same resource, the client must synchronize access to the resource +(e.g. Await completion of the Photoflo writing the resource before beginning execution of a Photoflo +reading from the resource). Core resources can be volatile, requiring the client to maintain the data +integrity of the resource while the Photoflo is active. +Capability Acquisition +QueryImageExtension +XieReqQueryImageExtension +client-major-version CARD16 +client-minor-version CARD16 +* +server-major-version CARD16 +server-minor-version CARD16 +service-class XieTypServiceClass +alignment XieTypAlignment +unconstrained-mantissa CARD16 +unconstrained-max-exp INT32 +unconstrained-min-exp INT32 +constrained-levels LISTofCARD32 +Errors: Alloc +Events: none +QueryImageExtension returns information about the XIE server's capabilities. Each client should use +QueryImageExtension to establish version compatibility between client and server prior to making any +other XIE request. If a client fails to first establish the desired version using QueryImageExtension, the +behavior of other requests is undefined (which generally means that the server will use the version +number of its own choice). +Client-major-version and client-minor-version specify which version of the XIE protocol the client +would like to use. If the client can support multiple versions, the highest version should be given. +The server-major-version and server-minor-version specify the version of the XIE protocol that the +server expects from the client. If the server supports the version requested by the client, this version +number will be returned. If the client has requested a higher version than is supported by the server, +the server's highest version will be returned. Otherwise, if the client has requested a lower version than +is supported by the server, the server's lowest version will be returned. It is the client's responsibility to +decide whether or not it can match the server's version of the protocol. +Service-class specifies the ServiceClass supported by the XIE server . Alignment specifies the image +data alignment restrictions of the server (i.e. the alignment of pixels and scanlines). +The following parameters convey the approximate range and granularity of Unconstrained data in the +XIE server. For servers that represent Unconstrained data using floating point, unconstrained- +mantissa returns the number of bits in the server's floating point format (including the sign bit). If the +server uses fixed point, unconstrained-mantissa is 0. Unconstrained-max-exp returns the largest value +n such that 2n - 1 is representable in the server's Unconstrained data format. Unconstrained-min-exp +returns the smallest (most negative) value n such that 2n is representable in the server's Unconstrained +data format. +Constrained-levels provides a hint about how the XIE server might process Constrained data most +efficiently. Constrained-levels returns a list of levels that are recommended for Constrained data by +the server. (a value of 0 means 232 levels). +Error Cause +Alloc insufficient resources + + +Technique Acquisition +QueryTechniques +XieReqQueryTechniques +technique-group XieTypTechniqueGroup +* +technique-information ListofXieTypTechniqueRec +Errors: Alloc, Value +Events: none +QueryTechniques returns information about the standard and private techniques that are supported by +the server. The server may be queried for All techniques, all Default techniques, or a group of +techniques that are functionally similar (e.g. all Geometry techniques). +Technique-group specifies the group of techniques for which the server is to return information. +Technique-information is a list of TechniqueRec entries which are returned in arbitrary order. Each +entry contains the following information: +needs-parameters if true, indicates that the technique requires additional parameters; if +false, the technique takes no parameters, or it has parameters that are +optional. If parameters are optional, they must be totally omitted, or +they must all be supplied. +group identifies which group the technique belongs to. +number the numeric identifier assigned to the technique (MS bit is zero for +standard techniques, or one for private techniques). +speed the server's assessment of the speed of this technique relative to other +techniques in the same group (0 :== slowest, 255 :== fastest). +name the XIE compliant technique name string of the form: + or +__ +The technique number is supplied to pipeline elements to specify a desired algorithm or technique. +While numbers for standard techniques can be hard-coded (e.g. defined in an include file), numbers for +private techniques must be obtained using the QueryTechniques protocol request prior to their use. +Error Cause +Alloc insufficient resources +Value unknown technique-group +A complete description of each technique and its parameters is given in Appendix A. A summary of standard +techniques itemized by service class can be found in Appendix B. Numbers assigned to standard techniques are encoded +in Appendix C. + + +ColorList +CreateColorList +XieReqCreateColorList +color-list XieTypColorList +Errors: Alloc, IDChoice +Events: none +CreateColorList creates an unpopulated server resource which can be used to store the list of colors +allocated by a ConvertToIndex element. The COLORMAP allocations that are recorded in a ColorList +belong to the client that executed the Photoflo that populated the resource (this is not necessarily the +same client that created the ColorList). A ColorList cannot be the target of more than one Active +Photoflo at a time. +Color-list is the client supplied ColorList identifier to be assigned to this resource. +Color-list is populated (or re-populated) with new COLORMAP allocations via a ConvertToIndex +element as the Photoflo executes. The contents of color-list may be queried using QueryColorList. +The client may explicitly purge all allocated cells from color-list using PurgeColorList. The client may +cause an implicit deallocation of cells from color-list by making it the target of a Photoflo and com- +mencing its execution. An implicit purge also takes place if the COLORMAP referenced by color-list is +freed or if the client that owns the cells exits (i.e. the client that populated color-list). +Color-list can be destroyed using DestroyColorList. +Error Cause +Alloc insufficient resources +IDChoice invalid color-list + + +DestroyColorList +XieReqDestroyColorList +color-list XieTypColorList +Errors: ColorList +Events: none +DestroyColorList disassociates the resource-id from color-list and decrements its reference count. If +there are no other references, it frees colors held in color-list, and then destroys the ColorList identi- +fied by color-list. +Error Cause +ColorList invalid color-list + + +PurgeColorList +XieReqPurgeColorList +color-list XieTypColorList +Errors: Access, ColorList +Events: none +PurgeColorList frees the colors from the ColorList identified by color-list. +Error Cause +Access attempt to purge colors when color-list is being written by a Photoflo +ColorList invalid color-list + + +QueryColorList +XieReqQueryColorList +color-list XieTypColorList +* +colormap COLORMAP +colors LISTofCARD32 +Errors: Alloc, ColorList +Events: none +QueryColorList returns a list of colors allocated by a ConvertToIndex element. +Color-list is the ColorList resource to be queried. +Colormap is the COLORMAP from which the colors were allocated. Colors is the list of allocated +COLORMAP indices. +When there are no colors in color-list, the value zero (0) is returned for colormap, and the list of colors +is of length zero. +Error Cause +Alloc insufficient resources +ColorList invalid color-list +Notes: +* The COLORMAP was originally supplied by the client as a ConvertToIndex parameter. +* The returned colors are owned by the server, and therefore, should not be freed via core X protocol requests (e.g. +FreeColors) +* The allocated colors can be freed by: + - issuing a PurgeColorList or DestroyColorList request, + - commencing execution of a Photoflo that targets color-list, + - freeing colormap, + - shutting down the client that populated color-list. + + +LUT +CreateLUT +XieReqCreateLUT +lut XieTypLUT +Errors: Alloc, IDChoice +Events: none +CreateLUT creates a server resource which is used as a lookup table by the Point element. A lookup +table consists of one or three single dimension arrays, each long enough to contain an entry for all +possible pixels values in the image data to which the Point element will be applied. +Lut is the client supplied LUT identifier to be assigned to this resource. +The LUT is populated (or re-populated) with lookup table entries after the successful execution of a +Photoflo containing an ExportLUT element which targets lut. Lookup table data can be imported into a +Photoflo using an ImportLUT element. These data can be used by Point, and they can be exported to +the client with the aid of an ExportClientLUT element. +Lut can be destroyed using DestroyLUT. +Error Cause +Alloc insufficient resources +IDChoice invalid lut +A LUT can be populated with a simple ExecuteImmediate( ImportClientLUT, ExportLUT ) Photoflo. +PutClientData is then used to transport the lookup table entries. See ImportClientLUT and Point for further +information on LUTs + + +DestroyLUT +XieReqDestroyLUT +lut XieTypLUT +Errors: LUT +Events: none +DestroyLUT disassociates the resource-id from lut and decrements its reference count. If there are no +other references, it destroys the LUT identified by lut. +Error Cause +LUT invalid lut + + +Photomap +CreatePhotomap +XieReqCreatePhotomap +photomap XieTypPhotomap +Errors: Alloc, IDChoice +Events: none +Attribute Value +class undefined (see text) +type undefined (see text) +width undefined (see text) +height undefined (see text) +levels undefined (see text) +CreatePhotomap creates a server resource which is used to store image data. Photomap data may be +rendered for display or used as input to control or modify the rendition of another image. +Photomap is the client supplied Photomap identifier to be assigned to this resource. +Photomap attributes are defined when a Photoflo containing an ExportPhotomap element populates +photomap with data. +The Photomap is populated (or re-populated) with image data after the successful execution of a Pho- +toflo containing an ExportPhotomap element that targets photomap. Photomap data can be imported +into a Photoflo for rendition or control purposes using an ImportPhotomap element. It can also be +exported back to the client with the aid of an ExportClientPhoto element. Photomap attributes can be +queried using QueryPhotomap. Photomap can be destroyed using DestroyPhotomap. +Error Cause +Alloc insufficient resources +IDChoice invalid photomap +A Photomap can be populated with a simple ExecuteImmediate(ImportClientPhoto, ExportPhotomap) +Photoflo. PutClientData is then used to transport the image data. See ImportClientPhoto and ExportPhotomap +and their associated techniques for more information regarding the format of image data. +DestroyPhotomap +XieReqDestroyPhotomap +photomap XieTypPhotomap +Errors: Photomap +Events: none +DestroyPhotomap disassociates the resource-id from photomap and decrements its reference count. If +there are no other references, it destroys the Photomap identified by photomap. +Error Cause +Photomap invalid photomap +QueryPhotomap +XieReqQueryPhotomap +photomap XieTypPhotomap +* +populated BOOL +data-type XieTypDataType +data-class XieTypDataClass +width XieTypTripletofCARD32 +height XieTypTripletofCARD32 +levels XieTypLevels +decode XieTypDecodeTechnique +Errors: Alloc, Photomap +Events: none +QueryPhotomap returns the queriable attributes of a Photomap. +Photomap is the Photomap to be queried. +Populated is a Boolean that indicates that photomap has been populated with attributes and data. If +populated is false, all remaining fields contain zeros. Data-type shows whether the number of quan- +tization levels is valid (Constrained) or unknown (Unconstrained). Data-class is the class of image +data (i.e. SingleBand or TripleBand). Width and height are the dimensions of the image data in pixels +(per band). Levels is the potential dynamic range, or number of quantization levels (per band). Decode +is the DecodeTechnique that will be required to interpret or decompress the data. +If data-type is Unconstrained, the returned values for levels are zeros. If data-class is SingleBand, +width, height, and levels for unused bands are returned as zeros. +Error Cause +FloAlloc insufficient resources +Photomap invalid photomap + + +ROI +CreateROI +XieReqCreateROI +roi XieTypROI +Errors: Alloc, IDChoice +Events: none +CreateROI creates a server ROI (Rectangles-Of-Interest) resource. A ROI resource may be imported +into a Photoflo and used in conjunction with a ProcessDomain specification to restrict processing to a +subset of image data. The ROI, when populated, will contain a list-of-rectangles (of type Rectangle). +Roi is the client supplied ROI identifier to be assigned to this resource. +The ROI is populated (or re-populated) with a list-of-rectangles after the successful execution of a +Photoflo containing an ExportROI element which targets roi. An ROI resource does not have any +queriable attributes. +ROI data can be imported into a Photoflo using an ImportROI element. This data, which is used by +several of the PhotoElements defined in chapters 7 and 8, can also be exported back to the client with +the aid of an ExportClientROI element. +Roi can be destroyed using DestroyROI. +Error Cause +Alloc insufficient resources +IDChoice invalid roi +An ROI can be populated with a simple ExecuteImmediate ( ImportClientROI, ExportROI ) Photoflo. +PutClientData is then used to transport the list-of-rectangles. +If the client uses ExportClientROI to retrieve a list-of-rectangles from the server, the number of rectangles and the +content of the list that is returned may differ from original list that was obtained from the client, but its contents will +be logically equivalent. + + +DestroyROI +XieReqDestroyROI +roi XieTypROI +Errors: ROI +Events: none +DestroyROI disassociates the resource-id from roi and decrements its reference count. If there are no +other references, it destroys the ROI identified by roi. +Error Cause +ROI invalid roi + + + ServiceClasses defined in this document include: Full XIE and DIS. + + +Resources 4-10 + + +5 +Pipelined Processing +What is a Photoflo? +A Photoflo is a directed acyclic graph. Each node has zero or more input connections, and zero or one +output connection. A node specifies the source for an input by identifying another upstream node. A +node's output connection can be used as a source for any number of downstream input connections. A +Photoflo is permitted to have taps and multiple final destinations. +The protocol representation of a Photoflo is a list of elements. Since the entire list is sent to the server +as a single protocol request, the total length of the list, including its protocol header, must fit within a +maximum size protocol message (see, maximum-request-length, established by X11 connection setup). +Each element of the Photoflo is identified by its position in the list. This position, or index, is called a +Phototag. The first element in the list is index one (1). The order of elements in the list does not have to +match the Photoflo topology because there is no implicit coupling of output N to input N+1. The +source for each element's input connections are explicitly specified using the Phototags of upstream +elements. +There are three types of elements. Import elements bring data into the Photoflo from external resources +or the client, have one output connection, and no input connections. Process elements perform some +operation on the data (e.g. convolution), have one or more input connections, and exactly one output +connection. Export elements emit data from the Photoflo to external resources or to the client, have one +input connection, and no output connections. A Photoflo should include at least one import element +and one export element to be useful. + + +Import +Process +Export + +Number of input connections +none +one or more +one + +Number of output connections +one +one +none + + + + + + + +Figure 5-1 Photoflo element input and output connections +All data external to the Photoflo (internal server data and client data), are accessed through import and +export elements. Therefore, for purposes of Photoflo definition and modification, X and XIE resource- +ids are considered element parameters rather than element sources or destinations. No element is +permitted to reference a Photoflo for any reason. It is also an error to specify an export element as an +input to any element. +Figure 5-2 illustrates several capabilities of Photoflo construction. An RGB image is imported from the +client. This image is saved in a Photomap for later re-use. The blue band is selected and translated (to +correct registration). This result is exported back to the client. A BandCombine element associates a +single band imported from a Photomap (the red band), with the green band selected from the initial RGB +image, and the re-registered blue band. The combined image is then converted to index data and +exported to a PIXMAP and to a WINDOW. The color allocation results are saved in a ColorList. + +Figure 5-2 Example Photoflo +Two kinds of Photoflos +There are stored Photoflos and immediate Photoflos. Stored Photoflos persist beyond execu- +tion and may be modified or totally redefined prior to subsequent executions. Immediate Photoflos +are ephemeral - a single protocol request defines and begins its execution, then it is automatically +destroyed upon completion. Services common to both types of Photoflos are: +* event notification +* error notification +* put data: send data from the client into a Photoflo +* get data: return data exported from a Photoflo back to the client +* query: return information about the Photoflo +* await: block future client requests until the Photoflo completes +* abort: terminate Photoflo execution prematurely +Multi-client Photoflos +A stored Photoflo can be executed by a client other than the client that created it. It is also possible +that the Photoflo may reference resources that belong to other clients, and data may be supplied and +retrieved by various clients. The following rules apply when multiple clients are involved in the execu- +tion of a Photoflo: +* errors that stem from executing Photoflo elements are sent to the client executing the Photoflo, +* errors that stem from executing client data put or get requests go to the client executing the request, +* colors recorded in a ColorList resource belong to the client executing the Photoflo, +* PhotofloDone events are sent to the client executing the Photoflo, +* multiple clients can Await completion of a given Photoflo. +Photoflo States +Stored Photoflos enter the Inactive state upon creation and transition to the Active state when exe- +cution is requested. Immediate Photoflos are both created and made Active by the execute request. +A Photoflo remains Active until: all ImportClient elements have received a final flag, all export +elements have finished their task, and all data exported for the client have been retrieved, or an error +prevents further progress, or the client issues an Abort request. After execution stored Photoflos +return to the Inactive state, whereas immediate Photoflos are destroyed (become Nonexistent). The +client may destroy a stored Photoflo at any time. + Stored Photoflo Immediate Photoflo + +Figure 5-3 Photoflo states +Flo'ing Data to a Resource +Besides image rendition and display, immediate or stored Photoflos are also used to populate XIE +resources with data and attributes. Some form of processing may be applied to the data, but in the +simplest case, a two element import/export Photoflo is generally sufficient. +Also all types of ephemeral client data may be imported and used directly by a Photoflo, without the +necessity of first storing it in an XIE resource. For example, simple transport of an image (compressed +or uncompressed) to a WINDOW is expected. +Import element Export element purpose +ImportClientPhoto ExportPhotomap populate a Photomap resource +ImportClientLUT ExportLUT populate a LUT resource (lookup table) +ImportClientROI ExportROI populate a ROI resource (list-of-rectangles) +ImportClientPhoto ExportDrawablePlane display a bitonal image in a WINDOW +ImportClientPhoto ExportDrawable display a COLORMAP index image in a WINDOW +ImportPhotomap ExportDrawablePlane copy an existing bitonal image to a PIXMAP +Table 5-1 Examples of two element Photoflo usage +Name space +For requests that only apply to stored Photoflos (Create, Modify, Redefine, Execute, and Destroy), +the Photoflo is identified solely by its resource-id. For all other requests, events, and errors that ref- +erence a Photoflo, the Photoflo is identified using type Executable, which is a tupple identifying the +name-space and flo-id of the Photoflo. +Name-space for stored Photoflos is always ServerIDSpace (the value zero), and flo-id is the +Photoflo's resource-id. +Name-space for immediate Photoflos is a Photospace resource-id, and flo-id is a thirty-two (32) bit +value that uniquely identifies the instance of this Photoflo. +CreatePhotospace +XieReqCreatePhotospace +name-space XieTypPhotospace +Errors: Alloc, IDChoice +Events: none +CreatePhotospace defines a name-space in which immediate Photoflos may be executed. Any client +that needs to instantiate immediate Photoflos must create at least one Photospace. +Name-space is the resource-id for a new Photospace that can be used to accommodate immediate +Photoflos instantiated by this client. +Error Cause +Alloc insufficient resources +IDChoice invalid name-space +DestroyPhotospace +XieReqDestroyPhotospace +name-space XieTypPhotospace +Errors: Photospace +Events: none +DestroyPhotospace will destroy a Photospace. Prior to destroying the Photospace, all Photoflos that are +currently Active in the Photospace will be aborted, exported data pending client retrieval will be freed, +and the Photoflos will be destroyed. +Name-space is the Photospace to be destroyed. +Error Cause +Photospace invalid name-space + + +Immediate Photoflos +ExecuteImmediate +XieReqExecuteImmediate +instance XieTypExecutable +notify BOOL +element-list LISTofXieTypPhotoElement +Errors: FloAlloc, FloID, FloElement, Flo . . . +Events: PhotofloDone +ExecuteImmediate defines and begins execution of an immediate Photoflo. Execution is asyn- +chronous. The Photoflo is destroyed after execution completes and all data exported for the client have +been retrieved. It is legal to have multiple unique instances of immediate Photoflos (and stored +Photoflos) Active concurrently. +Instance specifies the Photospace/flo-id tupple by which this Photoflo will be identified in other re- +quests, events, or errors. Notify specifies whether a PhotofloDone event should be sent upon comple- +tion. Element-list defines the import, process, and export elements to be executed. +If any clients have blocked themselves during the execution of the Photoflo (see Await), they will be- +come unblocked when photoflo's state changes from Active to Nonexistent. If notify is true, a Photo- +floDone event is also generated by this transition. Finally, this instance is destroyed. +Error Cause +FloAlloc insufficient resources +FloID invalid Executable instance +FloElement invalid element-type(s) in element-list +Flo . . . see element descriptions for errors detected by elements in element-list + +See ExecutePhotoflo for a general outline of the execution phases of a Photoflo. + + +Stored Photoflos +The following requests are used to: create, modify, redefine, execute, and destroy stored Photoflos. +In these requests the Photoflo instance is identified only by its resource-id. However, errors and events +generated due to these requests identify the instance using type Executable (the name-space is +ServerIDSpace and the flo-id is the Photoflo's resource-id). +CreatePhotoflo +XieReqCreatePhotoflo +photoflo XieTypPhotoflo +element-list LISTofXieTypPhotoElement +Errors: Alloc, IDChoice, FloAlloc, FloElement, Flo . . . +Events: none +CreatePhotoflo creates a stored Photoflo resource, defines its complete contents, and sets it in the +Inactive state. +Photoflo is a new resource-id by which this Photoflo will be identified in other requests, events, or er- +rors. Element-list defines the import, process, and export elements to be stored for execution. +Although resources and parameters are specified at creation, no action is taken to validate them at that +time. CreatePhotoflo will only store the Photoflo's definition and parameter validation is delayed until +an execute request is received. +Error Cause +Alloc insufficient resources for photoflo +IDChoice invalid photoflo +FloAlloc insufficient resources for element-list +FloElement invalid element-type(s) in element-list +Flo . . . see element descriptions for errors detected by elements in element-list +DestroyPhotoflo +XieReqDestroyPhotoflo +photoflo XieTypPhotoflo +Errors: Photoflo +Events: none +DestroyPhotoflo will destroy a stored Photoflo. If photoflo was Active, it is aborted and all exported +data that are pending client retrieval are freed prior to destroying photoflo. +Photoflo is the Photoflo to be destroyed. +Error Cause +Photoflo invalid photoflo +See also Abort, which terminates a Photoflo's execution without destroying it. +ExecutePhotoflo +XieReqExecutePhotoflo +photoflo XieTypPhotoflo +notify BOOL +Errors: Photoflo, FloAccess, FloAlloc +Events: PhotofloDone +ExecutePhotoflo changes a stored Photoflo to the Active state. Execution is asynchronous. The +Photoflo returns to the Inactive state when execution completes and all data exported for the client have +been retrieved. It is legal to have multiple stored Photoflos (and immediate Photoflos) Active +concurrently. +Photoflo is the Photoflo to be executed. Notify specifies whether a PhotofloDone event should be sent +upon completion. +Conceptually, Photoflo execution is broken into at least three phases : +1. Initialization: +a. the Photoflo state is set Active, +b. bind external inputs (XIE reference counts are incremented) +c. imported attributes are propagated downstream +d. attributes and element parameter values are validated +e. lookup external destinations +f. create receptors for data to be exported to XIE resources2 +2. Execution: +a. data from server resources, if any, is pulled into the Photoflo +b. data from the client, if any, is pushed into the Photoflo (PutClientData) +c. processed data is exported to server resources as required2 +d. processed data is made available for client retrieval (GetClientData) +3. Completion: +a. unbind external inputs +b. join exported data with associated XIE resources2 and unbind remaining resources +c. report any error that occurred +d. if notify is true, send a PhotofloDone event +e. if Await has been requested, un-block client execution +f. the Photoflo state is set Inactive +If an error occurs during any phase, the client is notified and the Photoflo is terminated. Other events +can be sent by individual elements, as specified in their descriptions. +Error Cause +Photoflo invalid photoflo +FloAccess attempt to execute photoflo when it is already Active +FloAlloc insufficient resources +Flo . . . see element descriptions for errors detected by photoflo elements +ModifyPhotoflo +XieReqModifyPhotoflo +photoflo XieTypPhotoflo +start XieTypPhototag +element-list LISTofXieTypPhotoElement +Errors: Photoflo, FloAlloc, FloElement, FloSource, Flo . . . +Events: none +ModifyPhotoflo allows element parameters of a stored Photoflo to be modified. +Photoflo is the Photoflo to be modified. Start specifies the Phototag where element replacement is to +begin. Element-list is a sequential list of elements which will replace existing elements. +ModifyPhotoflo allows parameter modification only. No topological changes are allowed. Elements +cannot be deleted, inserted, or appended. +Error Cause +Photoflo invalid photoflo +FloAccess attempt to change photoflo while it is Active +FloAlloc insufficient resources +FloElement attempt to change element-type(s) in element-list +attempt to append additional element(s) to photoflo +FloSource invalid start +attempt to change Phototag input connections in element-list +Flo . . . see element descriptions for errors detected by elements in element-list +Multiple ModifyPhotoflo requests can be sent in order to edit individual elements, but, for greater efficiency and +particularly when repetitive modify/execute requests are expected, elements can be grouped such that a single +ModifyPhotoflo can perform multiple element modifications. +RedefinePhotoflo +XieReqRedefinePhotoflo +photoflo XieTypPhotoflo +element-list LISTofXieTypPhotoElement +Errors: FloAccess, Photoflo. FloAlloc, FloElement, Flo . . . +Events: none +RedefinePhotoflo allows all elements of a stored Photoflo to be removed and replaced with a new list. +There are no restrictions on changing element types, Phototag sources, or the list's size. +Photoflo is the Photoflo to be redefined. Element-list is a sequential list of elements which will replace +all existing elements. +Error Cause +Photoflo invalid photoflo +FloAccess attempt to change photoflo while it is Active +FloAlloc insufficient resources +FloElement invalid element-type(s) in element-list +Flo . . . see element descriptions for errors detected by elements in element-list +RedefinePhotoflo may be considered a hint that the new list of elements is in some way similar to those being +replaced. RedefinePhotoflo can also be used as a means to conserve resource-ids. +Sending Data to the Server +PutClientData +XieReqPutClientData +instance XieTypExecutable +element XieTypPhototag +final BOOL +band-number CARD8 +data XieTypDataStream +Errors: FloAlloc, FloAccess, FloID, FloElement, FloValue +Events: none +PutClientData sends a stream of data to an Active Photoflo. Since the complete data object may be +larger than can fit in a single protocol request, XIE allows the stream to be segmented; the last segment +is signaled with a final flag. +Instance and element identify the Photoflo and specific ImportClient element to receive the data. +Final specifies that this is the last (or only) segment of data to be sent. +If element is a band oriented element, band-number specifies which client band of data is being sent +(interleave and band-order specified for the ImportClient element or technique determine how cli- +ent bands are mapped to server bands). +Data is a counted list of bytes that comprises the data stream. The organization and contents of the +stream must match the parameters given to the ImportClient element or the results are undefined. +An arbitrary amount of image data can be sent per request, whereas for non-image data one or more +complete aggregates must be sent per request (e.g. one or more LUT array entries). +If too many data are sent (e.g. too many rectangles, or too many scanlines), the unwanted data are +discarded. It is an error, however, to send too few data prior to signaling final. +Error Cause +FloAlloc insufficient resources +FloAccess Executable instance not Active +FloID invalid Executable instance +FloElement invalid Phototag or element-type specified by element +FloValue invalid band-number +for non-image data, data contains a partial aggregate +All types of client data (list-of-rectangles, lookup tables, and images) are transported to the server using +PutClientData. Tiled images can be transported using multiple ImportClientPhoto elements, which in turn feed a +PasteUp element. + + +Retrieving Data from the Server +GetClientData +XieReqGetClientData +instance XieTypExecutable +element XieTypPhototag +max-bytes CARD32 +terminate BOOL +band-number CARD8 +* +new-state XieTypExportState +data XieTypDataStream +Errors: FloAlloc, FloAccess, FloID, FloElement, FloValue +Events: none +GetClientData retrieves data from an ExportClient element within an Active Photoflo. Data are +returned in a contiguous read-once byte stream, which can be requested in segments that are limited in +size by the amount the client desires or the amount available. The format of the data depends on the pa- +rameters given to the ExportClient element from which the data are requested. +Instance and element identify the Photoflo and specific ExportClient element from which to re- +trieve data. Max-bytes specifies the maximum number of data bytes that can be sent to the client. +Terminate is a Boolean that can be used to indicate that no more data are wanted after this request has +been satisfied. Band-number specifies which client band is to be retrieved (interleave and band-order +parameters specified for the ExportClient element technique determine how server bands are +mapped to client bands). +New-state indicates the data availability status of the ExportClient element after satisfying the cur- +rent request. Data is the counted list of bytes that is returned. +If terminate is true, new-state will be ExportDone (the ExportClient element will discard any +remaining data and stop producing additional data). +If new-state is ExportEmpty and notify (for the ExportClient element) was specified as NewData, +another ExportAvailable event will be sent when additional data become availabile. +If the request is sent to an ExportClient element that either: does not have any data, was termi- +nated by a previous GetClientData request, or has already returned all its data (ExportDone sent), the +request will return a zero length data stream. +Image data are always retrieved from the server as a byte stream, whereas non-image data are always +returned by the server as one or more complete aggregates (i.e. max-bytes is effectively rounded down +by the server to the match the nearest aggregate size). + +Error Cause +FloAlloc insufficient resources +FloAccess Executable instance not Active +FloID invalid Executable instance +FloElement invalid Phototag or element-type specified by element +FloValue invalid band-number +Servers are required to buffer a non-zero amount of data per ExportClient element. Beyond that point execution +may be suspended until the client retrieves sufficient data. +Terminate may be used to prematurely terminate output from an ExportClient element. If terminate is not used, +all data produced by the ExportClient element must be retrieved before the Photoflo can leave the Active state. + + +Status +QueryPhotoflo +XieReqQueryPhotoflo +instance XieTypExecutable +* +state XieTypPhotofloState +data-expected LISTofXieTypPhototag +data-available LISTofXieTypPhototag +Errors: FloAlloc +Events: none +QueryPhotoflo will return the current status of a Photoflo. +Instance identifies the Photoflo that is being queried. +State indicates the state of the Photoflo. Data-expected is a list of ImportClient elements that are +expecting data from the protocol stream. Data-available is a list of ExportClient elements from +which data for the protocol stream are available. Either or both of these lists may be of length zero. +Specifying an unknown or invalid instance will result in a reply state of nonexistent and zero length +data-expected and data-available lists. +Error Cause +FloAlloc insufficient resources + + +Synchronization +Await +XieReqAwait +instance XieTypExecutable +Errors: FloAlloc +Events: none +Await blocks all further requests for this client connection from being honored by the server while the +Photoflo is Active. When the Photoflo transitions from the Active state, blocked requests are allowed +to be processed in the order received. +Instance identifies the Active Photoflo which is to block requests from the client issuing the Await. +If instance is invalid or the Photoflo is not Active no action is taken; it is not an error, and the client is +not blocked. +Error Cause +FloAlloc insufficient resources +If a Photoflo has no ExportClient elements, the client can call Await. If a Photoflo has exactly one +ExportClient element, the client can just read bytes or be event-driven. If a Photoflo has multiple +ExportClient elements, the client should be event-driven. +Warning: calling Await before sending all import data (including a final flag) or before retrieving all export +data, will block the client from sending or retrieving the remaining data. This will also prevent completion +of the Photoflo and prevent any and all protocol requests from this client from being honored. This +deadlock can only be broken by another client completing or aborting the Photoflo (to release the Await), +or by breaking the client connection. + +Termination +Abort +XieReqAbort +instance XieTypExecutable +Errors: none +Events: none +Abort will prematurely terminate execution of a Photoflo. +Instance identifies the Photoflo which is to be aborted. +Any output from the Photoflo that is pending client retrieval is freed. If instance is a stored Photoflo +it will return to the Inactive state. Immediate Photoflos are destroyed. +If instance is invalid or the Photoflo is not Active no action is taken; it is not an error, and nothing is +destroyed. + + Optimization, an additional phase, would be roughly associated with the initialization phase. + For LUT, Photomap, and ROI resources refer to page 4-1 Binding Resources to Photoflos. + Completion is contingent upon all such data being retrieved by the client. + + +Pipelined Processing 5-4 + + +6 +Import Elements +Overview +Element categories +Import elements are used to bring external image data into a Photoflo. Import elements have no Pho- +totag sources and have one output connection. There are two types of import elements: +* ImportResource elements obtain data from a server resource (DRAWABLE, LUT, Photomap, or ROI). +* ImportClient elements require data from the client. This data is transported to the server via the +PutClientData protocol request. +Multi-source images +Multiple source images (e.g. tiled images, multi-client transport, ...) require a separate import element to +describe each segment of the image. The composite image can then be assembled using process ele- +ments (e.g. BandCombine, Blend, and PasteUp). +Events generated +Certain import elements can generate events to notify the client about abnormal behavior. Two such +events are defined: +* DecodeNotify notifies the client when anomalies are encountered while decoding a compressed image. +It can also be returned if less data are sent than are required to complete an uncom- +pressed image. +* ImportObscured notifies the client that one or more regions to be imported from a WINDOW are +obscured and unavailable from BACKINGSTORE. +Import from Client +ImportClient elements require data from the client. Element parameters fully specify all the at- +tributes of the client data and describe the format or organization the data will have as it is transported +through the protocol stream. Data is sent to the ImportClient element via the PutClientData +protocol request after the Photoflo becomes Active. + + +ImportClientLUT +XieFloImportClientLUT +class XieTypDataClass +band-order XieTypOrientation +length XieTypTripletofCARD32 +levels XieTypLevels +Errors: FloAlloc, FloMatch, FloValue +Events: none +ImportClientLUT accepts lookup table data from the protocol stream. The transport of data through +the protocol stream is accomplished using PutClientData. These data are accepted by the Point, Ex- +portLUT, and ExportClientLUT elements. +Class indicates the number of lookup arrays to expect. Length specifies the number of entries per array. +Levels is the number of quantization levels represented per array. Band-order declares the order of +TripleBand arrays, or the order in which pixels from a TripleBand image should be combined to form +indices for a SingleBand array . +The length of each array should match the number of source image levels that will be re-mapped +through the array. When a TripleBand image is to be re-mapped through a SingleBand array, the +length of the array should match the product of the source image levels of all three bands1. Table 6-1 +summarizes the class of output data to expect from Point, based on the class of LUT and the class of +image provided to Point. +Table 6-1 Relationship between LUT class and image class +LUT class +Source image: SingleBand +Source image: TripleBand + +SingleBand +( 1 array ) +Output image: SingleBand +the single image band is re- +mapped through the single array +Usage examples: +achromatic --> achromatic +achromatic --> index +Output image: SingleBand +pixels from each image band are combined1 and +then re-mapped through the single array +Usage examples: +trichromatic --> index +trichromatic --> achromatic + +TripleBand +( 3 arrays ) +Output image: TripleBand +the single image band is re- +mapped through each array sepa- +rately +Usage examples: +achromatic --> false-color +index----------> trichromatic +Output image: TripleBand +each image band is re-mapped through the +corresponding array +Usage examples: +trichromatic --> trichromatic + +The size of each array entry is either 1, 2, or 4 bytes; the smallest size into which the output quantization +levels can be stored. When array entries require multiple bytes, the byte order per entry is determined +in the same manner as other numeric data: it is the byte orientation established at core X connection +setup time. +Error Cause +FloAlloc insufficient resources +FloMatch levels is incompatible with the server's depth handling capabilities +FloValue invalid class or band-order +When the client targets data at ImportClientLUT, one or more complete array entries must be sent per protocol +request (see PutClientData). +ImportClientPhoto +XieFloImportClientPhoto +notify BOOL +class XieTypDataClass +width XieTypTripletofCARD32 +height XieTypTripletofCARD32 +levels XieTypLevels +decode XieTypDecodeTechnique +decode-params +Errors: FloAlloc, FloMatch, FloValue, FloTechnique +Events: DecodeNotify +Attribute Value +class class of imported image +type Constrained +width width of imported image (in pixels) +height height of imported image (in pixels) +levels levels of imported image +ImportClientPhoto accepts image data from the protocol stream. This data may be processed for +display or used as ProcessDomain data. The attributes and organization of the expected data stream +are fully specified by the parameters. The actual transport of image data through the protocol stream is +requested using the PutClientData protocol request. +Notify enables DecodeNotify events to be sent if anomalies are encountered while interpreting the +imported image data (see DecodeNotify and DecodeTechnique descriptions). Class specifies the +DataClass of the data being imported. Width and height are the per-band image dimensions in pixels. +Levels is the number of quantization levels per band. Decode is the DecodeTechnique that will be +required to decompress the image. Decode-params is the list of additional parameters required by +decode. +Only Constrained data can be sent through the protocol stream, therefore, levels must be valid. +Error Cause +FloAlloc insufficient resources +FloMatch levels is incompatible with the server's depth handling capabilities +FloValue invalid width, height, levels (zero) +invalid class +FloTechnique invalid decode technique or decode-params +If the imported client data is compressed, ImportClientPhoto is generally responsible for decoding the data prior to +forwarding the data to downstream elements. An exception to this would be when an export element is a direct +recipient of the data and the element desires data that are encoded using the same technique as decode. +If individual bands of TripleBand data have different widths or heights (e.g. down-sampled YCbCr data), it is generally +the client's responsibility to make inter-band dimensions match to render the image (e.g. use Geometry with +appropriate band-mask and sample technique). The JPEGBaseline technique that is described in Appendix A, includes +a Boolean flag that allows an image that is interleaved BandByPixel to be up-sampled as part of the decode function. +All data and a final indication must be sent for each band before the Photoflo can leave the Active state. The input +data are sent by the client using the PutClientData protocol request. If a subset of client bands are desired, the bands +should be imported as individual SingleBand images. + + +ImportClientROI +XieFloImportClientROI +rectangles CARD32 +Errors: FloAlloc +Events: none +ImportClientROI accepts a list-of-rectangles from the protocol stream. These data can be used as +input to a ProcessDomain or an ExportROI or ExportClientROI element. The actual transport of data +through the protocol stream is accomplished using the PutClientData protocol request (the band- +number parameter of PutClientData is ignored). +Rectangles specifies the number of rectangles expected. +Each rectangle is described using numeric values (see Rectangle), as such, the byte order of such data +is determined at core protocol connection setup time. +Error Cause +FloAlloc insufficient resources +When the client targets data at ImportClientROI, one or more complete Rectangles must be sent per protocol +request (see PutClientData). + + +Import from Resource +ImportResource elements obtain data from server resources: core DRAWABLEs, and XIE LUT, Pho- +tomap, and ROI resources. +The attributes and data of XIE resources are bound to ImportResource elements when the Photoflo +becomes Active. The same resource may also be the target of an ExportResource element in the +same Photoflo. However, the association between the resource's identifier (XID) and the new attributes +and data does not occur until the Photoflo successfully completes (i.e. leaves the Active state). (See +Binding Resources to Photoflos in Chapter 4.) +ImportDrawable +XieFloImportDrawable +notify BOOL +drawable DRAWABLE +src-x INT16 +src-y INT16 +width CARD16 +height CARD16 +fill CARD32 +Errors: FloAlloc, FloDrawable, FloValue +Events: ImportObscured +Attribute Value +class SingleBand +type Constrained +width width +height height +levels 2depth (i.e. drawable depth) +ImportDrawable allows access to data existing in a DRAWABLE. This data may be processed for +display or, if drawable is a BITMAP, used as ProcessDomain data. +Notify enables ImportObscured events to be sent if data for one or more regions of a WINDOW are +obscured and unavailable from BACKINGSTORE (see ImportObscured). Drawable is the DRAWABLE +resource supplying the data. Src-x, src-y, width, and height specify the region of data to be imported +from drawable. Fill is the COLORMAP index to use for all regions that are obscured. +Error Cause +FloAlloc insufficient resources +FloDrawable invalid drawable +FloValue invalid region (src-x, src-y, width, height) +The data are imported as ZPixmap format COLORMAP indices (i.e. SingleBand index data). Index data are +appropriate for only a few process elements (e.g. where a nearest-neighbor technique is used). ConvertFromIndex +can be used to convert index data prior to feeding it to other process elements. Compare can also be used to produce +bitonal data from index data. + + +ImportDrawablePlane +XieFloImportDrawablePlane +notify BOOL +drawable DRAWABLE +src-x INT16 +src-y INT16 +width CARD16 +height CARD16 +fill CARD32 +bit-plane CARD32 +Errors: FloAlloc, FloDrawable, FloValue +Events: ImportObscured +Attribute Value +class SingleBand +type Constrained +width width +height height +levels 2 +ImportDrawablePlane allows access to a single plane of data existing in a DRAWABLE. This data may +be processed for display or used as ProcessDomain data. +Notify enables ImportObscured events to be sent if data for one or more regions of a WINDOW are +obscured and unavailable from BACKINGSTORE (see ImportObscured). Drawable is the DRAWABLE +resource supplying the data. Src-x, src-y, width, and height specify the region of data to be imported +from drawable. Fill is the value to substitute for all regions that are obscured. Bit-plane specifies the +plane to be imported from drawable. +Bit-plane must have exactly one bit set to one (1), and the value of bit-plane must be less than 2n, +where n is the depth of drawable. This single bit selects the corresponding bit to be extracted from +pixels within drawable. +Error Cause +FloAlloc insufficient resources +FloDrawable invalid drawable +FloValue invalid bit-plane or region (src-x, src-y, width, height) + + +ImportLUT +XieFloImportLUT +lut XieTypLUT +Errors: FloAlloc, FloAccess, FloLUT +Events: none +ImportLUT allows access to lookup table data existing in a LUT resource. These data are accepted by +the Point, ExportLUT, and ExportLUT elements. +Lut is the LUT resource supplying the lookup table. +Attributes of the lookup table data are inherited from lut. +Error Cause +FloAlloc insufficient resources +FloAccess attempting to import from lut before it has been populated +FloLUT invalid lut + + +ImportPhotomap +XieFloImportPhotomap +notify BOOL +photomap XieTypPhotomap +Errors: FloAlloc, FloAccess, FloPhotomap +Events: DecodeNotify +Attribute Value +class same as photomap +type same as photomap +width same as photomap +height same as photomap +levels same as photomap +ImportPhotomap allows access to image data existing in a Photomap. This data may be processed for +display or used as ProcessDomain data. +Notify enables DecodeNotify events to be sent if anomalies are encountered while decoding com- +pressed data (see DecodeNotify and the DecodeTechnique descriptions). Photomap is the Photomap +resource supplying image data. +Attributes of the source data are inherited from photomap. +Error Cause +FloAlloc insufficient resources +FloAccess attempting to import from photomap before it has been populated +FloPhotomap invalid photomap +If the data imported from photomap are compressed, ImportPhotomap is generally responsible for decoding the data +prior to forwarding the data to downstream elements. An exception to this would be when an export element is a direct +recipient of the data and the data are already encoded using the technique desired by the export element. +If individual bands of TripleBand, BandByPlane data have different widths or heights (e.g. down-sampled YCbCr data), +it is generally the client's responsibility to make inter-band dimensions match to render the image (e.g. use Geometry +with appropriate band-mask and sample technique). If ImportPhotomap's input data are TripleBand, BandByPixel, +the dimensions of the output bands will match even if the encoded input data are down-sampled. + + + +ImportROI +XieFloImportROI +roi XieTypROI +Errors: FloAlloc, FloAccess, FloROI +Events: none +ImportROI allows access to a list-of-rectangles existing in a ROI resource. This data may be refer- +enced by a ProcessDomain. +Roi is the ROI resource supplying the list-of-rectangles. +Error Cause +FloAlloc insufficient resources +FloAccess attempting to import from roi before it has been populated +FloROI invalid roi + + + + + + + + + + + + + + + + + + + + + + + +almost blank + + For SingleBand LUTs, Point combines TripleBand src pixel values to provide a compact array indexing scheme. +The algorithm is presented in Figure 7-4. + + +Import Elements 6-1 + + +7 +Process Elements +Overview +Process elements have one or more Phototag sources and have one output connection. Each process +element applies a specific operation to image data within an Active Photoflo. Some process elements +perform their operation on a single source of image data (e.g. Geometry). Others, operate on either a +pair of image sources or an image and a constant (e.g. Logical). BandCombine associates bands from +three SingleBand image sources to form a TripleBand image. PasteUp can combine multiple images +(tiles) to form a composite image. +The ConvertToIndex element can generate an event to notify the client about color allocation results. +A process element will not be involved in the execution of a Photoflo if there is no eventual consumer of +its output (i.e. no terminating export element). +Limiting the Process +Processing may be limited to a subset of the bands present and a subset of pixels within the processed +bands. Data falling outside the selection criteria are passed through unaffected by the element's proc- +ess. +Process Selected Bands +Some process elements accept a band-mask to restrict processing to a subset of the source data bands. +Only bands selected by the band-mask are subject to processing. Other bands present in the image are +passed through to the output. For example: a band-mask of 0012 indicates that only the least signifi- +cant band would be processed (see Orientation for a definition of band ordering). +Process Intersecting Pixels +Dyadic process elements can accept a pair of data sources. These sources are spatially registered at +their origins (upper left corners). Their class and type must match, but their dimensions (width and +height) need not match. The dimensions of the output are determined by src-1. Processing is spatially +restricted to the intersection of the sources on a per-band basis. Data from src-1 that do not intersect +with src-2 are passed through to the output. +Process Selected Pixels +Some process elements accept a processing domain (ProcessDomain) to restrict processing to a subset +of the source data pixels. The processing domain represents either a list-of-rectangles or a bi-level +SingleBand control-plane. +A processing domain contains an x,y coordinate pair to spatially position the overall processing do- +main relative to the origin of the source(s). It also contains a Phototag which references the import or +process element that supplies the processing domain data. The element referenced by the Phototag +may provide a: +* list-of-rectangles imported using ImportROI or ImportClientROI. Processing is restricted to the +intersection of the data source(s) and any rectangle within the list. +* control-plane imported using ImportDrawable, ImportDrawablePlane, ImportPhotomap, or +ImportClientPhoto; or the output of an upstream process element (e.g. Compare). +Processing is restricted to the intersect of the data source(s) and non-zero locations +within the control-plane. +Processing is not restricted if Phototag zero (0) is specified as the process domain's data source. + +Figure 7-1 Combining two sources using a control plane - Logical: Copy +Data Types +In XIE, an image consists of one or three arrays of pixels, each of which is measured in terms of its +width, height, and depth. Each array, which represents a chromatic band of image data, is dimensioned +independently. The depth component of each array is expressed in quantization levels, or, the potential +dynamic range of the pixels. All process elements within XIE are capable of operating on image data +that have a fixed number of quantization levels. These data are said to be Constrained, such that the +minimum possible intensity value of a pixel is zero (0), and the maximum possible intensity level is the +number of quantization levels minus one. +With the exception of operations that specifically change the number of quantization levels (e.g. Dither) +all other operations that are performed on Constrained data will maintain the levels attribute from input +to output. An operation that computes a negative pixel value will set the resulting pixel to zero. +Likewise, an operation that computes a pixel value that would exceed the levels attribute of the data, will +saturate the resulting pixel at its maximum allowable value (i.e. levels-1). This method of constraining +image data is equivalent to the HardClip Constrain technique. +For some operations (e.g. Arithmetic operations), it is desirable to allow pixel values to stray beyond +their Constrained values. Such data are said to be Unconstrained, and may contain negative values, +fractional values, or other values that might be beyond the normal display capabilities of a frame buffer. +Performing a sequence of image operations on Unconstrained image data allows the maximum degree of +precision to be maintained throughout the process (although there may be a cost in performance, +depending on the server's capabilities). Several XIE process elements are capable of operating on either +Constrained or Unconstrained data. These elements always output the same DataType as they are fed +at their inputs. An exception to this rule is that certain colorspace conversion techniques can accept +either DataType, but are only capable of outputting Unconstrained data. + +XIE provides a complementary pair of elements for converting image data between these two process- +ing styles. The Unconstrain element simply removes the normal levels restrictions from the data. The +Constrain element provides a means of bringing the data back into a Constrained range. A variety of +techniques are available for this purpose that allow the pixel values to be level-shifted, scaled, clipped, +rounded, etc. +Process Categories +* Area elements +- Convolve an area of input pixels is involved in producing each output pixel +(controlled by a convolution kernel) +* Format conversion elements +- ConvertFromIndex convert index data to achromatic or trichromatic data +- ConvertFromRGB convert RGB data to another trichromatic colorspace +- ConvertToIndex convert achromatic or trichromatic data to index data +- ConvertToRGB convert non-RGB trichromatic data to RGB data +* Dyadic elements: process either two images or an image and a constant +- Arithmetic an arithmetic operation is performed between two images or an image +and a constant +- Blend combine two images or an image and a constant +- Compare two images, or an image and a constant, are compared to generate a +Boolean bitmap result +- Logical perform logical bit-wise operations on an image, between two images, +or between an image and a constant +* Geometric elements +- Geometry general affine transform (provides: crop, mirror, scale, shear, rotate, +translate, and combinations thereof) +- PasteUp an N-input translate operation which reconstructs an image from +various source tiles +* Point elements +- Math apply a mathematical operation to each pixel +- Point re-map each pixel value through a lookup table +* Radiometric elements +- BandCombine merge three SingleBand images +- BandExtract extract SingleBand data from a trichromatic source +- BandSelect select a single band of data from a trichromatic source +- Constrain constrain an image to a fixed number of quantization levels +- Dither reduce image quantization levels through an area technique +- MatchHistogram transform an image to have a specific histogram shape +- Unconstrain remove the normal levels restrictions from the image data +Process Definitions +The complete list of process PhotoElements follows in alphabetical order. +Arithmetic +XieFloArithmetic +src-1 XieTypPhototag +src-2 XieTypPhototag +domain XieTypProcessDomain +constant XieTypConstant +operator XieTypArithmeticOp +band-mask CARD8 +Errors: FloAlloc, FloSource, FloDomain, FloMatch, FloOperator, FloValue +Events: none +Attribute Value +class same as src-1 +type same as src-1 +width same as src-1 +height same as src-1 +levels same as src-1 +Arithmetic produces output data by performing an addition, subtraction, minimum, or maximum op- +eration between two data sources or between a single data source and a constant. Furthermore, multipli- +cation, division, or gamma correction may by applied to a single data source. +When two sources are involved, src-1 and src-2 are the Phototags of the elements supplying source +data (constant is ignored). If the operation is to involve a constant, src-1 is one operand, src-2 must be +zero, and constant is used as the other operand. Domain may control the subset of source data that +will be operated upon. Operator is the arithmetic operation to be performed. Band-mask specifies +which bands are to be operated upon. +When two sources are involved, all attributes, other than width and height, must match; all output at- +tributes are inherited from src-1. +Pixel computations that would lead to errors, will yield valid server-dependent values (e.g. dividing by a +Constrained pixel value of zero might result in a value of levels-1) . Using band-mask to select source +data that have two (2) or less levels is not permitted. +Error Cause +FloAlloc insufficient resources +FloSource invalid src-1 or src-2 +src-2 has been specified with a monadic operator (e.g. Div or Gamma) +FloDomain invalid domain +FloMatch class, type, or levels differs between src-1 and src-2 +selected source data are bitonal (i.e. 2 or less levels) +FloOperator invalid operator + + +BandCombine +XieFloBandCombine +src-1 XieTypPhototag +src-2 XieTypPhototag +src-3 XieTypPhototag +Errors: FloAlloc, FloSource, FloMatch +Events: none +Attribute Value +class TripleBand +type same as src-1 +width same as srcs +height same as srcs +levels same as srcs +BandCombine merges three SingleBand data sources to produce a TripleBand result. +Src-1, src-2, and src-3 are the Phototags of the elements supplying source data. +All three sources must be of the same type, and each source must be SingleBand. Other attributes +which are taken from the individual sources may differ. The output will be TripleBand. +No subsetting by ProcessDomain is provided. +Error Cause +FloAlloc insufficient resources +FloSource invalid src-1, src-2, or src-3 +FloMatch a source has more than one band +type differs between sources + + +BandExtract +XieFloBandExtract +src XieTypPhototag +coefficients XieTypConstant +bias XieTypFloat +levels CARD32 +Errors: FloAlloc, FloSource, FloMatch +Events: none +Attribute Value +class SingleBand +type same as src +width same as src +height same as src +levels levels or unknown (see text) +BandExtract produces SingleBand output data from a TripleBand source by multiplying a pixel value +from each source band by its corresponding coefficient and then summing the results with the bias +value. +Src is the Phototag of the element supplying source data. Coefficients is a three (3) element array that +determines the proportion of each source band pixel that is used to form the output. The bias value is +added to each output pixel. Levels is used as the levels attribute of the output data if the src data are +Constrained, otherwise it is ignored. +The source data must be TripleBand, and all bands must have equal dimensions. The output data will +be SingleBand, with levels taken from the levels parameter, if type is Constrained. All other attributes +are inherited from src. +No subsetting by ProcessDomain is provided (the entire image is processed). +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloMatch src is not TripleBand +unequal inter-band dimensions (width or height) +BandExtract can be used to extract a band of luminance data from an RGB image. It can also be used to compute +COLORMAP indices in cases where the contents of the COLORMAP is well ordered (e.g. a Standard-COLORMAP or a +TrueColor visual). + + +BandSelect +XieFloBandSelect +src XieTypPhototag +band-number CARD8 +Errors: FloAlloc, FloSource, FloMatch, FloValue +Events: none +Attribute Value +class SingleBand +type same as src +width same as band selected from src +height same as band selected from src +levels same as band selected from src +BandSelect produces SingleBand output data by selecting a single band from a TripleBand source. +Src is the Phototag of the element supplying source data. Band-number specifies which src band is to +be selected to provide the output data. +No subsetting by ProcessDomain is provided. +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloMatch src is not TripleBand +FloValue invalid band-number + + +Blend +XieFloBlend +src-1 XieTypPhototag +src-2 XieTypPhototag +alpha XieTypPhototag +constant XieTypConstant +alpha-const XieTypConstant +domain XieTypProcessDomain +band-mask CARD8 +Errors: FloAlloc, FloSource, FloDomain, FloMatch, FloValue +Events: none +Attribute Value +class same as src-1 +type same as src-1 +width same as src-1 +height same as src-1 +levels same as src-1 +Blend produces output data from two data sources or a single data source and a constant. Each output +pixel is a percentage combination of the source values, as controlled by the alpha input or the alpha +constant. +When two sources are involved, src-1 and src-2 are the Phototags of the elements supplying source +data (constant is ignored). If the operation is to involve a constant, src-1 is one operand, src-2 must be +zero, and constant is used as the other operand. If alpha is non-zero, it controls the blend proportion +for each pixel that is processed, otherwise alpha-const provides this control. Domain may control the +subset of source data that will be operated upon. Band-mask specifies which bands are to be operated +upon. +When two sources are involved, all attributes, other that width and height, must match. If alpha is non- +zero, it must be a source of Constrained data. Using band-mask to select source data that have two (2) +or less levels is not permitted. +Within the intersection of the source(s) and domain, each output pixel is a blend of the corresponding +pixels from src-1 and src-2 (or src-1 pixels blended with constant). The degree of blend is determined +by the corresponding value taken from alpha or the value of alpha-const. If alpha is non-zero, the pro- +portion of blend is further scaled by alpha-const: + output = src-1 * (1 - alpha / alpha-const) + src-2 * (alpha / alpha-const) + (where alpha-const is greater than 0.0). +If alpha is zero: + output = src-1 * (1 - alpha-const) + src-2 * alpha-const + (where alpha-const is in the range [0.0, 1.0]). +Error Cause +FloAlloc insufficient resources +FloSource invalid src-1, src-2, or alpha +FloDomain invalid domain +FloMatch incompatible attributes between src-1 and src-2 +alpha is Unconstrained +selected source data are bitonal (i.e. 2 or less levels) +FloValue alpha is zero and alpha-const is outside the range [0.0, 1.0] +alpha is non-zero and alpha-const is zero or negative +Compare +XieFloCompare +src-1 XieTypPhototag +src-2 XieTypPhototag +domain XieTypProcessDomain +constant XieTypConstant +operator XieTypCompareOp +combine BOOL +band-mask CARD8 +Errors: FloAlloc, FloSource, FloDomain, FloMatch, FloOperator +Events: none +Attribute Value +class see text +type Constrained +width same as src-1 +height same as src-1 +levels 2 per band (see text) +Compare takes two data sources or a single data source and a constant and generates a Boolean bitmap +output which reflects the results of a point-wise comparison. The output data has a value of 1 wherever +the comparison is true, and a value of 0 everywhere else (i.e. comparison false or comparison not per- +formed). Compare may be requested on a per-band basis, or for all bands taken together. +When two sources are involved, src-1 and src-2 are the Phototags of the elements supplying source +data (constant is ignored). If the operation is to involve a constant, src-1 is one operand, src-2 must be +zero, and constant is used as the other operand. Domain may control the subset of source data that +will be compared. Operator is the logical predicate operator used in the comparison. Combine is a +Boolean which determines if the comparison should be done on a per-band basis, or on an all bands +basis. Band-mask specifies which bands are to be involved. +If combine is true or src-1 is SingleBand, the output data will form a single Boolean bitmap. If src-1 is +TripleBand and combine is false, the output data will yield three separate Boolean bitmaps (for this +case band-mask must specify all bands). +If src-1 is TripleBand and combine is true, only the EQ and NE operators are allowed; equality is +established for each band selected by band-mask, and then the result is logically ANDed to derive +equality (inequality is a logical NOT of this result). For this case, width and height must match for all +bands selected by band-mask. +combine +input class +band-mask +output class + +True +SingleBand +TripleBand +n/a +selected bands +SingleBand +SingleBand + +False +SingleBand +TripleBand +n/a +all bands +SingleBand +TripleBand + +Table 7-1 Compare parameter and DataClass dependencies +When two sources are involved, all attributes, other than width and height, must match. The com- +parison is performed over the intersect of the source(s) as restricted by domain. All points not com- +pared are given the value zero (0). +Error Cause +FloAlloc insufficient resources +FloSource invalid src-1 or src-2 +FloDomain invalid domain +FloOperator invalid operator +FloMatch class differs between src-1 and src-2 +invalid combination of operator and combine +TripleBand, and combine is false, and band-mask incomplete +Compare does not support inter-band distance metrics, therefore combined LT, LE, GT, and GE operators are not +supported. Clients may implement these using other elements in concert with Compare. +Typical uses for Compare include: creating data to be used as a control-plane for a ProcessDomain, and converting +index data into bitonal image data. + + +Constrain +XieFloConstrain +src XieTypPhototag +levels XieTypLevels +constrain XieTypConstrainTechnique +constrain-params +Errors: FloAlloc, FloSource, FloTechnique +Events: none +Attribute Value +class same as src +type Constrained +width same as src +height same as src +levels levels +Constrain applies a quantization model to the image data to convert the data to a fixed number of +quantization levels. Application of the quantization model may involve steps such as range shifting, +scaling, clipping, and rounding. +Src is the Phototag of the element supplying source data. Levels is the number of quantization levels +desired in the output data. Constrain specifies the ConstrainTechnique to be used when constraining +the data. Constrain-params is the list of additional parameters required by constrain. +If the input image is already Constrained the data will be re-Constrained. +No subsetting by band mask or ProcessDomain is provided (the entire image is Constrained). +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloTechnique invalid constrain technique or constrain-params + + +ConvertFromIndex +XieFloConvertFromIndex +src XieTypPhototag +colormap COLORMAP +class XieTypDataClass +precision CARD8 +Errors: FloAlloc, FloSource, FloColormap, FloMatch, FloValue +Events: none +Attribute Value +class class +type Constrained +width same as src +height same as src +levels 2precision (per band) +ConvertFromIndex converts COLORMAP index data into achromatic or trichromatic data. +Src is the Phototag of the element supplying source data. Colormap is the COLORMAP from which to +obtain the value for each output pixel. Class specifies the DataClass of the desired output data. +Precision specifies how many bits (most significant) are to be used from the red, green, and blue values +found in colormap. +If class is SingleBand and a trichromatic colormap is specified (StaticColor, PseudoColor, +TrueColor, or DirectColor), the gray shade for each pixel is taken from the red values in col- +ormap. +If class is TripleBand and an achromatic colormap is specified (StaticGray or GrayScale), the +red band will be replicated to populate the green and blue output bands. +The depth of colormap must match the levels attribute of src (i.e. 2depth must equal levels). +No subsetting by band mask or ProcessDomain is provided (the entire image is converted). +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloColormap invalid colormap +FloMatch levels of src do not match depth of colormap +FloValue invalid class or precision +To achieve predictable results, the client should not modify colormap cells referenced by the source data while the +Photoflo is Active (see Await for synchronization help). +A value of bitsPerRGBValue or less (defined in the VISUAL of colormap) is usually appropriate for precision. +Compare can be used to convert index data into bitonal data. Use ConvertFromIndex followed by BandExtract to +convert colored index data into full fidelity achromatic data. + + +ConvertFromRGB +XieFloConvertFromRGB +src XieTypPhototag +convert XieTypConvertFromRGBTechnique +convert-params +Errors: FloAlloc, FloSource, FloMatch, FloTechnique +Events: none +Attribute Value +class TripleBand +type convert technique dependent +width same as src +height same as src +levels convert technique dependent +ConvertFromRGB converts RGB source data to an alternate colorspace. +Src is the Phototag of the element supplying source data (RGB assumed). Convert is the Convert- +FromRGBTechnique that will be used in the conversion to the destination colorspace. Convert- +params is the list of additional parameters required by convert. +In addition to colorspace conversion, some techniques allow for adjusting the white point of the output +data (refer to Appendix A Convert From RGB Technique, for more information on conversion +techniques). +The source data must be TripleBand, and all bands must have equal dimensions. The type and levels +of the output data are determined by convert technique parameters. All other attributes are inherited +from src. +No subsetting by ProcessDomain is provided (the entire image is processed). +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloMatch src is not TripleBand +unequal inter-band dimensions (width or height) +FloTechnique invalid convert or convert-params + + +ConvertToIndex +XieFloConvertToIndex +notify BOOL +src XieTypPhototag +colormap COLORMAP +color-list XieTypColorList +color-alloc XieTypColorAllocTechnique +color-alloc-params +Errors: FloAlloc, FloSource, FloColormap, FloColorList, FloMatch, FloValue +Events: none +Attribute Value +class SingleBand +type Constrained +width same as src +height same as src +levels 2depth (i.e. colormap depth) +ConvertToIndex allocates and/or matches colors or gray shades, as required, from a COLORMAP. It +produces pixel indices as output data, and records indices that it allocates in a ColorList. The specified +color-alloc technique may generate a ColorAlloc event to warn the client that results are of lesser fidel- +ity than desired. +Notify allows the client to be notified about inferior results from color allocation or matching. Src is the +Phototag of the element supplying Constrained source data. Colormap is the COLORMAP from which +colors or gray shades are allocated and/or matched. Color-list is the ColorList where allocated COL- +ORMAP indices are to be stored. Color-alloc specifies the desired ColorAllocTechnique. Color-alloc- +params is the list of additional parameters required by color-alloc. +Color-list is purged of any colors it already contains when Photoflo execution begins. Allocated +COLORMAP indices can be freed using PurgeColorList, DestroyColorList, or by making color-list the +target of an Active Photoflo. +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloColormap invalid colormap +FloColorList invalid color-list +FloAccess color-list is already being used by another Active Photoflo +FloMatch unequal inter-band dimensions (width or height) +FloTechnique invalid color-alloc technique or color-alloc-params +ConvertToIndex is usually a preparatory step for an ExportDrawable element. Alternatively, continuous-tone data +can be converted to a fixed palette of COLORMAP index entries using Point. Or BandExtract can be used if the +COLORMAP contains a ramp of colors or gray shades (e.g. a Standard-COLORMAP or a TrueColor visual). +Bitonal image data can be presented directly to ExportDrawablePlane, allowing the GCONTEXT mechanism to +translate ones and zeros in the image into foreground and background colors in the DRAWABLE. +If colormap is static, image colors or gray shades must be matched to those available in colormap. Since no cells +are actually allocated, color-list can be specified as zero (0). Of the three standard techniques defined in this document +only ColorAlloc_Match is appropriate for static COLORMAPs. If colormap is dynamic, image colors or gray +shades may be matched or allocated from colormap depending on the color-alloc technique; colormap and the list of +cells actually allocated are stored in color-list. +Although the three standard techniques defined in this document allocate read-only cells, ConvertToIndex could be +extended with private techniques that allocate, match, or write into read-write cells. + + +ConvertToRGB +XieFloConvertToRGB +src XieTypPhototag +convert XieTypConvertToRGBTechnique +convert-params +Errors: FloAlloc, FloSource, FloTechnique +Events: none +Attribute Value +class TripleBand +type convert technique dependent +width same as src +height same as src +levels convert technique dependent +ConvertToRGB converts alternate colorspace source data into RGB data. +Src is the Phototag of the element supplying source data. Convert is the ConvertFromRGBTechnique +that will be used in the conversion from the source colorspace. Convert-params is the list of additional +parameters required by convert. +In addition to colorspace conversion, some techniques allow for adjusting the white point of the source +data prior to conversion and compressing the gamut of the output data (refer to Appendix A Convert +To RGB Technique, for more information on conversion techniques). +The source data must be TripleBand, and all bands must have equal dimensions. The type and levels +of the output data are determined by convert technique parameters. All other attributes are inherited +from src. +No subsetting by band mask or ProcessDomain is provided (the entire image is converted). +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloMatch src is not TripleBand +unequal inter-band dimensions (width or height) +FloTechnique invalid convert or convert-params +Arithmetic or Point can be used to gamma-correct the resulting data prior to displaying it. + + +Convolve +XieFloConvolve +src XieTypPhototag +domain XieTypProcessDomain +kernel LISTofXieTypFloat +kernel-size CARD8 +band-mask CARD8 +convolve XieTypConvolveTechnique +convolve-params +Errors: FloAlloc, FloSource, FloDomain, FloMatch, FloValue, FloTechnique +Events: none +Attribute Value +class same as src +type same as src +width same as src +height same as src +levels same as src +Convolve produces output data by convolving each input pixel value (and surrounding area) with the +specified convolution kernel. +Src is the Phototag of the element supplying source data. Domain may control the subset of the image +that will be operated upon. Kernel contains the coefficients used in the convolution process. Kernel- +size specifies the dimension of kernel. Band-mask specifies which bands are to be operated upon. +Convolve specifies the ConvolveTechnique for handling edge conditions (when kernel requires data +outside of src). Convolve-params is the list of additional parameters required by convolve. +Kernel represents a square array of float data which has odd dimensions. Thus, a single dimension is +used to specify, kernel-size. +Using band-mask to select source data that have two (2) or less levels is not permitted. +All output data attributes are inherited from the source data. +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloDomain invalid domain +FloMatch selected source data are bitonal (i.e. 2 or less levels) +FloValue invalid kernel-size (e.g. not odd) +FloTechnique invalid convolve edge handling technique or convolve-params +For TripleBand data, convolution using the same kernel is permuted over all three bands. + + +Dither +XieFloDither +src XieTypPhototag +levels XieTypLevels +band-mask CARD8 +dither XieTypDitherTechnique +dither-params +Errors: FloAlloc, FloSource, FloValue, FloMatch, FloTechnique +Events: none +Attribute Value +class same as src +type Constrained +width same as src +height same as src +levels levels +Dither is used to reduce the number of quantization levels in an image. It accomplishes this by af- +fecting adjacent pixels (area affect) to make up for the lack of depth resolution. +Src is the Phototag of the element supplying source data. Levels is the number of levels desired in the +output data. Band-mask specifies which bands are to be operated upon. Dither specifies the desired +DitherTechnique. Dither-params is the list of additional parameters required by dither. +The source data must be Constrained. Using band-mask to select source data that have two (2) or less +levels is not permitted. +No subsetting by band mask or ProcessDomain is provided (the entire image is processed). +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloMatch Unconstrained src data +selected source data are bitonal (i.e. 2 or less levels) +FloValue invalid output levels: less than two, or greater than src levels +FloTechnique invalid dither technique or dither-params + + +Geometry +XieFloGeometry +src XieTypPhototag +width CARD32 +height CARD32 +coefficients XieTypFloat[6] +constant XieTypConstant +band-mask CARD8 +sample XieTypGeometryTechnique +sample-params +Errors: FloAlloc, FloSource, FloValue, FloTechnique +Events: none +Attribute Value +class same as src +type same as src +width width +height height +levels same as src +Geometry is used to perform geometric transformations on image data. Linear geometric resampling +operations are implemented, such as: crop, mirror, scale, shear, rotate, translate, and combinations +thereof. +Src is the Phototag of the element supplying source data. Width and height specify the dimensions of +the output data. Coefficients is a list of values (a,b,c,d,tx,ty) that control the geometric transforma- +tion. Constant is a fill value used for output pixels that do not map back to a src pixel. Band-mask +specifies which bands are to be operated upon. Sample is the GeometryTechnique to be used for ret- +rospectively resampling src. Sample-params is the list of additional parameters required by sample. +Figure 7-2 shows a combined crop and scale for a src with dimensions w and h, and output width w' +and height h'. The mapping between the coordinate systems is specified from output back to src: that +is, for each output pixel (x',y'), the coordinate location (x,y) at which to sample src is given by: + + +Geometry can be visualized as stepping through each possible output pixel location in turn, and +computing the location from which to obtain each input pixel value. Often a given output pixel location +(x',y'), will not correspond exactly to a single pixel in the input image. The sample technique is used +to determine how the input data will be interpolated to produce each output pixel value. + +Figure 7-2 A sample geometric transform: crop and scale +The region to be cropped in the input image is implicitly defined by the dimensions of the output image +and the mapping from output to input coordinates. Depending on the size of the input and output +images, the amount of scaling specified, and the amount of translation in the mapping, the shadow of +the output image may extend beyond the boundaries of the input image, as in Figure 7-3. Pixels in the +output image which map off the edge of the input image will be assigned the constant value. + +Figure 7-3 Background fill used for pixels beyond the edge +Transformation Coefficients +The coordinate mapping (a,b,c,d,tx,ty), together with the output width and height, fully specify the +geometric transformation. To aid in computing the desired transform, one might: +* Draw a picture of the input and output images. Label the corners of the output image A,B,C,D. They will have +coordinates x',y' at (0,0), (width-1,0), (0,height-1), and (width-1,height-1), +* Next compute or deduce the coordinates (x,y) of A,B,C,D in the input coordinate space, +* For three corners (preferably those with a 0 for either x' or y'), write down the basic mapping equation with +known (x,y) and (x',y') specified. Each corner will give two equations, and simultaneously solving the six +equations for the three corners will allow (a,b,c,d,tx,ty) to be deduced. The remaining corner may be used to +check that these parameters have been derived correctly. +The following briefly (and approximately) summarizes the intuitive role of each parameter: +a,d Scaling parameters. Increasing a and d will make the output image appear smaller, +whereas decreasing them will make the output pixels appear larger. +b,c Rotation/skew parameters. If b and c are zero, the output image will be a +rectangular scaling of the input image. If a and d are both zero, b is one and c is +negative one, the image will appear rotated. The magnitude of b and c will affect +scaling as well, if a and d are zero. If more than two of (a,b,c,d) are non-zero, +the effect is complicated. The image may appear skewed and scaled. +tx,ty Translation parameters. Used to specify the offset between input and output +coordinate systems. +width,height These specify the output image dimensions of the selected band(s). Note that +increasing the output image height and width over the input image size will not by +itself cause magnification ¾ if a and d are one (1) and b and c are zero (0), the +output image will have the same appearance as the input, except that the borders +will shrink or expand (as determined by width and height) and new areas of the im- +age will be filled with constant. + +Trichromatic image bands can be operate individually, all together, or in any combination, using band- +mask. Since applying the same (a,b,c,d,tx,ty) mapping to inputs with diverse sizes will specify +different transformations, operating on all bands in unison (band-mask of 1112) is most appropriate if +the dimensions of all bands are equal. No subsetting by ProcessDomain is provided (selected bands +are processed in their entirety). +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloValue invalid coefficients +FloTechnique invalid sample technique or sample-params +Logical +XieFloLogical +src-1 XieTypPhototag +src-2 XieTypPhototag +domain XieTypProcessDomain +constant XieTypConstant +operator GCfunction* +band-mask CARD8 +Errors: FloAlloc, FloSource, FloDomain, FloMatch, FloOperator, FloValue +Events: none +Attribute Value +class same as src-1 +type Constrained +width same as src-1 +height same as src-1 +levels same as src-1 +Logical performs per-pixel bit-wise operations on a single data source, or between two data sources, or +between a single data source and a constant. +When two sources are involved, src-1 and src-2 are the Phototags of the elements supplying source +data (constant is ignored). If the operation is to involve a constant, src-1 is one operand, src-2 must be +zero, and constant is used as the other operand. Domain may control the subset of source data that +will be operated upon. Operator is the logical operator to be used. Band-mask specifies which bands +are to be operated upon. +The value of operator matches the GC-function values defined by the core protocol +specification for CreateGC. The output of Logical is determined by the number of data sources and +operator: +GC-function1 monadic operation dyadic operation +Clear 0 0 +And constant AND src-1 src-2 AND src-1 +AndReverse constant AND (NOT src-1) src-2 AND (NOT src-1) +Copy constant src-2 +AndInverted (NOT constant) AND src-1 (NOT src-2) AND src-1 +NoOp src-1 src-1 +Xor constant XOR src-1 src-2 XOR src-1 +Or constant OR src-1 src-2 OR src-1 +Nor (NOT constant) AND (NOT src-1) (NOT src-2) AND (NOT src-1) +Equiv (NOT constant) XOR src-1 (NOT src-2) XOR src-1 +Invert NOT src-1 NOT src-1 +OrReverse constant OR (NOT src-1) src-2 OR (NOT src-1) +CopyInverted NOT constant NOT src-2 +OrInverted (NOT constant) OR src-1 (NOT src-2) OR src-1 +Nand (NOT constant) OR (NOT src-1) (NOT src-2) OR (NOT src-1) +Set 1 1 +When two sources are involved, all attributes, other than width and height, must match. All source +data must be Constrained, and levels must be a power of two. Output attributes are inherited from src- +1. +Error Cause +FloAlloc insufficient resources +FloSource invalid src-1 or src-2 +FloDomain invalid domain +FloOperator invalid operator +FloMatch src-1 or src-2 is not Constrained +levels or class differs between src-1 and src-2 +levels is not a power of 2 + + +MatchHistogram +XieFloMatchHistogram +src XieTypPhototag +domain XieTypProcessDomain +shape XieTypHistogramShape +tech-params +Errors: FloSource, FloDomain, FloAlloc, FloMatch, FloTechnique +Events: none +Attribute Value +class SingleBand +type Constrained +width same as src +height same as src +levels same as src +MatchHistogram produces output data which differs from the source data in terms of its pixel value +distribution, or histogram. It allows the client to specify the desired state of the resulting data's histo- +gram (algorithmic description of resulting histogram shape). +Src is the Phototag of the element supplying source data. Domain may control the subset of the source +data to operated upon. Shape is a HistogramShape that specifies the form of the desired output data +histogram. Shape-params is the list of additional parameters required by shape. +The source data must be Constrained and SingleBand, and it must have three (3) or more levels. +When a ProcessDomain is used, only data that intersects with domain is included in the histogram, +and only that data will be affected in the result of the histogram matching operation (all other data will +pass-through unchanged). +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloDomain invalid domain +FloMatch invalid src data: Unconstrained or TripleBand or bitonal +FloTechnique invalid histogram shape or shape-params +The Point element can also be used to re-shape an image's histogram using an appropriate LUT. + + +Math +XieFloMath +src XieTypPhototag +domain XieTypProcessDomain +operator XieTypMathOp +band-mask CARD8 +Errors: FloAlloc, FloSource, FloDomain, FloMatch, FloOperator, FloValue +Events: none +Attribute Value +class same as src +type same as src +width same as src +height same as src +levels same as src +Math applies a single operand mathematical operation to the source data on a point-wise basis. +Src is the Phototag of the element supplying source data. Domain may control the subset of the image +which will be operated upon. Operator is the mathematical operation to be applied. Band-mask speci- +fies which bands are to be operated upon. +Pixel computations that would lead to errors will yield valid server-dependent values (e.g. the log of a +Constrained pixel value of zero might result in a value of zero). Using band-mask to select source data +that have two (2) or less levels is not permitted. +All output data attributes are inherited from the source data. +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloDomain invalid domain +FloMatch selected source data are bitonal (i.e. 2 or less levels) +FloOperator invalid operator + + +PasteUp +XieFloPasteUp +tiles LISTofXieTypTile +width CARD32 +height CARD32 +constant XieTypConstant +Errors: FloAlloc, FloSource, FloMatch +Events: none +Attribute Value +class same as tiles +type same as tiles +width width +height height +levels same as tiles +PasteUp is an N-input translate operation which outputs data constructed from various source data tiles +or a constant value. +Each of the tiles specifies a src (the Phototag of the element supplying source data), and the coordi- +nates, dst-x and dst-y, where the tile belongs in the output data. Width and height specify the full extent +of the output data. Constant is the fill value to as the output data for any region that is not specified as +a tile. +Each region of the output data is defined by a tile's destination coordinates, dst-x and dst-y, and its src +dimensions. For output regions where no tile provides input, the value of constant is used. If tiles +overlap, a stacking order rule defines which pixel value will be output: the last tile (involved in the +overlap) in the list of tiles will provide the output pixel. +At least one tile must be supplied. Except for width and height, all attributes of each source tile must +match. In addition, for TripleBand input, inter-band dimensions within each tile must match. +No subsetting by band mask or ProcessDomain is provided. +Error Cause +FloAlloc insufficient resources +FloSource invalid source tiles +no tiles were specified +FloMatch incompatible attributes between tiles +unequal inter-band dimensions within a tile (width or height) + + +Point +XieFloPoint +src XieTypPhototag +lut XieTypPhototag +domain XieTypProcessDomain +band-mask CARD8 +Errors: FloAlloc, FloSource, FloDomain, FloMatch +Events: none +Attribute Value +class same as lut +type Constrained +width same as src +height same as src +levels same as lut +Point maps source pixel values to output pixel values using a lookup table (LUT) . +Src is the Phototag of the element supplying Constrained source data. Lut is the Phototag of the +element supplying the lookup table array(s). Domain may control the subset of source data which will +be operated upon. Band-mask specifies which bands are to be operated upon (all bands must be +specified if lut is SingleBand and src is TripleBand). +The output is Constrained, with the width and height taken from src, and class and levels taken from +lut. When src is SingleBand and lut is TripleBand, for the bands that are indicated by band-mask, the +output bands are re-mapped through their respective lut bands, whereas the other bands are just +replications of the single src band. If domain is used, the class and levels of lut must match those of +src. +Each lut array must contain sufficient entries so that all potential pixel values found in src can form a +valid index into the array. Generally each src pixel value is used directly as an index into a lut array. +When TripleBand src data are re-mapped through a SingleBand lut however, pixel values from all three +src bands are combined to form an array index (for this case, width and height must match for all +bands). Figure 7-4 presents the algorithm for computing combined array indices. + +LUT band-order +LUT indexing algorithm for combining pixel values from TripleBand data + +LSFirst +index = value[0] + value[1] x levels[0] + value[2] x levels[0] x levels[1] + +MSFirst +index = value[2] + value[1] x levels[2] + value[0] x levels[2] x levels[1] + +Figure 7-4 Point's algorithm for computing combined LUT indices +Error Cause +FloAlloc insufficient resources +FloSource invalid src or lut +FloDomain invalid domain (e.g. attempting to use domain with ServiceClass DIS) +FloMatch Unconstrained src data +lut does not contain enough entries (i.e. length less than src levels) +lut is SingleBand and src is TripleBand, but band-mask is incomplete +domain is being used, but lut class or levels do not match those of src +Unconstrain +XieFloUnconstrain +src XieTypPhototag +Errors: FloAlloc, FloSource, FloMatch +Events: none +Attribute Value +class same as src +type Unconstrained +width same as src +height same as src +levels unknown +Unconstrain takes Constrained source data and produces Unconstrained data. +Src is the Phototag of the element supplying Constrained source data. +No subsetting by band mask or ProcessDomain is provided (the entire image is Unconstrained). +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloMatch Unconstrained src + + GC-function is not a defined type in the core X protocol documentation. This table is taken from the list of +alternative function values defined for the CreateCG protocol request. + Figure 6-1 illustrates the relationship between LUT class and image class and presents some usage examples. + + +Process Elements 7-26 + + +8 +Export Elements +Element categories +Export elements are used to send image data out of a Photoflo. Each export element has a single Photo- +tag source but does not provide an output connection. There are two types of export elements: + ExportResource elements export data to a server resource (DRAWABLE, LUT, Photomap, or ROI). + ExportClient elements produce data for client retrieval. They provide the input data for the GetClient- +Data protocol request. +Export to Client +ExportClient elements provide data for the client. Element parameters fully describe the format or +organization the data is to have as it is transported through the protocol stream. The data itself must be +retrieved using the GetClientData protocol request while the Photoflo is Active. +Servers are required to buffer a non-zero amount of data per ExportClient element. Beyond that +point execution may be suspended until the client retrieves sufficient data. +Events generated +ExportClient elements can generate ExportAvailable events to notify the client when the data is +available for retrieval. ExportAvailable events may be: + disabled (i.e. no event is sent), + enabled only when data first becomes available from the element, + enabled each time the element's data buffer transitions from empty to non-empty. + + +ExportClientHistogram +XieFloExportClientHistogram +notify XieTypExportNotify +src XieTypPhototag +domain XieTypProcessDomain +Errors: FloAlloc, FloSource, FloDomain, FloMatch, FloValue +Events: none +ExportClientHistogram generates a histogram of the pixel values found in the source data. It prepares +histogram data that can be retrieved by the client using the GetClientData protocol request. An event +can be requested that will notify the client when histogram data becomes available. +Notify allows the client to be notified when the histogram data becomes available. Src is the Phototag +of the element supplying SingleBand Constrained source data. Domain may control the subset of the +source data from which the distribution will be generated. +The data generated for the client is a list of HistogramData where each entry consists of an value (i.e. a +pixel value) followed by the count of pixels found with that value. If the number of pixels for a given +value exceeds the capacity of count (type CARD32), that count will be returned at the maximum value +(i.e. 232-1). Pixel values that are not found in the data are not included in the histogram data (i.e. no +entries are returned where count is zero). +If notify is true, the total number of histogram entries are reported in the data field of the ExportAvail- +able event. +The histogram is returned as numeric values (see HistogramData), as such, the byte order of the data is +determined at core protocol connection setup time. +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloDomain invalid domain +FloMatch Unconstrained src data +TripleBand src data +FloValue invalid notify +All data that are generated by ExportClientHistogram must be retrieved by the client using GetClientData before +the Photoflo can exit from the Active state. +Histograms of TripleBand images are not supported directly. However, BandSelect may be used to choose a single +band of data, or BandExtract may be used to combine data from multiple bands into a single band of data. A histogram +of this single band of data could then be generated using ExportClientHistogram. + + +ExportClientLUT +XieFloExportClientLUT +notify XieTypExportNotify +src XieTypPhototag +band-order XieTypOrientation +start XieTypTripletofCARD32 +length XieTypTripletofCARD32 +Errors: FloAlloc, FloSource, FloValue +Events: none +ExportClientLUT allows data imported from an ImportLUT or ImportClientLUT element to be retrieved +by the client. The actual transport of lookup table data through the protocol stream is requested using +the GetClientData protocol request. +Notify allows the client to be notified when data become available. Src is the Phototag of the element +supplying lookup table data. Band-order is the order in which TripleBand arrays are transmitted +through the protocol stream. Start is the index of the first array entry that should be returned. Length +is the number of array entries that should be returned. +If notify is requested, the ExportAvailable event's data field will report the total number of array entries +that can be retrieved from the band specified by the event. +The size of each array entry is either 1, 2, or 4 bytes; the smallest size into which the output quantization +levels can be stored. When array entries require multiple bytes, the byte order per entry is determined +in the same manner as other numeric data: it is the byte orientation established at core X connection +setup time. +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloMatch start + length exceeds number of entries in an array +FloValue invalid notify or band-order +When the client attempts to retrieve data from an ExportClientLUT element, the server responds with one or more +complete array entries per protocol reply (see GetClientData). All data must be retrieved by the client before the +Photoflo can leave the Active state. + + +ExportClientPhoto +XieFloExportClientPhoto +notify XieTypExportNotify +src XieTypPhototag +encode XieTypEncodeTechnique +encode-params +Errors: FloAlloc, FloSource, FloMatch, FloValue, FloTechnique +Events: none +ExportClientPhoto makes image data available to the protocol stream. The attributes of the exported +data are determined by the attributes of the source data. The format of the data is specified by the en- +code technique and encode-params. The actual transport of image data through the protocol stream is +requested using the GetClientData protocol request. +Notify allows the client to be notified when image data become available. Src is the Phototag of the +element supplying Constrained data. Encode is the EncodeTechnique that will be used to compress of +format the exported data. Encode-params is the list of additional parameters required by encode. +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloMatch Unconstrained src data +FloValue invalid notify +FloTechnique invalid encode technique or encode-params +ServerChoice is not a valid encode technique for ExportClientPhoto. +Depending on encode, the export process may cause the data to be decoded, encoded, or otherwise reformatted by the +server. If ExportClientPhoto is fed directly from an ImportClientPhoto or ImportPhotomap element, and the +attributes of the raw data that are given to the import element match the requirements of the encode technique, the +raw data can bypass the normal decode function of the import element and be forwarded directly to ExportPhotomap +(this is an implementation-specific optimization). +If TripleBand data are given to an encode technique that will interleave the output data BandByPixel, the dimensions +of each src band must match. +All data must be retrieved by the client, using the GetClientData protocol request, before the Photoflo can exit from +the Active state. + + + +ExportClientROI +XieFloExportClientROI +notify XieTypExportNotify +src XieTypPhototag +Errors: FloAlloc, FloSource, FloValue +Events: none +ExportClientROI allows a list-of-rectangles, imported from an ImportROI or ImportClientROI element, +to be retrieved by the client. The actual transport of lookup table data through the protocol stream is +requested using the GetClientData protocol request. +Notify allows the client to be notified when data become available. Src is the Phototag of the element +supplying the list-of-rectangles. +If notify is requested, the ExportAvailable event's data field will report the total number of rectangles +that can be retrieved. +Each rectangle is described using numeric values (see Rectangle), as such, the byte order of the data is +determined at core protocol connection setup time. +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloValue invalid notify +When the client attempts to retrieve data from an ExportClientROI element, the server responds with one or more +complete Rectangles per protocol reply (see GetClientData). All data must be retrieved by the client before the +Photoflo can leave the Active state. + + +Export to Resource +ExportResource elements emit data to server resources: either core X DRAWABLEs, or XIE LUT, +Photomap, or ROI resources. +For ExportResource elements that assign attributes to XIE resources, the association between the +resource identifier (XID) and the new attributes and data does not occur until the Photoflo successfully +completes (i.e. leaves the Active state). (See LUT, Photomap, and ROI resources in Chapter 4.) +ExportDrawable +XieFloExportDrawable +src XieTypPhototag +drawable DRAWABLE +gc GCONTEXT +dst-x INT16 +dst-y INT16 +Errors: FloAlloc, FloSource, FloDrawable, FloGC, FloMatch, FloValue +Events: none +ExportDrawable allows COLORMAP index data to be exported to a WINDOW or PIXMAP. +Src is the Phototag of the element supplying Constrained source data (index data assumed). Drawable +is the WINDOW or PIXMAP into which the data will be written. Gc is the GCONTEXT to be used when +transferring pixels to drawable. Dst-x and dst-y specify where the data should be placed in drawable. +The following components are used from gc: function, plane-mask, subwindow-mode, +clip-x-origin, clip-y-origin, and clip-mask. +The levels of src must exactly match the depth of drawable and gc (i.e. levels must be 2depth). +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloDrawable invalid drawable +FloGC invalid gc +FloMatch invalid src data (TripleBand, levels doesn't match depth, or Unconstrained) +ExportDrawable assumes its input is COLORMAP index data. Sources of such data include: ImportClientPhoto, +ImportDrawable, ImportPhotomap, BandExtract, ConvertToIndex, Point, and elements that have processed +index data. + + +ExportDrawablePlane +XieFloExportDrawablePlane +src XieTypPhototag +drawable DRAWABLE +gc GCONTEXT +dst-x INT16 +dst-y INT16 +Errors: FloAlloc, FloSource, FloDrawable, FloGC, FloMatch, FloValue +Events: none +ExportDrawablePlane allows SingleBand single bit (bitonal) data to be exported to a WINDOW, +PIXMAP, or BITMAP. +Src is the Phototag of the element supplying Constrained bitonal source data. Drawable is the WIN- +DOW, PIXMAP, or BITMAP into which the data will be written. Gc is the GCONTEXT to be used when +transferring pixels to drawable. Dst-x and dst-y specify where the data should be placed in drawable. +The following components are used from gc: function, plane-mask, foreground, back- +ground, fill-style, subwindow-mode, clip-x-origin, clip-y-origin, and clip- +mask. For the fill-style component of gc, values of FillSolid and FillTiled are treated +as synonyms for FillOpaqueStippled. +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloDrawable invalid drawable +FloGC invalid gc +FloMatch invalid src data (TripleBand, levels > 2, or not Constrained) +Bitonal data can be exported to a DRAWABLE of any depth if an appropriate GCONTEXT is supplied. The +foreground and background pixel values of gc can be used to map image pixels to COLORMAP colors during the +export process. + + +ExportLUT +XieFloExportLUT +src XieTypPhototag +lut XieTypLUT +merge BOOL +start XieTypTripletofCARD32 +Errors: FloAlloc, FloSource +Events: none +ExportLUT allows data imported from an ImportLUT or ImportClientLUT element to be saved in an ex- +isting LUT resource. +Src is the Phototag of the element supplying lookup table data. Lut is the LUT to receive the data. +Merge specifies that new array entries from src should replace entries that already exist within lut. Start +is the index of the first array entry that should be written in lut. +If merge is false, start must be 0 for each band. In this case, lut will inherit the attributes of src and be +populated with its data. The previous attributes and data of lut are overwritten when the photoflo +completes. +If merge is true and lut has existing attributes, the data from src will replace the data from lut, beginning +at position start. The attributes of src must match those of lut, and the combination of start and the +length of src must specify a valid sub-range existing within lut. If merge is true but lut has not yet been +populated, it is an error. +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloLUT invalid lut +FloMatch merge true and attributes do not match between src and lut +merge true and start + src length is not a sub-range of lut +FloValue merge false and start is non-zero + + +ExportPhotomap +XieFloExportPhotomap +src XieTypPhototag +photomap XieTypPhotomap +encode XieTypEncodeTechnique +encode-params +Errors: FloAlloc, FloSource, FloPhotomap, FloTechnique +Events: none +ExportPhotomap allows data resulting from Photoflo operations to be saved in an existing Photomap. +Src is the Phototag of the element supplying source data. Photomap is the Photomap to receive the +data. Encode is the EncodeTechnique by which the image is to be compressed or formatted. Encode- +params is the list of additional parameters required by encode. +Photomap will inherit the attributes of src and be populated with its data. The previous attributes and +data of photomap are overwritten when the Photoflo completes. +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloPhotomap invalid photomap +FloTechnique invalid encode technique or encode-params +Depending on encode, the export process may cause the data to be decoded, encoded, or otherwise reformatted by the +server. If ExportPhotomap is fed directly from an ImportClientPhoto or ImportPhotomap element, and the +attributes of the raw data that are given to the import element match the requirements of the encode technique, the +raw data can bypass the normal decode function of the import element and be forwarded directly to ExportPhotomap +(this is an implementation-specific optimization). +If encode is ServerChoice, the server is free to choose an encode technique for the exported data. An optional hint +can be provided to help the server make its choice, but the server can ignore the hint. PreferTime hints that retrieval +performance is the desired metric, whereas PreferSpace indicates that frugal use of storage space is more important. If +ExportPhotomap is receiving data from an adjacent upstream import element, ServerChoice may choose to pass the +import element's input data directly to the Photomap, otherwise a lossless technique will be chosen. The actual +technique chosen by the server can be obtained using QueryPhotomap after the Photoflo completes. +If TripleBand data are given to an encode technique that will interleave the output data BandByPixel, the dimensions +of each src band must match. + + +ExportROI +XieFloExportROI +src XieTypPhototag +roi XieTypROI +Errors: FloAlloc, FloSource, FloROI +Events: none +ExportROI allows data imported from an ImportROI or ImportClientROI element to be saved in an ex- +isting ROI. +Src is the Phototag of the element supplying a list-of-rectangles. Roi is the ROI to receive the data. +Roi will be populated with new data. The previous data of roi are overwritten after the Photoflo +completes. +Error Cause +FloAlloc insufficient resources +FloSource invalid src +FloROI invalid roi + +Export Elements 8-1 + + +9 +Events and Errors +Events +ColorAlloc +XieEvnColorAlloc +instance XieTypExecutable +src XieTypPhototag +type ConvertToIndex +color-list XieTypColorList +color-alloc XieTypColorAllocTechnique +data CARD32 +A ColorAlloc event notifies the client that a ConvertToIndex element has completed color allocation, +but has produced a result of lesser fidelity than was requested using the technique that was specified +for the ConvertToIndex element. +Instance, src, and type identify the Photoflo and specific ConvertToIndex element from which the +ColorAlloc event originated. Color-list is the ColorList resource that received the allocated colors. +Color-alloc is the ColorAllocTechnique specified to the ConvertToIndex element. Data can be used +for other information which is specific to color-alloc. + + +DecodeNotify +XieEvnDecodeNotify +instance XieTypExecutable +src XieTypPhototag +type { ImportClientPhoto, ImportPhotomap } +decode XieTypDecodeTechnique +data-width CARD32 +data-height CARD32 +band-number CARD8 +aborted BOOL +A DecodeNotify event notifies the client that anomalies were encountered while decoding a compressed +image (see the notify parameters of ImportClientPhoto and ImportPhotomap). Either an error has been +encountered while decoding an image, or the image data received does not satisfy the expected +dimensions. +Instance, src, and type identify the Photoflo and element from which the DecodeNotify event originated. +Decode is the DecodeTechnique being used. Data-width and data-height are the dimensions +discovered while decoding the data. Band-number associates the event with the band of the image +where the problem was encountered. Aborted is true if decoding was aborted, or false if recovery was +possible. +Recovery from a decode error may result in some missing or garbled image data. This may also cause +the height of the decoded data to be less than was expected. If data-width or data-height do not +match the width and height specified to ImportClientPhoto, the image data is clipped or padded (with +zeros), as required, to enforce the ImportClientPhoto specified dimensions. +ExportAvailable +XieEvnExportAvailable +instance XieTypExecutable +src XieTypPhototag +type { ExportClientHistogram, +ExportClientLUT, +ExportClientPhoto, +ExportClientROI } +band-number CARD8 +data LISTofCARD32 +An ExportAvailable event notifies the client that an ExportClient element has data available (see +the notify parameter of the applicable ExportClient element). If notify was specified as FirstData, +this event will only be sent the first time data become available from the ExportClient element. +Otherwise (i.e. NewData was specified) this event will be generated each time the amount of data +available changes from zero to non-zero. +Instance, src, and type identify the Photoflo and specific ExportClient element from which the +ExportAvailable event originated. Band-number associates the event with a specific band of the image +or LUT. Data is information specific to type (e.g. the number of LUT entries or ROI rectangles avail- +able). +Where there is a single ExportClient element, the client can just read bytes or be event-driven. For Photoflos +containing multiple ExportClient elements, the client should be event-driven. + + +ImportObscured +XieEvnImportObscured +instance XieTypExecutable +src XieTypPhototag +type { ImportDrawable, ImportDrawablePlane } +window WINDOW +x INT16 +y INT16 +width CARD16 +height CARD16 +An ImportObscured event notifies the client an ImportDrawable or ImportDrawablePlane element has +encountered obscured regions in a WINDOW that cannot be retrieved from BACKINGSTORE (see the +notify parameter of the import element). A separate ImportObscured event is returned for each affected +region. +Instance and src identify the Photoflo and the specific import element from which the ImportObscured +event originated. Window identifies the WINDOW. The obscured region of the window is specified by +x, y, width, and height. +Note: image data within obscured regions will be populated with the fill value supplied to the import element. +PhotofloDone +XieEvnPhotofloDone +instance XieTypExecutable +outcome XieTypPhotofloOutcome +A PhotofloDone event notifies the client that a Photoflo has left the Active state. It is enabled by the +notify parameter of the ExecutePhotoflo and ExecuteImmediate requests. +Instance identifies the Photoflo from which the PhotofloDone event originated. Outcome indicates the +reason the Photoflo left the Active state. +If the Photoflo terminated due to an error condition, the details concerning the error have preceded this event in an +error message. + + +Resource Errors +The following error-codes are allocated from the extension error space to provide for the errors returned +by XIE: +Table 9-1 XIE Error codes +Error Cause +XieErrColorList the value for a color-list argument does not name a defined ColorList +XieErrFlo . . . an error has been detected while defining, executing, or accessing a Photoflo. +See Table 9-2 for additional detail. +XieErrLUT the value for a lut argument does not name a defined LUT +XieErrPhotoflo the value for a photoflo argument does not name a defined Photoflo +XieErrPhotomap the value for a photomap argument does not name a defined Photomap +XieErrPhotospace the value for a photospace argument does not name a defined Photospace +XieErrROI the value for a roi argument does not name a defined ROI +XIE also uses the core protocol errors: Access, Alloc, IDChoice, Length, Request, and Value. + + +Photoflo errors +If an error is detected while defining, executing, or accessing a Photoflo, a Flo-error is returned. This +single error-code is allocated from the extension error space for all Photoflo related errors. The follow- +ing sub-codes are defined to provide the details of the error: +Table 9-2 Photoflo error sub-codes +Error Cause +XieErrFloAccess attempt to execute, modify, or redefine an Active Photoflo +attempt to Get/Put client data from/to an Inactive Photoflo +XieErrFloAlloc insufficient resources (e.g. memory) +XieErrFloColormap an unknown COLORMAP has been specified +XieErrFloColorList an unknown ColorList has been specified +XieErrFloDomain invalid domain Phototag: + - source data is not a list-of-rectangles or control-plane + - specified non-zero on a DIS server +XieErrFloDrawable an unknown DRAWABLE has been specified +XieErrFloElement an unknown PhotoElement type has been specified +invalid PhotoElement type for request (e.g. GetClientData from Math) +attempt to change or add a PhotoElement type using ModifyPhotoflo +XieErrFloGC an unknown GCONTEXT has been specified +XieErrFloID invalid Executable: + - an unknown Photoflo has been specified + - an unknown Photospace has been specified +XieErrFloLength a PhotoElement was received with the incorrect number of bytes +XieErrFloLUT an unknown LUT has been specified +XieErrFloMatch some parameter or pair of parameters has the correct type and range, but it fails +to match in some other way required by the PhotoElement +XieErrFloOperator an unknown operator has been specified (e.g. ArithmeticOp, MathOp, ...) +XieErrFloPhotomap an unknown Photomap has been specified +XieErrFloROI an unknown ROI has been specified +XieErrFloSource an invalid Phototag has been specified: + - zero, but a Phototag is required + - downstream from the particular PhotoElement + - beyond the bounds of the Photoflo +XieErrFloTechnique an unknown technique has been specified +the wrong number of technique specific parameters have been supplied +invalid technique specific parameters have been specified +XieErrFloValue some numeric value falls outside of the range of values accepted by the PhotoE- +lement +XieErrFloImplementation + + + + + + + + + + + + + + + + + + + + + + + +almost blank + +Events and Errors 9-1 + + diff --git a/xie/xc/doc/hardcopy/XIE/XIEProto/cmatch.txt b/xie/xc/doc/hardcopy/XIE/XIEProto/cmatch.txt new file mode 100644 index 0000000..6a997e0 --- /dev/null +++ b/xie/xc/doc/hardcopy/XIE/XIEProto/cmatch.txt @@ -0,0 +1,175 @@ +Sharing Image Colors in X + +Author: +Robert NC Shelley +February 10, 1989 +Abstract +Displaying images (natural or synthetic) may require an enormous number of colors. A 24-bit deep +TrueColor workstation can simultaneously display a large enough palette of colors to faithfully render al- +most any image. When working with depth-limited PseudoColor displays, however, techniques such as +judicious color selection or dithering must be employed to reduce the number of unique colors in an image +to a workable set. This paper addresses a strategy for allocating and sharing colors and grayscale shades +within the limitations of the PseudoColor and GrayScale visual classes of the X Window System. All +applications requiring static shared colors or grayscale shades can benefit from this strategy. An abridged +example of this algorithm is available in the server display module of the version 3 X Image Extension sample +implementation from Digital Equipment Corporation. +The Problem +In the X Window System the palette of colors, displayable at any given instant, is determined by color +definitions in the installed colormap. Many X servers only support one active colormap at a time. +The X11 PseudoColor visual class offers a wide gamut of colors to choose from (248). Most hardware +platforms offer a subset of the full X11 gamut, often 224 colors. However, the palette of colors that can be +displayed simultaneously may be much more limited. For example, the gamut of over 16 million colors may +be limited to a palette of 256 simultaneously displayable colors on an 8 plane system, or as few as 16 colors +on a 4 plane system. +Color hungry applications may attempt to hog the default colormap's color cells as private read/write color +cells. This strategy tends to starve late comers who find an inadequate number of color cells remaining. It is +equally unsociable to use a private colormap. The application owning the colormap controls all the colors it +wants, while the windows of all other applications displayed on the same screen go Technicolor. The +advantage in using private color cells or a private colormap is that the application has full control over the +choice of displayable colors and may change colormap entries dynamically. +A more sociable strategy involves sharing colors from the default colormap. In many cases applications +sharing the default colormap would be willing to compromise their choice of exact colors for colors which are +perceived by the human visual system to be close enough to the desired color. +The X Window System reference manual states, XAllocColor returns the pixel value of the color closest to +the specified RGB elements supported by the hardware and returns the RGB values actually used. This +sounds like the desired sociable color sharing strategy. However, the meaning of this statement lies in the +fact that most servers use only the upper `n' bits of each of the RGB values (n often equals 8). When +allocating the closest color supported by the hardware, the server makes no attempt to search for the +closest color. The RGB values actually used are the values requested, disregarding the lower (16-n) bits. +The Solution +To encourage the sociable use of color resources among applications we have developed color allocation +routines which, when given a list of preferred colors, will return colors which are perceptually close enough +to those requested, and allocate new sharable colors when no acceptable substitute can be found. Each ap- +plication defines what constitutes close enough. +Since the routines simultaneously manage sharing colors and grayscale shades, applications requiring col- +ors can coexist with applications exclusively requiring shades of gray. +What's an application to do? +Prior to calling the color allocation routines, a typical application would create the list of preferred colors. If +the colors are being allocated for display of an image this list may be created by generating a histogram of +color usage within the image. The color allocation algorithm gives a limited priority to allocating colors +according to their order within the list, therefore the list should be arranged in an order that will produce the +most pleasing affect for the application (e.g. decreasing frequency of usage) in case the colormap becomes +full. +Along with the list of colors, the application supplies parameters which limit the definition of an acceptable +color match, and specifies a color space to be used during color match calculations. +The preferred color list is then processed by the color allocation routines which will return the allocated +colors. The application would then create its final image by re-mapping each image color to the pixel index +of the color returned. +Algorithm overview +The color allocation algorithm gives priority to allocating new sharable colors in a sequence that will provide +an even distribution of sharable colors throughout the specified color space. This iterative process begins +by dividing the color space into sub-volumes and determining the existence or need for sharable colors +within each sub-volume. The sub-volume size is determined dynamically such that the size is reduced on +each iteration. +Secondary priority is given to allocating colors according to their order within the list of requested colors. +Each iteration of the algorithm processes the preferred color list in order. Sub-volumes of the color space, +centered around each requested color, are examined to see if any sharable color exists within the sub- +volume. If none is found, the new sharable color is allocated. This process proceeds until the end of the list +is reached, at which time a new sub-volume size is calculated. +The color allocation algorithm ends when: all colors have been allocated, or the sub-volume size has reached +the limit specified by the application, or a sharable color allocation fails due to the colormap being full. +All remaining colors are assigned the pixel index of their closest match within the specified color space. +Parameters required +The parameters to the color allocation routine include: the screen on which the image will be displayed, the +colormap to allocate colors from, a list (and count) of colors to allocate, the color space in which to match +colors, and a pair of control parameters. +Color match space +The color allocation routines allow the application to choose one of the following color spaces: HLS, Lab, +L*U*V*, RGB, U*V*W*, and YIQ. During color allocation the color space is used for choosing colors that +have the greatest distance from any existing color. During color matching the color space is used to find the +minimum distance to an existing color. +Control parameters - what's close enough +The cube in figure 1, represents the RGB color space - all possible colors that can be defined using the +primary spectral components of visible light: red, green, and blue. All the pure shades of gray lie along a di- +agonal line running between black and white. +The human visual system is unable to perceive any difference (in hue, saturation or intensity) between +closely spaced points within the cube. Thus there is a sphere of points surrounding each color, any of +which could be an acceptable substitute for the central color. Furthermore, there is a cylinder of points +surrounding the gray shade line, each of which is close enough to its closest gray shade on the line to sat- +isfy the human eye. + +Figure 1: RGB color cube showing color match spheres and gray shade cylinder +The RGB color space was chosen here to simplify illustration. The other color spaces are not cubic in +shape. Neither are the volumes representing acceptable colors and gray shades spherical and cylindrical, +but rather they are distorted by the shape of the color space. +Match-limit +The radius of the color match spheres (parameter match_limit), determines the degree of error to be tol- +erated when searching for perceptually close colors. The minimum value of match_limit allows only exact +matches (within the limits of the hardware), while the maximum value encompasses the entire color space (no +new colors would be allocated). +Figure 1 illustrates a pair of colors to be allocated: a saturated orange (centered within the quarter sphere) +and a blue-green shade (centered within the full sphere). The color allocation routine will locate the color +existing within each sphere that has the shortest distance vector to the desired color, or allocate the exact +color if no color has been allocated within the sphere. +Gray-limit +Most people will accept a decreased resolution in intensity rather than tolerate inaccuracies in hue when +viewing a grayscale image. Therefore a separate parameter (gray_limit) is provided in order to define a +relatively narrow cylinder of gray shades while tolerating larger intensity errors along the axis of the cylinder +(specified using the match_limit parameter). +The radius of the gray shade cylinder (parameter gray_limit), determines the degree of error to be tolerated +when searching for shades of gray. The minimum value of gray_limit allows only pure shades of gray to be +shared from the colormap, while the maximum value (which must be specified when allocating colors rather +than gray shades) includes the entire gray shade line. +Special effects +If the colormap contains a grayscale ramp, a color image can be displayed as grayscale by using a low value +for gray_limit and the maximum value, for match_limit. Likewise, a grayscale image can be displayed with a +digital art effect, if the colormap contains only a distribution of colors and both match_limit and +gray_limit are specified at their maximum values. +Many happy returns +The color allocation routine modifies each XColor structure in the supplied colors list to contain the pixel +value of the allocated color, the actual RGB values assigned, and a symbol in the pad field that indicates +whether the exact color, or the best match was allocated. Or the pad field may indicate failure in the event +that the supplied colormap was completely allocated with private read/write color cells. +Each color allocated must be freed using XFreeColors. Each pixel index must be freed as many times as it +appears in the colors list. +A closer look +The following is a summary of the color allocation algorithm: + discover the state of each colormap cell: available, sharable, private, + exclude sharable colors which deviate too far from gray_limit, + convert each sharable colormap cell into the color space of choice, + convert each requested color into the color space of choice, + find the distance to the closest existing match for each color requested, + allocate new colors for those having no acceptable match, + share existing colors that are perceptually close enough, + if the colormap becomes full, assign the remaining colors to their closest match. +What state is your colormap in? +Each colormap cell is tested to determine which colors are sharable. However, the algorithm makes al- +lowance for the volatility of the colormap resource as other clients also have access to the colormap while +the color allocation routine executes. +If the supplied colormap does not allow any sharable colors to be allocated, each of the requested colors are +marked as failing to be allocated. +How gray it is +For each sharable color absolute value of the difference between RGB components is computed. If any +difference exceeds the application's gray_limit parameter the colormap cell is excluded from being a color +match candidate. +Finding the best mate +Initially each requested color is assigned the colormap index of the closest existing color; the distance +between them is also recorded. The distance between colors is computed as a space diagonal within the +color space requested: +distance = +Where C1, C2, and C3 are the three components of the requested color space. Since only relative distances +are required in determining the closest match, the square root is not computed (reducing computational +overhead). +Private rooms for distant cousins +A new color is allocated for each color that has a match distance exceeding the match_limit. Color allo- +cations proceed in groups that will distribute them throughout the color space. Within each group the col- +ors are allocated by their order within the list of requested colors. +The mean distance between all pending allocations is calculated. All colors exceeding this mean distance +form a group of colors to be allocated. For each new color allocated the distance to the remaining colors is +tested - the new color may be a better match than was previously found. While this process eliminates +many colors from the group under consideration, it ensures an equitable distribution of colors through out +the color space. +Allocation of new colors is complete when: all colors have been allocated, or all the remaining colors have a +close enough match, or the colormap becomes full. +We're room mates - like it or not +Any remaining colors share the allocation of the closest existing color within the colormap. While colors are +being allocated other clients may also be allocating and deallocating colors. In case this activity causes the +allocation of the closest matching color to fail, the next best match will be allocated instead. + + + + +1 + + + diff --git a/xie/xc/doc/hardcopy/XIE/XIEProto/overview.txt b/xie/xc/doc/hardcopy/XIE/XIEProto/overview.txt new file mode 100644 index 0000000..d61240f --- /dev/null +++ b/xie/xc/doc/hardcopy/XIE/XIEProto/overview.txt @@ -0,0 +1,356 @@ +X Image Extension Overview + +Robert NC Shelley +AGE Logic, Inc. + 9985 Pacific Heights Blvd. +San Diego, CA 92121 + +Abstract +The X Image Extension provides a powerful mechanism for the transfer and display of vir- +tually any image on any X-capable hardware. While not intended for use as a general pur- +pose image processing engine, XIE does provide a robust set of image rendition and en- +hancement primitives that can be combined into arbitrarily complex expressions. XIE also +provides import and export facilities for moving images between client and server, or core +X and XIE, and for accessing images as resources. +XIE Design Goals +The X Image Extension (XIE) was designed to facilitate efficient and robust image display on X Window +System servers. XIE provides tools for rapidly transferring an image from client to server, and for converting +the image format to match the server's hardware characteristics. XIE does not attempt to provide tools for +general-purpose image processing. However, simple image enhancement and filtering operations such as +contrast enhancement and convolution are available, as well as dithering, geometric transformations, histo- +gram generation, etc. +The X Window client-server architecture was based on the assumption that data on the wire would be of a +relatively high level. Therefore, a high-bandwidth connection is not an absolute requirement for X. However, +image transfer requires sending large amounts of low-level data, which may take an unacceptable amount of +time on slow or heavily loaded networks. This image transport bottleneck makes the X Window System less +than optimal for supporting image intensive applications. +XIE solves the image transport problem by supporting the transmission of compressed images across the +wire, and providing image decompression facilities in the server. Compression ratios on the order of 20:1 or +more are common for bitonal images. The client can send a relatively modest amount of data to the server +where it is decompressed into a much larger data structure. The image at full resolution may not fit com- +pletely on the server's display monitor, so XIE supports geometric operations, such as scale. The large im- +age may be scaled down to a convenient window size and displayed as is depicted in Figure 1. +Rendition in XIE is defined to be the process of changing the format of an image in order to make it com- +patible with the server's frame buffer, its associated lookup table(s), and other limitations. Once an image has +been rendered, it may be transferred directly to the hardware and viewed on the screen. Rendering a compli- +cated image to be compatible with highly limited hardware can be quite challenging, and may require a series +of manipulations to be performed on the image. It may be necessary to convert the image from trichromatic +to monochromatic (gray scale or bitonal). A scaling operation can be used to reduce the image's size to fit +the screen dimensions. Convolution provides a means for sharpening the image or performing other general +filtering operations. Dithering may be used to reduce the number of levels to match the number of colormap +entries available, and so on. + + +Figure 1. Compressed transport from client to server, followed by decompression, scaling and display. +The primitives of XIE that are needed to support image transfer and rendition define a new class of virtual +display hardware. In some cases, it may be possible for server implementors to map these functions directly +onto physical hardware accelerators. For example, the Convolution operator in XIE might be implemented di- +rectly using a convolution board or chip. Providing a vehicle for hardware vendors to upgrade the perform- +ance of X servers for image-specific operations was an explicit design goal of XIE. +To summarize the main goals of XIE: +* Display any image on any server, +* Reduce the time it takes to move images from client to server, +* Support the development and utilization of image-specific hardware, +* Do not cover all of image processing. +XIE Historical Summary +The X Image Extension project was initiated in 1988 by Joe Mauro of Digital Equipment Corporation. The +first formal proposal was submitted to the Consortium in 1990. At that time, it was voted not to proceed to +technical review, because of a lack of sufficient resources to review the proposal. Digital continued to +work with interested Consortium members in revising the protocol, and produced a portable sample imple- +mentation of XIE (Version 3) to demonstrate proof-of-concept. In March of 1991, XIE was officially moved +into technical review. After more than a year and a half of discussion by many interested companies, a sub- +stantially modified XIE (version 4) was promoted from technical review to public review at the end of 1992. +In January of 1993 AGE Logic was contracted to produce a new sample implementation which was com- +pleted in January of 1994. Several more improvements were made to the protocol during the public review +and sample implementation period. The major changes to the XIE protocol between versions 3 and 5 in- +cluded: +* more direct control over server behavior given to the client, +* generalization and refinement of the computational model, +* elements no longer do implicit data type conversions, +* tools for creating a processing engine moved to the client side, +* unification of all geometric operators into a single transformation, +* enhanced support for color spaces and color operations, +* cleaner interface to Core X, +* support for more compression techniques, +* identification of a Document Imaging Subset. +XIE Architecture +The image extension is designed to add new functionality to X while at the same time avoiding making any +fundamental changes to the X architecture. XIE receives requests, and sends errors, replies, and events +through the standard mechanisms defined for extensions. XIE resources must be registered with the Core X +resource manager so that at client shutdown all XIE resources can be cleanly deallocated. All data in and +out of XIE must pass through X, either by the standard extension mechanism or by explicit import and ex- +port. Note in Figure 2 below that all utilization of resources in XIE must go through a Photoflo Manager. +Data is imported into the Photoflo Manager and exported out from it. The Photoflo Manager, which also +runs the computational engine of XIE, is discussed in the next section. + + +Figure 2. High-level view of an X server containing XIE support. +XIE's Computational Model +Typical XIE processing employs a sequence of operations. For example: +* transport an image from client to server, +* decompress the image, +* scale the image, +* render and enhance the image, +* display (export image data to a Core X drawable). + +A client could ask the server to perform each of these operations one step at a time - send the complete +image to the server, then decompress it, then scale it, etc., and finally display the result. One disadvantage +of this approach is that the user may have to wait a long time before seeing the image on the screen. Fur- +thermore, the memory requirements of holding the full decompressed image in the server may be severe. The +necessity of producing full intermediate images between steps further aggravates this situation. Consider +the simple sequence of operations {transfer image, decompress, scale, export to X} that is depicted in Figure +3: + +Figure 3. Processing each step completely before moving data to the next element in + the sequence requires allocating a large amount of buffer space in the server. +When the image is processed one step at a time, large buffers must be allocated to hold the decompressed +image in the server. This may require more memory than is available in the server, in which case XIE would +have to return an allocation error, thereby preventing the user from viewing the image. +Suppose instead that the client could specify all operations in the sequence to the server at once. The +server could then choose to perform only part of each operation before passing the output data to the next +processing step in the sequence. For example, it might decompress half of the incoming image, scale that +half, and export the top half of the image to Core X, at which point the user would see the top of the image +displayed on the screen (Figure 4): + + +Figure 4. Processing only half of each step before moving data to the next element. +After the top half of the image has been displayed, the server could decompress the remainder of the image, +scale it, and export the result to Core X, thus completing the display of the whole image (Figure 5). Two +benefits have been realized. First, the user was able to see something appear on the screen in roughly half +the time. Second, the server didn't have to allocate as much buffer space. In fact, the amount of buffer space +required will be inversely proportional to the number of steps into which the process is subdivided (until +some minimum level is reached). + + +Figure 5. Processing the second half of each step. +In XIE, the ability to define a sequence of operations to be performed is referred to as constructing a Photo- +flo. Photoflos are so named because the image data (sometimes photographic) is viewed as flowing through +the sequence of elements. The Photoflo Manager depicted in Figure 2 obtains data via import elements, +processes the data using process elements, and outputs the final result via export elements. A Photoflo for +the sequence just discussed would look like: + + + +No explicit decompression step is required. The Import element describes the format of the data to be trans- +ferred, and the server knows it must implicitly decompress the image data prior to passing it to the Geometry +element. Similarly, the client may specify that an image is to be compressed before it is stored in a Photomap +or returned to the client. +Photoflos do not have to be linear. The client is allowed to construct any Directed Acyclic Graph (DAG) as +long as the way the elements are connected makes sense. For example, the Photoflo in Figure 6 computes an +unsharp masked enhancement of the input image by first blurring a sub-region of the image, using a convo- +lution operation, and then adding the difference to the original image: + + +Figure 6. Photoflo to compute unsharp masked enhancement with rectangles of interest. +The client can specify this DAG to the server all at once, with either CreatePhotoflo (to create a permanent +Photoflo that can be re-used) or ExecuteImmediate (to create a temporary Photoflo that will be destroyed +immediately upon completion). The Photoflo Manager creates the Photoflo and then waits for further in- +struction. Once the Photoflo is activated (performed by ExecutePhotoflo for permanent flos, or performed +implicitly for temporary flos), the Photoflo Manager will asynchronously execute the Photoflo, processing +input as it becomes available. The client pushes data into the Photoflo by using a PutClientData request, +specifying the Photoflo and the appropriate Import element. The client reads data out of the Photoflo by +sending a GetClientData request, specifying the Photoflo and the appropriate Export element. It is not un- +usual for the Photoflo to block further processing pending either additional input from the client or retrieval +of available data by the client. +Several operations in XIE permit control over the image processing domain by specifying a control-plane or +a set of rectangles-of-interest. This allows portions of the image to be included or excluded from the rendi- +tion or enhancement operation. In Figure 6, the Convolve operation is restricted to a subset of all the pixels +in the image by importing a set of rectangles-of-interest (ROI) to modify the processing domain of the Con- +volve element. Pixels that fall within the area described by the set of rectangles are processed; those which +do not are passed through unchanged. This allows the user to reduce the computation time in areas of the +image that are not interesting. +XIE Resources +XIE defines six permanent resources that can be created and destroyed: ColorLists, LUTs, Photoflos, Pho- +tomaps, Photospaces, and ROIs. Some of these have already been introduced above. +A Photoflo is a computational engine that the client specifies using either a CreatePhotoflo or an Exe- +cuteImmediate request. A Photoflo created by CreatePhotoflo is considered permanent, and exists until an +explicit DestroyPhotoflo request or client shutdown. The resource ID specified at Photoflo creation time is a +normal core X resource ID. A Photoflo created by ExecuteImmediate is a temporary resource that is created +in a separate resource ID space, called a Photospace. Before creating the first temporary Photoflo, a Photo- +space must be created to hold it using the CreatePhotospace request. If this Photospace is destroyed, all +Photoflos in the space are immediately destroyed along with it. +LUTs, ROIs and Photomaps are used as Photoflo inputs by using ImportLUT, ImportROI and ImportPho- +tomap elements, respectively. A Photomap is a handle for image data stored in the server. Photomaps are +created with no attributes: they inherit data and descriptive information from ExportPhotomap elements in +Photoflos. The attributes of a Photomap may be queried by using the QueryPhotomap request. A LUT is a +handle for lookup table data for the Point operation. A LUT resource receives data and attributes from an +ExportLUT element in a Photoflo. A ROI resource is a handle for a set of rectangles-of-interest. It is popu- +lated using the ExportROI element. +ColorLists are used to store colors allocated from a colormap. When a colormap and a color or gray scale +image is passed to the ConvertToIndex element, the colormap identifier and the index of each colormap cell +allocated by ConvertToIndex are stored in the ColorList. The contents of a ColorList can be queried using +the QueryColorList request. +Element Definitions +This section briefly discusses the elements with which one can create computational engines (Photoflos). +The number of individual Photoflo elements listed below is deceptively modest, in that there are many dif- +ferent ways in which several of the elements could have been specified. For example, in defining a geometric +transformation for an image, it is quite simple to specify the transform in idealized coordinates, but impossi- +ble to choose one optimal re-sampling method. This is because evaluation of the algorithm's performance +depends on factors that are largely subjective, and processor or data dependent. It is unreasonable to pick a +single algorithm for a given element when clearly dozens of other algorithms are available of equal or better +quality. It was decided to build flexibility into XIE's basic element definitions, giving both server implemen- +tors and client writers leeway in selecting the algorithms that best meet their needs. +The XIE protocol provides this flexibility by incorporating a technique parameter within several of the ele- +ments that acts as a modifier of the element's behavior. The techniques that are supplied to import and ex- +port elements generally identify image compression schemes, whereas the techniques specified for process- +ing elements identify various image processing algorithms that are slightly different methods of doing the +same basic operation. In some cases techniques offer a tradeoff between execution time and the fidelity of +the results, while in other cases different techniques are desirable because of the image class or content. +For some techniques the server implementor is required to provide a default algorithm. This allows an +application to select an operation in a generic way without concerning itself with the details of the particular +algorithm being used. The protocol document specifies that some techniques must be implemented in all +servers, whereas other techniques are considered optional. The server implementor is also permitted to +extend XIE with additional proprietary techniques as is seen fit. XIE includes a query request to determine +what techniques are supported by a particular implementation and to determine what algorithms are being +used as defaults. +Import Elements + Import elements may be classified according to the source of their data, which must be either: the client, +Core X, or XIE resources. Thus: +Client Import Elements +ImportClientLut - reads in lookup table data from the client. Since the client will send raw data using +PutClientData, this element is used to specify the format of the expected data stream. +ImportClientPhoto - reads in image data from the client. Since the client will be sending raw data +using PutClientData, this element is provided to specify the format of the data stream. A decode +technique, and its associated arguments, are used to specify the compression algorithm applied to the +data. +ImportClientROI - used to read in a list of rectangles for process domain control. Since a fixed format +is defined, only the number of rectangles needs to be provided. +Core X Resource Import Elements +ImportDrawable - reads in image data from a window or pixmap. +ImportDrawablePlane - reads in a selected image bitplane from a window or pixmap. +XIE Resource Import Elements +ImportLUT - import existing lookup table data, typically to be used by the Point processing element. +ImportPhotomap - import previously stored image data. No decoding parameters are required (as was +the case with ImportClientPhoto) because the server remembers the format of the stored data. +ImportROI - import a list of rectangles that was previously stored in the server, typically used for +process domain control. +Process Elements +Processing elements can be roughly grouped by their complexity, functionality, or the aspect of the image +that they work with. One such grouping follows: +Simple Algebraic Processing Elements +Arithmetic - allows arithmetic operations, such as addition or subtraction, to be performed between a +pair of images or an image and a constant value. Other operations, such as multiplication or division, +can only be performed between an image and a constant value. +Blend - allows an alpha-blend operation between two images or an image and a constant value. The +weights for the blend operation can be determined by a constant value or on a per-pixel basis through +the use of an alpha-plane. +Compare - compares two images or an image and a constant value to produce a bit plane with ones +where the comparison is satisfied. +Logical - performs per-pixel bitwise operations on images, or between an image and a constant. +Math - performs mathematical operations, such as square root or natural logarithm, on a single source +image. +Format Conversion Elements +BandCombine - accepts three SingleBand images and merges them to form a single TripleBand image. +BandExtract - produces a SingleBand image from a TripleBand image by summing a percentage of the +pixel values from each input band with a bias value. +BandSelect - selects a single image band from a TripleBand image. +Constrain - converts unconstrained pixel values into integer pixel values (certain operations in XIE +can be performed using unconstrained pixel values which are represented within the server as either +floating-point or fixed-point values). +ConvertFromIndex - takes a colormap and an image as input and produces a new image whose pixel +values are taken from the colormap. +ConvertFromRGB - converts RGB image data into another colorspace. +ConvertToIndex - allocates image colors from a colormap or matches colors in the image against those +already existing in the colormap. Each pixel in the output image is the colormap index of the colormap +cell that most closely represents the corresponding input image pixel. The action taken (allocate, match, +etc.) is dependent on the color allocation technique given to ConvertToIndex. Each colormap cell that is +allocated by ConvertToIndex is stored in a ColorList resource. +ConvertToRGB - converts to RGB from another color space. +Dither - reduces the number of quantization levels in an image by spreading the information contained +in a pixel over the surrounding area. +Unconstrain - converts integer pixel values into unconstrained pixel values (certain operations in XIE +can be performed using unconstrained pixel values which are represented within the server as either +floating-point or fixed-point values.) +Simple Enhancement and Filtering Elements +Convolve - performs a convolution on an image. +MatchHistogram - computes the histogram of the input image and remaps pixel data so as to match, +as closely as possible, the specified histogram shape. +Point - applies a lookup table operation to each pixel in the source image. Point is so named because +the output pixel value depends only on the input value at that point. +Domain-based Operations +Geometry - performs a geometric transformation on image data. Special cases include scale, crop, +mirror, shear, rotate, and translate. The operation is specified as a mapping of the coordinates of the +output image back to the coordinate space of the input image. Re-sampling and antialiasing algorithms +can be specified by using technique parameters. +PasteUp - allows multiple image tiles to be combined into a single image. A tile is an image with an +offset attached, that specifies where the tile is to be placed in the output image. Overlapping tiles are +resolved by a defined stacking order. If the tiles don't completely cover the output image, uncovered re- +gions are filled by a constant pixel value. + + +Export Elements +As with import elements, export elements may be classified according to the destination of their data, which +must be either: the client, Core X, or XIE resources. Thus: +Client Export Elements +ExportClientHistogram - computes the histogram of an image and makes it available to the client via +the GetClientData request. +ExportClientLUT - makes lookup table data available to the client. The client can specify the entire +LUT or a sub-range of the LUT. +ExportClientPhoto - makes image data available to the client. The client can specify the format it +wants by using an encode technique and its associated parameters. +ExportClientROI - makes rectangle-of-interest data available to the client. +Core X Resource Export Elements +ExportDrawable - writes image data into a pixmap or window. The client must provide a graphics +context to direct the insertion of data. +ExportDrawablePlane - writes a bitonal image into a pixmap or window. The graphics context may be +used to expand the data to foreground and background colors and to perform stippling. +XIE Resource Export Elements +ExportLUT - exports lookup table data to a LUT resource. ExportLUT obtains its input from a previous +element such as ImportClientLUT or ImportLUT. +ExportPhotomap - stores an image in a Photomap resource. Encoding parameters can be supplied to +tell the server what format to store the data in. Alternatively, the client may allow the server to choose +whatever image compression scheme it deems best. +ExportROI - stores a list of rectangles in a ROI resource. The exported data must come from either +ImportClientROI or ImportROI. +Subsetting +The full XIE protocol defines a very powerful flexible system. It is recognized, however, that many appli- +cation writers will wish to use XIE features to perform relatively simple tasks on simple (e.g. bitonal) images. +They may never deal with color spaces or processing domains or want to do anything more complex than +simply import, scale, and export. They will be interested in using a server that is tuned specifically for the +needs of document imaging, ignoring all other concerns. In fact, they can do without many of XIE's +capabilities, as long as the server provides the simple operations they require and it obeys the same +protocol as the full XIE specification for those operations. +The XIE Document Imaging Subset (DIS) was designed to respond to this demand. DIS drops the concepts +of Color Lists and processing domains completely, and supports only two processing elements: Geometry +and Point. Geometry is required in order to do scaling and rotation. Since the DIS client is responsible for +managing the colormap, Point is needed to convert pixel values into colormap indexes. +The only required image compression schemes are those associated with bitonal images. DIS also provides +the ability to import a full-depth drawable, scale it using Geometry, and then export the result back to Core X. +This functionality may be useful for those who want to be able to scale images produced by other +applications. One could imagine using this feature to resize a drawing in order to include it in a document. +Summary +The X Window System defines a standard architecture that has provided a stable platform-independent +display environment for application developers to build upon. By adhering to the same basic principles, XIE +enhances the image display capabilities of the core protocol by providing: +* efficient image transport between client and server, +* efficient caching of images on the server, +* image rendition and enhancement capabilities on the server, +* support for the development and utilization of image-specific hardware, +* consistent policy-free support for image display across all platforms. +References +1. X Window System +Scheifler & Gettys +Digital Press +2. X Image Extension Protocol Reference Manual +Shelley et al. +AGE Logic, Inc. +3. XIElib Specification +Rogers +AGE Logic, Inc. +4. XIE Sample Implementation Architecture +Shelley, Verheiden & Fahy +AGE Logic, Inc. +5. X Image Extension Overview +Fahy & Shelley +The X Resource - Special Issue C, 1/93 +O'Reilly & Associates, Inc. + + +Copyright (c) 1994 AGE Logic, Inc. +Permission to use, copy, modify, distribute, and sell this article for any purpose is hereby granted without fee, provided that +the above copyright notice and this permission notice appear in all copies. AGE Logic, Inc. makes no representations about +the suitability for any purpose of the information in this paper. This material summarizes a standard of the X Consortium +and is provided as is without express or implied warranty. +1 + + diff --git a/xie/xc/doc/hardcopy/XIE/XIElib/xielib.txt b/xie/xc/doc/hardcopy/XIE/XIElib/xielib.txt new file mode 100644 index 0000000..bc68e9c --- /dev/null +++ b/xie/xc/doc/hardcopy/XIE/XIElib/xielib.txt @@ -0,0 +1,7525 @@ +XIElib +Specification + + +Gary Rogers +AGE Logic, Inc. +This document contains reference pages for each XIElib function. +Public Review Draft +April, 1994 + + + + +Copyright (c) 1994 AGE Logic, Inc. + + +Permission to use, copy, modify, distribute, and sell this documentation for any purpose is hereby granted +without fee, provided that the above copyright notices and this permission notice appear in all copies. AGE +Logic makes no representations about the suitability for any purpose of the information in this document. +This documentation is only a draft standard of the X consortium and is therefore subject to change. + + + +Acknowledgments + +XIElib was provided by the X Consortium, with cooperation from AGE Logic, Inc. of San Diego, CA. It +is a C subroutine library that provides a low level C binding of all features that are defined by Version +5.0 of the XIE Protocol. + +Various parts of the text were borrowed from the Version 5.0 XIE Protocol Reference Manual, edited by +Bob Shelley of AGE Logic, Inc.. Bob provided suggestions and comments that were invaluable in +preparing this document. Dean Verheiden and Syd Logan, both of AGE Logic, Inc., graciously +volunteered to review the original manuscript. + +The author would like to thank Ralph Mor of the X Consortium for his careful review of this document. +Ralph designed the XIElib and wrote its sample implementation, and his technical advice was +indispensable. Adrian Nye, Editor for O'Reilly & Associates, Inc., provided substantive assistance in +the preparation of this document, for which the author is very thankful. + + + +Table of Contents +Introduction 1 +Startup Functions +XieInitialize 3 +XieQueryTechniques 5 +XieCreateColorList 8 +XieDestroyColorList 9 +XiePurgeColorList 10 +XieQueryColorList 11 +LUT Functions +XieCreateLUT 12 +XieDestroyLUT 13 +Photomap Functions +XieCreatePhotomap 14 +XieDestroyPhotomap 15 +XieQueryPhotomap 16 +ROI Functions +XieCreateROI 18 +XieDestroyROI 19 +Photoflo Functions +XieCreatePhotospace 20 +XieDestroyPhotospace 21 +XieExecuteImmediate 22 +XieAllocatePhotofloGraph 24 +XieCreatePhotoflo 25 +XieDestroyPhotoflo 27 +XieExecutePhotoflo 28 +XieModifyPhotoflo 29 +XieRedefinePhotoflo 31 +XieQueryPhotoflo 32 +Client Data Functions +XiePutClientData 34 +XieGetClientData 36 +Abort and Await Functions +XieAbort 38 +XieAwait 39 +Photoflo Element Functions +XieFloImportClientLUT 40 +XieFloImportClientPhoto 43 +XieFloImportClientROI 46 +XieFloImportDrawable 47 +XieFloImportDrawablePlane 49 +XieFloImportLUT 51 +XieFloImportPhotomap 52 +XieFloImportROI 54 +XieFloArithmetic 55 +XieFloBandCombine 58 +XieFloBandExtract 60 +XieFloBandSelect 62 +XieFloBlend 63 +XieFloCompare 66 +XieFloConstrain 69 +XieFloConvertFromIndex 71 +XieFloConvertFromRGB 73 +XieFloConvertToIndex 75 +XieFloConvertToRGB 78 +XieFloConvolve 80 +XieFloDither 83 +XieFloGeometry 85 +XieFloLogical 88 +XieFloMatchHistogram 91 +XieFloMath 93 +XieFloPasteUp 95 +XieFloPoint 97 +XieFloUnconstrain 99 +XieFloExportClientHistogram 100 +XieFloExportClientLUT 102 +XieFloExportClientPhoto 104 +XieFloExportClientROI 106 +XieFloExportDrawable 108 +XieFloExportDrawablePlane 110 +XieFloExportLUT 112 +XieFloExportPhotomap 114 +XieFloExportROI 116 +Technique Functions +XieTecColorAllocAll 117 +XieTecColorAllocMatch 118 +XieTecColorAllocRequantize 120 +XieTecRGBToCIELab 121 +XieTecRGBToCIEXYZ 123 +XieTecRGBToYCbCr 125 +XieTecRGBToYCC 127 +XieTecCIELabToRGB 129 +XieTecCIEXYZToRGB 132 +XieTecYCbCrToRGB 134 +XieTecYCCToRGB 136 +XieTecClipScale 138 +XieTecConvolveConstant 140 +XieTecDecodeUncompressedSingle 141 +XieTecDecodeUncompressedTriple 143 +XieTecDecodeG31D 146 +XieTecDecodeG32D 148 +XieTecDecodeG42D 150 +XieTecDecodeTIFF2 152 +XieTecDecodeTIFFPackBits 154 +XieTecDecodeJPEGBaseline 156 +XieTecDecodeJPEGLossless 158 +XieTecDitherOrderedParam 160 +XieTecEncodeUncompressedSingle 161 +XieTecEncodeUncompressedTriple 163 +XieTecEncodeG31D 166 +XieTecEncodeG32D 168 +XieTecEncodeG42D 170 +XieTecEncodeServerChoice 172 +XieTecEncodeJPEGBaseline 174 +XieTecEncodeJPEGLossless 177 +XieTecEncodeTIFF2 179 +XieTecEncodeTIFFPackBits 181 +XieTecGeomAntialiasByArea 183 +XieTecGeomAntialiasByLowpass 185 +XieTecGeomGaussian 187 +XieTecGeomNearestNeighbor 189 +XieTecHistogramGaussian 191 +XieTecHistogramHyperbolic 192 +XieTecWhiteAdjustCIELabShift 194 +Free Functions +XieFreeTechniques 195 +XieFreePhotofloGraph 196 +XieFreeEncodeJPEGBaseline 197 +XieFreeEncodeJPEGLossless 198 +XieFreePasteUpTiles 199 +XIElib Events +ColorAlloc Event Events-1 +DecodeNotify Event Events-2 +ExportAvailable Event Events-3 +ImportObscured Event Events-4 +PhotofloDone Event Events-5 +XIElib Errors +Resource Errors Errors-1 +Photoflo Errors Errors-2 + + + + + + XIElib - Function Group Introduction +This page describes the format of the reference pages for each XIElib function. Every effort has been +made to maintain consistency with the format used in Xlib Reference Manual for Version 11, A. Nye, +ed., O'Reilly & Associates, Inc., 1992. The reader is also referred to X Image Extension Protocol +Reference Manual, Version 5.0, R. Shelley, ed., 1994, for a complete definition of the XIE protocol. +Name +XieFunctionName - brief description of the function. +Synopsis +The Synopsis section presents the calling syntax for the routine, including the declarations of the +arguments and the return type. For example: + +returntype XieFunctionName (arg1, arg2_ret) +type1 arg1; +type2 *arg2_ret; +Arguments +The Arguments section describes each of the arguments used by the function. There are two sorts of +arguments: arguments to specify data to the function and arguments that return data from the function. +An example of each type is shown below: + +arg1 Specifies information for XieFunctionName. The description for this +type of argument always starts with the word "Specifies." +arg2_ret Returns information from XieFunctionName. The description for +this type of argument always starts with the word "Returns." +Returns +This section is present when XieFunctionName returns a value, and describes what is returned. +Description +The Description section describes what the function does, what it returns, and what events or side- +effects it causes. It also may also contain pertinent definitions, algorithms, and tables. A description of +each XIE event structure is presented in the section XIElib Events. +Output Attributes +This section, which presents a table of element output attributes, is present if +XieFloFunctionName specifies an element that produces output data. + +Class Data class of output data + - single band (achromatic or index) + - triple band (trichromatic) +Type Data type + - constrained (quantization levels is Levels) + - unconstrained (quantization levels is unknown) +Width Width of output (in pixels per band) +Height Height of output (in pixels per band) +Levels Depends on type + - constrained: number of quantization levels + - unconstrained: unknown +Structures +The Structures section contains the C definitions of the XIE-specific data types used by +XieFunctionName as arguments or return values. It also contains definitions of important +constants used by the function. +Errors +The Errors section is present when an action of XieFunctionName could generate an error. A table +of errors that can be generated and their causes is presented. The full list of errors is presented in the +section XIElib Errors. +See Also +This section lists other functions that contain information related to XieFunctionName. + XIElib - Startup Functions XieInitialize +Name +XieInitialize - initialize the XIE extension. +Synopsis +Status XieInitialize (display, extinfo_ret) +Display *display; +XieExtensionInfo **extinfo_ret; +Arguments +display Specifies a connection to an X server. +extinfo_ret Returns the pointer to an XieExtensionInfo structure, which contains +information about the XIE server's capabilities. +Returns +Zero on failure, non-zero on success. +Description +XieInitialize() initializes the interface to the XIE extension and returns information about the +XIE server's capabilities. XieInitialize() should be called to establish version compatibility +between client and server prior to making any other XIE request. + +If successful, XieInitialize() allocates and fills the XieExtensionInfo structure as follows: + +* The server_major_rev and server_minor_rev members are set to specify the highest +version of the XIE protocol that the server supports. If the server version is higher than the XIElib +version, the server will return the lower version, if it supports it. +* The service_class member is set to the service-class supported by the XIE server. Service- +class defines the recognized image processing service sets supported by the X Image Extension +standard; the two service classes currently defined are Full, the entire XIE protocol, and DIS, the +Document Image Subset, a proper subset of Full XIE. The service_class member can be set to +one of the standard values: + +xieValFull +xieValDIS + +* The alignment member is set to the pixel and scanline alignment for image data supported by +the server. Values for this member can be either xieValAlignable or xieValArbitrary. +xieValAlignable data units must fit evenly within a byte, or they must fill a byte, or fill a +multiple of bytes; xieValArbitrary data units may fall at any bit address. +* The uncnst_mantissa member is set to the number of bits in the server's floating point +format (including the sign bit). If the server uses fixed point, uncnst_mantissa is set to 0. +* The uncnst_min_exp member is set to the smallest (most negative) value n such that 2n is +representable in the server's unconstrained data format. +* The uncnst_max_exp member is set to the largest value n such that 2n - 1 is representable in +the server's unconstrained data format. +* The n_cnst_levels member is the number of items in the list cnst_levels. +* The items in the list cnst_levels are set to the levels that are recommended for constrained +data by the server. A value of 0 means 232 levels. +* The first_event member is set to the value from which subsequent XIE events values are +based. +* The first_error member is set to the value from which subsequent XIE error values are based. + +The memory allocated to extinfo_ret is freed when display is closed via XCloseDisplay(); +the client should not free this memory. + +If not successful, XieInitialize() sets **extinfo_ret to NULL. +Structures +typedef struct { + unsigned server_major_rev; + unsigned server_minor_rev; + XieServiceClass service_class; + XieAlignment alignment; + int uncnst_mantissa; + int uncnst_min_exp; + int uncnst_max_exp; + int n_cnst_levels; + unsigned long *cnst_levels; + int major_opcode; + int first_event; + int first_error; +} XieExtensionInfo; + +/* Definitions of Extension Name and Version Number */ +#define xieMajorVersion 5 +#define xieMinorVersion 0 +#define xieEarliestMinorVersion 0 +#define xieLatestMinorVersion 0 + +/* Definitions of ServiceClass */ +#define xieValFull 1 +#define xieValDIS 2 + +/* Definitions of Alignment */ +#define xieValAlignable 1 +#define xieValArbitrary 2 + XIElib - Startup Functions XieQueryTechniques +Name +XieQueryTechniques - return information about the standard and private techniques that are supported +by the server. +Synopsis +Status XieQueryTechniques (display, technique_group, ntechniques_ret, +techniques_ret) +Display *display; +XieTechniqueGroup technique_group; +int *ntechniques_ret; +XieTechnique **techniques_ret; +Arguments +display Specifies a connection to an X server. +technique_group Specifies the group of techniques for which the server is to return +information. +ntechniques_ret Returns the number of items in the list of XieTechnique structures. +techniques_ret Returns the pointer to the list of XieTechnique structures, which +contains the information about the selected group of techniques. +Returns +Zero on failure, non-zero on success. +Description +If successful, XieQueryTechniques() allocates and fills each XieTechnique structure in the +list as follows: + +* The member needs_param is set to True if the technique requires additional parameters; +needs_param is set to False if the technique takes no parameters, or it has parameters that +are optional. If parameters are optional, they must be totally omitted, or they must all be supplied. +* The member group is set to the group the technique belongs to. +* The member number is set to the numeric identifier assigned to the technique. +* The member speed is set to the server's assessment of the speed of this technique relative to +other techniques in the same group, where 0 is slowest and 255 is fastest. +* The member name is set to the XIE compliant technique name string. + +To free the memory allocated to techniques_ret, use XieFreeTechniques(). + +On failure, ntechniques_ret is set to zero and *techniques_ret is set to NULL. + +The standard technique group names that can be queried using XieQueryTechniques() are +shown below: + +Technique group +Meaning + +xieValDefault +select all default techniques + +xieValAll +select all supported techniques + +xieValColorAlloc +select color allocation techniques + +xieValConstrain +select techniques for constraining data + +xieValConvertFromRGB +select colorspace conversion techniques (for conversion +from the RGB colorspace) + +xieValConvertToRGB +select colorspace conversion techniques (for conversion to +the RGB colorspace) + +xieValConvolve +select techniques for handling convolution edge conditions + +xieValDecode +select image decoding (decompression) techniques + +xieValDither +select dithering techniques + +xieValEncode +select image encoding (compression) techniques + +xieValGamut +select colorspace conversion gamut compression +techniques + +xieValGeometry +select geometric sampling techniques + +xieValHistogram +select match-histogram shapes + +xieValWhiteAdjust +select colorspace conversion white point adjustment +techniques + + +If a vendor defined an additional private technique group, it could be discovered by querying for All +groups. +Structures +typedef unsigned XieTechniqueGroup; +typedef struct { + Bool needs_param; + XieTechniqueGroup group; + unsigned int number; + unsigned int speed; + char *name; +} XieTechnique; + +/* Definitions for TechniqueGroups */ +#define xieValDefault 0 +#define xieValAll 1 +#define xieValColorAlloc 2 +#define xieValConstrain 4 +#define xieValConvertFromRGB 6 +#define xieValConvertToRGB 8 +#define xieValConvolve 10 +#define xieValDecode 12 +#define xieValDither 14 +#define xieValEncode 16 +#define xieValGamut 18 +#define xieValGeometry 20 +#define xieValHistogram 22 +#define xieValWhiteAdjust 24 +Errors +BadAlloc Insufficient resources +BadValue Unknown technique_group +See Also +XieFreeTechniques(). + XIElib - Color List Functions XieCreateColorList +Name +XieCreateColorList - create a color list. +Synopsis +XieColorList XieCreateColorList (display) +Display *display; +Arguments +display Specifies a connection to an X server. +Returns +The color list identifier. +Description +XieCreateColorList() creates a color list resource and returns its color list ID. + +The color list created is an unpopulated server resource that can be used to store the list of colors +allocated by XieFloConvertToIndex(). The Colormap allocations that are recorded in a color list +belong to the client that executed the photoflo that populated the resource (this is not necessarily the +same client that created the color list). A color list cannot be the target of more than one active photoflo +at a time. The contents of a color list may be queried using XieQueryColorList(). All allocated +cells can be explicitly purged from a color list using XiePurgeColorList(). A color list can be +destroyed using XieDestroyColorList(). +Structures +typedef XID XieColorList; +Errors +BadAlloc Insufficient resources +BadIdChoice Invalid color list +See Also +XieDestroyColorList(), XiePurgeColorList(), XieQueryColorList(), XieFloConvertToIndex(). + XIElib - Color List Functions XieDestroyColorList +Name +XieDestroyColorList - destroy a color list. +Synopsis +void XieDestroyColorList (display, color_list) +Display *display; +XieColorList color_list; +Arguments +display Specifies a connection to an X server. +color_list Specifies the color list to be destroyed. +Description +XieDestroyColorList() destroys the color list resource identified by color_list. Once +destroyed, color list ID is no longer valid. +Structures +typedef XID XieColorList; +Errors +xieErrNoColorlist Invalid color_list +See Also +XieCreateColorList(). + XIElib - Color List Functions XiePurgeColorList +Name +XiePurgeColorList - purge all allocated cells from a color list. +Synopsis +void XiePurgeColorList (display, color_list) +Display *display; +XieColorList color_list; +Arguments +display Specifies a connection to an X server. +color_list Specifies the color list to be purged. +Description +XiePurgeColorList() frees the colors from the specified color list. +Structures +typedef XID XieColorList; +Errors +BadAccess Attempt to purge colors when color list is being written by a photoflo +xieErrNoColorlist Invalid color_list +See Also +XieCreateColorList(), XieDestroyColorList(), XieQueryColorList(), XieFloConvertToIndex(). + XIElib - Color List Functions XieQueryColorList +Name +XieQueryColorList - obtain a list of allocated Colormap indices. +Synopsis +Status XieQueryColorList (display, color_list, colormap_ret, +ncolors_ret, colors_ret) +Display *display; +XieColorList color_list; +Colormap *colormap_ret; +unsigned *ncolors_ret; +unsigned long **colors_ret; +Arguments +display Specifies a connection to an X server. +color_list Specifies the color list to query. +colormap_ret Returns the Colormap from which the colors were allocated. +ncolors_ret Returns the number of Colormap indices in the list. +colors_ret Returns the list of allocated Colormap indices. +Returns +Zero on failure, non-zero on success. +Description +XieQueryColorList() allocates and returns a list of colors allocated by a ConvertToIndex +element. + +When there are no colors in color list, a zero status is returned and the value zero is returned for the +colormap, and the list of colors is of length zero. The pointer to the list of allocated Colormap indices is +set to NULL. + +To free the memory allocated to colors_ret, use XFree(). +Structures +typedef XID XieColorList; +Errors +BadAlloc Insufficient resources +xieErrNoColorlist Invalid color list +See Also +XieFloConvertToIndex(). + XIElib - LUT Functions XieCreateLUT +Name +XieCreateLUT - create a lookup table. +Synopsis +XieLut XieCreateLUT (display) +Display *display; +Arguments +display Specifies a connection to an X server. +Returns +The lookup table (LUT) identifier. +Description +XieCreateLUT() creates a server resource which is used as a lookup table (LUT) by a Point +element. A lookup table consists of one or three single-dimension arrays, each long enough to contain +an entry for all possible pixels values in the image data to which the Point element will be applied. + +The LUT is populated (or repopulated) with lookup table entries after the successful execution of a +photoflo containing an ExportLUT element which targets lut. LUT data can be imported into a photoflo +using an ImportLUT element. +Structures +typedef XID XieLut; +Errors +BadAlloc Insufficient resources +BadIDChoice Invalid LUT +See Also +XieDestroyLUT(), XieFloPoint(), XieFloImportClientLUT(), XieFloImportLUT(), +XieFloExportClientLUT(), XieFloExportLUT(). + XIElib - LUT Functions XieDestroyLUT +Name +XieDestroyLUT - destroy a lookup table. +Synopsis +void XieDestroyLUT (display, lut) +Display *display; +XieLut lut; +Arguments +display Specifies a connection to an X server. +lut Specifies the ID of the LUT to be destroyed. +Description +XieDestroyLUT() destroys the lookup table (LUT) identified by lut. Once destroyed, LUT ID is +no longer valid. +Structures +typedef XID XieLut; +Errors +xieErrNoLut The value for the lut argument does not name a defined LUT +See Also +XieCreateLUT(). + XIElib - Photomap Functions XieCreatePhotomap +Name +XieCreatePhotomap - create a photomap. +Synopsis +XiePhotomap XieCreatePhotomap (display) +Display *display; +Arguments +display Specifies a connection to an X server. +Returns +The photomap identifier. +Description +XieCreatePhotomap() creates a photomap, a server resource which stores image data. Photomap +data may be rendered for display or used as input to control or modify the rendition of another image. + +Photomap attributes are defined when a photoflo containing an ExportPhotomap element populates the +photomap with data. +Structures +typedef XID XiePhotomap; +Errors +BadAlloc Insufficient resources +BadIdChoice Invalid photomap +See Also +XieDestroyPhotomap(), XieQueryPhotomap(), XieFloImportClientPhoto(), +XieFloImportPhotomap(), XieFloExportClientPhoto(), XieFloExportPhotomap(). + XIElib - Photomap Functions XieDestroyPhotomap +Name +XieDestroyPhotomap - destroy a photomap. +Synopsis +void XieDestroyPhotomap (display, photomap) +Display *display; +XiePhotomap photomap; +Arguments +display Specifies a connection to an X server. +photomap Specifies the ID of the photomap to be destroyed. +Description +XieDestroyPhotomap() destroys the photomap identified by photomap. Once destroyed, the +photomap ID is no longer valid. A photomap is the XIE resource used to store image data in the server. +Structures +typedef XID XiePhotomap; +Errors +xieErrNoPhotomap The value for the photomap argument does not name a defined +photomap +See Also +XieCreatePhotomap(), XieQueryPhotomap(). + XIElib - Photomap Functions XieQueryPhotomap +Name +XieQueryPhotomap - returns the queriable attributes of a photomap. +Synopsis +Status XieQueryPhotomap (display, photomap, populated_ret, +datatype_ret, class_ret, decode_technique_ret, width_ret, +height_ret, levels_ret) +Display *display; +XiePhotomap photomap; +Bool *populated_ret; +XieDataType *datatype_ret; +XieDataClass *class_ret; +XieDecodeTechnique *decode_technique_ret; +XieLTriplet width_ret; +XieLTriplet height_ret; +XieLTriplet levels_ret; +Arguments +display Specifies a connection to an X server. +photomap Specifies the photomap to be queried. +populated_ret Returns the status of the photomap. +datatype_ret Returns the type of the data in the photomap. +class_ret Returns the class of the data in the photomap. +decode_technique_ret Returns the decode technique required to interpret the data. +width_ret Returns the width, in pixels per band. +height_ret Returns the height, in pixels per band. +levels_ret Returns the number of quantization levels per band. +Returns +Zero on failure, non-zero on success. +Description +A photomap is a server resource which stores image data. XieQueryPhotomap() sets +populated_ret to indicate whether or not photomap has been populated with attributes and data. +If populated_ret is False, all remaining fields contain zeros. + +datatype_ret shows whether the number of quantization levels is valid (constrained) or unknown +(unconstrained), and is set to one of the following standard data type values: + +xieValConstrained +xieValUnconstrained + +class_ret is the class of image data (i.e., single-band or triple-band), and is set to one of the +following standard data class values: + +xieValSingleBand +xieValTripleBand + +width_ret and height_ret are set to the dimensions of the image data in pixels (per band). +levels_ret is set to the potential dynamic range, or number of quantization levels (per band). If +datatype_ret is set to unconstrained, the returned values for levels are zeros. If class_ret is +xieValSingleBand, width_ret, height_ret, and levels_ret for unused bands are +returned as zeros. + +decode_technique_ret is set to the decode technique that will be required to interpret or +decompress the data. Decode techniques define the techniques that can be used to interpret +uncompressed image data or decode compressed images. decode_technique_ret can be set to +one of the following standard decode technique values: + +xieValDecodeUncompressedSingle +xieValDecodeUncompressedTriple +xieValDecodeG31D +xieValDecodeG32D +xieValDecodeG42D +xieValDecodeJPEGBaseline +xieValDecodeJPEGLossless +xieValDecodeTIFF2 +xieValDecodeTIFFPackBits + +If a vendor defined additional private decode techniques, decode_technique_ret can be set to +the values given to these techniques. +Structures +typedef unsigned XieDataClass; +typedef unsigned XieDataType; +typedef unsigned XieDecodeTechnique; +typedef unsigned long XieLTriplet[3]; +typedef XID XiePhotomap; + +/* Definitions of DataType */ +#define xieValConstrained 1 +#define xieValUnconstrained 2 + +/* Definitions of DataClass */ +#define xieValSingleBand 1 +#define xieValTripleBand 2 + +/* Definitions for DecodeTechniques */ +#define xieValDecodeUncompressedSingle 2 +#define xieValDecodeUncompressedTriple 3 +#define xieValDecodeG31D 4 +#define xieValDecodeG32D 6 +#define xieValDecodeG42D 8 +#define xieValDecodeJPEGBaseline 10 +#define xieValDecodeJPEGLossless 12 +#define xieValDecodeTIFF2 14 +#define xieValDecodeTIFFPackBits 16 +Errors +xieErrNoPhotomap The value for the photomap argument does not name a defined +photomap +xieErrNoFloAlloc Insufficient resources (e.g. memory) + XIElib - ROI Functions XieCreateROI +Name +XieCreateROI - Create a Rectangles-Of-Interest. +Synopsis +XieRoi XieCreateROI (display) +Display *display; +Arguments +display Specifies a connection to an X server. +Returns +The ROI (Rectangles-Of-Interest) identifier. +Description +XieCreateROI() creates a server ROI (Rectangles-Of-Interest) resource. +Structures +typedef XID XieRoi; +Errors +BadAlloc Insufficient resources +BadIDChoice Invalid ROI +See Also +XieDestroyROI(), XieFloImportClientROI(), XieFloImportROI(), XieFloExportClientROI(), +XieFloExportROI(). + XIElib - ROI Functions XieDestroyROI +Name +XieDestroyROI - destroy a Rectangles-Of-Interest. +Synopsis +void XieDestroyROI (display, roi) +Display *display; +XieRoi roi; +Arguments +display Specifies a connection to an X server. +roi Specifies the ID of the ROI to be destroyed. +Description +XieDestroyROI() destroys the Rectangles-Of-Interest (ROI) identified by roi. Once destroyed, +ROI ID is no longer valid. +Structures +typedef XID XieRoi; +Errors +xieErrNoROI The value for the roi argument does not name a defined ROI +See Also +XieCreateROI(). + XIElib - Immediate Photoflo Functions XieCreatePhotospace +Name +XieCreatePhotospace - create a photospace. +Synopsis +XiePhotospace XieCreatePhotospace (display) +Display *display; +Arguments +display Specifies a connection to an X server. +Returns +The photospace identifier. +Description +XieCreatePhotospace() returns a resource-id for a new photospace that can be used to +accommodate immediate photoflos instantiated by a client. Any client that needs to instantiate +immediate photoflos must create at least one photospace. +Structures +typedef XID XiePhotospace; +Errors +BadAlloc Insufficient resources +BadIDChoice Invalid photospace +See Also +XieDestroyPhotospace(), XieExecuteImmediate(). + XIElib - Immediate Photoflo Functions XieDestroyPhotospace +Name +XieDestroyPhotospace - destroy a photospace. +Synopsis +void XieDestroyPhotospace (display, photospace) +Display *display; +XiePhotospace photospace; +Arguments +display Specifies a connection to an X server. +photospace Specifies the ID of the photospace to be destroyed. +Description +XieDestroyPhotospace() destroys a photospace. Prior to destroying the photospace, all +photoflos that are currently active in the photospace will be aborted, exported data pending client +retrieval will be freed, and the photoflos will be destroyed. +Structures +typedef XID XiePhotospace; +Errors +xieErrNoPhotospace The value for the photospace argument does not name a defined +photospace +See Also +XieCreatePhotospace(). + XIElib - Immediate Photoflo Functions XieExecuteImmediate +Name +XieExecuteImmediate - define and begin execution of an immediate photoflo. +Synopsis +void XieExecuteImmediate (display, photospace, flo_id, notify, +elem_list, elem_count) +Display *display; +XiePhotospace photospace; +unsigned long flo_id; +Bool notify; +XiePhotoElement *elem_list; +int elem_count; +Arguments +display Specifies a connection to an X server. +photospace Specifies the ID of the photospace to be executed. +flo_id Specifies a particular instance of the photoflo to be executed. +notify Specifies whether a PhotofloDone event must be sent upon +completion. +elem_list Specifies the import, process, and export elements to be executed. +elem_count Specifies the number of items in elem_list. +Description +XieExecuteImmediate() begins the asynchronous execution of an immediate photoflo. The +server does not save a copy of an immediate photoflo after the photoflo has completed execution and +all data exported for the client have been retrieved. An immediate photoflo may therefore not be +modified or totally redefined prior to subsequent executions. It is legal to have multiple unique +instances of immediate photoflos (and stored photoflos) active concurrently. + +The photospace/flo_id argument pair specifies the instance by which this photoflo will be +identified in other requests, events, or errors. notify specifies whether a PhotofloDone event +must be sent upon completion. The PhotofloDone event notifies the client that a photoflo has left +the active state: it is no longer executing. elem_list defines the import, process, and export elements +to be executed. + +If any clients have blocked themselves during the execution of the photoflo (see XieAwait()), they +will become unblocked when the photoflo's state changes from active to nonexistent. + +Care should be taken that the argument pair elem_list/elem_count matches a returned value (an +array of XiePhotoElement structures) and argument count from a call to +XieAllocatePhotofloGraph(). +Structures +typedef XID XiePhotospace; + +typedef struct { + int elemType; + /* union of ALL element types */ + union { + ... + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloElement Invalid element type(s) in elem_list +xieErrNoFloID Invalid photospace/flo_id argument pair has been specified +xieErrNoFlo An error has been detected while defining, executing, or accessing a +photoflo (See Photoflo Errors). +See Also +XieAwait(), XieAllocatePhotofloGraph(). + XIElib - Photoflo Functions XieAllocatePhotofloGraph +Name +XieAllocatePhotofloGraph - allocate an array of XiePhotoElement structures. +Synopsis +XiePhotoElement *XieAllocatePhotofloGraph (count); +unsigned int count; +Arguments +count Specifies the number of XiePhotoElement structures to allocate. +Returns +The array of XiePhotoElement structures. +Description +XieAllocatePhotofloGraph() allocates and returns a pointer to an array of +XiePhotoElement structures; each field of each structure in the array is set to zero (0). + +To free the memory allocated to the list of XiePhotoElement structures, use +XieFreePhotofloGraph(). + +If XieAllocatePhotofloGraph() is unable to create an XiePhotoElement array , it returns +NULL. +Structures +typedef struct { + int elemType; + /* union of ALL element types */ + union { + ... + ... + } data; +} XiePhotoElement; +See Also +XieFreePhotofloGraph(), XieCreatePhotoflo(), XieModifyPhotoflo(), XieRedefinePhotoflo(), +XieExecutePhotoflo(), XieQueryPhotoflo(), XieDestroyPhotoflo(), XieExecuteImmediate(). + XIElib - Stored Photoflo Functions XieCreatePhotoflo +Name +XieCreatePhotoflo - create a stored photoflo. +Synopsis +XiePhotoflo XieCreatePhotoflo (display, elem_list, elem_count) +Display *display; +XiePhotoElement *elem_list; +int elem_count; +Arguments +display Specifies a connection to an X server. +elem_list Specifies the defining array of XiePhotoElement structures. +elem_count Specifies the number of XiePhotoElement structures in the array. +Returns +The photoflo identifier. +Description +XieCreatePhotoflo() creates a stored photoflo resource, defines its complete contents using the +contents of elem_list, sets it in the inactive state, and returns its resource-id. Stored photoflos +persist beyond execution and may be modified or totally redefined prior to subsequent executions. + +The returned photoflo identifier is a new resource-id which, along with the execution domain used for +the photoflo, identifies this photoflo in other requests, events, or errors. elem_list defines the +import, process, and export elements to be stored for execution. Although resources and parameters are +specified at creation, no action is taken to validate them at that time. XieCreatePhotoflo() will +only store the photoflo's definition: parameter validation is delayed until an execute request is received. +Structures +typedef XID XiePhotoflo; + +typedef struct { + int elemType; + /* union of ALL element types */ + union { + ... + ... + } data; +} XiePhotoElement; +Errors +BadAlloc Insufficient resources +BadIdChoice Invalid photoflo +xieErrNoFloAlloc Insufficient resources (e.g. memory) for elem_list +xieErrNoFloElement Invalid element type(s) in elem_list +xieErrNoFlo An error has been detected while defining, executing, or accessing a +photoflo (See Photoflo Errors). +See Also +XieAllocatePhotofloGraph(), XieFreePhotofloGraph(), XieModifyPhotoflo(), XieRedefinePhotoflo(), +XieExecutePhotoflo(), XieQueryPhotoflo(), XieDestroyPhotoflo(). + XIElib - Stored Photoflo Functions XieDestroyPhotoflo +Name +XieDestroyPhotoflo - destroy a stored photoflo. +Synopsis +void XieDestroyPhotoflo (display, photoflo) +Display *display; +XiePhotoflo photoflo; +Arguments +display Specifies a connection to an X server. +photoflo Specifies the photoflo to be destroyed. +Description +XieDestroyPhotoflo() destroys a stored photoflo. If photoflo is active, i.e., executing, it is +aborted and all exported data that are pending client retrieval are freed prior to destroying photoflo. +Structures +typedef XID XiePhotoflo; +Errors +xieErrNoPhotoflo The value for the photoflo argument does not name a defined +photoflo +See Also +XieAllocatePhotofloGraph(), XieFreePhotofloGraph(), XieCreatePhotoflo(), XieModifyPhotoflo(), +XieRedefinePhotoflo(), XieExecutePhotoflo(), XieQueryPhotoflo(). + XIElib - Stored Photoflo Functions XieExecutePhotoflo +Name +XieExecutePhotoflo - execute a stored photoflo. +Synopsis +void XieExecutePhotoflo (display, photoflo, notify) +Display *display; +XiePhotoflo photoflo; +Bool notify; +Arguments +display Specifies a connection to an X server. +photoflo Specifies the photoflo to be executed. +notify Specifies that a PhotofloDone event must be sent upon completion. +Description +XieExecutePhotoflo() changes a stored photoflo to the active state. Execution is +asynchronous. The photoflo returns to the inactive state when execution completes and all data +exported for the client have been retrieved. It is legal to have multiple stored photoflos (and immediate +photoflos) active concurrently. + +notify specifies that a PhotofloDone event must be sent upon completion. A PhotofloDone +event notifies the client that a photoflo has left the active state (it is no longer executing). + +Stored photoflos persist beyond execution and may be modified or totally redefined prior to subsequent +executions. +Structures +typedef XID XiePhotoflo; +Errors +xieErrNoPhotoflo The value for the photoflo argument does not name a defined +photoflo +xieErrNoFloAccess Attempt to execute photoflo when it is already active +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFlo An error has been detected while defining, executing, or accessing a +photoflo (See Photoflo Errors). +See Also +XieAllocatePhotofloGraph(), XieFreePhotofloGraph(), XieCreatePhotoflo(), XieModifyPhotoflo(), +XieRedefinePhotoflo(), XieQueryPhotoflo(), XieDestroyPhotoflo(), XieAbort(), XieAwait(), +XieGetClientData(), XiePutClientData(). + XIElib - Stored Photoflo Functions XieModifyPhotoflo +Name +XieModifyPhotoflo - modify a stored photoflo. +Synopsis +void XieModifyPhotoflo (display, photoflo, start, elem_list, +elem_count) +Display *display; +XiePhotoflo photoflo; +int start; +XiePhotoElement *elem_list; +int elem_count; +Arguments +display Specifies a connection to an X server. +photoflo Specifies the photoflo to be modified. +start Specifies the index where element replacement is to begin. +elem_list Specifies an array of elements which will replace existing elements. +elem_count Specifies the number of items in elem_list. +Description +XieModifyPhotoflo() allows element parameters of a stored photoflo to be modified. Stored +photoflos persist beyond execution and may be modified prior to subsequent executions. + +start is the position or index of an element within an array of elements used to specify a photoflo; the +first element in the array has a start value of one (1). + +XieModifyPhotoflo() only allows parameter modification. No topological changes are allowed: +elements cannot be deleted, inserted, or appended. +Structures +typedef XID XiePhotoflo; + +typedef struct { + int elemType; + /* union of ALL element types */ + union { + ... + ... + } data; +} XiePhotoElement; +Errors +xieErrNoPhotoflo The value for the photoflo argument does not name a defined +photoflo +xieErrNoFloAccess Attempt to change photoflo when it is already active +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloElement Invalid element type(s) in elem_list or +attempt to append additional element(s) to photoflo +xieErrNoFloSource An invalid start has been specified or +attempt to change input connections of type XiePhototag in +elem_list +xieErrNoFlo An error has been detected while defining, executing, or accessing a +photoflo (See Photoflo Errors). +See Also +XieAllocatePhotofloGraph(), XieFreePhotofloGraph(), XieCreatePhotoflo(), XieRedefinePhotoflo(), +XieExecutePhotoflo(), XieQueryPhotoflo(), XieDestroyPhotoflo(). + XIElib - Stored Photoflo Functions XieRedefinePhotoflo +Name +XieRedefinePhotoflo - redefine a stored photoflo. +Synopsis +void XieRedefinePhotoflo (display, photoflo, elem_list, elem_count) +Display *display; +XiePhotoflo photoflo; +XiePhotoElement *elem_list; +int elem_count; +Arguments +display Specifies a connection to an X server. +photoflo Specifies the photoflo to be redefined. +elem_list Specifies an array of elements which will replace all existing elements. +elem_count Specifies the number of items in elem_list. +Description +XieRedefinePhotoflo() allows all elements of a stored photoflo to be removed and replaced +with a new list. Stored photoflos persist beyond execution and may be totally redefined prior to +subsequent executions. + +There are no restrictions on changing element types or the array's size. +Structures +typedef XID XiePhotoflo; + +typedef struct { + int elemType; + /* union of ALL element types */ + union { + ... + ... + } data; +} XiePhotoElement; +Errors +xieErrNoPhotoflo The value for the photoflo argument does not name a defined +photoflo +xieErrNoFloAccess Attempt to change photoflo when it is already active +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloElement Invalid element type(s) in elem_list +xieErrNoFlo An error has been detected while defining, executing, or accessing a +photoflo (See Photoflo Errors). +See Also +XieAllocatePhotofloGraph(), XieFreePhotofloGraph(), XieCreatePhotoflo(), XieModifyPhotoflo(), +XieExecutePhotoflo(), XieQueryPhotoflo(), XieDestroyPhotoflo(), XieExecuteImmediate(). + XIElib - Photoflo Functions XieQueryPhotoflo +Name +XieQueryPhotoflo - return the current status of a photoflo. +Synopsis +XieQueryPhotoflo(display, name_space, flo_id, state_ret, +data_expected_ret, nexpected_ret, data_available_ret, +navailable_ret) +Display *display; +unsigned long name_space; +unsigned long flo_id; +XiePhotofloState *state_ret; +XiePhototag **data_expected_ret; +unsigned int *nexpected_ret; +XiePhototag **data_available_ret; +unsigned int *navailable_ret; +Arguments +display Specifies a connection to an X server. +name_space Specifies the execution domain used for the photoflo to query. +flo_id Specifies a particular instance of the photoflo to query. +state_ret Returns the state of the photoflo. +data_expected_ret Returns a list of ImportClient elements. +nexpected_ret Returns the length of data_expected_ret. +data_available_ret Returns a list of ExportClient elements. +navailable_ret Returns the length of data_available_ret. +Returns +Zero on failure, non-zero on success. +Description +XieQueryPhotoflo() will return the current status of a photoflo. + +The name_space/flo_id argument pair specifies the instance that identifies the photoflo which is +being queried. state_ret indicates the state of the photoflo, and if XieQueryPhotoflo() is +successful, will return one of the following standard photoflo state values: + +xieValInactive +xieValActive +xieValNonexistent + +data_expected_ret is a list of ImportClient elements that are expecting data via +XiePutClientData(). data_available_ret is a list of ExportClient elements from which +data are available (via XieGetClientData()). Either or both of these lists may be of length zero, +indicated by the returned values of nexpected_ret and navailable_ret. + +XieQueryPhotoflo() allocates memory for the list of ImportClient elements and the list of +ExportClient elements. To free the memory allocated to data_expected_ret and +data_available_ret, use XFree(). + +Specifying an unknown or invalid instance will return a state_ret of nonexistent and zero length +data_expected_ret and data_available_ret lists. +Structures +typedef unsigned XiePhotofloState; + +/* Definitions of PhotofloState */ +#define xieValInactive 1 +#define xieValActive 2 +#define xieValNonexistent 3 +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +See Also +XieAllocatePhotofloGraph(), XieFreePhotofloGraph(), XieCreatePhotoflo(), XieModifyPhotoflo(), +XieRedefinePhotoflo(), XieExecutePhotoflo(), XieQueryPhotoflo(), XieDestroyPhotoflo(), +XieGetClientData(), XiePutClientData(), XieExecuteImmediate(). + XIElib - Client Data Functions XiePutClientData +Name +XiePutClientData - send a stream of data to an active photoflo. +Synopsis +void XiePutClientData (display, name_space, flo_id, element, final, +band_number, data, nbytes) +Display *display; +unsigned long name_space; +unsigned long flo_id; +XiePhototag element; +Bool final; +unsigned band_number; +unsigned char *data; +unsigned nbytes; +Arguments +display Specifies a connection to an X server. +name_space Specifies the execution domain used for the photoflo to receive the data. +flo_id Specifies a particular instance of the photoflo to receive the data. +element Specifies the element to receive the data. +final Specifies if the data is the last segment of data to be sent. +band_number Specifies which band of data is being sent. +data Specifies a counted list of bytes that comprises the data stream. +nbytes Specifies the count of bytes that comprises the data stream. +Description +XiePutClientData() sends a stream of data to an active photoflo. Since the complete data object +may be larger than can fit in a single protocol request, XIE allows the stream to be segmented; the last +segment is signaled with a final flag. + +The organization and contents of the data stream must match the parameters given to the ImportClient +element or the results are undefined. An arbitrary amount of image data can be sent per request, +whereas for non-image data one or more complete aggregates must be sent per request (e.g. one or more +LUT array entries). If too many data are sent (e.g. too many rectangles, or too many scanlines), the +unwanted data are discarded. It is an error, however, to send too few data prior to signaling final. + +For stored photoflos, name_space is always ServerIDSpace (the value zero) and flo_id is the +photoflo's resource-id. For immediate photoflos name_space is a photospace resource-id and +flo_id is a thirty-two (32) bit value that uniquely identifies the instance of the photoflo within +name_space. +Structures +typedef unsigned XiePhototag; +Errors +xieErrNoFloAccess Executable photospace/flo_id argument pair not active +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloElement Invalid element type specified by element +xieErrNoFloID Invalid photospace/flo_id argument pair has been specified +xieErrNoFloValue Invalid band_number or +for non-image data, data contains a partial aggregate +See Also +XieGetClientData(), XieQueryPhotoflo(), XieExecutePhotoflo(), XieFloImportClientPhoto(), +XieFloImportClientROI(), XieTecDecodeUncompressedSingle(), +XieTecDecodeUncompressedTriple(), XieTecDecodeG31D(), XieTecDecodeG32D(), +XieTecDecodeG42D(), XieTecDecodeTIFF2(), XieTecDecodeTIFFPackBits(), +XieTecDecodeJPEGBaseline(), XieTecDecodeJPEGLossless(). + XIElib - Client Data Functions XieGetClientData +Name +XieGetClientData - retrieve data from an ExportClient element within an active photoflo. +Synopsis +Status XieGetClientData (display, name_space, flo_id, element, +max_bytes, terminate, band_number, new_state_ret, +data_ret, nbytes_ret) +Display *display; +unsigned long name_space; +unsigned long flo_id; +XiePhototag element; +unsigned max_bytes; +Bool terminate; +unsigned band_number; +XieExportState *new_state_ret; +unsigned char **data_ret; +unsigned *nbytes_ret; +Arguments +display Specifies a connection to an X server. +name_space Specifies the execution domain used for the photoflo from which to +retrieve data. +flo_id Specifies a particular instance of the photoflo from which to retrieve +data. +element Specifies the element from which to retrieve the data. +max_bytes Specifies the maximum number of bytes that can be sent to the client. +terminate Specifies whether more data are wanted after this request. +band_number Specifies which band of data is being retrieved. +new_state_ret Returns the status of the ExportClient element after this request. +data_ret Returns a counted list of bytes that comprises the data stream. +nbytes_ret Returns the count of bytes that comprises the data stream. +Returns +Zero on failure, non-zero on success. +Description +XieGetClientData() returns data in a contiguous read-once byte stream, which can be requested +in segments that are limited in size by the amount the client desires or the amount of data available from +the server. The format of the data depends on the parameters given to the ExportClient element from +which the data are requested. + +new_state_ret returns the state of the ExportClient element after this request and can be set to one +of the following standard export state values: + +xieValExportDone +xieValExportMore +xieValExportEmpty +xieValExportError + +If the request is sent to an ExportClient element that either: does not have any data, was terminated by a +previous XieGetClientData() call, or has already returned all its data (ExportDone sent), the +request will return a zero length data_ret stream. + +Image data are always retrieved from the server as a byte stream, whereas non-image data are always +returned by the server as one or more complete aggregates. max_bytes is effectively rounded down +by the server to the match the nearest aggregate size. + +For stored photoflos, name_space is always ServerIDSpace (the value zero) and flo_id is the +photoflo's resource-id. For immediate photoflos name_space is a photospace resource-id and +flo_id is a thirty-two (32) bit value that uniquely identifies the instance of the photoflo within +name_space. + +To free the memory allocated to data_ret, use XFree(). +Structures +typedef unsigned XieExportState; +typedef unsigned XiePhototag; + +/* Definitions of ExportState */ +#define xieValExportDone 1 +#define xieValExportMore 2 +#define xieValExportEmpty 3 +#define xieValExportError 4 +Errors +xieErrNoFloAccess Executable photospace/flo_id argument pair not active +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloElement Invalid element type specified by element +xieErrNoFloID Invalid photospace/flo_id argument pair has been specified +xieErrNoFloValue Invalid band_number +See Also +XiePutClientData(), XieQueryPhotoflo(), XieExecutePhotoflo(), XieFloExportClientHistogram(), +XieFloExportClientLUT(), XieFloExportClientPhoto(), XieFloExportClientROI(), +XieTecEncodeUncompressedSingle(), XieTecEncodeUncompressedTriple(), XieTecEncodeG31D(), +XieTecEncodeG32D(), XieTecEncodeG42D(), XieTecEncodeJPEGBaseline(), +XieTecEncodeJPEGLossless(), XieTecEncodeTIFF2(), XieTecEncodeTIFFPackbits(). + XIElib - Abort and Await Functions XieAbort +Name +XieAbort - prematurely terminate execution of a photoflo. +Synopsis +void XieAbort (display, name_space, flo_id); +Display *display; +unsigned long name_space; +unsigned long flo_id; +Arguments +display Specifies a connection to an X server. +name_space Specifies the execution domain used for the photoflo to abort. +flo_id Specifies a particular instance of the photoflo to abort. +Description +XieAbort() will prematurely terminate execution of the photoflo specified by name_space and +flo_id. Any output from the photoflo that is pending client retrieval is freed. Stored photoflos are +returned to the inactive state; immediate photoflos are destroyed. + +If the photoflo specified by name_space and flo_id is either invalid or not active no action is +taken; it is not an error, and nothing is destroyed. + +For stored photoflos, name_space is always ServerIDSpace (the value zero) and flo_id is the +photoflo's resource-id. For immediate photoflos name_space is a photospace resource-id and +flo_id is a thirty-two (32) bit value that uniquely identifies the instance of the photoflo within +name_space. +See Also +XieExecutePhotoflo(). + XIElib - Abort and Await Functions XieAwait +Name +XieAwait - block all further requests for this client connection from being honored by the server while +the photoflo is active. +Synopsis +void XieAwait (display, name_space, flo_id); +Display *display; +unsigned long name_space; +unsigned long flo_id; +Arguments +display Specifies a connection to an X server. +name_space Specifies the execution domain used for the photoflo to block requests. +flo_id Specifies a particular instance of the photoflo to block requests. +Description +XieAwait() blocks all further requests for this client connection from being honored by the server +while the photoflo, specified by name_space and flo_id, is active. When the photoflo transitions +from the active state, blocked requests are allowed to be processed in the order received. + +If the photoflo specified by name_space and flo_id is either invalid or not active no action is +taken; it is not an error, and the client is not blocked. + +For stored photoflos, name_space is always ServerIDSpace (the value zero) and flo_id is the +photoflo's resource-id. For immediate photoflos name_space is a photospace resource-id and +flo_id is a thirty-two (32) bit value that uniquely identifies the instance of the photoflo within +name_space. +Warning +Calling XieAwait() before sending all import data or before retrieving all export data, will block the +client from sending or retrieving the remaining data. This will also prevent completion of the photoflo +and prevent any and all protocol requests from this client from being honored. This deadlock can only +be broken by another client completing or aborting the photoflo (to release the Await), or by breaking +the client connection. +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +See Also +XieExecuteImmediate(). + XIElib - Photoflo Element Functions XieFloImportClientLUT +Name +XieFloImportClientLUT - specify an ImportClientLUT element and set its parameters. +Synopsis +void XieFloImportClientLUT (element, data_class, band_order, length, +levels) +XiePhotoElement *element; +XieDataClass data_class; +XieOrientation band_order; +XieLTriplet length; +XieLevels levels; +Arguments +element Specifies the XiePhotoElement structure to use. +data_class Specifies the number of lookup arrays to expect. +band_order Specifies the order of triple band arrays. +length Specifies the number of entries per array. +levels Specifies the number of quantization levels represented per array. +Description +An ImportClientLUT element accepts lookup table data from the protocol stream. The transport of data +through the protocol stream is accomplished using XiePutClientData(). This data is accepted +by the Point, ExportLUT, and ExportClientLUT elements. + +data_class, which specifies the number of lookup arrays to expect, can be set to one of the +following standard data class values: + +xieValSingleBand +xieValTripleBand + +The length of each array should match the number of source image levels that will be remapped +through the array. When a triple band image is to be remapped through a single band array, the +length of the array should match the product of the source image levels of all three bands; in this +case, band_order specifies the order in which pixels from a triple band image should be combined to +form indices for a single band array. band_order can be set to one of the following standard +orientation values: + +xieValLSFirst +xieValMSFirst + +The least significant band of trichromatic data is the first band mentioned in the common name of the +colorspace: red is the least significant band of RGB data. When one LUT array is used with triple band +data, the algorithm for computing combined array indices, based on band_order, is: + +LUT band-order +LUT indexing algorithm for combining pixel values + +LSFirst +index = value[0] + value[1] x levels[0] + value[2] x levels[0] x levels[1] + +MSFirst +index = value[2] + value[1] x levels[2] + value[0] x levels[2] x levels[1] + + +When three LUT arrays are used, band_order specifies whether this band corresponds with the +least significant or most significant LUT array. Each array is transported as a separate data stream: + +band +LSFirst +MSFirst + +0 +Red array +Blue array + +1 +Green array +Green array + +2 +Blue array +Red array + +Structures +XieFloImportClientLUT() sets the XiePhotoElement structure field elemType to +xieElemImportClientLUT, which identifies the element as an ImportClientLUT, and sets the +fields of the member structure ImportClientLUT using the arguments in the argument list. + +typedef unsigned XieDataClass; +typedef unsigned XieOrientation; +typedef unsigned long XieLTriplet[3]; +typedef unsigned long XieLevels[3]; + +typedef struct { + int elemType; + union { + ... + struct { + XieDataClass data_class; + XieOrientation band_order; + XieLTriplet length; + XieLevels levels; + } ImportClientLUT; + ... + } data; +} XiePhotoElement; + +/* Definitions of DataClass */ +#define xieValSingleBand 1 +#define xieValTripleBand 2 + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloMatch levels is incompatible with the server's depth handling capabilities +xieErrNoFloValue Invalid data_class or data_class +See Also +XiePutClientData(), XieQueryPhotoflo(), XieFloExportLUT(), XieFloExportClientLUT(), +XieFloPoint(), XieFloImportLUT(). + XIElib - Photoflo Element Functions XieFloImportClientPhoto +Name +XieFloImportClientPhoto - specify an ImportClientPhoto element and set its parameters. +Synopsis +void XieFloImportClientPhoto (element, data_class, width, height, +levels, notify, decode_tech, decode_param) +XiePhotoElement *element; +XieDataClass data_class; +XieLTriplet width; +XieLTriplet height; +XieLevels levels; +Bool notify; +XieDecodeTechnique decode_tech; +XiePointer decode_param; +Arguments +element Specifies the XiePhotoElement structure to use. +data_class Specifies whether the data is single band or triple band. +width Specifies the width of the image in pixels per band. +height Specifies the height of the image in pixels per band. +levels Specifies the number of quantization levels per band. +notify Specifies whether to enable sending DecodeNotify events. +decode_tech Specifies the decode technique required to interpret the image. +decode_param Specifies the list of additional parameters required by decode_tech. +Description +An ImportClientPhoto element accepts image data from the protocol stream. This data may be +processed for display or used as process domain data. A process domain is inserted in many element +definitions and is used to restrict the element's processing to a subset of the source data pixels. The +attributes and organization of the expected data stream are fully specified by the parameters. The actual +transport of image data through the protocol stream is requested using XiePutClientData(). + +notify enables DecodeNotify events to be sent if anomalies are encountered while interpreting +the imported image data: either an error has been encountered while decoding an image, or the image +data received does not satisfy the expected dimensions. + +Only constrained data can be sent through the protocol stream; therefore, levels must be valid. + +data_class specifies whether the data is single band or triple band and can be set to one of the +following standard data class values: + +xieValSingleBand +xieValTripleBand + +Decode techniques define the techniques that can be used to interpret uncompressed image data or +decode compressed images. decode_tech can be assigned one of the following standard decode +technique values: + +xieValDecodeUncompressedSingle +xieValDecodeUncompressedTriple +xieValDecodeG31D +xieValDecodeG32D +xieValDecodeG42D +xieValDecodeJPEGBaseline +xieValDecodeJPEGLossless +xieValDecodeTIFF2 +xieValDecodeTIFFPackBits + +If a vendor defined additional private decode techniques, the values given to these techniques can be +assigned to decode_tech. +Output Attributes +Class class of imported image +Type constrained +Width width of imported image (in pixels) +Height height of imported image (in pixels) +Levels levels of imported image +Structures +XieFloImportClientPhoto() sets the XiePhotoElement structure field elemType to +xieElemImportClientPhoto, which identifies the element as an ImportClientPhoto, and sets the +fields of the member structure ImportClientPhoto using the arguments in the argument list. + +typedef unsigned XieDataClass; +typedef unsigned XieDecodeTechnique; +typedef unsigned long XieLTriplet[3]; +typedef unsigned long XieLevels[3]; + +typedef struct { + int elemType; + union { + ... + struct { + XieDataClass data_class; + XieLTriplet width; + XieLTriplet height; + XieLevels levels; + Bool notify; + XieDecodeTechnique decode_tech; + XiePointer decode_param; + } ImportClientPhoto; + ... + } data; +} XiePhotoElement; + +/* Definitions of DataClass */ +#define xieValSingleBand 1 +#define xieValTripleBand 2 + +/* Definitions for DecodeTechniques */ +#define xieValDecodeUncompressedSingle 2 +#define xieValDecodeUncompressedTriple 3 +#define xieValDecodeG31D 4 +#define xieValDecodeG32D 6 +#define xieValDecodeG42D 8 +#define xieValDecodeJPEGBaseline 10 +#define xieValDecodeJPEGLossless 12 +#define xieValDecodeTIFF2 14 +#define xieValDecodeTIFFPackBits 16 +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloMatch levels is incompatible with the server's depth handling capabilities +xieErrNoFloTechnique Invalid decode_tech or decode_param +xieErrNoFloValue Invalid width, height, levels (zero) or +invalid data_class +See Also +XiePutClientData(), XieQueryPhotoflo(). +XieTecDecodeUncompressedSingle(), XieTecDecodeUncompressedTriple(), XieTecDecodeG31D(), +XieTecDecodeG32D(), XieTecDecodeG42D(), XieTecDecodeTIFF2(), XieTecDecodeTIFFPackBits(), +XieTecDecodeJPEGBaseline(), XieTecDecodeJPEGLossless(). +XieFloExportPhotomap(), XieFloExportClientPhoto(), XieFloImportPhotomap(). + XIElib - Photoflo Element Functions XieFloImportClientROI +Name +XieFloImportClientROI - specify an ImportClientROI element and set its parameters. +Synopsis +void XieFloImportClientROI (element, rectangles); +XiePhotoElement *element; +unsigned int rectangles; +Arguments +element Specifies the XiePhotoElement structure to use. +rectangles Specifies the number of rectangles expected. +Description +An ImportClientROI element accepts a list of rectangles from the protocol stream. These data can be +used as input to a process domain or an ExportROI or ExportClientROI element. A process domain is +inserted in many element definitions and is used to restrict the element's processing to a subset of the +source data pixels. The actual transport of data through the protocol stream is accomplished using +XiePutClientData() (the band_number parameter of XiePutClientData() is ignored). +Structures +XieFloImportClientROI() sets the XiePhotoElement structure field elemType to +xieElemImportClientROI, which identifies the element as an ImportClientROI, and sets the +fields of the member structure ImportClientROI using the arguments in the argument list. + +typedef struct { + int elemType; + union { + ... + struct { + unsigned int rectangles; + } ImportClientROI; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +See Also +XiePutClientData(), XieQueryPhotoflo(). +XieFloExportROI(), XieFloExportClientROI(), XieFloImportROI(). + XIElib - Photoflo Element Functions XieFloImportDrawable +Name +XieFloImportDrawable - specify an ImportDrawable element and set its parameters. +Synopsis +void XieFloImportDrawable (element, drawable, src_x, src_y, width, +height, fill, notify) +XiePhotoElement *element; +Drawable drawable; +int src_x; +int src_y; +unsigned int width; +unsigned int height; +unsigned long fill; +Bool notify; +Arguments +element Specifies the XiePhotoElement structure to use. +drawable Specifies the Drawable resource supplying the data. +src_x Specifies the left corner of the region of the data to be imported. +src_y Specifies the upper corner of the region of the data to be imported. +width Specifies the width of the region of the data to be imported. +height Specifies the height of the region of the data to be imported. +fill Specifies the Colormap index to use for all regions that are obscured. +notify Specifies whether to enable sending ImportObscured events. +Description +An ImportDrawable element allows access to data existing in a Drawable. This data may be +processed for display or, if drawable is one bit deep, used as process domain data. A process +domain is inserted in many element definitions and is used to restrict the element's processing to a +subset of the source data pixels. + +notify enables ImportObscured events to be sent if data for one or more regions of a Window +are obscured and cannot be retrieved from backing store. The arguments src_x, src_y, width, and +height specify the region of data to be imported from drawable, where src_x and src_y define +the upper-left corner of the region. +Output Attributes +Class single band +Type constrained +Width width +Height height +Levels 2depth (i.e. drawable depth) +Structures +XieFloImportDrawable() sets the XiePhotoElement structure field elemType to +xieElemImportDrawable, which identifies the element as an ImportDrawable, and sets the fields +of the member structure ImportDrawable using the arguments in the argument list. + +typedef struct { + int elemType; + union { + ... + struct { + Drawable drawable; + int src_x; + int src_y; + unsigned int width; + unsigned int height; + unsigned long fill; + Bool notify; + } ImportDrawable; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloDrawable Invalid drawable +xieErrNoFloValue Invalid region width, height, src_x, src_y + XIElib - Photoflo Element Functions XieFloImportDrawablePlane +Name +XieFloImportDrawablePlane - specify an ImportDrawablePlane element and set its parameters. +Synopsis +void XieFloImportDrawablePlane (element, drawable, src_x, src_y, +width, height, fill, bit_plane, notify) +XiePhotoElement *element; +Drawable drawable; +int src_x; +int src_y; +unsigned int width; +unsigned int width; +unsigned long fill; +unsigned long bit_plane; +Bool notify; +Arguments +element Specifies the XiePhotoElement structure to use. +drawable Specifies the Drawable resource supplying the data. +src_x Specifies the left corner of the region of the data to be imported. +src_y Specifies the upper corner of the region of the data to be imported. +width Specifies the width of the region of the data to be imported. +height Specifies the height of the region of the data to be imported. +fill Specifies the Colormap index to use for all regions that are obscured. +bit_plane Specifies the plane to be imported from drawable. +notify Specifies whether to enable sending ImportObscured events. +Description +An ImportDrawablePlane event allows access to a single plane of data existing in a Drawable. This +data may be processed for display or used as process domain data. A process domain is inserted in +many element definitions and is used to restrict the element's processing to a subset of the source data +pixels. + +notify enables ImportObscured events to be sent if data for one or more regions of a Window +are obscured and cannot be retrieved from backing store. The arguments src_x, src_y, width, and +height specify the region of data to be imported from drawable, where src_x and src_y define +the upper-left corner of the region. + +bit_plane must have exactly one bit set to one (1), and the value of bit_plane must be less than +2n, where n is the depth of drawable. This single bit selects the corresponding bit to be extracted +from pixels within drawable. +Output Attributes +Class single band +Type constrained +Width width +Height height +Levels 2 +Structures +XieFloImportDrawablePlane() sets the XiePhotoElement structure field elemType to +xieElemImportDrawablePlane, which identifies the element as an ImportDrawablePlane, and +sets the fields of the member structure ImportDrawablePlane using the arguments in the +argument list. + +typedef struct { + int elemType; + union { + ... + struct { + Drawable drawable; + int src_x; + int src_y; + unsigned int width; + unsigned int height; + unsigned long fill; + unsigned long bit_plane; + Bool notify; + } ImportDrawablePlane; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloDrawable Invalid drawable +xieErrNoFloValue Invalid bit_plane or region width, height, src_x, src_y + XIElib - Photoflo Element Functions XieFloImportLUT +Name +XieFloImportLUT - specify an ImportLUT element and set its parameters. +Synopsis +void XieFloImportLUT (element, lut) +XiePhotoElement *element; +XieLut lut; +Arguments +element Specifies the XiePhotoElement structure to use. +lut Specifies the LUT resource supplying the lookup table. +Description +An ImportLUT element allows access to lookup table data existing in a LUT resource. These data are +accepted by the Point, ExportLUT, and ExportLUT elements. + +Attributes of the lookup table data are inherited from lut. +Structures +XieFloImportLUT() sets the XiePhotoElement structure field elemType to +xieElemImportLUT, which identifies the element as an ImportLUT, and sets the fields of the +member structure ImportLUT using the arguments in the argument list. + +typedef XID XieLut; + +typedef struct { + int elemType; + union { + ... + struct { + XieLut lut; + } ImportLUT; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAccess Attempt to import from lut before it has been populated +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloLUT An unknown lut has been specified + XIElib - Photoflo Element Functions XieFloImportPhotomap +Name +XieFloImportPhotomap - specify an ImportPhotomap element and set its parameters. +Synopsis +void XieFloImportPhotomap (element, photomap, notify) +XiePhotoElement *element; +XiePhotomap photomap; +Bool notify; +Arguments +element Specifies the XiePhotoElement structure to use. +photomap Specifies the photomap resource supplying image data. +notify Specifies whether to enable sending DecodeNotify events. +Description +An ImportPhotomap element allows access to image data existing in a photomap; a photomap is a +server resource which can be used to store image data. This data may be processed for display or used +as process domain data. A process domain is inserted in many element definitions and is used to +restrict the element's processing to a subset of the source data pixels. + +notify enables DecodeNotify events to be sent if anomalies are encountered while decoding +compressed data: either an error has been encountered while decoding an image, or the image data +received does not satisfy the expected dimensions. + +Attributes of the source data are inherited from photomap. +Output Attributes +Class same as photomap +Type same as photomap +Width same as photomap +Height same as photomap +Levels same as photomap +Structures +XieFloImportPhotomap() sets the XiePhotoElement structure field elemType to +xieElemImportPhotomap, which identifies the element as an ImportPhotomap, and sets the fields +of the member structure ImportPhotomap using the arguments in the argument list. + +typedef XID XiePhotomap; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhotomap photomap; + Bool notify; + } ImportPhotomap; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAccess Attempt to import from photomap before it has been populated +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloPhotomap An unknown photomap has been specified + XIElib - Photoflo Element Functions XieFloImportROI +Name +XieFloImportROI - specify an ImportROI element and set its parameters. +Synopsis +void XieFloImportROI (element, roi) +XiePhotoElement *element; +XieRoi roi; +Arguments +element Specifies the XiePhotoElement structure to use. +roi Specifies the ID of the ROI supplying the list-of-rectangles. +Description +An ImportROI element allows access to a list-of-rectangles existing in a ROI resource. This data may be +referenced by a process domain. A process domain is inserted in many element definitions and is used +to restrict the element's processing to a subset of the source data pixels. +Structures +XieFloImportROI() sets the XiePhotoElement structure field elemType to +xieElemImportROI, which identifies the element as an ImportROI, and sets the fields of the +member structure ImportROI using the arguments in the argument list. + +typedef XID XieRoi; + +typedef struct { + int elemType; + union { + ... + struct { + XieRoi roi; + } ImportROI; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAccess Attempt to import from roi before it has been populated +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloPhotomap An unknown roi has been specified + XIElib - Photoflo Element Functions XieFloArithmetic +Name +XieFloArithmetic - specify an Arithmetic element and set its parameters. +Synopsis +void XieFloArithmetic (element, src1, src2, domain, constant, +operator, band_mask) +XiePhotoElement *element; +XiePhototag src1; +XiePhototag src2; +XieProcessDomain *domain; +XieConstant constant; +XieArithmeticOp operator; +unsigned int band_mask; +Arguments +element Specifies the XiePhotoElement structure to use. +src1 Specifies the first data source. +src2 Specifies the second data source. +domain Specifies the subset of source data that will be operated on. +constant Specifies the constant data source. +operator Specifies the arithmetic operation to be performed. +band_mask Specifies which bands are to be operated upon. +Description +An Arithmetic element produces output data by performing an addition, subtraction, minimum, or +maximum operation between two data sources or between a single data source and a constant. +Furthermore, multiplication, division, or gamma correction may by applied to a single data source. + +When two sources are involved, src1 and src2 are the phototags of the elements supplying source +data (constant is ignored). A phototag is the position or index of an element within an array of +elements used to specify a photoflo; the first element in the array has a phototag value of one (1). If the +operation is to involve a constant, src1 is one operand, src2 must be zero, and constant is used +as the other operand. + +When two sources are involved, all attributes, other than width and height, must match; all output +attributes are inherited from src1. + +In order to specify a subset of source data that will be operated on, the phototag, offset_x, and +offset_y fields of the XieProcessDomain structure pointed to by domain must be supplied; +XIElib does not provide a convenience function to create and/or fill in an XieProcessDomain +structure. If the entire source data is to be operated on, a pointer to an XieProcessDomain +structure must still be provided, with the phototag field set to zero (0); the offset_x and +offset_y fields are ignored. + +Only bands selected by band_mask are subject to processing. Other bands present in the image are +passed through to the output. For example, a band_mask of 0012 indicates that only the least +significant band would be processed; operating on all bands requires a band_mask of 1112. Using +band_mask to select source data that have two (2) or less levels is not permitted. + +Pixel computations that would lead to errors, will yield valid server-dependent values (e.g. dividing by a +constrained pixel value of zero might result in a value of levels-1). + +The valid operations for the Arithmetic process element are: + +Operator +src1 (operator) src2 +src1 (operator) constant + +xieValAdd +src1 + src2 +src1 + constant + +xieValSub +src1 - src2 +src1 - constant + +xieValSubRev +src2 - src1 +constant - src1 + +xieValMul +src1 * constant + + +xieValDiv +src1 / constant + + +xieValDivRev +constant / src1 + + +xieValMin +minimum( src1, src2 ) +minimum( src1, constant ) + +xieValMax +maximum( src1, src2 ) +maximum( src1, constant ) + +xieValGamma +(constrained) +(levels - 1) * ((src1 / (levels - 1))constant) + + +xieValGamma +(unconstrained) +src1constant + + +Output Attributes +Class same as src1 +Type same as src1 +Width same as src1 +Height same as src1 +Levels same as src1 +Structures +XieFloArithmetic() sets the XiePhotoElement structure field elemType to +xieElemArithmetic, which identifies the element as an Arithmetic, and sets the fields of the +member structure Arithmetic using the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef float XieConstant[3]; +typedef unsigned XieArithmeticOp; +typedef struct { + int offset_x; + int offset_y; + XiePhototag phototag; +} XieProcessDomain; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src1; + XiePhototag src2; + XieProcessDomain domain; + XieConstant constant; + XieArithmeticOp operator; + unsigned int band_mask; + } Arithmetic; + ... + } data; +} XiePhotoElement; + +/* Definitions of ArithmeticOperations */ +#define xieValAdd 1 +#define xieValSub 2 +#define xieValSubRev 3 +#define xieValMul 4 +#define xieValDiv 5 +#define xieValDivRev 6 +#define xieValMin 7 +#define xieValMax 8 +#define xieValGamma 9 +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloDomain Invalid domain +xieErrNoFloMatch Class, type or levels differ between src1 and src2 or +selected data source are bitonal +xieErrNoFloOperator Invalid operator +xieErrNoFloSource Invalid src1 or src2 or +src2 has been specified with a monadic operator + XIElib - Photoflo Element Functions XieFloBandCombine +Name +XieFloBandCombine - specify a BandCombine element and set its parameters. +Synopsis +void XieFloBandCombine (element, src1, src2, src3) +XiePhotoElement *element; +XiePhototag src1; +XiePhototag src2; +XiePhototag src3; +Arguments +element Specifies the XiePhotoElement structure to use. +src1 Specifies the first element supplying source data. +src2 Specifies the second element supplying source data. +src3 Specifies the third element supplying source data. +Description +A BandCombine element merges three single band data sources to produce a triple band result. The +arguments src1, src2, and src3 must be of the same type, and each source must be single band. +Other attributes which are taken from the individual sources may differ. The output will be triple band. +Output Attributes +Class triple band +Type same as src1 +Width same as srcs +Height same as srcs +Levels same as srcs +Structures +XieFloBandCombine() sets the XiePhotoElement structure field elemType to +xieElemBandCombine, which identifies the element as a BandCombine, and sets the fields of the +member structure BandCombine using the arguments in the argument list. + +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src1; + XiePhototag src2; + XiePhototag src3; + } BandCombine; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloMatch A source has more than one band or +type differs between sources +xieErrNoFloSource Invalid src1, src2, or src3 + XIElib - Photoflo Element Functions XieFloBandExtract +Name +XieFloBandExtract - specify a BandExtract element and set its parameters. +Synopsis +void XieFloBandExtract (element, src, levels, bias, coefficients) +XiePhotoElement *element; +XiePhototag src; +unsigned int levels; +double bias; +XieConstant coefficients; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +levels Specifies the number of quantization levels for the output. +bias Specifies the value to be added to each output pixel. +coefficients Specifies the proportion of each source band pixel to be used. +Description +A BandExtract element produces single band output data from a triple band source by multiplying a +pixel value from each source band by its corresponding coefficient and then summing the results with +the bias value. + +coefficients is a three (3) element array that determines the proportion of each source band pixel +that is used to form the output. levels is used as the levels attribute of the output data if the src +data are constrained, otherwise it is ignored. + +The source data must be triple band, and all bands must have equal dimensions. The output data will be +single band, with levels taken from the levels parameter, if the data type is constrained. All other +attributes are inherited from src. +Output Attributes +Class single band +Type same as src +Width same as src +Height same as src +Levels levels or unknown +Structures +XieFloBandExtract() sets the XiePhotoElement structure field elemType to +xieElemBandExtract, which identifies the element as a BandExtract, and sets the fields of the +member structure BandExtract using the arguments in the argument list. + +typedef float XieConstant[3]; +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + unsigned int levels; + float bias; + XieConstant coefficients; + } BandExtract; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloMatch src is not triple band or +unequal inter-band dimensions +xieErrNoFloSource Invalid src + XIElib - Photoflo Element Functions XieFloBandSelect +Name +XieFloBandSelect - specify a BandSelect element and set its parameters. +Synopsis +void XieFloBandSelect (element, src, band_number) +XiePhotoElement *element; +XiePhototag src; +unsigned int band_number; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +band_number Specifies which src band is to be selected to provide the output data. +Description +A BandSelect element produces single band output data by selecting a single band from a triple band +source. +Output Attributes +Class single band +Type same as src +Width same as band selected from src +Height same as band selected from src +Levels same as band selected from src +Structures +XieFloBandSelect() sets the XiePhotoElement structure field elemType to +xieElemBandSelect, which identifies the element as a BandSelect, and sets the fields of the +member structure BandSelect using the arguments in the argument list. + +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + unsigned int band_number; + } BandSelect; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloMatch src is not triple band +xieErrNoFloSource Invalid src +xieErrNoFloValue Invalid band_number + XIElib - Photoflo Element Functions XieFloBlend +Name +XieFloBlend - specify a Blend element and set its parameters. +Synopsis +void XieFloBlend (element, src1, src2, src_constant, alpha, +alpha_const, domain, band_mask) +XiePhotoElement *element; +XiePhototag src1; +XiePhototag src2; +XieConstant src_constant; +XiePhototag alpha; +double alpha_const; +XieProcessDomain *domain; +unsigned int band_mask; +Arguments +element Specifies the XiePhotoElement structure to use. +src1 Specifies the first data source. +src2 Specifies the second data source. +src_constant Specifies the constant data source. +alpha Specifies the blend proportion for each processed pixel. +alpha_const Specifies the constant blend proportion for each processed pixel. +domain Specifies the subset of source data that will be operated on. +band_mask Specifies which bands are to be operated on. +Description +A Blend element produces output data from two data sources or a single data source and a constant. +Each output pixel is a percentage combination of the source values, as controlled by the alpha input or +the alpha constant. + +When two sources are involved, src1 and src2 are the phototags of the elements supplying source +data; constant is ignored. A phototag is the position or index of an element within an array of +elements used to specify a photoflo; the first element in the array has a phototag value of one (1). If the +operation is to involve a constant, src1 is one operand, src2 must be zero, and constant is used +as the other operand. If alpha is non-zero, it controls the blend proportion for each pixel that is +processed, otherwise alpha_const provides this control. Domain may control the subset of source +data that will be operated upon. Only bands selected by the band_mask are subject to processing. +Other bands present in the image are passed through to the output. For example, a band_mask of 0012 +indicates that only the least significant band would be processed; operating on all bands requires a +band_mask of 1112. Using band_mask to select source data that have two (2) or less levels is not +permitted. + +When two sources are involved, all attributes, other that width and height, must match. If alpha +is non-zero, it must be a source of constrained data. + +In order to specify a subset of source data that will be operated on, the phototag, offset_x, and +offset_y fields of the XieProcessDomain structure pointed to by domain must be supplied; +XIElib does not provide a convenience function to create and/or fill in an XieProcessDomain +structure. If the entire source data is to be operated on, a pointer to an XieProcessDomain +structure must still be provided, with the phototag field set to zero (0); the offset_x and +offset_y fields are ignored. + +Within the intersection of the source(s) and domain, each output pixel is a blend of the corresponding +pixels from src1 and src2 (or src1 pixels blended with constant). The degree of blend is +determined by the corresponding value taken from alpha or the value of alpha_const. If alpha is +non-zero, the proportion of blend is further scaled by alpha_const: + +output = src1 * (1 - alpha / alpha_const) + src2 * (alpha / alpha_const) +(where alpha_const is greater than 0.0) + +if alpha is zero: + +output = src1 * (1 - alpha_const) + src2 * alpha_const +(where alpha_const is in the range [0.0, 1.0]) +Output Attributes +Class same as src1 +Type same as src1 +Width same as src1 +Height same as src1 +Levels same as src1 +Structures +XieFloBlend() sets the XiePhotoElement structure field elemType to xieElemBlend, +which identifies the element as a Blend, and sets the fields of the member structure Blend using the +arguments in the argument list. + +typedef unsigned XiePhototag; +typedef float XieConstant[3]; +typedef struct { + int offset_x; + int offset_y; + XiePhototag phototag; +} XieProcessDomain; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src1; + XiePhototag src2; + XieConstant src_constant; + XiePhototag alpha; + float alpha_constant; + XieProcessDomain domain; + unsigned int band_mask; + } Blend; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloMatch Incompatible attributes between src1 and src2 or +alpha is unconstrained or +selected source data are bitonal +xieErrNoFloSource Invalid src1, src2, or alpha +xieErrNoFloValue alpha is zero and alpha_const is outside the range [0.0,1.0] or +alpha is non-zero and alpha_const is non-positive + XIElib - Photoflo Element Functions XieFloCompare +Name +XieFloCompare - specify a Compare element and set its parameters. +Synopsis +void XieFloCompare (element, src1, src2, domain, constant, operator, +combine, band_mask) +XiePhotoElement *element; +XiePhototag src1; +XiePhototag src2; +XieProcessDomain *domain; +XieConstant constant; +XieCompareOp operator; +Bool combine; +unsigned int band_mask; +Arguments +element Specifies the XiePhotoElement structure to use. +src1 Specifies the first data source. +src2 Specifies the second data source. +domain Specifies the subset of source data that will be operated on. +constant Specifies the constant data source. +operator Specifies the logical predicate operator used in the comparison. +combine Specifies if the comparison should be done on a per-band or on an all- +bands basis. +band_mask Specifies which bands are to be operated upon. +Description +A Compare element takes two data sources or a single data source and a constant and generates a +Boolean bitmap output which reflects the results of a point-wise comparison. The output data has a +value of 1 wherever the comparison is true, and a value of 0 everywhere else (i.e., comparison false or +comparison not performed). The comparison may be performed on a per-band basis, or for all bands +taken together. + +When two sources are involved, src1 and src2 are the phototags of the elements supplying source +data; constant is ignored. A phototag is the position or index of an element within an array of +elements used to specify a photoflo; the first element in the array has a phototag value of one (1). If the +operation is to involve a constant, src1 is one operand, src2 must be zero, and constant is used +as the other operand. + +In order to specify a subset of source data that will be operated on, the phototag, offset_x, and +offset_y fields of the XieProcessDomain structure pointed to by domain must be supplied; +XIElib does not provide a convenience function to create and/or fill in an XieProcessDomain +structure. If the entire source data is to be operated on, a pointer to an XieProcessDomain +structure must still be provided, with the phototag field set to zero (0); the offset_x and +offset_y fields are ignored. + +operator is the logical predicate operator used in the comparison. The valid operators for the +Compare process element are: + +Operator +src1 (operator) src2 +src1 (operator) constant + +xieValLT +src1 * src2 +src1 * constant + +xieValLE +src1 * src2 +src1 * constant + +xieValEQ +src1 * src2 +src1 * constant + +xieValNE +src1 * src2 +src1 * constant + +xieValGT +src1 * src2 +src1 * constant + +xieValGE +src1 * src2 +src1 * constant + + +combine is a Boolean which determines if the comparison should be done on a per-band basis, or on +an all bands basis. Only bands selected by band_mask are subject to processing. Other bands +present in the image are passed through to the output. For example, a band_mask of 0012 indicates +that only the least significant band would be processed; operating on all bands requires a +band_mask of 1112. + +If combine is True or src1 is single band, the output data will form a single Boolean bitmap. If +src1 is triple band and combine is False, the output data will yield three separate Boolean bitmaps +(for this case band_mask must specify all bands). + +If src1 is triple band and combine is True, only the EQ and NE operators are allowed; equality is +established for each band selected by band_mask, and then the result is logically ANDed to derive +equality (inequality is a logical NOT of this result). For this case, width and height must match for all +bands selected by band_mask. + +The relationship between combine and data class dependencies are given in the following table: + +combine +input class +band_mask +output class + +True +single band +n/a +single band + + +triple band +selected bands +single band + +False +single band +n/a +single band + + +triple band +all bands +triple band + +Output Attributes +Class see Description +Type constrained +Width same as src1 +Height same as src1 +Levels 2 per band (see Description) +Structures +XieFloCompare() sets the XiePhotoElement structure field elemType to +xieElemCompare, which identifies the element as a Compare, and sets the fields of the member +structure Compare using the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef float XieConstant[3]; +typedef struct { + int offset_x; + int offset_y; + XiePhototag phototag; +} XieProcessDomain; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src1; + XiePhototag src2; + XieProcessDomain domain; + XieConstant constant; + XieCompareOp operator; + Bool combine; + unsigned int band_mask; + } Compare; + ... + } data; +} XiePhotoElement; + +/* Definitions of Compare Operators */ +#define xieValLT 1 +#define xieValLE 2 +#define xieValEQ 3 +#define xieValNE 4 +#define xieValGT 5 +#define xieValGE 6 +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloDomain Invalid domain +xieErrNoFloMatch Class differs between src1 and src2 or +invalid combination of operator and combine or +triple band, and combine is false, and band_mask incomplete +xieErrNoFloOperator Invalid operator +xieErrNoFloSource Invalid src1 or src2 + XIElib - Photoflo Element Functions XieFloConstrain +Name +XieFloConstrain - specify a Constrain element and set its parameters. +Synopsis +void XieFloConstrain (element, src, levels, constrain_tech, +constrain_param) +XiePhotoElement *element; +XiePhototag src; +XieLevels levels; +XieConstrainTechnique constrain_tech; +XiePointer constrain_param; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +levels Specifies the number of quantization levels desired in the output data. +constrain_tech Specifies the technique to be used when constraining the data. +constrain_param Specifies the list of additional parameters required by constrain. +Description +A Constrain element applies a quantization model to the image data to convert the data to a fixed +number of quantization levels. Application of the quantization model may involve steps such as range +shifting, scaling, clipping, and rounding. + +src is the phototag of the element supplying source data. A phototag is the position or index of an +element within an array of elements used to specify a photoflo; the first element in the array has a +phototag value of one (1). Levels is the number of quantization levels desired in the output data. +constrain_tech specifies the constrain technique to be used when constraining the data. +constrain_param is the list of additional parameters required by constrain_tech. + +If the input image is already constrained the data will be reconstrained. + +One of the following standard constrain technique values can be assigned to constrain_tech : + +xieValConstrainClipScale +xieValConstrainHardClip + +If a vendor defined additional private constrain techniques, the values given to these techniques can be +assigned to constrain_tech. +Output Attributes +Class same as src +Type constrained +Width same as src +Height same as src +Levels levels +Structures +XieFloConstrain() sets the XiePhotoElement structure field elemType to +xieElemConstrain, which identifies the element as a Constrain, and sets the fields of the member +structure Constrain using the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef unsigned long XieLevels[3]; +typedef unsigned XieConstrainTechnique; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieLevels levels; + XieConstrainTechnique constrain_tech; + XiePointer constrain_param; + } Constrain; + ... + } data; +} XiePhotoElement; + +/* Definitions for ConstrainTechniques */ +#define xieValConstrainClipScale 2 +#define xieValConstrainHardClip 4 +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloSource Invalid src +xieErrNoFloTechnique Invalid constrain_tech or constrain_param +See Also +XieTecClipScale(). + XIElib - Photoflo Element Functions XieFloConvertFromIndex +Name +XieFloConvertFromIndex - specify a ConvertFromIndex element and set its parameters. +Synopsis +void XieFloConvertFromIndex (element, src, colormap, data_class, +precision) +XiePhotoElement *element; +XiePhototag src; +Colormap colormap; +XieDataClass data_class; +unsigned int precision; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +colormap Specifies the Colormap from which to obtain output pixel values. +data_class Specifies if the output data is single band or triple band. +precision Specifies the number of bits to be used from colormap's RGB values. +Description +A ConvertFromIndex element converts Colormap index data into achromatic or trichromatic data. + +data_class specifies if the output data is single band or triple band and can be set to one of the +following standard data class values: + +xieValSingleBand +xieValTripleBand + +If data_class is single band and a trichromatic colormap is specified (static color, pseudo color, +true color, or direct color), the gray shade for each pixel is taken from the red values in colormap. If +data_class is triple band and an achromatic colormap is specified (static gray or gray scale), the +red band will be replicated to populate the green and blue output bands. + +The depth of colormap must match the Levels attribute of src (i.e., 2depth must equal Levels). +Output Attributes +Class data_class +Type constrained +Width same as src +Height same as src +Levels 2precision (per band) +Structures +XieFloConvertFromIndex() sets the XiePhotoElement structure field elemType to +xieElemConvertFromIndex, which identifies the element as a ConvertFromIndex, and sets the +fields of the member structure ConvertFromIndex using the arguments in the argument list. + +typedef unsigned XieDataClass; +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + Colormap colormap; + XieDataClass data_class; + unsigned int precision; + } ConvertFromIndex; + ... + } data; +} XiePhotoElement; + +/* Definitions of DataClass */ +#define xieValSingleBand 1 +#define xieValTripleBand 2 +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloColormap Invalid colormap +xieErrNoFloMatch Levels of src do not match depth of colormap +xieErrNoFloSource Invalid src +xieErrNoFloValue Invalid data_class or precision + XIElib - Photoflo Element Functions XieFloConvertFromRGB +Name +XieFloConvertFromRGB - specify a ConvertFromRGB element and set its parameters. +Synopsis +void XieFloConvertFromRGB (element, src, color_space, color_param) +XiePhotoElement *element; +XiePhototag src; +XieColorspace color_space; +XiePointer color_param; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data (RGB assumed). +color_space Specifies the technique to be used in the conversion. +color_param Specifies the list of additional parameters required by color_space. +Description +A ConvertFromRGB element converts RGB source data to an alternate colorspace. + +The source data must be triple band, and all bands must have equal dimensions. The type and levels of +the output data are determined by the color_space's technique parameters. All other attributes are +inherited from src. + +ConvertFromRGB techniques define the trichromatic colorspaces known to a ConvertFromRGB element. +One of the following standard ConvertFromRGB technique values can be assigned to color_space: + +xieValRGBToCIELab +xieValRGBToCIEXYZ +xieValRGBToYCbCr +xieValRGBToYCC + +If a vendor defined additional private ConvertFromRGB techniques, the private technique values given +to these techniques can be assigned to color_space. +Output Attributes +Class triple band +Type color_space dependent +Width same as src +Height same as src +Levels color_space dependent +Structures +XieFloConvertFromRGB() sets the XiePhotoElement structure field elemType to +xieElemConvertFromRGB, which identifies the element as a ConvertFromRGB, and sets the fields +of the member structure ConvertFromRGB using the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef unsigned XieColorspace; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieColorspace color_space; + XiePointer color_param; + } ConvertFromRGB; + ... + } data; +} XiePhotoElement; + +/* Definitions for Colorspace Conversions */ +#define xieValRGBToCIELab 2 +#define xieValRGBToCIEXYZ 4 +#define xieValRGBToYCbCr 6 +#define xieValRGBToYCC 8 +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloMatch src is not triple band or +unequal inter-band dimensions +xieErrNoFloSource Invalid src +xieErrNoFloTechnique Invalid color_space or color_param +See Also +XieTecRGBToCIELab(), XieTecRGBToCIEXYZ(), XieTecRGBToYCbCr XieTecRGBToYCC(). + XIElib - Photoflo Element Functions XieFloConvertToIndex +Name +XieFloConvertToIndex - specify a ConvertToIndex element and set its parameters. +Synopsis +void XieFloConvertToIndex (element, src, colormap, color_list, +notify, color_alloc_tech, color_alloc_param) +XiePhotoElement *element; +XiePhototag src; +Colormap colormap; +XieColorList color_list; +Bool notify; +XieColorAllocTechnique color_alloc_tech; +XiePointer color_alloc_param; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying the constrained source data +colormap Specifies the Colormap from which to obtain output pixel values. +color_list Specifies the list where Colormap indices are to be stored. +notify Specifies whether to enable sending ColorAlloc events. +color_alloc_tech Specifies the desired color allocation technique. +color_alloc_param Specifies the list of additional parameters required by +color_alloc_tech. +Description +A ConvertToIndex element allocates and/or matches colors or gray shades, as required, from a +Colormap. It produces pixel indices as output data, and records indices that it allocates in +color_list. + +The specified color_alloc_tech technique may generate a ColorAlloc event to warn the +client that results are of lesser fidelity than desired. Notify allows the client to be notified about inferior +results from color allocation or matching. + +src is the phototag of the element supplying constrained source data. A phototag is the position or +index of an element within an array of elements used to specify a photoflo; the first element in the array +has a phototag value of one (1). Colormap is the Colormap from which colors or gray shades are +allocated and/or matched. Color_list is the list where allocated Colormap indices are to be stored. +color_alloc_tech specifies the desired color allocation technique. color_alloc_params is +the list of additional parameters required by color_alloc_tech. + +color_list is purged of any colors it already contains when photoflo execution begins. Allocated +Colormap indices can be freed using XiePurgeColorList(), XieDestroyColorList(), or +by making color_list the target of an active photoflo. + +ColorAlloc techniques define the recognized color allocation techniques used by the ConvertToIndex +element. One of the following standard ColorAlloc technique values can be assigned to +color_alloc_tech: + +xieValColorAllocDefault +xieValColorAllocAll +xieValColorAllocMatch +xieValColorAllocRequantize + +If a vendor defined additional private ColorAlloc techniques, the private technique values given to +these techniques can be assigned to color_alloc_tech. + +The server is required to support the default technique which is bound to one of the standard +techniques defined above or a private technique. +Output Attributes +Class single band +Type constrained +Width same as src +Height same as src +Levels 2depth (i.e. colormap depth) +Structures +XieFloConvertToIndex() sets the XiePhotoElement structure field elemType to +xieElemConvertToIndex, which identifies the element as a ConvertToIndex, and sets the fields +of the member structure ConvertToIndex using the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef XID XieColorList; +typedef unsigned XieColorAllocTechnique; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + Colormap colormap; + XieColorList color_list; + Bool notify; + XieColorAllocTechnique color_alloc_tech; + XiePointer color_alloc_param; + } ConvertToIndex; + ... + } data; +} XiePhotoElement; + +/* Definitions for ColorAlloc Techniques */ +#define xieValColorAllocDefault 0 +#define xieValColorAllocAll 2 +#define xieValColorAllocMatch 4 +#define xieValColorAllocRequantize 6 +Errors +xieErrNoFloAccess color_list already being used by another active photoflo +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloColorlist Invalid color_list +xieErrNoFloColormap Invalid colormap +xieErrNoFloMatch Unequal inter-band dimensions +xieErrNoFloSource Invalid src +xieErrNoFloTechnique Invalid color_alloc_tech or color_alloc_param +See Also +XiePurgeColorList(), XieDestroyColorList(). +XieTecColorAllocAll(), XieTecColorAllocMatch(), XieTecColorAllocRequantize(). + XIElib - Photoflo Element Functions XieFloConvertToRGB +Name +XieFloConvertToRGB - specify a ConvertToRGB element and set its parameters. +Synopsis +void XieFloConvertToRGB (element, src, color_space, color_param) +XiePhotoElement *element; +XiePhototag src; +XieColorspace color_space; +XiePointer color_param; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +color_space Specifies the technique that will be used for the conversion. +color_param Specifies the list of additional parameters required by convert_space. +Description +A ConvertToRGB element converts alternate colorspace source data into RGB data. + +The source data must be triple band, and all bands must have equal dimensions. The type and levels of +the output data are determined by the color_space's technique parameters. All other attributes are +inherited from src. + +ConvertToRGB techniques define the trichromatic colorspaces known to a ConvertToRGB element. One +of the following standard ConvertFromRGB technique values can be assigned to color_space: + +xieValCIELabToRGB +xieValCIEXYZToRGB +xieValYCbCrToRGB +xieValYCCToRGB + +If a vendor defined additional private ConvertToRGB techniques, the private technique values given to +these techniques can be assigned to color_space. +Output Attributes +Class triple band +Type color_space dependent +Width same as src +Height same as src +Levels color_space dependent +Structures +XieFloConvertToRGB() sets the XiePhotoElement structure field elemType to +xieElemConvertToRGB, which identifies the element as a ConvertToRGB, and sets the fields of the +member structure ConvertToRGB using the arguments in the argument list. + +typedef unsigned XieColorspace; +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieColorspace color_space; + XiePointer color_param; + } ConvertToRGB; + ... + } data; +} XiePhotoElement; + +/* Definitions for Colorspace Conversions */ +#define xieValCIELabToRGB 2 +#define xieValCIEXYZToRGB 4 +#define xieValYCbCrToRGB 6 +#define xieValYCCToRGB 8 +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloMatch src is not triple band or +unequal inter-band dimensions +xieErrNoFloSource Invalid src +xieErrNoFloTechnique Invalid color_space or color_param +See Also +XieTecCIELabToRGB(), XieTecCIEXYZToRGB(), XieTecYCbCrToRGB(), XieTecYCCToRGB(). + XIElib - Photoflo Element Functions XieFloConvolve +Name +XieFloConvolve - specify a Convolve element and set its parameters. +Synopsis +void XieFloConvolve (element, src, domain, kernel, kernel_size, +band_mask, convolve_tech, convolve_param) +XiePhotoElement *element; +XiePhototag src; +XieProcessDomain *domain; +float *kernel; +int kernel_size; +unsigned int band_mask; +XieConvolveTechnique convolve_tech; +XiePointer convolve_param; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +domain Specifies the subset of the image that will be operated upon. +kernel Specifies the coefficients used in the convolution process +kernel_size Specifies the dimension of kernel. +band_mask Specifies which bands are to be operated upon. +convolve_tech Specifies the technique for handling edge conditions. +convolve_param Specifies the list of additional parameters required by +convolve_tech. +Description +A Convolve element produces output data by convolving each input pixel value (and surrounding area) +with the specified convolution kernel. + +In order to specify a subset of source data that will be operated on, the phototag, offset_x, and +offset_y fields of the XieProcessDomain structure pointed to by domain must be supplied; +XIElib does not provide a convenience function to create and/or fill in an XieProcessDomain +structure. If the entire source data is to be operated on, a pointer to an XieProcessDomain +structure must still be provided, with the phototag field set to zero (0); the offset_x and +offset_y fields are ignored. + +kernel represents a square array of float data which has odd dimensions. Thus, a single dimension is +used to specify kernel_size. + +Only bands selected by the band_mask are subject to processing. Other bands present in the image +are passed through to the output. For example, a band_mask of 0012 indicates that only the least +significant band would be processed; operating on all bands requires a band_mask of 1112. Using +band_mask to select source data that have two (2) or less levels is not permitted. + +All output data attributes are inherited from the source data. + +Convolve techniques provide various methods of handling edge conditions. These techniques +determine what pixel values are used when Convolve requires data beyond the image bounds. One of +the following standard convolve technique values can be assigned to convolve_tech: + +xieValConvolveDefault +xieValConvolveConstant +xieValConvolveReplicate + +If a vendor defined additional private convolve techniques, the private technique values given to these +techniques can be assigned to convolve_tech. + +The server is required to support the default technique which is bound to one of the standard +techniques defined above or a private technique. +Output Attributes +Class same as src +Type same as src +Width same as src +Height same as src +Levels same as src +Structures +XieFloConvolve() sets the XiePhotoElement structure field elemType to +xieElemConvolve, which identifies the element as a Convolve, and sets the fields of the member +structure Convolve using the arguments in the argument list. + +typedef unsigned XieConvolveTechnique; +typedef unsigned XiePhototag; +typedef struct { + int offset_x; + int offset_y; + XiePhototag phototag; +} XieProcessDomain; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieProcessDomain domain; + float *kernel; + int kernel_size; + unsigned int band_mask; + XieConvolveTechnique convolve_tech; + XiePointer convolve_param; + } Convolve; + ... + } data; +} XiePhotoElement; + +/* Definitions for ConvolveTechniques */ +#define xieValConvolveDefault 0 +#define xieValConvolveConstant 2 +#define xieValConvolveReplicate 4 +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloDomain Invalid domain +xieErrNoFloMatch Selected source data are bitonal +xieErrNoFloSource Invalid src +xieErrNoFloTechnique Invalid convolve_tech or convolve_param +xieErrNoFloValue Invalid kernel_size (e.g., not odd) +See Also +XieTecConvolveConstant(). + XIElib - Photoflo Element Functions XieFloDither +Name +XieFloDither - specify a Dither element and set its parameters. +Synopsis +void XieFloDither (element, src, band_mask, levels, dither_tech, +dither_param) +XiePhotoElement *element; +XiePhototag src; +unsigned int band_mask; +XieLevels levels; +XieDitherTechnique dither_tech; +XiePointer dither_param; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +band_mask Specifies which bands are to be operated upon. +levels Specifies the number of levels desired in the output data. +dither_tech Specifies the desired dither technique. +dither_param Specifies the list of additional parameters required by dither_tech. +Description +The Dither element is used to reduce the number of quantization levels in an image. It accomplishes this +by affecting adjacent pixels (area affect) to make up for the lack of depth resolution. + +Only bands selected by the band_mask are subject to processing. Other bands present in the image +are passed through to the output. For example, a band_mask of 0012 indicates that only the least +significant band would be processed; operating on all bands requires a band_mask of 1112. Using +band_mask to select source data that have two (2) or less levels is not permitted. + +The source data must be constrained. + +Dither techniques define the technique that can be used to dither an image. One of the following +standard dither technique values can be assigned to dither_tech: + +xieValDitherDefault +xieValDitherErrorDiffusion +xieValDitherOrdered + +If a vendor defined additional private dither techniques, the private technique values given to these +techniques can be assigned to dither_tech. + +The server is required to support the default technique which is bound to one of the standard +techniques defined above or a private technique. +Output Attributes +Class same as src +Type constrained +Width same as src +Height same as src +Levels levels +Structures +XieFloDither() sets the XiePhotoElement structure field elemType to xieElemDither, +which identifies the element as a Dither, and sets the fields of the member structure Dither using the +arguments in the argument list. + +typedef unsigned XiePhototag; +typedef unsigned long XieLevels[3]; +typedef unsigned XieDitherTechnique; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieLevels levels; + unsigned int band_mask; + XieDitherTechnique dither_tech; + XiePointer dither_param; + } Dither; + ... + } data; +} XiePhotoElement; + +/* Definitions for DitherTechniques */ +#define xieValDitherDefault 0 +#define xieValDitherErrorDiffusion 2 +#define xieValDitherOrdered 4 +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloDomain Invalid domain +xieErrNoFloMatch Unconstrained src data or +selected source data are bitonal +xieErrNoFloSource Invalid src +xieErrNoFloTechnique Invalid dither_tech or dither_param +xieErrNoFloValue Invalid output levels: less than two or greater than src levels +See Also +XieTecDitherOrderedParam(). + XIElib - Photoflo Element Functions XieFloGeometry +Name +XieFloGeometry - specify a Geometry element and set its parameters. +Synopsis +void XieFloGeometry (element, src, width, height, coefficients, +constant, band_mask, sample_tech, sample_param) +XiePhotoElement *element; +XiePhototag src; +unsigned int width; +unsigned int height; +float coefficients[6]; +XieConstant constant; +unsigned int band_mask; +XieGeometryTechnique sample_tech; +XiePointer sample_param; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +width Specifies the horizontal dimension of the output data. +height Specifies the vertical dimension of the output data. +coefficients Specifies the list of values that control the geometric transformation. +constant Specifies the fill value used for output pixels that do not map back to a +src pixel. +band_mask Specifies which bands are to be operated upon. +sample_tech Specifies the technique to be used for retrospectively resampling src. +sample_param Specifies the list of additional parameters required by sample_tech. +Description +A Geometry element is used to perform geometric transformations on image data. Linear geometric +resampling operations are implemented, such as: crop, mirror, scale, shear, rotate, translate, and +combinations thereof. + +A Geometry element can be visualized as stepping through each possible output pixel location in turn, +and computing the location from which to obtain each input pixel value. Each pixel (x',y') in the output +image is mapped to the coordinate location (x,y) in src by: + + + +The coordinate mapping coefficients (a,b,c,d,tx,ty), together with the output width and +height, fully specify the geometric transformation. The following briefly (and approximately) +summarizes the intuitive role of each parameter: + +a, d Scaling parameters. Increasing a and d will make the output image appear smaller, whereas +decreasing them will make the output pixels appear larger. +b, c Rotation/skew parameters. If b and c are zero, the output image will be a rectangular +scaling of the input image. If a and d are both zero, b is one and c is negative one, the +image will appear rotated. The magnitude of b and c will affect scaling as well, if a and d +are zero. If more than two of (a,b,c,d) are non-zero, the effect is complicated. The image +may appear skewed and scaled. +tx, ty Translation parameters. Used to specify the offset between input and output coordinate +systems. +width, height These specify the output image dimensions of the selected band(s). Note that +increasing the output image height and width over the input image size will not by itself +cause magnification * if a and d are one (1) and b and c are zero (0), the output image will +have the same appearance as the input, except that the borders will shrink or expand (as +determined by width and height) and new areas of the image will be filled with +constant. + +The region to be cropped in the input image is implicitly defined by the dimensions of the output image +and the mapping from output to input coordinates. Depending on the size of the input and output +images, the amount of scaling specified, and the amount of translation in the mapping, pixels in the +output image may map off the edge of the input image and the constant value is used. + +Trichromatic image bands can be operate individually, all together, or in any combination, using +band_mask. Since applying the same (a,b,c,d,tx,ty) mapping to inputs with diverse sizes will specify +different transformations, operating on all bands in unison (band_mask of 1112) is most appropriate if +the dimensions of all bands are equal. + +Often a given output pixel location (x',y'), will not correspond exactly to a single pixel in the input +image. The sample_tech technique is used to determine how the input data will be interpolated to +produce each output pixel value. One of the following standard geometry technique values can be +assigned to sample_tech: + +xieValGeomDefault +xieValGeomAntialias +xieValGeomAntialiasByArea +xieValGeomAntialiasByLPF +xieValGeomBilinearInterp +xieValGeomGaussian +xieValGeomNearestNeighbor + +If a vendor defined additional private geometry techniques, the private technique values given to these +techniques can be assigned to sample_tech. + +The server is required to support the default technique which is bound to one of the standard +techniques defined above or a private technique. +Output Attributes +Class same as src +Type same as src +Width width +Height height +Levels same as src +Structures +XieFloGeometry() sets the XiePhotoElement structure field elemType to +xieElemGeometry, which identifies the element as a Geometry, and sets the fields of the member +structure Geometry using the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef float XieConstant[3]; +typedef unsigned XieGeometryTechnique; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + unsigned int width; + unsigned int height; + float coefficients[6]; + XieConstant constant; + unsigned int band_mask; + XieGeometryTechnique sample_tech; + XiePointer sample_param; + } Geometry; + ... + } data; +} XiePhotoElement; + +/* Definitions for GeometryTechniques */ +#define xieValGeomDefault 0 +#define xieValGeomAntialias 2 +#define xieValGeomAntialiasByArea 4 +#define xieValGeomAntialiasByLPF 6 +#define xieValGeomBilinearInterp 8 +#define xieValGeomGaussian 10 +#define xieValGeomNearestNeighbor 12 +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloSource Invalid src +xieErrNoFloTechnique Invalid sample_tech or sample_param +xieErrNoFloValue Invalid coefficients +See Also +XieTecGeomAntialiasByArea(), XieTecGeomAntialiasByLowpass(), XieTecGeomGaussian(), +XieTecGeomNearestNeighbor(). + XIElib - Photoflo Element Functions XieFloLogical +Name +XieFloLogical - specify a Logical element and set its parameters. +Synopsis +void XieFloLogical (element, src1, src2, domain, constant, operator, +band_mask) +XiePhotoElement *element; +XiePhototag src1; +XiePhototag src2; +XieProcessDomain *domain; +XieConstant constant; +unsigned long operator; +unsigned int band_mask; +Arguments +element Specifies the XiePhotoElement structure to use. +src1 Specifies the first data source. +src2 Specifies the second data source. +domain Specifies the subset of source data that will be operated on. +constant Specifies the constant data source. +operator Specifies the logical operator to be used. +band_mask Specifies which bands are to be operated upon. +Description +A Logical element performs per-pixel bit-wise operations on a single data source, or between two data +sources, or between a single data source and a constant. + +When two sources are involved, src1 and src2 are the phototags of the elements supplying source +data; constant is ignored. A phototag is the position or index of an element within an array of +elements used to specify a photoflo; the first element in the array has a phototag value of one (1). If the +operation is to involve a constant, src1 is one operand, src2 must be zero, and constant is used +as the other operand. + +In order to specify a subset of source data that will be operated on, the phototag, offset_x, and +offset_y fields of the XieProcessDomain structure pointed to by domain must be supplied; +XIElib does not provide a convenience function to create and/or fill in an XieProcessDomain +structure. If the entire source data is to be operated on, a pointer to an XieProcessDomain +structure must still be provided, with the phototag field set to zero (0); the offset_x and +offset_y fields are ignored. + +The value of operator matches the GC-function values defined by the core protocol specification for +CreateGC. The output of a Logical element is determined by the number of data sources and +operator: + +GC-function +monadic operation +dyadic operation + +Clear +0 +0 + +And +constant AND src1 +src2 AND src1 + +AndReverse +constant AND (NOT src1) +src2 AND (NOT src1) + +Copy +constant +src2 + +AndInverted +(NOT constant) AND src1 +(NOT src2) AND src1 + +NoOp +src1 +src1 + +Xor +constant XOR src1 +src2 XOR src1 + +Or +constant OR src1 +src2 OR src1 + +Nor +(NOT constant) AND (NOT src1) +(NOT src2) AND (NOT src1) + +Equiv +(NOT constant) XOR src1 +(NOT src2) XOR src1 + +Invert +NOT src1 +NOT src1 + +OrReverse +constant OR (NOT src1) +src2 OR (NOT src1) + +CopyInverted +NOT constant +NOT src2 + +OrInverted +(NOT constant) OR src1 +(NOT src2) OR src1 + +Nand +(NOT constant) OR (NOT src1) +(NOT src2) OR (NOT src1) + +Set +1 +1 + + +Only bands selected by the band_mask are subject to processing. Other bands present in the image +are passed through to the output. For example, a band_mask of 0012 indicates that only the least +significant band would be processed; operating on all bands requires a band_mask of 1112. +Output Attributes +Class same as src1 +Type constrained +Width same as src1 +Height same as src1 +Levels same as src1 +Structures +XieFloLogical() sets the XiePhotoElement structure field elemType to +xieElemLogical, which identifies the element as a Logical, and sets the fields of the member +structure Logical using the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef float XieConstant[3]; +typedef struct { + int offset_x; + int offset_y; + XiePhototag phototag; +} XieProcessDomain; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src1; + XiePhototag src2; + XieProcessDomain domain; + XieConstant constant; + int operator; + unsigned int band_mask; + } Logical; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloDomain Invalid domain +xieErrNoFloMatch Class or levels differ between src1 and src2 or +levels is not a power of 2 or +src1 or src2 in not constrained +xieErrNoFloOperator Invalid operator +xieErrNoFloSource Invalid src1 or src2 + XIElib - Photoflo Element Functions XieFloMatchHistogram +Name +XieFloMatchHistogram - specify a MatchHistogram element and set its parameters. +Synopsis +void XieFloMatchHistogram (element, src, domain, shape, shape_param) +XiePhotoElement *element; +XiePhototag src; +XieProcessDomain *domain; +XieHistogramShape shape; +XiePointer shape_param; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +domain Specifies the subset of source data that will be operated on. +shape Specifies the form of the desired output data histogram. +shape_param Specifies the list of additional parameters required by shape. +Description +A MatchHistogram element produces output data which differs from the source data in terms of its pixel +value distribution, or histogram. It allows the client to specify the desired state of the resulting data's +histogram (algorithmic description of resulting histogram shape). + +The source data must be constrained and single band, and it must have three (3) or more levels. + +In order to specify a subset of source data that will be operated on, the phototag, offset_x, and +offset_y fields of the XieProcessDomain structure pointed to by domain must be supplied; +XIElib does not provide a convenience function to create and/or fill in an XieProcessDomain +structure. Only data that intersects with the subset specified by domain is included in the histogram, +and only that data will be affected in the result of the histogram matching operation: all other data will +pass-through unchanged. If the entire source data is to be operated on, a pointer to an +XieProcessDomain structure must still be provided, with the phototag field set to zero (0); the +offset_x and offset_y fields are ignored. + +HistogramShape defines the various match-histogram shape techniques that can be requested by a +MatchHistogram element. One of the following standard match-histogram shape technique values can +be assigned to shape: + +xieValHistogramFlat +xieValHistogramGaussian +xieValHistogramHyperbolic + +If a vendor defined additional private match-histogram shape techniques, the private technique values +given to these techniques can be assigned to shape. +Output Attributes +Class single band +Type constrained +Width same as src +Height same as src +Levels same as src +Structures +XieFloMatchHistogram() sets the XiePhotoElement structure field elemType to +xieElemMatchHistogram, which identifies the element as a MatchHistogram, and sets the fields +of the member structure MatchHistogram using the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef unsigned XieHistogramShape; +typedef struct { + int offset_x; + int offset_y; + XiePhototag phototag; +} XieProcessDomain; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieProcessDomain domain; + XieHistogramShape shape; + XiePointer shape_param; + } MatchHistogram; + ... + } data; +} XiePhotoElement; + +/* Definitions for GeometryTechniques */ +#define xieValGeomDefault 0 +#define xieValGeomAntialias 2 +#define xieValGeomAntialiasByArea 4 +#define xieValGeomAntialiasByLPF 6 +#define xieValGeomBilinearInterp 8 +#define xieValGeomGaussian 10 +#define xieValGeomNearestNeighbor 12 +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloDomain Invalid domain +xieErrNoFloMatch Invalid src data: unconstrained, triple band, or bitonal +xieErrNoFloSource Invalid src +xieErrNoFloTechnique Invalid shape or shape_param +See Also +XieTecHistogramGaussian(), XieTecHistogramHyperbolic(). + XIElib - Photoflo Element Functions XieFloMath +Name +XieFloMath - specify a Math element and set its parameters. +Synopsis +void XieFloMath (element, src, domain, operator, band_mask) +XiePhotoElement *element; +XiePhototag src; +XieProcessDomain *domain; +XieMathOp operator; +unsigned int band_mask; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +domain Specifies the subset of source data that will be operated on. +operator Specifies the mathematical operation to be applied. +band_mask Specifies which bands are to be operated upon. +Description +A Math element applies a single operand mathematical operation to the source data on a point-wise +basis. + +In order to specify a subset of source data that will be operated on, the phototag, offset_x, and +offset_y fields of the XieProcessDomain structure pointed to by domain must be supplied; +XIElib does not provide a convenience function to create and/or fill in an XieProcessDomain +structure. If the entire source data is to be operated on, a pointer to an XieProcessDomain +structure must still be provided, with the phototag field set to zero (0); the offset_x and +offset_y fields are ignored. + +Pixel computations that would lead to errors will yield valid server-dependent values (e.g. the log of a +constrained pixel value of zero might result in a value of zero). Only bands selected by the band_mask +are subject to processing. Other bands present in the image are passed through to the output. For +example, a band_mask of 0012 indicates that only the least significant band would be processed; +operating on all bands requires a band_mask of 1112. Using band_mask to select source data that +have two (2) or less levels is not permitted. + +The following valid mathematical operations that can be invoked through the Math element: + +Operator +Meaning + +xieValExp +exponential + +xieValLn +natural logarithm + +xieValLog2 +logarithm base 2 + +xieValLog10 +logarithm base 10 + +xieValSquare +square + +xieValSqrt +square root + + +All output data attributes are inherited from the source data. +Output Attributes +Class same as src +Type same as src +Width same as src +Height same as src +Levels same as src +Structures +XieFloMath() sets the XiePhotoElement structure field elemType to xieElemMath, which +identifies the element as a Math, and sets the fields of the member structure Math using the arguments +in the argument list. + +typedef unsigned XiePhototag; +typedef unsigned XieMathOp; +typedef struct { + int offset_x; + int offset_y; + XiePhototag phototag; +} XieProcessDomain; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieProcessDomain domain; + XieMathOp operator; + unsigned int band_mask; + } Math; + ... + } data; +} XiePhotoElement; + +/* Definitions of Math Operators */ +#define xieValExp 1 +#define xieValLn 2 +#define xieValLog2 3 +#define xieValLog10 4 +#define xieValSquare 5 +#define xieValSqrt 6 +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloDomain Invalid domain +xieErrNoFloMatch Selected source data are bitonal +xieErrNoFloSource Invalid src +xieErrNoFloOperator Invalid operator + XIElib - Photoflo Element Functions XieFloPasteUp +Name +XieFloPasteUp - specify a PasteUp element and set its parameters. +Synopsis +void XieFloPasteUp (element, width, height, constant, tiles, +tile_count) +XiePhotoElement *element; +unsigned int width; +unsigned int height; +XieConstant constant; +XieTile *tiles +unsigned int tile_count; +Arguments +element Specifies the XiePhotoElement structure to use. +width Specifies the full horizontal extent of the output data. +height Specifies the full vertical extent of the output data. +constant Specifies the fill value for output regions that are not tiled. +tiles Specifies a list of tile descriptors. +tile_count Specifies the number of tile descriptors in tiles. +Description +A PasteUp element is an N-input translate operation which outputs data constructed from various +source data tiles or a constant value. + +Each of the tiles specifies a src (the phototag of the element supplying source data), and the +coordinates, dst_x and dst_y, where the tile belongs in the output data. A phototag is the position +or index of an element within an array of elements used to specify a photoflo; the first element in the +array has a phototag value of one (1). + +Each region of the output data is defined by a tile's destination coordinates, dst_x and dst_y, and +its src dimensions. For output regions where no tile provides input, the value of constant is used. +If tiles overlap, a stacking order rule defines which pixel value will be output: the last tile involved in the +overlap in the list of tiles will provide the output pixel. + +At least one tile must be supplied. Except for width and height, all attributes of each source tile +must match. In addition, for triple band input, inter-band dimensions within each tiles must match. +Output Attributes +Class same as tiles +Type same as tiles +Width width +Height height +Levels same as tiles +Structures +XieFloPasteUp() sets the XiePhotoElement structure field elemType to +xieElemPasteUp, which identifies the element as a PasteUp, and sets the fields of the member +structure PasteUp using the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef float XieConstant[3]; +typedef struct { + XiePhototag src; + int dst_x; + int dst_y; +} XieTile; + +typedef struct { + int elemType; + union { + ... + struct { + unsigned int width; + unsigned int height; + XieConstant constant; + XieTile *tiles; + unsigned int tile_count; + } PasteUp; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloMatch Incompatible attributes between tiles or +unequal inter-band dimensions within a tile +xieErrNoFloSource Invalid source tiles or +no tiles were specified +See Also +XieFreePasteUpTiles(). + XIElib - Photoflo Element Functions XieFloPoint +Name +XieFloPoint - specify a Point element and set its parameters. +Synopsis +void XieFloPoint (element, src, domain, lut, band_mask) +XiePhotoElement *element; +XiePhototag src; +XieProcessDomain *domain; +XieLut lut; +unsigned int band_mask; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +domain Specifies the subset of source data that will be operated on. +lut Specifies the LUT resource supplying the lookup table. +band_mask Specifies which bands are to be operated upon. +Description +A Point element maps source pixel values to output pixel values using a lookup table (LUT). + +src is the phototag of the element supplying constrained source data. A phototag is the position or +index of an element within an array of elements used to specify a photoflo; the first element in the array +has a phototag value of one (1). Lut is the phototag of the element supplying the lookup table array(s). + +In order to specify a subset of source data that will be operated on, the phototag, offset_x, and +offset_y fields of the XieProcessDomain structure pointed to by domain must be supplied; +XIElib does not provide a convenience function to create and/or fill in an XieProcessDomain +structure. If the entire source data is to be operated on, a pointer to an XieProcessDomain +structure must still be provided, with the phototag field set to zero (0); the offset_x and +offset_y fields are ignored. + +band_mask specifies which bands are to be operated upon (all bands must be specified if lut is +single band and src is triple band). For example, a band_mask of 0012 indicates that only the least +significant band would be processed; operating on all bands requires a band_mask of 1112. + +The output is constrained, with the width and height taken from src, and class and levels taken from +lut. When src is single band and lut is triple band, for the bands that are indicated by +band_mask, the output bands are remapped through their respective lut bands, whereas the other +bands are just replications of the single src band. If domain is used, the class and levels of lut must +match those of src. + +Each lut array must contain sufficient entries so that all potential pixel values found in src can form a +valid index into the array. Generally each src pixel value is used directly as an index into a lut array. +When triple band src data are remapped through a single band lut however, pixel values from all +three src bands are combined to form an array index; for this case, width and height must match for all +bands. + +When one LUT array is used with triple band data, the following presents the algorithm for computing +combined array indices: + +LUT band-order +LUT indexing algorithm for combining pixel values + +LSFirst +index = value[0] + value[1] x levels[0] + value[2] x levels[0] x levels[1] + +MSFirst +index = value[2] + value[1] x levels[2] + value[0] x levels[2] x levels[1] + +Output Attributes +Class same as lut +Type constrained +Width same as src +Height same as src +Levels same as lut +Structures +XieFloPoint() sets the XiePhotoElement structure field elemType to xieElemPoint, +which identifies the element as a Point, and sets the fields of the member structure Point using the +arguments in the argument list. + +typedef XID XieLut; +typedef unsigned XiePhototag; +typedef struct { + int offset_x; + int offset_y; + XiePhototag phototag; +} XieProcessDomain; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieProcessDomain domain; + XieLut lut; + unsigned int band_mask; + } Point; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloDomain Invalid domain +xieErrNoFloMatch Unconstrained src data or +lut does not contain enough entries or +lut is single band and src is triple band, but band_mask is +incomplete or +domain is being used, but lut class or levels do not match those of +src +xieErrNoFloSource Invalid src or lut + XIElib - Photoflo Element Functions XieFloUnconstrain +Name +XieFloUnconstrain - specify an unconstrain element and set its parameters. +Synopsis +void XieFloUnconstrain (element, src) +XiePhotoElement *element; +XiePhototag src; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying constrained source data. +Description +An Unconstrain element produces unconstrained output data from constrained input data. +Output Attributes +Class same as src +Type unconstrained +Width same as src +Height same as src +Levels unknown +Structures +XieFloUnconstrain() sets the XiePhotoElement structure field elemType to +xieElemUnconstrain, which identifies the element as an Unconstrain, and sets the fields of the +member structure Unconstrain using the arguments in the argument list. + +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + } Unconstrain; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloMatch Unconstrained src data +xieErrNoFloSource Invalid src + XIElib - Photoflo Element Functions XieFloExportClientHistogram +Name +XieFloExportClientHistogram - specify an ExportClientHistogram element and set its parameters. +Synopsis +void XieFloExportClientHistogram (element, src, domain, notify) +XiePhotoElement *element; +XiePhototag src; +XieProcessDomain *domain; +XieExportNotify notify; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying single band constrained source data. +domain Specifies the subset of the source data from which the distribution will +be generated. +notify Specifies whether to enable sending an ExportAvailable event. +Description +An ExportClientHistogram element generates a histogram of the pixel values found in the source data. It +prepares histogram data that can be retrieved by the client using XieGetClientData(). An event +can be requested that will notify the client when histogram data becomes available. + +The data generated for the client is a list of XieHistogramData where each entry consists of a +value (i.e., a pixel value) followed by the count of pixels found with that value. If the number of pixels for +a given value exceeds the capacity of count, that count will be returned at the maximum value (i.e., 232- +1). Pixel values that are not found in the data are not included in the histogram data: no entries are +returned where count is zero. + +In order to specify a subset of source data that will be operated on, the phototag, offset_x, and +offset_y fields of the XieProcessDomain structure pointed to by domain must be supplied; +XIElib does not provide a convenience function to create and/or fill in an XieProcessDomain +structure. Only data that intersects with the subset specified by domain is included in the histogram. +If the entire source data is to be operated on, a pointer to an XieProcessDomain structure must still +be provided, with the phototag field set to zero (0); the offset_x and offset_y fields are +ignored. + +One of three standard export notify values can be assigned to notify: + +xieValDisable +xieValFirstData +xieValNewData + +If notify was specified as xieValFirstData, this event will only be sent the first time data +become available; otherwise, if xieValNewData was specified, this event will be generated each time +the amount of data available changes from zero to non-zero. +Structures +XieFloExportClientHistogram() sets the XiePhotoElement structure field elemType +to xieElemExportClientHistogram, which identifies the element as an ExportClientHistogram, +and sets the fields of the member structure ExportClientHistogram using the arguments in the +argument list. + +typedef unsigned XieExportNotify; +typedef unsigned XiePhototag; +typedef struct { + int offset_x; + int offset_y; + XiePhototag phototag; +} XieProcessDomain; +typedef struct { + unsigned long value; + unsigned long count; +} XieHistogramData; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieProcessDomain domain; + XieExportNotify notify; + } ExportClientHistogram; + ... + } data; +} XiePhotoElement; + +/* Definitions of ExportNotify */ +#define xieValDisable 1 +#define xieValFirstData 2 +#define xieValNewData 3 +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloDomain Invalid domain +xieErrNoFloMatch Unconstrained src data or +triple band src data +xieErrNoFloSource Invalid src +xieErrNoFloValue Invalid notify +See Also +XieGetClientData(). + XIElib - Photoflo Element Functions XieFloExportClientLUT +Name +XieFloExportClientLUT - specify an ExportClientLUT element and set its parameters. +Synopsis +void XieFloExportClientLUT (element, src, band_order, notify, start, +length) +XiePhotoElement *element; +XiePhototag src; +XieOrientation band_order; +XieExportNotify notify; +XieLTriplet start; +XieLTriplet length; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying lookup table data. +band_order Specifies the order of triple band arrays. +notify Specifies whether to enable sending an ExportAvailable event. +start Specifies the index of the first array entry that should be returned. +length Specifies the number of array entries that should be returned. +Description +An ExportClientLUT element allows data imported from an ImportLUT or an ImportClientLUT element to +be retrieved by the client. The actual transport of lookup table data through the protocol stream is +requested using XieGetClientData(). + +One of three standard export notify values can be assigned to notify: + +xieValDisable +xieValFirstData +xieValNewData + +If notify was specified as xieValFirstData, this event will only be sent the first time data +become available; otherwise, if xieValNewData was specified, this event will be generated each time +the amount of data available changes from zero to non-zero. + +band_order is the order in which triple band arrays are transmitted through the protocol stream. One +of the following standard orientation values can be assigned to band_order: + +xieValLSFirst +xieValMSFirst + +The least significant band of trichromatic data is the first band mentioned in the common name of the +colorspace: red is the least significant band of RGB data. For band-by-plane data, band_order +specifies whether this band corresponds with the least significant or most significant LUT array. Each +array is transported as a separate data stream: + +band +LSFirst +MSFirst + +0 +R7R6R5R4R3R2R1R0 +B7B6B5B4B3B2B1B0 + +1 +G7G6G5G4G3G2G1G0 +G7G6G5G4G3G2G1G0 + +2 +B7B6B5B4B3B2B1B0 +R7R6R5R4R3R2R1R0 + + +The size of each array entry is either 1, 2, or 4 bytes: the smallest size into which the output quantization +levels can be stored. When array entries require multiple bytes, the byte order per entry is determined in +the same manner as other numeric data: it is the byte orientation established at core X connection setup +time. +Structures +XieFloExportClientLUT() sets the XiePhotoElement structure field elemType to +xieElemExportClientLUT, which identifies the element as an ExportClientLUT, and sets the +fields of the member structure ExportClientLUT using the arguments in the argument list. + +typedef unsigned XieExportNotify; +typedef unsigned XieOrientation; +typedef unsigned long XieLTriplet[3]; +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieOrientation band_order; + XieExportNotify notify; + XieLTriplet start; + XieLTriplet length; + } ExportClientLUT; + ... + } data; +} XiePhotoElement; + +/* Definitions of ExportNotify */ +#define xieValDisable 1 +#define xieValFirstData 2 +#define xieValNewData 3 + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloMatch start + length exceeds number of entries in an array +xieErrNoFloSource Invalid src +xieErrNoFloValue Invalid notify or band_order +See Also + XieFloImportLUT(), XieFloImportClientLUT(), XieGetClientData(). + XIElib - Photoflo Element Functions XieFloExportClientPhoto +Name +XieFloExportClientPhoto - specify an ExportClientPhoto element and set its parameters. +Synopsis +void XieFloExportClientPhoto (element, src, notify, encode_tech, +encode_param) +XiePhotoElement *element; +XiePhototag src; +XieExportNotify notify; +XieEncodeTechnique encode_tech; +XiePointer encode_param; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying constrained data. +notify Specifies whether to enable sending an ExportAvailable event. +encode_tech Specifies the technique to compress or format the exported data. +encode_param Specifies the list of additional parameters required by encode_tech. +Description +An ExportClientPhoto element makes image data available to the protocol stream. The attributes of the +exported data are determined by the attributes of the source data. The format of the data is specified by +the encode_tech technique and encode_param. The actual transport of image data through the +protocol stream is requested using XieGetClientData(). + +One of three standard export notify values can be assigned to notify: + +xieValDisable +xieValFirstData +xieValNewData + +If notify was specified as xieValFirstData, this event will only be sent the first time data +become available; otherwise, if xieValNewData was specified, this event will be generated each time +the amount of data available changes from zero to non-zero. + +Encode techniques define the techniques that can be used to compress an image or format it as +uncompressed data. One of the following standard encode technique values can be assigned to +encode_tech: + +xieValEncodeServerChoice +xieValEncodeUncompressedSingle +xieValEncodeUncompressedTriple +xieValEncodeG31D +xieValEncodeG32D +xieValEncodeG42D +xieValEncodeJPEGBaseline +xieValEncodeJPEGLossless +xieValEncodeTIFF2 +xieValEncodeTIFFPackBits + +If a vendor defined additional private encode techniques, the private technique values given to these +techniques can be assigned to encode_tech. +Structures +XieFloExportClientPhoto() sets the XiePhotoElement structure field elemType to +xieElemExportClientPhoto, which identifies the element as an ExportClientPhoto, and sets the +fields of the member structure ExportClientPhoto using the arguments in the argument list. + +typedef unsigned XieExportNotify; +typedef unsigned XiePhototag; +typedef unsigned XieEncodeTechnique; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieExportNotify notify; + XieEncodeTechnique encode_tech; + XiePointer encode_param; + } ExportClientPhoto; + ... + } data; +} XiePhotoElement; + +/* Definitions of ExportNotify */ +#define xieValDisable 1 +#define xieValFirstData 2 +#define xieValNewData 3 + +/* Definitions for EncodeTechniques */ +#define xieValEncodeServerChoice 1 +#define xieValEncodeUncompressedSingle 2 +#define xieValEncodeUncompressedTriple 3 +#define xieValEncodeG31D 4 +#define xieValEncodeG32D 6 +#define xieValEncodeG42D 8 +#define xieValEncodeJPEGBaseline 10 +#define xieValEncodeJPEGLossless 12 +#define xieValEncodeTIFF2 14 +#define xieValEncodeTIFFPackBits 16 +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloMatch Unconstrained src data +xieErrNoFloSource Invalid src +xieErrNoFloTechnique Invalid encode_tech or encode_param +xieErrNoFloValue Invalid notify +See Also +XieGetClientData(). +XieTecEncodeUncompressedSingle(), XieTecEncodeUncompressedTriple(), XieTecEncodeG31D(), +XieTecEncodeG32D(), XieTecEncodeG42D(), XieTecEncodeServerChoice(), +XieTecEncodeJPEGBaseline(), XieTecEncodeJPEGLossless(), XieTecEncodeTIFF2(), +XieTecEncodeTIFFPackBits(). + XIElib - Photoflo Element Functions XieFloExportClientROI +Name +XieFloExportClientROI - specify an ExportClientROI element and set its parameters. +Synopsis +void XieFloExportClientROI (element, src, notify) +XiePhotoElement *element; +XiePhototag src; +XieExportNotify notify; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying the list-of-rectangles. +notify Specifies whether to enable sending an ExportAvailable event. +Description +An ExportClientROI element allows a list-of-rectangles, imported using an ImportROI or an +ImportClientROI element, to be retrieved by the client. The actual transport of list-of-rectangles data +through the protocol stream is requested using a GetClientData element. + +One of three standard export notify values can be assigned to notify: + +xieValDisable +xieValFirstData +xieValNewData + +If notify was specified as xieValFirstData, this event will only be sent the first time data +become available; otherwise, if xieValNewData was specified, this event will be generated each time +the amount of data available changes from zero to non-zero. +Structures +XieFloExportClientROI() sets the XiePhotoElement structure field elemType to +xieElemExportClientROI, which identifies the element as an ExportClientROI, and sets the +fields of the member structure ExportClientROI using the arguments in the argument list. + +typedef unsigned XieExportNotify; +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieExportNotify notify; + } ExportClientROI; + ... + } data; +} XiePhotoElement; + +/* Definitions of ExportNotify */ +#define xieValDisable 1 +#define xieValFirstData 2 +#define xieValNewData 3 +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloSource Invalid src +xieErrNoFloValue Invalid notify +See Also +XieFloImportROI(), XieFloImportClientROI(), XieFloGetClientData(). + XIElib - Photoflo Element Functions XieFloExportDrawable +Name +XieFloExportDrawable - specify an ExportDrawable element and set its parameters. +Synopsis +void XieFloExportDrawable (element, src, drawable, gc, dst_x, dst_y) +XiePhotoElement *element; +XiePhototag src; +Drawable drawable; +GC gc; +int dst_x; +int dst_y; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying constrained source data. +drawable Specifies the Window or Pixmap into which the data will be written. +gc Specifies the GContext to be used when transferring pixels to +drawable. +dst_x Specifies where the data should be placed in drawable. +dst_y Specifies where the data should be placed in drawable. +Description +An ExportDrawable element allows Colormap index data to be exported to a Window or Pixmap. + +The following components are used from gc: function, plane-mask, subwindow-mode, clip-x-origin, +clip-y-origin, and clip-mask. + +The levels of src must exactly match the depth of drawable and gc (i.e., levels must be 2depth). +Structures +XieFloExportDrawable() sets the XiePhotoElement structure field elemType to +xieElemExportDrawable, which identifies the element as an ExportDrawable, and sets the fields +of the member structure ExportDrawable using the arguments in the argument list. + +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + Drawable drawable; + GC gc; + int dst_x; + int dst_y; + } ExportDrawable; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloDrawable Invalid drawable +xieErrNoFloGC Invalid gc +xieErrNoFloMatch Invalid src data: triple band, unconstrained, levels doesn't match depth +xieErrNoFloSource Invalid src + XIElib - Photoflo Element Functions XieFloExportDrawablePlane +Name +XieFloExportDrawablePlane - specify an ExportDrawablePlane element and set its parameters. +Synopsis +void XieFloExportDrawablePlane (element, src, drawable, gc, dst_x, +dst_y) +XiePhotoElement *element; +XiePhototag src; +Drawable drawable; +GC gc; +int dst_x; +int dst_y; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying constrained bitonal source data. +drawable Specifies the Window or Pixmap into which the data will be written. +gc Specifies the GContext to be used when transferring pixels to +drawable. +dst_x Specifies where the data should be placed in drawable. +dst_y Specifies where the data should be placed in drawable. +Description +An ExportDrawablePlane element allows single-band single-bit (bitonal) data to be exported to a +Window or a Pixmap. + +The following components are used from gc: function, plane-mask, foreground, background, fill-style, +subwindow-mode, clip-x-origin, clip-y-origin, and clip-mask. For the fill-style component of gc, values +of FillSolid and FillTiled are treated as synonyms for FillOpaqueStippled. +Structures +XieFloExportDrawablePlane() sets the XiePhotoElement structure field elemType to +xieElemExportDrawablePlane, which identifies the element as an ExportDrawablePlane, and +sets the fields of the member structure ExportDrawablePlane using the arguments in the +argument list. + +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + Drawable drawable; + GC gc; + int dst_x; + int dst_y; + } ExportDrawablePlane; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloDrawable Invalid drawable +xieErrNoFloGC Invalid gc +xieErrNoFloMatch Invalid src data: triple band, not constrained, levels > 2 +xieErrNoFloSource Invalid src + XIElib - Photoflo Element Functions XieFloExportLUT +Name +XieFloExportLUT - specify an ExportLUT element and set its parameters. +Synopsis +void XieFloExportLUT (element, src, lut, merge, start) +XiePhotoElement *element; +XiePhototag src; +XieLut lut; +Bool merge; +XieLTriplet start; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying lookup table data. +lut Specifies the ID of the LUT to receive the data. +merge Specifies how new array entries replace existing entries. +start Specifies the index of the first array entry that should be written in lut. +Description +An ExportLUT element allows data imported from an ImportLUT or ImportClientLUT element to be +saved in an existing LUT resource. + +merge specifies that new array entries from src should replace entries that already exist within lut. If +merge is False, start must be 0 for each band. In this case, lut will inherit the attributes of src +and be populated with its data; the previous attributes and data of lut are overwritten when the +photoflo completes. If merge is True and lut has existing attributes, the data from src will replace +the data from lut, beginning at position start. If merge is True but lut has not yet been +populated, it is an error. + +The attributes of src must match those of lut, and the combination of start and the length of src +must specify a valid sub-range existing within lut. +Structures +XieFloExportLUT() sets the XiePhotoElement structure field elemType to +xieElemExportLUT, which identifies the element as an ExportLUT, and sets the fields of the +member structure ExportLUT using the arguments in the argument list. + +typedef XID XieLut; +typedef unsigned long XieLTriplet[3]; +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieLut lut; + Bool merge; + XieLTriplet start; + } ExportLUT; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloLUT Invalid lut +xieErrNoFloMatch merge true and attributes do not match between src and lut or +merge true and start + src length is not a sub-range of lut +xieErrNoFloSource Invalid src +xieErrNoFloValue merge false and start non-zero +See Also +XieFloImportLUT(), XieFloImportClientLUT(). + XIElib - Photoflo Element Functions XieFloExportPhotomap +Name +XieFloExportPhotomap - specify an ExportPhotomap element and set its parameters. +Synopsis +void XieFloExportPhotomap (element, src, photomap, encode_tech, +encode_param) +XiePhotoElement *element; +XiePhototag src; +XiePhotomap photomap; +XieEncodeTechnique encode_tech; +XiePointer encode_param; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying source data. +photomap Specifies the photomap structure to receive the data. +encode_tech Specifies the image compression or formatting technique. +encode_param Specifies the list of additional parameters required by encode_tech. +Description +An ExportPhotomap element allows data from photoflo operations to be saved in a photomap. A +photomap is a server resource which can be used to store image data. + +photomap will inherit the attributes of src and be populated with its data. The previous attributes +and data of photomap are overwritten when the photoflo completes. + +Encode techniques define the techniques that can be used to compress an image or format it as +uncompressed data. One of the following standard encode technique values can be assigned to +encode_tech: + +xieValEncodeServerChoice +xieValEncodeUncompressedSingle +xieValEncodeUncompressedTriple +xieValEncodeG31D +xieValEncodeG32D +xieValEncodeG42D +xieValEncodeJPEGBaseline +xieValEncodeJPEGLossless +xieValEncodeTIFF2 +xieValEncodeTIFFPackBits + +If a vendor defined additional private encode techniques, the private technique values given to these +techniques can be assigned to encode_tech. +Structures +XieFloExportPhotomap() sets the XiePhotoElement structure field elemType to +xieElemExportPhotomap, which identifies the element as an ExportPhotomap, and sets the fields +of the member structure ExportPhotomap using the arguments in the argument list. + +typedef unsigned XiePhototag; +typedef XID XiePhotomap; +typedef unsigned XieEncodeTechnique; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XiePhotomap photomap; + XieEncodeTechnique encode_tech; + XiePointer encode_param; + } ExportPhotomap; + ... + } data; +} XiePhotoElement; + +/* Definitions for EncodeTechniques */ +#define xieValEncodeServerChoice 1 +#define xieValEncodeUncompressedSingle 2 +#define xieValEncodeUncompressedTriple 3 +#define xieValEncodeG31D 4 +#define xieValEncodeG32D 6 +#define xieValEncodeG42D 8 +#define xieValEncodeJPEGBaseline 10 +#define xieValEncodeJPEGLossless 12 +#define xieValEncodeTIFF2 14 +#define xieValEncodeTIFFPackBits 16 +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloPhotomap Invalid photomap +xieErrNoFloSource Invalid src +xieErrNoFloTechnique Invalid encode_tech or encode_param +See Also +XieTecEncodeUncompressedSingle(), XieTecEncodeUncompressedTriple(), XieTecEncodeG31D(), +XieTecEncodeG32D(), XieTecEncodeG42D(), XieTecEncodeServerChoice(), +XieTecEncodeJPEGBaseline(), XieTecEncodeTIFF2(), XieTecEncodeTIFFPackBits(). + XIElib - Photoflo Element Functions XieFloExportROI +Name +XieFloExportROI - specify an ExportROI element and set its parameters. +Synopsis +void XieFloExportROI (element, src, roi) +XiePhotoElement *element; +XiePhototag src; +XieRoi roi; +Arguments +element Specifies the XiePhotoElement structure to use. +src Specifies the element supplying a list-of-rectangles. +roi Specifies the ID of the ROI to receive the data. +Description +An ExportROI element allows data imported from an ImportROI or ImportClientROI element to be saved +in an existing Rectangles-Of-Interest (ROI). + +roi will be populated with new data. The previous data of roi are overwritten after the photoflo +completes. +Structures +XieFloExportROI() sets the XiePhotoElement structure field elemType to +xieElemExportROI, which identifies the element as an ExportROI, and sets the fields of the member +structure ExportROI using the arguments in the argument list. + +typedef XID XieRoi; +typedef unsigned XiePhototag; + +typedef struct { + int elemType; + union { + ... + struct { + XiePhototag src; + XieRoi roi; + } ExportROI; + ... + } data; +} XiePhotoElement; +Errors +xieErrNoFloAlloc Insufficient resources (e.g. memory) +xieErrNoFloROI Invalid roi +xieErrNoFloSource Invalid src +See Also +XieFloImportROI(), XieFloImportClientROI(). + XIElib - Technique Functions XieTecColorAllocAll +Name +XieTecColorAllocAll - allocate and fill an XieColorAllocAllParam structure. +Synopsis +XieColorAllocAllParam *XieTecColorAllocAll (fill) +unsigned long fill; +Arguments +fill Specifies the value to map new pixels. +Returns +The XieColorAllocAllParam structure. +Description +XieTecColorAllocAll() allocates and returns a pointer to an XieColorAllocAllParam +structure. The returned structure represents the list of parameters required by the AllocAll color +allocation technique and may be used as the color_alloc_param argument of +XieFloConvertToIndex() (when the color_alloc_tech argument is +xieValColorAllocAll). + +If insufficient memory is available, XieTecColorAllocAll() returns NULL. To free the memory +allocated to this structure, use XFree(). + +The AllocAll color allocation technique allocates a read-only Colormap cell for each new pixel found. If +the Colormap runs out of cells, the remaining new pixels are mapped to fill. A ColorAlloc event, +which warns the client that results are of lesser fidelity than desired, can be sent if it is necessary to use +fill. AllocAll is only appropriate for dynamic Colormaps and requires that the number of discrete +image pixels fit within the size of the Colormap to avoid running out of cells. +Structures +XieTecColorAllocAll() sets the structure field fill to the value of the argument fill. + +typedef struct { + unsigned long fill; +} XieColorAllocAllParam; +See Also +XieFloConvertToIndex(). + XIElib - Technique Functions XieTecColorAllocMatch +Name +XieTecColorAllocMatch - allocate and fill an XieColorAllocMatchParam structure. +Synopsis +XieColorAllocMatchParam *XieTecColorAllocMatch (match_limit, +gray_limit) +double match_limit; +double gray_limit; +Arguments +match_limit Specifies the color allocation control value. +gray_limit Specifies the gray scale allocation control value. +Returns +The XieColorAllocMatchParam structure. +Description +XieTecColorAllocMatch() allocates and returns a pointer to an +XieColorAllocMatchParam structure. The returned structure represents the list of parameters +required by the AllocMatch color allocation technique and may be used as the +color_alloc_param argument of XieFloConvertToIndex() (when the +color_alloc_tech argument is xieValColorAllocMatch). + +If insufficient memory is available, XieTecColorAllocMatch() returns NULL. To free the +memory allocated to this structure, use XFree(). + +The AllocMatch color allocation technique allows a trade-off between image fidelity and Colormap +usage via a pair of granularity parameters. The highest priority is given to allocating read-only cells in a +sequence that provides an even distribution of pixels throughout the colorspace. Secondary priority is +given to the frequency of usage of image pixels. Any image pixel which is a close enough match to an +existing read-only cell will share that cell (where close is determined by the granularity controls). For +other image pixels, new read-only allocations are made. When no more cells are available, each +remaining image pixel is matched to the closest read-only cell. The AllocMatch color allocation +technique is appropriate for both static and dynamic Colormaps. For the sake of computational +efficiency the number of discrete image pixels should not exceed the size of the Colormap. + +match_limit and gray_match control the allocation of colors and gray shades respectively. The +minimum value (0.0) specifies exact matches (within the limits of the Colormap). The maximum value (1.0) +encompasses the entire colorspace within which no new cells are allocated. A ColorAlloc event, +which warns the client that results are of lesser fidelity than desired, can be sent if the Colormap runs +out of cells. +Structures +XieTecColorAllocMatch() sets the structure field match_limit to the value of the argument +match_limit; and the structure field gray_limit to the value of the argument gray_limit. + +typedef struct { + float match_limit; + float gray_limit; +} XieColorAllocMatchParam; +See Also +XieFloConvertToIndex(). + XIElib - Technique Functions XieTecColorAllocRequantize +Name +XieTecColorAllocRequantize - allocate and fill an XieColorAllocRequantizeParam structure. +Synopsis +XieColorAllocRequantizeParam *XieTecColorAllocRequantize (max_cells) +unsigned long max_cells; +Arguments +max_cells Specifies the maximum number of Colormap allocations to allow. +Returns +The XieColorAllocRequantizeParam structure. +Description +XieTecColorAllocRequantize() allocates and returns a pointer to an +XieColorAllocRequantizeParam structure. The returned structure represents the list of +parameters required by the AllocRequantize color allocation technique and may be used as the +color_alloc_param argument of XieFloConvertToIndex() (when the +color_alloc_tech argument is xieValColorAllocRequantize). + +If insufficient memory is available, XieTecColorAllocRequantize() returns NULL. To free the +memory allocated to this structure, use XFree(). + +The AllocRequantize color allocation technique first reduces the total number of discrete pixel values in +the image to be no more than a specified number, and then allocates the resulting pixel values as read- +only cells from the Colormap. One method of accomplishing this reduction process can be found in +"Color image quantization for frame buffer display", Heckbert, P. S., Comput. Graph. 16, 3. + +If max_cells is zero or greater than the number of unallocated Colormap cells, the reduction +algorithm will restrict its output to the number of free cells. A ColorAlloc event, which warns the +client that results are of lesser fidelity than desired, can be sent if the number of pixels had to be +restricted to a lesser number than max_cells due to a lack of free Colormap cells. The +AllocRequantize color allocation technique is only appropriate for dynamic Colormaps. +Structures +XieTecColorAllocRequantize() sets the structure field max_cells to the value of the +argument max_cells. + +typedef struct { + unsigned long max_cells; +} XieColorAllocRequantizeParam; +See Also +XieFloConvertToIndex(). + XIElib - Technique Functions XieTecRGBToCIELab +Name +XieTecRGBToCIELab - allocate and fill an XieRGBToCIELabParam structure. +Synopsis +XieRGBToCIELabParam *XieTecRGBToCIELab (matrix, white_adjust_tech, +white_adjust_param) +XieMatrix matrix; +XieWhiteAdjustTechnique white_adjust_tech; +XiePointer white_adjust_param; +Arguments +matrix Specifies the conversion matrix. +white_adjust_tech Specifies the WhiteAdjust technique to be used. +white_adjust_param Specifies the list of parameters required by white_adjust_tech. +Returns +The XieRGBToCIELabParam structure. +Description +XieTecRGBToCIELab() allocates and returns a pointer to an XieRGBToCIELabParam +structure. The returned structure represents the list of parameters required by the RGBToCIELab color +conversion technique and may be used as the color_param argument of +XieFloConvertFromRGB() (when the color_space argument is xieValRGBToCIELab). + +If insufficient memory is available, XieTecRGBToCIELab() returns NULL. To free the memory +allocated to this structure, use XFree(). + +XieTecRGBToCIELab() converts RGB data to the CIELab colorspace, an international standard +designed for perceptual uniformity. The colorspace coordinates are denoted by L, a, and b, and is +defined in: CIE. Recommendations on Uniform Color Spaces, Color-Difference Equations, Psychometric +Color Terms. Bureau Central de la CIE (Supplement 2 of CIE Publication 15 (E-1.3.1) 1971) 1978. + +matrix is a 3x3 RGB to CIEXYZ conversion matrix (the source white point is also encoded in +matrix). white_adjust_tech is the WhiteAdjust technique that can be used to shift the white +point of the output data. white_adjust_param is the list of parameters required by +white_adjust_tech. + +The input data type can be constrained or unconstrained; the output data type is always +unconstrained. When the input is constrained, the data are normalized to the range [0, 1] (i.e., scaled by +1/(levels - 1) prior to the conversion). + +WhiteAdjust techniques define the white point adjustment techniques which can be used when +converting to or from the RGB colorspace. One of the following standard WhiteAdjust technique +values can be assigned to white_adjust_tech: + +xieValWhiteAdjustDefault +xieValWhiteAdjustNone +xieValWhiteAdjustCIELabShift + +If a vendor defined additional private WhiteAdjust techniques, the private technique values given to +these techniques can be assigned to white_adjust_tech. + +The server is required to support the default technique which is bound to one of the standard +techniques defined above or a private technique. +Structures +XieTecRGBToCIELab() sets the structure field matrix to the values of the argument matrix; +the structure field white_adjust_tech to the value of the argument white_adjust_tech; and +the structure field white_adjust_param to the value of the argument white_adjust_param. + +typedef float XieMatrix[9]; +typedef unsigned XieWhiteAdjustTechnique; +typedef struct { + XieMatrix matrix; + XieWhiteAdjustTechnique white_adjust_tech; + XiePointer white_adjust_param; +} XieRGBToCIELabParam; + +/* Definitions for WhiteAdjust Techniques */ +#define xieValWhiteAdjustDefault 0 +#define xieValWhiteAdjustNone 1 +#define xieValWhiteAdjustCIELabShift 2 +See Also +XieFloConvertFromRGB(), XieTecWhiteAdjustCIELabShift(). + XIElib - Technique Functions XieTecRGBToCIEXYZ +Name +XieTecRGBToCIEXYZ - allocate and fill an XieRGBToCIEXYZParam structure. +Synopsis +XieRGBToCIEXYZParam *XieTecRGBToCIEXYZ (matrix, white_adjust_tech, +white_adjust_param) +XieMatrix matrix; +XieWhiteAdjustTechnique white_adjust_tech; +XiePointer white_adjust_param; +Arguments +matrix Specifies the conversion matrix. +white_adjust_tech Specifies the WhiteAdjust technique to be used. +white_adjust_param Specifies the list of parameters required by white_adjust_tech. +Returns +The XieRGBToCIEXYZParam structure. +Description +XieTecRGBToCIEXYZ() allocates and returns a pointer to an XieRGBToCIEXYZParam +structure. The returned structure represents the list of parameters required by the RGBToCIEXYZ color +conversion technique and may be used as the color_param argument of +XieFloConvertFromRGB() (when the color_space argument is xieValRGBToCIEXYZ). + +If insufficient memory is available, XieTecRGBToCIEXYZ() returns NULL. To free the memory +allocated to this structure, use XFree(). + +XieTecRGBToCIEXYZ() converts RGB data to the CIEXYZ colorspace, an international standard +designed for perceptual uniformity, which is defined in: CIE. Recommendations on Uniform Color +Spaces, Color-Difference Equations, Psychometric Color Terms. Bureau Central de la CIE (Supplement 2 +of CIE Publication 15 (E-1.3.1) 1971) 1978. + +matrix is a 3x3 RGB to CIEXYZ conversion matrix (the source white point is also encoded in +matrix). white_adjust_tech is the WhiteAdjust technique that can be used to shift the white +point of the output data. white_adjust_param is the list of parameters required by +white_adjust_tech. + +The input data type can be constrained or unconstrained; the output data type is always +unconstrained. When the input is constrained, the data are normalized to the range [0, 1] (i.e., scaled by +1/(levels - 1) prior to the conversion). + +WhiteAdjust techniques define the white point adjustment techniques which can be used when +converting to or from the RGB colorspace. One of the following standard WhiteAdjust technique +values can be assigned to white_adjust_tech: + +xieValWhiteAdjustDefault +xieValWhiteAdjustNone +xieValWhiteAdjustCIELabShift + +If a vendor defined additional private WhiteAdjust techniques, the private technique values given to +these techniques can be assigned to white_adjust_tech. + +The server is required to support the default technique which is bound to one of the standard +techniques defined above or a private technique. +Structures +XieTecRGBToCIEXYZ() sets the structure field matrix to the values of the argument matrix; +the structure field white_adjust_tech to the value of the argument white_adjust_tech; and +the structure field white_adjust_param to the value of the argument white_adjust_param. + +typedef float XieMatrix[9]; +typedef unsigned XieWhiteAdjustTechnique; +typedef struct { + XieMatrix matrix; + XieWhiteAdjustTechnique white_adjust_tech; + XiePointer white_adjust_param; +} XieRGBToCIEXYZParam; + +/* Definitions for WhiteAdjust Techniques */ +#define xieValWhiteAdjustDefault 0 +#define xieValWhiteAdjustNone 1 +#define xieValWhiteAdjustCIELabShift 2 +See Also +XieFloConvertFromRGB(), XieTecWhiteAdjustCIELabShift(). + XIElib - Technique Functions XieTecRGBToYCbCr +Name +XieTecRGBToYCbCr - allocate and fill an XieRGBToYCbCrParam structure. +Synopsis +XieRGBToYCbCrParam *XieTecRGBToYCbCr (levels, luma_red, luma_green, +luma_blue, bias) +XieLevels levels; +double luma_red; +double luma_green; +double luma_blue; +XieConstant bias; +Arguments +levels Specifies the output levels. +luma_red Specifies the proportion of red in the luminance band. +luma_green Specifies the proportion of green in the luminance band. +luma_blue Specifies the proportion of blue in the luminance band. +bias Specifies an offset to add to the output pixels values. +Returns +The XieRGBToYCbCrParam structure. +Description +XieTecRGBToYCbCr() allocates and returns a pointer to an XieRGBToYCbCrParam structure. +The returned structure represents the list of parameters required by the RGBToYCbCr color conversion +technique and may be used as the color_param argument of XieFloConvertFromRGB() +(when the color_space argument is xieValRGBToYCbCr). + +If insufficient memory is available, XieTecRGBToYCbCr() returns NULL. To free the memory +allocated to this structure, use XFree(). + +XieTecRGBToYCbCr() converts RGB data to the YCbCr colorspace. Source data may be +constrained or unconstrained; the output type will match. If the source data is constrained, levels +determines the output levels; otherwise levels is ignored. +Structures +XieTecRGBToYCbCr() sets the structure field levels to the values of the argument levels; the +structure fields luma_red, luma_green, luma_blue to the values of the arguments luma_red, +luma_green, luma_blue; and the structure field bias to the values of the argument bias. + +typedef float XieConstant[3]; +typedef unsigned long XieLevels[3]; +typedef struct { + XieLevels levels; + float luma_red; + float luma_green; + float luma_blue; + XieConstant bias; +} XieRGBToYCbCrParam; +See Also +XieFloConvertFromRGB(). + XIElib - Technique Functions XieTecRGBToYCC +Name +XieTecRGBToYCC - allocate and fill an XieRGBToYCCParam structure. +Synopsis +XieRGBToYCCParam *XieTecRGBToYCC (levels, luma_red, luma_green, +luma_blue, scale) +XieLevels levels; +double luma_red; +double luma_green; +double luma_blue; +double scale; +Arguments +levels Specifies the output levels. +luma_red Specifies the proportion of red in the luminance band. +luma_green Specifies the proportion of green in the luminance band. +luma_blue Specifies the proportion of blue in the luminance band. +scale Specifies a compression factor to apply to the output pixels values. +Returns +The XieRGBToYCCParam structure. +Description +XieTecRGBToYCC() allocates and returns a pointer to an XieRGBToYCCParam structure. The +returned structure represents the list of parameters required by the RGBToYCC color conversion +technique and may be used as the color_param argument of XieFloConvertFromRGB() +(when the color_space argument is xieValRGBToYCC). + +If insufficient memory is available, XieTecRGBToYCC() returns NULL. To free the memory allocated +to this structure, use XFree(). + +XieTecRGBToYCC() converts RGB data to the YCC colorspace. The PhotoYCC color-encoding +scheme is defined in: KODAK PhotoCD System - A Planning Guide for Developers, Eastman Kodak +Co., Part no. DCI200R, 1991. + +Source data may be constrained or unconstrained; the output type will match. If the source data is +constrained, levels determines the output levels; otherwise levels is ignored. Typical values cited +in the literature for scale are in the range of about 1.35 to 1.4. +Structures +XieTecRGBToYCC() sets the structure field levels to the values of the argument levels; the +structure fields luma_red, luma_green, luma_blue are set to the values of the arguments +luma_red, luma_green, luma_blue; and the structure field scale to the value of the argument +scale. + +typedef unsigned long XieLevels[3]; +typedef struct { + XieLevels levels; + float luma_red; + float luma_green; + float luma_blue; + float scale; +} XieRGBToYCCParam; +See Also +XieFloConvertFromRGB(). + XIElib - Technique Functions XieTecCIELabToRGB +Name +XieTecCIELabToRGB - allocate and fill an XieCIELabToRGBParam structure. +Synopsis +XieCIELabToRGBParam *XieTecCIELabToRGB (matrix, white_adjust_tech, +white_adjust_param, gamut_tech, gamut_param) +XieMatrix matrix; +XieWhiteAdjustTechnique white_adjust_tech; +XiePointer white_adjust_param; +XieGamutTechnique gamut_tech; +XiePointer gamut_param; +Arguments +matrix Specifies the conversion matrix. +white_adjust_tech Specifies the WhiteAdjust technique to be used. +white_adjust_param Specifies the list of parameters required by white_adjust_tech. +gamut_tech Specifies the Gamut technique to be used. +gamut_param Specifies the list of parameters required by gamut_tech. +Returns +The XieCIELabToRGBParam structure. +Description +XieTecCIELabToRGB() allocates and returns a pointer to an XieCIELabToRGBParam +structure. The returned structure represents the list of parameters required by the CIELabToRGB color +conversion technique and may be used as the color_param argument of +XieFloConvertToRGB() (when the color_space argument is xieValCIELabToRGB). + +If insufficient memory is available, XieTecCIELabToRGB() returns NULL. To free the memory +allocated to this structure, use XFree(). + +XieTecCIELabToRGB() converts CIELab data to the RGB colorspace. The CIELab colorspace is an +international standard designed for perceptual uniformity. The colorspace coordinates are denoted by +L, a, and b, and is defined in: CIE. Recommendations on Uniform Color Spaces, Color-Difference +Equations, Psychometric Color Terms. Bureau Central de la CIE (Supplement 2 of CIE Publication 15 (E- +1.3.1) 1971) 1978. + +matrix is a 3x3 CIEXYZ to RGB conversion matrix (the target white point is also encoded in matrix). +white_adjust_tech is the WhiteAdjust technique that can be used to shift the white point of the +source data prior to conversion. white_adjust_param is the list of parameters required by +white_adjust_tech. gamut_tech is the Gamut technique that can be used to keep the output +pixels within the bounds of the RGB colorspace. gamut_param is the list of parameters required by +gamut_tech. + +The input data type must be unconstrained; the output data type is also unconstrained. + +WhiteAdjust techniques define the white point adjustment techniques which can be used when +converting to or from the RGB colorspace. One of the following standard WhiteAdjust technique +values can be assigned to white_adjust_tech: + +xieValWhiteAdjustDefault +xieValWhiteAdjustNone +xieValWhiteAdjustCIELabShift + +If a vendor defined additional private WhiteAdjust techniques, the private technique values given to +these techniques can be assigned to white_adjust_tech. + +The server is required to support the default technique which is bound to one of the standard +techniques defined above or a private technique. + +Gamut techniques define the gamut compression techniques used to deal with converted colors which +lie outside the gamut of the RGB space. One of the following standard gamut technique values can be +assigned to gamut_tech: + +xieValGamutDefault +xieValGamutNone +xieValGamutClipRGB + +If a vendor defined additional private gamut techniques, the private technique values given to these +techniques can be assigned to gamut_tech. + +The server is required to support the default technique which is bound to one of the standard +techniques defined above or a private technique. +Structures +XieTecCIELabToRGB() sets the structure field matrix to the values of the argument matrix; +the structure field white_adjust_tech to the value of the argument white_adjust_tech; the +structure field white_adjust_param to the value of the argument white_adjust_param; the +structure field gamut_tech to the value of the argument gamut_tech; and the structure field +gamut_param to the value of the argument gamut_param. + +typedef float XieMatrix[9]; +typedef unsigned XieGamutTechnique; +typedef unsigned XieWhiteAdjustTechnique; +typedef struct { + XieMatrix matrix; + XieWhiteAdjustTechnique white_adjust_tech; + XiePointer white_adjust_param; + XieGamutTechnique gamut_tech; + XiePointer gamut_param; +} XieCIELabToRGBParam; + +/* Definitions for WhiteAdjust Techniques */ +#define xieValWhiteAdjustDefault 0 +#define xieValWhiteAdjustNone 1 +#define xieValWhiteAdjustCIELabShift 2 + +/* Definitions for Gamut Techniques */ +#define xieValGamutDefault 0 +#define xieValGamutNone 1 +#define xieValGamutClipRGB 2 +See Also +XieFloConvertToRGB(), XieTecWhiteAdjustCIELabShift(). + XIElib - Technique Functions XieTecCIEXYZToRGB +Name +XieTecCIEXYZToRGB - allocate and fill an XieCIEXYZToRGBParam structure. +Synopsis +XieCIEXYZToRGBParam *XieTecCIEXYZToRGB (matrix, white_adjust_tech, +white_adjust_param, gamut_tech, gamut_param) +XieMatrix matrix; +XieWhiteAdjustTechnique white_adjust_tech; +XiePointer white_adjust_param; +XieGamutTechnique gamut_tech; +XiePointer gamut_param; +Arguments +matrix Specifies the conversion matrix. +white_adjust_tech Specifies the WhiteAdjust technique to be used. +white_adjust_param Specifies the list of parameters required by white_adjust_tech. +gamut_tech Specifies the Gamut technique to be used. +gamut_param Specifies the list of parameters required by gamut_tech. +Returns +The XieCIEXYZToRGBParam structure. +Description +XieTecCIEXYZToRGB() allocates and returns a pointer to an XieCIEXYZToRGBParam +structure. The returned structure represents the list of parameters required by the CIEXYZToRGB color +conversion technique and may be used as the color_param argument of +XieFloConvertToRGB() (when the color_space argument is xieValCIEXYZToRGB). + +If insufficient memory is available, XieTecCIEXYZToRGB() returns NULL. To free the memory +allocated to this structure, use XFree(). + +XieTecCIEXYZToRGB() converts CIEXYZ data to the RGB colorspace. The CIEXYZ colorspace is +an international standard designed for perceptual uniformity, which is defined in: CIE. +Recommendations on Uniform Color Spaces, Color-Difference Equations, Psychometric Color Terms. +Bureau Central de la CIE (Supplement 2 of CIE Publication 15 (E-1.3.1) 1971) 1978. + +matrix is a 3x3 CIEXYZ to RGB conversion matrix (the target white point is also encoded in matrix). +white_adjust_tech is the WhiteAdjust technique that can be used to shift the white point of the +source data prior to conversion. white_adjust_param is the list of parameters required by +white_adjust_tech. gamut_tech is the Gamut technique that can be used to keep the output +pixels within the bounds of the RGB colorspace. gamut_param is the list of parameters required by +gamut_tech. + +The input data type must be unconstrained; the output data type is also unconstrained. + +WhiteAdjust techniques define the white point adjustment techniques which can be used when +converting to or from the RGB colorspace. One of the following standard WhiteAdjust technique +values can be assigned to white_adjust_tech: + +xieValWhiteAdjustDefault +xieValWhiteAdjustNone +xieValWhiteAdjustCIELabShift + +If a vendor defined additional private WhiteAdjust techniques, the private technique values given to +these techniques can be assigned to white_adjust_tech. + +The server is required to support the default technique which is bound to one of the standard +techniques defined above or a private technique. + +Gamut techniques define the gamut compression techniques used to deal with converted colors which +lie outside the gamut of the RGB space. One of the following standard gamut technique values can be +assigned to gamut_tech: + +xieValGamutDefault +xieValGamutNone +xieValGamutClipRGB + +If a vendor defined additional private gamut techniques, the private technique values given to these +techniques can be assigned to gamut_tech. + +The server is required to support the default technique which is bound to one of the standard +techniques defined above or a private technique. +Structures +XieTecCIEXYZToRGB() sets the structure field matrix to the values of the argument matrix; +the structure field white_adjust_tech to the value of the argument white_adjust_tech; the +structure field white_adjust_param to the value of the argument white_adjust_param; the +structure field gamut_tech to the value of the argument gamut_tech; and the structure field +gamut_param to the value of the argument gamut_param. + +typedef float XieMatrix[9]; +typedef unsigned XieGamutTechnique; +typedef unsigned XieWhiteAdjustTechnique; +typedef struct { + XieMatrix matrix; + XieWhiteAdjustTechnique white_adjust_tech; + XiePointer white_adjust_param; + XieGamutTechnique gamut_tech; + XiePointer gamut_param; +} XieCIEXYZToRGBParam; + +/* Definitions for WhiteAdjust Techniques */ +#define xieValWhiteAdjustDefault 0 +#define xieValWhiteAdjustNone 1 +#define xieValWhiteAdjustCIELabShift 2 + +/* Definitions for Gamut Techniques */ +#define xieValGamutDefault 0 +#define xieValGamutNone 1 +#define xieValGamutClipRGB 2 +See Also +XieFloConvertToRGB(), XieTecWhiteAdjustCIELabShift(). + XIElib - Technique Functions XieTecYCbCrToRGB +Name +XieTecYCbCrToRGB - allocate and fill an XieYCbCrToRGBParam structure. +Synopsis +XieYCbCrToRGBParam *XieTecYCbCrToRGB (levels, luma_red, luma_green, +luma_blue, bias, gamut_tech, gamut_param) +XieLevels levels; +double luma_red; +double luma_green; +double luma_blue; +XieConstant bias; +XieGamutTechnique gamut_tech; +XiePointer gamut_param; +Arguments +levels Specifies the output levels. +luma_red Specifies the proportion of red in the luminance band (Y). +luma_green Specifies the proportion of green in the luminance band (Y). +luma_blue Specifies the proportion of blue in the luminance band (Y). +bias Specifies an offset to remove from the source pixels values. +gamut_tech Specifies the Gamut technique to be used. +gamut_param Specifies the list of parameters required by gamut_tech. +Returns +The XieYCbCrToRGBParam structure. +Description +XieTecYCbCrToRGB() allocates and returns a pointer to an XieYCbCrToRGBParam structure. +The returned structure represents the list of parameters required by the YCbCrToRGB color conversion +technique and may be used as the color_param argument of XieFloConvertToRGB() (when +the color_space argument is xieValYCbCrToRGB). + +If insufficient memory is available, XieTecYCbCrToRGB() returns NULL. To free the memory +allocated to this structure, use XFree(). + +XieTecYCbCrToRGB() converts YCbCr data to the RGB colorspace. Source data may be +constrained or unconstrained; the output type will match. If the source data is constrained, levels +determines the output levels; otherwise levels is ignored. + +Gamut techniques define the gamut compression techniques used to deal with converted colors which +lie outside the gamut of the RGB space. One of the following standard gamut technique values can be +assigned to gamut_tech: + +xieValGamutDefault +xieValGamutNone +xieValGamutClipRGB + +If a vendor defined additional private gamut techniques, the private technique values given to these +techniques can be assigned to gamut_tech. + +The server is required to support the default technique which is bound to one of the standard +techniques defined above, or a private technique. +Structures +XieTecYCbCrToRGB() sets the structure field levels to the values of the argument levels; the +structure fields luma_red, luma_green, luma_blue to the values of the arguments luma_red, +luma_green, luma_blue; the structure field bias to the values of the argument bias; the +structure field gamut_tech to the value of the argument gamut_tech; and the structure field +gamut_param to the value of the argument gamut_param. + +typedef float XieConstant[3]; +typedef unsigned long XieLevels[3]; +typedef unsigned XieGamutTechnique; +typedef struct { + XieLevels levels; + float luma_red; + float luma_green; + float luma_blue; + XieConstant bias; + XieGamutTechnique gamut_tech; + XiePointer gamut_param; +} XieYCbCrToRGBParam; + +/* Definitions for Gamut Techniques */ +#define xieValGamutDefault 0 +#define xieValGamutNone 1 +#define xieValGamutClipRGB 2 +See Also +XieFloConvertToRGB(). + XIElib - Technique Functions XieTecYCCToRGB +Name +XieTecYCCToRGB - allocate and fill an XieYCCToRGBParam structure. +Synopsis +XieYCCToRGBParam *XieTecYCCToRGB (levels, luma_red, luma_green, +luma_blue, scale, gamut_tech, gamut_param) +XieLevels levels; +double luma_red; +double luma_green; +double luma_blue; +double scale; +XieGamutTechnique gamut_tech; +XiePointer gamut_param; +Arguments +levels Specifies the output levels. +luma_red Specifies the proportion of red in the luminance band (Y). +luma_green Specifies the proportion of green in the luminance band (Y). +luma_blue Specifies the proportion of blue in the luminance band (Y). +scale Specifies an expansion factor to apply to the output pixels values. +gamut_tech Specifies the Gamut technique to be used. +gamut_param Specifies the list of parameters required by gamut_tech. +Returns +The XieYCCToRGBParam structure. +Description +XieTecYCCToRGB() allocates and returns a pointer to an XieYCCToRGBParam structure. The +returned structure represents the list of parameters required by the YCCToRGB color conversion +technique and may be used as the color_param argument of XieFloConvertToRGB() (when +the color_space argument is xieValYCCToRGB). + +If insufficient memory is available, XieTecYCCToRGB() returns NULL. To free the memory allocated +to this structure, use XFree(). + +XieTecYCCToRGB() converts YCC data to the RGB colorspace. The PhotoYCC color-encoding +scheme is defined in: KODAK PhotoCD System - A Planning Guide for Developers, Eastman Kodak +Co., Part no. DCI200R, 1991. + +Source data may be constrained or unconstrained; the output type will match. If the source data is +constrained, levels determines the output levels; otherwise levels is ignored. Typical values cited +in the literature for scale are in the range of about 1.35 to 1.4. + +Gamut techniques define the gamut compression techniques used to deal with converted colors which +lie outside the gamut of the RGB space. One of the following standard gamut technique values can be +assigned to gamut_tech: + +xieValGamutDefault +xieValGamutNone +xieValGamutClipRGB + +If a vendor defined additional private gamut techniques, the private technique values given to these +techniques can be assigned to gamut_tech . + +The server is required to support the default technique which is bound to one of the standard +techniques defined above or a private technique. +Structures +XieTecYCCToRGB() sets the structure field levels to the values of the argument levels; the +structure fields luma_red, luma_green, luma_blue to the values of the arguments luma_red, +luma_green, luma_blue; the structure field scale to the values of the argument scale; the +structure field gamut_tech to the value of the argument gamut_tech; and the structure field +gamut_param to the value of the argument gamut_param. + +typedef unsigned long XieLevels[3]; +typedef unsigned XieGamutTechnique; +typedef struct { + XieLevels levels; + float luma_red; + float luma_green; + float luma_blue; + float scale; + XieGamutTechnique gamut_tech; + XiePointer gamut_param; +} XieYCCToRGBParam; + +/* Definitions for Gamut Techniques */ +#define xieValGamutDefault 0 +#define xieValGamutNone 1 +#define xieValGamutClipRGB 2 + +See Also +XieFloConvertToRGB(). + XIElib - Technique Functions XieTecClipScale +Name +XieTecClipScale - allocate and fill an XieClipScaleParam structure. +Synopsis +XieClipScaleParam *XieTecClipScale (in_low, in_high, out_low, +out_high) +XieConstant in_low; +XieConstant in_high; +XieLTriplet out_low; +XieLTriplet out_high; +Arguments +in_low Specifies an input pixel limit. +in_high Specifies an input pixel limit. +out_low Specifies an output pixel limit. +out_high Specifies an output pixel limit. +Returns +The XieClipScaleParam structure. +Description +XieTecClipScale() allocates and returns a pointer to an XieClipScaleParam structure. The +returned structure represents the list of parameters required by the constrain technique and may be +used as the constrain_param argument of XieFloConstrain() (when the +constrain_tech argument is xieValClipScale). + +If insufficient memory is available, XieTecClipScale() returns NULL. To free the memory +allocated to this structure, use XFree(). + +For each band, output pixels will be clipped to the range [out_low, out_high]. If in_low is less +than in_high, then all pixels less than or equal to in_low will map to out_low, and all pixels that +are greater than or equal to in_high will map to out_high. All intermediate pixel values are scaled +proportionately to the output range. Non-integral output values are rounded to the nearest integer. + +If in_low is greater than in_high then all pixels that are greater than or equal to in_low will map +to out_low, and all pixels that are less than or equal to in_high will map to out_high. All +intermediate pixel values will be linearly mapped to the output range, such that in_low maps to +out_low, and in_high maps to out_high. Non-integral output values are rounded to the nearest +integer. + +in_low should not equal in_high, out_low should be less than out_high, and out_high +should not exceed levels-1. +Structures +XieTecClipScale() sets the structure fields input_low, input_high to the values of the +arguments in_low, in_high; and the structure fields output_low, output_high to the values +of the arguments out_low, out_high. + +typedef float XieConstant[3]; +typedef unsigned long XieLTriplet[3]; +typedef struct { + XieConstant input_low,input_high; + XieLTriplet output_low,output_high; +} XieClipScaleParam; +See Also +XieFloConstrain() + XIElib - Technique Functions XieTecConvolveConstant +Name +XieTecConvolveConstant - allocate and fill an XieConvolveConstantParam structure. +Synopsis +XieConvolveConstantParam *XieTecConvolveConstant (constant) +XieConstant constant; +Arguments +constant Specifies the value to use if pixels are required from beyond the edge of +the image. +Returns +The XieConvolveConstantParam structure. +Description +XieTecConvolveConstant() allocates and returns a pointer to an +XieConvolveConstantParam structure. The returned structure represents the list of parameters +required by the convolve technique and may be used as the convolve_param argument of +XieFloConvolve() (when the convolve_tech argument is xieValConvolveConstant). + +If insufficient memory is available, XieTecConvolveConstant() returns NULL. To free the +memory allocated to this structure, use XFree(). + +Various methods of handling edge conditions are provided for convolve techniques. These techniques +determine what pixel values are used when the convolve technique requires data beyond the image +bounds. Convolve techniques only come into play when the kernel is positioned partially off the edge +of the image. Data around the edges of a process domain are convolved with adjacent image pixels +wherever possible. A process domain is inserted in many element definitions and is used to restrict +the element's processing to a subset of the source data pixels; it can be either a list-of-rectangles or a +control-plane. + +The Constant Convolve technique uses the value specified by constant if pixels are required from +beyond the edge of the image. +Structures +XieTecConvolveConstant() sets the structure field constant to the value of the argument +constant. + +typedef float XieConstant[3]; +typedef struct { + XieConstant constant; +} XieConvolveConstantParam; +See Also +XieFloConvolve(). + XIElib - Technique Functions XieTecDecodeUncompressedSingle +Name +XieTecDecodeUncompressedSingle - allocate and fill an +XieDecodeUncompressedSingleParam structure. +Synopsis +XieDecodeUncompressedSingleParam *XieTecDecodeUncompressedSingle +(fill_order, pixel_order, pixel_stride, left_pad, +scanline_pad) +XieOrientation fill_order; +XieOrientation pixel_order; +unsigned int pixel_stride; +unsigned int left_pad; +unsigned int scanline_pad; +Arguments +fill_order Specifies the method of pixel packing. +pixel_order Specifies pixel ordering within the data stream. +pixel_stride Specifies the number of bits between consecutive pixels within a +scanline. +left_pad Specifies the number of pad bits in each scanline. +scanline_pad Specifies a multiple of bytes to which each scanline is padded. +Returns +The XieDecodeUncompressedSingleParam structure. +Description +XieDecodeUncompressedSingle() allocates and returns a pointer to an +XieDecodeUncompressedSingleParam structure. The returned structure represents the list of +parameters required by the decode technique and may be used as the decode_param argument of +XieFloImportClientPhoto() (when the decode_tech argument is +xieValDecodeUncompressedSingle). + +If insufficient memory is available, XieTecDecodeUncompressedSingle() returns NULL. To +free the memory allocated to this structure, use XFree(). + +The decode uncompressed single technique is used when no compression scheme has been applied to +single band image data. The parameters define the format of the data stream of uncompressed data (the +server may reformat the data as it chooses prior to processing or storage). When multiple pixels are put +in the same byte, or a pixel spans multiple bytes, fill_order specifies whether the pixels (or parts of +pixels) are packed into the most or least significant bits of a byte first. For pixels that span a byte +boundary, pixel_order defines whether the most or least significant bits of the pixel are transported +first within the data stream. One of the following standard orientation values can be assigned to +fill_order and pixel_order: + +xieValLSFirst +xieValMSFirst + +The table below shows the relationship between fill_order and pixel_order, using two 10-bit +pixels, each with two bits of pad (within each pixel the LS-bits are 0 and a, the MS-bits are 9 and +j, the pad bits are p). + +fill-order +LSFirst (pixel-order) +MSFirst (pixel-order) + +LSFirst +76543210 dcbapp98 ppjihgfe +98765432 jihgpp10 ppfedcba + +MSFirst +76543210 98ppdcba jihgfepp +98765432 10ppjihg fedcbapp + + +pixel_stride is the number of bits between the start of consecutive pixels within a scanline; it +must be at least enough bits to contain the number of input levels. left_pad is the number of pad +bits preceding the first image pixel in each scanline; if the server's Alignment attribute is Alignable, or +pixel_stride fits the definition of Alignable, the value of left_pad must be a multiple of +pixel_stride or a multiple of 8; otherwise, left_pad may be any arbitrary value. +scanline_pad defines a multiple of bytes to which each scanline is padded; valid values are: 0 (not +aligned), 1, 2, 4, 8, and 16. The total number of bits-per-scanline in the data stream includes: +left_pad, the image data (width x pixel_stride), and sufficient additional bits to satisfy +scanline_pad. +Structures +XieDecodeUncompressedSingle() sets the structure field fill_order to the value of the +argument fill_order; the structure field pixel_order to the value of the argument +pixel_order; the structure field pixel_stride to the value of the argument pixel_stride; +the structure field left_pad to the value of the argument left_pad; and the structure field +scanline_pad to the value of the argument scanline_pad. + +typedef unsigned XieOrientation; +typedef struct { + XieOrientation fill_order; + XieOrientation pixel_order; + unsigned int pixel_stride; + unsigned int left_pad; + unsigned int scanline_pad; +} XieDecodeUncompressedSingleParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloImportClientPhoto(), XiePutClientData(). + XIElib - Technique Functions XieTecDecodeUncompressedTriple +Name +XieTecDecodeUncompressedTriple - allocate and fill an +XieDecodeUncompressedTripleParam structure. +Synopsis +XieDecodeUncompressedTripleParam *XieTecDecodeUncompressedTriple +(fill_order, pixel_order, band_order, interleave, +pixel_stride, left_pad, scanline_pad) +XieOrientation fill_order; +XieOrientation pixel_order; +XieOrientation band_order; +XieInterleave interleave; +unsigned char pixel_stride[3]; +unsigned char left_pad[3]; +unsigned char scanline_pad[3]; +Arguments +fill_order Specifies the method of pixel packing. +pixel_order Specifies pixel ordering within the data stream. +band_order Specifies the order of the image data sent through the protocol stream. +interleave Specifies how the image bands are interleaved. +pixel_stride Specifies the number of bits between consecutive pixels within a +scanline. +left_pad Specifies the number of pad bits in each scanline. +scanline_pad Specifies a multiple of bytes to which each scanline is padded. +Returns +The XieDecodeUncompressedTripleParam structure. +Description +XieDecodeUncompressedTriple() allocates and returns a pointer to an +XieDecodeUncompressedTripleParam structure. The returned structure represents the list of +parameters required by the decode technique and may be used as the decode_param argument of +XieFloImportClientPhoto() (when the decode_tech argument is +xieValDecodeUncompressedTriple). + +If insufficient memory is available, XieTecDecodeUncompressedTriple() returns NULL. To +free the memory allocated to this structure, use XFree(). + +The decode uncompressed triple technique is used when no compression scheme has been applied to +triple band image data. The parameters define the format of the data stream of uncompressed data (the +server may reformat the data as it chooses prior to processing or storage). When multiple pixels are put +in the same byte, or a pixel spans multiple bytes, fill_order specifies whether the pixels (or parts of +pixels) are packed into the most or least significant bits of a byte first. For pixels that span a byte +boundary, pixel_order defines whether the most or least significant bits of the pixel are transported +first within the data stream. + +One of the following standard orientation values can be assigned to fill_order and +pixel_order: + +xieValLSFirst +xieValMSFirst + +The table below shows the relationship between fill_order and pixel_order, using two 10-bit +pixels, each with two bits of pad (within each pixel the LS-bits are 0 and a, the MS-bits are 9 and +j, the pad bits are p) + +fill-order +LSFirst (pixel-order) +MSFirst (pixel-order) + +LSFirst +76543210 dcbapp98 ppjihgfe +98765432 jihgpp10 ppfedcba + +MSFirst +76543210 98ppdcba jihgfepp +98765432 10ppjihg fedcbapp + + +pixel_stride is the number of bits between the start of consecutive pixels within a scanline; It +must be at least enough bits to contain the number of input levels. left_pad is the number of pad +bits preceding the first image pixel in each scanline; if the server's Alignment attribute is Alignable, or +pixel_stride fits the definition of Alignable, the value of left_pad must be a multiple of +pixel_stride or a multiple of 8; otherwise, left_pad may be any arbitrary value. +scanline_pad defines a multiple of bytes to which each scanline is padded; valid values are: 0 (not +aligned), 1, 2, 4, 8, and 16. The total number of bits-per-scanline in the data stream includes: +left_pad, the image data (width x pixel_stride), and sufficient additional bits to satisfy +scanline_pad. + +interleave describes how the image bands are interleaved (per pixel within a single plane, or sent as +three separate planes); if interleave is xieValBandByPixel, inter-band dimensions must +match: the widths and the heights of all bands must match. One of the following standard interleave +values can be assigned to interleave: + +xieValBandByPixel +xieValBandByPlane + +band_order is the order of the image bands or image planes as they are transmitted through the +protocol stream. band_order can be set to one of the standard orientation values. The least +significant band of trichromatic data is the first band mentioned in the common name of the colorspace : +red is the least significant band of RGB data. For band-by-pixel data, band_order specifies whether +this band is put in the least or most significant bits of a pixel: + +LSFirst +MSFirst + +B1B0G2G1G0R2R1R0 +R2R1R0G2G1G0B1B0 + + +For band-by-plane data, band_order specifies whether this band corresponds with the least +significant or most significant image plane. Each plane is transported as a separate data stream: + +band +LSFirst +MSFirst + +0 +R7R6R5R4R3R2R1R0 +B7B6B5B4B3B2B1B0 + +1 +G7G6G5G4G3G2G1G0 +G7G6G5G4G3G2G1G0 + +2 +B7B6B5B4B3B2B1B0 +R7R6R5R4R3R2R1R0 + + +Structures +XieDecodeUncompressedTriple() sets the structure field fill_order to the value of the +argument fill_order; the structure field pixel_order to the value of the argument +pixel_order; the structure field band_order to the value of the argument band_order; the +structure field interleave to the value of the argument interleave; the structure field +pixel_stride to the value of the argument pixel_stride; the structure field left_pad to the +value of the argument left_pad; and the structure field scanline_pad to the value of the +argument scanline_pad. + +typedef unsigned XieOrientation; +typedef unsigned XieInterleave; +typedef struct { + unsigned char left_pad[3]; + XieOrientation fill_order; + unsigned char pixel_stride[3]; + XieOrientation pixel_order; + unsigned char scanline_pad[3]; + XieOrientation band_order; + XieInterleave interleave; +} XieDecodeUncompressedTripleParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 + +/* Definitions for Interleave */ +#define xieValBandByPixel 1 +#define xieValBandByPlane 2 +See Also +XieFloImportClientPhoto(), XiePutClientData(). + XIElib - Technique Functions XieTecDecodeG31D +Name +XieTecDecodeG31D - allocate and fill an XieDecodeG31DParam structure. +Synopsis +XieDecodeG31DParam *XieTecDecodeG31D (encoded_order, normal, +radiometric) +XieOrientation encoded_order; +Bool normal; +Bool radiometric; +Arguments +encoded_order Specifies the bit-order of the encoded data. +normal Specifies how the data was processed when it was originally encoded. +radiometric Specifies how white runs are decoded. +Returns +The XieDecodeG31DParam structure. +Description +XieDecodeG31D() allocates and returns a pointer to an XieDecodeG31DParam structure. The +returned structure represents the list of parameters required by the decode technique and may be used +as the decode_param argument of XieFloImportClientPhoto() (when the decode_tech +argument is xieValDecodeG31D). + +If insufficient memory is available, XieTecDecodeG31D() returns NULL. To free the memory +allocated to this structure, use XFree(). + +CCITT-G31D is the CCITT group 3 one dimensional encoding technique as defined by CCITT T.4, +"Standardization of Group 3 Facsimile Apparatus for Document Transmission". + +encoded_order specifies the bit-order of the encoded data. One of the following standard +orientation values can be assigned to encoded_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the encoded bit order of two bytes (within each byte the first encoded bit is +0, last is bit 7): + +LSFirst +MSFirst + +76543210 76543210 +01234567 01234567 + + +radiometric specifies that white runs in the encoded data should be represented as image ones +upon decode (maximum intensity), or conversely, they will be decoded as image zeros if +radiometric is False. normal specifies that the data was processed according to its normal fill- +order when it was originally encoded. +Structures +XieDecodeG31D() sets the structure field encoded_order to the value of the argument +encoded_order; the structure field normal to the value of the argument normal; and the +structure field radiometric to the value of the argument radiometric. + +typedef unsigned XieOrientation; +typedef struct { + XieOrientation encoded_order; + Bool normal; + Bool radiometric; +} XieDecodeG31DParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloImportClientPhoto(), XiePutClientData(). + XIElib - Technique Functions XieTecDecodeG32D +Name +XieTecDecodeG32D - allocate and fill an XieDecodeG32DParam structure. +Synopsis +XieDecodeG32DParam *XieTecDecodeG32D (encoded_order, normal, +radiometric) +XieOrientation encoded_order; +Bool normal; +Bool radiometric; +Arguments +encoded_order Specifies the bit-order of the encoded data. +normal Specifies how the data was processed when it was originally encoded. +radiometric Specifies how white runs are decoded. +Returns +The XieDecodeG32DParam structure. +Description +XieDecodeG32D() allocates and returns a pointer to an XieDecodeG32DParam structure. The +returned structure represents the list of parameters required by the decode technique and may be used +as the decode_param argument of XieFloImportClientPhoto() (when the decode_tech +argument is xieValDecodeG32D). + +If insufficient memory is available, XieTecDecodeG32D() returns NULL. To free the memory +allocated to this structure, use XFree(). + +CCITT-G32D is the CCITT group 3 one dimensional encoding technique as defined by CCITT T.4, +"Standardization of Group 3 Facsimile Apparatus for Document Transmission". + +encoded_order specifies the bit-order of the encoded data. One of the following standard +orientation values can be assigned to encoded_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the encoded bit order of two bytes (within each byte the first encoded bit is +0, last is bit 7): + +LSFirst +MSFirst + +76543210 76543210 +01234567 01234567 + + +radiometric specifies that white runs in the encoded data should be represented as image ones +upon decode (maximum intensity), or conversely, they will be decoded as image zeros if +radiometric is False. normal specifies that the data was processed according to its normal fill- +order when it was originally encoded. +Structures +XieDecodeG32D() sets the structure field encoded_order to the value of the argument +encoded_order; the structure field normal to the value of the argument normal; and the +structure field radiometric to the value of the argument radiometric. + +typedef unsigned XieOrientation; +typedef struct { + XieOrientation encoded_order; + Bool normal; + Bool radiometric; +} XieDecodeG32DParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloImportClientPhoto(), XiePutClientData(). + XIElib - Technique Functions XieTecDecodeG42D +Name +XieTecDecodeG42D - allocate and fill an XieDecodeG42DParam structure. +Synopsis +XieDecodeG42DParam *XieTecDecodeG42D (encoded_order, normal, +radiometric)) +XieOrientation encoded_order; +Bool normal; +Bool radiometric; +Arguments +encoded_order Specifies the bit-order of the encoded data. +normal Specifies how the data was processed when it was originally encoded. +radiometric Specifies how white runs are decoded. +Returns +The XieDecodeG42DParam structure. +Description +XieDecodeG42D() allocates and returns a pointer to an XieDecodeG42DParam structure. The +returned structure represents the list of parameters required by the decode technique and may be used +as the decode_param argument of XieFloImportClientPhoto() (when the decode_tech +argument is xieValDecodeG42D). + +If insufficient memory is available, XieTecDecodeG42D() returns NULL. To free the memory +allocated to this structure, use XFree(). + +CCITT-G42D is the CCITT group 3 one dimensional encoding technique as defined by CCITT T.4, +"Standardization of Group 3 Facsimile Apparatus for Document Transmission". + +encoded_order specifies the bit-order of the encoded data. One of the following standard +orientation values can be assigned to encoded_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the encoded bit order of two bytes (within each byte the first encoded bit is +0, last is bit 7): + +LSFirst +MSFirst + +76543210 76543210 +01234567 01234567 + + +radiometric specifies that white runs in the encoded data should be represented as image ones +upon decode (maximum intensity), or conversely, they will be decoded as image zeros if +radiometric is False. normal specifies that the data was processed according to its normal fill- +order when it was originally encoded. +Structures +XieDecodeG42D() sets the structure field encoded_order to the value of the argument +encoded_order; the structure field normal to the value of the argument normal; and the +structure field radiometric to the value of the argument radiometric. + +typedef unsigned XieOrientation; +typedef struct { + XieOrientation encoded_order; + Bool normal; + Bool radiometric; +} XieDecodeG42DParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloImportClientPhoto(), XiePutClientData(). + XIElib - Technique Functions XieTecDecodeTIFF2 +Name +XieTecDecodeTIFF2 - allocate and fill an XieDecodeTIFF2Param structure. +Synopsis +XieDecodeTIFF2Param *XieTecDecodeTIFF2 (encoded_order, normal, +radiometric) +XieOrientation encoded_order; +Bool normal; +Bool radiometric; +Arguments +encoded_order Specifies the bit-order of the encoded data. +normal Specifies how the data was processed when it was originally encoded. +radiometric Specifies how white runs are decoded. +Returns +The XieDecodeTIFF2Param structure. +Description +XieDecodeTIFF2() allocates and returns a pointer to an XieDecodeTIFF2Param structure. +The returned structure represents the list of parameters required by the decode technique and may be +used as the decode_param argument of XieFloImportClientPhoto() (when the +decode_tech argument is xieValDecodeTIFF2). + +If insufficient memory is available, XieTecDecodeTIFF2() returns NULL. To free the memory +allocated to this structure, use XFree(). + +TIFF-2 is modified Huffman encoding as described in "TIFF Tag Image File Format", revision 6.0, draft +2, by Aldus Corporation. (TIFF compression scheme 2). + +encoded_order specifies the bit-order of the encoded data. One of the following standard +orientation values can be assigned to encoded_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the encoded bit order of two bytes (within each byte the first encoded bit is +0, last is bit 7): + +LSFirst +MSFirst + +76543210 76543210 +01234567 01234567 + + +radiometric specifies that white runs in the encoded data should be represented as image ones +upon decode (maximum intensity), or conversely, they will be decoded as image zeros if +radiometric is False. normal specifies that the data was processed according to its normal fill- +order when it was originally encoded. +Structures +XieDecodeTIFF2() sets the structure field encoded_order to the value of the argument +encoded_order; the structure field normal to the value of the argument normal; and the +structure field radiometric to the value of the argument radiometric. + +typedef unsigned XieOrientation; +typedef struct { + XieOrientation encoded_order; + Bool normal; + Bool radiometric; +} XieDecodeTIFF2Param; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloImportClientPhoto(), XiePutClientData(). + XIElib - Technique Functions XieTecDecodeTIFFPackBits +Name +XieTecDecodeTIFFPackBits - allocate and fill an XieDecodeTIFFPackBitsParam structure. +Synopsis +XieDecodeTIFFPackBitsParam *XieTecDecodeTIFFPackBits (encoded_order, +normal) +XieOrientation encoded_order; +Bool normal; +Arguments +encoded_order Specifies the bit-order of the encoded data. +normal Specifies how the data was processed when it was originally encoded. +Returns +The XieDecodeTIFFPackBitsParam structure. +Description +XieDecodeTIFFPackBits() allocates and returns a pointer to an +XieDecodeTIFFPackBitsParam structure. The returned structure represents the list of +parameters required by the decode technique and may be used as the decode_param argument of +XieFloImportClientPhoto() (when the decode_tech argument is +xieValDecodeTIFFPackBits). + +If insufficient memory is available, XieTecDecodeTIFFPackBits() returns NULL. To free the +memory allocated to this structure, use XFree(). + +TIFF-PackBits is byte-oriented run-length encoding as described in "TIFF Tag Image File Format", +revision 6.0, draft 2, by Aldus Corporation. (TIFF compression scheme 32773). + +encoded_order specifies the bit-order of the encoded data. One of the following standard +orientation values can be assigned to encoded_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the encoded bit order of two bytes (within each byte the first encoded bit is +0, last is bit 7): + +LSFirst +MSFirst + +76543210 76543210 +01234567 01234567 + + +normal specifies that the data was processed according to its normal fill-order when it was originally +encoded. +Structures +XieDecodeTIFFPackBits() sets the structure field encoded_order to the value of the +argument encoded_order; and the structure field normal to the value of the argument normal. + +typedef unsigned XieOrientation; +typedef struct { + XieOrientation encoded_order; + Bool normal; +} XieDecodeTIFFPackBitsParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloImportClientPhoto(), XiePutClientData(). + XIElib - Technique Functions XieTecDecodeJPEGBaseline +Name +XieTecDecodeJPEGBaseline - allocate and fill an XieDecodeJPEGBaselineParam structure. +Synopsis +XieDecodeJPEGBaselineParam *XieTecDecodeJPEGBaseline (interleave, +band_order, up_sample) +XieInterleave interleave; +XieOrientation band_order; +Bool up_sample; +Arguments +interleave Specifies how the image bands will be interleaved. +band_order Specifies the order in which the image bands were originally encoded. +up_sample Specifies how interleaved encoded data are up-sampled. +Returns +The XieDecodeJPEGBaselineParam structure. +Description +XieDecodeJPEGBaseline() allocates and returns a pointer to an +XieDecodeJPEGBaselineParam structure. The returned structure represents the list of +parameters required by the decode technique and may be used as the decode_param argument of +XieFloImportClientPhoto() (when the decode_tech argument is +xieValDecodeJPEGBaseline). + +If insufficient memory is available, XieTecDecodeJPEGBaseline() returns NULL. To free the +memory allocated to this structure, use XFree(). + +The JPEG baseline technique is the baseline Huffman DCT encoding technique that is defined in ISO +DIS 10918-1 "Digital Compression and Coding of Continuous-tone Still Images". Only JPEG Interchange +Format (JIF) is supported: all tables, compressed data, etc. are embedded in the data stream, all +delineated by markers. + +interleave determines if all bands of a triple band image will be interleaved within a single encoded +stream, or if three separate encoded streams will be supplied. One of the following standard interleave +values can be assigned to interleave: + +xieValBandByPixel +xieValBandByPlane + +For triple band data, band_order specifies the order in which the image bands were originally +encoded. One of the following standard orientation values can be assigned to band_order: + +xieValLSFirst +xieValMSFirst + +The least significant band of trichromatic data is the first band mentioned in the common name of the +colorspace: red is the least significant band of RGB data. band_order specifies whether this band +corresponds with the least significant or most significant image plane. Each plane is decoded into a +separate data stream: + +band +LSFirst +MSFirst + +0 +Red band +Blue band + +1 +Green band +Green band + +2 +Blue band +Red band + + +up_sample specifies that if any bands in an interleaved encoded data stream are down-sampled, they +should be up-sampled by the JPEG decoder. + +The arguments interleave, band_order, and up_sample are ignored for single band images, +and up_sample is always ignored if interleave is band-by-plane. If up_sample is False and +some of the encoded bands of an interleaved image were down-sampled, an alternative method for up- +sampling the image would be to use a geometry element with appropriate band_mask and sample +technique parameters. +Structures +XieDecodeJPEGBaseline() sets the structure field interleave to the value of the argument +interleave; the structure field band_order to the value of the argument band_order; and the +structure field up_sample to the value of the argument up_sample. + +typedef unsigned XieOrientation; +typedef struct { + XieInterleave interleave; + XieOrientation band_order; + Bool up_sample; +} XieDecodeJPEGBaselineParam; +/* Definitions for Interleave */ +#define xieValBandByPixel 1 +#define xieValBandByPlane 2 + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloImportClientPhoto(), XiePutClientData(). + XIElib - Technique Functions XieTecDecodeJPEGLossless +Name +XieTecDecodeJPEGLossless - allocate and fill an XieDecodeJPEGLosslessParam structure. +Synopsis +XieDecodeJPEGLosslessParam *XieTecDecodeJPEGLossless (interleave, +band_order) +XieInterleave interleave; +XieOrientation band_order; +Arguments +interleave Specifies how the image bands will be interleaved. +band_order Specifies the order in which the image bands were originally encoded. +Returns +The XieDecodeJPEGLosslessParam structure. +Description +XieDecodeJPEGLossless() allocates and returns a pointer to an +XieDecodeJPEGLosslessParam structure. The returned structure represents the list of +parameters required by the decode technique and may be used as the decode_param argument of +XieFloImportClientPhoto() (when the decode_tech argument is +xieValDecodeJPEGLossless). + +If insufficient memory is available, XieTecDecodeJPEGLossless() returns NULL. To free the +memory allocated to this structure, use XFree(). + +The JPEG lossless technique is the Huffman predictive sequential lossless encoding technique that is +defined in ISO DIS 10918-1 "Digital Compression and Coding of Continuous-tone Still Images". +This technique is not available in the R6 sample implementation of XIE. + +interleave describes how the bands of triple band data are interleaved; either all bands are +interleaved within a single encoded stream, or three separate encoded streams are expected. One of the +following standard interleave values can be assigned to interleave: + +xieValBandByPixel +xieValBandByPlane + +For triple band data, band_order specifies the order in which the image bands were originally +encoded. One of the following standard orientation values can be assigned to band_order: + +xieValLSFirst +xieValMSFirst + +The least significant band of trichromatic data is the first band mentioned in the common name of the +colorspace: red is the least significant band of RGB data. band_order specifies whether this band +corresponds with the least significant or most significant image plane. Each plane is decoded into a +separate data stream: + +band +LSFirst +MSFirst + +0 +Red band +Blue band + +1 +Green band +Green band + +2 +Blue band +Red band + + +The arguments interleave and band_order are ignored for single band images. +Structures +XieDecodeJPEGLossless() sets the structure field interleave to the value of the argument +interleave; and the structure field band_order to the value of the argument band_order. + +typedef unsigned XieOrientation; +typedef struct { + XieInterleave interleave; + XieOrientation band_order; +} XieDecodeJPEGLosslessParam; +/* Definitions for Interleave */ +#define xieValBandByPixel 1 +#define xieValBandByPlane 2 + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloImportClientPhoto(), XiePutClientData(). + XIElib - Technique Functions XieTecDitherOrderedParam +Name +XieTecDitherOrderedParam - allocate and fill an XieDitherOrderedParam structure. +Synopsis +XieDitherOrderedParam *XieTecDitherOrderedParam (threshold_order) +unsigned int threshold_order; +Arguments +threshold_order Specifies a value to determine the size of the dither matrix. +Returns +The XieDitherOrderedParam structure. +Description +XieDitherOrdered() allocates and returns a pointer to an XieDitherOrderedParam +structure. The returned structure represents the list of parameters required by the decode technique and +may be used as the decode_param argument of XieFloImportClientPhoto() (when the +decode_tech argument is xieValDitherOrdered). + +If insufficient memory is available, XieTecDitherOrdered() returns NULL. To free the memory +allocated to this structure, use XFree(). + +The dispersed-dot ordered dither technique replaces a matrix, or block, of pixels with a patterned matrix +of pixels. This patterned matrix of pixels is applied across the entire image. Since these patterns may +introduce artifacts that are distracting to the eye, the threshold_order parameter is available to +determine the size of the dither matrix, and therefore, the number of levels that can be simulated. If the +value of threshold_order is m, the threshold matrix can simulate 2m+1 levels. +Structures +XieDitherOrdered() sets the structure field threshold_order to the value of the argument +threshold_order. + +typedef struct { + unsigned int threshold_order; +} XieDitherOrderedParam; +See Also +XieFloDither(). + XIElib - Technique Functions XieTecEncodeUncompressedSingle +Name +XieTecEncodeUncompressedSingle - allocate and fill an +XieEncodeUncompressedSingleParam structure. +Synopsis +XieEncodeUncompressedSingleParam *XieTecEncodeUncompressedSingle +(fill_order, pixel_order, pixel_stride, scanline_pad) +XieOrientation fill_order; +XieOrientation pixel_order; +unsigned int pixel_stride; +unsigned int scanline_pad; +Arguments +fill_order Specifies the method of pixel packing . +pixel_order Specifies pixel ordering within the data stream. +pixel_stride Specifies the number of bits between consecutive pixels within a +scanline. +scanline_pad Specifies a multiple of bytes to which each scanline is padded. +Returns +The XieEncodeUncompressedSingleParam structure. +Description +XieEncodeUncompressedSingle() allocates and returns a pointer to an +XieEncodeUncompressedSingleParam structure. The returned structure represents the list of +parameters required by the encode technique and may be used as the encode_param argument of +XieFloExportClientPhoto() and XieFloExportPhotomap() (when the encode_tech +argument is xieValEncodeUncompressedSingle). + +If insufficient memory is available, XieTecEncodeUncompressedSingle() returns NULL. To +free the memory allocated to this structure, use XFree(). + +The encode uncompressed single technique is used when no compression scheme is to be applied to +single band image data. The parameters define the format of the data stream of uncompressed data that +is made available for client retrieval via XieGetClientData(). When multiple pixels are put in the +same byte or a pixel spans multiple bytes, fill_order specifies whether the pixels (or parts of pixels) +are packed into the most or least significant bits of a byte first. For pixels that span a byte boundary, +pixel_order defines whether the most or least significant bits of the pixel are put first within the +data stream. + +One of the following standard orientation values can be assigned to fill_order and +pixel_order: + +xieValLSFirst +xieValMSFirst + +The table below shows the relationship between fill_order and pixel_order, using two 10-bit +pixels, each with two bits of pad (within each pixel the LS-bits are 0 and a, the MS-bits are 9 and +j, the pad bits are p). + +fill-order +LSFirst (pixel-order) +MSFirst (pixel-order) + +LSFirst +76543210 dcbapp98 ppjihgfe +98765432 jihgpp10 ppfedcba + +MSFirst +76543210 98ppdcba jihgfepp +98765432 10ppjihg fedcbapp + + +pixel_stride is the number of bits between the start of consecutive pixels within a scanline. It +must be at least enough bits to contain the number of source levels. scanline_pad defines a +multiple of bytes to which each scanline is padded; valid values are: 0 (not aligned), 1, 2, 4, 8, and 16. +Structures +XieEncodeUncompressedSingle() sets the structure field fill_order to the value of the +argument fill_order; the structure field pixel_order to the value of the argument +pixel_order; the structure field pixel_stride to the value of the argument pixel_stride; +and the structure field scanline_pad to the value of the argument scanline_pad. + +typedef unsigned XieOrientation; +typedef struct { + XieOrientation fill_order; + XieOrientation pixel_order; + unsigned int pixel_stride; + unsigned int scanline_pad; +} XieEncodeUncompressedSingleParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloExportClientPhoto(), XieFloExportPhotomap(), XieGetClientData(). + XIElib - Technique Functions XieTecEncodeUncompressedTriple +Name +XieTecEncodeUncompressedTriple - allocate and fill an +XieEncodeUncompressedTripleParam structure. +Synopsis +XieEncodeUncompressedTripleParam *XieTecEncodeUncompressedTriple +(fill_order, pixel_order, band_order, interleave, +pixel_stride, scanline_pad) +XieOrientation fill_order; +XieOrientation pixel_order; +XieOrientation band_order; +XieInterleave interleave; +unsigned char pixel_stride[3]; +unsigned char scanline_pad[3]; +Arguments +fill_order Specifies the method of pixel packing . +pixel_order Specifies pixel ordering within the data stream. +band_order Specifies the order of the image data sent through the protocol stream. +interleave Specifies how the image bands are interleaved. +pixel_stride Specifies the number of bits between consecutive pixels within a +scanline. +scanline_pad Specifies a multiple of bytes to which each scanline is padded. +Returns +The XieEncodeUncompressedTripleParam structure. +Description +XieEncodeUncompressedTriple() allocates and returns a pointer to an +XieEncodeUncompressedTripleParam structure. The returned structure represents the list of +parameters required by the encode technique and may be used as the encode_param argument of +XieFloExportClientPhoto() and XieFloExportPhotomap() (when the encode_tech +argument is xieValEncodeUncompressedTriple). + +If insufficient memory is available, XieTecEncodeUncompressedTriple() returns NULL. To +free the memory allocated to this structure, use XFree(). + +The encode uncompressed triple technique is used when no compression scheme is to be applied to +triple band image data. The parameters define the format of the data stream of uncompressed data that +is made available for client retrieval via XieGetClientData(). When multiple pixels are put in the +same byte or a pixel spans multiple bytes, fill_order specifies whether the pixels (or parts of pixels) +are packed into the most or least significant bits of a byte first. For pixels that span a byte boundary, +pixel_order defines whether the most or least significant bits of the pixel are put first within the +data stream. + +One of the following standard orientation values can be assigned to fill_order and +pixel_order: + +xieValLSFirst +xieValMSFirst + +The table below shows the relationship between fill_order and pixel_order, using two 10-bit +pixels, each with two bits of pad (within each pixel the LS-bits are 0 and a, the MS-bits are 9 and +j, the pad bits are p) + +fill-order +LSFirst (pixel-order) +MSFirst (pixel-order) + +LSFirst +76543210 dcbapp98 ppjihgfe +98765432 jihgpp10 ppfedcba + +MSFirst +76543210 98ppdcba jihgfepp +98765432 10ppjihg fedcbapp + + +pixel_stride is the number of bits between the start of consecutive pixels within a scanline. It +must be at least enough bits to contain the number of source levels. scanline_pad defines a +multiple of bytes to which each scanline is padded; valid values are: 0 (not aligned), 1, 2, 4, 8, and 16. +band_order is the order of the image bands or image planes as they are transmitted through the +protocol stream. One of the following standard orientation values can be assigned to band_order: + +xieValLSFirst +xieValMSFirst + +The least significant band of trichromatic data is the first band mentioned in the common name of the +colorspace: red is the least significant band of RGB data. For band-by-pixel data, band_order +specifies whether this band is put in the least or most significant bits of a pixel: + +LSFirst +MSFirst + +B1B0G2G1G0R2R1R0 +R2R1R0G2G1G0B1B0 + + +For band-by-plane data, band_order specifies whether this band corresponds with the least +significant or most significant image plane. Each plane is transported as a separate data stream: + +band +LSFirst +MSFirst + +0 +R7R6R5R4R3R2R1R0 +B7B6B5B4B3B2B1B0 + +1 +G7G6G5G4G3G2G1G0 +G7G6G5G4G3G2G1G0 + +2 +B7B6B5B4B3B2B1B0 +R7R6R5R4R3R2R1R0 + + +interleave describes how the bands are interleaved (per pixel within a single plane, or sent as three +separate planes). One of the following standard interleave values can be assigned to interleave: + +xieValBandByPixel +xieValBandByPlane + +Export of down-sampled band-by-pixel data is not supported: all bands must have equal widths and +equal heights. +Structures +XieEncodeUncompressedTriple() sets the structure field fill_order to the value of the +argument fill_order; the structure field pixel_order to the value of the argument +pixel_order; the structure field band_order to the value of the argument band_order; the +structure field interleave to the value of the argument interleave; the structure field +pixel_stride to the value of the argument pixel_stride; and the structure field +scanline_pad to the value of the argument scanline_pad. + +typedef unsigned XieOrientation; +typedef struct { + unsigned char pixel_stride[3]; + XieOrientation pixel_order; + unsigned char scanline_pad[3]; + XieOrientation fill_order; + XieOrientation band_order; + XieInterleave interleave; +} XieEncodeUncompressedTripleParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 + +/* Definitions for Interleave */ +#define xieValBandByPixel 1 +#define xieValBandByPlane 2 +See Also +XieFloExportClientPhoto(), XieFloExportPhotomap(), XieGetClientData(). + XIElib - Technique Functions XieTecEncodeG31D +Name +XieTecEncodeG31D - allocate and fill an XieEncodeG31DParam structure. +Synopsis +XieEncodeG31DParam *XieTecEncodeG31D (align_eol, radiometric, +encoded_order) +Bool align_eol; +Bool radiometric; +XieOrientation encoded_order; +Arguments +align_eol Specifies the use of fill bits preceding EOL codes. +radiometric Specifies how white runs are encoded. +encoded_order Specifies the bit-order of the encoded data. +Returns +The XieEncodeG31DParam structure. +Description +XieEncodeG31D() allocates and returns a pointer to an XieEncodeG31DParam structure. The +returned structure represents the list of parameters required by the encode technique and may be used +as the encode_param argument of XieFloExportClientPhoto() and +XieFloExportPhotomap() (when the encode_tech argument is xieValEncodeG31D). + +If insufficient memory is available, XieTecEncodeG31D() returns NULL. To free the memory +allocated to this structure, use XFree(). + +CCITT-G31D is the CCITT group 3 one dimensional encoding technique as defined by CCITT T.4, +"Standardization of Group 3 Facsimile Apparatus for Document Transmission". + +If True, align_eol, specifies that sufficient fill bits must precede EOL codes to guarantee that each +EOL will end on a byte boundary (thus EOL will be a nibble of 0 followed by a byte of 1: xxxx,00002 +0000,00012). radiometric specifies that image ones will be encoded as white runs, or conversely, +image zeros will be encoded as white runs, if radiometric is False. encoded_order +specifies the bit-order for the encoded data. One of the following standard orientation values can be +assigned to encoded_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the encoded bit order of two bytes (within each byte the first encoded bit is +0, last is bit 7): + +LSFirst +MSFirst + +76543210 76543210 +01234567 01234567 + +Structures +XieEncodeG31D() sets the structure field align_eol to the value of the argument align_eol; +the structure field radiometric to the value of the argument radiometric; and the structure +field encoded_order to the value of the argument encoded_order. + +typedef unsigned XieOrientation; +typedef struct { + Bool align_eol; + Bool radiometric; + XieOrientation encoded_order; +} XieEncodeG31DParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloExportClientPhoto(), XieFloExportPhotomap(), XieGetClientData(). + XIElib - Technique Functions XieTecEncodeG32D +Name +XieTecEncodeG32D - allocate and fill an XieEncodeG32DParam structure. +Synopsis +XieEncodeG32DParam *XieTecEncodeG32D (uncompressed, align_eol, +radiometric, encoded_order, k_factor) +Bool uncompressed; +Bool align_eol; +Bool radiometric; +XieOrientation encoded_order; +unsigned long k_factor; +Arguments +uncompressed Specifies the use of the uncompressed-mode CCITT extension. +align_eol Specifies the use of fill bits preceding EOL codes. +radiometric Specifies how white runs are encoded. +encoded_order Specifies the bit-order of the encoded data. +k_factor Specifies the number of 2D scanlines to produce for each 1D scanline. +Returns +The XieEncodeG32DParam structure. +Description +XieEncodeG32D() allocates and returns a pointer to an XieEncodeG32DParam structure. The +returned structure represents the list of parameters required by the encode technique and may be used +as the encode_param argument of XieFloExportClientPhoto() and +XieFloExportPhotomap() (when the encode_tech argument is xieValEncodeG32D). + +If insufficient memory is available, XieTecEncodeG32D() returns NULL. To free the memory +allocated to this structure, use XFree(). + +CCITT-G32D is the CCITT group 3 two dimensional encoding technique as defined by CCITT T.4, +"Standardization of Group 3 Facsimile Apparatus for Document Transmission". + +If True, uncompressed, will enable the use of the uncompressed-mode CCITT extension. If True, +align_eol, specifies that sufficient fill bits must precede EOL codes to guarantee that each EOL will +end on a byte boundary (thus EOL will be a nibble of 0 followed by a byte of 1: xxxx,00002 0000,00012). +radiometric specifies that image ones will be encoded as white runs, or conversely, image zeros +will be encoded as white runs, if radiometric is False. encoded_order specifies the bit- +order for the encoded data. One of the following standard orientation values can be assigned to +encoded_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the encoded bit order of two bytes (within each byte the first encoded bit is +0, last is bit 7): + +LSFirst +MSFirst + +76543210 76543210 +01234567 01234567 + + +k_factor specifies the number of 2-D scanlines to produce for each 1-D scanline. +Structures +XieEncodeG32D() sets the structure field uncompressed to the value of the argument +uncompressed; the structure field align_eol to the value of the argument align_eol; the +structure field radiometric to the value of the argument radiometric; the structure field +encoded_order to the value of the argument encoded_order; and the structure field +k_factor to the value of the argument k_factor. + +typedef unsigned XieOrientation; +typedef struct { + Bool uncompressed; + Bool align_eol; + Bool radiometric; + XieOrientation encoded_order; + unsigned long k_factor; +} XieEncodeG32DParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloExportClientPhoto(), XieFloExportPhotomap(), XieGetClientData(). + XIElib - Technique Functions XieTecEncodeG42D +Name +XieTecEncodeG42D - allocate and fill an XieEncodeG42DParam structure. +Synopsis +XieEncodeG42DParam *XieTecEncodeG42D (uncompressed, radiometric, +encoded_order) +Bool uncompressed; +Bool radiometric; +XieOrientation encoded_order; +Arguments +uncompressed Specifies the use of the uncompressed-mode CCITT extension. +radiometric Specifies how white runs are encoded. +encoded_order Specifies the bit-order of the encoded data. +Returns +The XieEncodeG42DParam structure. +Description +XieEncodeG42D() allocates and returns a pointer to an XieEncodeG42DParam structure. The +returned structure represents the list of parameters required by the encode technique and may be used +as the encode_param argument of XieFloExportClientPhoto() and +XieFloExportPhotomap() (when the encode_tech argument is xieValEncodeG42D). + +If insufficient memory is available, XieTecEncodeG42D() returns NULL. To free the memory +allocated to this structure, use XFree(). + +CCITT-G42D is the CCITT group 4 two dimensional encoding technique as defined by CCITT T.6, +"Facsimile Coding Schemes and Coding Control Functions for Group 4 Facsimile Apparatus". + +If True, uncompressed, will enable the use of the uncompressed-mode CCITT extension. +radiometric specifies that image ones will be encoded as white runs, or conversely, image zeros +will be encoded as white runs, if radiometric is False. encoded_order specifies the bit- +order for the encoded data. One of the following standard orientation values can be assigned to +encoded_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the encoded bit order of two bytes (within each byte the first encoded bit is +0, last is bit 7): + +LSFirst +MSFirst + +76543210 76543210 +01234567 01234567 + +Structures +XieEncodeG42D() sets the structure field uncompressed to the value of the argument +uncompressed; the structure field radiometric to the value of the argument radiometric; +and the structure field encoded_order to the value of the argument encoded_order. + +typedef unsigned XieOrientation; +typedef struct { + Bool uncompressed; + Bool radiometric; + XieOrientation encoded_order; +} XieEncodeG42DParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloExportClientPhoto(), XieFloExportPhotomap(), XieGetClientData(). + XIElib - Technique Functions XieTecEncodeServerChoice +Name +XieTecEncodeServerChoice - allocate and fill an XieEncodeServerChoiceParam structure. +Synopsis +XieEncodeServerChoiceParam *XieTecEncodeServerChoice (preference) +unsigned int preference; +Arguments +preference Specifies a hint to help the server make its choice. +Returns +The XieEncodeServerChoiceParam structure. +Description +XieEncodeServerChoice() allocates and returns a pointer to an +XieEncodeServerChoiceParam structure. The returned structure represents the list of +parameters required by the encode technique and may be used as the encode_param argument of +XieFloExportClientPhoto() and XieFloExportPhotomap() (when the encode_tech +argument is xieValEncodeServerChoice). + +If insufficient memory is available, XieTecEncodeServerChoice() returns NULL. To free the +memory allocated to this structure, use XFree(). + +The server choice technique allows the server to choose an encode technique when exporting to a +photomap. A photomap is a server resource which can be used to store image data. preference +specifies an optional hint that can be provided to help the server make its choice, but the server is not +obligated to obey the hint. One of the following standard server choice preference values can be +assigned to preference: + +xieValPreferDefault +xieValPreferSpace +xieValPreferTime + +xieValPreferTime hints that retrieval performance is the desired metric, whereas +xieValPreferSpace indicates that frugal use of storage space is more important. Normally the +server choice technique must choose a lossless encode technique, but when data is received from an +adjacent upstream import element it may choose to pass the import element's input data directly to the +photomap. +Structures +XieEncodeServerChoice() sets the structure field preference to the value of the argument +preference. + +typedef struct { + unsigned int preference; +} XieEncodeServerChoiceParam; + +/* Definitions for ServerChoice Preference Hints */ +#define xieValPreferDefault 0 +#define xieValPreferSpace 1 +#define xieValPreferTime 2 +See Also +XieFloExportPhotomap(). + XIElib - Technique Functions XieTecEncodeJPEGBaseline +Name +XieTecEncodeJPEGBaseline - allocate and fill an XieEncodeJPEGBaselineParam structure. +Synopsis +XieEncodeJPEGBaselineParam *XieTecEncodeJPEGBaseline (interleave, +band_order, horizontal_samples, vertical_samples, +q_table, q_size, ac_table, ac_size, dc_table, dc_size) +XieInterleave interleave; +XieOrientation band_order; +unsigned char horizontal_samples[3]; +unsigned char vertical_samples[3]; +char *q_table; +unsigned int q_size; +char *ac_table; +unsigned int ac_size; +char *dc_table; +unsigned int dc_size; +Arguments +interleave Specifies how the image bands will be interleaved. +band_order Specifies the order in which the image bands were originally encoded. +horizontal_samples Specifies the horizontal sampling factor. +vertical_samples Specifies the vertical sampling factor. +q_table Specifies the quantization table. +q_size Specifies the number of elements in q_table. +ac_table Specifies the AC Huffman table. +ac_size Specifies the number of elements in ac_table. +dc_table Specifies the DC Huffman table. +dc_size Specifies the number of elements in dc_table. +Returns +The XieEncodeJPEGBaselineParam structure. +Description +XieEncodeJPEGBaseline() allocates and returns a pointer to an +XieEncodeJPEGBaselineParam structure. The returned structure represents the list of +parameters required by the encode technique and may be used as the encode_param argument of +XieFloExportClientPhoto() and XieFloExportPhotomap() (when the encode_tech +argument is xieValEncodeJPEGBaseline). + +If insufficient memory is available, XieTecEncodeJPEGBaseline() returns NULL. +XieTecEncodeJPEGBaseline() allocates memory for the structure fields q_table, +ac_table, and dc_table; to free the memory allocated to the structure +XieEncodeJPEGBaselineParam, use XieFreeEncodeJPEGBaseline(). + +JPEG-Baseline is baseline Huffman DCT encoding as defined by ISO DIS 10918-1 "Digital Compression +and Coding of Continuous-tone Still Images". A stream of JPEG Interchange Format (JIF) data is +produced: all tables, compressed data, etc. are embedded in the data stream, all delineated by markers. + +interleave determines if all bands of a triple band image will be interleaved within a single encoded +stream, or if three separate encoded streams will be produced. One of the following standard interleave +values can be assigned to interleave: + +xieValBandByPixel +xieValBandByPlane + +For triple band data, band_order specifies the order in which the image bands were originally +encoded. One of the following standard orientation values can be assigned to band_order: + +xieValLSFirst +xieValMSFirst + +The least significant band of trichromatic data is the first band mentioned in the common name of the +colorspace: red is the least significant band of RGB data. band_order specifies whether this band +corresponds with the least significant or most significant image plane. Each plane is encoded from a +separate data stream: + +band +LSFirst +MSFirst + +0 +Red band +Blue band + +1 +Green band +Green band + +2 +Blue band +Red band + + +The arguments horizontal_samples and vertical_samples are the horizontal and vertical +sampling factors. q_table is the quantization table. ac_table specifies the AC Huffman table and +dc_table specifies the DC Huffman table. + +There may be one q_table per band or a single q_table shared between all bands. Generally there +is a single AC/DC pair of Huffman tables, but for triple band band-by-pixel data there may be two pairs +of tables (one for the luminance band and the other for the chromanance bands). If any table is +specified with zero length, it indicates that the server implementor is to supply that table (e.g. the +example tables defined in ISO DIS 10918-1 "Digital Compression and Coding of Continuous-tone Still +Images"). + +The arguments interleave, band_order, horizontal_samples, and +vertical_samples are ignored for single band images, and horizontal_samples and +vertical_samples are always ignored if interleave is band-by-plane. +horizontal_samples and vertical_samples share the definitions and restrictions stipulated +for parameters Hi and Vi, respectively, that are specified in annexes A and B of ISO DIS 10918-1 "Digital +Compression and Coding of Continuous-tone Still Images". +Structures +XieEncodeJPEGBaseline() sets the structure field interleave to the value of the argument +interleave; the structure field band_order to the value of the argument band_order; the +structure field horizontal_sample to the values of the argument horizontal_sample; the +structure field vertical_sample to the values of the argument vertical_sample; and the +structure fields q_table, q_size, ac_table, ac_size, dc_table, dc_size to the +values of the arguments q_table, q_size, ac_table, ac_size, dc_table, dc_size. + +typedef unsigned XieOrientation; +typedef struct { + XieInterleave interleave; + XieOrientation band_order; + unsigned char horizontal_samples[3]; + unsigned char vertical_samples[3]; + char *q_table; + unsigned int q_size; + char *ac_table; + unsigned int ac_size; + char *dc_table; + unsigned int dc_size; +} XieEncodeJPEGBaselineParam; + +/* Definitions for Interleave */ +#define xieValBandByPixel 1 +#define xieValBandByPlane 2 + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloExportClientPhoto(), XieFloExportPhotomap(), XieFreeEncodeJPEGBaseline(), +XieGetClientData(). + XIElib - Technique Functions XieTecEncodeJPEGLossless +Name +XieTecEncodeJPEGLossless - allocate and fill an XieEncodeJPEGLosslessParam structure. +Synopsis +XieEncodeJPEGLosslessParam *XieTecEncodeJPEGLossless (interleave, +band_order, predictor, table, table_size) +XieInterleave interleave; +XieOrientation band_order; +unsigned char predictor[3]; +char *table; +unsigned int table_size; +Arguments +interleave Specifies how the image bands will be interleaved. +band_order Specifies the order in which the image bands were originally encoded. +predictor Specifies the predictor selection value. +table Specifies the lossless entropy encoding table. +table_size Specifies the number of elements in table. +Returns +The XieEncodeJPEGLosslessParam structure. +Description +XieEncodeJPEGLossless() allocates and returns a pointer to an +XieEncodeJPEGLosslessParam structure. The returned structure represents the list of +parameters required by the encode technique and may be used as the encode_param argument of +XieFloExportClientPhoto() and XieFloExportPhotomap() (when the encode_tech +argument is xieValEncodeJPEGLossless). + +If insufficient memory is available, XieTecEncodeJPEGLossless() returns NULL. +XieTecEncodeJPEGLossless() allocates memory for the structure field table; to free the +memory allocated to the structure XieEncodeJPEGLosslessParam, use +XieFreeEncodeJPEGLossless(). + +JPEG-Lossless, corresponds to frames encoded using Huffman, predictive sequential lossless encoding +as defined by ISO DIS 10918-1 "Digital Compression and Coding of Continuous-tone Still Images". A +data stream of JPEG Interchange Format (JIF) data is returned: all tables, compressed data, etc. are +embedded in the data stream, all delineated by markers. +This technique is not available in the R6 sample implementation of XIE. + + +interleave determines if all bands of a triple band image will be interleaved within a single encoded +stream, or if three separate encoded streams will be produced. One of the following standard interleave +values can be assigned to interleave: + +xieValBandByPixel +xieValBandByPlane + +For triple band data, band_order specifies the order in which the image bands were originally +encoded. One of the following standard orientation values can be assigned to band_order: + +xieValLSFirst +xieValMSFirst + +The least significant band of trichromatic data is the first band mentioned in the common name of the +colorspace: red is the least significant band of RGB data. band_order specifies whether this band +corresponds with the least significant or most significant image plane. Each plane is encoded from a +separate data stream: + +band +LSFirst +MSFirst + +0 +Red band +Blue band + +1 +Green band +Green band + +2 +Blue band +Red band + + +The arguments interleave and band_order are ignored for single band images. + +predictor is the predictor selection value (one per band). table is the lossless entropy encoding +table (up to one per band). Specifying a table of length zero indicates that the server implementor +should supply a table (e.g. the example tables defined in ISO DIS 10918-1 "Digital Compression and +Coding of Continuous-tone Still Images"). + +Structures +XieEncodeJPEGLossless() sets the structure field interleave to the value of the argument +interleave; the structure field band_order to the value of the argument band_order; the +structure field predictor to the values of the argument predictor; and the structure fields +table, table_size to the values of the arguments table, table_size. + +typedef unsigned XieOrientation; +typedef struct { + XieInterleave interleave; + XieOrientation band_order; + unsigned char predictor[3]; + char *table; + unsigned int table_size; +} XieEncodeJPEGLosslessParam; +/* Definitions for Interleave */ +#define xieValBandByPixel 1 +#define xieValBandByPlane 2 + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloExportClientPhoto(), XieFloExportPhotomap(), XieGetClientData(). + XIElib - Technique Functions XieTecEncodeTIFF2 +Name +XieTecEncodeTIFF2 - allocate and fill an XieEncodeTIFF2Param structure. +Synopsis +XieEncodeTIFF2Param *XieTecEncodeTIFF2 (encoded_order, radiometric) +XieOrientation encoded_order; +Bool radiometric; +Arguments +encoded_order Specifies the bit-order of the encoded data. +radiometric Specifies how white runs are decoded. +Returns +The XieEncodeTIFF2Param structure. +Description +XieEncodeTIFF2() allocates and returns a pointer to an XieEncodeTIFF2Param structure. +The returned structure represents the list of parameters required by the encode technique and may be +used as the encode_param argument of XieFloExportClientPhoto() and +XieFloExportPhotomap() (when the encode_tech argument is xieValEncodeTIFF2). + +If insufficient memory is available, XieTecEncodeTIFF2() returns NULL. To free the memory +allocated to this structure, use XFree(). + +TIFF-2 is modified Huffman compression as described in "TIFF Tag Image File Format", revision 6.0, +draft 2, by Aldus Corporation. (TIFF compression scheme 2). + +radiometric specifies that image ones will be encoded as white runs, or conversely, image zeros +will be encoded as white runs, if radiometric is False. encoded_order specifies the bit- +order for the encoded data. One of the following standard orientation values can be assigned to +encoded_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the encoded bit order of two bytes (within each byte the first encoded bit is +0, last is bit 7): + +LSFirst +MSFirst + +76543210 76543210 +01234567 01234567 + +Structures +XieEncodeTIFF2() sets the structure field encoded_order to the value of the argument +encoded_order; and the structure field radiometric to the value of the argument +radiometric. + +typedef unsigned XieOrientation; +typedef struct { + XieOrientation encoded_order; + Bool radiometric; +} XieEncodeTIFF2Param; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloExportClientPhoto(), XieFloExportPhotomap(), XieGetClientData(). + XIElib - Technique Functions XieTecEncodeTIFFPackBits +Name +XieTecEncodeTIFFPackBits - allocate and fill an XieEncodeTIFFPackBitsParam structure. +Synopsis +XieEncodeTIFFPackBitsParam *XieTecEncodeTIFFPackBits (encoded_order) +XieOrientation encoded_order; +Arguments +encoded_order Specifies the bit-order of the encoded data. +Returns +The XieEncodeTIFFPackBitsParam structure. +Description +XieEncodeTIFFPackBits() allocates and returns a pointer to an +XieEncodeTIFFPackBitsParam structure. The returned structure represents the list of +parameters required by the encode technique and may be used as the encode_param argument of +XieFloExportClientPhoto() and XieFloExportPhotomap() (when the encode_tech +argument is xieValEncodeTIFFPackBits). + +If insufficient memory is available, XieTecEncodeTIFFPackBits() returns NULL. To free the +memory allocated to this structure, use XFree(). + +TIFF-PackBits is byte-oriented run-length encoding as described in "TIFF Tag Image File Format", +revision 6.0, draft 2, by Aldus Corporation. (TIFF compression scheme 32773). + +encoded_order specifies the bit-order of the encoded data. One of the following standard +orientation values can be assigned to encoded_order: + +xieValLSFirst +xieValMSFirst + +The following table shows the encoded bit order of two bytes (within each byte the first encoded bit is +0, last is bit 7): + +LSFirst +MSFirst + +76543210 76543210 +01234567 01234567 + +Structures +XieEncodeTIFFPackBits() sets the structure field encoded_order to the value of the +argument encoded_order. + +typedef unsigned XieOrientation; +typedef struct { + XieOrientation encoded_order; +} XieEncodeTIFFPackBitsParam; + +/* Definitions of Orientation Types */ +#define xieValLSFirst 1 +#define xieValMSFirst 2 +See Also +XieFloExportClientPhoto(), XieFloExportPhotomap(), XieGetClientData(). + XIElib - Technique Functions XieTecGeomAntialiasByArea +Name +XieTecGeomAntialiasByArea - allocate and fill an XieGeomAntialiasByAreaParam structure. +Synopsis +XieGeomAntialiasByAreaParam *XieTecGeomAntialiasByArea (simple) +int simple; +Arguments +simple Specifies the approximation form to use. +Returns +The XieGeomAntialiasByAreaParam structure. +Description +XieGeomAntialiasByArea() allocates and returns a pointer to an +XieGeomAntialiasByAreaParam structure. The returned structure represents the list of +parameters required by the geometry technique and may be used as the sample_param argument of +XieFloGeometry() (when the sample_tech argument is xieValGeomAntialiasByArea). + +If insufficient memory is available, XieTecGeomAntialiasByArea() returns NULL. To free the +memory allocated to this structure, use XFree(). + +Anti-aliasing techniques incorporate information from an "area" of pixels in the input image in order to +produce each output pixel. This implies that line dropouts and other artifacts will occur less often, and +the output image may have markedly better resemblance to the input image. The technique +AntialiasByArea computes the output image by assigning to each output pixel the weighted average of +the intensity values of input pixels which fall within its area. That is, the four corners of the output +pixel are projected back onto the input image. + +If simple is zero (0), the size and shape of the "area" are determined by the parameters of the +geometric transformation. The boundaries of the "area" may not fall on pixel boundaries and, in the case +of non-orthogonal rotation of the image, "area" may not be rectangular. Partial input pixel values may +have to be calculated: the antialias-by-area technique preserves shape but can be very slow +computationally. + +Because of the computational complexity of this method, two approximations are supported. If simple +is non-zero, the pixels covered by the projected area will be averaged without regard to the relative +amount of area which they contain: if they are touched by the area, they are included in a simple +average. If simple is set to N, with N odd and greater than one (3,5,7, ...), then only the center point of +the output pixel is projected, and a simple average is taken of an N by N window centered on the +projection. For best results, N should correspond roughly to the amount of scaling which will be done. + +Structures +XieGeomAntialiasByArea() sets the structure field simple to the value of the argument +simple. + +typedef struct { + int simple; +} XieGeomAntialiasByAreaParam; +See Also +XieFloGeometry(). + XIElib - Technique Functions XieTecGeomAntialiasByLowpass +Name +XieTecGeomAntialiasByLowpass - allocate and fill an XieGeomAntialiasByLowpassParam +structure. +Synopsis +XieGeomAntialiasByLowpassParam *XieTecGeomAntialiasByLowpass +(kernel_size) +int kernel_size; +Arguments +kernel_size Specifies the size of the image kernel. +Returns +The XieGeomAntialiasByLowpassParam structure. +Description +XieGeomAntialiasByLowpass() allocates and returns a pointer to an +XieGeomAntialiasByLowpassParam structure. The returned structure represents the list of +parameters required by the geometry technique and may be used as the sample_param argument of +XieFloGeometry() (when the sample_tech argument is +xieValGeomAntialiasByLowpass). + +If insufficient memory is available, XieTecGeomAntialiasByLowpass() returns NULL. To free +the memory allocated to this structure, use XFree(). + +Anti-aliasing techniques incorporate information from an "area" of pixels in the input image in order to +produce each output pixel. This implies that line dropouts and other artifacts will occur less often, and +the output image may have markedly better resemblance to the input image. The technique +AntialiasByLowpass represents an approximation to antialias-by-area which can be faster, yet provides +similar results. First, a low-pass filter is applied by passing an nxn boxcar kernel over the original input +image. Output pixel values are then derived using a nearest neighbor sampling method that selects the +value of the input pixel in the upper-left corner of the area mapped back from the output pixel. + +The user is allowed to select the size of the image kernel via the kernel_size parameter. For best +results, kernel_size should be chosen to correspond roughly to the amount of scaling which will +be done. Note that the server chooses the best kernel for the appropriate size; the values used in the +kernel are not alterable by the client application. Clients wishing to specify the kernel in more detail +should use the convolve technique directly. +Structures +XieGeomAntialiasByLowpass() sets the structure field kernel_size to the value of the +argument kernel_size. + +typedef struct { + int kernel_size; +} XieGeomAntialiasByLowpassParam; +See Also +XieFloGeometry(), XieFloConvolve(), XieTecGeomAntialiasByArea(). + XIElib - Technique Functions XieTecGeomGaussian +Name +XieTecGeomGaussian - allocate and fill an XieGeomGaussianParam structure. +Synopsis +XieGeomGaussianParam *XieTecGeomGaussian (sigma, normalize, radius, +simple) +double sigma; +double normalize; +unsigned int radius; +Bool simple; +Arguments +sigma Specifies the drop-off rate. +normalize Specifies a normalization constant. +radius Specifies the extent of computation. +simple Specifies the approximation form to use. +Returns +The XieGeomGaussianParam structure. +Description +XieGeomGaussian() allocates and returns a pointer to an XieGeomGaussianParam structure. +The returned structure represents the list of parameters required by the geometry technique and may be +used as the sample_param argument of XieFloGeometry() (when the sample_tech +argument is xieValGeomGaussian). + +If insufficient memory is available, XieTecGeomGaussian() returns NULL. To free the memory +allocated to this structure, use XFree(). + +A Geometry element can be visualized as stepping through each possible output pixel location in turn, +and computing the location from which to obtain each input pixel value. Each pixel (x',y') in the output +image is mapped to the coordinate location (x,y) in src by: + + + +It is not unusual that the input location (x,y) so derived will be non-integral, and will not correspond +exactly to a single pixel in the input image. + +From sampling theory, a bandwidth limited continuous input image can be recovered perfectly (under +certain conditions) from its sampled output by computing the convolution: + + + +Here I(x,y) is the continuous image, i(m,n) the discrete sampled image, and h(u,v) is the impulse +response function for an appropriate low pass filter. The specific form of h(u,v) for a Gaussian impulse +response function is given by: + + + +The term is called the "normalization constant" and may be altered using the normalize +parameter. The suggested value for * (sigma, the drop-off rate) is 1. Note that all technique parameters +must be chosen in concert + +radius defines the extent of computation. A suggested value for radius is one, that is, only pixels +within a distance of one in either the x or y direction are involved in the calculation. + +For computational convenience, a simplified form of Gaussian interpolation is provided. If simple is +True, the impulse-response function h(u,v) is: + + + +The normalization factor N is defined by normalize. As with true Gaussian interpolation, the +radius parameter is used to determine the number of pixels involved in the computation. +Structures +XieGeomGaussian() sets the structure field sigma to the value of the argument sigma; the +structure field normalize to the value of the argument normalize; the structure field radius to +the value of the argument radius; and the structure field simple to the value of the argument +simple. + +typedef struct { + float sigma; + float normalize; + unsigned int radius; + Bool simple; +} XieGeomGaussianParam; +See Also +XieFloGeometry(). + XIElib - Technique Functions XieTecGeomNearestNeighbor +Name +XieTecGeomNearestNeighbor - allocate and fill an XieGeomNearestNeighborParam structure. +Synopsis +XieGeomNearestNeighborParam *XieTecGeomNearestNeighbor (modify) + unsigned int modify; +Arguments +modify Specifies technique behavior on even boundaries. +Returns +The XieGeomNearestNeighborParam structure. +Description +XieGeomNearestNeighbor() allocates and returns a pointer to an +XieGeomNearestNeighborParam structure. The returned structure represents the list of +parameters required by the geometry technique and may be used as the sample_param argument of +XieFloGeometry() (when the sample_tech argument is xieValGeomNearestNeighbor). + +If insufficient memory is available, XieTecGeomNearestNeighbor() returns NULL. To free the +memory allocated to this structure, use XFree(). + +A Geometry element can be visualized as stepping through each possible output pixel location in turn, +and computing the location from which to obtain each input pixel value. Each pixel (x',y') in the output +image is mapped to the coordinate location (x,y) in src by: + + + +It is not unusual that the input location (x,y) so derived will be non-integral, and will not correspond +exactly to a single pixel in the input image. + +To illustrate NearestNeighbor technique, assume that the pixel grid locations P, Q, R, and S are integral. +Pixel location X = (x,y)T, obtained from the mapping equation above, differs from P by fractional +amounts s in the x direction and t in the y direction. + + + +Let I(P) be the value of the input image at coordinate P, if P is within the image extent. Otherwise, let I(P) +be constant, where constant is the pixel value passed to the Geometry element. A value of I(X) +must be estimated from I(P), I(Q), I(R), and I(S). In nearest-neighbor sampling, we simply choose the +image value from the discrete location closest to X. Thus, + +if s < 1/2, t < 1/2, set I(X) = I(P), +if s > 1/2, t < 1/2, set I(X) = I(Q), +if s > 1/2, t > 1/2, set I(X) = I(R), +if s < 1/2, t > 1/2, set I(X) = I(S). + +The behavior on even boundaries (s = 1/2 or t = 1/2) is determined by the modify parameter. One of +the standard nearest neighbor modify values can be assigned to modify: + +xieValFavorDown +xieValFavorUp +xieValRoundNW +xieValRoundNE +xieValRoundSE +xieValRoundSW + + +If modify is xieValFavorDown, all less than signs in the above are replaced with less than or +equal signs. Thus, P would win all ties, S and Q would lose to P but win over R, and R would lose all +ties. If modify is xieValFavorUp, then all greater than signs would be replaced with greater than +or equals, and the opposite behavior would occur. Four additional options are provided. The +xieValRoundxx options will always choose a specific integral pixel grid location; these are not +strictly nearest neighbor algorithms but are available for computational/filtering convenience. +Structures +XieGeomNearestNeighbor() sets the structure field modify to the value of the argument +modify. + +typedef struct { + unsigned int modify; +} XieGeomNearestNeighborParam; +/* Definitions of NearestNeighbor Modify */ +#define xieValFavorDown 1 +#define xieValFavorUp 2 +#define xieValRoundNW 3 +#define xieValRoundNE 4 +#define xieValRoundSE 5 +#define xieValRoundSW 6 +See Also +XieFloGeometry(). + XIElib - Technique Functions XieTecHistogramGaussian +Name +XieTecHistogramGaussian - allocate and fill an XieHistogramGaussianParam structure. +Synopsis +XieHistogramGaussianParam *XieTecHistogramGaussian (mean, sigma) +double mean; +double sigma; +Arguments +mean Specifies the center of the Gaussian probability density function. +sigma Specifies the "spread" of the Gaussian probability density function. +Returns +The XieHistogramGaussianParam structure. +Description +XieHistogramGaussian() allocates and returns a pointer to an +XieHistogramGaussianParam structure. The returned structure represents the list of parameters +required by the match-histogram shape technique and may be used as the shape_param argument of +XieFloMatchHistogram() (when the shape argument is xieValHistogramGaussian). + +If insufficient memory is available, XieTecHistogramGaussian() returns NULL. To free the +memory allocated to this structure, use XFree(). + +The Gaussian match-histogram shape technique specifies that the output image is to have a histogram +that approximates a Gaussian probability density. The supplied parameters are used to generate a +Gaussian probability density function centered around the mean level with a spread specified by +sigma: + + + +Structures +XieHistogramGaussian() sets the structure field mean to the value of the argument mean; and +the structure field sigma to the value of the argument sigma. + +typedef struct { + float mean; + float sigma; +} XieHistogramGaussianParam; +See Also +XieFloMatchHistogram(). + XIElib - Technique Functions XieTecHistogramHyperbolic +Name +XieTecHistogramHyperbolic - allocate and fill an XieHistogramHyperbolicParam structure. +Synopsis +XieHistogramHyperbolicParam *XieTecHistogramHyperbolic (constant, +shape_factor) +double constant; +Bool shape_factor; +Arguments +constant Specifies a value used to generate a hyperbolic probability density +function +shape_factor Specifies the relationship between the histogram shape and image +levels. +Returns +The XieHistogramHyperbolicParam structure. +Description +XieHistogramHyperbolic() allocates and returns a pointer to an +XieHistogramHyperbolicParam structure. The returned structure represents the list of +parameters required by the match-histogram shape technique and may be used as the shape_param +argument of XieFloMatchHistogram() (when the shape argument is +xieValHistogramHyperbolic). + +If insufficient memory is available, XieTecHistogramHyperbolic() returns NULL. To free the +memory allocated to this structure, use XFree(). + +The hyperbolic match-histogram shape technique specifies that the output image is to have a histogram +that approximates a hyperbolic probability density. + +constant is used to generate a hyperbolic probability density function: + + + +shape_factor should be specified as False if the histogram shape represents decreasing values +for higher levels, or True if the shape represents increasing values for higher levels. +Structures +XieHistogramHyperbolic() sets the structure field constant to the value of the argument +constant; and the structure field shape_factor to the value of the argument shape_factor. + +typedef struct { + float constant; + Bool shape_factor; +} XieHistogramHyperbolicParam; +See Also +XieFloMatchHistogram(). + XIElib - Technique Functions XieTecWhiteAdjustCIELabShift +Name +XieTecWhiteAdjustCIELabShift - allocate and fill an XieWhiteAdjustCIELabShiftParam +structure. +Synopsis +XieWhiteAdjustCIELabShiftParam *XieTecWhiteAdjustCIELabShift +(white_point) +XieConstant white_point; +Arguments +white_point Specifies the white point of the (source or output) data. +Returns +The XieWhiteAdjustCIELabShiftParam structure. +Description +XieWhiteAdjustCIELabShift() allocates and returns a pointer to an +XieWhiteAdjustCIELabShiftParam structure. The returned structure represents the list of +parameters required by the WhiteAdjust technique and may be used as the white_adjust_param +argument of XieTecRGBToCIELab(), XieTecRGBToCIEXYZ(), +XieTecCIELabToRGB(), and XieTecCIEXYZToRGB() (when the white_adjust_tech +argument is xieValWhiteAdjustCIELabShift). + +If insufficient memory is available, XieTecWhiteAdjustCIELabShift() returns NULL. To free +the memory allocated to this structure, use XFree(). + +White point correction can be used to ensure that white "looks" white, or it can be used to change the +overall tint of an image. + +The CIELabShift WhiteAdjust technique specifies that white point correction is to be accomplished by +adding the white point displacement to the ab plane in the CIELab colorspace. The white_point is +specified using CIEXYZ encodings. If the WhiteAdjust technique is used with a color conversion +technique that converts from RGB, white_point specifies the desired white point of the output +data; if the conversion is to RGB, white_point specifies the white point of the source data. +Structures +XieWhiteAdjustCIELabShift() sets the structure field white_point to the value of the +argument white_point. + +typedef float XieConstant[3]; +typedef unsigned XieWhiteAdjustTechnique; +typedef struct { + XieConstant white_point; +} XieWhiteAdjustCIELabShiftParam; +See Also +XieTecRGBToCIELab(), XieTecRGBToCIEXYZ(), XieTecCIELabToRGB(), XieTecCIEXYZToRGB(). + XIElib - Free Functions XieFreeTechniques +Name +XieFreeTechniques - free memory allocated for a list of techniques. +Synopsis +void XieFreeTechniques (techs, count) +XieTechnique *techs; +unsigned int count; +Arguments +techs Specifies the list of techniques to be freed. +count Specifies the number of items in the list of techniques to be freed. +Description +XieFreeTechniques() frees the memory previously allocated for techs. Care should be taken +that the argument pair techs/count match an argument pair techniques_ret/ +ntechniques_ret returned from XieQueryTechniques(). + +See XieQueryTechniques() for a description of the XieTechnique structure. +Structures +typedef unsigned XieTechniqueGroup; +typedef struct { + Bool needs_param; + XieTechniqueGroup group; + unsigned int number; + unsigned int speed; + char *name; +} XieTechnique; +See Also + XieQueryTechniques(). + XIElib - Free Functions XieFreePhotofloGraph +Name +XieFreePhotofloGraph - free memory allocated for an array of XiePhotoElement structures. +Synopsis +void XieFreePhotofloGraph (elements, count) +XiePhotoElement *elements; +unsigned int count; +Arguments +elements Specifies the array of XiePhotoElement structures to be freed. +count Specifies the number of XiePhotoElement structures in the array. +Description +XieFreePhotofloGraph() frees the specified array of XiePhotoElement structures. + +Care should be taken that the argument pair elements/count match a returned value (an array of +XiePhotoElement structures) and argument count from a call to +XieAllocatePhotofloGraph(). + +Technique parameters are not freed by using XieFreePhotofloGraph(). Most of the technique +parameters, with the exception of the JPEG baseline and JPEG lossless encode techniques, should be +freed using XFree(). This is so the client can reuse technique parameters between photoflos. +Structures +typedef struct { + int elemType; + /* union of ALL element types */ + union { + ... + ... + } data; +} XiePhotoElement; +See Also +XieAllocatePhotofloGraph(), XieCreatePhotoflo(), XieModifyPhotoflo(), XieRedefinePhotoflo(), +XieExecutePhotoflo(), XieQueryPhotoflo(), XieDestroyPhotoflo(), XieExecuteImmediate(). + XIElib - Free Functions XieFreeEncodeJPEGBaseline +Name +XieFreeEncodeJPEGBaseline - free the memory allocated to the structure +XieEncodeJPEGBaselineParam. +Synopsis +void XieFreeEncodeJPEGBaseline (param) +XieEncodeJPEGBaselineParam *param +Arguments +param Specifies a pointer to the structure that is to be freed. +Description +XieFreeEncodeJPEGBaseline() (rather than XFree()) should be used to free the memory +allocated by XieEncodeJPEGBaseline(). +Structures +typedef struct { + XieInterleave interleave; + XieOrientation band_order; + unsigned char horizontal_samples[3]; + unsigned char vertical_samples[3]; + char *q_table; + unsigned int q_size; + char *ac_table; + unsigned int ac_size; + char *dc_table; + unsigned int dc_size; +} XieEncodeJPEGBaselineParam; +See Also +XieTecEncodeJPEGBaseline(). + XIElib - Free Functions XieFreeEncodeJPEGLossless +Name +XieFreeEncodeJPEGLossless - free the memory allocated to the structure +XieEncodeJPEGLosslessParam. +Synopsis +void XieFreeEncodeJPEGLossless (param) +XieEncodeJPEGLosslessParam *param; +Arguments +param Specifies a pointer to the structure that is to be freed. +Description +XieFreeEncodeJPEGLossless() (rather than XFree()) should be used to free the memory +allocated by XieEncodeJPEGLossless(). + +Note that the JPEG Lossless technique is not available in the R6 sample implementation of XIE. +Structures +typedef struct { + XieInterleave interleave; + XieOrientation band_order; + unsigned char predictor[3]; + char *table; + unsigned int table_size; +} XieEncodeJPEGLosslessParam; +See Also +XieTecEncodeJPEGLossless(). + XIElib - Free Functions XieFreePasteUpTiles +Name +XieFreePasteUpTiles - free the memory allocated to the tiles field of a PasteUp structure. +Synopsis +void XieFreePasteUpTiles (element) +XiePhotoElement *element; +Arguments +element Specifies the XiePhotoElement structure to use. +Description +XieFreePasteUpTiles() frees the memory allocated to the tiles field in the specified +PasteUp member structure; after the memory has been freed, the field value is set to NULL. +Structures +typedef struct { + int elemType; + union { + ... + struct { + unsigned int width; + unsigned int height; + XieConstant constant; + XieTile *tiles; + unsigned int tile_count; + } PasteUp; + ... + } data; +} XiePhotoElement; +See Also +XieFloPasteUp(). + + + XIElib Events ColorAlloc +Description +The client is notified that a ConvertToIndex element has completed color allocation, but has produced a +result of lesser fidelity than was requested using the technique that was specified for the +ConvertToIndex element. + +The structure fields name_space, flo_id, src, and elem_type identify the photoflo and specific +ConvertToIndex element from which the ColorAlloc event originated. The structure field time is +the server time when the ColorAlloc event occurred, in milliseconds. The structure field +color_list is the color list resource that received the allocated colors. The structure field +color_alloc_technique is the ColorAlloc technique specified to the ConvertToIndex element. +The structure field color_alloc_data can be used for other information which is specific to the +ColorAlloc technique. +Structures +/* ColorAlloc Event Code */ +#define xieEvnNoColorAlloc 0 + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + unsigned long name_space; + Time time; + unsigned long flo_id; + XiePhototag src; + unsigned int elem_type; + XieColorList color_list; + XieColorAllocTechnique color_alloc_technique; + unsigned long color_alloc_data; +} XieColorAllocEvent; +See Also +XieFloConvertToIndex(), XieTecColorAllocAll(). + XIElib Events DecodeNotify +Description +A DecodeNotify event notifies the client that anomalies were encountered while decoding a +compressed image (see the notify arguments of XieImportClientPhoto() and +XieImportPhotomap()). Either an error has been encountered while decoding an image, or the +image data received does not satisfy the expected dimensions. + +The structure fields name_space, flo_id, src, and elem_type identify the photoflo and element +from which the DecodeNotify event originated. The structure field time is the server time when the +DecodeNotify event occurred, in milliseconds. The structure field band_number associates the +event with a specific band of the image. The structure field decode_technique is the Decode +technique being used. The structure fields width and height are the dimensions discovered while +decoding the data. The structure field aborted is True if decoding was aborted, or False if +recovery was possible. + +Recovery from a decode error may result in some missing or garbled image data. This may also cause +the height of the decoded data to be less than was expected. If the structure fields width or height +do not match the width and height specified to XieImportClientPhoto(), the image data is +clipped or padded (with zeros), as required, to enforce the XieImportClientPhoto() specified +dimensions. +Structures +/* DecodeNotify Event Code */ +#define xieEvnNoDecodeNotify 1 + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + unsigned long name_space; + Time time; + unsigned long flo_id; + XiePhototag src; + unsigned int elem_type; + XieDecodeTechnique decode_technique; + Bool aborted; + unsigned int band_number; + unsigned long width; + unsigned long height; +} XieDecodeNotifyEvent; +See Also +XieFloImportClientPhoto(), XieFloImportPhotomap(). + XIElib Events ExportAvailable +Description +The client is notified that an ExportClient element has data available (see the notify argument of the +applicable XieExportClient...() function). If notify was specified as xieValFirstData, +this event will only be sent the first time data become available from the ExportClient element. Otherwise +(i.e. xieValNewData was specified) this event will be generated each time the amount of data +available changes from zero to non-zero. + +The structure fields name_space, flo_id, src, and elem_type identify the photoflo and specific +ExportClient element from which the ExportAvailable event originated. The structure field time +is the server time when the ExportClient event occurred, in milliseconds. The structure field +band_number associates the event with a specific band of the image or LUT. The structure field +data is information specific to elem_type (e.g. the number of LUT entries or ROI rectangles +available). + +Where there is a single ExportClient element, the client can just read bytes or be event-driven. For +photoflos containing multiple ExportClient elements, the client should be event-driven. +Structures +/* ExportAvailable Event Code */ +#define xieEvnNoExportAvailable 2 + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + unsigned long name_space; + Time time; + unsigned long flo_id; + XiePhototag src; + unsigned int elem_type; + unsigned int band_number; + unsigned long data[3]; +} XieExportAvailableEvent; +See Also +XieFloExportClientHistogram(), XieFloExportClientLUT(), XieFloExportClientPhoto(), +XieFloExportClientROI(). + XIElib Events ImportObscured +Description +The client is notified when an ImportDrawable or ImportDrawablePlane element encounters obscured +regions in a Window that cannot be retrieved from backing store (see the notify argument of the +import element routine). A separate ImportObscured event is returned for each affected region. + +The structure fields name_space, flo_id, and src identify the photoflo and the specific import +element from which the ImportObscured event originated. The structure field time is the server +time when the ImportObscured event occurred, in milliseconds. The structure field window +identifies the Window. The obscured region of the window is specified by the structure fields x, y, +width, and height. + +Note: image data within obscured regions will be populated with the fill argument supplied to the +import element. +Structures +/* ImportObscured Event Code */ +#define xieEvnNoImportObscured 3 + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + unsigned long name_space; + Time time; + unsigned long flo_id; + XiePhototag src; + unsigned int elem_type; + Window window; + int x; + int y; + unsigned int width; + unsigned int height; +} XieImportObscuredEvent; +See Also +XieFloImportDrawable(), XieFloImportDrawablePlane(). + XIElib Events PhotofloDone +Description +A PhotofloDone event notifies the client that a photoflo has left the active state. It is enabled by +the notify argument of XieExecutePhotoflo() or XieExecuteImmediate(). + +The photoflo from which the PhotofloDone event originated is identified by the structure fields +name_space and flo_id. The structure field time is the server time when the PhotofloDone +event occurred, in milliseconds. The reason the photoflo left the active state is indicated by the +structure field type. + +If the Photoflo terminated due to an error condition, the details concerning the error have preceded this +event in an error message. +Structures +/* PhotofloDone Event Code */ +#define xieEvnNoPhotofloDone 4 + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + unsigned long name_space; + Time time; + unsigned long flo_id; +} XiePhotofloDoneEvent; +See Also +XieExecuteImmediate(), XieExecutePhotoflo(). + + + XIElib Errors Resource Errors +The following error codes are allocated from the extension error space to provide for the errors returned +by XIE: + +Error Cause +xieErrNoColorlist the value for a color_list argument does not name a defined color +list. +xieErrNoLUT the value for a lut argument does not name a defined LUT. +xieErrNoPhotoflo the value for a photoflo argument does not name a defined photoflo. +xieErrNoPhotomap the value for a photomap argument does not name a defined +photomap. +xieErrNoPhotospace the value for a photospace argument does not name a defined +photospace. +xieErrNoROI the value for a roi argument does not name a defined ROI. +xieErrNoFlo an error has been detected while defining, executing, or accessing a +photoflo (See Photoflo Errors). + +XIE also uses the core protocol BadAccess, BadAlloc, BadIDChoice, BadLength, BadRequest, and +BadValue errors. + XIElib Errors Photoflo Errors +If an error is detected while defining, executing, or accessing a photoflo, an xieErrNoFlo... error +is returned. This single error code is allocated from the extension error space for all photoflo related +errors. The following sub-codes are defined to provide the details of the error: + +Error Cause +xieErrNoFloAccess attempt to execute, modify, or redefine an active photoflo or +attempt to Get/Put client data from/to an inactive photoflo. +xieErrNoFloAlloc insufficient resources (e.g. memory). +xieErrNoFloColormap an unknown Colormap has been specified. +xieErrNoFloColorList an unknown color list has been specified. +xieErrNoFloDomain invalid domain phototag: + - source data is not a list-of-rectangles or control-plane or + - specified non-zero on a DIS server. +xieErrNoFloDrawable an unknown Drawable has been specified. +xieErrNoFloElement an unknown element type has been specified or +invalid element type for request or +attempt to change or add an element type. +xieErrNoFloGC an unknown GContext has been specified. +xieErrNoFloID invalid executable: + - an unknown photoflo has been specified or + - an unknown photospace has been specified. +xieErrNoFloLength an element was received with the incorrect number of bytes. +xieErrNoFloLUT an unknown LUT has been specified. +xieErrNoFloMatch some argument or pair of arguments has the correct type and range, but +it fails to match in some other way required by the element. +xieErrNoFloOperator an unknown operator has been specified. +xieErrNoFloPhotomap an unknown photomap has been specified. +xieErrNoFloROI an unknown ROI has been specified. +xieErrNoFloSource an invalid phototag has been specified: + - zero, but a phototag is required or + - downstream from the particular element or + - beyond the bounds of the photoflo. +xieErrNoFloTechnique an unknown technique has been specified or +invalid technique specific-parameters have been specified or +the wrong number of technique-specific parameters have been given. +xieErrNoFloValue some numeric value falls outside of the range of values accepted by the +element. +xieErrNoFloImplementation some aspect of a request is not implemented by the server: +the client should be prepared to receive and handle this error. + + +Structures +/* Definition of Error Codes */ +#define xieErrNoColorList 0 +#define xieErrNoLUT 1 +#define xieErrNoPhotoflo 2 +#define xieErrNoPhotomap 3 +#define xieErrNoPhotospace 4 +#define xieErrNoROI 5 +#define xieErrNoFlo 6 + +/* Definitions of Flo Error (Sub-) Codes */ +#define xieErrNoFloAccess 1 +#define xieErrNoFloAlloc 2 +#define xieErrNoFloColormap 3 +#define xieErrNoFloColorList 4 +#define xieErrNoFloDomain 5 +#define xieErrNoFloDrawable 6 +#define xieErrNoFloElement 7 +#define xieErrNoFloGC 8 +#define xieErrNoFloID 9 +#define xieErrNoFloLength 10 +#define xieErrNoFloLUT 11 +#define xieErrNoFloMatch 12 +#define xieErrNoFloOperator 13 +#define xieErrNoFloPhotomap 14 +#define xieErrNoFloROI 15 +#define xieErrNoFloSource 16 +#define xieErrNoFloTechnique 17 +#define xieErrNoFloValue 18 +#define xieErrNoFloImplementation 19 + +XIElib ii + +XIElib Events-5 + +XIElib Errors-3 + + diff --git a/xie/xc/include/extensions/XIE.h b/xie/xc/include/extensions/XIE.h new file mode 100644 index 0000000..f426db3 --- /dev/null +++ b/xie/xc/include/extensions/XIE.h @@ -0,0 +1,430 @@ +/* $XConsortium: XIE.h,v 1.5 94/04/17 20:11:11 mor Exp $ */ +/****************************************************************************** + + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. + +******************************************************************************/ + +#ifndef _XIE_H_ +#define _XIE_H_ + + +/* Extension Name and version number */ + +#define xieExtName "XIE" + +#define xieMajorVersion 5 +#define xieMinorVersion 0 +#define xieEarliestMinorVersion 0 +#define xieLatestMinorVersion 0 + + +/* ServiceClass */ + +#ifdef XIE_DIS +#define XIE_FULL 0 +#else +#define XIE_FULL 1 +#endif + +#define xieValFull 1 +#define xieValDIS 2 + + +/* Limits */ + +#define xieValMaxBands 3 + + +/* Alignment */ + +#define xieValAlignable 1 +#define xieValArbitrary 2 + + +/* ArithmeticOp */ + +#define xieValAdd 1 +#define xieValSub 2 +#define xieValSubRev 3 +#define xieValMul 4 +#define xieValDiv 5 +#define xieValDivRev 6 +#define xieValMin 7 +#define xieValMax 8 +#define xieValGamma 9 + + +/* ColorAllocTechnique */ + +#define xieValColorAllocDefault 0 +#define xieValColorAllocAll 2 +#define xieValColorAllocMatch 4 +#define xieValColorAllocRequantize 6 + + +/* Colorspace conversions */ + +#define xieValRGBToCIELab 2 +#define xieValRGBToCIEXYZ 4 +#define xieValRGBToYCbCr 6 +#define xieValRGBToYCC 8 + +#define xieValCIELabToRGB 2 +#define xieValCIEXYZToRGB 4 +#define xieValYCbCrToRGB 6 +#define xieValYCCToRGB 8 + + +/* CompareOp */ + +#define xieValLT 1 +#define xieValLE 2 +#define xieValEQ 3 +#define xieValNE 4 +#define xieValGT 5 +#define xieValGE 6 + + +/* ConstrainTechnique */ + +#define xieValConstrainClipScale 2 +#define xieValConstrainHardClip 4 + + +/* ConvolveTechnique */ + +#define xieValConvolveDefault 0 +#define xieValConvolveConstant 2 +#define xieValConvolveReplicate 4 + + +/* DataClass */ + +#define xieValSingleBand 1 +#define xieValTripleBand 2 + +/* DataType */ + +#define xieValConstrained 1 +#define xieValUnconstrained 2 + + +/* DecodeTechnique */ + +#define xieValDecodeUncompressedSingle 2 /* bitonal & grayscale */ +#define xieValDecodeUncompressedTriple 3 /* color */ +#define xieValDecodeG31D 4 /* FAX */ +#define xieValDecodeG32D 6 /* FAX */ +#define xieValDecodeG42D 8 /* FAX */ +#define xieValDecodeJPEGBaseline 10 /* grayscale & color */ +#define xieValDecodeJPEGLossless 12 /* grayscale & color */ +#define xieValDecodeTIFF2 14 /* TIFF modified G31D */ +#define xieValDecodeTIFFPackBits 16 /* TIFF APPLE FORMAT */ + + +/* DitherTechnique */ + +#define xieValDitherDefault 0 +#define xieValDitherErrorDiffusion 2 +#define xieValDitherOrdered 4 + + +/* EncodeTechnique */ + +#define xieValEncodeServerChoice 1 /* (to photomaps) */ +#define xieValEncodeUncompressedSingle 2 /* bitonal & grayscale */ +#define xieValEncodeUncompressedTriple 3 /* color */ +#define xieValEncodeG31D 4 /* FAX */ +#define xieValEncodeG32D 6 /* FAX */ +#define xieValEncodeG42D 8 /* FAX */ +#define xieValEncodeJPEGBaseline 10 /* grayscale & color */ +#define xieValEncodeJPEGLossless 12 /* grayscale & color */ +#define xieValEncodeTIFF2 14 /* TIFF modified G31D */ +#define xieValEncodeTIFFPackBits 16 /* TIFF APPLE FORMAT */ + +/* ServerChoice preference hints */ + +#define xieValPreferDefault 0 +#define xieValPreferSpace 1 +#define xieValPreferTime 2 + +/* JPEG-Lossless predictor */ + +#define xieValPredictorNone 0 +#define xieValPredictorA 1 +#define xieValPredictorB 2 +#define xieValPredictorC 3 +#define xieValPredictorABC 4 +#define xieValPredictorABC2 5 +#define xieValPredictorBAC2 6 +#define xieValPredictorAB2 7 + + +/* ExportNotify */ + +#define xieValDisable 1 +#define xieValFirstData 2 +#define xieValNewData 3 + + +/* ExportState */ + +#define xieValExportDone 1 +#define xieValExportMore 2 +#define xieValExportEmpty 3 +#define xieValExportError 4 + + +/* GamutTechnique */ + +#define xieValGamutDefault 0 +#define xieValGamutNone 1 +#define xieValGamutClipRGB 2 + + +/* GeometryTechnique */ + +#define xieValGeomDefault 0 +#define xieValGeomAntialias 2 +#define xieValGeomAntialiasByArea 4 +#define xieValGeomAntialiasByLPF 6 +#define xieValGeomBilinearInterp 8 +#define xieValGeomGaussian 10 +#define xieValGeomNearestNeighbor 12 + + +/* NearestNeighbor modify */ + +#define xieValFavorDown 1 +#define xieValFavorUp 2 +#define xieValRoundNW 3 +#define xieValRoundNE 4 +#define xieValRoundSE 5 +#define xieValRoundSW 6 + + +/* HistogramShape */ + +#define xieValHistogramFlat 2 +#define xieValHistogramGaussian 4 +#define xieValHistogramHyperbolic 6 + + +/* Interleave */ + +#define xieValBandByPixel 1 +#define xieValBandByPlane 2 + + +/* MathOp */ + +#define xieValExp 1 +#define xieValLn 2 +#define xieValLog2 3 +#define xieValLog10 4 +#define xieValSquare 5 +#define xieValSqrt 6 + + +/* Orientation */ + +#define xieValLSFirst 1 +#define xieValMSFirst 2 + + +/* PhotofloOutcome */ + +#define xieValFloSuccess 1 +#define xieValFloAbort 2 +#define xieValFloError 3 + + +/* PhotofloState */ + +#define xieValInactive 1 +#define xieValActive 2 +#define xieValNonexistent 3 + + +/* TechniqueGroup */ + +#define xieValDefault 0 +#define xieValAll 1 +#define xieValColorAlloc 2 +#define xieValConstrain 4 +#define xieValConvertFromRGB 6 +#define xieValConvertToRGB 8 +#define xieValConvolve 10 +#define xieValDecode 12 +#define xieValDither 14 +#define xieValEncode 16 +#define xieValGamut 18 +#define xieValGeometry 20 +#define xieValHistogram 22 +#define xieValWhiteAdjust 24 + +#define xieValMaxTechGroup 24 + + +/* WhiteAdjustTechnique */ + +#define xieValWhiteAdjustDefault 0 +#define xieValWhiteAdjustNone 1 +#define xieValWhiteAdjustCIELabShift 2 + + +/* Photoflo elements */ + +#define xieElemImportClientLUT 1 +#define xieElemImportClientPhoto 2 +#define xieElemImportClientROI 3 +#define xieElemImportDrawable 4 +#define xieElemImportDrawablePlane 5 +#define xieElemImportLUT 6 +#define xieElemImportPhotomap 7 +#define xieElemImportROI 8 +#define xieElemArithmetic 9 +#define xieElemBandCombine 10 +#define xieElemBandExtract 11 +#define xieElemBandSelect 12 +#define xieElemBlend 13 +#define xieElemCompare 14 +#define xieElemConstrain 15 +#define xieElemConvertFromIndex 16 +#define xieElemConvertFromRGB 17 +#define xieElemConvertToIndex 18 +#define xieElemConvertToRGB 19 +#define xieElemConvolve 20 +#define xieElemDither 21 +#define xieElemGeometry 22 +#define xieElemLogical 23 +#define xieElemMatchHistogram 24 +#define xieElemMath 25 +#define xieElemPasteUp 26 +#define xieElemPoint 27 +#define xieElemUnconstrain 28 +#define xieElemExportClientHistogram 29 +#define xieElemExportClientLUT 30 +#define xieElemExportClientPhoto 31 +#define xieElemExportClientROI 32 +#define xieElemExportDrawable 33 +#define xieElemExportDrawablePlane 34 +#define xieElemExportLUT 35 +#define xieElemExportPhotomap 36 +#define xieElemExportROI 37 + +#define xieMaxElem 37 + + +/* Event Codes */ + +#define xieEvnNoColorAlloc 0 +#define xieEvnNoDecodeNotify 1 +#define xieEvnNoExportAvailable 2 +#define xieEvnNoImportObscured 3 +#define xieEvnNoPhotofloDone 4 + +#define xieNumEvents 5 + + +/* Error Codes */ + +#define xieErrNoColorList 0 +#define xieErrNoLUT 1 +#define xieErrNoPhotoflo 2 +#define xieErrNoPhotomap 3 +#define xieErrNoPhotospace 4 +#define xieErrNoROI 5 +#define xieErrNoFlo 6 + +#define xieNumErrors 7 + + +/* Flo Error Codes */ + +#define xieErrNoFloAccess 1 +#define xieErrNoFloAlloc 2 +#define xieErrNoFloColormap 3 +#define xieErrNoFloColorList 4 +#define xieErrNoFloDomain 5 +#define xieErrNoFloDrawable 6 +#define xieErrNoFloElement 7 +#define xieErrNoFloGC 8 +#define xieErrNoFloID 9 +#define xieErrNoFloLength 10 +#define xieErrNoFloLUT 11 +#define xieErrNoFloMatch 12 +#define xieErrNoFloOperator 13 +#define xieErrNoFloPhotomap 14 +#define xieErrNoFloROI 15 +#define xieErrNoFloSource 16 +#define xieErrNoFloTechnique 17 +#define xieErrNoFloValue 18 +#define xieErrNoFloImplementation 19 + +#define xieNumFloErrors 19 + +#endif /* _XIE_H_ */ diff --git a/xie/xc/include/extensions/XIEproto.h b/xie/xc/include/extensions/XIEproto.h new file mode 100644 index 0000000..b097319 --- /dev/null +++ b/xie/xc/include/extensions/XIEproto.h @@ -0,0 +1,687 @@ +/* $XConsortium: XIEproto.h,v 1.6 94/04/17 20:11:12 mor Exp $ */ +/****************************************************************************** +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +******************************************************************************/ + +#ifndef _XIEPROTO_H_ +#define _XIEPROTO_H_ + +#include + +#define Drawable CARD32 +#define Colormap CARD32 +#define GContext CARD32 + + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; +} xieReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + CARD16 majorVersion B16; + CARD16 minorVersion B16; +} xieQueryImageExtensionReq; + +typedef struct { + CARD8 type; + CARD8 data; + CARD16 sequenceNum B16; + CARD32 length B32; + CARD16 majorVersion B16; + CARD16 minorVersion B16; + xieTypServiceClass serviceClass; + xieTypAlignment alignment; + CARD16 unconstrainedMantissa B16; + INT32 unconstrainedMaxExp B32; + INT32 unconstrainedMinExp B32; + CARD8 pad2[8]; + /* LISTofCARD32 (constrained-levels) */ +} xieQueryImageExtensionReply; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypTechniqueGroup techniqueGroup; + CARD8 pad[3]; +} xieQueryTechniquesReq; + +typedef struct { + CARD8 type; + CARD8 data; + CARD16 sequenceNum B16; + CARD32 length B32; + CARD16 numTechniques B16; + CARD8 pad[22]; + /* LISTofTechniqueRec (numTechniques) */ +} xieQueryTechniquesReply; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypColorList colorList B32; +} xieCreateColorListReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypColorList colorList B32; +} xieDestroyColorListReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypColorList colorList B32; +} xiePurgeColorListReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypColorList colorList B32; +} xieQueryColorListReq; + +typedef struct { + CARD8 type; + CARD8 data; + CARD16 sequenceNum B16; + CARD32 length B32; + Colormap colormap B32; + CARD8 pad[20]; + /* LISTofCARD32 (length) */ +} xieQueryColorListReply; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypLUT lut B32; +} xieCreateLUTReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypLUT lut B32; +} xieDestroyLUTReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotomap photomap B32; +} xieCreatePhotomapReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotomap photomap B32; +} xieDestroyPhotomapReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotomap photomap B32; +} xieQueryPhotomapReq; + +typedef struct { + CARD8 type; + BOOL populated; + CARD16 sequenceNum B16; + CARD32 length B32; + xieTypDataClass dataClass; + xieTypDataType dataType; + xieTypDecodeTechnique decodeTechnique B16; + CARD32 width0 B32; + CARD32 width1 B32; + CARD32 width2 B32; + CARD32 height0 B32; + CARD32 height1 B32; + CARD32 height2 B32; + CARD32 levels0 B32; + CARD32 levels1 B32; + CARD32 levels2 B32; +} xieQueryPhotomapReply; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypROI roi B32; +} xieCreateROIReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypROI roi B32; +} xieDestroyROIReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotospace nameSpace B32; +} xieCreatePhotospaceReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotospace nameSpace B32; +} xieDestroyPhotospaceReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotospace nameSpace B32; + CARD32 floID B32; + CARD16 numElements B16; + BOOL notify; + CARD8 pad; + /* LISTofPhotoElement (numElements) */ +} xieExecuteImmediateReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotoflo floID B32; + CARD16 numElements B16; + CARD16 pad B16; + /* LISTofPhotoElement (numElements) */ +} xieCreatePhotofloReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotoflo floID B32; +} xieDestroyPhotofloReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotoflo floID B32; + BOOL notify; + CARD8 pad[3]; +} xieExecutePhotofloReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotoflo floID B32; + xieTypPhototag start B16; + CARD16 numElements B16; + /* LISTofPhotoElement (numElements) */ +} xieModifyPhotofloReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + xieTypPhotoflo floID B32; + CARD16 numElements B16; + CARD16 pad B16; + /* LISTofPhotoElement (numElements) */ +} xieRedefinePhotofloReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + CARD32 nameSpace B32; + CARD32 floID B32; + xieTypPhototag element B16; + BOOL final; + CARD8 bandNumber; + CARD32 byteCount B32; + /* LISTofCARD8 (byteCount) */ + /* pad (byteCount) */ +} xiePutClientDataReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + CARD32 nameSpace B32; + CARD32 floID B32; + CARD32 maxBytes B32; + xieTypPhototag element B16; + BOOL terminate; + CARD8 bandNumber; +} xieGetClientDataReq; + +typedef struct { + CARD8 type; + CARD8 newState; + CARD16 sequenceNum B16; + CARD32 length B32; + CARD32 byteCount B32; + CARD8 pad[20]; + /* LISTofCARD8 (byteCount) */ + /* pad (byteCount) */ +} xieGetClientDataReply; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + CARD32 nameSpace B32; + CARD32 floID B32; +} xieQueryPhotofloReq; + +typedef struct { + CARD8 type; + CARD8 state; + CARD16 sequenceNum B16; + CARD32 length B32; + CARD16 expectedCount B16; + CARD16 availableCount B16; + CARD8 pad[20]; + /* LISTofPhototag (expectedCount) */ + /* pad (expectedCount * 2) */ + /* LISTofPhototag (availableCount) */ + /* pad (availableCount * 2) */ +} xieQueryPhotofloReply; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + CARD32 nameSpace B32; + CARD32 floID B32; +} xieAwaitReq; + +typedef struct { + CARD8 reqType; + CARD8 opcode; + CARD16 length B16; + CARD32 nameSpace B32; + CARD32 floID B32; +} xieAbortReq; + + +/* + * Request codes + */ + +#define X_ieQueryImageExtension 1 +#define X_ieQueryTechniques 2 +#define X_ieCreateColorList 3 +#define X_ieDestroyColorList 4 +#define X_iePurgeColorList 5 +#define X_ieQueryColorList 6 +#define X_ieCreateLUT 7 +#define X_ieDestroyLUT 8 +#define X_ieCreatePhotomap 9 +#define X_ieDestroyPhotomap 10 +#define X_ieQueryPhotomap 11 +#define X_ieCreateROI 12 +#define X_ieDestroyROI 13 +#define X_ieCreatePhotospace 14 +#define X_ieDestroyPhotospace 15 +#define X_ieExecuteImmediate 16 +#define X_ieCreatePhotoflo 17 +#define X_ieDestroyPhotoflo 18 +#define X_ieExecutePhotoflo 19 +#define X_ieModifyPhotoflo 20 +#define X_ieRedefinePhotoflo 21 +#define X_iePutClientData 22 +#define X_ieGetClientData 23 +#define X_ieQueryPhotoflo 24 +#define X_ieAwait 25 +#define X_ieAbort 26 + +#define xieNumProtoReq 26 + + +/* + * Events + */ +typedef struct { + CARD8 event; + xieTypPhotofloOutcome outcome; + CARD16 sequenceNum B16; + CARD32 time B32; + CARD32 instanceNameSpace B32; + CARD32 instanceFloID B32; + CARD8 pad[16]; +} xiePhotofloDoneEvn; + +typedef struct { + CARD8 event; + CARD8 pad1; + CARD16 sequenceNum B16; + CARD32 time B32; + CARD32 instanceNameSpace B32; + CARD32 instanceFloID B32; + xieTypPhototag src B16; + CARD16 type B16; + CARD32 pad2 B32; + CARD32 pad3 B16; + CARD32 pad4 B32; +} xieFloEvn; + +typedef struct { + CARD8 event; + CARD8 pad1; + CARD16 sequenceNum B16; + CARD32 time B32; + CARD32 instanceNameSpace B32; + CARD32 instanceFloID B32; + xieTypPhototag src B16; + CARD16 type B16; + xieTypColorList colorList B32; + xieTypColorAllocTechnique colorAllocTechnique B16; + CARD16 pad2 B16; + CARD32 data B32; +} xieColorAllocEvn; + +typedef struct { + CARD8 event; + CARD8 bandNumber; + CARD16 sequenceNum B16; + CARD32 time B32; + CARD32 instanceNameSpace B32; + CARD32 instanceFloID B32; + xieTypPhototag src B16; + CARD16 type B16; + xieTypDecodeTechnique decodeTechnique B16; + BOOL aborted; + CARD8 pad; + CARD32 width B32; + CARD32 height B32; +} xieDecodeNotifyEvn; + +typedef struct { + CARD8 event; + CARD8 bandNumber; + CARD16 sequenceNum B16; + CARD32 time B32; + CARD32 instanceNameSpace B32; + CARD32 instanceFloID B32; + xieTypPhototag src B16; + CARD16 type B16; + CARD32 data0 B32; + CARD32 data1 B32; + CARD32 data2 B32; +} xieExportAvailableEvn; + +typedef struct { + CARD8 event; + CARD8 pad; + CARD16 sequenceNum B16; + CARD32 time B32; + CARD32 instanceNameSpace B32; + CARD32 instanceFloID B32; + xieTypPhototag src B16; + CARD16 type B16; + Window window B32; + INT16 x B16; + INT16 y B16; + CARD16 width B16; + CARD16 height B16; +} xieImportObscuredEvn; + + +/* + * Errors + */ +typedef struct { + CARD8 error; + CARD8 code; + CARD16 sequenceNum B16; + CARD32 resourceID B32; + CARD16 minorOpcode B16; + CARD8 majorOpcode; + CARD8 pad[21]; +} xieResourceErr; + +typedef struct { + CARD8 error; + CARD8 code; + CARD16 sequenceNum B16; + CARD32 floID B32; + CARD16 minorOpcode B16; + CARD8 majorOpcode; + CARD8 floErrorCode; + CARD32 nameSpace B32; + xieTypPhototag phototag B16; + CARD16 type B16; + CARD32 resourceID B32; + CARD8 pad[8]; +} xieFloResourceErr; + +typedef struct { + CARD8 error; + CARD8 code; + CARD16 sequenceNum B16; + CARD32 floID B32; + CARD16 minorOpcode B16; + CARD8 majorOpcode; + CARD8 floErrorCode; + CARD32 nameSpace B32; + xieTypPhototag phototag B16; + CARD16 type B16; + CARD8 pad[12]; +} xieFloErr, xieFloAccessErr, xieFloAllocErr, xieFloElementErr, + xieFloLengthErr, xieFloMatchErr, xieFloSourceErr, xieFloImplementationErr; + +typedef struct { + CARD8 error; + CARD8 code; + CARD16 sequenceNum B16; + CARD32 floID B32; + CARD16 minorOpcode B16; + CARD8 majorOpcode; + CARD8 floErrorCode; + CARD32 nameSpace B32; + xieTypPhototag phototag B16; + CARD16 type B16; + xieTypPhototag domainSrc B16; + CARD8 pad[10]; +} xieFloDomainErr; + +typedef struct { + CARD8 error; + CARD8 code; + CARD16 sequenceNum B16; + CARD32 floID B32; + CARD16 minorOpcode B16; + CARD8 majorOpcode; + CARD8 floErrorCode; + CARD32 nameSpace B32; + CARD8 pad[16]; +} xieFloIDErr; + +typedef struct { + CARD8 error; + CARD8 code; + CARD16 sequenceNum B16; + CARD32 floID B32; + CARD16 minorOpcode B16; + CARD8 majorOpcode; + CARD8 floErrorCode; + CARD32 nameSpace B32; + xieTypPhototag phototag B16; + CARD16 type B16; + CARD8 operator; + CARD8 pad[11]; +} xieFloOperatorErr; + +typedef struct { + CARD8 error; + CARD8 code; + CARD16 sequenceNum B16; + CARD32 floID B32; + CARD16 minorOpcode B16; + CARD8 majorOpcode; + CARD8 floErrorCode; + CARD32 nameSpace B32; + xieTypPhototag phototag B16; + CARD16 type B16; + CARD16 techniqueNumber B16; + CARD16 lenTechParams B16; + CARD8 techniqueGroup; + CARD8 pad[7]; +} xieFloTechniqueErr; + +typedef struct { + CARD8 error; + CARD8 code; + CARD16 sequenceNum B16; + CARD32 floID B32; + CARD16 minorOpcode B16; + CARD8 majorOpcode; + CARD8 floErrorCode; + CARD32 nameSpace B32; + xieTypPhototag phototag B16; + CARD16 type B16; + CARD32 badValue B32; + CARD8 pad[8]; +} xieFloValueErr; + + + +/* + * SIZEOF values + */ +#define sz_xieReq 4 +#define sz_xieQueryImageExtensionReq 8 +#define sz_xieQueryImageExtensionReply 32 +#define sz_xieQueryTechniquesReq 8 +#define sz_xieQueryTechniquesReply 32 +#define sz_xieCreateColorListReq 8 +#define sz_xieDestroyColorListReq 8 +#define sz_xiePurgeColorListReq 8 +#define sz_xieQueryColorListReq 8 +#define sz_xieQueryColorListReply 32 +#define sz_xieCreateLUTReq 8 +#define sz_xieDestroyLUTReq 8 +#define sz_xieCreatePhotomapReq 8 +#define sz_xieDestroyPhotomapReq 8 +#define sz_xieQueryPhotomapReq 8 +#define sz_xieQueryPhotomapReply 48 +#define sz_xieCreateROIReq 8 +#define sz_xieDestroyROIReq 8 +#define sz_xieCreatePhotospaceReq 8 +#define sz_xieDestroyPhotospaceReq 8 +#define sz_xieExecuteImmediateReq 16 +#define sz_xieCreatePhotofloReq 12 +#define sz_xieDestroyPhotofloReq 8 +#define sz_xieExecutePhotofloReq 12 +#define sz_xieModifyPhotofloReq 12 +#define sz_xieRedefinePhotofloReq 12 +#define sz_xiePutClientDataReq 20 +#define sz_xieGetClientDataReq 20 +#define sz_xieGetClientDataReply 32 +#define sz_xieQueryPhotofloReq 12 +#define sz_xieQueryPhotofloReply 32 +#define sz_xieAwaitReq 12 +#define sz_xieAbortReq 12 + +#define sz_xiePhotofloDoneEvn 32 +#define sz_xieColorAllocEvn 32 +#define sz_xieDecodeNotifyEvn 32 +#define sz_xieExportAvailableEvn 32 +#define sz_xieImportObscuredEvn 32 +#define sz_xieFloEvn 32 + +#define sz_xieResourceErr 32 +#define sz_xieFloAccessErr 32 +#define sz_xieFloAllocErr 32 +#define sz_xieFloElementErr 32 +#define sz_xieFloIDErr 32 +#define sz_xieFloLengthErr 32 +#define sz_xieFloMatchErr 32 +#define sz_xieFloSourceErr 32 +#define sz_xieFloDomainErr 32 +#define sz_xieFloOperatorErr 32 +#define sz_xieFloTechniqueErr 32 +#define sz_xieFloValueErr 32 +#define sz_xieFloImplementationErr 32 +#define sz_xieFloErr 32 + +#undef Drawable +#undef Colormap +#undef GContext + +#endif /* _XIEPROTO_H_ */ diff --git a/xie/xc/include/extensions/XIEprotost.h b/xie/xc/include/extensions/XIEprotost.h new file mode 100644 index 0000000..2298afe --- /dev/null +++ b/xie/xc/include/extensions/XIEprotost.h @@ -0,0 +1,1118 @@ +/* $XConsortium: XIEprotost.h,v 1.6 94/04/17 20:11:12 mor Exp $ */ +/****************************************************************************** + + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. + + +******************************************************************************/ + +#ifndef _XIEPROTOST_H_ +#define _XIEPROTOST_H_ + +#include /* defines things like CARD32 */ + +#define Drawable CARD32 +#define Colormap CARD32 +#define GContext CARD32 + +typedef CARD32 xieTypFloat; + +#ifndef WORD64 + +typedef xieTypFloat xieTypConstant[3]; + +typedef xieTypFloat xieTypMatrix[9]; + +#else /* WORD64 */ + +typedef CARD8 xieTypConstant[12]; + +typedef CARD8 xieTypMatrix[36]; + +#endif /* WORD64 */ + + +typedef CARD8 xieTypAlignment; + +typedef CARD8 xieTypArithmeticOp; + +typedef CARD16 xieTypColorAllocTechnique; + +typedef CARD32 xieTypColorList; + +typedef CARD8 xieTypCompareOp; + +typedef CARD16 xieTypConstrainTechnique; + +typedef CARD16 xieTypConvertFromRGBTechnique; + +typedef CARD16 xieTypConvertToRGBTechnique; + +typedef CARD16 xieTypConvolveTechnique; + +typedef CARD8 xieTypDataClass; + +typedef CARD8 xieTypDataType; + +typedef CARD16 xieTypDecodeTechnique; + +typedef CARD16 xieTypDitherTechnique; + +typedef CARD16 xieTypEncodeTechnique; + +typedef CARD32 xieTypPhotospace; + +typedef CARD32 xieTypPhotoflo; + +typedef struct { + union { + struct { + xieTypPhotospace nameSpace B32; + CARD32 floID B32; + } immed; + struct { + CARD32 nameSpace B32; + xieTypPhotoflo floID B32; + } stored; + } u; +} xieTypExecutable; + +typedef CARD8 xieTypExportNotify; + +typedef CARD8 xieTypExportState; + +typedef CARD16 xieTypGamutTechnique; + +typedef CARD16 xieTypGeometryTechnique; + +typedef struct { + CARD32 value B32; + CARD32 count B32; +} xieTypHistogramData; + +typedef CARD16 xieTypHistogramShape; + +typedef CARD8 xieTypInterleave; + +typedef CARD32 xieTypLevels[3]; + +typedef CARD32 xieTypLUT; + +typedef CARD8 xieTypMathOp; + +typedef CARD8 xieTypOrientation; + +typedef CARD8 xieTypPhotofloOutcome; + +typedef CARD8 xieTypPhotofloState; + +typedef CARD32 xieTypPhotomap; + +typedef CARD16 xieTypPhototag; + +typedef struct { + INT32 offsetX B32; + INT32 offsetY B32; + xieTypPhototag domain B16; +} xieTypProcessDomain; + +typedef struct { + INT32 x B32; + INT32 y B32; + CARD32 width B32; + CARD32 height B32; +} xieTypRectangle; + +typedef CARD32 xieTypROI; + +typedef CARD8 xieTypServiceClass; + +typedef CARD8 xieTypTechniqueGroup; + +typedef struct { + BOOL needsParam; + xieTypTechniqueGroup group; + CARD16 number B16; + CARD8 speed; + CARD8 nameLength; + CARD16 pad B16; + /* LISTofCARD8 (nameLength) */ + /* pad (nameLength) */ +} xieTypTechniqueRec; + +typedef struct { + xieTypPhototag src B16; + CARD16 pad B16; + INT32 dstX B32; + INT32 dstY B32; +} xieTypTile; + +typedef CARD8 xieTypTripleofCARD8[3]; + +typedef CARD16 xieTypTripleofCARD16[3]; + +typedef CARD32 xieTypTripleofCARD32[3]; + +typedef CARD16 xieTypWhiteAdjustTechnique; + + +/* + * Generic Element + */ + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; +} xieFlo; + +/* + * Import Elements + */ +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypDataClass class; + xieTypOrientation bandOrder; + CARD16 pad B16; + CARD32 length0 B32; + CARD32 length1 B32; + CARD32 length2 B32; + CARD32 levels0 B32; + CARD32 levels1 B32; + CARD32 levels2 B32; +} xieFloImportClientLUT; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + BOOL notify; + xieTypDataClass class; + CARD16 pad B16; + CARD32 width0 B32; + CARD32 width1 B32; + CARD32 width2 B32; + CARD32 height0 B32; + CARD32 height1 B32; + CARD32 height2 B32; + CARD32 levels0 B32; + CARD32 levels1 B32; + CARD32 levels2 B32; + xieTypDecodeTechnique decodeTechnique B16; + CARD16 lenParams B16; + /* Technique dependent decode params */ +} xieFloImportClientPhoto; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + CARD32 rectangles B32; +} xieFloImportClientROI; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + Drawable drawable B32; + INT16 srcX B16; + INT16 srcY B16; + CARD16 width B16; + CARD16 height B16; + CARD32 fill B32; + BOOL notify; + CARD8 pad[3]; +} xieFloImportDrawable; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + Drawable drawable B32; + INT16 srcX B16; + INT16 srcY B16; + CARD16 width B16; + CARD16 height B16; + CARD32 fill B32; + CARD32 bitPlane B32; + BOOL notify; + CARD8 pad[3]; +} xieFloImportDrawablePlane; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypLUT lut B32; +} xieFloImportLUT; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhotomap photomap B32; + BOOL notify; + CARD8 pad[3]; +} xieFloImportPhotomap; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypROI roi B32; +} xieFloImportROI; + + +/* + * Process Elements + */ +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src1 B16; + xieTypPhototag src2 B16; + INT32 domainOffsetX B32; + INT32 domainOffsetY B32; + xieTypPhototag domainPhototag B16; + xieTypArithmeticOp operator; + CARD8 bandMask; + xieTypFloat constant0 B32; + xieTypFloat constant1 B32; + xieTypFloat constant2 B32; +} xieFloArithmetic; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src1 B16; + xieTypPhototag src2 B16; + xieTypPhototag src3 B16; + CARD16 pad B16; +} xieFloBandCombine; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD16 pad B16; + CARD32 levels B32; + xieTypFloat bias B32; + xieTypFloat constant0 B32; + xieTypFloat constant1 B32; + xieTypFloat constant2 B32; +} xieFloBandExtract; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD8 bandNumber; + CARD8 pad; +} xieFloBandSelect; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src1 B16; + xieTypPhototag src2 B16; + xieTypPhototag alpha B16; + CARD16 pad1 B16; + INT32 domainOffsetX B32; + INT32 domainOffsetY B32; + xieTypPhototag domainPhototag B16; + CARD8 bandMask; + CARD8 pad2; + xieTypFloat constant0 B32; + xieTypFloat constant1 B32; + xieTypFloat constant2 B32; + xieTypFloat alphaConst B32; +} xieFloBlend; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src1 B16; + xieTypPhototag src2 B16; + INT32 domainOffsetX B32; + INT32 domainOffsetY B32; + xieTypPhototag domainPhototag B16; + xieTypCompareOp operator; + BOOL combine; + xieTypFloat constant0 B32; + xieTypFloat constant1 B32; + xieTypFloat constant2 B32; + CARD8 bandMask; + CARD8 pad[3]; +} xieFloCompare; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD16 pad B16; + CARD32 levels0 B32; + CARD32 levels1 B32; + CARD32 levels2 B32; + xieTypConstrainTechnique constrain B16; + CARD16 lenParams B16; + /* Technique dependent constrain params */ +} xieFloConstrain; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + xieTypDataClass class; + CARD8 precision; + Colormap colormap B32; +} xieFloConvertFromIndex; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD16 pad B16; + xieTypConvertFromRGBTechnique convert B16; + CARD16 lenParams B16; + /* Technique dependent conversion params */ +} xieFloConvertFromRGB; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + BOOL notify; + CARD8 pad; + Colormap colormap B32; + xieTypColorList colorList B32; + xieTypColorAllocTechnique colorAlloc B16; + CARD16 lenParams B16; + /* Technique dependent color alloc params */ +} xieFloConvertToIndex; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD16 pad B16; + xieTypConvertToRGBTechnique convert B16; + CARD16 lenParams B16; + /* Technique dependent conversion params */ +} xieFloConvertToRGB; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD16 pad B16; + INT32 domainOffsetX B32; + INT32 domainOffsetY B32; + xieTypPhototag domainPhototag B16; + CARD8 bandMask; + CARD8 kernelSize; + xieTypConvolveTechnique convolve B16; + CARD16 lenParams B16; + /* LISTofFloat (kernelSize^2) */ + /* Technique dependent convolve params */ +} xieFloConvolve; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD8 bandMask; + CARD8 pad; + CARD32 levels0 B32; + CARD32 levels1 B32; + CARD32 levels2 B32; + xieTypDitherTechnique dither B16; + CARD16 lenParams B16; + /* Technique dependent dither params */ +} xieFloDither; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD8 bandMask; + CARD8 pad; + CARD32 width B32; + CARD32 height B32; + xieTypFloat a B32; + xieTypFloat b B32; + xieTypFloat c B32; + xieTypFloat d B32; + xieTypFloat tx B32; + xieTypFloat ty B32; + xieTypFloat constant0 B32; + xieTypFloat constant1 B32; + xieTypFloat constant2 B32; + xieTypGeometryTechnique sample B16; + CARD16 lenParams B16; + /* Technique dependent sample params */ +} xieFloGeometry; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src1 B16; + xieTypPhototag src2 B16; + INT32 domainOffsetX B32; + INT32 domainOffsetY B32; + xieTypPhototag domainPhototag B16; + CARD8 operator; + CARD8 bandMask; + xieTypFloat constant0 B32; + xieTypFloat constant1 B32; + xieTypFloat constant2 B32; +} xieFloLogical; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD16 pad1 B16; + INT32 domainOffsetX B32; + INT32 domainOffsetY B32; + xieTypPhototag domainPhototag B16; + CARD16 pad2 B16; + xieTypHistogramShape shape B16; + CARD16 lenParams B16; + /* Technique dependent shape params */ +} xieFloMatchHistogram; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD16 pad B16; + INT32 domainOffsetX B32; + INT32 domainOffsetY B32; + xieTypPhototag domainPhototag B16; + xieTypMathOp operator; + CARD8 bandMask; +} xieFloMath; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + CARD16 numTiles B16; + CARD16 pad B16; + CARD32 width B32; + CARD32 height B32; + xieTypFloat constant0 B32; + xieTypFloat constant1 B32; + xieTypFloat constant2 B32; + /* LISTofTile (numTiles) */ +} xieFloPasteUp; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + xieTypPhototag lut B16; + INT32 domainOffsetX B32; + INT32 domainOffsetY B32; + xieTypPhototag domainPhototag B16; + CARD8 bandMask; + CARD8 pad; +} xieFloPoint; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD16 pad B16; +} xieFloUnconstrain; + + +/* + * Export Elements + */ +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + xieTypExportNotify notify; + CARD8 pad1; + INT32 domainOffsetX B32; + INT32 domainOffsetY B32; + xieTypPhototag domainPhototag B16; + CARD16 pad2 B16; +} xieFloExportClientHistogram; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + xieTypExportNotify notify; + xieTypOrientation bandOrder; + CARD32 start0 B32; + CARD32 start1 B32; + CARD32 start2 B32; + CARD32 length0 B32; + CARD32 length1 B32; + CARD32 length2 B32; +} xieFloExportClientLUT; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + xieTypExportNotify notify; + CARD8 pad; + xieTypEncodeTechnique encodeTechnique B16; + CARD16 lenParams B16; + /* Technique dependent encode params */ +} xieFloExportClientPhoto; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + xieTypExportNotify notify; + CARD8 pad; +} xieFloExportClientROI; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + INT16 dstX B16; + INT16 dstY B16; + CARD16 pad B16; + Drawable drawable B32; + GContext gc B32; +} xieFloExportDrawable; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + INT16 dstX B16; + INT16 dstY B16; + CARD16 pad B16; + Drawable drawable B32; + GContext gc B32; +} xieFloExportDrawablePlane; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD8 merge; + CARD8 pad; + xieTypLUT lut B32; + CARD32 start0 B32; + CARD32 start1 B32; + CARD32 start2 B32; +} xieFloExportLUT; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD16 pad B16; + xieTypPhotomap photomap B32; + xieTypEncodeTechnique encodeTechnique B16; + CARD16 lenParams B16; + /* Technique dependent encode params */ +} xieFloExportPhotomap; + +typedef struct { + CARD16 elemType B16; + CARD16 elemLength B16; + xieTypPhototag src B16; + CARD16 pad B16; + xieTypROI roi B32; +} xieFloExportROI; + + +/* + * Technique Parameters + */ + +typedef struct { + xieTypFloat inputLow0 B32; + xieTypFloat inputLow1 B32; + xieTypFloat inputLow2 B32; + xieTypFloat inputHigh0 B32; + xieTypFloat inputHigh1 B32; + xieTypFloat inputHigh2 B32; + CARD32 outputLow0 B32; + CARD32 outputLow1 B32; + CARD32 outputLow2 B32; + CARD32 outputHigh0 B32; + CARD32 outputHigh1 B32; + CARD32 outputHigh2 B32; +} xieTecClipScale; + +typedef struct { + CARD32 fill B32; +} xieTecColorAllocAll; + +typedef struct { + xieTypFloat matchLimit B32; + xieTypFloat grayLimit B32; +} xieTecColorAllocMatch; + +typedef struct { + CARD32 maxCells B32; +} xieTecColorAllocRequantize; + +typedef struct { + xieTypFloat matrix00 B32; + xieTypFloat matrix01 B32; + xieTypFloat matrix02 B32; + xieTypFloat matrix10 B32; + xieTypFloat matrix11 B32; + xieTypFloat matrix12 B32; + xieTypFloat matrix20 B32; + xieTypFloat matrix21 B32; + xieTypFloat matrix22 B32; + xieTypWhiteAdjustTechnique whiteAdjusted B16; + CARD16 lenParams B16; + /* Technique dependent white params */ +} xieTecRGBToCIELab, xieTecRGBToCIEXYZ; + +typedef struct { + CARD32 levels0 B32; + CARD32 levels1 B32; + CARD32 levels2 B32; + xieTypFloat lumaRed B32; + xieTypFloat lumaGreen B32; + xieTypFloat lumaBlue B32; + xieTypFloat bias0 B32; + xieTypFloat bias1 B32; + xieTypFloat bias2 B32; +} xieTecRGBToYCbCr; + +typedef struct { + CARD32 levels0 B32; + CARD32 levels1 B32; + CARD32 levels2 B32; + xieTypFloat lumaRed B32; + xieTypFloat lumaGreen B32; + xieTypFloat lumaBlue B32; + xieTypFloat scale B32; +} xieTecRGBToYCC; + +typedef struct { + xieTypFloat matrix00 B32; + xieTypFloat matrix01 B32; + xieTypFloat matrix02 B32; + xieTypFloat matrix10 B32; + xieTypFloat matrix11 B32; + xieTypFloat matrix12 B32; + xieTypFloat matrix20 B32; + xieTypFloat matrix21 B32; + xieTypFloat matrix22 B32; + xieTypWhiteAdjustTechnique whiteAdjusted B16; + CARD16 lenWhiteParams B16; + xieTypGamutTechnique gamutCompress B16; + CARD16 lenGamutParams B16; + /* Technique dependent white params */ + /* Technique dependent gamut params */ +} xieTecCIELabToRGB, xieTecCIEXYZToRGB; + +typedef struct { + CARD32 levels0 B32; + CARD32 levels1 B32; + CARD32 levels2 B32; + xieTypFloat lumaRed B32; + xieTypFloat lumaGreen B32; + xieTypFloat lumaBlue B32; + xieTypFloat bias0 B32; + xieTypFloat bias1 B32; + xieTypFloat bias2 B32; + xieTypGamutTechnique gamutCompress B16; + CARD16 lenGamutParams B16; + /* Technique dependent gamut params */ +} xieTecYCbCrToRGB; + +typedef struct { + CARD32 levels0 B32; + CARD32 levels1 B32; + CARD32 levels2 B32; + xieTypFloat lumaRed B32; + xieTypFloat lumaGreen B32; + xieTypFloat lumaBlue B32; + xieTypFloat scale B32; + xieTypGamutTechnique gamutCompress B16; + CARD16 lenGamutParams B16; + /* Technique dependent gamut params */ +} xieTecYCCToRGB; + +typedef struct { + xieTypFloat constant0 B32; + xieTypFloat constant1 B32; + xieTypFloat constant2 B32; +} xieTecConvolveConstant; + +typedef struct { + xieTypOrientation fillOrder; + xieTypOrientation pixelOrder; + CARD8 pixelStride; + CARD8 leftPad; + CARD8 scanlinePad; + CARD8 pad[3]; +} xieTecDecodeUncompressedSingle; + +typedef struct { + CARD8 leftPad[3]; + xieTypOrientation fillOrder; + CARD8 pixelStride[3]; + xieTypOrientation pixelOrder; + CARD8 scanlinePad[3]; + xieTypOrientation bandOrder; + xieTypInterleave interleave; + CARD8 pad[3]; +} xieTecDecodeUncompressedTriple; + +typedef struct { + xieTypOrientation encodedOrder; + BOOL normal; + BOOL radiometric; + CARD8 pad; +} xieTecDecodeG31D, xieTecDecodeG32D, xieTecDecodeG42D, + xieTecDecodeTIFF2; + +typedef struct { + xieTypOrientation encodedOrder; + BOOL normal; + CARD16 pad B16; +} xieTecDecodeTIFFPackBits; + +typedef struct { + xieTypInterleave interleave; + xieTypOrientation bandOrder; + BOOL upSample; + CARD8 pad; +} xieTecDecodeJPEGBaseline; + +typedef struct { + xieTypInterleave interleave; + xieTypOrientation bandOrder; + CARD16 pad B16; +} xieTecDecodeJPEGLossless; + +typedef struct { + CARD8 thresholdOrder; + CARD8 pad[3]; +} xieTecDitherOrdered; + +typedef struct { + CARD8 preference; + CARD8 pad[3]; +} xieTecEncodeServerChoice; + +typedef struct { + xieTypOrientation fillOrder; + xieTypOrientation pixelOrder; + CARD8 pixelStride; + CARD8 scanlinePad; +} xieTecEncodeUncompressedSingle; + +typedef struct { + CARD8 pixelStride[3]; + xieTypOrientation pixelOrder; + CARD8 scanlinePad[3]; + xieTypOrientation fillOrder; + xieTypOrientation bandOrder; + xieTypInterleave interleave; + CARD16 pad B16; +} xieTecEncodeUncompressedTriple; + +typedef struct { + xieTypOrientation encodedOrder; + BOOL alignEol; + BOOL radiometric; + CARD8 pad; +} xieTecEncodeG31D; + +typedef struct { + xieTypOrientation encodedOrder; + BOOL alignEol; + BOOL radiometric; + BOOL uncompressed; + CARD32 kFactor B32; +} xieTecEncodeG32D; + +typedef struct { + xieTypOrientation encodedOrder; + BOOL radiometric; + BOOL uncompressed; + CARD8 pad; +} xieTecEncodeG42D; + +typedef struct { + xieTypInterleave interleave; + xieTypOrientation bandOrder; + CARD8 horizontalSamples[3]; + CARD8 verticalSamples[3]; + CARD16 lenQtable B16; /* multiple of 4 */ + CARD16 lenACtable B16; /* multiple of 4 */ + CARD16 lenDCtable B16; /* multiple of 4 */ + CARD16 pad B16; + /* LISTofCARD8 (Qtable) */ + /* LISTofCARD8 (ACtable) */ + /* LISTofCARD8 (DCtable) */ +} xieTecEncodeJPEGBaseline; + +typedef struct { + xieTypInterleave interleave; + xieTypOrientation bandOrder; + CARD16 lenTable B16; /* multiple of 4 */ + CARD8 predictor[3]; + CARD8 pad; + /* LISTofCARD8 (table) */ +} xieTecEncodeJPEGLossless; + +typedef struct { + xieTypOrientation encodedOrder; + BOOL radiometric; + CARD16 pad B16; +} xieTecEncodeTIFF2; + +typedef struct { + xieTypOrientation encodedOrder; + CARD8 pad[3]; +} xieTecEncodeTIFFPackBits; + +typedef struct { + INT16 simple B16; + CARD16 pad B16; +} xieTecGeomAntialiasByArea; + +typedef struct { + INT16 kernelSize B16; + CARD16 pad B16; +} xieTecGeomAntialiasByLowpass; + +typedef struct { + CARD8 radius; + BOOL simple; + CARD16 pad B16; + xieTypFloat sigma B32; + xieTypFloat normalize B32; +} xieTecGeomGaussian; + +typedef struct { + CARD8 modify; + CARD8 pad[3]; +} xieTecGeomNearestNeighbor; + +typedef struct { + xieTypFloat mean B32; + xieTypFloat sigma B32; +} xieTecHistogramGaussian; + +typedef struct { + BOOL shapeFactor; + CARD8 pad[3]; + xieTypFloat constant B32; +} xieTecHistogramHyperbolic; + +typedef struct { + xieTypFloat whitePoint0 B32; + xieTypFloat whitePoint1 B32; + xieTypFloat whitePoint2 B32; +} xieTecWhiteAdjustCIELabShift; + + +/* + * SIZEOF values + */ +#define sz_xieTypAlignment 1 +#define sz_xieTypArithmeticOp 1 +#define sz_xieTypColorAllocTechnique 2 +#define sz_xieTypColorList 4 +#define sz_xieTypCompareOp 1 +#define sz_xieTypConstant 12 +#define sz_xieTypConstrainTechnique 2 +#define sz_xieTypConvertFromRGBTechnique 2 +#define sz_xieTypConvertToRGBTechnique 2 +#define sz_xieTypConvolveTechnique 2 +#define sz_xieTypDataClass 1 +#define sz_xieTypDataType 1 +#define sz_xieTypDecodeTechnique 2 +#define sz_xieTypDitherTechnique 2 +#define sz_xieTypEncodeTechnique 2 +#define sz_xieTypPhotospace 4 +#define sz_xieTypPhotoflo 4 +#define sz_xieTypExecutable 8 +#define sz_xieTypExportNotify 1 +#define sz_xieTypExportState 1 +#define sz_xieTypFloat 4 +#define sz_xieTypGamutTechnique 2 +#define sz_xieTypGeometryTechnique 2 +#define sz_xieTypHistogramData 8 +#define sz_xieTypHistogramShape 2 +#define sz_xieTypInterleave 1 +#define sz_xieTypLevels 12 +#define sz_xieTypLUT 4 +#define sz_xieTypMathOp 1 +#define sz_xieTypMatrix 36 +#define sz_xieTypOrientation 1 +#define sz_xieTypPhotofloOutcome 1 +#define sz_xieTypPhotofloState 1 +#define sz_xieTypPhotomap 4 +#define sz_xieTypPhototag 2 +#define sz_xieTypProcessDomain 12 +#define sz_xieTypRectangle 16 +#define sz_xieTypROI 4 +#define sz_xieTypServiceClass 1 +#define sz_xieTypTechniqueGroup 1 +#define sz_xieTypTechniqueRec 8 +#define sz_xieTypTile 12 +#define sz_xieTypTripleofCARD8 3 +#define sz_xieTypTripleofCARD16 6 +#define sz_xieTypTripleofCARD32 12 +#define sz_xieTypWhiteAdjustTechnique 2 +#define sz_xieFloImportClientLUT 32 +#define sz_xieFloImportClientPhoto 48 +#define sz_xieFloImportClientROI 8 +#define sz_xieFloImportDrawable 24 +#define sz_xieFloImportDrawablePlane 28 +#define sz_xieFloImportLUT 8 +#define sz_xieFloImportPhotomap 12 +#define sz_xieFloImportROI 8 +#define sz_xieFloArithmetic 32 +#define sz_xieFloBandCombine 12 +#define sz_xieFloBandExtract 28 +#define sz_xieFloBandSelect 8 +#define sz_xieFloBlend 40 +#define sz_xieFloCompare 36 +#define sz_xieFloConstrain 24 +#define sz_xieFloConvertFromIndex 12 +#define sz_xieFloConvertFromRGB 12 +#define sz_xieFloConvertToIndex 20 +#define sz_xieFloConvertToRGB 12 +#define sz_xieFloConvolve 24 +#define sz_xieFloDither 24 +#define sz_xieFloGeometry 56 +#define sz_xieFloLogical 32 +#define sz_xieFloMatchHistogram 24 +#define sz_xieFloMath 20 +#define sz_xieFloPasteUp 28 +#define sz_xieFloPoint 20 +#define sz_xieFloUnconstrain 8 +#define sz_xieFloExportClientHistogram 20 +#define sz_xieFloExportClientLUT 32 +#define sz_xieFloExportClientPhoto 12 +#define sz_xieFloExportClientROI 8 +#define sz_xieFloExportDrawable 20 +#define sz_xieFloExportDrawablePlane 20 +#define sz_xieFloExportLUT 24 +#define sz_xieFloExportPhotomap 16 +#define sz_xieFloExportROI 12 +#define sz_xieTecColorAllocAll 4 +#define sz_xieTecColorAllocMatch 8 +#define sz_xieTecColorAllocRequantize 4 +#define sz_xieTecClipScale 48 +#define sz_xieTecHardClip 0 +#define sz_xieTecRGBToCIELab 40 +#define sz_xieTecRGBToCIEXYZ 40 +#define sz_xieTecRGBToYCbCr 36 +#define sz_xieTecRGBToYCC 28 +#define sz_xieTecYCbCrToRGB 40 +#define sz_xieTecYCCToRGB 32 +#define sz_xieTecCIELabToRGB 44 +#define sz_xieTecCIEXYZToRGB 44 +#define sz_xieTecConvolveConstant 12 +#define sz_xieTecConvolveReplicate 0 +#define sz_xieTecDecodeUncompressedSingle 8 +#define sz_xieTecDecodeUncompressedTriple 16 +#define sz_xieTecDecodeG31D 4 +#define sz_xieTecDecodeG32D 4 +#define sz_xieTecDecodeG42D 4 +#define sz_xieTecDecodeTIFF2 4 +#define sz_xieTecDecodeTIFFPackBits 4 +#define sz_xieTecDecodeJPEGBaseline 4 +#define sz_xieTecDecodeJPEGLossless 4 +#define sz_xieTecDitherOrdered 4 +#define sz_xieTecDitherErrorDiffusion 4 +#define sz_xieTecEncodeServerChoice 4 +#define sz_xieTecEncodeUncompressedSingle 4 +#define sz_xieTecEncodeUncompressedTriple 12 +#define sz_xieTecEncodeG31D 4 +#define sz_xieTecEncodeG32D 8 +#define sz_xieTecEncodeG42D 4 +#define sz_xieTecEncodeJPEGBaseline 16 +#define sz_xieTecEncodeJPEGLossless 8 +#define sz_xieTecEncodeTIFF2 4 +#define sz_xieTecEncodeTIFFPackBits 4 +#define sz_xieTecGamutNone 0 +#define sz_xieTecGamutClipRGB 0 +#define sz_xieTecGeomAntialias 0 +#define sz_xieTecGeomAntialiasByArea 4 +#define sz_xieTecGeomAntialiasByLowpass 4 +#define sz_xieTecGeomBilinearInterpolation 0 +#define sz_xieTecGeomGaussian 12 +#define sz_xieTecGeomNearestNeighbor 4 +#define sz_xieTecHistogramFlat 0 +#define sz_xieTecHistogramGaussian 8 +#define sz_xieTecHistogramHyperbolic 8 +#define sz_xieTecWhiteAdjustNone 0 +#define sz_xieTecWhiteAdjustCIELabShift 12 + +#undef Drawable +#undef Colormap +#undef GContext + +#endif /* _XIEPROTOST_H_ */ diff --git a/xie/xc/lib/XIE/Imakefile b/xie/xc/lib/XIE/Imakefile new file mode 100644 index 0000000..d919f09 --- /dev/null +++ b/xie/xc/lib/XIE/Imakefile @@ -0,0 +1,71 @@ +XCOMM $XConsortium: Imakefile,v 1.6 94/03/27 15:53:33 rws Exp $ + +#define DoNormalLib NormalLibXie +#define DoSharedLib SharedLibXie +#define DoDebugLib DebugLibXie +#define DoProfileLib ProfileLibXie +#define LibName XIE +#define SoRev SOXIEREV +#define IncSubdir extensions + +#include + +#ifdef SharedXieReqs +REQUIREDLIBS = SharedXieReqs +#endif + +#if Malloc0ReturnsNull +ALLOC_DEFINES = -DMALLOC_0_RETURNS_NULL +#endif + +DEFINES = $(ALLOC_DEFINES) + +HEADERS = XIElib.h + +SRCS = abort.c \ + await.c \ + clientdata.c \ + colorlist.c \ + conven.c \ + elements.c \ + free.c \ + errors.c \ + events.c \ + ieee.c \ + init.c \ + lut.c \ + photoflo.c \ + photomap.c \ + photospace.c \ + roi.c \ + technique.c \ + utils.c + +OBJS = abort.o \ + await.o \ + clientdata.o \ + colorlist.o \ + conven.o \ + elements.o \ + errors.o \ + events.o \ + free.o \ + ieee.o \ + init.o \ + lut.o \ + photoflo.o \ + photomap.o \ + photospace.o \ + roi.o \ + technique.o \ + utils.o + +#include + +#ifdef NativeFPFormat +NATIVE_FP_FORMAT = NativeFPFormat +FP_DEFINES = -DNATIVE_FP_FORMAT=$(NATIVE_FP_FORMAT) +SpecialCLibObjectRule(ieee,$(ICONFIGFILES),$(FP_DEFINES)) +#endif + +DependTarget() diff --git a/xie/xc/lib/XIE/XIE-def.cpp b/xie/xc/lib/XIE/XIE-def.cpp new file mode 100644 index 0000000..010c417 --- /dev/null +++ b/xie/xc/lib/XIE/XIE-def.cpp @@ -0,0 +1,112 @@ +LIBRARY XIE +VERSION LIBRARY_VERSION +EXPORTS + XieAbort + XieAllocatePhotofloGraph + XieAwait + XieCreateColorList + XieCreateLUT + XieCreatePhotoflo + XieCreatePhotomap + XieCreatePhotospace + XieCreateROI + XieDestroyColorList + XieDestroyLUT + XieDestroyPhotoflo + XieDestroyPhotomap + XieDestroyPhotospace + XieDestroyROI + XieExecuteImmediate + XieExecutePhotoflo + XieFloArithmetic + XieFloBandCombine + XieFloBandExtract + XieFloBandSelect + XieFloBlend + XieFloCompare + XieFloConstrain + XieFloConvertFromIndex + XieFloConvertFromRGB + XieFloConvertToIndex + XieFloConvertToRGB + XieFloConvolve + XieFloDither + XieFloExportClientHistogram + XieFloExportClientLUT + XieFloExportClientPhoto + XieFloExportClientROI + XieFloExportDrawable + XieFloExportDrawablePlane + XieFloExportLUT + XieFloExportPhotomap + XieFloExportROI + XieFloGeometry + XieFloImportClientLUT + XieFloImportClientPhoto + XieFloImportClientROI + XieFloImportDrawable + XieFloImportDrawablePlane + XieFloImportLUT + XieFloImportPhotomap + XieFloImportROI + XieFloLogical + XieFloMatchHistogram + XieFloMath + XieFloPasteUp + XieFloPoint + XieFloUnconstrain + XieFreeEncodeJPEGBaseline + XieFreeEncodeJPEGLossless + XieFreePasteUpTiles + XieFreePhotofloGraph + XieFreeTechniques + XieGetClientData + XieInitialize + XieModifyPhotoflo + XiePurgeColorList + XiePutClientData + XieQueryColorList + XieQueryPhotoflo + XieQueryPhotomap + XieQueryTechniques + XieRedefinePhotoflo + XieTecCIELabToRGB + XieTecCIEXYZToRGB + XieTecClipScale + XieTecColorAllocAll + XieTecColorAllocMatch + XieTecColorAllocRequantize + XieTecConvolveConstant + XieTecDecodeG31D + XieTecDecodeG32D + XieTecDecodeG42D + XieTecDecodeJPEGBaseline + XieTecDecodeJPEGLossless + XieTecDecodeTIFF2 + XieTecDecodeTIFFPackBits + XieTecDecodeUncompressedSingle + XieTecDecodeUncompressedTriple + XieTecDitherOrderedParam + XieTecEncodeG31D + XieTecEncodeG32D + XieTecEncodeG42D + XieTecEncodeJPEGBaseline + XieTecEncodeJPEGLossless + XieTecEncodeServerChoice + XieTecEncodeTIFF2 + XieTecEncodeTIFFPackBits + XieTecEncodeUncompressedSingle + XieTecEncodeUncompressedTriple + XieTecGeomAntialiasByArea + XieTecGeomAntialiasByLowpass + XieTecGeomGaussian + XieTecGeomNearestNeighbor + XieTecHistogramGaussian + XieTecHistogramHyperbolic + XieTecRGBToCIELab + XieTecRGBToCIEXYZ + XieTecRGBToYCC + XieTecRGBToYCbCr + XieTecWhiteAdjustCIELabShift + XieTecYCCToRGB + XieTecYCbCrToRGB diff --git a/xie/xc/lib/XIE/XIElib.h b/xie/xc/lib/XIE/XIElib.h new file mode 100644 index 0000000..fff688b --- /dev/null +++ b/xie/xc/lib/XIE/XIElib.h @@ -0,0 +1,1916 @@ +/* $XConsortium: XIElib.h,v 1.12 95/04/28 18:01:11 mor Exp $ */ + +/* + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#ifndef _XIELIB_H_ +#define _XIELIB_H_ + +#include +#include + +/*--------------------------------------------------------------------------* + * XIE types * + *--------------------------------------------------------------------------*/ + +typedef float XieFloat; + +typedef float XieConstant[3]; + +typedef float XieMatrix[9]; + +typedef unsigned XieAlignment; + +typedef unsigned XieArithmeticOp; + +typedef unsigned XieColorAllocTechnique; + +typedef XID XieColorList; + +typedef unsigned XieColorspace; + +typedef unsigned XieCompareOp; + +typedef unsigned XieConstrainTechnique; + +typedef unsigned XieConvolveTechnique; + +typedef unsigned XieDataClass; + +typedef unsigned XieDataType; + +typedef unsigned XieDecodeTechnique; + +typedef unsigned XieDitherTechnique; + +typedef unsigned XieEncodeTechnique; + +typedef XID XiePhotospace; + +typedef XID XiePhotoflo; + +typedef unsigned XieExportNotify; + +typedef unsigned XieExportState; + +typedef unsigned XieGamutTechnique; + +typedef unsigned XieGeometryTechnique; + +typedef struct { + unsigned long value; + unsigned long count; +} XieHistogramData; + +typedef unsigned XieHistogramShape; + +typedef unsigned XieInterleave; + +typedef unsigned long XieLevels[3]; + +typedef XID XieLut; + +typedef unsigned XieMathOp; + +typedef unsigned XieOrientation; + +typedef unsigned XiePhotofloOutcome; + +typedef unsigned XiePhotofloState; + +typedef XID XiePhotomap; + +typedef unsigned XiePhototag; + +typedef struct { + int offset_x; + int offset_y; + XiePhototag phototag; +} XieProcessDomain; + +typedef struct { /* this is bcopyable on 32 bit machines */ + long x; /* when using PutClientData */ + long y; + unsigned long width; + unsigned long height; +} XieRectangle; + +typedef XID XieRoi; + +typedef unsigned XieServiceClass; + +typedef unsigned XieTechniqueGroup; + +typedef struct { + Bool needs_param; + XieTechniqueGroup group; + unsigned int number; + unsigned int speed; + char *name; +} XieTechnique; + +typedef struct { + XiePhototag src; + int dst_x; + int dst_y; +} XieTile; + +typedef unsigned long XieLTriplet[3]; + +typedef unsigned XieWhiteAdjustTechnique; + +#if NeedFunctionPrototypes +typedef void *XiePointer; +#else +typedef char *XiePointer; +#endif + + +/*--------------------------------------------------------------------------* + * Extension information * + *--------------------------------------------------------------------------*/ + +typedef struct { + unsigned server_major_rev; + unsigned server_minor_rev; + XieServiceClass service_class; + XieAlignment alignment; + int uncnst_mantissa; + int uncnst_min_exp; + int uncnst_max_exp; + int n_cnst_levels; /* number of constrained levels */ + unsigned long *cnst_levels; /* recommended constrained levels */ + int major_opcode; + int first_event; + int first_error; +} XieExtensionInfo; + + +/*--------------------------------------------------------------------------* + * Photoflo element union * + *--------------------------------------------------------------------------*/ + +typedef struct { + + int elemType; + + union { + + /* + * Import Elements + */ + + struct { + XieDataClass data_class; + XieOrientation band_order; + XieLTriplet length; + XieLevels levels; + } ImportClientLUT; + + struct { + XieDataClass data_class; + XieLTriplet width; + XieLTriplet height; + XieLevels levels; + Bool notify; + XieDecodeTechnique decode_tech; + XiePointer decode_param; + } ImportClientPhoto; + + struct { + unsigned int rectangles; + } ImportClientROI; + + struct { + Drawable drawable; + int src_x; + int src_y; + unsigned int width; + unsigned int height; + unsigned long fill; + Bool notify; + } ImportDrawable; + + struct { + Drawable drawable; + int src_x; + int src_y; + unsigned int width; + unsigned int height; + unsigned long fill; + unsigned long bit_plane; + Bool notify; + } ImportDrawablePlane; + + struct { + XieLut lut; + } ImportLUT; + + struct { + XiePhotomap photomap; + Bool notify; + } ImportPhotomap; + + struct { + XieRoi roi; + } ImportROI; + + + /* + * Process Elements + */ + + struct { + XiePhototag src1; + XiePhototag src2; + XieProcessDomain domain; + XieConstant constant; + XieArithmeticOp operator; + unsigned int band_mask; + } Arithmetic; + + struct { + XiePhototag src1; + XiePhototag src2; + XiePhototag src3; + } BandCombine; + + struct { + XiePhototag src; + unsigned int levels; + float bias; + XieConstant coefficients; + } BandExtract; + + struct { + XiePhototag src; + unsigned int band_number; + } BandSelect; + + struct { + XiePhototag src1; + XiePhototag src2; + XieConstant src_constant; + XiePhototag alpha; + float alpha_constant; + XieProcessDomain domain; + unsigned int band_mask; + } Blend; + + struct { + XiePhototag src1; + XiePhototag src2; + XieProcessDomain domain; + XieConstant constant; + XieCompareOp operator; + Bool combine; + unsigned int band_mask; + } Compare; + + struct { + XiePhototag src; + XieLevels levels; + XieConstrainTechnique constrain_tech; + XiePointer constrain_param; + } Constrain; + + struct { + XiePhototag src; + Colormap colormap; + XieDataClass data_class; + unsigned int precision; + } ConvertFromIndex; + + struct { + XiePhototag src; + XieColorspace color_space; + XiePointer color_param; + } ConvertFromRGB; + + struct { + XiePhototag src; + Colormap colormap; + XieColorList color_list; + Bool notify; + XieColorAllocTechnique color_alloc_tech; + XiePointer color_alloc_param; + } ConvertToIndex; + + struct { + XiePhototag src; + XieColorspace color_space; + XiePointer color_param; + } ConvertToRGB; + + struct { + XiePhototag src; + XieProcessDomain domain; + float *kernel; + int kernel_size; + unsigned int band_mask; + XieConvolveTechnique convolve_tech; + XiePointer convolve_param; + } Convolve; + + struct { + XiePhototag src; + XieLevels levels; + unsigned int band_mask; + XieDitherTechnique dither_tech; + XiePointer dither_param; + } Dither; + + struct { + XiePhototag src; + unsigned int width; + unsigned int height; + float coefficients[6]; + XieConstant constant; + unsigned int band_mask; + XieGeometryTechnique sample_tech; + XiePointer sample_param; + } Geometry; + + struct { + XiePhototag src1; + XiePhototag src2; + XieProcessDomain domain; + XieConstant constant; + int operator; + unsigned int band_mask; + } Logical; + + struct { + XiePhototag src; + XieProcessDomain domain; + XieHistogramShape shape; + XiePointer shape_param; + } MatchHistogram; + + struct { + XiePhototag src; + XieProcessDomain domain; + XieMathOp operator; + unsigned int band_mask; + } Math; + + struct { + unsigned int width; + unsigned int height; + XieConstant constant; + XieTile *tiles; + unsigned int tile_count; + } PasteUp; + + struct { + XiePhototag src; + XieProcessDomain domain; + XiePhototag lut; + unsigned int band_mask; + } Point; + + struct { + XiePhototag src; + } Unconstrain; + + /* + * Export Elements + */ + + struct { + XiePhototag src; + XieProcessDomain domain; + XieExportNotify notify; + } ExportClientHistogram; + + struct { + XiePhototag src; + XieOrientation band_order; + XieExportNotify notify; + XieLTriplet start; + XieLTriplet length; + } ExportClientLUT; + + struct { + XiePhototag src; + XieExportNotify notify; + XieEncodeTechnique encode_tech; + XiePointer encode_param; + } ExportClientPhoto; + + struct { + XiePhototag src; + XieExportNotify notify; + } ExportClientROI; + + struct { + XiePhototag src; + Drawable drawable; + GC gc; + int dst_x; + int dst_y; + } ExportDrawable; + + struct { + XiePhototag src; + Drawable drawable; + GC gc; + int dst_x; + int dst_y; + } ExportDrawablePlane; + + struct { + XiePhototag src; + XieLut lut; + Bool merge; + XieLTriplet start; + } ExportLUT; + + struct { + XiePhototag src; + XiePhotomap photomap; + XieEncodeTechnique encode_tech; + XiePointer encode_param; + } ExportPhotomap; + + struct { + XiePhototag src; + XieRoi roi; + } ExportROI; + + } data; +} XiePhotoElement; + +typedef XiePhotoElement *XiePhotofloGraph; + + +/*--------------------------------------------------------------------------* + * Technique Parameters * + *--------------------------------------------------------------------------*/ + +/* Color Alloc */ + +typedef struct { + unsigned long fill; +} XieColorAllocAllParam; + +typedef struct { + float match_limit; + float gray_limit; +} XieColorAllocMatchParam; + +typedef struct { + unsigned long max_cells; +} XieColorAllocRequantizeParam; + + +/* Colorspace - conversion from RGB */ + +typedef struct { + XieMatrix matrix; + XieWhiteAdjustTechnique white_adjust_tech; + XiePointer white_adjust_param; +} XieRGBToCIELabParam, XieRGBToCIEXYZParam; + +typedef struct { + XieLevels levels; + float luma_red; + float luma_green; + float luma_blue; + XieConstant bias; +} XieRGBToYCbCrParam; + +typedef struct { + XieLevels levels; + float luma_red; + float luma_green; + float luma_blue; + float scale; +} XieRGBToYCCParam; + + +/* Colorspace - conversion to RGB */ + +typedef struct { + XieMatrix matrix; + XieWhiteAdjustTechnique white_adjust_tech; + XiePointer white_adjust_param; + XieGamutTechnique gamut_tech; + XiePointer gamut_param; +} XieCIELabToRGBParam, XieCIEXYZToRGBParam; + +typedef struct { + XieLevels levels; + float luma_red; + float luma_green; + float luma_blue; + XieConstant bias; + XieGamutTechnique gamut_tech; + XiePointer gamut_param; +} XieYCbCrToRGBParam; + +typedef struct { + XieLevels levels; + float luma_red; + float luma_green; + float luma_blue; + float scale; + XieGamutTechnique gamut_tech; + XiePointer gamut_param; +} XieYCCToRGBParam; + +/* Constrain */ + +typedef struct { + XieConstant input_low,input_high; + XieLTriplet output_low,output_high; +} XieClipScaleParam; + + +/* Convolve */ + +typedef struct { + XieConstant constant; +} XieConvolveConstantParam; + + +/* Decode */ + +typedef struct { + XieOrientation fill_order; + XieOrientation pixel_order; + unsigned int pixel_stride; + unsigned int left_pad; + unsigned int scanline_pad; +} XieDecodeUncompressedSingleParam; + +typedef struct { + unsigned char left_pad[3]; + XieOrientation fill_order; + unsigned char pixel_stride[3]; + XieOrientation pixel_order; + unsigned char scanline_pad[3]; + XieOrientation band_order; + XieInterleave interleave; +} XieDecodeUncompressedTripleParam; + +typedef struct { + XieOrientation encoded_order; + Bool normal; + Bool radiometric; +} XieDecodeG31DParam, XieDecodeG32DParam, XieDecodeG42DParam, + XieDecodeTIFF2Param; + +typedef struct { + XieOrientation encoded_order; + Bool normal; +} XieDecodeTIFFPackBitsParam; + +typedef struct { + XieInterleave interleave; + XieOrientation band_order; + Bool up_sample; +} XieDecodeJPEGBaselineParam; + +typedef struct { + XieInterleave interleave; + XieOrientation band_order; +} XieDecodeJPEGLosslessParam; + + +/* Dither */ + +typedef struct { + unsigned int threshold_order; +} XieDitherOrderedParam; + + +/* Encode */ + +typedef struct { + XieOrientation fill_order; + XieOrientation pixel_order; + unsigned int pixel_stride; + unsigned int scanline_pad; +} XieEncodeUncompressedSingleParam; + +typedef struct { + unsigned char pixel_stride[3]; + XieOrientation pixel_order; + unsigned char scanline_pad[3]; + XieOrientation fill_order; + XieOrientation band_order; + XieInterleave interleave; +} XieEncodeUncompressedTripleParam; + +typedef struct { + Bool align_eol; + Bool radiometric; + XieOrientation encoded_order; +} XieEncodeG31DParam; + +typedef struct { + Bool uncompressed; + Bool align_eol; + Bool radiometric; + XieOrientation encoded_order; + unsigned long k_factor; +} XieEncodeG32DParam; + +typedef struct { + Bool uncompressed; + Bool radiometric; + XieOrientation encoded_order; +} XieEncodeG42DParam; + +typedef struct { + unsigned int preference; +} XieEncodeServerChoiceParam; + +typedef struct { + XieInterleave interleave; + XieOrientation band_order; + unsigned char horizontal_samples[3]; + unsigned char vertical_samples[3]; + char *q_table; + unsigned int q_size; + char *ac_table; + unsigned int ac_size; + char *dc_table; + unsigned int dc_size; +} XieEncodeJPEGBaselineParam; + +typedef struct { + XieInterleave interleave; + XieOrientation band_order; + unsigned char predictor[3]; + char *table; + unsigned int table_size; +} XieEncodeJPEGLosslessParam; + +typedef struct { + XieOrientation encoded_order; + Bool radiometric; +} XieEncodeTIFF2Param; + +typedef struct { + XieOrientation encoded_order; +} XieEncodeTIFFPackBitsParam; + + +/* Geometry */ + +typedef struct { + int simple; +} XieGeomAntialiasByAreaParam; + +typedef struct { + int kernel_size; +} XieGeomAntialiasByLowpassParam; + +typedef struct { + float sigma; + float normalize; + unsigned int radius; + Bool simple; +} XieGeomGaussianParam; + +typedef struct { + unsigned int modify; +} XieGeomNearestNeighborParam; + + +/* Histogram */ + +typedef struct { + float mean; + float sigma; +} XieHistogramGaussianParam; + +typedef struct { + float constant; + Bool shape_factor; +} XieHistogramHyperbolicParam; + + +/* White Adjust */ + +typedef struct { + XieConstant white_point; +} XieWhiteAdjustCIELabShiftParam; + + +/*--------------------------------------------------------------------------* + * Events * + *--------------------------------------------------------------------------*/ + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + unsigned long name_space; + Time time; + unsigned long flo_id; + XiePhototag src; + unsigned int elem_type; + XieColorList color_list; + XieColorAllocTechnique color_alloc_technique; + unsigned long color_alloc_data; +} XieColorAllocEvent; + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + unsigned long name_space; + Time time; + unsigned long flo_id; + XiePhototag src; + unsigned int elem_type; + XieDecodeTechnique decode_technique; + Bool aborted; + unsigned int band_number; + unsigned long width; + unsigned long height; +} XieDecodeNotifyEvent; + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + unsigned long name_space; + Time time; + unsigned long flo_id; + XiePhototag src; + unsigned int elem_type; + unsigned int band_number; + unsigned long data[3]; +} XieExportAvailableEvent; + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + unsigned long name_space; + Time time; + unsigned long flo_id; + XiePhototag src; + unsigned int elem_type; + Window window; + int x; + int y; + unsigned int width; + unsigned int height; +} XieImportObscuredEvent; + +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + unsigned long name_space; + Time time; + unsigned long flo_id; + XiePhotofloOutcome outcome; +} XiePhotofloDoneEvent; + + +/*--------------------------------------------------------------------------* + * Photoflo Errors * + *--------------------------------------------------------------------------*/ + +typedef struct { + int type; + Display *display; + unsigned long flo_id; + unsigned long serial; + unsigned char error_code; + unsigned char request_code; + unsigned char minor_code; + unsigned int flo_error_code; + unsigned long name_space; + XiePhototag phototag; + unsigned int elem_type; +} XieFloAccessError, XieFloAllocError, XieFloElementError, XieFloIDError, + XieFloLengthError, XieFloMatchError, XieFloSourceError; + +typedef struct { + int type; + Display *display; + unsigned long flo_id; + unsigned long serial; + unsigned char error_code; + unsigned char request_code; + unsigned char minor_code; + unsigned int flo_error_code; + unsigned long name_space; + XiePhototag phototag; + unsigned int elem_type; + XID resource_id; +} XieFloResourceError; + +typedef struct { + int type; + Display *display; + unsigned long flo_id; + unsigned long serial; + unsigned char error_code; + unsigned char request_code; + unsigned char minor_code; + unsigned int flo_error_code; + unsigned long name_space; + XiePhototag phototag; + unsigned int elem_type; + XiePhototag domain_src; +} XieFloDomainError; + +typedef struct { + int type; + Display *display; + unsigned long flo_id; + unsigned long serial; + unsigned char error_code; + unsigned char request_code; + unsigned char minor_code; + unsigned int flo_error_code; + unsigned long name_space; + XiePhototag phototag; + unsigned int elem_type; + unsigned int operator; +} XieFloOperatorError; + +typedef struct { + int type; + Display *display; + unsigned long flo_id; + unsigned long serial; + unsigned char error_code; + unsigned char request_code; + unsigned char minor_code; + unsigned int flo_error_code; + unsigned long name_space; + XiePhototag phototag; + unsigned int elem_type; + unsigned int technique_number; + unsigned int num_tech_params; + XieTechniqueGroup tech_group; +} XieFloTechniqueError; + +typedef struct { + int type; + Display *display; + unsigned long flo_id; + unsigned long serial; + unsigned char error_code; + unsigned char request_code; + unsigned char minor_code; + unsigned int flo_error_code; + unsigned long name_space; + XiePhototag phototag; + unsigned int elem_type; + unsigned long bad_value; +} XieFloValueError; + + +/*--------------------------------------------------------------------------* + * Function prototypes * + *--------------------------------------------------------------------------*/ + +/* Startup functions -------------------------------------------------------*/ + +extern Status XieInitialize ( +#if NeedFunctionPrototypes + Display * /* display */, + XieExtensionInfo ** /* extinfo_ret */ +#endif +); + +extern Status XieQueryTechniques ( +#if NeedFunctionPrototypes + Display * /* display */, + XieTechniqueGroup /* technique_group */, + int * /* ntechniques_ret */, + XieTechnique ** /* techniques_ret */ +#endif +); + +extern void XieFreeTechniques ( +#if NeedFunctionPrototypes + XieTechnique * /* techs */, + unsigned int /* count */ +#endif +); + + +/* Color List functions ---------------------------------------------------*/ + +extern XieColorList XieCreateColorList ( +#if NeedFunctionPrototypes + Display * /* display */ +#endif +); + +extern void XieDestroyColorList ( +#if NeedFunctionPrototypes + Display * /* display */, + XieColorList /* color_list */ +#endif +); + +extern void XiePurgeColorList ( +#if NeedFunctionPrototypes + Display * /* display */, + XieColorList /* color_list */ +#endif +); + +extern Status XieQueryColorList ( +#if NeedFunctionPrototypes + Display * /* display */, + XieColorList /* color_list */, + Colormap * /* colormap_ret */, + unsigned * /* ncolors_ret */, + unsigned long ** /* colors_ret */ +#endif +); + + +/* LUT functions -----------------------------------------------------------*/ + +extern XieLut XieCreateLUT ( +#if NeedFunctionPrototypes + Display * /* display */ +#endif +); + +extern void XieDestroyLUT ( +#if NeedFunctionPrototypes + Display * /* display */, + XieLut /* lut */ +#endif +); + + +/* Photomap functions ------------------------------------------------------*/ + +extern XiePhotomap XieCreatePhotomap ( +#if NeedFunctionPrototypes + Display * /* display */ +#endif +); + +extern void XieDestroyPhotomap ( +#if NeedFunctionPrototypes + Display * /* display */, + XiePhotomap /* photomap */ +#endif +); + +extern Status XieQueryPhotomap ( +#if NeedFunctionPrototypes + Display * /* display */, + XiePhotomap /* photomap */, + Bool * /* populated_ret */, + XieDataType * /* datatype_ret */, + XieDataClass * /* class_ret */, + XieDecodeTechnique * /* decode_technique_ret */, + XieLTriplet /* width_ret */, + XieLTriplet /* height_ret */, + XieLTriplet /* levels_ret */ +#endif +); + + +/* ROI functions -----------------------------------------------------------*/ + +extern XieRoi XieCreateROI ( +#if NeedFunctionPrototypes + Display * /* display */ +#endif +); + +extern void XieDestroyROI ( +#if NeedFunctionPrototypes + Display * /* display */, + XieRoi /* roi */ +#endif +); + + +/* Photospace functions ----------------------------------------------------*/ + +extern XiePhotospace XieCreatePhotospace ( +#if NeedFunctionPrototypes + Display * /* display */ +#endif +); + +extern void XieDestroyPhotospace ( +#if NeedFunctionPrototypes + Display * /* display */, + XiePhotospace /* photospace */ +#endif +); + +extern void XieExecuteImmediate ( +#if NeedFunctionPrototypes + Display * /* display */, + XiePhotospace /* photospace */, + unsigned long /* flo_id */, + Bool /* notify */, + XiePhotoElement * /* elem_list */, + int /* elem_count */ +#endif +); + + +/* Photoflo functions ------------------------------------------------------*/ + +extern XiePhotoElement *XieAllocatePhotofloGraph ( +#if NeedFunctionPrototypes + unsigned int /* count */ +#endif +); + +extern void XieFreePhotofloGraph ( +#if NeedFunctionPrototypes + XiePhotoElement * /* elements */, + unsigned int /* count */ +#endif +); + +extern XiePhotoflo XieCreatePhotoflo ( +#if NeedFunctionPrototypes + Display * /* display */, + XiePhotoElement * /* elem_list */, + int /* elem_count */ +#endif +); + +extern void XieDestroyPhotoflo ( +#if NeedFunctionPrototypes + Display * /* display */, + XiePhotoflo /* photoflo */ +#endif +); + +extern void XieExecutePhotoflo ( +#if NeedFunctionPrototypes + Display * /* display */, + XiePhotoflo /* photoflo */, + Bool /* notify */ +#endif +); + +extern void XieModifyPhotoflo ( +#if NeedFunctionPrototypes + Display * /* display */, + XiePhotoflo /* photoflo */, + int /* start */, + XiePhotoElement * /* elem_list */, + int /* elem_count */ +#endif +); + +extern void XieRedefinePhotoflo ( +#if NeedFunctionPrototypes + Display * /* display */, + XiePhotoflo /* photoflo */, + XiePhotoElement * /* elem_list */, + int /* elem_count */ +#endif +); + +extern Status XieQueryPhotoflo ( +#if NeedFunctionPrototypes + Display * /* display */, + unsigned long /* name_space */, + unsigned long /* flo_id */, + XiePhotofloState * /* state_ret */, + XiePhototag ** /* data_expected_ret */, + unsigned int * /* nexpected_ret */, + XiePhototag ** /* data_available_ret */, + unsigned int * /* navailable_ret */ +#endif +); + + +/* Client Data functions ---------------------------------------------------*/ + +extern void XiePutClientData ( +#if NeedFunctionPrototypes + Display * /* display */, + unsigned long /* name_space */, + unsigned long /* flo_id */, + XiePhototag /* element */, + Bool /* final */, + unsigned /* band_number */, + unsigned char * /* data */, + unsigned /* nbytes */ +#endif +); + +extern Status XieGetClientData ( +#if NeedFunctionPrototypes + Display * /* display */, + unsigned long /* name_space */, + unsigned long /* flo_id */, + XiePhototag /* element */, + unsigned /* max_bytes */, + Bool /* terminate */, + unsigned /* band_number */, + XieExportState * /* new_state_ret */, + unsigned char ** /* data_ret */, + unsigned * /* nbytes_ret */ +#endif +); + + +/* Abort and Await functions -----------------------------------------------*/ + +extern void XieAbort ( +#if NeedFunctionPrototypes + Display * /* display */, + unsigned long /* name_space */, + unsigned long /* flo_id */ +#endif +); + +extern void XieAwait ( +#if NeedFunctionPrototypes + Display * /* display */, + unsigned long /* name_space */, + unsigned long /* flo_id */ +#endif +); + + +/* Photoflo element functions ----------------------------------------------*/ + +extern void XieFloImportClientLUT ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XieDataClass /* data_class */, + XieOrientation /* band_order */, + XieLTriplet /* length */, + XieLevels /* levels */ +#endif +); + +extern void XieFloImportClientPhoto ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XieDataClass /* data_class */, + XieLTriplet /* width */, + XieLTriplet /* height */, + XieLevels /* levels */, + Bool /* notify */, + XieDecodeTechnique /* decode_tech */, + XiePointer /* decode_param */ +#endif +); + +extern void XieFloImportClientROI ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + unsigned int /* rectangles */ +#endif +); + +extern void XieFloImportDrawable ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + Drawable /* drawable */, + int /* src_x */, + int /* src_y */, + unsigned int /* width */, + unsigned int /* height */, + unsigned long /* fill */, + Bool /* notify */ +#endif +); + +extern void XieFloImportDrawablePlane ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + Drawable /* drawable */, + int /* src_x */, + int /* src_y */, + unsigned int /* width */, + unsigned int /* height */, + unsigned long /* fill */, + unsigned long /* bit_plane */, + Bool /* notify */ +#endif +); + +extern void XieFloImportLUT ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XieLut /* lut */ +#endif +); + +extern void XieFloImportPhotomap ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhotomap /* photomap */, + Bool /* notify */ +#endif +); + +extern void XieFloImportROI ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XieRoi /* roi */ +#endif +); + +extern void XieFloArithmetic ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src1 */, + XiePhototag /* src2 */, + XieProcessDomain * /* domain */, + XieConstant /* constant */, + XieArithmeticOp /* operator */, + unsigned int /* band_mask */ +#endif +); + +extern void XieFloBandCombine ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src1 */, + XiePhototag /* src2 */, + XiePhototag /* src3 */ +#endif +); + +extern void XieFloBandExtract ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + unsigned int /* levels */, + double /* bias */, + XieConstant /* coefficients */ +#endif +); + +extern void XieFloBandSelect ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + unsigned int /* band_number */ +#endif +); + +extern void XieFloBlend ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src1 */, + XiePhototag /* src2 */, + XieConstant /* src_constant */, + XiePhototag /* alpha */, + double /* alpha_const */, + XieProcessDomain * /* domain */, + unsigned int /* band_mask */ +#endif +); + +extern void XieFloCompare ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src1 */, + XiePhototag /* src2 */, + XieProcessDomain * /* domain */, + XieConstant /* constant */, + XieCompareOp /* operator */, + Bool /* combine */, + unsigned int /* band_mask */ +#endif +); + +extern void XieFloConstrain ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieLevels /* levels */, + XieConstrainTechnique /* constrain_tech */, + XiePointer /* constrain_param */ +#endif +); + +extern void XieFloConvertFromIndex ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + Colormap /* colormap */, + XieDataClass /* data_class */, + unsigned int /* precision */ +#endif +); + +extern void XieFloConvertFromRGB ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieColorspace /* color_space */, + XiePointer /* color_param */ +#endif +); + +extern void XieFloConvertToIndex ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + Colormap /* colormap */, + XieColorList /* color_list */, + Bool /* notify */, + XieColorAllocTechnique /* color_alloc_tech */, + XiePointer /* color_alloc_param */ +#endif +); + +extern void XieFloConvertToRGB ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieColorspace /* color_space */, + XiePointer /* color_param */ +#endif +); + +extern void XieFloConvolve ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieProcessDomain * /* domain */, + float * /* kernel */, + int /* kernel_size */, + unsigned int /* band_mask */, + XieConvolveTechnique /* convolve_tech */, + XiePointer /* convolve_param */ +#endif +); + +extern void XieFloDither ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + unsigned int /* band_mask */, + XieLevels /* levels */, + XieDitherTechnique /* dither_tech */, + XiePointer /* dither_param */ +#endif +); + +extern void XieFloGeometry ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + unsigned int /* width */, + unsigned int /* height */, + float[6] /* coefficients[6] */, + XieConstant /* constant */, + unsigned int /* band_mask */, + XieGeometryTechnique /* sample_tech */, + XiePointer /* sample_param */ +#endif +); + +extern void XieFloLogical ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src1 */, + XiePhototag /* src2 */, + XieProcessDomain * /* domain */, + XieConstant /* constant */, + unsigned long /* operator */, + unsigned int /* band_mask */ +#endif +); + +extern void XieFloMatchHistogram ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieProcessDomain * /* domain */, + XieHistogramShape /* shape */, + XiePointer /* shape_param */ +#endif +); + +extern void XieFloMath ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieProcessDomain * /* domain */, + XieMathOp /* operator */, + unsigned int /* band_mask */ +#endif +); + +extern void XieFloPasteUp ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + unsigned int /* width */, + unsigned int /* height */, + XieConstant /* constant */, + XieTile * /* tiles */, + unsigned int /* tile_count */ +#endif +); + +extern void XieFloPoint ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieProcessDomain * /* domain */, + XiePhototag /* lut */, + unsigned int /* band_mask */ +#endif +); + +extern void XieFloUnconstrain ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */ +#endif +); + +extern void XieFloExportClientHistogram ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieProcessDomain * /* domain */, + XieExportNotify /* notify */ +#endif +); + +extern void XieFloExportClientLUT ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieOrientation /* band_order */, + XieExportNotify /* notify */, + XieLTriplet /* start */, + XieLTriplet /* length */ +#endif +); + +extern void XieFloExportClientPhoto ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieExportNotify /* notify */, + XieEncodeTechnique /* encode_tech */, + XiePointer /* encode_param */ +#endif +); + +extern void XieFloExportClientROI ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieExportNotify /* notify */ +#endif +); + +extern void XieFloExportDrawable ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + Drawable /* drawable */, + GC /* gc */, + int /* dst_x */, + int /* dst_y */ +#endif +); + +extern void XieFloExportDrawablePlane ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + Drawable /* drawable */, + GC /* gc */, + int /* dst_x */, + int /* dst_y */ +#endif +); + +extern void XieFloExportLUT ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieLut /* lut */, + Bool /* merge */, + XieLTriplet /* start */ +#endif +); + +extern void XieFloExportPhotomap ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XiePhotomap /* photomap */, + XieEncodeTechnique /* encode_tech */, + XiePointer /* encode_param */ +#endif +); + +extern void XieFloExportROI ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */, + XiePhototag /* src */, + XieRoi /* roi */ +#endif +); + + +/* Technique functions -----------------------------------------------------*/ + +extern XieColorAllocAllParam *XieTecColorAllocAll ( +#if NeedFunctionPrototypes + unsigned long /* fill */ +#endif +); + +extern XieColorAllocMatchParam *XieTecColorAllocMatch ( +#if NeedFunctionPrototypes + double /* match_limit */, + double /* gray_limit */ +#endif +); + +extern XieColorAllocRequantizeParam *XieTecColorAllocRequantize ( +#if NeedFunctionPrototypes + unsigned long /* max_cells */ +#endif +); + +extern XieRGBToCIELabParam *XieTecRGBToCIELab ( +#if NeedFunctionPrototypes + XieMatrix /* matrix */, + XieWhiteAdjustTechnique /* white_adjust_tech */, + XiePointer /* white_adjust_param */ +#endif +); + +extern XieRGBToCIEXYZParam *XieTecRGBToCIEXYZ ( +#if NeedFunctionPrototypes + XieMatrix /* matrix */, + XieWhiteAdjustTechnique /* white_adjust_tech */, + XiePointer /* white_adjust_param */ +#endif +); + +extern XieRGBToYCbCrParam *XieTecRGBToYCbCr ( +#if NeedFunctionPrototypes + XieLevels /* levels */, + double /* luma_red */, + double /* luma_green */, + double /* luma_blue */, + XieConstant /* bias */ +#endif +); + +extern XieRGBToYCCParam *XieTecRGBToYCC ( +#if NeedFunctionPrototypes + XieLevels /* levels */, + double /* luma_red */, + double /* luma_green */, + double /* luma_blue */, + double /* scale */ +#endif +); + +extern XieCIELabToRGBParam *XieTecCIELabToRGB ( +#if NeedFunctionPrototypes + XieMatrix /* matrix */, + XieWhiteAdjustTechnique /* white_adjust_tech */, + XiePointer /* white_adjust_param */, + XieGamutTechnique /* gamut_tech */, + XiePointer /* gamut_param */ +#endif +); + +extern XieCIEXYZToRGBParam *XieTecCIEXYZToRGB ( +#if NeedFunctionPrototypes + XieMatrix /* matrix */, + XieWhiteAdjustTechnique /* white_adjust_tech */, + XiePointer /* white_adjust_param */, + XieGamutTechnique /* gamut_tech */, + XiePointer /* gamut_param */ +#endif +); + +extern XieYCbCrToRGBParam *XieTecYCbCrToRGB ( +#if NeedFunctionPrototypes + XieLevels /* levels */, + double /* luma_red */, + double /* luma_green */, + double /* luma_blue */, + XieConstant /* bias */, + XieGamutTechnique /* gamut_tech */, + XiePointer /* gamut_param */ +#endif +); + +extern XieYCCToRGBParam *XieTecYCCToRGB ( +#if NeedFunctionPrototypes + XieLevels /* levels */, + double /* luma_red */, + double /* luma_green */, + double /* luma_blue */, + double /* scale */, + XieGamutTechnique /* gamut_tech */, + XiePointer /* gamut_param */ +#endif +); + +extern XieClipScaleParam *XieTecClipScale ( +#if NeedFunctionPrototypes + XieConstant /* in_low */, + XieConstant /* in_high */, + XieLTriplet /* out_low */, + XieLTriplet /* out_high */ +#endif +); + +extern XieConvolveConstantParam *XieTecConvolveConstant ( +#if NeedFunctionPrototypes + XieConstant /* constant */ +#endif +); + +extern XieDecodeUncompressedSingleParam *XieTecDecodeUncompressedSingle ( +#if NeedFunctionPrototypes + XieOrientation /* fill_order */, + XieOrientation /* pixel_order */, + unsigned int /* pixel_stride */, + unsigned int /* left_pad */, + unsigned int /* scanline_pad */ +#endif +); + +extern XieDecodeUncompressedTripleParam *XieTecDecodeUncompressedTriple ( +#if NeedFunctionPrototypes + XieOrientation /* fill_order */, + XieOrientation /* pixel_order */, + XieOrientation /* band_order */, + XieInterleave /* interleave */, + unsigned char[3] /* pixel_stride[3] */, + unsigned char[3] /* left_pad[3] */, + unsigned char[3] /* scanline_pad[3] */ +#endif +); + +extern XieDecodeG31DParam *XieTecDecodeG31D ( +#if NeedFunctionPrototypes + XieOrientation /* encoded_order */, + Bool /* normal */, + Bool /* radiometric */ +#endif +); + +extern XieDecodeG32DParam *XieTecDecodeG32D ( +#if NeedFunctionPrototypes + XieOrientation /* encoded_order */, + Bool /* normal */, + Bool /* radiometric */ +#endif +); + +extern XieDecodeG42DParam *XieTecDecodeG42D ( +#if NeedFunctionPrototypes + XieOrientation /* encoded_order */, + Bool /* normal */, + Bool /* radiometric */ +#endif +); + +extern XieDecodeTIFF2Param *XieTecDecodeTIFF2 ( +#if NeedFunctionPrototypes + XieOrientation /* encoded_order */, + Bool /* normal */, + Bool /* radiometric */ +#endif +); + +extern XieDecodeTIFFPackBitsParam *XieTecDecodeTIFFPackBits ( +#if NeedFunctionPrototypes + XieOrientation /* encoded_order */, + Bool /* normal */ +#endif +); + +extern XieDecodeJPEGBaselineParam *XieTecDecodeJPEGBaseline ( +#if NeedFunctionPrototypes + XieInterleave /* interleave */, + XieOrientation /* band_order */, + Bool /* up_sample */ +#endif +); + +extern XieDecodeJPEGLosslessParam *XieTecDecodeJPEGLossless ( +#if NeedFunctionPrototypes + XieInterleave /* interleave */, + XieOrientation /* band_order */ +#endif +); + +extern XieDitherOrderedParam *XieTecDitherOrderedParam ( +#if NeedFunctionPrototypes + unsigned int /* threshold_order */ +#endif +); + +extern XieEncodeUncompressedSingleParam *XieTecEncodeUncompressedSingle ( +#if NeedFunctionPrototypes + XieOrientation /* fill_order */, + XieOrientation /* pixel_order */, + unsigned int /* pixel_stride */, + unsigned int /* scanline_pad */ +#endif +); + +extern XieEncodeUncompressedTripleParam *XieTecEncodeUncompressedTriple ( +#if NeedFunctionPrototypes + XieOrientation /* fill_order */, + XieOrientation /* pixel_order */, + XieOrientation /* band_order */, + XieInterleave /* interleave */, + unsigned char[3] /* pixel_stride[3] */, + unsigned char[3] /* scanline_pad[3] */ +#endif +); + +extern XieEncodeG31DParam *XieTecEncodeG31D ( +#if NeedFunctionPrototypes + Bool /* align_eol */, + Bool /* radiometric */, + XieOrientation /* encoded_order */ +#endif +); + +extern XieEncodeG32DParam *XieTecEncodeG32D ( +#if NeedFunctionPrototypes + Bool /* uncompressed */, + Bool /* align_eol */, + Bool /* radiometric */, + XieOrientation /* encoded_order */, + unsigned long /* k_factor */ +#endif +); + +extern XieEncodeG42DParam *XieTecEncodeG42D ( +#if NeedFunctionPrototypes + Bool /* uncompressed */, + Bool /* radiometric */, + XieOrientation /* encoded_order */ +#endif +); + +extern XieEncodeServerChoiceParam *XieTecEncodeServerChoice ( +#if NeedFunctionPrototypes + unsigned int /* preference */ +#endif +); + +extern XieEncodeJPEGBaselineParam *XieTecEncodeJPEGBaseline ( +#if NeedFunctionPrototypes + XieInterleave /* interleave */, + XieOrientation /* band_order */, + unsigned char[3] /* horizontal_samples[3] */, + unsigned char[3] /* vertical_samples[3] */, + char * /* q_table */, + unsigned int /* q_size */, + char * /* ac_table */, + unsigned int /* ac_size */, + char * /* dc_table */, + unsigned int /* dc_size */ +#endif +); + +extern void XieFreeEncodeJPEGBaseline ( +#if NeedFunctionPrototypes + XieEncodeJPEGBaselineParam * /* param */ +#endif +); + +extern XieEncodeJPEGLosslessParam *XieTecEncodeJPEGLossless ( +#if NeedFunctionPrototypes + XieInterleave /* interleave */, + XieOrientation /* band_order */, + unsigned char[3] /* predictor[3] */, + char * /* table */, + unsigned int /* table_size */ +#endif +); + +extern void XieFreeEncodeJPEGLossless ( +#if NeedFunctionPrototypes + XieEncodeJPEGLosslessParam * /* param */ +#endif +); + +extern void XieFreePasteUpTiles ( +#if NeedFunctionPrototypes + XiePhotoElement * /* element */ +#endif +); + +extern XieEncodeTIFF2Param *XieTecEncodeTIFF2 ( +#if NeedFunctionPrototypes + XieOrientation /* encoded_order */, + Bool /* radiometric */ +#endif +); + +extern XieEncodeTIFFPackBitsParam *XieTecEncodeTIFFPackBits ( +#if NeedFunctionPrototypes + XieOrientation /* encoded_order */ +#endif +); + +extern XieGeomAntialiasByAreaParam *XieTecGeomAntialiasByArea ( +#if NeedFunctionPrototypes + int /* simple */ +#endif +); + +extern XieGeomAntialiasByLowpassParam *XieTecGeomAntialiasByLowpass ( +#if NeedFunctionPrototypes + int /* kernel_size */ +#endif +); + +extern XieGeomGaussianParam *XieTecGeomGaussian ( +#if NeedFunctionPrototypes + double /* sigma */, + double /* normalize */, + unsigned int /* radius */, + Bool /* simple */ +#endif +); + +extern XieGeomNearestNeighborParam *XieTecGeomNearestNeighbor ( +#if NeedFunctionPrototypes + unsigned int /* modify */ +#endif +); + +extern XieHistogramGaussianParam *XieTecHistogramGaussian ( +#if NeedFunctionPrototypes + double /* mean */, + double /* sigma */ +#endif +); + +extern XieHistogramHyperbolicParam *XieTecHistogramHyperbolic ( +#if NeedFunctionPrototypes + double /* constant */, + Bool /* shape_factor */ +#endif +); + +extern XieWhiteAdjustCIELabShiftParam *XieTecWhiteAdjustCIELabShift ( +#if NeedFunctionPrototypes + XieConstant /* white_point */ +#endif +); + + +#endif /* _XIELIB_H_ */ diff --git a/xie/xc/lib/XIE/XIElibint.h b/xie/xc/lib/XIE/XIElibint.h new file mode 100644 index 0000000..8505854 --- /dev/null +++ b/xie/xc/lib/XIE/XIElibint.h @@ -0,0 +1,303 @@ +/* $XConsortium: XIElibint.h,v 1.8 95/06/08 23:20:39 gildea Exp $ */ +/* + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#ifndef _XIELIBINT_H_ +#define _XIELIBINT_H_ + +#define NEED_REPLIES +#include +#include +#include +#include + + + +/* ------------------------------------------------------------------------- + * Display extension data structures and macros. + * ------------------------------------------------------------------------- */ + +/* + * For each display initialized by XieInitialize(), a record is allocated + * which holds various information about that display. These records are + * maintained in a linked list. The record for the most recently referenced + * display is always kept at the beginning of the list (for quick access). + */ + +typedef struct _XieExtInfo +{ + Display *display; /* pointer to X display structure */ + XExtCodes *extCodes; /* extension codes */ + XieExtensionInfo *extInfo; /* extension information */ + struct _XieExtInfo *next; /* next in list */ +} XieExtInfo; + + +/* + * Insert a new record in the beginning of the linked list. + */ + +#define ADD_EXTENSION_INFO(_display, _info) \ +\ +{ \ + _info->display = _display; \ +\ + _info->next = _XieExtInfoHeader; \ + _XieExtInfoHeader = _info; \ +} + + +/* + * Remove the record assosicated with '_display' from the linked list + * and return a pointer to it in '_info'. + */ + +#define REMOVE_EXTENSION_INFO(_display, _info) \ +\ +{ \ + XieExtInfo *prev = NULL; \ +\ + _info = _XieExtInfoHeader; \ +\ + while (_info && _info->display != _display) \ + { \ + prev = _info; \ + _info = _info->next; \ + } \ +\ + if (_info) \ + if (!prev) \ + _XieExtInfoHeader = _info->next; \ + else \ + prev->next = _info->next; \ +} + + +/* + * Return the info assosicated with '_display' in '_info'. + * If the info is not the first in the list, move it to the front. + */ + +#define GET_EXTENSION_INFO(_display, _info) \ +\ +{ \ + if (_info = _XieExtInfoHeader) \ + { \ + if (_XieExtInfoHeader->display != _display) \ + { \ + XieExtInfo *prev = _XieExtInfoHeader; \ +\ + _info = _info->next; \ + while (_info && _info->display != _display) \ + { \ + prev = _info; \ + _info = _info->next; \ + } \ +\ + if (_info) \ + { \ + prev->next = _info->next; \ + _info->next = _XieExtInfoHeader; \ + _XieExtInfoHeader = _info; \ + } \ + } \ + } \ +} + + + + + + +#define PAD(_size) (3 - (((_size) + 3) & 0x3)) + +#define PADDED_BYTES(_bytes) (_bytes + PAD (_bytes)) + +#define NUMWORDS(_size) (((unsigned int) ((_size) + 3)) >> 2) + +#define NUMBYTES(_len) (((unsigned int) (_len)) << 2) + +#define LENOF(_ctype) (SIZEOF (_ctype) >> 2) + + + + + +/* ------------------------------------------------------------------------- + * Macros for setting up requests. + * ------------------------------------------------------------------------- */ + +/* + * Request names and opcodes. + */ + +#if (defined(__STDC__) && !defined(UNIXCPP)) || defined(ANSICPP) +#define REQNAME(_name_) xie##_name_##Req +#define REQOPCODE(_name_) X_ie##_name_ +#define REQSIZE(_name_) sz_xie##_name_##Req +#else +#define REQNAME(_name_) xie/**/_name_/**/Req +#define REQOPCODE(_name_) X_ie/**/_name_ +#define REQSIZE(_name_) sz_xie/**/_name_/**/Req +#endif + + +/* + * GET_REQUEST sets up a request to be sent to the X server. If there isn't + * enough room left in the X buffer, it is flushed before the new request + * is started. + */ + +#define GET_REQUEST(_name, _req) \ + if ((display->bufptr + REQSIZE(_name)) > display->bufmax) \ + _XFlush (display); \ + _req = (char *) (display->last_req = display->bufptr); \ + display->bufptr += REQSIZE(_name); \ + display->request++ + + +/* + * GET_REQUEST_EXTRA is the same as GET_REQUEST and except that an additional + * "extraBytes" are allocated after the request. "extraBytes" will be + * padded to a word boundary. + */ + +#define GET_REQUEST_EXTRA(_name, _extraBytes, _req) \ + if ((display->bufptr + REQSIZE(_name) + \ + PADDED_BYTES (_extraBytes)) > display->bufmax) _XFlush (display); \ + _req = (char *) (display->last_req = display->bufptr); \ + display->bufptr += (REQSIZE(_name) + PADDED_BYTES (_extraBytes)); \ + display->request++ + + +/* + * BEGIN_REQUEST_HEADER and END_REQUEST_HEADER are used to hide + * the extra work that has to be done on 64 bit clients. On such + * machines, all structure pointers must point to an 8 byte boundary. + * As a result, we must first store the request header info in + * a static data stucture, then bcopy it into the transport buffer. + */ + +#ifndef WORD64 + +#define BEGIN_REQUEST_HEADER(_name, _pBuf, _pReq) \ +{ \ + XieExtInfo *_xieExtInfo; \ + GET_EXTENSION_INFO (display, _xieExtInfo); \ + _pReq = (REQNAME(_name) *) _pBuf; + +#define END_REQUEST_HEADER(_name, _pBuf, _pReq) \ + _pBuf += REQSIZE(_name); \ +} + +#else /* WORD64 */ + +#define BEGIN_REQUEST_HEADER(_name, _pBuf, _pReq) \ +{ \ + XieExtInfo *_xieExtInfo; \ + REQNAME(_name) tReq; \ + GET_EXTENSION_INFO (display, _xieExtInfo); \ + _pReq = &tReq; + +#define END_REQUEST_HEADER(_name, _pBuf, _pReq) \ + memcpy (_pBuf, _pReq, REQSIZE(_name)); \ + _pBuf += REQSIZE(_name); \ +} + +#endif /* WORD64 */ + + +/* + * Macros used to store the request header info. + */ + +#define STORE_REQUEST_HEADER(_name, _req) \ + _req->reqType = _xieExtInfo->extCodes->major_opcode; \ + _req->opcode = REQOPCODE(_name); \ + _req->length = (REQSIZE(_name)) >> 2; + + +#define STORE_REQUEST_EXTRA_HEADER(_name, _extraBytes, _req) \ + _req->reqType = _xieExtInfo->extCodes->major_opcode; \ + _req->opcode = REQOPCODE(_name); \ + _req->length = (REQSIZE(_name) + PADDED_BYTES (_extraBytes)) >> 2; + + + + +typedef int (*XieTechFuncPtr) (); + +typedef struct _XieTechFuncRec { + int technique; + XieTechFuncPtr techfunc; + struct _XieTechFuncRec *next; +} XieTechFuncRec; + + + + +/* + * See if XSynchronize has been called. If so, send request right away. + */ + +#define SYNC_HANDLE(_display)\ + if ((_display)->synchandler) (*(_display)->synchandler) (_display) + + +/* + * Read a reply into a scratch buffer. + */ + +#define XREAD_INTO_SCRATCH(_display, _pBuf, _numBytes) \ + _pBuf = (char *) _XAllocTemp (_display, _numBytes); \ + _XRead (_display, _pBuf, _numBytes); + +#define FINISH_WITH_SCRATCH(_display, _pBuf, _numBytes) \ + _XFreeTemp (_display, _pBuf, _numBytes); + + +/* + * Externally defined globals + */ + +extern XieExtInfo *_XieExtInfoHeader; +extern void (*(_XieElemFuncs[]))(); +extern XieTechFuncRec *_XieTechFuncs[]; +extern Bool _XieTechFuncsInitialized; +extern xieTypFloat _XieConvertToIEEE(); + +/* for X-Window system protocol elements */ +#define sz_CARD32 4 +#define sz_CARD16 2 +#define sz_CARD8 1 +#define sz_INT32 4 +#define sz_INT16 2 + +#endif /* _XIELIBINT_H_ */ diff --git a/xie/xc/lib/XIE/abort.c b/xie/xc/lib/XIE/abort.c new file mode 100644 index 0000000..79079ce --- /dev/null +++ b/xie/xc/lib/XIE/abort.c @@ -0,0 +1,61 @@ +/* $XConsortium: abort.c,v 1.2 94/04/17 20:18:18 mor Exp $ */ + +/* + +Copyright (c) 1993 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#include "XIElibint.h" + + +void +XieAbort (display, name_space, flo_id) + +Display *display; +unsigned long name_space; +unsigned long flo_id; + +{ + xieAbortReq *req; + char *pBuf; + + LockDisplay (display); + + GET_REQUEST (Abort, pBuf); + + BEGIN_REQUEST_HEADER (Abort, pBuf, req); + + STORE_REQUEST_HEADER (Abort, req); + req->nameSpace = name_space; + req->floID = flo_id; + + END_REQUEST_HEADER (Abort, pBuf, req); + + UnlockDisplay (display); + SYNC_HANDLE (display); +} diff --git a/xie/xc/lib/XIE/await.c b/xie/xc/lib/XIE/await.c new file mode 100644 index 0000000..44fa6f5 --- /dev/null +++ b/xie/xc/lib/XIE/await.c @@ -0,0 +1,61 @@ +/* $XConsortium: await.c,v 1.2 94/04/17 20:18:18 mor Exp $ */ + +/* + +Copyright (c) 1993 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#include "XIElibint.h" + + +void +XieAwait (display, name_space, flo_id) + +Display *display; +unsigned long name_space; +unsigned long flo_id; + +{ + xieAwaitReq *req; + char *pBuf; + + LockDisplay (display); + + GET_REQUEST (Await, pBuf); + + BEGIN_REQUEST_HEADER (Await, pBuf, req); + + STORE_REQUEST_HEADER (Await, req); + req->nameSpace = name_space; + req->floID = flo_id; + + END_REQUEST_HEADER (Await, pBuf, req); + + UnlockDisplay (display); + SYNC_HANDLE (display); +} diff --git a/xie/xc/lib/XIE/clientdata.c b/xie/xc/lib/XIE/clientdata.c new file mode 100644 index 0000000..bdbd1cc --- /dev/null +++ b/xie/xc/lib/XIE/clientdata.c @@ -0,0 +1,139 @@ +/* $XConsortium: clientdata.c,v 1.4 94/04/17 20:18:19 rws Exp $ */ + +/* + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#include "XIElibint.h" + +#include + + +void +XiePutClientData (display, name_space, flo_id, element, final, + band_number, data, nbytes) + +Display *display; +unsigned long name_space; +unsigned long flo_id; +XiePhototag element; +Bool final; +unsigned band_number; +unsigned char *data; +unsigned nbytes; + +{ + xiePutClientDataReq *req; + char *pBuf; + + LockDisplay (display); + + GET_REQUEST (PutClientData, pBuf); + + BEGIN_REQUEST_HEADER (PutClientData, pBuf, req); + + STORE_REQUEST_EXTRA_HEADER (PutClientData, nbytes, req); + req->nameSpace = name_space; + req->floID = flo_id; + req->element = element; + req->final = final; + req->bandNumber = band_number; + req->byteCount = nbytes; + + END_REQUEST_HEADER (PutClientData, pBuf, req); + + Data (display, (char *) data, nbytes); + + UnlockDisplay (display); + SYNC_HANDLE (display); +} + + +Status +XieGetClientData (display, name_space, flo_id, element, max_bytes, + terminate, band_number, new_state_ret, data_ret, nbytes_ret) + +Display *display; +unsigned long name_space; +unsigned long flo_id; +XiePhototag element; +unsigned max_bytes; +Bool terminate; +unsigned band_number; +XieExportState *new_state_ret; +unsigned char **data_ret; +unsigned *nbytes_ret; + +{ + xieGetClientDataReq *req; + xieGetClientDataReply rep; + char *pBuf; + + LockDisplay (display); + + GET_REQUEST (GetClientData, pBuf); + + BEGIN_REQUEST_HEADER (GetClientData, pBuf, req); + + STORE_REQUEST_HEADER (GetClientData, req); + req->nameSpace = name_space; + req->floID = flo_id; + req->maxBytes = max_bytes; + req->element = element; + req->terminate = terminate; + req->bandNumber = band_number; + + END_REQUEST_HEADER (GetClientData, pBuf, req); + + if (_XReply (display, (xReply *)&rep, 0, xFalse) == 0) + /* V4.13 moved the data length word into the reply */ + { + UnlockDisplay (display); + SYNC_HANDLE (display); + + *nbytes_ret = 0; + *data_ret = NULL; + + return (0); + } + + + *new_state_ret = rep.newState; + *nbytes_ret = rep.byteCount; + + *data_ret = (unsigned char *) Xmalloc (PADDED_BYTES (rep.byteCount)); + + _XReadPad (display, (char *) *data_ret, rep.byteCount); + + + UnlockDisplay (display); + SYNC_HANDLE (display); + + return (1); +} diff --git a/xie/xc/lib/XIE/colorlist.c b/xie/xc/lib/XIE/colorlist.c new file mode 100644 index 0000000..73367a9 --- /dev/null +++ b/xie/xc/lib/XIE/colorlist.c @@ -0,0 +1,172 @@ +/* $XConsortium: colorlist.c,v 1.6 94/05/06 15:10:34 mor Exp $ */ + +/* + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#include "XIElibint.h" + + +XieColorList +XieCreateColorList (display) + +Display *display; + +{ + xieCreateColorListReq *req; + char *pBuf; + XieColorList id; + + LockDisplay (display); + + id = XAllocID (display); + + GET_REQUEST (CreateColorList, pBuf); + + BEGIN_REQUEST_HEADER (CreateColorList, pBuf, req); + + STORE_REQUEST_HEADER (CreateColorList, req); + req->colorList = id; + + END_REQUEST_HEADER (CreateColorList, pBuf, req); + + UnlockDisplay (display); + SYNC_HANDLE (display); + + return (id); +} + + +void +XieDestroyColorList (display, color_list) + +Display *display; +XieColorList color_list; + +{ + xieDestroyColorListReq *req; + char *pBuf; + + LockDisplay (display); + + GET_REQUEST (DestroyColorList, pBuf); + + BEGIN_REQUEST_HEADER (DestroyColorList, pBuf, req); + + STORE_REQUEST_HEADER (DestroyColorList, req); + req->colorList = color_list; + + END_REQUEST_HEADER (DestroyColorList, pBuf, req); + + UnlockDisplay (display); + SYNC_HANDLE (display); +} + + +void +XiePurgeColorList (display, color_list) + +Display *display; +XieColorList color_list; + +{ + xiePurgeColorListReq *req; + char *pBuf; + + LockDisplay (display); + + GET_REQUEST (PurgeColorList, pBuf); + + BEGIN_REQUEST_HEADER (PurgeColorList, pBuf, req); + + STORE_REQUEST_HEADER (PurgeColorList, req); + req->colorList = color_list; + + END_REQUEST_HEADER (PurgeColorList, pBuf, req); + + UnlockDisplay (display); + SYNC_HANDLE (display); +} + + +Status +XieQueryColorList (display, color_list, colormap_ret, ncolors_ret, colors_ret) + +Display *display; +XieColorList color_list; +Colormap *colormap_ret; +unsigned *ncolors_ret; +unsigned long **colors_ret; + +{ + xieQueryColorListReq *req; + xieQueryColorListReply rep; + char *pBuf; + + LockDisplay (display); + + GET_REQUEST (QueryColorList, pBuf); + + BEGIN_REQUEST_HEADER (QueryColorList, pBuf, req); + + STORE_REQUEST_HEADER (QueryColorList, req); + req->colorList = color_list; + + END_REQUEST_HEADER (QueryColorList, pBuf, req); + + if (_XReply (display, (xReply *)&rep, 0, xFalse) == 0) + { + UnlockDisplay (display); + SYNC_HANDLE (display); + + *colormap_ret = 0; + *ncolors_ret = 0; + *colors_ret = NULL; + + return (0); + } + + *colormap_ret = rep.colormap; + *ncolors_ret = rep.length; + + if (*ncolors_ret) + { + *colors_ret = (unsigned long *) Xmalloc ( + rep.length * sizeof (unsigned long)); + + _XRead32 (display, *colors_ret, rep.length << 2); + } + else + *colors_ret = NULL; + + UnlockDisplay (display); + SYNC_HANDLE (display); + + return (1); +} diff --git a/xie/xc/lib/XIE/conven.c b/xie/xc/lib/XIE/conven.c new file mode 100644 index 0000000..bb547da --- /dev/null +++ b/xie/xc/lib/XIE/conven.c @@ -0,0 +1,1653 @@ +/* $XConsortium: conven.c,v 1.9 94/05/02 14:16:30 mor Exp $ */ + +/* + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#include "XIElibint.h" + +/* + * Element Convenience Functions + */ + +void +XieFloImportClientLUT (element, data_class, band_order, length, levels) + +XiePhotoElement *element; +XieDataClass data_class; +XieOrientation band_order; +XieLTriplet length; +XieLevels levels; + +{ + element->elemType = xieElemImportClientLUT; + element->data.ImportClientLUT.data_class = data_class; + element->data.ImportClientLUT.band_order = band_order; + element->data.ImportClientLUT.length[0] = length[0]; + element->data.ImportClientLUT.length[1] = length[1]; + element->data.ImportClientLUT.length[2] = length[2]; + element->data.ImportClientLUT.levels[0] = levels[0]; + element->data.ImportClientLUT.levels[1] = levels[1]; + element->data.ImportClientLUT.levels[2] = levels[2]; +} + + +void +XieFloImportClientPhoto (element, data_class, width, height, + levels, notify, decode_tech, decode_param) + +XiePhotoElement *element; +XieDataClass data_class; +XieLTriplet width; +XieLTriplet height; +XieLevels levels; +Bool notify; +XieDecodeTechnique decode_tech; +XiePointer decode_param; + +{ + element->elemType = xieElemImportClientPhoto; + element->data.ImportClientPhoto.data_class = data_class; + element->data.ImportClientPhoto.width[0] = width[0]; + element->data.ImportClientPhoto.width[1] = width[1]; + element->data.ImportClientPhoto.width[2] = width[2]; + element->data.ImportClientPhoto.height[0] = height[0]; + element->data.ImportClientPhoto.height[1] = height[1]; + element->data.ImportClientPhoto.height[2] = height[2]; + element->data.ImportClientPhoto.levels[0] = levels[0]; + element->data.ImportClientPhoto.levels[1] = levels[1]; + element->data.ImportClientPhoto.levels[2] = levels[2]; + element->data.ImportClientPhoto.notify = notify; + element->data.ImportClientPhoto.decode_tech = decode_tech; + element->data.ImportClientPhoto.decode_param = decode_param; +} + + +void +XieFloImportClientROI (element, rectangles) + +XiePhotoElement *element; +unsigned int rectangles; + +{ + element->elemType = xieElemImportClientROI; + element->data.ImportClientROI.rectangles = rectangles; +} + + +void +XieFloImportDrawable (element, drawable, src_x, src_y, + width, height, fill, notify) + +XiePhotoElement *element; +Drawable drawable; +int src_x; +int src_y; +unsigned int width; +unsigned int height; +unsigned long fill; +Bool notify; + +{ + element->elemType = xieElemImportDrawable; + element->data.ImportDrawable.drawable = drawable; + element->data.ImportDrawable.src_x = src_x; + element->data.ImportDrawable.src_y = src_y; + element->data.ImportDrawable.width = width; + element->data.ImportDrawable.height = height; + element->data.ImportDrawable.fill = fill; + element->data.ImportDrawable.notify = notify; +} + + +void +XieFloImportDrawablePlane (element, drawable, src_x, src_y, + width, height, fill, bit_plane, notify) + +XiePhotoElement *element; +Drawable drawable; +int src_x; +int src_y; +unsigned int width; +unsigned int height; +unsigned long fill; +unsigned long bit_plane; +Bool notify; + +{ + element->elemType = xieElemImportDrawablePlane; + element->data.ImportDrawablePlane.drawable = drawable; + element->data.ImportDrawablePlane.src_x = src_x; + element->data.ImportDrawablePlane.src_y = src_y; + element->data.ImportDrawablePlane.width = width; + element->data.ImportDrawablePlane.height = height; + element->data.ImportDrawablePlane.fill = fill; + element->data.ImportDrawablePlane.bit_plane = bit_plane; + element->data.ImportDrawablePlane.notify = notify; +} + + +void +XieFloImportLUT (element, lut) + +XiePhotoElement *element; +XieLut lut; + +{ + element->elemType = xieElemImportLUT; + element->data.ImportLUT.lut = lut; +} + + +void +XieFloImportPhotomap (element, photomap, notify) + +XiePhotoElement *element; +XiePhotomap photomap; +Bool notify; + +{ + element->elemType = xieElemImportPhotomap; + element->data.ImportPhotomap.photomap = photomap; + element->data.ImportPhotomap.notify = notify; +} + + +void +XieFloImportROI (element, roi) + +XiePhotoElement *element; +XieRoi roi; + +{ + element->elemType = xieElemImportROI; + element->data.ImportROI.roi = roi; +} + + +void +XieFloArithmetic (element, src1, src2, domain, constant, operator, band_mask) + +XiePhotoElement *element; +XiePhototag src1; +XiePhototag src2; +XieProcessDomain *domain; +XieConstant constant; +XieArithmeticOp operator; +unsigned int band_mask; + +{ + element->elemType = xieElemArithmetic; + element->data.Arithmetic.src1 = src1; + element->data.Arithmetic.src2 = src2; + element->data.Arithmetic.domain.offset_x = domain->offset_x; + element->data.Arithmetic.domain.offset_y = domain->offset_y; + element->data.Arithmetic.domain.phototag = domain->phototag; + element->data.Arithmetic.constant[0] = constant[0]; + element->data.Arithmetic.constant[1] = constant[1]; + element->data.Arithmetic.constant[2] = constant[2]; + element->data.Arithmetic.operator = operator; + element->data.Arithmetic.band_mask = band_mask; +} + + +void +XieFloBandCombine (element, src1, src2, src3) + +XiePhotoElement *element; +XiePhototag src1; +XiePhototag src2; +XiePhototag src3; + +{ + element->elemType = xieElemBandCombine; + element->data.BandCombine.src1 = src1; + element->data.BandCombine.src2 = src2; + element->data.BandCombine.src3 = src3; +} + + +void +XieFloBandExtract (element, src, levels, bias, coefficients) + +XiePhotoElement *element; +XiePhototag src; +unsigned int levels; +double bias; +XieConstant coefficients; + +{ + element->elemType = xieElemBandExtract; + element->data.BandExtract.src = src; + element->data.BandExtract.levels = levels; + element->data.BandExtract.bias = bias; + element->data.BandExtract.coefficients[0] = coefficients[0]; + element->data.BandExtract.coefficients[1] = coefficients[1]; + element->data.BandExtract.coefficients[2] = coefficients[2]; +} + + +void +XieFloBandSelect (element, src, band_number) + +XiePhotoElement *element; +XiePhototag src; +unsigned int band_number; + +{ + element->elemType = xieElemBandSelect; + element->data.BandSelect.src = src; + element->data.BandSelect.band_number = band_number; +} + + +void +XieFloBlend (element, src1, src2, src_constant, + alpha, alpha_constant, domain, band_mask) + +XiePhotoElement *element; +XiePhototag src1; +XiePhototag src2; +XieConstant src_constant; +XiePhototag alpha; +double alpha_constant; +XieProcessDomain *domain; +unsigned int band_mask; + +{ + element->elemType = xieElemBlend; + element->data.Blend.src1 = src1; + element->data.Blend.src2 = src2; + element->data.Blend.src_constant[0] = src_constant[0]; + element->data.Blend.src_constant[1] = src_constant[1]; + element->data.Blend.src_constant[2] = src_constant[2]; + element->data.Blend.alpha = alpha; + element->data.Blend.alpha_constant = alpha_constant; + element->data.Blend.domain.offset_x = domain->offset_x; + element->data.Blend.domain.offset_y = domain->offset_y; + element->data.Blend.domain.phototag = domain->phototag; + element->data.Blend.band_mask = band_mask; +} + + +void +XieFloCompare (element, src1, src2, domain, constant, + operator, combine, band_mask) + +XiePhotoElement *element; +XiePhototag src1; +XiePhototag src2; +XieProcessDomain *domain; +XieConstant constant; +XieCompareOp operator; +Bool combine; +unsigned int band_mask; + +{ + element->elemType = xieElemCompare; + element->data.Compare.src1 = src1; + element->data.Compare.src2 = src2; + element->data.Compare.domain.offset_x = domain->offset_x; + element->data.Compare.domain.offset_y = domain->offset_y; + element->data.Compare.domain.phototag = domain->phototag; + element->data.Compare.constant[0] = constant[0]; + element->data.Compare.constant[1] = constant[1]; + element->data.Compare.constant[2] = constant[2]; + element->data.Compare.operator = operator; + element->data.Compare.combine = combine; + element->data.Compare.band_mask = band_mask; +} + + +void +XieFloConstrain (element, src, levels, constrain_tech, constrain_param) + +XiePhotoElement *element; +XiePhototag src; +XieLevels levels; +XieConstrainTechnique constrain_tech; +XiePointer constrain_param; + +{ + element->elemType = xieElemConstrain; + element->data.Constrain.src = src; + element->data.Constrain.levels[0] = levels[0]; + element->data.Constrain.levels[1] = levels[1]; + element->data.Constrain.levels[2] = levels[2]; + element->data.Constrain.constrain_tech = constrain_tech; + element->data.Constrain.constrain_param = constrain_param; +} + + +void +XieFloConvertFromIndex (element, src, colormap, data_class, precision) + +XiePhotoElement *element; +XiePhototag src; +Colormap colormap; +XieDataClass data_class; +unsigned int precision; + +{ + element->elemType = xieElemConvertFromIndex; + element->data.ConvertFromIndex.src = src; + element->data.ConvertFromIndex.colormap = colormap; + element->data.ConvertFromIndex.data_class = data_class; + element->data.ConvertFromIndex.precision = precision; +} + + +void +XieFloConvertFromRGB (element, src, color_space, color_param) + +XiePhotoElement *element; +XiePhototag src; +XieColorspace color_space; +XiePointer color_param; + +{ + element->elemType = xieElemConvertFromRGB; + element->data.ConvertFromRGB.src = src; + element->data.ConvertFromRGB.color_space = color_space; + element->data.ConvertFromRGB.color_param = color_param; +} + + +void +XieFloConvertToIndex (element, src, colormap, color_list, notify, + color_alloc_tech, color_alloc_param) + +XiePhotoElement *element; +XiePhototag src; +Colormap colormap; +XieColorList color_list; +Bool notify; +XieColorAllocTechnique color_alloc_tech; +XiePointer color_alloc_param; + +{ + element->elemType = xieElemConvertToIndex; + element->data.ConvertToIndex.src = src; + element->data.ConvertToIndex.colormap = colormap; + element->data.ConvertToIndex.color_list = color_list; + element->data.ConvertToIndex.notify = notify; + element->data.ConvertToIndex.color_alloc_tech = color_alloc_tech; + element->data.ConvertToIndex.color_alloc_param = color_alloc_param; +} + + +void +XieFloConvertToRGB (element, src, color_space, color_param) + +XiePhotoElement *element; +XiePhototag src; +XieColorspace color_space; +XiePointer color_param; + +{ + element->elemType = xieElemConvertToRGB; + element->data.ConvertToRGB.src = src; + element->data.ConvertToRGB.color_space = color_space; + element->data.ConvertToRGB.color_param = color_param; +} + + +void +XieFloConvolve (element, src, domain, kernel, kernel_size, band_mask, + convolve_tech, convolve_param) + +XiePhotoElement *element; +XiePhototag src; +XieProcessDomain *domain; +float *kernel; +int kernel_size; +unsigned int band_mask; +XieConvolveTechnique convolve_tech; +XiePointer convolve_param; + +{ + unsigned size; + + element->elemType = xieElemConvolve; + element->data.Convolve.src = src; + element->data.Convolve.domain.offset_x = domain->offset_x; + element->data.Convolve.domain.offset_y = domain->offset_y; + element->data.Convolve.domain.phototag = domain->phototag; + element->data.Convolve.kernel_size = kernel_size; + element->data.Convolve.band_mask = band_mask; + element->data.Convolve.convolve_tech = convolve_tech; + element->data.Convolve.convolve_param = convolve_param; + + size = kernel_size * kernel_size * 4; + element->data.Convolve.kernel = (float *) Xmalloc (size); + memcpy (element->data.Convolve.kernel, kernel, size); +} + + +void +XieFloDither (element, src, band_mask, levels, dither_tech, dither_param) + +XiePhotoElement *element; +XiePhototag src; +unsigned int band_mask; +XieLevels levels; +XieDitherTechnique dither_tech; +XiePointer dither_param; + +{ + element->elemType = xieElemDither; + element->data.Dither.src = src; + element->data.Dither.band_mask = band_mask; + element->data.Dither.levels[0] = levels[0]; + element->data.Dither.levels[1] = levels[1]; + element->data.Dither.levels[2] = levels[2]; + element->data.Dither.dither_tech = dither_tech; + element->data.Dither.dither_param = dither_param; +} + + +void +XieFloGeometry (element, src, width, height, coefficients, constant, + band_mask, sample_tech, sample_param) + +XiePhotoElement *element; +XiePhototag src; +unsigned int width; +unsigned int height; +float coefficients[6]; +XieConstant constant; +unsigned int band_mask; +XieGeometryTechnique sample_tech; +XiePointer sample_param; + +{ + element->elemType = xieElemGeometry; + element->data.Geometry.src = src; + element->data.Geometry.width = width; + element->data.Geometry.height = height; + element->data.Geometry.coefficients[0] = coefficients[0]; + element->data.Geometry.coefficients[1] = coefficients[1]; + element->data.Geometry.coefficients[2] = coefficients[2]; + element->data.Geometry.coefficients[3] = coefficients[3]; + element->data.Geometry.coefficients[4] = coefficients[4]; + element->data.Geometry.coefficients[5] = coefficients[5]; + element->data.Geometry.constant[0] = constant[0]; + element->data.Geometry.constant[1] = constant[1]; + element->data.Geometry.constant[2] = constant[2]; + element->data.Geometry.band_mask = band_mask; + element->data.Geometry.sample_tech = sample_tech; + element->data.Geometry.sample_param = sample_param; +} + + +void +XieFloLogical (element, src1, src2, domain, constant, operator, band_mask) + +XiePhotoElement *element; +XiePhototag src1; +XiePhototag src2; +XieProcessDomain *domain; +XieConstant constant; +unsigned long operator; +unsigned int band_mask; + +{ + element->elemType = xieElemLogical; + element->data.Logical.src1 = src1; + element->data.Logical.src2 = src2; + element->data.Logical.domain.offset_x = domain->offset_x; + element->data.Logical.domain.offset_y = domain->offset_y; + element->data.Logical.domain.phototag = domain->phototag; + element->data.Logical.constant[0] = constant[0]; + element->data.Logical.constant[1] = constant[1]; + element->data.Logical.constant[2] = constant[2]; + element->data.Logical.operator = operator; + element->data.Logical.band_mask = band_mask; +} + + +void +XieFloMatchHistogram (element, src, domain, shape, shape_param) + +XiePhotoElement *element; +XiePhototag src; +XieProcessDomain *domain; +XieHistogramShape shape; +XiePointer shape_param; + +{ + element->elemType = xieElemMatchHistogram; + element->data.MatchHistogram.src = src; + element->data.MatchHistogram.domain.offset_x = domain->offset_x; + element->data.MatchHistogram.domain.offset_y = domain->offset_y; + element->data.MatchHistogram.domain.phototag = domain->phototag; + element->data.MatchHistogram.shape = shape; + element->data.MatchHistogram.shape_param = shape_param; +} + + +void +XieFloMath (element, src, domain, operator, band_mask) + +XiePhotoElement *element; +XiePhototag src; +XieProcessDomain *domain; +XieMathOp operator; +unsigned int band_mask; + +{ + element->elemType = xieElemMath; + element->data.Math.src = src; + element->data.Math.domain.offset_x = domain->offset_x; + element->data.Math.domain.offset_y = domain->offset_y; + element->data.Math.domain.phototag = domain->phototag; + element->data.Math.operator = operator; + element->data.Math.band_mask = band_mask; +} + + +void +XieFloPasteUp (element, width, height, constant, tiles, tile_count) + +XiePhotoElement *element; +unsigned int width; +unsigned int height; +XieConstant constant; +XieTile *tiles; +unsigned int tile_count; + +{ + unsigned size; + + element->elemType = xieElemPasteUp; + element->data.PasteUp.width = width; + element->data.PasteUp.height = height; + element->data.PasteUp.constant[0] = constant[0]; + element->data.PasteUp.constant[1] = constant[1]; + element->data.PasteUp.constant[2] = constant[2]; + element->data.PasteUp.tile_count = tile_count; + + size = tile_count * sizeof (XieTile); + element->data.PasteUp.tiles = (XieTile *) Xmalloc (size); + memcpy (element->data.PasteUp.tiles, tiles, size); +} + + +void +XieFloPoint (element, src, domain, lut, band_mask) + +XiePhotoElement *element; +XiePhototag src; +XieProcessDomain *domain; +XiePhototag lut; +unsigned int band_mask; + +{ + element->elemType = xieElemPoint; + element->data.Point.src = src; + element->data.Point.domain.offset_x = domain->offset_x; + element->data.Point.domain.offset_y = domain->offset_y; + element->data.Point.domain.phototag = domain->phototag; + element->data.Point.lut = lut; + element->data.Point.band_mask = band_mask; +} + +void +XieFloUnconstrain (element, src) + +XiePhotoElement *element; +XiePhototag src; + +{ + element->elemType = xieElemUnconstrain; + element->data.Constrain.src = src; +} + +void +XieFloExportClientHistogram (element, src, domain, notify) + +XiePhotoElement *element; +XiePhototag src; +XieProcessDomain *domain; +XieExportNotify notify; + +{ + element->elemType = xieElemExportClientHistogram; + element->data.ExportClientHistogram.src = src; + element->data.ExportClientHistogram.domain.offset_x = domain->offset_x; + element->data.ExportClientHistogram.domain.offset_y = domain->offset_y; + element->data.ExportClientHistogram.domain.phototag = domain->phototag; + element->data.ExportClientHistogram.notify = notify; +} + + +void +XieFloExportClientLUT (element, src, band_order, notify, start, length) + +XiePhotoElement *element; +XiePhototag src; +XieOrientation band_order; +XieExportNotify notify; +XieLTriplet start; +XieLTriplet length; + +{ + int i; + + element->elemType = xieElemExportClientLUT; + element->data.ExportClientLUT.src = src; + element->data.ExportClientLUT.band_order = band_order; + element->data.ExportClientLUT.notify = notify; + + for (i = 0; i < 3; i++) + { + element->data.ExportClientLUT.start[i] = start[i]; + element->data.ExportClientLUT.length[i] = length[i]; + } + +} + + +void +XieFloExportClientPhoto (element, src, notify, encode_tech, encode_param) + +XiePhotoElement *element; +XiePhototag src; +XieExportNotify notify; +XieEncodeTechnique encode_tech; +XiePointer encode_param; + +{ + element->elemType = xieElemExportClientPhoto; + element->data.ExportClientPhoto.src = src; + element->data.ExportClientPhoto.notify = notify; + element->data.ExportClientPhoto.encode_tech = encode_tech; + element->data.ExportClientPhoto.encode_param = encode_param; +} + + +void +XieFloExportClientROI (element, src, notify) + +XiePhotoElement *element; +XiePhototag src; +XieExportNotify notify; + +{ + element->elemType = xieElemExportClientROI; + element->data.ExportClientROI.src = src; + element->data.ExportClientROI.notify = notify; +} + + +void +XieFloExportDrawable (element, src, drawable, gc, dst_x, dst_y) + +XiePhotoElement *element; +XiePhototag src; +Drawable drawable; +GC gc; +int dst_x; +int dst_y; + +{ + element->elemType = xieElemExportDrawable; + element->data.ExportDrawable.src = src; + element->data.ExportDrawable.drawable = drawable; + element->data.ExportDrawable.gc = gc; + element->data.ExportDrawable.dst_x = dst_x; + element->data.ExportDrawable.dst_y = dst_y; +} + + +void +XieFloExportDrawablePlane (element, src, drawable, gc, dst_x, dst_y) + +XiePhotoElement *element; +XiePhototag src; +Drawable drawable; +GC gc; +int dst_x; +int dst_y; + +{ + element->elemType = xieElemExportDrawablePlane; + element->data.ExportDrawablePlane.src = src; + element->data.ExportDrawablePlane.drawable = drawable; + element->data.ExportDrawablePlane.gc = gc; + element->data.ExportDrawablePlane.dst_x = dst_x; + element->data.ExportDrawablePlane.dst_y = dst_y; +} + + +void +XieFloExportLUT (element, src, lut, merge, start) + +XiePhotoElement *element; +XiePhototag src; +XieLut lut; +Bool merge; +XieLTriplet start; + +{ + int i; + + for (i = 0; i < 3; i++) + element->data.ExportLUT.start[i] = start[i]; + + element->elemType = xieElemExportLUT; + element->data.ExportLUT.merge = merge; + element->data.ExportLUT.src = src; + element->data.ExportLUT.lut = lut; +} + + +void +XieFloExportPhotomap (element, src, photomap, encode_tech, encode_param) + +XiePhotoElement *element; +XiePhototag src; +XiePhotomap photomap; +XieEncodeTechnique encode_tech; +XiePointer encode_param; + +{ + element->elemType = xieElemExportPhotomap; + element->data.ExportPhotomap.src = src; + element->data.ExportPhotomap.photomap = photomap; + element->data.ExportPhotomap.encode_tech = encode_tech; + element->data.ExportPhotomap.encode_param = encode_param; +} + + +void +XieFloExportROI (element, src, roi) + +XiePhotoElement *element; +XiePhototag src; +XieRoi roi; + +{ + element->elemType = xieElemExportROI; + element->data.ExportROI.src = src; + element->data.ExportROI.roi = roi; +} + + + +/* + * Technique Convenience Functions + */ + +XieColorAllocAllParam * +XieTecColorAllocAll (fill) + +unsigned long fill; + +{ + XieColorAllocAllParam *param = (XieColorAllocAllParam *) + Xmalloc (sizeof (XieColorAllocAllParam)); + + param->fill = fill; + + return (param); +} + + +XieColorAllocMatchParam * +XieTecColorAllocMatch (match_limit, gray_limit) + +double match_limit; +double gray_limit; + +{ + XieColorAllocMatchParam *param = (XieColorAllocMatchParam *) + Xmalloc (sizeof (XieColorAllocMatchParam)); + + param->match_limit = match_limit; + param->gray_limit = gray_limit; + + return (param); +} + + +XieColorAllocRequantizeParam * +XieTecColorAllocRequantize (max_cells) + +unsigned long max_cells; + +{ + XieColorAllocRequantizeParam *param = (XieColorAllocRequantizeParam *) + Xmalloc (sizeof (XieColorAllocRequantizeParam)); + + param->max_cells = max_cells; + + return (param); +} + + +XieRGBToCIELabParam * +XieTecRGBToCIELab (matrix, white_adjust_tech, white_adjust_param) + +XieMatrix matrix; +XieWhiteAdjustTechnique white_adjust_tech; +XiePointer white_adjust_param; + +{ + XieRGBToCIELabParam *param = (XieRGBToCIELabParam *) + Xmalloc (sizeof (XieRGBToCIELabParam)); + + memcpy (param->matrix, matrix, sizeof (XieMatrix)); + param->white_adjust_tech = white_adjust_tech; + param->white_adjust_param = white_adjust_param; + + return (param); +} + + +XieRGBToCIEXYZParam * +XieTecRGBToCIEXYZ (matrix, white_adjust_tech, white_adjust_param) + +XieMatrix matrix; +XieWhiteAdjustTechnique white_adjust_tech; +XiePointer white_adjust_param; + +{ + XieRGBToCIEXYZParam *param = (XieRGBToCIEXYZParam *) + Xmalloc (sizeof (XieRGBToCIEXYZParam)); + + memcpy (param->matrix, matrix, sizeof (XieMatrix)); + param->white_adjust_tech = white_adjust_tech; + param->white_adjust_param = white_adjust_param; + + return (param); +} + + +XieRGBToYCbCrParam * +XieTecRGBToYCbCr (levels, luma_red, luma_green, luma_blue, bias) + +XieLevels levels; +double luma_red; +double luma_green; +double luma_blue; +XieConstant bias; + +{ + XieRGBToYCbCrParam *param = (XieRGBToYCbCrParam *) + Xmalloc (sizeof (XieRGBToYCbCrParam)); + + param->levels[0] = levels[0]; + param->levels[1] = levels[1]; + param->levels[2] = levels[2]; + param->luma_red = luma_red; + param->luma_green = luma_green; + param->luma_blue = luma_blue; + param->bias[0] = bias[0]; + param->bias[1] = bias[1]; + param->bias[2] = bias[2]; + + return (param); +} + + +XieRGBToYCCParam * +XieTecRGBToYCC (levels, luma_red, luma_green, luma_blue, scale) + +XieLevels levels; +double luma_red; +double luma_green; +double luma_blue; +double scale; + +{ + XieRGBToYCCParam *param = (XieRGBToYCCParam *) + Xmalloc (sizeof (XieRGBToYCCParam)); + + param->levels[0] = levels[0]; + param->levels[1] = levels[1]; + param->levels[2] = levels[2]; + param->luma_red = luma_red; + param->luma_green = luma_green; + param->luma_blue = luma_blue; + param->scale = scale; + + return (param); +} + + +XieCIELabToRGBParam * +XieTecCIELabToRGB (matrix, white_adjust_tech, white_adjust_param, + gamut_tech, gamut_param) + +XieMatrix matrix; +XieWhiteAdjustTechnique white_adjust_tech; +XiePointer white_adjust_param; +XieGamutTechnique gamut_tech; +XiePointer gamut_param; + +{ + XieCIELabToRGBParam *param = (XieCIELabToRGBParam *) + Xmalloc (sizeof (XieCIELabToRGBParam)); + + memcpy (param->matrix, matrix, sizeof (XieMatrix)); + param->white_adjust_tech = white_adjust_tech; + param->white_adjust_param = white_adjust_param; + param->gamut_tech = gamut_tech; + param->gamut_param = gamut_param; + + return (param); +} + + +XieCIEXYZToRGBParam * +XieTecCIEXYZToRGB (matrix, white_adjust_tech, white_adjust_param, + gamut_tech, gamut_param) + +XieMatrix matrix; +XieWhiteAdjustTechnique white_adjust_tech; +XiePointer white_adjust_param; +XieGamutTechnique gamut_tech; +XiePointer gamut_param; + +{ + XieCIEXYZToRGBParam *param = (XieCIEXYZToRGBParam *) + Xmalloc (sizeof (XieCIEXYZToRGBParam)); + + memcpy (param->matrix, matrix, sizeof (XieMatrix)); + param->white_adjust_tech = white_adjust_tech; + param->white_adjust_param = white_adjust_param; + param->gamut_tech = gamut_tech; + param->gamut_param = gamut_param; + + return (param); +} + + +XieYCbCrToRGBParam * +XieTecYCbCrToRGB (levels, luma_red, luma_green, luma_blue, bias, + gamut_tech, gamut_param) + +XieLevels levels; +double luma_red; +double luma_green; +double luma_blue; +XieConstant bias; +XieGamutTechnique gamut_tech; +XiePointer gamut_param; + +{ + XieYCbCrToRGBParam *param = (XieYCbCrToRGBParam *) + Xmalloc (sizeof (XieYCbCrToRGBParam)); + + param->levels[0] = levels[0]; + param->levels[1] = levels[1]; + param->levels[2] = levels[2]; + param->luma_red = luma_red; + param->luma_green = luma_green; + param->luma_blue = luma_blue; + param->bias[0] = bias[0]; + param->bias[1] = bias[1]; + param->bias[2] = bias[2]; + param->gamut_tech = gamut_tech; + param->gamut_param = gamut_param; + + return (param); +} + + +XieYCCToRGBParam * +XieTecYCCToRGB (levels, luma_red, luma_green, luma_blue, scale, + gamut_tech, gamut_param) + +XieLevels levels; +double luma_red; +double luma_green; +double luma_blue; +double scale; +XieGamutTechnique gamut_tech; +XiePointer gamut_param; + +{ + XieYCCToRGBParam *param = (XieYCCToRGBParam *) + Xmalloc (sizeof (XieYCCToRGBParam)); + + param->levels[0] = levels[0]; + param->levels[1] = levels[1]; + param->levels[2] = levels[2]; + param->luma_red = luma_red; + param->luma_green = luma_green; + param->luma_blue = luma_blue; + param->scale = scale; + param->gamut_tech = gamut_tech; + param->gamut_param = gamut_param; + + return (param); +} + + +XieClipScaleParam * +XieTecClipScale (in_low, in_high, out_low, out_high) + +XieConstant in_low; +XieConstant in_high; +XieLTriplet out_low; +XieLTriplet out_high; + +{ + int i; + + XieClipScaleParam *param = (XieClipScaleParam *) + Xmalloc (sizeof (XieClipScaleParam)); + + for (i = 0; i < 3; i++) + { + param->input_low[i] = in_low[i]; + param->input_high[i] = in_high[i]; + param->output_low[i] = out_low[i]; + param->output_high[i] = out_high[i]; + } + + return (param); +} + + +XieConvolveConstantParam * +XieTecConvolveConstant (constant) + +XieConstant constant; + +{ + XieConvolveConstantParam *param = (XieConvolveConstantParam *) + Xmalloc (sizeof (XieConvolveConstantParam)); + + param->constant[0] = constant[0]; + param->constant[1] = constant[1]; + param->constant[2] = constant[2]; + + return (param); +} + + +XieDecodeUncompressedSingleParam * +XieTecDecodeUncompressedSingle (fill_order, pixel_order, pixel_stride, + left_pad, scanline_pad) + +XieOrientation fill_order; +XieOrientation pixel_order; +unsigned int pixel_stride; +unsigned int left_pad; +unsigned int scanline_pad; + +{ + XieDecodeUncompressedSingleParam *param = + (XieDecodeUncompressedSingleParam *) Xmalloc ( + sizeof (XieDecodeUncompressedSingleParam)); + + param->fill_order = fill_order; + param->pixel_order = pixel_order; + param->pixel_stride = pixel_stride; + param->left_pad = left_pad; + param->scanline_pad = scanline_pad; + + return (param); +} + + +XieDecodeUncompressedTripleParam * +XieTecDecodeUncompressedTriple (fill_order, pixel_order, band_order, + interleave, pixel_stride, left_pad, scanline_pad) + +XieOrientation fill_order; +XieOrientation pixel_order; +XieOrientation band_order; +XieInterleave interleave; +unsigned char pixel_stride[3]; +unsigned char left_pad[3]; +unsigned char scanline_pad[3]; + +{ + XieDecodeUncompressedTripleParam *param = + (XieDecodeUncompressedTripleParam *) Xmalloc ( + sizeof (XieDecodeUncompressedTripleParam)); + + param->left_pad[0] = left_pad[0]; + param->left_pad[1] = left_pad[1]; + param->left_pad[2] = left_pad[2]; + param->fill_order = fill_order; + param->pixel_stride[0] = pixel_stride[0]; + param->pixel_stride[1] = pixel_stride[1]; + param->pixel_stride[2] = pixel_stride[2]; + param->pixel_order = pixel_order; + param->scanline_pad[0] = scanline_pad[0]; + param->scanline_pad[1] = scanline_pad[1]; + param->scanline_pad[2] = scanline_pad[2]; + param->band_order = band_order; + param->interleave = interleave; + + return (param); +} + + +XieDecodeG31DParam * +XieTecDecodeG31D (encoded_order, normal, radiometric) + +XieOrientation encoded_order; +Bool normal; +Bool radiometric; + +{ + XieDecodeG31DParam *param = (XieDecodeG31DParam *) + Xmalloc (sizeof (XieDecodeG31DParam)); + + param->encoded_order = encoded_order; + param->normal = normal; + param->radiometric = radiometric; + + return (param); +} + + +XieDecodeG32DParam * +XieTecDecodeG32D (encoded_order, normal, radiometric) + +XieOrientation encoded_order; +Bool normal; +Bool radiometric; + +{ + XieDecodeG32DParam *param = (XieDecodeG32DParam *) + Xmalloc (sizeof (XieDecodeG32DParam)); + + param->encoded_order = encoded_order; + param->normal = normal; + param->radiometric = radiometric; + + return (param); +} + + +XieDecodeG42DParam * +XieTecDecodeG42D (encoded_order, normal, radiometric) + +XieOrientation encoded_order; +Bool normal; +Bool radiometric; + +{ + XieDecodeG42DParam *param = (XieDecodeG42DParam *) + Xmalloc (sizeof (XieDecodeG42DParam)); + + param->encoded_order = encoded_order; + param->normal = normal; + param->radiometric = radiometric; + + return (param); +} + + +XieDecodeTIFF2Param * +XieTecDecodeTIFF2 (encoded_order, normal, radiometric) + +XieOrientation encoded_order; +Bool normal; +Bool radiometric; + +{ + XieDecodeTIFF2Param *param = (XieDecodeTIFF2Param *) + Xmalloc (sizeof (XieDecodeTIFF2Param)); + + param->encoded_order = encoded_order; + param->normal = normal; + param->radiometric = radiometric; + + return (param); +} + + +XieDecodeTIFFPackBitsParam * +XieTecDecodeTIFFPackBits (encoded_order, normal) + +XieOrientation encoded_order; +Bool normal; + +{ + XieDecodeTIFFPackBitsParam *param = (XieDecodeTIFFPackBitsParam *) + Xmalloc (sizeof (XieDecodeTIFFPackBitsParam)); + + param->encoded_order = encoded_order; + param->normal = normal; + + return (param); +} + + +XieDecodeJPEGBaselineParam * +XieTecDecodeJPEGBaseline (interleave, band_order, up_sample) + +XieInterleave interleave; +XieOrientation band_order; +Bool up_sample; + +{ + XieDecodeJPEGBaselineParam *param = (XieDecodeJPEGBaselineParam *) + Xmalloc (sizeof (XieDecodeJPEGBaselineParam)); + + param->interleave = interleave; + param->band_order = band_order; + param->up_sample = up_sample; + + return (param); +} + + +XieDecodeJPEGLosslessParam * +XieTecDecodeJPEGLossless (interleave, band_order) + +XieInterleave interleave; +XieOrientation band_order; + +{ + XieDecodeJPEGLosslessParam *param = (XieDecodeJPEGLosslessParam *) + Xmalloc (sizeof (XieDecodeJPEGLosslessParam)); + + param->interleave = interleave; + param->band_order = band_order; + + return (param); +} + + +XieDitherOrderedParam * +XieTecDitherOrderedParam (threshold_order) + +unsigned int threshold_order; + +{ + XieDitherOrderedParam *param = (XieDitherOrderedParam *) + Xmalloc (sizeof (XieDitherOrderedParam)); + + param->threshold_order = threshold_order; + + return (param); +} + + +XieEncodeUncompressedSingleParam * +XieTecEncodeUncompressedSingle (fill_order, pixel_order, + pixel_stride, scanline_pad) + +XieOrientation fill_order; +XieOrientation pixel_order; +unsigned int pixel_stride; +unsigned int scanline_pad; + +{ + XieEncodeUncompressedSingleParam *param = + (XieEncodeUncompressedSingleParam *) Xmalloc ( + sizeof (XieEncodeUncompressedSingleParam)); + + param->fill_order = fill_order; + param->pixel_order = pixel_order; + param->pixel_stride = pixel_stride; + param->scanline_pad = scanline_pad; + + return (param); +} + + +XieEncodeUncompressedTripleParam * +XieTecEncodeUncompressedTriple (fill_order, pixel_order, band_order, + interleave, pixel_stride, scanline_pad) + +XieOrientation fill_order; +XieOrientation pixel_order; +XieOrientation band_order; +XieInterleave interleave; +unsigned char pixel_stride[3]; +unsigned char scanline_pad[3]; + +{ + XieEncodeUncompressedTripleParam *param = + (XieEncodeUncompressedTripleParam *) Xmalloc ( + sizeof (XieEncodeUncompressedTripleParam)); + + param->pixel_stride[0] = pixel_stride[0]; + param->pixel_stride[1] = pixel_stride[1]; + param->pixel_stride[2] = pixel_stride[2]; + param->pixel_order = pixel_order; + param->scanline_pad[0] = scanline_pad[0]; + param->scanline_pad[1] = scanline_pad[1]; + param->scanline_pad[2] = scanline_pad[2]; + param->fill_order = fill_order; + param->band_order = band_order; + param->interleave = interleave; + + return (param); +} + + +XieEncodeG31DParam * +XieTecEncodeG31D (align_eol, radiometric, encoded_order) + +Bool align_eol; +Bool radiometric; +XieOrientation encoded_order; + +{ + XieEncodeG31DParam *param = (XieEncodeG31DParam *) + Xmalloc (sizeof (XieEncodeG31DParam)); + + param->align_eol = align_eol; + param->radiometric = radiometric; + param->encoded_order = encoded_order; + + return (param); +} + + +XieEncodeG32DParam * +XieTecEncodeG32D (uncompressed, align_eol, radiometric, + encoded_order, k_factor) + +Bool uncompressed; +Bool align_eol; +Bool radiometric; +XieOrientation encoded_order; +unsigned long k_factor; + +{ + XieEncodeG32DParam *param = (XieEncodeG32DParam *) + Xmalloc (sizeof (XieEncodeG32DParam)); + + param->uncompressed = uncompressed; + param->align_eol = align_eol; + param->radiometric = radiometric; + param->encoded_order = encoded_order; + param->k_factor = k_factor; + + return (param); +} + + +XieEncodeG42DParam * +XieTecEncodeG42D (uncompressed, radiometric, encoded_order) + +Bool uncompressed; +Bool radiometric; +XieOrientation encoded_order; + +{ + XieEncodeG42DParam *param = (XieEncodeG42DParam *) + Xmalloc (sizeof (XieEncodeG42DParam)); + + param->uncompressed = uncompressed; + param->radiometric = radiometric; + param->encoded_order = encoded_order; + + return (param); +} + + +XieEncodeJPEGBaselineParam * +XieTecEncodeJPEGBaseline (interleave, band_order, + horizontal_samples, vertical_samples, + q_table, q_size, + ac_table, ac_size, + dc_table, dc_size) + +XieInterleave interleave; +XieOrientation band_order; +unsigned char horizontal_samples[3]; +unsigned char vertical_samples[3]; +char *q_table; +unsigned int q_size; +char *ac_table; +unsigned int ac_size; +char *dc_table; +unsigned int dc_size; + +{ + XieEncodeJPEGBaselineParam *param = (XieEncodeJPEGBaselineParam *) + Xmalloc (sizeof (XieEncodeJPEGBaselineParam)); + + param->interleave = interleave; + param->band_order = band_order; + + param->horizontal_samples[0] = horizontal_samples[0]; + param->horizontal_samples[1] = horizontal_samples[1]; + param->horizontal_samples[2] = horizontal_samples[2]; + + param->vertical_samples[0] = vertical_samples[0]; + param->vertical_samples[1] = vertical_samples[1]; + param->vertical_samples[2] = vertical_samples[2]; + + param->q_size = q_size; + param->ac_size = ac_size; + param->dc_size = dc_size; + + param->q_table = (char *) Xmalloc (q_size); + param->ac_table = (char *) Xmalloc (ac_size); + param->dc_table = (char *) Xmalloc (dc_size); + + memcpy (param->q_table, q_table, q_size); + memcpy (param->ac_table, ac_table, ac_size); + memcpy (param->dc_table, dc_table, dc_size); + + return (param); +} + + +XieEncodeJPEGLosslessParam * +XieTecEncodeJPEGLossless (interleave, band_order, predictor, table, table_size) + +XieInterleave interleave; +XieOrientation band_order; +unsigned char predictor[3]; +char *table; +unsigned int table_size; + +{ + XieEncodeJPEGLosslessParam *param = (XieEncodeJPEGLosslessParam *) + Xmalloc (sizeof (XieEncodeJPEGLosslessParam)); + + param->interleave = interleave; + param->band_order = band_order; + param->predictor[0] = predictor[0]; + param->predictor[1] = predictor[1]; + param->predictor[2] = predictor[2]; + param->table_size = table_size; + + param->table = (char *) Xmalloc (table_size); + memcpy (param->table, table, table_size); + + return (param); +} + + +XieEncodeTIFF2Param * +XieTecEncodeTIFF2 (encoded_order, radiometric) + +XieOrientation encoded_order; +Bool radiometric; + +{ + XieEncodeTIFF2Param *param = (XieEncodeTIFF2Param *) + Xmalloc (sizeof (XieEncodeTIFF2Param)); + + param->encoded_order = encoded_order; + param->radiometric = radiometric; + + return (param); +} + + +XieEncodeTIFFPackBitsParam * +XieTecEncodeTIFFPackBits (encoded_order) + +XieOrientation encoded_order; + +{ + XieEncodeTIFFPackBitsParam *param = (XieEncodeTIFFPackBitsParam *) + Xmalloc (sizeof (XieEncodeTIFFPackBitsParam)); + + param->encoded_order = encoded_order; + + return (param); +} + +XieEncodeServerChoiceParam * +XieTecEncodeServerChoice (preference) + +unsigned int preference; + +{ + XieEncodeServerChoiceParam *param = (XieEncodeServerChoiceParam *) + Xmalloc (sizeof (XieEncodeServerChoiceParam)); + + param->preference = preference; + + return (param); +} + + +XieGeomAntialiasByAreaParam * +XieTecGeomAntialiasByArea (simple) + +int simple; + +{ + XieGeomAntialiasByAreaParam *param = (XieGeomAntialiasByAreaParam *) + Xmalloc (sizeof (XieGeomAntialiasByAreaParam)); + + param->simple = simple; + + return (param); +} + + +XieGeomAntialiasByLowpassParam * +XieTecGeomAntialiasByLowpass (kernel_size) + +int kernel_size; + +{ + XieGeomAntialiasByLowpassParam *param = (XieGeomAntialiasByLowpassParam *) + Xmalloc (sizeof (XieGeomAntialiasByLowpassParam)); + + param->kernel_size = kernel_size; + + return (param); +} + + +XieGeomGaussianParam * +XieTecGeomGaussian (sigma, normalize, radius, simple) + +double sigma; +double normalize; +unsigned int radius; +Bool simple; + +{ + XieGeomGaussianParam *param = (XieGeomGaussianParam *) + Xmalloc (sizeof (XieGeomGaussianParam)); + + param->sigma = sigma; + param->normalize = normalize; + param->radius = radius; + param->simple = simple; + + return (param); +} + + +XieGeomNearestNeighborParam * +XieTecGeomNearestNeighbor (modify) + +unsigned int modify; + +{ + XieGeomNearestNeighborParam *param = (XieGeomNearestNeighborParam *) + Xmalloc (sizeof (XieGeomNearestNeighborParam)); + + param->modify = modify; + + return (param); +} + +XieHistogramGaussianParam * +XieTecHistogramGaussian (mean, sigma) + +double mean; +double sigma; + +{ + XieHistogramGaussianParam *param = (XieHistogramGaussianParam *) + Xmalloc (sizeof (XieHistogramGaussianParam)); + + param->mean = mean; + param->sigma = sigma; + + return (param); +} + + +XieHistogramHyperbolicParam * +XieTecHistogramHyperbolic (constant, shape_factor) + +double constant; +Bool shape_factor; + +{ + XieHistogramHyperbolicParam *param = (XieHistogramHyperbolicParam *) + Xmalloc (sizeof (XieHistogramHyperbolicParam)); + + param->constant = constant; + param->shape_factor = shape_factor; + + return (param); +} + + +XieWhiteAdjustCIELabShiftParam * +XieTecWhiteAdjustCIELabShift (white_point) + +XieConstant white_point; + +{ + XieWhiteAdjustCIELabShiftParam *param = (XieWhiteAdjustCIELabShiftParam *) + Xmalloc (sizeof (XieWhiteAdjustCIELabShiftParam)); + + param->white_point[0] = white_point[0]; + param->white_point[1] = white_point[1]; + param->white_point[2] = white_point[2]; + + return (param); +} diff --git a/xie/xc/lib/XIE/elements.c b/xie/xc/lib/XIE/elements.c new file mode 100644 index 0000000..45061fe --- /dev/null +++ b/xie/xc/lib/XIE/elements.c @@ -0,0 +1,1262 @@ +/* $XConsortium: elements.c,v 1.5 94/04/17 20:18:21 rws Exp $ */ + +/* + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#include "XIElibint.h" +#include "elements.h" + +#include + + +int +_XiePhotofloSize (elem_list, elem_count) + +XiePhotoElement *elem_list; +int elem_count; + +{ + XiePhotoElement *elemSrc; + int size = 0; + int i; + + for (i = 0; i < elem_count; i++) + { + elemSrc = &elem_list[i]; + + switch (elemSrc->elemType) + { + case xieElemImportClientLUT: + size += SIZEOF (xieFloImportClientLUT); + break; + + case xieElemImportClientPhoto: + size += SIZEOF (xieFloImportClientPhoto) + + (_XieTechniqueLength (xieValDecode, + elemSrc->data.ImportClientPhoto.decode_tech, + elemSrc->data.ImportClientPhoto.decode_param) << 2); + break; + + case xieElemImportClientROI: + size += SIZEOF (xieFloImportClientROI); + break; + + case xieElemImportDrawable: + size += SIZEOF (xieFloImportDrawable); + break; + + case xieElemImportDrawablePlane: + size += SIZEOF (xieFloImportDrawablePlane); + break; + + case xieElemImportLUT: + size += SIZEOF (xieFloImportLUT); + break; + + case xieElemImportPhotomap: + size += SIZEOF (xieFloImportPhotomap); + break; + + case xieElemImportROI: + size += SIZEOF (xieFloImportROI); + break; + + case xieElemArithmetic: + size += SIZEOF (xieFloArithmetic); + break; + + case xieElemBandCombine: + size += SIZEOF (xieFloBandCombine); + break; + + case xieElemBandExtract: + size += SIZEOF (xieFloBandExtract); + break; + + case xieElemBandSelect: + size += SIZEOF (xieFloBandSelect); + break; + + case xieElemBlend: + size += SIZEOF (xieFloBlend); + break; + + case xieElemCompare: + size += SIZEOF (xieFloCompare); + break; + + case xieElemConstrain: + size += SIZEOF (xieFloConstrain) + + (_XieTechniqueLength (xieValConstrain, + elemSrc->data.Constrain.constrain_tech, + elemSrc->data.Constrain.constrain_param) << 2); + break; + + case xieElemConvertFromIndex: + size += SIZEOF (xieFloConvertFromIndex); + break; + + case xieElemConvertFromRGB: + size += SIZEOF (xieFloConvertFromRGB) + + (_XieTechniqueLength (xieValConvertFromRGB, + elemSrc->data.ConvertFromRGB.color_space, + elemSrc->data.ConvertFromRGB.color_param) << 2); + break; + + case xieElemConvertToIndex: + size += SIZEOF (xieFloConvertToIndex) + + (_XieTechniqueLength (xieValColorAlloc, + elemSrc->data.ConvertToIndex.color_alloc_tech, + elemSrc->data.ConvertToIndex.color_alloc_param) << 2); + break; + + case xieElemConvertToRGB: + size += SIZEOF (xieFloConvertToRGB) + + (_XieTechniqueLength (xieValConvertToRGB, + elemSrc->data.ConvertToRGB.color_space, + elemSrc->data.ConvertToRGB.color_param) << 2); + break; + + case xieElemConvolve: + size += SIZEOF (xieFloConvolve) + + (4 * elemSrc->data.Convolve.kernel_size * + elemSrc->data.Convolve.kernel_size) + + (_XieTechniqueLength (xieValConvolve, + elemSrc->data.Convolve.convolve_tech, + elemSrc->data.Convolve.convolve_param) << 2); + break; + + case xieElemDither: + size += SIZEOF (xieFloDither) + + (_XieTechniqueLength (xieValDither, + elemSrc->data.Dither.dither_tech, + elemSrc->data.Dither.dither_param) << 2); + break; + + case xieElemGeometry: + size += SIZEOF (xieFloGeometry) + + (_XieTechniqueLength (xieValGeometry, + elemSrc->data.Geometry.sample_tech, + elemSrc->data.Geometry.sample_param) << 2); + break; + + case xieElemLogical: + size += SIZEOF (xieFloLogical); + break; + + case xieElemMatchHistogram: + size += SIZEOF (xieFloMatchHistogram) + + (_XieTechniqueLength (xieValHistogram, + elemSrc->data.MatchHistogram.shape, + elemSrc->data.MatchHistogram.shape_param) << 2); + break; + + case xieElemMath: + size += SIZEOF (xieFloMath); + break; + + case xieElemPasteUp: + size += SIZEOF (xieFloPasteUp) + + elemSrc->data.PasteUp.tile_count * SIZEOF (xieTypTile); + break; + + case xieElemPoint: + size += SIZEOF (xieFloPoint); + break; + + case xieElemUnconstrain: + size += SIZEOF (xieFloUnconstrain); + break; + + case xieElemExportClientHistogram: + size += SIZEOF (xieFloExportClientHistogram); + break; + + case xieElemExportClientLUT: + size += SIZEOF (xieFloExportClientLUT); + break; + + case xieElemExportClientPhoto: + size += SIZEOF (xieFloExportClientPhoto) + + (_XieTechniqueLength (xieValEncode, + elemSrc->data.ExportClientPhoto.encode_tech, + elemSrc->data.ExportClientPhoto.encode_param) << 2); + break; + + case xieElemExportClientROI: + size += SIZEOF (xieFloExportClientROI); + break; + + case xieElemExportDrawable: + size += SIZEOF (xieFloExportDrawable); + break; + + case xieElemExportDrawablePlane: + size += SIZEOF (xieFloExportDrawablePlane); + break; + + case xieElemExportLUT: + size += SIZEOF (xieFloExportLUT); + break; + + case xieElemExportPhotomap: + size += SIZEOF (xieFloExportPhotomap) + + (_XieTechniqueLength (xieValEncode, + elemSrc->data.ExportPhotomap.encode_tech, + elemSrc->data.ExportPhotomap.encode_param) << 2); + break; + + case xieElemExportROI: + size += SIZEOF (xieFloExportROI); + break; + + default: + break; + } + } + + return (size); +} + + +void +_XieElemImportClientLUT (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloImportClientLUT *elemDest; + + BEGIN_ELEM_HEAD (ImportClientLUT, elemSrc, + LENOF (xieFloImportClientLUT), *bufDest, elemDest); + + elemDest->class = elemSrc->data.ImportClientLUT.data_class; + elemDest->bandOrder = elemSrc->data.ImportClientLUT.band_order; + elemDest->length0 = elemSrc->data.ImportClientLUT.length[0]; + elemDest->length1 = elemSrc->data.ImportClientLUT.length[1]; + elemDest->length2 = elemSrc->data.ImportClientLUT.length[2]; + elemDest->levels0 = elemSrc->data.ImportClientLUT.levels[0]; + elemDest->levels1 = elemSrc->data.ImportClientLUT.levels[1]; + elemDest->levels2 = elemSrc->data.ImportClientLUT.levels[2]; + + END_ELEM_HEAD (ImportClientLUT, *bufDest, elemDest); +} + + +void +_XieElemImportClientPhoto (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloImportClientPhoto *elemDest; + unsigned techLen; + + techLen = _XieTechniqueLength (xieValDecode, + elemSrc->data.ImportClientPhoto.decode_tech, + elemSrc->data.ImportClientPhoto.decode_param); + + BEGIN_ELEM_HEAD (ImportClientPhoto, elemSrc, + LENOF (xieFloImportClientPhoto) + techLen, *bufDest, elemDest); + + elemDest->notify = elemSrc->data.ImportClientPhoto.notify; + elemDest->class = elemSrc->data.ImportClientPhoto.data_class; + elemDest->width0 = elemSrc->data.ImportClientPhoto.width[0]; + elemDest->width1 = elemSrc->data.ImportClientPhoto.width[1]; + elemDest->width2 = elemSrc->data.ImportClientPhoto.width[2]; + elemDest->height0 = elemSrc->data.ImportClientPhoto.height[0]; + elemDest->height1 = elemSrc->data.ImportClientPhoto.height[1]; + elemDest->height2 = elemSrc->data.ImportClientPhoto.height[2]; + elemDest->levels0 = elemSrc->data.ImportClientPhoto.levels[0]; + elemDest->levels1 = elemSrc->data.ImportClientPhoto.levels[1]; + elemDest->levels2 = elemSrc->data.ImportClientPhoto.levels[2]; + elemDest->decodeTechnique = elemSrc->data.ImportClientPhoto.decode_tech; + elemDest->lenParams = techLen; + + END_ELEM_HEAD (ImportClientPhoto, *bufDest, elemDest); + + /* Technique dependent decode params */ + + _XieEncodeTechnique (bufDest, xieValDecode, + elemSrc->data.ImportClientPhoto.decode_tech, + elemSrc->data.ImportClientPhoto.decode_param); +} + + +void +_XieElemImportClientROI (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloImportClientROI *elemDest; + + BEGIN_ELEM_HEAD (ImportClientROI, elemSrc, + LENOF (xieFloImportClientROI), *bufDest, elemDest); + + elemDest->rectangles = elemSrc->data.ImportClientROI.rectangles; + + END_ELEM_HEAD (ImportClientROI, *bufDest, elemDest); +} + + +void +_XieElemImportDrawable (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloImportDrawable *elemDest; + + BEGIN_ELEM_HEAD (ImportDrawable, elemSrc, + LENOF (xieFloImportDrawable), *bufDest, elemDest); + + elemDest->drawable = elemSrc->data.ImportDrawable.drawable; + elemDest->srcX = elemSrc->data.ImportDrawable.src_x; + elemDest->srcY = elemSrc->data.ImportDrawable.src_y; + elemDest->width = elemSrc->data.ImportDrawable.width; + elemDest->height = elemSrc->data.ImportDrawable.height; + elemDest->fill = elemSrc->data.ImportDrawable.fill; + elemDest->notify = elemSrc->data.ImportDrawable.notify; + + END_ELEM_HEAD (ImportDrawable, *bufDest, elemDest); +} + + +void +_XieElemImportDrawablePlane (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloImportDrawablePlane *elemDest; + + BEGIN_ELEM_HEAD (ImportDrawablePlane, elemSrc, + LENOF (xieFloImportDrawablePlane), *bufDest, elemDest); + + elemDest->drawable = elemSrc->data.ImportDrawablePlane.drawable; + elemDest->srcX = elemSrc->data.ImportDrawablePlane.src_x; + elemDest->srcY = elemSrc->data.ImportDrawablePlane.src_y; + elemDest->width = elemSrc->data.ImportDrawablePlane.width; + elemDest->height = elemSrc->data.ImportDrawablePlane.height; + elemDest->fill = elemSrc->data.ImportDrawablePlane.fill; + elemDest->bitPlane = elemSrc->data.ImportDrawablePlane.bit_plane; + elemDest->notify = elemSrc->data.ImportDrawablePlane.notify; + + END_ELEM_HEAD (ImportDrawablePlane, *bufDest, elemDest); +} + + +void +_XieElemImportLUT (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloImportLUT *elemDest; + + BEGIN_ELEM_HEAD (ImportLUT, elemSrc, + LENOF (xieFloImportLUT), *bufDest, elemDest); + + elemDest->lut = elemSrc->data.ImportLUT.lut; + + END_ELEM_HEAD (ImportLUT, *bufDest, elemDest); +} + + +void +_XieElemImportPhotomap (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloImportPhotomap *elemDest; + + BEGIN_ELEM_HEAD (ImportPhotomap, elemSrc, + LENOF (xieFloImportPhotomap), *bufDest, elemDest); + + elemDest->photomap = elemSrc->data.ImportPhotomap.photomap; + elemDest->notify = elemSrc->data.ImportPhotomap.notify; + + END_ELEM_HEAD (ImportPhotomap, *bufDest, elemDest); +} + + +void +_XieElemImportROI (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloImportROI *elemDest; + + BEGIN_ELEM_HEAD (ImportROI, elemSrc, + LENOF (xieFloImportROI), *bufDest, elemDest); + + elemDest->roi = elemSrc->data.ImportROI.roi; + + END_ELEM_HEAD (ImportROI, *bufDest, elemDest); +} + + +void +_XieElemArithmetic (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloArithmetic *elemDest; + + BEGIN_ELEM_HEAD (Arithmetic, elemSrc, + LENOF (xieFloArithmetic), *bufDest, elemDest); + + elemDest->src1 = elemSrc->data.Arithmetic.src1; + elemDest->src2 = elemSrc->data.Arithmetic.src2; + elemDest->domainOffsetX = elemSrc->data.Arithmetic.domain.offset_x; + elemDest->domainOffsetY = elemSrc->data.Arithmetic.domain.offset_y; + elemDest->domainPhototag = elemSrc->data.Arithmetic.domain.phototag; + elemDest->operator = elemSrc->data.Arithmetic.operator; + elemDest->bandMask = elemSrc->data.Arithmetic.band_mask; + elemDest->constant0 = + _XieConvertToIEEE (elemSrc->data.Arithmetic.constant[0]); + elemDest->constant1 = + _XieConvertToIEEE (elemSrc->data.Arithmetic.constant[1]); + elemDest->constant2 = + _XieConvertToIEEE (elemSrc->data.Arithmetic.constant[2]); + + END_ELEM_HEAD (Arithmetic, *bufDest, elemDest); +} + + +void +_XieElemBandCombine (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloBandCombine *elemDest; + + BEGIN_ELEM_HEAD (BandCombine, elemSrc, + LENOF (xieFloBandCombine), *bufDest, elemDest); + + elemDest->src1 = elemSrc->data.BandCombine.src1; + elemDest->src2 = elemSrc->data.BandCombine.src2; + elemDest->src3 = elemSrc->data.BandCombine.src3; + + END_ELEM_HEAD (BandCombine, *bufDest, elemDest); +} + + +void +_XieElemBandExtract (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloBandExtract *elemDest; + + BEGIN_ELEM_HEAD (BandExtract, elemSrc, + LENOF (xieFloBandExtract), *bufDest, elemDest); + + elemDest->src = elemSrc->data.BandExtract.src; + elemDest->levels = elemSrc->data.BandExtract.levels; + elemDest->bias = + _XieConvertToIEEE (elemSrc->data.BandExtract.bias); + elemDest->constant0 = + _XieConvertToIEEE (elemSrc->data.BandExtract.coefficients[0]); + elemDest->constant1 = + _XieConvertToIEEE (elemSrc->data.BandExtract.coefficients[1]); + elemDest->constant2 = + _XieConvertToIEEE (elemSrc->data.BandExtract.coefficients[2]); + END_ELEM_HEAD (BandExtract, *bufDest, elemDest); +} + +void +_XieElemBandSelect (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloBandSelect *elemDest; + + BEGIN_ELEM_HEAD (BandSelect, elemSrc, + LENOF (xieFloBandSelect), *bufDest, elemDest); + + elemDest->src = elemSrc->data.BandSelect.src; + elemDest->bandNumber= elemSrc->data.BandSelect.band_number; + + END_ELEM_HEAD (BandSelect, *bufDest, elemDest); +} + + +void +_XieElemBlend (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloBlend *elemDest; + + BEGIN_ELEM_HEAD (Blend, elemSrc, + LENOF (xieFloBlend), *bufDest, elemDest); + + elemDest->src1 = elemSrc->data.Blend.src1; + elemDest->src2 = elemSrc->data.Blend.src2; + elemDest->alpha = elemSrc->data.Blend.alpha; + elemDest->constant0 = + _XieConvertToIEEE (elemSrc->data.Blend.src_constant[0]); + elemDest->constant1 = + _XieConvertToIEEE (elemSrc->data.Blend.src_constant[1]); + elemDest->constant2 = + _XieConvertToIEEE (elemSrc->data.Blend.src_constant[2]); + elemDest->alphaConst = + _XieConvertToIEEE (elemSrc->data.Blend.alpha_constant); + elemDest->domainOffsetX = elemSrc->data.Blend.domain.offset_x; + elemDest->domainOffsetY = elemSrc->data.Blend.domain.offset_y; + elemDest->domainPhototag = elemSrc->data.Blend.domain.phototag; + elemDest->bandMask = elemSrc->data.Blend.band_mask; + + END_ELEM_HEAD (Blend, *bufDest, elemDest); +} + + +void +_XieElemCompare (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloCompare *elemDest; + + BEGIN_ELEM_HEAD (Compare, elemSrc, + LENOF (xieFloCompare), *bufDest, elemDest); + + elemDest->src1 = elemSrc->data.Compare.src1; + elemDest->src2 = elemSrc->data.Compare.src2; + elemDest->domainOffsetX = elemSrc->data.Compare.domain.offset_x; + elemDest->domainOffsetY = elemSrc->data.Compare.domain.offset_y; + elemDest->domainPhototag = elemSrc->data.Compare.domain.phototag; + elemDest->operator = elemSrc->data.Compare.operator; + elemDest->combine = elemSrc->data.Compare.combine; + elemDest->constant0 = + _XieConvertToIEEE (elemSrc->data.Compare.constant[0]); + elemDest->constant1 = + _XieConvertToIEEE (elemSrc->data.Compare.constant[1]); + elemDest->constant2 = + _XieConvertToIEEE (elemSrc->data.Compare.constant[2]); + elemDest->bandMask = elemSrc->data.Compare.band_mask; + + END_ELEM_HEAD (Compare, *bufDest, elemDest); +} + + +void +_XieElemConstrain (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloConstrain *elemDest; + unsigned techLen; + + techLen = _XieTechniqueLength (xieValConstrain, + elemSrc->data.Constrain.constrain_tech, + elemSrc->data.Constrain.constrain_param); + + BEGIN_ELEM_HEAD (Constrain, elemSrc, + LENOF (xieFloConstrain) + techLen, *bufDest, elemDest); + + elemDest->src = elemSrc->data.Constrain.src; + elemDest->levels0 = elemSrc->data.Constrain.levels[0]; + elemDest->levels1 = elemSrc->data.Constrain.levels[1]; + elemDest->levels2 = elemSrc->data.Constrain.levels[2]; + elemDest->constrain = elemSrc->data.Constrain.constrain_tech; + elemDest->lenParams = techLen; + + END_ELEM_HEAD (Constrain, *bufDest, elemDest); + + /* Technique dependent constrain params */ + + _XieEncodeTechnique (bufDest, xieValConstrain, + elemSrc->data.Constrain.constrain_tech, + elemSrc->data.Constrain.constrain_param); +} + + +void +_XieElemConvertFromIndex (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloConvertFromIndex *elemDest; + + BEGIN_ELEM_HEAD (ConvertFromIndex, elemSrc, + LENOF (xieFloConvertFromIndex), *bufDest, elemDest); + + elemDest->src = elemSrc->data.ConvertFromIndex.src; + elemDest->class = elemSrc->data.ConvertFromIndex.data_class; + elemDest->precision = elemSrc->data.ConvertFromIndex.precision; + elemDest->colormap = elemSrc->data.ConvertFromIndex.colormap; + + END_ELEM_HEAD (ConvertFromIndex, *bufDest, elemDest); +} + + +void +_XieElemConvertFromRGB (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloConvertFromRGB *elemDest; + unsigned techLen; + + techLen = _XieTechniqueLength (xieValConvertFromRGB, + elemSrc->data.ConvertFromRGB.color_space, + elemSrc->data.ConvertFromRGB.color_param); + + BEGIN_ELEM_HEAD (ConvertFromRGB, elemSrc, + LENOF (xieFloConvertFromRGB) + techLen, *bufDest, elemDest); + + elemDest->src = elemSrc->data.ConvertFromRGB.src; + elemDest->convert = elemSrc->data.ConvertFromRGB.color_space; + elemDest->lenParams = techLen; + + END_ELEM_HEAD (ConvertFromRGB, *bufDest, elemDest); + + /* Technique dependent color params */ + + _XieEncodeTechnique (bufDest, xieValConvertFromRGB, + elemSrc->data.ConvertFromRGB.color_space, + elemSrc->data.ConvertFromRGB.color_param); +} + + +void +_XieElemConvertToIndex (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloConvertToIndex *elemDest; + unsigned techLen; + + techLen = _XieTechniqueLength (xieValColorAlloc, + elemSrc->data.ConvertToIndex.color_alloc_tech, + elemSrc->data.ConvertToIndex.color_alloc_param); + + BEGIN_ELEM_HEAD (ConvertToIndex, elemSrc, + LENOF (xieFloConvertToIndex) + techLen, *bufDest, elemDest); + + elemDest->src = elemSrc->data.ConvertToIndex.src; + elemDest->notify = elemSrc->data.ConvertToIndex.notify; + elemDest->colormap = elemSrc->data.ConvertToIndex.colormap; + elemDest->colorList = elemSrc->data.ConvertToIndex.color_list; + elemDest->colorAlloc = elemSrc->data.ConvertToIndex.color_alloc_tech; + elemDest->lenParams = techLen; + + END_ELEM_HEAD (ConvertToIndex, *bufDest, elemDest); + + /* Technique dependent color alloc params */ + + _XieEncodeTechnique (bufDest, xieValColorAlloc, + elemSrc->data.ConvertToIndex.color_alloc_tech, + elemSrc->data.ConvertToIndex.color_alloc_param); +} + + +void +_XieElemConvertToRGB (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloConvertToRGB *elemDest; + unsigned techLen; + + techLen = _XieTechniqueLength (xieValConvertToRGB, + elemSrc->data.ConvertToRGB.color_space, + elemSrc->data.ConvertToRGB.color_param); + + BEGIN_ELEM_HEAD (ConvertToRGB, elemSrc, + LENOF (xieFloConvertToRGB) + techLen, *bufDest, elemDest); + + elemDest->src = elemSrc->data.ConvertToRGB.src; + elemDest->convert = elemSrc->data.ConvertToRGB.color_space; + elemDest->lenParams = techLen; + + END_ELEM_HEAD (ConvertToRGB, *bufDest, elemDest); + + /* Technique dependent color params */ + + _XieEncodeTechnique (bufDest, xieValConvertToRGB, + elemSrc->data.ConvertToRGB.color_space, + elemSrc->data.ConvertToRGB.color_param); +} + + +void +_XieElemConvolve (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + int ksize = elemSrc->data.Convolve.kernel_size; + int i, j; + xieTypFloat *fptr; + xieFloConvolve *elemDest; + unsigned techLen, kernelLen; + + techLen = _XieTechniqueLength (xieValConvolve, + elemSrc->data.Convolve.convolve_tech, + elemSrc->data.Convolve.convolve_param); + + kernelLen = elemSrc->data.Convolve.kernel_size * + elemSrc->data.Convolve.kernel_size; + + BEGIN_ELEM_HEAD (Convolve, elemSrc, + LENOF (xieFloConvolve) + kernelLen + techLen, *bufDest, elemDest); + + elemDest->src = elemSrc->data.Convolve.src; + elemDest->domainOffsetX = elemSrc->data.Convolve.domain.offset_x; + elemDest->domainOffsetY = elemSrc->data.Convolve.domain.offset_y; + elemDest->domainPhototag = elemSrc->data.Convolve.domain.phototag; + elemDest->bandMask = elemSrc->data.Convolve.band_mask; + elemDest->kernelSize = elemSrc->data.Convolve.kernel_size; + elemDest->convolve = elemSrc->data.Convolve.convolve_tech; + elemDest->lenParams = techLen; + + END_ELEM_HEAD (Convolve, *bufDest, elemDest); + + + /* LISTofFloat (kernelSize^2) */ + + fptr = (xieTypFloat *) *bufDest; + for (i = 0; i < ksize; i++) + for (j = 0; j < ksize; j++) + *fptr++ = _XieConvertToIEEE ( + elemSrc->data.Convolve.kernel[i * ksize + j]); + + *bufDest += NUMBYTES (kernelLen); + + + /* Technique dependent convolve params */ + + _XieEncodeTechnique (bufDest, xieValConvolve, + elemSrc->data.Convolve.convolve_tech, + elemSrc->data.Convolve.convolve_param); + +} + + +void +_XieElemDither (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloDither *elemDest; + unsigned techLen; + + techLen = _XieTechniqueLength (xieValDither, + elemSrc->data.Dither.dither_tech, + elemSrc->data.Dither.dither_param); + + BEGIN_ELEM_HEAD (Dither, elemSrc, + LENOF (xieFloDither) + techLen, *bufDest, elemDest); + + elemDest->src = elemSrc->data.Dither.src; + elemDest->bandMask = elemSrc->data.Dither.band_mask; + elemDest->levels0 = elemSrc->data.Dither.levels[0]; + elemDest->levels1 = elemSrc->data.Dither.levels[1]; + elemDest->levels2 = elemSrc->data.Dither.levels[2]; + elemDest->dither = elemSrc->data.Dither.dither_tech; + elemDest->lenParams = techLen; + + END_ELEM_HEAD (Dither, *bufDest, elemDest); + + /* Technique dependent dither params */ + + _XieEncodeTechnique (bufDest, xieValDither, + elemSrc->data.Dither.dither_tech, + elemSrc->data.Dither.dither_param); +} + + +void +_XieElemGeometry (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloGeometry *elemDest; + unsigned techLen; + + techLen = _XieTechniqueLength (xieValGeometry, + elemSrc->data.Geometry.sample_tech, + elemSrc->data.Geometry.sample_param); + + BEGIN_ELEM_HEAD (Geometry, elemSrc, + LENOF (xieFloGeometry) + techLen, *bufDest, elemDest); + + elemDest->src = elemSrc->data.Geometry.src; + elemDest->bandMask = elemSrc->data.Geometry.band_mask; + elemDest->width = elemSrc->data.Geometry.width; + elemDest->height = elemSrc->data.Geometry.height; + elemDest->a = _XieConvertToIEEE ( + elemSrc->data.Geometry.coefficients[0]); + elemDest->b = _XieConvertToIEEE ( + elemSrc->data.Geometry.coefficients[1]); + elemDest->c = _XieConvertToIEEE ( + elemSrc->data.Geometry.coefficients[2]); + elemDest->d = _XieConvertToIEEE ( + elemSrc->data.Geometry.coefficients[3]); + elemDest->tx = _XieConvertToIEEE ( + elemSrc->data.Geometry.coefficients[4]); + elemDest->ty = _XieConvertToIEEE ( + elemSrc->data.Geometry.coefficients[5]); + elemDest->constant0 = _XieConvertToIEEE ( + elemSrc->data.Geometry.constant[0] ); + elemDest->constant1 = _XieConvertToIEEE ( + elemSrc->data.Geometry.constant[1] ); + elemDest->constant2 = _XieConvertToIEEE ( + elemSrc->data.Geometry.constant[2] ); + elemDest->sample = elemSrc->data.Geometry.sample_tech; + elemDest->lenParams = techLen; + + END_ELEM_HEAD (Geometry, *bufDest, elemDest); + + /* Technique dependent sample params */ + + _XieEncodeTechnique (bufDest, xieValGeometry, + elemSrc->data.Geometry.sample_tech, + elemSrc->data.Geometry.sample_param); +} + + +void +_XieElemLogical (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloLogical *elemDest; + + BEGIN_ELEM_HEAD (Logical, elemSrc, + LENOF (xieFloLogical), *bufDest, elemDest); + + elemDest->src1 = elemSrc->data.Logical.src1; + elemDest->src2 = elemSrc->data.Logical.src2; + elemDest->domainOffsetX = elemSrc->data.Logical.domain.offset_x; + elemDest->domainOffsetY = elemSrc->data.Logical.domain.offset_y; + elemDest->domainPhototag = elemSrc->data.Logical.domain.phototag; + elemDest->operator = elemSrc->data.Logical.operator; + elemDest->bandMask = elemSrc->data.Logical.band_mask; + elemDest->constant0 = + _XieConvertToIEEE (elemSrc->data.Logical.constant[0]); + elemDest->constant1 = + _XieConvertToIEEE (elemSrc->data.Logical.constant[1]); + elemDest->constant2 = + _XieConvertToIEEE (elemSrc->data.Logical.constant[2]); + + END_ELEM_HEAD (Logical, *bufDest, elemDest); +} + + +void +_XieElemMatchHistogram (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloMatchHistogram *elemDest; + unsigned techLen; + + techLen = _XieTechniqueLength (xieValHistogram, + elemSrc->data.MatchHistogram.shape, + elemSrc->data.MatchHistogram.shape_param); + + BEGIN_ELEM_HEAD (MatchHistogram, elemSrc, + LENOF (xieFloMatchHistogram) + techLen, *bufDest, elemDest); + + elemDest->src = elemSrc->data.MatchHistogram.src; + elemDest->domainOffsetX = elemSrc->data.MatchHistogram.domain.offset_x; + elemDest->domainOffsetY = elemSrc->data.MatchHistogram.domain.offset_y; + elemDest->domainPhototag = elemSrc->data.MatchHistogram.domain.phototag; + elemDest->shape = elemSrc->data.MatchHistogram.shape; + elemDest->lenParams = techLen; + + END_ELEM_HEAD (MatchHistogram, *bufDest, elemDest); + + /* Technique dependent shape params */ + + _XieEncodeTechnique (bufDest, xieValHistogram, + elemSrc->data.MatchHistogram.shape, + elemSrc->data.MatchHistogram.shape_param); +} + + +void +_XieElemMath (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloMath *elemDest; + + BEGIN_ELEM_HEAD (Math, elemSrc, + LENOF (xieFloMath), *bufDest, elemDest); + + elemDest->src = elemSrc->data.Math.src; + elemDest->domainOffsetX = elemSrc->data.Math.domain.offset_x; + elemDest->domainOffsetY = elemSrc->data.Math.domain.offset_y; + elemDest->domainPhototag = elemSrc->data.Math.domain.phototag; + elemDest->operator = elemSrc->data.Math.operator; + elemDest->bandMask = elemSrc->data.Math.band_mask; + + END_ELEM_HEAD (Math, *bufDest, elemDest); +} + + +void +_XieElemPasteUp (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloPasteUp *elemDest; + + BEGIN_ELEM_HEAD (PasteUp, elemSrc, + LENOF (xieFloPasteUp) + + elemSrc->data.PasteUp.tile_count * LENOF (xieTypTile), + *bufDest, elemDest); + + elemDest->numTiles = elemSrc->data.PasteUp.tile_count; + elemDest->width = elemSrc->data.PasteUp.width; + elemDest->height = elemSrc->data.PasteUp.height; + elemDest->constant0 = + _XieConvertToIEEE (elemSrc->data.PasteUp.constant[0]); + elemDest->constant1 = + _XieConvertToIEEE (elemSrc->data.PasteUp.constant[1]); + elemDest->constant2 = + _XieConvertToIEEE (elemSrc->data.PasteUp.constant[2]); + + END_ELEM_HEAD (PasteUp, *bufDest, elemDest); + + /* LISTofTile (numTiles) */ + + STORE_LISTOF_TILES (elemSrc->data.PasteUp.tiles, + elemSrc->data.PasteUp.tile_count, *bufDest); +} + + +void +_XieElemPoint (bufDest, elemSrc) +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloPoint *elemDest; + + BEGIN_ELEM_HEAD (Point, elemSrc, + LENOF (xieFloPoint), *bufDest, elemDest); + + elemDest->src = elemSrc->data.Point.src; + elemDest->lut = elemSrc->data.Point.lut; + elemDest->domainOffsetX = elemSrc->data.Point.domain.offset_x; + elemDest->domainOffsetY = elemSrc->data.Point.domain.offset_y; + elemDest->domainPhototag = elemSrc->data.Point.domain.phototag; + elemDest->bandMask = elemSrc->data.Point.band_mask; + + END_ELEM_HEAD (Point, *bufDest, elemDest); +} + +void +_XieElemUnconstrain (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloUnconstrain *elemDest; + + BEGIN_ELEM_HEAD (Unconstrain, elemSrc, + LENOF (xieFloUnconstrain), *bufDest, elemDest); + + elemDest->src = elemSrc->data.Unconstrain.src; + + END_ELEM_HEAD (Unconstrain, *bufDest, elemDest); +} + +void +_XieElemExportClientHistogram (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloExportClientHistogram *elemDest; + + BEGIN_ELEM_HEAD (ExportClientHistogram, elemSrc, + LENOF (xieFloExportClientHistogram), *bufDest, elemDest); + + elemDest->src = elemSrc->data.ExportClientHistogram.src; + elemDest->notify = elemSrc->data.ExportClientHistogram.notify; + elemDest->domainOffsetX = + elemSrc->data.ExportClientHistogram.domain.offset_x; + elemDest->domainOffsetY = + elemSrc->data.ExportClientHistogram.domain.offset_y; + elemDest->domainPhototag = + elemSrc->data.ExportClientHistogram.domain.phototag; + + END_ELEM_HEAD (ExportClientHistogram, *bufDest, elemDest); +} + + +void +_XieElemExportClientLUT (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloExportClientLUT *elemDest; + + BEGIN_ELEM_HEAD (ExportClientLUT, elemSrc, + LENOF (xieFloExportClientLUT), *bufDest, elemDest); + + elemDest->src = elemSrc->data.ExportClientLUT.src; + elemDest->notify = elemSrc->data.ExportClientLUT.notify; + elemDest->bandOrder = elemSrc->data.ExportClientLUT.band_order; + elemDest->start0 = elemSrc->data.ExportClientLUT.start[0]; + elemDest->start1 = elemSrc->data.ExportClientLUT.start[1]; + elemDest->start2 = elemSrc->data.ExportClientLUT.start[2]; + elemDest->length0 = elemSrc->data.ExportClientLUT.length[0]; + elemDest->length1 = elemSrc->data.ExportClientLUT.length[1]; + elemDest->length2 = elemSrc->data.ExportClientLUT.length[2]; + + END_ELEM_HEAD (ExportClientLUT, *bufDest, elemDest); +} + + +void +_XieElemExportClientPhoto (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloExportClientPhoto *elemDest; + unsigned techLen; + + techLen = _XieTechniqueLength (xieValEncode, + elemSrc->data.ExportClientPhoto.encode_tech, + elemSrc->data.ExportClientPhoto.encode_param); + + BEGIN_ELEM_HEAD (ExportClientPhoto, elemSrc, + LENOF (xieFloExportClientPhoto) + techLen, *bufDest, elemDest); + + elemDest->src = elemSrc->data.ExportClientPhoto.src; + elemDest->notify = elemSrc->data.ExportClientPhoto.notify; + elemDest->encodeTechnique = elemSrc->data.ExportClientPhoto.encode_tech; + elemDest->lenParams = techLen; + + END_ELEM_HEAD (ExportClientPhoto, *bufDest, elemDest); + + /* Technique dependent encode params */ + + _XieEncodeTechnique (bufDest, xieValEncode, + elemSrc->data.ExportClientPhoto.encode_tech, + elemSrc->data.ExportClientPhoto.encode_param); +} + + +void +_XieElemExportClientROI (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloExportClientROI *elemDest; + + BEGIN_ELEM_HEAD (ExportClientROI, elemSrc, + LENOF (xieFloExportClientROI), *bufDest, elemDest); + + elemDest->src = elemSrc->data.ExportClientROI.src; + elemDest->notify = elemSrc->data.ExportClientROI.notify; + + END_ELEM_HEAD (ExportClientROI, *bufDest, elemDest); +} + + +void +_XieElemExportDrawable (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloExportDrawable *elemDest; + + BEGIN_ELEM_HEAD (ExportDrawable, elemSrc, + LENOF (xieFloExportDrawable), *bufDest, elemDest); + + elemDest->src = elemSrc->data.ExportDrawable.src; + elemDest->dstX = elemSrc->data.ExportDrawable.dst_x; + elemDest->dstY = elemSrc->data.ExportDrawable.dst_y; + elemDest->drawable = elemSrc->data.ExportDrawable.drawable; + elemDest->gc = (elemSrc->data.ExportDrawable.gc)->gid; + + END_ELEM_HEAD (ExportDrawable, *bufDest, elemDest); +} + + +void +_XieElemExportDrawablePlane (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloExportDrawablePlane *elemDest; + + BEGIN_ELEM_HEAD (ExportDrawablePlane, elemSrc, + LENOF (xieFloExportDrawablePlane), *bufDest, elemDest); + + elemDest->src = elemSrc->data.ExportDrawablePlane.src; + elemDest->dstX = elemSrc->data.ExportDrawablePlane.dst_x; + elemDest->dstY = elemSrc->data.ExportDrawablePlane.dst_y; + elemDest->drawable = elemSrc->data.ExportDrawablePlane.drawable; + elemDest->gc = (elemSrc->data.ExportDrawablePlane.gc)->gid; + + END_ELEM_HEAD (ExportDrawablePlane, *bufDest, elemDest); +} + + +void +_XieElemExportLUT (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloExportLUT *elemDest; + + BEGIN_ELEM_HEAD (ExportLUT, elemSrc, + LENOF (xieFloExportLUT), *bufDest, elemDest); + + elemDest->src = elemSrc->data.ExportLUT.src; + elemDest->lut = elemSrc->data.ExportLUT.lut; + elemDest->merge = elemSrc->data.ExportLUT.merge; + elemDest->start0 = elemSrc->data.ExportLUT.start[0]; + elemDest->start1 = elemSrc->data.ExportLUT.start[1]; + elemDest->start2 = elemSrc->data.ExportLUT.start[2]; + + END_ELEM_HEAD (ExportLUT, *bufDest, elemDest); +} + + +void +_XieElemExportPhotomap (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloExportPhotomap *elemDest; + unsigned techLen; + + techLen = _XieTechniqueLength (xieValEncode, + elemSrc->data.ExportPhotomap.encode_tech, + elemSrc->data.ExportPhotomap.encode_param); + + BEGIN_ELEM_HEAD (ExportPhotomap, elemSrc, + LENOF (xieFloExportPhotomap) + techLen, *bufDest, elemDest); + + elemDest->src = elemSrc->data.ExportPhotomap.src; + elemDest->photomap = elemSrc->data.ExportPhotomap.photomap; + elemDest->encodeTechnique = elemSrc->data.ExportPhotomap.encode_tech; + elemDest->lenParams = techLen; + + END_ELEM_HEAD (ExportPhotomap, *bufDest, elemDest); + + /* Technique dependent encode params */ + + _XieEncodeTechnique (bufDest, xieValEncode, + elemSrc->data.ExportPhotomap.encode_tech, + elemSrc->data.ExportPhotomap.encode_param); +} + + +void +_XieElemExportROI (bufDest, elemSrc) + +char **bufDest; +XiePhotoElement *elemSrc; + +{ + xieFloExportROI *elemDest; + + BEGIN_ELEM_HEAD (ExportROI, elemSrc, + LENOF (xieFloExportROI), *bufDest, elemDest); + + elemDest->src = elemSrc->data.ExportROI.src; + elemDest->roi = elemSrc->data.ExportROI.roi; + + END_ELEM_HEAD (ExportROI, *bufDest, elemDest); +} diff --git a/xie/xc/lib/XIE/elements.h b/xie/xc/lib/XIE/elements.h new file mode 100644 index 0000000..f623a46 --- /dev/null +++ b/xie/xc/lib/XIE/elements.h @@ -0,0 +1,108 @@ +/* $XConsortium: elements.h,v 1.5 95/06/08 23:20:39 gildea Exp $ */ + +/* + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#ifndef _ELEMENTS_H_ +#define _ELEMENTS_H_ + +#if (defined(__STDC__) && !defined(UNIXCPP)) || defined(ANSICPP) +#define ELEM_NAME(_name_) xieFlo##_name_ +#define ELEM_SIZE(_name_) sz_xieFlo##_name_ +#else +#define ELEM_NAME(_name_) xieFlo/**/_name_ +#define ELEM_SIZE(_name_) sz_xieFlo/**/_name_ +#endif + + +#ifndef WORD64 + +#define BEGIN_ELEM_HEAD(_name, _elemSrc, _elemLength, _bufDest, _elemDest) \ + _elemDest = (ELEM_NAME(_name) *) _bufDest; \ + _elemDest->elemType = elemSrc->elemType; \ + _elemDest->elemLength = _elemLength; + +#define END_ELEM_HEAD(_name, _bufDest, _elemDest) \ + _bufDest += ELEM_SIZE(_name); + +#else /* WORD64 */ + +#define BEGIN_ELEM_HEAD(_name, _elemSrc, _elemLength, _bufDest, _elemDest) \ +{ \ + ELEM_NAME(_name) tElem; \ + _elemDest = &tElem; \ + _elemDest->elemType = elemSrc->elemType; \ + _elemDest->elemLength = _elemLength; + +#define END_ELEM_HEAD(_name, _bufDest, _elemDest) \ + memcpy (_bufDest, _elemDest, ELEM_SIZE(_name)); \ + _bufDest += ELEM_SIZE(_name); \ +} + +#endif /* WORD64 */ + + +#ifndef WORD64 + +#define STORE_LISTOF_TILES(_tiles, _count, _pBuf) \ +{ \ + xieTypTile *tileDest = (xieTypTile *) _pBuf; \ + int i; \ +\ + for (i = 0; i < _count; i++) \ + { \ + tileDest->src = _tiles[i].src; \ + tileDest->dstX = _tiles[i].dst_x; \ + tileDest->dstY = _tiles[i].dst_y; \ + tileDest++; \ + } \ + _pBuf += (SIZEOF (xieTypTile) * _count); \ +} + +#else /* WORD64 */ + +#define STORE_LISTOF_TILES(_tiles, _count, _pBuf) \ +{ \ + xieTypTile temp; \ + int i; \ +\ + for (i = 0; i < _count; i++) \ + { \ + temp.src = _tiles[i].src; \ + temp.dstX = _tiles[i].dst_x; \ + temp.dstY = _tiles[i].dst_y; \ + memcpy (_pBuf, &temp, SIZEOF (xieTypTile)); \ + _pBuf += SIZEOF (xieTypTile); \ + } \ +} + +#endif + +#endif /* _ELEMENTS_H_ */ diff --git a/xie/xc/lib/XIE/errors.c b/xie/xc/lib/XIE/errors.c new file mode 100644 index 0000000..78be232 --- /dev/null +++ b/xie/xc/lib/XIE/errors.c @@ -0,0 +1,140 @@ +/* $XConsortium: errors.c,v 1.5 95/04/28 18:01:11 mor Exp $ */ + +/* + +Copyright (c) 1993 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#define NEED_EVENTS /* so XErrorEvent will get pulled in */ + +#include "XIElibint.h" + + +Bool +_XieFloError (display, host, wire) + +Display *display; +XErrorEvent *host; +xError *wire; + +{ + XieFloAccessError *flo_host_error = (XieFloAccessError *) host; + xieFloAccessErr *flo_wire_error = (xieFloAccessErr *) wire; + + /* + * All flo errors have this basic info. + */ + +/* these are assigned by Xlib already + flo_host_error->error_code = flo_wire_error->code; + flo_host_error->flo_id = flo_wire_error->floID; + flo_host_error->minor_code = flo_wire_error->minorOpcode; + flo_host_error->request_code = flo_wire_error->majorOpcode; +*/ + flo_host_error->flo_error_code = flo_wire_error->floErrorCode; + flo_host_error->name_space = flo_wire_error->nameSpace; + flo_host_error->phototag = flo_wire_error->phototag; + flo_host_error->elem_type = flo_wire_error->type; + + + /* + * Now handle the particularites of each flo error. + */ + + switch (((xieFloAccessErr *) wire)->floErrorCode) + { + case xieErrNoFloAccess: + case xieErrNoFloAlloc: + case xieErrNoFloElement: + case xieErrNoFloID: + case xieErrNoFloMatch: + case xieErrNoFloSource: + case xieErrNoFloImplementation: + + break; + + case xieErrNoFloColormap: + case xieErrNoFloColorList: + case xieErrNoFloDrawable: + case xieErrNoFloGC: + case xieErrNoFloLUT: + case xieErrNoFloPhotomap: + case xieErrNoFloROI: + + { + XieFloResourceError *host_error = (XieFloResourceError *) host; + xieFloResourceErr *wire_error = (xieFloResourceErr *) wire; + + host_error->resource_id = wire_error->resourceID; + break; + } + + case xieErrNoFloDomain: + { + XieFloDomainError *host_error = (XieFloDomainError *) host; + xieFloDomainErr *wire_error = (xieFloDomainErr *) wire; + + host_error->domain_src = wire_error->domainSrc; + break; + } + + case xieErrNoFloOperator: + { + XieFloOperatorError *host_error = (XieFloOperatorError *) host; + xieFloOperatorErr *wire_error = (xieFloOperatorErr *) wire; + + host_error->operator = wire_error->operator; + break; + } + + case xieErrNoFloTechnique: + { + XieFloTechniqueError *host_error = (XieFloTechniqueError *) host; + xieFloTechniqueErr *wire_error = (xieFloTechniqueErr *) wire; + + host_error->technique_number = wire_error->techniqueNumber; + host_error->num_tech_params = wire_error->lenTechParams; + host_error->tech_group = wire_error->techniqueGroup; + break; + } + + case xieErrNoFloValue: + { + XieFloValueError *host_error = (XieFloValueError *) host; + xieFloValueErr *wire_error = (xieFloValueErr *) wire; + + host_error->bad_value = wire_error->badValue; + break; + } + + default: + return (False); + } + + return (True); +} diff --git a/xie/xc/lib/XIE/events.c b/xie/xc/lib/XIE/events.c new file mode 100644 index 0000000..2cc6477 --- /dev/null +++ b/xie/xc/lib/XIE/events.c @@ -0,0 +1,175 @@ +/* $XConsortium: events.c,v 1.6 94/12/19 16:57:13 mor Exp $ */ + +/* + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#define NEED_EVENTS /* so xEvent will get pulled in */ +#include "XIElibint.h" + + +Status +_XieColorAllocEvent (display, host, wire) + +Display *display; +XEvent *host; +xEvent *wire; + +{ + XieColorAllocEvent *host_event = (XieColorAllocEvent *) host; + xieColorAllocEvn *wire_event = (xieColorAllocEvn *) wire; + + host_event->type = wire_event->event & 0x7f; + host_event->serial = wire_event->sequenceNum; + host_event->send_event = (wire_event->event & 0x80) != 0; + host_event->display = display; + host_event->name_space = wire_event->instanceNameSpace; + host_event->time = wire_event->time; + host_event->flo_id = wire_event->instanceFloID; + host_event->src = wire_event->src; + host_event->elem_type = wire_event->type; + host_event->color_list = wire_event->colorList; + host_event->color_alloc_technique = wire_event->colorAllocTechnique; + host_event->color_alloc_data = wire_event->data; + + return (True); +} + + +Status +_XieDecodeNotifyEvent (display, host, wire) + +Display *display; +XEvent *host; +xEvent *wire; + +{ + XieDecodeNotifyEvent *host_event = (XieDecodeNotifyEvent *) host; + xieDecodeNotifyEvn *wire_event = (xieDecodeNotifyEvn *) wire; + + host_event->type = wire_event->event & 0x7f; + host_event->serial = wire_event->sequenceNum; + host_event->send_event = (wire_event->event & 0x80) != 0; + host_event->display = display; + host_event->name_space = wire_event->instanceNameSpace; + host_event->time = wire_event->time; + host_event->flo_id = wire_event->instanceFloID; + host_event->src = wire_event->src; + host_event->elem_type = wire_event->type; + host_event->decode_technique = wire_event->decodeTechnique; + host_event->aborted = wire_event->aborted; + host_event->band_number = wire_event->bandNumber; + host_event->width = wire_event->width; + host_event->height = wire_event->height; + + return (True); +} + + +Status +_XieExportAvailableEvent (display, host, wire) + +Display *display; +XEvent *host; +xEvent *wire; + +{ + XieExportAvailableEvent *host_event = (XieExportAvailableEvent *) host; + xieExportAvailableEvn *wire_event = (xieExportAvailableEvn *) wire; + + host_event->type = wire_event->event & 0x7f; + host_event->serial = wire_event->sequenceNum; + host_event->send_event = (wire_event->event & 0x80) != 0; + host_event->display = display; + host_event->name_space = wire_event->instanceNameSpace; + host_event->time = wire_event->time; + host_event->flo_id = wire_event->instanceFloID; + host_event->src = wire_event->src; + host_event->elem_type = wire_event->type; + host_event->band_number = wire_event->bandNumber; + host_event->data[0] = wire_event->data0; + host_event->data[1] = wire_event->data1; + host_event->data[2] = wire_event->data2; + + return (True); +} + + +Status +_XieImportObscuredEvent (display, host, wire) + +Display *display; +XEvent *host; +xEvent *wire; + +{ + XieImportObscuredEvent *host_event = (XieImportObscuredEvent *) host; + xieImportObscuredEvn *wire_event = (xieImportObscuredEvn *) wire; + + host_event->type = wire_event->event & 0x7f; + host_event->serial = wire_event->sequenceNum; + host_event->send_event = (wire_event->event & 0x80) != 0; + host_event->display = display; + host_event->name_space = wire_event->instanceNameSpace; + host_event->time = wire_event->time; + host_event->flo_id = wire_event->instanceFloID; + host_event->src = wire_event->src; + host_event->elem_type = wire_event->type; + host_event->window = wire_event->window; + host_event->x = wire_event->x; + host_event->y = wire_event->y; + host_event->width = wire_event->width; + host_event->height = wire_event->height; + + return (True); +} + + +Status +_XiePhotofloDoneEvent (display, host, wire) + +Display *display; +XEvent *host; +xEvent *wire; + +{ + XiePhotofloDoneEvent *host_event = (XiePhotofloDoneEvent *) host; + xiePhotofloDoneEvn *wire_event = (xiePhotofloDoneEvn *) wire; + + host_event->type = wire_event->event & 0x7f; + host_event->serial = wire_event->sequenceNum; + host_event->send_event = (wire_event->event & 0x80) != 0; + host_event->display = display; + host_event->name_space = wire_event->instanceNameSpace; + host_event->time = wire_event->time; + host_event->flo_id = wire_event->instanceFloID; + host_event->outcome = wire_event->outcome; + + return (True); +} diff --git a/xie/xc/lib/XIE/free.c b/xie/xc/lib/XIE/free.c new file mode 100644 index 0000000..0edb7dd --- /dev/null +++ b/xie/xc/lib/XIE/free.c @@ -0,0 +1,139 @@ +/* $XConsortium: free.c,v 1.3 94/04/17 20:18:23 mor Exp $ */ + +/* + +Copyright (c) 1993 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#include "XIElibint.h" + +#define CHECK_AND_FREE(_ptr) if (_ptr) Xfree (_ptr) + + +void +XieFreeTechniques (techs, count) + +XieTechnique *techs; +unsigned int count; + +{ + int i; + + if (techs) + { + for (i = 0; i < count; i++) + CHECK_AND_FREE (techs[i].name); + + Xfree ((char *) techs); + } +} + + +void +XieFreePhotofloGraph (elements, count) + +XiePhotoElement *elements; +unsigned int count; + +{ + /* + * NOTE: We do not free the technique parameters here. + * Most of the technique parameters should be freed by the + * client using Xfree (exception: EncodeJPEGBaseline and + * EncodeJPEGLossless, see functions below). This is so + * the client can reuse technique parameters between photoflos. + */ + + int i; + + if (!elements) + return; + + for (i = 0; i < count; i++) + { + switch (elements[i].elemType) + { + case xieElemConvolve: + CHECK_AND_FREE ((char *) elements[i].data.Convolve.kernel); + break; + case xieElemPasteUp: + CHECK_AND_FREE ((char *) elements[i].data.PasteUp.tiles); + break; + default: + break; + } + } + + Xfree ((char *) elements); +} + + +void +XieFreeEncodeJPEGBaseline (param) + +XieEncodeJPEGBaselineParam *param; + +{ + if (param) + { + CHECK_AND_FREE ((char *) param->q_table); + CHECK_AND_FREE ((char *) param->ac_table); + CHECK_AND_FREE ((char *) param->dc_table); + Xfree ((char *) param); + } +} + + +void +XieFreeEncodeJPEGLossless (param) + +XieEncodeJPEGLosslessParam *param; + +{ + if (param) + { + CHECK_AND_FREE ((char *) param->table); + Xfree ((char *) param); + } +} + + +void +XieFreePasteUpTiles (element) + +XiePhotoElement *element; + +{ + XieTile *tiles= element->data.PasteUp.tiles; + + if (tiles) + { + Xfree (tiles); + element->data.PasteUp.tiles=NULL; + } +} diff --git a/xie/xc/lib/XIE/globals.h b/xie/xc/lib/XIE/globals.h new file mode 100644 index 0000000..bc727c2 --- /dev/null +++ b/xie/xc/lib/XIE/globals.h @@ -0,0 +1,117 @@ +/* $XConsortium: globals.h,v 1.3 94/04/17 20:18:24 mor Exp $ */ + +/* + +Copyright (c) 1993 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +XieExtInfo *_XieExtInfoHeader = NULL; + +extern void _XieElemImportClientLUT(); +extern void _XieElemImportClientPhoto(); +extern void _XieElemImportClientROI(); +extern void _XieElemImportDrawable(); +extern void _XieElemImportDrawablePlane(); +extern void _XieElemImportLUT(); +extern void _XieElemImportPhotomap(); +extern void _XieElemImportROI(); +extern void _XieElemArithmetic(); +extern void _XieElemBandCombine(); +extern void _XieElemBandExtract(); +extern void _XieElemBandSelect(); +extern void _XieElemBlend(); +extern void _XieElemCompare(); +extern void _XieElemConstrain(); +extern void _XieElemConvertFromIndex(); +extern void _XieElemConvertFromRGB(); +extern void _XieElemConvertToIndex(); +extern void _XieElemConvertToRGB(); +extern void _XieElemConvolve(); +extern void _XieElemDither(); +extern void _XieElemGeometry(); +extern void _XieElemLogical(); +extern void _XieElemMatchHistogram(); +extern void _XieElemMath(); +extern void _XieElemPasteUp(); +extern void _XieElemPoint(); +extern void _XieElemUnconstrain(); +extern void _XieElemExportClientHistogram(); +extern void _XieElemExportClientLUT(); +extern void _XieElemExportClientPhoto(); +extern void _XieElemExportClientROI(); +extern void _XieElemExportDrawable(); +extern void _XieElemExportDrawablePlane(); +extern void _XieElemExportLUT(); +extern void _XieElemExportPhotomap(); +extern void _XieElemExportROI(); + +void (*(_XieElemFuncs[]))() = +{ + _XieElemImportClientLUT, + _XieElemImportClientPhoto, + _XieElemImportClientROI, + _XieElemImportDrawable, + _XieElemImportDrawablePlane, + _XieElemImportLUT, + _XieElemImportPhotomap, + _XieElemImportROI, + _XieElemArithmetic, + _XieElemBandCombine, + _XieElemBandExtract, + _XieElemBandSelect, + _XieElemBlend, + _XieElemCompare, + _XieElemConstrain, + _XieElemConvertFromIndex, + _XieElemConvertFromRGB, + _XieElemConvertToIndex, + _XieElemConvertToRGB, + _XieElemConvolve, + _XieElemDither, + _XieElemGeometry, + _XieElemLogical, + _XieElemMatchHistogram, + _XieElemMath, + _XieElemPasteUp, + _XieElemPoint, + _XieElemUnconstrain, + _XieElemExportClientHistogram, + _XieElemExportClientLUT, + _XieElemExportClientPhoto, + _XieElemExportClientROI, + _XieElemExportDrawable, + _XieElemExportDrawablePlane, + _XieElemExportLUT, + _XieElemExportPhotomap, + _XieElemExportROI +}; + + +XieTechFuncRec *_XieTechFuncs[xieValMaxTechGroup]; + +Bool _XieTechFuncsInitialized = 0; diff --git a/xie/xc/lib/XIE/ieee.c b/xie/xc/lib/XIE/ieee.c new file mode 100644 index 0000000..f3c1863 --- /dev/null +++ b/xie/xc/lib/XIE/ieee.c @@ -0,0 +1,198 @@ +/* $XConsortium: ieee.c,v 1.5 94/04/17 20:18:24 rws Exp $ */ + +/****************************************************************************** + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + +Permission to use, copy, modify, distribute and sell this +software and its documentation for any purpose and without +fee or royalty and to grant others any or all rights granted +herein is hereby granted, provided that you agree to comply +with the following copyright notice and statements, including +the disclaimer, and that the same appears on all copies and +derivative works of the software and documentation you make. + + "Copyright 1993 by AGE Logic, Inc. + +THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO +REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of +example, but not limitation, AGE LOGIC MAKES NO +REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT +INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC +SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO +EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, +INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS +OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR +ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR +BASED ON A WARRANTY, EVEN IF AGE LOGIC OR MIT OR LICENSEES +HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +The name AGE Logic, Inc. may not be used in +advertising or publicity pertaining to this software without +specific, written prior permission from AGE Logic. + +Title to this software shall at all times remain with AGE +Logic, Inc. +****************************************************************************/ + +/* + +Copyright (c) 1993 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#include "XIElibint.h" +#include + +#define ieeeFloatSignMask 0x80000000 +#define ieeeFloatExpMask 0x7F800000 +#define ieeeFloatExpShift 23 +#define ieeeFloatMantissaMask 0x007FFFFF +#define ieeeMantissaSize 23 + +/* + From page 2-8 of spec, IEEE format. This is laid out as: + + bit 31 = 1 bit for sign (if bit on, negative) + bits 23-39 = 8 bit "biased" exponent (see below) + bits 0-22 = 23 bit mantissa + + A "normal" number is formed as + + (-1)^sign_bit * 2^(exp-127) * (1.0 + .mantissa) + + That is, the mantissa is interpreted as a fractional binary + number between 0 and 2^-1 + 2^-2 + ... + 2^-23. + + If the exponent is 255, the value is taken as infinity. + + I stole definition out of TMS Family Code tools, pages 5-22, 5-23 +*/ + +/**********************************************************************/ +xieTypFloat _XieConvertToIEEE(native) +XieFloat native; +{ +#ifndef NATIVE_FP_FORMAT + XieFloat really_float = native; /* stupid language */ + return *((xieTypFloat *)&really_float); +#else +xieTypFloat value; +int sign; +int exponent; +int ieee_exp; +long ieee_mantissa; +double frac_part; + + + if (native == 0.0) + return(0); /* frexp() can't handle 0.0 reliably */ + + +/*** frexp() breaks a double into the form + + "frac_part * 2^exponent" + + where 1/2 <= |frac_part| < 1. + +***/ + sign = (native < 0); + frac_part = frexp(native,&exponent) * (sign? -1: 1); + +/*** + In IEEE, a normal number is formed as: + + (-1)^sign_bit * 2^(exp-127) * (1.0 + .mantissa) + + It is easy for us to figure out the sign bit. To convert to + IEEE form, we work with the absolute value of the fractional + part, which is between 1/2 and 1. + + To normalize for IEEE format, the mantissa must be converted + to be between 1 and 2 instead of 1/2 and 1. In other words, + we re-express + + frac_part * 2^exponent + as + 2*frac_part * 2^(exponent-1) + + Then the IEEE mantissa is 2*frac_part - 1, and the IEEE exponent + is given by exponent-1 = exp-127, or exp = 126+exponent. + + example: + The number 0.75 is expressed as f * 2^0, f=0.75. + We convert mantissa to 2*0.75 = 1.5 and subtract + one to get IEEE mantissa coding of 0.5. The exponent + is downgraded to -1 so (1 + 0.5) * 2^-1 is 0.75, + which is coded with IEEE bias as -1 = exp-127, + yielding exp=126. 0.75 = (1+0.5) * 2^(126-127), + and we code 0 for sign bit, 0.5 for mantissa, 126 + for the exponent. + + note: if the exponent becomes larger than 128, then + exp+127>255, and we can't code it any more in + 8 bits. Therefore if the exponent is >= 128, + we set exp=255, which means infinity. +***/ + frac_part = 2*frac_part; + --exponent; + + frac_part -= 1; + + if (exponent >= 128) + ieee_exp = 255; + else + ieee_exp = 127+exponent; + /* notice we already decremented exponent by one, above */ + + +/*** Now assemble the number ***/ + value = 0; + if (sign) + value |= ieeeFloatSignMask; + + value |= (ieee_exp << ieeeFloatExpShift); + +/*** For the mantissa, we know we have a fractional part between 0 and 1. + We want the most significant 23 bits. Just shift 23 places to the + left and truncate. +***/ + ieee_mantissa = (pow(2.0,23.0) * frac_part); + value |= ieee_mantissa; + + return(value); +#endif +} +/**********************************************************************/ + + diff --git a/xie/xc/lib/XIE/init.c b/xie/xc/lib/XIE/init.c new file mode 100644 index 0000000..5ba60cb --- /dev/null +++ b/xie/xc/lib/XIE/init.c @@ -0,0 +1,501 @@ +/* $XConsortium: init.c,v 1.11 95/04/28 18:01:11 mor Exp $ */ + +/* + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#define NEED_EVENTS /* so XErrorEvent will get pulled in */ + +#include "XIElibint.h" +#include "globals.h" +#include "init.h" +#include + + + +Status +XieInitialize (display, extinfo_ret) + +Display *display; +XieExtensionInfo **extinfo_ret; + +{ + XieExtInfo *xieExtInfo; + XExtCodes *extCodes; + xieQueryImageExtensionReq *req; + xieQueryImageExtensionReply rep; + char *pBuf; + + int _XieCloseDisplay(); + void _XiePrintError(); + + int _XieColorAllocEvent(); + int _XieDecodeNotifyEvent(); + int _XieExportAvailableEvent(); + int _XieImportObscuredEvent(); + int _XiePhotofloDoneEvent(); + + int _XieFloError(); + + LockDisplay (display); + GET_EXTENSION_INFO (display, xieExtInfo); + + if (xieExtInfo) + { + *extinfo_ret = xieExtInfo->extInfo; + UnlockDisplay (display); + + return (1); + } + + *extinfo_ret = NULL; + + /* + * XInitExtension() is a public Xlib call and takes the display lock + * itself. Releasing it here is required on a threaded libX11; without + * this the process self-deadlocks inside XQueryExtension(). The + * original code only worked because LockDisplay() was a no-op when + * XInitThreads() had not been called. + */ + UnlockDisplay (display); + + extCodes = XInitExtension (display, xieExtName); + if (extCodes == NULL) + /* + * DECwindows registers the extension as "Xie", not the canonical + * "XIE". Extension names are case-sensitive, so retry the DEC + * spelling before giving up. See the VT1200's xdpyinfo output. + */ + extCodes = XInitExtension (display, "Xie"); + + if (extCodes == NULL) + { + SYNC_HANDLE (display); + + return (0); + } + + LockDisplay (display); + + xieExtInfo = (XieExtInfo *) Xmalloc (sizeof (XieExtInfo)); + xieExtInfo->extCodes = extCodes; + xieExtInfo->extInfo = *extinfo_ret = + (XieExtensionInfo *) Xmalloc (sizeof (XieExtensionInfo)); + + ADD_EXTENSION_INFO (display, xieExtInfo); + + GET_REQUEST (QueryImageExtension, pBuf); + + BEGIN_REQUEST_HEADER (QueryImageExtension, pBuf, req); + + STORE_REQUEST_HEADER (QueryImageExtension, req); + req->majorVersion = xieMajorVersion; + req->minorVersion = xieMinorVersion; + + END_REQUEST_HEADER (QueryImageExtension, pBuf, req); + + if (_XReply (display, (xReply *)&rep, 0, xFalse) == 0) + { + UnlockDisplay (display); + SYNC_HANDLE (display); + + return (0); + } + + (*extinfo_ret)->server_major_rev = rep.majorVersion; + (*extinfo_ret)->server_minor_rev = rep.minorVersion; + (*extinfo_ret)->service_class = rep.serviceClass; + (*extinfo_ret)->alignment = rep.alignment; + (*extinfo_ret)->uncnst_mantissa = rep.unconstrainedMantissa; + (*extinfo_ret)->uncnst_min_exp = rep.unconstrainedMinExp; + (*extinfo_ret)->uncnst_max_exp = rep.unconstrainedMaxExp; + (*extinfo_ret)->n_cnst_levels = rep.length; + (*extinfo_ret)->major_opcode = extCodes->major_opcode; + (*extinfo_ret)->first_event = extCodes->first_event; + (*extinfo_ret)->first_error = extCodes->first_error; + + + (*extinfo_ret)->cnst_levels = (unsigned long *) + Xmalloc (rep.length * sizeof (unsigned long)); + + _XRead32 (display, (*extinfo_ret)->cnst_levels, rep.length << 2); + + + /* + * Tell Xlib which function to call when the display is closed. + * + * The XESet* functions are public Xlib entry points: like + * XInitExtension() they take the display lock themselves, so the lock + * must be released around this block on a threaded libX11. + */ + + UnlockDisplay (display); + + XESetCloseDisplay (display, extCodes->extension, _XieCloseDisplay); + + + /* + * Tell Xlib how to convert wire events to host format. + */ + + XESetWireToEvent (display, extCodes->first_event + xieEvnNoColorAlloc, + _XieColorAllocEvent); + + XESetWireToEvent (display, extCodes->first_event + xieEvnNoDecodeNotify, + _XieDecodeNotifyEvent); + + XESetWireToEvent (display, extCodes->first_event + xieEvnNoExportAvailable, + _XieExportAvailableEvent); + + XESetWireToEvent (display, extCodes->first_event + xieEvnNoImportObscured, + _XieImportObscuredEvent); + + XESetWireToEvent (display, extCodes->first_event + xieEvnNoPhotofloDone, + _XiePhotofloDoneEvent); + + + /* + * Tell Xlib how to convert Flo errors from wire to host format. + * Xlib can convert the other errors for us. + */ + + XESetWireToError (display, extCodes->first_error + xieErrNoFlo, + _XieFloError); + + + /* + * Tell Xlib how to print XIE errors. + */ + + XESetPrintErrorValues (display, extCodes->extension, _XiePrintError); + + LockDisplay (display); + + /* + * If this is the first time XieInitialize has been called, + * we must register the standard technique functions. + */ + + if (!_XieTechFuncsInitialized) + { + _XieInitTechFuncTable (); + _XieTechFuncsInitialized = 1; + } + + + UnlockDisplay (display); + SYNC_HANDLE (display); + + return (1); +} + + + +Status +XieQueryTechniques (display, technique_group, ntechniques_ret, techniques_ret) + +Display *display; +XieTechniqueGroup technique_group; +int *ntechniques_ret; +XieTechnique **techniques_ret; + +{ + xieQueryTechniquesReq *req; + xieQueryTechniquesReply rep; + char *pBuf, *pBufStart; + XieTechnique *techRet; + xieTypTechniqueRec *techRec; + int i; + + LockDisplay (display); + + GET_REQUEST (QueryTechniques, pBuf); + + BEGIN_REQUEST_HEADER (QueryTechniques, pBuf, req); + + STORE_REQUEST_HEADER (QueryTechniques, req); + req->techniqueGroup = technique_group; + + END_REQUEST_HEADER (QueryTechniques, pBuf, req); + + if (_XReply (display, (xReply *)&rep, 0, xFalse) == 0) + { + UnlockDisplay (display); + SYNC_HANDLE (display); + + *ntechniques_ret = 0; + *techniques_ret = NULL; + + return (0); + } + + XREAD_INTO_SCRATCH (display, pBuf, rep.length << 2); + pBufStart = pBuf; + + *ntechniques_ret = rep.numTechniques; + + *techniques_ret = techRet = (XieTechnique *) Xmalloc ( + sizeof (XieTechnique) * rep.numTechniques); + + for (i = 0; i < (int) rep.numTechniques; i++) + { + GET_TECHNIQUE_REC (pBuf, techRec); + pBuf += SIZEOF (xieTypTechniqueRec); + + techRet[i].needs_param = techRec->needsParam; + techRet[i].group = techRec->group; + techRet[i].number = techRec->number; + techRet[i].speed = techRec->speed; + + techRet[i].name = (char *) Xmalloc ( + (unsigned) techRec->nameLength + 1); + memcpy (techRet[i].name, pBuf, (unsigned) techRec->nameLength); + techRet[i].name[techRec->nameLength] = '\0'; + pBuf += PADDED_BYTES (techRec->nameLength); + } + + FINISH_WITH_SCRATCH (display, pBufStart, rep.length << 2); + UnlockDisplay (display); + SYNC_HANDLE (display); + + return (1); +} + + + +/* + * Routine called when a display is closed via XCloseDisplay. + * The extension information attached to this display is freed. + * The callback is set up in XieInitialize. + */ + +int +_XieCloseDisplay (display, codes) + +Display *display; +XExtCodes *codes; + +{ + XieExtInfo *xieExtInfo; + + REMOVE_EXTENSION_INFO (display, xieExtInfo); + + if (xieExtInfo == NULL) + return (0); + else + { + Xfree ((char *) xieExtInfo->extInfo->cnst_levels); + Xfree ((char *) xieExtInfo->extInfo); + Xfree ((char *) xieExtInfo); + return (1); + } +} + + + +/* + * Routine called when Xlib wants to print an error. This callback + * is setup in XieInitialize. + */ + +void +_XiePrintError (display, error, fp) + +Display *display; +XErrorEvent *error; +#if NeedFunctionPrototypes +void *fp; +#else +FILE *fp; +#endif +{ + XieExtInfo *xieExtInfo; + XieFloAccessError *flo_error = (XieFloAccessError *) error; + XieFloResourceError *res_error = (XieFloResourceError *) error; + XieFloDomainError *domain_error = (XieFloDomainError *) error; + XieFloOperatorError *operator_error = (XieFloOperatorError *) error; + XieFloTechniqueError *tech_error = (XieFloTechniqueError *) error; + XieFloValueError *value_error = (XieFloValueError *) error; + + /* + * Xlib bug - extension codes should be passed to this function, + * but they're not. We must get them ourselves. + */ + + GET_EXTENSION_INFO (display, xieExtInfo); + + if (error->error_code == + xieExtInfo->extCodes->first_error + xieErrNoFlo) + { + /* + * Print the flo error type. + */ + + fprintf (fp, " Flo error: "); + + switch (flo_error->flo_error_code) + { + case xieErrNoFloAccess: + fprintf (fp, "FloAccess\n"); + break; + case xieErrNoFloAlloc: + fprintf (fp, "FloAlloc\n"); + break; + case xieErrNoFloElement: + fprintf (fp, "FloElement\n"); + break; + case xieErrNoFloID: + fprintf (fp, "FloID\n"); + break; + case xieErrNoFloMatch: + fprintf (fp, "FloMatch\n"); + break; + case xieErrNoFloSource: + fprintf (fp, "FloSource\n"); + break; + case xieErrNoFloColormap: + fprintf (fp, "FloColormap\n"); + break; + case xieErrNoFloColorList: + fprintf (fp, "FloColorList\n"); + break; + case xieErrNoFloDrawable: + fprintf (fp, "FloDrawable\n"); + break; + case xieErrNoFloGC: + fprintf (fp, "FloGC\n"); + break; + case xieErrNoFloLUT: + fprintf (fp, "FloLUT\n"); + break; + case xieErrNoFloPhotomap: + fprintf (fp, "FloPhotomap\n"); + break; + case xieErrNoFloROI: + fprintf (fp, "FloROI\n"); + break; + case xieErrNoFloDomain: + fprintf (fp, "FloDomain\n"); + break; + case xieErrNoFloOperator: + fprintf (fp, "FloOperator\n"); + break; + case xieErrNoFloTechnique: + fprintf (fp, "FloTechnique\n"); + break; + case xieErrNoFloValue: + fprintf (fp, "FloValue\n"); + break; + case xieErrNoFloImplementation: + fprintf (fp, "FloImplementation\n"); + break; + default: + break; + } + + + /* + * All flo errors have this basic info to print. + */ + + fprintf (fp, " Name-space: 0x%lx\n", flo_error->name_space); + fprintf (fp, " Phototag: %d\n", flo_error->phototag); + fprintf (fp, " Element type: %d\n", flo_error->elem_type); + + + /* + * Now handle the particularites of each flo error. + */ + + switch (flo_error->flo_error_code) + { + case xieErrNoFloAccess: + case xieErrNoFloAlloc: + case xieErrNoFloElement: + case xieErrNoFloID: + case xieErrNoFloMatch: + case xieErrNoFloSource: + case xieErrNoFloImplementation: + break; + + case xieErrNoFloColormap: + fprintf (fp, " Colormap: 0x%lx\n", res_error->resource_id); + break; + + case xieErrNoFloColorList: + fprintf (fp, " ColorList: 0x%lx\n", res_error->resource_id); + break; + + case xieErrNoFloDrawable: + fprintf (fp, " Drawable: 0x%lx\n", res_error->resource_id); + break; + + case xieErrNoFloGC: + fprintf (fp, " GC: 0x%lx\n", res_error->resource_id); + break; + + case xieErrNoFloLUT: + fprintf (fp, " LUT: 0x%lx\n", res_error->resource_id); + break; + + case xieErrNoFloPhotomap: + fprintf (fp, " Photomap: 0x%lx\n", res_error->resource_id); + break; + + case xieErrNoFloROI: + fprintf (fp, " ROI: 0x%lx\n", res_error->resource_id); + break; + + case xieErrNoFloDomain: + fprintf (fp, " Phototag of domain src: %d\n", + domain_error->domain_src); + break; + + case xieErrNoFloOperator: + fprintf (fp, " Operator: 0x%lx\n", operator_error->operator); + break; + + case xieErrNoFloTechnique: + fprintf (fp, " Technique number: 0x%lx\n", + tech_error->technique_number); + fprintf (fp, " Number of technique params: %d\n", + tech_error->num_tech_params); + fprintf (fp, " Technique group: %d\n", + tech_error->tech_group); + break; + + case xieErrNoFloValue: + fprintf (fp, " Bad value: 0x%lx\n", value_error->bad_value); + break; + + default: + break; + } + } +} diff --git a/xie/xc/lib/XIE/init.h b/xie/xc/lib/XIE/init.h new file mode 100644 index 0000000..8da2115 --- /dev/null +++ b/xie/xc/lib/XIE/init.h @@ -0,0 +1,45 @@ +/* $XConsortium: init.h,v 1.3 94/04/17 20:18:25 mor Exp $ */ + +/* + +Copyright (c) 1993 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#ifndef WORD64 + +#define GET_TECHNIQUE_REC(_pBuf, _techRec) \ + _techRec = (xieTypTechniqueRec *) _pBuf; + +#else /* WORD64 */ + +#define GET_TECHNIQUE_REC(_pBuf, _techRec) \ + xieTypTechniqueRec temp; \ + memcpy (&temp, _pBuf, SIZEOF (xieTypTechniqueRec)); \ + _techRec = &temp; + +#endif /* WORD64 */ diff --git a/xie/xc/lib/XIE/jump_funcs b/xie/xc/lib/XIE/jump_funcs new file mode 100644 index 0000000..056cce3 --- /dev/null +++ b/xie/xc/lib/XIE/jump_funcs @@ -0,0 +1,197 @@ +# $XConsortium: jump_funcs,v 1.2 94/12/07 10:44:37 kaleb Exp $ +# $XFree86: xc/lib/XIE/jump_funcs,v 3.0 1994/04/28 12:31:33 dawes Exp $ +00000000 T _XieAbort libXIE abort +00000000 T _XieAwait libXIE await +00000000 T _XiePutClientData libXIE clientdata +00000000 T _XieGetClientData libXIE clientdata +00000000 T _XieCreateColorList libXIE colorlist +00000000 T _XieDestroyColorList libXIE colorlist +00000000 T _XiePurgeColorList libXIE colorlist +00000000 T _XieQueryColorList libXIE colorlist +00000000 T _XieFloImportClientLUT libXIE conven +00000000 T _XieFloImportClientPhoto libXIE conven +00000000 T _XieFloImportClientROI libXIE conven +00000000 T _XieFloImportDrawable libXIE conven +00000000 T _XieFloImportDrawablePlane libXIE conven +00000000 T _XieFloImportLUT libXIE conven +00000000 T _XieFloImportPhotomap libXIE conven +00000000 T _XieFloImportROI libXIE conven +00000000 T _XieFloArithmetic libXIE conven +00000000 T _XieFloBandCombine libXIE conven +00000000 T _XieFloBandExtract libXIE conven +00000000 T _XieFloBandSelect libXIE conven +00000000 T _XieFloBlend libXIE conven +00000000 T _XieFloCompare libXIE conven +00000000 T _XieFloConstrain libXIE conven +00000000 T _XieFloConvertFromIndex libXIE conven +00000000 T _XieFloConvertFromRGB libXIE conven +00000000 T _XieFloConvertToIndex libXIE conven +00000000 T _XieFloConvertToRGB libXIE conven +00000000 T _XieFloConvolve libXIE conven +00000000 T _XieFloDither libXIE conven +00000000 T _XieFloGeometry libXIE conven +00000000 T _XieFloLogical libXIE conven +00000000 T _XieFloMatchHistogram libXIE conven +00000000 T _XieFloMath libXIE conven +00000000 T _XieFloPasteUp libXIE conven +00000000 T _XieFloPoint libXIE conven +00000000 T _XieFloUnconstrain libXIE conven +00000000 T _XieFloExportClientHistogram libXIE conven +00000000 T _XieFloExportClientLUT libXIE conven +00000000 T _XieFloExportClientPhoto libXIE conven +00000000 T _XieFloExportClientROI libXIE conven +00000000 T _XieFloExportDrawable libXIE conven +00000000 T _XieFloExportDrawablePlane libXIE conven +00000000 T _XieFloExportLUT libXIE conven +00000000 T _XieFloExportPhotomap libXIE conven +00000000 T _XieFloExportROI libXIE conven +00000000 T _XieTecColorAllocAll libXIE conven +00000000 T _XieTecColorAllocMatch libXIE conven +00000000 T _XieTecColorAllocRequantize libXIE conven +00000000 T _XieTecRGBToCIELab libXIE conven +00000000 T _XieTecRGBToCIEXYZ libXIE conven +00000000 T _XieTecRGBToYCbCr libXIE conven +00000000 T _XieTecRGBToYCC libXIE conven +00000000 T _XieTecCIELabToRGB libXIE conven +00000000 T _XieTecCIEXYZToRGB libXIE conven +00000000 T _XieTecYCbCrToRGB libXIE conven +00000000 T _XieTecYCCToRGB libXIE conven +00000000 T _XieTecClipScale libXIE conven +00000000 T _XieTecConvolveConstant libXIE conven +00000000 T _XieTecDecodeUncompressedSingle libXIE conven +00000000 T _XieTecDecodeUncompressedTriple libXIE conven +00000000 T _XieTecDecodeG31D libXIE conven +00000000 T _XieTecDecodeG32D libXIE conven +00000000 T _XieTecDecodeG42D libXIE conven +00000000 T _XieTecDecodeTIFF2 libXIE conven +00000000 T _XieTecDecodeTIFFPackBits libXIE conven +00000000 T _XieTecDecodeJPEGBaseline libXIE conven +00000000 T _XieTecDecodeJPEGLossless libXIE conven +00000000 T _XieTecDitherOrderedParam libXIE conven +00000000 T _XieTecEncodeUncompressedSingle libXIE conven +00000000 T _XieTecEncodeUncompressedTriple libXIE conven +00000000 T _XieTecEncodeG31D libXIE conven +00000000 T _XieTecEncodeG32D libXIE conven +00000000 T _XieTecEncodeG42D libXIE conven +00000000 T _XieTecEncodeJPEGBaseline libXIE conven +00000000 T _XieTecEncodeJPEGLossless libXIE conven +00000000 T _XieTecEncodeTIFF2 libXIE conven +00000000 T _XieTecEncodeTIFFPackBits libXIE conven +00000000 T _XieTecEncodeServerChoice libXIE conven +00000000 T _XieTecGeomAntialiasByArea libXIE conven +00000000 T _XieTecGeomAntialiasByLowpass libXIE conven +00000000 T _XieTecGeomGaussian libXIE conven +00000000 T _XieTecGeomNearestNeighbor libXIE conven +00000000 T _XieTecHistogramGaussian libXIE conven +00000000 T _XieTecHistogramHyperbolic libXIE conven +00000000 T _XieTecWhiteAdjustCIELabShift libXIE conven +00000000 T __XiePhotofloSize libXIE elements +00000000 T __XieElemImportClientLUT libXIE elements +00000000 T __XieElemImportClientPhoto libXIE elements +00000000 T __XieElemImportClientROI libXIE elements +00000000 T __XieElemImportDrawable libXIE elements +00000000 T __XieElemImportDrawablePlane libXIE elements +00000000 T __XieElemImportLUT libXIE elements +00000000 T __XieElemImportPhotomap libXIE elements +00000000 T __XieElemImportROI libXIE elements +00000000 T __XieElemArithmetic libXIE elements +00000000 T __XieElemBandCombine libXIE elements +00000000 T __XieElemBandExtract libXIE elements +00000000 T __XieElemBandSelect libXIE elements +00000000 T __XieElemBlend libXIE elements +00000000 T __XieElemCompare libXIE elements +00000000 T __XieElemConstrain libXIE elements +00000000 T __XieElemConvertFromIndex libXIE elements +00000000 T __XieElemConvertFromRGB libXIE elements +00000000 T __XieElemConvertToIndex libXIE elements +00000000 T __XieElemConvertToRGB libXIE elements +00000000 T __XieElemConvolve libXIE elements +00000000 T __XieElemDither libXIE elements +00000000 T __XieElemGeometry libXIE elements +00000000 T __XieElemLogical libXIE elements +00000000 T __XieElemMatchHistogram libXIE elements +00000000 T __XieElemMath libXIE elements +00000000 T __XieElemPasteUp libXIE elements +00000000 T __XieElemPoint libXIE elements +00000000 T __XieElemUnconstrain libXIE elements +00000000 T __XieElemExportClientHistogram libXIE elements +00000000 T __XieElemExportClientLUT libXIE elements +00000000 T __XieElemExportClientPhoto libXIE elements +00000000 T __XieElemExportClientROI libXIE elements +00000000 T __XieElemExportDrawable libXIE elements +00000000 T __XieElemExportDrawablePlane libXIE elements +00000000 T __XieElemExportLUT libXIE elements +00000000 T __XieElemExportPhotomap libXIE elements +00000000 T __XieElemExportROI libXIE elements +00000000 T __XieFloError libXIE errors +00000000 T __XieColorAllocEvent libXIE events +00000000 T __XieDecodeNotifyEvent libXIE events +00000000 T __XieExportAvailableEvent libXIE events +00000000 T __XieImportObscuredEvent libXIE events +00000000 T __XiePhotofloDoneEvent libXIE events +00000000 T _XieFreeTechniques libXIE free +00000000 T _XieFreePhotofloGraph libXIE free +00000000 T _XieFreeEncodeJPEGBaseline libXIE free +00000000 T _XieFreeEncodeJPEGLossless libXIE free +00000000 T _XieFreePasteUpTiles libXIE free +00000000 T __XieConvertToIEEE libXIE ieee +00000000 T _XieInitialize libXIE init +00000000 T _XieQueryTechniques libXIE init +00000000 T __XieCloseDisplay libXIE init +00000000 T __XiePrintError libXIE init +00000000 T _XieCreateLUT libXIE lut +00000000 T _XieDestroyLUT libXIE lut +00000000 T _XieAllocatePhotofloGraph libXIE photoflo +00000000 T _XieCreatePhotoflo libXIE photoflo +00000000 T _XieDestroyPhotoflo libXIE photoflo +00000000 T _XieExecutePhotoflo libXIE photoflo +00000000 T _XieModifyPhotoflo libXIE photoflo +00000000 T _XieRedefinePhotoflo libXIE photoflo +00000000 T _XieQueryPhotoflo libXIE photoflo +00000000 T _XieCreatePhotomap libXIE photomap +00000000 T _XieDestroyPhotomap libXIE photomap +00000000 T _XieQueryPhotomap libXIE photomap +00000000 T _XieCreatePhotospace libXIE photospace +00000000 T _XieDestroyPhotospace libXIE photospace +00000000 T _XieExecuteImmediate libXIE photospace +00000000 T _XieCreateROI libXIE roi +00000000 T _XieDestroyROI libXIE roi +00000000 T __XieTechniqueLength libXIE technique +00000000 T __XieEncodeTechnique libXIE technique +00000000 T __XieColorAllocAllParam libXIE technique +00000000 T __XieColorAllocMatchParam libXIE technique +00000000 T __XieColorAllocRequantizeParam libXIE technique +00000000 T __XieRGBToCIELabParam libXIE technique +00000000 T __XieRGBToYCbCrParam libXIE technique +00000000 T __XieRGBToYCCParam libXIE technique +00000000 T __XieYCbCrToRGBParam libXIE technique +00000000 T __XieYCCToRGBParam libXIE technique +00000000 T __XieCIELabToRGBParam libXIE technique +00000000 T __XieConvolveConstantParam libXIE technique +00000000 T __XieClipScaleParam libXIE technique +00000000 T __XieDecodeUncompressedSingleParam libXIE technique +00000000 T __XieDecodeUncompressedTripleParam libXIE technique +00000000 T __XieDecodeG31DParam libXIE technique +00000000 T __XieDecodeTIFFPackBitsParam libXIE technique +00000000 T __XieDecodeJPEGBaselineParam libXIE technique +00000000 T __XieDitherOrderedParam libXIE technique +00000000 T __XieEncodeUncompressedSingleParam libXIE technique +00000000 T __XieEncodeUncompressedTripleParam libXIE technique +00000000 T __XieEncodeG31DParam libXIE technique +00000000 T __XieEncodeTIFFPackBitsParam libXIE technique +00000000 T __XieEncodeServerChoiceParam libXIE technique +00000000 T __XieEncodeG32DParam libXIE technique +00000000 T __XieEncodeG42DParam libXIE technique +00000000 T __XieEncodeJPEGBaselineParam libXIE technique +00000000 T __XieEncodeJPEGLosslessParam libXIE technique +00000000 T __XieEncodeTIFF2Param libXIE technique +00000000 T __XieGeomAntialiasByAreaParam libXIE technique +00000000 T __XieGeomAntialiasByLowpassParam libXIE technique +00000000 T __XieGeomGaussianParam libXIE technique +00000000 T __XieGeomNearestNeighborParam libXIE technique +00000000 T __XieHistogramGaussianParam libXIE technique +00000000 T __XieHistogramHyperbolicParam libXIE technique +00000000 T __XieWhiteAdjustCIELabShiftParam libXIE technique +00000000 T __XieInitTechFuncTable libXIE technique +00000000 T __XieRegisterTechFunc libXIE utils +00000000 T __XieLookupTechFunc libXIE utils diff --git a/xie/xc/lib/XIE/jump_ignore b/xie/xc/lib/XIE/jump_ignore new file mode 100644 index 0000000..1eec3d3 --- /dev/null +++ b/xie/xc/lib/XIE/jump_ignore @@ -0,0 +1,3 @@ +# $XConsortium: jump_ignore,v 1.2 94/12/07 10:44:37 kaleb Exp $ +# $XFree86: xc/lib/XIE/jump_ignore,v 3.0 1994/04/28 12:31:35 dawes Exp $ +# jump_ignore diff --git a/xie/xc/lib/XIE/jump_vars b/xie/xc/lib/XIE/jump_vars new file mode 100644 index 0000000..5ea35a1 --- /dev/null +++ b/xie/xc/lib/XIE/jump_vars @@ -0,0 +1,6 @@ +# $XConsortium: jump_vars,v 1.2 94/12/07 10:44:37 kaleb Exp $ +# $XFree86: xc/lib/XIE/jump_vars,v 3.0 1994/04/28 12:31:38 dawes Exp $ +00000004 D __XieExtInfoHeader libXIE init +000000b4 D __XieElemFuncs libXIE init +00000004 D __XieTechFuncsInitialized libXIE init +00000080 C __XieTechFuncs libXIE init diff --git a/xie/xc/lib/XIE/lut.c b/xie/xc/lib/XIE/lut.c new file mode 100644 index 0000000..dd1c352 --- /dev/null +++ b/xie/xc/lib/XIE/lut.c @@ -0,0 +1,89 @@ +/* $XConsortium: lut.c,v 1.2 94/04/17 20:18:26 mor Exp $ */ + +/* + +Copyright (c) 1993 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#include "XIElibint.h" + + +XieLut +XieCreateLUT (display) + +Display *display; + +{ + xieCreateLUTReq *req; + char *pBuf; + XieLut id; + + LockDisplay (display); + + id = XAllocID (display); + + GET_REQUEST (CreateLUT, pBuf); + + BEGIN_REQUEST_HEADER (CreateLUT, pBuf, req); + + STORE_REQUEST_HEADER (CreateLUT, req); + req->lut = id; + + END_REQUEST_HEADER (CreateLUT, pBuf, req); + + UnlockDisplay (display); + SYNC_HANDLE (display); + + return (id); +} + + +void +XieDestroyLUT (display, lut) + +Display *display; +XieLut lut; + +{ + xieDestroyLUTReq *req; + char *pBuf; + + LockDisplay (display); + + GET_REQUEST (DestroyLUT, pBuf); + + BEGIN_REQUEST_HEADER (DestroyLUT, pBuf, req); + + STORE_REQUEST_HEADER (DestroyLUT, req); + req->lut = lut; + + END_REQUEST_HEADER (DestroyLUT, pBuf, req); + + UnlockDisplay (display); + SYNC_HANDLE (display); +} diff --git a/xie/xc/lib/XIE/photoflo.c b/xie/xc/lib/XIE/photoflo.c new file mode 100644 index 0000000..8df4c0c --- /dev/null +++ b/xie/xc/lib/XIE/photoflo.c @@ -0,0 +1,323 @@ +/* $XConsortium: photoflo.c,v 1.6 94/05/13 10:30:17 mor Exp $ */ + +/* + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#include "XIElibint.h" + + +XiePhotoElement * +XieAllocatePhotofloGraph (count) + +unsigned int count; + +{ + XiePhotoElement *ptr; + unsigned size; + + size = count * sizeof (XiePhotoElement); + ptr = (XiePhotoElement *) Xmalloc (size); + bzero ((char *) ptr, size); + + return (ptr); +} + + +XiePhotoflo +XieCreatePhotoflo (display, elem_list, elem_count) + +Display *display; +XiePhotoElement *elem_list; +int elem_count; + +{ + xieCreatePhotofloReq *req; + char *pBuf, *pStart; + unsigned size; + XiePhotoflo id; + int i; + + LockDisplay (display); + + id = XAllocID (display); + + size = _XiePhotofloSize (elem_list, elem_count); + + GET_REQUEST (CreatePhotoflo, pBuf); + + BEGIN_REQUEST_HEADER (CreatePhotoflo, pBuf, req); + + STORE_REQUEST_EXTRA_HEADER (CreatePhotoflo, size, req); + req->floID = id; + req->numElements = elem_count; + + END_REQUEST_HEADER (CreatePhotoflo, pBuf, req); + + pBuf = pStart = _XAllocScratch (display, size); + + for (i = 0; i < elem_count; i++) + (*_XieElemFuncs[elem_list[i].elemType - 1]) (&pBuf, &elem_list[i]); + + Data (display, pStart, size); + + UnlockDisplay (display); + SYNC_HANDLE (display); + + return (id); +} + + +void +XieDestroyPhotoflo (display, photoflo) + +Display *display; +XiePhotoflo photoflo; + +{ + xieDestroyPhotofloReq *req; + char *pBuf; + + LockDisplay (display); + + GET_REQUEST (DestroyPhotoflo, pBuf); + + BEGIN_REQUEST_HEADER (DestroyPhotoflo, pBuf, req); + + STORE_REQUEST_HEADER (DestroyPhotoflo, req); + req->floID = photoflo; + + END_REQUEST_HEADER (DestroyPhotoflo, pBuf, req); + + UnlockDisplay (display); + SYNC_HANDLE (display); +} + + +void +XieExecutePhotoflo (display, photoflo, notify) + +Display *display; +XiePhotoflo photoflo; +Bool notify; + +{ + xieExecutePhotofloReq *req; + char *pBuf; + + LockDisplay (display); + + GET_REQUEST (ExecutePhotoflo, pBuf); + + BEGIN_REQUEST_HEADER (ExecutePhotoflo, pBuf, req); + + STORE_REQUEST_HEADER (ExecutePhotoflo, req); + req->floID = photoflo; + req->notify = notify; + + END_REQUEST_HEADER (ExecutePhotoflo, pBuf, req); + + UnlockDisplay (display); + SYNC_HANDLE (display); +} + + +void +XieModifyPhotoflo (display, photoflo, start, elem_list, elem_count) + +Display *display; +XiePhotoflo photoflo; +int start; +XiePhotoElement *elem_list; +int elem_count; + +{ + xieModifyPhotofloReq *req; + char *pBuf, *pStart; + unsigned size; + int i; + + LockDisplay (display); + + size = _XiePhotofloSize (elem_list, elem_count); + + GET_REQUEST (ModifyPhotoflo, pBuf); + + BEGIN_REQUEST_HEADER (ModifyPhotoflo, pBuf, req); + + STORE_REQUEST_EXTRA_HEADER (ModifyPhotoflo, size, req); + req->floID = photoflo; + req->start = start; + req->numElements = elem_count; + + END_REQUEST_HEADER (ModifyPhotoflo, pBuf, req); + + pBuf = pStart = _XAllocScratch (display, size); + + for (i = 0; i < elem_count; i++) + (*_XieElemFuncs[elem_list[i].elemType - 1]) (&pBuf, &elem_list[i]); + + Data (display, pStart, size); + + UnlockDisplay (display); + SYNC_HANDLE (display); +} + + +void +XieRedefinePhotoflo (display, photoflo, elem_list, elem_count) + +Display *display; +XiePhotoflo photoflo; +XiePhotoElement *elem_list; +int elem_count; + +{ + xieRedefinePhotofloReq *req; + char *pBuf, *pStart; + unsigned size; + int i; + + LockDisplay (display); + + size = _XiePhotofloSize (elem_list, elem_count); + + GET_REQUEST (RedefinePhotoflo, pBuf); + + BEGIN_REQUEST_HEADER (RedefinePhotoflo, pBuf, req); + + STORE_REQUEST_EXTRA_HEADER (RedefinePhotoflo, size, req); + req->floID = photoflo; + req->numElements = elem_count; + + END_REQUEST_HEADER (RedefinePhotoflo, pBuf, req); + + pBuf = pStart = _XAllocScratch (display, size); + + for (i = 0; i < elem_count; i++) + (*_XieElemFuncs[elem_list[i].elemType - 1]) (&pBuf, &elem_list[i]); + + Data (display, pStart, size); + + UnlockDisplay (display); + SYNC_HANDLE (display); +} + + +Status +XieQueryPhotoflo (display, name_space, flo_id, + state_ret, data_expected_ret, nexpected_ret, + data_available_ret, navailable_ret) + +Display *display; +unsigned long name_space; +unsigned long flo_id; +XiePhotofloState *state_ret; +XiePhototag **data_expected_ret; +unsigned int *nexpected_ret; +XiePhototag **data_available_ret; +unsigned int *navailable_ret; + +{ + xieQueryPhotofloReq *req; + xieQueryPhotofloReply rep; + char *pBuf; + int i; + + LockDisplay (display); + + GET_REQUEST (QueryPhotoflo, pBuf); + + BEGIN_REQUEST_HEADER (QueryPhotoflo, pBuf, req); + + STORE_REQUEST_HEADER (QueryPhotoflo, req); + req->nameSpace = name_space; + req->floID = flo_id; + + END_REQUEST_HEADER (QueryPhotoflo, pBuf, req); + + *state_ret = 0; + *nexpected_ret = 0; + *data_expected_ret = NULL; + *navailable_ret = 0; + *data_available_ret = NULL; + + if (_XReply (display, (xReply *)&rep, 0, xFalse) == 0) + { + UnlockDisplay (display); + SYNC_HANDLE (display); + + return (0); + } + + *state_ret = rep.state; + + if (rep.expectedCount > 0) + { + short *temp = (short *) _XAllocTemp (display, + sizeof (short) * rep.expectedCount); + + *nexpected_ret = rep.expectedCount; + *data_expected_ret = (XiePhototag *) Xmalloc ( + sizeof (XiePhototag) * rep.expectedCount); + + _XRead16Pad (display, temp, + rep.expectedCount * SIZEOF (xieTypPhototag)); + + for (i = 0; i < rep.expectedCount; i++) + (*data_expected_ret)[i] = (XiePhototag) temp[i]; + + _XFreeTemp (display, (char *) temp, + sizeof (short) * rep.expectedCount); + } + + if (rep.availableCount > 0) + { + short *temp = (short *) _XAllocTemp (display, + sizeof (short) * rep.availableCount); + + *navailable_ret = rep.availableCount; + *data_available_ret = (XiePhototag *) Xmalloc ( + sizeof (XiePhototag) * rep.availableCount); + + _XRead16Pad (display, temp, + rep.availableCount * SIZEOF (xieTypPhototag)); + + for (i = 0; i < rep.availableCount; i++) + (*data_available_ret)[i] = (XiePhototag) temp[i]; + + _XFreeTemp (display, (char *) temp, + sizeof (short) * rep.availableCount); + } + + UnlockDisplay (display); + SYNC_HANDLE (display); + + return (1); +} diff --git a/xie/xc/lib/XIE/photomap.c b/xie/xc/lib/XIE/photomap.c new file mode 100644 index 0000000..fb41eec --- /dev/null +++ b/xie/xc/lib/XIE/photomap.c @@ -0,0 +1,149 @@ +/* $XConsortium: photomap.c,v 1.6 94/04/17 20:18:27 rws Exp $ */ + +/* + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#include "XIElibint.h" + + +XiePhotomap +XieCreatePhotomap (display) + +Display *display; + +{ + xieCreatePhotomapReq *req; + char *pBuf; + XiePhotomap id; + + LockDisplay (display); + + id = XAllocID (display); + + GET_REQUEST (CreatePhotomap, pBuf); + + BEGIN_REQUEST_HEADER (CreatePhotomap, pBuf, req); + + STORE_REQUEST_HEADER (CreatePhotomap, req); + req->photomap = id; + + END_REQUEST_HEADER (CreatePhotomap, pBuf, req); + + UnlockDisplay (display); + SYNC_HANDLE (display); + + return (id); +} + + +void +XieDestroyPhotomap (display, photomap) + +Display *display; +XiePhotomap photomap; + +{ + xieDestroyPhotomapReq *req; + char *pBuf; + + LockDisplay (display); + + GET_REQUEST (DestroyPhotomap, pBuf); + + BEGIN_REQUEST_HEADER (DestroyPhotomap, pBuf, req); + + STORE_REQUEST_HEADER (DestroyPhotomap, req); + req->photomap = photomap; + + END_REQUEST_HEADER (DestroyPhotomap, pBuf, req); + + UnlockDisplay (display); + SYNC_HANDLE (display); +} + + +Status +XieQueryPhotomap (display, photomap, populated_ret, datatype_ret, + dataclass_ret, decode_technique_ret, width_ret, height_ret, levels_ret) + +Display *display; +XiePhotomap photomap; +Bool *populated_ret; +XieDataType *datatype_ret; +XieDataClass *dataclass_ret; +XieDecodeTechnique *decode_technique_ret; +XieLTriplet width_ret; +XieLTriplet height_ret; +XieLTriplet levels_ret; + +{ + xieQueryPhotomapReq *req; + xieQueryPhotomapReply rep; + char *pBuf; + + LockDisplay (display); + + GET_REQUEST (QueryPhotomap, pBuf); + + BEGIN_REQUEST_HEADER (QueryPhotomap, pBuf, req); + + STORE_REQUEST_HEADER (QueryPhotomap, req); + req->photomap = photomap; + + END_REQUEST_HEADER (QueryPhotomap, pBuf, req); + + if (_XReply (display, (xReply *)&rep, + (SIZEOF (xieQueryPhotomapReply) - 32) >> 2, xTrue) == 0) + { + UnlockDisplay (display); + SYNC_HANDLE (display); + + return (0); + } + + *populated_ret = rep.populated; + *datatype_ret = rep.dataType; + *dataclass_ret = rep.dataClass; + *decode_technique_ret = rep.decodeTechnique; + width_ret[0] = rep.width0; + width_ret[1] = rep.width1; + width_ret[2] = rep.width2; + height_ret[0] = rep.height0; + height_ret[1] = rep.height1; + height_ret[2] = rep.height2; + levels_ret[0] = rep.levels0; + levels_ret[1] = rep.levels1; + levels_ret[2] = rep.levels2; + + UnlockDisplay (display); + SYNC_HANDLE (display); + + return (1); +} diff --git a/xie/xc/lib/XIE/photospace.c b/xie/xc/lib/XIE/photospace.c new file mode 100644 index 0000000..23ae3d1 --- /dev/null +++ b/xie/xc/lib/XIE/photospace.c @@ -0,0 +1,137 @@ +/* $XConsortium: photospace.c,v 1.2 94/04/17 20:18:27 mor Exp $ */ + +/* + +Copyright (c) 1993 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#include "XIElibint.h" + + + +XiePhotospace +XieCreatePhotospace (display) + +Display *display; + +{ + xieCreatePhotospaceReq *req; + char *pBuf; + XiePhotospace id; + + LockDisplay (display); + + id = XAllocID (display); + + GET_REQUEST (CreatePhotospace, pBuf); + + BEGIN_REQUEST_HEADER (CreatePhotospace, pBuf, req); + + STORE_REQUEST_HEADER (CreatePhotospace, req); + req->nameSpace = id; + + END_REQUEST_HEADER (CreatePhotospace, pBuf, req); + + UnlockDisplay (display); + SYNC_HANDLE (display); + + return (id); +} + + +void +XieDestroyPhotospace (display, photospace) + +Display *display; +XiePhotospace photospace; + +{ + xieDestroyPhotospaceReq *req; + char *pBuf; + + LockDisplay (display); + + GET_REQUEST (DestroyPhotospace, pBuf); + + BEGIN_REQUEST_HEADER (DestroyPhotospace, pBuf, req); + + STORE_REQUEST_HEADER (DestroyPhotospace, req); + req->nameSpace = photospace; + + END_REQUEST_HEADER (DestroyPhotospace, pBuf, req); + + UnlockDisplay (display); + SYNC_HANDLE (display); +} + + +void +XieExecuteImmediate (display, photospace, flo_id, + notify, elem_list, elem_count) + +Display *display; +XiePhotospace photospace; +unsigned long flo_id; +Bool notify; +XiePhotoElement *elem_list; +int elem_count; + +{ + xieExecuteImmediateReq *req; + char *pBuf, *pStart; + unsigned size; + int i; + + LockDisplay (display); + + size = _XiePhotofloSize (elem_list, elem_count); + + GET_REQUEST (ExecuteImmediate, pBuf); + + BEGIN_REQUEST_HEADER (ExecuteImmediate, pBuf, req); + + STORE_REQUEST_EXTRA_HEADER (ExecuteImmediate, size, req); + req->nameSpace = photospace; + req->floID = flo_id; + req->numElements = elem_count; + req->notify = notify; + + END_REQUEST_HEADER (ExecuteImmediate, pBuf, req); + + pBuf = pStart = _XAllocScratch (display, size); + + for (i = 0; i < elem_count; i++) + (*_XieElemFuncs[elem_list[i].elemType - 1]) (&pBuf, &elem_list[i]); + + Data (display, pStart, size); + + UnlockDisplay (display); + SYNC_HANDLE (display); +} + + diff --git a/xie/xc/lib/XIE/roi.c b/xie/xc/lib/XIE/roi.c new file mode 100644 index 0000000..68f8313 --- /dev/null +++ b/xie/xc/lib/XIE/roi.c @@ -0,0 +1,89 @@ +/* $XConsortium: roi.c,v 1.2 94/04/17 20:18:28 mor Exp $ */ + +/* + +Copyright (c) 1993 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#include "XIElibint.h" + + +XieRoi +XieCreateROI (display) + +Display *display; + +{ + xieCreateROIReq *req; + char *pBuf; + XieRoi id; + + LockDisplay (display); + + id = XAllocID (display); + + GET_REQUEST (CreateROI, pBuf); + + BEGIN_REQUEST_HEADER (CreateROI, pBuf, req); + + STORE_REQUEST_HEADER (CreateROI, req); + req->roi = id; + + END_REQUEST_HEADER (CreateROI, pBuf, req); + + UnlockDisplay (display); + SYNC_HANDLE (display); + + return (id); +} + + +void +XieDestroyROI (display, roi) + +Display *display; +XieRoi roi; + +{ + xieDestroyROIReq *req; + char *pBuf; + + LockDisplay (display); + + GET_REQUEST (DestroyROI, pBuf); + + BEGIN_REQUEST_HEADER (DestroyROI, pBuf, req); + + STORE_REQUEST_HEADER (DestroyROI, req); + req->roi = roi; + + END_REQUEST_HEADER (DestroyROI, pBuf, req); + + UnlockDisplay (display); + SYNC_HANDLE (display); +} diff --git a/xie/xc/lib/XIE/technique.c b/xie/xc/lib/XIE/technique.c new file mode 100644 index 0000000..958e781 --- /dev/null +++ b/xie/xc/lib/XIE/technique.c @@ -0,0 +1,1307 @@ +/* $XConsortium: technique.c,v 1.7 94/04/17 20:18:28 mor Exp $ */ + +/* + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#include "XIElibint.h" +#include "technique.h" + +extern XieTechFuncPtr _XieLookupTechFunc(); + + +int +_XieTechniqueLength (group, technique, param) + +int group; +int technique; +XiePointer param; + +{ + XieTechFuncPtr techfunc = _XieLookupTechFunc (group, technique); + int length; + + if (techfunc) + length = (*techfunc) (NULL, param, 0); + else + length = 0; + + return (length); +} + + +void +_XieEncodeTechnique (bufDest, group, technique, param) + +char **bufDest; +int group; +int technique; +XiePointer param; + +{ + XieTechFuncPtr techfunc = _XieLookupTechFunc (group, technique); + + if (techfunc) + (void) (*techfunc) (bufDest, param, 1); +} + + + +int +_XieColorAllocAllParam (bufDest, srcParam, encode) + +char **bufDest; +XieColorAllocAllParam *srcParam; +int encode; + +{ + int length = LENOF (CARD32); + + if (srcParam == NULL) + return(0); + + if (encode) + STORE_CARD32 (srcParam->fill, *bufDest); + + return (length); +} + + +int +_XieColorAllocMatchParam (bufDest, srcParam, encode) + +char **bufDest; +XieColorAllocMatchParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecColorAllocMatch); + xieTecColorAllocMatch *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecColorAllocMatch, *bufDest, dstParam); + + dstParam->matchLimit = _XieConvertToIEEE (srcParam->match_limit); + dstParam->grayLimit = _XieConvertToIEEE (srcParam->gray_limit); + + END_TECHNIQUE (xieTecColorAllocMatch, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieColorAllocRequantizeParam (bufDest, srcParam, encode) + +char **bufDest; +XieColorAllocRequantizeParam *srcParam; +int encode; + +{ + int length = LENOF (CARD32); + + if (srcParam == NULL) + return(0); + + if (encode) + STORE_CARD32 (srcParam->max_cells, *bufDest); + + return (length); +} + + +int +_XieRGBToCIELabParam (bufDest, srcParam, encode) + +char **bufDest; +XieRGBToCIELabParam *srcParam; +int encode; + +{ + int length, techLen; + xieTecRGBToCIELab *dstParam; + + if (srcParam == NULL) + return(0); + + techLen = _XieTechniqueLength (xieValWhiteAdjust, + srcParam->white_adjust_tech, srcParam->white_adjust_param); + + length = LENOF (xieTecRGBToCIELab) + techLen; + + if (encode) + { + BEGIN_TECHNIQUE (xieTecRGBToCIELab, *bufDest, dstParam); + + /* memcpy (dstParam->matrix00, srcParam->matrix, 36); */ + dstParam->matrix00 = _XieConvertToIEEE (srcParam->matrix[0]); + dstParam->matrix01 = _XieConvertToIEEE (srcParam->matrix[1]); + dstParam->matrix02 = _XieConvertToIEEE (srcParam->matrix[2]); + dstParam->matrix10 = _XieConvertToIEEE (srcParam->matrix[3]); + dstParam->matrix11 = _XieConvertToIEEE (srcParam->matrix[4]); + dstParam->matrix12 = _XieConvertToIEEE (srcParam->matrix[5]); + dstParam->matrix20 = _XieConvertToIEEE (srcParam->matrix[6]); + dstParam->matrix21 = _XieConvertToIEEE (srcParam->matrix[7]); + dstParam->matrix22 = _XieConvertToIEEE (srcParam->matrix[8]); + + dstParam->whiteAdjusted = srcParam->white_adjust_tech; + dstParam->lenParams = techLen; + + END_TECHNIQUE (xieTecRGBToCIELab, *bufDest, dstParam); + + _XieEncodeTechnique (bufDest, xieValWhiteAdjust, + srcParam->white_adjust_tech, srcParam->white_adjust_param); + } + + return (length); +} + + +int +_XieRGBToYCbCrParam (bufDest, srcParam, encode) + +char **bufDest; +XieRGBToYCbCrParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecRGBToYCbCr); + xieTecRGBToYCbCr *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecRGBToYCbCr, *bufDest, dstParam); + + dstParam->levels0 = srcParam->levels[0]; + dstParam->levels1 = srcParam->levels[1]; + dstParam->levels2 = srcParam->levels[2]; + dstParam->lumaRed = _XieConvertToIEEE (srcParam->luma_red); + dstParam->lumaGreen = _XieConvertToIEEE (srcParam->luma_green); + dstParam->lumaBlue = _XieConvertToIEEE (srcParam->luma_blue); + dstParam->bias0 = _XieConvertToIEEE (srcParam->bias[0]); + dstParam->bias1 = _XieConvertToIEEE (srcParam->bias[1]); + dstParam->bias2 = _XieConvertToIEEE (srcParam->bias[2]); + + END_TECHNIQUE (xieTecRGBToYCbCr, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieRGBToYCCParam (bufDest, srcParam, encode) + +char **bufDest; +XieRGBToYCCParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecRGBToYCC); + xieTecRGBToYCC *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecRGBToYCC, *bufDest, dstParam); + + dstParam->levels0 = srcParam->levels[0]; + dstParam->levels1 = srcParam->levels[1]; + dstParam->levels2 = srcParam->levels[2]; + dstParam->lumaRed = _XieConvertToIEEE (srcParam->luma_red); + dstParam->lumaGreen = _XieConvertToIEEE (srcParam->luma_green); + dstParam->lumaBlue = _XieConvertToIEEE (srcParam->luma_blue); + dstParam->scale = _XieConvertToIEEE (srcParam->scale); + + END_TECHNIQUE (xieTecRGBToYCC, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieYCbCrToRGBParam (bufDest, srcParam, encode) + +char **bufDest; +XieYCbCrToRGBParam *srcParam; +int encode; + +{ + int length, gamutLen; + xieTecYCbCrToRGB *dstParam; + + if (srcParam == NULL) + return(0); + + gamutLen = _XieTechniqueLength (xieValGamut, + srcParam->gamut_tech, srcParam->gamut_param); + + length = LENOF (xieTecYCbCrToRGB) + gamutLen; + + if (encode) + { + BEGIN_TECHNIQUE (xieTecYCbCrToRGB, *bufDest, dstParam); + + dstParam->levels0 = srcParam->levels[0]; + dstParam->levels1 = srcParam->levels[1]; + dstParam->levels2 = srcParam->levels[2]; + dstParam->lumaRed = _XieConvertToIEEE (srcParam->luma_red); + dstParam->lumaGreen = _XieConvertToIEEE (srcParam->luma_green); + dstParam->lumaBlue = _XieConvertToIEEE (srcParam->luma_blue); + dstParam->bias0 = _XieConvertToIEEE (srcParam->bias[0]); + dstParam->bias1 = _XieConvertToIEEE (srcParam->bias[1]); + dstParam->bias2 = _XieConvertToIEEE (srcParam->bias[2]); + dstParam->gamutCompress = srcParam->gamut_tech; + dstParam->lenGamutParams = gamutLen; + + END_TECHNIQUE (xieTecYCbCrToRGB, *bufDest, dstParam); + + _XieEncodeTechnique (bufDest, xieValGamut, + srcParam->gamut_tech, srcParam->gamut_param); + } + + return (length); +} + + +int +_XieYCCToRGBParam (bufDest, srcParam, encode) + +char **bufDest; +XieYCCToRGBParam *srcParam; +int encode; + +{ + int length, gamutLen; + xieTecYCCToRGB *dstParam; + + if (srcParam == NULL) + return(0); + + gamutLen = _XieTechniqueLength (xieValGamut, + srcParam->gamut_tech, srcParam->gamut_param); + + length = LENOF (xieTecYCCToRGB) + gamutLen; + + if (encode) + { + BEGIN_TECHNIQUE (xieTecYCCToRGB, *bufDest, dstParam); + + dstParam->levels0 = srcParam->levels[0]; + dstParam->levels1 = srcParam->levels[1]; + dstParam->levels2 = srcParam->levels[2]; + dstParam->lumaRed = _XieConvertToIEEE (srcParam->luma_red); + dstParam->lumaGreen = _XieConvertToIEEE (srcParam->luma_green); + dstParam->lumaBlue = _XieConvertToIEEE (srcParam->luma_blue); + dstParam->scale = _XieConvertToIEEE (srcParam->scale); + dstParam->gamutCompress = srcParam->gamut_tech; + dstParam->lenGamutParams = gamutLen; + + END_TECHNIQUE (xieTecYCCToRGB, *bufDest, dstParam); + + _XieEncodeTechnique (bufDest, xieValGamut, + srcParam->gamut_tech, srcParam->gamut_param); + } + + return (length); +} + + +int +_XieCIELabToRGBParam (bufDest, srcParam, encode) + +char **bufDest; +XieCIELabToRGBParam *srcParam; +int encode; + +{ + xieTecCIELabToRGB *dstParam; + int length, whiteLen, gamutLen; + + if (srcParam == NULL) + return(0); + + whiteLen = _XieTechniqueLength (xieValWhiteAdjust, + srcParam->white_adjust_tech, srcParam->white_adjust_param); + + gamutLen = _XieTechniqueLength (xieValGamut, + srcParam->gamut_tech, srcParam->gamut_param); + + length = LENOF (xieTecCIELabToRGB) + whiteLen + gamutLen; + + if (encode) + { + BEGIN_TECHNIQUE (xieTecCIELabToRGB, *bufDest, dstParam); + + /* memcpy (dstParam->matrix00, srcParam->matrix, 36); */ + dstParam->matrix00 = _XieConvertToIEEE (srcParam->matrix[0]); + dstParam->matrix01 = _XieConvertToIEEE (srcParam->matrix[1]); + dstParam->matrix02 = _XieConvertToIEEE (srcParam->matrix[2]); + dstParam->matrix10 = _XieConvertToIEEE (srcParam->matrix[3]); + dstParam->matrix11 = _XieConvertToIEEE (srcParam->matrix[4]); + dstParam->matrix12 = _XieConvertToIEEE (srcParam->matrix[5]); + dstParam->matrix20 = _XieConvertToIEEE (srcParam->matrix[6]); + dstParam->matrix21 = _XieConvertToIEEE (srcParam->matrix[7]); + dstParam->matrix22 = _XieConvertToIEEE (srcParam->matrix[8]); + + dstParam->whiteAdjusted = srcParam->white_adjust_tech; + dstParam->lenWhiteParams = whiteLen; + dstParam->gamutCompress = srcParam->gamut_tech; + dstParam->lenGamutParams = gamutLen; + + END_TECHNIQUE (xieTecCIELabToRGB, *bufDest, dstParam); + + _XieEncodeTechnique (bufDest, xieValWhiteAdjust, + srcParam->white_adjust_tech, srcParam->white_adjust_param); + + _XieEncodeTechnique (bufDest, xieValGamut, + srcParam->gamut_tech, srcParam->gamut_param); + } + + return (length); +} + + +int +_XieConvolveConstantParam (bufDest, srcParam, encode) + +char **bufDest; +XieConvolveConstantParam *srcParam; +int encode; + +{ + xieTecConvolveConstant *dstParam; + int length = LENOF (xieTecConvolveConstant); + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecConvolveConstant, *bufDest, dstParam); + + dstParam->constant0 = _XieConvertToIEEE (srcParam->constant[0]); + dstParam->constant1 = _XieConvertToIEEE (srcParam->constant[1]); + dstParam->constant2 = _XieConvertToIEEE (srcParam->constant[2]); + + END_TECHNIQUE (xieTecConvolveConstant, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieClipScaleParam (bufDest, srcParam, encode) + +char **bufDest; +XieClipScaleParam *srcParam; +int encode; + +{ + xieTecClipScale *dstParam; + int length = LENOF (xieTecClipScale); + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecClipScale, *bufDest, dstParam); + + dstParam->inputLow0 = _XieConvertToIEEE (srcParam->input_low[0]); + dstParam->inputLow1 = _XieConvertToIEEE (srcParam->input_low[1]); + dstParam->inputLow2 = _XieConvertToIEEE (srcParam->input_low[2]); + dstParam->inputHigh0 = _XieConvertToIEEE (srcParam->input_high[0]); + dstParam->inputHigh1 = _XieConvertToIEEE (srcParam->input_high[1]); + dstParam->inputHigh2 = _XieConvertToIEEE (srcParam->input_high[2]); + dstParam->outputLow0 = srcParam->output_low[0]; + dstParam->outputLow1 = srcParam->output_low[1]; + dstParam->outputLow2 = srcParam->output_low[2]; + dstParam->outputHigh0 = srcParam->output_high[0]; + dstParam->outputHigh1 = srcParam->output_high[1]; + dstParam->outputHigh2 = srcParam->output_high[2]; + + END_TECHNIQUE (xieTecClipScale, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieDecodeUncompressedSingleParam (bufDest, srcParam, encode) + +char **bufDest; +XieDecodeUncompressedSingleParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecDecodeUncompressedSingle); + xieTecDecodeUncompressedSingle *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecDecodeUncompressedSingle, *bufDest, dstParam); + + dstParam->fillOrder = srcParam->fill_order; + dstParam->pixelOrder = srcParam->pixel_order; + dstParam->pixelStride = srcParam->pixel_stride; + dstParam->leftPad = srcParam->left_pad; + dstParam->scanlinePad = srcParam->scanline_pad; + + END_TECHNIQUE (xieTecDecodeUncompressedSingle, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieDecodeUncompressedTripleParam (bufDest, srcParam, encode) + +char **bufDest; +XieDecodeUncompressedTripleParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecDecodeUncompressedTriple); + xieTecDecodeUncompressedTriple *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecDecodeUncompressedTriple, *bufDest, dstParam); + + dstParam->leftPad[0] = srcParam->left_pad[0]; + dstParam->leftPad[1] = srcParam->left_pad[1]; + dstParam->leftPad[2] = srcParam->left_pad[2]; + dstParam->fillOrder = srcParam->fill_order; + dstParam->pixelStride[0] = srcParam->pixel_stride[0]; + dstParam->pixelStride[1] = srcParam->pixel_stride[1]; + dstParam->pixelStride[2] = srcParam->pixel_stride[2]; + dstParam->pixelOrder = srcParam->pixel_order; + dstParam->scanlinePad[0] = srcParam->scanline_pad[0]; + dstParam->scanlinePad[1] = srcParam->scanline_pad[1]; + dstParam->scanlinePad[2] = srcParam->scanline_pad[2]; + dstParam->bandOrder = srcParam->band_order; + dstParam->interleave = srcParam->interleave; + + END_TECHNIQUE (xieTecDecodeUncompressedTriple, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieDecodeG31DParam (bufDest, srcParam, encode) + +char **bufDest; +XieDecodeG31DParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecDecodeG31D); + xieTecDecodeG31D *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecDecodeG31D, *bufDest, dstParam); + + dstParam->encodedOrder = srcParam->encoded_order; + dstParam->normal = srcParam->normal; + dstParam->radiometric = srcParam->radiometric; + + END_TECHNIQUE (xieTecDecodeG31D, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieDecodeTIFFPackBitsParam (bufDest, srcParam, encode) + +char **bufDest; +XieDecodeTIFFPackBitsParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecDecodeTIFFPackBits); + xieTecDecodeTIFFPackBits *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecDecodeTIFFPackBits, *bufDest, dstParam); + + dstParam->encodedOrder = srcParam->encoded_order; + dstParam->normal = srcParam->normal; + + END_TECHNIQUE (xieTecDecodeTIFFPackBits, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieDecodeJPEGBaselineParam (bufDest, srcParam, encode) + +char **bufDest; +XieDecodeJPEGBaselineParam *srcParam; +int encode; + +{ + xieTecDecodeJPEGBaseline *dstParam; + int length = LENOF (xieTecDecodeJPEGBaseline); + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecDecodeJPEGBaseline, *bufDest, dstParam); + + dstParam->interleave = srcParam->interleave; + dstParam->bandOrder = srcParam->band_order; + dstParam->upSample = srcParam->up_sample; + + END_TECHNIQUE (xieTecDecodeJPEGBaseline, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieDitherOrderedParam (bufDest, srcParam, encode) + +char **bufDest; +XieDitherOrderedParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecDitherOrdered); + xieTecDitherOrdered *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecDitherOrdered, *bufDest, dstParam); + + dstParam->thresholdOrder = srcParam->threshold_order; + + END_TECHNIQUE (xieTecDitherOrdered, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieEncodeUncompressedSingleParam (bufDest, srcParam, encode) + +char **bufDest; +XieEncodeUncompressedSingleParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecEncodeUncompressedSingle); + xieTecEncodeUncompressedSingle *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecEncodeUncompressedSingle, *bufDest, dstParam); + + dstParam->fillOrder = srcParam->fill_order; + dstParam->pixelOrder = srcParam->pixel_order; + dstParam->pixelStride = srcParam->pixel_stride; + dstParam->scanlinePad = srcParam->scanline_pad; + + END_TECHNIQUE (xieTecEncodeUncompressedSingle, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieEncodeUncompressedTripleParam (bufDest, srcParam, encode) + +char **bufDest; +XieEncodeUncompressedTripleParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecEncodeUncompressedTriple); + xieTecEncodeUncompressedTriple *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecEncodeUncompressedTriple, *bufDest, dstParam); + + dstParam->pixelStride[0] = srcParam->pixel_stride[0]; + dstParam->pixelStride[1] = srcParam->pixel_stride[1]; + dstParam->pixelStride[2] = srcParam->pixel_stride[2]; + dstParam->pixelOrder = srcParam->pixel_order; + dstParam->scanlinePad[0] = srcParam->scanline_pad[0]; + dstParam->scanlinePad[1] = srcParam->scanline_pad[1]; + dstParam->scanlinePad[2] = srcParam->scanline_pad[2]; + dstParam->fillOrder = srcParam->fill_order; + dstParam->bandOrder = srcParam->band_order; + dstParam->interleave = srcParam->interleave; + + END_TECHNIQUE (xieTecEncodeUncompressedTriple, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieEncodeG31DParam (bufDest, srcParam, encode) + +char **bufDest; +XieEncodeG31DParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecEncodeG31D); + xieTecEncodeG31D *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecEncodeG31D, *bufDest, dstParam); + + dstParam->alignEol = srcParam->align_eol; + dstParam->encodedOrder = srcParam->encoded_order; + dstParam->radiometric = srcParam->radiometric; + + END_TECHNIQUE (xieTecEncodeG31D, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieEncodeTIFFPackBitsParam (bufDest, srcParam, encode) + +char **bufDest; +XieEncodeTIFFPackBitsParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecEncodeTIFFPackBits); + xieTecEncodeTIFFPackBits *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecEncodeTIFFPackBits, *bufDest, dstParam); + + dstParam->encodedOrder = srcParam->encoded_order; + + END_TECHNIQUE (xieTecEncodeTIFFPackBits, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieEncodeServerChoiceParam (bufDest, srcParam, encode) + +char **bufDest; +XieEncodeServerChoiceParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecEncodeServerChoice); + xieTecEncodeServerChoice *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecEncodeServerChoice, *bufDest, dstParam); + + dstParam->preference = srcParam->preference; + + END_TECHNIQUE (xieTecEncodeServerChoice, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieEncodeG32DParam (bufDest, srcParam, encode) + +char **bufDest; +XieEncodeG32DParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecEncodeG32D); + xieTecEncodeG32D *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecEncodeG32D, *bufDest, dstParam); + + dstParam->uncompressed = srcParam->uncompressed; + dstParam->alignEol = srcParam->align_eol; + dstParam->encodedOrder = srcParam->encoded_order; + dstParam->kFactor = srcParam->k_factor; + dstParam->radiometric = srcParam->radiometric; + + END_TECHNIQUE (xieTecEncodeG32D, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieEncodeG42DParam (bufDest, srcParam, encode) + +char **bufDest; +XieEncodeG42DParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecEncodeG42D); + xieTecEncodeG42D *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecEncodeG42D, *bufDest, dstParam); + + dstParam->uncompressed = srcParam->uncompressed; + dstParam->encodedOrder = srcParam->encoded_order; + dstParam->radiometric = srcParam->radiometric; + + END_TECHNIQUE (xieTecEncodeG42D, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieEncodeJPEGBaselineParam (bufDest, srcParam, encode) + +char **bufDest; +XieEncodeJPEGBaselineParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecEncodeJPEGBaseline) + + ((srcParam->q_size + srcParam->ac_size + srcParam->dc_size) >> 2); + xieTecEncodeJPEGBaseline *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecEncodeJPEGBaseline, *bufDest, dstParam); + + dstParam->interleave = srcParam->interleave; + dstParam->bandOrder = srcParam->band_order; + dstParam->horizontalSamples[0] = srcParam->horizontal_samples[0]; + dstParam->horizontalSamples[1] = srcParam->horizontal_samples[1]; + dstParam->horizontalSamples[2] = srcParam->horizontal_samples[2]; + dstParam->verticalSamples[0] = srcParam->vertical_samples[0]; + dstParam->verticalSamples[1] = srcParam->vertical_samples[1]; + dstParam->verticalSamples[2] = srcParam->vertical_samples[2]; + dstParam->lenQtable = srcParam->q_size; + dstParam->lenACtable = srcParam->ac_size; + dstParam->lenDCtable = srcParam->dc_size; + + END_TECHNIQUE (xieTecEncodeJPEGBaseline, *bufDest, dstParam); + + /* + * q_size, ac_size, dc_size should be multiple of 4, + * so no need to pad. + */ + + memcpy (*bufDest, srcParam->q_table, srcParam->q_size); + *bufDest += srcParam->q_size; + memcpy (*bufDest, srcParam->ac_table, srcParam->ac_size); + *bufDest += srcParam->ac_size; + memcpy (*bufDest, srcParam->dc_table, srcParam->dc_size); + *bufDest += srcParam->dc_size; + } + + return (length); +} + + +int +_XieEncodeJPEGLosslessParam (bufDest, srcParam, encode) + +char **bufDest; +XieEncodeJPEGLosslessParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecEncodeJPEGLossless) + + (srcParam->table_size >> 2); + xieTecEncodeJPEGLossless *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecEncodeJPEGLossless, *bufDest, dstParam); + + dstParam->interleave = srcParam->interleave; + dstParam->bandOrder = srcParam->band_order; + dstParam->lenTable = srcParam->table_size; + dstParam->predictor[0] = srcParam->predictor[0]; + dstParam->predictor[1] = srcParam->predictor[1]; + dstParam->predictor[2] = srcParam->predictor[2]; + + END_TECHNIQUE (xieTecEncodeJPEGLossless, *bufDest, dstParam); + + /* table_size should be multiple of 4, so no need to pad */ + + memcpy (*bufDest, srcParam->table, srcParam->table_size); + } + + return (length); +} + + +int +_XieEncodeTIFF2Param (bufDest, srcParam, encode) + +char **bufDest; +XieEncodeTIFF2Param *srcParam; +int encode; + +{ + int length = LENOF (xieTecEncodeTIFF2); + xieTecEncodeTIFF2 *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecEncodeTIFF2, *bufDest, dstParam); + + dstParam->encodedOrder = srcParam->encoded_order; + dstParam->radiometric = srcParam->radiometric; + + END_TECHNIQUE (xieTecEncodeTIFF2, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieGeomAntialiasByAreaParam (bufDest, srcParam, encode) + +char **bufDest; +XieGeomAntialiasByAreaParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecGeomAntialiasByArea); + xieTecGeomAntialiasByArea *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecGeomAntialiasByArea, *bufDest, dstParam); + + dstParam->simple = srcParam->simple; + + END_TECHNIQUE (xieTecGeomAntialiasByArea, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieGeomAntialiasByLowpassParam (bufDest, srcParam, encode) + +char **bufDest; +XieGeomAntialiasByLowpassParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecGeomAntialiasByLowpass); + xieTecGeomAntialiasByLowpass *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecGeomAntialiasByLowpass, *bufDest, dstParam); + + dstParam->kernelSize = srcParam->kernel_size; + + END_TECHNIQUE (xieTecGeomAntialiasByLowpass, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieGeomGaussianParam (bufDest, srcParam, encode) + +char **bufDest; +XieGeomGaussianParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecGeomGaussian); + xieTecGeomGaussian *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecGeomGaussian, *bufDest, dstParam); + + dstParam->radius = srcParam->radius; + dstParam->simple = srcParam->simple; + dstParam->sigma = _XieConvertToIEEE (srcParam->sigma); + dstParam->normalize = _XieConvertToIEEE (srcParam->normalize); + + END_TECHNIQUE (xieTecGeomGaussian, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieGeomNearestNeighborParam (bufDest, srcParam, encode) + +char **bufDest; +XieGeomNearestNeighborParam *srcParam; +int encode; + +{ + xieTecGeomNearestNeighbor *dstParam; + int length = LENOF (xieTecGeomNearestNeighbor); + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecGeomNearestNeighbor, *bufDest, dstParam); + + dstParam->modify = srcParam->modify; + + END_TECHNIQUE (xieTecGeomNearestNeighbor, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieHistogramGaussianParam (bufDest, srcParam, encode) + +char **bufDest; +XieHistogramGaussianParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecHistogramGaussian); + xieTecHistogramGaussian *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecHistogramGaussian, *bufDest, dstParam); + + dstParam->mean = _XieConvertToIEEE (srcParam->mean); + dstParam->sigma = _XieConvertToIEEE (srcParam->sigma); + + END_TECHNIQUE (xieTecHistogramGaussian, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieHistogramHyperbolicParam (bufDest, srcParam, encode) + +char **bufDest; +XieHistogramHyperbolicParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecHistogramHyperbolic); + xieTecHistogramHyperbolic *dstParam; + + if (srcParam == NULL) + return(0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecHistogramHyperbolic, *bufDest, dstParam); + + dstParam->shapeFactor = srcParam->shape_factor; + dstParam->constant = _XieConvertToIEEE (srcParam->constant); + + END_TECHNIQUE (xieTecHistogramHyperbolic, *bufDest, dstParam); + } + + return (length); +} + + +int +_XieWhiteAdjustCIELabShiftParam (bufDest, srcParam, encode) + +char **bufDest; +XieWhiteAdjustCIELabShiftParam *srcParam; +int encode; + +{ + int length = LENOF (xieTecWhiteAdjustCIELabShift); + xieTecWhiteAdjustCIELabShift *dstParam; + + if (srcParam == NULL) + return (0); + + if (encode) + { + BEGIN_TECHNIQUE (xieTecWhiteAdjustCIELabShift, *bufDest, dstParam); + + dstParam->whitePoint0 = _XieConvertToIEEE (srcParam->white_point[0]); + dstParam->whitePoint1 = _XieConvertToIEEE (srcParam->white_point[1]); + dstParam->whitePoint2 = _XieConvertToIEEE (srcParam->white_point[2]); + + END_TECHNIQUE (xieTecWhiteAdjustCIELabShift, *bufDest, dstParam); + } + + return (length); +} + + + +_XieInitTechFuncTable () + +{ + int i; + + for (i = 0; i < xieValMaxTechGroup; i++) + _XieTechFuncs[i] = NULL; + + + _XieRegisterTechFunc (xieValColorAlloc, + xieValColorAllocDefault, 0); + _XieRegisterTechFunc (xieValColorAlloc, + xieValColorAllocAll, _XieColorAllocAllParam); + _XieRegisterTechFunc (xieValColorAlloc, + xieValColorAllocMatch, _XieColorAllocMatchParam); + _XieRegisterTechFunc (xieValColorAlloc, + xieValColorAllocRequantize, _XieColorAllocRequantizeParam); + + _XieRegisterTechFunc (xieValConvertFromRGB, + xieValRGBToCIELab, _XieRGBToCIELabParam); + _XieRegisterTechFunc (xieValConvertFromRGB, + xieValRGBToCIEXYZ, _XieRGBToCIEXYZParam); + _XieRegisterTechFunc (xieValConvertFromRGB, + xieValRGBToYCbCr, _XieRGBToYCbCrParam); + _XieRegisterTechFunc (xieValConvertFromRGB, + xieValRGBToYCC, _XieRGBToYCCParam); + + _XieRegisterTechFunc (xieValConvertToRGB, + xieValCIELabToRGB, _XieCIELabToRGBParam); + _XieRegisterTechFunc (xieValConvertToRGB, + xieValCIEXYZToRGB, _XieCIEXYZToRGBParam); + _XieRegisterTechFunc (xieValConvertToRGB, + xieValYCbCrToRGB, _XieYCbCrToRGBParam); + _XieRegisterTechFunc (xieValConvertToRGB, + xieValYCCToRGB, _XieYCCToRGBParam); + + _XieRegisterTechFunc (xieValConstrain, + xieValConstrainClipScale, _XieClipScaleParam); + _XieRegisterTechFunc (xieValConstrain, + xieValConstrainHardClip, 0); + + _XieRegisterTechFunc (xieValConvolve, + xieValConvolveDefault, 0); + _XieRegisterTechFunc (xieValConvolve, + xieValConvolveConstant, _XieConvolveConstantParam); + _XieRegisterTechFunc (xieValConvolve, + xieValConvolveReplicate, 0); + + _XieRegisterTechFunc (xieValDecode, + xieValDecodeUncompressedSingle, _XieDecodeUncompressedSingleParam); + _XieRegisterTechFunc (xieValDecode, + xieValDecodeUncompressedTriple, _XieDecodeUncompressedTripleParam); + _XieRegisterTechFunc (xieValDecode, + xieValDecodeG31D, _XieDecodeG31DParam); + _XieRegisterTechFunc (xieValDecode, + xieValDecodeG32D, _XieDecodeG32DParam); + _XieRegisterTechFunc (xieValDecode, + xieValDecodeG42D, _XieDecodeG42DParam); + _XieRegisterTechFunc (xieValDecode, + xieValDecodeJPEGBaseline, _XieDecodeJPEGBaselineParam); + _XieRegisterTechFunc (xieValDecode, + xieValDecodeJPEGLossless, _XieDecodeJPEGLosslessParam); + _XieRegisterTechFunc (xieValDecode, + xieValDecodeTIFF2, _XieDecodeTIFF2Param); + _XieRegisterTechFunc (xieValDecode, + xieValDecodeTIFFPackBits, _XieDecodeTIFFPackBitsParam); + + _XieRegisterTechFunc (xieValDither, + xieValDitherDefault, 0); + _XieRegisterTechFunc (xieValDither, + xieValDitherErrorDiffusion, 0); + _XieRegisterTechFunc (xieValDither, + xieValDitherOrdered, _XieDitherOrderedParam); + +/* + _XieRegisterTechFunc (xieValEncode, + xieValEncodeServerChoice, 0); +*/ + _XieRegisterTechFunc (xieValEncode, + xieValEncodeServerChoice, _XieEncodeServerChoiceParam); + _XieRegisterTechFunc (xieValEncode, + xieValEncodeUncompressedSingle, _XieEncodeUncompressedSingleParam); + _XieRegisterTechFunc (xieValEncode, + xieValEncodeUncompressedTriple, _XieEncodeUncompressedTripleParam); + _XieRegisterTechFunc (xieValEncode, + xieValEncodeG31D, _XieEncodeG31DParam); + _XieRegisterTechFunc (xieValEncode, + xieValEncodeG32D, _XieEncodeG32DParam); + _XieRegisterTechFunc (xieValEncode, + xieValEncodeG42D, _XieEncodeG42DParam); + _XieRegisterTechFunc (xieValEncode, + xieValEncodeJPEGBaseline, _XieEncodeJPEGBaselineParam); + _XieRegisterTechFunc (xieValEncode, + xieValEncodeJPEGLossless, _XieEncodeJPEGLosslessParam); + _XieRegisterTechFunc (xieValEncode, + xieValEncodeTIFF2, _XieEncodeTIFF2Param); + _XieRegisterTechFunc (xieValEncode, + xieValEncodeTIFFPackBits, _XieEncodeTIFFPackBitsParam); + + _XieRegisterTechFunc (xieValGamut, + xieValGamutDefault, 0); + _XieRegisterTechFunc (xieValGamut, + xieValGamutNone, 0); + _XieRegisterTechFunc (xieValGamut, + xieValGamutClipRGB, 0); + + _XieRegisterTechFunc (xieValGeometry, + xieValGeomDefault, 0); + _XieRegisterTechFunc (xieValGeometry, + xieValGeomAntialias, 0); + _XieRegisterTechFunc (xieValGeometry, + xieValGeomAntialiasByArea, _XieGeomAntialiasByAreaParam); + _XieRegisterTechFunc (xieValGeometry, + xieValGeomAntialiasByLPF, _XieGeomAntialiasByLowpassParam); + _XieRegisterTechFunc (xieValGeometry, + xieValGeomBilinearInterp, 0); + _XieRegisterTechFunc (xieValGeometry, + xieValGeomGaussian, _XieGeomGaussianParam); + _XieRegisterTechFunc (xieValGeometry, + xieValGeomNearestNeighbor, _XieGeomNearestNeighborParam); + + _XieRegisterTechFunc (xieValHistogram, + xieValHistogramFlat, 0); + _XieRegisterTechFunc (xieValHistogram, + xieValHistogramGaussian, _XieHistogramGaussianParam); + _XieRegisterTechFunc (xieValHistogram, + xieValHistogramHyperbolic, _XieHistogramHyperbolicParam); + + _XieRegisterTechFunc (xieValWhiteAdjust, + xieValWhiteAdjustDefault, 0); + _XieRegisterTechFunc (xieValWhiteAdjust, + xieValWhiteAdjustNone, 0); + _XieRegisterTechFunc (xieValWhiteAdjust, + xieValWhiteAdjustCIELabShift, _XieWhiteAdjustCIELabShiftParam); +} diff --git a/xie/xc/lib/XIE/technique.h b/xie/xc/lib/XIE/technique.h new file mode 100644 index 0000000..690da3b --- /dev/null +++ b/xie/xc/lib/XIE/technique.h @@ -0,0 +1,87 @@ +/* $XConsortium: technique.h,v 1.4 94/04/17 20:18:29 mor Exp $ */ + +/* + +Copyright (c) 1993 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#ifndef WORD64 + +#define BEGIN_TECHNIQUE(_name, _bufDest, _dstParam) \ + _dstParam = (_name *) _bufDest; + +#define END_TECHNIQUE(_name, _bufDest, _dstParam) \ + _bufDest += SIZEOF (_name); + +#else /* WORD64 */ + +#define BEGIN_TECHNIQUE(_name, _bufDest, _dstParam) \ +{ \ + _name tParam; \ + _dstParam = &tParam; + +#define END_TECHNIQUE(_name, _bufDest, _dstParam) \ + memcpy (_bufDest, _dstParam, SIZEOF (_name)); \ + _bufDest += SIZEOF (_name); \ +} + +#endif /* WORD64 */ + + + +#ifndef WORD64 + +#define STORE_CARD32(_val, _pBuf) \ +{ \ + *((CARD32 *) _pBuf) = _val; \ + _pBuf += SIZEOF (CARD32); \ +} + +#else /* WORD64 */ + +typedef struct { + int value :32; +} Long; + +#define STORE_CARD32(_val, _pBuf) \ +{ \ + Long _d; \ + _d.value = _val; \ + memcpy (_pBuf, &_d, SIZEOF (CARD32)); \ + _pBuf += SIZEOF (CARD32); \ +} + +#endif /* WORD64 */ + + +#define _XieRGBToCIEXYZParam _XieRGBToCIELabParam +#define _XieCIEXYZToRGBParam _XieCIELabToRGBParam +#define _XieDecodeG32DParam _XieDecodeG31DParam +#define _XieDecodeG42DParam _XieDecodeG31DParam +#define _XieDecodeTIFF2Param _XieDecodeG31DParam +#define _XieDecodeJPEGLosslessParam _XieDecodeJPEGBaselineParam diff --git a/xie/xc/lib/XIE/utils.c b/xie/xc/lib/XIE/utils.c new file mode 100644 index 0000000..5a80054 --- /dev/null +++ b/xie/xc/lib/XIE/utils.c @@ -0,0 +1,119 @@ +/* $XConsortium: utils.c,v 1.2 94/04/17 20:18:30 mor Exp $ */ + +/* + +Copyright (c) 1993 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ + +#include "XIElibint.h" + + +Status +_XieRegisterTechFunc (group, technique, techfunc) + +int group; +int technique; +XieTechFuncPtr techfunc; + +{ + XieTechFuncRec *ptr = _XieTechFuncs[group - 1]; + XieTechFuncRec *prev = NULL, *newrec; + int status = 1; + + newrec = (XieTechFuncRec *) Xmalloc (sizeof (XieTechFuncRec)); + newrec->technique = technique; + newrec->techfunc = techfunc; + + if (ptr == NULL) + { + _XieTechFuncs[group - 1] = newrec; + newrec->next = NULL; + } + else + { + while (ptr && ptr->technique < technique) + { + prev = ptr; + ptr = ptr->next; + } + + if (ptr == NULL) + { + prev->next = newrec; + newrec->next = NULL; + } + else + { + if (ptr->technique == technique) + { + Xfree ((char *) newrec); + status = 0; + } + else if (prev = NULL) + { + newrec->next = _XieTechFuncs[group - 1]; + _XieTechFuncs[group - 1] = newrec; + } + else + { + newrec->next = prev->next; + prev->next = newrec; + } + } + } + + return (status); +} + + + +XieTechFuncPtr +_XieLookupTechFunc (group, technique) + +int group; +int technique; + +{ + XieTechFuncRec *ptr = _XieTechFuncs[group - 1]; + int found = 0; + + while (ptr && !found) + { + if (ptr->technique == technique) + found = 1; + else + ptr = ptr->next; + } + + if (found) + return (ptr->techfunc); + else + return (NULL); +} + + diff --git a/xie/xc/programs/Xserver/XIE/Imakefile b/xie/xc/programs/Xserver/XIE/Imakefile new file mode 100644 index 0000000..0f96f0e --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/Imakefile @@ -0,0 +1,11 @@ +XCOMM $XConsortium: Imakefile,v 1.3 93/11/07 10:56:36 rws Exp $ +#include + +#define IHaveSubdirs + + SUBDIRS = dixie mixie + +MakeSubdirs($(SUBDIRS)) +DependSubdirs($(SUBDIRS)) +MakeLintLibSubdirs($(SUBDIRS)) +LintSubdirs($(SUBDIRS)) diff --git a/xie/xc/programs/Xserver/XIE/dixie/Imakefile b/xie/xc/programs/Xserver/XIE/dixie/Imakefile new file mode 100644 index 0000000..90d9de6 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/Imakefile @@ -0,0 +1,21 @@ +XCOMM $XConsortium: Imakefile /main/6 1995/12/07 21:15:29 gildea $ +XCOMM build dixie archive +#include + +#define IHaveSubdirs + +SUBDIRS = request import process export +OBJS = request/?*.o import/?*.o process/?*.o export/?*.o +DONES = request/DONE import/DONE process/DONE export/DONE + +NormalDepLibraryTarget(dixie,$(SUBDIRS) $(DONES),$(OBJS)) + +ForceSubdirs($(SUBDIRS)) + +DependSubdirs($(SUBDIRS)) + +MakeLintLibSubdirs($(SUBDIRS)) +LintSubdirs($(SUBDIRS)) + +InstallLinkKitLibrary(dixie,$(LINKKITDIR)/lib) + diff --git a/xie/xc/programs/Xserver/XIE/dixie/export/Imakefile b/xie/xc/programs/Xserver/XIE/dixie/export/Imakefile new file mode 100644 index 0000000..19ede1e --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/export/Imakefile @@ -0,0 +1,28 @@ +XCOMM $XConsortium: Imakefile,v 1.5 94/01/12 19:47:21 rws Exp $ +XCOMM build device independent export element objects +#include + +SRCS1 = eclut.c ecphoto.c edraw.c edrawp.c elut.c ephoto.c +OBJS1 = eclut.o ecphoto.o edraw.o edrawp.o elut.o ephoto.o + +#if BuildDIS +DEFINES = -DXIE_DIS +#else +SRCS2 = echist.c ecroi.c eroi.c +OBJS2 = echist.o ecroi.o eroi.o +#endif + + SRCS = $(SRCS1) $(SRCS2) + + OBJS = $(OBJS1) $(OBJS2) + + INCLUDES = -I../../include -I$(SERVERSRC)/include -I$(INCLUDESRC) -I$(EXTINCSRC) + LINTLIBS = ../export/llib-lexp.ln ../import/llib-limp.ln \ + ../process/llib-lproc.ln ../request/llib-lreq.ln +SubdirLibraryRule($(OBJS)) +NormalLibraryObjectRule() +LintLibraryTarget(exp,$(SRCS)) + +NormalLintTarget($(SRCS)) + +DependTarget() diff --git a/xie/xc/programs/Xserver/XIE/dixie/export/echist.c b/xie/xc/programs/Xserver/XIE/dixie/export/echist.c new file mode 100644 index 0000000..f2e5d2b --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/export/echist.c @@ -0,0 +1,218 @@ +/* $XConsortium: echist.c,v 1.3 94/04/17 20:33:27 rws Exp $ */ +/**** module echist.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + echist.c -- DIXIE routines for managing the ExportClientHistogram elem. + + Dean Verheiden -- AGE Logic, Inc. July 1993 + +*****************************************************************************/ + +#define _XIEC_ECHIST + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeECHistogram(); + +/* + * routines internal to this module + */ +static Bool PrepECHistogram(); + +/* + * dixie entry points + */ +static diElemVecRec eHistogramVec = { + PrepECHistogram /* prepare for analysis and execution */ + }; + + +/*------------------------------------------------------------------------ +-------------- routine: make an ExportClientHistogram element ------------ +------------------------------------------------------------------------*/ +peDefPtr MakeECHistogram(flo,tag,pe) +floDefPtr flo; +xieTypPhototag tag; +xieFlo *pe; +{ + int inputs; + peDefPtr ped; + inFloPtr inFlo; + ELEMENT(xieFloExportClientHistogram); + ELEMENT_SIZE_MATCH(xieFloExportClientHistogram); + ELEMENT_NEEDS_1_INPUT(src); + + inputs = 1 + (stuff->domainPhototag ? 1 : 0); + + if(!(ped = MakePEDef(inputs, (CARD32)stuff->elemLength<<2, 0))) + FloAllocError(flo,tag,xieElemExportClientHistogram, return(NULL)); + + ped->diVec = &eHistogramVec; + ped->phototag = tag; + ped->flags.export = TRUE; + ped->flags.getData = TRUE; + raw = (xieFloExportClientHistogram *)ped->elemRaw; + /* + * copy the standard client element parameters (swap if necessary) + */ + if (flo->reqClient->swapped) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + raw->notify = stuff->notify; + cpswapl(stuff->domainOffsetX, raw->domainOffsetX); + cpswapl(stuff->domainOffsetY, raw->domainOffsetY); + cpswaps(stuff->domainPhototag,raw->domainPhototag); + } else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloExportClientHistogram)); + /* + * assign phototags to inFlos + */ + inFlo = ped->inFloLst; + inFlo[SRCtag].srcTag = raw->src; + if(raw->domainPhototag) + inFlo[ped->inCnt-1].srcTag = raw->domainPhototag; + + return(ped); +} /* end MakeECHistogram */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepECHistogram(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloExportClientHistogram *raw = + (xieFloExportClientHistogram *)ped->elemRaw; + inFloPtr ind, inf = &ped->inFloLst[SRCtag]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr outflo = &ped->outFlo; + + /* check notify */ + if(raw->notify != xieValDisable && + raw->notify != xieValFirstData && + raw->notify != xieValNewData) + ValueError(flo,ped,raw->notify, return(FALSE)); + + /* check out process domain */ + if(raw->domainPhototag) { + outFloPtr dom; + + ind = &ped->inFloLst[ped->inCnt-1]; + dom = &ind->srcDef->outFlo; + if((ind->bands = dom->bands) != 1 || IsntDomain(dom->format[0].class)) + DomainError(flo,ped,raw->domainPhototag, return(FALSE)); + ind->format[0] = dom->format[0]; + } + + /* check and propagate src */ + if (src->bands != 1 || IsntConstrained(src->format[0].class)) + MatchError(flo,ped,return(FALSE)); + inf->bands = 1; + inf->format[0] = src->format[0]; + + /* Don't really have an outflo */ + outflo->bands = 1; + outflo->format[0] = inf->format[0]; + outflo->format[0].class = STREAM; + ped->swapUnits[0] = sizeof(xieTypHistogramData); + + return(TRUE); +} /* end PrepECHistogram */ + +/* end module echist.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/export/eclut.c b/xie/xc/programs/Xserver/XIE/dixie/export/eclut.c new file mode 100644 index 0000000..558da74 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/export/eclut.c @@ -0,0 +1,210 @@ +/* $XConsortium: eclut.c,v 1.4 94/04/17 20:33:28 rws Exp $ */ +/**** module eclut.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + eclut.c -- DIXIE routines for managing the ExportClientLUT element + + Dean Verheiden -- AGE Logic, Inc. July 1993 + +*****************************************************************************/ + +#define _XIEC_ECLUT + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +/* + * routines referenced by other modules + */ +peDefPtr MakeECLUT(); + +/* + * routines internal to this module + */ +static Bool PrepECLUT(); + +/* + * dixie element entry points + */ +static diElemVecRec eCLUTVec = { + PrepECLUT /* prepare for analysis and execution */ + }; + + +/*------------------------------------------------------------------------ +--------------- routine: make an export client lut element ------------- +------------------------------------------------------------------------*/ +peDefPtr MakeECLUT(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + ELEMENT(xieFloExportClientLUT); + ELEMENT_SIZE_MATCH(xieFloExportClientLUT); + ELEMENT_NEEDS_1_INPUT(src); + + if(!(ped = MakePEDef(1, (CARD32)stuff->elemLength<<2, 0))) + FloAllocError(flo,tag,xieElemExportClientLUT, return(NULL)) ; + + ped->diVec = &eCLUTVec; + ped->phototag = tag; + ped->flags.getData = TRUE; + ped->flags.export = TRUE; + raw = (xieFloExportClientLUT *)ped->elemRaw; + /* + * copy the standard client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + raw->notify = stuff->notify; + raw->bandOrder = stuff->bandOrder; + cpswapl(stuff->start0, raw->start0); + cpswapl(stuff->start1, raw->start1); + cpswapl(stuff->start2, raw->start2); + cpswapl(stuff->length0, raw->length0); + cpswapl(stuff->length1, raw->length1); + cpswapl(stuff->length2, raw->length2); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloExportClientLUT)); + + /* assign phototag to inFlo + */ + ped->inFloLst[SRCtag].srcTag = raw->src; + + return(ped); +} /* end MakeECLUT */ + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepECLUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloExportClientLUT *raw = (xieFloExportClientLUT *)ped->elemRaw; + inFloPtr inf = &ped->inFloLst[SRCtag]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + CARD32 *start = &(raw->start0); + CARD32 *length = &(raw->length0); + int b; + + if(raw->notify != xieValDisable && /* check notify */ + raw->notify != xieValFirstData && + raw->notify != xieValNewData) + ValueError(flo,ped,raw->notify, return(FALSE)); + + if(raw->bandOrder != xieValLSFirst && /* check band-order */ + raw->bandOrder != xieValMSFirst) + ValueError(flo,ped,raw->bandOrder, return(FALSE)); + + /* Validate and Propagate input attributes to our output */ + dst->bands = inf->bands = src->bands; + for(b = 0; b < src->bands; ++b) { + if (IsntLut(src->format[b].class)) + FloSourceError(flo,raw->src,raw->elemType, return(FALSE)); + if ( start[b] + length[b] > src->format[b].height ) + MatchError(flo,ped, return(FALSE)); + + dst->format[b] = inf->format[b] = src->format[b]; + ped->swapUnits[b] = LutPitch(dst->format[b].levels); + } + return(TRUE); +} /* end PrepECLUT */ + + +/* end module eclut.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/export/ecphoto.c b/xie/xc/programs/Xserver/XIE/dixie/export/ecphoto.c new file mode 100644 index 0000000..628e645 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/export/ecphoto.c @@ -0,0 +1,734 @@ +/* $XConsortium: ecphoto.c /main/6 1995/12/02 16:44:11 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module ecphoto.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + ecphoto.c -- DIXIE routines for managing the ExportClientPhoto element + + Dean Verheiden -- AGE Logic, Inc. June 1993 + +*****************************************************************************/ + +#define _XIEC_ECPHOTO + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include + + +/* + * routines referenced by other modules + */ +peDefPtr MakeECPhoto(); +Bool CopyECPhotoUnSingle(); +Bool CopyECPhotoG31D(); +Bool CopyECPhotoG32D(); +Bool CopyECPhotoG42D(); +Bool CopyECPhotoTIFF2(); +Bool CopyECPhotoTIFFPackBits(); + +Bool PrepECPhotoUnSingle(); +Bool PrepECPhotoG31D(); +Bool PrepECPhotoG32D(); +Bool PrepECPhotoG42D(); +Bool PrepECPhotoTIFF2(); +Bool PrepECPhotoTIFFPackBits(); + +#if XIE_FULL +Bool CopyECPhotoUnTriple(); +Bool CopyECPhotoJPEGBaseline(); +Bool PrepECPhotoUnTriple(); +Bool PrepECPhotoJPEGBaseline(); +#ifdef BEYOND_SI +Bool CopyECPhotoJPEGLossless(); +Bool PrepECPhotoJPEGLossless(); +#endif /* BEYOND_SI */ +#endif + +/* + * routines internal to this module + */ +static Bool PrepECPhoto(); + +extern Bool BuildDecodeFromEncode(); +extern Bool CompareDecode(); + +/* + * dixie element entry points + */ +static diElemVecRec eCPhotoVec = { + PrepECPhoto /* prepare for analysis and execution */ + }; + + +/*------------------------------------------------------------------------ +--------------- routine: make an import client photo element ------------- +------------------------------------------------------------------------*/ +peDefPtr MakeECPhoto(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + ELEMENT(xieFloExportClientPhoto); + ELEMENT_AT_LEAST_SIZE(xieFloExportClientPhoto); + ELEMENT_NEEDS_1_INPUT(src); + + if(!(ped = MakePEDef(1, (CARD32)stuff->elemLength<<2, sizeof(ePhotoDefRec)))) + FloAllocError(flo,tag,xieElemExportClientPhoto, return(NULL)) ; + + ped->diVec = &eCPhotoVec; + ped->phototag = tag; + ped->flags.getData = TRUE; + ped->flags.export = TRUE; + raw = (xieFloExportClientPhoto *)ped->elemRaw; + /* + * copy the standard client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + raw->notify = stuff->notify; + cpswaps(stuff->encodeTechnique, raw->encodeTechnique); + cpswaps(stuff->lenParams, raw->lenParams); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloExportClientPhoto)); + + /* copy technique data (if any) + */ + if(!(ped->techVec = FindTechnique(xieValEncode,raw->encodeTechnique)) + || !(ped->techVec->copyfnc(flo, ped, &stuff[1], &raw[1], raw->lenParams))) + TechniqueError(flo,ped,xieValEncode,raw->encodeTechnique,raw->lenParams, + return(ped)); + + /* assign phototag to inFlo + */ + ped->inFloLst[SRCtag].srcTag = raw->src; + + return(ped); +} /* end MakeECPhoto */ + + +Bool CopyECPhotoUnSingle(flo, ped, sparms, rparms, tsize) + floDefPtr flo; + peDefPtr ped; + xieTecEncodeUncompressedSingle *sparms, *rparms; + CARD16 tsize; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + /* Nothing to swap for this technique */ + memcpy((char *)rparms, (char *)sparms, tsize<<2); + + return(TRUE); +} + +Bool CopyECPhotoG31D(flo, ped, sparms, rparms, tsize) + floDefPtr flo; + peDefPtr ped; + xieTecEncodeG31D *sparms, *rparms; + CARD16 tsize; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + /* Nothing to swap for this technique */ + memcpy((char *)rparms, (char *)sparms, tsize<<2); + + return(TRUE); +} + +Bool CopyECPhotoG32D(flo, ped, sparms, rparms, tsize) + floDefPtr flo; + peDefPtr ped; + xieTecEncodeG32D *sparms, *rparms; + CARD16 tsize; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + if( flo->reqClient->swapped ) { + rparms->radiometric = sparms->radiometric; + rparms->uncompressed = sparms->uncompressed; + rparms->alignEol = sparms->alignEol; + rparms->encodedOrder = sparms->encodedOrder; + cpswapl(sparms->kFactor, rparms->kFactor); + } else + memcpy((char *)rparms, (char *)sparms, tsize<<2); + + return(TRUE); +} + +Bool CopyECPhotoG42D(flo, ped, sparms, rparms, tsize) + floDefPtr flo; + peDefPtr ped; + xieTecEncodeG42D *sparms, *rparms; + CARD16 tsize; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + /* Nothing to swap for this technique */ + memcpy((char *)rparms, (char *)sparms, tsize<<2); + + return(TRUE); +} + +Bool CopyECPhotoTIFF2(flo, ped, sparms, rparms, tsize) + floDefPtr flo; + peDefPtr ped; + xieTecEncodeTIFF2 *sparms, *rparms; + CARD16 tsize; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + /* Nothing to swap for this technique */ + memcpy((char *)rparms, (char *)sparms, tsize<<2); + + return(TRUE); +} + +Bool CopyECPhotoTIFFPackBits(flo, ped, sparms, rparms, tsize) + floDefPtr flo; + peDefPtr ped; + xieTecEncodeTIFFPackBits *sparms, *rparms; + CARD16 tsize; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + /* Nothing to swap for this technique */ + memcpy((char *)rparms, (char *)sparms, tsize<<2); + + return(TRUE); +} + +#if XIE_FULL +Bool CopyECPhotoUnTriple(flo, ped, sparms, rparms, tsize) + floDefPtr flo; + peDefPtr ped; + xieTecEncodeUncompressedTriple *sparms, *rparms; + CARD16 tsize; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + /* Nothing to swap for this technique */ + memcpy((char *)rparms, (char *)sparms, tsize<<2); + + return(TRUE); +} + +Bool CopyECPhotoJPEGBaseline(flo, ped, sparms, rparms, tsize) + floDefPtr flo; + peDefPtr ped; + xieTecEncodeJPEGBaseline *sparms, *rparms; + CARD16 tsize; +{ + eTecEncodeJPEGBaselineDefPtr pvt; + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + memcpy((char *)rparms, (char *)sparms, tsize<<2); + + if( flo->reqClient->swapped ) { + register int n; + swaps(&rparms->lenQtable,n); + swaps(&rparms->lenACtable,n); + swaps(&rparms->lenDCtable,n); + } + if(rparms->lenQtable & 3 || + rparms->lenACtable & 3 || + rparms->lenDCtable & 3) + return(FALSE); + + if(!(ped->techPvt=(pointer)XieMalloc(sizeof(eTecEncodeJPEGBaselineDefRec)))) + FloAllocError(flo, ped->phototag, xieElemExportClientPhoto, return(TRUE)); + + pvt = (eTecEncodeJPEGBaselineDefPtr)ped->techPvt; + pvt->q = (rparms->lenQtable + ? (CARD8 *)rparms + sizeof(xieTecEncodeJPEGBaseline) + : (CARD8 *) NULL); + pvt->a = (rparms->lenACtable + ? (CARD8 *)rparms + sizeof(xieTecEncodeJPEGBaseline) + + rparms->lenQtable + : (CARD8 *) NULL); + pvt->d = (rparms->lenDCtable + ? (CARD8 *)rparms + sizeof(xieTecEncodeJPEGBaseline) + + rparms->lenQtable + rparms->lenACtable + : (CARD8 *) NULL); + return(TRUE); +} + +#ifdef BEYOND_SI +Bool CopyECPhotoJPEGLossless(flo, ped, sparms, rparms, tsize) + floDefPtr flo; + peDefPtr ped; + xieTecEncodeJPEGLossless *sparms, *rparms; + CARD16 tsize; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + memcpy((char *)rparms, (char *)sparms, tsize<<2); + + if( flo->reqClient->swapped ) { + register int n; + swaps(&rparms->lenTable,n); + } + return(TRUE); +} +#endif /* BEYOND_SI */ +#endif + + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepECPhoto(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloExportClientPhoto *raw = (xieFloExportClientPhoto *)ped->elemRaw; + ePhotoDefPtr pvt = (ePhotoDefPtr)ped->elemPvt; + inFloPtr inf = &ped->inFloLst[SRCtag]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + int b; + + /* Make sure notify value is valid + */ + if(raw->notify != xieValDisable && + raw->notify != xieValFirstData && + raw->notify != xieValNewData) + ValueError(flo,ped,raw->notify, return(FALSE)); + + pvt->congress = FALSE; + dst->bands = inf->bands = src->bands; + for(b = 0; b < src->bands; b++) { + if (IsntConstrained(src->format[b].class)) + MatchError(flo, ped, return(FALSE)); + dst->format[b] = inf->format[b] = src->format[b]; + } + if(!(ped->techVec->prepfnc(flo, ped, &raw[1]))) + TechniqueError(flo,ped,xieValEncode,raw->encodeTechnique,raw->lenParams, + return(FALSE)); + + pvt->encodeNumber = raw->encodeTechnique; + pvt->encodeLen = raw->lenParams << 2; + pvt->encodeParms = (pointer)&raw[1]; + + if(ped->inFloLst[IMPORT].srcDef->flags.import) { + /* + * see if import data can leap-frog the import and export elements + */ + if(BuildDecodeFromEncode(flo,ped) && CompareDecode(flo,ped)) { + inFloPtr import = &inf->srcDef->inFloLst[IMPORT]; + + inf->bands = import->bands; + for(b = 0; b < import->bands; ++b) + inf->format[b] = import->format[b]; + pvt->congress = TRUE; + } + if(pvt->decodeParms) + pvt->decodeParms = (pointer)XieFree(pvt->decodeParms); + } + return(TRUE); +} /* end PrepECPhoto */ + + +/*------------------------------------------------------------------------ +----- routines: verify technique parameters against element parameters ---- +-------------- and prepare for analysis and execution ---- +------------------------------------------------------------------------*/ + +/* Prep routine for uncompressed single band data */ +Bool PrepECPhotoUnSingle(flo, ped, tec) + floDefPtr flo; + peDefPtr ped; + xieTecEncodeUncompressedSingle *tec; +{ + outFloPtr dst = &ped->outFlo; + CARD32 padmod = tec->scanlinePad * 8; + CARD32 pitch = tec->pixelStride * dst->format[0].width; + BOOL aligned = !(tec->pixelStride & (tec->pixelStride-1)) || + tec->pixelStride == 24; + + if(tec->fillOrder != xieValLSFirst && /* check fill-order */ + tec->fillOrder != xieValMSFirst) + return(FALSE); + if(tec->pixelOrder != xieValLSFirst && /* check pixel-order */ + tec->pixelOrder != xieValMSFirst) + return(FALSE); + if(tec->pixelStride < dst->format[0].depth) /* check pixel-stride */ + return(FALSE); + if(ALIGNMENT == xieValAlignable && /* scanline alignment */ + !tec->scanlinePad && !aligned) + return(FALSE); + if(tec->scanlinePad & (tec->scanlinePad-1) || /* check scanline-pad */ + tec->scanlinePad > 16) + return(FALSE); + + dst->format[0].interleaved = FALSE; + dst->format[0].class = STREAM; + dst->format[0].stride = tec->pixelStride; + dst->format[0].pitch = pitch + (padmod ? Align(pitch,padmod) : 0); + + return(TRUE); +} /* PrepECPhotoUnSingle */ + +Bool PrepECPhotoG31D(flo, ped, tec) + floDefPtr flo; + peDefPtr ped; + xieTecEncodeG31D *tec; +{ + outFloPtr dst = &ped->outFlo; + + if(tec->encodedOrder != xieValLSFirst && /* check encoding-order */ + tec->encodedOrder != xieValMSFirst) + return(FALSE); + + dst->format[0].interleaved = FALSE; + dst->format[0].class = STREAM; + + return(TRUE); + +} /* PrepECPhotoG31D */ + +Bool PrepECPhotoG32D(flo, ped, tec) + floDefPtr flo; + peDefPtr ped; + xieTecEncodeG32D *tec; +{ + outFloPtr dst = &ped->outFlo; + + if(tec->encodedOrder != xieValLSFirst && /* check encoding-order */ + tec->encodedOrder != xieValMSFirst) + return(FALSE); + + dst->format[0].interleaved = FALSE; + dst->format[0].class = STREAM; + + return(TRUE); + +} /* PrepECPhotoG32D */ + +Bool PrepECPhotoG42D(flo, ped, tec) + floDefPtr flo; + peDefPtr ped; + xieTecEncodeG42D *tec; +{ + outFloPtr dst = &ped->outFlo; + + if(tec->encodedOrder != xieValLSFirst && /* check encoding-order */ + tec->encodedOrder != xieValMSFirst) + return(FALSE); + + dst->format[0].interleaved = FALSE; + dst->format[0].class = STREAM; + + return(TRUE); + +} /* PrepECPhotoG42D */ + +Bool PrepECPhotoTIFF2(flo, ped, tec) + floDefPtr flo; + peDefPtr ped; + xieTecEncodeTIFF2 *tec; +{ + outFloPtr dst = &ped->outFlo; + + if(tec->encodedOrder != xieValLSFirst && /* check encoding-order */ + tec->encodedOrder != xieValMSFirst) + return(FALSE); + + dst->format[0].interleaved = FALSE; + dst->format[0].class = STREAM; + + return(TRUE); + +} /* PrepECPhotoTIFF2 */ + +Bool PrepECPhotoTIFFPackBits(flo, ped, tec) + floDefPtr flo; + peDefPtr ped; + xieTecEncodeTIFFPackBits *tec; +{ + outFloPtr dst = &ped->outFlo; + + if(tec->encodedOrder != xieValLSFirst && /* check encoding-order */ + tec->encodedOrder != xieValMSFirst) + return(FALSE); + + dst->format[0].interleaved = FALSE; + dst->format[0].class = STREAM; + + return(TRUE); +} /* PrepECPhotoTIFFPackBits */ + +#if XIE_FULL +/* Prep routine for uncompressed triple band data */ +Bool PrepECPhotoUnTriple(flo, ped, tec) + floDefPtr flo; + peDefPtr ped; + xieTecEncodeUncompressedTriple *tec; +{ + outFloPtr dst = &ped->outFlo; + int b; + + if(tec->fillOrder != xieValLSFirst && /* check fill-order */ + tec->fillOrder != xieValMSFirst) + return(FALSE); + if(tec->pixelOrder != xieValLSFirst && /* check pixel-order */ + tec->pixelOrder != xieValMSFirst) + return(FALSE); + if(tec->bandOrder != xieValLSFirst && /* check band-order */ + tec->bandOrder != xieValMSFirst) + return(FALSE); + if(tec->interleave != xieValBandByPixel && /* check interleave */ + tec->interleave != xieValBandByPlane) + return(FALSE); + if (tec->interleave == xieValBandByPixel && /* check inter-band dim */ + (dst->format[0].width != dst->format[1].width || + dst->format[1].width != dst->format[2].width || + dst->format[0].height != dst->format[1].height || + dst->format[1].height != dst->format[2].height)) + return(FALSE); + if (tec->interleave == xieValBandByPixel) { + CARD32 padmod = tec->scanlinePad[0] * 8; + CARD32 pitch = tec->pixelStride[0] * dst->format[0].width; + + if (tec->pixelStride[0] < + dst->format[0].depth + dst->format[1].depth + dst->format[2].depth || + dst->format[0].depth > 16 || + dst->format[1].depth > 16 || + dst->format[2].depth > 16) + return(FALSE); + if(tec->scanlinePad[0] & (tec->scanlinePad[0]-1) || /*check scanln-pad*/ + tec->scanlinePad[0] > 16) + return(FALSE); + + dst->bands = 1; + dst->format[0].interleaved = TRUE; + dst->format[0].class = STREAM; + dst->format[0].stride = tec->pixelStride[0]; + dst->format[0].pitch = pitch + (padmod ? Align(pitch,padmod) : 0); + } else { + if(tec->pixelStride[0] < dst->format[0].depth || /* check pixel-stride */ + tec->pixelStride[1] < dst->format[1].depth || + tec->pixelStride[2] < dst->format[2].depth) + return(FALSE); + for (b = 0; b < 3; b++) { + CARD32 padmod = tec->scanlinePad[b] * 8; + CARD32 pitch = tec->pixelStride[b] * dst->format[b].width; + + if(dst->format[b].depth > 16) /* check pixel-depth */ + return(FALSE); + if(tec->scanlinePad[b] & (tec->scanlinePad[b]-1) || /*check scanln-pad*/ + tec->scanlinePad[b] > 16) + return(FALSE); + + dst->format[b].interleaved = FALSE; + dst->format[b].class = STREAM; + dst->format[b].stride = tec->pixelStride[b]; + dst->format[b].pitch = pitch + (padmod ? Align(pitch,padmod) : 0); + } + } + + return(TRUE); +} /* PrepECPhotoUnTriple */ + +Bool PrepECPhotoJPEGBaseline(flo, ped, tec) + floDefPtr flo; + peDefPtr ped; + xieTecEncodeJPEGBaseline *tec; +{ + outFloPtr dst = &ped->outFlo; + + if (dst->bands == 1) + dst->format[0].interleaved = FALSE; + else { + if(tec->bandOrder != xieValLSFirst && /* check encoding-order */ + tec->bandOrder != xieValMSFirst) + return(FALSE); + + if(tec->interleave != xieValBandByPixel && /* check interleave */ + tec->interleave != xieValBandByPlane) + return(FALSE); + + dst->format[0].interleaved = + dst->format[1].interleaved = + dst->format[2].interleaved = + (tec->interleave == xieValBandByPixel); + + if (tec->interleave == xieValBandByPixel) + dst->bands = 1; + else { + dst->format[1].class = STREAM; + dst->format[2].class = STREAM; + } + } + + dst->format[0].class = STREAM; + + return(TRUE); + +} /* PrepECPhotoJPEGBaseline */ + +#ifdef BEYOND_SI +Bool PrepECPhotoJPEGLossless(flo, ped, tec) + floDefPtr flo; + peDefPtr ped; + xieTecEncodeJPEGLossless *tec; +{ + outFloPtr dst = &ped->outFlo; + CARD8 pred; + + if ((pred = tec->predictor[0]) != xieValPredictorNone && + pred != xieValPredictorA && + pred != xieValPredictorB && + pred != xieValPredictorC && + pred != xieValPredictorABC && + pred != xieValPredictorABC2 && + pred != xieValPredictorBAC2 && + pred != xieValPredictorAB2) + return(FALSE); + + if (dst->bands == 1) + dst->format[0].interleaved = FALSE; + else { + if(tec->bandOrder != xieValLSFirst && /* check encoding-order */ + tec->bandOrder != xieValMSFirst) + return(FALSE); + + if(tec->interleave != xieValBandByPixel && /* check interleave */ + tec->interleave != xieValBandByPlane) + return(FALSE); + + if ((pred = tec->predictor[1]) != xieValPredictorNone && + pred != xieValPredictorA && + pred != xieValPredictorB && + pred != xieValPredictorC && + pred != xieValPredictorABC && + pred != xieValPredictorABC2 && + pred != xieValPredictorBAC2 && + pred != xieValPredictorAB2) + return(FALSE); + + if ((pred = tec->predictor[2]) != xieValPredictorNone && + pred != xieValPredictorA && + pred != xieValPredictorB && + pred != xieValPredictorC && + pred != xieValPredictorABC && + pred != xieValPredictorABC2 && + pred != xieValPredictorBAC2 && + pred != xieValPredictorAB2) + return(FALSE); + + dst->format[0].interleaved = + dst->format[1].interleaved = + dst->format[2].interleaved = + (tec->interleave == xieValBandByPixel); + + if (tec->interleave == xieValBandByPixel) + dst->bands = 1; + else { + dst->format[1].class = STREAM; + dst->format[2].class = STREAM; + } + } + + dst->format[0].class = STREAM; + + return(TRUE); + +} /* PrepECPhotoJPEGLossless */ +#endif /* BEYOND_SI */ +#endif + +/* end module ecphoto.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/export/ecroi.c b/xie/xc/programs/Xserver/XIE/dixie/export/ecroi.c new file mode 100644 index 0000000..68a32fc --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/export/ecroi.c @@ -0,0 +1,196 @@ +/* $XConsortium: ecroi.c,v 1.4 94/04/17 20:33:29 rws Exp $ */ +/**** module ecroi.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + ecroi.c -- DIXIE routines for managing the ExportClientROI element + + Dean Verheiden -- AGE Logic, Inc. August 1993 + +*****************************************************************************/ + +#define _XIEC_ECROI + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeECROI(); + +/* + * routines internal to this module + */ +static Bool PrepECROI(); + +/* + * dixie entry points + */ +static diElemVecRec eROIVec = { + PrepECROI /* prepare for analysis and execution */ + }; + + +/*------------------------------------------------------------------------ +----------------- routine: make an ExportClientROI element ---------------- +------------------------------------------------------------------------*/ +peDefPtr MakeECROI(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + inFloPtr inFlo; + ELEMENT(xieFloExportClientROI); + ELEMENT_AT_LEAST_SIZE(xieFloExportClientROI); + ELEMENT_NEEDS_1_INPUT(src); + + if(!(ped = MakePEDef(1, (CARD32)stuff->elemLength<<2, 0))) + FloAllocError(flo,tag,xieElemExportClientROI, return(NULL)); + + ped->diVec = &eROIVec; + ped->phototag = tag; + ped->flags.export = TRUE; + ped->flags.getData = TRUE; + raw = (xieFloExportClientROI *)ped->elemRaw; + /* + * copy the standard client element parameters (swap if necessary) + */ + if (flo->reqClient->swapped) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + raw->notify = stuff->notify; + } else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloExportClientROI)); + /* + * assign phototags to inFlos + */ + inFlo = ped->inFloLst; + inFlo[SRCtag].srcTag = raw->src; + + return(ped); +} /* end MakeECROI */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepECROI(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloExportClientROI *raw = (xieFloExportClientROI *)ped->elemRaw; + inFloPtr inf = &ped->inFloLst[SRCtag]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + + /* Make sure notify value is valid + */ + if(raw->notify != xieValDisable && + raw->notify != xieValFirstData && + raw->notify != xieValNewData) + ValueError(flo,ped,raw->notify, return(FALSE)); + + /* Validate and Propagate input attributes to our output */ + if (src->bands != 1 || src->format[0].class != RUN_LENGTH) + FloSourceError(flo,raw->src,raw->elemType, return(FALSE)); + + dst->bands = inf->bands = src->bands; + dst->format[0] = inf->format[0] = src->format[0]; + ped->swapUnits[0] = sizeof(xieTypRectangle); + + return(TRUE); +} /* end PrepECROI */ + +/* end module ecroi.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/export/edraw.c b/xie/xc/programs/Xserver/XIE/dixie/export/edraw.c new file mode 100644 index 0000000..ebe403b --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/export/edraw.c @@ -0,0 +1,277 @@ +/* $XConsortium: edraw.c,v 1.4 94/04/17 20:33:29 rws Exp $ */ +/**** module edraw.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + edraw.c -- DIXIE routines for managing the ExportDrawable element + + Robert NC Shelley -- AGE Logic, Inc. April 1993 + +*****************************************************************************/ + +#define _XIEC_EDRAW + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include +#include +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeEDraw(); +Bool DrawableAndGC(); + +/* + * routines internal to this module + */ +static Bool PrepEDraw(); + +/* + * dixie entry points + */ +static diElemVecRec eDrawVec = { + PrepEDraw /* prepare for analysis and execution */ + }; + + +/*------------------------------------------------------------------------ +----------------- routine: make an ExportDrawable element ---------------- +------------------------------------------------------------------------*/ +peDefPtr MakeEDraw(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + inFloPtr inflo; + ELEMENT(xieFloExportDrawable); + ELEMENT_SIZE_MATCH(xieFloExportDrawable); + ELEMENT_NEEDS_1_INPUT(src); + + if(!(ped = MakePEDef(1, (CARD32)stuff->elemLength<<2, sizeof(eDrawDefRec)))) + FloAllocError(flo,tag,xieElemExportDrawable, return(NULL)); + + ped->diVec = &eDrawVec; + ped->phototag = tag; + ped->flags.export = TRUE; + raw = (xieFloExportDrawable *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + cpswaps(stuff->dstX, raw->dstX); + cpswaps(stuff->dstY, raw->dstY); + cpswapl(stuff->drawable, raw->drawable); + cpswapl(stuff->gc, raw->gc); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloExportDrawable)); + /* + * assign phototags to inFlos + */ + inflo = ped->inFloLst; + inflo[SRCtag].srcTag = raw->src; + + return(ped); +} /* end MakeEDraw */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepEDraw(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloExportDrawable *raw = (xieFloExportDrawable *) ped->elemRaw; + eDrawDefPtr pvt = (eDrawDefPtr) ped->elemPvt; + inFloPtr inf = &ped->inFloLst[SRCtag]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + formatPtr df = &dst->format[0]; + CARD32 f, right_padm1; + /* + * check out drawable and gc + */ + if(!DrawableAndGC(flo,ped,raw->drawable,raw->gc,&(pvt->pDraw),&(pvt->pGC))) + return(FALSE); + /* + * check for: constrained, single-band, and levels matching drawable depth + */ + if(IsntConstrained(src->format[0].class) || + src->bands != 1 || pvt->pDraw->depth != src->format[0].depth) + MatchError(flo,ped, return(FALSE)); + /* + * grab a copy of the input attributes and propagate them to our output + */ + dst->bands = inf->bands = src->bands; + df[0] = inf->format[0] = src->format[0]; + + /* search for the stride and pitch requirements that match our depth + */ + for(f = 0; (f < screenInfo.numPixmapFormats && + df[0].depth != screenInfo.formats[f].depth); ++f); + if(f == screenInfo.numPixmapFormats) + DrawableError(flo,ped,raw->drawable, return(FALSE)); + + right_padm1 = screenInfo.formats[f].scanlinePad - 1; + df[0].stride = screenInfo.formats[f].bitsPerPixel; + df[0].pitch = df[0].width * df[0].stride + right_padm1 & ~right_padm1; + + return(TRUE); +} /* end PrepEDraw */ + +/*------------------------------------------------------------------------ +--- callable version of GetGCAndDrawableAndValidate (from extension.h) --- +--- made callable because the macro version returned standard X errors --- +------------------------------------------------------------------------*/ +Bool DrawableAndGC(flo,ped,draw_id,gc_id,draw_ret,gc_ret) + floDefPtr flo; + peDefPtr ped; + Drawable draw_id; + GContext gc_id; + DrawablePtr *draw_ret; + GCPtr *gc_ret; +{ + register ClientPtr client = flo->runClient; + register DrawablePtr draw; + register GCPtr gc; + + if(client->clientGone) AccessError(flo,ped, return(FALSE)); + + if((client->lastDrawableID != draw_id) || + (client->lastGCID != gc_id)) { + if(client->lastDrawableID != draw_id) + draw = (DrawablePtr)LookupIDByClass(draw_id, RC_DRAWABLE); + else + draw = client->lastDrawable; + if(client->lastGCID != gc_id) + gc = (GCPtr)LookupIDByType(gc_id, RT_GC); + else + gc = client->lastGC; + if(draw && gc) { + if((draw->type == UNDRAWABLE_WINDOW) || + (gc->depth != draw->depth) || + (gc->pScreen != draw->pScreen)) + MatchError(flo,ped, return(FALSE)); + + client->lastDrawable = draw; + client->lastDrawableID = draw_id; + client->lastGC = gc; + client->lastGCID = gc_id; + } + } else { + gc = client->lastGC; + draw = client->lastDrawable; + } + if(!draw) { + client->errorValue = draw_id; + DrawableError(flo,ped,draw_id, return(FALSE)); + } + if(!gc) { + client->errorValue = gc_id; + GCError(flo,ped,gc_id, return(FALSE)); + } + if(gc->serialNumber != draw->serialNumber) + ValidateGC(draw, gc); + + *draw_ret = draw; + *gc_ret = gc; + + return(TRUE); +} /* end DrawableAndGC */ + +/* end module edraw.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/export/edrawp.c b/xie/xc/programs/Xserver/XIE/dixie/export/edrawp.c new file mode 100644 index 0000000..c5725d5 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/export/edrawp.c @@ -0,0 +1,202 @@ +/* $XConsortium: edrawp.c,v 1.4 94/04/17 20:33:30 rws Exp $ */ +/**** module edrawp.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + edrawp.c -- DIXIE routines for managing the ExportDrawablePlane element + + Robert NC Shelley -- AGE Logic, Inc. April 1993 + +*****************************************************************************/ + +#define _XIEC_EDRAWP + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeEDrawPlane(); + +/* + * routines internal to this module + */ +static Bool PrepEDrawPlane(); + +/* + * dixie entry points + */ +static diElemVecRec eDrawPlaneVec = { + PrepEDrawPlane /* prepare for analysis and execution */ + }; + + +/*------------------------------------------------------------------------ +--------------- routine: make an ExportDrawablePlane element ------------- +------------------------------------------------------------------------*/ +peDefPtr MakeEDrawPlane(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + inFloPtr inFlo; + ELEMENT(xieFloExportDrawablePlane); + ELEMENT_SIZE_MATCH(xieFloExportDrawablePlane); + ELEMENT_NEEDS_1_INPUT(src); + + if(!(ped = MakePEDef(1, (CARD32)stuff->elemLength<<2, + sizeof(eDrawPDefRec)))) + FloAllocError(flo,tag,xieElemExportDrawablePlane, return(NULL)); + + ped->diVec = &eDrawPlaneVec; + ped->phototag = tag; + ped->flags.export = TRUE; + raw = (xieFloExportDrawablePlane *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + cpswaps(stuff->dstX, raw->dstX); + cpswaps(stuff->dstY, raw->dstY); + cpswapl(stuff->drawable, raw->drawable); + cpswapl(stuff->gc, raw->gc); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloExportDrawablePlane)); + /* + * assign phototags to inFlos + */ + inFlo = ped->inFloLst; + inFlo[SRCtag].srcTag = raw->src; + + return(ped); +} /* end MakeEDrawPlane */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepEDrawPlane(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloExportDrawablePlane *raw = (xieFloExportDrawablePlane *)ped->elemRaw; + eDrawPDefPtr pvt = (eDrawPDefPtr) ped->elemPvt; + inFloPtr inf = &ped->inFloLst[SRCtag]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + /* + * check out drawable and gc + */ + if(!DrawableAndGC(flo,ped,raw->drawable,raw->gc,&(pvt->pDraw),&(pvt->pGC))) + return(FALSE); + /* + * check for: constrained, single-band, bitonal image + */ + if( (src->format[0].class != BIT_PIXEL) || (src->bands != 1)) + MatchError(flo,ped, return(FALSE)); + /* + * grab a copy of the input attributes and propagate them to our output + */ + dst->bands = inf->bands = src->bands; + dst->format[0] = inf->format[0] = src->format[0]; + + return(TRUE); +} /* end PrepEDrawplane */ + +/* end module edrawp.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/export/elut.c b/xie/xc/programs/Xserver/XIE/dixie/export/elut.c new file mode 100644 index 0000000..88a4792 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/export/elut.c @@ -0,0 +1,268 @@ +/* $XConsortium: elut.c,v 1.4 94/04/17 20:33:30 rws Exp $ */ +/**** module elut.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + elut.c -- DIXIE routines for managing the ExportLUT element + + Larry Hare -- AGE Logic, Inc. June 1993 + +*****************************************************************************/ + +#define _XIEC_ELUT + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + +/* + * routines referenced by other modules. + */ +peDefPtr MakeELUT(); + +/* + * routines internal to this module + */ +static Bool PrepELUT(); +static Bool DebriefELUT(); + +/* + * dixie entry points + */ +static diElemVecRec eLUTVec = { + PrepELUT, + DebriefELUT + }; + + +/*------------------------------------------------------------------------ +----------------- routine: make an ExportLUT element ---------------- +------------------------------------------------------------------------*/ +peDefPtr MakeELUT(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + inFloPtr inFlo; + ELEMENT(xieFloExportLUT); + ELEMENT_SIZE_MATCH(xieFloExportLUT); + ELEMENT_NEEDS_1_INPUT(src); + + if(!(ped = MakePEDef(1,(CARD32)stuff->elemLength<<2,sizeof(eLUTDefRec)))) + FloAllocError(flo,tag,xieElemExportLUT, return(NULL)); + + ped->diVec = &eLUTVec; + ped->phototag = tag; + ped->flags.export = TRUE; + raw = (xieFloExportLUT *)ped->elemRaw; + /* + * copy the standard client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + raw->merge = stuff->merge; + cpswaps(stuff->src, raw->src); + cpswapl(stuff->lut, raw->lut); + cpswapl(stuff->start0, raw->start0); + cpswapl(stuff->start1, raw->start1); + cpswapl(stuff->start2, raw->start2); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloExportLUT)); + /* + * assign phototags to inFlos + */ + inFlo = ped->inFloLst; + inFlo[SRCtag].srcTag = raw->src; + + return(ped); +} /* end MakeELUT */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepELUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloExportLUT *raw = (xieFloExportLUT *)ped->elemRaw; + eLUTDefPtr pvt = (eLUTDefPtr) ped->elemPvt; + inFloPtr inf = &ped->inFloLst[IMPORT]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + CARD32 *start = &(raw->start0); + lutPtr lut; + CARD32 b, oops; + + /* find the LUT resource and bind it to our flo */ + if(!(lut = pvt->lut = (lutPtr) LookupIDByType(raw->lut, RT_LUT))) + LUTError(flo,ped,raw->lut, return(FALSE)); + + ++pvt->lut->refCnt; + if(!raw->merge && ((oops=start[0]) || (oops=start[1]) || (oops=start[2]))) + ValueError(flo, ped, oops, return(FALSE)); + + /* Validate and Propagate input attributes to our output */ + dst->bands = inf->bands = src->bands; + for(b = 0; b < src->bands; ++b) { + if (IsntLut(src->format[b].class)) + FloSourceError(flo,raw->src,raw->elemType, return(FALSE)); + if (raw->merge) { + if ( (src->format[b].levels != lut->format[b].level) || + (start[b] + src->format[b].height > lut->format[b].length) ) + MatchError(flo, ped, return(FALSE)); + } + dst->format[b] = inf->format[b] = src->format[b]; + } + return(TRUE); +} /* end PrepELUT */ + + +/*------------------------------------------------------------------------ +---------------------- routine: post execution cleanup ------------------- +------------------------------------------------------------------------*/ +static Bool DebriefELUT(flo,ped,ok) + floDefPtr flo; + peDefPtr ped; + Bool ok; +{ + xieFloExportLUT *raw = (xieFloExportLUT *)ped->elemRaw; + eLUTDefPtr pvt = (eLUTDefPtr) ped->elemPvt; + lutPtr lut; + CARD32 b; + + if(!(pvt && (lut = pvt->lut))) return(FALSE); + + if(ok && lut->refCnt > 1) { + + if (raw->merge) { + CARD32 *start = &(raw->start0); + for(b = 0; b < lut->lutCnt; b++) { + int nbytes = LutPitch(lut->format[b].level); + memcpy(lut->strips[b].flink->data + start[b] * nbytes, + ped->outFlo.output[b].flink->data, + ped->outFlo.output[b].flink->length * nbytes); + } /* transient strips freed below */ + } else { + /* free old LUT data */ + for(b = 0; b < lut->lutCnt; b++) + FreeStrips(&lut->strips[b]); + + /* stash our new attributes and data into the LUT */ + lut->lutCnt = ped->outFlo.bands; + for(b = 0; b < lut->lutCnt; ++b) { + lut->format[b].bandOrder = ped->outFlo.format[b].width; /* hack */ + lut->format[b].length = ped->outFlo.format[b].height; /* hack */ + lut->format[b].level = ped->outFlo.format[b].levels; + DebriefStrips(&ped->outFlo.output[b],&lut->strips[b]); + } + } + } + /* free image data that's left over on our outFlo + */ + for(b = 0; b < ped->outFlo.bands; b++) + FreeStrips(&ped->outFlo.output[b]); + + /* unbind ourself from the LUT + */ + if(lut->refCnt > 1) + --lut->refCnt; + else if(LookupIDByType(raw->lut, RT_LUT)) + FreeResourceByType(lut->ID, RT_LUT, RT_NONE); + else + DeleteLUT(lut, lut->ID); + + return(TRUE); +} /* end DebriefELUT */ + +/* end module elut.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/export/ephoto.c b/xie/xc/programs/Xserver/XIE/dixie/export/ephoto.c new file mode 100644 index 0000000..6a3fe63 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/export/ephoto.c @@ -0,0 +1,610 @@ +/* $XConsortium: ephoto.c,v 1.7 94/04/17 20:33:31 rws Exp $ */ +/**** module ephoto.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + ephoto.c -- DIXIE routines for managing the ExportPhotomap element + + Robert NC Shelley && Dean Verheiden -- AGE Logic, Inc. April 1993 + +*****************************************************************************/ + +#define _XIEC_EPHOTO + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include +#include +#include /* For Server Choice function */ + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeEPhoto(); +Bool BuildDecodeFromEncode(); +Bool CompareDecode(); + +/* + * routines internal to this module + */ +static Bool CopyEPhotoServerChoice(); +static Bool PrepEPhoto(); +static Bool DebriefEPhoto(); + +extern pointer GetImportTechnique(); + +/* + * dixie entry points + */ +static diElemVecRec ePhotoVec = { + PrepEPhoto, + DebriefEPhoto + }; + + +/*------------------------------------------------------------------------ +----------------- routine: make an ExportPhotomap element ---------------- +------------------------------------------------------------------------*/ +peDefPtr MakeEPhoto(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + inFloPtr inFlo; + ELEMENT(xieFloExportPhotomap); + ELEMENT_AT_LEAST_SIZE(xieFloExportPhotomap); + ELEMENT_NEEDS_1_INPUT(src); + + if(!(ped = MakePEDef(1,(CARD32)stuff->elemLength<<2,sizeof(ePhotoDefRec)))) + FloAllocError(flo,tag,xieElemExportPhotomap, return(NULL)); + + ped->diVec = &ePhotoVec; + ped->phototag = tag; + ped->flags.export = TRUE; + raw = (xieFloExportPhotomap *)ped->elemRaw; + /* + * copy the standard client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + cpswapl(stuff->photomap, raw->photomap); + cpswaps(stuff->encodeTechnique, raw->encodeTechnique); + cpswaps(stuff->lenParams, raw->lenParams); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloExportPhotomap)); + /* + * assign phototags to inFlos + */ + inFlo = ped->inFloLst; + inFlo[SRCtag].srcTag = raw->src; + + /* + * copy technique data (if any) + */ + if (raw->encodeTechnique == xieValEncodeServerChoice) { + if (!CopyEPhotoServerChoice(flo,ped,&stuff[1],&raw[1],raw->lenParams)) + TechniqueError(flo,ped,xieValEncode,raw->encodeTechnique,raw->lenParams, + return(ped)); + } else if (!(ped->techVec = FindTechnique(xieValEncode,raw->encodeTechnique)) + || !(ped->techVec->copyfnc(flo,ped,&stuff[1],&raw[1],raw->lenParams))) + TechniqueError(flo,ped,xieValEncode,raw->encodeTechnique,raw->lenParams, + return(ped)); + + return(ped); +} /* end MakeEPhoto */ + +static Bool CopyEPhotoServerChoice(flo, ped, sparms, rparms, tsize) + floDefPtr flo; + peDefPtr ped; + xieTecEncodeServerChoice *sparms, *rparms; + CARD16 tsize; +{ + if(tsize == 1) + rparms->preference = sparms->preference; + + return(tsize <= 1); +} + +/* All other technique-specific copy routines are defined in ecphoto.c */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepEPhoto(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloExportPhotomap *raw = (xieFloExportPhotomap *)ped->elemRaw; + ePhotoDefPtr pvt = (ePhotoDefPtr)ped->elemPvt; + inFloPtr inf = &ped->inFloLst[SRCtag]; + outFloPtr dst = &ped->outFlo; + xieBoolProc scPrep; + CARD32 b; + + /* find the photomap resource and bind it to our flo + */ + if(!(pvt->map = (photomapPtr) LookupIDByType(raw->photomap, RT_PHOTOMAP))) + PhotomapError(flo,ped,raw->photomap, return(FALSE)); + ++pvt->map->refCnt; + + pvt->congress = FALSE; + if(raw->encodeTechnique == xieValEncodeServerChoice) { + if(!(scPrep = ((xieBoolProc (*)()) + DDInterface[DDServerChoiceIndex]) (flo, ped))) + TechniqueError(flo,ped,xieValEncode,raw->encodeTechnique,raw->lenParams, + return(FALSE)); + } else { + /* grab a copy of the input attributes and propagate them to our output + */ + outFloPtr src = &inf->srcDef->outFlo; + for(b = 0; b < src->bands; ++b) { + if(IsntCanonic(src->format[b].class)) + MatchError(flo,ped, return(FALSE)); + dst->format[b] = inf->format[b] = src->format[b]; + dst->bands = inf->bands = src->bands; + /* dst->bands will be 1 if we encode TripleBand interleaved BandByPixel */ + } + scPrep = (xieBoolProc)NULL; + } + + /* do technique-specific preparations + */ + if(scPrep) { + if (!(*scPrep)(flo,ped)) + TechniqueError(flo,ped,xieValEncode,raw->encodeTechnique, + raw->lenParams, return(FALSE)); + } else { + if(!(ped->techVec->prepfnc(flo, ped, &raw[1]))) + TechniqueError(flo,ped,xieValEncode,raw->encodeTechnique,raw->lenParams, + return(FALSE)); + + pvt->encodeNumber = raw->encodeTechnique; + pvt->encodeLen = raw->lenParams << 2; + pvt->encodeParms = (pointer)&raw[1]; + + if(!BuildDecodeFromEncode(flo,ped)) + AllocError(flo,ped, return(FALSE)); + + /* see if import data can leap-frog the import and export elements + */ + if(ped->inFloLst[IMPORT].srcDef->flags.import && CompareDecode(flo,ped)) { + inFloPtr import = &inf->srcDef->inFloLst[IMPORT]; + + /* copy smuggled data attributes to our inFlo */ + inf->bands = import->bands; + for(b = 0; b < import->bands; ++b) + inf->format[b] = import->format[b]; + pvt->congress = TRUE; + } + } + return(TRUE); +} /* end PrepEPhoto */ + +/* All technique-specific prep routines are defined in ecphoto.c */ + +Bool BuildDecodeFromEncode(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ePhotoDefPtr pvt = (ePhotoDefPtr)ped->elemPvt; + + /* Based on the encode technique, build a correspoinding decode technique */ + switch(pvt->encodeNumber) { + case xieValEncodeUncompressedSingle: + { + xieTecEncodeUncompressedSingle *etec = + (xieTecEncodeUncompressedSingle *)pvt->encodeParms; + xieTecDecodeUncompressedSingle *dtec; + + if (!(dtec = (xieTecDecodeUncompressedSingle *) + XieMalloc(sizeof(xieTecDecodeUncompressedSingle)))) + AllocError(flo,ped, return(FALSE)); + pvt->decodeNumber = xieValDecodeUncompressedSingle; + pvt->decodeLen = sizeof(xieTecDecodeUncompressedSingle); + pvt->decodeParms = (pointer)dtec; + dtec->fillOrder = etec->fillOrder; + dtec->pixelOrder = etec->pixelOrder; + dtec->pixelStride = etec->pixelStride; + dtec->leftPad = 0; + dtec->scanlinePad = etec->scanlinePad; + } + break; + case xieValEncodeUncompressedTriple: + { + xieTecEncodeUncompressedTriple *etec = + (xieTecEncodeUncompressedTriple *)pvt->encodeParms; + xieTecDecodeUncompressedTriple *dtec; + int i; + + if (!(dtec = (xieTecDecodeUncompressedTriple *) + XieMalloc(sizeof(xieTecDecodeUncompressedTriple)))) + AllocError(flo,ped, return(FALSE)); + pvt->decodeNumber = xieValDecodeUncompressedTriple; + pvt->decodeLen = sizeof(xieTecDecodeUncompressedTriple); + pvt->decodeParms = (pointer)dtec; + dtec->fillOrder = etec->fillOrder; + dtec->pixelOrder = etec->pixelOrder; + dtec->bandOrder = etec->bandOrder; + dtec->interleave = etec->interleave; + for (i = 0; i < 3; i++) { + dtec->leftPad[i] = 0; + dtec->pixelStride[i] = etec->pixelStride[i]; + dtec->scanlinePad[i] = etec->scanlinePad[i]; + } + } + break; + case xieValEncodeG31D: + { + xieTecEncodeG31D *etec = (xieTecEncodeG31D *)pvt->encodeParms; + xieTecDecodeG31D *dtec; + + if (!(dtec = (xieTecDecodeG31D *) + XieMalloc(sizeof(xieTecDecodeG31D)))) + AllocError(flo,ped, return(FALSE)); + pvt->decodeNumber = xieValDecodeG31D; + pvt->decodeLen = sizeof(xieTecDecodeG31D); + pvt->decodeParms = (pointer)dtec; + dtec->normal = TRUE; + dtec->radiometric = etec->radiometric; + dtec->encodedOrder = etec->encodedOrder; + } + break; + case xieValEncodeG32D: + { + xieTecEncodeG32D *etec = (xieTecEncodeG32D *)pvt->encodeParms; + xieTecDecodeG32D *dtec; + + if (!(dtec = (xieTecDecodeG32D *) + XieMalloc(sizeof(xieTecDecodeG32D)))) + AllocError(flo,ped, return(FALSE)); + pvt->decodeNumber = xieValDecodeG32D; + pvt->decodeLen = sizeof(xieTecDecodeG32D); + pvt->decodeParms = (pointer)dtec; + dtec->normal = TRUE; + dtec->radiometric = etec->radiometric; + dtec->encodedOrder = etec->encodedOrder; + } + break; + case xieValEncodeG42D: + { + xieTecEncodeG42D *etec = (xieTecEncodeG42D *)pvt->encodeParms; + xieTecDecodeG42D *dtec; + + if (!(dtec = (xieTecDecodeG42D *) + XieMalloc(sizeof(xieTecDecodeG42D)))) + AllocError(flo,ped, return(FALSE)); + pvt->decodeNumber = xieValDecodeG42D; + pvt->decodeLen = sizeof(xieTecDecodeG42D); + pvt->decodeParms = (pointer)dtec; + dtec->normal = TRUE; + dtec->radiometric = etec->radiometric; + dtec->encodedOrder = etec->encodedOrder; + } + break; + case xieValEncodeJPEGBaseline: + { + xieTecEncodeJPEGBaseline *etec = + (xieTecEncodeJPEGBaseline *)pvt->encodeParms; + xieTecDecodeJPEGBaseline *dtec; + + if (!(dtec = (xieTecDecodeJPEGBaseline *) + XieMalloc(sizeof(xieTecDecodeJPEGBaseline)))) + AllocError(flo,ped, return(FALSE)); + pvt->decodeNumber = xieValDecodeJPEGBaseline; + pvt->decodeLen = sizeof(xieTecDecodeJPEGBaseline); + pvt->decodeParms = (pointer)dtec; + dtec->interleave = etec->interleave; + dtec->upSample = etec->interleave == xieValBandByPixel; + dtec->bandOrder = etec->bandOrder; + } + break; + case xieValEncodeTIFF2: + { + xieTecEncodeTIFF2 *etec = (xieTecEncodeTIFF2 *)pvt->encodeParms; + xieTecDecodeTIFF2 *dtec; + + if (!(dtec = (xieTecDecodeTIFF2 *) + XieMalloc(sizeof(xieTecDecodeTIFF2)))) + AllocError(flo,ped, return(FALSE)); + pvt->decodeNumber = xieValDecodeTIFF2; + pvt->decodeLen = sizeof(xieTecDecodeTIFF2); + pvt->decodeParms = (pointer)dtec; + dtec->normal = TRUE; + dtec->radiometric = etec->radiometric; + dtec->encodedOrder = etec->encodedOrder; + } + break; + case xieValEncodeTIFFPackBits: + { + xieTecEncodeTIFFPackBits *etec = + (xieTecEncodeTIFFPackBits *)pvt->encodeParms; + xieTecDecodeTIFFPackBits *dtec; + + if (!(dtec = (xieTecDecodeTIFFPackBits *) + XieMalloc(sizeof(xieTecDecodeTIFFPackBits)))) + AllocError(flo,ped, return(FALSE)); + pvt->decodeNumber = xieValDecodeTIFFPackBits; + pvt->decodeLen = sizeof(xieTecDecodeTIFFPackBits); + pvt->decodeParms = (pointer)dtec; + dtec->normal = TRUE; + dtec->encodedOrder = etec->encodedOrder; + } + break; + case xieValEncodeJPEGLossless: /* not implemented in SI */ + default: + ImplementationError(flo,ped, return(FALSE)); + } + return(TRUE); +} + +Bool CompareDecode(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ePhotoDefPtr pvt = (ePhotoDefPtr)ped->elemPvt; + peDefPtr srcped = ped->inFloLst[IMPORT].srcDef; + CARD16 decodeNumber, decodeLen; + pointer decodeParms; + + decodeParms = GetImportTechnique(srcped,&decodeNumber,&decodeLen); + if(decodeNumber != pvt->decodeNumber) + return(FALSE); + + switch (decodeNumber) { + case xieValDecodeUncompressedSingle: + { + xieTecDecodeUncompressedSingle *itec = + (xieTecDecodeUncompressedSingle *)decodeParms; + xieTecDecodeUncompressedSingle *otec = + (xieTecDecodeUncompressedSingle *)pvt->decodeParms; + + return (itec->fillOrder == otec->fillOrder && + itec->pixelOrder == otec->pixelOrder && + itec->pixelStride == otec->pixelStride && + itec->leftPad == otec->leftPad && + itec->pixelStride == otec->pixelStride && + itec->scanlinePad == otec->scanlinePad); + } + break; + case xieValDecodeUncompressedTriple: + { + xieTecDecodeUncompressedTriple *itec = + (xieTecDecodeUncompressedTriple *)decodeParms; + xieTecDecodeUncompressedTriple *otec = + (xieTecDecodeUncompressedTriple *)pvt->decodeParms; + + return (itec->fillOrder == otec->fillOrder && + itec->pixelOrder == otec->pixelOrder && + itec->interleave == otec->interleave && + itec->bandOrder == otec->bandOrder && + itec->leftPad[0] == otec->leftPad[0] && + itec->leftPad[1] == otec->leftPad[1] && + itec->leftPad[2] == otec->leftPad[2] && + itec->pixelStride[0] == otec->pixelStride[0] && + itec->pixelStride[1] == otec->pixelStride[1] && + itec->pixelStride[2] == otec->pixelStride[2] && + itec->scanlinePad[0] == otec->scanlinePad[0] && + itec->scanlinePad[1] == otec->scanlinePad[1] && + itec->scanlinePad[2] == otec->scanlinePad[2]); + } + break; + case xieValDecodeG31D: + case xieValDecodeG32D: + case xieValDecodeG42D: + case xieValDecodeTIFF2: + { + xieTecDecodeG31D *itec = (xieTecDecodeG31D *)decodeParms; + xieTecDecodeG31D *otec = + (xieTecDecodeG31D *)pvt->decodeParms; + + return (itec->normal == otec->normal && + itec->radiometric == otec->radiometric && + itec->encodedOrder == otec->encodedOrder); + } + break; + case xieValDecodeJPEGBaseline: + case xieValDecodeJPEGLossless: + { + xieTecDecodeJPEGBaseline *itec = + (xieTecDecodeJPEGBaseline *)decodeParms; + xieTecDecodeJPEGBaseline *otec = + (xieTecDecodeJPEGBaseline *)pvt->decodeParms; + + return (itec->interleave == otec->interleave && + itec->bandOrder == otec->bandOrder && + itec->upSample == otec->upSample); + } + break; + case xieValDecodeTIFFPackBits: + { + xieTecDecodeTIFFPackBits *itec = + (xieTecDecodeTIFFPackBits *)decodeParms; + xieTecDecodeTIFFPackBits *otec = + (xieTecDecodeTIFFPackBits *)pvt->decodeParms; + + return (itec->normal == otec->normal && + itec->encodedOrder == otec->encodedOrder); + } + break; + default: + return (FALSE); + } +} + +/*------------------------------------------------------------------------ +---------------------- routine: post execution cleanup ------------------- +------------------------------------------------------------------------*/ +static Bool DebriefEPhoto(flo,ped,ok) + floDefPtr flo; + peDefPtr ped; + Bool ok; +{ + xieFloExportPhotomap *raw = (xieFloExportPhotomap *)ped->elemRaw; + ePhotoDefPtr pvt = (ePhotoDefPtr) ped->elemPvt; + inFloPtr inf = &ped->inFloLst[SRCtag]; + outFloPtr src = &inf->srcDef->outFlo; + photomapPtr map; + CARD32 b; + + if(!(pvt && (map = pvt->map))) return(FALSE); + + if(ok && map->refCnt > 1) { + + /* free old compression parameters and image data + */ + if(map->tecParms) + map->tecParms = (pointer)XieFree(map->tecParms); + + if(map->pvtParms) + map->pvtParms = (pointer)XieFree(map->pvtParms); + + for(b = 0; b < map->bands; b++) + FreeStrips(&map->strips[b]); + + /* stash our new attributes and data into the photomap + */ + map->bands = ped->outFlo.bands; + map->dataType = (map->format[0].class & UNCONSTRAINED + ? xieValUnconstrained : xieValConstrained); + map->technique = pvt->decodeNumber; + map->lenParms = pvt->decodeLen; + map->tecParms = pvt->decodeParms; + map->pvtParms = pvt->pvtParms; + map->dataClass = src->bands == 3 ? xieValTripleBand : xieValSingleBand; + for(b = 0; b < map->bands; ++b) { + map->format[b] = ped->outFlo.format[b]; + DebriefStrips(&ped->outFlo.output[b],&map->strips[b]); + } + pvt->decodeParms = NULL; + + if (src->bands == 3 && map->bands == 1) { + /* + * save format for the other bands too, we'll need them when we decode + */ + for(b = 1; b < src->bands; ++b) + map->format[b] = src->format[b]; + } + } + + /* if server choice, free space used to hold fabricated encode parameters */ + if (pvt->serverChose && pvt->encodeParms) + XieFree(pvt->encodeParms); + + /* Free decodeParms if something went afoul before hooking on to photomap */ + if (pvt->decodeParms) + XieFree(pvt->decodeParms); + + /* free image data that's left over on our outFlo + */ + for(b = 0; b < ped->outFlo.bands; b++) + FreeStrips(&ped->outFlo.output[b]); + + /* + unbind ourself from the photomap + */ + if(map->refCnt > 1) + --map->refCnt; + else if(LookupIDByType(raw->photomap, RT_PHOTOMAP)) + FreeResourceByType(map->ID, RT_PHOTOMAP, RT_NONE); + else + DeletePhotomap(map, map->ID); + + return(TRUE); +} /* end DebriefEPhoto */ + +/* end module ephoto.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/export/eroi.c b/xie/xc/programs/Xserver/XIE/dixie/export/eroi.c new file mode 100644 index 0000000..73925ed --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/export/eroi.c @@ -0,0 +1,232 @@ +/* $XConsortium: eroi.c,v 1.4 94/04/17 20:33:32 rws Exp $ */ +/**** module eroi.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + eroi.c -- DIXIE routines for managing the ExportROI element + + Robert NC Shelley -- AGE Logic, Inc. April 1993 + +*****************************************************************************/ + +#define _XIEC_EROI + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeEROI(); + +/* + * routines internal to this module + */ +static Bool PrepEROI(); +static Bool DebriefEROI(); + +/* + * dixie entry points + */ +static diElemVecRec eROIVec = +{ + PrepEROI, /* prepare for analysis and execution */ + DebriefEROI /* debrief */ +}; + + +/*------------------------------------------------------------------------ +----------------- routine: make an ExportROI element ---------------- +------------------------------------------------------------------------*/ +peDefPtr MakeEROI(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + inFloPtr inFlo; + ELEMENT(xieFloExportROI); + ELEMENT_SIZE_MATCH(xieFloExportROI); + ELEMENT_NEEDS_1_INPUT(src); + + if (!(ped = MakePEDef(1, (CARD32)stuff->elemLength<<2, sizeof(eROIDefRec)))) + FloAllocError(flo,tag,xieElemExportROI, return(NULL)); + + ped->diVec = &eROIVec; + ped->phototag = tag; + ped->flags.export = TRUE; + raw = (xieFloExportROI *)ped->elemRaw; + /* + * copy the standard client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + cpswapl(stuff->roi, raw->roi); + } else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloExportROI)); + /* + * assign phototags to inFlos + */ + inFlo = ped->inFloLst; + inFlo[0].srcTag = raw->src; + return ped; +} /* end MakeEROI */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepEROI(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloExportROI *raw = (xieFloExportROI *)ped->elemRaw; + eROIDefPtr pvt = (eROIDefPtr) ped->elemPvt; + inFloPtr inf = &ped->inFloLst[0]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + roiPtr roi; + + /* grab roi resource */ + if(!(roi = (roiPtr)LookupIDByType(raw->roi, RT_ROI))) + ROIError(flo,ped,raw->roi,return(FALSE)); + + pvt->roi = roi; + roi->refCnt++; + + if (src->bands != 1 || src->format[0].class != RUN_LENGTH) + FloSourceError(flo,raw->src,raw->elemType, return(FALSE)); + + dst->bands = inf->bands = src->bands; + dst->format[0].class = inf->format[0].class = src->format[0].class; + + return TRUE; +} /* end PrepEROI */ + +/*------------------------------------------------------------------------ +---------------------- routine: post execution cleanup ------------------- +------------------------------------------------------------------------*/ +static Bool DebriefEROI(flo,ped,ok) + floDefPtr flo; + peDefPtr ped; + Bool ok; +{ + xieFloExportROI *raw = (xieFloExportROI *)ped->elemRaw; + eROIDefPtr pvt = (eROIDefPtr)ped->elemPvt; + roiPtr roi; + + if(!(pvt && (roi = pvt->roi))) return(FALSE); + + if (ok && roi->refCnt > 1) { + /* + * out with the old, in with the new + */ + FreeStrips(&roi->strips); + DebriefStrips(&ped->outFlo.output[0],&roi->strips); + } + /* free roi data that's left over on our outFlo */ + FreeStrips(&ped->outFlo.output[0]); + + /* unbind ourself from the roi */ + if(roi->refCnt > 1) + --roi->refCnt; + else if(LookupIDByType(raw->roi, RT_ROI)) + FreeResourceByType(roi->ID, RT_ROI, RT_NONE); + else + DeleteROI(roi, roi->ID); + + return TRUE; +} /* end DebriefEROI */ + +/* end module eroi.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/import/Imakefile b/xie/xc/programs/Xserver/XIE/dixie/import/Imakefile new file mode 100644 index 0000000..54bf0d0 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/import/Imakefile @@ -0,0 +1,28 @@ +XCOMM $XConsortium: Imakefile,v 1.4 93/11/06 15:51:22 rws Exp $ +XCOMM build device independent import element objects +#include + +SRCS1 = iclut.c icphoto.c idraw.c idrawp.c ilut.c iphoto.c +OBJS1 = iclut.o icphoto.o idraw.o idrawp.o ilut.o iphoto.o + +#if BuildDIS +DEFINES = -DXIE_DIS +#else +SRCS2 = icroi.c iroi.c +OBJS2 = icroi.o iroi.o +#endif + + SRCS = $(SRCS1) $(SRCS2) + + OBJS = $(OBJS1) $(OBJS2) + + INCLUDES = -I../../include -I$(SERVERSRC)/include -I$(INCLUDESRC) -I$(EXTINCSRC) + LINTLIBS = ../export/llib-lexp.ln ../import/llib-limp.ln \ + ../process/llib-lproc.ln ../request/llib-lreq.ln + +SubdirLibraryRule($(OBJS)) +NormalLibraryObjectRule() +LintLibraryTarget(imp,$(SRCS)) +NormalLintTarget($(SRCS)) + +DependTarget() diff --git a/xie/xc/programs/Xserver/XIE/dixie/import/iclut.c b/xie/xc/programs/Xserver/XIE/dixie/import/iclut.c new file mode 100644 index 0000000..ae412c5 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/import/iclut.c @@ -0,0 +1,243 @@ +/* $XConsortium: iclut.c /main/5 1995/12/02 16:45:18 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module iclut.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + iclut.c -- DIXIE routines for managing the ImportClientLUT element + + Dean Verheiden -- AGE Logic, Inc. April 1993 + Ben Fahy -- AGE Logic, Inc. May 1993 + +*****************************************************************************/ + +#define _XIEC_ICLUT + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +/* + * routines referenced by other modules + */ +peDefPtr MakeICLUT(); + +/* + * routines internal to this module + */ +static Bool PrepICLUT(); + +/* + * dixie entry points + */ +static diElemVecRec iCLUTVec = { + PrepICLUT /* prepare for analysis and execution */ + }; + +/*------------------------------------------------------------------------ +--------------- routine: make an import client lut element ------------- +------------------------------------------------------------------------*/ +peDefPtr MakeICLUT(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + ELEMENT(xieFloImportClientLUT); + ELEMENT_SIZE_MATCH(xieFloImportClientLUT); + + if(!(ped = MakePEDef(1, (CARD32)stuff->elemLength<<2, 0))) + FloAllocError(flo,tag,xieElemImportClientLUT,return(NULL)); + + ped->diVec = &iCLUTVec; + ped->phototag = tag; + ped->flags.import = TRUE; + ped->flags.putData = TRUE; + raw = (xieFloImportClientLUT *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + raw->class = stuff->class; + raw->bandOrder = stuff->bandOrder; + cpswapl(stuff->length0, raw->length0); + cpswapl(stuff->length1, raw->length1); + cpswapl(stuff->length2, raw->length2); + cpswapl(stuff->levels0, raw->levels0); + cpswapl(stuff->levels1, raw->levels1); + cpswapl(stuff->levels2, raw->levels2); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloImportClientLUT)); + + return(ped); +} /* end MakeICLUT */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepICLUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloImportClientLUT *raw = (xieFloImportClientLUT *)ped->elemRaw; + inFloPtr inflo = &ped->inFloLst[IMPORT]; + int b; + + /* + * check for data-class, length, and levels errors, and stash attributes + * since this is STREAM data, we only have to record the class and band + * numbers in the inflos. + */ + if(raw->bandOrder != xieValLSFirst && raw->bandOrder != xieValMSFirst) + ValueError(flo,ped,raw->bandOrder, return(FALSE)); + + switch(raw->class) { + case xieValSingleBand : + + if(!raw->length0) + ValueError(flo,ped,0, return(FALSE)); + if(raw->levels0 < 2 || raw->levels0 > MAX_LEVELS(1)) + MatchError(flo,ped, return(FALSE)); + inflo->bands = 1; + break; +#if XIE_FULL + case xieValTripleBand : + if(!raw->length0 || !raw->length1 || !raw->length2) + ValueError(flo,ped,0, return(FALSE)); + if(raw->levels0 < 2 || raw->levels0 > MAX_LEVELS(3) || + raw->levels1 < 2 || raw->levels1 > MAX_LEVELS(3) || + raw->levels2 < 2 || raw->levels2 > MAX_LEVELS(3)) + MatchError(flo,ped, return(FALSE)); + + inflo->bands = 3; + inflo->format[1].band = 1; + inflo->format[2].band = 2; + ped->outFlo.format[1] = inflo->format[1]; + ped->outFlo.format[2] = inflo->format[2]; + ped->outFlo.format[1].levels = raw->levels1; + ped->outFlo.format[2].levels = raw->levels2; + ped->outFlo.format[1].height = raw->length1; + ped->outFlo.format[2].height = raw->length2; + break; +#endif + default : + ValueError(flo,ped,raw->class, return(FALSE)); + } + + inflo->format[0].band = 0; + ped->outFlo.format[0] = inflo->format[0]; + ped->outFlo.format[0].levels = raw->levels0; + ped->outFlo.format[0].height = raw->length0; + + for (b=0; b < inflo->bands; b++) { + formatPtr fmt = &(ped->outFlo.format[b]); + + inflo->format[b].class = STREAM; + ped->swapUnits[b] = LutPitch(fmt->levels); + + fmt->class = LUT_ARRAY; + fmt->interleaved = FALSE; + fmt->width = raw->bandOrder; /* see miclut.c, mppoint crazypixel */ + fmt->depth = 8; + fmt->stride = 8; + fmt->pitch = 8 * fmt->height; + } + + ped->outFlo.bands = inflo->bands; + + return(TRUE); +} /* end PrepICLUT */ + +/* end module iclut.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/import/icphoto.c b/xie/xc/programs/Xserver/XIE/dixie/import/icphoto.c new file mode 100644 index 0000000..ea43096 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/import/icphoto.c @@ -0,0 +1,813 @@ +/* $XConsortium: icphoto.c,v 1.4 94/04/17 20:33:34 rws Exp $ */ +/**** module icphoto.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + icphoto.c -- DIXIE routines for managing the ImportClientPhoto element + + Robert NC Shelley, Dean Verheiden -- AGE Logic, Inc. April 1993 + +*****************************************************************************/ + +#define _XIEC_ICPHOTO + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +/* + * routines referenced by other modules + */ +peDefPtr MakeICPhoto(); +Bool CopyICPhotoUnSingle(); +Bool CopyICPhotoUnTriple(); +Bool CopyICPhotoG31D(); +Bool CopyICPhotoG32D(); +Bool CopyICPhotoG42D(); +Bool CopyICPhotoJPEGBaseline(); +#ifdef BEYOND_SI +Bool CopyICPhotoJPEGLossless(); +#endif /* BEYOND_SI */ +Bool CopyICPhotoTIFF2(); +Bool CopyICPhotoTIFFPackBits(); + +Bool PrepICPhotoUnSingle(); +Bool PrepICPhotoUnTriple(); +Bool PrepICPhotoG31D(); +Bool PrepICPhotoG32D(); +Bool PrepICPhotoG42D(); +Bool PrepICPhotoJPEGBaseline(); +#ifdef BEYOND_SI +Bool PrepICPhotoJPEGLossless(); +#endif /* BEYOND_SI */ +Bool PrepICPhotoTIFF2(); +Bool PrepICPhotoTIFFPackBits(); + +/* + * routines internal to this module + */ +static Bool PrepICPhoto(); + +/* + * dixie element entry points + */ +static diElemVecRec iCPhotoVec = { + PrepICPhoto /* prepare for analysis and execution */ + }; + + +/*------------------------------------------------------------------------ +--------------- routine: make an import client photo element ------------- +------------------------------------------------------------------------*/ +peDefPtr MakeICPhoto(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + ELEMENT(xieFloImportClientPhoto); + ELEMENT_AT_LEAST_SIZE(xieFloImportClientPhoto); + + if(!(ped = MakePEDef(1, (CARD32)stuff->elemLength<<2, 0))) + FloAllocError(flo,tag,xieElemImportClientPhoto, return(NULL)) ; + + ped->diVec = &iCPhotoVec; + ped->phototag = tag; + ped->flags.import = TRUE; + ped->flags.putData = TRUE; + raw = (xieFloImportClientPhoto *)ped->elemRaw; + /* + * copy the standard client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + raw->notify = stuff->notify; + raw->class = stuff->class; + cpswapl(stuff->width0, raw->width0); + cpswapl(stuff->width1, raw->width1); + cpswapl(stuff->width2, raw->width2); + cpswapl(stuff->height0, raw->height0); + cpswapl(stuff->height1, raw->height1); + cpswapl(stuff->height2, raw->height2); + cpswapl(stuff->levels0, raw->levels0); + cpswapl(stuff->levels1, raw->levels1); + cpswapl(stuff->levels2, raw->levels2); + cpswaps(stuff->decodeTechnique, raw->decodeTechnique); + cpswaps(stuff->lenParams, raw->lenParams); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloImportClientPhoto)); + /* + * copy technique data (if any) + */ + if(!(ped->techVec = FindTechnique(xieValDecode, raw->decodeTechnique)) || + !(ped->techVec->copyfnc(flo, ped, &stuff[1], &raw[1], raw->lenParams))) + TechniqueError(flo,ped,xieValDecode,raw->decodeTechnique,raw->lenParams, + return(ped)); + + return(ped); +} /* end MakeICPhoto */ + + +Bool CopyICPhotoUnSingle(flo, ped, rparms, cparms, tsize) + floDefPtr flo; + peDefPtr ped; + xieTecDecodeUncompressedSingle *rparms, *cparms; + CARD16 tsize; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + /* Nothing to swap for this technique */ + memcpy((char *)cparms, (char *)rparms, tsize<<2); + + return(TRUE); +} + +Bool CopyICPhotoUnTriple(flo, ped, rparms, cparms, tsize) + floDefPtr flo; + peDefPtr ped; + xieTecDecodeUncompressedTriple *rparms, *cparms; + CARD16 tsize; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + /* Nothing to swap for this technique */ + memcpy((char *)cparms, (char *)rparms, tsize<<2); + + return(TRUE); +} + +Bool CopyICPhotoG31D(flo, ped, rparms, cparms, tsize) + floDefPtr flo; + peDefPtr ped; + xieTecDecodeG31D *rparms, *cparms; + CARD16 tsize; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + /* Nothing to swap for this technique */ + memcpy((char *)cparms, (char *)rparms, tsize<<2); + + return(TRUE); +} + +Bool CopyICPhotoG32D(flo, ped, rparms, cparms, tsize) + floDefPtr flo; + peDefPtr ped; + xieTecDecodeG32D *rparms, *cparms; + CARD16 tsize; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + /* Nothing to swap for this technique */ + memcpy((char *)cparms, (char *)rparms, tsize<<2); + + return(TRUE); +} + +Bool CopyICPhotoG42D(flo, ped, rparms, cparms, tsize) + floDefPtr flo; + peDefPtr ped; + xieTecDecodeG42D *rparms, *cparms; + CARD16 tsize; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + /* Nothing to swap for this technique */ + memcpy((char *)cparms, (char *)rparms, tsize<<2); + + return(TRUE); +} + +Bool CopyICPhotoJPEGBaseline(flo, ped, rparms, cparms, tsize) + floDefPtr flo; + peDefPtr ped; + xieTecDecodeJPEGBaseline *rparms, *cparms; + CARD16 tsize; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + /* Nothing to swap for this technique */ + memcpy((char *)cparms, (char *)rparms, tsize<<2); + + return(TRUE); +} + +#ifdef BEYOND_SI +Bool CopyICPhotoJPEGLossless(flo, ped, rparms, cparms, tsize) + floDefPtr flo; + peDefPtr ped; + xieTecDecodeJPEGLossless *rparms, *cparms; + CARD16 tsize; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + /* Nothing to swap for this technique */ + memcpy((char *)cparms, (char *)rparms, tsize<<2); + + return(TRUE); +} +#endif /* BEYOND_SI */ + +Bool CopyICPhotoTIFF2(flo, ped, rparms, cparms, tsize) + floDefPtr flo; + peDefPtr ped; + xieTecDecodeTIFF2 *rparms, *cparms; + CARD16 tsize; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + /* Nothing to swap for this technique */ + memcpy((char *)cparms, (char *)rparms, tsize<<2); + + return(TRUE); +} + +Bool CopyICPhotoTIFFPackBits(flo, ped, rparms, cparms, tsize) + floDefPtr flo; + peDefPtr ped; + xieTecDecodeTIFFPackBits *rparms, *cparms; + CARD16 tsize; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + /* Nothing to swap for this technique */ + memcpy((char *)cparms, (char *)rparms, tsize<<2); + + return(TRUE); +} + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepICPhoto(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + int i; + xieFloImportClientPhoto *raw = (xieFloImportClientPhoto *)ped->elemRaw; + inFloPtr inflo = &ped->inFloLst[IMPORT]; + + /* + * check for data-class, dimension, and levels errors, and stash attributes + */ + switch(raw->class) { + case xieValSingleBand : + if(!raw->width0 || !raw->height0 || !raw->levels0) + ValueError(flo,ped,0, return(FALSE)); + if(raw->levels0 > MAX_LEVELS(1)) + MatchError(flo,ped, return(FALSE)); + inflo->bands = 1; + break; + case xieValTripleBand : + if(!raw->width0 || !raw->height0 || !raw->levels0 || + !raw->width1 || !raw->height1 || !raw->levels1 || + !raw->width2 || !raw->height2 || !raw->levels2) + ValueError(flo,ped,0, return(FALSE)); + if(raw->levels0 > MAX_LEVELS(3) || + raw->levels1 > MAX_LEVELS(3) || + raw->levels2 > MAX_LEVELS(3)) + MatchError(flo,ped, return(FALSE)); + inflo->bands = 3; + inflo->format[1].band = 1; + inflo->format[1].width = raw->width1; + inflo->format[1].height = raw->height1; + inflo->format[1].levels = raw->levels1; + inflo->format[2].band = 2; + inflo->format[2].width = raw->width2; + inflo->format[2].height = raw->height2; + inflo->format[2].levels = raw->levels2; + break; + default : + ValueError(flo,ped,raw->class, return(FALSE)); + } + inflo->format[0].band = 0; + inflo->format[0].width = raw->width0; + inflo->format[0].height = raw->height0; + inflo->format[0].levels = raw->levels0; + + for(i = 0; i < inflo->bands; i++) + SetDepthFromLevels(inflo->format[i].levels, inflo->format[i].depth); + + if(!(ped->techVec->prepfnc(flo, ped, raw, &raw[1]))) + TechniqueError(flo,ped,xieValDecode,raw->decodeTechnique,raw->lenParams, + return(FALSE)); + + return(TRUE); +} /* end PrepICPhoto */ + + +/*------------------------------------------------------------------------ +----- routines: verify technique parameters against element parameters ---- +-------------- and prepare for analysis and execution ---- +------------------------------------------------------------------------*/ + +/* Prep routine for uncompressed single band data */ +Bool PrepICPhotoUnSingle(flo, ped, raw, tec) + floDefPtr flo; + peDefPtr ped; + xieFloImportClientPhoto *raw; + xieTecDecodeUncompressedSingle *tec; +{ + inFloPtr inf = &ped->inFloLst[IMPORT]; + CARD32 padmod = tec->scanlinePad * 8; + CARD32 pitch = tec->pixelStride * raw->width0 + tec->leftPad; + BOOL aligned = !(tec->pixelStride & (tec->pixelStride-1)) || + tec->pixelStride == 24; + int i; + + if(tec->fillOrder != xieValLSFirst && /* check fill-order */ + tec->fillOrder != xieValMSFirst) + return(FALSE); + if(tec->pixelOrder != xieValLSFirst && /* check pixel-order */ + tec->pixelOrder != xieValMSFirst) + return(FALSE); + if(tec->pixelStride < inf->format[0].depth) /* check pixel-stride */ + return(FALSE); + if(ALIGNMENT == xieValAlignable && !aligned || /* alignment & left-pad */ + ALIGNMENT == xieValAlignable && aligned && + (tec->leftPad % tec->pixelStride || + tec->leftPad % 8)) + return(FALSE); + if(tec->scanlinePad & (tec->scanlinePad-1) || /* check scanline-pad */ + tec->scanlinePad > 16) + return(FALSE); + if(raw->class != xieValSingleBand) + return(FALSE); + + inf->format[0].interleaved = FALSE; + inf->format[0].class = STREAM; + inf->format[0].stride = tec->pixelStride; + inf->format[0].pitch = pitch + (padmod ? Align(pitch,padmod) : 0); + + /* + * determine output attributes from input parameters + */ + ped->outFlo.bands = inf->bands; + for (i = 0; i < inf->bands; i++) { + ped->outFlo.format[i] = inf->format[i]; + ped->outFlo.format[i].interleaved = FALSE; + } + + if (UpdateFormatfromLevels(ped) == FALSE) + MatchError(flo, ped, return(FALSE)); + + return(TRUE); +} /* PrepICPhotoUnSingle */ + +/* Prep routine for uncompressed triple band data */ +Bool PrepICPhotoUnTriple(flo, ped, raw, tec) + floDefPtr flo; + peDefPtr ped; + xieFloImportClientPhoto *raw; + xieTecDecodeUncompressedTriple *tec; +{ + inFloPtr inf = &ped->inFloLst[IMPORT]; + int i; + + if(tec->fillOrder != xieValLSFirst && /* check fill-order */ + tec->fillOrder != xieValMSFirst) + return(FALSE); + if(tec->pixelOrder != xieValLSFirst && /* check pixel-order */ + tec->pixelOrder != xieValMSFirst) + return(FALSE); + if(tec->bandOrder != xieValLSFirst && /* check band-order */ + tec->bandOrder != xieValMSFirst) + return(FALSE); + if(tec->interleave != xieValBandByPixel && /* check interleave */ + tec->interleave != xieValBandByPlane) + return(FALSE); + if (tec->interleave == xieValBandByPixel && /* check inter-band dim */ + (inf->format[0].width != inf->format[1].width || + inf->format[1].width != inf->format[2].width || + inf->format[0].height != inf->format[1].height || + inf->format[1].height != inf->format[2].height)) + return(FALSE); + if(raw->class != xieValTripleBand) + return(FALSE); + if (tec->interleave == xieValBandByPlane) { + for (i = 0; i < 3; i++) { + CARD32 padmod = tec->scanlinePad[i] * 8; + CARD32 pitch = tec->pixelStride[i] * inf->format[i].width + + tec->leftPad[i]; + BOOL aligned = !(tec->pixelStride[i] & (tec->pixelStride[i] - 1)); + + if(tec->pixelStride[i] < inf->format[i].depth) /* check pixel-stride */ + return(FALSE); + if(inf->format[i].depth > MAX_DEPTH(3)) /* check pixel-depth */ + return(FALSE); + if(ALIGNMENT == xieValAlignable && !aligned || /* alignment & left-pad */ + ALIGNMENT == xieValAlignable && aligned && + (tec->leftPad[i] % tec->pixelStride[i] || + tec->leftPad[i] % 8)) + return(FALSE); + if(tec->scanlinePad[i] & (tec->scanlinePad[i] - 1) || + tec->scanlinePad[i] > 16) /*check scanline-pad*/ + return(FALSE); + inf->format[i].interleaved = FALSE; + inf->format[i].class = STREAM; + inf->format[i].stride = tec->pixelStride[i]; + inf->format[i].pitch = pitch + (padmod ? Align(pitch,padmod) : 0); + } + ped->outFlo.bands = inf->bands; + } else { /* xieValBandByPixel */ + CARD32 padmod = tec->scanlinePad[0] * 8; + CARD32 pitch = tec->pixelStride[0] * inf->format[0].width + + tec->leftPad[0]; + CARD32 tdepth = inf->format[0].depth + inf->format[1].depth + + inf->format[2].depth; + BOOL aligned = !(tec->pixelStride[0] & (tec->pixelStride[0] - 1)) || + tec->pixelStride[0] == 24; + + if(inf->format[0].depth > MAX_DEPTH(3) || /* check pixel-depth */ + inf->format[1].depth > MAX_DEPTH(3) || + inf->format[2].depth > MAX_DEPTH(3)) + return(FALSE); + if(tec->pixelStride[0] < tdepth) /* check overall pixel-stride */ + return(FALSE); + if(ALIGNMENT == xieValAlignable && !aligned || /* alignment & left-pad */ + ALIGNMENT == xieValAlignable && aligned && + (tec->leftPad[0] % tec->pixelStride[0] || + tec->leftPad[0] % 8)) + return(FALSE); + if(tec->scanlinePad[0] & (tec->scanlinePad[0] - 1) || + tec->scanlinePad[0] > 16) /*check scanline-pad*/ + return(FALSE); + + /* Now, go stomp on band zero values that should be changed */ + inf->bands = 1; + inf->format[0].interleaved = TRUE; + inf->format[0].class = STREAM; + inf->format[0].stride = tec->pixelStride[0]; + inf->format[0].pitch = pitch + (padmod ? Align(pitch,padmod) : 0); + + /* Set up 3 outflows for the one interleaved inflo */ + ped->outFlo.bands = 3; + } + + /* Copy input to output, setting differing output parameters when necessary */ + for (i = 0; i < ped->outFlo.bands; i++) { + ped->outFlo.format[i] = inf->format[i]; + ped->outFlo.format[i].interleaved = FALSE; + } + + /* Fill in other format parameters based on the number of output levels */ + if (UpdateFormatfromLevels(ped) == FALSE) + MatchError(flo, ped, return(FALSE)); + + return(TRUE); +} /* PrepICPhotoUnTriple */ + +Bool PrepICPhotoG31D(flo, ped, raw, tec) + floDefPtr flo; + peDefPtr ped; + xieFloImportClientPhoto *raw; + xieTecDecodeG31D *tec; +{ + inFloPtr inf = &ped->inFloLst[IMPORT]; + int i; + + if(tec->encodedOrder != xieValLSFirst && /* check encoding-order */ + tec->encodedOrder != xieValMSFirst) + return(FALSE); + + inf->format[0].interleaved = FALSE; + inf->format[0].class = STREAM; + + /* + * determine output attributes from input parameters + */ + ped->outFlo.bands = inf->bands; + for (i = 0; i < inf->bands; i++) { + ped->outFlo.format[i] = inf->format[i]; + ped->outFlo.format[i].interleaved = FALSE; + } + + if (UpdateFormatfromLevels(ped) == FALSE) + MatchError(flo, ped, return(FALSE)); + return(TRUE); + +} /* PrepICPhotoG31D */ + +Bool PrepICPhotoG32D(flo, ped, raw, tec) + floDefPtr flo; + peDefPtr ped; + xieFloImportClientPhoto *raw; + xieTecDecodeG32D *tec; +{ + inFloPtr inf = &ped->inFloLst[IMPORT]; + int i; + + if(tec->encodedOrder != xieValLSFirst && /* check encoding-order */ + tec->encodedOrder != xieValMSFirst) + return(FALSE); + + inf->format[0].interleaved = FALSE; + inf->format[0].class = STREAM; + + /* + * determine output attributes from input parameters + */ + ped->outFlo.bands = inf->bands; + for (i = 0; i < inf->bands; i++) { + ped->outFlo.format[i] = inf->format[i]; + ped->outFlo.format[i].interleaved = FALSE; + } + + if (UpdateFormatfromLevels(ped) == FALSE) + MatchError(flo, ped, return(FALSE)); + + return(TRUE); + +} /* PrepICPhotoG32D */ + +Bool PrepICPhotoG42D(flo, ped, raw, tec) + floDefPtr flo; + peDefPtr ped; + xieFloImportClientPhoto *raw; + xieTecDecodeG42D *tec; +{ + inFloPtr inf = &ped->inFloLst[IMPORT]; + int i; + + if(tec->encodedOrder != xieValLSFirst && /* check encoding-order */ + tec->encodedOrder != xieValMSFirst) + return(FALSE); + + inf->format[0].interleaved = FALSE; + inf->format[0].class = STREAM; + + /* + * determine output attributes from input parameters + */ + ped->outFlo.bands = inf->bands; + for (i = 0; i < inf->bands; i++) { + ped->outFlo.format[i] = inf->format[i]; + ped->outFlo.format[i].interleaved = FALSE; + } + + if (UpdateFormatfromLevels(ped) == FALSE) + MatchError(flo, ped, return(FALSE)); + + return(TRUE); + +} /* PrepICPhotoG42D */ + +Bool PrepICPhotoJPEGBaseline(flo, ped, raw, tec) + floDefPtr flo; + peDefPtr ped; + xieFloImportClientPhoto *raw; + xieTecDecodeJPEGBaseline *tec; +{ + inFloPtr inf = &ped->inFloLst[IMPORT]; + int i; + + if (raw->class == xieValSingleBand) + inf->format[0].interleaved = FALSE; + else { + if(tec->bandOrder != xieValLSFirst && /* check encoding-order */ + tec->bandOrder != xieValMSFirst) + return(FALSE); + + if(tec->interleave != xieValBandByPixel && /* check interleave */ + tec->interleave != xieValBandByPlane) + return(FALSE); + + inf->format[0].interleaved = + inf->format[1].interleaved = + inf->format[2].interleaved = + (tec->interleave == xieValBandByPixel); + inf->format[1].class = STREAM; + inf->format[2].class = STREAM; + } + + inf->format[0].class = STREAM; + + /* + * determine output attributes from input parameters + */ + ped->outFlo.bands = inf->bands; + for (i = 0; i < inf->bands; i++) { + ped->outFlo.format[i] = inf->format[i]; + ped->outFlo.format[i].interleaved = FALSE; + } + + /* + * except if TripleBand Interleaved, we lied: there's only one + * band coming in. We copy the bogus inflos first just because + * we can assume they have been set up suitably by nice general + * purpose code above. :-) + */ + if (raw->class == xieValTripleBand && tec->interleave == xieValBandByPixel) + inf->bands = 1; + + if (UpdateFormatfromLevels(ped) == FALSE) + MatchError(flo, ped, return(FALSE)); + + return(TRUE); + +} /* PrepICPhotoJPEGBaseline */ + +#ifdef BEYOND_SI +Bool PrepICPhotoJPEGLossless(flo, ped, raw, tec) + floDefPtr flo; + peDefPtr ped; + xieFloImportClientPhoto *raw; + xieTecDecodeJPEGLossless *tec; +{ + inFloPtr inf = &ped->inFloLst[IMPORT]; + int i; + + if (raw->class == xieValSingleBand) + inf->format[0].interleaved = FALSE; + else { + if(tec->bandOrder != xieValLSFirst && /* check encoding-order */ + tec->bandOrder != xieValMSFirst) + return(FALSE); + + if(tec->interleave != xieValBandByPixel && /* check interleave */ + tec->interleave != xieValBandByPlane) + return(FALSE); + + inf->format[0].interleaved = + inf->format[1].interleaved = + inf->format[2].interleaved = + (tec->interleave == xieValBandByPixel); + inf->format[1].class = STREAM; + inf->format[2].class = STREAM; + } + + inf->format[0].class = STREAM; + + /* + * determine output attributes from input parameters + */ + ped->outFlo.bands = inf->bands; + for (i = 0; i < inf->bands; i++) { + ped->outFlo.format[i] = inf->format[i]; + ped->outFlo.format[i].interleaved = FALSE; + } + + if (UpdateFormatfromLevels(ped) == FALSE) + MatchError(flo, ped, return(FALSE)); + + return(TRUE); + +} /* PrepICPhotoJPEGLossless */ +#endif /* BEYOND_SI */ + +Bool PrepICPhotoTIFF2(flo, ped, raw, tec) + floDefPtr flo; + peDefPtr ped; + xieFloImportClientPhoto *raw; + xieTecDecodeTIFF2 *tec; +{ + inFloPtr inf = &ped->inFloLst[IMPORT]; + int i; + + if(tec->encodedOrder != xieValLSFirst && /* check encoding-order */ + tec->encodedOrder != xieValMSFirst) + return(FALSE); + + inf->format[0].interleaved = FALSE; + inf->format[0].class = STREAM; + + /* + * determine output attributes from input parameters + */ + ped->outFlo.bands = inf->bands; + for (i = 0; i < inf->bands; i++) { + ped->outFlo.format[i] = inf->format[i]; + ped->outFlo.format[i].interleaved = FALSE; + } + + if (UpdateFormatfromLevels(ped) == FALSE) + MatchError(flo, ped, return(FALSE)); + + return(TRUE); + +} /* PrepICPhotoTIFF2 */ + +Bool PrepICPhotoTIFFPackBits(flo, ped, raw, tec) + floDefPtr flo; + peDefPtr ped; + xieFloImportClientPhoto *raw; + xieTecDecodeTIFFPackBits *tec; +{ + inFloPtr inf = &ped->inFloLst[IMPORT]; + int i; + + if(tec->encodedOrder != xieValLSFirst && /* check encoding-order */ + tec->encodedOrder != xieValMSFirst) + return(FALSE); + + inf->format[0].interleaved = FALSE; + inf->format[0].class = STREAM; + + /* + * determine output attributes from input parameters + */ + ped->outFlo.bands = inf->bands; + for (i = 0; i < inf->bands; i++) { + ped->outFlo.format[i] = inf->format[i]; + ped->outFlo.format[i].interleaved = FALSE; + } + + if (UpdateFormatfromLevels(ped) == FALSE) + MatchError(flo, ped, return(FALSE)); + + return(TRUE); + +} /* PrepICPhotoTIFFPackBits */ + +/* end module icphoto.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/import/icroi.c b/xie/xc/programs/Xserver/XIE/dixie/import/icroi.c new file mode 100644 index 0000000..2853f11 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/import/icroi.c @@ -0,0 +1,173 @@ +/* $XConsortium: icroi.c,v 1.4 94/04/17 20:33:34 rws Exp $ */ +/**** module icroi.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + icroi.c -- DIXIE routines for managing the ImportClientROI element + + Robert NC Shelley, Dean Verheiden -- AGE Logic, Inc. April 1993 + +*****************************************************************************/ + +#define _XIEC_ICROI + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include + +/* + * routines referenced by other modules + */ +peDefPtr MakeICROI(); + +/* + * routines internal to this module + */ +static Bool PrepICROI(); + +/* + * dixie element entry points + */ +static diElemVecRec iCROIVec = +{ + PrepICROI /* prepare for analysis and execution */ +}; + +/*------------------------------------------------------------------------ +--------------- routine: make an import client roi element ------------- +------------------------------------------------------------------------*/ +peDefPtr MakeICROI(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + ELEMENT(xieFloImportClientROI); + ELEMENT_SIZE_MATCH(xieFloImportClientROI); + + if (!(ped = MakePEDef(1, (CARD32)stuff->elemLength<<2, 0))) + FloAllocError(flo,tag,xieElemImportClientROI, return(NULL)) ; + + ped->diVec = &iCROIVec; + ped->phototag = tag; + ped->flags.import = TRUE; + ped->flags.putData = TRUE; + raw = (xieFloImportClientROI *)ped->elemRaw; + /* + * copy the standard client element parameters (swap if necessary) + */ + if (flo->reqClient->swapped) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswapl(stuff->rectangles, raw->rectangles); + } else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloImportClientROI)); + + return ped; +} + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepICROI(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + inFloPtr inflo = &ped->inFloLst[IMPORT]; + outFloPtr outflo = &ped->outFlo; + + inflo->bands = outflo->bands = 1; + inflo->format[0].class = STREAM; + outflo->format[0].class = RUN_LENGTH; + ped->swapUnits[0] = sizeof(xieTypRectangle); + + return TRUE; +} /* end PrepICROI */ + +/* end module icroi.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/import/idraw.c b/xie/xc/programs/Xserver/XIE/dixie/import/idraw.c new file mode 100644 index 0000000..9d57fa3 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/import/idraw.c @@ -0,0 +1,224 @@ +/* $XConsortium: idraw.c,v 1.4 94/04/17 20:33:35 rws Exp $ */ +/**** module idraw.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + idraw.c -- DIXIE routines for managing the ImportDrawable element + + Dean Verheiden -- AGE Logic, Inc. June 1993 + +*****************************************************************************/ + +#define _XIEC_IDRAW + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include +#include +#include +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeIDraw(); + +/* + * routines internal to this module + */ +static Bool PrepIDraw(); + +/* + * dixie entry points + */ +static diElemVecRec iDrawVec = { + PrepIDraw /* prepare for analysis and execution */ + }; + + +/*------------------------------------------------------------------------ +----------------- routine: make an ImportDrawable element ---------------- +------------------------------------------------------------------------*/ +peDefPtr MakeIDraw(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + ELEMENT(xieFloImportDrawable); + ELEMENT_SIZE_MATCH(xieFloImportDrawable); + + if(!(ped = MakePEDef(1, (CARD32)stuff->elemLength<<2, sizeof(iDrawDefRec)))) + FloAllocError(flo,tag,xieElemImportDrawable, return(NULL)); + + ped->diVec = &iDrawVec; + ped->phototag = tag; + ped->flags.import = TRUE; + raw = (xieFloImportDrawable *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + raw->notify = stuff->notify; + cpswapl(stuff->drawable, raw->drawable); + cpswaps(stuff->srcX, raw->srcX); + cpswaps(stuff->srcY, raw->srcY); + cpswaps(stuff->width, raw->width); + cpswaps(stuff->height, raw->height); + cpswapl(stuff->fill, raw->fill); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloImportDrawable)); + + return(ped); +} /* end MakeIDraw */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepIDraw(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloImportDrawable *raw = (xieFloImportDrawable *) ped->elemRaw; + iDrawDefPtr pvt = (iDrawDefPtr) ped->elemPvt; + inFloPtr inf = &ped->inFloLst[IMPORT]; + outFloPtr dst = &ped->outFlo; + formatPtr fmt = &inf->format[0]; + DrawablePtr pd; + CARD32 f, padmask; + + if(!(pd = pvt->pDraw = ((DrawablePtr) + LookupIDByClass(raw->drawable, RC_DRAWABLE)))) + DrawableError(flo,ped,raw->drawable, return(FALSE)); + + if(!(pd->type == DRAWABLE_WINDOW && ((WindowPtr)pd)->realized || + pd->type == DRAWABLE_PIXMAP)) + DrawableError(flo,ped,raw->drawable, return(FALSE)); + + if(raw->srcX < 0) { + ValueError(flo,ped,raw->srcX, return(FALSE)); + } else if (raw->srcY < 0) { + ValueError(flo,ped,raw->srcY, return(FALSE)); + } else if (raw->srcX + raw->width > pd->width) { + ValueError(flo,ped,raw->width, return(FALSE)); + } else if (raw->srcY + raw->height > pd->height) { + ValueError(flo,ped,raw->height, return(FALSE)); + } + /* find the screen format that matches this drawable and fill in the format + */ + for(f = 0; f < screenInfo.numPixmapFormats + && pd->depth != screenInfo.formats[f].depth; ++f); + if(f == screenInfo.numPixmapFormats) + DrawableError(flo,ped,raw->drawable,return(FALSE)); + padmask = screenInfo.formats[f].scanlinePad - 1; + fmt->interleaved = FALSE; + fmt->band = 0; + fmt->depth = pd->depth; + fmt->width = raw->width; + fmt->height = raw->height; + fmt->levels = 1<depth; + fmt->stride = screenInfo.formats[f].bitsPerPixel; + fmt->pitch = fmt->stride * raw->width + padmask & ~padmask; + /* + * set output attributes from input format (stride and pitch may differ) + */ + dst->bands = inf->bands = 1; + dst->format[0] = inf->format[0]; + if(!UpdateFormatfromLevels(ped)) + MatchError(flo,ped, return(FALSE)); + + return(TRUE); +} /* end PrepIDraw */ +/* end module idraw.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/import/idrawp.c b/xie/xc/programs/Xserver/XIE/dixie/import/idrawp.c new file mode 100644 index 0000000..e631007 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/import/idrawp.c @@ -0,0 +1,229 @@ +/* $XConsortium: idrawp.c,v 1.4 94/04/17 20:33:35 rws Exp $ */ +/**** module idrawp.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + idrawp.c -- DIXIE routines for managing the ImportDrawablePlane element + + Dean Verheiden -- AGE Logic, Inc. June 1993 + +*****************************************************************************/ + +#define _XIEC_IDRAWP + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include +#include +#include +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeIDrawP(); + +/* + * routines internal to this module + */ +static Bool PrepIDrawP(); + +/* + * dixie entry points + */ +static diElemVecRec iDrawPVec = { + PrepIDrawP /* prepare for analysis and execution */ + }; + + +/*------------------------------------------------------------------------ +----------------- routine: make an ImportDrawablePlane element ---------------- +------------------------------------------------------------------------*/ +peDefPtr MakeIDrawP(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + ELEMENT(xieFloImportDrawablePlane); + ELEMENT_SIZE_MATCH(xieFloImportDrawablePlane); + + if(!(ped = MakePEDef(1, (CARD32)stuff->elemLength<<2, sizeof(iDrawDefRec)))) + FloAllocError(flo,tag,xieElemImportDrawablePlane, return(NULL)); + + ped->diVec = &iDrawPVec; + ped->phototag = tag; + ped->flags.import = TRUE; + raw = (xieFloImportDrawablePlane *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + raw->notify = stuff->notify; + cpswapl(stuff->drawable, raw->drawable); + cpswaps(stuff->srcX, raw->srcX); + cpswaps(stuff->srcY, raw->srcY); + cpswaps(stuff->width, raw->width); + cpswaps(stuff->height, raw->height); + cpswapl(stuff->fill, raw->fill); + cpswapl(stuff->bitPlane, raw->bitPlane); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloImportDrawablePlane)); + + return(ped); +} /* end MakeIDrawP */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepIDrawP(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloImportDrawablePlane *raw = (xieFloImportDrawablePlane *) ped->elemRaw; + iDrawDefPtr pvt = (iDrawDefPtr) ped->elemPvt; + inFloPtr inf = &ped->inFloLst[IMPORT]; + outFloPtr dst = &ped->outFlo; + formatPtr fmt = &inf->format[0]; + DrawablePtr pd; + CARD32 f, padmask; + + if(!(pd = pvt->pDraw = ((DrawablePtr) + LookupIDByClass(raw->drawable, RC_DRAWABLE)))) + DrawableError(flo,ped,raw->drawable,return(FALSE)); + + if(!(pd->type == DRAWABLE_WINDOW && ((WindowPtr)pd)->realized || + pd->type == DRAWABLE_PIXMAP)) + DrawableError(flo,ped,raw->drawable, return(FALSE)); + + if(raw->srcX < 0) { + ValueError(flo,ped,raw->srcX, return(FALSE)); + } else if (raw->srcY < 0) { + ValueError(flo,ped,raw->srcY, return(FALSE)); + } else if (raw->srcX + raw->width > pd->width) { + ValueError(flo,ped,raw->width, return(FALSE)); + } else if (raw->srcY + raw->height > pd->height) { + ValueError(flo,ped,raw->height, return(FALSE)); + } else if(!raw->bitPlane || raw->bitPlane & (raw->bitPlane - 1) || + raw->bitPlane >= (1<depth)) + ValueError(flo,ped,raw->bitPlane, return(FALSE)); + + /* find the screen format that matches this drawable and fill in the format + */ + for(f = 0; f < screenInfo.numPixmapFormats + && pd->depth != screenInfo.formats[f].depth; ++f); + if(f == screenInfo.numPixmapFormats) + DrawableError(flo,ped,raw->drawable, return(FALSE)); + padmask = screenInfo.formats[f].scanlinePad - 1; + fmt->interleaved = FALSE; + fmt->band = 0; + fmt->depth = pd->depth; + fmt->width = raw->width; + fmt->height = raw->height; + fmt->levels = 1<depth; + fmt->stride = screenInfo.formats[f].bitsPerPixel; + fmt->pitch = fmt->stride * raw->width + padmask & ~padmask; + /* + * set output attributes from input format (stride and pitch may differ) + */ + dst->bands = inf->bands = 1; + dst->format[0] = inf->format[0]; + dst->format[0].levels = 2; + if(!UpdateFormatfromLevels(ped)) + MatchError(flo,ped, return(FALSE)); + + return(TRUE); +} /* end PrepIDrawP */ +/* end module idrawp.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/import/ilut.c b/xie/xc/programs/Xserver/XIE/dixie/import/ilut.c new file mode 100644 index 0000000..96935c9 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/import/ilut.c @@ -0,0 +1,229 @@ +/* $XConsortium: ilut.c,v 1.4 94/04/17 20:33:36 rws Exp $ */ +/**** module ilut.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + ilut.c -- DIXIE routines for managing the ImportLUT element + + Larry Hare -- AGE Logic, Inc. June 1993 + +*****************************************************************************/ + +#define _XIEC_ILUT + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeILUT(); + +/* + * routines internal to this module + */ +static Bool PrepILUT(); +static Bool DebriefILUT(); + +/* + * dixie entry points + */ +static diElemVecRec iLUTVec = { + PrepILUT, + DebriefILUT + }; + + +/*------------------------------------------------------------------------ +----------------- routine: make an import lut element --------------- +------------------------------------------------------------------------*/ +peDefPtr MakeILUT(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + ELEMENT(xieFloImportLUT); + ELEMENT_SIZE_MATCH(xieFloImportLUT); + + if(!(ped = MakePEDef(1,(CARD32)stuff->elemLength<<2,sizeof(iLUTDefRec)))) + FloAllocError(flo,tag,xieElemImportLUT, return(NULL)); + + ped->diVec = &iLUTVec; + ped->phototag = tag; + ped->flags.import = TRUE; + raw = (xieFloImportLUT *)ped->elemRaw; + + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswapl(stuff->lut, raw->lut); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloImportLUT)); + + return(ped); +} /* end MakeILUT */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepILUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloImportLUT *raw = (xieFloImportLUT *)ped->elemRaw; + iLUTDefPtr pvt = (iLUTDefPtr) ped->elemPvt; + inFloPtr inf = &ped->inFloLst[IMPORT]; + outFloPtr dst = &ped->outFlo; + formatPtr dfp, ifp; + lutPtr lut; + CARD32 b, nbands; + + /* find the LUT resource and bind it to our flo */ + if( !(lut = (lutPtr) LookupIDByType(raw->lut, RT_LUT)) ) + LUTError(flo,ped,raw->lut, return(FALSE)); + ++lut->refCnt; + pvt->lut = lut; + + if(!lut->lutCnt) + AccessError(flo,ped, return(FALSE)); + + nbands = lut->lutCnt; + if (nbands != 1 && nbands != 3) + ImplementationError(flo,ped,return(FALSE)); + + /* propagate LUT attributes to our output */ + dst->bands = inf->bands = nbands; + for(b = 0, dfp = &(dst->format[0]), ifp = &(inf->format[0]); + b < nbands; b++, dfp++, ifp++) { + dfp->band = ifp->band = b; + dfp->class = ifp->class = LUT_ARRAY; + dfp->levels = ifp->levels = lut->format[b].level; + dfp->height = ifp->height = lut->format[b].length; /* ugly hack */ + dfp->width = ifp->width = lut->format[b].bandOrder; /* ugly hack */ + dfp->interleaved = ifp->interleaved = FALSE; + /* width = 1; depth=8?; stride=8; pitch = 8*height; */ + } + + return(TRUE); +} /* end PrepILUT */ + + +/*------------------------------------------------------------------------ +---------------------- routine: post execution cleanup ------------------- +------------------------------------------------------------------------*/ +static Bool DebriefILUT(flo,ped,ok) + floDefPtr flo; + peDefPtr ped; + Bool ok; +{ + xieFloImportLUT *raw = (xieFloImportLUT *)ped->elemRaw; + iLUTDefPtr pvt = (iLUTDefPtr) ped->elemPvt; + lutPtr lut; + + if(pvt && (lut = pvt->lut)) + if(lut->refCnt > 1) + --lut->refCnt; + else if(LookupIDByType(raw->lut, RT_LUT)) + FreeResourceByType(lut->ID, RT_LUT, RT_NONE); + else + DeleteLUT(lut, lut->ID); + + return(TRUE); +} /* end DebriefILUT */ + +/* end module ilut.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/import/iphoto.c b/xie/xc/programs/Xserver/XIE/dixie/import/iphoto.c new file mode 100644 index 0000000..f0dbfb2 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/import/iphoto.c @@ -0,0 +1,280 @@ +/* $XConsortium: iphoto.c,v 1.5 94/04/17 20:33:36 rws Exp $ */ +/**** module iphoto.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + iphoto.c -- DIXIE routines for managing the ImportPhotomap element + + Robert NC Shelley -- AGE Logic, Inc. April 1993 + +*****************************************************************************/ + +#define _XIEC_IPHOTO + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeIPhoto(); +photomapPtr GetImportPhotomap(); +pointer GetImportTechnique(); + + +/* + * routines internal to this module + */ +static Bool PrepIPhoto(); +static Bool DebriefIPhoto(); + +/* + * dixie entry points + */ +static diElemVecRec iPhotoVec = { + PrepIPhoto, + DebriefIPhoto + }; + + +/*------------------------------------------------------------------------ +----------------- routine: make an import photomap element --------------- +------------------------------------------------------------------------*/ +peDefPtr MakeIPhoto(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + ELEMENT(xieFloImportPhotomap); + ELEMENT_SIZE_MATCH(xieFloImportPhotomap); + + if(!(ped = MakePEDef(1,(CARD32)stuff->elemLength<<2,sizeof(iPhotoDefRec)))) + FloAllocError(flo,tag,xieElemImportPhotomap, return(NULL)); + + ped->diVec = &iPhotoVec; + ped->phototag = tag; + ped->flags.import = TRUE; + raw = (xieFloImportPhotomap *)ped->elemRaw; + + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswapl(stuff->photomap, raw->photomap); + raw->notify = stuff->notify; + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloImportPhotomap)); + + return(ped); +} /* end MakeIPhoto */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepIPhoto(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloImportPhotomap *raw = (xieFloImportPhotomap *)ped->elemRaw; + iPhotoDefPtr pvt = (iPhotoDefPtr) ped->elemPvt; + inFloPtr inf = &ped->inFloLst[IMPORT]; + outFloPtr dst = &ped->outFlo; + photomapPtr map; + CARD32 b; + + /* find the photomap resource and bind it to our flo */ + if( !(map = (photomapPtr) LookupIDByType(raw->photomap, RT_PHOTOMAP)) ) + PhotomapError(flo,ped,raw->photomap, return(FALSE)); + ++map->refCnt; + + /* Load up a generic structure for importing photos from map and client */ + pvt->map = map; + + if(!map->bands) + AccessError(flo,ped, return(FALSE)); + + /* grab a copy of the input attributes and propagate them to our output */ + inf->bands = map->bands; + + /* copy map formats to inflo format */ + for(b = 0; b < inf->bands; b++) + inf->format[b] = map->format[b]; + + /* also copy them to the outflo format, handling interleave if necessary */ + dst->bands = (map->dataClass == xieValTripleBand)? 3 : + (map->dataClass == xieValSingleBand)? 1 : 0; + + for(b = 0; b < dst->bands; b++) { + dst->format[b] = map->format[b]; + dst->format[b].interleaved = FALSE; + } + /* NOTE: the loop is over dst->bands, not map->bands. This is because + * dst->bands can be 3 when map->bands is 1. The in ephoto.c saves all + * the formats of the inflo in the photomap, so they are available now + * when we need them. interleaved is FALSE by definition because only + * ExportPhotomap elements can *produce* interleaved data. + */ + + if (!UpdateFormatfromLevels(ped)) + ImplementationError(flo, ped, return(FALSE)); + + return(TRUE); +} /* end PrepIPhoto */ + +/*------------------------------------------------------------------------ +---------------------- routine: post execution cleanup ------------------- +------------------------------------------------------------------------*/ +static Bool DebriefIPhoto(flo,ped,ok) + floDefPtr flo; + peDefPtr ped; + Bool ok; +{ + xieFloImportPhotomap *raw = (xieFloImportPhotomap *)ped->elemRaw; + iPhotoDefPtr pvt = (iPhotoDefPtr) ped->elemPvt; + photomapPtr map; + + if(pvt && (map = (photomapPtr)pvt->map)) + if(map->refCnt > 1) + --map->refCnt; + else if(LookupIDByType(raw->photomap, RT_PHOTOMAP)) + FreeResourceByType(map->ID, RT_PHOTOMAP, RT_NONE); + else + DeletePhotomap(map, map->ID); + pvt->map = (photomapPtr)NULL; + + return(TRUE); +} /* end DebriefIPhoto */ + +/*------------------------------------------------------------------------ +------------------ routine: return import-private stuff ----------------- +------------------------------------------------------------------------*/ +photomapPtr GetImportPhotomap(ped) +peDefPtr ped; +{ + return(((iPhotoDefPtr)ped->elemPvt)->map); +} + +pointer GetImportTechnique(ped,num_ret,len_ret) + peDefPtr ped; + CARD16 *num_ret; + CARD16 *len_ret; +{ + switch(ped->elemRaw->elemType) { + case xieElemImportPhotomap: + { + photomapPtr imap; + + imap = GetImportPhotomap(ped); + *num_ret = imap->technique; + *len_ret = imap->lenParms; + return(imap->tecParms); + } + case xieElemImportClientPhoto: + { + xieFloImportClientPhoto *icp = (xieFloImportClientPhoto*)ped->elemRaw; + *num_ret = icp->decodeTechnique; + *len_ret = icp->lenParams << 2; + return((pointer)&icp[1]); + } + default: + *num_ret = 0; + *len_ret = 0; + return(NULL); + } +} /* GetImportTechnique */ + +/* end module iphoto.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/import/iroi.c b/xie/xc/programs/Xserver/XIE/dixie/import/iroi.c new file mode 100644 index 0000000..70d2a45 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/import/iroi.c @@ -0,0 +1,218 @@ +/* $XConsortium: iroi.c,v 1.4 94/04/17 20:33:37 rws Exp $ */ +/**** module iroi.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + iroi.c -- DIXIE routines for managing the ImportROI element + + Robert NC Shelley -- AGE Logic, Inc. April 1993 + +*****************************************************************************/ + +#define _XIEC_IROI + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeIROI(); + +/* + * routines internal to this module + */ +static Bool PrepIROI(); +static Bool DebriefIROI(); + +/* + * dixie entry points + */ +static diElemVecRec iROIVec = +{ + PrepIROI, /* prepare for analysis and execution */ + DebriefIROI /* debrief */ +}; + +/*------------------------------------------------------------------------ +----------------- routine: make an ImportROI element ---------------- +------------------------------------------------------------------------*/ +peDefPtr MakeIROI(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + inFloPtr inFlo; + ELEMENT(xieFloImportROI); + ELEMENT_SIZE_MATCH(xieFloImportROI); + + if(!(ped = MakePEDef(1, (CARD32)stuff->elemLength<<2, sizeof(iROIDefRec)))) + FloAllocError(flo,tag,xieElemImportROI, return(NULL)); + + ped->diVec = &iROIVec; + ped->phototag = tag; + ped->flags.import = TRUE; + raw = (xieFloImportROI *)ped->elemRaw; + /* + * copy the standard client element parameters (swap if necessary) + */ + if (flo->reqClient->swapped) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswapl(stuff->roi, raw->roi); + } else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloImportROI)); + /* + * assign phototags to inFlos + */ + inFlo = ped->inFloLst; + + return ped; +} /* end MakeIROI */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepIROI(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloImportROI *raw = (xieFloImportROI *)ped->elemRaw; + iROIDefPtr pvt = (iROIDefPtr) ped->elemPvt; + inFloPtr inf = &ped->inFloLst[IMPORT]; + outFloPtr dst = &ped->outFlo; + roiPtr roi; + + /* grab roi resource */ + if (!(roi = (roiPtr)LookupIDByType(raw->roi, RT_ROI))) + ROIError(flo,ped,raw->roi,return(FALSE)); + + /* Make sure the roi has been populated */ + if (ListEmpty(&roi->strips)) + AccessError(flo,ped, return(FALSE)); + + roi->refCnt++; + pvt->roi = roi; + + dst->bands = inf->bands = 1; + dst->format[0].class = inf->format[0].class = RUN_LENGTH; + + return TRUE; +} /* end PrepIROI */ + +/*------------------------------------------------------------------------ +---------------------- routine: post execution cleanup ------------------- +------------------------------------------------------------------------*/ +static Bool DebriefIROI(flo,ped,ok) + floDefPtr flo; + peDefPtr ped; + Bool ok; +{ + xieFloImportROI *raw = (xieFloImportROI *)ped->elemRaw; + iROIDefPtr pvt = (iROIDefPtr)ped->elemPvt; + roiPtr roi; + + if(pvt && (roi = pvt->roi)) + if(pvt->roi->refCnt > 1) + --roi->refCnt; + else if(LookupIDByType(raw->roi, RT_ROI)) + FreeResourceByType(pvt->roi->ID, RT_ROI, RT_NONE); + else + DeleteROI(roi, roi->ID); + + return TRUE; +} /* end DebriefIROI */ + +/* end module iroi.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/Imakefile b/xie/xc/programs/Xserver/XIE/dixie/process/Imakefile new file mode 100644 index 0000000..6eeb848 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/Imakefile @@ -0,0 +1,33 @@ +XCOMM $XConsortium: Imakefile,v 1.4 93/11/06 15:52:53 rws Exp $ +XCOMM build device independent processing element objects +#include + +SRCS1 = pgeom.c ppoint.c +OBJS1 = pgeom.o ppoint.o + +#if BuildDIS +DEFINES = -DXIE_DIS +#else +SRCS2 = parith.c pbandc.c pbande.c pbands.c pblend.c pcfrgb.c pcfromi.c \ + pcnst.c pcomp.c pconv.c pctoi.c pctrgb.c pdither.c phist.c \ + plogic.c pmath.c ppaste.c puncnst.c + +OBJS2 = parith.o pbandc.o pbande.o pbands.o pblend.o pcfrgb.o pcfromi.o \ + pcnst.o pcomp.o pconv.o pctoi.o pctrgb.o pdither.o phist.o \ + plogic.o pmath.o ppaste.o puncnst.o +#endif + + SRCS = $(SRCS1) $(SRCS2) + + OBJS = $(OBJS1) $(OBJS2) + + INCLUDES = -I../../include -I$(SERVERSRC)/include -I$(INCLUDESRC) -I$(EXTINCSRC) + LINTLIBS = ../export/llib-lexp.ln ../import/llib-limp.ln \ + ../process/llib-lproc.ln ../request/llib-lreq.ln + +SubdirLibraryRule($(OBJS)) +NormalLibraryObjectRule() +LintLibraryTarget(proc,$(SRCS)) +NormalLintTarget($(SRCS)) + +DependTarget() diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/parith.c b/xie/xc/programs/Xserver/XIE/dixie/process/parith.c new file mode 100644 index 0000000..596fb9c --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/parith.c @@ -0,0 +1,265 @@ +/* $XConsortium: parith.c,v 1.4 94/04/17 20:33:38 rws Exp $ */ +/**** module parith.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + parith.c -- DIXIE routines for managing the Arithmetic element + + Robert NC Shelley -- AGE Logic, Inc. April 1993 + +*****************************************************************************/ + +#define _XIEC_PARITH + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeArith(); + +/* + * routines internal to this module + */ +static Bool PrepArith(); + +/* + * dixie entry points + */ +static diElemVecRec pArithVec = { + PrepArith /* prepare for analysis and execution */ + }; + + +/*------------------------------------------------------------------------ +----------------------- routine: make a arithmetic element -------------------- +------------------------------------------------------------------------*/ +peDefPtr MakeArith(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + int inputs; + peDefPtr ped; + inFloPtr inFlo; + pArithDefPtr pvt; + ELEMENT(xieFloArithmetic); + ELEMENT_SIZE_MATCH(xieFloArithmetic); + ELEMENT_NEEDS_1_INPUT(src1); + inputs = 1 + (stuff->src2 ? 1 : 0) + (stuff->domainPhototag ? 1 :0); + + if(!(ped = MakePEDef(inputs, (CARD32)stuff->elemLength<<2, + sizeof(pArithDefRec)))) + FloAllocError(flo, tag, xieElemArithmetic, return(NULL)); + + ped->diVec = &pArithVec; + ped->phototag = tag; + ped->flags.process = TRUE; + raw = (xieFloArithmetic *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src1, raw->src1); + cpswaps(stuff->src2, raw->src2); + cpswapl(stuff->domainOffsetX, raw->domainOffsetX); + cpswapl(stuff->domainOffsetY, raw->domainOffsetY); + cpswaps(stuff->domainPhototag,raw->domainPhototag); + raw->operator = stuff->operator; + raw->bandMask = stuff->bandMask; + cpswapl(stuff->constant0, raw->constant0); + cpswapl(stuff->constant1, raw->constant1); + cpswapl(stuff->constant2, raw->constant2); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloArithmetic)); + + if(!raw->src2) { + /* + * convert constants + */ + pvt = (pArithDefPtr)ped->elemPvt; + pvt->constant[0] = ConvertFromIEEE(raw->constant0); + pvt->constant[1] = ConvertFromIEEE(raw->constant1); + pvt->constant[2] = ConvertFromIEEE(raw->constant2); + } + /* + * assign phototags to inFlos + */ + inFlo = ped->inFloLst; + inFlo[SRCt1].srcTag = raw->src1; + if(raw->src2) inFlo[SRCt2].srcTag = raw->src2; + if(raw->domainPhototag) inFlo[ped->inCnt-1].srcTag = raw->domainPhototag; + + return(ped); +} /* end MakeArith */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepArith(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloArithmetic *raw = (xieFloArithmetic *)ped->elemRaw; + inFloPtr ind, in2, in1 = &ped->inFloLst[SRCt1]; + outFloPtr dom, sr2, sr1 = &in1->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + CARD8 bmask = raw->bandMask; + int b; + + /* make sure input is not bitonal */ + for (b = 0; b < sr1->bands; b++) + if (IsntCanonic(sr1->format[b].class) || + ((bmask & (1<format[b].class == BIT_PIXEL)) + MatchError(flo,ped, return(FALSE)); + + /* check out our second source */ + if(raw->src2) { + in2 = &ped->inFloLst[SRCt2]; + sr2 = &in2->srcDef->outFlo; + if(sr1->bands != sr2->bands) + MatchError(flo,ped, return(FALSE)); + for (b = 0; b < sr1->bands; b++) { + if ((bmask & (1<format[b].class != sr2->format[b].class || + IsConstrained(sr1->format[b].class) && + sr1->format[b].levels != sr2->format[b].levels) + MatchError(flo,ped, return(FALSE)); + } + in2->bands = sr2->bands; + } else + sr2 = NULL; + + /* check out our process domain */ + if(raw->domainPhototag) { + ind = &ped->inFloLst[ped->inCnt-1]; + dom = &ind->srcDef->outFlo; + if(IsntDomain(dom->format[0].class) || + (ind->bands = dom->bands) != 1) + DomainError(flo,ped,raw->domainPhototag, return(FALSE)); + ind->format[0] = dom->format[0]; + } else + dom = NULL; + + /* grab a copy of the input attributes and propagate them to our output */ + dst->bands = in1->bands = sr1->bands; + for(b = 0; b < dst->bands; b++) { + dst->format[b] = in1->format[b] = sr1->format[b]; + if(sr2) + in2->format[b] = sr2->format[b]; + } + + /* check out our operator */ + switch(raw->operator) { + case xieValAdd: + case xieValMax: + case xieValMin: + case xieValSub: + case xieValSubRev: + break; + case xieValDiv: + case xieValDivRev: + case xieValGamma: + case xieValMul: + if(raw->src2) + SourceError(flo,ped, return(FALSE)); + break; + default: OperatorError(flo,ped,raw->operator, return(FALSE)); + } + return( TRUE ); +} /* end PrepArith */ + +/* end module parith.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/pbandc.c b/xie/xc/programs/Xserver/XIE/dixie/process/pbandc.c new file mode 100644 index 0000000..f30bc97 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/pbandc.c @@ -0,0 +1,212 @@ +/* $XConsortium: pbandc.c,v 1.4 94/04/17 20:33:39 rws Exp $ */ +/**** module pbandc.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + pbandc.c -- DIXIE routines for managing the band combine element + + Dean Verheiden -- AGE Logic, Inc. July 1993 + +*****************************************************************************/ + +#define _XIEC_PBANDC + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeBandCom(); + +/* + * routines internal to this module + */ +static Bool PrepBandCom(); + +/* + * dixie entry points + */ +static diElemVecRec pBandComVec = { + PrepBandCom /* prepare for analysis and execution */ + }; + + +/*------------------------------------------------------------------------ +----------------------- routine: make a blend element -------------------- +------------------------------------------------------------------------*/ +peDefPtr MakeBandCom(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + inFloPtr inFlo; + ELEMENT(xieFloBandCombine); + ELEMENT_SIZE_MATCH(xieFloBandCombine); + ELEMENT_NEEDS_3_INPUTS(src1,src2,src3); + + if(!(ped = MakePEDef(3, (CARD32)stuff->elemLength<<2, 0))) + FloAllocError(flo, tag, xieElemBandCombine, return(NULL)); + + ped->diVec = &pBandComVec; + ped->phototag = tag; + ped->flags.process = TRUE; + raw = (xieFloBandCombine *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src1, raw->src1); + cpswaps(stuff->src2, raw->src2); + cpswaps(stuff->src3, raw->src3); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloBandCombine)); + + /* assign phototags to inFlos + */ + inFlo = ped->inFloLst; + inFlo[SRCt1].srcTag = raw->src1; + inFlo[SRCt2].srcTag = raw->src2; + inFlo[SRCt3].srcTag = raw->src3; + + return(ped); +} /* end MakeBandCom */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepBandCom(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + inFloPtr in1 = &ped->inFloLst[SRCt1]; + inFloPtr in2 = &ped->inFloLst[SRCt2]; + inFloPtr in3 = &ped->inFloLst[SRCt3]; + inFloPtr inf = in1; + outFloPtr sr1 = &in1->srcDef->outFlo; + outFloPtr sr2 = &in2->srcDef->outFlo; + outFloPtr sr3 = &in3->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + int b; + + /* All inputs must be single band */ + if(sr1->bands != 1 || sr2->bands != 1 || sr3->bands != 1) + MatchError(flo,ped, return(FALSE)); + + /* All sources must be either constrained or unconstrained */ + if(IsConstrained(sr1->format[0].class)) { + if(IsntConstrained(sr2->format[0].class) || + IsntConstrained(sr3->format[0].class)) + MatchError(flo,ped, return(FALSE)); + } else { + if(sr1->format[0].class != UNCONSTRAINED || + sr2->format[0].class != UNCONSTRAINED || + sr3->format[0].class != UNCONSTRAINED) + MatchError(flo,ped, return(FALSE)); + } + /* grab a copy of the input attributes and propagate them to our output */ + in1->bands = in2->bands = in3->bands = 1; + dst->bands = xieValMaxBands; + for(b = 0; b < xieValMaxBands; ++inf, ++b) { + dst->format[b] = inf->format[0] = inf->srcDef->outFlo.format[0]; + dst->format[b].band = b; + if(IsConstrained(dst->format[b].class) && + dst->format[b].depth > MAX_DEPTH(xieValMaxBands)) + MatchError(flo,ped, return(FALSE)); + } + return( TRUE ); +} /* end PrepBandCom */ + +/* end module pbandc.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/pbande.c b/xie/xc/programs/Xserver/XIE/dixie/process/pbande.c new file mode 100644 index 0000000..a1abbf7 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/pbande.c @@ -0,0 +1,211 @@ +/* $XConsortium: pbande.c,v 1.4 94/04/17 20:33:39 rws Exp $ */ +/**** module pbande.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + pbande.c -- DIXIE routines for managing the band combine element + + Dean Verheiden -- AGE Logic, Inc. July 1993 + +*****************************************************************************/ + +#define _XIEC_PBANDE + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeBandExt(); + +/* + * routines internal to this module + */ +static Bool PrepBandExt(); + +/* + * dixie entry points + */ +static diElemVecRec pBandExtVec = { + PrepBandExt /* prepare for analysis and execution */ + }; + + +/*------------------------------------------------------------------------ +----------------------- routine: make a blend element -------------------- +------------------------------------------------------------------------*/ +peDefPtr MakeBandExt(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + double *coef; + peDefPtr ped; + inFloPtr inFlo; + pBandExtDefPtr pvt; + ELEMENT(xieFloBandExtract); + ELEMENT_SIZE_MATCH(xieFloBandExtract); + ELEMENT_NEEDS_1_INPUT(src); + + if(!(ped = MakePEDef(1,(CARD32)stuff->elemLength<<2,sizeof(pBandExtDefRec)))) + FloAllocError(flo, tag, xieElemBandExtract, return(NULL)); + + ped->diVec = &pBandExtVec; + ped->phototag = tag; + ped->flags.process = TRUE; + raw = (xieFloBandExtract *)ped->elemRaw; + pvt = (pBandExtDefPtr)ped->elemPvt; + coef = pvt->coef; + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + cpswapl(stuff->levels, raw->levels); + pvt->bias = ConvertFromIEEE(lswapl(stuff->bias)); + coef[0] = ConvertFromIEEE(lswapl(stuff->constant0)); + coef[1] = ConvertFromIEEE(lswapl(stuff->constant1)); + coef[2] = ConvertFromIEEE(lswapl(stuff->constant2)); + } else { + memcpy((char *)raw, (char *)stuff, sizeof(xieFloBandExtract)); + pvt->bias = ConvertFromIEEE(stuff->bias); + coef[0] = ConvertFromIEEE(stuff->constant0); + coef[1] = ConvertFromIEEE(stuff->constant1); + coef[2] = ConvertFromIEEE(stuff->constant2); + } + /* assign phototags to inFlos + */ + inFlo = ped->inFloLst; + inFlo[SRCtag].srcTag = raw->src; + + return(ped); +} /* end MakeBandExt */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepBandExt(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloBandExtract *raw = (xieFloBandExtract *)ped->elemRaw; + inFloPtr inf = &ped->inFloLst[SRCtag]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + + /* verify input attribute compatibility */ + if(src->bands != 3 || + IsntCanonic(src->format[0].class) || + src->format[0].width != src->format[1].width || + src->format[1].width != src->format[2].width || + src->format[0].height != src->format[1].height || + src->format[1].height != src->format[2].height) + MatchError(flo,ped, return(FALSE)); + + inf->bands = 3; + dst->bands = 1; + inf->format[0] = src->format[0]; + inf->format[1] = src->format[1]; + inf->format[2] = src->format[2]; + dst->format[0] = src->format[0]; + if(IsConstrained(src->format[0].class)) { + dst->format[0].levels = raw->levels; + if(!UpdateFormatfromLevels(ped)) + MatchError(flo,ped, return(FALSE)); + } + return TRUE; +} /* end PrepBandExt */ + +/* end module pbande.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/pbands.c b/xie/xc/programs/Xserver/XIE/dixie/process/pbands.c new file mode 100644 index 0000000..11b3d58 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/pbands.c @@ -0,0 +1,191 @@ +/* $XConsortium: pbands.c,v 1.3 94/04/17 20:33:40 rws Exp $ */ +/**** module pbands.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + pbands.c -- DIXIE routines for managing the band select element + + Robert NC Shelley -- AGE Logic, Inc. September 1993 + +*****************************************************************************/ + +#define _XIEC_PBANDS + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeBandSel(); + +/* + * routines internal to this module + */ +static Bool PrepBandSel(); + +/* + * dixie entry points + */ +static diElemVecRec pBandSelVec = { + PrepBandSel /* prepare for analysis and execution */ + }; + + +/*------------------------------------------------------------------------ +----------------------- routine: make a blend element -------------------- +------------------------------------------------------------------------*/ +peDefPtr MakeBandSel(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + inFloPtr inFlo; + ELEMENT(xieFloBandSelect); + ELEMENT_SIZE_MATCH(xieFloBandSelect); + ELEMENT_NEEDS_1_INPUT(src); + + if(!(ped = MakePEDef(1, (CARD32)stuff->elemLength<<2, 0))) + FloAllocError(flo, tag, xieElemBandSelect, return(NULL)); + + ped->diVec = &pBandSelVec; + ped->phototag = tag; + ped->flags.process = TRUE; + raw = (xieFloBandSelect *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + raw->bandNumber = stuff->bandNumber; + } else { + memcpy((char *)raw, (char *)stuff, sizeof(xieFloBandSelect)); + } + /* assign phototags to inFlos + */ + inFlo = ped->inFloLst; + inFlo[SRCtag].srcTag = raw->src; + + return(ped); +} /* end MakeBandSel */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepBandSel(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloBandSelect *raw = (xieFloBandSelect *)ped->elemRaw; + inFloPtr inf = &ped->inFloLst[SRCtag]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + + if(src->bands != 3 || IsntCanonic(src->format[0].class)) + MatchError(flo,ped, return(FALSE)); + if(raw->bandNumber >= xieValMaxBands) + ValueError(flo,ped,(CARD32)raw->bandNumber, return(FALSE)); + + inf->bands = 3; + dst->bands = 1; + inf->format[0] = src->format[0]; + inf->format[1] = src->format[1]; + inf->format[2] = src->format[2]; + dst->format[0] = src->format[raw->bandNumber]; + dst->format[0].band = 0; + + return( TRUE ); +} /* end PrepBandSel */ + +/* end module pbands.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/pblend.c b/xie/xc/programs/Xserver/XIE/dixie/process/pblend.c new file mode 100644 index 0000000..21eef41 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/pblend.c @@ -0,0 +1,275 @@ +/* $XConsortium: pblend.c,v 1.4 94/04/17 20:33:40 rws Exp $ */ +/**** module pblend.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + pblend.c -- DIXIE routines for managing the Blend element + + Dean Verheiden -- AGE Logic, Inc. June 1993 + +*****************************************************************************/ + +#define _XIEC_PBLEND + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeBlend(); + +/* + * routines internal to this module + */ +static Bool PrepBlend(); + +/* + * dixie entry points + */ +static diElemVecRec pBlendVec = { + PrepBlend /* prepare for analysis and execution */ + }; + + +/*------------------------------------------------------------------------ +----------------------- routine: make a blend element -------------------- +------------------------------------------------------------------------*/ +peDefPtr MakeBlend(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + int inputs, index; + peDefPtr ped; + inFloPtr inFlo; + pBlendDefPtr pvt; + ELEMENT(xieFloBlend); + ELEMENT_SIZE_MATCH(xieFloBlend); + ELEMENT_NEEDS_1_INPUT(src1); /* Other input either src2 or constant */ + inputs = 1 + (stuff->src2 ? 1 : 0) + + (stuff->alpha ? 1 : 0) + + (stuff->domainPhototag ? 1 : 0); + + if(!(ped = MakePEDef(inputs, (CARD32)stuff->elemLength<<2, + sizeof(pBlendDefRec)))) + FloAllocError(flo, tag, xieElemBlend, return(NULL)); + + ped->diVec = &pBlendVec; + ped->phototag = tag; + ped->flags.process = TRUE; + raw = (xieFloBlend *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src1, raw->src1); + cpswaps(stuff->src2, raw->src2); + cpswaps(stuff->alpha, raw->alpha); + cpswapl(stuff->domainOffsetX, raw->domainOffsetX); + cpswapl(stuff->domainOffsetY, raw->domainOffsetY); + cpswaps(stuff->domainPhototag,raw->domainPhototag); + raw->bandMask = stuff->bandMask; + cpswapl(stuff->constant0, raw->constant0); + cpswapl(stuff->constant1, raw->constant1); + cpswapl(stuff->constant2, raw->constant2); + cpswapl(stuff->alphaConst, raw->alphaConst); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloBlend)); + + /* + * convert constants + */ + pvt = (pBlendDefPtr)ped->elemPvt; + if(!raw->src2) { + pvt->constant[0] = ConvertFromIEEE(raw->constant0); + pvt->constant[1] = ConvertFromIEEE(raw->constant1); + pvt->constant[2] = ConvertFromIEEE(raw->constant2); + index = SRCt1; + } else + index = SRCt2; + + pvt->alphaConst = ConvertFromIEEE(raw->alphaConst); + pvt->aindex = (raw->alpha) ? ++index : 0; + pvt->dindex = (raw->domainPhototag) ? ++index : 0; + + /* + * assign phototags to inFlos + */ + inFlo = ped->inFloLst; + inFlo[SRCt1].srcTag = raw->src1; + if(raw->src2) inFlo[SRCt2].srcTag = raw->src2; + if(raw->alpha) inFlo[pvt->aindex].srcTag = raw->alpha; + if(raw->domainPhototag) inFlo[pvt->dindex].srcTag = raw->domainPhototag; + + return(ped); +} /* end MakeBlend */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepBlend(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloBlend *raw = (xieFloBlend *)ped->elemRaw; + pBlendDefPtr pvt = (pBlendDefPtr)ped->elemPvt; + inFloPtr ind, ina, in2, in1 = &ped->inFloLst[SRCt1]; + outFloPtr dom, sra, sr2, sr1 = &in1->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + int aindex = pvt->aindex, dindex = pvt->dindex, b; + CARD8 bmask = raw->bandMask; + + if ( raw->alpha && pvt->alphaConst <= 0.0 || + !raw->alpha && (pvt->alphaConst < 0.0 || pvt->alphaConst > 1.0)) + ValueError(flo, ped, raw->alphaConst, return(FALSE)); + + for (b = 0; b < sr1->bands; b++) + if (IsntCanonic(sr1->format[b].class) || + ((bmask & (1<format[b].class == BIT_PIXEL)) + MatchError(flo,ped,return(FALSE)); + + /* check out our second source */ + if(raw->src2) { + in2 = &ped->inFloLst[SRCt2]; + sr2 = &in2->srcDef->outFlo; + if(sr1->bands != sr2->bands) + MatchError(flo,ped, return(FALSE)); + in2->bands = sr2->bands; + for (b = 0; b < sr1->bands; b++) { + if ((bmask & (1<format[b].class != sr2->format[b].class || + IsConstrained(sr1->format[b].class) && + sr1->format[b].levels != sr2->format[b].levels) + MatchError(flo,ped, return(FALSE)); + } + } else + sr2 = NULL; + + + /* check out our alpha plane */ + if(aindex) { + ina = &ped->inFloLst[aindex]; + sra = &ina->srcDef->outFlo; + ina->bands = sra->bands; + for (b = 0; b < sra->bands; b++) { + if (IsCanonic(sra->format[b].class)) + ina->format[b] = sra->format[b]; + else + MatchError(flo,ped, return(FALSE)); + } + } + + /* check out our process domain */ + if(dindex) { + ind = &ped->inFloLst[dindex]; + dom = &ind->srcDef->outFlo; + if((ind->bands = dom->bands) != 1 || IsntDomain(dom->format[0].class)) + DomainError(flo,ped,raw->domainPhototag, return(FALSE)); + ind->format[0] = dom->format[0]; + } + + /* grab a copy of the input attributes and propagate them to our output */ + dst->bands = in1->bands = sr1->bands; + for(b = 0; b < dst->bands; b++) { + dst->format[b] = in1->format[b] = sr1->format[b]; + if(sr2) + in2->format[b] = sr2->format[b]; + } + + return( TRUE ); +} /* end PrepBlend */ + +/* end module pblend.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/pcfrgb.c b/xie/xc/programs/Xserver/XIE/dixie/process/pcfrgb.c new file mode 100644 index 0000000..a0f26f8 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/pcfrgb.c @@ -0,0 +1,425 @@ +/* $XConsortium: pcfrgb.c,v 1.4 94/04/17 20:33:41 rws Exp $ */ +/**** module pcfrgb.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + pcfrgb.c -- DIXIE routines for managing the ConvertFromRGB element + + Dean Verheiden -- AGE Logic, Inc. August 1993 + +*****************************************************************************/ + +#define _XIEC_PCFRGB + +/* + * Include files + */ +#include + + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include + +/* + * routines referenced by other modules + */ +peDefPtr MakeConvertFromRGB(); +Bool CopyPConvertFromRGBCIE(); +Bool CopyPConvertFromRGBYCC(); +Bool CopyPConvertFromRGBYCbCr(); +Bool PrepPConvertFromRGBCIE(); +Bool PrepPConvertFromRGBYCC(); +Bool PrepPConvertFromRGBYCbCr(); + +/* + * white adjust techniques, utilities, defined in ConvertToRGB + */ +extern Bool CopyPWhiteAdjustNone(); +extern Bool CopyPWhiteAdjustCIELabShift(); +extern Bool PrepPWhiteAdjustNone(); +extern Bool PrepPWhiteAdjustCIELabShift(); + +extern void copy_floats(); +extern void swap_floats(); + + +/* + * routines internal to this module + */ +static Bool PrepPConvertFromRGB(); + +/* + * dixie element entry points + */ +static diElemVecRec pConvertFromRGBVec = { + PrepPConvertFromRGB /* prepare for analysis and execution */ + }; + +/*------------------------------------------------------------------------ +------------------ routine: make a ConvertFromRBG element ---------------- +------------------------------------------------------------------------*/ +peDefPtr MakeConvertFromRGB(flo,tag,pe) +floDefPtr flo; +xieTypPhototag tag; +xieFlo *pe; +{ + peDefPtr ped; + ELEMENT(xieFloConvertFromRGB); + ELEMENT_AT_LEAST_SIZE(xieFloConvertFromRGB); + ELEMENT_NEEDS_1_INPUT(src); + + if(!(ped = MakePEDef(1, (CARD32)stuff->elemLength<<2, 0))) + FloAllocError(flo,tag,xieElemConvertFromRGB, return(NULL)) ; + + ped->diVec = &pConvertFromRGBVec; + ped->phototag = tag; + ped->flags.process = TRUE; + raw = (xieFloConvertFromRGB *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + cpswaps(stuff->convert, raw->convert); + cpswaps(stuff->lenParams, raw->lenParams); + } else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloConvertFromRGB)); + /* + * copy technique data (if any) + */ + if(!(ped->techVec = FindTechnique(xieValConvertFromRGB, raw->convert)) || + !(ped->techVec->copyfnc(flo, ped, &stuff[1], &raw[1], raw->lenParams))) + TechniqueError(flo,ped,xieValConvertFromRGB,raw->convert,raw->lenParams, + return(ped)); + + /* + * assign phototag to inFlo + */ + ped->inFloLst[SRCtag].srcTag = raw->src; + + + return(ped); +} /* end MakePConvertFromRGB */ + +/*------------------------------------------------------------------------ +------ routine: copy routine for CIELab and CIEXYZ techniques ----------- +------------------------------------------------------------------------*/ +Bool CopyPConvertFromRGBCIE(flo, ped, sparms, rparms, tsize) +floDefPtr flo; +peDefPtr ped; +xieTecRGBToCIELab *sparms, *rparms; /* same as xieTecRGBToCIEXYZ */ +CARD16 tsize; +{ + pTecRGBToCIEDefPtr pvt; + + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + if (!(ped->techPvt = (pointer )XieMalloc(sizeof(pTecRGBToCIEDefRec)))) + FloAllocError(flo, ped->phototag,xieElemConvertFromRGB, return(TRUE)); + + pvt = (pTecRGBToCIEDefPtr)ped->techPvt; + + if( flo->reqClient->swapped ) { + swap_floats(&pvt->matrix[0], &sparms->matrix00, 9); + cpswaps(sparms->whiteAdjusted, pvt->whiteAdjusted); + cpswaps(sparms->lenParams, pvt->lenWhiteParams); + } else { + copy_floats(&pvt->matrix[0], &sparms->matrix00, 9); + pvt->whiteAdjusted = sparms->whiteAdjusted; + pvt->lenWhiteParams = sparms->lenParams; + } + + if(!(pvt->whiteTec = FindTechnique(xieValWhiteAdjust, pvt->whiteAdjusted)) || + !(pvt->whiteTec->copyfnc(flo, ped, &sparms[1], pvt->whitePoint, + pvt->whiteTec, pvt->lenWhiteParams, + pvt->whiteAdjusted == xieValDefault))) + TechniqueError(flo,ped,xieValWhiteAdjust,pvt->whiteAdjusted, + pvt->lenWhiteParams, return(TRUE)); + + return (TRUE); +} + +/*------------------------------------------------------------------------ +---------- routine: copy routine for YCbCr and YCC techniques ------------ +------------------------------------------------------------------------*/ +Bool CopyPConvertFromRGBYCbCr(flo, ped, sparms, rparms, tsize) +floDefPtr flo; +peDefPtr ped; +xieTecRGBToYCbCr *sparms, *rparms; +CARD16 tsize; +{ + pTecRGBToYCbCrDefPtr pvt; + + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + if (!(ped->techPvt = (pointer )XieMalloc(sizeof(pTecRGBToYCbCrDefRec)))) + FloAllocError(flo, ped->phototag,xieElemConvertFromRGB, return(TRUE)); + + pvt = (pTecRGBToYCbCrDefPtr)ped->techPvt; + + if( flo->reqClient->swapped ) { + cpswapl(sparms->levels0, pvt->levels0); + cpswapl(sparms->levels1, pvt->levels1); + cpswapl(sparms->levels2, pvt->levels2); + swap_floats(&pvt->red, &sparms->lumaRed, 3); + swap_floats(&pvt->bias0, &sparms->bias0, 3); + } else { + pvt->levels0 = sparms->levels0; + pvt->levels1 = sparms->levels1; + pvt->levels2 = sparms->levels2; + copy_floats(&pvt->red, &sparms->lumaRed, 3); + copy_floats(&pvt->bias0, &sparms->bias0, 3); + } + + return (TRUE); +} + +Bool CopyPConvertFromRGBYCC(flo, ped, sparms, rparms, tsize) +floDefPtr flo; +peDefPtr ped; +xieTecRGBToYCC *sparms, *rparms; +CARD16 tsize; +{ + pTecRGBToYCCDefPtr pvt; + + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + if (!(ped->techPvt = (pointer )XieMalloc(sizeof(pTecRGBToYCCDefRec)))) + FloAllocError(flo, ped->phototag,xieElemConvertFromRGB, return(TRUE)); + + pvt = (pTecRGBToYCCDefPtr)ped->techPvt; + + if( flo->reqClient->swapped ) { + cpswapl(sparms->levels0, pvt->levels0); + cpswapl(sparms->levels1, pvt->levels1); + cpswapl(sparms->levels2, pvt->levels2); + swap_floats(&pvt->red, &sparms->lumaRed, 3); + pvt->scale = ConvertFromIEEE(lswapl(sparms->scale)); + } else { + pvt->levels0 = sparms->levels0; + pvt->levels1 = sparms->levels1; + pvt->levels2 = sparms->levels2; + copy_floats(&pvt->red, &sparms->lumaRed, 3); + pvt->scale = ConvertFromIEEE(sparms->scale); + } + + return (TRUE); +} + +/*------------------------------------------------------------------------ +-- routine: prep routine for RGB to CIElab and CIEXYZ techniques --------- +------------------------------------------------------------------------*/ + +Bool PrepPConvertFromRGBCIE(flo, ped, raw, tec) +floDefPtr flo; +peDefPtr ped; +xieFloConvertFromRGB *raw; +xieTecRGBToCIELab *tec; /* same as xieTecRGBToCIEXYZ */ +{ + inFloPtr inf = &ped->inFloLst[SRCtag]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + pTecRGBToCIEDefPtr pvt = (pTecRGBToCIEDefPtr)ped->techPvt; + int b; + + /* grab a copy of the src attributes and propagate them to our input */ + dst->bands = inf->bands = src->bands; + for(b = 0; b < src->bands; b++) { + dst->format[b] = inf->format[b] = src->format[b]; + /* Now, fix up everthing in the destination that will change */ + /* For this element, src may have been CONSTRAINED */ + dst->format[b].class = UNCONSTRAINED; + dst->format[b].depth = sz_RealPixel; + dst->format[b].levels = 0; /* Unconstrained */ + dst->format[b].stride = sz_RealPixel; + dst->format[b].pitch = sz_RealPixel * dst->format[b].width; + } + + return(pvt->whiteTec->prepfnc(flo,ped,pvt->whitePoint)); +} + +/*------------------------------------------------------------------------ +-- routine: prep routine for RGB to YCbCr and YCC techniques ------------- +------------------------------------------------------------------------*/ +Bool PrepPConvertFromRGBYCbCr(flo, ped, raw, tec) +floDefPtr flo; +peDefPtr ped; +xieFloConvertFromRGB *raw; +xieTecRGBToYCbCr *tec; +{ + inFloPtr inf = &ped->inFloLst[SRCtag]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + pTecRGBToYCbCrDefPtr pvt = (pTecRGBToYCbCrDefPtr)ped->techPvt; + CARD32 *levels = &(pvt->levels0); + int b; + + /* grab a copy of the src attributes and propagate them to our input */ + dst->bands = inf->bands = src->bands; + for(b = 0; b < src->bands; b++) { + dst->format[b] = inf->format[b] = src->format[b]; + if (IsConstrained(dst->format[b].class)) + dst->format[b].levels = *(levels+b); + } + + if (IsConstrained(dst->format[0].class)) { + if (UpdateFormatfromLevels(ped) == FALSE) + MatchError(flo,ped, return(FALSE)); + } /* else the structure copy was sufficient */ + + return(TRUE); +} + +Bool PrepPConvertFromRGBYCC(flo, ped, raw, tec) +floDefPtr flo; +peDefPtr ped; +xieFloConvertFromRGB *raw; +xieTecRGBToYCC *tec; +{ + inFloPtr inf = &ped->inFloLst[SRCtag]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + pTecRGBToYCCDefPtr pvt = (pTecRGBToYCCDefPtr)ped->techPvt; + CARD32 *levels = &(pvt->levels0); + int b; + + /* grab a copy of the src attributes and propagate them to our input */ + dst->bands = inf->bands = src->bands; + for(b = 0; b < src->bands; b++) { + dst->format[b] = inf->format[b] = src->format[b]; + if (IsConstrained(dst->format[b].class)) + dst->format[b].levels = *(levels+b); + } + + if (IsConstrained(dst->format[0].class)) { + if (UpdateFormatfromLevels(ped) == FALSE) + MatchError(flo,ped, return(FALSE)); + } /* else the structure copy was sufficient */ + + if (pvt->scale < .001) { /* should be about 1.35 or 1.4 */ + ValueError(flo, ped, tec->scale, return(FALSE)); + } + + return(TRUE); +} + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ + +static Bool PrepPConvertFromRGB(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + inFloPtr inf = &ped->inFloLst[SRCtag]; + outFloPtr src = &inf->srcDef->outFlo; + xieFloConvertFromRGB *raw = (xieFloConvertFromRGB *)ped->elemRaw; + + /* Input must be triple band and dimensions must match */ + if (IsntCanonic(src->format[0].class) || + src->bands != 3 || + src->format[0].width != src->format[1].width || + src->format[1].width != src->format[2].width || + src->format[0].height != src->format[1].height || + src->format[1].height != src->format[2].height) + MatchError(flo,ped, return(FALSE)); + + /* + ** Technique Prep routine will complete the normal propagation of src + ** attributes, and setup of destination attributes. + */ + + if (!(ped->techVec->prepfnc(flo, ped, raw, &raw[1]))) + TechniqueError(flo,ped,xieValConvertFromRGB,raw->convert, + raw->lenParams, return(FALSE)); + + return (TRUE); +} + +/* end module pcfrgb.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/pcfromi.c b/xie/xc/programs/Xserver/XIE/dixie/process/pcfromi.c new file mode 100644 index 0000000..683aa5e --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/pcfromi.c @@ -0,0 +1,225 @@ +/* $XConsortium: pcfromi.c,v 1.4 94/04/17 20:33:42 rws Exp $ */ +/**** module pcfromi.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + pcfromi.c -- DIXIE routines for managing the ConvertFromIndex element + + Dean Verheiden -- AGE Logic, Inc. June 1993 + +*****************************************************************************/ + +#define _XIEC_PCFROMI +#define _XIEC_PCI + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include + + +/* routines referenced by other modules. + */ +peDefPtr MakeConvertFromIndex(); + +/* routines internal to this module + */ +static Bool PrepConvertFromIndex(); + +/* dixie entry points + */ +static diElemVecRec pCfromIVec = { + PrepConvertFromIndex + }; + + +/*------------------------------------------------------------------------ +----------------- routine: make an ConvertFromIndex element ---------------- +------------------------------------------------------------------------*/ +peDefPtr MakeConvertFromIndex(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + inFloPtr inFlo; + ELEMENT(xieFloConvertFromIndex); + ELEMENT_AT_LEAST_SIZE(xieFloConvertFromIndex); + ELEMENT_NEEDS_1_INPUT(src); + + if(!(ped=MakePEDef(1,(CARD32)stuff->elemLength<<2,sizeof(pCfromIDefRec)))) + FloAllocError(flo,tag,xieElemConvertFromIndex, return(NULL)); + + ped->diVec = &pCfromIVec; + ped->phototag = tag; + ped->flags.process = TRUE; + raw = (xieFloConvertFromIndex *)ped->elemRaw; + /* + * copy the standard client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + raw->class = stuff->class; + raw->precision = stuff->precision; + cpswapl(stuff->colormap, raw->colormap); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloConvertFromIndex)); + /* + * assign phototags to inFlos + */ + inFlo = ped->inFloLst; + inFlo[SRCtag].srcTag = raw->src; + + return(ped); +} /* end MakeConvertFromIndex */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepConvertFromIndex(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloConvertFromIndex *raw = (xieFloConvertFromIndex *)ped->elemRaw; + pCfromIDefPtr pvt = (pCfromIDefPtr) ped->elemPvt; + inFloPtr inf = &ped->inFloLst[SRCt1]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + CARD32 depth, levels, b; + + /* check client parameters + */ + if(raw->class != xieValSingleBand && + raw->class != xieValTripleBand || + raw->precision < 1 || raw->precision > 16) + ValueError(flo,ped,raw->precision, return(FALSE)); + + /* grab attributes from colormap, visual, ... + */ + if(!(pvt->cmap = (ColormapPtr) LookupIDByType(raw->colormap, RT_COLORMAP))) + ColormapError(flo,ped,raw->colormap, return(FALSE)); + pvt->precShift = 16 - raw->precision; + pvt->class = pvt->cmap->class; + pvt->visual = pvt->cmap->pVisual; + pvt->pixMsk[0] = pvt->visual->redMask; + pvt->pixMsk[1] = pvt->visual->greenMask; + pvt->pixMsk[2] = pvt->visual->blueMask; + pvt->pixPos[0] = pvt->visual->offsetRed; + pvt->pixPos[1] = pvt->visual->offsetGreen; + pvt->pixPos[2] = pvt->visual->offsetBlue; + pvt->cells = pvt->visual->ColormapEntries; + levels = (pvt->class <= PseudoColor ? pvt->cells : + (pvt->pixMsk[0] | pvt->pixMsk[1] | pvt->pixMsk[2]) + 1); + SetDepthFromLevels(levels,depth); + + if(IsntConstrained(src->format[0].class) + || src->bands > 1 || src->format[0].levels != 1<bands = (raw->class == xieValSingleBand) ? 1 : 3; + inf->bands = src->bands; + for(b = 0; b < dst->bands; b++) { + dst->format[b] = inf->format[0] = src->format[0]; + dst->format[b].band = b; + dst->format[b].levels = (1<precision); + } + if(!UpdateFormatfromLevels(ped)) + MatchError(flo,ped,return(FALSE)); + + return(TRUE); +} /* end PrepConvertFromIndex */ + +/* end module pcfromi.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/pcnst.c b/xie/xc/programs/Xserver/XIE/dixie/process/pcnst.c new file mode 100644 index 0000000..37bb5d8 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/pcnst.c @@ -0,0 +1,330 @@ +/* $XConsortium: pcnst.c,v 1.5 94/04/17 20:33:42 rws Exp $ */ +/**** module pcnst.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + pcnst..c -- DIXIE routines for managing the Constrain element + + Dean Verheiden -- AGE Logic, Inc. May 1993 + +*****************************************************************************/ + +#define _XIEC_PCNST + +/* + * Include files + */ +#include + + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include + + +/* + * routines referenced by other modules + */ +peDefPtr MakeConstrain(); +Bool CopyPConstrainStandard(); +Bool CopyPConstrainClipScale(); +Bool PrepPConstrainStandard(); +Bool PrepPConstrainClipScale(); + +/* + * routines internal to this module + */ +static Bool PrepPConstrain(); + +/* + * dixie element entry points + */ +static diElemVecRec pConstrainVec = { + PrepPConstrain /* prepare for analysis and execution */ + }; + +/*------------------------------------------------------------------------ +-------------------- routine: make a constrain element ------------------ +------------------------------------------------------------------------*/ +peDefPtr MakeConstrain(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + ELEMENT(xieFloConstrain); + ELEMENT_AT_LEAST_SIZE(xieFloConstrain); + ELEMENT_NEEDS_1_INPUT(src); + + if(!(ped = MakePEDef(1, (CARD32)stuff->elemLength<<2, 0))) + FloAllocError(flo,tag,xieElemConstrain, return(NULL)) ; + + ped->diVec = &pConstrainVec; + ped->phototag = tag; + ped->flags.process = TRUE; + raw = (xieFloConstrain *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + cpswapl(stuff->levels0, raw->levels0); + cpswapl(stuff->levels1, raw->levels1); + cpswapl(stuff->levels2, raw->levels2); + cpswaps(stuff->lenParams, raw->lenParams); + cpswaps(stuff->constrain, raw->constrain); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloConstrain)); + /* + * copy technique data (if any) + */ + if(!(ped->techVec = FindTechnique(xieValConstrain, raw->constrain)) || + !(ped->techVec->copyfnc(flo, ped, &stuff[1], &raw[1], raw->lenParams))) + TechniqueError(flo,ped,xieValConstrain,raw->constrain,raw->lenParams, + return(ped)); + + /* + * assign phototag to inFlo + */ + ped->inFloLst[SRCtag].srcTag = raw->src; + + + return(ped); +} /* end MakePConstrain */ + +/*------------------------------------------------------------------------ +---------------- routine: copy routine for no param techniques ------------- +------------------------------------------------------------------------*/ + +Bool CopyPConstrainStandard(flo, ped, sparms, rparms, tsize) + floDefPtr flo; + peDefPtr ped; + pointer sparms, rparms; + CARD16 tsize; +{ + return(tsize == 0); +} + +/*------------------------------------------------------------------------ +---------------- routine: copy routine for Clip-Scale technique --------- +------------------------------------------------------------------------*/ + +Bool CopyPConstrainClipScale(flo, ped, sparms, rparms, tsize) + floDefPtr flo; + peDefPtr ped; + xieTecClipScale *sparms, *rparms; + CARD16 tsize; +{ + pCnstDefPtr pvt; + + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + if (!(ped->techPvt = (pointer )XieMalloc(sizeof(pCnstDefRec)))) + FloAllocError(flo, ped->phototag,xieElemConstrain, return(TRUE)); + + pvt = (pCnstDefPtr)ped->techPvt; + + if( flo->reqClient->swapped ) { + pvt->input_low[0] = ConvertFromIEEE(lswapl(sparms->inputLow0)); + pvt->input_low[1] = ConvertFromIEEE(lswapl(sparms->inputLow1)); + pvt->input_low[2] = ConvertFromIEEE(lswapl(sparms->inputLow2)); + pvt->input_high[0] = ConvertFromIEEE(lswapl(sparms->inputHigh0)); + pvt->input_high[1] = ConvertFromIEEE(lswapl(sparms->inputHigh1)); + pvt->input_high[2] = ConvertFromIEEE(lswapl(sparms->inputHigh2)); + cpswapl(sparms->outputLow0, pvt->output_low[0]); + cpswapl(sparms->outputLow1, pvt->output_low[1]); + cpswapl(sparms->outputLow2, pvt->output_low[2]); + cpswapl(sparms->outputHigh0, pvt->output_high[0]); + cpswapl(sparms->outputHigh1, pvt->output_high[1]); + cpswapl(sparms->outputHigh2, pvt->output_high[2]); + } else { + pvt->input_low[0] = ConvertFromIEEE(sparms->inputLow0); + pvt->input_low[1] = ConvertFromIEEE(sparms->inputLow1); + pvt->input_low[2] = ConvertFromIEEE(sparms->inputLow2); + pvt->input_high[0] = ConvertFromIEEE(sparms->inputHigh0); + pvt->input_high[1] = ConvertFromIEEE(sparms->inputHigh1); + pvt->input_high[2] = ConvertFromIEEE(sparms->inputHigh2); + pvt->output_low[0] = sparms->outputLow0; + pvt->output_low[1] = sparms->outputLow1; + pvt->output_low[2] = sparms->outputLow2; + pvt->output_high[0] = sparms->outputHigh0; + pvt->output_high[1] = sparms->outputHigh1; + pvt->output_high[2] = sparms->outputHigh2; + } + + return (TRUE); +} +/*------------------------------------------------------------------------ +---------------- routine: prep routine for no param techniques ------------- +------------------------------------------------------------------------*/ +Bool PrepPConstrainStandard(flo, ped, raw, tec) + floDefPtr flo; + peDefPtr ped; + pointer raw, tec; +{ + return(TRUE); +} +/*------------------------------------------------------------------------ +---------------- routine: prep routine for Clip Scale technique ---------- +------------------------------------------------------------------------*/ +Bool PrepPConstrainClipScale(flo, ped, raw, tec) + floDefPtr flo; + peDefPtr ped; + xieTecClipScale *raw, *tec; +{ + pCnstDefPtr pvt = (pCnstDefPtr)ped->techPvt; + + if (pvt->input_low[0] == pvt->input_high[0] || + pvt->output_low[0] > ped->outFlo.format[0].levels - 1 || + pvt->output_high[0] > ped->outFlo.format[0].levels - 1) + return(FALSE); + if (ped->outFlo.bands > 1) { + if ( pvt->input_low[1] == pvt->input_high[1] || + pvt->output_low[1] > ped->outFlo.format[1].levels - 1 || + pvt->output_high[1] > ped->outFlo.format[1].levels - 1 || + pvt->input_low[2] == pvt->input_high[2] || + pvt->output_low[2] > ped->outFlo.format[2].levels - 1 || + pvt->output_high[2] > ped->outFlo.format[2].levels - 1) + return(FALSE); + } + + return(TRUE); +} + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ + +static Bool PrepPConstrain(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + inFloPtr inf = &ped->inFloLst[SRCtag]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + xieFloConstrain *raw = (xieFloConstrain *)ped->elemRaw; + int b; + + /* grab a copy of the src attributes and propagate them to our input */ + dst->bands = inf->bands = src->bands; + for(b = 0; b < src->bands; b++) { + + /* This should be impossible */ + if (IsntCanonic(src->format[b].class)) + ImplementationError(flo, ped, return(FALSE)); + + inf->format[b] = src->format[b]; + + /* Copy outFlo values that are unchanged by constrain */ + dst->format[b].band = b; + dst->format[b].interleaved = src->format[b].interleaved; + dst->format[b].width = src->format[b].width; + dst->format[b].height = src->format[b].height; + } + /* Pull in levels information from the element description */ + if ((dst->format[0].levels = raw->levels0) > MAX_LEVELS(src->bands)) + ValueError(flo,ped,raw->levels0,return(FALSE)); + if (dst->bands > 1) { + if ((dst->format[1].levels = raw->levels1) > MAX_LEVELS(src->bands)) + ValueError(flo,ped,raw->levels1,return(FALSE)); + if ((dst->format[2].levels = raw->levels2) > MAX_LEVELS(src->bands)) + ValueError(flo,ped,raw->levels2,return(FALSE)); + } + /* Set depth, class, stride, and pitch */ + if(!UpdateFormatfromLevels(ped)) + MatchError(flo,ped, return(FALSE)); + + /* Take care of any technique parameters */ + if (!(ped->techVec->prepfnc(flo, ped, raw, &raw[1]))) + TechniqueError(flo,ped,xieValConstrain,raw->constrain,raw->lenParams, + return(FALSE)); + return (TRUE); +} + +/* end module pcnst.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/pcomp.c b/xie/xc/programs/Xserver/XIE/dixie/process/pcomp.c new file mode 100644 index 0000000..cef9f97 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/pcomp.c @@ -0,0 +1,294 @@ +/* $XConsortium: pcomp.c,v 1.3 94/04/17 20:33:43 rws Exp $ */ +/**** module pcomp.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + pcomp.c -- DIXIE routines for managing the compare element + + Dean Verheiden -- AGE Logic, Inc. July 1993 + +*****************************************************************************/ + +#define _XIEC_PCOMP + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeCompare(); + +/* + * routines internal to this module + */ +static Bool PrepCompare(); + +/* + * dixie entry points + */ +static diElemVecRec pCompareVec = { + PrepCompare /* prepare for analysis and execution */ + }; + + +/*------------------------------------------------------------------------ +----------------------- routine: make a arithmetic element -------------------- +------------------------------------------------------------------------*/ +peDefPtr MakeCompare(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + int inputs; + peDefPtr ped; + inFloPtr inFlo; + pCompareDefPtr pvt; + ELEMENT(xieFloCompare); + ELEMENT_SIZE_MATCH(xieFloCompare); + ELEMENT_NEEDS_1_INPUT(src1); + inputs = 1 + (stuff->src2 ? 1 : 0) + (stuff->domainPhototag ? 1 :0); + + if(!(ped = MakePEDef(inputs, (CARD32)stuff->elemLength<<2, + sizeof(pCompareDefRec)))) + FloAllocError(flo, tag, xieElemCompare, return(NULL)); + + ped->diVec = &pCompareVec; + ped->phototag = tag; + ped->flags.process = TRUE; + raw = (xieFloCompare *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src1, raw->src1); + cpswaps(stuff->src2, raw->src2); + cpswapl(stuff->domainOffsetX, raw->domainOffsetX); + cpswapl(stuff->domainOffsetY, raw->domainOffsetY); + cpswaps(stuff->domainPhototag,raw->domainPhototag); + raw->operator = stuff->operator; + raw->combine = stuff->combine; + cpswapl(stuff->constant0, raw->constant0); + cpswapl(stuff->constant1, raw->constant1); + cpswapl(stuff->constant2, raw->constant2); + raw->bandMask = stuff->bandMask; + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloCompare)); + + if(!raw->src2) { + /* + * convert constants + */ + pvt = (pCompareDefPtr)ped->elemPvt; + pvt->constant[0] = ConvertFromIEEE(raw->constant0); + pvt->constant[1] = ConvertFromIEEE(raw->constant1); + pvt->constant[2] = ConvertFromIEEE(raw->constant2); + } + /* + * assign phototags to inFlos + */ + inFlo = ped->inFloLst; + inFlo[SRCt1].srcTag = raw->src1; + if(raw->src2) inFlo[SRCt2].srcTag = raw->src2; + if(raw->domainPhototag) inFlo[ped->inCnt-1].srcTag = raw->domainPhototag; + + return(ped); +} /* end MakeCompare */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepCompare(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloCompare *raw = (xieFloCompare *)ped->elemRaw; + inFloPtr ind, in2, in1 = &ped->inFloLst[SRCt1]; + outFloPtr dom, sr2, sr1 = &in1->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + CARD8 mask, bandMask = raw->bandMask; + int b; + + /* check out our second source */ + if(raw->src2) { + in2 = &ped->inFloLst[SRCt2]; + sr2 = &in2->srcDef->outFlo; + if(sr1->bands != sr2->bands) + MatchError(flo,ped, return(FALSE)); + for (b = 0, mask = 1; b < sr1->bands; b++, mask <<= 1) { + if (sr1->bands == 3 && raw->combine && (!(mask & bandMask))) + continue; + if (IsntCanonic(sr1->format[b].class) || + sr1->format[b].class != sr2->format[b].class || + (IsConstrained(sr1->format[b].class) && + sr1->format[b].levels != sr2->format[b].levels)) + MatchError(flo,ped, return(FALSE)); + } + in2->bands = sr2->bands; + } else + sr2 = NULL; + + /* check out our process domain */ + if(raw->domainPhototag) { + ind = &ped->inFloLst[ped->inCnt-1]; + dom = &ind->srcDef->outFlo; + if((ind->bands = dom->bands) != 1 || IsntDomain(dom->format[0].class)) + DomainError(flo,ped,raw->domainPhototag, return(FALSE)); + ind->format[0] = dom->format[0]; + } else + dom = NULL; + + /* grab a copy of the input attributes and propagate them to our inputs */ + in1->bands = sr1->bands; + for(b = 0; b < sr1->bands; b++) { + in1->format[b] = sr1->format[b]; + if(sr2) + in2->format[b] = sr2->format[b]; + } + + /* Determine class of output */ + if (sr1->bands > 1 && !raw->combine) { + if (~(~0<bands) & ~raw->bandMask) /* mask must be for all bands */ + MatchError(flo,ped, return(FALSE)); + dst->bands = sr1->bands; + } else + dst->bands = 1; + + /* In this case, all src bands must have the same dimension */ + if (sr1->bands == 3 && raw->combine && + ((bandMask & 3 == 3 && + (sr1->format[0].width != sr1->format[1].width || + sr1->format[0].height != sr1->format[1].height)) || + (bandMask & 5 == 5 && + (sr1->format[0].width != sr1->format[2].width || + sr1->format[0].height != sr1->format[2].height)) || + (bandMask & 6 == 6 && + (sr1->format[1].width != sr1->format[2].width || + sr1->format[1].height != sr1->format[2].height)))) + MatchError(flo,ped, return(FALSE)); + + /* Check the operator */ + if (raw->operator != xieValLT && raw->operator != xieValLE && + raw->operator != xieValEQ && raw->operator != xieValNE && + raw->operator != xieValGT && raw->operator != xieValGE) + OperatorError(flo,ped,raw->operator, return(FALSE)); + + /* + Second check necessary because of protocol . . . must distinguish + between FloMatch errors and FloOperator errors + */ + if (dst->bands > 1 && raw->combine) { + if (raw->operator != xieValEQ && raw->operator != xieValNE) + MatchError(flo,ped, return(FALSE)); + } + + /* Set up destination parameters */ + for(b = 0; b < dst->bands; b++) { + CARD32 bits = sr1->format[b].width; + + dst->format[b].class = BIT_PIXEL; + dst->format[b].band = b; + dst->format[b].interleaved = FALSE; + dst->format[b].depth = 1; + dst->format[b].width = bits; + dst->format[b].height = sr1->format[b].height; + dst->format[b].levels = 2; + dst->format[b].stride = 1; + dst->format[b].pitch = bits + Align(bits,PITCH_MOD); + } + return( TRUE ); +} /* end PrepCompare */ + +/* end module pcomp.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/pconv.c b/xie/xc/programs/Xserver/XIE/dixie/process/pconv.c new file mode 100644 index 0000000..cad20bb --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/pconv.c @@ -0,0 +1,323 @@ +/* $XConsortium: pconv.c,v 1.5 94/04/17 20:33:43 rws Exp $ */ +/**** module pconv.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + pconv.c -- DIXIE routines for managing the Convolution element + + Dean Verheiden -- AGE Logic, Inc. June 1993 + +*****************************************************************************/ + +#define _XIEC_PCONV + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include + + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeConvolve(); +Bool CopyConvolveConstant(); +Bool PrepConvolveStandard(); +#ifdef BEYOND_SI +Bool CopyConvolveReplicate(); +#endif /* BEYOND_SI */ + +/* + * routines internal to this module + */ +static Bool PrepConvolve(); + +/* + * dixie entry points + */ +static diElemVecRec pConvolveVec = { + PrepConvolve /* prepare for analysis and execution */ + }; + + +/*------------------------------------------------------------------------ +----------------------- routine: make a convolution element -------------- +------------------------------------------------------------------------*/ +peDefPtr MakeConvolve(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + int inputs; + peDefPtr ped; + inFloPtr inFlo; + ConvFloat *pvt; + xieTypFloat *kptr; + int i, numke; + ELEMENT(xieFloConvolve); + ELEMENT_AT_LEAST_SIZE(xieFloConvolve); + ELEMENT_NEEDS_1_INPUT(src); + inputs = 1 + (stuff->domainPhototag ? 1 :0); + + + numke = stuff->kernelSize * stuff->kernelSize; + + if(!(ped = MakePEDef(inputs, (CARD32)stuff->elemLength<<2, + numke * sizeof(ConvFloat)))) + FloAllocError(flo, tag, xieElemConvolve, return(NULL)); + + ped->diVec = &pConvolveVec; + ped->phototag = tag; + ped->flags.process = TRUE; + raw = (xieFloConvolve *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + cpswapl(stuff->domainOffsetX, raw->domainOffsetX); + cpswapl(stuff->domainOffsetY, raw->domainOffsetY); + cpswaps(stuff->domainPhototag,raw->domainPhototag); + raw->bandMask = stuff->bandMask; + raw->kernelSize = stuff->kernelSize; + cpswaps(stuff->convolve, raw->convolve); + cpswaps(stuff->lenParams, raw->lenParams); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloConvolve)); + + /* Copy over and convert the kernel */ + kptr = (xieTypFloat *)&stuff[1]; + pvt = (ConvFloat *)ped->elemPvt; + if (flo->reqClient->swapped) + for (i = 0; i < numke; i++) { + /* can't use *pvt++ = ConvertFromIEEE(lswapl(*kptr++)); */ + /* because lswapl is a macro, and overincrements kptr */ + *pvt++ = ConvertFromIEEE(lswapl(*kptr)); + ++kptr; + } + else + for (i = 0; i < numke; i++) + *pvt++ = ConvertFromIEEE(*kptr++); + /* + * Ensure that the kernel size is odd + */ + if (!(stuff->kernelSize & 1)) + ValueError(flo,ped,(CARD32)raw->kernelSize,return(ped)); + + /* + * copy technique data (if any) + * Note that we must skip past the convolution kernel to get there + */ + if(!(ped->techVec = FindTechnique(xieValConvolve, raw->convolve)) || + !(ped->techVec->copyfnc(flo, ped, (CARD8 *)&stuff[1] + numke * 4, + (CARD8 *)&raw[1] + numke * 4, + raw->lenParams, + raw->convolve == xieValDefault))) + TechniqueError(flo,ped,xieValConvolve,raw->convolve,raw->lenParams, + return(ped)); + + /* + * assign phototags to inFlos + */ + inFlo = ped->inFloLst; + inFlo[SRCtag].srcTag = raw->src; + if(raw->domainPhototag) inFlo[ped->inCnt-1].srcTag = raw->domainPhototag; + + return(ped); +} /* end MakeConv */ + +/*------------------------------------------------------------------------ +---------------- routine: copy routine for Constant technique --------- +------------------------------------------------------------------------*/ + +Bool CopyConvolveConstant(flo, ped, sparms, rparms, tsize, isDefault) + floDefPtr flo; + peDefPtr ped; + xieTecConvolveConstant *sparms, *rparms; + CARD16 tsize; + Bool isDefault; +{ + pTecConvolveConstantDefPtr pvt; + + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, isDefault); + + if (!(ped->techPvt=(pointer )XieMalloc(sizeof(pTecConvolveConstantDefRec)))) + FloAllocError(flo, ped->phototag, xieElemConvolve, return(TRUE)); + + pvt = (pTecConvolveConstantDefPtr)ped->techPvt; + + if (isDefault || !tsize) { + pvt->constant[0] = pvt->constant[1] = pvt->constant[2] = 0; + } else if( flo->reqClient->swapped ) { + pvt->constant[0] = ConvertFromIEEE(lswapl(sparms->constant0)); + pvt->constant[1] = ConvertFromIEEE(lswapl(sparms->constant1)); + pvt->constant[2] = ConvertFromIEEE(lswapl(sparms->constant2)); + } else { + pvt->constant[0] = ConvertFromIEEE(sparms->constant0); + pvt->constant[1] = ConvertFromIEEE(sparms->constant1); + pvt->constant[2] = ConvertFromIEEE(sparms->constant2); + } + + return (TRUE); +} + +#ifdef BEYOND_SI +/*------------------------------------------------------------------------ +---------------- routine: copy routine for no param techniques ------------- +------------------------------------------------------------------------*/ + +Bool CopyConvolveReplicate(flo, ped, sparms, rparms, tsize, isDefault) + floDefPtr flo; + peDefPtr ped; + pointer sparms, rparms; + CARD16 tsize; + Bool isDefault; +{ + return(tsize == 0); +} +#endif /* BEYOND_SI */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepConvolve(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloConvolve *raw = (xieFloConvolve *)ped->elemRaw; + inFloPtr ind, in = &ped->inFloLst[SRCtag]; + outFloPtr dom, src = &in->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + int b; + + /* check out our process domain */ + if(raw->domainPhototag) { + ind = &ped->inFloLst[ped->inCnt-1]; + dom = &ind->srcDef->outFlo; + if((ind->bands = dom->bands) != 1 || IsntDomain(dom->format[0].class)) + DomainError(flo,ped,raw->domainPhototag, return(FALSE)); + ind->format[0] = dom->format[0]; + } else + dom = NULL; + + /* grab a copy of the input attributes and propagate them to our output */ + dst->bands = in->bands = src->bands; + + for(b = 0; b < dst->bands; b++) { + if (IsntCanonic(src->format[b].class) || + ((raw->bandMask & (1<format[b].class == BIT_PIXEL)) + MatchError(flo, ped, return(FALSE)); + dst->format[b] = in->format[b] = src->format[b]; + } + + if(!(ped->techVec->prepfnc(flo, ped, raw, &raw[1] + + raw->kernelSize * raw->kernelSize * 4))) + TechniqueError(flo,ped,xieValConvolve,raw->convolve,raw->lenParams, + return(FALSE)); + + return( TRUE ); +} /* end PrepConvolve */ + +/*------------------------------------------------------------------------ +---------------- routine: prep routine for no param techniques ----------- +------------------------------------------------------------------------*/ +Bool PrepConvolveStandard(flo, ped, raw, tec) + floDefPtr flo; + peDefPtr ped; + pointer raw, tec; +{ + return(TRUE); +} +/* end module pconv.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/pctoi.c b/xie/xc/programs/Xserver/XIE/dixie/process/pctoi.c new file mode 100644 index 0000000..098ae59 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/pctoi.c @@ -0,0 +1,439 @@ +/* $XConsortium: pctoi.c /main/7 1995/12/02 16:48:00 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module pctoi.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + pctoi.c -- DIXIE routines for managing the ConvertToIndex element + + Dean Verheiden && Robert NC Shelley -- AGE Logic, Inc. June 1993 + +*****************************************************************************/ + +#define _XIEC_PCTOI +#define _XIEC_PCI + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include +#include + + +/* routines referenced by other modules. + */ +peDefPtr MakeConvertToIndex(); +Bool CopyCtoIAllocAll(); +Bool PrepCtoIAllocAll(); +#ifdef BEYOND_SI +Bool CopyCtoIAllocMatch(); +Bool CopyCtoIAllocRequantize(); +#endif /* BEYOND_SI */ + +/* routines internal to this module + */ +static Bool PrepConvertToIndex(); +static Bool DebriefConvertToIndex(); + +/* dixie entry points + */ +static diElemVecRec pCtoIVec = { + PrepConvertToIndex, + DebriefConvertToIndex + }; + + +/*------------------------------------------------------------------------ +----------------- routine: make an ExportPhotomap element ---------------- +------------------------------------------------------------------------*/ +peDefPtr MakeConvertToIndex(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + inFloPtr inFlo; + ELEMENT(xieFloConvertToIndex); + ELEMENT_AT_LEAST_SIZE(xieFloConvertToIndex); + ELEMENT_NEEDS_1_INPUT(src); + + if(!(ped = MakePEDef(1,(CARD32)stuff->elemLength<<2,sizeof(pCtoIDefRec)))) + FloAllocError(flo,tag,xieElemConvertToIndex, return(NULL)); + + ped->diVec = &pCtoIVec; + ped->phototag = tag; + ped->flags.process = TRUE; + raw = (xieFloConvertToIndex *)ped->elemRaw; + /* + * copy the standard client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + raw->notify = stuff->notify; + cpswapl(stuff->colormap, raw->colormap); + cpswapl(stuff->colorList, raw->colorList); + cpswaps(stuff->colorAlloc, raw->colorAlloc); + cpswaps(stuff->lenParams, raw->lenParams); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloConvertToIndex)); + /* + * assign phototags to inFlos + */ + inFlo = ped->inFloLst; + inFlo[SRCtag].srcTag = raw->src; + + /* + * copy technique data (if any) + */ + if(!(ped->techVec = FindTechnique(xieValColorAlloc,raw->colorAlloc)) || + !(ped->techVec->copyfnc(flo, ped, &stuff[1], &raw[1], raw->lenParams, + raw->colorAlloc == xieValDefault))) + TechniqueError(flo,ped,xieValColorAlloc,raw->colorAlloc,raw->lenParams, + return(ped)); + + return(ped); +} /* end MakeConvertToIndex */ + +/*------------------------------------------------------------------------ +----------------------- copy routines for techniques ------------------- +------------------------------------------------------------------------*/ + +Bool CopyCtoIAllocAll(flo, ped, sparms, rparms, tsize, isDefault) + floDefPtr flo; + peDefPtr ped; + xieTecColorAllocAll *sparms, *rparms; + CARD16 tsize; + Bool isDefault; +{ + pTecCtoIDefPtr pvt; + + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, isDefault); + + if(!(ped->techPvt=(pointer)XieMalloc(sizeof(pTecCtoIDefRec)))) + FloAllocError(flo,ped->phototag,xieElemConvertToIndex, return(TRUE)); + + pvt = (pTecCtoIDefPtr)ped->techPvt; + + pvt->defTech = isDefault; + + if (isDefault) + pvt->fill = 0; /* Not really a good way to pick this so . . . */ + else if( flo->reqClient->swapped ) { + cpswapl(sparms->fill, pvt->fill); + } else + pvt->fill = sparms->fill; + + return(TRUE); +} + +#ifdef BEYOND_SI +Bool CopyCtoIAllocMatch(flo, ped, sparms, rparms, tsize, isDefault) + floDefPtr flo; + peDefPtr ped; + xieTecColorAllocMatch *sparms, *rparms; + CARD16 tsize; + Bool isDefault; +{ + pConvertToIndexMatchDefPtr pvt; + + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, isDefault); + + if (!(ped->techPvt=(pointer )XieMalloc(sizeof(pTecConvertToIndexMatchDefRec)))) + AllocError(flo,ped, return(TRUE)); + + pvt = (pConvertToIndexMatchDefPtr)ped->techPvt; + + if( flo->reqClient->swapped ) { + pvt->matchLimit = ConvertFromIEEE(lswapl(sparms->matchLimit)); + pvt->grayLimit = ConvertFromIEEE(lswapl(sparms->grayLimit)); + } else { + pvt->matchLimit = ConvertFromIEEE(sparms->matchLimit); + pvt->grayLimit = ConvertFromIEEE(sparms->grayLimit); + } + return(TRUE); +} + +Bool CopyCtoIAllocRequantize(flo, ped, sparms, rparms, tsize, isDefault) + floDefPtr flo; + peDefPtr ped; + xieTecColorAllocRequantize *sparms, *rparms; + CARD16 tsize; + Bool isDefault; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, isDefault); + + if( flo->reqClient->swapped ){ + cpswapl(sparms->maxCells, rparms->maxCells); + } else + rparms->maxCells = sparms->maxCells; + + return(TRUE); +} +#endif /* BEYOND_SI */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepConvertToIndex(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloConvertToIndex *raw = (xieFloConvertToIndex *)ped->elemRaw; + pCtoIDefPtr pvt = (pCtoIDefPtr) ped->elemPvt; + inFloPtr inf = &ped->inFloLst[SRCt1]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + formatPtr sf = &src->format[0]; + formatPtr df = &dst->format[0]; + CARD32 b; + + /* must be constrained and inter-band dimensions must match + */ + if(IsntConstrained(sf[0].class) || + src->bands == 3 && (IsntConstrained(sf[1].class) || + IsntConstrained(sf[2].class) || + sf[0].width != sf[1].width || + sf[1].width != sf[2].width || + sf[0].height != sf[1].height || + sf[1].height != sf[2].height)) + MatchError(flo,ped, return(FALSE)); + + /* determine our output attributes from the input (figure out levels later) + */ + df[0] = sf[0]; + dst->bands = 1; + inf->bands = src->bands; + for(b = 0; b < src->bands; ++b) + inf->format[b] = sf[b]; + + /* find the ColorList and Colormap resources + */ + if(raw->colorList) { + if(!(pvt->list = LookupColorList(raw->colorList))) + ColorListError(flo,ped,raw->colorList, return(FALSE)); + if(pvt->list->refCnt != 1) + AccessError(flo,ped, return(FALSE)); + ++pvt->list->refCnt; + } else { + pvt->list = NULL; + } + if(!(pvt->cmap = (ColormapPtr) LookupIDByType(raw->colormap, RT_COLORMAP))) + ColormapError(flo,ped,raw->colormap, return(FALSE)); + + /* grab attributes from colormap, visual, ... + */ + pvt->class = pvt->cmap->class; + pvt->visual = pvt->cmap->pVisual; + pvt->stride = pvt->visual->bitsPerRGBValue; + pvt->cells = pvt->visual->ColormapEntries; + pvt->mask[0] = pvt->visual->redMask; + pvt->mask[1] = pvt->visual->greenMask; + pvt->mask[2] = pvt->visual->blueMask; + pvt->shft[0] = pvt->visual->offsetRed; + pvt->shft[1] = pvt->visual->offsetGreen; + pvt->shft[2] = pvt->visual->offsetBlue; + pvt->dynamic = pvt->cmap->class & DynamicClass; + pvt->graySrc = src->bands == 1; + pvt->preFmt = pvt->doHist = FALSE; + + switch(pvt->class) { + case DirectColor : + case TrueColor : + case StaticColor : + for(b = 0; b < 3; ++b) + pvt->levels[b] = pvt->mask[b] >> pvt->shft[b]; + + /* see if we have a full set of masks (by turning them into levels) + */ + if(pvt->levels[0]++ & pvt->levels[1]++ & pvt->levels[2]++) { + /* see what limitations we have for grayscale images */ + if(pvt->graySrc && !pvt->dynamic && (pvt->levels[0] != pvt->levels[1] || + pvt->levels[1] != pvt->levels[2])) + MatchError(flo,ped, return(FALSE)); + + /* set output levels and depth based on colormap masks + */ + df[0].levels = pvt->levels[0] * pvt->levels[1] * pvt->levels[2]; + SetDepthFromLevels(df[0].levels, pvt->depth); + break; + } /* for StaticColor with no asks, we'll fall thru */ + case PseudoColor : + pvt->levels[1] = pvt->levels[2] = 1; + case GrayScale : + case StaticGray : + /* set output levels and depth based on colormap size + */ + SetDepthFromLevels(pvt->cells, pvt->depth); + df[0].levels = 1<depth; + if((pvt->preFmt = !pvt->graySrc) && pvt->class <= GrayScale) + MatchError(flo,ped, return(FALSE)); + } + /* set output stride and pitch to match the colormap depth + */ + if(!UpdateFormatfromLevels(ped)) + MatchError(flo,ped, return(FALSE)); + + /* go do technique-specific stuff + */ + if(!(ped->techVec->prepfnc(flo, ped, raw, &raw[1]))) + TechniqueError(flo,ped,xieValColorAlloc,raw->colorAlloc,raw->lenParams, + return(FALSE)); + + /* init the colorlist resource + */ + if(pvt->list) { + ResetColorList(pvt->list, pvt->list->mapPtr); + pvt->list->mapID = raw->colormap; + pvt->list->mapPtr = pvt->cmap; + pvt->list->client = flo->runClient; + } + return(TRUE); +} /* end PrepConvertToIndex */ + +/*------------------------------------------------------------------------ +------------------------ technique prep routines ------------------------ +------------------------------------------------------------------------*/ +Bool PrepCtoIAllocAll(flo, ped, raw, tec) + floDefPtr flo; + peDefPtr ped; + xieFloConvertToIndex *raw; + xieTecColorAllocAll *tec; +{ + pCtoIDefPtr pvt = (pCtoIDefPtr) ped->elemPvt; + inFloPtr inf = &ped->inFloLst[SRCtag]; + formatPtr fmt = &inf->format[0]; + + if(!(pvt->class & DynamicClass) || !pvt->list) + return(FALSE); /* AllocAll needs a dynamic colormap and a colorlist */ + + /* Check the depth of each band to make sure they're reasonable ... deep + * images have to have sparse histograms to avoid running out of colors + * + * XIE only supports up to 16 bits per band for "non-index" data, + * we will further limit RGB images to a total depth of 31. + */ + if(inf->bands == 1 && fmt[0].depth > 16 || + inf->bands == 3 && (fmt[0].depth + fmt[1].depth + fmt[2].depth > 31)) + return(FALSE); + + return(TRUE); +} /* end PrepCtoIAllocAll */ + +/*------------------------------------------------------------------------ +---------------------- routine: post execution cleanup ------------------- +------------------------------------------------------------------------*/ +static Bool DebriefConvertToIndex(flo,ped,ok) + floDefPtr flo; + peDefPtr ped; + Bool ok; +{ + pCtoIDefPtr pvt = (pCtoIDefPtr) ped->elemPvt; + colorListPtr lst; + + if(pvt && (lst = pvt->list)) + if(lst->refCnt > 1) { + if(!ok || !lst->cellCnt) + ResetColorList(lst, lst->mapPtr); + --lst->refCnt; + } else if(LookupIDByType(lst->ID, RT_COLORLIST)) { + FreeResourceByType(lst->ID, RT_COLORLIST, RT_NONE); + } else { + DeleteColorList(lst, lst->ID); + } + return(TRUE); +} /* end DebriefConvertToIndex */ + +/* end module pctoi.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/pctrgb.c b/xie/xc/programs/Xserver/XIE/dixie/process/pctrgb.c new file mode 100644 index 0000000..022b7ba --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/pctrgb.c @@ -0,0 +1,561 @@ +/* $XConsortium: pctrgb.c,v 1.4 94/04/17 20:33:45 rws Exp $ */ +/**** module pctrgb.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + pctrgb.c -- DIXIE routines for managing the ConvertToRGB element + + Dean Verheiden -- AGE Logic, Inc. August 1993 + +*****************************************************************************/ + +#define _XIEC_PCTRGB + +/* + * Include files + */ +#include + + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include + + +/* + * routines referenced by other modules + */ +peDefPtr MakeConvertToRGB(); +Bool CopyPConvertToRGBCIE(); +Bool CopyPConvertToRGBYCC(); +Bool CopyPConvertToRGBYCbCr(); +Bool PrepPConvertToRGBCIE(); +Bool PrepPConvertToRGBYCC(); +Bool PrepPConvertToRGBYCbCr(); + +/* + * routines for White Adjust techniques + */ +Bool CopyPWhiteAdjustNone(); +Bool CopyPWhiteAdjustCIELabShift(); +Bool PrepPWhiteAdjustNone(); +Bool PrepPWhiteAdjustCIELabShift(); +/* + * routines for Gamut techniques + */ +Bool CopyPGamut(); +Bool PrepPGamut(); + +/* + * other utility routines + */ + +void copy_floats(); +void swap_floats(); + +/* + * routines internal to this module + */ +static Bool PrepPConvertToRGB(); + +/* + * dixie element entry points + */ +static diElemVecRec pConvertToRGBVec = { + PrepPConvertToRGB /* prepare for analysis and execution */ + }; + +/*------------------------------------------------------------------------ +------------------ routine: make a ConvertToRBG element ---------------- +------------------------------------------------------------------------*/ +peDefPtr MakeConvertToRGB(flo,tag,pe) +floDefPtr flo; +xieTypPhototag tag; +xieFlo *pe; +{ + peDefPtr ped; + ELEMENT(xieFloConvertToRGB); + ELEMENT_AT_LEAST_SIZE(xieFloConvertToRGB); + ELEMENT_NEEDS_1_INPUT(src); + + if(!(ped = MakePEDef(1, (CARD32)stuff->elemLength<<2, 0))) + FloAllocError(flo,tag,xieElemConvertToRGB, return(NULL)) ; + + ped->diVec = &pConvertToRGBVec; + ped->phototag = tag; + ped->flags.process = TRUE; + raw = (xieFloConvertToRGB *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + cpswaps(stuff->convert, raw->convert); + cpswaps(stuff->lenParams, raw->lenParams); + } else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloConvertToRGB)); + /* + * copy technique data (if any) + */ + if(!(ped->techVec = FindTechnique(xieValConvertToRGB, raw->convert)) || + !(ped->techVec->copyfnc(flo, ped, &stuff[1], &raw[1], raw->lenParams))) + TechniqueError(flo,ped,xieValConvertToRGB,raw->convert,raw->lenParams, + return(ped)); + + /* + * assign phototag to inFlo + */ + ped->inFloLst[SRCtag].srcTag = raw->src; + + return(ped); +} /* end MakePConvertToRGB */ + +/*------------------------------------------------------------------------ +------ routine: copy routine for CIELab and CIEXYZ techniques ----------- +------------------------------------------------------------------------*/ +Bool CopyPConvertToRGBCIE(flo, ped, sparms, rparms, tsize) +floDefPtr flo; +peDefPtr ped; +xieTecCIELabToRGB *sparms, *rparms; /* same as xieTecCIEXYZToRGB */ +CARD16 tsize; +{ + pTecCIEToRGBDefPtr pvt; + + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + if (!(ped->techPvt = (pointer )XieMalloc(sizeof(pTecCIEToRGBDefRec)))) + FloAllocError(flo, ped->phototag,xieElemConvertToRGB, return(TRUE)); + + pvt = (pTecCIEToRGBDefPtr)ped->techPvt; + + if( flo->reqClient->swapped ) { + swap_floats(&pvt->matrix[0], &sparms->matrix00, 9); + cpswaps(sparms->whiteAdjusted, pvt->whiteAdjusted); + cpswaps(sparms->lenWhiteParams, pvt->lenWhiteParams); + cpswaps(sparms->gamutCompress, pvt->gamutCompress); + cpswaps(sparms->lenGamutParams, pvt->lenGamutParams); + } else { + copy_floats(&pvt->matrix[0], &sparms->matrix00, 9); + pvt->whiteAdjusted = sparms->whiteAdjusted; + pvt->lenWhiteParams = sparms->lenWhiteParams; + pvt->gamutCompress = sparms->gamutCompress; + pvt->lenGamutParams = sparms->lenGamutParams; + } + + if(!(pvt->whiteTec = FindTechnique(xieValWhiteAdjust, pvt->whiteAdjusted)) || + !(pvt->whiteTec->copyfnc(flo, ped, &sparms[1], pvt->whitePoint, + pvt->whiteTec, pvt->lenWhiteParams, + pvt->whiteAdjusted == xieValDefault))) + TechniqueError(flo,ped,xieValWhiteAdjust, + pvt->whiteAdjusted,pvt->lenWhiteParams, return(TRUE)); + + if(!(pvt->gamutTec = FindTechnique(xieValGamut, pvt->gamutCompress)) || + !(pvt->gamutTec->copyfnc(pvt->lenGamutParams))) + TechniqueError(flo,ped,xieValGamut, + pvt->gamutCompress,pvt->lenGamutParams, return(TRUE)); + + return (TRUE); +} + +/*------------------------------------------------------------------------ +---------- routine: copy routine for YCbCr and YCC techniques ------------ +------------------------------------------------------------------------*/ +Bool CopyPConvertToRGBYCbCr(flo, ped, sparms, rparms, tsize) +floDefPtr flo; +peDefPtr ped; +xieTecYCbCrToRGB *sparms, *rparms; +CARD16 tsize; +{ + pTecYCbCrToRGBDefPtr pvt; + + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + if (!(ped->techPvt = (pointer )XieMalloc(sizeof(pTecYCbCrToRGBDefRec)))) + FloAllocError(flo, ped->phototag,xieElemConvertToRGB, return(TRUE)); + + pvt = (pTecYCbCrToRGBDefPtr)ped->techPvt; + + if( flo->reqClient->swapped ) { + cpswapl(sparms->levels0, pvt->levels0); + cpswapl(sparms->levels1, pvt->levels1); + cpswapl(sparms->levels2, pvt->levels2); + swap_floats(&pvt->red, &sparms->lumaRed, 3); + swap_floats(&pvt->bias0, &sparms->bias0, 3); + cpswaps(sparms->gamutCompress, pvt->gamutCompress); + cpswaps(sparms->lenGamutParams, pvt->lenGamutParams); + } else { + pvt->levels0 = sparms->levels0; + pvt->levels1 = sparms->levels1; + pvt->levels2 = sparms->levels2; + copy_floats(&pvt->red, &sparms->lumaRed, 3); + copy_floats(&pvt->bias0, &sparms->bias0, 3); + pvt->gamutCompress = sparms->gamutCompress; + pvt->lenGamutParams = sparms->lenGamutParams; + } + + if(!(pvt->gamutTec = FindTechnique(xieValGamut, pvt->gamutCompress)) || + !(pvt->gamutTec->copyfnc(pvt->lenGamutParams))) + TechniqueError(flo,ped,xieValGamut, + pvt->gamutCompress,pvt->lenGamutParams, return(TRUE)); + + return (TRUE); +} + +Bool CopyPConvertToRGBYCC(flo, ped, sparms, rparms, tsize) +floDefPtr flo; +peDefPtr ped; +xieTecYCCToRGB *sparms, *rparms; +CARD16 tsize; +{ + pTecYCCToRGBDefPtr pvt; + + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + if (!(ped->techPvt = (pointer )XieMalloc(sizeof(pTecYCCToRGBDefRec)))) + FloAllocError(flo, ped->phototag,xieElemConvertToRGB, return(TRUE)); + + pvt = (pTecYCCToRGBDefPtr)ped->techPvt; + + if( flo->reqClient->swapped ) { + cpswapl(sparms->levels0, pvt->levels0); + cpswapl(sparms->levels1, pvt->levels1); + cpswapl(sparms->levels2, pvt->levels2); + swap_floats(&pvt->red, &sparms->lumaRed, 3); + pvt->scale = ConvertFromIEEE(lswapl(sparms->scale)); + cpswaps(sparms->gamutCompress, pvt->gamutCompress); + cpswaps(sparms->lenGamutParams, pvt->lenGamutParams); + } else { + pvt->levels0 = sparms->levels0; + pvt->levels1 = sparms->levels1; + pvt->levels2 = sparms->levels2; + copy_floats(&pvt->red, &sparms->lumaRed, 3); + pvt->scale = ConvertFromIEEE(sparms->scale); + pvt->gamutCompress = sparms->gamutCompress; + pvt->lenGamutParams = sparms->lenGamutParams; + } + + if(!(pvt->gamutTec = FindTechnique(xieValGamut, pvt->gamutCompress)) || + !(pvt->gamutTec->copyfnc(pvt->lenGamutParams))) + TechniqueError(flo,ped,xieValGamut, + pvt->gamutCompress,pvt->lenGamutParams, return(TRUE)); + + return (TRUE); +} +/*------------------------------------------------------------------------ +-- routine: copy routine for White Adjust None technique ---------- +------------------------------------------------------------------------*/ +Bool CopyPWhiteAdjustNone(flo, ped, sparms, pvtf, tv, tsize, isDefault) +floDefPtr flo; +peDefPtr ped; +pointer sparms; +double *pvtf; +techVecPtr tv; +CARD16 tsize; +Bool isDefault; +{ + return (tsize == 0); +} + +/*------------------------------------------------------------------------ +-- routine: copy routine for White Adjust CIELabShift technique ---------- +------------------------------------------------------------------------*/ +Bool CopyPWhiteAdjustCIELabShift(flo, ped, sparms, pvtf, tv, tsize, isDefault) +floDefPtr flo; +peDefPtr ped; +xieTecWhiteAdjustCIELabShift *sparms; +double *pvtf; +techVecPtr tv; +CARD16 tsize; +Bool isDefault; +{ + VALIDATE_TECHNIQUE_SIZE(tv, tsize, isDefault); + + if( flo->reqClient->swapped ) { + swap_floats(pvtf, &sparms->whitePoint0, 3); + } else { + copy_floats(pvtf, &sparms->whitePoint0, 3); + } + + return (TRUE); +} + +/*------------------------------------------------------------------------ +----------- routine: copy routine for Gamut techniques ------------------- +------------------------------------------------------------------------*/ +Bool CopyPGamut(tsize) +CARD16 tsize; +{ + return (tsize == 0); +} + +/*------------------------------------------------------------------------ +-- routine: prep routine for RGB to CIElab and CIEXYZ techniques --------- +------------------------------------------------------------------------*/ +Bool PrepPConvertToRGBCIE(flo, ped, raw, tec) +floDefPtr flo; +peDefPtr ped; +xieFloConvertToRGB *raw; +xieTecCIELabToRGB *tec; /* same as xieTecCIEXYZToRGB */ +{ + pTecCIEToRGBDefPtr pvt = (pTecCIEToRGBDefPtr)ped->techPvt; + inFloPtr inf = &ped->inFloLst[SRCtag]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + int b; + + /* grab a copy of the src attributes and propagate them to our input */ + dst->bands = inf->bands = src->bands; + for(b = 0; b < src->bands; b++) { + if (IsConstrained(src->format[0].class)) + return FALSE; /* must be floats */ + /* Since we know its floats, structure copy sufficient */ + dst->format[b] = inf->format[b] = src->format[b]; + } + + return(pvt->whiteTec->prepfnc(flo,ped,pvt->whitePoint)); +} + +/*------------------------------------------------------------------------ +-- routine: prep routine for RGB to YCbCr and YCC techniques ------------- +------------------------------------------------------------------------*/ +Bool PrepPConvertToRGBYCbCr(flo, ped, raw, tec) +floDefPtr flo; +peDefPtr ped; +xieFloConvertToRGB *raw; +xieTecYCbCrToRGB *tec; +{ + inFloPtr inf = &ped->inFloLst[SRCtag]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + pTecYCbCrToRGBDefPtr pvt = (pTecYCbCrToRGBDefPtr)ped->techPvt; + CARD32 *levels = &(pvt->levels0); + int b; + + /* grab a copy of the src attributes and propagate them to our input */ + dst->bands = inf->bands = src->bands; + for(b = 0; b < src->bands; b++) { + dst->format[b] = inf->format[b] = src->format[b]; + if (IsConstrained(dst->format[b].class)) + dst->format[b].levels = *(levels+b); + } + + /* Set depth, class, stride, and pitch */ + if (IsConstrained(dst->format[0].class)) { + if (UpdateFormatfromLevels(ped) == FALSE) + MatchError(flo,ped, return(FALSE)); + } /* else the structure copy was sufficient */ + + return(TRUE); +} + +Bool PrepPConvertToRGBYCC(flo, ped, raw, tec) +floDefPtr flo; +peDefPtr ped; +xieFloConvertToRGB *raw; +xieTecYCCToRGB *tec; +{ + inFloPtr inf = &ped->inFloLst[SRCtag]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + pTecYCCToRGBDefPtr pvt = (pTecYCCToRGBDefPtr)ped->techPvt; + CARD32 *levels = &(pvt->levels0); + int b; + + /* grab a copy of the src attributes and propagate them to our input */ + dst->bands = inf->bands = src->bands; + for(b = 0; b < src->bands; b++) { + dst->format[b] = inf->format[b] = src->format[b]; + if (IsConstrained(dst->format[b].class)) + dst->format[b].levels = *(levels+b); + } + + /* Set depth, class, stride, and pitch */ + if (IsConstrained(dst->format[0].class)) { + if (UpdateFormatfromLevels(ped) == FALSE) + MatchError(flo,ped, return(FALSE)); + } /* else the structure copy was sufficient */ + + if (pvt->scale < .001) { /* should be about 1.35 or 1.4 */ + ValueError(flo, ped, tec->scale, return(FALSE)); + } + + return(TRUE); +} + +/*------------------------------------------------------------------------ +------ routine: prep routine for White Adjust none technique ------------- +------------------------------------------------------------------------*/ +Bool PrepPWhiteAdjustNone(flo, ped, pwp) +floDefPtr flo; +peDefPtr ped; +double *pwp; +{ + return(TRUE); +} + +/*------------------------------------------------------------------------ +-- routine: prep routine for White Adjust CIELabShift technique ---------- +------------------------------------------------------------------------*/ +Bool PrepPWhiteAdjustCIELabShift(flo, ped, pwp) +floDefPtr flo; +peDefPtr ped; +double *pwp; +{ + return(TRUE); +} + +/*------------------------------------------------------------------------ +------------ routine: prep routine for gamut techniques ------------------ +------------------------------------------------------------------------*/ +Bool PrepPGamut() +{ + return(TRUE); +} + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ + +static Bool PrepPConvertToRGB(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + inFloPtr inf = &ped->inFloLst[SRCtag]; + outFloPtr src = &inf->srcDef->outFlo; + xieFloConvertToRGB *raw = (xieFloConvertToRGB *)ped->elemRaw; + + /* Input must be triple band and dimensions must match */ + if (IsntCanonic(src->format[0].class) || + src->bands != 3 || + src->format[0].width != src->format[1].width || + src->format[1].width != src->format[2].width || + src->format[0].height != src->format[1].height || + src->format[1].height != src->format[2].height) + MatchError(flo,ped, return(FALSE)); + + + /* + ** Technique Prep routine will complete the normal propagation of src + ** attributes, and setup of destination attributes. + */ + + if (!(ped->techVec->prepfnc(flo, ped, raw, &raw[1]))) + TechniqueError(flo,ped,xieValConvertToRGB, + raw->convert,raw->lenParams, return(FALSE)); + + + return (TRUE); +} + +/*------------------------------------------------------------------------ +---------------------- utility routines for parameters ------------------- +------------------------------------------------------------------------*/ + +void +swap_floats(doubles_out, funny_floats_in, cnt) + double *doubles_out; + xieTypFloat *funny_floats_in; + int cnt; +{ + int m; + for (m = 0; m < cnt; m++) + doubles_out[m] = ConvertFromIEEE(lswapl(funny_floats_in[m])); +} + +void +copy_floats(doubles_out, funny_floats_in, cnt) + double *doubles_out; + xieTypFloat *funny_floats_in; + int cnt; +{ + int m; + for (m = 0; m < cnt; m++) + doubles_out[m] = ConvertFromIEEE(funny_floats_in[m]); +} + +/* end module pctrgb.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/pdither.c b/xie/xc/programs/Xserver/XIE/dixie/process/pdither.c new file mode 100644 index 0000000..9df514a --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/pdither.c @@ -0,0 +1,303 @@ +/* $XConsortium: pdither.c,v 1.6 94/04/17 20:33:45 rws Exp $ */ +/**** module pdither.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + pdither.c -- DIXIE routines for managing the Dither element + + Larry Hare -- AGE Logic, Inc. May 1993 + +*****************************************************************************/ + +#define _XIEC_PDITHER + +/* + * Include files + */ +#include + + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include + + +/* + * routines referenced by other modules + */ +peDefPtr MakeDither(); + +Bool CopyPDitherErrorDiffusion(); +Bool PrepPDitherErrorDiffusion(); + +Bool CopyPDitherOrdered(); +Bool PrepPDitherOrdered(); + +/* + * routines internal to this module + */ +static Bool PrepPDither(); +static Bool PrepPDitherStandard(); + +/* + * dixie element entry points + */ +static diElemVecRec pDitherVec = { + PrepPDither /* prepare for analysis and execution */ + }; + +/*------------------------------------------------------------------------ +-------------------- routine: make a dither element ------------------ +------------------------------------------------------------------------*/ +peDefPtr MakeDither(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + ELEMENT(xieFloDither); + ELEMENT_AT_LEAST_SIZE(xieFloDither); + ELEMENT_NEEDS_1_INPUT(src); + + if(!(ped = MakePEDef(1, (CARD32)stuff->elemLength<<2, 0))) + FloAllocError(flo,tag,xieElemDither, return(NULL)) ; + + ped->diVec = &pDitherVec; + ped->phototag = tag; + ped->flags.process = TRUE; + raw = (xieFloDither *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + raw->bandMask = stuff->bandMask; + cpswapl(stuff->levels0, raw->levels0); + cpswapl(stuff->levels1, raw->levels1); + cpswapl(stuff->levels2, raw->levels2); + cpswaps(stuff->lenParams, raw->lenParams); + cpswaps(stuff->dither, raw->dither); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloDither)); + /* + * copy technique data (if any) + */ + if(!(ped->techVec = FindTechnique(xieValDither, raw->dither)) || + !(ped->techVec->copyfnc(flo, ped, &stuff[1], &raw[1], raw->lenParams, + raw->dither == xieValDefault))) + TechniqueError(flo,ped,xieValDither,raw->dither,raw->lenParams, + return(ped)); + + /* + * assign phototag to inFlo + */ + ped->inFloLst[SRCtag].srcTag = raw->src; + + + return(ped); +} /* end MakePDither */ + +/*------------------------------------------------------------------------ +---------------- routine: copy routine for no Error Diffusion technique -- +------------------------------------------------------------------------*/ + +Bool CopyPDitherErrorDiffusion(flo, ped, sparms, rparms, tsize, isDefault) + floDefPtr flo; + peDefPtr ped; + pointer sparms, rparms; + CARD16 tsize; + Bool isDefault; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, isDefault); + + return(tsize == 0); +} + +/*------------------------------------------------------------------------ +---------------- routine: copy routine for Ordered techniques --------- +------------------------------------------------------------------------*/ + +Bool CopyPDitherOrdered(flo, ped, sparms, rparms, tsize, isDefault) + floDefPtr flo; + peDefPtr ped; + xieTecDitherOrdered *sparms, *rparms; + CARD16 tsize; + Bool isDefault; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, isDefault); + + if (tsize) + rparms->thresholdOrder = sparms->thresholdOrder; + else + rparms->thresholdOrder = 4; + + return(TRUE); +} + +/*------------------------------------------------------------------------ +---------------- routine: prep routine for no param techniques ------------- +------------------------------------------------------------------------*/ +static +Bool PrepPDitherStandard(flo, ped, raw, tec) + floDefPtr flo; + peDefPtr ped; + pointer raw, tec; +{ + return(TRUE); +} + +/*------------------------------------------------------------------------ +---------------- routine: prep routine for Error Diffusion techniques ---- +------------------------------------------------------------------------*/ +Bool PrepPDitherErrorDiffusion(flo, ped, raw, tec) + floDefPtr flo; + peDefPtr ped; + xieFloDither *raw; + pointer tec; +{ + return PrepPDitherStandard(flo, ped, (pointer) raw, tec); +} + +/*------------------------------------------------------------------------ +---------------- routine: prep routine for Ordered technique ------------- +------------------------------------------------------------------------*/ +Bool PrepPDitherOrdered(flo, ped, raw, tec) + floDefPtr flo; + peDefPtr ped; + xieFloDither *raw; + xieTecDitherOrdered *tec; +{ + return PrepPDitherStandard(flo, ped, (pointer) raw, (pointer) tec); +} + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ + +static Bool PrepPDither(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + inFloPtr inf = &ped->inFloLst[SRCtag]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + xieFloDither *raw = (xieFloDither *)ped->elemRaw; + CARD32 *levels = &(raw->levels0); + int b; + + /* grab a copy of the src attributes and propagate them to our input */ + dst->bands = inf->bands = src->bands; + for(b = 0; b < src->bands; b++) { + + dst->format[b] = inf->format[b] = src->format[b]; + + if ((raw->bandMask & (1<format[b].class) && + src->format[b].class == BIT_PIXEL) + MatchError(flo, ped, return(FALSE)); + + if ((dst->format[b].levels = *(levels+b)) > src->format[b].levels) + ValueError(flo,ped,*(levels+b),return(FALSE)); + } + + /* Set depth, class, stride, and pitch */ + if (UpdateFormatfromLevels(ped) == FALSE) + MatchError(flo,ped, return(FALSE)); + + /* Take care of any technique parameters */ + if (!(ped->techVec->prepfnc(flo, ped, raw, &raw[1]))) + TechniqueError(flo,ped,xieValDither,raw->dither,raw->lenParams, + return(FALSE)); + + return (TRUE); +} + +/* end module pdither.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/pgeom.c b/xie/xc/programs/Xserver/XIE/dixie/process/pgeom.c new file mode 100644 index 0000000..48d1395 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/pgeom.c @@ -0,0 +1,421 @@ +/* $XConsortium: pgeom.c,v 1.5 94/04/17 20:33:46 rws Exp $ */ +/**** module pgeom.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + pgeom.c -- DIXIE routines for managing the Geometry element + + Ben Fahy -- AGE Logic, Inc. June 1993 + +*****************************************************************************/ + +#define _XIEC_PGEOM + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include + + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeGeometry(); +Bool CopyGeomNearestNeighbor(); +Bool PrepGeomNearestNeighbor(); +Bool CopyGeomAntiAlias(); +Bool PrepGeomAntiAlias(); + +#if XIE_FULL +Bool CopyGeomBilinearInterp(); +Bool PrepGeomBilinearInterp(); +Bool CopyGeomGaussian(); +Bool PrepGeomGaussian(); +#endif + +/* + * routines internal to this module + */ +static Bool PrepGeometry(); +static Bool CopyGeomNoParams(); + +/* + * dixie entry points + */ +static diElemVecRec pGeometryVec = { + PrepGeometry /* prepare for analysis and execution */ + }; + +/*------------------------------------------------------------------------ +----------------------- routine: make a convolution element -------------- +------------------------------------------------------------------------*/ +peDefPtr MakeGeometry(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + int inputs; + peDefPtr ped; + inFloPtr inFlo; + pGeomDefPtr pvt; + xieTypFloat *kptr; + int i; + ELEMENT(xieFloGeometry); + ELEMENT_AT_LEAST_SIZE(xieFloGeometry); + ELEMENT_NEEDS_1_INPUT(src); + inputs = 1; + + + if(!(ped = MakePEDef(inputs, (CARD32)stuff->elemLength<<2, + sizeof(pGeomDefRec)))) + FloAllocError(flo, tag, xieElemGeometry, return(NULL)); + + ped->diVec = &pGeometryVec; + ped->phototag = tag; + ped->flags.process = TRUE; + raw = (xieFloGeometry *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + raw->bandMask = stuff->bandMask; + cpswapl(stuff->width, raw->width); + cpswapl(stuff->height, raw->height); + cpswaps(stuff->sample, raw->sample); + cpswaps(stuff->lenParams, raw->lenParams); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloGeometry)); + + /* Copy over and convert the floating point stuff */ + kptr = (xieTypFloat *)&stuff->a; + pvt = (pGeomDefPtr)ped->elemPvt; + + if (flo->reqClient->swapped) { + for (i = 0; i < 6; ++kptr, ++i) + pvt->coeffs[i] = ConvertFromIEEE(lswapl(*kptr)); + for (i = 0; i < xieValMaxBands; ++kptr, ++i) + pvt->constant[i] = ConvertFromIEEE(lswapl(*kptr)); + } else { + for (i = 0; i < 6; i++) + pvt->coeffs[i] = ConvertFromIEEE(*kptr++); + for (i = 0; i < xieValMaxBands; i++) + pvt->constant[i] = ConvertFromIEEE(*kptr++); + } + /* + * copy technique data (if any) + */ + if(!(ped->techVec = FindTechnique(xieValGeometry, raw->sample)) || + !(ped->techVec->copyfnc(flo, ped, &stuff[1], &raw[1], raw->lenParams, + raw->sample == xieValDefault))) + TechniqueError(flo,ped,xieValGeometry,raw->sample,raw->lenParams, + return(ped)); + + /* + * assign phototags to inFlos + */ + inFlo = ped->inFloLst; + inFlo[SRCtag].srcTag = raw->src; + + return(ped); +} /* end MakeGeometry */ + +/*------------------------------------------------------------------------ +----------- routine: copy routine for NearestNeighbor technique --------- +------------------------------------------------------------------------*/ + +Bool CopyGeomNearestNeighbor(flo, ped, sparms, rparms, tsize, isDefault) + floDefPtr flo; + peDefPtr ped; + xieTecGeomNearestNeighbor *sparms, *rparms; + CARD16 tsize; + Bool isDefault; +{ + pTecGeomNearestNeighborDefPtr pvt; + + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, isDefault); + + if (!(ped->techPvt=(pointer ) + XieMalloc(sizeof(pTecGeomNearestNeighborDefRec)))) + FloAllocError(flo, ped->phototag, xieElemGeometry, return(TRUE)); + + pvt = (pTecGeomNearestNeighborDefPtr)ped->techPvt; + + /* + * Nearest Neighbor can be called with no parameters + */ + if (isDefault) + pvt->modify = xieValFavorUp; + else + pvt->modify = sparms->modify; + + return (TRUE); +} + +#if XIE_FULL +/*------------------------------------------------------------------------ +------ routine: copy routine for bilinear interpolation technique -------- +------------------------------------------------------------------------*/ + +Bool CopyGeomBilinearInterp(flo, ped, sparms, rparms, tsize, isDefault) + floDefPtr flo; + peDefPtr ped; + pointer sparms, rparms; + CARD16 tsize; + Bool isDefault; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, isDefault); + + return( CopyGeomNoParams(flo, ped, sparms, rparms, tsize, isDefault) ); +} +/*------------------------------------------------------------------------ +------ routine: copy routine for gaussian interpolation technique -------- +------------------------------------------------------------------------*/ +Bool CopyGeomGaussian(flo, ped, sparms, rparms, tsize, isDefault) + floDefPtr flo; + peDefPtr ped; + xieTecGeomGaussian *sparms, *rparms; + CARD16 tsize; + Bool isDefault; +{ + pTecGeomGaussianDefPtr pvt; + + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, isDefault); + + if (!(ped->techPvt=(pointer )XieMalloc(sizeof(pTecGeomGaussianDefRec)))) + FloAllocError(flo, ped->phototag, xieElemGeometry, return(TRUE)); + + pvt = (pTecGeomGaussianDefPtr)ped->techPvt; + + if( flo->reqClient->swapped ) { + pvt->sigma = ConvertFromIEEE(lswapl(sparms->sigma)); + pvt->normalize = ConvertFromIEEE(lswapl(sparms->normalize)); + } else { + pvt->sigma = ConvertFromIEEE(sparms->sigma); + pvt->normalize = ConvertFromIEEE(sparms->normalize); + } + pvt->radius = sparms->radius; + pvt->simple = sparms->simple; + + if (pvt->radius < 1) + return(FALSE); + + if (pvt->sigma == 0.0) + return(FALSE); /* musn't divide by zero, deary */ + + if (pvt->normalize <= 0.0) + return(FALSE); /* don't want to bother clipping pixels < 0 */ + + return (TRUE); +} +#endif + +/*------------------------------------------------------------------------ +------ routine: copy routine for antialias technique -------- +------------------------------------------------------------------------*/ + +Bool CopyGeomAntiAlias(flo, ped, sparms, rparms, tsize, isDefault) + floDefPtr flo; + peDefPtr ped; + pointer sparms, rparms; + CARD16 tsize; + Bool isDefault; +{ + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, isDefault); + + return( CopyGeomNoParams(flo, ped, sparms, rparms, tsize, isDefault) ); +} + +/*------------------------------------------------------------------------ +------------ routine: copy routine for techniques with no params -------- +------------------------------------------------------------------------*/ +static Bool CopyGeomNoParams(flo, ped, sparms, rparms, tsize, isDefault) + floDefPtr flo; + peDefPtr ped; + pointer sparms, rparms; + CARD16 tsize; + Bool isDefault; +{ + return(tsize == 0); +} + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepGeometry(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloGeometry *raw = (xieFloGeometry *)ped->elemRaw; + inFloPtr in = &ped->inFloLst[SRCtag]; + outFloPtr src = &in->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + pGeomDefPtr pvt = (pGeomDefPtr)ped->elemPvt; + CARD32 b, bits; + + /* grab a copy of the input attributes and propagate them to our output */ + dst->bands = in->bands = src->bands; + + for(b = 0; b < dst->bands; b++) { + if (IsntCanonic(src->format[b].class)) + MatchError(flo, ped, return(FALSE)); + + dst->format[b] = in->format[b] = src->format[b]; + pvt->do_band[b] = (dst->bands==1)? 1 : raw->bandMask & (1<do_band[b]) { + dst->format[b].width = raw->width; + dst->format[b].height = raw->height; + } + bits = dst->format[b].width * dst->format[b].stride; + dst->format[b].pitch = bits + Align(bits,PITCH_MOD); + } + + if(!(ped->techVec->prepfnc(flo, ped, raw, &raw[1]))) { + TechniqueError(flo,ped,xieValGeometry,raw->sample,raw->lenParams, + return(FALSE)); + } + + return( TRUE ); +} /* end PrepGeometry */ + +/*------------------------------------------------------------------------ +---------------- routine: prep routine for nearest neighbor -------------- +------------------------------------------------------------------------*/ +Bool PrepGeomNearestNeighbor(flo, ped, raw, tec) + floDefPtr flo; + peDefPtr ped; + xieFloGeometry *raw; + pointer tec; +{ + return(TRUE); +} + +#if XIE_FULL +/*------------------------------------------------------------------------ +---------- routine: prep routine for bilinear interpolation -------------- +------------------------------------------------------------------------*/ +Bool PrepGeomBilinearInterp(flo, ped, raw, tec) + floDefPtr flo; + peDefPtr ped; + xieFloGeometry *raw; + pointer tec; +{ + return(TRUE); +} +/*------------------------------------------------------------------------ +---------- routine: prep routine for gaussian ---------------------------- +------------------------------------------------------------------------*/ +Bool PrepGeomGaussian(flo, ped, raw, tec) + floDefPtr flo; + peDefPtr ped; + xieFloGeometry *raw; + pointer tec; +{ + return(TRUE); +} +#endif + +/*------------------------------------------------------------------------ +---------- routine: prep routine for antialias --------------------------- +------------------------------------------------------------------------*/ +Bool PrepGeomAntiAlias(flo, ped, raw, tec) + floDefPtr flo; + peDefPtr ped; + xieFloGeometry *raw; + pointer tec; +{ + return(TRUE); +} + +/* end module pgeom.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/phist.c b/xie/xc/programs/Xserver/XIE/dixie/process/phist.c new file mode 100644 index 0000000..5a5b390 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/phist.c @@ -0,0 +1,333 @@ +/* $XConsortium: phist.c,v 1.4 94/04/17 20:33:46 rws Exp $ */ +/**** module phist.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + phist.c -- DIXIE routines for managing the MatchHistogram element + + Dean Verheiden -- AGE Logic, Inc. August 1993 + +*****************************************************************************/ + +#define _XIEC_PHIST + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeMatchHistogram(); + +/* + * routines internal to this module + */ +static Bool PrepMatchHistogram(); + +/* + * dixie entry points + */ +static diElemVecRec pMatchHistogramVec = +{ + PrepMatchHistogram /* prepare for analysis and execution */ +}; + + +/*------------------------------------------------------------------------ +----------------- routine: make a match histogram element ---------------- +------------------------------------------------------------------------*/ +peDefPtr MakeMatchHistogram(flo,tag,pe) +floDefPtr flo; +xieTypPhototag tag; +xieFlo *pe; +{ + int inputs; + peDefPtr ped; + inFloPtr inFlo; + ELEMENT(xieFloMatchHistogram); + ELEMENT_AT_LEAST_SIZE(xieFloMatchHistogram); + ELEMENT_NEEDS_1_INPUT(src); + + inputs = 1 + (stuff->domainPhototag ? 1 : 0); + + if (!(ped = MakePEDef(inputs, (CARD32)stuff->elemLength<<2, 0))) + FloAllocError(flo, tag, xieElemMatchHistogram, return(NULL)); + + ped->diVec = &pMatchHistogramVec; + ped->phototag = tag; + ped->flags.process = TRUE; + raw = (xieFloMatchHistogram *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if (flo->reqClient->swapped) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + cpswapl(stuff->domainOffsetX, raw->domainOffsetX); + cpswapl(stuff->domainOffsetY, raw->domainOffsetY); + cpswaps(stuff->domainPhototag,raw->domainPhototag); + cpswaps(stuff->shape,raw->shape); + cpswaps(stuff->lenParams,raw->lenParams); + } else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloMatchHistogram)); + /* + * copy technique data (if any) + */ + if(!(ped->techVec = FindTechnique(xieValHistogram, raw->shape)) || + !(ped->techVec->copyfnc(flo, ped, &stuff[1], &raw[1], raw->lenParams))) + TechniqueError(flo,ped,xieValHistogram,raw->shape,raw->lenParams, + return(ped)); + + + /* assign phototags to inFlos */ + inFlo = ped->inFloLst; + inFlo[SRCtag].srcTag = raw->src; + if(raw->domainPhototag) + inFlo[ped->inCnt-1].srcTag = raw->domainPhototag; + return ped; +} /* end MakeMatchHistogram */ + +/*------------------------------------------------------------------------ +------------------- routine: copy routine for Flat technique ------------ +------------------------------------------------------------------------*/ + +Bool CopyPHistogramFlat(flo, ped, sparms, rparms, tsize) +floDefPtr flo; +peDefPtr ped; +pointer sparms, rparms; +CARD16 tsize; +{ + return (tsize == 0); +} + +/*------------------------------------------------------------------------ +---------------- routine: copy routine for Gaussian technique ----------- +------------------------------------------------------------------------*/ + +Bool CopyPHistogramGaussian(flo, ped, sparms, rparms, tsize) +floDefPtr flo; +peDefPtr ped; +xieTecHistogramGaussian *sparms, *rparms; +CARD16 tsize; +{ + pTecHistogramGaussianDefPtr pvt; + + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + if (!(ped->techPvt = + (pointer )XieMalloc(sizeof(pTecHistogramGaussianDefRec)))) + FloAllocError(flo, ped->phototag, xieElemMatchHistogram, return(TRUE)); + + pvt = (pTecHistogramGaussianDefPtr)ped->techPvt; + + if( flo->reqClient->swapped ) { + pvt->mean = ConvertFromIEEE(lswapl(sparms->mean)); + pvt->sigma = ConvertFromIEEE(lswapl(sparms->sigma)); + } else { + pvt->mean = ConvertFromIEEE(sparms->mean); + pvt->sigma = ConvertFromIEEE(sparms->sigma); + } + + return (TRUE); +} + +/*------------------------------------------------------------------------ +-------------- routine: copy routine for Hyperbolic technique ----------- +------------------------------------------------------------------------*/ + +Bool CopyPHistogramHyperbolic(flo, ped, sparms, rparms, tsize) +floDefPtr flo; +peDefPtr ped; +xieTecHistogramHyperbolic *sparms, *rparms; +CARD16 tsize; +{ + pTecHistogramHyperbolicDefPtr pvt; + + VALIDATE_TECHNIQUE_SIZE(ped->techVec, tsize, FALSE); + + if (!(ped->techPvt = + (pointer )XieMalloc(sizeof(pTecHistogramHyperbolicDefRec)))) + FloAllocError(flo, ped->phototag, xieElemMatchHistogram, return(TRUE)); + + pvt = (pTecHistogramHyperbolicDefPtr)ped->techPvt; + + pvt->shapeFactor = sparms->shapeFactor; + if( flo->reqClient->swapped ) { + pvt->constant = ConvertFromIEEE(lswapl(sparms->constant)); + } else { + pvt->constant = ConvertFromIEEE(sparms->constant); + } + + return (TRUE); +} + +/*------------------------------------------------------------------------ +---------------- routine: prep routine for Gaussian technique ------------ +------------------------------------------------------------------------*/ +Bool PrepPHistogramFlat(flo, ped) + floDefPtr flo; + peDefPtr ped; +{ + return(TRUE); +} + +/*------------------------------------------------------------------------ +---------------- routine: prep routine for Gaussian technique ------------ +------------------------------------------------------------------------*/ +Bool PrepPHistogramGaussian(flo, ped) + floDefPtr flo; + peDefPtr ped; +{ + if (((pTecHistogramGaussianDefPtr)ped->techPvt)->sigma <= 0) + return(FALSE); + + return(TRUE); +} + +/*------------------------------------------------------------------------ +---------------- routine: prep routine for Hyperbolic technique ---------- +------------------------------------------------------------------------*/ +Bool PrepPHistogramHyperbolic(flo, ped) + floDefPtr flo; + peDefPtr ped; +{ + double constant = ((pTecHistogramHyperbolicDefPtr)ped->techPvt)->constant; + + if (constant >= -1 && constant <= 0) + return(FALSE); + + return(TRUE); +} + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepMatchHistogram(flo,ped) +floDefPtr flo; +peDefPtr ped; +{ + xieFloMatchHistogram *raw = (xieFloMatchHistogram *)ped->elemRaw; + inFloPtr ind, in = &ped->inFloLst[SRCtag]; + outFloPtr src = &in->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + + /* make sure source parameters are legal for MatchHistogram */ + if (IsntConstrained(src->format[0].class) || + src->format[0].class == BIT_PIXEL || + src->bands != 1) + MatchError(flo,ped, return(FALSE)); + + /* check out our process domain */ + if(raw->domainPhototag) { + outFloPtr dom; + + ind = &ped->inFloLst[ped->inCnt-1]; + dom = &ind->srcDef->outFlo; + if((ind->bands = dom->bands) != 1 || IsntDomain(dom->format[0].class)) + DomainError(flo,ped,raw->domainPhototag, return(FALSE)); + ind->format[0] = dom->format[0]; + } + + /* grab a copy of the input attributes and propagate them to output */ + dst->bands = in->bands = src->bands; + dst->format[0] = in->format[0] = src->format[0]; + + /* Take care of any technique parameters */ + if (!(ped->techVec->prepfnc(flo, ped))) + TechniqueError(flo,ped,xieValHistogram,raw->shape,raw->lenParams, + return(FALSE)); + + return (TRUE); +} /* end PrepMatchHistogram */ + +/* end module phist.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/plogic.c b/xie/xc/programs/Xserver/XIE/dixie/process/plogic.c new file mode 100644 index 0000000..b14bd6d --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/plogic.c @@ -0,0 +1,271 @@ +/* $XConsortium: plogic.c,v 1.4 94/04/17 20:33:49 rws Exp $ */ +/**** module plogic.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + plogic.c -- DIXIE routines for managing the Logical element + + Robert NC Shelley -- AGE Logic, Inc. April 1993 + +*****************************************************************************/ + +#define _XIEC_PLOGIC + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeLogic(); + +/* + * routines internal to this module + */ +static Bool PrepLogic(); + +/* + * dixie entry points + */ +static diElemVecRec pLogicVec = +{ + PrepLogic /* prepare for analysis and execution */ +}; + + +/*------------------------------------------------------------------------ +----------------------- routine: make a logical element -------------------- +------------------------------------------------------------------------*/ +peDefPtr MakeLogic(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + int inputs; + peDefPtr ped; + inFloPtr inFlo; + pLogicDefPtr pvt; + ELEMENT(xieFloLogical); + ELEMENT_SIZE_MATCH(xieFloLogical); + ELEMENT_NEEDS_1_INPUT(src1); + + inputs = 1 + (stuff->src2 ? 1 : 0) + (stuff->domainPhototag ? 1 :0); + + if (!(ped = + MakePEDef(inputs, (CARD32)stuff->elemLength<<2, sizeof(pLogicDefRec)))) + FloAllocError(flo, tag, xieElemLogical, return(NULL)); + + ped->diVec = &pLogicVec; + ped->phototag = tag; + ped->flags.process = TRUE; + raw = (xieFloLogical *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if (flo->reqClient->swapped) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src1, raw->src1); + cpswaps(stuff->src2, raw->src2); + cpswapl(stuff->domainOffsetX, raw->domainOffsetX); + cpswapl(stuff->domainOffsetY, raw->domainOffsetY); + cpswaps(stuff->domainPhototag,raw->domainPhototag); + raw->operator = stuff->operator; + raw->bandMask = stuff->bandMask; + cpswapl(stuff->constant0, raw->constant0); + cpswapl(stuff->constant1, raw->constant1); + cpswapl(stuff->constant2, raw->constant2); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloLogical)); + + if(!raw->src2) { + /* convert constants */ + pvt = (pLogicDefPtr)ped->elemPvt; + pvt->constant[0] = ConvertFromIEEE(raw->constant0); + pvt->constant[1] = ConvertFromIEEE(raw->constant1); + pvt->constant[2] = ConvertFromIEEE(raw->constant2); + } + /* assign phototags to inFlos */ + inFlo = ped->inFloLst; + inFlo[SRCt1].srcTag = raw->src1; + if (raw->src2) + inFlo[SRCt2].srcTag = raw->src2; + if(raw->domainPhototag) + inFlo[ped->inCnt-1].srcTag = raw->domainPhototag; + + return ped; +} /* end MakeLogic */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepLogic(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloLogical *raw = (xieFloLogical *)ped->elemRaw; + inFloPtr ind, in2, in1 = &ped->inFloLst[SRCt1]; + outFloPtr dom, sr2, sr1 = &in1->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + CARD8 bmask = raw->bandMask; + int b; + + if (IsntConstrained(sr1->format[0].class)) + MatchError(flo,ped, return(FALSE)); + + /* Make sure levels are a power of 2 */ + for (b = 0; b < sr1->bands; b++) + if ((bmask & (1<format[b].levels & (sr1->format[b].levels - 1))) + MatchError(flo,ped, return(FALSE)); + + /* check out our second source */ + if(raw->src2) { + in2 = &ped->inFloLst[SRCt2]; + sr2 = &in2->srcDef->outFlo; + if(sr1->bands != sr2->bands) + MatchError(flo,ped, return(FALSE)); + in2->bands = sr2->bands; + for (b = 0; b < sr1->bands; b++) { + if ((bmask & (1<format[b].class != sr2->format[b].class || + sr1->format[b].levels != sr2->format[b].levels) + MatchError(flo,ped, return(FALSE)); + } + } else + sr2 = NULL; + + /* check out our process domain */ + if(raw->domainPhototag) { + ind = &ped->inFloLst[ped->inCnt-1]; + dom = &ind->srcDef->outFlo; + if(IsntDomain(dom->format[0].class) || + (ind->bands = dom->bands) != 1) + DomainError(flo,ped,raw->domainPhototag, return(FALSE)); + ind->format[0] = dom->format[0]; + } else + dom = NULL; + + /* check out our operator */ + switch(raw->operator) { + case GXclear: /* 0x0 0 */ + case GXand: /* 0x1 src-1 AND src-2 */ + case GXandReverse: /* 0x2 src-1 AND (NOT src-2) */ + case GXcopy: /* 0x3 src-1 */ + case GXandInverted: /* 0x4 (NOT src-1) AND src-2 */ + case GXnoop: /* 0x5 src-2 */ + case GXxor: /* 0x6 src-1 XOR src-2 */ + case GXor: /* 0x7 src-1 OR src-2 */ + case GXnor: /* 0x8 (NOT src-1) AND (NOT src-2) */ + case GXequiv: /* 0x9 (NOT src-1) XOR src-2 */ + case GXinvert: /* 0xa NOT src-2 */ + case GXorInverted: /* 0xd (NOT src-1) OR src-2 */ + case GXorReverse: /* 0xb src-1 OR (NOT src-2) */ + case GXnand: /* 0xe (NOT src-1) OR (NOT src-2) */ + case GXset: /* 0xf 1 */ + case GXcopyInverted: /* 0xc NOT src-1 */ + break; + default: OperatorError(flo,ped,raw->operator, return(FALSE)); + } + + /* grab a copy of the input attributes and propagate them to output */ + dst->bands = in1->bands = sr1->bands; + for(b = 0; b < dst->bands; b++) { + dst->format[b] = in1->format[b] = sr1->format[b]; + if(sr2) + in2->format[b] = sr2->format[b]; + } + return TRUE; +} /* end PrepLogic */ + +/* end module plogic.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/pmath.c b/xie/xc/programs/Xserver/XIE/dixie/process/pmath.c new file mode 100644 index 0000000..e912c3b --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/pmath.c @@ -0,0 +1,222 @@ +/* $XConsortium: pmath.c,v 1.3 94/04/17 20:33:50 rws Exp $ */ +/**** module pmath.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + pmath.c -- DIXIE routines for managing the Math element + + Dean Verheiden -- AGE Logic, Inc. July 1993 + +*****************************************************************************/ + +#define _XIEC_PMATH + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeMath(); + +/* + * routines internal to this module + */ +static Bool PrepMath(); + +/* + * dixie entry points + */ +static diElemVecRec pMathVec = +{ + PrepMath /* prepare for analysis and execution */ +}; + + +/*------------------------------------------------------------------------ +----------------------- routine: make a math element -------------------- +------------------------------------------------------------------------*/ +peDefPtr MakeMath(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + int inputs; + peDefPtr ped; + inFloPtr inFlo; + ELEMENT(xieFloMath); + ELEMENT_SIZE_MATCH(xieFloMath); + ELEMENT_NEEDS_1_INPUT(src); + + inputs = 1 + (stuff->domainPhototag ? 1 :0); + + if (!(ped = MakePEDef(inputs, (CARD32)stuff->elemLength<<2, 0))) + FloAllocError(flo, tag, xieElemMath, return(NULL)); + + ped->diVec = &pMathVec; + ped->phototag = tag; + ped->flags.process = TRUE; + raw = (xieFloMath *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if (flo->reqClient->swapped) + { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + cpswapl(stuff->domainOffsetX, raw->domainOffsetX); + cpswapl(stuff->domainOffsetY, raw->domainOffsetY); + cpswaps(stuff->domainPhototag,raw->domainPhototag); + raw->operator = stuff->operator; + raw->bandMask = stuff->bandMask; + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloMath)); + + /* assign phototags to inFlos */ + inFlo = ped->inFloLst; + inFlo[SRCt1].srcTag = raw->src; + if(raw->domainPhototag) + inFlo[ped->inCnt-1].srcTag = raw->domainPhototag; + return ped; +} /* end MakeMath */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepMath(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloMath *raw = (xieFloMath *)ped->elemRaw; + inFloPtr ind, in = &ped->inFloLst[SRCt1]; + outFloPtr src = &in->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + int b; + + /* make sure input is not bitonal */ + for (b = 0; b < src->bands; b++) + if (IsntCanonic(src->format[b].class) || + ((raw->bandMask & (1<format[b].class == BIT_PIXEL)) + MatchError(flo,ped, return(FALSE)); + + + /* check out our process domain */ + if(raw->domainPhototag) { + outFloPtr dom; + + ind = &ped->inFloLst[ped->inCnt-1]; + dom = &ind->srcDef->outFlo; + if(IsntDomain(dom->format[0].class) || + (ind->bands = dom->bands) != 1) + DomainError(flo,ped,raw->domainPhototag, return(FALSE)); + ind->format[0] = dom->format[0]; + } + + /* grab a copy of the input attributes and propagate them to output */ + dst->bands = in->bands = src->bands; + for(b = 0; b < dst->bands; b++) + dst->format[b] = in->format[b] = src->format[b]; + + switch(raw->operator) { + case xieValExp: break; + case xieValLn: break; + case xieValLog2: break; + case xieValLog10: break; + case xieValSquare: break; + case xieValSqrt: break; + default: OperatorError(flo,ped,raw->operator,return(FALSE)); + } + return (TRUE); +} /* end PrepMath */ + +/* end module pmath.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/ppaste.c b/xie/xc/programs/Xserver/XIE/dixie/process/ppaste.c new file mode 100644 index 0000000..4c81b11 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/ppaste.c @@ -0,0 +1,260 @@ +/* $XConsortium: ppaste.c,v 1.4 94/04/17 20:33:50 rws Exp $ */ +/**** module ppaste.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + ppaste.c -- DIXIE routines for managing the PasteUp element + + Dean Verheiden -- AGE Logic, Inc. June 1993 + +*****************************************************************************/ + +#define _XIEC_PPASTE + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakePasteUp(); + +/* + * routines internal to this module + */ +static Bool PrepPasteUp(); + +/* + * dixie entry points + */ +static diElemVecRec pPasteUpVec = { + PrepPasteUp /* prepare for analysis and execution */ + }; + + +/*------------------------------------------------------------------------ +----------------------- routine: make a arithmetic element -------------------- +------------------------------------------------------------------------*/ +peDefPtr MakePasteUp(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + int t; + CARD16 inputs; + peDefPtr ped; + inFloPtr inFlo; + pPasteUpDefPtr pvt; + xieTypTile *rp; + ELEMENT(xieFloPasteUp); + ELEMENT_AT_LEAST_SIZE(xieFloPasteUp); + ELEMENT_NEEDS_1_INPUT(numTiles); + + if ( flo->reqClient->swapped ) { + cpswaps(stuff->numTiles, inputs); + } else + inputs = stuff->numTiles; + + if(!(ped = MakePEDef((CARD32)inputs, (CARD32)stuff->elemLength<<2, + sizeof(pPasteUpDefRec)))) + FloAllocError(flo, tag, xieElemPasteUp, return(NULL)); + + ped->diVec = &pPasteUpVec; + ped->phototag = tag; + ped->flags.process = TRUE; + raw = (xieFloPasteUp *)ped->elemRaw; + rp = (xieTypTile *) &(raw[1]); + /* + * copy the client element parameters (swap if necessary) + */ + + if( flo->reqClient->swapped ) { + xieTypTile *sp = (xieTypTile *) &(stuff[1]); + + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + /* We already did this one */ + raw->numTiles = inputs; + cpswapl(stuff->width, raw->width); + cpswapl(stuff->height, raw->height); + cpswapl(stuff->constant0, raw->constant0); + cpswapl(stuff->constant1, raw->constant1); + cpswapl(stuff->constant2, raw->constant2); + for (t = 0; t < inputs; t++) { + cpswaps(sp[t].src, rp[t].src); + cpswapl(sp[t].dstX, rp[t].dstX); + cpswapl(sp[t].dstY, rp[t].dstY); + } + } + else + memcpy((char *)raw, (char *)stuff, (CARD32)stuff->elemLength<<2); + + /* + * convert constants + */ + pvt = (pPasteUpDefPtr)ped->elemPvt; + pvt->constant[0] = ConvertFromIEEE(raw->constant0); + pvt->constant[1] = ConvertFromIEEE(raw->constant1); + pvt->constant[2] = ConvertFromIEEE(raw->constant2); + + /* + * assign phototags to inFlos + */ + inFlo = ped->inFloLst; + + for (t = 0; t < inputs; t++) + inFlo[t].srcTag = rp[t].src; + + return(ped); +} /* end MakePasteUp */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepPasteUp(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloPasteUp *raw = (xieFloPasteUp *)ped->elemRaw; + inFloPtr in = &ped->inFloLst[0]; + outFloPtr src = &in->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + int b, t; + + /* Grab a copy of the input attributes and propagate them to our output. + * Use the first input as a template, all attributes must match except for + * width (and pitch) and height. + */ + + dst->bands = in->bands = src->bands; + + if (raw->numTiles <= 0) + SourceError(flo,ped, return(FALSE)); + + for(b = 0; b < dst->bands; b++) { + CARD32 bits; + if (IsntCanonic(src->format[b].class)) + MatchError(flo,ped,return(FALSE)); + dst->format[b] = in->format[b] = src->format[b]; + dst->format[b].width = bits = raw->width; + dst->format[b].height = raw->height; + bits *= dst->format[b].stride; + dst->format[b].pitch = bits + Align(bits,PITCH_MOD); + } + + /* Compare the remaining tiles to ensure all attibutes that must match do */ + for (t = 1; t < raw->numTiles; t++) { + in = &ped->inFloLst[t]; + src = &in->srcDef->outFlo; + + if (src->bands != dst->bands) { + MatchError(flo,ped,return(FALSE)); + } else + in->bands = src->bands; + + for(b = 0; b < dst->bands; b++) { + formatRec *df = &(dst->format[b]); + formatRec *srf = &(src->format[b]); + if ( srf->class != df->class || + srf->depth != df->depth || + srf->levels != df->levels || + srf->stride != df->stride) { + MatchError(flo,ped,return(FALSE)); + } + in->format[b] = src->format[b]; + } + } + + return( TRUE ); +} /* end PrepPasteUp */ + +/* end module ppaste.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/ppoint.c b/xie/xc/programs/Xserver/XIE/dixie/process/ppoint.c new file mode 100644 index 0000000..e601398 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/ppoint.c @@ -0,0 +1,315 @@ +/* $XConsortium: ppoint.c,v 1.4 94/04/17 20:33:51 rws Exp $ */ +/**** module ppoint.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + ppoint.c -- DIXIE routines for managing the Point element + + Robert NC Shelley -- AGE Logic, Inc. April 1993 + Ben Fahy -- AGE Logic, Inc. May 1993 + +*****************************************************************************/ + +#define _XIEC_PPOINT +#define _XIEC_POINT + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakePoint(); + +/* + * routines internal to this module + */ +static Bool PrepPoint(); + +/* + * dixie entry points + */ +static diElemVecRec pPointVec = { + PrepPoint /* prepare for analysis and execution */ + }; + + +/*------------------------------------------------------------------------ +----------------------- routine: make a point element -------------------- +------------------------------------------------------------------------*/ +peDefPtr MakePoint(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + int inputs; + peDefPtr ped; + inFloPtr inFlo; + ELEMENT(xieFloPoint); + ELEMENT_SIZE_MATCH(xieFloPoint); + ELEMENT_NEEDS_2_INPUTS(src,lut); + inputs = stuff->domainPhototag ? 3 : 2; + + if(!(ped = MakePEDef(inputs, (CARD32)stuff->elemLength<<2, 0))) + FloAllocError(flo,tag,xieElemPoint, return(NULL)) ; + + ped->diVec = &pPointVec; + ped->phototag = tag; + ped->flags.process = TRUE; + raw = (xieFloPoint *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + cpswaps(stuff->lut, raw->lut); + cpswapl(stuff->domainOffsetX, raw->domainOffsetX); + cpswapl(stuff->domainOffsetY, raw->domainOffsetY); + cpswaps(stuff->domainPhototag,raw->domainPhototag); + raw->bandMask = stuff->bandMask; + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloPoint)); + /* + * assign phototags to inFlos + */ + inFlo = ped->inFloLst; + inFlo[SRCtag].srcTag = raw->src; + inFlo[LUTtag].srcTag = raw->lut; + if(raw->domainPhototag) +#if XIE_FULL + inFlo[ped->inCnt-1].srcTag = raw->domainPhototag; +#else + DomainError(flo,ped,raw->domainPhototag, return(ped)); +#endif + + return(ped); +} /* end MakePoint */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepPoint(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloPoint *raw = (xieFloPoint *)ped->elemRaw; + + inFloPtr indom,inlut= &ped->inFloLst[LUTtag],insrc = &ped->inFloLst[SRCtag]; + outFloPtr outdom, outlut= &inlut->srcDef->outFlo, + outsrc= &insrc->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + int b; + + /* propage band attributes */ + insrc->bands = outsrc->bands; + inlut->bands = outlut->bands; + + dst->bands = outlut->bands; /* see V4.12 spec, page 6-2 */ + + /* if process domain src and lut class must match */ + if (raw->domainPhototag && insrc->bands != inlut->bands) + MatchError(flo,ped, return(FALSE)); + + /* check to make sure input image is constrained, and lut is a lut */ + if(IsntConstrained(outsrc->format[0].class) || + IsntLut(outlut->format[0].class) ) + MatchError(flo,ped, return(FALSE)); + + /* propagate outflo format of src to our inflo for src */ + for (b=0; bbands; ++b) + insrc->format[b] = outsrc->format[b]; + + /* propagate outflo format of lut to our inflo for lut */ + for (b=0; bbands; ++b) + inlut->format[b] = outlut->format[b]; + + /* do same with process domain, if it is specified */ + if(raw->domainPhototag) { + indom = &ped->inFloLst[ped->inCnt-1]; + outdom = &indom->srcDef->outFlo; + if(IsntDomain(outdom->format[0].class) || + (indom->bands = outdom->bands) != 1) + DomainError(flo,ped,raw->domainPhototag, return(FALSE)); + indom->format[0] = outdom->format[0]; + } else + outdom = NULL; + +/*** Painful enumeration of cases ***/ + + if (outlut->bands == 1 && outsrc->bands == 3) { + int level_product; + + /* Width and heights of all bands must match */ + if (insrc->format[0].width != insrc->format[1].width || + insrc->format[1].width != insrc->format[2].width || + insrc->format[0].height != insrc->format[1].height || + insrc->format[1].height != insrc->format[2].height) + MatchError(flo,ped, return(FALSE)); + + /* make tripleband src into CRAZY PIXELS! produce singleband */ + if ((raw->bandMask !=7) || (outdom != NULL)) + MatchError(flo,ped, return(FALSE)); /* see p7-25 of v4.12 spec */ + + /* check to make sure length of lut is sufficient */ + level_product = insrc->format[0].levels * + insrc->format[1].levels * + insrc->format[2].levels; + + if (inlut->format[0].height < level_product) + MatchError(flo,ped, return(FALSE)); + + dst->format[0] = insrc->format[0]; + dst->format[0].levels = inlut->format[0].levels; + if (!UpdateFormatfromLevels(ped)) + MatchError(flo,ped, return(FALSE)); + + } + + else if (outlut->bands == 3 && outsrc->bands == 1) { + /* apply lut for each band to src */ + + /* this variation does not support Domains. */ + if (outdom != NULL) + MatchError(flo,ped, return(FALSE)); + + /* destination format will be close to insrc, but not same */ + for(b = 0; b < dst->bands; b++) { + dst->format[b] = insrc->format[0]; + dst->format[b].band = b; + if ((raw->bandMask & (1<format[b].levels = inlut->format[b].levels; + if (inlut->format[b].height < insrc->format[0].levels) + MatchError(flo,ped, return(FALSE)); + } + if (!UpdateFormatfromLevels(ped)) + MatchError(flo,ped, return(FALSE)); + + } + + else if (outlut->bands == outsrc->bands && + (outlut->bands == 3 || outlut->bands == 1) ) { + + /* apply lut for each band to src of each band */ + + for(b = 0; b < dst->bands; b++) { + + dst->format[b] = insrc->format[b]; + if ((raw->bandMask & (1<format[b].levels = inlut->format[b].levels; + + /* check to make sure length of lut is sufficient */ + if (inlut->format[b].height < insrc->format[b].levels) + MatchError(flo,ped, return(FALSE)); + + /* if domain is used, lut levels must be == src levels */ + /* (or else we don't know what to do with pass-thru data */ + if (outdom != NULL) + if (inlut->format[b].levels != insrc->format[b].levels) + MatchError(flo,ped, return(FALSE)); + } + if (!UpdateFormatfromLevels(ped)) + MatchError(flo,ped, return(FALSE)); + + } + else { + /* is this possible? */ + ImplementationError(flo,ped,return(FALSE)); + } + + return(TRUE); +} /* end PrepPoint */ + +/* end module ppoint.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/process/puncnst.c b/xie/xc/programs/Xserver/XIE/dixie/process/puncnst.c new file mode 100644 index 0000000..eb2786f --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/process/puncnst.c @@ -0,0 +1,195 @@ +/* $XConsortium: puncnst.c,v 1.4 94/04/17 20:33:51 rws Exp $ */ +/**** module puncnst.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + puncnst.c -- DIXIE routines for managing the Unconstrain element + + Dean Verheiden -- AGE Logic, Inc. May 1993 + +*****************************************************************************/ + +#define _XIEC_PUNCNST + +/* + * Include files + */ +#include + /* + * Core X Includes + */ +#include +#include + /* + * XIE Includes + */ +#include +#include + /* + * more X server includes. + */ +#include +#include + /* + * Server XIE Includes + */ +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +peDefPtr MakeUnconstrain(); + +/* + * routines internal to this module + */ +static Bool PrepUnconstrain(); + +/* + * dixie entry points + */ +static diElemVecRec pUnconstrainVec = { + PrepUnconstrain /* prepare for analysis and execution */ + }; + + +/*------------------------------------------------------------------------ +----------------------- routine: make an unconstrain element ------------- +------------------------------------------------------------------------*/ +peDefPtr MakeUnconstrain(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + peDefPtr ped; + inFloPtr inFlo; + ELEMENT(xieFloUnconstrain); + ELEMENT_SIZE_MATCH(xieFloUnconstrain); + ELEMENT_NEEDS_1_INPUT(src); + + if(!(ped = MakePEDef(1, (CARD32)stuff->elemLength<<2, 0))) + FloAllocError(flo, tag, xieElemUnconstrain, return(NULL)); + + ped->diVec = &pUnconstrainVec; + ped->phototag = tag; + ped->flags.process = TRUE; + raw = (xieFloUnconstrain *)ped->elemRaw; + /* + * copy the client element parameters (swap if necessary) + */ + if( flo->reqClient->swapped ) { + raw->elemType = stuff->elemType; + raw->elemLength = stuff->elemLength; + cpswaps(stuff->src, raw->src); + } + else + memcpy((char *)raw, (char *)stuff, sizeof(xieFloUnconstrain)); + /* + * assign phototags to the inFlo + */ + inFlo = ped->inFloLst; + inFlo[SRCtag].srcTag = raw->src; + + return(ped); +} /* end MakeUnconstrain */ + + +/*------------------------------------------------------------------------ +---------------- routine: prepare for analysis and execution ------------- +------------------------------------------------------------------------*/ +static Bool PrepUnconstrain(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + inFloPtr inf = &ped->inFloLst[SRCtag]; + outFloPtr src = &inf->srcDef->outFlo; + outFloPtr dst = &ped->outFlo; + int b; + + /* grab a copy of the input attributes and propagate them to our output */ + dst->bands = inf->bands = src->bands; + for(b = 0; b < dst->bands; b++) { + /* All band formats should be the same but check anyway */ + if (IsntCanonic(src->format[b].class)) + MatchError(flo, ped, return(FALSE)); + + /* First, copy everything over */ + dst->format[b] = inf->format[b] = src->format[b]; + + /* Now, fix up everthing in the destination that will change */ + dst->format[b].class = UNCONSTRAINED; + dst->format[b].depth = sz_RealPixel; + dst->format[b].levels = 0; /* Unconstrained */ + dst->format[b].stride = sz_RealPixel; + dst->format[b].pitch = sz_RealPixel * dst->format[b].width; + } + return( TRUE ); +} /* end PrepUnconstrain */ + +/* end module puncnst.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/request/Imakefile b/xie/xc/programs/Xserver/XIE/dixie/request/Imakefile new file mode 100644 index 0000000..94ce817 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/request/Imakefile @@ -0,0 +1,30 @@ +XCOMM $XConsortium: Imakefile,v 1.4 93/11/06 15:55:34 rws Exp $ +XCOMM build device independent request objects +#include + +SRCS1 = difloat.c error.c event.c flo.c lut.c memory.c \ + photomap.c protoflo.c session.c tables.c technq.c +OBJS1 = difloat.o error.o event.o flo.o lut.o memory.o \ + photomap.o protoflo.o session.o tables.o technq.o + +#if BuildDIS +DEFINES = -DXIE_DIS +#else +SRCS2 = colorlst.c roi.c +OBJS2 = colorlst.o roi.o +#endif + + SRCS = $(SRCS1) $(SRCS2) + + OBJS = $(OBJS1) $(OBJS2) + + INCLUDES = -I../../include -I$(SERVERSRC)/include -I$(INCLUDESRC) -I$(EXTINCSRC) + LINTLIBS = ../export/llib-lexp.ln ../import/llib-limp.ln \ + ../process/llib-lproc.ln ../request/llib-lreq.ln + +SubdirLibraryRule($(OBJS)) +NormalLibraryObjectRule() +LintLibraryTarget(req,$(SRCS)) +NormalLintTarget($(SRCS)) + +DependTarget() diff --git a/xie/xc/programs/Xserver/XIE/dixie/request/colorlst.c b/xie/xc/programs/Xserver/XIE/dixie/request/colorlst.c new file mode 100644 index 0000000..ef3d54f --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/request/colorlst.c @@ -0,0 +1,370 @@ +/* $XConsortium: colorlst.c,v 1.6 94/06/03 15:59:07 dpw Exp $ */ +/**** module colorlst.c ****/ +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + colorlst.c -- DIXIE ColorList management + + Robert NC Shelley -- AGE Logic, Inc. March, 1993 + +*****************************************************************************/ + +#define _XIEC_COLORLST + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +#include +#include +/* + * Module Specific Includes + */ +#include +#include +#include +#include + +/* + * Xie protocol proceedures called from the dispatcher + */ +int ProcCreateColorList(); +int ProcDestroyColorList(); +int ProcPurgeColorList(); +int ProcQueryColorList(); +int SProcCreateColorList(); +int SProcDestroyColorList(); +int SProcPurgeColorList(); +int SProcQueryColorList(); + +/* + * routines referenced by other modules. + */ +int DeleteColorList(); +colorListPtr LookupColorList(); +void ResetColorList(); + + +/*------------------------------------------------------------------------ +------------------------ CreateColorList Procedures ---------------------- +------------------------------------------------------------------------*/ +int ProcCreateColorList(client) + ClientPtr client; +{ + colorListPtr clst; + REQUEST(xieCreateColorListReq); + REQUEST_SIZE_MATCH(xieCreateColorListReq); + LEGAL_NEW_RESOURCE(stuff->colorList, client); + + /* + * create a new ColorList + */ + if( !(clst = (colorListPtr) XieMalloc(sizeof(colorListRec))) ) + return(client->errorValue = stuff->colorList, BadAlloc); + + clst->ID = stuff->colorList; + clst->refCnt = 1; + clst->cellPtr = NULL; + + ResetColorList(clst, NULL); + + return( AddResource(clst->ID, RT_COLORLIST, (colorListPtr)clst) + ? Success : (client->errorValue = stuff->colorList, BadAlloc) ); +} /* end ProcCreateColorList */ + + +/*------------------------------------------------------------------------ +------------------------ DestroyColorList Procedures --------------------- +------------------------------------------------------------------------*/ +int ProcDestroyColorList(client) + ClientPtr client; +{ + colorListPtr clst; + REQUEST( xieDestroyColorListReq ); + REQUEST_SIZE_MATCH( xieDestroyColorListReq ); + + if( !(clst = LookupColorList(stuff->colorList)) ) + return( SendResourceError(client, xieErrNoColorList, stuff->colorList) ); + + /* + * Disassociate the ColorList from core X -- it calls DeleteColorList() + */ + FreeResourceByType(stuff->colorList, RT_COLORLIST, RT_NONE); + + return(Success); +} /* end ProcDestroyColorList */ + + +/*------------------------------------------------------------------------ +-------------------------- PurgeColorList Procedures --------------------- +------------------------------------------------------------------------*/ +int ProcPurgeColorList(client) + ClientPtr client; +{ + colorListPtr clst; + REQUEST( xiePurgeColorListReq ); + REQUEST_SIZE_MATCH( xiePurgeColorListReq ); + + if( !(clst = LookupColorList(stuff->colorList)) ) + return( SendResourceError(client, xieErrNoColorList, stuff->colorList) ); + + /* + * Free the current list of colors + */ + ResetColorList(clst, clst->mapPtr); + + return(Success); +} /* end ProcPurgeColorList */ + + +/*------------------------------------------------------------------------ +------------------------ QueryColorList Procedures ----------------------- +------------------------------------------------------------------------*/ +int ProcQueryColorList(client) + ClientPtr client; +{ + xieQueryColorListReply rep; + colorListPtr clst; + REQUEST( xieQueryColorListReq ); + REQUEST_SIZE_MATCH( xieQueryColorListReq ); + + if( !(clst = LookupColorList(stuff->colorList)) ) + return( SendResourceError(client, xieErrNoColorList, stuff->colorList) ); + + /* + * Fill in the reply header + */ + bzero((char *)&rep, sz_xieQueryColorListReply); + rep.type = X_Reply; + rep.sequenceNum = client->sequence; + rep.colormap = clst->mapID; + rep.length = clst->cellCnt; + + if( client->swapped ) { + /* + * Swap the reply header fields + */ + register int n; + swaps(&rep.sequenceNum,n); + swapl(&rep.colormap,n); + swapl(&rep.length,n); + } + WriteToClient(client, sz_xieQueryColorListReply, (char *)&rep); + + if( clst->cellCnt ) + /* + * Send the list of colors (swapped as necessary) + * Note: cellPtr is type Pixel, which unfortunately is type unsigned long + * and that means more work needed here if longs are 64-bits... + * (anyone care to donate an Alpha?) + */ + if( client->swapped ) + CopySwap32Write(client, clst->cellCnt << 2, clst->cellPtr); + else + WriteToClient(client, clst->cellCnt << 2, (char *)clst->cellPtr); + + return(Success); +} /* end ProcQueryColorList */ + + +/*------------------------------------------------------------------------ +----------------------- deleteFunc: DeleteColorList ---------------------- +------------------------------------------------------------------------*/ +int DeleteColorList(clst, id) + colorListPtr clst; + xieTypColorList id; +{ + if( --clst->refCnt ) + return(Success); + + /* free any colors we're holding + */ + ResetColorList(clst, !clst->mapID ? NULL + : (ColormapPtr) LookupIDByType(clst->mapID, RT_COLORMAP)); + + /* free the ColorList structure. + */ + XieFree(clst); + + return(Success); +} /* end DeleteColorList */ + + +/*------------------------------------------------------------------------ +------------------------ routine: LookupColorList ------------------------ +------------------------------------------------------------------------*/ +colorListPtr LookupColorList(id) + xieTypColorList id; +{ + colorListPtr clst; + ColormapPtr cmap; + + clst = (colorListPtr) LookupIDByType(id, RT_COLORLIST); + + if( clst && clst->mapID ) { + /* + * Lookup the associated Colormap. + */ + cmap = (ColormapPtr) LookupIDByType(clst->mapID, RT_COLORMAP); + + if( cmap != clst->mapPtr ) + /* + * Forget about this Colormap and the list of colors + */ + ResetColorList(clst, cmap); + } + + return(clst); +} /* end LookupColorList */ + + +/*------------------------------------------------------------------------ +-------------------------- routine: ResetColorList ----------------------- +------------------------------------------------------------------------*/ +void ResetColorList(clst, cmap) + colorListPtr clst; + ColormapPtr cmap; +{ + if( clst->cellPtr ) { + if(cmap && !clst->client->clientGone) { + /* + * free our colors from the colormap + */ + FreeColors(cmap, clst->client->index, clst->cellCnt, clst->cellPtr, 0); + } + XieFree(clst->cellPtr); + } + + /* reset the ColorList to its create-time state + */ + clst->mapID = 0; + clst->mapPtr = NULL; + clst->cellCnt = 0; + clst->cellPtr = NULL; + clst->client = NULL; +} /* end ResetColorList */ + + +int SProcCreateColorList(client) + ClientPtr client; +{ + register int n; + REQUEST(xieCreateColorListReq); + swaps(&stuff->length, n); + REQUEST_SIZE_MATCH(xieCreateColorListReq); + swapl(&stuff->colorList, n); + return (ProcCreateColorList(client)); +} /* end SProcCreateColorList */ + +int SProcDestroyColorList(client) + ClientPtr client; +{ + register int n; + REQUEST( xieDestroyColorListReq ); + swaps(&stuff->length, n); + REQUEST_SIZE_MATCH( xieDestroyColorListReq ); + swapl(&stuff->colorList, n); + return (ProcDestroyColorList(client)); +} /* end SProcDestroyColorList */ + +int SProcPurgeColorList(client) + ClientPtr client; +{ + register int n; + REQUEST( xiePurgeColorListReq ); + swaps(&stuff->length, n); + REQUEST_SIZE_MATCH( xiePurgeColorListReq ); + swapl(&stuff->colorList, n); + return (ProcPurgeColorList(client)); +} /* end SProcPurgeColorList */ + +int SProcQueryColorList(client) + ClientPtr client; +{ + register int n; + REQUEST( xieQueryColorListReq ); + swaps(&stuff->length, n); + REQUEST_SIZE_MATCH( xieQueryColorListReq ); + swapl(&stuff->colorList, n); + return (ProcQueryColorList(client)); +} /* end SProcQueryColorList */ + +/* end module colorlst.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/request/difloat.c b/xie/xc/programs/Xserver/XIE/dixie/request/difloat.c new file mode 100644 index 0000000..9b482f2 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/request/difloat.c @@ -0,0 +1,116 @@ +/* $XConsortium: difloat.c,v 1.5 94/05/10 12:23:32 dpw Exp $ */ +/**** module difloat.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +******************************************************************************* + + difloat.c - float converters + + Ben Fahy -- AGE Logic, Inc. December 1992 + Robert NC Shelley -- AGE Logic, Inc. April 1993 + +******************************************************************************/ + +#ifndef XIE_IEEE_IS_NATIVE +#define _XIEC_DIFLOAT + +/* + * Include files + */ +#include +#include + /* + * Core X Includes + */ +#include + /* + * Server XIE Includes + */ +#include + +/* + * routines referenced by other modules. + */ +double ConvertIEEEtoNative(); + + +double ConvertIEEEtoNative(ieee) + CARD32 ieee; +{ + double sign; + double exponent; + double fraction; + + if(!(ieee & 0x7fffffff)) return(0.0); + + sign = (ieee & ieeeFloatSignMask) == ieeeFloatSignMask ? -1.0 : 1.0; + exponent = (int)((ieee & ieeeFloatExpMask) >> ieeeFloatExpShift) - 127; + fraction = (double)(ieee & ieeeFloatMantissaMask) / (1 << ieeeMantissaSize); + + return(sign * pow(2.0,exponent) * (1.0 + fraction)); +} /* end ConvertIEEEtoNative */ +#endif /* !XIE_IEEE_IS_NATIVE */ + +/* end module difloat.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/request/error.c b/xie/xc/programs/Xserver/XIE/dixie/request/error.c new file mode 100644 index 0000000..029da7c --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/request/error.c @@ -0,0 +1,337 @@ +/* $XConsortium: error.c /main/8 1995/12/02 16:47:05 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module error.c ****/ +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************/ + +#define _XIEC_ERROR + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +#include +#include + +#include +#include +#include + +/* + * routines referenced by other modules. + */ +int SendResourceError(); +int SendFloIDError(); +int SendFloError(); +void FloError(); +void ErrGeneric(); +void ErrResource(); +void ErrDomain(); +void ErrOperator(); +void ErrTechnique(); +void ErrValue(); + + +/*------------------------------------------------------------------------ +-------------------------- Send Resource Error --------------------------- +------------------------------------------------------------------------*/ +int SendResourceError(client, code, id) + ClientPtr client; + CARD8 code; + XID id; +{ + xieResourceErr err; + REQUEST(xieReq); + + if(client->clientGone) return(Success); + + bzero((char *)&err, sz_xieResourceErr); + err.error = X_Error; + err.code = code + extEntry->errorBase; + err.sequenceNum = client->sequence; + err.resourceID = id; + err.minorOpcode = stuff->opcode; + err.majorOpcode = stuff->reqType; + + if( client->swapped ) { + register int n; + swaps(&err.sequenceNum,n); + swapl(&err.resourceID,n); + swaps(&err.minorOpcode,n); + } + WriteToClient(client, sz_xieResourceErr, (char *)&err); + isItTimeToYield = TRUE; + + return(Success); +} /* end SendResourceError */ + +/*------------------------------------------------------------------------ +----------------------------- Send FloID Error --------------------------- +------------------------------------------------------------------------*/ +int SendFloIDError(client, spaceID, floID) + ClientPtr client; + XID spaceID; + XID floID; +{ + xieFloIDErr err; + REQUEST(xieReq); + + if(client->clientGone) return(Success); + + bzero((char *)&err, sz_xieFloErr); + err.error = X_Error; + err.code = xieErrNoFlo + extEntry->errorBase; + err.sequenceNum = client->sequence; + err.floID = floID; + err.floErrorCode = xieErrNoFloID; + err.minorOpcode = stuff->opcode; + err.majorOpcode = stuff->reqType; + err.nameSpace = spaceID; + + if( client->swapped ) { + register int n; + swaps(&err.sequenceNum, n); + swapl(&err.nameSpace, n); + swapl(&err.floID, n); + swaps(&err.minorOpcode,n); + } + WriteToClient(client, sz_xieFloErr, (char *)&err); + isItTimeToYield = TRUE; + + return(Success); +} /* end SendFloIDError */ + +/*------------------------------------------------------------------------ +----------------------------- Send Flo Error ----------------------------- +------------------------------------------------------------------------*/ +int SendFloError(client, flo) + ClientPtr client; + floDefPtr flo; +{ + int status = Success; + register int n; + xieFloErr err; + REQUEST(xieReq); + + if(client->clientGone) return(Success); + /* + * Take care of the common part + */ + err = flo->error; + err.error = X_Error; + err.code = xieErrNoFlo + extEntry->errorBase; + err.sequenceNum = client->sequence; + err.floID = flo->ID; + err.minorOpcode = stuff->opcode; + err.majorOpcode = stuff->reqType; + err.nameSpace = flo->spaceID; + + if( client->swapped ) { + swaps(&err.sequenceNum, n); + swapl(&err.nameSpace, n); + swapl(&err.floID, n); + swaps(&err.phototag, n); + swaps(&err.type, n); + swaps(&err.minorOpcode,n); + } + /* take care of the unique parts + */ + switch( ferrCode(flo) ) { + case xieErrNoFloAccess: + case xieErrNoFloAlloc: + case xieErrNoFloElement: + case xieErrNoFloImplementation: + case xieErrNoFloLength: + case xieErrNoFloMatch: + case xieErrNoFloOperator: + case xieErrNoFloSource: + break; + case xieErrNoFloColormap: + case xieErrNoFloColorList: + case xieErrNoFloDrawable: + case xieErrNoFloGC: + case xieErrNoFloLUT: + case xieErrNoFloPhotomap: + case xieErrNoFloROI: + if( client->swapped ) { + swapl(&((xieFloResourceErr *)(&err))->resourceID, n); + } + break; + case xieErrNoFloDomain: + if( client->swapped ) { + swaps(&((xieFloDomainErr *)(&err))->domainSrc, n); + } + break; + case xieErrNoFloTechnique: + if( client->swapped ) { + swaps(&((xieFloTechniqueErr *)(&err))->techniqueNumber, n); + swaps(&((xieFloTechniqueErr *)(&err))->lenTechParams, n); + } + break; + case xieErrNoFloValue: + if( client->swapped ) { + swapl(&((xieFloValueErr *)(&err))->badValue, n); + } + break; + default: + status = BadImplementation; + break; + } + + if( status == Success ) { + WriteToClient(client, sz_xieFloErr, (char *)&err); + isItTimeToYield = TRUE; + } + return(status); +} /* end SendFloError */ + + +/*------------------------------------------------------------------------ +-------------- Convenience routines for setting Flo Errors --------------- +------------------------------------------------------------------------*/ +void FloError(flo,tag,type,code) + floDefPtr flo; + xieTypPhototag tag; + CARD16 type; + CARD8 code; +{ + ferrError(flo,tag,type,code); +} + +void ErrGeneric(flo,ped,code) + floDefPtr flo; + peDefPtr ped; + CARD8 code; +{ + ferrError(flo,ped->phototag,ped->elemRaw->elemType,code); +} + +void ErrResource(flo,ped,code,id) + floDefPtr flo; + peDefPtr ped; + CARD8 code; + CARD32 id; +{ + ferrError(flo,ped->phototag,ped->elemRaw->elemType,code); + ((xieFloResourceErr *)(&flo->error))->resourceID = id; +} + +void ErrDomain(flo,ped,domain) + floDefPtr flo; + peDefPtr ped; + xieTypPhototag domain; +{ + ferrError(flo,ped->phototag,ped->elemRaw->elemType,xieErrNoFloDomain); + ((xieFloDomainErr *)(&flo->error))->domainSrc = domain; +} + +void ErrOperator(flo,ped,operator) + floDefPtr flo; + peDefPtr ped; + CARD8 operator; +{ + ferrError(flo,ped->phototag,ped->elemRaw->elemType,xieErrNoFloOperator); + ((xieFloOperatorErr *)(&flo->error))->operator = operator; +} + +void ErrTechnique(flo,ped,group,tech,lenParams) + floDefPtr flo; + peDefPtr ped; + CARD8 group; + CARD16 tech; + CARD16 lenParams; +{ + ferrError(flo,ped->phototag,ped->elemRaw->elemType,xieErrNoFloTechnique); + ((xieFloTechniqueErr *)(&flo->error))->techniqueGroup = group; + ((xieFloTechniqueErr *)(&flo->error))->techniqueNumber = tech; + ((xieFloTechniqueErr *)(&flo->error))->lenTechParams = lenParams; +} + +void ErrValue(flo,ped,value) + floDefPtr flo; + peDefPtr ped; + CARD32 value; +{ + ferrError(flo,ped->phototag,ped->elemRaw->elemType,xieErrNoFloValue); + ((xieFloValueErr *)(&flo->error))->badValue = value; +} + +/* end module error.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/request/event.c b/xie/xc/programs/Xserver/XIE/dixie/request/event.c new file mode 100644 index 0000000..cdf4b7a --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/request/event.c @@ -0,0 +1,181 @@ +/* $XConsortium: event.c,v 1.5 94/04/17 20:33:54 rws Exp $ */ +/**** module event.c ****/ +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + event.c -- DIXIE routines for managing events + + Dean Verheiden -- AGE Logic, Inc. April 1993 + +****************************************************************************/ + +#define _XIEC_EVENT + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +#include + +#include +#include +#include + +/* + * routines referenced by other modules. + */ +void SendFloEvent(); + +/*------------------------------------------------------------------------ +----------------------------- Send Flo Event ----------------------------- +------------------------------------------------------------------------*/ +void SendFloEvent(flo) + floDefPtr flo; +{ + int status = Success; + register int n; + xieFloEvn evn; + + if(flo->runClient->clientGone) return; + /* + * Take care of the common part + */ + evn = flo->event; + evn.sequenceNum = flo->runClient->sequence; + evn.time = currentTime.milliseconds; + evn.instanceNameSpace = flo->spaceID; + evn.instanceFloID = flo->ID; + + if( flo->runClient->swapped ) { + swaps(&evn.sequenceNum, n); + swapl(&evn.time, n); + swapl(&evn.instanceNameSpace, n); + swapl(&evn.instanceFloID, n); + /* + * Take care of the unique parts + */ + switch( evn.event ) { + case xieEvnNoColorAlloc: + swaps(&evn.src, n); + swaps(&evn.type, n); + swapl(&((xieColorAllocEvn *)&evn)->colorList, n); + swaps(&((xieColorAllocEvn *)&evn)->colorAllocTechnique, n); + swapl(&((xieColorAllocEvn *)&evn)->data, n); + break; + case xieEvnNoDecodeNotify: + swaps(&evn.src, n); + swaps(&evn.type, n); + swaps(&((xieDecodeNotifyEvn *)&evn)->decodeTechnique, n); + swapl(&((xieDecodeNotifyEvn *)&evn)->width, n); + swapl(&((xieDecodeNotifyEvn *)&evn)->height, n); + break; + case xieEvnNoExportAvailable: + swaps(&evn.src, n); + swaps(&evn.type, n); + swapl(&((xieExportAvailableEvn *)&evn)->data0, n); + swapl(&((xieExportAvailableEvn *)&evn)->data1, n); + swapl(&((xieExportAvailableEvn *)&evn)->data2, n); + break; + case xieEvnNoImportObscured: + swaps(&evn.src, n); + swaps(&evn.type, n); + swapl(&((xieImportObscuredEvn *)&evn)->window, n); + swaps(&((xieImportObscuredEvn *)&evn)->x, n); + swaps(&((xieImportObscuredEvn *)&evn)->y, n); + swaps(&((xieImportObscuredEvn *)&evn)->width, n); + swaps(&((xieImportObscuredEvn *)&evn)->height, n); + break; + case xieEvnNoPhotofloDone: + break; + default: + status = BadImplementation; + break; + } + } + /* add in our event base */ + evn.event += extEntry->eventBase; + + if( status == Success ) + WriteToClient(flo->runClient, sz_xieFloEvn, (char *)&evn); + +} /* end SendFloEvent */ + +/* end module event.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/request/flo.c b/xie/xc/programs/Xserver/XIE/dixie/request/flo.c new file mode 100644 index 0000000..c2ea218 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/request/flo.c @@ -0,0 +1,508 @@ +/* $XConsortium: flo.c,v 1.7 94/06/03 15:58:13 dpw Exp $ */ +/**** module flo.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + flo.c -- DIXIE photoflo utility routines + + Robert NC Shelley -- AGE Logic, Inc. May, 1993 + +*****************************************************************************/ + +#define _XIEC_FLO + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +/* + * routines referenced by other modules. + */ +floDefPtr MakeFlo(); +Bool EditFlo(); +void PrepFlo(); +floDefPtr FreeFlo(); +peDefPtr MakePEDef(); +peDefPtr FreePEDef(); +void SendClientData(); +Bool UpdateFormatfromLevels(); + +/* + * routines used internal to this module + */ +static void DAGonize(); +static Bool InputsOK(); + + +/*------------------------------------------------------------------------ +----------------------------- routine: MakeFlo --------------------------- +------------------------------------------------------------------------*/ +floDefPtr MakeFlo(client,peCnt,peLst) + ClientPtr client; + CARD16 peCnt; + xieFlo *peLst; +{ + xieTypPhototag tag; + xieFlo *pe; + peDefPtr ped, export = NULL; + floDefPtr flo; + + if( !(flo = (floDefPtr) XieCalloc(sizeof(floDefRec) + + (peCnt+1) * sizeof(xieFlo *))) ) + return(NULL); + + flo->reqClient = client; + flo->peCnt = peCnt; + flo->peArray = (peDefPtr *) &flo[1]; + flo->flags.modified = TRUE; + ListInit(&flo->defDAG); + ListInit(&flo->optDAG); + + /* allocate photo element definition structures for each client element + */ + for(pe = peLst, tag = 1; tag <= peCnt && !ferrCode(flo); tag++) { + if(client->swapped) { + register int n; + swaps(&pe->elemType, n); + swaps(&pe->elemLength, n); + } + /* if it's a valid element, Make it -- then hop to the next one + */ + if( pe->elemType <= xieMaxElem ) { + flo->peArray[tag] = MakeElement(flo, tag, pe); + pe = (xieFlo *)((CARD32 *)pe + pe->elemLength); + } else + FloElementError(flo,tag,pe->elemType, return(flo)); + } + /* analyze the DAG's topology and connect it all together + */ + for(tag = 1; tag <= peCnt && !ferrCode(flo); tag++) { + ped = flo->peArray[tag]; + if(!ped->flags.export) continue; /* skip to the next export element */ + ped->clink = export; /* link it to previous exports */ + export = ped; + /* link all elements together that contribute data towards this export */ + DAGonize(flo,ped); + } + return(flo); +} /* end MakeFlo */ + + +/*------------------------------------------------------------------------ +----------------------------- routine: EditFlo --------------------------- +------------------------------------------------------------------------*/ +Bool EditFlo(flo,start,end,peLst) + floDefPtr flo; + xieTypPhototag start; + xieTypPhototag end; + xieFlo *peLst; +{ + xieTypPhototag tag; + pointer ptr; + xieFlo *pe; + peDefPtr old, tmp; + + for(pe = peLst, tag = start; !ferrCode(flo) && tag <= end; tag++) { + if(flo->reqClient->swapped) { + register int n; + swaps(&pe->elemType, n); + swaps(&pe->elemLength, n); + } + old = flo->peArray[tag]; + if(pe->elemType != old->elemRaw->elemType) + FloElementError(flo,tag,pe->elemType, return(FALSE)); + + if( pe->elemType <= xieMaxElem ) { + /* make a temporary peDef to hold the new client parameters */ + if(tmp = MakeElement(flo, tag, pe)) + if(InputsOK(old,tmp)) { + /* swap the new parameter pointers into the existing peDef */ + SwapPtr(old->elemRaw,tmp->elemRaw,ptr); + SwapPtr(old->elemPvt,tmp->elemPvt,ptr); + SwapPtr(old->techPvt,tmp->techPvt,ptr); + SwapPtr(old->techVec,tmp->techVec,ptr); + old->flags.modified = TRUE; + /* free the tmp peDef which now holds the old parameters */ + FreePEDef(tmp); + } else { + FreePEDef(tmp); + SourceError(flo,old, return(FALSE)); + } + else + return(FALSE); + pe = (xieFlo *)((CARD32 *)pe + pe->elemLength); + } else + FloElementError(flo,tag,pe->elemType, return(FALSE)); + } + return(flo->flags.modified = TRUE); +} /* end EditFlo */ + + +/*------------------------------------------------------------------------ +----------------------------- routine: PrepFlo --------------------------- +------------------------------------------------------------------------*/ +void PrepFlo(flo) + floDefPtr flo; +{ + peDefPtr ped; + pedLstPtr lst = ListEmpty(&flo->optDAG) ? &flo->defDAG : &flo->optDAG; + + for(ped = lst->flink; !ListEnd(ped,lst); ped = ped->flink) + /* + * call each element's Prep routine, which will: + * - lookup any resources needed by the element (e.g. Colormap, ROI, ...) + * - validate the element's parameter (and technique) values + * - validate the attributes of each source of data for the element + * - determine the element's output attributes + * - determine if anything was modified since a previous execution + */ + if( !(*ped->diVec->prep)(flo, ped) ) + break; +} /* end PrepFlo */ + + +/*------------------------------------------------------------------------ +----------------------------- routine: FreeFlo --------------------------- +------------------------------------------------------------------------*/ +floDefPtr FreeFlo(flo) + floDefPtr flo; +{ + peDefPtr ped; + xieTypPhototag tag; + + while( !ListEmpty(&flo->optDAG) ) { + /* free peDefs from the optimized DAG */ + RemoveMember(ped, flo->optDAG.flink); + FreePEDef(ped); + } + for(tag = 1; tag <= flo->peCnt; tag++) { + /* free the peDef and parameter block for each client element */ + FreePEDef(flo->peArray[tag]); + } + /* finally, free the floDef itself */ + XieFree(flo); + + return(NULL); +} /* end FreeFlo */ + + +/*------------------------------------------------------------------------ +---- routine: Alloc a peDef and DIXIE parameter storage for an element --- +------------------------------------------------------------------------*/ +peDefPtr MakePEDef(inFloCnt, rawLen, pvtLen) + CARD32 inFloCnt; + CARD32 rawLen; + CARD32 pvtLen; +{ + int i, b; + inFloPtr inf; + peDefPtr ped = (peDefPtr) XieCalloc(sizeof(peDefRec) + + sizeof(inFloRec) * inFloCnt); + if( ped ) { + /* alloc some space for a copy of the client's element parameters */ + if( !(ped->elemRaw = (xieFlo *) XieMalloc(rawLen))) + return(FreePEDef(ped)); + + /* alloc whatever private space this element needs for dixie info */ + if(pvtLen) + if(ped->elemPvt = (pointer)XieCalloc(pvtLen)) + *(CARD32 *)ped->elemPvt = pvtLen; + else + ped = FreePEDef(ped); + ped->flags.modified = TRUE; + + /* init the outFlo */ + for(b = 0; b < xieValMaxBands; ++b) { + ListInit(&ped->outFlo.output[b]); + ped->outFlo.format[b].band = b; + } + + /* init the in-line inFlo list */ + inf = (inFloPtr) &ped[1]; + ped->inFloLst = inf; + ped->inCnt = inFloCnt; + for(i = 0; i < inFloCnt; (inf++)->index = i++) + for(b = 0; b < xieValMaxBands; ++b) + inf->format[b].band = b; + } + return(ped); +} /* end MakePEDef */ + + +/*------------------------------------------------------------------------ +---------------------------- routine: FreePEDef -------------------------- +------------------------------------------------------------------------*/ +peDefPtr FreePEDef(ped) + peDefPtr ped; +{ + int b; + + if( ped ) { + /* + * empty the outFlo + */ + for(b = 0; b < xieValMaxBands; ++b) { + if(!ListEmpty(&ped->outFlo.output[b])) + FreeStrips(&ped->outFlo.output[b]); + } + /* free element parameter structures + */ + if( ped->elemRaw ) XieFree(ped->elemRaw); + if( ped->elemPvt ) XieFree(ped->elemPvt); + if( ped->techPvt ) XieFree(ped->techPvt); + + XieFree(ped); + } + return(NULL); +} /* end FreePEDef */ + + +/*------------------------------------------------------------------------ +----------------------------- Send Client Data --------------------------- +------------------------------------------------------------------------*/ +void SendClientData(flo,ped,data,bytes,swapUnits,state) + floDefPtr flo; + peDefPtr ped; + CARD8 *data; + CARD32 bytes; + CARD8 swapUnits; + CARD8 state; +{ + xieGetClientDataReply rep; + + if(flo->reqClient->clientGone) return; + + bzero((char *)&rep, sz_xieGetClientDataReply); + rep.newState = state; + rep.type = X_Reply; + rep.sequenceNum = flo->reqClient->sequence; + rep.length = bytes+3>>2; + rep.byteCount = bytes; + + if( flo->reqClient->swapped ) { + register int n; + swaps(&rep.sequenceNum, n); + swapl(&rep.length, n); + swapl(&rep.byteCount, n); + } + WriteToClient(flo->reqClient, sz_xieGetClientDataReply, (char *)&rep); + + if( bytes ) { + /* if the data needs to be swapped, do it now + */ + if( flo->reqClient->swapped ) switch(swapUnits) { + case 0: + case 1: + break; + case 2: + SwapShorts((short*)data,bytes>>1); + break; + case 4: + case 8: + case 16: + SwapLongs((CARD32*)data,bytes>>2); + break; + } + WriteToClient(flo->reqClient, bytes, (char *)data); + } +} /* end SendClientData */ + + +/*------------------------------------------------------------------------ +------- Based on levels, updata the passed in peDef's outFlo format------- +------------------------------------------------------------------------*/ +Bool UpdateFormatfromLevels(ped) + peDefPtr ped; +{ + int i,bits; + + for(i = 0; i < ped->outFlo.bands; i++) { + SetDepthFromLevels(ped->outFlo.format[i].levels, + ped->outFlo.format[i].depth); + + if((bits = ped->outFlo.format[i].depth) > MAX_DEPTH(ped->outFlo.bands) || + ped->outFlo.format[i].levels < 2) + return(FALSE); + + else if(bits == 1) { + ped->outFlo.format[i].class = BIT_PIXEL; + ped->outFlo.format[i].stride = 1; + } else if(bits <= 8) { + ped->outFlo.format[i].class = BYTE_PIXEL; + ped->outFlo.format[i].stride = 8; + } else if(bits <= 16) { + ped->outFlo.format[i].class = PAIR_PIXEL; + ped->outFlo.format[i].stride = 16; + } else { + ped->outFlo.format[i].class = QUAD_PIXEL; + ped->outFlo.format[i].stride = 32; + } + bits = ped->outFlo.format[i].width * ped->outFlo.format[i].stride; + ped->outFlo.format[i].pitch = bits + Align(bits,PITCH_MOD); + } + return (TRUE); +} + + +/*------------------------------------------------------------------------* + * DAGonize recurses back through all the elements that contribute data * + * to the element passed to it. The recursion terminates when: * + * - an import element is found * + * - an element with fully connected inputs is found * + * - an error is encountered (phototag out of range, or loop detected) * + *------------------------------------------------------------------------*/ +static void DAGonize(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + int in, tag; + peDefPtr src; + inFloPtr inFlo; + + if(ped->flink) return; /* this element has already been DAGonized */ + + /* connect all the inputs to this element */ + for(ped->flags.loop = TRUE,in = 0; in < ped->inCnt && !ferrCode(flo); in++) { + inFlo = &ped->inFloLst[in]; + if((tag = inFlo->srcTag) > flo->peCnt) + SourceError(flo,ped, break); /* input is outside the flo-graph! */ + + if(tag) { /* only connect specified (i.e. non-zero) inputs */ + inFlo->ownDef = ped; + src = inFlo->srcDef = flo->peArray[tag]; + + if(src->flags.loop || src->flags.export) + SourceError(flo,ped, break); /* oops, we've stumbled over a loop */ + + /* insert this inFlo into the source element's outFlo list */ + inFlo->outChain = src->outFlo.outChain; + src->outFlo.outChain = inFlo; + + /* connect all the elements that contribute data towards this input */ + DAGonize(flo,src); + } + } + if(!ferrCode(flo)) { + /* clear the loop-detector */ + ped->flags.loop = FALSE; + + if(ped->flags.import && !ListEmpty(&flo->defDAG)) { + /* find the end of the import list, then append this element */ + for(src = flo->defDAG.flink; src->clink; src = src->clink); + src->clink = ped; + } + /* finally -- append this element onto the definition DAG */ + InsertMember(ped, flo->defDAG.blink); + } +} /* end DAGonize */ + + +/*------------------------------------------------------------------------ +-------------- compare input connections between two peDefs -------------- +------------------------------------------------------------------------*/ +static Bool InputsOK(old,new) + peDefPtr old, new; +{ + inFloPtr oldin = old->inFloLst, newin = old->inFloLst; + int i; + + if(old->inCnt != new->inCnt) + return(FALSE); + + for(i = 0; i < old->inCnt; oldin++, newin++, i++) + if(oldin->srcTag != newin->srcTag) + return(FALSE); + + return(TRUE); +} + +/* end module flo.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/request/lut.c b/xie/xc/programs/Xserver/XIE/dixie/request/lut.c new file mode 100644 index 0000000..6d51002 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/request/lut.c @@ -0,0 +1,208 @@ +/* $XConsortium: lut.c,v 1.4 94/04/17 20:33:55 rws Exp $ */ +/**** module lut.c ****/ +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************/ + +#define _XIEC_LUT +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Module Specific Includes + */ +#include +#include +#include +#include +#include + + +/* + * Xie protocol proceedures called from the dispatcher + */ +int ProcCreateLUT(); +int ProcDestroyLUT(); +int SProcCreateLUT(); +int SProcDestroyLUT(); + +/* + * routines referenced by other modules. + */ +int DeleteLUT(); + + +/*------------------------------------------------------------------------ +--------------------------- CreateLUT Procedures ------------------------- +------------------------------------------------------------------------*/ +int ProcCreateLUT(client) + ClientPtr client; +{ + int b; + lutPtr lut; + REQUEST(xieCreateLUTReq); + REQUEST_SIZE_MATCH(xieCreateLUTReq); + LEGAL_NEW_RESOURCE(stuff->lut, client); + + /* create a new lookup table + */ + if( !(lut = (lutPtr) XieCalloc(sizeof(lutRec))) ) + return(client->errorValue = stuff->lut, BadAlloc); + + lut->ID = stuff->lut; + lut->refCnt = 1; + for(b = 0; b < xieValMaxBands; b++) + ListInit(&lut->strips[b]); + + return( AddResource(lut->ID, RT_LUT, (lutPtr)lut) + ? Success : (client->errorValue = stuff->lut, BadAlloc) ); +} /* end ProcCreateLUT */ + + +/*------------------------------------------------------------------------ +------------------------ DestroyLUT Procedures -------------------------- +------------------------------------------------------------------------*/ +int ProcDestroyLUT(client) + ClientPtr client; +{ + lutPtr lut; + REQUEST( xieDestroyLUTReq ); + REQUEST_SIZE_MATCH( xieDestroyLUTReq ); + + if( !(lut = (lutPtr)LookupIDByType(stuff->lut, RT_LUT)) ) + return( SendResourceError(client, xieErrNoLUT, stuff->lut) ); + + /* Disassociate the LUT from core X -- it calls DeleteLUT() + */ + FreeResourceByType(stuff->lut, RT_LUT, RT_NONE); + + return(Success); +} /* end ProcDestroyLUT */ + + +/*------------------------------------------------------------------------ +------------------------ deleteFunc: DeleteLUT --------------------------- +------------------------------------------------------------------------*/ +int DeleteLUT(lut, id) + lutPtr lut; + xieTypLUT id; +{ + int i; + + if( --lut->refCnt ) + return(Success); + + /* Free any lookup table arrays + */ + for(i = 0; i < lut->lutCnt; i++ ) + FreeStrips(&lut->strips[i]); + + /* Free the LUT structure. + */ + XieFree(lut); + + return(Success); +} /* end DeleteLUT */ + + +int SProcCreateLUT(client) + ClientPtr client; +{ + register int n; + REQUEST(xieCreateLUTReq); + swaps(&stuff->length, n); + REQUEST_SIZE_MATCH(xieCreateLUTReq); + swapl(&stuff->lut, n); + return (ProcCreateLUT(client)); +} /* end SProcCreateLUT */ + +int SProcDestroyLUT(client) + ClientPtr client; +{ + register int n; + REQUEST( xieDestroyLUTReq ); + swaps(&stuff->length, n); + REQUEST_SIZE_MATCH( xieDestroyLUTReq ); + swapl(&stuff->lut, n); + return (ProcDestroyLUT(client)); +} /* end SProcDestroyLUT */ + +/* end module LUT.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/request/memory.c b/xie/xc/programs/Xserver/XIE/dixie/request/memory.c new file mode 100644 index 0000000..7a0f052 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/request/memory.c @@ -0,0 +1,137 @@ +/* $XConsortium: memory.c,v 1.6 94/04/17 20:33:56 rws Exp $ */ +/* Module memory.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + memory.c: Xie Memory Management Wrapper Routines + + Dean Verheiden, AGE Logic, Inc., April 1993 + +****************************************************************************/ + +#define _XIEC_MEMORY + +/* +** Include files +*/ +#include +/* + * Core X Includes + */ +#include +#include + +#include "misc.h" /* for pointer */ + +int ALLOCS = 0; /* DEBUG */ + +pointer XieMalloc(size) + unsigned size; +{ + char *memptr = (char *)Xalloc(size); + + if(memptr) + ++ALLOCS; /* DEBUG */ + return (pointer )(memptr); +} + + +pointer XieRealloc(ptr,size) + char *ptr; + unsigned size; +{ + return (pointer )Xrealloc(ptr,size); +} + +pointer XieCalloc(size) + unsigned size; +{ + char *memptr = (char *)Xalloc(size); + + if(memptr) { + ++ALLOCS; /* DEBUG */ + bzero(memptr,size); + } + return (pointer )(memptr); +} + +pointer XieFree(ptr) + char *ptr; +{ + if(ptr) { + --ALLOCS; /* DEBUG */ + Xfree(ptr); + } + return(0); +} + +/* End of module memory.c */ + + + + + diff --git a/xie/xc/programs/Xserver/XIE/dixie/request/photomap.c b/xie/xc/programs/Xserver/XIE/dixie/request/photomap.c new file mode 100644 index 0000000..172b8a3 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/request/photomap.c @@ -0,0 +1,301 @@ +/* $XConsortium: photomap.c,v 1.6 94/04/17 20:33:56 rws Exp $ */ +/**** module photomap.c ****/ +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +**************************************************************************** + + photomap.c: Routines to handle Photomap protocol requests + + Dean Verheiden, Robert NC Shelley AGE Logic, Inc. April 1993 + +****************************************************************************/ + +#define _XIEC_PHOTOMAP + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Module Specific Includes + */ +#include +#include +#include +#include + + +/* + * Xie protocol proceedures called from the dispatcher + */ +int ProcCreatePhotomap(); +int ProcDestroyPhotomap(); +int ProcQueryPhotomap(); +int SProcCreatePhotomap(); +int SProcDestroyPhotomap(); +int SProcQueryPhotomap(); + +/* + * routines referenced by other modules. + */ +int DeletePhotomap(); + + +/*------------------------------------------------------------------------ +------------------------ CreatePhotomap Procedures ---------------------- +------------------------------------------------------------------------*/ +int ProcCreatePhotomap(client) + ClientPtr client; +{ + int b; + photomapPtr map; + REQUEST(xieCreatePhotomapReq); + REQUEST_SIZE_MATCH(xieCreatePhotomapReq); + LEGAL_NEW_RESOURCE(stuff->photomap, client); + + /* create a new Photomap + */ + if( !(map = (photomapPtr) XieCalloc(sizeof(photomapRec))) ) + return(client->errorValue = stuff->photomap, BadAlloc); + + map->ID = stuff->photomap; + map->refCnt = 1; + map->bands = 0; + for(b = 0; b < xieValMaxBands; b++) + ListInit(&map->strips[b]); + + return( AddResource(map->ID, RT_PHOTOMAP, (photomapPtr)map) + ? Success : (client->errorValue = stuff->photomap, BadAlloc) ); +} /* end ProcCreatePhotomap */ + + +/*------------------------------------------------------------------------ +------------------------ DestroyPhotomap Procedures --------------------- +------------------------------------------------------------------------*/ +int ProcDestroyPhotomap(client) + ClientPtr client; +{ + photomapPtr map; + REQUEST( xieDestroyPhotomapReq ); + REQUEST_SIZE_MATCH( xieDestroyPhotomapReq ); + + if( !(map = (photomapPtr)LookupIDByType(stuff->photomap, RT_PHOTOMAP)) ) + return( SendResourceError(client, xieErrNoPhotomap, stuff->photomap) ); + + /* Disassociate the Photomap from core X -- it calls DeletePhotomap() + */ + FreeResourceByType(stuff->photomap, RT_PHOTOMAP, RT_NONE); + + return(Success); +} /* end ProcDestroyPhotomap */ + + +/*------------------------------------------------------------------------ +------------------------ QueryPhotomap Procedures ----------------------- +------------------------------------------------------------------------*/ +int ProcQueryPhotomap(client) + ClientPtr client; +{ + xieQueryPhotomapReply rep; + photomapPtr map; + REQUEST( xieQueryPhotomapReq ); + REQUEST_SIZE_MATCH( xieQueryPhotomapReq ); + + if( !(map = (photomapPtr)LookupIDByType(stuff->photomap, RT_PHOTOMAP)) ) + return( SendResourceError(client, xieErrNoPhotomap, stuff->photomap) ); + + /* Fill in the reply header + */ + bzero((char *)&rep, sz_xieQueryPhotomapReply); + rep.type = X_Reply; + rep.sequenceNum = client->sequence; + rep.length = sz_xieQueryPhotomapReply-32>>2; + + if( map->bands ) { + rep.populated = TRUE; + rep.dataType = map->dataType; + rep.dataClass = map->dataClass; + rep.width0 = map->format[0].width; + rep.height0 = map->format[0].height; + rep.levels0 = map->format[0].levels; + rep.decodeTechnique = map->technique; + if( map->bands == xieValMaxBands ) { + rep.width1 = map->format[1].width; + rep.height1 = map->format[1].height; + rep.levels1 = map->format[1].levels; + rep.width2 = map->format[2].width; + rep.height2 = map->format[2].height; + rep.levels2 = map->format[2].levels; + } + } else { + rep.populated = FALSE; + } + + if( client->swapped ) { + /* + * Swap the reply header fields + */ + register int n; + + swaps(&rep.sequenceNum,n); + swapl(&rep.length,n); + if (rep.populated) { + swaps(&rep.decodeTechnique,n); + swapl(&rep.width0,n); + swapl(&rep.height0,n); + swapl(&rep.levels0,n); + if (rep.dataClass == xieValTripleBand) { + swapl(&rep.width1,n); + swapl(&rep.height1,n); + swapl(&rep.levels1,n); + swapl(&rep.width2,n); + swapl(&rep.height2,n); + swapl(&rep.levels2,n); + } + } + } + WriteToClient(client, sz_xieQueryPhotomapReply, (char *)&rep); + + return(Success); +} /* end ProcQueryPhotomap */ + + +/*------------------------------------------------------------------------ +----------------------- deleteFunc: DeletePhotomap ---------------------- +------------------------------------------------------------------------*/ +int DeletePhotomap(map, id) + photomapPtr map; + xieTypPhotomap id; +{ + int i; + + if( --map->refCnt ) + return(Success); + + /* free compression parameters and image data + */ + if (map->tecParms) + map->tecParms = (pointer)XieFree(map->tecParms); + if (map->pvtParms) + map->pvtParms = (pointer)XieFree(map->pvtParms); + for(i = 0; i < map->bands; i++) + FreeStrips(&map->strips[i]); + /* + Free the Photomap structure. + */ + XieFree(map); + + return(Success); +} /* end DeletePhotomap */ + +int SProcCreatePhotomap(client) + ClientPtr client; +{ + register int n; + REQUEST(xieCreatePhotomapReq); + swaps(&stuff->length, n); + REQUEST_SIZE_MATCH(xieCreatePhotomapReq); + swapl(&stuff->photomap, n); + return (ProcCreatePhotomap(client)); +} /* end SProcCreatePhotomap */ + +int SProcDestroyPhotomap(client) + ClientPtr client; +{ + register int n; + REQUEST( xieDestroyPhotomapReq ); + swaps(&stuff->length, n); + REQUEST_SIZE_MATCH( xieDestroyPhotomapReq ); + swapl(&stuff->photomap, n); + return (ProcDestroyPhotomap(client)); +} /* end SProcDestroyPhotomap */ + +int SProcQueryPhotomap(client) + ClientPtr client; +{ + register int n; + REQUEST( xieQueryPhotomapReq ); + swaps(&stuff->length, n); + REQUEST_SIZE_MATCH( xieQueryPhotomapReq ); + swapl(&stuff->photomap, n); + return (ProcQueryPhotomap(client)); +} /* end SProcQueryPhotomap */ + +/* end module Photomap.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/request/protoflo.c b/xie/xc/programs/Xserver/XIE/dixie/request/protoflo.c new file mode 100644 index 0000000..89edca8 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/request/protoflo.c @@ -0,0 +1,948 @@ +/* $XConsortium: protoflo.c /main/10 1995/12/02 16:47:30 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module protoflo.c ****/ +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + protoflo.c: photospace and photoflo request/reply procedures + + Robert NC Shelley, Dean Verheiden -- AGE Logic, Inc., May 1993 + +****************************************************************************/ + +#define _XIEC_PROTOFLO +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * immediate-specific includes + */ +#include +#include +#include +#include +#include + + +/* + * Xie protocol procedures called from the dispatcher + */ +int ProcCreatePhotospace(); +int ProcDestroyPhotospace(); +int ProcExecuteImmediate(); +int ProcCreatePhotoflo(); +int ProcDestroyPhotoflo(); +int ProcExecutePhotoflo(); +int ProcModifyPhotoflo(); +int ProcRedefinePhotoflo(); +int ProcAbort(); +int ProcAwait(); +int ProcGetClientData(); +int ProcPutClientData(); +int ProcQueryPhotoflo(); + +int SProcCreatePhotospace(); +int SProcDestroyPhotospace(); +int SProcExecuteImmediate(); +int SProcCreatePhotoflo(); +int SProcDestroyPhotoflo(); +int SProcExecutePhotoflo(); +int SProcModifyPhotoflo(); +int SProcRedefinePhotoflo(); +int SProcAbort(); +int SProcAwait(); +int SProcGetClientData(); +int SProcPutClientData(); +int SProcQueryPhotoflo(); + +/* + * routines referenced by other modules + */ +int DeletePhotospace(); +int DeletePhotoflo(); + +/* + * routines used internal to this module + */ +static floDefPtr LookupExecutable(); +static floDefPtr LookupImmediate(); +static int RunFlo(); +static int FloDone(); +static void DeleteImmediate(); + + + +/*------------------------------------------------------------------------ +--------------------------- CreatePhotospace Procedure ------------------- +------------------------------------------------------------------------*/ +int ProcCreatePhotospace(client) + ClientPtr client; +{ + photospacePtr space; + REQUEST(xieCreatePhotospaceReq); + REQUEST_SIZE_MATCH(xieCreatePhotospaceReq); + LEGAL_NEW_RESOURCE(stuff->nameSpace, client); + + /* + * create a new lookup table + */ + if(!(space = (photospacePtr) XieMalloc(sizeof(photospaceRec)))) + return(client->errorValue = stuff->nameSpace, BadAlloc); + + space->spaceID = stuff->nameSpace; + space->floCnt = 0; + ListInit(&space->floLst); + + return( AddResource(space->spaceID, RT_PHOTOSPACE, space) + ? Success : (client->errorValue = stuff->nameSpace, BadAlloc) ); +} /* end ProcCreatePhotospace */ + + +/*------------------------------------------------------------------------ +------------------------ DestroyPhotospace Procedure --------------------- +------------------------------------------------------------------------*/ +int ProcDestroyPhotospace(client) + ClientPtr client; +{ + photospacePtr space; + REQUEST( xieDestroyPhotospaceReq ); + REQUEST_SIZE_MATCH( xieDestroyPhotospaceReq ); + + if(!(space = (photospacePtr)LookupIDByType(stuff->nameSpace,RT_PHOTOSPACE))) + return( SendResourceError(client, xieErrNoPhotospace, stuff->nameSpace) ); + + /* + * Disassociate the Photospace from core X -- it calls DeletePhotospace() + */ + FreeResourceByType(stuff->nameSpace, RT_PHOTOSPACE, RT_NONE); + + return(Success); +} /* end ProcDestroyPhotospace */ + + +/*------------------------------------------------------------------------ +------------------------ ExecuteImmediate Procedure ---------------------- +------------------------------------------------------------------------*/ +int ProcExecuteImmediate(client) + ClientPtr client; +{ + floDefPtr flo; + photospacePtr space; + REQUEST(xieExecuteImmediateReq); + REQUEST_AT_LEAST_SIZE(xieExecuteImmediateReq); + + /* verify that the new flo-id is unique */ + flo = LookupImmediate(stuff->nameSpace, stuff->floID, &space); + if( !space || flo ) + return(SendFloIDError(client,stuff->nameSpace,stuff->floID)); + + /* create the flo structures and verify the DAG's topology */ + if(!(flo = MakeFlo(client, stuff->numElements, (xieFlo *)&stuff[1]))) + return(client->errorValue = stuff->floID, BadAlloc); + + /* append the new flo to the photospace */ + flo->space = space; + flo->spaceID = stuff->nameSpace; + flo->ID = stuff->floID; + flo->flags.notify = stuff->notify; + space->floCnt++; + InsertMember(flo,space->floLst.blink); + + /* try to execute it */ + return(RunFlo(client,flo)); +} /* end ProcExecuteImmediate */ + + +/*------------------------------------------------------------------------ +------------------------- CreatePhotoflo Procedure ----------------------- +------------------------------------------------------------------------*/ +int ProcCreatePhotoflo(client) + ClientPtr client; +{ + floDefPtr flo; + REQUEST(xieCreatePhotofloReq); + REQUEST_AT_LEAST_SIZE(xieCreatePhotofloReq); + LEGAL_NEW_RESOURCE(stuff->floID, client); + + /* create a new Photoflo + */ + if( !(flo = MakeFlo(client, stuff->numElements, (xieFlo *)&stuff[1])) ) + return(client->errorValue = stuff->floID, BadAlloc); + flo->ID = stuff->floID; + + if( ferrCode(flo) ) { + SendFloError(client,flo); + DeletePhotoflo(flo, stuff->floID); + return(Success); + } + /* All is well, try to register the new flo + */ + return( AddResource(stuff->floID, RT_PHOTOFLO, (floDefPtr)flo) + ? Success : (client->errorValue = stuff->floID, BadAlloc) ); +} /* end ProcCreatePhotoflo */ + + +/*------------------------------------------------------------------------ +------------------------ DestroyPhotoflo Procedure ----------------------- +------------------------------------------------------------------------*/ +int ProcDestroyPhotoflo(client) + ClientPtr client; +{ + floDefPtr flo; + REQUEST( xieDestroyPhotofloReq ); + REQUEST_SIZE_MATCH( xieDestroyPhotofloReq ); + + if( !(flo = (floDefPtr) LookupIDByType(stuff->floID, RT_PHOTOFLO)) ) + return( SendResourceError(client, xieErrNoPhotoflo, stuff->floID) ); + + /* Disassociate the Photoflo from core X -- it calls DeletePhotoflo() + */ + FreeResourceByType(stuff->floID, RT_PHOTOFLO, RT_NONE); + + return(Success); +} /* end ProcDestroyPhotoflo */ + + +/*------------------------------------------------------------------------ +------------------------ ExecutePhotoflo Procedure ----------------------- +------------------------------------------------------------------------*/ +int ProcExecutePhotoflo(client) + ClientPtr client; +{ + floDefPtr flo; + REQUEST( xieExecutePhotofloReq ); + REQUEST_SIZE_MATCH( xieExecutePhotofloReq ); + + if( !(flo = (floDefPtr) LookupIDByType(stuff->floID, RT_PHOTOFLO)) ) + return( SendResourceError(client, xieErrNoPhotoflo, stuff->floID) ); + + if( flo->flags.active ) + FloAccessError(flo,0,0, return(SendFloError(client,flo))); + flo->flags.notify = stuff->notify; + ferrCode(flo) = 0; + + /* try to execute it */ + return(RunFlo(client,flo)); +} /* end ProcExecutePhotoflo */ + + +/*------------------------------------------------------------------------ +------------------------- ModifyPhotoflo Procedure ----------------------- +------------------------------------------------------------------------*/ +int ProcModifyPhotoflo(client) + ClientPtr client; +{ + floDefPtr flo; + xieTypPhototag end; + REQUEST( xieModifyPhotofloReq ); + REQUEST_AT_LEAST_SIZE(xieModifyPhotofloReq); + + if( !(flo = (floDefPtr) LookupIDByType(stuff->floID, RT_PHOTOFLO)) ) + return( SendResourceError(client, xieErrNoPhotoflo, stuff->floID) ); + + if( flo->flags.active ) + FloAccessError(flo,0,0, goto egress); + + if(!stuff->start || stuff->start > flo->peCnt) + FloSourceError(flo,stuff->start,0, goto egress); + + if((end = stuff->start + stuff->numElements - 1) > flo->peCnt) + FloElementError(flo,flo->peCnt,0, goto egress); + + /* edit existing elements according to the list of elements we were given + */ + EditFlo(flo, stuff->start, end, (xieFlo *)&stuff[1]); + + egress: + return(ferrCode(flo) ? SendFloError(client,flo) : Success); +} /* end ProcModifyPhotoflo */ + + +/*------------------------------------------------------------------------ +------------------------ RedefinePhotoflo Procedure ---------------------- +------------------------------------------------------------------------*/ +int ProcRedefinePhotoflo(client) + ClientPtr client; +{ + floDefPtr old, new; + REQUEST( xieRedefinePhotofloReq ); + REQUEST_AT_LEAST_SIZE(xieRedefinePhotofloReq); + + if( !(old = (floDefPtr) LookupIDByType(stuff->floID, RT_PHOTOFLO)) ) + return( SendResourceError(client, xieErrNoPhotoflo, stuff->floID) ); + + if( old->flags.active ) + FloAccessError(old,0,0, return(SendFloError(client,old))); + + /* create a new Photoflo + */ + if( !(new = MakeFlo(client, stuff->numElements, (xieFlo *)&stuff[1])) ) + return(client->errorValue = stuff->floID, BadAlloc); + new->ID = stuff->floID; + + if( ferrCode(new) ) { + SendFloError(client,new); + DeletePhotoflo(new, stuff->floID); + return(Success); + } + /* Disassociate the old flo from core X -- it calls DeletePhotoflo() + */ + FreeResourceByType(stuff->floID, RT_PHOTOFLO, RT_NONE); + + /* Then (re)register the new flo using the old flo's ID + */ + return( AddResource(stuff->floID, RT_PHOTOFLO, (floDefPtr)new) + ? Success : (client->errorValue = stuff->floID, BadAlloc) ); +} /* end ProcRedefinePhotoflo */ + + +/*------------------------------------------------------------------------ +------------------------------ Abort Procedure --------------------------- +------------------------------------------------------------------------*/ +int ProcAbort(client) + ClientPtr client; +{ + floDefPtr flo; + REQUEST( xieAbortReq ); + REQUEST_SIZE_MATCH( xieAbortReq ); + + if( flo = LookupExecutable(stuff->nameSpace, stuff->floID) ) + if( flo->flags.active ) { + flo->reqClient = client; + flo->flags.aborted = TRUE; + ddShutdown(flo); + FloDone(flo); + } + return(Success); +} /* end ProcAbort */ + + +/*------------------------------------------------------------------------ +------------------------------ Await Procedure --------------------------- +------------------------------------------------------------------------*/ +int ProcAwait(client) + ClientPtr client; +{ + ClientPtr *awaken; + floDefPtr flo; + REQUEST( xieAwaitReq ); + REQUEST_SIZE_MATCH( xieAwaitReq ); + + if( (flo = LookupExecutable(stuff->nameSpace, stuff->floID)) + && flo->flags.active ) { + if(awaken = (ClientPtr*)(flo->awakenCnt + ? XieRealloc( flo->awakenPtr, + (flo->awakenCnt+1)*sizeof(ClientPtr)) + : XieMalloc(sizeof(ClientPtr)))) { + /* + * tell core X to ignore this client until the flo is done + */ + awaken[flo->awakenCnt++] = client; + flo->awakenPtr = awaken; + IgnoreClient(client); + } else { + return(BadAlloc); + } + } + return(Success); +} /* end ProcAwait */ + + +/*------------------------------------------------------------------------ +-------------------------- Get Client Data Procedure --------------------- +------------------------------------------------------------------------*/ +int ProcGetClientData(client) + ClientPtr client; +{ + floDefPtr flo; + peDefPtr ped; + REQUEST( xieGetClientDataReq ); + REQUEST_SIZE_MATCH( xieGetClientDataReq ); + + /* find the flo and make sure it's active + */ + if(!(flo = LookupExecutable(stuff->nameSpace, stuff->floID))) + return SendFloIDError(client, stuff->nameSpace, stuff->floID); + if(!flo->flags.active) + FloAccessError(flo,stuff->element,0, return(SendFloError(client,flo))); + + /* verify that the specified element and band are OK + */ + flo->reqClient = client; + ped = (stuff->element && stuff->element <= flo->peCnt + ? flo->peArray[stuff->element] : NULL); + if(!ped || !ped->flags.getData) + FloElementError(flo, stuff->element, ped ? ped->elemRaw->elemType : 0, + goto egress); + if(stuff->bandNumber >= ped->inFloLst[0].bands) + ValueError(flo,ped,stuff->bandNumber, goto egress); + + /* grab some data and have it sent to the client + */ + ddOutput(flo, ped, stuff->bandNumber, stuff->maxBytes, stuff->terminate); + + egress: + return(ferrCode(flo) || !flo->flags.active ? FloDone(flo) : Success); +} /* end ProcGetClientData */ + + +/*------------------------------------------------------------------------ +-------------------------- Put Client Data Procedure --------------------- +------------------------------------------------------------------------*/ +int ProcPutClientData(client) + ClientPtr client; +{ + floDefPtr flo; + peDefPtr ped; + REQUEST( xiePutClientDataReq ); + REQUEST_AT_LEAST_SIZE(xiePutClientDataReq); + + /* find the flo and make sure it's active + */ + if( !(flo = LookupExecutable(stuff->nameSpace, stuff->floID)) ) + return( SendFloIDError(client, stuff->nameSpace, stuff->floID) ); + if( !flo->flags.active ) + FloAccessError(flo,stuff->element,0, return(SendFloError(client,flo))); + + /* verify that the target element and band are OK + */ + flo->reqClient = client; + ped = stuff->element && stuff->element <= flo->peCnt + ? flo->peArray[stuff->element] : NULL; + if( !ped || !ped->flags.putData ) + FloElementError(flo, stuff->element, ped ? ped->elemRaw->elemType : 0, + goto egress); + if( stuff->bandNumber >= ped->inFloLst[0].bands ) + ValueError(flo,ped,stuff->bandNumber, goto egress); + + /* check for partial aggregates and swap the data as required + */ + switch(ped->swapUnits[stuff->bandNumber]) { + case 0: + case 1: + break; + case 2: + if(stuff->byteCount & 1) + ValueError(flo,ped,stuff->byteCount, goto egress); + if (client->swapped) + SwapShorts((short*)&stuff[1],stuff->byteCount>>1); + break; + case 4: + case 8: + case 16: + if(stuff->byteCount & (ped->swapUnits[stuff->bandNumber]-1)) + ValueError(flo,ped,stuff->byteCount, goto egress); + if(client->swapped) + SwapLongs((CARD32*)&stuff[1],stuff->byteCount>>2); + break; + } + /* pass the byte-stream to the target element + */ + if(stuff->byteCount || stuff->final) + ddInput(flo, ped, stuff->bandNumber, + (CARD8*)&stuff[1], stuff->byteCount, stuff->final); + + egress: + return(ferrCode(flo) || !flo->flags.active ? FloDone(flo) : Success); +} /* end ProcPutClientData */ + + +/*------------------------------------------------------------------------ +------------------------ QueryPhotoflo Procedure ------------------------- +------------------------------------------------------------------------*/ +int ProcQueryPhotoflo(client) + ClientPtr client; +{ + CARD16 imCnt, exCnt; + CARD32 shorts; + floDefPtr flo; + xieTypPhototag *list; + xieQueryPhotofloReply rep; + REQUEST( xieQueryPhotofloReq ); + REQUEST_SIZE_MATCH( xieQueryPhotofloReq ); + + bzero((char *)&rep, sz_xieQueryPhotofloReply); + rep.state = ((flo = LookupExecutable(stuff->nameSpace, stuff->floID)) + ? (flo->flags.active ? xieValActive : xieValInactive) + : xieValNonexistent); + + /* Ask ddxie about the status of client transport + */ + if(!flo || !flo->flags.active) + imCnt = exCnt = 0; + else if(!ddQuery(flo,&list,&imCnt,&exCnt)) + return(SendFloError(client,flo)); + + /* Fill in the reply header + */ + shorts = (imCnt + 1 & ~1) + (exCnt + 1 & ~1); + rep.type = X_Reply; + rep.sequenceNum = client->sequence; + rep.length = shorts >> 1; + rep.expectedCount = imCnt; + rep.availableCount = exCnt; + + if( client->swapped ) { + register int n; + swaps(&rep.sequenceNum,n); + swapl(&rep.length,n); + swaps(&rep.expectedCount,n); + swaps(&rep.availableCount,n); + } + WriteToClient(client, sz_xieQueryPhotofloReply, (char *)&rep); + + if(shorts) { + /* Send the list of pending import/export(s) (swapped as necessary) + */ + if( client->swapped ) + SwapShorts((short *)list, shorts); + WriteToClient(client, shorts<<1, (char *)list); + XieFree(list); + } + return(Success); +} /* end ProcQueryPhotoflo */ + + +/*------------------------------------------------------------------------ +----------------------- deleteFunc: DeletePhotospace --------------------- +------------------------------------------------------------------------*/ +int DeletePhotospace(space, id) + photospacePtr space; + xieTypPhotospace id; +{ + /* abort and destroy all flos in the photospace + */ + while( space->floCnt ) { + floDefPtr flo = space->floLst.flink; + /* + * abort it's execution, and then let it go away quietly (no error/events) + */ + flo->reqClient = flo->runClient; + flo->flags.aborted = TRUE; + flo->flags.notify = FALSE; + ddShutdown(flo); + ferrCode(flo) = 0; + FloDone(flo); + } + /* Free the Photospace structure. + */ + XieFree(space); + + return(Success); +} /* end DeletePhotospace */ + + +/*------------------------------------------------------------------------ +----------------------- deleteFunc: DeletePhotoflo ----------------------- +------------------------------------------------------------------------*/ +int DeletePhotoflo(flo, id) + floDefPtr flo; + xieTypPhotoflo id; +{ + if(flo->flags.active) { + /* + * abort it's execution, and then let it go away quietly (no error/events) + */ + flo->reqClient = flo->runClient; + flo->flags.aborted = TRUE; + flo->flags.notify = FALSE; + ddShutdown(flo); + ferrCode(flo) = 0; + FloDone(flo); + } + /* destroy any lingering ddxie structures + */ + ddDestroy(flo); + + /* free the dixie element structures + */ + FreeFlo(flo); + + return(Success); +} /* end DeletePhotoflo */ + + +/*------------------------------------------------------------------------ +------------------------- routine: LookupExecutable ---------------------- +------------------------------------------------------------------------*/ +static floDefPtr LookupExecutable(spaceID, floID) + CARD32 spaceID; + CARD32 floID; +{ + floDefPtr flo; + + if( spaceID ) + flo = LookupImmediate(spaceID, floID, NULL); + else + flo = (floDefPtr) LookupIDByType(floID, RT_PHOTOFLO); + + return(flo); +} /* end LookupExecutable */ + + +/*------------------------------------------------------------------------ +------------------------ routine: LookupImmediate ------------------------ +------------------------------------------------------------------------*/ +static floDefPtr LookupImmediate(spaceID, floID, spacePtr) + CARD32 spaceID; + CARD32 floID; + photospacePtr *spacePtr; +{ + floDefPtr flo; + photospacePtr space = (photospacePtr) LookupIDByType(spaceID, RT_PHOTOSPACE); + + if(spacePtr) + *spacePtr = space; + if(!space) + return(NULL); + + /* search the photospace for the specified flo + */ + for(flo = space->floLst.flink; + !ListEnd(flo,&space->floLst) && floID != flo->ID; + flo = flo->flink); + + return( ListEnd(flo,&space->floLst) ? NULL : flo ); +} /* end LookupImmediate */ + + +/*------------------------------------------------------------------------ +----------- initiate, and possibly complete, photoflo execution ---------- +------------------------------------------------------------------------*/ +static int RunFlo(client,flo) + ClientPtr client; + floDefPtr flo; +{ + flo->runClient = flo->reqClient = client; + + /* validate parameters and propagate attributes between elements */ + if( !ferrCode(flo) ) + PrepFlo(flo); + + /* choose the "best" set of handlers for this DAG (this also + * establishes all DDXIE entry points in the floDef and peDefs) + */ + if(!ferrCode(flo) && flo->flags.modified) + DAGalyze(flo); + + /* create all the new handlers that were chosen by DAGalyze */ + if(!ferrCode(flo) && flo->flags.modified) + ddLink(flo); + + /* begin (and maybe complete) execution */ + if( ferrCode(flo) || !ddStartup(flo) ) + FloDone(flo); + + return(Success); +} /* end RunFlo */ + + +/*------------------------------------------------------------------------ +-------- Handle Photoflo Done: send error and event, then clean up ------- +------------------------------------------------------------------------*/ +static int FloDone(flo) + floDefPtr flo; +{ + peDefPtr ped; + pedLstPtr lst = ListEmpty(&flo->optDAG) ? &flo->defDAG : &flo->optDAG; + Bool ok = !ferrCode(flo) && !flo->flags.aborted; + + /* debrief import elements */ + for(ped = lst->flink; ped && !ListEnd(ped,lst); ped = ped->clink) + if(ped->diVec->debrief) + ok &= (*ped->diVec->debrief)(flo,ped,ok); + + /* debrief all other elements (e.g. export and ConvertToIndex) */ + for(ped = lst->flink; ped && !ListEnd(ped,lst); ped = ped->flink) + if(!ped->flags.import && ped->diVec->debrief) + ok &= (*ped->diVec->debrief)(flo,ped,ok); + + /* handle errors */ + if(ferrCode(flo)) { + ddShutdown(flo); + SendFloError(flo->runClient,flo); + if(flo->reqClient != flo->runClient) + SendFloError(flo->reqClient,flo); + } + /* handle events */ + if(flo->flags.notify) { + flo->event.event = xieEvnNoPhotofloDone; + + if(ferrCode(flo)) + ((xiePhotofloDoneEvn *)&flo->event)->outcome = xieValFloError; + else if(flo->flags.aborted) + ((xiePhotofloDoneEvn *)&flo->event)->outcome = xieValFloAbort; + else + ((xiePhotofloDoneEvn *)&flo->event)->outcome = xieValFloSuccess; + + SendFloEvent(flo); + } + /* if this was an immediate flo, it's history */ + if(flo->spaceID) + DeleteImmediate(flo); + + return(Success); +} /* end FloDone */ + + +/*------------------------------------------------------------------------ +------------------------- routine: DeleteImmediate ----------------------- +------------------------------------------------------------------------*/ +static void DeleteImmediate(flo) + floDefPtr flo; +{ + floDefPtr tmp; + + /* destroy any lingering DDXIE structures + */ + ddDestroy(flo); + + /* remove the photoflo from the photospace and destroy it + */ + flo->space->floCnt--; + RemoveMember(tmp, flo); + FreeFlo(tmp); +} /* end DeleteImmediate */ + + +/*------------------------------------------------------------------------ +----------------------------- Swap procedures ---------------------------- +------------------------------------------------------------------------*/ +int SProcCreatePhotospace(client) + ClientPtr client; +{ + register long n; + REQUEST(xieCreatePhotospaceReq); + swaps(&stuff->length, n); + REQUEST_SIZE_MATCH(xieCreatePhotospaceReq); + swapl(&stuff->nameSpace, n); + return (ProcCreatePhotospace(client)); +} /* end SProcCreatePhotospace */ + +int SProcDestroyPhotospace(client) + ClientPtr client; +{ + register long n; + REQUEST( xieDestroyPhotospaceReq ); + swaps(&stuff->length, n); + REQUEST_SIZE_MATCH( xieDestroyPhotospaceReq ); + swapl(&stuff->nameSpace, n); + return (ProcDestroyPhotospace(client)); +} /* end SProcDestroyPhotospace */ + +int SProcExecuteImmediate(client) + register ClientPtr client; +{ + register int n; + REQUEST(xieExecuteImmediateReq); + swaps(&stuff->length, n); + REQUEST_AT_LEAST_SIZE(xieExecuteImmediateReq); + swapl(&stuff->nameSpace, n); + swapl(&stuff->floID, n); + swaps(&stuff->numElements, n); + return( ProcExecuteImmediate(client) ); +} + +int SProcCreatePhotoflo(client) + register ClientPtr client; +{ + register int n; + REQUEST(xieCreatePhotofloReq); + swaps(&stuff->length, n); + REQUEST_AT_LEAST_SIZE(xieCreatePhotofloReq); + swapl(&stuff->floID, n); + swaps(&stuff->numElements, n); + return( ProcCreatePhotoflo(client) ); +} + +int SProcDestroyPhotoflo(client) + register ClientPtr client; +{ + register int n; + REQUEST(xieDestroyPhotofloReq); + swaps(&stuff->length, n); + REQUEST_SIZE_MATCH(xieDestroyPhotofloReq); + swapl(&stuff->floID, n); + return( ProcDestroyPhotoflo(client) ); +} + +int SProcExecutePhotoflo(client) + register ClientPtr client; +{ + register int n; + REQUEST(xieExecutePhotofloReq); + swaps(&stuff->length, n); + REQUEST_SIZE_MATCH(xieExecutePhotofloReq); + swapl(&stuff->floID, n); + return( ProcExecutePhotoflo(client) ); +} + +int SProcModifyPhotoflo(client) + register ClientPtr client; +{ + register int n; + REQUEST(xieModifyPhotofloReq); + swaps(&stuff->length, n); + REQUEST_AT_LEAST_SIZE(xieModifyPhotofloReq); + swapl(&stuff->floID, n); + swaps(&stuff->start, n); + swaps(&stuff->numElements, n); + return( ProcModifyPhotoflo(client) ); +} + +int SProcRedefinePhotoflo(client) + register ClientPtr client; +{ + register int n; + REQUEST(xieRedefinePhotofloReq); + swaps(&stuff->length, n); + REQUEST_AT_LEAST_SIZE(xieRedefinePhotofloReq); + swapl(&stuff->floID, n); + swaps(&stuff->numElements, n); + return( ProcRedefinePhotoflo(client) ); +} + +int SProcAbort(client) + register ClientPtr client; +{ + register int n; + REQUEST(xieAbortReq); + swaps(&stuff->length, n); + REQUEST_SIZE_MATCH(xieAbortReq); + swapl(&stuff->nameSpace, n); + swapl(&stuff->floID, n); + return( ProcAbort(client) ); +} + +int SProcAwait(client) + register ClientPtr client; +{ + register int n; + REQUEST(xieAwaitReq); + swaps(&stuff->length, n); + REQUEST_SIZE_MATCH(xieAwaitReq); + swapl(&stuff->nameSpace, n); + swapl(&stuff->floID, n); + return( ProcAwait(client) ); +} + +int SProcGetClientData(client) + register ClientPtr client; +{ + register int n; + REQUEST(xieGetClientDataReq); + swaps(&stuff->length, n); + REQUEST_SIZE_MATCH(xieGetClientDataReq); + swapl(&stuff->nameSpace, n); + swapl(&stuff->floID, n); + swapl(&stuff->maxBytes, n); + swaps(&stuff->element, n); + return( ProcGetClientData(client) ); +} + +int SProcPutClientData(client) + register ClientPtr client; +{ + register int n; + REQUEST(xiePutClientDataReq); + swaps(&stuff->length, n); + REQUEST_AT_LEAST_SIZE(xiePutClientDataReq); + swapl(&stuff->nameSpace, n); + swapl(&stuff->floID, n); + swaps(&stuff->element, n); + swapl(&stuff->byteCount, n); + return( ProcPutClientData(client) ); +} + +int SProcQueryPhotoflo(client) + register ClientPtr client; +{ + register int n; + REQUEST(xieQueryPhotofloReq); + swaps(&stuff->length, n); + REQUEST_SIZE_MATCH(xieQueryPhotofloReq); + swapl(&stuff->nameSpace, n); + swapl(&stuff->floID, n); + return( ProcQueryPhotoflo(client) ); +} + +/* end module protoflo.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/request/roi.c b/xie/xc/programs/Xserver/XIE/dixie/request/roi.c new file mode 100644 index 0000000..d3f0b4d --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/request/roi.c @@ -0,0 +1,202 @@ +/* $XConsortium: roi.c,v 1.4 94/04/17 20:33:58 rws Exp $ */ +/**** module roi.c ****/ +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + roi.c: Routines to manage region of interest protocol requests + + Dean Verheiden, AGE Logic, Inc., April 1993 + +****************************************************************************/ + +#define _XIEC_ROI + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Module Specific Includes + */ +#include +#include +#include +#include + +/* + * Xie protocol proceedures called from the dispatcher + */ +int ProcCreateROI(); +int ProcDestroyROI(); +int SProcCreateROI(); +int SProcDestroyROI(); + +/* + * routines referenced by other modules. + */ +int DeleteROI(); + + +/*------------------------------------------------------------------------ +--------------------------- CreateROI Procedures ------------------------- +------------------------------------------------------------------------*/ +int ProcCreateROI(client) + ClientPtr client; +{ + roiPtr roi; + REQUEST(xieCreateROIReq); + REQUEST_SIZE_MATCH(xieCreateROIReq); + LEGAL_NEW_RESOURCE(stuff->roi, client); + + /* create a new lookup table + */ + if( !(roi = (roiPtr) XieCalloc(sizeof(roiRec))) ) + return(client->errorValue = stuff->roi, BadAlloc); + + roi->ID = stuff->roi; + roi->refCnt = 1; + ListInit(&roi->strips); + + return( AddResource(roi->ID, RT_ROI, (roiPtr)roi) + ? Success : (client->errorValue = stuff->roi, BadAlloc) ); +} /* end ProcCreateROI */ + + +/*------------------------------------------------------------------------ +------------------------ DestroyROI Procedures -------------------------- +------------------------------------------------------------------------*/ +int ProcDestroyROI(client) + ClientPtr client; +{ + roiPtr roi; + REQUEST( xieDestroyROIReq ); + REQUEST_SIZE_MATCH( xieDestroyROIReq ); + + if( !(roi = (roiPtr) LookupIDByType(stuff->roi, RT_ROI)) ) + return( SendResourceError(client, xieErrNoROI, stuff->roi) ); + + /* Disassociate the ROI from core X -- it calls DeleteROI() + */ + FreeResourceByType(stuff->roi, RT_ROI, RT_NONE); + + return(Success); +} /* end ProcDestroyROI */ + + +/*------------------------------------------------------------------------ +----------------------- deleteFunc: DeleteROI --------------------------- +------------------------------------------------------------------------*/ +int DeleteROI(roi, id) + roiPtr roi; + xieTypROI id; +{ + if( --roi->refCnt ) + return(Success); + + FreeStrips(&roi->strips); + XieFree(roi); + + return(Success); +} /* end DeleteROI */ + +int SProcCreateROI(client) +ClientPtr client; +{ + register int n; + REQUEST(xieCreateROIReq); + swaps(&stuff->length, n); + REQUEST_SIZE_MATCH(xieCreateROIReq); + swapl(&stuff->roi,n); + return (ProcCreateROI(client)); +} /* end SProcCreateROI */ + +int SProcDestroyROI(client) +ClientPtr client; +{ + register int n; + REQUEST( xieDestroyROIReq ); + swaps(&stuff->length, n); + REQUEST_SIZE_MATCH( xieDestroyROIReq ); + swapl(&stuff->roi,n); + return (ProcDestroyROI(client)); +} /* end SProcDestroyROI */ + +/* end module ROI.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/request/session.c b/xie/xc/programs/Xserver/XIE/dixie/request/session.c new file mode 100644 index 0000000..f81b0c1 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/request/session.c @@ -0,0 +1,346 @@ +/* $XConsortium: session.c,v 1.6 94/04/17 20:33:58 rws Exp $ */ +/**** session.c ****/ +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + session.c: Initialization code for the XIE server. + + Dean Verheiden -- AGE Logic, Inc March, 1993 + +*****************************************************************************/ + +#define _XIEC_SESSION + +#define NEED_REPLIES +#include "X.h" /* Needed for just about anything */ +#include "Xproto.h" /* defines protocol-related stuff */ +#include "misc.h" /* includes os.h, which type FatalError */ +#include "dixstruct.h" /* this picks up ClientPtr definition */ +#include "extnsionst.h" /* defines things like ExtensionEntry */ +#include /* needed if we do any printf's */ + +#include "XIE.h" +#include "XIEproto.h" /* Xie protocol specification */ +#include /* core X interface routine definitions */ +#include +#include /* server internal macros */ + +#include +#include /* extern def for technique_init */ + +/* function declarations */ +static int XieDispatch(), /* dispatcher for XIE opcodes */ + SXieDispatch(), /* dispatcher for swapped code */ + DeleteXieClient(); /* Clean up routine */ +static void XieReset(); /* reset the XIE code, eg, on reboot */ +static int DdxInit(); + +#define REPORT_MEMORY_LEAKS +#ifdef REPORT_MEMORY_LEAKS +extern int ALLOCS; +extern int STRIPS; +extern int BYTES; +#endif + +ExtensionEntry *extEntry; +RESTYPE RC_XIE; /* XIE Resource Class */ +#if XIE_FULL +RESTYPE RT_COLORLIST; /* ColorList resource type */ +#endif +RESTYPE RT_LUT; /* Lookup table resource type */ +RESTYPE RT_PHOTOFLO; /* Photoflo resource type */ +RESTYPE RT_PHOTOMAP; /* Photomap resource type */ +RESTYPE RT_PHOTOSPACE; /* Photospace resource type */ +#if XIE_FULL +RESTYPE RT_ROI; /* Region Of Interest type */ +#endif +RESTYPE RT_XIE_CLIENT; /* XIE Type for Shutdown Notice */ + +struct _client_table { + XID Shutdown_id; + int (**proc_table)(); /* Table of version specific procedures */ + int (**sproc_table)(); + CARD16 minorVersion; + CARD16 pad; +} client_table[MAXCLIENTS]; + +void XieInit() +{ + ExtensionEntry *AddExtension(); + + /* Initialize XIE Resources */ + RC_XIE = CreateNewResourceClass(); +#if XIE_FULL + RT_COLORLIST = RC_XIE | CreateNewResourceType(DeleteColorList); +#endif + RT_LUT = RC_XIE | CreateNewResourceType(DeleteLUT); + RT_PHOTOFLO = RC_XIE | CreateNewResourceType(DeletePhotoflo); + RT_PHOTOMAP = RC_XIE | CreateNewResourceType(DeletePhotomap); + RT_PHOTOSPACE = RC_XIE | CreateNewResourceType(DeletePhotospace); +#if XIE_FULL + RT_ROI = RC_XIE | CreateNewResourceType(DeleteROI); +#endif + RT_XIE_CLIENT = RC_XIE | CreateNewResourceType(DeleteXieClient); + + + extEntry = AddExtension(xieExtName, /* extension name */ + xieNumEvents, /* number of events */ + xieNumErrors, /* number of errors */ + XieDispatch, /* Xie's dispatcher */ + SXieDispatch, /* Swapped dispatch */ + XieReset, /* Reset XIE stuff */ + StandardMinorOpcode /* choose opcode dynamically */ + ); + + if (extEntry == NULL) + FatalError(" could not add Xie as an extension\n"); + + /* Initialize client table */ + bzero((char *)client_table, sizeof(client_table)); + + if (!technique_init() || DdxInit() != Success) + FatalError(" could not add Xie as an extension\n"); + +} + +/**********************************************************************/ +/* Register client with core X under a FakeClientID */ +static int RegisterXieClient(client, minor) +ClientPtr client; +CARD16 minor; +{ + client_table[client->index].Shutdown_id = FakeClientID(client->index); + client_table[client->index].minorVersion = minor; + + init_proc_tables(minor, + &(client_table[client->index].proc_table), + &(client_table[client->index].sproc_table)); + + /* Register the client with Core X for shutdown */ + return (AddResource(client_table[client->index].Shutdown_id, + RT_XIE_CLIENT, + &(client_table[client->index]))); +} + +/**********************************************************************/ +static int XieDispatch (client) + register ClientPtr client; +{ + REQUEST(xieReq); /* make "stuff" point to client's request buffer */ + + /* QueryImageExtension establishes a communication version */ + if (stuff->opcode == X_ieQueryImageExtension) + return (ProcQueryImageExtension(client)); + + /* First make sure that a communication version has been established */ + if (client_table[client->index].Shutdown_id == 0 && /* Pick a favorite */ + !RegisterXieClient(client, xieMinorVersion)) /* minor version */ + return ( BadAlloc ); + if (stuff->opcode > 0 && stuff->opcode <= xieNumProtoReq) + /* Index into version specific routines */ + return (CallProc(client)); + else + return ( BadRequest); +} + + +/**********************************************************************/ +static int SXieDispatch (client) + register ClientPtr client; +{ + REQUEST(xieReq); /* make "stuff" point to client's request buffer */ + + /* QueryImageExtension establishes a communication version */ + if (stuff->opcode == X_ieQueryImageExtension) + return (SProcQueryImageExtension(client)); + + /* First make sure that a communication version has been established */ + if (client_table[client->index].Shutdown_id == 0 && /* Pick a favorite */ + !RegisterXieClient(client, xieMinorVersion)) /* minor version */ + return ( BadAlloc ); + if (stuff->opcode > 0 && stuff->opcode <= xieNumProtoReq) + /* Index into version specific routines */ + return (CallSProc(client)); + + else + return ( BadRequest); +} + +/**********************************************************************/ +ProcQueryImageExtension(client) + register ClientPtr client; +{ + xieQueryImageExtensionReply reply; + XID FakeClientID(); + REQUEST(xieQueryImageExtensionReq); + REQUEST_SIZE_MATCH( xieQueryImageExtensionReq ); + + reply.type = X_Reply; + reply.sequenceNum = client->sequence; + + reply.majorVersion = xieMajorVersion; + + if (stuff->majorVersion != xieMajorVersion || + stuff->minorVersion < xieEarliestMinorVersion || + stuff->minorVersion > xieLatestMinorVersion) + reply.minorVersion = xieMinorVersion; + else + reply.minorVersion = stuff->minorVersion; + + reply.length = sizeof(Preferred_levels)>>2; + +#if XIE_FULL + reply.serviceClass = xieValFull; +#else + reply.serviceClass = xieValDIS; +#endif + reply.alignment = ALIGNMENT; + reply.unconstrainedMantissa = UNCONSTRAINED_MANTISSA; + reply.unconstrainedMaxExp = UNCONSTRAINED_MAX_EXPONENT; + reply.unconstrainedMinExp = UNCONSTRAINED_MIN_EXPONENT; + + /* + If this is the first QueryImageExtension for this client, register fake_id + with Core X to get a closedown notification later + */ + if (client_table[client->index].Shutdown_id == 0) + if (!RegisterXieClient(client, reply.minorVersion)) + return ( BadAlloc ); + + /*** Take care of swapping bytes if necessary ***/ + if (client->swapped) { + register int n; + + swaps(&reply.sequenceNum,n); + swapl(&reply.length,n); + swaps(&reply.majorVersion,n); + swaps(&reply.minorVersion,n); + swaps(&reply.unconstrainedMantissa,n); + swapl(&reply.unconstrainedMaxExp,n); + swapl(&reply.unconstrainedMinExp,n); + } + WriteToClient(client,sz_xieQueryImageExtensionReply,(char*)&reply); + + /* + * Send the list of preferred levels (swapped as necessary) + */ + if(reply.length) + if(client->swapped) + CopySwap32Write(client,sizeof(Preferred_levels),Preferred_levels); + else + WriteToClient(client,sizeof(Preferred_levels),(char*)Preferred_levels); + + return(Success); +} + + +/**********************************************************************/ +SProcQueryImageExtension(client) + register ClientPtr client; +{ + REQUEST(xieQueryImageExtensionReq); + register int n; + swaps(&stuff->length,n); + swaps(&stuff->majorVersion, n); + swaps(&stuff->minorVersion, n); + return( ProcQueryImageExtension(client) ); +} + +/************************************************************************/ + +static int DdxInit() +{ + return Success; +} + +/**********************************************************************/ +static int DeleteXieClient(data, id) +pointer data; +XID id; +{ + bzero((char *)&(client_table[CLIENT_ID(id)]), sizeof(struct _client_table)); +} + +/**********************************************************************/ +static void XieReset (extEntry) + ExtensionEntry *extEntry; +{ +#ifdef REPORT_MEMORY_LEAKS + + /* memory leak debug code + */ + /* Initialize client table */ + bzero((char *)client_table, sizeof(client_table)); + if(ALLOCS) /* check on outstanding mallocs and callocs */ + ErrorF("XieReset: %d allocs still outstanding.\n", ALLOCS); + + if(STRIPS || BYTES) /* check on outstanding data manager allocs */ + ErrorF("XieReset: %d strips with %d data bytes still outstanding.\n", + STRIPS, BYTES); +#endif +} + +/**** End of session.c ****/ diff --git a/xie/xc/programs/Xserver/XIE/dixie/request/tables.c b/xie/xc/programs/Xserver/XIE/dixie/request/tables.c new file mode 100644 index 0000000..668cbd6 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/request/tables.c @@ -0,0 +1,350 @@ +/* $XConsortium: tables.c,v 1.4 94/04/17 20:33:59 rws Exp $ */ +/**** tables.c ****/ +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + tables.c: XIE vector tables + + Dean Verheiden, AGE Logic, Inc March 1993 + +****************************************************************************/ + +#define _XIEC_TABLES + +#define NEED_REPLIES +#include "X.h" /* Needed for just about anything */ +#include "Xproto.h" /* defines protocol-related stuff */ +#include "misc.h" /* includes os.h, which type FatalError */ +#include "dixstruct.h" /* this picks up ClientPtr definition */ +#include /* needed if we do any printf's */ + +#include "XIE.h" +#include "XIEproto.h" /* Xie v4 protocol specification */ +#include /* interface to core X definitions */ +#include +#include + + +/*------------------------------------------------------------------------ +------------------------ Procedure Not Implemented ----------------------- +------------------------------------------------------------------------*/ +static int ProcNotImplemented(client) + ClientPtr client; +{ + return( BadRequest ); +} /* end ProcNotImplemented */ + + +/*------------------------------------------------------------------------ +---------------- Error stub for unsupported element types ---------------- +------------------------------------------------------------------------*/ +static peDefPtr ElementNotImplemented(flo,tag,pe) + floDefPtr flo; + xieTypPhototag tag; + xieFlo *pe; +{ + FloElementError(flo,tag,pe->elemType, return(NULL)); +} + +/*------------------------------------------------------------------------ +---------------- Array of DD entry points called from DI ---------------- +------------------------------------------------------------------------*/ +/* Very rarely, a device independent routine needs to access device dependent + code. Interface through this array. +*/ +xieVoidProc DDInterface[] = { + (xieVoidProc)DAGalyze, + (xieVoidProc)GetServerChoice +}; + + +#if XIE_FULL +static int (*ProcTable5_00[])() = { +/* 00 */ ProcNotImplemented, /* Illegal protocol request */ +/* 01 */ ProcNotImplemented, /* QueryImageExtension doesn't use the table */ +/* 02 */ ProcQueryTechniques, +/* 03 */ ProcCreateColorList, +/* 04 */ ProcDestroyColorList, +/* 05 */ ProcPurgeColorList, +/* 06 */ ProcQueryColorList, +/* 07 */ ProcCreateLUT, +/* 08 */ ProcDestroyLUT, +/* 09 */ ProcCreatePhotomap, +/* 10 */ ProcDestroyPhotomap, +/* 11 */ ProcQueryPhotomap, +/* 12 */ ProcCreateROI, +/* 13 */ ProcDestroyROI, +/* 14 */ ProcCreatePhotospace, +/* 15 */ ProcDestroyPhotospace, +/* 16 */ ProcExecuteImmediate, +/* 17 */ ProcCreatePhotoflo, +/* 18 */ ProcDestroyPhotoflo, +/* 19 */ ProcExecutePhotoflo, +/* 20 */ ProcModifyPhotoflo, +/* 21 */ ProcRedefinePhotoflo, +/* 22 */ ProcPutClientData, +/* 23 */ ProcGetClientData, +/* 24 */ ProcQueryPhotoflo, +/* 25 */ ProcAwait, +/* 26 */ ProcAbort + }; + +static int (*SProcTable5_00[])() = { +/* 00 */ ProcNotImplemented, /* Illegal protocol request */ +/* 01 */ ProcNotImplemented, /* QueryImageExtension doesn't use the table */ +/* 02 */ SProcQueryTechniques, +/* 03 */ SProcCreateColorList, +/* 04 */ SProcDestroyColorList, +/* 05 */ SProcPurgeColorList, +/* 06 */ SProcQueryColorList, +/* 07 */ SProcCreateLUT, +/* 08 */ SProcDestroyLUT, +/* 09 */ SProcCreatePhotomap, +/* 10 */ SProcDestroyPhotomap, +/* 11 */ SProcQueryPhotomap, +/* 12 */ SProcCreateROI, +/* 13 */ SProcDestroyROI, +/* 14 */ SProcCreatePhotospace, +/* 15 */ SProcDestroyPhotospace, +/* 16 */ SProcExecuteImmediate, +/* 17 */ SProcCreatePhotoflo, +/* 18 */ SProcDestroyPhotoflo, +/* 19 */ SProcExecutePhotoflo, +/* 20 */ SProcModifyPhotoflo, +/* 21 */ SProcRedefinePhotoflo, +/* 22 */ SProcPutClientData, +/* 23 */ SProcGetClientData, +/* 24 */ SProcQueryPhotoflo, +/* 25 */ SProcAwait, +/* 26 */ SProcAbort + }; + +peDefPtr (*MakeTable[])() = { +/* 00 */ ElementNotImplemented, +/* 01 */ MakeICLUT, +/* 02 */ MakeICPhoto, +/* 03 */ MakeICROI, +/* 04 */ MakeIDraw, +/* 05 */ MakeIDrawP, +/* 06 */ MakeILUT, +/* 07 */ MakeIPhoto, +/* 08 */ MakeIROI, +/* 09 */ MakeArith, +/* 10 */ MakeBandCom, +/* 11 */ MakeBandExt, +/* 12 */ MakeBandSel, +/* 13 */ MakeBlend, +/* 14 */ MakeCompare, +/* 15 */ MakeConstrain, +/* 16 */ MakeConvertFromIndex, +/* 17 */ MakeConvertFromRGB, +/* 18 */ MakeConvertToIndex, +/* 19 */ MakeConvertToRGB, +/* 20 */ MakeConvolve, +/* 21 */ MakeDither, +/* 22 */ MakeGeometry, +/* 23 */ MakeLogic, +/* 24 */ MakeMatchHistogram, +/* 25 */ MakeMath, +/* 26 */ MakePasteUp, +/* 27 */ MakePoint, +/* 28 */ MakeUnconstrain, +/* 29 */ MakeECHistogram, +/* 30 */ MakeECLUT, +/* 31 */ MakeECPhoto, +/* 32 */ MakeECROI, +/* 33 */ MakeEDraw, +/* 34 */ MakeEDrawPlane, +/* 35 */ MakeELUT, +/* 36 */ MakeEPhoto, +/* 37 */ MakeEROI + }; + +#else /* XIEdis */ + +static int (*ProcTable5_00[])() = { +/* 00 */ ProcNotImplemented, /* Illegal protocol request */ +/* 01 */ ProcNotImplemented, /* QueryImageExtension doesn't use the table */ +/* 02 */ ProcQueryTechniques, +/* 03 */ ProcNotImplemented, /* CreateColorList */ +/* 04 */ ProcNotImplemented, /* DestroyColorList */ +/* 05 */ ProcNotImplemented, /* PurgeColorList */ +/* 06 */ ProcNotImplemented, /* QueryColorList */ +/* 07 */ ProcCreateLUT, +/* 08 */ ProcDestroyLUT, +/* 09 */ ProcCreatePhotomap, +/* 10 */ ProcDestroyPhotomap, +/* 11 */ ProcQueryPhotomap, +/* 12 */ ProcNotImplemented, /* CreateROI */ +/* 13 */ ProcNotImplemented, /* DestroyROI */ +/* 14 */ ProcCreatePhotospace, +/* 15 */ ProcDestroyPhotospace, +/* 16 */ ProcExecuteImmediate, +/* 17 */ ProcCreatePhotoflo, +/* 18 */ ProcDestroyPhotoflo, +/* 19 */ ProcExecutePhotoflo, +/* 20 */ ProcModifyPhotoflo, +/* 21 */ ProcRedefinePhotoflo, +/* 22 */ ProcPutClientData, +/* 23 */ ProcGetClientData, +/* 24 */ ProcQueryPhotoflo, +/* 25 */ ProcAwait, +/* 26 */ ProcAbort + }; + +static int (*SProcTable5_00[])() = { +/* 00 */ ProcNotImplemented, /* Illegal protocol request */ +/* 01 */ ProcNotImplemented, /* QueryImageExtension doesn't use the table */ +/* 02 */ SProcQueryTechniques, +/* 03 */ ProcNotImplemented, /* CreateColorList */ +/* 04 */ ProcNotImplemented, /* DestroyColorList */ +/* 05 */ ProcNotImplemented, /* PurgeColorList */ +/* 06 */ ProcNotImplemented, /* QueryColorList */ +/* 07 */ SProcCreateLUT, +/* 08 */ SProcDestroyLUT, +/* 09 */ SProcCreatePhotomap, +/* 10 */ SProcDestroyPhotomap, +/* 11 */ SProcQueryPhotomap, +/* 12 */ ProcNotImplemented, /* CreateROI */ +/* 13 */ ProcNotImplemented, /* DestroyROI */ +/* 14 */ SProcCreatePhotospace, +/* 15 */ SProcDestroyPhotospace, +/* 16 */ SProcExecuteImmediate, +/* 17 */ SProcCreatePhotoflo, +/* 18 */ SProcDestroyPhotoflo, +/* 19 */ SProcExecutePhotoflo, +/* 20 */ SProcModifyPhotoflo, +/* 21 */ SProcRedefinePhotoflo, +/* 22 */ SProcPutClientData, +/* 23 */ SProcGetClientData, +/* 24 */ SProcQueryPhotoflo, +/* 25 */ SProcAwait, +/* 26 */ SProcAbort + }; + +peDefPtr (*MakeTable[])() = { +/* 00 */ ElementNotImplemented, +/* 01 */ MakeICLUT, +/* 02 */ MakeICPhoto, +/* 03 */ ElementNotImplemented, /* ICROI */ +/* 04 */ MakeIDraw, +/* 05 */ MakeIDrawP, +/* 06 */ MakeILUT, +/* 07 */ MakeIPhoto, +/* 08 */ ElementNotImplemented, /* IROI */ +/* 09 */ ElementNotImplemented, /* Arith */ +/* 10 */ ElementNotImplemented, /* BandCom */ +/* 11 */ ElementNotImplemented, /* BandExt */ +/* 12 */ ElementNotImplemented, /* BandSel */ +/* 13 */ ElementNotImplemented, /* Blend */ +/* 14 */ ElementNotImplemented, /* Compare */ +/* 15 */ ElementNotImplemented, /* Constrain */ +/* 16 */ ElementNotImplemented, /* ConvertFromIndex */ +/* 17 */ ElementNotImplemented, /* ConvertFromRGB */ +/* 18 */ ElementNotImplemented, /* ConvertToIndex */ +/* 19 */ ElementNotImplemented, /* ConvertToRGB */ +/* 20 */ ElementNotImplemented, /* Convolve */ +/* 21 */ ElementNotImplemented, /* Dither */ +/* 22 */ MakeGeometry, +/* 23 */ ElementNotImplemented, /* Logic */ +/* 24 */ ElementNotImplemented, /* MatchHistogram */ +/* 25 */ ElementNotImplemented, /* Math */ +/* 26 */ ElementNotImplemented, /* PasteUp */ +/* 27 */ MakePoint, +/* 28 */ ElementNotImplemented, /* Unconstrain */ +/* 29 */ ElementNotImplemented, /* ECHistogram */ +/* 30 */ MakeECLUT, +/* 31 */ MakeECPhoto, +/* 32 */ ElementNotImplemented, /* ECROI */ +/* 33 */ MakeEDraw, +/* 34 */ MakeEDrawPlane, +/* 35 */ MakeELUT, +/* 36 */ MakeEPhoto, +/* 37 */ ElementNotImplemented /* EROI */ + }; +#endif + +/************************************************************************ + Fill in the version specific tables for the selected minor protocol + version +************************************************************************/ +void init_proc_tables(minorVersion, ptable, sptable) + CARD16 minorVersion; + int (**ptable[])(), (**sptable[])(); +{ + /* Kind of boring with only one version to work with */ + switch (minorVersion) { + case 0: + *ptable = ProcTable5_00; + *sptable = SProcTable5_00; + break; + default: + *ptable = ProcTable5_00; + *sptable = SProcTable5_00; + } +} + +/* end module tables.c */ diff --git a/xie/xc/programs/Xserver/XIE/dixie/request/technq.c b/xie/xc/programs/Xserver/XIE/dixie/request/technq.c new file mode 100644 index 0000000..462156b --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/dixie/request/technq.c @@ -0,0 +1,371 @@ +/* $XConsortium: technq.c,v 1.6 94/04/17 20:34:00 rws Exp $ */ +/**** module technq.c ****/ +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +**************************************************************************** + technq.c: Routines to handle technique protocol requests + + Dean Verheiden AGE Logic, Inc. April 1993 +****************************************************************************/ + +#define _XIEC_TECHNQ + +/* + A Note on Technique Etiquette: + + To change technique defaults, or add new techniques or technique + groups, don't edit this file. Make the appropriate changes to the technq.h + file. + + If the changes result in the creation of a new default technique or + allow a technique to use default parameters, it is also necessary that + the corresponding technique copy function be updated to supply default + parameters should they be required. +*/ + + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include + +/* + * Element Specific Includes + */ +#include +#include +#include +#include + +/* + * Xie protocol proceedures called from the dispatcher + */ +int ProcQueryTechniques(); +int SProcQueryTechniques(); + +/* + * Functions called by other Xie procedures + */ +techVecPtr FindTechnique(); + +/* + * Used internally by this module + */ +static Bool send_reply(); +static Bool send_technique_replies(); + +/*------------------------------------------------------------------------ +------------------------ QueryTechniques Procedures ----------------------- +------------------------------------------------------------------------*/ +int ProcQueryTechniques(client) + ClientPtr client; +{ + xieQueryTechniquesReply rep; + REQUEST( xieQueryTechniquesReq ); + REQUEST_SIZE_MATCH( xieQueryTechniquesReq ); + + /* + * Fill in the reply header + */ + bzero((char *)&rep, sz_xieQueryTechniquesReply); + rep.type = X_Reply; + rep.sequenceNum = client->sequence; + + /* First, figure out how big the ListofTechniqueRecs is going to be */ + if (stuff->techniqueGroup == xieValDefault) { + rep.numTechniques = techTable.numDefaults; + rep.length = techTable.defaultSize; + } else if (stuff->techniqueGroup == xieValAll) { + rep.numTechniques = techTable.numTechniques; + rep.length = techTable.tableSize; + } else { + TechGroupPtr tg = techTable.techgroups; + int g; + + for (g = 0; g < techTable.numGroups; g++, tg++) + if (stuff->techniqueGroup == tg->group) { + rep.numTechniques = tg->numTechniques; + rep.length = tg->groupSize; + break; + } + + if (g >= techTable.numGroups) /* Couldn't find the group */ + return(BadValue); + } + + if( client->swapped ) { + /* + * Swap the reply header fields + */ + register int n; + + swaps(&rep.sequenceNum,n); + swapl(&rep.length,n); + swaps(&rep.numTechniques,n); + } + + WriteToClient(client, sz_xieQueryTechniquesReply, (char *)&rep); + + send_technique_replies(stuff->techniqueGroup,client); + + return(Success); +} /* end ProcQueryTechniques */ + +int SProcQueryTechniques(client) + ClientPtr client; +{ + register int n; + REQUEST( xieQueryTechniquesReq ); + swaps(&stuff->length, n); + REQUEST_SIZE_MATCH( xieQueryTechniquesReq ); + return (ProcQueryTechniques(client)); +} /* end SProcQueryTechniques */ + +/************************************************************************* + Initialization Procedure: Fill in various technique fields +*************************************************************************/ + +Bool technique_init() +{ + CARD32 defaultSize = 0; + CARD32 tableSize = 0; + CARD32 numTechniques = 0; + CARD32 numDefaults = 0; + TechGroupPtr tg = techTable.techgroups; + int g; + + for (g = 0; g < techTable.numGroups; g++, tg++) { + TechPtr tp = tg->tech; + CARD16 defaultNumber = tg->defaultNumber; + Bool needDefault = (defaultNumber != NO_DEFAULT); + CARD32 groupSize = 0; + int t; + + for (t = 0; t < tg->numTechniques; t++, tp++) { + tp->nameLength = strlen((char *)(tp->name)); + tp->techSize = (sizeof(xieTypTechniqueRec) + tp->nameLength + 3) + >> 2; + groupSize += tp->techSize; + if (needDefault && defaultNumber == tp->techvec.number) { + tg->defaultIndex = t; + defaultSize += tp->techSize; + numDefaults++; + needDefault = FALSE; + } + } + if (needDefault) return (FALSE); + tg->groupSize = groupSize; + tableSize += groupSize; + numTechniques += tg->numTechniques; + } + + techTable.numTechniques = numTechniques; + techTable.numDefaults = numDefaults; + techTable.tableSize = tableSize; + techTable.defaultSize = defaultSize; + + return (TRUE); +} /* end technique_init */ + +/************************************************************************* + Send Technique Reply: send technique structures to client, one at a time, + swapping them first if necessary +*************************************************************************/ + +static Bool send_reply(group, tech, client) +xieTypTechniqueGroup group; +TechPtr tech; +ClientPtr client; +{ + xieTypTechniqueRec rep; + + rep.needsParam = !(tech->techvec.NoTech || tech->techvec.OptionalTech); + rep.group = group; + rep.number = (client->swapped) ? lswaps(tech->techvec.number) : + tech->techvec.number; + rep.speed = tech->speed; + rep.nameLength = tech->nameLength; + + /* Send everything except the name */ + WriteToClient(client, sz_xieTypTechniqueRec, (char *)&rep); + /* Send the name */ + WriteToClient(client, tech->nameLength, (char *)tech->name); + + return(TRUE); +} + +static Bool send_technique_replies(group,client) +xieTypTechniqueGroup group; +ClientPtr client; +{ + if (group == xieValDefault) { + TechGroupPtr tg = techTable.techgroups; + int g; + + for (g = 0; g < techTable.numGroups; g++, tg++) + if (tg->defaultNumber != NO_DEFAULT) + send_reply(tg->group,&tg->tech[tg->defaultIndex],client); + return (TRUE); + } else if (group == xieValAll) { + TechGroupPtr tg = techTable.techgroups; + int g; + + for (g = 0; g < techTable.numGroups; g++, tg++) { + TechPtr tp = tg->tech; + int t = 0; + + for (t = 0; t < tg->numTechniques; t++, tp++) + send_reply(tg->group,tp,client); + } + return (TRUE); + } else { + TechGroupPtr tg = techTable.techgroups; + int g; + + for (g = 0; g < techTable.numGroups; g++, tg++) + if (group == tg->group) { + TechPtr tp = tg->tech; + int t = 0; + + for (t = 0; t < tg->numTechniques; t++, tp++) + send_reply(group,tp,client); + + return(TRUE); + } + } + + return(FALSE); /* Unrecognized group */ +} /* end return_technique_replies */ + +/************************************************************************* +FindTechnique: return group's technique entry point structure +*************************************************************************/ +techVecPtr FindTechnique(group,number) +xieTypTechniqueGroup group; +CARD16 number; +{ + TechGroupPtr tg = techTable.techgroups; + int g; + + for (g = 0; g < techTable.numGroups; g++, tg++) + if (group == tg->group) { + TechPtr tp = tg->tech; + int t = 0; + + if (number == xieValDefault) { + if (tg->defaultNumber) + return (&tg->tech[tg->defaultIndex].techvec); + else + return((techVecPtr)NULL); /* No default for this group */ + } else { + for (t = 0; t < tg->numTechniques; t++, tp++) + if (tp->techvec.number == number) + return (&tp->techvec); + } + } + + return((techVecPtr)NULL); /* Unrecognized group */ +} /* end FindTechnique */ + +/************************************************************************* +NoParamCheck: Used as copyfnc for techniques that do not have parameters. + Checks to make sure that no parameters have been passed in. +*************************************************************************/ +static Bool NoParamCheck(flo, rparms, cparms, tsize) + floDefPtr flo; + pointer rparms, cparms; + CARD16 tsize; +{ + return(!tsize); +} /* end NoParamCheck */ + +/************************************************************************* +NoTechYet: error stub for unimplemented technique routines +*************************************************************************/ +static Bool NoTechYet(flo, ped, parm, tech) + floDefPtr flo; + peDefPtr ped; + pointer parm; + pointer tech; +{ + return(FALSE); +} /* end NoTechYet */ + +/* end module technq.c */ diff --git a/xie/xc/programs/Xserver/XIE/include/colorlst.h b/xie/xc/programs/Xserver/XIE/include/colorlst.h new file mode 100644 index 0000000..3e89682 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/include/colorlst.h @@ -0,0 +1,95 @@ +/* $XConsortium: colorlst.h,v 1.4 94/04/17 20:34:01 rws Exp $ */ +/**** colorlst.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +******************************************************************************* + + colorlst.h -- contains color list specific definitions + + Robert NC Shelley -- AGE Logic, Inc. March 1993 + +******************************************************************************/ + +#ifndef _XIEH_COLORLST +#define _XIEH_COLORLST + +/* colorlist structure definition + */ +typedef struct _colorlist { + xieTypColorList ID; + INT32 refCnt; + ClientPtr client; + Colormap mapID; + ColormapPtr mapPtr; + CARD32 cellCnt; + Pixel *cellPtr; +} colorListRec, *colorListPtr; + +#ifndef _XIEC_COLORLST +extern colorListPtr LookupColorList(); +extern void ResetColorList(); +#endif + +#endif /* end _XIEH_COLORLST */ diff --git a/xie/xc/programs/Xserver/XIE/include/corex.h b/xie/xc/programs/Xserver/XIE/include/corex.h new file mode 100644 index 0000000..a88acca --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/include/corex.h @@ -0,0 +1,168 @@ +/* $XConsortium: corex.h,v 1.5 94/04/17 20:34:01 rws Exp $ */ +/**** module corex.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +******************************************************************************* + + corex.h - Xie server interface (for hooking to Core X) + + Dean Verheiden -- AGE Logic, Inc. April, 1993 + +******************************************************************************/ + +#ifndef _XIEH_COREX +#define _XIEH_COREX + +#include + +/* temporary hack: + * + * XIE is suppose to support single-band images up to the depth + * of the deepest drawable supported by the server -- but not less than 16. + * Triple-band data should never be more than 16 bits. + * + * Later releases will compute the correct value, but it will not exceed 24 + * in the sample implementation. (eeeck, sounds like a global variable..) + */ + +#define MAX_SINGLE 24 +#define MAX_TRIPLE 16 +#define MAX_DEPTH(nbands) (nbands > 1 ? MAX_TRIPLE : MAX_SINGLE) +#define MAX_LEVELS(nbands) (nbands > 1 ? (1< + +/* + * Generic Definitions + */ +#define SRCtag 0 /* inFlo index for src of single input elements */ +#define SRCt1 0 /* inFlo index for src1 of multi-input elements */ +#define SRCt2 1 /* inFlo index for src2 of multi-input elements */ +#define SRCt3 2 /* inFlo index for src3 of multi-input elements */ +#define LUTtag 1 /* inFlo index for lut input of point element */ + /* inFlo index for alpha stored in private structure*/ + /* inFlo index for domain input is inFloCnt - 1 */ + +#define IMPORT 0 /* inFlo index for "imported" data */ + + +#if defined(_XIEC_IDRAW) || defined(_XIEC_IDRAWP) +/* + * dixie element-private data for the ImportDrawable and ImportDrawablePlane + * elements + */ +typedef struct _idrawdef { + CARD32 pvtBytes; + DrawablePtr pDraw; +} iDrawDefRec, *iDrawDefPtr; +#endif /* _XIEC_IDRAW || _XIEC_IDRAWP */ + +#if defined(_XIEC_ILUT) +/* + * dixie element-private data for the ImportLUT element + */ +typedef struct _ilutdef { + CARD32 pvtBytes; + lutPtr lut; +} iLUTDefRec, *iLUTDefPtr; +#endif /* _XIEC_ILUT */ + +#if defined(_XIEC_IPHOTO) +/* + * dixie element-private data for the ImportPhotomap element + */ +typedef struct _iphotodef { + CARD32 pvtBytes; + photomapPtr map; +} iPhotoDefRec, *iPhotoDefPtr; +#endif /* _XIEC_IPHOTO */ + +#if defined(_XIEC_IROI) +/* + * dixie element-private data for the ImportROI element + */ +typedef struct _iroidef { + CARD32 pvtBytes; + roiPtr roi; +} iROIDefRec, *iROIDefPtr; +#endif /* _XIEC_IROI */ + +#if defined(_XIEC_PARITH) +/* + * dixie element-private data for the Arithmetic element + */ +typedef struct _parith { + CARD32 pvtBytes; + double constant[xieValMaxBands]; +} pArithDefRec, *pArithDefPtr; +#endif /* _XIEC_PARITH */ + +#if defined(_XIEC_PBANDE) +/* + * dixie element-private data for the band extract element + */ +typedef struct _pbandext { + CARD32 pvtBytes; + double coef[3]; + double bias; +} pBandExtDefRec, *pBandExtDefPtr; +#endif /* _XIEC_PBANDE */ + +#if defined(_XIEC_PBLEND) +/* + * dixie element-private data for the Arithmetic element + */ +typedef struct _pblend { + CARD32 pvtBytes; + CARD16 aindex; /* if non zero, index of alpha plane */ + CARD16 dindex; /* if non zero, index of proc domain */ + double constant[xieValMaxBands]; + double alphaConst; +} pBlendDefRec, *pBlendDefPtr; +#endif /* _XIEC_PBLEND */ + +#if defined(_XIEC_PCFRGB) +/* + * dixie element-private technique data for the ConvertFromRGB element + */ +typedef struct _ptecRBGtoCIELab_and_XYZdef { + double matrix[9]; + double whitePoint[3]; /* Optional whitePoint correction*/ + techVecPtr whiteTec; + xieTypWhiteAdjustTechnique whiteAdjusted; + CARD16 lenWhiteParams;/* Length for whitePoint params */ +} pTecRGBToCIEDefRec, *pTecRGBToCIEDefPtr; + +typedef struct _ptecRGBToYCbCr { + CARD32 levels0; + CARD32 levels1; + CARD32 levels2; + double red; + double green; + double blue; + double bias0; + double bias1; + double bias2; +} pTecRGBToYCbCrDefRec, *pTecRGBToYCbCrDefPtr; + +typedef struct _ptecRGBToYCC { + CARD32 levels0; + CARD32 levels1; + CARD32 levels2; + double red; + double green; + double blue; + double scale; +} pTecRGBToYCCDefRec, *pTecRGBToYCCDefPtr; + +#endif /* _XIEC_PCFRGB */ + +#if defined(_XIEC_PCFROMI) +/* + * dixie element-private data for the ConvertFromIndex element + */ +typedef struct _pcfromidef { + CARD32 pvtBytes; + ColormapPtr cmap; + VisualPtr visual; + CARD16 class; + CARD16 cells; + CARD32 pixMsk[3]; + CARD8 pixPos[3]; + CARD8 precShift; +} pCfromIDefRec, *pCfromIDefPtr; +#endif /* _XIEC_PCFROMI */ + +#if defined(_XIEC_PCNST) +/* + * dixie element-private data for the Constrain element + */ +typedef struct _pcnst { + double input_low[3]; + double input_high[3]; + CARD32 output_low[3]; + CARD32 output_high[3]; +} pCnstDefRec, *pCnstDefPtr; +#endif /* _XIEC_PCNST */ + +#if defined(_XIEC_PCOMP) +/* + * dixie element-private data for the Arithmetic element + */ +typedef struct _pcompare { + CARD32 pvtBytes; + double constant[xieValMaxBands]; +} pCompareDefRec, *pCompareDefPtr; +#endif /* _XIEC_PCOMP */ + +#if defined(_XIEC_PCONV) +/* + * constant technique private data for the Convolve element + */ +#define ConvFloat float + +typedef struct _pconv { + ConvFloat constant[3]; +} pTecConvolveConstantDefRec, *pTecConvolveConstantDefPtr; +#endif /* _XIEC_PCONV */ + +#if defined(_XIEC_PCTOI) +/* + * dixie element-private data for the ConvertToIndex element + */ +typedef struct _pctoidef { + CARD32 pvtBytes; + colorListPtr list; + ColormapPtr cmap; + VisualPtr visual; + CARD32 mask[3]; + CARD16 cells; + CARD8 shft[3]; + CARD8 class; + CARD8 depth; + CARD8 stride; + BOOL graySrc; + BOOL dynamic; + BOOL preFmt; + BOOL doHist; + CARD32 levels[3]; +} pCtoIDefRec, *pCtoIDefPtr; + +typedef struct _pTecConvertToIndexMatchdef { + CARD32 pvtBytes; + double matchLimit; + double grayLimit; +} pTecConvertToIndexMatchDefRec, *pConvertToIndexMatchDefPtr; + +typedef struct _ptecctoi { + CARD32 fill; + BOOL defTech; +} pTecCtoIDefRec, *pTecCtoIDefPtr; + +#endif /* _XIEC_PCTOI */ + +#if defined(_XIEC_PCTRGB) +/* + * dixie element-private technique data for the ConvertToRGB element + */ +typedef struct _ptecCIELab_and_XYZtoRGBdef { + double matrix[9]; + double whitePoint[3]; /* Optional whitePoint correction*/ + techVecPtr whiteTec; + xieTypWhiteAdjustTechnique whiteAdjusted; + CARD16 lenWhiteParams;/* Length for whitePoint params */ + techVecPtr gamutTec; + xieTypGamutTechnique gamutCompress; + CARD16 lenGamutParams;/* Length for gamut params */ +} pTecCIEToRGBDefRec, *pTecCIEToRGBDefPtr; + +typedef struct _ptecYCCToRGB { + CARD32 levels0; + CARD32 levels1; + CARD32 levels2; + double red; + double green; + double blue; + double scale; + techVecPtr gamutTec; + xieTypGamutTechnique gamutCompress; + CARD16 lenGamutParams;/* Length for gamut params */ +} pTecYCCToRGBDefRec, *pTecYCCToRGBDefPtr; + +typedef struct _ptecYCbCrToRGB { + CARD32 levels0; + CARD32 levels1; + CARD32 levels2; + double red; + double green; + double blue; + double bias0; + double bias1; + double bias2; + techVecPtr gamutTec; + xieTypGamutTechnique gamutCompress; + CARD16 lenGamutParams;/* Length for gamut params */ +} pTecYCbCrToRGBDefRec, *pTecYCbCrToRGBDefPtr; + +#endif /* _XIEC_PCTRGB */ + + +#if defined(_XIEC_PGEOM) +/* + * dixie element-private data for the Geoemtry element + */ +typedef struct _geom_elem { + double coeffs[6]; + double constant[xieValMaxBands]; + int do_band[3]; +} pGeomDefRec, *pGeomDefPtr; + +/* + * constant technique private data for the Geometry element + */ +typedef struct _geom_nn { + int modify; +} pTecGeomNearestNeighborDefRec, *pTecGeomNearestNeighborDefPtr; + +typedef struct _geom_gauss { + double sigma; + double normalize; + int radius; + Bool simple; +} pTecGeomGaussianDefRec, *pTecGeomGaussianDefPtr; + +#endif /* _XIEC_PGEOM */ + +#if defined(_XIEC_PHIST) + +/* + * technique private structures + */ + +typedef struct _pmhistgaussian { + double mean; + double sigma; +} pTecHistogramGaussianDefRec, *pTecHistogramGaussianDefPtr; + +typedef struct _pmhisthyperbolic { + double constant; + Bool shapeFactor; +} pTecHistogramHyperbolicDefRec, *pTecHistogramHyperbolicDefPtr; + +#endif /* _XIEC_PHIST */ + +#if defined(_XIEC_PLOGIC) +/* + * dixie element-private data for the Logical element + */ +typedef struct _plogic { + CARD32 pvtBytes; + double constant[xieValMaxBands]; +} pLogicDefRec, *pLogicDefPtr; +#endif /* _XIEC_PLOGIC */ + +#if defined(_XIEC_PPASTE) +/* + * dixie element-private data for the Paste Up element + */ +#define PasteUpFloat float + +typedef struct _ppasteup { + CARD32 pvtBytes; + PasteUpFloat constant[xieValMaxBands]; +} pPasteUpDefRec, *pPasteUpDefPtr; +#endif /* _XIEC_PPASTE */ + +#if defined(_XIEC_ECPHOTO) +/* + * JPEG Baseline technique private data for the export client photo element + */ +typedef struct _eEndcodeJPEGBaselinedef { + CARD32 pvtBytes; + CARD8 *q; + CARD8 *a; + CARD8 *d; +} eTecEncodeJPEGBaselineDefRec, *eTecEncodeJPEGBaselineDefPtr; +#endif /* _XIEC_ECPHOTO */ + +#if defined(_XIEC_EDRAW) +/* + * dixie element-private data for the ExportDrawable element + */ +typedef struct _edrawdef { + CARD32 pvtBytes; + DrawablePtr pDraw; + GCPtr pGC; +} eDrawDefRec, *eDrawDefPtr; +#endif /* _XIEC_EDRAW */ + +#if defined(_XIEC_EDRAWP) +/* + * dixie element-private data for the ExportDrawable element + */ +typedef struct _edrawpdef { + CARD32 pvtBytes; + DrawablePtr pDraw; + GCPtr pGC; +} eDrawPDefRec, *eDrawPDefPtr; +#endif /* _XIEC_EDRAWP */ + +#if defined(_XIEC_ELUT) +/* + * dixie element-private data for the ExportLUT element + */ +typedef struct _elutdef { + CARD32 pvtBytes; + lutPtr lut; +} eLUTDefRec, *eLUTDefPtr; +#endif /* _XIEC_ELUT */ + +#if defined(_XIEC_EPHOTO) || defined(_XIEC_ECPHOTO) || defined(_XIEC_SCHOICE) +/* + * dixie element-private data for the ExportPhotomap/ExportClientPhoto elements + */ +typedef struct _ephotodef { + CARD32 pvtBytes; + photomapPtr map; + BOOL serverChose; /* TRUE = server chose encode technique */ + BOOL congress; /* make sure no work gets done */ + CARD16 encodeNumber; /* encode technique number */ + CARD16 encodeLen; /* length of encode parms */ + pointer encodeParms; /* pointer to parms to be used for encode */ + CARD16 decodeNumber; /* decode technique number */ + CARD16 decodeLen; /* length of decode parms */ + pointer decodeParms; /* pointer to parms to be used for decode */ + pointer pvtParms; +} ePhotoDefRec, *ePhotoDefPtr; +#endif /* _XIEC_EPHOTO || _XIEC_ECPHOTO || _XIEC_SCHOICE */ + +#if defined(_XIEC_EROI) +/* + * dixie element-private data for the ExportROI element + */ +typedef struct _eroidef { + CARD32 pvtBytes; + roiPtr roi; +} eROIDefRec, *eROIDefPtr; +#endif /* _XIEC_EROI */ + +#endif /* module _XIEH_ELEMENT */ diff --git a/xie/xc/programs/Xserver/XIE/include/error.h b/xie/xc/programs/Xserver/XIE/include/error.h new file mode 100644 index 0000000..9265457 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/include/error.h @@ -0,0 +1,161 @@ +/* $XConsortium: error.h,v 1.4 94/04/17 20:34:03 rws Exp $ */ +/**** module error.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +******************************************************************************* + + error.h -- error specific definitions + + Robert NC Shelley -- AGE Logic, Inc. April, 1993 + +******************************************************************************/ + +#ifndef _XIEH_ERROR +#define _XIEH_ERROR + +#ifndef _XIEC_ERROR +#include +extern int SendResourceError(); +extern int SendFloIDError(); +extern int SendFloError(); +extern void ErrGeneric(); +extern void ErrResource(); +extern void ErrDomain(); +extern void ErrOperator(); +extern void ErrTechnique(); +extern void ErrValue(); +#endif + +/* + * Convenience macros for dealing with the floDef generic error packet + */ +#define ferrTag(flo) ((flo)->error.phototag) +#define ferrType(flo) ((flo)->error.type) +#define ferrCode(flo) ((flo)->error.floErrorCode) +#define ferrError(flo,tag,type,code) \ + (ferrTag(flo)=(tag),ferrType(flo)=(type),ferrCode(flo)=(code)) + +/* + * convenience macros for general flo errors + */ +#define FloAccessError(flo,tag,type,xfer) \ + {FloError(flo,(xieTypPhototag)tag,(CARD16)type,\ + (CARD8)xieErrNoFloAccess); xfer;} +#define FloAllocError(flo,tag,type,xfer) \ + {FloError(flo,(xieTypPhototag)tag,(CARD16)type,\ + (CARD8)xieErrNoFloAlloc); xfer;} +#define FloElementError(flo,tag,type,xfer) \ + {FloError(flo,(xieTypPhototag)tag,(CARD16)type,\ + (CARD8)xieErrNoFloElement); xfer;} +#define FloImplementationError(flo,tag,type,xfer) \ + {FloError(flo,(xieTypPhototag)tag,(CARD16)type,\ + (CARD8)xieErrNoFloImplementation); xfer;} +#define FloLengthError(flo,tag,type,xfer) \ + {FloError(flo,(xieTypPhototag)tag,(CARD16)type,\ + (CARD8)xieErrNoFloLength); xfer;} +#define FloSourceError(flo,tag,type,xfer) \ + {FloError(flo,(xieTypPhototag)tag,(CARD16)type,\ + (CARD8)xieErrNoFloSource); xfer;} + +/* + * convenience macros for element-specific flo errors + */ +#define AccessError(flo,ped,xfer) \ + {ErrGeneric(flo,ped,(CARD8)xieErrNoFloAccess); xfer;} +#define AllocError(flo,ped,xfer) \ + {ErrGeneric(flo,ped,(CARD8)xieErrNoFloAlloc); xfer;} +#define ColorListError(flo,ped,id,xfer) \ + {ErrResource(flo,ped,(CARD8)xieErrNoFloColorList,id); xfer;} +#define ColormapError(flo,ped,id,xfer) \ + {ErrResource(flo,ped,(CARD8)xieErrNoFloColormap,id); xfer;} +#define DomainError(flo,ped,dom,xfer) \ + {ErrDomain(flo,ped,dom); xfer;} +#define DrawableError(flo,ped,id,xfer) \ + {ErrResource(flo,ped,(CARD8)xieErrNoFloDrawable,id); xfer;} +#define ElementError(flo,ped,xfer) \ + {ErrGeneric(flo,ped,(CARD8)xieErrNoFloElement); xfer;} +#define GCError(flo,ped,id,xfer) \ + {ErrResource(flo,ped,(CARD8)xieErrNoFloGC,id); xfer;} +#define ImplementationError(flo,ped,xfer) \ + {ErrGeneric(flo,ped,(CARD8)xieErrNoFloImplementation); xfer;} +#define LUTError(flo,ped,id,xfer) \ + {ErrResource(flo,ped,(CARD8)xieErrNoFloLUT,id); xfer;} +#define MatchError(flo,ped,xfer) \ + {ErrGeneric(flo,ped,(CARD8)xieErrNoFloMatch); xfer;} +#define OperatorError(flo,ped,op,xfer) \ + {ErrOperator(flo,ped,(CARD8)op); xfer;} +#define PhotomapError(flo,ped,id,xfer) \ + {ErrResource(flo,ped,(CARD8)xieErrNoFloPhotomap,id); xfer;} +#define ROIError(flo,ped,id,xfer) \ + {ErrResource(flo,ped,(CARD8)xieErrNoFloROI,id); xfer;} +#define SourceError(flo,ped,xfer) \ + {ErrGeneric(flo,ped,(CARD8)xieErrNoFloSource); xfer;} +#define TechniqueError(flo,ped,group,tech,len,xfer) \ + {ErrTechnique(flo,ped,(CARD8)group,(CARD16)tech,(CARD16)len); \ + xfer;} +#define ValueError(flo,ped,value,xfer) \ + {ErrValue(flo,ped,value); xfer;} + +#endif /* end _XIEH_ERROR */ diff --git a/xie/xc/programs/Xserver/XIE/include/flo.h b/xie/xc/programs/Xserver/XIE/include/flo.h new file mode 100644 index 0000000..4b5ea20 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/include/flo.h @@ -0,0 +1,111 @@ +/* $XConsortium: flo.h,v 1.4 94/04/17 20:34:03 rws Exp $ */ +/**** module flo.h ****/ +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + flo.h -- high level photoflo-specific definitions + + Robert NC Shelley -- AGE Logic, Inc. April 1993 + +*****************************************************************************/ + +#ifndef _XIEH_FLO +#define _XIEH_FLO + +/* various structure pointers + */ +typedef struct _flotex *ddFloTexPtr; +typedef struct _petex *ddPETexPtr; +typedef struct _schedvec *ddSchedVecPtr; +typedef struct _stripvec *ddStripVecPtr; + +typedef struct _photospace *photospacePtr; +typedef struct _techvec *techVecPtr; + +/* various function type pointers + */ +typedef Bool (*xieBoolProc)(); +typedef CARD8 * (*xieDataProc)(); +typedef int (*xieIntProc)(); +typedef void (*xieVoidProc)(); + + +#ifndef _XIEC_FLO +extern struct _flodef *MakeFlo(); +extern Bool EditFlo(); +extern void PrepFlo(); +extern struct _flodef *FreeFlo(); +extern struct _pedef *MakePEDef(); +extern struct _pedef *FreePEDef(); +extern void SendClientData(); +extern Bool UpdateFormatfromLevels(); +#endif + +#ifndef _XIEC_EVENT +extern void SendFloEvent(); +#endif + +#endif /* end _XIEH_FLO */ diff --git a/xie/xc/programs/Xserver/XIE/include/flodata.h b/xie/xc/programs/Xserver/XIE/include/flodata.h new file mode 100644 index 0000000..431965d --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/include/flodata.h @@ -0,0 +1,170 @@ +/* $XConsortium: flodata.h,v 1.4 94/04/17 20:34:04 rws Exp $ */ +/**** module flodata.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +******************************************************************************* + + flodata.h - data formats + + Dean Verheiden, Robert NC Shelley -- AGE Logic, Inc. April 1993 + +******************************************************************************/ + +#ifndef _XIE_FLODATA +#define _XIE_FLODATA + +#include + +/* + * Supported data format classes + */ +#define BIT_PIXEL 1 /* bitonal data */ +#define BYTE_PIXEL 2 /* up to 2^8 levels */ +#define PAIR_PIXEL 3 /* up to 2^16 levels */ +#define QUAD_PIXEL 4 /* up to 2^32 levels */ +#define UNCONSTRAINED 16 /* levels are undefined */ +#define LUT_ARRAY 32 /* non-canonic lut array */ +#define RUN_LENGTH 64 /* non-canonic run_length */ +#define STREAM 128 /* non-canonic generic stream */ + +#define IsntLut(dfc) (dfc != LUT_ARRAY) +#define IsntDomain(dfc) (dfc & ~(RUN_LENGTH | BIT_PIXEL)) +#define IsntCanonic(dfc) (dfc & (RUN_LENGTH | STREAM | LUT_ARRAY)) +#define IsntConstrained(dfc) \ + (dfc & (UNCONSTRAINED | RUN_LENGTH | STREAM | LUT_ARRAY)) + +#define IsLut(dfc) (dfc == LUT_ARRAY) +#define IsDomain(dfc) (!IsntDomain(dfc)) +#define IsCanonic(dfc) (!IsntCanonic(dfc)) +#define IsConstrained(dfc) (!IsntConstrained(dfc)) + +#define IndexClass(dfc) (dfc == UNCONSTRAINED ? 0 : dfc ) + +#define ConstrainConst(fconst,levels) \ + ( (fconst <= 0.) ? (CARD32) 0 : \ + (fconst >= levels) ? (CARD32) (levels - 1) : \ + (CARD32) (fconst + 0.5)) + +/* + * Data types and sizes for supported format classes + */ +typedef CARD8 BitPixel; +typedef CARD8 BytePixel; +typedef CARD16 PairPixel; +typedef CARD32 QuadPixel; +typedef float RealPixel; /* type of Unconstrained data */ + +#define sz_BitPixel 1 +#define sz_BytePixel 8 +#define sz_PairPixel 16 +#define sz_QuadPixel 32 +#define sz_RealPixel 32 /* size of Unconstrained data */ + +typedef struct _format { + CARD8 class; /* format class {e.g. BIT_PIXEL, STREAM, ...} */ + CARD8 band; /* band number {0,1,2} */ + BOOL interleaved; /* true if pixels contain multiple bands */ + CARD8 depth; /* minimum bits needed to contain levels */ + CARD32 width; /* width in pixels */ + CARD32 height; /* height in pixels */ + CARD32 levels; /* quantization levels */ + CARD32 stride; /* distance between adjacent pixels in bits */ + CARD32 pitch; /* distance between adjacent scanlines in bits */ +} formatRec, *formatPtr; + + +typedef struct _strip { + struct _strip *flink; /* link to next strip */ + struct _strip *blink; /* link to previous strip */ + struct _strip *parent;/* link to strip from which this one was cloned */ + formatRec *format; /* pointer to format record that describes data */ + CARD32 refCnt; /* reference count */ + BOOL Xowner; /* if true, core X "owns" the data buffer */ + BOOL canonic; /* if true, units are scanlines, otherwise bytes */ + BOOL final; /* if true, this is the last strip for this band */ + BOOL cache; /* if true, buffer can be cached (standard size) */ + CARD32 start; /* first line/byte of overall data in this strip */ + CARD32 end; /* last line/byte of overall data in this strip */ + CARD32 length; /* lines/bytes of useable data in buffer */ + CARD32 bitOff; /* bit offset to first data (usually zero) */ + CARD32 bufSiz; /* size of the data buffer in bytes */ + CARD8 *data; /* pointer to the data buffer */ +} stripRec, *stripPtr; + +/* generic header for managing circular doubly linked lists + */ +typedef struct _lst { + struct _lst *flink; + struct _lst *blink; +} lstRec, *lstPtr; + +/* link-pair for managing a circular doubly linked list of strips + */ +typedef struct _striplst { + stripRec *flink; + stripRec *blink; +} stripLstRec, *stripLstPtr; + +#endif /* end _XIE_FLODATA */ diff --git a/xie/xc/programs/Xserver/XIE/include/flostr.h b/xie/xc/programs/Xserver/XIE/include/flostr.h new file mode 100644 index 0000000..f0ed95d --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/include/flostr.h @@ -0,0 +1,225 @@ +/* $XConsortium: flostr.h,v 1.6 95/05/18 21:14:49 dpw Exp $ */ +/**** module flostr.h ****/ +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + flostr.h -- DIXIE photoflo and element structure definitions + + Robert NC Shelley -- AGE Logic, Inc. April 1993 + +*****************************************************************************/ + +#ifndef _XIEH_FLOSTR +#define _XIEH_FLOSTR + +#include + +typedef CARD8 bandMsk; /* per-band bit mask (bit0 == band0,...)*/ + +/* dixie photo element entry points + */ +typedef struct _dielemvec { + xieBoolProc prep; /* prepare for analysis and execution */ + xieBoolProc debrief; /* post execution clean-up */ +} diElemVecRec, *diElemVecPtr; + +/* ddxie photo-element interface + */ +typedef struct _ddelemvec { + xieIntProc create; + xieIntProc initialize; + xieIntProc activate; + xieIntProc flush; + xieIntProc reset; + xieIntProc destroy; +} ddElemVecRec, *ddElemVecPtr; + +/* ddxie photoflo manager entry points + */ +typedef struct _flovec { + xieIntProc link; + xieIntProc startup; + xieIntProc resume; + xieIntProc shutdown; + xieIntProc destroy; +} floVecRec, *floVecPtr; + +/* ddxie client data manager entry points + */ +typedef struct _datavec { + xieIntProc input; + xieIntProc output; + xieIntProc query; +} dataVecRec, *dataVecPtr; + +/* photo-element inFlo definition + */ +typedef struct _inflo { + CARD8 bands; /* number of bands this input will receive */ + CARD8 index; /* inFlo index of this input */ + xieTypPhototag srcTag; /* phototag of source element */ + struct _pedef *srcDef; /* pointer to source element definition */ + struct _pedef *ownDef; /* pointer to this element's definition */ + struct _inflo *outChain; /* chain of inFlos sharing the same output */ + formatRec format[xieValMaxBands]; /* data format per input band */ +} inFloRec, *inFloPtr; + +/* photo-element outFlo definition + */ +typedef struct _outflo { + inFloPtr outChain; /* chain of inFlos receiving output */ + bandMsk active; /* bands that will supply client data */ + bandMsk ready; /* bands that are holding client data */ + CARD8 bands; /* number of output bands */ + CARD8 pad; + stripLstRec output[xieValMaxBands];/* holding place for element's output */ + formatRec format[xieValMaxBands];/* data format per output band */ +} outFloRec, *outFloPtr; + +/* photo-element definition structure + */ +typedef struct _pedef { + struct _pedef *flink; /* foreword link in DAG-ordered peDef list */ + struct _pedef *blink; /* backword link in DAG-ordered peDef list */ + struct _pedef *clink; /* next element of the same class */ + struct _pedef *olink; /* link to optimized element */ + xieFlo *elemRaw; /* raw (swapped) client element */ + pointer elemPvt; /* dixie element-private info */ + pointer techPvt; /* dixie technique-private info */ + techVecPtr techVec; /* technique vectors */ + ddPETexPtr peTex; /* DDXIE execution context */ + inFloPtr inFloLst; /* pointer to in-line array of input info */ + CARD16 inCnt; /* number of inputs (inc. LUT & domain) */ + xieTypPhototag phototag; /* phototag of this element */ + struct { + unsigned int import : 1; /* element performs import functions */ + unsigned int process : 1; /* element performs processing */ + unsigned int export : 1; /* element performs export functions */ + unsigned int getData : 1; /* element allows GetClientData */ + unsigned int putData : 1; /* element allows PutClientData */ + unsigned int modified : 1; /* modified attributes or parameters */ + unsigned int loop : 1; /* loop-detection flag */ + unsigned int reserved : 1; + } flags; + CARD8 swapUnits[xieValMaxBands]; /* size of client data aggregates */ + diElemVecPtr diVec; /* DIXIE entry point vector */ + ddElemVecRec ddVec; /* DDXIE entry point vector (in-line) */ + outFloRec outFlo; /* output attribute/connection info */ +#if 0 + inFloRec inFlo[inCnt]; /* array of in-line input connection info */ +#endif +} peDefRec, *peDefPtr; + +/* link-pair for managing a circular doubly linked list of peDefs + */ +typedef struct _pedlst { + peDefPtr flink; + peDefPtr blink; +} pedLstRec, *pedLstPtr; + +/* photoflo definition structure + */ +typedef struct _flodef { + struct _flodef *flink; /* foreword link in nameSpace (immed only) */ + struct _flodef *blink; /* backword link in nameSpace (immed only) */ + ClientPtr runClient; /* client that is running the flo */ + ClientPtr reqClient; /* client that is making current request */ + ClientPtr *awakenPtr; /* list of clients Awaiting flo done */ + CARD32 awakenCnt; /* number of clients Awaiting flo done */ + CARD32 ID; /* instance-id within nameSpace */ + CARD32 spaceID; /* photospace-id or 0 (serverIDspace) */ + photospacePtr space; /* photospacePtr or NULL */ + ddFloTexPtr floTex; /* DDXIE execution context info */ + floVecPtr floVec; /* DDXIE photoflo management entry points */ + dataVecPtr dataVec; /* DDXIE client data manager entry points */ + ddSchedVecPtr schedVec; /* DDXIE scheduler entry points */ + ddStripVecPtr stripVec; /* DDXIE strip manager entry points */ + pedLstRec defDAG; /* DAG peList (flink=import, blink=export) */ + pedLstRec optDAG; /* optimized DAG peList */ + peDefPtr *peArray; /* pointer to in-line peDef pointer array */ + CARD16 peCnt; /* number of elements in peArray */ + struct { + unsigned int active : 1; /* execute requested (else inactive) */ + unsigned int modified : 1; /* something changed since last execution */ + unsigned int notify : 1; /* send an event upon flo completion */ + unsigned int aborted : 1; /* the client aborted execution */ + unsigned int reserved : 12; + } flags; + xieFloEvn event; /* generic event packet */ + xieFloErr error; /* generic error packet */ +#if 0 + peDefPtr peArray[peCnt];/* array of peDef pointers */ +#endif +} floDefRec, *floDefPtr; + +/* link-pair for managing a circular doubly linked list of floDefs + */ +typedef struct _flolst { + floDefPtr flink; + floDefPtr blink; +} floLstRec, *floLstPtr; + +#endif /* end _XIEH_FLOSTR */ diff --git a/xie/xc/programs/Xserver/XIE/include/lut.h b/xie/xc/programs/Xserver/XIE/include/lut.h new file mode 100644 index 0000000..18b9dd7 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/include/lut.h @@ -0,0 +1,110 @@ +/* $XConsortium: lut.h,v 1.4 94/04/17 20:34:05 rws Exp $ */ +/**** module lut.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +******************************************************************************* + + lut.h: contains lut specific definitions + + Dean Verheiden -- AGE Logic, Inc. April 1993 + +******************************************************************************/ + +#ifndef _XIEH_LUT +#define _XIEH_LUT + +#include + +/* + * LUT resource definition + */ + +typedef struct _lutformat { + xieTypOrientation bandOrder; /* Lut order */ + CARD8 pad[3]; + CARD32 length; /* Input quantization levels */ + CARD32 level; /* Output quantization levels */ +} lutFormatRec, *lutFormatPtr; + +typedef struct _lut { + xieTypLUT ID; + CARD16 refCnt; + CARD8 lutCnt; + lutFormatRec format[xieValMaxBands]; + stripLstRec strips[xieValMaxBands]; /* lists of image strips */ +} lutRec, *lutPtr; + +/* + * Macros for working with Luts + * LutPitch(levels) - returns size of single lut array entry in bytes. + */ + +#define LutPitch(Levels) \ + (((Levels) == 0) ? 4 : \ + (((Levels) > (1<<16)) ? 4 : \ + (((Levels) > (1<<8)) ? 2 : 1))) + +#endif +/* end _XIEH_LUT */ diff --git a/xie/xc/programs/Xserver/XIE/include/macro.h b/xie/xc/programs/Xserver/XIE/include/macro.h new file mode 100644 index 0000000..9035234 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/include/macro.h @@ -0,0 +1,208 @@ +/* $XConsortium: macro.h,v 1.7 94/04/17 20:34:05 rws Exp $ */ +/**** module macro.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + macro.h -- XIE utility macros + + Robert NC Shelley -- AGE Logic, Inc. March 1993 + +******************************************************************************/ + +#ifndef _XIEH_MACRO +#define _XIEH_MACRO + +#include + +/* DDXIE photoflo management interface + */ +#define ddShutdown(flo) (flo->floVec ? (*flo->floVec->shutdown)(flo) : 0) +#define ddDestroy(flo) (flo->floVec ? (*flo->floVec->destroy) (flo) : 0) +#define ddLink(flo) (*flo->floVec->link)(flo) +#define ddResume(flo) (*flo->floVec->resume)(flo) +#define ddStartup(flo) (*flo->floVec->startup)(flo) + +/* DDXIE client data management interface + */ +#define ddInput(flo,ped,band,data,bytes,final) \ + (*flo->dataVec->input)(flo,ped,band,data,bytes,final) +#define ddOutput(flo,ped,band,maxLen,term) \ + (*flo->dataVec->output)(flo,ped,band,maxLen,term) +#define ddQuery(flo,lst,im,ex) (*flo->dataVec->query)(flo,lst,im,ex) + +/* List management macros + */ +#define ListInit(head) \ + (((lstPtr)(head))->flink = (lstPtr)(head), \ + ((lstPtr)(head))->blink = (lstPtr)(head)) + +#define ListEnd(current,head) ((lstPtr)(current) == (lstPtr)(head)) + +#define ListEmpty(head) (((lstPtr)(head))->flink == (lstPtr)(head)) + +#define InsertMember(new,prev) \ + {lstPtr ptr = (lstPtr)(prev); \ + ((lstPtr)(new))->flink = ptr->flink; \ + ((lstPtr)(new))->blink = ptr; ptr->flink = (lstPtr)(new); \ + ((lstPtr)(new))->flink->blink = (lstPtr)(new);} + +#define RemoveMember(ptr,old) \ + (ptr=old, \ + ((lstPtr)(ptr))->blink->flink = ((lstPtr)(ptr))->flink, \ + ((lstPtr)(ptr))->flink->blink = ((lstPtr)(ptr))->blink) + + +/* return amount that should be added to 'len' to make it modulo 'pad' + */ +#define Align(len,pad) (((pad)-(len)%(pad))%(pad)) + + +/* swap a pair of pointers + */ +#define SwapPtr(p1,p2,pt) \ + (*((pointer *)&(pt)) = (pointer )(p1), \ + *((pointer *)&(p1)) = (pointer )(p2), \ + *((pointer *)&(p2)) = (pointer )(pt)) + + +/* compute the minimum number of bits ('depth') required to represent 'levels' + */ +#define SetDepthFromLevels(levels,depth) \ + if(levels > 2) { CARD32 _i = levels; \ + for(depth = 0; (_i >>= 1); ++depth); \ + if((1 << depth) - 1 & levels) ++depth; } \ + else depth = levels ? 1 : 32 + +/* event convenience macros + */ +#define SendElementEvent(flo,ped,code) \ + (flo->event.src = ped->phototag, \ + flo->event.type = ped->elemRaw->elemType, \ + flo->event.event = code, \ + SendFloEvent(flo)) +#define SendColorAllocEvent(flo,ped,clst,tn,td) \ + {((xieColorAllocEvn *)&flo->event)->colorList = clst; \ + ((xieColorAllocEvn *)&flo->event)->colorAllocTechnique = tn; \ + ((xieColorAllocEvn *)&flo->event)->data = td; \ + SendElementEvent(flo,ped,xieEvnNoColorAlloc);} +#define SendDecodeNotifyEvent(flo,ped,b,tn,dw,dh,abt) \ + {((xieDecodeNotifyEvn *)&flo->event)->bandNumber = b; \ + ((xieDecodeNotifyEvn *)&flo->event)->decodeTechnique = tn; \ + ((xieDecodeNotifyEvn *)&flo->event)->width = dw; \ + ((xieDecodeNotifyEvn *)&flo->event)->height = dh; \ + ((xieDecodeNotifyEvn *)&flo->event)->aborted = abt; \ + SendElementEvent(flo,ped,xieEvnNoDecodeNotify);} +#define SendExportAvailableEvent(flo,ped,b,d0,d1,d2) \ + {((xieExportAvailableEvn *)&flo->event)->bandNumber = b; \ + ((xieExportAvailableEvn *)&flo->event)->data0 = d0; \ + ((xieExportAvailableEvn *)&flo->event)->data1 = d1; \ + ((xieExportAvailableEvn *)&flo->event)->data2 = d2; \ + SendElementEvent(flo,ped,xieEvnNoExportAvailable);} +#define SendImportObscuredEvent(flo,ped,win,ex,ey,ew,eh) \ + {((xieImportObscuredEvn *)&flo->event)->window = win; \ + ((xieImportObscuredEvn *)&flo->event)->x = ex; \ + ((xieImportObscuredEvn *)&flo->event)->y = ey; \ + ((xieImportObscuredEvn *)&flo->event)->width = ew; \ + ((xieImportObscuredEvn *)&flo->event)->height = eh; \ + SendElementEvent(flo,ped,xieEvnNoImportObscured);} + + +#define ExecProc(client,opcode) \ + ((client_table[client->index].proc_table[opcode])(client)) +#define ExecSProc(client,opcode) \ + ((client_table[client->index].sproc_table[opcode])(client)) + +#define CallProc(client) (ExecProc(client,stuff->opcode)) +#define CallSProc(client) (ExecSProc(client,stuff->opcode)) + +#define MakeElement(flo,tag,pe) \ + ((MakeTable[pe->elemType])(flo,tag,pe)) + +#define ELEMENT(type) \ + register type *raw, *stuff = (type *)pe + +#define ELEMENT_SIZE_MATCH(type) \ + if(stuff->elemLength != sizeof(type)>>2) \ + FloLengthError(flo,tag,stuff->elemType, return(NULL)) + +#define ELEMENT_AT_LEAST_SIZE(type) \ + if(stuff->elemLength < sizeof(type)>>2) \ + FloLengthError(flo,tag,stuff->elemType, return(NULL)) + +#define ELEMENT_NEEDS_1_INPUT(input) \ + if(!(stuff->input)) \ + FloSourceError(flo,tag,stuff->elemType, return(NULL)) + +#define ELEMENT_NEEDS_2_INPUTS(input1,input2) \ + if(!(stuff->input1) || !(stuff->input2)) \ + FloSourceError(flo,tag,stuff->elemType, return(NULL)) + + +#define ELEMENT_NEEDS_3_INPUTS(input1,input2,input3) \ + if(!(stuff->input1) || !(stuff->input2) || !(stuff->input3)) \ + FloSourceError(flo,tag,stuff->elemType, return(NULL)) + +#endif /* end _XIEH_MACRO */ diff --git a/xie/xc/programs/Xserver/XIE/include/memory.h b/xie/xc/programs/Xserver/XIE/include/memory.h new file mode 100644 index 0000000..6e3ec16 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/include/memory.h @@ -0,0 +1,86 @@ +/* $XConsortium: memory.h,v 1.5 94/04/17 20:34:06 rws Exp $ */ +/**** module memory.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +******************************************************************************* + + memory.h - XIE memory management definitions + + Dean Verheiden -- AGE Logic, Inc. April 1993 + +******************************************************************************/ + +#ifndef _XIEH_MEMORY +#define _XIEH_MEMORY + +#include "misc.h" /* for pointer */ + +extern pointer XieMalloc(); +extern pointer XieCalloc(); +extern pointer XieRealloc(); +extern pointer XieFree(); + +#endif +/* end _XIEH_MEMORY */ diff --git a/xie/xc/programs/Xserver/XIE/include/photomap.h b/xie/xc/programs/Xserver/XIE/include/photomap.h new file mode 100644 index 0000000..68e13f5 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/include/photomap.h @@ -0,0 +1,105 @@ +/* $XConsortium: photomap.h,v 1.5 94/04/17 20:34:06 rws Exp $ */ +/**** module photomap.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + photomap.h -- contains photomap definitions + + Dean Verheiden, Robert NC Shelley -- AGE Logic, Inc. April 1993 + +******************************************************************************/ + +#ifndef _XIEH_PHOTOMAP +#define _XIEH_PHOTOMAP + +#include + +/* + * Definitions + */ +typedef struct _photomap *photomapPtr; + +typedef struct _photomap { + xieTypPhotomap ID; + CARD16 refCnt; + CARD16 technique; /* decode technique needed to decompress*/ + CARD16 lenParms; /* length of technique params (in bytes)*/ + CARD16 pad0; + pointer tecParms; /* technique-specific decode parameters */ + pointer pvtParms; /* additional decode hints */ + xieTypDataClass dataClass; /* {SingleBand,TripleBand} */ + CARD8 bands; /* number of bands {0=unpopulated,1,3} */ + /* Tripleband, interleaved has bands=1, */ + /* so this parameter is *not* redundant */ + xieTypDataType dataType; /* {Constrained,Unconstrined} */ + CARD8 pad1; + formatRec format[xieValMaxBands]; /* format of data in strips */ + stripLstRec strips[xieValMaxBands]; /* lists of image strips */ +} photomapRec; + + +#endif +/* end _XIEH_PHOTOMAP */ diff --git a/xie/xc/programs/Xserver/XIE/include/photospc.h b/xie/xc/programs/Xserver/XIE/include/photospc.h new file mode 100644 index 0000000..489c8a7 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/include/photospc.h @@ -0,0 +1,87 @@ +/* $XConsortium: photospc.h,v 1.4 94/04/17 20:34:07 rws Exp $ */ +/**** module photospc.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +******************************************************************************* + + photospc.h: photospace definitions + + Dean Verheiden -- AGE Logic, Inc. April 1993 + +******************************************************************************/ + +#ifndef _XIEH_PHOTOSPC +#define _XIEH_PHOTOSPC + +/* + * photospace definition + */ +typedef struct _photospace { + xieTypPhotospace spaceID; + CARD32 floCnt; + floLstRec floLst; +} photospaceRec; + +#endif /* end _XIEH_PHOTOSPC */ diff --git a/xie/xc/programs/Xserver/XIE/include/roi.h b/xie/xc/programs/Xserver/XIE/include/roi.h new file mode 100644 index 0000000..66a7239 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/include/roi.h @@ -0,0 +1,89 @@ +/* $XConsortium: roi.h,v 1.4 94/04/17 20:34:07 rws Exp $ */ +/**** module roi.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +******************************************************************************* + + roi.h: contains region of interest specific definitions + + Dean Verheiden -- AGE Logic, Inc. April 1993 + +******************************************************************************/ + +#ifndef _XIEH_ROI +#define _XIEH_ROI + +#include + +/* + * ROI resource definitions + */ +typedef struct _roi { + xieTypROI ID; + CARD32 refCnt; + stripLstRec strips; /* run-length encoded list of rectangles */ +} roiRec, *roiPtr; + +#endif /* end _XIEH_ROI */ diff --git a/xie/xc/programs/Xserver/XIE/include/tables.h b/xie/xc/programs/Xserver/XIE/include/tables.h new file mode 100644 index 0000000..5e1f8a0 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/include/tables.h @@ -0,0 +1,202 @@ +/* $XConsortium: tables.h,v 1.4 94/04/17 20:34:08 rws Exp $ */ +/**** module tables.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +******************************************************************************* + + tables.h: entry points etc. + + Dean Verheiden, Robert NC Shelley -- AGE Logic, Inc. April 1993 + +******************************************************************************/ + +#ifndef _XIEH_TABLES +#define _XIEH_TABLES + +#include + +#define DDAnalyzeIndex 0 +#define DDServerChoiceIndex 1 + +#ifndef _XIEC_TABLES + +extern void init_proc_tables(); +extern peDefPtr (*MakeTable[])(); +extern xieVoidProc DDInterface[]; + +#else /* _XIEC_TABLES */ + + /* dd entry points for di */ + +extern int DAGalyze(); +extern xieBoolProc GetServerChoice(); + + /* flo.c */ +extern int ProcAbort(); +extern int ProcAwait(); +extern int ProcGetClientData(); +extern int ProcPutClientData(); +extern int ProcQueryPhotoflo(); +extern int SProcAbort(); +extern int SProcAwait(); +extern int SProcGetClientData(); +extern int SProcPutClientData(); +extern int SProcQueryPhotoflo(); + /* immediate.c */ +extern int ProcCreatePhotospace(); +extern int ProcDestroyPhotospace(); +extern int ProcExecuteImmediate(); +extern int SProcCreatePhotospace(); +extern int SProcDestroyPhotospace(); +extern int SProcExecuteImmediate(); +/* lut.c */ +extern int ProcCreateLUT(); +extern int ProcDestroyLUT(); +extern int SProcCreateLUT(); +extern int SProcDestroyLUT(); + /* photomap.c */ +extern int ProcCreatePhotomap(); +extern int ProcDestroyPhotomap(); +extern int ProcQueryPhotomap(); +extern int SProcCreatePhotomap(); +extern int SProcDestroyPhotomap(); +extern int SProcQueryPhotomap(); + /* stored.c */ +extern int ProcCreatePhotoflo(); +extern int ProcDestroyPhotoflo(); +extern int ProcExecutePhotoflo(); +extern int ProcModifyPhotoflo(); +extern int ProcRedefinePhotoflo(); +extern int SProcCreatePhotoflo(); +extern int SProcDestroyPhotoflo(); +extern int SProcExecutePhotoflo(); +extern int SProcModifyPhotoflo(); +extern int SProcRedefinePhotoflo(); + /* technq.c */ +extern int ProcQueryTechniques(); +extern int SProcQueryTechniques(); + +#if XIE_FULL + /* colorlist.c */ +extern int ProcCreateColorList(); +extern int ProcDestroyColorList(); +extern int ProcPurgeColorList(); +extern int ProcQueryColorList(); +extern int SProcCreateColorList(); +extern int SProcDestroyColorList(); +extern int SProcPurgeColorList(); +extern int SProcQueryColorList(); + /* roi.c */ +extern int ProcCreateROI(); +extern int ProcDestroyROI(); +extern int SProcCreateROI(); +extern int SProcDestroyROI(); +#endif + +/* elements */ +extern peDefPtr MakeIDraw(); +extern peDefPtr MakeIDrawP(); +extern peDefPtr MakeICLUT(); +extern peDefPtr MakeILUT(); +extern peDefPtr MakeICPhoto(); +extern peDefPtr MakeIPhoto(); +extern peDefPtr MakeGeometry(); +extern peDefPtr MakePoint(); +extern peDefPtr MakeEDraw(); +extern peDefPtr MakeEDrawPlane(); +extern peDefPtr MakeECLUT(); +extern peDefPtr MakeELUT(); +extern peDefPtr MakeECPhoto(); +extern peDefPtr MakeEPhoto(); + +#if XIE_FULL +extern peDefPtr MakeICROI(); +extern peDefPtr MakeIROI(); +extern peDefPtr MakeArith(); +extern peDefPtr MakeBandCom(); +extern peDefPtr MakeBandExt(); +extern peDefPtr MakeBandSel(); +extern peDefPtr MakeBlend(); +extern peDefPtr MakeCompare(); +extern peDefPtr MakeConstrain(); +extern peDefPtr MakeConvertFromIndex(); +extern peDefPtr MakeConvertFromRGB(); +extern peDefPtr MakeConvertToIndex(); +extern peDefPtr MakeConvertToRGB(); +extern peDefPtr MakeConvolve(); +extern peDefPtr MakeDither(); +extern peDefPtr MakeLogic(); +extern peDefPtr MakeMatchHistogram(); +extern peDefPtr MakeMath(); +extern peDefPtr MakePasteUp(); +extern peDefPtr MakeUnconstrain(); +extern peDefPtr MakeECHistogram(); +extern peDefPtr MakeECROI(); +extern peDefPtr MakeEROI(); +#endif + +#endif /* _XIEC_TABLES */ + +#endif /* _XIEH_TABLES */ diff --git a/xie/xc/programs/Xserver/XIE/include/technq.h b/xie/xc/programs/Xserver/XIE/include/technq.h new file mode 100644 index 0000000..11532e1 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/include/technq.h @@ -0,0 +1,1241 @@ +/* $XConsortium: technq.h,v 1.4 94/04/17 20:34:08 rws Exp $ */ +/**** module technq.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +******************************************************************************* + + technq.h: contains technique definitions + + Dean Verheiden -- AGE Logic, Inc. April 1993 + +******************************************************************************/ + +#ifndef _XIEH_TECHNQ +#define _XIEH_TECHNQ + +#include + +/* + * dixie import client photo technique entry points + */ +extern Bool CopyICPhotoUnSingle(); +extern Bool CopyICPhotoG31D(); +extern Bool CopyICPhotoG32D(); +extern Bool CopyICPhotoG42D(); +extern Bool CopyICPhotoTIFF2(); +extern Bool CopyICPhotoTIFFPackBits(); +extern Bool PrepICPhotoUnSingle(); +extern Bool PrepICPhotoG31D(); +extern Bool PrepICPhotoG32D(); +extern Bool PrepICPhotoG42D(); +extern Bool PrepICPhotoTIFF2(); +extern Bool PrepICPhotoTIFFPackBits(); +#if XIE_FULL +extern Bool CopyICPhotoUnTriple(); +extern Bool PrepICPhotoUnTriple(); +extern Bool CopyICPhotoJPEGBaseline(); +extern Bool PrepICPhotoJPEGBaseline(); +#ifdef BEYOND_SI +extern Bool CopyICPhotoJPEGLossless(); +extern Bool PrepICPhotoJPEGLossless(); +#endif /* BEYOND_SI */ +#endif + +/* + * dixie constrain technique entry points + */ +#if XIE_FULL +extern Bool CopyPConstrainStandard(); +extern Bool CopyPConstrainClipScale(); +extern Bool PrepPConstrainStandard(); +extern Bool PrepPConstrainClipScale(); +#endif + +/* + * dixie convolve technique entry points + */ +#if XIE_FULL +extern Bool CopyConvolveConstant(); +extern Bool PrepConvolveStandard(); +#ifdef BEYOND_SI +extern Bool CopyConvolveReplicate(); +#endif /* BEYOND_SI */ +#endif + +/* + * dixie dither technique entry points + */ +#if XIE_FULL +extern Bool CopyPDitherErrorDiffusion(); +extern Bool PrepPDitherErrorDiffusion(); +extern Bool CopyPDitherOrdered(); +extern Bool PrepPDitherOrdered(); +#endif + +/* + * dixie geometry technique entry points + */ +extern Bool CopyGeomNearestNeighbor(); +extern Bool PrepGeomNearestNeighbor(); +extern Bool CopyGeomAntiAlias(); +extern Bool PrepGeomAntiAlias(); +#if XIE_FULL +extern Bool CopyGeomBilinearInterp(); +extern Bool PrepGeomBilinearInterp(); +extern Bool CopyGeomGaussian(); +extern Bool PrepGeomGaussian(); +#endif + +/* + * dixie match histogram technique entry points + */ +#if XIE_FULL +extern Bool CopyPHistogramFlat(); +extern Bool CopyPHistogramGaussian(); +extern Bool CopyPHistogramHyperbolic(); +extern Bool PrepPHistogramFlat(); +extern Bool PrepPHistogramGaussian(); +extern Bool PrepPHistogramHyperbolic(); +#endif + +/* + * dixie convert to index technique entry points + */ +#if XIE_FULL +extern Bool CopyCtoIAllocAll(); +extern Bool PrepCtoIAllocAll(); +#ifdef BEYOND_SI +extern Bool CopyCtoIAllocMatch(); +extern Bool CopyCtoIAllocRequantize(); +#endif /* BEYOND_SI */ +#endif + +/* + * dixie export client photo technique entry points + */ +extern Bool CopyECPhotoUnSingle(); +extern Bool CopyECPhotoG31D(); +extern Bool CopyECPhotoG32D(); +extern Bool CopyECPhotoG42D(); +extern Bool CopyECPhotoTIFF2(); +extern Bool CopyECPhotoTIFFPackBits(); + +extern Bool PrepECPhotoUnSingle(); +extern Bool PrepECPhotoG31D(); +extern Bool PrepECPhotoG32D(); +extern Bool PrepECPhotoG42D(); +extern Bool PrepECPhotoTIFF2(); +extern Bool PrepECPhotoTIFFPackBits(); +#if XIE_FULL +extern Bool CopyECPhotoUnTriple(); +extern Bool PrepECPhotoUnTriple(); +extern Bool CopyECPhotoJPEGBaseline(); +extern Bool PrepECPhotoJPEGBaseline(); +#ifdef BEYOND_SI +extern Bool CopyECPhotoJPEGLossless(); +extern Bool PrepECPhotoJPEGLossless(); +#endif /* BEYOND_SI */ +#endif + +/* + * dixie convert to and from RBG technique entry points + */ +#if XIE_FULL +extern Bool CopyPConvertFromRGBCIE(); +extern Bool CopyPConvertFromRGBYCC(); +extern Bool CopyPConvertFromRGBYCbCr(); +extern Bool CopyPConvertToRGBCIE(); +extern Bool CopyPConvertToRGBYCC(); +extern Bool CopyPConvertToRGBYCbCr(); +extern Bool CopyPWhiteAdjustNone(); +extern Bool CopyPWhiteAdjustCIELabShift(); +extern Bool CopyPGamut(); + +extern Bool PrepPConvertFromRGBCIE(); +extern Bool PrepPConvertFromRGBYCC(); +extern Bool PrepPConvertFromRGBYCbCr(); +extern Bool PrepPConvertToRGBCIE(); +extern Bool PrepPConvertToRGBYCC(); +extern Bool PrepPConvertToRGBYCbCr(); +extern Bool PrepPWhiteAdjustNone(); +extern Bool PrepPWhiteAdjustCIELabShift(); +extern Bool PrepPGamut(); +#endif + +/* Global definitions for referencing techniques */ + +typedef struct _techvec { + BOOL NoTech; /* If true, this technique has no parameters */ + BOOL OptionalTech; /* If true, parameters are optional */ + BOOL FixedTech; /* If true, parameter size is fixed */ + BOOL pad; + CARD16 techSize; /* size of parameters (possibly optional) */ + CARD16 number; + xieBoolProc copyfnc; /* function to copy parameter from client */ + xieBoolProc prepfnc; /* function to prepare for activation */ +} techVecRec; + +/* + Standard macro to verify correct technique parameter sizes . . . + Should work for any technique that has been properly defined +*/ + + +#define VALIDATE_TECHNIQUE_SIZE(tv, size, isDefault) \ + if (isDefault && size || (!isDefault && \ + (tv->FixedTech && \ + (!tv->OptionalTech && tv->techSize != size || \ + tv->OptionalTech && size && tv->techSize != size)) || \ + (!tv->FixedTech && \ + (!tv->OptionalTech && tv->techSize > size || \ + tv->OptionalTech && size && tv->techSize > size)))) \ + return(FALSE); + + +#if defined(_XIEC_TECHNQ) +/* + * Technique resource definition + */ + +typedef struct _technique { + CARD8 speed; + CARD8 nameLength; + CARD16 techSize; + CARD8 *name; + techVecRec techvec; +} TechRec, *TechPtr; + +typedef struct _techgroup { + xieTypTechniqueGroup group; + CARD16 numTechniques; + CARD16 defaultNumber; + CARD16 defaultIndex; + CARD32 groupSize; /* Size in words */ + TechPtr tech; +} TechGroupRec, *TechGroupPtr; + +typedef struct _techtable { + CARD16 numGroups; /* Number of tech groups */ + CARD16 numDefaults; /* Number of default groups */ + CARD16 numTechniques; /* Total number of techniques */ + CARD16 pad; + CARD32 tableSize; /* All tech size (in words) */ + CARD32 defaultSize; /* Default size (in words) */ + TechGroupPtr techgroups; +} TechTable; + +#define DEFAULT_SPEED 128 + +#define NO_DEFAULT 0 +#define UNINITIALIZED 0 + +#define TECH_HAS_NO_PARMS TRUE +#define TECH_HAS_PARMS FALSE +#define TECH_PARMS_OPTIONAL TRUE +#define TECH_PARMS_REQUIRED FALSE +#define TECH_FIXED_SIZE TRUE +#define TECH_VARIABLE_SIZE FALSE + +/* + * Initialize nameLength to 0 and compute at runtime. Some compilers do not + * support the use of sizeof(static string) at compile time + */ + +static Bool NoParamCheck(); +static Bool NoTechYet(); + +#if XIE_FULL +/* Array of techniques for coloralloc */ +TechRec Tcoloralloc[] = { + { DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"ALLOC-ALL", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecColorAllocAll / 4, + xieValColorAllocAll, + CopyCtoIAllocAll, + PrepCtoIAllocAll + } + } +#ifdef BEYOND_SI + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"MATCH", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecColorAllocMatch / 4, + xieValColorAllocMatch, + CopyCtoIAllocMatch, + NoTechYet + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"REQUANTIZE", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecColorAllocRequantize / 4, + xieValColorAllocRequantize, + CopyCtoIAllocRequantize, + NoTechYet + } + } +#endif /* BEYOND_SI */ +}; +#endif + +#if XIE_FULL +/* Array of techniques for constrain */ +TechRec Tconstrain[] = { + { DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"CLIP-SCALE", + { + TECH_HAS_NO_PARMS, + TECH_HAS_NO_PARMS, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecClipScale / 4, + xieValConstrainClipScale, + CopyPConstrainClipScale, + PrepPConstrainClipScale + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"HARD-CLIP", + { + TECH_HAS_NO_PARMS, + TECH_HAS_NO_PARMS, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecHardClip / 4, + xieValConstrainHardClip, + CopyPConstrainStandard, + PrepPConstrainStandard + } + } +}; +#endif + +#if XIE_FULL +/* Array of techniques for conversion from RGB to another colorspace */ +TechRec Tconvertfromrgb[] = { + { DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"CIELAB", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_VARIABLE_SIZE, + UNINITIALIZED, + sz_xieTecRGBToCIELab / 4, + xieValRGBToCIELab, + CopyPConvertFromRGBCIE, + PrepPConvertFromRGBCIE + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"CIEXYZ", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_VARIABLE_SIZE, + UNINITIALIZED, + sz_xieTecRGBToCIEXYZ / 4, + xieValRGBToCIEXYZ, + CopyPConvertFromRGBCIE, + PrepPConvertFromRGBCIE + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"YCbCr", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecRGBToYCbCr / 4, + xieValRGBToYCbCr, + CopyPConvertFromRGBYCbCr, + PrepPConvertFromRGBYCbCr + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"YCC", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecRGBToYCC / 4, + xieValRGBToYCC, + CopyPConvertFromRGBYCC, + PrepPConvertFromRGBYCC + } + } +}; +#endif + +#if XIE_FULL +/* Array of techniques for converting to RGB from another colorspace */ +TechRec Tconverttorgb[] = { + { DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"CIELAB", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_VARIABLE_SIZE, + UNINITIALIZED, + sz_xieTecCIELabToRGB / 4, + xieValCIELabToRGB, + CopyPConvertToRGBCIE, + PrepPConvertToRGBCIE + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"CIEXYZ", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_VARIABLE_SIZE, + UNINITIALIZED, + sz_xieTecCIEXYZToRGB / 4, + xieValCIEXYZToRGB, + CopyPConvertToRGBCIE, + PrepPConvertToRGBCIE + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"YCbCr", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecYCbCrToRGB / 4, + xieValYCbCrToRGB, + CopyPConvertToRGBYCbCr, + PrepPConvertToRGBYCbCr + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"YCC", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecYCCToRGB / 4, + xieValYCCToRGB, + CopyPConvertToRGBYCC, + PrepPConvertToRGBYCC + } + } +}; +#endif + +#if XIE_FULL +/* Array of techniques for convolve */ +TechRec Tconvolve[] = { + { DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"CONSTANT", + { + TECH_HAS_PARMS, + TECH_PARMS_OPTIONAL, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecConvolveConstant / 4, + xieValConvolveConstant, + CopyConvolveConstant, + PrepConvolveStandard + } + } +#ifdef BEYOND_SI + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"REPLICATE", + { + TECH_HAS_NO_PARMS, + TECH_HAS_NO_PARMS, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecConvolveReplicate / 4, + xieValConvolveReplicate, + CopyConvolveReplicate, + PrepConvolveStandard + } + } +#endif /* BEYOND_SI */ +}; +#endif + +/* Array of techniques for decode */ +TechRec Tdecode[] = { + { DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"UNCOMPRESSED-SINGLE", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecDecodeUncompressedSingle / 4, + xieValDecodeUncompressedSingle, + CopyICPhotoUnSingle, + PrepICPhotoUnSingle + } + } +#if XIE_FULL + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"UNCOMPRESSED-TRIPLE", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecDecodeUncompressedTriple / 4, + xieValDecodeUncompressedTriple, + CopyICPhotoUnTriple, + PrepICPhotoUnTriple + } + } +#endif + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"CCITT-G31D", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecDecodeG31D / 4, + xieValDecodeG31D, + CopyICPhotoG31D, + PrepICPhotoG31D + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"CCITT-G32D", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecDecodeG32D / 4, + xieValDecodeG32D, + CopyICPhotoG32D, + PrepICPhotoG32D + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"CCITT-G42D", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecDecodeG42D / 4, + xieValDecodeG42D, + CopyICPhotoG42D, + PrepICPhotoG42D + } + } +#if XIE_FULL + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"JPEG-BASELINE", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_VARIABLE_SIZE, + UNINITIALIZED, + sz_xieTecDecodeJPEGBaseline / 4, + xieValDecodeJPEGBaseline, + CopyICPhotoJPEGBaseline, + PrepICPhotoJPEGBaseline + } + } +#ifdef BEYOND_SI + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"JPEG-LOSSLESS", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecDecodeJPEGLossless / 4, + xieValDecodeJPEGLossless, + CopyICPhotoJPEGLossless, + PrepICPhotoJPEGLossless + } + } +#endif /* BEYOND_SI */ +#endif + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"TIFF-2", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecDecodeTIFF2 / 4, + xieValDecodeTIFF2, + CopyICPhotoTIFF2, + PrepICPhotoTIFF2 + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"TIFF-PACKBITS", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecDecodeTIFFPackBits / 4, + xieValDecodeTIFFPackBits, + CopyICPhotoTIFFPackBits, + PrepICPhotoTIFFPackBits + } + } +}; + +#if XIE_FULL +/* Array of techniques for dither */ +TechRec Tdither[] = { + { DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"ERROR-DIFFUSION", + { + TECH_HAS_NO_PARMS, + TECH_HAS_NO_PARMS, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecDitherErrorDiffusion / 4, + xieValDitherErrorDiffusion, + CopyPDitherErrorDiffusion, + PrepPDitherErrorDiffusion + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"ORDERED", + { + TECH_HAS_PARMS, + TECH_PARMS_OPTIONAL, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecDitherOrdered / 4, + xieValDitherOrdered, + CopyPDitherOrdered, + PrepPDitherOrdered + } + } +}; +#endif + +/* Array of techniques for encode */ +TechRec Tencode[] = { + { DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"UNCOMPRESSED-SINGLE", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecEncodeUncompressedSingle / 4, + xieValEncodeUncompressedSingle, + CopyECPhotoUnSingle, + PrepECPhotoUnSingle + } + } +#if XIE_FULL + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"UNCOMPRESSED-TRIPLE", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecEncodeUncompressedTriple / 4, + xieValEncodeUncompressedTriple, + CopyECPhotoUnTriple, + PrepECPhotoUnTriple + } + } +#endif + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"CCITT-G31D", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecEncodeG31D / 4, + xieValEncodeG31D, + CopyECPhotoG31D, + PrepECPhotoG31D + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"CCITT-G32D", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecEncodeG32D / 4, + xieValEncodeG32D, + CopyECPhotoG32D, + PrepECPhotoG32D + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"CCITT-G42D", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecEncodeG42D / 4, + xieValEncodeG42D, + CopyECPhotoG42D, + PrepECPhotoG42D + } + } +#if XIE_FULL + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"JPEG-BASELINE", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_VARIABLE_SIZE, + UNINITIALIZED, + sz_xieTecEncodeJPEGBaseline / 4, + xieValEncodeJPEGBaseline, + CopyECPhotoJPEGBaseline, + PrepECPhotoJPEGBaseline + } + } +#ifdef BEYOND_SI + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"JPEG-LOSSLESS", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecEncodeJPEGLossless / 4, + xieValEncodeJPEGLossless, + CopyECPhotoJPEGLossless, + PrepECPhotoJPEGLossless + } + } +#endif /* BEYOND_SI */ +#endif + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"TIFF-2", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecEncodeTIFF2 / 4, + xieValEncodeTIFF2, + CopyECPhotoTIFF2, + PrepECPhotoTIFF2 + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"TIFF-PACKBITS", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecEncodeTIFFPackBits / 4, + xieValEncodeTIFFPackBits, + CopyECPhotoTIFFPackBits, + PrepECPhotoTIFFPackBits + } + } +}; + +#if XIE_FULL +/* Array of techniques for gamut */ +TechRec Tgamut[] = { + { DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"NONE", + { + TECH_HAS_NO_PARMS, + TECH_HAS_NO_PARMS, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecGamutNone / 4, + xieValGamutNone, + CopyPGamut, + PrepPGamut + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"CLIP-RGB", + { + TECH_HAS_NO_PARMS, + TECH_HAS_NO_PARMS, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecGamutClipRGB / 4, + xieValGamutClipRGB, + CopyPGamut, + PrepPGamut + } + } +}; +#endif + +/* Array of techniques for geometry */ +TechRec Tgeometry[] = { + { DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"ANTIALIAS", + { + TECH_HAS_NO_PARMS, + TECH_HAS_NO_PARMS, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecGeomAntialias / 4, + xieValGeomAntialias, + CopyGeomAntiAlias, + PrepGeomAntiAlias + } + } +#ifdef BEYOND_SI + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"ANTIALIAS-BY-AREA", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecGeomAntialiasByArea / 4, + xieValGeomAntialiasByArea, + NoParamCheck, + NoTechYet + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"ANTIALIAS-BY-LOWPASS", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecGeomAntialiasByLowpass / 4, + xieValGeomAntialiasByLPF, + NoParamCheck, + NoTechYet + } + } +#endif +#if XIE_FULL + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"BILINEAR-INTERPOLATION", + { + TECH_HAS_NO_PARMS, + TECH_HAS_NO_PARMS, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecGeomBilinearInterpolation / 4, + xieValGeomBilinearInterp, + CopyGeomBilinearInterp, + PrepGeomBilinearInterp + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"GAUSSIAN", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecGeomGaussian / 4, + xieValGeomGaussian, + CopyGeomGaussian, + PrepGeomGaussian + } + } +#endif + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"NEAREST-NEIGHBOR", + { + TECH_HAS_PARMS, + TECH_PARMS_OPTIONAL, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecGeomNearestNeighbor / 4, + xieValGeomNearestNeighbor, + CopyGeomNearestNeighbor, + PrepGeomNearestNeighbor + } + } +}; + +#if XIE_FULL +/* Array of techniques for histogram */ +TechRec Thistogram[] = { + { DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"FLAT", + { + TECH_HAS_NO_PARMS, + TECH_HAS_NO_PARMS, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecHistogramFlat / 4, + xieValHistogramFlat, + CopyPHistogramFlat, + PrepPHistogramFlat + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"GAUSSIAN", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecHistogramGaussian / 4, + xieValHistogramGaussian, + CopyPHistogramGaussian, + PrepPHistogramGaussian + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"HYPERBOLIC", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecHistogramHyperbolic / 4, + xieValHistogramHyperbolic, + CopyPHistogramHyperbolic, + PrepPHistogramHyperbolic + } + } +}; +#endif + +#if XIE_FULL +/* Array of techniques for white adjust */ +TechRec Twhiteadjust[] = { + { DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"NONE", + { + TECH_HAS_NO_PARMS, + TECH_HAS_NO_PARMS, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecWhiteAdjustNone / 4, + xieValWhiteAdjustNone, + CopyPWhiteAdjustNone, + PrepPWhiteAdjustNone + } + } + ,{ DEFAULT_SPEED, + UNINITIALIZED, + UNINITIALIZED, + (CARD8 *)"CIELAB-SHIFT", + { + TECH_HAS_PARMS, + TECH_PARMS_REQUIRED, + TECH_FIXED_SIZE, + UNINITIALIZED, + sz_xieTecWhiteAdjustCIELabShift / 4, + xieValWhiteAdjustCIELabShift, + CopyPWhiteAdjustCIELabShift, + PrepPWhiteAdjustCIELabShift + } + } +}; +#endif + +TechGroupRec techArray[] = { +#if XIE_FULL + { + xieValColorAlloc, + sizeof(Tcoloralloc)/sizeof(TechRec), + xieValColorAllocAll, + UNINITIALIZED, + UNINITIALIZED, + Tcoloralloc + } + ,{ + xieValConstrain, + sizeof(Tconstrain)/sizeof(TechRec), + NO_DEFAULT, + UNINITIALIZED, + UNINITIALIZED, + Tconstrain + } + ,{ + xieValConvertFromRGB, + sizeof(Tconvertfromrgb)/sizeof(TechRec), + NO_DEFAULT, + UNINITIALIZED, + UNINITIALIZED, + Tconvertfromrgb + } + ,{ + xieValConvertToRGB, + sizeof(Tconverttorgb)/sizeof(TechRec), + NO_DEFAULT, + UNINITIALIZED, + UNINITIALIZED, + Tconverttorgb + } + ,{ + xieValConvolve, + sizeof(Tconvolve)/sizeof(TechRec), + xieValConvolveConstant, + UNINITIALIZED, + UNINITIALIZED, + Tconvolve + }, +#endif + { + xieValDecode, + sizeof(Tdecode)/sizeof(TechRec), + NO_DEFAULT, + UNINITIALIZED, + UNINITIALIZED, + Tdecode + } +#if XIE_FULL + ,{ + xieValDither, + sizeof(Tdither)/sizeof(TechRec), + xieValDitherErrorDiffusion, + UNINITIALIZED, + UNINITIALIZED, + Tdither + } +#endif + ,{ + xieValEncode, + sizeof(Tencode)/sizeof(TechRec), + NO_DEFAULT, + UNINITIALIZED, + UNINITIALIZED, + Tencode + } +#if XIE_FULL + ,{ + xieValGamut, + sizeof(Tgamut)/sizeof(TechRec), + xieValGamutNone, + UNINITIALIZED, + UNINITIALIZED, + Tgamut + } +#endif + ,{ + xieValGeometry, + sizeof(Tgeometry)/sizeof(TechRec), + xieValGeomNearestNeighbor, + UNINITIALIZED, + UNINITIALIZED, + Tgeometry + } +#if XIE_FULL + ,{ + xieValHistogram, + sizeof(Thistogram)/sizeof(TechRec), + NO_DEFAULT, + UNINITIALIZED, + UNINITIALIZED, + Thistogram + } + ,{ + xieValWhiteAdjust, + sizeof(Twhiteadjust)/sizeof(TechRec), + xieValWhiteAdjustNone, + UNINITIALIZED, + UNINITIALIZED, + Twhiteadjust + } +#endif +}; + +TechTable techTable = { + sizeof(techArray)/sizeof(TechGroupRec), + UNINITIALIZED, + UNINITIALIZED, + UNINITIALIZED, + UNINITIALIZED, + UNINITIALIZED, + techArray +}; + +#else /* if defined(_XIEC_TECHNQ) */ + +extern Bool technique_init(); +extern Bool TechNeedsParams(); +extern CARD16 TechDefault(); +extern techVecPtr FindTechnique(); + +#endif /* if defined(_XIEC_TECHNQ) */ + +#endif /* end _XIEH_TECHNQ */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/Imakefile b/xie/xc/programs/Xserver/XIE/mixie/Imakefile new file mode 100644 index 0000000..d3ca311 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/Imakefile @@ -0,0 +1,26 @@ +XCOMM $XConsortium: Imakefile /main/6 1995/12/07 21:15:34 gildea $ +#include + +#define IHaveSubdirs + +#if BuildDIS +SUBDIRS = control fax import process export +OBJS = control/?*.o fax/?*.o import/?*.o process/?*.o export/?*.o +DONES = control/DONE fax/DONE import/DONE process/DONE export/DONE +#else +SUBDIRS = control fax import jpeg process export +OBJS = control/?*.o fax/?*.o import/?*.o jpeg/?*.o process/?*.o export/?*.o +DONES = control/DONE fax/DONE import/DONE jpeg/DONE process/DONE export/DONE +#endif + +NormalDepLibraryTarget(mixie,$(SUBDIRS) $(DONES),$(OBJS)) + +ForceSubdirs($(SUBDIRS)) + +DependSubdirs($(SUBDIRS)) + +MakeLintLibSubdirs($(SUBDIRS)) +LintSubdirs($(SUBDIRS)) + +InstallLinkKitLibrary(mixie,$(LINKKITDIR)/lib) + diff --git a/xie/xc/programs/Xserver/XIE/mixie/control/Imakefile b/xie/xc/programs/Xserver/XIE/mixie/control/Imakefile new file mode 100644 index 0000000..b5c9dc3 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/control/Imakefile @@ -0,0 +1,32 @@ +XCOMM $XConsortium: Imakefile,v 1.4 93/11/07 10:57:19 rws Exp $ +XCOMM build device dependent machine independent control objects +#include + + SRCS = analyze.c \ + domain.c \ + floman.c \ + sched.c \ + strip.c + + OBJS = analyze.o \ + domain.o \ + floman.o \ + sched.o \ + strip.o + +#if BuildDIS + DEFINES = -DXIE_DIS +#endif + + INCLUDES = -I../include -I../../include -I$(SERVERSRC)/include -I$(INCLUDESRC) -I$(INCLUDESRC)/extensions + LINTLIBS = ../../dixie/export/llib-lexp.ln ../../dixie/import/llib-limp.ln \ + ../../dixie/process/llib-lproc.ln ../../dixie/request/llib-lreq.ln \ + ../control/llib-lctrl.ln ../export/llib-lmexp.ln ../fax/llib-lfax.ln \ + ../import/llib-lmimp.ln ../jpeg/llib-ljpeg.ln ../process/llib-lmproc.ln + +SubdirLibraryRule($(OBJS)) +NormalLibraryObjectRule() +LintLibraryTarget(ctrl,$(SRCS)) +NormalLintTarget($(SRCS)) + +DependTarget() diff --git a/xie/xc/programs/Xserver/XIE/mixie/control/analyze.c b/xie/xc/programs/Xserver/XIE/mixie/control/analyze.c new file mode 100644 index 0000000..8dd6ae0 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/control/analyze.c @@ -0,0 +1,189 @@ +/* $XConsortium: analyze.c,v 1.4 94/04/17 20:34:10 rws Exp $ */ +/**** module analyze.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + analyze.c -- DDXIE prototype (simple minded) DAG analyzer + + Robert NC Shelley -- AGE Logic, Inc. April, 1993 + +*****************************************************************************/ + +#define _XIEC_ANALYZE + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include + + +/* + * routines called from DIXIE + */ +int DAGalyze(); + + +/*------------------------------------------------------------------------ +----------------------- analyze (sort of) the DAG ------------------------ +------------------------------------------------------------------------*/ +int DAGalyze(flo) + floDefPtr flo; +{ + int ok = TRUE; + peDefPtr ped; + pedLstPtr lst = ListEmpty(&flo->optDAG) ? &flo->defDAG : &flo->optDAG; + + /* establish our default flo manager + */ + InitFloManager(flo); + + /* choose element handlers + */ + for(ped = lst->flink; ok && !ListEnd(ped,lst); ped = ped->flink) + switch(ped->elemRaw->elemType) { +#if XIE_FULL + case xieElemImportClientLUT: ok = miAnalyzeICLUT(flo,ped); break; + case xieElemImportClientPhoto: ok = miAnalyzeICPhoto(flo,ped); break; + case xieElemImportClientROI: ok = miAnalyzeICROI(flo,ped); break; + case xieElemImportDrawable: ok = miAnalyzeIDraw(flo,ped); break; + case xieElemImportDrawablePlane:ok = miAnalyzeIDrawP(flo,ped); break; + case xieElemImportLUT: ok = miAnalyzeILUT(flo,ped); break; + case xieElemImportPhotomap: ok = miAnalyzeIPhoto(flo,ped); break; + case xieElemImportROI: ok = miAnalyzeIROI(flo,ped); break; + case xieElemArithmetic: ok = miAnalyzeArith(flo,ped); break; + case xieElemBandCombine: ok = miAnalyzeBandCom(flo,ped); break; + case xieElemBandExtract: ok = miAnalyzeBandExt(flo,ped); break; + case xieElemBandSelect: ok = miAnalyzeBandSel(flo,ped); break; + case xieElemBlend: ok = miAnalyzeBlend(flo,ped); break; + case xieElemCompare: ok = miAnalyzeCompare(flo,ped); break; + case xieElemConstrain: ok = miAnalyzeConstrain(flo,ped); break; + case xieElemConvertFromIndex: ok = miAnalyzeCvtFromInd(flo,ped); break; + case xieElemConvertFromRGB: ok = miAnalyzeFromRGB(flo,ped); break; + case xieElemConvertToIndex: ok = miAnalyzeCvtToInd(flo,ped); break; + case xieElemConvertToRGB: ok = miAnalyzeToRGB(flo,ped); break; + case xieElemConvolve: ok = miAnalyzeConvolve(flo,ped); break; + case xieElemDither: ok = miAnalyzeDither(flo,ped); break; + case xieElemGeometry: ok = miAnalyzeGeometry(flo,ped); break; + case xieElemLogical: ok = miAnalyzeLogic(flo,ped); break; + case xieElemMatchHistogram: ok = miAnalyzeMatchHist(flo,ped); break; + case xieElemMath: ok = miAnalyzeMath(flo,ped); break; + case xieElemPasteUp: ok = miAnalyzePasteUp(flo,ped); break; + case xieElemPoint: ok = miAnalyzePoint(flo,ped); break; + case xieElemUnconstrain: ok = miAnalyzeUnconstrain(flo,ped); break; + case xieElemExportClientHistogram:ok = miAnalyzeECHist(flo,ped); break; + case xieElemExportClientLUT: ok = miAnalyzeECLUT(flo,ped); break; + case xieElemExportClientPhoto: ok = miAnalyzeECPhoto(flo,ped); break; + case xieElemExportClientROI: ok = miAnalyzeECROI(flo,ped); break; + case xieElemExportDrawable: ok = miAnalyzeEDraw(flo,ped); break; + case xieElemExportDrawablePlane:ok = miAnalyzeEDrawP(flo,ped); break; + case xieElemExportLUT: ok = miAnalyzeELUT(flo,ped); break; + case xieElemExportPhotomap: ok = miAnalyzeEPhoto(flo,ped); break; + case xieElemExportROI: ok = miAnalyzeEROI(flo,ped); break; +#else + case xieElemImportClientLUT: ok = miAnalyzeICLUT(flo,ped); break; + case xieElemImportClientPhoto: ok = miAnalyzeICPhoto(flo,ped); break; + case xieElemImportDrawable: ok = miAnalyzeIDraw(flo,ped); break; + case xieElemImportDrawablePlane:ok = miAnalyzeIDrawP(flo,ped); break; + case xieElemImportLUT: ok = miAnalyzeILUT(flo,ped); break; + case xieElemImportPhotomap: ok = miAnalyzeIPhoto(flo,ped); break; + case xieElemGeometry: ok = miAnalyzeGeometry(flo,ped); break; + case xieElemPoint: ok = miAnalyzePoint(flo,ped); break; + case xieElemExportClientLUT: ok = miAnalyzeECLUT(flo,ped); break; + case xieElemExportClientPhoto: ok = miAnalyzeECPhoto(flo,ped); break; + case xieElemExportDrawable: ok = miAnalyzeEDraw(flo,ped); break; + case xieElemExportDrawablePlane:ok = miAnalyzeEDrawP(flo,ped); break; + case xieElemExportLUT: ok = miAnalyzeELUT(flo,ped); break; + case xieElemExportPhotomap: ok = miAnalyzeEPhoto(flo,ped); break; +#endif + default: ElementError(flo,ped, return(FALSE)); + } + return(ok); +} /* end DAGalyze */ + +/* end module analyze.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/control/domain.c b/xie/xc/programs/Xserver/XIE/mixie/control/domain.c new file mode 100644 index 0000000..23208b9 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/control/domain.c @@ -0,0 +1,503 @@ +/* $XConsortium: domain.c,v 1.5 94/04/17 20:34:11 rws Exp $ */ +/**** module domain.c ****/ +/****************************************************************************** +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + domain.c -- DDXIE Process Domain routines for flo manager + + Dean Verheiden -- AGE Logic, Inc. July, 1993 + +*****************************************************************************/ + +#define _XIEC_DOMAIN + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + +/* + * routines referenced by other DDXIE modules +*/ +Bool InitProcDomain(); +void ResetProcDomain(); + +static Bool NoDomainSyncDomain(); +static INT32 NoDomainGetRun(); + +#if XIE_FULL +static Bool RunLengthSyncDomain(); +static INT32 RunLengthGetRun(); +static Bool ControlPlaneSyncDomain(); +static INT32 ControlPlaneGetRun(); +#endif + +Bool InitProcDomain(flo,ped,dtag,offX,offY) +floDefPtr flo; +peDefPtr ped; +xieTypPhototag dtag; +INT32 offX,offY; +{ +peTexPtr pet = ped->peTex; +receptorPtr rcp = &pet->receptor[ped->inCnt-1]; + + if (!dtag) { /* No process domain */ + pet->roiinit = NoDomainSyncDomain; + pet->roiget = NoDomainGetRun; + + return TRUE; + } +#if !XIE_FULL + else + ImplementationError(flo,ped, return(FALSE)); +#else + if (!InitReceptor(flo,ped,rcp,0,1,ALL_BANDS,NO_BANDS)) + return FALSE; + + pet->domXoff = offX; + pet->domYoff = offY; + + if (rcp->band[0].format->class == RUN_LENGTH) { + pet->roiinit = RunLengthSyncDomain; + pet->roiget = RunLengthGetRun; + } else { + bandPtr rband = &rcp->band[0]; + bandPtr band = &pet->emitter[0]; + CARD32 b; + + pet->roiinit = ControlPlaneSyncDomain; + pet->roiget = ControlPlaneGetRun; + + /* See if there is some intersection between the ROI and image*/ + for(b = 0; b < ped->outFlo.bands; b++, band++, rband++) + if ( pet->domXoff + (INT32)rband->format->width <= 0 || + pet->domXoff >= (INT32)band->format->width || + pet->domYoff + (INT32)rband->format->height <= 0 || + pet->domYoff >= (INT32)band->format->height) { + SetBandThreshold(rband,~0); + IgnoreBand(rband); + band->allpass = TRUE; /* No regions any line */ + } + } + return (TRUE); +#endif +} + + +void ResetProcDomain(ped) +peDefPtr ped; +{ +peTexPtr pet = ped->peTex; +bandPtr band = &pet->emitter[0]; +int b; + + pet->roi = (pointer) NULL; + pet->roiinit = (Bool (*)()) NULL; + pet->roiget = (INT32 (*)()) NULL; + pet->domXoff = 0; + pet->domYoff = 0; + + for(b = 0; b < ped->outFlo.bands; b++, band++) { + band->pcroi = (pointer)NULL; + band->xindex = 0; + band->xcount = 0; + band->ypass = FALSE; + band->inside = FALSE; + band->allpass = FALSE; + } +} + + +/* Called when elements do not have an optional process domain */ +static Bool NoDomainSyncDomain(flo,ped,bnd,purge) +floDefPtr flo; +peDefPtr ped; +bandPtr bnd; +Bool purge; +{ + bnd->xcount = 0; + return (TRUE); +} + +static INT32 NoDomainGetRun(flo,pet,bnd) +floDefPtr flo; +peTexPtr pet; +bandPtr bnd; +{ + if (bnd->xcount) + return(0); + else + return(bnd->xcount = (INT32)bnd->format->width); +} + +#if XIE_FULL +/* Initialize run length structures for desired line */ +static Bool RunLengthSyncDomain(flo,ped,bnd,purge) +floDefPtr flo; +peDefPtr ped; +bandPtr bnd; +Bool purge; +{ +peTexPtr pet = ped->peTex; +bandPtr rband = &pet->receptor[ped->inCnt-1].band[bnd->band]; +ROIPtr proi; +linePtr lp; +INT32 ytrans; + + /* Grab table if necessary */ + if (!pet->roi) + if (!(pet->roi = GetSrcBytes(flo,pet,rband,0,1,KEEP))) + return (FALSE); + + proi = (ROIPtr)pet->roi; + + /* Make sure that there is some intersection between the ROI and image*/ + if (bnd->allpass || + proi->x + pet->domXoff + proi->width <= 0 || + proi->x + pet->domXoff >= (INT32)bnd->format->width || + proi->y + pet->domYoff + proi->height <= 0 || + proi->y + pet->domYoff >= (INT32)bnd->format->height) { + bnd->allpass = TRUE; /* No regions any line */ + bnd->xcount = 0; + return (TRUE); + } + + /* If no table or current y is past y desired, start at the beginning */ + lp = (linePtr)bnd->pcroi; + ytrans = bnd->current - pet->domYoff; + if (!lp || lp->y > ytrans) { + lp = (linePtr)&proi[1]; + if (lp->y > ytrans) { /* Make sure we are after first entry */ + bnd->ypass = TRUE; /* No regions this line */ + bnd->xcount = 0; + return (TRUE); + } + } + + /* + step through structures until corresponding y is found or until + table is exhausted + */ + while (lp < proi->lend && ytrans >= lp->y + lp->nline) + lp = (linePtr)RUNPTR(lp->nrun); + + /* If some domains for this line, set up for processing */ + if (!(bnd->ypass = lp >= proi->lend || ytrans < lp->y)) { + bnd->pcroi = (pointer)lp; + bnd->xcount = (proi->x + pet->domXoff) < 0 ? + proi->x + pet->domXoff : 0; + bnd->xindex = 0; + bnd->inside = lp->nrun && !RUNPTR(0)->dstart && + proi->x + pet->domXoff <= 0; + } else { + bnd->xcount = 0; + if (lp >= proi->lend) /* Tidy up garbage pointer */ + bnd->pcroi = (pointer)NULL; + } + + return (TRUE); +} /* SyncDomain */ + +static INT32 RunLengthGetRun(flo,pet,bnd) +floDefPtr flo; +peTexPtr pet; +bandPtr bnd; +{ +ROIPtr proi = (ROIPtr)pet->roi; +linePtr lp = (linePtr)bnd->pcroi; +runPtr rp; +INT32 width = (INT32)bnd->format->width; +INT32 xcount = bnd->xcount; +INT32 startx, nextx, length; +CARD32 xindex, nrun; +Bool inside; + + /* Make sure that SyncDomain was called first */ + if (!proi) ImplementationError(flo,pet->peDef,return(0)); + + /* See if there are any processing domains for the current line */ + if (bnd->allpass || bnd->ypass || xcount >= width) { + if (xcount) + return(0); /* off edge of image */ + else + return (-(bnd->xcount = width)); + } + + rp = RUNPTR(0); + nrun = lp->nrun; + inside = bnd->inside; + xindex = bnd->xindex; + + /* Handle left clip */ + if (xcount < 0) { + while (xindex < nrun && + (!inside && xcount + rp[xindex].dstart < 0 || + inside && xcount + rp[xindex].length < 0)) { + if (inside) + xcount += rp[xindex++].length; + else + xcount += rp[xindex].dstart; + inside = !inside; + } + + /* This should have already been caught in init */ + if (xindex >= nrun) { /* no intersection */ + bnd->ypass = TRUE; + return (-(bnd->xcount = width)); + } + + startx = 0; + } else + startx = xcount; + + /* Handle right clip */ + if (xindex >= nrun || + inside && xcount + rp[xindex].length > width || + !inside && xcount + rp[xindex].dstart > width) { + bnd->ypass = TRUE; + nextx = width; + } else if (inside) + nextx = xcount + rp[xindex++].length; + else { + nextx = xcount + rp[xindex].dstart; + /* Handle case where first domain starts past start of image */ + if (!xindex && proi->x + pet->domXoff > 0) + nextx += proi->x + pet->domXoff; + } + + length = (inside) ? nextx - startx : startx - nextx; + + /* toggle inside/outside */ + bnd->inside = !inside; + bnd->xcount = nextx; + bnd->xindex = xindex; + + return (length); +} /* GetRun */ + +/* Initialize control plane structures for desired line */ +static Bool ControlPlaneSyncDomain(flo,ped,bnd,purge) +floDefPtr flo; +peDefPtr ped; +bandPtr bnd; +Bool purge; +{ +peTexPtr pet = ped->peTex; +bandPtr rband; +INT32 ytrans; + + bnd->xcount = 0; + + /* If init routine determined no intersection, pass line */ + if (bnd->allpass) + return (TRUE); + + rband = &pet->receptor[ped->inCnt-1].band[bnd->band]; + ytrans = bnd->current - pet->domYoff; + + if (ytrans < 0 || ytrans >= (INT32)rband->format->height) { + bnd->ypass = TRUE; + return (TRUE); + } else + bnd->ypass = FALSE; + + /* Grab control plane line */ + if (!(pet->roi = bnd->pcroi = GetSrc(flo,pet,rband,ytrans,purge))){ + if (purge) + FreeData(flo,pet,rband,rband->current); + else + SetBandThreshold(rband,rband->available + 1); + return (FALSE); + } + + if ( pet->domXoff > 0 ) { + bnd->inside = FALSE; + bnd->xindex = 0; + } else { + bnd->xindex = -pet->domXoff; + bnd->inside = LOG_tstbit((LogInt *)bnd->pcroi,bnd->xindex) != 0; + } + + return (TRUE); +} + +static INT32 countZeros(line,offset,iedge) +LogInt *line; +INT32 offset,iedge; +{ +INT32 count = 0; +CARD32 index = (CARD32)offset, edge = (CARD32)iedge; + + while (index < edge && !LOG_tstbit(line,index)) { + count++; + index++; + } + + return(count); +} + +INT32 countOnes(line,offset,iedge) +LogInt *line; +INT32 offset,iedge; +{ +INT32 count = 0; +CARD32 index = (CARD32)offset, edge = (CARD32)iedge; + + while (index < edge && LOG_tstbit(line,index)) { + count++; + index++; + } + + return(count); +} + +static INT32 ControlPlaneGetRun(flo,pet,bnd) +floDefPtr flo; +peTexPtr pet; +bandPtr bnd; +{ +peDefPtr ped = pet->peDef; +bandPtr rband = &pet->receptor[ped->inCnt-1].band[bnd->band]; +INT32 xcount = bnd->xcount; +INT32 width = (INT32)bnd->format->width; + +LogInt *cpl; +Bool inside; +INT32 xindex, dwidth, Xoff, length, edge; + + /* See if there is every anything to do with this band */ + if (bnd->allpass || bnd->ypass) { + if (xcount) + return(0); + else + return(-(bnd->xcount = width)); + } + + /* Make sure that there is something left to look at */ + if (xcount >= width) + return (0); + + /* defer sucking these out til necessary */ + cpl = (LogInt *)bnd->pcroi; + inside = bnd->inside; + xindex = bnd->xindex; + dwidth = (INT32)rband->format->width; + Xoff = pet->domXoff; + + /* Figure out the maximum bound to check */ + edge = (Xoff + dwidth > width) ? width - Xoff : dwidth; + + /* See if we are off the side of the control plane */ + if (!xcount && pet->domXoff > 0) { + xcount = length = Xoff + (xindex = countZeros(cpl, 0, edge)); + } else if (inside) { + xcount += (length = countOnes(cpl, xindex, edge)); + xindex += length; + } else { + xcount += (length = countZeros(cpl, xindex, edge)); + xindex += length; + /* If control plane ends before image, push to edge */ + if (xindex >= edge && xcount < width) { + length += width - xcount; + xcount = width; + } + } + + bnd->inside = !inside; + bnd->xcount = xcount; + bnd->xindex = xindex; + + return ((inside) ? length : -length); +} +#endif + +/* end domain.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/control/floman.c b/xie/xc/programs/Xserver/XIE/mixie/control/floman.c new file mode 100644 index 0000000..95b4c48 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/control/floman.c @@ -0,0 +1,547 @@ +/* $XConsortium: floman.c,v 1.6 94/04/17 20:34:12 dpw Exp $ */ +/**** module floman.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + floman.c -- DDXIE photoflo manager + + Robert NC Shelley -- AGE Logic, Inc. May, 1993 + +*****************************************************************************/ + +#define _XIEC_FLOMAN + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include + +/* + * routines referenced by other DDXIE modules + */ +int MakePETex(); +Bool InitReceptors(); +Bool InitReceptor(); +Bool InitEmitter(); +Bool InitBand(); +void ResetReceptors(); +void ResetEmitter(); +void ResetBand(); + +/* routines used internal to this module + */ +static int flo_link(); +static int flo_startup(); +static int flo_resume(); +static int flo_shutdown(); +static int flo_destroy(); + +/* DIXIE to DDXIE photoflo management entry points + */ +static floVecRec floManagerVec = { + flo_link, + flo_startup, + flo_resume, + flo_shutdown, + flo_destroy + }; + +/*------------------------------------------------------------------------ +------------------------ Initialize Photoflo Manager --------------------- +------------------------------------------------------------------------*/ +int InitFloManager(flo) + floDefPtr flo; +{ + /* plug in the DDXIE photoflo management vector */ + flo->floVec = &floManagerVec; + + return(TRUE); +} /* end InitFloManager */ + + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +int MakePETex(flo,ped,extend,inSync,bandSync) + floDefPtr flo; + peDefPtr ped; + CARD32 extend; + Bool inSync; + Bool bandSync; +{ + peTexPtr pet; + inFloPtr inf; + receptorPtr rcp; + bandPtr bnd; + int b, i; + + /* attach an execution context to the photo element definition */ + if(!(pet = (peTexPtr) XieCalloc(sizeof(peTexRec) + (extend + 4) + + ped->inCnt * sizeof(receptorRec)))) + AllocError(flo,ped, return(FALSE)); + + /* init the new peTex */ + ped->peTex = pet; + pet->peDef = ped; + pet->inSync = inSync; + pet->bandSync = bandSync; + pet->outFlo = &ped->outFlo; + pet->receptor = (receptorPtr) &pet[1]; + for(b = 0; b < xieValMaxBands; b++) { + bnd = &pet->emitter[b]; + bnd->band = b; + bnd->format = &ped->outFlo.format[b]; + ListInit(&bnd->stripLst); + } + /* init the new receptors */ + for(i = 0; i < ped->inCnt; i++) { + inf = &ped->inFloLst[i]; + rcp = &pet->receptor[i]; + rcp->inFlo = inf; + for(b = 0; b < xieValMaxBands; b++) { + bnd = &rcp->band[b]; + bnd->band = b; + bnd->isInput = TRUE; + bnd->receptor = rcp; + bnd->format = &rcp->inFlo->format[b]; + ListInit(&bnd->stripLst); + } + } + if(extend) { + /* In case private structure has 'double', round up */ + unsigned char *ptr = (pointer) &pet->receptor[ped->inCnt]; + pet->private = (pointer) ((((int) ptr) & 4) ? ptr + 4 : ptr); + } + + return(TRUE); +} /* end MakePETex */ + + +/*------------------------------------------------------------------------ +--------------------- prepare Receptors for execution -------------------- +------------------------------------------------------------------------*/ +Bool InitReceptors(flo,ped,mapSize,threshold) + floDefPtr flo; + peDefPtr ped; + CARD32 mapSize, threshold; +{ + receptorPtr rcp = ped->peTex->receptor; + int i; + + /* initialize each receptor (1 per inFlo) */ + for(i = 0; i < ped->inCnt; ++rcp, ++i) + if(!InitReceptor(flo,ped,rcp,mapSize,threshold,(CARD8)~0,(CARD8)0)) + return(FALSE); + + return(TRUE); +} /* end InitReceptors */ + + +/*------------------------------------------------------------------------ +--------------------- prepare Receptors for execution -------------------- +------------------------------------------------------------------------*/ +Bool InitReceptor(flo,ped,rcp,mapSize,threshold,process,bypass) + floDefPtr flo; + peDefPtr ped; + receptorPtr rcp; + CARD32 mapSize, threshold; + bandMsk process, bypass; +{ + bandPtr bnd = rcp->band; + int b, bands = rcp->inFlo->bands; + + /* bands to pass rather than process */ + rcp->bypass = rcp->inFlo->index == SRCt1 ? bypass : NO_BANDS; + + /* initialize each band */ + for(b = 0; b < bands; ++bnd, ++b) + if(process & 1<peTex; + int b; + + /* initialize the outFlo and emitter */ + ped->outFlo.active = NO_BANDS; + ped->outFlo.ready = NO_BANDS; + + /* initialize each band */ + for(b = 0; b < ped->outFlo.bands; b++) { + if(pet->receptor[SRCt1].bypass & 1<emitter[b], mapSize, (CARD32) 0, inPlace)) + return(FALSE); + } + return(TRUE); +} /* end InitEmitter */ + + +/*------------------------------------------------------------------------ +------------- prepare a receptor or emitter band for execution ----------- +------------------------------------------------------------------------*/ +Bool InitBand(flo,ped,bnd,mapSize,threshold,inPlace) + floDefPtr flo; + peDefPtr ped; + bandPtr bnd; + CARD32 mapSize, threshold; + INT32 inPlace; +{ + bnd->threshold = threshold; + bnd->available = 0; + bnd->minGlobal = 0; + bnd->minLocal = 0; + bnd->current = 0; + bnd->maxLocal = 0; + bnd->maxGlobal = 0; + bnd->pitch = IsCanonic(bnd->format->class) ? bnd->format->pitch>>3 : 1; + bnd->strip = NULL; + bnd->data = NULL; + bnd->dataMap = NULL; + bnd->final = FALSE; + if((bnd->mapSize = mapSize) && + !(bnd->dataMap = (CARD8**)XieMalloc(mapSize * sizeof(CARD8*)))) + FloAllocError(flo,0,0, return(FALSE)); + + if(bnd->isInput) { + bnd->receptor->active |= 1<band; + bnd->receptor->attend |= 1<band; + bnd->inPlace = NULL; + if(bnd->band == 0 || !bnd->receptor->band[0].replicate) { + if(ped->flags.putData) + ++flo->floTex->imports; + + if(!bnd->receptor->admit) + ++ped->peTex->admissionCnt; + bnd->receptor->admit |= 1<band; + + if(bnd->replicate) { + int b = 1; + /* replicate band zero's format (into the phantom bands + * that will be sharing its data) and initialize them too + */ + do + if(bnd->replicate & 1<format; + bnd[b].format->band = b; + InitBand(flo,ped,&bnd[b],NO_DATAMAP,threshold,NO_INPLACE); + } + while(++b < xieValMaxBands); + } + } + } else { /* IsEmitter */ + bnd->inPlace = ((inPlace == NO_INPLACE) + ? NULL : &ped->peTex->receptor[inPlace].band[bnd->band]); + ped->peTex->emitting |= 1<band; + if(ped->flags.getData) { + ped->outFlo.active |= 1<band; + flo->floTex->exports++; + } + } + return(TRUE); +} /* end InitBand */ + + +/*------------------------------------------------------------------------ +------------------- get rid of left over strips etc. --------------------- +------------------------------------------------------------------------*/ +void ResetReceptors(ped) + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + receptorPtr rcp; + int b,i; + + for(i = 0; i < ped->inCnt; i++) { + for(rcp = &pet->receptor[i], b = 0; b < xieValMaxBands; ++b) { + if(rcp->forward & 1<outFlo.output[b]); + } + rcp->forward = NO_BANDS; + ResetBand(&rcp->band[b]); + } + rcp->admit = NO_BANDS; + rcp->ready = NO_BANDS; + rcp->active = NO_BANDS; + rcp->attend = NO_BANDS; + rcp->bypass = NO_BANDS; + } +} /* end ResetReceptors */ + + +/*------------------------------------------------------------------------ +------------------- get rid of left over strips etc. --------------------- +------------------------------------------------------------------------*/ +void ResetEmitter(ped) + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + int b; + + pet->emitting = NO_BANDS; + + for(b = 0; b < ped->outFlo.bands; ++b) + ResetBand(&pet->emitter[b]); +} /* end ResetEmitter */ + + +/*------------------------------------------------------------------------ +------------------- get rid of left over strips etc. --------------------- +------------------------------------------------------------------------*/ +void ResetBand(bnd) + bandPtr bnd; +{ + bnd->replicate = NO_BANDS; + + FreeStrips(&bnd->stripLst); + + if(bnd->dataMap) + bnd->dataMap = (CARD8 **)XieFree(bnd->dataMap); +} /* end ResetBand */ + + +/*------------------------------------------------------------------------ +-------------------------------- Link ----------------------------------- +------------------------------------------------------------------------*/ +static int flo_link(flo) + floDefPtr flo; +{ + peDefPtr ped; + ddElemVecRec vec; + pedLstPtr lst = ListEmpty(&flo->optDAG) ? &flo->defDAG : &flo->optDAG; + + /* create and initialize our photoflo's execution context */ + if(!flo->floTex && !(flo->floTex = (floTexPtr) XieMalloc(sizeof(floTexRec)))) + FloAllocError(flo,0,0, return(FALSE)); + + flo->floTex->yieldPtr = NULL; + + /* create new element execution contexts for elements that have changed */ + for(ped = lst->flink; !ListEnd(ped,lst); ped = ped->flink) + if(flo->flags.modified) { /* XXX should be ped->flags.modified */ + if(ped->peTex) { /* fix this after beta release */ + vec = ped->ddVec; /* shouldn't have to save vetors */ + Destroy(flo,ped); /* destroy the old element context */ + ped->ddVec = vec; /* shouldn't have to restore them*/ + } + if(!Create(flo,ped)) + return(FALSE); + } + return(TRUE); +} /* end flo_link */ + + +/*------------------------------------------------------------------------ +-------------------------------- Startup ----------------------------------- +------------------------------------------------------------------------*/ +static int flo_startup(flo) + floDefPtr flo; +{ + peDefPtr ped; + pedLstPtr lst = ListEmpty(&flo->optDAG) ? &flo->defDAG : &flo->optDAG; + int status; + + /* initialize our assistant managers */ + InitScheduler(flo); + InitStripManager(flo); + + flo->floTex->imports = flo->floTex->exports = 0; + flo->floTex->exitCnt = 0; + + /* initialize all the elements */ + for(ped = lst->flink; !ListEnd(ped,lst); ped = ped->flink) { + ped->peTex->admissionCnt = 0; + ped->peTex->schedCnt = 0; + ped->peTex->scheduled = 0; + if(Initialize(flo,ped)) + ped->flags.modified = FALSE; + else + break; + } + flo->flags.active = TRUE; + flo->flags.aborted = FALSE; + flo->flags.modified = FALSE; + + /* Call the scheduler -- there are no ImportClient elements the first time + */ + if(ferrCode(flo)) { + flo_shutdown(flo); + status = FALSE; + } else { + status = Execute(flo, NULL); + } + return(status); +} /* end flo_startup */ + + +/*------------------------------------------------------------------------ +-------------------------------- Resume ----------------------------------- +------------------------------------------------------------------------*/ +static int flo_resume(flo) + floDefPtr flo; +{ + /* not implemented in the SI */ + + FloImplementationError(flo,0,0, return(FALSE)); +} /* end flo_resume */ + + +/*------------------------------------------------------------------------ +------------------------------ Shutdown ---------------------------------- +------------------------------------------------------------------------*/ +static int flo_shutdown(flo) + floDefPtr flo; +{ + peDefPtr ped; + pedLstPtr lst = ListEmpty(&flo->optDAG) ? &flo->defDAG : &flo->optDAG; + + if(flo->floTex) { + /* reset all the elements */ + for(ped = lst->flink; !ListEnd(ped,lst); ped = ped->flink) + Reset(flo,ped); + + /* empty the strip cache */ + flo->floTex->stripSize = 0; + if(flo->floTex->stripHead.flink) + FreeStrips(&flo->floTex->stripHead); + + if(flo->awakenPtr) { + /* awaken snoozing clients + */ + while(flo->awakenCnt) { + ClientPtr client = flo->awakenPtr[--flo->awakenCnt]; + if(!client->clientGone) + AttendClient(client); + } + flo->awakenPtr = (ClientPtr*)XieFree(flo->awakenPtr); + } + flo->flags.active = FALSE; + } + return(TRUE); +} /* end flo_shutdown */ + + +/*------------------------------------------------------------------------ +-------------------------------- Destroy --------------------------------- +------------------------------------------------------------------------*/ +static int flo_destroy(flo) + floDefPtr flo; +{ + peDefPtr ped; + pedLstPtr lst = ListEmpty(&flo->optDAG) ? &flo->defDAG : &flo->optDAG; + + if(flo->floTex) { + /* destroy all the lingering element structures */ + for(ped = lst->flink; !ListEnd(ped,lst); ped = ped->flink) + Destroy(flo,ped); + + /* get rid of the floTex */ + flo->floTex = (floTexPtr) XieFree(flo->floTex); + } + /* zap the DDXIE photoflo management vectors */ + flo->floVec = NULL; + flo->schedVec = NULL; + flo->stripVec = NULL; + + return(TRUE); +} /* end flo_destroy */ + +/* end module floman.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/control/sched.c b/xie/xc/programs/Xserver/XIE/mixie/control/sched.c new file mode 100644 index 0000000..8a4e190 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/control/sched.c @@ -0,0 +1,264 @@ +/* $XConsortium: sched.c,v 1.4 94/04/17 20:34:12 rws Exp $ */ +/**** module sched.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + sched.c -- DDXIE machine independent photoflo scheduler + + Dean Verheiden, Robert NC Shelley -- AGE Logic, Inc. May, 1993 + +*****************************************************************************/ + +#define _XIEC_SCHED + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + +#define SCHED_BAIL_OUT 10000 /* number of nonproductive times around scheduler + * loop before bailing out -- bad element + */ +/* + * routines called from DIXIE + */ + +/* + * routines referenced by other DDXIE modules + */ +int InitScheduler(); + +/* + * routines used internal to this module + */ +static Bool execute(); +static bandMsk runnable(); + +/* + * DDXIE photoflo manager entry points + */ +static schedVecRec schedulerVec = { + execute, + runnable + }; + + +/*------------------------------------------------------------------------ +--------------------------- Initialize Scheduler ------------------------- +------------------------------------------------------------------------*/ +int InitScheduler(flo) + floDefPtr flo; +{ + /* plug in the DDXIE scheduler vector */ + flo->schedVec = &schedulerVec; + + /* init the scheduler ready-list */ + ListInit(&flo->floTex->schedHead); + + return(TRUE); +} /* end InitScheduler */ + + +/*------------------------------------------------------------------------ +------------------------- Execute the photoflo --------------------------- +------------------------------------------------------------------------*/ +static Bool execute(flo, importer) + floDefPtr flo; + peTexPtr importer; +{ + bandMsk ready; + peTexPtr pet; + peDefPtr ped; + pedLstPtr lst = ListEmpty(&flo->optDAG) ? &flo->defDAG : &flo->optDAG; + CARD32 sched_count = SCHED_BAIL_OUT; + CARD32 strip_count = flo->floTex->putCnt; + + if(importer) { + /* Put the ImportClient element at the head of the ready-list */ + InsertMember(importer,&flo->floTex->schedHead); + importer->scheduled = importer->receptor[IMPORT].ready; + } + do { + /* execute elements from the head of the ready-list until it's empty + * (calls to schedule from the data manager may prepend + * additional elements to the ready-list) + */ + while(!ListEmpty(&flo->floTex->schedHead)) { + pet = flo->floTex->schedHead.flink; + + if(Activate(flo,pet->peDef,pet) && (ready = runnable(flo,pet))) { + pet->scheduled = ready; /* remember which bands keep us alive */ + } else { + /* element is no longer runnable, remove it and check for errors + */ + RemoveMember(pet,pet); + pet->scheduled = 0; + if(ferrCode(flo)) + return(flo->flags.active = FALSE); + } + if(strip_count != flo->floTex->putCnt) { + sched_count = SCHED_BAIL_OUT; + strip_count = flo->floTex->putCnt; + } else if( !--sched_count) + ImplementationError(flo,pet->peDef, return(FALSE)); + } + /* Load all the elements onto the ready-list that can keep producing + * output without requiring any additional input (e.g. ImportResource + * elements). + */ + for(ped = lst->flink; !ListEnd(ped,lst); ped = ped->flink) + if(ped->peTex->emitting && !ped->peTex->admissionCnt) + InsertMember(ped->peTex,&flo->floTex->schedHead); + /* + * keep on trucking if there's nothing expected from the client + */ + } while(!flo->floTex->imports && !ListEmpty(&flo->floTex->schedHead)); + + /* if we still have stuff to do, count another round, otherwise shut it down + */ + if(flo->floTex->imports || flo->floTex->exports) + ++flo->floTex->exitCnt; + else + ddShutdown(flo); + + return(flo->flags.active); +} /* end execute */ + + +/*------------------------------------------------------------------------ +----------------------- test element for runnability --------------------- +------------------------------------------------------------------------*/ +static bandMsk runnable(flo,pet) + floDefPtr flo; + peTexPtr pet; +{ + receptorPtr rcp = pet->receptor, rend = &pet->receptor[pet->peDef->inCnt]; + bandMsk R, r; + + if(ferrCode(flo)) + return(0); + + if(pet->inSync) + if(pet->bandSync) { + /* + * inSync true, bandSync true: all attendable bands and inputs needed + */ + for(R = ~0; rcp < rend && R; R &= r, ++rcp) + if((rcp->active & rcp->attend) != (r = rcp->ready & rcp->attend)) + return(NO_BANDS); + return(R); /* return AND of attendable bands */ + } else { + /* + * inSync true, bandSync false: any bands that match between all inputs + */ + for(r = 0, R = ~0; rcp < rend; R &= r, ++rcp) + if(rcp->active & rcp->attend && !(r = rcp->ready & rcp->attend)) + return(NO_BANDS); + return(R & r); /* return AND of attendable bands */ + } + else + if(pet->bandSync) { + /* + * inSync false, bandSync true: all bands of any input must be ready + */ + for(R = 0; rcp < rend; R |= r, ++rcp) + if((rcp->active & rcp->attend) != (r = rcp->ready & rcp->attend)) + return(NO_BANDS); + return(R); /* return OR of attendable bands */ + } else { + /* + * inSync false, bandSync false: any band from any input will do + */ + for(R = 0; rcp < rend; R |= rcp->ready & rcp->attend, ++rcp); + return(R); /* return OR of attendable bands */ + } +} /* end runnable */ + +/* end module sched.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/control/strip.c b/xie/xc/programs/Xserver/XIE/mixie/control/strip.c new file mode 100644 index 0000000..5f9d1f8 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/control/strip.c @@ -0,0 +1,1197 @@ +/* $XConsortium: strip.c /main/9 1995/12/02 16:48:50 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module strip.c ****/ +/***************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + strip.c -- DDXIE machine independent data flo manager + + Robert NC Shelley -- AGE Logic, Inc. April, 1993 + +*****************************************************************************/ + +#define _XIEC_STRIP + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +/* routines exported to the photoflo manager + */ +int InitStripManager(); + +/* routines exported directly to DIXIE + */ +int DebriefStrips(); +void FreeStrips(); + +/* routines exported to DIXIE via the photoflo management vector + */ +static int import_data(); +static int export_data(); +static int query_data(); + +/* routines exported to elements via the data manager's vector + */ +static CARD8 *make_bytes(); +static CARD8 *make_lines(); +static Bool map_data(); +static CARD8 *get_data(); +static Bool put_data(); +static void free_data(); +static Bool pass_strip(); +static Bool import_strips(); +static Bool alter_src(); +static void bypass_src(); +static void disable_src(); +static void disable_dst(); + +/* routines used internal to this module + */ +static stripPtr alter_data(); +static stripPtr contig_data(); +static stripPtr make_strip(); +static stripPtr clone_strip(); +static bandMsk put_strip(); +static void forward_strip(); +static stripPtr free_strip(); + +/* DDXIE client data manager entry points + */ +static dataVecRec dataManagerVec = { + import_data, + export_data, + query_data + }; + +/* DDXIE photoflo manager entry points + */ +static stripVecRec stripManagerVec = { + make_bytes, + make_lines, + map_data, + get_data, + put_data, + free_data, + pass_strip, + import_strips, + alter_src, + bypass_src, + disable_src, + disable_dst + }; + +INT32 STRIPS = 0; /* DEBUG */ +INT32 BYTES = 0; /* DEBUG */ + +/*------------------------------------------------------------------------ +-------------------------- Initialize Data Manager ----------------------- +------------------------------------------------------------------------*/ +int InitStripManager(flo) + floDefPtr flo; +{ + /* plug in the DDXIE client data management vector */ + flo->dataVec = &dataManagerVec; + + /* plug in the strip manager vector */ + flo->stripVec = &stripManagerVec; + + /* init the strip cache */ + ListInit(&flo->floTex->stripHead); + + /* choose the best strip size for this flo (a constant value for now) */ + flo->floTex->stripSize = STANDARD_STRIP_SIZE; + + /* clear the count of strips passed */ + flo->floTex->putCnt = 0; + + return(TRUE); +} /* end InitStripManager */ + + +/*------------------------------------------------------------------------ +----------- discard parent headers from a whole list of strips ----------- +----------- and copy data if multiple references are found ----------- +----------- then transfer them all to their final destination ----------- +------------------------------------------------------------------------*/ +int DebriefStrips(i_head,o_head) + stripLstPtr i_head; + stripLstPtr o_head; +{ + stripPtr child, parent; + + /* NOTE: we might want to consider (re)allocing strip buffers to + * strip->length instead of leaving them an strip->bufSiz. + */ + for(child = i_head->flink; !ListEnd(child,i_head); child = child->flink) { + while(parent = child->parent) + if(parent->refCnt == 1) { /* discard a cloned header */ + child->parent = parent->parent; + XieFree(parent); + --STRIPS; /*DEBUG*/ + } else { /* copy multiply referenced data */ + if(!(child->data = (CARD8*)XieMalloc(child->bufSiz))) + return(FALSE); + memcpy((char*)child->data, (char*)parent->data, (int)child->bufSiz); + child->parent = NULL; /* de-reference child from parent */ + --parent->refCnt; + BYTES += child->bufSiz; /*DEBUG*/ + } + child->format = NULL; /* kill per-strip format pointer */ + } + /* transfer the entire list of input strips to the output + */ + if(ListEmpty(i_head)) + ListInit(o_head); + else { + i_head->flink->blink = (stripPtr)o_head; + i_head->blink->flink = (stripPtr)o_head; + *o_head = *i_head; + ListInit(i_head); + } + return(TRUE); +} /* end DebriefStrips */ + + +/*------------------------------------------------------------------------ +------------------------- Free a whole list of strips -------------------- +------------------------------------------------------------------------*/ +void FreeStrips(head) + stripLstPtr head; +{ + while( !ListEmpty(head) ) { + stripPtr strip; + + RemoveMember(strip, head->flink); + free_strip(NULL, strip); + } +} /* end FreeStrips */ + + +/*------------------------------------------------------------------------ +------------------------ Input from PutClientData ------------------------ +------------------------------------------------------------------------*/ +static int import_data(flo,ped,band,data,len,final) + floDefPtr flo; + peDefPtr ped; + CARD8 band; + CARD8 *data; + CARD32 len; + BOOL final; +{ + peTexPtr pet = ped->peTex; + receptorPtr rcp = &pet->receptor[IMPORT]; + bandPtr bnd = &rcp->band[band]; + bandMsk msk = 1<admit | rcp->bypass) & msk)) + return(TRUE); /* drop unwanted data */ + + /* make a strip and fill it in the info from the client + * (the format info was supplied with the element and technique parameters) + */ + if(!(strip = make_strip(flo,bnd->format,bnd->maxGlobal,len,len,FALSE))) + AllocError(flo,ped, return(FALSE)); + strip->final = final; + strip->data = data; + strip->bufSiz = len; + + if(rcp->bypass & msk) { + put_strip(flo,pet,strip); /* pass it downstream */ + if(!strip->flink) + free_strip(flo,strip); /* nobody wanted it */ + } else { + bnd->maxGlobal = strip->end + 1; + bnd->available += len; + rcp->ready |= msk; + InsertMember(strip,bnd->stripLst.blink); + if(bnd->final = final) { + if(!(rcp->admit &= ~msk)) + --pet->admissionCnt; + --flo->floTex->imports; + } + } + /* fire up the scheduler -- then we're outa here */ + return( Execute(flo,pet) ); +} /* end import_data */ + + +/*------------------------------------------------------------------------ +-------------------------- Output for GetClientData ---------------------- +------------------------------------------------------------------------*/ +static int export_data(flo,ped,band,maxLen,term) + floDefPtr flo; + peDefPtr ped; + CARD8 band; + CARD32 maxLen; + BOOL term; +{ + BOOL release = FALSE, final = FALSE; + stripLstPtr lst = &ped->outFlo.output[band]; + stripPtr strip = NULL; + CARD32 bytes, want = maxLen; + CARD8 state, *data; + + /* if this is multi-byte data, make sure we send/swap complete aggregates + */ + if(ped->swapUnits[band] > 1) + want &= ~(ped->swapUnits[band]-1); + + if(bytes = ListEmpty(lst) ? 0 : min(lst->flink->length, want)) { + strip = lst->flink; + data = strip->data + (strip->bitOff>>3); + if(strip->length -= bytes) { + strip->start += bytes; + strip->bitOff += bytes<<3; + } else { + RemoveMember(strip, strip); + final = strip->final; + release = TRUE; + if(ListEmpty(lst)) + ped->outFlo.ready &= ~(1<floTex->exports--; + else if(term) { + /* shut down the output band prematurely */ + ped->outFlo.ready &= ~(1<peTex,&ped->peTex->emitter[band]); + } + /* figure out our current state and send a reply to the client + */ + state = ped->outFlo.ready & 1<outFlo.active & 1<swapUnits[band],state); + if(release) + free_strip(flo,strip); + + return(bytes ? Execute(flo,NULL) : TRUE); +} /* end export_data */ + + +/*------------------------------------------------------------------------ +----------- Query flo elements involved in client data transport --------- +------------------------------------------------------------------------*/ +static int query_data(flo,list,pending,available) + floDefPtr flo; + xieTypPhototag **list; + CARD16 *pending; + CARD16 *available; +{ + peDefPtr ped; + pedLstPtr lst = ListEmpty(&flo->optDAG) ? &flo->defDAG : &flo->optDAG; + CARD32 exdex; + + *pending = *available = 0; + if(!(*list = (xieTypPhototag *)XieMalloc(flo->peCnt * sz_xieTypPhototag))) + FloAllocError(flo,0,0, return(FALSE)); + + /* find all the import elements that need client data */ + for(ped = lst->flink; ped; ped = ped->clink) + if(ped->flags.putData && ped->peTex->admissionCnt) + *list[(*pending)++] = ped->phototag; + + /* find all the export elements that have client data */ + exdex = *pending + (*pending & 1); + for(ped = lst->blink; ped; ped = ped->clink) + if(ped->flags.getData && ped->outFlo.ready) + *list[exdex + (*available)++] = ped->phototag; + + return(TRUE); +} /* end query_data */ + + +/*------------------------------------------------------------------------ +---- make a strip containing the specified number of contiguous bytes ---- +------------------------------------------------------------------------*/ +static CARD8* make_bytes(flo,pet,bnd,contig,purge) + floDefPtr flo; + peTexPtr pet; + bandPtr bnd; + CARD32 contig; + Bool purge; +{ + stripPtr strip = bnd->stripLst.blink; + CARD32 limit, size, units; + Bool avail = (!ListEmpty(&bnd->stripLst) && bnd->current >= strip->start && + bnd->current + contig <= strip->start + strip->bufSiz); + + if(purge && !avail && put_data(flo,pet,bnd)) + return(bnd->data = NULL); /* force element to suspend processing */ + + if(_is_global(bnd)) + return(get_data(flo,pet,bnd,contig,FALSE)); /* "current" is available */ + + if(avail) { + /* extend the available space in our current strip + */ + limit = bnd->current + contig; + bnd->available += limit - bnd->maxGlobal; + bnd->maxGlobal = limit; + strip->end = limit - 1; + strip->length = limit - strip->start; + } else { + /* time to make a fresh strip + */ + units = bnd->current + contig - bnd->maxGlobal; + size = units + Align(units,flo->floTex->stripSize); + if(!(strip = make_strip(flo,bnd->format,bnd->maxGlobal,units,size,TRUE))) + AllocError(flo,pet->peDef, return(NULL)); + + bnd->available += strip->length; + bnd->maxGlobal = strip->end + 1; + InsertMember(strip,bnd->stripLst.blink); + } + /* update our bandRec with the results */ + bnd->strip = strip; + bnd->minLocal = max(bnd->minGlobal,strip->start); + bnd->maxLocal = strip->end + 1; + return(bnd->data = _byte_ptr(bnd)); +} /* end make_bytes */ + + +/*------------------------------------------------------------------------ +--- Find or make a strip containing the unit specified by bnd->current --- +------------------------------------------------------------------------*/ +static CARD8* make_lines(flo,pet,bnd,purge) + floDefPtr flo; + peTexPtr pet; + bandPtr bnd; + Bool purge; +{ + stripPtr strip = NULL; + formatPtr fmt; + CARD32 size, units; + + if(purge && _release_ok(bnd) && put_data(flo,pet,bnd)) + return(bnd->data = NULL); /* force element to suspend processing */ + + if(_is_global(bnd)) /* we already have it, just go find it */ + return(get_data(flo,pet,bnd,(CARD32) 1,FALSE)); + + fmt = bnd->format; + if(bnd->current >= fmt->height) + return(NULL); /* trying to go beyond end of image */ + + while(bnd->current >= bnd->maxGlobal) { + /* + * re-use src if we're allowed to alter the data + */ + if(!bnd->inPlace || !(strip = alter_data(flo,pet,bnd))) { + size = flo->floTex->stripSize; + units = size / bnd->pitch; + if(units == 0) { /* image bigger than standard strip */ + units = 1; + size = bnd->pitch; + } else if(bnd->current + units > fmt->height) /* at end of image */ + units = fmt->height - bnd->current; + strip = make_strip(flo,fmt,bnd->maxGlobal,units,size,TRUE); + } + if(!strip) + AllocError(flo,pet->peDef, return(NULL)); + bnd->available += strip->length; + bnd->maxGlobal = strip->end + 1; + if(bnd->maxGlobal == fmt->height) + bnd->final = strip->final = TRUE; + InsertMember(strip,bnd->stripLst.blink); + } + /* update our bandRec with the results */ + bnd->strip = strip; + bnd->minLocal = max(bnd->minGlobal,strip->start); + bnd->maxLocal = strip->end + 1; + return(bnd->data = _line_ptr(bnd)); +} /* end make_lines */ + + +/*------------------------------------------------------------------------ +-------------- load data map with pointers to specified data ------------- +------------------------------------------------------------------------*/ +static Bool map_data(flo,pet,bnd,map,unit,len,purge) + floDefPtr flo; + peTexPtr pet; + bandPtr bnd; + CARD32 map,unit,len; + Bool purge; +{ + CARD32 line, pitch; + CARD8 *next = (CARD8 *)NULL, *last = (CARD8 *)NULL; + CARD8 **ptr = bnd->dataMap + map; + stripPtr strip; + + /* first map the last unit and then the first unit -- if we have to make + * strips, or if input strips aren't there, we may as well handle it now + */ + if(len && map + len <= bnd->mapSize) + if(bnd->isInput) { + last = (CARD8*)GetSrc(flo,pet,bnd,unit+len-1,KEEP); + next = (CARD8*)GetSrc(flo,pet,bnd,unit,purge); + } else { + last = (CARD8*)GetDst(flo,pet,bnd,unit+len-1,KEEP); + next = (CARD8*)GetDst(flo,pet,bnd,unit,purge); + } + if(!next || !last) + return(FALSE); /* map too small or can't map first and last unit */ + + /* now walk through the strips and map all the lines (or bytes!) + */ + strip = bnd->strip; + pitch = bnd->pitch; + line = unit; + while((*ptr++ = next) != last) + if(++line <= strip->end) + next += pitch; + else { + strip = strip->flink; + next = strip->data; + } + return(TRUE); +} /* end map_data */ + + +/*------------------------------------------------------------------------ +------ Find the strip containing the unit specified by bnd->current ------ +------------------------------------------------------------------------*/ +static CARD8* get_data(flo,pet,bnd,contig,purge) + floDefPtr flo; + peTexPtr pet; + bandPtr bnd; + CARD32 contig; + Bool purge; +{ + /* NOTE: get_data assumes that the caller has already verified that the + * beginning of the requested data is available in bnd->stripLst. + */ + stripPtr strip = bnd->strip ? bnd->strip : bnd->stripLst.flink; + + /* first get rid of extra baggage if we can + */ + if(purge && _release_ok(bnd)) + free_data(flo,pet,bnd); + + strip = bnd->strip ? bnd->strip : bnd->stripLst.flink; + while(!ListEnd(strip,&bnd->stripLst)) + if(bnd->current > strip->end) + strip = strip->flink; /* try the next strip */ + else if(bnd->current < strip->start) + strip = strip->blink; /* try the previous strip */ + else if(bnd->current+contig-1 <= strip->end || + (strip = contig_data(flo,pet,bnd,strip,contig))) + break; /* we found or assembled it */ + else + return(NULL); /* couldn't get enough bytes */ + + /* update our bandRec with the results + */ + bnd->strip = strip; + bnd->minLocal = max(bnd->minGlobal,strip->start); + bnd->maxLocal = strip->end + 1; + bnd->data = _is_local_contig(bnd,contig) ? _line_ptr(bnd) : NULL; + return(bnd->data); +} /* end get_data */ + + +/*------------------------------------------------------------------------ +------- move strip(s) onto awaiting receptor(s) or an export outFlo ------ +------------------------------------------------------------------------*/ +static Bool put_data(flo,pet,bnd) + floDefPtr flo; + peTexPtr pet; + bandPtr bnd; +{ + bandMsk suspend = 0; + stripPtr strip; + + /* transfer strips until we run out or reach the one we're working in + */ + while(_release_ok(bnd)) { + RemoveMember(strip, bnd->stripLst.flink); + bnd->available -= strip->length; + bnd->minGlobal = strip->end + 1; + + if(!(pet->emitting & 1<band)) + free_strip(flo,strip); /* output disabled */ + else { + strip->flink = NULL; + suspend |= put_strip(flo,pet,strip); /* send it downstream */ + if(!strip->flink) + free_strip(flo,strip); /* nobody wanted it! */ + } + } + if(ListEmpty(&bnd->stripLst)) { + bnd->strip = NULL; + bnd->data = NULL; + if(bnd->final) + disable_dst(flo,pet,bnd); + } + return(suspend != 0); +} /* end put_data */ + + +/*------------------------------------------------------------------------ +---------- free strip(s) from a receptor band or an emitter band --------- +------------------------------------------------------------------------*/ +static void free_data(flo,pet,bnd) + floDefPtr flo; + peTexPtr pet; + bandPtr bnd; +{ + bandMsk msk = 1<band; + + /* free strips until we run out or reach the one we're working in + */ + while(_release_ok(bnd)) { + stripPtr strip; + + RemoveMember(strip, bnd->stripLst.flink); + bnd->available -= strip->length - (bnd->minGlobal - strip->start); + bnd->minGlobal = strip->end + 1; + if(bnd->isInput && bnd->receptor->forward & msk) + forward_strip(flo,pet,strip); + else + free_strip(flo,strip); + } + /* a little bookkeeping to let the scheduler know where we're at + */ + bnd->available -= bnd->current - bnd->minGlobal; + bnd->minGlobal = bnd->current; + if(bnd->isInput) { + CheckSrcReady(bnd,msk); + } + if(bnd->final && bnd->isInput && ListEmpty(&bnd->stripLst)) { + bnd->receptor->active &= ~msk; + bnd->receptor->attend &= ~msk; + } + if(!(bnd->data = _is_local(bnd) ? _line_ptr(bnd) : NULL)) + bnd->strip = NULL; +} /* end free_data */ + + +/*------------------------------------------------------------------------ +---- take list of strips passed in (most likely from a photomap), clone -- +---- the headers, and hang them on the input receptor to make the data -- +---- accessable by standard macros -- +------------------------------------------------------------------------*/ +static Bool import_strips(flo,pet,bnd,strips) + floDefPtr flo; + peTexPtr pet; + bandPtr bnd; + stripLstPtr strips; +{ + stripPtr strip = strips->flink, clone = NULL; + receptorPtr rcp = pet->receptor; + CARD8 msk = 1<band; + + for(strip = strips->flink; !ListEnd(strip,strips); strip = strip->flink) { + + if(!(clone = clone_strip(flo, strip))) + AllocError(flo,pet->peDef, return(FALSE)); + + clone->format = bnd->format; /* this had better be right! */ + + bnd->available += clone->length; + + InsertMember(clone,bnd->stripLst.blink); + } + bnd->final = clone->final; + bnd->maxGlobal = clone->end + 1; + + if(!(rcp->admit &= ~msk)) + --pet->admissionCnt; + + return(TRUE); +} /* end import_strips */ + + +/*------------------------------------------------------------------------ +--------- Clone a strip and pass it on to the element's recipients ------- +------------------------------------------------------------------------*/ +static Bool pass_strip(flo,pet,bnd,strip) + floDefPtr flo; + peTexPtr pet; + bandPtr bnd; + stripPtr strip; +{ + stripPtr clone; + + if(!(pet->emitting & 1<band)) + return(TRUE); /* output disabled */ + + if(!(clone = clone_strip(flo, strip))) + AllocError(flo,pet->peDef, return(FALSE)); + + clone->format = bnd->format; /* this had better be right! */ + + put_strip(flo,pet,clone); /* give to downstream receptors */ + if(!clone->flink) + free_strip(flo,clone); /* nobody wanted it */ + + if(bnd->final = strip->final) + disable_dst(flo,pet,bnd); + + return(TRUE); +} /* end pass_strip */ + + +/*------------------------------------------------------------------------ +------------ see if it's ok to over write the data in a src strip -------- +------------------------------------------------------------------------*/ +static Bool alter_src(flo,pet,strip) + floDefPtr flo; + peTexPtr pet; + stripPtr strip; +{ + stripPtr chk; + + if(!strip->data || strip->Xowner) + return(FALSE); + + /* make sure there are no other users of this strip's data + */ + for(chk = strip; chk->parent && chk->refCnt == 1; chk = chk->parent); + return(chk->refCnt == 1); +} /* end alter_src */ + + +/*------------------------------------------------------------------------ +--------- pass all remaining input for this band straight through -------- +------------------------------------------------------------------------*/ +static void bypass_src(flo,pet,sbnd) + floDefPtr flo; + peTexPtr pet; + bandPtr sbnd; +{ + stripPtr strip; + bandPtr dbnd = &pet->emitter[sbnd->band]; + CARD8 *src; + CARD8 *dst; + + if(sbnd->receptor->active & 1<band) { + /* + * if there's lingering data, see that it gets to its destination + */ + for(src = (CARD8*)GetCurrentSrc(flo,pet,sbnd), + dst = (CARD8*)GetCurrentDst(flo,pet,dbnd); + src && dst; + src = (CARD8*)GetNextSrc(flo,pet,sbnd,KEEP), + dst = (CARD8*)GetNextDst(flo,pet,dbnd,!src)) { + if(src != dst) + memcpy((char*)dst, (char*)src, (int)dbnd->pitch); + } + /* if there's a partial strip still here, adjust its length + */ + if(!ListEmpty(&dbnd->stripLst)) { + strip = dbnd->stripLst.blink; + if(strip->start < dbnd->current) { + strip->end = dbnd->current - 1; + strip->length = dbnd->current - strip->start; + put_data(flo,pet,dbnd); + } + } + /* shut down the src band, or the dst band if we're all done + */ + if(pet->emitting &= ~(1<band)) + disable_src(flo,pet,sbnd,FLUSH); + else + disable_dst(flo,pet,dbnd); + } + /* if we're still accepting input, the remainder will bypass this element + */ + sbnd->receptor->bypass |= 1<band; +} /* end bypass_src */ + + +/*------------------------------------------------------------------------ +---------- disable src band and discard any remaining input data --------- +------------------------------------------------------------------------*/ +static void disable_src(flo,pet,bnd,purge) + floDefPtr flo; + peTexPtr pet; + bandPtr bnd; + Bool purge; +{ + bandMsk msk = 1<band; + + if(bnd->receptor->admit & msk && pet->peDef->flags.putData) + --flo->floTex->imports; /* one less import client band */ + + if(bnd->receptor->admit && !(bnd->receptor->admit &= ~msk)) + --pet->admissionCnt; /* one less receptor needing data */ + + bnd->final = TRUE; + + if(purge) + FreeData(flo,pet,bnd,bnd->maxGlobal); +} /* end disable_src */ + + +/*------------------------------------------------------------------------ +--- disable dst band -- also disables all src's if no dst bands remain --- +------------------------------------------------------------------------*/ +static void disable_dst(flo,pet,dbnd) + floDefPtr flo; + peTexPtr pet; + bandPtr dbnd; +{ + peDefPtr ped = pet->peDef; + receptorPtr rcp, rend = &pet->receptor[ped->inCnt]; + bandMsk mask; + bandPtr sbnd; + + /* if this is the last emitter band to turn off and this isn't an import + * client element, we'll step thru all the receptor bands and kill them too + */ + if(!(pet->emitting &= ~(1<band)) && !ped->flags.putData) + for(rcp = pet->receptor; rcp < rend; ++rcp) + for(mask = 1, sbnd = rcp->band; rcp->active; mask <<= 1, ++sbnd) + if(rcp->active & mask) + disable_src(flo,pet,sbnd,TRUE); + if(ped->flags.getData) { + ped->outFlo.active &= ~(1<band); + if(!(ped->outFlo.ready & 1<band)) + flo->floTex->exports--; + } +} /* end disable_dst */ +/*------------------------------------------------------------------------ +- Get permission for an emitter to write into an existing receptor strip - +------------------------------------------------------------------------*/ +static stripPtr alter_data(flo,pet,db) + floDefPtr flo; + peTexPtr pet; + bandPtr db; +{ + bandPtr sb = db->inPlace; + stripPtr chk, strip = sb->strip ? sb->strip : sb->stripLst.flink; + + /* search through the source data for the corresponding line number + */ + while(!ListEnd(strip,&sb->stripLst)) + if(db->current > strip->end) + strip = strip->flink; + else if(db->current < strip->start) + strip = strip->blink; + else if(!strip->data || strip->Xowner) + break; + else { + /* make sure there are no other users of this strip's data + */ + for(chk = strip; chk->parent && chk->refCnt == 1; chk = chk->parent); + if(chk->refCnt > 1) + break; + return(clone_strip(flo,strip)); /* return a clone of the src strip */ + } + return(NULL); +} /* end alter_data */ + + +/*------------------------------------------------------------------------ +---------- enter with a strip containing at least one byte of data ------ +---------- {if a new strip must be created (to hold at least ------ +---------- contig bytes), available data will be copied to it} ------ +---------- return with a strip containing "contig" contiguous bytes ------ +------------------------------------------------------------------------*/ +static stripPtr contig_data(flo,pet,bnd,i_strip,contig) + floDefPtr flo; + peTexPtr pet; + bandPtr bnd; + stripPtr i_strip; + CARD32 contig; +{ + stripPtr o_strip, n_strip; + CARD32 limit, start, skip, avail = i_strip->end - bnd->current + 1; + + if(contig <= i_strip->bufSiz - i_strip->length + avail) + o_strip = i_strip; + else { + /* i_strip too small, make a new one and copy available data into it + */ + if(!(o_strip = make_strip(flo, bnd->format, bnd->current, avail, + contig + Align(contig, flo->floTex->stripSize), + TRUE))) + AllocError(flo,pet->peDef, return(NULL)); + InsertMember(o_strip,i_strip); + memcpy((char*)o_strip->data, + (char*)&i_strip->data[bnd->current-i_strip->start], (int)avail); + if(i_strip->length -= avail) + i_strip->end -= avail; + else { + RemoveMember(n_strip,i_strip); + o_strip->final = n_strip->final; + free_strip(flo, n_strip); + } + } + /* determine how far we can extend our o_strip + */ + if(bnd->current + contig <= bnd->maxGlobal) + limit = bnd->current + contig; /* limit to data needed */ + else + limit = bnd->maxGlobal; /* limit to data available */ + + /* if there are more strips beyond "o_strip", transfer the needed amount of + * data into our mega-strip (free any strips that we completely consume) + */ + for(start = o_strip->end+1; start < limit; start += avail) { + n_strip = o_strip->flink; + skip = start - n_strip->start; + avail = min(n_strip->length - skip, limit - start); + memcpy((char*)&o_strip->data[o_strip->length], + (char*)&n_strip->data[skip], (int)avail); + o_strip->end += avail; + o_strip->length += avail; + if(avail+skip == n_strip->length) { + RemoveMember(n_strip, n_strip); + o_strip->final = n_strip->final; + free_strip(flo, n_strip); + } + } + if(!bnd->isInput) { + limit = bnd->current + contig; + bnd->available += limit - bnd->maxGlobal; + bnd->maxGlobal = limit; + o_strip->end = limit - 1; + o_strip->length = limit - o_strip->start; + } + return(o_strip); +} /* end contig_data */ + + +/*------------------------------------------------------------------------ +---------------------------- Make a new strip ---------------------------- +------------------------------------------------------------------------*/ +static stripPtr make_strip(flo,fmt,start,units,bytes,allocData) + floDefPtr flo; + formatPtr fmt; + CARD32 start, units, bytes; + Bool allocData; +{ + stripPtr strip; + stripLstPtr cache = &flo->floTex->stripHead; + Bool cachable = allocData && bytes == flo->floTex->stripSize; + + if(!ListEmpty(cache) && (cachable || !cache->blink->data)) + RemoveMember(strip, cachable ? cache->flink : cache->blink); + else if(strip = (stripPtr) XieMalloc(sizeof(stripRec))) { + strip->data = NULL; + ++STRIPS; /*DEBUG*/ + } + if(strip) { + strip->flink = NULL; + strip->parent = NULL; + strip->format = fmt; + strip->refCnt = 1; + strip->Xowner = !allocData; + strip->canonic = IsCanonic(fmt->class); + strip->final = FALSE; + strip->cache = cachable; + strip->start = start; + strip->end = start + units - 1; + strip->length = units; + strip->bitOff = 0; + strip->bufSiz = bytes; + + if(allocData && bytes && !strip->data) + if(strip->data = (CARD8 *) XieCalloc(bytes)) /* calloc to hush purify */ + BYTES += bytes; /*DEBUG*/ + else + strip = free_strip(NULL,strip); + } + return(strip); +} /* end make_strip */ + + +/*------------------------------------------------------------------------ +---- Clone a new modifiable strip wrapper for existing read-only data ---- +------------------------------------------------------------------------*/ +static stripPtr clone_strip(flo,in_strip) + floDefPtr flo; + stripPtr in_strip; +{ + stripLstPtr cache = &flo->floTex->stripHead; + stripPtr out_strip; + + if(ListEmpty(cache) || cache->blink->data) { + out_strip = (stripPtr) XieMalloc(sizeof(stripRec)); + ++STRIPS; /*DEBUG*/ + } else { + RemoveMember(out_strip, cache->blink); + } + if(out_strip) { + *out_strip = *in_strip; + out_strip->flink = NULL; + out_strip->parent = in_strip; + out_strip->refCnt = 1; + ++in_strip->refCnt; + } + return(out_strip); +} /* end clone_strip */ + + +/*------------------------------------------------------------------------ +---------------- Put strip on each receptor fed by an element ------------ +------------------------------------------------------------------------*/ +static bandMsk put_strip(flo,pet,strip) + floDefPtr flo; + peTexPtr pet; + stripPtr strip; +{ + peTexPtr dst; + inFloPtr inf; + bandPtr bnd; + stripPtr clone; + receptorPtr rcp; + CARD8 band = strip->format->band; + bandMsk repmsk, mask = 1<peDef->flags.export) { + pet->outFlo->ready |= mask; + /* + * give to DIXIE via our outFlo; if we're not first in line, make a clone + */ + if(!(clone = strip->flink ? clone_strip(flo,strip) : strip)) + AllocError(flo,pet->peDef, return(suspend)); + InsertMember(clone,pet->outFlo->output[band].blink); + ++flo->floTex->putCnt; + return(suspend); + } + /* hang this strip on the receptor of each of our interested recipients + */ + for(inf = pet->outFlo->outChain; inf; inf = inf->outChain) { + if(inf->format[band].class != strip->format->class) + continue; + dst = inf->ownDef->peTex; + rcp = &dst->receptor[inf->index]; + bnd = &rcp->band[band]; + + if(rcp->bypass & mask) { + suspend |= put_strip(flo,dst,strip); /* just passin' through */ + continue; + } else if(!(rcp->admit & mask)) { + continue; /* data not wanted here */ + } + if(strip->final && !(rcp->admit &= ~mask)) + --dst->admissionCnt; /* all bands complete */ + /* + * give the data to the intended receptor band + */ + for(repmsk = mask; repmsk <= rcp->active; ++bnd, repmsk <<= 1) { + if(rcp->active & repmsk) { + bnd->final = strip->final; + bnd->maxGlobal = strip->end + 1; + bnd->available += strip->length; + Schedule(flo,dst,rcp,bnd,repmsk); /* schedule if runnable */ + suspend |= dst->scheduled; + /* + * first recipient gets the original, all others get clones + */ + if(!(clone = strip->flink ? clone_strip(flo,strip) : strip)) + AllocError(flo,dst->peDef, break); + InsertMember(clone,bnd->stripLst.blink); + ++flo->floTex->putCnt; + } + /* see if we should replicate the data through the other bands + */ + if(!rcp->band[0].replicate) break; + } + } + return(suspend); +} /* end put_strip */ + + +/*------------------------------------------------------------------------ +------------ forward input data downstream (re-buffer if Xowner) -------- +------------ primarily used to pass compressed data to a photomap -------- +------------------------------------------------------------------------*/ +static void forward_strip(flo,pet,fwd) + floDefPtr flo; + peTexPtr pet; + stripPtr fwd; +{ + if(!pet->peDef->flags.putData) { + /* non-client data -- just pass it along + */ + fwd->flink = NULL; + put_strip(flo,pet,fwd); /* give to downstream receptors */ + if(!fwd->flink) + free_strip(flo,fwd); /* hmm, nobody wanted it */ + } else { + /* since this is client data we must copy it before passing it along + */ + stripLstPtr lst = &pet->outFlo->output[fwd->format->band]; + stripPtr tmp = ListEmpty(lst) ? NULL : lst->flink; + int maxlen = flo->floTex->stripSize, datlen; + int overlap = tmp ? tmp->end - fwd->start + 1 : 0; + int start = fwd->start + overlap; + int size = fwd->length - overlap; + CARD8 *data = &fwd->data[overlap]; + Bool final = FALSE; + + while(!final) { + if(ListEmpty(lst)) + if(tmp = make_strip(flo, fwd->format, start, 0, maxlen, TRUE)) { + InsertMember(tmp,lst->flink); + } else { + free_strip(flo,fwd); + AllocError(flo,pet->peDef, return); + } + if(size) { + datlen = min(size, tmp->bufSiz - tmp->length); + memcpy((char*)&tmp->data[tmp->length], (char*)data, (int)datlen); + tmp->length += datlen; + tmp->end += datlen; + data += datlen; + size -= datlen; + } + if(!size && fwd->final || tmp->length == tmp->bufSiz) { + RemoveMember(tmp,lst->flink); + start = tmp->start + tmp->length; + tmp->final = final = fwd->final && !size; + tmp->canonic = fwd->canonic; + tmp->flink = NULL; + put_strip(flo,pet,tmp); /* give to downstream receptors */ + if(!tmp->flink) + free_strip(flo,tmp); + } + if(!size) break; + } + free_strip(flo,fwd); + } +} /* end forward_strip */ + + +/*------------------------------------------------------------------------ +----------------------------- Get rid of a strip ------------------------- +------------------------------------------------------------------------*/ +static stripPtr free_strip(flo, strip) + floDefPtr flo; + stripPtr strip; +{ + lstPtr cache; + + if(strip && !--strip->refCnt) { + /* since this was the last reference we're going to nuke this strip, + * if this was a clone, free the parent and forget where the data was + */ + if(strip->parent) { + free_strip(flo, strip->parent); + strip->data = NULL; + } else if(strip->data) { + /* if the data buffer belongs to coreX or is uncachable, nuke it */ + if(strip->Xowner) + strip->data = NULL; + else if(!flo || !strip->cache) { + strip->data = (CARD8 *) XieFree(strip->data); + BYTES -= strip->bufSiz; /*DEBUG*/ + } + } + if(flo) { + /* strips with standard data buffers are cached at the front + * strips without data buffers go at the back + */ + strip->refCnt = 1; + strip->parent = NULL; + cache = (strip->data + ? (lstPtr)&flo->floTex->stripHead + : (lstPtr) flo->floTex->stripHead.blink); + InsertMember(strip,cache); + } else { + XieFree(strip); + --STRIPS; /*DEBUG*/ + } + } + return(NULL); +} /* end free_strip */ + +/* end module strip.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/export/Imakefile b/xie/xc/programs/Xserver/XIE/mixie/export/Imakefile new file mode 100644 index 0000000..a8e110c --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/export/Imakefile @@ -0,0 +1,33 @@ +XCOMM $XConsortium: Imakefile,v 1.5 94/01/12 20:07:25 rws Exp $ +XCOMM build device dependent machine independent export element objs +#include + +SRCS1 = meclut.c mecphoto.c medraw.c medrawp.c \ + mefax.c melut.c mephoto.c meuncomp.c schoice.c + +OBJS1 = meclut.o mecphoto.o medraw.o medrawp.o \ + mefax.o melut.o mephoto.o meuncomp.o schoice.o + +#if BuildDIS +DEFINES = -DXIE_DIS +#else +SRCS2 = mechist.c mecroi.c meroi.c mejpeg.c +OBJS2 = mechist.o mecroi.o meroi.o mejpeg.o +#endif + + SRCS = $(SRCS1) $(SRCS2) + + OBJS = $(OBJS1) $(OBJS2) + + INCLUDES = -I../include -I../../include -I$(SERVERSRC)/include -I$(INCLUDESRC) -I$(INCLUDESRC)/extensions -I../jpeg + LINTLIBS = ../../dixie/export/llib-lexp.ln ../../dixie/import/llib-limp.ln \ + ../../dixie/process/llib-lproc.ln ../../dixie/request/llib-lreq.ln \ + ../control/llib-lctrl.ln ../export/llib-lmexp.ln ../fax/llib-lfax.ln \ + ../import/llib-lmimp.ln ../jpeg/llib-ljpeg.ln ../process/llib-lmproc.ln + +SubdirLibraryRule($(OBJS)) +NormalLibraryObjectRule() +LintLibraryTarget(mexp,$(SRCS)) +NormalLintTarget($(SRCS)) + +DependTarget() diff --git a/xie/xc/programs/Xserver/XIE/mixie/export/mechist.c b/xie/xc/programs/Xserver/XIE/mixie/export/mechist.c new file mode 100644 index 0000000..97f83a0 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/export/mechist.c @@ -0,0 +1,373 @@ +/* $XConsortium: mechist.c,v 1.4 94/04/17 20:34:14 rws Exp $ */ +/**** module mechist.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mechist.c -- DDXIE export client histogram element + + Larry Hare -- AGE Logic, Inc. August, 1993 + +*****************************************************************************/ + +#define _XIEC_MECHIST +#define _XIEC_ECHIST + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +/* routines referenced by other DDXIE modules + */ +int miAnalyzeECHist(); + +/* routines used internal to this module + */ +static int CreateECHist(); +static int InitializeECHist(); +static int ActivateECHist(); +static int ResetECHist(); +static int DestroyECHist(); + +/* DDXIE ExportClientHist entry points + */ +static ddElemVecRec ECHistVec = { + CreateECHist, + InitializeECHist, + ActivateECHist, + (xieIntProc)NULL, + ResetECHist, + DestroyECHist + }; + +/* declarations for private structures and actions procs ... */ + +typedef struct { + pointer histdata; + CARD32 histsize; + void (*histproc) (); +} miECHistRec, *miECHistPtr; + +void doHistQ(), doHistP(), doHistB(), doHistb(); + + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeECHist(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* for now just stash our entry point vector in the peDef */ + ped->ddVec = ECHistVec; + + return TRUE; +} + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateECHist(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the photo element definition */ + + /* always force syncing between inputs (is nop if only one input) */ + return MakePETex(flo, ped, sizeof(miECHistRec), SYNC, NO_SYNC); +} + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeECHist(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloExportClientHistogram *raw = + (xieFloExportClientHistogram *)ped->elemRaw; + peTexPtr pet = ped->peTex; + receptorPtr rcp = pet->receptor; + miECHistPtr pvt = (miECHistPtr)(pet->private); + bandPtr iband; + CARD32 nclip; + + iband = &(pet->receptor[SRCtag].band[0]); + + switch (iband->format->class) { + case QUAD_PIXEL: pvt->histproc = doHistQ; + break; + case PAIR_PIXEL: pvt->histproc = doHistP; + break; + case BYTE_PIXEL: pvt->histproc = doHistB; + break; + case BIT_PIXEL: pvt->histproc = doHistb; + break; + default: ImplementationError(flo, ped, return(FALSE)); + } + + SetDepthFromLevels(iband->format->levels, nclip); + pvt->histsize = nclip = 1 << nclip; + + if (!(pvt->histdata = (pointer ) XieCalloc(nclip * sizeof(CARD32)))) + AllocError(flo,ped,return(FALSE)); + + return InitReceptor(flo,ped,&rcp[SRCt1],NO_DATAMAP,1,1,NO_BANDS) && + InitProcDomain(flo, ped, raw->domainPhototag, + raw->domainOffsetX, raw->domainOffsetY) && + InitEmitter(flo,ped,NO_DATAMAP,NO_INPLACE); +} + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateECHist(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloExportClientHistogram *raw = + (xieFloExportClientHistogram *)ped->elemRaw; + miECHistPtr pvt = (miECHistPtr)(pet->private); + receptorPtr rcp = pet->receptor; + bandPtr sbnd = &rcp->band[0]; + bandPtr dbnd = &pet->emitter[0]; + pointer src; + + src = GetCurrentSrc(flo,pet,sbnd); + while(src && SyncDomain(flo,ped,sbnd,FLUSH)) { + INT32 x = 0, dx; + while (dx = GetRun(flo,pet,sbnd)) { + if (dx > 0) { + (*(pvt->histproc)) (src,pvt->histdata,pvt->histsize,x,dx); + x += dx; + } else + x -= dx; + } + src = GetNextSrc(flo,pet,sbnd,FLUSH); + } + FreeData(flo,pet,sbnd,sbnd->current); + + /* if finished with accumulation, send back to client */ + if (!src && sbnd->final) { + CARD32 *hist; + CARD32 ilev, nlev = sbnd->format->levels; + CARD32 nhist = 0; + xieTypHistogramData *histpair; + + /* Count populated cells */ + for (ilev = 0, hist = (CARD32*)pvt->histdata; ilev < nlev; ilev++, hist++) + if (*hist) + nhist++; + + if(nhist) { + if(!(histpair = (xieTypHistogramData*)GetDstBytes(flo,pet,dbnd,0, + nhist * sizeof(xieTypHistogramData),KEEP))) + return FALSE; + + for (ilev = 0, hist = (CARD32*)pvt->histdata; ilev < nlev; ilev++, hist++) + if (*hist) { + histpair->count = *hist; + histpair->value = ilev; + histpair++; + } + SetBandFinal(dbnd); + PutData(flo,pet,dbnd, nhist * sizeof(xieTypHistogramData)); + } else { + /* signal that there is no data to send + */ + DisableDst(flo,pet,dbnd); + } + switch(raw->notify) { + case xieValFirstData: /* fall thru */ + case xieValNewData: SendExportAvailableEvent(flo,ped, + 0, /* band */ + nhist, /* count */ + 0,0); /* unused */ + default: break; + } + } + return TRUE; +} + + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetECHist(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + miECHistPtr pvt = (miECHistPtr) ped->peTex->private; + + /* free any dynamic private data */ + if (pvt->histdata) + pvt->histdata = (pointer ) XieFree(pvt->histdata); + + ResetReceptors(ped); + ResetEmitter(ped); + + return TRUE; +} + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyECHist(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.activate = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + + return TRUE; +} + + +/*------------------------------------------------------------------------ +------------------------ action procs to do histogram -------------------- +------------------------------------------------------------------------*/ + +void doHistQ(svoid,hist,clip,x,dx) + pointer svoid; + CARD32 *hist, clip, x, dx; +{ + QuadPixel *src = (QuadPixel *) svoid; + + for ( src += x, clip -= 1; dx > 0 ; dx--) + hist[*src++ & clip]++; +} + +void doHistP(svoid,hist,clip,x,dx) + pointer svoid; + CARD32 *hist, clip, x, dx; +{ + PairPixel *src = (PairPixel *) svoid; + + for ( src += x, clip -= 1; dx > 0 ; dx--) + hist[*src++ & clip]++; +} + +void doHistB(svoid,hist,clip,x,dx) + pointer svoid; + CARD32 *hist, clip, x, dx; +{ + BytePixel *src = (BytePixel *) svoid; + + for ( src += x, clip -= 1; dx > 0 ; dx--) + hist[*src++ & clip]++; /* could pad to 256 .. */ +} + +void doHistb(svoid,hist,clip,x,dx) + pointer svoid; + CARD32 *hist, clip, x, dx; +{ + LogInt *src = (LogInt *) svoid; + CARD32 cnt0 = 0, cnt1 = 0; + + /* does anyone actually do bit histograms? :-) */ + for ( ; dx > 0 ; dx--, x++) + if (LOG_tstbit(src,x)) + cnt1++; + else + cnt0++; + + hist[0] += cnt0; + hist[1] += cnt1; +} + +/* end module mechist.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/export/meclut.c b/xie/xc/programs/Xserver/XIE/mixie/export/meclut.c new file mode 100644 index 0000000..ab7aeee --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/export/meclut.c @@ -0,0 +1,250 @@ +/* $XConsortium: meclut.c,v 1.6 94/04/17 20:34:15 rws Exp $ */ +/**** module meclut.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + meclut.c -- DDXIE export client LUT element + + Larry Hare -- AGE Logic, Inc. July, 1993 + +*****************************************************************************/ + +#define _XIEC_MECLUT +#define _XIEC_ECLUT + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +/* routines referenced by other DDXIE modules + */ +int miAnalyzeECLUT(); + +/* routines used internal to this module + */ +static int CreateECLUT(); +static int InitializeECLUT(); +static int ActivateECLUT(); +static int ResetECLUT(); +static int DestroyECLUT(); + +/* DDXIE ExportClientLUT entry points + */ +static ddElemVecRec ECLUTVec = { + CreateECLUT, + InitializeECLUT, + ActivateECLUT, + (xieIntProc)NULL, + ResetECLUT, + DestroyECLUT + }; + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeECLUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* for now just stash our entry point vector in the peDef */ + ped->ddVec = ECLUTVec; + + return(TRUE); +} /* end miAnalyzeECLUT */ + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateECLUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the photo element definition */ + return MakePETex(flo, ped, NO_PRIVATE, NO_SYNC, NO_SYNC); +} /* end CreateECLUT */ + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeECLUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + return InitReceptors(flo,ped,NO_DATAMAP,1) && + InitEmitter(flo,ped,NO_DATAMAP,NO_INPLACE); +} /* end InitializeECLUT */ + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateECLUT(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloExportClientLUT *raw = (xieFloExportClientLUT *)ped->elemRaw; + receptorPtr rcp = pet->receptor; + CARD32 bands = rcp->inFlo->bands; + bandPtr dbnd, sbnd = &rcp->band[0]; + CARD32 *start = &(raw->start0); + CARD32 *length = &(raw->length0); + CARD8 *src, *dst; + CARD32 b, pitch, nentry, dlen; + Bool swizzle; + + swizzle = (bands == 3) && (raw->bandOrder != xieValLSFirst); + + for(b = 0; b < bands; ++sbnd, ++b) { + + if (!(src = (CARD8*)GetCurrentSrc(flo,pet,sbnd))) continue; + + dbnd = &pet->emitter[swizzle ? xieValMaxBands - b - 1 : b]; + + nentry = length[b] ? length[b] : sbnd->format->height; + pitch = LutPitch(sbnd->format->levels); + dlen = nentry * pitch; + + if (!(dst = (CARD8*)GetDstBytes(flo,pet,dbnd,dbnd->current,dlen,KEEP))) + return FALSE; + + if (start[b]) + src += start[b] * pitch; /* Adjust via start[b] && length[b] */ + + memcpy(dst,src,dlen); + + SetBandFinal(dbnd); + PutData(flo,pet,dbnd,dbnd->maxGlobal); + + FreeData(flo,pet,sbnd,sbnd->maxLocal); + + switch(raw->notify) { + case xieValFirstData: /* fall thru */ + case xieValNewData: SendExportAvailableEvent(flo,ped,b,nentry,0,0); + default: break; + } + } + return(TRUE); +} /* end ActivateECLUT */ + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetECLUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ResetReceptors(ped); + ResetEmitter(ped); + + return(TRUE); +} /* end ResetECLUT */ + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyECLUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.activate = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + + return(TRUE); +} /* end DestroyECLUT */ + +/* end module meclut.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/export/mecphoto.c b/xie/xc/programs/Xserver/XIE/mixie/export/mecphoto.c new file mode 100644 index 0000000..715d117 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/export/mecphoto.c @@ -0,0 +1,853 @@ +/* $XConsortium: mecphoto.c,v 1.9 94/04/17 20:34:15 dpw Exp $ */ +/**** module mecphoto.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mecphoto.c -- DDXIE export client photo element + + Robert NC Shelley && Dean Verheiden -- AGE Logic, Inc. June, 1993 + +*****************************************************************************/ +#define _XIEC_MECPHOTO +#define _XIEC_ECPHOTO +#define _XIEC_EPHOTO + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include +#include + +/* routines referenced by other DDXIE modules + */ +int miAnalyzeECPhoto(); + +/* routines used internal to this module + */ +static int CreateECPhotoUncomByPlane(); +static int InitializeECPhotoStream(); +static int InitializeECPhotoUncomByPlane(); +static int ActivateECPhotoUncomByPlane(); +static int ActivateECPhotoStream(); +static int ResetECPhoto(); +static int DestroyECPhotoUn(); + +#if XIE_FULL +static int CreateECPhotoUncomByPixel(); +static int InitializeECPhotoUncomByPixel(); +static int ActivateECPhotoUncomByPixel(); +#endif /* XIE_FULL */ + +/* + * routines we need from somewhere else + */ + +extern int InitializeECPhotoFAX(); +/* note: all the other Fax EC entry points are shared with EphotoFAX */ + +extern int CreateEPhotoFAX(); +extern int ActivateEPhotoFAX(); +extern int ResetEPhotoFAX(); +extern int DestroyEPhotoFAX(); + +extern int InitializeECPhotoJPEGBaseline(); +/* note: all the other EC entry points are shared with EphotoJPEGBaseline */ + +extern int CreateEPhotoJPEGBaseline(); +extern int ActivateEPhotoJPEGBaseline(); +extern int ResetEPhotoJPEGBaseline(); +extern int DestroyEPhotoJPEGBaseline(); + +/* + * DDXIE ExportClientPhoto entry points + */ +static ddElemVecRec ECPhotoUncomByPlaneVec = { + CreateECPhotoUncomByPlane, + InitializeECPhotoUncomByPlane, + ActivateECPhotoUncomByPlane, + (xieIntProc)NULL, + ResetECPhoto, + DestroyECPhotoUn + }; + +static ddElemVecRec ECPhotoStreamVec = { + CreateECPhotoUncomByPlane, + InitializeECPhotoStream, + ActivateECPhotoStream, + (xieIntProc)NULL, + ResetECPhoto, + DestroyECPhotoUn + }; + +static ddElemVecRec ECPhotoFAXVec = { + CreateEPhotoFAX, + InitializeECPhotoFAX, /* only this can't be shared */ + ActivateEPhotoFAX, + (xieIntProc)NULL, + ResetEPhotoFAX, + DestroyEPhotoFAX + }; + +#if XIE_FULL +static ddElemVecRec ECPhotoUncomByPixelVec = { + CreateECPhotoUncomByPixel, + InitializeECPhotoUncomByPixel, + ActivateECPhotoUncomByPixel, + (xieIntProc)NULL, + ResetECPhoto, + DestroyECPhotoUn + }; + +static ddElemVecRec ECPhotoJPEGBaselineVec = { + CreateEPhotoJPEGBaseline, + InitializeECPhotoJPEGBaseline, /* only this can't be shared */ + ActivateEPhotoJPEGBaseline, + (xieIntProc)NULL, + ResetEPhotoJPEGBaseline, + DestroyEPhotoJPEGBaseline + }; + +#endif /* XIE_FULL */ + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeECPhoto(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ePhotoDefPtr pvt = (ePhotoDefPtr)ped->elemPvt; + + if(pvt->congress) { + ped->ddVec = ECPhotoStreamVec; + return(TRUE); + } + switch(pvt->encodeNumber) { + case xieValEncodeUncompressedSingle: + ped->ddVec = ECPhotoUncomByPlaneVec; + break; + + case xieValEncodeG31D: + case xieValEncodeG32D: + case xieValEncodeG42D: + case xieValEncodeTIFF2: + case xieValEncodeTIFFPackBits: + ped->ddVec = ECPhotoFAXVec; + break; + +#if XIE_FULL + case xieValEncodeUncompressedTriple: + { + xieTecEncodeUncompressedTriple *tecParms = + (xieTecEncodeUncompressedTriple *)pvt->encodeParms; + + switch(tecParms->interleave) { + case xieValBandByPlane: + ped->ddVec = ECPhotoUncomByPlaneVec; + break; + + case xieValBandByPixel: + ped->ddVec = ECPhotoUncomByPixelVec; + break; + } /* end switch on interleave */ + break; + } + + case xieValEncodeJPEGBaseline: + { + /*** JPEG for SI can only handle 8 bit image depths ***/ + inFloPtr inf = &ped->inFloLst[IMPORT]; + outFloPtr src = &inf->srcDef->outFlo; + int b; + for (b=0; b< src->bands; ++b) + if (src->format[b].depth != 8) { + xieFloExportClientPhoto *raw = + (xieFloExportClientPhoto *)ped->elemRaw; + + TechniqueError(flo,ped,xieValEncode,raw->encodeTechnique, + raw->lenParams,return(FALSE)); + } + } + ped->ddVec = ECPhotoJPEGBaselineVec; + break; +#endif /* XIE_FULL */ + default: + ImplementationError(flo,ped, return(FALSE)); + } + return(TRUE); +} /* end meAnalyzeECPhoto */ + + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateECPhotoUncomByPlane(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the photo element definition */ + return(MakePETex(flo, ped, xieValMaxBands * sizeof(meUncompRec), NO_SYNC, + NO_SYNC)); +} /* end CreateECPhoto */ + + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeECPhotoUncomByPlane(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + formatPtr inf = ped->inFloLst[SRCtag].format; + meUncompPtr pvt = (meUncompPtr)pet->private; + CARD32 nbands = ped->outFlo.bands, b, s; + xieTypOrientation pixelOrder, fillOrder; + + if (nbands == 1) { + xieTecEncodeUncompressedSingle *tecParms = + (xieTecEncodeUncompressedSingle *) + ((ePhotoDefPtr)ped->elemPvt)->encodeParms; + + pixelOrder = tecParms->pixelOrder; + fillOrder = tecParms->fillOrder; + pvt[0].bandMap = 0; + } else { + xieTecEncodeUncompressedTriple *tecParms = + (xieTecEncodeUncompressedTriple *) + ((ePhotoDefPtr)ped->elemPvt)->encodeParms; + + pixelOrder = tecParms->pixelOrder; + fillOrder = tecParms->fillOrder; + if (tecParms->bandOrder == xieValLSFirst) + for(b = 0; b < xieValMaxBands; ++b) + pvt[b].bandMap = b; + else + for(s = 0, b = xieValMaxBands; b--; ++s) + pvt[s].bandMap = b; + } + + for (b = 0; b < nbands; b++, pvt++, inf++) { + formatPtr outf = &ped->outFlo.format[pvt->bandMap]; + CARD8 class = inf->class; + if (class == BIT_PIXEL) { + pvt->width = inf->width; +#if (IMAGE_BYTE_ORDER == MSBFirst) + if (outf->stride != 1) { + pvt->action = (fillOrder == xieValMSFirst) ? btoIS: sbtoIS; + } else { + pvt->action = (fillOrder == xieValMSFirst) ? btoS : sbtoS; + } +#else + if (outf->stride != 1) { + pvt->action = (fillOrder == xieValLSFirst) ? btoIS: sbtoIS; + } else { + pvt->action = (fillOrder == xieValLSFirst) ? btoS : sbtoS; + } +#endif + pvt->stride = outf->stride; + pvt->pitch = outf->pitch; + } else if (class == BYTE_PIXEL) { + pvt->width = inf->width; + if (!(outf->stride & 7)) { + if (outf->stride == 8) + pvt->action = BtoS; + else + pvt->action = BtoIS; + pvt->Bstride = outf->stride >> 3; + pvt->dstoffset = 0; + pvt->mask = 0; /* Unused */ + pvt->shift = 0; /* Unused */ + pvt->clear_dst = FALSE; + } else { + if (pixelOrder == xieValLSFirst) { + if (fillOrder == xieValLSFirst) + pvt->action = BtoLLUB; + else + pvt->action = BtoLMUB; + } else { + if (fillOrder == xieValLSFirst) + pvt->action = BtoMLUB; + else + pvt->action = BtoMMUB; + } + pvt->bitOff = 0; /* Bit offset to first pixel on line */ + pvt->leftOver = 0; /* Left over bits from last line */ + pvt->depth = inf->depth; + pvt->stride = outf->stride; + pvt->pitch = outf->pitch; + } + } else if (class == PAIR_PIXEL) { + pvt->width = inf->width; + if (!(outf->stride & 15)) { +#if (IMAGE_BYTE_ORDER == LSBFirst) + if (outf->stride == 16) + pvt->action = (fillOrder == xieValLSFirst) ? PtoS : sPtoS; + else + pvt->action = (fillOrder == xieValLSFirst) ? PtoIS: sPtoIS; +#else + if (outf->stride == 16) + pvt->action = (fillOrder == xieValMSFirst) ? PtoS : sPtoS; + else + pvt->action = (fillOrder == xieValMSFirst) ? PtoIS: sPtoIS; +#endif + pvt->Bstride = outf->stride >> 3; + pvt->dstoffset = 0; + pvt->mask = 0; /* Unused */ + pvt->shift = 0; /* Unused */ + pvt->clear_dst = FALSE; + } else { + if (pixelOrder == xieValLSFirst) { + if (fillOrder == xieValLSFirst) + pvt->action = PtoLLUP; + else + pvt->action = PtoLMUP; + } else { + if (fillOrder == xieValLSFirst) + pvt->action = PtoMLUP; + else + pvt->action = PtoMMUP; + } + pvt->bitOff = 0; /* Bit offset to first pixel on line */ + pvt->leftOver = 0; /* Left over bits from last line */ + pvt->depth = inf->depth; + pvt->stride = outf->stride; + pvt->pitch = outf->pitch; + } + } else if (class == QUAD_PIXEL) { + pvt->width = inf->width; + if (!(outf->stride & 31)) { +#if (IMAGE_BYTE_ORDER == LSBFirst) + if (outf->stride == 32) + pvt->action = (fillOrder == xieValLSFirst) ? QtoS : sQtoS; + else + pvt->action = (fillOrder == xieValLSFirst) ? QtoIS: sQtoIS; +#else + if (outf->stride == 32) + pvt->action = (fillOrder == xieValMSFirst) ? QtoS : sQtoS; + else + pvt->action = (fillOrder == xieValMSFirst) ? QtoIS: sQtoIS; +#endif + pvt->Bstride = outf->stride >> 3; + pvt->dstoffset = 0; + pvt->mask = 0; /* Unused */ + pvt->shift = 0; /* Unused */ + pvt->clear_dst = FALSE; + } else { + if (pixelOrder == xieValLSFirst) { + if (fillOrder == xieValLSFirst) + pvt->action = QtoLLUQ; + else + pvt->action = QtoLMUQ; + } else { + if (fillOrder == xieValLSFirst) + pvt->action = QtoMLUQ; + else + pvt->action = QtoMMUQ; + } + } + } else + ImplementationError(flo,ped, return(FALSE)); + + } + + pet->bandSync = NO_SYNC; + + return(InitReceptors(flo, ped, NO_DATAMAP, 1) && + InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE)); +} /* end InitializeEPhotoUncomByPlane */ + + +static int InitializeECPhotoStream(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + return(InitReceptors(flo, ped, NO_DATAMAP, 1) && + InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE)); +} /* end InitializeECPhotoStream */ + + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateECPhotoUncomByPlane(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloExportClientPhoto *raw = (xieFloExportClientPhoto*)ped->elemRaw; + meUncompPtr pvt = (meUncompPtr)pet->private; + receptorPtr rcp = pet->receptor; + CARD32 bands = rcp->inFlo->bands; + bandPtr sbnd = rcp->band,dbnd; + bandMsk ready = ped->outFlo.ready; + CARD32 b, d, olen, nlen, pitch; + pointer src, dst; + + for(b = 0; b < bands; ++sbnd, ++dbnd, ++b, ++pvt) { + d = pvt->bandMap; + dbnd = &pet->emitter[d]; + pitch = dbnd->format->pitch; + nlen = pvt->bitOff + pitch + 7 >> 3; + src = GetCurrentSrc(flo,pet,sbnd); + dst = GetDstBytes(flo,pet,dbnd,dbnd->current,nlen,KEEP); + + while(src && dst) { + + (*pvt->action)(src,dst,pvt); + + pvt->bitOff = pvt->bitOff + pitch & 7; + olen = pvt->bitOff ? nlen - 1 : nlen; + nlen = pvt->bitOff + pitch + 7 >> 3; + src = GetNextSrc(flo,pet,sbnd,FLUSH); + dst = GetDstBytes(flo,pet,dbnd,dbnd->current+olen,nlen,KEEP); + } + FreeData(flo,pet,sbnd,sbnd->current); + if(!src && sbnd->final) { + if(pvt->bitOff) /* If we have any bits left, send them out now */ + *(CARD8*)GetDstBytes(flo,pet,dbnd,dbnd->current,1,KEEP)=pvt->leftOver; + SetBandFinal(dbnd); + PutData(flo,pet,dbnd,dbnd->maxGlobal); /* write the remaining data */ + } + + if(~ready & ped->outFlo.ready & 1<notify == xieValNewData || + raw->notify == xieValFirstData && !ped->outFlo.output[d].flink->start)) + SendExportAvailableEvent(flo,ped,d,0,0,0); + } + return(TRUE); +} /* end ActivateECPhotoUncomByPlane */ + + +static int ActivateECPhotoStream(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloExportClientPhoto *raw = (xieFloExportClientPhoto*)ped->elemRaw; + bandPtr sbnd = pet->receptor[SRCtag].band; + bandPtr dbnd = pet->emitter; + outFloPtr oflo = &ped->outFlo; + CARD32 nbands = oflo->bands; + bandMsk ready = oflo->ready; + CARD32 b; + + for(b = 0; b < nbands; ++sbnd, ++dbnd, ++b) { + if(!(pet->scheduled & 1<strip)) + return(FALSE); + + FreeData(flo,pet,sbnd,sbnd->maxLocal); + } + /* if it's appropriate, send an event + */ + if(~ready & oflo->ready & 1<notify == xieValNewData || + raw->notify == xieValFirstData && !oflo->output[b].flink->start)) + SendExportAvailableEvent(flo,ped,b,0,0,0); + } + return(TRUE); +} /* end ActivateECPhotoStream */ + + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetECPhoto(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + meUncompPtr pvt = (meUncompPtr)ped->peTex->private; + int i; + + for(i = 0; i < xieValMaxBands; ++i) + if(pvt[i].buf) pvt[i].buf = (pointer) XieFree(pvt[i].buf); + + ResetReceptors(ped); + ResetEmitter(ped); + + return(TRUE); +} /* end ResetECPhoto */ + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyECPhotoUn(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.activate = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + + return(TRUE); +} /* end DestroyECPhotoUn */ + + +#if XIE_FULL +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateECPhotoUncomByPixel(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the photo element definition */ + return(MakePETex(flo, ped, xieValMaxBands * sizeof(meUncompRec), NO_SYNC, + SYNC)); +} /* end CreateECPhoto */ + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeECPhotoUncomByPixel(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + meUncompPtr pvt = (meUncompPtr)pet->private; + formatPtr outf = pet->emitter[0].format; + xieTecEncodeUncompressedTriple *tec = + (xieTecEncodeUncompressedTriple *) + ((ePhotoDefPtr)ped->elemPvt)->encodeParms; + bandPtr sbnd1,sbnd2,sbnd3; + CARD32 depth1,depth2,depth3,dstride,width; + int s, d; + + pvt->unaligned = (tec->pixelStride[0] & 7) != 0; + + if(tec->bandOrder == xieValLSFirst) + for(d = 0; d < xieValMaxBands; ++d) + pvt[d].bandMap = d; + else + for(s = 0, d = xieValMaxBands; d--; ++s) + pvt[s].bandMap = d; + + sbnd1 = &pet->receptor[SRCtag].band[pvt[0].bandMap]; + sbnd2 = &pet->receptor[SRCtag].band[pvt[1].bandMap]; + sbnd3 = &pet->receptor[SRCtag].band[pvt[2].bandMap]; + depth1 = sbnd1->format->depth; + depth2 = sbnd2->format->depth; + depth3 = sbnd3->format->depth; + width = sbnd1->format->width; + dstride = tec->pixelStride[0]>>3; + + if (!pvt->unaligned) { + /* First, look for special cases */ + if (depth1 == 16 && depth2 == 16 && depth3 == 16) { +#if (IMAGE_BYTE_ORDER == MSBFirst) + void (*pa)() = (tec->pixelOrder == xieValMSFirst) ? PtoIS : sPtoIS; +#else + void (*pa)() = (tec->pixelOrder == xieValMSFirst) ? sPtoIS : PtoIS; +#endif + for(s = 0; s < xieValMaxBands; s++, pvt++) { + pvt->action = pa; + pvt->width = width; + pvt->Bstride = dstride; + pvt->dstoffset = s; + pvt->mask = 0; /* Unused */ + pvt->shift = 0; /* Unused */ + pvt->clear_dst = FALSE; + } + } else if (depth1 == 8 && depth2 == 8 && depth3 == 8) { + for(s = 0; s < xieValMaxBands; s++, pvt++) { + pvt->action = BtoIS; + pvt->width = width; + pvt->Bstride = dstride; + pvt->dstoffset = s; + pvt->mask = 0; /* Unused */ + pvt->shift = 0; /* Unused */ + pvt->clear_dst = FALSE; + } + } else if (depth1 == 4 && depth2 == 4 && depth3 == 4) { + if (tec->fillOrder == xieValMSFirst) { + pvt->action = BtoISb; + pvt->width = width; + pvt->Bstride = dstride; + pvt->dstoffset = 0; + pvt->mask = 0xf0; + pvt->clear_dst = FALSE; + (pvt++)->shift = 4; + pvt->action = BtoISb; + pvt->width = width; + pvt->Bstride = dstride; + pvt->dstoffset = 0; + pvt->mask = 0x0f; + pvt->clear_dst = FALSE; + (pvt++)->shift = 0; + pvt->action = BtoISb; + pvt->width = width; + pvt->Bstride = dstride; + pvt->dstoffset = 1; + pvt->mask = 0xf0; + pvt->clear_dst = FALSE; + pvt->shift = 4; + } else { /* xieValLSFirst */ + pvt->action = BtoISb; + pvt->width = width; + pvt->Bstride = dstride; + pvt->dstoffset = 0; + pvt->clear_dst = FALSE; + pvt->mask = 0x0f; + (pvt++)->shift = 0; + pvt->action = BtoISb; + pvt->width = width; + pvt->Bstride = dstride; + pvt->dstoffset = 0; + pvt->mask = 0xf0; + pvt->clear_dst = FALSE; + (pvt++)->shift = 4; + pvt->action = BtoISb; + pvt->width = width; + pvt->Bstride = dstride; + pvt->dstoffset = 1; + pvt->mask = 0x0f; + pvt->clear_dst = FALSE; + pvt->shift = 0; + } + } else if (depth1 + depth2 + depth3 <= 8) { + CARD8 ones = 0xff,smask1,smask2,smask3,shift1,shift2,shift3; + if (tec->fillOrder == xieValMSFirst) { + smask1 = ~(ones>>depth1); + smask2 = ~(ones>>(depth1 + depth2) | smask1); + smask3 = ~(ones>>(depth1 + depth2 + depth3) | smask1 | smask2); + shift1 = 8 - depth1; + shift2 = 8 - (depth1 + depth2); + shift3 = 8 - (depth1 + depth2 + depth3); + } else { /* fillOrder == xieValLSFirst */ + smask3 = ~(ones<action = (depth1 > 1) ? BtoISb : btoISb; + pvt->width = width; + pvt->Bstride = dstride; + pvt->dstoffset = 0; + pvt->mask = smask1; + pvt->clear_dst = TRUE; + (pvt++)->shift = shift1; + pvt->action = (depth2 > 1) ? BtoISb : btoISb; + pvt->width = width; + pvt->Bstride = dstride; + pvt->dstoffset = 0; + pvt->mask = smask2; + pvt->clear_dst = TRUE; + (pvt++)->shift = shift2; + pvt->action = (depth3 > 1) ? BtoISb : btoISb; + pvt->width = width; + pvt->Bstride = dstride; + pvt->dstoffset = 0; + pvt->mask = smask3; + pvt->clear_dst = TRUE; + pvt->shift = shift3; + } else + pvt->unaligned = TRUE; + } + pvt = (meUncompPtr)pet->private; + if ( pvt->unaligned ) { + pvt[0].pitch = outf->pitch; + pvt[0].width = sbnd1->format->width; + pvt[0].depth = depth1; + pvt[1].depth = depth2; + pvt[2].depth = depth3; + pvt->action = EncodeTripleFuncs[tec->pixelOrder == xieValLSFirst ? 0 : 1] + [tec->fillOrder == xieValLSFirst ? 0 : 1] + [depth1 <= 8 ? 0 : 1] + [depth2 <= 8 ? 0 : 1] + [depth3 <= 8 ? 0 : 1]; + if(depth1 == 1 && !(pvt[0].buf = (pointer)XieMalloc(pvt[0].width+7)) || + depth2 == 1 && !(pvt[1].buf = (pointer)XieMalloc(pvt[1].width+7)) || + depth3 == 1 && !(pvt[2].buf = (pointer)XieMalloc(pvt[2].width+7))) + AllocError(flo,ped, return(FALSE)); + } + + pet->bandSync = SYNC; + + return(InitReceptors(flo, ped, NO_DATAMAP, 1) && + InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE)); +} /* end InitializeECPhotoUnTriple */ + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateECPhotoUncomByPixel(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloExportClientPhoto *raw = (xieFloExportClientPhoto*)ped->elemRaw; + meUncompPtr pvt = (meUncompPtr)pet->private; + bandPtr sb0 = &pet->receptor[SRCtag].band[pvt[0].bandMap]; + bandPtr sb1 = &pet->receptor[SRCtag].band[pvt[1].bandMap]; + bandPtr sb2 = &pet->receptor[SRCtag].band[pvt[2].bandMap]; + bandPtr dbnd = &pet->emitter[0]; + CARD32 pitch = dbnd->format->pitch; + bandMsk ready = ped->outFlo.ready; + pointer dst, sp0 = (pointer)NULL, sp1 = (pointer)NULL, sp2 = (pointer)NULL; + + if (pvt->unaligned) { + CARD32 stride = dbnd->format->stride; + CARD32 width = dbnd->format->width; + CARD32 nextdlen = pvt->bitOff + pitch + 7 >> 3, olddlen; + if((sp0 = GetCurrentSrc(flo,pet,sb0)) && + (sp1 = GetCurrentSrc(flo,pet,sb1)) && + (sp2 = GetCurrentSrc(flo,pet,sb2)) && + (dst = GetDstBytes(flo,pet,dbnd,dbnd->current,nextdlen,KEEP))) + do { + if(pvt[0].buf) sp0 = bitexpand(sp0,pvt[0].buf,width,(char)0,(char)1); + if(pvt[1].buf) sp1 = bitexpand(sp1,pvt[1].buf,width,(char)0,(char)1); + if(pvt[2].buf) sp2 = bitexpand(sp2,pvt[2].buf,width,(char)0,(char)1); + + (*pvt->action)(sp0,sp1,sp2,dst,stride,pvt); + + sp0 = GetNextSrc(flo,pet,sb0,FLUSH); + sp1 = GetNextSrc(flo,pet,sb1,FLUSH); + sp2 = GetNextSrc(flo,pet,sb2,FLUSH); + pvt->bitOff = pvt->bitOff + pitch & 7; /* Set next */ + olddlen = (pvt->bitOff) ? nextdlen - 1 : nextdlen; + nextdlen = pvt->bitOff + pitch + 7 >> 3; + dst = GetDstBytes(flo,pet,dbnd,dbnd->current+olddlen, + nextdlen,KEEP); + } while(dst && sp0 && sp1 && sp2); + } else { + CARD32 dlen = pitch >> 3; /* For nicely aligned data */ + if((sp0 = GetCurrentSrc(flo,pet,sb0)) && + (sp1 = GetCurrentSrc(flo,pet,sb1)) && + (sp2 = GetCurrentSrc(flo,pet,sb2)) && + (dst = GetDstBytes(flo,pet,dbnd,dbnd->current,dlen,KEEP))) + do { + + if (pvt[0].clear_dst) bzero(dst,(int)dlen); + + (*pvt[0].action)(sp0,dst,&pvt[0]); + (*pvt[1].action)(sp1,dst,&pvt[1]); + (*pvt[2].action)(sp2,dst,&pvt[2]); + + sp0 = GetNextSrc(flo,pet,sb0,FLUSH); + sp1 = GetNextSrc(flo,pet,sb1,FLUSH); + sp2 = GetNextSrc(flo,pet,sb2,FLUSH); + dst = GetDstBytes(flo,pet,dbnd,dbnd->current+dlen,dlen,KEEP); + } while(dst && sp0 && sp1 && sp2); + } + + FreeData(flo,pet,sb0,sb0->current); + FreeData(flo,pet,sb1,sb1->current); + FreeData(flo,pet,sb2,sb2->current); + if(!sp0 && sb0->final && !sp1 && sb1->final && !sp2 && sb2->final) { + if (pvt->bitOff) /* If we have any bits left, send them out now */ + *(CARD8*)GetDstBytes(flo,pet,dbnd,dbnd->current,1,KEEP) = pvt->leftOver; + SetBandFinal(dbnd); + PutData(flo,pet,dbnd,dbnd->maxGlobal); /* write the remaining data */ + } + + if(~ready & ped->outFlo.ready & 1 && + (raw->notify == xieValNewData || + raw->notify == xieValFirstData && !ped->outFlo.output[0].flink->start)) + SendExportAvailableEvent(flo,ped,0,0,0,0); + + return(TRUE); +} /* end ActivateECPhotoUncomByPixel */ +#endif + +/* end module mecphoto.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/export/mecroi.c b/xie/xc/programs/Xserver/XIE/mixie/export/mecroi.c new file mode 100644 index 0000000..c7073b9 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/export/mecroi.c @@ -0,0 +1,264 @@ +/* $XConsortium: mecroi.c,v 1.5 94/04/17 20:34:16 rws Exp $ */ +/**** module mecroi.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mecroi.c -- DDXIE export client roi element + + Larry Hare && Dean Verheiden -- AGE Logic, Inc. August, 1993 + +*****************************************************************************/ + +#define _XIEC_MECROI +#define _XIEC_ECROI + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include + + +/* routines referenced by other DDXIE modules + */ +int miAnalyzeECROI(); + +/* routines used internal to this module + */ +static int CreateECROI(); +static int InitializeECROI(); +static int ActivateECROI(); +static int ResetECROI(); +static int DestroyECROI(); + +/* DDXIE ExportClientROI entry points + */ +static ddElemVecRec ECROIVec = +{ + CreateECROI, + InitializeECROI, + ActivateECROI, + (xieIntProc)NULL, + ResetECROI, + DestroyECROI +}; + +/* Local routines */ +static void ConvertToRect(); + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeECROI(flo,ped) +floDefPtr flo; +peDefPtr ped; +{ + /* for now just stash our entry point vector in the peDef */ + ped->ddVec = ECROIVec; + return TRUE; +} /* end miAnalyzeECROI */ + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateECROI(flo,ped) +floDefPtr flo; +peDefPtr ped; +{ + /* attach an execution context to the roi element definition */ + return MakePETex(flo, ped, NO_PRIVATE, NO_SYNC, NO_SYNC); +} /* end CreateECROI */ + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeECROI(flo,ped) +floDefPtr flo; +peDefPtr ped; +{ + return InitReceptors(flo,ped,NO_DATAMAP,1) && + InitEmitter(flo,ped,NO_DATAMAP,NO_INPLACE); +} /* end InitializeECROI */ + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateECROI(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloExportClientROI *raw = (xieFloExportClientROI*)ped->elemRaw; + receptorPtr rcp = pet->receptor; + bandPtr sbnd = &rcp->band[0]; + bandPtr dbnd = &pet->emitter[0]; + CARD32 rectSize; + xieTypRectangle *prect; + ROIPtr proi; + + if (!(proi = (ROIRec*)GetCurrentSrc(flo,pet,sbnd))) + return FALSE; + + rectSize = sizeof(xieTypRectangle) * proi->nrects; + + if (!(prect = (xieTypRectangle*)GetDstBytes(flo,pet,dbnd,0,rectSize,KEEP))) + return FALSE; + + ConvertToRect(proi,prect); + + SetBandFinal(dbnd); + PutData(flo,pet,dbnd,rectSize); + FreeData(flo,pet,sbnd,sbnd->maxLocal); + + switch(raw->notify) { + case xieValFirstData: /* fall thru */ + case xieValNewData: SendExportAvailableEvent(flo,ped,0,proi->nrects,0,0); + default: break; + } + + return TRUE; +} /* end ActivateECROI */ + +static void ConvertToRect(proi,prect) +ROIPtr proi; +xieTypRectangle *prect; +{ + CARD32 nrects = 0; + linePtr lp; + + /* Convert run lengths to xieTypRectangles */ + lp = (linePtr)&proi[1]; + while (lp < proi->lend) { + register runPtr rp = RUNPTR(0); + register CARD32 x = proi->x; + register CARD32 j = lp->nrun; + + while (j--) { + x += rp->dstart; + prect[nrects].x = x; + prect[nrects].y = lp->y; + prect[nrects].width = rp->length; + prect[nrects++].height = lp->nline; + x += (rp++)->length; + } + lp = (linePtr)RUNPTR(lp->nrun); + } +} + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetECROI(flo,ped) +floDefPtr flo; +peDefPtr ped; +{ + ResetReceptors(ped); + ResetEmitter(ped); + + return TRUE; +} /* end ResetECROI */ + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyECROI(flo,ped) +floDefPtr flo; +peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.activate = (xieIntProc) NULL; + ped->ddVec.flush = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + + return TRUE; +} /* end DestroyECROI */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/export/medraw.c b/xie/xc/programs/Xserver/XIE/mixie/export/medraw.c new file mode 100644 index 0000000..eb3e520 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/export/medraw.c @@ -0,0 +1,385 @@ +/* $XConsortium: medraw.c,v 1.6 94/04/17 20:34:17 rws Exp $ */ +/**** module medraw.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + medraw.c -- DDXIE prototype export drawable element + + Robert NC Shelley -- AGE Logic, Inc. April, 1993 + +*****************************************************************************/ + +#define _XIEC_MEDRAW +#define _XIEC_EDRAW + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeEDraw(); + +/* + * routines used internal to this module + */ +static int CreateEDraw(); +static int InitializeEDraw(); +static int ActivateEDrawAlign(); +static int ActivateEDrawStrip(); +static int ResetEDraw(); +static int DestroyEDraw(); + +static void adjustStride8to4(); +static void adjustStride32to24(); + +extern Bool DrawableAndGC(); + +/* + * DDXIE ExportDrawable entry points + */ +static ddElemVecRec EDrawVec = { + CreateEDraw, + InitializeEDraw, + (xieIntProc)NULL, + (xieIntProc)NULL, + ResetEDraw, + DestroyEDraw + }; + +typedef struct _medraw { + xieVoidProc adjust; + char *buf; +} meDrawRec, *meDrawPtr; + + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeEDraw(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* for now just stash our entry point vector in the peDef */ + ped->ddVec = EDrawVec; + + return(TRUE); +} /* end miAnalyzeEDraw */ + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateEDraw(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the photo element definition */ + return MakePETex(flo, ped, sizeof(meDrawRec), NO_SYNC, NO_SYNC); +} /* end CreateEDraw */ + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeEDraw(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + meDrawPtr ddx = (meDrawPtr) pet->private; + formatPtr sf = &ped->inFloLst[SRCtag].format[0]; + formatPtr df = &ped->outFlo.format[0]; + Bool adj_stride = sf->stride != df->stride; + Bool adj_pitch = sf->pitch != df->pitch; + + if(adj_stride || adj_pitch) { + ped->ddVec.activate = ActivateEDrawAlign; + + if(adj_stride) { + if(!(ddx->buf = (char*) XieMalloc(df->pitch>>3))) + AllocError(flo,ped, return(FALSE)); + + if(sf->stride == 32 && df->stride == 24) + ddx->adjust = adjustStride32to24; + + else if(sf->stride == 8 && df->stride == 4) + ddx->adjust = adjustStride8to4; + + /* add more adjustment routines as required */ + } + } else { + ped->ddVec.activate = ActivateEDrawStrip; + } + return(InitReceptors(flo,ped,NO_DATAMAP,1)); +} /* end InitializeEDraw */ + + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateEDrawAlign(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloExportDrawable *raw = (xieFloExportDrawable *) ped->elemRaw; + eDrawDefPtr dix = (eDrawDefPtr) ped->elemPvt; + meDrawPtr ddx = (meDrawPtr) pet->private; + bandPtr bnd = &pet->receptor[SRCtag].band[0]; + char *dst, *src = (char*)GetCurrentSrc(flo,pet,bnd); + CARD32 width = bnd->format->width; + + if (!DrawableAndGC(flo,ped,raw->drawable,raw->gc,&dix->pDraw,&dix->pGC)) + return FALSE; + + do { + if(ddx->adjust) { + dst = AlterSrc(flo,pet,bnd->strip) ? src : ddx->buf; + (*ddx->adjust)(dst, src, width); + } else + dst = src; + + (*dix->pGC->ops->PutImage)(dix->pDraw, /* drawable */ + dix->pGC, /* gc */ + dix->pDraw->depth, /* depth */ + raw->dstX, /* drawable-x */ + raw->dstY + bnd->current, /* drawable-y */ + width, 1, /* width, height */ + bnd->strip->bitOff, /* padding? */ + ZPixmap, /* data format */ + dst /* data buffer */ + ); + } while(src = (char*)GetNextSrc(flo,pet,bnd,KEEP)); + + /* make sure the scheduler knows how much src we used */ + FreeData(flo,pet,bnd,bnd->current); + + return(TRUE); +} /* end ActivateEDrawAlign */ + + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateEDrawStrip(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloExportDrawable *raw = (xieFloExportDrawable *) ped->elemRaw; + eDrawDefPtr pvt = (eDrawDefPtr) ped->elemPvt; + bandPtr bnd = &pet->receptor[SRCtag].band[0]; + char *src = (char*)GetCurrentSrc(flo,pet,bnd); + + if(src) { + if (!DrawableAndGC(flo,ped,raw->drawable,raw->gc,&pvt->pDraw,&pvt->pGC)) + return FALSE; + do + (*pvt->pGC->ops->PutImage)(pvt->pDraw, /* drawable */ + pvt->pGC, /* gc */ + pvt->pDraw->depth, /* depth */ + raw->dstX, /* drawable-x */ + raw->dstY+bnd->minLocal, /* drawable-y */ + bnd->format->width, /* width */ + bnd->strip->length, /* height */ + bnd->strip->bitOff, /* padding? */ + ZPixmap, /* data format */ + src /* data buffer */ + ); + while(src = (char*)GetSrc(flo,pet,bnd,bnd->maxLocal,KEEP)); + } + /* make sure the scheduler knows how much src we used */ + FreeData(flo,pet,bnd,bnd->current); + + return(TRUE); +} /* end ActivateEDrawStrip */ + + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetEDraw(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + meDrawPtr ddx = (meDrawPtr) ped->peTex->private; + + if(ddx->buf) ddx->buf = (char*)XieFree(ddx->buf); + ddx->adjust = (xieVoidProc)NULL; + + ResetReceptors(ped); + + return(TRUE); +} /* end ResetEDraw */ + + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyEDraw(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + if(ped->peTex) + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.activate = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + + return(TRUE); +} /* end DestroyEDraw */ + + +/*------------------------------------------------------------------------ +---------------------------- alignment routines -------------------------- +------------------------------------------------------------------------*/ +static void adjustStride32to24(dst,src,width) + char *dst; + char *src; + CARD32 width; +{ + register char *ip, *op; + int i; + +#if (BITMAP_BIT_ORDER == IMAGE_BYTE_ORDER) + ip = src; + op = dst; + for(i = 0; i < width; ip += 2, ++i) { + *op++ = *ip++; *op++ = *ip++; *op++ = *ip; + } +#else + /* we'll do the first 2 pixels by hand in case we're doing this in-place + */ + char tmp = src[0]; + dst[0] = src[2]; + dst[2] = tmp; + if(width > 1) { + tmp = src[4]; + dst[3] = src[6]; + dst[4] = src[5]; + dst[5] = tmp; + } + if(width > 2) { + ip = src + 8; + op = dst + 6; + for(i = 2; i < width; ip += 4, ++i) { + *op++ = ip[2]; *op++ = ip[1]; *op++ = *ip; + } + } +#endif +} + +static void adjustStride8to4(dst,src,width) + char *dst; + char *src; + CARD32 width; +{ + register char *ip = src, *op = dst; + int i; + + for(i = 0; i < width; ip += 2, ++i) { +#if (BITMAP_BIT_ORDER == LSBFirst) + *op++ = *ip | *(ip+1)<<8; +#else + *op++ = *ip<<8 | *(ip+1); +#endif + } +} + +/* end module medraw.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/export/medrawp.c b/xie/xc/programs/Xserver/XIE/mixie/export/medrawp.c new file mode 100644 index 0000000..d122f91 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/export/medrawp.c @@ -0,0 +1,431 @@ +/* $XConsortium: medrawp.c,v 1.7 94/04/17 20:34:20 rws Exp $ */ +/**** module medrawp.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + medrawp.c -- DDXIE prototype export drawable plane element + + Robert NC Shelley && Larry Hare -- AGE Logic, Inc. June, 1993 + +*****************************************************************************/ + +#define _XIEC_MEDRAWP +#define _XIEC_EDRAWP + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +#include +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + +extern Bool DrawableAndGC(); + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeEDrawP(); + +/* + * routines used internal to this module + */ +static int CreateEDrawP(); +static int InitializeEDrawP(); +static int ActivateEDrawP(), ActivateEDrawPTrans(); +static int ResetEDrawP(); +static int DestroyEDrawP(); + +/* + * DDXIE ExportDrawable entry points + */ +static ddElemVecRec EDrawPVec = { + CreateEDrawP, + InitializeEDrawP, + ActivateEDrawP, + (xieIntProc)NULL, + ResetEDrawP, + DestroyEDrawP + }; + +typedef struct _medrawp { + BytePixel *buf; +} meDrawPRec, *meDrawPPtr; + + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeEDrawP(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* for now just stash our entry point vector in the peDef */ + ped->ddVec = EDrawPVec; + + return(TRUE); +} /* end miAnalyzeEDrawP */ + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateEDrawP(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the photo element definition */ + return MakePETex(flo, ped, sizeof(meDrawPRec), NO_SYNC, NO_SYNC); +} /* end CreateEDrawP */ + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeEDrawP(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloExportDrawablePlane *raw = (xieFloExportDrawablePlane *) ped->elemRaw; + eDrawPDefPtr dix = (eDrawPDefPtr) ped->elemPvt; + + if (!DrawableAndGC(flo,ped,raw->drawable,raw->gc,&dix->pDraw,&dix->pGC)) + return FALSE; + + if (dix->pGC->fillStyle == FillStippled) + ped->ddVec.activate = ActivateEDrawPTrans; + else /* normal case: FillSolid || FillTiled || FillOpaqueStippled */ + ped->ddVec.activate = ActivateEDrawP; + +#if (BITMAP_BIT_ORDER != IMAGE_BYTE_ORDER) + { + meDrawPPtr ddx = (meDrawPPtr) ped->peTex->private; + if(!(ddx->buf = ((BytePixel*)XieMalloc(max(ped->outFlo.format[0].pitch+7>>3, + flo->floTex->stripSize))))) + AllocError(flo,ped, return(FALSE)); + } +#endif + + return InitReceptors(flo,ped,NO_DATAMAP,1); +} /* end InitializeEDrawP */ + + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateEDrawP(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloExportDrawablePlane *raw = (xieFloExportDrawablePlane *) ped->elemRaw; + eDrawPDefPtr dix = (eDrawPDefPtr) ped->elemPvt; + bandPtr bnd = &pet->receptor[SRCtag].band[0]; + BytePixel *src = (BytePixel*)GetCurrentSrc(flo,pet,bnd); + CARD32 pixtype, depth; + + if(src) { + if(!DrawableAndGC(flo,ped,raw->drawable,raw->gc,&dix->pDraw,&dix->pGC)) + return FALSE; + pixtype = (dix->pDraw->type == DRAWABLE_PIXMAP) ? XYPixmap : XYBitmap; + depth = (pixtype == XYBitmap) ? 1 : dix->pDraw->depth; + + do { +#if (BITMAP_BIT_ORDER != IMAGE_BYTE_ORDER) + { + meDrawPPtr ddx = (meDrawPPtr) pet->private; + BytePixel *op, *dst; + int nb = bnd->pitch * bnd->strip->length; + dst = op = AlterSrc(flo,pet,bnd->strip) ? src : ddx->buf; + + while (nb--) + *op++ = _ByteReverseTable[*src++]; + src = dst; + } +#endif + (*dix->pGC->ops->PutImage)(dix->pDraw, /* drawable */ + dix->pGC, /* gc */ + depth, /* depth */ + raw->dstX, /* drawable-x */ + raw->dstY+bnd->minLocal, /* drawable-y */ + bnd->format->width, /* width */ + bnd->strip->length, /* height */ + bnd->strip->bitOff, /* padding? */ + pixtype, /* data format */ + (char*)src /* data buffer */ + ); + } + while(src = (BytePixel*)GetSrc(flo,pet,bnd,bnd->maxLocal,KEEP)); + + /* make sure the scheduler knows how much src we used */ + FreeData(flo,pet,bnd,bnd->current); + } + return(TRUE); +} /* end ActivateEDrawP */ + +static int ActivateEDrawPTrans(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloExportDrawablePlane *raw = (xieFloExportDrawablePlane *) ped->elemRaw; + eDrawPDefPtr dix = (eDrawPDefPtr) ped->elemPvt; + bandPtr bnd = &pet->receptor[SRCtag].band[0]; + DrawablePtr draw; + GCPtr gc, scratch; + PixmapPtr bitmap; + BytePixel *src; + int oldstyle, newstyle = FillSolid; + XID gcvals[3]; + + src = (BytePixel*)GetSrc(flo,pet,bnd,bnd->minGlobal,FALSE); + if(src) { + if (!DrawableAndGC(flo,ped,raw->drawable,raw->gc,&dix->pDraw,&dix->pGC)) + return FALSE; + + draw = dix->pDraw; + gc = dix->pGC; + + /* + ** We use PushPixels with a solid fill to move the one bits onto the + ** screen. Alternatives include: + ** a) treat the bitmap as a stipple, set it up in a GC, and do a + ** simple FillRect with FillStippled. This has all the same + ** problems, plus some more. Notably its more difficult to + ** use ChangeGC to transiently save/restore stipples, and to + ** compute the stipple offsets. + ** b) another alternative is to change the incoming bitonal + ** image to run length and do a FillSpans. This also requires + ** either a scratch GC or transiently using the incoming GC. + ** It saves the extra bitmap creation and PutImage, but might + ** become grotesque when a dithered image comes rolling thru. + */ + + /* + ** Core X does not seem to provide an official interface to create + ** a pixmap header, or even to replace the data pointer. We can't + ** simply memcpy our data to it either, it might be on a separate + ** cpu/memory system, or even upside down. So we just use PutImage + ** to prepare our data. Sigh. On most cpu's, just explicitly + ** create a pixmap header yourself and call PushPixels directly. + ** Another optimization would be to use more lines at once. One + ** model for all this is miglblt.c + ** + ** Since we expect people may want to redo this routine, we have + ** left the pixmap and GC games local to this function rather than + ** spreading stuff out into private structures and initialize + ** and destroy routines. For instance, the bitmap and scratchGC + ** could be allocated once for the entire flow. + ** + ** For now we do 64 lines of bits at a time. We might come up + ** with a better estimate based on actual scanline length. We + ** need a function to call though to make this unkludgey. Using + ** NLINES as 64 may be bad if we get a very wide image. + ** + ** The current performance seems very bad, even doing a large + ** number of lines at a time. Haven't had time to investigate this. + */ + +#define NLINES 64 + + if (!(scratch = GetScratchGC(1, draw->pScreen))) + AllocError(flo,ped,return(FALSE)); + + + if (!(bitmap = (*draw->pScreen->CreatePixmap) (draw->pScreen, + bnd->format->width, NLINES, 1))) { + FreeScratchGC(scratch); + AllocError(flo,ped,return(FALSE)); + } + gcvals[0] = 1; + gcvals[1] = 0; + ChangeGC(scratch, GCForeground|GCBackground, gcvals); + + oldstyle = gc->fillStyle; + ChangeGC(gc, GCFillStyle, (XID *)&newstyle); + + do { + int iy, ny; +#if (BITMAP_BIT_ORDER != IMAGE_BYTE_ORDER) + { + meDrawPPtr ddx = (meDrawPPtr) pet->private; + BytePixel *op, *dst; + int nb = bnd->pitch * bnd->strip->length; + dst = op = AlterSrc(flo,pet,bnd->strip) ? src : ddx->buf; + + while (nb--) + *op++ = _ByteReverseTable[*src++]; + src = dst; + } +#endif + for (iy = 0 ; iy < bnd->strip->length; iy += ny) { + ny = bnd->strip->length - iy; + if (ny > NLINES) + ny = NLINES; + if ((scratch->serialNumber) != (bitmap->drawable.serialNumber)) + ValidateGC((DrawablePtr)bitmap, scratch); + (*scratch->ops->PutImage) ( + (DrawablePtr)bitmap, /* drawable bitmap */ + scratch, /* gc */ + 1, /* depth */ + 0, /* drawable-x */ + 0, /* drawable-y */ + bnd->format->width, /* width */ + ny, /* height */ + bnd->strip->bitOff, /* padding? */ + XYPixmap, /* data format */ + (char*)src /* data buffer */ + ); + if ((gc->serialNumber) != (draw->serialNumber)) + ValidateGC(draw, gc); + (*gc->ops->PushPixels) ( + gc, /* gc */ + bitmap, /* bitmap */ + draw, /* drawable */ + bnd->format->width, /* width */ + ny, /* height */ + raw->dstX+(gc->miTranslate?draw->x:0), /* dst X/Y */ + raw->dstY+(gc->miTranslate?draw->y:0)+bnd->current+iy + ); + src += bnd->pitch * ny; /* gack */ + } + } while(src = (BytePixel*)GetSrc(flo,pet,bnd,bnd->maxLocal,FALSE)) ; + + /* make sure the scheduler knows how much src we used */ + FreeData(flo,pet,bnd,bnd->current); + + ChangeGC(gc, GCFillStyle, (XID *)&oldstyle); + ValidateGC(draw, gc); + + (*draw->pScreen->DestroyPixmap) (bitmap); + FreeScratchGC(scratch); + } + + return(TRUE); +} /* end ActivateEDrawPTrans */ + + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetEDrawP(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + meDrawPPtr ddx = (meDrawPPtr) ped->peTex->private; + + if(ddx->buf) ddx->buf = (BytePixel*)XieFree(ddx->buf); + + ResetReceptors(ped); + + return(TRUE); +} /* end ResetEDrawP */ + + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyEDrawP(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + if(ped->peTex) + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.activate = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + + return(TRUE); +} /* end DestroyEDrawP */ + +/* end module medrawp.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/export/mefax.c b/xie/xc/programs/Xserver/XIE/mixie/export/mefax.c new file mode 100644 index 0000000..dbbad3e --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/export/mefax.c @@ -0,0 +1,614 @@ +/* $XConsortium: mefax.c,v 1.7 94/04/17 20:34:21 rws Exp $ */ +/**** module mefax.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mefax.c -- DDXIE prototype export photomap coded with one of + many FAX techiques (g31d,g32d,g42d,tiff2,packbits) + + Ben Fahy -- AGE Logic, Inc. Oct, 1993 + +*****************************************************************************/ + +#define _XIEC_MEPHOTO +#define _XIEC_EPHOTO + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include <../include/fax.h> /* XXX - ugh! */ +#include <../fax/fencode.h> /* XXX - even ugh-ier! */ +#include + +/* + * routines referenced by other DDXIE modules + */ +int CreateEPhotoFAX(); +int InitializeEPhotoFAX(); +int ActivateEPhotoFAX(); +int ResetEPhotoFAX(); +int DestroyEPhotoFAX(); + +int InitializeECPhotoFAX(); + +/* ECPhoto Create routines are shared */ +/* ECPhoto Activate routines are shared */ +/* ECPhoto Reset routines are shared */ +/* ECPhoto Destroy routines are shared */ + +/* + * routines used internal to this module + */ + +static int common_init(); +static int sub_fun(); +static void FreeFaxData(); +/* + * Local Declarations + */ + + +typedef struct _fax_encode_pvt { + int (*encodptr)(); /* function used to encode the data */ + FaxEncodeState state; /* holds all coding info for FAX dudes */ + int notify; /* relevant for ECPhoto only */ + int encoded_order; /* LSfirst or MSfirst */ + + xieTypEncodeTechnique encode_technique; + char *tech_params; /* scroll away technique information */ + + int height; /* image height, so we know when done */ + int strip_req_newbytes; + /* when we GetDstBytes, how much */ +} faxPvtRec, *faxPvtPtr; + +#define MaybeSwapOutput() \ + if (texpvt->encoded_order == xieValLSFirst) { \ + register int size=dbnd->maxLocal-dbnd->minLocal; \ + register unsigned char *ucp = dst; \ + while (size--) \ + { \ + *ucp = _ByteReverseTable[*ucp]; \ + ucp++; \ + } \ + } + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +int CreateEPhotoFAX(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the photo element definition */ + return(MakePETex(flo, ped, sizeof(faxPvtRec), NO_SYNC, NO_SYNC)); +} /* end CreateEPhotoFAX */ +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +int InitializeEPhotoFAX(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ePhotoDefPtr pvt = (ePhotoDefPtr)ped->elemPvt; + + return( common_init(flo,ped,pvt->encodeParms,pvt->encodeNumber) ); +} +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +int InitializeECPhotoFAX(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloExportClientPhoto *raw = (xieFloExportClientPhoto *) ped->elemRaw; + peTexPtr pet = ped->peTex; + faxPvtPtr texpvt = (faxPvtPtr)pet->private; + ePhotoDefPtr pvt = (ePhotoDefPtr)ped->elemPvt; + + if( !common_init(flo,ped,pvt->encodeParms,pvt->encodeNumber) ) + return FALSE; + + texpvt->notify = raw->notify; + return TRUE; +} +/*------------------------------------------------------------------------ +------- lots of stuff shared between ECPhoto and EPhoto. . . ------------- +------------------------------------------------------------------------*/ +static int common_init(flo,ped,tec,encodeTechnique) +floDefPtr flo; +peDefPtr ped; +char *tec; +CARD16 encodeTechnique; +{ +peTexPtr pet = ped->peTex; +faxPvtPtr texpvt=(faxPvtPtr) pet->private; +formatPtr inf = pet->receptor[0].band[0].format; +FaxEncodeState *state = &texpvt->state; +int pbytes,max_lines_in; + +/* every time we run, reset this */ + bzero(texpvt,sizeof(faxPvtRec)); + +/* now save away protocol technique info */ + texpvt->encode_technique = encodeTechnique; + texpvt->tech_params = tec; + +/* we also need width */ + state->width = inf->width; + texpvt->height = inf->height; + +/* do technique-dependent initialization */ + switch(encodeTechnique) { + case xieValEncodeG31D: + { + G31DEncodePvt *epvt; + xieTecEncodeG31D *g31dtec = (xieTecEncodeG31D *)tec; + + state->goal = ENCODE_FAX_GOAL_StartNewLine; + state->radiometric = g31dtec->radiometric; + texpvt->encoded_order = g31dtec->encodedOrder; + + /* set up data private to this technique */ + epvt = (G31DEncodePvt *) XieMalloc(sizeof(G31DEncodePvt)); + bzero(epvt,sizeof(G31DEncodePvt)); + epvt->counts = (int *) XieMalloc((state->width+1) * sizeof(int)); + if (!epvt->counts) { + FreeFaxData(flo,ped); + AllocError(flo, ped, return(FALSE)); + } + epvt->align_eol = g31dtec->alignEol; + state->private = (pointer ) epvt; + + texpvt->encodptr = encode_g31d; + } + break; + case xieValEncodeG32D: + { + G32DEncodePvt *epvt; + xieTecEncodeG32D *g32dtec = (xieTecEncodeG32D *)tec; + + state->goal = ENCODE_FAX_GOAL_StartNewLine; + state->radiometric = g32dtec->radiometric; + texpvt->encoded_order = g32dtec->encodedOrder; + + /* set up data private to this technique */ + epvt = (G32DEncodePvt *) XieMalloc(sizeof(G32DEncodePvt)); + bzero(epvt,sizeof(G32DEncodePvt)); + epvt->counts = (int *) XieMalloc((state->width+1) * sizeof(int)); + epvt->above = (int *) XieMalloc((state->width+1) * sizeof(int)); + if (!epvt->counts || !epvt->above) { + FreeFaxData(flo,ped); + AllocError(flo, ped, return(FALSE)); + } + epvt->k = g32dtec->kFactor; + epvt->align_eol = g32dtec->alignEol; + epvt->uncompressed = g32dtec->uncompressed; + state->private = (pointer ) epvt; + } + texpvt->encodptr = encode_g32d; + break; + case xieValEncodeG42D: + { + G42DEncodePvt *epvt; + xieTecEncodeG42D *g42dtec = (xieTecEncodeG42D *)tec; + + state->goal = ENCODE_FAX_GOAL_StartNewLine; + texpvt->encoded_order = g42dtec->encodedOrder; + state->radiometric = g42dtec->radiometric; + + /* set up data private to this technique */ + epvt = (G42DEncodePvt *) XieMalloc(sizeof(G42DEncodePvt)); + bzero(epvt,sizeof(G42DEncodePvt)); + epvt->counts = (int *) XieMalloc((state->width+1) * sizeof(int)); + epvt->above = (int *) XieMalloc((state->width+1) * sizeof(int)); + if (!epvt->counts || !epvt->above) { + FreeFaxData(flo,ped); + AllocError(flo, ped, return(FALSE)); + } + /* for G4, initialize imaginary line to "all white" */ + epvt->counts[0] = state->width; + epvt->nvals = 1; + + epvt->uncompressed = ((xieTecEncodeG42D *)tec)->uncompressed; + epvt->really_g4 = 1; + state->private = (pointer ) epvt; + } + texpvt->encodptr = encode_g32d; + break; + case xieValEncodeTIFF2: + { + Tiff2EncodePvt *epvt; + xieTecEncodeTIFF2 *tiff2tec = (xieTecEncodeTIFF2 *)tec; + + state->goal = ENCODE_FAX_GOAL_StartNewLine; + state->radiometric = tiff2tec->radiometric; + texpvt->encoded_order = tiff2tec->encodedOrder; + + /* set up data private to this technique */ + epvt = (Tiff2EncodePvt *) XieMalloc(sizeof(Tiff2EncodePvt)); + bzero(epvt,sizeof(Tiff2EncodePvt)); + epvt->counts = (int *) XieMalloc((state->width+1) * sizeof(int)); + if (!epvt->counts) { + FreeFaxData(flo,ped); + AllocError(flo, ped, return(FALSE)); + } + state->private = (pointer ) epvt; + } + texpvt->encodptr = encode_tiff2; + break; + case xieValEncodeTIFFPackBits: + { + PackBitsEncodePvt *epvt; + xieTecEncodeTIFFPackBits *tiffpbtec = (xieTecEncodeTIFFPackBits *)tec; + + state->goal = ENCODE_FAX_GOAL_StartNewLine; + state->width = 8 * ((state->width + 7)/8); + /* packbits assumes lines are padded to an even byte */ + + texpvt->encoded_order = tiffpbtec->encodedOrder; + + /* set up data private to this technique */ + epvt = (PackBitsEncodePvt *) XieMalloc(sizeof(PackBitsEncodePvt)); + bzero(epvt,sizeof(PackBitsEncodePvt)); + epvt->values = (int *) XieMalloc((state->width) * sizeof(int)); + epvt->counts = (int *) XieMalloc((state->width) * sizeof(int)); + if (!epvt->counts || !epvt->values) { + FreeFaxData(flo,ped); + AllocError(flo, ped, return(FALSE)); + } + state->private = (pointer ) epvt; + } + texpvt->encodptr = encode_tiffpb; + break; + default: + ImplementationError(flo,ped, return(FALSE)); + } + + /* size of first output strip */ + texpvt->strip_req_newbytes = flo->floTex->stripSize; + state->strip_state = StripStateNew; + +/* calculate size of the input strip data map we will need */ + pbytes = (inf->pitch + 7) >> 3; + max_lines_in = flo->floTex->stripSize / pbytes; + + if (!max_lines_in) + max_lines_in = 1; /* in case a line was bigger than std stripsize */ + + return(InitReceptors(flo, ped, max_lines_in, 1) && + InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE)); + +} /* end common_init() */ +/*------------------------------------------------------------------------ +----------------------------- free some data ---------------------------- +------------------------------------------------------------------------*/ +static void FreeFaxData(flo,ped) +floDefPtr flo; +peDefPtr ped; +{ +peTexPtr pet = ped->peTex; +faxPvtPtr texpvt=(faxPvtPtr) pet->private; +FaxEncodeState *state = &texpvt->state; + + switch(texpvt->encode_technique) { + case xieValEncodeG31D: + { + G31DEncodePvt *epvt = (G31DEncodePvt *) state->private; + if (epvt) { + if (epvt->counts) + XieFree(epvt->counts); + XieFree(epvt); + } + } + break; + case xieValEncodeG32D: + case xieValEncodeG42D: + { + G32DEncodePvt *epvt = (G32DEncodePvt *) state->private; + if (epvt) { + if (epvt->counts) XieFree(epvt->counts); + if (epvt->above) XieFree(epvt->above); + XieFree(epvt); + } + } + break; + case xieValEncodeTIFF2: + { + Tiff2EncodePvt *epvt = (Tiff2EncodePvt *) state->private; + if (epvt) { + if (epvt->counts) + XieFree(epvt->counts); + XieFree(epvt); + } + } + break; + case xieValEncodeTIFFPackBits: + { + PackBitsEncodePvt *epvt = (PackBitsEncodePvt *) state->private; + if (epvt) { + if (epvt->counts) XieFree(epvt->counts); + if (epvt->values) XieFree(epvt->values); + XieFree(epvt); + } + } + break; + default: + break; + } +} +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +int ActivateEPhotoFAX(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + receptorPtr rcp = pet->receptor; + bandPtr sbnd = &rcp->band[0]; + bandPtr dbnd = &pet->emitter[0]; + faxPvtPtr texpvt=(faxPvtPtr) pet->private; + FaxEncodeState *state = &texpvt->state; + int was_ready, status; + + if (texpvt->notify) + was_ready = ped->outFlo.ready & 1; + + status = sub_fun(flo,ped,pet,texpvt,state,sbnd,dbnd); + + if(texpvt->notify && ~was_ready & ped->outFlo.ready & 1 && + (texpvt->notify==xieValNewData || + texpvt->notify==xieValFirstData && !ped->outFlo.output[0].flink->start)) + SendExportAvailableEvent(flo,ped,0,0,0,0); + + return( status ); +} + +/*------------------------------------------------------------------------ +-------------------- *really* crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int sub_fun(flo,ped,pet,texpvt,state,sbnd,dbnd) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; + faxPvtPtr texpvt; + FaxEncodeState *state; + bandPtr sbnd,dbnd; +{ +BytePixel *src,*dst; +int lines_coded; +int nl_mappable; + +/*** This program can exit the while(dst) loop because: + + 1) no new dst is available. This would only be because the + scheduler wants to activate somebody else. + + 2) We can't get (map) a new input strip. Maybe it's not available + because our data is coming from the client. We want to return + so we can get some. + + 3) we finished encoding all requested lines. + + 4) we notice an error. + + Now, the scheduler will always keep calling us as long as + we either have input data or final isn't set. We only set + final when we have used all input data and flushed all + output data. So there is no way for us to exit without + coming back properly. +***/ + + src = GetCurrentSrc(flo,pet,sbnd); + + if (dbnd->final) { + /* be forgiving if extra data gets passed to us */ + FreeData(flo,pet,sbnd,sbnd->maxGlobal); + return(TRUE); + } + while (dst = (BytePixel*)GetDstBytes(flo,pet,dbnd,dbnd->current, + texpvt->strip_req_newbytes,KEEP)) { + + if (!state->strip) { + state->strip = dst; + state->strip_size = dbnd->maxLocal - dbnd->current; + state->strip_state = StripStateNew; + } + nl_mappable = sbnd->maxLocal - sbnd->current; + if (nl_mappable + sbnd->current > texpvt->height) + nl_mappable = texpvt->height - sbnd->current; + + if (!MapData(flo,pet,sbnd,0,sbnd->current,nl_mappable,FLUSH)) { + FreeData(flo,pet,sbnd,sbnd->maxLocal); + return(TRUE); /* need another input strip */ + } + + state->i_lines = (char **)sbnd->dataMap; + state->nl_tocode = nl_mappable; + + lines_coded = (*(texpvt->encodptr))(state); + if (lines_coded < 0 || state->encoder_done > FAX_ENCODE_DONE_OK) { + /* coding error. But we should be able to *en*code anything! */ + ImplementationError(flo,ped, return(FALSE)); + } + state->i_line += lines_coded; + sbnd->current = state->i_line; + + if (state->i_line >= texpvt->height) { + /* We're all done! */ + + if (state->bits.bitpos) { + /* we need to make sure the stager gets flushed */ + unsigned char *byteptr= state->bits.byteptr; + + if (state->bits.endptr > byteptr) { + /* there is room in this strip for the stager */ + *byteptr = state->stager >> 24; + } + else { + /* woe is us. Stager won't fit in current output strip */ + MaybeSwapOutput(); + PutData(flo,pet,dbnd,dbnd->maxGlobal); + /* flush current strip */ + /* ask for one more strip of length 1 */ + dst = (BytePixel*)GetDstBytes(flo,pet, + dbnd,dbnd->current,1,KEEP); + *dst = state->stager >> 24; + } + state->bits.byteptr++; + } + /* however we got here, we now have one strip to flush, + which contains all the remaining encoded data. + */ + TruncateStrip(dbnd, + dbnd->minLocal + state->bits.byteptr - state->strip); + SetBandFinal(dbnd); + MaybeSwapOutput(); + PutData(flo,pet,dbnd,dbnd->maxGlobal); + FreeData(flo,pet,sbnd,sbnd->maxGlobal); + return(TRUE); + } + + if (state->magic_needs) { + /* encoder needs a new output strip */ + if (state->strip_state != StripStateDone) + ImplementationError(flo,ped, return(FALSE)); + + MaybeSwapOutput(); + PutData(flo,pet,dbnd,dbnd->maxGlobal); + /* I presume this will increment dbnd->current */ + + state->strip = 0; + continue; + } + + } /* end of while (GetDstBytes) */ + + return(TRUE); +} /* end ActivateEPhotoFAX */ +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +int ResetEPhotoFAX(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + faxPvtPtr texpvt=(faxPvtPtr) ped->peTex->private; + + if (texpvt) FreeFaxData(flo,ped); + + ResetReceptors(ped); + ResetEmitter(ped); + + return(TRUE); +} /* end ResetEPhotoFAX */ + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +int DestroyEPhotoFAX(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.activate = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + + return(TRUE); +} /* end DestroyEPhotoFAX */ +/* end module mefax.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/export/mejpeg.c b/xie/xc/programs/Xserver/XIE/mixie/export/mejpeg.c new file mode 100644 index 0000000..761e676 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/export/mejpeg.c @@ -0,0 +1,641 @@ +/* $XConsortium: mejpeg.c,v 1.5 94/04/17 20:34:21 rws Exp $ */ +/**** module mejpeg.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mejpeg.c -- DDXIE prototype export photomap coded ala JPEG element + + Ben Fahy -- AGE Logic, Inc. Oct, 1993 + +*****************************************************************************/ + +#define _XIEC_MEPHOTO +#define _XIEC_EPHOTO +#define _XIEC_ECPHOTO + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include <../include/jpeg.h> /* XXX - ugh! */ + + +/* + * routines referenced by other DDXIE modules + */ +int CreateEPhotoJPEGBaseline(); +int InitializeEPhotoJPEGBaseline(); +int ActivateEPhotoJPEGBaseline(); +int ResetEPhotoJPEGBaseline(); +int DestroyEPhotoJPEGBaseline(); + +/* Create routines are shared */ +int InitializeECPhotoJPEGBaseline(); +/* Activate routines are shared */ +/* Reset routines are shared */ +/* Destroy routines are shared */ + +/* + * routines used internal to this module + */ + +/* + * Local Declarations + */ + +static int sub_fun(); +static int common_init(); + +static int FlushJpegEncodeData(); +typedef struct _jpeg_encode_pvt { + int (*encodptr)(); /* function used to encode the data */ + + xieTypDataClass class; /* SingleBand or TripleBand */ + int out_bands; /* should be 1 if interleaved */ + int in_bands; /* should be 3 if TripleBand */ + int colors_smushed; /* TripleBand BandByPixel */ + int swizzle; /* true to reverse band order */ + int notify; /* relevant for ECPhoto only */ + /* the following are used by the JPEG private routines */ + struct Compress_methods_struct c_methods; + struct External_methods_struct e_methods; + + /* these things hold state. may need one for each band */ + JpegEncodeState state[3]; + struct Compress_info_struct cinfo[3]; + unsigned char output_buffer[3][JPEG_BUF_SIZE]; +} jpegPvtRec, *jpegPvtPtr; + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +int CreateEPhotoJPEGBaseline(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the photo element definition */ + return(MakePETex(flo, ped, sizeof(jpegPvtRec), NO_SYNC, NO_SYNC)); +} /* end CreateEPhotoJPEGBaseline */ +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +int InitializeEPhotoJPEGBaseline(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ePhotoDefPtr pvt = (ePhotoDefPtr)ped->elemPvt; + + return( common_init(flo,ped,pvt->encodeParms,pvt->encodeNumber) ); +} +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +int InitializeECPhotoJPEGBaseline(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ePhotoDefPtr pvt = (ePhotoDefPtr)ped->elemPvt; + peTexPtr pet = ped->peTex; + jpegPvtPtr texpvt=(jpegPvtPtr) pet->private; + + if(!common_init(flo,ped,pvt->encodeParms,pvt->encodeNumber)) { + if(ferrCode(flo)) + return(FALSE); + else + TechniqueError(flo,ped,xieValEncode, + ((xieFloExportClientPhoto*)ped->elemRaw)->encodeTechnique, + ((xieFloExportClientPhoto*)ped->elemRaw)->lenParams, + return(FALSE)); + } + texpvt->notify = ((xieFloExportClientPhoto *)ped->elemRaw)->notify; + return(TRUE); +} +/*------------------------------------------------------------------------ +------- lots of stuff shared between ECPhoto and EPhoto. . . ------------- +------------------------------------------------------------------------*/ +static int common_init(flo,ped,tec,encodeTechnique) + floDefPtr flo; + peDefPtr ped; + xieTecEncodeJPEGBaseline *tec; + CARD16 encodeTechnique; +{ + peTexPtr pet = ped->peTex; + eTecEncodeJPEGBaselineDefPtr pedpvt=(eTecEncodeJPEGBaselineDefPtr) + ped->techPvt; + jpegPvtPtr texpvt=(jpegPvtPtr) pet->private; + int out_bands = ped->outFlo.bands; /* # of output bands */ + int in_bands = ped->inFloLst[SRCtag].bands; /* # of input bands */ + formatPtr inf = pet->receptor[0].band[0].format; + compress_info_ptr cinfo; + int pbytes,max_lines_in,b; + + /* every time we run, reset this */ + bzero(texpvt,sizeof(jpegPvtRec)); + + /* squirrel away # of bands and class output, class of input */ + texpvt->in_bands = in_bands; + texpvt->out_bands = out_bands; + texpvt->class = (in_bands == 3)? xieValTripleBand : xieValSingleBand; + texpvt->colors_smushed = 0; + + /* note: we assume dixie side has set up the in/out #bands properly */ + if (in_bands == 1) + texpvt->encodptr = encode_jpeg_lossy_gray; + /* JPEG will be coding grayscale */ + + else { + /* if interleave is BandByPlane, do gray, one band at a time. + * otherwise, do color, three bands at a time. + */ + if (in_bands == out_bands) { /* interleaving BandByPlane */ + texpvt->encodptr = encode_jpeg_lossy_gray; + /* JPEG will code each band individually */ + } + else { /* BandByPixel, do all 3 bands at once */ + texpvt->encodptr = encode_jpeg_lossy_color; + texpvt->colors_smushed = 1; + /* JPEG will code all bands simultaneously */ + } + } + ped->peTex->bandSync = in_bands != out_bands; + texpvt->swizzle = tec->bandOrder == xieValMSFirst; + + /* now deal with stuff on per-band basis */ + for (b=0; b < out_bands; ++b) { + JpegEncodeState *state = &(texpvt->state[b]); + + state->width = inf->width; + state->height = inf->height; + state->n_bands = texpvt->colors_smushed ? 3 : 1; + /* this is how many bands the encoder looks at. If the image is */ + /* TripleBand-BandByPixel, 3. If BandByPlane or SingleBand, 1 */ + + state->c_methods = &texpvt->c_methods; + state->e_methods = &texpvt->e_methods; + + state->lenQtable = tec->lenQtable; + state->lenACtable = tec->lenACtable; + state->lenDCtable = tec->lenDCtable; + state->Qtable = pedpvt->q; + state->ACtable = pedpvt->a; + state->DCtable = pedpvt->d; + + state->goal = JPEG_ENCODE_GOAL_Startup; + state->needs_input_strip = 1; + + cinfo = state->cinfo = &texpvt->cinfo[b]; + if(JC_INIT(cinfo,state->c_methods,state->e_methods) != 0) + return(FALSE); + + cinfo->jpeg_buf_size = JPEG_BUF_SIZE; + cinfo->output_buffer = (char *) texpvt->output_buffer[b]; + state->jpeg_output_buffer = texpvt->output_buffer[b]; + + /* size of first output strip */ + state->strip_req_newbytes = flo->floTex->stripSize; + + if(texpvt->colors_smushed) { + int j; + for(j = 0; j < xieValMaxBands; ++j) { + state->h_sample[j] = tec->horizontalSamples[j]; + state->v_sample[j] = tec->verticalSamples[j]; + } + } + } + /* calculate size of the input strip data map we will need */ + pbytes = (inf->pitch + 7) >> 3; + max_lines_in = flo->floTex->stripSize / pbytes; + + if (!max_lines_in) + max_lines_in = 1; /* in case a line was bigger than std stripsize */ + + return(InitReceptors(flo, ped, max_lines_in, 1) && + InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE)); + +} /* end common_init() */ + + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +int ActivateEPhotoJPEGBaseline(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + receptorPtr rcp = pet->receptor; + bandPtr sbnd = &rcp->band[0]; /* "red" (or gray) input */ + bandPtr sbnd1 = &rcp->band[1]; /* optional "green" */ + bandPtr sbnd2 = &rcp->band[2]; /* optional "blue" */ + bandPtr dbnd = &pet->emitter[0]; + jpegPvtPtr texpvt=(jpegPvtPtr) pet->private; + int b, d, was_ready = 0, status; + + /* if the class of the src is SingleBand, we call sub_fun for band 0 */ + /* if the class of the src is TripleBand and the interleave is */ + /* BandByPlane, we call sub_fun 3 times, once for each band */ + /* if the class of the src is TripleBand, interleave BandByPixel, we */ + /* call subfun once, supplying it all three source bands */ + + if (texpvt->class == xieValSingleBand) { + JpegEncodeState *state = &(texpvt->state[0]); + + if (texpvt->notify) { + was_ready = ped->outFlo.ready; + } + + status = sub_fun(flo,ped,pet,texpvt,state,sbnd,dbnd,NULL,NULL); + + if(texpvt->notify && ~was_ready & ped->outFlo.ready & 1 && + (texpvt->notify == xieValNewData || + texpvt->notify == xieValFirstData && + !ped->outFlo.output[0].flink->start)) + SendExportAvailableEvent(flo,ped,0,0,0,0); + + return( status ); + } + + /* TripleBand */ + if (texpvt->colors_smushed) { /* BandByPixel */ + JpegEncodeState *state = &(texpvt->state[0]); + + if (texpvt->notify) { + was_ready = ped->outFlo.ready & 1; + } + if(texpvt->swizzle) + status = sub_fun(flo,ped,pet,texpvt,state,sbnd2,dbnd,sbnd1,sbnd); + else + status = sub_fun(flo,ped,pet,texpvt,state,sbnd,dbnd,sbnd1,sbnd2); + + if(texpvt->notify && ~was_ready & ped->outFlo.ready & 1 && + (texpvt->notify == xieValNewData || + texpvt->notify == xieValFirstData && + !ped->outFlo.output[0].flink->start)) + SendExportAvailableEvent(flo,ped,0,0,0,0); + + return( status ); + } + + /* TripleBand, BandByPlane */ + for(b = 0; b < xieValMaxBands; ++b) { + JpegEncodeState *state = &(texpvt->state[b]); + d = texpvt->swizzle ? xieValMaxBands - b - 1 : b; + sbnd = &rcp->band[b]; /* do each band independently */ + dbnd = &pet->emitter[d]; + + if (texpvt->notify) { + was_ready = ped->outFlo.ready & 1<notify && ~was_ready & ped->outFlo.ready & 1<notify == xieValNewData || + texpvt->notify == xieValFirstData && + !ped->outFlo.output[d].flink->start)) + SendExportAvailableEvent(flo,ped,d,0,0,0); + + if (status == FALSE) + return( status ); + } + return(TRUE); +} +/*------------------------------------------------------------------------ +-------------------- *really* crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int sub_fun(flo,ped,pet,texpvt,state,sbnd,dbnd,sbnd1,sbnd2) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; + jpegPvtPtr texpvt; + JpegEncodeState *state; + bandPtr sbnd,sbnd1,sbnd2,dbnd; +{ +BytePixel *dst; +int status; + +/*** This program can return due to the following reasons: + + 1) we have provided all the data an input strip has to the + encoder, and we are not at the end of the image. In this + case we can expect to return when more data comes. + + 2) We try to get another Destination strip, but GetDst + turns us down because the scheduler wants to activate + somebody else. Since we haven't set final yet, we + are ok. + + 3) after encoding, we notice the state is Done and there + is no data left to flush. We set final and return. + + 4) we finish flushing all of our data, and notice state + is Done. We set final and return. + + 5) we notice an error. + + Now, the scheduler will always keep calling us as long as + we either have input data or final isn't set. We only set + final when we have used all input data and flushed all + output data. So there is no way for us to exit without + coming back properly. +***/ + + (void) GetCurrentSrc(flo,pet,sbnd); + if (dbnd->final) { + /* be forgiving if extra data gets passed to us */ + FreeData(flo,pet,sbnd,sbnd->maxGlobal); + return(TRUE); + } + while (dst = (BytePixel*)GetDstBytes(flo,pet,dbnd,dbnd->current, + state->strip_req_newbytes,FLUSH)) { + if (state->flush_output) { + + status = FlushJpegEncodeData(dbnd,dst,state); + /* write as much as we can to output strip. This */ + /* also updates state->i_line and state->nl_coded. */ + + if (status == JPEG_FLUSH_FlushedAll) { + state->strip_req_newbytes = dbnd->maxLocal - dbnd->current; + state->cinfo->bytes_in_buffer = 0; + if (state->goal == JPEG_ENCODE_GOAL_Done) { + /* we're done and nothing to flush, so let's wrap up */ + SetBandFinal(dbnd); + PutData(flo,pet,dbnd,dbnd->maxGlobal); + FreeData(flo,pet,sbnd,sbnd->maxGlobal); + if (sbnd1) { + FreeData(flo,pet,sbnd1,sbnd1->maxGlobal); + FreeData(flo,pet,sbnd2,sbnd2->maxGlobal); + } + return(TRUE); + } + continue; + /* go around loop again. Get another dst */ + /* (if needed) and encode some more */ + } + else if (status == JPEG_FLUSH_FlushedPart) { + /* go get another Destination strip */ + state->strip_req_newbytes = flo->floTex->stripSize; + PutData(flo,pet,dbnd,dbnd->current); + continue; + } + else + ImplementationError(flo,ped, return(FALSE)); + + } /* end of if flush */ + else { + state->nl_tocode = 0; + if (state->i_line < state->height) { + + /* haven't reached the end of the image yet */ + int nl_mappable = sbnd->maxLocal - sbnd->current; + + if (sbnd->current != state->i_line) + OperatorError(flo,ped,123,return(FALSE)) ; + + if (!MapData(flo,pet,sbnd,0,sbnd->current,nl_mappable,FLUSH)) { + FreeData(flo,pet,sbnd,sbnd->maxLocal); + if (sbnd1) { + FreeData(flo,pet,sbnd1,sbnd1->maxLocal); + FreeData(flo,pet,sbnd2,sbnd2->maxLocal); + } + return(TRUE); /* need another input strip */ + } + + state->i_lines[0] = (unsigned char **)sbnd->dataMap; + state->nl_tocode = sbnd->maxLocal - sbnd->current; + + if (sbnd1) { + + if (!MapData(flo,pet,sbnd1,0,sbnd1->current,nl_mappable,FLUSH)) { + FreeData(flo,pet,sbnd,sbnd->maxLocal); + FreeData(flo,pet,sbnd1,sbnd1->maxLocal); + FreeData(flo,pet,sbnd2,sbnd2->maxLocal); + return(TRUE); /* need another input strip */ + } + state->i_lines[1] = (unsigned char **)sbnd1->dataMap; + + if (!MapData(flo,pet,sbnd2,0,sbnd2->current,nl_mappable,FLUSH)) { + FreeData(flo,pet,sbnd,sbnd->maxLocal); + FreeData(flo,pet,sbnd1,sbnd1->maxLocal); + FreeData(flo,pet,sbnd2,sbnd2->maxLocal); + return(TRUE); /* need another input strip */ + } + state->i_lines[2] = (unsigned char **)sbnd2->dataMap; + } + } /* end of if (state->i_line < state->height) */ + + if (state->cinfo->bytes_in_buffer) { + /* this should not be possible if the flushing code is working */ + ImplementationError(flo,ped, return(FALSE)); + } + if ( (*(texpvt->encodptr))(state) < 0 ) + ImplementationError(flo,ped, return(FALSE)); + /* coding error. We should be able to encode anything! */ + + sbnd->current = state->i_line; + if (sbnd1) + sbnd1->current = sbnd2->current = state->i_line; + + if (state->flush_output) { + /* encoder wants us to flush its buffer before we call */ + /* it again. record position of where to start flushing */ + + state->jpeg_output_bpos = (unsigned char *) + state->cinfo->output_buffer; + continue; + } + if (state->goal == JPEG_ENCODE_GOAL_Done) { + /* we're done and nothing to flush, so let's wrap up */ + SetBandFinal(dbnd); + PutData(flo,pet,dbnd,dbnd->maxGlobal); + FreeData(flo,pet,sbnd,sbnd->maxGlobal); + if (sbnd1) { + FreeData(flo,pet,sbnd1,sbnd1->maxGlobal); + FreeData(flo,pet,sbnd2,sbnd2->maxGlobal); + } + return(TRUE); + } + if (!state->nl_tocode) { + /* we have no input left */ + if (state->i_line < state->height) { + /* need another input strip */ + FreeData(flo,pet,sbnd,sbnd->current); + if (sbnd1) { + FreeData(flo,pet,sbnd1,sbnd1->current); + FreeData(flo,pet,sbnd2,sbnd2->current); + } + return(TRUE); + } + else + state->goal = JPEG_ENCODE_GOAL_EndFrame; + } + + } /* end of else !flush */ + + } /* end of while (GetDstBytes) */ + + return(TRUE); +} /* end ActivateEPhotoJPEGBaseline */ +/*------------------------------------------------------------------------ +------------------- flush JPEG buffer to output strip ------------------- +------------------------------------------------------------------------*/ +static int FlushJpegEncodeData(dbnd,dst,state) +bandPtr dbnd; +register unsigned char *dst; +JpegEncodeState *state; +{ +register unsigned char *jpeg_odata = state->jpeg_output_bpos; +int bytes_left_in_strip; +register int i,max_can_do; + + bytes_left_in_strip = dbnd->maxLocal - dbnd->current; + /* dbnd->current is the offset from start of strip, */ + /* so it represents the number of bytes used */ + max_can_do = (bytes_left_in_strip > state->flush_output)? + state->flush_output : bytes_left_in_strip; + + for (i=0; icurrent += max_can_do; + state->flush_output -= max_can_do; + state->jpeg_output_bpos += max_can_do; + + if (state->flush_output) + return(JPEG_FLUSH_FlushedPart); + else + return(JPEG_FLUSH_FlushedAll); +} +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +int ResetEPhotoJPEGBaseline(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ResetReceptors(ped); + ResetEmitter(ped); + + /* get rid of the any data malloc'd by JPEG encoder + */ + if(ped->peTex) { + jpegPvtPtr texpvt = (jpegPvtPtr) ped->peTex->private; + int b; + + /* JPEG code has its own global free routine + */ + for (b=0; bin_bands; ++b) { + if(texpvt->cinfo[b].emethods && texpvt->cinfo[b].emethods->c_free_all) + (*texpvt->cinfo[b].emethods->c_free_all)(& texpvt->cinfo[b]); + } + } + return(TRUE); +} /* end ResetEPhotoJPEGBaseline */ + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +int DestroyEPhotoJPEGBaseline(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.activate = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + + return(TRUE); +} /* end DestroyEPhotoJPEGBaseline */ +/* end module mejpeg.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/export/melut.c b/xie/xc/programs/Xserver/XIE/mixie/export/melut.c new file mode 100644 index 0000000..c261382 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/export/melut.c @@ -0,0 +1,237 @@ +/* $XConsortium: melut.c,v 1.5 94/04/17 20:34:22 rws Exp $ */ +/**** module melut.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + melut.c -- DDXIE prototype export lut element + + Larry Hare -- AGE Logic, Inc. June, 1993 + +*****************************************************************************/ + +#define _XIEC_MELUT +#define _XIEC_ELUT + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeELUT(); + +/* + * routines used internal to this module + */ +static int CreateELUT(); +static int InitializeELUT(); +static int ActivateELUT(); +static int ResetELUT(); +static int DestroyELUT(); + +/* + * DDXIE ExportLUT entry points + */ +static ddElemVecRec ELUTVec = { + CreateELUT, + InitializeELUT, + ActivateELUT, + (xieIntProc)NULL, + ResetELUT, + DestroyELUT + }; + + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeELUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* for now just stash our entry point vector in the peDef */ + ped->ddVec = ELUTVec; + + return(TRUE); +} /* end miAnalyzeELUT */ + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateELUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the lut element definition */ + return(MakePETex(flo, ped, NO_PRIVATE, NO_SYNC, NO_SYNC)); +} /* end CreateELUT */ + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeELUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + return InitReceptors(flo,ped,NO_DATAMAP,1) && + InitEmitter(flo,ped,NO_DATAMAP,NO_INPLACE); +} /* end InitializeELUT */ + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateELUT(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + receptorPtr rcp = pet->receptor; + CARD32 bands = rcp->inFlo->bands; + bandPtr sbnd = &rcp->band[0]; + bandPtr dbnd = &pet->emitter[0]; + CARD32 b; + + for(b = 0; b < bands; ++sbnd, ++dbnd, ++b) { + + /* get pointer to the initial src data (i.e. beginning of strip) + */ + if(GetCurrentSrc(flo,pet,sbnd)) { + + /* LUT only has 1 strip per band + */ + if(!PassStrip(flo,pet,dbnd,sbnd->strip)) + return(FALSE); + + /* free the amount of src strip(s) we've used + */ + FreeData(flo,pet,sbnd,sbnd->maxLocal); + } + } + return(TRUE); +} /* end ActivateELUT */ + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetELUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ResetReceptors(ped); + ResetEmitter(ped); + + return(TRUE); +} /* end ResetELUT */ + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyELUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.activate = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + + return(TRUE); +} /* end DestroyELUT */ + +/* end module melut.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/export/mephoto.c b/xie/xc/programs/Xserver/XIE/mixie/export/mephoto.c new file mode 100644 index 0000000..5abde19 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/export/mephoto.c @@ -0,0 +1,805 @@ +/* $XConsortium: mephoto.c,v 1.7 94/04/17 20:34:23 dpw Exp $ */ +/**** module mephoto.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mephoto.c -- DDXIE prototype export photomap element + + Robert NC Shelley -- AGE Logic, Inc. June, 1993 + Dean && Ben - various additions to handle different techniques + +*****************************************************************************/ + +#define _XIEC_MEPHOTO +#define _XIEC_EPHOTO + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include +#include + + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeEPhoto(); + +/* + * routines used internal to this module + */ +static int CreateEPhotoUncom(); +static int InitializeEPhotoBypass(); +static int InitializeEPhotoUncomByPlane(); +static int ActivateEPhotoUncomByPlane(); +static int ResetEPhoto(); +static int DestroyEPhoto(); + +#if XIE_FULL +static int InitializeEPhotoUncomByPixel(); +static int ActivateEPhotoUncomByPixel(); +#endif /* XIE_FULL */ + + +/* + * routines we need from somewhere else + */ + +extern int CreateEPhotoJPEGBaseline(); +extern int InitializeEPhotoJPEGBaseline(); +extern int ActivateEPhotoJPEGBaseline(); +extern int ResetEPhotoJPEGBaseline(); +extern int DestroyEPhotoJPEGBaseline(); + +extern int CreateEPhotoFAX(); +extern int InitializeEPhotoFAX(); +extern int ActivateEPhotoFAX(); +extern int ResetEPhotoFAX(); +extern int DestroyEPhotoFAX(); + +/* + * DDXIE ExportPhotomap entry points + */ +static ddElemVecRec EPhotoBypassVec = { + CreateEPhotoUncom, + InitializeEPhotoBypass, + (xieIntProc)NULL, + (xieIntProc)NULL, + ResetEPhoto, + DestroyEPhoto + }; + +static ddElemVecRec EPhotoUncomByPlaneVec = { + CreateEPhotoUncom, + InitializeEPhotoUncomByPlane, + ActivateEPhotoUncomByPlane, + (xieIntProc)NULL, + ResetEPhoto, + DestroyEPhoto + }; + +static ddElemVecRec EPhotoFAXVec = { + CreateEPhotoFAX, + InitializeEPhotoFAX, + ActivateEPhotoFAX, + (xieIntProc)NULL, + ResetEPhotoFAX, + DestroyEPhotoFAX + }; + +#if XIE_FULL +static ddElemVecRec EPhotoUncomByPixelVec = { + CreateEPhotoUncom, + InitializeEPhotoUncomByPixel, + ActivateEPhotoUncomByPixel, + (xieIntProc)NULL, + ResetEPhoto, + DestroyEPhoto + }; + +static ddElemVecRec EPhotoJPEGBaselineVec = { + CreateEPhotoJPEGBaseline, + InitializeEPhotoJPEGBaseline, + ActivateEPhotoJPEGBaseline, + (xieIntProc)NULL, + ResetEPhotoJPEGBaseline, + DestroyEPhotoJPEGBaseline + }; +#endif /* XIE_FULL */ + + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeEPhoto(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ePhotoDefPtr pvt = (ePhotoDefPtr)ped->elemPvt; + + if(pvt->congress) { + ped->ddVec = EPhotoBypassVec; + return(TRUE); + } + switch(pvt->encodeNumber) { + + case xieValEncodeUncompressedSingle: + ped->ddVec = EPhotoUncomByPlaneVec; + break; + + case xieValEncodeG31D: + case xieValEncodeG32D: + case xieValEncodeG42D: + case xieValEncodeTIFF2: + case xieValEncodeTIFFPackBits: + ped->ddVec = EPhotoFAXVec; + break; + +#if XIE_FULL + case xieValEncodeUncompressedTriple: + { + xieTecEncodeUncompressedTriple *tecParms = + (xieTecEncodeUncompressedTriple *)pvt->encodeParms; + if(tecParms->interleave == xieValBandByPlane) + ped->ddVec = EPhotoUncomByPlaneVec; + else + ped->ddVec = EPhotoUncomByPixelVec; + } + break; + case xieValEncodeJPEGBaseline: + { /*** JPEG for SI can only handle 8 bit image depths ***/ + inFloPtr inf = &ped->inFloLst[IMPORT]; + outFloPtr src = &inf->srcDef->outFlo; + int b; + for (b=0; b< src->bands; ++b) + if(src->format[b].depth != 8) { + xieFloExportPhotomap *raw = (xieFloExportPhotomap *)ped->elemRaw; + + TechniqueError(flo, ped, xieValEncode, + raw->encodeTechnique, raw->lenParams, return(FALSE)); + } + } + ped->ddVec = EPhotoJPEGBaselineVec; + break; + case xieValEncodeJPEGLossless: +#endif /* XIE_FULL */ + default: ImplementationError(flo,ped, return(FALSE)); + } + return(TRUE); +} /* end miAnalyzeEPhoto */ + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateEPhotoUncom(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the photo element definition */ + return(MakePETex(flo, ped, xieValMaxBands * sizeof(meUncompRec), + NO_SYNC, NO_SYNC)); +} /* end CreateEPhotoUncom */ + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeEPhotoBypass(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* Allows data manager to bypass element entirely */ + return(InitReceptor(flo, ped, ped->peTex->receptor, + NO_DATAMAP, 1, NO_BANDS, ALL_BANDS)); +} /* end InitializeEPhotoBypass */ + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeEPhotoUncomByPlane(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + meUncompPtr pvt = (meUncompPtr)pet->private; + formatPtr inf = ped->inFloLst[SRCtag].format; + bandPtr sbnd = pet->receptor->band; + CARD32 nbands = ped->outFlo.bands, b, s; + xieTypOrientation pixelOrder, fillOrder; + Bool inited = FALSE; + + if (nbands == 1) { + xieTecEncodeUncompressedSingle *tecParms = + (xieTecEncodeUncompressedSingle *) + ((ePhotoDefPtr)ped->elemPvt)->encodeParms; + pixelOrder = tecParms->pixelOrder; + fillOrder = tecParms->fillOrder; + pvt[0].bandMap = 0; + } else { + xieTecEncodeUncompressedTriple *tecParms = + (xieTecEncodeUncompressedTriple *) + ((ePhotoDefPtr)ped->elemPvt)->encodeParms; + pixelOrder = tecParms->pixelOrder; + fillOrder = tecParms->fillOrder; + if(tecParms->bandOrder == xieValLSFirst) + for(b = 0; b < xieValMaxBands; ++b) + pvt[b].bandMap = b; + else + for(s = 0, b = xieValMaxBands; b--; ++s) + pvt[s].bandMap = b; + } + for (b = 0; b < nbands; b++, pvt++, inf++, sbnd++) { + bandPtr dbnd = &pet->emitter[pvt->bandMap]; + formatPtr outf = &ped->outFlo.format[pvt->bandMap]; + CARD8 class = inf->class; + if (class == BIT_PIXEL) { + pvt->width = inf->width; +#if (IMAGE_BYTE_ORDER == MSBFirst) + if (outf->stride != 1) { + pvt->action = (fillOrder == xieValMSFirst) ? btoIS: sbtoIS; + } else { + pvt->action = (fillOrder == xieValMSFirst) ? + (void (*)())NULL : sbtoS; + } +#else + if (outf->stride != 1) { + pvt->action = (fillOrder == xieValLSFirst) ? btoIS: sbtoIS; + } else { + pvt->action = (fillOrder == xieValLSFirst) ? + (void (*)())NULL : sbtoS; + } +#endif + pvt->stride = outf->stride; + pvt->pitch = outf->pitch; + } else if (class == BYTE_PIXEL) { + pvt->width = inf->width; + if (!(outf->stride & 7)) { + if (outf->stride == 8) + pvt->action = BtoS; + else + pvt->action = BtoIS; + pvt->Bstride = outf->stride >> 3; + pvt->dstoffset = 0; + pvt->mask = 0; /* Unused */ + pvt->shift = 0; /* Unused */ + pvt->clear_dst = FALSE; + } else { + if (pixelOrder == xieValLSFirst) { + if (fillOrder == xieValLSFirst) + pvt->action = BtoLLUB; + else + pvt->action = BtoLMUB; + } else { + if (fillOrder == xieValLSFirst) + pvt->action = BtoMLUB; + else + pvt->action = BtoMMUB; + } + pvt->bitOff = 0; /* Bit offset to first pixel on line */ + pvt->leftOver = 0; /* Left over bits from last line */ + pvt->depth = inf->depth; + pvt->stride = outf->stride; + pvt->pitch = outf->pitch; + } + } else if (class == PAIR_PIXEL) { + pvt->width = inf->width; + if (!(outf->stride & 15)) { +#if (IMAGE_BYTE_ORDER == LSBFirst) + if (outf->stride == 16) + pvt->action = (fillOrder == xieValLSFirst) ? + (void (*)())NULL : sPtoS; + else + pvt->action = (fillOrder == xieValLSFirst) ? PtoIS: sPtoIS; +#else + if (outf->stride == 16) + pvt->action = (fillOrder == xieValMSFirst) ? + (void (*)())NULL : sPtoS; + else + pvt->action = (fillOrder == xieValMSFirst) ? PtoIS: sPtoIS; +#endif + pvt->Bstride = outf->stride >> 3; + pvt->dstoffset = 0; + pvt->mask = 0; /* Unused */ + pvt->shift = 0; /* Unused */ + pvt->clear_dst = FALSE; + } else { + if (pixelOrder == xieValLSFirst) { + if (fillOrder == xieValLSFirst) + pvt->action = PtoLLUP; + else + pvt->action = PtoLMUP; + } else { + if (fillOrder == xieValLSFirst) + pvt->action = PtoMLUP; + else + pvt->action = PtoMMUP; + } + pvt->bitOff = 0; /* Bit offset to first pixel on line */ + pvt->leftOver = 0; /* Left over bits from last line */ + pvt->depth = inf->depth; + pvt->stride = outf->stride; + pvt->pitch = outf->pitch; + } + } else if (class == QUAD_PIXEL) { + pvt->width = inf->width; + if (!(outf->stride & 31)) { +#if (IMAGE_BYTE_ORDER == LSBFirst) + if (outf->stride == 32) + pvt->action = (fillOrder == xieValLSFirst) ? + (void (*)())NULL : sQtoS; + else + pvt->action = (fillOrder == xieValLSFirst) ? QtoIS: sQtoIS; +#else + if (outf->stride == 32) + pvt->action = (fillOrder == xieValMSFirst) ? + (void (*)())NULL : sQtoS; + else + pvt->action = (fillOrder == xieValMSFirst) ? QtoIS: sQtoIS; +#endif + pvt->Bstride = outf->stride >> 3; + pvt->dstoffset = 0; + pvt->mask = 0; /* Unused */ + pvt->shift = 0; /* Unused */ + pvt->clear_dst = FALSE; + } else { + if (pixelOrder == xieValLSFirst) { + if (fillOrder == xieValLSFirst) + pvt->action = QtoLLUQ; + else + pvt->action = QtoLMUQ; + } else { + if (fillOrder == xieValLSFirst) + pvt->action = QtoMLUQ; + else + pvt->action = QtoMMUQ; + } + } + } else + ImplementationError(flo,ped, return(FALSE)); + + if (pvt->action) { + pvt->bitOff = 0; /* Bit offset to first pixel on line */ + pvt->leftOver = 0; /* Left over bits from last line */ + pvt->width = inf->width; + pvt->depth = inf->depth; + pvt->stride = outf->stride; + pvt->pitch = outf->pitch; + if(!InitBand(flo,ped,sbnd,NO_DATAMAP,(CARD32)1,NO_INPLACE) || + !InitBand(flo,ped,dbnd,NO_DATAMAP,(CARD32)0,NO_INPLACE)) + return(FALSE); + inited = TRUE; + } else { + *outf = *inf; /* Pass data into photomap in native format */ + sbnd->receptor->bypass |= 1<bandSync = NO_SYNC; + + return(inited ? TRUE : + /* Allows data manager to bypass element entirely */ + InitReceptor(flo,ped,pet->receptor,NO_DATAMAP,1,NO_BANDS,ALL_BANDS)); +} /* end InitializeEPhotoUncomByPlane */ + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateEPhotoUncomByPlane(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + meUncompPtr pvt = (meUncompPtr)pet->private; + receptorPtr rcp = pet->receptor; + CARD32 bands = rcp->inFlo->bands; + bandPtr sbnd = rcp->band, dbnd; + CARD32 b, olddlen, nextdlen, width, stride, pitch; + pointer src; + CARD8 *dst; + + for(b = 0; b < bands; ++sbnd, ++b, ++pvt) { + dbnd = &pet->emitter[pvt->bandMap]; + width = sbnd->format->width; + pitch = dbnd->format->pitch; + stride = dbnd->format->stride; + nextdlen = pvt->bitOff + pitch + 7 >> 3; + + if (!(pet->scheduled & 1<current,nextdlen,KEEP); + + while(!ferrCode(flo) && src && dst) { + + (*pvt->action)(src,dst,pvt); + + src = GetNextSrc(flo,pet,sbnd,FLUSH); + pvt->bitOff = pvt->bitOff + pitch & 7; /* Set next */ + olddlen = (pvt->bitOff) ? nextdlen - 1: nextdlen; + nextdlen = pvt->bitOff + pitch + 7 >> 3; + dst = (CARD8*)GetDstBytes(flo,pet,dbnd,dbnd->current+olddlen, + nextdlen,KEEP); + } + FreeData(flo,pet,sbnd,sbnd->current); + + if(!src && sbnd->final) { + if (pvt->bitOff) /* If we have any bits left, send them out now */ + *(CARD8*)GetDstBytes(flo,pet,dbnd,dbnd->current,1,KEEP)=pvt->leftOver; + + SetBandFinal(dbnd); + PutData(flo,pet,dbnd,dbnd->maxGlobal); /* write the remaining data */ + } + } + return(TRUE); +} /* end ActivateEPhotoUncomByPlane */ + + +#if XIE_FULL +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeEPhotoUncomByPixel(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + meUncompPtr pvt = (meUncompPtr)pet->private; + xieTecEncodeUncompressedTriple *tec = + (xieTecEncodeUncompressedTriple *) + ((ePhotoDefPtr)ped->elemPvt)->encodeParms; + formatPtr outf = pet->emitter[0].format; + bandPtr sbnd1,sbnd2,sbnd3; + CARD32 depth1,depth2,depth3,dstride; + int s, d; + + pvt->unaligned = (tec->pixelStride[0] & 7) != 0; + + if(tec->bandOrder == xieValLSFirst) + for(d = 0; d < xieValMaxBands; ++d) + pvt[d].bandMap = d; + else + for(s = 0, d = xieValMaxBands; d--; ++s) + pvt[s].bandMap = d; + + sbnd1 = &pet->receptor[SRCtag].band[pvt[0].bandMap]; + sbnd2 = &pet->receptor[SRCtag].band[pvt[1].bandMap]; + sbnd3 = &pet->receptor[SRCtag].band[pvt[2].bandMap]; + depth1 = pvt[0].depth = sbnd1->format->depth; + depth2 = pvt[1].depth = sbnd2->format->depth; + depth3 = pvt[2].depth = sbnd3->format->depth; + dstride = tec->pixelStride[0]>>3; + pvt[0].width = pvt[1].width = pvt[2].width = sbnd1->format->width; + + if (!pvt->unaligned) { + /* Look for special cases */ + if (depth1 == 16 && depth2 == 16 && depth3 == 16) { +#if (IMAGE_BYTE_ORDER == MSBFirst) + void (*pa)() = (tec->pixelOrder == xieValMSFirst) ? PtoIS : sPtoIS; +#else + void (*pa)() = (tec->pixelOrder == xieValMSFirst) ? sPtoIS : PtoIS; +#endif + for(s = 0; s < xieValMaxBands; s++, pvt++) { + pvt->action = pa; + pvt->Bstride = dstride; + pvt->dstoffset = s; + pvt->mask = 0; /* Unused */ + pvt->shift = 0; /* Unused */ + pvt->clear_dst = FALSE; + } + } else if (depth1 == 8 && depth2 == 8 && depth3 == 8) { + for(s = 0; s < xieValMaxBands; s++, pvt++) { + pvt->action = BtoIS; + pvt->Bstride = dstride; + pvt->dstoffset = s; + pvt->mask = 0; /* Unused */ + pvt->shift = 0; /* Unused */ + pvt->clear_dst = FALSE; + } + } else if (depth1 == 4 && depth2 == 4 && depth3 == 4) { + if (tec->fillOrder == xieValMSFirst) { + pvt->action = BtoISb; + pvt->Bstride = dstride; + pvt->dstoffset = 0; + pvt->mask = 0xf0; + pvt->clear_dst = FALSE; + (pvt++)->shift = 4; + pvt->action = BtoISb; + pvt->Bstride = dstride; + pvt->dstoffset = 0; + pvt->mask = 0x0f; + pvt->clear_dst = FALSE; + (pvt++)->shift = 0; + pvt->action = BtoISb; + pvt->Bstride = dstride; + pvt->dstoffset = 1; + pvt->mask = 0xf0; + pvt->clear_dst = FALSE; + pvt->shift = 4; + } else { /* xieValLSFirst */ + pvt->action = BtoISb; + pvt->Bstride = dstride; + pvt->dstoffset = 0; + pvt->clear_dst = FALSE; + pvt->mask = 0x0f; + (pvt++)->shift = 0; + pvt->action = BtoISb; + pvt->Bstride = dstride; + pvt->dstoffset = 0; + pvt->mask = 0xf0; + pvt->clear_dst = FALSE; + (pvt++)->shift = 4; + pvt->action = BtoISb; + pvt->Bstride = dstride; + pvt->dstoffset = 1; + pvt->mask = 0x0f; + pvt->clear_dst = FALSE; + pvt->shift = 0; + } + } else if (depth1 + depth2 + depth3 <= 8) { + CARD8 ones = 0xff,smask1,smask2,smask3,shift1,shift2,shift3; + if (tec->fillOrder == xieValMSFirst) { + smask1 = ~(ones>>depth1); + smask2 = ~(ones>>(depth1 + depth2) | smask1); + smask3 = ~(ones>>(depth1 + depth2 + depth3) | smask1 | smask2); + shift1 = 8 - depth1; + shift2 = 8 - (depth1 + depth2); + shift3 = 8 - (depth1 + depth2 + depth3); + } else { /* fillOrder == xieValLSFirst */ + smask3 = ~(ones<action = (depth1 > 1) ? BtoISb : btoISb; + pvt->Bstride = dstride; + pvt->dstoffset = 0; + pvt->mask = smask1; + pvt->clear_dst = TRUE; + (pvt++)->shift = shift1; + pvt->action = (depth2 > 1) ? BtoISb : btoISb; + pvt->Bstride = dstride; + pvt->dstoffset = 0; + pvt->mask = smask2; + pvt->clear_dst = TRUE; + (pvt++)->shift = shift2; + pvt->action = (depth3 > 1) ? BtoISb : btoISb; + pvt->Bstride = dstride; + pvt->dstoffset = 0; + pvt->mask = smask3; + pvt->clear_dst = TRUE; + pvt->shift = shift3; + } else + pvt->unaligned = TRUE; + } + pvt = (meUncompPtr)pet->private; + if (pvt->unaligned) { + /* No special cases, do it the hard way */ + pvt[0].pitch = outf->pitch; + pvt->action = EncodeTripleFuncs[tec->pixelOrder == xieValLSFirst ? 0 : 1] + [tec->fillOrder == xieValLSFirst ? 0 : 1] + [depth1 <= 8 ? 0 : 1] + [depth2 <= 8 ? 0 : 1] + [depth3 <= 8 ? 0 : 1]; + if(depth1 == 1 && !(pvt[0].buf = (pointer)XieMalloc(pvt[0].width+7)) || + depth2 == 1 && !(pvt[1].buf = (pointer)XieMalloc(pvt[1].width+7)) || + depth3 == 1 && !(pvt[2].buf = (pointer)XieMalloc(pvt[2].width+7))) + AllocError(flo,ped, return(FALSE)); + } + pet->bandSync = SYNC; + + return(InitReceptors(flo, ped, NO_DATAMAP, 1) && + InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE)); +} /* end InitializeEPhotoUncomByPixel */ + + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateEPhotoUncomByPixel(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + meUncompPtr pvt = (meUncompPtr)pet->private; + bandPtr sb0 = &pet->receptor[SRCtag].band[pvt[0].bandMap]; + bandPtr sb1 = &pet->receptor[SRCtag].band[pvt[1].bandMap]; + bandPtr sb2 = &pet->receptor[SRCtag].band[pvt[2].bandMap]; + bandPtr dbnd = &pet->emitter[0]; + CARD32 pitch = dbnd->format->pitch; + pointer sp0 = (pointer )NULL, sp1 = (pointer )NULL, sp2 = (pointer )NULL; + CARD8 *dst; + + + if (pvt->unaligned) { + CARD32 stride = dbnd->format->stride; + CARD32 width = dbnd->format->width; + CARD32 nextdlen = pvt->bitOff + pitch + 7 >> 3, olddlen; + if((sp0 = GetCurrentSrc(flo,pet,sb0)) && + (sp1 = GetCurrentSrc(flo,pet,sb1)) && + (sp2 = GetCurrentSrc(flo,pet,sb2)) && + (dst = (BytePixel*)GetDstBytes(flo,pet,dbnd,dbnd->current, + nextdlen,KEEP))) + do { + if(pvt[0].buf) sp0 = bitexpand(sp0,pvt[0].buf,width,(char)0,(char)1); + if(pvt[1].buf) sp1 = bitexpand(sp1,pvt[1].buf,width,(char)0,(char)1); + if(pvt[2].buf) sp2 = bitexpand(sp2,pvt[2].buf,width,(char)0,(char)1); + + (*pvt->action)(sp0,sp1,sp2,dst,stride,pvt); + + sp0 = GetNextSrc(flo,pet,sb0,FLUSH); + sp1 = GetNextSrc(flo,pet,sb1,FLUSH); + sp2 = GetNextSrc(flo,pet,sb2,FLUSH); + pvt->bitOff = pvt->bitOff + pitch & 7; /* Set next */ + olddlen = (pvt->bitOff) ? nextdlen - 1 : nextdlen; + nextdlen = pvt->bitOff + pitch + 7 >> 3; + dst = (BytePixel*)GetDstBytes(flo,pet,dbnd, + dbnd->current+olddlen,nextdlen,KEEP); + } while(dst && sp0 && sp1 && sp2); + + } else { + CARD32 dlen = pitch >> 3; /* For nicely aligned data */ + if((sp0 = GetCurrentSrc(flo,pet,sb0)) && + (sp1 = GetCurrentSrc(flo,pet,sb1)) && + (sp2 = GetCurrentSrc(flo,pet,sb2)) && + (dst = (BytePixel*)GetDstBytes(flo,pet,dbnd,dbnd->current,dlen,KEEP))) + + do { + + if (pvt[0].clear_dst) bzero(dst,(int)dlen); + + (*pvt[0].action)(sp0,dst,&pvt[0]); + (*pvt[1].action)(sp1,dst,&pvt[1]); + (*pvt[2].action)(sp2,dst,&pvt[2]); + + sp0 = GetNextSrc(flo,pet,sb0,FLUSH); + sp1 = GetNextSrc(flo,pet,sb1,FLUSH); + sp2 = GetNextSrc(flo,pet,sb2,FLUSH); + dst = (BytePixel*)GetDstBytes(flo,pet,dbnd,dbnd->current+dlen, + dlen,KEEP); + } while(dst && sp0 && sp1 && sp2); + } + + FreeData(flo,pet,sb0,sb0->current); + FreeData(flo,pet,sb1,sb1->current); + FreeData(flo,pet,sb2,sb2->current); + + if(!sp0 && sb0->final && !sp1 && sb1->final && !sp2 && sb2->final) { + if (pvt->bitOff) /* If we have any bits left, send them out now */ + *(CARD8*)GetDstBytes(flo,pet,dbnd,dbnd->current,1,KEEP) = pvt->leftOver; + + SetBandFinal(dbnd); + PutData(flo,pet,dbnd,dbnd->maxGlobal); /* write the remaining data */ + } + + return(TRUE); +} /* end ActivateEPhotoUncomByPixel */ +#endif /* XIE_FULL */ + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetEPhoto(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + meUncompPtr pvt = (meUncompPtr)ped->peTex->private; + int i; + + for(i = 0; i < xieValMaxBands; ++i) + if(pvt[i].buf) pvt[i].buf = (pointer) XieFree(pvt[i].buf); + + ResetReceptors(ped); + ResetEmitter(ped); + + return(TRUE); +} /* end ResetEPhoto */ + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyEPhoto(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.activate = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + + return(TRUE); +} /* end DestroyEPhoto */ + +/* end module mephoto.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/export/meroi.c b/xie/xc/programs/Xserver/XIE/mixie/export/meroi.c new file mode 100644 index 0000000..ccbe457 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/export/meroi.c @@ -0,0 +1,201 @@ +/* $XConsortium: meroi.c,v 1.4 94/04/17 20:34:23 rws Exp $ */ +/**** module meroi.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + meroi.c -- DDXIE export roi element + + Dean Verheiden -- AGE Logic, Inc. August, 1993 + +*****************************************************************************/ + +#define _XIEC_MEROI + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include + + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeEROI(); + +/* + * routines used internal to this module + */ +static int CreateEROI(); +static int InitializeEROI(); +static int ResetEROI(); +static int DestroyEROI(); + +/* + * DDXIE ImportROI entry points + */ +static ddElemVecRec meROIVec = +{ + CreateEROI, + InitializeEROI, + (xieIntProc)NULL, + (xieIntProc)NULL, + ResetEROI, + DestroyEROI +}; + + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeEROI(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* for now just stash our entry point vector in the peDef */ + ped->ddVec = meROIVec; + return TRUE ; +} /* end miAnalyzeEROI */ + + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateEROI(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the roi element definition */ + return MakePETex(flo,ped,NO_PRIVATE,NO_SYNC,NO_SYNC); +} /* end CreateEROI */ + + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeEROI(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* Allows data manager to bypass element entirely */ + return(InitReceptor(flo, ped, ped->peTex->receptor, NO_DATAMAP, 1, NO_BANDS, + ALL_BANDS)); + +} /* end InitializeEROI */ + + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetEROI(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ResetReceptors(ped); + return TRUE; +} /* end ResetEROI */ + + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyEROI(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + return TRUE; +} /* end DestroyEROI */ + +/* end module meroi.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/export/meuncomp.c b/xie/xc/programs/Xserver/XIE/mixie/export/meuncomp.c new file mode 100644 index 0000000..fa4016a --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/export/meuncomp.c @@ -0,0 +1,1368 @@ +/* $XConsortium: meuncomp.c,v 1.4 94/04/17 20:34:24 rws Exp $ */ +/**** module meuncomp.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + meuncomp.c -- DDXIE routines for exporting uncompressed data + + Dean Verheiden -- AGE Logic, Inc. October 1993 + +*****************************************************************************/ + +#define _XIEC_MEUNCOMP + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include + + +/***********************************************************************/ +/****************** Aligned data conversion routines *******************/ +/***********************************************************************/ + +/* Band by Plane action routines */ + +/* bits to stream */ +void btoS(src,dst,pvt) +BytePixel *src, *dst; +meUncompPtr pvt; +{ + memcpy((char *)dst,(char *)src, (int)pvt->width + 7 >> 3); +} + +/* swapped bits to stream */ +void sbtoS(src,dst,pvt) +BytePixel *src, *dst; +meUncompPtr pvt; +{ +int i, count; + + count = pvt->width + 7 >> 3; /* Pack down to bits */ + + for (i = 0; i < count; i++) *dst++ = _ByteReverseTable[*src++]; +} + +/* bits to stream with pad */ +void btoIS(src,dst,pvt) +BytePixel *src, *dst; +meUncompPtr pvt; +{ +CARD32 stride = pvt->stride; +CARD32 width = pvt->width; +CARD32 pitch = pvt->pitch; +CARD32 j = pvt->bitOff; +CARD32 i; + + if (j) /* Don't bzero partial byte left from last scanline */ + bzero(dst + 1,(j + pitch + 7 >> 3) - 1); + else + bzero(dst,pitch + 7 >> 3); + + for (i = 0; i < width; i++, j += stride) { + if (LOGBYTE_tstbit(src,i) != 0) { + LOGBYTE_setbit(dst,j); + } + } +} + +/* swapped bits to stream with pad */ +void sbtoIS(src,dst,pvt) +BytePixel *src, *dst; +meUncompPtr pvt; +{ +CARD32 stride = pvt->stride; +CARD32 width = pvt->width; +CARD32 pitch = pvt->pitch; +CARD32 j = pvt->bitOff; +CARD32 i, s; + + if (j) /* Don't bzero partial byte left from last scanline */ + bzero(dst + 1,(j + pitch + 7 >> 3) - 1); + else + bzero(dst,pitch + 7 >> 3); + + for (i = 0; i < width; i++, j += stride) { + s = j ^ 7; /* Larry swap */ + if (LOGBYTE_tstbit(src,i) != 0) { + LOGBYTE_setbit(dst,s); + } + } +} + +/* BytePixel to Stream, no offsets */ +void BtoS(src, dst, pvt) +BytePixel *src, *dst; +meUncompPtr pvt; +{ +int width = pvt->width; + + memcpy((char *)dst,(char *)src,width); +} + +/* PairPixel to Stream, no swapping */ +void PtoS(src, dst, pvt) +PairPixel *src, *dst; +meUncompPtr pvt; +{ +int width = pvt->width << 1; + + memcpy((char *)dst,(char *)src,width); +} + +/* PairPixel to Stream, with swapping */ +void sPtoS(src, dst, pvt) +PairPixel *src, *dst; +meUncompPtr pvt; +{ +int i; + + for (i = 0; i < pvt->width; i++) { cpswaps(src[i],dst[i]); } +} + +/* QuadPixel to Stream, no swapping */ +void QtoS(src, dst, pvt) +QuadPixel *src, *dst; +meUncompPtr pvt; +{ +int width = pvt->width << 2; + + memcpy((char *)dst,(char *)src,width); +} + +/* QuadPixel to Stream, with swapping */ +void sQtoS(src, dst, pvt) +QuadPixel *src, *dst; +meUncompPtr pvt; +{ +int i; + + for (i = 0; i < pvt->width; i++) { cpswapl(src[i],dst[i]); } +} + +/* QuadPixel (unswapped) to padded Stream */ +void QtoIS(src, dst, pvt) +QuadPixel *src, *dst; +meUncompPtr pvt; +{ +CARD32 Bstride = pvt->Bstride; +CARD32 width = pvt->width; +int i; + for (i = 0; i < width; i++, dst += Bstride) *dst = *src++; +} + +/* QuadPixel (swapped) to padded Stream */ +void sQtoIS(src, dst, pvt) +QuadPixel *src, *dst; +meUncompPtr pvt; +{ +CARD32 Bstride = pvt->Bstride; +CARD32 width = pvt->width; +int i; + for (i = 0; i < width; i++, dst += Bstride) { cpswapl(src[i], *dst); } +} + +/* Triple Band Byte by Pixel Action routines */ + +/* Bits to Interleaved stream bits */ +void btoISb(isrc, dst, pvt) +BytePixel *isrc, *dst; +meUncompPtr pvt; +{ +CARD32 Bstride = pvt->Bstride; +CARD32 width = pvt->width; +CARD8 mask = pvt->mask; +LogInt *src = (LogInt *)isrc; +int i; + + dst += pvt->dstoffset; + for (i = 0; i < width; i++, dst += Bstride) + if (LOG_tstbit(src,i) != 0) + *dst |= mask; +} + +/* BytePixels to Interleaved Stream in bits */ +void BtoISb(src, dst, pvt) +BytePixel *src, *dst; +meUncompPtr pvt; +{ +CARD32 Bstride = pvt->Bstride; +CARD32 width = pvt->width; +CARD8 mask = pvt->mask; +CARD8 shift = pvt->shift; +int i; + + dst += pvt->dstoffset; + for (i = 0; i < width; i++, dst += Bstride) + *dst |= *src++ << shift & mask; +} + +/* BytePixel to Interleaved Stream */ +void BtoIS(src, dst, pvt) +BytePixel *src, *dst; +meUncompPtr pvt; +{ +CARD32 Bstride = pvt->Bstride; +CARD32 width = pvt->width; +int i; + + dst += pvt->dstoffset; + for (i = 0; i < width; i++, dst += Bstride) + *dst = *src++; +} + +/* PairPixel (unswapped) to Interleaved Stream */ +void PtoIS(src, idst, pvt) +PairPixel *src, *idst; +meUncompPtr pvt; +{ +CARD32 Bstride = pvt->Bstride; +CARD32 width = pvt->width; +CARD8 *dst = ((CARD8 *)idst) + pvt->dstoffset; +int i; + for (i = 0; i < width; i++, dst += Bstride) + *((PairPixel *)dst) = *src++; +} + +/* PairPixel (swapped) to Interleaved Stream */ +void sPtoIS(src, idst, pvt) +PairPixel *src, *idst; +meUncompPtr pvt; +{ +CARD32 Bstride = pvt->Bstride; +CARD32 width = pvt->width; +CARD8 *dst = ((CARD8 *)idst) + pvt->dstoffset; +int i; + for (i = 0; i < width; i++, dst += Bstride) { + PairPixel sval = *src++; + *dst = (sval >> 8) | (sval << 8); + } +} + +/***********************************************************************/ +/***************** Unaligned data conversion routines ******************/ +/***********************************************************************/ + +/* Pack a line of byte pixels */ +/* Pixel Order = LSB, Fill Order = LSB */ +void BtoLLUB(src, dst, pvt) +BytePixel *src; +CARD8 *dst; +meUncompPtr pvt; +{ +BytePixel *send = &src[pvt->width]; +CARD32 pitch = pvt->pitch; +CARD32 stride = pvt->stride; +CARD16 outb = pvt->leftOver; +CARD16 bits = pvt->bitOff; + + while (src < send) { + outb |= (CARD16)*src++ << bits; + bits += stride; + while (bits > 7) { + *dst++ = (CARD8)outb; + outb >>= 8; + bits -= 8; + } + } + + /* If something leftover, either write it out or save for packing */ + if (bits) { + if (pitch & 7) { + pvt->leftOver = outb; + } else { + *dst = (CARD8)outb; + pvt->leftOver = 0; + } + } else + pvt->leftOver = 0; +} + +/* Pack a line of byte pixels */ +/* Pixel Order = LSB, Fill Order = MSB */ +void BtoLMUB(src, dst, pvt) +BytePixel *src; +CARD8 *dst; +meUncompPtr pvt; +{ +BytePixel *send = &src[pvt->width]; +CARD32 pitch = pvt->pitch; +CARD32 stride = pvt->stride; +CARD32 depth = pvt->depth; +CARD16 bits = pvt->bitOff; +CARD16 outb = pvt->leftOver; +CARD32 pad = stride - depth; + + while (src < send) { + CARD8 sval = *src++; + + if (bits + depth <= 8) { /* Pack into existing byte only */ + outb |= sval << (8 - bits - depth); + if (bits + depth == 8) { + *dst++ = (CARD8)outb; + outb = 0; + bits = 0; + } else + bits += depth; + } else { /* Split between bytes */ + outb |= (CARD8)(sval << bits) >> bits;/* Chop off top bits*/ + *dst++ = (CARD8)outb; + if (bits + depth <= 16) { + outb = (CARD8)(sval >> 8 - bits) << 16 - depth - bits; + bits = bits + depth - 8; /* watch those signs */ + if (bits + depth == 16) { + *dst++ = (CARD8)outb; + outb = 0; + bits = 0; + } + } + } + if (bits + pad > 8) { + *dst++ = outb; + outb = 0; + bits = bits + pad - 8; + while (bits > 7) { + *dst++ = 0; + bits -= 8; + } + } else + bits += pad; + } + + /* If something leftover, either write it out or save for packing */ + if (bits) { + if (pitch & 7) { + pvt->leftOver = outb; + } else { + *dst = (CARD8)outb; + pvt->leftOver = 0; + } + } else + pvt->leftOver = 0; +} + +/* Pack a line of byte pixels */ +/* Pixel Order = MSB, Fill Order = LSB */ +void BtoMLUB(src, dst, pvt) +BytePixel *src; +CARD8 *dst; +meUncompPtr pvt; +{ +BytePixel *send = &src[pvt->width]; +CARD32 pitch = pvt->pitch; +CARD32 depth = pvt->depth; +CARD32 stride = pvt->stride; +CARD16 bits = pvt->bitOff; +CARD16 outb = pvt->leftOver; +CARD32 pad = stride - depth; + + while (src < send) { + CARD8 sval = *src++; + + if (bits + depth <= 8) { /* Pack into existing byte only */ + outb |= sval << bits; + if (bits + depth == 8) { + *dst++ = (CARD8)outb; + outb = 0; + bits = 0; + } else + bits += depth; + } else if (bits + depth <= 16) { + outb |= (CARD8)(sval >> depth + bits - 8) << bits; + *dst++ = (CARD8)outb; + outb = (CARD8)(sval << 16 - depth - bits) >> 16 - depth - bits; + if (bits + depth == 16) { + *dst++ = (CARD8)outb; + outb = 0; + bits = 0; + } else + bits = bits + depth - 8; + } + if (bits + pad > 8) { + *dst++ = outb; + outb = 0; + bits = bits + pad - 8; + while (bits > 7) { + *dst++ = 0; + bits -= 8; + } + } else + bits += pad; + } + + + /* If something leftover, either write it out or save for packing */ + if (bits) { + if (pitch & 7) { + pvt->leftOver = outb; + } else { + *dst = (CARD8)outb; + pvt->leftOver = 0; + } + } else + pvt->leftOver = 0; +} + +void BtoMMUB(src, dst, pvt) +BytePixel *src; +CARD8 *dst; +meUncompPtr pvt; +{ +BytePixel *send = &src[pvt->width]; +CARD32 pitch = pvt->pitch; +CARD32 depth = pvt->depth; +CARD32 stride = pvt->stride; +CARD16 bits = pvt->bitOff; +CARD16 outb = pvt->leftOver; +CARD32 pad = stride - depth; + + while (src < send) { + CARD8 sval = *src++; + + if (bits + depth <= 8) { /* Pack into existing byte only */ + outb |= sval << 8 - depth - bits; + if (bits + depth == 8) { + *dst++ = (CARD8)outb; + outb = 0; + bits = 0; + } else + bits += depth; + } else if (bits + depth <= 16) { + outb |= sval >> depth + bits - 8; + *dst++ = (CARD8)outb; + outb = sval << 16 - depth - bits; + if (bits + depth == 16) { + *dst++ = (CARD8)outb; + outb = 0; + bits = 0; + } else + bits = bits + depth - 8; + } + if (bits + pad > 8) { + *dst++ = outb; + outb = 0; + bits = bits + pad - 8; + while (bits > 7) { + *dst++ = 0; + bits -= 8; + } + } else + bits += pad; + } + + + /* If something leftover, either write it out or save for packing */ + if (bits) { + if (pitch & 7) { + pvt->leftOver = outb; + } else { + *dst = (CARD8)outb; + pvt->leftOver = 0; + } + } else + pvt->leftOver = 0; +} + +/* Pack a line of pair pixels */ +/* Pixel Order = LSB, Fill Order = LSB */ +void PtoLLUP(src, dst, pvt) +PairPixel *src; +CARD8 *dst; +meUncompPtr pvt; +{ +PairPixel *send = &src[pvt->width]; +CARD32 pitch = pvt->pitch; +CARD32 stride = pvt->stride; +CARD32 outb = pvt->leftOver; +CARD16 bits = pvt->bitOff; + + while (src < send) { + outb |= *src++ << bits; + bits += stride; + while (bits > 7) { + *dst++ = (CARD8)outb; + outb >>= 8; + bits -= 8; + } + } + + /* If something leftover, either write it out or save for packing */ + if (bits) { + if (pitch & 7) { + pvt->leftOver = outb; + } else { + *dst = (CARD8)outb; + pvt->leftOver = 0; + } + } else + pvt->leftOver = 0; +} + +/* Pack a line of pair pixels */ +/* Pixel Order = LSB, Fill Order = MSB */ +void PtoLMUP(src, dst, pvt) +PairPixel *src; +CARD8 *dst; +meUncompPtr pvt; +{ +PairPixel *send = &src[pvt->width]; +CARD32 pitch = pvt->pitch; +CARD32 depth = pvt->depth; +CARD32 stride = pvt->stride; +CARD32 outb = pvt->leftOver; +CARD16 bits = pvt->bitOff; +CARD32 pad = stride - depth; + + while (src < send) { + CARD16 sval = *src++; + + if (bits + depth <= 16) { + outb |= (CARD16)(sval << 8 + bits) >> 8 + bits; + *dst++ = (CARD8)outb; + outb = (CARD8)(sval >> 8 - bits) << 16 - depth - bits; + if (bits + depth == 16) { + *dst++ = (CARD8)outb; + outb = 0; + bits = 0; + } else + bits = bits + depth - 8; /* watch those signs */ + } else { + outb |= (CARD16)(sval << 8 + bits) >> 8 + bits; + *dst++ = (CARD8)outb; + *dst++ = (CARD8)((CARD16)(sval << bits) >> 8); + outb = (CARD8)(sval >> 16 - bits) << 24 - depth - bits; + if (bits + depth == 24) { + *dst++ = (CARD8)outb; + outb = 0; + bits = 0; + } else + bits = bits + depth - 16; /* watch those signs */ + } + if (bits + pad > 8) { + *dst++ = outb; + outb = 0; + bits = bits + pad - 8; + while (bits > 7) { + *dst++ = 0; + bits -= 8; + } + } else + bits += pad; + } + + /* If something leftover, either write it out or save for packing */ + if (bits) { + if (pitch & 7) { + pvt->leftOver = outb; + } else { + *dst = (CARD8)outb; + pvt->leftOver = 0; + } + } else + pvt->leftOver = 0; +} + +/* Pack a line of pair pixels */ +/* Pixel Order = MSB, Fill Order = LSB */ +void PtoMLUP(src, dst, pvt) +PairPixel *src; +CARD8 *dst; +meUncompPtr pvt; +{ +PairPixel *send = &src[pvt->width]; +CARD32 pitch = pvt->pitch; +CARD32 depth = pvt->depth; +CARD32 stride = pvt->stride; +CARD32 outb = pvt->leftOver; +CARD16 bits = pvt->bitOff; +CARD32 pad = stride - depth; + + while (src < send) { + CARD16 sval = *src++; + + if (bits + depth <= 16) { + outb |= (sval >> depth + bits - 8) << bits; + *dst++ = (CARD8)outb; + outb = (CARD16)(sval << 24 - depth - bits) >> 24 - depth - bits; + if (bits + depth == 16) { + *dst++ = (CARD8)outb; + outb = 0; + bits = 0; + } else + bits = bits + depth - 8; + } else { + outb |= (sval >> depth + bits - 8) << bits; + *dst++ = (CARD8)outb; + *dst++ = (CARD8)(sval >> depth + bits - 16); + outb = (CARD8)(sval << 24 - depth - bits) >> 24 - depth - bits; + if (bits + depth == 24) { + *dst++ = (CARD8)outb; + outb = 0; + bits = 0; + } else + bits = bits + depth - 16; + } + if (bits + pad > 8) { + *dst++ = outb; + outb = 0; + bits = bits + pad - 8; + while (bits > 7) { + *dst++ = 0; + bits -= 8; + } + } else + bits += pad; + } + + + /* If something leftover, either write it out or save for packing */ + if (bits) { + if (pitch & 7) { + pvt->leftOver = outb; + } else { + *dst = (CARD8)outb; + pvt->leftOver = 0; + } + } else + pvt->leftOver = 0; +} + +void PtoMMUP(src, dst, pvt) +PairPixel *src; +CARD8 *dst; +meUncompPtr pvt; +{ +PairPixel *send = &src[pvt->width]; +CARD32 pitch = pvt->pitch; +CARD32 depth = pvt->depth; +CARD32 stride = pvt->stride; +CARD32 outb = pvt->leftOver; +CARD16 bits = pvt->bitOff; +CARD32 pad = stride - depth; + + while (src < send) { + CARD16 sval = *src++; + + if (bits + depth <= 16) { + outb |= sval >> depth + bits - 8; + *dst++ = (CARD8)outb; + outb = sval << 16 - depth - bits; + if (bits + depth == 16) { + *dst++ = (CARD8)outb; + outb = 0; + bits = 0; + } else + bits = bits + depth - 8; + } else { + outb |= sval >> depth + bits - 8; + *dst++ = (CARD8)outb; + *dst++ = (CARD8)(sval >> depth + bits - 16); + outb = sval << 24 - depth - bits; + if (bits + depth == 24) { + *dst++ = (CARD8)outb; + outb = 0; + bits = 0; + } else + bits = bits + depth - 16; + } + if (bits + pad > 8) { + *dst++ = outb; + outb = 0; + bits = bits + pad - 8; + while (bits > 7) { + *dst++ = 0; + bits -= 8; + } + } else + bits += pad; + } + + + /* If something leftover, either write it out or save for packing */ + if (bits) { + if (pitch & 7) { + pvt->leftOver = (CARD8)outb; + } else { + *dst = (CARD8)outb; + pvt->leftOver = 0; + } + } else + pvt->leftOver = 0; +} + +/* Pack a line of quad pixels */ +/* Pixel Order = LSB, Fill Order = LSB */ +void QtoLLUQ(src, dst, pvt) +QuadPixel *src; +CARD8 *dst; +meUncompPtr pvt; +{ +QuadPixel *send = &src[pvt->width]; +CARD32 pitch = pvt->pitch; +CARD32 stride = pvt->stride; +CARD32 outb0 = pvt->leftOver, outb1; +CARD16 bits = pvt->bitOff; + + while (src < send) { + if (bits) { /* Yuck, do a multi word shift */ + outb1 = *src >> (32 - bits); + outb0 |= *src++ << bits; + } else { + outb1 = 0; + outb0 = *src++; + } + bits += stride; + while (bits > 7) { + *dst++ = (CARD8)outb0; + outb0 >>= 8; + if (bits > 32) { + outb0 |= outb1 << 24; + outb1 >>= 8; + } + bits -= 8; + } + } + + /* If something leftover, either write it out or save for packing */ + if (bits) { + if (pitch & 7) { + pvt->leftOver = (CARD8)outb0; + } else { + *dst = (CARD8)outb0; + pvt->leftOver = 0; + } + } else + pvt->leftOver = 0; +} + +/* Pack a line of quad pixels */ +/* Pixel Order = LSB, Fill Order = MSB */ +void QtoLMUQ(src, dst, pvt) +QuadPixel *src; +CARD8 *dst; +meUncompPtr pvt; +{ +QuadPixel *send = &src[pvt->width]; +CARD32 pitch = pvt->pitch; +CARD32 stride = pvt->stride; +CARD32 depth = pvt->depth; +CARD32 outb = pvt->leftOver; +CARD16 bits = pvt->bitOff; +CARD32 pad = stride - depth; + + while (src < send) { + CARD32 sval = *src++; + + if (bits + depth <= 24) { + outb |= (sval << 24 + bits) >> 24 + bits; + *dst++ = (CARD8)outb; + *dst++ = (CARD8)(sval >> 8 - bits); + outb = (CARD8)(sval >> 16 - bits) << 24 - depth - bits; + if (bits + depth == 24) { + *dst++ = (CARD8)outb; + outb = 0; + bits = 0; + } else + bits = bits + depth - 16; /* watch those signs */ + } else { + outb |= (sval << 24 + bits) >> 24 + bits; + *dst++ = (CARD8)outb; + *dst++ = (CARD8)(sval >> 8 - bits); + *dst++ = (CARD8)(sval >> 16 - bits); + outb = (CARD8)(sval >> 24 - bits) << 32 - depth - bits; + if (bits + depth == 32) { + *dst++ = (CARD8)outb; + outb = 0; + bits = 0; + } else + bits = bits + depth - 24; /* watch those signs */ + } + if (bits + pad > 8) { + *dst++ = outb; + outb = 0; + bits = bits + pad - 8; + while (bits > 7) { + *dst++ = 0; + bits -= 8; + } + } else + bits += pad; + } + + /* If something leftover, either write it out or save for packing */ + if (bits) { + if (pitch & 7) { + pvt->leftOver = (CARD8)outb; + } else { + *dst = (CARD8)outb; + pvt->leftOver = 0; + } + } else + pvt->leftOver = 0; +} + +/* Pack a line of quad pixels */ +/* Pixel Order = MSB, Fill Order = LSB */ +void QtoMLUQ(src, dst, pvt) +QuadPixel *src; +CARD8 *dst; +meUncompPtr pvt; +{ +QuadPixel *send = &src[pvt->width]; +CARD32 pitch = pvt->pitch; +CARD32 depth = pvt->depth; +CARD32 stride = pvt->stride; +CARD32 outb = pvt->leftOver; +CARD16 bits = pvt->bitOff; +CARD32 pad = stride - depth; + + while (src < send) { + CARD32 sval = *src++; + + if (bits + depth <= 24) { + outb |= (sval >> depth + bits - 8) << bits; + *dst++ = (CARD8)outb; + *dst++ = (CARD8)(sval >> depth + bits - 16); + outb = (sval << 48 - depth - bits) >> 48 - depth - bits; + if (bits + depth == 24) { + *dst++ = (CARD8)outb; + outb = 0; + bits = 0; + } else + bits = bits + depth - 16; + } else { + outb |= (sval >> depth + bits - 8) << bits; + *dst++ = (CARD8)outb; + *dst++ = (CARD8)(sval >> depth + bits - 16); + *dst++ = (CARD8)(sval >> depth + bits - 24); + outb = (sval << 56 - depth - bits) >> 56 - depth - bits; + if (bits + depth == 32) { + *dst++ = (CARD8)outb; + outb = 0; + bits = 0; + } else + bits = bits + depth - 24; + } + if (bits + pad > 8) { + *dst++ = outb; + outb = 0; + bits = bits + pad - 8; + while (bits > 7) { + *dst++ = 0; + bits -= 8; + } + } else + bits += pad; + } + + + /* If something leftover, either write it out or save for packing */ + if (bits) { + if (pitch & 7) { + pvt->leftOver = outb; + } else { + *dst = (CARD8)outb; + pvt->leftOver = 0; + } + } else + pvt->leftOver = 0; +} + +/* Pack a line of quad pixels */ +/* Pixel Order = MSB, Fill Order = MSB */ +void QtoMMUQ(src, dst, pvt) +QuadPixel *src; +CARD8 *dst; +meUncompPtr pvt; +{ +QuadPixel *send = &src[pvt->width]; +CARD32 pitch = pvt->pitch; +CARD32 depth = pvt->depth; +CARD32 stride = pvt->stride; +CARD32 outb = pvt->leftOver; +CARD16 bits = pvt->bitOff; +CARD32 pad = stride - depth; + + while (src < send) { + CARD32 sval = *src++; + + if (bits + depth <= 24) { + outb |= sval >> depth + bits - 8; + *dst++ = (CARD8)outb; + *dst++ = (CARD8)(sval >> depth + bits - 16); + outb = (sval << 48 - depth - bits) >> 24; + if (bits + depth == 24) { + *dst++ = (CARD8)outb; + outb = 0; + bits = 0; + } else + bits = bits + depth - 16; + } else { + outb |= sval >> depth + bits - 8; + *dst++ = (CARD8)outb; + *dst++ = (CARD8)(sval >> depth + bits - 16); + *dst++ = (CARD8)(sval >> depth + bits - 24); + outb = (sval << 56 - depth - bits) >> 24; + if (bits + depth == 32) { + *dst++ = (CARD8)outb; + outb = 0; + bits = 0; + } else + bits = bits + depth - 24; + } + if (bits + pad > 8) { + *dst++ = outb; + outb = 0; + bits = bits + pad - 8; + while (bits > 7) { + *dst++ = 0; + bits -= 8; + } + } else + bits += pad; + } + + + /* If something leftover, either write it out or save for packing */ + if (bits) { + if (pitch & 7) { + pvt->leftOver = (CARD8)outb; + } else { + *dst = (CARD8)outb; + pvt->leftOver = 0; + } + } else + pvt->leftOver = 0; +} + +/* Pack a triple band by pixel line of pixels */ +/* Pixel Order = LSB, Fill Order = LSB */ +#define ConvertToLLTB(fname,itype0,itype1,itype2) \ +void fname(src0, src1, src2, dst, tristride, pvt) \ +itype0 *src0; \ +itype1 *src1; \ +itype2 *src2; \ +CARD8 *dst; \ +CARD32 tristride; \ +meUncompPtr pvt; \ +{ \ +itype0 *send = &src0[pvt->width];/* All three bands are same width */ \ +CARD32 pitch = pvt->pitch; \ +CARD32 outb = pvt->leftOver; \ +CARD16 bits = pvt->bitOff; \ +CARD32 depth0 = pvt[0].depth; \ +CARD32 depth1 = pvt[1].depth; \ +CARD32 tripad = tristride - pvt[0].depth - pvt[1].depth; \ + while (src0 < send) { \ + outb |= (CARD32)*src0++ << bits; \ + bits += depth0; \ + while (bits > 7) { \ + *dst++ = (CARD8)outb; \ + outb >>= 8; \ + bits -= 8; \ + } \ + outb |= (CARD32)*src1++ << bits; \ + bits += depth1; \ + while (bits > 7) { \ + *dst++ = (CARD8)outb; \ + outb >>= 8; \ + bits -= 8; \ + } \ + outb |= (CARD32)*src2++ << bits; \ + bits += tripad; \ + while (bits > 7) { \ + *dst++ = (CARD8)outb; \ + outb >>= 8; \ + bits -= 8; \ + } \ + } \ + if (bits) { \ + if (pitch & 7) { \ + pvt->leftOver = outb; \ + } else { \ + *dst = (CARD8)outb; \ + pvt->leftOver = 0; \ + } \ + } else \ + pvt->leftOver = 0; \ +} + +/* Pack a triple band by pixel line of pixels */ +/* Pixel Order = LSB, Fill Order = MSB */ +/* Broken in two parts because some preprocessors cannot handle the full size*/ +#define ConvertToLMTB2() \ + if (bits + tripad > 8) { \ + *dst++ = outb; \ + outb = 0; \ + bits = bits + tripad - 8; \ + while (bits > 7) { \ + *dst++ = 0; \ + bits -= 8; \ + } \ + } else \ + bits += tripad; \ + } \ + if (bits) { \ + if (pitch & 7) { \ + pvt->leftOver = outb; \ + } else { \ + *dst = (CARD8)outb; \ + pvt->leftOver = 0; \ + } \ + } else \ + pvt->leftOver = 0; + +#define ConvertToLMTB(fname,xietype0,xietype1,xietype2) \ +void fname(src0, src1, src2, dst, tristride, pvt) \ +xietype0 *src0; \ +xietype1 *src1; \ +xietype2 *src2; \ +CARD8 *dst; \ +CARD32 tristride; \ +meUncompPtr pvt; \ +{ \ +xietype0 *send = &src0[pvt->width];/* All three bands are same width */ \ +CARD32 pitch = pvt->pitch; \ +CARD32 outb = pvt->leftOver; \ +CARD16 bits = pvt->bitOff; \ +CARD32 tripad = tristride - pvt[0].depth - pvt[1].depth - pvt[2].depth;\ +CARD32 b; \ + while (src0 < send) { \ + CARD16 svals[3]; \ + svals[0] = *src0++; svals[1] = *src1++; svals[2] = *src2++; \ + for (b = 0; b < 3; b++) { \ + CARD16 sval = svals[b]; \ + CARD32 depth = pvt[b].depth; \ + if (bits + depth <= 8) { /* Pack into existing byte only */\ + outb |= sval << 8 - depth - bits; \ + if (bits + depth == 8) { \ + *dst++ = (CARD8)outb; \ + outb = 0; \ + bits = 0; \ + } else \ + bits += depth; \ + } else if (bits + depth <= 16) { \ + outb |= (CARD16)(sval << 8 + bits) >> 8 + bits; \ + *dst++ = (CARD8)outb; \ + outb = (CARD8)(sval >> 8 - bits) << 16 - depth - bits; \ + if (bits + depth == 16) { \ + *dst++ = (CARD8)outb; \ + outb = 0; \ + bits = 0; \ + } else \ + bits = bits + depth - 8; /* watch those signs */ \ + } else { \ + outb |= (CARD16)(sval << 8 + bits) >> 8 + bits; \ + *dst++ = (CARD8)outb; \ + *dst++ = (CARD8)((CARD16)(sval << bits) >> 8); \ + outb = (CARD8)(sval >> 16 - bits) << 24 - depth - bits; \ + if (bits + depth == 24) { \ + *dst++ = (CARD8)outb; \ + outb = 0; \ + bits = 0; \ + } else \ + bits = bits + depth - 16; /* watch those signs */ \ + } \ + } \ + ConvertToLMTB2() \ +} + +/* Pack a triple band by pixel line of pixels */ +/* Pixel Order = MSB, Fill Order = LSB */ +/* Broken in two parts because some preprocessors cannot handle the full size*/ +#define ConvertToMLTB2() \ + if (bits + tripad > 8) { \ + *dst++ = outb; \ + outb = 0; \ + bits = bits + tripad - 8; \ + while (bits > 7) { \ + *dst++ = 0; \ + bits -= 8; \ + } \ + } else \ + bits += tripad; \ + } \ + if (bits) { \ + if (pitch & 7) { \ + pvt->leftOver = outb; \ + } else { \ + *dst = (CARD8)outb; \ + pvt->leftOver = 0; \ + } \ + } else \ + pvt->leftOver = 0; + +#define ConvertToMLTB(fname,itype0,itype1,itype2) \ +void fname(src0, src1, src2, dst, tristride, pvt) \ +itype0 *src0; \ +itype1 *src1; \ +itype2 *src2; \ +CARD8 *dst; \ +CARD32 tristride; \ +meUncompPtr pvt; \ +{ \ +itype0 *send = &src0[pvt->width];/* All three bands are same width */ \ +CARD32 pitch = pvt->pitch; \ +CARD32 outb = pvt->leftOver; \ +CARD16 bits = pvt->bitOff; \ +CARD32 tripad = tristride - pvt[0].depth - pvt[1].depth - pvt[2].depth;\ +CARD32 b; \ + while (src0 < send) { \ + CARD16 svals[3]; \ + svals[0] = *src0++; svals[1] = *src1++; svals[2] = *src2++; \ + for (b = 0; b < 3; b++) { \ + CARD16 sval = svals[b]; \ + CARD32 depth = pvt[b].depth; \ + if (bits + depth <= 8) { /* Pack into existing byte only */\ + outb |= sval << bits; \ + if (bits + depth == 8) { \ + *dst++ = (CARD8)outb; \ + outb = 0; \ + bits = 0; \ + } else \ + bits += depth; \ + } else if (bits + depth <= 16) { \ + outb |= (sval >> depth + bits - 8) << bits; \ + *dst++ = (CARD8)outb; \ + outb = (CARD16)(sval << 24 - depth - bits) >> 24 - depth - bits; \ + if (bits + depth == 16) { \ + *dst++ = (CARD8)outb; \ + outb = 0; \ + bits = 0; \ + } else \ + bits = bits + depth - 8; \ + } else { \ + outb |= (sval >> depth + bits - 8) << bits; \ + *dst++ = (CARD8)outb; \ + *dst++ = (CARD8)(sval >> depth + bits - 16); \ + outb = (CARD8)(sval << 24 - depth - bits) >> 24 - depth - bits;\ + if (bits + depth == 24) { \ + *dst++ = (CARD8)outb; \ + outb = 0; \ + bits = 0; \ + } else \ + bits = bits + depth - 16; \ + } \ + } \ + ConvertToMLTB2() \ +} + +/* Pack a triple band by pixel line of pixels */ +/* Pixel Order = MSB, Fill Order = MSB */ +/* Broken in two parts because some preprocessors cannot handle the full size*/ +#define ConvertToMMTB2() \ + if (bits + tripad > 8) { \ + *dst++ = outb; \ + outb = 0; \ + bits = bits + tripad - 8; \ + while (bits > 7) { \ + *dst++ = 0; \ + bits -= 8; \ + } \ + } else \ + bits += tripad; \ + } \ + if (bits) { \ + if (pitch & 7) { \ + pvt->leftOver = (CARD8)outb; \ + } else { \ + *dst = (CARD8)outb; \ + pvt->leftOver = 0; \ + } \ + } else \ + pvt->leftOver = 0; + +#define ConvertToMMTB(fname,itype0,itype1,itype2) \ +void fname(src0, src1, src2, dst, tristride, pvt) \ +itype0 *src0; \ +itype1 *src1; \ +itype2 *src2; \ +CARD8 *dst; \ +CARD32 tristride; \ +meUncompPtr pvt; \ +{ \ +itype0 *send = &src0[pvt->width];/* All three bands are same width */ \ +CARD32 pitch = pvt->pitch; \ +CARD32 outb = pvt->leftOver; \ +CARD16 bits = pvt->bitOff; \ +CARD32 tripad = tristride - pvt[0].depth - pvt[1].depth - pvt[2].depth;\ +CARD32 b; \ + while (src0 < send) { \ + CARD16 svals[3]; \ + svals[0] = *src0++; svals[1] = *src1++; svals[2] = *src2++; \ + for (b = 0; b < 3; b++) { \ + CARD16 sval = svals[b]; \ + CARD32 depth; \ + depth = pvt[b].depth; \ + if (bits + depth <= 8) {/* Pack into existing byte only */ \ + outb |= sval << 8 - depth - bits; \ + if (bits + depth == 8) { \ + *dst++ = (CARD8)outb; \ + outb = 0; \ + bits = 0; \ + } else \ + bits += depth; \ + } else if (bits + depth <= 16) { \ + outb |= sval >> depth + bits - 8; \ + *dst++ = (CARD8)outb; \ + outb = sval << 16 - depth - bits; \ + if (bits + depth == 16) { \ + *dst++ = (CARD8)outb; \ + outb = 0; \ + bits = 0; \ + } else \ + bits = bits + depth - 8; \ + } else { \ + outb |= sval >> depth + bits - 8; \ + *dst++ = (CARD8)outb; \ + *dst++ = (CARD8)(sval >> depth + bits - 16); \ + outb = sval << 24 - depth - bits; \ + if (bits + depth == 24) { \ + *dst++ = (CARD8)outb; \ + outb = 0; \ + bits = 0; \ + } else \ + bits = bits + depth - 16; \ + } \ + } \ + ConvertToMMTB2() \ +} + + +ConvertToLLTB(BBBtoLLTB,BytePixel,BytePixel,BytePixel) +ConvertToLMTB(BBBtoLMTB,BytePixel,BytePixel,BytePixel) +ConvertToMLTB(BBBtoMLTB,BytePixel,BytePixel,BytePixel) +ConvertToMMTB(BBBtoMMTB,BytePixel,BytePixel,BytePixel) + +ConvertToLLTB(BBPtoLLTB,BytePixel,BytePixel,PairPixel) +ConvertToLMTB(BBPtoLMTB,BytePixel,BytePixel,PairPixel) +ConvertToMLTB(BBPtoMLTB,BytePixel,BytePixel,PairPixel) +ConvertToMMTB(BBPtoMMTB,BytePixel,BytePixel,PairPixel) + +ConvertToLLTB(BPBtoLLTB,BytePixel,PairPixel,BytePixel) +ConvertToLMTB(BPBtoLMTB,BytePixel,PairPixel,BytePixel) +ConvertToMLTB(BPBtoMLTB,BytePixel,PairPixel,BytePixel) +ConvertToMMTB(BPBtoMMTB,BytePixel,PairPixel,BytePixel) + +ConvertToLLTB(BPPtoLLTB,BytePixel,PairPixel,PairPixel) +ConvertToLMTB(BPPtoLMTB,BytePixel,PairPixel,PairPixel) +ConvertToMLTB(BPPtoMLTB,BytePixel,PairPixel,PairPixel) +ConvertToMMTB(BPPtoMMTB,BytePixel,PairPixel,PairPixel) + +ConvertToLLTB(PBBtoLLTB,PairPixel,BytePixel,BytePixel) +ConvertToLMTB(PBBtoLMTB,PairPixel,BytePixel,BytePixel) +ConvertToMLTB(PBBtoMLTB,PairPixel,BytePixel,BytePixel) +ConvertToMMTB(PBBtoMMTB,PairPixel,BytePixel,BytePixel) + +ConvertToLLTB(PBPtoLLTB,PairPixel,BytePixel,PairPixel) +ConvertToLMTB(PBPtoLMTB,PairPixel,BytePixel,PairPixel) +ConvertToMLTB(PBPtoMLTB,PairPixel,BytePixel,PairPixel) +ConvertToMMTB(PBPtoMMTB,PairPixel,BytePixel,PairPixel) + +ConvertToLLTB(PPBtoLLTB,PairPixel,PairPixel,BytePixel) +ConvertToLMTB(PPBtoLMTB,PairPixel,PairPixel,BytePixel) +ConvertToMLTB(PPBtoMLTB,PairPixel,PairPixel,BytePixel) +ConvertToMMTB(PPBtoMMTB,PairPixel,PairPixel,BytePixel) + +ConvertToLLTB(PPPtoLLTB,PairPixel,PairPixel,PairPixel) +ConvertToLMTB(PPPtoLMTB,PairPixel,PairPixel,PairPixel) +ConvertToMLTB(PPPtoMLTB,PairPixel,PairPixel,PairPixel) +ConvertToMMTB(PPPtoMMTB,PairPixel,PairPixel,PairPixel) + +void (*EncodeTripleFuncs[2][2][2][2][2])() = +{ { { { { BBBtoLLTB, BBPtoLLTB }, { BPBtoLLTB, BPPtoLLTB } }, + { { PBBtoLLTB, PBPtoLLTB }, { PPBtoLLTB, PPPtoLLTB } } }, + { { { BBBtoLMTB, BBPtoLMTB }, { BPBtoLMTB, BPPtoLMTB } }, + { { PBBtoLMTB, PBPtoLMTB }, { PPBtoLMTB, PPPtoLMTB } } } }, + { { { { BBBtoMLTB, BBPtoMLTB }, { BPBtoMLTB, BPPtoMLTB } }, + { { PBBtoMLTB, PBPtoMLTB }, { PPBtoMLTB, PPPtoMLTB } } }, + { { { BBBtoMMTB, BBPtoMMTB }, { BPBtoMMTB, BPPtoMMTB } }, + { { PBBtoMMTB, PBPtoMMTB }, { PPBtoMMTB, PPPtoMMTB } } } } }; +/* end module meuncomp.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/export/schoice.c b/xie/xc/programs/Xserver/XIE/mixie/export/schoice.c new file mode 100644 index 0000000..efe29a3 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/export/schoice.c @@ -0,0 +1,357 @@ +/* $XConsortium: schoice.c,v 1.4 94/04/17 20:34:25 rws Exp $ */ +/**** module schoice.c ****/ +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +**************************************************************************** + schoice.c: Routines to handle server choice encoding + + Dean Verheiden && Robert NC Shelley AGE Logic, Inc. Jan 1994 +****************************************************************************/ + +#define _XIEC_SCHOICE +#define _XIEC_IPHOTO + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include + +/* + * Element Specific Includes + */ +#include +#include +#include +#include +#include + +static Bool PrepSCCanonic(); +static Bool PrepSCSmuggle(); +static Bool PrepSCPackBits(); +static Bool PrepSCG42D(); + + +extern Bool BuildDecodeFromEncode(); +extern pointer GetImportTechnique(); + + +/* REFORMAT_UNCOMPRESSED (options for prefer space) + * TRUE = convert uncompressed import data to canonic form before saving + * FALSE = save uncompressed import data "as is" + * + * COMPRESS_BITONAL + * PrepSCPackBits + * PrepSCG42D + * + * DEFAULT_PREFERENCE + * xieValPreferSpace + * xieValPreferTime + */ +#define REFORMAT_UNCOMPRESSED TRUE +#define COMPRESS_BITONAL PrepSCPackBits +#define DEFAULT_PREFERENCE xieValPreferTime + + +/*------------------------------------------------------------------------ +----------------------- choose an encode technique ----------------------- +------------------------------------------------------------------------*/ +xieBoolProc GetServerChoice(flo, eped) + floDefPtr flo; + peDefPtr eped; +{ + ePhotoDefPtr pvt = (ePhotoDefPtr)eped->elemPvt; + xieFloExportPhotomap *raw = (xieFloExportPhotomap *)eped->elemRaw; + outFloPtr dst = &eped->outFlo; + inFloPtr inf = &eped->inFloLst[SRCtag]; + peDefPtr iped = inf->srcDef; + Bool smuggle = FALSE; + formatPtr fmt; + xieBoolProc scPrep; + CARD8 b, bands, preference; + CARD16 tecNum, tecLen; + pointer import; + + import = GetImportTechnique(iped,&tecNum,&tecLen); + + if(raw->lenParams) + preference = ((xieTecEncodeServerChoice*)&raw[1])->preference; + else + preference = xieValPreferDefault; + + switch(preference) { +#if (DEFAULT_PREFERENCE == xieValPreferSpace) + case xieValPreferDefault: +#endif + case xieValPreferSpace: + if(import) { + switch(tecNum) { +#if REFORMAT_UNCOMPRESSED + case xieValDecodeUncompressedSingle: + if(iped->outFlo.format[0].levels == 2) + scPrep = COMPRESS_BITONAL; + else + scPrep = PrepSCCanonic; + break; + + case xieValDecodeUncompressedTriple: + scPrep = PrepSCCanonic; + break; +#else + case xieValDecodeUncompressedSingle: + case xieValDecodeUncompressedTriple: +#endif + case xieValDecodeG31D: + case xieValDecodeG32D: + case xieValDecodeG42D: + case xieValDecodeJPEGBaseline: + case xieValDecodeTIFF2: + case xieValDecodeTIFFPackBits: + smuggle = TRUE; /* smuggle import encoding "as is" */ + scPrep = PrepSCSmuggle; + break; + default: + return((xieBoolProc)NULL); + } + } else if(iped->outFlo.bands == 1 && iped->outFlo.format[0].levels == 2) { + scPrep = COMPRESS_BITONAL; + } else { + scPrep = PrepSCCanonic; + } + break; + +#if (DEFAULT_PREFERENCE == xieValPreferTime) + case xieValPreferDefault: +#endif + case xieValPreferTime: + scPrep = PrepSCCanonic; /* keep uncompressed */ + break; + + default: + return((xieBoolProc)NULL); + } + /* grab a copy of the input attributes and propagate them to our output + */ + fmt = smuggle ? iped->inFloLst[SRCtag].format : iped->outFlo.format; + bands = smuggle ? iped->inFloLst[SRCtag].bands : iped->outFlo.bands; + + for(b = 0; b < bands; ++b) { + dst->format[b] = inf->format[b] = fmt[b]; + } + dst->bands = inf->bands = bands; + pvt->serverChose = TRUE; + + return(scPrep); +} + + +/*------------------------------------------------------------------------ +---------------------- server choice prep routines ----------------------- +------------------------------------------------------------------------*/ +static Bool PrepSCCanonic(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ePhotoDefPtr pvt = (ePhotoDefPtr)ped->elemPvt; + + pvt->encodeNumber = xieValEncodeServerChoice; + pvt->encodeLen = 0; + pvt->congress = TRUE; + + if(ped->inFloLst[SRCtag].bands == 1) { + xieTecDecodeUncompressedSingle *dtec; + + if(!(dtec = ((xieTecDecodeUncompressedSingle *) + XieMalloc(sizeof(xieTecDecodeUncompressedSingle))))) + AllocError(flo,ped, return(FALSE)); + + pvt->decodeNumber = xieValDecodeUncompressedSingle; + pvt->decodeParms = (pointer)dtec; + pvt->decodeLen = sizeof(xieTecDecodeUncompressedSingle); +#if (IMAGE_BYTE_ORDER == MSBFirst) /* Conform to server's "native" format */ + dtec->fillOrder = xieValMSFirst; + dtec->pixelOrder = xieValMSFirst; +#else + dtec->fillOrder = xieValLSFirst; + dtec->pixelOrder = xieValLSFirst; +#endif + dtec->pixelStride = ped->outFlo.format[0].stride; + dtec->leftPad = 0; + dtec->scanlinePad = PITCH_MOD >> 3; + } else { + xieTecDecodeUncompressedTriple *dtec; + int i; + + if(!(dtec = ((xieTecDecodeUncompressedTriple *) + XieMalloc(sizeof(xieTecDecodeUncompressedTriple))))) + AllocError(flo,ped, return(FALSE)); + + pvt->decodeNumber = xieValDecodeUncompressedTriple; + pvt->decodeParms = (pointer)dtec; + pvt->decodeLen = sizeof(xieTecDecodeUncompressedTriple); +#if (IMAGE_BYTE_ORDER == MSBFirst) /* Conform to server's "native" format */ + dtec->fillOrder = xieValMSFirst; + dtec->pixelOrder = xieValMSFirst; +#else + dtec->fillOrder = xieValLSFirst; + dtec->pixelOrder = xieValLSFirst; +#endif + dtec->bandOrder = xieValLSFirst; + dtec->interleave = xieValBandByPlane; + for(i = 0; i < 3; i++) { + dtec->leftPad[i] = 0; + dtec->pixelStride[i] = ped->outFlo.format[i].stride; + dtec->scanlinePad[i] = PITCH_MOD >> 3; + } + } + return(TRUE); +} /* PrepSCCanonic */ + + +static Bool PrepSCSmuggle(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ePhotoDefPtr pvt = (ePhotoDefPtr)ped->elemPvt; + peDefPtr iped = ped->inFloLst[SRCtag].srcDef; + pointer parms; + + pvt->encodeNumber = xieValEncodeServerChoice; + pvt->encodeLen = 0; + pvt->congress = TRUE; + + if(!(parms = GetImportTechnique(iped,&pvt->decodeNumber,&pvt->decodeLen)) || + !(pvt->decodeParms = (pointer)XieMalloc(pvt->decodeLen))) + return(FALSE); + + memcpy((char*)pvt->decodeParms, (char*)parms, (int)pvt->decodeLen); + + return(TRUE); +} /* PrepECSmuggle */ + + +static Bool PrepSCPackBits(flo, ped) + floDefPtr flo; + peDefPtr ped; +{ + ePhotoDefPtr pvt = (ePhotoDefPtr)ped->elemPvt; + formatPtr fmt = ped->outFlo.format; + xieTecEncodeTIFFPackBits *tp; + + pvt->encodeNumber = xieValEncodeTIFFPackBits; + pvt->encodeLen = sizeof(xieTecEncodeTIFFPackBits); + + if(!(tp = (xieTecEncodeTIFFPackBits*)XieMalloc(pvt->encodeLen))) + return(FALSE); + + pvt->encodeParms = (pointer)tp; + + tp->encodedOrder = xieValMSFirst; + fmt->interleaved = FALSE; + fmt->class = STREAM; + + return(BuildDecodeFromEncode(flo,ped)); +} /* PrepSCPackBits */ + + +static Bool PrepSCG42D(flo, ped) + floDefPtr flo; + peDefPtr ped; +{ + ePhotoDefPtr pvt = (ePhotoDefPtr)ped->elemPvt; + formatPtr fmt = ped->outFlo.format; + xieTecEncodeG42D *tp; + + pvt->encodeNumber = xieValEncodeG42D; + pvt->encodeLen = sizeof(xieTecEncodeG42D); + + if(!(tp = (xieTecEncodeG42D*)XieMalloc(pvt->encodeLen))) + return(FALSE); + + pvt->encodeParms = (pointer)tp; + tp->encodedOrder = xieValMSFirst; + tp->uncompressed = FALSE; + tp->radiometric = FALSE; + fmt->interleaved = FALSE; + fmt->class = STREAM; + + return(BuildDecodeFromEncode(flo,ped)); +} /* PrepSCG42D */ + +/* end module schoice.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/fax/Imakefile b/xie/xc/programs/Xserver/XIE/mixie/fax/Imakefile new file mode 100644 index 0000000..25a9214 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/fax/Imakefile @@ -0,0 +1,44 @@ +XCOMM $XConsortium: Imakefile,v 1.4 93/11/07 10:57:59 rws Exp $ +XCOMM build device dependent machine independent fax processing element objects +#include + + SRCS = dg31d.c \ + dg32d.c \ + dg4.c \ + dtiff2.c \ + dtiffpb.c \ + eg31d.c \ + eg32d.c \ + etiff2.c \ + etiffpb.c \ + faxtabs.c \ + zeroeven.c + + OBJS = dg31d.o \ + dg32d.o \ + dg4.o \ + dtiff2.o \ + dtiffpb.o \ + eg31d.o \ + eg32d.o \ + etiff2.o \ + etiffpb.o \ + faxtabs.o \ + zeroeven.o + +#if BuildDIS + DEFINES = -DXIE_DIS +#endif + + INCLUDES = -I../include -I../../include -I$(SERVERSRC)/include -I$(INCLUDESRC) -I$(INCLUDESRC)/extensions + LINTLIBS = ../../dixie/export/llib-lexp.ln ../../dixie/import/llib-limp.ln \ + ../../dixie/process/llib-lproc.ln ../../dixie/request/llib-lreq.ln \ + ../control/llib-lctrl.ln ../export/llib-lmexp.ln ../fax/llib-lfax.ln \ + ../import/llib-lmimp.ln ../jpeg/llib-ljpeg.ln ../process/llib-lmproc.ln + +SubdirLibraryRule($(OBJS)) +NormalLibraryObjectRule() +LintLibraryTarget(fax,$(SRCS)) +NormalLintTarget($(SRCS)) + +DependTarget() diff --git a/xie/xc/programs/Xserver/XIE/mixie/fax/bits.h b/xie/xc/programs/Xserver/XIE/mixie/fax/bits.h new file mode 100644 index 0000000..9538130 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/fax/bits.h @@ -0,0 +1,466 @@ +/* $XConsortium: bits.h /main/6 1995/12/02 16:50:22 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module fax/bits.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + fax/bits.h -- DDXIE G4 fax bitstream management macros + + Ben Fahy -- AGE Logic, Inc. May, 1993 + +*****************************************************************************/ + +#include "gbits.h" + +/* ------------------------------------------------------------------- */ +/* + * get_white_run_length(next_goal) + * get_black_run_length(next_goal) + * + * These macros try to determine run lengths in horizonal mode. + * All possible bit combinations have been previously coded in + * a lookup table, so it's not a very big deal. The only real + * complication arises from the fact I may run out of strip data + * before finishing. In this case I want to save my length + * accumulator and read it back in again. If I have finished + * with this length, I want to move on to the next goal specified + * by 'next_goal'. Otherwise my goal remains to accumulate the + * current desired run length. + */ + +#define get_white_run_length(next_goal) \ + { \ + register int code=0,nbits,makeup; \ + rl = 0; \ + while (1) { \ + code = get_wcode(byteptr,bitpos,endptr); \ + rl = _WhiteFaxTable[code].run_length; \ + nbits = _WhiteFaxTable[code].n_bits; \ + makeup = _WhiteFaxTable[code].makeup; \ + if (rl == BAD_RUN_LENGTH) { \ + length_acc = 0; \ + if (!code) { \ + /* could just be fill bits, try to recover */ \ + goal = FAX_GOAL_RecoverZero; \ + break; \ + } \ + else { \ + goal = FAX_GOAL_FallOnSword; \ + break; \ + } \ + } \ + if (rl != EOL_RUN_LENGTH) \ + length_acc += rl; \ + if (!makeup) \ + goal = next_goal; \ + /* just in case adjust_bitstream returns for more data */ \ + adjust_bitstream(nbits,byteptr,bitpos,endptr); \ + if (!makeup) \ + break; \ + } \ + } + +#define get_black_run_length(next_goal) \ + { \ + register int code=0,nbits,makeup; \ + rl = 0; \ + while (1) { \ + code = get_bcode(byteptr,bitpos,endptr); \ + rl = _BlackFaxTable[code].run_length; \ + nbits = _BlackFaxTable[code].n_bits; \ + makeup = _BlackFaxTable[code].makeup; \ + if (rl == BAD_RUN_LENGTH) { \ + length_acc = 0; \ + if (!code) { \ + /* could just be fill bits, will try to recover */ \ + goal = FAX_GOAL_RecoverZero; \ + break; \ + } \ + else { \ + goal = FAX_GOAL_FallOnSword; \ + break; \ + } \ + } \ + if (rl != EOL_RUN_LENGTH) \ + length_acc += rl; \ + /* if this is an EOL of terminating code, go to next goal */\ + if (!makeup) \ + goal = next_goal; \ + /* (set in case adjust_bitstream returns for more data) */\ + adjust_bitstream(nbits,byteptr,bitpos,endptr); \ + if (!makeup) \ + break; \ + } \ + } + +/* ------------------------------------------------------------------- */ +/* + * get_a0a1(next_goal) + * get_a1a2(next_goal) + * + * These macros try to determine run lengths in horizonal mode. + * They just leverage off of lower-level macros, so they're easy + */ +#define get_a0a1(next_goal) \ + { \ + if (a0_color == WHITE) \ + get_white_run_length(next_goal) /* ; */ \ + else \ + get_black_run_length(next_goal); \ + } +#define get_a1a2(next_goal) \ + { \ + if (a0_color == WHITE) \ + get_black_run_length(next_goal) /* ; */ \ + else \ + get_white_run_length(next_goal); \ + } +/* ------------------------------------------------------------------- */ +/* + * save_state_and_return(state); + * localize_state(state); + * + * These macros transfer state variables back and forth between + * the reentrant data structure 'state' and register variables. + * Hopefully neither will be called often, so we don't have to + * spend energy analyzing what is 'dirty' versus what hasn't been + * touched since the last save, etc. + * + * Strategy: + * brute force. + * + */ +#if defined(_G32D) +#define save_state_and_return(state) \ + { \ + state->a0_color = a0_color; \ + state->a0_pos = a0_pos; \ + state->a0a1 = a0a1; \ + state->bits.bitpos = bitpos; \ + state->bits.byteptr = byteptr; \ + state->bits.endptr = endptr; \ + state->goal = goal; \ + state->n_old_trans = n_old_trans; \ + state->old_trans = old_trans; \ + state->n_new_trans = n_new_trans; \ + state->new_trans = new_trans; \ + state->length_acc = length_acc; \ + state->last_b1_idx = last_b1_idx; \ + state->width = width; \ + state->rl = rl; \ + state->g32d_horiz = g32d_horiz; \ + return(lines_found); \ + } + +#define localize_state(state) \ + a0_color = state->a0_color; \ + a0_pos = state->a0_pos; \ + a0a1 = state->a0a1; \ + bitpos = state->bits.bitpos; \ + byteptr = state->bits.byteptr; \ + endptr = state->bits.endptr; \ + goal = state->goal; \ + n_old_trans = state->n_old_trans; \ + old_trans = state->old_trans; \ + n_new_trans = state->n_new_trans; \ + new_trans = state->new_trans; \ + length_acc = state->length_acc; \ + last_b1_idx = state->last_b1_idx; \ + width = state->width; \ + rl = state->rl; \ + g32d_horiz = state->g32d_horiz; +#endif /* if defined(_G32D) */ + +#if defined(_G31D) || defined(_G4) +#define save_state_and_return(state) \ + { \ + state->a0_color = a0_color; \ + state->a0_pos = a0_pos; \ + state->a0a1 = a0a1; \ + state->bits.bitpos = bitpos; \ + state->bits.byteptr = byteptr; \ + state->bits.endptr = endptr; \ + state->goal = goal; \ + state->n_old_trans = n_old_trans; \ + state->old_trans = old_trans; \ + state->n_new_trans = n_new_trans; \ + state->new_trans = new_trans; \ + state->length_acc = length_acc; \ + state->last_b1_idx = last_b1_idx; \ + state->width = width; \ + state->rl = rl; \ + return(lines_found); \ + } + +#define localize_state(state) \ + a0_color = state->a0_color; \ + a0_pos = state->a0_pos; \ + a0a1 = state->a0a1; \ + bitpos = state->bits.bitpos; \ + byteptr = state->bits.byteptr; \ + endptr = state->bits.endptr; \ + goal = state->goal; \ + n_old_trans = state->n_old_trans; \ + old_trans = state->old_trans; \ + n_new_trans = state->n_new_trans; \ + new_trans = state->new_trans; \ + length_acc = state->length_acc; \ + last_b1_idx = state->last_b1_idx; \ + width = state->width; \ + rl = state->rl; +#endif /* defined(_G31D) */ + +#if defined(_PBits) +#define save_state_and_return(state) \ + { \ + state->a0_color = a0_color; \ + state->a0_pos = a0_pos; \ + state->bits.byteptr = byteptr; \ + state->bits.endptr = endptr; \ + state->goal = goal; \ + state->length_acc = length_acc; \ + state->width = width; \ + state->rl = rl; \ + return(lines_found); \ + } + +#define localize_state(state) \ + a0_color = state->a0_color; \ + a0_pos = state->a0_pos; \ + byteptr = state->bits.byteptr; \ + endptr = state->bits.endptr; \ + goal = state->goal; \ + length_acc = state->length_acc; \ + width = state->width; \ + rl = state->rl; +#endif /* defined(_Pbits) */ + +/* ------------------------------------------------------------------- */ +/* + * reset_transitions(); + * + * Macro to trade old and new transition buffers + * + * Strategy: + * Do the obvious + */ +#define reset_transitions() \ + { \ + register int *tmp = old_trans; \ + old_trans = new_trans; \ + new_trans = tmp; \ + n_old_trans = n_new_trans; \ + n_new_trans = 0; \ + last_b1_idx = 0; \ + } + +/* ------------------------------------------------------------------- */ +/* + * get_mode_and_length(mode,length,byteptr,bitpos,endptr); + * + * Macro to get next coding mode (vertical or horizontal or ...) + * + * Strategy: the modes are encoded with 8 bits or less except + * for EOL, which is 001 (12 bits). However, none of + * the other modes use 00, so there's no conflict. + * + * We have precomputed a lookup table that tells us for + * any sequence of 8 bits, what mode and length goes + * along with that sequence. So all we have to do is + * get the 8 bits and run them through the lookup table + * and we're done. + * + * Note: I'm trying to write this so a decent compiler will only + * do one load to get both mode and length. Hopefully, your + * compiler will fetch '*entry' all at once, then shift and + * mask to get components. + * + * Very old compilers may have troubles with the struct = + * construction. You'll have to change entry to *entry + * and the entry.mode to entry->mode, etc. + */ + +#define get_mode_and_length(mode,length,byteptr,bitpos,endptr) \ + { register unsigned char bits=get_byte(byteptr,bitpos,endptr); \ + register TwoDTable entry; \ + entry = _TwoDFaxTable[bits]; \ + mode = entry.mode; \ + length = entry.n_bits; \ + } + +/* ------------------------------------------------------------------- */ + +/* + * find_b1pos(a0_pos,a0_color,n_old_trans,old_trans); + * + * Macro to find pixel of opposite color of a0, to right of a0, + * on the previous line. + * + * Strategy: b1 is more or less monotonically increasing. The + * only possible exception is during vertical coding when + * a1 is left of b1 by 2 or 3: + * + * 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + * b1' b1 + * B B B B W W B B B B + * B B W B W B W + * a0 a1 + * + * In the diagram above, b1 is the first changing element to the + * right of a0 which goes from white to black. a1 is three to the + * left of b1. + * + * When we set a0'=a1 and proceed decoding, since the new a0' is + * black, we want the first changing element to the right of a0' + * which goes from black to white. This is b1', as pictured. Note + * that b1' < b1! So the b1 sequence is not monotically increasing, + * though it is close. + * + * At most we have to back up one transition to get the right + * changing element for a0'. This is because b1 is W->B, while + * the transition before is B-W, the one before that W->B, and + * so on. The transition before b1 is a candidate for b1', but + * not the one before that (it's the wrong color). The third + * transition before b1 must be at a position <= a0'. But the + * definition of b1' requires that b1' be to the right of a0'. + * Therefore, only the transition immediately before b1 could + * possibly server as b1'. + * + * Moral: If the last b1 we found was index last_b1_idx, then + * we can start searching for b1' at last_b1_idx-1, with complete + * assurance that we'll find it. (if it exists :) + * + * One more thing: WHITE is defined as 0. BLACK is 1. The 1st + * transition (last_b1_idx=0) is W->B, the 2nd (last_b1_idx=1) + * is B->W, etc. So an even transition is black, and odd is white. + * + * BLACK WHITE + * | 0 | 1 | bit1 of transition idx + * ----------|-------|-------| + * a0 WHITE(0) | ok | bad | + * color BLACK(1) | bad | ok | + * ----------|-------|-------| + * + * We need a transition which is opposite in color to a0_color. + * From the table above, if a0_color ^ (idx & 1), the colors + * match and we need to choose the next transition to the right. + */ +#define find_b1pos(a0_pos,a0_color,n_old,old) \ + { \ + if (last_b1_idx > 0) \ + --last_b1_idx; /* avoid gotcha from above evil case */ \ + \ + /* search for first changing element to right of a0_pos */ \ + while (old[last_b1_idx] <= a0_pos) \ + if (++last_b1_idx >= n_old) \ + break; /* if out of transitions, give up */ \ + \ + /* check out color - if matching, use next transition */ \ + if (a0_color ^ (last_b1_idx & 1)) \ + ++last_b1_idx; \ + \ + if (last_b1_idx < n_old) \ + b1_pos = old[last_b1_idx]; \ + else { \ + last_b1_idx = 0; \ + b1_pos = -1; \ + } \ + } + +/* ------------------------------------------------------------------- */ +/* + * find_b2pos(a0_pos,a0_color,n_old_trans,old_trans); + * + * Macro to find the end of a chunk of pixels in the previous line, + * which we passed by because they are uncorrelated with this line. + * + * Strategy: teeny tiny modification to find_b1pos. + * + */ +#define find_b2pos(a0_pos,a0_color,n_old,old) \ + { \ + if (last_b1_idx > 0) \ + --last_b1_idx; /* avoid gotcha from above evil case */ \ + \ + /* search for first changing element to right of a0_pos */ \ + while (old[last_b1_idx] <= a0_pos) \ + if (++last_b1_idx >= (n_old-1)) /* CHANGE */ \ + break; /* if out of transitions, give up */ \ + \ + /* check out color - if matching, use next transition */ \ + if (a0_color ^ (last_b1_idx & 1)) \ + ++last_b1_idx; \ + \ + if (last_b1_idx < n_old-1) /* CHANGE */ \ + b2_pos = old[last_b1_idx+1]; /* CHANGE */ \ + else { \ + last_b1_idx = 0; \ + b2_pos = -1; \ + } \ + } + +/* ------------------------------------------------------------------- */ +/**** module fax/bits.h ****/ diff --git a/xie/xc/programs/Xserver/XIE/mixie/fax/dg31d.c b/xie/xc/programs/Xserver/XIE/mixie/fax/dg31d.c new file mode 100644 index 0000000..e27c81e --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/fax/dg31d.c @@ -0,0 +1,393 @@ +/* $XConsortium: dg31d.c,v 1.5 94/04/17 20:34:26 rws Exp $ */ +/**** module fax/dg31d.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + fax/dg31d.c -- DDXIE G31D fax decode technique/element + + Ben Fahy -- AGE Logic, Inc. July, 1993 + +*****************************************************************************/ + + +#define lenient_decoder + + +/* the folling define causes extra stuff to be saved in state recorder */ +#define _G31D +#include "fax.h" +#include "faxint.h" +#include "bits.h" + +#include /* pick up the BITMAP_BIT_ORDER from Core X*/ + + +/**********************************************************************/ +int decode_g31d(state) +FaxState *state; +{ +register int bitpos; +register unsigned char *byteptr; +register unsigned char *endptr; +register int a0_color; +register int a0_pos; +register int a1_pos; +register int goal; +register int width; +register int rl; + +int lines_found=0; +int n_old_trans; +int n_new_trans; +int *old_trans; +int *new_trans; +int a0a1,a1a2; +int length_acc=0; +int last_b1_idx=0; +int code,nbits; + + if (state == (FaxState *)NULL) + return(-1); + + /* set up initial bitstream for the very first strip */ + if (!state->bits.started) { + if (state->strip_state != StripStateNew) { + state->decoder_done = FAX_DECODE_DONE_ErrorBadStripper; + return(-1); + } + state->bits.byteptr = (unsigned char *)state->strip; + state->bits.endptr = state->bits.byteptr + state->strip_size-4; + /* we will panic with four bytes to go */ + + state->bits.bitpos = 0; + state->bits.started = 1; + } + + localize_state(state); + + if (state->magic_needs) + finish_magic(state->final); + /* a magic strip was waiting for 1st word of next strip */ + + +/*** Main Decoding Loop ***/ + while(1) { + + switch(goal) { + case FAX_GOAL_SkipPastAnyToEOL: + code = 0; /* get gnu compiler to shut up */ + while (byteptr < endptr) { + /* look for EOL code */ + code = get_wcode(byteptr,bitpos,endptr); + rl = _WhiteFaxTable[code].run_length; + if (rl == EOL_RUN_LENGTH) + break; + else + /* move bitstream one bit further and try again */ + adjust_1bit(byteptr,bitpos,endptr); + } + if (byteptr >= endptr) { + state->decoder_done = FAX_DECODE_DONE_ErrorSkipPast; + return(lines_found); + } + nbits = _WhiteFaxTable[code].n_bits; + goal = FAX_GOAL_StartNewLine; + adjust_bitstream(nbits,byteptr,bitpos,endptr); + break; + + case FAX_GOAL_SeekFillAndEOL: + /* look for EOL code */ + code = 0; /* get gnu compiler to shut up */ + while (byteptr < endptr) { + /* look for EOL code */ + code = get_wcode(byteptr,bitpos,endptr); + rl = _WhiteFaxTable[code].run_length; + if (rl == EOL_RUN_LENGTH) + break; + else if (code) { + state->decoder_done = FAX_DECODE_DONE_ErrorBadFill; + return(lines_found); + } + else + /* move bitstream one bit further and try again */ + adjust_1bit(byteptr,bitpos,endptr); + } + if (byteptr >= endptr) { + state->decoder_done = FAX_DECODE_DONE_ErrorBadPtr; + return(-1); + } + nbits = _WhiteFaxTable[code].n_bits; + goal = FAX_GOAL_StartNewLine; + /* set goal before adjusting in case we run out of data */ + adjust_bitstream(nbits,byteptr,bitpos,endptr); + break; + + case FAX_GOAL_StartNewLine: + + if (lines_found >= state->nl_sought) + save_state_and_return(state); + + /* normal line initialization stuff */ + a0_pos = -1; + a0_color = WHITE; + goal = FAX_GOAL_HandleHoriz; + + reset_transitions(); + break; + + case FAX_GOAL_RecoverZero: + goal = FAX_GOAL_SkipPastAnyToEOL; + break; + + case FAX_GOAL_HandleHoriz: + length_acc=0; + goal = FAX_GOAL_AccumulateA0A1; + /* in case I run out of data while getting a0-a1 distance */ + + case FAX_GOAL_AccumulateA0A1: + get_a0a1(FAX_GOAL_RecordA0A1); + /* If we have to return for data before getting the */ + /* whole a0a1 distance, we want to return to the a0a1 */ + /* accumulate state when we reenter the decoder. If */ + /* adjusting the bitstream forces us to return after */ + /* getting the last part of the a0a1 distance, then */ + /* we want to jump to state FAX_GOAL_RecordA0A1 when */ + /* we reenter the decoder. */ + + case FAX_GOAL_FallOnSword: + if (goal == FAX_GOAL_FallOnSword) { +#if defined(lenient_decoder) + goal = FAX_GOAL_SkipPastAnyToEOL; + FlushLineData(); + break; + +#else + state->decoder_done = FAX_DECODE_DONE_ErrorBadCode; + return(lines_found); +#endif + } + + case FAX_GOAL_RecordA0A1: + a0a1 = length_acc; + if (a0a1 < 0) { + state->decoder_done = FAX_DECODE_DONE_ErrorBada0a1; + return(-1); + } + if (a0_pos < 0) { + /* at start of line, a0a1 is the number of white pixels, */ + /* which is also the index on the line where white->black */ + new_trans[n_new_trans++] = a1_pos = a0a1; + } else { + /* in middle of the line, a0a1 is run-length, so + * a1_pos = a0_pos + a0a1, a2_pos = a1_pos + a1a2 + * + * 0 1 2 3 4 5 6 7 8 9 A B C D + * |w |w |w |b |b |b |b |b |w | | | | | + * a0 a1 a2 + */ + new_trans[n_new_trans++] = a1_pos = a0_pos + a0a1; + } + if (a1_pos >= width) { + if (a1_pos > width) { +#if defined(lenient_decoder) + /* we went too far, but we'll be forgiving */ + a1_pos = width; +#else + state->decoder_done = FAX_DECODE_DONE_ErrorPastWidth; + return(-1); +#endif + } + FlushLineData(); + goal = FAX_GOAL_SkipPastAnyToEOL; + break; + } + if (new_trans[n_new_trans-1] < 0){ + state->decoder_done = FAX_DECODE_DONE_ErrorBadA0pos; + return(-1); + } + + + if (goal == FAX_GOAL_RecoverZero) { + + /* it's possible we got here by reading a zero in get_a0a1, */ + /* in which case 'goal' was set to FAX_GOAL_RecoverZero. We */ + /* must assume that the zero is an EOL pre-padded with a */ + /* variable number of zeros, which is legal according to */ + /* the coding spec. So we will record the increment in */ + /* line number and then attempt to recover. */ + goal = FAX_GOAL_SkipPastAnyToEOL; + FlushLineData(); + break; + /* break out of the switch, loop with the while */ + } + + if (rl == EOL_RUN_LENGTH) { + FlushLineData(); + goal = FAX_GOAL_StartNewLine; + /* if we got a non-zero length, remember the transition */ + /* in case the next line is coded in vertical mode */ + if (a0a1) + new_trans[n_new_trans++] = a0a1; + + /* notice we don't have to worry about a0_pos - + it will be reset when we start the new line + */ + break; + /* break out of the switch, loop with the while */ + } + length_acc=0; + goal = FAX_GOAL_AccumulateA1A2; + /* in case I run out of data while getting a1-a2 distance */ + + case FAX_GOAL_AccumulateA1A2: + get_a1a2(FAX_GOAL_FinishHoriz); + /* If we have to return for data before getting the */ + /* whole a1a2 distance, we want to return to the a1a2 */ + /* accumulate state when we reenter the decoder. If */ + /* adjusting the bitstream forces us to return after */ + /* getting the last part of the a1a2 distance, then */ + /* we want to jump to state FAX_GOAL_FinishHoriz when */ + /* we reenter the decoder. */ + + case FAX_GOAL_FinishHoriz: + a1a2 = length_acc; + /* XXX - I may regret not checking for a1a2 > 0 later... */ + if (a1a2 < 0) { + state->decoder_done = FAX_DECODE_DONE_ErrorBada1a2; + return(-1); + } + + + new_trans[n_new_trans] = a0_pos = new_trans[n_new_trans-1]+a1a2; + ++n_new_trans; + if (a0_pos < 0) { + state->decoder_done = FAX_DECODE_DONE_ErrorBadA0pos; + return(-1); + } + + /* it's possible we got here by reading a zero in get_a1a2, */ + /* in which case 'goal' was set to FAX_GOAL_RecoverZero. We */ + /* must assume that the zero is an EOL pre-padded with a */ + /* variable number of zeros, which is legal according to */ + /* the coding spec. So we will update the line count and */ + /* then attempt to recover. */ + if (goal == FAX_GOAL_FallOnSword) { +#if defined(lenient_decoder) + goal = FAX_GOAL_SkipPastAnyToEOL; + FlushLineData(); + break; + +#else + state->decoder_done = FAX_DECODE_DONE_ErrorBadCode; + return(lines_found); +#endif + } + if (goal == FAX_GOAL_RecoverZero ) { + /* assume we have hit the begining of an EOL */ + /* goal = FAX_GOAL_SeekFillAndEOL; */ + goal = FAX_GOAL_SkipPastAnyToEOL; + FlushLineData(); + break; + } + if (rl == EOL_RUN_LENGTH) { + FlushLineData(); + goal = FAX_GOAL_StartNewLine; + if (state->decoder_done) + save_state_and_return(state); + break; + } + if (a0_pos >= width) { + if (a0_pos > width) { +#if defined(lenient_decoder) + /* we went too far, but we'll be forgiving */ + a0_pos = width; +#else + state->decoder_done = FAX_DECODE_DONE_ErrorPastWidth; + return(lines_found); +#endif + } + FlushLineData(); + if (state->decoder_done) + save_state_and_return(state); + /* goal = FAX_GOAL_SeekFillAndEOL; */ + goal = FAX_GOAL_SkipPastAnyToEOL; + break; + } + else { + goal = FAX_GOAL_HandleHoriz; + } + break; + + + default: + state->decoder_done = FAX_DECODE_DONE_ErrorBadGoal; + return(lines_found); + break; + } /* end of switch */ + } +/*** End, Main Decoding Loop ***/ +} +/**** module fax/g31d.c ****/ diff --git a/xie/xc/programs/Xserver/XIE/mixie/fax/dg32d.c b/xie/xc/programs/Xserver/XIE/mixie/fax/dg32d.c new file mode 100644 index 0000000..866eac8 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/fax/dg32d.c @@ -0,0 +1,489 @@ +/* $XConsortium: dg32d.c /main/6 1995/12/02 16:50:27 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module fax/dg32d.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + fax/dg32d.c -- DDXIE G32D fax decode technique/element + + Ben Fahy -- AGE Logic, Inc. May, 1993 + +*****************************************************************************/ + +#define lenient_decoder + +/* the folling define causes extra stuff to be saved in state recorder */ +#define _G32D + +#include "fax.h" +#include "faxint.h" +#include "bits.h" + +#include /* pick up the BITMAP_BIT_ORDER from Core X*/ + + +/**********************************************************************/ +int decode_g32d(state) +FaxState *state; +{ +register int bitpos; +register unsigned char *byteptr; +register unsigned char *endptr; +register int a0_color; +register int a0_pos,a1_pos; +register int goal; +register int mode; /* could overload goal, but will resist */ +register int length; +register int width; +register int g32d_horiz; +register int rl; + +int lines_found=0; +int n_old_trans; +int n_new_trans; +int *old_trans; +int *new_trans; +int a0a1,a1a2; +int length_acc=0; +int last_b1_idx=0; +int b1_pos,b2_pos; +int code,nbits; + + if (state == (FaxState *)NULL) + return(-1); + + /* set up initial bitstream for the very first strip */ + if (!state->bits.started) { + if (state->strip_state != StripStateNew) { + return(-1); + } + state->bits.byteptr = (unsigned char *)state->strip; + state->bits.endptr = state->bits.byteptr + state->strip_size-4; + /* we will panic with four bytes to go */ + + state->bits.bitpos = 0; + state->bits.started = 1; + } + + localize_state(state); + + if (state->magic_needs) + finish_magic(state->final); + /* a magic strip was waiting for 1st word of next strip */ + + +/*** Main Decoding Loop ***/ + while(1) { + if (endptr < byteptr) { + return(-1); + } + switch(goal) { + + case FAX_GOAL_SkipPastAnyToEOL: + code = 0; /* get Gnu cc to shut up. */ + while (byteptr < endptr) { + /* look for EOL code */ + code = get_wcode(byteptr,bitpos,endptr); + rl = _WhiteFaxTable[code].run_length; + if (rl == EOL_RUN_LENGTH) + break; +#if defined(lenient_decoder) + else + /* move bitstream one bit further and try again */ + adjust_1bit(byteptr,bitpos,endptr); +#else + else if (!state->o_line && !lines_found) { + /* we'll be lenient starting out */ + adjust_1bit(byteptr,bitpos,endptr); + } + else { + state->decoder_done = FAX_DECODE_DONE_ErrorSkipPast; + save_state_and_return(state); + } +#endif + } + if (byteptr >= endptr) { + state->decoder_done = FAX_DECODE_DONE_ErrorSkipPast; + save_state_and_return(state); + } + nbits = _WhiteFaxTable[code].n_bits; + goal = FAX_GOAL_SeekTagBit; + adjust_bitstream(nbits,byteptr,bitpos,endptr); + break; + + case FAX_GOAL_SeekEOLandTag: + goal = FAX_GOAL_SkipPastAnyToEOL; + break; + + case FAX_GOAL_SeekTagBit: + if (get_bit(byteptr,bitpos,endptr)) { + g32d_horiz = 1; + } + else { + g32d_horiz = 0; + } + goal = FAX_GOAL_AdjustTag; + /* have to set this goal in case adjusting throws us + back to the caller in order to get more data. */ + + adjust_1bit(byteptr,bitpos,endptr); + case FAX_GOAL_AdjustTag: + + + /*** ok, now start a new line ***/ + goal = FAX_GOAL_StartNewLine; + break; + + case FAX_GOAL_StartNewLine: + + /* if we got all the data we want, write it out */ + if (lines_found >= state->nl_sought) + save_state_and_return(state); + + /* normal line initialization stuff */ + a0_pos = -1; + a0_color = WHITE; + if (g32d_horiz) + goal = FAX_GOAL_HandleHoriz; + else + goal = FAX_GOAL_DetermineMode; + + reset_transitions(); + break; + case FAX_GOAL_DetermineMode: + get_mode_and_length(mode,length,byteptr,bitpos,endptr); + goal = mode; + /* our goal is now to handle whatever mode we're in! */ + + if (mode == FAX_MODE_Unknown) { + /* hopefully, we just hit the first 0 in an EOL */ + goal = FAX_GOAL_SeekEOLandTag; + } + else + adjust_bitstream_8(length,byteptr,bitpos,endptr); + break; + + case FAX_GOAL_RecoverZero: + + /* have to set new goal in case adjusting throws us */ + /* back to the caller (to get more data) */ + goal = FAX_GOAL_AdjustedButStillRecovering; + adjust_bitstream(nbits,byteptr,bitpos,endptr); + + case FAX_GOAL_AdjustedButStillRecovering: + { + int next_goal = FAX_GOAL_FoundOneEOL; + + while (1) { + if (*byteptr) { + register int mask; + /* important assumption: we only get here if we have */ + /* found at least twelve bits of zero leading up to */ + /* the current bitposition. Therefore, there can't */ + /* be any bits in the byte before the one we want */ + + mask = 1 << (7-bitpos); + while (bitpos < 8) { + if (mask & (*byteptr)) + break; + mask >>= 1; + ++bitpos; + } /* can't really reach bitpos = 8 above */ + goal = next_goal; + adjust_1bit(byteptr,bitpos,endptr); + break; + /* break out of while (1) */ + } + else { + bitpos = 0; + if (++byteptr >= endptr) + do_magic(byteptr,bitpos,endptr); + /* loop around to search some more */ + } + } /* end of while */ + + } + break; + + case FAX_GOAL_FoundOneEOL: + /* found an EOL. If this is RTC, there will be five more EOL's */ + /* on the way. If this is a normal EOL, next code will not */ + /* be an EOL, and we should interpret the next bit as tag bit */ + + + /* look for second EOL code */ + code = get_wcode(byteptr,bitpos,endptr); + rl = _WhiteFaxTable[code].run_length; + if (rl != EOL_RUN_LENGTH) { + goal = FAX_GOAL_SeekTagBit; + break; + } + + /* Got a second EOL code */ + return(-1); + break; + + case FAX_GOAL_HandleHoriz: + length_acc=0; + goal = FAX_GOAL_AccumulateA0A1; + /* in case I run out of data while getting a0-a1 distance */ + + + case FAX_GOAL_AccumulateA0A1: + get_a0a1(FAX_GOAL_RecordA0A1); + /* If we have to return for data before getting the */ + /* whole a0a1 distance, we want to return to the a0a1 */ + /* accumulate state when we reenter the decoder. If */ + /* adjusting the bitstream forces us to return after */ + /* getting the last part of the a0a1 distance, then */ + /* we want to jump to state FAX_GOAL_RecordA0A1 when */ + /* we reenter the decoder. */ + + case FAX_GOAL_RecordA0A1: + a0a1 = length_acc; + if (a0_pos < 0) { + /* at start of line, a0a1 is the number of white pixels, */ + /* which is also the index on the line where white->black */ + new_trans[n_new_trans++] = a1_pos = a0a1; + } else { + /* in middle of the line, a0a1 is run-length, so + * a1_pos = a0_pos + a0a1, a2_pos = a1_pos + a1a2 + * + * 0 1 2 3 4 5 6 7 8 9 A B C D + * |w |w |w |b |b |b |b |b |w | | | | | + * a0 a1 a2 + */ + new_trans[n_new_trans++] = a1_pos = a0_pos + a0a1; + } + if (a1_pos >= width) { + if (a1_pos > width) { +#if defined(lenient_decoder) + /* we went too far, but we'll be forgiving */ + a1_pos = width; +#else /* not so lenient */ + state->decoder_done = FAX_DECODE_DONE_ErrorPastWidth; + return(lines_found); +#endif + } + FlushLineData(); + goal = FAX_GOAL_SeekEOLandTag; + break; + } +#if defined(lenient_decoder) + if (rl < 0) { + FlushLineData(); + goal = FAX_GOAL_SeekTagBit; + /* if we got a non-zero length, remember the transition */ + /* in case the next line is coded in vertical mode */ + if (a0a1) + new_trans[n_new_trans++] = a0a1; + + /* notice we don't have to worry about a0_pos - + it will be reset when we start the new line + */ + break; + /* break out of the switch, loop with the while */ + } +#else /* not so lenient */ + if (goal == FAX_GOAL_RecoverZero) { + /* it's possible we got here by reading a zero in get_a0a1, */ + /* in which case 'goal' was set to FAX_GOAL_RecoverZero. We */ + /* must assume that the zero is an EOL pre-padded with a */ + /* variable number of zeros, which is legal according to */ + /* the coding spec. So we will record the increment in */ + /* line number and then attempt to recover. */ + FlushLineData(); + goal = FAX_GOAL_SkipPastAnyToEOL; + break; + } else if(rl == BAD_RUN_LENGTH) { + state->decoder_done = FAX_DECODE_DONE_ErrorBada0a1; + return(lines_found); + } +#endif + length_acc=0; + goal = FAX_GOAL_AccumulateA1A2; + /* in case I run out of data while getting a1-a2 distance */ + + case FAX_GOAL_AccumulateA1A2: + get_a1a2(FAX_GOAL_FinishHoriz); + /* If we have to return for data before getting the */ + /* whole a1a2 distance, we want to return to the a1a2 */ + /* accumulate state when we reenter the decoder. If */ + /* adjusting the bitstream forces us to return after */ + /* getting the last part of the a1a2 distance, then */ + /* we want to jump to state FAX_GOAL_FinishHoriz when */ + /* we reenter the decoder. */ + + case FAX_GOAL_FinishHoriz: + a1a2 = length_acc; + new_trans[n_new_trans] = a0_pos = new_trans[n_new_trans-1]+a1a2; + n_new_trans++; + +#if defined(lenient_decoder) + if (rl < 0) { + FlushLineData(); + goal = FAX_GOAL_SeekTagBit; + break; + } +#else /* not so lenient */ + /* it's possible we got here by reading a zero in get_a1a2, */ + /* in which case 'goal' was set to FAX_GOAL_RecoverZero. We */ + /* must assume that the zero is an EOL pre-padded with a */ + /* variable number of zeros, which is legal according to */ + /* the coding spec. So we will update the line count and */ + /* then attempt to recover. */ + if (goal == FAX_GOAL_RecoverZero) { + /* assume we have hit the begining of an EOL */ + FlushLineData(); + goal = FAX_GOAL_SkipPastAnyToEOL; + break; + } else if(rl == BAD_RUN_LENGTH) { + state->decoder_done = FAX_DECODE_DONE_ErrorBada1a2; + return(lines_found); + } +#endif + if (a0_pos >= width) { + if (a0_pos > width) { +#if defined(lenient_decoder) + /* we went too far, but we'll be forgiving */ + a0_pos = width; +#else + state->decoder_done = FAX_DECODE_DONE_ErrorPastWidth; + return(lines_found); +#endif + } + FlushLineData(); + goal = FAX_GOAL_SeekEOLandTag; + break; + } else if(a0_pos > 0) { + if (g32d_horiz) + goal = FAX_GOAL_HandleHoriz; + else + goal = FAX_GOAL_DetermineMode; + } else { + state->decoder_done = FAX_DECODE_DONE_ErrorBadA0pos; + return(lines_found); + } + break; + + case FAX_MODE_Pass: + if (!n_old_trans) { /* line above all white */ + return(-1); + } + find_b2pos(a0_pos,a0_color,n_old_trans,old_trans); + + a0_pos = b2_pos; + if (a0_pos < 0 || a0_pos >= width) { + FlushLineData(); + goal = FAX_GOAL_SeekEOLandTag; + break; + } + goal = FAX_GOAL_DetermineMode; + break; + + case FAX_GOAL_HandleVertL3: + case FAX_GOAL_HandleVertL2: + case FAX_GOAL_HandleVertL1: + case FAX_GOAL_HandleVert0: + case FAX_GOAL_HandleVertR1: + case FAX_GOAL_HandleVertR2: + case FAX_GOAL_HandleVertR3: + if (n_old_trans) { /* line above not all white */ + find_b1pos(a0_pos,a0_color,n_old_trans,old_trans); + + if (b1_pos < 0) { + if (goal > FAX_GOAL_HandleVert0) { + return(-1); /* error! */ + } + b1_pos = width; + } + } else { + /* line above was all white. Since b1 was first non-white */ + /* b1 is imaginary transition off right edge. */ + b1_pos = width; + } + /* ok, we are guaranteed that 0 <= b1_pos <= width */ + /* set a0_pos = a1_pos, which is relative to b1_pos */ + a0_pos = b1_pos + (goal-FAX_GOAL_HandleVert0); + a0_color = 1-a0_color; + new_trans[n_new_trans++] = a0_pos > 0 ? a0_pos : 0; + if (a0_pos < 0 || a0_pos >= width) { + FlushLineData(); + goal = FAX_GOAL_SeekEOLandTag; + } else { + /* not at eol yet */ + goal = FAX_GOAL_DetermineMode; + } + break; + + default: + return(-1); + break; + } /* end of switch */ + } +/*** End, Main Decoding Loop ***/ +} +/**** module fax/g32d.c ****/ diff --git a/xie/xc/programs/Xserver/XIE/mixie/fax/dg4.c b/xie/xc/programs/Xserver/XIE/mixie/fax/dg4.c new file mode 100644 index 0000000..b6d58fb --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/fax/dg4.c @@ -0,0 +1,288 @@ +/* $XConsortium: dg4.c /main/5 1995/12/02 16:50:31 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module fax/g4.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + fax/g4.c -- DDXIE G4 fax decode technique/element + + Ben Fahy -- AGE Logic, Inc. May, 1993 + +*****************************************************************************/ + + +#define _G4 +#include "fax.h" +#include "faxint.h" +#include "bits.h" + +#include + /* pick up the BITMAP_BIT_ORDER from Core X*/ + + +/**********************************************************************/ +int decode_g4(state) +FaxState *state; +{ +register int bitpos; +register unsigned char *byteptr; +register unsigned char *endptr; +register int a0_color; +register int a0_pos; +register int goal; +register int mode; /* could overload goal, but will resist */ +register int length; +register int width; + +int lines_found=0; +int n_old_trans; +int n_new_trans; +int *old_trans; +int *new_trans; +int a0a1,a1a2; +int length_acc=0; +int last_b1_idx=0; +int b1_pos,b2_pos; +int rl; + + if (state == (FaxState *)NULL) + return(-1); + + /* set up initial bitstream for the very first strip */ + if (!state->bits.started) { + if (state->strip_state != StripStateNew) { + state->decoder_done = FAX_DECODE_DONE_ErrorBadStripper; + return(-1); + } + state->bits.byteptr = (unsigned char *)state->strip; + state->bits.endptr = state->bits.byteptr + state->strip_size-4; + /* we will panic with four bytes to go */ + + state->bits.bitpos = 0; + state->bits.started = 1; + } + + localize_state(state); + + if (state->magic_needs) + finish_magic(state->final); + /* a magic strip was waiting for 1st word of next strip */ + +/*** Main Decoding Loop ***/ + while(1) { + switch(goal) { + case FAX_GOAL_StartNewLine: + + /* if any data produced by previous states, write it out */ + if (lines_found >= state->nl_sought) + save_state_and_return(state); + + /* normal line initialization stuff */ + a0_pos = -1; + a0_color = WHITE; + goal = FAX_GOAL_DetermineMode; + reset_transitions(); + break; + case FAX_GOAL_DetermineMode: + get_mode_and_length(mode,length,byteptr,bitpos,endptr); + goal = mode; + /* our goal is now to handle whatever mode we're in! */ + + if (mode != FAX_MODE_Unknown) + adjust_bitstream_8(length,byteptr,bitpos,endptr); + break; + + case FAX_GOAL_HandleHoriz: + length_acc=0; + goal = FAX_GOAL_AccumulateA0A1; + /* in case I run out of data while getting a0-a1 distance */ + + + case FAX_GOAL_AccumulateA0A1: + get_a0a1(FAX_GOAL_RecordA0A1); + /* If we have to return for data before getting the */ + /* whole a0a1 distance, we want to return to the a0a1 */ + /* accumulate state when we reenter the decoder. If */ + /* adjusting the bitstream forces us to return after */ + /* getting the last part of the a0a1 distance, then */ + /* we want to jump to state FAX_GOAL_RecordA0A1 when */ + /* we reenter the decoder. */ + + case FAX_GOAL_RecordA0A1: + a0a1 = length_acc; + length_acc=0; + goal = FAX_GOAL_AccumulateA1A2; + /* in case I run out of data while getting a1-a2 distance */ + + case FAX_GOAL_AccumulateA1A2: + get_a1a2(FAX_GOAL_FinishHoriz); + /* If we have to return for data before getting the */ + /* whole a1a2 distance, we want to return to the a1a2 */ + /* accumulate state when we reenter the decoder. If */ + /* adjusting the bitstream forces us to return after */ + /* getting the last part of the a1a2 distance, then */ + /* we want to jump to state FAX_GOAL_FinishHoriz when */ + /* we reenter the decoder. */ + + case FAX_GOAL_FinishHoriz: + a1a2 = length_acc; + if (a0_pos < 0) { + /* at start of line, a0a1 is the number of white pixels, */ + /* which is also the index on the line where white->black */ + new_trans[n_new_trans++] = a0a1; + new_trans[n_new_trans] = a0_pos = a0a1 + a1a2; + ++n_new_trans; + } else { + /* in middle of the line, a0a1 is run-length, so + * a1_pos = a0_pos + a0a1, a2_pos = a1_pos + a1a2 + * + * 0 1 2 3 4 5 6 7 8 9 A B C D + * |w |w |w |b |b |b |b |b |w | | | | | + * a0 a1 a2 + */ + new_trans[n_new_trans++] = a0_pos + a0a1; + new_trans[n_new_trans] = a0_pos = a0_pos + a0a1 + a1a2; + ++n_new_trans; + } + if (a0_pos >= width) { + if (a0_pos > width) { + state->decoder_done = FAX_DECODE_DONE_ErrorPastWidth; + save_state_and_return(state); + } + goal = FAX_GOAL_StartNewLine; + FlushLineData(); + break; + } + else + goal = FAX_GOAL_DetermineMode; + break; + + case FAX_MODE_Pass: + if (!n_old_trans) { /* line above all white */ + state->decoder_done = FAX_DECODE_DONE_ErrorPassAboveAllWhite; + save_state_and_return(state); + } + find_b2pos(a0_pos,a0_color,n_old_trans,old_trans); + + a0_pos = b2_pos; + if (a0_pos < 0) { + FlushLineData(); + goal = FAX_GOAL_StartNewLine; + break; + } + if (a0_pos >= width) { + state->decoder_done = FAX_DECODE_DONE_ErrorBadA0pos; + save_state_and_return(state); + } + goal = FAX_GOAL_DetermineMode; + break; + + case FAX_GOAL_HandleVertL3: + case FAX_GOAL_HandleVertL2: + case FAX_GOAL_HandleVertL1: + case FAX_GOAL_HandleVert0: + case FAX_GOAL_HandleVertR1: + case FAX_GOAL_HandleVertR2: + case FAX_GOAL_HandleVertR3: + if (n_old_trans) { /* line above not all white */ + find_b1pos(a0_pos,a0_color,n_old_trans,old_trans); + + if (b1_pos < 0) { + if (goal > FAX_GOAL_HandleVert0) { + state->decoder_done = FAX_DECODE_DONE_ErrorBadGoal; + save_state_and_return(state); + } + b1_pos = width; + } + } else { + /* line above was all white. Since b1 was first non-white */ + /* b1 is imaginary transition off right edge. */ + b1_pos = width; + } + /* ok, we are guaranteed that 0 <= b1_pos <= width */ + /* set a0_pos = a1_pos, which is relative to b1_pos */ + a0_pos = b1_pos + (goal-FAX_GOAL_HandleVert0); + a0_color = 1-a0_color; + new_trans[n_new_trans++] = a0_pos > 0 ? a0_pos : 0; + if (a0_pos >= width) { + FlushLineData(); + goal = FAX_GOAL_StartNewLine; + } + else { + /* not at eol yet */ + goal = FAX_GOAL_DetermineMode; + } + break; + + default: + state->decoder_done = FAX_DECODE_DONE_ErrorBadGoal; + save_state_and_return(state); + break; + } /* end of switch */ + } +/*** End, Main Decoding Loop ***/ +} +/**** module fax/g4.c ****/ diff --git a/xie/xc/programs/Xserver/XIE/mixie/fax/dtiff2.c b/xie/xc/programs/Xserver/XIE/mixie/fax/dtiff2.c new file mode 100644 index 0000000..0423a6d --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/fax/dtiff2.c @@ -0,0 +1,286 @@ +/* $XConsortium: dtiff2.c,v 1.3 94/04/17 20:34:28 rws Exp $ */ +/**** module fax/dtiff2.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + fax/dtiff2.c -- DDXIE TIFF2 fax decode technique/element + + Ben Fahy -- AGE Logic, Inc. Sept, 1993 + +*****************************************************************************/ + +/* the folling define causes extra stuff to be saved in state recorder */ +#define _G31D +#include "fax.h" +#include "faxint.h" +#include "bits.h" + +#include + /* pick up the BITMAP_BIT_ORDER from Core X*/ + +/**********************************************************************/ +int decode_tiff2(state) +FaxState *state; +{ +register int bitpos; +register unsigned char *byteptr; +register unsigned char *endptr; +register int a0_color; +register int a0_pos; +register int a1_pos; +register int goal; +register int width; +register int rl; +register int last_b1_idx = 0; + +int lines_found=0; +int n_old_trans; +int n_new_trans; +int *old_trans; +int *new_trans; +int a0a1,a1a2; +int length_acc=0; + + if (state == (FaxState *)NULL) + return(-1); + + /* set up initial bitstream for the very first strip */ + if (!state->bits.started) { + if (state->strip_state != StripStateNew) { + state->decoder_done = FAX_DECODE_DONE_ErrorBadStripper; + return(-1); + } + state->bits.byteptr = (unsigned char *)state->strip; + state->bits.endptr = state->bits.byteptr + state->strip_size-4; + /* we will panic with four bytes to go */ + + state->bits.bitpos = 0; + state->bits.started = 1; + } + + localize_state(state); + + if (state->magic_needs) + finish_magic(state->final); + /* a magic strip was waiting for 1st word of next strip */ + +/*** Main Decoding Loop ***/ + while(1) { + switch(goal) { + + case FAX_GOAL_StartNewLine: + + skip_bits_at_eol(byteptr,bitpos,endptr); + + if (lines_found >= state->nl_sought) + save_state_and_return(state); + + /* normal line initialization stuff */ + a0_pos = -1; + a0_color = WHITE; + goal = FAX_GOAL_HandleHoriz; + + reset_transitions(); + break; + + case FAX_GOAL_HandleHoriz: + length_acc=0; + goal = FAX_GOAL_AccumulateA0A1; + /* in case I run out of data while getting a0-a1 distance */ + + case FAX_GOAL_AccumulateA0A1: + get_a0a1(FAX_GOAL_RecordA0A1); + /* If we have to return for data before getting the */ + /* whole a0a1 distance, we want to return to the a0a1 */ + /* accumulate state when we reenter the decoder. If */ + /* adjusting the bitstream forces us to return after */ + /* getting the last part of the a0a1 distance, then */ + /* we want to jump to state FAX_GOAL_RecordA0A1 when */ + /* we reenter the decoder. */ + + case FAX_GOAL_FallOnSword: + if (goal == FAX_GOAL_FallOnSword) { + /* received a yucky code */ + state->decoder_done = FAX_DECODE_DONE_ErrorBadCode; + save_state_and_return(state); + } + + case FAX_GOAL_RecoverZero: + /* g31d can recover. tiff2, alas, cannot */ + if (goal == FAX_GOAL_RecoverZero) { + state->decoder_done = FAX_DECODE_DONE_ErrorBadZero; + save_state_and_return(state); + } + + case FAX_GOAL_RecordA0A1: + a0a1 = length_acc; + if (a0a1 < 0) { + state->decoder_done = FAX_DECODE_DONE_ErrorBada0a1; + save_state_and_return(state); + } + if (a0_pos < 0) { + /* at start of line, a0a1 is the number of white pixels, */ + /* which is also the index on the line where white->black */ + new_trans[n_new_trans++] = a1_pos = a0a1; + } else { + /* in middle of the line, a0a1 is run-length, so + * a1_pos = a0_pos + a0a1, a2_pos = a1_pos + a1a2 + * + * 0 1 2 3 4 5 6 7 8 9 A B C D + * |w |w |w |b |b |b |b |b |w | | | | | + * a0 a1 a2 + */ + new_trans[n_new_trans++] = a1_pos = a0_pos + a0a1; + } + if (a1_pos >= width) { + if (a1_pos > width) { + state->decoder_done = FAX_DECODE_DONE_ErrorPastWidth; + save_state_and_return(state); + } + FlushLineData(); + goal = FAX_GOAL_StartNewLine; + break; + } + if (new_trans[n_new_trans-1] < 0){ + state->decoder_done = FAX_DECODE_DONE_ErrorPastWidth; + save_state_and_return(state); + } + + if (rl == EOL_RUN_LENGTH) { + state->decoder_done = FAX_DECODE_DONE_ErrorBadEOL; + save_state_and_return(state); + break; + /* break out of the switch, loop with the while */ + } + length_acc=0; + goal = FAX_GOAL_AccumulateA1A2; + /* in case I run out of data while getting a1-a2 distance */ + + case FAX_GOAL_AccumulateA1A2: + get_a1a2(FAX_GOAL_FinishHoriz); + /* If we have to return for data before getting the */ + /* whole a1a2 distance, we want to return to the a1a2 */ + /* accumulate state when we reenter the decoder. If */ + /* adjusting the bitstream forces us to return after */ + /* getting the last part of the a1a2 distance, then */ + /* we want to jump to state FAX_GOAL_FinishHoriz when */ + /* we reenter the decoder. */ + + /* handle various possible errors found by get_a1a2 */ + if (goal == FAX_GOAL_FallOnSword) { + state->decoder_done = FAX_DECODE_DONE_ErrorBadCode; + save_state_and_return(state); + } + if (goal == FAX_GOAL_RecoverZero ) { + state->decoder_done = FAX_DECODE_DONE_ErrorBadZero; + save_state_and_return(state); + } + if (rl == EOL_RUN_LENGTH) { + state->decoder_done = FAX_DECODE_DONE_ErrorBadEOL; + save_state_and_return(state); + break; + } + + case FAX_GOAL_FinishHoriz: + a1a2 = length_acc; + /* XXX - I may regret not checking for a1a2 > 0 later... */ + if (a1a2 < 0) { + state->decoder_done = FAX_DECODE_DONE_ErrorBada1a2; + save_state_and_return(state); + } + + new_trans[n_new_trans] = a0_pos = new_trans[n_new_trans-1]+a1a2; + ++n_new_trans; + if (a0_pos < 0) { + state->decoder_done = FAX_DECODE_DONE_ErrorBadA0pos; + save_state_and_return(state); + } + + if (a0_pos >= width) { + if (a0_pos > width) { + state->decoder_done = FAX_DECODE_DONE_ErrorPastWidth; + save_state_and_return(state); + } + FlushLineData(); + if (state->decoder_done) + save_state_and_return(state); + goal = FAX_GOAL_StartNewLine; + break; + } + else + goal = FAX_GOAL_HandleHoriz; + break; + + + default: + state->decoder_done = FAX_DECODE_DONE_ErrorBadGoal; + save_state_and_return(state); + break; + } /* end of switch */ + } +/*** End, Main Decoding Loop ***/ +} +/**** module fax/dtiff2.c ****/ diff --git a/xie/xc/programs/Xserver/XIE/mixie/fax/dtiffpb.c b/xie/xc/programs/Xserver/XIE/mixie/fax/dtiffpb.c new file mode 100644 index 0000000..1528c95 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/fax/dtiffpb.c @@ -0,0 +1,293 @@ +/* $XConsortium: dtiffpb.c /main/4 1995/12/02 16:50:34 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module fax/tiffpb.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + fax/tiffpb.c -- DDXIE TIFF Packbits decode technique/element + + Packbits is output-type independent. The compression algorithm + just compresses a stream. The 'strip_size' parameter should be + how many bytes long the strip is... + + Coding assumption: it is always valid to do val = *byteptr++; + But any code which does this is responsible for making sure + the next access will also be valid. Otherwise, we should + save state and return. + + Ben Fahy -- AGE Logic, Inc. Sept, 1993 + +*****************************************************************************/ + +/* the folling define causes extra stuff to be saved in state recorder */ +#define _PBits + +#include "fax.h" +#include "faxint.h" +#include "bits.h" +#include "xiemd.h" + +/* by decree of PackBits spec */ + +/**********************************************************************/ +int decode_tiffpb(state) +FaxState *state; +{ +register int a0_color,a0_pos; +register unsigned char *byteptr; +register unsigned char *endptr; +register int goal; +register int width,rnd_width; +register int rl; + +register int lines_found=0; +int length_acc=0; + +/*** output line stuff ***/ +register unsigned char *olp; +register int i,a0_in_bytes; + + if (state == (FaxState *)NULL) + return(-1); + + /* set up initial bitstream for the very first strip */ + if (!state->bits.started) { + if (state->strip_state != StripStateNew) { + state->decoder_done = FAX_DECODE_DONE_ErrorBadStripper; + return(-1); + } + + state->bits.byteptr = (unsigned char *)state->strip; + state->bits.endptr = state->bits.byteptr + state->strip_size; + /* record end of input strip */ + + state->bits.bitpos = 0; + state->bits.started = 1; + + } + + if (state->magic_needs) { + if (state->strip_state == StripStateNew) { + state->strip_state = StripStateInUse; + state->bits.byteptr = (unsigned char *)state->strip; + state->bits.endptr = state->bits.byteptr + state->strip_size; + /* record end of input strip */ + state->bits.bitpos = 0; + state->bits.started = 1; + } + else { + /* no new strip?? But... I *need* more data! */ + state->decoder_done = FAX_DECODE_DONE_ErrorBadMagic; + return(lines_found); + } + state->magic_needs = 0; + } + + localize_state(state); + rnd_width = 8 * ((width+7)/8); + + olp = (unsigned char *) state->o_lines[lines_found]; + +/*** Main Decoding Loop ***/ + while(1) { + switch(goal) { + case PB_GOAL_StartNewLine: + if (lines_found >= state->nl_sought) { + save_state_and_return(state); + } + + a0_pos = 0; + olp = (unsigned char *) state->o_lines[lines_found]; + goal = PB_GOAL_GetRunLength; + break; + + case PB_GOAL_GetRunLength: + +/*** Basic Packbits algorithm: + +code = *((signed char *)byteptr++); + +if (0 <= code && code <= 127) ===> length = code + 1; + +if (-127 <= code && code < 0) ===> length = 1 - code; + +else ===> length = 0 + +We can make things a little quicker (and avoid signed char compiler issues) +if we simply look for whether the high bit is on or off, and then compute +the result directly. Thus, + +if code && 0x80 => -128 <= code < 0 + + 0x80 + foo = -128 + foo + + so length = 1 - code = 1 - (-128 + foo) = 129 - foo. + + note foo=0 is code for runlength 0 (fill) + +The positive case is even easier. + +***/ + if (byteptr >= endptr) { + state->magic_needs = 1; + state->strip_state = StripStateDone; + save_state_and_return(state); + } + if (*byteptr & 0x80) { /* -128 <= code < 0 */ + register int foo = 0x7f & *byteptr; + if (foo) { + length_acc = 129 - foo ; + goal = PB_GOAL_GetRepeatByte; + } + else { + length_acc = 0; /* -128 => code = 0 */ + } + } + else { /* 0 <= code <= 127 */ + length_acc = 1 + *byteptr; + goal = PB_GOAL_GetLiteralBytes; + } + ++byteptr; + + /* make sure all the pixels fit on this output line */ + if (8*length_acc + a0_pos > rnd_width ) { + state->decoder_done = FAX_DECODE_DONE_ErrorPastWidth; + save_state_and_return(state); + } + break; + + case PB_GOAL_GetLiteralBytes: + /* Important Note!! we are guaranteed that output line + has enough space to hold output pixels here. We checked + in the GetRunLength state. However, it is possible we + may run out of input bytes, in which case we may have + to save state and return. + */ + a0_in_bytes = a0_pos / 8; + while (length_acc > 0) { + if (byteptr >= endptr) { + a0_pos = a0_in_bytes << 3; + state->magic_needs = 1; + state->strip_state = StripStateDone; + save_state_and_return(state); + } + a0_color = *byteptr++; length_acc--; +#if (IMAGE_BYTE_ORDER == MSBFirst) + olp[a0_in_bytes++] = a0_color; +#else + olp[a0_in_bytes++] = _ByteReverseTable[a0_color]; +#endif + } + a0_pos = a0_in_bytes << 3; + + if (a0_pos >= width) { + ++lines_found; + goal = PB_GOAL_StartNewLine; + } + else + goal = PB_GOAL_GetRunLength; + + break; + + case PB_GOAL_GetRepeatByte: + if (byteptr >= endptr) { + state->magic_needs = 1; + state->strip_state = StripStateDone; + save_state_and_return(state); + } + a0_color = *byteptr++; + + /* Important Note!! we are guaranteed that output line + has enough space to hold output pixels here. We checked + in the GetRunLength state + */ + + a0_in_bytes = a0_pos / 8; + for (i=0; i= width) { + ++lines_found; + goal = PB_GOAL_StartNewLine; + } + else + goal = PB_GOAL_GetRunLength; + + break; + + default: + state->decoder_done = FAX_DECODE_DONE_ErrorBadGoal; + save_state_and_return(state); + } /* end of switch */ + } /* end of main decoding loop */ +} + +/**** module fax/tiffpb.c ****/ diff --git a/xie/xc/programs/Xserver/XIE/mixie/fax/eg31d.c b/xie/xc/programs/Xserver/XIE/mixie/fax/eg31d.c new file mode 100644 index 0000000..0f81106 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/fax/eg31d.c @@ -0,0 +1,290 @@ +/* $XConsortium: eg31d.c,v 1.3 94/04/17 20:34:30 rws Exp $ */ +/**** module eg31d.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + eg31d.c -- DDXIE module for encoding g31d format + + Ben Fahy, AGE Logic, Oct 1993 + + XXX - this module should be merged with etiff2.c - the only + difference is the way EOL's are coded. + +******************************************************************************/ + +#include "fax.h" +#define _G31D +#include "fencode.h" +#include "xiemd.h" +#include "fetabs.h" + +/************************************************************************/ +encode_g31d(state) +FaxEncodeState *state; +{ +/* stuff exchanged with state variable */ +register int goal; +register unsigned char *byteptr; +register unsigned char *endptr; +register int bitpos; +register int width; +register int stager; +int rl; +register int a0_color; +G31DEncodePvt *epvt; + +/* stuff exchanged with private state variable */ +register int index; +register int nvals; +register int *counts; +register int nbits; +int rlcode; +int terminating; +register int codelength; + +register int lines_coded=0; +register int lines_to_code=0; + +int old_rl; + + if (state == (FaxEncodeState *) NULL) + return(-1); + + /* set up initial bitstream for the very first output strip */ + if (!state->bits.started) { + if (state->strip_state != StripStateNew) { + state->encoder_done = ENCODE_ERROR_StripStateNotNew; + return(-1); + } + + state->bits.byteptr = (unsigned char *)state->strip; + state->bits.endptr = state->bits.byteptr + state->strip_size; + /* record end of output strip */ + + state->bits.bitpos = 0; + state->bits.started = 1; + state->strip_state = StripStateInUse; + } + + /* or, reset bitstream for a new output strip */ + if (state->magic_needs) { + if (state->strip_state == StripStateNew) { + state->strip_state = StripStateInUse; + state->bits.byteptr = (unsigned char *)state->strip; + state->bits.endptr = state->bits.byteptr + state->strip_size; + /* record end of output strip */ + state->bits.started = 1; + } + else { + /* no new strip?? But... I *need* more data! */ + state->encoder_done = ENCODE_ERROR_BadMagic; + return(-1); + } + state->magic_needs = 0; + } + + localize_state(state); + + +/*** Main Encoding Loop ***/ + while (1) { + + switch(goal) { + + case ENCODE_FAX_GOAL_StartNewLine: + /* every new line need to write an EOL. Should call it BOL,huh? */ + + if (epvt->align_eol) { + /* advance bitpos to 4 + 8k, where k is an integer */ + bitpos = 4 + 8*( (bitpos+3)>>3 ); + } + + stager |= (EOL_CODE << (16-bitpos)); + bitpos += EOL_BIT_LENGTH; + + goal = ENCODE_FAX_GOAL_FlushEOL; + + case ENCODE_FAX_GOAL_FlushEOL: + if (byteptr >= endptr) { + state->strip_state = StripStateDone; + state->magic_needs = 1; + save_state_and_return(state); + } + /* if here, we know it is safe to flush at least one byte */ + *byteptr++ = (stager&0xff000000) >> 24; + stager <<= 8; + bitpos -= 8; + if (bitpos >=8) { + /* go around and flush some more */ + break; + } + + goal = ENCODE_FAX_GOAL_EOLWritten; + + if (lines_coded >= state->nl_tocode) { + /* We have read the whole input strip, need more data */ + save_state_and_return(state); + } + + case ENCODE_FAX_GOAL_EOLWritten: + + /* every new line we need to compute its runlength data */ + /* get the sequence of white and black run lengths */ + nvals = encode_runs( + state->i_lines[lines_coded], /* input data */ + width, /* # of bits */ + counts, /* where to put lengths */ + state->radiometric, /* if 1, white is 1 */ + width + ); + if (nvals < 0) { + state->encoder_done = ENCODE_ERROR_EncodeRunsFailure; + save_state_and_return(state); + } + a0_color = WHITE; + index = 0; + + case ENCODE_FAX_GOAL_OutputNextRunLength: + rl = counts[index++]; + old_rl = rl; + + case ENCODE_FAX_GOAL_DeduceCode: + nbits = deduce_code(a0_color,&rl,&rlcode,&terminating); + /* should be a macro but for now, a function */ + + /* shift code over so it merges with stager contents */ + stager |= (rlcode << (16-bitpos)); + bitpos += nbits; + + if (bitpos >=8) { + goal = ENCODE_FAX_GOAL_FlushStager; + break; + } + if (terminating) { + /* all done with this runlength */ + if (index < nvals) { + a0_color = ~a0_color; + goal = ENCODE_FAX_GOAL_OutputNextRunLength; + break; + } + else { + goal = ENCODE_FAX_GOAL_FinishLine; + break; + } + } + /* go around the loop again */ + goal = ENCODE_FAX_GOAL_DeduceCode; + old_rl = rl; + break; + + case ENCODE_FAX_GOAL_FlushStager: + if (byteptr >= endptr) { + state->strip_state = StripStateDone; + state->magic_needs = 1; + save_state_and_return(state); + } + /* if here, we know it is safe to flush at least one byte */ + *byteptr++ = (stager&0xff000000) >> 24; + stager <<= 8; + bitpos -= 8; + + if (bitpos >= 8) { + /* go around the loop again, trying to flush more */ + break; + } + /* if here, we have flushed stager to the point there is */ + /* at most a partial byte of data left in it. */ + if (terminating) { + /* all done with this runlength */ + if (index < nvals) { + a0_color = ~a0_color; + goal = ENCODE_FAX_GOAL_OutputNextRunLength; + break; + } + else { + goal = ENCODE_FAX_GOAL_FinishLine; + break; + } + } + /* not done with this runlength yet */ + goal = ENCODE_FAX_GOAL_DeduceCode; + break; + + case ENCODE_FAX_GOAL_FinishLine: + ++lines_coded; + goal = ENCODE_FAX_GOAL_StartNewLine; + break; + + default: + state->encoder_done = ENCODE_ERROR_BadMagic; + save_state_and_return(state); + break; + + } /* end of switch(goal) in main decoding loop */ + + } /* end of main encoding loop */ +} +/************************************************************************/ diff --git a/xie/xc/programs/Xserver/XIE/mixie/fax/eg32d.c b/xie/xc/programs/Xserver/XIE/mixie/fax/eg32d.c new file mode 100644 index 0000000..b322dba --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/fax/eg32d.c @@ -0,0 +1,671 @@ +/* $XConsortium: eg32d.c,v 1.3 94/04/17 20:34:30 rws Exp $ */ +/**** module eg32d.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + eg32d.c -- DDXIE module for encoding g32d format. Since + g42d is so similar, we also do that in + this module. + + Ben Fahy, AGE Logic, Oct 1993 + +******************************************************************************/ + +#include "fax.h" +#define _G32D +#include "fencode.h" +#include "xiemd.h" +#include "fetabs.h" + +/************************************************************************/ +encode_g32d(state) +FaxEncodeState *state; +{ +/* stuff exchanged with state variable */ +register int goal,next_goal; +register unsigned char *byteptr; +register unsigned char *endptr; +register int bitpos; +register int width; +CARD32 stager; +unsigned rl; +register int a0_color,b1_color; +register int a0_pos,a1_pos,a2_pos,b1_pos,b2_pos; +register int length_acc; +register int a0a1,a1a2; +G32DEncodePvt *epvt; + +/* stuff exchanged with private state variable */ +register int index,aindex; +register int save_index,save_aindex; +register int nvals,avals; +register int *counts; +register int *above; +register int nbits; +int rlcode; +int terminating; +register int codelength; +register int k,kcnt,save_b1pos,save_b1color; + +register int lines_coded=0; +register int lines_to_code=0; +register int a1b1,abs_a1b1; +int old_rl; + + if (state == (FaxEncodeState *) NULL) { + return(-1); + } + + /* set up initial bitstream for the very first output strip */ + if (!state->bits.started) { + if (state->strip_state != StripStateNew) { + state->encoder_done = ENCODE_ERROR_StripStateNotNew; + return(-1); + } + + state->bits.byteptr = (unsigned char *)state->strip; + state->bits.endptr = state->bits.byteptr + state->strip_size; + /* record end of output strip */ + + state->bits.bitpos = 0; + state->bits.started = 1; + state->strip_state = StripStateInUse; + } + + /* or, reset bitstream for a new output strip */ + if (state->magic_needs) { + if (state->strip_state == StripStateNew) { + state->strip_state = StripStateInUse; + state->bits.byteptr = (unsigned char *)state->strip; + state->bits.endptr = state->bits.byteptr + state->strip_size; + /* record end of output strip */ + state->bits.started = 1; + } + else { + /* no new strip?? But... I *need* more data! */ + state->encoder_done = ENCODE_ERROR_BadMagic; + return(0); + } + state->magic_needs = 0; + } + + localize_state(state); + /* loads epvt and other variables */ + + +/*** Main Encoding Loop ***/ + while (1) { + + switch(goal) { + + case ENCODE_FAX_GOAL_StartNewLine: + /* every new line need to write an EOL. Should call it BOL,huh? */ + + /* make old counts the new reference line */ + { + int *foo; + foo = counts; + counts = above; + above = foo; + avals = nvals; + } + + if (epvt->really_g4) { + /* G4 doesn't write the silly EOL's except at very end */ + goal = ENCODE_FAX_GOAL_G4SneaksIn; + break; + } + + if (epvt->align_eol) { + /* advance bitpos to 4 + 8k, where k is an integer */ + bitpos = 4 + 8*( (bitpos+3)>>3 ); + } + + if (kcnt % k) { + + /* need to encode in 2-D mode */ + rlcode = EOL_2D_CODE; + + stager |= (EOL_2D_CODE << (16-bitpos)); + bitpos += EOL_2D_BIT_LENGTH; + + } + else { + rlcode = EOL_1D_CODE; + stager |= (EOL_1D_CODE << (16-bitpos)); + bitpos += EOL_1D_BIT_LENGTH; + } + + goal = ENCODE_FAX_GOAL_FlushEOL; + + case ENCODE_FAX_GOAL_FlushEOL: + if (byteptr >= endptr) { + state->strip_state = StripStateDone; + state->magic_needs = 1; + save_state_and_return(state); + } + /* if here, we know it is safe to flush at least one byte */ + *byteptr++ = (stager&0xff000000) >> 24; + stager <<= 8; + bitpos -= 8; + if (bitpos >=8) { + /* go around and flush some more */ + break; + } + + goal = ENCODE_FAX_GOAL_EOLWritten; + + case ENCODE_FAX_GOAL_G4SneaksIn: + if (lines_coded >= state->nl_tocode) { + /* We have read the whole input strip, need more data */ + save_state_and_return(state); + } + + case ENCODE_FAX_GOAL_EOLWritten: + + /* every new line we need to compute its runlength data */ + /* get the sequence of white and black run lengths */ + nvals = encode_runs( + state->i_lines[lines_coded], /* input data */ + width, /* # of bits */ + counts, /* where to put lengths */ + state->radiometric, /* if 1, white is 1 */ + width + ); + if (nvals < 0) { + state->encoder_done = ENCODE_ERROR_EncodeRunsFailure; + save_state_and_return(state); + } + a0_color = WHITE; + index = 0; + if (epvt->really_g4 || kcnt % k) { + aindex = 0; + a0_pos = -1; + b1_color = WHITE; + b1_pos = 0; + goal = ENCODE_FAX_GOAL_FindPositions; + length_acc = 0; + break; + } + + case ENCODE_FAX_GOAL_OutputNextRunLength: + rl = counts[index++]; + old_rl = rl; + next_goal = ENCODE_FAX_GOAL_OutputNextRunLength; + /* after we write code for this runlength, go to next */ + + case ENCODE_FAX_GOAL_DeduceCode: + nbits = deduce_code(a0_color,&rl,&rlcode,&terminating); + /* should be a macro but for now, a function */ + + /* shift code over so it merges with stager contents */ + + stager |= (rlcode << (16-bitpos)); + bitpos += nbits; + + + if (bitpos >=8) { + goal = ENCODE_FAX_GOAL_FlushStager; + break; + } + if (terminating) { + /* all done with this runlength */ + if (next_goal != ENCODE_FAX_GOAL_OutputNextRunLength) { + goal = next_goal; + break; + } + + if (index < nvals) { + a0_color = ~a0_color; + goal = next_goal; + break; + } + else { + goal = ENCODE_FAX_GOAL_FinishLine; + break; + } + } + /* go around the loop again */ + goal = ENCODE_FAX_GOAL_DeduceCode; + old_rl = rl; + break; + + case ENCODE_FAX_GOAL_FlushStager: + if (byteptr >= endptr) { + state->strip_state = StripStateDone; + state->magic_needs = 1; + save_state_and_return(state); + } + /* if here, we know it is safe to flush at least one byte */ + *byteptr++ = (stager&0xff000000) >> 24; + stager <<= 8; + bitpos -= 8; + + if (bitpos >= 8) { + /* go around the loop again, trying to flush more */ + break; + } + /* if here, we have flushed stager to the point there is */ + /* at most a partial byte of data left in it. */ + if (terminating) { + /* all done with this runlength */ + if (next_goal != ENCODE_FAX_GOAL_OutputNextRunLength) { + goal = next_goal; + break; + } + + if (index < nvals) { + a0_color = ~a0_color; + goal = next_goal; + break; + } + else { + goal = ENCODE_FAX_GOAL_FinishLine; + break; + } + } + /* not done with this runlength yet */ + goal = ENCODE_FAX_GOAL_DeduceCode; + old_rl = rl; + break; + + case ENCODE_FAX_GOAL_FinishLine: + ++lines_coded; + ++kcnt; + goal = ENCODE_FAX_GOAL_StartNewLine; + break; + + case ENCODE_FAX_GOAL_FindPositions: + save_index = index; + save_aindex = aindex; + save_b1pos = b1_pos; + save_b1color = b1_color; + /* it's easier to just remember these than to back up */ + if (index >= nvals) { + a1_pos = a2_pos = state->width; + ++index; + /* this is for the sake of vertical mode below */ + } + else { + if (a0_pos < 0) + a1_pos = counts[index++]; + else + a1_pos = a0_pos + (counts[index++] - length_acc); + /* note: we need to subtract length_acc in case + we hit one or more pass modes for this index, + in which case a0_pos was incremented part of + the distance between a0 and a1... + */ + } + + if (index >= nvals) { + a2_pos = state->width; + ++index; + /* this is just so we can subtract to get a1's index */ + } + else + a2_pos = a1_pos + counts[index++]; + + /* now find b1, which is first changing element to right + of a0 of opposite color */ + + while (aindex < avals && + (b1_color == a0_color || b1_pos <= a0_pos) ) { + b1_pos += above[aindex++]; + b1_color = ~b1_color; + } + if (aindex >= avals) { + + /* if no b1 found, set it just past normal image data */ + /* now, the sum of all 'above[index]'s should be equal */ + /* to the image width, so this gives us a check that */ + /* the runlength algorithm is working */ + + if (b1_pos != width) { + state->encoder_done = ENCODE_ERROR_NoB1Found; + save_state_and_return(state); + } + b2_pos = width+1; + } + if (aindex >= avals) { + if (b1_pos == width) + b2_pos = state->width + 1; + else + b2_pos = state->width; + } + else + b2_pos = b1_pos + above[aindex]; + + if (b2_pos < a1_pos) { + goal = ENCODE_FAX_GOAL_PassMode; + break; + } + length_acc = 0; + /* we won't linger on this a0 anymore */ + + a1b1 = b1_pos-a1_pos; + abs_a1b1 = (a1b1 >=0)? a1b1 : -a1b1; + if (abs_a1b1 <= 3) { + goal = ENCODE_FAX_GOAL_VerticalMode; + } + else + goal = ENCODE_FAX_GOAL_HorizontalMode; + break; + + + case ENCODE_FAX_GOAL_PassMode: + /* pass mode is nice and simple. a0_pos = b2_pos */ + + rlcode = PASS_CODE; + nbits = PASS_CODE_BIT_LENGTH; + + stager |= (rlcode << (16-bitpos)); + bitpos += nbits; + + /* before worrying about flushing, let's update positions */ + if (a0_pos < 0) + length_acc = b2_pos; + else + length_acc += b2_pos - a0_pos; + /* don't count passed length twice */ + + a0_pos = b2_pos; + index = save_index; + + b1_pos = b2_pos; + /* new b1_position will be old b2_position */ + b1_color = ~b1_color; + ++aindex; + + if (bitpos >=8) + goal = ENCODE_FAX_GOAL_Flush2DStager; + else { + + if (a0_pos >= width) { + goal = ENCODE_FAX_GOAL_FinishLine; + } + else { + goal = ENCODE_FAX_GOAL_FindPositions; + } + } + break; + + case ENCODE_FAX_GOAL_HorizontalMode: + + rlcode = HORIZONTAL_CODE; + nbits = HORIZONTAL_CODE_LENGTH; + + stager |= (rlcode << (16-bitpos)); + bitpos += nbits; + + if (bitpos < 8) { + goal = ENCODE_FAX_GOAL_FlushedHCode; + break; + } + goal = ENCODE_FAX_GOAL_FlushHCode; + + if (byteptr >= endptr) { + state->strip_state = StripStateDone; + state->magic_needs = 1; + save_state_and_return(state); + } + + case ENCODE_FAX_GOAL_FlushHCode: + + /* if here, we know it is safe to flush at least one byte */ + *byteptr++ = (stager&0xff000000) >> 24; + stager <<= 8; + bitpos -= 8; + + if (bitpos >= 8) { + /* go around the loop again, trying to flush more */ + break; + } + /* if here, we have flushed stager */ + + case ENCODE_FAX_GOAL_FlushedHCode: + a0a1 = a1_pos - a0_pos; + if (a0_pos == -1) + a0a1 -= 1; + a1a2 = a2_pos - a1_pos; + rl = old_rl = a0a1; + goal = ENCODE_FAX_GOAL_DeduceCode; + /* will loop through writing out the code for a0a1 */ + + next_goal = ENCODE_FAX_GOAL_DoneWithA0A1; + /* when done writing a0a1 codes, will go to DoneWithA0A1 */ + + /* before going on, let's set up for the next iteration */ + a0_pos = a2_pos; + /* a0 skips to a2, index adjusted automatically */ + + b1_pos = save_b1pos; + b1_color = save_b1color; + /* it's too painful to figure out what b1 was */ + + aindex = save_aindex; + /* we don't know enough to advance b1 */ + break; + + case ENCODE_FAX_GOAL_DoneWithA0A1: + rl = old_rl = a1a2; + a0_color = ~a0_color; + /* here, "a0_color" represents color of next rl */ + goal = ENCODE_FAX_GOAL_DeduceCode; + /* will loop through writing out the code for a0a1 */ + next_goal = ENCODE_FAX_GOAL_DoneWithA1A2; + /* when done writing a1a2 codes, will go to DoneWithA1A2 */ + break; + + case ENCODE_FAX_GOAL_DoneWithA1A2: + a0_color = ~a0_color; + /* restore "a0_color" to really meaning a0 color */ + if (a0_pos >= width) { + goal = ENCODE_FAX_GOAL_FinishLine; + } + else { + goal = ENCODE_FAX_GOAL_FindPositions; + } + break; + + case ENCODE_FAX_GOAL_VerticalMode: + + DEDUCE_Vcode(a1b1,rlcode,nbits); + + stager |= (rlcode << (16-bitpos)); + bitpos += nbits; + + /* before picking next state, set new a0_position and + point indexes into 'count' and 'above' to the right + place. saved indexes help a lot here. + */ + a0a1 = a1_pos - a0_pos; + a0_pos = a1_pos; + + if (a1b1 > 0) { + /* b1 is to the right of a1. It is possible that + when we set a0' = a1, b1' will be left of b1: + + 0 1 2 3 4 + b1' b1 + O O 0 X 0 + O X O X + a0 a1 + a0' + + In the example above, b1 for the original a0 at 1 + is the X->O transition at 4. When a1 is coded, and + a1 becomes the new a0 (a0'), the O->X transition at + 3 is b1'. In other words, the progression of b1 is + *not* monotonic!! So we have to be careful... + + The condition under which backup is necessary is + when b1 is 2 or 3 to the right of a1, and there + was a transition just before b1, right of a1. To + get the next position on a line, we always take + + new_pos = old_pos + above[index++] + + Therefore, the previous position was + + old_pos = new_pos - above[index-1] + + We need to back up if above[index-1] < a1b1. + If we incremented index twice to get to b2, + then we have to consider above[index-2] + + */ + + /* things are simple if b1_pos was off the edge */ + if (b1_pos >= width && avals>=2 && above[avals-1] < a1b1) { + /* if b1_pos was off the edge, above[avals-1] */ + /* added to the previous b1 got us there. So */ + /* we get old b1 by subtracting above[avals-1] */ + b1_pos = width - above[avals-1]; + aindex = avals-2; + b1_color = ~b1_color; + } + else if (aindex >= 1 && above[aindex-1] < a1b1) { + b1_pos = b1_pos - above[aindex-1]; + /* note: we don't increment aindex after */ + /* computing b2_pos = b1_pos + above[aindex], */ + /* so above[aindex-1] is how we got b1_pos */ + aindex = aindex-1; + /* index for element before the b1 */ + b1_color = ~b1_color; + /* previous color */ + } + + } + else { + /* b1 is left of or over a1. + + 0 1 2 3 4 + b1 + O O X 0 + O X X X O X + a0 a1 + a0' + + Since the b1' for a0' must be to the right of a0'=a1, + b1' must be to the right of b1. However, if we set + our position to b2, we may go too far, so stay where + we are. Be coo'! + */ + + /* aindex was updated while seeking b2 */ + } + a0_color = ~a0_color; + --index; + /* in code above, we made sure we always increment index */ + /* after setting a2, even if a1 or a2 was off end of line */ + + if (bitpos >=8) + goal = ENCODE_FAX_GOAL_Flush2DStager; + else { + if (a0_pos >= width) { + goal = ENCODE_FAX_GOAL_FinishLine; + } + else { + goal = ENCODE_FAX_GOAL_FindPositions; + } + } + break; + + case ENCODE_FAX_GOAL_Flush2DStager: + if (byteptr >= endptr) { + state->strip_state = StripStateDone; + state->magic_needs = 1; + save_state_and_return(state); + } + /* if here, we know it is safe to flush at least one byte */ + *byteptr++ = (stager&0xff000000) >> 24; + stager <<= 8; + bitpos -= 8; + + if (bitpos >= 8) { + /* go around the loop again, trying to flush more */ + break; + } + /* if here, we have flushed stager to the point there is */ + /* at most a partial byte of data left in it. */ + if (a0_pos >= width) { + goal = ENCODE_FAX_GOAL_FinishLine; + } + else { + goal = ENCODE_FAX_GOAL_FindPositions; + } + break; + + default: + state->encoder_done = ENCODE_ERROR_BadMagic; + save_state_and_return(state); + + } /* end of switch(goal) in main decoding loop */ + + } /* end of main encoding loop */ +} +/************************************************************************/ diff --git a/xie/xc/programs/Xserver/XIE/mixie/fax/etiff2.c b/xie/xc/programs/Xserver/XIE/mixie/fax/etiff2.c new file mode 100644 index 0000000..c6ca3a8 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/fax/etiff2.c @@ -0,0 +1,408 @@ +/* $XConsortium: etiff2.c,v 1.3 94/04/17 20:34:31 rws Exp $ */ +/**** module etiff2.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + etiff2.c -- DDXIE module for encoding tiff2 format + + Ben Fahy, AGE Logic, Sept 1993 + +******************************************************************************/ + +#include "fax.h" +#define _TIFF2 +#include "fencode.h" +#include "xiemd.h" +#define FETABS_OWNER +#include "fetabs.h" + +/************************************************************************/ +encode_tiff2(state) +FaxEncodeState *state; +{ +/* stuff exchanged with state variable */ +register int goal; +register unsigned char *byteptr; +register unsigned char *endptr; +register int bitpos; +register int width; +register int stager; +int rl; +register int a0_color; +Tiff2EncodePvt *epvt; + +/* stuff exchanged with private state variable */ +register int index; +register int nvals; +register int *counts; +register int nbits; +int rlcode; +int terminating; +register int codelength; + +register int lines_coded=0; +register int lines_to_code=0; +int old_rl; + + if (state == (FaxEncodeState *) NULL) + return(-1); + + /* set up initial bitstream for the very first output strip */ + if (!state->bits.started) { + if (state->strip_state != StripStateNew) { + state->encoder_done = ENCODE_ERROR_StripStateNotNew; + return(-1); + } + + state->bits.byteptr = (unsigned char *)state->strip; + state->bits.endptr = state->bits.byteptr + state->strip_size; + /* record end of output strip */ + + state->bits.bitpos = 0; + state->bits.started = 1; + state->strip_state = StripStateInUse; + } + + /* or, reset bitstream for a new output strip */ + if (state->magic_needs) { + if (state->strip_state == StripStateNew) { + state->strip_state = StripStateInUse; + state->bits.byteptr = (unsigned char *)state->strip; + state->bits.endptr = state->bits.byteptr + state->strip_size; + /* record end of output strip */ + state->bits.started = 1; + } + else { + /* no new strip?? But... I *need* more data! */ + state->encoder_done = ENCODE_ERROR_BadMagic; + return(-1); + } + state->magic_needs = 0; + } + + localize_state(state); + + +/*** Main Encoding Loop ***/ + while (1) { + + switch(goal) { + + case ENCODE_FAX_GOAL_StartNewLine: + /* every new line we need to compute its runlength data */ + + if (lines_coded >= state->nl_tocode) { + /* We have read the whole input strip, need more data */ + save_state_and_return(state); + } + + /* get the sequence of white and black run lengths */ + nvals = encode_runs( + state->i_lines[lines_coded], /* input data */ + width, /* # of bits */ + counts, /* where to put lengths */ + state->radiometric, /* if 1, white is 1 */ + width + ); + if (nvals < 0) { + state->encoder_done = ENCODE_ERROR_EncodeRunsFailure; + save_state_and_return(state); + } + a0_color = WHITE; + index = 0; + a0_color = WHITE; + + case ENCODE_FAX_GOAL_OutputNextRunLength: + rl = counts[index++]; + old_rl = rl; + + case ENCODE_FAX_GOAL_DeduceCode: + nbits = deduce_code(a0_color,&rl,&rlcode,&terminating); + /* should be a macro but for now, a function */ + + /* shift code over so it merges with stager contents */ + stager |= (rlcode << (16-bitpos)); + bitpos += nbits; + + if (bitpos >=8) { + goal = ENCODE_FAX_GOAL_FlushStager; + break; + } + if (terminating) { + /* all done with this runlength */ + if (index < nvals) { + a0_color = ~a0_color; + goal = ENCODE_FAX_GOAL_OutputNextRunLength; + break; + } + else { + goal = ENCODE_FAX_GOAL_FinishLine; + break; + } + } + /* go around the loop again */ + goal = ENCODE_FAX_GOAL_DeduceCode; + old_rl = rl; + break; + + case ENCODE_FAX_GOAL_FlushStager: + if (byteptr >= endptr) { + state->strip_state = StripStateDone; + state->magic_needs = 1; + save_state_and_return(state); + } + /* if here, we know it is safe to flush at least one byte */ + *byteptr++ = (stager&0xff000000) >> 24; + stager <<= 8; + bitpos -= 8; + + if (bitpos >= 8) { + /* go around the loop again, trying to flush more */ + break; + } + /* if here, we have flushed stager to the point there is */ + /* at most a partial byte of data left in it. */ + if (terminating) { + /* all done with this runlength */ + if (index < nvals) { + a0_color = ~a0_color; + goal = ENCODE_FAX_GOAL_OutputNextRunLength; + break; + } + else { + goal = ENCODE_FAX_GOAL_FinishLine; + break; + } + } + /* not done with this runlength yet */ + goal = ENCODE_FAX_GOAL_DeduceCode; + break; + + case ENCODE_FAX_GOAL_FinishLine: + if (bitpos) { + /* have to flush stager */ + if (byteptr >= endptr) { + state->strip_state = StripStateDone; + state->magic_needs = 1; + save_state_and_return(state); + } + /* make sure nothing bogus is happening */ + if (bitpos > 8) { + state->encoder_done = ENCODE_ERROR_BadStager; + save_state_and_return(state); + } + + *byteptr++ = (stager&0xff000000) >> 24; + stager <<= 8; + bitpos = 0; + } + ++lines_coded; + goal = ENCODE_FAX_GOAL_StartNewLine; + break; + + default: + state->encoder_done = ENCODE_ERROR_BadMagic; + save_state_and_return(state); + break; + + } /* end of switch(goal) in main decoding loop */ + + } /* end of main encoding loop */ +} +/************************************************************************/ +int encode_runs(src,nbits,counts,white_is_one,width) +LogInt *src; +unsigned int *counts; +register int nbits; +register int white_is_one; +register int width; +{ +register unsigned int white_count=0,black_count=0; +register int i,current_is_white=1; +register int n_runs=0; +register int total=0; + +register LogInt test_bit = LOGLEFT; + /* LOGLEFT = the logically left-most bit in a word in */ + /* the server, we allways fill the logically left-most */ + /* bit in a word first, the logically right-most last */ + +/*** handle first bit differently than others ***/ + + if (white_is_one) { + for (i=0; i> 6)].code; + nbits = table[63 + (*rl >> 6)].nbits; + *rl %= 64; + } + else { + *terminating = 0; + *rlcode = table[63 + 2560/64].code; + nbits = table[63 + 2560/64].nbits; + *rl -= 2560; + } + return(nbits); +} +/************************************************************************/ diff --git a/xie/xc/programs/Xserver/XIE/mixie/fax/etiffpb.c b/xie/xc/programs/Xserver/XIE/mixie/fax/etiffpb.c new file mode 100644 index 0000000..5c89764 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/fax/etiffpb.c @@ -0,0 +1,382 @@ +/* $XConsortium: etiffpb.c /main/4 1995/12/02 16:50:38 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module etiffpb.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + etiffpb.c -- DDXIE module for encoding TIFF PackBits format + + Ben Fahy, AGE Logic, Sept 1993 + +******************************************************************************/ + + +#include "fax.h" +#define _PBits +#include "fencode.h" +#include "xiemd.h" + +/************************************************************************/ +encode_tiffpb(state) +FaxEncodeState *state; +{ +/* stuff exchanged with state variable */ +register int goal; +register unsigned char *byteptr; +register unsigned char *endptr; +register int width; +register int rl; +PackBitsEncodePvt *epvt; + +/* stuff exchanged with private state variable */ +int index; +int start; +int nlits; +int nvals; +register int *counts; +register int *values; + + +register int lines_coded=0; +register int lines_to_code=0; +register int rlcode,lits_to_write; +register int bytes_out; + + if (state == (FaxEncodeState *) NULL) + return(-1); + + /* set up initial bitstream for the very first output strip */ + if (!state->bits.started) { + if (state->strip_state != StripStateNew) { + state->encoder_done = ENCODE_ERROR_StripStateNotNew; + return(-1); + } + + state->bits.byteptr = (unsigned char *)state->strip; + state->bits.endptr = state->bits.byteptr + state->strip_size; + /* record end of output strip */ + + state->bits.bitpos = 0; + state->bits.started = 1; + state->strip_state = StripStateInUse; + } + + /* or, reset bitstream for a new output strip */ + if (state->magic_needs) { + if (state->strip_state == StripStateNew) { + state->strip_state = StripStateInUse; + state->bits.byteptr = (unsigned char *)state->strip; + state->bits.endptr = state->bits.byteptr + state->strip_size; + /* record end of output strip */ + state->bits.bitpos = 0; + state->bits.started = 1; + } + else { + /* no new strip?? But... I *need* more data! */ + state->encoder_done = ENCODE_ERROR_BadMagic; + return(-1); + } + state->magic_needs = 0; + } + localize_state(state); + + +/*** Main Encoding Loop ***/ + while (1) { + + switch(goal) { + + case ENCODE_PB_GOAL_StartNewLine: + /* every new line we need to compute its runlength data */ + + { + register unsigned char *ibptr=NULL; + register unsigned char *ebptr=NULL; + register int color0,color1, n_reps; + + if (lines_coded >= state->nl_tocode) { + /* We have read the whole input strip, need more data */ + save_state_and_return(state); + } + + ibptr = (unsigned char *) state->i_lines[lines_coded]; + ebptr = ibptr+(width+7)/8; + +#if (IMAGE_BYTE_ORDER == MSBFirst) + color0 = *ibptr++; +#else + color0 = _ByteReverseTable[*ibptr++]; +#endif + n_reps = 1; + nvals = 0; + epvt->values[nvals] = color0; + + while (ibptr < ebptr) { +#if (IMAGE_BYTE_ORDER == MSBFirst) + color1 = *ibptr++; +#else + color1 = _ByteReverseTable[*ibptr++]; +#endif + if (color1 == color0) ++n_reps; + else { + epvt->counts[nvals++] = n_reps; + color0 = color1; + n_reps = 1; + epvt->values[nvals] = color0; + } + } + epvt->counts[nvals++] = n_reps; + epvt->nvals = nvals; + + } + /* now that we have an encoding of the line in runlengths, + we need to decide what we write out as R V, where R + is the runlength and V is the value, vs L V1 V2 ... VL + where Vi are individual values and L is the number of + literal values that follow. There isn't really any + advantage to coding runlengths of size 2 or less, so + we will only code as a runlength for runs of 3 or more. + */ + index = 0; /* where we are in our list of runs and values */ + start = 0; /* where we were when we started */ + nlits = 0; /* number of literals we will concatenate */ + goal = ENCODE_PB_GOAL_OutputNextRunLength; + + case ENCODE_PB_GOAL_OutputNextRunLength: + /* starting from the current index, search for the first + runlength of three or more. Everything before then will + be encoded as a string of literals. + */ + + start = index; + while (index < nvals && (rl = counts[index]) < 3) { + nlits += rl; + ++index; + } + + if (start != index) { + /* Note: we can never call FlushLiterals when start >= nvals, + because index <= nvals, and start < index if here */ + goal = ENCODE_PB_GOAL_FlushLiterals; + } + else { + /* found a suitable runlength */ + goal = ENCODE_PB_GOAL_FlushRunLength; + } + break; + + case ENCODE_PB_GOAL_FlushRunLength: + if (!rl) { + state->encoder_done = ENCODE_ERROR_BadRunLength; + save_state_and_return(state); + } + /* Packbits represents runlengths as rl = 1 - rlcode, where */ + /* rlcode is a negative number between -1 and -127. So we */ + /* may have to break a number larger than 128 into multiple */ + /* runlengths */ + if (rl <= 128) { + rlcode = 1-rl; /* encode the runlength */ + rl = 0; + } + else { + rlcode = -127; /* encode the maximum */ + rl -= 128; + } + /* before writing, make sure we aren't off end of strip */ + if ( byteptr >= endptr) { + goal = ENCODE_PB_GOAL_WriteCodeForRunLength; + state->strip_state = StripStateDone; + state->magic_needs = 1; + save_state_and_return(state); + } + + case ENCODE_PB_GOAL_WriteCodeForRunLength: + *byteptr++ = rlcode; + + /* before writing, make sure we aren't off end of strip */ + if ( byteptr >= endptr) { + goal = ENCODE_PB_GOAL_WriteValueForRunLength; + state->strip_state = StripStateDone; + state->magic_needs = 1; + save_state_and_return(state); + } + case ENCODE_PB_GOAL_WriteValueForRunLength: + *byteptr++ = values[index]; + if (!rl) { + if (++index >= nvals) { /* see if done with line */ + ++lines_coded; + goal = ENCODE_PB_GOAL_StartNewLine; + } + else + goal = ENCODE_PB_GOAL_OutputNextRunLength; + } + else + goal = ENCODE_PB_GOAL_FlushRunLength; + break; + case ENCODE_PB_GOAL_FlushLiterals: + /* Packbits represents literal lengths as rl = 1 + rlcode, */ + /* rlcode is a number between 0 and 127. So we have to break */ + /* break numbers larger than 128 into multiple runlengths */ + if (nlits <= 128) { + rlcode = nlits-1; /* encode the runlength */ + nlits = 0; + } + else { + rlcode = 127; /* encode the maximum */ + nlits -= 128; + } + rl = 1 + rlcode; /* need this for comparison later */ + bytes_out = 0; /* ditto. bytes_out must be <= rl */ + + /* before writing, make sure we aren't off end of strip */ + if ( byteptr >= endptr) { + goal = ENCODE_PB_GOAL_WriteNlits; + state->strip_state = StripStateDone; + state->magic_needs = 1; + save_state_and_return(state); + } + + case ENCODE_PB_GOAL_WriteNlits: + *byteptr++ = rlcode; + goal = ENCODE_PB_GOAL_WriteLiterals; + /* note that lits_to_write is always 1 or 2 */ + + case ENCODE_PB_GOAL_WriteLiterals: + /* this is actually a loop. 'start' gets incremented each */ + /* time through until it is equal to 'index'. We never get */ + /* to this point unless start < nvals, though */ + + lits_to_write = counts[start]; + goal = ENCODE_PB_GOAL_WriteThisLiteral; + + case ENCODE_PB_GOAL_WriteThisLiteral: + /* before writing, make sure we aren't off end of strip */ + if ( byteptr >= endptr) { + goal = ENCODE_PB_GOAL_WriteTheLiteral; + state->strip_state = StripStateDone; + state->magic_needs = 1; + save_state_and_return(state); + } + + case ENCODE_PB_GOAL_WriteTheLiteral: + *byteptr++ = values[start]; + if (++bytes_out >= 128 && nlits) { + /* we have written the maximum amount we can */ + /* write at a time, yet we know there are more */ + /* to write out. */ + + goal = ENCODE_PB_GOAL_FlushLiterals; + + /* If we need to write current value some more, */ + /* change count so we don't write extra */ + + if (--lits_to_write) + counts[start] = lits_to_write; + else { + /* otherwise, advance position */ + ++start; + } + + /* note that we KNOW we have to write more literals */ + /* so it is safe to increment 'start', which could */ + /* only be equal to 'index' if we were done */ + + break; + } + else if (--lits_to_write) { + /* loop back and write this value again */ + goal = ENCODE_PB_GOAL_WriteThisLiteral; + break; + } + + /* If here, we are done with this literal */ + if (++start < index) { + /* if other literals to write, loop back */ + goal = ENCODE_PB_GOAL_WriteLiterals; + break; + } + + /* ok, we wrote out all the literals */ + + if (index >= nvals) { /* see if done with line */ + ++lines_coded; + goal = ENCODE_PB_GOAL_StartNewLine; + } + else + goal = ENCODE_PB_GOAL_OutputNextRunLength; + break; + + default: + state->encoder_done = ENCODE_ERROR_BadMagic; + save_state_and_return(state); + break; + + } /* end of switch(goal) in main decoding loop */ + + } /* end of main encoding loop */ +} +/************************************************************************/ + diff --git a/xie/xc/programs/Xserver/XIE/mixie/fax/faxint.h b/xie/xc/programs/Xserver/XIE/mixie/fax/faxint.h new file mode 100644 index 0000000..0a41a91 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/fax/faxint.h @@ -0,0 +1,96 @@ +/* $XConsortium: faxint.h,v 1.4 94/04/17 20:34:32 rws Exp $ */ +/**** module fax/faxint.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + fax/faxint.h -- DDXIE internal fax definitions + + Ben Fahy -- AGE Logic, Inc. May, 1993 + +*****************************************************************************/ + +/* this should correspond to what is in pretab.h, except for code entry */ +typedef struct _FaxTable { +short run_length; /* run length for this code */ +char makeup; /* 1 if this code is makeup */ +unsigned char n_bits; /* how many bits this code used */ +} WhiteTable,BlackTable; + +typedef struct _TwoDTable { + char mode; /* what to do next */ +unsigned char n_bits; /* how many bits this code used */ +} TwoDTable; + +#ifdef FAX_TABLE_OWNER +#include "faxtabs.h" /* initializes tables */ +#else +extern unsigned char _ByteReverseTable[]; +extern BlackTable _BlackFaxTable[]; +extern WhiteTable _WhiteFaxTable[]; +extern TwoDTable _TwoDFaxTable[]; +#endif + +/**** module fax/faxint.h ****/ diff --git a/xie/xc/programs/Xserver/XIE/mixie/fax/faxtabs.c b/xie/xc/programs/Xserver/XIE/mixie/fax/faxtabs.c new file mode 100644 index 0000000..3c81d0a --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/fax/faxtabs.c @@ -0,0 +1,79 @@ +/* $XConsortium: faxtabs.c,v 1.5 94/04/17 20:34:32 rws Exp $ */ +/**** module fax/faxtabs.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + fax/faxtabs.c -- DDXIE fax decode data + + Ben Fahy -- AGE Logic, Inc. May, 1993 + +*****************************************************************************/ + +#include "fax.h" +#define FAX_TABLE_OWNER +#include "faxint.h" + +/**** module fax/faxtabs.c ****/ diff --git a/xie/xc/programs/Xserver/XIE/mixie/fax/faxtabs.h b/xie/xc/programs/Xserver/XIE/mixie/fax/faxtabs.h new file mode 100644 index 0000000..1d35b08 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/fax/faxtabs.h @@ -0,0 +1,12631 @@ +/* $XConsortium: faxtabs.h,v 1.4 94/04/17 20:34:37 rws Exp $ */ +/**** module fax/bits.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + fax/bits.h -- DDXIE G4 fax bitstream management macros + + Ben Fahy -- AGE Logic, Inc. May, 1993 + +*****************************************************************************/ +/* faxtabs.h - generated by mktab */ + + + +/* two D mode table */ +TwoDTable _TwoDFaxTable[]= { + /* 0 = 0 */ { 0, 8}, /* 0x00 => 0x00+(1)*/ + /* 1 = 1 */ { 0, 0}, /* 0x00 => 0x00+(256)*/ + /* 2 = 2 */ { 0, 7}, /* 0x01 => 0x02+(2)*/ + /* 3 = 3 */ { 0, 7}, /* 0x01 => 0x02+(2)*/ + /* 4 = 4 */ { 3, 7}, /* 0x02 => 0x04+(2)*/ + /* 5 = 5 */ { 3, 7}, /* 0x02 => 0x04+(2)*/ + /* 6 = 6 */ { 9, 7}, /* 0x03 => 0x06+(2)*/ + /* 7 = 7 */ { 9, 7}, /* 0x03 => 0x06+(2)*/ + /* 8 = 8 */ { 4, 6}, /* 0x02 => 0x08+(4)*/ + /* 9 = 9 */ { 4, 6}, /* 0x02 => 0x08+(4)*/ + /* 10 = a */ { 4, 6}, /* 0x02 => 0x08+(4)*/ + /* 11 = b */ { 4, 6}, /* 0x02 => 0x08+(4)*/ + /* 12 = c */ { 8, 6}, /* 0x03 => 0x0c+(4)*/ + /* 13 = d */ { 8, 6}, /* 0x03 => 0x0c+(4)*/ + /* 14 = e */ { 8, 6}, /* 0x03 => 0x0c+(4)*/ + /* 15 = f */ { 8, 6}, /* 0x03 => 0x0c+(4)*/ + /* 16 = 10 */ { 1, 4}, /* 0x01 => 0x10+(16)*/ + /* 17 = 11 */ { 1, 4}, /* 0x01 => 0x10+(16)*/ + /* 18 = 12 */ { 1, 4}, /* 0x01 => 0x10+(16)*/ + /* 19 = 13 */ { 1, 4}, /* 0x01 => 0x10+(16)*/ + /* 20 = 14 */ { 1, 4}, /* 0x01 => 0x10+(16)*/ + /* 21 = 15 */ { 1, 4}, /* 0x01 => 0x10+(16)*/ + /* 22 = 16 */ { 1, 4}, /* 0x01 => 0x10+(16)*/ + /* 23 = 17 */ { 1, 4}, /* 0x01 => 0x10+(16)*/ + /* 24 = 18 */ { 1, 4}, /* 0x01 => 0x10+(16)*/ + /* 25 = 19 */ { 1, 4}, /* 0x01 => 0x10+(16)*/ + /* 26 = 1a */ { 1, 4}, /* 0x01 => 0x10+(16)*/ + /* 27 = 1b */ { 1, 4}, /* 0x01 => 0x10+(16)*/ + /* 28 = 1c */ { 1, 4}, /* 0x01 => 0x10+(16)*/ + /* 29 = 1d */ { 1, 4}, /* 0x01 => 0x10+(16)*/ + /* 30 = 1e */ { 1, 4}, /* 0x01 => 0x10+(16)*/ + /* 31 = 1f */ { 1, 4}, /* 0x01 => 0x10+(16)*/ + /* 32 = 20 */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 33 = 21 */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 34 = 22 */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 35 = 23 */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 36 = 24 */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 37 = 25 */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 38 = 26 */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 39 = 27 */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 40 = 28 */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 41 = 29 */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 42 = 2a */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 43 = 2b */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 44 = 2c */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 45 = 2d */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 46 = 2e */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 47 = 2f */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 48 = 30 */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 49 = 31 */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 50 = 32 */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 51 = 33 */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 52 = 34 */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 53 = 35 */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 54 = 36 */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 55 = 37 */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 56 = 38 */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 57 = 39 */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 58 = 3a */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 59 = 3b */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 60 = 3c */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 61 = 3d */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 62 = 3e */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 63 = 3f */ { 2, 3}, /* 0x01 => 0x20+(32)*/ + /* 64 = 40 */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 65 = 41 */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 66 = 42 */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 67 = 43 */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 68 = 44 */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 69 = 45 */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 70 = 46 */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 71 = 47 */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 72 = 48 */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 73 = 49 */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 74 = 4a */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 75 = 4b */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 76 = 4c */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 77 = 4d */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 78 = 4e */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 79 = 4f */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 80 = 50 */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 81 = 51 */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 82 = 52 */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 83 = 53 */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 84 = 54 */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 85 = 55 */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 86 = 56 */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 87 = 57 */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 88 = 58 */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 89 = 59 */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 90 = 5a */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 91 = 5b */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 92 = 5c */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 93 = 5d */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 94 = 5e */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 95 = 5f */ { 5, 3}, /* 0x02 => 0x40+(32)*/ + /* 96 = 60 */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 97 = 61 */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 98 = 62 */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 99 = 63 */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 100 = 64 */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 101 = 65 */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 102 = 66 */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 103 = 67 */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 104 = 68 */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 105 = 69 */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 106 = 6a */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 107 = 6b */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 108 = 6c */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 109 = 6d */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 110 = 6e */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 111 = 6f */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 112 = 70 */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 113 = 71 */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 114 = 72 */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 115 = 73 */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 116 = 74 */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 117 = 75 */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 118 = 76 */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 119 = 77 */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 120 = 78 */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 121 = 79 */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 122 = 7a */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 123 = 7b */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 124 = 7c */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 125 = 7d */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 126 = 7e */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 127 = 7f */ { 7, 3}, /* 0x03 => 0x60+(32)*/ + /* 128 = 80 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 129 = 81 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 130 = 82 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 131 = 83 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 132 = 84 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 133 = 85 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 134 = 86 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 135 = 87 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 136 = 88 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 137 = 89 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 138 = 8a */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 139 = 8b */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 140 = 8c */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 141 = 8d */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 142 = 8e */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 143 = 8f */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 144 = 90 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 145 = 91 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 146 = 92 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 147 = 93 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 148 = 94 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 149 = 95 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 150 = 96 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 151 = 97 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 152 = 98 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 153 = 99 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 154 = 9a */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 155 = 9b */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 156 = 9c */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 157 = 9d */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 158 = 9e */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 159 = 9f */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 160 = a0 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 161 = a1 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 162 = a2 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 163 = a3 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 164 = a4 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 165 = a5 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 166 = a6 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 167 = a7 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 168 = a8 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 169 = a9 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 170 = aa */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 171 = ab */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 172 = ac */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 173 = ad */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 174 = ae */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 175 = af */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 176 = b0 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 177 = b1 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 178 = b2 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 179 = b3 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 180 = b4 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 181 = b5 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 182 = b6 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 183 = b7 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 184 = b8 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 185 = b9 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 186 = ba */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 187 = bb */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 188 = bc */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 189 = bd */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 190 = be */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 191 = bf */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 192 = c0 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 193 = c1 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 194 = c2 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 195 = c3 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 196 = c4 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 197 = c5 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 198 = c6 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 199 = c7 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 200 = c8 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 201 = c9 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 202 = ca */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 203 = cb */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 204 = cc */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 205 = cd */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 206 = ce */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 207 = cf */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 208 = d0 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 209 = d1 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 210 = d2 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 211 = d3 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 212 = d4 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 213 = d5 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 214 = d6 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 215 = d7 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 216 = d8 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 217 = d9 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 218 = da */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 219 = db */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 220 = dc */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 221 = dd */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 222 = de */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 223 = df */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 224 = e0 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 225 = e1 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 226 = e2 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 227 = e3 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 228 = e4 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 229 = e5 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 230 = e6 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 231 = e7 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 232 = e8 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 233 = e9 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 234 = ea */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 235 = eb */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 236 = ec */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 237 = ed */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 238 = ee */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 239 = ef */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 240 = f0 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 241 = f1 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 242 = f2 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 243 = f3 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 244 = f4 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 245 = f5 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 246 = f6 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 247 = f7 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 248 = f8 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 249 = f9 */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 250 = fa */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 251 = fb */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 252 = fc */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 253 = fd */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 254 = fe */ { 6, 1}, /* 0x01 => 0x80+(128)*/ + /* 255 = ff */ { 6, 1}, /* 0x01 => 0x80+(128)*/ +}; +/* white table */ +WhiteTable _WhiteFaxTable[] = { + /* 0 = 0 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(4096)*/ + /* 1 = 1 */ {-2, 0, 12}, /* 0x0001 => 0x0001+(1)*/ + /* 2 = 2 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(4096)*/ + /* 3 = 3 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(4096)*/ + /* 4 = 4 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(4096)*/ + /* 5 = 5 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(4096)*/ + /* 6 = 6 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(4096)*/ + /* 7 = 7 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(4096)*/ + /* 8 = 8 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(4096)*/ + /* 9 = 9 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(4096)*/ + /* 10 = a */ {-1, 0, 0}, /* 0x0000 => 0x0000+(4096)*/ + /* 11 = b */ {-1, 0, 0}, /* 0x0000 => 0x0000+(4096)*/ + /* 12 = c */ {-1, 0, 0}, /* 0x0000 => 0x0000+(4096)*/ + /* 13 = d */ {-1, 0, 0}, /* 0x0000 => 0x0000+(4096)*/ + /* 14 = e */ {-1, 0, 0}, /* 0x0000 => 0x0000+(4096)*/ + /* 15 = f */ {-1, 0, 0}, /* 0x0000 => 0x0000+(4096)*/ + /* 16 = 10 */ {1792, 1, 11}, /* 0x0008 => 0x0010+(2)*/ + /* 17 = 11 */ {1792, 1, 11}, /* 0x0008 => 0x0010+(2)*/ + /* 18 = 12 */ {1984, 1, 12}, /* 0x0012 => 0x0012+(1)*/ + /* 19 = 13 */ {2048, 1, 12}, /* 0x0013 => 0x0013+(1)*/ + /* 20 = 14 */ {2112, 1, 12}, /* 0x0014 => 0x0014+(1)*/ + /* 21 = 15 */ {2176, 1, 12}, /* 0x0015 => 0x0015+(1)*/ + /* 22 = 16 */ {2240, 1, 12}, /* 0x0016 => 0x0016+(1)*/ + /* 23 = 17 */ {2304, 1, 12}, /* 0x0017 => 0x0017+(1)*/ + /* 24 = 18 */ {1856, 1, 11}, /* 0x000c => 0x0018+(2)*/ + /* 25 = 19 */ {1856, 1, 11}, /* 0x000c => 0x0018+(2)*/ + /* 26 = 1a */ {1920, 1, 11}, /* 0x000d => 0x001a+(2)*/ + /* 27 = 1b */ {1920, 1, 11}, /* 0x000d => 0x001a+(2)*/ + /* 28 = 1c */ {2368, 1, 12}, /* 0x001c => 0x001c+(1)*/ + /* 29 = 1d */ {2432, 1, 12}, /* 0x001d => 0x001d+(1)*/ + /* 30 = 1e */ {2496, 1, 12}, /* 0x001e => 0x001e+(1)*/ + /* 31 = 1f */ {2560, 1, 12}, /* 0x001f => 0x001f+(1)*/ + /* 32 = 20 */ {29, 0, 8}, /* 0x0002 => 0x0020+(16)*/ + /* 33 = 21 */ {29, 0, 8}, /* 0x0002 => 0x0020+(16)*/ + /* 34 = 22 */ {29, 0, 8}, /* 0x0002 => 0x0020+(16)*/ + /* 35 = 23 */ {29, 0, 8}, /* 0x0002 => 0x0020+(16)*/ + /* 36 = 24 */ {29, 0, 8}, /* 0x0002 => 0x0020+(16)*/ + /* 37 = 25 */ {29, 0, 8}, /* 0x0002 => 0x0020+(16)*/ + /* 38 = 26 */ {29, 0, 8}, /* 0x0002 => 0x0020+(16)*/ + /* 39 = 27 */ {29, 0, 8}, /* 0x0002 => 0x0020+(16)*/ + /* 40 = 28 */ {29, 0, 8}, /* 0x0002 => 0x0020+(16)*/ + /* 41 = 29 */ {29, 0, 8}, /* 0x0002 => 0x0020+(16)*/ + /* 42 = 2a */ {29, 0, 8}, /* 0x0002 => 0x0020+(16)*/ + /* 43 = 2b */ {29, 0, 8}, /* 0x0002 => 0x0020+(16)*/ + /* 44 = 2c */ {29, 0, 8}, /* 0x0002 => 0x0020+(16)*/ + /* 45 = 2d */ {29, 0, 8}, /* 0x0002 => 0x0020+(16)*/ + /* 46 = 2e */ {29, 0, 8}, /* 0x0002 => 0x0020+(16)*/ + /* 47 = 2f */ {29, 0, 8}, /* 0x0002 => 0x0020+(16)*/ + /* 48 = 30 */ {30, 0, 8}, /* 0x0003 => 0x0030+(16)*/ + /* 49 = 31 */ {30, 0, 8}, /* 0x0003 => 0x0030+(16)*/ + /* 50 = 32 */ {30, 0, 8}, /* 0x0003 => 0x0030+(16)*/ + /* 51 = 33 */ {30, 0, 8}, /* 0x0003 => 0x0030+(16)*/ + /* 52 = 34 */ {30, 0, 8}, /* 0x0003 => 0x0030+(16)*/ + /* 53 = 35 */ {30, 0, 8}, /* 0x0003 => 0x0030+(16)*/ + /* 54 = 36 */ {30, 0, 8}, /* 0x0003 => 0x0030+(16)*/ + /* 55 = 37 */ {30, 0, 8}, /* 0x0003 => 0x0030+(16)*/ + /* 56 = 38 */ {30, 0, 8}, /* 0x0003 => 0x0030+(16)*/ + /* 57 = 39 */ {30, 0, 8}, /* 0x0003 => 0x0030+(16)*/ + /* 58 = 3a */ {30, 0, 8}, /* 0x0003 => 0x0030+(16)*/ + /* 59 = 3b */ {30, 0, 8}, /* 0x0003 => 0x0030+(16)*/ + /* 60 = 3c */ {30, 0, 8}, /* 0x0003 => 0x0030+(16)*/ + /* 61 = 3d */ {30, 0, 8}, /* 0x0003 => 0x0030+(16)*/ + /* 62 = 3e */ {30, 0, 8}, /* 0x0003 => 0x0030+(16)*/ + /* 63 = 3f */ {30, 0, 8}, /* 0x0003 => 0x0030+(16)*/ + /* 64 = 40 */ {45, 0, 8}, /* 0x0004 => 0x0040+(16)*/ + /* 65 = 41 */ {45, 0, 8}, /* 0x0004 => 0x0040+(16)*/ + /* 66 = 42 */ {45, 0, 8}, /* 0x0004 => 0x0040+(16)*/ + /* 67 = 43 */ {45, 0, 8}, /* 0x0004 => 0x0040+(16)*/ + /* 68 = 44 */ {45, 0, 8}, /* 0x0004 => 0x0040+(16)*/ + /* 69 = 45 */ {45, 0, 8}, /* 0x0004 => 0x0040+(16)*/ + /* 70 = 46 */ {45, 0, 8}, /* 0x0004 => 0x0040+(16)*/ + /* 71 = 47 */ {45, 0, 8}, /* 0x0004 => 0x0040+(16)*/ + /* 72 = 48 */ {45, 0, 8}, /* 0x0004 => 0x0040+(16)*/ + /* 73 = 49 */ {45, 0, 8}, /* 0x0004 => 0x0040+(16)*/ + /* 74 = 4a */ {45, 0, 8}, /* 0x0004 => 0x0040+(16)*/ + /* 75 = 4b */ {45, 0, 8}, /* 0x0004 => 0x0040+(16)*/ + /* 76 = 4c */ {45, 0, 8}, /* 0x0004 => 0x0040+(16)*/ + /* 77 = 4d */ {45, 0, 8}, /* 0x0004 => 0x0040+(16)*/ + /* 78 = 4e */ {45, 0, 8}, /* 0x0004 => 0x0040+(16)*/ + /* 79 = 4f */ {45, 0, 8}, /* 0x0004 => 0x0040+(16)*/ + /* 80 = 50 */ {46, 0, 8}, /* 0x0005 => 0x0050+(16)*/ + /* 81 = 51 */ {46, 0, 8}, /* 0x0005 => 0x0050+(16)*/ + /* 82 = 52 */ {46, 0, 8}, /* 0x0005 => 0x0050+(16)*/ + /* 83 = 53 */ {46, 0, 8}, /* 0x0005 => 0x0050+(16)*/ + /* 84 = 54 */ {46, 0, 8}, /* 0x0005 => 0x0050+(16)*/ + /* 85 = 55 */ {46, 0, 8}, /* 0x0005 => 0x0050+(16)*/ + /* 86 = 56 */ {46, 0, 8}, /* 0x0005 => 0x0050+(16)*/ + /* 87 = 57 */ {46, 0, 8}, /* 0x0005 => 0x0050+(16)*/ + /* 88 = 58 */ {46, 0, 8}, /* 0x0005 => 0x0050+(16)*/ + /* 89 = 59 */ {46, 0, 8}, /* 0x0005 => 0x0050+(16)*/ + /* 90 = 5a */ {46, 0, 8}, /* 0x0005 => 0x0050+(16)*/ + /* 91 = 5b */ {46, 0, 8}, /* 0x0005 => 0x0050+(16)*/ + /* 92 = 5c */ {46, 0, 8}, /* 0x0005 => 0x0050+(16)*/ + /* 93 = 5d */ {46, 0, 8}, /* 0x0005 => 0x0050+(16)*/ + /* 94 = 5e */ {46, 0, 8}, /* 0x0005 => 0x0050+(16)*/ + /* 95 = 5f */ {46, 0, 8}, /* 0x0005 => 0x0050+(16)*/ + /* 96 = 60 */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 97 = 61 */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 98 = 62 */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 99 = 63 */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 100 = 64 */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 101 = 65 */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 102 = 66 */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 103 = 67 */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 104 = 68 */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 105 = 69 */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 106 = 6a */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 107 = 6b */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 108 = 6c */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 109 = 6d */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 110 = 6e */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 111 = 6f */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 112 = 70 */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 113 = 71 */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 114 = 72 */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 115 = 73 */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 116 = 74 */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 117 = 75 */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 118 = 76 */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 119 = 77 */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 120 = 78 */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 121 = 79 */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 122 = 7a */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 123 = 7b */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 124 = 7c */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 125 = 7d */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 126 = 7e */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 127 = 7f */ {22, 0, 7}, /* 0x0003 => 0x0060+(32)*/ + /* 128 = 80 */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 129 = 81 */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 130 = 82 */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 131 = 83 */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 132 = 84 */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 133 = 85 */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 134 = 86 */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 135 = 87 */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 136 = 88 */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 137 = 89 */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 138 = 8a */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 139 = 8b */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 140 = 8c */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 141 = 8d */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 142 = 8e */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 143 = 8f */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 144 = 90 */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 145 = 91 */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 146 = 92 */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 147 = 93 */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 148 = 94 */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 149 = 95 */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 150 = 96 */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 151 = 97 */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 152 = 98 */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 153 = 99 */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 154 = 9a */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 155 = 9b */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 156 = 9c */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 157 = 9d */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 158 = 9e */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 159 = 9f */ {23, 0, 7}, /* 0x0004 => 0x0080+(32)*/ + /* 160 = a0 */ {47, 0, 8}, /* 0x000a => 0x00a0+(16)*/ + /* 161 = a1 */ {47, 0, 8}, /* 0x000a => 0x00a0+(16)*/ + /* 162 = a2 */ {47, 0, 8}, /* 0x000a => 0x00a0+(16)*/ + /* 163 = a3 */ {47, 0, 8}, /* 0x000a => 0x00a0+(16)*/ + /* 164 = a4 */ {47, 0, 8}, /* 0x000a => 0x00a0+(16)*/ + /* 165 = a5 */ {47, 0, 8}, /* 0x000a => 0x00a0+(16)*/ + /* 166 = a6 */ {47, 0, 8}, /* 0x000a => 0x00a0+(16)*/ + /* 167 = a7 */ {47, 0, 8}, /* 0x000a => 0x00a0+(16)*/ + /* 168 = a8 */ {47, 0, 8}, /* 0x000a => 0x00a0+(16)*/ + /* 169 = a9 */ {47, 0, 8}, /* 0x000a => 0x00a0+(16)*/ + /* 170 = aa */ {47, 0, 8}, /* 0x000a => 0x00a0+(16)*/ + /* 171 = ab */ {47, 0, 8}, /* 0x000a => 0x00a0+(16)*/ + /* 172 = ac */ {47, 0, 8}, /* 0x000a => 0x00a0+(16)*/ + /* 173 = ad */ {47, 0, 8}, /* 0x000a => 0x00a0+(16)*/ + /* 174 = ae */ {47, 0, 8}, /* 0x000a => 0x00a0+(16)*/ + /* 175 = af */ {47, 0, 8}, /* 0x000a => 0x00a0+(16)*/ + /* 176 = b0 */ {48, 0, 8}, /* 0x000b => 0x00b0+(16)*/ + /* 177 = b1 */ {48, 0, 8}, /* 0x000b => 0x00b0+(16)*/ + /* 178 = b2 */ {48, 0, 8}, /* 0x000b => 0x00b0+(16)*/ + /* 179 = b3 */ {48, 0, 8}, /* 0x000b => 0x00b0+(16)*/ + /* 180 = b4 */ {48, 0, 8}, /* 0x000b => 0x00b0+(16)*/ + /* 181 = b5 */ {48, 0, 8}, /* 0x000b => 0x00b0+(16)*/ + /* 182 = b6 */ {48, 0, 8}, /* 0x000b => 0x00b0+(16)*/ + /* 183 = b7 */ {48, 0, 8}, /* 0x000b => 0x00b0+(16)*/ + /* 184 = b8 */ {48, 0, 8}, /* 0x000b => 0x00b0+(16)*/ + /* 185 = b9 */ {48, 0, 8}, /* 0x000b => 0x00b0+(16)*/ + /* 186 = ba */ {48, 0, 8}, /* 0x000b => 0x00b0+(16)*/ + /* 187 = bb */ {48, 0, 8}, /* 0x000b => 0x00b0+(16)*/ + /* 188 = bc */ {48, 0, 8}, /* 0x000b => 0x00b0+(16)*/ + /* 189 = bd */ {48, 0, 8}, /* 0x000b => 0x00b0+(16)*/ + /* 190 = be */ {48, 0, 8}, /* 0x000b => 0x00b0+(16)*/ + /* 191 = bf */ {48, 0, 8}, /* 0x000b => 0x00b0+(16)*/ + /* 192 = c0 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 193 = c1 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 194 = c2 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 195 = c3 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 196 = c4 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 197 = c5 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 198 = c6 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 199 = c7 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 200 = c8 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 201 = c9 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 202 = ca */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 203 = cb */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 204 = cc */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 205 = cd */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 206 = ce */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 207 = cf */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 208 = d0 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 209 = d1 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 210 = d2 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 211 = d3 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 212 = d4 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 213 = d5 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 214 = d6 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 215 = d7 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 216 = d8 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 217 = d9 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 218 = da */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 219 = db */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 220 = dc */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 221 = dd */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 222 = de */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 223 = df */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 224 = e0 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 225 = e1 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 226 = e2 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 227 = e3 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 228 = e4 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 229 = e5 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 230 = e6 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 231 = e7 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 232 = e8 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 233 = e9 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 234 = ea */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 235 = eb */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 236 = ec */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 237 = ed */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 238 = ee */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 239 = ef */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 240 = f0 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 241 = f1 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 242 = f2 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 243 = f3 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 244 = f4 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 245 = f5 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 246 = f6 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 247 = f7 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 248 = f8 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 249 = f9 */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 250 = fa */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 251 = fb */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 252 = fc */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 253 = fd */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 254 = fe */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 255 = ff */ {13, 0, 6}, /* 0x0003 => 0x00c0+(64)*/ + /* 256 = 100 */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 257 = 101 */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 258 = 102 */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 259 = 103 */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 260 = 104 */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 261 = 105 */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 262 = 106 */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 263 = 107 */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 264 = 108 */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 265 = 109 */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 266 = 10a */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 267 = 10b */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 268 = 10c */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 269 = 10d */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 270 = 10e */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 271 = 10f */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 272 = 110 */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 273 = 111 */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 274 = 112 */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 275 = 113 */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 276 = 114 */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 277 = 115 */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 278 = 116 */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 279 = 117 */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 280 = 118 */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 281 = 119 */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 282 = 11a */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 283 = 11b */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 284 = 11c */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 285 = 11d */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 286 = 11e */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 287 = 11f */ {20, 0, 7}, /* 0x0008 => 0x0100+(32)*/ + /* 288 = 120 */ {33, 0, 8}, /* 0x0012 => 0x0120+(16)*/ + /* 289 = 121 */ {33, 0, 8}, /* 0x0012 => 0x0120+(16)*/ + /* 290 = 122 */ {33, 0, 8}, /* 0x0012 => 0x0120+(16)*/ + /* 291 = 123 */ {33, 0, 8}, /* 0x0012 => 0x0120+(16)*/ + /* 292 = 124 */ {33, 0, 8}, /* 0x0012 => 0x0120+(16)*/ + /* 293 = 125 */ {33, 0, 8}, /* 0x0012 => 0x0120+(16)*/ + /* 294 = 126 */ {33, 0, 8}, /* 0x0012 => 0x0120+(16)*/ + /* 295 = 127 */ {33, 0, 8}, /* 0x0012 => 0x0120+(16)*/ + /* 296 = 128 */ {33, 0, 8}, /* 0x0012 => 0x0120+(16)*/ + /* 297 = 129 */ {33, 0, 8}, /* 0x0012 => 0x0120+(16)*/ + /* 298 = 12a */ {33, 0, 8}, /* 0x0012 => 0x0120+(16)*/ + /* 299 = 12b */ {33, 0, 8}, /* 0x0012 => 0x0120+(16)*/ + /* 300 = 12c */ {33, 0, 8}, /* 0x0012 => 0x0120+(16)*/ + /* 301 = 12d */ {33, 0, 8}, /* 0x0012 => 0x0120+(16)*/ + /* 302 = 12e */ {33, 0, 8}, /* 0x0012 => 0x0120+(16)*/ + /* 303 = 12f */ {33, 0, 8}, /* 0x0012 => 0x0120+(16)*/ + /* 304 = 130 */ {34, 0, 8}, /* 0x0013 => 0x0130+(16)*/ + /* 305 = 131 */ {34, 0, 8}, /* 0x0013 => 0x0130+(16)*/ + /* 306 = 132 */ {34, 0, 8}, /* 0x0013 => 0x0130+(16)*/ + /* 307 = 133 */ {34, 0, 8}, /* 0x0013 => 0x0130+(16)*/ + /* 308 = 134 */ {34, 0, 8}, /* 0x0013 => 0x0130+(16)*/ + /* 309 = 135 */ {34, 0, 8}, /* 0x0013 => 0x0130+(16)*/ + /* 310 = 136 */ {34, 0, 8}, /* 0x0013 => 0x0130+(16)*/ + /* 311 = 137 */ {34, 0, 8}, /* 0x0013 => 0x0130+(16)*/ + /* 312 = 138 */ {34, 0, 8}, /* 0x0013 => 0x0130+(16)*/ + /* 313 = 139 */ {34, 0, 8}, /* 0x0013 => 0x0130+(16)*/ + /* 314 = 13a */ {34, 0, 8}, /* 0x0013 => 0x0130+(16)*/ + /* 315 = 13b */ {34, 0, 8}, /* 0x0013 => 0x0130+(16)*/ + /* 316 = 13c */ {34, 0, 8}, /* 0x0013 => 0x0130+(16)*/ + /* 317 = 13d */ {34, 0, 8}, /* 0x0013 => 0x0130+(16)*/ + /* 318 = 13e */ {34, 0, 8}, /* 0x0013 => 0x0130+(16)*/ + /* 319 = 13f */ {34, 0, 8}, /* 0x0013 => 0x0130+(16)*/ + /* 320 = 140 */ {35, 0, 8}, /* 0x0014 => 0x0140+(16)*/ + /* 321 = 141 */ {35, 0, 8}, /* 0x0014 => 0x0140+(16)*/ + /* 322 = 142 */ {35, 0, 8}, /* 0x0014 => 0x0140+(16)*/ + /* 323 = 143 */ {35, 0, 8}, /* 0x0014 => 0x0140+(16)*/ + /* 324 = 144 */ {35, 0, 8}, /* 0x0014 => 0x0140+(16)*/ + /* 325 = 145 */ {35, 0, 8}, /* 0x0014 => 0x0140+(16)*/ + /* 326 = 146 */ {35, 0, 8}, /* 0x0014 => 0x0140+(16)*/ + /* 327 = 147 */ {35, 0, 8}, /* 0x0014 => 0x0140+(16)*/ + /* 328 = 148 */ {35, 0, 8}, /* 0x0014 => 0x0140+(16)*/ + /* 329 = 149 */ {35, 0, 8}, /* 0x0014 => 0x0140+(16)*/ + /* 330 = 14a */ {35, 0, 8}, /* 0x0014 => 0x0140+(16)*/ + /* 331 = 14b */ {35, 0, 8}, /* 0x0014 => 0x0140+(16)*/ + /* 332 = 14c */ {35, 0, 8}, /* 0x0014 => 0x0140+(16)*/ + /* 333 = 14d */ {35, 0, 8}, /* 0x0014 => 0x0140+(16)*/ + /* 334 = 14e */ {35, 0, 8}, /* 0x0014 => 0x0140+(16)*/ + /* 335 = 14f */ {35, 0, 8}, /* 0x0014 => 0x0140+(16)*/ + /* 336 = 150 */ {36, 0, 8}, /* 0x0015 => 0x0150+(16)*/ + /* 337 = 151 */ {36, 0, 8}, /* 0x0015 => 0x0150+(16)*/ + /* 338 = 152 */ {36, 0, 8}, /* 0x0015 => 0x0150+(16)*/ + /* 339 = 153 */ {36, 0, 8}, /* 0x0015 => 0x0150+(16)*/ + /* 340 = 154 */ {36, 0, 8}, /* 0x0015 => 0x0150+(16)*/ + /* 341 = 155 */ {36, 0, 8}, /* 0x0015 => 0x0150+(16)*/ + /* 342 = 156 */ {36, 0, 8}, /* 0x0015 => 0x0150+(16)*/ + /* 343 = 157 */ {36, 0, 8}, /* 0x0015 => 0x0150+(16)*/ + /* 344 = 158 */ {36, 0, 8}, /* 0x0015 => 0x0150+(16)*/ + /* 345 = 159 */ {36, 0, 8}, /* 0x0015 => 0x0150+(16)*/ + /* 346 = 15a */ {36, 0, 8}, /* 0x0015 => 0x0150+(16)*/ + /* 347 = 15b */ {36, 0, 8}, /* 0x0015 => 0x0150+(16)*/ + /* 348 = 15c */ {36, 0, 8}, /* 0x0015 => 0x0150+(16)*/ + /* 349 = 15d */ {36, 0, 8}, /* 0x0015 => 0x0150+(16)*/ + /* 350 = 15e */ {36, 0, 8}, /* 0x0015 => 0x0150+(16)*/ + /* 351 = 15f */ {36, 0, 8}, /* 0x0015 => 0x0150+(16)*/ + /* 352 = 160 */ {37, 0, 8}, /* 0x0016 => 0x0160+(16)*/ + /* 353 = 161 */ {37, 0, 8}, /* 0x0016 => 0x0160+(16)*/ + /* 354 = 162 */ {37, 0, 8}, /* 0x0016 => 0x0160+(16)*/ + /* 355 = 163 */ {37, 0, 8}, /* 0x0016 => 0x0160+(16)*/ + /* 356 = 164 */ {37, 0, 8}, /* 0x0016 => 0x0160+(16)*/ + /* 357 = 165 */ {37, 0, 8}, /* 0x0016 => 0x0160+(16)*/ + /* 358 = 166 */ {37, 0, 8}, /* 0x0016 => 0x0160+(16)*/ + /* 359 = 167 */ {37, 0, 8}, /* 0x0016 => 0x0160+(16)*/ + /* 360 = 168 */ {37, 0, 8}, /* 0x0016 => 0x0160+(16)*/ + /* 361 = 169 */ {37, 0, 8}, /* 0x0016 => 0x0160+(16)*/ + /* 362 = 16a */ {37, 0, 8}, /* 0x0016 => 0x0160+(16)*/ + /* 363 = 16b */ {37, 0, 8}, /* 0x0016 => 0x0160+(16)*/ + /* 364 = 16c */ {37, 0, 8}, /* 0x0016 => 0x0160+(16)*/ + /* 365 = 16d */ {37, 0, 8}, /* 0x0016 => 0x0160+(16)*/ + /* 366 = 16e */ {37, 0, 8}, /* 0x0016 => 0x0160+(16)*/ + /* 367 = 16f */ {37, 0, 8}, /* 0x0016 => 0x0160+(16)*/ + /* 368 = 170 */ {38, 0, 8}, /* 0x0017 => 0x0170+(16)*/ + /* 369 = 171 */ {38, 0, 8}, /* 0x0017 => 0x0170+(16)*/ + /* 370 = 172 */ {38, 0, 8}, /* 0x0017 => 0x0170+(16)*/ + /* 371 = 173 */ {38, 0, 8}, /* 0x0017 => 0x0170+(16)*/ + /* 372 = 174 */ {38, 0, 8}, /* 0x0017 => 0x0170+(16)*/ + /* 373 = 175 */ {38, 0, 8}, /* 0x0017 => 0x0170+(16)*/ + /* 374 = 176 */ {38, 0, 8}, /* 0x0017 => 0x0170+(16)*/ + /* 375 = 177 */ {38, 0, 8}, /* 0x0017 => 0x0170+(16)*/ + /* 376 = 178 */ {38, 0, 8}, /* 0x0017 => 0x0170+(16)*/ + /* 377 = 179 */ {38, 0, 8}, /* 0x0017 => 0x0170+(16)*/ + /* 378 = 17a */ {38, 0, 8}, /* 0x0017 => 0x0170+(16)*/ + /* 379 = 17b */ {38, 0, 8}, /* 0x0017 => 0x0170+(16)*/ + /* 380 = 17c */ {38, 0, 8}, /* 0x0017 => 0x0170+(16)*/ + /* 381 = 17d */ {38, 0, 8}, /* 0x0017 => 0x0170+(16)*/ + /* 382 = 17e */ {38, 0, 8}, /* 0x0017 => 0x0170+(16)*/ + /* 383 = 17f */ {38, 0, 8}, /* 0x0017 => 0x0170+(16)*/ + /* 384 = 180 */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 385 = 181 */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 386 = 182 */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 387 = 183 */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 388 = 184 */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 389 = 185 */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 390 = 186 */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 391 = 187 */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 392 = 188 */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 393 = 189 */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 394 = 18a */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 395 = 18b */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 396 = 18c */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 397 = 18d */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 398 = 18e */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 399 = 18f */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 400 = 190 */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 401 = 191 */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 402 = 192 */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 403 = 193 */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 404 = 194 */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 405 = 195 */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 406 = 196 */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 407 = 197 */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 408 = 198 */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 409 = 199 */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 410 = 19a */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 411 = 19b */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 412 = 19c */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 413 = 19d */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 414 = 19e */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 415 = 19f */ {19, 0, 7}, /* 0x000c => 0x0180+(32)*/ + /* 416 = 1a0 */ {31, 0, 8}, /* 0x001a => 0x01a0+(16)*/ + /* 417 = 1a1 */ {31, 0, 8}, /* 0x001a => 0x01a0+(16)*/ + /* 418 = 1a2 */ {31, 0, 8}, /* 0x001a => 0x01a0+(16)*/ + /* 419 = 1a3 */ {31, 0, 8}, /* 0x001a => 0x01a0+(16)*/ + /* 420 = 1a4 */ {31, 0, 8}, /* 0x001a => 0x01a0+(16)*/ + /* 421 = 1a5 */ {31, 0, 8}, /* 0x001a => 0x01a0+(16)*/ + /* 422 = 1a6 */ {31, 0, 8}, /* 0x001a => 0x01a0+(16)*/ + /* 423 = 1a7 */ {31, 0, 8}, /* 0x001a => 0x01a0+(16)*/ + /* 424 = 1a8 */ {31, 0, 8}, /* 0x001a => 0x01a0+(16)*/ + /* 425 = 1a9 */ {31, 0, 8}, /* 0x001a => 0x01a0+(16)*/ + /* 426 = 1aa */ {31, 0, 8}, /* 0x001a => 0x01a0+(16)*/ + /* 427 = 1ab */ {31, 0, 8}, /* 0x001a => 0x01a0+(16)*/ + /* 428 = 1ac */ {31, 0, 8}, /* 0x001a => 0x01a0+(16)*/ + /* 429 = 1ad */ {31, 0, 8}, /* 0x001a => 0x01a0+(16)*/ + /* 430 = 1ae */ {31, 0, 8}, /* 0x001a => 0x01a0+(16)*/ + /* 431 = 1af */ {31, 0, 8}, /* 0x001a => 0x01a0+(16)*/ + /* 432 = 1b0 */ {32, 0, 8}, /* 0x001b => 0x01b0+(16)*/ + /* 433 = 1b1 */ {32, 0, 8}, /* 0x001b => 0x01b0+(16)*/ + /* 434 = 1b2 */ {32, 0, 8}, /* 0x001b => 0x01b0+(16)*/ + /* 435 = 1b3 */ {32, 0, 8}, /* 0x001b => 0x01b0+(16)*/ + /* 436 = 1b4 */ {32, 0, 8}, /* 0x001b => 0x01b0+(16)*/ + /* 437 = 1b5 */ {32, 0, 8}, /* 0x001b => 0x01b0+(16)*/ + /* 438 = 1b6 */ {32, 0, 8}, /* 0x001b => 0x01b0+(16)*/ + /* 439 = 1b7 */ {32, 0, 8}, /* 0x001b => 0x01b0+(16)*/ + /* 440 = 1b8 */ {32, 0, 8}, /* 0x001b => 0x01b0+(16)*/ + /* 441 = 1b9 */ {32, 0, 8}, /* 0x001b => 0x01b0+(16)*/ + /* 442 = 1ba */ {32, 0, 8}, /* 0x001b => 0x01b0+(16)*/ + /* 443 = 1bb */ {32, 0, 8}, /* 0x001b => 0x01b0+(16)*/ + /* 444 = 1bc */ {32, 0, 8}, /* 0x001b => 0x01b0+(16)*/ + /* 445 = 1bd */ {32, 0, 8}, /* 0x001b => 0x01b0+(16)*/ + /* 446 = 1be */ {32, 0, 8}, /* 0x001b => 0x01b0+(16)*/ + /* 447 = 1bf */ {32, 0, 8}, /* 0x001b => 0x01b0+(16)*/ + /* 448 = 1c0 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 449 = 1c1 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 450 = 1c2 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 451 = 1c3 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 452 = 1c4 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 453 = 1c5 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 454 = 1c6 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 455 = 1c7 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 456 = 1c8 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 457 = 1c9 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 458 = 1ca */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 459 = 1cb */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 460 = 1cc */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 461 = 1cd */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 462 = 1ce */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 463 = 1cf */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 464 = 1d0 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 465 = 1d1 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 466 = 1d2 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 467 = 1d3 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 468 = 1d4 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 469 = 1d5 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 470 = 1d6 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 471 = 1d7 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 472 = 1d8 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 473 = 1d9 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 474 = 1da */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 475 = 1db */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 476 = 1dc */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 477 = 1dd */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 478 = 1de */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 479 = 1df */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 480 = 1e0 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 481 = 1e1 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 482 = 1e2 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 483 = 1e3 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 484 = 1e4 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 485 = 1e5 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 486 = 1e6 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 487 = 1e7 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 488 = 1e8 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 489 = 1e9 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 490 = 1ea */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 491 = 1eb */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 492 = 1ec */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 493 = 1ed */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 494 = 1ee */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 495 = 1ef */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 496 = 1f0 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 497 = 1f1 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 498 = 1f2 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 499 = 1f3 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 500 = 1f4 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 501 = 1f5 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 502 = 1f6 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 503 = 1f7 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 504 = 1f8 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 505 = 1f9 */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 506 = 1fa */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 507 = 1fb */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 508 = 1fc */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 509 = 1fd */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 510 = 1fe */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 511 = 1ff */ {1, 0, 6}, /* 0x0007 => 0x01c0+(64)*/ + /* 512 = 200 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 513 = 201 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 514 = 202 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 515 = 203 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 516 = 204 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 517 = 205 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 518 = 206 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 519 = 207 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 520 = 208 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 521 = 209 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 522 = 20a */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 523 = 20b */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 524 = 20c */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 525 = 20d */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 526 = 20e */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 527 = 20f */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 528 = 210 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 529 = 211 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 530 = 212 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 531 = 213 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 532 = 214 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 533 = 215 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 534 = 216 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 535 = 217 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 536 = 218 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 537 = 219 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 538 = 21a */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 539 = 21b */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 540 = 21c */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 541 = 21d */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 542 = 21e */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 543 = 21f */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 544 = 220 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 545 = 221 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 546 = 222 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 547 = 223 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 548 = 224 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 549 = 225 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 550 = 226 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 551 = 227 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 552 = 228 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 553 = 229 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 554 = 22a */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 555 = 22b */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 556 = 22c */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 557 = 22d */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 558 = 22e */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 559 = 22f */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 560 = 230 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 561 = 231 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 562 = 232 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 563 = 233 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 564 = 234 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 565 = 235 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 566 = 236 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 567 = 237 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 568 = 238 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 569 = 239 */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 570 = 23a */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 571 = 23b */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 572 = 23c */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 573 = 23d */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 574 = 23e */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 575 = 23f */ {12, 0, 6}, /* 0x0008 => 0x0200+(64)*/ + /* 576 = 240 */ {53, 0, 8}, /* 0x0024 => 0x0240+(16)*/ + /* 577 = 241 */ {53, 0, 8}, /* 0x0024 => 0x0240+(16)*/ + /* 578 = 242 */ {53, 0, 8}, /* 0x0024 => 0x0240+(16)*/ + /* 579 = 243 */ {53, 0, 8}, /* 0x0024 => 0x0240+(16)*/ + /* 580 = 244 */ {53, 0, 8}, /* 0x0024 => 0x0240+(16)*/ + /* 581 = 245 */ {53, 0, 8}, /* 0x0024 => 0x0240+(16)*/ + /* 582 = 246 */ {53, 0, 8}, /* 0x0024 => 0x0240+(16)*/ + /* 583 = 247 */ {53, 0, 8}, /* 0x0024 => 0x0240+(16)*/ + /* 584 = 248 */ {53, 0, 8}, /* 0x0024 => 0x0240+(16)*/ + /* 585 = 249 */ {53, 0, 8}, /* 0x0024 => 0x0240+(16)*/ + /* 586 = 24a */ {53, 0, 8}, /* 0x0024 => 0x0240+(16)*/ + /* 587 = 24b */ {53, 0, 8}, /* 0x0024 => 0x0240+(16)*/ + /* 588 = 24c */ {53, 0, 8}, /* 0x0024 => 0x0240+(16)*/ + /* 589 = 24d */ {53, 0, 8}, /* 0x0024 => 0x0240+(16)*/ + /* 590 = 24e */ {53, 0, 8}, /* 0x0024 => 0x0240+(16)*/ + /* 591 = 24f */ {53, 0, 8}, /* 0x0024 => 0x0240+(16)*/ + /* 592 = 250 */ {54, 0, 8}, /* 0x0025 => 0x0250+(16)*/ + /* 593 = 251 */ {54, 0, 8}, /* 0x0025 => 0x0250+(16)*/ + /* 594 = 252 */ {54, 0, 8}, /* 0x0025 => 0x0250+(16)*/ + /* 595 = 253 */ {54, 0, 8}, /* 0x0025 => 0x0250+(16)*/ + /* 596 = 254 */ {54, 0, 8}, /* 0x0025 => 0x0250+(16)*/ + /* 597 = 255 */ {54, 0, 8}, /* 0x0025 => 0x0250+(16)*/ + /* 598 = 256 */ {54, 0, 8}, /* 0x0025 => 0x0250+(16)*/ + /* 599 = 257 */ {54, 0, 8}, /* 0x0025 => 0x0250+(16)*/ + /* 600 = 258 */ {54, 0, 8}, /* 0x0025 => 0x0250+(16)*/ + /* 601 = 259 */ {54, 0, 8}, /* 0x0025 => 0x0250+(16)*/ + /* 602 = 25a */ {54, 0, 8}, /* 0x0025 => 0x0250+(16)*/ + /* 603 = 25b */ {54, 0, 8}, /* 0x0025 => 0x0250+(16)*/ + /* 604 = 25c */ {54, 0, 8}, /* 0x0025 => 0x0250+(16)*/ + /* 605 = 25d */ {54, 0, 8}, /* 0x0025 => 0x0250+(16)*/ + /* 606 = 25e */ {54, 0, 8}, /* 0x0025 => 0x0250+(16)*/ + /* 607 = 25f */ {54, 0, 8}, /* 0x0025 => 0x0250+(16)*/ + /* 608 = 260 */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 609 = 261 */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 610 = 262 */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 611 = 263 */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 612 = 264 */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 613 = 265 */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 614 = 266 */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 615 = 267 */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 616 = 268 */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 617 = 269 */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 618 = 26a */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 619 = 26b */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 620 = 26c */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 621 = 26d */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 622 = 26e */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 623 = 26f */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 624 = 270 */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 625 = 271 */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 626 = 272 */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 627 = 273 */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 628 = 274 */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 629 = 275 */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 630 = 276 */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 631 = 277 */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 632 = 278 */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 633 = 279 */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 634 = 27a */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 635 = 27b */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 636 = 27c */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 637 = 27d */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 638 = 27e */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 639 = 27f */ {26, 0, 7}, /* 0x0013 => 0x0260+(32)*/ + /* 640 = 280 */ {39, 0, 8}, /* 0x0028 => 0x0280+(16)*/ + /* 641 = 281 */ {39, 0, 8}, /* 0x0028 => 0x0280+(16)*/ + /* 642 = 282 */ {39, 0, 8}, /* 0x0028 => 0x0280+(16)*/ + /* 643 = 283 */ {39, 0, 8}, /* 0x0028 => 0x0280+(16)*/ + /* 644 = 284 */ {39, 0, 8}, /* 0x0028 => 0x0280+(16)*/ + /* 645 = 285 */ {39, 0, 8}, /* 0x0028 => 0x0280+(16)*/ + /* 646 = 286 */ {39, 0, 8}, /* 0x0028 => 0x0280+(16)*/ + /* 647 = 287 */ {39, 0, 8}, /* 0x0028 => 0x0280+(16)*/ + /* 648 = 288 */ {39, 0, 8}, /* 0x0028 => 0x0280+(16)*/ + /* 649 = 289 */ {39, 0, 8}, /* 0x0028 => 0x0280+(16)*/ + /* 650 = 28a */ {39, 0, 8}, /* 0x0028 => 0x0280+(16)*/ + /* 651 = 28b */ {39, 0, 8}, /* 0x0028 => 0x0280+(16)*/ + /* 652 = 28c */ {39, 0, 8}, /* 0x0028 => 0x0280+(16)*/ + /* 653 = 28d */ {39, 0, 8}, /* 0x0028 => 0x0280+(16)*/ + /* 654 = 28e */ {39, 0, 8}, /* 0x0028 => 0x0280+(16)*/ + /* 655 = 28f */ {39, 0, 8}, /* 0x0028 => 0x0280+(16)*/ + /* 656 = 290 */ {40, 0, 8}, /* 0x0029 => 0x0290+(16)*/ + /* 657 = 291 */ {40, 0, 8}, /* 0x0029 => 0x0290+(16)*/ + /* 658 = 292 */ {40, 0, 8}, /* 0x0029 => 0x0290+(16)*/ + /* 659 = 293 */ {40, 0, 8}, /* 0x0029 => 0x0290+(16)*/ + /* 660 = 294 */ {40, 0, 8}, /* 0x0029 => 0x0290+(16)*/ + /* 661 = 295 */ {40, 0, 8}, /* 0x0029 => 0x0290+(16)*/ + /* 662 = 296 */ {40, 0, 8}, /* 0x0029 => 0x0290+(16)*/ + /* 663 = 297 */ {40, 0, 8}, /* 0x0029 => 0x0290+(16)*/ + /* 664 = 298 */ {40, 0, 8}, /* 0x0029 => 0x0290+(16)*/ + /* 665 = 299 */ {40, 0, 8}, /* 0x0029 => 0x0290+(16)*/ + /* 666 = 29a */ {40, 0, 8}, /* 0x0029 => 0x0290+(16)*/ + /* 667 = 29b */ {40, 0, 8}, /* 0x0029 => 0x0290+(16)*/ + /* 668 = 29c */ {40, 0, 8}, /* 0x0029 => 0x0290+(16)*/ + /* 669 = 29d */ {40, 0, 8}, /* 0x0029 => 0x0290+(16)*/ + /* 670 = 29e */ {40, 0, 8}, /* 0x0029 => 0x0290+(16)*/ + /* 671 = 29f */ {40, 0, 8}, /* 0x0029 => 0x0290+(16)*/ + /* 672 = 2a0 */ {41, 0, 8}, /* 0x002a => 0x02a0+(16)*/ + /* 673 = 2a1 */ {41, 0, 8}, /* 0x002a => 0x02a0+(16)*/ + /* 674 = 2a2 */ {41, 0, 8}, /* 0x002a => 0x02a0+(16)*/ + /* 675 = 2a3 */ {41, 0, 8}, /* 0x002a => 0x02a0+(16)*/ + /* 676 = 2a4 */ {41, 0, 8}, /* 0x002a => 0x02a0+(16)*/ + /* 677 = 2a5 */ {41, 0, 8}, /* 0x002a => 0x02a0+(16)*/ + /* 678 = 2a6 */ {41, 0, 8}, /* 0x002a => 0x02a0+(16)*/ + /* 679 = 2a7 */ {41, 0, 8}, /* 0x002a => 0x02a0+(16)*/ + /* 680 = 2a8 */ {41, 0, 8}, /* 0x002a => 0x02a0+(16)*/ + /* 681 = 2a9 */ {41, 0, 8}, /* 0x002a => 0x02a0+(16)*/ + /* 682 = 2aa */ {41, 0, 8}, /* 0x002a => 0x02a0+(16)*/ + /* 683 = 2ab */ {41, 0, 8}, /* 0x002a => 0x02a0+(16)*/ + /* 684 = 2ac */ {41, 0, 8}, /* 0x002a => 0x02a0+(16)*/ + /* 685 = 2ad */ {41, 0, 8}, /* 0x002a => 0x02a0+(16)*/ + /* 686 = 2ae */ {41, 0, 8}, /* 0x002a => 0x02a0+(16)*/ + /* 687 = 2af */ {41, 0, 8}, /* 0x002a => 0x02a0+(16)*/ + /* 688 = 2b0 */ {42, 0, 8}, /* 0x002b => 0x02b0+(16)*/ + /* 689 = 2b1 */ {42, 0, 8}, /* 0x002b => 0x02b0+(16)*/ + /* 690 = 2b2 */ {42, 0, 8}, /* 0x002b => 0x02b0+(16)*/ + /* 691 = 2b3 */ {42, 0, 8}, /* 0x002b => 0x02b0+(16)*/ + /* 692 = 2b4 */ {42, 0, 8}, /* 0x002b => 0x02b0+(16)*/ + /* 693 = 2b5 */ {42, 0, 8}, /* 0x002b => 0x02b0+(16)*/ + /* 694 = 2b6 */ {42, 0, 8}, /* 0x002b => 0x02b0+(16)*/ + /* 695 = 2b7 */ {42, 0, 8}, /* 0x002b => 0x02b0+(16)*/ + /* 696 = 2b8 */ {42, 0, 8}, /* 0x002b => 0x02b0+(16)*/ + /* 697 = 2b9 */ {42, 0, 8}, /* 0x002b => 0x02b0+(16)*/ + /* 698 = 2ba */ {42, 0, 8}, /* 0x002b => 0x02b0+(16)*/ + /* 699 = 2bb */ {42, 0, 8}, /* 0x002b => 0x02b0+(16)*/ + /* 700 = 2bc */ {42, 0, 8}, /* 0x002b => 0x02b0+(16)*/ + /* 701 = 2bd */ {42, 0, 8}, /* 0x002b => 0x02b0+(16)*/ + /* 702 = 2be */ {42, 0, 8}, /* 0x002b => 0x02b0+(16)*/ + /* 703 = 2bf */ {42, 0, 8}, /* 0x002b => 0x02b0+(16)*/ + /* 704 = 2c0 */ {43, 0, 8}, /* 0x002c => 0x02c0+(16)*/ + /* 705 = 2c1 */ {43, 0, 8}, /* 0x002c => 0x02c0+(16)*/ + /* 706 = 2c2 */ {43, 0, 8}, /* 0x002c => 0x02c0+(16)*/ + /* 707 = 2c3 */ {43, 0, 8}, /* 0x002c => 0x02c0+(16)*/ + /* 708 = 2c4 */ {43, 0, 8}, /* 0x002c => 0x02c0+(16)*/ + /* 709 = 2c5 */ {43, 0, 8}, /* 0x002c => 0x02c0+(16)*/ + /* 710 = 2c6 */ {43, 0, 8}, /* 0x002c => 0x02c0+(16)*/ + /* 711 = 2c7 */ {43, 0, 8}, /* 0x002c => 0x02c0+(16)*/ + /* 712 = 2c8 */ {43, 0, 8}, /* 0x002c => 0x02c0+(16)*/ + /* 713 = 2c9 */ {43, 0, 8}, /* 0x002c => 0x02c0+(16)*/ + /* 714 = 2ca */ {43, 0, 8}, /* 0x002c => 0x02c0+(16)*/ + /* 715 = 2cb */ {43, 0, 8}, /* 0x002c => 0x02c0+(16)*/ + /* 716 = 2cc */ {43, 0, 8}, /* 0x002c => 0x02c0+(16)*/ + /* 717 = 2cd */ {43, 0, 8}, /* 0x002c => 0x02c0+(16)*/ + /* 718 = 2ce */ {43, 0, 8}, /* 0x002c => 0x02c0+(16)*/ + /* 719 = 2cf */ {43, 0, 8}, /* 0x002c => 0x02c0+(16)*/ + /* 720 = 2d0 */ {44, 0, 8}, /* 0x002d => 0x02d0+(16)*/ + /* 721 = 2d1 */ {44, 0, 8}, /* 0x002d => 0x02d0+(16)*/ + /* 722 = 2d2 */ {44, 0, 8}, /* 0x002d => 0x02d0+(16)*/ + /* 723 = 2d3 */ {44, 0, 8}, /* 0x002d => 0x02d0+(16)*/ + /* 724 = 2d4 */ {44, 0, 8}, /* 0x002d => 0x02d0+(16)*/ + /* 725 = 2d5 */ {44, 0, 8}, /* 0x002d => 0x02d0+(16)*/ + /* 726 = 2d6 */ {44, 0, 8}, /* 0x002d => 0x02d0+(16)*/ + /* 727 = 2d7 */ {44, 0, 8}, /* 0x002d => 0x02d0+(16)*/ + /* 728 = 2d8 */ {44, 0, 8}, /* 0x002d => 0x02d0+(16)*/ + /* 729 = 2d9 */ {44, 0, 8}, /* 0x002d => 0x02d0+(16)*/ + /* 730 = 2da */ {44, 0, 8}, /* 0x002d => 0x02d0+(16)*/ + /* 731 = 2db */ {44, 0, 8}, /* 0x002d => 0x02d0+(16)*/ + /* 732 = 2dc */ {44, 0, 8}, /* 0x002d => 0x02d0+(16)*/ + /* 733 = 2dd */ {44, 0, 8}, /* 0x002d => 0x02d0+(16)*/ + /* 734 = 2de */ {44, 0, 8}, /* 0x002d => 0x02d0+(16)*/ + /* 735 = 2df */ {44, 0, 8}, /* 0x002d => 0x02d0+(16)*/ + /* 736 = 2e0 */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 737 = 2e1 */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 738 = 2e2 */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 739 = 2e3 */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 740 = 2e4 */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 741 = 2e5 */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 742 = 2e6 */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 743 = 2e7 */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 744 = 2e8 */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 745 = 2e9 */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 746 = 2ea */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 747 = 2eb */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 748 = 2ec */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 749 = 2ed */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 750 = 2ee */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 751 = 2ef */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 752 = 2f0 */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 753 = 2f1 */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 754 = 2f2 */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 755 = 2f3 */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 756 = 2f4 */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 757 = 2f5 */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 758 = 2f6 */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 759 = 2f7 */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 760 = 2f8 */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 761 = 2f9 */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 762 = 2fa */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 763 = 2fb */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 764 = 2fc */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 765 = 2fd */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 766 = 2fe */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 767 = 2ff */ {21, 0, 7}, /* 0x0017 => 0x02e0+(32)*/ + /* 768 = 300 */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 769 = 301 */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 770 = 302 */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 771 = 303 */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 772 = 304 */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 773 = 305 */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 774 = 306 */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 775 = 307 */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 776 = 308 */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 777 = 309 */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 778 = 30a */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 779 = 30b */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 780 = 30c */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 781 = 30d */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 782 = 30e */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 783 = 30f */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 784 = 310 */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 785 = 311 */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 786 = 312 */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 787 = 313 */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 788 = 314 */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 789 = 315 */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 790 = 316 */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 791 = 317 */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 792 = 318 */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 793 = 319 */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 794 = 31a */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 795 = 31b */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 796 = 31c */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 797 = 31d */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 798 = 31e */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 799 = 31f */ {28, 0, 7}, /* 0x0018 => 0x0300+(32)*/ + /* 800 = 320 */ {61, 0, 8}, /* 0x0032 => 0x0320+(16)*/ + /* 801 = 321 */ {61, 0, 8}, /* 0x0032 => 0x0320+(16)*/ + /* 802 = 322 */ {61, 0, 8}, /* 0x0032 => 0x0320+(16)*/ + /* 803 = 323 */ {61, 0, 8}, /* 0x0032 => 0x0320+(16)*/ + /* 804 = 324 */ {61, 0, 8}, /* 0x0032 => 0x0320+(16)*/ + /* 805 = 325 */ {61, 0, 8}, /* 0x0032 => 0x0320+(16)*/ + /* 806 = 326 */ {61, 0, 8}, /* 0x0032 => 0x0320+(16)*/ + /* 807 = 327 */ {61, 0, 8}, /* 0x0032 => 0x0320+(16)*/ + /* 808 = 328 */ {61, 0, 8}, /* 0x0032 => 0x0320+(16)*/ + /* 809 = 329 */ {61, 0, 8}, /* 0x0032 => 0x0320+(16)*/ + /* 810 = 32a */ {61, 0, 8}, /* 0x0032 => 0x0320+(16)*/ + /* 811 = 32b */ {61, 0, 8}, /* 0x0032 => 0x0320+(16)*/ + /* 812 = 32c */ {61, 0, 8}, /* 0x0032 => 0x0320+(16)*/ + /* 813 = 32d */ {61, 0, 8}, /* 0x0032 => 0x0320+(16)*/ + /* 814 = 32e */ {61, 0, 8}, /* 0x0032 => 0x0320+(16)*/ + /* 815 = 32f */ {61, 0, 8}, /* 0x0032 => 0x0320+(16)*/ + /* 816 = 330 */ {62, 0, 8}, /* 0x0033 => 0x0330+(16)*/ + /* 817 = 331 */ {62, 0, 8}, /* 0x0033 => 0x0330+(16)*/ + /* 818 = 332 */ {62, 0, 8}, /* 0x0033 => 0x0330+(16)*/ + /* 819 = 333 */ {62, 0, 8}, /* 0x0033 => 0x0330+(16)*/ + /* 820 = 334 */ {62, 0, 8}, /* 0x0033 => 0x0330+(16)*/ + /* 821 = 335 */ {62, 0, 8}, /* 0x0033 => 0x0330+(16)*/ + /* 822 = 336 */ {62, 0, 8}, /* 0x0033 => 0x0330+(16)*/ + /* 823 = 337 */ {62, 0, 8}, /* 0x0033 => 0x0330+(16)*/ + /* 824 = 338 */ {62, 0, 8}, /* 0x0033 => 0x0330+(16)*/ + /* 825 = 339 */ {62, 0, 8}, /* 0x0033 => 0x0330+(16)*/ + /* 826 = 33a */ {62, 0, 8}, /* 0x0033 => 0x0330+(16)*/ + /* 827 = 33b */ {62, 0, 8}, /* 0x0033 => 0x0330+(16)*/ + /* 828 = 33c */ {62, 0, 8}, /* 0x0033 => 0x0330+(16)*/ + /* 829 = 33d */ {62, 0, 8}, /* 0x0033 => 0x0330+(16)*/ + /* 830 = 33e */ {62, 0, 8}, /* 0x0033 => 0x0330+(16)*/ + /* 831 = 33f */ {62, 0, 8}, /* 0x0033 => 0x0330+(16)*/ + /* 832 = 340 */ {63, 0, 8}, /* 0x0034 => 0x0340+(16)*/ + /* 833 = 341 */ {63, 0, 8}, /* 0x0034 => 0x0340+(16)*/ + /* 834 = 342 */ {63, 0, 8}, /* 0x0034 => 0x0340+(16)*/ + /* 835 = 343 */ {63, 0, 8}, /* 0x0034 => 0x0340+(16)*/ + /* 836 = 344 */ {63, 0, 8}, /* 0x0034 => 0x0340+(16)*/ + /* 837 = 345 */ {63, 0, 8}, /* 0x0034 => 0x0340+(16)*/ + /* 838 = 346 */ {63, 0, 8}, /* 0x0034 => 0x0340+(16)*/ + /* 839 = 347 */ {63, 0, 8}, /* 0x0034 => 0x0340+(16)*/ + /* 840 = 348 */ {63, 0, 8}, /* 0x0034 => 0x0340+(16)*/ + /* 841 = 349 */ {63, 0, 8}, /* 0x0034 => 0x0340+(16)*/ + /* 842 = 34a */ {63, 0, 8}, /* 0x0034 => 0x0340+(16)*/ + /* 843 = 34b */ {63, 0, 8}, /* 0x0034 => 0x0340+(16)*/ + /* 844 = 34c */ {63, 0, 8}, /* 0x0034 => 0x0340+(16)*/ + /* 845 = 34d */ {63, 0, 8}, /* 0x0034 => 0x0340+(16)*/ + /* 846 = 34e */ {63, 0, 8}, /* 0x0034 => 0x0340+(16)*/ + /* 847 = 34f */ {63, 0, 8}, /* 0x0034 => 0x0340+(16)*/ + /* 848 = 350 */ {0, 0, 8}, /* 0x0035 => 0x0350+(16)*/ + /* 849 = 351 */ {0, 0, 8}, /* 0x0035 => 0x0350+(16)*/ + /* 850 = 352 */ {0, 0, 8}, /* 0x0035 => 0x0350+(16)*/ + /* 851 = 353 */ {0, 0, 8}, /* 0x0035 => 0x0350+(16)*/ + /* 852 = 354 */ {0, 0, 8}, /* 0x0035 => 0x0350+(16)*/ + /* 853 = 355 */ {0, 0, 8}, /* 0x0035 => 0x0350+(16)*/ + /* 854 = 356 */ {0, 0, 8}, /* 0x0035 => 0x0350+(16)*/ + /* 855 = 357 */ {0, 0, 8}, /* 0x0035 => 0x0350+(16)*/ + /* 856 = 358 */ {0, 0, 8}, /* 0x0035 => 0x0350+(16)*/ + /* 857 = 359 */ {0, 0, 8}, /* 0x0035 => 0x0350+(16)*/ + /* 858 = 35a */ {0, 0, 8}, /* 0x0035 => 0x0350+(16)*/ + /* 859 = 35b */ {0, 0, 8}, /* 0x0035 => 0x0350+(16)*/ + /* 860 = 35c */ {0, 0, 8}, /* 0x0035 => 0x0350+(16)*/ + /* 861 = 35d */ {0, 0, 8}, /* 0x0035 => 0x0350+(16)*/ + /* 862 = 35e */ {0, 0, 8}, /* 0x0035 => 0x0350+(16)*/ + /* 863 = 35f */ {0, 0, 8}, /* 0x0035 => 0x0350+(16)*/ + /* 864 = 360 */ {320, 1, 8}, /* 0x0036 => 0x0360+(16)*/ + /* 865 = 361 */ {320, 1, 8}, /* 0x0036 => 0x0360+(16)*/ + /* 866 = 362 */ {320, 1, 8}, /* 0x0036 => 0x0360+(16)*/ + /* 867 = 363 */ {320, 1, 8}, /* 0x0036 => 0x0360+(16)*/ + /* 868 = 364 */ {320, 1, 8}, /* 0x0036 => 0x0360+(16)*/ + /* 869 = 365 */ {320, 1, 8}, /* 0x0036 => 0x0360+(16)*/ + /* 870 = 366 */ {320, 1, 8}, /* 0x0036 => 0x0360+(16)*/ + /* 871 = 367 */ {320, 1, 8}, /* 0x0036 => 0x0360+(16)*/ + /* 872 = 368 */ {320, 1, 8}, /* 0x0036 => 0x0360+(16)*/ + /* 873 = 369 */ {320, 1, 8}, /* 0x0036 => 0x0360+(16)*/ + /* 874 = 36a */ {320, 1, 8}, /* 0x0036 => 0x0360+(16)*/ + /* 875 = 36b */ {320, 1, 8}, /* 0x0036 => 0x0360+(16)*/ + /* 876 = 36c */ {320, 1, 8}, /* 0x0036 => 0x0360+(16)*/ + /* 877 = 36d */ {320, 1, 8}, /* 0x0036 => 0x0360+(16)*/ + /* 878 = 36e */ {320, 1, 8}, /* 0x0036 => 0x0360+(16)*/ + /* 879 = 36f */ {320, 1, 8}, /* 0x0036 => 0x0360+(16)*/ + /* 880 = 370 */ {384, 1, 8}, /* 0x0037 => 0x0370+(16)*/ + /* 881 = 371 */ {384, 1, 8}, /* 0x0037 => 0x0370+(16)*/ + /* 882 = 372 */ {384, 1, 8}, /* 0x0037 => 0x0370+(16)*/ + /* 883 = 373 */ {384, 1, 8}, /* 0x0037 => 0x0370+(16)*/ + /* 884 = 374 */ {384, 1, 8}, /* 0x0037 => 0x0370+(16)*/ + /* 885 = 375 */ {384, 1, 8}, /* 0x0037 => 0x0370+(16)*/ + /* 886 = 376 */ {384, 1, 8}, /* 0x0037 => 0x0370+(16)*/ + /* 887 = 377 */ {384, 1, 8}, /* 0x0037 => 0x0370+(16)*/ + /* 888 = 378 */ {384, 1, 8}, /* 0x0037 => 0x0370+(16)*/ + /* 889 = 379 */ {384, 1, 8}, /* 0x0037 => 0x0370+(16)*/ + /* 890 = 37a */ {384, 1, 8}, /* 0x0037 => 0x0370+(16)*/ + /* 891 = 37b */ {384, 1, 8}, /* 0x0037 => 0x0370+(16)*/ + /* 892 = 37c */ {384, 1, 8}, /* 0x0037 => 0x0370+(16)*/ + /* 893 = 37d */ {384, 1, 8}, /* 0x0037 => 0x0370+(16)*/ + /* 894 = 37e */ {384, 1, 8}, /* 0x0037 => 0x0370+(16)*/ + /* 895 = 37f */ {384, 1, 8}, /* 0x0037 => 0x0370+(16)*/ + /* 896 = 380 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 897 = 381 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 898 = 382 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 899 = 383 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 900 = 384 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 901 = 385 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 902 = 386 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 903 = 387 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 904 = 388 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 905 = 389 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 906 = 38a */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 907 = 38b */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 908 = 38c */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 909 = 38d */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 910 = 38e */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 911 = 38f */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 912 = 390 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 913 = 391 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 914 = 392 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 915 = 393 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 916 = 394 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 917 = 395 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 918 = 396 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 919 = 397 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 920 = 398 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 921 = 399 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 922 = 39a */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 923 = 39b */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 924 = 39c */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 925 = 39d */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 926 = 39e */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 927 = 39f */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 928 = 3a0 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 929 = 3a1 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 930 = 3a2 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 931 = 3a3 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 932 = 3a4 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 933 = 3a5 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 934 = 3a6 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 935 = 3a7 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 936 = 3a8 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 937 = 3a9 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 938 = 3aa */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 939 = 3ab */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 940 = 3ac */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 941 = 3ad */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 942 = 3ae */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 943 = 3af */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 944 = 3b0 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 945 = 3b1 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 946 = 3b2 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 947 = 3b3 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 948 = 3b4 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 949 = 3b5 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 950 = 3b6 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 951 = 3b7 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 952 = 3b8 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 953 = 3b9 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 954 = 3ba */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 955 = 3bb */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 956 = 3bc */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 957 = 3bd */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 958 = 3be */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 959 = 3bf */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 960 = 3c0 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 961 = 3c1 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 962 = 3c2 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 963 = 3c3 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 964 = 3c4 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 965 = 3c5 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 966 = 3c6 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 967 = 3c7 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 968 = 3c8 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 969 = 3c9 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 970 = 3ca */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 971 = 3cb */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 972 = 3cc */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 973 = 3cd */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 974 = 3ce */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 975 = 3cf */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 976 = 3d0 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 977 = 3d1 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 978 = 3d2 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 979 = 3d3 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 980 = 3d4 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 981 = 3d5 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 982 = 3d6 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 983 = 3d7 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 984 = 3d8 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 985 = 3d9 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 986 = 3da */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 987 = 3db */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 988 = 3dc */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 989 = 3dd */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 990 = 3de */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 991 = 3df */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 992 = 3e0 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 993 = 3e1 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 994 = 3e2 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 995 = 3e3 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 996 = 3e4 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 997 = 3e5 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 998 = 3e6 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 999 = 3e7 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1000 = 3e8 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1001 = 3e9 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1002 = 3ea */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1003 = 3eb */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1004 = 3ec */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1005 = 3ed */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1006 = 3ee */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1007 = 3ef */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1008 = 3f0 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1009 = 3f1 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1010 = 3f2 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1011 = 3f3 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1012 = 3f4 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1013 = 3f5 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1014 = 3f6 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1015 = 3f7 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1016 = 3f8 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1017 = 3f9 */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1018 = 3fa */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1019 = 3fb */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1020 = 3fc */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1021 = 3fd */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1022 = 3fe */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1023 = 3ff */ {10, 0, 5}, /* 0x0007 => 0x0380+(128)*/ + /* 1024 = 400 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1025 = 401 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1026 = 402 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1027 = 403 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1028 = 404 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1029 = 405 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1030 = 406 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1031 = 407 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1032 = 408 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1033 = 409 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1034 = 40a */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1035 = 40b */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1036 = 40c */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1037 = 40d */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1038 = 40e */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1039 = 40f */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1040 = 410 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1041 = 411 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1042 = 412 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1043 = 413 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1044 = 414 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1045 = 415 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1046 = 416 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1047 = 417 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1048 = 418 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1049 = 419 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1050 = 41a */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1051 = 41b */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1052 = 41c */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1053 = 41d */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1054 = 41e */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1055 = 41f */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1056 = 420 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1057 = 421 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1058 = 422 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1059 = 423 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1060 = 424 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1061 = 425 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1062 = 426 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1063 = 427 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1064 = 428 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1065 = 429 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1066 = 42a */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1067 = 42b */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1068 = 42c */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1069 = 42d */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1070 = 42e */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1071 = 42f */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1072 = 430 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1073 = 431 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1074 = 432 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1075 = 433 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1076 = 434 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1077 = 435 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1078 = 436 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1079 = 437 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1080 = 438 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1081 = 439 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1082 = 43a */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1083 = 43b */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1084 = 43c */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1085 = 43d */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1086 = 43e */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1087 = 43f */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1088 = 440 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1089 = 441 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1090 = 442 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1091 = 443 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1092 = 444 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1093 = 445 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1094 = 446 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1095 = 447 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1096 = 448 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1097 = 449 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1098 = 44a */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1099 = 44b */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1100 = 44c */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1101 = 44d */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1102 = 44e */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1103 = 44f */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1104 = 450 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1105 = 451 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1106 = 452 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1107 = 453 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1108 = 454 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1109 = 455 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1110 = 456 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1111 = 457 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1112 = 458 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1113 = 459 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1114 = 45a */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1115 = 45b */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1116 = 45c */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1117 = 45d */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1118 = 45e */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1119 = 45f */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1120 = 460 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1121 = 461 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1122 = 462 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1123 = 463 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1124 = 464 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1125 = 465 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1126 = 466 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1127 = 467 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1128 = 468 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1129 = 469 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1130 = 46a */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1131 = 46b */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1132 = 46c */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1133 = 46d */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1134 = 46e */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1135 = 46f */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1136 = 470 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1137 = 471 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1138 = 472 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1139 = 473 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1140 = 474 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1141 = 475 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1142 = 476 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1143 = 477 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1144 = 478 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1145 = 479 */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1146 = 47a */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1147 = 47b */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1148 = 47c */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1149 = 47d */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1150 = 47e */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1151 = 47f */ {11, 0, 5}, /* 0x0008 => 0x0400+(128)*/ + /* 1152 = 480 */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1153 = 481 */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1154 = 482 */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1155 = 483 */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1156 = 484 */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1157 = 485 */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1158 = 486 */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1159 = 487 */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1160 = 488 */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1161 = 489 */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1162 = 48a */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1163 = 48b */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1164 = 48c */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1165 = 48d */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1166 = 48e */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1167 = 48f */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1168 = 490 */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1169 = 491 */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1170 = 492 */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1171 = 493 */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1172 = 494 */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1173 = 495 */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1174 = 496 */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1175 = 497 */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1176 = 498 */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1177 = 499 */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1178 = 49a */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1179 = 49b */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1180 = 49c */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1181 = 49d */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1182 = 49e */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1183 = 49f */ {27, 0, 7}, /* 0x0024 => 0x0480+(32)*/ + /* 1184 = 4a0 */ {59, 0, 8}, /* 0x004a => 0x04a0+(16)*/ + /* 1185 = 4a1 */ {59, 0, 8}, /* 0x004a => 0x04a0+(16)*/ + /* 1186 = 4a2 */ {59, 0, 8}, /* 0x004a => 0x04a0+(16)*/ + /* 1187 = 4a3 */ {59, 0, 8}, /* 0x004a => 0x04a0+(16)*/ + /* 1188 = 4a4 */ {59, 0, 8}, /* 0x004a => 0x04a0+(16)*/ + /* 1189 = 4a5 */ {59, 0, 8}, /* 0x004a => 0x04a0+(16)*/ + /* 1190 = 4a6 */ {59, 0, 8}, /* 0x004a => 0x04a0+(16)*/ + /* 1191 = 4a7 */ {59, 0, 8}, /* 0x004a => 0x04a0+(16)*/ + /* 1192 = 4a8 */ {59, 0, 8}, /* 0x004a => 0x04a0+(16)*/ + /* 1193 = 4a9 */ {59, 0, 8}, /* 0x004a => 0x04a0+(16)*/ + /* 1194 = 4aa */ {59, 0, 8}, /* 0x004a => 0x04a0+(16)*/ + /* 1195 = 4ab */ {59, 0, 8}, /* 0x004a => 0x04a0+(16)*/ + /* 1196 = 4ac */ {59, 0, 8}, /* 0x004a => 0x04a0+(16)*/ + /* 1197 = 4ad */ {59, 0, 8}, /* 0x004a => 0x04a0+(16)*/ + /* 1198 = 4ae */ {59, 0, 8}, /* 0x004a => 0x04a0+(16)*/ + /* 1199 = 4af */ {59, 0, 8}, /* 0x004a => 0x04a0+(16)*/ + /* 1200 = 4b0 */ {60, 0, 8}, /* 0x004b => 0x04b0+(16)*/ + /* 1201 = 4b1 */ {60, 0, 8}, /* 0x004b => 0x04b0+(16)*/ + /* 1202 = 4b2 */ {60, 0, 8}, /* 0x004b => 0x04b0+(16)*/ + /* 1203 = 4b3 */ {60, 0, 8}, /* 0x004b => 0x04b0+(16)*/ + /* 1204 = 4b4 */ {60, 0, 8}, /* 0x004b => 0x04b0+(16)*/ + /* 1205 = 4b5 */ {60, 0, 8}, /* 0x004b => 0x04b0+(16)*/ + /* 1206 = 4b6 */ {60, 0, 8}, /* 0x004b => 0x04b0+(16)*/ + /* 1207 = 4b7 */ {60, 0, 8}, /* 0x004b => 0x04b0+(16)*/ + /* 1208 = 4b8 */ {60, 0, 8}, /* 0x004b => 0x04b0+(16)*/ + /* 1209 = 4b9 */ {60, 0, 8}, /* 0x004b => 0x04b0+(16)*/ + /* 1210 = 4ba */ {60, 0, 8}, /* 0x004b => 0x04b0+(16)*/ + /* 1211 = 4bb */ {60, 0, 8}, /* 0x004b => 0x04b0+(16)*/ + /* 1212 = 4bc */ {60, 0, 8}, /* 0x004b => 0x04b0+(16)*/ + /* 1213 = 4bd */ {60, 0, 8}, /* 0x004b => 0x04b0+(16)*/ + /* 1214 = 4be */ {60, 0, 8}, /* 0x004b => 0x04b0+(16)*/ + /* 1215 = 4bf */ {60, 0, 8}, /* 0x004b => 0x04b0+(16)*/ + /* 1216 = 4c0 */ {1472, 1, 9}, /* 0x0098 => 0x04c0+(8)*/ + /* 1217 = 4c1 */ {1472, 1, 9}, /* 0x0098 => 0x04c0+(8)*/ + /* 1218 = 4c2 */ {1472, 1, 9}, /* 0x0098 => 0x04c0+(8)*/ + /* 1219 = 4c3 */ {1472, 1, 9}, /* 0x0098 => 0x04c0+(8)*/ + /* 1220 = 4c4 */ {1472, 1, 9}, /* 0x0098 => 0x04c0+(8)*/ + /* 1221 = 4c5 */ {1472, 1, 9}, /* 0x0098 => 0x04c0+(8)*/ + /* 1222 = 4c6 */ {1472, 1, 9}, /* 0x0098 => 0x04c0+(8)*/ + /* 1223 = 4c7 */ {1472, 1, 9}, /* 0x0098 => 0x04c0+(8)*/ + /* 1224 = 4c8 */ {1536, 1, 9}, /* 0x0099 => 0x04c8+(8)*/ + /* 1225 = 4c9 */ {1536, 1, 9}, /* 0x0099 => 0x04c8+(8)*/ + /* 1226 = 4ca */ {1536, 1, 9}, /* 0x0099 => 0x04c8+(8)*/ + /* 1227 = 4cb */ {1536, 1, 9}, /* 0x0099 => 0x04c8+(8)*/ + /* 1228 = 4cc */ {1536, 1, 9}, /* 0x0099 => 0x04c8+(8)*/ + /* 1229 = 4cd */ {1536, 1, 9}, /* 0x0099 => 0x04c8+(8)*/ + /* 1230 = 4ce */ {1536, 1, 9}, /* 0x0099 => 0x04c8+(8)*/ + /* 1231 = 4cf */ {1536, 1, 9}, /* 0x0099 => 0x04c8+(8)*/ + /* 1232 = 4d0 */ {1600, 1, 9}, /* 0x009a => 0x04d0+(8)*/ + /* 1233 = 4d1 */ {1600, 1, 9}, /* 0x009a => 0x04d0+(8)*/ + /* 1234 = 4d2 */ {1600, 1, 9}, /* 0x009a => 0x04d0+(8)*/ + /* 1235 = 4d3 */ {1600, 1, 9}, /* 0x009a => 0x04d0+(8)*/ + /* 1236 = 4d4 */ {1600, 1, 9}, /* 0x009a => 0x04d0+(8)*/ + /* 1237 = 4d5 */ {1600, 1, 9}, /* 0x009a => 0x04d0+(8)*/ + /* 1238 = 4d6 */ {1600, 1, 9}, /* 0x009a => 0x04d0+(8)*/ + /* 1239 = 4d7 */ {1600, 1, 9}, /* 0x009a => 0x04d0+(8)*/ + /* 1240 = 4d8 */ {1728, 1, 9}, /* 0x009b => 0x04d8+(8)*/ + /* 1241 = 4d9 */ {1728, 1, 9}, /* 0x009b => 0x04d8+(8)*/ + /* 1242 = 4da */ {1728, 1, 9}, /* 0x009b => 0x04d8+(8)*/ + /* 1243 = 4db */ {1728, 1, 9}, /* 0x009b => 0x04d8+(8)*/ + /* 1244 = 4dc */ {1728, 1, 9}, /* 0x009b => 0x04d8+(8)*/ + /* 1245 = 4dd */ {1728, 1, 9}, /* 0x009b => 0x04d8+(8)*/ + /* 1246 = 4de */ {1728, 1, 9}, /* 0x009b => 0x04d8+(8)*/ + /* 1247 = 4df */ {1728, 1, 9}, /* 0x009b => 0x04d8+(8)*/ + /* 1248 = 4e0 */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1249 = 4e1 */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1250 = 4e2 */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1251 = 4e3 */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1252 = 4e4 */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1253 = 4e5 */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1254 = 4e6 */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1255 = 4e7 */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1256 = 4e8 */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1257 = 4e9 */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1258 = 4ea */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1259 = 4eb */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1260 = 4ec */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1261 = 4ed */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1262 = 4ee */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1263 = 4ef */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1264 = 4f0 */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1265 = 4f1 */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1266 = 4f2 */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1267 = 4f3 */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1268 = 4f4 */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1269 = 4f5 */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1270 = 4f6 */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1271 = 4f7 */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1272 = 4f8 */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1273 = 4f9 */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1274 = 4fa */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1275 = 4fb */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1276 = 4fc */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1277 = 4fd */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1278 = 4fe */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1279 = 4ff */ {18, 0, 7}, /* 0x0027 => 0x04e0+(32)*/ + /* 1280 = 500 */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1281 = 501 */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1282 = 502 */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1283 = 503 */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1284 = 504 */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1285 = 505 */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1286 = 506 */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1287 = 507 */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1288 = 508 */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1289 = 509 */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1290 = 50a */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1291 = 50b */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1292 = 50c */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1293 = 50d */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1294 = 50e */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1295 = 50f */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1296 = 510 */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1297 = 511 */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1298 = 512 */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1299 = 513 */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1300 = 514 */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1301 = 515 */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1302 = 516 */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1303 = 517 */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1304 = 518 */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1305 = 519 */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1306 = 51a */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1307 = 51b */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1308 = 51c */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1309 = 51d */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1310 = 51e */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1311 = 51f */ {24, 0, 7}, /* 0x0028 => 0x0500+(32)*/ + /* 1312 = 520 */ {49, 0, 8}, /* 0x0052 => 0x0520+(16)*/ + /* 1313 = 521 */ {49, 0, 8}, /* 0x0052 => 0x0520+(16)*/ + /* 1314 = 522 */ {49, 0, 8}, /* 0x0052 => 0x0520+(16)*/ + /* 1315 = 523 */ {49, 0, 8}, /* 0x0052 => 0x0520+(16)*/ + /* 1316 = 524 */ {49, 0, 8}, /* 0x0052 => 0x0520+(16)*/ + /* 1317 = 525 */ {49, 0, 8}, /* 0x0052 => 0x0520+(16)*/ + /* 1318 = 526 */ {49, 0, 8}, /* 0x0052 => 0x0520+(16)*/ + /* 1319 = 527 */ {49, 0, 8}, /* 0x0052 => 0x0520+(16)*/ + /* 1320 = 528 */ {49, 0, 8}, /* 0x0052 => 0x0520+(16)*/ + /* 1321 = 529 */ {49, 0, 8}, /* 0x0052 => 0x0520+(16)*/ + /* 1322 = 52a */ {49, 0, 8}, /* 0x0052 => 0x0520+(16)*/ + /* 1323 = 52b */ {49, 0, 8}, /* 0x0052 => 0x0520+(16)*/ + /* 1324 = 52c */ {49, 0, 8}, /* 0x0052 => 0x0520+(16)*/ + /* 1325 = 52d */ {49, 0, 8}, /* 0x0052 => 0x0520+(16)*/ + /* 1326 = 52e */ {49, 0, 8}, /* 0x0052 => 0x0520+(16)*/ + /* 1327 = 52f */ {49, 0, 8}, /* 0x0052 => 0x0520+(16)*/ + /* 1328 = 530 */ {50, 0, 8}, /* 0x0053 => 0x0530+(16)*/ + /* 1329 = 531 */ {50, 0, 8}, /* 0x0053 => 0x0530+(16)*/ + /* 1330 = 532 */ {50, 0, 8}, /* 0x0053 => 0x0530+(16)*/ + /* 1331 = 533 */ {50, 0, 8}, /* 0x0053 => 0x0530+(16)*/ + /* 1332 = 534 */ {50, 0, 8}, /* 0x0053 => 0x0530+(16)*/ + /* 1333 = 535 */ {50, 0, 8}, /* 0x0053 => 0x0530+(16)*/ + /* 1334 = 536 */ {50, 0, 8}, /* 0x0053 => 0x0530+(16)*/ + /* 1335 = 537 */ {50, 0, 8}, /* 0x0053 => 0x0530+(16)*/ + /* 1336 = 538 */ {50, 0, 8}, /* 0x0053 => 0x0530+(16)*/ + /* 1337 = 539 */ {50, 0, 8}, /* 0x0053 => 0x0530+(16)*/ + /* 1338 = 53a */ {50, 0, 8}, /* 0x0053 => 0x0530+(16)*/ + /* 1339 = 53b */ {50, 0, 8}, /* 0x0053 => 0x0530+(16)*/ + /* 1340 = 53c */ {50, 0, 8}, /* 0x0053 => 0x0530+(16)*/ + /* 1341 = 53d */ {50, 0, 8}, /* 0x0053 => 0x0530+(16)*/ + /* 1342 = 53e */ {50, 0, 8}, /* 0x0053 => 0x0530+(16)*/ + /* 1343 = 53f */ {50, 0, 8}, /* 0x0053 => 0x0530+(16)*/ + /* 1344 = 540 */ {51, 0, 8}, /* 0x0054 => 0x0540+(16)*/ + /* 1345 = 541 */ {51, 0, 8}, /* 0x0054 => 0x0540+(16)*/ + /* 1346 = 542 */ {51, 0, 8}, /* 0x0054 => 0x0540+(16)*/ + /* 1347 = 543 */ {51, 0, 8}, /* 0x0054 => 0x0540+(16)*/ + /* 1348 = 544 */ {51, 0, 8}, /* 0x0054 => 0x0540+(16)*/ + /* 1349 = 545 */ {51, 0, 8}, /* 0x0054 => 0x0540+(16)*/ + /* 1350 = 546 */ {51, 0, 8}, /* 0x0054 => 0x0540+(16)*/ + /* 1351 = 547 */ {51, 0, 8}, /* 0x0054 => 0x0540+(16)*/ + /* 1352 = 548 */ {51, 0, 8}, /* 0x0054 => 0x0540+(16)*/ + /* 1353 = 549 */ {51, 0, 8}, /* 0x0054 => 0x0540+(16)*/ + /* 1354 = 54a */ {51, 0, 8}, /* 0x0054 => 0x0540+(16)*/ + /* 1355 = 54b */ {51, 0, 8}, /* 0x0054 => 0x0540+(16)*/ + /* 1356 = 54c */ {51, 0, 8}, /* 0x0054 => 0x0540+(16)*/ + /* 1357 = 54d */ {51, 0, 8}, /* 0x0054 => 0x0540+(16)*/ + /* 1358 = 54e */ {51, 0, 8}, /* 0x0054 => 0x0540+(16)*/ + /* 1359 = 54f */ {51, 0, 8}, /* 0x0054 => 0x0540+(16)*/ + /* 1360 = 550 */ {52, 0, 8}, /* 0x0055 => 0x0550+(16)*/ + /* 1361 = 551 */ {52, 0, 8}, /* 0x0055 => 0x0550+(16)*/ + /* 1362 = 552 */ {52, 0, 8}, /* 0x0055 => 0x0550+(16)*/ + /* 1363 = 553 */ {52, 0, 8}, /* 0x0055 => 0x0550+(16)*/ + /* 1364 = 554 */ {52, 0, 8}, /* 0x0055 => 0x0550+(16)*/ + /* 1365 = 555 */ {52, 0, 8}, /* 0x0055 => 0x0550+(16)*/ + /* 1366 = 556 */ {52, 0, 8}, /* 0x0055 => 0x0550+(16)*/ + /* 1367 = 557 */ {52, 0, 8}, /* 0x0055 => 0x0550+(16)*/ + /* 1368 = 558 */ {52, 0, 8}, /* 0x0055 => 0x0550+(16)*/ + /* 1369 = 559 */ {52, 0, 8}, /* 0x0055 => 0x0550+(16)*/ + /* 1370 = 55a */ {52, 0, 8}, /* 0x0055 => 0x0550+(16)*/ + /* 1371 = 55b */ {52, 0, 8}, /* 0x0055 => 0x0550+(16)*/ + /* 1372 = 55c */ {52, 0, 8}, /* 0x0055 => 0x0550+(16)*/ + /* 1373 = 55d */ {52, 0, 8}, /* 0x0055 => 0x0550+(16)*/ + /* 1374 = 55e */ {52, 0, 8}, /* 0x0055 => 0x0550+(16)*/ + /* 1375 = 55f */ {52, 0, 8}, /* 0x0055 => 0x0550+(16)*/ + /* 1376 = 560 */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1377 = 561 */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1378 = 562 */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1379 = 563 */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1380 = 564 */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1381 = 565 */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1382 = 566 */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1383 = 567 */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1384 = 568 */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1385 = 569 */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1386 = 56a */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1387 = 56b */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1388 = 56c */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1389 = 56d */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1390 = 56e */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1391 = 56f */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1392 = 570 */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1393 = 571 */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1394 = 572 */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1395 = 573 */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1396 = 574 */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1397 = 575 */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1398 = 576 */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1399 = 577 */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1400 = 578 */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1401 = 579 */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1402 = 57a */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1403 = 57b */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1404 = 57c */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1405 = 57d */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1406 = 57e */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1407 = 57f */ {25, 0, 7}, /* 0x002b => 0x0560+(32)*/ + /* 1408 = 580 */ {55, 0, 8}, /* 0x0058 => 0x0580+(16)*/ + /* 1409 = 581 */ {55, 0, 8}, /* 0x0058 => 0x0580+(16)*/ + /* 1410 = 582 */ {55, 0, 8}, /* 0x0058 => 0x0580+(16)*/ + /* 1411 = 583 */ {55, 0, 8}, /* 0x0058 => 0x0580+(16)*/ + /* 1412 = 584 */ {55, 0, 8}, /* 0x0058 => 0x0580+(16)*/ + /* 1413 = 585 */ {55, 0, 8}, /* 0x0058 => 0x0580+(16)*/ + /* 1414 = 586 */ {55, 0, 8}, /* 0x0058 => 0x0580+(16)*/ + /* 1415 = 587 */ {55, 0, 8}, /* 0x0058 => 0x0580+(16)*/ + /* 1416 = 588 */ {55, 0, 8}, /* 0x0058 => 0x0580+(16)*/ + /* 1417 = 589 */ {55, 0, 8}, /* 0x0058 => 0x0580+(16)*/ + /* 1418 = 58a */ {55, 0, 8}, /* 0x0058 => 0x0580+(16)*/ + /* 1419 = 58b */ {55, 0, 8}, /* 0x0058 => 0x0580+(16)*/ + /* 1420 = 58c */ {55, 0, 8}, /* 0x0058 => 0x0580+(16)*/ + /* 1421 = 58d */ {55, 0, 8}, /* 0x0058 => 0x0580+(16)*/ + /* 1422 = 58e */ {55, 0, 8}, /* 0x0058 => 0x0580+(16)*/ + /* 1423 = 58f */ {55, 0, 8}, /* 0x0058 => 0x0580+(16)*/ + /* 1424 = 590 */ {56, 0, 8}, /* 0x0059 => 0x0590+(16)*/ + /* 1425 = 591 */ {56, 0, 8}, /* 0x0059 => 0x0590+(16)*/ + /* 1426 = 592 */ {56, 0, 8}, /* 0x0059 => 0x0590+(16)*/ + /* 1427 = 593 */ {56, 0, 8}, /* 0x0059 => 0x0590+(16)*/ + /* 1428 = 594 */ {56, 0, 8}, /* 0x0059 => 0x0590+(16)*/ + /* 1429 = 595 */ {56, 0, 8}, /* 0x0059 => 0x0590+(16)*/ + /* 1430 = 596 */ {56, 0, 8}, /* 0x0059 => 0x0590+(16)*/ + /* 1431 = 597 */ {56, 0, 8}, /* 0x0059 => 0x0590+(16)*/ + /* 1432 = 598 */ {56, 0, 8}, /* 0x0059 => 0x0590+(16)*/ + /* 1433 = 599 */ {56, 0, 8}, /* 0x0059 => 0x0590+(16)*/ + /* 1434 = 59a */ {56, 0, 8}, /* 0x0059 => 0x0590+(16)*/ + /* 1435 = 59b */ {56, 0, 8}, /* 0x0059 => 0x0590+(16)*/ + /* 1436 = 59c */ {56, 0, 8}, /* 0x0059 => 0x0590+(16)*/ + /* 1437 = 59d */ {56, 0, 8}, /* 0x0059 => 0x0590+(16)*/ + /* 1438 = 59e */ {56, 0, 8}, /* 0x0059 => 0x0590+(16)*/ + /* 1439 = 59f */ {56, 0, 8}, /* 0x0059 => 0x0590+(16)*/ + /* 1440 = 5a0 */ {57, 0, 8}, /* 0x005a => 0x05a0+(16)*/ + /* 1441 = 5a1 */ {57, 0, 8}, /* 0x005a => 0x05a0+(16)*/ + /* 1442 = 5a2 */ {57, 0, 8}, /* 0x005a => 0x05a0+(16)*/ + /* 1443 = 5a3 */ {57, 0, 8}, /* 0x005a => 0x05a0+(16)*/ + /* 1444 = 5a4 */ {57, 0, 8}, /* 0x005a => 0x05a0+(16)*/ + /* 1445 = 5a5 */ {57, 0, 8}, /* 0x005a => 0x05a0+(16)*/ + /* 1446 = 5a6 */ {57, 0, 8}, /* 0x005a => 0x05a0+(16)*/ + /* 1447 = 5a7 */ {57, 0, 8}, /* 0x005a => 0x05a0+(16)*/ + /* 1448 = 5a8 */ {57, 0, 8}, /* 0x005a => 0x05a0+(16)*/ + /* 1449 = 5a9 */ {57, 0, 8}, /* 0x005a => 0x05a0+(16)*/ + /* 1450 = 5aa */ {57, 0, 8}, /* 0x005a => 0x05a0+(16)*/ + /* 1451 = 5ab */ {57, 0, 8}, /* 0x005a => 0x05a0+(16)*/ + /* 1452 = 5ac */ {57, 0, 8}, /* 0x005a => 0x05a0+(16)*/ + /* 1453 = 5ad */ {57, 0, 8}, /* 0x005a => 0x05a0+(16)*/ + /* 1454 = 5ae */ {57, 0, 8}, /* 0x005a => 0x05a0+(16)*/ + /* 1455 = 5af */ {57, 0, 8}, /* 0x005a => 0x05a0+(16)*/ + /* 1456 = 5b0 */ {58, 0, 8}, /* 0x005b => 0x05b0+(16)*/ + /* 1457 = 5b1 */ {58, 0, 8}, /* 0x005b => 0x05b0+(16)*/ + /* 1458 = 5b2 */ {58, 0, 8}, /* 0x005b => 0x05b0+(16)*/ + /* 1459 = 5b3 */ {58, 0, 8}, /* 0x005b => 0x05b0+(16)*/ + /* 1460 = 5b4 */ {58, 0, 8}, /* 0x005b => 0x05b0+(16)*/ + /* 1461 = 5b5 */ {58, 0, 8}, /* 0x005b => 0x05b0+(16)*/ + /* 1462 = 5b6 */ {58, 0, 8}, /* 0x005b => 0x05b0+(16)*/ + /* 1463 = 5b7 */ {58, 0, 8}, /* 0x005b => 0x05b0+(16)*/ + /* 1464 = 5b8 */ {58, 0, 8}, /* 0x005b => 0x05b0+(16)*/ + /* 1465 = 5b9 */ {58, 0, 8}, /* 0x005b => 0x05b0+(16)*/ + /* 1466 = 5ba */ {58, 0, 8}, /* 0x005b => 0x05b0+(16)*/ + /* 1467 = 5bb */ {58, 0, 8}, /* 0x005b => 0x05b0+(16)*/ + /* 1468 = 5bc */ {58, 0, 8}, /* 0x005b => 0x05b0+(16)*/ + /* 1469 = 5bd */ {58, 0, 8}, /* 0x005b => 0x05b0+(16)*/ + /* 1470 = 5be */ {58, 0, 8}, /* 0x005b => 0x05b0+(16)*/ + /* 1471 = 5bf */ {58, 0, 8}, /* 0x005b => 0x05b0+(16)*/ + /* 1472 = 5c0 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1473 = 5c1 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1474 = 5c2 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1475 = 5c3 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1476 = 5c4 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1477 = 5c5 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1478 = 5c6 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1479 = 5c7 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1480 = 5c8 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1481 = 5c9 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1482 = 5ca */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1483 = 5cb */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1484 = 5cc */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1485 = 5cd */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1486 = 5ce */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1487 = 5cf */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1488 = 5d0 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1489 = 5d1 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1490 = 5d2 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1491 = 5d3 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1492 = 5d4 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1493 = 5d5 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1494 = 5d6 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1495 = 5d7 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1496 = 5d8 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1497 = 5d9 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1498 = 5da */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1499 = 5db */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1500 = 5dc */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1501 = 5dd */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1502 = 5de */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1503 = 5df */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1504 = 5e0 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1505 = 5e1 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1506 = 5e2 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1507 = 5e3 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1508 = 5e4 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1509 = 5e5 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1510 = 5e6 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1511 = 5e7 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1512 = 5e8 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1513 = 5e9 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1514 = 5ea */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1515 = 5eb */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1516 = 5ec */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1517 = 5ed */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1518 = 5ee */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1519 = 5ef */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1520 = 5f0 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1521 = 5f1 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1522 = 5f2 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1523 = 5f3 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1524 = 5f4 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1525 = 5f5 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1526 = 5f6 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1527 = 5f7 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1528 = 5f8 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1529 = 5f9 */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1530 = 5fa */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1531 = 5fb */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1532 = 5fc */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1533 = 5fd */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1534 = 5fe */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1535 = 5ff */ {192, 1, 6}, /* 0x0017 => 0x05c0+(64)*/ + /* 1536 = 600 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1537 = 601 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1538 = 602 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1539 = 603 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1540 = 604 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1541 = 605 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1542 = 606 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1543 = 607 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1544 = 608 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1545 = 609 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1546 = 60a */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1547 = 60b */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1548 = 60c */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1549 = 60d */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1550 = 60e */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1551 = 60f */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1552 = 610 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1553 = 611 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1554 = 612 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1555 = 613 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1556 = 614 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1557 = 615 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1558 = 616 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1559 = 617 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1560 = 618 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1561 = 619 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1562 = 61a */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1563 = 61b */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1564 = 61c */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1565 = 61d */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1566 = 61e */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1567 = 61f */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1568 = 620 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1569 = 621 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1570 = 622 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1571 = 623 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1572 = 624 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1573 = 625 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1574 = 626 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1575 = 627 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1576 = 628 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1577 = 629 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1578 = 62a */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1579 = 62b */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1580 = 62c */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1581 = 62d */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1582 = 62e */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1583 = 62f */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1584 = 630 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1585 = 631 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1586 = 632 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1587 = 633 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1588 = 634 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1589 = 635 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1590 = 636 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1591 = 637 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1592 = 638 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1593 = 639 */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1594 = 63a */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1595 = 63b */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1596 = 63c */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1597 = 63d */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1598 = 63e */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1599 = 63f */ {1664, 1, 6}, /* 0x0018 => 0x0600+(64)*/ + /* 1600 = 640 */ {448, 1, 8}, /* 0x0064 => 0x0640+(16)*/ + /* 1601 = 641 */ {448, 1, 8}, /* 0x0064 => 0x0640+(16)*/ + /* 1602 = 642 */ {448, 1, 8}, /* 0x0064 => 0x0640+(16)*/ + /* 1603 = 643 */ {448, 1, 8}, /* 0x0064 => 0x0640+(16)*/ + /* 1604 = 644 */ {448, 1, 8}, /* 0x0064 => 0x0640+(16)*/ + /* 1605 = 645 */ {448, 1, 8}, /* 0x0064 => 0x0640+(16)*/ + /* 1606 = 646 */ {448, 1, 8}, /* 0x0064 => 0x0640+(16)*/ + /* 1607 = 647 */ {448, 1, 8}, /* 0x0064 => 0x0640+(16)*/ + /* 1608 = 648 */ {448, 1, 8}, /* 0x0064 => 0x0640+(16)*/ + /* 1609 = 649 */ {448, 1, 8}, /* 0x0064 => 0x0640+(16)*/ + /* 1610 = 64a */ {448, 1, 8}, /* 0x0064 => 0x0640+(16)*/ + /* 1611 = 64b */ {448, 1, 8}, /* 0x0064 => 0x0640+(16)*/ + /* 1612 = 64c */ {448, 1, 8}, /* 0x0064 => 0x0640+(16)*/ + /* 1613 = 64d */ {448, 1, 8}, /* 0x0064 => 0x0640+(16)*/ + /* 1614 = 64e */ {448, 1, 8}, /* 0x0064 => 0x0640+(16)*/ + /* 1615 = 64f */ {448, 1, 8}, /* 0x0064 => 0x0640+(16)*/ + /* 1616 = 650 */ {512, 1, 8}, /* 0x0065 => 0x0650+(16)*/ + /* 1617 = 651 */ {512, 1, 8}, /* 0x0065 => 0x0650+(16)*/ + /* 1618 = 652 */ {512, 1, 8}, /* 0x0065 => 0x0650+(16)*/ + /* 1619 = 653 */ {512, 1, 8}, /* 0x0065 => 0x0650+(16)*/ + /* 1620 = 654 */ {512, 1, 8}, /* 0x0065 => 0x0650+(16)*/ + /* 1621 = 655 */ {512, 1, 8}, /* 0x0065 => 0x0650+(16)*/ + /* 1622 = 656 */ {512, 1, 8}, /* 0x0065 => 0x0650+(16)*/ + /* 1623 = 657 */ {512, 1, 8}, /* 0x0065 => 0x0650+(16)*/ + /* 1624 = 658 */ {512, 1, 8}, /* 0x0065 => 0x0650+(16)*/ + /* 1625 = 659 */ {512, 1, 8}, /* 0x0065 => 0x0650+(16)*/ + /* 1626 = 65a */ {512, 1, 8}, /* 0x0065 => 0x0650+(16)*/ + /* 1627 = 65b */ {512, 1, 8}, /* 0x0065 => 0x0650+(16)*/ + /* 1628 = 65c */ {512, 1, 8}, /* 0x0065 => 0x0650+(16)*/ + /* 1629 = 65d */ {512, 1, 8}, /* 0x0065 => 0x0650+(16)*/ + /* 1630 = 65e */ {512, 1, 8}, /* 0x0065 => 0x0650+(16)*/ + /* 1631 = 65f */ {512, 1, 8}, /* 0x0065 => 0x0650+(16)*/ + /* 1632 = 660 */ {704, 1, 9}, /* 0x00cc => 0x0660+(8)*/ + /* 1633 = 661 */ {704, 1, 9}, /* 0x00cc => 0x0660+(8)*/ + /* 1634 = 662 */ {704, 1, 9}, /* 0x00cc => 0x0660+(8)*/ + /* 1635 = 663 */ {704, 1, 9}, /* 0x00cc => 0x0660+(8)*/ + /* 1636 = 664 */ {704, 1, 9}, /* 0x00cc => 0x0660+(8)*/ + /* 1637 = 665 */ {704, 1, 9}, /* 0x00cc => 0x0660+(8)*/ + /* 1638 = 666 */ {704, 1, 9}, /* 0x00cc => 0x0660+(8)*/ + /* 1639 = 667 */ {704, 1, 9}, /* 0x00cc => 0x0660+(8)*/ + /* 1640 = 668 */ {768, 1, 9}, /* 0x00cd => 0x0668+(8)*/ + /* 1641 = 669 */ {768, 1, 9}, /* 0x00cd => 0x0668+(8)*/ + /* 1642 = 66a */ {768, 1, 9}, /* 0x00cd => 0x0668+(8)*/ + /* 1643 = 66b */ {768, 1, 9}, /* 0x00cd => 0x0668+(8)*/ + /* 1644 = 66c */ {768, 1, 9}, /* 0x00cd => 0x0668+(8)*/ + /* 1645 = 66d */ {768, 1, 9}, /* 0x00cd => 0x0668+(8)*/ + /* 1646 = 66e */ {768, 1, 9}, /* 0x00cd => 0x0668+(8)*/ + /* 1647 = 66f */ {768, 1, 9}, /* 0x00cd => 0x0668+(8)*/ + /* 1648 = 670 */ {640, 1, 8}, /* 0x0067 => 0x0670+(16)*/ + /* 1649 = 671 */ {640, 1, 8}, /* 0x0067 => 0x0670+(16)*/ + /* 1650 = 672 */ {640, 1, 8}, /* 0x0067 => 0x0670+(16)*/ + /* 1651 = 673 */ {640, 1, 8}, /* 0x0067 => 0x0670+(16)*/ + /* 1652 = 674 */ {640, 1, 8}, /* 0x0067 => 0x0670+(16)*/ + /* 1653 = 675 */ {640, 1, 8}, /* 0x0067 => 0x0670+(16)*/ + /* 1654 = 676 */ {640, 1, 8}, /* 0x0067 => 0x0670+(16)*/ + /* 1655 = 677 */ {640, 1, 8}, /* 0x0067 => 0x0670+(16)*/ + /* 1656 = 678 */ {640, 1, 8}, /* 0x0067 => 0x0670+(16)*/ + /* 1657 = 679 */ {640, 1, 8}, /* 0x0067 => 0x0670+(16)*/ + /* 1658 = 67a */ {640, 1, 8}, /* 0x0067 => 0x0670+(16)*/ + /* 1659 = 67b */ {640, 1, 8}, /* 0x0067 => 0x0670+(16)*/ + /* 1660 = 67c */ {640, 1, 8}, /* 0x0067 => 0x0670+(16)*/ + /* 1661 = 67d */ {640, 1, 8}, /* 0x0067 => 0x0670+(16)*/ + /* 1662 = 67e */ {640, 1, 8}, /* 0x0067 => 0x0670+(16)*/ + /* 1663 = 67f */ {640, 1, 8}, /* 0x0067 => 0x0670+(16)*/ + /* 1664 = 680 */ {576, 1, 8}, /* 0x0068 => 0x0680+(16)*/ + /* 1665 = 681 */ {576, 1, 8}, /* 0x0068 => 0x0680+(16)*/ + /* 1666 = 682 */ {576, 1, 8}, /* 0x0068 => 0x0680+(16)*/ + /* 1667 = 683 */ {576, 1, 8}, /* 0x0068 => 0x0680+(16)*/ + /* 1668 = 684 */ {576, 1, 8}, /* 0x0068 => 0x0680+(16)*/ + /* 1669 = 685 */ {576, 1, 8}, /* 0x0068 => 0x0680+(16)*/ + /* 1670 = 686 */ {576, 1, 8}, /* 0x0068 => 0x0680+(16)*/ + /* 1671 = 687 */ {576, 1, 8}, /* 0x0068 => 0x0680+(16)*/ + /* 1672 = 688 */ {576, 1, 8}, /* 0x0068 => 0x0680+(16)*/ + /* 1673 = 689 */ {576, 1, 8}, /* 0x0068 => 0x0680+(16)*/ + /* 1674 = 68a */ {576, 1, 8}, /* 0x0068 => 0x0680+(16)*/ + /* 1675 = 68b */ {576, 1, 8}, /* 0x0068 => 0x0680+(16)*/ + /* 1676 = 68c */ {576, 1, 8}, /* 0x0068 => 0x0680+(16)*/ + /* 1677 = 68d */ {576, 1, 8}, /* 0x0068 => 0x0680+(16)*/ + /* 1678 = 68e */ {576, 1, 8}, /* 0x0068 => 0x0680+(16)*/ + /* 1679 = 68f */ {576, 1, 8}, /* 0x0068 => 0x0680+(16)*/ + /* 1680 = 690 */ {832, 1, 9}, /* 0x00d2 => 0x0690+(8)*/ + /* 1681 = 691 */ {832, 1, 9}, /* 0x00d2 => 0x0690+(8)*/ + /* 1682 = 692 */ {832, 1, 9}, /* 0x00d2 => 0x0690+(8)*/ + /* 1683 = 693 */ {832, 1, 9}, /* 0x00d2 => 0x0690+(8)*/ + /* 1684 = 694 */ {832, 1, 9}, /* 0x00d2 => 0x0690+(8)*/ + /* 1685 = 695 */ {832, 1, 9}, /* 0x00d2 => 0x0690+(8)*/ + /* 1686 = 696 */ {832, 1, 9}, /* 0x00d2 => 0x0690+(8)*/ + /* 1687 = 697 */ {832, 1, 9}, /* 0x00d2 => 0x0690+(8)*/ + /* 1688 = 698 */ {896, 1, 9}, /* 0x00d3 => 0x0698+(8)*/ + /* 1689 = 699 */ {896, 1, 9}, /* 0x00d3 => 0x0698+(8)*/ + /* 1690 = 69a */ {896, 1, 9}, /* 0x00d3 => 0x0698+(8)*/ + /* 1691 = 69b */ {896, 1, 9}, /* 0x00d3 => 0x0698+(8)*/ + /* 1692 = 69c */ {896, 1, 9}, /* 0x00d3 => 0x0698+(8)*/ + /* 1693 = 69d */ {896, 1, 9}, /* 0x00d3 => 0x0698+(8)*/ + /* 1694 = 69e */ {896, 1, 9}, /* 0x00d3 => 0x0698+(8)*/ + /* 1695 = 69f */ {896, 1, 9}, /* 0x00d3 => 0x0698+(8)*/ + /* 1696 = 6a0 */ {960, 1, 9}, /* 0x00d4 => 0x06a0+(8)*/ + /* 1697 = 6a1 */ {960, 1, 9}, /* 0x00d4 => 0x06a0+(8)*/ + /* 1698 = 6a2 */ {960, 1, 9}, /* 0x00d4 => 0x06a0+(8)*/ + /* 1699 = 6a3 */ {960, 1, 9}, /* 0x00d4 => 0x06a0+(8)*/ + /* 1700 = 6a4 */ {960, 1, 9}, /* 0x00d4 => 0x06a0+(8)*/ + /* 1701 = 6a5 */ {960, 1, 9}, /* 0x00d4 => 0x06a0+(8)*/ + /* 1702 = 6a6 */ {960, 1, 9}, /* 0x00d4 => 0x06a0+(8)*/ + /* 1703 = 6a7 */ {960, 1, 9}, /* 0x00d4 => 0x06a0+(8)*/ + /* 1704 = 6a8 */ {1024, 1, 9}, /* 0x00d5 => 0x06a8+(8)*/ + /* 1705 = 6a9 */ {1024, 1, 9}, /* 0x00d5 => 0x06a8+(8)*/ + /* 1706 = 6aa */ {1024, 1, 9}, /* 0x00d5 => 0x06a8+(8)*/ + /* 1707 = 6ab */ {1024, 1, 9}, /* 0x00d5 => 0x06a8+(8)*/ + /* 1708 = 6ac */ {1024, 1, 9}, /* 0x00d5 => 0x06a8+(8)*/ + /* 1709 = 6ad */ {1024, 1, 9}, /* 0x00d5 => 0x06a8+(8)*/ + /* 1710 = 6ae */ {1024, 1, 9}, /* 0x00d5 => 0x06a8+(8)*/ + /* 1711 = 6af */ {1024, 1, 9}, /* 0x00d5 => 0x06a8+(8)*/ + /* 1712 = 6b0 */ {1088, 1, 9}, /* 0x00d6 => 0x06b0+(8)*/ + /* 1713 = 6b1 */ {1088, 1, 9}, /* 0x00d6 => 0x06b0+(8)*/ + /* 1714 = 6b2 */ {1088, 1, 9}, /* 0x00d6 => 0x06b0+(8)*/ + /* 1715 = 6b3 */ {1088, 1, 9}, /* 0x00d6 => 0x06b0+(8)*/ + /* 1716 = 6b4 */ {1088, 1, 9}, /* 0x00d6 => 0x06b0+(8)*/ + /* 1717 = 6b5 */ {1088, 1, 9}, /* 0x00d6 => 0x06b0+(8)*/ + /* 1718 = 6b6 */ {1088, 1, 9}, /* 0x00d6 => 0x06b0+(8)*/ + /* 1719 = 6b7 */ {1088, 1, 9}, /* 0x00d6 => 0x06b0+(8)*/ + /* 1720 = 6b8 */ {1152, 1, 9}, /* 0x00d7 => 0x06b8+(8)*/ + /* 1721 = 6b9 */ {1152, 1, 9}, /* 0x00d7 => 0x06b8+(8)*/ + /* 1722 = 6ba */ {1152, 1, 9}, /* 0x00d7 => 0x06b8+(8)*/ + /* 1723 = 6bb */ {1152, 1, 9}, /* 0x00d7 => 0x06b8+(8)*/ + /* 1724 = 6bc */ {1152, 1, 9}, /* 0x00d7 => 0x06b8+(8)*/ + /* 1725 = 6bd */ {1152, 1, 9}, /* 0x00d7 => 0x06b8+(8)*/ + /* 1726 = 6be */ {1152, 1, 9}, /* 0x00d7 => 0x06b8+(8)*/ + /* 1727 = 6bf */ {1152, 1, 9}, /* 0x00d7 => 0x06b8+(8)*/ + /* 1728 = 6c0 */ {1216, 1, 9}, /* 0x00d8 => 0x06c0+(8)*/ + /* 1729 = 6c1 */ {1216, 1, 9}, /* 0x00d8 => 0x06c0+(8)*/ + /* 1730 = 6c2 */ {1216, 1, 9}, /* 0x00d8 => 0x06c0+(8)*/ + /* 1731 = 6c3 */ {1216, 1, 9}, /* 0x00d8 => 0x06c0+(8)*/ + /* 1732 = 6c4 */ {1216, 1, 9}, /* 0x00d8 => 0x06c0+(8)*/ + /* 1733 = 6c5 */ {1216, 1, 9}, /* 0x00d8 => 0x06c0+(8)*/ + /* 1734 = 6c6 */ {1216, 1, 9}, /* 0x00d8 => 0x06c0+(8)*/ + /* 1735 = 6c7 */ {1216, 1, 9}, /* 0x00d8 => 0x06c0+(8)*/ + /* 1736 = 6c8 */ {1280, 1, 9}, /* 0x00d9 => 0x06c8+(8)*/ + /* 1737 = 6c9 */ {1280, 1, 9}, /* 0x00d9 => 0x06c8+(8)*/ + /* 1738 = 6ca */ {1280, 1, 9}, /* 0x00d9 => 0x06c8+(8)*/ + /* 1739 = 6cb */ {1280, 1, 9}, /* 0x00d9 => 0x06c8+(8)*/ + /* 1740 = 6cc */ {1280, 1, 9}, /* 0x00d9 => 0x06c8+(8)*/ + /* 1741 = 6cd */ {1280, 1, 9}, /* 0x00d9 => 0x06c8+(8)*/ + /* 1742 = 6ce */ {1280, 1, 9}, /* 0x00d9 => 0x06c8+(8)*/ + /* 1743 = 6cf */ {1280, 1, 9}, /* 0x00d9 => 0x06c8+(8)*/ + /* 1744 = 6d0 */ {1344, 1, 9}, /* 0x00da => 0x06d0+(8)*/ + /* 1745 = 6d1 */ {1344, 1, 9}, /* 0x00da => 0x06d0+(8)*/ + /* 1746 = 6d2 */ {1344, 1, 9}, /* 0x00da => 0x06d0+(8)*/ + /* 1747 = 6d3 */ {1344, 1, 9}, /* 0x00da => 0x06d0+(8)*/ + /* 1748 = 6d4 */ {1344, 1, 9}, /* 0x00da => 0x06d0+(8)*/ + /* 1749 = 6d5 */ {1344, 1, 9}, /* 0x00da => 0x06d0+(8)*/ + /* 1750 = 6d6 */ {1344, 1, 9}, /* 0x00da => 0x06d0+(8)*/ + /* 1751 = 6d7 */ {1344, 1, 9}, /* 0x00da => 0x06d0+(8)*/ + /* 1752 = 6d8 */ {1408, 1, 9}, /* 0x00db => 0x06d8+(8)*/ + /* 1753 = 6d9 */ {1408, 1, 9}, /* 0x00db => 0x06d8+(8)*/ + /* 1754 = 6da */ {1408, 1, 9}, /* 0x00db => 0x06d8+(8)*/ + /* 1755 = 6db */ {1408, 1, 9}, /* 0x00db => 0x06d8+(8)*/ + /* 1756 = 6dc */ {1408, 1, 9}, /* 0x00db => 0x06d8+(8)*/ + /* 1757 = 6dd */ {1408, 1, 9}, /* 0x00db => 0x06d8+(8)*/ + /* 1758 = 6de */ {1408, 1, 9}, /* 0x00db => 0x06d8+(8)*/ + /* 1759 = 6df */ {1408, 1, 9}, /* 0x00db => 0x06d8+(8)*/ + /* 1760 = 6e0 */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1761 = 6e1 */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1762 = 6e2 */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1763 = 6e3 */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1764 = 6e4 */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1765 = 6e5 */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1766 = 6e6 */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1767 = 6e7 */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1768 = 6e8 */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1769 = 6e9 */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1770 = 6ea */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1771 = 6eb */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1772 = 6ec */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1773 = 6ed */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1774 = 6ee */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1775 = 6ef */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1776 = 6f0 */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1777 = 6f1 */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1778 = 6f2 */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1779 = 6f3 */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1780 = 6f4 */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1781 = 6f5 */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1782 = 6f6 */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1783 = 6f7 */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1784 = 6f8 */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1785 = 6f9 */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1786 = 6fa */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1787 = 6fb */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1788 = 6fc */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1789 = 6fd */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1790 = 6fe */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1791 = 6ff */ {256, 1, 7}, /* 0x0037 => 0x06e0+(32)*/ + /* 1792 = 700 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1793 = 701 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1794 = 702 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1795 = 703 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1796 = 704 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1797 = 705 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1798 = 706 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1799 = 707 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1800 = 708 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1801 = 709 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1802 = 70a */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1803 = 70b */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1804 = 70c */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1805 = 70d */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1806 = 70e */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1807 = 70f */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1808 = 710 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1809 = 711 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1810 = 712 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1811 = 713 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1812 = 714 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1813 = 715 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1814 = 716 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1815 = 717 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1816 = 718 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1817 = 719 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1818 = 71a */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1819 = 71b */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1820 = 71c */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1821 = 71d */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1822 = 71e */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1823 = 71f */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1824 = 720 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1825 = 721 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1826 = 722 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1827 = 723 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1828 = 724 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1829 = 725 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1830 = 726 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1831 = 727 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1832 = 728 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1833 = 729 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1834 = 72a */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1835 = 72b */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1836 = 72c */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1837 = 72d */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1838 = 72e */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1839 = 72f */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1840 = 730 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1841 = 731 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1842 = 732 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1843 = 733 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1844 = 734 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1845 = 735 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1846 = 736 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1847 = 737 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1848 = 738 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1849 = 739 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1850 = 73a */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1851 = 73b */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1852 = 73c */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1853 = 73d */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1854 = 73e */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1855 = 73f */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1856 = 740 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1857 = 741 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1858 = 742 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1859 = 743 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1860 = 744 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1861 = 745 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1862 = 746 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1863 = 747 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1864 = 748 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1865 = 749 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1866 = 74a */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1867 = 74b */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1868 = 74c */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1869 = 74d */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1870 = 74e */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1871 = 74f */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1872 = 750 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1873 = 751 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1874 = 752 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1875 = 753 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1876 = 754 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1877 = 755 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1878 = 756 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1879 = 757 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1880 = 758 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1881 = 759 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1882 = 75a */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1883 = 75b */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1884 = 75c */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1885 = 75d */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1886 = 75e */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1887 = 75f */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1888 = 760 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1889 = 761 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1890 = 762 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1891 = 763 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1892 = 764 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1893 = 765 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1894 = 766 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1895 = 767 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1896 = 768 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1897 = 769 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1898 = 76a */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1899 = 76b */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1900 = 76c */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1901 = 76d */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1902 = 76e */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1903 = 76f */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1904 = 770 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1905 = 771 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1906 = 772 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1907 = 773 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1908 = 774 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1909 = 775 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1910 = 776 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1911 = 777 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1912 = 778 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1913 = 779 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1914 = 77a */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1915 = 77b */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1916 = 77c */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1917 = 77d */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1918 = 77e */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1919 = 77f */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1920 = 780 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1921 = 781 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1922 = 782 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1923 = 783 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1924 = 784 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1925 = 785 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1926 = 786 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1927 = 787 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1928 = 788 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1929 = 789 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1930 = 78a */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1931 = 78b */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1932 = 78c */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1933 = 78d */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1934 = 78e */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1935 = 78f */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1936 = 790 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1937 = 791 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1938 = 792 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1939 = 793 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1940 = 794 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1941 = 795 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1942 = 796 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1943 = 797 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1944 = 798 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1945 = 799 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1946 = 79a */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1947 = 79b */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1948 = 79c */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1949 = 79d */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1950 = 79e */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1951 = 79f */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1952 = 7a0 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1953 = 7a1 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1954 = 7a2 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1955 = 7a3 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1956 = 7a4 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1957 = 7a5 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1958 = 7a6 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1959 = 7a7 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1960 = 7a8 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1961 = 7a9 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1962 = 7aa */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1963 = 7ab */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1964 = 7ac */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1965 = 7ad */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1966 = 7ae */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1967 = 7af */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1968 = 7b0 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1969 = 7b1 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1970 = 7b2 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1971 = 7b3 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1972 = 7b4 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1973 = 7b5 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1974 = 7b6 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1975 = 7b7 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1976 = 7b8 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1977 = 7b9 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1978 = 7ba */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1979 = 7bb */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1980 = 7bc */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1981 = 7bd */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1982 = 7be */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1983 = 7bf */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1984 = 7c0 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1985 = 7c1 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1986 = 7c2 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1987 = 7c3 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1988 = 7c4 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1989 = 7c5 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1990 = 7c6 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1991 = 7c7 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1992 = 7c8 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1993 = 7c9 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1994 = 7ca */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1995 = 7cb */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1996 = 7cc */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1997 = 7cd */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1998 = 7ce */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 1999 = 7cf */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2000 = 7d0 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2001 = 7d1 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2002 = 7d2 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2003 = 7d3 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2004 = 7d4 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2005 = 7d5 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2006 = 7d6 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2007 = 7d7 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2008 = 7d8 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2009 = 7d9 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2010 = 7da */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2011 = 7db */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2012 = 7dc */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2013 = 7dd */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2014 = 7de */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2015 = 7df */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2016 = 7e0 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2017 = 7e1 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2018 = 7e2 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2019 = 7e3 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2020 = 7e4 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2021 = 7e5 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2022 = 7e6 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2023 = 7e7 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2024 = 7e8 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2025 = 7e9 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2026 = 7ea */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2027 = 7eb */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2028 = 7ec */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2029 = 7ed */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2030 = 7ee */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2031 = 7ef */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2032 = 7f0 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2033 = 7f1 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2034 = 7f2 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2035 = 7f3 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2036 = 7f4 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2037 = 7f5 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2038 = 7f6 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2039 = 7f7 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2040 = 7f8 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2041 = 7f9 */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2042 = 7fa */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2043 = 7fb */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2044 = 7fc */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2045 = 7fd */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2046 = 7fe */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2047 = 7ff */ {2, 0, 4}, /* 0x0007 => 0x0700+(256)*/ + /* 2048 = 800 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2049 = 801 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2050 = 802 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2051 = 803 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2052 = 804 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2053 = 805 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2054 = 806 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2055 = 807 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2056 = 808 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2057 = 809 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2058 = 80a */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2059 = 80b */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2060 = 80c */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2061 = 80d */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2062 = 80e */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2063 = 80f */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2064 = 810 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2065 = 811 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2066 = 812 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2067 = 813 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2068 = 814 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2069 = 815 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2070 = 816 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2071 = 817 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2072 = 818 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2073 = 819 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2074 = 81a */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2075 = 81b */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2076 = 81c */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2077 = 81d */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2078 = 81e */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2079 = 81f */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2080 = 820 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2081 = 821 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2082 = 822 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2083 = 823 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2084 = 824 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2085 = 825 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2086 = 826 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2087 = 827 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2088 = 828 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2089 = 829 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2090 = 82a */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2091 = 82b */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2092 = 82c */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2093 = 82d */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2094 = 82e */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2095 = 82f */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2096 = 830 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2097 = 831 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2098 = 832 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2099 = 833 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2100 = 834 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2101 = 835 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2102 = 836 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2103 = 837 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2104 = 838 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2105 = 839 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2106 = 83a */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2107 = 83b */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2108 = 83c */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2109 = 83d */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2110 = 83e */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2111 = 83f */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2112 = 840 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2113 = 841 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2114 = 842 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2115 = 843 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2116 = 844 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2117 = 845 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2118 = 846 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2119 = 847 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2120 = 848 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2121 = 849 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2122 = 84a */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2123 = 84b */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2124 = 84c */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2125 = 84d */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2126 = 84e */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2127 = 84f */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2128 = 850 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2129 = 851 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2130 = 852 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2131 = 853 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2132 = 854 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2133 = 855 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2134 = 856 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2135 = 857 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2136 = 858 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2137 = 859 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2138 = 85a */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2139 = 85b */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2140 = 85c */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2141 = 85d */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2142 = 85e */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2143 = 85f */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2144 = 860 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2145 = 861 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2146 = 862 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2147 = 863 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2148 = 864 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2149 = 865 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2150 = 866 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2151 = 867 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2152 = 868 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2153 = 869 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2154 = 86a */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2155 = 86b */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2156 = 86c */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2157 = 86d */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2158 = 86e */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2159 = 86f */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2160 = 870 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2161 = 871 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2162 = 872 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2163 = 873 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2164 = 874 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2165 = 875 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2166 = 876 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2167 = 877 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2168 = 878 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2169 = 879 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2170 = 87a */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2171 = 87b */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2172 = 87c */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2173 = 87d */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2174 = 87e */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2175 = 87f */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2176 = 880 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2177 = 881 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2178 = 882 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2179 = 883 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2180 = 884 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2181 = 885 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2182 = 886 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2183 = 887 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2184 = 888 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2185 = 889 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2186 = 88a */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2187 = 88b */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2188 = 88c */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2189 = 88d */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2190 = 88e */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2191 = 88f */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2192 = 890 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2193 = 891 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2194 = 892 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2195 = 893 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2196 = 894 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2197 = 895 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2198 = 896 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2199 = 897 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2200 = 898 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2201 = 899 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2202 = 89a */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2203 = 89b */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2204 = 89c */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2205 = 89d */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2206 = 89e */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2207 = 89f */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2208 = 8a0 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2209 = 8a1 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2210 = 8a2 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2211 = 8a3 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2212 = 8a4 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2213 = 8a5 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2214 = 8a6 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2215 = 8a7 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2216 = 8a8 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2217 = 8a9 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2218 = 8aa */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2219 = 8ab */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2220 = 8ac */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2221 = 8ad */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2222 = 8ae */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2223 = 8af */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2224 = 8b0 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2225 = 8b1 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2226 = 8b2 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2227 = 8b3 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2228 = 8b4 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2229 = 8b5 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2230 = 8b6 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2231 = 8b7 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2232 = 8b8 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2233 = 8b9 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2234 = 8ba */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2235 = 8bb */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2236 = 8bc */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2237 = 8bd */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2238 = 8be */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2239 = 8bf */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2240 = 8c0 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2241 = 8c1 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2242 = 8c2 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2243 = 8c3 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2244 = 8c4 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2245 = 8c5 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2246 = 8c6 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2247 = 8c7 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2248 = 8c8 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2249 = 8c9 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2250 = 8ca */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2251 = 8cb */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2252 = 8cc */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2253 = 8cd */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2254 = 8ce */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2255 = 8cf */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2256 = 8d0 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2257 = 8d1 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2258 = 8d2 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2259 = 8d3 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2260 = 8d4 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2261 = 8d5 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2262 = 8d6 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2263 = 8d7 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2264 = 8d8 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2265 = 8d9 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2266 = 8da */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2267 = 8db */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2268 = 8dc */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2269 = 8dd */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2270 = 8de */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2271 = 8df */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2272 = 8e0 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2273 = 8e1 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2274 = 8e2 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2275 = 8e3 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2276 = 8e4 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2277 = 8e5 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2278 = 8e6 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2279 = 8e7 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2280 = 8e8 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2281 = 8e9 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2282 = 8ea */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2283 = 8eb */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2284 = 8ec */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2285 = 8ed */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2286 = 8ee */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2287 = 8ef */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2288 = 8f0 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2289 = 8f1 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2290 = 8f2 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2291 = 8f3 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2292 = 8f4 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2293 = 8f5 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2294 = 8f6 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2295 = 8f7 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2296 = 8f8 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2297 = 8f9 */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2298 = 8fa */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2299 = 8fb */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2300 = 8fc */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2301 = 8fd */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2302 = 8fe */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2303 = 8ff */ {3, 0, 4}, /* 0x0008 => 0x0800+(256)*/ + /* 2304 = 900 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2305 = 901 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2306 = 902 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2307 = 903 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2308 = 904 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2309 = 905 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2310 = 906 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2311 = 907 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2312 = 908 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2313 = 909 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2314 = 90a */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2315 = 90b */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2316 = 90c */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2317 = 90d */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2318 = 90e */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2319 = 90f */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2320 = 910 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2321 = 911 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2322 = 912 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2323 = 913 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2324 = 914 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2325 = 915 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2326 = 916 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2327 = 917 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2328 = 918 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2329 = 919 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2330 = 91a */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2331 = 91b */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2332 = 91c */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2333 = 91d */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2334 = 91e */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2335 = 91f */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2336 = 920 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2337 = 921 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2338 = 922 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2339 = 923 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2340 = 924 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2341 = 925 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2342 = 926 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2343 = 927 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2344 = 928 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2345 = 929 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2346 = 92a */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2347 = 92b */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2348 = 92c */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2349 = 92d */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2350 = 92e */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2351 = 92f */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2352 = 930 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2353 = 931 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2354 = 932 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2355 = 933 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2356 = 934 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2357 = 935 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2358 = 936 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2359 = 937 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2360 = 938 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2361 = 939 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2362 = 93a */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2363 = 93b */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2364 = 93c */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2365 = 93d */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2366 = 93e */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2367 = 93f */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2368 = 940 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2369 = 941 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2370 = 942 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2371 = 943 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2372 = 944 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2373 = 945 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2374 = 946 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2375 = 947 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2376 = 948 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2377 = 949 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2378 = 94a */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2379 = 94b */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2380 = 94c */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2381 = 94d */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2382 = 94e */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2383 = 94f */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2384 = 950 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2385 = 951 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2386 = 952 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2387 = 953 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2388 = 954 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2389 = 955 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2390 = 956 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2391 = 957 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2392 = 958 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2393 = 959 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2394 = 95a */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2395 = 95b */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2396 = 95c */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2397 = 95d */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2398 = 95e */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2399 = 95f */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2400 = 960 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2401 = 961 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2402 = 962 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2403 = 963 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2404 = 964 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2405 = 965 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2406 = 966 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2407 = 967 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2408 = 968 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2409 = 969 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2410 = 96a */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2411 = 96b */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2412 = 96c */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2413 = 96d */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2414 = 96e */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2415 = 96f */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2416 = 970 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2417 = 971 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2418 = 972 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2419 = 973 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2420 = 974 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2421 = 975 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2422 = 976 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2423 = 977 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2424 = 978 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2425 = 979 */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2426 = 97a */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2427 = 97b */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2428 = 97c */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2429 = 97d */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2430 = 97e */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2431 = 97f */ {128, 1, 5}, /* 0x0012 => 0x0900+(128)*/ + /* 2432 = 980 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2433 = 981 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2434 = 982 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2435 = 983 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2436 = 984 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2437 = 985 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2438 = 986 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2439 = 987 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2440 = 988 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2441 = 989 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2442 = 98a */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2443 = 98b */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2444 = 98c */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2445 = 98d */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2446 = 98e */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2447 = 98f */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2448 = 990 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2449 = 991 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2450 = 992 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2451 = 993 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2452 = 994 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2453 = 995 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2454 = 996 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2455 = 997 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2456 = 998 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2457 = 999 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2458 = 99a */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2459 = 99b */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2460 = 99c */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2461 = 99d */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2462 = 99e */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2463 = 99f */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2464 = 9a0 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2465 = 9a1 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2466 = 9a2 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2467 = 9a3 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2468 = 9a4 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2469 = 9a5 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2470 = 9a6 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2471 = 9a7 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2472 = 9a8 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2473 = 9a9 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2474 = 9aa */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2475 = 9ab */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2476 = 9ac */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2477 = 9ad */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2478 = 9ae */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2479 = 9af */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2480 = 9b0 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2481 = 9b1 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2482 = 9b2 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2483 = 9b3 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2484 = 9b4 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2485 = 9b5 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2486 = 9b6 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2487 = 9b7 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2488 = 9b8 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2489 = 9b9 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2490 = 9ba */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2491 = 9bb */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2492 = 9bc */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2493 = 9bd */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2494 = 9be */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2495 = 9bf */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2496 = 9c0 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2497 = 9c1 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2498 = 9c2 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2499 = 9c3 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2500 = 9c4 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2501 = 9c5 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2502 = 9c6 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2503 = 9c7 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2504 = 9c8 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2505 = 9c9 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2506 = 9ca */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2507 = 9cb */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2508 = 9cc */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2509 = 9cd */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2510 = 9ce */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2511 = 9cf */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2512 = 9d0 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2513 = 9d1 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2514 = 9d2 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2515 = 9d3 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2516 = 9d4 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2517 = 9d5 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2518 = 9d6 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2519 = 9d7 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2520 = 9d8 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2521 = 9d9 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2522 = 9da */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2523 = 9db */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2524 = 9dc */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2525 = 9dd */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2526 = 9de */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2527 = 9df */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2528 = 9e0 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2529 = 9e1 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2530 = 9e2 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2531 = 9e3 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2532 = 9e4 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2533 = 9e5 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2534 = 9e6 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2535 = 9e7 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2536 = 9e8 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2537 = 9e9 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2538 = 9ea */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2539 = 9eb */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2540 = 9ec */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2541 = 9ed */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2542 = 9ee */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2543 = 9ef */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2544 = 9f0 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2545 = 9f1 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2546 = 9f2 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2547 = 9f3 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2548 = 9f4 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2549 = 9f5 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2550 = 9f6 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2551 = 9f7 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2552 = 9f8 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2553 = 9f9 */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2554 = 9fa */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2555 = 9fb */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2556 = 9fc */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2557 = 9fd */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2558 = 9fe */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2559 = 9ff */ {8, 0, 5}, /* 0x0013 => 0x0980+(128)*/ + /* 2560 = a00 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2561 = a01 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2562 = a02 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2563 = a03 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2564 = a04 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2565 = a05 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2566 = a06 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2567 = a07 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2568 = a08 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2569 = a09 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2570 = a0a */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2571 = a0b */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2572 = a0c */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2573 = a0d */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2574 = a0e */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2575 = a0f */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2576 = a10 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2577 = a11 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2578 = a12 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2579 = a13 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2580 = a14 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2581 = a15 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2582 = a16 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2583 = a17 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2584 = a18 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2585 = a19 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2586 = a1a */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2587 = a1b */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2588 = a1c */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2589 = a1d */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2590 = a1e */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2591 = a1f */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2592 = a20 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2593 = a21 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2594 = a22 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2595 = a23 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2596 = a24 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2597 = a25 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2598 = a26 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2599 = a27 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2600 = a28 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2601 = a29 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2602 = a2a */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2603 = a2b */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2604 = a2c */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2605 = a2d */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2606 = a2e */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2607 = a2f */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2608 = a30 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2609 = a31 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2610 = a32 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2611 = a33 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2612 = a34 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2613 = a35 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2614 = a36 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2615 = a37 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2616 = a38 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2617 = a39 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2618 = a3a */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2619 = a3b */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2620 = a3c */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2621 = a3d */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2622 = a3e */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2623 = a3f */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2624 = a40 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2625 = a41 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2626 = a42 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2627 = a43 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2628 = a44 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2629 = a45 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2630 = a46 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2631 = a47 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2632 = a48 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2633 = a49 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2634 = a4a */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2635 = a4b */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2636 = a4c */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2637 = a4d */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2638 = a4e */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2639 = a4f */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2640 = a50 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2641 = a51 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2642 = a52 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2643 = a53 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2644 = a54 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2645 = a55 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2646 = a56 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2647 = a57 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2648 = a58 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2649 = a59 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2650 = a5a */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2651 = a5b */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2652 = a5c */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2653 = a5d */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2654 = a5e */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2655 = a5f */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2656 = a60 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2657 = a61 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2658 = a62 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2659 = a63 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2660 = a64 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2661 = a65 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2662 = a66 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2663 = a67 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2664 = a68 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2665 = a69 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2666 = a6a */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2667 = a6b */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2668 = a6c */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2669 = a6d */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2670 = a6e */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2671 = a6f */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2672 = a70 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2673 = a71 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2674 = a72 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2675 = a73 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2676 = a74 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2677 = a75 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2678 = a76 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2679 = a77 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2680 = a78 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2681 = a79 */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2682 = a7a */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2683 = a7b */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2684 = a7c */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2685 = a7d */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2686 = a7e */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2687 = a7f */ {9, 0, 5}, /* 0x0014 => 0x0a00+(128)*/ + /* 2688 = a80 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2689 = a81 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2690 = a82 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2691 = a83 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2692 = a84 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2693 = a85 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2694 = a86 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2695 = a87 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2696 = a88 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2697 = a89 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2698 = a8a */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2699 = a8b */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2700 = a8c */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2701 = a8d */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2702 = a8e */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2703 = a8f */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2704 = a90 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2705 = a91 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2706 = a92 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2707 = a93 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2708 = a94 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2709 = a95 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2710 = a96 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2711 = a97 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2712 = a98 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2713 = a99 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2714 = a9a */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2715 = a9b */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2716 = a9c */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2717 = a9d */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2718 = a9e */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2719 = a9f */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2720 = aa0 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2721 = aa1 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2722 = aa2 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2723 = aa3 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2724 = aa4 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2725 = aa5 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2726 = aa6 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2727 = aa7 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2728 = aa8 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2729 = aa9 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2730 = aaa */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2731 = aab */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2732 = aac */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2733 = aad */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2734 = aae */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2735 = aaf */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2736 = ab0 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2737 = ab1 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2738 = ab2 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2739 = ab3 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2740 = ab4 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2741 = ab5 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2742 = ab6 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2743 = ab7 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2744 = ab8 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2745 = ab9 */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2746 = aba */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2747 = abb */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2748 = abc */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2749 = abd */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2750 = abe */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2751 = abf */ {16, 0, 6}, /* 0x002a => 0x0a80+(64)*/ + /* 2752 = ac0 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2753 = ac1 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2754 = ac2 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2755 = ac3 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2756 = ac4 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2757 = ac5 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2758 = ac6 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2759 = ac7 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2760 = ac8 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2761 = ac9 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2762 = aca */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2763 = acb */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2764 = acc */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2765 = acd */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2766 = ace */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2767 = acf */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2768 = ad0 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2769 = ad1 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2770 = ad2 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2771 = ad3 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2772 = ad4 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2773 = ad5 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2774 = ad6 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2775 = ad7 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2776 = ad8 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2777 = ad9 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2778 = ada */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2779 = adb */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2780 = adc */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2781 = add */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2782 = ade */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2783 = adf */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2784 = ae0 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2785 = ae1 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2786 = ae2 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2787 = ae3 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2788 = ae4 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2789 = ae5 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2790 = ae6 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2791 = ae7 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2792 = ae8 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2793 = ae9 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2794 = aea */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2795 = aeb */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2796 = aec */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2797 = aed */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2798 = aee */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2799 = aef */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2800 = af0 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2801 = af1 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2802 = af2 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2803 = af3 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2804 = af4 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2805 = af5 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2806 = af6 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2807 = af7 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2808 = af8 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2809 = af9 */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2810 = afa */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2811 = afb */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2812 = afc */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2813 = afd */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2814 = afe */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2815 = aff */ {17, 0, 6}, /* 0x002b => 0x0ac0+(64)*/ + /* 2816 = b00 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2817 = b01 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2818 = b02 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2819 = b03 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2820 = b04 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2821 = b05 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2822 = b06 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2823 = b07 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2824 = b08 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2825 = b09 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2826 = b0a */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2827 = b0b */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2828 = b0c */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2829 = b0d */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2830 = b0e */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2831 = b0f */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2832 = b10 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2833 = b11 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2834 = b12 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2835 = b13 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2836 = b14 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2837 = b15 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2838 = b16 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2839 = b17 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2840 = b18 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2841 = b19 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2842 = b1a */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2843 = b1b */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2844 = b1c */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2845 = b1d */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2846 = b1e */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2847 = b1f */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2848 = b20 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2849 = b21 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2850 = b22 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2851 = b23 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2852 = b24 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2853 = b25 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2854 = b26 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2855 = b27 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2856 = b28 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2857 = b29 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2858 = b2a */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2859 = b2b */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2860 = b2c */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2861 = b2d */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2862 = b2e */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2863 = b2f */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2864 = b30 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2865 = b31 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2866 = b32 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2867 = b33 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2868 = b34 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2869 = b35 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2870 = b36 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2871 = b37 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2872 = b38 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2873 = b39 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2874 = b3a */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2875 = b3b */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2876 = b3c */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2877 = b3d */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2878 = b3e */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2879 = b3f */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2880 = b40 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2881 = b41 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2882 = b42 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2883 = b43 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2884 = b44 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2885 = b45 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2886 = b46 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2887 = b47 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2888 = b48 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2889 = b49 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2890 = b4a */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2891 = b4b */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2892 = b4c */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2893 = b4d */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2894 = b4e */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2895 = b4f */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2896 = b50 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2897 = b51 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2898 = b52 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2899 = b53 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2900 = b54 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2901 = b55 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2902 = b56 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2903 = b57 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2904 = b58 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2905 = b59 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2906 = b5a */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2907 = b5b */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2908 = b5c */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2909 = b5d */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2910 = b5e */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2911 = b5f */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2912 = b60 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2913 = b61 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2914 = b62 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2915 = b63 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2916 = b64 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2917 = b65 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2918 = b66 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2919 = b67 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2920 = b68 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2921 = b69 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2922 = b6a */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2923 = b6b */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2924 = b6c */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2925 = b6d */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2926 = b6e */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2927 = b6f */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2928 = b70 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2929 = b71 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2930 = b72 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2931 = b73 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2932 = b74 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2933 = b75 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2934 = b76 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2935 = b77 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2936 = b78 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2937 = b79 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2938 = b7a */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2939 = b7b */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2940 = b7c */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2941 = b7d */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2942 = b7e */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2943 = b7f */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2944 = b80 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2945 = b81 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2946 = b82 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2947 = b83 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2948 = b84 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2949 = b85 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2950 = b86 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2951 = b87 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2952 = b88 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2953 = b89 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2954 = b8a */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2955 = b8b */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2956 = b8c */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2957 = b8d */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2958 = b8e */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2959 = b8f */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2960 = b90 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2961 = b91 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2962 = b92 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2963 = b93 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2964 = b94 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2965 = b95 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2966 = b96 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2967 = b97 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2968 = b98 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2969 = b99 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2970 = b9a */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2971 = b9b */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2972 = b9c */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2973 = b9d */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2974 = b9e */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2975 = b9f */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2976 = ba0 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2977 = ba1 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2978 = ba2 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2979 = ba3 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2980 = ba4 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2981 = ba5 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2982 = ba6 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2983 = ba7 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2984 = ba8 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2985 = ba9 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2986 = baa */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2987 = bab */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2988 = bac */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2989 = bad */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2990 = bae */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2991 = baf */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2992 = bb0 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2993 = bb1 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2994 = bb2 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2995 = bb3 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2996 = bb4 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2997 = bb5 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2998 = bb6 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 2999 = bb7 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3000 = bb8 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3001 = bb9 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3002 = bba */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3003 = bbb */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3004 = bbc */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3005 = bbd */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3006 = bbe */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3007 = bbf */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3008 = bc0 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3009 = bc1 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3010 = bc2 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3011 = bc3 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3012 = bc4 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3013 = bc5 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3014 = bc6 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3015 = bc7 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3016 = bc8 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3017 = bc9 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3018 = bca */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3019 = bcb */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3020 = bcc */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3021 = bcd */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3022 = bce */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3023 = bcf */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3024 = bd0 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3025 = bd1 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3026 = bd2 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3027 = bd3 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3028 = bd4 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3029 = bd5 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3030 = bd6 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3031 = bd7 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3032 = bd8 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3033 = bd9 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3034 = bda */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3035 = bdb */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3036 = bdc */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3037 = bdd */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3038 = bde */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3039 = bdf */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3040 = be0 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3041 = be1 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3042 = be2 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3043 = be3 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3044 = be4 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3045 = be5 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3046 = be6 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3047 = be7 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3048 = be8 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3049 = be9 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3050 = bea */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3051 = beb */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3052 = bec */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3053 = bed */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3054 = bee */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3055 = bef */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3056 = bf0 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3057 = bf1 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3058 = bf2 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3059 = bf3 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3060 = bf4 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3061 = bf5 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3062 = bf6 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3063 = bf7 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3064 = bf8 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3065 = bf9 */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3066 = bfa */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3067 = bfb */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3068 = bfc */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3069 = bfd */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3070 = bfe */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3071 = bff */ {4, 0, 4}, /* 0x000b => 0x0b00+(256)*/ + /* 3072 = c00 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3073 = c01 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3074 = c02 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3075 = c03 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3076 = c04 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3077 = c05 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3078 = c06 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3079 = c07 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3080 = c08 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3081 = c09 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3082 = c0a */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3083 = c0b */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3084 = c0c */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3085 = c0d */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3086 = c0e */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3087 = c0f */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3088 = c10 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3089 = c11 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3090 = c12 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3091 = c13 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3092 = c14 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3093 = c15 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3094 = c16 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3095 = c17 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3096 = c18 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3097 = c19 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3098 = c1a */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3099 = c1b */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3100 = c1c */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3101 = c1d */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3102 = c1e */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3103 = c1f */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3104 = c20 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3105 = c21 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3106 = c22 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3107 = c23 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3108 = c24 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3109 = c25 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3110 = c26 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3111 = c27 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3112 = c28 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3113 = c29 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3114 = c2a */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3115 = c2b */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3116 = c2c */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3117 = c2d */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3118 = c2e */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3119 = c2f */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3120 = c30 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3121 = c31 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3122 = c32 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3123 = c33 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3124 = c34 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3125 = c35 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3126 = c36 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3127 = c37 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3128 = c38 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3129 = c39 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3130 = c3a */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3131 = c3b */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3132 = c3c */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3133 = c3d */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3134 = c3e */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3135 = c3f */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3136 = c40 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3137 = c41 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3138 = c42 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3139 = c43 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3140 = c44 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3141 = c45 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3142 = c46 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3143 = c47 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3144 = c48 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3145 = c49 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3146 = c4a */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3147 = c4b */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3148 = c4c */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3149 = c4d */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3150 = c4e */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3151 = c4f */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3152 = c50 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3153 = c51 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3154 = c52 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3155 = c53 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3156 = c54 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3157 = c55 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3158 = c56 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3159 = c57 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3160 = c58 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3161 = c59 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3162 = c5a */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3163 = c5b */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3164 = c5c */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3165 = c5d */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3166 = c5e */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3167 = c5f */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3168 = c60 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3169 = c61 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3170 = c62 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3171 = c63 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3172 = c64 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3173 = c65 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3174 = c66 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3175 = c67 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3176 = c68 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3177 = c69 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3178 = c6a */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3179 = c6b */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3180 = c6c */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3181 = c6d */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3182 = c6e */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3183 = c6f */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3184 = c70 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3185 = c71 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3186 = c72 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3187 = c73 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3188 = c74 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3189 = c75 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3190 = c76 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3191 = c77 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3192 = c78 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3193 = c79 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3194 = c7a */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3195 = c7b */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3196 = c7c */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3197 = c7d */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3198 = c7e */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3199 = c7f */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3200 = c80 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3201 = c81 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3202 = c82 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3203 = c83 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3204 = c84 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3205 = c85 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3206 = c86 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3207 = c87 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3208 = c88 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3209 = c89 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3210 = c8a */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3211 = c8b */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3212 = c8c */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3213 = c8d */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3214 = c8e */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3215 = c8f */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3216 = c90 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3217 = c91 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3218 = c92 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3219 = c93 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3220 = c94 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3221 = c95 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3222 = c96 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3223 = c97 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3224 = c98 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3225 = c99 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3226 = c9a */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3227 = c9b */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3228 = c9c */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3229 = c9d */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3230 = c9e */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3231 = c9f */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3232 = ca0 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3233 = ca1 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3234 = ca2 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3235 = ca3 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3236 = ca4 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3237 = ca5 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3238 = ca6 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3239 = ca7 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3240 = ca8 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3241 = ca9 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3242 = caa */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3243 = cab */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3244 = cac */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3245 = cad */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3246 = cae */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3247 = caf */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3248 = cb0 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3249 = cb1 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3250 = cb2 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3251 = cb3 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3252 = cb4 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3253 = cb5 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3254 = cb6 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3255 = cb7 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3256 = cb8 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3257 = cb9 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3258 = cba */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3259 = cbb */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3260 = cbc */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3261 = cbd */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3262 = cbe */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3263 = cbf */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3264 = cc0 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3265 = cc1 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3266 = cc2 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3267 = cc3 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3268 = cc4 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3269 = cc5 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3270 = cc6 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3271 = cc7 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3272 = cc8 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3273 = cc9 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3274 = cca */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3275 = ccb */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3276 = ccc */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3277 = ccd */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3278 = cce */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3279 = ccf */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3280 = cd0 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3281 = cd1 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3282 = cd2 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3283 = cd3 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3284 = cd4 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3285 = cd5 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3286 = cd6 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3287 = cd7 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3288 = cd8 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3289 = cd9 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3290 = cda */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3291 = cdb */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3292 = cdc */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3293 = cdd */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3294 = cde */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3295 = cdf */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3296 = ce0 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3297 = ce1 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3298 = ce2 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3299 = ce3 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3300 = ce4 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3301 = ce5 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3302 = ce6 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3303 = ce7 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3304 = ce8 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3305 = ce9 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3306 = cea */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3307 = ceb */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3308 = cec */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3309 = ced */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3310 = cee */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3311 = cef */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3312 = cf0 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3313 = cf1 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3314 = cf2 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3315 = cf3 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3316 = cf4 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3317 = cf5 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3318 = cf6 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3319 = cf7 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3320 = cf8 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3321 = cf9 */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3322 = cfa */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3323 = cfb */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3324 = cfc */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3325 = cfd */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3326 = cfe */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3327 = cff */ {5, 0, 4}, /* 0x000c => 0x0c00+(256)*/ + /* 3328 = d00 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3329 = d01 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3330 = d02 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3331 = d03 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3332 = d04 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3333 = d05 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3334 = d06 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3335 = d07 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3336 = d08 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3337 = d09 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3338 = d0a */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3339 = d0b */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3340 = d0c */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3341 = d0d */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3342 = d0e */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3343 = d0f */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3344 = d10 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3345 = d11 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3346 = d12 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3347 = d13 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3348 = d14 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3349 = d15 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3350 = d16 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3351 = d17 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3352 = d18 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3353 = d19 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3354 = d1a */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3355 = d1b */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3356 = d1c */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3357 = d1d */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3358 = d1e */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3359 = d1f */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3360 = d20 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3361 = d21 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3362 = d22 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3363 = d23 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3364 = d24 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3365 = d25 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3366 = d26 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3367 = d27 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3368 = d28 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3369 = d29 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3370 = d2a */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3371 = d2b */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3372 = d2c */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3373 = d2d */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3374 = d2e */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3375 = d2f */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3376 = d30 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3377 = d31 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3378 = d32 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3379 = d33 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3380 = d34 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3381 = d35 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3382 = d36 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3383 = d37 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3384 = d38 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3385 = d39 */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3386 = d3a */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3387 = d3b */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3388 = d3c */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3389 = d3d */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3390 = d3e */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3391 = d3f */ {14, 0, 6}, /* 0x0034 => 0x0d00+(64)*/ + /* 3392 = d40 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3393 = d41 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3394 = d42 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3395 = d43 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3396 = d44 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3397 = d45 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3398 = d46 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3399 = d47 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3400 = d48 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3401 = d49 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3402 = d4a */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3403 = d4b */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3404 = d4c */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3405 = d4d */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3406 = d4e */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3407 = d4f */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3408 = d50 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3409 = d51 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3410 = d52 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3411 = d53 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3412 = d54 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3413 = d55 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3414 = d56 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3415 = d57 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3416 = d58 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3417 = d59 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3418 = d5a */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3419 = d5b */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3420 = d5c */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3421 = d5d */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3422 = d5e */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3423 = d5f */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3424 = d60 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3425 = d61 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3426 = d62 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3427 = d63 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3428 = d64 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3429 = d65 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3430 = d66 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3431 = d67 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3432 = d68 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3433 = d69 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3434 = d6a */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3435 = d6b */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3436 = d6c */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3437 = d6d */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3438 = d6e */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3439 = d6f */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3440 = d70 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3441 = d71 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3442 = d72 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3443 = d73 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3444 = d74 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3445 = d75 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3446 = d76 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3447 = d77 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3448 = d78 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3449 = d79 */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3450 = d7a */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3451 = d7b */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3452 = d7c */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3453 = d7d */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3454 = d7e */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3455 = d7f */ {15, 0, 6}, /* 0x0035 => 0x0d40+(64)*/ + /* 3456 = d80 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3457 = d81 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3458 = d82 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3459 = d83 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3460 = d84 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3461 = d85 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3462 = d86 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3463 = d87 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3464 = d88 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3465 = d89 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3466 = d8a */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3467 = d8b */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3468 = d8c */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3469 = d8d */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3470 = d8e */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3471 = d8f */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3472 = d90 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3473 = d91 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3474 = d92 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3475 = d93 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3476 = d94 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3477 = d95 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3478 = d96 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3479 = d97 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3480 = d98 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3481 = d99 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3482 = d9a */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3483 = d9b */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3484 = d9c */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3485 = d9d */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3486 = d9e */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3487 = d9f */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3488 = da0 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3489 = da1 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3490 = da2 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3491 = da3 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3492 = da4 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3493 = da5 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3494 = da6 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3495 = da7 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3496 = da8 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3497 = da9 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3498 = daa */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3499 = dab */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3500 = dac */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3501 = dad */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3502 = dae */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3503 = daf */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3504 = db0 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3505 = db1 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3506 = db2 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3507 = db3 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3508 = db4 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3509 = db5 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3510 = db6 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3511 = db7 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3512 = db8 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3513 = db9 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3514 = dba */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3515 = dbb */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3516 = dbc */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3517 = dbd */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3518 = dbe */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3519 = dbf */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3520 = dc0 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3521 = dc1 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3522 = dc2 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3523 = dc3 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3524 = dc4 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3525 = dc5 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3526 = dc6 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3527 = dc7 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3528 = dc8 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3529 = dc9 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3530 = dca */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3531 = dcb */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3532 = dcc */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3533 = dcd */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3534 = dce */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3535 = dcf */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3536 = dd0 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3537 = dd1 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3538 = dd2 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3539 = dd3 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3540 = dd4 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3541 = dd5 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3542 = dd6 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3543 = dd7 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3544 = dd8 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3545 = dd9 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3546 = dda */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3547 = ddb */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3548 = ddc */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3549 = ddd */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3550 = dde */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3551 = ddf */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3552 = de0 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3553 = de1 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3554 = de2 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3555 = de3 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3556 = de4 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3557 = de5 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3558 = de6 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3559 = de7 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3560 = de8 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3561 = de9 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3562 = dea */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3563 = deb */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3564 = dec */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3565 = ded */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3566 = dee */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3567 = def */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3568 = df0 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3569 = df1 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3570 = df2 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3571 = df3 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3572 = df4 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3573 = df5 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3574 = df6 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3575 = df7 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3576 = df8 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3577 = df9 */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3578 = dfa */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3579 = dfb */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3580 = dfc */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3581 = dfd */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3582 = dfe */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3583 = dff */ {64, 1, 5}, /* 0x001b => 0x0d80+(128)*/ + /* 3584 = e00 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3585 = e01 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3586 = e02 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3587 = e03 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3588 = e04 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3589 = e05 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3590 = e06 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3591 = e07 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3592 = e08 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3593 = e09 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3594 = e0a */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3595 = e0b */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3596 = e0c */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3597 = e0d */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3598 = e0e */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3599 = e0f */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3600 = e10 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3601 = e11 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3602 = e12 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3603 = e13 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3604 = e14 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3605 = e15 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3606 = e16 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3607 = e17 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3608 = e18 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3609 = e19 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3610 = e1a */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3611 = e1b */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3612 = e1c */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3613 = e1d */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3614 = e1e */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3615 = e1f */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3616 = e20 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3617 = e21 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3618 = e22 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3619 = e23 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3620 = e24 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3621 = e25 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3622 = e26 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3623 = e27 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3624 = e28 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3625 = e29 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3626 = e2a */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3627 = e2b */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3628 = e2c */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3629 = e2d */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3630 = e2e */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3631 = e2f */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3632 = e30 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3633 = e31 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3634 = e32 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3635 = e33 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3636 = e34 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3637 = e35 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3638 = e36 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3639 = e37 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3640 = e38 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3641 = e39 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3642 = e3a */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3643 = e3b */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3644 = e3c */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3645 = e3d */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3646 = e3e */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3647 = e3f */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3648 = e40 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3649 = e41 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3650 = e42 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3651 = e43 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3652 = e44 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3653 = e45 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3654 = e46 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3655 = e47 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3656 = e48 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3657 = e49 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3658 = e4a */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3659 = e4b */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3660 = e4c */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3661 = e4d */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3662 = e4e */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3663 = e4f */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3664 = e50 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3665 = e51 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3666 = e52 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3667 = e53 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3668 = e54 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3669 = e55 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3670 = e56 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3671 = e57 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3672 = e58 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3673 = e59 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3674 = e5a */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3675 = e5b */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3676 = e5c */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3677 = e5d */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3678 = e5e */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3679 = e5f */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3680 = e60 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3681 = e61 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3682 = e62 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3683 = e63 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3684 = e64 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3685 = e65 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3686 = e66 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3687 = e67 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3688 = e68 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3689 = e69 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3690 = e6a */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3691 = e6b */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3692 = e6c */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3693 = e6d */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3694 = e6e */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3695 = e6f */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3696 = e70 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3697 = e71 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3698 = e72 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3699 = e73 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3700 = e74 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3701 = e75 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3702 = e76 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3703 = e77 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3704 = e78 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3705 = e79 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3706 = e7a */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3707 = e7b */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3708 = e7c */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3709 = e7d */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3710 = e7e */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3711 = e7f */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3712 = e80 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3713 = e81 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3714 = e82 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3715 = e83 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3716 = e84 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3717 = e85 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3718 = e86 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3719 = e87 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3720 = e88 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3721 = e89 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3722 = e8a */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3723 = e8b */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3724 = e8c */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3725 = e8d */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3726 = e8e */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3727 = e8f */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3728 = e90 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3729 = e91 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3730 = e92 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3731 = e93 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3732 = e94 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3733 = e95 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3734 = e96 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3735 = e97 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3736 = e98 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3737 = e99 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3738 = e9a */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3739 = e9b */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3740 = e9c */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3741 = e9d */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3742 = e9e */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3743 = e9f */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3744 = ea0 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3745 = ea1 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3746 = ea2 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3747 = ea3 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3748 = ea4 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3749 = ea5 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3750 = ea6 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3751 = ea7 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3752 = ea8 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3753 = ea9 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3754 = eaa */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3755 = eab */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3756 = eac */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3757 = ead */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3758 = eae */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3759 = eaf */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3760 = eb0 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3761 = eb1 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3762 = eb2 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3763 = eb3 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3764 = eb4 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3765 = eb5 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3766 = eb6 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3767 = eb7 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3768 = eb8 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3769 = eb9 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3770 = eba */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3771 = ebb */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3772 = ebc */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3773 = ebd */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3774 = ebe */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3775 = ebf */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3776 = ec0 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3777 = ec1 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3778 = ec2 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3779 = ec3 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3780 = ec4 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3781 = ec5 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3782 = ec6 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3783 = ec7 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3784 = ec8 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3785 = ec9 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3786 = eca */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3787 = ecb */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3788 = ecc */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3789 = ecd */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3790 = ece */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3791 = ecf */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3792 = ed0 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3793 = ed1 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3794 = ed2 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3795 = ed3 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3796 = ed4 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3797 = ed5 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3798 = ed6 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3799 = ed7 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3800 = ed8 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3801 = ed9 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3802 = eda */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3803 = edb */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3804 = edc */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3805 = edd */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3806 = ede */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3807 = edf */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3808 = ee0 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3809 = ee1 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3810 = ee2 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3811 = ee3 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3812 = ee4 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3813 = ee5 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3814 = ee6 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3815 = ee7 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3816 = ee8 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3817 = ee9 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3818 = eea */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3819 = eeb */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3820 = eec */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3821 = eed */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3822 = eee */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3823 = eef */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3824 = ef0 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3825 = ef1 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3826 = ef2 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3827 = ef3 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3828 = ef4 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3829 = ef5 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3830 = ef6 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3831 = ef7 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3832 = ef8 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3833 = ef9 */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3834 = efa */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3835 = efb */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3836 = efc */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3837 = efd */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3838 = efe */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3839 = eff */ {6, 0, 4}, /* 0x000e => 0x0e00+(256)*/ + /* 3840 = f00 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3841 = f01 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3842 = f02 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3843 = f03 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3844 = f04 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3845 = f05 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3846 = f06 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3847 = f07 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3848 = f08 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3849 = f09 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3850 = f0a */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3851 = f0b */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3852 = f0c */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3853 = f0d */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3854 = f0e */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3855 = f0f */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3856 = f10 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3857 = f11 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3858 = f12 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3859 = f13 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3860 = f14 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3861 = f15 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3862 = f16 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3863 = f17 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3864 = f18 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3865 = f19 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3866 = f1a */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3867 = f1b */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3868 = f1c */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3869 = f1d */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3870 = f1e */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3871 = f1f */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3872 = f20 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3873 = f21 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3874 = f22 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3875 = f23 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3876 = f24 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3877 = f25 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3878 = f26 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3879 = f27 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3880 = f28 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3881 = f29 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3882 = f2a */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3883 = f2b */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3884 = f2c */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3885 = f2d */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3886 = f2e */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3887 = f2f */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3888 = f30 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3889 = f31 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3890 = f32 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3891 = f33 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3892 = f34 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3893 = f35 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3894 = f36 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3895 = f37 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3896 = f38 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3897 = f39 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3898 = f3a */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3899 = f3b */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3900 = f3c */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3901 = f3d */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3902 = f3e */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3903 = f3f */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3904 = f40 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3905 = f41 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3906 = f42 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3907 = f43 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3908 = f44 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3909 = f45 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3910 = f46 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3911 = f47 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3912 = f48 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3913 = f49 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3914 = f4a */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3915 = f4b */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3916 = f4c */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3917 = f4d */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3918 = f4e */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3919 = f4f */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3920 = f50 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3921 = f51 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3922 = f52 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3923 = f53 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3924 = f54 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3925 = f55 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3926 = f56 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3927 = f57 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3928 = f58 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3929 = f59 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3930 = f5a */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3931 = f5b */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3932 = f5c */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3933 = f5d */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3934 = f5e */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3935 = f5f */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3936 = f60 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3937 = f61 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3938 = f62 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3939 = f63 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3940 = f64 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3941 = f65 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3942 = f66 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3943 = f67 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3944 = f68 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3945 = f69 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3946 = f6a */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3947 = f6b */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3948 = f6c */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3949 = f6d */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3950 = f6e */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3951 = f6f */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3952 = f70 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3953 = f71 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3954 = f72 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3955 = f73 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3956 = f74 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3957 = f75 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3958 = f76 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3959 = f77 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3960 = f78 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3961 = f79 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3962 = f7a */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3963 = f7b */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3964 = f7c */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3965 = f7d */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3966 = f7e */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3967 = f7f */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3968 = f80 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3969 = f81 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3970 = f82 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3971 = f83 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3972 = f84 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3973 = f85 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3974 = f86 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3975 = f87 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3976 = f88 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3977 = f89 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3978 = f8a */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3979 = f8b */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3980 = f8c */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3981 = f8d */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3982 = f8e */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3983 = f8f */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3984 = f90 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3985 = f91 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3986 = f92 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3987 = f93 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3988 = f94 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3989 = f95 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3990 = f96 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3991 = f97 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3992 = f98 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3993 = f99 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3994 = f9a */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3995 = f9b */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3996 = f9c */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3997 = f9d */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3998 = f9e */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 3999 = f9f */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4000 = fa0 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4001 = fa1 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4002 = fa2 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4003 = fa3 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4004 = fa4 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4005 = fa5 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4006 = fa6 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4007 = fa7 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4008 = fa8 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4009 = fa9 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4010 = faa */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4011 = fab */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4012 = fac */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4013 = fad */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4014 = fae */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4015 = faf */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4016 = fb0 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4017 = fb1 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4018 = fb2 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4019 = fb3 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4020 = fb4 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4021 = fb5 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4022 = fb6 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4023 = fb7 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4024 = fb8 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4025 = fb9 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4026 = fba */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4027 = fbb */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4028 = fbc */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4029 = fbd */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4030 = fbe */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4031 = fbf */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4032 = fc0 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4033 = fc1 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4034 = fc2 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4035 = fc3 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4036 = fc4 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4037 = fc5 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4038 = fc6 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4039 = fc7 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4040 = fc8 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4041 = fc9 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4042 = fca */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4043 = fcb */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4044 = fcc */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4045 = fcd */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4046 = fce */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4047 = fcf */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4048 = fd0 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4049 = fd1 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4050 = fd2 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4051 = fd3 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4052 = fd4 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4053 = fd5 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4054 = fd6 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4055 = fd7 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4056 = fd8 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4057 = fd9 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4058 = fda */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4059 = fdb */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4060 = fdc */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4061 = fdd */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4062 = fde */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4063 = fdf */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4064 = fe0 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4065 = fe1 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4066 = fe2 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4067 = fe3 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4068 = fe4 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4069 = fe5 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4070 = fe6 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4071 = fe7 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4072 = fe8 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4073 = fe9 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4074 = fea */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4075 = feb */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4076 = fec */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4077 = fed */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4078 = fee */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4079 = fef */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4080 = ff0 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4081 = ff1 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4082 = ff2 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4083 = ff3 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4084 = ff4 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4085 = ff5 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4086 = ff6 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4087 = ff7 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4088 = ff8 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4089 = ff9 */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4090 = ffa */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4091 = ffb */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4092 = ffc */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4093 = ffd */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4094 = ffe */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ + /* 4095 = fff */ {7, 0, 4}, /* 0x000f => 0x0f00+(256)*/ +}; + +/* black table */ +BlackTable _BlackFaxTable[] = { + /* 0 = 0 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 1 = 1 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 2 = 2 */ {-2, 0, 12}, /* 0x0001 => 0x0002+(2)*/ + /* 3 = 3 */ {-2, 0, 12}, /* 0x0001 => 0x0002+(2)*/ + /* 4 = 4 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 5 = 5 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 6 = 6 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 7 = 7 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 8 = 8 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 9 = 9 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 10 = a */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 11 = b */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 12 = c */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 13 = d */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 14 = e */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 15 = f */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 16 = 10 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 17 = 11 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 18 = 12 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 19 = 13 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 20 = 14 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 21 = 15 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 22 = 16 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 23 = 17 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 24 = 18 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 25 = 19 */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 26 = 1a */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 27 = 1b */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 28 = 1c */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 29 = 1d */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 30 = 1e */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 31 = 1f */ {-1, 0, 0}, /* 0x0000 => 0x0000+(8192)*/ + /* 32 = 20 */ {1792, 1, 11}, /* 0x0008 => 0x0020+(4)*/ + /* 33 = 21 */ {1792, 1, 11}, /* 0x0008 => 0x0020+(4)*/ + /* 34 = 22 */ {1792, 1, 11}, /* 0x0008 => 0x0020+(4)*/ + /* 35 = 23 */ {1792, 1, 11}, /* 0x0008 => 0x0020+(4)*/ + /* 36 = 24 */ {1984, 1, 12}, /* 0x0012 => 0x0024+(2)*/ + /* 37 = 25 */ {1984, 1, 12}, /* 0x0012 => 0x0024+(2)*/ + /* 38 = 26 */ {2048, 1, 12}, /* 0x0013 => 0x0026+(2)*/ + /* 39 = 27 */ {2048, 1, 12}, /* 0x0013 => 0x0026+(2)*/ + /* 40 = 28 */ {2112, 1, 12}, /* 0x0014 => 0x0028+(2)*/ + /* 41 = 29 */ {2112, 1, 12}, /* 0x0014 => 0x0028+(2)*/ + /* 42 = 2a */ {2176, 1, 12}, /* 0x0015 => 0x002a+(2)*/ + /* 43 = 2b */ {2176, 1, 12}, /* 0x0015 => 0x002a+(2)*/ + /* 44 = 2c */ {2240, 1, 12}, /* 0x0016 => 0x002c+(2)*/ + /* 45 = 2d */ {2240, 1, 12}, /* 0x0016 => 0x002c+(2)*/ + /* 46 = 2e */ {2304, 1, 12}, /* 0x0017 => 0x002e+(2)*/ + /* 47 = 2f */ {2304, 1, 12}, /* 0x0017 => 0x002e+(2)*/ + /* 48 = 30 */ {1856, 1, 11}, /* 0x000c => 0x0030+(4)*/ + /* 49 = 31 */ {1856, 1, 11}, /* 0x000c => 0x0030+(4)*/ + /* 50 = 32 */ {1856, 1, 11}, /* 0x000c => 0x0030+(4)*/ + /* 51 = 33 */ {1856, 1, 11}, /* 0x000c => 0x0030+(4)*/ + /* 52 = 34 */ {1920, 1, 11}, /* 0x000d => 0x0034+(4)*/ + /* 53 = 35 */ {1920, 1, 11}, /* 0x000d => 0x0034+(4)*/ + /* 54 = 36 */ {1920, 1, 11}, /* 0x000d => 0x0034+(4)*/ + /* 55 = 37 */ {1920, 1, 11}, /* 0x000d => 0x0034+(4)*/ + /* 56 = 38 */ {2368, 1, 12}, /* 0x001c => 0x0038+(2)*/ + /* 57 = 39 */ {2368, 1, 12}, /* 0x001c => 0x0038+(2)*/ + /* 58 = 3a */ {2432, 1, 12}, /* 0x001d => 0x003a+(2)*/ + /* 59 = 3b */ {2432, 1, 12}, /* 0x001d => 0x003a+(2)*/ + /* 60 = 3c */ {2496, 1, 12}, /* 0x001e => 0x003c+(2)*/ + /* 61 = 3d */ {2496, 1, 12}, /* 0x001e => 0x003c+(2)*/ + /* 62 = 3e */ {2560, 1, 12}, /* 0x001f => 0x003e+(2)*/ + /* 63 = 3f */ {2560, 1, 12}, /* 0x001f => 0x003e+(2)*/ + /* 64 = 40 */ {18, 0, 10}, /* 0x0008 => 0x0040+(8)*/ + /* 65 = 41 */ {18, 0, 10}, /* 0x0008 => 0x0040+(8)*/ + /* 66 = 42 */ {18, 0, 10}, /* 0x0008 => 0x0040+(8)*/ + /* 67 = 43 */ {18, 0, 10}, /* 0x0008 => 0x0040+(8)*/ + /* 68 = 44 */ {18, 0, 10}, /* 0x0008 => 0x0040+(8)*/ + /* 69 = 45 */ {18, 0, 10}, /* 0x0008 => 0x0040+(8)*/ + /* 70 = 46 */ {18, 0, 10}, /* 0x0008 => 0x0040+(8)*/ + /* 71 = 47 */ {18, 0, 10}, /* 0x0008 => 0x0040+(8)*/ + /* 72 = 48 */ {52, 0, 12}, /* 0x0024 => 0x0048+(2)*/ + /* 73 = 49 */ {52, 0, 12}, /* 0x0024 => 0x0048+(2)*/ + /* 74 = 4a */ {640, 1, 13}, /* 0x004a => 0x004a+(1)*/ + /* 75 = 4b */ {704, 1, 13}, /* 0x004b => 0x004b+(1)*/ + /* 76 = 4c */ {768, 1, 13}, /* 0x004c => 0x004c+(1)*/ + /* 77 = 4d */ {832, 1, 13}, /* 0x004d => 0x004d+(1)*/ + /* 78 = 4e */ {55, 0, 12}, /* 0x0027 => 0x004e+(2)*/ + /* 79 = 4f */ {55, 0, 12}, /* 0x0027 => 0x004e+(2)*/ + /* 80 = 50 */ {56, 0, 12}, /* 0x0028 => 0x0050+(2)*/ + /* 81 = 51 */ {56, 0, 12}, /* 0x0028 => 0x0050+(2)*/ + /* 82 = 52 */ {1280, 1, 13}, /* 0x0052 => 0x0052+(1)*/ + /* 83 = 53 */ {1344, 1, 13}, /* 0x0053 => 0x0053+(1)*/ + /* 84 = 54 */ {1408, 1, 13}, /* 0x0054 => 0x0054+(1)*/ + /* 85 = 55 */ {1472, 1, 13}, /* 0x0055 => 0x0055+(1)*/ + /* 86 = 56 */ {59, 0, 12}, /* 0x002b => 0x0056+(2)*/ + /* 87 = 57 */ {59, 0, 12}, /* 0x002b => 0x0056+(2)*/ + /* 88 = 58 */ {60, 0, 12}, /* 0x002c => 0x0058+(2)*/ + /* 89 = 59 */ {60, 0, 12}, /* 0x002c => 0x0058+(2)*/ + /* 90 = 5a */ {1536, 1, 13}, /* 0x005a => 0x005a+(1)*/ + /* 91 = 5b */ {1600, 1, 13}, /* 0x005b => 0x005b+(1)*/ + /* 92 = 5c */ {24, 0, 11}, /* 0x0017 => 0x005c+(4)*/ + /* 93 = 5d */ {24, 0, 11}, /* 0x0017 => 0x005c+(4)*/ + /* 94 = 5e */ {24, 0, 11}, /* 0x0017 => 0x005c+(4)*/ + /* 95 = 5f */ {24, 0, 11}, /* 0x0017 => 0x005c+(4)*/ + /* 96 = 60 */ {25, 0, 11}, /* 0x0018 => 0x0060+(4)*/ + /* 97 = 61 */ {25, 0, 11}, /* 0x0018 => 0x0060+(4)*/ + /* 98 = 62 */ {25, 0, 11}, /* 0x0018 => 0x0060+(4)*/ + /* 99 = 63 */ {25, 0, 11}, /* 0x0018 => 0x0060+(4)*/ + /* 100 = 64 */ {1664, 1, 13}, /* 0x0064 => 0x0064+(1)*/ + /* 101 = 65 */ {1728, 1, 13}, /* 0x0065 => 0x0065+(1)*/ + /* 102 = 66 */ {320, 1, 12}, /* 0x0033 => 0x0066+(2)*/ + /* 103 = 67 */ {320, 1, 12}, /* 0x0033 => 0x0066+(2)*/ + /* 104 = 68 */ {384, 1, 12}, /* 0x0034 => 0x0068+(2)*/ + /* 105 = 69 */ {384, 1, 12}, /* 0x0034 => 0x0068+(2)*/ + /* 106 = 6a */ {448, 1, 12}, /* 0x0035 => 0x006a+(2)*/ + /* 107 = 6b */ {448, 1, 12}, /* 0x0035 => 0x006a+(2)*/ + /* 108 = 6c */ {512, 1, 13}, /* 0x006c => 0x006c+(1)*/ + /* 109 = 6d */ {576, 1, 13}, /* 0x006d => 0x006d+(1)*/ + /* 110 = 6e */ {53, 0, 12}, /* 0x0037 => 0x006e+(2)*/ + /* 111 = 6f */ {53, 0, 12}, /* 0x0037 => 0x006e+(2)*/ + /* 112 = 70 */ {54, 0, 12}, /* 0x0038 => 0x0070+(2)*/ + /* 113 = 71 */ {54, 0, 12}, /* 0x0038 => 0x0070+(2)*/ + /* 114 = 72 */ {896, 1, 13}, /* 0x0072 => 0x0072+(1)*/ + /* 115 = 73 */ {960, 1, 13}, /* 0x0073 => 0x0073+(1)*/ + /* 116 = 74 */ {1024, 1, 13}, /* 0x0074 => 0x0074+(1)*/ + /* 117 = 75 */ {1088, 1, 13}, /* 0x0075 => 0x0075+(1)*/ + /* 118 = 76 */ {1152, 1, 13}, /* 0x0076 => 0x0076+(1)*/ + /* 119 = 77 */ {1216, 1, 13}, /* 0x0077 => 0x0077+(1)*/ + /* 120 = 78 */ {64, 1, 10}, /* 0x000f => 0x0078+(8)*/ + /* 121 = 79 */ {64, 1, 10}, /* 0x000f => 0x0078+(8)*/ + /* 122 = 7a */ {64, 1, 10}, /* 0x000f => 0x0078+(8)*/ + /* 123 = 7b */ {64, 1, 10}, /* 0x000f => 0x0078+(8)*/ + /* 124 = 7c */ {64, 1, 10}, /* 0x000f => 0x0078+(8)*/ + /* 125 = 7d */ {64, 1, 10}, /* 0x000f => 0x0078+(8)*/ + /* 126 = 7e */ {64, 1, 10}, /* 0x000f => 0x0078+(8)*/ + /* 127 = 7f */ {64, 1, 10}, /* 0x000f => 0x0078+(8)*/ + /* 128 = 80 */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 129 = 81 */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 130 = 82 */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 131 = 83 */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 132 = 84 */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 133 = 85 */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 134 = 86 */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 135 = 87 */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 136 = 88 */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 137 = 89 */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 138 = 8a */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 139 = 8b */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 140 = 8c */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 141 = 8d */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 142 = 8e */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 143 = 8f */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 144 = 90 */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 145 = 91 */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 146 = 92 */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 147 = 93 */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 148 = 94 */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 149 = 95 */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 150 = 96 */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 151 = 97 */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 152 = 98 */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 153 = 99 */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 154 = 9a */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 155 = 9b */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 156 = 9c */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 157 = 9d */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 158 = 9e */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 159 = 9f */ {13, 0, 8}, /* 0x0004 => 0x0080+(32)*/ + /* 160 = a0 */ {23, 0, 11}, /* 0x0028 => 0x00a0+(4)*/ + /* 161 = a1 */ {23, 0, 11}, /* 0x0028 => 0x00a0+(4)*/ + /* 162 = a2 */ {23, 0, 11}, /* 0x0028 => 0x00a0+(4)*/ + /* 163 = a3 */ {23, 0, 11}, /* 0x0028 => 0x00a0+(4)*/ + /* 164 = a4 */ {50, 0, 12}, /* 0x0052 => 0x00a4+(2)*/ + /* 165 = a5 */ {50, 0, 12}, /* 0x0052 => 0x00a4+(2)*/ + /* 166 = a6 */ {51, 0, 12}, /* 0x0053 => 0x00a6+(2)*/ + /* 167 = a7 */ {51, 0, 12}, /* 0x0053 => 0x00a6+(2)*/ + /* 168 = a8 */ {44, 0, 12}, /* 0x0054 => 0x00a8+(2)*/ + /* 169 = a9 */ {44, 0, 12}, /* 0x0054 => 0x00a8+(2)*/ + /* 170 = aa */ {45, 0, 12}, /* 0x0055 => 0x00aa+(2)*/ + /* 171 = ab */ {45, 0, 12}, /* 0x0055 => 0x00aa+(2)*/ + /* 172 = ac */ {46, 0, 12}, /* 0x0056 => 0x00ac+(2)*/ + /* 173 = ad */ {46, 0, 12}, /* 0x0056 => 0x00ac+(2)*/ + /* 174 = ae */ {47, 0, 12}, /* 0x0057 => 0x00ae+(2)*/ + /* 175 = af */ {47, 0, 12}, /* 0x0057 => 0x00ae+(2)*/ + /* 176 = b0 */ {57, 0, 12}, /* 0x0058 => 0x00b0+(2)*/ + /* 177 = b1 */ {57, 0, 12}, /* 0x0058 => 0x00b0+(2)*/ + /* 178 = b2 */ {58, 0, 12}, /* 0x0059 => 0x00b2+(2)*/ + /* 179 = b3 */ {58, 0, 12}, /* 0x0059 => 0x00b2+(2)*/ + /* 180 = b4 */ {61, 0, 12}, /* 0x005a => 0x00b4+(2)*/ + /* 181 = b5 */ {61, 0, 12}, /* 0x005a => 0x00b4+(2)*/ + /* 182 = b6 */ {256, 1, 12}, /* 0x005b => 0x00b6+(2)*/ + /* 183 = b7 */ {256, 1, 12}, /* 0x005b => 0x00b6+(2)*/ + /* 184 = b8 */ {16, 0, 10}, /* 0x0017 => 0x00b8+(8)*/ + /* 185 = b9 */ {16, 0, 10}, /* 0x0017 => 0x00b8+(8)*/ + /* 186 = ba */ {16, 0, 10}, /* 0x0017 => 0x00b8+(8)*/ + /* 187 = bb */ {16, 0, 10}, /* 0x0017 => 0x00b8+(8)*/ + /* 188 = bc */ {16, 0, 10}, /* 0x0017 => 0x00b8+(8)*/ + /* 189 = bd */ {16, 0, 10}, /* 0x0017 => 0x00b8+(8)*/ + /* 190 = be */ {16, 0, 10}, /* 0x0017 => 0x00b8+(8)*/ + /* 191 = bf */ {16, 0, 10}, /* 0x0017 => 0x00b8+(8)*/ + /* 192 = c0 */ {17, 0, 10}, /* 0x0018 => 0x00c0+(8)*/ + /* 193 = c1 */ {17, 0, 10}, /* 0x0018 => 0x00c0+(8)*/ + /* 194 = c2 */ {17, 0, 10}, /* 0x0018 => 0x00c0+(8)*/ + /* 195 = c3 */ {17, 0, 10}, /* 0x0018 => 0x00c0+(8)*/ + /* 196 = c4 */ {17, 0, 10}, /* 0x0018 => 0x00c0+(8)*/ + /* 197 = c5 */ {17, 0, 10}, /* 0x0018 => 0x00c0+(8)*/ + /* 198 = c6 */ {17, 0, 10}, /* 0x0018 => 0x00c0+(8)*/ + /* 199 = c7 */ {17, 0, 10}, /* 0x0018 => 0x00c0+(8)*/ + /* 200 = c8 */ {48, 0, 12}, /* 0x0064 => 0x00c8+(2)*/ + /* 201 = c9 */ {48, 0, 12}, /* 0x0064 => 0x00c8+(2)*/ + /* 202 = ca */ {49, 0, 12}, /* 0x0065 => 0x00ca+(2)*/ + /* 203 = cb */ {49, 0, 12}, /* 0x0065 => 0x00ca+(2)*/ + /* 204 = cc */ {62, 0, 12}, /* 0x0066 => 0x00cc+(2)*/ + /* 205 = cd */ {62, 0, 12}, /* 0x0066 => 0x00cc+(2)*/ + /* 206 = ce */ {63, 0, 12}, /* 0x0067 => 0x00ce+(2)*/ + /* 207 = cf */ {63, 0, 12}, /* 0x0067 => 0x00ce+(2)*/ + /* 208 = d0 */ {30, 0, 12}, /* 0x0068 => 0x00d0+(2)*/ + /* 209 = d1 */ {30, 0, 12}, /* 0x0068 => 0x00d0+(2)*/ + /* 210 = d2 */ {31, 0, 12}, /* 0x0069 => 0x00d2+(2)*/ + /* 211 = d3 */ {31, 0, 12}, /* 0x0069 => 0x00d2+(2)*/ + /* 212 = d4 */ {32, 0, 12}, /* 0x006a => 0x00d4+(2)*/ + /* 213 = d5 */ {32, 0, 12}, /* 0x006a => 0x00d4+(2)*/ + /* 214 = d6 */ {33, 0, 12}, /* 0x006b => 0x00d6+(2)*/ + /* 215 = d7 */ {33, 0, 12}, /* 0x006b => 0x00d6+(2)*/ + /* 216 = d8 */ {40, 0, 12}, /* 0x006c => 0x00d8+(2)*/ + /* 217 = d9 */ {40, 0, 12}, /* 0x006c => 0x00d8+(2)*/ + /* 218 = da */ {41, 0, 12}, /* 0x006d => 0x00da+(2)*/ + /* 219 = db */ {41, 0, 12}, /* 0x006d => 0x00da+(2)*/ + /* 220 = dc */ {22, 0, 11}, /* 0x0037 => 0x00dc+(4)*/ + /* 221 = dd */ {22, 0, 11}, /* 0x0037 => 0x00dc+(4)*/ + /* 222 = de */ {22, 0, 11}, /* 0x0037 => 0x00dc+(4)*/ + /* 223 = df */ {22, 0, 11}, /* 0x0037 => 0x00dc+(4)*/ + /* 224 = e0 */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 225 = e1 */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 226 = e2 */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 227 = e3 */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 228 = e4 */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 229 = e5 */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 230 = e6 */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 231 = e7 */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 232 = e8 */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 233 = e9 */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 234 = ea */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 235 = eb */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 236 = ec */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 237 = ed */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 238 = ee */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 239 = ef */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 240 = f0 */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 241 = f1 */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 242 = f2 */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 243 = f3 */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 244 = f4 */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 245 = f5 */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 246 = f6 */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 247 = f7 */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 248 = f8 */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 249 = f9 */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 250 = fa */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 251 = fb */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 252 = fc */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 253 = fd */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 254 = fe */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 255 = ff */ {14, 0, 8}, /* 0x0007 => 0x00e0+(32)*/ + /* 256 = 100 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 257 = 101 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 258 = 102 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 259 = 103 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 260 = 104 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 261 = 105 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 262 = 106 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 263 = 107 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 264 = 108 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 265 = 109 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 266 = 10a */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 267 = 10b */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 268 = 10c */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 269 = 10d */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 270 = 10e */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 271 = 10f */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 272 = 110 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 273 = 111 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 274 = 112 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 275 = 113 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 276 = 114 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 277 = 115 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 278 = 116 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 279 = 117 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 280 = 118 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 281 = 119 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 282 = 11a */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 283 = 11b */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 284 = 11c */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 285 = 11d */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 286 = 11e */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 287 = 11f */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 288 = 120 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 289 = 121 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 290 = 122 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 291 = 123 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 292 = 124 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 293 = 125 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 294 = 126 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 295 = 127 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 296 = 128 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 297 = 129 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 298 = 12a */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 299 = 12b */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 300 = 12c */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 301 = 12d */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 302 = 12e */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 303 = 12f */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 304 = 130 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 305 = 131 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 306 = 132 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 307 = 133 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 308 = 134 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 309 = 135 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 310 = 136 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 311 = 137 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 312 = 138 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 313 = 139 */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 314 = 13a */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 315 = 13b */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 316 = 13c */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 317 = 13d */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 318 = 13e */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 319 = 13f */ {10, 0, 7}, /* 0x0004 => 0x0100+(64)*/ + /* 320 = 140 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 321 = 141 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 322 = 142 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 323 = 143 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 324 = 144 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 325 = 145 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 326 = 146 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 327 = 147 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 328 = 148 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 329 = 149 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 330 = 14a */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 331 = 14b */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 332 = 14c */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 333 = 14d */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 334 = 14e */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 335 = 14f */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 336 = 150 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 337 = 151 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 338 = 152 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 339 = 153 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 340 = 154 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 341 = 155 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 342 = 156 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 343 = 157 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 344 = 158 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 345 = 159 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 346 = 15a */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 347 = 15b */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 348 = 15c */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 349 = 15d */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 350 = 15e */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 351 = 15f */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 352 = 160 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 353 = 161 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 354 = 162 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 355 = 163 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 356 = 164 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 357 = 165 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 358 = 166 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 359 = 167 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 360 = 168 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 361 = 169 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 362 = 16a */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 363 = 16b */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 364 = 16c */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 365 = 16d */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 366 = 16e */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 367 = 16f */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 368 = 170 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 369 = 171 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 370 = 172 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 371 = 173 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 372 = 174 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 373 = 175 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 374 = 176 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 375 = 177 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 376 = 178 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 377 = 179 */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 378 = 17a */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 379 = 17b */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 380 = 17c */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 381 = 17d */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 382 = 17e */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 383 = 17f */ {11, 0, 7}, /* 0x0005 => 0x0140+(64)*/ + /* 384 = 180 */ {15, 0, 9}, /* 0x0018 => 0x0180+(16)*/ + /* 385 = 181 */ {15, 0, 9}, /* 0x0018 => 0x0180+(16)*/ + /* 386 = 182 */ {15, 0, 9}, /* 0x0018 => 0x0180+(16)*/ + /* 387 = 183 */ {15, 0, 9}, /* 0x0018 => 0x0180+(16)*/ + /* 388 = 184 */ {15, 0, 9}, /* 0x0018 => 0x0180+(16)*/ + /* 389 = 185 */ {15, 0, 9}, /* 0x0018 => 0x0180+(16)*/ + /* 390 = 186 */ {15, 0, 9}, /* 0x0018 => 0x0180+(16)*/ + /* 391 = 187 */ {15, 0, 9}, /* 0x0018 => 0x0180+(16)*/ + /* 392 = 188 */ {15, 0, 9}, /* 0x0018 => 0x0180+(16)*/ + /* 393 = 189 */ {15, 0, 9}, /* 0x0018 => 0x0180+(16)*/ + /* 394 = 18a */ {15, 0, 9}, /* 0x0018 => 0x0180+(16)*/ + /* 395 = 18b */ {15, 0, 9}, /* 0x0018 => 0x0180+(16)*/ + /* 396 = 18c */ {15, 0, 9}, /* 0x0018 => 0x0180+(16)*/ + /* 397 = 18d */ {15, 0, 9}, /* 0x0018 => 0x0180+(16)*/ + /* 398 = 18e */ {15, 0, 9}, /* 0x0018 => 0x0180+(16)*/ + /* 399 = 18f */ {15, 0, 9}, /* 0x0018 => 0x0180+(16)*/ + /* 400 = 190 */ {128, 1, 12}, /* 0x00c8 => 0x0190+(2)*/ + /* 401 = 191 */ {128, 1, 12}, /* 0x00c8 => 0x0190+(2)*/ + /* 402 = 192 */ {192, 1, 12}, /* 0x00c9 => 0x0192+(2)*/ + /* 403 = 193 */ {192, 1, 12}, /* 0x00c9 => 0x0192+(2)*/ + /* 404 = 194 */ {26, 0, 12}, /* 0x00ca => 0x0194+(2)*/ + /* 405 = 195 */ {26, 0, 12}, /* 0x00ca => 0x0194+(2)*/ + /* 406 = 196 */ {27, 0, 12}, /* 0x00cb => 0x0196+(2)*/ + /* 407 = 197 */ {27, 0, 12}, /* 0x00cb => 0x0196+(2)*/ + /* 408 = 198 */ {28, 0, 12}, /* 0x00cc => 0x0198+(2)*/ + /* 409 = 199 */ {28, 0, 12}, /* 0x00cc => 0x0198+(2)*/ + /* 410 = 19a */ {29, 0, 12}, /* 0x00cd => 0x019a+(2)*/ + /* 411 = 19b */ {29, 0, 12}, /* 0x00cd => 0x019a+(2)*/ + /* 412 = 19c */ {19, 0, 11}, /* 0x0067 => 0x019c+(4)*/ + /* 413 = 19d */ {19, 0, 11}, /* 0x0067 => 0x019c+(4)*/ + /* 414 = 19e */ {19, 0, 11}, /* 0x0067 => 0x019c+(4)*/ + /* 415 = 19f */ {19, 0, 11}, /* 0x0067 => 0x019c+(4)*/ + /* 416 = 1a0 */ {20, 0, 11}, /* 0x0068 => 0x01a0+(4)*/ + /* 417 = 1a1 */ {20, 0, 11}, /* 0x0068 => 0x01a0+(4)*/ + /* 418 = 1a2 */ {20, 0, 11}, /* 0x0068 => 0x01a0+(4)*/ + /* 419 = 1a3 */ {20, 0, 11}, /* 0x0068 => 0x01a0+(4)*/ + /* 420 = 1a4 */ {34, 0, 12}, /* 0x00d2 => 0x01a4+(2)*/ + /* 421 = 1a5 */ {34, 0, 12}, /* 0x00d2 => 0x01a4+(2)*/ + /* 422 = 1a6 */ {35, 0, 12}, /* 0x00d3 => 0x01a6+(2)*/ + /* 423 = 1a7 */ {35, 0, 12}, /* 0x00d3 => 0x01a6+(2)*/ + /* 424 = 1a8 */ {36, 0, 12}, /* 0x00d4 => 0x01a8+(2)*/ + /* 425 = 1a9 */ {36, 0, 12}, /* 0x00d4 => 0x01a8+(2)*/ + /* 426 = 1aa */ {37, 0, 12}, /* 0x00d5 => 0x01aa+(2)*/ + /* 427 = 1ab */ {37, 0, 12}, /* 0x00d5 => 0x01aa+(2)*/ + /* 428 = 1ac */ {38, 0, 12}, /* 0x00d6 => 0x01ac+(2)*/ + /* 429 = 1ad */ {38, 0, 12}, /* 0x00d6 => 0x01ac+(2)*/ + /* 430 = 1ae */ {39, 0, 12}, /* 0x00d7 => 0x01ae+(2)*/ + /* 431 = 1af */ {39, 0, 12}, /* 0x00d7 => 0x01ae+(2)*/ + /* 432 = 1b0 */ {21, 0, 11}, /* 0x006c => 0x01b0+(4)*/ + /* 433 = 1b1 */ {21, 0, 11}, /* 0x006c => 0x01b0+(4)*/ + /* 434 = 1b2 */ {21, 0, 11}, /* 0x006c => 0x01b0+(4)*/ + /* 435 = 1b3 */ {21, 0, 11}, /* 0x006c => 0x01b0+(4)*/ + /* 436 = 1b4 */ {42, 0, 12}, /* 0x00da => 0x01b4+(2)*/ + /* 437 = 1b5 */ {42, 0, 12}, /* 0x00da => 0x01b4+(2)*/ + /* 438 = 1b6 */ {43, 0, 12}, /* 0x00db => 0x01b6+(2)*/ + /* 439 = 1b7 */ {43, 0, 12}, /* 0x00db => 0x01b6+(2)*/ + /* 440 = 1b8 */ {0, 0, 10}, /* 0x0037 => 0x01b8+(8)*/ + /* 441 = 1b9 */ {0, 0, 10}, /* 0x0037 => 0x01b8+(8)*/ + /* 442 = 1ba */ {0, 0, 10}, /* 0x0037 => 0x01b8+(8)*/ + /* 443 = 1bb */ {0, 0, 10}, /* 0x0037 => 0x01b8+(8)*/ + /* 444 = 1bc */ {0, 0, 10}, /* 0x0037 => 0x01b8+(8)*/ + /* 445 = 1bd */ {0, 0, 10}, /* 0x0037 => 0x01b8+(8)*/ + /* 446 = 1be */ {0, 0, 10}, /* 0x0037 => 0x01b8+(8)*/ + /* 447 = 1bf */ {0, 0, 10}, /* 0x0037 => 0x01b8+(8)*/ + /* 448 = 1c0 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 449 = 1c1 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 450 = 1c2 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 451 = 1c3 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 452 = 1c4 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 453 = 1c5 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 454 = 1c6 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 455 = 1c7 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 456 = 1c8 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 457 = 1c9 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 458 = 1ca */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 459 = 1cb */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 460 = 1cc */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 461 = 1cd */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 462 = 1ce */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 463 = 1cf */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 464 = 1d0 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 465 = 1d1 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 466 = 1d2 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 467 = 1d3 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 468 = 1d4 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 469 = 1d5 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 470 = 1d6 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 471 = 1d7 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 472 = 1d8 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 473 = 1d9 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 474 = 1da */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 475 = 1db */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 476 = 1dc */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 477 = 1dd */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 478 = 1de */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 479 = 1df */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 480 = 1e0 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 481 = 1e1 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 482 = 1e2 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 483 = 1e3 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 484 = 1e4 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 485 = 1e5 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 486 = 1e6 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 487 = 1e7 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 488 = 1e8 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 489 = 1e9 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 490 = 1ea */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 491 = 1eb */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 492 = 1ec */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 493 = 1ed */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 494 = 1ee */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 495 = 1ef */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 496 = 1f0 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 497 = 1f1 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 498 = 1f2 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 499 = 1f3 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 500 = 1f4 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 501 = 1f5 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 502 = 1f6 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 503 = 1f7 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 504 = 1f8 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 505 = 1f9 */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 506 = 1fa */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 507 = 1fb */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 508 = 1fc */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 509 = 1fd */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 510 = 1fe */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 511 = 1ff */ {12, 0, 7}, /* 0x0007 => 0x01c0+(64)*/ + /* 512 = 200 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 513 = 201 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 514 = 202 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 515 = 203 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 516 = 204 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 517 = 205 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 518 = 206 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 519 = 207 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 520 = 208 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 521 = 209 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 522 = 20a */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 523 = 20b */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 524 = 20c */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 525 = 20d */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 526 = 20e */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 527 = 20f */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 528 = 210 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 529 = 211 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 530 = 212 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 531 = 213 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 532 = 214 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 533 = 215 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 534 = 216 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 535 = 217 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 536 = 218 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 537 = 219 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 538 = 21a */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 539 = 21b */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 540 = 21c */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 541 = 21d */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 542 = 21e */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 543 = 21f */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 544 = 220 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 545 = 221 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 546 = 222 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 547 = 223 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 548 = 224 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 549 = 225 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 550 = 226 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 551 = 227 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 552 = 228 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 553 = 229 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 554 = 22a */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 555 = 22b */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 556 = 22c */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 557 = 22d */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 558 = 22e */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 559 = 22f */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 560 = 230 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 561 = 231 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 562 = 232 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 563 = 233 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 564 = 234 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 565 = 235 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 566 = 236 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 567 = 237 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 568 = 238 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 569 = 239 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 570 = 23a */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 571 = 23b */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 572 = 23c */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 573 = 23d */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 574 = 23e */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 575 = 23f */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 576 = 240 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 577 = 241 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 578 = 242 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 579 = 243 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 580 = 244 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 581 = 245 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 582 = 246 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 583 = 247 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 584 = 248 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 585 = 249 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 586 = 24a */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 587 = 24b */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 588 = 24c */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 589 = 24d */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 590 = 24e */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 591 = 24f */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 592 = 250 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 593 = 251 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 594 = 252 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 595 = 253 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 596 = 254 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 597 = 255 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 598 = 256 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 599 = 257 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 600 = 258 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 601 = 259 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 602 = 25a */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 603 = 25b */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 604 = 25c */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 605 = 25d */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 606 = 25e */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 607 = 25f */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 608 = 260 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 609 = 261 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 610 = 262 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 611 = 263 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 612 = 264 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 613 = 265 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 614 = 266 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 615 = 267 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 616 = 268 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 617 = 269 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 618 = 26a */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 619 = 26b */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 620 = 26c */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 621 = 26d */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 622 = 26e */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 623 = 26f */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 624 = 270 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 625 = 271 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 626 = 272 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 627 = 273 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 628 = 274 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 629 = 275 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 630 = 276 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 631 = 277 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 632 = 278 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 633 = 279 */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 634 = 27a */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 635 = 27b */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 636 = 27c */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 637 = 27d */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 638 = 27e */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 639 = 27f */ {9, 0, 6}, /* 0x0004 => 0x0200+(128)*/ + /* 640 = 280 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 641 = 281 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 642 = 282 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 643 = 283 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 644 = 284 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 645 = 285 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 646 = 286 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 647 = 287 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 648 = 288 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 649 = 289 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 650 = 28a */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 651 = 28b */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 652 = 28c */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 653 = 28d */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 654 = 28e */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 655 = 28f */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 656 = 290 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 657 = 291 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 658 = 292 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 659 = 293 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 660 = 294 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 661 = 295 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 662 = 296 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 663 = 297 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 664 = 298 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 665 = 299 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 666 = 29a */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 667 = 29b */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 668 = 29c */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 669 = 29d */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 670 = 29e */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 671 = 29f */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 672 = 2a0 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 673 = 2a1 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 674 = 2a2 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 675 = 2a3 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 676 = 2a4 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 677 = 2a5 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 678 = 2a6 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 679 = 2a7 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 680 = 2a8 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 681 = 2a9 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 682 = 2aa */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 683 = 2ab */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 684 = 2ac */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 685 = 2ad */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 686 = 2ae */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 687 = 2af */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 688 = 2b0 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 689 = 2b1 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 690 = 2b2 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 691 = 2b3 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 692 = 2b4 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 693 = 2b5 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 694 = 2b6 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 695 = 2b7 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 696 = 2b8 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 697 = 2b9 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 698 = 2ba */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 699 = 2bb */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 700 = 2bc */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 701 = 2bd */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 702 = 2be */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 703 = 2bf */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 704 = 2c0 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 705 = 2c1 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 706 = 2c2 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 707 = 2c3 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 708 = 2c4 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 709 = 2c5 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 710 = 2c6 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 711 = 2c7 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 712 = 2c8 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 713 = 2c9 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 714 = 2ca */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 715 = 2cb */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 716 = 2cc */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 717 = 2cd */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 718 = 2ce */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 719 = 2cf */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 720 = 2d0 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 721 = 2d1 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 722 = 2d2 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 723 = 2d3 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 724 = 2d4 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 725 = 2d5 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 726 = 2d6 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 727 = 2d7 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 728 = 2d8 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 729 = 2d9 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 730 = 2da */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 731 = 2db */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 732 = 2dc */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 733 = 2dd */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 734 = 2de */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 735 = 2df */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 736 = 2e0 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 737 = 2e1 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 738 = 2e2 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 739 = 2e3 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 740 = 2e4 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 741 = 2e5 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 742 = 2e6 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 743 = 2e7 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 744 = 2e8 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 745 = 2e9 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 746 = 2ea */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 747 = 2eb */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 748 = 2ec */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 749 = 2ed */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 750 = 2ee */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 751 = 2ef */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 752 = 2f0 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 753 = 2f1 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 754 = 2f2 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 755 = 2f3 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 756 = 2f4 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 757 = 2f5 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 758 = 2f6 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 759 = 2f7 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 760 = 2f8 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 761 = 2f9 */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 762 = 2fa */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 763 = 2fb */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 764 = 2fc */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 765 = 2fd */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 766 = 2fe */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 767 = 2ff */ {8, 0, 6}, /* 0x0005 => 0x0280+(128)*/ + /* 768 = 300 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 769 = 301 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 770 = 302 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 771 = 303 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 772 = 304 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 773 = 305 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 774 = 306 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 775 = 307 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 776 = 308 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 777 = 309 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 778 = 30a */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 779 = 30b */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 780 = 30c */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 781 = 30d */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 782 = 30e */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 783 = 30f */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 784 = 310 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 785 = 311 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 786 = 312 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 787 = 313 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 788 = 314 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 789 = 315 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 790 = 316 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 791 = 317 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 792 = 318 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 793 = 319 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 794 = 31a */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 795 = 31b */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 796 = 31c */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 797 = 31d */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 798 = 31e */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 799 = 31f */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 800 = 320 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 801 = 321 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 802 = 322 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 803 = 323 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 804 = 324 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 805 = 325 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 806 = 326 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 807 = 327 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 808 = 328 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 809 = 329 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 810 = 32a */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 811 = 32b */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 812 = 32c */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 813 = 32d */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 814 = 32e */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 815 = 32f */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 816 = 330 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 817 = 331 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 818 = 332 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 819 = 333 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 820 = 334 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 821 = 335 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 822 = 336 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 823 = 337 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 824 = 338 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 825 = 339 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 826 = 33a */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 827 = 33b */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 828 = 33c */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 829 = 33d */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 830 = 33e */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 831 = 33f */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 832 = 340 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 833 = 341 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 834 = 342 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 835 = 343 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 836 = 344 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 837 = 345 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 838 = 346 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 839 = 347 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 840 = 348 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 841 = 349 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 842 = 34a */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 843 = 34b */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 844 = 34c */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 845 = 34d */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 846 = 34e */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 847 = 34f */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 848 = 350 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 849 = 351 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 850 = 352 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 851 = 353 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 852 = 354 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 853 = 355 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 854 = 356 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 855 = 357 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 856 = 358 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 857 = 359 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 858 = 35a */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 859 = 35b */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 860 = 35c */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 861 = 35d */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 862 = 35e */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 863 = 35f */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 864 = 360 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 865 = 361 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 866 = 362 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 867 = 363 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 868 = 364 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 869 = 365 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 870 = 366 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 871 = 367 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 872 = 368 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 873 = 369 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 874 = 36a */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 875 = 36b */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 876 = 36c */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 877 = 36d */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 878 = 36e */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 879 = 36f */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 880 = 370 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 881 = 371 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 882 = 372 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 883 = 373 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 884 = 374 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 885 = 375 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 886 = 376 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 887 = 377 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 888 = 378 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 889 = 379 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 890 = 37a */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 891 = 37b */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 892 = 37c */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 893 = 37d */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 894 = 37e */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 895 = 37f */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 896 = 380 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 897 = 381 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 898 = 382 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 899 = 383 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 900 = 384 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 901 = 385 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 902 = 386 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 903 = 387 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 904 = 388 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 905 = 389 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 906 = 38a */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 907 = 38b */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 908 = 38c */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 909 = 38d */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 910 = 38e */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 911 = 38f */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 912 = 390 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 913 = 391 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 914 = 392 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 915 = 393 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 916 = 394 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 917 = 395 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 918 = 396 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 919 = 397 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 920 = 398 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 921 = 399 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 922 = 39a */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 923 = 39b */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 924 = 39c */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 925 = 39d */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 926 = 39e */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 927 = 39f */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 928 = 3a0 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 929 = 3a1 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 930 = 3a2 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 931 = 3a3 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 932 = 3a4 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 933 = 3a5 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 934 = 3a6 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 935 = 3a7 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 936 = 3a8 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 937 = 3a9 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 938 = 3aa */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 939 = 3ab */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 940 = 3ac */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 941 = 3ad */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 942 = 3ae */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 943 = 3af */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 944 = 3b0 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 945 = 3b1 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 946 = 3b2 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 947 = 3b3 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 948 = 3b4 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 949 = 3b5 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 950 = 3b6 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 951 = 3b7 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 952 = 3b8 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 953 = 3b9 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 954 = 3ba */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 955 = 3bb */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 956 = 3bc */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 957 = 3bd */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 958 = 3be */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 959 = 3bf */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 960 = 3c0 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 961 = 3c1 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 962 = 3c2 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 963 = 3c3 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 964 = 3c4 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 965 = 3c5 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 966 = 3c6 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 967 = 3c7 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 968 = 3c8 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 969 = 3c9 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 970 = 3ca */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 971 = 3cb */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 972 = 3cc */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 973 = 3cd */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 974 = 3ce */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 975 = 3cf */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 976 = 3d0 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 977 = 3d1 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 978 = 3d2 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 979 = 3d3 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 980 = 3d4 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 981 = 3d5 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 982 = 3d6 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 983 = 3d7 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 984 = 3d8 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 985 = 3d9 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 986 = 3da */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 987 = 3db */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 988 = 3dc */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 989 = 3dd */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 990 = 3de */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 991 = 3df */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 992 = 3e0 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 993 = 3e1 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 994 = 3e2 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 995 = 3e3 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 996 = 3e4 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 997 = 3e5 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 998 = 3e6 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 999 = 3e7 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1000 = 3e8 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1001 = 3e9 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1002 = 3ea */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1003 = 3eb */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1004 = 3ec */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1005 = 3ed */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1006 = 3ee */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1007 = 3ef */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1008 = 3f0 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1009 = 3f1 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1010 = 3f2 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1011 = 3f3 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1012 = 3f4 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1013 = 3f5 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1014 = 3f6 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1015 = 3f7 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1016 = 3f8 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1017 = 3f9 */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1018 = 3fa */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1019 = 3fb */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1020 = 3fc */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1021 = 3fd */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1022 = 3fe */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1023 = 3ff */ {7, 0, 5}, /* 0x0003 => 0x0300+(256)*/ + /* 1024 = 400 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1025 = 401 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1026 = 402 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1027 = 403 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1028 = 404 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1029 = 405 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1030 = 406 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1031 = 407 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1032 = 408 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1033 = 409 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1034 = 40a */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1035 = 40b */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1036 = 40c */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1037 = 40d */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1038 = 40e */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1039 = 40f */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1040 = 410 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1041 = 411 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1042 = 412 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1043 = 413 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1044 = 414 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1045 = 415 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1046 = 416 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1047 = 417 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1048 = 418 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1049 = 419 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1050 = 41a */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1051 = 41b */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1052 = 41c */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1053 = 41d */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1054 = 41e */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1055 = 41f */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1056 = 420 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1057 = 421 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1058 = 422 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1059 = 423 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1060 = 424 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1061 = 425 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1062 = 426 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1063 = 427 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1064 = 428 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1065 = 429 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1066 = 42a */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1067 = 42b */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1068 = 42c */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1069 = 42d */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1070 = 42e */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1071 = 42f */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1072 = 430 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1073 = 431 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1074 = 432 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1075 = 433 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1076 = 434 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1077 = 435 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1078 = 436 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1079 = 437 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1080 = 438 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1081 = 439 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1082 = 43a */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1083 = 43b */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1084 = 43c */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1085 = 43d */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1086 = 43e */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1087 = 43f */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1088 = 440 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1089 = 441 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1090 = 442 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1091 = 443 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1092 = 444 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1093 = 445 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1094 = 446 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1095 = 447 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1096 = 448 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1097 = 449 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1098 = 44a */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1099 = 44b */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1100 = 44c */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1101 = 44d */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1102 = 44e */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1103 = 44f */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1104 = 450 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1105 = 451 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1106 = 452 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1107 = 453 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1108 = 454 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1109 = 455 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1110 = 456 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1111 = 457 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1112 = 458 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1113 = 459 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1114 = 45a */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1115 = 45b */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1116 = 45c */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1117 = 45d */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1118 = 45e */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1119 = 45f */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1120 = 460 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1121 = 461 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1122 = 462 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1123 = 463 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1124 = 464 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1125 = 465 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1126 = 466 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1127 = 467 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1128 = 468 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1129 = 469 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1130 = 46a */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1131 = 46b */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1132 = 46c */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1133 = 46d */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1134 = 46e */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1135 = 46f */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1136 = 470 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1137 = 471 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1138 = 472 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1139 = 473 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1140 = 474 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1141 = 475 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1142 = 476 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1143 = 477 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1144 = 478 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1145 = 479 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1146 = 47a */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1147 = 47b */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1148 = 47c */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1149 = 47d */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1150 = 47e */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1151 = 47f */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1152 = 480 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1153 = 481 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1154 = 482 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1155 = 483 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1156 = 484 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1157 = 485 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1158 = 486 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1159 = 487 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1160 = 488 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1161 = 489 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1162 = 48a */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1163 = 48b */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1164 = 48c */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1165 = 48d */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1166 = 48e */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1167 = 48f */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1168 = 490 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1169 = 491 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1170 = 492 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1171 = 493 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1172 = 494 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1173 = 495 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1174 = 496 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1175 = 497 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1176 = 498 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1177 = 499 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1178 = 49a */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1179 = 49b */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1180 = 49c */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1181 = 49d */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1182 = 49e */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1183 = 49f */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1184 = 4a0 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1185 = 4a1 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1186 = 4a2 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1187 = 4a3 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1188 = 4a4 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1189 = 4a5 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1190 = 4a6 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1191 = 4a7 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1192 = 4a8 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1193 = 4a9 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1194 = 4aa */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1195 = 4ab */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1196 = 4ac */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1197 = 4ad */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1198 = 4ae */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1199 = 4af */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1200 = 4b0 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1201 = 4b1 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1202 = 4b2 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1203 = 4b3 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1204 = 4b4 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1205 = 4b5 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1206 = 4b6 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1207 = 4b7 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1208 = 4b8 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1209 = 4b9 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1210 = 4ba */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1211 = 4bb */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1212 = 4bc */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1213 = 4bd */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1214 = 4be */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1215 = 4bf */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1216 = 4c0 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1217 = 4c1 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1218 = 4c2 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1219 = 4c3 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1220 = 4c4 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1221 = 4c5 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1222 = 4c6 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1223 = 4c7 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1224 = 4c8 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1225 = 4c9 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1226 = 4ca */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1227 = 4cb */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1228 = 4cc */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1229 = 4cd */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1230 = 4ce */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1231 = 4cf */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1232 = 4d0 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1233 = 4d1 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1234 = 4d2 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1235 = 4d3 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1236 = 4d4 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1237 = 4d5 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1238 = 4d6 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1239 = 4d7 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1240 = 4d8 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1241 = 4d9 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1242 = 4da */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1243 = 4db */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1244 = 4dc */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1245 = 4dd */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1246 = 4de */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1247 = 4df */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1248 = 4e0 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1249 = 4e1 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1250 = 4e2 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1251 = 4e3 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1252 = 4e4 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1253 = 4e5 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1254 = 4e6 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1255 = 4e7 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1256 = 4e8 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1257 = 4e9 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1258 = 4ea */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1259 = 4eb */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1260 = 4ec */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1261 = 4ed */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1262 = 4ee */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1263 = 4ef */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1264 = 4f0 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1265 = 4f1 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1266 = 4f2 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1267 = 4f3 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1268 = 4f4 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1269 = 4f5 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1270 = 4f6 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1271 = 4f7 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1272 = 4f8 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1273 = 4f9 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1274 = 4fa */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1275 = 4fb */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1276 = 4fc */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1277 = 4fd */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1278 = 4fe */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1279 = 4ff */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1280 = 500 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1281 = 501 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1282 = 502 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1283 = 503 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1284 = 504 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1285 = 505 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1286 = 506 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1287 = 507 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1288 = 508 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1289 = 509 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1290 = 50a */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1291 = 50b */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1292 = 50c */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1293 = 50d */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1294 = 50e */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1295 = 50f */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1296 = 510 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1297 = 511 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1298 = 512 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1299 = 513 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1300 = 514 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1301 = 515 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1302 = 516 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1303 = 517 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1304 = 518 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1305 = 519 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1306 = 51a */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1307 = 51b */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1308 = 51c */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1309 = 51d */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1310 = 51e */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1311 = 51f */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1312 = 520 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1313 = 521 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1314 = 522 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1315 = 523 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1316 = 524 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1317 = 525 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1318 = 526 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1319 = 527 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1320 = 528 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1321 = 529 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1322 = 52a */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1323 = 52b */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1324 = 52c */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1325 = 52d */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1326 = 52e */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1327 = 52f */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1328 = 530 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1329 = 531 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1330 = 532 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1331 = 533 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1332 = 534 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1333 = 535 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1334 = 536 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1335 = 537 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1336 = 538 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1337 = 539 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1338 = 53a */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1339 = 53b */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1340 = 53c */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1341 = 53d */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1342 = 53e */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1343 = 53f */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1344 = 540 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1345 = 541 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1346 = 542 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1347 = 543 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1348 = 544 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1349 = 545 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1350 = 546 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1351 = 547 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1352 = 548 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1353 = 549 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1354 = 54a */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1355 = 54b */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1356 = 54c */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1357 = 54d */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1358 = 54e */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1359 = 54f */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1360 = 550 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1361 = 551 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1362 = 552 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1363 = 553 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1364 = 554 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1365 = 555 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1366 = 556 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1367 = 557 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1368 = 558 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1369 = 559 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1370 = 55a */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1371 = 55b */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1372 = 55c */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1373 = 55d */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1374 = 55e */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1375 = 55f */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1376 = 560 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1377 = 561 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1378 = 562 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1379 = 563 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1380 = 564 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1381 = 565 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1382 = 566 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1383 = 567 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1384 = 568 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1385 = 569 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1386 = 56a */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1387 = 56b */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1388 = 56c */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1389 = 56d */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1390 = 56e */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1391 = 56f */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1392 = 570 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1393 = 571 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1394 = 572 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1395 = 573 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1396 = 574 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1397 = 575 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1398 = 576 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1399 = 577 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1400 = 578 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1401 = 579 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1402 = 57a */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1403 = 57b */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1404 = 57c */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1405 = 57d */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1406 = 57e */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1407 = 57f */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1408 = 580 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1409 = 581 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1410 = 582 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1411 = 583 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1412 = 584 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1413 = 585 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1414 = 586 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1415 = 587 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1416 = 588 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1417 = 589 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1418 = 58a */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1419 = 58b */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1420 = 58c */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1421 = 58d */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1422 = 58e */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1423 = 58f */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1424 = 590 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1425 = 591 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1426 = 592 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1427 = 593 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1428 = 594 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1429 = 595 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1430 = 596 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1431 = 597 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1432 = 598 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1433 = 599 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1434 = 59a */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1435 = 59b */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1436 = 59c */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1437 = 59d */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1438 = 59e */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1439 = 59f */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1440 = 5a0 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1441 = 5a1 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1442 = 5a2 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1443 = 5a3 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1444 = 5a4 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1445 = 5a5 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1446 = 5a6 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1447 = 5a7 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1448 = 5a8 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1449 = 5a9 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1450 = 5aa */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1451 = 5ab */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1452 = 5ac */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1453 = 5ad */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1454 = 5ae */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1455 = 5af */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1456 = 5b0 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1457 = 5b1 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1458 = 5b2 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1459 = 5b3 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1460 = 5b4 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1461 = 5b5 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1462 = 5b6 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1463 = 5b7 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1464 = 5b8 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1465 = 5b9 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1466 = 5ba */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1467 = 5bb */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1468 = 5bc */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1469 = 5bd */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1470 = 5be */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1471 = 5bf */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1472 = 5c0 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1473 = 5c1 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1474 = 5c2 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1475 = 5c3 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1476 = 5c4 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1477 = 5c5 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1478 = 5c6 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1479 = 5c7 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1480 = 5c8 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1481 = 5c9 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1482 = 5ca */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1483 = 5cb */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1484 = 5cc */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1485 = 5cd */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1486 = 5ce */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1487 = 5cf */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1488 = 5d0 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1489 = 5d1 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1490 = 5d2 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1491 = 5d3 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1492 = 5d4 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1493 = 5d5 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1494 = 5d6 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1495 = 5d7 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1496 = 5d8 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1497 = 5d9 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1498 = 5da */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1499 = 5db */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1500 = 5dc */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1501 = 5dd */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1502 = 5de */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1503 = 5df */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1504 = 5e0 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1505 = 5e1 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1506 = 5e2 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1507 = 5e3 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1508 = 5e4 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1509 = 5e5 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1510 = 5e6 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1511 = 5e7 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1512 = 5e8 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1513 = 5e9 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1514 = 5ea */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1515 = 5eb */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1516 = 5ec */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1517 = 5ed */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1518 = 5ee */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1519 = 5ef */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1520 = 5f0 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1521 = 5f1 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1522 = 5f2 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1523 = 5f3 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1524 = 5f4 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1525 = 5f5 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1526 = 5f6 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1527 = 5f7 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1528 = 5f8 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1529 = 5f9 */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1530 = 5fa */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1531 = 5fb */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1532 = 5fc */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1533 = 5fd */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1534 = 5fe */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1535 = 5ff */ {6, 0, 4}, /* 0x0002 => 0x0400+(512)*/ + /* 1536 = 600 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1537 = 601 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1538 = 602 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1539 = 603 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1540 = 604 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1541 = 605 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1542 = 606 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1543 = 607 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1544 = 608 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1545 = 609 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1546 = 60a */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1547 = 60b */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1548 = 60c */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1549 = 60d */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1550 = 60e */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1551 = 60f */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1552 = 610 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1553 = 611 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1554 = 612 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1555 = 613 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1556 = 614 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1557 = 615 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1558 = 616 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1559 = 617 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1560 = 618 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1561 = 619 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1562 = 61a */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1563 = 61b */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1564 = 61c */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1565 = 61d */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1566 = 61e */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1567 = 61f */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1568 = 620 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1569 = 621 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1570 = 622 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1571 = 623 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1572 = 624 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1573 = 625 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1574 = 626 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1575 = 627 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1576 = 628 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1577 = 629 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1578 = 62a */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1579 = 62b */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1580 = 62c */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1581 = 62d */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1582 = 62e */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1583 = 62f */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1584 = 630 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1585 = 631 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1586 = 632 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1587 = 633 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1588 = 634 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1589 = 635 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1590 = 636 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1591 = 637 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1592 = 638 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1593 = 639 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1594 = 63a */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1595 = 63b */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1596 = 63c */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1597 = 63d */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1598 = 63e */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1599 = 63f */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1600 = 640 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1601 = 641 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1602 = 642 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1603 = 643 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1604 = 644 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1605 = 645 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1606 = 646 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1607 = 647 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1608 = 648 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1609 = 649 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1610 = 64a */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1611 = 64b */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1612 = 64c */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1613 = 64d */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1614 = 64e */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1615 = 64f */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1616 = 650 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1617 = 651 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1618 = 652 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1619 = 653 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1620 = 654 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1621 = 655 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1622 = 656 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1623 = 657 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1624 = 658 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1625 = 659 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1626 = 65a */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1627 = 65b */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1628 = 65c */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1629 = 65d */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1630 = 65e */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1631 = 65f */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1632 = 660 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1633 = 661 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1634 = 662 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1635 = 663 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1636 = 664 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1637 = 665 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1638 = 666 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1639 = 667 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1640 = 668 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1641 = 669 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1642 = 66a */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1643 = 66b */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1644 = 66c */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1645 = 66d */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1646 = 66e */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1647 = 66f */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1648 = 670 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1649 = 671 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1650 = 672 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1651 = 673 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1652 = 674 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1653 = 675 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1654 = 676 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1655 = 677 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1656 = 678 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1657 = 679 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1658 = 67a */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1659 = 67b */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1660 = 67c */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1661 = 67d */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1662 = 67e */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1663 = 67f */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1664 = 680 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1665 = 681 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1666 = 682 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1667 = 683 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1668 = 684 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1669 = 685 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1670 = 686 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1671 = 687 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1672 = 688 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1673 = 689 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1674 = 68a */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1675 = 68b */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1676 = 68c */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1677 = 68d */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1678 = 68e */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1679 = 68f */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1680 = 690 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1681 = 691 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1682 = 692 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1683 = 693 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1684 = 694 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1685 = 695 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1686 = 696 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1687 = 697 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1688 = 698 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1689 = 699 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1690 = 69a */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1691 = 69b */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1692 = 69c */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1693 = 69d */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1694 = 69e */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1695 = 69f */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1696 = 6a0 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1697 = 6a1 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1698 = 6a2 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1699 = 6a3 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1700 = 6a4 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1701 = 6a5 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1702 = 6a6 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1703 = 6a7 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1704 = 6a8 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1705 = 6a9 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1706 = 6aa */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1707 = 6ab */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1708 = 6ac */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1709 = 6ad */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1710 = 6ae */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1711 = 6af */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1712 = 6b0 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1713 = 6b1 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1714 = 6b2 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1715 = 6b3 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1716 = 6b4 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1717 = 6b5 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1718 = 6b6 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1719 = 6b7 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1720 = 6b8 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1721 = 6b9 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1722 = 6ba */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1723 = 6bb */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1724 = 6bc */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1725 = 6bd */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1726 = 6be */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1727 = 6bf */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1728 = 6c0 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1729 = 6c1 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1730 = 6c2 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1731 = 6c3 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1732 = 6c4 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1733 = 6c5 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1734 = 6c6 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1735 = 6c7 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1736 = 6c8 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1737 = 6c9 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1738 = 6ca */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1739 = 6cb */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1740 = 6cc */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1741 = 6cd */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1742 = 6ce */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1743 = 6cf */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1744 = 6d0 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1745 = 6d1 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1746 = 6d2 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1747 = 6d3 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1748 = 6d4 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1749 = 6d5 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1750 = 6d6 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1751 = 6d7 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1752 = 6d8 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1753 = 6d9 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1754 = 6da */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1755 = 6db */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1756 = 6dc */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1757 = 6dd */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1758 = 6de */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1759 = 6df */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1760 = 6e0 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1761 = 6e1 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1762 = 6e2 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1763 = 6e3 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1764 = 6e4 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1765 = 6e5 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1766 = 6e6 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1767 = 6e7 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1768 = 6e8 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1769 = 6e9 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1770 = 6ea */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1771 = 6eb */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1772 = 6ec */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1773 = 6ed */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1774 = 6ee */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1775 = 6ef */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1776 = 6f0 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1777 = 6f1 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1778 = 6f2 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1779 = 6f3 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1780 = 6f4 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1781 = 6f5 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1782 = 6f6 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1783 = 6f7 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1784 = 6f8 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1785 = 6f9 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1786 = 6fa */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1787 = 6fb */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1788 = 6fc */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1789 = 6fd */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1790 = 6fe */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1791 = 6ff */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1792 = 700 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1793 = 701 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1794 = 702 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1795 = 703 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1796 = 704 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1797 = 705 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1798 = 706 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1799 = 707 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1800 = 708 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1801 = 709 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1802 = 70a */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1803 = 70b */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1804 = 70c */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1805 = 70d */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1806 = 70e */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1807 = 70f */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1808 = 710 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1809 = 711 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1810 = 712 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1811 = 713 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1812 = 714 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1813 = 715 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1814 = 716 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1815 = 717 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1816 = 718 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1817 = 719 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1818 = 71a */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1819 = 71b */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1820 = 71c */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1821 = 71d */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1822 = 71e */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1823 = 71f */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1824 = 720 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1825 = 721 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1826 = 722 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1827 = 723 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1828 = 724 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1829 = 725 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1830 = 726 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1831 = 727 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1832 = 728 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1833 = 729 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1834 = 72a */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1835 = 72b */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1836 = 72c */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1837 = 72d */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1838 = 72e */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1839 = 72f */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1840 = 730 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1841 = 731 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1842 = 732 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1843 = 733 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1844 = 734 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1845 = 735 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1846 = 736 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1847 = 737 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1848 = 738 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1849 = 739 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1850 = 73a */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1851 = 73b */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1852 = 73c */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1853 = 73d */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1854 = 73e */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1855 = 73f */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1856 = 740 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1857 = 741 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1858 = 742 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1859 = 743 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1860 = 744 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1861 = 745 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1862 = 746 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1863 = 747 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1864 = 748 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1865 = 749 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1866 = 74a */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1867 = 74b */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1868 = 74c */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1869 = 74d */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1870 = 74e */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1871 = 74f */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1872 = 750 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1873 = 751 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1874 = 752 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1875 = 753 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1876 = 754 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1877 = 755 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1878 = 756 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1879 = 757 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1880 = 758 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1881 = 759 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1882 = 75a */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1883 = 75b */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1884 = 75c */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1885 = 75d */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1886 = 75e */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1887 = 75f */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1888 = 760 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1889 = 761 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1890 = 762 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1891 = 763 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1892 = 764 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1893 = 765 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1894 = 766 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1895 = 767 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1896 = 768 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1897 = 769 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1898 = 76a */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1899 = 76b */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1900 = 76c */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1901 = 76d */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1902 = 76e */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1903 = 76f */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1904 = 770 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1905 = 771 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1906 = 772 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1907 = 773 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1908 = 774 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1909 = 775 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1910 = 776 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1911 = 777 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1912 = 778 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1913 = 779 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1914 = 77a */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1915 = 77b */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1916 = 77c */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1917 = 77d */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1918 = 77e */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1919 = 77f */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1920 = 780 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1921 = 781 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1922 = 782 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1923 = 783 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1924 = 784 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1925 = 785 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1926 = 786 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1927 = 787 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1928 = 788 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1929 = 789 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1930 = 78a */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1931 = 78b */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1932 = 78c */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1933 = 78d */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1934 = 78e */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1935 = 78f */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1936 = 790 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1937 = 791 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1938 = 792 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1939 = 793 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1940 = 794 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1941 = 795 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1942 = 796 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1943 = 797 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1944 = 798 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1945 = 799 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1946 = 79a */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1947 = 79b */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1948 = 79c */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1949 = 79d */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1950 = 79e */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1951 = 79f */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1952 = 7a0 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1953 = 7a1 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1954 = 7a2 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1955 = 7a3 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1956 = 7a4 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1957 = 7a5 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1958 = 7a6 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1959 = 7a7 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1960 = 7a8 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1961 = 7a9 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1962 = 7aa */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1963 = 7ab */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1964 = 7ac */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1965 = 7ad */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1966 = 7ae */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1967 = 7af */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1968 = 7b0 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1969 = 7b1 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1970 = 7b2 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1971 = 7b3 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1972 = 7b4 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1973 = 7b5 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1974 = 7b6 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1975 = 7b7 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1976 = 7b8 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1977 = 7b9 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1978 = 7ba */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1979 = 7bb */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1980 = 7bc */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1981 = 7bd */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1982 = 7be */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1983 = 7bf */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1984 = 7c0 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1985 = 7c1 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1986 = 7c2 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1987 = 7c3 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1988 = 7c4 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1989 = 7c5 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1990 = 7c6 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1991 = 7c7 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1992 = 7c8 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1993 = 7c9 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1994 = 7ca */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1995 = 7cb */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1996 = 7cc */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1997 = 7cd */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1998 = 7ce */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 1999 = 7cf */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2000 = 7d0 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2001 = 7d1 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2002 = 7d2 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2003 = 7d3 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2004 = 7d4 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2005 = 7d5 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2006 = 7d6 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2007 = 7d7 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2008 = 7d8 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2009 = 7d9 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2010 = 7da */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2011 = 7db */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2012 = 7dc */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2013 = 7dd */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2014 = 7de */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2015 = 7df */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2016 = 7e0 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2017 = 7e1 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2018 = 7e2 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2019 = 7e3 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2020 = 7e4 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2021 = 7e5 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2022 = 7e6 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2023 = 7e7 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2024 = 7e8 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2025 = 7e9 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2026 = 7ea */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2027 = 7eb */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2028 = 7ec */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2029 = 7ed */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2030 = 7ee */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2031 = 7ef */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2032 = 7f0 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2033 = 7f1 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2034 = 7f2 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2035 = 7f3 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2036 = 7f4 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2037 = 7f5 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2038 = 7f6 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2039 = 7f7 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2040 = 7f8 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2041 = 7f9 */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2042 = 7fa */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2043 = 7fb */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2044 = 7fc */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2045 = 7fd */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2046 = 7fe */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2047 = 7ff */ {5, 0, 4}, /* 0x0003 => 0x0600+(512)*/ + /* 2048 = 800 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2049 = 801 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2050 = 802 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2051 = 803 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2052 = 804 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2053 = 805 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2054 = 806 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2055 = 807 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2056 = 808 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2057 = 809 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2058 = 80a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2059 = 80b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2060 = 80c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2061 = 80d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2062 = 80e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2063 = 80f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2064 = 810 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2065 = 811 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2066 = 812 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2067 = 813 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2068 = 814 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2069 = 815 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2070 = 816 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2071 = 817 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2072 = 818 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2073 = 819 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2074 = 81a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2075 = 81b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2076 = 81c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2077 = 81d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2078 = 81e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2079 = 81f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2080 = 820 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2081 = 821 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2082 = 822 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2083 = 823 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2084 = 824 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2085 = 825 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2086 = 826 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2087 = 827 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2088 = 828 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2089 = 829 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2090 = 82a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2091 = 82b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2092 = 82c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2093 = 82d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2094 = 82e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2095 = 82f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2096 = 830 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2097 = 831 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2098 = 832 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2099 = 833 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2100 = 834 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2101 = 835 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2102 = 836 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2103 = 837 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2104 = 838 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2105 = 839 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2106 = 83a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2107 = 83b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2108 = 83c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2109 = 83d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2110 = 83e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2111 = 83f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2112 = 840 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2113 = 841 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2114 = 842 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2115 = 843 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2116 = 844 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2117 = 845 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2118 = 846 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2119 = 847 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2120 = 848 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2121 = 849 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2122 = 84a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2123 = 84b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2124 = 84c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2125 = 84d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2126 = 84e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2127 = 84f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2128 = 850 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2129 = 851 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2130 = 852 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2131 = 853 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2132 = 854 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2133 = 855 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2134 = 856 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2135 = 857 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2136 = 858 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2137 = 859 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2138 = 85a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2139 = 85b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2140 = 85c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2141 = 85d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2142 = 85e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2143 = 85f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2144 = 860 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2145 = 861 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2146 = 862 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2147 = 863 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2148 = 864 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2149 = 865 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2150 = 866 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2151 = 867 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2152 = 868 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2153 = 869 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2154 = 86a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2155 = 86b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2156 = 86c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2157 = 86d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2158 = 86e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2159 = 86f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2160 = 870 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2161 = 871 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2162 = 872 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2163 = 873 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2164 = 874 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2165 = 875 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2166 = 876 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2167 = 877 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2168 = 878 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2169 = 879 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2170 = 87a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2171 = 87b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2172 = 87c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2173 = 87d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2174 = 87e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2175 = 87f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2176 = 880 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2177 = 881 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2178 = 882 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2179 = 883 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2180 = 884 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2181 = 885 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2182 = 886 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2183 = 887 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2184 = 888 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2185 = 889 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2186 = 88a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2187 = 88b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2188 = 88c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2189 = 88d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2190 = 88e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2191 = 88f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2192 = 890 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2193 = 891 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2194 = 892 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2195 = 893 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2196 = 894 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2197 = 895 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2198 = 896 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2199 = 897 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2200 = 898 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2201 = 899 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2202 = 89a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2203 = 89b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2204 = 89c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2205 = 89d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2206 = 89e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2207 = 89f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2208 = 8a0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2209 = 8a1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2210 = 8a2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2211 = 8a3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2212 = 8a4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2213 = 8a5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2214 = 8a6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2215 = 8a7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2216 = 8a8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2217 = 8a9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2218 = 8aa */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2219 = 8ab */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2220 = 8ac */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2221 = 8ad */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2222 = 8ae */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2223 = 8af */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2224 = 8b0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2225 = 8b1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2226 = 8b2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2227 = 8b3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2228 = 8b4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2229 = 8b5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2230 = 8b6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2231 = 8b7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2232 = 8b8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2233 = 8b9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2234 = 8ba */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2235 = 8bb */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2236 = 8bc */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2237 = 8bd */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2238 = 8be */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2239 = 8bf */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2240 = 8c0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2241 = 8c1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2242 = 8c2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2243 = 8c3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2244 = 8c4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2245 = 8c5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2246 = 8c6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2247 = 8c7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2248 = 8c8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2249 = 8c9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2250 = 8ca */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2251 = 8cb */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2252 = 8cc */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2253 = 8cd */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2254 = 8ce */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2255 = 8cf */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2256 = 8d0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2257 = 8d1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2258 = 8d2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2259 = 8d3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2260 = 8d4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2261 = 8d5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2262 = 8d6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2263 = 8d7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2264 = 8d8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2265 = 8d9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2266 = 8da */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2267 = 8db */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2268 = 8dc */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2269 = 8dd */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2270 = 8de */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2271 = 8df */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2272 = 8e0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2273 = 8e1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2274 = 8e2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2275 = 8e3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2276 = 8e4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2277 = 8e5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2278 = 8e6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2279 = 8e7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2280 = 8e8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2281 = 8e9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2282 = 8ea */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2283 = 8eb */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2284 = 8ec */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2285 = 8ed */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2286 = 8ee */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2287 = 8ef */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2288 = 8f0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2289 = 8f1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2290 = 8f2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2291 = 8f3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2292 = 8f4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2293 = 8f5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2294 = 8f6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2295 = 8f7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2296 = 8f8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2297 = 8f9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2298 = 8fa */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2299 = 8fb */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2300 = 8fc */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2301 = 8fd */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2302 = 8fe */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2303 = 8ff */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2304 = 900 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2305 = 901 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2306 = 902 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2307 = 903 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2308 = 904 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2309 = 905 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2310 = 906 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2311 = 907 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2312 = 908 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2313 = 909 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2314 = 90a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2315 = 90b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2316 = 90c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2317 = 90d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2318 = 90e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2319 = 90f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2320 = 910 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2321 = 911 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2322 = 912 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2323 = 913 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2324 = 914 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2325 = 915 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2326 = 916 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2327 = 917 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2328 = 918 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2329 = 919 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2330 = 91a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2331 = 91b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2332 = 91c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2333 = 91d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2334 = 91e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2335 = 91f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2336 = 920 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2337 = 921 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2338 = 922 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2339 = 923 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2340 = 924 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2341 = 925 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2342 = 926 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2343 = 927 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2344 = 928 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2345 = 929 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2346 = 92a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2347 = 92b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2348 = 92c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2349 = 92d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2350 = 92e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2351 = 92f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2352 = 930 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2353 = 931 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2354 = 932 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2355 = 933 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2356 = 934 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2357 = 935 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2358 = 936 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2359 = 937 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2360 = 938 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2361 = 939 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2362 = 93a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2363 = 93b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2364 = 93c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2365 = 93d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2366 = 93e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2367 = 93f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2368 = 940 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2369 = 941 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2370 = 942 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2371 = 943 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2372 = 944 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2373 = 945 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2374 = 946 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2375 = 947 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2376 = 948 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2377 = 949 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2378 = 94a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2379 = 94b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2380 = 94c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2381 = 94d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2382 = 94e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2383 = 94f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2384 = 950 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2385 = 951 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2386 = 952 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2387 = 953 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2388 = 954 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2389 = 955 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2390 = 956 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2391 = 957 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2392 = 958 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2393 = 959 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2394 = 95a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2395 = 95b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2396 = 95c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2397 = 95d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2398 = 95e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2399 = 95f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2400 = 960 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2401 = 961 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2402 = 962 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2403 = 963 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2404 = 964 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2405 = 965 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2406 = 966 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2407 = 967 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2408 = 968 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2409 = 969 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2410 = 96a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2411 = 96b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2412 = 96c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2413 = 96d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2414 = 96e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2415 = 96f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2416 = 970 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2417 = 971 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2418 = 972 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2419 = 973 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2420 = 974 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2421 = 975 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2422 = 976 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2423 = 977 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2424 = 978 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2425 = 979 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2426 = 97a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2427 = 97b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2428 = 97c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2429 = 97d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2430 = 97e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2431 = 97f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2432 = 980 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2433 = 981 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2434 = 982 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2435 = 983 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2436 = 984 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2437 = 985 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2438 = 986 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2439 = 987 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2440 = 988 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2441 = 989 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2442 = 98a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2443 = 98b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2444 = 98c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2445 = 98d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2446 = 98e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2447 = 98f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2448 = 990 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2449 = 991 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2450 = 992 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2451 = 993 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2452 = 994 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2453 = 995 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2454 = 996 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2455 = 997 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2456 = 998 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2457 = 999 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2458 = 99a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2459 = 99b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2460 = 99c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2461 = 99d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2462 = 99e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2463 = 99f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2464 = 9a0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2465 = 9a1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2466 = 9a2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2467 = 9a3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2468 = 9a4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2469 = 9a5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2470 = 9a6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2471 = 9a7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2472 = 9a8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2473 = 9a9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2474 = 9aa */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2475 = 9ab */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2476 = 9ac */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2477 = 9ad */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2478 = 9ae */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2479 = 9af */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2480 = 9b0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2481 = 9b1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2482 = 9b2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2483 = 9b3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2484 = 9b4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2485 = 9b5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2486 = 9b6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2487 = 9b7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2488 = 9b8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2489 = 9b9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2490 = 9ba */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2491 = 9bb */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2492 = 9bc */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2493 = 9bd */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2494 = 9be */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2495 = 9bf */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2496 = 9c0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2497 = 9c1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2498 = 9c2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2499 = 9c3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2500 = 9c4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2501 = 9c5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2502 = 9c6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2503 = 9c7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2504 = 9c8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2505 = 9c9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2506 = 9ca */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2507 = 9cb */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2508 = 9cc */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2509 = 9cd */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2510 = 9ce */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2511 = 9cf */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2512 = 9d0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2513 = 9d1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2514 = 9d2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2515 = 9d3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2516 = 9d4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2517 = 9d5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2518 = 9d6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2519 = 9d7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2520 = 9d8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2521 = 9d9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2522 = 9da */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2523 = 9db */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2524 = 9dc */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2525 = 9dd */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2526 = 9de */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2527 = 9df */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2528 = 9e0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2529 = 9e1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2530 = 9e2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2531 = 9e3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2532 = 9e4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2533 = 9e5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2534 = 9e6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2535 = 9e7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2536 = 9e8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2537 = 9e9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2538 = 9ea */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2539 = 9eb */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2540 = 9ec */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2541 = 9ed */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2542 = 9ee */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2543 = 9ef */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2544 = 9f0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2545 = 9f1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2546 = 9f2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2547 = 9f3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2548 = 9f4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2549 = 9f5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2550 = 9f6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2551 = 9f7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2552 = 9f8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2553 = 9f9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2554 = 9fa */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2555 = 9fb */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2556 = 9fc */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2557 = 9fd */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2558 = 9fe */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2559 = 9ff */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2560 = a00 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2561 = a01 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2562 = a02 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2563 = a03 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2564 = a04 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2565 = a05 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2566 = a06 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2567 = a07 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2568 = a08 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2569 = a09 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2570 = a0a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2571 = a0b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2572 = a0c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2573 = a0d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2574 = a0e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2575 = a0f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2576 = a10 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2577 = a11 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2578 = a12 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2579 = a13 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2580 = a14 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2581 = a15 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2582 = a16 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2583 = a17 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2584 = a18 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2585 = a19 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2586 = a1a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2587 = a1b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2588 = a1c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2589 = a1d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2590 = a1e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2591 = a1f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2592 = a20 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2593 = a21 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2594 = a22 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2595 = a23 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2596 = a24 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2597 = a25 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2598 = a26 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2599 = a27 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2600 = a28 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2601 = a29 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2602 = a2a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2603 = a2b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2604 = a2c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2605 = a2d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2606 = a2e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2607 = a2f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2608 = a30 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2609 = a31 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2610 = a32 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2611 = a33 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2612 = a34 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2613 = a35 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2614 = a36 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2615 = a37 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2616 = a38 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2617 = a39 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2618 = a3a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2619 = a3b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2620 = a3c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2621 = a3d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2622 = a3e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2623 = a3f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2624 = a40 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2625 = a41 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2626 = a42 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2627 = a43 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2628 = a44 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2629 = a45 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2630 = a46 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2631 = a47 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2632 = a48 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2633 = a49 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2634 = a4a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2635 = a4b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2636 = a4c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2637 = a4d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2638 = a4e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2639 = a4f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2640 = a50 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2641 = a51 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2642 = a52 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2643 = a53 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2644 = a54 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2645 = a55 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2646 = a56 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2647 = a57 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2648 = a58 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2649 = a59 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2650 = a5a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2651 = a5b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2652 = a5c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2653 = a5d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2654 = a5e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2655 = a5f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2656 = a60 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2657 = a61 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2658 = a62 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2659 = a63 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2660 = a64 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2661 = a65 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2662 = a66 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2663 = a67 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2664 = a68 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2665 = a69 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2666 = a6a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2667 = a6b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2668 = a6c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2669 = a6d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2670 = a6e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2671 = a6f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2672 = a70 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2673 = a71 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2674 = a72 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2675 = a73 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2676 = a74 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2677 = a75 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2678 = a76 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2679 = a77 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2680 = a78 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2681 = a79 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2682 = a7a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2683 = a7b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2684 = a7c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2685 = a7d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2686 = a7e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2687 = a7f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2688 = a80 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2689 = a81 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2690 = a82 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2691 = a83 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2692 = a84 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2693 = a85 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2694 = a86 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2695 = a87 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2696 = a88 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2697 = a89 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2698 = a8a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2699 = a8b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2700 = a8c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2701 = a8d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2702 = a8e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2703 = a8f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2704 = a90 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2705 = a91 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2706 = a92 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2707 = a93 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2708 = a94 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2709 = a95 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2710 = a96 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2711 = a97 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2712 = a98 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2713 = a99 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2714 = a9a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2715 = a9b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2716 = a9c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2717 = a9d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2718 = a9e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2719 = a9f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2720 = aa0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2721 = aa1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2722 = aa2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2723 = aa3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2724 = aa4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2725 = aa5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2726 = aa6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2727 = aa7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2728 = aa8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2729 = aa9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2730 = aaa */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2731 = aab */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2732 = aac */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2733 = aad */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2734 = aae */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2735 = aaf */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2736 = ab0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2737 = ab1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2738 = ab2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2739 = ab3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2740 = ab4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2741 = ab5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2742 = ab6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2743 = ab7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2744 = ab8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2745 = ab9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2746 = aba */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2747 = abb */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2748 = abc */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2749 = abd */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2750 = abe */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2751 = abf */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2752 = ac0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2753 = ac1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2754 = ac2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2755 = ac3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2756 = ac4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2757 = ac5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2758 = ac6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2759 = ac7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2760 = ac8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2761 = ac9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2762 = aca */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2763 = acb */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2764 = acc */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2765 = acd */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2766 = ace */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2767 = acf */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2768 = ad0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2769 = ad1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2770 = ad2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2771 = ad3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2772 = ad4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2773 = ad5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2774 = ad6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2775 = ad7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2776 = ad8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2777 = ad9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2778 = ada */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2779 = adb */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2780 = adc */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2781 = add */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2782 = ade */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2783 = adf */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2784 = ae0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2785 = ae1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2786 = ae2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2787 = ae3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2788 = ae4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2789 = ae5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2790 = ae6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2791 = ae7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2792 = ae8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2793 = ae9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2794 = aea */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2795 = aeb */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2796 = aec */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2797 = aed */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2798 = aee */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2799 = aef */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2800 = af0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2801 = af1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2802 = af2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2803 = af3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2804 = af4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2805 = af5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2806 = af6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2807 = af7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2808 = af8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2809 = af9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2810 = afa */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2811 = afb */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2812 = afc */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2813 = afd */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2814 = afe */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2815 = aff */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2816 = b00 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2817 = b01 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2818 = b02 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2819 = b03 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2820 = b04 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2821 = b05 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2822 = b06 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2823 = b07 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2824 = b08 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2825 = b09 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2826 = b0a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2827 = b0b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2828 = b0c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2829 = b0d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2830 = b0e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2831 = b0f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2832 = b10 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2833 = b11 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2834 = b12 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2835 = b13 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2836 = b14 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2837 = b15 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2838 = b16 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2839 = b17 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2840 = b18 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2841 = b19 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2842 = b1a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2843 = b1b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2844 = b1c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2845 = b1d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2846 = b1e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2847 = b1f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2848 = b20 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2849 = b21 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2850 = b22 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2851 = b23 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2852 = b24 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2853 = b25 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2854 = b26 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2855 = b27 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2856 = b28 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2857 = b29 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2858 = b2a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2859 = b2b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2860 = b2c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2861 = b2d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2862 = b2e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2863 = b2f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2864 = b30 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2865 = b31 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2866 = b32 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2867 = b33 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2868 = b34 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2869 = b35 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2870 = b36 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2871 = b37 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2872 = b38 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2873 = b39 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2874 = b3a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2875 = b3b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2876 = b3c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2877 = b3d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2878 = b3e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2879 = b3f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2880 = b40 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2881 = b41 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2882 = b42 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2883 = b43 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2884 = b44 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2885 = b45 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2886 = b46 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2887 = b47 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2888 = b48 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2889 = b49 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2890 = b4a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2891 = b4b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2892 = b4c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2893 = b4d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2894 = b4e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2895 = b4f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2896 = b50 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2897 = b51 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2898 = b52 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2899 = b53 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2900 = b54 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2901 = b55 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2902 = b56 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2903 = b57 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2904 = b58 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2905 = b59 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2906 = b5a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2907 = b5b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2908 = b5c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2909 = b5d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2910 = b5e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2911 = b5f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2912 = b60 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2913 = b61 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2914 = b62 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2915 = b63 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2916 = b64 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2917 = b65 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2918 = b66 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2919 = b67 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2920 = b68 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2921 = b69 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2922 = b6a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2923 = b6b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2924 = b6c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2925 = b6d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2926 = b6e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2927 = b6f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2928 = b70 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2929 = b71 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2930 = b72 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2931 = b73 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2932 = b74 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2933 = b75 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2934 = b76 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2935 = b77 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2936 = b78 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2937 = b79 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2938 = b7a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2939 = b7b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2940 = b7c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2941 = b7d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2942 = b7e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2943 = b7f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2944 = b80 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2945 = b81 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2946 = b82 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2947 = b83 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2948 = b84 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2949 = b85 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2950 = b86 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2951 = b87 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2952 = b88 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2953 = b89 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2954 = b8a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2955 = b8b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2956 = b8c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2957 = b8d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2958 = b8e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2959 = b8f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2960 = b90 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2961 = b91 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2962 = b92 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2963 = b93 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2964 = b94 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2965 = b95 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2966 = b96 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2967 = b97 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2968 = b98 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2969 = b99 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2970 = b9a */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2971 = b9b */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2972 = b9c */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2973 = b9d */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2974 = b9e */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2975 = b9f */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2976 = ba0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2977 = ba1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2978 = ba2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2979 = ba3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2980 = ba4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2981 = ba5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2982 = ba6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2983 = ba7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2984 = ba8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2985 = ba9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2986 = baa */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2987 = bab */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2988 = bac */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2989 = bad */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2990 = bae */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2991 = baf */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2992 = bb0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2993 = bb1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2994 = bb2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2995 = bb3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2996 = bb4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2997 = bb5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2998 = bb6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 2999 = bb7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3000 = bb8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3001 = bb9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3002 = bba */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3003 = bbb */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3004 = bbc */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3005 = bbd */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3006 = bbe */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3007 = bbf */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3008 = bc0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3009 = bc1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3010 = bc2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3011 = bc3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3012 = bc4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3013 = bc5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3014 = bc6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3015 = bc7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3016 = bc8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3017 = bc9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3018 = bca */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3019 = bcb */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3020 = bcc */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3021 = bcd */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3022 = bce */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3023 = bcf */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3024 = bd0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3025 = bd1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3026 = bd2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3027 = bd3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3028 = bd4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3029 = bd5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3030 = bd6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3031 = bd7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3032 = bd8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3033 = bd9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3034 = bda */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3035 = bdb */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3036 = bdc */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3037 = bdd */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3038 = bde */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3039 = bdf */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3040 = be0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3041 = be1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3042 = be2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3043 = be3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3044 = be4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3045 = be5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3046 = be6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3047 = be7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3048 = be8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3049 = be9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3050 = bea */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3051 = beb */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3052 = bec */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3053 = bed */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3054 = bee */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3055 = bef */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3056 = bf0 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3057 = bf1 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3058 = bf2 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3059 = bf3 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3060 = bf4 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3061 = bf5 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3062 = bf6 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3063 = bf7 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3064 = bf8 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3065 = bf9 */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3066 = bfa */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3067 = bfb */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3068 = bfc */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3069 = bfd */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3070 = bfe */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3071 = bff */ {1, 0, 3}, /* 0x0002 => 0x0800+(1024)*/ + /* 3072 = c00 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3073 = c01 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3074 = c02 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3075 = c03 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3076 = c04 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3077 = c05 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3078 = c06 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3079 = c07 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3080 = c08 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3081 = c09 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3082 = c0a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3083 = c0b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3084 = c0c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3085 = c0d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3086 = c0e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3087 = c0f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3088 = c10 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3089 = c11 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3090 = c12 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3091 = c13 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3092 = c14 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3093 = c15 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3094 = c16 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3095 = c17 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3096 = c18 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3097 = c19 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3098 = c1a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3099 = c1b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3100 = c1c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3101 = c1d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3102 = c1e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3103 = c1f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3104 = c20 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3105 = c21 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3106 = c22 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3107 = c23 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3108 = c24 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3109 = c25 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3110 = c26 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3111 = c27 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3112 = c28 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3113 = c29 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3114 = c2a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3115 = c2b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3116 = c2c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3117 = c2d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3118 = c2e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3119 = c2f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3120 = c30 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3121 = c31 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3122 = c32 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3123 = c33 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3124 = c34 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3125 = c35 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3126 = c36 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3127 = c37 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3128 = c38 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3129 = c39 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3130 = c3a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3131 = c3b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3132 = c3c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3133 = c3d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3134 = c3e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3135 = c3f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3136 = c40 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3137 = c41 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3138 = c42 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3139 = c43 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3140 = c44 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3141 = c45 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3142 = c46 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3143 = c47 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3144 = c48 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3145 = c49 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3146 = c4a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3147 = c4b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3148 = c4c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3149 = c4d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3150 = c4e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3151 = c4f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3152 = c50 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3153 = c51 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3154 = c52 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3155 = c53 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3156 = c54 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3157 = c55 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3158 = c56 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3159 = c57 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3160 = c58 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3161 = c59 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3162 = c5a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3163 = c5b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3164 = c5c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3165 = c5d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3166 = c5e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3167 = c5f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3168 = c60 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3169 = c61 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3170 = c62 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3171 = c63 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3172 = c64 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3173 = c65 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3174 = c66 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3175 = c67 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3176 = c68 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3177 = c69 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3178 = c6a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3179 = c6b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3180 = c6c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3181 = c6d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3182 = c6e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3183 = c6f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3184 = c70 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3185 = c71 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3186 = c72 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3187 = c73 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3188 = c74 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3189 = c75 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3190 = c76 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3191 = c77 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3192 = c78 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3193 = c79 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3194 = c7a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3195 = c7b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3196 = c7c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3197 = c7d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3198 = c7e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3199 = c7f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3200 = c80 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3201 = c81 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3202 = c82 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3203 = c83 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3204 = c84 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3205 = c85 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3206 = c86 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3207 = c87 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3208 = c88 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3209 = c89 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3210 = c8a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3211 = c8b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3212 = c8c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3213 = c8d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3214 = c8e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3215 = c8f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3216 = c90 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3217 = c91 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3218 = c92 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3219 = c93 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3220 = c94 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3221 = c95 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3222 = c96 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3223 = c97 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3224 = c98 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3225 = c99 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3226 = c9a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3227 = c9b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3228 = c9c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3229 = c9d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3230 = c9e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3231 = c9f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3232 = ca0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3233 = ca1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3234 = ca2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3235 = ca3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3236 = ca4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3237 = ca5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3238 = ca6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3239 = ca7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3240 = ca8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3241 = ca9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3242 = caa */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3243 = cab */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3244 = cac */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3245 = cad */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3246 = cae */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3247 = caf */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3248 = cb0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3249 = cb1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3250 = cb2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3251 = cb3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3252 = cb4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3253 = cb5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3254 = cb6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3255 = cb7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3256 = cb8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3257 = cb9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3258 = cba */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3259 = cbb */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3260 = cbc */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3261 = cbd */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3262 = cbe */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3263 = cbf */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3264 = cc0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3265 = cc1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3266 = cc2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3267 = cc3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3268 = cc4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3269 = cc5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3270 = cc6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3271 = cc7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3272 = cc8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3273 = cc9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3274 = cca */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3275 = ccb */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3276 = ccc */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3277 = ccd */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3278 = cce */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3279 = ccf */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3280 = cd0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3281 = cd1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3282 = cd2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3283 = cd3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3284 = cd4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3285 = cd5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3286 = cd6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3287 = cd7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3288 = cd8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3289 = cd9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3290 = cda */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3291 = cdb */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3292 = cdc */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3293 = cdd */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3294 = cde */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3295 = cdf */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3296 = ce0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3297 = ce1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3298 = ce2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3299 = ce3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3300 = ce4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3301 = ce5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3302 = ce6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3303 = ce7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3304 = ce8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3305 = ce9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3306 = cea */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3307 = ceb */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3308 = cec */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3309 = ced */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3310 = cee */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3311 = cef */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3312 = cf0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3313 = cf1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3314 = cf2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3315 = cf3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3316 = cf4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3317 = cf5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3318 = cf6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3319 = cf7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3320 = cf8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3321 = cf9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3322 = cfa */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3323 = cfb */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3324 = cfc */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3325 = cfd */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3326 = cfe */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3327 = cff */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3328 = d00 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3329 = d01 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3330 = d02 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3331 = d03 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3332 = d04 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3333 = d05 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3334 = d06 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3335 = d07 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3336 = d08 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3337 = d09 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3338 = d0a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3339 = d0b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3340 = d0c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3341 = d0d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3342 = d0e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3343 = d0f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3344 = d10 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3345 = d11 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3346 = d12 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3347 = d13 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3348 = d14 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3349 = d15 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3350 = d16 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3351 = d17 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3352 = d18 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3353 = d19 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3354 = d1a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3355 = d1b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3356 = d1c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3357 = d1d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3358 = d1e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3359 = d1f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3360 = d20 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3361 = d21 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3362 = d22 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3363 = d23 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3364 = d24 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3365 = d25 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3366 = d26 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3367 = d27 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3368 = d28 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3369 = d29 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3370 = d2a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3371 = d2b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3372 = d2c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3373 = d2d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3374 = d2e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3375 = d2f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3376 = d30 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3377 = d31 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3378 = d32 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3379 = d33 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3380 = d34 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3381 = d35 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3382 = d36 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3383 = d37 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3384 = d38 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3385 = d39 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3386 = d3a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3387 = d3b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3388 = d3c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3389 = d3d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3390 = d3e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3391 = d3f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3392 = d40 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3393 = d41 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3394 = d42 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3395 = d43 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3396 = d44 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3397 = d45 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3398 = d46 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3399 = d47 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3400 = d48 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3401 = d49 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3402 = d4a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3403 = d4b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3404 = d4c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3405 = d4d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3406 = d4e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3407 = d4f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3408 = d50 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3409 = d51 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3410 = d52 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3411 = d53 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3412 = d54 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3413 = d55 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3414 = d56 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3415 = d57 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3416 = d58 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3417 = d59 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3418 = d5a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3419 = d5b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3420 = d5c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3421 = d5d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3422 = d5e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3423 = d5f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3424 = d60 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3425 = d61 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3426 = d62 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3427 = d63 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3428 = d64 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3429 = d65 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3430 = d66 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3431 = d67 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3432 = d68 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3433 = d69 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3434 = d6a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3435 = d6b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3436 = d6c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3437 = d6d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3438 = d6e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3439 = d6f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3440 = d70 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3441 = d71 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3442 = d72 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3443 = d73 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3444 = d74 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3445 = d75 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3446 = d76 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3447 = d77 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3448 = d78 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3449 = d79 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3450 = d7a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3451 = d7b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3452 = d7c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3453 = d7d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3454 = d7e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3455 = d7f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3456 = d80 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3457 = d81 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3458 = d82 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3459 = d83 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3460 = d84 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3461 = d85 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3462 = d86 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3463 = d87 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3464 = d88 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3465 = d89 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3466 = d8a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3467 = d8b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3468 = d8c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3469 = d8d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3470 = d8e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3471 = d8f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3472 = d90 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3473 = d91 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3474 = d92 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3475 = d93 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3476 = d94 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3477 = d95 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3478 = d96 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3479 = d97 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3480 = d98 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3481 = d99 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3482 = d9a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3483 = d9b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3484 = d9c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3485 = d9d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3486 = d9e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3487 = d9f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3488 = da0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3489 = da1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3490 = da2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3491 = da3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3492 = da4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3493 = da5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3494 = da6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3495 = da7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3496 = da8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3497 = da9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3498 = daa */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3499 = dab */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3500 = dac */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3501 = dad */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3502 = dae */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3503 = daf */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3504 = db0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3505 = db1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3506 = db2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3507 = db3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3508 = db4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3509 = db5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3510 = db6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3511 = db7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3512 = db8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3513 = db9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3514 = dba */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3515 = dbb */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3516 = dbc */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3517 = dbd */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3518 = dbe */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3519 = dbf */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3520 = dc0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3521 = dc1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3522 = dc2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3523 = dc3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3524 = dc4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3525 = dc5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3526 = dc6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3527 = dc7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3528 = dc8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3529 = dc9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3530 = dca */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3531 = dcb */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3532 = dcc */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3533 = dcd */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3534 = dce */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3535 = dcf */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3536 = dd0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3537 = dd1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3538 = dd2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3539 = dd3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3540 = dd4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3541 = dd5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3542 = dd6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3543 = dd7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3544 = dd8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3545 = dd9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3546 = dda */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3547 = ddb */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3548 = ddc */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3549 = ddd */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3550 = dde */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3551 = ddf */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3552 = de0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3553 = de1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3554 = de2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3555 = de3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3556 = de4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3557 = de5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3558 = de6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3559 = de7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3560 = de8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3561 = de9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3562 = dea */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3563 = deb */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3564 = dec */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3565 = ded */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3566 = dee */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3567 = def */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3568 = df0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3569 = df1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3570 = df2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3571 = df3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3572 = df4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3573 = df5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3574 = df6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3575 = df7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3576 = df8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3577 = df9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3578 = dfa */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3579 = dfb */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3580 = dfc */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3581 = dfd */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3582 = dfe */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3583 = dff */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3584 = e00 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3585 = e01 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3586 = e02 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3587 = e03 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3588 = e04 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3589 = e05 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3590 = e06 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3591 = e07 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3592 = e08 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3593 = e09 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3594 = e0a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3595 = e0b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3596 = e0c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3597 = e0d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3598 = e0e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3599 = e0f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3600 = e10 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3601 = e11 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3602 = e12 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3603 = e13 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3604 = e14 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3605 = e15 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3606 = e16 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3607 = e17 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3608 = e18 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3609 = e19 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3610 = e1a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3611 = e1b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3612 = e1c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3613 = e1d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3614 = e1e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3615 = e1f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3616 = e20 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3617 = e21 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3618 = e22 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3619 = e23 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3620 = e24 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3621 = e25 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3622 = e26 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3623 = e27 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3624 = e28 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3625 = e29 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3626 = e2a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3627 = e2b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3628 = e2c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3629 = e2d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3630 = e2e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3631 = e2f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3632 = e30 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3633 = e31 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3634 = e32 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3635 = e33 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3636 = e34 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3637 = e35 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3638 = e36 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3639 = e37 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3640 = e38 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3641 = e39 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3642 = e3a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3643 = e3b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3644 = e3c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3645 = e3d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3646 = e3e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3647 = e3f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3648 = e40 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3649 = e41 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3650 = e42 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3651 = e43 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3652 = e44 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3653 = e45 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3654 = e46 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3655 = e47 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3656 = e48 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3657 = e49 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3658 = e4a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3659 = e4b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3660 = e4c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3661 = e4d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3662 = e4e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3663 = e4f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3664 = e50 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3665 = e51 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3666 = e52 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3667 = e53 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3668 = e54 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3669 = e55 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3670 = e56 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3671 = e57 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3672 = e58 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3673 = e59 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3674 = e5a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3675 = e5b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3676 = e5c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3677 = e5d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3678 = e5e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3679 = e5f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3680 = e60 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3681 = e61 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3682 = e62 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3683 = e63 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3684 = e64 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3685 = e65 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3686 = e66 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3687 = e67 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3688 = e68 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3689 = e69 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3690 = e6a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3691 = e6b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3692 = e6c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3693 = e6d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3694 = e6e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3695 = e6f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3696 = e70 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3697 = e71 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3698 = e72 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3699 = e73 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3700 = e74 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3701 = e75 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3702 = e76 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3703 = e77 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3704 = e78 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3705 = e79 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3706 = e7a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3707 = e7b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3708 = e7c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3709 = e7d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3710 = e7e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3711 = e7f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3712 = e80 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3713 = e81 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3714 = e82 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3715 = e83 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3716 = e84 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3717 = e85 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3718 = e86 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3719 = e87 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3720 = e88 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3721 = e89 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3722 = e8a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3723 = e8b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3724 = e8c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3725 = e8d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3726 = e8e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3727 = e8f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3728 = e90 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3729 = e91 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3730 = e92 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3731 = e93 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3732 = e94 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3733 = e95 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3734 = e96 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3735 = e97 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3736 = e98 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3737 = e99 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3738 = e9a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3739 = e9b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3740 = e9c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3741 = e9d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3742 = e9e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3743 = e9f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3744 = ea0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3745 = ea1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3746 = ea2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3747 = ea3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3748 = ea4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3749 = ea5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3750 = ea6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3751 = ea7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3752 = ea8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3753 = ea9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3754 = eaa */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3755 = eab */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3756 = eac */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3757 = ead */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3758 = eae */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3759 = eaf */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3760 = eb0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3761 = eb1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3762 = eb2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3763 = eb3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3764 = eb4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3765 = eb5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3766 = eb6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3767 = eb7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3768 = eb8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3769 = eb9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3770 = eba */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3771 = ebb */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3772 = ebc */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3773 = ebd */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3774 = ebe */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3775 = ebf */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3776 = ec0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3777 = ec1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3778 = ec2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3779 = ec3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3780 = ec4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3781 = ec5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3782 = ec6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3783 = ec7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3784 = ec8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3785 = ec9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3786 = eca */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3787 = ecb */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3788 = ecc */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3789 = ecd */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3790 = ece */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3791 = ecf */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3792 = ed0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3793 = ed1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3794 = ed2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3795 = ed3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3796 = ed4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3797 = ed5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3798 = ed6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3799 = ed7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3800 = ed8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3801 = ed9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3802 = eda */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3803 = edb */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3804 = edc */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3805 = edd */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3806 = ede */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3807 = edf */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3808 = ee0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3809 = ee1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3810 = ee2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3811 = ee3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3812 = ee4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3813 = ee5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3814 = ee6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3815 = ee7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3816 = ee8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3817 = ee9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3818 = eea */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3819 = eeb */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3820 = eec */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3821 = eed */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3822 = eee */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3823 = eef */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3824 = ef0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3825 = ef1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3826 = ef2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3827 = ef3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3828 = ef4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3829 = ef5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3830 = ef6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3831 = ef7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3832 = ef8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3833 = ef9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3834 = efa */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3835 = efb */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3836 = efc */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3837 = efd */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3838 = efe */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3839 = eff */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3840 = f00 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3841 = f01 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3842 = f02 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3843 = f03 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3844 = f04 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3845 = f05 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3846 = f06 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3847 = f07 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3848 = f08 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3849 = f09 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3850 = f0a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3851 = f0b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3852 = f0c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3853 = f0d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3854 = f0e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3855 = f0f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3856 = f10 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3857 = f11 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3858 = f12 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3859 = f13 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3860 = f14 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3861 = f15 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3862 = f16 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3863 = f17 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3864 = f18 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3865 = f19 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3866 = f1a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3867 = f1b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3868 = f1c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3869 = f1d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3870 = f1e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3871 = f1f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3872 = f20 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3873 = f21 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3874 = f22 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3875 = f23 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3876 = f24 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3877 = f25 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3878 = f26 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3879 = f27 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3880 = f28 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3881 = f29 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3882 = f2a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3883 = f2b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3884 = f2c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3885 = f2d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3886 = f2e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3887 = f2f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3888 = f30 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3889 = f31 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3890 = f32 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3891 = f33 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3892 = f34 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3893 = f35 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3894 = f36 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3895 = f37 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3896 = f38 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3897 = f39 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3898 = f3a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3899 = f3b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3900 = f3c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3901 = f3d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3902 = f3e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3903 = f3f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3904 = f40 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3905 = f41 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3906 = f42 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3907 = f43 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3908 = f44 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3909 = f45 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3910 = f46 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3911 = f47 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3912 = f48 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3913 = f49 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3914 = f4a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3915 = f4b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3916 = f4c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3917 = f4d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3918 = f4e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3919 = f4f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3920 = f50 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3921 = f51 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3922 = f52 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3923 = f53 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3924 = f54 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3925 = f55 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3926 = f56 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3927 = f57 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3928 = f58 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3929 = f59 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3930 = f5a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3931 = f5b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3932 = f5c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3933 = f5d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3934 = f5e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3935 = f5f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3936 = f60 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3937 = f61 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3938 = f62 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3939 = f63 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3940 = f64 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3941 = f65 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3942 = f66 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3943 = f67 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3944 = f68 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3945 = f69 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3946 = f6a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3947 = f6b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3948 = f6c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3949 = f6d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3950 = f6e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3951 = f6f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3952 = f70 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3953 = f71 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3954 = f72 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3955 = f73 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3956 = f74 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3957 = f75 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3958 = f76 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3959 = f77 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3960 = f78 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3961 = f79 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3962 = f7a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3963 = f7b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3964 = f7c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3965 = f7d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3966 = f7e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3967 = f7f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3968 = f80 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3969 = f81 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3970 = f82 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3971 = f83 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3972 = f84 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3973 = f85 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3974 = f86 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3975 = f87 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3976 = f88 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3977 = f89 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3978 = f8a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3979 = f8b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3980 = f8c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3981 = f8d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3982 = f8e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3983 = f8f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3984 = f90 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3985 = f91 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3986 = f92 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3987 = f93 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3988 = f94 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3989 = f95 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3990 = f96 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3991 = f97 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3992 = f98 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3993 = f99 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3994 = f9a */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3995 = f9b */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3996 = f9c */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3997 = f9d */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3998 = f9e */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 3999 = f9f */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4000 = fa0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4001 = fa1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4002 = fa2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4003 = fa3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4004 = fa4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4005 = fa5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4006 = fa6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4007 = fa7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4008 = fa8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4009 = fa9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4010 = faa */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4011 = fab */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4012 = fac */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4013 = fad */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4014 = fae */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4015 = faf */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4016 = fb0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4017 = fb1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4018 = fb2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4019 = fb3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4020 = fb4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4021 = fb5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4022 = fb6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4023 = fb7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4024 = fb8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4025 = fb9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4026 = fba */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4027 = fbb */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4028 = fbc */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4029 = fbd */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4030 = fbe */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4031 = fbf */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4032 = fc0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4033 = fc1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4034 = fc2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4035 = fc3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4036 = fc4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4037 = fc5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4038 = fc6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4039 = fc7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4040 = fc8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4041 = fc9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4042 = fca */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4043 = fcb */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4044 = fcc */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4045 = fcd */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4046 = fce */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4047 = fcf */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4048 = fd0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4049 = fd1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4050 = fd2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4051 = fd3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4052 = fd4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4053 = fd5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4054 = fd6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4055 = fd7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4056 = fd8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4057 = fd9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4058 = fda */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4059 = fdb */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4060 = fdc */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4061 = fdd */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4062 = fde */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4063 = fdf */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4064 = fe0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4065 = fe1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4066 = fe2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4067 = fe3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4068 = fe4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4069 = fe5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4070 = fe6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4071 = fe7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4072 = fe8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4073 = fe9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4074 = fea */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4075 = feb */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4076 = fec */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4077 = fed */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4078 = fee */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4079 = fef */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4080 = ff0 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4081 = ff1 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4082 = ff2 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4083 = ff3 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4084 = ff4 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4085 = ff5 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4086 = ff6 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4087 = ff7 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4088 = ff8 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4089 = ff9 */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4090 = ffa */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4091 = ffb */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4092 = ffc */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4093 = ffd */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4094 = ffe */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4095 = fff */ {4, 0, 3}, /* 0x0003 => 0x0c00+(1024)*/ + /* 4096 = 1000 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4097 = 1001 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4098 = 1002 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4099 = 1003 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4100 = 1004 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4101 = 1005 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4102 = 1006 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4103 = 1007 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4104 = 1008 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4105 = 1009 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4106 = 100a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4107 = 100b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4108 = 100c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4109 = 100d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4110 = 100e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4111 = 100f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4112 = 1010 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4113 = 1011 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4114 = 1012 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4115 = 1013 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4116 = 1014 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4117 = 1015 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4118 = 1016 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4119 = 1017 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4120 = 1018 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4121 = 1019 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4122 = 101a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4123 = 101b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4124 = 101c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4125 = 101d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4126 = 101e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4127 = 101f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4128 = 1020 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4129 = 1021 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4130 = 1022 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4131 = 1023 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4132 = 1024 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4133 = 1025 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4134 = 1026 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4135 = 1027 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4136 = 1028 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4137 = 1029 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4138 = 102a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4139 = 102b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4140 = 102c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4141 = 102d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4142 = 102e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4143 = 102f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4144 = 1030 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4145 = 1031 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4146 = 1032 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4147 = 1033 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4148 = 1034 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4149 = 1035 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4150 = 1036 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4151 = 1037 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4152 = 1038 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4153 = 1039 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4154 = 103a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4155 = 103b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4156 = 103c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4157 = 103d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4158 = 103e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4159 = 103f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4160 = 1040 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4161 = 1041 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4162 = 1042 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4163 = 1043 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4164 = 1044 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4165 = 1045 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4166 = 1046 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4167 = 1047 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4168 = 1048 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4169 = 1049 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4170 = 104a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4171 = 104b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4172 = 104c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4173 = 104d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4174 = 104e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4175 = 104f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4176 = 1050 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4177 = 1051 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4178 = 1052 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4179 = 1053 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4180 = 1054 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4181 = 1055 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4182 = 1056 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4183 = 1057 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4184 = 1058 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4185 = 1059 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4186 = 105a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4187 = 105b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4188 = 105c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4189 = 105d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4190 = 105e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4191 = 105f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4192 = 1060 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4193 = 1061 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4194 = 1062 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4195 = 1063 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4196 = 1064 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4197 = 1065 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4198 = 1066 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4199 = 1067 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4200 = 1068 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4201 = 1069 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4202 = 106a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4203 = 106b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4204 = 106c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4205 = 106d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4206 = 106e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4207 = 106f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4208 = 1070 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4209 = 1071 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4210 = 1072 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4211 = 1073 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4212 = 1074 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4213 = 1075 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4214 = 1076 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4215 = 1077 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4216 = 1078 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4217 = 1079 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4218 = 107a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4219 = 107b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4220 = 107c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4221 = 107d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4222 = 107e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4223 = 107f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4224 = 1080 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4225 = 1081 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4226 = 1082 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4227 = 1083 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4228 = 1084 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4229 = 1085 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4230 = 1086 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4231 = 1087 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4232 = 1088 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4233 = 1089 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4234 = 108a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4235 = 108b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4236 = 108c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4237 = 108d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4238 = 108e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4239 = 108f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4240 = 1090 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4241 = 1091 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4242 = 1092 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4243 = 1093 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4244 = 1094 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4245 = 1095 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4246 = 1096 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4247 = 1097 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4248 = 1098 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4249 = 1099 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4250 = 109a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4251 = 109b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4252 = 109c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4253 = 109d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4254 = 109e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4255 = 109f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4256 = 10a0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4257 = 10a1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4258 = 10a2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4259 = 10a3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4260 = 10a4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4261 = 10a5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4262 = 10a6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4263 = 10a7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4264 = 10a8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4265 = 10a9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4266 = 10aa */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4267 = 10ab */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4268 = 10ac */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4269 = 10ad */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4270 = 10ae */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4271 = 10af */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4272 = 10b0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4273 = 10b1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4274 = 10b2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4275 = 10b3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4276 = 10b4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4277 = 10b5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4278 = 10b6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4279 = 10b7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4280 = 10b8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4281 = 10b9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4282 = 10ba */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4283 = 10bb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4284 = 10bc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4285 = 10bd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4286 = 10be */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4287 = 10bf */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4288 = 10c0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4289 = 10c1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4290 = 10c2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4291 = 10c3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4292 = 10c4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4293 = 10c5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4294 = 10c6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4295 = 10c7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4296 = 10c8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4297 = 10c9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4298 = 10ca */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4299 = 10cb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4300 = 10cc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4301 = 10cd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4302 = 10ce */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4303 = 10cf */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4304 = 10d0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4305 = 10d1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4306 = 10d2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4307 = 10d3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4308 = 10d4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4309 = 10d5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4310 = 10d6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4311 = 10d7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4312 = 10d8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4313 = 10d9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4314 = 10da */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4315 = 10db */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4316 = 10dc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4317 = 10dd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4318 = 10de */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4319 = 10df */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4320 = 10e0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4321 = 10e1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4322 = 10e2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4323 = 10e3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4324 = 10e4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4325 = 10e5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4326 = 10e6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4327 = 10e7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4328 = 10e8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4329 = 10e9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4330 = 10ea */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4331 = 10eb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4332 = 10ec */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4333 = 10ed */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4334 = 10ee */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4335 = 10ef */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4336 = 10f0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4337 = 10f1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4338 = 10f2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4339 = 10f3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4340 = 10f4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4341 = 10f5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4342 = 10f6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4343 = 10f7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4344 = 10f8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4345 = 10f9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4346 = 10fa */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4347 = 10fb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4348 = 10fc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4349 = 10fd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4350 = 10fe */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4351 = 10ff */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4352 = 1100 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4353 = 1101 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4354 = 1102 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4355 = 1103 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4356 = 1104 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4357 = 1105 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4358 = 1106 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4359 = 1107 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4360 = 1108 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4361 = 1109 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4362 = 110a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4363 = 110b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4364 = 110c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4365 = 110d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4366 = 110e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4367 = 110f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4368 = 1110 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4369 = 1111 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4370 = 1112 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4371 = 1113 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4372 = 1114 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4373 = 1115 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4374 = 1116 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4375 = 1117 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4376 = 1118 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4377 = 1119 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4378 = 111a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4379 = 111b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4380 = 111c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4381 = 111d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4382 = 111e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4383 = 111f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4384 = 1120 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4385 = 1121 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4386 = 1122 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4387 = 1123 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4388 = 1124 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4389 = 1125 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4390 = 1126 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4391 = 1127 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4392 = 1128 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4393 = 1129 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4394 = 112a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4395 = 112b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4396 = 112c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4397 = 112d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4398 = 112e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4399 = 112f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4400 = 1130 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4401 = 1131 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4402 = 1132 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4403 = 1133 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4404 = 1134 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4405 = 1135 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4406 = 1136 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4407 = 1137 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4408 = 1138 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4409 = 1139 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4410 = 113a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4411 = 113b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4412 = 113c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4413 = 113d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4414 = 113e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4415 = 113f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4416 = 1140 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4417 = 1141 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4418 = 1142 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4419 = 1143 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4420 = 1144 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4421 = 1145 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4422 = 1146 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4423 = 1147 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4424 = 1148 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4425 = 1149 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4426 = 114a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4427 = 114b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4428 = 114c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4429 = 114d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4430 = 114e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4431 = 114f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4432 = 1150 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4433 = 1151 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4434 = 1152 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4435 = 1153 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4436 = 1154 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4437 = 1155 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4438 = 1156 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4439 = 1157 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4440 = 1158 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4441 = 1159 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4442 = 115a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4443 = 115b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4444 = 115c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4445 = 115d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4446 = 115e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4447 = 115f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4448 = 1160 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4449 = 1161 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4450 = 1162 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4451 = 1163 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4452 = 1164 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4453 = 1165 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4454 = 1166 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4455 = 1167 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4456 = 1168 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4457 = 1169 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4458 = 116a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4459 = 116b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4460 = 116c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4461 = 116d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4462 = 116e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4463 = 116f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4464 = 1170 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4465 = 1171 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4466 = 1172 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4467 = 1173 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4468 = 1174 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4469 = 1175 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4470 = 1176 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4471 = 1177 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4472 = 1178 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4473 = 1179 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4474 = 117a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4475 = 117b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4476 = 117c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4477 = 117d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4478 = 117e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4479 = 117f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4480 = 1180 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4481 = 1181 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4482 = 1182 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4483 = 1183 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4484 = 1184 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4485 = 1185 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4486 = 1186 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4487 = 1187 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4488 = 1188 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4489 = 1189 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4490 = 118a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4491 = 118b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4492 = 118c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4493 = 118d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4494 = 118e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4495 = 118f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4496 = 1190 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4497 = 1191 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4498 = 1192 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4499 = 1193 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4500 = 1194 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4501 = 1195 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4502 = 1196 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4503 = 1197 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4504 = 1198 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4505 = 1199 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4506 = 119a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4507 = 119b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4508 = 119c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4509 = 119d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4510 = 119e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4511 = 119f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4512 = 11a0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4513 = 11a1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4514 = 11a2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4515 = 11a3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4516 = 11a4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4517 = 11a5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4518 = 11a6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4519 = 11a7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4520 = 11a8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4521 = 11a9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4522 = 11aa */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4523 = 11ab */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4524 = 11ac */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4525 = 11ad */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4526 = 11ae */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4527 = 11af */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4528 = 11b0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4529 = 11b1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4530 = 11b2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4531 = 11b3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4532 = 11b4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4533 = 11b5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4534 = 11b6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4535 = 11b7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4536 = 11b8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4537 = 11b9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4538 = 11ba */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4539 = 11bb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4540 = 11bc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4541 = 11bd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4542 = 11be */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4543 = 11bf */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4544 = 11c0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4545 = 11c1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4546 = 11c2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4547 = 11c3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4548 = 11c4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4549 = 11c5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4550 = 11c6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4551 = 11c7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4552 = 11c8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4553 = 11c9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4554 = 11ca */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4555 = 11cb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4556 = 11cc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4557 = 11cd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4558 = 11ce */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4559 = 11cf */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4560 = 11d0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4561 = 11d1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4562 = 11d2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4563 = 11d3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4564 = 11d4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4565 = 11d5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4566 = 11d6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4567 = 11d7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4568 = 11d8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4569 = 11d9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4570 = 11da */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4571 = 11db */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4572 = 11dc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4573 = 11dd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4574 = 11de */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4575 = 11df */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4576 = 11e0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4577 = 11e1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4578 = 11e2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4579 = 11e3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4580 = 11e4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4581 = 11e5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4582 = 11e6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4583 = 11e7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4584 = 11e8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4585 = 11e9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4586 = 11ea */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4587 = 11eb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4588 = 11ec */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4589 = 11ed */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4590 = 11ee */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4591 = 11ef */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4592 = 11f0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4593 = 11f1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4594 = 11f2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4595 = 11f3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4596 = 11f4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4597 = 11f5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4598 = 11f6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4599 = 11f7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4600 = 11f8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4601 = 11f9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4602 = 11fa */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4603 = 11fb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4604 = 11fc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4605 = 11fd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4606 = 11fe */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4607 = 11ff */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4608 = 1200 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4609 = 1201 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4610 = 1202 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4611 = 1203 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4612 = 1204 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4613 = 1205 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4614 = 1206 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4615 = 1207 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4616 = 1208 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4617 = 1209 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4618 = 120a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4619 = 120b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4620 = 120c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4621 = 120d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4622 = 120e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4623 = 120f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4624 = 1210 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4625 = 1211 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4626 = 1212 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4627 = 1213 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4628 = 1214 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4629 = 1215 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4630 = 1216 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4631 = 1217 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4632 = 1218 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4633 = 1219 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4634 = 121a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4635 = 121b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4636 = 121c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4637 = 121d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4638 = 121e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4639 = 121f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4640 = 1220 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4641 = 1221 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4642 = 1222 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4643 = 1223 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4644 = 1224 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4645 = 1225 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4646 = 1226 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4647 = 1227 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4648 = 1228 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4649 = 1229 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4650 = 122a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4651 = 122b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4652 = 122c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4653 = 122d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4654 = 122e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4655 = 122f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4656 = 1230 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4657 = 1231 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4658 = 1232 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4659 = 1233 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4660 = 1234 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4661 = 1235 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4662 = 1236 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4663 = 1237 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4664 = 1238 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4665 = 1239 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4666 = 123a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4667 = 123b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4668 = 123c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4669 = 123d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4670 = 123e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4671 = 123f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4672 = 1240 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4673 = 1241 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4674 = 1242 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4675 = 1243 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4676 = 1244 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4677 = 1245 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4678 = 1246 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4679 = 1247 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4680 = 1248 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4681 = 1249 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4682 = 124a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4683 = 124b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4684 = 124c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4685 = 124d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4686 = 124e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4687 = 124f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4688 = 1250 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4689 = 1251 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4690 = 1252 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4691 = 1253 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4692 = 1254 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4693 = 1255 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4694 = 1256 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4695 = 1257 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4696 = 1258 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4697 = 1259 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4698 = 125a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4699 = 125b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4700 = 125c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4701 = 125d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4702 = 125e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4703 = 125f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4704 = 1260 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4705 = 1261 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4706 = 1262 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4707 = 1263 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4708 = 1264 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4709 = 1265 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4710 = 1266 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4711 = 1267 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4712 = 1268 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4713 = 1269 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4714 = 126a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4715 = 126b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4716 = 126c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4717 = 126d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4718 = 126e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4719 = 126f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4720 = 1270 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4721 = 1271 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4722 = 1272 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4723 = 1273 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4724 = 1274 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4725 = 1275 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4726 = 1276 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4727 = 1277 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4728 = 1278 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4729 = 1279 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4730 = 127a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4731 = 127b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4732 = 127c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4733 = 127d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4734 = 127e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4735 = 127f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4736 = 1280 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4737 = 1281 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4738 = 1282 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4739 = 1283 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4740 = 1284 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4741 = 1285 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4742 = 1286 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4743 = 1287 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4744 = 1288 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4745 = 1289 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4746 = 128a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4747 = 128b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4748 = 128c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4749 = 128d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4750 = 128e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4751 = 128f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4752 = 1290 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4753 = 1291 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4754 = 1292 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4755 = 1293 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4756 = 1294 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4757 = 1295 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4758 = 1296 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4759 = 1297 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4760 = 1298 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4761 = 1299 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4762 = 129a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4763 = 129b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4764 = 129c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4765 = 129d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4766 = 129e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4767 = 129f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4768 = 12a0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4769 = 12a1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4770 = 12a2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4771 = 12a3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4772 = 12a4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4773 = 12a5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4774 = 12a6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4775 = 12a7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4776 = 12a8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4777 = 12a9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4778 = 12aa */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4779 = 12ab */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4780 = 12ac */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4781 = 12ad */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4782 = 12ae */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4783 = 12af */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4784 = 12b0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4785 = 12b1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4786 = 12b2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4787 = 12b3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4788 = 12b4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4789 = 12b5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4790 = 12b6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4791 = 12b7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4792 = 12b8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4793 = 12b9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4794 = 12ba */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4795 = 12bb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4796 = 12bc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4797 = 12bd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4798 = 12be */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4799 = 12bf */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4800 = 12c0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4801 = 12c1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4802 = 12c2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4803 = 12c3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4804 = 12c4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4805 = 12c5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4806 = 12c6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4807 = 12c7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4808 = 12c8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4809 = 12c9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4810 = 12ca */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4811 = 12cb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4812 = 12cc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4813 = 12cd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4814 = 12ce */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4815 = 12cf */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4816 = 12d0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4817 = 12d1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4818 = 12d2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4819 = 12d3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4820 = 12d4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4821 = 12d5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4822 = 12d6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4823 = 12d7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4824 = 12d8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4825 = 12d9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4826 = 12da */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4827 = 12db */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4828 = 12dc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4829 = 12dd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4830 = 12de */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4831 = 12df */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4832 = 12e0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4833 = 12e1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4834 = 12e2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4835 = 12e3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4836 = 12e4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4837 = 12e5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4838 = 12e6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4839 = 12e7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4840 = 12e8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4841 = 12e9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4842 = 12ea */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4843 = 12eb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4844 = 12ec */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4845 = 12ed */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4846 = 12ee */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4847 = 12ef */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4848 = 12f0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4849 = 12f1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4850 = 12f2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4851 = 12f3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4852 = 12f4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4853 = 12f5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4854 = 12f6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4855 = 12f7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4856 = 12f8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4857 = 12f9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4858 = 12fa */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4859 = 12fb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4860 = 12fc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4861 = 12fd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4862 = 12fe */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4863 = 12ff */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4864 = 1300 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4865 = 1301 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4866 = 1302 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4867 = 1303 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4868 = 1304 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4869 = 1305 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4870 = 1306 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4871 = 1307 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4872 = 1308 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4873 = 1309 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4874 = 130a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4875 = 130b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4876 = 130c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4877 = 130d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4878 = 130e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4879 = 130f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4880 = 1310 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4881 = 1311 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4882 = 1312 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4883 = 1313 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4884 = 1314 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4885 = 1315 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4886 = 1316 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4887 = 1317 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4888 = 1318 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4889 = 1319 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4890 = 131a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4891 = 131b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4892 = 131c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4893 = 131d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4894 = 131e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4895 = 131f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4896 = 1320 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4897 = 1321 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4898 = 1322 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4899 = 1323 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4900 = 1324 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4901 = 1325 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4902 = 1326 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4903 = 1327 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4904 = 1328 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4905 = 1329 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4906 = 132a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4907 = 132b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4908 = 132c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4909 = 132d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4910 = 132e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4911 = 132f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4912 = 1330 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4913 = 1331 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4914 = 1332 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4915 = 1333 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4916 = 1334 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4917 = 1335 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4918 = 1336 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4919 = 1337 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4920 = 1338 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4921 = 1339 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4922 = 133a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4923 = 133b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4924 = 133c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4925 = 133d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4926 = 133e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4927 = 133f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4928 = 1340 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4929 = 1341 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4930 = 1342 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4931 = 1343 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4932 = 1344 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4933 = 1345 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4934 = 1346 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4935 = 1347 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4936 = 1348 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4937 = 1349 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4938 = 134a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4939 = 134b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4940 = 134c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4941 = 134d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4942 = 134e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4943 = 134f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4944 = 1350 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4945 = 1351 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4946 = 1352 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4947 = 1353 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4948 = 1354 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4949 = 1355 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4950 = 1356 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4951 = 1357 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4952 = 1358 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4953 = 1359 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4954 = 135a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4955 = 135b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4956 = 135c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4957 = 135d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4958 = 135e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4959 = 135f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4960 = 1360 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4961 = 1361 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4962 = 1362 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4963 = 1363 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4964 = 1364 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4965 = 1365 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4966 = 1366 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4967 = 1367 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4968 = 1368 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4969 = 1369 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4970 = 136a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4971 = 136b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4972 = 136c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4973 = 136d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4974 = 136e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4975 = 136f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4976 = 1370 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4977 = 1371 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4978 = 1372 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4979 = 1373 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4980 = 1374 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4981 = 1375 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4982 = 1376 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4983 = 1377 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4984 = 1378 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4985 = 1379 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4986 = 137a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4987 = 137b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4988 = 137c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4989 = 137d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4990 = 137e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4991 = 137f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4992 = 1380 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4993 = 1381 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4994 = 1382 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4995 = 1383 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4996 = 1384 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4997 = 1385 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4998 = 1386 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 4999 = 1387 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5000 = 1388 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5001 = 1389 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5002 = 138a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5003 = 138b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5004 = 138c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5005 = 138d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5006 = 138e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5007 = 138f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5008 = 1390 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5009 = 1391 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5010 = 1392 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5011 = 1393 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5012 = 1394 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5013 = 1395 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5014 = 1396 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5015 = 1397 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5016 = 1398 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5017 = 1399 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5018 = 139a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5019 = 139b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5020 = 139c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5021 = 139d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5022 = 139e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5023 = 139f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5024 = 13a0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5025 = 13a1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5026 = 13a2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5027 = 13a3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5028 = 13a4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5029 = 13a5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5030 = 13a6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5031 = 13a7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5032 = 13a8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5033 = 13a9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5034 = 13aa */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5035 = 13ab */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5036 = 13ac */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5037 = 13ad */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5038 = 13ae */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5039 = 13af */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5040 = 13b0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5041 = 13b1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5042 = 13b2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5043 = 13b3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5044 = 13b4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5045 = 13b5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5046 = 13b6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5047 = 13b7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5048 = 13b8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5049 = 13b9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5050 = 13ba */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5051 = 13bb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5052 = 13bc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5053 = 13bd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5054 = 13be */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5055 = 13bf */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5056 = 13c0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5057 = 13c1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5058 = 13c2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5059 = 13c3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5060 = 13c4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5061 = 13c5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5062 = 13c6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5063 = 13c7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5064 = 13c8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5065 = 13c9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5066 = 13ca */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5067 = 13cb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5068 = 13cc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5069 = 13cd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5070 = 13ce */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5071 = 13cf */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5072 = 13d0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5073 = 13d1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5074 = 13d2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5075 = 13d3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5076 = 13d4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5077 = 13d5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5078 = 13d6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5079 = 13d7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5080 = 13d8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5081 = 13d9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5082 = 13da */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5083 = 13db */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5084 = 13dc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5085 = 13dd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5086 = 13de */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5087 = 13df */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5088 = 13e0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5089 = 13e1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5090 = 13e2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5091 = 13e3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5092 = 13e4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5093 = 13e5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5094 = 13e6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5095 = 13e7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5096 = 13e8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5097 = 13e9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5098 = 13ea */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5099 = 13eb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5100 = 13ec */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5101 = 13ed */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5102 = 13ee */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5103 = 13ef */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5104 = 13f0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5105 = 13f1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5106 = 13f2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5107 = 13f3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5108 = 13f4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5109 = 13f5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5110 = 13f6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5111 = 13f7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5112 = 13f8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5113 = 13f9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5114 = 13fa */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5115 = 13fb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5116 = 13fc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5117 = 13fd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5118 = 13fe */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5119 = 13ff */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5120 = 1400 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5121 = 1401 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5122 = 1402 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5123 = 1403 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5124 = 1404 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5125 = 1405 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5126 = 1406 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5127 = 1407 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5128 = 1408 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5129 = 1409 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5130 = 140a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5131 = 140b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5132 = 140c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5133 = 140d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5134 = 140e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5135 = 140f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5136 = 1410 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5137 = 1411 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5138 = 1412 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5139 = 1413 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5140 = 1414 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5141 = 1415 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5142 = 1416 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5143 = 1417 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5144 = 1418 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5145 = 1419 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5146 = 141a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5147 = 141b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5148 = 141c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5149 = 141d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5150 = 141e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5151 = 141f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5152 = 1420 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5153 = 1421 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5154 = 1422 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5155 = 1423 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5156 = 1424 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5157 = 1425 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5158 = 1426 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5159 = 1427 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5160 = 1428 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5161 = 1429 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5162 = 142a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5163 = 142b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5164 = 142c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5165 = 142d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5166 = 142e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5167 = 142f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5168 = 1430 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5169 = 1431 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5170 = 1432 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5171 = 1433 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5172 = 1434 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5173 = 1435 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5174 = 1436 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5175 = 1437 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5176 = 1438 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5177 = 1439 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5178 = 143a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5179 = 143b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5180 = 143c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5181 = 143d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5182 = 143e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5183 = 143f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5184 = 1440 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5185 = 1441 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5186 = 1442 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5187 = 1443 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5188 = 1444 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5189 = 1445 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5190 = 1446 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5191 = 1447 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5192 = 1448 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5193 = 1449 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5194 = 144a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5195 = 144b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5196 = 144c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5197 = 144d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5198 = 144e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5199 = 144f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5200 = 1450 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5201 = 1451 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5202 = 1452 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5203 = 1453 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5204 = 1454 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5205 = 1455 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5206 = 1456 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5207 = 1457 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5208 = 1458 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5209 = 1459 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5210 = 145a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5211 = 145b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5212 = 145c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5213 = 145d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5214 = 145e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5215 = 145f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5216 = 1460 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5217 = 1461 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5218 = 1462 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5219 = 1463 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5220 = 1464 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5221 = 1465 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5222 = 1466 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5223 = 1467 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5224 = 1468 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5225 = 1469 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5226 = 146a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5227 = 146b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5228 = 146c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5229 = 146d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5230 = 146e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5231 = 146f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5232 = 1470 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5233 = 1471 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5234 = 1472 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5235 = 1473 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5236 = 1474 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5237 = 1475 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5238 = 1476 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5239 = 1477 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5240 = 1478 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5241 = 1479 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5242 = 147a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5243 = 147b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5244 = 147c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5245 = 147d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5246 = 147e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5247 = 147f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5248 = 1480 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5249 = 1481 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5250 = 1482 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5251 = 1483 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5252 = 1484 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5253 = 1485 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5254 = 1486 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5255 = 1487 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5256 = 1488 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5257 = 1489 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5258 = 148a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5259 = 148b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5260 = 148c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5261 = 148d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5262 = 148e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5263 = 148f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5264 = 1490 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5265 = 1491 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5266 = 1492 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5267 = 1493 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5268 = 1494 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5269 = 1495 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5270 = 1496 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5271 = 1497 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5272 = 1498 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5273 = 1499 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5274 = 149a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5275 = 149b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5276 = 149c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5277 = 149d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5278 = 149e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5279 = 149f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5280 = 14a0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5281 = 14a1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5282 = 14a2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5283 = 14a3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5284 = 14a4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5285 = 14a5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5286 = 14a6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5287 = 14a7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5288 = 14a8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5289 = 14a9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5290 = 14aa */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5291 = 14ab */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5292 = 14ac */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5293 = 14ad */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5294 = 14ae */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5295 = 14af */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5296 = 14b0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5297 = 14b1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5298 = 14b2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5299 = 14b3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5300 = 14b4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5301 = 14b5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5302 = 14b6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5303 = 14b7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5304 = 14b8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5305 = 14b9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5306 = 14ba */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5307 = 14bb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5308 = 14bc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5309 = 14bd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5310 = 14be */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5311 = 14bf */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5312 = 14c0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5313 = 14c1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5314 = 14c2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5315 = 14c3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5316 = 14c4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5317 = 14c5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5318 = 14c6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5319 = 14c7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5320 = 14c8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5321 = 14c9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5322 = 14ca */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5323 = 14cb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5324 = 14cc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5325 = 14cd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5326 = 14ce */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5327 = 14cf */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5328 = 14d0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5329 = 14d1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5330 = 14d2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5331 = 14d3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5332 = 14d4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5333 = 14d5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5334 = 14d6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5335 = 14d7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5336 = 14d8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5337 = 14d9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5338 = 14da */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5339 = 14db */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5340 = 14dc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5341 = 14dd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5342 = 14de */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5343 = 14df */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5344 = 14e0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5345 = 14e1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5346 = 14e2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5347 = 14e3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5348 = 14e4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5349 = 14e5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5350 = 14e6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5351 = 14e7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5352 = 14e8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5353 = 14e9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5354 = 14ea */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5355 = 14eb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5356 = 14ec */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5357 = 14ed */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5358 = 14ee */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5359 = 14ef */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5360 = 14f0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5361 = 14f1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5362 = 14f2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5363 = 14f3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5364 = 14f4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5365 = 14f5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5366 = 14f6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5367 = 14f7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5368 = 14f8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5369 = 14f9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5370 = 14fa */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5371 = 14fb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5372 = 14fc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5373 = 14fd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5374 = 14fe */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5375 = 14ff */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5376 = 1500 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5377 = 1501 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5378 = 1502 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5379 = 1503 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5380 = 1504 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5381 = 1505 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5382 = 1506 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5383 = 1507 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5384 = 1508 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5385 = 1509 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5386 = 150a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5387 = 150b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5388 = 150c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5389 = 150d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5390 = 150e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5391 = 150f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5392 = 1510 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5393 = 1511 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5394 = 1512 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5395 = 1513 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5396 = 1514 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5397 = 1515 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5398 = 1516 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5399 = 1517 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5400 = 1518 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5401 = 1519 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5402 = 151a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5403 = 151b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5404 = 151c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5405 = 151d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5406 = 151e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5407 = 151f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5408 = 1520 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5409 = 1521 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5410 = 1522 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5411 = 1523 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5412 = 1524 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5413 = 1525 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5414 = 1526 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5415 = 1527 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5416 = 1528 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5417 = 1529 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5418 = 152a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5419 = 152b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5420 = 152c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5421 = 152d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5422 = 152e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5423 = 152f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5424 = 1530 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5425 = 1531 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5426 = 1532 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5427 = 1533 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5428 = 1534 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5429 = 1535 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5430 = 1536 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5431 = 1537 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5432 = 1538 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5433 = 1539 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5434 = 153a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5435 = 153b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5436 = 153c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5437 = 153d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5438 = 153e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5439 = 153f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5440 = 1540 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5441 = 1541 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5442 = 1542 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5443 = 1543 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5444 = 1544 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5445 = 1545 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5446 = 1546 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5447 = 1547 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5448 = 1548 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5449 = 1549 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5450 = 154a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5451 = 154b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5452 = 154c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5453 = 154d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5454 = 154e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5455 = 154f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5456 = 1550 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5457 = 1551 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5458 = 1552 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5459 = 1553 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5460 = 1554 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5461 = 1555 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5462 = 1556 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5463 = 1557 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5464 = 1558 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5465 = 1559 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5466 = 155a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5467 = 155b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5468 = 155c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5469 = 155d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5470 = 155e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5471 = 155f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5472 = 1560 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5473 = 1561 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5474 = 1562 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5475 = 1563 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5476 = 1564 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5477 = 1565 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5478 = 1566 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5479 = 1567 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5480 = 1568 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5481 = 1569 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5482 = 156a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5483 = 156b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5484 = 156c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5485 = 156d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5486 = 156e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5487 = 156f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5488 = 1570 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5489 = 1571 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5490 = 1572 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5491 = 1573 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5492 = 1574 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5493 = 1575 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5494 = 1576 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5495 = 1577 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5496 = 1578 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5497 = 1579 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5498 = 157a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5499 = 157b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5500 = 157c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5501 = 157d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5502 = 157e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5503 = 157f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5504 = 1580 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5505 = 1581 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5506 = 1582 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5507 = 1583 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5508 = 1584 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5509 = 1585 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5510 = 1586 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5511 = 1587 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5512 = 1588 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5513 = 1589 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5514 = 158a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5515 = 158b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5516 = 158c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5517 = 158d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5518 = 158e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5519 = 158f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5520 = 1590 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5521 = 1591 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5522 = 1592 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5523 = 1593 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5524 = 1594 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5525 = 1595 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5526 = 1596 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5527 = 1597 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5528 = 1598 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5529 = 1599 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5530 = 159a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5531 = 159b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5532 = 159c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5533 = 159d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5534 = 159e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5535 = 159f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5536 = 15a0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5537 = 15a1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5538 = 15a2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5539 = 15a3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5540 = 15a4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5541 = 15a5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5542 = 15a6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5543 = 15a7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5544 = 15a8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5545 = 15a9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5546 = 15aa */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5547 = 15ab */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5548 = 15ac */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5549 = 15ad */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5550 = 15ae */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5551 = 15af */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5552 = 15b0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5553 = 15b1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5554 = 15b2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5555 = 15b3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5556 = 15b4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5557 = 15b5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5558 = 15b6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5559 = 15b7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5560 = 15b8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5561 = 15b9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5562 = 15ba */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5563 = 15bb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5564 = 15bc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5565 = 15bd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5566 = 15be */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5567 = 15bf */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5568 = 15c0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5569 = 15c1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5570 = 15c2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5571 = 15c3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5572 = 15c4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5573 = 15c5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5574 = 15c6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5575 = 15c7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5576 = 15c8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5577 = 15c9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5578 = 15ca */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5579 = 15cb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5580 = 15cc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5581 = 15cd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5582 = 15ce */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5583 = 15cf */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5584 = 15d0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5585 = 15d1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5586 = 15d2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5587 = 15d3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5588 = 15d4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5589 = 15d5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5590 = 15d6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5591 = 15d7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5592 = 15d8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5593 = 15d9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5594 = 15da */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5595 = 15db */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5596 = 15dc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5597 = 15dd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5598 = 15de */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5599 = 15df */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5600 = 15e0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5601 = 15e1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5602 = 15e2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5603 = 15e3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5604 = 15e4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5605 = 15e5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5606 = 15e6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5607 = 15e7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5608 = 15e8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5609 = 15e9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5610 = 15ea */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5611 = 15eb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5612 = 15ec */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5613 = 15ed */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5614 = 15ee */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5615 = 15ef */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5616 = 15f0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5617 = 15f1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5618 = 15f2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5619 = 15f3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5620 = 15f4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5621 = 15f5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5622 = 15f6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5623 = 15f7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5624 = 15f8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5625 = 15f9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5626 = 15fa */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5627 = 15fb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5628 = 15fc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5629 = 15fd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5630 = 15fe */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5631 = 15ff */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5632 = 1600 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5633 = 1601 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5634 = 1602 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5635 = 1603 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5636 = 1604 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5637 = 1605 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5638 = 1606 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5639 = 1607 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5640 = 1608 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5641 = 1609 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5642 = 160a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5643 = 160b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5644 = 160c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5645 = 160d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5646 = 160e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5647 = 160f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5648 = 1610 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5649 = 1611 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5650 = 1612 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5651 = 1613 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5652 = 1614 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5653 = 1615 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5654 = 1616 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5655 = 1617 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5656 = 1618 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5657 = 1619 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5658 = 161a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5659 = 161b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5660 = 161c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5661 = 161d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5662 = 161e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5663 = 161f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5664 = 1620 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5665 = 1621 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5666 = 1622 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5667 = 1623 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5668 = 1624 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5669 = 1625 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5670 = 1626 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5671 = 1627 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5672 = 1628 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5673 = 1629 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5674 = 162a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5675 = 162b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5676 = 162c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5677 = 162d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5678 = 162e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5679 = 162f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5680 = 1630 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5681 = 1631 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5682 = 1632 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5683 = 1633 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5684 = 1634 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5685 = 1635 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5686 = 1636 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5687 = 1637 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5688 = 1638 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5689 = 1639 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5690 = 163a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5691 = 163b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5692 = 163c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5693 = 163d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5694 = 163e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5695 = 163f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5696 = 1640 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5697 = 1641 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5698 = 1642 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5699 = 1643 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5700 = 1644 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5701 = 1645 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5702 = 1646 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5703 = 1647 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5704 = 1648 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5705 = 1649 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5706 = 164a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5707 = 164b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5708 = 164c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5709 = 164d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5710 = 164e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5711 = 164f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5712 = 1650 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5713 = 1651 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5714 = 1652 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5715 = 1653 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5716 = 1654 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5717 = 1655 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5718 = 1656 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5719 = 1657 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5720 = 1658 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5721 = 1659 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5722 = 165a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5723 = 165b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5724 = 165c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5725 = 165d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5726 = 165e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5727 = 165f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5728 = 1660 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5729 = 1661 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5730 = 1662 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5731 = 1663 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5732 = 1664 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5733 = 1665 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5734 = 1666 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5735 = 1667 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5736 = 1668 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5737 = 1669 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5738 = 166a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5739 = 166b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5740 = 166c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5741 = 166d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5742 = 166e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5743 = 166f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5744 = 1670 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5745 = 1671 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5746 = 1672 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5747 = 1673 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5748 = 1674 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5749 = 1675 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5750 = 1676 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5751 = 1677 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5752 = 1678 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5753 = 1679 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5754 = 167a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5755 = 167b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5756 = 167c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5757 = 167d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5758 = 167e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5759 = 167f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5760 = 1680 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5761 = 1681 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5762 = 1682 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5763 = 1683 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5764 = 1684 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5765 = 1685 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5766 = 1686 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5767 = 1687 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5768 = 1688 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5769 = 1689 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5770 = 168a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5771 = 168b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5772 = 168c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5773 = 168d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5774 = 168e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5775 = 168f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5776 = 1690 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5777 = 1691 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5778 = 1692 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5779 = 1693 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5780 = 1694 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5781 = 1695 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5782 = 1696 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5783 = 1697 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5784 = 1698 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5785 = 1699 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5786 = 169a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5787 = 169b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5788 = 169c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5789 = 169d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5790 = 169e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5791 = 169f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5792 = 16a0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5793 = 16a1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5794 = 16a2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5795 = 16a3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5796 = 16a4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5797 = 16a5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5798 = 16a6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5799 = 16a7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5800 = 16a8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5801 = 16a9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5802 = 16aa */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5803 = 16ab */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5804 = 16ac */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5805 = 16ad */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5806 = 16ae */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5807 = 16af */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5808 = 16b0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5809 = 16b1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5810 = 16b2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5811 = 16b3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5812 = 16b4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5813 = 16b5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5814 = 16b6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5815 = 16b7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5816 = 16b8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5817 = 16b9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5818 = 16ba */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5819 = 16bb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5820 = 16bc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5821 = 16bd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5822 = 16be */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5823 = 16bf */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5824 = 16c0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5825 = 16c1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5826 = 16c2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5827 = 16c3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5828 = 16c4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5829 = 16c5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5830 = 16c6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5831 = 16c7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5832 = 16c8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5833 = 16c9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5834 = 16ca */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5835 = 16cb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5836 = 16cc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5837 = 16cd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5838 = 16ce */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5839 = 16cf */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5840 = 16d0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5841 = 16d1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5842 = 16d2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5843 = 16d3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5844 = 16d4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5845 = 16d5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5846 = 16d6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5847 = 16d7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5848 = 16d8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5849 = 16d9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5850 = 16da */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5851 = 16db */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5852 = 16dc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5853 = 16dd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5854 = 16de */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5855 = 16df */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5856 = 16e0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5857 = 16e1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5858 = 16e2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5859 = 16e3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5860 = 16e4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5861 = 16e5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5862 = 16e6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5863 = 16e7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5864 = 16e8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5865 = 16e9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5866 = 16ea */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5867 = 16eb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5868 = 16ec */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5869 = 16ed */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5870 = 16ee */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5871 = 16ef */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5872 = 16f0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5873 = 16f1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5874 = 16f2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5875 = 16f3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5876 = 16f4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5877 = 16f5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5878 = 16f6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5879 = 16f7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5880 = 16f8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5881 = 16f9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5882 = 16fa */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5883 = 16fb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5884 = 16fc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5885 = 16fd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5886 = 16fe */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5887 = 16ff */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5888 = 1700 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5889 = 1701 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5890 = 1702 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5891 = 1703 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5892 = 1704 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5893 = 1705 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5894 = 1706 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5895 = 1707 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5896 = 1708 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5897 = 1709 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5898 = 170a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5899 = 170b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5900 = 170c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5901 = 170d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5902 = 170e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5903 = 170f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5904 = 1710 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5905 = 1711 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5906 = 1712 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5907 = 1713 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5908 = 1714 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5909 = 1715 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5910 = 1716 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5911 = 1717 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5912 = 1718 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5913 = 1719 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5914 = 171a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5915 = 171b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5916 = 171c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5917 = 171d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5918 = 171e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5919 = 171f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5920 = 1720 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5921 = 1721 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5922 = 1722 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5923 = 1723 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5924 = 1724 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5925 = 1725 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5926 = 1726 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5927 = 1727 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5928 = 1728 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5929 = 1729 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5930 = 172a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5931 = 172b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5932 = 172c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5933 = 172d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5934 = 172e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5935 = 172f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5936 = 1730 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5937 = 1731 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5938 = 1732 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5939 = 1733 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5940 = 1734 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5941 = 1735 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5942 = 1736 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5943 = 1737 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5944 = 1738 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5945 = 1739 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5946 = 173a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5947 = 173b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5948 = 173c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5949 = 173d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5950 = 173e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5951 = 173f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5952 = 1740 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5953 = 1741 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5954 = 1742 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5955 = 1743 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5956 = 1744 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5957 = 1745 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5958 = 1746 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5959 = 1747 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5960 = 1748 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5961 = 1749 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5962 = 174a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5963 = 174b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5964 = 174c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5965 = 174d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5966 = 174e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5967 = 174f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5968 = 1750 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5969 = 1751 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5970 = 1752 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5971 = 1753 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5972 = 1754 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5973 = 1755 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5974 = 1756 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5975 = 1757 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5976 = 1758 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5977 = 1759 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5978 = 175a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5979 = 175b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5980 = 175c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5981 = 175d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5982 = 175e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5983 = 175f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5984 = 1760 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5985 = 1761 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5986 = 1762 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5987 = 1763 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5988 = 1764 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5989 = 1765 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5990 = 1766 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5991 = 1767 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5992 = 1768 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5993 = 1769 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5994 = 176a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5995 = 176b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5996 = 176c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5997 = 176d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5998 = 176e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 5999 = 176f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6000 = 1770 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6001 = 1771 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6002 = 1772 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6003 = 1773 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6004 = 1774 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6005 = 1775 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6006 = 1776 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6007 = 1777 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6008 = 1778 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6009 = 1779 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6010 = 177a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6011 = 177b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6012 = 177c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6013 = 177d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6014 = 177e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6015 = 177f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6016 = 1780 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6017 = 1781 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6018 = 1782 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6019 = 1783 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6020 = 1784 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6021 = 1785 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6022 = 1786 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6023 = 1787 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6024 = 1788 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6025 = 1789 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6026 = 178a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6027 = 178b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6028 = 178c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6029 = 178d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6030 = 178e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6031 = 178f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6032 = 1790 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6033 = 1791 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6034 = 1792 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6035 = 1793 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6036 = 1794 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6037 = 1795 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6038 = 1796 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6039 = 1797 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6040 = 1798 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6041 = 1799 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6042 = 179a */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6043 = 179b */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6044 = 179c */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6045 = 179d */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6046 = 179e */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6047 = 179f */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6048 = 17a0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6049 = 17a1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6050 = 17a2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6051 = 17a3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6052 = 17a4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6053 = 17a5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6054 = 17a6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6055 = 17a7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6056 = 17a8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6057 = 17a9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6058 = 17aa */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6059 = 17ab */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6060 = 17ac */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6061 = 17ad */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6062 = 17ae */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6063 = 17af */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6064 = 17b0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6065 = 17b1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6066 = 17b2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6067 = 17b3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6068 = 17b4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6069 = 17b5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6070 = 17b6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6071 = 17b7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6072 = 17b8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6073 = 17b9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6074 = 17ba */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6075 = 17bb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6076 = 17bc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6077 = 17bd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6078 = 17be */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6079 = 17bf */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6080 = 17c0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6081 = 17c1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6082 = 17c2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6083 = 17c3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6084 = 17c4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6085 = 17c5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6086 = 17c6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6087 = 17c7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6088 = 17c8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6089 = 17c9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6090 = 17ca */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6091 = 17cb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6092 = 17cc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6093 = 17cd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6094 = 17ce */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6095 = 17cf */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6096 = 17d0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6097 = 17d1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6098 = 17d2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6099 = 17d3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6100 = 17d4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6101 = 17d5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6102 = 17d6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6103 = 17d7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6104 = 17d8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6105 = 17d9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6106 = 17da */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6107 = 17db */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6108 = 17dc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6109 = 17dd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6110 = 17de */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6111 = 17df */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6112 = 17e0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6113 = 17e1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6114 = 17e2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6115 = 17e3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6116 = 17e4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6117 = 17e5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6118 = 17e6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6119 = 17e7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6120 = 17e8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6121 = 17e9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6122 = 17ea */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6123 = 17eb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6124 = 17ec */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6125 = 17ed */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6126 = 17ee */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6127 = 17ef */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6128 = 17f0 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6129 = 17f1 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6130 = 17f2 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6131 = 17f3 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6132 = 17f4 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6133 = 17f5 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6134 = 17f6 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6135 = 17f7 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6136 = 17f8 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6137 = 17f9 */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6138 = 17fa */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6139 = 17fb */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6140 = 17fc */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6141 = 17fd */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6142 = 17fe */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6143 = 17ff */ {3, 0, 2}, /* 0x0002 => 0x1000+(2048)*/ + /* 6144 = 1800 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6145 = 1801 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6146 = 1802 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6147 = 1803 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6148 = 1804 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6149 = 1805 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6150 = 1806 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6151 = 1807 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6152 = 1808 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6153 = 1809 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6154 = 180a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6155 = 180b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6156 = 180c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6157 = 180d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6158 = 180e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6159 = 180f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6160 = 1810 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6161 = 1811 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6162 = 1812 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6163 = 1813 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6164 = 1814 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6165 = 1815 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6166 = 1816 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6167 = 1817 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6168 = 1818 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6169 = 1819 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6170 = 181a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6171 = 181b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6172 = 181c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6173 = 181d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6174 = 181e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6175 = 181f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6176 = 1820 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6177 = 1821 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6178 = 1822 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6179 = 1823 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6180 = 1824 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6181 = 1825 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6182 = 1826 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6183 = 1827 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6184 = 1828 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6185 = 1829 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6186 = 182a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6187 = 182b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6188 = 182c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6189 = 182d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6190 = 182e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6191 = 182f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6192 = 1830 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6193 = 1831 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6194 = 1832 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6195 = 1833 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6196 = 1834 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6197 = 1835 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6198 = 1836 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6199 = 1837 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6200 = 1838 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6201 = 1839 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6202 = 183a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6203 = 183b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6204 = 183c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6205 = 183d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6206 = 183e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6207 = 183f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6208 = 1840 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6209 = 1841 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6210 = 1842 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6211 = 1843 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6212 = 1844 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6213 = 1845 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6214 = 1846 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6215 = 1847 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6216 = 1848 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6217 = 1849 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6218 = 184a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6219 = 184b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6220 = 184c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6221 = 184d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6222 = 184e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6223 = 184f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6224 = 1850 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6225 = 1851 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6226 = 1852 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6227 = 1853 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6228 = 1854 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6229 = 1855 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6230 = 1856 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6231 = 1857 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6232 = 1858 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6233 = 1859 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6234 = 185a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6235 = 185b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6236 = 185c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6237 = 185d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6238 = 185e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6239 = 185f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6240 = 1860 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6241 = 1861 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6242 = 1862 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6243 = 1863 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6244 = 1864 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6245 = 1865 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6246 = 1866 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6247 = 1867 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6248 = 1868 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6249 = 1869 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6250 = 186a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6251 = 186b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6252 = 186c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6253 = 186d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6254 = 186e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6255 = 186f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6256 = 1870 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6257 = 1871 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6258 = 1872 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6259 = 1873 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6260 = 1874 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6261 = 1875 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6262 = 1876 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6263 = 1877 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6264 = 1878 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6265 = 1879 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6266 = 187a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6267 = 187b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6268 = 187c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6269 = 187d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6270 = 187e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6271 = 187f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6272 = 1880 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6273 = 1881 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6274 = 1882 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6275 = 1883 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6276 = 1884 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6277 = 1885 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6278 = 1886 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6279 = 1887 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6280 = 1888 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6281 = 1889 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6282 = 188a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6283 = 188b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6284 = 188c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6285 = 188d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6286 = 188e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6287 = 188f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6288 = 1890 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6289 = 1891 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6290 = 1892 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6291 = 1893 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6292 = 1894 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6293 = 1895 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6294 = 1896 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6295 = 1897 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6296 = 1898 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6297 = 1899 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6298 = 189a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6299 = 189b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6300 = 189c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6301 = 189d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6302 = 189e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6303 = 189f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6304 = 18a0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6305 = 18a1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6306 = 18a2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6307 = 18a3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6308 = 18a4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6309 = 18a5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6310 = 18a6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6311 = 18a7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6312 = 18a8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6313 = 18a9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6314 = 18aa */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6315 = 18ab */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6316 = 18ac */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6317 = 18ad */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6318 = 18ae */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6319 = 18af */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6320 = 18b0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6321 = 18b1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6322 = 18b2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6323 = 18b3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6324 = 18b4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6325 = 18b5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6326 = 18b6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6327 = 18b7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6328 = 18b8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6329 = 18b9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6330 = 18ba */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6331 = 18bb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6332 = 18bc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6333 = 18bd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6334 = 18be */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6335 = 18bf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6336 = 18c0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6337 = 18c1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6338 = 18c2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6339 = 18c3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6340 = 18c4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6341 = 18c5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6342 = 18c6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6343 = 18c7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6344 = 18c8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6345 = 18c9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6346 = 18ca */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6347 = 18cb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6348 = 18cc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6349 = 18cd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6350 = 18ce */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6351 = 18cf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6352 = 18d0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6353 = 18d1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6354 = 18d2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6355 = 18d3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6356 = 18d4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6357 = 18d5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6358 = 18d6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6359 = 18d7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6360 = 18d8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6361 = 18d9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6362 = 18da */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6363 = 18db */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6364 = 18dc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6365 = 18dd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6366 = 18de */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6367 = 18df */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6368 = 18e0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6369 = 18e1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6370 = 18e2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6371 = 18e3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6372 = 18e4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6373 = 18e5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6374 = 18e6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6375 = 18e7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6376 = 18e8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6377 = 18e9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6378 = 18ea */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6379 = 18eb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6380 = 18ec */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6381 = 18ed */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6382 = 18ee */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6383 = 18ef */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6384 = 18f0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6385 = 18f1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6386 = 18f2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6387 = 18f3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6388 = 18f4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6389 = 18f5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6390 = 18f6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6391 = 18f7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6392 = 18f8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6393 = 18f9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6394 = 18fa */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6395 = 18fb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6396 = 18fc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6397 = 18fd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6398 = 18fe */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6399 = 18ff */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6400 = 1900 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6401 = 1901 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6402 = 1902 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6403 = 1903 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6404 = 1904 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6405 = 1905 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6406 = 1906 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6407 = 1907 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6408 = 1908 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6409 = 1909 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6410 = 190a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6411 = 190b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6412 = 190c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6413 = 190d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6414 = 190e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6415 = 190f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6416 = 1910 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6417 = 1911 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6418 = 1912 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6419 = 1913 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6420 = 1914 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6421 = 1915 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6422 = 1916 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6423 = 1917 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6424 = 1918 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6425 = 1919 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6426 = 191a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6427 = 191b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6428 = 191c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6429 = 191d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6430 = 191e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6431 = 191f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6432 = 1920 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6433 = 1921 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6434 = 1922 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6435 = 1923 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6436 = 1924 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6437 = 1925 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6438 = 1926 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6439 = 1927 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6440 = 1928 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6441 = 1929 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6442 = 192a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6443 = 192b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6444 = 192c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6445 = 192d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6446 = 192e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6447 = 192f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6448 = 1930 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6449 = 1931 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6450 = 1932 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6451 = 1933 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6452 = 1934 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6453 = 1935 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6454 = 1936 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6455 = 1937 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6456 = 1938 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6457 = 1939 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6458 = 193a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6459 = 193b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6460 = 193c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6461 = 193d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6462 = 193e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6463 = 193f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6464 = 1940 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6465 = 1941 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6466 = 1942 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6467 = 1943 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6468 = 1944 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6469 = 1945 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6470 = 1946 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6471 = 1947 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6472 = 1948 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6473 = 1949 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6474 = 194a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6475 = 194b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6476 = 194c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6477 = 194d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6478 = 194e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6479 = 194f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6480 = 1950 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6481 = 1951 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6482 = 1952 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6483 = 1953 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6484 = 1954 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6485 = 1955 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6486 = 1956 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6487 = 1957 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6488 = 1958 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6489 = 1959 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6490 = 195a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6491 = 195b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6492 = 195c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6493 = 195d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6494 = 195e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6495 = 195f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6496 = 1960 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6497 = 1961 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6498 = 1962 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6499 = 1963 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6500 = 1964 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6501 = 1965 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6502 = 1966 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6503 = 1967 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6504 = 1968 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6505 = 1969 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6506 = 196a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6507 = 196b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6508 = 196c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6509 = 196d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6510 = 196e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6511 = 196f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6512 = 1970 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6513 = 1971 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6514 = 1972 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6515 = 1973 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6516 = 1974 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6517 = 1975 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6518 = 1976 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6519 = 1977 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6520 = 1978 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6521 = 1979 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6522 = 197a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6523 = 197b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6524 = 197c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6525 = 197d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6526 = 197e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6527 = 197f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6528 = 1980 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6529 = 1981 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6530 = 1982 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6531 = 1983 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6532 = 1984 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6533 = 1985 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6534 = 1986 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6535 = 1987 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6536 = 1988 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6537 = 1989 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6538 = 198a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6539 = 198b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6540 = 198c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6541 = 198d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6542 = 198e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6543 = 198f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6544 = 1990 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6545 = 1991 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6546 = 1992 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6547 = 1993 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6548 = 1994 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6549 = 1995 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6550 = 1996 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6551 = 1997 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6552 = 1998 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6553 = 1999 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6554 = 199a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6555 = 199b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6556 = 199c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6557 = 199d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6558 = 199e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6559 = 199f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6560 = 19a0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6561 = 19a1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6562 = 19a2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6563 = 19a3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6564 = 19a4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6565 = 19a5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6566 = 19a6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6567 = 19a7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6568 = 19a8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6569 = 19a9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6570 = 19aa */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6571 = 19ab */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6572 = 19ac */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6573 = 19ad */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6574 = 19ae */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6575 = 19af */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6576 = 19b0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6577 = 19b1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6578 = 19b2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6579 = 19b3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6580 = 19b4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6581 = 19b5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6582 = 19b6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6583 = 19b7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6584 = 19b8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6585 = 19b9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6586 = 19ba */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6587 = 19bb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6588 = 19bc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6589 = 19bd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6590 = 19be */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6591 = 19bf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6592 = 19c0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6593 = 19c1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6594 = 19c2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6595 = 19c3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6596 = 19c4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6597 = 19c5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6598 = 19c6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6599 = 19c7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6600 = 19c8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6601 = 19c9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6602 = 19ca */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6603 = 19cb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6604 = 19cc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6605 = 19cd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6606 = 19ce */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6607 = 19cf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6608 = 19d0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6609 = 19d1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6610 = 19d2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6611 = 19d3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6612 = 19d4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6613 = 19d5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6614 = 19d6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6615 = 19d7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6616 = 19d8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6617 = 19d9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6618 = 19da */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6619 = 19db */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6620 = 19dc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6621 = 19dd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6622 = 19de */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6623 = 19df */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6624 = 19e0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6625 = 19e1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6626 = 19e2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6627 = 19e3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6628 = 19e4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6629 = 19e5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6630 = 19e6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6631 = 19e7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6632 = 19e8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6633 = 19e9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6634 = 19ea */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6635 = 19eb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6636 = 19ec */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6637 = 19ed */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6638 = 19ee */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6639 = 19ef */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6640 = 19f0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6641 = 19f1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6642 = 19f2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6643 = 19f3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6644 = 19f4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6645 = 19f5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6646 = 19f6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6647 = 19f7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6648 = 19f8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6649 = 19f9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6650 = 19fa */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6651 = 19fb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6652 = 19fc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6653 = 19fd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6654 = 19fe */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6655 = 19ff */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6656 = 1a00 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6657 = 1a01 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6658 = 1a02 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6659 = 1a03 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6660 = 1a04 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6661 = 1a05 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6662 = 1a06 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6663 = 1a07 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6664 = 1a08 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6665 = 1a09 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6666 = 1a0a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6667 = 1a0b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6668 = 1a0c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6669 = 1a0d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6670 = 1a0e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6671 = 1a0f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6672 = 1a10 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6673 = 1a11 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6674 = 1a12 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6675 = 1a13 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6676 = 1a14 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6677 = 1a15 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6678 = 1a16 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6679 = 1a17 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6680 = 1a18 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6681 = 1a19 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6682 = 1a1a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6683 = 1a1b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6684 = 1a1c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6685 = 1a1d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6686 = 1a1e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6687 = 1a1f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6688 = 1a20 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6689 = 1a21 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6690 = 1a22 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6691 = 1a23 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6692 = 1a24 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6693 = 1a25 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6694 = 1a26 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6695 = 1a27 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6696 = 1a28 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6697 = 1a29 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6698 = 1a2a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6699 = 1a2b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6700 = 1a2c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6701 = 1a2d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6702 = 1a2e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6703 = 1a2f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6704 = 1a30 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6705 = 1a31 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6706 = 1a32 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6707 = 1a33 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6708 = 1a34 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6709 = 1a35 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6710 = 1a36 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6711 = 1a37 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6712 = 1a38 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6713 = 1a39 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6714 = 1a3a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6715 = 1a3b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6716 = 1a3c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6717 = 1a3d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6718 = 1a3e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6719 = 1a3f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6720 = 1a40 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6721 = 1a41 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6722 = 1a42 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6723 = 1a43 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6724 = 1a44 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6725 = 1a45 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6726 = 1a46 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6727 = 1a47 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6728 = 1a48 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6729 = 1a49 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6730 = 1a4a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6731 = 1a4b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6732 = 1a4c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6733 = 1a4d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6734 = 1a4e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6735 = 1a4f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6736 = 1a50 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6737 = 1a51 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6738 = 1a52 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6739 = 1a53 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6740 = 1a54 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6741 = 1a55 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6742 = 1a56 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6743 = 1a57 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6744 = 1a58 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6745 = 1a59 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6746 = 1a5a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6747 = 1a5b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6748 = 1a5c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6749 = 1a5d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6750 = 1a5e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6751 = 1a5f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6752 = 1a60 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6753 = 1a61 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6754 = 1a62 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6755 = 1a63 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6756 = 1a64 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6757 = 1a65 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6758 = 1a66 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6759 = 1a67 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6760 = 1a68 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6761 = 1a69 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6762 = 1a6a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6763 = 1a6b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6764 = 1a6c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6765 = 1a6d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6766 = 1a6e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6767 = 1a6f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6768 = 1a70 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6769 = 1a71 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6770 = 1a72 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6771 = 1a73 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6772 = 1a74 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6773 = 1a75 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6774 = 1a76 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6775 = 1a77 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6776 = 1a78 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6777 = 1a79 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6778 = 1a7a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6779 = 1a7b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6780 = 1a7c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6781 = 1a7d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6782 = 1a7e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6783 = 1a7f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6784 = 1a80 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6785 = 1a81 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6786 = 1a82 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6787 = 1a83 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6788 = 1a84 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6789 = 1a85 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6790 = 1a86 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6791 = 1a87 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6792 = 1a88 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6793 = 1a89 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6794 = 1a8a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6795 = 1a8b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6796 = 1a8c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6797 = 1a8d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6798 = 1a8e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6799 = 1a8f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6800 = 1a90 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6801 = 1a91 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6802 = 1a92 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6803 = 1a93 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6804 = 1a94 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6805 = 1a95 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6806 = 1a96 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6807 = 1a97 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6808 = 1a98 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6809 = 1a99 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6810 = 1a9a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6811 = 1a9b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6812 = 1a9c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6813 = 1a9d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6814 = 1a9e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6815 = 1a9f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6816 = 1aa0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6817 = 1aa1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6818 = 1aa2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6819 = 1aa3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6820 = 1aa4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6821 = 1aa5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6822 = 1aa6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6823 = 1aa7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6824 = 1aa8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6825 = 1aa9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6826 = 1aaa */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6827 = 1aab */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6828 = 1aac */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6829 = 1aad */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6830 = 1aae */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6831 = 1aaf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6832 = 1ab0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6833 = 1ab1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6834 = 1ab2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6835 = 1ab3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6836 = 1ab4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6837 = 1ab5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6838 = 1ab6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6839 = 1ab7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6840 = 1ab8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6841 = 1ab9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6842 = 1aba */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6843 = 1abb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6844 = 1abc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6845 = 1abd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6846 = 1abe */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6847 = 1abf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6848 = 1ac0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6849 = 1ac1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6850 = 1ac2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6851 = 1ac3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6852 = 1ac4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6853 = 1ac5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6854 = 1ac6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6855 = 1ac7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6856 = 1ac8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6857 = 1ac9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6858 = 1aca */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6859 = 1acb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6860 = 1acc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6861 = 1acd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6862 = 1ace */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6863 = 1acf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6864 = 1ad0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6865 = 1ad1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6866 = 1ad2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6867 = 1ad3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6868 = 1ad4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6869 = 1ad5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6870 = 1ad6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6871 = 1ad7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6872 = 1ad8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6873 = 1ad9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6874 = 1ada */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6875 = 1adb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6876 = 1adc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6877 = 1add */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6878 = 1ade */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6879 = 1adf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6880 = 1ae0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6881 = 1ae1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6882 = 1ae2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6883 = 1ae3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6884 = 1ae4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6885 = 1ae5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6886 = 1ae6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6887 = 1ae7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6888 = 1ae8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6889 = 1ae9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6890 = 1aea */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6891 = 1aeb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6892 = 1aec */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6893 = 1aed */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6894 = 1aee */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6895 = 1aef */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6896 = 1af0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6897 = 1af1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6898 = 1af2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6899 = 1af3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6900 = 1af4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6901 = 1af5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6902 = 1af6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6903 = 1af7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6904 = 1af8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6905 = 1af9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6906 = 1afa */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6907 = 1afb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6908 = 1afc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6909 = 1afd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6910 = 1afe */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6911 = 1aff */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6912 = 1b00 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6913 = 1b01 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6914 = 1b02 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6915 = 1b03 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6916 = 1b04 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6917 = 1b05 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6918 = 1b06 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6919 = 1b07 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6920 = 1b08 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6921 = 1b09 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6922 = 1b0a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6923 = 1b0b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6924 = 1b0c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6925 = 1b0d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6926 = 1b0e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6927 = 1b0f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6928 = 1b10 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6929 = 1b11 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6930 = 1b12 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6931 = 1b13 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6932 = 1b14 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6933 = 1b15 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6934 = 1b16 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6935 = 1b17 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6936 = 1b18 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6937 = 1b19 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6938 = 1b1a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6939 = 1b1b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6940 = 1b1c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6941 = 1b1d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6942 = 1b1e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6943 = 1b1f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6944 = 1b20 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6945 = 1b21 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6946 = 1b22 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6947 = 1b23 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6948 = 1b24 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6949 = 1b25 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6950 = 1b26 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6951 = 1b27 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6952 = 1b28 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6953 = 1b29 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6954 = 1b2a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6955 = 1b2b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6956 = 1b2c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6957 = 1b2d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6958 = 1b2e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6959 = 1b2f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6960 = 1b30 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6961 = 1b31 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6962 = 1b32 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6963 = 1b33 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6964 = 1b34 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6965 = 1b35 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6966 = 1b36 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6967 = 1b37 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6968 = 1b38 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6969 = 1b39 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6970 = 1b3a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6971 = 1b3b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6972 = 1b3c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6973 = 1b3d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6974 = 1b3e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6975 = 1b3f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6976 = 1b40 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6977 = 1b41 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6978 = 1b42 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6979 = 1b43 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6980 = 1b44 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6981 = 1b45 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6982 = 1b46 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6983 = 1b47 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6984 = 1b48 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6985 = 1b49 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6986 = 1b4a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6987 = 1b4b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6988 = 1b4c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6989 = 1b4d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6990 = 1b4e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6991 = 1b4f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6992 = 1b50 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6993 = 1b51 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6994 = 1b52 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6995 = 1b53 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6996 = 1b54 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6997 = 1b55 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6998 = 1b56 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 6999 = 1b57 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7000 = 1b58 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7001 = 1b59 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7002 = 1b5a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7003 = 1b5b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7004 = 1b5c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7005 = 1b5d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7006 = 1b5e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7007 = 1b5f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7008 = 1b60 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7009 = 1b61 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7010 = 1b62 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7011 = 1b63 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7012 = 1b64 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7013 = 1b65 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7014 = 1b66 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7015 = 1b67 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7016 = 1b68 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7017 = 1b69 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7018 = 1b6a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7019 = 1b6b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7020 = 1b6c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7021 = 1b6d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7022 = 1b6e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7023 = 1b6f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7024 = 1b70 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7025 = 1b71 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7026 = 1b72 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7027 = 1b73 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7028 = 1b74 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7029 = 1b75 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7030 = 1b76 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7031 = 1b77 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7032 = 1b78 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7033 = 1b79 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7034 = 1b7a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7035 = 1b7b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7036 = 1b7c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7037 = 1b7d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7038 = 1b7e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7039 = 1b7f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7040 = 1b80 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7041 = 1b81 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7042 = 1b82 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7043 = 1b83 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7044 = 1b84 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7045 = 1b85 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7046 = 1b86 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7047 = 1b87 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7048 = 1b88 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7049 = 1b89 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7050 = 1b8a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7051 = 1b8b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7052 = 1b8c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7053 = 1b8d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7054 = 1b8e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7055 = 1b8f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7056 = 1b90 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7057 = 1b91 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7058 = 1b92 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7059 = 1b93 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7060 = 1b94 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7061 = 1b95 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7062 = 1b96 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7063 = 1b97 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7064 = 1b98 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7065 = 1b99 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7066 = 1b9a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7067 = 1b9b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7068 = 1b9c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7069 = 1b9d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7070 = 1b9e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7071 = 1b9f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7072 = 1ba0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7073 = 1ba1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7074 = 1ba2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7075 = 1ba3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7076 = 1ba4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7077 = 1ba5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7078 = 1ba6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7079 = 1ba7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7080 = 1ba8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7081 = 1ba9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7082 = 1baa */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7083 = 1bab */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7084 = 1bac */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7085 = 1bad */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7086 = 1bae */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7087 = 1baf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7088 = 1bb0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7089 = 1bb1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7090 = 1bb2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7091 = 1bb3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7092 = 1bb4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7093 = 1bb5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7094 = 1bb6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7095 = 1bb7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7096 = 1bb8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7097 = 1bb9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7098 = 1bba */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7099 = 1bbb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7100 = 1bbc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7101 = 1bbd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7102 = 1bbe */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7103 = 1bbf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7104 = 1bc0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7105 = 1bc1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7106 = 1bc2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7107 = 1bc3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7108 = 1bc4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7109 = 1bc5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7110 = 1bc6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7111 = 1bc7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7112 = 1bc8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7113 = 1bc9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7114 = 1bca */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7115 = 1bcb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7116 = 1bcc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7117 = 1bcd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7118 = 1bce */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7119 = 1bcf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7120 = 1bd0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7121 = 1bd1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7122 = 1bd2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7123 = 1bd3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7124 = 1bd4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7125 = 1bd5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7126 = 1bd6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7127 = 1bd7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7128 = 1bd8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7129 = 1bd9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7130 = 1bda */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7131 = 1bdb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7132 = 1bdc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7133 = 1bdd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7134 = 1bde */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7135 = 1bdf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7136 = 1be0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7137 = 1be1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7138 = 1be2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7139 = 1be3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7140 = 1be4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7141 = 1be5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7142 = 1be6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7143 = 1be7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7144 = 1be8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7145 = 1be9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7146 = 1bea */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7147 = 1beb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7148 = 1bec */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7149 = 1bed */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7150 = 1bee */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7151 = 1bef */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7152 = 1bf0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7153 = 1bf1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7154 = 1bf2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7155 = 1bf3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7156 = 1bf4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7157 = 1bf5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7158 = 1bf6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7159 = 1bf7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7160 = 1bf8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7161 = 1bf9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7162 = 1bfa */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7163 = 1bfb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7164 = 1bfc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7165 = 1bfd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7166 = 1bfe */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7167 = 1bff */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7168 = 1c00 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7169 = 1c01 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7170 = 1c02 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7171 = 1c03 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7172 = 1c04 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7173 = 1c05 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7174 = 1c06 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7175 = 1c07 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7176 = 1c08 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7177 = 1c09 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7178 = 1c0a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7179 = 1c0b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7180 = 1c0c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7181 = 1c0d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7182 = 1c0e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7183 = 1c0f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7184 = 1c10 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7185 = 1c11 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7186 = 1c12 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7187 = 1c13 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7188 = 1c14 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7189 = 1c15 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7190 = 1c16 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7191 = 1c17 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7192 = 1c18 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7193 = 1c19 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7194 = 1c1a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7195 = 1c1b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7196 = 1c1c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7197 = 1c1d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7198 = 1c1e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7199 = 1c1f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7200 = 1c20 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7201 = 1c21 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7202 = 1c22 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7203 = 1c23 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7204 = 1c24 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7205 = 1c25 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7206 = 1c26 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7207 = 1c27 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7208 = 1c28 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7209 = 1c29 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7210 = 1c2a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7211 = 1c2b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7212 = 1c2c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7213 = 1c2d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7214 = 1c2e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7215 = 1c2f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7216 = 1c30 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7217 = 1c31 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7218 = 1c32 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7219 = 1c33 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7220 = 1c34 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7221 = 1c35 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7222 = 1c36 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7223 = 1c37 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7224 = 1c38 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7225 = 1c39 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7226 = 1c3a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7227 = 1c3b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7228 = 1c3c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7229 = 1c3d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7230 = 1c3e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7231 = 1c3f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7232 = 1c40 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7233 = 1c41 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7234 = 1c42 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7235 = 1c43 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7236 = 1c44 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7237 = 1c45 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7238 = 1c46 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7239 = 1c47 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7240 = 1c48 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7241 = 1c49 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7242 = 1c4a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7243 = 1c4b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7244 = 1c4c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7245 = 1c4d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7246 = 1c4e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7247 = 1c4f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7248 = 1c50 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7249 = 1c51 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7250 = 1c52 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7251 = 1c53 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7252 = 1c54 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7253 = 1c55 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7254 = 1c56 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7255 = 1c57 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7256 = 1c58 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7257 = 1c59 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7258 = 1c5a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7259 = 1c5b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7260 = 1c5c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7261 = 1c5d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7262 = 1c5e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7263 = 1c5f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7264 = 1c60 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7265 = 1c61 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7266 = 1c62 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7267 = 1c63 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7268 = 1c64 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7269 = 1c65 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7270 = 1c66 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7271 = 1c67 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7272 = 1c68 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7273 = 1c69 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7274 = 1c6a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7275 = 1c6b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7276 = 1c6c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7277 = 1c6d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7278 = 1c6e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7279 = 1c6f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7280 = 1c70 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7281 = 1c71 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7282 = 1c72 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7283 = 1c73 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7284 = 1c74 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7285 = 1c75 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7286 = 1c76 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7287 = 1c77 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7288 = 1c78 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7289 = 1c79 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7290 = 1c7a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7291 = 1c7b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7292 = 1c7c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7293 = 1c7d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7294 = 1c7e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7295 = 1c7f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7296 = 1c80 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7297 = 1c81 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7298 = 1c82 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7299 = 1c83 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7300 = 1c84 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7301 = 1c85 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7302 = 1c86 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7303 = 1c87 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7304 = 1c88 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7305 = 1c89 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7306 = 1c8a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7307 = 1c8b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7308 = 1c8c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7309 = 1c8d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7310 = 1c8e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7311 = 1c8f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7312 = 1c90 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7313 = 1c91 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7314 = 1c92 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7315 = 1c93 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7316 = 1c94 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7317 = 1c95 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7318 = 1c96 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7319 = 1c97 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7320 = 1c98 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7321 = 1c99 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7322 = 1c9a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7323 = 1c9b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7324 = 1c9c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7325 = 1c9d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7326 = 1c9e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7327 = 1c9f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7328 = 1ca0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7329 = 1ca1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7330 = 1ca2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7331 = 1ca3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7332 = 1ca4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7333 = 1ca5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7334 = 1ca6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7335 = 1ca7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7336 = 1ca8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7337 = 1ca9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7338 = 1caa */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7339 = 1cab */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7340 = 1cac */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7341 = 1cad */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7342 = 1cae */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7343 = 1caf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7344 = 1cb0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7345 = 1cb1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7346 = 1cb2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7347 = 1cb3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7348 = 1cb4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7349 = 1cb5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7350 = 1cb6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7351 = 1cb7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7352 = 1cb8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7353 = 1cb9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7354 = 1cba */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7355 = 1cbb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7356 = 1cbc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7357 = 1cbd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7358 = 1cbe */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7359 = 1cbf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7360 = 1cc0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7361 = 1cc1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7362 = 1cc2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7363 = 1cc3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7364 = 1cc4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7365 = 1cc5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7366 = 1cc6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7367 = 1cc7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7368 = 1cc8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7369 = 1cc9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7370 = 1cca */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7371 = 1ccb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7372 = 1ccc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7373 = 1ccd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7374 = 1cce */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7375 = 1ccf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7376 = 1cd0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7377 = 1cd1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7378 = 1cd2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7379 = 1cd3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7380 = 1cd4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7381 = 1cd5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7382 = 1cd6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7383 = 1cd7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7384 = 1cd8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7385 = 1cd9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7386 = 1cda */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7387 = 1cdb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7388 = 1cdc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7389 = 1cdd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7390 = 1cde */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7391 = 1cdf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7392 = 1ce0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7393 = 1ce1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7394 = 1ce2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7395 = 1ce3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7396 = 1ce4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7397 = 1ce5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7398 = 1ce6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7399 = 1ce7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7400 = 1ce8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7401 = 1ce9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7402 = 1cea */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7403 = 1ceb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7404 = 1cec */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7405 = 1ced */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7406 = 1cee */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7407 = 1cef */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7408 = 1cf0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7409 = 1cf1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7410 = 1cf2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7411 = 1cf3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7412 = 1cf4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7413 = 1cf5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7414 = 1cf6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7415 = 1cf7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7416 = 1cf8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7417 = 1cf9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7418 = 1cfa */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7419 = 1cfb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7420 = 1cfc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7421 = 1cfd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7422 = 1cfe */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7423 = 1cff */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7424 = 1d00 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7425 = 1d01 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7426 = 1d02 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7427 = 1d03 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7428 = 1d04 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7429 = 1d05 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7430 = 1d06 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7431 = 1d07 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7432 = 1d08 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7433 = 1d09 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7434 = 1d0a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7435 = 1d0b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7436 = 1d0c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7437 = 1d0d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7438 = 1d0e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7439 = 1d0f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7440 = 1d10 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7441 = 1d11 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7442 = 1d12 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7443 = 1d13 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7444 = 1d14 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7445 = 1d15 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7446 = 1d16 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7447 = 1d17 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7448 = 1d18 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7449 = 1d19 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7450 = 1d1a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7451 = 1d1b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7452 = 1d1c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7453 = 1d1d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7454 = 1d1e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7455 = 1d1f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7456 = 1d20 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7457 = 1d21 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7458 = 1d22 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7459 = 1d23 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7460 = 1d24 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7461 = 1d25 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7462 = 1d26 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7463 = 1d27 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7464 = 1d28 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7465 = 1d29 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7466 = 1d2a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7467 = 1d2b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7468 = 1d2c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7469 = 1d2d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7470 = 1d2e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7471 = 1d2f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7472 = 1d30 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7473 = 1d31 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7474 = 1d32 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7475 = 1d33 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7476 = 1d34 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7477 = 1d35 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7478 = 1d36 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7479 = 1d37 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7480 = 1d38 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7481 = 1d39 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7482 = 1d3a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7483 = 1d3b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7484 = 1d3c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7485 = 1d3d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7486 = 1d3e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7487 = 1d3f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7488 = 1d40 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7489 = 1d41 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7490 = 1d42 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7491 = 1d43 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7492 = 1d44 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7493 = 1d45 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7494 = 1d46 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7495 = 1d47 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7496 = 1d48 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7497 = 1d49 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7498 = 1d4a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7499 = 1d4b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7500 = 1d4c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7501 = 1d4d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7502 = 1d4e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7503 = 1d4f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7504 = 1d50 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7505 = 1d51 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7506 = 1d52 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7507 = 1d53 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7508 = 1d54 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7509 = 1d55 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7510 = 1d56 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7511 = 1d57 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7512 = 1d58 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7513 = 1d59 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7514 = 1d5a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7515 = 1d5b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7516 = 1d5c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7517 = 1d5d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7518 = 1d5e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7519 = 1d5f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7520 = 1d60 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7521 = 1d61 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7522 = 1d62 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7523 = 1d63 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7524 = 1d64 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7525 = 1d65 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7526 = 1d66 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7527 = 1d67 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7528 = 1d68 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7529 = 1d69 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7530 = 1d6a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7531 = 1d6b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7532 = 1d6c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7533 = 1d6d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7534 = 1d6e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7535 = 1d6f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7536 = 1d70 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7537 = 1d71 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7538 = 1d72 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7539 = 1d73 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7540 = 1d74 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7541 = 1d75 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7542 = 1d76 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7543 = 1d77 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7544 = 1d78 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7545 = 1d79 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7546 = 1d7a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7547 = 1d7b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7548 = 1d7c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7549 = 1d7d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7550 = 1d7e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7551 = 1d7f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7552 = 1d80 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7553 = 1d81 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7554 = 1d82 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7555 = 1d83 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7556 = 1d84 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7557 = 1d85 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7558 = 1d86 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7559 = 1d87 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7560 = 1d88 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7561 = 1d89 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7562 = 1d8a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7563 = 1d8b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7564 = 1d8c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7565 = 1d8d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7566 = 1d8e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7567 = 1d8f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7568 = 1d90 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7569 = 1d91 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7570 = 1d92 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7571 = 1d93 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7572 = 1d94 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7573 = 1d95 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7574 = 1d96 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7575 = 1d97 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7576 = 1d98 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7577 = 1d99 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7578 = 1d9a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7579 = 1d9b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7580 = 1d9c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7581 = 1d9d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7582 = 1d9e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7583 = 1d9f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7584 = 1da0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7585 = 1da1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7586 = 1da2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7587 = 1da3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7588 = 1da4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7589 = 1da5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7590 = 1da6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7591 = 1da7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7592 = 1da8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7593 = 1da9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7594 = 1daa */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7595 = 1dab */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7596 = 1dac */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7597 = 1dad */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7598 = 1dae */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7599 = 1daf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7600 = 1db0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7601 = 1db1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7602 = 1db2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7603 = 1db3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7604 = 1db4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7605 = 1db5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7606 = 1db6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7607 = 1db7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7608 = 1db8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7609 = 1db9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7610 = 1dba */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7611 = 1dbb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7612 = 1dbc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7613 = 1dbd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7614 = 1dbe */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7615 = 1dbf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7616 = 1dc0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7617 = 1dc1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7618 = 1dc2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7619 = 1dc3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7620 = 1dc4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7621 = 1dc5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7622 = 1dc6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7623 = 1dc7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7624 = 1dc8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7625 = 1dc9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7626 = 1dca */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7627 = 1dcb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7628 = 1dcc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7629 = 1dcd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7630 = 1dce */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7631 = 1dcf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7632 = 1dd0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7633 = 1dd1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7634 = 1dd2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7635 = 1dd3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7636 = 1dd4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7637 = 1dd5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7638 = 1dd6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7639 = 1dd7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7640 = 1dd8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7641 = 1dd9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7642 = 1dda */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7643 = 1ddb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7644 = 1ddc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7645 = 1ddd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7646 = 1dde */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7647 = 1ddf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7648 = 1de0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7649 = 1de1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7650 = 1de2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7651 = 1de3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7652 = 1de4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7653 = 1de5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7654 = 1de6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7655 = 1de7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7656 = 1de8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7657 = 1de9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7658 = 1dea */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7659 = 1deb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7660 = 1dec */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7661 = 1ded */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7662 = 1dee */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7663 = 1def */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7664 = 1df0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7665 = 1df1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7666 = 1df2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7667 = 1df3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7668 = 1df4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7669 = 1df5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7670 = 1df6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7671 = 1df7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7672 = 1df8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7673 = 1df9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7674 = 1dfa */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7675 = 1dfb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7676 = 1dfc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7677 = 1dfd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7678 = 1dfe */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7679 = 1dff */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7680 = 1e00 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7681 = 1e01 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7682 = 1e02 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7683 = 1e03 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7684 = 1e04 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7685 = 1e05 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7686 = 1e06 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7687 = 1e07 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7688 = 1e08 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7689 = 1e09 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7690 = 1e0a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7691 = 1e0b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7692 = 1e0c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7693 = 1e0d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7694 = 1e0e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7695 = 1e0f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7696 = 1e10 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7697 = 1e11 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7698 = 1e12 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7699 = 1e13 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7700 = 1e14 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7701 = 1e15 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7702 = 1e16 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7703 = 1e17 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7704 = 1e18 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7705 = 1e19 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7706 = 1e1a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7707 = 1e1b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7708 = 1e1c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7709 = 1e1d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7710 = 1e1e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7711 = 1e1f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7712 = 1e20 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7713 = 1e21 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7714 = 1e22 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7715 = 1e23 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7716 = 1e24 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7717 = 1e25 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7718 = 1e26 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7719 = 1e27 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7720 = 1e28 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7721 = 1e29 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7722 = 1e2a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7723 = 1e2b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7724 = 1e2c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7725 = 1e2d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7726 = 1e2e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7727 = 1e2f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7728 = 1e30 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7729 = 1e31 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7730 = 1e32 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7731 = 1e33 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7732 = 1e34 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7733 = 1e35 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7734 = 1e36 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7735 = 1e37 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7736 = 1e38 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7737 = 1e39 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7738 = 1e3a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7739 = 1e3b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7740 = 1e3c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7741 = 1e3d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7742 = 1e3e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7743 = 1e3f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7744 = 1e40 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7745 = 1e41 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7746 = 1e42 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7747 = 1e43 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7748 = 1e44 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7749 = 1e45 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7750 = 1e46 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7751 = 1e47 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7752 = 1e48 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7753 = 1e49 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7754 = 1e4a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7755 = 1e4b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7756 = 1e4c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7757 = 1e4d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7758 = 1e4e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7759 = 1e4f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7760 = 1e50 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7761 = 1e51 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7762 = 1e52 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7763 = 1e53 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7764 = 1e54 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7765 = 1e55 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7766 = 1e56 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7767 = 1e57 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7768 = 1e58 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7769 = 1e59 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7770 = 1e5a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7771 = 1e5b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7772 = 1e5c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7773 = 1e5d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7774 = 1e5e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7775 = 1e5f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7776 = 1e60 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7777 = 1e61 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7778 = 1e62 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7779 = 1e63 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7780 = 1e64 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7781 = 1e65 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7782 = 1e66 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7783 = 1e67 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7784 = 1e68 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7785 = 1e69 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7786 = 1e6a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7787 = 1e6b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7788 = 1e6c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7789 = 1e6d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7790 = 1e6e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7791 = 1e6f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7792 = 1e70 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7793 = 1e71 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7794 = 1e72 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7795 = 1e73 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7796 = 1e74 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7797 = 1e75 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7798 = 1e76 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7799 = 1e77 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7800 = 1e78 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7801 = 1e79 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7802 = 1e7a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7803 = 1e7b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7804 = 1e7c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7805 = 1e7d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7806 = 1e7e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7807 = 1e7f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7808 = 1e80 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7809 = 1e81 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7810 = 1e82 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7811 = 1e83 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7812 = 1e84 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7813 = 1e85 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7814 = 1e86 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7815 = 1e87 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7816 = 1e88 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7817 = 1e89 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7818 = 1e8a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7819 = 1e8b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7820 = 1e8c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7821 = 1e8d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7822 = 1e8e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7823 = 1e8f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7824 = 1e90 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7825 = 1e91 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7826 = 1e92 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7827 = 1e93 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7828 = 1e94 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7829 = 1e95 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7830 = 1e96 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7831 = 1e97 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7832 = 1e98 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7833 = 1e99 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7834 = 1e9a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7835 = 1e9b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7836 = 1e9c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7837 = 1e9d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7838 = 1e9e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7839 = 1e9f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7840 = 1ea0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7841 = 1ea1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7842 = 1ea2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7843 = 1ea3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7844 = 1ea4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7845 = 1ea5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7846 = 1ea6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7847 = 1ea7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7848 = 1ea8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7849 = 1ea9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7850 = 1eaa */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7851 = 1eab */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7852 = 1eac */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7853 = 1ead */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7854 = 1eae */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7855 = 1eaf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7856 = 1eb0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7857 = 1eb1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7858 = 1eb2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7859 = 1eb3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7860 = 1eb4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7861 = 1eb5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7862 = 1eb6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7863 = 1eb7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7864 = 1eb8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7865 = 1eb9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7866 = 1eba */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7867 = 1ebb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7868 = 1ebc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7869 = 1ebd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7870 = 1ebe */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7871 = 1ebf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7872 = 1ec0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7873 = 1ec1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7874 = 1ec2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7875 = 1ec3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7876 = 1ec4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7877 = 1ec5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7878 = 1ec6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7879 = 1ec7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7880 = 1ec8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7881 = 1ec9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7882 = 1eca */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7883 = 1ecb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7884 = 1ecc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7885 = 1ecd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7886 = 1ece */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7887 = 1ecf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7888 = 1ed0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7889 = 1ed1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7890 = 1ed2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7891 = 1ed3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7892 = 1ed4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7893 = 1ed5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7894 = 1ed6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7895 = 1ed7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7896 = 1ed8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7897 = 1ed9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7898 = 1eda */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7899 = 1edb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7900 = 1edc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7901 = 1edd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7902 = 1ede */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7903 = 1edf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7904 = 1ee0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7905 = 1ee1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7906 = 1ee2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7907 = 1ee3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7908 = 1ee4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7909 = 1ee5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7910 = 1ee6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7911 = 1ee7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7912 = 1ee8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7913 = 1ee9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7914 = 1eea */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7915 = 1eeb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7916 = 1eec */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7917 = 1eed */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7918 = 1eee */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7919 = 1eef */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7920 = 1ef0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7921 = 1ef1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7922 = 1ef2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7923 = 1ef3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7924 = 1ef4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7925 = 1ef5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7926 = 1ef6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7927 = 1ef7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7928 = 1ef8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7929 = 1ef9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7930 = 1efa */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7931 = 1efb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7932 = 1efc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7933 = 1efd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7934 = 1efe */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7935 = 1eff */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7936 = 1f00 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7937 = 1f01 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7938 = 1f02 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7939 = 1f03 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7940 = 1f04 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7941 = 1f05 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7942 = 1f06 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7943 = 1f07 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7944 = 1f08 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7945 = 1f09 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7946 = 1f0a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7947 = 1f0b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7948 = 1f0c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7949 = 1f0d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7950 = 1f0e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7951 = 1f0f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7952 = 1f10 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7953 = 1f11 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7954 = 1f12 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7955 = 1f13 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7956 = 1f14 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7957 = 1f15 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7958 = 1f16 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7959 = 1f17 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7960 = 1f18 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7961 = 1f19 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7962 = 1f1a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7963 = 1f1b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7964 = 1f1c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7965 = 1f1d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7966 = 1f1e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7967 = 1f1f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7968 = 1f20 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7969 = 1f21 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7970 = 1f22 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7971 = 1f23 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7972 = 1f24 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7973 = 1f25 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7974 = 1f26 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7975 = 1f27 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7976 = 1f28 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7977 = 1f29 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7978 = 1f2a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7979 = 1f2b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7980 = 1f2c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7981 = 1f2d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7982 = 1f2e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7983 = 1f2f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7984 = 1f30 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7985 = 1f31 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7986 = 1f32 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7987 = 1f33 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7988 = 1f34 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7989 = 1f35 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7990 = 1f36 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7991 = 1f37 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7992 = 1f38 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7993 = 1f39 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7994 = 1f3a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7995 = 1f3b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7996 = 1f3c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7997 = 1f3d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7998 = 1f3e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 7999 = 1f3f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8000 = 1f40 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8001 = 1f41 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8002 = 1f42 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8003 = 1f43 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8004 = 1f44 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8005 = 1f45 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8006 = 1f46 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8007 = 1f47 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8008 = 1f48 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8009 = 1f49 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8010 = 1f4a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8011 = 1f4b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8012 = 1f4c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8013 = 1f4d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8014 = 1f4e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8015 = 1f4f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8016 = 1f50 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8017 = 1f51 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8018 = 1f52 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8019 = 1f53 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8020 = 1f54 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8021 = 1f55 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8022 = 1f56 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8023 = 1f57 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8024 = 1f58 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8025 = 1f59 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8026 = 1f5a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8027 = 1f5b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8028 = 1f5c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8029 = 1f5d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8030 = 1f5e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8031 = 1f5f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8032 = 1f60 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8033 = 1f61 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8034 = 1f62 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8035 = 1f63 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8036 = 1f64 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8037 = 1f65 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8038 = 1f66 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8039 = 1f67 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8040 = 1f68 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8041 = 1f69 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8042 = 1f6a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8043 = 1f6b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8044 = 1f6c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8045 = 1f6d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8046 = 1f6e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8047 = 1f6f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8048 = 1f70 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8049 = 1f71 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8050 = 1f72 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8051 = 1f73 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8052 = 1f74 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8053 = 1f75 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8054 = 1f76 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8055 = 1f77 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8056 = 1f78 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8057 = 1f79 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8058 = 1f7a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8059 = 1f7b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8060 = 1f7c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8061 = 1f7d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8062 = 1f7e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8063 = 1f7f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8064 = 1f80 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8065 = 1f81 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8066 = 1f82 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8067 = 1f83 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8068 = 1f84 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8069 = 1f85 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8070 = 1f86 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8071 = 1f87 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8072 = 1f88 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8073 = 1f89 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8074 = 1f8a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8075 = 1f8b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8076 = 1f8c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8077 = 1f8d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8078 = 1f8e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8079 = 1f8f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8080 = 1f90 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8081 = 1f91 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8082 = 1f92 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8083 = 1f93 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8084 = 1f94 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8085 = 1f95 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8086 = 1f96 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8087 = 1f97 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8088 = 1f98 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8089 = 1f99 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8090 = 1f9a */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8091 = 1f9b */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8092 = 1f9c */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8093 = 1f9d */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8094 = 1f9e */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8095 = 1f9f */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8096 = 1fa0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8097 = 1fa1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8098 = 1fa2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8099 = 1fa3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8100 = 1fa4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8101 = 1fa5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8102 = 1fa6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8103 = 1fa7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8104 = 1fa8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8105 = 1fa9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8106 = 1faa */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8107 = 1fab */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8108 = 1fac */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8109 = 1fad */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8110 = 1fae */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8111 = 1faf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8112 = 1fb0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8113 = 1fb1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8114 = 1fb2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8115 = 1fb3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8116 = 1fb4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8117 = 1fb5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8118 = 1fb6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8119 = 1fb7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8120 = 1fb8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8121 = 1fb9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8122 = 1fba */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8123 = 1fbb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8124 = 1fbc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8125 = 1fbd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8126 = 1fbe */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8127 = 1fbf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8128 = 1fc0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8129 = 1fc1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8130 = 1fc2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8131 = 1fc3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8132 = 1fc4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8133 = 1fc5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8134 = 1fc6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8135 = 1fc7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8136 = 1fc8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8137 = 1fc9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8138 = 1fca */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8139 = 1fcb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8140 = 1fcc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8141 = 1fcd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8142 = 1fce */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8143 = 1fcf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8144 = 1fd0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8145 = 1fd1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8146 = 1fd2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8147 = 1fd3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8148 = 1fd4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8149 = 1fd5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8150 = 1fd6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8151 = 1fd7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8152 = 1fd8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8153 = 1fd9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8154 = 1fda */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8155 = 1fdb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8156 = 1fdc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8157 = 1fdd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8158 = 1fde */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8159 = 1fdf */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8160 = 1fe0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8161 = 1fe1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8162 = 1fe2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8163 = 1fe3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8164 = 1fe4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8165 = 1fe5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8166 = 1fe6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8167 = 1fe7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8168 = 1fe8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8169 = 1fe9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8170 = 1fea */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8171 = 1feb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8172 = 1fec */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8173 = 1fed */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8174 = 1fee */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8175 = 1fef */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8176 = 1ff0 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8177 = 1ff1 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8178 = 1ff2 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8179 = 1ff3 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8180 = 1ff4 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8181 = 1ff5 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8182 = 1ff6 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8183 = 1ff7 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8184 = 1ff8 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8185 = 1ff9 */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8186 = 1ffa */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8187 = 1ffb */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8188 = 1ffc */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8189 = 1ffd */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8190 = 1ffe */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ + /* 8191 = 1fff */ {2, 0, 2}, /* 0x0003 => 0x1800+(2048)*/ +}; diff --git a/xie/xc/programs/Xserver/XIE/mixie/fax/fencode.h b/xie/xc/programs/Xserver/XIE/mixie/fax/fencode.h new file mode 100644 index 0000000..d654942 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/fax/fencode.h @@ -0,0 +1,372 @@ +/* $XConsortium: fencode.h,v 1.4 94/04/17 20:34:45 rws Exp $ */ +/**** module fencode.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + fencode.h -- DDXIE header module for FAX encoders + + Ben Fahy, AGE Logic, Sept 1993 + +******************************************************************************/ + +#include "misc.h" /* for pointer */ +#include /* for CARD32 */ + +/*** entry points */ +int encode_g4(); +int encode_g32d(); +int encode_g31d(); +int encode_tiffpb(); +int encode_tiff2(); + +#define FAX_ENCODE_DONE_NOT 0 +#define FAX_ENCODE_DONE_OK 1 +#define ENCODE_ERROR_BadMagic 2 +#define ENCODE_ERROR_BadGoal 3 +#define ENCODE_ERROR_BadStager 4 +#define ENCODE_ERROR_BadRunLength 5 +#define ENCODE_ERROR_BadState 6 +#define ENCODE_ERROR_StripStateNotNew 7 +#define ENCODE_ERROR_NoB1Found 8 +#define ENCODE_ERROR_EncodeRunsFailure 9 + +#define ENCODE_FAX_GOAL_StartNewLine 1 +#define ENCODE_FAX_GOAL_OutputNextRunLength 2 +#define ENCODE_FAX_GOAL_DeduceCode 3 +#define ENCODE_FAX_GOAL_FlushStager 4 +#define ENCODE_FAX_GOAL_FinishLine 5 +#define ENCODE_FAX_GOAL_FlushEOL 6 +#define ENCODE_FAX_GOAL_EOLWritten 7 +#define ENCODE_FAX_GOAL_FindPositions 8 +#define ENCODE_FAX_GOAL_PassMode 9 +#define ENCODE_FAX_GOAL_VerticalMode 10 +#define ENCODE_FAX_GOAL_HorizontalMode 11 +#define ENCODE_FAX_GOAL_Flush2DStager 12 +#define ENCODE_FAX_GOAL_DoneWithA0A1 13 +#define ENCODE_FAX_GOAL_DoneWithA1A2 14 +#define ENCODE_FAX_GOAL_FlushHCode 15 +#define ENCODE_FAX_GOAL_FlushedHCode 16 +#define ENCODE_FAX_GOAL_G4SneaksIn 17 + +#define ENCODE_PB_GOAL_StartNewLine 1 +#define ENCODE_PB_GOAL_OutputNextRunLength 2 +#define ENCODE_PB_GOAL_FlushRunLength 3 +#define ENCODE_PB_GOAL_FlushLiterals 4 +#define ENCODE_PB_GOAL_WriteLiterals 5 +#define ENCODE_PB_GOAL_WriteCodeForRunLength 6 +#define ENCODE_PB_GOAL_WriteValueForRunLength 7 +#define ENCODE_PB_GOAL_WriteNlits 8 +#define ENCODE_PB_GOAL_WriteThisLiteral 9 +#define ENCODE_PB_GOAL_WriteTheLiteral 10 + +typedef struct _fax_encode_state { + int final; /* if final = 1, all input data is available */ + int encoder_done;/* if done = 1, all data sent has been encoded */ + + char **i_lines; /* pointers to beginning of input lines */ + int i_line; /* absolute input line position */ + int nl_tocode; /* how many lines we want encoded */ + + unsigned char *strip; /* latest available *output* strip */ + int strip_size; /* size of that strips */ + int strip_state; /* whether strip is new, being used, or done */ + int use_magic; /* 1 means we are using magic strip */ + int magic_needs; /* 1 means magic strip only have filled */ + unsigned char magicStrip[8]; + /* "pretend" strip for handling strip edges */ + BitStream bits; /* definition of bitstream, current strip */ + + pointer private;/* private data, depends on encoding scheme */ + + int goal; /* our current goal */ + int a0_pos; /* starting changing position on coding line */ + int a1_pos; /* next changing position to right of a0_pos */ + int a0a1; /* distance from a0 to a1 */ + int b1_pos; /* first change above and right of a0, ~color */ + int b2_pos; /* next change above and right of a0, ao_color */ + int a0_color; /* color of a0, either WHITE or BLACK */ + int n_old_trans; /* number of transitions, line above us */ + int *old_trans; /* list of transitions on line above us */ + int n_new_trans; /* number of transitions, current line (so far)*/ + int *new_trans; /* list of transitions on current line */ + int last_b1_idx; /* index of last saved transition we looked at */ + int length_acc; /* accumulates run-lengths for a0a1 or a1a2 */ + int width; /* width of image. So we know end of line */ + int g32d_horiz; /* only relevant for g32d encoding */ + int rl; /* needed if I get EOL in get_a0a1 or get_a1a2 */ + CARD32 stager; /* place for bits to be merged into bytes */ + int radiometric; /* if 1, then white is bright (1) */ +} FaxEncodeState; + +typedef struct _tiff2_epvt { + int *counts; /* runlengths for W/B runs */ + int nvals; /* number of entries in tables */ + int index; /* current position in tables */ + int rlcode; /* code we need to write out */ + int terminating; /* whether this is end or not */ + int codelength; /* how many bits a code takes */ + int align_eol; /* pad last byte in a line w/0 */ + +} Tiff2EncodePvt,G31DEncodePvt; + +typedef struct _packbits_epvt { + int *values; /* array of byte values */ + int *counts; /* runlengths for byte values */ + int nvals; /* number of entries in tables */ + int nlits; /* number of literals to write */ + int index; /* current position in tables */ + int start; /* start position in tables */ + int lits_to_write; /* how many to write at one time*/ + int rlcode; /* code we need to write out */ + int bytes_out; /* sum of literals flushed */ + +} PackBitsEncodePvt; + +typedef struct _g32d_epvt { + int *counts; /* runlengths for W/B runs */ + int nvals; /* number of entries in tables */ + int index; /* current position in tables */ + int save_index; /* save for recovery of index */ + int *above; /* runlengths for lines above */ + int avals; /* number of values, above */ + int aindex; /* current position in above */ + int save_aindex; /* save for recover of aindex */ + int rlcode; /* code we need to write out */ + int terminating; /* whether this is end or not */ + int codelength; /* how many bits a code takes */ + int k; /* do 1-D every K lines */ + int kcnt; /* count of what k we are on */ + int next_goal; /* what to do after rl encode */ + int a1a2; /* second distance in Hmode */ + int a2_pos; /* next position to right of a1 */ + int save_b1pos; /* makes it easier to back up */ + int save_b1color; /* makes it easier to back up */ + int b1_color; /* not a part of state */ + int align_eol; /* pad last byte in a line w/0 */ + int uncompressed; /* not that we should use it... */ + int really_g4; /* if (1), skip EOL junk */ + +} G32DEncodePvt,G42DEncodePvt; + +#if defined(_G32D) + +#define save_state_and_return(state) \ + { \ + state->private = (pointer) epvt; \ + epvt->counts = counts; \ + epvt->above = above; \ + epvt->nvals = nvals; \ + epvt->avals = avals; \ + epvt->index = index; \ + epvt->aindex = aindex; \ + epvt->rlcode = rlcode; \ + epvt->terminating = terminating; \ + epvt->codelength = codelength; \ + epvt->save_index = save_index; \ + epvt->save_aindex = save_aindex; \ + epvt->k = k; \ + epvt->kcnt = kcnt; \ + epvt->a1a2 = a1a2; \ + epvt->save_b1pos = save_b1pos; \ + epvt->save_b1color = save_b1color; \ + epvt->next_goal = next_goal; \ + epvt->b1_color = b1_color; \ + state->bits.byteptr = byteptr; \ + state->bits.endptr = endptr; \ + state->bits.bitpos = bitpos; \ + state->rl = rl; \ + state->goal = goal; \ + state->stager = stager; \ + state->a0_color = a0_color; \ + state->a0a1 = a0a1; \ + state->a0_pos = a0_pos; \ + state->a1_pos = a1_pos; \ + epvt->a2_pos = a2_pos; \ + state->b1_pos = b1_pos; \ + state->length_acc = length_acc; \ + return(lines_coded); \ + } + +#define localize_state(state) \ + epvt = (G32DEncodePvt *) state->private; \ + counts = epvt->counts; \ + nvals = epvt->nvals; \ + index = epvt->index; \ + above = epvt->above; \ + avals = epvt->avals; \ + aindex = epvt->aindex; \ + rlcode = epvt->rlcode; \ + terminating = epvt->terminating; \ + codelength = epvt->codelength; \ + save_index = epvt->save_index; \ + save_aindex = epvt->save_aindex; \ + k = epvt->k; \ + kcnt = epvt->kcnt; \ + a1a2 = epvt->a1a2; \ + save_b1pos = epvt->save_b1pos; \ + save_b1color = epvt->save_b1color; \ + next_goal = epvt->next_goal; \ + b1_color = epvt->b1_color; \ + byteptr = state->bits.byteptr; \ + endptr = state->bits.endptr; \ + bitpos = state->bits.bitpos; \ + goal = state->goal; \ + stager = state->stager; \ + width = state->width; \ + lines_to_code = state->nl_tocode; \ + a0_color = state->a0_color; \ + a0a1 = state->a0a1; \ + a0_pos = state->a0_pos; \ + a1_pos = state->a1_pos; \ + a2_pos = epvt->a2_pos; \ + b1_pos = state->b1_pos; \ + length_acc = state->length_acc; \ + rl = state->rl; + +#endif /* defined(_G32D) */ + +#if defined(_TIFF2) || defined(_G31D) + +#define save_state_and_return(state) \ + { \ + state->private = (pointer) epvt; \ + epvt->counts = counts; \ + epvt->nvals = nvals; \ + epvt->index = index; \ + epvt->rlcode = rlcode; \ + epvt->terminating = terminating; \ + epvt->codelength = codelength; \ + state->bits.byteptr = byteptr; \ + state->bits.endptr = endptr; \ + state->bits.bitpos = bitpos; \ + state->rl = rl; \ + state->goal = goal; \ + state->stager = stager; \ + state->a0_color = a0_color; \ + return(lines_coded); \ + } + +#define localize_state(state) \ + epvt = (Tiff2EncodePvt *) state->private; \ + counts = epvt->counts; \ + nvals = epvt->nvals; \ + index = epvt->index; \ + rlcode = epvt->rlcode; \ + terminating = epvt->terminating; \ + codelength = epvt->codelength; \ + byteptr = state->bits.byteptr; \ + endptr = state->bits.endptr; \ + bitpos = state->bits.bitpos; \ + goal = state->goal; \ + stager = state->stager; \ + width = state->width; \ + lines_to_code = state->nl_tocode; \ + a0_color = state->a0_color; \ + rl = state->rl; + +#endif /* defined(_TIFF2) */ + +#if defined(_PBits) + + +#define save_state_and_return(state) \ + { \ + state->private = (pointer) epvt; \ + epvt->index = index; \ + epvt->start = start; \ + epvt->nlits = nlits; \ + epvt->nvals = nvals; \ + epvt->counts = counts; \ + epvt->values = values; \ + epvt->lits_to_write = lits_to_write; \ + epvt->bytes_out = bytes_out; \ + epvt->rlcode = rlcode; \ + state->bits.byteptr = byteptr; \ + state->bits.endptr = endptr; \ + state->rl = rl; \ + state->goal = goal; \ + return(lines_coded); \ + } + +#define localize_state(state) \ + epvt = (PackBitsEncodePvt *) state->private; \ + index = epvt->index; \ + start = epvt->start; \ + nlits = epvt->nlits; \ + nvals = epvt->nvals; \ + counts = epvt->counts; \ + values = epvt->values; \ + lits_to_write = epvt->lits_to_write; \ + bytes_out = epvt->bytes_out; \ + rlcode = epvt->rlcode; \ + byteptr = state->bits.byteptr; \ + endptr = state->bits.endptr; \ + goal = state->goal; \ + width = state->width; \ + lines_to_code = state->nl_tocode; \ + rl = state->rl; + +#endif /* defined(_Pbits) */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/fax/fetabs.h b/xie/xc/programs/Xserver/XIE/mixie/fax/fetabs.h new file mode 100644 index 0000000..f03c156 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/fax/fetabs.h @@ -0,0 +1,330 @@ +/* $XConsortium: fetabs.h,v 1.3 94/04/17 20:34:46 rws Exp $ */ +/**** module fetabs.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + fetabs.h -- header file holding fax encoding tables + + Ben Fahy, AGE Logic, Sept 1993 + +******************************************************************************/ + +typedef struct _shifted_codes { + unsigned short code; + unsigned short nbits; +} ShiftedCodes; + +#define EOL_CODE (0x001 << 4) +#define EOL_BIT_LENGTH 12 + +#define EOL_1D_CODE (0x0018) +#define EOL_1D_BIT_LENGTH 13 + +#define EOL_2D_CODE (0x0010) +#define EOL_2D_BIT_LENGTH 13 + +#define PASS_CODE (0x1 << 12) +#define PASS_CODE_BIT_LENGTH 4 + +#define HORIZONTAL_CODE (0x1 << 13) +#define HORIZONTAL_CODE_LENGTH 3 + +#define DEDUCE_Vcode(b1_minus_a1,rlcode,nmbits) \ + { rlcode = VerticalCodes[3+b1_minus_a1].code; \ + nmbits = VerticalCodes[3+b1_minus_a1].nbits; \ + } + + +#ifdef FETABS_OWNER +ShiftedCodes VerticalCodes[] = { + (0x03 << 9), 7, /* a1 3 rite of b1 */ + (0x03 <<10), 6, /* a1 2 rite of b1 */ + (0x03 <<13), 3, /* a1 1 rite of b1 */ + (0x01 <<15), 1, /* a1 0 left of b1 */ + (0x02 <<13), 3, /* a1 1 left of b1 */ + (0x02 <<10), 6, /* a1 2 left of b1 */ + (0x02 << 9), 7, /* a1 3 left of b1 */ +}; + +ShiftedCodes ShiftedWhites[] = { + (0x35 << 8), 8, /* run length of zero */ + (0x07 <<10), 6, /* run length of 1 */ + (0x07 <<12), 4, /* run length of 2 */ + (0x08 <<12), 4, /* run length of 3 */ + (0x0b <<12), 4, /* run length of 4 */ + (0x0c <<12), 4, /* run length of 5 */ + (0x0e <<12), 4, /* run length of 6 */ + (0x0f <<12), 4, /* run length of 7 */ + (0x13 <<11), 5, /* run length of 8 */ + (0x14 <<11), 5, /* run length of 9 */ + (0x07 <<11), 5, /* run length of 10 */ + (0x08 <<11), 5, /* run length of 11 */ + (0x08 <<10), 6, /* run length of 12 */ + (0x03 <<10), 6, /* run length of 13 */ + (0x34 <<10), 6, /* run length of 14 */ + (0x35 <<10), 6, /* run length of 15 */ + (0x2a <<10), 6, /* run length of 16 */ + (0x2b <<10), 6, /* run length of 17 */ + (0x27 << 9), 7, /* run length of 18 */ + (0x0c << 9), 7, /* run length of 19 */ + (0x08 << 9), 7, /* run length of 20 */ + (0x17 << 9), 7, /* run length of 21 */ + (0x03 << 9), 7, /* run length of 22 */ + (0x04 << 9), 7, /* run length of 23 */ + (0x28 << 9), 7, /* run length of 24 */ + (0x2b << 9), 7, /* run length of 25 */ + (0x13 << 9), 7, /* run length of 26 */ + (0x24 << 9), 7, /* run length of 27 */ + (0x18 << 9), 7, /* run length of 28 */ + (0x02 << 8), 8, /* run length of 29 */ + (0x03 << 8), 8, /* run length of 30 */ + (0x1a << 8), 8, /* run length of 31 */ + (0x1b << 8), 8, /* run length of 32 */ + (0x12 << 8), 8, /* run length of 33 */ + (0x13 << 8), 8, /* run length of 34 */ + (0x14 << 8), 8, /* run length of 35 */ + (0x15 << 8), 8, /* run length of 36 */ + (0x16 << 8), 8, /* run length of 37 */ + (0x17 << 8), 8, /* run length of 38 */ + (0x28 << 8), 8, /* run length of 39 */ + (0x29 << 8), 8, /* run length of 40 */ + (0x2a << 8), 8, /* run length of 41 */ + (0x2b << 8), 8, /* run length of 42 */ + (0x2c << 8), 8, /* run length of 43 */ + (0x2d << 8), 8, /* run length of 44 */ + (0x04 << 8), 8, /* run length of 45 */ + (0x05 << 8), 8, /* run length of 46 */ + (0x0a << 8), 8, /* run length of 47 */ + (0x0b << 8), 8, /* run length of 48 */ + (0x52 << 8), 8, /* run length of 49 */ + (0x53 << 8), 8, /* run length of 50 */ + (0x54 << 8), 8, /* run length of 51 */ + (0x55 << 8), 8, /* run length of 52 */ + (0x24 << 8), 8, /* run length of 53 */ + (0x25 << 8), 8, /* run length of 54 */ + (0x58 << 8), 8, /* run length of 55 */ + (0x59 << 8), 8, /* run length of 56 */ + (0x5a << 8), 8, /* run length of 57 */ + (0x5b << 8), 8, /* run length of 58 */ + (0x4a << 8), 8, /* run length of 59 */ + (0x4b << 8), 8, /* run length of 60 */ + (0x32 << 8), 8, /* run length of 61 */ + (0x33 << 8), 8, /* run length of 62 */ + (0x34 << 8), 8, /* run length of 63 */ + (0x1b << 11),5, /* run length of 64 */ + (0x12 << 11),5, /* run length of 2*64 = 128 */ + (0x17 << 10),6, /* run length of 3*64 = 192 */ + (0x37 << 9), 7, /* run length of 4*64 = 256 */ + (0x36 << 8), 8, /* run length of 5*64 = 320 */ + (0x37 << 8), 8, /* run length of 6*64 = 384 */ + (0x64 << 8), 8, /* run length of 7*64 = 448 */ + (0x65 << 8), 8, /* run length of 8*64 = 512 */ + (0x68 << 8), 8, /* run length of 9*64 = 576 */ + (0x67 << 8), 8, /* run length of 10*64 = 640 */ + (0x0cc<< 7), 9, /* run length of 11*64 = 704 */ + (0x0cd<< 7), 9, /* run length of 12*64 = 768 */ + (0x0d2<< 7), 9, /* run length of 13*64 = 832 */ + (0x0d3<< 7), 9, /* run length of 14*64 = 896 */ + (0x0d4<< 7), 9, /* run length of 15*64 = 960 */ + (0x0d5<< 7), 9, /* run length of 16*64 = 1024 */ + (0x0d6<< 7), 9, /* run length of 17*64 = 1088 */ + (0x0d7<< 7), 9, /* run length of 18*64 = 1152 */ + (0x0d8<< 7), 9, /* run length of 19*64 = 1216 */ + (0x0d9<< 7), 9, /* run length of 20*64 = 1280 */ + (0x0da<< 7), 9, /* run length of 21*64 = 1344 */ + (0x0db<< 7), 9, /* run length of 22*64 = 1408 */ + (0x098<< 7), 9, /* run length of 23*64 = 1472 */ + (0x099<< 7), 9, /* run length of 24*64 = 1536 */ + (0x09a<< 7), 9, /* run length of 25*64 = 1600 */ + (0x18 <<10), 6, /* run length of 26*64 = 1664 */ + (0x09b<< 7), 9, /* run length of 27*64 = 1728 */ + (0x08 << 5), 11, /* run length of 28*64 = 1792 */ + (0x0c << 5), 11, /* run length of 29*64 = 1856 */ + (0x0d << 5), 11, /* run length of 30*64 = 1920 */ + (0x12 << 4), 12, /* run length of 31*64 = 1984 */ + (0x13 << 4), 12, /* run length of 32*64 = 2048 */ + (0x14 << 4), 12, /* run length of 33*64 = 2112 */ + (0x15 << 4), 12, /* run length of 34*64 = 2176 */ + (0x16 << 4), 12, /* run length of 35*64 = 2240 */ + (0x17 << 4), 12, /* run length of 36*64 = 2304 */ + (0x1c << 4), 12, /* run length of 37*64 = 2368 */ + (0x1d << 4), 12, /* run length of 38*64 = 2432 */ + (0x1e << 4), 12, /* run length of 39*64 = 2496 */ + (0x1f << 4), 12, /* run length of 40*64 = 2560 */ +}; + +ShiftedCodes ShiftedBlacks[] = { + (0x37 << 6),10, /* run length of zero */ + (0x2 <<13), 3, /* run length of 1 */ + (0x3 <<14), 2, /* run length of 2 */ + (0x2 <<14), 2, /* run length of 3 */ + (0x03 <<13), 3, /* run length of 4 */ + (0x03 <<12), 4, /* run length of 5 */ + (0x02 <<12), 4, /* run length of 6 */ + (0x03 <<11), 5, /* run length of 7 */ + (0x05 <<10), 6, /* run length of 8 */ + (0x04 <<10), 6, /* run length of 9 */ + (0x04 << 9), 7, /* run length of 10 */ + (0x05 << 9), 7, /* run length of 11 */ + (0x07 << 9), 7, /* run length of 12 */ + (0x04 << 8), 8, /* run length of 13 */ + (0x07 << 8), 8, /* run length of 14 */ + (0x18 << 7), 9, /* run length of 15 */ + (0x17 << 6),10, /* run length of 16 */ + (0x18 << 6),10, /* run length of 17 */ + (0x08 << 6),10, /* run length of 18 */ + (0x67 << 5),11, /* run length of 19 */ + (0x68 << 5),11, /* run length of 20 */ + (0x6c << 5),11, /* run length of 21 */ + (0x37 << 5),11, /* run length of 22 */ + (0x28 << 5),11, /* run length of 23 */ + (0x17 << 5),11, /* run length of 24 */ + (0x18 << 5),11, /* run length of 25 */ + (0xca << 4),12, /* run length of 26 */ + (0xcb << 4),12, /* run length of 27 */ + (0xcc << 4),12, /* run length of 28 */ + (0xcd << 4),12, /* run length of 29 */ + (0x68 << 4),12, /* run length of 30 */ + (0x69 << 4),12, /* run length of 31 */ + (0x6a << 4),12, /* run length of 32 */ + (0x6b << 4),12, /* run length of 33 */ + (0xd2 << 4),12, /* run length of 34 */ + (0xd3 << 4),12, /* run length of 35 */ + (0xd4 << 4),12, /* run length of 36 */ + (0xd5 << 4),12, /* run length of 37 */ + (0xd6 << 4),12, /* run length of 38 */ + (0xd7 << 4),12, /* run length of 39 */ + (0x6c << 4),12, /* run length of 40 */ + (0x6d << 4),12, /* run length of 41 */ + (0xda << 4),12, /* run length of 42 */ + (0xdb << 4),12, /* run length of 43 */ + (0x54 << 4),12, /* run length of 44 */ + (0x55 << 4),12, /* run length of 45 */ + (0x56 << 4),12, /* run length of 46 */ + (0x57 << 4),12, /* run length of 47 */ + (0x64 << 4),12, /* run length of 48 */ + (0x65 << 4),12, /* run length of 49 */ + (0x52 << 4),12, /* run length of 50 */ + (0x53 << 4),12, /* run length of 51 */ + (0x24 << 4),12, /* run length of 52 */ + (0x37 << 4),12, /* run length of 53 */ + (0x38 << 4),12, /* run length of 54 */ + (0x27 << 4),12, /* run length of 55 */ + (0x28 << 4),12, /* run length of 56 */ + (0x58 << 4),12, /* run length of 57 */ + (0x59 << 4),12, /* run length of 58 */ + (0x2b << 4),12, /* run length of 59 */ + (0x2c << 4),12, /* run length of 60 */ + (0x5a << 4),12, /* run length of 61 */ + (0x66 << 4),12, /* run length of 62 */ + (0x67 << 4),12, /* run length of 63 */ + (0x0f << 6),10, /* run length of 64 */ + (0xc8 << 4),12, /* run length of 2*64 = 128 */ + (0xc9 << 4),12, /* run length of 3*64 = 192 */ + (0x5b << 4),12, /* run length of 4*64 = 256 */ + (0x33 << 4),12, /* run length of 5*64 = 320 */ + (0x34 << 4),12, /* run length of 6*64 = 384 */ + (0x35 << 4),12, /* run length of 7*64 = 448 */ + (0x6c << 3),13, /* run length of 8*64 = 512 */ + (0x6d << 3),13, /* run length of 9*64 = 576 */ + (0x4a << 3),13, /* run length of 10*64 = 640 */ + (0x4b << 3),13, /* run length of 11*64 = 704 */ + (0x4c << 3),13, /* run length of 12*64 = 768 */ + (0x4d << 3),13, /* run length of 13*64 = 832 */ + (0x72 << 3),13, /* run length of 14*64 = 896 */ + (0x73 << 3),13, /* run length of 15*64 = 960 */ + (0x74 << 3),13, /* run length of 16*64 = 1024 */ + (0x75 << 3),13, /* run length of 17*64 = 1088 */ + (0x76 << 3),13, /* run length of 18*64 = 1152 */ + (0x77 << 3),13, /* run length of 19*64 = 1216 */ + (0x52 << 3),13, /* run length of 20*64 = 1280 */ + (0x53 << 3),13, /* run length of 21*64 = 1344 */ + (0x54 << 3),13, /* run length of 22*64 = 1408 */ + (0x55 << 3),13, /* run length of 23*64 = 1472 */ + (0x5a << 3),13, /* run length of 24*64 = 1536 */ + (0x5b << 3),13, /* run length of 25*64 = 1600 */ + (0x64 << 3),13, /* run length of 26*64 = 1664 */ + (0x65 << 3),13, /* run length of 27*64 = 1728 */ + (0x08 << 5), 11, /* run length of 28*64 = 1792 */ + (0x0c << 5), 11, /* run length of 29*64 = 1856 */ + (0x0d << 5), 11, /* run length of 30*64 = 1920 */ + (0x12 << 4), 12, /* run length of 31*64 = 1984 */ + (0x13 << 4), 12, /* run length of 32*64 = 2048 */ + (0x14 << 4), 12, /* run length of 33*64 = 2112 */ + (0x15 << 4), 12, /* run length of 34*64 = 2176 */ + (0x16 << 4), 12, /* run length of 35*64 = 2240 */ + (0x17 << 4), 12, /* run length of 36*64 = 2304 */ + (0x1c << 4), 12, /* run length of 37*64 = 2368 */ + (0x1d << 4), 12, /* run length of 38*64 = 2432 */ + (0x1e << 4), 12, /* run length of 39*64 = 2496 */ + (0x1f << 4), 12, /* run length of 40*64 = 2560 */ +}; + +#else +extern ShiftedCodes VerticalCodes[]; +extern ShiftedCodes ShiftedWhites[]; +extern ShiftedCodes ShiftedBlacks[]; +#endif diff --git a/xie/xc/programs/Xserver/XIE/mixie/fax/gbits.h b/xie/xc/programs/Xserver/XIE/mixie/fax/gbits.h new file mode 100644 index 0000000..b3c2f2f --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/fax/gbits.h @@ -0,0 +1,466 @@ +/* $XConsortium: gbits.h,v 1.4 94/04/17 20:34:47 rws Exp $ */ +/**** module fax/gbits.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + fax/gbits.h -- DDXIE fax decode bitstream - get macros + + Ben Fahy -- AGE Logic, Inc. May, 1993 + +*****************************************************************************/ + +/* + * gbits.h - sub-include file of bits.h, the 'g' stands for "get" + * as in: + * + * bit = get_bit( byteptr,bitpos,endptr); + * byte = get_byte(byteptr,bitpos,endptr); + * code = get_wcode(byteptr,bitpos,endptr); + * code = get_bcode(byteptr,bitpos,endptr); + * + * but I am also including: + * + * adjust_bitstream_8(n,byteptr,bitpos,endptr); + * adjust_bitstream( n,byteptr,bitpos,endptr); + * adjust_1bit( byteptr,bitpos,endptr); + * +*/ + +/* ------------------------------------------------------------------- */ +/* + * do_magic(byteptr,bitpos,endptr); + * + * Macro to attempt to recover from an end-of-strip condition. + * It bridges the gap between current strip and the next by + * copying the last 4 bytes of current strip, together with the + * first four bytes of the next strip, into a 'magic strip', + * which consists of at 8 bytes. Since no FAX codes are longer + * than 13 bits in length, this implies that we have plenty of + * room in the magic strip to finish off decoding everything that + * was copied from the first strip. When we hit the second long + * word in the magic strip, we will trip the endptr condition for + * it and then restore the logical next strip, marking the first + * one as done. + * + * The nice thing about this method is that we don't have to do + * any copying of real-life strips. We just insert a pseudo-strip + * for a very brief amount of time, and the behavior is more or + * less hidden from routines outside this module. + * + */ + +#define do_magic(byteptr,bitpos,endptr) \ + { \ + int o; \ + if (state->use_magic) { \ + /* already using magic strip, switch back to normal */ \ + \ + if (state->strip_state == StripStateNoMore) { \ + /* we are out of data! return number of lines found */ \ + state->decoder_done = 1; \ + } \ + else { \ + /* switch over to next input strip */ \ + o = byteptr - endptr; \ + byteptr = (unsigned char *)state->strip + o; \ + endptr = (unsigned char *)state->strip+state->strip_size-4;\ + state->use_magic = 0; /* aw - the magic is gone :-( */ \ + } \ + } \ + else { \ + /* will switch over to using magic strip */ \ + state->use_magic = 1; \ + state->magicStrip[0] = *(endptr); \ + state->magicStrip[1] = *(endptr+1); \ + state->magicStrip[2] = *(endptr+2); \ + state->magicStrip[3] = *(endptr+3); \ + \ + /* set byteptr in equivalent position in the magic strip */ \ + o = byteptr - endptr; \ + byteptr = o + (unsigned char *)&state->magicStrip[0]; \ + endptr = (unsigned char *)&state->magicStrip[4]; \ + /* will swap back after magicStrip[3] is done */ \ + \ + /* now signal to caller that we want a new strip */ \ + state->magic_needs = 1; \ + state->strip_state = StripStateDone; \ + /* you can toss the old one */ \ + \ + save_state_and_return(state); \ + } /* end of if already magic */ \ + } + +/* ------------------------------------------------------------------- */ +/* + * finish_magic(final); + * + * This macro finishes the job of assembling the magic strip. + * It plugs in the first long word of the new strip in as the + * second long word of the magic strip. + * + * Note that when 'magic_needs' is set, the caller MUST NOT call + * the decoder again until that strip is available, unless final + * is 1 (no more strips coming). + */ + +#define finish_magic(final) \ + { \ + if (state->strip_state == StripStateNew) { \ + /* what a guy! he gave me a new strip. :-) */ \ + state->magicStrip[4] = *(state->strip); \ + state->magicStrip[5] = *(state->strip+1); \ + state->magicStrip[6] = *(state->strip+2); \ + state->magicStrip[7] = *(state->strip+3); \ + state->strip_state = StripStateInUse; \ + } \ + else { \ + /* no new strip?? Better have a good reason! */ \ + if (final) { \ + /* Out of data (good reason), set 2nd magic word to 0 */ \ + state->magicStrip[4] = 0; \ + state->magicStrip[5] = 0; \ + state->magicStrip[6] = 0; \ + state->magicStrip[7] = 0; \ + } \ + else { \ + /* strips left, but I am DENIED?? Shocking! */ \ + state->decoder_done = FAX_DECODE_DONE_ErrorBadMagic; \ + return(lines_found); \ + } \ + } /* end of if (final) */ \ + /* byteptr, bitpos, endptr should already be set up ok */ \ + state->magic_needs = 0; \ + } /* end of finish_magic(final) */ + +/* ------------------------------------------------------------------- */ +/* + * skip_bits_at_eol(byteptr,bitpos,endptr); + * + * Macro to move bitstream position forward to the next even byte + * boundary, if necessary + * + */ +#define skip_bits_at_eol(byteptr,bitpos,endptr) \ + { \ + if (bitpos) { \ + bitpos = 0; \ + if (++byteptr >= endptr) \ + do_magic(byteptr,bitpos,endptr); \ + } \ + } + +/* ------------------------------------------------------------------- */ +/* + * adjust_bitstream_8(n,byteptr,bitpos,endptr); + * + * Macro to move bitstream position forward n bits, where n is + * known to be <= 8. + * + * Strategy: + * There are only two cases: + * + * bitpos+n < 8, => byteptr same, adjust bitpos + * + * bitpos+n >= 8, => bitpos = (bitpos+n)%8, ++byteptr, + * need to check endptr. + */ + +#define adjust_bitstream_8(n,byteptr,bitpos,endptr) \ + { register int tmp=n+bitpos; \ + if (tmp < 8) \ + bitpos=tmp ; /* staying in same byte */ \ + else { /* moving to new byte */ \ + bitpos=tmp%8; /* adjust bitpos */ \ + if (++byteptr >= endptr) \ + do_magic(byteptr,bitpos,endptr); \ + } \ + } + +/* ------------------------------------------------------------------- */ +/* + * adjust_1bit(byteptr,bitpos,endptr); + * + * Macro to move bitstream position forward 1 bit + * + * Strategy: + * oh, poo! Just leverage adjust_bitstream_8( ) + * + */ + +#define adjust_1bit(byteptr,bitpos,endptr) \ + adjust_bitstream_8(1,byteptr,bitpos,endptr) + +/* ------------------------------------------------------------------- */ +/* + * adjust_bitstream(n,byteptr,bitpos,endptr); + * + * Macro to move bitstream position forward n bits, where n is + * known to be <= 13. + * + * Strategy: + * We may need to adjust from 1 to 13 bits. It's easy + * to calculate the new bitpos - it's just (n+bitpos)%8. + * Similarly, the number of bytes to move over is given + * by (n+bitpos)/8. + * + */ + +#define adjust_bitstream(n,byteptr,bitpos,endptr) \ + { register int tmp=n+bitpos; \ + if (tmp < 8) \ + bitpos=tmp ; /* staying in same byte */ \ + else { /* moving to new byte */ \ + bitpos = tmp%8; \ + byteptr += tmp/8; \ + if (byteptr >= endptr) \ + do_magic(byteptr,bitpos,endptr); \ + } \ + } + +/* ------------------------------------------------------------------- */ +/* + * bit = get_bit(byteptr,bitpos,endptr); + * + * Macro to get next coding bit (when searching for tag bit, g32d). + * + * Strategy: + * mask everything but current bitpos, where bitpos counts + * from msbit to lsbit (bitpos=0 means msbit) + * + * NOTE: we do *not* try to align the bit in any way. It is + * assumed that the whole masked byte will be inspected + * at once for non-zero status. + * + */ +#define get_bit(byteptr,bitpos,endptr) \ + ( (*byteptr) & ((unsigned char) 0x080 >> bitpos) ) + + /* Notice endptr isn't actually used, it's just there for show */ +/* ------------------------------------------------------------------- */ +/* + * byte = get_byte(byteptr,bitpos,endptr); + * + * Macro to get next coding byte. + * + * IMPORTANT!! There is no check to make sure that byteptr+1 + * actually point to valid data in the macro below. It + * is assumed this macro will never be called unless it + * has already been verified it is safe to do so. + * + * Strategy: + * If bitpos is 0, all data available in this byte, and + * it's trivial. So let's assume bitpos != 0, so that the + * 8 bits we want straddles two bytes, as below: + * + * bitpos = 3, counting from the left: + * + * 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 + * X X X X X Y Y Y + * + * We want to form an 8-bit byte out of bits XXXXXYYY as + * shown. By inspection, we need to shift the first byte to + * the left three bits, and add the second byte shifted to + * the right the complementary number of times. Thus: + */ +#define get_byte(byteptr,bitpos,endptr) \ + ( bitpos? ( (*byteptr) << bitpos ) | \ + ( (*(byteptr+1))>> (8-bitpos) ) : \ + *byteptr \ + ) + + /* Notice endptr isn't actually used, it's just there for show */ + +#define get_pbyte(byteptr,endptr) \ + ( *byteptr ) + + +/* ------------------------------------------------------------------- */ +/* + * code = get_wcode(byteptr,bitpos,endptr); + * + * Macro to get next white run length + * + * IMPORTANT!! There is no check to make sure that byteptr+1 or + * byteptr+2 actually point to valid data in the macro + * below. It is assumed this macro will never be called + * unless it has already been verified it is safe to do so. + * + * Strategy: + * For the white table we need 12 bits. If bitpos <=4, + * then the first byte will have at least four bits, so + * we only need two bytes. If bitpos >4, we need three + * bytes. + * + * bitpos = 4, starting from 0 counting from the left: + * + * 0 1 2 3 4 + * 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 + * X X X X Y Y Y Y Y Y Y Y + * + * bitpos = 5, starting from 0 counting from the left: + * + * 0 1 2 3 4 5 + * 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 + * X X X Y Y Y Y Y Y Y Y Z + * + * Supose bitpos <=4. For example, suppose bitpos = 3, + * as is pictured below: + * + * 0 1 2 3 4 + * 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 + * X X X X X Y Y Y Y Y Y Y + * + * We need to form a 12 bit word out of XXXXXYYYYYYY. By + * inspection it is easy to see that (4-bitpos) represents + * the number of bits "spilled" to the left of bitpos=4. + * The left-most bit needs to be shifted right to the bit4 + * position, so the solution is to form a word from the + * first two bytes, shift right by (4-bitpos) and mask. + * + * For the case of bitpos=5 (above), (bitpos-4) bits have + * "spilled" into the third byte. We need to form a word + * out of the three consecutive bytes and right shift by + * the amount (8-spill) = 8 - (bitpos-4) = 12-bitpos, then + * mask. + */ +#define two_bytes \ + ( (((unsigned int)*byteptr)<<8) | (*(byteptr+1)) ) + +#define three_bytes \ + ( (((unsigned int)*byteptr)<<16) | \ + (((unsigned int)*(byteptr+1))<<8) | \ + (*(byteptr+2)) ) + +#define get_wcode(byteptr,bitpos,endptr) \ + ( 0x0fff & \ + ( bitpos>4? ( three_bytes >> (12-bitpos) ) \ + : ( two_bytes >> ( 4-bitpos) ) \ + ) \ + ) + + /* Notice endptr isn't actually used, it's just there for show */ + +/* ------------------------------------------------------------------- */ +/* + * code = get_bcode(byteptr,bitpos,endptr); + * + * Macro to get next black run length. + * + * IMPORTANT!! There is no check to make sure that byteptr+1 or + * byteptr+2 actually point to valid data in the macro + * below. It is assumed this macro will never be called + * unless it has already been verified it is safe to do so. + * + * Strategy: + * For the black table we need 13 bits. If bitpos <=3, + * then the first byte will have at least five bits, so + * we only need two bytes. If bitpos >=4, we need three + * bytes. + * + * bitpos = 3, starting from 0 counting from the left: + * + * 0 1 2 3 + * 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 + * X X X X X Y Y Y Y Y Y Y Y + * + * bitpos = 4, starting from 0 counting from the left: + * + * 0 1 2 3 4 + * 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 + * X X X X Y Y Y Y Y Y Y Y Z + * + * Supose bitpos <=3. For example, suppose bitpos = 2, + * as is pictured below: + * + * 0 1 2 3 + * 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 + * X X X X X X Y Y Y Y Y Y Y + * + * We need to form a 13 bit word out of XXXXXXYYYYYYY. By + * inspection it is easy to see that (3-bitpos) represents + * the number of bits "spilled" to the left of bitpos=3. + * The left-most bit needs to be shifted right to the bit3 + * position, so the solution is to form a word from the + * first two bytes, shift right by (3-bitpos) and mask. + * + * For the case of bitpos=4 (above), (bitpos-3) bits have + * "spilled" into the third byte. We need to form a word + * out of the three consecutive bytes and right shift by + * the amount (8-spill) = 8 - (bitpos-3) = 11-bitpos, then + * mask. + */ + +#define get_bcode(byteptr,bitpos,endptr) \ + ( 0x1fff & \ + ( bitpos>3? ( three_bytes >> (11-bitpos) ) \ + : ( two_bytes >> ( 3-bitpos) ) \ + ) \ + ) + + /* Notice endptr isn't actually used, it's just there for show */ + +/* ------------------------------------------------------------------- */ +/**** module fax/gbits.h ****/ diff --git a/xie/xc/programs/Xserver/XIE/mixie/fax/zeroeven.c b/xie/xc/programs/Xserver/XIE/mixie/fax/zeroeven.c new file mode 100644 index 0000000..f172835 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/fax/zeroeven.c @@ -0,0 +1,129 @@ +/* $XConsortium: zeroeven.c /main/5 1995/12/02 16:50:41 dpw $ */ +/**** module fax/zeroeven.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + fax/zeroeven.c -- DDXIE fax utility + + Ben && Larry -- AGE Logic, Inc. May, 1993 + +*****************************************************************************/ + + +/*** zero_even.c - zero out even transitions. + + The array wbtrans is arranged as a table of positions at which + the input changes from white to black, then black to white, then + white to black, and so on. We assume all output pixels have + already been set white. Therefore we only have to fill the + black ranges with zeros... + + W->B B->W W->B B->W W->B B->W W->B B->W + + 12 17 29 30 65 68 90 92 + + bit positions 12-16, 29, 65-67, and 90-91 in the above + example are black. It should be clear from the example + that the size of the run length is t[w]-t[b], where + w=b+1 and b is the index of a transition from white to + black. Note that if the line was only 92 pixels wide, + setting the imaginary pixel with index = image width + B->W still gives us the right answer. + +***/ + +#include + +/**********************************************************************/ + +void +zero_even(cp,t,nt,w,white) +register LogInt *cp; +register int *t, nt,w,white; +{ +unsigned int sbit,ebit; +LogInt *sbyt, *ebyt, black; + +#define ONES ~((LogInt)0) + + memset(cp, white ? 0xff: 0, (w+7)>>3); + black = white ? 0 : ONES; + + for (nt = (nt>>1) - 1; nt >= 0; nt--) { + sbit = *t++; + ebit = *t++; /* if (!nt && (ebit > w)) ebit = w; */ + sbyt = cp + (sbit >> LOGSHIFT); sbit &= LOGMASK; + ebyt = cp + (ebit >> LOGSHIFT); ebit &= LOGMASK; + + if (sbyt < ebyt) { + if (sbit) *sbyt++ ^= BitRight(ONES,sbit); + while (sbyt < ebyt) *sbyt++ = black; + if (ebit) *sbyt ^= ~BitRight(ONES,ebit); + } else + *sbyt ^= BitRight(ONES,sbit) & ~(BitRight(ONES,ebit)); + } +} +/**** module fax/zeroeven.c ****/ diff --git a/xie/xc/programs/Xserver/XIE/mixie/import/Imakefile b/xie/xc/programs/Xserver/XIE/mixie/import/Imakefile new file mode 100644 index 0000000..2741f47 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/import/Imakefile @@ -0,0 +1,33 @@ +XCOMM $XConsortium: Imakefile,v 1.4 93/11/07 10:58:16 rws Exp $ +XCOMM build device dependent machine independent import element objects +#include + +SRCS1 = mifax.c miclut.c micphoto.c midraw.c \ + milut.c miphoto.c miuncomp.c + +OBJS1 = mifax.o miclut.o micphoto.o midraw.o \ + milut.o miphoto.o miuncomp.o + +#if BuildDIS +DEFINES = -DXIE_DIS +#else +SRCS2 = microi.c miroi.c miregion.c mijpeg.c +OBJS2 = microi.o miroi.o miregion.o mijpeg.o +#endif + + SRCS = $(SRCS1) $(SRCS2) + + OBJS = $(OBJS1) $(OBJS2) + + INCLUDES = -I../include -I../../include -I$(SERVERSRC)/include -I$(INCLUDESRC) -I$(INCLUDESRC)/extensions -I../jpeg + LINTLIBS = ../../dixie/export/llib-lexp.ln ../../dixie/import/llib-limp.ln \ + ../../dixie/process/llib-lproc.ln ../../dixie/request/llib-lreq.ln \ + ../control/llib-lctrl.ln ../export/llib-lmexp.ln ../fax/llib-lfax.ln \ + ../import/llib-lmimp.ln ../jpeg/llib-ljpeg.ln ../process/llib-lmproc.ln + +SubdirLibraryRule($(OBJS)) +NormalLibraryObjectRule() +LintLibraryTarget(mimp,$(SRCS)) +NormalLintTarget($(SRCS)) + +DependTarget() diff --git a/xie/xc/programs/Xserver/XIE/mixie/import/miclut.c b/xie/xc/programs/Xserver/XIE/mixie/import/miclut.c new file mode 100644 index 0000000..2f46beb --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/import/miclut.c @@ -0,0 +1,283 @@ +/* $XConsortium: miclut.c /main/6 1995/12/02 16:52:36 dpw $ */ +/**** module miclut.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + miclut.c -- DDXIE prototype import client lut element + + Ben Fahy -- AGE Logic, Inc. May, 1993 + +*****************************************************************************/ + +#define _XIEC_MICLUT +#define _XIEC_ICLUT + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeICLUT(); + +/* + * routines used internal to this module + */ + +static int CreateICLUT(); +static int InitializeICLUT(); +static int ActivateICLUT(); +static int ResetICLUT(); +static int DestroyICLUT(); + +/* + * DDXIE ImportClientLUT entry points + */ + +static ddElemVecRec ICLUTVec = { + CreateICLUT, + InitializeICLUT, + ActivateICLUT, + (xieIntProc)NULL, + ResetICLUT, + DestroyICLUT + }; + +/* + * Local Declarations + */ + +typedef struct _lutpvt { + int byteptr; /* current number of bytes received */ + int bytelength; /* selects total size of array */ + int striplength; /* actual strip size, round up to power of 2 */ + int bytetype; /* selects array element size */ + int bandnum; /* for interleave, to swizzle bands */ +} lutPvtRec, *lutPvtPtr; + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeICLUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* for now just copy our entry point vector into the peDef */ + ped->ddVec = ICLUTVec; + + return(TRUE); +} + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateICLUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + return MakePETex(flo,ped,xieValMaxBands * sizeof(lutPvtRec),NO_SYNC,NO_SYNC); +} + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeICLUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloImportClientLUT *raw = (xieFloImportClientLUT *)ped->elemRaw; + lutPvtPtr ext = (lutPvtPtr) ped->peTex->private; + int band, nbands = ped->peTex->receptor[SRCtag].inFlo->bands; + CARD32 *lengths = &(raw->length0); + CARD32 *levels = &(raw->levels0); + + for (band = 0; band < nbands; band++, ext++, lengths++, levels++) { + int deep; + ext->byteptr = 0; + ext->bytetype = LutPitch(*levels); + ext->bytelength = *lengths * ext->bytetype; + SetDepthFromLevels(ext->bytelength, deep); + ext->striplength = (1 << deep); + ext->bandnum = (raw->class == xieValSingleBand || + raw->bandOrder == xieValLSFirst) + ? band : xieValMaxBands - band - 1; + } + return InitReceptors(flo,ped,NO_DATAMAP,1) && + InitEmitter(flo,ped,NO_DATAMAP,NO_INPLACE); +} + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateICLUT(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + int band, nbands = pet->receptor[SRCtag].inFlo->bands; + bandPtr iband = &(pet->receptor[SRCtag].band[0]); + lutPvtPtr ext = (lutPvtPtr) pet->private; + + for(band = 0; band < nbands; band++, ext++, iband++) { + bandPtr oband = &(pet->emitter[ext->bandnum]); + pointer ivoid, ovoid; + int ilen, icopy; + + if(!(pet->scheduled & 1<striplength,FALSE))) + return(FALSE); + /* + ** We have no guarantee to get all the output in one packet. In + ** fact we have no guarantee we will ever get all the output, or + ** that perhaps we might get too much. If we do get too much we + ** would like to notify the user but the protocol doesn't provide + ** something similar to a decodeNotify. + */ + for(ilen = 0; + ivoid = GetSrcBytes(flo,pet,iband,iband->current+ilen,1,FALSE);) { + icopy = ilen = iband->strip->length; + + if ((ext->byteptr + ilen) > ext->bytelength) + icopy = ext->bytelength - ext->byteptr; + + if (icopy) { + memcpy( ((char *) ovoid) + ext->byteptr, (char *) ivoid, icopy); + ext->byteptr += icopy; + } + } + FreeData(flo, pet, iband, iband->maxLocal); + + /* if final, process the data received */ + if (iband->final) { + SetBandFinal(oband); + PutData(flo,pet,oband,ext->striplength); + } + } + return TRUE; +} + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetICLUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ResetReceptors(ped); + ResetEmitter(ped); + + return(TRUE); +} + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyICLUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.activate = (xieIntProc) NULL; + ped->ddVec.flush = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + + return(TRUE); +} + +/* end module miclut.c */ + diff --git a/xie/xc/programs/Xserver/XIE/mixie/import/micphoto.c b/xie/xc/programs/Xserver/XIE/mixie/import/micphoto.c new file mode 100644 index 0000000..abb77bb --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/import/micphoto.c @@ -0,0 +1,814 @@ +/* $XConsortium: micphoto.c,v 1.8 94/04/17 20:34:49 dpw Exp $ */ +/**** module micphoto.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + micphoto.c -- DDXIE import client photo element + + Robert NC Shelley && Dean Verheiden -- AGE Logic, Inc. April, 1993 + + Fax stuff added by Ben Fahy + +*****************************************************************************/ + +#define _XIEC_MICPHOTO +#define _XIEC_ICPHOTO + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include + +/* + * Local Declarations. + */ + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeICPhoto(); +bandMsk miImportCanonic(); +bandMsk miImportStream(); + +/* + * routines used internal to this module + */ +static int CreateICPhotoUn(); +static int InitializeICPhotoUncomByPlane(); +static int ActivateICPhotoUncomByPlane(); +static int ResetICPhoto(); +static int DestroyICPhotoUn(); + +static int CreateICPhotoStream(); +static int InitializeICPhotoStream(); +static int ActivateICPhotoStream(); + +#if XIE_FULL +static int InitializeICPhotoUncomByPixel(); +static int ActivateICPhotoUncomByPixel(); +#endif + + +/* + * routines we need from somewhere else + */ +extern int CreateICPhotoFax(); +extern int InitializeICPhotoFax(); +extern int ActivateICPhotoFax(); +extern int ResetICPhotoFax(); +extern int DestroyICPhotoFax(); + +#if XIE_FULL +extern int CreateIPhotoJpegBase(); +extern int InitializeICPhotoJpegBase(); +extern int ActivateIPhotoJpegBase(); +extern int ResetIPhotoJpegBase(); +extern int DestroyIPhotoJpegBase(); + +#ifdef optional_non_SI +static int CreateICPhotoJPEGLossless(); +static int InitializeICPhotoJPEGLossless(); +static int ActivateICPhotoJPEGLossless(); +static int DestroyICPhotoJPEGLossless(); +#endif +#endif /* XIE_FULL */ + +/* + * DDXIE ImportClientPhoto entry points + */ +static ddElemVecRec ICPhotoUncomByPlaneVec = { + CreateICPhotoUn, + InitializeICPhotoUncomByPlane, + ActivateICPhotoUncomByPlane, + (xieIntProc)NULL, + ResetICPhoto, + DestroyICPhotoUn + }; + +static ddElemVecRec ICPhotoStreamVec = { + CreateICPhotoStream, + InitializeICPhotoStream, + ActivateICPhotoStream, + (xieIntProc)NULL, + ResetICPhoto, + DestroyICPhotoUn + }; + +static ddElemVecRec ICPhotoFaxVec = { + CreateICPhotoFax, + InitializeICPhotoFax, + ActivateICPhotoFax, + (xieIntProc)NULL, + ResetICPhotoFax, + DestroyICPhotoFax + }; + +#if XIE_FULL +static ddElemVecRec ICPhotoUncomByPixelVec = { + CreateICPhotoUn, + InitializeICPhotoUncomByPixel, + ActivateICPhotoUncomByPixel, + (xieIntProc)NULL, + ResetICPhoto, + DestroyICPhotoUn + }; + +static ddElemVecRec ICPhotoJpegBaseVec = { + CreateIPhotoJpegBase, + InitializeICPhotoJpegBase, /* only thing not shared with ImportPhotomap */ + ActivateIPhotoJpegBase, + (xieIntProc)NULL, + ResetIPhotoJpegBase, + DestroyIPhotoJpegBase + }; +#endif /* XIE_FULL */ + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeICPhoto(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloImportClientPhoto *raw = (xieFloImportClientPhoto *)ped->elemRaw; + + if(!miImportCanonic(flo,ped)) { + ped->ddVec = ICPhotoStreamVec; + return(TRUE); + } + switch(raw->decodeTechnique) { + case xieValDecodeUncompressedSingle: + ped->ddVec = ICPhotoUncomByPlaneVec; + break; + + case xieValDecodeG31D: + case xieValDecodeG32D: + case xieValDecodeG42D: + case xieValDecodeTIFF2: + case xieValDecodeTIFFPackBits: + ped->ddVec = ICPhotoFaxVec; + break; + +#if XIE_FULL + case xieValDecodeUncompressedTriple: + + if(((xieTecDecodeUncompressedTriple*)&raw[1]) + ->interleave == xieValBandByPlane) + ped->ddVec = ICPhotoUncomByPlaneVec; + else { /* xieValBandByPixel */ + ped->ddVec = ICPhotoUncomByPixelVec; + break; + } + break; + + case xieValDecodeJPEGBaseline: + ped->ddVec = ICPhotoJpegBaseVec; + break; +#endif /* XIE_FULL */ + + default: + ImplementationError(flo,ped, return(FALSE)); + } + return(TRUE); +} /* end miAnalyzeICPhoto */ + + +/*------------------------------------------------------------------------ +-------- utility routines: see what kind data should be forwarded -------- +------------------------------------------------------------------------*/ +bandMsk miImportCanonic(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + bandMsk mask = NO_BANDS, all = (1<outFlo.bands)-1; + inFloPtr inf; + int b; + + /* find recipients that want canonic data + */ + for(inf = ped->outFlo.outChain; inf && mask != all; inf = inf->outChain) + for(b = 0; b < inf->bands; ++b) + if(IsCanonic(inf->format[b].class)) + mask |= 1<outFlo.bands)-1; + inFloPtr inf; + int b; + + /* find recipients that want stream data + */ + for(inf = ped->outFlo.outChain; inf && mask != all; inf = inf->outChain) + for(b = 0; b < inf->bands; ++b) + if(inf->format[b].class == STREAM) + mask |= 1<elemRaw; + peTexPtr pet = ped->peTex; + miUncompPtr pvt = (miUncompPtr)pet->private; + CARD32 nbands = ped->outFlo.bands,b,s; + formatPtr inf = ped->inFloLst[IMPORT].format; + xieTypOrientation pixelOrder, fillOrder; + CARD8 *ppad; + + if (nbands == 1) { + xieTecDecodeUncompressedSingle *tec = ((xieTecDecodeUncompressedSingle*) + &raw[1]); + pixelOrder = tec->pixelOrder; + fillOrder = tec->fillOrder; + pvt->bandMap = 0; + ppad = &tec->leftPad; + } else { + xieTecDecodeUncompressedTriple *tec = ((xieTecDecodeUncompressedTriple*) + &raw[1]); + pixelOrder = tec->pixelOrder; + fillOrder = tec->fillOrder; + ppad = tec->leftPad; + if (tec->bandOrder == xieValLSFirst) + for(b = 0; b < xieValMaxBands; ++b) + pvt[b].bandMap = b; + else + for(s = 0, b = xieValMaxBands; b--; ++s) + pvt[s].bandMap = b; + } + + for (b = 0; b < nbands; b++, pvt++, ppad++, inf++) { + pvt->bitOff = pvt->leftPad = *ppad; + if (inf->depth == 1) { +#if (IMAGE_BYTE_ORDER == MSBFirst) + if (pvt->leftPad & 7 || inf->stride != 1) { + pvt->action = (fillOrder == xieValMSFirst) ? CPextractstreambits: + CPextractswappedstreambits; + } else { + pvt->action = (fillOrder == xieValMSFirst) ? CPpass_bits : + CPreverse_bits; + } +#else + if (pvt->leftPad & 7 || inf->stride != 1) { + pvt->action = (fillOrder == xieValLSFirst) ? CPextractstreambits: + CPextractswappedstreambits; + } else { + pvt->action = (fillOrder == xieValLSFirst) ? CPpass_bits : + CPreverse_bits; + } +#endif + } else if (inf->depth <= 8) { + if (pvt->leftPad & 7 || inf->stride & 7) { + /* They chose . . . poorly */ + if (pixelOrder == xieValMSFirst) { + if(fillOrder == xieValMSFirst) + pvt->action = MMUBtoB; + else + pvt->action = MLUBtoB; + } else { + if(fillOrder == xieValMSFirst) + pvt->action = LMUBtoB; + else + pvt->action = LLUBtoB; + } + } else { + /* They chose wisely */ + pvt->action = CPpass_bytes; + } + } else if (inf->depth <= 16) { + if (pvt->leftPad & 15 || inf->stride & 15) { + /* They chose . . . poorly */ + if (pixelOrder == xieValMSFirst) { + if(fillOrder == xieValMSFirst) + pvt->action = MMUPtoP; + else + pvt->action = MLUPtoP; + } else { + if(fillOrder == xieValMSFirst) + pvt->action = LMUPtoP; + else + pvt->action = LLUPtoP; + } + } else { + /* They chose wisely */ +#if (IMAGE_BYTE_ORDER == MSBFirst) + pvt->action = (fillOrder==xieValMSFirst) ? CPpass_pairs : CPswap_pairs; +#else + pvt->action = (fillOrder==xieValLSFirst) ? CPpass_pairs : CPswap_pairs; +#endif + } + } else if (inf->depth <= 24) { + if (pvt->leftPad & 31 || inf->stride & 31) { + /* They chose . . . poorly */ + if (pixelOrder == xieValMSFirst) { + if(fillOrder == xieValMSFirst) + pvt->action = MMUQtoQ; + else + pvt->action = MLUQtoQ; + } else { + if(fillOrder == xieValMSFirst) + pvt->action = LMUQtoQ; + else + pvt->action = LLUQtoQ; + } + } else { + /* They chose wisely */ +#if (IMAGE_BYTE_ORDER == MSBFirst) + pvt->action = (fillOrder==xieValMSFirst) ? CPpass_quads : CPswap_quads; +#else + pvt->action = (fillOrder==xieValLSFirst) ? CPpass_quads : CPswap_quads; +#endif + } + } else { + ImplementationError(flo,ped, return(FALSE)); + } + } + pet->receptor->forward = miImportStream(flo,ped); + return(InitReceptors(flo, ped, NO_DATAMAP, 1) && + InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE)); +} /* end InitializeICPhotoUnSingle */ + + +static int InitializeICPhotoStream(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* tell the data manager to forward our input data to downstream elements + */ + ped->peTex->receptor->forward = miImportStream(flo,ped); + + return(InitReceptors(flo, ped, NO_DATAMAP, 1)); +} /* end InitializeICPhotoStream */ + + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateICPhotoUncomByPlane(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloImportClientPhoto *raw = (xieFloImportClientPhoto *)ped->elemRaw; + miUncompPtr pvt = (miUncompPtr)pet->private; + CARD32 nbands = ped->inFloLst[IMPORT].bands; + bandPtr sbnd = pet->receptor[IMPORT].band, dbnd; + CARD32 oldslen, nextslen, b; + pointer src = (pointer)NULL, dst = (pointer)NULL; + + for(b = 0; b < nbands; ++sbnd, ++b, pvt++) { + void (*action)() = pvt->action; + + nextslen = pvt->bitOff + sbnd->format->pitch + 7 >> 3; + dbnd = &pet->emitter[pvt->bandMap]; + if(pet->scheduled & 1<current,nextslen,KEEP)) && + (dst = GetCurrentDst(flo,pet,dbnd))) { + do { + + (*action)(src, dst, sbnd->format->width, pvt->bitOff, + (CARD32)sbnd->format->depth, + sbnd->format->stride); + + pvt->bitOff = pvt->bitOff + sbnd->format->pitch & 7; /* Set next */ + oldslen = (pvt->bitOff) ? nextslen - 1 : nextslen; + nextslen = pvt->bitOff + sbnd->format->pitch + 7 >> 3; + src = GetSrcBytes(flo,pet,sbnd,sbnd->current+oldslen,nextslen,KEEP); + dst = GetNextDst(flo,pet,dbnd,FLUSH); + } while(src && dst); + } + + if(!src && sbnd->final && dbnd->current < dbnd->format->height) { + /* + * the client lied about the image size! + */ + if(raw->notify) + SendDecodeNotifyEvent(flo, ped, dbnd->band, + xieValDecodeUncompressedSingle, + dbnd->format->width, dbnd->current, TRUE); + /* + * If the client didn't send enough data, we could zero-fill the + * remaining lines. Since we sent the "aborted" status, we won't + * bother (the protocol offers both choices). + */ + ValueError(flo,ped,dbnd->format->height, return(FALSE)); + } + if (!src || dbnd->final) { + /* free whatever we've used so far and + * set the threshold to one byte more than whatever is left over + */ + FreeData(flo, pet, sbnd, sbnd->final ? sbnd->maxGlobal : sbnd->current); + SetBandThreshold(sbnd, sbnd->available + 1); + } + } + return(TRUE); +} /* end ActivateICPhotoUncomByPlane */ + + +static int ActivateICPhotoStream(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + CARD32 nbands = ped->inFloLst[IMPORT].bands; + bandPtr bnd = pet->receptor[IMPORT].band; + CARD32 b; + + for(b = 0; b < nbands; ++bnd, ++b) { + if(GetSrcBytes(flo,pet,bnd,bnd->current,1,KEEP)) + FreeData(flo,pet,bnd,bnd->maxGlobal); + } + return(TRUE); +} /* end ActivateICPhotoStream */ + + + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetICPhoto(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ResetReceptors(ped); + ResetEmitter(ped); + + return(TRUE); +} /* end ResetICPhoto */ + + + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyICPhotoUn(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.activate = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + + return(TRUE); +} /* end DestroyICPhotoUn */ + + +#if XIE_FULL +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeICPhotoUncomByPixel(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloImportClientPhoto *raw = (xieFloImportClientPhoto *)ped->elemRaw; + peTexPtr pet = ped->peTex; + miUncompPtr pvt = (miUncompPtr)pet->private; + bandPtr sbnd = &ped->peTex->receptor[IMPORT].band[0]; + CARD32 sstride = sbnd->format->stride>>3; + xieTecDecodeUncompressedTriple *tec = ((xieTecDecodeUncompressedTriple*) + &raw[1]); + CARD8 leftPad = tec->leftPad[0]>>3; + CARD32 depth1, depth2, depth3; + int s, d; + + pvt->unaligned = FALSE; /* Hope for the best */ + + if(tec->bandOrder == xieValLSFirst) + for(d = 0; d < xieValMaxBands; ++d) + pvt[d].bandMap = d; + else + for(s = 0, d = xieValMaxBands; d--; ++s) + pvt[s].bandMap = d; + + depth1 = pet->emitter[pvt[0].bandMap].format->depth; + depth2 = pet->emitter[pvt[1].bandMap].format->depth; + depth3 = pet->emitter[pvt[2].bandMap].format->depth; + + pvt->bitOff = pvt->leftPad = tec->leftPad[0]; + + /* See if data is nicely aligned */ + if (!(tec->leftPad[0] & 7) && !(sbnd->format->stride & 7)) { + if (depth1 == 16 && depth2 == 16 && depth3 == 16) { +#if (IMAGE_BYTE_ORDER == MSBFirst) + void (*pa)() = (tec->pixelOrder == xieValMSFirst) ? StoP : StosP; +#else + void (*pa)() = (tec->pixelOrder == xieValMSFirst) ? StosP : StoP; +#endif + for(s = 0; s < xieValMaxBands; s++, pvt++) { + pvt->action = pa; + pvt->Bstride = sstride; + pvt->srcoffset = s + leftPad; + pvt->mask = 0; /* Unused */ + pvt->shift = 0; /* Unused */ + } + } else if (depth1 == 8 && depth2 == 8 && depth3 == 8) { + for(s = 0; s < xieValMaxBands; s++, pvt++) { + pvt->action = StoB; + pvt->Bstride = sstride; + pvt->srcoffset = s + leftPad; + pvt->mask = 0; /* Unused */ + pvt->shift = 0; /* Unused */ + } + } else if (depth1 == 4 && depth2 == 4 && depth3 == 4) { + if (tec->fillOrder == xieValMSFirst) { + pvt->action = SbtoB; + pvt->Bstride = sstride; + pvt->srcoffset = leftPad; + pvt->mask = 0xf0; + (pvt++)->shift = 4; + pvt->action = SbtoB; + pvt->Bstride = sstride; + pvt->srcoffset = leftPad; + pvt->mask = 0x0f; + (pvt++)->shift = 0; + pvt->action = SbtoB; + pvt->Bstride = sstride; + pvt->srcoffset = 1 + leftPad; + pvt->mask = 0xf0; + pvt->shift = 4; + } else { /* xieValLSFirst */ + pvt->action = SbtoB; + pvt->Bstride = sstride; + pvt->srcoffset = leftPad; + pvt->mask = 0x0f; + (pvt++)->shift = 0; + pvt->action = SbtoB; + pvt->Bstride = sstride; + pvt->srcoffset = leftPad; + pvt->mask = 0xf0; + (pvt++)->shift = 4; + pvt->action = SbtoB; + pvt->Bstride = sstride; + pvt->srcoffset = 1 + leftPad; + pvt->mask = 0x0f; + pvt->shift = 0; + } + } else if (depth1 + depth2 + depth3 <= 8) { + CARD8 ones = 0xff,smask1,smask2,smask3,shift1,shift2,shift3; + if (tec->fillOrder == xieValMSFirst) { + smask1 = ~(ones>>depth1); + smask2 = ~(ones>>(depth1 + depth2) | smask1); + smask3 = ~(ones>>(depth1 + depth2 + depth3) | smask1 | smask2); + shift1 = 8 - depth1; + shift2 = 8 - (depth1 + depth2); + shift3 = 8 - (depth1 + depth2 + depth3); + } else { /* fillOrder == xieValLSFirst */ + smask3 = ~(ones<action = (depth1 > 1) ? SbtoB : Sbtob; + pvt->Bstride = sstride; + pvt->srcoffset = leftPad; + pvt->mask = smask1; + (pvt++)->shift = shift1; + pvt->action = (depth2 > 1) ? SbtoB : Sbtob; + pvt->Bstride = sstride; + pvt->srcoffset = leftPad; + pvt->mask = smask2; + (pvt++)->shift = shift2; + pvt->action = (depth3 > 1) ? SbtoB : Sbtob; + pvt->Bstride = sstride; + pvt->srcoffset = leftPad; + pvt->mask = smask3; + pvt->shift = shift3; + } else { + pvt->unaligned = TRUE; + } + } else { + pvt->unaligned = TRUE; + } + + /* Wasn't nicely aligned, do it the hard way */ + if (((miUncompPtr)pet->private)->unaligned) { + pvt->action = + ExtractTripleFuncs[(tec->pixelOrder == xieValLSFirst) ? 0 : 1] + [(tec->fillOrder == xieValLSFirst) ? 0 : 1] + [(depth1 <= 8) ? 0 : 1] + [(depth2 <= 8) ? 0 : 1] + [(depth3 <= 8) ? 0 : 1]; + } + pet->receptor->forward = miImportStream(flo,ped); + return(InitReceptors(flo, ped, NO_DATAMAP, 1) && + InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE)); +} /* end InitializeICPhotoUnTriple */ + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateICPhotoUncomByPixel(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloImportClientPhoto *raw = (xieFloImportClientPhoto *)ped->elemRaw; + miUncompPtr pvt = (miUncompPtr) (pet->private); + bandPtr sbnd = &pet->receptor[IMPORT].band[0]; + bandPtr db0 = &pet->emitter[pvt[0].bandMap]; + bandPtr db1 = &pet->emitter[pvt[1].bandMap]; + bandPtr db2 = &pet->emitter[pvt[2].bandMap]; + CARD32 width = db0->format->width; + pointer src = NULL, dp0 = NULL, dp1 = NULL, dp2 = NULL; + + if (pvt->unaligned) { + CARD32 oldslen, nextslen; + void (*action)() = pvt->action; + CARD32 depth0 = db0->format->depth; + CARD32 depth1 = db1->format->depth; + CARD32 depth2 = db2->format->depth; + CARD32 stride = sbnd->format->stride; + + nextslen = pvt->bitOff + sbnd->format->pitch + 7 >> 3; + if((src = GetSrcBytes(flo,pet,sbnd,sbnd->current,nextslen,KEEP)) + && (dp0 = GetCurrentDst(flo,pet,db0)) && + (dp1 = GetCurrentDst(flo,pet,db1)) && + (dp2 = GetCurrentDst(flo,pet,db2))) + do { + + (*action)(src,dp0,dp1,dp2,width,pvt->bitOff,depth0,depth1,depth2, + stride); + + pvt->bitOff = pvt->bitOff + sbnd->format->pitch & 7; /* Set next */ + oldslen = (pvt->bitOff) ? nextslen - 1 : nextslen; + nextslen = pvt->bitOff + sbnd->format->pitch + 7 >> 3; + src = GetSrcBytes(flo,pet,sbnd,sbnd->current+oldslen,nextslen,KEEP); + dp0 = GetNextDst(flo,pet,db0,FLUSH); + dp1 = GetNextDst(flo,pet,db1,FLUSH); + dp2 = GetNextDst(flo,pet,db2,FLUSH); + } while(src && dp0 && dp1 && dp2); + } else { + CARD32 slen = sbnd->format->pitch+7>>3; + if((src = GetSrcBytes(flo,pet,sbnd,sbnd->current,slen,KEEP)) && + (dp0 = GetCurrentDst(flo,pet,db0)) && + (dp1 = GetCurrentDst(flo,pet,db1)) && + (dp2 = GetCurrentDst(flo,pet,db2))) + do { + + (*pvt[0].action)(src,dp0,width,&pvt[0]); + (*pvt[1].action)(src,dp1,width,&pvt[1]); + (*pvt[2].action)(src,dp2,width,&pvt[2]); + + src = GetSrcBytes(flo,pet,sbnd,sbnd->current+slen,slen,KEEP); + dp0 = GetNextDst(flo,pet,db0,FLUSH); + dp1 = GetNextDst(flo,pet,db1,FLUSH); + dp2 = GetNextDst(flo,pet,db2,FLUSH); + } while(src && dp0 && dp1 && dp2); + } + if(!src && sbnd->final && db0->current < db0->format->height) { + /* + * the client lied about the image size! + */ + if(raw->notify) + SendDecodeNotifyEvent(flo, ped, 0, xieValDecodeUncompressedTriple, + db0->format->width, db0->current, TRUE); + /* + * If the client didn't send enough data, we could zero-fill the + * remaining lines. Since we sent the "aborted" status, we won't + * bother (the protocol offers both choices). + */ + ValueError(flo,ped,db0->format->height, return(FALSE)); + } + if (!src || db0->final && db1->final && db2->final) { + /* free whatever we've used so far and + * set the threshold to one byte more than whatever is left over + */ + FreeData(flo, pet, sbnd, sbnd->final ? sbnd->maxGlobal : sbnd->current); + SetBandThreshold(sbnd, sbnd->available + 1); + } + return(TRUE); +} /* end ActivateICPhotoUncomByPixel */ +#endif /* XIE_FULL */ + +/* end module micphoto.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/import/microi.c b/xie/xc/programs/Xserver/XIE/mixie/import/microi.c new file mode 100644 index 0000000..6d4a648 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/import/microi.c @@ -0,0 +1,390 @@ +/* $XConsortium: microi.c /main/7 1995/12/02 16:52:40 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module microi.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + microi.c -- DDXIE import client roi element + + Dean Verheiden -- AGE Logic, Inc. August, 1993 + +*****************************************************************************/ + +#define _XIEC_MICROI + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include + +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeICROI(); + +/* + * routines used internal to this module + */ +static int CreateICROI(); +static int InitializeICROI(); +static int ActivateICROI(); +static int ResetICROI(); +static int DestroyICROI(); + +static void rectCvt(); + +/* + * DDXIE ImportClientROI entry points + */ +static ddElemVecRec ICROIVec = +{ + CreateICROI, + InitializeICROI, + ActivateICROI, + (xieIntProc)NULL, + ResetICROI, + DestroyICROI +}; + + +typedef struct _microidef { + XieRegionPtr roireg; + CARD32 currentRect; /* Current rectangle from input stream */ +} miCROIDefRec, *miCROIDefPtr; + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeICROI(flo,ped) +floDefPtr flo; +peDefPtr ped; +{ + /* for now just stash our entry point vector in the peDef */ + ped->ddVec = ICROIVec; + return(TRUE); +} /* end miAnalyzeICROI */ + + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateICROI(flo,ped) +floDefPtr flo; +peDefPtr ped; +{ + /* attach an execution context to the roi element definition */ + return MakePETex(flo,ped,sizeof(miCROIDefRec),NO_SYNC,NO_SYNC); +} /* end CreateICROI */ + + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeICROI(flo,ped) +floDefPtr flo; +peDefPtr ped; +{ + xieFloImportClientROI *raw = (xieFloImportClientROI *)ped->elemRaw; + miCROIDefPtr rp = (miCROIDefPtr)ped->peTex->private; + XieRegionPtr miXieRegionCreate(); + + /* init icroi private data */ + if (!(rp->roireg = miXieRegionCreate((XieBoxRec *)NULL, + (int)raw->rectangles))) + AllocError(flo,ped, return(FALSE)); + + rp->currentRect = 0; + if (raw->rectangles > 1) + rp->roireg->data->numRects = raw->rectangles; + + return InitReceptors(flo,ped,NO_DATAMAP,1) && + InitEmitter(flo,ped,NO_DATAMAP,NO_INPLACE); +} /* end InitializeICROI */ + + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateICROI(flo,ped,pet) +floDefPtr flo; +peDefPtr ped; +peTexPtr pet; +{ + miCROIDefPtr rp = (miCROIDefPtr) pet->private; + bandPtr sbnd = &pet->receptor[IMPORT].band[0]; + bandPtr dbnd = &pet->emitter[0]; + CARD32 maxRect = ((xieFloImportClientROI *)ped->elemRaw)->rectangles; + xieTypRectangle *irect = (xieTypRectangle*)GetSrcBytes(flo,pet,sbnd, + sbnd->current, sizeof(xieTypRectangle),KEEP); + XieBoxRec *rects, *br; + CARD32 yxbands, size; + ROIPtr roi; + + if(dbnd->final) { + /* the client is being over generous, quietly discard the extra data */ + FreeData(flo,pet,sbnd,sbnd->maxGlobal); + return(TRUE); + } + + /* Stuff rectangles into XieBoxRec struct + */ + if (irect && maxRect == 1) { + rectCvt(irect,&rp->roireg->extents); + rp->currentRect++; + } else { + rects = (XieBoxRec *)&rp->roireg->data[1]; + br = &rects[rp->currentRect]; + while (irect && rp->currentRect < maxRect) { + rectCvt(irect,br++); + rp->currentRect++; + irect = (xieTypRectangle*)GetSrcBytes(flo,pet,sbnd, + sbnd->current + sizeof(xieTypRectangle), + sizeof(xieTypRectangle),KEEP); + } + } + + /* Ran out of rectangles, see if all have arrived + */ + if(!irect && sbnd->final || rp->currentRect >= maxRect) { + if(rp->currentRect < maxRect) { + /* the client lied about the number of rectangles! */ + ValueError(flo,ped,maxRect,return(FALSE)); + } else { /* All rectangles received, band them */ + Bool Overlap; + if (!miXieRegionValidate(rp->roireg,&Overlap)) + AllocError(flo,ped,return(FALSE)); /* Best guess */ + } + SetBandThreshold(sbnd,1); + FreeData(flo,pet,sbnd,sbnd->maxGlobal); + } else if (!irect) { + /* free whatever we've used so far and + * set the threshold to one byte more than whatever is left over + */ + FreeData(flo,pet,sbnd,sbnd->current); + SetBandThreshold(sbnd,sbnd->available + 1); + return(TRUE); + } + + /* At this point, all rectangles are here and everything appears to be OK + */ + if (rp->roireg->data && rp->roireg->data->numRects) { + rects = (XieBoxRec *)&rp->roireg->data[1]; + maxRect = rp->roireg->data->numRects; + } else { /* Only one box */ + rects = &rp->roireg->extents; + maxRect = 1; + } + + /* Step through rectangles and count up the total number of (y-x) bands + */ + if (maxRect) { + CARD32 r = 1; + INT32 y = rects[0].y1; + + yxbands = 1; + while (1) { + while (r < maxRect && y == rects[r].y1) r++; + if (r == maxRect) break; + y = rects[r].y1; + yxbands++; + } + } else { + yxbands = 0; + } + + /* Allocate storage for run length table + */ + size = sizeof(ROIRec)+sizeof(lineRec)*yxbands+sizeof(runRec)*maxRect; + + if(!(roi = (ROIRec*)GetDstBytes(flo,pet,dbnd,0,size,FALSE))) + AllocError(flo,ped,return(FALSE)); + + roi->x = rp->roireg->extents.x1; + roi->y = rp->roireg->extents.y1; + roi->width = rp->roireg->extents.x2 - roi->x; + roi->height = rp->roireg->extents.y2 - roi->y; + roi->nrects = maxRect; + roi->lend = LEND(dbnd); + + /* Fill in the run lengths + */ + if (maxRect) { + CARD32 r = 1; + INT32 y = rects[0].y1; + linePtr lp = (linePtr)&roi[1]; + runPtr rp = (runPtr)&lp[1]; + + lp->y = rects[0].y1; + lp->nline = rects[0].y2 - rects[0].y1; + lp->nrun = 1; + rp->dstart = rects[0].x1 - roi->x; + (rp++)->length = rects[0].x2 - rects[0].x1; + + while (1) { + while (r < maxRect && y == rects[r].y1) { + rp->dstart = rects[r].x1 - rects[r-1].x2; + (rp++)->length = rects[r].x2 - rects[r].x1; + lp->nrun++; + r++; + } + if (r == maxRect) break; + + lp = (linePtr)rp; + rp = (runPtr)&lp[1]; + lp->y = rects[r].y1; + lp->nline = rects[r].y2 - rects[r].y1; + lp->nrun = 1; + rp->dstart = (CARD32)rects[r].x1 - (CARD32)roi->x; + (rp++)->length = rects[r].x2 - rects[r].x1; + y = rects[r++].y1; + } + } + + SetBandFinal(dbnd); + PutData(flo,pet,dbnd,size); + + return (TRUE); +} /* end ActivateICROI */ + +/*------------------------------------------------------------------------ +------------------------- rectangle to box converter --------------------- +------------------------------------------------------------------------*/ +static void rectCvt(irect,br) +xieTypRectangle *irect; +XieBoxRec *br; +{ + br->x1 = irect->x; + br->y1 = irect->y; + br->x2 = br->x1 + irect->width; + br->y2 = br->y1 + irect->height; +} + + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetICROI(flo,ped) +floDefPtr flo; +peDefPtr ped; +{ + miCROIDefPtr rp = (miCROIDefPtr)ped->peTex->private; + + if (rp && rp->roireg) { + miXieRegionDestroy(rp->roireg); + rp->roireg = (XieRegionPtr)NULL; + } + ResetReceptors(ped); + ResetEmitter(ped); + return TRUE; +} /* end ResetICROI */ + + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyICROI(flo,ped) +floDefPtr flo; +peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.activate = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + + return TRUE; +} /* end DestroyICROI */ + +/* end module microi.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/import/midraw.c b/xie/xc/programs/Xserver/XIE/mixie/import/midraw.c new file mode 100644 index 0000000..eeec940 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/import/midraw.c @@ -0,0 +1,624 @@ +/* $XConsortium: midraw.c,v 1.9 94/04/17 20:34:52 rws Exp $ */ +/**** module midraw.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + midraw.c -- DDXIE prototype import drawable element + + Larry Hare -- AGE Logic, Inc. June, 1993 + +*****************************************************************************/ + +#define _XIEC_IDRAW +#define _XIEC_MIDRAW + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +#include +#include +#include +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include + + +DrawablePtr ValDrawable(); + + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeIDraw(); + +/* + * routines used internal to this module + */ +static int CreateIDraw(); +static int InitializeIDraw(); +static int ActivateIDrawStrip(); +static int ActivateIDrawAlign(); +static int ActivateIDrawP(); +static int ResetIDraw(); +static int DestroyIDraw(); + +static void adjustStride4to8(); +static void adjustStride24to32(); + +static Bool XIEGetImage(); + + +/* + * DDXIE ImportDrawable && ImportDrawablePlane entry points + */ +static ddElemVecRec miDrawVec = { + CreateIDraw, + InitializeIDraw, + ActivateIDrawStrip, + (xieIntProc)NULL, + ResetIDraw, + DestroyIDraw + }; + +static ddElemVecRec miDrawPVec = { + CreateIDraw, + InitializeIDraw, + ActivateIDrawP, + (xieIntProc)NULL, + ResetIDraw, + DestroyIDraw + }; + +typedef struct _midraw { + RegionPtr pExposed; + RegionRec Exposed; + xieVoidProc adjust; +} miDrawRec, *miDrawPtr; + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeIDraw(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* for now just stash our entry point vector in the peDef */ + ped->ddVec = miDrawVec; + return(TRUE); +} /* end miAnalyzeIDraw */ + +int miAnalyzeIDrawP(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* for now just stash our entry point vector in the peDef */ + ped->ddVec = miDrawPVec; + return(TRUE); +} /* end miAnalyzeIDrawP */ + + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateIDraw(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the photo element definition */ + return MakePETex(flo, ped, sizeof(miDrawRec), NO_SYNC, NO_SYNC); +} /* end CreateIDraw */ + + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeIDraw(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + iDrawDefPtr dix = (iDrawDefPtr) ped->elemPvt; + miDrawPtr ddx = (miDrawPtr) ped->peTex->private; + formatPtr sf = &ped->inFloLst[SRCtag].format[0]; + formatPtr df = &ped->outFlo.format[0]; + BOOL notify; + + if(((xieFloImportDrawable*)ped->elemRaw)->elemType==xieElemImportDrawable) { + Bool adj_stride = sf->stride != df->stride; + Bool adj_pitch = sf->pitch != df->pitch; + + if(adj_stride || adj_pitch) { + ped->ddVec.activate = ActivateIDrawAlign; + + if(adj_stride) { + if(sf->stride == 24 && df->stride == 32) + ddx->adjust = adjustStride24to32; + + else if(sf->stride == 4 && df->stride == 8) + ddx->adjust = adjustStride4to8; + + /* add more adjustment routines as required */ + } + } else { + ped->ddVec.activate = ActivateIDrawStrip; + } + notify = ((xieFloImportDrawable*)ped->elemRaw)->notify; + } else + notify = ((xieFloImportDrawablePlane*)ped->elemRaw)->notify; + + if(notify && dix->pDraw->type != DRAWABLE_PIXMAP) { + ddx->pExposed = &ddx->Exposed; + (*dix->pDraw->pScreen->RegionInit) (ddx->pExposed, NullBox, 0); + } + /* note: ImportResource elements don't use their receptors */ + return InitEmitter(flo,ped,NO_DATAMAP,NO_INPLACE); +} /* end InitializeIDraw */ + + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateIDrawAlign(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloImportDrawable *raw = (xieFloImportDrawable *) ped->elemRaw; + miDrawPtr ddx = (miDrawPtr) pet->private; + bandPtr bnd = &pet->emitter[0]; + DrawablePtr pDraw = ValDrawable(flo,ped,raw->drawable); + char *dst = (char*)GetCurrentDst(flo,pet,bnd); + CARD16 width = bnd->format->width; + + if(!pDraw || !dst) return FALSE; + + do { + if(!XIEGetImage(pDraw, /* drawable */ + (CARD16) raw->srcX, /* drawable-x */ + (CARD16)(raw->srcY+bnd->current), /* drawable-y */ + (CARD16) width, (CARD16)1, /* width, height */ + (CARD32)ZPixmap, /* data format */ + (CARD32)~0, /* plane mask */ + dst, /* data buffer */ + raw->fill, /* augment */ + ddx->pExposed /* accumulate */ + )) + DrawableError(flo,ped,raw->drawable, return(FALSE)); + + if(ddx->adjust) + (*ddx->adjust)(dst, width); + + } while(dst = (char*)GetNextDst(flo,pet,bnd,FLUSH)); + + return TRUE; +} /* end ActivateIDrawAlign */ + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateIDrawStrip(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloImportDrawable *raw = (xieFloImportDrawable *) ped->elemRaw; + miDrawPtr ddx = (miDrawPtr) pet->private; + bandPtr bnd = &pet->emitter[0]; + char *dst; + DrawablePtr pDraw; + + if (!(pDraw = ValDrawable(flo,ped,raw->drawable))) + return FALSE; + + if (!(dst = (char*)GetCurrentDst(flo,pet,bnd))) + return FALSE; + + if(!XIEGetImage( pDraw, /* drawable */ + (CARD16) raw->srcX, /* drawable-x */ + (CARD16)(raw->srcY+bnd->minLocal), /* drawable-y */ + (CARD16)(bnd->format->width), /* width */ + (CARD16)(bnd->strip->length), /* height */ + (CARD32)ZPixmap, /* data format */ + (CARD32)~0, /* plane mask */ + dst, /* data buffer */ + raw->fill, /* augment */ + ddx->pExposed /* accumulate */ + )) + DrawableError(flo,ped,raw->drawable, return(FALSE)); + + PutData(flo,pet,bnd,bnd->maxLocal); + + return TRUE; +} /* end ActivateIDrawStrip */ + +static int ActivateIDrawP(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloImportDrawablePlane *raw = (xieFloImportDrawablePlane *) ped->elemRaw; + miDrawPtr ddx = (miDrawPtr) pet->private; + bandPtr bnd = &pet->emitter[0]; + char *dst; + DrawablePtr pDraw; + + if (!(pDraw = ValDrawable(flo,ped,raw->drawable))) + return FALSE; + + if(!(dst = (char*)GetCurrentDst(flo,pet,bnd))) + return FALSE; + + if(!XIEGetImage( pDraw, /* drawable */ + (CARD16)(raw->srcX), /* drawable-x */ + (CARD16)(raw->srcY+bnd->minLocal), /* drawable-y */ + (CARD16)(bnd->format->width), /* width */ + (CARD16)(bnd->strip->length), /* height */ + (CARD32)XYPixmap, /* data format */ + raw->bitPlane, /* plane mask */ + dst, /* data buffer */ + raw->fill, /* augment */ + ddx->pExposed /* accumulate */ + )) + DrawableError(flo,ped,raw->drawable, return(FALSE)); + +#if (BITMAP_BIT_ORDER != IMAGE_BYTE_ORDER) + { + int nb = bnd->pitch * bnd->strip->length; + while (nb--) *dst++ = (char)_ByteReverseTable[*dst]; + } +#endif + + PutData(flo,pet,bnd,bnd->maxLocal); + + return TRUE; +} /* end ActivateIDrawP */ + + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static void FlushExposeEvents(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloImportDrawablePlane *raw = (xieFloImportDrawablePlane *) ped->elemRaw; + miDrawPtr pvt = (miDrawPtr) ped->peTex->private; + + if (pvt->pExposed) { + RegionPtr rp = pvt->pExposed; + DrawablePtr pDraw = ValDrawable(flo,ped,raw->drawable); + int numrects = REGION_NUM_RECTS(rp); + + if (pDraw) { + if (numrects > 0 && !ferrCode(flo) && !flo->flags.aborted) { + BoxPtr rects = REGION_RECTS(rp); + + /* if numrects is large, send 1 event for extents ?? */ + for ( ; numrects > 0; numrects--, rects++) { + SendImportObscuredEvent(flo,ped,raw->drawable, + rects->x1, + rects->y1, + rects->x2 - rects->x1, + rects->y2 - rects->y1); + } + } + (*pDraw->pScreen->RegionUninit) (rp); + } /* else Memory Leak */ + pvt->pExposed = NullRegion; + } +} /* end FlushExposeEvents */ + + +static int ResetIDraw(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + FlushExposeEvents(flo,ped); + ResetEmitter(ped); + + return(TRUE); +} /* end ResetIDraw */ + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyIDraw(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.activate = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + + return(TRUE); +} /* end DestroyIDraw */ + +/*------------------------------------------------------------------------ +--- similar to GetGCAndDrawableAndValidate (from extension.h) --- +--- made callable because the macro version returned standard X errors --- +------------------------------------------------------------------------*/ +DrawablePtr ValDrawable(flo,ped,draw_id) + floDefPtr flo; + peDefPtr ped; + Drawable draw_id; +{ + register ClientPtr client = flo->runClient; + register DrawablePtr draw; + + if (client->clientGone) return(NULL); + + if (client->lastDrawableID != draw_id) { + draw = (DrawablePtr)LookupIDByClass(draw_id, RC_DRAWABLE); + if (draw->type == UNDRAWABLE_WINDOW) + MatchError(flo,ped, return(NULL)); + + client->lastDrawable = draw; + client->lastDrawableID = draw_id; + } else { + draw = client->lastDrawable; + } + if(!draw) { + client->errorValue = draw_id; + DrawableError(flo,ped,draw_id, return(NULL)); + } + return draw; +} /* end ValDrawable */ + + +/* +** In order to support 'fill' and 'expose events' we must layer some +** code on top of the normal screen GetImage procedure. Use the defined +** backing store interface that aid's in copy expose processing, to try +** to knowingly recover backing store. Keep track of remaining regions +** which were not visible or in backing store. Always fill such leftover +** regions, and queue them up for later expose event processing. +*/ + +static Bool +XIEGetImage (pDrawable, sx, sy, w, h, format, pmask, pdst, fill, Exposed) + DrawablePtr pDrawable; + CARD16 sx, sy, w, h; + CARD32 format; + CARD32 pmask; + char *pdst; + CARD32 fill; + RegionPtr Exposed; +{ + ScreenPtr pScreen = pDrawable->pScreen; + BoxRec bounds; + unsigned char depth; + + if(pDrawable->type != DRAWABLE_PIXMAP && (sx + w > pDrawable->width || + sy + h > pDrawable->height)) + return(FALSE); + + if(pDrawable->type != DRAWABLE_PIXMAP && + ((WindowPtr)pDrawable)->visibility != VisibilityUnobscured) { + PixmapPtr pPixmap; + GCPtr pGC; + WindowPtr pWin, pSrcWin; + RegionRec Remaining; + BoxPtr pBox; + int i; + int x, y; + xRectangle *pRect; + int numRects; + + pWin = (WindowPtr) pDrawable; + pPixmap = 0; + depth = pDrawable->depth; + bounds.x1 = sx + pDrawable->x; + bounds.y1 = sy + pDrawable->y; + bounds.x2 = bounds.x1 + w; + bounds.y2 = bounds.y1 + h; + (*pScreen->RegionInit) (&Remaining, &bounds, 0); + if (!(pPixmap = (*pScreen->CreatePixmap) (pScreen, w, h, depth))) + goto punt; + if(!(pGC = GetScratchGC (depth, pScreen))) { + (*pScreen->DestroyPixmap) (pPixmap); + goto punt; + } + if (pWin->viewable && + (*pScreen->RectIn) (&Remaining, (*pScreen->RegionExtents) + (&pWin->borderSize)) != rgnOUT) { + XID subWindowMode = IncludeInferiors; + ChangeGC (pGC, GCSubwindowMode, &subWindowMode); + ValidateGC ((DrawablePtr)pPixmap, pGC); + pSrcWin = (WindowPtr) pDrawable; + x = sx; + y = sy; + if (pSrcWin->parent) { + x += pSrcWin->origin.x; + y += pSrcWin->origin.y; + pSrcWin = pSrcWin->parent; + } + (*pGC->ops->CopyArea) ((DrawablePtr)pSrcWin, + (DrawablePtr)pPixmap, pGC, + x, y, w, h, + 0, 0); + (*pScreen->Subtract) (&Remaining, &Remaining, + &((WindowPtr) pDrawable)->borderClip); + if (REGION_NUM_RECTS(&Remaining) == 0) goto done; + } + (*pScreen->TranslateRegion) (&Remaining, -pWin->drawable.x, + -pWin->drawable.y); + + /* Copy in Backstore now */ + if (pWin->backStorage) { + (*pWin->drawable.pScreen->ExposeCopy) (pWin, + (DrawablePtr)pPixmap, + pGC, &Remaining, + sx, sy, + 0, 0, + 0); + + } + + /* Fill in Remaining Area now */ + ChangeGC (pGC, GCForeground, &fill); + ValidateGC ((DrawablePtr)pPixmap, pGC); + numRects = REGION_NUM_RECTS(&Remaining); + pBox = REGION_RECTS(&Remaining); + pRect = (xRectangle *)ALLOCATE_LOCAL(numRects * sizeof(xRectangle)); + if (pRect) { + for (i = numRects; --i >= 0; pBox++, pRect++) { + pRect->x = pBox->x1 - sx; + pRect->y = pBox->y1 - sy; + pRect->width = pBox->x2 - pBox->x1; + pRect->height = pBox->y2 - pBox->y1; + } + pRect -= numRects; + (*pGC->ops->PolyFillRect) ((DrawablePtr)pPixmap, pGC, + numRects, pRect); + DEALLOCATE_LOCAL (pRect); + } + + /* Accumulate Exposures if requested */ + if (REGION_NUM_RECTS(&Remaining) > 0) { + if (Exposed) { + (*pScreen->Union) (Exposed, Exposed, &Remaining); + } + } + +done: + (*pScreen->RegionUninit) (&Remaining); + (*pScreen->GetImage) ((DrawablePtr) pPixmap, 0, 0, w, h, + format, pmask, pdst); + (*pScreen->DestroyPixmap) (pPixmap); + FreeScratchGC (pGC); + } + else + { +punt: ; + (*pScreen->GetImage) (pDrawable, sx, sy, w, h, + format, pmask, pdst); + } + return(TRUE); +} + +static void adjustStride24to32(buf,width) + char *buf; + CARD32 width; +{ + register BytePixel *ip = (BytePixel*)(&buf[3 * width]); + register QuadPixel *op = (QuadPixel*)(&buf[4 * width]); + int i; + + for(i = width; i; --i) +#if (IMAGE_BYTE_ORDER == LSBFirst && IMAGE_BYTE_ORDER == BITMAP_BIT_ORDER || IMAGE_BYTE_ORDER == MSBFirst && IMAGE_BYTE_ORDER != BITMAP_BIT_ORDER) + { ip -= 3; *(--op) = (int)ip[2]<<16 | (int)ip[1]<<8 | (int)ip[0]; } +#else + { ip -= 3; *(--op) = (int)ip[0]<<16 | (int)ip[1]<<8 | (int)ip[2]; } +#endif +} + +static void adjustStride4to8(buf,width) + char *buf; + CARD32 width; +{ + register BytePixel *ip = (BytePixel*)(&buf[1 * width]); + register BytePixel *op = (BytePixel*)(&buf[2 * width]); + int i; + + for(i = width; i; --i) +#if (IMAGE_BYTE_ORDER == LSBFirst && IMAGE_BYTE_ORDER == BITMAP_BIT_ORDER || IMAGE_BYTE_ORDER == MSBFirst && IMAGE_BYTE_ORDER != BITMAP_BIT_ORDER) + { *(--op) = *(--ip) & (BytePixel)0x0f; *(--op) = *ip >> 4; } +#else + { *(--op) = *(--ip) >> 4; *(--op) = *ip & (BytePixel)0x0f; } +#endif +} + + +/* end module midraw.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/import/mifax.c b/xie/xc/programs/Xserver/XIE/mixie/import/mifax.c new file mode 100644 index 0000000..0b64b80 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/import/mifax.c @@ -0,0 +1,581 @@ +/* $XConsortium: mifax.c /main/9 1995/12/04 15:33:46 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module mifax.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mifax.c -- DDXIE prototype import client photo and + import photomap element, portions specific + to FAX decompression + + Ben Fahy -- AGE Logic, Inc. July, 1993 + +*****************************************************************************/ + +#define _XIEC_MICPHOTO +#define _XIEC_ICPHOTO +#define _XIEC_MIPHOTO +#define _XIEC_IPHOTO + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include +/* XXX - this should be cleaned up. */ +#include "../fax/faxint.h" + +/* + * routines referenced by other DDXIE modules + */ +int CreateICPhotoFax(); +int InitializeICPhotoFax(); +int InitializeIPhotoFax(); +int ActivateICPhotoFax(); +int ResetICPhotoFax(); +int DestroyICPhotoFax(); + + +extern bandMsk miImportStream(); + +/* + * Local Declarations + */ + +static int common_init(); + + +#define LENIENCY_LIMIT 16 + +#define MAX_STRIPS_INC 20 +typedef struct _faxpvt { + FaxState state; + int width,height; /* not strictly necessary, but handy */ + int max_strips; /* how many we've allocated space for */ + int n_strips; /* how many strips we've seen so far */ + int next_byte; /* next input byte we are looking for */ + int max_lines; /* maximum number of lines/output strip */ + char **o_lines; /* array of pointers to output lines */ + int (*decodptr)(); /* function used to decode the data */ + xieTypOrientation encodedOrder; + int notify; /* (ICP) we might have to send an event */ + int normal; /* if not, swap the output bit order */ + photomapPtr map; /* (IP) just in case we need it */ + unsigned char *buf; /* in case we have to bit reverse src */ + int bufsize; /* buffer size has to vary with input */ + /* strip size, alas and alak. :-( */ + xieTypDecodeTechnique technique; +} faxPvtRec, *faxPvtPtr; + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +int CreateICPhotoFax(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the photo element definition */ + return MakePETex(flo,ped, sizeof(faxPvtRec), NO_SYNC, NO_SYNC); +} /* end CreateICPhotoFax */ + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +int InitializeIPhotoFax(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ +photomapPtr map = ((iPhotoDefPtr)ped->elemPvt)->map; +peTexPtr pet = ped->peTex; +faxPvtPtr texpvt=(faxPvtPtr) pet->private; +bandPtr sbnd = &pet->receptor[IMPORT].band[0]; + + if (!common_init(flo,ped,(pointer)map->tecParms,map->technique)) + return(0); + + texpvt->map = map; /* can be used as flag in Activate routine */ + + return( + ImportStrips(flo,pet,&pet->receptor[0].band[0],&map->strips[0]) + ); +} /* end InitializeIPhotoFax */ +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +int InitializeICPhotoFax(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ +xieFloImportClientPhoto *raw = (xieFloImportClientPhoto *) ped->elemRaw; +peTexPtr pet = ped->peTex; +faxPvtPtr texpvt = (faxPvtPtr) pet->private; + + if( !common_init(flo,ped,(pointer) &raw[1],raw->decodeTechnique) ) + return(0); + + texpvt->notify = raw->notify; + return(1); +} /* end InitializeICPhotoFax */ +/*------------------------------------------------------------------------ +------- lots of stuff shared between ICPhoto and IPhoto. . . ------------- +------------------------------------------------------------------------*/ +static int common_init(flo,ped,tec,technique) +floDefPtr flo; +peDefPtr ped; +pointer tec; /* we won't know the type until later */ +xieTypDecodeTechnique technique; + /* (but we can get it from this :-) */ +{ +peTexPtr pet = ped->peTex; +faxPvtPtr texpvt = (faxPvtPtr) pet->private; +formatPtr inf = pet->receptor[IMPORT].band[0].format; +int pbytes; + +/* Start over with clean structure */ + bzero(texpvt,sizeof(faxPvtRec)); + + +/* Now start adding what we know */ + texpvt->width = inf->width; + texpvt->height = inf->height; + texpvt->state.width = inf->width; + /* nice thing about using receptor format is that it doesn't matter */ + /* whether you are importing from a client or a photomap */ + + switch(texpvt->technique = technique) { + case xieValDecodeG31D: + { + xieTecDecodeG31D *tecG31D=(xieTecDecodeG31D *) tec; + texpvt->decodptr = decode_g31d; + texpvt->encodedOrder = tecG31D->encodedOrder; + texpvt->state.goal = FAX_GOAL_SkipPastAnyToEOL; + texpvt->state.radiometric = tecG31D->radiometric; + texpvt->normal = tecG31D->normal; + } + break; + case xieValDecodeG32D: + { + xieTecDecodeG32D *tecG32D=(xieTecDecodeG32D *) tec; + texpvt->decodptr = decode_g32d; + texpvt->encodedOrder = tecG32D->encodedOrder; + texpvt->state.goal = FAX_GOAL_SeekEOLandTag; + texpvt->state.radiometric = tecG32D->radiometric; + texpvt->normal = tecG32D->normal; + } + break; + case xieValDecodeG42D: + { + xieTecDecodeG42D *tecG42D=(xieTecDecodeG42D *) tec; + texpvt->decodptr = decode_g4; + texpvt->encodedOrder = tecG42D->encodedOrder; + texpvt->state.goal = FAX_GOAL_StartNewLine; + texpvt->state.radiometric = tecG42D->radiometric; + texpvt->normal = tecG42D->normal; + } + break; + case xieValDecodeTIFF2: + { + xieTecDecodeTIFF2 *tecTIFF2=(xieTecDecodeTIFF2 *) tec; + texpvt->decodptr = decode_tiff2; + texpvt->encodedOrder = tecTIFF2->encodedOrder; + texpvt->state.goal = FAX_GOAL_StartNewLine; + texpvt->state.radiometric = tecTIFF2->radiometric; + texpvt->normal = tecTIFF2->normal; + } + break; + case xieValDecodeTIFFPackBits: + { + xieTecDecodeTIFFPackBits *tecTIFFPackBits= + (xieTecDecodeTIFFPackBits *)tec; + texpvt->decodptr = decode_tiffpb; + texpvt->encodedOrder = tecTIFFPackBits->encodedOrder; + texpvt->state.goal = PB_GOAL_StartNewLine; + texpvt->normal = tecTIFFPackBits->normal; + } + break; + } + texpvt->state.a0_color = WHITE; + texpvt->state.a0_pos = (-1); + +/* things that are zero don't really need to be initialized - consider + * these comments. + */ + texpvt->state.magic_needs = 0; + texpvt->state.strip_state = StripStateNone; + texpvt->state.strip = 0; + texpvt->state.strip_size = 0; + texpvt->state.final = 0; + texpvt->state.o_line = 0; + +/* + * Things that do need to be initialized + */ + texpvt->state.write_data = 1; + texpvt->max_strips = MAX_STRIPS_INC; + + +/* the following must be freed explicitly */ + + texpvt->state.old_trans = (int *) XieMalloc(texpvt->width * sizeof(int)); + if (!texpvt->state.old_trans) AllocError(flo,ped, return(FALSE)); + + texpvt->state.new_trans = (int *) XieMalloc(texpvt->width * sizeof(int)); + if (!texpvt->state.new_trans) AllocError(flo,ped, return(FALSE)); + +/* + * I suppose this will make Bob mad at me, but... how else do I + * figure out the output map size? + */ + + pbytes = (ped->outFlo.format[0].pitch + 7) >> 3; + + texpvt->max_lines = flo->floTex->stripSize / pbytes; + + if (!texpvt->max_lines) + texpvt->max_lines++; + +/* see if data manager should forward our input data to downstream elements */ + pet->receptor[IMPORT].forward = miImportStream(flo,ped); + +/* set output emitter to map texpvt->max_lines lines of data */ + return( InitReceptors(flo, ped, NO_DATAMAP, 1) && + InitEmitter(flo, ped, texpvt->max_lines, NO_INPLACE) ); + +} /* end common_init() */ +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +int ActivateICPhotoFax(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + bandPtr sbnd = &pet->receptor[IMPORT].band[0]; + bandPtr dbnd = &pet->emitter[0]; + faxPvtPtr texpvt = (faxPvtPtr) ped->peTex->private; + FaxState *state = &(texpvt->state); + BytePixel *src, *dst; + int lines_found; + Bool ok, aborted; + int (*decodptr)() = texpvt->decodptr; + + +/* + * get current input and output strips + */ + if (dbnd->final && dbnd->current >= dbnd->format->height) { + /* be forgiving if extra data gets passed to us */ + FreeData(flo,pet,sbnd,sbnd->maxGlobal); + return(TRUE); + } + + /* + * Important! As long as there is source data available, we'd better + * deal with it, because it may be owned by Core X and will die if we + * let the scheduler go away. It's ok to exit with TRUE to let an + * output strip be written (we'll be called back). It is death to + * exit with FALSE unless we are absolutely sure we are done with all + * current input strips. + */ + + /* + * Note that state->strip holds the current src strip. We only get + * more bytes when we are done with a strip and need another one + * (or if we are just starting) + */ + if (!state->strip) { + src = (BytePixel*)GetSrcBytes(flo,pet,sbnd,sbnd->current,1,KEEP); + + state->strip_state = StripStateNew; + state->strip_size = sbnd->maxLocal - sbnd->minLocal; + state->final = sbnd->strip ? sbnd->strip->final : sbnd->final; + + if (texpvt->encodedOrder == xieValMSFirst) + state->strip = src; + else { + /* to avoid rewriting a zillion macros, we arbitrarily pick MSFirst + as the encode/decode format. Byte Reversal of the small amount + of compressed data is almost always going to take trivial time. + The only nasty part is, the input strip cannot be corrupted so + we have to copy to a buffer, whose size may be variable since + this is stream data (not canonical). + */ + register int i,size=state->strip_size; + register unsigned char *flipped; + + if ( AlterSrc(flo,ped,sbnd->strip) ) + flipped = src; + else { + /* make sure buffer is big enough to hold data */ + if (!texpvt->buf) { + texpvt->buf = (unsigned char *) XieMalloc(size); + if (!texpvt->buf) + AllocError(flo,ped, return(FALSE)); + } + else if (texpvt->bufsize < size) { + texpvt->buf = (unsigned char *) XieRealloc(texpvt->buf,size); + if (!texpvt->buf) + AllocError(flo,ped, return(FALSE)); + } + texpvt->bufsize = size; + flipped = texpvt->buf; + } + + for (i=0; istrip = flipped; + } + } + /* + * We have some data to decode, anything to write to? + */ + while (dst = (BytePixel*)GetDst(flo,pet,dbnd,state->o_line,KEEP)) { + + + /* + * Now, as much as I'd like to use our nifty line-oriented macros, + * it would kill performance. So instead we ask the decoder to + * decode as much as remains in the output line as it can get. + * We ask the data manager to map all the lines of data in the + * current output strip to a convenient array. + */ + + state->nl_sought = dbnd->maxLocal - state->o_line; + + ok = MapData(flo,pet,dbnd,0,dbnd->current,state->nl_sought,KEEP); + /* map desired lines into an array starting at 0 */ + if (!ok) + ImplementationError(flo,ped, return(FALSE)); + + state->o_lines = (char **) dbnd->dataMap; + + lines_found = (*decodptr)(state); + if (lines_found < 0) { + /* decoder hit unknown error. Pass error code to client */ + ValueError(flo,ped,(state->o_line + (state->decoder_done << 16)), + return(FALSE)); + } else { + if (!texpvt->normal) { + /* have to swap bit order on output */ + int pbytes = (ped->outFlo.format[0].pitch + 7) >> 3; + register int i; + for (i=0; idataMap[i]; + register int size=pbytes; + while (size--) + { + *ucp = _ByteReverseTable[*ucp]; + ucp++; + } + } + } + state->o_line += lines_found; + if (PutData(flo,pet,dbnd,state->o_line)) + return(TRUE); + } + if (state->decoder_done) { + /* Decoders sometimes return errors near the end of an image. + Don't report an error if we got almost all the lines we wanted. + */ + if (state->decoder_done > FAX_DECODE_DONE_OK) { + aborted = state->o_line + LENIENCY_LIMIT < texpvt->height; + + if(texpvt->notify && (texpvt->height != state->o_line || + texpvt->width != state->width)) { + SendDecodeNotifyEvent(flo, ped, 0, texpvt->technique, + state->width, state->o_line, aborted); + } + if (aborted) { + ValueError(flo, ped, (state->o_line + (state->decoder_done<<16)), + return(FALSE)); + } else if(state->o_line < texpvt->height) { + int bytes = (ped->outFlo.format[0].pitch + 7) >> 3; + + while(dst = ((BytePixel*) + GetDst(flo,pet,dbnd,state->o_line++,KEEP))) { + memset(dst, state->radiometric ? 0xff: 0, bytes); + PutData(flo,pet,dbnd,state->o_line); + } + break; + } + } + FreeData(flo,pet,sbnd,sbnd->maxGlobal); + break; + } + + if (state->magic_needs) { + /* decoder needs a new strip */ + if (state->strip_state != StripStateDone) { + ImplementationError(flo,ped, return(FALSE)); + } + FreeData(flo,pet,sbnd,sbnd->maxLocal); + + texpvt->state.strip_state = StripStateNone; + texpvt->state.strip = 0; + texpvt->state.strip_size = 0; + + if (!state->final) + break; + else + state->strip_state = StripStateNoMore; + /* need to live with what you've got */ + } + } /* end of while(dst = ...) */ + /* + * No more dst or need another src strip? three possible reasons: + * + * 1: we're done with output image. Just shut down and be happy + * 2: scheduler has noticed a downstream element can run. In this + * case, we should be a good guy and return TRUE so the scheduler + * gives us back control again later (without going back to Core + * X, which would cause our input strip to vanish). + * 3: we ran out of src. + */ + if (!dst && dbnd->final) { + FreeData(flo,pet,sbnd,sbnd->maxGlobal); + } + SetBandThreshold(sbnd, !dst ? 1 : sbnd->available + 1); + + /* + * if here, we ran out of src. Scheduler will wake us up again + * when a PutClientData request comes along. + */ + return TRUE; +} /* end ActivateICPhotoFax */ + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +int ResetICPhotoFax(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ResetReceptors(ped); + ResetEmitter(ped); + + /* get rid of the peTex structures malloc'd by Initialize */ + if(ped->peTex) { + faxPvtPtr texpvt = (faxPvtPtr) ped->peTex->private; + + /* only have to nuke parts of private structure which were malloc'd */ + if (texpvt->state.old_trans) + texpvt->state.old_trans = (int *)XieFree(texpvt->state.old_trans); + if (texpvt->state.new_trans) + texpvt->state.new_trans = (int *)XieFree(texpvt->state.new_trans); + if (texpvt->buf) + texpvt->buf = (unsigned char *)XieFree(texpvt->buf); + } + return(TRUE); +} /* end ResetICPhotoFax */ + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +int DestroyICPhotoFax(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + if(ped->peTex) { + ped->peTex = (peTexPtr) XieFree(ped->peTex); + } + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.activate = (xieIntProc) NULL; + ped->ddVec.flush = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + + return(TRUE); +} /* end DestroyICPhoto */ + +/* end module mifax.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/import/mijpeg.c b/xie/xc/programs/Xserver/XIE/mixie/import/mijpeg.c new file mode 100644 index 0000000..11ba3ed --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/import/mijpeg.c @@ -0,0 +1,626 @@ +/* $XConsortium: mijpeg.c,v 1.4 94/04/17 20:34:54 rws Exp $ */ +/**** module mijpeg.c ****/ +/****************************************************************************** +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mijpeg.c -- DDXIE import photomap element, portions + specific to JPEG decompression + + Ben Fahy -- AGE Logic, Inc. Oct, 1993 + +*****************************************************************************/ + +#define _XIEC_MIPHOTO +#define _XIEC_IPHOTO + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +#ifndef XIE +#define XIE +#endif +#include + +/* + * routines referenced by other DDXIE modules +/* +int CreateIPhotoJpegBase(); +int InitializeIPhotoJpegBase(); +int InitializeICPhotoJpegBase(); +int ActivateIPhotoJpegBase(); +int ResetIPhotoJpegBase(); +int DestroyIPhotoJpegBase(); + + +extern bandMsk miImportStream(); + +/* + * Local Declarations + */ + +static int common_init(); +static int sub_fun(); +typedef struct _jpeg_decode_pvt { + + int (*decodptr)(); /* function used to decode the data */ + int format_checked; /* have to wait until JPEG header read */ + + xieTypDataClass dataClass; /* SingleBand or TripleBand */ + int colors_smushed; /* if color and interleave = False */ + int in_bands; /* bands of input (from photomap) data */ + int out_bands; /* bands of output data */ + int swizzle; /* true if bandOrder is MSFirst */ + int notify; /* in case the client wants an event */ + photomapPtr map; /* for ImportPhotomap only */ + + xieTecDecodeJPEGBaseline *decodeParams; /* decoding parameters */ + + /* the following are used by JPEG private routines */ + struct Decompress_methods_struct dc_methods; + struct External_methods_struct e_methods; + + /* we potentially need one of the following per band */ + JpegDecodeState state[3]; + struct Decompress_info_struct cinfo[3]; + char ibuffer[3][JPEG_BUF_SIZE + MIN_UNGET]; + +} jpegPvtRec, *jpegPvtPtr; + + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +int CreateIPhotoJpegBase(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the photo element definition */ + return MakePETex(flo,ped, sizeof(jpegPvtRec), NO_SYNC, NO_SYNC); +} /* end CreateIPhotoJpegBase */ + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +int InitializeIPhotoJpegBase(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + photomapPtr map = ((iPhotoDefPtr)ped->elemPvt)->map; + xieTecDecodeJPEGBaseline *tec = (xieTecDecodeJPEGBaseline *) map->tecParms; + xieFloImportPhotomap *raw = (xieFloImportPhotomap *)ped->elemRaw; + int in_bands = ped->inFloLst[SRCtag].bands; /* # of input bands */ + peTexPtr pet = ped->peTex; + jpegPvtPtr texpvt = (jpegPvtPtr) pet->private; + bandPtr bnd = pet->receptor[IMPORT].band; + + if(!common_init(flo,ped,map->dataClass,tec,raw->notify)) + return(FALSE); + + texpvt->map = map; + /* has to come after common_init, which bzeros texpvt */ + + return(ImportStrips(flo, pet, &bnd[0], &map->strips[0]) && + (in_bands == 1 ? TRUE : + ImportStrips(flo, pet, &bnd[1], &map->strips[1]) && + ImportStrips(flo, pet, &bnd[2], &map->strips[2]))); +} /* end InitializeIPhotoJpegBase */ + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +int InitializeICPhotoJpegBase(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ +xieFloImportClientPhoto *raw = (xieFloImportClientPhoto *)ped->elemRaw; +xieTecDecodeJPEGBaseline *tec= (xieTecDecodeJPEGBaseline*)&raw[1]; + + return (common_init(flo,ped,raw->class,tec,raw->notify) ); + +} /* end InitializeICPhotoJpegBase */ +/*------------------------------------------------------------------------ +----------------------- shared initialization code ---------------------- +------------------------------------------------------------------------*/ +static int common_init(flo,ped,class,tec,notify) + floDefPtr flo; + peDefPtr ped; + xieTypDataClass class; + xieTecDecodeJPEGBaseline *tec; + int notify; +{ + peTexPtr pet = ped->peTex; + jpegPvtPtr texpvt = (jpegPvtPtr) pet->private; + int pbytes; + int out_bands = ped->outFlo.bands; /* # of output bands */ + int in_bands = ped->inFloLst[SRCtag].bands; /* # of input bands */ + int lines_in_output_strip; /* max number of lines/output strip*/ + int b; + + /*** every time we rerun the element, have to reset it ***/ + + bzero(texpvt,sizeof(jpegPvtRec)); + /* this does 99% of what we want */ + + /*** do generic stuff first ***/ + texpvt->in_bands = in_bands; + texpvt->out_bands = out_bands; + texpvt->dataClass = class; + texpvt->decodeParams = tec; + texpvt->notify = notify; + + if(in_bands != out_bands) { /* ie, if photo has 1 band, output 3 */ + texpvt->colors_smushed = 1; + texpvt->decodptr = decode_jpeg_lossy_color; + } else { /* SingleBand or TripleBand-BandByPlane */ + texpvt->colors_smushed = 0; + texpvt->decodptr = decode_jpeg_lossy_gray; + } + texpvt->swizzle = tec->bandOrder == xieValMSFirst; + + /* Now for every input (photomap) band, we need to set up state stuff */ + for (b=0; b < in_bands; ++b) { + JpegDecodeState *state = &(texpvt->state[b]); + + state->goal = JPEG_DECODE_GOAL_Startup; + state->up_sample = tec->upSample; + state->dc_methods = &texpvt->dc_methods; + state->e_methods = &texpvt->e_methods; + state->cinfo = &texpvt->cinfo[b]; + state->needs_input_strip = 1; + state->cinfo->input_buffer = texpvt->ibuffer[b]; + } + + /*** Note: the JPEG code allocates an additional buffer after the + header data is read. The size of the buffer depends on + the image dimenstions, so this needs to be deallocated + in the Reset entry point. The rest of the above is of + fixed size, and will disappear automatically at Destroy + ***/ + + /* Calculate how many lines fit in an output strip + */ + pbytes = (ped->outFlo.format[0].pitch + 7) >> 3; + lines_in_output_strip = flo->floTex->stripSize / pbytes; + + if (!lines_in_output_strip) + lines_in_output_strip++; + + /* see if data manager should forward our input data to downstream elements + */ + pet->receptor[IMPORT].forward = miImportStream(flo,ped); + + /* set output emitter to allocate a map big enough to hold whole strip + */ + return(InitReceptors(flo, ped, NO_DATAMAP, 1) && + InitEmitter(flo, ped, lines_in_output_strip, NO_INPLACE)); + +} /* end InitializeIPhotoJpegBase */ + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +int ActivateIPhotoJpegBase(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + jpegPvtPtr texpvt = (jpegPvtPtr) ped->peTex->private; + receptorPtr rcp = pet->receptor; + bandPtr sbnd = &pet->receptor[IMPORT].band[0]; + bandPtr dbnd = &pet->emitter[0]; + bandPtr dbnd1 = &pet->emitter[1]; + bandPtr dbnd2 = &pet->emitter[2]; + int b; + + /* dbnd and dst are used to deal with non-interleaved color data */ + /* if the class of the src is SingleBand, we call sub_fun for band 0 */ + /* if the class of the src is TripleBand and the interleave is */ + /* BandByPlane, we call sub_fun 3 times, once for each band */ + /* if the class of the src is TripleBand, interleave BandByPixel, we */ + /* call subfun once: it will produce all three dst bands */ + + if (texpvt->dataClass == xieValSingleBand) { + JpegDecodeState *state = &(texpvt->state[0]); + return( sub_fun(flo,ped,pet,texpvt,state,sbnd,dbnd,NULL,NULL) ); + } + + /* TripleBand */ + if (texpvt->colors_smushed) { /* BandByPixel */ + JpegDecodeState *state = &(texpvt->state[0]); + if(texpvt->swizzle) + return( sub_fun(flo,ped,pet,texpvt,state,sbnd,dbnd2,dbnd1,dbnd) ); + else + return( sub_fun(flo,ped,pet,texpvt,state,sbnd,dbnd,dbnd1,dbnd2) ); + } + + /* TripleBand, BandByPlane */ + for(b = 0; b < xieValMaxBands; ++b) { + JpegDecodeState *state = &(texpvt->state[b]); + sbnd = &rcp->band[b]; /* do each band independently */ + dbnd = &pet->emitter[texpvt->swizzle ? xieValMaxBands - b - 1 : b]; + if ( sub_fun(flo,ped,pet,texpvt,state,sbnd,dbnd,NULL,NULL)==FALSE) + return(FALSE); + } + return(TRUE); +} + +/*------------------------------------------------------------------------ +-------------------- *really* crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int sub_fun(flo,ped,pet,texpvt,state,sbnd,dbnd,dbnd1,dbnd2) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; + jpegPvtPtr texpvt; + JpegDecodeState *state; + bandPtr sbnd,dbnd,dbnd1,dbnd2; +{ +BytePixel *src, *dst,*dst1,*dst2; +int (*decodptr)() = texpvt->decodptr; + +/* + * get current input and output strips + */ + if (dbnd->final && dbnd->current >= dbnd->format->height) { + /* be forgiving if extra data gets passed to us */ + FreeData(flo,pet,sbnd,sbnd->maxGlobal); + return(TRUE); + } + + src=(BytePixel*)GetSrcBytes(flo,pet,sbnd,sbnd->current,sbnd->available,KEEP); + + if ( state->needs_input_strip ) { + /* NOTE: state->needs_input_strip is ONLY set after checking */ + /* to ensure that state->final != 1. In other words, we only */ + /* arrive here when we are sure there will be source data */ + + /* we left because we needed more input. The other case */ + /* would be if we left to allow downstream elements to run */ + + state->strip = src; + state->sptr = src; + state->strip_size = sbnd->maxLocal - sbnd->minLocal; + + state->i_strip++; /* just for debugging */ + + state->final = sbnd->strip ? sbnd->strip->final : sbnd->final; + state->needs_input_strip = 0; + } + + /* + * We have some data to decode, anything to write to? + */ + + while (dst = (BytePixel*)GetDst(flo,pet,dbnd,state->o_line,FLUSH)) { + + /* if tripleband interleaved data, make sure other bands cool */ + if (dbnd1) + if (!(dst1=(BytePixel*)GetDst(flo,pet,dbnd1,state->o_line,FLUSH)) || + !(dst2=(BytePixel*)GetDst(flo,pet,dbnd2,state->o_line,FLUSH)) ) + ImplementationError(flo,ped, return(FALSE)); + + /* + * If we reenter this loop after having decoded some data, + * it's important to check to see if we need to flush the + * decoder's output buffer. It's big trouble to call the + * decoder if its output buffer isn't flushed. nl_found + * indicates how many lines are left in the buffer + */ + + if (state->nl_found) { + JSAMPIMAGE jpeg_odata = state->cinfo->output_workspace; + register int ci,row; + int max_can_do; + int nl_mappable; + unsigned char **o_lines; + + /* this is possibly the first time we can check to see */ + /* if the data agrees with the output format */ + /* we don't get to check the JPEG data format until the */ + /* header has been read. The first time some output lines */ + /* are produced, we make sure all is copasetic... er... ok */ + + if (!texpvt->format_checked) { + + /* XXX - width, height must be same, all bands */ + if ( dbnd->format->width != (int)state->cinfo->image_width ) + ImplementationError(flo,ped, return(FALSE)); + + if ( dbnd->format->height != (int)state->cinfo->image_height ) + ImplementationError(flo,ped, return(FALSE)); + + if ( texpvt->dataClass == xieValSingleBand && + state->cinfo->num_components != 1 ) + ImplementationError(flo,ped, return(FALSE)); + + /* due to !*(!(! interleave option, checking bands is harder */ + if ( + (texpvt->dataClass == xieValTripleBand && + texpvt->colors_smushed && + state->cinfo->num_components != 3) || + (texpvt->dataClass == xieValTripleBand && + !texpvt->colors_smushed && + state->cinfo->num_components != 1) ) + ImplementationError(flo,ped, return(FALSE)); + + texpvt->format_checked = 1; + } + + /* Map current output strip to an array of lines, current->0 */ + nl_mappable = dbnd->maxLocal - state->o_line; + if (!MapData(flo,pet,dbnd,0,dbnd->current,nl_mappable,KEEP)) + ImplementationError(flo,ped, return(FALSE)); + + if (dbnd1) { + /* same for other two bands. Notice that we rely on */ + /* all three bands being synchronous with each other */ + + if (!MapData(flo,pet,dbnd1,0,dbnd1->current,nl_mappable,KEEP)) + ImplementationError(flo,ped, return(FALSE)); + if (!MapData(flo,pet,dbnd2,0,dbnd2->current,nl_mappable,KEEP)) + ImplementationError(flo,ped, return(FALSE)); + } + + /* limit flushing to as much as fits in a strip */ + max_can_do = (nl_mappable < state->nl_found)? + nl_mappable : state->nl_found; + + + /* at this point, we have checked enough to make sure */ + /* the following data copying stuff is appropriate */ + + o_lines = (unsigned char **) dbnd->dataMap; + for (row=0; rownl_flushed]; + register npix = state->cinfo->image_width; + while (npix--) + *o_line++ = (unsigned char) *jptr++; + } + + for (ci=1; ci < state->cinfo->num_components; ++ci) { + o_lines = (unsigned char **) ((ci==1)? dbnd1 : dbnd2)->dataMap; + for (row=0; rownl_flushed]; + register npix = state->cinfo->image_width; + while (npix--) + *o_line++ = (unsigned char) *jptr++; + } + } + + state->o_line += max_can_do; + state->nl_found -= max_can_do; + state->nl_flushed += max_can_do; + + dbnd->current = state->o_line; + if (dbnd1) { + dbnd1->current = state->o_line; + dbnd2->current = state->o_line; + } + + /* if we are done with this output strip, deliver it */ + if (state->o_line >= (int) dbnd->maxLocal) { + /* if PutData returns True, there is someone ready to + be scheduled downstream. We should return to yield + */ + if (dbnd1) { + PutData(flo,pet,dbnd, (unsigned) state->o_line); + PutData(flo,pet,dbnd1,(unsigned) state->o_line); + PutData(flo,pet,dbnd2,(unsigned) state->o_line); + } + else + if (PutData(flo,pet,dbnd, (unsigned) state->o_line) ) + return(TRUE); + } + + if (state->nl_found) /* couldn't flush all of it */ + continue; /* need another output strip */ + + + /* if here, flushed everything */ + if (state->goal != JPEG_DECODE_GOAL_Done) + continue; /* go around loop again. get */ + /* more dst if necessary */ + + /* all done!! free up all the src data */ + FreeData(flo,pet,sbnd,sbnd->maxGlobal); + return TRUE; + + } /* end of if (state->nl_found) */ + + else { + /* shouldn't call decoder if it wants something to */ + /* decode but there is nothing available to decode! */ + if (state->needs_input_strip) + ImplementationError(flo,ped, return(FALSE)); + + if ( (*decodptr)(state) < 0 ) { + /* if client wanted to be notified, give him the bad news */ + if(texpvt->notify) + SendDecodeNotifyEvent(flo, ped, dbnd->band, + xieValDecodeJPEGBaseline, + dbnd->format->width, dbnd->current, TRUE); + + /* have to send some error. We didn't get the right */ + /* number of lines, so complain about the height */ + ValueError(flo,ped,dbnd->format->height, return(FALSE)); + } + + if (state->needs_input_strip) { + FreeData(flo,pet,sbnd,sbnd->maxLocal); + return TRUE; + } + + /* if we have more work to do or need to flush, carry on */ + if (state->goal != JPEG_DECODE_GOAL_Done || state->nl_found) + continue; + + /* all done!! free up all the src data */ + FreeData(flo,pet,sbnd,sbnd->maxGlobal); + return TRUE; + + } /* end of else (!state->nl_found) */ + + } /* end of while(dst = ...) */ + + /* + * No more dst? Then either we are: + * + * 1: done with output image. Just shut down and be happy + * 2: scheduler has noticed a downstream element can run. In this + * case, we should be a good guy and return TRUE so the scheduler + * gives us back control again later (without going back to Core + * X, which would cause our input strip to vanish). + */ + if (dbnd->final) { + /* all done!! free up all the src data */ + FreeData(flo,pet,sbnd,sbnd->maxGlobal); + return TRUE; + } + +/* + * if here, we ran out of src. Scheduler will wake us up again + * when a PutClientData request comes along. + */ + return TRUE; /* Hmmm. Well, I think I did my part ok... */ +} /* end ActivateIPhotoJpegBase */ + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +int ResetIPhotoJpegBase(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ResetReceptors(ped); + ResetEmitter(ped); + + /* get rid of the any data malloc'd by JPEG decoder */ + if(ped->peTex) { + jpegPvtPtr texpvt = (jpegPvtPtr) ped->peTex->private; + int b; + + /*** JPEG code has its own global free routine ***/ + for (b=0; bin_bands; ++b) { + if (texpvt->cinfo[b].emethods) + (*texpvt->cinfo[b].emethods->d_free_all)(& texpvt->cinfo[b]); + } + } + return(TRUE); +} /* end ResetIPhotoJpegBase */ + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +int DestroyIPhotoJpegBase(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + if(ped->peTex) + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.activate = (xieIntProc) NULL; + ped->ddVec.flush = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + + return TRUE; +} /* end DestroyIPhotoJpegBase */ + +/**** module mijpeg.c ****/ diff --git a/xie/xc/programs/Xserver/XIE/mixie/import/milut.c b/xie/xc/programs/Xserver/XIE/mixie/import/milut.c new file mode 100644 index 0000000..2c2397f --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/import/milut.c @@ -0,0 +1,231 @@ +/* $XConsortium: milut.c,v 1.4 94/04/17 20:34:54 rws Exp $ */ +/**** module milut.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + milut.c -- DDXIE prototype import client lut element + + Larry Hare -- AGE Logic, Inc. June, 1993 + +*****************************************************************************/ + +#define _XIEC_ILUT +#define _XIEC_MILUT + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeILUT(); + +/* + * routines used internal to this module + */ +static int CreateILUT(); +static int InitializeILUT(); +static int ActivateILUT(); +static int ResetILUT(); +static int DestroyILUT(); + +/* + * DDXIE ImportLUT entry points + */ +static ddElemVecRec miLUTVec = { + CreateILUT, + InitializeILUT, + ActivateILUT, + (xieIntProc)NULL, + ResetILUT, + DestroyILUT + }; + + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeILUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* for now just stash our entry point vector in the peDef */ + ped->ddVec = miLUTVec; + + return(TRUE); +} /* end miAnalyzeILUT */ + + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateILUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the import lut element definition */ + return(MakePETex(flo, ped, NO_PRIVATE, NO_SYNC, NO_SYNC)); +} /* end CreateILUT */ + + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeILUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* note: ImportResource elements don't use their receptors */ + return(InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE)); +} /* end InitializeILUT */ + + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateILUT(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + lutPtr lut = ((iLUTDefPtr)ped->elemPvt)->lut; + bandPtr bnd = pet->emitter; + CARD32 b; + + for(b = 0; b < lut->lutCnt; ++bnd, ++b) + if(!bnd->final) { + + if(ListEmpty(&lut->strips[b])) + AccessError(flo,ped, return(FALSE)); + + if(!PassStrip(flo,pet,bnd,lut->strips[b].flink)) + return(FALSE); /* alloc error */ + } + return(TRUE); +} /* end ActivateILUT */ + + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetILUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ResetEmitter(ped); + + return(TRUE); +} /* end ResetILUT */ + + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyILUT(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.activate = (xieIntProc) NULL; + ped->ddVec.flush = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + + return(TRUE); +} /* end DestroyILUT */ + +/* end module milut.c */ + diff --git a/xie/xc/programs/Xserver/XIE/mixie/import/miphoto.c b/xie/xc/programs/Xserver/XIE/mixie/import/miphoto.c new file mode 100644 index 0000000..07b81df --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/import/miphoto.c @@ -0,0 +1,858 @@ +/* $XConsortium: miphoto.c,v 1.7 94/04/17 20:34:55 dpw Exp $ */ +/**** module miphoto.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + miphoto.c -- DDXIE prototype import client photomap element + + Robert NC Shelley -- AGE Logic, Inc. April, 1993 + +*****************************************************************************/ + +#define _XIEC_MIPHOTO +#define _XIEC_IPHOTO + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include +#include + + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeIPhoto(); + +/* + * routines used internal to this module + */ +static int CreateIPhotoUncom(); +static int InitializeIPhotoUncomByPlane(); +static int ActivateIPhotoUncomByPlane(); +static int ResetIPhoto(); +static int DestroyIPhoto(); + +static int CreateIPhotoStream(); +static int InitializeIPhotoStream(); +static int ActivateIPhotoStream(); +static int ResetIPhotoStream(); + +#if XIE_FULL +static int InitializeIPhotoUncomByPixel(); +static int ActivateIPhotoUncomByPixel(); +#endif +/* + * routines we need from somewhere else + */ +extern bandMsk miImportCanonic(); +extern bandMsk miImportStream(); + +extern int CreateICPhotoFax(); +extern int InitializeIPhotoFax(); +extern int ActivateICPhotoFax(); +extern int ResetICPhotoFax(); +extern int DestroyICPhotoFax(); + +#if XIE_FULL +extern int CreateIPhotoJpegBase(); +extern int InitializeIPhotoJpegBase(); +extern int ActivateIPhotoJpegBase(); +extern int ResetIPhotoJpegBase(); +extern int DestroyIPhotoJpegBase(); +#endif + +/* + * DDXIE ImportPhotomap entry points + */ +static ddElemVecRec IPhotoUncomByPlaneVec = { + CreateIPhotoUncom, + InitializeIPhotoUncomByPlane, + ActivateIPhotoUncomByPlane, + (xieIntProc)NULL, + ResetIPhoto, + DestroyIPhoto + }; + +static ddElemVecRec IPhotoStreamVec = { + CreateIPhotoStream, + InitializeIPhotoStream, + ActivateIPhotoStream, + (xieIntProc)NULL, + ResetIPhotoStream, + DestroyIPhoto + }; + +static ddElemVecRec IPhotoFaxVec = { + CreateICPhotoFax, /* share this with ICphoto stuff */ + InitializeIPhotoFax, /* note that only this is unshared */ + ActivateICPhotoFax, + (xieIntProc)NULL, + ResetICPhotoFax, + DestroyICPhotoFax + }; + +#if XIE_FULL +static ddElemVecRec IPhotoUncomByPixelVec = { + CreateIPhotoUncom, + InitializeIPhotoUncomByPixel, + ActivateIPhotoUncomByPixel, + (xieIntProc)NULL, + ResetIPhoto, + DestroyIPhoto + }; + +static ddElemVecRec IPhotoJPEGBaselineVec = { + CreateIPhotoJpegBase, + InitializeIPhotoJpegBase, + ActivateIPhotoJpegBase, + (xieIntProc)NULL, + ResetIPhotoJpegBase, + DestroyIPhotoJpegBase + }; +#endif /* XIE_FULL */ + + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeIPhoto(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + photomapPtr map = ((iPhotoDefPtr)ped->elemPvt)->map; + + if(!miImportCanonic(flo,ped)) { + ped->ddVec = IPhotoStreamVec; + return(TRUE); + } + switch(map->technique) { + case xieValDecodeUncompressedSingle: + ped->ddVec = IPhotoUncomByPlaneVec; + break; + +#if XIE_FULL + case xieValDecodeUncompressedTriple: + if(((xieTecDecodeUncompressedTriple *) + map->tecParms)->interleave == xieValBandByPlane) + ped->ddVec = IPhotoUncomByPlaneVec; + else + ped->ddVec = IPhotoUncomByPixelVec; + + break; + case xieValDecodeJPEGBaseline: + ped->ddVec = IPhotoJPEGBaselineVec; + break; +#endif /* XIE_FULL */ + case xieValDecodeTIFFPackBits: + case xieValDecodeTIFF2: + case xieValDecodeG31D: + case xieValDecodeG32D: + case xieValDecodeG42D: + ped->ddVec = IPhotoFaxVec; + break; + default: + ImplementationError(flo,ped, return(FALSE)); + } + return(TRUE); +} /* end miAnalyzeIPhoto */ + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateIPhotoUncom(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the photo element definition */ + return(MakePETex(flo, ped, xieValMaxBands * sizeof(miUncompRec), + NO_SYNC, NO_SYNC) ); +} /* end CreateIPhotoUncom */ + + +static int CreateIPhotoStream(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the photo element definition */ + return( MakePETex(flo, ped, NO_PRIVATE, NO_SYNC, NO_SYNC) ); +} /* end CreateIPhotoStream */ + + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeIPhotoUncomByPlane(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + photomapPtr map = ((iPhotoDefPtr)ped->elemPvt)->map; + peTexPtr pet = ped->peTex; + miUncompPtr pvt = (miUncompPtr)pet->private; + CARD32 nbands = ped->outFlo.bands,b,s; + formatPtr inf = ped->inFloLst[IMPORT].format; + bandMsk import = NO_BANDS; + bandMsk reformat = miImportCanonic(flo,ped); + xieTypOrientation pixelOrder, fillOrder; + CARD8 *ppad; + + if (nbands == 1) { + xieTecDecodeUncompressedSingle *tec = ((xieTecDecodeUncompressedSingle*) + map->tecParms); + pixelOrder = tec->pixelOrder; + fillOrder = tec->fillOrder; + pvt->bandMap = 0; + ppad = &tec->leftPad; + } else { +#if XIE_FULL + xieTecDecodeUncompressedTriple *tec = ((xieTecDecodeUncompressedTriple*) + map->tecParms); + pixelOrder = tec->pixelOrder; + fillOrder = tec->fillOrder; + ppad = tec->leftPad; + if (tec->bandOrder == xieValLSFirst) + for(b = 0; b < xieValMaxBands; ++b) + pvt[b].bandMap = b; + else + for(s = 0, b = xieValMaxBands; b--; ++s) + pvt[s].bandMap = b; +#else + ImplementationError(flo,ped, return(FALSE)); +#endif + } + + for (b = 0; b < nbands; b++, pvt++, ppad++, inf++) { + pvt->next_strip = map->strips[b].flink; + if (IsCanonic(inf->class))/* If data was passed through then no decoding*/ + continue; + + import |= 1<reformat = TRUE; + else + continue; + + pvt->bitOff = pvt->leftPad = *ppad; + if(inf->depth == 1) { +#if (IMAGE_BYTE_ORDER == MSBFirst) + if (pvt->leftPad & 7 || inf->stride != 1) { + pvt->action = (fillOrder == xieValMSFirst) ? CPextractstreambits: + CPextractswappedstreambits; + } else { + pvt->action = (fillOrder == xieValMSFirst) ? CPpass_bits : + CPreverse_bits; + } +#else + if (pvt->leftPad & 7 || inf->stride != 1) { + pvt->action = (fillOrder == xieValLSFirst) ? CPextractstreambits: + CPextractswappedstreambits; + } else { + pvt->action = (fillOrder == xieValLSFirst) ? CPpass_bits : + CPreverse_bits; + } +#endif + } else if (inf->depth <= 8) { + if (pvt->leftPad & 7 || inf->stride & 7) { + /* They chose . . . poorly */ + if (pixelOrder == xieValMSFirst) { + if(fillOrder == xieValMSFirst) + pvt->action = MMUBtoB; + else + pvt->action = MLUBtoB; + } else { + if(fillOrder == xieValMSFirst) + pvt->action = LMUBtoB; + else + pvt->action = LLUBtoB; + } + } else { + /* They chose wisely */ + pvt->action = CPpass_bytes; + } + } else if (inf->depth <= 16) { + if (pvt->leftPad & 15 || inf->stride & 15) { + /* They chose . . . poorly */ + if (pixelOrder == xieValMSFirst) { + if(fillOrder == xieValMSFirst) + pvt->action = MMUPtoP; + else + pvt->action = MLUPtoP; + } else { + if(fillOrder == xieValMSFirst) + pvt->action = LMUPtoP; + else + pvt->action = LLUPtoP; + } + } else { + /* They chose wisely */ +#if (IMAGE_BYTE_ORDER == MSBFirst) + pvt->action = fillOrder == xieValMSFirst ? CPpass_pairs : CPswap_pairs; +#else + pvt->action = fillOrder == xieValLSFirst ? CPpass_pairs : CPswap_pairs; +#endif + } + } else if (inf->depth <= 24) { + if (pvt->leftPad & 31 || inf->stride & 31) { + /* They chose . . . poorly */ + if (pixelOrder == xieValMSFirst) { + if(fillOrder == xieValMSFirst) + pvt->action = MMUQtoQ; + else + pvt->action = MLUQtoQ; + } else { + if(fillOrder == xieValMSFirst) + pvt->action = LMUQtoQ; + else + pvt->action = LLUQtoQ; + } + } else { + /* They chose wisely */ +#if (IMAGE_BYTE_ORDER == MSBFirst) + pvt->action = fillOrder == xieValMSFirst ? CPpass_quads : CPswap_quads; +#else + pvt->action = fillOrder == xieValLSFirst ? CPpass_quads : CPswap_quads; +#endif + } + } else { + ImplementationError(flo,ped, return(FALSE)); + } + } + if(import) { + bandMsk smuggle = import & ~reformat; /* bands that will bypass emitter */ + receptorPtr rcp = pet->receptor; + + rcp->forward = miImportStream(flo,ped); + + return( InitReceptor(flo, ped, rcp, NO_DATAMAP, 1, import, smuggle) && + (!(import & 1) || + ImportStrips(flo, pet,&rcp->band[0], &map->strips[0])) && + (!(import & 2) || + ImportStrips(flo, pet,&rcp->band[1], &map->strips[1])) && + (!(import & 4) || + ImportStrips(flo, pet,&rcp->band[2], &map->strips[2])) && + InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE)); + } else { + return(InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE)); + } +} /* end InitializeIPhotoUncomByPlane */ + + +static int InitializeIPhotoStream(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + photomapPtr map = ((iPhotoDefPtr)ped->elemPvt)->map; + peTexPtr pet = ped->peTex; + receptorPtr rcp = pet->receptor; + int b, nbands = ped->inFloLst[IMPORT].bands; + + /* tell data manager to forward our input data to downstream elements + */ + rcp->forward = miImportStream(flo,ped); + + if(!InitReceptor(flo, ped, rcp, NO_DATAMAP, 1, rcp->forward, ~rcp->forward)) + return(FALSE); + + for(b = 0; b < nbands; ++b) + if(!ImportStrips(flo, pet, &rcp->band[b], &map->strips[b])) + return(FALSE); + + return(InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE)); +} /* end InitializeIPhotoStream */ + + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateIPhotoUncomByPlane(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + photomapPtr map = ((iPhotoDefPtr)ped->elemPvt)->map; + xieFloImportPhotomap *raw = (xieFloImportPhotomap *)ped->elemRaw; + miUncompPtr pvt = (miUncompPtr)pet->private; + formatPtr fmt = ped->inFloLst[IMPORT].format; + bandPtr bnd = &pet->emitter[0]; + bandPtr sbnd = pet->receptor[SRCtag].band; + bandPtr dbnd; + CARD32 oldslen, final, nextslen, b; + + for(b = 0; b < map->bands; b++, pvt++, fmt++, sbnd++, bnd++) + if(!bnd->final) + if(pet->receptor[SRCtag].active & 1<action; + pointer src, dst; + + if(!pvt->reformat) { + FreeData(flo, pet, sbnd, sbnd->maxGlobal); + continue; + } + nextslen = pvt->bitOff + sbnd->format->pitch + 7 >> 3; + dbnd = &pet->emitter[pvt->bandMap]; + if((src = GetSrcBytes(flo,pet,sbnd,sbnd->current,nextslen,KEEP)) + && (dst = GetCurrentDst(flo,pet,dbnd))) + + do { + (*action)(src, dst, sbnd->format->width, + (CARD32)pvt->bitOff, + (CARD32)sbnd->format->depth, + sbnd->format->stride); + + pvt->bitOff = pvt->bitOff + sbnd->format->pitch & 7; + oldslen = (pvt->bitOff) ? nextslen - 1 : nextslen; + nextslen = pvt->bitOff + sbnd->format->pitch + 7 >> 3; + src = GetSrcBytes(flo,pet,sbnd,sbnd->current+oldslen, + nextslen,KEEP); + dst = GetNextDst(flo,pet,dbnd,FLUSH); + } while(src && dst); + + final = sbnd->strip && sbnd->strip->final; + if(!src && final && dbnd->current < dbnd->format->height) { + /* + * the client lied about the image size! + */ + if(raw->notify) + SendDecodeNotifyEvent(flo, ped, 0, map->technique, + dbnd->format->width, dbnd->current, TRUE); + /* + * If the client didn't send enough data, we could zero-fill the + * remaining lines. Since we sent the "aborted" status, we won't + * bother (the protocol offers both choices). + */ + ValueError(flo,ped,dbnd->format->height, return(FALSE)); + } + if(!src || dbnd->final) { + /* free whatever we've used so far + */ + FreeData(flo, pet, sbnd, final ? sbnd->maxGlobal : sbnd->current); + } + } else { + stripPtr strip = pvt->next_strip; + pvt->next_strip = strip->flink; + + if(ListEnd(strip,&map->strips[b])) + AccessError(flo,ped, return(FALSE)); + + /* pass a clone of the current strip to our recipients + */ + if(!PassStrip(flo,pet,bnd,strip)) + return(FALSE); /* alloc error */ + } + return(TRUE); +} /* end ActivateIPhotoUncomByPlane */ + + +static int ActivateIPhotoStream(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + CARD32 nbands = ped->inFloLst[IMPORT].bands; + bandPtr bnd = pet->receptor[IMPORT].band; + CARD32 b; + + for(b = 0; b < nbands; ++bnd, ++b) { + if(GetSrcBytes(flo,pet,bnd,bnd->current,1,KEEP)) { + FreeData(flo,pet,bnd,bnd->maxLocal); + if(ListEmpty(&bnd->stripLst)) + DisableDst(flo,pet,&pet->emitter[b]); + } + } + return(TRUE); +} /* end ActivateIPhotoStream */ + + + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetIPhoto(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + miUncompPtr pvt = (miUncompPtr)ped->peTex->private; + int i; + + for(i = 0; i < xieValMaxBands; ++i) + if(pvt[i].buf) pvt[i].buf = (pointer) XieFree(pvt[i].buf); + + ResetReceptors(ped); + ResetEmitter(ped); + + return(TRUE); +} /* end ResetIPhoto */ + + +static int ResetIPhotoStream(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ResetReceptors(ped); + ResetEmitter(ped); + + return(TRUE); +} /* end ResetIPhotoStream */ + + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyIPhoto(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.activate = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + + return(TRUE); +} /* end DestroyIPhoto */ + + +#if XIE_FULL +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeIPhotoUncomByPixel(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + photomapPtr map = ((iPhotoDefPtr)ped->elemPvt)->map; + xieTecDecodeUncompressedTriple *tec = ((xieTecDecodeUncompressedTriple *) + map->tecParms); + peTexPtr pet = ped->peTex; + miUncompPtr pvt = (miUncompPtr)pet->private; + bandPtr sbnd = &ped->peTex->receptor[IMPORT].band[0]; + CARD32 sstride = sbnd->format->stride>>3; + CARD8 leftPad = tec->leftPad[0]>>3; + xieTypOrientation pixelOrder, fillOrder; + CARD32 depth0, depth1, depth2; + int s, d; + + pvt->unaligned = FALSE; /* Hope for the best */ + + if(tec->bandOrder == xieValLSFirst) + for(d = 0; d < xieValMaxBands; ++d) + pvt[d].bandMap = d; + else + for(s = 0, d = xieValMaxBands; d--; ++s) + pvt[s].bandMap = d; + + depth0 = pet->emitter[pvt[0].bandMap].format->depth; + depth1 = pet->emitter[pvt[1].bandMap].format->depth; + depth2 = pet->emitter[pvt[2].bandMap].format->depth; + + pixelOrder = tec->pixelOrder; + fillOrder = tec->fillOrder; + pvt[0].next_strip = map->strips[0].flink; + + pvt->bitOff = pvt->leftPad = tec->leftPad[0]; + + /* See if data is nicely aligned */ + if (!(tec->leftPad[0] & 7) && !(sbnd->format->stride & 7)) { + if (depth0 == 16 && depth1 == 16 && depth2 == 16) { +#if (IMAGE_BYTE_ORDER == MSBFirst) + void (*pa)() = (tec->pixelOrder == xieValMSFirst) ? StoP : StosP; +#else + void (*pa)() = (tec->pixelOrder == xieValMSFirst) ? StosP : StoP; +#endif + for(s = 0; s < xieValMaxBands; s++, pvt++) { + pvt->action = pa; + pvt->Bstride = sstride; + pvt->srcoffset = s + leftPad; + pvt->mask = 0; /* Unused */ + pvt->shift = 0; /* Unused */ + } + } else if (depth0 == 8 && depth1 == 8 && depth2 == 8) { + for(s = 0; s < xieValMaxBands; s++, pvt++) { + pvt->action = StoB; + pvt->Bstride = sstride; + pvt->srcoffset = s + leftPad; + pvt->mask = 0; /* Unused */ + pvt->shift = 0; /* Unused */ + } + } else if (depth0 == 4 && depth1 == 4 && depth2 == 4) { + if (tec->fillOrder == xieValMSFirst) { + pvt->action = SbtoB; + pvt->Bstride = sstride; + pvt->srcoffset = leftPad; + pvt->mask = 0xf0; + (pvt++)->shift = 4; + pvt->action = SbtoB; + pvt->Bstride = sstride; + pvt->srcoffset = leftPad; + pvt->mask = 0x0f; + (pvt++)->shift = 0; + pvt->action = SbtoB; + pvt->Bstride = sstride; + pvt->srcoffset = 1 + leftPad; + pvt->mask = 0xf0; + pvt->shift = 4; + } else { /* xieValLSFirst */ + pvt->action = SbtoB; + pvt->Bstride = sstride; + pvt->srcoffset = leftPad; + pvt->mask = 0x0f; + (pvt++)->shift = 0; + pvt->action = SbtoB; + pvt->Bstride = sstride; + pvt->srcoffset = leftPad; + pvt->mask = 0xf0; + (pvt++)->shift = 4; + pvt->action = SbtoB; + pvt->Bstride = sstride; + pvt->srcoffset = 1 + leftPad; + pvt->mask = 0x0f; + pvt->shift = 0; + } + } else if (depth0 + depth1 + depth2 <= 8) { + CARD8 ones = 0xff,smask0,smask1,smask2,shift0,shift1,shift2; + if (tec->fillOrder == xieValMSFirst) { + smask0 = ~(ones>>depth0); + smask1 = ~(ones>>(depth0 + depth1) | smask0); + smask2 = ~(ones>>(depth0 + depth1 + depth2) | smask0 | smask1); + shift0 = 8 - depth0; + shift1 = 8 - (depth0 + depth1); + shift2 = 8 - (depth0 + depth1 + depth2); + } else { /* fillOrder == xieValLSFirst */ + smask2 = ~(ones<action = (depth0 > 1) ? SbtoB : Sbtob; + pvt->Bstride = sstride; + pvt->srcoffset = leftPad; + pvt->mask = smask0; + (pvt++)->shift = shift0; + pvt->action = (depth1 > 1) ? SbtoB : Sbtob; + pvt->Bstride = sstride; + pvt->srcoffset = leftPad; + pvt->mask = smask1; + (pvt++)->shift = shift1; + pvt->action = (depth2 > 1) ? SbtoB : Sbtob; + pvt->Bstride = sstride; + pvt->srcoffset = leftPad; + pvt->mask = smask2; + pvt->shift = shift2; + } else { + pvt->unaligned = TRUE; + } + } else { + pvt->unaligned = TRUE; + } + pvt = (miUncompPtr)pet->private; + pvt->reformat = TRUE; + + if(pvt->unaligned) { + /* since it's unaligned and somebody wants our data, do it the hard way */ + CARD32 width = sbnd->format->width; + pvt->action = ExtractTripleFuncs[tec->pixelOrder == xieValLSFirst ? 0 : 1] + [tec->fillOrder == xieValLSFirst ? 0 : 1] + [depth0 <= 8 ? 0 : 1] + [depth1 <= 8 ? 0 : 1] + [depth2 <= 8 ? 0 : 1]; + if(depth0 == 1 && !(pvt[0].buf = (pointer)XieMalloc(width+7)) || + depth1 == 1 && !(pvt[1].buf = (pointer)XieMalloc(width+7)) || + depth2 == 1 && !(pvt[2].buf = (pointer)XieMalloc(width+7))) + AllocError(flo,ped, return(FALSE)); + } + /* see if data manager should forward our input data to downstream elements + */ + pet->receptor->forward = miImportStream(flo,ped); + + return(InitReceptor(flo,ped, pet->receptor,NO_DATAMAP,1,1,NO_BANDS) && + ImportStrips(flo,pet,&pet->receptor[0].band[0],&map->strips[0]) && + InitEmitter(flo,ped,NO_DATAMAP,NO_INPLACE)); +} /* end InitializeIPhotoUnTriple */ + + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateIPhotoUncomByPixel(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloImportPhotomap *raw = (xieFloImportPhotomap *)ped->elemRaw; + miUncompPtr pvt = (miUncompPtr) (pet->private); + bandPtr sbnd = &pet->receptor[IMPORT].band[0]; + bandPtr db0 = &pet->emitter[pvt[0].bandMap]; + bandPtr db1 = &pet->emitter[pvt[1].bandMap]; + bandPtr db2 = &pet->emitter[pvt[2].bandMap]; + CARD32 final, width = db0->format->width; + pointer src, dp0, dp1, dp2; + + if(pvt->unaligned) { + CARD32 oldslen, nextslen; + void (*action)() = pvt->action; + CARD32 depth0 = db0->format->depth; + CARD32 depth1 = db1->format->depth; + CARD32 depth2 = db2->format->depth; + CARD32 stride = sbnd->format->stride; + + nextslen = pvt->bitOff + sbnd->format->pitch + 7 >> 3; + if((src = GetSrcBytes(flo,pet,sbnd,sbnd->current,nextslen,KEEP)) && + (dp0 = GetCurrentDst(flo,pet,db0)) && + (dp1 = GetCurrentDst(flo,pet,db1)) && + (dp2 = GetCurrentDst(flo,pet,db2))) + do { + + (*action)(src, + pvt[0].buf ? pvt[0].buf : dp0, + pvt[1].buf ? pvt[1].buf : dp1, + pvt[2].buf ? pvt[2].buf : dp2, + width, pvt->bitOff, depth0, depth1, depth2, stride); + + if(pvt[0].buf) bitshrink(pvt[0].buf,dp0,width,(BytePixel)1); + if(pvt[1].buf) bitshrink(pvt[1].buf,dp1,width,(BytePixel)1); + if(pvt[2].buf) bitshrink(pvt[2].buf,dp2,width,(BytePixel)1); + + pvt->bitOff = pvt->bitOff + sbnd->format->pitch & 7; + oldslen = pvt->bitOff ? nextslen - 1 : nextslen; + nextslen = pvt->bitOff + sbnd->format->pitch + 7 >> 3; + src = GetSrcBytes(flo,pet,sbnd,sbnd->current+oldslen,nextslen,KEEP); + dp0 = GetNextDst(flo,pet,db0,FLUSH); + dp1 = GetNextDst(flo,pet,db1,FLUSH); + dp2 = GetNextDst(flo,pet,db2,FLUSH); + } while(src && dp0 && dp1 && dp2); + } else { + CARD32 slen = sbnd->format->pitch+7>>3; + if((src = GetSrcBytes(flo,pet,sbnd,sbnd->current,slen,KEEP)) && + (dp0 = GetCurrentDst(flo,pet,db0)) && + (dp1 = GetCurrentDst(flo,pet,db1)) && + (dp2 = GetCurrentDst(flo,pet,db2))) + do { + + (*pvt[0].action)(src,dp0,width,&pvt[0]); + (*pvt[1].action)(src,dp1,width,&pvt[1]); + (*pvt[2].action)(src,dp2,width,&pvt[2]); + + src =GetSrcBytes(flo,pet,sbnd,sbnd->current+slen,slen,KEEP); + dp0 = GetNextDst(flo,pet,db0,FLUSH); + dp1 = GetNextDst(flo,pet,db1,FLUSH); + dp2 = GetNextDst(flo,pet,db2,FLUSH); + } while(src && dp0 && dp1 && dp2); + } + final = sbnd->strip && sbnd->strip->final; + if(!src && final && db0->current < db0->format->height) { + /* + * the client lied about the image size! + */ + if(raw->notify) + SendDecodeNotifyEvent(flo, ped, 0, xieValDecodeUncompressedTriple, + db0->format->width, db0->current, TRUE); + /* + * If the client didn't send enough data, we could zero-fill the + * remaining lines. Since we sent the "aborted" status, we won't + * bother (the protocol offers both choices). + */ + ValueError(flo,ped,db0->format->height, return(FALSE)); + } + if(!src || db0->final && db1->final && db2->final) { + /* free whatever we've used so far + */ + FreeData(flo, pet, sbnd, final ? sbnd->maxGlobal : sbnd->current); + } + return(TRUE); +} /* end ActivateIPhotoUncomByPixel */ +#endif /* XIE_FULL */ + +/* end module miphoto.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/import/miregion.c b/xie/xc/programs/Xserver/XIE/mixie/import/miregion.c new file mode 100644 index 0000000..065fb70 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/import/miregion.c @@ -0,0 +1,1089 @@ +/* $XConsortium: miregion.c,v 1.4 94/04/17 20:34:56 rws Exp $ */ +/**** module miregion.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + miregion.c -- ddx/mi/miregion code converted over to XIE for rectangles + of interest. "Minimal" conversion made to support + rectangles defined by INT32s instead of shorts. Unused + routines from the general code have been removed. + + Dean Verheiden -- AGE Logic, Inc. August, 1993 + +*****************************************************************************/ +/*********************************************************** + +Copyright (c) 1987, 1988, 1989 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + +Copyright 1987, 1988, 1989 by +Digital Equipment Corporation, Maynard, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ + +#define _XIEC_MIREGION + +#include +#include "miscstruct.h" +#include "regionstr.h" +#include "Xprotostr.h" +#include "gc.h" + +#include "microi.h" + +#if defined (__GNUC__) && !defined (NO_INLINES) +#define INLINE __inline +#else +#define INLINE +#endif + +/* + * hack until callers of these functions can deal with out-of-memory + */ + +extern Bool Must_have_memory; + +#define assert(expr) + +#define good(reg) assert(miXieValidRegion(reg)) + +/* + * The functions in this file implement the Region abstraction used extensively + * throughout the X11 sample server. A Region is simply a set of disjoint + * (non-overlapping) rectangles, plus an "extent" rectangle which is the + * smallest single rectangle that contains all the non-overlapping rectangles. + * + * A Region is implemented as a "y-x-banded" array of rectangles. This array + * imposes two degrees of order. First, all rectangles are sorted by top side + * y coordinate first (y1), and then by left side x coordinate (x1). + * + * Furthermore, the rectangles are grouped into "bands". Each rectangle in a + * band has the same top y coordinate (y1), and each has the same bottom y + * coordinate (y2). Thus all rectangles in a band differ only in their left + * and right side (x1 and x2). Bands are implicit in the array of rectangles: + * there is no separate list of band start pointers. + * + * The y-x band representation does not minimize rectangles. In particular, + * if a rectangle vertically crosses a band (the rectangle has scanlines in + * the y1 to y2 area spanned by the band), then the rectangle may be broken + * down into two or more smaller rectangles stacked one atop the other. + * + * ----------- ----------- + * | | | | band 0 + * | | -------- ----------- -------- + * | | | | in y-x banded | | | | band 1 + * | | | | form is | | | | + * ----------- | | ----------- -------- + * | | | | band 2 + * -------- -------- + * + * An added constraint on the rectangles is that they must cover as much + * horizontal area as possible: no two rectangles within a band are allowed + * to touch. + * + * Whenever possible, bands will be merged together to cover a greater vertical + * distance (and thus reduce the number of rectangles). Two bands can be merged + * only if the bottom of one touches the top of the other and they have + * rectangles in the same places (of the same width, of course). + * + * Adam de Boor wrote most of the original region code. Joel McCormack + * substantially modified or rewrote most of the core arithmetic routines, + * and added miXieRegionValidate in order to support several speed improvements + * to miXieValidateTree. Bob Scheifler changed the representation to be more + * compact when empty or a single rectangle, and did a bunch of gratuitous + * reformatting. + */ + +#define xallocData(n) (XieRegDataPtr)XieMalloc(XIEREGION_SZOF(n)) +#define xfreeData(reg) if ((reg)->data && (reg)->data->size) XieFree((reg)->data) + +#define RECTALLOC(pReg,n) \ +if (!(pReg)->data || (((pReg)->data->numRects + (n)) > (pReg)->data->size)) \ + miXieRectAlloc(pReg, n) + +#define ADDRECT(pNextRect,nx1,ny1,nx2,ny2) \ +{ \ + pNextRect->x1 = nx1; \ + pNextRect->y1 = ny1; \ + pNextRect->x2 = nx2; \ + pNextRect->y2 = ny2; \ + pNextRect++; \ +} + +#define NEWRECT(pReg,pNextRect,nx1,ny1,nx2,ny2) \ +{ \ + if (!(pReg)->data || ((pReg)->data->numRects == (pReg)->data->size))\ + { \ + miXieRectAlloc(pReg, 1); \ + pNextRect = XIEREGION_TOP(pReg); \ + } \ + ADDRECT(pNextRect,nx1,ny1,nx2,ny2); \ + pReg->data->numRects++; \ + assert(pReg->data->numRects<=pReg->data->size); \ +} + + +#define DOWNSIZE(reg,numRects) \ +if (((numRects) < ((reg)->data->size >> 1)) && ((reg)->data->size > 50)) \ +{ \ + XieRegDataPtr NewData; \ + NewData = (XieRegDataPtr)XieRealloc((reg)->data, XIEREGION_SZOF(numRects)); \ + if (NewData) \ + { \ + NewData->size = (numRects); \ + (reg)->data = NewData; \ + } \ +} + +static XieBoxRec EmptyBox = {0, 0, 0, 0}; +static XieRegDataRec EmptyData = {0, 0}; + +/***************************************************************** + * XieRegionCreate(rect, size) + * This routine does a simple XieMalloc to make a structure of + * REGION of "size" number of rectangles. + *****************************************************************/ + +XieRegionPtr +miXieRegionCreate(rect, size) + XieBoxPtr rect; + int size; +{ + register XieRegionPtr pReg; + + Must_have_memory = TRUE; /* XXX */ + pReg = (XieRegionPtr)XieMalloc(sizeof(XieRegionRec)); + Must_have_memory = FALSE; /* XXX */ + if (rect) + { + pReg->extents = *rect; + pReg->data = (XieRegDataPtr)NULL; + } + else + { + pReg->extents = EmptyBox; + if ((size > 1) && (pReg->data = xallocData(size))) + { + pReg->data->size = size; + pReg->data->numRects = 0; + } + else + pReg->data = &EmptyData; + } + return(pReg); +} + +void +miXieRegionDestroy(pReg) + XieRegionPtr pReg; +{ + good(pReg); + xfreeData(pReg); + XieFree(pReg); +} + +Bool +miXieRectAlloc(pRgn, n) + register XieRegionPtr pRgn; + int n; +{ + Must_have_memory = TRUE; /* XXX */ + if (!pRgn->data) + { + n++; + pRgn->data = xallocData(n); + pRgn->data->numRects = 1; + *XIEREGION_BOXPTR(pRgn) = pRgn->extents; + } + else if (!pRgn->data->size) + { + pRgn->data = xallocData(n); + pRgn->data->numRects = 0; + } + else + { + if (n == 1) + { + n = pRgn->data->numRects; + if (n > 500) /* XXX pick numbers out of a hat */ + n = 250; + } + n += pRgn->data->numRects; + pRgn->data = (XieRegDataPtr)XieRealloc(pRgn->data, XIEREGION_SZOF(n)); + } + Must_have_memory = FALSE; /* XXX */ + pRgn->data->size = n; + return TRUE; +} + + +/*====================================================================== + * Generic XieRegion Operator + *====================================================================*/ + +/*- + *----------------------------------------------------------------------- + * miXieCoalesce -- + * Attempt to merge the boxes in the current band with those in the + * previous one. We are guaranteed that the current band extends to + * the end of the rects array. Used only by miXieRegionOp. + * + * Results: + * The new index for the previous band. + * + * Side Effects: + * If coalescing takes place: + * - rectangles in the previous band will have their y2 fields + * altered. + * - pReg->data->numRects will be decreased. + * + *----------------------------------------------------------------------- + */ +INLINE static int +miXieCoalesce (pReg, prevStart, curStart) + register XieRegionPtr pReg; /* Region to coalesce */ + int prevStart; /* Index of start of previous band */ + int curStart; /* Index of start of current band */ +{ + register XieBoxPtr pPrevBox; /* Current box in previous band */ + register XieBoxPtr pCurBox; /* Current box in current band */ + register int numRects; /* Number rectangles in both bands */ + register int y2; /* Bottom of current band */ + /* + * Figure out how many rectangles are in the band. + */ + numRects = curStart - prevStart; + assert(numRects == pReg->data->numRects - curStart); + + if (!numRects) return curStart; + + /* + * The bands may only be coalesced if the bottom of the previous + * matches the top scanline of the current. + */ + pPrevBox = XIEREGION_BOX(pReg, prevStart); + pCurBox = XIEREGION_BOX(pReg, curStart); + if (pPrevBox->y2 != pCurBox->y1) return curStart; + + /* + * Make sure the bands have boxes in the same places. This + * assumes that boxes have been added in such a way that they + * cover the most area possible. I.e. two boxes in a band must + * have some horizontal space between them. + */ + y2 = pCurBox->y2; + + do { + if ((pPrevBox->x1 != pCurBox->x1) || (pPrevBox->x2 != pCurBox->x2)) { + return (curStart); + } + pPrevBox++; + pCurBox++; + numRects--; + } while (numRects); + + /* + * The bands may be merged, so set the bottom y of each box + * in the previous band to the bottom y of the current band. + */ + numRects = curStart - prevStart; + pReg->data->numRects -= numRects; + do { + pPrevBox--; + pPrevBox->y2 = y2; + numRects--; + } while (numRects); + return prevStart; +} + + +/* Quicky macro to avoid trivial reject procedure calls to miXieCoalesce */ + +#define Coalesce(newReg, prevBand, curBand) \ + if (curBand - prevBand == newReg->data->numRects - curBand) { \ + prevBand = miXieCoalesce(newReg, prevBand, curBand); \ + } else { \ + prevBand = curBand; \ + } + +/*- + *----------------------------------------------------------------------- + * miXieAppendNonO -- + * Handle a non-overlapping band for the union and subtract operations. + * Just adds the (top/bottom-clipped) rectangles into the region. + * Doesn't have to check for subsumption or anything. + * + * Results: + * None. + * + * Side Effects: + * pReg->data->numRects is incremented and the rectangles overwritten + * with the rectangles we're passed. + * + *----------------------------------------------------------------------- + */ + +INLINE static Bool +miXieAppendNonO (pReg, r, rEnd, y1, y2) + register XieRegionPtr pReg; + register XieBoxPtr r; + XieBoxPtr rEnd; + register int y1; + register int y2; +{ + register XieBoxPtr pNextRect; + register int newRects; + + newRects = rEnd - r; + + assert(y1 < y2); + assert(newRects != 0); + + /* Make sure we have enough space for all rectangles to be added */ + RECTALLOC(pReg, newRects); + pNextRect = XIEREGION_TOP(pReg); + pReg->data->numRects += newRects; + do { + assert(r->x1 < r->x2); + ADDRECT(pNextRect, r->x1, y1, r->x2, y2); + r++; + } while (r != rEnd); + + return TRUE; +} + +#define FindBand(r, rBandEnd, rEnd, ry1) \ +{ \ + ry1 = r->y1; \ + rBandEnd = r+1; \ + while ((rBandEnd != rEnd) && (rBandEnd->y1 == ry1)) { \ + rBandEnd++; \ + } \ +} + +#define AppendRegions(newReg, r, rEnd) \ +{ \ + int newRects; \ + if (newRects = rEnd - r) { \ + RECTALLOC(newReg, newRects); \ + memcpy((char *)XIEREGION_TOP(newReg), (char *)r, \ + newRects * sizeof(XieBoxRec)); \ + newReg->data->numRects += newRects; \ + } \ +} + +/*- + *----------------------------------------------------------------------- + * miXieRegionOp -- + * Apply an operation to two regions. Called by miXieUnion, miXieInverse, + * miXieSubtract, miXieIntersect.... Both regions MUST have at least one + * rectangle, and cannot be the same object. + * + * Results: + * TRUE if successful. + * + * Side Effects: + * The new region is overwritten. + * pOverlap set to TRUE if overlapFunc ever returns TRUE. + * + * Notes: + * The idea behind this function is to view the two regions as sets. + * Together they cover a rectangle of area that this function divides + * into horizontal bands where points are covered only by one region + * or by both. For the first case, the nonOverlapFunc is called with + * each the band and the band's upper and lower extents. For the + * second, the overlapFunc is called to process the entire band. It + * is responsible for clipping the rectangles in the band, though + * this function provides the boundaries. + * At the end of each band, the new region is coalesced, if possible, + * to reduce the number of rectangles in the region. + * + *----------------------------------------------------------------------- + */ +static Bool +miXieRegionOp(newReg, reg1, reg2, overlapFunc, appendNon1, appendNon2, pOverlap) + XieRegionPtr newReg; /* Place to store result */ + XieRegionPtr reg1; /* First region in operation */ + XieRegionPtr reg2; /* 2d region in operation */ + Bool (*overlapFunc)(); /* Function to call for over- + * lapping bands */ + Bool appendNon1; /* Append non-overlapping bands */ + /* in region 1 ? */ + Bool appendNon2; /* Append non-overlapping bands */ + /* in region 2 ? */ + Bool *pOverlap; +{ + register XieBoxPtr r1; /* Pointer into first region */ + register XieBoxPtr r2; /* Pointer into 2d region */ + XieBoxPtr r1End; /* End of 1st region */ + XieBoxPtr r2End; /* End of 2d region */ + INT32 ybot; /* Bottom of intersection */ + INT32 ytop; /* Top of intersection */ + XieRegDataPtr oldData; /* Old data for newReg */ + int prevBand; /* Index of start of + * previous band in newReg */ + int curBand; /* Index of start of current + * band in newReg */ + register XieBoxPtr r1BandEnd; /* End of current band in r1 */ + register XieBoxPtr r2BandEnd; /* End of current band in r2 */ + INT32 top; /* Top of non-overlapping band */ + INT32 bot; /* Bottom of non-overlapping band*/ + register int r1y1; /* Temps for r1->y1 and r2->y1 */ + register int r2y1; + int newSize; + int numRects; + + /* + * Initialization: + * set r1, r2, r1End and r2End appropriately, save the rectangles + * of the destination region until the end in case it's one of + * the two source regions, then mark the "new" region empty, allocating + * another array of rectangles for it to use. + */ + + r1 = XIEREGION_RECTS(reg1); + newSize = XIEREGION_NUM_RECTS(reg1); + r1End = r1 + newSize; + numRects = XIEREGION_NUM_RECTS(reg2); + r2 = XIEREGION_RECTS(reg2); + r2End = r2 + numRects; + assert(r1 != r1End); + assert(r2 != r2End); + + oldData = (XieRegDataPtr)NULL; + if (((newReg == reg1) && (newSize > 1)) || + ((newReg == reg2) && (numRects > 1))) + { + oldData = newReg->data; + newReg->data = &EmptyData; + } + /* guess at new size */ + if (numRects > newSize) + newSize = numRects; + newSize <<= 1; + if (!newReg->data) + newReg->data = &EmptyData; + else if (newReg->data->size) + newReg->data->numRects = 0; + if (newSize > newReg->data->size) + miXieRectAlloc(newReg, newSize); + + /* + * Initialize ybot. + * In the upcoming loop, ybot and ytop serve different functions depending + * on whether the band being handled is an overlapping or non-overlapping + * band. + * In the case of a non-overlapping band (only one of the regions + * has points in the band), ybot is the bottom of the most recent + * intersection and thus clips the top of the rectangles in that band. + * ytop is the top of the next intersection between the two regions and + * serves to clip the bottom of the rectangles in the current band. + * For an overlapping band (where the two regions intersect), ytop clips + * the top of the rectangles of both regions and ybot clips the bottoms. + */ + + ybot = min(r1->y1, r2->y1); + + /* + * prevBand serves to mark the start of the previous band so rectangles + * can be coalesced into larger rectangles. qv. miXieCoalesce, above. + * In the beginning, there is no previous band, so prevBand == curBand + * (curBand is set later on, of course, but the first band will always + * start at index 0). prevBand and curBand must be indices because of + * the possible expansion, and resultant moving, of the new region's + * array of rectangles. + */ + prevBand = 0; + + do { + /* + * This algorithm proceeds one source-band (as opposed to a + * destination band, which is determined by where the two regions + * intersect) at a time. r1BandEnd and r2BandEnd serve to mark the + * rectangle after the last one in the current band for their + * respective regions. + */ + assert(r1 != r1End); + assert(r2 != r2End); + + FindBand(r1, r1BandEnd, r1End, r1y1); + FindBand(r2, r2BandEnd, r2End, r2y1); + + /* + * First handle the band that doesn't intersect, if any. + * + * Note that attention is restricted to one band in the + * non-intersecting region at once, so if a region has n + * bands between the current position and the next place it overlaps + * the other, this entire loop will be passed through n times. + */ + if (r1y1 < r2y1) { + if (appendNon1) { + top = max(r1y1, ybot); + bot = min(r1->y2, r2y1); + if (top != bot) { + curBand = newReg->data->numRects; + miXieAppendNonO(newReg, r1, r1BandEnd, top, bot); + Coalesce(newReg, prevBand, curBand); + } + } + ytop = r2y1; + } else if (r2y1 < r1y1) { + if (appendNon2) { + top = max(r2y1, ybot); + bot = min(r2->y2, r1y1); + if (top != bot) { + curBand = newReg->data->numRects; + miXieAppendNonO(newReg, r2, r2BandEnd, top, bot); + Coalesce(newReg, prevBand, curBand); + } + } + ytop = r1y1; + } else { + ytop = r1y1; + } + + /* + * Now see if we've hit an intersecting band. The two bands only + * intersect if ybot > ytop + */ + ybot = min(r1->y2, r2->y2); + if (ybot > ytop) { + curBand = newReg->data->numRects; + (* overlapFunc)(newReg, r1, r1BandEnd, r2, r2BandEnd, ytop, ybot, + pOverlap); + Coalesce(newReg, prevBand, curBand); + } + + /* + * If we've finished with a band (y2 == ybot) we skip forward + * in the region to the next band. + */ + if (r1->y2 == ybot) r1 = r1BandEnd; + if (r2->y2 == ybot) r2 = r2BandEnd; + + } while (r1 != r1End && r2 != r2End); + + /* + * Deal with whichever region (if any) still has rectangles left. + * + * We only need to worry about banding and coalescing for the very first + * band left. After that, we can just group all remaining boxes, + * regardless of how many bands, into one final append to the list. + */ + + if ((r1 != r1End) && appendNon1) { + /* Do first nonOverlap1Func call, which may be able to coalesce */ + FindBand(r1, r1BandEnd, r1End, r1y1); + curBand = newReg->data->numRects; + miXieAppendNonO(newReg, r1, r1BandEnd, max(r1y1, ybot), r1->y2); + Coalesce(newReg, prevBand, curBand); + /* Just append the rest of the boxes */ + AppendRegions(newReg, r1BandEnd, r1End); + + } else if ((r2 != r2End) && appendNon2) { + /* Do first nonOverlap2Func call, which may be able to coalesce */ + FindBand(r2, r2BandEnd, r2End, r2y1); + curBand = newReg->data->numRects; + miXieAppendNonO(newReg, r2, r2BandEnd, max(r2y1, ybot), r2->y2); + Coalesce(newReg, prevBand, curBand); + /* Append rest of boxes */ + AppendRegions(newReg, r2BandEnd, r2End); + } + + if (oldData) + XieFree(oldData); + + if (!(numRects = newReg->data->numRects)) + { + xfreeData(newReg); + newReg->data = &EmptyData; + } + else if (numRects == 1) + { + newReg->extents = *XIEREGION_BOXPTR(newReg); + xfreeData(newReg); + newReg->data = (XieRegDataPtr)NULL; + } + else + { + DOWNSIZE(newReg, numRects); + } + + return TRUE; +} + +#define MERGERECT(r) \ +{ \ + if (r->x1 <= x2) { \ + /* Merge with current rectangle */ \ + if (r->x1 < x2) *pOverlap = TRUE; \ + if (x2 < r->x2) x2 = r->x2; \ + } else { \ + /* Add current rectangle, start new one */ \ + NEWRECT(pReg, pNextRect, x1, y1, x2, y2); \ + x1 = r->x1; \ + x2 = r->x2; \ + } \ + r++; \ +} + +/*====================================================================== + * XieRegion Union + *====================================================================*/ + +/*- + *----------------------------------------------------------------------- + * miXieUnionO -- + * Handle an overlapping band for the union operation. Picks the + * left-most rectangle each time and merges it into the region. + * + * Results: + * TRUE if successful. + * + * Side Effects: + * pReg is overwritten. + * pOverlap is set to TRUE if any boxes overlap. + * + *----------------------------------------------------------------------- + */ +static Bool +miXieUnionO (pReg, r1, r1End, r2, r2End, y1, y2, pOverlap) + register XieRegionPtr pReg; + register XieBoxPtr r1; + XieBoxPtr r1End; + register XieBoxPtr r2; + XieBoxPtr r2End; + INT32 y1; + INT32 y2; + Bool *pOverlap; +{ + register XieBoxPtr pNextRect; + register int x1; /* left and right side of current union */ + register int x2; + + assert (y1 < y2); + assert(r1 != r1End && r2 != r2End); + + pNextRect = XIEREGION_TOP(pReg); + + /* Start off current rectangle */ + if (r1->x1 < r2->x1) + { + x1 = r1->x1; + x2 = r1->x2; + r1++; + } + else + { + x1 = r2->x1; + x2 = r2->x2; + r2++; + } + while (r1 != r1End && r2 != r2End) + { + if (r1->x1 < r2->x1) MERGERECT(r1) else MERGERECT(r2); + } + + /* Finish off whoever (if any) is left */ + if (r1 != r1End) + { + do + { + MERGERECT(r1); + } while (r1 != r1End); + } + else if (r2 != r2End) + { + do + { + MERGERECT(r2); + } while (r2 != r2End); + } + + /* Add current rectangle */ + NEWRECT(pReg, pNextRect, x1, y1, x2, y2); + + return TRUE; +} + +#define ExchangeRects(a, b) \ +{ \ + XieBoxRec t; \ + t = rects[a]; \ + rects[a] = rects[b]; \ + rects[b] = t; \ +} + +static void +QuickSortRects(rects, numRects) + register XieBoxRec rects[]; + register int numRects; +{ + register int y1; + register int x1; + register int i, j; + register XieBoxPtr r; + + /* Always called with numRects > 1 */ + + do + { + if (numRects == 2) + { + if (rects[0].y1 > rects[1].y1 || + (rects[0].y1 == rects[1].y1 && rects[0].x1 > rects[1].x1)) + ExchangeRects(0, 1); + return; + } + + /* Choose partition element, stick in location 0 */ + ExchangeRects(0, numRects >> 1); + y1 = rects[0].y1; + x1 = rects[0].x1; + + /* Partition array */ + i = 0; + j = numRects; + do + { + r = &(rects[i]); + do + { + r++; + i++; + } while (i != numRects && + (r->y1 < y1 || (r->y1 == y1 && r->x1 < x1))); + r = &(rects[j]); + do + { + r--; + j--; + } while (y1 < r->y1 || (y1 == r->y1 && x1 < r->x1)); + if (i < j) + ExchangeRects(i, j); + } while (i < j); + + /* Move partition element back to middle */ + ExchangeRects(0, j); + + /* Recurse */ + if (numRects-j-1 > 1) + QuickSortRects(&rects[j+1], numRects-j-1); + numRects = j; + } while (numRects > 1); +} + +/*- + *----------------------------------------------------------------------- + * miXieRegionValidate -- + * + * Take a ``region'' which is a non-y-x-banded random collection of + * rectangles, and compute a nice region which is the union of all the + * rectangles. + * + * Results: + * TRUE if successful. + * + * Side Effects: + * The passed-in ``region'' may be modified. + * pOverlap set to TRUE if any retangles overlapped, else FALSE; + * + * Strategy: + * Step 1. Sort the rectangles into ascending order with primary key y1 + * and secondary key x1. + * + * Step 2. Split the rectangles into the minimum number of proper y-x + * banded regions. This may require horizontally merging + * rectangles, and vertically coalescing bands. With any luck, + * this step in an identity tranformation (ala the Box widget), + * or a coalescing into 1 box (ala Menus). + * + * Step 3. Merge the separate regions down to a single region by calling + * miXieUnion. Maximize the work each miXieUnion call does by using + * a binary merge. + * + *----------------------------------------------------------------------- + */ + +Bool +miXieRegionValidate(badreg, pOverlap) + XieRegionPtr badreg; + Bool *pOverlap; +{ + /* Descriptor for regions under construction in Step 2. */ + typedef struct { + XieRegionRec reg; + int prevBand; + int curBand; + } XieRegionInfo; + + int numRects; /* Original numRects for badreg */ + XieRegionInfo *ri; /* Array of current regions */ + int numRI; /* Number of entries used in ri */ + int sizeRI; /* Number of entries available in ri */ + int i; /* Index into rects */ + register int j; /* Index into ri */ + register XieRegionInfo *rit; /* &ri[j] */ + register XieRegionPtr reg; /* ri[j].reg */ + register XieBoxPtr box; /* Current box in rects */ + register XieBoxPtr riBox; /* Last box in ri[j].reg */ + register XieRegionPtr hreg; /* ri[j_half].reg */ + + *pOverlap = FALSE; + if (!badreg->data) + { + good(badreg); + return TRUE; + } + numRects = badreg->data->numRects; + if (!numRects) + { + good(badreg); + return TRUE; + } + if (badreg->extents.x1 < badreg->extents.x2) + { + if ((numRects) == 1) + { + xfreeData(badreg); + badreg->data = (XieRegDataPtr) NULL; + } + else + { + DOWNSIZE(badreg, numRects); + } + good(badreg); + return TRUE; + } + + /* Step 1: Sort the rects array into ascending (y1, x1) order */ + QuickSortRects(XIEREGION_BOXPTR(badreg), numRects); + + /* Step 2: Scatter the sorted array into the minimum number of regions */ + + /* Set up the first region to be the first rectangle in badreg */ + /* Note that step 2 code will never overflow the ri[0].reg rects array */ + Must_have_memory = TRUE; /* XXX */ + ri = (XieRegionInfo *) XieMalloc(4 * sizeof(XieRegionInfo)); + Must_have_memory = FALSE; /* XXX */ + sizeRI = 4; + numRI = 1; + ri[0].prevBand = 0; + ri[0].curBand = 0; + ri[0].reg = *badreg; + box = XIEREGION_BOXPTR(&ri[0].reg); + ri[0].reg.extents = *box; + ri[0].reg.data->numRects = 1; + + /* Now scatter rectangles into the minimum set of valid regions. If the + next rectangle to be added to a region would force an existing rectangle + in the region to be split up in order to maintain y-x banding, just + forget it. Try the next region. If it doesn't fit cleanly into any + region, make a new one. */ + + for (i = numRects; --i > 0;) + { + box++; + /* Look for a region to append box to */ + for (j = numRI, rit = ri; --j >= 0; rit++) + { + reg = &rit->reg; + riBox = XIEREGION_END(reg); + + if (box->y1 == riBox->y1 && box->y2 == riBox->y2) + { + /* box is in same band as riBox. Merge or append it */ + if (box->x1 <= riBox->x2) + { + /* Merge it with riBox */ + if (box->x1 < riBox->x2) *pOverlap = TRUE; + if (box->x2 > riBox->x2) riBox->x2 = box->x2; + } + else + { + RECTALLOC(reg, 1); + *XIEREGION_TOP(reg) = *box; + reg->data->numRects++; + } + goto NextRect; /* So sue me */ + } + else if (box->y1 >= riBox->y2) + { + /* Put box into new band */ + if (reg->extents.x2 < riBox->x2) reg->extents.x2 = riBox->x2; + if (reg->extents.x1 > box->x1) reg->extents.x1 = box->x1; + Coalesce(reg, rit->prevBand, rit->curBand); + rit->curBand = reg->data->numRects; + RECTALLOC(reg, 1); + *XIEREGION_TOP(reg) = *box; + reg->data->numRects++; + goto NextRect; + } + /* Well, this region was inappropriate. Try the next one. */ + } /* for j */ + + /* Uh-oh. No regions were appropriate. Create a new one. */ + if (sizeRI == numRI) + { + /* Oops, allocate space for new region information */ + sizeRI <<= 1; + Must_have_memory = TRUE; /* XXX */ + ri = (XieRegionInfo *) XieRealloc(ri, sizeRI * sizeof(XieRegionInfo)); + Must_have_memory = FALSE; /* XXX */ + rit = &ri[numRI]; + } + numRI++; + rit->prevBand = 0; + rit->curBand = 0; + rit->reg.extents = *box; + rit->reg.data = (XieRegDataPtr)NULL; + miXieRectAlloc(&rit->reg, (i+numRI) / numRI); /* MUST force allocation */ +NextRect: ; + } /* for i */ + + /* Make a final pass over each region in order to Coalesce and set + extents.x2 and extents.y2 */ + + for (j = numRI, rit = ri; --j >= 0; rit++) + { + reg = &rit->reg; + riBox = XIEREGION_END(reg); + reg->extents.y2 = riBox->y2; + if (reg->extents.x2 < riBox->x2) reg->extents.x2 = riBox->x2; + Coalesce(reg, rit->prevBand, rit->curBand); + if (reg->data->numRects == 1) /* keep unions happy below */ + { + xfreeData(reg); + reg->data = (XieRegDataPtr)NULL; + } + } + + /* Step 3: Union all regions into a single region */ + while (numRI > 1) + { + int half = numRI/2; + for (j = numRI & 1; j < (half + (numRI & 1)); j++) + { + reg = &ri[j].reg; + hreg = &ri[j+half].reg; + miXieRegionOp(reg, reg, hreg, miXieUnionO, TRUE, TRUE, pOverlap); + if (hreg->extents.x1 < reg->extents.x1) + reg->extents.x1 = hreg->extents.x1; + if (hreg->extents.y1 < reg->extents.y1) + reg->extents.y1 = hreg->extents.y1; + if (hreg->extents.x2 > reg->extents.x2) + reg->extents.x2 = hreg->extents.x2; + if (hreg->extents.y2 > reg->extents.y2) + reg->extents.y2 = hreg->extents.y2; + xfreeData(hreg); + } + numRI -= half; + } + *badreg = ri[0].reg; + XieFree(ri); + good(badreg); + return TRUE; +} diff --git a/xie/xc/programs/Xserver/XIE/mixie/import/miroi.c b/xie/xc/programs/Xserver/XIE/mixie/import/miroi.c new file mode 100644 index 0000000..1efa978 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/import/miroi.c @@ -0,0 +1,233 @@ +/* $XConsortium: miroi.c,v 1.5 94/04/17 20:34:56 rws Exp $ */ +/**** module miroi.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + miroi.c -- DDXIE prototype import client roi element + + Robert NC Shelley -- AGE Logic, Inc. April, 1993 + +*****************************************************************************/ + +#define _XIEC_MIROI +#define _XIEC_IROI + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeIROI(); + +/* + * routines used internal to this module + */ +static int CreateIROI(); +static int InitializeIROI(); +static int ActivateIROI(); +static int ResetIROI(); +static int DestroyIROI(); + +/* + * DDXIE ImportROI entry points + */ +static ddElemVecRec miROIVec = { + CreateIROI, + InitializeIROI, + ActivateIROI, + (xieIntProc)NULL, + ResetIROI, + DestroyIROI + }; + +/* + * Private stuff. peTex extension for the ImportClientROI element. + */ +typedef struct _miroidef { + stripPtr next_strip; +} +miROIDefRec, *miROIDefPtr; + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeIROI(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* for now just stash our entry point vector in the peDef */ + ped->ddVec = miROIVec; + return TRUE ; +} /* end miAnalyzeIROI */ + + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateIROI(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the roi element definition */ + return MakePETex(flo,ped,sizeof(miROIDefRec),NO_SYNC,NO_SYNC); +} /* end CreateIROI */ + + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeIROI(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + roiPtr roi = ((iROIDefPtr)ped->elemPvt)->roi; + miROIDefPtr pvt = (miROIDefPtr)ped->peTex->private; + + pvt->next_strip = roi->strips.flink; + + return InitEmitter(flo,ped,NO_DATAMAP,NO_INPLACE); +} /* end InitializeIROI */ + + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateIROI(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + miROIDefPtr pvt = (miROIDefPtr)pet->private; + bandPtr bnd = &pet->emitter[0]; + + /* pass a clone of the current/only strip to our recipients */ + + if(!PassStrip(flo,pet,bnd,pvt->next_strip)) + return FALSE; /* alloc error */ + + return TRUE; +} /* end ActivateIROI */ + + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetIROI(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ResetEmitter(ped); + return TRUE; +} /* end ResetIROI */ + + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyIROI(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.activate = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + return TRUE; +} /* end DestroyIROI */ + +/* end module miroi.c */ + diff --git a/xie/xc/programs/Xserver/XIE/mixie/import/miuncomp.c b/xie/xc/programs/Xserver/XIE/mixie/import/miuncomp.c new file mode 100644 index 0000000..90aad6c --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/import/miuncomp.c @@ -0,0 +1,943 @@ +/* $XConsortium: miuncomp.c,v 1.4 94/04/17 20:34:57 dpw Exp $ */ +/**** module miuncomp.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + miuncomp.c -- DDXIE routines for importing uncompressed data + + Dean Verheiden -- AGE Logic, Inc. September 1993 + +*****************************************************************************/ + +#define _XIEC_MIUNCOMP + +/* + * Include files + */ +#include +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include + +/***********************************************************************/ +/****************** Aligned data conversion routines *******************/ +/***********************************************************************/ + +/* Single band action routines */ + +void CPreverse_bits(src,dst,count,leftpad,depth,stride) +BytePixel *src, *dst; +CARD32 count; +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ +int i; + count = count + 7 >> 3;/* Pack down to bits */ + + src += leftpad>>3; + for (i = 0; i < count; i++) *dst++ = _ByteReverseTable[*src++]; +} + +void CPpass_bits(src,dst,count,leftpad,depth,stride) +BytePixel *src, *dst; +CARD32 count; +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ + src += leftpad >> 3; + memcpy((char *)dst,(char *)src, (int)count + 7 >> 3); +} + +void CPextractstreambits(src,dst,count,leftpad,depth,stride) +BytePixel *src, *dst; +CARD32 count; +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ +CARD32 i,j; + + bzero(dst,count + 7 >> 3); + + for (i = 0, j = leftpad; i < count; i++, j += stride) { + if (LOGBYTE_tstbit(src,j) != 0) { + LOGBYTE_setbit(dst,i); + } + } +} + +void CPextractswappedstreambits(src,dst,count,leftpad,depth,stride) +BytePixel *src, *dst; +CARD32 count; +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ +CARD32 i,j,s; + + bzero(dst,count + 7 >> 3); + + for (i = 0, j = leftpad; i < count; i++, j += stride) { + s = j ^ 7; /* Larry swap */ + if (LOGBYTE_tstbit(src,s) != 0) { + LOGBYTE_setbit(dst,i); + } + } +} + + +void CPpass_bytes(src,dst,count,leftpad,depth,stride) +BytePixel *src, *dst; +CARD32 count; +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ + src += leftpad >> 3; + if (stride == 8) + memcpy((char *)dst, (char *)src, (int)count); + else { + int i; + CARD32 Bstride = stride >> 3; + for (i = 0; i < count; i++, src += Bstride) + *dst++ = *src; + } +} + +void CPswap_pairs(src,dst,count,leftpad,depth,stride) +PairPixel *src,*dst; +CARD32 count; +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ +int i; + src += leftpad >> 4; + if (stride == 16) { + for (i = 0; i < count; i++) { + cpswaps(src[i],dst[i]); + } + } else { + int j; + CARD32 Bstride = stride >> 4; + for (i = 0, j = 0; i < count; i++, j += Bstride) { + cpswaps(src[j],dst[i]); + } + } +} + +void CPpass_pairs(src,dst,count,leftpad,depth,stride) +PairPixel *src, *dst; +CARD32 count; +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ + src += leftpad >> 4; + if (stride == 16) + memcpy((char *)dst, (char *)src, (int)count << 1); + else { + int i,j; + CARD32 Bstride = stride >> 4; + for (i = 0, j = 0; i < count; i++, j += Bstride) + dst[i] = src[j]; + } +} + +void CPswap_quads(src,dst,count,leftpad,depth,stride) +QuadPixel *src, *dst; +CARD32 count; +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ +int i; + src += leftpad >> 5; + if (stride == 32) { + for (i = 0; i < count; i++) { + cpswapl(src[i],dst[i]); + } + } else { + int j; + CARD32 Bstride = stride >> 5; + for (i = 0, j = 0; i < count; i++, j += Bstride) { + cpswapl(src[j],dst[i]); + } + } +} + +void CPpass_quads(src,dst,count,leftpad,depth,stride) +QuadPixel *src, *dst; +CARD32 count; +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ + src += leftpad >> 5; + if (stride == 32) + memcpy((char *)dst, (char *)src, (int)count << 2); + else { + int i,j; + CARD32 Bstride = stride >> 5; + for (i = 0, j = 0; i < count; i++, j += Bstride) + dst[i] = src[j]; + } +} + +#if XIE_FULL +/* Triple Band Byte by Pixel Action routines */ + +/* Stream bits to bits */ +void Sbtob(src,idst,count,pvt) +BytePixel *src, *idst; +CARD32 count; +miUncompPtr pvt; +{ +CARD32 Bstride = pvt->Bstride; +CARD8 mask = pvt->mask; +LogInt *dst = (LogInt *)idst; +int i; + + bzero(dst,count+7>>3); /* zero out the output, only set ones */ + src += pvt->srcoffset; + for (i = 0; i < count; i++, src += Bstride) + if ((*src & mask) != 0) + LOG_setbit(dst,i); +} + +/* Stream in nibbles to BytePixels */ +void SbtoB(src,dst,count,pvt) +BytePixel *src, *dst; +CARD32 count; +miUncompPtr pvt; +{ +CARD32 Bstride = pvt->Bstride; +CARD8 mask = pvt->mask; +CARD8 shift = pvt->shift; +int i; + + src += pvt->srcoffset; + for (i = 0; i < count; i++, src += Bstride) + *dst++ = (*src & mask) >> shift; +} + +/* Stream to BytePixel */ +void StoB(src,dst,count,pvt) +BytePixel *src, *dst; +CARD32 count; +miUncompPtr pvt; +{ +CARD32 Bstride = pvt->Bstride; +int i; + + src += pvt->srcoffset; + for (i = 0; i < count; i++, src += Bstride) + *dst++ = *src; +} + +/* Stream to PairPixel (unswapped) */ +void StoP(isrc,dst,count,pvt) +PairPixel *isrc, *dst; +CARD32 count; +miUncompPtr pvt; +{ +CARD32 Bstride = pvt->Bstride; +CARD8 *src = ((CARD8 *)isrc) + pvt->srcoffset; +int i; + for (i = 0; i < count; i++, src += Bstride) + *dst++ = *(PairPixel *)src; +} + +/* Stream to PairPixel (swapped) */ +void StosP(isrc,dst,count,pvt) +PairPixel *isrc, *dst; +CARD32 count; +miUncompPtr pvt; +{ +CARD32 Bstride = pvt->Bstride; +CARD8 *src = ((CARD8 *)isrc) + pvt->srcoffset; +int i; + for (i = 0; i < count; i++, src += Bstride) { + PairPixel sval = *(PairPixel *)src; + *dst++ = (sval >> 8) | (sval << 8); + } +} + +#endif /* XIE_FULL */ + + +/***********************************************************************/ +/***************** Unaligned data conversion routines ******************/ +/***********************************************************************/ + +/* Convert a single plane of unaligned bytes to bytes */ +/* Pixel Order = LSB, Fill Order = LSB */ +void LLUBtoB(src, dst, numcmp, leftpad, depth, stride) +CARD8 *src; /* source byte stream */ +BytePixel *dst; /* destination line */ +CARD32 numcmp; /* number of pixels on to be converted */ +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ +CARD32 p, longbits; +CARD8 bits, wval = 16 - depth, wval2 = 8 - depth; + + if (leftpad > 7) { + src += leftpad >> 3; + longbits = leftpad & 7; + } else + longbits = leftpad; + + for (p = 0; p < numcmp; p++) { + bits = longbits; + if (bits + depth > 8) + *dst++ = *src >> bits | (CARD8)(*(src+1) << wval - bits) >> wval2; + else { + *dst++ = (CARD8)(*src << wval2 - bits) >> wval2; + } + + if ((longbits += stride) > 7) { + src += longbits >> 3; + longbits &= 7; + } + } +} + +/* Convert a single plane of unaligned bytes to bytes */ +/* Pixel Order = LSB, Fill Order = MSB */ +void LMUBtoB(src, dst, numcmp, leftpad, depth, stride) +CARD8 *src; /* source byte stream */ +BytePixel *dst; /* destination byte stream */ +CARD32 numcmp; /* number of pixels on to be converted */ +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ +CARD32 p, longbits; +CARD8 bits, wval = 16 - depth, wval2 = 8 - depth; + + if (leftpad > 7) { + src += leftpad >> 3; + longbits = leftpad & 7; + } else + longbits = leftpad; + + for (p = 0; p < numcmp; p++) { + bits = longbits; + if (bits + depth > 8) + *dst++ = (CARD8)(*src << bits) >> bits | + (CARD8)(*(src + 1) >> wval - bits) << 8 - bits; + else + *dst++ = (CARD8)(*src << bits) >> wval2; + + if ((longbits += stride) > 7) { + src += longbits >> 3; + longbits &= 7; + } + } +} + +/* Convert a single plane of unaligned bytes to bytes */ +/* Pixel Order = MSB, Fill Order = LSB */ +void MLUBtoB(src, dst, numcmp, leftpad, depth, stride) +CARD8 *src; /* source byte stream */ +BytePixel *dst; /* destination byte stream */ +CARD32 numcmp; /* number of pixels on to be converted */ +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ +CARD32 p, longbits; +CARD8 bits, wval = 16 - depth, wval2 = 8 - depth; + + if (leftpad > 7) { + src += leftpad >> 3; + longbits = leftpad & 7; + } else + longbits = leftpad; + + for (p = 0; p < numcmp; p++) { + bits = longbits; + if (bits + depth > 8) + *dst++ = (CARD8)(*src >> bits) << depth + bits - 8 | + (CARD8)(*(src + 1) << wval - bits) >> wval - bits; + else + *dst++ = (CARD8)(*src << wval2 - bits) >> wval2; + + if ((longbits += stride) > 7) { + src += longbits >> 3; + longbits &= 7; + } + } +} + +/* Convert a single plane of unaligned bytes to bytes */ +/* Pixel Order = MSB, Fill Order = MSB */ +void MMUBtoB(src, dst, numcmp, leftpad, depth, stride) +CARD8 *src; /* source byte stream */ +BytePixel *dst; /* destination byte stream */ +CARD32 numcmp; /* number of pixels on to be converted */ +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ +CARD32 p, longbits; +CARD8 bits, wval = 16 - depth, wval2 = 8 - depth; + + if (leftpad > 7) { + src += leftpad >> 3; + longbits = leftpad & 7; + } else + longbits = leftpad; + + for (p = 0; p < numcmp; p++) { + bits = longbits; + if (bits + depth > 8) + *dst++ = (CARD8)(*src << bits) >> wval2 | + (CARD8)*(src + 1) >> wval - bits; + else + *dst++ = (CARD8)(*src << bits) >> wval2; + + if ((longbits += stride) > 7) { + src += longbits >> 3; + longbits &= 7; + } + } +} + +/* Convert a single plane of unaligned pair pixels to pair pixels */ +/* Pixel Order = LSB, Fill Order = LSB */ +void LLUPtoP(src, dst, numcmp, leftpad, depth, stride) +CARD8 *src; /* source byte stream */ +PairPixel *dst; /* destination line */ +CARD32 numcmp; /* number of pixels on to be converted */ +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ +CARD32 p, longbits; +CARD16 bits, wval1 = 32 - depth, wval2 = 24 - depth, wval3 = 16 - depth; + + if (leftpad > 7) { + src += leftpad >> 3; + longbits = leftpad & 7; + } else + longbits = leftpad; + + for (p = 0; p < numcmp; p++) { + bits = longbits; + if (bits + depth > 16) + *dst++ = (CARD16)*src >> bits | + (CARD16)*(src + 1) << 8 - bits | + (CARD16)((CARD16)*(src + 2) << wval1 - bits) >> wval3; + else + *dst++ = (CARD16)*src >> bits | + (CARD16)((CARD16)*(src + 1) << wval2 - bits) >> wval3; + + longbits += stride; + src += longbits >> 3; + longbits &= 7; + } +} + +/* Convert a single plane of unaligned bytes to bytes */ +/* Pixel Order = LSB, Fill Order = MSB */ +void LMUPtoP(src, dst, numcmp, leftpad, depth, stride) +CARD8 *src; /* source byte stream */ +PairPixel *dst; /* destination byte stream */ +CARD32 numcmp; /* number of pixels on to be converted */ +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ +CARD32 p, longbits; +CARD16 bits, wval2 = 24 - depth, wval3 = 16 - depth; + + if (leftpad > 7) { + src += leftpad >> 3; + longbits = leftpad & 7; + } else + longbits = leftpad; + + for (p = 0; p < numcmp; p++) { + bits = longbits; + if (bits + depth > 16) + *dst++ = (CARD16)((CARD16)*src << 8 + bits) >> 8 + bits | + (CARD16)*(src + 1) << 8 - bits | + (CARD16)((CARD16)*(src + 2) >> wval2 - bits) << 16 - bits; + else + *dst++ = (CARD16)((CARD16)*src << 8 + bits) >> 8 + bits | + (CARD16)((CARD16)*(src + 1) >> wval3 - bits) << 8 - bits; + + longbits += stride; + src += longbits >> 3; + longbits &= 7; + } +} + + +/* Convert a single plane of unaligned bytes to bytes */ +/* Pixel Order = MSB, Fill Order = LSB */ +void MLUPtoP(src, dst, numcmp, leftpad, depth, stride) +CARD8 *src; /* source byte stream */ +PairPixel *dst; /* destination byte stream */ +CARD32 numcmp; /* number of pixels on to be converted */ +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ +CARD32 p, longbits; +CARD16 bits, wval1 = 32 - depth, wval2 = 24 - depth; + + if (leftpad > 7) { + src += leftpad >> 3; + longbits = leftpad & 7; + } else + longbits = leftpad; + + for (p = 0; p < numcmp; p++) { + bits = longbits; + if (bits + depth > 16) + *dst++ = (CARD16)((CARD16)*src >> bits) << depth + bits - 8 | + (CARD16)*(src + 1) << depth + bits - 16 | + (CARD16)((CARD16)*(src + 2) << wval1 - bits) >> + wval1 - bits; + else + *dst++ = (CARD16)((CARD16)*src >> bits) << depth + bits - 8 | + (CARD16)((CARD16)*(src + 1) << wval2 - bits) + >> wval2 - bits; + + longbits += stride; + src += longbits >> 3; + longbits &= 7; + } +} + +/* Convert a single plane of unaligned bytes to bytes */ +/* Pixel Order = MSB, Fill Order = MSB */ +void MMUPtoP(src, dst, numcmp, leftpad, depth, stride) +CARD8 *src; /* source byte stream */ +PairPixel *dst; /* destination byte stream */ +CARD32 numcmp; /* number of pixels on to be converted */ +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ +CARD32 p, longbits; +CARD16 bits, wval2 = 24 - depth, wval3 = 16 - depth; + + if (leftpad > 7) { + src += leftpad >> 3; + longbits = leftpad & 7; + } else + longbits = leftpad; + + for (p = 0; p < numcmp; p++) { + bits = longbits; + if (bits + depth > 16) + *dst++ = (CARD16)((CARD16)*src << 8 + bits) >> wval2 - bits | + (CARD16)*(src + 1) << depth + bits - 16 | + (CARD16)*(src + 2) >> wval2 - bits; + else + *dst++ = (CARD16)((CARD16)*src << 8 + bits) >> wval3 | + (CARD16)*(src + 1) >> wval3 - bits; + + longbits += stride; + src += longbits >> 3; + longbits &= 7; + } +} + + +/* Convert a single plane of unaligned quad pixels to quad pixels */ +/* Pixel Order = LSB, Fill Order = LSB */ +void LLUQtoQ(src, dst, numcmp, leftpad, depth, stride) +CARD8 *src; /* source byte stream */ +QuadPixel *dst; /* destination line */ +CARD32 numcmp; /* number of pixels on to be converted */ +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ +CARD32 p, bits, wval1 = 56 - depth, wval2 = 48 - depth, wval3 = 32 - depth; + + /* Note: Maximum depth is 24 bits */ + + if (leftpad > 7) { + src += leftpad >> 3; + bits = leftpad & 7; + } else + bits = leftpad; + + for (p = 0; p < numcmp; p++) { + if (bits + depth > 24) + *dst++ = (CARD32)*src >> bits | + (CARD32)*(src + 1) << 8 - bits | + (CARD32)*(src + 2) << 16 - bits | + ((CARD32)*(src + 3) << wval1 - bits) >> wval3; + else + *dst++ = (CARD32)*src >> bits | + (CARD32)*(src + 1) << 8 - bits | + ((CARD32)*(src + 2) << wval2 - bits) >> wval3; + + bits += stride; + src += bits >> 3; + bits &= 7; + } +} + +/* Convert a single plane of unaligned quad pixels to quad pixels */ +/* Pixel Order = LSB, Fill Order = MSB */ +void LMUQtoQ(src, dst, numcmp, leftpad, depth, stride) +CARD8 *src; /* source byte stream */ +QuadPixel *dst; /* destination line */ +CARD32 numcmp; /* number of pixels on to be converted */ +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ +CARD32 p, bits, wval1 = 32 - depth, wval2 = 24 - depth; + + /* Note: Maximum depth is 24 bits */ + + if (leftpad > 7) { + src += leftpad >> 3; + bits = leftpad & 7; + } else + bits = leftpad; + + for (p = 0; p < numcmp; p++) { + if (bits + depth > 24) + *dst++ = ((CARD32)*src << 24 + bits) >> 24 + bits | + (CARD32)*(src + 1) << 8 - bits | + (CARD32)*(src + 2) << 16 - bits | + ((CARD32)*(src + 3) >> wval1 - bits) << 24 - bits; + else + *dst++ = ((CARD32)*src << 24 + bits) >> 24 + bits | + (CARD32)*(src + 1) << 8 - bits | + ((CARD32)*(src + 2) >> wval2 - bits) << 16 - bits; + + bits += stride; + src += bits >> 3; + bits &= 7; + } +} + +/* Convert a single plane of unaligned quad pixels to quad pixels */ +/* Pixel Order = MSB, Fill Order = LSB */ +void MLUQtoQ(src, dst, numcmp, leftpad, depth, stride) +CARD8 *src; /* source byte stream */ +QuadPixel *dst; /* destination line */ +CARD32 numcmp; /* number of pixels on to be converted */ +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ +CARD32 p, bits, wval1 = 56 - depth, wval2 = 48 - depth; + + /* Note: Maximum depth is 24 bits */ + + if (leftpad > 7) { + src += leftpad >> 3; + bits = leftpad & 7; + } else + bits = leftpad; + + for (p = 0; p < numcmp; p++) { + if (bits + depth > 24) + *dst++ = ((CARD32)*src >> bits) << depth + bits - 8 | + (CARD32)*(src + 1) << depth + bits - 16 | + (CARD32)*(src + 2) << depth + bits - 24 | + ((CARD32)*(src + 3) << wval1 - bits) >> wval1 - bits; + else + *dst++ = ((CARD32)*src >> bits) << depth + bits - 8 | + (CARD32)*(src + 1) << depth + bits - 16 | + ((CARD32)*(src + 2) << wval2 - bits) >> wval2 - bits; + + bits += stride; + src += bits >> 3; + bits &= 7; + } +} + +/* Convert a single plane of unaligned quad pixels to quad pixels */ +/* Pixel Order = MSB, Fill Order = MSB */ +void MMUQtoQ(src, dst, numcmp, leftpad, depth, stride) +CARD8 *src; /* source byte stream */ +QuadPixel *dst; /* destination line */ +CARD32 numcmp; /* number of pixels on to be converted */ +CARD32 leftpad; /* bit offset to start of first pixel */ +CARD32 depth; /* number of bits per pixel */ +CARD32 stride; /* number of bits needed for this band */ +{ +CARD32 p, bits, wval1 = 56 - depth, wval2 = 32 - depth; + + /* Note: Maximum depth is 24 bits */ + + if (leftpad > 7) { + src += leftpad >> 3; + bits = leftpad & 7; + } else + bits = leftpad; + + for (p = 0; p < numcmp; p++) { + if (bits + depth > 24) + *dst++ = ((CARD32)*src << 24 + bits) >> wval2 | + (CARD32)*(src + 1) << depth + bits - 16 | + (CARD32)*(src + 2) << depth + bits - 24 | + (CARD32)*(src + 3) >> wval2 - bits; + else + *dst++ = ((CARD32)*src << 24 + bits) >> wval2 | + (CARD32)*(src + 1) << depth + bits - 16 | + (CARD32)*(src + 2) >> wval1 - bits; + + bits += stride; + src += bits >> 3; + bits &= 7; + } +} + +#if XIE_FULL +/* Triple band by pixel single unaligned pixel extraction routines */ + +#define getLLByte(src,bits,depth) \ + (BytePixel)((bits + depth > 8) ? \ + (*src >> bits | (CARD8)(*(src + 1) \ + << 16 - depth - bits) >> 8 - depth) : \ + ((CARD8)(*src << 8 - depth - bits) >> 8 - depth)) + +#define getLMByte(src,bits,depth) \ + (BytePixel)((bits + depth > 8) ? \ + ((CARD8)(*src << bits) >> bits | \ + (CARD8)(*(src + 1) >> 16 - depth - bits) << 8 - bits) : \ + ((CARD8)(*src << bits) >> 8 - depth)) + +#define getMLByte(src,bits,depth) \ + (BytePixel)((bits + depth > 8) ? \ + ((CARD8)(*src >> bits) << depth + bits - 8 | \ + (CARD8)(*(src + 1) << 16 - depth - bits) \ + >> 16 - depth - bits) : \ + ((CARD8)(*src << 8 - depth - bits) >> 8 - depth)) + +#define getMMByte(src,bits,depth) \ + (BytePixel)((bits + depth > 8) ? \ + ((CARD8)(*src << bits) >> 8 - depth | \ + (CARD8)*(src + 1) >> 16 - depth - bits) : \ + ((CARD8)(*src << bits) >> 8 - depth)) + +#define getLLPair(src,bits,depth) \ + (PairPixel)((bits + depth > 16) ? \ + ((CARD16)*src >> bits | \ + (CARD16)*(src + 1) << 8 - bits | \ + (CARD16)((CARD16)*(src + 2) << 32 - depth - bits) \ + >> 16 - depth) : \ + ((CARD16)*src >> bits | \ + (CARD16)((CARD16)*(src + 1) \ + << 24 - depth - bits) >> 16 - depth)) + +#define getLMPair(src,bits,depth) \ + (PairPixel)((bits + depth > 16) ? \ + ((CARD16)((CARD16)*src << 8 + bits) >> 8 + bits | \ + (CARD16)*(src + 1) << 8 - bits | \ + (CARD16)((CARD16)*(src + 2) >> 24 - depth - bits) \ + << 16 - bits) : \ + ((CARD16)((CARD16)*src << 8 + bits) >> 8 + bits | \ + (CARD16)((CARD16)*(src + 1) >> 16 - depth - bits) \ + << 8 - bits)) + +#define getMLPair(src,bits,depth) \ + (PairPixel)((bits + depth > 16) ? \ + ((CARD16)((CARD16)*src >> bits) << depth + bits - 8 | \ + (CARD16)*(src + 1) << depth + bits - 16 | \ + (CARD16)((CARD16)*(src + 2) << \ + 32 - depth - bits) >> 32 - depth - bits) : \ + ((CARD16)((CARD16)*src >> bits) << depth + bits - 8 | \ + (CARD16)((CARD16)*(src + 1) << 24 - depth - bits) \ + >> 24 - depth - bits)) + +#define getMMPair(src,bits,depth) \ + (PairPixel)((bits + depth > 16) ? \ + ((CARD16)((CARD16)*src << 8 + bits) >> 16 - depth | \ + (CARD16)*(src + 1) << depth + bits - 16 | \ + (CARD16)*(src + 2) >> 24 - depth - bits) : \ + ((CARD16)((CARD16)*src << 8 + bits) >> 16 - depth | \ + (CARD16)*(src + 1) >> 16 - depth - bits)) + + +/* Convert a triple band by pixel line to three lines of BytePixels */ +#define ExtractThree(fname,dtype0,dtype1,dtype2,extract0,extract1,extract2) \ +void fname(src0, dst0, dst1, dst2, numcmp, leftpad, depth0, depth1, \ + depth2, stride) \ +CARD8 *src0; /* source byte stream */ \ +dtype0 *dst0; /* destination line */ \ +dtype1 *dst1; /* destination line */ \ +dtype2 *dst2; /* destination line */ \ +CARD32 numcmp; /* number of triple pixels on to be converted*/ \ +CARD32 leftpad; /* bit offset to start of first pixel */ \ +CARD32 depth0; /* number of bits per pixel */ \ +CARD32 depth1; /* number of bits per pixel */ \ +CARD32 depth2; /* number of bits per pixel */ \ +CARD32 stride; /* number of bits between triples */ \ +{ \ +CARD32 p, bits; \ + if (leftpad > 7) { \ + src0 += leftpad >> 3; \ + bits = leftpad & 7; \ + } else \ + bits = leftpad; \ + for (p = 0; p < numcmp; p++) { \ + CARD32 offset1 = bits + depth0 & 7; \ + CARD32 offset2 = bits + depth0 + depth1 & 7; \ + CARD8 *src1 = src0 + (bits + depth0 >> 3); \ + CARD8 *src2 = src0 + (bits + depth0 + depth1 >> 3); \ + *dst0++ = extract0(src0, bits, depth0); \ + *dst1++ = extract1(src1, offset1, depth1); \ + *dst2++ = extract2(src2, offset2, depth2); \ + if ((bits += stride) > 7) { \ + src0 += bits >> 3; \ + bits &= 7; \ + } \ + } \ +} + +ExtractThree(LLTBtoBBB,BytePixel,BytePixel,BytePixel,getLLByte,getLLByte,getLLByte) +ExtractThree(LLTBtoBBP,BytePixel,BytePixel,PairPixel,getLLByte,getLLByte,getLLPair) +ExtractThree(LLTBtoBPB,BytePixel,PairPixel,BytePixel,getLLByte,getLLPair,getLLByte) +ExtractThree(LLTBtoBPP,BytePixel,PairPixel,PairPixel,getLLByte,getLLPair,getLLPair) + +ExtractThree(LLTBtoPBB,PairPixel,BytePixel,BytePixel,getLLPair,getLLByte,getLLByte) +ExtractThree(LLTBtoPBP,PairPixel,BytePixel,PairPixel,getLLPair,getLLByte,getLLPair) +ExtractThree(LLTBtoPPB,PairPixel,PairPixel,BytePixel,getLLPair,getLLPair,getLLByte) +ExtractThree(LLTBtoPPP,PairPixel,PairPixel,PairPixel,getLLPair,getLLPair,getLLPair) + +ExtractThree(LMTBtoBBB,BytePixel,BytePixel,BytePixel,getLMByte,getLMByte,getLMByte) +ExtractThree(LMTBtoBBP,BytePixel,BytePixel,PairPixel,getLMByte,getLMByte,getLMPair) +ExtractThree(LMTBtoBPB,BytePixel,PairPixel,BytePixel,getLMByte,getLMPair,getLMByte) +ExtractThree(LMTBtoBPP,BytePixel,PairPixel,PairPixel,getLMByte,getLMPair,getLMPair) + +ExtractThree(LMTBtoPBB,PairPixel,BytePixel,BytePixel,getLMPair,getLMByte,getLMByte) +ExtractThree(LMTBtoPBP,PairPixel,BytePixel,PairPixel,getLMPair,getLMByte,getLMPair) +ExtractThree(LMTBtoPPB,PairPixel,PairPixel,BytePixel,getLMPair,getLMPair,getLMByte) +ExtractThree(LMTBtoPPP,PairPixel,PairPixel,PairPixel,getLMPair,getLMPair,getLMPair) + +ExtractThree(MLTBtoBBB,BytePixel,BytePixel,BytePixel,getMLByte,getMLByte,getMLByte) +ExtractThree(MLTBtoBBP,BytePixel,BytePixel,PairPixel,getMLByte,getMLByte,getMLPair) +ExtractThree(MLTBtoBPB,BytePixel,PairPixel,BytePixel,getMLByte,getMLPair,getMLByte) +ExtractThree(MLTBtoBPP,BytePixel,PairPixel,PairPixel,getMLByte,getMLPair,getMLPair) + +ExtractThree(MLTBtoPBB,PairPixel,BytePixel,BytePixel,getMLPair,getMLByte,getMLByte) +ExtractThree(MLTBtoPBP,PairPixel,BytePixel,PairPixel,getMLPair,getMLByte,getMLPair) +ExtractThree(MLTBtoPPB,PairPixel,PairPixel,BytePixel,getMLPair,getMLPair,getMLByte) +ExtractThree(MLTBtoPPP,PairPixel,PairPixel,PairPixel,getMLPair,getMLPair,getMLPair) + +ExtractThree(MMTBtoBBB,BytePixel,BytePixel,BytePixel,getMMByte,getMMByte,getMMByte) +ExtractThree(MMTBtoBBP,BytePixel,BytePixel,PairPixel,getMMByte,getMMByte,getMMPair) +ExtractThree(MMTBtoBPB,BytePixel,PairPixel,BytePixel,getMMByte,getMMPair,getMMByte) +ExtractThree(MMTBtoBPP,BytePixel,PairPixel,PairPixel,getMMByte,getMMPair,getMMPair) + +ExtractThree(MMTBtoPBB,PairPixel,BytePixel,BytePixel,getMMPair,getMMByte,getMMByte) +ExtractThree(MMTBtoPBP,PairPixel,BytePixel,PairPixel,getMMPair,getMMByte,getMMPair) +ExtractThree(MMTBtoPPB,PairPixel,PairPixel,BytePixel,getMMPair,getMMPair,getMMByte) +ExtractThree(MMTBtoPPP,PairPixel,PairPixel,PairPixel,getMMPair,getMMPair,getMMPair) + +void (*ExtractTripleFuncs[2][2][2][2][2])() = +{ { { { { LLTBtoBBB, LLTBtoBBP }, { LLTBtoBPB, LLTBtoBPP } }, + { { LLTBtoPBB, LLTBtoPBP }, { LLTBtoPPB, LLTBtoPPP } } }, + { { { LMTBtoBBB, LMTBtoBBP }, { LMTBtoBPB, LMTBtoBPP } }, + { { LMTBtoPBB, LMTBtoPBP }, { LMTBtoPPB, LMTBtoPPP } } } }, + { { { { MLTBtoBBB, MLTBtoBBP }, { MLTBtoBPB, MLTBtoBPP } }, + { { MLTBtoPBB, MLTBtoPBP }, { MLTBtoPPB, MLTBtoPPP } } }, + { { { MMTBtoBBB, MMTBtoBBP }, { MMTBtoBPB, MMTBtoBPP } }, + { { MMTBtoPBB, MMTBtoPBP }, { MMTBtoPPB, MMTBtoPPP } } } } }; +#endif /* XIE_FULL */ + +/* end module miuncomp.c */ + + diff --git a/xie/xc/programs/Xserver/XIE/mixie/include/domain.h b/xie/xc/programs/Xserver/XIE/mixie/include/domain.h new file mode 100644 index 0000000..ad6f8b7 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/include/domain.h @@ -0,0 +1,116 @@ +/* $XConsortium: domain.h,v 1.4 94/04/17 20:34:58 rws Exp $ */ +/**** module domain.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + domain.h -- DDXIE MI Process Domain definitions + + Dean Verheiden -- AGE Logic, Inc. August 1993 + +*****************************************************************************/ + + +#ifndef _XIEH_DOMAIN +#define _XIEH_DOMAIN + +#if !defined(_XIEC_DOMAIN) + +#define SyncDomain (*pet->roiinit) +#define GetRun (*pet->roiget) + +extern Bool InitProcDomain(); +extern void ResetProcDomain(); + +#endif /* ! defined _XIEC_DOMAIN */ + +/* + * Rectangles of Interest structure definitions + */ + +#define RUNPTR(idx) (&((runPtr)&lp[1])[idx]) +#define LEND(rband) ((linePtr)&rband->strip->data[rband->strip->length]) + +typedef struct _runRec { + CARD32 dstart; /* delta to start of run */ + CARD32 length; /* length of run */ +} runRec, *runPtr; + +typedef struct _linerec { + INT32 y; /* starting y coodinate of this y-x band */ + CARD32 nline; /* height of y-x band */ + CARD32 nrun; /* number of runRecs for this y-x band */ +/* runRec run[nrun]; */ +} lineRec, *linePtr; + +typedef struct _ROIrec { + INT32 x, y; /* min x and y coordinates of bounding box */ + CARD32 width; /* width of bounding box */ + CARD32 height; /* height of bounding box */ + CARD32 nrects; /* number of rectangles in this ROI */ + linePtr lend; /* first address past end of ROI table */ +} ROIRec, *ROIPtr; + +#endif /* module _XIEH_DOMAIN */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/include/fax.h b/xie/xc/programs/Xserver/XIE/mixie/include/fax.h new file mode 100644 index 0000000..715ca26 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/include/fax.h @@ -0,0 +1,220 @@ +/* $XConsortium: fax.h,v 1.5 94/04/17 20:34:59 rws Exp $ */ +/**** module fax.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + fax.h -- DDXIE common include file for new spiffy fax modules + + Ben Fahy -- AGE Logic, Inc. May 1993 + +******************************************************************************/ + +#include + +/*** entry points */ +extern int decode_g4(); +extern int decode_g32d(); +extern int decode_g31d(); +extern int decode_tiff2(); +extern int decode_tiffpb(); + +/* must match what is in pretab.h */ +#define FAX_MODE_Unknown 0 +#define FAX_MODE_Pass 1 +#define FAX_MODE_Horizontal 2 +#define FAX_MODE_Vertical_L3 3 +#define FAX_MODE_Vertical_L2 4 +#define FAX_MODE_Vertical_L1 5 +#define FAX_MODE_Vertical_C0 6 +#define FAX_MODE_Vertical_R1 7 +#define FAX_MODE_Vertical_R2 8 +#define FAX_MODE_Vertical_R3 9 + +/* extension stuff is optional, so not part of SI ***/ +#define FAX_MODE_Extension_1D FAX_MODE_Unknown +#define FAX_MODE_Extension_2D FAX_MODE_Unknown + +#define FAX_GOAL_StartNewLine 12 +#define FAX_GOAL_DetermineMode 13 +#define FAX_GOAL_HandleVertL3 FAX_MODE_Vertical_L3 +#define FAX_GOAL_HandleVertL2 FAX_MODE_Vertical_L2 +#define FAX_GOAL_HandleVertL1 FAX_MODE_Vertical_L1 +#define FAX_GOAL_HandleVert0 FAX_MODE_Vertical_C0 +#define FAX_GOAL_HandleVertR1 FAX_MODE_Vertical_R1 +#define FAX_GOAL_HandleVertR2 FAX_MODE_Vertical_R2 +#define FAX_GOAL_HandleVertR3 FAX_MODE_Vertical_R3 +#define FAX_GOAL_HandlePass FAX_MODE_Pass +#define FAX_GOAL_HandleHoriz FAX_MODE_Horizontal +#define FAX_GOAL_AccumulateA0A1 14 +#define FAX_GOAL_RecordA0A1 15 +#define FAX_GOAL_AccumulateA1A2 16 +#define FAX_GOAL_RecordA1A2 17 +#define FAX_GOAL_FinishHoriz 18 +#define FAX_GOAL_SeekEOLandTag 19 +#define FAX_GOAL_SeekTagBit 20 +#define FAX_GOAL_AdjustTag 21 +#define FAX_GOAL_RecoverZero 22 +#define FAX_GOAL_AdjustedButStillRecovering 23 +#define FAX_GOAL_FoundOneEOL 24 +#define FAX_GOAL_SkipPastAnyToEOL 25 +#define FAX_GOAL_SeekFillAndEOL 26 +#define FAX_GOAL_FallOnSword 27 + +#define FAX_DECODE_DONE_NOT 0 +#define FAX_DECODE_DONE_OK 1 +#define FAX_DECODE_DONE_ErrorSkipPast 2 +#define FAX_DECODE_DONE_ErrorBadFill 3 +#define FAX_DECODE_DONE_ErrorBadGoal 4 +#define FAX_DECODE_DONE_ErrorBadMagic 5 +#define FAX_DECODE_DONE_ErrorBadStripper 6 +#define FAX_DECODE_DONE_ErrorPastWidth 7 +#define FAX_DECODE_DONE_ErrorBadCode 8 +#define FAX_DECODE_DONE_ErrorBadPtr 9 +#define FAX_DECODE_DONE_ErrorBadZero 10 +#define FAX_DECODE_DONE_ErrorBada0a1 11 +#define FAX_DECODE_DONE_ErrorBada1a2 12 +#define FAX_DECODE_DONE_ErrorBadEOL 13 +#define FAX_DECODE_DONE_ErrorBadA0pos 14 +#define FAX_DECODE_DONE_ErrorPassAboveAllWhite 15 +#define FAX_DECODE_DONE_ErrorMissingEOL 16 + + +#define PB_GOAL_StartNewLine 0 +#define PB_GOAL_GetRunLength 1 +#define PB_GOAL_GetLiteralBytes 2 +#define PB_GOAL_GetRepeatByte 3 +#define PB_GOAL_RepeatBytes 4 + +typedef struct _bit_stream { + int started; /* 0 if requires initialization */ + unsigned char *byteptr; /* address of current byte in strip */ + unsigned char *endptr; /* 1 past last byte in strip */ + int bitpos; /* address of bit in byte (left->r) */ +} BitStream; + +#define StripStateNone 0 /* no strip available yet */ +#define StripStateNew 1 /* offered to decoder for first time */ +#define StripStateInUse 2 /* decoder is using the strip */ +#define StripStateDone 3 /* decoder is done with the strip */ +#define StripStateNoMore 4 /* that's all, folks. */ + +typedef struct _fax_state { + int final; /* if final = 1, all input data is available */ + int decoder_done;/* if done = 1, all data sent has been decoded */ + int write_data; /* distinguish between decode only */ + unsigned char *strip; /* latest available strip */ + int strip_size; /* size of that strips */ + int strip_state; /* whether strip is new, being used, or done */ + int use_magic; /* 1 means we are using magic strip */ + int magic_needs; /* 1 means magic strip only have filled */ + unsigned char magicStrip[8]; + /* "pretend" strip for handling strip edges */ + int o_line; /* absolute output line position */ + int nl_sought; /* how many lines we want, this decode round */ + char **o_lines; /* pointers to beginning of output lines */ + BitStream bits; /* definition of bitstream, current strip */ + int goal; /* our current goal */ + int a0_pos; /* starting changing position on coding line */ + int a1_pos; /* next changing position to right of a0_pos */ + int a0a1; /* distance from a0 to a1 */ + int b1_pos; /* first change above and right of a0, ~color */ + int b2_pos; /* next change above and right of a0, ao_color */ + int a0_color; /* color of a0, either WHITE or BLACK */ + int n_old_trans; /* number of transitions, line above us */ + int *old_trans; /* list of transitions on line above us */ + int n_new_trans; /* number of transitions, current line (so far)*/ + int *new_trans; /* list of transitions on current line */ + int last_b1_idx; /* index of last saved transition we looked at */ + int length_acc; /* accumulates run-lengths for a0a1 or a1a2 */ + int width; /* width of image. So we know end of line */ + int g32d_horiz; /* only relevant for g32d encoding */ + int rl; /* needed if I get EOL in get_a0a1 or get_a1a2 */ + int radiometric; /* if 1, then expand white as 1, else 0 */ +} FaxState; + +/* these definitions should agree with what is in pretab.h */ +#define BAD_RUN_LENGTH (-1) +#define EOL_RUN_LENGTH (-2) +#define WHITE ( 0) +#define BLACK (~WHITE) +#define MIN_BYTES_NEEDED 7 + /* sorry, we can't handle strips of less than 7 bytes. :-( */ + /* it wreaks havoc with our magic strips if we try to go lower */ + +#define WriteLineData(olp,w) \ + zero_even(olp,new_trans,n_new_trans,w,state->radiometric); + +#define FlushLineData() \ + { \ + WriteLineData((char *)state->o_lines[lines_found],width); \ + ++lines_found; \ + } +/* + note: I'm declaring this with no functions, so the caller won't + be tempted to call with lines_found++, which wouldn't work +*/ + +/**** module fax.h ****/ diff --git a/xie/xc/programs/Xserver/XIE/mixie/include/floman.h b/xie/xc/programs/Xserver/XIE/mixie/include/floman.h new file mode 100644 index 0000000..3b299a4 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/include/floman.h @@ -0,0 +1,85 @@ +/* $XConsortium: floman.h,v 1.4 94/04/17 20:34:59 rws Exp $ */ +/**** module floman.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + floman.h -- DDXIE photoflo manager definitions + + Robert NC Shelley -- AGE Logic, Inc. May 1993 + +******************************************************************************/ + +#ifndef _XIEH_FLOMAN +#define _XIEH_FLOMAN + +#define Create(flo,ped) (*ped->ddVec.create)(flo,ped) +#define Initialize(flo,ped) (*ped->ddVec.initialize)(flo,ped) +#define Activate(flo,ped,pet) (*ped->ddVec.activate)(flo,ped,pet) +#define Flush(flo,ped) (*ped->ddVec.flush)(flo,ped) +#define Reset(flo,ped) (ped->peTex ? (*ped->ddVec.reset)(flo,ped) : 0) +#define Destroy(flo,ped) (ped->peTex ? (*ped->ddVec.destroy)(flo,ped) : 0) + +#endif /* end _XIEH_FLOMAN */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/include/jpeg.h b/xie/xc/programs/Xserver/XIE/mixie/include/jpeg.h new file mode 100644 index 0000000..69d63f6 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/include/jpeg.h @@ -0,0 +1,92 @@ +/* $XConsortium: jpeg.h,v 1.3 94/04/17 20:35:00 rws Exp $ */ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + jpeg.h -- DDXIE common include file for jpeg interface code + + Ben Fahy -- AGE Logic, Inc. Oct 1993 + +******************************************************************************/ + + +#ifndef XIE +#define XIE +#endif +#include + +JSAMPIMAGE alloc_sampimage(); + +#define JPEG_BUFFER_BufferError (-1) +#define JPEG_BUFFER_BufferFilled 0 +#define JPEG_BUFFER_NeedAnotherStrip 1 +#define JPEG_BUFFER_LastBuffer 2 + +#define JPEG_FLUSH_Error (-1) +#define JPEG_FLUSH_FlushedAll 1 +#define JPEG_FLUSH_FlushedPart 2 + +#include "jpegd.h" +#include "jpege.h" diff --git a/xie/xc/programs/Xserver/XIE/mixie/include/jpegd.h b/xie/xc/programs/Xserver/XIE/mixie/include/jpegd.h new file mode 100644 index 0000000..42d237d --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/include/jpegd.h @@ -0,0 +1,156 @@ +/* $XConsortium: jpegd.h,v 1.3 94/04/17 20:35:00 rws Exp $ */ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + jpegd.h - common include file for jpeg decoders + + Ben Fahy -- AGE Logic, Inc. Oct 1993 + +******************************************************************************/ + +#define JPEG_DECODE_GOAL_Startup 0 +#define JPEG_DECODE_GOAL_Done 1 +#define JPEG_DECODE_GOAL_ReadDataForInit 2 +#define JPEG_DECODE_GOAL_TryToInit 3 +#define JPEG_DECODE_GOAL_InitDone 4 +#define JPEG_DECODE_GOAL_ProcessData 5 +#define JPEG_DECODE_GOAL_ReadDataForProcess 6 +#define JPEG_DECODE_GOAL_WriteDataForProcess 7 +#define JPEG_DECODE_GOAL_EndOfInput 8 +#define JPEG_DECODE_GOAL_FlushData 9 + +#define JPEG_DECODE_ERROR_BadGoal 1 +#define JPEG_DECODE_ERROR_DecoderIsFreakingOut 2 +#define JPEG_DECODE_ERROR_CouldNotStart 3 +#define JPEG_DECODE_ERROR_CouldNotInit 4 +#define JPEG_DECODE_ERROR_BadInitRetCode 5 +#define JPEG_DECODE_ERROR_BadOutputAlloc 6 +#define JPEG_DECODE_ERROR_DecodeError 7 +#define JPEG_DECODE_ERROR_NoMoreProcessData 8 +#define JPEG_DECODE_ERROR_ColorMismatch 9 +#define JPEG_DECODE_ERROR_WidthMismatch 10 +#define JPEG_DECODE_ERROR_HeightMismatch 11 + +typedef struct _jpeg_decode_state { + int goal; /* what to do next */ + int error_code; /* ooops */ + + int up_sample; /* allow up-sampling or leave as is? */ + int color; /* color image or grayscale? */ + int width,height; /* available elsewhere, but I'm lazy */ + + int o_line; /* absolute output line position */ + int nl_flushed; /* how many lines we have flusehd */ + int nl_found; /* how many lines we have, this round */ + unsigned char **o_lines[3]; + /* pointers to output lines, 3 bands */ + + decompress_info_ptr cinfo; + /* decoder's private state */ + decompress_methods_ptr dc_methods; + external_methods_ptr e_methods; + /* decoder's private methods */ + + unsigned char *jpeg_input_buffer; + unsigned char *jpeg_output_buffer; + /* names self-explanatory? */ + + int strip_size; /* size of currently available strip */ + unsigned char *strip; /* start of currently available strip */ + unsigned char *sptr; /* position within the strip */ + int needs_input_strip; /* need a new strip */ + int i_strip; /* input strip #. nice for debugging */ + int o_strip; /* output strip #. nice for debugging */ + int final; /* this is the last strip */ + int no_more_strips; /* flag saying you can't have any more */ + +} JpegDecodeState; + +extern int decode_jpeg_lossless_color( +#ifdef NEED_PROTOTYPES + JPegDecodeState * /* state */ +#endif +); + +extern int decode_jpeg_lossy_color( +#ifdef NEED_PROTOTYPES + JPegDecodetSate * /* state */ +#endif +); + +extern int decode_jpeg_lossless_gray( +#ifdef NEED_PROTOTYPES + JPegDecodeState * /* state */ +#endif +); + +extern int decode_jpeg_lossy_gray( +#ifdef NEED_PROTOTYPES + JPegDecodeState * /* state */ +#endif +); + + diff --git a/xie/xc/programs/Xserver/XIE/mixie/include/jpege.h b/xie/xc/programs/Xserver/XIE/mixie/include/jpege.h new file mode 100644 index 0000000..232ab1b --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/include/jpege.h @@ -0,0 +1,174 @@ +/* $XConsortium: jpege.h,v 1.3 94/04/17 20:35:01 rws Exp $ */ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + jpege.h - common include file for jpeg encoder + + Ben Fahy -- AGE Logic, Inc. Oct 1993 + +******************************************************************************/ + + +#define JPEG_ENCODE_GOAL_Startup 0 +#define JPEG_ENCODE_GOAL_Done 1 +#define JPEG_ENCODE_GOAL_TryToBeginFrame 2 +#define JPEG_ENCODE_GOAL_WriteHdrData 3 +#define JPEG_ENCODE_GOAL_BeginFrameDone 4 +#define JPEG_ENCODE_GOAL_ProcessData 5 +#define JPEG_ENCODE_GOAL_ReadDataForProcess 6 +#define JPEG_ENCODE_GOAL_WriteDataForProcess 7 +#define JPEG_ENCODE_GOAL_EndOfInput 8 +#define JPEG_ENCODE_GOAL_FlushData 9 +#define JPEG_ENCODE_GOAL_EncodeRGB 10 +#define JPEG_ENCODE_GOAL_EncodeGray 11 +#define JPEG_ENCODE_GOAL_CheckStatus 12 +#define JPEG_ENCODE_GOAL_EndFrame 13 + +#define JPEG_ENCODE_ERROR_BadGoal 1 +#define JPEG_ENCODE_ERROR_EncoderIsFreakingOut 2 +#define JPEG_ENCODE_ERROR_CouldNotStart 3 +#define JPEG_ENCODE_ERROR_CouldNotBeginFrame 4 +#define JPEG_ENCODE_ERROR_BadBeginFrameRetCode 5 +#define JPEG_ENCODE_ERROR_BadOutputAlloc 6 +#define JPEG_ENCODE_ERROR_EncodeError 7 +#define JPEG_ENCODE_ERROR_NoMoreProcessData 8 +#define JPEG_ENCODE_ERROR_ColorMismatch 9 +#define JPEG_ENCODE_ERROR_EndFrameError 10 +#define JPEG_ENCODE_ERROR_EndFrameFreakOut 11 + +typedef struct _jpeg_encode_state { + int goal; /* what to do next */ + int error_code; /* ooops */ + + int n_bands; /* color image or grayscale? */ + int width,height; /* available elsewhere, but I'm lazy */ + + int flush_output; /* how many bytes left to flush */ + int nl_coded; /* how many lines we have, this round */ + int nl_tocode; /* how many lines we want, this round */ + int i_line; /* absolute input line position */ + unsigned char **i_lines[3]; + /* pointers to input lines, 3 bands */ + + compress_info_ptr cinfo; + /* decoder's private state */ + compress_methods_ptr c_methods; + external_methods_ptr e_methods; + /* decoder's private methods */ + + unsigned char *jpeg_input_buffer; + unsigned char *jpeg_output_buffer; + /* names self-explanatory? */ + unsigned char *jpeg_output_bpos; + /* output buffer position during flush */ + + int strip_size; /* size of currently available strip */ + unsigned char *strip; /* start of currently available strip */ + unsigned char *sptr; /* position within the strip */ + int needs_input_strip; /* need a new strip */ + int i_strip; /* input strip #. nice for debugging */ + int o_strip; /* output strip #. nice for debugging */ + int final; /* this is the last strip */ + int no_more_strips; /* flag saying you can't have any more */ + + int strip_req_newbytes;/* number of destination bytes we want */ + + short h_sample[3]; /* horizontal sample factors */ + short v_sample[3]; /* vertical sample factors */ + + int lenQtable; + int lenACtable; + int lenDCtable; + + unsigned char *Qtable; + unsigned char *ACtable; + unsigned char *DCtable; + +} JpegEncodeState; + +extern int encode_jpeg_lossless_color( +#ifdef NEED_PROTOTYPES + JPegEncodeState * /* state */ +#endif +); + +extern int encode_jpeg_lossy_color( +#ifdef NEED_PROTOTYPES + JPegEncodeState * /* state */ +#endif +); + +extern int encode_jpeg_lossless_gray( +#ifdef NEED_PROTOTYPES + JPegEncodeState * /* state */ +#endif +); + +extern int encode_jpeg_lossy_gray( +#ifdef NEED_PROTOTYPES + JPegEncodeState * /* state */ +#endif +); diff --git a/xie/xc/programs/Xserver/XIE/mixie/include/meuncomp.h b/xie/xc/programs/Xserver/XIE/mixie/include/meuncomp.h new file mode 100644 index 0000000..9742f7c --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/include/meuncomp.h @@ -0,0 +1,126 @@ +/* $XConsortium: meuncomp.h,v 1.4 94/04/17 20:35:01 rws Exp $ */ +/**** module miuncomp.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + meuncomp.c -- DDXIE includes for exporting uncompressed data + + Dean Verheiden -- AGE Logic, Inc. October 1993 + +*****************************************************************************/ + +typedef struct _meuncompdef { + void (*action)(); + CARD32 Bstride; + CARD8 dstoffset; /* Number of bytes offset to this pixel's band */ + CARD8 mask; /* For obtaining subbyte pixels */ + CARD8 shift; /* Necessary shift after obtaining pixel */ + CARD8 bandMap; + CARD8 clear_dst; /* Scanline pad (in bits) */ + CARD8 bitOff; /* more that we can chew? */ + CARD8 leftOver; + CARD8 depth; + CARD16 stride; + CARD8 unaligned; + CARD8 pad; + CARD32 width; + CARD32 pitch; + pointer buf; +} meUncompRec, *meUncompPtr; + +#ifdef _XIEC_MEUNCOMP + +/* Action routines for encoding pixel planes */ +void btoS(), sbtoS(), btoIS(), sbtoIS(); +void BtoS(), PtoS(), sPtoS(), QtoS(), sQtoS(), QtoIS(), sQtoIS(); + +/* Action routines used by Triple band by pixel encoding */ +void BtoIS(), PtoIS(), sPtoIS(), BtoISb(), btoISb(); + +/* Unaligned data packing routines */ +void BtoLLUB(), BtoLMUB(), BtoMLUB(), BtoMMUB(); +void PtoLLUP(), PtoLMUP(), PtoMLUP(), PtoMMUP(); +void QtoLLUQ(), QtoLMUQ(), QtoMLUQ(), QtoMMUQ(); + + +#else /* ifdef _XIEC_MEUNCOMP */ + +/* Action routines for encoding pixel planes */ +extern void btoS(), sbtoS(), btoIS(), sbtoIS(); +extern void BtoS(), PtoS(), sPtoS(), QtoS(), sQtoS(), QtoIS(), sQtoIS(); + +/* Action routines used by Triple band by pixel encoding */ +extern void BtoIS(), PtoIS(), sPtoIS(), BtoISb(), btoISb(); +extern void BtoLLUB(), BtoLMUB(), BtoMLUB(), BtoMMUB(); +extern void PtoLLUP(), PtoLMUP(), PtoMLUP(), PtoMMUP(); +extern void QtoLLUQ(), QtoLMUQ(), QtoMLUQ(), QtoMMUQ(); + +#if XIE_FULL +/* Array of pointers to actions routines for unaligned triple band by pixel */ +extern void (*EncodeTripleFuncs[2][2][2][2][2])(); +#endif + +#endif /* ifdef _XIEC_MEUNCOMP */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/include/microi.h b/xie/xc/programs/Xserver/XIE/mixie/include/microi.h new file mode 100644 index 0000000..2819bee --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/include/microi.h @@ -0,0 +1,120 @@ +/* $XConsortium: microi.h,v 1.4 94/04/17 20:35:02 rws Exp $ */ +/**** module microi.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + microi.h -- DDXIE MI ImportClientROI definitions + + Dean Verheiden -- AGE Logic, Inc. August 1993 + +*****************************************************************************/ + +#ifndef _XIEH_MICROI +#define _XIEH_MICROI + + +typedef struct _XieDDXPoint { + INT32 x, y; +} XieDDXPointRec, *XieDDXPointPtr; + +typedef struct _XieBox { + INT32 x1, y1, x2, y2; +} XieBoxRec, *XieBoxPtr; + +typedef struct _XieRegData { + long size; + long numRects; +/* BoxRec rects[size]; in memory but not explicitly declared */ +} XieRegDataRec, *XieRegDataPtr; + +typedef struct _XieRegion { + XieBoxRec extents; + XieRegDataPtr data; +} XieRegionRec, *XieRegionPtr; + +#ifdef _XIEC_MIREGION + +#define XieNullRegion ((XieRegionPtr)0) + +#define XIEREGION_NIL(reg) ((reg)->data && !(reg)->data->numRects) +#define XIEREGION_NUM_RECTS(reg) ((reg)->data ? (reg)->data->numRects : 1) +#define XIEREGION_SIZE(reg) ((reg)->data ? (reg)->data->size : 0) +#define XIEREGION_RECTS(reg) ((reg)->data ? (XieBoxPtr)((reg)->data + 1) \ + : &(reg)->extents) +#define XIEREGION_BOXPTR(reg) ((XieBoxPtr)((reg)->data + 1)) +#define XIEREGION_BOX(reg,i) (&XIEREGION_BOXPTR(reg)[i]) +#define XIEREGION_TOP(reg) XIEREGION_BOX(reg, (reg)->data->numRects) +#define XIEREGION_END(reg) XIEREGION_BOX(reg, (reg)->data->numRects - 1) +#define XIEREGION_SZOF(n) (sizeof(XieRegDataRec) + ((n) * sizeof(XieBoxRec))) + +#else /* defined _XIEC_MIREGION */ + +extern XieRegionPtr miXieRegionCreate(); +extern Bool miXieRegionValidate(); + +#endif + +#endif /* module _XIEH_MICROI */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/include/miphoto.h b/xie/xc/programs/Xserver/XIE/mixie/include/miphoto.h new file mode 100644 index 0000000..3bfe115 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/include/miphoto.h @@ -0,0 +1,86 @@ +/* $XConsortium: miphoto.h,v 1.4 94/04/17 20:35:02 rws Exp $ */ +/**** module miphoto.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + miphoto.h -- DDXIE MI prototype ImportPhotomap definitions + + Robert NC Shelley -- AGE Logic, Inc. June 1993 + +*****************************************************************************/ + +#ifndef _XIEH_MIPHOTO +#define _XIEH_MIPHOTO + +/* + * peTex extension for the ImportClientPhotomap element + */ +typedef struct _miphotodef { + stripPtr next_strip[xieValMaxBands]; +} miPhotoDefRec, *miPhotoDefPtr; + +#endif /* module _XIEH_MIPHOTO */ + diff --git a/xie/xc/programs/Xserver/XIE/mixie/include/miuncomp.h b/xie/xc/programs/Xserver/XIE/mixie/include/miuncomp.h new file mode 100644 index 0000000..b0d7464 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/include/miuncomp.h @@ -0,0 +1,145 @@ +/* $XConsortium: miuncomp.h,v 1.4 94/04/17 20:35:03 rws Exp $ */ +/**** module miuncomp.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + miuncomp.c -- DDXIE includes for importing uncompressed data + + Dean Verheiden -- AGE Logic, Inc. September 1993 + +*****************************************************************************/ + +typedef struct _miuncompdef { + stripPtr next_strip; /* used by import photomap only */ + void (*action)(); + void (*tripleaction)(); /* need to brush up on this */ + CARD32 Bstride; + CARD8 srcoffset; /* Number of bytes offset to this pixel's band*/ + CARD8 mask; /* For obtaining subbyte pixels */ + CARD8 shift; /* Necessary shift after obtaining pixel */ + CARD8 bandMap; + CARD8 leftPad; /* Scanline pad (in bits) */ + CARD8 bitOff; /* more that we can chew? */ + BOOL unaligned; /* Flag used by band-by-pixel decoding */ + BOOL reformat; /* Flag used to request data re-formatting */ + pointer buf; +} miUncompRec, *miUncompPtr; + +#ifdef _XIEC_MIUNCOMP + +/* Bit reversal routine for single band uncompressed bitonal images */ +void CPreverse_bits(), CPpass_bits(); +void CPextractstreambits(), CPextractswappedstreambits(); + +/* Byte copy routine for nicely aligned data */ +void CPpass_bytes(); + +/* Pairpixel copy routine for nicely aligned data */ +void CPpass_pairs(), CPswap_pairs(); + +/* Quadpixel copy routine for nicely aligned data */ +void CPpass_quads(), CPswap_quads(); + +#if XIE_FULL +/* Action routines used by Triple band by pixel decoding */ +void StoB(), StoP(), StosP(), SbtoB(), Sbtob(); +#endif /* XIE_FULL */ + +/* Single band unaligned Stream to Pixel conversion routines */ +void LLUBtoB(), LMUBtoB(), MLUBtoB(), MMUBtoB(); +void LLUPtoP(), LMUPtoP(), MLUPtoP(), MMUPtoP(); +void LLUQtoQ(), LMUQtoQ(), MLUQtoQ(), MMUQtoQ(); + +#else /* ifdef _XIEC_MIUNCOMP */ + +/* Bit reversal routine for single band uncompressed bitonal images */ +extern void CPreverse_bits(), CPpass_bits(); +extern void CPextractstreambits(), CPextractswappedstreambits(); + +/* Byte copy routine for nicely aligned data */ +extern void CPpass_bytes(); + +/* Pairpixel copy routine for nicely aligned data */ +extern void CPpass_pairs(), CPswap_pairs(); + +/* Quadpixel copy routine for nicely aligned data */ +extern void CPpass_quads(), CPswap_quads(); + +#if XIE_FULL +/* Action routines used by Triple band by pixel decoding */ +extern void StoB(), StoP(), StosP(), SbtoB(), Sbtob(); + +/* Array of pointers to actions routines for unaligned triple band by pixel */ +extern void (*ExtractTripleFuncs[2][2][2][2][2])(); + +#endif /* XIE_FULL */ + +/* Single band unaligned Stream to Pixel conversion routines */ +extern void LLUBtoB(), LMUBtoB(), MLUBtoB(), MMUBtoB(); +extern void LLUPtoP(), LMUPtoP(), MLUPtoP(), MMUPtoP(); +extern void LLUQtoQ(), LMUQtoQ(), MLUQtoQ(), MMUQtoQ(); + +#endif /* ifdef _XIEC_MIUNCOMP */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/include/mpgeom.h b/xie/xc/programs/Xserver/XIE/mixie/include/mpgeom.h new file mode 100644 index 0000000..9c3a618 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/include/mpgeom.h @@ -0,0 +1,127 @@ +/* $XConsortium: mpgeom.h,v 1.5 94/04/17 20:35:03 rws Exp $ */ +/**** module mpgeom.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + mpgeom.h -- DDXIE MI prototype Geometry definitions + + Ben Fahy -- AGE Logic, Inc. June 1993 + +*****************************************************************************/ + +#ifndef _XIEH_MPGEOM +#define _XIEH_MPGEOM + +/* + * peTex extension for the Geometry element + */ +typedef struct _mpgeombanddef { + int finished; /* done with this band */ + int yOut; /* what output line we are on */ + int out_of_bounds; /* if entire input image is missed */ + + double first_mlow, /* lowest input line mapped by first output */ + first_mhigh; /* highest input line mapped by first output */ + double last_mlow, /* lowest input line mapped by last output */ + last_mhigh; /* highest input line mapped by last output */ + double global_mlow, /* lowest input line mapped, overall */ + global_mhigh; /* highest input line mapped, overall */ + + int first_ilow, /* rounded first_mlow */ + first_ihigh; /* rounded first_mhigh */ + int last_ilow, /* rounded last_mlow */ + last_ihigh; /* rounded last_mlow */ + int global_ilow, /* rounded global_mlow */ + global_ihigh; /* rounded global_mlow */ + + /* useful data precalculated for scaling */ + int *x_locs; + int x_start; + int x_end; + int int_constant; /* precalculated for Constrained data fill */ + RealPixel flt_constant; /* precalculated for UnConstrained data fill */ + + /* required by general line filling routine */ + int in_width; + int in_height; + + /* keep track of what input lines we've come across */ + int lo_src_available; + int hi_src_available; + + void (*linefunc) (); + void (*fillfunc) (); + } + mpGeometryBandRec, *mpGeometryBandPtr; + +typedef struct _mpgeometrydef { + int input_line_increases_as_output_line_increases; + int input_map_size; + mpGeometryBandPtr bandInfo[xieValMaxBands]; + } + mpGeometryDefRec, *mpGeometryDefPtr; + +#endif /* module _XIEH_MPGEOM */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/include/mppoint.h b/xie/xc/programs/Xserver/XIE/mixie/include/mppoint.h new file mode 100644 index 0000000..6fe25eb --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/include/mppoint.h @@ -0,0 +1,86 @@ +/* $XConsortium: mppoint.h,v 1.4 94/04/17 20:35:04 rws Exp $ */ +/**** module mppoint.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + mppoint.h -- DDXIE MI prototype Point definitions + + Ben Fahy -- AGE Logic, Inc. May 1993 + +*****************************************************************************/ + +#ifndef _XIEH_MPPOINT +#define _XIEH_MPPOINT + +#include +/* + * peTex extension for the Point element + */ +typedef struct _mppointdef { + lutPtr lut; +} mpPointDefRec, *mpPointDefPtr; + +#endif /* module _XIEH_MPPOINT */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/include/sched.h b/xie/xc/programs/Xserver/XIE/mixie/include/sched.h new file mode 100644 index 0000000..fb5f1a0 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/include/sched.h @@ -0,0 +1,127 @@ +/* $XConsortium: sched.h,v 1.4 94/04/17 20:35:04 rws Exp $ */ +/**** module sched.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + sched.h -- DDXIE machine independent scheduler definitions + + Robert NC Shelley -- AGE Logic, Inc. May 1993 + +******************************************************************************/ + +#ifndef _XIEH_SCHED +#define _XIEH_SCHED + +/* scheduler interface + */ +typedef bandMsk (*xieBandProc)(); +typedef struct _schedvec { + xieBoolProc execute; + xieBandProc runnable; +} schedVecRec; + +/* call scheduler to execute until out of data; + * returns Bool: true if flo still active + */ +#define Execute(flo,import_pet) \ + (*flo->schedVec->execute)(flo,import_pet) + +/* detect execution suspension/resumption + * returns Bool: true if scheduler has exited to core X since last checked + * (useful for determining if fresh lookups are needed for core X resources) + */ +#define Resumed(flo,pet) \ + (pet->schedCnt == flo->floTex->exitCnt ? FALSE \ + : ((pet->schedCnt = flo->floTex->exitCnt), TRUE)) + +/* toggle the band's ready bit if "available >= threshold" status has changed + * and return the updated ready mask; + * if the ready bit doesn't toggle, return NO_BANDS + */ +#define CheckSrcReady(bnd,bmsk) \ + (bnd->receptor->ready & (bmsk) \ + ? (bnd->available < bnd->threshold \ + ? (bnd->receptor->ready &= ~(bmsk)) : NO_BANDS) \ + : (bnd->available >= bnd->threshold \ + ? (bnd->receptor->ready |= (bmsk)) : NO_BANDS)) + +/* try to schedule the specified element based on new data arriving for: + * receptorPtr rcp, bandPtr bnd, and bandMsk bmsk + * nothing is returned, but pet->scheduled indicates which bands are runnable + */ +#define Schedule(flo,pet,rcp,bnd,bmsk) \ + { bandMsk r = CheckSrcReady(bnd,bmsk) & rcp->attend; \ + if(r && !pet->scheduled) { \ + if(!pet->inSync) { \ + if(!pet->bandSync || r == (rcp->active & rcp->attend)) {\ + pet->scheduled |= r; \ + InsertMember(pet, &flo->floTex->schedHead); \ + } \ + } else if(r = (*flo->schedVec->runnable)(flo,pet)) { \ + pet->scheduled = r; \ + InsertMember(pet,&flo->floTex->schedHead); \ + } } } +#endif /* end _XIEH_SCHED */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/include/strip.h b/xie/xc/programs/Xserver/XIE/mixie/include/strip.h new file mode 100644 index 0000000..95904e1 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/include/strip.h @@ -0,0 +1,335 @@ +/* $XConsortium: strip.h,v 1.5 94/04/17 20:35:05 rws Exp $ */ +/**** module strip.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + strip.h -- DDXIE machine independent data manager definitions + + Robert NC Shelley -- AGE Logic, Inc. May 1993 + +******************************************************************************/ + +#ifndef _XIEH_STRIP +#define _XIEH_STRIP + +#define STANDARD_STRIP_SIZE 8192 /* temporary hack */ + +/* data management interface */ +typedef struct _stripvec { + xieDataProc make_bytes; + xieDataProc make_lines; + xieBoolProc map_data; + xieDataProc get_data; + xieBoolProc put_data; + xieVoidProc free_data; + xieBoolProc pass_strip; + xieBoolProc import_strips; + xieBoolProc alter_src; + xieVoidProc bypass_src; + xieVoidProc disable_src; + xieVoidProc disable_dst; +} stripVecRec; + +/* per-band scanline/byte data management info + */ +typedef struct _band { + stripLstRec stripLst; /* strips available for processing */ + stripPtr strip; /* strip of most recent access */ + CARD8 *data; /* pointer to most recent line/byte access */ + CARD32 minGlobal; /* lowest available line/byte in stripLst */ + CARD32 minLocal; /* lowest available line/byte in strip */ + CARD32 current; /* line/byte of most recent access */ + CARD32 maxLocal; /* one beyond highest line/byte in strip */ + CARD32 maxGlobal; /* one beyond highest line/byte in stripLst */ + CARD32 pitch; /* number of bytes to start of next line */ + CARD32 mapSize; /* size of dataMap */ + CARD8 **dataMap; /* pointers for multi-line random access */ + CARD32 threshold; /* line/bytes needed for execution */ + CARD32 available; /* line/bytes available in stripLst */ + bandMsk replicate; /* replicate data from band 0 to bands 1 & 2*/ + CARD8 band; /* band number */ + BOOL final; /* true when last line/byte is in stripLst */ + BOOL isInput; /* band type: true = input, false = output */ + struct _receptor *receptor; /* receptor if isInput, otherwise NULL */ + formatPtr format; /* common format info for all strips */ + struct _band *inPlace; /* what to clone to make in-place strips */ + pointer pcroi; /* pointer to ROI entry for current line */ + CARD32 xindex; /* index into pcroi ROI for current x pos */ + INT32 xcount; /* current x location in output band */ + BOOL ypass; /* True = no processing domain this line */ + BOOL inside; /* indicates if inside or outside domain */ + BOOL allpass; /* indicates no lines fall in ROI */ + CARD8 pad; +} bandRec, *bandPtr; + +/************************************************************************** + * Photoflo data manager convenience macros + * + * pointer GetCurrentSrc(flo,pet,bnd) single Src line/byte + * pointer GetCurrentDst(flo,pet,bnd) single Dst line/byte + * pointer GetNextSrc(flo,pet,bnd,purge) single Src line/byte + * pointer GetNextDst(flo,pet,bnd,purge) single Dst line/byte + * pointer GetSrc(flo,pet,bnd,unit,purge) single Src line/byte + * pointer GetDst(flo,pet,bnd,unit,purge) single Dst line/byte + * pointer GetSrcBytes(flo,pet,bnd,unit,len,purge) contiguous Src bytes + * pointer GetDstBytes(flo,pet,bnd,unit,len,purge) contiguous Dst bytes + * Bool MapData(flo,pet,bnd,map,unit,len,purge) map multi-lines/bytes + * Bool PutData(flo,pet,bnd,unit) put multi-lines/bytes + * void FreeData(flo,pet,bnd,unit) free multi-lines/bytes + * Bool PassStrip(flo,pet,bnd,strip) forward clone of strip + * Bool ImportStrips(flo,pet,bnd,strips) import Photomap strips + * Bool AlterSrc(flo,pet,strip) see if Src is mutable + * void BypassSrc(flo,pet,bnd) bypass element for bnd + * void DisableSrc(flo,pet,bnd,purge) disable input for bnd + * void DisableDst(flo,pet,bnd) signal no bnd output + * + * key to common arguments: + * flo floDefPtr + * pet peTexPtr + * bnd bandPtr + * unit line number within canonic image, or + * byte number within non-canonic data stream + * len number of units (lines or bytes) + * purge if the requested data is not in the current strip and purge is + * true, all data preceding the first line or byte in the current + * request is freed (receptor band) or forwarded (emitter band). + * NOTE: purge does not update scheduler info, so FreeData should be + * called for receptor bands prior to returning from the element. + * + * Additional macros: + * AttendBand(bnd) ------- scheduler will consider this band (default) + * IgnoreBand(bnd) ------- scheduler will ignore this band + * AttendReceptor(rcp) --- scheduler will consider this receptor (default) + * IgnoreReceptor(rcp) --- scheduler will ignore this receptor + * SetBandFinal(bnd) ----- set final "true" for band and current strip + * SetBandThreshold(bnd,value) -- set new threshold value + * TruncateStrip(bnd,value) ----- adjust end of strip to value + **************************************************************************/ + +/* utility macros for strip manager internal use only + */ +#define _is_local(bnd) ((bnd)->minLocal <= (bnd)->current && \ + (bnd)->current < (bnd)->maxLocal) +#define _is_global(bnd) ((bnd)->minGlobal <= (bnd)->current && \ + (bnd)->current < (bnd)->maxGlobal) +#define _is_local_contig(bnd,len) ((bnd)->minLocal <= (bnd)->current && \ + (bnd)->current+len <= (bnd)->maxLocal) +#define _is_global_contig(bnd,len) ((bnd)->minGlobal <= (bnd)->current && \ + (bnd)->current+len <= (bnd)->maxGlobal) +#define _byte_ptr(bnd) \ + (&(bnd)->strip->data[(bnd)->current - (bnd)->strip->start]) +#define _line_ptr(bnd) \ + (&(bnd)->strip->data \ + [(bnd)->pitch * ((bnd)->current - (bnd)->strip->start)]) +#define _release_ok(bnd) \ + (!ListEmpty(&(bnd)->stripLst) && \ + ((bnd)->current > (bnd)->stripLst.flink->end || !(bnd)->maxGlobal)) + +/************************************************************************** + * public data management macros for handling strip/scanline/other data + */ +#define AttendBand(bnd) ((bnd)->receptor->attend |= \ + (bnd)->receptor->active & 1<<(bnd)->band) +#define AttendReceptor(rcp) (rcp->attend = rcp->active) +#define IgnoreBand(bnd) ((bnd)->receptor->attend &= ~(1<<(bnd)->band)) +#define IgnoreReceptor(rcp) (rcp->attend = NO_BANDS) +#define SetBandFinal(bnd) ((bnd)->strip \ + ? ((bnd)->final = (bnd)->strip->final = TRUE) \ + : ((bnd)->final = TRUE)) +#define SetBandThreshold(bnd,value) \ + if( ((bnd)->threshold = value) > (bnd)->available) \ + (bnd)->receptor->ready &= ~(1<<(bnd)->band); \ + else (bnd)->receptor->ready |= 1<<(bnd)->band +#define TruncateStrip(bnd,value) \ + {(bnd)->current = (value); \ + if((bnd)->strip && _is_local(bnd)) { \ + int q = (bnd)->maxLocal - (value); \ + (bnd)->strip->length -= q; (bnd)->strip->end -= q; \ + (bnd)->available -= q + (bnd)->maxGlobal - (bnd)->maxLocal;\ + (bnd)->maxGlobal = (bnd)->maxLocal = value; }} + +/* return the current line/byte pointer (NULL if not currently available) + * floDefPtr flo; peTexPtr pet; bandPtr bnd; + */ +#define GetCurrentSrc(flo,pet,bnd) \ + (pointer)((bnd)->data ? (bnd)->data \ + : _is_global(bnd) \ + ? (*flo->stripVec->get_data)(flo,pet,bnd,1,FALSE) \ + : ((bnd)->data = NULL)) +#define GetCurrentDst(flo,pet,bnd) \ + (pointer)((bnd)->data ? (bnd)->data \ + : (*flo->stripVec->make_lines)(flo,pet,bnd,FALSE)) + +/* return the next sequential line/byte pointer (NULL if not available) + * floDefPtr flo; peTexPtr pet; bandPtr bnd; Bool purge; + */ +#define GetNextSrc(flo,pet,bnd,purge) \ + (pointer)(++(bnd)->current < (bnd)->maxLocal \ + ? ((bnd)->data += (bnd)->pitch) \ + : _is_global(bnd) \ + ? (*flo->stripVec->get_data)(flo,pet,bnd,1,purge) \ + : ((bnd)->data = NULL)) +#define GetNextDst(flo,pet,bnd,purge) \ + (pointer)(++(bnd)->current < (bnd)->maxLocal \ + ? ((bnd)->data += (bnd)->pitch) \ + : (*flo->stripVec->make_lines)(flo,pet,bnd,purge)) + +/* return the specified line/byte pointer (random access) + * (returns NULL if not available) + * floDefPtr flo; peTexPtr pet; bandPtr bnd; CARD32 unit; Bool purge; + */ +#define GetSrc(flo,pet,bnd,unit,purge) \ + (pointer)((bnd)->current = unit, _is_local(bnd) \ + ? ((bnd)->data = _line_ptr(bnd)) \ + : _is_global(bnd) \ + ? (*flo->stripVec->get_data)(flo,pet,bnd,1,purge) \ + : ((bnd)->data = NULL)) +#define GetDst(flo,pet,bnd,unit,purge) \ + (pointer)((bnd)->current = unit, _is_local(bnd) \ + ? ((bnd)->data = _line_ptr(bnd)) \ + : (*flo->stripVec->make_lines)(flo,pet,bnd,purge)) + +/* return the specified byte pointer with len contiguous bytes available + * (returns NULL if not available) + * floDefPtr flo; peTexPtr pet; bandPtr bnd; CARD32 unit, len; Bool purge; + * len -- number of contiguous bytes required + */ +#define GetSrcBytes(flo,pet,bnd,unit,len,purge) \ + (pointer)((bnd)->current = unit, _is_local_contig(bnd,len) \ + ? ((bnd)->data = _byte_ptr(bnd)) : _is_global(bnd) \ + ? (*flo->stripVec->get_data)(flo,pet,bnd,len,purge) \ + : ((bnd)->data = NULL)) +#define GetDstBytes(flo,pet,bnd,unit,len,purge) \ + (pointer)((bnd)->current = unit, _is_local_contig(bnd,len) \ + ? ((bnd)->data = _byte_ptr(bnd)) \ + : (*flo->stripVec->make_bytes)(flo,pet,bnd,len,purge)) + +/* load the data map with pointers to a range of lines + * upon return, bnd info points to unit (the first line mapped) + * returns TRUE if all requested lines are available, otherwise FALSE + * floDefPtr flo; peTexPtr pet; bandPtr bnd; + * CARD32 map, unit, len; Bool purge; + * map --- first dataMap index to use (normally 0), + * unit -- first line/byte number to map, + * len --- number of lines/bytes to map; + */ +#define MapData(flo,pet,bnd,map,unit,len,purge) \ + (*flo->stripVec->map_data)(flo,pet,bnd,map,unit,len,purge) + +/* release lines/bytes to downstream recipients (up to but not including unit), + * bnd->data is updated if unit is in current strip (else it is NULLed) + * returns TRUE if the element should suspend itself + * floDefPtr flo; peTexPtr pet; bandPtr bnd; CARD32 unit; + */ +#define PutData(flo,pet,bnd,unit) \ + ((bnd)->data = (bnd)->current == unit ? (bnd)->data \ + : ((bnd)->current = unit, _is_local(bnd) ? _line_ptr(bnd) : NULL), \ + _release_ok(bnd) ? (*flo->stripVec->put_data)(flo,pet,bnd) : FALSE) + +/* free lines/bytes (up to but not including unit) + * upon return, bnd info points to unit, if previously available + * floDefPtr flo; peTexPtr pet; bandPtr bnd; CARD32 unit; + */ +#define FreeData(flo,pet,bnd,unit) \ + ((bnd)->current = unit, (*flo->stripVec->free_data)(flo,pet,bnd)) + +/* import a list of strips from a Photomap + * floDefPtr flo; peTexPtr pet; bandPtr bnd; stripLstPtr strips; + */ +#define ImportStrips(flo,pet,bnd,strips) \ + (*flo->stripVec->import_strips)(flo,pet,bnd,strips) + +/* clone a strip and pass it on to downstream elements + * floDefPtr flo; peTexPtr pet; bandPtr bnd; stripPtr strip; + */ +#define PassStrip(flo,pet,bnd,strip) \ + (*flo->stripVec->pass_strip)(flo,pet,bnd,strip) + +/* check Src strip to see if its data can be over written + * floDefPtr flo; peTexPtr pet; bandPtr bnd; stripPtr strip; + */ +#define AlterSrc(flo,pet,strip) \ + (*flo->stripVec->alter_src)(flo,pet,strip) + +/* flush data from bnd to downstream elements, then set bnd in bypass mode + * floDefPtr flo; peTexPtr pet; bandPtr bnd; + */ +#define BypassSrc(flo,pet,bnd) \ + (*flo->stripVec->bypass_src)(flo,pet,bnd) + +/* disable any further input from bnd, and discard data if purge is true + * floDefPtr flo; peTexPtr pet; bandPtr bnd; Bool purge; + */ +#define DisableSrc(flo,pet,bnd,purge) \ + (*flo->stripVec->disable_src)(flo,pet,bnd,purge) + +/* disable any further output from bnd (i.e. send final, but no data) + * floDefPtr flo; peTexPtr pet; bandPtr bnd; + */ +#define DisableDst(flo,pet,bnd) \ + (*flo->stripVec->disable_dst)(flo,pet,bnd) + +#endif /* end _XIEH_STRIP */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/include/tex.h b/xie/xc/programs/Xserver/XIE/mixie/include/tex.h new file mode 100644 index 0000000..f186d2b --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/include/tex.h @@ -0,0 +1,161 @@ +/* $XConsortium: tex.h,v 1.4 94/04/17 20:35:06 rws Exp $ */ +/**** module tex.h ****/ +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + tex.h -- generic device dependent photoflo definitions + + Dean Verheiden -- AGE Logic, Inc. April 1993 + +*****************************************************************************/ + +#ifndef _XIEH_TEX +#define _XIEH_TEX + +/* symbolic constants -- for flo manager initialization routines + */ + /* Band mask constants for specifying all posible bands or no bands. + */ +#define ALL_BANDS ((bandMsk)~0) +#define NO_BANDS ((bandMsk) 0) + + /* Constant for specifying that in-place operations are not wanted + * (i.e. use new Dst buffers). The alternative is to specify a Src + * (e.g. SRCtag or SRCt1) whose buffer contents can be replaced with + * the result. When requesting a Dst line, the data manager will map + * the requested Dst line to the corresponding Src line (the Src and + * Dst canonic data types must match for this to work). + */ +#define NO_INPLACE ((INT32)-1) + + /* Constant for specifying that no space needs to be allotted for a + * data manager DataMap (i.e. data will be accessed on a line by line + * basis). The alternative is to specify the maximum number of lines + * that will be needed in the DataMap (anywhere from a few lines to + * the full image). + */ +#define NO_DATAMAP ((CARD32) 0) + + /* Constant for specifying that the element does not require any + * private parameter space. The alternative is to specify the number + * of bytes of private storage that will be needed for parameters etc. + * The private area is allocated as contiguous bytes beyond the peTex + * structure, and therefore should not be freed explicitly. + */ +#define NO_PRIVATE ((CARD32) 0) + + /* Constants for specifying whether or not the data manager and + * scheduler should cooperate to keep inputs and/or bands in sync. + */ +#define SYNC ((Bool) 1) +#define NO_SYNC ((Bool) 0) + + +/* symbolic constants -- for data manager macros + */ + /* The following pair of constants can be supplied for the "purge" + * argument in many of the data manager's strip access macros. + * + * KEEP specifies that all data currently owned by the Src or Dst + * should be retained (either the data will be needed again or there + * is no advantage in releasing the data as it is consumed). + * + * FLUSH specifies that all data that precedes the current unit (line + * or byte) can be dispensed with. Src data may be freed, whereas Dst + * data may be forwarded to downstream elements. FLUSH is a suggestion + * rather than a command. Whether or not the data is actually flushed + * depends on the crossing of strip boundaries. If one or more strips + * precede the strip containing the current unit, they will be flushed. + * If a downstream element becomes runnable as a result of forwarding + * a Dst strip, the data manager will signal to the calling element + * that it should defer to the downstream element(s). + */ +#define KEEP ((Bool) 0) +#define FLUSH ((Bool) 1) + + +#ifndef _XIEC_FLOMAN +extern int InitFloManager(); +extern int MakePETex(); +extern Bool InitReceptors(); +extern Bool InitReceptor(); +extern Bool InitEmitter(); +extern Bool InitBand(); +extern void ResetReceptors(); +extern void ResetEmitter(); +#endif + +#ifndef _XIEC_SCHED +extern int InitScheduler(); +#endif + +#ifndef _XIEC_STRIP +extern int InitStripManager(); +extern int DebriefStrips(); +extern void FreeStrips(); +#endif + +#endif /* end _XIEH_TEX */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/include/texstr.h b/xie/xc/programs/Xserver/XIE/mixie/include/texstr.h new file mode 100644 index 0000000..8122aa1 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/include/texstr.h @@ -0,0 +1,151 @@ +/* $XConsortium: texstr.h,v 1.6 95/05/18 21:15:45 dpw Exp $ */ +/**** module texstr.h ****/ +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + texstr.h -- DDXIE generic photoflo execution context structures + + Dean Verheiden, Robert NC Shelley -- AGE Logic, Inc. April 1993 + +*****************************************************************************/ + +#ifndef _XIEH_TEXSTR +#define _XIEH_TEXSTR + +#include +#include +#include +#include + +#include + +/* + * link-pair for managing a circular doubly linked list of peTexRecs + */ +typedef struct _petlst { + struct _petex *flink; + struct _petex *blink; +} petLstRec, *petLstPtr; + +/* + * photoflo execution context structure + */ +typedef struct _flotex { + CARD32 imports; /* number of bands receiving client data */ + CARD32 exports; /* number of bands supplying client data */ + CARD32 exitCnt; /* incremented each time scheduler exits */ + petLstRec schedHead; /* list of scheduled elements */ + stripLstRec stripHead; /* list of reusable strips */ + CARD32 stripSize; /* size of standard cachable strips */ + CARD32 putCnt; /* incremented each time a strip is "Put" */ + pointer yieldPtr; /* yielding info ptr */ +} floTexRec, *floTexPtr; + +/* + * receptor data structure + */ +typedef struct _receptor { + /* set of per-band Boolean flags: */ + bandMsk admit; /* bands that will admit more data */ + bandMsk ready; /* bands with available >= threshold */ + bandMsk active; /* bands that will produce more data */ + bandMsk attend; /* bands to consider when scheduling */ + bandMsk bypass; /* bands that bypass this element */ + bandMsk forward; /* bands that forward input when freed*/ + CARD8 pad[2]; + inFloPtr inFlo; /* pointer to receptor's inFlo */ + bandRec band[xieValMaxBands]; /* per-band input context */ +} receptorRec, *receptorPtr; + +/* + * photo element execution context structure + */ +typedef struct _petex { + struct _petex *flink; /* foreword link for scheduler list */ + struct _petex *blink; /* backword link for scheduler list */ + peDefPtr peDef; /* pointer to the DIXIE element def */ + outFloPtr outFlo; /* pointer to element's outFlo */ + receptorPtr receptor; /* pointer to in-line receptors */ + pointer private; /* pointer to in-line private info */ + CARD32 schedCnt; /* to detect that scheduler has resumed */ + CARD32 admissionCnt; /* number of receptors expecting data */ + BOOL inSync; /* true if inputs must be kept in sync */ + BOOL bandSync; /* true if bands must be kept in sync */ + bandMsk scheduled; /* bits set if element is on ready-list */ + bandMsk emitting; /* mask of bands that are emitting data */ + bandRec emitter[xieValMaxBands]; /* per-band output context */ + pointer roi; /* pointer to run length/control plane */ + Bool (*roiinit)(); /* process domain line setup function */ + INT32 (*roiget)(); /* process domain run length function */ + INT32 domXoff; /* processing domain x offset */ + INT32 domYoff; /* processing domain y offset */ +#if 0 + receptorRec receptor[inCnt]; /* array of in-line input receptors */ + void private_info; /* in-line element-private data */ +#endif +} peTexRec, *peTexPtr; + +#endif /* end _XIEH_TEXSTR */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/include/xiemd.h b/xie/xc/programs/Xserver/XIE/mixie/include/xiemd.h new file mode 100644 index 0000000..0af18a6 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/include/xiemd.h @@ -0,0 +1,227 @@ +/* $XConsortium: xiemd.h /main/8 1995/12/02 16:54:22 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module xiemd.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +****************************************************************************** + + xiemd.h -- DDXIE MI prototype Machine Dependent definitions + + Larry Hare -- AGE Logic, Inc. June 1993 + +*****************************************************************************/ + +#ifndef _XIEH_MD +#define _XIEH_MD + +#include +#include +#include "misc.h" /* for pointer */ +#include + +#ifndef _XIEC_MPBITFUN +extern unsigned char _ByteReverseTable[]; +#endif + +/* +** Bit operations: +** +** DATATYPE DEPENDENT: +** LogInt - Should be chosen as the largest efficient unsigned type which +** supports C based logical operations, as well as loads and +** stores. This will usually be 32 bit unsigned long, but +** might conceivably be an 64 bit type on some newer machines. +** If you change this, update LOGSHIFT. +** LOGSHIFT - Log2 of LOGSIZE +** LOGSIZE - Size of LogInt in bits. You should make sure your compiler +** knows that this is really 32 and not (4<<3). +** LOGMASK - Make sure your compiler thinks this is 31 and not ((4<<3)-1) +** +** ENDIAN DEPENDENT: +** LOGLEFT - LeftMost bit (from screen perspective) in a LogInt. +** LOGRIGHT - In place shift of a LogInt right 1 bit (in screen perspective)> +** +** LOGINDX,LOGBIT - Used by LOG_xxxbit macros for individual access to bits. +** LOG_tstbit - test if a bit from memory is set. +** LOG_chgbit - test if a bit in memory differs from a constant. +** LOG_setbit,LOG_clrbit,LOG_xorbit - set, clr, or xor a bit in memory. +** +** Some pieces of bit related code have been written to use word loops +** using LogInt Bits at a time. Some algorithms use LOG_xxxbit macros +** to access individual bits. +*/ + +#ifdef LONG64 +typedef CARD64 LogInt; +#define LOGSHIFT (6) +#else +typedef CARD32 LogInt; +#define LOGSHIFT (5) +#endif +#define LOGSIZE (sizeof(LogInt)<<3) +#define LOGMASK (LOGSIZE-1) + +#if (IMAGE_BYTE_ORDER == MSBFirst) +#define BitLeft(V,N) ((V) << (N)) +#define BitRight(V,N) ((V) >> (N)) +#else +#define BitLeft(V,N) ((V) >> (N)) +#define BitRight(V,N) ((V) << (N)) +#endif /* endian type */ + +#define LOGLEFT BitLeft(((LogInt)~0),LOGMASK) +#define LOGRIGHT(M) (M=BitRight(M,1)) +#define LOGONES ~((LogInt)0) +#define LOGZERO ((LogInt)0) + +#define LOGINDX(X) ((X)>>LOGSHIFT) +#define LOGBIT(X) BitRight(LOGLEFT,(X) & LOGMASK) +#define LOG_chgbit(P,N,C) (((P)[LOGINDX(N)] ^ C) & LOGBIT(N)) +#define LOG_tstbit(P,N) ((P)[LOGINDX(N)] & LOGBIT(N)) +#define LOG_clrbit(P,N) ((P)[LOGINDX(N)] &= ~LOGBIT(N)) +#define LOG_setbit(P,N) ((P)[LOGINDX(N)] |= LOGBIT(N)) +#define LOG_xorbit(P,N) ((P)[LOGINDX(N)] ^= LOGBIT(N)) + +/* Special version for unsigned bytes used for byte streams that might not be + LogInt aligned +*/ +typedef unsigned char LogByte; +#define LOGBYTESHIFT (3) +#define LOGBYTESIZE (sizeof(LogByte)<<3) +#define LOGBYTEMASK (LOGBYTESIZE-1) + +#define LOGBYTELEFT (LogByte)BitLeft(((LogByte)~0),LOGBYTEMASK) +#define LOGBYTERIGHT(M) (LogByte)(M=BitRight(M,1)) +#define LOGBYTEONES ~((LogByte)0) +#define LOGBYTEZERO ((LogByte)0) + +#define LOGBYTEINDX(X) ((X)>>LOGBYTESHIFT) +#define LOGBYTEBIT(X) BitRight(LOGBYTELEFT,(X) & LOGBYTEMASK) +#define LOGBYTE_chgbit(P,N,C) (((P)[LOGBYTEINDX(N)] ^ C) & LOGBYTEBIT(N)) +#define LOGBYTE_tstbit(P,N) ((P)[LOGBYTEINDX(N)] & LOGBYTEBIT(N)) +#define LOGBYTE_clrbit(P,N) ((P)[LOGBYTEINDX(N)] &= ~LOGBYTEBIT(N)) +#define LOGBYTE_setbit(P,N) ((P)[LOGBYTEINDX(N)] |= LOGBYTEBIT(N)) +#define LOGBYTE_xorbit(P,N) ((P)[LOGBYTEINDX(N)] ^= LOGBYTEBIT(N)) +/* +** Bit Fun. Fun with Bits. Functions for bits: +** +** bitexpand() - expand a bunch of bits to fg,bg bytes. +*/ + +pointer bitexpand(); +void bitshrink(); +void action_clear(); +void action_set(); +void action_invert(); +void zero_even(); + +/* +** Floating Point Considerations. +** +** The following definitions are used in individual modules. We might +** want to regularaize all these in this one file, or even make these +** into one tyepdef like ProcessFloat. The goal is so that the server +** can consistently use floats instead of doubles on machines which +** can do floats quicker than doubles: +** +** typedef float BlendFloat; (see mpblend.c) +** typedef float ConstrainFloat; (see mpcnst.c) +** typedef float DitherFloat; (see mpdither.c) +** typedef float ConvolveFloat; (see element.h) +** typedef float PasteUpFloat; (see element.h) +** +** Some functions are not yet written to this standard. For instance +** geometry is susceptible to roundoff errors keeping track of scanline +** threshold data maps. +** +** typedef RealPixel GeomFloat; +*/ + +/* +** USE_FLOATS is used in mpcnst.c to enable the originaly easy to +** program floating point ClipScale routines. The current integer +** based routine no longer does a divide and is hence probably faster +** on all rational machines. We may come up with other choices for +** integer versus floating algorithms in the future. We would perhaps +** like to select between them here. +** +** #define USE_FLOATS +*/ + +/* +** SF_DITHER - use scaled fractions in floyd steinberg dither for byte +** and pair pixels; quad pixel operations are still done with floats. +** If you have software floating point, you will definitely want to turn +** this code on. Machines with an fpu generally perform at least as good +** with the floating point code. +** +** #define SF_DITHER +*/ + +#if defined(_AM29K) || defined(__i960__) || defined(_LR33020_) || defined(gsp) +#define SF_DITHER +#endif + +#endif /* module _XIEH_MD */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/Imakefile b/xie/xc/programs/Xserver/XIE/mixie/jpeg/Imakefile new file mode 100644 index 0000000..40dc802 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/Imakefile @@ -0,0 +1,65 @@ +XCOMM $XConsortium: Imakefile,v 1.8 93/11/07 10:58:31 rws Exp $ +XCOMM build device dependent machine independent fax processing element objects +#include + + + SRCS = jcdeflts.c \ + jcexpand.c \ + jchuff.c \ + jcmcu.c \ + jcsample.c \ + jcxie.c \ + jcxief.c \ + jdbuffer.c \ + jddeflts.c \ + jdhuff.c \ + jdlossy.c \ + jdmcu.c \ + jdsample.c \ + jdxie.c \ + jdxief.c \ + jelossy.c \ + jfwddct.c \ + jmemmgr.c \ + jmemsys.c \ + jrdjfif.c \ + jrevdct.c \ + jutils.c \ + jwrjfif.c + + OBJS = jcdeflts.o \ + jcexpand.o \ + jchuff.o \ + jcmcu.o \ + jcsample.o \ + jcxie.o \ + jcxief.o \ + jdbuffer.o \ + jddeflts.o \ + jdhuff.o \ + jdlossy.o \ + jdmcu.o \ + jdsample.o \ + jdxie.o \ + jdxief.o \ + jelossy.o \ + jfwddct.o \ + jmemmgr.o \ + jmemsys.o \ + jrdjfif.o \ + jrevdct.o \ + jutils.o \ + jwrjfif.o + + INCLUDES = -I../include -I../../include -I$(SERVERSRC)/include -I$(INCLUDESRC) -I$(INCLUDESRC)/extensions -I../jpeg + LINTLIBS = ../../dixie/export/llib-lexp.ln ../../dixie/import/llib-limp.ln \ + ../../dixie/process/llib-lproc.ln ../../dixie/request/llib-lreq.ln \ + ../control/llib-lctrl.ln ../export/llib-lmexp.ln ../fax/llib-lfax.ln \ + ../import/llib-lmimp.ln ../jpeg/llib-ljpeg.ln ../process/llib-lmproc.ln + +SubdirLibraryRule($(OBJS)) +NormalLibraryObjectRule() +LintLibraryTarget(jpeg,$(SRCS)) +NormalLintTarget($(SRCS)) + +DependTarget() diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/README b/xie/xc/programs/Xserver/XIE/mixie/jpeg/README new file mode 100644 index 0000000..1ab0d4d --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/README @@ -0,0 +1,402 @@ +/* $XConsortium: README,v 1.2 93/11/07 10:25:48 rws Exp $ */ +The Independent JPEG Group's JPEG software +========================================== + +README for release 4 of 10-Dec-92 +================================= + +This distribution contains the fourth public release of the Independent JPEG +Group's free JPEG software. You are welcome to redistribute this software and +to use it for any purpose, subject to the conditions under LEGAL ISSUES, below. + +For installation instructions, see file SETUP. + +For usage instructions, see file USAGE (or the cjpeg.1 and djpeg.1 manual +pages; but USAGE contains a "hints" section not found in the manual pages). +Useful information can also be found in the JPEG FAQ (Frequently Asked +Questions) article; see ARCHIVE LOCATIONS below to obtain the FAQ article. + +This software is still undergoing revision. Updated versions may be obtained +by FTP or UUCP to UUNET and other archive sites; see ARCHIVE LOCATIONS below +for details. + +Serious users of this software (particularly those incorporating it into +larger programs) should contact jpeg-info@uunet.uu.net to be added to our +electronic mailing list. Mailing list members are notified of updates and +have a chance to participate in technical discussions, etc. + +This software is the work of Tom Lane, Philip Gladstone, Luis Ortiz, +Lee Crocker, Ge' Weijers, and other members of the Independent JPEG Group. + + +DISCLAIMER +========== + +THIS SOFTWARE IS NOT COMPLETE NOR FULLY DEBUGGED. It is not guaranteed to be +useful for anything, nor to be compatible with subsequent releases, nor to be +an accurate implementation of the JPEG standard. (See LEGAL ISSUES for even +more disclaimers.) + +Despite that, we believe that this software is pretty good, and if you find +any problems with it, we'd like to know about them. Please report problems +by e-mail to jpeg-info@uunet.uu.net. + + +WHAT'S HERE +=========== + +This distribution contains C software to implement JPEG image compression and +decompression. JPEG (pronounced "jay-peg") is a standardized compression +method for full-color and gray-scale images. JPEG is intended for compressing +"real-world" scenes; cartoons and other non-realistic images are not its +strong suit. JPEG is lossy, meaning that the output image is not necessarily +identical to the input image. Hence you must not use JPEG if you have to have +identical output bits. However, on typical images of real-world scenes, very +good compression levels can be obtained with no visible change, and amazingly +high compression levels are possible if you can tolerate a low-quality image. +For more details, see the references, or just experiment with various +compression settings. + +The software implements JPEG baseline and extended-sequential compression +processes. Provision is made for supporting all variants of these processes, +although some uncommon parameter settings aren't implemented yet. For legal +reasons, we are not distributing code for the arithmetic-coding process; see +LEGAL ISSUES. At present we have made no provision for supporting the +progressive, hierarchical, or lossless processes defined in the standard. + +In order to support file conversion and viewing software, we have included +considerable functionality beyond the bare JPEG coding/decoding capability; +for example, the color quantization modules are not strictly part of JPEG +decoding, but they are essential for output to colormapped file formats or +colormapped displays. These extra functions can be compiled out if not +required for a particular application. + +The emphasis in designing this software has been on achieving portability and +flexibility, while also making it fast enough to be useful. In particular, +the software is not intended to be read as a tutorial on JPEG. (See the +REFERENCES section for introductory material.) While we hope that the entire +package will someday be industrial-strength code, much remains to be done in +performance tuning and in improving the capabilities of individual modules. + + +This software can be used on several levels: + +* As canned software for JPEG compression and decompression. Just edit the + Makefile and configuration files as needed (see file SETUP), compile and go. + Members of the Independent JPEG Group will improve the out-of-the-box + functionality and speed as time goes on. + +* As the basis for other JPEG programs. For example, you could incorporate + the decompressor into a general image viewing package by replacing the + output module with write-to-screen functions. For an implementation on + specific hardware, you might want to replace some of the inner loops with + assembly code. For a non-command-line-driven system, you might want a + different user interface. (Members of the group will be producing Macintosh + and Amiga versions with more appropriate user interfaces, for example.) + +* As a toolkit for experimentation with JPEG and JPEG-like algorithms. Most + of the individual decisions you might want to mess with are packaged up into + separate modules. For example, the details of color-space conversion and + subsampling techniques are each localized in one compressor and one + decompressor module. You'd probably also want to extend the user interface + to give you more detailed control over the JPEG compression parameters. + +In particular, we welcome the use of this software as a component of commercial +products; no royalty is required. + + +ARCHIVE LOCATIONS +================= + +The "official" archive site for this software is ftp.uu.net (Internet +address 137.39.1.9 or 192.48.96.9). The most recent released version can +always be found there in directory graphics/jpeg. This particular version +will be archived as jpegsrc.v4.tar.Z. If you are on the Internet, you can +retrieve files from UUNET by anonymous FTP. If you don't have FTP access, +UUNET's archives are also available via UUCP; contact postmaster@uunet.uu.net +for information on retrieving files that way. + +Numerous Internet sites maintain copies of the UUNET files; in particular, +you can probably find a copy at any site that archives comp.sources.misc +submissions. However, only ftp.uu.net is guaranteed to have the latest +official version. + +You can also obtain this software from CompuServe, in the GRAPHSUPPORT forum +(GO PICS), library 15; this version will be file jpsrc4.zip. Again, +CompuServe is not guaranteed to have the very latest version. + +The JPEG FAQ (Frequently Asked Questions) article is a useful source of +general information about JPEG. It is updated constantly and therefore +is not included in this distribution. The FAQ is posted every two weeks +to Usenet newsgroups comp.graphics, news.answers, and other groups. You +can always obtain the latest version from the news.answers archive at +rtfm.mit.edu (18.172.1.27). By FTP, fetch /pub/usenet/news.answers/jpeg-faq. +If you don't have FTP, send e-mail to mail-server@rtfm.mit.edu with body +"send usenet/news.answers/jpeg-faq". + + +SUPPORTING SOFTWARE +=================== + +You will probably want Jef Poskanzer's PBMPLUS image software, which provides +many useful operations on PPM-format image files. In particular, it can +convert PPM images to and from a wide range of other formats. You can FTP +this free software from export.lcs.mit.edu (contrib/pbmplus*.tar.Z) or +ftp.ee.lbl.gov (pbmplus*.tar.Z). Unfortunately PBMPLUS is not nearly as +portable as the JPEG software is; you are likely to have difficulty making it +work on any non-Unix machine. + +If you are using X Windows you might want to use the xv or xloadimage viewers +to save yourself the trouble of converting PPM to some other format. Both of +these can be found in the contrib directory at export.lcs.mit.edu. Actually, +xv version 2.00 and up incorporates our software and thus can read and write +JPEG files directly. (NOTE: since xv internally reduces all images to 8 +bits/pixel, a JPEG file written by xv will not be very high quality; and xv +cannot fully exploit a 24-bit display. These problems are expected to go away +in the next xv release, planned for early 1993. In the meantime, use +xloadimage for 24-bit displays.) + +For DOS machines, Lee Crocker's free Piclab program is a useful companion to +the JPEG software. The latest version, currently 1.91, is available by FTP +from SIMTEL20 and its various mirror sites, file piclb191.zip. +CompuServe also has it, in the same library as the JPEG software. + + +SOFTWARE THAT'S NO HELP AT ALL +============================== + +Handmade Software's shareware PC program GIF2JPG produces files that are +totally incompatible with our programs. They use a proprietary format that is +an amalgam of GIF and JPEG representations. However, you can force GIF2JPG +to produce compatible files with its -j switch, and their decompression +program JPG2GIF can read our files (at least ones produced with our default +option settings). + +Some commercial JPEG implementations are also incompatible as of this writing, +especially programs released before summer 1991. The root of the problem is +that the ISO JPEG committee failed to specify a concrete file format. Some +vendors "filled in the blanks" on their own, creating proprietary formats that +no one else could read. (For example, none of the early commercial JPEG +implementations for the Macintosh were able to exchange compressed files.) + +The file format we have adopted is called JFIF (see REFERENCES). This format +has been agreed to by a number of major commercial JPEG vendors, and we expect +that it will become the de facto standard. JFIF is a minimal representation; +work is also going forward to incorporate JPEG compression into the TIFF 6.0 +standard, for use in "high end" applications that need to record a lot of +additional data about an image. We intend to support TIFF 6.0 in the future. +We hope that these two formats will be sufficient and that other, incompatible +JPEG file formats will not proliferate. + +Indeed, part of the reason for developing and releasing this free software is +to help force rapid convergence to de facto standards for JPEG file formats. +SUPPORT STANDARD, NON-PROPRIETARY FORMATS: demand JFIF or TIFF 6.0! + + +USING JPEG AS A SUBROUTINE IN A LARGER PROGRAM +============================================== + +You can readily incorporate the JPEG compression and decompression routines in +a larger program. The file example.c provides a skeleton of the interface +routines you'll need for this purpose. Essentially, you replace jcmain.c (for +compression) and/or jdmain.c (for decompression) with your own code. Note +that the fewer JPEG options you allow the user to twiddle, the less code you +need; all the default options are set up automatically. (Alternately, if you +know a lot about JPEG or have a special application, you may want to twiddle +the default options even more extensively than jcmain/jdmain do.) + +Most likely, you will want the uncompressed image to come from memory (for +compression) or go to memory or the screen (for decompression). For this +purpose you must provide image reading or writing routines that match the +interface used by the image file I/O modules (jrdXXX or jwrXXX); again, +example.c shows a skeleton of what is required. In this situation, you +won't need any of the non-JPEG image file I/O modules used by cjpeg and djpeg. + +By default, any error detected inside the JPEG routines will cause a message +to be printed on stderr, followed by exit(). You can override this behavior +by supplying your own message-printing and/or error-exit routines; again, +example.c shows how. + +We recommend you create libjpeg.a as shown in the Makefile, then link that +with your surrounding program. (If your linker is at all reasonable, only the +code you actually need will get loaded.) Include the files jconfig.h and +jpegdata.h in C files that need to call the JPEG routines. + +CAUTION: some people have tried to compile JPEG and their surrounding code +with different compilers, e.g., cc for JPEG and c++ or gcc for the rest. This +is a Real Bad Move and you will deserve what happens to you if you try it. +(Hint: the parameter structures can get laid out differently with no warning.) + +Read our "architecture" file for more info. If it seems to you that the +software structure doesn't accommodate what you want to do, please contact +the authors. + +Beginning with version 3, we will endeavor to hold the interface described by +example.c constant, so that you can plug in updated versions of the JPEG code +just by recompiling. However, we can't guarantee this, especially if you +choose to twiddle any JPEG options not listed in example.c. Check the +CHANGELOG when installing any new version, and compare example.c against the +prior version. Recompile your calling software (don't just relink), as we may +add or subtract fields in the parameter structures. + + +REFERENCES +========== + +We highly recommend reading one or more of these references before trying to +understand the innards of any JPEG software. + +The best short technical introduction to the JPEG compression algorithm is + Wallace, Gregory K. "The JPEG Still Picture Compression Standard", + Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44. +(Adjacent articles in that issue discuss MPEG motion picture compression, +applications of JPEG, and related topics.) If you don't have the CACM issue +handy, a PostScript file containing a revised version of the article is +available at ftp.uu.net, graphics/jpeg/wallace.ps.Z. The file (actually a +preprint for an article to appear in IEEE Trans. Consumer Electronics) omits +the sample images that appeared in CACM, but it includes corrections and some +added material. Note: the Wallace article is copyright ACM and IEEE, and it +may not be used for commercial purposes. + +A somewhat less technical, more leisurely introduction to JPEG can be found in +"The Data Compression Book" by Mark Nelson, published by M&T Books (Redwood +City, CA), 1991, ISBN 1-55851-216-0. This book provides good explanations and +example C code for a multitude of compression methods including JPEG. It is +an excellent source if you are comfortable reading C code but don't know much +about data compression in general. The book's JPEG sample code is far from +industrial-strength, but when you are ready to look at a full implementation, +you've got one here... + +A new textbook about JPEG is "JPEG Still Image Data Compression Standard" by +William B. Pennebaker and Joan L. Mitchell, published by Van Nostrand +Reinhold, 1993, ISBN 0-442-01272-1. Price US$59.95. This book includes the +complete text of the ISO JPEG standards (DIS 10918-1 and draft DIS 10918-2). +This is by far the most complete exposition of JPEG in existence, and I highly +recommend it. If you read the entire book, you will probably know more about +JPEG than I do. + +The JPEG standard itself is not available electronically; you must order a +paper copy through ISO. (Unless you are concerned about having a certified +official copy, I recommend buying the Pennebaker and Mitchell book instead; +it's much cheaper and includes a great deal of useful explanatory material.) +In the US, copies of the standard may be ordered from ANSI Sales at (212) +642-4900. It's not cheap: as of 1992, Part 1 is $95 and Part 2 is $47, plus +7% shipping/handling. The standard is divided into two parts, Part 1 being +the actual specification, while Part 2 covers compliance testing methods. +As of early 1992, Part 1 has Draft International Standard status. It is +titled "Digital Compression and Coding of Continuous-tone Still Images, Part +1: Requirements and guidelines" and has document number ISO/IEC DIS 10918-1. +Part 2 is still at Committee Draft status. It is titled "Digital Compression +and Coding of Continuous-tone Still Images, Part 2: Compliance testing" and +has document number ISO/IEC CD 10918-2. (NOTE: I'm told that the final +version of Part 2 will differ considerably from the CD draft.) + +The JPEG standard does not specify all details of an interchangeable file +format. For the omitted details we follow the "JFIF" conventions, revision +1.02. A copy of the JFIF spec is available from: + Literature Department + C-Cube Microsystems, Inc. + 399A West Trimble Road + San Jose, CA 95131 + (408) 944-6300 +A PostScript version of this document is available at ftp.uu.net, file +graphics/jpeg/jfif.ps.Z. It can also be obtained by e-mail from the C-Cube +mail server, netlib@c3.pla.ca.us. Send the message "send jfif_ps from jpeg" +to the server to obtain the JFIF document; send the message "help" if you have +trouble. + +The TIFF 6.0 file format specification can be obtained by FTP from sgi.com +(192.48.153.1), file graphics/tiff/TIFF6.ps.Z; or you can order a printed copy +from Aldus Corp. at (206) 628-6593. It should be noted that the TIFF 6.0 spec +of 3-June-92 has a number of serious problems in its JPEG features. A +clarification note will probably be needed to ensure that TIFF JPEG files are +compatible across different implementations. The IJG does not intend to +support TIFF 6.0 until these problems are resolved. + +If you want to understand this implementation, start by reading the +"architecture" documentation file. Please read "codingrules" if you want to +contribute any code. + + +LEGAL ISSUES +============ + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991, 1992, Thomas G. Lane. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +ansi2knr.c is included in this distribution by permission of L. Peter Deutsch, +sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA. +ansi2knr.c is NOT covered by the above copyright and conditions, but instead +by the usual distribution terms of the Free Software Foundation; principally, +that you must include source code if you redistribute it. (See the file +ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part +of any program generated from the JPEG code, this does not limit you more than +the foregoing paragraphs do. + + +It appears that the arithmetic coding option of the JPEG spec is covered by +patents owned by IBM and AT&T, as well as a pending Japanese patent of +Mitsubishi. Hence arithmetic coding cannot legally be used without obtaining +one or more licenses. For this reason, support for arithmetic coding has been +removed from the free JPEG software. (Since arithmetic coding provides only a +marginal gain over the unpatented Huffman mode, it is unlikely that very many +implementors will support it. If you do obtain the necessary licenses, +contact jpeg-info@uunet.uu.net for a copy of our arithmetic coding modules.) +So far as we are aware, there are no patent restrictions on the remaining +code. + + +We are required to state that + "The Graphics Interchange Format(c) is the Copyright property of + CompuServe Incorporated. GIF(sm) is a Service Mark property of + CompuServe Incorporated." + + +TO DO +===== + +The next major release will probably be a significant rewrite to allow use of +this code in conjunction with Sam Leffler's free TIFF library (assuming the +bugs in the TIFF 6.0 specification get resolved). + +Many of the modules need fleshing out to provide more complete +implementations, or to provide faster paths for common cases. +Speeding things up is still high on our priority list. + +We'd appreciate it if people would compile and check out the code on as wide a +variety of systems as possible, and report any portability problems +encountered (with solutions, if possible). Checks of file compatibility with +other JPEG implementations would also be of interest. Finally, we would +appreciate code profiles showing where the most time is spent, especially on +unusual systems. + +Please send bug reports, offers of help, etc. to jpeg-info@uunet.uu.net. diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jcdeflts.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jcdeflts.c new file mode 100644 index 0000000..a0a5fa2 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jcdeflts.c @@ -0,0 +1,632 @@ +/* $XConsortium: jcdeflts.c,v 1.4 94/04/17 20:35:27 rws Exp $ */ +/* Module jcdeflts.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., October 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ +/* + * jcdeflts.c + * + * Copyright (C) 1991, 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains optional default-setting code for the JPEG compressor. + * User interfaces do not have to use this file, but those that don't use it + * must know a lot more about the innards of the JPEG code. + */ + +#include "jinclude.h" + +#ifndef XIE_SUPPORTED +/* Default do-nothing progress monitoring routine. + * This can be overridden by a user interface that wishes to + * provide progress monitoring; just set methods->progress_monitor + * after j_c_defaults is done. The routine will be called periodically + * during the compression process. + * + * During any one pass, loopcounter increases from 0 up to (not including) + * looplimit; the step size is not necessarily 1. Both the step size and + * the limit may differ between passes. The expected total number of passes + * is in cinfo->total_passes, and the number of passes already completed is + * in cinfo->completed_passes. Thus the fraction of work completed may be + * estimated as + * completed_passes + (loopcounter/looplimit) + * ------------------------------------------ + * total_passes + * ignoring the fact that the passes may not be equal amounts of work. + */ + +METHODDEF void +progress_monitor (compress_info_ptr cinfo, long loopcounter, long looplimit) +{ + /* do nothing */ +} +#endif /* XIE_SUPPORTED */ + + +/* + * Huffman table setup routines + */ + +#ifdef XIE_SUPPORTED +GLOBAL int +#if NeedFunctionPrototypes +add_huff_table (compress_info_ptr cinfo, + HUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val) +#else +add_huff_table (cinfo, htblptr, bits, val) + compress_info_ptr cinfo; + HUFF_TBL **htblptr; + const UINT8 *bits; + const UINT8 *val; +#endif /* NeedFunctionPrototypes */ +#else +LOCAL void +add_huff_table (compress_info_ptr cinfo, + HUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val) +#endif /* XIE_SUPPORTED */ +/* Define a Huffman table */ +{ +#ifdef XIE_SUPPORTED + if (*htblptr == NULL) + *htblptr = (HUFF_TBL *) (*cinfo->emethods->c_alloc_small) + (cinfo, SIZEOF(HUFF_TBL)); + if (*htblptr == NULL) + return(XIE_ERR); +#else + if (*htblptr == NULL) + *htblptr = (HUFF_TBL *) (*cinfo->emethods->alloc_small) (SIZEOF(HUFF_TBL)); +#endif /* XIE_SUPPORTED */ + + MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits)); + MEMCOPY((*htblptr)->huffval, val, SIZEOF((*htblptr)->huffval)); + + /* Initialize sent_table FALSE so table will be written to JPEG file. + * In an application where we are writing non-interchange JPEG files, + * it might be desirable to save space by leaving default Huffman tables + * out of the file. To do that, just initialize sent_table = TRUE... + */ + + (*htblptr)->sent_table = FALSE; +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +std_huff_tables (compress_info_ptr cinfo) +#else +std_huff_tables (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +LOCAL void +std_huff_tables (compress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */ +/* IMPORTANT: these are only valid for 8-bit data precision! */ +{ + static const UINT8 dc_luminance_bits[17] = + { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; + static const UINT8 dc_luminance_val[] = + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + + static const UINT8 dc_chrominance_bits[17] = + { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; + static const UINT8 dc_chrominance_val[] = + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + + static const UINT8 ac_luminance_bits[17] = + { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d }; + static const UINT8 ac_luminance_val[] = + { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, + 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, + 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, + 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, + 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, + 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, + 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, + 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, + 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, + 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, + 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa }; + + static const UINT8 ac_chrominance_bits[17] = + { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 }; + static const UINT8 ac_chrominance_val[] = + { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, + 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, + 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, + 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, + 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, + 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, + 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, + 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, + 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, + 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, + 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, + 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, + 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, + 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa }; + +#ifdef XIE_SUPPORTED + if(XIE_ERR == add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0], + dc_luminance_bits, dc_luminance_val)) + return(XIE_ERR); + if(XIE_ERR == add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0], + ac_luminance_bits, ac_luminance_val)) + return(XIE_ERR); + if(XIE_ERR == add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1], + dc_chrominance_bits, dc_chrominance_val)) + return(XIE_ERR); + if(XIE_ERR == add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1], + ac_chrominance_bits, ac_chrominance_val)) + return(XIE_ERR); + return(0); +#else + add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0], + dc_luminance_bits, dc_luminance_val); + add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0], + ac_luminance_bits, ac_luminance_val); + add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1], + dc_chrominance_bits, dc_chrominance_val); + add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1], + ac_chrominance_bits, ac_chrominance_val); +#endif /* XIE_SUPPORTED */ +} + + +/* + * Quantization table setup routines + */ + +#ifdef XIE_SUPPORTED +GLOBAL int +#if NeedFunctionPrototypes +j_add_quant_table (compress_info_ptr cinfo, int which_tbl, + const QUANT_VAL *basic_table, int scale_factor, + boolean force_baseline) +#else +j_add_quant_table (cinfo, which_tbl, basic_table, scale_factor, force_baseline) + compress_info_ptr cinfo; + int which_tbl; + const QUANT_VAL *basic_table; + int scale_factor; + boolean force_baseline; +#endif /* NeedFunctionPrototypes */ +#else +GLOBAL void +j_add_quant_table (compress_info_ptr cinfo, int which_tbl, + const QUANT_VAL *basic_table, int scale_factor, + boolean force_baseline) +#endif /* XIE_SUPPORTED */ +/* Define a quantization table equal to the basic_table times + * a scale factor (given as a percentage). + * If force_baseline is TRUE, the computed quantization table entries + * are limited to 1..255 for JPEG baseline compatibility. + */ +{ + QUANT_TBL_PTR * qtblptr = & cinfo->quant_tbl_ptrs[which_tbl]; + int i; + long temp; + +#ifdef XIE_SUPPORTED + if (*qtblptr == NULL) + *qtblptr = (QUANT_TBL_PTR) (*cinfo->emethods->c_alloc_small) + (cinfo, SIZEOF(QUANT_TBL)); + if (*qtblptr == NULL) + return(XIE_ERR); +#else + if (*qtblptr == NULL) + *qtblptr = (QUANT_TBL_PTR) (*cinfo->emethods->alloc_small) (SIZEOF(QUANT_TBL)); +#endif /* XIE_SUPPORTED */ + + for (i = 0; i < DCTSIZE2; i++) { + temp = ((long) basic_table[i] * scale_factor + 50L) / 100L; + /* limit the values to the valid range */ + if (temp <= 0L) temp = 1L; +#ifdef EIGHT_BIT_SAMPLES + if (temp > 32767L) temp = 32767L; /* QUANT_VALs are 'short' */ +#else + if (temp > 65535L) temp = 65535L; /* QUANT_VALs are 'UINT16' */ +#endif + if (force_baseline && temp > 255L) + temp = 255L; /* limit to baseline range if requested */ + (*qtblptr)[i] = (QUANT_VAL) temp; + } +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + + +GLOBAL int +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +j_quality_scaling (int quality) +#else +j_quality_scaling (quality) + int quality; +#endif /* NeedFunctionPrototypes */ +#else +j_quality_scaling (int quality) +#endif /* XIE_SUPPORTED */ +/* Convert a user-specified quality rating to a percentage scaling factor + * for an underlying quantization table, using our recommended scaling curve. + * The input 'quality' factor should be 0 (terrible) to 100 (very good). + */ +{ + /* Safety limit on quality factor. Convert 0 to 1 to avoid zero divide. */ + if (quality <= 0) quality = 1; + if (quality > 100) quality = 100; + + /* The basic table is used as-is (scaling 100) for a quality of 50. + * Qualities 50..100 are converted to scaling percentage 200 - 2*Q; + * note that at Q=100 the scaling is 0, which will cause j_add_quant_table + * to make all the table entries 1 (hence, no quantization loss). + * Qualities 1..50 are converted to scaling percentage 5000/Q. + */ + if (quality < 50) + quality = 5000 / quality; + else + quality = 200 - quality*2; + + return quality; +} + + +#ifdef XIE_SUPPORTED +GLOBAL int +#if NeedFunctionPrototypes +j_set_quality (compress_info_ptr cinfo, int quality, boolean force_baseline) +#else +j_set_quality (cinfo, quality, force_baseline) + compress_info_ptr cinfo; + int quality; + boolean force_baseline; +#endif /* NeedFunctionPrototypes */ +#else +GLOBAL void +j_set_quality (compress_info_ptr cinfo, int quality, boolean force_baseline) +#endif /* XIE_SUPPORTED */ +/* Set or change the 'quality' (quantization) setting, using default tables. + * This is the standard quality-adjusting entry point for typical user + * interfaces; only those who want detailed control over quantization tables + * would use the preceding two routines directly. + */ +{ + /* This is the sample quantization table given in the JPEG spec section K.1, + * but expressed in zigzag order (as are all of our quant. tables). + * The spec says that the values given produce "good" quality, and + * when divided by 2, "very good" quality. (These two settings are + * selected by quality=50 and quality=75 respectively.) + */ + static const QUANT_VAL std_luminance_quant_tbl[DCTSIZE2] = { + 16, 11, 12, 14, 12, 10, 16, 14, + 13, 14, 18, 17, 16, 19, 24, 40, + 26, 24, 22, 22, 24, 49, 35, 37, + 29, 40, 58, 51, 61, 60, 57, 51, + 56, 55, 64, 72, 92, 78, 64, 68, + 87, 69, 55, 56, 80, 109, 81, 87, + 95, 98, 103, 104, 103, 62, 77, 113, + 121, 112, 100, 120, 92, 101, 103, 99 + }; + static const QUANT_VAL std_chrominance_quant_tbl[DCTSIZE2] = { + 17, 18, 18, 24, 21, 24, 47, 26, + 26, 47, 99, 66, 56, 66, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99 + }; + + /* Convert user 0-100 rating to percentage scaling */ + quality = j_quality_scaling(quality); + + /* Set up two quantization tables using the specified quality scaling */ +#ifdef XIE_SUPPORTED + if (j_add_quant_table(cinfo, 0, std_luminance_quant_tbl, + quality, force_baseline) == XIE_ERR) + return(XIE_ERR); + if(j_add_quant_table(cinfo, 1, std_chrominance_quant_tbl, + quality, force_baseline) == XIE_ERR) + return(XIE_ERR); + + return(0); +#else + j_add_quant_table(cinfo, 0, std_luminance_quant_tbl, + quality, force_baseline); + j_add_quant_table(cinfo, 1, std_chrominance_quant_tbl, + quality, force_baseline); +#endif /* XIE_SUPPORTED */ +} + + + +/* Default parameter setup for compression. + * + * User interfaces that don't choose to use this routine must do their + * own setup of all these parameters. Alternately, you can call this + * to establish defaults and then alter parameters selectively. This + * is the recommended approach since, if we add any new parameters, + * your code will still work (they'll be set to reasonable defaults). + * + * See above for the meaning of the 'quality' and 'force_baseline' parameters. + * Typically, the application's default quality setting will be passed to this + * routine. A later call on j_set_quality() can be used to change to a + * user-specified quality setting. + * + * This routine sets up for a color image; to output a grayscale image, + * do this first and call j_monochrome_default() afterwards. + * (The latter can be called within c_ui_method_selection, so the + * choice can depend on the input file header.) + * Note that if you want a JPEG colorspace other than GRAYSCALE or YCbCr, + * you should also change the component ID codes, and you should NOT emit + * a JFIF header (set write_JFIF_header = FALSE). + * + * CAUTION: if you want to compress multiple images per run, it's necessary + * to call j_c_defaults before *each* call to jpeg_compress, since subsidiary + * structures like the Huffman tables are automatically freed during cleanup. + */ + +#ifdef XIE_SUPPORTED +GLOBAL int +#if NeedFunctionPrototypes +j_c_defaults (compress_info_ptr cinfo, int quality, boolean force_baseline) +#else +j_c_defaults (cinfo, quality, force_baseline) + compress_info_ptr cinfo; + int quality; + boolean force_baseline; +#endif /* NeedFunctionPrototypes */ +#else +GLOBAL void +j_c_defaults (compress_info_ptr cinfo, int quality, boolean force_baseline) +#endif /* XIE_SUPPORTED */ +/* NB: the external methods must already be set up. */ +{ + short i; + jpeg_component_info * compptr; + + /* Initialize pointers as needed to mark stuff unallocated. */ + cinfo->comp_info = NULL; + for (i = 0; i < NUM_QUANT_TBLS; i++) + cinfo->quant_tbl_ptrs[i] = NULL; + for (i = 0; i < NUM_HUFF_TBLS; i++) { + cinfo->dc_huff_tbl_ptrs[i] = NULL; + cinfo->ac_huff_tbl_ptrs[i] = NULL; + } + + cinfo->data_precision = BITS_IN_JSAMPLE; /* default; can be overridden by input_init */ + cinfo->density_unit = 0; /* Pixel size is unknown by default */ + cinfo->X_density = 1; /* Pixel aspect ratio is square by default */ + cinfo->Y_density = 1; + + cinfo->input_gamma = 1.0; /* no gamma correction by default */ + + /* Prepare three color components; first is luminance which is also usable */ + /* for grayscale. The others are assumed to be UV or similar chrominance. */ + cinfo->write_JFIF_header = TRUE; + cinfo->jpeg_color_space = CS_YCbCr; + cinfo->num_components = 3; +#ifdef XIE_SUPPORTED + cinfo->comp_info = (jpeg_component_info *) + (*cinfo->emethods->c_alloc_small) + (cinfo, (4 * SIZEOF(jpeg_component_info))); + if (cinfo->comp_info == NULL) + return(XIE_ERR); +#else + cinfo->comp_info = (jpeg_component_info *) + (*cinfo->emethods->alloc_small) (4 * SIZEOF(jpeg_component_info)); +#endif /* XIE_SUPPORTED */ + /* Note: we allocate a 4-entry comp_info array so that user interface can + * easily change over to CMYK color space if desired. + */ + + compptr = &cinfo->comp_info[0]; + compptr->component_index = 0; + compptr->component_id = 1; /* JFIF specifies IDs 1,2,3 */ +#ifdef XIE_SUPPORTED + compptr->h_samp_factor = cinfo->xie_h_samp_factor[0]; + compptr->v_samp_factor = cinfo->xie_v_samp_factor[0]; +#else + compptr->h_samp_factor = 2; /* default to 2x2 subsamples of chrominance */ + compptr->v_samp_factor = 2; +#endif /* XIE_SUPPORTED */ + compptr->quant_tbl_no = 0; /* use tables 0 for luminance */ + compptr->dc_tbl_no = 0; + compptr->ac_tbl_no = 0; + + compptr = &cinfo->comp_info[1]; + compptr->component_index = 1; + compptr->component_id = 2; +#ifdef XIE_SUPPORTED + compptr->h_samp_factor = cinfo->xie_h_samp_factor[1]; + compptr->v_samp_factor = cinfo->xie_v_samp_factor[1]; +#else + compptr->h_samp_factor = 1; + compptr->v_samp_factor = 1; +#endif /* XIE_SUPPORTED */ + compptr->quant_tbl_no = 1; /* use tables 1 for chrominance */ + compptr->dc_tbl_no = 1; + compptr->ac_tbl_no = 1; + + compptr = &cinfo->comp_info[2]; + compptr->component_index = 2; + compptr->component_id = 3; +#ifdef XIE_SUPPORTED + compptr->h_samp_factor = cinfo->xie_h_samp_factor[2]; + compptr->v_samp_factor = cinfo->xie_v_samp_factor[2]; +#else + compptr->h_samp_factor = 1; + compptr->v_samp_factor = 1; +#endif /* XIE_SUPPORTED */ + compptr->quant_tbl_no = 1; /* use tables 1 for chrominance */ + compptr->dc_tbl_no = 1; + compptr->ac_tbl_no = 1; + + /* Set up two quantization tables using the specified quality scaling */ +#ifdef XIE_SUPPORTED + if (j_set_quality(cinfo, quality, force_baseline) == XIE_ERR) + return(XIE_ERR); +#else + j_set_quality(cinfo, quality, force_baseline); +#endif /* XIE_SUPPORTED */ + + /* Set up two Huffman tables in case user interface wants Huffman coding */ +#ifdef XIE_SUPPORTED + if(std_huff_tables(cinfo) == XIE_ERR) + return(XIE_ERR); +#else + std_huff_tables(cinfo); +#endif /* XIE_SUPPORTED */ + + /* Initialize default arithmetic coding conditioning */ + for (i = 0; i < NUM_ARITH_TBLS; i++) { + cinfo->arith_dc_L[i] = 0; + cinfo->arith_dc_U[i] = 1; + cinfo->arith_ac_K[i] = 5; + } + + /* Use Huffman coding, not arithmetic coding, by default */ + cinfo->arith_code = FALSE; + + /* Color images are interleaved by default */ + cinfo->interleave = TRUE; + + /* By default, don't do extra passes to optimize entropy coding */ + cinfo->optimize_coding = FALSE; + + /* By default, use the simpler non-cosited sampling alignment */ + cinfo->CCIR601_sampling = FALSE; + + /* No input smoothing */ + cinfo->smoothing_factor = 0; + + /* No restart markers */ + cinfo->restart_interval = 0; + cinfo->restart_in_rows = 0; + +#ifdef XIE_SUPPORTED + return(0); +#else + /* Install default do-nothing progress monitoring method. */ + cinfo->methods->progress_monitor = progress_monitor; +#endif /* XIE_SUPPORTED */ +} + + + +GLOBAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +j_monochrome_default (compress_info_ptr cinfo) +#else +j_monochrome_default (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +j_monochrome_default (compress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +/* Change the j_c_defaults() values to emit a monochrome JPEG file. */ +{ + jpeg_component_info * compptr; + + cinfo->jpeg_color_space = CS_GRAYSCALE; + cinfo->num_components = 1; + /* Set single component to 1x1 subsampling */ + compptr = &cinfo->comp_info[0]; + compptr->h_samp_factor = 1; + compptr->v_samp_factor = 1; +} + diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jcexpand.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jcexpand.c new file mode 100644 index 0000000..fafa54e --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jcexpand.c @@ -0,0 +1,175 @@ +/* $XConsortium: jcexpand.c,v 1.4 94/04/17 20:35:28 rws Exp $ */ +/* Module jcexpand.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., October 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +/* + * jcexpand.c + * + * Copyright (C) 1991, 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains image edge-expansion routines. + * These routines are invoked via the edge_expand method. + */ + +#include "jinclude.h" + + +/* + * Expand an image so that it is a multiple of the MCU dimensions. + * This is to be accomplished by duplicating the rightmost column + * and/or bottommost row of pixels. The image has not yet been + * downsampled, so all components have the same dimensions. + */ + +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +edge_expand (compress_info_ptr cinfo, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPIMAGE image_data) +#else +edge_expand (cinfo, input_cols, input_rows, output_cols, output_rows, image_data) + compress_info_ptr cinfo; + long input_cols; + int input_rows; + long output_cols; + int output_rows; + JSAMPIMAGE image_data; +#endif /* NeedFunctionPrototypes */ +#else +edge_expand (compress_info_ptr cinfo, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPIMAGE image_data) +#endif /* XIE_SUPPORTED */ +{ + /* Expand horizontally */ + if (input_cols < output_cols) { + register JSAMPROW ptr; + register JSAMPLE pixval; + register long count; + register int row; + short ci; + long numcols = output_cols - input_cols; + + for (ci = 0; ci < cinfo->num_components; ci++) { + for (row = 0; row < input_rows; row++) { + ptr = image_data[ci][row] + (input_cols-1); + pixval = GETJSAMPLE(*ptr++); + for (count = numcols; count > 0; count--) + *ptr++ = pixval; + } + } + } + + /* Expand vertically */ + /* This happens only once at the bottom of the image, */ + /* so it needn't be super-efficient */ + if (input_rows < output_rows) { + register int row; + short ci; + JSAMPARRAY this_component; + + for (ci = 0; ci < cinfo->num_components; ci++) { + this_component = image_data[ci]; + for (row = input_rows; row < output_rows; row++) { + jcopy_sample_rows(this_component, input_rows-1, this_component, row, + 1, output_cols); + } + } + } +} + + +/* + * The method selection routine for edge expansion. + */ + +GLOBAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +jselexpand (compress_info_ptr cinfo) +#else +jselexpand (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +jselexpand (compress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + /* just one implementation for now */ + cinfo->methods->edge_expand = edge_expand; +} diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jchuff.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jchuff.c new file mode 100644 index 0000000..d360095 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jchuff.c @@ -0,0 +1,1030 @@ +/* $XConsortium: jchuff.c,v 1.4 94/04/17 20:35:29 rws Exp $ */ +/* Module jchuff.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., October 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +/* + * jchuff.c + * + * Copyright (C) 1991, 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains Huffman entropy encoding routines. + * These routines are invoked via the methods entropy_encode, + * entropy_encode_init/term, and entropy_optimize. + */ + +#include "jinclude.h" + + +/* Static variables to avoid passing 'round extra parameters */ + +static compress_info_ptr cinfo; + +static INT32 huff_put_buffer; /* current bit-accumulation buffer */ +static int huff_put_bits; /* # of bits now in it */ + +#ifndef XIE_SUPPORTED +static char * output_buffer; /* output buffer */ +static int bytes_in_buffer; +#endif /* XIE_SUPPORTED */ + + +LOCAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +fix_huff_tbl (HUFF_TBL * htbl) +#else +fix_huff_tbl (htbl) + HUFF_TBL * htbl; +#endif /* NeedFunctionPrototypes */ +#else +fix_huff_tbl (HUFF_TBL * htbl) +#endif /* XIE_SUPPORTED */ +/* Compute derived values for a Huffman table */ +{ + int p, i, l, lastp, si; + char huffsize[257]; + UINT16 huffcode[257]; + UINT16 code; + + /* Figure C.1: make table of Huffman code length for each symbol */ + /* Note that this is in code-length order. */ + + p = 0; + for (l = 1; l <= 16; l++) { + for (i = 1; i <= (int) htbl->bits[l]; i++) + huffsize[p++] = (char) l; + } + huffsize[p] = 0; + lastp = p; + + /* Figure C.2: generate the codes themselves */ + /* Note that this is in code-length order. */ + + code = 0; + si = huffsize[0]; + p = 0; + while (huffsize[p]) { + while (((int) huffsize[p]) == si) { + huffcode[p++] = code; + code++; + } + code <<= 1; + si++; + } + + /* Figure C.3: generate encoding tables */ + /* These are code and size indexed by symbol value */ + + /* Set any codeless symbols to have code length 0; + * this allows emit_bits to detect any attempt to emit such symbols. + */ + MEMZERO(htbl->ehufsi, SIZEOF(htbl->ehufsi)); + + for (p = 0; p < lastp; p++) { + htbl->ehufco[htbl->huffval[p]] = huffcode[p]; + htbl->ehufsi[htbl->huffval[p]] = huffsize[p]; + } + + /* We don't bother to fill in the decoding tables mincode[], maxcode[], */ + /* and valptr[], since they are not used for encoding. */ +} + + +/* Outputting bytes to the file */ + +#ifdef XIE_SUPPORTED +LOCAL void +#if NeedFunctionPrototypes +flush_bytes (void) +#else +flush_bytes () +#endif /* NeedFunctionPrototypes */ +{ +} + +#define emit_byte(val) \ + MAKESTMT( if (cinfo->bytes_in_buffer >= cinfo->jpeg_buf_size) \ + return(-1); \ + cinfo->output_buffer[cinfo->bytes_in_buffer++] = (char) (val); ) + +#else +LOCAL void +flush_bytes (void) +{ + if (bytes_in_buffer) + (*cinfo->methods->entropy_output) (cinfo, output_buffer, bytes_in_buffer); + bytes_in_buffer = 0; +} + +#define emit_byte(val) \ + MAKESTMT( if (bytes_in_buffer >= JPEG_BUF_SIZE) \ + flush_bytes(); \ + output_buffer[bytes_in_buffer++] = (char) (val); ) + +#endif /* XIE_SUPPORTED */ + +/* Outputting bits to the file */ + +/* Only the right 24 bits of huff_put_buffer are used; the valid bits are + * left-justified in this part. At most 16 bits can be passed to emit_bits + * in one call, and we never retain more than 7 bits in huff_put_buffer + * between calls, so 24 bits are sufficient. + */ + +INLINE +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +emit_bits (UINT16 code, int size) +#else +emit_bits (code, size) + UINT16 code; + int size; +#endif /* NeedFunctionPrototypes */ +#else +LOCAL void +emit_bits (UINT16 code, int size) +#endif /* XIE_SUPPORTED */ +{ + /* This routine is heavily used, so it's worth coding tightly. */ + register INT32 put_buffer = code; +#ifdef XIE_SUPPORTED + register int put_bits = cinfo->huff_put_bits; +#else + register int put_bits = huff_put_bits; +#endif /* XIE_SUPPORTED */ + + /* if size is 0, caller used an invalid Huffman table entry */ + if (size == 0) +#ifdef XIE_SUPPORTED + return(XIE_ERR); +#else + ERREXIT(cinfo->emethods, "Missing Huffman code table entry"); +#endif /* XIE_SUPPORTED */ + + put_buffer &= (((INT32) 1) << size) - 1; /* Mask off any excess bits in code */ + + put_bits += size; /* new number of bits in buffer */ + + put_buffer <<= 24 - put_bits; /* align incoming bits */ + +#ifdef XIE_SUPPORTED + put_buffer |= cinfo->huff_put_buffer; /* and merge with old buffer contents */ +#else + put_buffer |= huff_put_buffer; /* and merge with old buffer contents */ +#endif /* XIE_SUPPORTED */ + + while (put_bits >= 8) { + int c = (int) ((put_buffer >> 16) & 0xFF); + + emit_byte(c); + if (c == 0xFF) { /* need to stuff a zero byte? */ + emit_byte(0); + } + put_buffer <<= 8; + put_bits -= 8; + } + +#ifdef XIE_SUPPORTED + cinfo->huff_put_buffer = put_buffer; /* Update global variables */ + cinfo->huff_put_bits = put_bits; + return(0); +#else + huff_put_buffer = put_buffer; /* Update global variables */ + huff_put_bits = put_bits; +#endif /* XIE_SUPPORTED */ +} + + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +flush_bits (void) +#else +flush_bits () +#endif /* NeedFunctionPrototypes */ +{ + register int status; + + /* fill any partial byte with ones */ + if ((status = emit_bits((UINT16) 0x7F, 7)) < 0) + return(status); + cinfo->huff_put_buffer = 0; /* and reset bit-buffer to empty */ + cinfo->huff_put_bits = 0; + return(0); +} +#else +LOCAL void +flush_bits (void) +{ + emit_bits((UINT16) 0x7F, 7); /* fill any partial byte with ones */ + huff_put_buffer = 0; /* and reset bit-buffer to empty */ + huff_put_bits = 0; +} +#endif /* XIE_SUPPORTED */ + + + +/* Encode a single block's worth of coefficients */ +/* Note that the DC coefficient has already been converted to a difference */ + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +encode_one_block (JBLOCK block, HUFF_TBL *dctbl, HUFF_TBL *actbl) +#else +encode_one_block (block, dctbl, actbl) + JBLOCK block; + HUFF_TBL *dctbl; + HUFF_TBL *actbl; +#endif /* NeedFunctionPrototypes */ +{ + register int status; +#else +LOCAL void +encode_one_block (JBLOCK block, HUFF_TBL *dctbl, HUFF_TBL *actbl) +{ +#endif /* XIE_SUPPORTED */ + register int temp, temp2; + register int nbits; + register int k, r, i; + + /* Encode the DC coefficient difference per section F.1.2.1 */ + + temp = temp2 = block[0]; + + if (temp < 0) { + temp = -temp; /* temp is abs value of input */ + /* For a negative input, want temp2 = bitwise complement of abs(input) */ + /* This code assumes we are on a two's complement machine */ + temp2--; + } + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 0; + while (temp) { + nbits++; + temp >>= 1; + } + + /* Emit the Huffman-coded symbol for the number of bits */ +#ifdef XIE_SUPPORTED + if ((status = emit_bits(dctbl->ehufco[nbits], dctbl->ehufsi[nbits])) < 0) + return(status); +#else + emit_bits(dctbl->ehufco[nbits], dctbl->ehufsi[nbits]); +#endif /* XIE_SUPPORTED */ + + /* Emit that number of bits of the value, if positive, */ + /* or the complement of its magnitude, if negative. */ + if (nbits) /* emit_bits rejects calls with size 0 */ +#ifdef XIE_SUPPORTED + { + if ((status = emit_bits((UINT16) temp2, nbits)) < 0) + return(status); + } +#else + emit_bits((UINT16) temp2, nbits); +#endif /* XIE_SUPPORTED */ + + /* Encode the AC coefficients per section F.1.2.2 */ + + r = 0; /* r = run length of zeros */ + + for (k = 1; k < DCTSIZE2; k++) { + if ((temp = block[k]) == 0) { + r++; + } else { + /* if run length > 15, must emit special run-length-16 codes (0xF0) */ + while (r > 15) { +#ifdef XIE_SUPPORTED + if ((status = emit_bits(actbl->ehufco[0xF0], actbl->ehufsi[0xF0])) < 0) + return(status); +#else + emit_bits(actbl->ehufco[0xF0], actbl->ehufsi[0xF0]); +#endif /* XIE_SUPPORTED */ + r -= 16; + } + + temp2 = temp; + if (temp < 0) { + temp = -temp; /* temp is abs value of input */ + /* This code assumes we are on a two's complement machine */ + temp2--; + } + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 1; /* there must be at least one 1 bit */ + while (temp >>= 1) + nbits++; + + /* Emit Huffman symbol for run length / number of bits */ + i = (r << 4) + nbits; +#ifdef XIE_SUPPORTED + if ((status = emit_bits(actbl->ehufco[i], actbl->ehufsi[i])) < 0) + return(status); +#else + emit_bits(actbl->ehufco[i], actbl->ehufsi[i]); +#endif /* XIE_SUPPORTED */ + + /* Emit that number of bits of the value, if positive, */ + /* or the complement of its magnitude, if negative. */ +#ifdef XIE_SUPPORTED + if ((status = emit_bits((UINT16) temp2, nbits)) < 0) + return(status); +#else + emit_bits((UINT16) temp2, nbits); +#endif /* XIE_SUPPORTED */ + + r = 0; + } + } + + /* If the last coef(s) were zero, emit an end-of-block code */ + if (r > 0) +#ifdef XIE_SUPPORTED + { + if ((status = emit_bits(actbl->ehufco[0], actbl->ehufsi[0])) < 0) + return(status); + } + return(0); +#else + emit_bits(actbl->ehufco[0], actbl->ehufsi[0]); +#endif /* XIE_SUPPORTED */ +} + + + +/* + * Initialize for a Huffman-compressed scan. + * This is invoked after writing the SOS marker. + * The pipeline controller must establish the entropy_output method pointer + * before calling this routine. + */ + +#ifdef XIE_SUPPORTED +METHODDEF int +#if NeedFunctionPrototypes +huff_init (compress_info_ptr xinfo) +#else +huff_init (xinfo) + compress_info_ptr xinfo; +#endif /* NeedFunctionPrototypes */ +#else +METHODDEF void +huff_init (compress_info_ptr xinfo) +#endif /* XIE_SUPPORTED */ +{ + short ci; + jpeg_component_info * compptr; + + /* Initialize static variables */ + cinfo = xinfo; + +#ifdef XIE_SUPPORTED + cinfo->huff_put_buffer = 0; + cinfo->huff_put_bits = 0; + cinfo->bytes_in_buffer = 0; +#else + huff_put_buffer = 0; + huff_put_bits = 0; + + /* Initialize the output buffer */ + output_buffer = (char *) (*cinfo->emethods->alloc_small) + ((size_t) JPEG_BUF_SIZE); + bytes_in_buffer = 0; +#endif /* XIE_SUPPORTED */ + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Make sure requested tables are present */ + if (cinfo->dc_huff_tbl_ptrs[compptr->dc_tbl_no] == NULL || + cinfo->ac_huff_tbl_ptrs[compptr->ac_tbl_no] == NULL) +#ifdef XIE_SUPPORTED + return(XIE_ERR); +#else + ERREXIT(cinfo->emethods, "Use of undefined Huffman table"); +#endif /* XIE_SUPPORTED */ + /* Compute derived values for Huffman tables */ + /* We may do this more than once for same table, but it's not a big deal */ + fix_huff_tbl(cinfo->dc_huff_tbl_ptrs[compptr->dc_tbl_no]); + fix_huff_tbl(cinfo->ac_huff_tbl_ptrs[compptr->ac_tbl_no]); + /* Initialize DC predictions to 0 */ + cinfo->last_dc_val[ci] = 0; + } + + /* Initialize restart stuff */ + cinfo->restarts_to_go = cinfo->restart_interval; + cinfo->next_restart_num = 0; +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + + +/* + * Emit a restart marker & resynchronize predictions. + */ + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +emit_restart (compress_info_ptr cinfo) +#else +emit_restart (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +{ + int status; +#else +LOCAL void +emit_restart (compress_info_ptr cinfo) +{ +#endif /* XIE_SUPPORTED */ + short ci; + +#ifdef XIE_SUPPORTED + if ((status = flush_bits()) < 0) + return(status); +#else + flush_bits(); +#endif /* XIE_SUPPORTED */ + + emit_byte(0xFF); + emit_byte(RST0 + cinfo->next_restart_num); + + /* Re-initialize DC predictions to 0 */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) + cinfo->last_dc_val[ci] = 0; + + /* Update restart state */ + cinfo->restarts_to_go = cinfo->restart_interval; + cinfo->next_restart_num++; + cinfo->next_restart_num &= 7; +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + + +/* + * Encode and output one MCU's worth of Huffman-compressed coefficients. + */ +#ifdef XIE_SUPPORTED +METHODDEF int +#if NeedFunctionPrototypes +huff_encode (compress_info_ptr xinfo, JBLOCK *MCU_data) +#else +huff_encode (xinfo, MCU_data) + compress_info_ptr xinfo; + JBLOCK *MCU_data; +#endif /* NeedFunctionPrototypes */ +{ + int status; +#else +METHODDEF void +huff_encode (compress_info_ptr xinfo, JBLOCK *MCU_data) +{ +#endif /* XIE_SUPPORTED */ + short blkn, ci; + jpeg_component_info * compptr; + JCOEF temp; +#ifdef XIE_SUPPORTED + JCOEF last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each comp */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) + last_dc_val[ci] = cinfo->last_dc_val[ci]; + + /* Initialize static variables */ + cinfo = xinfo; + huff_put_buffer = cinfo->huff_put_buffer; + huff_put_bits = cinfo->huff_put_bits; +#endif /* XIE_SUPPORTED */ + + /* Account for restart interval, emit restart marker if needed */ + if (cinfo->restart_interval) { + if (cinfo->restarts_to_go == 0) +#ifdef XIE_SUPPORTED + if ((status = emit_restart(cinfo)) < 0) { + if (status != XIE_ERR) { + for (ci = 0; ci < cinfo->comps_in_scan; ci++) + cinfo->last_dc_val[ci] = last_dc_val[ci]; + cinfo->huff_put_buffer = huff_put_buffer; + cinfo->huff_put_bits = huff_put_bits; + } + return(status); + } +#else + emit_restart(cinfo); +#endif /* XIE_SUPPORTED */ + cinfo->restarts_to_go--; + } + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + /* Convert DC value to difference, update last_dc_val */ + temp = MCU_data[blkn][0]; + MCU_data[blkn][0] -= cinfo->last_dc_val[ci]; + cinfo->last_dc_val[ci] = temp; +#ifdef XIE_SUPPORTED + if ((status = encode_one_block(MCU_data[blkn], + cinfo->dc_huff_tbl_ptrs[compptr->dc_tbl_no], + cinfo->ac_huff_tbl_ptrs[compptr->ac_tbl_no])) < 0) { + /* Reset global variables for restart */ + if (status != XIE_ERR) { + for (ci = 0; ci < cinfo->comps_in_scan; ci++) + cinfo->last_dc_val[ci] = last_dc_val[ci]; + cinfo->huff_put_buffer = huff_put_buffer; + cinfo->huff_put_bits = huff_put_bits; + } + return(status); + } +#else + encode_one_block(MCU_data[blkn], + cinfo->dc_huff_tbl_ptrs[compptr->dc_tbl_no], + cinfo->ac_huff_tbl_ptrs[compptr->ac_tbl_no]); +#endif /* XIE_SUPPORTED */ + } +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + + +/* + * Finish up at the end of a Huffman-compressed scan. + */ + +#ifdef XIE_SUPPORTED +METHODDEF int +#if NeedFunctionPrototypes +huff_term (compress_info_ptr xinfo) +#else +huff_term (xinfo) + compress_info_ptr xinfo; +#endif /* NeedFunctionPrototypes */ +{ + int status; +#else +METHODDEF void +huff_term (compress_info_ptr xinfo) +{ +#endif /* XIE_SUPPORTED */ +#ifdef XIE_SUPPORTED + /* Initialize static variables */ + cinfo = xinfo; + /* Flush out the last data */ + if ((status = flush_bits()) < 0) + return(status); +#else + /* Flush out the last data */ + flush_bits(); +#endif /* XIE_SUPPORTED */ + flush_bytes(); + /* Release the I/O buffer */ +#ifdef XIE_SUPPORTED + return(0); +#else + (*cinfo->emethods->free_small) ((pointer ) output_buffer); +#endif /* XIE_SUPPORTED */ +} + + +/* + * Huffman coding optimization. + * + * This actually is optimization, in the sense that we find the best possible + * Huffman table(s) for the given data. We first scan the supplied data and + * count the number of uses of each symbol that is to be Huffman-coded. + * (This process must agree with the code above.) Then we build an + * optimal Huffman coding tree for the observed counts. + */ + +#ifndef XIE_SUPPORTED +#ifdef ENTROPY_OPT_SUPPORTED + + +/* These are static so htest_one_block can find 'em */ +static long * dc_count_ptrs[NUM_HUFF_TBLS]; +static long * ac_count_ptrs[NUM_HUFF_TBLS]; + + +LOCAL void +gen_huff_coding (compress_info_ptr cinfo, HUFF_TBL *htbl, long freq[]) +/* Generate the optimal coding for the given counts */ +{ +#define MAX_CLEN 32 /* assumed maximum initial code length */ + UINT8 bits[MAX_CLEN+1]; /* bits[k] = # of symbols with code length k */ + short codesize[257]; /* codesize[k] = code length of symbol k */ + short others[257]; /* next symbol in current branch of tree */ + int c1, c2; + int p, i, j; + long v; + + /* This algorithm is explained in section K.2 of the JPEG standard */ + + MEMZERO(bits, SIZEOF(bits)); + MEMZERO(codesize, SIZEOF(codesize)); + for (i = 0; i < 257; i++) + others[i] = -1; /* init links to empty */ + + freq[256] = 1; /* make sure there is a nonzero count */ + /* including the pseudo-symbol 256 in the Huffman procedure guarantees + * that no real symbol is given code-value of all ones, because 256 + * will be placed in the largest codeword category. + */ + + /* Huffman's basic algorithm to assign optimal code lengths to symbols */ + + for (;;) { + /* Find the smallest nonzero frequency, set c1 = its symbol */ + /* In case of ties, take the larger symbol number */ + c1 = -1; + v = 1000000000L; + for (i = 0; i <= 256; i++) { + if (freq[i] && freq[i] <= v) { + v = freq[i]; + c1 = i; + } + } + + /* Find the next smallest nonzero frequency, set c2 = its symbol */ + /* In case of ties, take the larger symbol number */ + c2 = -1; + v = 1000000000L; + for (i = 0; i <= 256; i++) { + if (freq[i] && freq[i] <= v && i != c1) { + v = freq[i]; + c2 = i; + } + } + + /* Done if we've merged everything into one frequency */ + if (c2 < 0) + break; + + /* Else merge the two counts/trees */ + freq[c1] += freq[c2]; + freq[c2] = 0; + + /* Increment the codesize of everything in c1's tree branch */ + codesize[c1]++; + while (others[c1] >= 0) { + c1 = others[c1]; + codesize[c1]++; + } + + others[c1] = c2; /* chain c2 onto c1's tree branch */ + + /* Increment the codesize of everything in c2's tree branch */ + codesize[c2]++; + while (others[c2] >= 0) { + c2 = others[c2]; + codesize[c2]++; + } + } + + /* Now count the number of symbols of each code length */ + for (i = 0; i <= 256; i++) { + if (codesize[i]) { + /* The JPEG standard seems to think that this can't happen, */ + /* but I'm paranoid... */ + if (codesize[i] > MAX_CLEN) + ERREXIT(cinfo->emethods, "Huffman code size table overflow"); + + bits[codesize[i]]++; + } + } + + /* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure + * Huffman procedure assigned any such lengths, we must adjust the coding. + * Here is what the JPEG spec says about how this next bit works: + * Since symbols are paired for the longest Huffman code, the symbols are + * removed from this length category two at a time. The prefix for the pair + * (which is one bit shorter) is allocated to one of the pair; then, + * skipping the BITS entry for that prefix length, a code word from the next + * shortest nonzero BITS entry is converted into a prefix for two code words + * one bit longer. + */ + + for (i = MAX_CLEN; i > 16; i--) { + while (bits[i] > 0) { + j = i - 2; /* find length of new prefix to be used */ + while (bits[j] == 0) + j--; + + bits[i] -= 2; /* remove two symbols */ + bits[i-1]++; /* one goes in this length */ + bits[j+1] += 2; /* two new symbols in this length */ + bits[j]--; /* symbol of this length is now a prefix */ + } + } + + /* Remove the count for the pseudo-symbol 256 from the largest codelength */ + while (bits[i] == 0) /* find largest codelength still in use */ + i--; + bits[i]--; + + /* Return final symbol counts (only for lengths 0..16) */ + MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits)); + + /* Return a list of the symbols sorted by code length */ + /* It's not real clear to me why we don't need to consider the codelength + * changes made above, but the JPEG spec seems to think this works. + */ + p = 0; + for (i = 1; i <= MAX_CLEN; i++) { + for (j = 0; j <= 255; j++) { + if (codesize[j] == i) { + htbl->huffval[p] = (UINT8) j; + p++; + } + } + } +} + + +/* Process a single block's worth of coefficients */ +/* Note that the DC coefficient has already been converted to a difference */ + +LOCAL void +htest_one_block (JBLOCK block, JCOEF block0, + long dc_counts[], long ac_counts[]) +{ + register INT32 temp; + register int nbits; + register int k, r; + + /* Encode the DC coefficient difference per section F.1.2.1 */ + + /* Find the number of bits needed for the magnitude of the coefficient */ + temp = block0; + if (temp < 0) temp = -temp; + + for (nbits = 0; temp; nbits++) + temp >>= 1; + + /* Count the Huffman symbol for the number of bits */ + dc_counts[nbits]++; + + /* Encode the AC coefficients per section F.1.2.2 */ + + r = 0; /* r = run length of zeros */ + + for (k = 1; k < DCTSIZE2; k++) { + if ((temp = block[k]) == 0) { + r++; + } else { + /* if run length > 15, must emit special run-length-16 codes (0xF0) */ + while (r > 15) { + ac_counts[0xF0]++; + r -= 16; + } + + /* Find the number of bits needed for the magnitude of the coefficient */ + if (temp < 0) temp = -temp; + + for (nbits = 0; temp; nbits++) + temp >>= 1; + + /* Count Huffman symbol for run length / number of bits */ + ac_counts[(r << 4) + nbits]++; + + r = 0; + } + } + + /* If the last coef(s) were zero, emit an end-of-block code */ + if (r > 0) + ac_counts[0]++; +} + + + +/* + * Trial-encode one MCU's worth of Huffman-compressed coefficients. + */ + +LOCAL void +htest_encode (compress_info_ptr cinfo, JBLOCK *MCU_data) +{ + short blkn, ci; + jpeg_component_info * compptr; + + /* Take care of restart intervals if needed */ + if (cinfo->restart_interval) { + if (cinfo->restarts_to_go == 0) { + /* Re-initialize DC predictions to 0 */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) + cinfo->last_dc_val[ci] = 0; + /* Update restart state */ + cinfo->restarts_to_go = cinfo->restart_interval; + } + cinfo->restarts_to_go--; + } + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + /* NB: unlike the real entropy encoder, we may not change the input data */ + htest_one_block(MCU_data[blkn], + (JCOEF) (MCU_data[blkn][0] - cinfo->last_dc_val[ci]), + dc_count_ptrs[compptr->dc_tbl_no], + ac_count_ptrs[compptr->ac_tbl_no]); + cinfo->last_dc_val[ci] = MCU_data[blkn][0]; + } +} + + + +/* + * Find the best coding parameters for a Huffman-coded scan. + * When called, the scan data has already been converted to a sequence of + * MCU groups of quantized coefficients, which are stored in a "big" array. + * The source_method knows how to iterate through that array. + * On return, the MCU data is unmodified, but the Huffman tables referenced + * by the scan components may have been altered. + */ + +METHODDEF void +huff_optimize (compress_info_ptr xinfo, MCU_output_caller_ptr source_method) +/* Optimize Huffman-coding parameters (Huffman symbol table) */ +{ + int i, tbl; + HUFF_TBL **htblptr; + + /* Allocate and zero the count tables */ + /* Note that gen_huff_coding expects 257 entries in each table! */ + + for (i = 0; i < NUM_HUFF_TBLS; i++) { + dc_count_ptrs[i] = NULL; + ac_count_ptrs[i] = NULL; + } + + for (i = 0; i < cinfo->comps_in_scan; i++) { + /* Create DC table */ + tbl = cinfo->cur_comp_info[i]->dc_tbl_no; + if (dc_count_ptrs[tbl] == NULL) { + dc_count_ptrs[tbl] = (long *) (*cinfo->emethods->alloc_small) + (257 * SIZEOF(long)); + MEMZERO(dc_count_ptrs[tbl], 257 * SIZEOF(long)); + } + /* Create AC table */ + tbl = cinfo->cur_comp_info[i]->ac_tbl_no; + if (ac_count_ptrs[tbl] == NULL) { + ac_count_ptrs[tbl] = (long *) (*cinfo->emethods->alloc_small) + (257 * SIZEOF(long)); + MEMZERO(ac_count_ptrs[tbl], 257 * SIZEOF(long)); + } + } + + /* Initialize DC predictions to 0 */ + for (i = 0; i < cinfo->comps_in_scan; i++) { + cinfo->last_dc_val[i] = 0; + } + /* Initialize restart stuff */ + cinfo->restarts_to_go = cinfo->restart_interval; + + /* Scan the MCU data, count symbol uses */ + (*source_method) (cinfo, htest_encode); + + /* Now generate optimal Huffman tables */ + for (tbl = 0; tbl < NUM_HUFF_TBLS; tbl++) { + if (dc_count_ptrs[tbl] != NULL) { + htblptr = & cinfo->dc_huff_tbl_ptrs[tbl]; + if (*htblptr == NULL) + *htblptr = (HUFF_TBL *) (*cinfo->emethods->alloc_small) (SIZEOF(HUFF_TBL)); + /* Set sent_table FALSE so updated table will be written to JPEG file. */ + (*htblptr)->sent_table = FALSE; + /* Compute the optimal Huffman encoding */ + gen_huff_coding(cinfo, *htblptr, dc_count_ptrs[tbl]); + /* Release the count table */ + (*cinfo->emethods->free_small) ((pointer ) dc_count_ptrs[tbl]); + } + if (ac_count_ptrs[tbl] != NULL) { + htblptr = & cinfo->ac_huff_tbl_ptrs[tbl]; + if (*htblptr == NULL) + *htblptr = (HUFF_TBL *) (*cinfo->emethods->alloc_small) (SIZEOF(HUFF_TBL)); + /* Set sent_table FALSE so updated table will be written to JPEG file. */ + (*htblptr)->sent_table = FALSE; + /* Compute the optimal Huffman encoding */ + gen_huff_coding(cinfo, *htblptr, ac_count_ptrs[tbl]); + /* Release the count table */ + (*cinfo->emethods->free_small) ((pointer ) ac_count_ptrs[tbl]); + } + } +} + + +#endif /* ENTROPY_OPT_SUPPORTED */ +#endif /* XIE_SUPPORTED */ + + +/* + * The method selection routine for Huffman entropy encoding. + */ + +GLOBAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +jselchuffman (compress_info_ptr cinfo) +#else +jselchuffman (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +jselchuffman (compress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + if (! cinfo->arith_code) { + cinfo->methods->entropy_encode_init = huff_init; + cinfo->methods->entropy_encode = huff_encode; + cinfo->methods->entropy_encode_term = huff_term; +#ifndef XIE_SUPPORTED +#ifdef ENTROPY_OPT_SUPPORTED + cinfo->methods->entropy_optimize = huff_optimize; + /* The standard Huffman tables are only valid for 8-bit data precision. + * If the precision is higher, force optimization on so that usable + * tables will be computed. This test can be removed if default tables + * are supplied that are valid for the desired precision. + */ + if (cinfo->data_precision > 8) + cinfo->optimize_coding = TRUE; + if (cinfo->optimize_coding) + cinfo->total_passes++; /* one pass needed for entropy optimization */ +#endif +#endif /* XIE_SUPPORTED */ + } +} diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jcmcu.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jcmcu.c new file mode 100644 index 0000000..c97e923 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jcmcu.c @@ -0,0 +1,395 @@ +/* $XConsortium: jcmcu.c,v 1.4 94/04/17 20:35:29 rws Exp $ */ +/* Module jcmcu.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., October 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +/* + * jcmcu.c + * + * Copyright (C) 1991, 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains MCU extraction routines and quantization scaling. + * These routines are invoked via the extract_MCUs and + * extract_init/term methods. + */ + +#include "jinclude.h" + + +/* + * If this file is compiled with -DDCT_ERR_STATS, it will reverse-DCT each + * block and sum the total errors across the whole picture. This provides + * a convenient method of using real picture data to test the roundoff error + * of a DCT algorithm. DCT_ERR_STATS should *not* be defined for a production + * compression program, since compression is much slower with it defined. + * Also note that jrevdct.o must be linked into the compressor when this + * switch is defined. + */ + +#ifndef XIE_SUPPORTED +#ifdef DCT_ERR_STATS +static int dcterrorsum; /* these hold the error statistics */ +static int dcterrormax; +static int dctcoefcount; /* This will probably overflow on a 16-bit-int machine */ +#endif +#endif /* XIE_SUPPORTED */ + + +/* ZAG[i] is the natural-order position of the i'th element of zigzag order. */ + +static const short ZAG[DCTSIZE2] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63 +}; + + +LOCAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +extract_block (JSAMPARRAY input_data, int start_row, long start_col, + JBLOCK output_data, QUANT_TBL_PTR quanttbl) +#else +extract_block (input_data, start_row, start_col, output_data, quanttbl) + JSAMPARRAY input_data; + int start_row; + long start_col; + JBLOCK output_data; + QUANT_TBL_PTR quanttbl; +#endif /* NeedFunctionPrototypes */ +#else +extract_block (JSAMPARRAY input_data, int start_row, long start_col, + JBLOCK output_data, QUANT_TBL_PTR quanttbl) +#endif /* XIE_SUPPORTED */ +/* Extract one 8x8 block from the specified location in the sample array; */ +/* perform forward DCT, quantization scaling, and zigzag reordering on it. */ +{ + /* This routine is heavily used, so it's worth coding it tightly. */ + DCTBLOCK block; +#ifdef DCT_ERR_STATS + DCTBLOCK svblock; /* saves input data for comparison */ +#endif + + { register JSAMPROW elemptr; + register DCTELEM *localblkptr = block; +#if DCTSIZE != 8 + register int elemc; +#endif + register int elemr; + + for (elemr = DCTSIZE; elemr > 0; elemr--) { + elemptr = input_data[start_row++] + start_col; +#if DCTSIZE == 8 /* unroll the inner loop */ + *localblkptr++ = (DCTELEM) (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); + *localblkptr++ = (DCTELEM) (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); + *localblkptr++ = (DCTELEM) (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); + *localblkptr++ = (DCTELEM) (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); + *localblkptr++ = (DCTELEM) (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); + *localblkptr++ = (DCTELEM) (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); + *localblkptr++ = (DCTELEM) (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); + *localblkptr++ = (DCTELEM) (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); +#else + for (elemc = DCTSIZE; elemc > 0; elemc--) { + *localblkptr++ = (DCTELEM) (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); + } +#endif + } + } + +#ifdef DCT_ERR_STATS + MEMCOPY(svblock, block, SIZEOF(DCTBLOCK)); +#endif + + j_fwd_dct(block); + + { register JCOEF temp; + register short i; + + for (i = 0; i < DCTSIZE2; i++) { + temp = (JCOEF) block[ZAG[i]]; + /* divide by *quanttbl, ensuring proper rounding */ + if (temp < 0) { + temp = -temp; + temp += *quanttbl>>1; + temp /= *quanttbl; + temp = -temp; + } else { + temp += *quanttbl>>1; + temp /= *quanttbl; + } + *output_data++ = temp; + quanttbl++; + } + } + +#ifdef DCT_ERR_STATS + j_rev_dct(block); + + { register int diff; + register short i; + + for (i = 0; i < DCTSIZE2; i++) { + diff = block[i] - svblock[i]; + if (diff < 0) diff = -diff; + dcterrorsum += diff; + if (dcterrormax < diff) dcterrormax = diff; + } + dctcoefcount += DCTSIZE2; + } +#endif +} + + +/* + * Extract samples in MCU order, process & hand off to output_method. + * The input is always exactly N MCU rows worth of data. + */ + +#ifdef XIE_SUPPORTED +METHODDEF int +#if NeedFunctionPrototypes +extract_MCUs (compress_info_ptr cinfo, + JSAMPIMAGE image_data, + int num_mcu_rows, + MCU_output_method_ptr output_method) +#else +extract_MCUs (cinfo, image_data, num_mcu_rows, output_method) + compress_info_ptr cinfo; + JSAMPIMAGE image_data; + int num_mcu_rows; + MCU_output_method_ptr output_method; +#endif /* NeedFunctionPrototypes */ +{ + JBLOCK MCU_data[MAX_BLOCKS_IN_MCU]; + int mcurow; + long mcuindex; + int startrow; + long startindex; + short blkn, ci, xpos, ypos; + jpeg_component_info * compptr; + QUANT_TBL_PTR quant_ptr; + + if (cinfo->XIErestart == XIE_RMCU) { + startrow = cinfo->XIEmcurow; + startindex = cinfo->XIEmcuindex; + cinfo->XIErestart = XIE_RNUL; + } else { + startrow = 0; + startindex = 0; + } + for (mcurow = startrow; mcurow < num_mcu_rows; mcurow++) { + for (mcuindex = startindex; mcuindex < cinfo->MCUs_per_row; mcuindex++) { + /* Extract data from the image array, DCT it, and quantize it */ + blkn = 0; + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + quant_ptr = cinfo->quant_tbl_ptrs[compptr->quant_tbl_no]; + for (ypos = 0; ypos < compptr->MCU_height; ypos++) { + for (xpos = 0; xpos < compptr->MCU_width; xpos++) { + extract_block(image_data[ci], + (mcurow * compptr->MCU_height + ypos)*DCTSIZE, + (mcuindex * compptr->MCU_width + xpos)*DCTSIZE, + MCU_data[blkn], quant_ptr); + blkn++; + } + } + } + /* Send the MCU whereever the pipeline controller wants it to go */ + cinfo->XIEbytes_in_buffer = cinfo->bytes_in_buffer; + if ((*output_method) (cinfo, MCU_data) < 0) { + cinfo->XIErestart = XIE_RMCU; + cinfo->XIEmcurow = mcurow; + cinfo->XIEmcuindex = mcuindex; + cinfo->bytes_in_buffer = cinfo->XIEbytes_in_buffer; + return(-1); + } + } + } + return(0); +} +#else +METHODDEF void +extract_MCUs (compress_info_ptr cinfo, + JSAMPIMAGE image_data, + int num_mcu_rows, + MCU_output_method_ptr output_method) +{ + JBLOCK MCU_data[MAX_BLOCKS_IN_MCU]; + int mcurow; + long mcuindex; + short blkn, ci, xpos, ypos; + jpeg_component_info * compptr; + QUANT_TBL_PTR quant_ptr; + + for (mcurow = 0; mcurow < num_mcu_rows; mcurow++) { + for (mcuindex = 0; mcuindex < cinfo->MCUs_per_row; mcuindex++) { + /* Extract data from the image array, DCT it, and quantize it */ + blkn = 0; + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + quant_ptr = cinfo->quant_tbl_ptrs[compptr->quant_tbl_no]; + for (ypos = 0; ypos < compptr->MCU_height; ypos++) { + for (xpos = 0; xpos < compptr->MCU_width; xpos++) { + extract_block(image_data[ci], + (mcurow * compptr->MCU_height + ypos)*DCTSIZE, + (mcuindex * compptr->MCU_width + xpos)*DCTSIZE, + MCU_data[blkn], quant_ptr); + blkn++; + } + } + } + /* Send the MCU whereever the pipeline controller wants it to go */ + (*output_method) (cinfo, MCU_data); + } + } +} +#endif + + +/* + * Initialize for processing a scan. + */ + +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +extract_init (compress_info_ptr cinfo) +#else +extract_init (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +extract_init (compress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + /* no work for now */ +#ifdef DCT_ERR_STATS + dcterrorsum = dcterrormax = dctcoefcount = 0; +#endif +} + + +/* + * Clean up after a scan. + */ + +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +extract_term (compress_info_ptr cinfo) +#else +extract_term (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +extract_term (compress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + /* no work for now */ +#ifndef XIE_SUPPORTED +#ifdef DCT_ERR_STATS + TRACEMS3(cinfo->emethods, 0, "DCT roundoff errors = %d/%d, max = %d", + dcterrorsum, dctcoefcount, dcterrormax); +#endif +#endif /* XIE_SUPPORTED */ +} + + + +/* + * The method selection routine for MCU extraction. + */ + +GLOBAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +jselcmcu (compress_info_ptr cinfo) +#else +jselcmcu (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +jselcmcu (compress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + /* just one implementation for now */ + cinfo->methods->extract_init = extract_init; + cinfo->methods->extract_MCUs = extract_MCUs; + cinfo->methods->extract_term = extract_term; +} diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jconfig.h b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jconfig.h new file mode 100644 index 0000000..42568ee --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jconfig.h @@ -0,0 +1,480 @@ +/* $XConsortium: jconfig.h,v 1.4 94/04/17 20:35:30 rws Exp $ */ +/* Module jconfig.h */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., Ocober 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +/* + * jconfig.h + * + * Copyright (C) 1991, 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains preprocessor declarations that help customize + * the JPEG software for a particular application, machine, or compiler. + * Edit these declarations as needed (or add -D flags to the Makefile). + */ + + +/* + * These symbols indicate the properties of your machine or compiler. + * The conditional definitions given may do the right thing already, + * but you'd best look them over closely, especially if your compiler + * does not handle full ANSI C. An ANSI-compliant C compiler should + * provide all the necessary features; __STDC__ is supposed to be + * predefined by such compilers. + */ + +/* + * HAVE_STDC is tested below to see whether ANSI features are available. + * We avoid testing __STDC__ directly for arcane reasons of portability. + * (On some compilers, __STDC__ is only defined if a switch is given, + * but the switch also disables machine-specific features we need to get at. + * In that case, -DHAVE_STDC in the Makefile is a convenient solution.) + */ + +#ifdef __STDC__ /* if compiler claims to be ANSI, believe it */ +#define HAVE_STDC +#endif + + +/* Does your compiler support function prototypes? */ +/* (If not, you also need to use ansi2knr, see SETUP) */ + +#ifdef HAVE_STDC /* ANSI C compilers always have prototypes */ +#define PROTO +#else +#ifdef __cplusplus /* So do C++ compilers */ +#define PROTO +#endif +#endif + +/* Does your compiler support the declaration "unsigned char" ? */ +/* How about "unsigned short" ? */ + +#ifdef HAVE_STDC /* ANSI C compilers must support both */ +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +#endif + +/* Define this if an ordinary "char" type is unsigned. + * If you're not sure, leaving it undefined will work at some cost in speed. + * If you defined HAVE_UNSIGNED_CHAR then it doesn't matter very much. + */ + +/* #define CHAR_IS_UNSIGNED */ + +/* Define this if your compiler implements ">>" on signed values as a logical + * (unsigned) shift; leave it undefined if ">>" is a signed (arithmetic) shift, + * which is the normal and rational definition. + */ + +/* #define RIGHT_SHIFT_IS_UNSIGNED */ + +/* Define "void" as "char" if your compiler doesn't know about type void. + * NOTE: be sure to define void such that "void *" represents the most general + * pointer type, e.g., that returned by malloc(). + */ + +/* #define void char */ + +/* Define const as empty if your compiler doesn't know the "const" keyword. */ +/* (Even if it does, defining const as empty won't break anything.) */ + +#ifndef HAVE_STDC /* ANSI C and C++ compilers should know it. */ +#ifndef __cplusplus +#define const +#endif +#endif + +/* For 80x86 machines, you need to define NEED_FAR_POINTERS, + * unless you are using a large-data memory model or 80386 flat-memory mode. + * On less brain-damaged CPUs this symbol must not be defined. + * (Defining this symbol causes large data structures to be referenced through + * "far" pointers and to be allocated with a special version of malloc.) + */ + +#ifdef XIE_SUPPORTED +#ifdef MSDOS +#undef MSDOS +#endif /* MSDOS */ + +/* Make sure that HAVE_UNSIGNED_CHAR and HAVE_UNSIGNED_SHORT + * are defined when XIE_SUPPORTED is defined + */ +#ifndef HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_CHAR +#endif /* HAVE_UNSIGNED_CHAR */ +#ifndef HAVE_UNSIGNED_SHORT +#define HAVE_UNSIGNED_SHORT +#endif /* HAVE_UNSIGNED_SHORT */ +#endif /* XIE_SUPPORTED */ + +#ifdef MSDOS +#define NEED_FAR_POINTERS +#endif + + +/* The next three symbols only affect the system-dependent user interface + * modules (jcmain.c, jdmain.c). You can ignore these if you are supplying + * your own user interface code. + */ + +/* Define this if you want to name both input and output files on the command + * line, rather than using stdout and optionally stdin. You MUST do this if + * your system can't cope with binary I/O to stdin/stdout. See comments at + * head of jcmain.c or jdmain.c. + */ + +#ifdef MSDOS /* two-file style is needed for PCs */ +#ifndef USE_SETMODE /* unless you have setmode() */ +#define TWO_FILE_COMMANDLINE +#endif +#endif +#ifdef THINK_C /* it's needed for Macintosh too */ +#define TWO_FILE_COMMANDLINE +#endif + +/* Define this if your system needs explicit cleanup of temporary files. + * This is crucial under MS-DOS, where the temporary "files" may be areas + * of extended memory; on most other systems it's not as important. + */ + +#ifdef MSDOS +#define NEED_SIGNAL_CATCHER +#endif + +/* By default, we open image files with fopen(...,"rb") or fopen(...,"wb"). + * This is necessary on systems that distinguish text files from binary files, + * and is harmless on most systems that don't. If you have one of the rare + * systems that complains about the "b" spec, define this symbol. + */ + +/* #define DONT_USE_B_MODE */ + + +/* If you're getting bored, that's the end of the symbols you HAVE to + * worry about. Go fix the makefile and compile. + */ + + +/* If your compiler supports inline functions, define INLINE + * as the inline keyword; otherwise define it as empty. + */ + +#ifdef __GNUC__ /* for instance, GNU C knows about inline */ +#define INLINE __inline__ +#endif +#ifndef INLINE /* default is to define it as empty */ +#define INLINE +#endif + +/* On a few systems, type boolean and/or macros FALSE, TRUE may appear + * in standard header files. Or you may have conflicts with application- + * specific header files that you want to include together with these files. + * In that case you need only comment out these definitions. + */ + +typedef int boolean; +#undef FALSE /* in case these macros already exist */ +#undef TRUE +#define FALSE 0 /* values of boolean */ +#define TRUE 1 + +/* This defines the size of the I/O buffers for entropy compression + * and decompression; you could reduce it if memory is tight. + */ + +#define JPEG_BUF_SIZE 4096 /* bytes */ + + + +/* These symbols determine the JPEG functionality supported. */ + +/* + * These defines indicate whether to include various optional functions. + * Undefining some of these symbols will produce a smaller but less capable + * program file. Note that you can leave certain source files out of the + * compilation/linking process if you've #undef'd the corresponding symbols. + * (You may HAVE to do that if your compiler doesn't like null source files.) + */ + +#ifdef XIE_SUPPORTED +/* Arithmetic coding is unsupported for legal reasons. Complaints to IBM. */ + +/* Encoder capability options: */ +#undef C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#undef C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? (NYI) */ +#undef ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ +#undef INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */ +/* Decoder capability options: */ +#undef D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#undef D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#undef BLOCK_SMOOTHING_SUPPORTED /* Block smoothing during decoding? */ +#undef QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ +#undef QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ +/* these defines indicate which JPEG file formats are allowed */ +#define JFIF_SUPPORTED /* JFIF or "raw JPEG" files */ +#undef JTIFF_SUPPORTED /* JPEG-in-TIFF (not yet implemented) */ +/* these defines indicate which image (non-JPEG) file formats are allowed */ +#undef GIF_SUPPORTED /* GIF image file format */ +/* #define RLE_SUPPORTED */ /* RLE image file format (by default, no) */ +#undef PPM_SUPPORTED /* PPM/PGM image file format */ +#undef TARGA_SUPPORTED /* Targa image file format */ +#undef TIFF_SUPPORTED /* TIFF image file format (not yet impl.) */ + +/* more capability options later, no doubt */ +#else +/* Arithmetic coding is unsupported for legal reasons. Complaints to IBM. */ + +/* Encoder capability options: */ +#undef C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#undef C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? (NYI) */ +#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ +#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */ +/* Decoder capability options: */ +#undef D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing during decoding? */ +#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ +#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ +/* these defines indicate which JPEG file formats are allowed */ +#define JFIF_SUPPORTED /* JFIF or "raw JPEG" files */ +#undef JTIFF_SUPPORTED /* JPEG-in-TIFF (not yet implemented) */ +/* these defines indicate which image (non-JPEG) file formats are allowed */ +#define GIF_SUPPORTED /* GIF image file format */ +/* #define RLE_SUPPORTED */ /* RLE image file format (by default, no) */ +#define PPM_SUPPORTED /* PPM/PGM image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ +#undef TIFF_SUPPORTED /* TIFF image file format (not yet impl.) */ + +/* more capability options later, no doubt */ +#endif /* XIE_SUPPORTED */ + + +/* + * Define exactly one of these three symbols to indicate whether you want + * 8-bit, 12-bit, or 16-bit sample (pixel component) values. 8-bit is the + * default and is nearly always the right thing to use. You can use 12-bit if + * you need to support image formats with more than 8 bits of resolution in a + * color value. 16-bit should only be used for the lossless JPEG mode (not + * currently supported). Note that 12- and 16-bit values take up twice as + * much memory as 8-bit! + * Note: if you select 12- or 16-bit precision, it is dangerous to turn off + * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit + * precision, so jchuff.c normally uses entropy optimization to compute + * usable tables for higher precision. If you don't want to do optimization, + * you'll have to supply different default Huffman tables. + */ + +#define EIGHT_BIT_SAMPLES +#undef TWELVE_BIT_SAMPLES +#undef SIXTEEN_BIT_SAMPLES + + + +/* + * The remaining definitions don't need to be hand-edited in most cases. + * You may need to change these if you have a machine with unusual data + * types; for example, "char" not 8 bits, "short" not 16 bits, + * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits, + * but it had better be at least 16. + */ + +/* First define the representation of a single pixel element value. */ + +#ifdef EIGHT_BIT_SAMPLES +/* JSAMPLE should be the smallest type that will hold the values 0..255. + * You can use a signed char by having GETJSAMPLE mask it with 0xFF. + * If you have only signed chars, and you are more worried about speed than + * memory usage, it might be a win to make JSAMPLE be short. + */ + +#ifdef HAVE_UNSIGNED_CHAR + +typedef unsigned char JSAMPLE; +#define GETJSAMPLE(value) (value) + +#else /* not HAVE_UNSIGNED_CHAR */ +#ifdef CHAR_IS_UNSIGNED + +typedef char JSAMPLE; +#define GETJSAMPLE(value) (value) + +#else /* not CHAR_IS_UNSIGNED */ + +typedef char JSAMPLE; +#define GETJSAMPLE(value) ((value) & 0xFF) + +#endif /* CHAR_IS_UNSIGNED */ +#endif /* HAVE_UNSIGNED_CHAR */ + +#define BITS_IN_JSAMPLE 8 +#define MAXJSAMPLE 255 +#define CENTERJSAMPLE 128 + +#endif /* EIGHT_BIT_SAMPLES */ + + +#ifdef TWELVE_BIT_SAMPLES +/* JSAMPLE should be the smallest type that will hold the values 0..4095. */ +/* On nearly all machines "short" will do nicely. */ + +typedef short JSAMPLE; +#define GETJSAMPLE(value) (value) + +#define BITS_IN_JSAMPLE 12 +#define MAXJSAMPLE 4095 +#define CENTERJSAMPLE 2048 + +#endif /* TWELVE_BIT_SAMPLES */ + + +#ifdef SIXTEEN_BIT_SAMPLES +/* JSAMPLE should be the smallest type that will hold the values 0..65535. */ + +#ifdef HAVE_UNSIGNED_SHORT + +typedef unsigned short JSAMPLE; +#define GETJSAMPLE(value) (value) + +#else /* not HAVE_UNSIGNED_SHORT */ + +/* If int is 32 bits this'll be horrendously inefficient storage-wise. + * But since we don't actually support 16-bit samples (ie lossless coding) yet, + * I'm not going to worry about making a smarter definition ... + */ +typedef unsigned int JSAMPLE; +#define GETJSAMPLE(value) (value) + +#endif /* HAVE_UNSIGNED_SHORT */ + +#define BITS_IN_JSAMPLE 16 +#define MAXJSAMPLE 65535 +#define CENTERJSAMPLE 32768 + +#endif /* SIXTEEN_BIT_SAMPLES */ + + +/* Here we define the representation of a DCT frequency coefficient. + * This should be a signed 16-bit value; "short" is usually right. + * It's important that this be exactly 16 bits, no more and no less; + * more will cost you a BIG hit of memory, less will give wrong answers. + */ + +typedef short JCOEF; + + +/* The remaining typedefs are used for various table entries and so forth. + * They must be at least as wide as specified; but making them too big + * won't cost a huge amount of memory, so we don't provide special + * extraction code like we did for JSAMPLE. (In other words, these + * typedefs live at a different point on the speed/space tradeoff curve.) + */ + +/* UINT8 must hold at least the values 0..255. */ + +#ifdef HAVE_UNSIGNED_CHAR +typedef unsigned char UINT8; +#else /* not HAVE_UNSIGNED_CHAR */ +#ifdef CHAR_IS_UNSIGNED +typedef char UINT8; +#else /* not CHAR_IS_UNSIGNED */ +typedef short UINT8; +#endif /* CHAR_IS_UNSIGNED */ +#endif /* HAVE_UNSIGNED_CHAR */ + +/* UINT16 must hold at least the values 0..65535. */ + +#ifdef HAVE_UNSIGNED_SHORT +typedef unsigned short UINT16; +#else /* not HAVE_UNSIGNED_SHORT */ +typedef unsigned int UINT16; +#endif /* HAVE_UNSIGNED_SHORT */ + +/* INT16 must hold at least the values -32768..32767. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ +typedef short INT16; +#endif + +/* INT32 must hold signed 32-bit values; if your machine happens */ +/* to have 64-bit longs, you might want to change this. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ +#ifdef __alpha +typedef int INT32; +#else +typedef long INT32; +#endif +#endif + diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jcsample.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jcsample.c new file mode 100644 index 0000000..66a4a6e --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jcsample.c @@ -0,0 +1,737 @@ +/* $XConsortium: jcsample.c,v 1.4 94/04/17 20:35:31 rws Exp $ */ +/* Module jcsample.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., October 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +/* + * jcsample.c + * + * Copyright (C) 1991, 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains downsampling routines. + * These routines are invoked via the downsample and + * downsample_init/term methods. + * + * An excellent reference for image resampling is + * Digital Image Warping, George Wolberg, 1990. + * Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7. + * + * The downsampling algorithm used here is a simple average of the source + * pixels covered by the output pixel. The hi-falutin sampling literature + * refers to this as a "box filter". In general the characteristics of a box + * filter are not very good, but for the specific cases we normally use (1:1 + * and 2:1 ratios) the box is equivalent to a "triangle filter" which is not + * nearly so bad. If you intend to use other sampling ratios, you'd be well + * advised to improve this code. + * + * A simple input-smoothing capability is provided. This is mainly intended + * for cleaning up color-dithered GIF input files (if you find it inadequate, + * we suggest using an external filtering program such as pnmconvol). When + * enabled, each input pixel P is replaced by a weighted sum of itself and its + * eight neighbors. P's weight is 1-8*SF and each neighbor's weight is SF, + * where SF = (smoothing_factor / 1024). + * Currently, smoothing is only supported for 2h2v sampling factors. + */ + +#include "jinclude.h" + + +/* + * Initialize for downsampling a scan. + */ + +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +downsample_init (compress_info_ptr cinfo) +#else +downsample_init (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +downsample_init (compress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + /* no work for now */ +} + + +/* + * Downsample pixel values of a single component. + * This version handles arbitrary integral sampling ratios, without smoothing. + * Note that this version is not actually used for customary sampling ratios. + */ + +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +int_downsample (compress_info_ptr cinfo, int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, + JSAMPARRAY output_data) +#else +int_downsample (cinfo, which_component, + input_cols, input_rows, + output_cols, output_rows, + above, input_data, below, + output_data) + compress_info_ptr cinfo; + int which_component; + long input_cols; + int input_rows; + long output_cols; + int output_rows; + JSAMPARRAY above; + JSAMPARRAY input_data; + JSAMPARRAY below; + JSAMPARRAY output_data; +#endif /* NeedFunctionPrototypes */ +#else +int_downsample (compress_info_ptr cinfo, int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, + JSAMPARRAY output_data) +#endif /* XIE_SUPPORTED */ +{ + jpeg_component_info * compptr = cinfo->cur_comp_info[which_component]; + int inrow, outrow, h_expand, v_expand, numpix, numpix2, h, v; + long outcol, outcol_h; /* outcol_h == outcol*h_expand */ + JSAMPROW inptr, outptr; + INT32 outvalue; + +#ifndef XIE_SUPPORTED +#ifdef DEBUG /* for debugging pipeline controller */ + if (output_rows != compptr->v_samp_factor || + input_rows != cinfo->max_v_samp_factor || + (output_cols % compptr->h_samp_factor) != 0 || + (input_cols % cinfo->max_h_samp_factor) != 0 || + input_cols*compptr->h_samp_factor != output_cols*cinfo->max_h_samp_factor) + ERREXIT(cinfo->emethods, "Bogus downsample parameters"); +#endif +#endif /* XIE_SUPPORTED */ + + h_expand = cinfo->max_h_samp_factor / compptr->h_samp_factor; + v_expand = cinfo->max_v_samp_factor / compptr->v_samp_factor; + numpix = h_expand * v_expand; + numpix2 = numpix/2; + + inrow = 0; + for (outrow = 0; outrow < output_rows; outrow++) { + outptr = output_data[outrow]; + for (outcol = 0, outcol_h = 0; outcol < output_cols; + outcol++, outcol_h += h_expand) { + outvalue = 0; + for (v = 0; v < v_expand; v++) { + inptr = input_data[inrow+v] + outcol_h; + for (h = 0; h < h_expand; h++) { + outvalue += (INT32) GETJSAMPLE(*inptr++); + } + } + *outptr++ = (JSAMPLE) ((outvalue + numpix2) / numpix); + } + inrow += v_expand; + } +} + + +/* + * Downsample pixel values of a single component. + * This version handles the common case of 2:1 horizontal and 1:1 vertical, + * without smoothing. + */ + +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +h2v1_downsample (compress_info_ptr cinfo, int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, + JSAMPARRAY output_data) +#else +h2v1_downsample (cinfo, which_component, + input_cols, input_rows, + output_cols, output_rows, + above, input_data, below, + output_data) + compress_info_ptr cinfo; + int which_component; + long input_cols; + int input_rows; + long output_cols; + int output_rows; + JSAMPARRAY above; + JSAMPARRAY input_data; + JSAMPARRAY below; + JSAMPARRAY output_data; +#endif /* NeedFunctionPrototypes */ +#else +h2v1_downsample (compress_info_ptr cinfo, int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, + JSAMPARRAY output_data) +#endif /* XIE_SUPPORTED */ +{ + int outrow; + long outcol; + register JSAMPROW inptr, outptr; + +#ifndef XIE_SUPPORTED +#ifdef DEBUG /* for debugging pipeline controller */ + jpeg_component_info * compptr = cinfo->cur_comp_info[which_component]; + if (output_rows != compptr->v_samp_factor || + input_rows != cinfo->max_v_samp_factor || + (output_cols % compptr->h_samp_factor) != 0 || + (input_cols % cinfo->max_h_samp_factor) != 0 || + input_cols*compptr->h_samp_factor != output_cols*cinfo->max_h_samp_factor) + ERREXIT(cinfo->emethods, "Bogus downsample parameters"); +#endif +#endif /* XIE_SUPPORTED */ + + for (outrow = 0; outrow < output_rows; outrow++) { + outptr = output_data[outrow]; + inptr = input_data[outrow]; + for (outcol = 0; outcol < output_cols; outcol++) { + *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr) + GETJSAMPLE(inptr[1]) + + 1) >> 1); + inptr += 2; + } + } +} + + +/* + * Downsample pixel values of a single component. + * This version handles the standard case of 2:1 horizontal and 2:1 vertical, + * without smoothing. + */ + +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +h2v2_downsample (compress_info_ptr cinfo, int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, + JSAMPARRAY output_data) +#else +h2v2_downsample (cinfo, which_component, + input_cols, input_rows, + output_cols, output_rows, + above, input_data, below, + output_data) + compress_info_ptr cinfo; + int which_component; + long input_cols; + int input_rows; + long output_cols; + int output_rows; + JSAMPARRAY above; + JSAMPARRAY input_data; + JSAMPARRAY below; + JSAMPARRAY output_data; +#endif /* NeedFunctionPrototypes */ +#else +h2v2_downsample (compress_info_ptr cinfo, int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, + JSAMPARRAY output_data) +#endif /* XIE_SUPPORTED */ +{ + int inrow, outrow; + long outcol; + register JSAMPROW inptr0, inptr1, outptr; + +#ifndef XIE_SUPPORTED +#ifdef DEBUG /* for debugging pipeline controller */ + jpeg_component_info * compptr = cinfo->cur_comp_info[which_component]; + if (output_rows != compptr->v_samp_factor || + input_rows != cinfo->max_v_samp_factor || + (output_cols % compptr->h_samp_factor) != 0 || + (input_cols % cinfo->max_h_samp_factor) != 0 || + input_cols*compptr->h_samp_factor != output_cols*cinfo->max_h_samp_factor) + ERREXIT(cinfo->emethods, "Bogus downsample parameters"); +#endif +#endif /* XIE_SUPPORTED */ + + inrow = 0; + for (outrow = 0; outrow < output_rows; outrow++) { + outptr = output_data[outrow]; + inptr0 = input_data[inrow]; + inptr1 = input_data[inrow+1]; + for (outcol = 0; outcol < output_cols; outcol++) { + *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + + GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]) + + 2) >> 2); + inptr0 += 2; inptr1 += 2; + } + inrow += 2; + } +} + + +/* + * Downsample pixel values of a single component. + * This version handles the special case of a full-size component, + * without smoothing. + */ + +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +fullsize_downsample (compress_info_ptr cinfo, int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, + JSAMPARRAY output_data) +#else +fullsize_downsample (cinfo, which_component, + input_cols, input_rows, + output_cols, output_rows, + above, input_data, below, + output_data) + compress_info_ptr cinfo; + int which_component; + long input_cols; + int input_rows; + long output_cols; + int output_rows; + JSAMPARRAY above; + JSAMPARRAY input_data; + JSAMPARRAY below; + JSAMPARRAY output_data; +#endif /* NeedFunctionPrototypes */ +#else +fullsize_downsample (compress_info_ptr cinfo, int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, + JSAMPARRAY output_data) +#endif /* XIE_SUPPORTED */ +{ +#ifndef XIE_SUPPORTED +#ifdef DEBUG /* for debugging pipeline controller */ + if (input_cols != output_cols || input_rows != output_rows) + ERREXIT(cinfo->emethods, "Pipeline controller messed up"); +#endif +#endif /* XIE_SUPPORTED */ + + jcopy_sample_rows(input_data, 0, output_data, 0, output_rows, output_cols); +} + + +#ifdef INPUT_SMOOTHING_SUPPORTED + +/* + * Downsample pixel values of a single component. + * This version handles the standard case of 2:1 horizontal and 2:1 vertical, + * with smoothing. + */ + +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +h2v2_smooth_downsample (compress_info_ptr cinfo, int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, + JSAMPARRAY output_data) +#else +h2v2_smooth_downsample (cinfo, which_component, + input_cols, input_rows, + output_cols, output_rows, + above, input_data, below, + output_data) + compress_info_ptr cinfo; + int which_component; + long input_cols; + int input_rows; + long output_cols; + int output_rows; + JSAMPARRAY above; + JSAMPARRAY input_data; + JSAMPARRAY below; + JSAMPARRAY output_data; +#endif /* NeedFunctionPrototypes */ +#else +h2v2_smooth_downsample (compress_info_ptr cinfo, int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, + JSAMPARRAY output_data) +#endif /* XIE_SUPPORTED */ +{ + int inrow, outrow; + long colctr; + register JSAMPROW inptr0, inptr1, above_ptr, below_ptr, outptr; + INT32 membersum, neighsum, memberscale, neighscale; + +#ifndef XIE_SUPPORTED +#ifdef DEBUG /* for debugging pipeline controller */ + jpeg_component_info * compptr = cinfo->cur_comp_info[which_component]; + if (output_rows != compptr->v_samp_factor || + input_rows != cinfo->max_v_samp_factor || + (output_cols % compptr->h_samp_factor) != 0 || + (input_cols % cinfo->max_h_samp_factor) != 0 || + input_cols*compptr->h_samp_factor != output_cols*cinfo->max_h_samp_factor) + ERREXIT(cinfo->emethods, "Bogus downsample parameters"); +#endif +#endif /* XIE_SUPPORTED */ + + /* We don't bother to form the individual "smoothed" input pixel values; + * we can directly compute the output which is the average of the four + * smoothed values. Each of the four member pixels contributes a fraction + * (1-8*SF) to its own smoothed image and a fraction SF to each of the three + * other smoothed pixels, therefore a total fraction (1-5*SF)/4 to the final + * output. The four corner-adjacent neighbor pixels contribute a fraction + * SF to just one smoothed pixel, or SF/4 to the final output; while the + * eight edge-adjacent neighbors contribute SF to each of two smoothed + * pixels, or SF/2 overall. In order to use integer arithmetic, these + * factors are scaled by 2^16 = 65536. + * Also recall that SF = smoothing_factor / 1024. + */ + + memberscale = 16384 - cinfo->smoothing_factor * 80; /* scaled (1-5*SF)/4 */ + neighscale = cinfo->smoothing_factor * 16; /* scaled SF/4 */ + + inrow = 0; + for (outrow = 0; outrow < output_rows; outrow++) { + outptr = output_data[outrow]; + inptr0 = input_data[inrow]; + inptr1 = input_data[inrow+1]; + if (inrow == 0) + above_ptr = above[input_rows-1]; + else + above_ptr = input_data[inrow-1]; + if (inrow >= input_rows-2) + below_ptr = below[0]; + else + below_ptr = input_data[inrow+2]; + + /* Special case for first column: pretend column -1 is same as column 0 */ + membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + + GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); + neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + + GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + + GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[2]) + + GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[2]); + neighsum += neighsum; + neighsum += GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[2]) + + GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[2]); + membersum = membersum * memberscale + neighsum * neighscale; + *outptr++ = (JSAMPLE) ((membersum + 32768L) >> 16); + inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2; + + for (colctr = output_cols - 2; colctr > 0; colctr--) { + /* sum of pixels directly mapped to this output element */ + membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + + GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); + /* sum of edge-neighbor pixels */ + neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + + GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + + GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[2]) + + GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[2]); + /* The edge-neighbors count twice as much as corner-neighbors */ + neighsum += neighsum; + /* Add in the corner-neighbors */ + neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[2]) + + GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[2]); + /* form final output scaled up by 2^16 */ + membersum = membersum * memberscale + neighsum * neighscale; + /* round, descale and output it */ + *outptr++ = (JSAMPLE) ((membersum + 32768L) >> 16); + inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2; + } + + /* Special case for last column */ + membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + + GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); + neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + + GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + + GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[1]) + + GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[1]); + neighsum += neighsum; + neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[1]) + + GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[1]); + membersum = membersum * memberscale + neighsum * neighscale; + *outptr = (JSAMPLE) ((membersum + 32768L) >> 16); + + inrow += 2; + } +} + + +/* + * Downsample pixel values of a single component. + * This version handles the special case of a full-size component, + * with smoothing. + */ + +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +fullsize_smooth_downsample (compress_info_ptr cinfo, int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, + JSAMPARRAY output_data) +#else +fullsize_smooth_downsample (cinfo, which_component, + input_cols, input_rows, + output_cols, output_rows, + above, input_data, below, + output_data) + compress_info_ptr cinfo; + int which_component; + long input_cols; + int input_rows; + long output_cols; + int output_rows; + JSAMPARRAY above; + JSAMPARRAY input_data; + JSAMPARRAY below; + JSAMPARRAY output_data; +#endif /* NeedFunctionPrototypes */ +#else +fullsize_smooth_downsample (compress_info_ptr cinfo, int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, + JSAMPARRAY output_data) +#endif /* XIE_SUPPORTED */ +{ + int outrow; + long colctr; + register JSAMPROW inptr, above_ptr, below_ptr, outptr; + INT32 membersum, neighsum, memberscale, neighscale; + int colsum, lastcolsum, nextcolsum; + +#ifndef XIE_SUPPORTED +#ifdef DEBUG /* for debugging pipeline controller */ + if (input_cols != output_cols || input_rows != output_rows) + ERREXIT(cinfo->emethods, "Pipeline controller messed up"); +#endif +#endif /* XIE_SUPPORTED */ + + /* Each of the eight neighbor pixels contributes a fraction SF to the + * smoothed pixel, while the main pixel contributes (1-8*SF). In order + * to use integer arithmetic, these factors are multiplied by 2^16 = 65536. + * Also recall that SF = smoothing_factor / 1024. + */ + + memberscale = 65536L - cinfo->smoothing_factor * 512L; /* scaled 1-8*SF */ + neighscale = cinfo->smoothing_factor * 64; /* scaled SF */ + + for (outrow = 0; outrow < output_rows; outrow++) { + outptr = output_data[outrow]; + inptr = input_data[outrow]; + if (outrow == 0) + above_ptr = above[input_rows-1]; + else + above_ptr = input_data[outrow-1]; + if (outrow >= input_rows-1) + below_ptr = below[0]; + else + below_ptr = input_data[outrow+1]; + + /* Special case for first column */ + colsum = GETJSAMPLE(*above_ptr++) + GETJSAMPLE(*below_ptr++) + + GETJSAMPLE(*inptr); + membersum = GETJSAMPLE(*inptr++); + nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) + + GETJSAMPLE(*inptr); + neighsum = colsum + (colsum - membersum) + nextcolsum; + membersum = membersum * memberscale + neighsum * neighscale; + *outptr++ = (JSAMPLE) ((membersum + 32768L) >> 16); + lastcolsum = colsum; colsum = nextcolsum; + + for (colctr = output_cols - 2; colctr > 0; colctr--) { + membersum = GETJSAMPLE(*inptr++); + above_ptr++; below_ptr++; + nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) + + GETJSAMPLE(*inptr); + neighsum = lastcolsum + (colsum - membersum) + nextcolsum; + membersum = membersum * memberscale + neighsum * neighscale; + *outptr++ = (JSAMPLE) ((membersum + 32768L) >> 16); + lastcolsum = colsum; colsum = nextcolsum; + } + + /* Special case for last column */ + membersum = GETJSAMPLE(*inptr); + neighsum = lastcolsum + (colsum - membersum) + colsum; + membersum = membersum * memberscale + neighsum * neighscale; + *outptr = (JSAMPLE) ((membersum + 32768L) >> 16); + + } +} + +#endif /* INPUT_SMOOTHING_SUPPORTED */ + + +/* + * Clean up after a scan. + */ + +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +downsample_term (compress_info_ptr cinfo) +#else +downsample_term (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +downsample_term (compress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + /* no work for now */ +} + + + +/* + * The method selection routine for downsampling. + * Note that we must select a routine for each component. + */ + +GLOBAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +jseldownsample (compress_info_ptr cinfo) +#else +jseldownsample (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +jseldownsample (compress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + short ci; + jpeg_component_info * compptr; + boolean smoothok = TRUE; + +#ifndef XIE_SUPPORTED + if (cinfo->CCIR601_sampling) + ERREXIT(cinfo->emethods, "CCIR601 downsampling not implemented yet"); +#endif /* XIE_SUPPORTED */ + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + if (compptr->h_samp_factor == cinfo->max_h_samp_factor && + compptr->v_samp_factor == cinfo->max_v_samp_factor) { +#ifdef INPUT_SMOOTHING_SUPPORTED + if (cinfo->smoothing_factor) + cinfo->methods->downsample[ci] = fullsize_smooth_downsample; + else +#endif + cinfo->methods->downsample[ci] = fullsize_downsample; + } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor && + compptr->v_samp_factor == cinfo->max_v_samp_factor) { + smoothok = FALSE; + cinfo->methods->downsample[ci] = h2v1_downsample; + } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor && + compptr->v_samp_factor * 2 == cinfo->max_v_samp_factor) { +#ifdef INPUT_SMOOTHING_SUPPORTED + if (cinfo->smoothing_factor) + cinfo->methods->downsample[ci] = h2v2_smooth_downsample; + else +#endif + cinfo->methods->downsample[ci] = h2v2_downsample; + } else if ((cinfo->max_h_samp_factor % compptr->h_samp_factor) == 0 && + (cinfo->max_v_samp_factor % compptr->v_samp_factor) == 0) { + smoothok = FALSE; + cinfo->methods->downsample[ci] = int_downsample; + } else +#ifdef XIE_SUPPORTED + {} +#else + ERREXIT(cinfo->emethods, "Fractional downsampling not implemented yet"); +#endif /* XIE_SUPPORTED */ + } + +#ifndef XIE_SUPPORTED +#ifdef INPUT_SMOOTHING_SUPPORTED + if (cinfo->smoothing_factor && !smoothok) + TRACEMS(cinfo->emethods, 0, + "Smoothing not supported with nonstandard sampling ratios"); +#endif +#endif /* XIE_SUPPORTED */ + + cinfo->methods->downsample_init = downsample_init; + cinfo->methods->downsample_term = downsample_term; +} diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jcxie.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jcxie.c new file mode 100644 index 0000000..0033464 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jcxie.c @@ -0,0 +1,689 @@ +/* $XConsortium: jcxie.c,v 1.4 94/04/17 20:35:32 rws Exp $ */ +/* Module jcxie.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + jcxie.c: Xie JPEG Compression Interface Routines + + Gary Rogers, AGE Logic, Inc., October 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +/* + * Copyright (C) 1992, Thomas G. Lane. + * This file was derived in part from the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + */ + +#include "jinclude.h" + +/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays + * and coefficient-block arrays. This won't work on 80x86 because the arrays + * are FAR and we're assuming a small-pointer memory model. However, some + * DOS compilers provide far-pointer versions of memcpy() and memset() even + * in the small-model libraries. These will be used if USE_FMEM is defined. + * Otherwise, the routines below do it the hard way. (The performance cost + * is not all that great, because these routines aren't very heavily used.) + */ + +#ifndef NEED_FAR_POINTERS /* normal case, same as regular macros */ +#define FMEMCOPY(dest,src,size) MEMCOPY(dest,src,size) +#define FMEMZERO(target,size) MEMZERO(target,size) +#else /* 80x86 case, define if we can */ +#ifdef USE_FMEM +#define FMEMCOPY(dest,src,size) _fmemcpy((pointer*)(dest), (const pointer*)(src), (size_t)(size)) +#define FMEMZERO(target,size) _fmemset((pointer*)(target), 0, (size_t)(size)) +#endif +#endif + +/* + * This routine gets control after the input file header has been read. + * It must determine what output JPEG file format is to be written, + * and make any other compression parameter changes that are desirable. + */ + +METHODDEF void +#if NeedFunctionPrototypes +c_ui_method_selection (compress_info_ptr cinfo) +#else +c_ui_method_selection (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +{ + /* If the input is gray scale, generate a monochrome JPEG file. */ + if (cinfo->in_color_space == CS_GRAYSCALE) + j_monochrome_default(cinfo); + /* For now, always select JFIF output format. */ + jselwjfif(cinfo); +} + +METHODDEF void +#if NeedFunctionPrototypes +c_per_scan_method_selection (compress_info_ptr cinfo) +#else +c_per_scan_method_selection (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +/* Central point for per-scan method selection */ +{ + /* Edge expansion */ + jselexpand(cinfo); + /* Downsampling of pixels */ + jseldownsample(cinfo); + /* MCU extraction */ + jselcmcu(cinfo); +} + +LOCAL void +#if NeedFunctionPrototypes +c_initial_method_selection (compress_info_ptr cinfo) +#else +c_initial_method_selection (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +/* Central point for initial method selection */ +{ + /* Input image reading method selection is already done. */ + /* So is output file header formatting (both are done by user interface). */ + + /* Entropy encoding: Huffman coding. */ + cinfo->arith_code = FALSE; /* force Huffman mode */ + jselchuffman(cinfo); + + /* Overall control (that's me!) */ + cinfo->methods->c_per_scan_method_selection = c_per_scan_method_selection; +} + +LOCAL int +#if NeedFunctionPrototypes +initial_setup (compress_info_ptr cinfo) +#else +initial_setup (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +/* Do computations that are needed before initial method selection */ +{ + short ci; + jpeg_component_info *compptr; + + /* Compute maximum sampling factors; check factor validity */ + cinfo->max_h_samp_factor = 1; + cinfo->max_v_samp_factor = 1; + for (ci = 0; ci < cinfo->num_components; ci++) { + compptr = &cinfo->comp_info[ci]; + if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR || + compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR) + /* ERREXIT(cinfo->emethods, "Bogus sampling factors"); */ + return(XIE_ERR); + cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor, + compptr->h_samp_factor); + cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor, + compptr->v_samp_factor); + } + + /* Compute logical downsampled dimensions of components */ + for (ci = 0; ci < cinfo->num_components; ci++) { + compptr = &cinfo->comp_info[ci]; + compptr->true_comp_width = (cinfo->image_width * compptr->h_samp_factor + + cinfo->max_h_samp_factor - 1) + / cinfo->max_h_samp_factor; + compptr->true_comp_height = (cinfo->image_height * compptr->v_samp_factor + + cinfo->max_v_samp_factor - 1) + / cinfo->max_v_samp_factor; + } + return(0); +} + +/* + * Utility routines: common code for pipeline controllers + */ + +LOCAL int +#if NeedFunctionPrototypes +interleaved_scan_setup (compress_info_ptr cinfo) +#else +interleaved_scan_setup (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +/* Compute all derived info for an interleaved (multi-component) scan */ +/* On entry, cinfo->comps_in_scan and cinfo->cur_comp_info[] are set up */ +{ + short ci, mcublks; + jpeg_component_info *compptr; + + if (cinfo->comps_in_scan > MAX_COMPS_IN_SCAN) + /* ERREXIT(cinfo->emethods, "Too many components for interleaved scan"); */ + return(XIE_ERR); + + cinfo->MCUs_per_row = (cinfo->image_width + + cinfo->max_h_samp_factor*DCTSIZE - 1) + / (cinfo->max_h_samp_factor*DCTSIZE); + + cinfo->MCU_rows_in_scan = (cinfo->image_height + + cinfo->max_v_samp_factor*DCTSIZE - 1) + / (cinfo->max_v_samp_factor*DCTSIZE); + + cinfo->blocks_in_MCU = 0; + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* for interleaved scan, sampling factors give # of blocks per component */ + compptr->MCU_width = compptr->h_samp_factor; + compptr->MCU_height = compptr->v_samp_factor; + compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height; + /* compute physical dimensions of component */ + compptr->downsampled_width = jround_up(compptr->true_comp_width, + (long) (compptr->MCU_width*DCTSIZE)); + compptr->downsampled_height = jround_up(compptr->true_comp_height, + (long) (compptr->MCU_height*DCTSIZE)); + /* Sanity check */ + if (compptr->downsampled_width != + (cinfo->MCUs_per_row * (compptr->MCU_width*DCTSIZE))) + /* ERREXIT(cinfo->emethods, "I'm confused about the image width"); */ + return(XIE_ERR); + /* Prepare array describing MCU composition */ + mcublks = compptr->MCU_blocks; + if (cinfo->blocks_in_MCU + mcublks > MAX_BLOCKS_IN_MCU) + /* ERREXIT(cinfo->emethods, "Sampling factors too large for interleaved scan"); */ + return(XIE_ERR); + while (mcublks-- > 0) { + cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci; + } + } + + /* Convert restart specified in rows to actual MCU count. */ + /* Note that count must fit in 16 bits, so we provide limiting. */ + if (cinfo->restart_in_rows > 0) { + long nominal = cinfo->restart_in_rows * cinfo->MCUs_per_row; + cinfo->restart_interval = (UINT16) MIN(nominal, 65535L); + } + + (*cinfo->methods->c_per_scan_method_selection) (cinfo); + return(0); +} + +LOCAL void +#if NeedFunctionPrototypes +noninterleaved_scan_setup (compress_info_ptr cinfo) +#else +noninterleaved_scan_setup (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +/* Compute all derived info for a noninterleaved (single-component) scan */ +/* On entry, cinfo->comps_in_scan = 1 and cinfo->cur_comp_info[0] is set up */ +{ + jpeg_component_info *compptr = cinfo->cur_comp_info[0]; + + /* for noninterleaved scan, always one block per MCU */ + compptr->MCU_width = 1; + compptr->MCU_height = 1; + compptr->MCU_blocks = 1; + /* compute physical dimensions of component */ + compptr->downsampled_width = jround_up(compptr->true_comp_width, + (long) DCTSIZE); + compptr->downsampled_height = jround_up(compptr->true_comp_height, + (long) DCTSIZE); + + cinfo->MCUs_per_row = compptr->downsampled_width / DCTSIZE; + cinfo->MCU_rows_in_scan = compptr->downsampled_height / DCTSIZE; + + /* Prepare array describing MCU composition */ + cinfo->blocks_in_MCU = 1; + cinfo->MCU_membership[0] = 0; + + /* Convert restart specified in rows to actual MCU count. */ + /* Note that count must fit in 16 bits, so we provide limiting. */ + if (cinfo->restart_in_rows > 0) { + long nominal = cinfo->restart_in_rows * cinfo->MCUs_per_row; + cinfo->restart_interval = (UINT16) MIN(nominal, 65535L); + } + + (*cinfo->methods->c_per_scan_method_selection) (cinfo); +} + + +LOCAL int +#if NeedFunctionPrototypes +alloc_sampling_buffer (compress_info_ptr cinfo, JSAMPIMAGE fullsize_data[2], + long fullsize_width) +#else +alloc_sampling_buffer (cinfo, fullsize_data, fullsize_width) + compress_info_ptr cinfo; + JSAMPIMAGE fullsize_data[2]; + long fullsize_width; +#endif /* NeedFunctionPrototypes */ +/* Create a pre-downsampling data buffer having the desired structure */ +/* (see comments at head of file) */ +{ + short ci, vs, i; + + vs = cinfo->max_v_samp_factor; /* row group height */ + + /* Get top-level space for array pointers */ + fullsize_data[0] = (JSAMPIMAGE) (*cinfo->emethods->c_alloc_small) + (cinfo, (cinfo->num_components * SIZEOF(JSAMPARRAY))); + if (fullsize_data[0] == NULL) + return(XIE_ERR); + fullsize_data[1] = (JSAMPIMAGE) (*cinfo->emethods->c_alloc_small) + (cinfo, (cinfo->num_components * SIZEOF(JSAMPARRAY))); + if (fullsize_data[1] == NULL) + return(XIE_ERR); + + for (ci = 0; ci < cinfo->num_components; ci++) { + /* Allocate the real storage */ + fullsize_data[0][ci] = (*cinfo->emethods->c_alloc_small_sarray) + (cinfo, fullsize_width, + (long) (vs * (DCTSIZE+2))); + if (fullsize_data[0][ci] == NULL) + return(XIE_ERR); + /* Create space for the scrambled-order pointers */ + fullsize_data[1][ci] = (JSAMPARRAY) (*cinfo->emethods->c_alloc_small) + (cinfo, (vs * (DCTSIZE+2) * SIZEOF(JSAMPROW))); + if (fullsize_data[1][ci] == NULL) + return(XIE_ERR); + /* Duplicate the first DCTSIZE-2 row groups */ + for (i = 0; i < vs * (DCTSIZE-2); i++) { + fullsize_data[1][ci][i] = fullsize_data[0][ci][i]; + } + /* Copy the last four row groups in swapped order */ + for (i = 0; i < vs * 2; i++) { + fullsize_data[1][ci][vs*DCTSIZE + i] = fullsize_data[0][ci][vs*(DCTSIZE-2) + i]; + fullsize_data[1][ci][vs*(DCTSIZE-2) + i] = fullsize_data[0][ci][vs*DCTSIZE + i]; + } + } + return(0); +} + + +LOCAL void +#if NeedFunctionPrototypes +downsample (compress_info_ptr cinfo, + JSAMPIMAGE fullsize_data, JSAMPIMAGE sampled_data, + long fullsize_width, + short above, short current, short below, short out) +#else +downsample (cinfo, + fullsize_data, sampled_data, + fullsize_width, + above, current, below, out) + compress_info_ptr cinfo; + JSAMPIMAGE fullsize_data; + JSAMPIMAGE sampled_data; + long fullsize_width; + short above; + short current; + short below; + short out; +#endif /* NeedFunctionPrototypes */ +/* Do downsampling of a single row group (of each component). */ +/* above, current, below are indexes of row groups in fullsize_data; */ +/* out is the index of the target row group in sampled_data. */ +/* Special case: above, below can be -1 to indicate top, bottom of image. */ +{ + jpeg_component_info *compptr; + JSAMPARRAY above_ptr, below_ptr; + JSAMPROW dummy[MAX_SAMP_FACTOR]; /* for downsample expansion at top/bottom */ + short ci, vs, i; + + vs = cinfo->max_v_samp_factor; /* row group height */ + + for (ci = 0; ci < cinfo->num_components; ci++) { + compptr = & cinfo->comp_info[ci]; + + if (above >= 0) + above_ptr = fullsize_data[ci] + above * vs; + else { + /* Top of image: make a dummy above-context with copies of 1st row */ + /* We assume current=0 in this case */ + for (i = 0; i < vs; i++) + dummy[i] = fullsize_data[ci][0]; + above_ptr = (JSAMPARRAY) dummy; /* possible near->far pointer conv */ + } + + if (below >= 0) + below_ptr = fullsize_data[ci] + below * vs; + else { + /* Bot of image: make a dummy below-context with copies of last row */ + for (i = 0; i < vs; i++) + dummy[i] = fullsize_data[ci][(current+1)*vs-1]; + below_ptr = (JSAMPARRAY) dummy; /* possible near->far pointer conv */ + } + + (*cinfo->methods->downsample[ci]) + (cinfo, (int) ci, + fullsize_width, (int) vs, + compptr->downsampled_width, (int) compptr->v_samp_factor, + above_ptr, + fullsize_data[ci] + current * vs, + below_ptr, + sampled_data[ci] + out * compptr->v_samp_factor); + } +} + +METHODDEF int +#if NeedFunctionPrototypes +jcXIE_init (compress_info_ptr cinfo) +#else +jcXIE_init (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +{ + int status; + short ci; + +/* + * Initialize cinfo with default switch settings. + */ + + /* (Re-)initialize the system-dependent error and memory managers. */ + jcselmemmgr(cinfo, cinfo->emethods); /* memory allocation routines */ + cinfo->methods->c_ui_method_selection = c_ui_method_selection; + + /* Set up default JPEG parameters. */ + /* Note that default -quality level here need not, and does not, + * match the default scaling for an explicit -qtables argument. + */ + + /* default quality level = 75 */ + if (j_c_defaults(cinfo, 75, FALSE) == XIE_ERR) + return(XIE_ERR); + + /* Init pass counts to 0 --- total_passes is adjusted in method selection */ + cinfo->total_passes = 0; + cinfo->completed_passes = 0; + cinfo->data_precision = 8; /* always, even if 12-bit JSAMPLEs */ + + /* Give UI a chance to adjust compression parameters and select */ + /* output file format based on results of input_init. */ + (*cinfo->methods->c_ui_method_selection) (cinfo); + + /* Now select methods for compression steps. */ + if ((status = initial_setup(cinfo)) < 0) + return(status); + c_initial_method_selection(cinfo); + + /* Prepare for single scan containing all components */ + if (cinfo->num_components > MAX_COMPS_IN_SCAN) + /* ERREXIT(cinfo->emethods, "Too many components for interleaved scan"); */ + return(XIE_ERR); + cinfo->comps_in_scan = cinfo->num_components; + for (ci = 0; ci < cinfo->num_components; ci++) { + cinfo->cur_comp_info[ci] = &cinfo->comp_info[ci]; + } + if (cinfo->comps_in_scan == 1) { + noninterleaved_scan_setup(cinfo); + /* Vk block rows constitute the same number of MCU rows */ + cinfo->mcu_rows_per_loop = cinfo->cur_comp_info[0]->v_samp_factor; + } else { + if ((status = interleaved_scan_setup(cinfo)) < 0) + return(status); + /* in an interleaved scan, one MCU row contains Vk block rows */ + cinfo->mcu_rows_per_loop = 1; + } + cinfo->total_passes++; + + /* Compute dimensions of full-size pixel buffers */ + /* Note these are the same whether interleaved or not. */ + cinfo->rows_in_mem = cinfo->max_v_samp_factor * DCTSIZE; + cinfo->fullsize_width = jround_up(cinfo->image_width, + (long) (cinfo->max_h_samp_factor * DCTSIZE)); + + /* Allocate working memory: */ + /* fullsize_data is sample data before downsampling */ + if (alloc_sampling_buffer(cinfo, cinfo->fullsize_data, + cinfo->fullsize_width) == XIE_ERR) + return(XIE_ERR); + /* sampled_data is sample data after downsampling */ + cinfo->sampled_data = (JSAMPIMAGE) (*cinfo->emethods->c_alloc_small) + (cinfo, (cinfo->num_components * SIZEOF(JSAMPARRAY))); + if (cinfo->sampled_data == NULL) + return(XIE_ERR); + for (ci = 0; ci < cinfo->num_components; ci++) { + cinfo->sampled_data[ci] = (*cinfo->emethods->c_alloc_small_sarray) + (cinfo, cinfo->comp_info[ci].downsampled_width, + (long) (cinfo->comp_info[ci].v_samp_factor * DCTSIZE)); + if (cinfo->sampled_data[ci] == NULL) + return(XIE_ERR); + } + + /* Do per-scan object init */ + + if ((status = ((*cinfo->methods->entropy_encode_init) (cinfo))) < 0) + return(status); + (*cinfo->methods->downsample_init) (cinfo); + (*cinfo->methods->extract_init) (cinfo); + + cinfo->mcu_rows_output = 0; + cinfo->whichss = 0; /* arrange to start with fullsize_data[0] */ + cinfo->cur_pixel_row = 0; + cinfo->first_pixel_row = TRUE; + return(0); +} + +LOCAL void +#if NeedFunctionPrototypes +jcopy_pixel_rows (JSAMPARRAY input_array, + JSAMPIMAGE output_array, int dest_row, + int num_rows, long num_cols) +#else +jcopy_pixel_rows (input_array, + output_array, dest_row, + num_rows, num_cols) + JSAMPARRAY input_array; + JSAMPIMAGE output_array; + int dest_row; + int num_rows; + long num_cols; +#endif /* NeedFunctionPrototypes */ +/* Copy some rows of samples from one place to another. + * num_rows rows are copied from input_array[source_row++] + * to output_array[dest_row++]; these areas should not overlap. + * The source and destination arrays must be at least as wide as num_cols. + */ +{ + register JSAMPROW inptr, outptr; +#ifdef FMEMCOPY + register size_t count = (size_t) (num_cols * SIZEOF(JSAMPLE)); +#else + register long count; +#endif + register int row; + + for (row = 0; row < num_rows; row++) { + inptr = input_array[row]; + outptr = output_array[row][dest_row]; +#ifdef FMEMCOPY + FMEMCOPY(outptr, inptr, count); +#else + for (count = 0; count < num_cols; count++) + outptr[count] = inptr[count]; /* needn't bother with GETJSAMPLE() here */ +#endif + } +} + +GLOBAL int +#if NeedFunctionPrototypes +jcXIE_get (compress_info_ptr cinfo, + int row_to_process, JSAMPARRAY pixel_row) +#else +jcXIE_get (cinfo, row_to_process, pixel_row) + compress_info_ptr cinfo; + int row_to_process; + JSAMPARRAY pixel_row; +#endif /* NeedFunctionPrototypes */ +{ + int status; + short i; + short whichss; + + whichss = cinfo->whichss; + + if (cinfo->XIErestart == XIE_RNUL) { + + /* Obtain rows_this_time pixel rows and expand to rows_in_mem rows. */ + /* Then we have exactly DCTSIZE row groups for downsampling. */ + + jcopy_pixel_rows (pixel_row, + cinfo->fullsize_data[whichss], cinfo->cur_pixel_row, + cinfo->num_components, cinfo->image_width); + + if ((++(cinfo->cur_pixel_row)) < cinfo->rows_this_time) + return(0); + + (*cinfo->methods->edge_expand) (cinfo, + cinfo->image_width, cinfo->rows_this_time, + cinfo->fullsize_width, cinfo->rows_in_mem, + cinfo->fullsize_data[whichss]); + + } + /* Downsample the data (all components) */ + /* First time through is a special case */ + + if (cinfo->first_pixel_row == FALSE) { + if (cinfo->XIErestart == XIE_RNUL) { + /* Downsample last row group of previous set */ + downsample(cinfo, cinfo->fullsize_data[whichss], cinfo->sampled_data, + cinfo->fullsize_width, (short) DCTSIZE, + (short) (DCTSIZE+1), (short) 0, (short) (DCTSIZE-1)); + } + /* and dump the previous set's downsampled data */ + if ((status = (*cinfo->methods->extract_MCUs) (cinfo, cinfo->sampled_data, + cinfo->mcu_rows_per_loop, + cinfo->methods->entropy_encode)) < 0) { + return(status); + } + cinfo->mcu_rows_output += cinfo->mcu_rows_per_loop; + /* Downsample first row group of this set */ + downsample(cinfo, cinfo->fullsize_data[whichss], cinfo->sampled_data, + cinfo->fullsize_width, + (short) (DCTSIZE+1), (short) 0, (short) 1, (short) 0); + } else { + /* Downsample first row group with dummy above-context */ + downsample(cinfo, cinfo->fullsize_data[whichss], cinfo->sampled_data, + cinfo->fullsize_width, + (short) (-1), (short) 0, (short) 1, (short) 0); + cinfo->first_pixel_row = FALSE; + } + /* Downsample second through next-to-last row groups of this set */ + for (i = 1; i <= DCTSIZE-2; i++) { + downsample(cinfo, cinfo->fullsize_data[whichss], cinfo->sampled_data, + cinfo->fullsize_width, + (short) (i-1), (short) i, (short) (i+1), (short) i); + } + cinfo->whichss ^= 1; /* switch to other fullsize_data buffer */ + cinfo->cur_pixel_row = 0; + return(0); +} + +METHODDEF int +#if NeedFunctionPrototypes +jcXIE_term (compress_info_ptr cinfo) +#else +jcXIE_term (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +{ + int status; + short whichss; + + if (cinfo->XIErestart == XIE_RNUL) { + whichss = cinfo->whichss ^ 1; /* switch back to other buffer */ + + /* Downsample the last row group with dummy below-context */ + /* Note whichss points to last buffer side used */ + downsample(cinfo, cinfo->fullsize_data[whichss], cinfo->sampled_data, + cinfo->fullsize_width, (short) (DCTSIZE-2), (short) (DCTSIZE-1), + (short) (-1), (short) (DCTSIZE-1)); + } + /* Dump the remaining data (may be less than full height if uninterleaved) */ + if ((status = (*cinfo->methods->extract_MCUs) (cinfo, cinfo->sampled_data, + (int) (cinfo->MCU_rows_in_scan - cinfo->mcu_rows_output), + cinfo->methods->entropy_encode)) < 0) { + return(status); + } + (*cinfo->methods->extract_term) (cinfo); + (*cinfo->methods->downsample_term) (cinfo); + (*cinfo->methods->entropy_encode_term) (cinfo); + cinfo->completed_passes++; + (*cinfo->emethods->c_free_all) (cinfo); + return(0); +} + +GLOBAL void +#if NeedFunctionPrototypes +jselrXIE (compress_info_ptr cinfo) +#else +jselrXIE (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +{ + cinfo->methods->input_init = jcXIE_init; + /* cinfo->methods->get_input_row is set by input_init */ + cinfo->methods->input_term = jcXIE_term; +} + diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jcxief.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jcxief.c new file mode 100644 index 0000000..2fcf08d --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jcxief.c @@ -0,0 +1,492 @@ +/* $XConsortium: jcxief.c,v 1.4 94/04/17 20:35:32 rws Exp $ */ +/* Module jcxief.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + jcxief.c: Xie JPEG Compression Wrapper Routines + + Gary Rogers, AGE Logic, Inc., October 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +#include "jinclude.h" + +#ifdef THINK_C +#include /* command-line reader for Macintosh */ +#endif + +#if NeedFunctionPrototypes +GLOBAL void +jselrXIE (compress_info_ptr); +GLOBAL void +process_rgb_ycc_row (compress_info_ptr, JSAMPARRAY); +GLOBAL int +jcXIE_get (compress_info_ptr, int, JSAMPARRAY); +GLOBAL void +jcXIE_get_buffersize (compress_info_ptr); +GLOBAL int +j_add_quant_table (compress_info_ptr, int, const QUANT_VAL *, int, boolean); +GLOBAL int +add_huff_table (compress_info_ptr, HUFF_TBL **, const UINT8 *, const UINT8 *); +#endif /* NeedFunctionPrototypes */ + +/******************************************************************************/ + +LOCAL int +#if NeedFunctionPrototypes +load_quant_tables (compress_info_ptr cinfo, + UINT8 * q_table, int nq_table, int scale_factor) +#else +load_quant_tables (cinfo, q_table, nq_table, scale_factor) + compress_info_ptr cinfo; + UINT8 * q_table; + int nq_table; + int scale_factor; +#endif /* NeedFunctionPrototypes */ +/* Read a set of quantization tables pointed at by q_table. + * There may be one to NUM_QUANT_TBLS tables, each of 64 values. + * The tables are implicitly numbered 0, 1, etc. + */ +{ + /* ZIG[i] is the zigzag-order position of the i'th element of a DCT block */ + /* read in natural order (left to right, top to bottom). */ + static const short ZIG[DCTSIZE2] = { + 0, 1, 5, 6, 14, 15, 27, 28, + 2, 4, 7, 13, 16, 26, 29, 42, + 3, 8, 12, 17, 25, 30, 41, 43, + 9, 11, 18, 24, 31, 40, 44, 53, + 10, 19, 23, 32, 39, 45, 52, 54, + 20, 22, 33, 38, 46, 51, 55, 60, + 21, 34, 37, 47, 50, 56, 59, 61, + 35, 36, 48, 49, 57, 58, 62, 63 + }; + int numtables; + int tblno, i; + QUANT_TBL table; + + numtables = nq_table / 64; + if (numtables < 1 || numtables > NUM_QUANT_TBLS) + return(XIE_ERR); + + for (tblno = 0; tblno < numtables; tblno++) + { + for (i = 0; i < DCTSIZE2; i++) + table[ZIG[i]] = *q_table++; + j_add_quant_table(cinfo, tblno, table, scale_factor, FALSE); + } + return(0); +} + +LOCAL int +#if NeedFunctionPrototypes +load_ac_tables (compress_info_ptr cinfo, + UINT8 * ac_table, int nac_table) +#else +load_ac_tables (cinfo, ac_table, nac_table) + compress_info_ptr cinfo; + UINT8 * ac_table; + int nac_table; +#endif /* NeedFunctionPrototypes */ +/* Read a set of AC Huffman tables pointed at by ac_table. + * There may be one or two tables. + */ +{ + int i; + int count; + UINT8 bits[17]; + UINT8 val[256]; + + bits[0] = 0; + /* luminance AC coefficients */ + count = 0; + nac_table -= 16; + if (nac_table < 0) /* bad length */ + return(XIE_ERR); + for(i = 1; i < 17; i++) { + bits[i] = *ac_table++; + count += bits[i]; + } + nac_table -= count; + if (nac_table < 0 || 256 < count) /* bad length */ + return(XIE_ERR); + for(i = 0; i < count; i++) { + val[i] = *ac_table++; + } + if(XIE_ERR == add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0], bits, val)) + return(XIE_ERR); + + /* chrominance AC coefficients */ + count = 0; + nac_table -= 16; + if (nac_table < 0) /* bad length */ + return(XIE_ERR); + for(i = 1; i < 17; i++) { + bits[i] = *ac_table++; + count += bits[i]; + } + nac_table -= count; + if (nac_table < 0 || 256 < count) /* bad length */ + return(XIE_ERR); + for(i = 0; i < count; i++) { + val[i] = *ac_table++; + } + if(XIE_ERR == add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1], bits, val)) + return(XIE_ERR); + + return(0); +} + +LOCAL int +#if NeedFunctionPrototypes +load_dc_tables (compress_info_ptr cinfo, + UINT8 * dc_table, int ndc_table) +#else +load_dc_tables (cinfo, dc_table, ndc_table) + compress_info_ptr cinfo; + UINT8 * dc_table; + int ndc_table; +#endif /* NeedFunctionPrototypes */ +/* Read a set of DC Huffman tables pointed at by dc_table. + * There may be one or two tables. + */ +{ + int i; + int count; + UINT8 bits[17]; + UINT8 val[256]; + + bits[0] = 0; + /* luminance DC coefficients */ + count = 0; + ndc_table -= 16; + if (ndc_table < 0) /* bad length */ + return(XIE_ERR); + for(i = 1; i < 17; i++) { + bits[i] = *dc_table++; + count += bits[i]; + } + ndc_table -= count; + if (ndc_table < 0 || 256 < count) /* bad length */ + return(XIE_ERR); + for(i = 0; i < count; i++) { + val[i] = *dc_table++; + } + if(XIE_ERR == add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0], bits, val)) + return(XIE_ERR); + + /* chrominance DC coefficients */ + count = 0; + ndc_table -= 16; + if (ndc_table < 0) /* bad length */ + return(XIE_ERR); + for(i = 1; i < 17; i++) { + bits[i] = *dc_table++; + count += bits[i]; + } + ndc_table -= count; + if (ndc_table < 0 || 256 < count) /* bad length */ + return(XIE_ERR); + for(i = 0; i < count; i++) { + val[i] = *dc_table++; + } + if(XIE_ERR == add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1], bits, val)) + return(XIE_ERR); + + return(0); +} + +/******************************************************************************/ + +GLOBAL int +#if NeedFunctionPrototypes +JC_INIT (compress_info_ptr cinfo, + compress_methods_ptr cmethods, external_methods_ptr emethods) +#else +JC_INIT (cinfo, cmethods, emethods) + compress_info_ptr cinfo; + compress_methods_ptr cmethods; + external_methods_ptr emethods; +#endif /* NeedFunctionPrototypes */ +{ + /* Set up links to method structures. */ + cinfo->methods = cmethods; + cinfo->emethods = emethods; + + /* Set restart to NULL */ + cinfo->XIErestart = XIE_RNUL; + + jselrXIE (cinfo); + + return (XIE_NRML); +} + +GLOBAL int +#if NeedFunctionPrototypes +JC_BEGINFRAME (compress_info_ptr cinfo, + long components, long width, long height, + UINT8 * q_table, int nq_table, + UINT8 * ac_table, int nac_table, + UINT8 * dc_table, int ndc_table, + short * h_sample, short * v_sample) +#else +JC_BEGINFRAME (cinfo, components, width, height, + q_table, nq_table, ac_table, nac_table, dc_table, ndc_table, + h_sample, v_sample) + compress_info_ptr cinfo; + long components; + long width; + long height; + UINT8 * q_table; + int nq_table; + UINT8 * ac_table; + int nac_table; + UINT8 * dc_table; + int ndc_table; + short * h_sample, * v_sample; +#endif /* NeedFunctionPrototypes */ +{ + short ci; + short hsample, vsample, total; + int status; + int scale_factor = 100; + + if (cinfo->XIErestart == XIE_RNUL) { + cinfo->input_components = (short)components; + cinfo->image_width = width; + cinfo->image_height = height; + if (components == 1) + cinfo->in_color_space = CS_GRAYSCALE; + else + cinfo->in_color_space = CS_RGB; + + if (1 < components) { + total = 0; + for(ci = 0; ci < components; ci++) { + hsample = h_sample[ci]; + if (hsample <= 0 || MAX_SAMP_FACTOR < hsample) + return(XIE_ERR); /* bad sub-sampling factor */ + vsample = v_sample[ci]; + if (vsample <= 0 || MAX_SAMP_FACTOR < vsample) + return(XIE_ERR); /* bad sub-sampling factor */ + total += (hsample*vsample); + if (MAX_BLOCKS_IN_MCU < total) + return(XIE_ERR); /* bad sub-sampling factor(s) */ + cinfo->xie_h_samp_factor[ci] = hsample; + cinfo->xie_v_samp_factor[ci] = vsample; + } + } + + if (((*cinfo->methods->input_init) (cinfo)) == XIE_ERR) /* jcXIE_init (cinfo); */ + return(XIE_ERR); + } + + if (0 < nq_table) { + if ((load_quant_tables (cinfo, q_table, nq_table, scale_factor)) == XIE_ERR) + return(XIE_ERR); + } + + if (0 < nac_table) { + if ((load_ac_tables (cinfo, ac_table, nac_table)) == XIE_ERR) + return(XIE_ERR); + } + + if (0 < ndc_table) { + if ((load_dc_tables (cinfo, dc_table, ndc_table)) == XIE_ERR) + return(XIE_ERR); + } + + if ((cinfo->XIErestart == XIE_RNUL) || (cinfo->XIErestart == XIE_RWFH)) { + if ((status = ((*cinfo->methods->write_file_header) (cinfo))) < 0) { + if (status == XIE_ERR) + return(XIE_ERR); + cinfo->XIErestart = XIE_RWFH; /* set restart status */ + return(XIE_OUT); + } + } + if ((cinfo->XIErestart == XIE_RNUL) || (cinfo->XIErestart == XIE_RWSH)) { + if ((status = ((*cinfo->methods->write_scan_header) (cinfo))) < 0) { + if (status == XIE_ERR) + return(XIE_ERR); + cinfo->XIErestart = XIE_RWSH; /* set restart status */ + return(XIE_OUT); + } + } + + return (XIE_NRML); +} + +GLOBAL int +#if NeedFunctionPrototypes +JC_ENDFRAME (compress_info_ptr cinfo) +#else +JC_ENDFRAME (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +{ + int status; + + /* jcXIE_term (cinfo); */ + if ((cinfo->XIErestart == XIE_RNUL) || (cinfo->XIErestart == XIE_RMCU)) { + if ((status = ((*cinfo->methods->input_term) (cinfo))) < 0) { + if (status == XIE_ERR) + return(XIE_ERR); + cinfo->XIErestart = XIE_RMCU; /* set restart status */ + return(XIE_OUT); + } + } + + (*cinfo->methods->write_scan_trailer) (cinfo); /* does nothing */ + if ((cinfo->XIErestart == XIE_RNUL) || (cinfo->XIErestart == XIE_RWFT)) { + if (((*cinfo->methods->write_file_trailer) (cinfo)) == XIE_OUT) { + cinfo->XIErestart = XIE_RWFT; /* set restart status */ + return(XIE_OUT); + } + } + return (XIE_NRML); +} + +GLOBAL int +#if NeedFunctionPrototypes +JC_SCANLINE_RGB (compress_info_ptr cinfo, + int * scanline, JSAMPROW ptr0, JSAMPROW ptr1, JSAMPROW ptr2) +#else +JC_SCANLINE_RGB (cinfo, scanline, ptr0, ptr1, ptr2) + compress_info_ptr cinfo; + int * scanline; + JSAMPROW ptr0; + JSAMPROW ptr1; + JSAMPROW ptr2; +#endif /* NeedFunctionPrototypes */ +{ + JSAMPROW pixel_row[3]; + int row, rows_this_time; + int status; + + row = *scanline; + if (cinfo->XIErestart == XIE_RNUL) { + if (cinfo->cur_pixel_row <= 0) { + rows_this_time = (int) MIN((long) cinfo->rows_in_mem, + cinfo->image_height - row); + if (rows_this_time <= 0) + return (XIE_NRML); + cinfo->rows_this_time = rows_this_time; + } + pixel_row[0] = ptr0; + pixel_row[1] = ptr1; + pixel_row[2] = ptr2; + } + if ((cinfo->XIErestart == XIE_RNUL) || (cinfo->XIErestart == XIE_RMCU)) { + if ((status = jcXIE_get (cinfo, row, pixel_row)) < 0) { + if (status == XIE_ERR) + return(XIE_ERR); + cinfo->XIErestart = XIE_RMCU; /* set restart status */ + return(XIE_OUT); + } + } + + return (XIE_NRML); +} + +GLOBAL int +#if NeedFunctionPrototypes +JC_SCANLINE_GRAY (compress_info_ptr cinfo, int * scanline, JSAMPROW ptr0) +#else +JC_SCANLINE_GRAY (cinfo, scanline, ptr0) + compress_info_ptr cinfo; + int * scanline; + JSAMPROW ptr0; +#endif /* NeedFunctionPrototypes */ +{ + JSAMPROW pixel_row[3]; + int row, rows_this_time; + int status; + + row = *scanline; + if (cinfo->XIErestart == XIE_RNUL) { + if (cinfo->cur_pixel_row <= 0) { + rows_this_time = (int) MIN((long) cinfo->rows_in_mem, + cinfo->image_height - row); + if (rows_this_time <= 0) + return (XIE_NRML); + cinfo->rows_this_time = rows_this_time; + } + pixel_row[0] = ptr0; + pixel_row[1] = 0; + pixel_row[2] = 0; + } + if ((cinfo->XIErestart == XIE_RNUL) || (cinfo->XIErestart == XIE_RMCU)) { + if ((status = jcXIE_get (cinfo, row, pixel_row)) < 0) { + if (status == XIE_ERR) + return(XIE_ERR); + cinfo->XIErestart = XIE_RMCU; /* set restart status */ + return(XIE_OUT); + } + } + + return (XIE_NRML); +} diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdbuffer.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdbuffer.c new file mode 100644 index 0000000..f6ffd7a --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdbuffer.c @@ -0,0 +1,150 @@ +/* $XConsortium: jdbuffer.c /main/5 1995/12/04 15:34:02 dpw $ */ +/*** jdbuffer.c - transfer data from input strip to decode buffer */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Ben Fahy, AGE Logic, Oct 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +#include "jpeg.h" + +/************************************************************************/ +int fill_jpeg_decode_buffer(state) +JpegDecodeState *state; +{ +decompress_info_ptr cinfo=state->cinfo; +unsigned char *start_of_rest_of_buffer; +int bytes_to_fill,sbytes_done,sbytes_left; + +/*** It is an error to call fill_jpeg_decode_buffer after + we have found out there is no more strip data +***/ + if (state->no_more_strips) + return(JPEG_BUFFER_BufferError); + +#define START_OF_JPEG_INPUT_BUFFER (cinfo->input_buffer + MIN_UNGET) + +/*** Whenever we fill the JPEG decode buffer, we always start by + copying existing data to start of buffer. This way we know + we have a nice contiguous buffer of JPEG_BUF_SIZE bytes long +***/ + if (cinfo->bytes_in_buffer) { + memcpy(START_OF_JPEG_INPUT_BUFFER, + cinfo->next_input_byte, + cinfo->bytes_in_buffer); + } + cinfo->next_input_byte = START_OF_JPEG_INPUT_BUFFER; + /* tells decoder (s)he can start reading here */ + +/*** Ok, now calculate how much fills the rest of the buffer, and + where to put it (assuming we can get the data from a strip) +***/ + start_of_rest_of_buffer = (unsigned char *) + cinfo->next_input_byte + cinfo->bytes_in_buffer; + + bytes_to_fill = JPEG_BUF_SIZE - cinfo->bytes_in_buffer; + /* how much room is left in the buffer */ + +/*** Is there enough data in the current strip to fill buffer? ***/ + sbytes_done = state->sptr - state->strip; + sbytes_left = state->strip_size - sbytes_done; + + if (sbytes_left >= bytes_to_fill) { + /* yes! */ + memcpy(start_of_rest_of_buffer,state->sptr,bytes_to_fill); + state->sptr += bytes_to_fill; + cinfo->bytes_in_buffer += bytes_to_fill; + + cinfo->XIEbytes_in_buffer = cinfo->bytes_in_buffer; + cinfo->XIEnext_input_byte = cinfo->next_input_byte; + /* save these in case we have to restart */ + + return(JPEG_BUFFER_BufferFilled); + } + +/*** Well, no. We will copy what we can. If this is the last + strip, we will set NoMoreStrips to signal the next state. + If there are more strips to come, we will return the + signal NeedAnotherStrip, so caller will go get another. +***/ + memcpy(start_of_rest_of_buffer,state->sptr,sbytes_left); + cinfo->bytes_in_buffer += sbytes_left; + + cinfo->XIEbytes_in_buffer = cinfo->bytes_in_buffer; + cinfo->XIEnext_input_byte = cinfo->next_input_byte; + /* save these in case we have to restart */ + + if (state->final) { + state->no_more_strips = 1; + return(JPEG_BUFFER_LastBuffer); + } + else + return(JPEG_BUFFER_NeedAnotherStrip); +} +/************************************************************************/ diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jddeflts.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jddeflts.c new file mode 100644 index 0000000..cfaaba1 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jddeflts.c @@ -0,0 +1,295 @@ +/* $XConsortium: jddeflts.c /main/5 1995/12/02 16:51:30 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/* Module jddeflts.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., October 1993 + +****************************************************************************/ + +/* + * jddeflts.c + * + * Copyright (C) 1991, 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains optional default-setting code for the JPEG decompressor. + * User interfaces do not have to use this file, but those that don't use it + * must know more about the innards of the JPEG code. + */ + +#include "jinclude.h" + +#ifndef XIE_SUPPORTED +/* Default do-nothing progress monitoring routine. + * This can be overridden by a user interface that wishes to + * provide progress monitoring; just set methods->progress_monitor + * after j_d_defaults is done. The routine will be called periodically + * during the decompression process. + * + * During any one pass, loopcounter increases from 0 up to (not including) + * looplimit; the step size is not necessarily 1. Both the step size and + * the limit may differ between passes. The expected total number of passes + * is in cinfo->total_passes, and the number of passes already completed is + * in cinfo->completed_passes. Thus the fraction of work completed may be + * estimated as + * completed_passes + (loopcounter/looplimit) + * ------------------------------------------ + * total_passes + * ignoring the fact that the passes may not be equal amounts of work. + * + * When decompressing, the total_passes figure is an estimate that may be + * on the high side; completed_passes will jump by more than one if some + * passes are skipped. + */ + +METHODDEF void +progress_monitor (decompress_info_ptr cinfo, long loopcounter, long looplimit) +{ + /* do nothing */ +} +#endif /* XIE_SUPPORTED */ + +/* Default comment-block processing routine. + * This can be overridden by an application that wishes to examine + * COM blocks found in the JPEG file. The default routine does nothing. + * CAUTION: the comment processing routine MUST call JGETC() exactly + * comment_length times to read the comment data, whether it intends + * to do anything with the data or not! + * Keep in mind that (a) there may be more than one COM block in a file; + * (b) there's no guarantee that what's in the block is ASCII data. + */ + +#ifdef XIE_SUPPORTED +METHODDEF int +#if NeedFunctionPrototypes +process_comment (decompress_info_ptr cinfo, long comment_length) +#else +process_comment (cinfo, comment_length) + decompress_info_ptr cinfo; + long comment_length; +#endif /* NeedFunctionPrototypes */ +#else +METHODDEF void +process_comment (decompress_info_ptr cinfo, long comment_length) +#endif /* XIE_SUPPORTED */ +{ +#ifdef XIE_SUPPORTED + int i; +#endif /* XIE_SUPPORTED */ + + while (comment_length-- > 0) { +#ifdef XIE_SUPPORTED + if ((i = JGETC(cinfo)) < 0) + return(-1); +#else + (void) JGETC(cinfo); +#endif /* XIE_SUPPORTED */ + } +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + + +#ifndef XIE_SUPPORTED +/* + * Reload the input buffer after it's been emptied, and return the next byte. + * See the JGETC macro for calling conditions. Note in particular that + * read_jpeg_data may NOT return EOF. If no more data is available, it must + * exit via ERREXIT, or perhaps synthesize fake data (such as an RST marker). + * In the present implementation, we insert an EOI marker; this might not be + * appropriate for non-JFIF file formats, but it usually allows us to handle + * a truncated JFIF file. + * + * This routine can be overridden by the system-dependent user interface, + * in case the data source is not a stdio stream or some other special + * condition applies. Note, however, that this capability only applies for + * JFIF or similar serial-access JPEG file formats. The input file control + * module for a random-access format such as TIFF/JPEG would most likely + * override the read_jpeg_data method with its own routine. + */ + +METHODDEF int +read_jpeg_data (decompress_info_ptr cinfo) +{ + cinfo->next_input_byte = cinfo->input_buffer + MIN_UNGET; + + cinfo->bytes_in_buffer = (int) JFREAD(cinfo->input_file, + cinfo->next_input_byte, + JPEG_BUF_SIZE); + + if (cinfo->bytes_in_buffer <= 0) { + WARNMS(cinfo->emethods, "Premature EOF in JPEG file"); + cinfo->next_input_byte[0] = (char) 0xFF; + cinfo->next_input_byte[1] = (char) 0xD9; /* EOI marker */ + cinfo->bytes_in_buffer = 2; + } + + return JGETC(cinfo); +} +#endif /* XIE_SUPPORTED */ + + +/* Default parameter setup for decompression. + * + * User interfaces that don't choose to use this routine must do their + * own setup of all these parameters. Alternately, you can call this + * to establish defaults and then alter parameters selectively. This + * is the recommended approach since, if we add any new parameters, + * your code will still work (they'll be set to reasonable defaults). + * + * standard_buffering should be TRUE to cause an input buffer to be allocated + * (the normal case); if FALSE, the user interface must provide a buffer. + * This option is most useful in the case that the buffer must not be freed + * at the end of an image. (For example, when reading a sequence of images + * from a single file, the remaining data in the buffer represents the + * start of the next image and mustn't be discarded.) To handle this, + * allocate the input buffer yourself at startup, WITHOUT using alloc_small + * (probably a direct call to malloc() instead). Then pass FALSE on each + * call to j_d_defaults to ensure the buffer state is not modified. + * + * If the source of the JPEG data is not a stdio stream, override the + * read_jpeg_data method with your own routine after calling j_d_defaults. + * You can still use the standard buffer if it's appropriate. + * + * CAUTION: if you want to decompress multiple images per run, it's necessary + * to call j_d_defaults before *each* call to jpeg_decompress, since subsidiary + * structures like the quantization tables are automatically freed during + * cleanup. + */ + +GLOBAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +j_d_defaults (decompress_info_ptr cinfo, boolean standard_buffering) +#else +j_d_defaults (cinfo, standard_buffering) + decompress_info_ptr cinfo; + boolean standard_buffering; +#endif /* NeedFunctionPrototypes */ +#else +j_d_defaults (decompress_info_ptr cinfo, boolean standard_buffering) +#endif /* XIE_SUPPORTED */ +/* NB: the external methods must already be set up. */ +{ + short i; + + /* Initialize pointers as needed to mark stuff unallocated. */ + /* Outer application may fill in default tables for abbreviated files... */ + cinfo->comp_info = NULL; + for (i = 0; i < NUM_QUANT_TBLS; i++) + cinfo->quant_tbl_ptrs[i] = NULL; + for (i = 0; i < NUM_HUFF_TBLS; i++) { + cinfo->dc_huff_tbl_ptrs[i] = NULL; + cinfo->ac_huff_tbl_ptrs[i] = NULL; + } + cinfo->colormap = NULL; + + /* Default to RGB output */ + /* UI can override by changing out_color_space */ + cinfo->out_color_space = CS_RGB; + cinfo->jpeg_color_space = CS_UNKNOWN; + /* Setting any other value in jpeg_color_space overrides heuristics in */ + /* jrdjfif.c. That might be useful when reading non-JFIF JPEG files, */ + /* but ordinarily the UI shouldn't change it. */ + + /* Default to no gamma correction of output */ + cinfo->output_gamma = 1.0; + + /* Default to no color quantization */ + cinfo->quantize_colors = FALSE; + /* but set reasonable default parameters for quantization, */ + /* so that turning on quantize_colors is sufficient to do something useful */ + cinfo->two_pass_quantize = TRUE; + cinfo->use_dithering = TRUE; + cinfo->desired_number_of_colors = 256; + + /* Default to no smoothing */ + cinfo->do_block_smoothing = FALSE; + cinfo->do_pixel_smoothing = FALSE; + +#ifndef XIE_SUPPORTED + /* Allocate memory for input buffer, unless outer application provides it. */ + if (standard_buffering) { + cinfo->input_buffer = (char *) (*cinfo->emethods->alloc_small) + ((size_t) (JPEG_BUF_SIZE + MIN_UNGET)); + cinfo->bytes_in_buffer = 0; /* initialize buffer to empty */ + } + + /* Install standard buffer-reloading method (outer code may override). */ + cinfo->methods->read_jpeg_data = read_jpeg_data; + + /* Install default do-nothing progress monitoring method. */ + cinfo->methods->progress_monitor = progress_monitor; +#endif /* XIE_SUPPORTED */ + + /* Install default comment-block processing method. */ + cinfo->methods->process_comment = process_comment; +} diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdhuff.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdhuff.c new file mode 100644 index 0000000..706c40d --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdhuff.c @@ -0,0 +1,698 @@ +/* $XConsortium: jdhuff.c /main/5 1995/12/02 16:51:33 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/* Module jdhuff.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., October 1993 + +****************************************************************************/ + +/* + * jdhuff.c + * + * Copyright (C) 1991, 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains Huffman entropy decoding routines. + * These routines are invoked via the methods entropy_decode + * and entropy_decode_init/term. + */ + +#include "jinclude.h" + + +/* Static variables to avoid passing 'round extra parameters */ + +static decompress_info_ptr dcinfo; + +static INT32 get_buffer; /* current bit-extraction buffer */ +static int bits_left; /* # of unused bits in it */ +#ifdef XIE_SUPPORTED +static UINT16 restarts_to_go; /* MCUs left in this restart interval */ +static short next_restart_num; /* # of next RSTn marker (0..7) */ +#define XIE_EOB 0xffffffff /* Return value when input buffer is empty */ +#else +static boolean printed_eod; /* flag to suppress multiple end-of-data msgs */ +#endif /* XIE_SUPPORTED */ + +LOCAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +fix_huff_tbl (HUFF_TBL * htbl) +#else +fix_huff_tbl (htbl) + HUFF_TBL * htbl; +#endif /* NeedFunctionPrototypes */ +#else +fix_huff_tbl (HUFF_TBL * htbl) +#endif /* XIE_SUPPORTED */ +/* Compute derived values for a Huffman table */ +{ + int p, i, l, si; + char huffsize[257]; + UINT16 huffcode[257]; + UINT16 code; + + /* Figure C.1: make table of Huffman code length for each symbol */ + /* Note that this is in code-length order. */ + + p = 0; + for (l = 1; l <= 16; l++) { + for (i = 1; i <= (int) htbl->bits[l]; i++) + huffsize[p++] = (char) l; + } + huffsize[p] = 0; + + /* Figure C.2: generate the codes themselves */ + /* Note that this is in code-length order. */ + + code = 0; + si = huffsize[0]; + p = 0; + while (huffsize[p]) { + while (((int) huffsize[p]) == si) { + huffcode[p++] = code; + code++; + } + code <<= 1; + si++; + } + + /* We don't bother to fill in the encoding tables ehufco[] and ehufsi[], */ + /* since they are not used for decoding. */ + + /* Figure F.15: generate decoding tables */ + + p = 0; + for (l = 1; l <= 16; l++) { + if (htbl->bits[l]) { + htbl->valptr[l] = p; /* huffval[] index of 1st sym of code len l */ + htbl->mincode[l] = huffcode[p]; /* minimum code of length l */ + p += htbl->bits[l]; + htbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */ + } else { + htbl->maxcode[l] = -1; + } + } + htbl->maxcode[17] = 0xFFFFFL; /* ensures huff_DECODE terminates */ +} + + +/* + * Code for extracting the next N bits from the input stream. + * (N never exceeds 15 for JPEG data.) + * This needs to go as fast as possible! + * + * We read source bytes into get_buffer and dole out bits as needed. + * If get_buffer already contains enough bits, they are fetched in-line + * by the macros get_bits() and get_bit(). When there aren't enough bits, + * fill_bit_buffer is called; it will attempt to fill get_buffer to the + * "high water mark", then extract the desired number of bits. The idea, + * of course, is to minimize the function-call overhead cost of entering + * fill_bit_buffer. + * On most machines MIN_GET_BITS should be 25 to allow the full 32-bit width + * of get_buffer to be used. (On machines with wider words, an even larger + * buffer could be used.) However, on some machines 32-bit shifts are + * relatively slow and take time proportional to the number of places shifted. + * (This is true with most PC compilers, for instance.) In this case it may + * be a win to set MIN_GET_BITS to the minimum value of 15. This reduces the + * average shift distance at the cost of more calls to fill_bit_buffer. + */ + +#ifdef SLOW_SHIFT_32 +#define MIN_GET_BITS 15 /* minimum allowable value */ +#else +#define MIN_GET_BITS 25 /* max value for 32-bit get_buffer */ +#endif + +static const int bmask[16] = /* bmask[n] is mask for n rightmost bits */ + { 0, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, + 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF }; + + +LOCAL int +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +fill_bit_buffer (int nbits) +#else +fill_bit_buffer (nbits) + int nbits; +#endif /* NeedFunctionPrototypes */ +#else +fill_bit_buffer (int nbits) +#endif /* XIE_SUPPORTED */ +/* Load up the bit buffer and do get_bits(nbits) */ +{ + /* Attempt to load at least MIN_GET_BITS bits into get_buffer. */ + while (bits_left < MIN_GET_BITS) { + register int c = JGETC(dcinfo); +#ifdef XIE_SUPPORTED + if (c < 0) + return(XIE_EOB); +#endif /* XIE_SUPPORTED */ + + /* If it's 0xFF, check and discard stuffed zero byte */ + if (c == 0xFF) { + int c2 = JGETC(dcinfo); +#ifdef XIE_SUPPORTED + if (c2 < 0) + return(XIE_EOB); +#endif /* XIE_SUPPORTED */ + if (c2 != 0) { + /* Oops, it's actually a marker indicating end of compressed data. */ + /* Better put it back for use later */ + JUNGETC(c2,dcinfo); + JUNGETC(c,dcinfo); + /* There should be enough bits still left in the data segment; */ + /* if so, just break out of the while loop. */ + if (bits_left >= nbits) + break; + /* Uh-oh. Report corrupted data to user and stuff zeroes into + * the data stream, so we can produce some kind of image. + * Note that this will be repeated for each byte demanded for the + * rest of the segment; this is a bit slow but not unreasonably so. + * The main thing is to avoid getting a zillion warnings, hence: + */ +#ifndef XIE_SUPPORTED + if (! printed_eod) { + WARNMS(dcinfo->emethods, "Corrupt JPEG data: premature end of data segment"); + printed_eod = TRUE; + } +#endif /* XIE_SUPPORTED */ + c = 0; /* insert a zero byte into bit buffer */ + } + } + + /* OK, load c into get_buffer */ + get_buffer = (get_buffer << 8) | c; + bits_left += 8; + } + + /* Having filled get_buffer, extract desired bits (this simplifies macros) */ + bits_left -= nbits; + return ((int) (get_buffer >> bits_left)) & bmask[nbits]; +} + + +/* Macros to make things go at some speed! */ +/* NB: parameter to get_bits should be simple variable, not expression */ + +#define get_bits(nbits) \ + (bits_left >= (nbits) ? \ + ((int) (get_buffer >> (bits_left -= (nbits)))) & bmask[nbits] : \ + fill_bit_buffer(nbits)) + +#define get_bit() \ + (bits_left ? \ + ((int) (get_buffer >> (--bits_left))) & 1 : \ + fill_bit_buffer(1)) + + +/* Figure F.16: extract next coded symbol from input stream */ + +INLINE +LOCAL int +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +huff_DECODE (HUFF_TBL * htbl) +#else +huff_DECODE (htbl) + HUFF_TBL * htbl; +#endif /* NeedFunctionPrototypes */ +#else +huff_DECODE (HUFF_TBL * htbl) +#endif /* XIE_SUPPORTED */ +{ + register int l; + register INT32 code; + +#ifdef XIE_SUPPORTED + register int j; + + if ((code = get_bit()) == XIE_EOB) + return(XIE_EOB); + l = 1; + while (code > htbl->maxcode[l]) { + if ((j = get_bit()) == XIE_EOB) + return(XIE_EOB); + code = (code << 1) | j; + l++; + } +#else + code = get_bit(); + l = 1; + while (code > htbl->maxcode[l]) { + code = (code << 1) | get_bit(); + l++; + } +#endif /* XIE_SUPPORTED */ + + /* With garbage input we may reach the sentinel value l = 17. */ + + if (l > 16) { +#ifndef XIE_SUPPORTED + WARNMS(dcinfo->emethods, "Corrupt JPEG data: bad Huffman code"); +#endif /* XIE_SUPPORTED */ + return 0; /* fake a zero as the safest result */ + } + + return htbl->huffval[ htbl->valptr[l] + ((int) (code - htbl->mincode[l])) ]; +} + + +/* Figure F.12: extend sign bit */ + +#define huff_EXTEND(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x)) + +static const int extend_test[16] = /* entry n is 2**(n-1) */ + { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, + 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 }; + +static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */ + { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1, + ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1, + ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1, + ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 }; + + +/* + * Initialize for a Huffman-compressed scan. + * This is invoked after reading the SOS marker. + */ + +#ifdef XIE_SUPPORTED +METHODDEF int +#if NeedFunctionPrototypes +huff_decoder_init (decompress_info_ptr cinfo) +#else +huff_decoder_init (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +METHODDEF void +huff_decoder_init (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + short ci; + jpeg_component_info * compptr; + + /* Initialize static variables */ + dcinfo = cinfo; +#ifdef XIE_SUPPORTED + bits_left = 0; + cinfo->XIEbits_left = bits_left; + get_buffer = 0; + cinfo->XIEget_buffer = get_buffer; + cinfo->printed_eod = FALSE; +#else + bits_left = 0; + printed_eod = FALSE; +#endif /* XIE_SUPPORTED */ + + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Make sure requested tables are present */ + if (cinfo->dc_huff_tbl_ptrs[compptr->dc_tbl_no] == NULL || + cinfo->ac_huff_tbl_ptrs[compptr->ac_tbl_no] == NULL) +#ifdef XIE_SUPPORTED + return(XIE_ERR); +#else + ERREXIT(cinfo->emethods, "Use of undefined Huffman table"); +#endif /* XIE_SUPPORTED */ + /* Compute derived values for Huffman tables */ + /* We may do this more than once for same table, but it's not a big deal */ + fix_huff_tbl(cinfo->dc_huff_tbl_ptrs[compptr->dc_tbl_no]); + fix_huff_tbl(cinfo->ac_huff_tbl_ptrs[compptr->ac_tbl_no]); + /* Initialize DC predictions to 0 */ + cinfo->last_dc_val[ci] = 0; + } + + /* Initialize restart stuff */ + cinfo->restarts_to_go = cinfo->restart_interval; + cinfo->next_restart_num = 0; +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + + +/* + * Check for a restart marker & resynchronize decoder. + */ + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +process_restart (decompress_info_ptr cinfo) +#else +process_restart (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +LOCAL void +process_restart (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + int c, nbytes; + short ci; + + /* Throw away any unused bits remaining in bit buffer */ + nbytes = bits_left / 8; /* count any full bytes loaded into buffer */ + bits_left = 0; +#ifdef XIE_SUPPORTED + cinfo->printed_eod = FALSE; /* next segment can get another warning */ +#else + printed_eod = FALSE; /* next segment can get another warning */ +#endif /* XIE_SUPPORTED */ + + /* Scan for next JPEG marker */ + do { + do { /* skip any non-FF bytes */ + nbytes++; + c = JGETC(cinfo); +#ifdef XIE_SUPPORTED + if (c < 0) + return(XIE_EOB); +#endif /* XIE_SUPPORTED */ + } while (c != 0xFF); + do { /* skip any duplicate FFs */ + /* we don't increment nbytes here since extra FFs are legal */ + c = JGETC(cinfo); +#ifdef XIE_SUPPORTED + if (c < 0) + return(XIE_EOB); +#endif /* XIE_SUPPORTED */ + } while (c == 0xFF); + } while (c == 0); /* repeat if it was a stuffed FF/00 */ + +#ifndef XIE_SUPPORTED + if (nbytes != 1) + WARNMS2(cinfo->emethods, + "Corrupt JPEG data: %d extraneous bytes before marker 0x%02x", + nbytes-1, c); +#endif /* XIE_SUPPORTED */ + + if (c != (RST0 + cinfo->next_restart_num)) { + /* Uh-oh, the restart markers have been messed up too. */ + /* Let the file-format module try to figure out how to resync. */ + (*cinfo->methods->resync_to_restart) (cinfo, c); +#ifdef XIE_SUPPORTED + } +#else + } else + TRACEMS1(cinfo->emethods, 2, "RST%d", cinfo->next_restart_num); +#endif /* XIE_SUPPORTED */ + +#ifndef XIE_SUPPORTED + /* Re-initialize DC predictions to 0 */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) + cinfo->last_dc_val[ci] = 0; + + /* Update restart state */ + cinfo->restarts_to_go = cinfo->restart_interval; + cinfo->next_restart_num = (cinfo->next_restart_num + 1) & 7; +#else + restarts_to_go = cinfo->restart_interval; + next_restart_num = (next_restart_num + 1) & 7; + return(0); +#endif /* XIE_SUPPORTED */ +} + + +/* ZAG[i] is the natural-order position of the i'th element of zigzag order. + * If the incoming data is corrupted, huff_decode_mcu could attempt to + * reference values beyond the end of the array. To avoid a wild store, + * we put some extra zeroes after the real entries. + */ + +static const short ZAG[DCTSIZE2+16] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + 0, 0, 0, 0, 0, 0, 0, 0, /* extra entries in case k>63 below */ + 0, 0, 0, 0, 0, 0, 0, 0 +}; + + +/* + * Decode and return one MCU's worth of Huffman-compressed coefficients. + * This routine also handles quantization descaling and zigzag reordering + * of coefficient values. + * + * The i'th block of the MCU is stored into the block pointed to by + * MCU_data[i]. WE ASSUME THIS AREA HAS BEEN ZEROED BY THE CALLER. + * (Wholesale zeroing is usually a little faster than retail...) + */ + +#ifdef XIE_SUPPORTED +METHODDEF int +#if NeedFunctionPrototypes +huff_decode_mcu (decompress_info_ptr cinfo, JBLOCKROW *MCU_data) +#else +huff_decode_mcu (cinfo, MCU_data) + decompress_info_ptr cinfo; + JBLOCKROW *MCU_data; +#endif /* NeedFunctionPrototypes */ +#else +METHODDEF void +huff_decode_mcu (decompress_info_ptr cinfo, JBLOCKROW *MCU_data) +#endif /* XIE_SUPPORTED */ +{ + register int s, k, r; + short blkn, ci; + register JBLOCKROW block; + register QUANT_TBL_PTR quanttbl; + HUFF_TBL *dctbl; + HUFF_TBL *actbl; + jpeg_component_info * compptr; + +#ifdef XIE_SUPPORTED + JCOEF last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each comp */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) + last_dc_val[ci] = cinfo->last_dc_val[ci]; + + dcinfo = cinfo; + bits_left = cinfo->XIEbits_left; + get_buffer = cinfo->XIEget_buffer; + restarts_to_go = cinfo->restarts_to_go; + next_restart_num = cinfo->next_restart_num; +#endif /* XIE_SUPPORTED */ + + /* Account for restart interval, process restart marker if needed */ + if (cinfo->restart_interval) { + if (cinfo->restarts_to_go == 0) +#ifdef XIE_SUPPORTED + { + s = process_restart(cinfo); + if (s == XIE_EOB) + return(XIE_EOB); + for (ci = 0; ci < cinfo->comps_in_scan; ci++) + last_dc_val[ci] = 0; + } + restarts_to_go--; +#else + process_restart(cinfo); + cinfo->restarts_to_go--; +#endif /* XIE_SUPPORTED */ + } + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + quanttbl = cinfo->quant_tbl_ptrs[compptr->quant_tbl_no]; + actbl = cinfo->ac_huff_tbl_ptrs[compptr->ac_tbl_no]; + dctbl = cinfo->dc_huff_tbl_ptrs[compptr->dc_tbl_no]; + + /* Decode a single block's worth of coefficients */ + + /* Section F.2.2.1: decode the DC coefficient difference */ + s = huff_DECODE(dctbl); +#ifdef XIE_SUPPORTED + if (s == XIE_EOB) { + return(XIE_EOB); + } +#endif /* XIE_SUPPORTED */ + if (s) { + r = get_bits(s); +#ifdef XIE_SUPPORTED + if (r == XIE_EOB) { + return(XIE_EOB); + } +#endif /* XIE_SUPPORTED */ + s = huff_EXTEND(r, s); + } + + /* Convert DC difference to actual value, update last_dc_val */ +#ifdef XIE_SUPPORTED + s += last_dc_val[ci]; + last_dc_val[ci] = (JCOEF) s; +#else + s += cinfo->last_dc_val[ci]; + cinfo->last_dc_val[ci] = (JCOEF) s; +#endif /* XIE_SUPPORTED */ + /* Descale and output the DC coefficient (assumes ZAG[0] = 0) */ + (*block)[0] = (JCOEF) (((JCOEF) s) * quanttbl[0]); + + /* Section F.2.2.2: decode the AC coefficients */ + /* Since zero values are skipped, output area must be zeroed beforehand */ + for (k = 1; k < DCTSIZE2; k++) { + r = huff_DECODE(actbl); +#ifdef XIE_SUPPORTED + if (r == XIE_EOB) { + return(XIE_EOB); + } +#endif /* XIE_SUPPORTED */ + + s = r & 15; + r = r >> 4; + + if (s) { + k += r; + r = get_bits(s); +#ifdef XIE_SUPPORTED + if (r == XIE_EOB) { + return(XIE_EOB); + } +#endif /* XIE_SUPPORTED */ + s = huff_EXTEND(r, s); + /* Descale coefficient and output in natural (dezigzagged) order */ + (*block)[ZAG[k]] = (JCOEF) (((JCOEF) s) * quanttbl[k]); + } else { + if (r != 15) + break; + k += 15; + } + } + } +#ifdef XIE_SUPPORTED + for (ci = 0; ci < cinfo->comps_in_scan; ci++) + cinfo->last_dc_val[ci] = last_dc_val[ci]; + cinfo->XIEbits_left = bits_left; + cinfo->XIEget_buffer = get_buffer; + cinfo->restarts_to_go = restarts_to_go; + cinfo->next_restart_num = next_restart_num; + return(0); +#endif /* XIE_SUPPORTED */ +} + + +/* + * Finish up at the end of a Huffman-compressed scan. + */ + +#ifndef XIE_SUPPORTED +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +huff_decoder_term (decompress_info_ptr cinfo) +#else +huff_decoder_term (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +huff_decoder_term (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + /* No work needed */ +} +#endif /* XIE_SUPPORTED */ + +/* + * The method selection routine for Huffman entropy decoding. + */ + +GLOBAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +jseldhuffman (decompress_info_ptr cinfo) +#else +jseldhuffman (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +jseldhuffman (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + if (! cinfo->arith_code) { + cinfo->methods->entropy_decode_init = huff_decoder_init; + cinfo->methods->entropy_decode = huff_decode_mcu; +#ifndef XIE_SUPPORTED + cinfo->methods->entropy_decode_term = huff_decoder_term; +#endif /* XIE_SUPPORTED */ + } +} diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdlossy.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdlossy.c new file mode 100644 index 0000000..17cd810 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdlossy.c @@ -0,0 +1,244 @@ +/* $XConsortium: jdlossy.c,v 1.4 94/04/17 20:35:35 rws Exp $ */ +/* Module jdlossy.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + jdlossy.c - decode JPEG images, Lossy method + + this contain code for: + + 1) JPEG Lossless, grayscale + 2) JPEG Lossless, color + + Ben Fahy, AGE Logic, Oct 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +#include "jpeg.h" + +/**********************************************************************/ +decode_jpeg_lossy_gray(state) +JpegDecodeState *state; +{ + return( decode_jpeg_lossy_color(state) ); +} +/**********************************************************************/ +decode_jpeg_lossy_color(state) +JpegDecodeState *state; +{ +int status; + +/* our output buffer is guaranteed to be clean on entry. */ +/* (every time we write data below, we return to flush it) */ + state->nl_found=0; + state->nl_flushed=0; + + while(1) { /* loop forever (we're a state machine) */ + + switch( state->goal) { + case JPEG_DECODE_GOAL_Startup: + state->goal = JPEG_DECODE_GOAL_ReadDataForInit; + + case JPEG_DECODE_GOAL_ReadDataForInit: + /* we start up by reading data into our buffer and calling INIT */ + status = fill_jpeg_decode_buffer(state); + switch(status) { + case JPEG_BUFFER_LastBuffer: + break; + + case JPEG_BUFFER_BufferFilled: + /* all is coolness */ + break; + + case JPEG_BUFFER_NeedAnotherStrip: + state->needs_input_strip = 1; + return(state->nl_found); + break; + + case JPEG_BUFFER_BufferError: + default: + state->error_code = JPEG_DECODE_ERROR_CouldNotStart; + return(-1); + } + + /* if here, we should have a nice full input buffer */ + + case JPEG_DECODE_GOAL_TryToInit: + status = JD_INIT(state->cinfo, + state->dc_methods, + state->e_methods, + state->up_sample); + if (status == XIE_ERR) { + state->error_code = JPEG_DECODE_ERROR_CouldNotInit; + return(-1); + } + if (status == XIE_NRML) { + state->goal = JPEG_DECODE_GOAL_InitDone; + break; + } + if (status == XIE_INP) { + state->goal = JPEG_DECODE_GOAL_ReadDataForInit; + break; + } + /* hey! we aren't supposed to be here */ + state->error_code = JPEG_DECODE_ERROR_BadInitRetCode; + return(-1); + break; + + case JPEG_DECODE_GOAL_InitDone: + + /* now we know enough to allocate our output buffer */ + state->cinfo->output_workspace = + alloc_sampimage(state->cinfo, + (int) state->cinfo->comps_in_scan, + (long) state->cinfo->rows_in_mem, + state->cinfo->image_width + ); + if (state->cinfo->output_workspace == NULL) { + state->error_code = JPEG_DECODE_ERROR_BadOutputAlloc; + return(-1); + } + state->goal = JPEG_DECODE_GOAL_ProcessData; + + case JPEG_DECODE_GOAL_ProcessData: + status = JD_PROCESS(state->cinfo); + + if (status == XIE_INP) { + state->goal = JPEG_DECODE_GOAL_ReadDataForProcess; + break; + } + if (status == XIE_OUT) { + state->goal = JPEG_DECODE_GOAL_WriteDataForProcess; + break; + } + if (status == XIE_EOI) { + state->goal = JPEG_DECODE_GOAL_EndOfInput; + break; + } + if (status == XIE_NRML) + break; + + if (status == XIE_ERR) { + state->error_code = JPEG_DECODE_ERROR_DecodeError; + return(-1); + } + else { + /* unexpected return status */ + state->error_code = JPEG_DECODE_ERROR_DecoderIsFreakingOut; + return(-1); + } + break; + + case JPEG_DECODE_GOAL_ReadDataForProcess: + status = fill_jpeg_decode_buffer(state); + switch(status) { + case JPEG_BUFFER_LastBuffer: + break; + + case JPEG_BUFFER_BufferFilled: + /* all is coolness */ + break; + + case JPEG_BUFFER_NeedAnotherStrip: + state->needs_input_strip = 1; + return(state->nl_found); + break; + + case JPEG_BUFFER_BufferError: + default: + state->error_code = JPEG_DECODE_ERROR_NoMoreProcessData; + return(-1); + } + state->goal = JPEG_DECODE_GOAL_ProcessData; + break; + + case JPEG_DECODE_GOAL_EndOfInput: + state->goal = JPEG_DECODE_GOAL_Done; + state->nl_found = (state->cinfo->image_height - + state->cinfo->pixel_rows_output); + /* see jdXIE_get() if this seems *too* self-serving */ + + /* leave for good */ + return(state->nl_found); + break; + + case JPEG_DECODE_GOAL_WriteDataForProcess: + state->goal = JPEG_DECODE_GOAL_ProcessData; + state->cinfo->pixel_rows_output += state->cinfo->rows_in_mem; + state->nl_found = state->cinfo->rows_in_mem; + /* leave to flush data */ + return(state->nl_found); + break; + + default: + state->error_code = JPEG_DECODE_ERROR_BadGoal; + return(-1); + } + } +} +/**********************************************************************/ diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdmcu.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdmcu.c new file mode 100644 index 0000000..c389943 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdmcu.c @@ -0,0 +1,433 @@ +/* $XConsortium: jdmcu.c,v 1.4 94/04/17 20:35:36 rws Exp $ */ +/* Module jdmcu.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +/* + * jdmcu.c + * + * Copyright (C) 1991, 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains MCU disassembly and IDCT control routines. + * These routines are invoked via the disassemble_MCU, reverse_DCT, and + * disassemble_init/term methods. + */ + +#include "jinclude.h" + + +/* + * Fetch one MCU row from entropy_decode, build coefficient array. + * This version is used for noninterleaved (single-component) scans. + */ + +#ifdef XIE_SUPPORTED +METHODDEF int +#if NeedFunctionPrototypes +disassemble_noninterleaved_MCU (decompress_info_ptr cinfo, + JBLOCKIMAGE image_data) +#else +disassemble_noninterleaved_MCU (cinfo, image_data) + decompress_info_ptr cinfo; + JBLOCKIMAGE image_data; +#endif /* NeedFunctionPrototypes */ +{ + long mcuindex; + long start; + + /* this is pretty easy since there is one component and one block per MCU */ + + if (cinfo->XIErestart == XIE_RMCU) { + start = cinfo->XIEmcuindex; + cinfo->XIErestart = XIE_RNUL; + } else { + start = 0; + /* Pre-zero the target area to speed up entropy decoder */ + /* (we assume wholesale zeroing is faster than retail) */ + jzero_far((pointer) image_data[0][0], + (size_t) (cinfo->MCUs_per_row * SIZEOF(JBLOCK))); + } + for (mcuindex = start; mcuindex < cinfo->MCUs_per_row; mcuindex++) { + /* Point to the proper spot in the image array for this MCU */ + cinfo->MCU_data[0] = image_data[0][0] + mcuindex; + /* Fetch the coefficient data */ + /* Save the current input buffer position (for restart) */ + cinfo->XIEnext_input_byte = cinfo->next_input_byte; + cinfo->XIEbytes_in_buffer = cinfo->bytes_in_buffer; + if (((*cinfo->methods->entropy_decode) (cinfo, cinfo->MCU_data)) < 0) { + cinfo->XIErestart = XIE_RMCU; + cinfo->XIEmcuindex = mcuindex; + cinfo->next_input_byte = cinfo->XIEnext_input_byte; + cinfo->bytes_in_buffer = cinfo->XIEbytes_in_buffer; + return(-1); + } + } + return(0); +} +#else +METHODDEF void +disassemble_noninterleaved_MCU (decompress_info_ptr cinfo, + JBLOCKIMAGE image_data) +{ + JBLOCKROW MCU_data[1]; + long mcuindex; + + /* this is pretty easy since there is one component and one block per MCU */ + + /* Pre-zero the target area to speed up entropy decoder */ + /* (we assume wholesale zeroing is faster than retail) */ + jzero_far((pointer) image_data[0][0], + (size_t) (cinfo->MCUs_per_row * SIZEOF(JBLOCK))); + + for (mcuindex = 0; mcuindex < cinfo->MCUs_per_row; mcuindex++) { + /* Point to the proper spot in the image array for this MCU */ + MCU_data[0] = image_data[0][0] + mcuindex; + /* Fetch the coefficient data */ + (*cinfo->methods->entropy_decode) (cinfo, MCU_data); + } +} +#endif /* XIE_SUPPORTED */ + + +/* + * Fetch one MCU row from entropy_decode, build coefficient array. + * This version is used for interleaved (multi-component) scans. + */ + +#ifdef XIE_SUPPORTED +METHODDEF int +#if NeedFunctionPrototypes +disassemble_interleaved_MCU (decompress_info_ptr cinfo, + JBLOCKIMAGE image_data) +#else +disassemble_interleaved_MCU (cinfo, image_data) + decompress_info_ptr cinfo; + JBLOCKIMAGE image_data; +#endif /* NeedFunctionPrototypes */ +{ + long mcuindex; + long start; + short blkn, ci, xpos, ypos; + jpeg_component_info * compptr; + JBLOCKROW image_ptr; + + /* Pre-zero the target area to speed up entropy decoder */ + /* (we assume wholesale zeroing is faster than retail) */ + if (cinfo->XIErestart == XIE_RMCU) { + start = cinfo->XIEmcuindex; + cinfo->XIErestart = XIE_RNUL; + } else { + start = 0; + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + for (ypos = 0; ypos < compptr->MCU_height; ypos++) { + jzero_far((pointer) image_data[ci][ypos], + (size_t) (cinfo->MCUs_per_row * compptr->MCU_width * SIZEOF(JBLOCK))); + } + } + } + + for (mcuindex = start; mcuindex < cinfo->MCUs_per_row; mcuindex++) { + /* Point to the proper spots in the image array for this MCU */ + blkn = 0; + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + for (ypos = 0; ypos < compptr->MCU_height; ypos++) { + image_ptr = image_data[ci][ypos] + (mcuindex * compptr->MCU_width); + for (xpos = 0; xpos < compptr->MCU_width; xpos++) { + cinfo->MCU_data[blkn] = image_ptr; + image_ptr++; + blkn++; + } + } + } + /* Fetch the coefficient data */ + /* Save the current input buffer position (for restart) */ + cinfo->XIEnext_input_byte = cinfo->next_input_byte; + cinfo->XIEbytes_in_buffer = cinfo->bytes_in_buffer; + if (((*cinfo->methods->entropy_decode) (cinfo, cinfo->MCU_data)) < 0) { + cinfo->XIErestart = XIE_RMCU; + cinfo->XIEmcuindex = mcuindex; + cinfo->next_input_byte = cinfo->XIEnext_input_byte; + cinfo->bytes_in_buffer = cinfo->XIEbytes_in_buffer; + return(-1); + } + } + return(0); +} +#else +METHODDEF void +disassemble_interleaved_MCU (decompress_info_ptr cinfo, + JBLOCKIMAGE image_data) +{ + JBLOCKROW MCU_data[MAX_BLOCKS_IN_MCU]; + long mcuindex; + short blkn, ci, xpos, ypos; + jpeg_component_info * compptr; + JBLOCKROW image_ptr; + + /* Pre-zero the target area to speed up entropy decoder */ + /* (we assume wholesale zeroing is faster than retail) */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + for (ypos = 0; ypos < compptr->MCU_height; ypos++) { + jzero_far((pointer) image_data[ci][ypos], + (size_t) (cinfo->MCUs_per_row * compptr->MCU_width * SIZEOF(JBLOCK))); + } + } + + for (mcuindex = 0; mcuindex < cinfo->MCUs_per_row; mcuindex++) { + /* Point to the proper spots in the image array for this MCU */ + blkn = 0; + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + for (ypos = 0; ypos < compptr->MCU_height; ypos++) { + image_ptr = image_data[ci][ypos] + (mcuindex * compptr->MCU_width); + for (xpos = 0; xpos < compptr->MCU_width; xpos++) { + MCU_data[blkn] = image_ptr; + image_ptr++; + blkn++; + } + } + } + /* Fetch the coefficient data */ + (*cinfo->methods->entropy_decode) (cinfo, MCU_data); + } +} +#endif /* XIE_SUPPORTED */ + +/* + * Perform inverse DCT on each block in an MCU row's worth of data; + * output the results into a sample array starting at row start_row. + * NB: start_row can only be nonzero when dealing with a single-component + * scan; otherwise we'd have to pass different offsets for different + * components, since the heights of interleaved MCU rows can vary. + * But the pipeline controller logic is such that this is not necessary. + */ + +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +reverse_DCT (decompress_info_ptr cinfo, + JBLOCKIMAGE coeff_data, JSAMPIMAGE output_data, int start_row) +#else +reverse_DCT (cinfo, coeff_data, output_data, start_row) + decompress_info_ptr cinfo; + JBLOCKIMAGE coeff_data; + JSAMPIMAGE output_data; + int start_row; +#endif /* NeedFunctionPrototypes */ +#else +reverse_DCT (decompress_info_ptr cinfo, + JBLOCKIMAGE coeff_data, JSAMPIMAGE output_data, int start_row) +#endif /* XIE_SUPPORTED */ +{ + DCTBLOCK block; + JBLOCKROW browptr; + JSAMPARRAY srowptr; + long blocksperrow, bi; + short numrows, ri; + short ci; + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + /* calculate size of an MCU row in this component */ + blocksperrow = cinfo->cur_comp_info[ci]->downsampled_width / DCTSIZE; + numrows = cinfo->cur_comp_info[ci]->MCU_height; + /* iterate through all blocks in MCU row */ + for (ri = 0; ri < numrows; ri++) { + browptr = coeff_data[ci][ri]; + srowptr = output_data[ci] + (ri * DCTSIZE + start_row); + for (bi = 0; bi < blocksperrow; bi++) { + /* copy the data into a local DCTBLOCK. This allows for change of + * representation (if DCTELEM != JCOEF). On 80x86 machines it also + * brings the data back from FAR storage to NEAR storage. + */ + { register JCOEFPTR elemptr = browptr[bi]; + register DCTELEM *localblkptr = block; + register int elem = DCTSIZE2; + + while (--elem >= 0) + *localblkptr++ = (DCTELEM) *elemptr++; + } + + j_rev_dct(block); /* perform inverse DCT */ + + /* Output the data into the sample array. + * Note change from signed to unsigned representation: + * DCT calculation works with values +-CENTERJSAMPLE, + * but sample arrays always hold 0..MAXJSAMPLE. + * We have to do range-limiting because of quantization errors in the + * DCT/IDCT phase. We use the sample_range_limit[] table to do this + * quickly; the CENTERJSAMPLE offset is folded into table indexing. + */ + { register JSAMPROW elemptr; + register DCTELEM *localblkptr = block; + register JSAMPLE *range_limit = cinfo->sample_range_limit + + CENTERJSAMPLE; +#if DCTSIZE != 8 + register int elemc; +#endif + register int elemr; + + for (elemr = 0; elemr < DCTSIZE; elemr++) { + elemptr = srowptr[elemr] + (bi * DCTSIZE); +#if DCTSIZE == 8 /* unroll the inner loop */ + *elemptr++ = range_limit[*localblkptr++]; + *elemptr++ = range_limit[*localblkptr++]; + *elemptr++ = range_limit[*localblkptr++]; + *elemptr++ = range_limit[*localblkptr++]; + *elemptr++ = range_limit[*localblkptr++]; + *elemptr++ = range_limit[*localblkptr++]; + *elemptr++ = range_limit[*localblkptr++]; + *elemptr++ = range_limit[*localblkptr++]; +#else + for (elemc = DCTSIZE; elemc > 0; elemc--) { + *elemptr++ = range_limit[*localblkptr++]; + } +#endif + } + } + } + } + } +} + + +/* + * Initialize for processing a scan. + */ + +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +disassemble_init (decompress_info_ptr cinfo) +#else +disassemble_init (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +disassemble_init (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + /* no work for now */ +} + + +/* + * Clean up after a scan. + */ + +#ifndef XIE_SUPPORTED +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +disassemble_term (decompress_info_ptr cinfo) +#else +disassemble_term (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +disassemble_term (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + /* no work for now */ +} +#endif /* XIE_SUPPORTED */ + + +/* + * The method selection routine for MCU disassembly. + */ + +GLOBAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +jseldmcu (decompress_info_ptr cinfo) +#else +jseldmcu (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +jseldmcu (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + if (cinfo->comps_in_scan == 1) + cinfo->methods->disassemble_MCU = disassemble_noninterleaved_MCU; + else + cinfo->methods->disassemble_MCU = disassemble_interleaved_MCU; + cinfo->methods->reverse_DCT = reverse_DCT; + cinfo->methods->disassemble_init = disassemble_init; +#ifndef XIE_SUPPORTED + cinfo->methods->disassemble_term = disassemble_term; +#endif /* XIE_SUPPORTED */ +} diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdsample.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdsample.c new file mode 100644 index 0000000..3f81f18 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdsample.c @@ -0,0 +1,510 @@ +/* $XConsortium: jdsample.c,v 1.4 94/04/17 20:35:36 rws Exp $ */ +/* Module jdsample.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., October 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +/* + * jdsample.c + * + * Copyright (C) 1991, 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains upsampling routines. + * These routines are invoked via the upsample and + * upsample_init/term methods. + * + * An excellent reference for image resampling is + * Digital Image Warping, George Wolberg, 1990. + * Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7. + */ + +#include "jinclude.h" + + +/* + * Initialize for upsampling a scan. + */ + +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +upsample_init (decompress_info_ptr cinfo) +#else +upsample_init (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +upsample_init (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + /* no work for now */ +} + + +/* + * Upsample pixel values of a single component. + * This version handles any integral sampling ratios. + * + * This is not used for typical JPEG files, so it need not be fast. + * Nor, for that matter, is it particularly accurate: the algorithm is + * simple replication of the input pixel onto the corresponding output + * pixels. The hi-falutin sampling literature refers to this as a + * "box filter". A box filter tends to introduce visible artifacts, + * so if you are actually going to use 3:1 or 4:1 sampling ratios + * you would be well advised to improve this code. + */ + +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +int_upsample (decompress_info_ptr cinfo, int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, + JSAMPARRAY output_data) +#else +int_upsample (cinfo, which_component, + input_cols, input_rows, + output_cols, output_rows, + above, input_data, below, + output_data) + decompress_info_ptr cinfo; + int which_component; + long input_cols; + int input_rows; + long output_cols; + int output_rows; + JSAMPARRAY above; + JSAMPARRAY input_data; + JSAMPARRAY below; + JSAMPARRAY output_data; +#endif /* NeedFunctionPrototypes */ +#else +int_upsample (decompress_info_ptr cinfo, int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, + JSAMPARRAY output_data) +#endif /* XIE_SUPPORTED */ +{ + jpeg_component_info * compptr = cinfo->cur_comp_info[which_component]; + register JSAMPROW inptr, outptr; + register JSAMPLE invalue; + register short h_expand, h; + short v_expand, v; + int inrow, outrow; + register long incol; + +#ifndef XIE_SUPPORTED +#ifdef DEBUG /* for debugging pipeline controller */ + if (input_rows != compptr->v_samp_factor || + output_rows != cinfo->max_v_samp_factor || + (input_cols % compptr->h_samp_factor) != 0 || + (output_cols % cinfo->max_h_samp_factor) != 0 || + output_cols*compptr->h_samp_factor != input_cols*cinfo->max_h_samp_factor) + ERREXIT(cinfo->emethods, "Bogus upsample parameters"); +#endif +#endif /* XIE_SUPPORTED */ + + h_expand = cinfo->max_h_samp_factor / compptr->h_samp_factor; + v_expand = cinfo->max_v_samp_factor / compptr->v_samp_factor; + + outrow = 0; + for (inrow = 0; inrow < input_rows; inrow++) { + for (v = 0; v < v_expand; v++) { + inptr = input_data[inrow]; + outptr = output_data[outrow++]; + for (incol = 0; incol < input_cols; incol++) { + invalue = GETJSAMPLE(*inptr++); + for (h = 0; h < h_expand; h++) { + *outptr++ = invalue; + } + } + } + } +} + + +/* + * Upsample pixel values of a single component. + * This version handles the common case of 2:1 horizontal and 1:1 vertical. + * + * The upsampling algorithm is linear interpolation between pixel centers, + * also known as a "triangle filter". This is a good compromise between + * speed and visual quality. The centers of the output pixels are 1/4 and 3/4 + * of the way between input pixel centers. + */ + +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +h2v1_upsample (decompress_info_ptr cinfo, int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, + JSAMPARRAY output_data) +#else +h2v1_upsample (cinfo, which_component, + input_cols, input_rows, + output_cols, output_rows, + above, input_data, below, + output_data) + decompress_info_ptr cinfo; + int which_component; + long input_cols; + int input_rows; + long output_cols; + int output_rows; + JSAMPARRAY above; + JSAMPARRAY input_data; + JSAMPARRAY below; + JSAMPARRAY output_data; +#endif /* NeedFunctionPrototypes */ +#else +h2v1_upsample (decompress_info_ptr cinfo, int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, + JSAMPARRAY output_data) +#endif /* XIE_SUPPORTED */ +{ + register JSAMPROW inptr, outptr; + register int invalue; + int inrow; + register long colctr; + +#ifndef XIE_SUPPORTED +#ifdef DEBUG /* for debugging pipeline controller */ + jpeg_component_info * compptr = cinfo->cur_comp_info[which_component]; + if (input_rows != compptr->v_samp_factor || + output_rows != cinfo->max_v_samp_factor || + (input_cols % compptr->h_samp_factor) != 0 || + (output_cols % cinfo->max_h_samp_factor) != 0 || + output_cols*compptr->h_samp_factor != input_cols*cinfo->max_h_samp_factor) + ERREXIT(cinfo->emethods, "Bogus upsample parameters"); +#endif +#endif /* XIE_SUPPORTED */ + + for (inrow = 0; inrow < input_rows; inrow++) { + inptr = input_data[inrow]; + outptr = output_data[inrow]; + /* Special case for first column */ + invalue = GETJSAMPLE(*inptr++); + *outptr++ = (JSAMPLE) invalue; + *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(*inptr) + 2) >> 2); + + for (colctr = input_cols - 2; colctr > 0; colctr--) { + /* General case: 3/4 * nearer pixel + 1/4 * further pixel */ + invalue = GETJSAMPLE(*inptr++) * 3; + *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(inptr[-2]) + 2) >> 2); + *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(*inptr) + 2) >> 2); + } + + /* Special case for last column */ + invalue = GETJSAMPLE(*inptr); + *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(inptr[-1]) + 2) >> 2); + *outptr++ = (JSAMPLE) invalue; + } +} + + +/* + * Upsample pixel values of a single component. + * This version handles the common case of 2:1 horizontal and 2:1 vertical. + * + * The upsampling algorithm is linear interpolation between pixel centers, + * also known as a "triangle filter". This is a good compromise between + * speed and visual quality. The centers of the output pixels are 1/4 and 3/4 + * of the way between input pixel centers. + */ + +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +h2v2_upsample (decompress_info_ptr cinfo, int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, + JSAMPARRAY output_data) +#else +h2v2_upsample (cinfo, which_component, + input_cols, input_rows, + output_cols, output_rows, + above, input_data, below, + output_data) + decompress_info_ptr cinfo; + int which_component; + long input_cols; + int input_rows; + long output_cols; + int output_rows; + JSAMPARRAY above; + JSAMPARRAY input_data; + JSAMPARRAY below; + JSAMPARRAY output_data; +#endif /* NeedFunctionPrototypes */ +#else +h2v2_upsample (decompress_info_ptr cinfo, int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, + JSAMPARRAY output_data) +#endif /* XIE_SUPPORTED */ +{ + register JSAMPROW inptr0, inptr1, outptr; +#ifdef EIGHT_BIT_SAMPLES + register int thiscolsum, lastcolsum, nextcolsum; +#else + register INT32 thiscolsum, lastcolsum, nextcolsum; +#endif + int inrow, outrow, v; + register long colctr; + +#ifndef XIE_SUPPORTED +#ifdef DEBUG /* for debugging pipeline controller */ + jpeg_component_info * compptr = cinfo->cur_comp_info[which_component]; + if (input_rows != compptr->v_samp_factor || + output_rows != cinfo->max_v_samp_factor || + (input_cols % compptr->h_samp_factor) != 0 || + (output_cols % cinfo->max_h_samp_factor) != 0 || + output_cols*compptr->h_samp_factor != input_cols*cinfo->max_h_samp_factor) + ERREXIT(cinfo->emethods, "Bogus upsample parameters"); +#endif +#endif /* XIE_SUPPORTED */ + + outrow = 0; + for (inrow = 0; inrow < input_rows; inrow++) { + for (v = 0; v < 2; v++) { + /* inptr0 points to nearest input row, inptr1 points to next nearest */ + inptr0 = input_data[inrow]; + if (v == 0) { /* next nearest is row above */ + if (inrow == 0) + inptr1 = above[input_rows-1]; + else + inptr1 = input_data[inrow-1]; + } else { /* next nearest is row below */ + if (inrow == input_rows-1) + inptr1 = below[0]; + else + inptr1 = input_data[inrow+1]; + } + outptr = output_data[outrow++]; + + /* Special case for first column */ + thiscolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); + nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); + *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 8) >> 4); + *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 8) >> 4); + lastcolsum = thiscolsum; thiscolsum = nextcolsum; + + for (colctr = input_cols - 2; colctr > 0; colctr--) { + /* General case: 3/4 * nearer pixel + 1/4 * further pixel in each */ + /* dimension, thus 9/16, 3/16, 3/16, 1/16 overall */ + nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); + *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4); + *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 8) >> 4); + lastcolsum = thiscolsum; thiscolsum = nextcolsum; + } + + /* Special case for last column */ + *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4); + *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 8) >> 4); + } + } +} + + +/* + * Upsample pixel values of a single component. + * This version handles the special case of a full-size component. + */ + +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +fullsize_upsample (decompress_info_ptr cinfo, int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, + JSAMPARRAY output_data) +#else +fullsize_upsample (cinfo, which_component, + input_cols, input_rows, + output_cols, output_rows, + above, input_data, below, + output_data) + decompress_info_ptr cinfo; + int which_component; + long input_cols; + int input_rows; + long output_cols; + int output_rows; + JSAMPARRAY above; + JSAMPARRAY input_data; + JSAMPARRAY below; + JSAMPARRAY output_data; +#endif /* NeedFunctionPrototypes */ +#else +fullsize_upsample (decompress_info_ptr cinfo, int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, JSAMPARRAY input_data, JSAMPARRAY below, + JSAMPARRAY output_data) +#endif /* XIE_SUPPORTED */ +{ +#ifndef XIE_SUPPORTED +#ifdef DEBUG /* for debugging pipeline controller */ + if (input_cols != output_cols || input_rows != output_rows) + ERREXIT(cinfo->emethods, "Pipeline controller messed up"); +#endif +#endif /* XIE_SUPPORTED */ + + jcopy_sample_rows(input_data, 0, output_data, 0, output_rows, output_cols); +} + + + +/* + * Clean up after a scan. + */ + +#ifndef XIE_SUPPORTED +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +upsample_term (decompress_info_ptr cinfo) +#else +upsample_term (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +upsample_term (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + /* no work for now */ +} +#endif /* XIE_SUPPORTED */ + + +/* + * The method selection routine for upsampling. + * Note that we must select a routine for each component. + */ + +GLOBAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +jselupsample (decompress_info_ptr cinfo) +#else +jselupsample (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +jselupsample (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + short ci; + jpeg_component_info * compptr; + +#ifndef XIE_SUPPORTED + if (cinfo->CCIR601_sampling) + ERREXIT(cinfo->emethods, "CCIR601 upsampling not implemented yet"); +#endif /* XIE_SUPPORTED */ + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + if (compptr->h_samp_factor == cinfo->max_h_samp_factor && + compptr->v_samp_factor == cinfo->max_v_samp_factor) + cinfo->methods->upsample[ci] = fullsize_upsample; + else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor && + compptr->v_samp_factor == cinfo->max_v_samp_factor) + cinfo->methods->upsample[ci] = h2v1_upsample; + else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor && + compptr->v_samp_factor * 2 == cinfo->max_v_samp_factor) + cinfo->methods->upsample[ci] = h2v2_upsample; + else if ((cinfo->max_h_samp_factor % compptr->h_samp_factor) == 0 && + (cinfo->max_v_samp_factor % compptr->v_samp_factor) == 0) + cinfo->methods->upsample[ci] = int_upsample; + else +#ifdef XIE_SUPPORTED + {} +#else + ERREXIT(cinfo->emethods, "Fractional upsampling not implemented yet"); +#endif /* XIE_SUPPORTED */ + } + + cinfo->methods->upsample_init = upsample_init; +#ifndef XIE_SUPPORTED + cinfo->methods->upsample_term = upsample_term; +#endif /* XIE_SUPPORTED */ +} diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdxie.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdxie.c new file mode 100644 index 0000000..8f8dea7 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdxie.c @@ -0,0 +1,901 @@ +/* $XConsortium: jdxie.c,v 1.4 94/04/17 20:35:38 rws Exp $ */ +/* Module jdxie.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., October 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +/* + * Copyright (C) 1992, Thomas G. Lane. + * This file was derived in part from the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + */ + +#include "jinclude.h" + +METHODDEF void +#if NeedFunctionPrototypes +d_ui_method_selection (decompress_info_ptr cinfo) +#else +d_ui_method_selection (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +{ + /* if grayscale or CMYK input, force similar output; */ + /* else leave the output colorspace as set by options. */ + if (cinfo->jpeg_color_space == CS_GRAYSCALE) + cinfo->out_color_space = CS_GRAYSCALE; + else if (cinfo->jpeg_color_space == CS_CMYK) + cinfo->out_color_space = CS_CMYK; +} + +/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays + * and coefficient-block arrays. This won't work on 80x86 because the arrays + * are FAR and we're assuming a small-pointer memory model. However, some + * DOS compilers provide far-pointer versions of memcpy() and memset() even + * in the small-model libraries. These will be used if USE_FMEM is defined. + * Otherwise, the routines below do it the hard way. (The performance cost + * is not all that great, because these routines aren't very heavily used.) + */ + +#ifndef NEED_FAR_POINTERS /* normal case, same as regular macros */ +#define FMEMCOPY(dest,src,size) MEMCOPY(dest,src,size) +#define FMEMZERO(target,size) MEMZERO(target,size) +#else /* 80x86 case, define if we can */ +#ifdef USE_FMEM +#define FMEMCOPY(dest,src,size) _fmemcpy((pointer*)(dest), (const pointer*)(src), (size_t)(size)) +#define FMEMZERO(target,size) _fmemset((pointer*)(target), 0, (size_t)(size)) +#endif +#endif + +METHODDEF void +#if NeedFunctionPrototypes +d_per_scan_method_selection (decompress_info_ptr cinfo) +#else +d_per_scan_method_selection (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +/* Central point for per-scan method selection */ +{ + /* MCU disassembly */ + jseldmcu(cinfo); + if (cinfo->XIE_upsample) + /* Upsampling of pixels */ + jselupsample(cinfo); +} + + +LOCAL void +#if NeedFunctionPrototypes +d_initial_method_selection (decompress_info_ptr cinfo) +#else +d_initial_method_selection (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +/* Central point for initial method selection (after reading file header) */ +{ + /* JPEG file scanning method selection is already done. */ + /* So is output file format selection (both are done by user interface). */ + + /* Entropy decoding: Huffman coding. */ + jseldhuffman(cinfo); + cinfo->do_block_smoothing = FALSE; + + /* Overall control (that's me!) */ + cinfo->methods->d_per_scan_method_selection = d_per_scan_method_selection; +} + + +LOCAL int +#if NeedFunctionPrototypes +initial_setup (decompress_info_ptr cinfo) +#else +initial_setup (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +/* Do computations that are needed before initial method selection */ +{ + short ci; + jpeg_component_info *compptr; + + /* Compute maximum sampling factors; check factor validity */ + cinfo->max_h_samp_factor = 1; + cinfo->max_v_samp_factor = 1; + for (ci = 0; ci < cinfo->num_components; ci++) { + compptr = &cinfo->comp_info[ci]; + if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR || + compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR) + /* ERREXIT(cinfo->emethods, "Bogus sampling factors"); */ + return(XIE_ERR); + cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor, + compptr->h_samp_factor); + cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor, + compptr->v_samp_factor); + } + + /* Compute logical downsampled dimensions of components */ + for (ci = 0; ci < cinfo->num_components; ci++) { + compptr = &cinfo->comp_info[ci]; + compptr->true_comp_width = (cinfo->image_width * compptr->h_samp_factor + + cinfo->max_h_samp_factor - 1) + / cinfo->max_h_samp_factor; + compptr->true_comp_height = (cinfo->image_height * compptr->v_samp_factor + + cinfo->max_v_samp_factor - 1) + / cinfo->max_v_samp_factor; + } + return(0); +} + + +/* + * About the data structures: + * + * The processing chunk size for upsampling is referred to in this file as + * a "row group": a row group is defined as Vk (v_samp_factor) sample rows of + * any component while downsampled, or Vmax (max_v_samp_factor) unsubsampled + * rows. In an interleaved scan each MCU row contains exactly DCTSIZE row + * groups of each component in the scan. In a noninterleaved scan an MCU row + * is one row of blocks, which might not be an integral number of row groups; + * therefore, we read in Vk MCU rows to obtain the same amount of data as we'd + * have in an interleaved scan. + * To provide context for the upsampling step, we have to retain the last + * two row groups of the previous MCU row while reading in the next MCU row + * (or set of Vk MCU rows). To do this without copying data about, we create + * a rather strange data structure. Exactly DCTSIZE+2 row groups of samples + * are allocated, but we create two different sets of pointers to this array. + * The second set swaps the last two pairs of row groups. By working + * alternately with the two sets of pointers, we can access the data in the + * desired order. + * + * Cross-block smoothing also needs context above and below the "current" row. + * Since this is an optional feature, I've implemented it in a way that is + * much simpler but requires more than the minimum amount of memory. We + * simply allocate three extra MCU rows worth of coefficient blocks and use + * them to "read ahead" one MCU row in the file. For a typical 1000-pixel-wide + * image with 2x2,1x1,1x1 sampling, each MCU row is about 50Kb; an 80x86 + * machine may be unable to apply cross-block smoothing to wider images. + */ + + +/* + * Utility routines: common code for pipeline controller + */ + +LOCAL int +#if NeedFunctionPrototypes +interleaved_scan_setup (decompress_info_ptr cinfo) +#else +interleaved_scan_setup (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +/* Compute all derived info for an interleaved (multi-component) scan */ +/* On entry, cinfo->comps_in_scan and cinfo->cur_comp_info[] are set up */ +{ + short ci, mcublks; + jpeg_component_info *compptr; + + if (cinfo->comps_in_scan > MAX_COMPS_IN_SCAN) + /* ERREXIT(cinfo->emethods, "Too many components for interleaved scan"); */ + return(XIE_ERR); + + cinfo->MCUs_per_row = (cinfo->image_width + + cinfo->max_h_samp_factor*DCTSIZE - 1) + / (cinfo->max_h_samp_factor*DCTSIZE); + + cinfo->MCU_rows_in_scan = (cinfo->image_height + + cinfo->max_v_samp_factor*DCTSIZE - 1) + / (cinfo->max_v_samp_factor*DCTSIZE); + + cinfo->blocks_in_MCU = 0; + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* for interleaved scan, sampling factors give # of blocks per component */ + compptr->MCU_width = compptr->h_samp_factor; + compptr->MCU_height = compptr->v_samp_factor; + compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height; + /* compute physical dimensions of component */ + compptr->downsampled_width = jround_up(compptr->true_comp_width, + (long) (compptr->MCU_width*DCTSIZE)); + compptr->downsampled_height = jround_up(compptr->true_comp_height, + (long) (compptr->MCU_height*DCTSIZE)); + /* Sanity check */ + if (compptr->downsampled_width != + (cinfo->MCUs_per_row * (compptr->MCU_width*DCTSIZE))) + /* ERREXIT(cinfo->emethods, "I'm confused about the image width"); */ + return(XIE_ERR); + /* Prepare array describing MCU composition */ + mcublks = compptr->MCU_blocks; + if (cinfo->blocks_in_MCU + mcublks > MAX_BLOCKS_IN_MCU) + /* ERREXIT(cinfo->emethods, "Sampling factors too large for interleaved scan"); */ + return(XIE_ERR); + while (mcublks-- > 0) { + cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci; + } + } + + (*cinfo->methods->d_per_scan_method_selection) (cinfo); + return(0); +} + + +LOCAL void +#if NeedFunctionPrototypes +noninterleaved_scan_setup (decompress_info_ptr cinfo) +#else +noninterleaved_scan_setup (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +/* Compute all derived info for a noninterleaved (single-component) scan */ +/* On entry, cinfo->comps_in_scan = 1 and cinfo->cur_comp_info[0] is set up */ +{ + jpeg_component_info *compptr = cinfo->cur_comp_info[0]; + + /* for noninterleaved scan, always one block per MCU */ + compptr->MCU_width = 1; + compptr->MCU_height = 1; + compptr->MCU_blocks = 1; + /* compute physical dimensions of component */ + compptr->downsampled_width = jround_up(compptr->true_comp_width, + (long) DCTSIZE); + compptr->downsampled_height = jround_up(compptr->true_comp_height, + (long) DCTSIZE); + + cinfo->MCUs_per_row = compptr->downsampled_width / DCTSIZE; + cinfo->MCU_rows_in_scan = compptr->downsampled_height / DCTSIZE; + + /* Prepare array describing MCU composition */ + cinfo->blocks_in_MCU = 1; + cinfo->MCU_membership[0] = 0; + + (*cinfo->methods->d_per_scan_method_selection) (cinfo); +} + +GLOBAL JSAMPIMAGE +#if NeedFunctionPrototypes +alloc_sampimage (decompress_info_ptr cinfo, + int num_comps, long num_rows, long num_cols) +#else +alloc_sampimage (cinfo, num_comps, num_rows, num_cols) + decompress_info_ptr cinfo; + int num_comps; + long num_rows; + long num_cols; +#endif /* NeedFunctionPrototypes */ +/* Allocate an in-memory sample image (all components same size) */ +{ + JSAMPIMAGE image; + int ci; + + image = (JSAMPIMAGE) (*cinfo->emethods->d_alloc_small) + (cinfo, (num_comps * SIZEOF(JSAMPARRAY))); + if (image == (JSAMPIMAGE) NULL) + return((JSAMPIMAGE) NULL); + for (ci = 0; ci < num_comps; ci++) { + image[ci] = (*cinfo->emethods->d_alloc_small_sarray) + (cinfo, num_cols, num_rows); + if (image[ci] == NULL) + return((JSAMPIMAGE) NULL); + } + return image; +} + +LOCAL JBLOCKIMAGE +#if NeedFunctionPrototypes +alloc_MCU_row (decompress_info_ptr cinfo) +#else +alloc_MCU_row (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +/* Allocate one MCU row's worth of coefficient blocks */ +{ + JBLOCKIMAGE image; + int ci; + + image = (JBLOCKIMAGE) (*cinfo->emethods->d_alloc_small) + (cinfo, (cinfo->comps_in_scan * SIZEOF(JBLOCKARRAY))); + if (image == (JBLOCKIMAGE) NULL) + return((JBLOCKIMAGE) NULL); + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + image[ci] = (*cinfo->emethods->d_alloc_small_barray) + (cinfo, cinfo->cur_comp_info[ci]->downsampled_width / DCTSIZE, + (long) cinfo->cur_comp_info[ci]->MCU_height); + if (image[ci] == NULL) + return((JBLOCKIMAGE) NULL); + } + return image; +} + +LOCAL int +#if NeedFunctionPrototypes +alloc_sampling_buffer (decompress_info_ptr cinfo, JSAMPIMAGE sampled_data[2]) +#else +alloc_sampling_buffer (cinfo, sampled_data) + decompress_info_ptr cinfo; + JSAMPIMAGE sampled_data[2]; +#endif /* NeedFunctionPrototypes */ +/* Create a downsampled-data buffer having the desired structure */ +/* (see comments at head of file) */ +{ + short ci, vs, i; + + /* Get top-level space for array pointers */ + sampled_data[0] = (JSAMPIMAGE) (*cinfo->emethods->d_alloc_small) + (cinfo, (cinfo->comps_in_scan * SIZEOF(JSAMPARRAY))); + if (cinfo->sampled_data[0] == (JSAMPIMAGE) NULL) + return(XIE_ERR); + sampled_data[1] = (JSAMPIMAGE) (*cinfo->emethods->d_alloc_small) + (cinfo, (cinfo->comps_in_scan * SIZEOF(JSAMPARRAY))); + if (cinfo->sampled_data[1] == (JSAMPIMAGE) NULL) + return(XIE_ERR); + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + vs = cinfo->cur_comp_info[ci]->v_samp_factor; /* row group height */ + /* Allocate the real storage */ + sampled_data[0][ci] = (*cinfo->emethods->d_alloc_small_sarray) + (cinfo, cinfo->cur_comp_info[ci]->downsampled_width, + (long) (vs * (DCTSIZE+2))); + if (cinfo->sampled_data[0][ci] == NULL) + return(XIE_ERR); + /* Create space for the scrambled-order pointers */ + sampled_data[1][ci] = (JSAMPARRAY) (*cinfo->emethods->d_alloc_small) + (cinfo, (vs * (DCTSIZE+2) * SIZEOF(JSAMPROW))); + if (cinfo->sampled_data[1][ci] == (JSAMPARRAY) NULL) + return(XIE_ERR); + /* Duplicate the first DCTSIZE-2 row groups */ + for (i = 0; i < vs * (DCTSIZE-2); i++) { + sampled_data[1][ci][i] = sampled_data[0][ci][i]; + } + /* Copy the last four row groups in swapped order */ + for (i = 0; i < vs * 2; i++) { + sampled_data[1][ci][vs*DCTSIZE + i] = sampled_data[0][ci][vs*(DCTSIZE-2) + i]; + sampled_data[1][ci][vs*(DCTSIZE-2) + i] = sampled_data[0][ci][vs*DCTSIZE + i]; + } + } + return(0); +} + +/* + * Several decompression processes need to range-limit values to the range + * 0..MAXJSAMPLE; the input value may fall somewhat outside this range + * due to noise introduced by quantization, roundoff error, etc. These + * processes are inner loops and need to be as fast as possible. On most + * machines, particularly CPUs with pipelines or instruction prefetch, + * a (range-check-less) C table lookup + * x = sample_range_limit[x]; + * is faster than explicit tests + * if (x < 0) x = 0; + * else if (x > MAXJSAMPLE) x = MAXJSAMPLE; + * These processes all use a common table prepared by the routine below. + * + * The table will work correctly for x within MAXJSAMPLE+1 of the legal + * range. This is a much wider range than is needed for most cases, + * but the wide range is handy for color quantization. + * Note that the table is allocated in near data space on PCs; it's small + * enough and used often enough to justify this. + */ + +LOCAL int +#if NeedFunctionPrototypes +prepare_range_limit_table (decompress_info_ptr cinfo) +#else +prepare_range_limit_table (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +/* Allocate and fill in the sample_range_limit table */ +{ + JSAMPLE * table; + int i; + + table = (JSAMPLE *) (*cinfo->emethods->d_alloc_small) + (cinfo, (3 * (MAXJSAMPLE+1) * SIZEOF(JSAMPLE))); + if (table == (JSAMPLE *) NULL) + return(XIE_ERR); + cinfo->sample_range_limit = table + (MAXJSAMPLE+1); + for (i = 0; i <= MAXJSAMPLE; i++) { + table[i] = 0; /* sample_range_limit[x] = 0 for x<0 */ + table[i+(MAXJSAMPLE+1)] = (JSAMPLE) i; /* sample_range_limit[x] = x */ + table[i+(MAXJSAMPLE+1)*2] = MAXJSAMPLE; /* x beyond MAXJSAMPLE */ + } + return(0); +} + +LOCAL void +#if NeedFunctionPrototypes +duplicate_row (JSAMPARRAY image_data, + long num_cols, int source_row, int num_rows) +#else +duplicate_row (image_data, num_cols, source_row, num_rows) + JSAMPARRAY image_data; + long num_cols; + int source_row; + int num_rows; +#endif /* NeedFunctionPrototypes */ +/* Duplicate the source_row at source_row+1 .. source_row+num_rows */ +/* This happens only at the bottom of the image, */ +/* so it needn't be super-efficient */ +{ + register int row; + + for (row = 1; row <= num_rows; row++) { + jcopy_sample_rows(image_data, source_row, image_data, source_row + row, + 1, num_cols); + } +} + +LOCAL void +#if NeedFunctionPrototypes +expand (decompress_info_ptr cinfo, + JSAMPIMAGE sampled_data, JSAMPIMAGE fullsize_data, + long fullsize_width, + short above, short current, short below, short out) +#else +expand (cinfo, + sampled_data, fullsize_data, + fullsize_width, + above, current, below, out) + decompress_info_ptr cinfo; + JSAMPIMAGE sampled_data; + JSAMPIMAGE fullsize_data; + long fullsize_width; + short above; + short current; + short below; + short out; +#endif /* NeedFunctionPrototypes */ +/* Do upsampling expansion of a single row group (of each component). */ +/* above, current, below are indexes of row groups in sampled_data; */ +/* out is the index of the target row group in fullsize_data. */ +/* Special case: above, below can be -1 to indicate top, bottom of image. */ +{ + jpeg_component_info *compptr; + JSAMPARRAY above_ptr, below_ptr; + JSAMPROW dummy[MAX_SAMP_FACTOR]; /* for downsample expansion at top/bottom */ + short ci, vs, i; + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + vs = compptr->v_samp_factor; /* row group height */ + + if (above >= 0) + above_ptr = sampled_data[ci] + above * vs; + else { + /* Top of image: make a dummy above-context with copies of 1st row */ + /* We assume current=0 in this case */ + for (i = 0; i < vs; i++) + dummy[i] = sampled_data[ci][0]; + above_ptr = (JSAMPARRAY) dummy; /* possible near->far pointer conv */ + } + + if (below >= 0) + below_ptr = sampled_data[ci] + below * vs; + else { + /* Bot of image: make a dummy below-context with copies of last row */ + for (i = 0; i < vs; i++) + dummy[i] = sampled_data[ci][(current+1)*vs-1]; + below_ptr = (JSAMPARRAY) dummy; /* possible near->far pointer conv */ + } + + (*cinfo->methods->upsample[ci]) + (cinfo, (int) ci, + compptr->downsampled_width, (int) vs, + fullsize_width, (int) cinfo->max_v_samp_factor, + above_ptr, + sampled_data[ci] + current * vs, + below_ptr, + fullsize_data[ci] + out * cinfo->max_v_samp_factor); + } +} + +LOCAL void +#if NeedFunctionPrototypes +jdcopy_pixel_rows (decompress_info_ptr cinfo, + JSAMPIMAGE input_array, JSAMPIMAGE output_array) +#else +jdcopy_pixel_rows (cinfo,input_array, output_array) + decompress_info_ptr cinfo; + JSAMPIMAGE input_array; + JSAMPIMAGE output_array; +#endif /* NeedFunctionPrototypes */ +/* Copy some rows of samples from one place to another. + * num_rows rows are copied from input_array[source_row++] + * to output_array[dest_row++]; these areas should not overlap. + * The source and destination arrays must be at least as wide as num_cols. + */ +{ + register JSAMPROW inptr, outptr; +#ifdef FMEMCOPY + register size_t count; +#else + register long count; +#endif + register int ci, row; + int num_components; + int num_rows; + long num_cols; + + num_components = cinfo->num_components; + if (cinfo->XIE_upsample) { + num_rows = cinfo->rows_in_mem; + num_cols = cinfo->image_width; +#ifdef FMEMCOPY + count = (size_t) (num_cols * SIZEOF(JSAMPLE)); +#endif + } + + for (ci = 0; ci < num_components; ci++) { + if (!cinfo->XIE_upsample) { + num_rows = cinfo->comp_info[ci].h_samp_factor*DCTSIZE; + num_cols = cinfo->comp_info[ci].true_comp_width; +#ifdef FMEMCOPY + count = (size_t) (num_cols * SIZEOF(JSAMPLE)); +#endif + } + for (row = 0; row < num_rows; row++) { + inptr = input_array[ci][row]; + outptr = output_array[ci][row]; +#ifdef FMEMCOPY + FMEMCOPY(outptr, inptr, count); +#else + for (count = 0; count < num_cols; count++) + outptr[count] = inptr[count]; /* needn't bother with GETJSAMPLE() here */ +#endif + } + } +} + +GLOBAL int +#if NeedFunctionPrototypes +jdXIE_init (decompress_info_ptr cinfo) +#else +jdXIE_init (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +{ + int status; + + if (cinfo->XIErestart == XIE_RNUL) { + /* Install, but don't yet enable signal catcher. */ + + /* Set up compression parameters */ + /* Initialize cinfo with default switch settings */ + /* (Re-)initialize the system-dependent error and memory managers. */ + jdselmemmgr(cinfo, cinfo->emethods); /* memory allocation routines */ + cinfo->methods->d_ui_method_selection = d_ui_method_selection; + + /* Set up default JPEG parameters. */ + j_d_defaults(cinfo, FALSE); + + /* Set up to read a baseline-JPEG file. */ + jselrjfif(cinfo); + + /* Init pass counts to 0 --- total_passes is adjusted in method selection */ + cinfo->total_passes = 0; + cinfo->completed_passes = 0; + + cinfo->XIErestart = XIE_RNUL; + cinfo->XIEmcuindex = 0; + } /* if (cinfo->XIErestart != XIE_RNUL) */ + + /* Read the JPEG file header markers; everything up through the first SOS + * marker is read now. NOTE: the user interface must have initialized the + * read_file_header method pointer (eg, by calling jselrjfif or jselrtiff). + * The other file reading methods (read_scan_header etc.) were probably + * set at the same time, but could be set up by read_file_header itself. + */ + if (cinfo->XIErestart != XIE_RRSH) { + + /* need more data */ + if ((status = ((*cinfo->methods->read_file_header)(cinfo))) < 0) { + if (status == XIE_ERR) + return(XIE_ERR); + cinfo->XIErestart = XIE_RRFH; + cinfo->next_input_byte = cinfo->XIEnext_input_byte; + cinfo->bytes_in_buffer = cinfo->XIEbytes_in_buffer; + return(XIE_INP); + } else { + cinfo->XIErestart = XIE_RNUL; + } + } + /* need more data */ + if ((status = ((*cinfo->methods->read_scan_header)(cinfo))) < 0) { + if (status == XIE_ERR) + return(XIE_ERR); + cinfo->XIErestart = XIE_RRSH; + cinfo->next_input_byte = cinfo->XIEnext_input_byte; + cinfo->bytes_in_buffer = cinfo->XIEbytes_in_buffer; + return(XIE_INP); + } + cinfo->XIErestart = XIE_RNUL; + + /* Give UI a chance to adjust decompression parameters and select */ + /* output file format based on info from file header. */ + (*cinfo->methods->d_ui_method_selection) (cinfo); + + /* Now select methods for decompression steps. */ + if (initial_setup(cinfo) == XIE_ERR) + return(XIE_ERR); + d_initial_method_selection(cinfo); + + /* Compute dimensions of full-size pixel buffers */ + /* Note these are the same whether interleaved or not. */ + cinfo->rows_in_mem = cinfo->max_v_samp_factor * DCTSIZE; + cinfo->fullsize_width = jround_up(cinfo->image_width, + (long) (cinfo->max_h_samp_factor * DCTSIZE)); + + /* Prepare for single scan containing all components */ + if (cinfo->comps_in_scan == 1) { + noninterleaved_scan_setup(cinfo); + /* Need to read Vk MCU rows to obtain Vk block rows */ + cinfo->mcu_rows_per_loop = cinfo->cur_comp_info[0]->v_samp_factor; + } else { + if (interleaved_scan_setup(cinfo) == XIE_ERR) + return(XIE_ERR); + /* in an interleaved scan, one MCU row provides Vk block rows */ + cinfo->mcu_rows_per_loop = 1; + } + cinfo->total_passes++; + + /* Allocate working memory: */ + /* coeff_data holds a single MCU row of coefficient blocks */ + cinfo->coeff_data = alloc_MCU_row(cinfo); + if (cinfo->coeff_data == (JBLOCKIMAGE) NULL) + return(XIE_ERR); + /* sampled_data is sample data before upsampling */ + if (alloc_sampling_buffer(cinfo, cinfo->sampled_data) == XIE_ERR) + return(XIE_ERR); + if (cinfo->XIE_upsample) { + /* fullsize_data is sample data after upsampling */ + cinfo->fullsize_data = alloc_sampimage(cinfo, (int) cinfo->num_components, + (long) cinfo->rows_in_mem, cinfo->fullsize_width); + if (cinfo->fullsize_data == (JSAMPIMAGE) NULL) + return(XIE_ERR); + } + if (prepare_range_limit_table(cinfo) == XIE_ERR) + return(XIE_ERR); + + /* Initialize to read scan data */ + + if (((*cinfo->methods->entropy_decode_init) (cinfo)) == XIE_ERR) + return(XIE_ERR); + if (cinfo->XIE_upsample) + (*cinfo->methods->upsample_init) (cinfo); + (*cinfo->methods->disassemble_init) (cinfo); + + cinfo->pixel_rows_output = 0; + if (cinfo->XIE_upsample) { + cinfo->whichss = 1; /* arrange to start with sampled_data[0] */ + } else { + cinfo->whichss = 0; /* arrange to start with sampled_data[0] */ + } + cinfo->cur_mcu_row = 0; + cinfo->first_mcu_row = TRUE; + return(XIE_NRML); +} /* jdXIE_init */ + + +GLOBAL int +#if NeedFunctionPrototypes +jdXIE_get (decompress_info_ptr cinfo) +#else +jdXIE_get (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +{ + int whichss; + int ri; + int start; + short i; + + if (cinfo->cur_mcu_row < cinfo->MCU_rows_in_scan) { + if (cinfo->XIErestart == XIE_RNUL) { + start = 0; + if (cinfo->XIE_upsample) { + cinfo->whichss ^= 1; /* switch to other downsampled-data buffer */ + } + } else { + start = cinfo->ri; + } + + whichss = cinfo->whichss; /* localize variable */ + + /* Obtain v_samp_factor block rows of each component in the scan. */ + /* This is a single MCU row if interleaved, multiple MCU rows if not. */ + /* In the noninterleaved case there might be fewer than v_samp_factor */ + /* block rows remaining; if so, pad with copies of the last pixel row */ + /* so that upsampling doesn't have to treat it as a special case. */ + + for (ri = start; ri < cinfo->mcu_rows_per_loop; ri++) { + if ((cinfo->cur_mcu_row + ri) < cinfo->MCU_rows_in_scan) { + /* OK to actually read an MCU row. */ + if (((*cinfo->methods->disassemble_MCU) (cinfo, + cinfo->coeff_data)) < 0) { + cinfo->ri = ri; /* save loop position */ + return(XIE_INP); /* need more data */ + } + (*cinfo->methods->reverse_DCT) (cinfo, cinfo->coeff_data, + cinfo->sampled_data[whichss], + ri * DCTSIZE); + } else { + /* Need to pad out with copies of the last downsampled row. */ + /* This can only happen if there is just one component. */ + duplicate_row(cinfo->sampled_data[whichss][0], + cinfo->cur_comp_info[0]->downsampled_width, + ri * DCTSIZE - 1, DCTSIZE); + } + } + + if (cinfo->XIE_upsample) { + /* Upsample the data */ + /* First time through is a special case */ + + if (cinfo->first_mcu_row) { + /* Expand first row group with dummy above-context */ + expand(cinfo, cinfo->sampled_data[whichss], + cinfo->fullsize_data, cinfo->fullsize_width, + (short) (-1), (short) 0, (short) 1, + (short) 0); + } else { + /* Expand last row group of previous set */ + expand(cinfo, cinfo->sampled_data[whichss], + cinfo->fullsize_data, cinfo->fullsize_width, + (short) DCTSIZE, (short) (DCTSIZE+1), (short) 0, + (short) (DCTSIZE-1)); + /* and dump the previous set's expanded data */ + jdcopy_pixel_rows (cinfo, cinfo->fullsize_data, cinfo->output_workspace); + /* Expand first row group of this set */ + expand(cinfo, cinfo->sampled_data[whichss], + cinfo->fullsize_data, cinfo->fullsize_width, + (short) (DCTSIZE+1), (short) 0, (short) 1, + (short) 0); + } + + /* Expand second through next-to-last row groups of this set */ + for (i = 1; i <= DCTSIZE-2; i++) { + expand(cinfo, cinfo->sampled_data[whichss], + cinfo->fullsize_data, cinfo->fullsize_width, + (short) (i-1), (short) i, (short) (i+1), + (short) i); + } + + /* Return for all but last row group */ + cinfo->cur_mcu_row += cinfo->mcu_rows_per_loop; + if (cinfo->first_mcu_row) { + cinfo->first_mcu_row = FALSE; + return(XIE_NRML); /* No errors, no output */ + } else { + return(XIE_OUT); /* No errors, output */ + } + + } else { + + /* Do not upsample the data: copy it directly into the output workspace */ + jdcopy_pixel_rows (cinfo, + cinfo->sampled_data[whichss], cinfo->output_workspace); + cinfo->cur_mcu_row += cinfo->mcu_rows_per_loop; + if (cinfo->cur_mcu_row < cinfo->MCU_rows_in_scan) { + return(XIE_OUT); /* No errors, output */ + } else { + return(XIE_EOI); /* No errors, output, end of input */ + } + } + } + + if (cinfo->XIE_upsample) { + /* Expand the last row group with dummy below-context */ + /* Note whichss points to last buffer side used */ + expand(cinfo, cinfo->sampled_data[cinfo->whichss], + cinfo->fullsize_data, cinfo->fullsize_width, + (short) (DCTSIZE-2), (short) (DCTSIZE-1), (short) (-1), + (short) (DCTSIZE-1)); + /* and dump the remaining data (may be less than full height) */ + jdcopy_pixel_rows (cinfo, cinfo->fullsize_data, cinfo->output_workspace); + } + return(XIE_EOI); /* No errors, output, end of input */ +} /* jdXIE_get */ + +#ifndef XIE_SUPPORTED +GLOBAL int +#if NeedFunctionPrototypes +jdXIE_term (decompress_info_ptr cinfo) +#else +jdXIE_term (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +{ + /* Clean up after the scan */ + (*cinfo->methods->disassemble_term) (cinfo); + if (cinfo->XIE_upsample) + (*cinfo->methods->upsample_term) (cinfo); + (*cinfo->methods->entropy_decode_term) (cinfo); + (*cinfo->methods->read_scan_trailer) (cinfo); + cinfo->completed_passes++; + + /* Finish output file, release working storage, etc */ + (*cinfo->methods->output_term) (cinfo); + (*cinfo->methods->read_file_trailer) (cinfo); + + (*cinfo->emethods->d_free_all) (cinfo); + + return(XIE_NRML); +} /* jdXIE_term */ + + +GLOBAL void +#if NeedFunctionPrototypes +jseldXIE (decompress_info_ptr cinfo) +#else +jseldXIE (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +{ + /* NULL function */ +} /* jseldXIE */ +#endif /* XIE_SUPPORTED */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdxief.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdxief.c new file mode 100644 index 0000000..c74f9ab --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jdxief.c @@ -0,0 +1,162 @@ +/* $XConsortium: jdxief.c,v 1.4 94/04/17 20:35:39 rws Exp $ */ +/* Module jdxief.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., October 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +#include "jinclude.h" + +#if NeedFunctionPrototypes +GLOBAL int jdXIE_init(decompress_info_ptr); +GLOBAL int jdXIE_get(decompress_info_ptr); +#ifndef XIE_SUPPORTED +GLOBAL int jdXIE_term(decompress_info_ptr); +GLOBAL void jseldXIE(decompress_info_ptr); +#endif /* XIE_SUPPORTED */ +#endif /* NeedFunctionPrototypes */ + +/**********************************************************************/ + +GLOBAL int +#if NeedFunctionPrototypes +JD_INIT(decompress_info_ptr cinfo, + decompress_methods_ptr dcmethods, external_methods_ptr emethods, + boolean upsample) +#else +JD_INIT(cinfo, dcmethods, emethods, upsample) + decompress_info_ptr cinfo; + decompress_methods_ptr dcmethods; + external_methods_ptr emethods; + boolean upsample; +#endif /* NeedFunctionPrototypes */ +{ + /* Set up links to method structures. */ + cinfo->methods = dcmethods; + cinfo->emethods = emethods; + + /* Set upsample flag */ + cinfo->XIE_upsample = upsample; + + /* Set restart to NULL */ + cinfo->XIErestart = XIE_RNUL; + + return(jdXIE_init(cinfo)); +} + +/**********************************************************************/ + +#ifndef XIE_SUPPORTED +GLOBAL int +#if NeedFunctionPrototypes +JD_BEGINFRAME(decompress_info_ptr cinfo) +#else +JD_BEGINFRAME(cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +{ + (*cinfo->methods->output_init) (cinfo); + + return(XIE_NRML); +} +#endif /* XIE_SUPPORTED */ + +/**********************************************************************/ + +GLOBAL int +#if NeedFunctionPrototypes +JD_PROCESS(decompress_info_ptr cinfo) +#else +JD_PROCESS(cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +{ + return(jdXIE_get(cinfo)); +} + +/**********************************************************************/ + +#ifndef XIE_SUPPORTED +GLOBAL int +#if NeedFunctionPrototypes +JD_ENDFRAME(decompress_info_ptr cinfo) +#else +JD_ENDFRAME(cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +{ + + jdXIE_term(cinfo); + + return(XIE_NRML); +} +#endif /* XIE_SUPPORTED */ + +/**********************************************************************/ diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jelossy.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jelossy.c new file mode 100644 index 0000000..f41d8bf --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jelossy.c @@ -0,0 +1,254 @@ +/* $XConsortium: jelossy.c,v 1.4 94/04/17 20:35:39 rws Exp $ */ +/* Module jelossy.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + + jelossy.c - encode JPEG images, Lossy method + + this contain code for: + + 1) JPEG Lossless, grayscale + 2) JPEG Lossless, color + + Ben Fahy, AGE Logic, Oct 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + + +****************************************************************************/ + +#include "jpeg.h" + +/**********************************************************************/ +encode_jpeg_lossy_gray(state) +JpegEncodeState *state; +{ + return( encode_jpeg_lossy_color(state) ); +} +/**********************************************************************/ +encode_jpeg_lossy_color(state) +JpegEncodeState *state; +{ +int status; /* some compilers may complain, but close examination + ** shows the useage of this variable 'status' to be correct. + */ + +/* our output buffer is guaranteed to be clean on entry. */ +/* (every time we write data below, we return to flush it) */ + + state->flush_output = 0; + state->nl_coded = 0; + + while(1) { /* loop forever (we're a state machine) */ + + switch( state->goal) { + case JPEG_ENCODE_GOAL_Startup: + state->goal = JPEG_ENCODE_GOAL_TryToBeginFrame; + +/*** Write out the beginning frame information ***/ + case JPEG_ENCODE_GOAL_TryToBeginFrame: + + state->cinfo->bytes_in_buffer = 0; + /* initialize buffer to empty */ + + status = JC_BEGINFRAME(state->cinfo, + state->n_bands, + state->width, + state->height, + state->Qtable, + state->lenQtable, + state->ACtable, + state->lenACtable, + state->DCtable, + state->lenDCtable, + state->h_sample, + state->v_sample); + + if (status == XIE_ERR) { + state->error_code = JPEG_ENCODE_ERROR_CouldNotBeginFrame; + return(-1); + } + if (status == XIE_NRML) { + state->goal = JPEG_ENCODE_GOAL_BeginFrameDone; + break; + } + if (status == XIE_OUT) { + state->goal = JPEG_ENCODE_GOAL_WriteHdrData; + break; + } + /* hey! we aren't supposed to be here */ + state->error_code = JPEG_ENCODE_ERROR_BadBeginFrameRetCode; + return(-1); + break; + + case JPEG_ENCODE_GOAL_WriteHdrData: + return(-1); + break; + + case JPEG_ENCODE_GOAL_BeginFrameDone: + state->goal = JPEG_ENCODE_GOAL_ProcessData; + state->needs_input_strip = 1; + state->flush_output = state->cinfo->bytes_in_buffer; + return(0); + break; + + case JPEG_ENCODE_GOAL_ProcessData: + if (state->n_bands == 3) + state->goal = JPEG_ENCODE_GOAL_EncodeRGB; + else + state->goal = JPEG_ENCODE_GOAL_EncodeGray; + break; + + case JPEG_ENCODE_GOAL_EncodeGray: + if (state->nl_tocode <= 0) { + state->flush_output = state->cinfo->bytes_in_buffer; + return(state->nl_coded); + } + status = JC_SCANLINE_GRAY(state->cinfo, + &state->i_line, /* global line # */ + state->i_lines[0][state->nl_coded]); /* gray data line */ + + /* keep track of how many lines in strip we've given encoder */ + state->nl_coded++; + state->i_line++; + state->nl_tocode--; + state->goal = JPEG_ENCODE_GOAL_CheckStatus; + break; + + case JPEG_ENCODE_GOAL_EncodeRGB: + if (state->nl_tocode <= 0) { + state->flush_output = state->cinfo->bytes_in_buffer; + return(state->nl_coded); + } + status = JC_SCANLINE_RGB(state->cinfo, + &state->i_line, /* global line # */ + state->i_lines[0][state->nl_coded], /* red data line */ + state->i_lines[1][state->nl_coded], /* green data line */ + state->i_lines[2][state->nl_coded]); /* blue data line */ + + /* keep track of how many lines in strip we've given encoder */ + state->nl_coded++; + state->i_line++; + state->nl_tocode--; + + case JPEG_ENCODE_GOAL_CheckStatus: + if (status == XIE_OUT) { + state->flush_output = state->cinfo->bytes_in_buffer; + return(state->nl_coded); + break; + } + if (status == XIE_NRML) { + state->goal = JPEG_ENCODE_GOAL_ProcessData; + if (state->flush_output = state->cinfo->bytes_in_buffer) + return(state->nl_coded); + + break; + } + + if (status == XIE_ERR) { + state->error_code = JPEG_ENCODE_ERROR_EncodeError; + return(-1); + } + else { + /* unexpected return status */ + state->error_code = JPEG_ENCODE_ERROR_EncoderIsFreakingOut; + return(-1); + } + break; + + case JPEG_ENCODE_GOAL_EndFrame: + status = JC_ENDFRAME(state->cinfo); + + if (state->flush_output = state->cinfo->bytes_in_buffer) { + if (status == XIE_NRML) + state->goal = JPEG_ENCODE_GOAL_Done; + + return(state->nl_coded); + } + else if (status == XIE_NRML) { + state->goal = JPEG_ENCODE_GOAL_Done; + state->flush_output = state->cinfo->bytes_in_buffer; + return(state->nl_coded); + } + else if (status == XIE_ERR) { + state->error_code = JPEG_ENCODE_ERROR_EndFrameError; + return(-1); + } + else { + /* unexpected return status */ + state->error_code = JPEG_ENCODE_ERROR_EndFrameFreakOut; + return(-1); + } + break; + + default: + state->error_code = JPEG_ENCODE_ERROR_BadGoal; + return(-1); + } + } +} +/**********************************************************************/ diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jfwddct.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jfwddct.c new file mode 100644 index 0000000..74cd2b4 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jfwddct.c @@ -0,0 +1,381 @@ +/* $XConsortium: jfwddct.c,v 1.4 94/04/17 20:35:40 rws Exp $ */ +/* Module jfwddct.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., October 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +/* + * jfwddct.c + * + * Copyright (C) 1991, 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the basic DCT (Discrete Cosine Transform) + * transformation subroutine. + * + * This implementation is based on an algorithm described in + * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT + * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, + * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. + * The primary algorithm described there uses 11 multiplies and 29 adds. + * We use their alternate method with 12 multiplies and 32 adds. + * The advantage of this method is that no data path contains more than one + * multiplication; this allows a very simple and accurate implementation in + * scaled fixed-point arithmetic, with a minimal number of shifts. + */ + +#include "jinclude.h" + +/* + * This routine is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* + * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT + * on each column. Direct algorithms are also available, but they are + * much more complex and seem not to be any faster when reduced to code. + * + * The poop on this scaling stuff is as follows: + * + * Each 1-D DCT step produces outputs which are a factor of sqrt(N) + * larger than the true DCT outputs. The final outputs are therefore + * a factor of N larger than desired; since N=8 this can be cured by + * a simple right shift at the end of the algorithm. The advantage of + * this arrangement is that we save two multiplications per 1-D DCT, + * because the y0 and y4 outputs need not be divided by sqrt(N). + * + * We have to do addition and subtraction of the integer inputs, which + * is no problem, and multiplication by fractional constants, which is + * a problem to do in integer arithmetic. We multiply all the constants + * by CONST_SCALE and convert them to integer constants (thus retaining + * CONST_BITS bits of precision in the constants). After doing a + * multiplication we have to divide the product by CONST_SCALE, with proper + * rounding, to produce the correct output. This division can be done + * cheaply as a right shift of CONST_BITS bits. We postpone shifting + * as long as possible so that partial sums can be added together with + * full fractional precision. + * + * The outputs of the first pass are scaled up by PASS1_BITS bits so that + * they are represented to better-than-integral precision. These outputs + * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word + * with the recommended scaling. (To scale up 12-bit sample data, an + * intermediate INT32 array would be needed.) + * + * To avoid overflow of the 32-bit intermediate results in pass 2, we must + * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 25. Error analysis + * shows that the values given below are the most effective. + */ + +#ifdef EIGHT_BIT_SAMPLES +#define CONST_BITS 13 +#define PASS1_BITS 2 +#else +#define CONST_BITS 13 +#define PASS1_BITS 0 /* lose a little precision to avoid overflow */ +#endif + +#define ONE ((INT32) 1) + +#define CONST_SCALE (ONE << CONST_BITS) + +/* Convert a positive real constant to an integer scaled by CONST_SCALE. */ + +#define FIX(x) ((INT32) ((x) * CONST_SCALE + 0.5)) + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 13 +#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */ +#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */ +#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */ +#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ +#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ +#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */ +#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */ +#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ +#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */ +#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */ +#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ +#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */ +#else +#define FIX_0_298631336 FIX(0.298631336) +#define FIX_0_390180644 FIX(0.390180644) +#define FIX_0_541196100 FIX(0.541196100) +#define FIX_0_765366865 FIX(0.765366865) +#define FIX_0_899976223 FIX(0.899976223) +#define FIX_1_175875602 FIX(1.175875602) +#define FIX_1_501321110 FIX(1.501321110) +#define FIX_1_847759065 FIX(1.847759065) +#define FIX_1_961570560 FIX(1.961570560) +#define FIX_2_053119869 FIX(2.053119869) +#define FIX_2_562915447 FIX(2.562915447) +#define FIX_3_072711026 FIX(3.072711026) +#endif + + +/* Descale and correctly round an INT32 value that's scaled by N bits. + * We assume RIGHT_SHIFT rounds towards minus infinity, so adding + * the fudge factor is correct for either sign of X. + */ + +#define DESCALE(x,n) RIGHT_SHIFT((x) + (ONE << ((n)-1)), n) + +/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. + * For 8-bit samples with the recommended scaling, all the variable + * and constant values involved are no more than 16 bits wide, so a + * 16x16->32 bit multiply can be used instead of a full 32x32 multiply; + * this provides a useful speedup on many machines. + * There is no way to specify a 16x16->32 multiply in portable C, but + * some C compilers will do the right thing if you provide the correct + * combination of casts. + * NB: for 12-bit samples, a full 32-bit multiplication will be needed. + */ + +#ifdef EIGHT_BIT_SAMPLES +#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */ +#define MULTIPLY(var,const) (((INT16) (var)) * ((INT16) (const))) +#endif +#ifdef SHORTxLCONST_32 /* known to work with Microsoft C 6.0 */ +#define MULTIPLY(var,const) (((INT16) (var)) * ((INT32) (const))) +#endif +#endif + +#ifndef MULTIPLY /* default definition */ +#define MULTIPLY(var,const) ((var) * (const)) +#endif + + +/* + * Perform the forward DCT on one block of samples. + */ + +GLOBAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +j_fwd_dct (DCTBLOCK data) +#else +j_fwd_dct (data) + DCTBLOCK data; +#endif /* NeedFunctionPrototypes */ +#else +j_fwd_dct (DCTBLOCK data) +#endif /* XIE_SUPPORTED */ +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3, z4, z5; + register DCTELEM *dataptr; + int rowctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + dataptr = data; + for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--) { + tmp0 = dataptr[0] + dataptr[7]; + tmp7 = dataptr[0] - dataptr[7]; + tmp1 = dataptr[1] + dataptr[6]; + tmp6 = dataptr[1] - dataptr[6]; + tmp2 = dataptr[2] + dataptr[5]; + tmp5 = dataptr[2] - dataptr[5]; + tmp3 = dataptr[3] + dataptr[4]; + tmp4 = dataptr[3] - dataptr[4]; + + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS); + dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865), + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065), + CONST_BITS-PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * cK represents cos(K*pi/16). + * i0..i3 in the paper are tmp4..tmp7 here. + */ + + z1 = tmp4 + tmp7; + z2 = tmp5 + tmp6; + z3 = tmp4 + tmp6; + z4 = tmp5 + tmp7; + z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ + + tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS); + dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. */ + /* Note that we must descale the results by a factor of 8 == 2**3, */ + /* and also undo the PASS1_BITS scaling. */ + + dataptr = data; + for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--) { + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS+3); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS+3); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865), + CONST_BITS+PASS1_BITS+3); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065), + CONST_BITS+PASS1_BITS+3); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * cK represents cos(K*pi/16). + * i0..i3 in the paper are tmp4..tmp7 here. + */ + + z1 = tmp4 + tmp7; + z2 = tmp5 + tmp6; + z3 = tmp4 + tmp6; + z4 = tmp5 + tmp7; + z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ + + tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, + CONST_BITS+PASS1_BITS+3); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, + CONST_BITS+PASS1_BITS+3); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, + CONST_BITS+PASS1_BITS+3); + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, + CONST_BITS+PASS1_BITS+3); + + dataptr++; /* advance pointer to next column */ + } +} diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jinclude.h b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jinclude.h new file mode 100644 index 0000000..f6bf5fe --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jinclude.h @@ -0,0 +1,200 @@ +/* $XConsortium: jinclude.h,v 1.6 94/04/17 20:35:40 rws Exp $ */ +/* Module jinclude.h */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., October 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +/* + * jinclude.h + * + * Copyright (C) 1991, 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This is the central file that's #include'd by all the JPEG .c files. + * Its purpose is to provide a single place to fix any problems with + * including the wrong system include files. + * You can edit these declarations if you use a system with nonstandard + * system include files. + */ + +#ifndef NO_XIE + +#define _XIEC_MEMORY /* for XieMalloc and XieFree, used in jmemsys.c */ +#define XIE_SUPPORTED +#include +#include +#include "misc.h" /* for pointer ;*/ + +#ifndef X_NOT_STDC_ENV +#define INCLUDES_ARE_ANSI +#endif + + +#undef SIZEOF /* in case you included X11/xmd.h */ +#define SIZEOF(object) ((size_t) sizeof(object)) +#define MEMZERO(target,size) memset((void *)(target), 0, (size_t)(size)) +#define MEMCOPY(dest,src,size) memcpy((void *)(dest), (const void *)(src), (size_t)(size)) + +#else + +/* + * Normally the __STDC__ macro can be taken as indicating that the system + * include files conform to the ANSI C standard. However, if you are running + * GCC on a machine with non-ANSI system include files, that is not the case. + * In that case change the following, or add -DNONANSI_INCLUDES to your CFLAGS. + */ + +#ifdef __STDC__ +#ifndef NONANSI_INCLUDES +#define INCLUDES_ARE_ANSI /* this is what's tested before including */ +#endif +#endif + +/* + * is included to get the FILE typedef and NULL macro. + * Note that the core portable-JPEG files do not actually do any I/O + * using the stdio library; only the user interface, error handler, + * and file reading/writing modules invoke any stdio functions. + * (Well, we did cheat a bit in jmemmgr.c, but only if MEM_STATS is defined.) + */ + +#include + +/* + * We need the size_t typedef, which defines the parameter type of malloc(). + * In an ANSI-conforming implementation this is provided by , + * but on non-ANSI systems it's more likely to be in . + * On some not-quite-ANSI systems you may find it in . + */ + +#ifndef INCLUDES_ARE_ANSI /* shouldn't need this if ANSI C */ +#include +#endif +#ifdef __SASC /* Amiga SAS C provides it in stddef.h. */ +#include +#endif + +/* + * In ANSI C, and indeed any rational implementation, size_t is also the + * type returned by sizeof(). However, it seems there are some irrational + * implementations out there, in which sizeof() returns an int even though + * size_t is defined as long or unsigned long. To ensure consistent results + * we always use this SIZEOF() macro in place of using sizeof() directly. + */ + +#undef SIZEOF /* in case you included X11/xmd.h */ +#define SIZEOF(object) ((size_t) sizeof(object)) + +/* + * fread() and fwrite() are always invoked through these macros. + * On some systems you may need to twiddle the argument casts. + * CAUTION: argument order is different from underlying functions! + */ + +#define JFREAD(file,buf,sizeofbuf) \ + ((size_t) fread((void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file))) +#define JFWRITE(file,buf,sizeofbuf) \ + ((size_t) fwrite((const void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file))) + +/* + * We need the memcpy() and strcmp() functions, plus memory zeroing. + * ANSI and System V implementations declare these in . + * BSD doesn't have the mem() functions, but it does have bcopy()/bzero(). + * Some systems may declare memset and memcpy in . + * + * NOTE: we assume the size parameters to these functions are of type size_t. + * Change the casts in these macros if not! + */ + +#ifdef INCLUDES_ARE_ANSI +#include +#define MEMZERO(target,size) memset((void *)(target), 0, (size_t)(size)) +#define MEMCOPY(dest,src,size) memcpy((void *)(dest), (const void *)(src), (size_t)(size)) +#else /* not ANSI */ +#ifdef BSD +#include +#define MEMZERO(target,size) bzero((void *)(target), (size_t)(size)) +#define MEMCOPY(dest,src,size) bcopy((const void *)(src), (void *)(dest), (size_t)(size)) +#else /* not BSD, assume Sys V or compatible */ +#include +#define MEMZERO(target,size) memset((void *)(target), 0, (size_t)(size)) +#define MEMCOPY(dest,src,size) memcpy((void *)(dest), (const void *)(src), (size_t)(size)) +#endif /* BSD */ +#endif /* ANSI */ + +#endif /* XIE */ + +/* Now include the portable JPEG definition files. */ + +#include "jconfig.h" + +#include "jpegdata.h" diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jmemmgr.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jmemmgr.c new file mode 100644 index 0000000..3f31874 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jmemmgr.c @@ -0,0 +1,1689 @@ +/* $XConsortium: jmemmgr.c,v 1.4 94/04/17 20:35:41 rws Exp $ */ +/* Module jmemmgr.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., October 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +/* + * jmemmgr.c + * + * Copyright (C) 1991, 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file provides the standard system-independent memory management + * routines. This code is usable across a wide variety of machines; most + * of the system dependencies have been isolated in a separate file. + * The major functions provided here are: + * * bookkeeping to allow all allocated memory to be freed upon exit; + * * policy decisions about how to divide available memory among the + * various large arrays; + * * control logic for swapping virtual arrays between main memory and + * backing storage. + * The separate system-dependent file provides the actual backing-storage + * access code, and it contains the policy decision about how much total + * main memory to use. + * This file is system-dependent in the sense that some of its functions + * are unnecessary in some systems. For example, if there is enough virtual + * memory so that backing storage will never be used, much of the big-array + * control logic could be removed. (Of course, if you have that much memory + * then you shouldn't care about a little bit of unused code...) + * + * These routines are invoked via the methods alloc_small, free_small, + * alloc_medium, free_medium, alloc_small_sarray, free_small_sarray, + * alloc_small_barray, free_small_barray, request_big_sarray, + * request_big_barray, alloc_big_arrays, access_big_sarray, access_big_barray, + * free_big_sarray, free_big_barray, and free_all. + */ + +#define AM_MEMORY_MANAGER /* we define big_Xarray_control structs */ + +#include "jinclude.h" +#include "jmemsys.h" /* import the system-dependent declarations */ + +#ifndef XIE_SUPPORTED +#ifndef NO_GETENV +#ifdef INCLUDES_ARE_ANSI +#include /* to declare getenv() */ +#else +extern char * getenv PP((const char * name)); +#endif +#endif +#endif /* XIE_SUPPORTED */ + + +/* + * On many systems it is not necessary to distinguish alloc_small from + * alloc_medium; the main case where they must be distinguished is when + * FAR pointers are distinct from regular pointers. However, you might + * want to keep them separate if you have different system-dependent logic + * for small and large memory requests (i.e., jget_small and jget_large + * do different things). + */ + +#ifdef NEED_FAR_POINTERS +#define NEED_ALLOC_MEDIUM /* flags alloc_medium really exists */ +#endif + + +#ifndef XIE_SUPPORTED +/* + * Many machines require storage alignment: longs must start on 4-byte + * boundaries, doubles on 8-byte boundaries, etc. On such machines, malloc() + * always returns pointers that are multiples of the worst-case alignment + * requirement, and we had better do so too. This means the headers that + * we tack onto allocated structures had better have length a multiple of + * the alignment requirement. + * There isn't any really portable way to determine the worst-case alignment + * requirement. In this code we assume that the alignment requirement is + * multiples of sizeof(align_type). Here we define align_type as double; + * with this definition, the code will run on all machines known to me. + * If your machine has lesser alignment needs, you can save a few bytes + * by making align_type smaller. + */ + +typedef double align_type; + + +/* + * Some important notes: + * The allocation routines provided here must never return NULL. + * They should exit to error_exit if unsuccessful. + * + * It's not a good idea to try to merge the sarray and barray routines, + * even though they are textually almost the same, because samples are + * usually stored as bytes while coefficients are shorts. Thus, in machines + * where byte pointers have a different representation from word pointers, + * the resulting machine code could not be the same. + */ + + +static external_methods_ptr methods; /* saved for access to error_exit */ + + +#ifdef MEM_STATS /* optional extra stuff for statistics */ + +/* These macros are the assumed overhead per block for malloc(). + * They don't have to be accurate, but the printed statistics will be + * off a little bit if they are not. + */ +#define MALLOC_OVERHEAD (SIZEOF(pointer )) /* overhead for jget_small() */ +#define MALLOC_FAR_OVERHEAD (SIZEOF(pointer)) /* for jget_large() */ + +static long total_num_small = 0; /* total # of small objects alloced */ +static long total_bytes_small = 0; /* total bytes requested */ +static long cur_num_small = 0; /* # currently alloced */ +static long max_num_small = 0; /* max simultaneously alloced */ + +#ifdef NEED_ALLOC_MEDIUM +static long total_num_medium = 0; /* total # of medium objects alloced */ +static long total_bytes_medium = 0; /* total bytes requested */ +static long cur_num_medium = 0; /* # currently alloced */ +static long max_num_medium = 0; /* max simultaneously alloced */ +#endif + +static long total_num_sarray = 0; /* total # of sarray objects alloced */ +static long total_bytes_sarray = 0; /* total bytes requested */ +static long cur_num_sarray = 0; /* # currently alloced */ +static long max_num_sarray = 0; /* max simultaneously alloced */ + +static long total_num_barray = 0; /* total # of barray objects alloced */ +static long total_bytes_barray = 0; /* total bytes requested */ +static long cur_num_barray = 0; /* # currently alloced */ +static long max_num_barray = 0; /* max simultaneously alloced */ + +LOCAL void +print_mem_stats (void) +{ + /* since this is only a debugging stub, we can cheat a little on the + * trace message mechanism... helpful 'cuz trace_message can't handle longs. + */ + fprintf(stderr, "total_num_small = %ld\n", total_num_small); + fprintf(stderr, "total_bytes_small = %ld\n", total_bytes_small); + if (cur_num_small) + fprintf(stderr, "cur_num_small = %ld\n", cur_num_small); + fprintf(stderr, "max_num_small = %ld\n", max_num_small); + +#ifdef NEED_ALLOC_MEDIUM + fprintf(stderr, "total_num_medium = %ld\n", total_num_medium); + fprintf(stderr, "total_bytes_medium = %ld\n", total_bytes_medium); + if (cur_num_medium) + fprintf(stderr, "cur_num_medium = %ld\n", cur_num_medium); + fprintf(stderr, "max_num_medium = %ld\n", max_num_medium); +#endif + + fprintf(stderr, "total_num_sarray = %ld\n", total_num_sarray); + fprintf(stderr, "total_bytes_sarray = %ld\n", total_bytes_sarray); + if (cur_num_sarray) + fprintf(stderr, "cur_num_sarray = %ld\n", cur_num_sarray); + fprintf(stderr, "max_num_sarray = %ld\n", max_num_sarray); + + fprintf(stderr, "total_num_barray = %ld\n", total_num_barray); + fprintf(stderr, "total_bytes_barray = %ld\n", total_bytes_barray); + if (cur_num_barray) + fprintf(stderr, "cur_num_barray = %ld\n", cur_num_barray); + fprintf(stderr, "max_num_barray = %ld\n", max_num_barray); +} + +#endif /* MEM_STATS */ + + +LOCAL void +out_of_memory (int which) +/* Report an out-of-memory error and stop execution */ +/* If we compiled MEM_STATS support, report alloc requests before dying */ +{ +#ifdef MEM_STATS + if (methods->trace_level <= 0) /* don't do it if free_all() will */ + print_mem_stats(); /* print optional memory usage statistics */ +#endif + ERREXIT1(methods, "Insufficient memory (case %d)", which); +} +#endif /* XIE_SUPPORTED */ + + +/* + * Management of "small" objects. + * These are all-in-memory, and are in near-heap space on an 80x86. + */ + + +#ifdef XIE_SUPPORTED +METHODDEF pointer +#if NeedFunctionPrototypes +c_alloc_small (compress_info_ptr cinfo, size_t sizeofobject) +#else +c_alloc_small (cinfo, sizeofobject) + compress_info_ptr cinfo; + size_t sizeofobject; +#endif /* NeedFunctionPrototypes */ +/* Allocate a "small" object */ +{ + small_ptr result; + + sizeofobject += SIZEOF(small_hdr); /* add space for header */ + + result = (small_ptr) jget_small(sizeofobject); + if (result == NULL) + return (pointer ) result; + + result->next = cinfo->small_list; + cinfo->small_list = result; + result++; /* advance past header */ + + return (pointer ) result; +} + +METHODDEF pointer +#if NeedFunctionPrototypes +d_alloc_small (decompress_info_ptr cinfo, size_t sizeofobject) +#else +d_alloc_small (cinfo, sizeofobject) + decompress_info_ptr cinfo; + size_t sizeofobject; +#endif /* NeedFunctionPrototypes */ +/* Allocate a "small" object */ +{ + small_ptr result; + + sizeofobject += SIZEOF(small_hdr); /* add space for header */ + + result = (small_ptr) jget_small(sizeofobject); + if (result == NULL) + return (pointer ) result; + + result->next = cinfo->small_list; + cinfo->small_list = result; + result++; /* advance past header */ + + return (pointer ) result; +} + +#else +typedef union small_struct * small_ptr; + +typedef union small_struct { + small_ptr next; /* next in list of allocated objects */ + align_type dummy; /* ensures alignment of following storage */ + } small_hdr; + +static small_ptr small_list; /* head of list */ + +METHODDEF pointer +alloc_small (size_t sizeofobject) +/* Allocate a "small" object */ +{ + small_ptr result; + + sizeofobject += SIZEOF(small_hdr); /* add space for header */ + +#ifdef MEM_STATS + total_num_small++; + total_bytes_small += sizeofobject + MALLOC_OVERHEAD; + cur_num_small++; + if (cur_num_small > max_num_small) max_num_small = cur_num_small; +#endif + + result = (small_ptr) jget_small(sizeofobject); + if (result == NULL) + out_of_memory(1); + + result->next = small_list; + small_list = result; + result++; /* advance past header */ + + return (pointer ) result; +} +#endif /* XIE_SUPPORTED */ + +#ifdef XIE_SUPPORTED +METHODDEF int +#if NeedFunctionPrototypes +c_free_small (compress_info_ptr cinfo, pointer ptr) +#else +c_free_small (cinfo, ptr) + compress_info_ptr cinfo; + pointer ptr; +#endif /* NeedFunctionPrototypes */ +/* Free a "small" object */ +{ + small_ptr hdr; + small_ptr * llink; + + hdr = (small_ptr) ptr; + hdr--; /* point back to header */ + + /* Remove item from list -- linear search is fast enough */ + llink = &cinfo->small_list; + while (*llink != hdr) { + if (*llink == NULL) + return(XIE_ERR); + llink = &( (*llink)->next ); + } + *llink = hdr->next; + + jfree_small((pointer ) hdr); + return(0); +} + +METHODDEF int +#if NeedFunctionPrototypes +d_free_small (decompress_info_ptr cinfo, pointer ptr) +#else +d_free_small (cinfo, ptr) + decompress_info_ptr cinfo; + pointer ptr; +#endif /* NeedFunctionPrototypes */ +/* Free a "small" object */ +{ + small_ptr hdr; + small_ptr * llink; + + hdr = (small_ptr) ptr; + hdr--; /* point back to header */ + + /* Remove item from list -- linear search is fast enough */ + llink = &cinfo->small_list; + while (*llink != hdr) { + if (*llink == NULL) + return(XIE_ERR); + llink = &( (*llink)->next ); + } + *llink = hdr->next; + + jfree_small((pointer ) hdr); + return(0); +} +#else +METHODDEF void +free_small (pointer ptr) +/* Free a "small" object */ +{ + small_ptr hdr; + small_ptr * llink; + + hdr = (small_ptr) ptr; + hdr--; /* point back to header */ + + /* Remove item from list -- linear search is fast enough */ + llink = &small_list; + while (*llink != hdr) { + if (*llink == NULL) + ERREXIT(methods, "Bogus free_small request"); + llink = &( (*llink)->next ); + } + *llink = hdr->next; + + jfree_small((pointer ) hdr); + +#ifdef MEM_STATS + cur_num_small--; +#endif +} +#endif /* XIE_SUPPORTED */ + + +/* + * Management of "medium-size" objects. + * These are just like small objects except they are in the FAR heap. + */ + +#ifndef XIE_SUPPORTED +#ifdef NEED_ALLOC_MEDIUM + +typedef union medium_struct FAR * medium_ptr; + +typedef union medium_struct { + medium_ptr next; /* next in list of allocated objects */ + align_type dummy; /* ensures alignment of following storage */ + } medium_hdr; + +static medium_ptr medium_list; /* head of list */ + + +METHODDEF pointer +alloc_medium (size_t sizeofobject) +/* Allocate a "medium-size" object */ +{ + medium_ptr result; + + sizeofobject += SIZEOF(medium_hdr); /* add space for header */ + +#ifdef MEM_STATS + total_num_medium++; + total_bytes_medium += sizeofobject + MALLOC_FAR_OVERHEAD; + cur_num_medium++; + if (cur_num_medium > max_num_medium) max_num_medium = cur_num_medium; +#endif + + result = (medium_ptr) jget_large(sizeofobject); + if (result == NULL) + out_of_memory(2); + + result->next = medium_list; + medium_list = result; + result++; /* advance past header */ + + return (pointer) result; +} + + +METHODDEF void +free_medium (pointer ptr) +/* Free a "medium-size" object */ +{ + medium_ptr hdr; + medium_ptr FAR * llink; + + hdr = (medium_ptr) ptr; + hdr--; /* point back to header */ + + /* Remove item from list -- linear search is fast enough */ + llink = &medium_list; + while (*llink != hdr) { + if (*llink == NULL) + ERREXIT(methods, "Bogus free_medium request"); + llink = &( (*llink)->next ); + } + *llink = hdr->next; + + jfree_large((pointer) hdr); + +#ifdef MEM_STATS + cur_num_medium--; +#endif +} + +#endif /* NEED_ALLOC_MEDIUM */ +#endif /* XIE_SUPPORTED */ + + +/* + * Management of "small" (all-in-memory) 2-D sample arrays. + * The pointers are in near heap, the samples themselves in FAR heap. + * The header structure is adjacent to the row pointers. + * To minimize allocation overhead and to allow I/O of large contiguous + * blocks, we allocate the sample rows in groups of as many rows as possible + * without exceeding MAX_ALLOC_CHUNK total bytes per allocation request. + * Note that the big-array control routines, later in this file, know about + * this chunking of rows ... and also how to get the rowsperchunk value! + */ + + +#ifdef XIE_SUPPORTED +METHODDEF JSAMPARRAY +#if NeedFunctionPrototypes +c_alloc_small_sarray (compress_info_ptr cinfo, + long samplesperrow, long numrows) +#else +c_alloc_small_sarray (cinfo, samplesperrow, numrows) + compress_info_ptr cinfo; + long samplesperrow; + long numrows; +#endif /* NeedFunctionPrototypes */ +/* Allocate a "small" (all-in-memory) 2-D sample array */ +{ + small_sarray_ptr hdr; + JSAMPARRAY result; + JSAMPROW workspace; + long rowsperchunk, currow, i; + + /* Calculate max # of rows allowed in one allocation chunk */ + rowsperchunk = MAX_ALLOC_CHUNK / (samplesperrow * SIZEOF(JSAMPLE)); + if (rowsperchunk <= 0) + return (JSAMPARRAY) NULL; + + /* Get space for header and row pointers; this is always "near" on 80x86 */ + hdr = (small_sarray_ptr) c_alloc_small(cinfo, + (size_t) (numrows * SIZEOF(JSAMPROW) + SIZEOF(small_sarray_hdr))); + + result = (JSAMPARRAY) (hdr+1); /* advance past header */ + + /* Insert into list now so free_all does right thing if I fail */ + /* after allocating only some of the rows... */ + hdr->next = cinfo->small_sarray_list; + hdr->numrows = 0; + hdr->rowsperchunk = rowsperchunk; + cinfo->small_sarray_list = hdr; + + /* Get the rows themselves; on 80x86 these are "far" */ + currow = 0; + while (currow < numrows) { + rowsperchunk = MIN(rowsperchunk, numrows - currow); + workspace = (JSAMPROW) jget_large((size_t) (rowsperchunk * samplesperrow + * SIZEOF(JSAMPLE))); + if (workspace == NULL) + return (JSAMPARRAY) workspace; + for (i = rowsperchunk; i > 0; i--) { + result[currow++] = workspace; + workspace += samplesperrow; + } + hdr->numrows = currow; + } + + return result; +} + +METHODDEF JSAMPARRAY +#if NeedFunctionPrototypes +d_alloc_small_sarray (decompress_info_ptr cinfo, + long samplesperrow, long numrows) +#else +d_alloc_small_sarray (cinfo, samplesperrow, numrows) + decompress_info_ptr cinfo; + long samplesperrow; + long numrows; +#endif /* NeedFunctionPrototypes */ +/* Allocate a "small" (all-in-memory) 2-D sample array */ +{ + small_sarray_ptr hdr; + JSAMPARRAY result; + JSAMPROW workspace; + long rowsperchunk, currow, i; + + /* Calculate max # of rows allowed in one allocation chunk */ + rowsperchunk = MAX_ALLOC_CHUNK / (samplesperrow * SIZEOF(JSAMPLE)); + if (rowsperchunk <= 0) + return (JSAMPARRAY) NULL; + + /* Get space for header and row pointers; this is always "near" on 80x86 */ + hdr = (small_sarray_ptr) d_alloc_small(cinfo, + (size_t) (numrows * SIZEOF(JSAMPROW) + SIZEOF(small_sarray_hdr))); + + result = (JSAMPARRAY) (hdr+1); /* advance past header */ + + /* Insert into list now so free_all does right thing if I fail */ + /* after allocating only some of the rows... */ + hdr->next = cinfo->small_sarray_list; + hdr->numrows = 0; + hdr->rowsperchunk = rowsperchunk; + cinfo->small_sarray_list = hdr; + + /* Get the rows themselves; on 80x86 these are "far" */ + currow = 0; + while (currow < numrows) { + rowsperchunk = MIN(rowsperchunk, numrows - currow); + workspace = (JSAMPROW) jget_large((size_t) (rowsperchunk * samplesperrow + * SIZEOF(JSAMPLE))); + if (workspace == NULL) + return (JSAMPARRAY) workspace; + for (i = rowsperchunk; i > 0; i--) { + result[currow++] = workspace; + workspace += samplesperrow; + } + hdr->numrows = currow; + } + + return result; +} +#else +typedef struct small_sarray_struct * small_sarray_ptr; + +typedef struct small_sarray_struct { + small_sarray_ptr next; /* next in list of allocated sarrays */ + long numrows; /* # of rows in this array */ + long rowsperchunk; /* max # of rows per allocation chunk */ + JSAMPROW dummy; /* ensures alignment of following storage */ + } small_sarray_hdr; + +static small_sarray_ptr small_sarray_list; /* head of list */ + +METHODDEF JSAMPARRAY +alloc_small_sarray (long samplesperrow, long numrows) +/* Allocate a "small" (all-in-memory) 2-D sample array */ +{ + small_sarray_ptr hdr; + JSAMPARRAY result; + JSAMPROW workspace; + long rowsperchunk, currow, i; + +#ifdef MEM_STATS + total_num_sarray++; + cur_num_sarray++; + if (cur_num_sarray > max_num_sarray) max_num_sarray = cur_num_sarray; +#endif + + /* Calculate max # of rows allowed in one allocation chunk */ + rowsperchunk = MAX_ALLOC_CHUNK / (samplesperrow * SIZEOF(JSAMPLE)); + if (rowsperchunk <= 0) + ERREXIT(methods, "Image too wide for this implementation"); + + /* Get space for header and row pointers; this is always "near" on 80x86 */ + hdr = (small_sarray_ptr) alloc_small((size_t) (numrows * SIZEOF(JSAMPROW) + + SIZEOF(small_sarray_hdr))); + + result = (JSAMPARRAY) (hdr+1); /* advance past header */ + + /* Insert into list now so free_all does right thing if I fail */ + /* after allocating only some of the rows... */ + hdr->next = small_sarray_list; + hdr->numrows = 0; + hdr->rowsperchunk = rowsperchunk; + small_sarray_list = hdr; + + /* Get the rows themselves; on 80x86 these are "far" */ + currow = 0; + while (currow < numrows) { + rowsperchunk = MIN(rowsperchunk, numrows - currow); +#ifdef MEM_STATS + total_bytes_sarray += rowsperchunk * samplesperrow * SIZEOF(JSAMPLE) + + MALLOC_FAR_OVERHEAD; +#endif + workspace = (JSAMPROW) jget_large((size_t) (rowsperchunk * samplesperrow + * SIZEOF(JSAMPLE))); + if (workspace == NULL) + out_of_memory(3); + for (i = rowsperchunk; i > 0; i--) { + result[currow++] = workspace; + workspace += samplesperrow; + } + hdr->numrows = currow; + } + + return result; +} +#endif /* XIE_SUPPORTED */ + + +#ifdef XIE_SUPPORTED +METHODDEF int +#if NeedFunctionPrototypes +c_free_small_sarray (compress_info_ptr cinfo, JSAMPARRAY ptr) +#else +c_free_small_sarray (cinfo, ptr) + compress_info_ptr cinfo; + JSAMPARRAY ptr; +#endif /* NeedFunctionPrototypes */ +/* Free a "small" (all-in-memory) 2-D sample array */ +{ + small_sarray_ptr hdr; + small_sarray_ptr * llink; + long i; + + hdr = (small_sarray_ptr) ptr; + hdr--; /* point back to header */ + + /* Remove item from list -- linear search is fast enough */ + llink = &cinfo->small_sarray_list; + while (*llink != hdr) { + if (*llink == NULL) + return(XIE_ERR); + llink = &( (*llink)->next ); + } + *llink = hdr->next; + + /* Free the rows themselves; on 80x86 these are "far" */ + /* Note we only free the row-group headers! */ + for (i = 0; i < hdr->numrows; i += hdr->rowsperchunk) { + jfree_large((pointer) ptr[i]); + } + + /* Free header and row pointers */ + return(c_free_small(cinfo, (pointer ) hdr)); +} + +METHODDEF int +#if NeedFunctionPrototypes +d_free_small_sarray (decompress_info_ptr cinfo, JSAMPARRAY ptr) +#else +d_free_small_sarray (cinfo, ptr) + decompress_info_ptr cinfo; + JSAMPARRAY ptr; +#endif /* NeedFunctionPrototypes */ +/* Free a "small" (all-in-memory) 2-D sample array */ +{ + small_sarray_ptr hdr; + small_sarray_ptr * llink; + long i; + + hdr = (small_sarray_ptr) ptr; + hdr--; /* point back to header */ + + /* Remove item from list -- linear search is fast enough */ + llink = &cinfo->small_sarray_list; + while (*llink != hdr) { + if (*llink == NULL) + return(XIE_ERR); + llink = &( (*llink)->next ); + } + *llink = hdr->next; + + /* Free the rows themselves; on 80x86 these are "far" */ + /* Note we only free the row-group headers! */ + for (i = 0; i < hdr->numrows; i += hdr->rowsperchunk) { + jfree_large((pointer) ptr[i]); + } + + /* Free header and row pointers */ + return(d_free_small(cinfo, (pointer ) hdr)); +} + +#else +METHODDEF void +free_small_sarray (JSAMPARRAY ptr) +/* Free a "small" (all-in-memory) 2-D sample array */ +{ + small_sarray_ptr hdr; + small_sarray_ptr * llink; + long i; + + hdr = (small_sarray_ptr) ptr; + hdr--; /* point back to header */ + + /* Remove item from list -- linear search is fast enough */ + llink = &small_sarray_list; + while (*llink != hdr) { + if (*llink == NULL) + ERREXIT(methods, "Bogus free_small_sarray request"); + llink = &( (*llink)->next ); + } + *llink = hdr->next; + + /* Free the rows themselves; on 80x86 these are "far" */ + /* Note we only free the row-group headers! */ + for (i = 0; i < hdr->numrows; i += hdr->rowsperchunk) { + jfree_large((pointer) ptr[i]); + } + + /* Free header and row pointers */ + free_small((pointer ) hdr); + +#ifdef MEM_STATS + cur_num_sarray--; +#endif +} + +#endif /* XIE_SUPPORTED */ + +/* + * Management of "small" (all-in-memory) 2-D coefficient-block arrays. + * This is essentially the same as the code for sample arrays, above. + */ + + +#ifdef XIE_SUPPORTED +METHODDEF JBLOCKARRAY +#if NeedFunctionPrototypes +d_alloc_small_barray (decompress_info_ptr cinfo, + long blocksperrow, long numrows) +#else +d_alloc_small_barray (cinfo, blocksperrow, numrows) + decompress_info_ptr cinfo; + long blocksperrow; + long numrows; +#endif /* NeedFunctionPrototypes */ +/* Allocate a "small" (all-in-memory) 2-D coefficient-block array */ +{ + small_barray_ptr hdr; + JBLOCKARRAY result; + JBLOCKROW workspace; + long rowsperchunk, currow, i; + + /* Calculate max # of rows allowed in one allocation chunk */ + rowsperchunk = MAX_ALLOC_CHUNK / (blocksperrow * SIZEOF(JBLOCK)); + if (rowsperchunk <= 0) + return (JBLOCKARRAY) NULL; + + /* Get space for header and row pointers; this is always "near" on 80x86 */ + hdr = (small_barray_ptr) d_alloc_small(cinfo, + (size_t) (numrows * SIZEOF(JBLOCKROW) + SIZEOF(small_barray_hdr))); + + result = (JBLOCKARRAY) (hdr+1); /* advance past header */ + + /* Insert into list now so free_all does right thing if I fail */ + /* after allocating only some of the rows... */ + hdr->next = cinfo->small_barray_list; + hdr->numrows = 0; + hdr->rowsperchunk = rowsperchunk; + cinfo->small_barray_list = hdr; + + /* Get the rows themselves; on 80x86 these are "far" */ + currow = 0; + while (currow < numrows) { + rowsperchunk = MIN(rowsperchunk, numrows - currow); + workspace = (JBLOCKROW) jget_large((size_t) (rowsperchunk * blocksperrow + * SIZEOF(JBLOCK))); + if (workspace == NULL) + return (JBLOCKARRAY) workspace; + for (i = rowsperchunk; i > 0; i--) { + result[currow++] = workspace; + workspace += blocksperrow; + } + hdr->numrows = currow; + } + + return result; +} + +#else +typedef struct small_barray_struct * small_barray_ptr; + +typedef struct small_barray_struct { + small_barray_ptr next; /* next in list of allocated barrays */ + long numrows; /* # of rows in this array */ + long rowsperchunk; /* max # of rows per allocation chunk */ + JBLOCKROW dummy; /* ensures alignment of following storage */ + } small_barray_hdr; + +static small_barray_ptr small_barray_list; /* head of list */ + +METHODDEF JBLOCKARRAY +alloc_small_barray (long blocksperrow, long numrows) +/* Allocate a "small" (all-in-memory) 2-D coefficient-block array */ +{ + small_barray_ptr hdr; + JBLOCKARRAY result; + JBLOCKROW workspace; + long rowsperchunk, currow, i; + +#ifdef MEM_STATS + total_num_barray++; + cur_num_barray++; + if (cur_num_barray > max_num_barray) max_num_barray = cur_num_barray; +#endif + + /* Calculate max # of rows allowed in one allocation chunk */ + rowsperchunk = MAX_ALLOC_CHUNK / (blocksperrow * SIZEOF(JBLOCK)); + if (rowsperchunk <= 0) + ERREXIT(methods, "Image too wide for this implementation"); + + /* Get space for header and row pointers; this is always "near" on 80x86 */ + hdr = (small_barray_ptr) alloc_small((size_t) (numrows * SIZEOF(JBLOCKROW) + + SIZEOF(small_barray_hdr))); + + result = (JBLOCKARRAY) (hdr+1); /* advance past header */ + + /* Insert into list now so free_all does right thing if I fail */ + /* after allocating only some of the rows... */ + hdr->next = small_barray_list; + hdr->numrows = 0; + hdr->rowsperchunk = rowsperchunk; + small_barray_list = hdr; + + /* Get the rows themselves; on 80x86 these are "far" */ + currow = 0; + while (currow < numrows) { + rowsperchunk = MIN(rowsperchunk, numrows - currow); +#ifdef MEM_STATS + total_bytes_barray += rowsperchunk * blocksperrow * SIZEOF(JBLOCK) + + MALLOC_FAR_OVERHEAD; +#endif + workspace = (JBLOCKROW) jget_large((size_t) (rowsperchunk * blocksperrow + * SIZEOF(JBLOCK))); + if (workspace == NULL) + out_of_memory(4); + for (i = rowsperchunk; i > 0; i--) { + result[currow++] = workspace; + workspace += blocksperrow; + } + hdr->numrows = currow; + } + + return result; +} + +#endif /* XIE_SUPPORTED */ + +#ifdef XIE_SUPPORTED +METHODDEF int +#if NeedFunctionPrototypes +d_free_small_barray (decompress_info_ptr cinfo, JBLOCKARRAY ptr) +#else +d_free_small_barray (cinfo, ptr) + decompress_info_ptr cinfo; + JBLOCKARRAY ptr; +#endif /* NeedFunctionPrototypes */ +/* Free a "small" (all-in-memory) 2-D coefficient-block array */ +{ + small_barray_ptr hdr; + small_barray_ptr * llink; + long i; + + hdr = (small_barray_ptr) ptr; + hdr--; /* point back to header */ + + /* Remove item from list -- linear search is fast enough */ + llink = &cinfo->small_barray_list; + while (*llink != hdr) { + if (*llink == NULL) + return(XIE_ERR); + llink = &( (*llink)->next ); + } + *llink = hdr->next; + + /* Free the rows themselves; on 80x86 these are "far" */ + /* Note we only free the row-group headers! */ + for (i = 0; i < hdr->numrows; i += hdr->rowsperchunk) { + jfree_large((pointer) ptr[i]); + } + + /* Free header and row pointers */ + return(d_free_small(cinfo, (pointer ) hdr)); +} + +#else +METHODDEF void +free_small_barray (JBLOCKARRAY ptr) +/* Free a "small" (all-in-memory) 2-D coefficient-block array */ +{ + small_barray_ptr hdr; + small_barray_ptr * llink; + long i; + + hdr = (small_barray_ptr) ptr; + hdr--; /* point back to header */ + + /* Remove item from list -- linear search is fast enough */ + llink = &small_barray_list; + while (*llink != hdr) { + if (*llink == NULL) + ERREXIT(methods, "Bogus free_small_barray request"); + llink = &( (*llink)->next ); + } + *llink = hdr->next; + + /* Free the rows themselves; on 80x86 these are "far" */ + /* Note we only free the row-group headers! */ + for (i = 0; i < hdr->numrows; i += hdr->rowsperchunk) { + jfree_large((pointer) ptr[i]); + } + + /* Free header and row pointers */ + free_small((pointer ) hdr); + +#ifdef MEM_STATS + cur_num_barray--; +#endif +} + +#endif /* XIE_SUPPORTED */ + + +/* + * About "big" array management: + * + * To allow machines with limited memory to handle large images, + * all processing in the JPEG system is done a few pixel or block rows + * at a time. The above "small" array routines are only used to allocate + * strip buffers (as wide as the image, but just a few rows high). + * In some cases multiple passes must be made over the data. In these + * cases the "big" array routines are used. The array is still accessed + * a strip at a time, but the memory manager must save the whole array + * for repeated accesses. The intended implementation is that there is + * a strip buffer in memory (as high as is possible given the desired memory + * limit), plus a backing file that holds the rest of the array. + * + * The request_big_array routines are told the total size of the image (in case + * it is useful to know the total file size that will be needed). They are + * also given the unit height, which is the number of rows that will be + * accessed at once; the in-memory buffer should be made a multiple of + * this height for best efficiency. + * + * The request routines create control blocks (and may open backing files), + * but they don't create the in-memory buffers. This is postponed until + * alloc_big_arrays is called. At that time the total amount of space needed + * is known (approximately, anyway), so free memory can be divided up fairly. + * + * The access_big_array routines are responsible for making a specific strip + * area accessible (after reading or writing the backing file, if necessary). + * Note that the access routines are told whether the caller intends to modify + * the accessed strip; during a read-only pass this saves having to rewrite + * data to disk. + * + * The typical access pattern is one top-to-bottom pass to write the data, + * followed by one or more read-only top-to-bottom passes. However, other + * access patterns may occur while reading. For example, translation of image + * formats that use bottom-to-top scan order will require bottom-to-top read + * passes. The memory manager need not support multiple write passes nor + * funny write orders (meaning that rearranging rows must be handled while + * reading data out of the big array, not while putting it in). + * + * In current usage, the access requests are always for nonoverlapping strips; + * that is, successive access start_row numbers always differ by exactly the + * unitheight. This allows fairly simple buffer dump/reload logic if the + * in-memory buffer is made a multiple of the unitheight. It would be + * possible to keep downsampled rather than fullsize data in the "big" arrays, + * thus reducing temp file size, if we supported overlapping strip access + * (access requests differing by less than the unitheight). At the moment + * I don't believe this is worth the extra complexity. + */ + + + +/* The control blocks for virtual arrays. + * System-dependent info for the associated backing store is hidden inside + * the backing_store_info struct. + */ + +#ifndef XIE_SUPPORTED +struct big_sarray_control { + long rows_in_array; /* total virtual array height */ + long samplesperrow; /* width of array (and of memory buffer) */ + long unitheight; /* # of rows accessed by access_big_sarray() */ + JSAMPARRAY mem_buffer; /* the in-memory buffer */ + long rows_in_mem; /* height of memory buffer */ + long rowsperchunk; /* allocation chunk size in mem_buffer */ + long cur_start_row; /* first logical row # in the buffer */ + boolean dirty; /* do current buffer contents need written? */ + boolean b_s_open; /* is backing-store data valid? */ + big_sarray_ptr next; /* link to next big sarray control block */ + backing_store_info b_s_info; /* System-dependent control info */ +}; + +static big_sarray_ptr big_sarray_list; /* head of list */ + +struct big_barray_control { + long rows_in_array; /* total virtual array height */ + long blocksperrow; /* width of array (and of memory buffer) */ + long unitheight; /* # of rows accessed by access_big_barray() */ + JBLOCKARRAY mem_buffer; /* the in-memory buffer */ + long rows_in_mem; /* height of memory buffer */ + long rowsperchunk; /* allocation chunk size in mem_buffer */ + long cur_start_row; /* first logical row # in the buffer */ + boolean dirty; /* do current buffer contents need written? */ + boolean b_s_open; /* is backing-store data valid? */ + big_barray_ptr next; /* link to next big barray control block */ + backing_store_info b_s_info; /* System-dependent control info */ +}; + +static big_barray_ptr big_barray_list; /* head of list */ + + +METHODDEF big_sarray_ptr +request_big_sarray (long samplesperrow, long numrows, long unitheight) +/* Request a "big" (virtual-memory) 2-D sample array */ +{ + big_sarray_ptr result; + + /* get control block */ + result = (big_sarray_ptr) alloc_small(SIZEOF(struct big_sarray_control)); + + result->rows_in_array = numrows; + result->samplesperrow = samplesperrow; + result->unitheight = unitheight; + result->mem_buffer = NULL; /* marks array not yet realized */ + result->b_s_open = FALSE; /* no associated backing-store object */ + result->next = big_sarray_list; /* add to list of big arrays */ + big_sarray_list = result; + + return result; +} + + +METHODDEF big_barray_ptr +request_big_barray (long blocksperrow, long numrows, long unitheight) +/* Request a "big" (virtual-memory) 2-D coefficient-block array */ +{ + big_barray_ptr result; + + /* get control block */ + result = (big_barray_ptr) alloc_small(SIZEOF(struct big_barray_control)); + + result->rows_in_array = numrows; + result->blocksperrow = blocksperrow; + result->unitheight = unitheight; + result->mem_buffer = NULL; /* marks array not yet realized */ + result->b_s_open = FALSE; /* no associated backing-store object */ + result->next = big_barray_list; /* add to list of big arrays */ + big_barray_list = result; + + return result; +} + + +METHODDEF void +alloc_big_arrays (long extra_small_samples, long extra_small_blocks, + long extra_medium_space) +/* Allocate the in-memory buffers for any unrealized "big" arrays */ +/* 'extra' values are upper bounds for total future small-array requests */ +/* and far-heap requests */ +{ + long total_extra_space = extra_small_samples * SIZEOF(JSAMPLE) + + extra_small_blocks * SIZEOF(JBLOCK) + + extra_medium_space; + long space_per_unitheight, maximum_space, avail_mem; + long unitheights, max_unitheights; + big_sarray_ptr sptr; + big_barray_ptr bptr; + + /* Compute the minimum space needed (unitheight rows in each buffer) + * and the maximum space needed (full image height in each buffer). + * These may be of use to the system-dependent jmem_available routine. + */ + space_per_unitheight = 0; + maximum_space = total_extra_space; + for (sptr = big_sarray_list; sptr != NULL; sptr = sptr->next) { + if (sptr->mem_buffer == NULL) { /* if not realized yet */ + space_per_unitheight += sptr->unitheight * + sptr->samplesperrow * SIZEOF(JSAMPLE); + maximum_space += sptr->rows_in_array * + sptr->samplesperrow * SIZEOF(JSAMPLE); + } + } + for (bptr = big_barray_list; bptr != NULL; bptr = bptr->next) { + if (bptr->mem_buffer == NULL) { /* if not realized yet */ + space_per_unitheight += bptr->unitheight * + bptr->blocksperrow * SIZEOF(JBLOCK); + maximum_space += bptr->rows_in_array * + bptr->blocksperrow * SIZEOF(JBLOCK); + } + } + + if (space_per_unitheight <= 0) + return; /* no unrealized arrays, no work */ + + /* Determine amount of memory to actually use; this is system-dependent. */ + avail_mem = jmem_available(space_per_unitheight + total_extra_space, + maximum_space); + + /* If the maximum space needed is available, make all the buffers full + * height; otherwise parcel it out with the same number of unitheights + * in each buffer. + */ + if (avail_mem >= maximum_space) + max_unitheights = 1000000000L; + else { + max_unitheights = (avail_mem - total_extra_space) / space_per_unitheight; + /* If there doesn't seem to be enough space, try to get the minimum + * anyway. This allows a "stub" implementation of jmem_available(). + */ + if (max_unitheights <= 0) + max_unitheights = 1; + } + + /* Allocate the in-memory buffers and initialize backing store as needed. */ + + for (sptr = big_sarray_list; sptr != NULL; sptr = sptr->next) { + if (sptr->mem_buffer == NULL) { /* if not realized yet */ + unitheights = (sptr->rows_in_array + sptr->unitheight - 1L) + / sptr->unitheight; + if (unitheights <= max_unitheights) { + /* This buffer fits in memory */ + sptr->rows_in_mem = sptr->rows_in_array; + } else { + /* It doesn't fit in memory, create backing store. */ + sptr->rows_in_mem = max_unitheights * sptr->unitheight; + jopen_backing_store(& sptr->b_s_info, + (long) (sptr->rows_in_array * + sptr->samplesperrow * SIZEOF(JSAMPLE))); + sptr->b_s_open = TRUE; + } + sptr->mem_buffer = alloc_small_sarray(sptr->samplesperrow, + sptr->rows_in_mem); + /* Reach into the small_sarray header and get the rowsperchunk field. + * Yes, I know, this is horrible coding practice. + */ + sptr->rowsperchunk = + ((small_sarray_ptr) sptr->mem_buffer)[-1].rowsperchunk; + sptr->cur_start_row = 0; + sptr->dirty = FALSE; + } + } + + for (bptr = big_barray_list; bptr != NULL; bptr = bptr->next) { + if (bptr->mem_buffer == NULL) { /* if not realized yet */ + unitheights = (bptr->rows_in_array + bptr->unitheight - 1L) + / bptr->unitheight; + if (unitheights <= max_unitheights) { + /* This buffer fits in memory */ + bptr->rows_in_mem = bptr->rows_in_array; + } else { + /* It doesn't fit in memory, create backing store. */ + bptr->rows_in_mem = max_unitheights * bptr->unitheight; + jopen_backing_store(& bptr->b_s_info, + (long) (bptr->rows_in_array * + bptr->blocksperrow * SIZEOF(JBLOCK))); + bptr->b_s_open = TRUE; + } + bptr->mem_buffer = alloc_small_barray(bptr->blocksperrow, + bptr->rows_in_mem); + /* Reach into the small_barray header and get the rowsperchunk field. */ + bptr->rowsperchunk = + ((small_barray_ptr) bptr->mem_buffer)[-1].rowsperchunk; + bptr->cur_start_row = 0; + bptr->dirty = FALSE; + } + } +} + + +LOCAL void +do_sarray_io (big_sarray_ptr ptr, boolean writing) +/* Do backing store read or write of a "big" sample array */ +{ + long bytesperrow, file_offset, byte_count, rows, i; + + bytesperrow = ptr->samplesperrow * SIZEOF(JSAMPLE); + file_offset = ptr->cur_start_row * bytesperrow; + /* Loop to read or write each allocation chunk in mem_buffer */ + for (i = 0; i < ptr->rows_in_mem; i += ptr->rowsperchunk) { + /* One chunk, but check for short chunk at end of buffer */ + rows = MIN(ptr->rowsperchunk, ptr->rows_in_mem - i); + /* Transfer no more than fits in file */ + rows = MIN(rows, ptr->rows_in_array - (ptr->cur_start_row + i)); + if (rows <= 0) /* this chunk might be past end of file! */ + break; + byte_count = rows * bytesperrow; + if (writing) + (*ptr->b_s_info.write_backing_store) (& ptr->b_s_info, + (pointer) ptr->mem_buffer[i], + file_offset, byte_count); + else + (*ptr->b_s_info.read_backing_store) (& ptr->b_s_info, + (pointer) ptr->mem_buffer[i], + file_offset, byte_count); + file_offset += byte_count; + } +} + + +LOCAL void +do_barray_io (big_barray_ptr ptr, boolean writing) +/* Do backing store read or write of a "big" coefficient-block array */ +{ + long bytesperrow, file_offset, byte_count, rows, i; + + bytesperrow = ptr->blocksperrow * SIZEOF(JBLOCK); + file_offset = ptr->cur_start_row * bytesperrow; + /* Loop to read or write each allocation chunk in mem_buffer */ + for (i = 0; i < ptr->rows_in_mem; i += ptr->rowsperchunk) { + /* One chunk, but check for short chunk at end of buffer */ + rows = MIN(ptr->rowsperchunk, ptr->rows_in_mem - i); + /* Transfer no more than fits in file */ + rows = MIN(rows, ptr->rows_in_array - (ptr->cur_start_row + i)); + if (rows <= 0) /* this chunk might be past end of file! */ + break; + byte_count = rows * bytesperrow; + if (writing) + (*ptr->b_s_info.write_backing_store) (& ptr->b_s_info, + (pointer) ptr->mem_buffer[i], + file_offset, byte_count); + else + (*ptr->b_s_info.read_backing_store) (& ptr->b_s_info, + (pointer) ptr->mem_buffer[i], + file_offset, byte_count); + file_offset += byte_count; + } +} + + +METHODDEF JSAMPARRAY +access_big_sarray (big_sarray_ptr ptr, long start_row, boolean writable) +/* Access the part of a "big" sample array starting at start_row */ +/* and extending for ptr->unitheight rows. writable is true if */ +/* caller intends to modify the accessed area. */ +{ + /* debugging check */ + if (start_row < 0 || start_row+ptr->unitheight > ptr->rows_in_array || + ptr->mem_buffer == NULL) + ERREXIT(methods, "Bogus access_big_sarray request"); + + /* Make the desired part of the virtual array accessible */ + if (start_row < ptr->cur_start_row || + start_row+ptr->unitheight > ptr->cur_start_row+ptr->rows_in_mem) { + if (! ptr->b_s_open) + ERREXIT(methods, "Virtual array controller messed up"); + /* Flush old buffer contents if necessary */ + if (ptr->dirty) { + do_sarray_io(ptr, TRUE); + ptr->dirty = FALSE; + } + /* Decide what part of virtual array to access. + * Algorithm: if target address > current window, assume forward scan, + * load starting at target address. If target address < current window, + * assume backward scan, load so that target address is top of window. + * Note that when switching from forward write to forward read, will have + * start_row = 0, so the limiting case applies and we load from 0 anyway. + */ + if (start_row > ptr->cur_start_row) { + ptr->cur_start_row = start_row; + } else { + ptr->cur_start_row = start_row + ptr->unitheight - ptr->rows_in_mem; + if (ptr->cur_start_row < 0) + ptr->cur_start_row = 0; /* don't fall off front end of file */ + } + /* If reading, read in the selected part of the array. + * If we are writing, we need not pre-read the selected portion, + * since the access sequence constraints ensure it would be garbage. + */ + if (! writable) { + do_sarray_io(ptr, FALSE); + } + } + /* Flag the buffer dirty if caller will write in it */ + if (writable) + ptr->dirty = TRUE; + /* Return address of proper part of the buffer */ + return ptr->mem_buffer + (start_row - ptr->cur_start_row); +} + + +METHODDEF JBLOCKARRAY +access_big_barray (big_barray_ptr ptr, long start_row, boolean writable) +/* Access the part of a "big" coefficient-block array starting at start_row */ +/* and extending for ptr->unitheight rows. writable is true if */ +/* caller intends to modify the accessed area. */ +{ + /* debugging check */ + if (start_row < 0 || start_row+ptr->unitheight > ptr->rows_in_array || + ptr->mem_buffer == NULL) + ERREXIT(methods, "Bogus access_big_barray request"); + + /* Make the desired part of the virtual array accessible */ + if (start_row < ptr->cur_start_row || + start_row+ptr->unitheight > ptr->cur_start_row+ptr->rows_in_mem) { + if (! ptr->b_s_open) + ERREXIT(methods, "Virtual array controller messed up"); + /* Flush old buffer contents if necessary */ + if (ptr->dirty) { + do_barray_io(ptr, TRUE); + ptr->dirty = FALSE; + } + /* Decide what part of virtual array to access. + * Algorithm: if target address > current window, assume forward scan, + * load starting at target address. If target address < current window, + * assume backward scan, load so that target address is top of window. + * Note that when switching from forward write to forward read, will have + * start_row = 0, so the limiting case applies and we load from 0 anyway. + */ + if (start_row > ptr->cur_start_row) { + ptr->cur_start_row = start_row; + } else { + ptr->cur_start_row = start_row + ptr->unitheight - ptr->rows_in_mem; + if (ptr->cur_start_row < 0) + ptr->cur_start_row = 0; /* don't fall off front end of file */ + } + /* If reading, read in the selected part of the array. + * If we are writing, we need not pre-read the selected portion, + * since the access sequence constraints ensure it would be garbage. + */ + if (! writable) { + do_barray_io(ptr, FALSE); + } + } + /* Flag the buffer dirty if caller will write in it */ + if (writable) + ptr->dirty = TRUE; + /* Return address of proper part of the buffer */ + return ptr->mem_buffer + (start_row - ptr->cur_start_row); +} + + +METHODDEF void +free_big_sarray (big_sarray_ptr ptr) +/* Free a "big" (virtual-memory) 2-D sample array */ +{ + big_sarray_ptr * llink; + + /* Remove item from list -- linear search is fast enough */ + llink = &big_sarray_list; + while (*llink != ptr) { + if (*llink == NULL) + ERREXIT(methods, "Bogus free_big_sarray request"); + llink = &( (*llink)->next ); + } + *llink = ptr->next; + + if (ptr->b_s_open) /* there may be no backing store */ + (*ptr->b_s_info.close_backing_store) (& ptr->b_s_info); + + if (ptr->mem_buffer != NULL) /* just in case never realized */ + free_small_sarray(ptr->mem_buffer); + + free_small((pointer ) ptr); /* free the control block too */ +} + + +METHODDEF void +free_big_barray (big_barray_ptr ptr) +/* Free a "big" (virtual-memory) 2-D coefficient-block array */ +{ + big_barray_ptr * llink; + + /* Remove item from list -- linear search is fast enough */ + llink = &big_barray_list; + while (*llink != ptr) { + if (*llink == NULL) + ERREXIT(methods, "Bogus free_big_barray request"); + llink = &( (*llink)->next ); + } + *llink = ptr->next; + + if (ptr->b_s_open) /* there may be no backing store */ + (*ptr->b_s_info.close_backing_store) (& ptr->b_s_info); + + if (ptr->mem_buffer != NULL) /* just in case never realized */ + free_small_barray(ptr->mem_buffer); + + free_small((pointer ) ptr); /* free the control block too */ +} + +#endif /* XIE_SUPPORTED */ + +/* + * Cleanup: free anything that's been allocated since jselmemmgr(). + */ + +#ifdef XIE_SUPPORTED +METHODDEF int +#if NeedFunctionPrototypes +c_free_all (compress_info_ptr cinfo) +#else +c_free_all (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +{ + /* Free any open small arrays -- these may release small objects */ + /* +1's are because we must pass a pointer to the data, not the header */ + while (cinfo->small_sarray_list != NULL) { + if ((c_free_small_sarray(cinfo, + (JSAMPARRAY) (cinfo->small_sarray_list + 1))) < 0) + return(XIE_ERR); + } + /* Free any remaining small objects */ + while (cinfo->small_list != NULL) { + if ((c_free_small(cinfo, + (pointer ) (cinfo->small_list + 1))) < 0) + return(XIE_ERR); + } + + jmem_term(); /* system-dependent cleanup */ + return(XIE_NRML); + +} + +METHODDEF int +#if NeedFunctionPrototypes +d_free_all (decompress_info_ptr cinfo) +#else +d_free_all (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +{ + /* Free any open small arrays -- these may release small objects */ + /* +1's are because we must pass a pointer to the data, not the header */ + while (cinfo->small_sarray_list != NULL) { + if ((d_free_small_sarray(cinfo, + (JSAMPARRAY) (cinfo->small_sarray_list + 1))) < 0) + return(XIE_ERR); + } + while (cinfo->small_barray_list != NULL) { + if ((d_free_small_barray(cinfo, + (JBLOCKARRAY) (cinfo->small_barray_list + 1))) < 0) + return(XIE_ERR); + } + /* Free any remaining small objects */ + while (cinfo->small_list != NULL) { + if ((d_free_small(cinfo, + (pointer ) (cinfo->small_list + 1))) < 0) + return(XIE_ERR); + } + + jmem_term(); /* system-dependent cleanup */ + return(XIE_NRML); + +} + +#else +METHODDEF void +free_all (void) +{ + /* First free any open "big" arrays -- these may release small arrays */ + while (big_sarray_list != NULL) + free_big_sarray(big_sarray_list); + while (big_barray_list != NULL) + free_big_barray(big_barray_list); + /* Free any open small arrays -- these may release small objects */ + /* +1's are because we must pass a pointer to the data, not the header */ + while (small_sarray_list != NULL) + free_small_sarray((JSAMPARRAY) (small_sarray_list + 1)); + while (small_barray_list != NULL) + free_small_barray((JBLOCKARRAY) (small_barray_list + 1)); + /* Free any remaining small objects */ + while (small_list != NULL) + free_small((pointer ) (small_list + 1)); +#ifdef NEED_ALLOC_MEDIUM + while (medium_list != NULL) + free_medium((pointer) (medium_list + 1)); +#endif + + jmem_term(); /* system-dependent cleanup */ + +#ifdef MEM_STATS + if (methods->trace_level > 0) + print_mem_stats(); /* print optional memory usage statistics */ +#endif +} + +#endif /* XIE_SUPPORTED */ + +/* + * The method selection routine for virtual memory systems. + * The system-dependent setup routine should call this routine + * to install the necessary method pointers in the supplied struct. + */ + +#ifdef XIE_SUPPORTED +GLOBAL void +#if NeedFunctionPrototypes +jcselmemmgr (compress_info_ptr cinfo, external_methods_ptr emethods) +#else +jcselmemmgr (cinfo, emethods) + compress_info_ptr cinfo; + external_methods_ptr emethods; +#endif /* NeedFunctionPrototypes */ +{ + + emethods->c_alloc_small = c_alloc_small; + emethods->c_free_small = c_free_small; + emethods->c_alloc_small_sarray = c_alloc_small_sarray; + emethods->c_free_small_sarray = c_free_small_sarray; + emethods->c_free_all = c_free_all; + + /* Initialize list headers to empty */ + cinfo->small_list = NULL; + cinfo->small_sarray_list = NULL; + cinfo->small_barray_list = NULL; + + emethods->max_memory_to_use = 0; + +} + +GLOBAL void +#if NeedFunctionPrototypes +jdselmemmgr (decompress_info_ptr cinfo, external_methods_ptr emethods) +#else +jdselmemmgr (cinfo, emethods) + decompress_info_ptr cinfo; + external_methods_ptr emethods; +#endif /* NeedFunctionPrototypes */ +{ + + emethods->d_alloc_small = d_alloc_small; + emethods->d_free_small = d_free_small; + emethods->d_alloc_small_sarray = d_alloc_small_sarray; + emethods->d_free_small_sarray = d_free_small_sarray; + emethods->d_alloc_small_barray = d_alloc_small_barray; + emethods->d_free_small_barray = d_free_small_barray; + emethods->d_free_all = d_free_all; + + /* Initialize list headers to empty */ + cinfo->small_list = NULL; + cinfo->small_sarray_list = NULL; + cinfo->small_barray_list = NULL; + + emethods->max_memory_to_use = 0; + +} +#else +GLOBAL void +jselmemmgr (external_methods_ptr emethods) +{ + methods = emethods; /* save struct addr for error exit access */ + + emethods->alloc_small = alloc_small; + emethods->free_small = free_small; +#ifdef NEED_ALLOC_MEDIUM + emethods->alloc_medium = alloc_medium; + emethods->free_medium = free_medium; +#else + emethods->alloc_medium = alloc_small; + emethods->free_medium = free_small; +#endif + emethods->alloc_small_sarray = alloc_small_sarray; + emethods->free_small_sarray = free_small_sarray; + emethods->alloc_small_barray = alloc_small_barray; + emethods->free_small_barray = free_small_barray; + emethods->request_big_sarray = request_big_sarray; + emethods->request_big_barray = request_big_barray; + emethods->alloc_big_arrays = alloc_big_arrays; + emethods->access_big_sarray = access_big_sarray; + emethods->access_big_barray = access_big_barray; + emethods->free_big_sarray = free_big_sarray; + emethods->free_big_barray = free_big_barray; + emethods->free_all = free_all; + + /* Initialize list headers to empty */ + small_list = NULL; +#ifdef NEED_ALLOC_MEDIUM + medium_list = NULL; +#endif + small_sarray_list = NULL; + small_barray_list = NULL; + big_sarray_list = NULL; + big_barray_list = NULL; + + jmem_init(emethods); /* system-dependent initialization */ + + /* Check for an environment variable JPEGMEM; if found, override the + * default max_memory setting from jmem_init. Note that a command line + * -m argument may again override this value. + * If your system doesn't support getenv(), define NO_GETENV to disable + * this feature. + */ +#ifndef NO_GETENV + { char * memenv; + + if ((memenv = getenv("JPEGMEM")) != NULL) { + long lval; + char ch = 'x'; + + if (sscanf(memenv, "%ld%c", &lval, &ch) > 0) { + if (ch == 'm' || ch == 'M') + lval *= 1000L; + emethods->max_memory_to_use = lval * 1000L; + } + } + } +#endif + +} +#endif /* XIE_SUPPORTED */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jmemsys.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jmemsys.c new file mode 100644 index 0000000..753f9ed --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jmemsys.c @@ -0,0 +1,232 @@ +/* $XConsortium: jmemsys.c,v 1.4 94/04/17 20:35:42 rws Exp $ */ +/* Module jmemsys.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., October 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +/* + * jmemnobs.c (jmemsys.c) + * + * Copyright (C) 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file provides a really simple implementation of the system- + * dependent portion of the JPEG memory manager. This implementation + * assumes that no backing-store files are needed: all required space + * can be obtained from malloc(). + * This is very portable in the sense that it'll compile on almost anything, + * but you'd better have lots of main memory (or virtual memory) if you want + * to process big images. + * Note that the max_memory_to_use option is ignored by this implementation. + */ + +#include "jinclude.h" +#include "jmemsys.h" + +#ifdef _XIEC_MEMORY +#ifdef malloc +#undef malloc +#endif +#ifdef free +#undef free +#endif +#define malloc(size) XieMalloc(size) +#define free(ptr) XieFree(ptr) +#else +#ifdef INCLUDES_ARE_ANSI +#include /* to declare malloc(), free() */ +#else +extern pointer malloc PP((size_t size)); +extern void free PP(pointer ptr)); +#endif +#endif /* _XIEC_MEMORY */ + + +#ifndef XIE_SUPPORTED +static external_methods_ptr methods; /* saved for access to error_exit */ +#endif /* XIE_SUPPORTED */ + +/* + * Memory allocation and freeing are controlled by the regular library + * routines malloc() and free(). + */ + +GLOBAL pointer +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +jget_small (size_t sizeofobject) +#else +jget_small (sizeofobject) + size_t sizeofobject; +#endif /* NeedFunctionPrototypes */ +#else +jget_small (size_t sizeofobject) +#endif /* XIE_SUPPORTED */ +{ + return (pointer) malloc(sizeofobject); +} + +GLOBAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +jfree_small (pointer object) +#else +jfree_small (object) + pointer object; +#endif /* NeedFunctionPrototypes */ +#else +jfree_small (pointer object) +#endif /* XIE_SUPPORTED */ +{ + free(object); +} + +/* + * We assume NEED_FAR_POINTERS is not defined and so the separate entry points + * jget_large, jfree_large are not needed. + */ + + +/* + * This routine computes the total memory space available for allocation. + * Here we always say, "we got all you want bud!" + */ + +#ifndef XIE_SUPPORTED +GLOBAL long +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +jmem_available (long min_bytes_needed, long max_bytes_needed) +#else +jmem_available (min_bytes_needed, max_bytes_needed) + long min_bytes_needed; + long max_bytes_needed; +#endif /* NeedFunctionPrototypes */ +#else +jmem_available (long min_bytes_needed, long max_bytes_needed) +#endif /* XIE_SUPPORTED */ +{ + return max_bytes_needed; +} + + +/* + * Backing store (temporary file) management. + * This should never be called and we just error out. + */ + +GLOBAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +jopen_backing_store (backing_store_ptr info, long total_bytes_needed) +#else +jopen_backing_store (info, total_bytes_needed) + backing_store_ptr info; + long total_bytes_needed; +#endif /* NeedFunctionPrototypes */ +#else +jopen_backing_store (backing_store_ptr info, long total_bytes_needed) +#endif /* XIE_SUPPORTED */ +{ + ERREXIT(methods, "Backing store not supported"); +} +#endif /* XIE_SUPPORTED */ + + +/* + * These routines take care of any system-dependent initialization and + * cleanup required. Keep in mind that jmem_term may be called more than + * once. + */ + +#ifndef XIE_SUPPORTED +GLOBAL void +jmem_init (external_methods_ptr emethods) +{ + methods = emethods; /* save struct addr for error exit access */ + emethods->max_memory_to_use = 0; +} +#endif /* XIE_SUPPORTED */ + +GLOBAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +jmem_term (void) +#else +jmem_term () +#endif /* NeedFunctionPrototypes */ +#else +jmem_term (void) +#endif /* XIE_SUPPORTED */ +{ + /* no work */ +} diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jmemsys.h b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jmemsys.h new file mode 100644 index 0000000..dfe5b4c --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jmemsys.h @@ -0,0 +1,203 @@ +/* $XConsortium: jmemsys.h,v 1.4 94/04/17 20:35:43 rws Exp $ */ +/* Module jmemsys.h */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., October 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +/* + * jmemsys.h + * + * Copyright (C) 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This include file defines the interface between the system-independent + * and system-dependent portions of the JPEG memory manager. (The system- + * independent portion is jmemmgr.c; there are several different versions + * of the system-dependent portion, and of this file for that matter.) + * + * This is a "generic" skeleton that may need to be modified for particular + * systems. It should be usable as-is on the majority of non-MSDOS machines. + */ + + +/* + * These two functions are used to allocate and release small chunks of + * memory (typically the total amount requested through jget_small is + * no more than 20Kb or so). Behavior should be the same as for the + * standard library functions malloc and free; in particular, jget_small + * returns NULL on failure. On most systems, these ARE malloc and free. + * On an 80x86 machine using small-data memory model, these manage near heap. + */ + +EXTERN pointer jget_small PP((size_t sizeofobject)); +EXTERN void jfree_small PP((pointer object)); + +/* + * These two functions are used to allocate and release large chunks of + * memory (up to the total free space designated by jmem_available). + * The interface is the same as above, except that on an 80x86 machine, + * far pointers are used. On other systems these ARE the same as above. + */ + +#ifdef NEED_FAR_POINTERS /* typically not needed except on 80x86 */ +EXTERN pointer jget_large PP((size_t sizeofobject)); +EXTERN void jfree_large PP((pointer object)); +#else +#define jget_large(sizeofobject) jget_small(sizeofobject) +#define jfree_large(object) jfree_small(object) +#endif + +/* + * The macro MAX_ALLOC_CHUNK designates the maximum number of bytes that may + * be requested in a single call on jget_large (and jget_small for that + * matter, but that case should never come into play). This macro is needed + * to model the 64Kb-segment-size limit of far addressing on 80x86 machines. + * On machines with flat address spaces, any large constant may be used here. + */ + +#define MAX_ALLOC_CHUNK 1000000000L + +/* + * This routine computes the total space available for allocation by + * jget_large. If more space than this is needed, backing store will be used. + * NOTE: any memory already allocated must not be counted. + * + * There is a minimum space requirement, corresponding to the minimum + * feasible buffer sizes; jmemmgr.c will request that much space even if + * jmem_available returns zero. The maximum space needed, enough to hold + * all working storage in memory, is also passed in case it is useful. + * + * It is OK for jmem_available to underestimate the space available (that'll + * just lead to more backing-store access than is really necessary). + * However, an overestimate will lead to failure. Hence it's wise to subtract + * a slop factor from the true available space, especially if jget_small space + * comes from the same pool. 5% should be enough. + * + * On machines with lots of virtual memory, any large constant may be returned. + * Conversely, zero may be returned to always use the minimum amount of memory. + */ + +EXTERN long jmem_available PP((long min_bytes_needed, long max_bytes_needed)); + + +/* + * This structure holds whatever state is needed to access a single + * backing-store object. The read/write/close method pointers are called + * by jmemmgr.c to manipulate the backing-store object; all other fields + * are private to the system-dependent backing store routines. + */ + +#define TEMP_NAME_LENGTH 64 /* max length of a temporary file's name */ + +typedef struct backing_store_struct * backing_store_ptr; + +typedef struct backing_store_struct { + /* Methods for reading/writing/closing this backing-store object */ + METHOD(void, read_backing_store, (backing_store_ptr info, + pointer buffer_address, + long file_offset, long byte_count)); + METHOD(void, write_backing_store, (backing_store_ptr info, + pointer buffer_address, + long file_offset, long byte_count)); + METHOD(void, close_backing_store, (backing_store_ptr info)); + /* Private fields for system-dependent backing-store management */ + /* For a typical implementation with temp files, we might need: */ +#ifndef XIE_SUPPORTED + FILE * temp_file; /* stdio reference to temp file */ +#endif /* XIE_SUPPORTED */ + char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */ + } backing_store_info; + +/* + * Initial opening of a backing-store object. This must fill in the + * read/write/close pointers in the object. The read/write routines + * may take an error exit if the specified maximum file size is exceeded. + * (If jmem_available always returns a large value, this routine can just + * take an error exit.) + */ + +EXTERN void jopen_backing_store PP((backing_store_ptr info, + long total_bytes_needed)); + + +/* + * These routines take care of any system-dependent initialization and + * cleanup required. The system methods struct address should be saved + * by jmem_init in case an error exit must be taken. jmem_term may assume + * that all requested memory has been freed and that all opened backing- + * store objects have been closed. + * NB: jmem_term may be called more than once, and must behave reasonably + * if that happens. + */ + +EXTERN void jmem_init PP((external_methods_ptr emethods)); +EXTERN void jmem_term PP((void)); diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jpegdata.h b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jpegdata.h new file mode 100644 index 0000000..7f738cf --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jpegdata.h @@ -0,0 +1,1288 @@ +/* $XConsortium: jpegdata.h /main/5 1995/12/02 16:51:37 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/* Module jpegdata.h */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., October 1993 + +****************************************************************************/ + +/* + * jpegdata.h + * + * Copyright (C) 1991, 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file defines shared data structures for the various JPEG modules. + */ + +/* + * You might need to change some of the following declarations if you are + * using the JPEG software within a surrounding application program + * or porting it to an unusual system. + */ + + +/* If the source or destination of image data is not to be stdio streams, + * these types may need work. You can replace them with some kind of + * pointer or indicator that is useful to you, or just ignore 'em. + * Note that the user interface and the various jrdxxx/jwrxxx modules + * will also need work for non-stdio input/output. + */ + +#ifndef XIE_SUPPORTED +typedef FILE * JFILEREF; /* source or dest of JPEG-compressed data */ + +typedef FILE * IFILEREF; /* source or dest of non-JPEG image data */ +#endif /* XIE_SUPPORTED */ + + +/* These defines are used in all function definitions and extern declarations. + * You could modify them if you need to change function linkage conventions, + * as is shown below for use with C++. Another application would be to make + * all functions global for use with code profilers that require it. + * NOTE: the C++ test does the right thing if you are reading this include + * file in a C++ application to link to JPEG code that's been compiled with a + * regular C compiler. I'm not sure it works if you try to compile the JPEG + * code with C++. + */ + +#define METHODDEF static /* a function called through method pointers */ +#define LOCAL static /* a function used only in its module */ +#define GLOBAL /* a function referenced thru EXTERNs */ +#ifdef __cplusplus +#define EXTERN extern "C" /* a reference to a GLOBAL function */ +#else +#define EXTERN extern /* a reference to a GLOBAL function */ +#endif + + +/* Here is the pseudo-keyword for declaring pointers that must be "far" + * on 80x86 machines. Most of the specialized coding for 80x86 is handled + * by just saying "FAR *" where such a pointer is needed. In a few places + * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. + */ + +#ifdef NEED_FAR_POINTERS +#define FAR far +#else +#define FAR +#endif + + + +/* The remaining declarations are not system-dependent, we hope. */ + + +/* + * NOTE: if you have an ancient, strict-K&R C compiler, it may choke on the + * similarly-named fields in Compress_info_struct and Decompress_info_struct. + * If this happens, you can get around it by rearranging the two structs so + * that the similarly-named fields appear first and in the same order in + * each struct. Since such compilers are now pretty rare, we haven't done + * this in the portable code, preferring to maintain a logical ordering. + */ + + + +/* This macro is used to declare a "method", that is, a function pointer. */ +/* We want to supply prototype parameters if the compiler can cope. */ +/* Note that the arglist parameter must be parenthesized! */ + +#ifdef PROTO +#define METHOD(type,methodname,arglist) type (*methodname) arglist +#else +#define METHOD(type,methodname,arglist) type (*methodname) () +#endif + +/* Forward references to lists of method pointers */ +typedef struct External_methods_struct * external_methods_ptr; +typedef struct Compress_methods_struct * compress_methods_ptr; +typedef struct Decompress_methods_struct * decompress_methods_ptr; + + +/* Data structures for images containing either samples or coefficients. */ +/* Note that the topmost (leftmost) index is always color component. */ +/* On 80x86 machines, the image arrays are too big for near pointers, */ +/* but the pointer arrays can fit in near memory. */ + +typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */ +typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ +typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */ + + +#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */ +#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ + +typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */ +typedef JBLOCK FAR *JBLOCKROW; /* pointer to one row of coefficient blocks */ +typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */ +typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ + +typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */ + + +/* The input and output data of the DCT transform subroutines are of + * the following type, which need not be the same as JCOEF. + * For example, on a machine with fast floating point, it might make sense + * to recode the DCT routines to use floating point; then DCTELEM would be + * 'float' or 'double'. + */ + +typedef JCOEF DCTELEM; +typedef DCTELEM DCTBLOCK[DCTSIZE2]; + + +/* Types for JPEG compression parameters and working tables. */ + + +typedef enum { /* defines known color spaces */ + CS_UNKNOWN, /* error/unspecified */ + CS_GRAYSCALE, /* monochrome (only 1 component) */ + CS_RGB, /* red/green/blue */ + CS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ + CS_YIQ, /* Y/I/Q */ + CS_CMYK /* C/M/Y/K */ +} COLOR_SPACE; + + +typedef struct { /* Basic info about one component */ + /* These values are fixed over the whole image */ + /* For compression, they must be supplied by the user interface; */ + /* for decompression, they are read from the SOF marker. */ + short component_id; /* identifier for this component (0..255) */ + short component_index; /* its index in SOF or cinfo->comp_info[] */ + short h_samp_factor; /* horizontal sampling factor (1..4) */ + short v_samp_factor; /* vertical sampling factor (1..4) */ + short quant_tbl_no; /* quantization table selector (0..3) */ + /* These values may vary between scans */ + /* For compression, they must be supplied by the user interface; */ + /* for decompression, they are read from the SOS marker. */ + short dc_tbl_no; /* DC entropy table selector (0..3) */ + short ac_tbl_no; /* AC entropy table selector (0..3) */ + /* These values are computed during compression or decompression startup */ + long true_comp_width; /* component's image width in samples */ + long true_comp_height; /* component's image height in samples */ + /* the above are the logical dimensions of the downsampled image */ + /* These values are computed before starting a scan of the component */ + short MCU_width; /* number of blocks per MCU, horizontally */ + short MCU_height; /* number of blocks per MCU, vertically */ + short MCU_blocks; /* MCU_width * MCU_height */ + long downsampled_width; /* image width in samples, after expansion */ + long downsampled_height; /* image height in samples, after expansion */ + /* the above are the true_comp_xxx values rounded up to multiples of */ + /* the MCU dimensions; these are the working dimensions of the array */ + /* as it is passed through the DCT or IDCT step. NOTE: these values */ + /* differ depending on whether the component is interleaved or not!! */ +} jpeg_component_info; + + +/* DCT coefficient quantization tables. + * For 8-bit precision, 'INT16' should be good enough for quantization values; + * for more precision, we go for the full 16 bits. 'INT16' provides a useful + * speedup on many machines (multiplication & division of JCOEFs by + * quantization values is a significant chunk of the runtime). + * Note: the values in a QUANT_TBL are always given in zigzag order. + */ +#ifdef EIGHT_BIT_SAMPLES +typedef INT16 QUANT_VAL; /* element of a quantization table */ +#else +typedef UINT16 QUANT_VAL; /* element of a quantization table */ +#endif +typedef QUANT_VAL QUANT_TBL[DCTSIZE2]; /* A quantization table */ +typedef QUANT_VAL * QUANT_TBL_PTR; /* pointer to same */ + + +typedef struct { /* A Huffman coding table */ + /* These two fields directly represent the contents of a JPEG DHT marker */ + UINT8 bits[17]; /* bits[k] = # of symbols with codes of */ + /* length k bits; bits[0] is unused */ + UINT8 huffval[256]; /* The symbols, in order of incr code length */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + */ + boolean sent_table; /* TRUE when table has been output */ + /* The remaining fields are computed from the above to allow more efficient + * coding and decoding. These fields should be considered private to the + * Huffman compression & decompression modules. + */ + /* encoding tables: */ + UINT16 ehufco[256]; /* code for each symbol */ + char ehufsi[256]; /* length of code for each symbol */ + /* decoding tables: (element [0] of each array is unused) */ + UINT16 mincode[17]; /* smallest code of length k */ + INT32 maxcode[18]; /* largest code of length k (-1 if none) */ + /* (maxcode[17] is a sentinel to ensure huff_DECODE terminates) */ + short valptr[17]; /* huffval[] index of 1st symbol of length k */ +} HUFF_TBL; + + +#define NUM_QUANT_TBLS 4 /* quantization tables are numbered 0..3 */ +#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ +#define NUM_ARITH_TBLS 16 /* arith-coding tables are numbered 0..15 */ +#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */ +#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */ +#define MAX_BLOCKS_IN_MCU 10 /* JPEG limit on # of blocks in an MCU */ + +#ifdef XIE_SUPPORTED +/* Types and Structures from jmemmgr.c */ +/* (used in Compress_info_struct and Decompress_info_struct */ +typedef double align_type; + +typedef union small_struct * small_ptr; + +typedef union small_struct { + small_ptr next; /* next in list of allocated objects */ + align_type dummy; /* ensures alignment of following storage */ + } small_hdr; + +typedef struct small_sarray_struct * small_sarray_ptr; + +typedef struct small_sarray_struct { + small_sarray_ptr next; /* next in list of allocated sarrays */ + long numrows; /* # of rows in this array */ + long rowsperchunk; /* max # of rows per allocation chunk */ + JSAMPROW dummy; /* ensures alignment of following storage */ + } small_sarray_hdr; + +typedef struct small_barray_struct * small_barray_ptr; + +typedef struct small_barray_struct { + small_barray_ptr next; /* next in list of allocated barrays */ + long numrows; /* # of rows in this array */ + long rowsperchunk; /* max # of rows per allocation chunk */ + JBLOCKROW dummy; /* ensures alignment of following storage */ + } small_barray_hdr; + +#endif /* XIE_SUPPORTED */ + + +/* Working data for compression */ + +struct Compress_info_struct { +/* + * All of these fields shall be established by the user interface before + * calling jpeg_compress, or by the input_init or c_ui_method_selection + * methods. + * Most parameters can be set to reasonable defaults by j_c_defaults. + * Note that the UI must supply the storage for the main methods struct, + * though it sets only a few of the methods there. + */ + compress_methods_ptr methods; /* Points to list of methods to use */ + + external_methods_ptr emethods; /* Points to list of methods to use */ + +#ifndef XIE_SUPPORTED + IFILEREF input_file; /* tells input routines where to read image */ + JFILEREF output_file; /* tells output routines where to write JPEG */ +#endif /* XIE_SUPPORTED */ + + long image_width; /* input image width */ + long image_height; /* input image height */ + short input_components; /* # of color components in input image */ + + short data_precision; /* bits of precision in image data */ + + COLOR_SPACE in_color_space; /* colorspace of input file */ + COLOR_SPACE jpeg_color_space; /* colorspace of JPEG file */ + + double input_gamma; /* image gamma of input file */ + + boolean write_JFIF_header; /* should a JFIF marker be written? */ + /* These three values are not used by the JPEG code, only copied */ + /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ + /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ + /* ratio is defined by X_density/Y_density even when density_unit=0. */ + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + + short num_components; /* # of color components in JPEG image */ + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + QUANT_TBL_PTR quant_tbl_ptrs[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + HUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + HUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arithmetic-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arithmetic-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arithmetic-coding tables */ + + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + boolean interleave; /* TRUE=interleaved output, FALSE=not */ + boolean optimize_coding; /* TRUE=optimize entropy encoding parms */ + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + int smoothing_factor; /* 1..100, or 0 for no input smoothing */ + + /* The restart interval can be specified in absolute MCUs by setting + * restart_interval, or in MCU rows by setting restart_in_rows + * (in which case the correct restart_interval will be figured + * for each scan). + */ + UINT16 restart_interval;/* MCUs per restart interval, or 0 for no restart */ + int restart_in_rows; /* if > 0, MCU rows per restart interval */ + +/* + * These fields are computed during jpeg_compress startup + */ + short max_h_samp_factor; /* largest h_samp_factor */ + short max_v_samp_factor; /* largest v_samp_factor */ + +/* + * These fields may be useful for progress monitoring + */ + + int total_passes; /* number of passes expected */ + int completed_passes; /* number of passes completed so far */ + +/* + * These fields are valid during any one scan + */ + short comps_in_scan; /* # of JPEG components output this time */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + long MCUs_per_row; /* # of MCUs across the image */ + long MCU_rows_in_scan; /* # of MCU rows in the image */ + + short blocks_in_MCU; /* # of DCT blocks per MCU */ + short MCU_membership[MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + /* these fields are private data for the entropy encoder */ + JCOEF last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each comp */ + JCOEF last_dc_diff[MAX_COMPS_IN_SCAN]; /* last DC diff for each comp */ + UINT16 restarts_to_go; /* MCUs left in this restart interval */ + short next_restart_num; /* # of next RSTn marker (0..7) */ + +#ifdef XIE_SUPPORTED + long jpeg_buf_size; /* put is structure from global define */ + short xie_h_samp_factor[MAX_COMPS_IN_SCAN]; /* for XIE interface */ + short xie_v_samp_factor[MAX_COMPS_IN_SCAN]; /* for XIE interface */ + /* The variables come from jcpipe.c - single_ccontroller */ + int rows_in_mem; /* # of sample rows in full-size buffers */ + long fullsize_width; /* # of samples per row in full-size buffers */ + long cur_pixel_row; /* counts # of pixel rows processed */ + long mcu_rows_output; /* # of MCU rows actually emitted */ + int mcu_rows_per_loop; /* # of MCU rows processed per outer loop */ + /* Work buffer for pre-downsampling data (see comments at head of file) */ + JSAMPIMAGE fullsize_data[2]; + /* Work buffer for downsampled data */ + JSAMPIMAGE sampled_data; + int rows_this_time; + short whichss; + boolean first_pixel_row; + /* from jchuff.c */ + INT32 huff_put_buffer; /* current bit-accumulation buffer */ + int huff_put_bits; /* # of bits now in it */ + char * output_buffer; /* output buffer */ + int bytes_in_buffer; + /* XIE - JPEG buffer */ + int XIEwrloc; + int XIErestart; + int XIEmcurow; + long XIEmcuindex; + int XIEbytes_in_buffer; + /* from jmemmgr.c */ + small_ptr small_list; /* head of list */ + small_sarray_ptr small_sarray_list; /* head of list */ + small_barray_ptr small_barray_list; /* head of list */ +#endif /* XIE_SUPPORTED */ + +}; + +typedef struct Compress_info_struct * compress_info_ptr; + +#ifdef XIE_SUPPORTED + +/* Types for XIE restart. */ + + +typedef enum { /* defines XIE restart locations */ + XIE_RNUL, /* No restart */ + XIE_RRFH, /* Restart at Read File Header */ + XIE_RRSH, /* Restart at Read Scan Header */ + XIE_RMCU, /* Restart at MCU */ + XIE_RWRJ, /* Restart at write jfif */ + XIE_RWFH, /* Restart at Write File Header */ + XIE_RWSH, /* Restart at Write Scan Header */ + XIE_RWFT /* Restart at Write File Trailer */ + } XIE_RESTART; + +/* Types for XIE return. */ + +typedef enum { /* defines XIE restart locations */ + XIE_ERR = -999, /* Error return */ + XIE_NRML = 0, /* Normal return */ + XIE_INP = 1, /* Need input */ + XIE_OUT = 2, /* Output ready */ + XIE_EOI = 3 /* End of input */ +} XIE_RETURN; + +#endif + + +/* Working data for decompression */ + +struct Decompress_info_struct { +/* + * These fields shall be established by the user interface before + * calling jpeg_decompress. + * Most parameters can be set to reasonable defaults by j_d_defaults. + * Note that the UI must supply the storage for the main methods struct, + * though it sets only a few of the methods there. + */ + decompress_methods_ptr methods; /* Points to list of methods to use */ + + external_methods_ptr emethods; /* Points to list of methods to use */ + +#ifndef XIE_SUPPORTED + JFILEREF input_file; /* tells input routines where to read JPEG */ + IFILEREF output_file; /* tells output routines where to write image */ +#endif /* XIE_SUPPORTED */ + + /* these can be set at d_ui_method_selection time: */ + + COLOR_SPACE out_color_space; /* colorspace of output */ + + double output_gamma; /* image gamma wanted in output */ + + boolean quantize_colors; /* T if output is a colormapped format */ + /* the following are ignored if not quantize_colors: */ + boolean two_pass_quantize; /* use two-pass color quantization? */ + boolean use_dithering; /* want color dithering? */ + int desired_number_of_colors; /* max number of colors to use */ + + boolean do_block_smoothing; /* T = apply cross-block smoothing */ + boolean do_pixel_smoothing; /* T = apply post-upsampling smoothing */ + +/* + * These fields are used for efficient buffering of data between read_jpeg_data + * and the entropy decoding object. By using a shared buffer, we avoid copying + * data and eliminate the need for an "unget" operation at the end of a scan. + * The actual source of the data is known only to read_jpeg_data; see the + * JGETC macro, below. + * Note: the user interface is expected to allocate the input_buffer and + * initialize bytes_in_buffer to 0. Also, for JFIF/raw-JPEG input, the UI + * actually supplies the read_jpeg_data method. This is all handled by + * j_d_defaults in a typical implementation. + */ + char * input_buffer; /* start of buffer (private to input code) */ + char * next_input_byte; /* => next byte to read from buffer */ + int bytes_in_buffer; /* # of bytes remaining in buffer */ + +/* + * These fields are set by read_file_header or read_scan_header + */ + long image_width; /* overall image width */ + long image_height; /* overall image height */ + + short data_precision; /* bits of precision in image data */ + + COLOR_SPACE jpeg_color_space; /* colorspace of JPEG file */ + + /* These three values are not used by the JPEG code, merely copied */ + /* from the JFIF APP0 marker (if any). */ + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + + short num_components; /* # of color components in JPEG image */ + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + QUANT_TBL_PTR quant_tbl_ptrs[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + HUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + HUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + + UINT16 restart_interval;/* MCUs per restart interval, or 0 for no restart */ + +/* + * These fields are computed during jpeg_decompress startup + */ + short max_h_samp_factor; /* largest h_samp_factor */ + short max_v_samp_factor; /* largest v_samp_factor */ + + short color_out_comps; /* # of color components output by color_convert */ + /* (need not match num_components) */ + short final_out_comps; /* # of color components sent to put_pixel_rows */ + /* (1 when quantizing colors, else same as color_out_comps) */ + + JSAMPLE * sample_range_limit; /* table for fast range-limiting */ + +/* + * When quantizing colors, the color quantizer leaves a pointer to the output + * colormap in these fields. The colormap is valid from the time put_color_map + * is called (must be before any put_pixel_rows calls) until shutdown (more + * specifically, until free_all is called to release memory). + */ + int actual_number_of_colors; /* actual number of entries */ + JSAMPARRAY colormap; /* NULL if not valid */ + /* map has color_out_comps rows * actual_number_of_colors columns */ + +/* + * These fields may be useful for progress monitoring + */ + int total_passes; /* number of passes expected */ + int completed_passes; /* number of passes completed so far */ + +/* + * These fields are valid during any one scan + */ + short comps_in_scan; /* # of JPEG components input this time */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + long MCUs_per_row; /* # of MCUs across the image */ + long MCU_rows_in_scan; /* # of MCU rows in the image */ + + short blocks_in_MCU; /* # of DCT blocks per MCU */ + short MCU_membership[MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + /* these fields are private data for the entropy encoder */ + JCOEF last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each comp */ + JCOEF last_dc_diff[MAX_COMPS_IN_SCAN]; /* last DC diff for each comp */ + UINT16 restarts_to_go; /* MCUs left in this restart interval */ + short next_restart_num; /* # of next RSTn marker (0..7) */ + +#ifdef XIE_SUPPORTED + boolean XIE_upsample; /* TRUE if upsampling is desired */ + long jpeg_buf_size; /* put is structure from global define */ + int rows_in_mem; /* # of sample rows in full-size buffers */ + /* Work buffer for data being passed to output module. */ + /* This has color_out_comps components if not quantizing, */ + /* but only one component when quantizing. */ + JSAMPIMAGE output_workspace; + long fullsize_width; /* # of samples per row in full-size buffers */ + long pixel_rows_output; /* # of pixel rows actually emitted */ + int mcu_rows_per_loop; /* # of MCU rows processed per outer loop */ + /* Work buffer for dequantized coefficients (IDCT input) */ + JBLOCKIMAGE coeff_data; + /* Work buffer for cross-block smoothing input */ +#ifdef BLOCK_SMOOTHING_SUPPORTED + JBLOCKIMAGE bsmooth[3]; /* this is optional */ + int whichb; +#endif + /* Work buffer for downsampled image data (see comments at head of file) */ + JSAMPIMAGE sampled_data[2]; + /* Work buffer for upsampled data */ + JSAMPIMAGE fullsize_data; + int whichss; + long cur_mcu_row; /* counts # of MCU rows processed */ + int ri; + boolean first_mcu_row; + /* used in jdmcu and jrdjfif */ + int XIErestart; + char * XIEnext_input_byte; /* => next byte to read from buffer */ + int XIEbytes_in_buffer; /* # of bytes remaining in buffer */ + /* used in jdmcu */ + long XIEmcuindex; + JBLOCKROW MCU_data[MAX_BLOCKS_IN_MCU]; + /* used in jdhuff */ + INT32 XIEget_buffer; /* current bit-extraction buffer */ + int XIEbits_left; /* # of unused bits in it */ + boolean printed_eod; /* flag to suppress multiple end-of-data msgs */ + /* from jmemmgr.c */ + small_ptr small_list; /* head of list */ + small_sarray_ptr small_sarray_list; /* head of list */ + small_barray_ptr small_barray_list; /* head of list */ +#endif /* XIE_SUPPORTED */ + +}; + +typedef struct Decompress_info_struct * decompress_info_ptr; + + +/* Macros for reading data from the decompression input buffer */ + +#ifdef XIE_SUPPORTED +#ifdef CHAR_IS_UNSIGNED +#define JGETC(cinfo) ( --(cinfo)->bytes_in_buffer < 0 ? \ + -1 : (int) (*(cinfo)->next_input_byte++) ) +#else +#define JGETC(cinfo) ( --(cinfo)->bytes_in_buffer < 0 ? \ + -1 : (int) (*(cinfo)->next_input_byte++) & 0xFF ) +#endif +#else +#ifdef CHAR_IS_UNSIGNED +#define JGETC(cinfo) ( --(cinfo)->bytes_in_buffer < 0 ? \ + (*(cinfo)->methods->read_jpeg_data) (cinfo) : \ + (int) (*(cinfo)->next_input_byte++) ) +#else +#define JGETC(cinfo) ( --(cinfo)->bytes_in_buffer < 0 ? \ + (*(cinfo)->methods->read_jpeg_data) (cinfo) : \ + (int) (*(cinfo)->next_input_byte++) & 0xFF ) +#endif +#endif /* XIE_SUPPORTED */ + +#define JUNGETC(ch,cinfo) ((cinfo)->bytes_in_buffer++, \ + *(--((cinfo)->next_input_byte)) = (char) (ch)) + +#define MIN_UNGET 4 /* may always do at least 4 JUNGETCs */ + + +/* A virtual image has a control block whose contents are private to the + * memory manager module (and may differ between managers). The rest of the + * code only refers to virtual images by these pointer types, and never + * dereferences the pointer. + */ + +typedef struct big_sarray_control * big_sarray_ptr; +typedef struct big_barray_control * big_barray_ptr; + +/* Although a real ANSI C compiler can deal perfectly well with pointers to + * unspecified structures (see "incomplete types" in the spec), a few pre-ANSI + * and pseudo-ANSI compilers get confused. To keep one of these bozos happy, + * add -DINCOMPLETE_TYPES_BROKEN to CFLAGS in your Makefile. Then we will + * pseudo-define the structs as containing a single "dummy" field. + * The memory managers #define AM_MEMORY_MANAGER before including this file, + * so that they can make their own definitions of the structs. + */ + +#ifdef INCOMPLETE_TYPES_BROKEN +#ifndef AM_MEMORY_MANAGER +struct big_sarray_control { long dummy; }; +struct big_barray_control { long dummy; }; +#endif +#endif + + +/* Method types that need typedefs */ + +#ifdef XIE_SUPPORTED +typedef METHOD(int, MCU_output_method_ptr, (compress_info_ptr cinfo, + JBLOCK *MCU_data)); +#else +typedef METHOD(void, MCU_output_method_ptr, (compress_info_ptr cinfo, + JBLOCK *MCU_data)); +#endif /* XIE_SUPPORTED */ +typedef METHOD(void, MCU_output_caller_ptr, (compress_info_ptr cinfo, + MCU_output_method_ptr output_method)); +typedef METHOD(void, downsample_ptr, (compress_info_ptr cinfo, + int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, + JSAMPARRAY input_data, + JSAMPARRAY below, + JSAMPARRAY output_data)); +typedef METHOD(void, upsample_ptr, (decompress_info_ptr cinfo, + int which_component, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPARRAY above, + JSAMPARRAY input_data, + JSAMPARRAY below, + JSAMPARRAY output_data)); +typedef METHOD(void, quantize_method_ptr, (decompress_info_ptr cinfo, + int num_rows, + JSAMPIMAGE input_data, + JSAMPARRAY output_workspace)); +typedef METHOD(void, quantize_caller_ptr, (decompress_info_ptr cinfo, + quantize_method_ptr quantize_method)); + + +/* These structs contain function pointers for the various JPEG methods. */ + +/* Routines to be provided by the surrounding application, rather than the + * portable JPEG code proper. These are the same for compression and + * decompression. + */ + +struct External_methods_struct { + /* User interface: error exit and trace message routines */ + /* NOTE: the string msgtext parameters will eventually be replaced + * by an enumerated-type code so that non-English error messages + * can be substituted easily. This will not be done until all the + * code is in place, so that we know what messages are needed. + */ + METHOD(void, error_exit, (const char *msgtext)); + METHOD(void, trace_message, (const char *msgtext)); + + /* Working data for error/trace facility */ + /* See macros below for the usage of these variables */ + int trace_level; /* level of detail of tracing messages */ + /* Use level 0 for important warning messages (nonfatal errors) */ + /* Use levels 1, 2, 3 for successively more detailed trace options */ + + /* For recoverable corrupt-data errors, we emit a warning message and + * keep going. A surrounding application can check for bad data by + * seeing if num_warnings is nonzero at the end of processing. + */ + long num_warnings; /* number of corrupt-data warnings */ + int first_warning_level; /* trace level for first warning */ + int more_warning_level; /* trace level for subsequent warnings */ + + int message_parm[8]; /* store numeric parms for messages here */ + + /* Memory management */ + /* NB: alloc routines never return NULL. They exit to */ + /* error_exit if not successful. */ +#ifdef XIE_SUPPORTED + METHOD(pointer, c_alloc_small, (compress_info_ptr cinfo, + size_t sizeofobject)); + METHOD(int, c_free_small, (compress_info_ptr cinfo, pointer ptr)); + METHOD(pointer, d_alloc_small, (decompress_info_ptr cinfo, + size_t sizeofobject)); + METHOD(int, d_free_small, (decompress_info_ptr cinfo, pointer ptr)); +#else + METHOD(pointer, alloc_small, (size_t sizeofobject)); + METHOD(void, free_small, (pointer ptr)); +#endif /* XIE_SUPPORTED */ + METHOD(pointer, alloc_medium, (size_t sizeofobject)); + METHOD(void, free_medium, (pointer ptr)); +#ifdef XIE_SUPPORTED + METHOD(JSAMPARRAY, c_alloc_small_sarray, (compress_info_ptr cinfo, + long samplesperrow, long numrows)); + METHOD(int, c_free_small_sarray, (compress_info_ptr cinfo, + JSAMPARRAY ptr)); + METHOD(JSAMPARRAY, d_alloc_small_sarray, (decompress_info_ptr cinfo, + long samplesperrow, long numrows)); + METHOD(int, d_free_small_sarray, (decompress_info_ptr cinfo, + JSAMPARRAY ptr)); +#else + METHOD(JSAMPARRAY, alloc_small_sarray, (long samplesperrow, + long numrows)); + METHOD(void, free_small_sarray, (JSAMPARRAY ptr)); +#endif /* XIE_SUPPORTED */ +#ifdef XIE_SUPPORTED + METHOD(JBLOCKARRAY, c_alloc_small_barray, (compress_info_ptr cinfo, + long blocksperrow, long numrows)); + METHOD(int, c_free_small_barray, (compress_info_ptr cinfo, + JBLOCKARRAY ptr)); + METHOD(JBLOCKARRAY, d_alloc_small_barray, (decompress_info_ptr cinfo, + long blocksperrow, long numrows)); + METHOD(int, d_free_small_barray, (decompress_info_ptr cinfo, + JBLOCKARRAY ptr)); +#else + METHOD(JBLOCKARRAY, alloc_small_barray, (long blocksperrow, + long numrows)); + METHOD(void, free_small_barray, (JBLOCKARRAY ptr)); +#endif /* XIE_SUPPORTED */ + METHOD(big_sarray_ptr, request_big_sarray, (long samplesperrow, + long numrows, + long unitheight)); + METHOD(big_barray_ptr, request_big_barray, (long blocksperrow, + long numrows, + long unitheight)); + METHOD(void, alloc_big_arrays, (long extra_small_samples, + long extra_small_blocks, + long extra_medium_space)); + METHOD(JSAMPARRAY, access_big_sarray, (big_sarray_ptr ptr, + long start_row, + boolean writable)); + METHOD(JBLOCKARRAY, access_big_barray, (big_barray_ptr ptr, + long start_row, + boolean writable)); + METHOD(void, free_big_sarray, (big_sarray_ptr ptr)); + METHOD(void, free_big_barray, (big_barray_ptr ptr)); +#ifdef XIE_SUPPORTED + METHOD(int, c_free_all, (compress_info_ptr cinfo)); + METHOD(int, d_free_all, (decompress_info_ptr cinfo)); +#else + METHOD(void, free_all, (void)); +#endif /* XIE_SUPPORTED */ + + long max_memory_to_use; /* maximum amount of memory to use */ +}; + +/* Macros to simplify using the error and trace message stuff */ +/* The first parameter is generally cinfo->emethods */ + +/* Fatal errors (print message and exit) */ +#ifndef XIE_SUPPORTED +#define ERREXIT(emeth,msg) ((*(emeth)->error_exit) (msg)) +#define ERREXIT1(emeth,msg,p1) ((emeth)->message_parm[0] = (p1), \ + (*(emeth)->error_exit) (msg)) +#define ERREXIT2(emeth,msg,p1,p2) ((emeth)->message_parm[0] = (p1), \ + (emeth)->message_parm[1] = (p2), \ + (*(emeth)->error_exit) (msg)) +#define ERREXIT3(emeth,msg,p1,p2,p3) ((emeth)->message_parm[0] = (p1), \ + (emeth)->message_parm[1] = (p2), \ + (emeth)->message_parm[2] = (p3), \ + (*(emeth)->error_exit) (msg)) +#define ERREXIT4(emeth,msg,p1,p2,p3,p4) ((emeth)->message_parm[0] = (p1), \ + (emeth)->message_parm[1] = (p2), \ + (emeth)->message_parm[2] = (p3), \ + (emeth)->message_parm[3] = (p4), \ + (*(emeth)->error_exit) (msg)) +#endif /* XIE_SUPPORTED */ + +#define MAKESTMT(stuff) do { stuff } while (0) + +#ifndef XIE_SUPPORTED +/* Nonfatal errors (we'll keep going, but the data is probably corrupt) */ +/* Note that warning count is incremented as a side-effect! */ +#define WARNMS(emeth,msg) \ + MAKESTMT( if ((emeth)->trace_level >= ((emeth)->num_warnings++ ? \ + (emeth)->more_warning_level : (emeth)->first_warning_level)){ \ + (*(emeth)->trace_message) (msg); } ) +#define WARNMS1(emeth,msg,p1) \ + MAKESTMT( if ((emeth)->trace_level >= ((emeth)->num_warnings++ ? \ + (emeth)->more_warning_level : (emeth)->first_warning_level)){ \ + (emeth)->message_parm[0] = (p1); \ + (*(emeth)->trace_message) (msg); } ) +#define WARNMS2(emeth,msg,p1,p2) \ + MAKESTMT( if ((emeth)->trace_level >= ((emeth)->num_warnings++ ? \ + (emeth)->more_warning_level : (emeth)->first_warning_level)){ \ + (emeth)->message_parm[0] = (p1); \ + (emeth)->message_parm[1] = (p2); \ + (*(emeth)->trace_message) (msg); } ) + +/* Informational/debugging messages */ +#define TRACEMS(emeth,lvl,msg) \ + MAKESTMT( if ((emeth)->trace_level >= (lvl)) { \ + (*(emeth)->trace_message) (msg); } ) +#define TRACEMS1(emeth,lvl,msg,p1) \ + MAKESTMT( if ((emeth)->trace_level >= (lvl)) { \ + (emeth)->message_parm[0] = (p1); \ + (*(emeth)->trace_message) (msg); } ) +#define TRACEMS2(emeth,lvl,msg,p1,p2) \ + MAKESTMT( if ((emeth)->trace_level >= (lvl)) { \ + (emeth)->message_parm[0] = (p1); \ + (emeth)->message_parm[1] = (p2); \ + (*(emeth)->trace_message) (msg); } ) +#define TRACEMS3(emeth,lvl,msg,p1,p2,p3) \ + MAKESTMT( if ((emeth)->trace_level >= (lvl)) { \ + int * _mp = (emeth)->message_parm; \ + *_mp++ = (p1); *_mp++ = (p2); *_mp = (p3); \ + (*(emeth)->trace_message) (msg); } ) +#define TRACEMS4(emeth,lvl,msg,p1,p2,p3,p4) \ + MAKESTMT( if ((emeth)->trace_level >= (lvl)) { \ + int * _mp = (emeth)->message_parm; \ + *_mp++ = (p1); *_mp++ = (p2); *_mp++ = (p3); *_mp = (p4); \ + (*(emeth)->trace_message) (msg); } ) +#define TRACEMS8(emeth,lvl,msg,p1,p2,p3,p4,p5,p6,p7,p8) \ + MAKESTMT( if ((emeth)->trace_level >= (lvl)) { \ + int * _mp = (emeth)->message_parm; \ + *_mp++ = (p1); *_mp++ = (p2); *_mp++ = (p3); *_mp++ = (p4); \ + *_mp++ = (p5); *_mp++ = (p6); *_mp++ = (p7); *_mp = (p8); \ + (*(emeth)->trace_message) (msg); } ) +#endif /* XIE_SUPPORTED */ + + +/* Methods used during JPEG compression. */ + +struct Compress_methods_struct { + /* Hook for user interface to get control after input_init */ + METHOD(void, c_ui_method_selection, (compress_info_ptr cinfo)); + /* Hook for user interface to do progress monitoring */ + METHOD(void, progress_monitor, (compress_info_ptr cinfo, + long loopcounter, long looplimit)); + /* Input image reading & conversion to standard form */ +#ifdef XIE_SUPPORTED + METHOD(int, input_init, (compress_info_ptr cinfo)); + METHOD(int, get_input_row, (compress_info_ptr cinfo, + JSAMPARRAY pixel_row)); + METHOD(int, input_term, (compress_info_ptr cinfo)); +#else + METHOD(void, input_init, (compress_info_ptr cinfo)); + METHOD(void, get_input_row, (compress_info_ptr cinfo, + JSAMPARRAY pixel_row)); + METHOD(void, input_term, (compress_info_ptr cinfo)); +#endif /* XIE_SUPPORTED */ + /* Color space and gamma conversion */ + METHOD(void, colorin_init, (compress_info_ptr cinfo)); + METHOD(void, get_sample_rows, (compress_info_ptr cinfo, + int rows_to_read, + JSAMPIMAGE image_data)); + METHOD(void, colorin_term, (compress_info_ptr cinfo)); + /* Expand picture data at edges */ + METHOD(void, edge_expand, (compress_info_ptr cinfo, + long input_cols, int input_rows, + long output_cols, int output_rows, + JSAMPIMAGE image_data)); + /* Downsample pixel values of a single component */ + /* There can be a different downsample method for each component */ + METHOD(void, downsample_init, (compress_info_ptr cinfo)); + downsample_ptr downsample[MAX_COMPS_IN_SCAN]; + METHOD(void, downsample_term, (compress_info_ptr cinfo)); + /* Extract samples in MCU order, process & hand off to output_method */ + /* The input is always exactly N MCU rows worth of data */ + METHOD(void, extract_init, (compress_info_ptr cinfo)); +#ifdef XIE_SUPPORTED + METHOD(int, extract_MCUs, (compress_info_ptr cinfo, + JSAMPIMAGE image_data, + int num_mcu_rows, + MCU_output_method_ptr output_method)); +#else + METHOD(void, extract_MCUs, (compress_info_ptr cinfo, + JSAMPIMAGE image_data, + int num_mcu_rows, + MCU_output_method_ptr output_method)); +#endif /* XIE_SUPPORTED */ + METHOD(void, extract_term, (compress_info_ptr cinfo)); + /* Entropy encoding parameter optimization */ + METHOD(void, entropy_optimize, (compress_info_ptr cinfo, + MCU_output_caller_ptr source_method)); +#ifdef XIE_SUPPORTED + /* Entropy encoding */ + METHOD(int, entropy_encode_init, (compress_info_ptr cinfo)); + METHOD(int, entropy_encode, (compress_info_ptr cinfo, + JBLOCK *MCU_data)); + METHOD(int, entropy_encode_term, (compress_info_ptr cinfo)); + /* JPEG file header construction */ + METHOD(int, write_file_header, (compress_info_ptr cinfo)); + METHOD(int, write_scan_header, (compress_info_ptr cinfo)); + METHOD(void, write_jpeg_data, (compress_info_ptr cinfo, + char *dataptr, + int datacount)); + METHOD(void, write_scan_trailer, (compress_info_ptr cinfo)); + METHOD(int, write_file_trailer, (compress_info_ptr cinfo)); +#else + /* Entropy encoding */ + METHOD(void, entropy_encode_init, (compress_info_ptr cinfo)); + METHOD(void, entropy_encode, (compress_info_ptr cinfo, + JBLOCK *MCU_data)); + METHOD(void, entropy_encode_term, (compress_info_ptr cinfo)); + /* JPEG file header construction */ + METHOD(void, write_file_header, (compress_info_ptr cinfo)); + METHOD(void, write_scan_header, (compress_info_ptr cinfo)); + METHOD(void, write_jpeg_data, (compress_info_ptr cinfo, + char *dataptr, + int datacount)); + METHOD(void, write_scan_trailer, (compress_info_ptr cinfo)); + METHOD(void, write_file_trailer, (compress_info_ptr cinfo)); +#endif /* XIE_SUPPORTED */ + /* Pipeline control */ + METHOD(void, c_pipeline_controller, (compress_info_ptr cinfo)); + METHOD(void, entropy_output, (compress_info_ptr cinfo, + char *dataptr, + int datacount)); + /* Overall control */ + METHOD(void, c_per_scan_method_selection, (compress_info_ptr cinfo)); +}; + +/* Methods used during JPEG decompression. */ + +struct Decompress_methods_struct { + /* Hook for user interface to get control after reading file header */ + METHOD(void, d_ui_method_selection, (decompress_info_ptr cinfo)); + /* Hook for user interface to process comment blocks */ +#ifdef XIE_SUPPORTED + METHOD(int, process_comment, (decompress_info_ptr cinfo, + long comment_length)); +#else + METHOD(void, process_comment, (decompress_info_ptr cinfo, + long comment_length)); +#endif /* XIE_SUPPORTED */ + /* Hook for user interface to do progress monitoring */ + METHOD(void, progress_monitor, (decompress_info_ptr cinfo, + long loopcounter, long looplimit)); + /* JPEG file scanning */ +#ifdef XIE_SUPPORTED + METHOD(int, read_file_header, (decompress_info_ptr cinfo)); + METHOD(int, read_scan_header, (decompress_info_ptr cinfo)); + METHOD(int, read_jpeg_data, (decompress_info_ptr cinfo)); + METHOD(int, resync_to_restart, (decompress_info_ptr cinfo, + int marker)); +#else + METHOD(void, read_file_header, (decompress_info_ptr cinfo)); + METHOD(boolean, read_scan_header, (decompress_info_ptr cinfo)); + METHOD(int, read_jpeg_data, (decompress_info_ptr cinfo)); + METHOD(void, resync_to_restart, (decompress_info_ptr cinfo, + int marker)); +#endif /* XIE_SUPPORTED */ + METHOD(void, read_scan_trailer, (decompress_info_ptr cinfo)); + METHOD(void, read_file_trailer, (decompress_info_ptr cinfo)); + /* Entropy decoding */ +#ifdef XIE_SUPPORTED + METHOD(int, entropy_decode_init, (decompress_info_ptr cinfo)); + METHOD(int, entropy_decode, (decompress_info_ptr cinfo, + JBLOCKROW *MCU_data)); +#else + METHOD(void, entropy_decode_init, (decompress_info_ptr cinfo)); + METHOD(void, entropy_decode, (decompress_info_ptr cinfo, + JBLOCKROW *MCU_data)); +#endif /* XIE_SUPPORTED */ + METHOD(void, entropy_decode_term, (decompress_info_ptr cinfo)); + /* MCU disassembly: fetch MCUs from entropy_decode, build coef array */ + /* The reverse_DCT step is in the same module for symmetry reasons */ + METHOD(void, disassemble_init, (decompress_info_ptr cinfo)); +#ifdef XIE_SUPPORTED + METHOD(int, disassemble_MCU, (decompress_info_ptr cinfo, + JBLOCKIMAGE image_data)); +#else + METHOD(void, disassemble_MCU, (decompress_info_ptr cinfo, + JBLOCKIMAGE image_data)); +#endif /* XIE_SUPPORTED */ + METHOD(void, reverse_DCT, (decompress_info_ptr cinfo, + JBLOCKIMAGE coeff_data, + JSAMPIMAGE output_data, int start_row)); + METHOD(void, disassemble_term, (decompress_info_ptr cinfo)); + /* Cross-block smoothing */ + METHOD(void, smooth_coefficients, (decompress_info_ptr cinfo, + jpeg_component_info *compptr, + JBLOCKROW above, + JBLOCKROW currow, + JBLOCKROW below, + JBLOCKROW output)); + /* Upsample pixel values of a single component */ + /* There can be a different upsample method for each component */ + METHOD(void, upsample_init, (decompress_info_ptr cinfo)); + upsample_ptr upsample[MAX_COMPS_IN_SCAN]; + METHOD(void, upsample_term, (decompress_info_ptr cinfo)); + /* Color space and gamma conversion */ + METHOD(void, colorout_init, (decompress_info_ptr cinfo)); + METHOD(void, color_convert, (decompress_info_ptr cinfo, + int num_rows, long num_cols, + JSAMPIMAGE input_data, + JSAMPIMAGE output_data)); + METHOD(void, colorout_term, (decompress_info_ptr cinfo)); + /* Color quantization */ + METHOD(void, color_quant_init, (decompress_info_ptr cinfo)); + METHOD(void, color_quantize, (decompress_info_ptr cinfo, + int num_rows, + JSAMPIMAGE input_data, + JSAMPARRAY output_data)); + METHOD(void, color_quant_prescan, (decompress_info_ptr cinfo, + int num_rows, + JSAMPIMAGE image_data, + JSAMPARRAY workspace)); + METHOD(void, color_quant_doit, (decompress_info_ptr cinfo, + quantize_caller_ptr source_method)); + METHOD(void, color_quant_term, (decompress_info_ptr cinfo)); + /* Output image writing */ +#ifdef XIE_SUPPORTED + METHOD(int, output_init, (decompress_info_ptr cinfo)); + METHOD(void, put_color_map, (decompress_info_ptr cinfo, + int num_colors, JSAMPARRAY colormap)); + METHOD(void, put_pixel_rows, (decompress_info_ptr cinfo, + int num_rows, + JSAMPIMAGE pixel_data)); + METHOD(int, output_term, (decompress_info_ptr cinfo)); +#else + METHOD(void, output_init, (decompress_info_ptr cinfo)); + METHOD(void, put_color_map, (decompress_info_ptr cinfo, + int num_colors, JSAMPARRAY colormap)); + METHOD(void, put_pixel_rows, (decompress_info_ptr cinfo, + int num_rows, + JSAMPIMAGE pixel_data)); + METHOD(void, output_term, (decompress_info_ptr cinfo)); +#endif /* XIE_SUPPORTED */ + /* Pipeline control */ + METHOD(void, d_pipeline_controller, (decompress_info_ptr cinfo)); + /* Overall control */ + METHOD(void, d_per_scan_method_selection, (decompress_info_ptr cinfo)); +}; + + +/* External declarations for routines that aren't called via method ptrs. */ +/* Note: use "j" as first char of names to minimize namespace pollution. */ +/* The PP macro hides prototype parameters from compilers that can't cope. */ + +#ifdef PROTO +#define PP(arglist) arglist +#else +#define PP(arglist) () +#endif + + +/* main entry for compression */ +EXTERN void jpeg_compress PP((compress_info_ptr cinfo)); + +/* default parameter setup for compression */ +#ifdef XIE_SUPPORTED +EXTERN int j_c_defaults PP((compress_info_ptr cinfo, int quality, + boolean force_baseline)); +EXTERN void j_monochrome_default PP((compress_info_ptr cinfo)); +EXTERN int j_set_quality PP((compress_info_ptr cinfo, int quality, + boolean force_baseline)); +/* advanced compression parameter setup aids */ +EXTERN int j_add_quant_table PP((compress_info_ptr cinfo, int which_tbl, + const QUANT_VAL *basic_table, + int scale_factor, boolean force_baseline)); +#else +EXTERN void j_c_defaults PP((compress_info_ptr cinfo, int quality, + boolean force_baseline)); +EXTERN void j_monochrome_default PP((compress_info_ptr cinfo)); +EXTERN void j_set_quality PP((compress_info_ptr cinfo, int quality, + boolean force_baseline)); +/* advanced compression parameter setup aids */ +EXTERN void j_add_quant_table PP((compress_info_ptr cinfo, int which_tbl, + const QUANT_VAL *basic_table, + int scale_factor, boolean force_baseline)); +#endif /* XIE_SUPPORTED */ +EXTERN int j_quality_scaling PP((int quality)); + +/* main entry for decompression */ +EXTERN void jpeg_decompress PP((decompress_info_ptr cinfo)); + +/* default parameter setup for decompression */ +EXTERN void j_d_defaults PP((decompress_info_ptr cinfo, + boolean standard_buffering)); + +/* forward DCT */ +EXTERN void j_fwd_dct PP((DCTBLOCK data)); +/* inverse DCT */ +EXTERN void j_rev_dct PP((DCTBLOCK data)); + +/* utility routines in jutils.c */ +EXTERN long jround_up PP((long a, long b)); +EXTERN void jcopy_sample_rows PP((JSAMPARRAY input_array, int source_row, + JSAMPARRAY output_array, int dest_row, + int num_rows, long num_cols)); +EXTERN void jcopy_block_row PP((JBLOCKROW input_row, JBLOCKROW output_row, + long num_blocks)); +EXTERN void jzero_far PP((pointer target, size_t bytestozero)); + +/* method selection routines for compression modules */ +EXTERN void jselcpipeline PP((compress_info_ptr cinfo)); /* jcpipe.c */ +EXTERN void jselchuffman PP((compress_info_ptr cinfo)); /* jchuff.c */ +EXTERN void jselcarithmetic PP((compress_info_ptr cinfo)); /* jcarith.c */ +EXTERN void jselexpand PP((compress_info_ptr cinfo)); /* jcexpand.c */ +EXTERN void jseldownsample PP((compress_info_ptr cinfo)); /* jcsample.c */ +EXTERN void jselcmcu PP((compress_info_ptr cinfo)); /* jcmcu.c */ +EXTERN void jselccolor PP((compress_info_ptr cinfo)); /* jccolor.c */ +/* The user interface should call one of these to select input format: */ +EXTERN void jselrgif PP((compress_info_ptr cinfo)); /* jrdgif.c */ +EXTERN void jselrppm PP((compress_info_ptr cinfo)); /* jrdppm.c */ +EXTERN void jselrrle PP((compress_info_ptr cinfo)); /* jrdrle.c */ +EXTERN void jselrtarga PP((compress_info_ptr cinfo)); /* jrdtarga.c */ +/* and one of these to select output header format: */ +EXTERN void jselwjfif PP((compress_info_ptr cinfo)); /* jwrjfif.c */ + +/* method selection routines for decompression modules */ +EXTERN void jseldpipeline PP((decompress_info_ptr cinfo)); /* jdpipe.c */ +EXTERN void jseldhuffman PP((decompress_info_ptr cinfo)); /* jdhuff.c */ +EXTERN void jseldarithmetic PP((decompress_info_ptr cinfo)); /* jdarith.c */ +EXTERN void jseldmcu PP((decompress_info_ptr cinfo)); /* jdmcu.c */ +EXTERN void jselbsmooth PP((decompress_info_ptr cinfo)); /* jbsmooth.c */ +EXTERN void jselupsample PP((decompress_info_ptr cinfo)); /* jdsample.c */ +EXTERN void jseldcolor PP((decompress_info_ptr cinfo)); /* jdcolor.c */ +EXTERN void jsel1quantize PP((decompress_info_ptr cinfo)); /* jquant1.c */ +EXTERN void jsel2quantize PP((decompress_info_ptr cinfo)); /* jquant2.c */ +/* The user interface should call one of these to select input format: */ +EXTERN void jselrjfif PP((decompress_info_ptr cinfo)); /* jrdjfif.c */ +/* and one of these to select output image format: */ +EXTERN void jselwgif PP((decompress_info_ptr cinfo)); /* jwrgif.c */ +EXTERN void jselwppm PP((decompress_info_ptr cinfo)); /* jwrppm.c */ +EXTERN void jselwrle PP((decompress_info_ptr cinfo)); /* jwrrle.c */ +EXTERN void jselwtarga PP((decompress_info_ptr cinfo)); /* jwrtarga.c */ + +/* method selection routines for system-dependent modules */ +EXTERN void jselerror PP((external_methods_ptr emethods)); /* jerror.c */ +#ifdef XIE_SUPPORTED +EXTERN void jcselmemmgr PP((compress_info_ptr cinfo, + external_methods_ptr emethods)); /* jmemmgr.c */ +EXTERN void jdselmemmgr PP((decompress_info_ptr cinfo, + external_methods_ptr emethods)); /* jmemmgr.c */ +#else +EXTERN void jselmemmgr PP((external_methods_ptr emethods)); /* jmemmgr.c */ +#endif /* XIE_SUPPORTED */ + + +/* We assume that right shift corresponds to signed division by 2 with + * rounding towards minus infinity. This is correct for typical "arithmetic + * shift" instructions that shift in copies of the sign bit. But some + * C compilers implement >> with an unsigned shift. For these machines you + * must define RIGHT_SHIFT_IS_UNSIGNED. + * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity. + * It is only applied with constant shift counts. SHIFT_TEMPS must be + * included in the variables of any routine using RIGHT_SHIFT. + */ + +#ifdef RIGHT_SHIFT_IS_UNSIGNED +#define SHIFT_TEMPS INT32 shift_temp; +#define RIGHT_SHIFT(x,shft) \ + ((shift_temp = (x)) < 0 ? \ + (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \ + (shift_temp >> (shft))) +#else +#define SHIFT_TEMPS +#define RIGHT_SHIFT(x,shft) ((x) >> (shft)) +#endif + + +/* Miscellaneous useful macros */ + +#undef MAX +#define MAX(a,b) ((a) > (b) ? (a) : (b)) +#undef MIN +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + + +#define RST0 0xD0 /* RST0 marker code */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jrdjfif.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jrdjfif.c new file mode 100644 index 0000000..66a85ab --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jrdjfif.c @@ -0,0 +1,1622 @@ +/* $XConsortium: jrdjfif.c /main/5 1995/12/02 16:51:41 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/* Module jrdjfif.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., October 1993 + +****************************************************************************/ + +/* + * jrdjfif.c + * + * Copyright (C) 1991, 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains routines to decode standard JPEG file headers/markers. + * This code will handle "raw JPEG" and JFIF-convention JPEG files. + * + * You can also use this module to decode a raw-JPEG or JFIF-standard data + * stream that is embedded within a larger file. To do that, you must + * position the file to the JPEG SOI marker (0xFF/0xD8) that begins the + * data sequence to be decoded. If nothing better is possible, you can scan + * the file until you see the SOI marker, then use JUNGETC to push it back. + * + * This module relies on the JGETC macro and the read_jpeg_data method (which + * is provided by the user interface) to read from the JPEG data stream. + * Therefore, this module is not dependent on any particular assumption about + * the data source; it need not be a stdio stream at all. (This fact does + * NOT carry over to more complex JPEG file formats such as JPEG-in-TIFF; + * those format control modules may well need to assume stdio input.) + * + * These routines are invoked via the methods read_file_header, + * read_scan_header, read_jpeg_data, read_scan_trailer, and read_file_trailer. + */ + +#include "jinclude.h" + +#ifdef JFIF_SUPPORTED + +#ifdef XIE_SUPPORTED +#define M_EOB -1 +#define M_SOF0 0xc0 +#define M_SOF1 0xc1 +#define M_SOF2 0xc2 +#define M_SOF3 0xc3 + +#define M_SOF5 0xc5 +#define M_SOF6 0xc6 +#define M_SOF7 0xc7 + +#define M_JPG 0xc8 +#define M_SOF9 0xc9 +#define M_SOF10 0xca +#define M_SOF11 0xcb + +#define M_SOF13 0xcd +#define M_SOF14 0xce +#define M_SOF15 0xcf + +#define M_DHT 0xc4 + +#define M_DAC 0xcc + +#define M_RST0 0xd0 +#define M_RST1 0xd1 +#define M_RST2 0xd2 +#define M_RST3 0xd3 +#define M_RST4 0xd4 +#define M_RST5 0xd5 +#define M_RST6 0xd6 +#define M_RST7 0xd7 + +#define M_SOI 0xd8 +#define M_EOI 0xd9 +#define M_SOS 0xda +#define M_DQT 0xdb +#define M_DNL 0xdc +#define M_DRI 0xdd +#define M_DHP 0xde +#define M_EXP 0xdf + +#define M_APP0 0xe0 +#define M_APP15 0xef + +#define M_JPG0 0xf0 +#define M_JPG13 0xfd +#define M_COM 0xfe + +#define M_TEM 0x01 + +#define M_ERROR 0x100 +#else +typedef enum { /* JPEG marker codes */ + M_SOF0 = 0xc0, + M_SOF1 = 0xc1, + M_SOF2 = 0xc2, + M_SOF3 = 0xc3, + + M_SOF5 = 0xc5, + M_SOF6 = 0xc6, + M_SOF7 = 0xc7, + + M_JPG = 0xc8, + M_SOF9 = 0xc9, + M_SOF10 = 0xca, + M_SOF11 = 0xcb, + + M_SOF13 = 0xcd, + M_SOF14 = 0xce, + M_SOF15 = 0xcf, + + M_DHT = 0xc4, + + M_DAC = 0xcc, + + M_RST0 = 0xd0, + M_RST1 = 0xd1, + M_RST2 = 0xd2, + M_RST3 = 0xd3, + M_RST4 = 0xd4, + M_RST5 = 0xd5, + M_RST6 = 0xd6, + M_RST7 = 0xd7, + + M_SOI = 0xd8, + M_EOI = 0xd9, + M_SOS = 0xda, + M_DQT = 0xdb, + M_DNL = 0xdc, + M_DRI = 0xdd, + M_DHP = 0xde, + M_EXP = 0xdf, + + M_APP0 = 0xe0, + M_APP15 = 0xef, + + M_JPG0 = 0xf0, + M_JPG13 = 0xfd, + M_COM = 0xfe, + + M_TEM = 0x01, + + M_ERROR = 0x100 +} JPEG_MARKER; +#endif /* XIE_SUPPORTED */ + + +/* + * Reload the input buffer after it's been emptied, and return the next byte. + * This is exported for direct use by the entropy decoder. + * See the JGETC macro for calling conditions. Note in particular that + * read_jpeg_data may NOT return EOF. If no more data is available, it must + * exit via ERREXIT, or perhaps synthesize fake data (such as an RST marker). + * For error recovery purposes, synthesizing an EOI marker is probably best. + * + * For this header control module, read_jpeg_data is supplied by the + * user interface. However, header formats that require random access + * to the input file would need to supply their own code. This code is + * left here to indicate what is required. + */ + +#ifndef XIE_SUPPORTED +#if NOTDEF /* not needed in this module */ + +METHODDEF int +read_jpeg_data (decompress_info_ptr cinfo) +{ + cinfo->next_input_byte = cinfo->input_buffer + MIN_UNGET; + + cinfo->bytes_in_buffer = (int) JFREAD(cinfo->input_file, + cinfo->next_input_byte, + JPEG_BUF_SIZE); + + if (cinfo->bytes_in_buffer <= 0) { + WARNMS(cinfo->emethods, "Premature EOF in JPEG file"); + cinfo->next_input_byte[0] = (char) 0xFF; + cinfo->next_input_byte[1] = (char) M_EOI; + cinfo->bytes_in_buffer = 2; + } + + return JGETC(cinfo); +} + +#endif +#endif /* XIE_SUPPORTED */ + + +/* + * Routines to parse JPEG markers & save away the useful info. + */ + + +LOCAL INT32 +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +get_2bytes (decompress_info_ptr cinfo) +#else +get_2bytes (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +get_2bytes (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +/* Get a 2-byte unsigned integer (e.g., a marker parameter length field) */ +{ + INT32 a; +#ifdef XIE_SUPPORTED + INT32 b; + if ((a = JGETC(cinfo)) < 0) + return(-1); + if ((b = JGETC(cinfo)) < 0) + return(-1); + return (a << 8) + b; +#else + a = JGETC(cinfo); + return (a << 8) + JGETC(cinfo); +#endif /* XIE_SUPPORTED */ +} + + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +skip_variable (decompress_info_ptr cinfo, int code) +#else +skip_variable (cinfo, code) + decompress_info_ptr cinfo; + int code; +#endif /* NeedFunctionPrototypes */ +#else +LOCAL void +skip_variable (decompress_info_ptr cinfo, int code) +#endif /* XIE_SUPPORTED */ +/* Skip over an unknown or uninteresting variable-length marker */ +{ + INT32 length; + + length = get_2bytes(cinfo); +#ifdef XIE_SUPPORTED + if (length < 0) + return(-1); +#else + TRACEMS2(cinfo->emethods, 1, + "Skipping marker 0x%02x, length %u", code, (int) length); +#endif /* XIE_SUPPORTED */ + + for (length -= 2; length > 0; length--) +#ifdef XIE_SUPPORTED + if (JGETC(cinfo) < 0) + return(-1); +#else + (void) JGETC(cinfo); +#endif /* XIE_SUPPORTED */ + +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +get_dht (decompress_info_ptr cinfo) +#else +get_dht (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +LOCAL void +get_dht (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +/* Process a DHT marker */ +{ + INT32 length; + UINT8 bits[17]; + UINT8 huffval[256]; + int i, index, count; + HUFF_TBL **htblptr; +#ifdef XIE_SUPPORTED + int j; +#endif /* XIE_SUPPORTED */ + +#ifdef XIE_SUPPORTED + if ((length = get_2bytes(cinfo)) < 0) + return(-1); + length -= 2; +#else + length = get_2bytes(cinfo)-2; +#endif /* XIE_SUPPORTED */ + + + while (length > 0) { + index = JGETC(cinfo); +#ifdef XIE_SUPPORTED + if (index < 0) + return(-1); +#else + TRACEMS1(cinfo->emethods, 1, "Define Huffman Table 0x%02x", index); +#endif /* XIE_SUPPORTED */ + + bits[0] = 0; + count = 0; + for (i = 1; i <= 16; i++) { +#ifdef XIE_SUPPORTED + if ((j = JGETC(cinfo)) < 0) + return(-1); + bits[i] = (UINT8) j; +#else + bits[i] = (UINT8) JGETC(cinfo); +#endif /* XIE_SUPPORTED */ + count += bits[i]; + } + +#ifndef XIE_SUPPORTED + TRACEMS8(cinfo->emethods, 2, " %3d %3d %3d %3d %3d %3d %3d %3d", + bits[1], bits[2], bits[3], bits[4], + bits[5], bits[6], bits[7], bits[8]); + TRACEMS8(cinfo->emethods, 2, " %3d %3d %3d %3d %3d %3d %3d %3d", + bits[9], bits[10], bits[11], bits[12], + bits[13], bits[14], bits[15], bits[16]); +#endif /* XIE_SUPPORTED */ + + if (count > 256) +#ifdef XIE_SUPPORTED + return(XIE_ERR); +#else + ERREXIT(cinfo->emethods, "Bogus DHT counts"); +#endif /* XIE_SUPPORTED */ + + for (i = 0; i < count; i++) { +#ifdef XIE_SUPPORTED + if ((j = JGETC(cinfo)) < 0) + return(-1); + huffval[i] = (UINT8) j; +#else + huffval[i] = (UINT8) JGETC(cinfo); +#endif /* XIE_SUPPORTED */ + } + + length -= 1 + 16 + count; + + if (index & 0x10) { /* AC table definition */ + index -= 0x10; + htblptr = &cinfo->ac_huff_tbl_ptrs[index]; + } else { /* DC table definition */ + htblptr = &cinfo->dc_huff_tbl_ptrs[index]; + } + + if (index < 0 || index >= NUM_HUFF_TBLS) +#ifdef XIE_SUPPORTED + return(XIE_ERR); +#else + ERREXIT1(cinfo->emethods, "Bogus DHT index %d", index); +#endif /* XIE_SUPPORTED */ + +#ifdef XIE_SUPPORTED + if (*htblptr == NULL) + *htblptr = (HUFF_TBL *) (*cinfo->emethods->d_alloc_small) + (cinfo, SIZEOF(HUFF_TBL)); + if (*htblptr == (HUFF_TBL *) NULL) + return(XIE_ERR); +#else + if (*htblptr == NULL) + *htblptr = (HUFF_TBL *) (*cinfo->emethods->alloc_small) (SIZEOF(HUFF_TBL)); +#endif /* XIE_SUPPORTED */ + + MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits)); + MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval)); + } +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +get_dac (decompress_info_ptr cinfo) +#else +get_dac (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +LOCAL void +get_dac (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +/* Process a DAC marker */ +{ + INT32 length; + int index, val; + +#ifdef XIE_SUPPORTED + if ((length = get_2bytes(cinfo)) < 0) + return(-1); + length -= 2; +#else + length = get_2bytes(cinfo)-2; +#endif /* XIE_SUPPORTED */ + + while (length > 0) { + index = JGETC(cinfo); +#ifdef XIE_SUPPORTED + if (index < 0) + return(-1); +#endif /* XIE_SUPPORTED */ + val = JGETC(cinfo); +#ifdef XIE_SUPPORTED + if (val < 0) + return(-1); +#else + TRACEMS2(cinfo->emethods, 1, + "Define Arithmetic Table 0x%02x: 0x%02x", index, val); +#endif /* XIE_SUPPORTED */ + + if (index < 0 || index >= (2*NUM_ARITH_TBLS)) +#ifdef XIE_SUPPORTED + return(XIE_ERR); +#else + ERREXIT1(cinfo->emethods, "Bogus DAC index %d", index); +#endif /* XIE_SUPPORTED */ + + if (index >= NUM_ARITH_TBLS) { /* define AC table */ + cinfo->arith_ac_K[index-NUM_ARITH_TBLS] = (UINT8) val; + } else { /* define DC table */ + cinfo->arith_dc_L[index] = (UINT8) (val & 0x0F); + cinfo->arith_dc_U[index] = (UINT8) (val >> 4); + if (cinfo->arith_dc_L[index] > cinfo->arith_dc_U[index]) +#ifdef XIE_SUPPORTED + return(XIE_ERR); +#else + ERREXIT1(cinfo->emethods, "Bogus DAC value 0x%x", val); +#endif /* XIE_SUPPORTED */ + } + + length -= 2; + } +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +get_dqt (decompress_info_ptr cinfo) +#else +get_dqt (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +LOCAL void +get_dqt (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +/* Process a DQT marker */ +{ + INT32 length; + int n, i, prec; + UINT16 tmp; + QUANT_TBL_PTR quant_ptr; +#ifdef XIE_SUPPORTED + int j; +#endif /* XIE_SUPPORTED */ + +#ifdef XIE_SUPPORTED + if ((length = get_2bytes(cinfo)) < 0) + return(-1); + length -= 2; +#else + length = get_2bytes(cinfo)-2; +#endif /* XIE_SUPPORTED */ + + while (length > 0) { + n = JGETC(cinfo); +#ifdef XIE_SUPPORTED + if (n < 0) + return(-1); +#endif /* XIE_SUPPORTED */ + prec = n >> 4; + n &= 0x0F; + +#ifndef XIE_SUPPORTED + TRACEMS2(cinfo->emethods, 1, + "Define Quantization Table %d precision %d", n, prec); +#endif /* XIE_SUPPORTED */ + + if (n >= NUM_QUANT_TBLS) +#ifdef XIE_SUPPORTED + return(XIE_ERR); +#else + ERREXIT1(cinfo->emethods, "Bogus table number %d", n); +#endif /* XIE_SUPPORTED */ + +#ifdef XIE_SUPPORTED + if (cinfo->quant_tbl_ptrs[n] == NULL) + cinfo->quant_tbl_ptrs[n] = (QUANT_TBL_PTR) + (*cinfo->emethods->d_alloc_small) (cinfo, SIZEOF(QUANT_TBL)); + if (cinfo->quant_tbl_ptrs[n] == (QUANT_TBL_PTR) NULL) + return(XIE_ERR); +#else + if (cinfo->quant_tbl_ptrs[n] == NULL) + cinfo->quant_tbl_ptrs[n] = (QUANT_TBL_PTR) + (*cinfo->emethods->alloc_small) (SIZEOF(QUANT_TBL)); +#endif /* XIE_SUPPORTED */ + quant_ptr = cinfo->quant_tbl_ptrs[n]; + + for (i = 0; i < DCTSIZE2; i++) { +#ifdef XIE_SUPPORTED + j = JGETC(cinfo); + if (j < 0) + return(-1); + tmp = (UINT16) j; +#else + tmp = JGETC(cinfo); +#endif /* XIE_SUPPORTED */ + if (prec) { +#ifdef XIE_SUPPORTED + if ((j = JGETC(cinfo)) < 0) + return(-1); + tmp = (tmp<<8) + j; +#else + tmp = (tmp<<8) + JGETC(cinfo); +#endif /* XIE_SUPPORTED */ + } + quant_ptr[i] = tmp; + } + +#ifndef XIE_SUPPORTED + for (i = 0; i < DCTSIZE2; i += 8) { + TRACEMS8(cinfo->emethods, 2, " %4u %4u %4u %4u %4u %4u %4u %4u", + quant_ptr[i ], quant_ptr[i+1], quant_ptr[i+2], quant_ptr[i+3], + quant_ptr[i+4], quant_ptr[i+5], quant_ptr[i+6], quant_ptr[i+7]); + } +#endif /* XIE_SUPPORTED */ + + length -= DCTSIZE2+1; + if (prec) length -= DCTSIZE2; + } +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +get_dri (decompress_info_ptr cinfo) +#else +get_dri (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +LOCAL void +get_dri (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +/* Process a DRI marker */ +{ +#ifdef XIE_SUPPORTED + INT32 j; +#endif /* XIE_SUPPORTED */ + if (get_2bytes(cinfo) != 4) +#ifdef XIE_SUPPORTED + return(XIE_ERR); +#else + ERREXIT(cinfo->emethods, "Bogus length in DRI"); +#endif /* XIE_SUPPORTED */ + +#ifdef XIE_SUPPORTED + if ((j = get_2bytes(cinfo)) < 0) + return(-1); + cinfo->restart_interval = (UINT16) j; + + return(0); +#else + cinfo->restart_interval = (UINT16) get_2bytes(cinfo); + + TRACEMS1(cinfo->emethods, 1, + "Define Restart Interval %u", cinfo->restart_interval); +#endif /* XIE_SUPPORTED */ +} + + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +get_app0 (decompress_info_ptr cinfo) +#else +get_app0 (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +LOCAL void +get_app0 (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +/* Process an APP0 marker */ +{ +#define JFIF_LEN 14 + INT32 length; + UINT8 b[JFIF_LEN]; + int buffp; +#ifdef XIE_SUPPORTED + int j; +#endif /* XIE_SUPPORTED */ + +#ifdef XIE_SUPPORTED + if ((length = get_2bytes(cinfo)) < 0) + return(-1); + length -= 2; +#else + length = get_2bytes(cinfo)-2; +#endif /* XIE_SUPPORTED */ + + /* See if a JFIF APP0 marker is present */ + + if (length >= JFIF_LEN) { + for (buffp = 0; buffp < JFIF_LEN; buffp++) { +#ifdef XIE_SUPPORTED + if ((j = JGETC(cinfo)) < 0) + return(-1); + b[buffp] = (UINT8) j; +#else + b[buffp] = (UINT8) JGETC(cinfo); +#endif /* XIE_SUPPORTED */ + } + length -= JFIF_LEN; + + if (b[0]==0x4A && b[1]==0x46 && b[2]==0x49 && b[3]==0x46 && b[4]==0) { + /* Found JFIF APP0 marker: check version */ + /* Major version must be 1 */ + if (b[5] != 1) +#ifdef XIE_SUPPORTED + return(XIE_ERR); +#else + ERREXIT2(cinfo->emethods, "Unsupported JFIF revision number %d.%02d", + b[5], b[6]); + /* Minor version should be 0..2, but try to process anyway if newer */ + if (b[6] > 2) + TRACEMS2(cinfo->emethods, 1, "Warning: unknown JFIF revision number %d.%02d", + b[5], b[6]); +#endif /* XIE_SUPPORTED */ + /* Save info */ + cinfo->density_unit = b[7]; + cinfo->X_density = (b[8] << 8) + b[9]; + cinfo->Y_density = (b[10] << 8) + b[11]; + /* Assume colorspace is YCbCr, unless UI has overridden me */ + if (cinfo->jpeg_color_space == CS_UNKNOWN) + cinfo->jpeg_color_space = CS_YCbCr; +#ifndef XIE_SUPPORTED + TRACEMS3(cinfo->emethods, 1, "JFIF APP0 marker, density %dx%d %d", + cinfo->X_density, cinfo->Y_density, cinfo->density_unit); + if (b[12] | b[13]) + TRACEMS2(cinfo->emethods, 1, " with %d x %d thumbnail image", + b[12], b[13]); + if (length != ((INT32) b[12] * (INT32) b[13] * (INT32) 3)) + TRACEMS1(cinfo->emethods, 1, + "Warning: thumbnail image size does not match data length %u", + (int) length); +#endif /* XIE_SUPPORTED */ + } else { +#ifndef XIE_SUPPORTED + TRACEMS1(cinfo->emethods, 1, "Unknown APP0 marker (not JFIF), length %u", + (int) length + JFIF_LEN); +#endif /* XIE_SUPPORTED */ + } + } else { +#ifndef XIE_SUPPORTED + TRACEMS1(cinfo->emethods, 1, "Short APP0 marker, length %u", (int) length); +#endif /* XIE_SUPPORTED */ + } + + while (length-- > 0) /* skip any remaining data */ +#ifdef XIE_SUPPORTED + if (JGETC(cinfo) < 0) + return(-1); +#else + (void) JGETC(cinfo); +#endif /* XIE_SUPPORTED */ + +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +get_com (decompress_info_ptr cinfo) +#else +get_com (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +LOCAL void +get_com (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +/* Process a COM marker */ +/* Actually we just pass this off to an application-supplied routine */ +{ + INT32 length; + +#ifdef XIE_SUPPORTED + if ((length = get_2bytes(cinfo)) < 0) + return(-1); + length -= 2; +#else + length = get_2bytes(cinfo) - 2; + + TRACEMS1(cinfo->emethods, 1, "Comment, length %u", (int) length); +#endif /* XIE_SUPPORTED */ + + (*cinfo->methods->process_comment) (cinfo, (long) length); + +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +get_sof (decompress_info_ptr cinfo, int code) +#else +get_sof (cinfo, code) + decompress_info_ptr cinfo; + int code; +#endif /* NeedFunctionPrototypes */ +#else +LOCAL void +get_sof (decompress_info_ptr cinfo, int code) +#endif /* XIE_SUPPORTED */ +/* Process a SOFn marker */ +{ + INT32 length; + short ci; + int c; + jpeg_component_info * compptr; +#ifdef XIE_SUPPORTED + int j; + INT32 k; +#endif /* XIE_SUPPORTED */ + + length = get_2bytes(cinfo); +#ifdef XIE_SUPPORTED + if (length < 0) + return(-1); +#endif /* XIE_SUPPORTED */ + +#ifdef XIE_SUPPORTED + if ((j = JGETC(cinfo)) < 0) + return(-1); + cinfo->data_precision = j; + if ((k = get_2bytes(cinfo)) < 0) + return(-1); + cinfo->image_height = k; + if ((k = get_2bytes(cinfo)) < 0) + return(-1); + cinfo->image_width = k; + if ((j = JGETC(cinfo)) < 0) + return(-1); + cinfo->num_components = j; +#else + cinfo->data_precision = JGETC(cinfo); + cinfo->image_height = get_2bytes(cinfo); + cinfo->image_width = get_2bytes(cinfo); + cinfo->num_components = JGETC(cinfo); + + TRACEMS4(cinfo->emethods, 1, + "Start Of Frame 0x%02x: width=%u, height=%u, components=%d", + code, (int) cinfo->image_width, (int) cinfo->image_height, + cinfo->num_components); +#endif /* XIE_SUPPORTED */ + + /* We don't support files in which the image height is initially specified */ + /* as 0 and is later redefined by DNL. As long as we have to check that, */ + /* might as well have a general sanity check. */ + if (cinfo->image_height <= 0 || cinfo->image_width <= 0 + || cinfo->num_components <= 0) +#ifdef XIE_SUPPORTED + return(XIE_ERR); +#else + ERREXIT(cinfo->emethods, "Empty JPEG image (DNL not supported)"); +#endif /* XIE_SUPPORTED */ + +#ifdef EIGHT_BIT_SAMPLES + if (cinfo->data_precision != 8) +#ifdef XIE_SUPPORTED + return(XIE_ERR); +#else + ERREXIT(cinfo->emethods, "Unsupported JPEG data precision"); +#endif /* XIE_SUPPORTED */ +#endif +#ifdef TWELVE_BIT_SAMPLES + if (cinfo->data_precision != 12) /* this needs more thought?? */ +#ifdef XIE_SUPPORTED + return(XIE_ERR); +#else + ERREXIT(cinfo->emethods, "Unsupported JPEG data precision"); +#endif /* XIE_SUPPORTED */ +#endif +#ifdef SIXTEEN_BIT_SAMPLES + if (cinfo->data_precision != 16) /* this needs more thought?? */ +#ifdef XIE_SUPPORTED + return(XIE_ERR); +#else + ERREXIT(cinfo->emethods, "Unsupported JPEG data precision"); +#endif /* XIE_SUPPORTED */ +#endif + + if (length != (cinfo->num_components * 3 + 8)) +#ifdef XIE_SUPPORTED + return(XIE_ERR); +#else + ERREXIT(cinfo->emethods, "Bogus SOF length"); +#endif /* XIE_SUPPORTED */ + +#ifdef XIE_SUPPORTED + cinfo->comp_info = (jpeg_component_info *) (*cinfo->emethods->d_alloc_small) + (cinfo, (cinfo->num_components * SIZEOF(jpeg_component_info))); + if (cinfo->comp_info == (jpeg_component_info *) NULL) + return(XIE_ERR); +#else + cinfo->comp_info = (jpeg_component_info *) (*cinfo->emethods->alloc_small) + (cinfo->num_components * SIZEOF(jpeg_component_info)); +#endif /* XIE_SUPPORTED */ + + for (ci = 0; ci < cinfo->num_components; ci++) { + compptr = &cinfo->comp_info[ci]; + compptr->component_index = ci; +#ifdef XIE_SUPPORTED + if ((j = JGETC(cinfo)) < 0) + return(-1); + compptr->component_id = j; + if ((c = JGETC(cinfo)) < 0) + return(-1); + compptr->h_samp_factor = (c >> 4) & 15; + compptr->v_samp_factor = (c ) & 15; + if ((j = JGETC(cinfo)) < 0) + return(-1); + compptr->quant_tbl_no = j; +#else + compptr->component_id = JGETC(cinfo); + c = JGETC(cinfo); + compptr->h_samp_factor = (c >> 4) & 15; + compptr->v_samp_factor = (c ) & 15; + compptr->quant_tbl_no = JGETC(cinfo); + + TRACEMS4(cinfo->emethods, 1, " Component %d: %dhx%dv q=%d", + compptr->component_id, compptr->h_samp_factor, + compptr->v_samp_factor, compptr->quant_tbl_no); +#endif /* XIE_SUPPORTED */ + } +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +get_sos (decompress_info_ptr cinfo) +#else +get_sos (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +LOCAL void +get_sos (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +/* Process a SOS marker */ +{ + INT32 length; + int i, ci, n, c, cc; + jpeg_component_info * compptr; + + length = get_2bytes(cinfo); +#ifdef XIE_SUPPORTED + if (length < 0) + return(-1); +#endif /* XIE_SUPPORTED */ + + n = JGETC(cinfo); /* Number of components */ +#ifdef XIE_SUPPORTED + if (n < 0) + return(-1); +#endif /* XIE_SUPPORTED */ + cinfo->comps_in_scan = n; + length -= 3; + + if (length != (n * 2 + 3) || n < 1 || n > MAX_COMPS_IN_SCAN) +#ifdef XIE_SUPPORTED + return(XIE_ERR); +#else + ERREXIT(cinfo->emethods, "Bogus SOS length"); + + TRACEMS1(cinfo->emethods, 1, "Start Of Scan: %d components", n); +#endif /* XIE_SUPPORTED */ + + for (i = 0; i < n; i++) { + cc = JGETC(cinfo); +#ifdef XIE_SUPPORTED + if (cc < 0) + return(-1); +#endif /* XIE_SUPPORTED */ + c = JGETC(cinfo); +#ifdef XIE_SUPPORTED + if (c < 0) + return(-1); +#endif /* XIE_SUPPORTED */ + length -= 2; + + for (ci = 0; ci < cinfo->num_components; ci++) + if (cc == cinfo->comp_info[ci].component_id) + break; + + if (ci >= cinfo->num_components) +#ifdef XIE_SUPPORTED + return(XIE_ERR); +#else + ERREXIT(cinfo->emethods, "Invalid component number in SOS"); +#endif /* XIE_SUPPORTED */ + + compptr = &cinfo->comp_info[ci]; + cinfo->cur_comp_info[i] = compptr; + compptr->dc_tbl_no = (c >> 4) & 15; + compptr->ac_tbl_no = (c ) & 15; + +#ifndef XIE_SUPPORTED + TRACEMS3(cinfo->emethods, 1, " c%d: [dc=%d ac=%d]", cc, + compptr->dc_tbl_no, compptr->ac_tbl_no); +#endif /* XIE_SUPPORTED */ + } + + while (length > 0) { +#ifdef XIE_SUPPORTED + if (JGETC(cinfo) < 0) + return(-1); +#else + (void) JGETC(cinfo); +#endif /* XIE_SUPPORTED */ + length--; + } +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + + +LOCAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +get_soi (decompress_info_ptr cinfo) +#else +get_soi (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +/* Process an SOI marker */ +{ + int i; + +#else +get_soi (decompress_info_ptr cinfo) +/* Process an SOI marker */ +{ + int i; + + TRACEMS(cinfo->emethods, 1, "Start of Image"); +#endif /* XIE_SUPPORTED */ + + /* Reset all parameters that are defined to be reset by SOI */ + + for (i = 0; i < NUM_ARITH_TBLS; i++) { + cinfo->arith_dc_L[i] = 0; + cinfo->arith_dc_U[i] = 1; + cinfo->arith_ac_K[i] = 5; + } + cinfo->restart_interval = 0; + + cinfo->density_unit = 0; /* set default JFIF APP0 values */ + cinfo->X_density = 1; + cinfo->Y_density = 1; + + cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling */ +} + + +LOCAL int +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +next_marker (decompress_info_ptr cinfo) +#else +next_marker (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +next_marker (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +/* Find the next JPEG marker */ +/* Note that the output might not be a valid marker code, */ +/* but it will never be 0 or FF */ +{ + int c, nbytes; + +#ifdef XIE_SUPPORTED + /* Save the location of the next marker (for restart) */ + cinfo->XIEnext_input_byte = cinfo->next_input_byte; + cinfo->XIEbytes_in_buffer = cinfo->bytes_in_buffer; +#endif /* XIE_SUPPORTED */ + nbytes = 0; + do { + do { /* skip any non-FF bytes */ + nbytes++; + c = JGETC(cinfo); +#ifdef XIE_SUPPORTED + if (c < 0) + return(-1); +#endif /* XIE_SUPPORTED */ + } while (c != 0xFF); + do { /* skip any duplicate FFs */ + /* we don't increment nbytes here since extra FFs are legal */ + c = JGETC(cinfo); +#ifdef XIE_SUPPORTED + if (c < 0) + return(-1); +#endif /* XIE_SUPPORTED */ + } while (c == 0xFF); + } while (c == 0); /* repeat if it was a stuffed FF/00 */ + +#ifndef XIE_SUPPORTED + if (nbytes != 1) + WARNMS2(cinfo->emethods, + "Corrupt JPEG data: %d extraneous bytes before marker 0x%02x", + nbytes-1, c); +#endif /* XIE_SUPPORTED */ + + return c; +} + + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +process_tables (decompress_info_ptr cinfo) +#else +process_tables (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +/* Scan and process JPEG markers that can appear in any order */ +/* Return when an SOI, EOI, SOFn, or SOS is found */ +{ + int status; +#else +LOCAL JPEG_MARKER +process_tables (decompress_info_ptr cinfo) +/* Scan and process JPEG markers that can appear in any order */ +/* Return when an SOI, EOI, SOFn, or SOS is found */ +{ +#endif /* XIE_SUPPORTED */ + int c; + + while (TRUE) { + c = next_marker(cinfo); +#ifdef XIE_SUPPORTED + if (c < 0) + return(-1); +#endif /* XIE_SUPPORTED */ + + switch (c) { + case M_SOF0: + case M_SOF1: + case M_SOF2: + case M_SOF3: + case M_SOF5: + case M_SOF6: + case M_SOF7: + case M_JPG: + case M_SOF9: + case M_SOF10: + case M_SOF11: + case M_SOF13: + case M_SOF14: + case M_SOF15: + case M_SOI: + case M_EOI: + case M_SOS: +#ifdef XIE_SUPPORTED + return (c); +#else + return ((JPEG_MARKER) c); +#endif /* XIE_SUPPORTED */ + + case M_DHT: +#ifdef XIE_SUPPORTED + if ((status = get_dht(cinfo)) < 0) + return(status); +#else + get_dht(cinfo); +#endif /* XIE_SUPPORTED */ + break; + + case M_DAC: +#ifdef XIE_SUPPORTED + if ((status = get_dac(cinfo)) < 0) + return(status); +#else + get_dac(cinfo); +#endif /* XIE_SUPPORTED */ + break; + + case M_DQT: +#ifdef XIE_SUPPORTED + if ((status = get_dqt(cinfo)) < 0) + return(status); +#else + get_dqt(cinfo); +#endif /* XIE_SUPPORTED */ + break; + + case M_DRI: +#ifdef XIE_SUPPORTED + if ((status = get_dri(cinfo)) < 0) + return(status); +#else + get_dri(cinfo); +#endif /* XIE_SUPPORTED */ + break; + + case M_APP0: +#ifdef XIE_SUPPORTED + if ((status = get_app0(cinfo)) < 0) + return(status); +#else + get_app0(cinfo); +#endif /* XIE_SUPPORTED */ + break; + + case M_COM: +#ifdef XIE_SUPPORTED + if ((status = get_com(cinfo)) < 0) + return(status); +#else + get_com(cinfo); +#endif /* XIE_SUPPORTED */ + break; + + case M_RST0: /* these are all parameterless */ + case M_RST1: + case M_RST2: + case M_RST3: + case M_RST4: + case M_RST5: + case M_RST6: + case M_RST7: + case M_TEM: +#ifndef XIE_SUPPORTED + TRACEMS1(cinfo->emethods, 1, "Unexpected marker 0x%02x", c); +#endif /* XIE_SUPPORTED */ + break; + + default: /* must be DNL, DHP, EXP, APPn, JPGn, COM, or RESn */ +#ifdef XIE_SUPPORTED + if (skip_variable(cinfo, c) < 0) + return(-1); +#else + skip_variable(cinfo, c); +#endif /* XIE_SUPPORTED */ + break; + } + } +} + + + +/* + * Initialize and read the file header (everything through the SOF marker). + */ + +#ifdef XIE_SUPPORTED +METHODDEF int +#if NeedFunctionPrototypes +read_file_header (decompress_info_ptr cinfo) +#else +read_file_header (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +{ + int i, j; + int status; +#else +METHODDEF void +read_file_header (decompress_info_ptr cinfo) +{ +#endif /* XIE_SUPPORTED */ + int c; + + /* Demand an SOI marker at the start of the file --- otherwise it's + * probably not a JPEG file at all. If the user interface wants to support + * nonstandard headers in front of the SOI, it must skip over them itself + * before calling jpeg_decompress(). + */ +#ifdef XIE_SUPPORTED + if (cinfo->XIErestart != XIE_RRFH) { /* don't read signature bytes on restart */ + if ((i = JGETC(cinfo)) < 0) + return(-1); + if ((j = JGETC(cinfo)) < 0) + return(-1); + if (i != 0xFF || j != M_SOI) + return(XIE_ERR); + + get_soi(cinfo); /* OK, process SOI */ + } +#else + if (JGETC(cinfo) != 0xFF || JGETC(cinfo) != M_SOI) + ERREXIT(cinfo->emethods, "Not a JPEG file"); + + get_soi(cinfo); /* OK, process SOI */ +#endif /* XIE_SUPPORTED */ + + /* Process markers until SOF */ + c = process_tables(cinfo); +#ifdef XIE_SUPPORTED + if (c < 0) + return(c); +#endif /* XIE_SUPPORTED */ + + switch (c) { + case M_SOF0: + case M_SOF1: +#ifdef XIE_SUPPORTED + if ((status = get_sof(cinfo, c)) < 0) + return(status); +#else + get_sof(cinfo, c); +#endif /* XIE_SUPPORTED */ + cinfo->arith_code = FALSE; + break; + + case M_SOF9: +#ifdef XIE_SUPPORTED + if ((status = get_sof(cinfo, c)) < 0) + return(status); +#else + get_sof(cinfo, c); +#endif /* XIE_SUPPORTED */ + cinfo->arith_code = TRUE; + break; + + default: +#ifdef XIE_SUPPORTED + return(XIE_ERR); +#else + ERREXIT1(cinfo->emethods, "Unsupported SOF marker type 0x%02x", c); +#endif /* XIE_SUPPORTED */ + break; + } + + /* Figure out what colorspace we have */ + /* (too bad the JPEG committee didn't provide a real way to specify this) */ + + switch (cinfo->num_components) { + case 1: + cinfo->jpeg_color_space = CS_GRAYSCALE; + break; + + case 3: + /* if we saw a JFIF marker, leave it set to YCbCr; */ + /* also leave it alone if UI has provided a value */ + if (cinfo->jpeg_color_space == CS_UNKNOWN) { + short cid0 = cinfo->comp_info[0].component_id; + short cid1 = cinfo->comp_info[1].component_id; + short cid2 = cinfo->comp_info[2].component_id; + + if (cid0 == 1 && cid1 == 2 && cid2 == 3) + cinfo->jpeg_color_space = CS_YCbCr; /* assume it's JFIF w/out marker */ + else if (cid0 == 1 && cid1 == 4 && cid2 == 5) + cinfo->jpeg_color_space = CS_YIQ; /* prototype's YIQ matrix */ + else { +#ifndef XIE_SUPPORTED + TRACEMS3(cinfo->emethods, 1, + "Unrecognized component IDs %d %d %d, assuming YCbCr", + cid0, cid1, cid2); +#endif /* XIE_SUPPORTED */ + cinfo->jpeg_color_space = CS_YCbCr; + } + } + break; + + case 4: + cinfo->jpeg_color_space = CS_CMYK; + break; + + default: + cinfo->jpeg_color_space = CS_UNKNOWN; + break; + } +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + + +/* + * Read the start of a scan (everything through the SOS marker). + * Return TRUE if find SOS, FALSE if find EOI. + */ + +#ifdef XIE_SUPPORTED +METHODDEF int +#if NeedFunctionPrototypes +read_scan_header (decompress_info_ptr cinfo) +#else +read_scan_header (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +METHODDEF boolean +read_scan_header (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + int c; + + /* Process markers until SOS or EOI */ + c = process_tables(cinfo); +#ifdef XIE_SUPPORTED + if (c < 0) + return(c); +#endif /* XIE_SUPPORTED */ + + switch (c) { + case M_SOS: +#ifdef XIE_SUPPORTED + return(get_sos(cinfo)); /* 0, OK; -1, read error */ +#else + get_sos(cinfo); + return TRUE; +#endif /* XIE_SUPPORTED */ + + case M_EOI: +#ifndef XIE_SUPPORTED + TRACEMS(cinfo->emethods, 1, "End Of Image"); +#endif /* XIE_SUPPORTED */ + return FALSE; + + default: +#ifdef XIE_SUPPORTED + return(XIE_ERR); +#else + ERREXIT1(cinfo->emethods, "Unexpected marker 0x%02x", c); +#endif /* XIE_SUPPORTED */ + break; + } +#ifdef XIE_SUPPORTED + return(0); +#else + return FALSE; /* keeps lint happy */ +#endif /* XIE_SUPPORTED */ +} + + +/* + * The entropy decoder calls this routine if it finds a marker other than + * the restart marker it was expecting. (This code is *not* used unless + * a nonzero restart interval has been declared.) The passed parameter is + * the marker code actually found (might be anything, except 0 or FF). + * The desired restart marker is that indicated by cinfo->next_restart_num. + * This routine is supposed to apply whatever error recovery strategy seems + * appropriate in order to position the input stream to the next data segment. + * For some file formats (eg, TIFF) extra information such as tile boundary + * pointers may be available to help in this decision. + * + * This implementation is substantially constrained by wanting to treat the + * input as a data stream; this means we can't back up. (For instance, we + * generally can't fseek() if the input is a Unix pipe.) Therefore, we have + * only the following actions to work with: + * 1. Do nothing, let the entropy decoder resume at next byte of file. + * 2. Read forward until we find another marker, discarding intervening + * data. (In theory we could look ahead within the current bufferload, + * without having to discard data if we don't find the desired marker. + * This idea is not implemented here, in part because it makes behavior + * dependent on buffer size and chance buffer-boundary positions.) + * 3. Push back the passed marker (with JUNGETC). This will cause the + * entropy decoder to process an empty data segment, inserting dummy + * zeroes, and then re-read the marker we pushed back. + * #2 is appropriate if we think the desired marker lies ahead, while #3 is + * appropriate if the found marker is a future restart marker (indicating + * that we have missed the desired restart marker, probably because it got + * corrupted). + + * We apply #2 or #3 if the found marker is a restart marker no more than + * two counts behind or ahead of the expected one. We also apply #2 if the + * found marker is not a legal JPEG marker code (it's certainly bogus data). + * If the found marker is a restart marker more than 2 counts away, we do #1 + * (too much risk that the marker is erroneous; with luck we will be able to + * resync at some future point). + * For any valid non-restart JPEG marker, we apply #3. This keeps us from + * overrunning the end of a scan. An implementation limited to single-scan + * files might find it better to apply #2 for markers other than EOI, since + * any other marker would have to be bogus data in that case. + */ + +#ifdef XIE_SUPPORTED +METHODDEF int +#if NeedFunctionPrototypes +resync_to_restart (decompress_info_ptr cinfo, int marker) +#else +resync_to_restart (cinfo, marker) + decompress_info_ptr cinfo; + int marker; +#endif /* NeedFunctionPrototypes */ +#else +METHODDEF void +resync_to_restart (decompress_info_ptr cinfo, int marker) +#endif /* XIE_SUPPORTED */ +{ + int desired = cinfo->next_restart_num; + int action = 1; + + /* Always put up a warning. */ +#ifndef XIE_SUPPORTED + WARNMS2(cinfo->emethods, + "Corrupt JPEG data: found 0x%02x marker instead of RST%d", + marker, desired); +#endif /* XIE_SUPPORTED */ + /* Outer loop handles repeated decision after scanning forward. */ + for (;;) { + if (marker < (int) M_SOF0) + action = 2; /* invalid marker */ + else if (marker < (int) M_RST0 || marker > (int) M_RST7) + action = 3; /* valid non-restart marker */ + else { + if (marker == ((int) M_RST0 + ((desired+1) & 7)) || + marker == ((int) M_RST0 + ((desired+2) & 7))) + action = 3; /* one of the next two expected restarts */ + else if (marker == ((int) M_RST0 + ((desired-1) & 7)) || + marker == ((int) M_RST0 + ((desired-2) & 7))) + action = 2; /* a prior restart, so advance */ + else + action = 1; /* desired restart or too far away */ + } +#ifndef XIE_SUPPORTED + TRACEMS2(cinfo->emethods, 4, + "At marker 0x%02x, recovery action %d", marker, action); +#endif /* XIE_SUPPORTED */ + switch (action) { + case 1: + /* Let entropy decoder resume processing. */ +#ifdef XIE_SUPPORTED + return(0); +#else + return; +#endif /* XIE_SUPPORTED */ + case 2: + /* Scan to the next marker, and repeat the decision loop. */ + marker = next_marker(cinfo); +#ifdef XIE_SUPPORTED + if (marker < 0) + return(-1); +#endif /* XIE_SUPPORTED */ + break; + case 3: + /* Put back this marker & return. */ + /* Entropy decoder will be forced to process an empty segment. */ + JUNGETC(marker, cinfo); + JUNGETC(0xFF, cinfo); +#ifdef XIE_SUPPORTED + return(0); +#else + return; +#endif /* XIE_SUPPORTED */ + } + } +} + + +/* + * Finish up after a compressed scan (series of read_jpeg_data calls); + * prepare for another read_scan_header call. + */ + +#ifndef XIE_SUPPORTED +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +read_scan_trailer (decompress_info_ptr cinfo) +#else +read_scan_trailer (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +read_scan_trailer (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + /* no work needed */ +} +#endif /* XIE_SUPPORTED */ + +/* + * Finish up at the end of the file. + */ + +#ifndef XIE_SUPPORTED +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +read_file_trailer (decompress_info_ptr cinfo) +#else +read_file_trailer (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +read_file_trailer (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + /* no work needed */ +} +#endif /* XIE_SUPPORTED */ + +/* + * The method selection routine for standard JPEG header reading. + * Note that this must be called by the user interface before calling + * jpeg_decompress. When a non-JFIF file is to be decompressed (TIFF, + * perhaps), the user interface must discover the file type and call + * the appropriate method selection routine. + */ + +GLOBAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +jselrjfif (decompress_info_ptr cinfo) +#else +jselrjfif (cinfo) + decompress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +jselrjfif (decompress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + cinfo->methods->read_file_header = read_file_header; + cinfo->methods->read_scan_header = read_scan_header; + /* For JFIF/raw-JPEG format, the user interface supplies read_jpeg_data. */ +#ifndef XIE_SUPPORTED +#if NOTDEF + cinfo->methods->read_jpeg_data = read_jpeg_data; +#endif +#endif /* XIE_SUPPORTED */ + cinfo->methods->resync_to_restart = resync_to_restart; +#ifndef XIE_SUPPORTED + cinfo->methods->read_scan_trailer = read_scan_trailer; + cinfo->methods->read_file_trailer = read_file_trailer; +#endif /* XIE_SUPPORTED */ +} + +#endif /* JFIF_SUPPORTED */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jrevdct.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jrevdct.c new file mode 100644 index 0000000..4ae15e5 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jrevdct.c @@ -0,0 +1,452 @@ +/* $XConsortium: jrevdct.c,v 1.4 94/04/17 20:35:45 rws Exp $ */ +/* Module jrevdct.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., October 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +/* + * jrevdct.c + * + * Copyright (C) 1991, 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the basic inverse-DCT transformation subroutine. + * + * This implementation is based on an algorithm described in + * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT + * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, + * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. + * The primary algorithm described there uses 11 multiplies and 29 adds. + * We use their alternate method with 12 multiplies and 32 adds. + * The advantage of this method is that no data path contains more than one + * multiplication; this allows a very simple and accurate implementation in + * scaled fixed-point arithmetic, with a minimal number of shifts. + */ + +#include "jinclude.h" + +/* + * This routine is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* + * A 2-D IDCT can be done by 1-D IDCT on each row followed by 1-D IDCT + * on each column. Direct algorithms are also available, but they are + * much more complex and seem not to be any faster when reduced to code. + * + * The poop on this scaling stuff is as follows: + * + * Each 1-D IDCT step produces outputs which are a factor of sqrt(N) + * larger than the true IDCT outputs. The final outputs are therefore + * a factor of N larger than desired; since N=8 this can be cured by + * a simple right shift at the end of the algorithm. The advantage of + * this arrangement is that we save two multiplications per 1-D IDCT, + * because the y0 and y4 inputs need not be divided by sqrt(N). + * + * We have to do addition and subtraction of the integer inputs, which + * is no problem, and multiplication by fractional constants, which is + * a problem to do in integer arithmetic. We multiply all the constants + * by CONST_SCALE and convert them to integer constants (thus retaining + * CONST_BITS bits of precision in the constants). After doing a + * multiplication we have to divide the product by CONST_SCALE, with proper + * rounding, to produce the correct output. This division can be done + * cheaply as a right shift of CONST_BITS bits. We postpone shifting + * as long as possible so that partial sums can be added together with + * full fractional precision. + * + * The outputs of the first pass are scaled up by PASS1_BITS bits so that + * they are represented to better-than-integral precision. These outputs + * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word + * with the recommended scaling. (To scale up 12-bit sample data further, an + * intermediate INT32 array would be needed.) + * + * To avoid overflow of the 32-bit intermediate results in pass 2, we must + * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis + * shows that the values given below are the most effective. + */ + +#ifdef EIGHT_BIT_SAMPLES +#define CONST_BITS 13 +#define PASS1_BITS 2 +#else +#define CONST_BITS 13 +#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ +#endif + +#define ONE ((INT32) 1) + +#define CONST_SCALE (ONE << CONST_BITS) + +/* Convert a positive real constant to an integer scaled by CONST_SCALE. */ + +#define FIX(x) ((INT32) ((x) * CONST_SCALE + 0.5)) + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 13 +#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */ +#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */ +#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */ +#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ +#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ +#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */ +#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */ +#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ +#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */ +#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */ +#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ +#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */ +#else +#define FIX_0_298631336 FIX(0.298631336) +#define FIX_0_390180644 FIX(0.390180644) +#define FIX_0_541196100 FIX(0.541196100) +#define FIX_0_765366865 FIX(0.765366865) +#define FIX_0_899976223 FIX(0.899976223) +#define FIX_1_175875602 FIX(1.175875602) +#define FIX_1_501321110 FIX(1.501321110) +#define FIX_1_847759065 FIX(1.847759065) +#define FIX_1_961570560 FIX(1.961570560) +#define FIX_2_053119869 FIX(2.053119869) +#define FIX_2_562915447 FIX(2.562915447) +#define FIX_3_072711026 FIX(3.072711026) +#endif + + +/* Descale and correctly round an INT32 value that's scaled by N bits. + * We assume RIGHT_SHIFT rounds towards minus infinity, so adding + * the fudge factor is correct for either sign of X. + */ + +#define DESCALE(x,n) RIGHT_SHIFT((x) + (ONE << ((n)-1)), n) + +/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. + * For 8-bit samples with the recommended scaling, all the variable + * and constant values involved are no more than 16 bits wide, so a + * 16x16->32 bit multiply can be used instead of a full 32x32 multiply; + * this provides a useful speedup on many machines. + * There is no way to specify a 16x16->32 multiply in portable C, but + * some C compilers will do the right thing if you provide the correct + * combination of casts. + * NB: for 12-bit samples, a full 32-bit multiplication will be needed. + */ + +#ifdef EIGHT_BIT_SAMPLES +#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */ +#define MULTIPLY(var,const) (((INT16) (var)) * ((INT16) (const))) +#endif +#ifdef SHORTxLCONST_32 /* known to work with Microsoft C 6.0 */ +#define MULTIPLY(var,const) (((INT16) (var)) * ((INT32) (const))) +#endif +#endif + +#ifndef MULTIPLY /* default definition */ +#define MULTIPLY(var,const) ((var) * (const)) +#endif + + +/* + * Perform the inverse DCT on one block of coefficients. + */ + +GLOBAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +j_rev_dct (DCTBLOCK data) +#else +j_rev_dct (data) + DCTBLOCK data; +#endif /* NeedFunctionPrototypes */ +#else +j_rev_dct (DCTBLOCK data) +#endif /* XIE_SUPPORTED */ +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3, z4, z5; + register DCTELEM *dataptr; + int rowctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true IDCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + dataptr = data; + for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--) { + /* Due to quantization, we will usually find that many of the input + * coefficients are zero, especially the AC terms. We can exploit this + * by short-circuiting the IDCT calculation for any row in which all + * the AC terms are zero. In that case each output is equal to the + * DC coefficient (with scale factor as needed). + * With typical images and quantization tables, half or more of the + * row DCT calculations can be simplified this way. + */ + + if ((dataptr[1] | dataptr[2] | dataptr[3] | dataptr[4] | + dataptr[5] | dataptr[6] | dataptr[7]) == 0) { + /* AC terms all zero */ + DCTELEM dcval = (DCTELEM) (dataptr[0] << PASS1_BITS); + + dataptr[0] = dcval; + dataptr[1] = dcval; + dataptr[2] = dcval; + dataptr[3] = dcval; + dataptr[4] = dcval; + dataptr[5] = dcval; + dataptr[6] = dcval; + dataptr[7] = dcval; + + dataptr += DCTSIZE; /* advance pointer to next row */ + continue; + } + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = (INT32) dataptr[2]; + z3 = (INT32) dataptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065); + tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); + + tmp0 = ((INT32) dataptr[0] + (INT32) dataptr[4]) << CONST_BITS; + tmp1 = ((INT32) dataptr[0] - (INT32) dataptr[4]) << CONST_BITS; + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = (INT32) dataptr[7]; + tmp1 = (INT32) dataptr[5]; + tmp2 = (INT32) dataptr[3]; + tmp3 = (INT32) dataptr[1]; + + z1 = tmp0 + tmp3; + z2 = tmp1 + tmp2; + z3 = tmp0 + tmp2; + z4 = tmp1 + tmp3; + z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ + + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + tmp0 += z1 + z3; + tmp1 += z2 + z4; + tmp2 += z2 + z3; + tmp3 += z1 + z4; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + dataptr[0] = (DCTELEM) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS); + dataptr[1] = (DCTELEM) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS); + dataptr[2] = (DCTELEM) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS); + dataptr[4] = (DCTELEM) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. */ + /* Note that we must descale the results by a factor of 8 == 2**3, */ + /* and also undo the PASS1_BITS scaling. */ + + dataptr = data; + for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--) { + /* Columns of zeroes can be exploited in the same way as we did with rows. + * However, the row calculation has created many nonzero AC terms, so the + * simplification applies less often (typically 5% to 10% of the time). + * On machines with very fast multiplication, it's possible that the + * test takes more time than it's worth. In that case this section + * may be commented out. + */ + +#ifndef NO_ZERO_COLUMN_TEST + if ((dataptr[DCTSIZE*1] | dataptr[DCTSIZE*2] | dataptr[DCTSIZE*3] | + dataptr[DCTSIZE*4] | dataptr[DCTSIZE*5] | dataptr[DCTSIZE*6] | + dataptr[DCTSIZE*7]) == 0) { + /* AC terms all zero */ + DCTELEM dcval = (DCTELEM) DESCALE((INT32) dataptr[0], PASS1_BITS+3); + + dataptr[DCTSIZE*0] = dcval; + dataptr[DCTSIZE*1] = dcval; + dataptr[DCTSIZE*2] = dcval; + dataptr[DCTSIZE*3] = dcval; + dataptr[DCTSIZE*4] = dcval; + dataptr[DCTSIZE*5] = dcval; + dataptr[DCTSIZE*6] = dcval; + dataptr[DCTSIZE*7] = dcval; + + dataptr++; /* advance pointer to next column */ + continue; + } +#endif + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = (INT32) dataptr[DCTSIZE*2]; + z3 = (INT32) dataptr[DCTSIZE*6]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065); + tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); + + tmp0 = ((INT32) dataptr[DCTSIZE*0] + (INT32) dataptr[DCTSIZE*4]) << CONST_BITS; + tmp1 = ((INT32) dataptr[DCTSIZE*0] - (INT32) dataptr[DCTSIZE*4]) << CONST_BITS; + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = (INT32) dataptr[DCTSIZE*7]; + tmp1 = (INT32) dataptr[DCTSIZE*5]; + tmp2 = (INT32) dataptr[DCTSIZE*3]; + tmp3 = (INT32) dataptr[DCTSIZE*1]; + + z1 = tmp0 + tmp3; + z2 = tmp1 + tmp2; + z3 = tmp0 + tmp2; + z4 = tmp1 + tmp3; + z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ + + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + tmp0 += z1 + z3; + tmp1 += z2 + z4; + tmp2 += z2 + z3; + tmp3 += z1 + z4; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp3, + CONST_BITS+PASS1_BITS+3); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp10 - tmp3, + CONST_BITS+PASS1_BITS+3); + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp11 + tmp2, + CONST_BITS+PASS1_BITS+3); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(tmp11 - tmp2, + CONST_BITS+PASS1_BITS+3); + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(tmp12 + tmp1, + CONST_BITS+PASS1_BITS+3); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12 - tmp1, + CONST_BITS+PASS1_BITS+3); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp13 + tmp0, + CONST_BITS+PASS1_BITS+3); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp13 - tmp0, + CONST_BITS+PASS1_BITS+3); + + dataptr++; /* advance pointer to next column */ + } +} diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jutils.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jutils.c new file mode 100644 index 0000000..a773728 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jutils.c @@ -0,0 +1,238 @@ +/* $XConsortium: jutils.c,v 1.4 94/04/17 20:35:46 rws Exp $ */ +/* Module jutils.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., October 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +/* + * jutils.c + * + * Copyright (C) 1991, 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains miscellaneous utility routines needed for both + * compression and decompression. + * Note we prefix all global names with "j" to minimize conflicts with + * a surrounding application. + */ + +#include "jinclude.h" + + +GLOBAL long +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +jround_up (long a, long b) +#else +jround_up (a, b) + long a; + long b; +#endif /* NeedFunctionPrototypes */ +#else +jround_up (long a, long b) +#endif /* XIE_SUPPORTED */ +/* Compute a rounded up to next multiple of b; a >= 0, b > 0 */ +{ + a += b-1; + return a - (a % b); +} + + +/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays + * and coefficient-block arrays. This won't work on 80x86 because the arrays + * are FAR and we're assuming a small-pointer memory model. However, some + * DOS compilers provide far-pointer versions of memcpy() and memset() even + * in the small-model libraries. These will be used if USE_FMEM is defined. + * Otherwise, the routines below do it the hard way. (The performance cost + * is not all that great, because these routines aren't very heavily used.) + */ + +#ifndef NEED_FAR_POINTERS /* normal case, same as regular macros */ +#define FMEMCOPY(dest,src,size) MEMCOPY(dest,src,size) +#define FMEMZERO(target,size) MEMZERO(target,size) +#else /* 80x86 case, define if we can */ +#ifdef USE_FMEM +#define FMEMCOPY(dest,src,size) _fmemcpy((pointer)(dest), (const pointer)(src), (size_t)(size)) +#define FMEMZERO(target,size) _fmemset((pointer)(target), 0, (size_t)(size)) +#endif +#endif + + +GLOBAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +jcopy_sample_rows (JSAMPARRAY input_array, int source_row, + JSAMPARRAY output_array, int dest_row, + int num_rows, long num_cols) +#else +jcopy_sample_rows (input_array, source_row, + output_array, dest_row, + num_rows, num_cols) + JSAMPARRAY input_array; + int source_row; + JSAMPARRAY output_array; + int dest_row; + int num_rows; + long num_cols; +#endif /* NeedFunctionPrototypes */ +#else +jcopy_sample_rows (JSAMPARRAY input_array, int source_row, + JSAMPARRAY output_array, int dest_row, + int num_rows, long num_cols) +#endif /* XIE_SUPPORTED */ +/* Copy some rows of samples from one place to another. + * num_rows rows are copied from input_array[source_row++] + * to output_array[dest_row++]; these areas should not overlap. + * The source and destination arrays must be at least as wide as num_cols. + */ +{ + register JSAMPROW inptr, outptr; +#ifdef FMEMCOPY + register size_t count = (size_t) (num_cols * SIZEOF(JSAMPLE)); +#else + register long count; +#endif + register int row; + + input_array += source_row; + output_array += dest_row; + + for (row = num_rows; row > 0; row--) { + inptr = *input_array++; + outptr = *output_array++; +#ifdef FMEMCOPY + FMEMCOPY(outptr, inptr, count); +#else + for (count = num_cols; count > 0; count--) + *outptr++ = *inptr++; /* needn't bother with GETJSAMPLE() here */ +#endif + } +} + + +#ifndef XIE_SUPPORTED +GLOBAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row, long num_blocks) +#else +jcopy_block_row (input_row, output_row, num_blocks) + JBLOCKROW input_row; + JBLOCKROW output_row; + long num_blocks; +#endif /* NeedFunctionPrototypes */ +#else +jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row, long num_blocks) +#endif /* XIE_SUPPORTED */ +/* Copy a row of coefficient blocks from one place to another. */ +{ +#ifdef FMEMCOPY + FMEMCOPY(output_row, input_row, num_blocks * (DCTSIZE2 * SIZEOF(JCOEF))); +#else + register JCOEFPTR inptr, outptr; + register long count; + + inptr = (JCOEFPTR) input_row; + outptr = (JCOEFPTR) output_row; + for (count = num_blocks * DCTSIZE2; count > 0; count--) { + *outptr++ = *inptr++; + } +#endif +} +#endif /* XIE_SUPPORTED */ + +GLOBAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +jzero_far (pointer target, size_t bytestozero) +#else +jzero_far (target, bytestozero) + pointer target; + size_t bytestozero; +#endif /* NeedFunctionPrototypes */ +#else +jzero_far (pointer target, size_t bytestozero) +#endif /* XIE_SUPPORTED */ +/* Zero out a chunk of FAR memory. */ +/* This might be sample-array data, block-array data, or alloc_medium data. */ +{ +#ifdef FMEMZERO + FMEMZERO(target, bytestozero); +#else + register char FAR * ptr = (char FAR *) target; + register size_t count; + + for (count = bytestozero; count > 0; count--) { + *ptr++ = 0; + } +#endif +} diff --git a/xie/xc/programs/Xserver/XIE/mixie/jpeg/jwrjfif.c b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jwrjfif.c new file mode 100644 index 0000000..d493192 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/jpeg/jwrjfif.c @@ -0,0 +1,986 @@ +/* $XConsortium: jwrjfif.c,v 1.4 94/04/17 20:35:46 rws Exp $ */ +/* Module jwrjfif.c */ + +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + Gary Rogers, AGE Logic, Inc., October 1993 + Gary Rogers, AGE Logic, Inc., January 1994 + +****************************************************************************/ + +/* + * jwrjfif.c + * + * Copyright (C) 1991, 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains routines to write standard JPEG file headers/markers. + * The file format created is a raw JPEG data stream with (optionally) an + * APP0 marker per the JFIF spec. This will handle baseline and + * JFIF-convention JPEG files, although there is currently no provision + * for inserting a thumbnail image in the JFIF header. + * + * These routines may need modification for non-Unix environments or + * specialized applications. As they stand, they assume output to + * an ordinary stdio stream. However, the changes to write to something + * else are localized in the macros appearing just below. + * + * These routines are invoked via the methods write_file_header, + * write_scan_header, write_jpeg_data, write_scan_trailer, and + * write_file_trailer. + */ + +#include "jinclude.h" + +#ifdef JFIF_SUPPORTED + + +/* + * To output to something other than a stdio stream, you'd need to redefine + * these macros. + */ + +/* Write a single byte */ +#ifdef XIE_SUPPORTED +#define emit_byte(cinfo,x) \ + MAKESTMT( if (cinfo->bytes_in_buffer >= cinfo->jpeg_buf_size) \ + return(-1); \ + cinfo->output_buffer[cinfo->bytes_in_buffer++] = (char) (x); ) +#else +#define emit_byte(cinfo,x) putc((x), cinfo->output_file) +#endif /* XIE_SUPPORTED */ + +/* End of stdio-specific code. */ + + +typedef enum { /* JPEG marker codes */ + M_SOF0 = 0xc0, + M_SOF1 = 0xc1, + M_SOF2 = 0xc2, + M_SOF3 = 0xc3, + + M_SOF5 = 0xc5, + M_SOF6 = 0xc6, + M_SOF7 = 0xc7, + + M_JPG = 0xc8, + M_SOF9 = 0xc9, + M_SOF10 = 0xca, + M_SOF11 = 0xcb, + + M_SOF13 = 0xcd, + M_SOF14 = 0xce, + M_SOF15 = 0xcf, + + M_DHT = 0xc4, + + M_DAC = 0xcc, + + M_RST0 = 0xd0, + M_RST1 = 0xd1, + M_RST2 = 0xd2, + M_RST3 = 0xd3, + M_RST4 = 0xd4, + M_RST5 = 0xd5, + M_RST6 = 0xd6, + M_RST7 = 0xd7, + + M_SOI = 0xd8, + M_EOI = 0xd9, + M_SOS = 0xda, + M_DQT = 0xdb, + M_DNL = 0xdc, + M_DRI = 0xdd, + M_DHP = 0xde, + M_EXP = 0xdf, + + M_APP0 = 0xe0, + M_APP15 = 0xef, + + M_JPG0 = 0xf0, + M_JPG13 = 0xfd, + M_COM = 0xfe, + + M_TEM = 0x01, + + M_ERROR = 0x100 +} JPEG_MARKER; + + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +emit_marker (compress_info_ptr cinfo, JPEG_MARKER mark) +#else +emit_marker (cinfo, mark) + compress_info_ptr cinfo; + JPEG_MARKER mark; +#endif /* NeedFunctionPrototypes */ +#else +LOCAL void +emit_marker (compress_info_ptr cinfo, JPEG_MARKER mark) +#endif /* XIE_SUPPORTED */ +/* Emit a marker code */ +{ + emit_byte(cinfo, 0xFF); + emit_byte(cinfo, mark); +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +emit_2bytes (compress_info_ptr cinfo, int value) +#else +emit_2bytes (cinfo, value) + compress_info_ptr cinfo; + int value; +#endif /* NeedFunctionPrototypes */ +#else +LOCAL void +emit_2bytes (compress_info_ptr cinfo, int value) +#endif /* XIE_SUPPORTED */ +/* Emit a 2-byte integer; these are always MSB first in JPEG files */ +{ + emit_byte(cinfo, (value >> 8) & 0xFF); + emit_byte(cinfo, value & 0xFF); +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +emit_dqt (compress_info_ptr cinfo, int index) +#else +emit_dqt (cinfo, index) + compress_info_ptr cinfo; + int index; +#endif /* NeedFunctionPrototypes */ +#else +LOCAL void +emit_dqt (compress_info_ptr cinfo, int index) +#endif /* XIE_SUPPORTED */ +/* Emit a DQT marker */ +/* Returns the precision used (0 = 8bits, 1 = 16bits) for baseline checking */ +{ + QUANT_TBL_PTR data = cinfo->quant_tbl_ptrs[index]; + int prec = 0; + int i; + + for (i = 0; i < DCTSIZE2; i++) { + if (data[i] > 255) + prec = 1; + } + +#ifdef XIE_SUPPORTED + if (emit_marker(cinfo, M_DQT) < 0) + return(-1); + + if (emit_2bytes(cinfo, prec ? DCTSIZE2*2 + 1 + 2 : DCTSIZE2 + 1 + 2) < 0) + return(-1); +#else + emit_2bytes(cinfo, prec ? DCTSIZE2*2 + 1 + 2 : DCTSIZE2 + 1 + 2); + + emit_marker(cinfo, M_DQT); +#endif /* XIE_SUPPORTED */ + + emit_byte(cinfo, index + (prec<<4)); + + for (i = 0; i < DCTSIZE2; i++) { + if (prec) + emit_byte(cinfo, data[i] >> 8); + emit_byte(cinfo, data[i] & 0xFF); + } + + return prec; +} + + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +emit_dht (compress_info_ptr cinfo, int index, boolean is_ac) +#else +emit_dht (cinfo, index, is_ac) + compress_info_ptr cinfo; + int index; + boolean is_ac; +#endif /* NeedFunctionPrototypes */ +#else +LOCAL void +emit_dht (compress_info_ptr cinfo, int index, boolean is_ac) +#endif /* XIE_SUPPORTED */ +/* Emit a DHT marker */ +{ + HUFF_TBL * htbl; + int length, i; + + if (is_ac) { + htbl = cinfo->ac_huff_tbl_ptrs[index]; + index += 0x10; /* output index has AC bit set */ + } else { + htbl = cinfo->dc_huff_tbl_ptrs[index]; + } + + if (htbl == NULL) +#ifdef XIE_SUPPORTED + return(XIE_ERR); +#else + ERREXIT1(cinfo->emethods, "Huffman table 0x%02x was not defined", index); +#endif /* XIE_SUPPORTED */ + + if (! htbl->sent_table) { +#ifdef XIE_SUPPORTED + if (emit_marker(cinfo, M_DHT) < 0) + return(-1); +#else + emit_marker(cinfo, M_DHT); +#endif /* XIE_SUPPORTED */ + + length = 0; + for (i = 1; i <= 16; i++) + length += htbl->bits[i]; + +#ifdef XIE_SUPPORTED + if (emit_2bytes(cinfo, length + 2 + 1 + 16) < 0) + return(-1); +#else + emit_2bytes(cinfo, length + 2 + 1 + 16); +#endif /* XIE_SUPPORTED */ + emit_byte(cinfo, index); + + for (i = 1; i <= 16; i++) + emit_byte(cinfo, htbl->bits[i]); + + for (i = 0; i < length; i++) + emit_byte(cinfo, htbl->huffval[i]); + + htbl->sent_table = TRUE; + } +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +emit_dac (compress_info_ptr cinfo) +#else +emit_dac (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +LOCAL void +emit_dac (compress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +/* Emit a DAC marker */ +/* Since the useful info is so small, we want to emit all the tables in */ +/* one DAC marker. Therefore this routine does its own scan of the table. */ +{ + char dc_in_use[NUM_ARITH_TBLS]; + char ac_in_use[NUM_ARITH_TBLS]; + int length, i; + + for (i = 0; i < NUM_ARITH_TBLS; i++) + dc_in_use[i] = ac_in_use[i] = 0; + + for (i = 0; i < cinfo->num_components; i++) { + dc_in_use[cinfo->comp_info[i].dc_tbl_no] = 1; + ac_in_use[cinfo->comp_info[i].ac_tbl_no] = 1; + } + + length = 0; + for (i = 0; i < NUM_ARITH_TBLS; i++) + length += dc_in_use[i] + ac_in_use[i]; + +#ifdef XIE_SUPPORTED + if (emit_marker(cinfo, M_DAC) < 0) + return(-1); + + if (emit_2bytes(cinfo, length*2 + 2) < 0) + return(-1); +#else + emit_marker(cinfo, M_DAC); + + emit_2bytes(cinfo, length*2 + 2); +#endif /* XIE_SUPPORTED */ + + for (i = 0; i < NUM_ARITH_TBLS; i++) { + if (dc_in_use[i]) { + emit_byte(cinfo, i); + emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4)); + } + if (ac_in_use[i]) { + emit_byte(cinfo, i + 0x10); + emit_byte(cinfo, cinfo->arith_ac_K[i]); + } + } +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +emit_dri (compress_info_ptr cinfo) +#else +emit_dri (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +/* Emit a DRI marker */ +{ + if (emit_marker(cinfo, M_DRI) < 0) + return(-1); + + if (emit_2bytes(cinfo, 4) < 0) /* fixed length */ + return(-1); + + if (emit_2bytes(cinfo, (int) cinfo->restart_interval) < 0) + return(-1); + + return(0); +} +#else +LOCAL void +emit_dri (compress_info_ptr cinfo) +/* Emit a DRI marker */ +{ + emit_marker(cinfo, M_DRI); + + emit_2bytes(cinfo, 4); /* fixed length */ + + emit_2bytes(cinfo, (int) cinfo->restart_interval); +} +#endif /* XIE_SUPPORTED */ + + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +emit_sof (compress_info_ptr cinfo, JPEG_MARKER code) +#else +emit_sof (cinfo, code) + compress_info_ptr cinfo; + JPEG_MARKER code; +#endif /* NeedFunctionPrototypes */ +/* Emit a SOF marker */ +{ + int i; + + if (emit_marker(cinfo, code) < 0) + return(-1); + + if (emit_2bytes(cinfo, 3 * cinfo->num_components + 2 + 5 + 1) < 0) + return(-1); /* length */ + + if (cinfo->image_height > 65535L || cinfo->image_width > 65535L) + return(XIE_ERR); + + emit_byte(cinfo, cinfo->data_precision); + if (emit_2bytes(cinfo, (int) cinfo->image_height) < 0) + return(-1); + if (emit_2bytes(cinfo, (int) cinfo->image_width) < 0) + return(-1); + + emit_byte(cinfo, cinfo->num_components); + + for (i = 0; i < cinfo->num_components; i++) { + emit_byte(cinfo, cinfo->comp_info[i].component_id); + emit_byte(cinfo, (cinfo->comp_info[i].h_samp_factor << 4) + + cinfo->comp_info[i].v_samp_factor); + emit_byte(cinfo, cinfo->comp_info[i].quant_tbl_no); + } + return(0); +} +#else +LOCAL void +emit_sof (compress_info_ptr cinfo, JPEG_MARKER code) +/* Emit a SOF marker */ +{ + int i; + + emit_marker(cinfo, code); + + emit_2bytes(cinfo, 3 * cinfo->num_components + 2 + 5 + 1); /* length */ + + if (cinfo->image_height > 65535L || cinfo->image_width > 65535L) + ERREXIT(cinfo->emethods, "Maximum image dimension for JFIF is 65535 pixels"); + + emit_byte(cinfo, cinfo->data_precision); + emit_2bytes(cinfo, (int) cinfo->image_height); + emit_2bytes(cinfo, (int) cinfo->image_width); + + emit_byte(cinfo, cinfo->num_components); + + for (i = 0; i < cinfo->num_components; i++) { + emit_byte(cinfo, cinfo->comp_info[i].component_id); + emit_byte(cinfo, (cinfo->comp_info[i].h_samp_factor << 4) + + cinfo->comp_info[i].v_samp_factor); + emit_byte(cinfo, cinfo->comp_info[i].quant_tbl_no); + } +} +#endif /* XIE_SUPPORTED */ + + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +emit_sos (compress_info_ptr cinfo) +#else +emit_sos (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +LOCAL void +emit_sos (compress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +/* Emit a SOS marker */ +{ + int i; + +#ifdef XIE_SUPPORTED + if (emit_marker(cinfo, M_SOS) < 0) + return(-1); + + if (emit_2bytes(cinfo, 2 * cinfo->comps_in_scan + 2 + 1 + 3) < 0) + return(-1); /* length */ +#else + emit_marker(cinfo, M_SOS); + + emit_2bytes(cinfo, 2 * cinfo->comps_in_scan + 2 + 1 + 3); /* length */ +#endif /* XIE_SUPPORTED */ + + emit_byte(cinfo, cinfo->comps_in_scan); + + for (i = 0; i < cinfo->comps_in_scan; i++) { + emit_byte(cinfo, cinfo->cur_comp_info[i]->component_id); + emit_byte(cinfo, (cinfo->cur_comp_info[i]->dc_tbl_no << 4) + + cinfo->cur_comp_info[i]->ac_tbl_no); + } + + emit_byte(cinfo, 0); /* Spectral selection start */ + emit_byte(cinfo, DCTSIZE2-1); /* Spectral selection end */ + emit_byte(cinfo, 0); /* Successive approximation */ +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + + +#ifdef XIE_SUPPORTED +LOCAL int +#if NeedFunctionPrototypes +emit_jfif_app0 (compress_info_ptr cinfo) +#else +emit_jfif_app0 (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +LOCAL void +emit_jfif_app0 (compress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +/* Emit a JFIF-compliant APP0 marker */ +{ + /* + * Length of APP0 block (2 bytes) + * Block ID (4 bytes - ASCII "JFIF") + * Zero byte (1 byte to terminate the ID string) + * Version Major, Minor (2 bytes - 0x01, 0x01) + * Units (1 byte - 0x00 = none, 0x01 = inch, 0x02 = cm) + * Xdpu (2 bytes - dots per unit horizontal) + * Ydpu (2 bytes - dots per unit vertical) + * Thumbnail X size (1 byte) + * Thumbnail Y size (1 byte) + */ + +#ifdef XIE_SUPPORTED + if (emit_marker(cinfo, M_APP0) < 0) + return(-1); + + if (emit_2bytes(cinfo, 2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1) < 0) + return(-1); /* length */ +#else + emit_marker(cinfo, M_APP0); + + emit_2bytes(cinfo, 2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1); /* length */ +#endif /* XIE_SUPPORTED */ + + emit_byte(cinfo, 0x4A); /* Identifier: ASCII "JFIF" */ + emit_byte(cinfo, 0x46); + emit_byte(cinfo, 0x49); + emit_byte(cinfo, 0x46); + emit_byte(cinfo, 0); + emit_byte(cinfo, 1); /* Major version */ + emit_byte(cinfo, 1); /* Minor version */ + emit_byte(cinfo, cinfo->density_unit); /* Pixel size information */ +#ifdef XIE_SUPPORTED + if (emit_2bytes(cinfo, (int) cinfo->X_density) < 0) + return(-1); + if (emit_2bytes(cinfo, (int) cinfo->Y_density) < 0) + return(-1); +#else + emit_2bytes(cinfo, (int) cinfo->X_density); + emit_2bytes(cinfo, (int) cinfo->Y_density); +#endif /* XIE_SUPPORTED */ + emit_byte(cinfo, 0); /* No thumbnail image */ + emit_byte(cinfo, 0); +#ifdef XIE_SUPPORTED + return(0); +#endif /* XIE_SUPPORTED */ +} + + +/* + * Write the file header. + */ + + +#ifdef XIE_SUPPORTED +LOCAL boolean +#if NeedFunctionPrototypes +set_location(compress_info_ptr cinfo, int l) +#else +set_location(cinfo, l) + compress_info_ptr cinfo; + int l; +#endif /* NeedFunctionPrototypes */ +{ + if ((cinfo->XIErestart >= XIE_RWRJ) && (cinfo->XIEwrloc != l)) + return(FALSE); + + cinfo->XIEbytes_in_buffer = cinfo->bytes_in_buffer; + cinfo->XIErestart = XIE_RNUL; + cinfo->XIEwrloc = l; + + return(TRUE); +} + +METHODDEF int +#if NeedFunctionPrototypes +write_file_header (compress_info_ptr cinfo) +#else +write_file_header (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +METHODDEF void +write_file_header (compress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + char qt_in_use[NUM_QUANT_TBLS]; + int i, prec; + boolean is_baseline; + +#ifdef XIE_SUPPORTED + int status; + int j; + if (set_location(cinfo, 1)) { + if (emit_marker(cinfo, M_SOI) < 0) { + cinfo->bytes_in_buffer = cinfo->XIEbytes_in_buffer; + cinfo->XIErestart = XIE_RWRJ; + return(XIE_OUT); /* first the SOI */ + } + + if (cinfo->write_JFIF_header) { /* next an optional JFIF APP0 */ + if (emit_jfif_app0(cinfo) < 0) { + cinfo->bytes_in_buffer = cinfo->XIEbytes_in_buffer; + cinfo->XIErestart = XIE_RWRJ; + return(XIE_OUT); + } + } + } +#else + emit_marker(cinfo, M_SOI); /* first the SOI */ + + if (cinfo->write_JFIF_header) /* next an optional JFIF APP0 */ + emit_jfif_app0(cinfo); +#endif /* XIE_SUPPORTED */ + + /* Emit DQT for each quantization table. */ + /* Note that doing it here means we can't adjust the QTs on-the-fly. */ + /* If we did want to do that, we'd have a problem with checking precision */ + /* for the is_baseline determination. */ + + for (i = 0; i < NUM_QUANT_TBLS; i++) + qt_in_use[i] = 0; + + for (i = 0; i < cinfo->num_components; i++) + qt_in_use[cinfo->comp_info[i].quant_tbl_no] = 1; + + prec = 0; +#ifdef XIE_SUPPORTED + if (set_location(cinfo, 2)) { + for (i = 0; i < NUM_QUANT_TBLS; i++) { + if (qt_in_use[i]) + { + if ((j = emit_dqt(cinfo, i)) < 0) { + cinfo->bytes_in_buffer = cinfo->XIEbytes_in_buffer; + cinfo->XIErestart = XIE_RWRJ; + return(XIE_OUT); + } + prec += j; + } + } + } +#else + for (i = 0; i < NUM_QUANT_TBLS; i++) { + prec += emit_dqt(cinfo, i); + } +#endif /* XIE_SUPPORTED */ + /* now prec is nonzero iff there are any 16-bit quant tables. */ + + /* Check for a non-baseline specification. */ + /* Note we assume that Huffman table numbers won't be changed later. */ + is_baseline = TRUE; + if (cinfo->arith_code || (cinfo->data_precision != 8)) + is_baseline = FALSE; + for (i = 0; i < cinfo->num_components; i++) { + if (cinfo->comp_info[i].dc_tbl_no > 1 || cinfo->comp_info[i].ac_tbl_no > 1) + is_baseline = FALSE; + } + if (prec && is_baseline) { + is_baseline = FALSE; + /* If it's baseline except for quantizer size, warn the user */ +#ifndef XIE_SUPPORTED + TRACEMS(cinfo->emethods, 0, + "Caution: quantization tables are too coarse for baseline JPEG"); +#endif /* XIE_SUPPORTED */ + } + + +#ifdef XIE_SUPPORTED + if (set_location(cinfo, 3)) { + /* Emit the proper SOF marker */ + if (cinfo->arith_code) { + if ((status = emit_sof(cinfo, M_SOF9)) < 0) { + if (status == XIE_ERR) + return(XIE_ERR); + cinfo->bytes_in_buffer = cinfo->XIEbytes_in_buffer; + cinfo->XIErestart = XIE_RWRJ; + return(XIE_OUT); /* SOF code for arithmetic coding */ + } + } else if (is_baseline) { + if ((status = emit_sof(cinfo, M_SOF0)) < 0) { + if (status == XIE_ERR) + return(XIE_ERR); + cinfo->bytes_in_buffer = cinfo->XIEbytes_in_buffer; + cinfo->XIErestart = XIE_RWRJ; + return(XIE_OUT); /* SOF code for baseline implementation */ + } + } else { + if ((status = emit_sof(cinfo, M_SOF1)) < 0) { + if (status == XIE_ERR) + return(XIE_ERR); + cinfo->bytes_in_buffer = cinfo->XIEbytes_in_buffer; + cinfo->XIErestart = XIE_RWRJ; + return(XIE_OUT); /* SOF code for non-baseline Huffman file */ + } + } + } + return(0); +#else + /* Emit the proper SOF marker */ + if (cinfo->arith_code) + emit_sof(cinfo, M_SOF9); /* SOF code for arithmetic coding */ + else if (is_baseline) + emit_sof(cinfo, M_SOF0); /* SOF code for baseline implementation */ + else + emit_sof(cinfo, M_SOF1); /* SOF code for non-baseline Huffman file */ +#endif /* XIE_SUPPORTED */ +} + + +/* + * Write the start of a scan (everything through the SOS marker). + */ + +#ifdef XIE_SUPPORTED +METHODDEF int +#if NeedFunctionPrototypes +write_scan_header (compress_info_ptr cinfo) +#else +write_scan_header (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +METHODDEF void +write_scan_header (compress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + int i; +#ifdef XIE_SUPPORTED + int status; + int l = 0; +#endif /* XIE_SUPPORTED */ + + if (cinfo->arith_code) { + /* Emit arith conditioning info. We will have some duplication + * if the file has multiple scans, but it's so small it's hardly + * worth worrying about. + */ +#ifdef XIE_SUPPORTED + if (set_location(cinfo, l++)) { + if (emit_dac(cinfo) < 0) { + cinfo->bytes_in_buffer = cinfo->XIEbytes_in_buffer; + cinfo->XIErestart = XIE_RWRJ; + return(XIE_OUT); + } + } +#else + emit_dac(cinfo); +#endif /* XIE_SUPPORTED */ + } else { + /* Emit Huffman tables. Note that emit_dht takes care of + * suppressing duplicate tables. + */ +#ifdef XIE_SUPPORTED + for (i = 0; i < cinfo->comps_in_scan; i++) { + if (set_location(cinfo, l++)) { + if ((status = + emit_dht(cinfo, cinfo->cur_comp_info[i]->dc_tbl_no, FALSE)) < 0) { + if (status == XIE_ERR) + return(XIE_ERR); + cinfo->bytes_in_buffer = cinfo->XIEbytes_in_buffer; + cinfo->XIErestart = XIE_RWRJ; + return(XIE_OUT); + } + } + if (set_location(cinfo, l++)) { + if ((status = + emit_dht(cinfo, cinfo->cur_comp_info[i]->ac_tbl_no, TRUE)) < 0) { + if (status == XIE_ERR) + return(XIE_ERR); + cinfo->bytes_in_buffer = cinfo->XIEbytes_in_buffer; + cinfo->XIErestart = XIE_RWRJ; + return(XIE_OUT); + } + } + } +#else + for (i = 0; i < cinfo->comps_in_scan; i++) { + emit_dht(cinfo, cinfo->cur_comp_info[i]->dc_tbl_no, FALSE); + emit_dht(cinfo, cinfo->cur_comp_info[i]->ac_tbl_no, TRUE); + } +#endif /* XIE_SUPPORTED */ + } + + /* Emit DRI if required --- note that DRI value could change for each scan. + * If it doesn't, a tiny amount of space is wasted in multiple-scan files. + * We assume DRI will never be nonzero for one scan and zero for a later one. + */ +#ifdef XIE_SUPPORTED + if (cinfo->restart_interval) { + if (set_location(cinfo, l++)) { + if (emit_dri(cinfo) < 0) { + cinfo->bytes_in_buffer = cinfo->XIEbytes_in_buffer; + cinfo->XIErestart = XIE_RWRJ; + return(XIE_OUT); + } + } + } + + if (set_location(cinfo, l)) { + if (emit_sos(cinfo) < 0) { + cinfo->bytes_in_buffer = cinfo->XIEbytes_in_buffer; + cinfo->XIErestart = XIE_RWRJ; + return(XIE_OUT); + } + } + return(0); +#else + if (cinfo->restart_interval) + emit_dri(cinfo); + + emit_sos(cinfo); +#endif /* XIE_SUPPORTED */ +} + + +/* + * Write some bytes of compressed data within a scan. + */ + +#ifndef XIE_SUPPORTED +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +write_jpeg_data (compress_info_ptr cinfo, char *dataptr, int datacount) +#else +write_jpeg_data (cinfo, dataptr, datacount) + compress_info_ptr cinfo; + char *dataptr; + int datacount; +#endif /* NeedFunctionPrototypes */ +#else +write_jpeg_data (compress_info_ptr cinfo, char *dataptr, int datacount) +#endif /* XIE_SUPPORTED */ +{ +#ifndef XIE_SUPPORTED + size_t i; + /* Write some bytes from a (char *) buffer */ + if ((i = JFWRITE(cinfo->output_file, dataptr, datacount)) + != (size_t) (datacount)) + ERREXIT(cinfo->emethods, "Output file write error"); +#endif /* XIE_SUPPORTED */ +} +#endif /* XIE_SUPPORTED */ + +/* + * Finish up after a compressed scan (series of write_jpeg_data calls). + */ + +METHODDEF void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +write_scan_trailer (compress_info_ptr cinfo) +#else +write_scan_trailer (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +write_scan_trailer (compress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + /* no work needed in this format */ +} + + +/* + * Finish up at the end of the file. + */ + +#ifdef XIE_SUPPORTED +METHODDEF int +#if NeedFunctionPrototypes +write_file_trailer (compress_info_ptr cinfo) +#else +write_file_trailer (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +{ + if (set_location(cinfo, 1)) { + if (emit_marker(cinfo, M_EOI) < 0) { + cinfo->bytes_in_buffer = cinfo->XIEbytes_in_buffer; + cinfo->XIErestart = XIE_RWRJ; + return(XIE_OUT); + } + } + return(0); +} +#else +METHODDEF void +write_file_trailer (compress_info_ptr cinfo) +{ + int i; + emit_marker(cinfo, M_EOI); + /* Make sure we wrote the output file OK */ + /* Clean up and verify successful output */ + fflush(cinfo->output_file); + if ((i = ferror(cinfo->output_file))) + ERREXIT(cinfo->emethods, "Output file write error"); +} +#endif /* XIE_SUPPORTED */ + + +/* + * The method selection routine for standard JPEG header writing. + * This should be called from c_ui_method_selection if appropriate. + */ + +GLOBAL void +#ifdef XIE_SUPPORTED +#if NeedFunctionPrototypes +jselwjfif (compress_info_ptr cinfo) +#else +jselwjfif (cinfo) + compress_info_ptr cinfo; +#endif /* NeedFunctionPrototypes */ +#else +jselwjfif (compress_info_ptr cinfo) +#endif /* XIE_SUPPORTED */ +{ + cinfo->methods->write_file_header = write_file_header; + cinfo->methods->write_scan_header = write_scan_header; +#ifndef XIE_SUPPORTED + cinfo->methods->write_jpeg_data = write_jpeg_data; +#endif + cinfo->methods->write_scan_trailer = write_scan_trailer; + cinfo->methods->write_file_trailer = write_file_trailer; +} + +#endif /* JFIF_SUPPORTED */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/Imakefile b/xie/xc/programs/Xserver/XIE/mixie/process/Imakefile new file mode 100644 index 0000000..2f29e04 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/Imakefile @@ -0,0 +1,34 @@ +XCOMM $XConsortium: Imakefile,v 1.4 93/11/07 10:58:48 rws Exp $ +XCOMM build device dependent machine independent process element objs +#include + +SRCS1 = bitfun.c mpgeom.c mpgeomaa.c mpgeomnn.c mppoint.c +OBJS1 = bitfun.o mpgeom.o mpgeomaa.o mpgeomnn.o mppoint.o + +#if BuildDIS +DEFINES = -DXIE_DIS +#else +SRCS2 = mparith.c mpbandc.c mpbande.c mpbands.c mpblend.c mpcfromi.c \ + mpcnst.c mpcomp.c mpconv.c mpctoi.c mpdither.c mphist.c \ + mplogic.c mppaste.c mprgb.c mpuncnst.c +OBJS2 = mparith.o mpbandc.o mpbande.o mpbands.o mpblend.o mpcfromi.o \ + mpcnst.o mpcomp.o mpconv.o mpctoi.o mpdither.o mphist.o \ + mplogic.o mppaste.o mprgb.o mpuncnst.o +#endif + + SRCS = $(SRCS1) $(SRCS2) + + OBJS = $(OBJS1) $(OBJS2) + + INCLUDES = -I../include -I../../include -I$(SERVERSRC)/include -I$(INCLUDESRC) -I$(INCLUDESRC)/extensions + LINTLIBS = ../../dixie/export/llib-lexp.ln ../../dixie/import/llib-limp.ln \ + ../../dixie/process/llib-lproc.ln ../../dixie/request/llib-lreq.ln \ + ../control/llib-lctrl.ln ../export/llib-lmexp.ln ../fax/llib-lfax.ln \ + ../import/llib-lmimp.ln ../jpeg/llib-ljpeg.ln ../process/llib-lmproc.ln + +SubdirLibraryRule($(OBJS)) +NormalLibraryObjectRule() +LintLibraryTarget(mproc,$(SRCS)) +NormalLintTarget($(SRCS)) + +DependTarget() diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/bitfun.c b/xie/xc/programs/Xserver/XIE/mixie/process/bitfun.c new file mode 100644 index 0000000..678bfc0 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/bitfun.c @@ -0,0 +1,429 @@ +/* $XConsortium: bitfun.c,v 1.5 94/04/17 20:35:08 rws Exp $ */ +/**** module bitfun.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + bitfun.c -- DDXIE utilities for bits and other fun things. + + Larry Hare -- AGE Logic, Inc. July, 1993 + +*****************************************************************************/ + +#define _XIEC_MPBITFUN + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include + +#include "xiemd.h" + +/*--------------------------------------------------------------------------- +-------------------------------- bitexpand -------------------------------- +---------------------------------------------------------------------------*/ + +/* +** Following routine is used to expand a length of bit pixels to byte +** pixels. Similar routines could be written for other pixels sizes +** but currently we don't really support them (eg 4 bits) or doesnt +** really speed them up (16 bits). +** +** You could also do this with any other bit expansion tricks you +** have up your sleeve. For instance, you could look up 8 bits +** at a time, and have a table of 256 long longs; or use your +** favorite graphics accelerator, or ... bitfun. +*/ + + +CARD32 xie8StippleMasks[16] = { +0x00000000, 0x000000ff, 0x0000ff00, 0x0000ffff, +0x00ff0000, 0x00ff00ff, 0x00ffff00, 0x00ffffff, +0xff000000, 0xff0000ff, 0xff00ff00, 0xff00ffff, +0xffff0000, 0xffff00ff, 0xffffff00, 0xffffffff, +}; + +/* byte reversal table */ +unsigned char _ByteReverseTable[]= { + 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, + 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, + 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, + 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, + 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, + 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, + 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, + 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, + 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, + 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, + 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, + 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, + 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, + 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, + 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, + 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, + 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, + 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, + 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, + 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, + 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, + 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, + 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, + 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, + 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, + 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, + 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, + 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, + 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, + 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, + 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, + 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff + +}; + +#if (IMAGE_BYTE_ORDER == MSBFirst) +#define g4 (c = (inval>>26) & 0x3c, inval <<= 4, \ + *((CARD32 *) ((int) &xie8StippleMasks[0] + c)) & val) +#define g4r (c = (inval>>26) & 0x3c, inval <<= 4, \ + ~(*((CARD32 *) ((int) &xie8StippleMasks[0] + c))) & val) +#define g4b (c = (inval>>26) & 0x3c, inval <<= 4, \ + c = *((CARD32 *) ((int) &xie8StippleMasks[0] + c)), \ + (loval & ~c) | (hival & c)) +#else +#define g4 (c = inval & 0xf, inval >>= 4, xie8StippleMasks[c] & val) +#define g4r (c = inval & 0xf, inval >>= 4, ~xie8StippleMasks[c] & val) +#define g4b (c = inval & 0xf, inval >>= 4, c = xie8StippleMasks[c], \ + (loval & ~c) | (hival & c)) +#endif + +#define p4 *outp++ + +pointer bitexpand(inp,outp,bw,olow,ohigh) + CARD32 *inp; /* these are actualy bits... */ + CARD32 *outp; /* its actually bytes but ... */ + int bw; /* number of bits to extract */ + unsigned char olow; /* zero bit maps to this */ + unsigned char ohigh; /* one bit maps to this */ +{ + pointer dst = (pointer)outp; + int nw; + CARD32 inval, c; + if (olow == 0) { + CARD32 val = ohigh; + val = (val << 8) | val; val = (val << 16) | val; + for ( nw = bw >> 5; nw > 0; nw--) { + inval = *inp++; + p4 = g4; p4 = g4; p4 = g4; p4 = g4; + p4 = g4; p4 = g4; p4 = g4; p4 = g4; + } + if ((bw &= 31) > 0) + for (inval = *inp; bw > 0; bw -= 4) + p4 = g4; + } else if (ohigh == 0) { + CARD32 val = olow; + val = (val << 8) | val; val = (val << 16) | val; + for ( nw = bw >> 5; nw > 0; nw--) { + inval = *inp++; + p4 = g4r; p4 = g4r; p4 = g4r; p4 = g4r; + p4 = g4r; p4 = g4r; p4 = g4r; p4 = g4r; + } + if ((bw &= 31) > 0) + for (inval = *inp; bw > 0; bw -= 4) + p4 = g4r; + } else { + CARD32 loval = olow, hival = ohigh; + loval = (loval << 8) | loval; loval = (loval << 16) | loval; + hival = (hival << 8) | hival; hival = (hival << 16) | hival; + for ( nw = bw >> 5; nw > 0; nw--) { + inval = *inp++; + p4 = g4b; p4 = g4b; p4 = g4b; p4 = g4b; + p4 = g4b; p4 = g4b; p4 = g4b; p4 = g4b; + } + if ((bw &= 31) > 0) + for (inval = *inp; bw > 0; bw -= 4) + p4 = g4b; + } + /******** + if (bw > 0) + for (M=LOGLEFT, inval = *inp++; bw; bw--, LOGRIGHT(M)) + *outp++ = (inval & M) ? ohigh : olow ; + *********/ + return(dst); +} + +/* byte to bit converter + * everything less than "threshold" becomes a zero + */ +void +bitshrink(src,dst,width,threshold) + unsigned char *src, *dst, threshold; + int width; +{ + BytePixel *i = src; + LogInt *o = (LogInt*)dst, M, v; + int bw; + + for(bw = width; bw >= LOGSIZE; *o++ = v, bw -= LOGSIZE) + for(v = 0, M = LOGLEFT; M; LOGRIGHT(M)) if(*i++ >= threshold) v |= M; + if(bw > 0) { + for(v = 0, M = LOGLEFT; bw--; LOGRIGHT(M)) if(*i++ >= threshold) v |= M; + *o++ = v; + } +} + +/*------------------------------------------------------------------------ +------------------ Bit manipulation in ROI section ----------------------- +------------------------------------------------------------------------*/ + +/* +** The following routines are used to turn a set of bits in a ROI extent +** of a scanline to 0's, to 1's, or to invert them. 'ix' is the starting +** bit number, and 'run' is the number of bits. The routines can be +** applied to eg BytePixel arrays by scaling the coordinates appropriately. +*/ + +void +action_clear(d, run, ix) /* turn off bits in region */ + LogInt *d; + int run, ix; +{ + int sbit = ix & LOGMASK; + + ix >>= LOGSHIFT; d += ix; + if ((sbit + run) >= LOGSIZE) { + if (sbit) { + *d &= ~(BitRight(LOGONES,sbit)); + run -= (LOGSIZE - sbit); d++; + } + for (sbit = run >> LOGSHIFT; sbit > 0; sbit--) { + *d++ = 0; + } + if (run &= LOGMASK) { + *d &= BitRight(LOGONES,run); + } + } else { + *d &= ~(BitRight(LOGONES,sbit) & ~(BitRight(LOGONES,sbit+run))); + } +} + +void +action_set(d, run, ix) /* turn on bits in region */ + LogInt *d; + int run, ix; +{ + int sbit = ix & LOGMASK; + + ix >>= LOGSHIFT; d += ix; + if ((sbit + run) >= LOGSIZE) { + if (sbit) { + *d |= BitRight(LOGONES,sbit); + run -= (LOGSIZE - sbit); d++; + } + for (sbit = run >> LOGSHIFT; sbit > 0; sbit--) { + *d++ = LOGONES; + } + if (run &= LOGMASK) { + *d |= ~BitRight(LOGONES,run); + } + } else { + *d |= (BitRight(LOGONES,sbit) & ~(BitRight(LOGONES,sbit+run))); + } +} + +void +action_invert(d, run, ix) /* invert bits in region */ + LogInt *d; + int run, ix; +{ + int sbit = ix & LOGMASK; + + ix >>= LOGSHIFT; d += ix; + if ((sbit + run) >= LOGSIZE) { + if (sbit) { + *d ^= BitRight(LOGONES,sbit); + run -= (LOGSIZE - sbit); d++; + } + for (sbit = run >> LOGSHIFT; sbit > 0; sbit--) { + *d++ ^= LOGONES; + } + if (run &= LOGMASK) { + *d ^= ~BitRight(LOGONES,run); + } + } else { + *d ^= (BitRight(LOGONES,sbit) & ~(BitRight(LOGONES,sbit+run))); + } +} + +/*------------------------------------------------------------------------ +------------------------ Pixel Copy in ROI section ----------------------- +------------------------------------------------------------------------*/ +/* +** NOTE: Nominally used to copy src1 to destination in the passive +** regions of a ROI. To implement this efficiently we have a variety +** of issues and choices: +** a) Simply call memcpy for the correct number of bytes. +** b) Simply call passcopy_bit below for the correct # of bits. +** d) For small number, do a while loop, else call memcpy or passocpy_bit. +** NOTE: do not call if s == d, or if s overlaps d. +*/ + +/* (*(pvt->passive)) (dvoid, svoid, -run, ix); */ + +void passcopy_byte(d,s,dx,x) + BytePixel *d, *s; + CARD32 dx, x; +{ + d += x; + s += x; + if (dx < 15) while (dx-- > 0) *d++ = *s++; + else memcpy (d, s, dx); +} + +void passcopy_pair(d,s,dx,x) + PairPixel *d, *s; + CARD32 dx, x; +{ + d += x; + s += x; + if (dx < 12) while (dx-- > 0) *d++ = *s++; + else memcpy (d, s, dx << 1); +} + +void passcopy_quad(d,s,dx,x) + QuadPixel *d, *s; + CARD32 dx, x; +{ + d += x; + s += x; + if (dx < 8) while (dx-- > 0) *d++ = *s++; + else memcpy (d, s, dx << 2); +} + +void passcopy_real(d,s,dx,x) + RealPixel *d, *s; + CARD32 dx, x; +{ + d += x; + s += x; + if (dx < 8) while (dx-- > 0) *d++ = *s++; + else memcpy (d, s, dx << 2); +} + +void +passcopy_bit(d,s,dx,x) + LogInt *d, *s; + CARD32 dx, x; +{ + CARD32 sbit = x & LOGMASK; + LogInt M; + + x >>= LOGSHIFT; s += x; d += x; + + if ((sbit + dx) >= LOGSIZE) { + if (sbit) { + M = BitRight(LOGONES,sbit); + *d = (*d & ~M) | (*s & M); + dx -= (LOGSIZE - sbit); d++; s++; + } + for (sbit = dx >> LOGSHIFT; sbit > 0; sbit--) { + *d++ = *s++; + } + if (dx &= LOGMASK) { + M = ~BitRight(LOGONES,dx); + *d = (*d & ~M) | (*s & M); + } + } else { + M = (BitRight(LOGONES,sbit) & ~(BitRight(LOGONES,sbit+dx))); + *d = (*d & ~M) | (*s & M); + } +} + +void (*passive_copy[5])() = { + passcopy_real, passcopy_bit, passcopy_byte, passcopy_pair, passcopy_quad +}; + +/**** module bitfun.c ****/ diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/mparith.c b/xie/xc/programs/Xserver/XIE/mixie/process/mparith.c new file mode 100644 index 0000000..0e24532 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/mparith.c @@ -0,0 +1,1186 @@ +/* $XConsortium: mparith.c /main/6 1995/12/02 16:53:37 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module mparith.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mparith.c -- DDXIE arithmetic and math element + + Larry Hare -- AGE Logic, Inc. August, 1993 + +*****************************************************************************/ + + +#define _XIEC_MPARITH +#define _XIEC_PARITH + +/* + * Include files + */ +#include +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + /* + ** Most machines will work fine using the double precision versions + ** of the math functions. If they give you problems, or if you + ** want a bit more speed, then pick one of the following sets of + ** defines. Enjoy. While you are thinking about this you might + ** want to consider changing the cube root function in mprgb.c + ** with fpow(x,1./3.) or powf(x,1./3.). Another similar area is + ** in mpgeomaa.c for the gaussian technique. + */ + +#if defined(USE_EXPF) + /* + ** The very newest ANSI-C libraries promote this style of floating + ** functions. Even if you have these available, you may need to + ** use special compiler options, and prototypes from math.h + */ +# define exp expf +# define log logf +# define pow powf +# define sqrt sqrtf +#endif + +#if defined(USE_FEXP) + /* + ** This is the more antique way to get floating math functions. But + ** you may have to use compiler options or otherwise stand on your + ** head to do this safely. Otherwise the argument may get promoted. + */ +# define exp fexp +# define log flog +# define pow fpow +# define sqrt fsqrt +#endif + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeArith(); +int miAnalyzeMath(); + +/* + * routines used internal to this module + */ +static int CreateArith(); +static int InitializeArith(); +static int ResetArith(); +static int DestroyArith(); + +static int ActivateArithMROI(); +static int ActivateArithDROI(); +static int SetupArith(); +static void ClearArith(); /* and Math */ + +static int CreateMath(); +static int InitializeMath(); +static int SetupMath(); + +/* + * DDXIE Arithmetic and Math entry points + */ +static ddElemVecRec ArithVec = { + CreateArith, + InitializeArith, + (xieIntProc) NULL, + (xieIntProc) NULL, + ResetArith, + DestroyArith + }; + +static ddElemVecRec MathVec = { + CreateMath, + InitializeMath, + ActivateArithMROI, /* yes, arith */ + (xieIntProc) NULL, + ResetArith, /* yes, arith */ + DestroyArith /* yes, arith */ + }; + +/* +* Local Declarations. +*/ + +typedef struct _mparithdef { + void (*action) (); /* to do arithmetic */ + void (*passive) (); /* to copy src1 in passive areas */ + CARD32 *lutptr; /* in case we do a lookup */ + CARD32 nlev; /* integer clipping */ + CARD32 nclip; /* integer clipping */ + CARD32 iconstant; + RealPixel fconstant; +} mpArithPvtRec, *mpArithPvtPtr; /* also used for Math */ + +/* +** NOTE: What happens if element is run over and over with same +** parameters. If we are using a LUT, should we try to keep it? +** If KEEP_LUTS is enabled, then we build any required luts in +** the Create routine and free them in Destroy. Otherwise we do +** so in Initialize and Reset. This is more important on +** operations like divide on non-fpu machines. +*/ + +#define KEEP_LUTS + + +/*------------------------------------------------------------------------ +------------------------ fill in the vector --------------------------- +------------------------------------------------------------------------*/ +int miAnalyzeArith(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ped->ddVec = ArithVec; + return TRUE; +} + +int miAnalyzeMath(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ped->ddVec = MathVec; + return TRUE; +} + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateArith(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* always force syncing between inputs (is nop if only one input) */ + if (!MakePETex(flo,ped, + xieValMaxBands * sizeof(mpArithPvtRec), + SYNC, /* InSync: */ + NO_SYNC /* bandSync: */)) + return FALSE; + +#if defined(KEEP_LUTS) + if (!SetupArith(flo, ped, 0 /* modify ?? */)) + return FALSE; +#endif + + return TRUE; + +} + +static int CreateMath(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* always force syncing between inputs (is nop if only one input) */ + if (!MakePETex(flo,ped, + xieValMaxBands * sizeof(mpArithPvtRec), + SYNC, /* InSync: */ + NO_SYNC /* bandSync: */)) + return FALSE; + +#if defined(KEEP_LUTS) + if (!SetupMath(flo, ped, 0 /* modify ?? */)) + return FALSE; +#endif + + return TRUE; + +} + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ + +static int InitializeArith(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloArithmetic *raw = (xieFloArithmetic *) ped->elemRaw; + peTexPtr pet = ped->peTex; + receptorPtr rcp = pet->receptor; + CARD8 msk = raw->bandMask; + +#if !defined(KEEP_LUTS) + if (!SetupArith(flo, ped, 0 /* modify ?? */)) + return FALSE; +#endif + + ped->ddVec.activate = raw->src2 ? ActivateArithDROI : ActivateArithMROI; + + /* If processing domain, allow replication */ + if (raw->domainPhototag) + rcp[ped->inCnt-1].band[0].replicate = msk; + + InitReceptor(flo, ped, &rcp[SRCt1], NO_DATAMAP, 1, msk, ~msk); + + if (raw->src2) + InitReceptor(flo, ped, &rcp[SRCt2], NO_DATAMAP, 1, msk, NO_BANDS); + + InitProcDomain(flo, ped, raw->domainPhototag, raw->domainOffsetX, + raw->domainOffsetY); + InitEmitter(flo, ped, NO_DATAMAP, SRCt1); + + return !ferrCode(flo); +} + +static int InitializeMath(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloMath *raw = (xieFloMath *) ped->elemRaw; + peTexPtr pet = ped->peTex; + receptorPtr rcp = pet->receptor; + CARD8 msk = raw->bandMask; + +#if !defined(KEEP_LUTS) + if (!SetupMath(flo, ped, 0 /* modify ?? */)) + return FALSE; +#endif + if (raw->domainPhototag) + rcp[ped->inCnt-1].band[0].replicate = msk; + InitReceptor(flo, ped, &rcp[SRCt1], NO_DATAMAP, 1, msk, ~msk); + InitProcDomain(flo, ped, raw->domainPhototag, raw->domainOffsetX, + raw->domainOffsetY); + InitEmitter(flo, ped, NO_DATAMAP, SRCt1); + + return !ferrCode(flo); +} + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ + +static int ActivateArithMROI(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpArithPvtPtr pvt = (mpArithPvtPtr) pet->private; + int band, nbands = pet->receptor[SRCt1].inFlo->bands; + bandPtr sband = &(pet->receptor[SRCt1].band[0]); + bandPtr dband = &(pet->emitter[0]); + + for(band = 0; band < nbands; band++, pvt++, sband++, dband++) { + pointer svoid, dvoid; + + if (!(pet->scheduled & 1< 0) { + (*(pvt->action)) (dvoid, svoid, run, ix, pvt); + ix += run; + } else { + if (dvoid != svoid) + (*(pvt->passive)) (dvoid, svoid, -run, ix); + ix -= run; + } + } + svoid = GetNextSrc(flo,pet,sband,FLUSH); + dvoid = GetNextDst(flo,pet,dband,FLUSH); + } + + FreeData(flo, pet, sband, sband->current); + } + return TRUE; +} + +static int ActivateArithDROI(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpArithPvtPtr pvt = (mpArithPvtPtr) pet->private; + int band, nbands = pet->receptor[SRCt1].inFlo->bands; + bandPtr sband = &(pet->receptor[SRCt1].band[0]); + bandPtr tband = &(pet->receptor[SRCt2].band[0]); + bandPtr dband = &(pet->emitter[0]); + + for(band = 0; band < nbands; band++, pvt++, sband++, tband++, dband++) { + pointer svoid, tvoid, dvoid; + CARD32 w; + + if (!(pet->scheduled & 1<format->width; + if (w > tband->format->width) w = tband->format->width; + + if (!(svoid = GetCurrentSrc(flo,pet,sband)) || + !(tvoid = GetCurrentSrc(flo,pet,tband)) || + !(dvoid = GetCurrentDst(flo,pet,dband))) continue; + + while (!ferrCode(flo) && svoid && tvoid && dvoid && + SyncDomain(flo,ped,dband,FLUSH)) { + INT32 run, ix = 0; + + while (run = GetRun(flo,pet,dband)) { + if (run > 0) { + /* needs to clip to second source, yuck */ + if ((ix + run) > w) { + if (ix < w) + (*(pvt->action)) (dvoid,svoid,tvoid, w-ix, ix, pvt); + if (dvoid != svoid) { + run = sband->format->width - w; + if (run > 0) + (*(pvt->passive)) (dvoid, svoid, run, w); + } + break; + } + (*(pvt->action)) (dvoid, svoid, tvoid, run, ix, pvt); + ix += run; + } else { + if (dvoid != svoid) + (*(pvt->passive)) (dvoid, svoid, -run, ix); + ix -= run; + } + } + svoid = GetNextSrc(flo,pet,sband,FLUSH); + tvoid = GetNextSrc(flo,pet,tband,FLUSH); + dvoid = GetNextDst(flo,pet,dband,FLUSH); + } + + if(!svoid && sband->final) { + DisableSrc(flo,pet,tband,FLUSH); + } else if(!tvoid && tband->final) { + BypassSrc(flo,pet,sband); + } else { + /* both inputs still active, keep the scheduler up to date */ + FreeData(flo,pet,sband,sband->current); + FreeData(flo,pet,tband,tband->current); + } + } + return TRUE; +} + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetArith(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + +#if !defined(KEEP_LUTS) + ClearArith(flo,ped); +#endif + + ResetReceptors(ped); + ResetProcDomain(ped); + ResetEmitter(ped); + return TRUE; +} + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyArith(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + +#if defined(KEEP_LUTS) + ClearArith(flo,ped); +#endif + + /* get rid of the peTex structure and private structures */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc)NULL; + ped->ddVec.initialize = (xieIntProc)NULL; + ped->ddVec.activate = (xieIntProc)NULL; + ped->ddVec.reset = (xieIntProc)NULL; + ped->ddVec.destroy = (xieIntProc)NULL; + + return TRUE; +} + +/*------------------------------------------------------------------------ +--------------------- Lotsa Little Action Routines --------------------- +------------------------------------------------------------------------*/ + +/* xieTypArithmeticOp +** +** #define xieValAdd 1 +** #define xieValSub 2 +** #define xieValSubRev 3 +** #define xieValMul 4 +** #define xieValDiv 5 +** #define xieValDivRev 6 +** #define xieValMin 7 +** #define xieValMax 8 +** #define xieValGamma 9 +** +** xieTypMathOp +** +** #define xieValExp 1 +** #define xieValLn 2 +** #define xieValLog2 3 +** #define xieValLog10 4 +** #define xieValSquare 5 +** #define xieValSqrt 6 +*/ + +#define NADA 0 + +#define AADD D = S1 + S2; if (D >= nlev) D = nlev - 1; +#define ASUB D = (S1 > S2) ? S1 - S2 : 0; +#define ASUBREV D = (S2 > S1) ? S2 - S1 : 0; +#define AMIN D = S1 < S2 ? S1 : S2; +#define AMAX D = S1 > S2 ? S1 : S2; + + +#define FADD D = S1 + S2; +#define FSUB D = S1 - S2; +#define FSUBREV D = S2 - S1; +#define FMUL D = S1 * S2; +#define FDIV D = S1 / S2; +#define FDIVREV D = S1 ? S2 / S1 : S2; +#define FMIN D = S1 < S2 ? S1 : S2; +#define FMAX D = S1 > S2 ? S1 : S2; + /* beware float vs double */ + /* consider using fpow() if available */ +#define FGAM D = pow(S1,S2); +#define IFGAM D = (nlev - 1) * pow(S1/(nlev-1),S2); + +#define BADD D = S1 | S2; +#define BSUB D = S1 & ~S2; +#define BSUBREV D = S2 & ~S1; +#define BMUL D = S1 & S2; +#define BDIV D = S1; +#define BDIVREV D = S2; +#define BMIN D = S1 & S2; /* same as BMUL */ +#define BMAX D = S1 | S2; /* same as BADD */ +#define BGAM D = S1; + + +/*------------------------------------------------------------------------ +--------------------- ROI operations work on subranges ------------------ +------------------------------------------------------------------------*/ + +/* MROI: (*(pvt->action)) (dvoid, src1, run, ix, pvt); */ +/* DROI: (*(pvt->action)) (dvoid, src1, src2, run, ix, pvt); */ + +#define MakeLutI(name1, expr) \ +static void name1(pvt) \ + mpArithPvtPtr pvt; \ +{ \ + CARD32 *lut = pvt->lutptr; \ + CARD32 nlev = pvt->nlev; \ + CARD32 nclip = pvt->nclip; \ + CARD32 i; \ + CARD32 D, S1, S2 = pvt->iconstant; \ + for ( i = 0; i < nlev ; i++) { \ + S1 = i; \ + expr; \ + lut[i] = D; \ + } \ + for ( ; i < nclip ; i++) { \ + lut[i] = 0; \ + } \ +} + +#define MakeLutF2(name1, expr) \ +static void name1(pvt) \ + mpArithPvtPtr pvt; \ +{ \ + CARD32 *lut = pvt->lutptr; \ + CARD32 nlev = pvt->nlev; \ + CARD32 nclip = pvt->nclip; \ + RealPixel Half = (RealPixel) .5; \ + RealPixel dlev = (RealPixel) nlev - Half; \ + RealPixel D, S1, S2 = pvt->fconstant; \ + CARD32 i; \ + for ( i = 0; i < nlev ; i++) { \ + S1 = i; \ + expr; \ + D += .5; \ + if (D < 0.) D = 0; \ + else if (D > dlev) D = dlev; \ + lut[i] = D; \ + } \ + for ( ; i < nclip ; i++) { \ + lut[i] = 0; \ + } \ +} + +#define MakeLutF1(name1, expr) \ +static void name1(pvt) \ + mpArithPvtPtr pvt; \ +{ \ + CARD32 *lut = pvt->lutptr; \ + CARD32 nlev = pvt->nlev; \ + CARD32 nclip = pvt->nclip; \ + RealPixel Half = (RealPixel) .5; \ + RealPixel dlev = (RealPixel) nlev - Half; \ + RealPixel D, S1; \ + CARD32 i; \ + for ( i = 0; i < nlev ; i++) { \ + S1 = i; \ + expr; \ + D += .5; \ + if (D < 0.) D = 0; \ + else if (D > dlev) D = dlev; \ + lut[i] = D; \ + } \ + for ( ; i < nclip ; i++) { \ + lut[i] = 0; \ + } \ +} + +#define MakeLook(name1, itype) \ +static void name1(dst1,src1,nx,x,pvt) \ + pointer dst1, src1; \ + CARD32 nx, x; \ + mpArithPvtPtr pvt; \ +{ \ + itype *dst = ((itype *) dst1) + x; \ + itype *src = ((itype *) src1) + x; \ + CARD32 *lut = pvt->lutptr; \ + CARD32 nmask = pvt->nclip - 1; \ + for ( ; nx > 0 ; nx--) { \ + *dst++ = lut[*src++ & nmask]; \ + } \ +} + +MakeLutI(pr_a, AADD ) +MakeLutI(pr_s, ASUB ) +MakeLutI(pr_sr, ASUBREV ) +MakeLutI(pr_mn, AMIN ) +MakeLutI(pr_mx, AMAX ) + +MakeLutF2(pr_m, FMUL ) +MakeLutF2(pr_d, FDIV ) +MakeLutF2(pr_dr, FDIVREV ) +MakeLutF2(pr_gm, IFGAM ) + +static void (*prep_mono[xieValGamma])() = { +pr_a, pr_s, pr_sr, pr_m, pr_d, pr_dr, pr_mn, pr_mx, pr_gm +}; + +MakeLook(lr_B, BytePixel) +MakeLook(lr_P, PairPixel) +MakeLook(lr_Q, QuadPixel) + +static void (*action_lut[5])() = { + NADA, + NADA, + lr_B, + lr_P, + lr_Q +}; + + + +/* +** NOTE: +** The MakePixI and MakePixF? macros may be used to synthesize monadic +** action routines which can be used in place of look up table based +** routines. They were actually tested at one point in time. The +** invocations still remain below, and the routines can be plugged +** into the action_monoROI[itype][operator] table below. As noted +** elsewhere, these routines might be more appropriate for bigger +** pixels to avoid lookup table explosion; or for machines without +** a data cache, or a very small data cache. IN summary, which +** of these routines should be used depends on: +** a) existence of data cache? +** b) size, organization, and fill method of data cache? +** c) speed of floating operations +*/ + +#define MakePixI(name1, itype, expr) \ +static void name1(dst1,src1,nx,x,pvt) \ + pointer dst1, src1; \ + CARD32 nx, x; \ + mpArithPvtPtr pvt; \ +{ \ + itype *dst = (itype *) dst1; \ + itype *src = (itype *) src1; \ + CARD32 nlev = pvt->nlev; \ + CARD32 D, S1, S2 = (itype) pvt->iconstant; \ + for ( ; nx > 0 ; nx--, x++) { \ + S1 = src[x]; \ + expr \ + dst[x] = D; \ + } \ +} + +#define MakePixF2(name1, itype, expr) \ +static void name1(dst1,src1,nx,x,pvt) \ + pointer dst1, src1; \ + CARD32 nx, x; \ + mpArithPvtPtr pvt; \ +{ \ + itype *dst = (itype *) dst1; \ + itype *src = (itype *) src1; \ + RealPixel Half = (RealPixel) .5; \ + RealPixel dlev = (RealPixel) pvt->nlev - Half; \ + RealPixel D, S1, S2 = (itype) pvt->fconstant; \ + for ( ; nx > 0 ; nx--, x++) { \ + S1 = (RealPixel) src[x]; \ + expr \ + D += Half; \ + if (D < 0.) D = 0; \ + else if (D > dlev) D = dlev; \ + dst[x] = (itype) D; \ + } \ +} + +#define MakePixF1(name1, itype, expr) \ +static void name1(dst1,src1,nx,x,pvt) \ + pointer dst1, src1; \ + CARD32 nx, x; \ + mpArithPvtPtr pvt; \ +{ \ + itype *dst = (itype *) dst1; \ + itype *src = (itype *) src1; \ + RealPixel Half = (RealPixel) .5; \ + RealPixel dlev = (RealPixel) pvt->nlev - Half; \ + RealPixel D, S1; \ + for ( ; nx > 0 ; nx--, x++) { \ + S1 = (RealPixel) src[x]; \ + expr \ + D += Half; \ + if (D < 0.) D = 0; \ + else if (D > dlev) D = dlev; \ + dst[x] = (itype) D; \ + } \ +} + +#define DakePix(name2, itype, expr) \ +static void name2(dst1,src1,src2,nx,x,pvt) \ + pointer dst1, src1, src2; \ + CARD32 nx, x; \ + mpArithPvtPtr pvt; \ +{ \ + itype *dst = ((itype *) dst1) + x; \ + itype *src = ((itype *) src1) + x; \ + itype *trc = ((itype *) src2) + x; \ + CARD32 nlev = pvt->nlev; \ + CARD32 D, S1, S2; \ + for ( ; nx > 0 ; nx--) { \ + S1 = *src++; \ + S2 = *trc++; \ + expr \ + *dst++ = D; \ + } \ +} + +#define MakeFlt2(name1, expr) \ +static void name1(dst1,src1,nx,x,pvt) \ + pointer dst1, src1; \ + CARD32 nx, x; \ + mpArithPvtPtr pvt; \ +{ \ + RealPixel *dst = ((RealPixel *) dst1) + x; \ + RealPixel *src = ((RealPixel *) src1) + x; \ + RealPixel D, S1, S2 = pvt->fconstant; \ + for ( ; nx > 0 ; nx--) { \ + S1 = *src++; \ + expr \ + *dst++ = D; \ + } \ +} + +#define MakeFlt1(name1, expr) \ +static void name1(dst1,src1,nx,x,pvt) \ + pointer dst1, src1; \ + CARD32 nx, x; \ + mpArithPvtPtr pvt; \ +{ \ + RealPixel *dst = ((RealPixel *) dst1) + x; \ + RealPixel *src = ((RealPixel *) src1) + x; \ + RealPixel D, S1; \ + for ( ; nx > 0 ; nx--) { \ + S1 = *src++; \ + expr \ + *dst++ = D; \ + } \ +} + +#define DakeFlt(name2, expr) \ +static void name2(dst1,src1,src2,nx,x,pvt) \ + pointer dst1, src1, src2; \ + CARD32 nx, x; \ + mpArithPvtPtr pvt; \ +{ \ + RealPixel *dst = ((RealPixel *) dst1) + x; \ + RealPixel *src = ((RealPixel *) src1) + x; \ + RealPixel *trc = ((RealPixel *) src2) + x; \ + RealPixel D, S1, S2; \ + for ( ; nx > 0 ; nx--) { \ + S1 = *src++; \ + S2 = *trc++; \ + expr \ + *dst++ = D; \ + } \ +} + +/* Bits no longer required by protocol */ +#define mr_b_a NADA +#define mr_b_s NADA +#define mr_b_sr NADA +#define mr_b_m NADA +#define mr_b_d NADA +#define mr_b_dr NADA +#define mr_b_mn NADA +#define mr_b_mx NADA +#define mr_b_gm NADA + +#define dr_b_a NADA +#define dr_b_s NADA +#define dr_b_sr NADA +#define dr_b_mn NADA +#define dr_b_mx NADA + +/* MakePixI (mr_B_a, BytePixel, AADD ) */ +/* MakePixI (mr_B_s, BytePixel, ASUB ) */ +/* MakePixI (mr_B_sr, BytePixel, ASUBREV ) */ +/* MakePixI (mr_B_mn, BytePixel, AMIN ) */ +/* MakePixI (mr_B_mx, BytePixel, AMAX ) */ + +/* MakePixF2 (mr_B_m, BytePixel, FMUL ) */ +/* MakePixF2 (mr_B_d, BytePixel, FDIV ) */ +/* MakePixF2 (mr_B_dr, BytePixel, FDIVREV ) */ +/* MakePixF2 (mr_B_gm, BytePixel, IFGAM ) */ + + DakePix (dr_B_a, BytePixel, AADD ) + DakePix (dr_B_s, BytePixel, ASUB ) + DakePix (dr_B_sr, BytePixel, ASUBREV ) + DakePix (dr_B_mn, BytePixel, AMIN ) + DakePix (dr_B_mx, BytePixel, AMAX ) + +/* MakePixI (mr_P_a, PairPixel, AADD ) */ +/* MakePixI (mr_P_s, PairPixel, ASUB ) */ +/* MakePixI (mr_P_sr, PairPixel, ASUBREV ) */ +/* MakePixI (mr_P_mn, PairPixel, AMIN ) */ +/* MakePixI (mr_P_mx, PairPixel, AMAX ) */ + +/* MakePixF2 (mr_P_m, PairPixel, FMUL ) */ +/* MakePixF2 (mr_P_d, PairPixel, FDIV ) */ +/* MakePixF2 (mr_P_dr, PairPixel, FDIVREV ) */ +/* MakePixF2 (mr_P_gm, PairPixel, IFGAM ) */ + + DakePix (dr_P_a, PairPixel, AADD ) + DakePix (dr_P_s, PairPixel, ASUB ) + DakePix (dr_P_sr, PairPixel, ASUBREV ) + DakePix (dr_P_mn, PairPixel, AMIN ) + DakePix (dr_P_mx, PairPixel, AMAX ) + +/* MakePixI (mr_Q_a, QuadPixel, AADD ) */ +/* MakePixI (mr_Q_s, QuadPixel, ASUB ) */ +/* MakePixI (mr_Q_sr, QuadPixel, ASUBREV ) */ +/* MakePixI (mr_Q_mn, QuadPixel, AMIN ) */ +/* MakePixI (mr_Q_mx, QuadPixel, AMAX ) */ + +/* MakePixF2 (mr_Q_m, QuadPixel, FMUL ) */ +/* MakePixF2 (mr_Q_d, QuadPixel, FDIV ) */ +/* MakePixF2 (mr_Q_dr, QuadPixel, FDIVREV ) */ +/* MakePixF2 (mr_Q_gm, QuadPixel, IFGAM ) */ + + DakePix (dr_Q_a, QuadPixel, AADD ) + DakePix (dr_Q_s, QuadPixel, ASUB ) + DakePix (dr_Q_sr, QuadPixel, ASUBREV ) + DakePix (dr_Q_mn, QuadPixel, AMIN ) + DakePix (dr_Q_mx, QuadPixel, AMAX ) + +MakeFlt2 (mr_R_a, FADD ) +MakeFlt2 (mr_R_s, FSUB ) +MakeFlt2 (mr_R_sr, FSUBREV ) +MakeFlt2 (mr_R_m, FMUL ) +MakeFlt2 (mr_R_d, FDIV ) +MakeFlt2 (mr_R_dr, FDIVREV ) +MakeFlt2 (mr_R_mn, FMIN ) +MakeFlt2 (mr_R_mx, FMAX ) +MakeFlt2 (mr_R_gm, FGAM ) + +DakeFlt (dr_R_a, FADD ) +DakeFlt (dr_R_s, FSUB ) +DakeFlt (dr_R_sr, FSUBREV ) +DakeFlt (dr_R_mn, FMIN ) +DakeFlt (dr_R_mx, FMAX ) + +/* +ADD, SUB, SUBREV, MUL, DIV, DIVREV, MIN, MAX, GAMMA +*/ + +static void (*action_monoROI[5][xieValGamma])() = { +mr_R_a, mr_R_s, mr_R_sr, mr_R_m, mr_R_d, mr_R_dr, mr_R_mn, mr_R_mx, mr_R_gm, +mr_b_a, mr_b_s, mr_b_sr, mr_b_m, mr_b_d, mr_b_dr, mr_b_mn, mr_b_mx, mr_b_gm, +NADA, NADA, NADA, NADA, NADA, NADA, NADA, NADA, NADA, +NADA, NADA, NADA, NADA, NADA, NADA, NADA, NADA, NADA, +NADA, NADA, NADA, NADA, NADA, NADA, NADA, NADA, NADA +}; + +static void (*action_dyadROI[5][xieValGamma])() = { +dr_R_a, dr_R_s, dr_R_sr, NADA, NADA, NADA, dr_R_mn, dr_R_mx, NADA, +dr_b_a, dr_b_s, dr_b_sr, NADA, NADA, NADA, dr_b_mn, dr_b_mx, NADA, +dr_B_a, dr_B_s, dr_B_sr, NADA, NADA, NADA, dr_B_mn, dr_B_mx, NADA, +dr_P_a, dr_P_s, dr_P_sr, NADA, NADA, NADA, dr_P_mn, dr_P_mx, NADA, +dr_Q_a, dr_Q_s, dr_Q_sr, NADA, NADA, NADA, dr_Q_mn, dr_Q_mx, NADA +}; + + +extern void (*passive_copy[5])(); + +/*------------------------------------------------------------------------ +-------------------------- . . . Math Sandbox . . . ---------------------- +------------------------------------------------------------------------*/ + +/* +** Math NOTES: +** #define xieValExp 1 +** #define xieValLn 2 +** #define xieValLog2 3 +** #define xieValLog10 4 +** #define xieValSquare 5 +** #define xieValSqrt 6 +** +** log(==0) is -infinity with divide by zero exception. sigh. +** log( <0) is quiet NaN with invalid operation exception, sigh. +** sqrt(<0) might be error, 0., or -sqrt(-x) ??? +** +** for log2(), it may be quicker to count bits for integer arguments :-) +** +** also, not all machines have a log2 and log10 in their math library +** so we multiply log() by the magic values M_LOG2E and M_LOG10E. +** +** one can argue that taking logs and exponents and such of small +** integers is a somewhat frenetic exercise. while it might make +** sense to use square or squareroot as an image contrast enhancer, +** it doesn't make sense when applied to small integers either. +** +** just for the heck of it, here are some values for small inputs: +** i log2 logN log10 exp sqrt square +** 0 -Inf -Inf -Inf 1 0 0 +** 1 0 0 0 2.718 1 1 +** 2 1 0.6931 0.301 7.389 1.414 4 +** 3 1.585 1.099 0.4771 20.09 1.732 9 +** 4 2 1.386 0.6021 54.6 2 16 +** 5 2.322 1.609 0.699 148.4 2.236 25 +** +** also note that LN_MAXFLOAT (or LN_MAXDOUBLE) and MAXFLOAT are +** typically defined in values.h, but including it conflicts with +** misc.h on many machines. values.h isn't a very modern .h file +** as standards go these days. help..... +*/ + +#ifndef M_LOG2E +#define M_LOG2E 1.4426950408889634074 +#endif + +#ifndef M_LOG10E +#define M_LOG10E 0.43429448190325182765 +#endif + +#ifndef LN_MAXFLOAT +#define LN_MAXFLOAT 88.7228394 +#endif + +#ifndef MAXFLOAT +#define MAXFLOAT ((float)3.40282346638528860e+38) +#endif + +#define BANY D = S1; +#define FEXP D = (S1 <= (LN_MAXFLOAT-2.) ? exp(S1) : MAXFLOAT); +#define FLGN D = (S1 > 0. ? log(S1) : 0. ); +#define FLG2 D = (S1 > 0. ? log(S1) * M_LOG2E : 0. ); +#define FLG10 D = (S1 > 0. ? log(S1) * M_LOG10E : 0. ); +#define FSQR D = S1 * S1; +#define FSQRT D = (S1 >= 0. ? sqrt(S1) : 0. ); + +MakeLutF1(mpr_exp, FEXP ) +MakeLutF1(mpr_lgN, FLGN ) +MakeLutF1(mpr_lg2, FLG2 ) +MakeLutF1(mpr_lg10, FLG10) +MakeLutF1(mpr_sqr, FSQR ) +MakeLutF1(mpr_sqrt, FSQRT) + + +/* Bits no longer required by protocol */ +#define m_b_exp NADA +#define m_b_lgN NADA +#define m_b_lg2 NADA +#define m_b_lg10 NADA +#define m_b_sqr NADA +#define m_b_sqrt NADA + +MakePixF1 (m_P_sqr, PairPixel, FSQR) /* ??? or use LUT */ +MakePixF1 (m_Q_sqr, QuadPixel, FSQR) + +MakeFlt1 (m_R_exp, FEXP ) +MakeFlt1 (m_R_lgN, FLGN ) +MakeFlt1 (m_R_lg2, FLG2 ) +MakeFlt1 (m_R_lg10, FLG10 ) +MakeFlt1 (m_R_sqr, FSQR ) +MakeFlt1 (m_R_sqrt, FSQRT ) + +static void (*action_mathROI[5][xieValSqrt])() = { +/* EXP, LOG, LOG2, LOG10, SQUARE, SQRT */ +m_R_exp, m_R_lgN, m_R_lg2, m_R_lg10, m_R_sqr, m_R_sqrt, /* floats */ +m_b_exp, m_b_lgN, m_b_lg2, m_b_lg10, m_b_sqr, m_b_sqrt, /* bits */ +NADA, NADA, NADA, NADA, NADA, NADA, /* bytes */ +NADA, NADA, NADA, NADA, m_P_sqr, NADA, /* pairs */ +NADA, NADA, NADA, NADA, m_Q_sqr, NADA /* quads */ +/* EXP, LOG, LOG2, LOG10, SQUARE, SQRT */ +}; + +static void (*prep_math[xieValSqrt])() = { +mpr_exp, mpr_lgN, mpr_lg2, mpr_lg10, mpr_sqr, mpr_sqrt +}; + +/*------------------------------------------------------------------------ +-------------------------- initialize element . . . ---------------------- +------------------------------------------------------------------------*/ + +static int SetupArith(flo,ped,modify) + floDefPtr flo; + peDefPtr ped; + int modify; +{ + xieFloArithmetic *raw = (xieFloArithmetic *) ped->elemRaw; + peTexPtr pet = ped->peTex; + pArithDefPtr epvt = (pArithDefPtr) ped->elemPvt; + mpArithPvtPtr pvt = (mpArithPvtPtr) pet->private; + receptorPtr rcp = pet->receptor; + CARD32 nbands = rcp[SRCt1].inFlo->bands; + bandPtr sband = &(rcp[SRCt1].band[0]); + bandPtr tband = &(rcp[SRCt2].band[0]); + bandPtr dband = &(pet->emitter[0]); + CARD32 band; + + for (band=0; bandformat->class); + void (*act)() = 0; + + if ((raw->bandMask & (1<src2) /* only used for mul, div, divrev, gamma */ + pvt->fconstant = (RealPixel) epvt->constant[band]; + + switch(raw->operator) { + case xieValDiv: if (pvt->fconstant == 0.0) /* epsilon ?? */ + pvt->fconstant = 1.0; + break; + } + + if (IsConstrained(sband->format->class)) { + pvt->nlev = sband->format->levels; + if (!raw->src2) { + CARD32 deep; + SetDepthFromLevels(pvt->nlev,deep); pvt->nclip = 1 << deep; + /* only used for add, sub, subrev, min, max */ + pvt->iconstant = ConstrainConst(epvt->constant[band],pvt->nlev); + } + } + + /* Try to find a dyadic operator */ + if (!act && raw->src2) + act = action_dyadROI[iclass][raw->operator-1]; + + /* + ** NOTE: + ** For larger pixels a look up table begins to be less + ** attractive since the malloc is larger, it takes longer + ** to compute, and the cache hit rate may go down. So + ** we may want to add more actual monodaic arithmetic + ** elements to the table (see MakePixel, it worked once + ** upon a time) and choose between an arithmetic and lookup + ** version based on number of levels. + */ + + /* Try to find a monadic operator */ + if (!act && !raw->src2) + act = action_monoROI[iclass][raw->operator-1]; + + /* Or maybe a monadic look up table operator */ + if (!act && !raw->src2) { + act = action_lut[iclass]; + if (act) { + /* Allocate Lut and Fill it in */ + if (!(pvt->lutptr = (CARD32 *) + XieMalloc(pvt->nclip * sizeof(CARD32)))) + AllocError(flo,ped,return(FALSE)); + (*prep_mono[raw->operator-1]) (pvt); + } + } + + if (!act) + ImplementationError(flo,ped,return(FALSE)); + pvt->action = act; + pvt->passive = passive_copy[iclass]; + } + return TRUE; +} + +static int SetupMath(flo,ped,modify) + floDefPtr flo; + peDefPtr ped; + int modify; +{ + xieFloMath *raw = (xieFloMath *) ped->elemRaw; + peTexPtr pet = ped->peTex; + mpArithPvtPtr pvt = (mpArithPvtPtr) pet->private; + receptorPtr rcp = pet->receptor; + CARD32 nbands = rcp[SRCt1].inFlo->bands; + bandPtr sband = &(rcp[SRCt1].band[0]); + bandPtr dband = &(pet->emitter[0]); + CARD32 band; + + for (band=0; bandformat->class); + void (*act)() = 0; + + if ((raw->bandMask & (1<format->class)) { + CARD32 deep; + pvt->nlev = sband->format->levels; + SetDepthFromLevels(pvt->nlev,deep); pvt->nclip = 1 << deep; + } + + /* + ** NOTE: + ** For larger sized pixels, a lookup table my be counter + ** productive. In addition to the malloc space (eg 64k + ** words), and the low cache hit rate, the time to fill the + ** lookup table can become significant. Even for medium + ** sized pixels, some sort of hashed cache might be a + ** better solution. But I seriously doubt anyone will + ** use these operations on integer pixels very much ... + */ + + /* Try to find a monadic operator */ + if (!act) + act = action_mathROI[iclass][raw->operator-1]; + + /* Or maybe a monadic look up table operator */ + if (!act) { + act = action_lut[iclass]; + if (act) { + /* Allocate Lut and Fill it in */ + if (!(pvt->lutptr = (CARD32 *) + XieMalloc(pvt->nclip * sizeof(CARD32)))) + AllocError(flo,ped,return(FALSE)); + (*prep_math[raw->operator-1]) (pvt); + } + } + if (!act) + ImplementationError(flo,ped,return(FALSE)); + + pvt->action = act; + pvt->passive = passive_copy[iclass]; + } + return TRUE; +} + +static void ClearArith(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + mpArithPvtPtr pvt = (mpArithPvtPtr) (ped->peTex->private); + int band; + + /* free any dynamic private data */ + if (pvt) + for (band = 0 ; band < xieValMaxBands ; band++, pvt++) + if (pvt->lutptr) + pvt->lutptr = (CARD32 *) XieFree(pvt->lutptr); + +} + +/* end module mparith.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/mpbandc.c b/xie/xc/programs/Xserver/XIE/mixie/process/mpbandc.c new file mode 100644 index 0000000..3d0e597 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/mpbandc.c @@ -0,0 +1,234 @@ +/* $XConsortium: mpbandc.c,v 1.5 94/04/17 20:35:10 rws Exp $ */ +/**** module mpbandc.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mpbandc.c -- DDXIE BandCombine element + + Robert NC Shelley -- AGE Logic, Inc. June, 1993 + +*****************************************************************************/ + +#define _XIEC_MPBANDC +#define _XIEC_PBANDC + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include + + +/* routines referenced by other DDXIE modules + */ +int miAnalyzeBandCom(); + +/* routines used internal to this module + */ +static int CreateBandCom(); +static int InitializeBandCom(); +static int ActivateBandCom(); +static int ResetBandCom(); +static int DestroyBandCom(); + +/* DDXIE BandCombine entry points + */ +static ddElemVecRec BandComVec = { + CreateBandCom, + InitializeBandCom, + ActivateBandCom, + (xieIntProc)NULL, + ResetBandCom, + DestroyBandCom + }; + + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeBandCom(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* for now just stash our entry point vector in the peDef */ + ped->ddVec = BandComVec; + + return(TRUE); +} /* end miAnalyzeBandCom */ + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateBandCom(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the photo element definition */ + return MakePETex(flo, ped, NO_PRIVATE, NO_SYNC, NO_SYNC); +} /* end CreateBandCom */ + + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeBandCom(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + return + InitReceptors(flo, ped, NO_DATAMAP, 1) && + InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE); +} /* end InitializeBandCom */ + + +/*------------------------------------------------------------------------ +------------------------ crank some single input data -------------------- +------------------------------------------------------------------------*/ +static int ActivateBandCom(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + receptorPtr rcp = pet->receptor; + bandPtr sbnd, dbnd = pet->emitter; + CARD32 b; + + /* pass input from the 3 receptors to the corresponding output band + */ + for(b = 0; b < xieValMaxBands; ++rcp, ++dbnd, ++b) { + sbnd = rcp->band; + if(!GetCurrentSrc(flo,pet,sbnd)) continue; + + do { + /* pass a clone of the current src strip downstream + */ + if(!PassStrip(flo,pet,dbnd,sbnd->strip)) + return(FALSE); + } while(GetSrc(flo,pet,sbnd,sbnd->maxLocal,FLUSH)); + + FreeData(flo,pet,sbnd,sbnd->maxLocal); + } + return(TRUE); +} /* end ActivateBandCom */ + + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetBandCom(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ResetReceptors(ped); + ResetEmitter(ped); + + return(TRUE); +} /* end ResetBandCom */ + + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyBandCom(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc)NULL; + ped->ddVec.initialize = (xieIntProc)NULL; + ped->ddVec.activate = (xieIntProc)NULL; + ped->ddVec.reset = (xieIntProc)NULL; + ped->ddVec.destroy = (xieIntProc)NULL; + + return(TRUE); +} /* end DestroyBandCom */ + +/* end module mpbandc.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/mpbande.c b/xie/xc/programs/Xserver/XIE/mixie/process/mpbande.c new file mode 100644 index 0000000..e8c2c61 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/mpbande.c @@ -0,0 +1,552 @@ +/* $XConsortium: mpbande.c,v 1.5 94/04/17 20:35:10 rws Exp $ */ +/**** module mpbande.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mpbande.c -- DDXIE BandExtract element + + Robert NC Shelley -- AGE Logic, Inc. June, 1993 + +*****************************************************************************/ + +#define _XIEC_MPBANDE +#define _XIEC_PBANDE + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +/* routines referenced by other DDXIE modules + */ +int miAnalyzeBandExt(); + +/* routines used internal to this module + */ +static int CreateBandExt(); +static int InitializeBandExt(); +static int ActivateBandExt(); +static int ResetBandExt(); +static int DestroyBandExt(); + +/* DDXIE BandExtract entry points + */ +static ddElemVecRec BandExtVec = { + CreateBandExt, + InitializeBandExt, + ActivateBandExt, + (xieIntProc)NULL, + ResetBandExt, + DestroyBandExt + }; + +/* Local Declarations. + */ +typedef float bndExtFlt; +typedef int bndExtInt; +#define BE_FBITS 6 +#define BE_IBITS 32-BE_FBITS +#define BE_LIMIT (1<ddVec = BandExtVec; + + return(TRUE); +} /* end miAnalyzeBandExt */ + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateBandExt(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the photo element definition */ + return MakePETex(flo, ped, sizeof(mpBandExtRec), NO_SYNC, SYNC); +} /* end CreateBandExt */ + + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeBandExt(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + formatPtr ift = &ped->inFloLst[SRCtag].format[0]; + formatPtr oft = &ped->outFlo.format[0]; + pBandExtDefPtr dix = (pBandExtDefPtr)ped->elemPvt; + mpBandExtPtr ddx = (mpBandExtPtr) pet->private; + bandMsk msk = 0; + + if(IsntConstrained(ift->class)) { + /* + * the choice here is easy -- have to do floating calculation of each pixel + */ + ddx->extract = extRR; + ddx->coef[0] = dix->coef[0]; + ddx->coef[1] = dix->coef[1]; + ddx->coef[2] = dix->coef[2]; + ddx->fbias = dix->bias; + msk = ALL_BANDS; + } else { + int size, b, i, ic = ift->class, shift[xieValMaxBands]; + Bool match = TRUE; + bndExtFlt val, lo = dix->bias, hi = dix->bias; + + /* first we'll examine the numbers we have to work with... + */ + for(b = 0; b < xieValMaxBands; ++b) { + if((val = dix->coef[b]) < 0.0) + lo += val * (ift[b].levels-1); + else + hi += val * (ift[b].levels-1); + if(ift[b].levels <= 2 || (bndExtFlt)(i = val) != val || !i || i & i-1) + shift[b] = ift[b].levels < 2 || val == 0.0 ? -1 : 0; + else + SetDepthFromLevels((int)val,shift[b]); /* coef is a power of 2 */ + match &= ic == ift[b].class; + } + if(val = hi >= BE_LIMIT ? hi : lo <= -BE_LIMIT ? lo : 0.0) + ValueError(flo,ped,(int)val, return(FALSE)); + + /* if all bands share a common data class, see if we have an extractor, + * else we'll have to accumulate input, then convert to the output class + */ + if(match && (ddx->extract = action_extract[oft->class-1][ic-1])) + msk = ALL_BANDS; + else if(ddx->accumulator = + (bndExtInt*) XieMalloc(oft->width*sizeof(bndExtInt))) + ddx->output = action_output[oft->class-1]; + else + AllocError(flo,ped, return(FALSE)); + + /* init the control parameters for the action routines + */ + ddx->clip = lo < 0.0 || hi >= oft->levels; + ddx->shift = ddx->extract && shift[0] > 0 && shift[1] > 0 && shift[2] > 0; + ddx->ibias = dix->bias * (ddx->shift ? 1 : (1<shift && !ddx->clip && ddx->extract == extBB) { + ddx->extract = extB4; /* we can use the turbo multi-byte shifter */ + ddx->ibias |= ddx->ibias << 8; + ddx->ibias |= ddx->ibias << 16; + } + for(b = 0; b < xieValMaxBands; ++b) { + if(!ddx->shift && ddx->extract || shift[b] == 0) { + /* + * build luts and assign accumulator functions + */ + size = 1<bits[b] = size-1; + if(!(ddx->lut[b] = (bndExtInt*) XieMalloc(size * sizeof(bndExtInt)))) + AllocError(flo,ped, return(FALSE)); + + for(i = 0; i < ift[b].levels; ++i) + ddx->lut[b][i] = dix->coef[b] * (i<lut[b][i++] = 0; + } else if(shift[b] > 0) { + /* + * coef is an exact power of 2, so just use a left shift count + */ + ddx->bits[b] = shift[b] + ((ddx->shift ? 0 : BE_FBITS) - + (dix->coef[b] == 1.0 ? 1 : 0)); + } + if(!ddx->extract && shift[b] >= 0) { + /* + * assign accumulator function and add this band to the active mask + */ + ddx->accumulate[b] = action_accumulate[ift[b].class-1]; + msk |= 1<receptor[SRCtag],NO_DATAMAP,1,msk,NO_BANDS) + && InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE)); +} /* end InitializeBandExt */ + + +/*------------------------------------------------------------------------ +------------------------ crank some single input data -------------------- +------------------------------------------------------------------------*/ +static int ActivateBandExt(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpBandExtPtr ddx = (mpBandExtPtr) pet->private; + bandPtr ib = &pet->receptor[SRCtag].band[0]; + bandPtr ob = &pet->emitter[0]; + bndExtInt *acc = ddx->accumulator; + formatPtr oft = ob->format; + CARD32 b, i, width = oft->width; + CARD32 maxLev = oft->levels-1; + bandMsk ok, ready = pet->scheduled; + pointer o, i0 = NULL, i1 = NULL, i2 = NULL; + + ok = NO_BANDS; + if(ready & 1 && (i0 = GetCurrentSrc(flo,pet,&ib[0]))) ok |= 1; + if(ready & 2 && (i1 = GetCurrentSrc(flo,pet,&ib[1]))) ok |= 2; + if(ready & 4 && (i2 = GetCurrentSrc(flo,pet,&ib[2]))) ok |= 4; + if((o = GetCurrentDst(flo,pet,ob)) && ok == ready) + do { + /* if we have a "full service" extractor, go for the whole enchalada + */ + if( ddx->extract) + (*ddx->extract)(o, i0, i1, i2, width, maxLev, ddx); + else { + /* initialize accumulator with the bias value + */ + if(ddx->ibias) + for(i = 0; i < width; acc[i++] = ddx->ibias); + else + bzero((char *)acc, width * sizeof(bndExtInt)); + + /* accumulate data from each active band, then convert to output class + */ + if( ddx->accumulate[0]) + (*ddx->accumulate[0])(acc, i0, width, ddx->bits[0], ddx->lut[0]); + if( ddx->accumulate[1]) + (*ddx->accumulate[1])(acc, i1, width, ddx->bits[1], ddx->lut[1]); + if( ddx->accumulate[2]) + (*ddx->accumulate[2])(acc, i2, width, ddx->bits[2], ddx->lut[2]); + (*ddx->output)(o, acc, width, maxLev, ddx->clip); + } + ok = NO_BANDS; + if(ready & 1 && (i0 = GetNextSrc(flo,pet,&ib[0],FLUSH))) ok |= 1; + if(ready & 2 && (i1 = GetNextSrc(flo,pet,&ib[1],FLUSH))) ok |= 2; + if(ready & 4 && (i2 = GetNextSrc(flo,pet,&ib[2],FLUSH))) ok |= 4; + } while((o = GetNextDst(flo,pet,ob,FLUSH)) && ok == ready); + + /* free the input data we used + */ + for(b = 0; b < xieValMaxBands; ++b) + if(ready & 1<peTex->private; + CARD32 b = xieValMaxBands; + + if(ddx->accumulator) + ddx->accumulator = (bndExtInt*)XieFree(ddx->accumulator); + + while(b--) { + if(ddx->lut[b]) + ddx->lut[b] = (bndExtInt*) XieFree(ddx->lut[b]); + ddx->accumulate[b] = (xieVoidProc)NULL; + } + ddx->extract = (xieVoidProc)NULL; + ddx->output = (xieVoidProc)NULL; + + ResetReceptors(ped); + ResetEmitter(ped); + + return(TRUE); +} /* end ResetBandExt */ + + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyBandExt(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc)NULL; + ped->ddVec.initialize = (xieIntProc)NULL; + ped->ddVec.activate = (xieIntProc)NULL; + ped->ddVec.reset = (xieIntProc)NULL; + ped->ddVec.destroy = (xieIntProc)NULL; + + return(TRUE); +} /* end DestroyBandExt */ + +/*------------------------------------------------------------------------ +--------- extract functions -- used when input data classes match -------- +------------------------------------------------------------------------*/ +static void extB4(O, I0, I1, I2, width, dummy, ddx) + pointer O, I0, I1, I2; CARD32 width, dummy; mpBandExtPtr ddx; +{ + QuadPixel *o = (QuadPixel*)O; + QuadPixel *i0 = (QuadPixel*)I0, *i1 = (QuadPixel*)I1, *i2 = (QuadPixel*)I2; + bndExtInt b0 = ddx->bits[0], b1 = ddx->bits[1], b2 = ddx->bits[2]; + bndExtInt d = ddx->ibias; + int i, w = width+3>>2; + + for(i = 0; i < w; ++i) + *o++ = (i0[i]<coef[0], c1 = ddx->coef[1], c2 = ddx->coef[2], + d = ddx->fbias; + int i; + for(i = 0; i < width; ++i) + o[i] = i0[i] * c0 + i1[i] * c1 + i2[i] * c2 + d; +} + +#define BAND_EXTRACT(name,otype,itype) \ +static void name(O, I0, I1, I2, width, maxLev, ddx) \ + pointer O, I0, I1, I2; CARD32 width, maxLev; mpBandExtPtr ddx; \ +{ \ + otype *o = (otype*)O; \ + itype *i0 = (itype*)I0, *i1 = (itype*)I1, *i2 = (itype*)I2; \ + bndExtInt b0 = ddx->bits[0], b1 = ddx->bits[1], b2 = ddx->bits[2]; \ + bndExtInt d = ddx->ibias; \ + int i; \ + if(ddx->shift) { \ + if(ddx->clip) \ + for(i = 0; i < width; ++i) { \ + int tmp = (i0[i]< maxLev) *o++ = maxLev; \ + else *o++ = tmp; \ + } \ + else \ + for(i = 0; i < width; ++i) \ + *o++ = (i0[i]<lut[0], *L1 = ddx->lut[1], *L2 = ddx->lut[2]; \ + if(ddx->clip) { \ + bndExtInt limit = (maxLev+1)<= limit) *o++ = maxLev; \ + else *o++ = tmp>>BE_FBITS; \ + } \ + } else \ + for(i = 0; i < width; ++i) \ + *o++ = L0[i0[i] & b0]+L1[i1[i] & b1]+L2[i2[i] & b2]+d>>BE_FBITS;\ + } \ +} +BAND_EXTRACT(extBB,BytePixel,BytePixel) +BAND_EXTRACT(extBP,BytePixel,PairPixel) +BAND_EXTRACT(extPB,PairPixel,BytePixel) +BAND_EXTRACT(extPP,PairPixel,PairPixel) +BAND_EXTRACT(extQB,QuadPixel,BytePixel) +BAND_EXTRACT(extQP,QuadPixel,PairPixel) + +/*------------------------------------------------------------------------ +---- accumulator functions (accumulate products from individual bands) --- +------------------------------------------------------------------------*/ +static void acc_b(acc, SRC, width, dummy, lut) + bndExtInt *acc; pointer SRC; CARD32 width; bndExtInt dummy, *lut; +{ + LogInt *i = (LogInt *)SRC, ival, M; + bndExtInt *o = (bndExtInt*)acc, c = lut[1]; + int bw = width; + int nw = bw >> LOGSHIFT; + while(nw--) + for(ival = *i++,M = LOGLEFT; M; ++o, LOGRIGHT(M)) if(ival & M) *o += c; + if(bw &= LOGMASK) + for(ival = *i, M = LOGLEFT; bw--; ++o, LOGRIGHT(M)) if(ival & M) *o += c; +} + +#define BAND_ACCUMULATE(name,itype) \ +static void name(acc, SRC, width, bits, lut) \ + bndExtInt *acc; pointer SRC; CARD32 width; bndExtInt bits, *lut; \ +{ \ + itype *src = (itype*)SRC; \ + int i = 0; \ + if(lut) while(i < width) acc[i++] += lut[*src++ & bits]; \ + else while(i < width) acc[i++] += *src++ << bits; \ +} +BAND_ACCUMULATE(acc_B,BytePixel) +BAND_ACCUMULATE(acc_P,PairPixel) + +/*------------------------------------------------------------------------ +---- output functions (convert accumulated data to output data class) ---- +------------------------------------------------------------------------*/ +static void out_b(DST, acc, width, dummy1, dummy2) + pointer DST; bndExtInt *acc; CARD32 width, dummy1; Bool dummy2; +{ + bndExtInt *i = acc; + LogInt *o = (LogInt*)DST, M, v; + int bw; + for(bw = width; bw >= LOGSIZE; *o++ = v, bw -= LOGSIZE) + for(v = 0, M = LOGLEFT; M; LOGRIGHT(M)) if(*i++ > 0) v |= M; + if(bw > 0) { + for(v = 0, M = LOGLEFT; bw--; LOGRIGHT(M)) if(*i++ > 0) v |= M; + *o++ = v; + } +} + +#define BAND_OUTPUT(name,otype) \ +static void name(DST, acc, width, maxLev, clip) \ + pointer DST; bndExtInt *acc; CARD32 width, maxLev; Bool clip; \ +{ \ + otype *dst = (otype*)DST; \ + bndExtInt limit = (maxLev+1)<= limit) *dst++ = maxLev; \ + else *dst++ = tmp >> BE_FBITS; \ + else \ + while(i < width) *dst++ = acc[i++] >> BE_FBITS; \ +} +BAND_OUTPUT(out_B,BytePixel) +BAND_OUTPUT(out_P,PairPixel) +BAND_OUTPUT(out_Q,QuadPixel) + +/* end module mpbande.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/mpbands.c b/xie/xc/programs/Xserver/XIE/mixie/process/mpbands.c new file mode 100644 index 0000000..d24e06a --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/mpbands.c @@ -0,0 +1,240 @@ +/* $XConsortium: mpbands.c,v 1.4 94/04/17 20:35:11 rws Exp $ */ +/**** module mpbands.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mpbands.c -- DDXIE BandSelect element + + Robert NC Shelley -- AGE Logic, Inc. September, 1993 + +*****************************************************************************/ + +#define _XIEC_MPBANDS +#define _XIEC_PBANDS + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include + + +/* routines referenced by other DDXIE modules + */ +int miAnalyzeBandSel(); + +/* routines used internal to this module + */ +static int CreateBandSel(); +static int InitializeBandSel(); +static int ActivateBandSel(); +static int ResetBandSel(); +static int DestroyBandSel(); + +/* DDXIE BandSelect entry points + */ +static ddElemVecRec BandSelVec = { + CreateBandSel, + InitializeBandSel, + ActivateBandSel, + (xieIntProc)NULL, + ResetBandSel, + DestroyBandSel + }; + + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeBandSel(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* for now just stash our entry point vector in the peDef */ + ped->ddVec = BandSelVec; + + return(TRUE); +} /* end miAnalyzeBandSel */ + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateBandSel(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the photo element definition */ + return MakePETex(flo, ped, NO_PRIVATE, NO_SYNC, NO_SYNC); +} /* end CreateBandSel */ + + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeBandSel(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloBandSelect *raw = (xieFloBandSelect *)ped->elemRaw; + + if(raw->bandNumber) + return(InitReceptor(flo,ped,&ped->peTex->receptor[SRCtag],NO_DATAMAP,1, + (bandMsk)(1<bandNumber),NO_BANDS) && + InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE)); + else + return(InitReceptor(flo,ped,&ped->peTex->receptor[SRCtag],NO_DATAMAP,1, + NO_BANDS,(bandMsk)1)); +} /* end InitializeBandSel */ + + +/*------------------------------------------------------------------------ +--------------------------- pass some input data ------------------------- +------------------------------------------------------------------------*/ +static int ActivateBandSel(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloBandSelect *raw = (xieFloBandSelect*)ped->elemRaw; + bandPtr sbnd = &pet->receptor->band[raw->bandNumber]; + bandPtr dbnd = pet->emitter; + + /* pass the chosen receptor band to our output band + */ + if(GetCurrentSrc(flo,pet,sbnd)) { + do { + /* pass a clone of the current src strip downstream + */ + if(!PassStrip(flo,pet,dbnd,sbnd->strip)) + return(FALSE); + } while(GetSrc(flo,pet,sbnd,sbnd->maxLocal,FLUSH)); + + FreeData(flo,pet,sbnd,sbnd->maxLocal); + } + return(TRUE); +} /* end ActivateBandSel */ + + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetBandSel(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloBandSelect *raw = (xieFloBandSelect *)ped->elemRaw; + + if(raw->bandNumber) { + ResetReceptors(ped); + ResetEmitter(ped); + } + return(TRUE); +} /* end ResetBandSel */ + + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyBandSel(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc)NULL; + ped->ddVec.initialize = (xieIntProc)NULL; + ped->ddVec.activate = (xieIntProc)NULL; + ped->ddVec.reset = (xieIntProc)NULL; + ped->ddVec.destroy = (xieIntProc)NULL; + + return(TRUE); +} /* end DestroyBandSel */ + +/* end module mpbands.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/mpblend.c b/xie/xc/programs/Xserver/XIE/mixie/process/mpblend.c new file mode 100644 index 0000000..ed8e4ee --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/mpblend.c @@ -0,0 +1,908 @@ +/* $XConsortium: mpblend.c /main/6 1995/12/02 16:53:41 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module mpblend.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mpblend.c -- DDXIE Blend element + + Dean Verheiden -- AGE Logic, Inc. June, 1993 + +*****************************************************************************/ + +#define _XIEC_MPBLEND +#define _XIEC_PBLEND + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include + + +typedef float BlendFloat; +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeBlend(); + +/* + * routines used internal to this module + */ +static int CreateBlend(); +static int ResetBlend(); +static int DestroyBlend(); + +static int InitializeMonoBlend(); +static int InitializeDualBlend(); +static int InitializeMonoAlphaBlend(); +static int InitializeDualAlphaBlend(); + +static int MonoBlend(); +static int DualBlend(); +static int MonoAlphaBlend(); +static int DualAlphaBlend(); + + +/* + * DDXIE Blend entry points + */ +static ddElemVecRec BlendVec = { + CreateBlend, + (xieIntProc)NULL, + (xieIntProc)NULL, + (xieIntProc)NULL, + ResetBlend, + DestroyBlend + }; + +/* + * Local Declarations. + */ + +typedef struct _mpblenddef { + void (*action) (); +} mpBlendPvtRec, *mpBlendPvtPtr; + + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeBlend(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloBlend *raw = (xieFloBlend *)ped->elemRaw; + pBlendDefPtr pvt = (pBlendDefPtr)ped->elemPvt; + CARD16 aindex = pvt->aindex; + + /* for now just stash our entry point vector in the peDef */ + ped->ddVec = BlendVec; + if (aindex) { + if (raw->src2) { + ped->ddVec.initialize = InitializeDualAlphaBlend; + ped->ddVec.activate = DualAlphaBlend; + } else { + ped->ddVec.initialize = InitializeMonoAlphaBlend; + ped->ddVec.activate = MonoAlphaBlend; + } + } else { + if (raw->src2) { + ped->ddVec.initialize = InitializeDualBlend; + ped->ddVec.activate = DualBlend; + } else { + ped->ddVec.initialize = InitializeMonoBlend; + ped->ddVec.activate = MonoBlend; + } + } + + return(TRUE); +} /* end miAnalyzeBlend */ + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateBlend(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + int auxsize = xieValMaxBands * sizeof(mpBlendPvtRec); + + /* always force syncing between inputs (is nop if only one input) */ + return MakePETex(flo, ped, auxsize, SYNC , NO_SYNC); +} /* end CreateBlend */ + + +static void MonoR(), MonoQ(), MonoP(), MonoB(); +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeMonoBlend(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloBlend *raw = (xieFloBlend *)ped->elemRaw; + CARD8 msk = raw->bandMask; + peTexPtr pet = ped->peTex; + receptorPtr rcp = pet->receptor; + mpBlendPvtPtr pvt = (mpBlendPvtPtr) pet->private; + int band, nbands; + bandPtr iband; + + /* If processing domain, allow replication */ + if (raw->domainPhototag) + pet->receptor[ped->inCnt-1].band[0].replicate = msk; + + if (!(InitReceptor(flo,ped,&rcp[SRCt1],NO_DATAMAP,1,msk,~msk) && + InitProcDomain(flo, ped, raw->domainPhototag, raw->domainOffsetX, + raw->domainOffsetY) && + InitEmitter(flo,ped,NO_DATAMAP,SRCt1))) + return (FALSE); + + /* Figure out the appropriate action vector */ + nbands = pet->receptor[SRCtag].inFlo->bands; + iband = &(pet->receptor[SRCtag].band[0]); + for(band = 0; band < nbands; band++, pvt++, iband++) { + switch (iband->format->class) { + case UNCONSTRAINED: pvt->action = MonoR; break; + case QUAD_PIXEL: pvt->action = MonoQ; break; + case PAIR_PIXEL: pvt->action = MonoP; break; + case BYTE_PIXEL: pvt->action = MonoB; break; + case BIT_PIXEL: + default: ImplementationError(flo, ped, return(FALSE)); + break; + } + } + + return( TRUE ); +} /* end InitializeMonoBlend */ + +static void DualR(), DualQ(), DualP(), DualB(); +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeDualBlend(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloBlend *raw = (xieFloBlend *)ped->elemRaw; + peTexPtr pet = ped->peTex; + CARD8 msk = raw->bandMask; + receptorPtr rcp = pet->receptor; + mpBlendPvtPtr pvt = (mpBlendPvtPtr) pet->private; + int band, nbands; + bandPtr iband; + + /* If processing domain, allow replication */ + if (raw->domainPhototag) + pet->receptor[ped->inCnt-1].band[0].replicate = msk; + + if (!(InitReceptor(flo,ped,&rcp[SRCt1],NO_DATAMAP,1,msk,~msk) && + InitReceptor(flo,ped,&rcp[SRCt2],NO_DATAMAP,1,msk,NO_BANDS) && + InitProcDomain(flo, ped, raw->domainPhototag, raw->domainOffsetX, + raw->domainOffsetY) && + InitEmitter(flo,ped,0,SRCt1))) + return (FALSE); + + /* Figure out the appropriate action vector */ + nbands = pet->receptor[SRCtag].inFlo->bands; + iband = &(pet->receptor[SRCtag].band[0]); + for(band = 0; band < nbands; band++, pvt++, iband++) { + switch (iband->format->class) { + case UNCONSTRAINED: pvt->action = DualR; break; + case QUAD_PIXEL: pvt->action = DualQ; break; + case PAIR_PIXEL: pvt->action = DualP; break; + case BYTE_PIXEL: pvt->action = DualB; break; + case BIT_PIXEL: + default: ImplementationError(flo, ped, return(FALSE)); + break; + } + } + + return( TRUE ); +} /* end InitializeDualBlend */ + +static void MonoAlphaRQ(), MonoAlphaQQ(), MonoAlphaPQ(), MonoAlphaBQ(); +static void MonoAlphaRP(), MonoAlphaQP(), MonoAlphaPP(), MonoAlphaBP(); +static void MonoAlphaRB(), MonoAlphaQB(), MonoAlphaPB(), MonoAlphaBB(); +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeMonoAlphaBlend(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + xieFloBlend *raw = (xieFloBlend *)ped->elemRaw; + CARD8 msk = raw->bandMask; + receptorPtr rcp = pet->receptor; + CARD16 aindex = ((pBlendDefPtr)ped->elemPvt)->aindex; + bandPtr ab = &pet->receptor[aindex].band[0]; + CARD8 nbands = pet->receptor[SRCtag].inFlo->bands; + CARD8 abands = pet->receptor[aindex].inFlo->bands; + mpBlendPvtPtr pvt = (mpBlendPvtPtr) pet->private; + int band; + bandPtr iband; + + /* Replicate the alpha plane to all active bands */ + if (nbands == 3 && abands == 1) + ab->replicate = msk; + + /* If processing domain, allow replication */ + if (raw->domainPhototag) + pet->receptor[ped->inCnt-1].band[0].replicate = msk; + + if (!(InitReceptor(flo,ped,&rcp[SRCt1],NO_DATAMAP,1,msk,~msk) && + InitReceptor(flo,ped,&rcp[aindex],NO_DATAMAP,1,1,NO_BANDS) && + InitProcDomain(flo, ped, raw->domainPhototag, raw->domainOffsetX, + raw->domainOffsetY) && + InitEmitter(flo,ped,0,SRCt1))) + return (FALSE); + + /* Figure out the appropriate action vector based on src and alpha plane */ + iband = &(pet->receptor[SRCtag].band[0]); + for(band = 0; band < nbands; band++, pvt++, iband++) { + switch (iband->format->class) { + case UNCONSTRAINED: + switch (ab->format->class) { + case QUAD_PIXEL: pvt->action = MonoAlphaRQ; break; + case PAIR_PIXEL: pvt->action = MonoAlphaRP; break; + case BYTE_PIXEL: pvt->action = MonoAlphaRB; break; + case BIT_PIXEL: + default: ImplementationError(flo, ped, + return(FALSE)); + break; + } + break; + case QUAD_PIXEL: + switch (ab->format->class) { + case QUAD_PIXEL: pvt->action = MonoAlphaQQ; break; + case PAIR_PIXEL: pvt->action = MonoAlphaQP; break; + case BYTE_PIXEL: pvt->action = MonoAlphaQB; break; + case BIT_PIXEL: + default: ImplementationError(flo, ped, + return(FALSE)); + break; + } + break; + case PAIR_PIXEL: + switch (ab->format->class) { + case QUAD_PIXEL: pvt->action = MonoAlphaPQ; break; + case PAIR_PIXEL: pvt->action = MonoAlphaPP; break; + case BYTE_PIXEL: pvt->action = MonoAlphaPB; break; + case BIT_PIXEL: + default: ImplementationError(flo, ped, + return(FALSE)); + break; + } + break; + case BYTE_PIXEL: + switch (ab->format->class) { + case QUAD_PIXEL: pvt->action = MonoAlphaBQ; break; + case PAIR_PIXEL: pvt->action = MonoAlphaBP; break; + case BYTE_PIXEL: pvt->action = MonoAlphaBB; break; + case BIT_PIXEL: + default: ImplementationError(flo, ped, + return(FALSE)); + break; + } + break; + case BIT_PIXEL: + default: ImplementationError(flo, ped, return(FALSE)); + break; + } + } + + return( TRUE ); +} /* end InitializeMonoAlphaBlend */ + +static void DualAlphaRQ(), DualAlphaQQ(), DualAlphaPQ(), DualAlphaBQ(); +static void DualAlphaRP(), DualAlphaQP(), DualAlphaPP(), DualAlphaBP(); +static void DualAlphaRB(), DualAlphaQB(), DualAlphaPB(), DualAlphaBB(); +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeDualAlphaBlend(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + xieFloBlend *raw = (xieFloBlend *)ped->elemRaw; + CARD8 msk = raw->bandMask; + receptorPtr rcp = pet->receptor; + CARD16 aindex = ((pBlendDefPtr)ped->elemPvt)->aindex; + bandPtr ab = &pet->receptor[aindex].band[0]; + mpBlendPvtPtr pvt = (mpBlendPvtPtr) pet->private; + CARD8 nbands = pet->receptor[SRCtag].inFlo->bands; + CARD8 abands = pet->receptor[aindex].inFlo->bands; + int band; + bandPtr iband; + + /* Replicate the alpha plane to all active bands */ + if (nbands == 3 && abands == 1) + ab->replicate = msk; + + /* If processing domain, allow replication */ + if (raw->domainPhototag) + pet->receptor[ped->inCnt-1].band[0].replicate = msk; + + if (!(InitReceptor(flo,ped,&rcp[SRCt1],NO_DATAMAP,1,msk,~msk) && + InitReceptor(flo,ped,&rcp[SRCt2],NO_DATAMAP,1,msk,NO_BANDS) && + InitReceptor(flo,ped,&rcp[aindex],NO_DATAMAP,1,1,NO_BANDS) && + InitProcDomain(flo, ped, raw->domainPhototag, raw->domainOffsetX, + raw->domainOffsetY) && + InitEmitter(flo,ped,0,SRCt1))) + return (FALSE); + + /* Figure out the appropriate action vector based on src and alpha plane */ + iband = &(pet->receptor[SRCtag].band[0]); + for(band = 0; band < nbands; band++, pvt++, iband++) { + switch (iband->format->class) { + case UNCONSTRAINED: + switch (ab->format->class) { + case QUAD_PIXEL: pvt->action = DualAlphaRQ; break; + case PAIR_PIXEL: pvt->action = DualAlphaRP; break; + case BYTE_PIXEL: pvt->action = DualAlphaRB; break; + case BIT_PIXEL: + default: ImplementationError(flo, ped, + return(FALSE)); + break; + } + break; + case QUAD_PIXEL: + switch (ab->format->class) { + case QUAD_PIXEL: pvt->action = DualAlphaQQ; break; + case PAIR_PIXEL: pvt->action = DualAlphaQP; break; + case BYTE_PIXEL: pvt->action = DualAlphaQB; break; + case BIT_PIXEL: + default: ImplementationError(flo, ped, + return(FALSE)); + break; + } + break; + case PAIR_PIXEL: + switch (ab->format->class) { + case QUAD_PIXEL: pvt->action = DualAlphaPQ; break; + case PAIR_PIXEL: pvt->action = DualAlphaPP; break; + case BYTE_PIXEL: pvt->action = DualAlphaPB; break; + case BIT_PIXEL: + default: ImplementationError(flo, ped, + return(FALSE)); + break; + } + break; + case BYTE_PIXEL: + switch (ab->format->class) { + case QUAD_PIXEL: pvt->action = DualAlphaBQ; break; + case PAIR_PIXEL: pvt->action = DualAlphaBP; break; + case BYTE_PIXEL: pvt->action = DualAlphaBB; break; + case BIT_PIXEL: + default: ImplementationError(flo, ped, + return(FALSE)); + break; + } + break; + case BIT_PIXEL: + default: ImplementationError(flo, ped, return(FALSE)); + break; + } + } + + return( TRUE ); +} /* end InitializeDualAlphaBlend */ + +/*------------------------------------------------------------------------ +------------------------ crank some single input data -------------------- +------------------------------------------------------------------------*/ +static int MonoBlend(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + pBlendDefPtr pvt = (pBlendDefPtr) ped->elemPvt; + BlendFloat aconst1 = pvt->alphaConst; + BlendFloat aconst2 = (BlendFloat)1.0 - aconst1; + double *sconst = pvt->constant; + receptorPtr rcp = pet->receptor; + CARD32 bands = rcp[SRCt1].inFlo->bands; + bandPtr sb1 = &rcp[SRCt1].band[0]; + bandPtr bnd = &pet->emitter[0]; + mpBlendPvtPtr mpvt = (mpBlendPvtPtr) pet->private; + pointer sr1, dst; + CARD32 b; + + for(b = 0; b < bands; b++, sb1++, bnd++, sconst++, mpvt++) { + BlendFloat offset = *sconst * aconst1; + + if (!(pet->scheduled & 1<pitch); + + while (run = GetRun(flo,pet,bnd)) { + if (run > 0) { + (*(mpvt->action)) (currentx,run,sr1,dst,aconst2,offset); + currentx += run; + } else + currentx -= run; + } + + /* get pointers to the next src and dst scanlines */ + sr1 = GetNextSrc(flo,pet,sb1,TRUE); + dst = GetNextDst(flo,pet,bnd,TRUE); + } + /* make sure the scheduler knows how much src we used */ + FreeData(flo,pet,sb1,sb1->current); + } + return(TRUE); +} /* end MonoBlend */ + +/*------------------------------------------------------------------------ +-- Case with two inputs: src1, src2, no alpha plane --------------------- +------------------------------------------------------------------------*/ +static int DualBlend(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + BlendFloat aconst1 = ((pBlendDefPtr)ped->elemPvt)->alphaConst; + BlendFloat aconst2 = 1.0 - aconst1; + receptorPtr rcp = pet->receptor; + CARD32 bands = rcp[SRCt1].inFlo->bands; + bandPtr sb1 = &rcp[SRCt1].band[0]; + bandPtr sb2 = &rcp[SRCt2].band[0]; + bandPtr bnd = &pet->emitter[0]; + mpBlendPvtPtr mpvt = (mpBlendPvtPtr) pet->private; + pointer sr1, sr2, dst; + CARD32 b, w; + + for(b = 0; b < bands; b++,sb1++,sb2++,bnd++,mpvt++) { + + if (!(pet->scheduled & 1<format->width > sb2->format->width) + w = sb2->format->width; + else + w = sb1->format->width; + + /* get pointers to the initial src-1, src-2, and dst scanlines */ + sr1 = GetCurrentSrc(flo,pet,sb1); + sr2 = GetCurrentSrc(flo,pet,sb2); + dst = GetCurrentDst(flo,pet,bnd); + + /* continue while all is well and we have pointers */ + while(!ferrCode(flo) && sr1 && sr2 && dst && + SyncDomain(flo,ped,bnd,FLUSH)) { + INT32 run, currentx = 0; + + if (sr1 != dst) memcpy (dst, sr1, bnd->pitch); + + while ((run = GetRun(flo,pet,bnd)) && currentx < w) { + if (run > 0) { + if (currentx + run > w) /* Yuck, have to clip */ + run = w - currentx; + (*(mpvt->action)) (currentx,run,sr1,sr2,dst,aconst1,aconst2); + currentx += run; + } else + currentx -= run; + } + + /* get pointers to the next src-1, src-2, and dst scanlines */ + sr1 = GetNextSrc(flo,pet,sb1,TRUE); + sr2 = GetNextSrc(flo,pet,sb2,TRUE); + dst = GetNextDst(flo,pet,bnd,TRUE); + } + + /* If src2 < sr1, pass remaining lines through untouched */ + if(!sr1 && sb1->final) /* when sr1 runs out, we're done */ + DisableSrc(flo,pet,sb2,FLUSH); + else if(!sr2 && sb2->final) /* when sr2 runs out, pass-thru sr1 */ + BypassSrc(flo,pet,sb1); + else { /* both inputs still active, keep the scheduler up to date */ + FreeData(flo,pet,sb1,sb1->current); + FreeData(flo,pet,sb2,sb2->current); + } + } + return(TRUE); +} /* end DualBlend */ + +/*------------------------------------------------------------------------ +-- Case with two inputs: src1, alpha plane, no src2 --------------------- +------------------------------------------------------------------------*/ +static int MonoAlphaBlend(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + pBlendDefPtr pvt = (pBlendDefPtr) ped->elemPvt; + BlendFloat invaconst = 1/pvt->alphaConst; + CARD16 aindex = pvt->aindex; + receptorPtr rcp = pet->receptor; + CARD32 bands = rcp[SRCt1].inFlo->bands; + bandPtr sb1 = &rcp[SRCt1].band[0]; + bandPtr aband = &rcp[aindex].band[0]; + bandPtr bnd = &pet->emitter[0]; + double *sconst = pvt->constant; + mpBlendPvtPtr mpvt = (mpBlendPvtPtr) pet->private; + pointer sr1, alpha, dst; + CARD32 b, w; + + for(b = 0; b < bands; b++,sb1++,bnd++,sconst++, mpvt++, aband++) { + BlendFloat scalefactor = *sconst * invaconst; + + if (!(pet->scheduled & 1<format->width > aband->format->width) + w = aband->format->width; + else + w = sb1->format->width; + + /* get pointers to the initial src-1, alpha, and dst scanlines */ + sr1 = GetCurrentSrc(flo,pet,sb1); + alpha = GetCurrentSrc(flo,pet,aband); + dst = GetCurrentDst(flo,pet,bnd); + + /* continue while all is well and we have pointers */ + while(!ferrCode(flo) && sr1 && alpha && dst && + SyncDomain(flo,ped,bnd,FLUSH)) { + INT32 run, currentx = 0; + + if (sr1 != dst) memcpy (dst, sr1, bnd->pitch); + + while ((run = GetRun(flo,pet,bnd)) && currentx < w ) { + if (run > 0) { + if (currentx + run > w ) /* Yuck, have to clip */ + run = w - currentx; + (*(mpvt->action))(currentx,run,sr1,alpha,dst,invaconst,scalefactor); + currentx += run; + } else + currentx -= run; + } + + /* get pointers to the next src-1 and dst scanlines */ + sr1 = GetNextSrc(flo,pet,sb1,FLUSH); + alpha = GetNextSrc(flo,pet,aband,FLUSH); + dst = GetNextDst(flo,pet,bnd,FLUSH); + } + + /* If alpha < sr1, pass remaining lines through untouched */ + if(!sr1 && sb1->final) { /* when sr1 runs out, we're done */ + } else if(!alpha && aband->final) { /* when alpha runs out, pass-thru sr1*/ + pet->inSync = FALSE; /* No need to sync anymore */ + BypassSrc(flo,pet,sb1); + } else { /* both inputs still active, keep the scheduler up to date */ + FreeData(flo,pet,sb1,sb1->current); + FreeData(flo,pet,aband,aband->current); + } + } + + return(TRUE); +} /* end MonoAlphaBlend */ + +/*------------------------------------------------------------------------ +-- Case with three inputs: src1, src2, and alpha plane ------------------- +------------------------------------------------------------------------*/ +static int DualAlphaBlend(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + pBlendDefPtr pvt = (pBlendDefPtr)ped->elemPvt; + BlendFloat invaconst = 1.0/pvt->alphaConst; + CARD16 aindex = pvt->aindex; + receptorPtr rcp = pet->receptor; + CARD32 bands = rcp[SRCt1].inFlo->bands; + bandPtr sb1 = &rcp[SRCt1].band[0]; + bandPtr sb2 = &rcp[SRCt2].band[0]; + bandPtr aband = &rcp[aindex].band[0]; + bandPtr bnd = &pet->emitter[0]; + mpBlendPvtPtr mpvt = (mpBlendPvtPtr) pet->private; + pointer sr1, sr2, alpha, dst; + CARD32 b, w; + + for(b = 0; b < bands; b++,sb1++,sb2++,bnd++,mpvt++,aband++) { + + if (!(pet->scheduled & 1<format->width > sb2->format->width || + sb1->format->width > aband->format->width) + w = (aband->format->width < sb2->format->width) ? + aband->format->width : sb2->format->width; + else + w = sb1->format->width; + + /* get pointers to the initial src-1, src-2, and dst scanlines */ + sr1 = GetCurrentSrc(flo,pet,sb1); + sr2 = GetCurrentSrc(flo,pet,sb2); + alpha = GetCurrentSrc(flo,pet,aband); + dst = GetCurrentDst(flo,pet,bnd); + + /* continue while all is well and we have pointers */ + while(!ferrCode(flo) && sr1 && sr2 && alpha && dst && + SyncDomain(flo,ped,bnd,FLUSH)) { + INT32 run, currentx = 0; + + if (sr1 != dst) memcpy (dst, sr1, bnd->pitch); + + while ((run = GetRun(flo,pet,bnd)) && currentx < w ) { + if (run > 0) { + if (currentx + run > w) /* Yuck, have to clip */ + run = w - currentx; + (*(mpvt->action)) (currentx,run,sr1,sr2,alpha,dst,invaconst); + currentx += run; + } else + currentx -= run; + } + + /* get pointers to the next src-1, src-2, and dst scanlines */ + sr1 = GetNextSrc(flo,pet,sb1,FLUSH); + sr2 = GetNextSrc(flo,pet,sb2,FLUSH); + alpha = GetNextSrc(flo,pet,aband,FLUSH); + dst = GetNextDst(flo,pet,bnd,FLUSH); + } + + /* If alpha < sr1, pass remaining lines through untouched */ + if(!sr1 && sb1->final) { /* when sr1 runs out, we're done */ + DisableSrc(flo,pet,sb2,FLUSH); + } else if( !sr2 && sb2->final || /* when other inputs out, pass sr1 */ + !alpha && aband->final ) { + pet->inSync = FALSE; /* No need to sync anymore */ + if (sr2) { /* flush any remain sr2 */ + DisableSrc(flo,pet,sb2,FLUSH); + } + BypassSrc(flo,pet,sb1); + } else { /* both inputs still active, keep the scheduler up to date */ + FreeData(flo,pet,sb1,sb1->current); + FreeData(flo,pet,sb2,sb2->current); + FreeData(flo,pet,aband,aband->current); + } + } + + return(TRUE); +} /* end DualAlphaBlend */ + + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetBlend(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ResetReceptors(ped); + ResetProcDomain(ped); + ResetEmitter(ped); + + return(TRUE); +} /* end ResetBlend */ + + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyBlend(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + if(ped->peTex) + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc)NULL; + ped->ddVec.initialize = (xieIntProc)NULL; + ped->ddVec.activate = (xieIntProc)NULL; + ped->ddVec.reset = (xieIntProc)NULL; + ped->ddVec.destroy = (xieIntProc)NULL; + + return(TRUE); +} /* end DestroyBlend */ + +/*------------------------------------------------------------------------ +------------------------MonoBlend action routines ---------------------- +------------------------------------------------------------------------*/ + +#define DOMono(fname,stype) \ +static void fname(count,width,is,id,aconst2,offset) \ +INT32 count, width; \ +pointer is, id; \ +BlendFloat aconst2, offset; \ +{ \ +stype *sr1 = ((stype *)is) + count; \ +stype *dst = ((stype *)id) + count; \ +int i; \ + for(i = 0; i < width; ++i) \ + *dst++ = *sr1++ * aconst2 + offset; \ +} + +DOMono(MonoR,RealPixel) +DOMono(MonoQ,QuadPixel) +DOMono(MonoP,PairPixel) +DOMono(MonoB,BytePixel) + +/*------------------------------------------------------------------------ +------------------------DualBlend action routines ---------------------- +------------------------------------------------------------------------*/ +#define DODual(fname,stype) \ +static void fname(count,width,is1,is2,id,aconst1,aconst2) \ +INT32 count,width; \ +pointer is1, is2, id; \ +BlendFloat aconst1, aconst2; \ +{ \ +stype *sr1 = ((stype *)is1) + count; \ +stype *sr2 = ((stype *)is2) + count; \ +stype *dst = ((stype *)id) + count; \ +int i; \ + for(i = 0; i < width; ++i) \ + *dst++ = *sr1++ * aconst2 + *sr2++ * aconst1; \ +} + +DODual(DualR,RealPixel) +DODual(DualQ,QuadPixel) +DODual(DualP,PairPixel) +DODual(DualB,BytePixel) + +/*------------------------------------------------------------------------ +-------------------- MonoAlphaBlend action routines -------------------- +------------------------------------------------------------------------*/ +#define DOMonoAlpha(fname,stype,atype) \ +static void fname(count,width,is1,ia,id,iac,sf) \ +INT32 count, width; \ +pointer is1, ia, id; \ +BlendFloat iac, sf; \ +{ \ +stype *sr1 = ((stype *)is1) + count; \ +stype *dst = ((stype *)id) + count; \ +atype *alpha = ((atype *)ia) + count; \ +int i; \ + for(i = 0; i < width; ++i) { \ + register BlendFloat ralpha = *alpha++; \ + *dst++ = *sr1++ * ((BlendFloat)1.0 - ralpha * iac) + \ + ralpha * sf; \ + } \ +} + +DOMonoAlpha(MonoAlphaRQ,RealPixel,QuadPixel) +DOMonoAlpha(MonoAlphaRP,RealPixel,PairPixel) +DOMonoAlpha(MonoAlphaRB,RealPixel,BytePixel) +DOMonoAlpha(MonoAlphaQQ,QuadPixel,QuadPixel) +DOMonoAlpha(MonoAlphaQP,QuadPixel,PairPixel) +DOMonoAlpha(MonoAlphaQB,QuadPixel,BytePixel) +DOMonoAlpha(MonoAlphaPQ,PairPixel,QuadPixel) +DOMonoAlpha(MonoAlphaPP,PairPixel,PairPixel) +DOMonoAlpha(MonoAlphaPB,PairPixel,BytePixel) +DOMonoAlpha(MonoAlphaBQ,BytePixel,QuadPixel) +DOMonoAlpha(MonoAlphaBP,BytePixel,PairPixel) +DOMonoAlpha(MonoAlphaBB,BytePixel,BytePixel) + +/*------------------------------------------------------------------------ +-------------------- DualAlphaBlend action routines -------------------- +------------------------------------------------------------------------*/ +#define DODualAlpha(fname,stype,atype) \ +static void fname(count,width,is1,is2,ia,id,iac) \ +CARD32 count,width; \ +pointer is1, is2, ia, id; \ +BlendFloat iac; \ +{ \ +stype *sr1 = ((stype *)is1) + count; \ +stype *sr2 = ((stype *)is2) + count; \ +atype *alpha = ((atype *)ia) + count; \ +stype *dst = ((stype *)id) + count; \ +int i; \ + for(i = 0; i < width; ++i) { \ + register BlendFloat ascale = *alpha++ * iac; \ + *dst++ = *sr1++ * ((BlendFloat)1.0 - ascale) + \ + *sr2++ * ascale; \ + } \ +} + +DODualAlpha(DualAlphaRQ,RealPixel,QuadPixel) +DODualAlpha(DualAlphaRP,RealPixel,PairPixel) +DODualAlpha(DualAlphaRB,RealPixel,BytePixel) +DODualAlpha(DualAlphaQQ,QuadPixel,QuadPixel) +DODualAlpha(DualAlphaQP,QuadPixel,PairPixel) +DODualAlpha(DualAlphaQB,QuadPixel,BytePixel) +DODualAlpha(DualAlphaPQ,PairPixel,QuadPixel) +DODualAlpha(DualAlphaPP,PairPixel,PairPixel) +DODualAlpha(DualAlphaPB,PairPixel,BytePixel) +DODualAlpha(DualAlphaBQ,BytePixel,QuadPixel) +DODualAlpha(DualAlphaBP,BytePixel,PairPixel) +DODualAlpha(DualAlphaBB,BytePixel,BytePixel) +/* end module mpblend.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/mpcfromi.c b/xie/xc/programs/Xserver/XIE/mixie/process/mpcfromi.c new file mode 100644 index 0000000..811b11d --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/mpcfromi.c @@ -0,0 +1,479 @@ +/* $XConsortium: mpcfromi.c,v 1.5 94/04/17 20:35:13 rws Exp $ */ +/**** module mpcfromi.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mpcfromi.c -- DDXIE ConvertFromIndex element + + Robert NC Shelley -- AGE Logic, Inc. July, 1993 + +*****************************************************************************/ + +#define _XIEC_MPCFROMI +#define _XIEC_PCFROMI + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include + +extern int QueryColors(); /* in ...server/dix/colormap.c */ + +/* routines referenced by other DDXIE modules + */ +int miAnalyzeCvtFromInd(); + +/* routines used internal to this module + */ +static int CreateCfromI(); +static int InitCfromI(); +static int DoSingleCfromI(); +static int DoTripleCfromI(); +static int ResetCfromI(); +static int DestroyCfromI(); + + +/* DDXIE ConvertFromIndex entry points + */ +static ddElemVecRec mpCfromIVec = { + CreateCfromI, + InitCfromI, + (xieIntProc)NULL, + (xieIntProc)NULL, + ResetCfromI, + DestroyCfromI + }; + + +/* Local Declarations. + */ +typedef struct _mpcfromi { + pCfromIDefPtr dix; + xieIntProc action; + bandPtr iband; + bandPtr oband; + Pixel *pixLst; + xrgb *rgbLst; + CARD32 width; + pointer ibuf; + pointer obuf[xieValMaxBands]; +} mpCfromIRec, *mpCfromIPtr; + +/* action routines + */ +#define CfromI_1bb CfromI_1BB +#define CfromI_1bB CfromI_1BB +#define CfromI_1bP CfromI_1BP +#define CfromI_1Bb CfromI_1BB +#define CfromI_1Pb CfromI_1PB +#define CfromI_1Qb CfromI_1QB +#define CfromI_3bb CfromI_3BB +#define CfromI_3bB CfromI_3BB +#define CfromI_3bP CfromI_3BP +#define CfromI_3Bb CfromI_3BB +#define CfromI_3Pb CfromI_3PB +#define CfromI_3Qb CfromI_3QB +static int CfromI_1BB(), CfromI_1BP(), CfromI_3BB(), CfromI_3BP(); +static int CfromI_1PB(), CfromI_1PP(), CfromI_3PB(), CfromI_3PP(); +static int CfromI_1QB(), CfromI_1QP(), CfromI_3QB(), CfromI_3QP(); + +static int (*action_CfromI[2][3][4])() = { + CfromI_1bb, CfromI_1Bb, CfromI_1Pb, CfromI_1Qb, /* single, o=1, i=1..4 */ + CfromI_1bB, CfromI_1BB, CfromI_1PB, CfromI_1QB, /* single, o=2, i=1..4 */ + CfromI_1bP, CfromI_1BP, CfromI_1PP, CfromI_1QP, /* single, o=3, i=1..4 */ + CfromI_3bb, CfromI_3Bb, CfromI_3Pb, CfromI_3Qb, /* triple, o=1, i=1..4 */ + CfromI_3bB, CfromI_3BB, CfromI_3PB, CfromI_3QB, /* triple, o=2, i=1..4 */ + CfromI_3bP, CfromI_3BP, CfromI_3PP, CfromI_3QP, /* triple, o=3, i=1..4 */ +}; + + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeCvtFromInd(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* stash the entry point vector with the appropriate activate routine + */ + ped->ddVec = mpCfromIVec; + + return(TRUE); +} /* end miAnalyzeCvtFromInd */ + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateCfromI(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + return(MakePETex(flo, ped, sizeof(mpCfromIRec), NO_SYNC, NO_SYNC)); +} /* end CreateCfromI */ + + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitCfromI(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloConvertFromIndex *raw = (xieFloConvertFromIndex *)ped->elemRaw; + peTexPtr pet = ped->peTex; + formatPtr ift = &ped->inFloLst[SRCtag].format[0]; + formatPtr oft = &ped->outFlo.format[0]; + pCfromIDefPtr dix = (pCfromIDefPtr) ped->elemPvt; + mpCfromIPtr ddx = (mpCfromIPtr)pet->private; + CARD32 i, pseudo = !dix->pixMsk[0]; + CARD32 cells, odx = ped->outFlo.bands == 1 ? 0 : 1; + CARD8 oc = oft->class, ic = ift->class; + Pixel *p; + xrgb *rgb; + + /* set up action parameters + */ + ddx->dix = dix; + ddx->width = oft->width; + ddx->iband = &pet->receptor[SRCtag].band[0]; + ddx->oband = &pet->emitter[0]; + ddx->action = action_CfromI[odx][oc-1][ift->class-1]; + if(!ddx->action) ImplementationError(flo,ped, return(FALSE)); + ped->ddVec.activate = !odx ? DoSingleCfromI : DoTripleCfromI; + + if(ic == BIT_PIXEL && !(ddx->ibuf = (BytePixel*)XieMalloc(ddx->width+7))) + AllocError(flo,ped, return(FALSE)); + + if(oc == BIT_PIXEL) + if( odx && (!(ddx->obuf[0] = (BytePixel*)XieMalloc(ddx->width+7)) || + !(ddx->obuf[1] = (BytePixel*)XieMalloc(ddx->width+7)) || + !(ddx->obuf[2] = (BytePixel*)XieMalloc(ddx->width+7))) || + !odx && !(ddx->obuf[0] = (BytePixel*)XieMalloc(ddx->width+7))) + AllocError(flo,ped, return(FALSE)); + + /* snapshot the current contents of the colormap + */ + SetDepthFromLevels(dix->cells,i); cells = 1<pixLst = (Pixel*) XieMalloc(cells * sizeof(Pixel))) || + !(ddx->rgbLst = (xrgb *) XieMalloc(cells * sizeof(xrgb)))) + AllocError(flo,ped, return(FALSE)); + for(p = ddx->pixLst, i = 0; i < cells; ++i) + *p++ = pseudo ? i : (i << dix->pixPos[0] & dix->pixMsk[0] | + i << dix->pixPos[1] & dix->pixMsk[1] | + i << dix->pixPos[2] & dix->pixMsk[2]); + if(QueryColors(dix->cmap,cells,ddx->pixLst,ddx->rgbLst)) + ColormapError(flo,ped,raw->colormap, return(FALSE)); /* XXX hmmm? */ + + /* adjust the RGB values according to the client's precision requirements + */ + for(rgb = ddx->rgbLst, i = 0; i < cells; ++rgb, ++i) { + rgb->red >>= dix->precShift; + rgb->green >>= dix->precShift; + rgb->blue >>= dix->precShift; + } + + return(InitReceptors(flo, ped, NO_DATAMAP, 1) && + InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE)); +} /* end InitCfromI */ + + +/*------------------------------------------------------------------------ +------------------------- crank some input data -------------------------- +------------------------------------------------------------------------*/ +static int DoSingleCfromI(flo,ped,pet) /* one band out */ + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpCfromIPtr ddx = (mpCfromIPtr) pet->private; + bandPtr iband = ddx->iband; + bandPtr oband = ddx->oband; + CARD32 width = iband->format->width; + pointer src, dst; + + if((src = GetCurrentSrc(flo,pet,iband)) && + (dst = GetCurrentDst(flo,pet,oband))) + do { + if(ddx->ibuf) src = bitexpand(src,ddx->ibuf,width,(char)1,(char)0); + + (*ddx->action)(ddx, src, ddx->obuf[0] ? ddx->obuf[0] : dst); + + if(ddx->obuf[0]) bitshrink(ddx->obuf[0],dst,width,(char)1); + + src = GetNextSrc(flo,pet,iband,FLUSH); + dst = GetNextDst(flo,pet,oband,FLUSH); + } while(src && dst); + + FreeData(flo,pet,iband,iband->current); + + return(TRUE); +} /* end DoSingleCfromI */ + +static int DoTripleCfromI(flo,ped,pet) /* three bands out */ + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpCfromIPtr ddx = (mpCfromIPtr) pet->private; + bandPtr iband = ddx->iband; + bandPtr oband = ddx->oband; + CARD32 width = iband->format->width; + pointer src, dstR, dstG, dstB; + + src = GetCurrentSrc(flo,pet,iband); + dstR = GetCurrentDst(flo,pet,oband); oband++; + dstG = GetCurrentDst(flo,pet,oband); oband++; + dstB = GetCurrentDst(flo,pet,oband); oband -=2; + + while(src && dstR && dstG && dstB) { + + if(ddx->ibuf) src = bitexpand(src,ddx->ibuf,width,(char)1,(char)0); + + (*ddx->action)(ddx, src, + ddx->obuf[0] ? ddx->obuf[0] : dstR, + ddx->obuf[1] ? ddx->obuf[1] : dstG, + ddx->obuf[2] ? ddx->obuf[2] : dstB); + + if(ddx->obuf[0]) bitshrink(ddx->obuf[0],dstR,width,(char)1); + if(ddx->obuf[1]) bitshrink(ddx->obuf[1],dstG,width,(char)1); + if(ddx->obuf[2]) bitshrink(ddx->obuf[2],dstB,width,(char)1); + + src = GetNextSrc(flo,pet,iband,FLUSH); + dstR = GetNextDst(flo,pet,oband,FLUSH); oband++; + dstG = GetNextDst(flo,pet,oband,FLUSH); oband++; + dstB = GetNextDst(flo,pet,oband,FLUSH); oband -=2; + } + FreeData(flo,pet,iband,iband->current); + + return(TRUE); +} /* end DoTripleCfromI */ + + + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetCfromI(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + mpCfromIPtr ddx = (mpCfromIPtr) ped->peTex->private; + + if(ddx->pixLst ) ddx->pixLst = (Pixel*) XieFree(ddx->pixLst ); + if(ddx->rgbLst ) ddx->rgbLst = (xrgb *) XieFree(ddx->rgbLst ); + if(ddx->ibuf ) ddx->ibuf = (pointer ) XieFree(ddx->ibuf ); + if(ddx->obuf[0]) ddx->obuf[0] = (pointer ) XieFree(ddx->obuf[0]); + if(ddx->obuf[1]) ddx->obuf[1] = (pointer ) XieFree(ddx->obuf[1]); + if(ddx->obuf[2]) ddx->obuf[2] = (pointer ) XieFree(ddx->obuf[2]); + + ResetReceptors(ped); + ResetEmitter(ped); + + return(TRUE); +} /* end ResetCfromI */ + + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyCfromI(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc)NULL; + ped->ddVec.initialize = (xieIntProc)NULL; + ped->ddVec.activate = (xieIntProc)NULL; + ped->ddVec.reset = (xieIntProc)NULL; + ped->ddVec.destroy = (xieIntProc)NULL; + + return(TRUE); +} /* end DestroyCfromI */ + +/* Single band output action routines: + */ + +#define DO_SINGLE_CFROMI(fn_do,itype,otype) \ +static int fn_do(ddx,SRC,DST) \ + mpCfromIPtr ddx; pointer SRC; pointer DST; \ +{ \ + itype *s = (itype *)SRC; \ + otype *d = (otype *)DST; \ + xrgb *x = ddx->rgbLst; \ + int w = ddx->width; \ + switch(ddx->dix->class) { \ + case StaticGray: \ + case GrayScale: \ + case StaticColor: \ + case PseudoColor: \ + while(w--) *d++ = x[*s++].red; \ + break; \ + case TrueColor: \ + case DirectColor: \ + { int rm = ddx->dix->pixMsk[0], rs = ddx->dix->pixPos[0]; \ + while(w--) *d++ = x[(*s++ & rm) >> rs].red; \ + } \ + } \ +} +/* bit versions - nyi */ +/* CfromI_1bb,BitPixel, BitPixel */ +/* CfromI_1bB,BitPixel, BytePixel */ +/* CfromI_1bP,BitPixel, PairPixel */ +/* CfromI_1Bb,BytePixel,BitPixel */ +DO_SINGLE_CFROMI(CfromI_1BB,BytePixel,BytePixel) +DO_SINGLE_CFROMI(CfromI_1BP,BytePixel,PairPixel) +/* CfromI_1Pb,PairPixel,BitPixel */ +DO_SINGLE_CFROMI(CfromI_1PB,PairPixel,BytePixel) +DO_SINGLE_CFROMI(CfromI_1PP,PairPixel,PairPixel) +/* CfromI_1Qb,QuadPixel,BitPixel */ +DO_SINGLE_CFROMI(CfromI_1QB,QuadPixel,BytePixel) +DO_SINGLE_CFROMI(CfromI_1QP,QuadPixel,PairPixel) + + +/* Triple band output action routines: + */ + +#define DO_TRIPLE_CFROMI(fn_do,itype,otype) \ +static int fn_do(ddx,SRC,DSTR,DSTG,DSTB) \ + mpCfromIPtr ddx; pointer SRC, DSTR, DSTG, DSTB; \ +{ \ + itype *s = (itype *)SRC; \ + otype *r = (otype *)DSTR; \ + otype *g = (otype *)DSTG; \ + otype *b = (otype *)DSTB; \ + xrgb *x = ddx->rgbLst; \ + int w = ddx->width; \ + switch(ddx->dix->class) { \ + case StaticGray: \ + case GrayScale: \ + while(w--) *r++ = *g++ = *b++ = x[*s++].red; \ + break; \ + case StaticColor: \ + case PseudoColor: \ + while(w--) { \ + xrgb *p = x + *s++; \ + *r++ = p->red; *g++ = p->green; *b++ = p->blue; \ + } \ + break; \ + case TrueColor: \ + case DirectColor: \ + { int rm = ddx->dix->pixMsk[0], rs = ddx->dix->pixPos[0]; \ + int gm = ddx->dix->pixMsk[1], gs = ddx->dix->pixPos[1]; \ + int bm = ddx->dix->pixMsk[2], bs = ddx->dix->pixPos[2]; \ + while(w--) { \ + Pixel p = *s++; \ + *r++ = x[(p & rm) >> rs].red; \ + *g++ = x[(p & gm) >> gs].green; \ + *b++ = x[(p & bm) >> bs].blue; \ + } \ + } \ + } \ +} +/* bit versions - nyi */ +/* CfromI_3bb,BitPixel, BitPixel */ +/* CfromI_3bB,BitPixel, BytePixel */ +/* CfromI_3bP,BitPixel, PairPixel */ +/* CfromI_3Bb,BytePixel,BitPixel */ +DO_TRIPLE_CFROMI(CfromI_3BB,BytePixel,BytePixel) +DO_TRIPLE_CFROMI(CfromI_3BP,BytePixel,PairPixel) +/* CfromI_3Pb,PairPixel,BitPixel */ +DO_TRIPLE_CFROMI(CfromI_3PB,PairPixel,BytePixel) +DO_TRIPLE_CFROMI(CfromI_3PP,PairPixel,PairPixel) + /* CfromI_3Qb,QuadPixel,BitPixel */ +DO_TRIPLE_CFROMI(CfromI_3QB,QuadPixel,BytePixel) +DO_TRIPLE_CFROMI(CfromI_3QP,QuadPixel,PairPixel) + +/* end module mpcfromi.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/mpcnst.c b/xie/xc/programs/Xserver/XIE/mixie/process/mpcnst.c new file mode 100644 index 0000000..6291f8e --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/mpcnst.c @@ -0,0 +1,1037 @@ +/* $XConsortium: mpcnst.c /main/6 1995/12/02 16:53:45 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module mpcnst.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mpcnst.c -- DDXIE constrain element + + Dean Verheiden && Larry Hare -- AGE Logic, Inc. May, 1993 + +*****************************************************************************/ + + +#define _XIEC_MPCNST +#define _XIEC_PCNST + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeConstrain(); + +/* + * routines used internal to this module + */ +static int CreateConstrain(); +static int InitializeConstrain(); +static int ActivateConstrain(); +static int ResetConstrain(); +static int DestroyConstrain(); + +/* + * DDXIE ImportClientPhoto entry points + */ +static ddElemVecRec ConstrainVec = { + CreateConstrain, + InitializeConstrain, + ActivateConstrain, + (xieBoolProc)NULL, + ResetConstrain, + DestroyConstrain + }; + + +/*------------------------------------------------------------------------ +------------------------ Local declares and defines -------------------- +------------------------------------------------------------------------*/ + +typedef struct _mpconstraindef { + void (*action) (); + pointer lut; + double pad[7]; +} mpCnstPvtRec, *mpCnstPvtPtr; + + +static void (*hc_nop())(); +static void (*HCp_Rb())(), (*HCp_bb())(), (*HCp_Bb())(), + (*HCp_Pb())(), (*HCp_Qb())(); +static void (*HCp_RB())(), (*HCp_bB())(), (*HCp_BB())(), + (*HCp_PB())(), (*HCp_QB())(); +static void (*HCp_RP())(), (*HCp_bP())(), (*HCp_BP())(), + (*HCp_PP())(), (*HCp_QP())(); +static void (*HCp_RQ())(), (*HCp_bQ())(), (*HCp_BQ())(), + (*HCp_PQ())(), (*HCp_QQ())(); + +static void (*(*prep_hc[5][5])())() = { + hc_nop, hc_nop, hc_nop, hc_nop, hc_nop, /* [out=0][inp=0...4] */ + HCp_Rb, HCp_bb, HCp_Bb, HCp_Pb, HCp_Qb, /* [out=1][inp=0...4] */ + HCp_RB, HCp_bB, HCp_BB, HCp_PB, HCp_QB, /* [out=2][inp=0...4] */ + HCp_RP, HCp_bP, HCp_BP, HCp_PP, HCp_QP, /* [out=3][inp=0...4] */ + HCp_RQ, HCp_bQ, HCp_BQ, HCp_PQ, HCp_QQ, /* [out=4][inp=0...4] */ +}; + +static void (*cs_nop())(); +static void (*CSp_Rb())(), (*CSp_bb())(), (*CSp_Bb())(), + (*CSp_Pb())(), (*CSp_Qb())(); +static void (*CSp_RB())(), (*CSp_bB())(), (*CSp_BB())(), + (*CSp_PB())(), (*CSp_QB())(); +static void (*CSp_RP())(), (*CSp_bP())(), (*CSp_BP())(), + (*CSp_PP())(), (*CSp_QP())(); +static void (*CSp_RQ())(), (*CSp_bQ())(), (*CSp_BQ())(), + (*CSp_PQ())(), (*CSp_QQ())(); + +static void (*(*prep_cs[5][5])())() = { + cs_nop, cs_nop, cs_nop, cs_nop, cs_nop, /* [0][0...4] */ + CSp_Rb, CSp_bb, CSp_Bb, CSp_Pb, CSp_Qb, /* [1][0...4] */ + CSp_RB, CSp_bB, CSp_BB, CSp_PB, CSp_QB, /* [2][0...4] */ + CSp_RP, CSp_bP, CSp_BP, CSp_PP, CSp_QP, /* [3][0...4] */ + CSp_RQ, CSp_bQ, CSp_BQ, CSp_PQ, CSp_QQ, /* [4][0...4] */ +}; + +/*------------------------------------------------------------------------ +------------------------ fill in the vector --------------------------- +------------------------------------------------------------------------*/ +int miAnalyzeConstrain(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + + ped->ddVec = ConstrainVec; + + /* based on the technique, fill in the appropriate entry point vector */ + + switch(((xieFloConstrain *)ped->elemRaw)->constrain) { + case xieValConstrainClipScale: + case xieValConstrainHardClip: + break; + default: + ImplementationError(flo,ped, return(FALSE)); + } + + return TRUE; +} + + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateConstrain(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + int auxsize = xieValMaxBands * sizeof(mpCnstPvtRec); + + return MakePETex(flo,ped,auxsize,NO_SYNC,NO_SYNC); +} + + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ + +static int InitializeConstrain(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + pCnstDefPtr techpvt = (pCnstDefPtr)ped->techPvt; + mpCnstPvtPtr pvt = (mpCnstPvtPtr) pet->private; + bandPtr oband; + bandPtr iband; + int band, nbands, status; + + status = InitReceptors(flo,ped,NO_DATAMAP,1) && + InitEmitter(flo,ped,NO_DATAMAP,NO_INPLACE); + + nbands = pet->receptor[SRCtag].inFlo->bands; + iband = &(pet->receptor[SRCtag].band[0]); + oband = &(pet->emitter[0]); + + for(band = 0; band < nbands; band++, pvt++, iband++, oband++) { + + int oo = IndexClass(oband->format->class); + int ii = IndexClass(iband->format->class); + + switch(((xieFloConstrain *)ped->elemRaw)->constrain) { + + case xieValConstrainClipScale: + pvt->action = + ((*(prep_cs[oo][ii])) (iband, oband, pvt, techpvt, band)); + break; + case xieValConstrainHardClip: + pvt->action = + ((*(prep_hc[oo][ii])) (iband, oband, pvt, techpvt, band)); + break; + } + } + return status; +} + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateConstrain(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpCnstPvtPtr pvt = (mpCnstPvtPtr) pet->private; + int band, nbands = pet->receptor[SRCtag].inFlo->bands; + bandPtr iband = &(pet->receptor[SRCtag].band[0]); + bandPtr oband = &(pet->emitter[0]); + + for(band = 0; band < nbands; band++, pvt++, iband++, oband++) { + register int bw = iband->format->width; + pointer ivoid, ovoid; + + if (!(ivoid = GetCurrentSrc(flo,pet,iband))) + continue; + + if (!pvt->action) { + do { /* pass a clone of the current src strip downstream */ + if(!PassStrip(flo,pet,oband,iband->strip)) + return(FALSE); + ivoid = GetSrc(flo,pet,iband,iband->maxLocal,TRUE); + } while (!ferrCode(flo) && ivoid) ; + FreeData(flo, pet, iband, iband->current); + continue; + } + + if (!(ovoid = GetCurrentDst(flo,pet,oband))) + continue; + + do { + (*(pvt->action)) (ivoid, ovoid, pvt, bw); + ivoid = GetNextSrc(flo,pet,iband,TRUE); + ovoid = GetNextDst(flo,pet,oband,TRUE); + } while (!ferrCode(flo) && ivoid && ovoid) ; + + FreeData(flo, pet, iband, iband->current); + } + return TRUE; +} + + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetConstrain(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + mpCnstPvtPtr pvt = (mpCnstPvtPtr) ped->peTex->private; + int band; + + /* free any dynamic private data */ + for (band = 0 ; band < xieValMaxBands ; band++, pvt++) + if (pvt->lut) + pvt->lut = (pointer) XieFree(pvt->lut); + + ResetReceptors(ped); + ResetEmitter(ped); + + return TRUE; +} + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyConstrain(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc)NULL; + ped->ddVec.initialize = (xieIntProc)NULL; + ped->ddVec.activate = (xieIntProc)NULL; + ped->ddVec.reset = (xieIntProc)NULL; + ped->ddVec.destroy = (xieIntProc)NULL; + + return TRUE; +} + +/*------------------------------------------------------------------------ +------------------------ This guy must be nuts ------------------------- +------------------------------------------------------------------------*/ + +/*----------------------------- HardClip --------------------------------*/ + +/* +** DO_HCb - consume bits, produce bits. +** DO_HCc - consume bits, produce otype. +** DO_HCcx - consume bits, produce otype (using bitexpand). +** DO_HCp - consume itype, produce bits.. +** DO_HCfp - consume floats, produce bits. +** DO_HClt - consume itype, produce otype (itype < otype). +** DO_HCeq - consume itype, produce otype (itype == otype). +** DO_HCgt - consume itype, produce otype (itype > otype) +** DO_HCf - consume floats, produce otype. +*/ + +static void constrain_nop(INP,OUTP,pvt,bw) + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; +{ + return; +} +static void (*hc_nop(iband,oband,pvt,techpvt,band))() + bandPtr iband, oband; mpCnstPvtPtr pvt; pCnstDefPtr techpvt; int band; +{ + return constrain_nop; +} +static void (*cs_nop(iband,oband,pvt,techpvt,band))() + bandPtr iband, oband; mpCnstPvtPtr pvt; pCnstDefPtr techpvt; int band; +{ + return constrain_nop; +} + +static void clearbitline(INP,OUTP,pvt,bw) + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; +{ + action_clear(OUTP, bw, 0); +} + +static void setbitline(INP,OUTP,pvt,bw) + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; +{ + action_set(OUTP, bw, 0); +} + +static void copybitline(INP,OUTP,pvt,bw) + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; +{ + passcopy_bit(OUTP, INP, bw, 0); +} + +static void invertbitline(INP,OUTP,pvt,bw) + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; +{ + passcopy_bit (OUTP, INP, bw, 0); + action_invert(OUTP, bw, 0); +} + +#define LEVELSM1(T) *((T *) &(pvt->pad[0])) + +#define DO_HCb(fn_prep,fn_do_a, fn_do_b,itype,otype) \ +static void \ +(*fn_prep (iband,oband,pvt,techpvt,band))() \ + bandPtr iband, oband; mpCnstPvtPtr pvt; pCnstDefPtr techpvt; int band; \ +{ \ + if (iband->format->levels == 1) \ + return clearbitline; \ + if (oband->format->levels == 1) \ + return clearbitline; \ + return copybitline; \ +} + +#define DO_HCc(fn_prep,fn_do_a, fn_do_b,itype,otype) \ +static void \ +fn_do_a(INP,OUTP,pvt,bw) \ + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; \ +{ \ + LogInt inval, M, *inp = (LogInt *) INP; \ + otype *outp = (otype *) OUTP; \ + for ( ; bw >= LOGSIZE ; bw -= LOGSIZE) \ + for (M=LOGLEFT, inval = *inp++; M; LOGRIGHT(M)) \ + *outp++ = (inval & M) ? (otype) 1 : (otype) 0; \ + if (bw > 0) \ + for (M=LOGLEFT, inval = *inp++; bw; bw--, LOGRIGHT(M)) \ + *outp++ = (inval & M) ? (otype) 1 : (otype) 0; \ +} \ +static void \ +fn_do_b(INP,OUTP,pvt,bw) \ + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; \ +{ \ + bzero((char *)OUTP, bw * sizeof(otype)); \ + /* action_clear(OUTP, (bw * sizeof(otype)) << 3, 0); */ \ +} \ +static void \ +(*fn_prep (iband,oband,pvt,techpvt,band))() \ + bandPtr iband, oband; mpCnstPvtPtr pvt; pCnstDefPtr techpvt; int band; \ +{ \ + if (iband->format->levels == 1) \ + return fn_do_b; \ + return fn_do_a; \ +} + +#define DO_HCcx(fn_prep,fn_do,fn_do_b,itype,otype) \ +static void \ +fn_do(INP,OUTP,pvt,bw) \ + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; \ +{ \ + bitexpand(INP, OUTP, bw, 0, 1); \ +} \ +static void \ +fn_do_b(INP,OUTP,pvt,bw) \ + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; \ +{ \ + bzero((char *)OUTP, bw * sizeof(otype)); \ + /* action_clear(OUTP, (bw * sizeof(otype)) << 3, 0); */ \ +} \ +static void \ +(*fn_prep (iband,oband,pvt,techpvt,band))() \ + bandPtr iband, oband; mpCnstPvtPtr pvt; pCnstDefPtr techpvt; int band; \ +{ \ + if (iband->format->levels == 1) \ + return fn_do_b; \ + return fn_do; \ +} + +#define DO_HCp(fn_prep,fn_do_a, fn_do_b,itype,otype) \ +static void \ +fn_do_a(INP,OUTP,pvt,bw) \ + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; \ +{ \ + itype *inp = (itype *) INP; \ + LogInt outval, M, *outp = (LogInt *) OUTP; \ + for ( ; bw >= LOGSIZE ; *outp++ = outval, bw -= LOGSIZE) \ + for (M=LOGLEFT, outval = 0; M; LOGRIGHT(M)) \ + if (*inp++) \ + outval |= M; \ + if (bw > 0) { \ + for (M=LOGLEFT, outval = 0; bw; bw--, LOGRIGHT(M)) \ + if (*inp++) \ + outval |= M; \ + *outp = outval; \ + } \ +} \ +static void \ +(*fn_prep (iband,oband,pvt,techpvt,band))() \ + bandPtr iband, oband; mpCnstPvtPtr pvt; pCnstDefPtr techpvt; int band; \ +{ \ + if (oband->format->levels == 1) \ + return clearbitline; \ + return fn_do_a; \ +} + +#define DO_HCfp(fn_prep,fn_do_a, fn_do_b,itype,otype) \ +static void \ +fn_do_a(INP,OUTP,pvt,bw) \ + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; \ +{ \ + itype *inp = (itype *) INP; \ + LogInt outval, M, *outp = (LogInt *) OUTP; \ + for ( ; bw >= LOGSIZE ; *outp++ = outval, bw -= LOGSIZE) \ + for (M=LOGLEFT, outval = 0; M; LOGRIGHT(M)) \ + if (*inp++ >= (itype) 1.0) \ + outval |= M; \ + if (bw > 0) { \ + for (M=LOGLEFT, outval = 0; bw; bw--, LOGRIGHT(M)) \ + if (*inp++ >= (itype) 1.0) \ + outval |= M; \ + *outp = outval; \ + } \ +} \ +static void \ +(*fn_prep (iband,oband,pvt,techpvt,band))() \ + bandPtr iband, oband; mpCnstPvtPtr pvt; pCnstDefPtr techpvt; int band; \ +{ \ + if (oband->format->levels == 1) \ + return clearbitline; \ + return fn_do_a; \ +} + +#define DO_HClt(fn_prep,fn_do_a, fn_do_b,itype,otype) \ +static void \ +fn_do_b(INP,OUTP,pvt,bw) \ + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; \ +{ \ + itype *inp = (itype *) INP; \ + otype *outp = (otype *) OUTP; \ + while (bw-- > 0 ) { \ + *outp++ = (otype) *inp++; \ + } \ +} \ +static void \ +(*fn_prep (iband,oband,pvt,techpvt,band))() \ + bandPtr iband, oband; mpCnstPvtPtr pvt; pCnstDefPtr techpvt; int band; \ +{ \ + return fn_do_b; \ +} + +#define DO_HCeq(fn_prep,fn_do_a, fn_do_b,itype,otype) \ +static void \ +fn_do_a(INP,OUTP,pvt,bw) \ + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; \ +{ \ + itype *inp = (itype *) INP; \ + otype *outp = (otype *) OUTP; \ + itype inval, lm1 = LEVELSM1(itype); \ + while (bw-- > 0 ) { \ + if ((inval = *inp++) > lm1) inval = lm1; \ + *outp++ = (otype) inval; \ + } \ +} \ +/* fn_do_b was memcpy, now done at higher level with PassStrip */ \ +static void \ +(*fn_prep (iband,oband,pvt,techpvt,band))() \ + bandPtr iband, oband; mpCnstPvtPtr pvt; pCnstDefPtr techpvt; int band; \ +{ \ + itype ilm1 = (itype)( (iband->format->levels) \ + ? iband->format->levels - 1 : ~0); \ + itype olm1 = (itype)( (oband->format->levels) \ + ? oband->format->levels - 1 : ~0); \ + if (ilm1 < olm1) { \ + /*special hint to PassStrip */ \ + return (void (*) ()) 0; \ + } \ + LEVELSM1(itype) = (itype) olm1; \ + return fn_do_a; \ +} + +#define DO_HCgt(fn_prep,fn_do_a, fn_do_b,itype,otype) \ +static void \ +fn_do_a(INP,OUTP,pvt,bw) \ + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; \ +{ \ + itype *inp = (itype *) INP; \ + otype *outp = (otype *) OUTP; \ + itype inval, lm1 = LEVELSM1(itype); \ + while (bw-- > 0 ) { \ + if ((inval = *inp++) > lm1) inval = lm1; \ + *outp++ = (otype) inval; \ + } \ +} \ +static void \ +(*fn_prep (iband,oband,pvt,techpvt,band))() \ + bandPtr iband, oband; mpCnstPvtPtr pvt; pCnstDefPtr techpvt; int band; \ +{ \ + otype olm1 = (otype)( (oband->format->levels) \ + ? oband->format->levels - 1 : ~0); \ + LEVELSM1(itype) = (itype) olm1; \ + return fn_do_a; \ +} + + +#define DO_HCf(fn_prep,fn_do_a,fn_do_b,itype,otype) \ +static void \ +fn_do_a(INP,OUTP,pvt,bw) \ + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; \ +{ \ + itype *inp = (itype *) INP; \ + otype *outp = (otype *) OUTP; \ + itype inval, olm1 = *((itype *) &(pvt->pad[0])); \ + while (bw-- > 0 ) { \ + if ((inval = *inp++) > olm1) inval = olm1; \ + else if (inval < 0) inval = (itype) 0; \ + *outp++ = (otype) inval; \ + } \ +} \ +static void \ +(*fn_prep (iband,oband,pvt,techpvt,band))() \ + bandPtr iband, oband; mpCnstPvtPtr pvt; pCnstDefPtr techpvt; int band; \ +{ \ + otype olm1 = (otype)( (oband->format->levels) \ + ? oband->format->levels - 1 : ~0); \ + *((itype *) &(pvt->pad[0])) = olm1; \ + return fn_do_a; \ +} + +DO_HCb (HCp_bb, HCa_bb, HCb_bb, BitPixel, BitPixel) +DO_HCp (HCp_Bb, HCa_Bb, HCb_Bb, BytePixel, BitPixel) +DO_HCp (HCp_Pb, HCa_Pb, HCb_Pb, PairPixel, BitPixel) +DO_HCp (HCp_Qb, HCa_Qb, HCb_Qb, QuadPixel, BitPixel) +DO_HCfp (HCp_Rb, HCa_Rb, HCb_Rb, RealPixel, BitPixel) + +DO_HCcx (HCp_bB, HCa_bB, HCb_bB, BitPixel, BytePixel) +DO_HCeq (HCp_BB, HCa_BB, HCb_BB, BytePixel, BytePixel) +DO_HCgt (HCp_PB, HCa_PB, HCb_PB, PairPixel, BytePixel) +DO_HCgt (HCp_QB, HCa_QB, HCb_QB, QuadPixel, BytePixel) +DO_HCf (HCp_RB, HCa_RB, HCb_RB, RealPixel, BytePixel) + +DO_HCc (HCp_bP, HCa_bP, HCb_bP, BitPixel, PairPixel) +DO_HClt (HCp_BP, HCa_BP, HCb_BP, BytePixel, PairPixel) +DO_HCeq (HCp_PP, HCa_PP, HCb_PP, PairPixel, PairPixel) +DO_HCgt (HCp_QP, HCa_QP, HCb_QP, QuadPixel, PairPixel) +DO_HCf (HCp_RP, HCa_RP, HCb_RP, RealPixel, PairPixel) + +DO_HCc (HCp_bQ, HCa_bQ, HCb_bQ, BitPixel, QuadPixel) +DO_HClt (HCp_BQ, HCa_BQ, HCb_BQ, BytePixel, QuadPixel) +DO_HClt (HCp_PQ, HCa_PQ, HCb_PQ, PairPixel, QuadPixel) +DO_HCeq (HCp_QQ, HCa_QQ, HCb_QQ, QuadPixel, QuadPixel) +DO_HCf (HCp_RQ, HCa_RQ, HCb_RQ, RealPixel, QuadPixel) + +#undef LEVELSM1 + +/*----------------------------- ClipScale --------------------------------*/ + +typedef float ConstrainFloat; +#define HALF ((ConstrainFloat) 0.5) + +#define LBOUND(T) *((T *) &(pvt->pad[0])) +#define UBOUND(T) *((T *) &(pvt->pad[1])) +#define OLOW(T) *((T *) &(pvt->pad[2])) +#define OHIGH(T) *((T *) &(pvt->pad[3])) +#define FLT_SF *((ConstrainFloat *) &(pvt->pad[4])) +#define FLT_OFF *((ConstrainFloat *) &(pvt->pad[5])) +#define INT_SF *((INT32 *) &(pvt->pad[4])) +#define INT_OFF *((INT32 *) &(pvt->pad[5])) + +static void +cs_scale_equation(pvt,techpvt,band) + mpCnstPvtPtr pvt; pCnstDefPtr techpvt; int band; +{ + QuadPixel olow = techpvt->output_low[band]; + ConstrainFloat ilow = techpvt->input_low[band]; + ConstrainFloat sf = (techpvt->output_high[band] - olow) / + (techpvt->input_high[band] - ilow); + FLT_SF = sf; + FLT_OFF = (ConstrainFloat) olow - sf * ilow; +} + +static void +cs_fix_bits(pvt,techpvt,band) + mpCnstPvtPtr pvt; pCnstDefPtr techpvt; int band; +{ + ConstrainFloat ilow = techpvt->input_low[band]; + ConstrainFloat ihigh = techpvt->input_high[band]; + QuadPixel olow = techpvt->output_low[band]; + QuadPixel ohigh = techpvt->output_high[band]; + /* Prep guarantees ilow != ihigh, but what if ilow > ihigh */ + if (ilow == 0.0 && ihigh == 1.0) { + OLOW(QuadPixel) = olow; + OHIGH(QuadPixel) = ohigh; + return; + } else if (ilow == 1.0 && ihigh == 0.0) { + OLOW(QuadPixel) = ohigh; + OHIGH(QuadPixel) = olow; + return; + } + cs_scale_equation(pvt,techpvt,band); + if (ilow < ihigh) { + if (0.0 <= ilow) OLOW(QuadPixel) = olow; + else if (0.0 >= ihigh) OLOW(QuadPixel) = ohigh; + else OLOW(QuadPixel) = FLT_SF * 0. + FLT_OFF + HALF; + if (1.0 <= ilow) OHIGH(QuadPixel) = olow; + else if (1.0 >= ihigh) OHIGH(QuadPixel) = ohigh; + else OHIGH(QuadPixel) = FLT_SF * 1. + FLT_OFF + HALF; + } else { + if (0.0 >= ilow) OLOW(QuadPixel) = olow; + else if (0.0 <= ihigh) OLOW(QuadPixel) = ohigh; + else OLOW(QuadPixel) = FLT_SF * 0. + FLT_OFF + HALF; + if (1.0 >= ilow) OHIGH(QuadPixel) = olow; + else if (1.0 <= ihigh) OHIGH(QuadPixel) = ohigh; + else OHIGH(QuadPixel) = FLT_SF * 1. + FLT_OFF + HALF; + } +} + +#define DO_CSb(fn_prep,fn_do,fn_do_b,itype,otype) \ +static void \ +(*fn_prep (iband,oband,pvt,techpvt,band))() \ + bandPtr iband, oband; \ + mpCnstPvtPtr pvt; pCnstDefPtr techpvt; int band; \ +{ \ + if (iband->format->levels == 1 || oband->format->levels == 1) \ + return clearbitline; \ + cs_fix_bits(pvt,techpvt,band); \ + return (OLOW(QuadPixel) == OHIGH(QuadPixel)) \ + ? ((OLOW(QuadPixel) == 0) ? clearbitline: setbitline) \ + : ((OLOW(QuadPixel) == 0) ? copybitline: invertbitline); \ +} + + +#define DO_CSc(fn_prep,fn_do,fn_do_b,itype,otype) \ +static void \ +fn_do(INP,OUTP,pvt,bw) \ + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; \ +{ \ + LogInt inval, M, *inp = (LogInt *) INP; \ + otype *outp = (otype *) OUTP; \ + otype olow = OLOW(otype), ohigh = OHIGH(otype); \ + for ( ; bw >= LOGSIZE ; bw -= LOGSIZE) \ + for (M=LOGLEFT, inval = *inp++; M; LOGRIGHT(M)) \ + *outp++ = (inval & M) ? ohigh : olow ; \ + if (bw > 0) \ + for (M=LOGLEFT, inval = *inp++; bw; bw--, LOGRIGHT(M)) \ + *outp++ = (inval & M) ? ohigh : olow ; \ +} \ +static void \ +(*fn_prep (iband,oband,pvt,techpvt,band))() \ + bandPtr iband, oband; \ + mpCnstPvtPtr pvt; pCnstDefPtr techpvt; int band; \ +{ \ + cs_fix_bits(pvt,techpvt,band); \ + OLOW(otype) = OLOW(QuadPixel); \ + OHIGH(otype) = OHIGH(QuadPixel); \ + return fn_do; \ +} + +#define DO_CScx(fn_prep,fn_do,fn_do_b,itype,otype) \ +static void \ +fn_do(INP,OUTP,pvt,bw) \ + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; \ +{ \ + otype olow = OLOW(otype), ohigh = OHIGH(otype); \ + bitexpand(INP, OUTP, bw, olow, ohigh); \ +} \ +static void \ +(*fn_prep (iband,oband,pvt,techpvt,band))() \ + bandPtr iband, oband; \ + mpCnstPvtPtr pvt; pCnstDefPtr techpvt; int band; \ +{ \ + cs_fix_bits(pvt,techpvt,band); \ + OLOW(otype) = OLOW(QuadPixel); \ + OHIGH(otype) = OHIGH(QuadPixel); \ + return fn_do; \ +} + +#define DO_CSp(fn_prep,fn_do,fn_do_b,itype,otype) \ +static void \ +fn_do(INP,OUTP,pvt,bw) \ + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; \ +{ \ + itype *inp = (itype *) INP; \ + LogInt outval, M, *outp = (LogInt *) OUTP; \ + itype imedian = UBOUND(itype); \ + for ( ; bw >= LOGSIZE ; *outp++ = outval, bw -= LOGSIZE) \ + for (M=LOGLEFT, outval = 0; M; LOGRIGHT(M)) \ + if (*inp++ > imedian) \ + outval |= M; \ + if (bw > 0) { \ + for (M=LOGLEFT, outval = 0; bw; bw--, LOGRIGHT(M)) \ + if (*inp++ > imedian) \ + outval |= M; \ + *outp = outval; \ + } \ +} \ +static void \ +fn_do_b(INP,OUTP,pvt,bw) \ + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; \ +{ \ + itype *inp = (itype *) INP; \ + LogInt outval, M, *outp = (LogInt *) OUTP; \ + itype imedian = UBOUND(itype); \ + for ( ; bw >= LOGSIZE ; *outp++ = outval, bw -= LOGSIZE) \ + for (M=LOGLEFT, outval = 0; M; LOGRIGHT(M)) \ + if (*inp++ <= imedian) \ + outval |= M; \ + if (bw > 0) { \ + for (M=LOGLEFT, outval = 0; bw; bw--, LOGRIGHT(M)) \ + if (*inp++ <= imedian) \ + outval |= M; \ + *outp = outval; \ + } \ +} \ +static void \ +(*fn_prep (iband,oband,pvt,techpvt,band))() \ + bandPtr iband, oband; \ + mpCnstPvtPtr pvt; pCnstDefPtr techpvt; int band; \ +{ \ + otype olow = techpvt->output_low[band]; \ + otype ohigh = techpvt->output_high[band]; \ + if (olow == ohigh) \ + return (olow == 0) ? clearbitline : setbitline; \ + UBOUND(itype) = HALF * \ + (techpvt->input_low[band] + techpvt->input_high[band]); \ + return (techpvt->input_low[band] < techpvt->input_high[band]) \ + ? fn_do : fn_do_b; \ +} + +#define DO_CS(fn_prep,fn_do,fn_do_b,itype,otype) \ +static void \ +fn_do(INP,OUTP,pvt,bw) \ + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; \ +{ \ + itype *inp = (itype *) INP; otype *outp = (otype *) OUTP; \ + itype inv, lbound = LBOUND(itype), ubound = UBOUND(itype); \ + otype out, olow = OLOW(otype), ohigh = OHIGH(otype); \ + ConstrainFloat sf = FLT_SF, offset = FLT_OFF; \ + while (bw-- > 0) { \ + inv = *inp++; \ + out = olow; \ + if (inv >= ubound) \ + out = ohigh; \ + else if (inv > lbound) \ + out = (otype)(sf * inv + offset); \ + *outp++ = out; \ + } \ +} \ +static void \ +fn_do_b(INP,OUTP,pvt,bw) \ + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; \ +{ \ + itype *inp = (itype *) INP; otype *outp = (otype *) OUTP; \ + itype inv, lbound = LBOUND(itype), ubound = UBOUND(itype); \ + otype out, olow = OLOW(otype), ohigh = OHIGH(otype); \ + ConstrainFloat sf = FLT_SF, offset = FLT_OFF; \ + while (bw-- > 0) { \ + inv = *inp++; \ + out = ohigh; \ + if (inv >= lbound) \ + out = olow; \ + else if (inv > ubound) \ + out = (otype)(sf * inv + offset); \ + *outp++ = out; \ + } \ +} \ +static void \ +(*fn_prep (iband,oband,pvt,techpvt,band))() \ + bandPtr iband, oband; \ + mpCnstPvtPtr pvt; pCnstDefPtr techpvt; int band; \ +{ \ + OLOW(otype) = techpvt->output_low[band]; \ + OHIGH(otype) = techpvt->output_high[band]; \ + LBOUND(itype) = (itype) (techpvt->input_low[band] + HALF); \ + UBOUND(itype) = (itype) (techpvt->input_high[band] + HALF); \ + cs_scale_equation(pvt,techpvt,band); \ + FLT_OFF += HALF; \ + return (FLT_SF >= 0.0) ? fn_do : fn_do_b; \ +} + +#if defined(USE_FLOATS) +#define DO_CSi(fn_prep,fn_do,fn_do_b,itype,otype,shift) \ + DO_CS(fn_prep,fn_do,fn_do_b,itype,otype) +#else +/* XXX need LUT based approach for small sizes */ +#define DO_CSi_part1(fna,itype,otype,shift) \ +static void \ +fna(INP,OUTP,pvt,bw) \ + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; \ +{ \ + itype *inp = (itype *) INP; otype *outp = (otype *) OUTP; \ + otype out, olow = OLOW(otype), ohigh = OHIGH(otype); \ + INT32 lbound = (INT32) LBOUND(itype); \ + INT32 ubound = (INT32) UBOUND(itype); \ + INT32 int_sf = INT_SF, int_off = INT_OFF; \ + CARD32 inv; \ + while (bw > 0) { \ + inv = *inp++; \ + out = ohigh; \ + bw--; \ + if (inv < ubound) { \ + out = (otype)((int_sf * inv + int_off)>>shift); \ + if (inv <= lbound) \ + out = olow; \ + } \ + *outp++ = out; \ + } \ +} +#define DO_CSi_part2(fnb,itype,otype,shift) \ +static void \ +fnb(INP,OUTP,pvt,bw) \ + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; \ +{ \ + itype *inp = (itype *) INP; otype *outp = (otype *) OUTP; \ + otype out, olow = OLOW(otype), ohigh = OHIGH(otype); \ + INT32 lbound = (INT32) LBOUND(itype); \ + INT32 ubound = (INT32) UBOUND(itype); \ + INT32 int_sf = INT_SF, int_off = INT_OFF; \ + CARD32 inv; \ + while (bw > 0) { \ + inv = *inp++; \ + out = olow; \ + bw--; \ + if (inv < lbound) { \ + out = (otype)((int_sf * inv + int_off)>>shift); \ + if (inv <= ubound) \ + out = ohigh; \ + } \ + *outp++ = out; \ + } \ +} +/* some compilers gag on long macros. somehow this helps */ +#define DO_CSi(fn_prep,fn_do,fn_do_b,itype,otype,shift) \ +DO_CSi_part1(fn_do,itype,otype,shift) \ +DO_CSi_part2(fn_do_b,itype,otype,shift) \ +static void \ +(*fn_prep (iband,oband,pvt,techpvt,band))() \ + bandPtr iband, oband; \ + mpCnstPvtPtr pvt; pCnstDefPtr techpvt; int band; \ +{ \ + CARD32 olow, ohigh; INT32 int_sf, int_off; \ + olow = techpvt->output_low[band]; \ + ohigh = techpvt->output_high[band]; \ + LBOUND(itype) = (itype) (techpvt->input_low[band] + HALF); \ + UBOUND(itype) = (itype) (techpvt->input_high[band] + HALF); \ + OLOW(otype) = olow = techpvt->output_low[band]; \ + OHIGH(otype) = ohigh = techpvt->output_high[band]; \ + olow <<= shift; \ + ohigh <<= shift; \ + INT_SF = int_sf = (ohigh - olow) / \ + (techpvt->input_high[band] - techpvt->input_low[band]); \ + INT_OFF = int_off = (1<<(shift-1)) + olow - \ + int_sf * (INT32) techpvt->input_low[band]; \ + INT_SF = int_sf; \ + INT_OFF = int_off; \ + return (int_sf >= 0) ? fn_do : fn_do_b; \ +} +#endif + +#define DO_CSf(fn_prep,fn_do,fn_do_b,itype,otype) \ +static void \ +fn_do(INP,OUTP,pvt,bw) \ + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; \ +{ \ + itype *inp = (itype *) INP; otype *outp = (otype *) OUTP; \ + itype inv, lbound = LBOUND(itype), ubound = UBOUND(itype); \ + otype out, olow = OLOW(otype), ohigh = OHIGH(otype); \ + ConstrainFloat sf = FLT_SF, offset = FLT_OFF; \ + while (bw-- > 0) { \ + inv = *inp++; \ + out = olow; \ + if (inv >= ubound) \ + out = ohigh; \ + else if (inv > lbound) \ + out = (otype)(sf * inv + offset); \ + *outp++ = out; \ + } \ +} \ +static void \ +fn_do_b(INP,OUTP,pvt,bw) \ + pointer INP; pointer OUTP; mpCnstPvtPtr pvt; int bw; \ +{ \ + itype *inp = (itype *) INP; otype *outp = (otype *) OUTP; \ + itype inv, lbound = LBOUND(itype), ubound = UBOUND(itype); \ + otype out, olow = OLOW(otype), ohigh = OHIGH(otype); \ + ConstrainFloat sf = FLT_SF, offset = FLT_OFF; \ + while (bw-- > 0) { \ + inv = *inp++; \ + out = ohigh; \ + if (inv >= lbound) \ + out = olow; \ + else if (inv > ubound) \ + out = (otype)(sf * inv + offset); \ + *outp++ = out; \ + } \ +} \ +static void \ +(*fn_prep (iband,oband,pvt,techpvt,band))() \ + bandPtr iband, oband; \ + mpCnstPvtPtr pvt; pCnstDefPtr techpvt; int band; \ +{ \ + OLOW(otype) = techpvt->output_low[band]; \ + OHIGH(otype) = techpvt->output_high[band]; \ + LBOUND(itype) = (itype) techpvt->input_low[band]; \ + UBOUND(itype) = (itype) techpvt->input_high[band]; \ + cs_scale_equation(pvt,techpvt,band); \ + return (FLT_SF >= 0.0) ? fn_do : fn_do_b; \ +} + +DO_CSb (CSp_bb, CSa_bb, CSb_bb, BitPixel, BitPixel) +DO_CSp (CSp_Bb, CSa_Bb, CSb_Bb, BytePixel, BitPixel) +DO_CSp (CSp_Pb, CSa_Pb, CSb_Pb, PairPixel, BitPixel) +DO_CSp (CSp_Qb, CSa_Qb, CSb_Qb, QuadPixel, BitPixel) +DO_CSp (CSp_Rb, CSa_Rb, CSb_Rb, RealPixel, BitPixel) + +DO_CScx (CSp_bB, CSa_bB, CSb_bB, BitPixel, BytePixel) +DO_CSi (CSp_BB, CSa_BB, CSb_BB, BytePixel, BytePixel, 22) +DO_CSi (CSp_PB, CSa_PB, CSb_PB, PairPixel, BytePixel, 22) +DO_CSi (CSp_QB, CSa_QB, CSb_QB, QuadPixel, BytePixel, 22) +DO_CSf (CSp_RB, CSa_RB, CSb_RB, RealPixel, BytePixel) + +DO_CSc (CSp_bP, CSa_bP, CSb_bP, BitPixel, PairPixel) +DO_CSi (CSp_BP, CSa_BP, CSb_BP, BytePixel, PairPixel, 14) +DO_CSi (CSp_PP, CSa_PP, CSb_PP, PairPixel, PairPixel, 14) +DO_CSi (CSp_QP, CSa_QP, CSb_QP, QuadPixel, PairPixel, 14) +DO_CSf (CSp_RP, CSa_RP, CSb_RP, RealPixel, PairPixel) + +DO_CSc (CSp_bQ, CSa_bQ, CSb_bQ, BitPixel, QuadPixel) +DO_CSi (CSp_BQ, CSa_BQ, CSb_BQ, BytePixel, QuadPixel, 6) +DO_CSi (CSp_PQ, CSa_PQ, CSb_PQ, PairPixel, QuadPixel, 6) +DO_CSi (CSp_QQ, CSa_QQ, CSb_QQ, QuadPixel, QuadPixel, 6) +DO_CSf (CSp_RQ, CSa_RQ, CSb_RQ, RealPixel, QuadPixel) + +#undef LBOUND +#undef HBOUND +#undef OLOW +#undef OHIGH +#undef FLT_SF +#undef FLT_OFF +#undef INT_SF +#undef INT_OFF + +/* end module mpcnst.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/mpcomp.c b/xie/xc/programs/Xserver/XIE/mixie/process/mpcomp.c new file mode 100644 index 0000000..bf159fa --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/mpcomp.c @@ -0,0 +1,1226 @@ +/* $XConsortium: mpcomp.c,v 1.4 94/04/17 20:35:14 rws Exp $ */ +/**** module mpcomp.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mpcomp.c -- DDXIE compare element + + Larry Hare -- AGE Logic, Inc. August, 1993 + +*****************************************************************************/ + + +#define _XIEC_MPCOMP +#define _XIEC_PCOMP + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeCompare(); + +/* +** Turn on NON_ROI to get non ROI based versions. They don't really go +** faster and cost about 20Kbytes of object code space. +*/ + +/* + * routines used internal to this module + */ +static int CreateCompare(); +static int InitializeCompare(); +static int ResetCompare(); +static int DestroyCompare(); + +#if defined(NON_ROI) +static int ActivateCompareM(); +static int ActivateCompareD(); +#endif +static int ActivateCompareMROI(); +static int ActivateCompareDROI(); +static int ActivateCompareTripleM(); +static int ActivateCompareTripleD(); + +/* + * DDXIE Compare entry points + */ +static ddElemVecRec CompareVec = { + CreateCompare, + InitializeCompare, + ActivateCompareMROI, + (xieBoolProc)NULL, + ResetCompare, + DestroyCompare + }; + +/* +* Local Declarations. +*/ + +typedef struct _mpcomparedef { + CARD32 iconst; /* first, in case of .asm code */ + RealPixel fconst; /* second, in case of .asm code */ + void (*action) (); + CARD32 width; + BOOL final; +#if defined(NON_ROI) + void (*action2) (); + CARD32 endrun; + CARD32 endix; +#endif +} mpComparePvtRec, *mpComparePvtPtr; + +/* +** NOTE: Might change constants to use dyads with prefilled constant strip +** to conserve code space at some small execution time expense. +** NOTE: The ROI variants use three loops, the first to get in sync with +** 32 bits, and the last to finish up partial words. A more space +** efficient version would have one loop which would check for M +** wrapping in which case the old word would be written. +** It also requires loads of intermediate destination words which +** will be completely overwritten. +** NOTE: Might do NE/GT/GE as a second pass inversion of EQ/LE/LT to +** save even more space at cost of another time penalty. This +** inversion would have to be applied to active ROI entries only. +** NOTE: On some machine architectures, it may be possible to write +** assembly or asm() code which does a compare and then extracts +** some 1 bit from a condition code register. This would reduce +** the multiplication of code by 6 (or 3). Heck you could even +** generate assembly code yourself automagically ... +** NOTE: Triple Compare assumes all src1 bands same height/width. +** NOTE: Triple Compare assumes all src2 bands same height/width. +** NOTE: Triple Compare with band_mask of 0 sets output to 1 (for +** equal) or 0 (for not equal) or 0 (outside ROI). This sortof +** makes sense since all the selected bands were equal :-) +*/ + +/*------------------------------------------------------------------------ +------------------------ fill in the vector --------------------------- +------------------------------------------------------------------------*/ +int miAnalyzeCompare(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ped->ddVec = CompareVec; + return TRUE; +} + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateCompare(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* always force syncing between inputs (is nop if only one input) */ + return MakePETex(flo,ped, + xieValMaxBands * sizeof(mpComparePvtRec), + SYNC, /* InSync: Make sure ROI exists first */ + NO_SYNC /* bandSync: see InitializeCompare */ + ); +} + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ + +#if defined(NON_ROI) +static int ActivateCompareM(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpComparePvtPtr pvt = (mpComparePvtPtr) pet->private; + int band, nbands = pet->receptor[SRCt1].inFlo->bands; + bandPtr sband = &(pet->receptor[SRCt1].band[0]); + bandPtr dband = &(pet->emitter[0]); + + for(band = 0; band < nbands; band++, pvt++, sband++, dband++) { + CARD32 npix = pvt->width; + LogInt *svoid, *dvoid; + + if (!(svoid = GetCurrentSrc(flo,pet,sband)) || + !(dvoid = GetCurrentDst(flo,pet,dband))) continue; + + do { + /* NOTE: could pass in replicated constant strip here */ + (*(pvt->action)) (dvoid, svoid, pvt, npix); + svoid = GetNextSrc(flo,pet,sband,FLUSH); + dvoid = GetNextDst(flo,pet,dband,FLUSH); + } while (!ferrCode(flo) && svoid && dvoid) ; + + FreeData(flo, pet, sband, sband->current); + } + return TRUE; +} +#endif /* NON_ROI */ + +#if defined(NON_ROI) +static int ActivateCompareD(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpComparePvtPtr pvt = (mpComparePvtPtr) pet->private; + int band, nbands = pet->receptor[SRCt1].inFlo->bands; + bandPtr sband = &(pet->receptor[SRCt1].band[0]); + bandPtr tband = &(pet->receptor[SRCt2].band[0]); + bandPtr dband = &(pet->emitter[0]); + + for(band = 0; band < nbands; band++, pvt++, sband++, tband++, dband++) { + LogInt *svoid, *tvoid, *dvoid; + + if (!(svoid = GetCurrentSrc(flo,pet,sband)) || + !(tvoid = GetCurrentSrc(flo,pet,tband)) || + !(dvoid = GetCurrentDst(flo,pet,dband)) ) { + if (sband->final && tband->final) { + /* Generate constant fill of 0 for remainder of image */ + while ((dband->current < dband->format->height) && + (dvoid = GetCurrentDst(flo,pet,dband))) { + action_clear(dvoid,dband->format->pitch,0); + if (PutData(flo,pet,dband,dband->current+1)) + break; + } + } + continue; + } + + do { + (*(pvt->action)) (dvoid, svoid, tvoid, pvt->endix); + if (pvt->action2) + (*(pvt->action2)) (dvoid, pvt->endrun, pvt->endix); + svoid = GetNextSrc(flo,pet,sband,FLUSH); + tvoid = GetNextSrc(flo,pet,tband,FLUSH); + dvoid = GetNextDst(flo,pet,dband,FLUSH); + } while (!ferrCode(flo) && svoid && tvoid && dvoid) ; + + if(!svoid && sband->final) { /* when sr1 runs out, kill sr2 too */ + DisableSrc(flo,pet,tband,FLUSH); + pvt->final = TRUE; /* generate constant fill on future activates */ + } else if(!tvoid && tband->final) {/* when sr2 runs out, clear rest */ + DisableSrc(flo,pet,sband,FLUSH); + pvt->final = TRUE; /* generate constant fill on future activates */ + } else { /* both inputs still active, keep the scheduler up to date */ + FreeData(flo,pet,sband,sband->current); + FreeData(flo,pet,tband,tband->current); + } + } + return TRUE; +} +#endif /* NON_ROI */ + +static int ActivateCompareMROI(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpComparePvtPtr pvt = (mpComparePvtPtr) pet->private; + int band, nbands = pet->receptor[SRCt1].inFlo->bands; + bandPtr sband = &(pet->receptor[SRCt1].band[0]); + bandPtr dband = &(pet->emitter[0]); + + for(band = 0; band < nbands; band++, pvt++, sband++, dband++) { + pointer svoid, dvoid; + + if (!(svoid = GetCurrentSrc(flo,pet,sband)) || + !(dvoid = GetCurrentDst(flo,pet,dband))) continue; + + while (!ferrCode(flo) && svoid && dvoid && + SyncDomain(flo,ped,dband,FLUSH)) { + INT32 run, ix = 0; + + /* bzero better for messy control planes */ + /* bzero((char *)dvoid, dband->pitch); */ + while (run = GetRun(flo,pet,dband)) { + if (run > 0) { + /* NOTE: could pass in replicated constant strip here */ + (*(pvt->action)) (dvoid, svoid, pvt, run, ix); + ix += run; + } else { + /* action_clear better for non ROI or simple ROIs */ + action_clear(dvoid, -run, ix); + ix -= run; + } + } + svoid = GetNextSrc(flo,pet,sband,FLUSH); + dvoid = GetNextDst(flo,pet,dband,FLUSH); + } + + FreeData(flo, pet, sband, sband->current); + } + return TRUE; +} + +static int ActivateCompareDROI(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpComparePvtPtr pvt = (mpComparePvtPtr) pet->private; + int band, nbands = pet->receptor[SRCt1].inFlo->bands; + bandPtr sband = &(pet->receptor[SRCt1].band[0]); + bandPtr tband = &(pet->receptor[SRCt2].band[0]); + bandPtr dband = &(pet->emitter[0]); + + for(band = 0; band < nbands; band++, pvt++, sband++, tband++, dband++) { + pointer svoid, tvoid, dvoid; + CARD32 w = pvt->width; + + if (!(svoid = GetCurrentSrc(flo,pet,sband)) || + !(tvoid = GetCurrentSrc(flo,pet,tband)) || + !(dvoid = GetCurrentDst(flo,pet,dband))) { + if (sband->final && tband->final) { + /* Generate constant fill of 0 for remainder of image */ + while ((dband->current < dband->format->height) && + (dvoid = GetCurrentDst(flo,pet,dband))) { + action_clear(dvoid,dband->format->pitch,0); + if (PutData(flo,pet,dband,dband->current+1)) + break; + } + } + continue; + } + + while (!ferrCode(flo) && svoid && tvoid && dvoid && + SyncDomain(flo,ped,dband,FLUSH)) { + INT32 run, ix = 0; + + /* bzero better for messy control planes */ + /* bzero((char *)dvoid, dband->pitch); */ + while (run = GetRun(flo,pet,dband)) { + if (run > 0) { + /* needs to clip to second source, yuck */ + if ((ix + run) > w) { + if (ix < w) { + (*(pvt->action)) (dvoid, svoid, tvoid, w - ix, ix); + ix = w; + } + action_clear(dvoid, dband->format->width - ix, ix); + break; + } + (*(pvt->action)) (dvoid, svoid, tvoid, run, ix); + ix += run; + } else { + /* action_clear better for non ROI or simple ROIs */ + action_clear(dvoid, -run, ix); + ix -= run; + } + } + svoid = GetNextSrc(flo,pet,sband,FLUSH); + tvoid = GetNextSrc(flo,pet,tband,FLUSH); + dvoid = GetNextDst(flo,pet,dband,FLUSH); + } + + if(!svoid && sband->final) { + /* when sr1 runs out, kill sr2 too. should be done */ + DisableSrc(flo,pet,tband,FLUSH); + pvt->final = TRUE; + } else if(!tvoid && tband->final) { + /* when sr2 runs out, kill off sr1 also, and clear remaining dest */ + DisableSrc(flo,pet,sband,FLUSH); + pvt->final = TRUE; + } else { + /* both inputs still active, keep the scheduler up to date */ + FreeData(flo,pet,sband,sband->current); + FreeData(flo,pet,tband,tband->current); + } + } + return TRUE; +} + +static int ActivateCompareTripleM(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpComparePvtPtr pvt = (mpComparePvtPtr) pet->private; + bandPtr sband = &(pet->receptor[SRCt1].band[0]); + bandPtr dband = &(pet->emitter[0]); + CARD8 msk = ((xieFloCompare *) ped->elemRaw)->bandMask; + BOOL equal = ((xieFloCompare *) ped->elemRaw)->operator == xieValEQ; + register pointer s0 = (pointer ) 1; + register pointer s1 = (pointer ) 1; + register pointer s2 = (pointer ) 1; + register pointer dvoid; + + if ((msk & 1) && !(s0 = GetCurrentSrc(flo,pet,sband))) + goto done; sband++; + if ((msk & 2) && !(s1 = GetCurrentSrc(flo,pet,sband))) + goto done; sband++; + if ((msk & 4) && !(s2 = GetCurrentSrc(flo,pet,sband))) + goto done; sband -= 2; + if(!(dvoid = GetCurrentDst(flo,pet,dband))) + goto done; + + /* + ** An alternative algorithm might use while(GetRun) loop to + ** set or clear the destination bits in the line; and then + ** use SIMPLER action routines which scanned the entire line + ** and only operate on 1 pixels; optionally followed by + ** a while(GetRun) to invert the active bits for NE. + */ + pvt += 2; + while (!ferrCode(flo) && s0 && s1 && s2 && dvoid && + SyncDomain(flo,ped,dband,FLUSH)) { + register INT32 run, ix = 0; + + while (run = GetRun(flo,pet,dband)) { + if (run > 0) { + action_set(dvoid, run, ix); + pvt -= 2; if (msk & 1) + (*pvt->action) (dvoid, s0, pvt, run, ix); + pvt++; if (msk & 2) + (*pvt->action) (dvoid, s1, pvt, run, ix); + pvt++; if (msk & 4) + (*pvt->action) (dvoid, s2, pvt, run, ix); + if (!equal) + action_invert(dvoid, run, ix); + ix += run; + } else { + action_clear(dvoid, -run, ix); + ix -= run; + } + } + + if (msk & 1) s0 = GetNextSrc(flo,pet,sband,FLUSH); sband++; + if (msk & 2) s1 = GetNextSrc(flo,pet,sband,FLUSH); sband++; + if (msk & 4) s2 = GetNextSrc(flo,pet,sband,FLUSH); sband -= 2; + dvoid = GetNextDst(flo,pet,dband,FLUSH); + } + + if (msk & 1) FreeData(flo,pet,sband,sband->current); sband++; + if (msk & 2) FreeData(flo,pet,sband,sband->current); sband++; + if (msk & 4) FreeData(flo,pet,sband,sband->current); sband -= 2; +done: + return TRUE; +} + +static int ActivateCompareTripleD(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpComparePvtPtr pvt = (mpComparePvtPtr) pet->private; + bandPtr sband = &(pet->receptor[SRCt1].band[0]); + bandPtr tband = &(pet->receptor[SRCt2].band[0]); + bandPtr dband = &(pet->emitter[0]); + CARD8 msk = ((xieFloCompare *) ped->elemRaw)->bandMask; + BOOL equal = ((xieFloCompare *) ped->elemRaw)->operator == xieValEQ; + CARD32 w = pvt->width; + register pointer s0 = (pointer ) 1; + register pointer s1 = (pointer ) 1; + register pointer s2 = (pointer ) 1; + register pointer t0 = (pointer ) 1; + register pointer t1 = (pointer ) 1; + register pointer t2 = (pointer ) 1; + register pointer dvoid; + + if (pvt->final) { /* generate constant fill */ + /* Generate constant fill of 0 for remainder of image */ + while ((dband->current < dband->format->height) && + (dvoid = GetCurrentDst(flo,pet,dband))) { + action_clear(dvoid,dband->format->pitch,0); + if (PutData(flo,pet,dband,dband->current+1)) + break; + } + return TRUE; + } + + if (msk & 1) s0 = GetCurrentSrc(flo,pet,sband); sband++; + if (msk & 2) s1 = GetCurrentSrc(flo,pet,sband); sband++; + if (msk & 4) s2 = GetCurrentSrc(flo,pet,sband); sband -= 2; + if (msk & 1) t0 = GetCurrentSrc(flo,pet,tband); tband++; + if (msk & 2) t1 = GetCurrentSrc(flo,pet,tband); tband++; + if (msk & 4) t2 = GetCurrentSrc(flo,pet,tband); tband -= 2; + + dvoid = GetCurrentDst(flo,pet,dband); + + while (!ferrCode(flo) && s0 && s1 && s2 && t0 && t1 && t2 && dvoid && + SyncDomain(flo,ped,dband,FLUSH)) { + register INT32 run, ix = 0, extra; + + while (run = GetRun(flo,pet,dband)) { + if (run > 0) { + extra = 0; + if ((ix+run) > w) { /* tband < sband */ + if (ix >= w) { /* already off the end of src2 */ + action_clear(dvoid, dband->format->width - ix, ix); + break; + } + extra = ix + run - w; + action_clear(dvoid, extra, w); + run = w - ix; + } + action_set(dvoid, run, ix); + if (msk & 1) (*((pvt+0)->action)) (dvoid, s0, t0, run, ix); + if (msk & 2) (*((pvt+1)->action)) (dvoid, s1, t1, run, ix); + if (msk & 4) (*((pvt+2)->action)) (dvoid, s2, t2, run, ix); + if (!equal) action_invert(dvoid, run, ix); + ix += run + extra; + } else { + action_clear(dvoid, -run, ix); + ix -= run; + } + } + + if (msk & 1) s0 = GetNextSrc(flo,pet,sband,FLUSH); sband++; + if (msk & 2) s1 = GetNextSrc(flo,pet,sband,FLUSH); sband++; + if (msk & 4) s2 = GetNextSrc(flo,pet,sband,FLUSH); sband -= 2; + if (msk & 1) t0 = GetNextSrc(flo,pet,tband,FLUSH); tband++; + if (msk & 2) t1 = GetNextSrc(flo,pet,tband,FLUSH); tband++; + if (msk & 4) t2 = GetNextSrc(flo,pet,tband,FLUSH); tband -= 2; + dvoid = GetNextDst(flo,pet,dband,FLUSH); + } + + if (msk & 1) FreeData(flo,pet,sband,sband->current); sband++; + if (msk & 2) FreeData(flo,pet,sband,sband->current); sband++; + if (msk & 4) FreeData(flo,pet,sband,sband->current); sband -= 2; + if (msk & 1) FreeData(flo,pet,tband,tband->current); tband++; + if (msk & 2) FreeData(flo,pet,tband,tband->current); tband++; + if (msk & 4) FreeData(flo,pet,tband,tband->current); tband -= 2; + + /* if dband is final, then we are done. make sure src2 disabled */ + if (dband->current >= dband->format->height) { + if (msk & 1) DisableSrc(flo,pet,tband,FLUSH); tband++; + if (msk & 2) DisableSrc(flo,pet,tband,FLUSH); tband++; + if (msk & 4) DisableSrc(flo,pet,tband,FLUSH); tband -= 2; + return TRUE; + } + + /* if src2 finished early, then disable src1 and generate 0 fill */ + if (dband->current >= tband->format->height) { + /* only need to check one band since in theory all the same */ + if (msk & 1) DisableSrc(flo,pet,sband,FLUSH); sband++; + if (msk & 2) DisableSrc(flo,pet,sband,FLUSH); sband++; + if (msk & 4) DisableSrc(flo,pet,sband,FLUSH); sband -= 2; + pvt->final = TRUE; + } + return TRUE; +} + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetCompare(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ResetReceptors(ped); + ResetProcDomain(ped); + ResetEmitter(ped); + return TRUE; +} + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyCompare(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc)NULL; + ped->ddVec.initialize = (xieIntProc)NULL; + ped->ddVec.activate = (xieIntProc)NULL; + ped->ddVec.reset = (xieIntProc)NULL; + ped->ddVec.destroy = (xieIntProc)NULL; + + return TRUE; +} + +/*------------------------------------------------------------------------ +--------------------- Lotsa Little Action Routines --------------------- +------------------------------------------------------------------------*/ + +#if defined(NON_ROI) +/* M: (*(pvt->action)) (dvoid, svoid, pvt, bw); */ +/* D: (*(pvt->action)) (dvoid, svoid, tvoid, bw); */ + +#define MakeBit(name1, name2, op) \ +static void name1(dst,src1,pvt,nx) \ + LogInt *dst; \ + pointer src1; \ + mpComparePvtPtr pvt; \ + CARD32 nx; \ +{ \ + LogInt *src = (LogInt *) src1; \ + LogInt S1, S2 = (pvt->iconst ? LOGONES : LOGZERO); \ + for (nx = (nx + LOGMASK) >> LOGSHIFT; nx > 0; nx--) { \ + S1 = *src++; \ + *dst++ = op; \ + } \ +} \ +static void name2(dst,src1,src2,nx) \ + LogInt *dst; \ + pointer src1, src2; \ + CARD32 nx; \ +{ \ + LogInt S1, *src = (LogInt *) src1; \ + LogInt S2, *trc = (LogInt *) src2; \ + for (nx = (nx + LOGMASK) >> LOGSHIFT; nx > 0; nx--) { \ + S1 = *src++; \ + S2 = *trc++; \ + *dst++ = op; \ + } \ +} + +#define MakePix(name1, name2, itype, cnst_name, op) \ +static void name1(dst,src1,pvt,nx) \ + LogInt *dst; \ + pointer src1; \ + mpComparePvtPtr pvt; \ + CARD32 nx; \ +{ \ + itype *src = (itype *) src1; \ + itype con = (itype) pvt->cnst_name; \ + LogInt M, value; \ + for ( ; nx >= LOGSIZE; nx -= LOGSIZE, *dst++ = value) \ + for (value = 0, M=LOGLEFT; M ; LOGRIGHT(M)) \ + if (*src++ op con) \ + value |= M; \ + if (nx > 0) { \ + for (value = 0, M=LOGLEFT; nx; nx--, LOGRIGHT(M)) \ + if (*src++ op con) \ + value |= M; \ + *dst = value; \ + } \ +} \ +static void name2(dst,src1,src2,nx) \ + LogInt *dst; \ + pointer src1, src2; \ + CARD32 nx; \ +{ \ + itype *src = (itype *) src1; \ + itype *trc = (itype *) src2; \ + LogInt M, value; \ + for ( ; nx >= LOGSIZE; nx -= LOGSIZE, *dst++ = value) \ + for (value = 0, M=LOGLEFT; M ; LOGRIGHT(M)) \ + if (*src++ op *trc++) \ + value |= M; \ + if (nx > 0) { \ + for (value = 0, M=LOGLEFT; nx; nx--, LOGRIGHT(M)) \ + if (*src++ op *trc++) \ + value |= M; \ + *dst = value; \ + } \ +} + +MakeBit (m_bit_lt, d_bit_lt, (S2 & ~S1) ) +MakeBit (m_bit_le, d_bit_le, (S2 | ~S1) ) +MakeBit (m_bit_eq, d_bit_eq, (S1 ^ ~S2) ) +MakeBit (m_bit_ne, d_bit_ne, (S1 ^ S2) ) +MakeBit (m_bit_gt, d_bit_gt, (S1 & ~S2) ) +MakeBit (m_bit_ge, d_bit_ge, (S1 | ~S2) ) + +MakePix (m_byte_lt, d_byte_lt, BytePixel, iconst, < ) +MakePix (m_byte_le, d_byte_le, BytePixel, iconst, <= ) +MakePix (m_byte_eq, d_byte_eq, BytePixel, iconst, == ) +MakePix (m_byte_ne, d_byte_ne, BytePixel, iconst, != ) +MakePix (m_byte_gt, d_byte_gt, BytePixel, iconst, > ) +MakePix (m_byte_ge, d_byte_ge, BytePixel, iconst, >= ) + +MakePix (m_pair_lt, d_pair_lt, PairPixel, iconst, < ) +MakePix (m_pair_le, d_pair_le, PairPixel, iconst, <= ) +MakePix (m_pair_eq, d_pair_eq, PairPixel, iconst, == ) +MakePix (m_pair_ne, d_pair_ne, PairPixel, iconst, != ) +MakePix (m_pair_gt, d_pair_gt, PairPixel, iconst, > ) +MakePix (m_pair_ge, d_pair_ge, PairPixel, iconst, >= ) + +MakePix (m_quad_lt, d_quad_lt, QuadPixel, iconst, < ) +MakePix (m_quad_le, d_quad_le, QuadPixel, iconst, <= ) +MakePix (m_quad_eq, d_quad_eq, QuadPixel, iconst, == ) +MakePix (m_quad_ne, d_quad_ne, QuadPixel, iconst, != ) +MakePix (m_quad_ge, d_quad_ge, QuadPixel, iconst, >= ) +MakePix (m_quad_gt, d_quad_gt, QuadPixel, iconst, > ) + +MakePix (m_real_lt, d_real_lt, RealPixel, fconst, < ) +MakePix (m_real_le, d_real_le, RealPixel, fconst, <= ) +MakePix (m_real_eq, d_real_eq, RealPixel, fconst, == ) +MakePix (m_real_ne, d_real_ne, RealPixel, fconst, != ) +MakePix (m_real_gt, d_real_gt, RealPixel, fconst, > ) +MakePix (m_real_ge, d_real_ge, RealPixel, fconst, >= ) + +static void (*action_mono[5][6])() = { + m_real_lt, m_real_le, m_real_eq, m_real_ne, m_real_gt, m_real_ge, + m_bit_lt, m_bit_le, m_bit_eq, m_bit_ne, m_bit_gt, m_bit_ge, + m_byte_lt, m_byte_le, m_byte_eq, m_byte_ne, m_byte_gt, m_byte_ge, + m_pair_lt, m_pair_le, m_pair_eq, m_pair_ne, m_pair_gt, m_pair_ge, + m_quad_lt, m_quad_le, m_quad_eq, m_quad_ne, m_quad_gt, m_quad_ge +}; +static void (*action_dyad[5][6])() = { + d_real_lt, d_real_le, d_real_eq, d_real_ne, d_real_gt, d_real_ge, + d_bit_lt, d_bit_le, d_bit_eq, d_bit_ne, d_bit_gt, d_bit_ge, + d_byte_lt, d_byte_le, d_byte_eq, d_byte_ne, d_byte_gt, d_byte_ge, + d_pair_lt, d_pair_le, d_pair_eq, d_pair_ne, d_pair_gt, d_pair_ge, + d_quad_lt, d_quad_le, d_quad_eq, d_quad_ne, d_quad_gt, d_quad_ge +}; +#endif + +/*------------------------------------------------------------------------ +--------------------- ROI operations work on subranges ------------------ +------------------------------------------------------------------------*/ + +/* MROI: (*(pvt->action)) (dvoid, src1, pvt, run, ix); */ +/* DROI: (*(pvt->action)) (dvoid, src1, src2, run, ix); */ + +/* Currently ROI code pre-zeroes the line and then we OR into it. +** If we want to use this for the nonROI code as well, it might be +** more efficient to instead use a passive routine (when run < 0) to +** clear out the idle bits. +*/ + +#define RakeBit(name1, name2, op) \ +static void name1(dst,src1,pvt,dx,x) \ + LogInt *dst; \ + pointer src1; \ + mpComparePvtPtr pvt; \ + INT32 dx, x; \ +{ \ + CARD32 M, D, px = LOGINDX(x); \ + LogInt S1, *src = ((LogInt *) src1) + px; \ + LogInt S2 = (pvt->iconst ? LOGONES : LOGZERO); \ + dst += px; \ + px = x & LOGMASK; \ + if ((px + dx) >= LOGSIZE) { \ + if (px) { \ + S1 = *src++; \ + D = *dst; \ + M = BitRight(LOGONES,px); \ + dx -= (LOGSIZE - px); \ + *dst++ = D | (M & op); \ + } \ + for (px = dx >> LOGSHIFT; px > 0; px--) { \ + S1 = *src++; \ + *dst++ = op; \ + } \ + if (dx &= LOGMASK) { \ + S1 = *src; \ + D = *dst; \ + M = ~BitRight(LOGONES,dx); \ + *dst = D | (M & op); \ + } \ + } else { \ + S1 = *src; \ + D = *dst; \ + M = BitRight(LOGONES,px) & ~(BitRight(LOGONES,px+dx)); \ + *dst = D | (M & op); \ + } \ +} \ +static void name2(dst,src1,src2,dx,x) \ + LogInt *dst; \ + pointer src1, src2; \ + INT32 dx, x; \ +{ \ + CARD32 M, D, px = LOGINDX(x); \ + LogInt S1, *src = ((LogInt *) src1) + px; \ + LogInt S2, *trc = ((LogInt *) src2) + px; \ + dst += px; \ + px = x & LOGMASK; \ + if ((px + dx) >= LOGSIZE) { \ + if (px) { \ + S1 = *src++; S2 = *trc++; \ + D = *dst; \ + M = BitRight(LOGONES,px); \ + dx -= (LOGSIZE - px); \ + *dst++ = D | (M & op); \ + } \ + for (px = dx >> LOGSHIFT; px > 0; px--) { \ + S1 = *src++; S2 = *trc++; \ + *dst++ = op; \ + } \ + if (dx &= LOGMASK) { \ + S1 = *src; S2 = *trc; \ + D = *dst; \ + M = ~BitRight(LOGONES,dx); \ + *dst = D | (M & op); \ + } \ + } else { \ + S1 = *src; S2 = *trc; \ + D = *dst; \ + M = BitRight(LOGONES,px) & ~(BitRight(LOGONES,px+dx)); \ + *dst = D | (M & op); \ + } \ +} + +#define RakePix(name1, name2, itype, cnst_name, op) \ +static void name1(dst,src1,pvt,dx,x) \ + LogInt *dst; \ + pointer src1; \ + mpComparePvtPtr pvt; \ + INT32 dx, x; \ +{ \ + itype *src = ((itype *) src1) + x; \ + itype con = (itype) pvt->cnst_name; \ + LogInt M, value; \ + dst += LOGINDX(x); \ + if (x & LOGMASK) { \ + for (value = *dst, M=LOGBIT(x); dx && M; dx--, LOGRIGHT(M)) \ + if (*src++ op con) \ + value |= M; \ + else \ + value &= ~M; \ + *dst++ = value; \ + } \ + for ( ; dx >= LOGSIZE; dx -= LOGSIZE, *dst++ = value) \ + for (value = 0, M=LOGLEFT; M ; LOGRIGHT(M)) \ + if (*src++ op con) \ + value |= M; \ + if (dx > 0) { \ + for (value = 0, M=LOGLEFT; dx; dx--, LOGRIGHT(M)) \ + if (*src++ op con) \ + value |= M; \ + *dst = value; \ + } \ +} \ +static void name2(dst,src1,src2,dx,x) \ + LogInt *dst; \ + pointer src1, src2; \ + INT32 dx, x; \ +{ \ + itype *src = ((itype *) src1) + x; \ + itype *trc = ((itype *) src2) + x; \ + LogInt M, value; \ + dst += LOGINDX(x); \ + if (x & LOGMASK) { \ + for (value = *dst, M=LOGBIT(x); dx && M; dx--, LOGRIGHT(M)) \ + if (*src++ op *trc++) \ + value |= M; \ + else \ + value &= ~M; \ + *dst++ = value; \ + } \ + for ( ; dx >= LOGSIZE; dx -= LOGSIZE, *dst++ = value) \ + for (value = 0, M=LOGLEFT; M ; LOGRIGHT(M)) \ + if (*src++ op *trc++) \ + value |= M; \ + if (dx > 0) { \ + for (value = 0, M=LOGLEFT; dx; dx--, LOGRIGHT(M)) \ + if (*src++ op *trc++) \ + value |= M; \ + *dst = value; \ + } \ +} + +/* +** Consider the following paradigm. It adds a taken branch to +** each loop, but reduces the amount of total code. This mechanism +** also relies on the preclearing of the full destination while +** the above mechanism could be adapted to apply boundary masks, +** to work more efficiently with nonROI data. +** +** for (value = 0, M = x & LOGMASK ; dx ; dx--) { +** if (*src++ op *trc++) value |= M; +** if (LOGRIGHT(M)) { *dst++ |= value; value = 0; } +** } +*/ + +RakeBit (rm_bit_lt, rd_bit_lt, (S2 & ~S1) ) +RakeBit (rm_bit_le, rd_bit_le, (S2 | ~S1) ) +RakeBit (rm_bit_eq, rd_bit_eq, (S1 ^ ~S2) ) +RakeBit (rm_bit_ne, rd_bit_ne, (S1 ^ S2) ) +RakeBit (rm_bit_gt, rd_bit_gt, (S1 & ~S2) ) +RakeBit (rm_bit_ge, rd_bit_ge, (S1 | ~S2) ) + +RakePix (rm_byte_lt, rd_byte_lt, BytePixel, iconst, < ) +RakePix (rm_byte_le, rd_byte_le, BytePixel, iconst, <= ) +RakePix (rm_byte_eq, rd_byte_eq, BytePixel, iconst, == ) +RakePix (rm_byte_ne, rd_byte_ne, BytePixel, iconst, != ) +RakePix (rm_byte_gt, rd_byte_gt, BytePixel, iconst, > ) +RakePix (rm_byte_ge, rd_byte_ge, BytePixel, iconst, >= ) + +RakePix (rm_pair_lt, rd_pair_lt, PairPixel, iconst, < ) +RakePix (rm_pair_le, rd_pair_le, PairPixel, iconst, <= ) +RakePix (rm_pair_eq, rd_pair_eq, PairPixel, iconst, == ) +RakePix (rm_pair_ne, rd_pair_ne, PairPixel, iconst, != ) +RakePix (rm_pair_gt, rd_pair_gt, PairPixel, iconst, > ) +RakePix (rm_pair_ge, rd_pair_ge, PairPixel, iconst, >= ) + +RakePix (rm_quad_lt, rd_quad_lt, QuadPixel, iconst, < ) +RakePix (rm_quad_le, rd_quad_le, QuadPixel, iconst, <= ) +RakePix (rm_quad_eq, rd_quad_eq, QuadPixel, iconst, == ) +RakePix (rm_quad_ne, rd_quad_ne, QuadPixel, iconst, != ) +RakePix (rm_quad_ge, rd_quad_ge, QuadPixel, iconst, >= ) +RakePix (rm_quad_gt, rd_quad_gt, QuadPixel, iconst, > ) + +RakePix (rm_real_lt, rd_real_lt, RealPixel, fconst, < ) +RakePix (rm_real_le, rd_real_le, RealPixel, fconst, <= ) +RakePix (rm_real_eq, rd_real_eq, RealPixel, fconst, == ) +RakePix (rm_real_ne, rd_real_ne, RealPixel, fconst, != ) +RakePix (rm_real_gt, rd_real_gt, RealPixel, fconst, > ) +RakePix (rm_real_ge, rd_real_ge, RealPixel, fconst, >= ) + +static void (*action_monoROI[5][6])() = { + rm_real_lt, rm_real_le, rm_real_eq, rm_real_ne, rm_real_gt, rm_real_ge, + rm_bit_lt, rm_bit_le, rm_bit_eq, rm_bit_ne, rm_bit_gt, rm_bit_ge, + rm_byte_lt, rm_byte_le, rm_byte_eq, rm_byte_ne, rm_byte_gt, rm_byte_ge, + rm_pair_lt, rm_pair_le, rm_pair_eq, rm_pair_ne, rm_pair_gt, rm_pair_ge, + rm_quad_lt, rm_quad_le, rm_quad_eq, rm_quad_ne, rm_quad_gt, rm_quad_ge +}; +static void (*action_dyadROI[5][6])() = { + rd_real_lt, rd_real_le, rd_real_eq, rd_real_ne, rd_real_gt, rd_real_ge, + rd_bit_lt, rd_bit_le, rd_bit_eq, rd_bit_ne, rd_bit_gt, rd_bit_ge, + rd_byte_lt, rd_byte_le, rd_byte_eq, rd_byte_ne, rd_byte_gt, rd_byte_ge, + rd_pair_lt, rd_pair_le, rd_pair_eq, rd_pair_ne, rd_pair_gt, rd_pair_ge, + rd_quad_lt, rd_quad_le, rd_quad_eq, rd_quad_ne, rd_quad_gt, rd_quad_ge +}; + +/*------------------------------------------------------------------------ +---------------- Triple Band Operations (with/without ROI) -------------- +------------------------------------------------------------------------*/ + +/* mono: (*(pvt->action)) (dvoid, src1, pvt, run, ix); */ +/* dyad: (*(pvt->action)) (dvoid, src1, src2, run, ix); */ + +#define tb_name1_body() \ + CARD32 M, D, px = LOGINDX(x); \ + LogInt S1, *src = ((LogInt *) src1) + px; \ + LogInt S2 = (pvt->iconst ? LOGONES : LOGZERO); \ + dst += px; \ + px = x & LOGMASK; \ + if ((px + dx) >= LOGSIZE) { \ + if (px) { \ + S1 = *src++; \ + D = *dst; \ + M = BitRight(LOGONES,px); \ + dx -= (LOGSIZE - px); \ + *dst++ = D & ~(M & (S1 ^ S2)); \ + } \ + for (px = dx >> LOGSHIFT; px > 0; px--) { \ + S1 = *src++; \ + D = *dst; \ + /* turn off (&~) unequal (^) bits */ \ + *dst++ = D & ~(S1 ^ S2); \ + } \ + if (dx &= LOGMASK) { \ + S1 = *src; \ + D = *dst; \ + M = ~BitRight(LOGONES,dx); \ + *dst = D & ~(M & (S1 ^ S2)); \ + } \ + } else { \ + S1 = *src; \ + D = *dst; \ + M = BitRight(LOGONES,px) & ~(BitRight(LOGONES,px+dx)); \ + *dst = D & ~(M & (S1 ^ S2)); \ + } +/* end of tb_name1_body */ + +#define tb_name2_body() \ + CARD32 M, D, px = LOGINDX(x); \ + LogInt S1, *src = ((LogInt *) src1) + px; \ + LogInt S2, *trc = ((LogInt *) src2) + px; \ + dst += px; \ + px = x & LOGMASK; \ + if ((px + dx) >= LOGSIZE) { \ + if (px) { \ + S1 = *src++; S2 = *trc++; \ + D = *dst; \ + M = BitRight(LOGONES,px); \ + dx -= (LOGSIZE - px); \ + *dst++ = D & ~(M & (S1 ^ S2)); \ + } \ + for (px = dx >> LOGSHIFT; px > 0; px--) { \ + S1 = *src++; S2 = *trc++; \ + D = *dst; \ + *dst++ = D & ~(S1 ^ S2); \ + } \ + if (dx &= LOGMASK) { \ + S1 = *src; S2 = *trc; \ + D = *dst; \ + M = ~BitRight(LOGONES,dx); \ + *dst = D & ~(M & (S1 ^ S2)); \ + } \ + } else { \ + S1 = *src; S2 = *trc; \ + D = *dst; \ + M = BitRight(LOGONES,px) & ~(BitRight(LOGONES,px+dx)); \ + *dst = D & ~(M & (S1 ^ S2)); \ + } +/* end of tb_name2_body */ + +#define TakeBit(name1, name2) \ +static void name1(dst,src1,pvt,dx,x) \ + LogInt *dst; \ + pointer src1; \ + mpComparePvtPtr pvt; \ + INT32 dx, x; \ +{ \ +tb_name1_body() \ +} \ +static void name2(dst,src1,src2,dx,x) \ + LogInt *dst; \ + pointer src1, src2; \ + INT32 dx, x; \ +{ \ +tb_name2_body() \ +} + +#define TakePix(name1, name2, itype, cnst_name) \ +static void name1(dst,src1,pvt,dx,x) \ + LogInt *dst; \ + pointer src1; \ + mpComparePvtPtr pvt; \ + INT32 dx, x; \ +{ \ + itype *src = ((itype *) src1) + x; \ + itype con = (itype) pvt->cnst_name; \ + LogInt M, value; \ + dst += LOGINDX(x); \ + if (x & LOGMASK) { \ + for (value = 0, M=LOGBIT(x); dx && M; dx--, LOGRIGHT(M)) \ + if (*src++ != con) \ + value |= M; \ + *dst++ &= ~value; \ + } \ + for ( ; dx >= LOGSIZE; dx -= LOGSIZE, dst++) { \ + /* if (!*dst) { src += LOGSIZE; } else */ \ + for (value = 0, M=LOGLEFT; M ; LOGRIGHT(M)) \ + if (*src++ != con) \ + value |= M; \ + *dst &= ~value; \ + } \ + if (dx > 0) { \ + for (value = 0, M=LOGLEFT; dx; dx--, LOGRIGHT(M)) \ + if (*src++ != con) \ + value |= M; \ + *dst &= ~value; \ + } \ +} \ +static void name2(dst,src1,src2,dx,x) \ + LogInt *dst; \ + pointer src1, src2; \ + INT32 dx, x; \ +{ \ + itype *src = ((itype *) src1) + x; \ + itype *trc = ((itype *) src2) + x; \ + LogInt M, value; \ + dst += LOGINDX(x); \ + if (x & LOGMASK) { \ + for (value = 0, M=LOGBIT(x); dx && M; dx--, LOGRIGHT(M)) \ + if (*src++ != *trc++) \ + value |= M; \ + *dst++ &= ~value; \ + } \ + for ( ; dx >= LOGSIZE; dx -= LOGSIZE, dst++) { \ + /* if (!*dst) { src += LOGSIZE; trc += LOGSIZE; } else */ \ + for (value = 0, M=LOGLEFT; M ; LOGRIGHT(M)) \ + if (*src++ != *trc++) \ + value |= M; \ + *dst &= ~value; \ + } \ + if (dx > 0) { \ + for (value = 0, M=LOGLEFT; dx; dx--, LOGRIGHT(M)) \ + if (*src++ != *trc++) \ + value |= M; \ + *dst++ &= ~value; \ + } \ +} + +TakeBit (tm_bit, td_bit) +TakePix (tm_byte, td_byte, BytePixel, iconst) +TakePix (tm_pair, td_pair, PairPixel, iconst) +TakePix (tm_quad, td_quad, QuadPixel, iconst) +TakePix (tm_real, td_real, RealPixel, fconst) + +static void (*action_mtrip[5])() = + { tm_real, tm_bit, tm_byte, tm_pair, tm_quad }; + +static void (*action_dtrip[5])() = + { td_real, td_bit, td_byte, td_pair, td_quad }; + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ + +static int InitializeCompare(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + xieFloCompare *raw = (xieFloCompare *) ped->elemRaw; + pCompareDefPtr epvt = (pCompareDefPtr) ped->elemPvt; + mpComparePvtPtr pvt = (mpComparePvtPtr) pet->private; + receptorPtr rcp = pet->receptor; + CARD32 nbands = rcp[SRCt1].inFlo->bands; + bandPtr sband = &(rcp[SRCt1].band[0]); + bandPtr tband = &(rcp[SRCt2].band[0]); + bandPtr dband = &(pet->emitter[0]); + CARD8 msk = raw->bandMask; + BOOL hasROI = raw->domainPhototag != 0; + BOOL doingtriple = raw->combine && (nbands == 3); + CARD32 band; + + if (doingtriple) { + if (raw->src2) + ped->ddVec.activate = ActivateCompareTripleD; + else + ped->ddVec.activate = ActivateCompareTripleM; +#if defined(NON_ROI) + } else if (!hasROI) { + if (raw->src2) + ped->ddVec.activate = ActivateCompareD; + else + ped->ddVec.activate = ActivateCompareM; +#endif + } else { + if (raw->src2) + ped->ddVec.activate = ActivateCompareDROI; + else + ped->ddVec.activate = ActivateCompareMROI; + } + for (band=0; bandformat->class); + pvt->width = sband->format->width; + pvt->final = FALSE; + if (raw->src2 && (pvt->width > tband->format->width)) + pvt->width = tband->format->width; + if (doingtriple) { + if (raw->src2) + pvt->action = action_dtrip[iclass]; + else + pvt->action = action_mtrip[iclass]; +#if defined(NON_ROI) + } else if (!hasROI) { + if (raw->src2) { + pvt->action = action_dyad[iclass][raw->operator-1]; + pvt->action2 = (void (*)()) NULL; + pvt->endix = dband->format->width; /* pixels to do */ + if (dband->format->width > tband->format->width) { + pvt->action2 = action_clear; + pvt->endix = tband->format->width; /* pixels to do */ + pvt->endrun = dband->format->width - + tband->format->width; /* pixels to pad */ + } + } else + pvt->action = action_mono[iclass][raw->operator-1]; +#endif + } else { /* ROI */ + if (raw->src2) + pvt->action = action_dyadROI[iclass][raw->operator-1]; + else + pvt->action = action_monoROI[iclass][raw->operator-1]; + } + if (!raw->src2) { + double dub = epvt->constant[band]; + pvt->fconst = dub; + pvt->iconst = ConstrainConst(dub, sband->format->levels); + } + } + + /* If processing domain, allow replication */ + if (hasROI && !doingtriple) + rcp[ped->inCnt-1].band[0].replicate = msk; + + InitReceptor(flo, ped, &rcp[SRCt1], NO_DATAMAP, 1, msk, NO_BANDS); + + if (raw->src2) + InitReceptor(flo, ped, &rcp[SRCt2], NO_DATAMAP, 1, msk, NO_BANDS); + +#if defined(NON_ROI) + if (hasROI || doingtriple) +#endif + InitProcDomain(flo, ped, raw->domainPhototag, raw->domainOffsetX, + raw->domainOffsetY); + InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE); + + pet->bandSync = doingtriple ? SYNC : NO_SYNC; + + return !ferrCode(flo); +} + + +/* end module mpcomp.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/mpconv.c b/xie/xc/programs/Xserver/XIE/mixie/process/mpconv.c new file mode 100644 index 0000000..71ecfc1 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/mpconv.c @@ -0,0 +1,481 @@ +/* $XConsortium: mpconv.c /main/6 1995/12/02 16:53:50 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module mpconv.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mpconv.c -- DDXIE convolve element + + Dean Verheiden && Robert NC Shelley -- AGE Logic, Inc. June, 1993 + +*****************************************************************************/ + + +#define _XIEC_MPCONV +#define _XIEC_PCONV + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include + + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeConvolve(); + +/* + * routines used internal to this module + */ +static int CreateConvolveConstant(); +static int InitializeConvolveConstant(); +static int ActivateConvolveConstant(); +static int ResetConvolveConstant(); +static int DestroyConvolve(); + +/* + * DDXIE Convolve entry points + */ +static ddElemVecRec ConvolveConstantVec = { + CreateConvolveConstant, + InitializeConvolveConstant, + ActivateConvolveConstant, + (xieIntProc)NULL, + ResetConvolveConstant, + DestroyConvolve + }; + +typedef struct _mpconvconst { + pointer carray; /* stores constant convolution lines */ + ConvFloat *sums; /* stores constant * kernel vals */ + void (*action)(); /* band specific action function */ + ConvFloat minClip; /* constrained data min clip value */ + ConvFloat maxClip; /* constrained data max clip value */ +} mpConvConstRec, *mpConvConstPtr; + +static void RealConvolveConstant(); +static void QuadConvolveConstant(); +static void PairConvolveConstant(); +static void ByteConvolveConstant(); +/*------------------------------------------------------------------------ +------------------------ fill in the vector --------------------------- +------------------------------------------------------------------------*/ +int miAnalyzeConvolve(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* based on the technique, fill in the appropriate entry point vector + */ + switch(ped->techVec->number) { + case xieValConvolveConstant: + ped->ddVec = ConvolveConstantVec; + break; + + case xieValConvolveReplicate: + default: + return (FALSE); /* Not implemented in the SI */ + } + return(TRUE); +} /* end miAnalyzeConvolve */ + + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateConvolveConstant(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* Allocate space for an array of pointers to constant convolution lines */ + return(MakePETex(flo, + ped, + sizeof(mpConvConstRec) * ped->inFloLst[SRCtag].bands, + SYNC, + NO_SYNC)); +} /* end CreateConvolve */ + + +#define GenConst(itype) \ + CARD32 iwidth = bnd->format->width; \ + itype *cline; \ + register itype cconst = (itype)*tconst; \ + register CARD32 i; \ + if (!(cline = (itype *)XieMalloc(sizeof(itype) * iwidth))) \ + AllocError(flo,ped,return(FALSE)); \ + cpvt->carray = (pointer)cline; \ + for (i = 0; i < iwidth; i++) *cline++ = cconst; \ + for (i = 0; i < ks2; i++) bnd->dataMap[i] = (CARD8 *)cpvt->carray; + + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeConvolveConstant(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloConvolve *raw = (xieFloConvolve *)ped->elemRaw; + CARD8 msk = raw->bandMask; + INT32 ksize = raw->kernelSize; + ConvFloat *tconst = (ConvFloat *)ped->techPvt; + ConvFloat *kernel = (ConvFloat *)ped->elemPvt; + peTexPtr pet = ped->peTex; + mpConvConstPtr cpvt = (mpConvConstPtr)pet->private; + receptorPtr rcp = pet->receptor; + INT32 b, ks2 = ksize>>1; + bandPtr bnd; + + /* If processing domain, allow replication */ + if (raw->domainPhototag) + pet->receptor[ped->inCnt-1].band[0].replicate = msk; + + if(!(InitReceptor(flo, ped, &rcp[SRCtag], ksize, ks2+1, msk, ~msk) && + InitProcDomain(flo, ped, raw->domainPhototag, raw->domainOffsetX, + raw->domainOffsetY) && + InitEmitter(flo,ped,SRCtag,NO_INPLACE))) + return(FALSE); + + /* Create constants for each band */ + for(b = 0; b < ped->inFloLst[SRCtag].bands; b++, cpvt++, tconst++) { + int i, j; + ConvFloat *sums; + + if ((msk & (1<sums = sums = + (ConvFloat *)XieMalloc(sizeof(ConvFloat) * ksize))) + AllocError(flo,ped,return(FALSE)); + + for (i = 0; i < ksize; i++) { + sums[i] = 0; + if (i == ks2) continue; /* Don't need a middle */ + for (j = 0; j < ksize; j++) + sums[i] += kernel[j * ksize + i] * *tconst; + } + /* Accumulate totals for multiple columns */ + for (i = ks2 - 2; i > -1; i--) + sums[i] += sums[i+1]; + for (i = ks2 + 2; i < ksize; i++) + sums[i] += sums[i-1]; + + bnd = &pet->receptor[SRCtag].band[b]; + switch (bnd->format->class) { + case UNCONSTRAINED: + { + GenConst(RealPixel); + cpvt->action = RealConvolveConstant; + cpvt->minClip = 0; /* Unsued for RealPixels */ + cpvt->maxClip = 0; /* Unused for RealPixels */ + } + break; + case QUAD_PIXEL: + { + GenConst(QuadPixel); + cpvt->action = QuadConvolveConstant; + cpvt->minClip = 0; + cpvt->maxClip = (ConvFloat)bnd->format->levels - 1; + } + break; + case PAIR_PIXEL: + { + GenConst(PairPixel); + cpvt->action = PairConvolveConstant; + cpvt->minClip = 0; + cpvt->maxClip = (ConvFloat)bnd->format->levels - 1; + } + break; + case BYTE_PIXEL: + { + GenConst(BytePixel); + cpvt->action = ByteConvolveConstant; + cpvt->minClip = 0; + cpvt->maxClip = (ConvFloat)bnd->format->levels - 1; + } + break; + case BIT_PIXEL: /* SILLY_BITONAL, not supported */ + default: + return(FALSE); + } + } + return(TRUE); +} /* end InitializeConvolveConstant */ + +#define ConvConstAction_Body(dtype) \ + /* Handle the left edge */ \ + endx = (k2 <= currX + run) ? k2 : currX + run; \ + for(i = currX; i < endx; i++, currX++, run--){ \ + ConvFloat count = 0.0; \ + for(j = 0 ; j < ks; j++) \ + for(k = -i; k <= k2; k++) \ + count += br[j][i+k] * kernel[j * ks + k + k2]; \ + if (*tconst) \ + count += cpvt->sums[i]; /* Sum of left side pad */ \ + ClipIt; \ + *dst++ = (dtype) count; \ + } \ + if (run <= 0) return; \ + /* Handle the middle */ \ + endx = (w <= currX + run) ? w : currX + run; \ + for(i = (k2 < currX) ? currX : k2; i < endx; i++,currX++,run--) { \ + ConvFloat count = 0.0; \ + for(j = 0 ; j < ks; j++) \ + for(k = -k2; k <= k2; k++) \ + count += br[j][i+k] * kernel[j * ks + k + k2]; \ + ClipIt; \ + *dst++ = (dtype) count; \ + } \ + if (run <= 0) return; \ + /* Handle the right edge */ \ + endx = (width <= currX + run) ? width : currX + run; \ + for(i = currX; i < endx; i++,currX++,run--) { \ + ConvFloat count = 0.0; \ + for(j = 0 ; j < ks; j++) \ + for(k = -k2; k < width - i; k++) \ + count += br[j][i+k] * kernel[j * ks + k + k2]; \ + if (*tconst) \ + count += cpvt->sums[ks - (width - i)]; \ + ClipIt; \ + *dst++ = (dtype) count; \ + } \ + +#define ConvConstAction(name,dtype) \ +static void name(cpvt,kernel,tconst,run,currX,br,dst,ks,width) \ +mpConvConstPtr cpvt; \ +ConvFloat *kernel, *tconst; \ +INT32 run, currX, ks; \ +dtype *dst, **br; \ +CARD32 width; \ +{ \ + ConvFloat minClip = cpvt->minClip; \ + ConvFloat maxClip = cpvt->maxClip; \ + INT32 k2 = ks/2; \ + INT32 w = width - k2; \ + INT32 endx; \ + int i,j,k; \ + /* Adjust destination to current location */ \ + dst += currX; \ + /* Outside of region, pass these pixels */ \ + if (run < 0) { \ + memcpy(dst, &br[k2][currX], -run * sizeof(dtype)); \ + return; \ + } \ + ConvConstAction_Body(dtype); \ +} + + +/* Macro for clipping of constrained data */ +#define ClipIt \ +if (count < minClip) \ + count = minClip; \ +else if (count > maxClip) \ + count = maxClip; + +ConvConstAction(ByteConvolveConstant,BytePixel) +ConvConstAction(PairConvolveConstant,PairPixel) +ConvConstAction(QuadConvolveConstant,QuadPixel) +#undef ClipIt +#define ClipIt +ConvConstAction(RealConvolveConstant,RealPixel) + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateConvolveConstant(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloConvolve *raw = (xieFloConvolve *)ped->elemRaw; + mpConvConstPtr cpvt = (mpConvConstPtr)pet->private; + bandPtr iband = &pet->receptor[SRCtag].band[0]; + bandPtr oband = &pet->emitter[0]; + ConvFloat *tconst = (ConvFloat *)ped->techPvt; + ConvFloat *kernel = (ConvFloat *)ped->elemPvt; + INT32 ks = raw->kernelSize; + INT32 k2 = ks/2; + CARD8 bmask = raw->bandMask; + int b; + + for(b = 0; b < ped->inFloLst[SRCtag].bands; b++, cpvt++, tconst++, iband++, + oband++) + if(bmask & 1<scheduled & 1<format->height - 1 - k2; + CARD32 width = oband->format->width; + CARD32 sline = iband->current; + CARD32 dline = oband->current; + CARD32 len = ks; + CARD32 map = 0; + pointer *br = (pointer *)iband->dataMap; + pointer dst; + Bool ok; + + while(!ferrCode(flo)) { + INT32 run, currX = 0; + + /* do special handling at top and bottom of image */ + if(dline <= k2) { + len = iband->threshold; + map = ks - len; + sline = 0; + if(dline < k2) + SetBandThreshold(iband, len + 1); + } + if(dline > end) { + len = iband->threshold - 1; + br[len] = (pointer)cpvt->carray; + SetBandThreshold(iband, len); + } + + ok = MapData(flo,pet,iband,map,sline++,len,TRUE); + dst = GetDst(flo,pet,oband,dline++,TRUE); + + if(!ok || !dst || !SyncDomain(flo,ped,oband,FLUSH)) break; + + while (run = GetRun(flo,pet,oband)) { + (*cpvt->action)(cpvt,kernel,tconst,run,currX,br,dst,ks,width); + currX += (run > 0) ? run : -run; + } + } + FreeData(flo, pet, iband, len ? iband->current : iband->maxGlobal); + } + return(TRUE); +} /* end ActivateConvolveConstant */ + + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetConvolveConstant(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + mpConvConstPtr cpvt = (mpConvConstPtr)ped->peTex->private; + int b; + + for(b = 0; b < ped->inFloLst[SRCtag].bands; b++, cpvt++) { + if (cpvt->carray) cpvt->carray = (pointer) XieFree(cpvt->carray); + if (cpvt->sums) cpvt->sums = (ConvFloat *) XieFree(cpvt->sums); + cpvt->action = (void (*)())NULL; + cpvt->minClip = 0; + cpvt->maxClip = 0; + } + + ResetReceptors(ped); + ResetEmitter(ped); + + return(TRUE); +} /* end ResetConvolveConstant */ + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyConvolve(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + if(ped->peTex) + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc)NULL; + ped->ddVec.initialize = (xieIntProc)NULL; + ped->ddVec.activate = (xieIntProc)NULL; + ped->ddVec.reset = (xieIntProc)NULL; + ped->ddVec.destroy = (xieIntProc)NULL; + + return(TRUE); +} /* end DestroyConvolve */ + +/* end module mpconv.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/mpctoi.c b/xie/xc/programs/Xserver/XIE/mixie/process/mpctoi.c new file mode 100644 index 0000000..d42b2c3 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/mpctoi.c @@ -0,0 +1,1065 @@ +/* $XConsortium: mpctoi.c /main/8 1995/12/02 16:53:54 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module mpctoi.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mpctoi.c -- DDXIE ConvertToIndex element + + Robert NC Shelley -- AGE Logic, Inc. July, 1993 + +*****************************************************************************/ + +#define _XIEC_MPCTOI +#define _XIEC_PCTOI + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include +#include + + +extern int AllocColor(); /* in . . . server/dix/colormap.c */ + + +/* routines referenced by other DDXIE modules + */ +int miAnalyzeCvtToInd(); + +/* routines used internal to this module + */ +static int CreateCtoIAll(); +static int InitializeCtoIAll(); +static int DoGrayCtoIAll(); +static int DoRGB1CtoIAll(); +static int DoRGB3CtoIAll(); +static int DoRGB3CtoIAll(); +static int ResetCtoIAll(); +static int DestroyCtoI(); + +static int allocDirect(); +static int allocGray1(); +static int allocGray3(); +static int allocRGB1(); +static int allocRGB3(); +static pointer cvt(); + + +/* DDXIE ConvertToIndex entry points + */ +static ddElemVecRec mpCtoIAllVec = { + CreateCtoIAll, + InitializeCtoIAll, + (xieIntProc)NULL, + (xieIntProc)NULL, + ResetCtoIAll, + DestroyCtoI + }; + + +/* Local Declarations. + */ +#define HASH_POINT 14 /* use hash table if sum of depth exceeds this */ + +#define HR 19 /* prime hash multipliers (sum also prime) */ +#define HG 23 +#define HB 17 + +#define NADA (xieVoidProc)NULL + +typedef struct _ctihash { + CARD32 rgbVal; + Pixel pixdex; +} ctiHashRec, *ctiHashPtr; + + +typedef struct _mpctiall { + xieVoidProc action; /* scanline action routine */ + xieVoidProc action2; /* pass 2 scanline action routine */ + ColormapPtr cmap; /* colormap-id */ + int cmapFull; /* == Success until allocs fail */ + int clindex; /* index of client doing allocs */ + int (*alloc)(); /* color allocation routine */ + Pixel *pixLst; /* list of alloc'd pixels */ + CARD32 pixCnt; /* count of alloc'd pixels (total)*/ + CARD32 allocMatch; /* count of alloc'd/matched pixels*/ + CARD32 shareMatch; /* count of shared/matched pixels */ + CARD32 width; /* image width */ + CARD32 fill; /* value to use if alloc fails */ + BOOL hashing; /* true if using hash table */ + CARD8 trim[xieValMaxBands]; /* # LS bits to trim from pixels */ + CARD32 mask[xieValMaxBands]; /* mask for keeping useful bits */ + CARD32 shft[xieValMaxBands]; /* crazy-pixel shift counts */ + float coef[xieValMaxBands]; /* scale pixel up to 16 bits */ + CARD32 tmpLen[xieValMaxBands]; /* length of tmpLsts... */ + pointer tmpLst[xieValMaxBands]; /* lists where we remember stuff */ + Bool tmpSet; /* initialize tmpLsts to 0 or ~0 */ + pointer auxbuf[xieValMaxBands]; /* format-class conversion buffers*/ + CARD8 iclass[xieValMaxBands]; /* input format classes */ + CARD8 cclass; /* conversion format class */ +} ctiAllRec, *ctiAllPtr; + + +/***************************************************************************** + * + * Convert to Index alloc-All action routines: + * CtoIall_bmctio + * |||||`-- output format class (b=bit, B=byte, P=pair, Q=quad) + * ||||`--- input format class (b=bit, B=byte, P=pair, Q=quad) + * |||`---- L:lookup, H:hash, U:usage map + * ||`----- class colormap: d=dynamic, s=static + * |`------ 1 or 3 map colormap (blank if it supports both) + * `------- 1 or 3 band image + */ +static void CtoIall_1_dLBB(), CtoIall_1_dLBP(), CtoIall_1_dLBQ(); +static void CtoIall_1_dLPB(), CtoIall_1_dLPP(), CtoIall_1_dLPQ(); +static void CtoIall_31dLBB(), CtoIall_31dLBP(); +static void CtoIall_31dLPB(), CtoIall_31dLPP(); +static void CtoIall_31dHBB(), CtoIall_31dHBP(); +static void CtoIall_31dHPB(), CtoIall_31dHPP(); + +static void CtoIall_33dUB_(), CtoIall_33dUP_(); + +static void CtoIall_33dLBB(), CtoIall_33dLBP(), CtoIall_33dLBQ(); +static void CtoIall_33dLPB(), CtoIall_33dLPP(), CtoIall_33dLPQ(); + +/* input bits are promoted to bytes, so they share the same action routines + */ +#define CtoIall_1_dLbB CtoIall_1_dLBB +#define CtoIall_1_dLbP CtoIall_1_dLBP +#define CtoIall_1_dLbQ CtoIall_1_dLBQ +#define CtoIall_31dLbB CtoIall_31dLBB +#define CtoIall_31dLbP CtoIall_31dLBP +#define CtoIall_31dHbB CtoIall_31dHBB +#define CtoIall_31dHbP CtoIall_31dHBP +#define CtoIall_33dUb_ CtoIall_33dUB_ +#define CtoIall_33dLbB CtoIall_33dLBB +#define CtoIall_33dLbP CtoIall_33dLBP +#define CtoIall_33dLbQ CtoIall_33dLBQ + + +/* single band image, single or triple dynamic colormap, linear lookup tables + */ +static void (*gray_action[4][3])() = { + NADA, NADA, NADA, /* out=b, in=b..P */ + CtoIall_1_dLbB, CtoIall_1_dLBB, CtoIall_1_dLPB, /* out=B, in=b..P */ + CtoIall_1_dLbP, CtoIall_1_dLBP, CtoIall_1_dLPP, /* out=P, in=b..P */ + CtoIall_1_dLbQ, CtoIall_1_dLBQ, CtoIall_1_dLPQ, /* out=Q, in=b..P */ +}; + +/* triple band image, single dynamic colormap, linear or hash tables + */ +static void (*rgb1_action[2][4][3])() = { + NADA, NADA, NADA, /* lut, out=b, in=b..P */ + CtoIall_31dLbB, CtoIall_31dLBB, CtoIall_31dLPB, /* lut, out=B, in=b..P */ + CtoIall_31dLbP, CtoIall_31dLBP, CtoIall_31dLPP, /* lut, out=P, in=b..P */ + NADA, NADA, NADA, /* lut, out=Q, in=b..P */ + NADA, NADA, NADA, /* hash, out=b, in=b..P */ + CtoIall_31dHbB, CtoIall_31dHBB, CtoIall_31dHPB, /* hash, out=B, in=b..P */ + CtoIall_31dHbP, CtoIall_31dHBP, CtoIall_31dHPP, /* hash, out=P, in=b..P */ + NADA, NADA, NADA, /* hash, out=Q, in=b..P */ +}; + +/* triple band image, triple dynamic colormap, map usage (Boolean histogram) + */ +static void (*rgb3_action_usage[3])() = { + CtoIall_33dUb_, CtoIall_33dUB_, CtoIall_33dUP_, /* usage map out, in=b..P */ +}; + +/* triple band image, triple dynamic colormap, linear lookup tables + */ +static void (*rgb3_action_remap[4][3])() = { + NADA, NADA, NADA, /* out=b, in=b..P */ + CtoIall_33dLbB, CtoIall_33dLBB, CtoIall_33dLPB, /* out=B, in=b..P */ + CtoIall_33dLbP, CtoIall_33dLBP, CtoIall_33dLPP, /* out=P, in=b..P */ + CtoIall_33dLbQ, CtoIall_33dLBQ, CtoIall_33dLPQ, /* out=Q, in=b..P */ +}; + + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeCvtToInd(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloConvertToIndex *raw = (xieFloConvertToIndex *)ped->elemRaw; + + /* stash the appropriate entry point vector in the peDef + */ + switch(ped->techVec->number) { + case xieValColorAllocAll: ped->ddVec = mpCtoIAllVec; break; + case xieValColorAllocMatch: + case xieValColorAllocRequantize: + default: TechniqueError(flo, ped, xieValColorAlloc, + raw->colorAlloc, raw->lenParams, return(FALSE)); + } + return(TRUE); +} /* end miAnalyzeCvtToInd */ + + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateCtoIAll(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + pCtoIDefPtr dix = (pCtoIDefPtr) ped->elemPvt; + Bool band_sync = !dix->graySrc || dix->class != DirectColor; + + return(MakePETex(flo, ped, sizeof(ctiAllRec), NO_SYNC, band_sync)); +} /* end CreateCtoIAll */ + + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeCtoIAll(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloConvertToIndex *raw = (xieFloConvertToIndex *)ped->elemRaw; + xieTecColorAllocAll *tec = (xieTecColorAllocAll *) &raw[1]; + pTecCtoIDefPtr pvt = (pTecCtoIDefPtr) ped->techPvt; + peTexPtr pet = ped->peTex; + formatPtr ift = &ped->inFloLst[SRCtag].format[0]; + formatPtr oft = &ped->outFlo.format[0]; + pCtoIDefPtr dix = (pCtoIDefPtr) ped->elemPvt; + ctiAllPtr ddx = (ctiAllPtr) pet->private; + CARD8 depth, bands = dix->graySrc ? 1 : 3; + CARD32 ic = BYTE_PIXEL, oc = oft->class; + CARD32 b, size; + + /* init generic color allocation params + */ + ddx->cmap = dix->cmap; + ddx->clindex = dix->list->client->index; + ddx->fill = pvt->fill; + ddx->width = oft->width; + ddx->cmapFull = 0; + ddx->pixCnt = 0; + ddx->allocMatch = 0; + ddx->shareMatch = 0; + if(!(ddx->pixLst = (Pixel*) XieCalloc((dix->cells + 1) * sizeof(Pixel)))) + AllocError(flo,ped, return(FALSE)); + + /* examine input data format-classes + */ + for(b = 0; b < bands; ++b) { + ddx->iclass[b] = ift[b].class; + ic = max(ddx->iclass[b],ic); + } + ddx->cclass = ic; + size = (ic == BYTE_PIXEL ? sz_BytePixel : sz_PairPixel) >> 3; + + /* init format-class and pixel to RGB cell conversion parameters + */ + for(b = 0; b < bands; ++b) { + if(ift[b].class != ic && + !(ddx->auxbuf[b] = (pointer) XieMalloc((ift->width+7)*size))) + AllocError(flo,ped, return(FALSE)); + + ddx->trim[b] = ift[b].depth > dix->stride ? ift[b].depth - dix->stride : 0; + ddx->mask[b] = (1 << ift[b].depth - ddx->trim[b]) - 1; + ddx->coef[b] = 65535.0 / ((ift[b].levels >> ddx->trim[b]) - 1); + } + /* init stuff specific to the image class and visual class + */ + if(dix->graySrc) { + /* + * grayscale image, visual class doesn't matter + */ + ddx->tmpSet = TRUE; + ddx->tmpLen[0] = (ddx->mask[0] + 1) * sizeof(Pixel); + ddx->action = gray_action[oc-1][ic-1]; + ddx->alloc = (pvt->defTech ? dix->class <= PseudoColor + ? allocGray1 : allocGray3 : AllocColor); + if(ddx->alloc == allocGray3) + ddx->pixLst[dix->cells] = ~0; + ped->ddVec.activate = DoGrayCtoIAll; + + } else if(dix->class <= PseudoColor) { + /* + * RGB image, visual class has a single channel colormap + */ + for(depth = 0, b = 0; b < xieValMaxBands; ++b) { + SetDepthFromLevels(ddx->mask[b]+1,size); + ddx->shft[b] = depth; + depth += size; + } + /* if we have too many levels, we'll have to use a hash table + */ + if(ddx->hashing = depth > HASH_POINT) { + ddx->tmpLen[0] = (HR+HG+HB) * (dix->cells + 1) * sizeof(ctiHashRec); + ddx->tmpSet = FALSE; + } else { + ddx->tmpLen[0] = (1<tmpSet = TRUE; + } + bands = 1; /* only 1 colormap band */ + ddx->action = rgb1_action[ddx->hashing ? 1 : 0][oc-1][ic-1]; + ddx->alloc = pvt->defTech ? allocRGB1 : AllocColor; + ped->ddVec.activate = DoRGB1CtoIAll; + + } else { + /* + * RGB image, visual class has a three channel colormap + */ + for(b = 0; b < bands; ++b) { + SetDepthFromLevels(ddx->mask[b]+1,depth); + ddx->tmpLen[b] = (1<tmpSet = FALSE; + ddx->action = rgb3_action_usage[ic-1]; + ddx->action2 = rgb3_action_remap[oc-1][ic-1]; + ddx->alloc = pvt->defTech ? allocRGB3 : AllocColor; + ped->ddVec.activate = DoRGB3CtoIAll; + } + if(!ddx->action) ImplementationError(flo,ped, return(FALSE)); + + /* alloc/init whatever temporary storage we need + */ + for(b = 0; b < bands; ++b) { + if(!(ddx->tmpLst[b] = (pointer ) XieMalloc(ddx->tmpLen[b]))) + AllocError(flo,ped, return(FALSE)); + memset((char*)ddx->tmpLst[b],(char)(ddx->tmpSet ? ~0 : 0),ddx->tmpLen[b]); + } + return(InitReceptors(flo, ped, NO_DATAMAP, 1) && + InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE)); +} /* end InitializeCtoIAll */ + + +/*------------------------------------------------------------------------ +------------------------- crank some input data -------------------------- +------------------------------------------------------------------------*/ +static int DoGrayCtoIAll(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloConvertToIndex *raw = (xieFloConvertToIndex *)ped->elemRaw; + ctiAllPtr ddx = (ctiAllPtr) pet->private; + bandPtr iband = &pet->receptor[SRCtag].band[0]; + bandPtr oband = &pet->emitter[0]; + pointer ivoid, ovoid; + + if(Resumed(flo,pet) && + (flo->runClient->clientGone || + ddx->cmap != (ColormapPtr) LookupIDByType(raw->colormap, RT_COLORMAP))) + ColormapError(flo,ped,raw->colormap, return(FALSE)); + + if((ivoid = GetCurrentSrc(flo,pet,iband)) && + (ovoid = GetCurrentDst(flo,pet,oband))) + do { + if(ddx->auxbuf[0]) ivoid = cvt(ivoid, ddx, (CARD8)0); + + (*ddx->action)(ddx, ovoid, ivoid); + + ivoid = GetNextSrc(flo,pet,iband,FLUSH); + ovoid = GetNextDst(flo,pet,oband,FLUSH); + } while(ivoid && ovoid); + + FreeData(flo,pet,iband,iband->current); + + return(TRUE); +} /* end DoGrayCtoIAll */ + + +/*------------------------------------------------------------------------ +------------------------- crank some input data -------------------------- +------------------------------------------------------------------------*/ +static int DoRGB1CtoIAll(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloConvertToIndex *raw = (xieFloConvertToIndex *)ped->elemRaw; + ctiAllPtr ddx = (ctiAllPtr) pet->private; + bandPtr iband = &pet->receptor[SRCtag].band[0]; + bandPtr oband = &pet->emitter[0]; + pointer ovoid, ivoid0, ivoid1, ivoid2; + + if(Resumed(flo,pet) && + (flo->runClient->clientGone || + ddx->cmap != (ColormapPtr) LookupIDByType(raw->colormap, RT_COLORMAP))) + ColormapError(flo,ped,raw->colormap, return(FALSE)); + + ovoid = GetCurrentDst(flo,pet,oband); + ivoid0 = GetCurrentSrc(flo,pet,iband); iband++; + ivoid1 = GetCurrentSrc(flo,pet,iband); iband++; + ivoid2 = GetCurrentSrc(flo,pet,iband); iband -= 2; + + while(ovoid && ivoid0 && ivoid1 && ivoid2) { + + if(ddx->auxbuf[0]) ivoid0 = cvt(ivoid0, ddx, (CARD8)0); + if(ddx->auxbuf[1]) ivoid1 = cvt(ivoid1, ddx, (CARD8)1); + if(ddx->auxbuf[2]) ivoid2 = cvt(ivoid2, ddx, (CARD8)2); + + (*ddx->action)(ddx, ovoid, ivoid0, ivoid1, ivoid2); + + ovoid = GetNextDst(flo,pet,oband,FLUSH); + ivoid0 = GetNextSrc(flo,pet,iband,FLUSH); iband++; + ivoid1 = GetNextSrc(flo,pet,iband,FLUSH); iband++; + ivoid2 = GetNextSrc(flo,pet,iband,FLUSH); iband -= 2; + } + FreeData(flo,pet,iband,iband->current); iband++; + FreeData(flo,pet,iband,iband->current); iband++; + FreeData(flo,pet,iband,iband->current); + + return(TRUE); +} /* end DoRGB1CtoIAll */ + + +/*------------------------------------------------------------------------ +------------------------- crank some input data -------------------------- +------------------------------------------------------------------------*/ +static int DoRGB3CtoIAll(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + bandPtr iband = &pet->receptor[SRCtag].band[0]; + ctiAllPtr ddx = (ctiAllPtr) pet->private; + + if(ddx->action) { + BOOL final = TRUE; + pointer ivoid; + int b; + + /* PASS 1: generate per-band usage maps of the colors needed + */ + for(b = 0; b < xieValMaxBands; b++, iband++) { + for(ivoid = GetCurrentSrc(flo,pet,iband); ivoid; + ivoid = GetNextSrc(flo,pet,iband,KEEP)) { + + if(ddx->auxbuf[b]) ivoid = cvt(ivoid, ddx, (CARD8)b); + + (*ddx->action)(ddx, ivoid, b); + } + /* if we're done with the band, go back to the first scanline, otherwise + * increase the threshold to keep the scheduler out of our hair + */ + if(iband->final) + iband->current = 0; + else { + final = FALSE; + SetBandThreshold(iband, iband->current + 1); + } + } + /* now that we know what we need, it's time to allocate colors. + * we'll continue with PASS 2 when we return from the scheduler + */ + if(final) { + ddx->action = (xieVoidProc)NULL; + return(allocDirect(flo,ped,pet,ddx)); + } + } else { + bandPtr oband = &pet->emitter[0]; + pointer ovoid, ivoid0, ivoid1, ivoid2; + + /* PASS 2: map src pixesl to allocated colors + */ + ivoid0 = GetCurrentSrc(flo,pet,iband); iband++; + ivoid1 = GetCurrentSrc(flo,pet,iband); iband++; + ivoid2 = GetCurrentSrc(flo,pet,iband); iband -= 2; + ovoid = GetCurrentDst(flo,pet,oband); + + while(ovoid && ivoid0 && ivoid1 && ivoid2) { + + if(ddx->auxbuf[0]) ivoid0 = cvt(ivoid0, ddx, (CARD8)0); + if(ddx->auxbuf[1]) ivoid1 = cvt(ivoid1, ddx, (CARD8)1); + if(ddx->auxbuf[2]) ivoid2 = cvt(ivoid2, ddx, (CARD8)2); + + (*ddx->action2)(ddx, ovoid, ivoid0, ivoid1, ivoid2); + + ivoid0 = GetNextSrc(flo,pet,iband,FLUSH); iband++; + ivoid1 = GetNextSrc(flo,pet,iband,FLUSH); iband++; + ivoid2 = GetNextSrc(flo,pet,iband,FLUSH); iband -= 2; + ovoid = GetNextDst(flo,pet,oband,FLUSH); + } + FreeData(flo,pet,iband,iband->current); iband++; + FreeData(flo,pet,iband,iband->current); iband++; + FreeData(flo,pet,iband,iband->current); + } + return(TRUE); +} /* end DoRGB3CtoIAll */ + + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetCtoIAll(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloConvertToIndex *raw = (xieFloConvertToIndex *)ped->elemRaw; + pCtoIDefPtr dix = (pCtoIDefPtr) ped->elemPvt; + ctiAllPtr ddx = (ctiAllPtr) ped->peTex->private; + colorListPtr lst = dix->list; + CARD32 b, i, j; + /* + * if we've got pixels, they might need to be transfered into the ColorList + */ + if((lst->cellPtr = ddx->pixLst) && (lst->cellCnt = ddx->pixCnt)) { + + if(dix->class <= PseudoColor) { + for(i = j = 0; i < ddx->pixCnt; ++j) + if(lst->cellPtr[j]) + lst->cellPtr[i++] = (Pixel)j; + + } else if(dix->graySrc && ddx->alloc == AllocColor) { + Pixel p, *ppix = (Pixel*) ddx->tmpLst[0]; + + for(i = 0; i < ddx->pixCnt; ++ppix) + if((long int)(p = *ppix) >= 0) + lst->cellPtr[i++] = p; + + } /* else pixels are already in place */ + } + if(raw->notify && !ferrCode(flo) && !flo->flags.aborted && + (ddx->cmapFull || ddx->allocMatch || ddx->shareMatch)) + SendColorAllocEvent(flo, ped, lst->mapID, raw->colorAlloc, + ddx->pixCnt - ddx->allocMatch + (ddx->cmapFull + ? 0 : ddx->shareMatch + ddx->allocMatch << 16)); + + for(b = 0; b < xieValMaxBands; ++b) { + if(ddx->tmpLst[b]) ddx->tmpLst[b] = (pointer ) XieFree(ddx->tmpLst[b]); + if(ddx->auxbuf[b]) ddx->auxbuf[b] = (pointer ) XieFree(ddx->auxbuf[b]); + } + ddx->pixLst = NULL; + ddx->pixCnt = 0; + ResetReceptors(ped); + ResetEmitter(ped); + + return(TRUE); +} /* end ResetCtoIAll */ + + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyCtoI(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc)NULL; + ped->ddVec.initialize = (xieIntProc)NULL; + ped->ddVec.activate = (xieIntProc)NULL; + ped->ddVec.reset = (xieIntProc)NULL; + ped->ddVec.destroy = (xieIntProc)NULL; + + return(TRUE); +} /* end DestroyCtoI */ + + +/*------------------------------------------------------------------------ +------------- allocate DirectColors based on usage map ------------------- +------------------------------------------------------------------------*/ +static int allocDirect(flo,ped,pet,ddx) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; + ctiAllPtr ddx; +{ + xieFloConvertToIndex *raw = (xieFloConvertToIndex *)ped->elemRaw; + pCtoIDefPtr dix = (pCtoIDefPtr) ped->elemPvt; + formatPtr fmt = &ped->inFloLst[SRCtag].format[0]; + unsigned short value[xieValMaxBands]; + int b, next[xieValMaxBands]; + Bool final, done[xieValMaxBands]; + Pixel *pix, *used[xieValMaxBands]; + + if(Resumed(flo,pet) && + (flo->runClient->clientGone || + ddx->cmap != (ColormapPtr)LookupIDByType(raw->colormap,RT_COLORMAP))) + ColormapError(flo,ped,raw->colormap, return(FALSE)); + + /* find the first color needed in each usage map + */ + for(b = 0; b < xieValMaxBands; ++b) { + done[b] = FALSE; + next[b] = 0; + used[b] = (Pixel*)ddx->tmpLst[b]; + while(!(used[b][next[b]])) ++next[b]; + } + do { + /* plant the current round of RGB values + */ + for(b = 0; b < xieValMaxBands; ++b) + if(!done[b]) + value[b] = next[b] * ddx->coef[b]; + + /* alloc a triplet of color cells + */ + pix = &ddx->pixLst[ddx->pixCnt]; + + if( ddx->cmapFull || + (ddx->cmapFull = (*ddx->alloc)(ddx->cmap,&value[0],&value[1],&value[2], + pix,ddx->clindex,ddx))) + *pix = ddx->fill; + else + ddx->cmapFull = ++ddx->pixCnt > dix->cells; + + /* save the result and find the next color needed in each usage map + */ + for(final = TRUE, b = 0; b < xieValMaxBands; ++b) + if(!done[b]) { + used[b][next[b]] = *pix & dix->mask[b]; + while(!(done[b] = ++next[b] >= fmt[b].levels >> ddx->trim[b]) && + !(used[b][next[b]])); + final &= done[b]; + } + } while(!final); + + return(TRUE); +} + +/*------------------------------------------------------------------------ +------------- allocate closest match for Default Technique --------------- +------------------------------------------------------------------------*/ +static int allocGray1(cmap, red, grn, blu, pix, client, ddx) + ColormapPtr cmap; + CARD16 *red, *grn, *blu; + Pixel *pix; + int client; + ctiAllPtr ddx; +{ + int status; + + if(status = AllocColor(cmap, red, grn, blu, pix, client)) { + xColorItem rgb; + + rgb.pixel = 0; + rgb.red = rgb.green = rgb.blue = *red; + FakeAllocColor(cmap, &rgb); + + if(!ddx->pixLst[(*pix = rgb.pixel)]++) { + xrgb match; + + QueryColors(cmap,1,&rgb.pixel,&match); + FakeFreeColor(cmap, rgb.pixel); + *red = match.red; + *grn = match.green; + *blu = match.blue; + if(status = AllocColor(cmap, red, grn, blu, pix, client)) + ddx->pixLst[rgb.pixel] = 0; + else + ddx->allocMatch++; + } else { + FakeFreeColor(cmap, rgb.pixel); + ++ddx->shareMatch; + --ddx->pixCnt; + status = 0; + } + } else { + ++ddx->pixLst[*pix]; + } + return(status); +} + +static int allocGray3(cmap, red, grn, blu, pix, client, ddx) + ColormapPtr cmap; + CARD16 *red, *grn, *blu; + Pixel *pix; + int client; + ctiAllPtr ddx; +{ + int status; + + if(ddx->pixLst[ddx->pixCnt]) return(BadAlloc); + + if(status = AllocColor(cmap, red, grn, blu, pix, client)) { + xColorItem rgb; + xrgb match; + + rgb.pixel = 0; + rgb.red = rgb.green = rgb.blue = *red; + FakeAllocColor(cmap, &rgb); + + QueryColors(cmap,1,&rgb.pixel,&match); + FakeFreeColor(cmap, rgb.pixel); + *pix = rgb.pixel; + *red = match.red; + *grn = match.green; + *blu = match.blue; + if(!(status = AllocColor(cmap, red, grn, blu, pix, client))) + ddx->allocMatch++; + } + ddx->pixLst[ddx->pixCnt] = *pix; + return(status); +} + +static int allocRGB1(cmap, red, grn, blu, pix, client, ddx) + ColormapPtr cmap; + CARD16 *red, *grn, *blu; + Pixel *pix; + int client; + ctiAllPtr ddx; +{ + int status; + + if(status = AllocColor(cmap, red, grn, blu, pix, client)) { + xColorItem rgb; + + rgb.pixel = 0; + rgb.red = *red; + rgb.green = *grn; + rgb.blue = *blu; + FakeAllocColor(cmap, &rgb); + + if(!ddx->pixLst[(*pix = rgb.pixel)]++) { + xrgb match; + + QueryColors(cmap,1,&rgb.pixel,&match); + FakeFreeColor(cmap, rgb.pixel); + *red = match.red; + *grn = match.green; + *blu = match.blue; + if(status = AllocColor(cmap, red, grn, blu, pix, client)) + ddx->pixLst[rgb.pixel] = 0; + else + ddx->allocMatch++; + } else { + if(!ddx->hashing || + *ddx->tmpLen > ddx->shareMatch * sizeof(ctiHashRec) << 1) { + ++ddx->shareMatch; + --ddx->pixCnt; + status = 0; + } + FakeFreeColor(cmap, rgb.pixel); + } + } else { + ++ddx->pixLst[*pix]; + } + return(status); +} + +static int allocRGB3(cmap, red, grn, blu, pix, client, ddx) + ColormapPtr cmap; + CARD16 *red, *grn, *blu; + Pixel *pix; + int client; + ctiAllPtr ddx; +{ + int status; + + if(status = AllocColor(cmap, red, grn, blu, pix, client)) { + xColorItem rgb; + xrgb match; + + rgb.pixel = 0; + rgb.red = *red; + rgb.green = *grn; + rgb.blue = *blu; + FakeAllocColor(cmap, &rgb); + + QueryColors(cmap,1,&rgb.pixel,&match); + FakeFreeColor(cmap, rgb.pixel); + *pix = rgb.pixel; + *red = match.red; + *grn = match.green; + *blu = match.blue; + if(!(status = AllocColor(cmap, red, grn, blu, pix, client))) + ddx->allocMatch++; + } + return(status); +} + +/*------------------------------------------------------------------------ +------------- convert bits to bytes or pairs, or bytes to pairs ---------- +------------------------------------------------------------------------*/ +static pointer cvt(src, ddx, band) + pointer src; + ctiAllPtr ddx; + CARD8 band; +{ + if(ddx->iclass[band] == BIT_PIXEL) { + if(ddx->cclass == BYTE_PIXEL) { + bitexpand(src,ddx->auxbuf[band],ddx->width,(BytePixel)0,(BytePixel)1); + + } else /* BIT_PIXEL --> PAIR_PIXEL */ { + LogInt *i = (LogInt *) src, ival, M; + PairPixel *o = (PairPixel *) ddx->auxbuf[band]; + int bw = ddx->width, nw = bw >> LOGSHIFT; + + while(nw--) + for(ival = *i++, M = LOGLEFT; M; LOGRIGHT(M)) + *o++ = (ival & M) ? (PairPixel) 1 : (PairPixel) 0; + if(bw &= LOGMASK) + for(ival = *i, M = LOGLEFT; bw--; LOGRIGHT(M)) + *o++ = (ival & M) ? (PairPixel) 1 : (PairPixel) 0; + } + } else /* BYTE_PIXEL --> PAIR_PIXEL */ { + CARD32 i, width = ddx->width; + BytePixel *ip = (BytePixel*)src; + PairPixel *op = (PairPixel*)ddx->auxbuf[band]; + + for(i = 0; i < width; *op++ = *ip++, ++i); + } + return(ddx->auxbuf[band]); +} + +/*------------------------------------------------------------------------ +-- action routines: single band image, single or triple dynamic colormap - +------------------------------------------------------------------------*/ +#define DO_GRAY_CtoI_ALL(fn_do,itype,otype) \ +static void fn_do(ddx, DST, SRC) \ + ctiAllPtr ddx; pointer DST,SRC; \ +{ \ + itype *src = (itype *)SRC; \ + otype *dst = (otype *)DST; \ + Pixel px, *pp, *lst = (Pixel *)ddx->tmpLst[0]; \ + CARD32 w, val, mask = ddx->mask[0], trim = ddx->trim[0]; \ + CARD16 r, g, b; \ + for(w = ddx->width; w--; *dst++ = px) { \ + if((long int)(px = *(pp = &lst[(val = *src++ >> trim & mask)])) < 0) { \ + if(!ddx->cmapFull) { \ + r = g = b = (unsigned short)((float)val * ddx->coef[0]); \ + if(!(ddx->cmapFull = (*ddx->alloc)(ddx->cmap,&r,&g,&b,pp, \ + ddx->clindex,ddx))) { \ + ++ddx->pixCnt; \ + px = *pp; \ + continue; \ + } \ + } \ + px = ddx->fill; \ + } \ + } \ +} +DO_GRAY_CtoI_ALL(CtoIall_1_dLBB, BytePixel, BytePixel) +DO_GRAY_CtoI_ALL(CtoIall_1_dLBP, BytePixel, PairPixel) +DO_GRAY_CtoI_ALL(CtoIall_1_dLBQ, BytePixel, QuadPixel) +DO_GRAY_CtoI_ALL(CtoIall_1_dLPB, PairPixel, BytePixel) +DO_GRAY_CtoI_ALL(CtoIall_1_dLPP, PairPixel, PairPixel) +DO_GRAY_CtoI_ALL(CtoIall_1_dLPQ, PairPixel, QuadPixel) + + +/*------------------------------------------------------------------------ +--- triple band, single dynamic colormap, sum of depths <= HASH_POINT ---- +------------------------------------------------------------------------*/ +#define DO_RGB31L_CtoI_ALL(fn_do,itype,otype) \ +static void fn_do(ddx, DST, SRCR, SRCG, SRCB) \ + ctiAllPtr ddx; pointer DST,SRCR,SRCG,SRCB; \ +{ \ + itype *srcR = (itype*)SRCR, *srcG = (itype*)SRCG, *srcB = (itype*)SRCB; \ + otype *dst = (otype*)DST; \ + CARD32 Rmask = ddx->mask[0], Rtrim = ddx->trim[0]; \ + CARD32 Gmask = ddx->mask[1], Gtrim = ddx->trim[1]; \ + CARD32 Bmask = ddx->mask[2], Btrim = ddx->trim[2]; \ + CARD32 Gshft = ddx->shft[1], Bshft = ddx->shft[2]; \ + Pixel px, *pp, *lst = (Pixel*)ddx->tmpLst[0]; \ + CARD32 rv, gv, bv, w; \ + CARD16 r, g, b; \ + for(w = ddx->width; w--; *dst++ = px) { \ + rv = *srcR++ >> Rtrim & Rmask; \ + gv = *srcG++ >> Gtrim & Gmask; \ + bv = *srcB++ >> Btrim & Bmask; \ + if((long int)(px = *(pp = &lst[rv | gv<cmapFull) { \ + r = (unsigned short)((float)rv * ddx->coef[0]); \ + g = (unsigned short)((float)gv * ddx->coef[1]); \ + b = (unsigned short)((float)bv * ddx->coef[2]); \ + if(!(ddx->cmapFull = (*ddx->alloc)(ddx->cmap,&r,&g,&b,pp, \ + ddx->clindex,ddx))) { \ + ++ddx->pixCnt; \ + px = *pp; \ + continue; \ + } \ + } \ + px = ddx->fill; \ + } \ + } \ +} +DO_RGB31L_CtoI_ALL(CtoIall_31dLBB,BytePixel,BytePixel) +DO_RGB31L_CtoI_ALL(CtoIall_31dLBP,BytePixel,PairPixel) +DO_RGB31L_CtoI_ALL(CtoIall_31dLPB,PairPixel,BytePixel) +DO_RGB31L_CtoI_ALL(CtoIall_31dLPP,PairPixel,PairPixel) + + +/*------------------------------------------------------------------------ +--- triple band, single dynamic colormap, sum of depths > HASH_POINT ----- +------------------------------------------------------------------------*/ +#define DO_RGB31H_CtoI_ALL(fn_do,itype,otype) \ +static void fn_do(ddx, DST, SRCR, SRCG, SRCB) \ + ctiAllPtr ddx; pointer DST,SRCR,SRCG,SRCB; \ +{ \ + itype *srcR = (itype*)SRCR, *srcG = (itype*)SRCG, *srcB = (itype*)SRCB; \ + otype *dst = (otype*)DST; \ + CARD32 Rmask = ddx->mask[0], Rtrim = ddx->trim[0]; \ + CARD32 Gmask = ddx->mask[1], Gtrim = ddx->trim[1]; \ + CARD32 Bmask = ddx->mask[2], Btrim = ddx->trim[2]; \ + CARD32 width = ddx->width; \ + ctiHashPtr hash, list = (ctiHashPtr)ddx->tmpLst[0]; \ + CARD16 r, g, b; \ + union{ CARD32 rgbGlob; CARD8 rgbVals[4]; } rgb; \ + rgb.rgbVals[3] = 1; \ + while(width--) { \ + hash = &list[HR * (rgb.rgbVals[0] = *srcR++ >> Rtrim & Rmask) + \ + HG * (rgb.rgbVals[1] = *srcG++ >> Gtrim & Gmask) + \ + HB * (rgb.rgbVals[2] = *srcB++ >> Btrim & Bmask)]; \ + while(hash->rgbVal && hash->rgbVal != rgb.rgbGlob) ++hash; \ + if(hash->rgbVal) { *dst++ = hash->pixdex; continue; } \ + if(!ddx->cmapFull) { \ + r = (unsigned short)((float)rgb.rgbVals[0] * ddx->coef[0]); \ + g = (unsigned short)((float)rgb.rgbVals[1] * ddx->coef[1]); \ + b = (unsigned short)((float)rgb.rgbVals[2] * ddx->coef[2]); \ + if(!(ddx->cmapFull = (*ddx->alloc)(ddx->cmap,&r,&g,&b,&hash->pixdex, \ + ddx->clindex,ddx))) { \ + ++ddx->pixCnt; \ + *dst++ = hash->pixdex; \ + hash->rgbVal = rgb.rgbGlob; \ + continue; \ + } \ + } \ + *dst++ = ddx->fill; \ + } \ +} +DO_RGB31H_CtoI_ALL(CtoIall_31dHBB,BytePixel,BytePixel) +DO_RGB31H_CtoI_ALL(CtoIall_31dHBP,BytePixel,PairPixel) +DO_RGB31H_CtoI_ALL(CtoIall_31dHPB,PairPixel,BytePixel) +DO_RGB31H_CtoI_ALL(CtoIall_31dHPP,PairPixel,PairPixel) + + +/*------------------------------------------------------------------------ +------------- action routines for triple band, triple colormap ----------- +------------- U? routines generate usage maps of src pixels ----------- +------------- L? routines re-map src pixels thru lookup tables ----------- +------------------------------------------------------------------------*/ +#define DO_RGB33U_CtoI_ALL(fn_do,itype) \ +static void fn_do(ddx, SRC, band) \ + ctiAllPtr ddx; pointer SRC; CARD8 band; \ +{ \ + itype *src = (itype *)SRC; \ + CARD32 mask = ddx->mask[band]; \ + CARD32 trim = ddx->trim[band]; \ + Pixel *used = (Pixel*)ddx->tmpLst[band]; \ + CARD32 w = ddx->width; \ + while(w--) used[*src++ >> trim & mask] = TRUE; \ +} +DO_RGB33U_CtoI_ALL(CtoIall_33dUB_, BytePixel) +DO_RGB33U_CtoI_ALL(CtoIall_33dUP_, PairPixel) + + +#define DO_RGB33L_CtoI_ALL(fn_do,itype,otype) \ +static void fn_do(ddx, DST, SRCR, SRCG, SRCB) \ + ctiAllPtr ddx; pointer DST,SRCR,SRCG,SRCB; \ +{ \ + itype *srcR = (itype *)SRCR; \ + itype *srcG = (itype *)SRCG; \ + itype *srcB = (itype *)SRCB; \ + otype *dst = (otype *)DST; \ + CARD32 Rmask = ddx->mask[0], Rtrim = ddx->trim[0]; \ + CARD32 Gmask = ddx->mask[1], Gtrim = ddx->trim[1]; \ + CARD32 Bmask = ddx->mask[2], Btrim = ddx->trim[2]; \ + Pixel *Rlut = (Pixel*)ddx->tmpLst[0]; \ + Pixel *Glut = (Pixel*)ddx->tmpLst[1]; \ + Pixel *Blut = (Pixel*)ddx->tmpLst[2]; \ + CARD32 w = ddx->width; \ + while(w--) *dst++ = (Rlut[*srcR++ >> Rtrim & Rmask] | \ + Glut[*srcG++ >> Gtrim & Gmask] | \ + Blut[*srcB++ >> Btrim & Bmask]); \ +} +DO_RGB33L_CtoI_ALL(CtoIall_33dLBB, BytePixel, BytePixel) +DO_RGB33L_CtoI_ALL(CtoIall_33dLBP, BytePixel, PairPixel) +DO_RGB33L_CtoI_ALL(CtoIall_33dLBQ, BytePixel, QuadPixel) +DO_RGB33L_CtoI_ALL(CtoIall_33dLPB, PairPixel, BytePixel) +DO_RGB33L_CtoI_ALL(CtoIall_33dLPP, PairPixel, PairPixel) +DO_RGB33L_CtoI_ALL(CtoIall_33dLPQ, PairPixel, QuadPixel) + +/* end module mpctoi.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/mpdither.c b/xie/xc/programs/Xserver/XIE/mixie/process/mpdither.c new file mode 100644 index 0000000..e2d98a0 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/mpdither.c @@ -0,0 +1,918 @@ +/* $XConsortium: mpdither.c /main/6 1995/12/02 16:53:58 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module mpdither.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mpdither.c -- DDXIE dither element + + Larry Hare -- AGE Logic, Inc. May, 1993 + +*****************************************************************************/ + + +#define _XIEC_MPDITHER +#define _XIEC_PDITHER + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeDither(); + +/* + * routines used internal to this module + */ +static int CreateDitherErrorDiffusion(), CreateDitherOrdered(); +static int InitializeDitherErrorDiffusion(), InitializeDitherOrdered(); +static int ActivateDitherErrorDiffusion(), ActivateDitherOrdered(); +static int ResetDitherErrorDiffusion(), ResetDitherOrdered(); +static int DestroyDither(); + + +typedef float DitherFloat; /* see xiemd.h */ + + /* Diffusion Dither Locals */ +typedef struct _mpditherEDdef { + void (*action) (); + DitherFloat *previous; + DitherFloat *current; + DitherFloat range; + DitherFloat range1over; + DitherFloat round; + INT32 width; +#if defined(SF_DITHER) + CARD32 shift; + INT32 irange; + INT32 iround; +#endif +} mpDitherEDDefRec, *mpDitherEDDefPtr; + +static void EdDitherQb(), EdDitherPb(), EdDitherBb(), EdDitherbb(); +static void EdDitherQB(), EdDitherPB(), EdDitherBB(); +static void EdDitherQP(), EdDitherPP(); +static void EdDitherQQ(); + + /* Ordered Dither Locals */ +typedef struct _mpditherOrddef { + void (*action) (); + CARD32 *matrix; + CARD32 ncol; + CARD32 nrow; + CARD32 shift; + CARD32 mult; + CARD32 width; +} mpDitherOrdDefRec, *mpDitherOrdDefPtr; + +static Bool SetupOrderMatrix(); + +static void OrdDitherQb(), OrdDitherPb(), OrdDitherBb(); +static void OrdDitherQB(), OrdDitherPB(), OrdDitherBB(); +static void OrdDitherQP(), OrdDitherPP(); +static void OrdDitherQQ(); + + + +/* + * DDXIE Dither entry points + */ +/* static Testing Hack. See mpcnst.c */ +ddElemVecRec DitherErrorDiffusion = { + CreateDitherErrorDiffusion, + InitializeDitherErrorDiffusion, + ActivateDitherErrorDiffusion, + (xieIntProc)NULL, + ResetDitherErrorDiffusion, + DestroyDither +}; + +static ddElemVecRec DitherOrdered = { + CreateDitherOrdered, + InitializeDitherOrdered, + ActivateDitherOrdered, + (xieIntProc)NULL, + ResetDitherOrdered, + DestroyDither +}; + +/*------------------------------------------------------------------------ +------------------------ fill in the vector --------------------------- +------------------------------------------------------------------------*/ +int miAnalyzeDither(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + + switch(ped->techVec->number) { + case xieValDitherErrorDiffusion: + ped->ddVec = DitherErrorDiffusion; + break; + case xieValDitherOrdered: + ped->ddVec = DitherOrdered; + break; + } + + return TRUE; +} + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateDitherErrorDiffusion(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + int auxsize = xieValMaxBands * sizeof(mpDitherEDDefRec); + + return MakePETex(flo,ped,auxsize,NO_SYNC,NO_SYNC); +} + +static int CreateDitherOrdered(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + int auxsize = xieValMaxBands * sizeof(mpDitherOrdDefRec); + + return MakePETex(flo,ped,auxsize,NO_SYNC,NO_SYNC); +} + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeDitherErrorDiffusion(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + mpDitherEDDefPtr pvt = (mpDitherEDDefPtr) (pet->private); + bandMsk bmask = ((xieFloDither *) (ped->elemRaw))->bandMask; + bandPtr oband; + bandPtr iband; + int band, nbands; + void (*action) () = (void (*)()) 0; + + oband = &(pet->emitter[0]); + iband = &(pet->receptor[SRCtag].band[0]); + nbands = pet->receptor[SRCtag].inFlo->bands; + for (band = 0; band < nbands; band++, pvt++, iband++, oband++) { + + if ((bmask & (1<format->class) { + case QUAD_PIXEL: + switch (iband->format->class) { + case QUAD_PIXEL: action = EdDitherQQ; break; + default: break; + } + break; + case PAIR_PIXEL: + switch (iband->format->class) { + case QUAD_PIXEL: action = EdDitherQP; break; + case PAIR_PIXEL: action = EdDitherPP; break; + default: break; + } + break; + case BYTE_PIXEL: + switch (iband->format->class) { + case QUAD_PIXEL: action = EdDitherQB; break; + case PAIR_PIXEL: action = EdDitherPB; break; + case BYTE_PIXEL: action = EdDitherBB; break; + default: break; + } + break; + case BIT_PIXEL: + switch (iband->format->class) { + case QUAD_PIXEL: action = EdDitherQb; break; + case PAIR_PIXEL: action = EdDitherPb; break; + case BYTE_PIXEL: action = EdDitherBb; break; + case BIT_PIXEL: action = EdDitherbb; break; + default: break; + } + break; + default: + break; + } + if (!action) + ImplementationError(flo, ped, return(FALSE)); + + pvt->action = action; + pvt->width = iband->format->width; + pvt->range = (iband->format->levels-1.0)/(oband->format->levels-1.0); + pvt->round = pvt->range/((DitherFloat)2.0); + pvt->range1over = ((DitherFloat) 1.0) / pvt->range; + + if(pvt->range == 1.0) { + bmask &= ~(1<shift = (iband->format->class == PAIR_PIXEL ? 11 : 19); + pvt->irange = pvt->range * (1<shift); + pvt->iround = pvt->round * (1<shift); +#endif + + if (ped->techVec->number == xieValDitherErrorDiffusion) { + /* Use XieCalloc to force DitherFloat's to 0.0 */ + int auxsize = (pvt->width + 2) * sizeof(DitherFloat); + if((!(pvt->previous = (DitherFloat *) XieCalloc(auxsize))) || + (!(pvt->current = (DitherFloat *) XieCalloc(auxsize)))) + AllocError(flo, ped, return(FALSE)); + } + } + return + InitReceptor(flo,ped,&pet->receptor[SRCtag],NO_DATAMAP,1,bmask,~bmask) + && InitEmitter(flo,ped,NO_DATAMAP,NO_INPLACE); + +} + +static int InitializeDitherOrdered(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + mpDitherOrdDefPtr pvt = (mpDitherOrdDefPtr) pet->private; + xieFloDither *elem = (xieFloDither *) (ped->elemRaw); + CARD8 thresh = ((xieTecDitherOrdered *) (&elem[1]))->thresholdOrder; + bandMsk bmask = elem->bandMask; + bandPtr oband; + bandPtr iband; + int band, nbands; + void (*action) () = (void(*)()) 0; + + oband = &(pet->emitter[0]); + iband = &(pet->receptor[SRCtag].band[0]); + nbands = pet->receptor[SRCtag].inFlo->bands; + for (band = 0; band < nbands; band++, pvt++, iband++, oband++) { + + if ((bmask & (1<format->class) { + case QUAD_PIXEL: + switch (iband->format->class) { + case QUAD_PIXEL: action = OrdDitherQQ; break; + default: break; + } + break; + case PAIR_PIXEL: + switch (iband->format->class) { + case QUAD_PIXEL: action = OrdDitherQP; break; + case PAIR_PIXEL: action = OrdDitherPP; break; + default: break; + } + break; + case BYTE_PIXEL: + switch (iband->format->class) { + case QUAD_PIXEL: action = OrdDitherQB; break; + case PAIR_PIXEL: action = OrdDitherPB; break; + case BYTE_PIXEL: action = OrdDitherBB; break; + default: break; + } + break; + case BIT_PIXEL: + switch (iband->format->class) { + case QUAD_PIXEL: action = OrdDitherQb; break; + case PAIR_PIXEL: action = OrdDitherPb; break; + case BYTE_PIXEL: action = OrdDitherBb; break; + default: break; + } + break; + default: + break; + } + if (!action) + ImplementationError(flo, ped, return(FALSE)); + + pvt->action = action; + pvt->width = iband->format->width; + + switch (iband->format->class) { + case QUAD_PIXEL: pvt->shift=6; break; + case PAIR_PIXEL: pvt->shift=14; break; + case BYTE_PIXEL: pvt->shift=22; break; + } + pvt->mult = ((1<shift) * (oband->format->levels-1.0)) / + (iband->format->levels-1.0); + + if(pvt->mult == (1<shift)) { + bmask &= ~(1<matrix) + AllocError(flo, ped, return(FALSE)); + } + return + InitReceptor(flo,ped,&pet->receptor[SRCtag],NO_DATAMAP,1,bmask,~bmask) + && InitEmitter(flo,ped,NO_DATAMAP,NO_INPLACE); + +} + + +static CARD8 ddmtrx1[] = { 1, 0, 1, 0, + 0, 1, 0, 1, + 1, 0, 1, 0, + 0, 1, 0, 1 + }; + +static CARD8 ddmtrx2[] = { 1, 2, 1, 2, + 3, 0, 3, 0, + 1, 2, 1, 2, + 3, 0, 3, 0 + }; + +static CARD8 ddmtrx3[] = { 1, 6, 0, 7, + 5, 3, 4, 2, + 0, 7, 1, 6, + 4, 2, 5, 3 + }; + +static CARD8 ddmtrx4[] = { 1, 15, 2, 12, + 9, 5, 10, 6, + 3, 13, 0, 14, + 11, 7, 8, 4 + }; + +static CARD8 ddmtrx5[] = { 1, 28, 6, 26, 0, 29, 7, 27, + 17, 9, 22, 14, 16, 8, 23, 15, + 5, 25, 3, 30, 4, 24, 2, 31, + 21, 13, 19, 11, 20, 12, 18, 10, + }; + +static CARD8 ddmtrx6[] = { 1, 59, 15, 55, 2, 56, 12, 52, + 33, 17, 47, 31, 34, 18, 44, 28, + 9, 49, 5, 63, 10, 50, 6, 60, + 41, 25, 37, 21, 42, 26, 38, 22, + 3, 57, 13, 53, 0, 58, 14, 54, + 35, 19, 45, 29, 32, 16, 46, 30, + 11, 51, 7, 61, 8, 48, 4, 62, + 43, 27, 39, 23, 40, 24, 36, 20 + }; + +static CARD8 ddmtrx7[] = { + 1, 116, 28, 108, 6, 114, 26, 106, 0, 117, 29, 109, 7, 115, 27, 107, + 65, 33, 92, 60, 70, 38, 90, 58, 64, 32, 93, 61, 71, 39, 91, 59, + 17, 97, 9, 124, 22, 102, 14, 122, 16, 96, 8, 125, 23, 103, 15, 123, + 81, 49, 73, 41, 86, 54, 78, 46, 80, 48, 72, 40, 87, 55, 79, 47, + 5, 113, 25, 105, 3, 118, 30, 110, 4, 112, 24, 104, 2, 119, 31, 111, + 69, 37, 89, 57, 67, 35, 94, 62, 68, 36, 88, 56, 66, 34, 95, 63, + 21, 101, 13, 121, 19, 99, 11, 126, 20, 100, 12, 120, 18, 98, 10, 127, + 85, 53, 77, 45, 83, 51, 75, 43, 84, 52, 76, 44, 82, 50, 74, 42, +}; + +static CARD8 ddmtrx8[] = { + 1, 235, 49, 219, 15, 231, 55, 215, 2, 232, 56, 216, 12, 228, 52, 212, +129, 65, 187, 123, 143, 79, 183, 119, 130, 66, 184, 120, 140, 76, 180, 116, + 33, 193, 17, 251, 47, 207, 31, 247, 34, 194, 18, 248, 44, 204, 28, 244, +161, 97, 145, 81, 175, 111, 159, 95, 162, 98, 146, 82, 172, 108, 156, 92, + 9, 225, 49, 209, 5, 239, 63, 223, 10, 226, 50, 210, 6, 236, 60, 220, +137, 73, 177, 113, 133, 69, 191, 127, 138, 74, 178, 114, 134, 70, 188, 124, + 41, 201, 25, 241, 37, 197, 21, 255, 42, 202, 26, 242, 38, 198, 22, 252, +169, 105, 153, 89, 165, 101, 149, 85, 170, 106, 154, 90, 166, 102, 150, 86, + 3, 233, 57, 217, 13, 229, 53, 213, 0, 234, 58, 218, 14, 230, 54, 214, +131, 67, 185, 121, 141, 77, 181, 117, 128, 64, 186, 122, 142, 78, 182, 118, + 35, 195, 19, 249, 45, 205, 29, 245, 32, 192, 16, 250, 46, 206, 30, 246, +163, 99, 147, 83, 173, 109, 157, 93, 160, 96, 144, 80, 174, 110, 158, 94, + 11, 227, 51, 211, 7, 237, 61, 221, 8, 224, 48, 208, 4, 238, 62, 222, +139, 75, 179, 115, 135, 71, 189, 127, 136, 72, 176, 112, 132, 68, 190, 126, + 43, 203, 27, 243, 39, 199, 23, 253, 40, 200, 24, 240, 36, 196, 20, 254, +171, 107, 155, 91, 167, 103, 151, 87, 168, 104, 152, 88, 164, 100, 148, 84 +}; + + + +static Bool +SetupOrderMatrix(pvt, threshold) + mpDitherOrdDefPtr pvt; + CARD32 threshold; +{ + CARD32 shift = 1 << pvt->shift; + CARD32 *mtrx; + CARD8 *srcmtrx; + CARD32 nr, nc, nt; + INT32 m; + + switch(threshold) { + case 1: srcmtrx = ddmtrx1; nr = 4; nc = 4; nt = 2; break; + case 2: srcmtrx = ddmtrx2; nr = 4; nc = 4; nt = 4; break; + case 3: srcmtrx = ddmtrx3; nr = 4; nc = 4; nt = 8; break; + case 4: srcmtrx = ddmtrx4; nr = 4; nc = 4; nt = 16; break; + case 5: srcmtrx = ddmtrx5; nr = 4; nc = 8; nt = 32; break; + case 6: srcmtrx = ddmtrx6; nr = 8; nc = 8; nt = 64; break; + case 7: srcmtrx = ddmtrx7; nr = 8; nc =16; nt = 128; break; + default: + case 8: srcmtrx = ddmtrx8; nr =16; nc =16; nt = 256; break; + } + + if (!(mtrx = (CARD32 *)XieMalloc(nr * nc * sizeof(CARD32)))) + return FALSE; + + for (m = nr * nc -1; m >= 0 ; m--) + mtrx[m] = ((CARD32)srcmtrx[m] * shift + (shift>>1)) / nt; + + /* + ** This would be a good place to spin the matrix to avoid + ** aligning the dither pattern on triple band images. + */ + + pvt->ncol = nc; + pvt->nrow = nr; + pvt->matrix = mtrx; + return TRUE; +} + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ + + +static int ActivateDitherErrorDiffusion(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpDitherEDDefPtr pvt = (mpDitherEDDefPtr) pet->private; + bandPtr oband = &(pet->emitter[0]); + bandPtr iband = &(pet->receptor[SRCtag].band[0]); + int band, nbands = pet->receptor[SRCtag].inFlo->bands; + + for(band = 0; band < nbands; band++, pvt++, iband++, oband++) { + register pointer inp, outp; + + if (!(inp = GetCurrentSrc(flo,pet,iband)) || + !(outp = GetCurrentDst(flo,pet,oband))) continue; + + do { + (*(pvt->action)) (inp, outp, pvt); + + { /* Swap error buffers */ + DitherFloat *curr = pvt->current; + curr = pvt->current; + pvt->current = pvt->previous; + pvt->previous = curr; + } + inp = GetNextSrc(flo,pet,iband,FLUSH); + outp = GetNextDst(flo,pet,oband,FLUSH); + + } while (inp && outp) ; + + FreeData(flo, pet, iband, iband->current); + } + return TRUE; +} + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ + +static int ActivateDitherOrdered(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpDitherOrdDefPtr pvt = (mpDitherOrdDefPtr) pet->private; + bandPtr oband = &(pet->emitter[0]); + bandPtr iband = &(pet->receptor[SRCtag].band[0]); + int band, nbands = pet->receptor[SRCtag].inFlo->bands; + + for(band = 0; band < nbands; band++, pvt++, iband++, oband++) { + register pointer inp, outp; + + if (!(inp = GetCurrentSrc(flo,pet,iband)) || + !(outp = GetCurrentDst(flo,pet,oband))) continue; + + do { + (*(pvt->action)) (inp, outp, pvt, oband->current); + + inp = GetNextSrc(flo,pet,iband,FLUSH); + outp = GetNextDst(flo,pet,oband,FLUSH); + + } while (inp && outp) ; + + FreeData(flo, pet, iband, iband->current); + } + return TRUE; +} + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetDitherErrorDiffusion(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + mpDitherEDDefPtr pvt = (mpDitherEDDefPtr) ped->peTex->private; + int band; + + /* free any dynamic private data */ + for (band = 0 ; band < xieValMaxBands ; band++, pvt++) { + pvt->width = 0; + pvt->action = 0; + if (pvt->previous) + pvt->previous = (DitherFloat *) XieFree(pvt->previous); + if (pvt->current) + pvt->current = (DitherFloat *) XieFree(pvt->current); + } + + ResetReceptors(ped); + ResetEmitter(ped); + return TRUE; +} + +static int ResetDitherOrdered(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + mpDitherOrdDefPtr pvt = (mpDitherOrdDefPtr) ped->peTex->private; + int band; + + /* free any dynamic private data */ + for (band = 0 ; band < xieValMaxBands ; band++, pvt++) { + pvt->width = 0; + pvt->action = 0; + if (pvt->matrix) + pvt->matrix = (CARD32 *) XieFree(pvt->matrix); + } + + ResetReceptors(ped); + ResetEmitter(ped); + return TRUE; +} + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyDither(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc)NULL; + ped->ddVec.initialize = (xieIntProc)NULL; + ped->ddVec.activate = (xieIntProc)NULL; + ped->ddVec.reset = (xieIntProc)NULL; + ped->ddVec.destroy = (xieIntProc)NULL; + + return TRUE; +} + +/*------------------------------------------------------------------------ +------------------------------- Macro Mania ------------------------------ +------------------------------------------------------------------------*/ + +/* +** The only legal bit to bit dither is 2 levels to 1 level. +*/ + +static void EdDitherbb(inp,outp,pvt) + pointer inp; pointer outp; mpDitherEDDefPtr pvt; +{ + bzero((char *)outp, (pvt->width+7)>>3); +} + +/* +** Quads, Pairs, and Bytes can be dithered to bits. Since this code is +** so slow anyway, don't get too excited about optimizing the bit output. +*/ + +#define MakeEdBit(fn_name,itype,otype) \ +static void fn_name(INP,OUTP,pvt) \ + pointer INP; pointer OUTP; mpDitherEDDefPtr pvt; \ +{ \ + register itype *inp = (itype *) INP; \ + register LogInt *outp = (LogInt *) OUTP; \ + register unsigned int actual; \ + register DitherFloat range = pvt->range; \ + register DitherFloat round = pvt->round; \ + register DitherFloat *prev = pvt->previous; \ + register DitherFloat *curr = pvt->current; \ + register DitherFloat range1over = pvt->range1over; \ + register DitherFloat current = *curr, desire; \ + register int ix, bw = pvt->width; \ + bzero((char *)outp, (bw+7)>>3); \ + for (ix = 0; ix < bw; ix++) { \ + desire = inp[ix] + ((DitherFloat) .4375 * current) + \ + ((DitherFloat) .0625 * *(prev+0)) + \ + ((DitherFloat) .3125 * *(prev+1)) + \ + ((DitherFloat) .1875 * *(prev+2)) ; \ + prev++; \ + actual = (desire+round)*range1over; \ + if (actual) { \ + LOG_setbit(outp,ix); \ + *++curr = current = desire - actual*range; \ + } else \ + *++curr = current = desire; \ + } \ +} + +#if defined(SF_DITHER) +#define MakeEdBitI(fn_name,itype,otype) \ +static void fn_name(INP,OUTP,pvt) \ + pointer INP; pointer OUTP; mpDitherEDDefPtr pvt; \ +{ \ + register itype *inp = (itype *) INP; \ + register LogInt *outp = (LogInt *) OUTP; \ + register unsigned int actual; \ + register CARD32 shift = pvt->shift; \ + register INT32 range = pvt->irange; \ + register INT32 round = pvt->iround; \ + register INT32 *prev = (INT32 *) pvt->previous; \ + register INT32 *curr = (INT32 *) pvt->current; \ + register INT32 current = *curr, desire; \ + register int ix, bw = pvt->width; \ + bzero((char *)outp, (bw+7)>>3); \ + for (ix = 0; ix < bw; ix++) { \ + desire = (((CARD32) inp[ix]) << shift) + \ + ((( current * 7) + \ + (*(prev+0) ) + \ + (*(prev+1) * 5) + \ + (*(prev+2) * 3) ) >> 4) ; \ + prev++; \ + actual = (desire+round)/range; \ + if (actual) { \ + LOG_setbit(outp,ix); \ + *++curr = current = desire - actual*range; \ + } else \ + *++curr = current = desire; \ + } \ +} +#endif + +/* +** All the other multitudes of combinations. +*/ + +#define MakeEdPix(fn_name,itype,otype) \ +static void fn_name(INP,OUTP,pvt) \ + pointer INP; pointer OUTP; mpDitherEDDefPtr pvt; \ +{ \ + register itype *inp = (itype *) INP; \ + register otype *outp = (otype *) OUTP, actual; \ + register DitherFloat range = pvt->range; \ + register DitherFloat round = pvt->round; \ + register DitherFloat *prev = pvt->previous; \ + register DitherFloat *curr = pvt->current; \ + register DitherFloat current = *curr, desire; \ + register DitherFloat range1over = pvt->range1over; \ + register int ix, bw = pvt->width; \ + for (ix = 0; ix < bw; ix++) { \ + desire = inp[ix] + ((DitherFloat) .4375 * current) + \ + ((DitherFloat) .0625 * *(prev+0)) + \ + ((DitherFloat) .3125 * *(prev+1)) + \ + ((DitherFloat) .1875 * *(prev+2)) ; \ + prev++; \ + *outp++ = actual = (desire+round)*range1over; \ + *++curr = current = (desire - actual*range); \ + } \ +} + +#if defined(SF_DITHER) + /* NOTE: has <<, /, then * which means many cycles. + ** A better design would use a *, >>, *. The last * might + ** be a <<, and the first * on mips would pipeline with the + ** *(prev+N) calculations. This should double or triple the + ** speed for many of these architectures. + */ +#define MakeEdPixI(fn_name,itype,otype) \ +static void fn_name(INP,OUTP,pvt) \ + pointer INP; pointer OUTP; mpDitherEDDefPtr pvt; \ +{ \ + register itype *inp = (itype *) INP; \ + register otype *outp = (otype *) OUTP; \ + register CARD32 actual; \ + register CARD32 shift = pvt->shift; \ + /* ?? replace divide by range with multiply and >> ?? */ \ + register INT32 range = pvt->irange; \ + register INT32 round = pvt->iround; \ + register INT32 *prev = (INT32 *) pvt->previous; \ + register INT32 *curr = (INT32 *) pvt->current; \ + register INT32 current = *curr, desire; \ + register int ix, bw = pvt->width; \ + for (ix = 0; ix < bw; ix++) { \ + desire = (((CARD32)inp[ix]) << shift) + \ + (((current * 7) + \ + (*(prev+0) ) + \ + (*(prev+1) * 5) + \ + (*(prev+2) * 3) ) >> 4) ; \ + prev++; \ + *outp++ = actual = (desire+round)/range; \ + *++curr = current = desire - actual * range; \ + } \ +} +#endif + +#if defined(SF_DITHER) + +MakeEdBit (EdDitherQb,QuadPixel,BitPixel) +MakeEdBitI (EdDitherPb,PairPixel,BitPixel) +MakeEdBitI (EdDitherBb,BytePixel,BitPixel) +MakeEdPix (EdDitherQB,QuadPixel,BytePixel) +MakeEdPixI (EdDitherPB,PairPixel,BytePixel) +MakeEdPixI (EdDitherBB,BytePixel,BytePixel) +MakeEdPix (EdDitherQP,QuadPixel,PairPixel) +MakeEdPixI (EdDitherPP,PairPixel,PairPixel) +MakeEdPix (EdDitherQQ,QuadPixel,QuadPixel) + +#else +MakeEdBit (EdDitherQb,QuadPixel,BitPixel) +MakeEdBit (EdDitherPb,PairPixel,BitPixel) +MakeEdBit (EdDitherBb,BytePixel,BitPixel) + +MakeEdPix (EdDitherQB,QuadPixel,BytePixel) +MakeEdPix (EdDitherPB,PairPixel,BytePixel) +MakeEdPix (EdDitherBB,BytePixel,BytePixel) + +MakeEdPix (EdDitherQP,QuadPixel,PairPixel) +MakeEdPix (EdDitherPP,PairPixel,PairPixel) + +MakeEdPix (EdDitherQQ,QuadPixel,QuadPixel) + +#endif + +/*------------------------------------------------------------------------ +------------------------------- Macro Mania ------------------------------ +------------------------------------------------------------------------*/ + + +#define MakeOrdBit(fn_name,itype,otype) \ +static void fn_name(INP,OUTP,pvt,ycur) \ + pointer INP; pointer OUTP; mpDitherOrdDefPtr pvt; int ycur; \ +{ \ + register itype *inp = (itype *) INP; \ + register LogInt *outp = (LogInt *) OUTP; \ + register CARD32 mult = pvt->mult; \ + register CARD32 shift = pvt->shift; \ + register CARD32 ncol = pvt->ncol; \ + register CARD32 *mtrx; \ + register CARD32 jcol, nw; \ + register LogInt outval, M; \ + register int bw = pvt->width; \ + CARD32 nrow = pvt->nrow; \ + mtrx = pvt->matrix + ((ycur & (nrow-1)) * ncol); \ + jcol = ((ncol > nrow) && (ycur & nrow)) ? nrow : 0; \ + for (ncol--, nw = (bw >> LOGSHIFT); nw > 0; nw--) { \ + for (M=LOGLEFT, outval = 0; M ; LOGRIGHT(M)) { \ + register CARD32 value1, value2; \ + value1 = (*inp++ * mult + mtrx[jcol++]) >> shift; \ + value2 = (*inp++ * mult + mtrx[jcol++]) >> shift; \ + if (value1) outval |= M; \ + value1 = (*inp++ * mult + mtrx[jcol++]) >> shift; \ + LOGRIGHT(M); if (value2) outval |= M; \ + value2 = (*inp++ * mult + mtrx[jcol++]) >> shift; \ + LOGRIGHT(M); if (value1) outval |= M; \ + jcol &= ncol; \ + LOGRIGHT(M); if (value2) outval |= M; \ + } \ + *outp++ = outval; \ + } \ + if ((nw = (bw & LOGMASK))) { \ + for (M=LOGLEFT, outval = 0; nw ; nw--, LOGRIGHT(M)) { \ + if ((mtrx[jcol++] + *inp++ * mult) >> shift) \ + outval |= M; \ + jcol &= ncol; \ + } \ + *outp = outval; \ + } \ +} + +#define MakeOrdPix(fn_name,itype,otype) \ +static void fn_name(INP,OUTP,pvt,ycur) \ + pointer INP; pointer OUTP; mpDitherOrdDefPtr pvt; int ycur; \ +{ \ + register itype *inp = (itype *) INP; \ + register otype *outp = (otype *) OUTP; \ + register CARD32 mult = pvt->mult; \ + register CARD32 shift = pvt->shift; \ + register CARD32 ncol = pvt->ncol; \ + register CARD32 *mtrx; \ + register CARD32 jcol; \ + register int bw = pvt->width; \ + CARD32 nrow = pvt->nrow; \ + mtrx = pvt->matrix + ((ycur & (nrow-1)) * ncol); \ + jcol = ((ncol > nrow) && (ycur & nrow)) ? nrow : 0; \ + for (ncol--, bw-- ; bw > 0; bw -= 4) { \ + /* unroll four times is all we can do safely */ \ + register CARD32 value1, value2; \ + value1 = (*inp++ * mult + mtrx[jcol++]) >> shift; \ + value2 = (*inp++ * mult + mtrx[jcol++]) >> shift; \ + *outp++ = value1; \ + value1 = (*inp++ * mult + mtrx[jcol++]) >> shift; \ + *outp++ = value2; \ + value2 = (*inp++ * mult + mtrx[jcol++]) >> shift; \ + *outp++ = value1; \ + jcol &= ncol; \ + *outp++ = value2; \ + } \ + for ( ; bw >= 0; bw--) \ + *outp++ = (*inp++ * mult + mtrx[jcol++]) >> shift; \ +} + +MakeOrdBit (OrdDitherQb,QuadPixel,BitPixel) +MakeOrdBit (OrdDitherPb,PairPixel,BitPixel) +MakeOrdBit (OrdDitherBb,BytePixel,BitPixel) + +MakeOrdPix (OrdDitherQB,QuadPixel,BytePixel) +MakeOrdPix (OrdDitherPB,PairPixel,BytePixel) +MakeOrdPix (OrdDitherBB,BytePixel,BytePixel) + +MakeOrdPix (OrdDitherQP,QuadPixel,PairPixel) +MakeOrdPix (OrdDitherPP,PairPixel,PairPixel) + +MakeOrdPix (OrdDitherQQ,QuadPixel,QuadPixel) + +/* end module mpdither.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/mpgeom.c b/xie/xc/programs/Xserver/XIE/mixie/process/mpgeom.c new file mode 100644 index 0000000..31d8d84 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/mpgeom.c @@ -0,0 +1,148 @@ +/* $XConsortium: mpgeom.c,v 1.4 94/04/17 20:35:18 rws Exp $ */ +/**** module mpgeom.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mpgeom.c -- DDXIE geometry element + + Ben Fahy -- AGE Logic, Inc. June, 1993 + +*****************************************************************************/ + + +#define _XIEC_MPGEOM +#define _XIEC_PGEOM + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeGeometry(); + +/* + * routines which we reference from other DDXIE modules + */ +extern int miAnalyzeGeomAA(); +#if XIE_FULL +extern int miAnalyzeGeomBi(); +#endif +extern int miAnalyzeGeomNN(); + +static xieIntProc miAnalyzeGeomVecs[] = { + miAnalyzeGeomAA, +#if XIE_FULL + miAnalyzeGeomBi, +#endif + miAnalyzeGeomNN, + (xieIntProc) NULL +}; +#define n_vecs (sizeof(miAnalyzeGeomVecs)/sizeof(xieIntProc) - 1) + +/*------------------------------------------------------------------------ +------------------------ fill in the vector --------------------------- +------------------------------------------------------------------------*/ +int miAnalyzeGeometry(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + int i; + + for (i=0; i + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include +#include + + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeGeomAA(); + +/* + * routines used internal to this module, technique dependent + */ + +/* antialias by lowpass using boxcar filter*/ +static int CreateGeomAA(); +static int InitializeGeomAA(); +static int ActivateGeomAA(); +static int ResetGeomAA(); +static int DestroyGeomAA(); + + +/* + * DDXIE Geometry entry points + */ +static ddElemVecRec AntiAliasVec = { + CreateGeomAA, + InitializeGeomAA, + ActivateGeomAA, + (xieIntProc)NULL, + ResetGeomAA, + DestroyGeomAA + }; + +static void AASL_R(), AASL_b(), AASL_B(), AASL_P(), AASL_Q(); /* AA scale */ +static void AAGL_R(), AAGL_b(), AAGL_B(), AAGL_P(), AAGL_Q(); /* AA general */ +static void XXFL_R(), XXFL_b(), XXFL_B(), XXFL_P(), XXFL_Q(); /* fill */ +static void (*aa_scl_lines[5])() = { AASL_R, AASL_b, AASL_B, AASL_P, AASL_Q }; +static void (*aa_gen_lines[5])() = { AAGL_R, AAGL_b, AAGL_B, AAGL_P, AAGL_Q }; +static void (*fill_lines[5])() = { XXFL_R, XXFL_b, XXFL_B, XXFL_P, XXFL_Q }; + +#if XIE_FULL +static void GAGL_R(), GAGL_B(), GAGL_P(), GAGL_Q(); /* GA general */ +static void (*ga_scl_lines[5])() = { GAGL_R, AASL_b, GAGL_B, GAGL_P, GAGL_Q }; +static void (*ga_gen_lines[5])() = { GAGL_R, AAGL_b, GAGL_B, GAGL_P, GAGL_Q }; +#endif + +typedef struct _bounding_rect { + double xmin,xmax,ymin,ymax; +} brect; + +#define FLG_A_NOT_ZERO 0x01 +#define FLG_B_NOT_ZERO 0x02 +#define FLG_C_NOT_ZERO 0x04 +#define FLG_D_NOT_ZERO 0x08 +#define FLG_BACKWARDS 0x10 +#define FLG_SKIP_BAND 0x20 + +typedef struct _mpaabanddef { + CARD32 flags; /* see FLG_xxx above */ + int yOut; /* what output line we are on */ + + int first_ilow, /* rounded first_mlow */ + first_ihigh; /* rounded first_mhigh */ + + double first_mlow, /* lowest input line mapped by first output */ + first_mhigh; /* highest input line mapped by first output */ + + brect left_br; /* bounding rectangle, left side */ + + int *ixmin; /* useful data precalculated for scaling */ + int *ixmax; + + int level_clip; /* in case we need to clip our pixel */ + int int_constant; /* precalculated for Constrained data fill */ + RealPixel flt_constant; /* precalculated for UnConstrained data fill */ + + int in_width; /* source image size */ + int in_height; + + int lo_src_avail; /* lines we think are available */ + int hi_src_avail; + + void (*linefunc) (); /* action routines based on pixel size */ + void (*fillfunc) (); + } +mpAABandRec, *mpAABandPtr; + +/*------------------------------------------------------------------------ +------------------------ fill in the vector --------------------------- +------------------------------------------------------------------------*/ +int miAnalyzeGeomAA(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + switch(ped->techVec->number) { + case xieValGeomAntialias: + case xieValGeomGaussian: /* safe, but slow and sometimes ugly */ + ped->ddVec = AntiAliasVec; + break; + default: + return(FALSE); + } + return(TRUE); +} /* end miAnalyzeGeomAA */ + + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateGeomAA(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + int auxsize = sizeof(mpAABandRec) * xieValMaxBands; + + return(MakePETex(flo, ped, auxsize, NO_SYNC, NO_SYNC)); + +} /* end CreateGeomAA */ +/*------------------------------------------------------------------------ +---------------------------- free private data . . . --------------------- +------------------------------------------------------------------------*/ +static int FreeBandData(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + mpAABandPtr pvtband = (mpAABandPtr) (ped->peTex->private); + int band, nbands = ped->inFloLst[SRCtag].bands; + + for (band = 0 ; band < nbands ; band++, pvtband++) { + if (pvtband->flags & FLG_SKIP_BAND) + continue; + if (pvtband->ixmin != NULL) + pvtband->ixmin = (int *) XieFree(pvtband->ixmin); + + } +} +/*------------------------------------------------------------------------ +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeGeomAA(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + xieFloGeometry *raw = (xieFloGeometry *)ped->elemRaw; + pGeomDefPtr pedpvt = (pGeomDefPtr)ped->elemPvt; + mpAABandPtr pvtband = (mpAABandPtr) (pet->private); + bandPtr iband = &(pet->receptor[SRCtag].band[0]); + bandPtr oband = &(pet->emitter[0]); + int nbands = ped->inFloLst[SRCtag].bands; +#if XIE_FULL + BOOL gaussian = (ped->techVec->number == xieValGeomGaussian); +#endif + int band; + /* + * access coordinates for y_in = c * x_out + d * y_out + ty + */ + double a = pedpvt->coeffs[0]; + double b = pedpvt->coeffs[1]; + double c = pedpvt->coeffs[2]; + double d = pedpvt->coeffs[3]; + double tx = pedpvt->coeffs[4]; + double ty = pedpvt->coeffs[5]; + int width = raw->width; + int threshold; + double xmin,xmax,ymin,ymax,tot_ymin,tot_ymax; + CARD32 dataclass; + CARD32 band_flags; + +/* + * Initialize parameters for tracking input lines, etc. + */ + band_flags = 0; + + if (a != 0.0) band_flags |= FLG_A_NOT_ZERO; + if (b != 0.0) band_flags |= FLG_B_NOT_ZERO; + if (c != 0.0) band_flags |= FLG_C_NOT_ZERO; + if (d != 0.0) band_flags |= FLG_D_NOT_ZERO; + if (d < 0.0) band_flags |= FLG_BACKWARDS; + + for (band = 0 ; band < nbands; band++, iband++, oband++, pvtband++) { + + if (pedpvt->do_band[band]) { + + pvtband->flags = band_flags; + pvtband->yOut = 0; /* what output line we are on */ + + dataclass =oband->format->class; + if (IsConstrained(dataclass)) + pvtband->int_constant = ConstrainConst(pedpvt->constant[band], + iband->format->levels); + else + pvtband->flt_constant = (RealPixel) pedpvt->constant[band]; + + pvtband->fillfunc = fill_lines[IndexClass(dataclass)]; +#if XIE_FULL + pvtband->linefunc = gaussian + ? ga_gen_lines[IndexClass(dataclass)] + : aa_gen_lines[IndexClass(dataclass)]; +#else + pvtband->linefunc = aa_gen_lines[IndexClass(dataclass)]; +#endif + + pvtband->level_clip = oband->format->levels; + pvtband->in_width = iband->format->width; + pvtband->in_height = iband->format->height; + + /* + * THE BASIC IDEA - + * + * We consider each output pixel as describing an *area* of width 1 + * and height 1. Pixel (xo,yo) thus refers to the locus of points: + * + * LocusOut(xo,yo) = { (x,y) | xo <= x < xo+1, yo <= y < yo + 1 } + * + * When we map this area back to the input image, each corner maps + * according to: + * + * x_in = a * x_out + b * y_out + tx, + * y_in = c * x_out + b * y_out + ty. + * + * Now let P(xo,yo) be described as the point at relative position + * (p,q) from (xo,yo) in LocusOut(xo,yo). In other words, + * + * P(xo,yo) = (xo+p, yo+q) + * + * Let M(p,q;xo,yo) be the mapping in input space of P(xo,yo). Then + * the x coordinate of M(p,q;xo+1,yo) is: + * + * XCoord[ M(p,q:xo+1,yo) ] = a * (x_o+1+p) + b*yo + tx + * = a * (x_o+p) + b*yo + tx + a*p + * so + * + * XCoord[ M(p,q:xo+1,yo) ] = XCoord[ M(p,q;xo,yo) ] + a*p + * + * similarly, + * + * YCoord[ M(p,q:xo,yo+1) ] = YCoord[ M(p,q;xo,yo) ] + c*q + * + * also, + * + * XCoord[ M(p+1,q:xo,yo) ] = XCoord[ M(p,q;xo,yo) ] + a*p + * YCoord[ M(p+1,q:xo,yo) ] = XCoord[ M(p,q;xo,yo) ] + c*p + * XCoord[ M(p,q+1:xo,yo) ] = YCoord[ M(p,q;xo,yo) ] + b*q + * YCoord[ M(p,q+1:xo,yo) ] = YCoord[ M(p,q;xo,yo) ] + d*q + * + * We will use these results to derive a computationally simple + * antialiasing algorithm. + * + * Suppose we are scaling an image down by a factor of four in + * the X direction: + * + * | | | |**| | | | | | | | | | | | | | | | + * | | | |**| | | | |**|**|**|**|**|**|**|**|**|**| | + * | | | |**| | | | | | | | | | | | | | | | + * + * | | | ******** | ******** | ***** + * + * If we nearest neighbor sample the input image where the + * output pixels map to input locations, the horizontal line + * at the right will show up in the output image, but the vertical + * line at left will be completely missed. + * + * The idea of this algorithm is to take the average of all pixels + * which are included in the *region* mapped by the output *area*, + * as opposed to looking at discrete pixels only. So we consider + * a pixel as representing an output locus + * + * LocusOut(xo,yo) = { (x,y) | xo <= x < xo+1, yo <= y < yo + 1 } + * + * and the input locus will have corner points: + * + * ( XCoord[ M(0,0:xo,yo) ],YCoord[ M(0,0:xo,yo) ] ) + * ( XCoord[ M(1,0:xo,yo) ],YCoord[ M(1,0:xo,yo) ] ) + * ( XCoord[ M(0,1:xo,yo) ],YCoord[ M(0,1:xo,yo) ] ) + * ( XCoord[ M(1,1:xo,yo) ],YCoord[ M(1,1:xo,yo) ] ) + * + * If xi(xo) = XCoord[ M(0,0;xo,yo) ] + * and yi(yo) = YCoord[ M(0,0;xo,yo) ], + * + * Then we can rewrite these using the relations above as: + * + * ( xi(xo), yi(yo) ), + * ( xi(xo)+a, yi(yo)+c ), + * ( xi(xo)+b, yi(yo)+d), + * ( xi(xo)+a+b, yi(yo)+c+d ). + * + * We have very little guarantee on what shape this collection + * of points will assume, without agreeing to look for special + * cases of (a,b,c,d). However, we do know that whatever the + * locus looks like, there is a "bounding rectangle": + * + * BRect: { (xmin,ymin; xmax,ymax) } + * + * such that xmin is the greatest lower bound of all x in the input locus, + * such that ymin is the greatest lower bound of all y in the input locus, + * such that xmax is the least upper bound of all x in the input locus, & + * such that ymax is the least upper bound of all y in the input locus. + * + * Furthermore, this bounding rectangle has the very nice property + * of "shift invariance," ie, + * + * If { (xmin,ymin; xmax,ymax) } is the bounding rectangle for (xo,yo), + * + * Then { (xmin+a*m+b*n,ymin+c*m+d*n; xmax+a*m+b*n,ymax+c*m+d*n) } + * is the bounding rect for (xo+m,yo+n). + * + * Proof. Let Yo be the ymax coordinate of the bounding rectangle for + * (xo,yo). Let ILo be the input locus of (xo,yo). Let Yo' be the ymax + * coordinate of (xo+m,yo+n), and ILo' be the input locus of (xo+m,yo+n). + * We claim Yo' = Yo + c*m+d*n. + * + * By definition, Yo >= y for all y in ILo, and Yo' >= y for all y in ILo'. + * Suppose Yo' < Yo + c*m+d*n. Then Yo~ = (Yo' - c*m - d*n) is less than + * Yo. If Yo~ >= y for all y in ILo, then this contradicts Yo being a + * least upper bound. Therefore there must be some offset (r,s) such + * that Yrs = YCoord[ M(r,s;xo,yo) ] is > Yo~. But by the translation + * rules above, YCoord[ M(r,s; xo+m,yo+n) ] = Yrs + c*m + d*n. Call + * this point Yrs'. Then: + * + * Yrs' = Yrs + c*m + d*n > Yo~ + c*m + d*n = Yo' + * + * which violates the assumption that Yo' is the least upper bound for + * ILo'. Thus, Yo' >= Yo + c*m + d*n. It is easy to show that Yo' + * greater than Yo + c*m + d*n also leads to a contradiction. Therefore + * we have Yo' identically equal to Yo + c*m + d*n, and the other + * coordinates (xmin,xmax,ymin) follow by similar reasoning. + * + * ---------------------------------------------------------------------- + * + * WHY THIS IS USEFUL: + * + * We compute the bounding rectangle for the first pixel on the first + * output line. Then it is easy to compute the bounding rectangle for + * all other points in the output image. In particular, we can compute + * ymin,ymax values for any line in the output image. We don't bother + * decoding any output line until all of the required input image lines + * are available. + * + * Once we have the data, we call a line function that does the real + * work. The line function simply marches through the bounding rect + * of each pixel in the output line, adds up the input image numbers, + * and divides by the number of discrete pixels in the bounding rect. + * The next bounding rect in the line is easily calculated by the + * shift-invariance relation. Clipping of the bounding rect is used + * to avoid integrating nonsense values. An output pixel is filled + * with the constant value only if the *entire* bounding rectangle + * is off-image. + * + */ + +/*** Calculate bounding rectangle of first pixel, ylimits of first line ***/ + + xmin = xmax = tx; + ymin = ymax = tot_ymin = tot_ymax = ty; + +#if XIE_FULL + if (gaussian) { + pTecGeomGaussianDefPtr tkpvt = (pTecGeomGaussianDefPtr)ped->techPvt; + + if (tkpvt->radius < 1) tkpvt->radius = 2; + + /* conservatively pick a bounding box for datamgr calculations */ + xmin -= ((double) tkpvt->radius + 1.00001); + xmax += ((double) tkpvt->radius + 1.99999); + ymin -= ((double) tkpvt->radius + 1.00001); + ymax += ((double) tkpvt->radius + 1.99999); + tot_ymin = ymin + (c < 0.0 ? (width * c) : 0.0); + tot_ymax = ymax + (c > 0.0 ? (width * c) : 0.0); + } else +#endif + { + if (a < 0) xmin += a; + else xmax += a; + if (b < 0) xmin += b; + else xmax += b; + + if (c < 0) { ymin += c; tot_ymin += (width * c); } + else { ymax += c; tot_ymax += (width * c); } + if (d < 0) { ymin += d; tot_ymin += d; } + else { ymax += d; tot_ymax += d; } + } + + pvtband->left_br.xmin = xmin; + pvtband->left_br.ymin = ymin; + pvtband->left_br.xmax = xmax; + pvtband->left_br.ymax = ymax; + + pvtband->first_mlow = tot_ymin; + pvtband->first_mhigh = tot_ymax; + + pvtband->first_ilow = pvtband->first_mlow; + pvtband->first_ihigh = pvtband->first_mhigh; + +/*** Check for some special cases ***/ + if ((band_flags & (FLG_C_NOT_ZERO | FLG_B_NOT_ZERO)) == 0) { + int i, maxpixl = pvtband->in_width - 1; + +#if XIE_FULL + pvtband->linefunc = gaussian + ? ga_scl_lines[IndexClass(dataclass)] + : aa_scl_lines[IndexClass(dataclass)]; +#else + pvtband->linefunc = aa_scl_lines[IndexClass(dataclass)]; +#endif + + if (!(pvtband->ixmin = (int *) XieMalloc(width * 2*sizeof(int)))) { + FreeBandData(flo,ped); + AllocError(flo, ped, return(FALSE)); + } + pvtband->ixmax = pvtband->ixmin + width; + /* Valid X coord domain will remain same for entire image */ + for ( i=0; i maxpixl) ixmax = maxpixl; + if (ixmax > ixmin) ixmax--; + + pvtband->ixmin[i] = ixmin; + pvtband->ixmax[i] = ixmax; + } + } + + /* set threshold so we get all needed src lines */ + /* if we need line 256, must ask for 257! */ + threshold = pvtband->first_ihigh + 1; + + /* make sure we get something */ + if (threshold < 1) + threshold = 1; + + /* but don't ask for stuff we can't ever get! */ + if (threshold > iband->format->height) + threshold = iband->format->height; + + if(!InitBand(flo, ped, iband, iband->format->height, + threshold, NO_INPLACE)) + return(FALSE); + } else { + pvtband->flags = FLG_SKIP_BAND; + BypassSrc(flo,pet,iband); + } + } + return(raw->bandMask ? InitEmitter(flo,ped,NO_DATAMAP,NO_INPLACE) : TRUE); +} /* end InitializeGeomAA */ +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateGeomAA(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + pGeomDefPtr pedpvt = (pGeomDefPtr) ped->elemPvt; + mpAABandPtr pvtband = (mpAABandPtr) pet->private; + bandPtr oband = &(pet->emitter[0]); + bandPtr iband = &(pet->receptor[SRCtag].band[0]); + int band, nbands = pet->receptor[SRCtag].inFlo->bands; + int width = oband->format->width; /* consider use of pvtband */ + double d = pedpvt->coeffs[3]; + register pointer outp; + + for(band = 0; band < nbands; band++, iband++, oband++, pvtband++) { + + if (pvtband->flags & FLG_SKIP_BAND) + continue; + + if ((pet->scheduled & (1 << band)) == 0) + continue; + + if (pvtband->flags & FLG_BACKWARDS) { + + /* we're going backwards, which is actually *simpler*, + * because we don't get ANY data until we have ALL data. + * Thus, first time through, just map everything we have. + */ + if (!pvtband->yOut) { + if (!MapData(flo,pet,iband,0,0,iband->maxGlobal,KEEP)) + ImplementationError(flo,ped, return(FALSE)); + pvtband->lo_src_avail = 0; + pvtband->hi_src_avail = iband->maxGlobal-1; + } + + outp = GetCurrentDst(flo,pet,oband); + while (outp) { + + if ((pvtband->first_ihigh < 0) || + (pvtband->first_ilow > pvtband->in_height)) + + (*pvtband->fillfunc)(outp,width,pvtband); + else + (*pvtband->linefunc)(outp,iband->dataMap,width,ped,pvtband); + + /* now compute highest input line for next oline */ + pvtband->first_mlow += d; + pvtband->first_mhigh += d; + pvtband->first_ilow = (int) pvtband->first_mlow ; + pvtband->first_ihigh = (int) pvtband->first_mhigh; + pvtband->yOut++; + outp = GetNextDst(flo,pet,oband,TRUE); + } + if (oband->final) + DisableSrc(flo,pet,iband,FLUSH); + + } else { + + while (!ferrCode(flo)) { + int map_lo; /* lowest line mapped by output line */ + int map_hi; /* highest line mapped by output line */ + int last_src_line = pvtband->in_height - 1; + int threshold; + + /* access current output line */ + outp = GetDst(flo,pet,oband,pvtband->yOut,FLUSH); + if (!outp) { + if (oband->final) + DisableSrc(flo, pet, iband, FLUSH); + else if (iband->current != 0) + FreeData(flo, pet, iband, iband->current); + goto breakout; + } + + map_lo = pvtband->first_ilow; + if (map_lo < 0) + map_lo = 0; + + map_hi = pvtband->first_ihigh; + if (map_hi > last_src_line) + map_hi = last_src_line; + + if (map_hi < 0 || map_lo > last_src_line) + (*pvtband->fillfunc)(outp,width,pvtband); + else { + if(!MapData(flo,pet,iband,map_lo,map_lo,(map_hi-map_lo+1),KEEP)) + break; + pvtband->lo_src_avail = 0; + pvtband->hi_src_avail = iband->maxGlobal-1; + + if (map_lo != iband->current) + ImplementationError(flo,ped, return(FALSE)); + + /*** Compute output pixels for this line ***/ + (*pvtband->linefunc)(outp,iband->dataMap,width,ped,pvtband); + } + + /* increment to next line. */ + + pvtband->first_mlow += d; + pvtband->first_mhigh += d; + + /* have to be careful about -0.5 rounding to 0, not -1 */ + if (pvtband->first_ilow < 0) { + pvtband->first_ilow = (pvtband->first_mlow < 0) + ? -1 + : (int)pvtband->first_mlow; + pvtband->first_ihigh = (pvtband->first_mhigh < 0) + ? -1 + : (int)pvtband->first_mhigh; + } else { + /* if ilow was positive before, needn't check for negative */ + pvtband->first_ilow = (int)pvtband->first_mlow; + pvtband->first_ihigh = (int)pvtband->first_mhigh; + } + + ++pvtband->yOut; + if (pvtband->first_ilow > last_src_line) { + /* rest of output image is off the input image */ + /* we will exit after filling output strip */ + while(outp=GetDst(flo,pet,oband,pvtband->yOut,FLUSH)) { + (*pvtband->fillfunc)(outp,width,pvtband); + pvtband->yOut++; + } + if (oband->final) /* out of destination lines */ + DisableSrc(flo, pet, iband, FLUSH); + else + goto breakout; + /* Be nice and let downstream element eat our data */ + /* notice we don't free input data, because then the */ + /* silly scheduler would turn us off */ + } + + map_hi = pvtband->first_ihigh; + if (map_hi > last_src_line) + map_hi = last_src_line; + + threshold = map_hi - iband->current + 1; + + /* make sure we get something */ + if (threshold <= 1) + threshold = 1; + + /* but don't ask for stuff we can't ever get! */ + if (threshold > pvtband->in_height) + threshold = pvtband->in_height; + + SetBandThreshold(iband, threshold); + if (map_hi >= (int) iband->maxGlobal) { + /* we need to let someone else generate more data */ + break; + } + } + /* want to make sure we GetSrc at least once before Freeing */ + if (iband->current) + FreeData(flo, pet, iband, iband->current); + } /* end of backwards/forwards */ +breakout: ; + } /* end of band loop */ + return(TRUE); +} /* end ActivateGeometry */ + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetGeomAA(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + FreeBandData(flo,ped); + ResetReceptors(ped); + ResetEmitter(ped); + + return(TRUE); +} /* end ResetGeomAA */ + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyGeomAA(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc)NULL; + ped->ddVec.initialize = (xieIntProc)NULL; + ped->ddVec.activate = (xieIntProc)NULL; + ped->ddVec.reset = (xieIntProc)NULL; + ped->ddVec.destroy = (xieIntProc)NULL; + + return(TRUE); +} /* end DestroyGeomAA */ + +/**********************************************************************/ +/* fill routines */ +static void XXFL_b (OUTP,width,pvtband) + register pointer OUTP; + register int width; + mpAABandPtr pvtband; +{ + register LogInt constant = (LogInt) pvtband->int_constant; + register LogInt *outp = (LogInt *) OUTP; + register int i; + + if (constant) constant = ~0; + /* + ** NOTE: Following code assume filling entire line. Which is + ** currently true. In the future we may need to abide by + ** bit boundaries. Conversely code for bytes and pairs below + ** could be sped up by doing something similar. perhaps we need + ** an action_constant(outp,run,ix,constant) routine similar to + ** action_set(). + */ + width = (width + 31) >> 5; + for (i=0; i < width; ++i) *outp++ = constant; +} + +#define DO_FL(funcname, iotype, CONST) \ +static void funcname (OUTP,width,pvtband) \ + register pointer OUTP; \ + register int width; \ + mpAABandPtr pvtband; \ +{ \ + register iotype constant = (iotype) pvtband->CONST; \ + register iotype *outp = (iotype *) OUTP; \ + \ + for ( ; width > 0; width--) *outp++ = constant; \ +} + +DO_FL (XXFL_R, RealPixel, flt_constant) +DO_FL (XXFL_B, BytePixel, int_constant) +DO_FL (XXFL_P, PairPixel, int_constant) +DO_FL (XXFL_Q, QuadPixel, int_constant) + +/**********************************************************************/ +/* (x,y) separable routines (eg, scale, mirror_x, mirror_y) */ +/**********************************************************************/ +/* + * NOTE - see caveat for GL_b for why the user shouldn't really be + * asking for antialias in the first place... + */ +static void AASL_b (OUTP,srcimg,width,ped,pvtband) + register pointer OUTP, *srcimg; + register int width; + peDefPtr ped; + mpAABandPtr pvtband; +{ + pGeomDefPtr pedpvt = (pGeomDefPtr)ped->elemPvt; + double d = pedpvt->coeffs[3]; + + /* These variables describe the limits of the bounding rectangle */ + + /* since x and y separable, x limits are precalculated once */ + register int *ixminptr=pvtband->ixmin; + register int *ixmaxptr=pvtband->ixmax; + register int ixmin,ixmax; + + /* since x and y separable, y limits will be set once this line */ + register int iymin,iymax; + + /* some variables which describe available input data (for clipping) */ + register int minline = pvtband->lo_src_avail; + register int maxline = pvtband->hi_src_avail; + + + /* cast of constant, output and input pointers to correct type */ + register LogInt *outp = (LogInt *) OUTP; + register LogInt *ptrIn; + register LogInt constant; + register LogInt value,outval,M; + register int nfound; + + constant = pvtband->int_constant ? ~(LogInt) 0 : 0; + + /* round bounding rectangle limits to ints */ + iymin=pvtband->left_br.ymin; + iymax=pvtband->left_br.ymax; + + /* clip to available src data */ + if (iymin < minline) iymin = 0; + if (iymax > maxline) iymax = maxline; + if (iymax > iymin) iymax--; + + /* M is a number that encodes the "active" bit */ + M=LOGLEFT; + + /* val accumulates the output bits */ +#define kludge_based +#ifdef kludge_based + outval = 0; +#else + outval = constant; +#endif + + /* loop through all the output pixels on this line */ + while ( width-- > 0 ) { + register int ix,iy; + + /* make use of precalculated X limits */ + ixmin = *ixminptr++; + ixmax = *ixmaxptr++; + + nfound = 0; + value = 0; + for (iy=iymin; iy<=iymax; ++iy) { + ptrIn = (LogInt *) srcimg[iy]; + + for (ix=ixmin; ix<=ixmax; ++ix) { + ++nfound; +#ifdef kludge_based + if (LOG_tstbit(ptrIn,ix)) { + ++value; +#else + if (!LOG_tstbit(ptrIn,ix)) { + /* set this pixel black */ + outval &= ~M; + goto next; +#endif + } + } + } /* end of iy loop */ + +/* See GL_b() for an explanation of the kludge below */ + +#ifdef kludge_based +#define kludge 8/7 + /* note: 4/3 relies on C evaluating left to right */ + + if (!nfound) + outval |= (constant&M); /* set to background */ + else if (value*kludge >= nfound) + outval |= M; +#else + + if (!nfound) + outval &= (constant&M); /* set to background */ + else + outval |= M; /* set bit on */ +next: + +#endif + /* shift our active bit over one */ + LOGRIGHT(M); + + /* if we hit the end of a word, output what we have */ + if (!M) { + *outp++ = outval; /* record output data */ + M=LOGLEFT; /* reset active bit */ + outval = 0; /* reset accumulator */ + } + + } /* end of line loop */ + + /* if we didn't write all the pixels out, do so now */ + if (M != LOGLEFT) *outp = outval; + + /* before leaving, update bounding rect for next line */ + pvtband->left_br.ymin += d; + pvtband->left_br.ymax += d; +} + +/* NOTE: too bad paper is white is 255, otherwise you can often avoid the +** divide by "if (value) value /= nfound;" +*/ +#define aalinsep_func(funcname, iotype, valtype, CONST) \ + \ + /* round bounding rectangle limits to ints */ \ + iymin = pvtband->left_br.ymin; \ + iymax = pvtband->left_br.ymax; \ + \ + /* clip to available src data */ \ + if (iymin < minline) iymin = 0; \ + if (iymax > maxline) iymax = maxline; \ + if (iymax > iymin) iymax--; \ + \ + /* loop through all the output pixels on this line */ \ + for ( i=0; iixmin[i]; */ \ + /* ixmax = pvtband->ixmax[i]; */ \ + ixmin = *ixminptr++; \ + ixmax = *ixmaxptr++; \ + \ + for (iy=iymin; iy<=iymax; ++iy) { \ + ptrIn = ixmin + (iotype *) srcimg[iy]; \ + for (ix=ixmin; ix<=ixmax; ++ix) { \ + value += *ptrIn++; \ + ++nfound; \ + } \ + } /* end of iy loop */ \ + \ + if (nfound) \ + value /= nfound; \ + else \ + value = constant; \ + \ + *outp++ = value; \ + \ + } /* end of for loop */ \ + \ + /* before leaving, update bounding rect for next line */ \ + pvtband->left_br.ymin += d; \ + pvtband->left_br.ymax += d; \ + +#define DO_AASL(funcname, iotype, valtype, CONST) \ +static void \ +funcname (OUTP,srcimg,width,ped,pvtband) \ + register pointer OUTP; \ + register pointer *srcimg; \ + register int width; \ + peDefPtr ped; \ + mpAABandPtr pvtband; \ +{ \ + pGeomDefPtr pedpvt = (pGeomDefPtr)ped->elemPvt; \ + \ + /* Mapping coefficients */ \ + double d = pedpvt->coeffs[3]; \ + \ + /* These variables describe the limits of the bounding rectangle */ \ + register int *ixminptr = pvtband->ixmin; \ + register int *ixmaxptr = pvtband->ixmax; \ + register int ixmin,iymin,ixmax,iymax; \ + \ + /* variables which describe available input data (for clipping) */ \ + register int minline = pvtband->lo_src_avail; \ + register int maxline = pvtband->hi_src_avail; \ + \ + /* cast of constant, output and input pointers to correct type */ \ + register iotype constant = (iotype) pvtband->CONST; \ + register iotype *outp = (iotype *) OUTP; \ + register iotype *ptrIn; \ + \ + register valtype value; \ + register int i,nfound; \ + \ + aalinsep_func(funcname, iotype, valtype, CONST) \ +} + +DO_AASL (AASL_R, RealPixel, RealPixel, flt_constant) +DO_AASL (AASL_B, BytePixel, QuadPixel, int_constant) +DO_AASL (AASL_P, PairPixel, QuadPixel, int_constant) +DO_AASL (AASL_Q, QuadPixel, QuadPixel, int_constant) + + +/**********************************************************************/ +/* general routines (should be able to handle any valid map) */ + +/* CAVEAT - antialias doesn't really make much sense for bit-bit, + * because you can't represent any intermediate values. This means + * you can choose between line dropouts (bad) or making your image + * overly bold (also bad). The algorithm here assumes that if you + * were worried about being too bold, you would use the default + * sampling technique (eg, nearest neighbor). So it attempts to + * eliminate line dropouts at the expense of decreasing fine + * image detail. + */ + +static void +AAGL_b (OUTP,srcimg,width,ped,pvtband) + register pointer OUTP, *srcimg; + register int width; + peDefPtr ped; + mpAABandPtr pvtband; +{ + pGeomDefPtr pedpvt = (pGeomDefPtr)ped->elemPvt; + + /* Mapping coefficients */ + double a = pedpvt->coeffs[0]; + double b = pedpvt->coeffs[1]; + double c = pedpvt->coeffs[2]; + double d = pedpvt->coeffs[3]; + + /* These variables describe the limits of the bounding rectangle */ + double xmin = pvtband->left_br.xmin; + double ymin = pvtband->left_br.ymin; + double xmax = pvtband->left_br.xmax; + double ymax = pvtband->left_br.ymax; + register int ixmin,iymin,ixmax,iymax; + + /* loop variables for roaming through the bounding rectangle */ + register int ix,iy; + + /* some variables which describe available input data (for clipping) */ + register int maxpixl = pvtband->in_width - 1; + register int minline = pvtband->lo_src_avail; + register int maxline = pvtband->hi_src_avail; + CARD32 flags = pvtband->flags; + + /* cast of constant, output and input pointers to correct type */ + register LogInt *outp = (LogInt *) OUTP; + register LogInt *ptrIn; + register LogInt constant; + register LogInt value,outval,M; + register int nfound; + + constant = pvtband->int_constant ? ~(LogInt) 0 : 0; + + /* round bounding rectangle limits to ints */ + ixmin = xmin; + iymin = ymin; + ixmax = xmax; + iymax = ymax; + + /* clip to available src data */ + if (ixmin < 0) ixmin = 0; + if (iymin < minline) iymin = 0; + if (ixmax > maxpixl) ixmax = maxpixl; + if (iymax > maxline) iymax = maxline; + + /* M is a number that encodes the "active" bit */ + M=LOGLEFT; + + /* val accumulates the output bits */ +#define kludge_based_not +#ifdef kludge_based + outval = 0; +#else + outval = constant; +#endif + + /* loop through all the output pixels on this line */ + while ( width > 0 ) { + + xmin += a; + xmax += a; + nfound = 0; + value = 0; + for (iy=iymin; iy<=iymax; ++iy) { + ptrIn = (LogInt *) srcimg[iy]; + + for (ix=ixmin; ix<=ixmax; ++ix) { + ++nfound; +#ifdef kludge_based + if (LOG_tstbit(ptrIn,ix)) { + ++value; + } +#else + if (!LOG_tstbit(ptrIn,ix)) { + /* set this pixel black */ + outval &= ~M; + goto next; + } +#endif + } + } /* end of iy loop */ + +/* on the kludge below: antialias is weird when you are going from + 1 bit to 1 bit. A straight generalization of the n-bit algorithm + would have us find the average value in the bounding rect, and + then round to 0 or 1. This corresponds to kludge = 2. However, + it may be desirable to choose black if a much smaller number of + pixels in the bounding rect are off. For example, we may want to + have black output if less than 3 out of every four pixels in the + input bounding rect are on. (value <= 3/4 nfound) which would + correspond to value *4/3 < nfound. + + The problem with choosing anything other than 2 is that we are + treating black and white asymmetrically: the algorithm will + perform well for black lines on a white background, and poorly + for white pixels on a black background. Granted, one could use + Point or Constrain to flip, but.... ugh. + + Note that if the bounding rectangle is completely off the input + image, then we should set 'val' to the background value (constant). +*/ + +#ifdef kludge_based +#define kludge 8/7 + /* note: 4/3 relies on C evaluating left to right */ + + if (!nfound) + outval |= (constant&M); /* set to background */ + else if (value*kludge >= nfound) + outval |= M; +#else + + if (!nfound) + outval &= (constant&M); /* set to background */ + else + outval |= M; /* set bit on */ +next: + +#endif + /* shift our active bit over one */ + LOGRIGHT(M); + + /* if we hit the end of a word, output what we have */ + if (!M) { + *outp++ = outval; /* record output data */ + M=LOGLEFT; /* reset active bit */ + outval = 0; /* reset accumulator */ + } + + /* prepare geometry stuff for next loop */ + width--; + ixmin = xmin; + ixmax = xmax; + if (flags & FLG_C_NOT_ZERO) { + ymin += c; + ymax += c; + iymin = ymin; + iymax = ymax; + if (iymin < minline) iymin = minline; + if (iymax >= maxline) iymax = maxline; + if (iymax > iymin) iymax--; + } + if (ixmin < 0) ixmin = 0; + if (ixmax >= maxpixl) ixmax = maxpixl; + if (ixmax > ixmin) ixmax--; + } /* end of line loop */ + + /* if we didn't write all the pixels out, do so now */ + if (M != LOGLEFT) *outp = outval; + + /* before leaving, update bounding rect for next line */ + if (flags & FLG_B_NOT_ZERO) { + pvtband->left_br.xmin += b; + pvtband->left_br.xmax += b; + } + if (flags & FLG_D_NOT_ZERO) { + pvtband->left_br.ymin += d; + pvtband->left_br.ymax += d; + } +} + +/* NOTE: too bad paper is white is 255, otherwise you can often avoid the +** divide by "if (value) value /= nfound;" +*/ +#define inscrutable_compiler(funcname, iotype, valtype, CONST) \ + /* round bounding rectangle limits to ints */ \ + ixmin = xmin; \ + iymin = ymin; \ + ixmax = xmax; \ + iymax = ymax; \ + \ + /* clip to available src data */ \ + if (ixmin < 0) ixmin = 0; \ + if (iymin < minline) iymin = 0; \ + if (ixmax > maxpixl) ixmax = maxpixl; \ + if (iymax > maxline) iymax = maxline; \ + \ + /* loop through all the output pixels on this line */ \ + while ( width > 0 ) { \ + \ + xmin += a; \ + xmax += a; \ + nfound = 0; \ + value = 0; \ + for (iy=iymin; iy<=iymax; ++iy) { \ + ptrIn = (iotype *) srcimg[iy]; \ + for (ix=ixmin; ix<=ixmax; ++ix) { \ + value += ptrIn[ix]; \ + ++nfound; \ + } \ + } /* end of iy loop */ \ + \ + if (nfound) \ + value /= nfound; \ + else \ + value = constant; \ + \ + /* prepare for next loop */ \ + width--; \ + ixmin = xmin; \ + ixmax = xmax; \ + if (flags & FLG_C_NOT_ZERO) { \ + ymin += c; \ + ymax += c; \ + iymin = ymin; \ + iymax = ymax; \ + if (iymin < minline) iymin = minline; \ + if (iymax >= maxline) iymax = maxline; \ + if (iymax > iymin) iymax--; \ + } \ + if (ixmin < 0) ixmin = 0; \ + if (ixmax >= maxpixl) ixmax = maxpixl; \ + if (ixmax > ixmin) ixmax--; \ + *outp++ = value; \ + }/* end of line loop */ \ + \ + /* before leaving, update bounding rect for next line */ \ + if (flags & FLG_B_NOT_ZERO) { \ + pvtband->left_br.xmin += b; \ + pvtband->left_br.xmax += b; \ + } \ + if (flags & FLG_D_NOT_ZERO) { \ + pvtband->left_br.ymin += d; \ + pvtband->left_br.ymax += d; \ + } + +#define DO_AAGL(funcname, iotype, valtype, CONST) \ +static void \ +funcname (OUTP,srcimg,width,ped,pvtband) \ + register pointer OUTP; \ + register pointer *srcimg; \ + register int width; \ + peDefPtr ped; \ + mpAABandPtr pvtband; \ +{ \ + pGeomDefPtr pedpvt = (pGeomDefPtr)ped->elemPvt; \ + \ + /* Mapping coefficients */ \ + double a = pedpvt->coeffs[0]; \ + double b = pedpvt->coeffs[1]; \ + double c = pedpvt->coeffs[2]; \ + double d = pedpvt->coeffs[3]; \ + CARD32 flags = pvtband->flags; \ + \ + /* These variables describe the limits of the bounding rectangle */ \ + double xmin = pvtband->left_br.xmin; \ + double ymin = pvtband->left_br.ymin; \ + double xmax = pvtband->left_br.xmax; \ + double ymax = pvtband->left_br.ymax; \ + register int ixmin,iymin,ixmax,iymax; \ + \ + /* loop variables for roaming through the bounding rectangle */ \ + register int ix,iy; \ + \ + /* variables which describe available input data (for clipping) */ \ + register int maxpixl = pvtband->in_width - 1; \ + register int minline = pvtband->lo_src_avail; \ + register int maxline = pvtband->hi_src_avail; \ + \ + /* cast of constant, output and input pointers to correct type */ \ + register iotype constant = (iotype) pvtband->CONST; \ + register iotype *outp = (iotype *) OUTP; \ + register iotype *ptrIn; \ + \ + register valtype value; \ + register int nfound; \ + \ + inscrutable_compiler(funcname, iotype, valtype, CONST) \ +} + +DO_AAGL (AAGL_R, RealPixel, RealPixel, flt_constant) +DO_AAGL (AAGL_B, BytePixel, QuadPixel, int_constant) +DO_AAGL (AAGL_P, PairPixel, QuadPixel, int_constant) +DO_AAGL (AAGL_Q, QuadPixel, QuadPixel, int_constant) + +#if XIE_FULL +/************************************************************************/ +/* Gaussian Routines */ +/************************************************************************/ +/* NOTES: +** this is so slow, we don't try to do a special scale routine. +** should use #include ? +** should consider using float (e.g. fexp()) but tends to be machine specific. +** should generate pow(2,K) as (1 << floor(k)) + table[fraction(K)]. +** (pow(2,K) is half the speed of exp() which defeats the purpose). +** issue of whether to pick points within a radius? or to use a constant +** ...size box of size 2 * radius ? + + (((uv2 = ((ix-xcen)*(ix-xcen)+(iy-ycen)*(iy-ycen))) <= rad2 ) \ + ? ((double)(P)) * (simple \ + ? pow(2.0, sigma * uv2) \ + : exp(sigma * uv2)) \ + : 0.0 ) +*/ + +extern double exp(), pow(); + + +#define gauss_loop(funcname, iotype, valtype, CONST) \ + \ + /* loop through all the output pixels on this line */ \ + while ( width-- > 0 ) { \ + \ + iymin = ycen - (radius-1); \ + iymax = iymin + (radius+radius-1); \ + if (iymin < minline) iymin = minline; \ + if (iymax >= maxline) iymax = maxline; \ + \ + ixmin = xcen - (radius - 1); \ + ixmax = ixmin + (radius + radius - 1); \ + if (ixmin < 0) ixmin = 0; \ + if (ixmax >= maxpixl) ixmax = maxpixl; \ + \ + nfound = 0; \ + value = 0.; \ + for (iy = iymin; iy <= iymax; ++iy) { \ + ptrIn = (iotype *) srcimg[iy]; \ + for (ix = ixmin; ix <= ixmax; ++ix) { \ + uv2 = ((ix-xcen)*(ix-xcen)+(iy-ycen)*(iy-ycen)); \ + value += ((double)(ptrIn[ix])) * (simple \ + ? pow(2.0, sigma * uv2) \ + : exp(sigma * uv2)); \ + ++nfound; \ + } \ + } /* end of iy loop */ \ + \ + if (nfound) { \ + value *= tkpvt->normalize; /* xxx clip */ \ + *outp++ = value < levels ? value : levels; \ + } else \ + *outp++ = constant; \ + \ + xcen += a; \ + ycen += c; \ + }/* end of line loop */ \ + \ + /* before leaving, update bounding rect for next line */ \ + if (flags & FLG_B_NOT_ZERO) { \ + pvtband->left_br.xmin += b; \ + pvtband->left_br.xmax += b; \ + } \ + if (flags & FLG_D_NOT_ZERO) { \ + pvtband->left_br.ymin += d; \ + pvtband->left_br.ymax += d; \ + } + +#define DO_GAGL(funcname, iotype, valtype, CONST) \ +static void \ +funcname (OUTP,srcimg,width,ped,pvtband) \ + register pointer OUTP; \ + register pointer *srcimg; \ + register int width; \ + peDefPtr ped; \ + mpAABandPtr pvtband; \ +{ \ + pGeomDefPtr pedpvt = (pGeomDefPtr)ped->elemPvt; \ + \ + /* Mapping coefficients */ \ + double a = pedpvt->coeffs[0]; \ + double b = pedpvt->coeffs[1]; \ + double c = pedpvt->coeffs[2]; \ + double d = pedpvt->coeffs[3]; \ + CARD32 flags = pvtband->flags; \ + \ + register double xcen = pvtband->yOut * b + pedpvt->coeffs[4]; \ + register double ycen = pvtband->yOut * d + pedpvt->coeffs[5]; \ + register int ixmin,iymin,ixmax,iymax; \ + \ + /* loop variables for roaming through the bounding rectangle */ \ + register int ix,iy; \ + \ + /* variables which describe available input data (for clipping) */ \ + register int maxpixl = pvtband->in_width - 1; \ + register int minline = pvtband->lo_src_avail; \ + register int maxline = pvtband->hi_src_avail; \ + \ + /* cast of constant, output and input pointers to correct type */ \ + register iotype constant = (iotype) pvtband->CONST; \ + register iotype *outp = (iotype *) OUTP; \ + register iotype *ptrIn; \ + \ + register double value, levels = pvtband->level_clip - 1; \ + register int nfound; \ + pTecGeomGaussianDefPtr tkpvt = (pTecGeomGaussianDefPtr)ped->techPvt;\ + int simple = tkpvt->simple; \ + int radius = tkpvt->radius; \ + double sigma = (simple ? -1.0 : -0.5) / \ + (tkpvt->sigma * tkpvt->sigma); \ + register double uv2; \ + \ + gauss_loop(funcname, iotype, valtype, CONST) \ +} + +DO_GAGL (GAGL_R, RealPixel, RealPixel, flt_constant) +DO_GAGL (GAGL_B, BytePixel, QuadPixel, int_constant) +DO_GAGL (GAGL_P, PairPixel, QuadPixel, int_constant) +DO_GAGL (GAGL_Q, QuadPixel, QuadPixel, int_constant) +#endif + +/**********************************************************************/ +/* end module mpgeomaa.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/mpgeomnn.c b/xie/xc/programs/Xserver/XIE/mixie/process/mpgeomnn.c new file mode 100644 index 0000000..2008124 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/mpgeomnn.c @@ -0,0 +1,1120 @@ +/* $XConsortium: mpgeomnn.c /main/8 1995/12/02 16:56:06 dpw $ */ +/* AGE Logic - Oct 15 1995 - Larry Hare */ +/**** module mpgeomnn.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mpgeomnn.c -- DDXIE geometry element for handling nearest + neighbor technique + + Ben Fahy && Larry Hare -- AGE Logic, Inc. June, 1993 + +*****************************************************************************/ + + +#define _XIEC_MPGEOM +#define _XIEC_PGEOM + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +/* #include */ +#include + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeGeomNN(); + +/* + * routines used internal to this module, technique dependent + */ + +static int CreateGeomNN(); +static int InitializeGeomNN(); +static int ActivateGeomNN(); +static int ResetGeomNN(); +static int DestroyGeomNN(); + +/* + * DDXIE Geometry entry points + */ +static ddElemVecRec NearestNeighborVec = { + CreateGeomNN, + InitializeGeomNN, + ActivateGeomNN, + (xieIntProc)NULL, + ResetGeomNN, + DestroyGeomNN + }; + +/* + * private + */ +#define PIX0 ((double)(0.0000)) + +typedef struct _mpgeombanddef { + + double first_mlow, /* lowest input line mapped by first output */ + first_mhigh; /* highest input line mapped by first output */ + int first_ilow, /* rounded first_mlow */ + first_ihigh; /* rounded first_mhigh */ + + double *s_locs; /* useful data precalculated for scaling */ + int *x_locs; /* useful data precalculated for scaling */ + int x_start; + int x_end; + int int_constant; /* precalculated for Constrained data fill */ + RealPixel flt_constant; /* precalculated for UnConstrained data fill */ + + int yOut; /* what output line we are on */ + int out_width; /* output image size */ + int out_height; /* ... not used */ + int in_width; /* input image size */ + int in_height; + + int lo_src_available; /* which input lines we've come across */ + int hi_src_available; + + void (*linefunc) (); + void (*fillfunc) (); +} mpGeometryBandRec, *mpGeometryBandPtr; + +typedef struct _mpgeometrydef { + int upside_down; + mpGeometryBandPtr bandInfo[xieValMaxBands]; +} mpGeometryDefRec, *mpGeometryDefPtr; + +static void FL_R(), FL_b(), FL_B(), FL_P(), FL_Q(); +static void (*fill_lines[5])() = {FL_R, FL_b, FL_B, FL_P, FL_Q,}; + +static void SL_R(), SL_b(), SL_B(), SL_P(), SL_Q(); +static void GL_R(), GL_b(), GL_B(), GL_P(), GL_Q(); +static void (*scale_lines[5])() = {SL_R, SL_b, SL_B, SL_P, SL_Q,}; +static void (*ggen_lines[5])() = {GL_R, GL_b, GL_B, GL_P, GL_Q,}; + +#if XIE_FULL +static void BiSL_R(), BiSL_b(), BiSL_B(), BiSL_P(), BiSL_Q(); +static void BiGL_R(), BiGL_b(), BiGL_B(), BiGL_P(), BiGL_Q(); +static void (*biscale_lines[5])() = {BiSL_R, BiSL_b, BiSL_B, BiSL_P, BiSL_Q,}; +static void (*bigen_lines[5])() = {BiGL_R, BiGL_b, BiGL_B, BiGL_P, BiGL_Q,}; +#endif + +/*------------------------------------------------------------------------ +------------------------ fill in the vector --------------------------- +------------------------------------------------------------------------*/ +#if XIE_FULL +int miAnalyzeGeomBi(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + switch(ped->techVec->number) { + case xieValGeomBilinearInterp: + ped->ddVec = NearestNeighborVec; /* Yes */ + break; + default: + return(FALSE); + } + return(TRUE); +} /* end miAnalyzeGeomBi */ +#endif + +int miAnalyzeGeomNN(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + switch(ped->techVec->number) { + case xieValGeomNearestNeighbor: + ped->ddVec = NearestNeighborVec; + break; + default: + return(FALSE); + } + return(TRUE); +} /* end miAnalyzeGeomNN */ + + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateGeomNN(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* allocate space for private data */ + return(MakePETex(flo, ped, sizeof(mpGeometryDefRec), NO_SYNC, NO_SYNC)); +} /* end CreateGeomNN */ + +/*------------------------------------------------------------------------ +---------------------------- free private data . . . --------------------- +------------------------------------------------------------------------*/ +static int FreeBandData(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + mpGeometryDefPtr pvt = (mpGeometryDefPtr) (ped->peTex->private); + int band, nbands = ped->inFloLst[SRCtag].bands; + +/* + * Look for private data to free + */ + for (band = 0 ; band < nbands ; band++) { + mpGeometryBandPtr pvtband = pvt->bandInfo[band]; + if (pvtband) { + if (pvtband->x_locs) + XieFree(pvtband->x_locs); + if (pvtband->s_locs) + XieFree(pvtband->s_locs); + pvt->bandInfo[band] = (mpGeometryBandPtr) XieFree(pvtband); + } + } +} + +/*------------------------------------------------------------------------ +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeGeomNN(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + mpGeometryDefPtr pvt = (mpGeometryDefPtr) (pet->private); + xieFloGeometry *raw = (xieFloGeometry *) (ped->elemRaw); + pGeomDefPtr pedpvt = (pGeomDefPtr) (ped->elemPvt); + bandPtr iband = &(pet->receptor[SRCtag].band[0]); + bandPtr oband = &(pet->emitter[0]); + int band, nbands = ped->inFloLst[SRCtag].bands; + mpGeometryBandPtr pvtband; +#if XIE_FULL + BOOL bilinear = (ped->techVec->number == + xieValGeomBilinearInterp); +#endif + /* + * x_in = a * x_out + b * y_out + tx + * y_in = c * x_out + d * y_out + ty + */ + double a = pedpvt->coeffs[0]; + double b = pedpvt->coeffs[1]; + double c = pedpvt->coeffs[2]; + double d = pedpvt->coeffs[3]; + double tx = pedpvt->coeffs[4]; + double ty = pedpvt->coeffs[5]; + int threshold; + +/* + * Initialize parameters for tracking input lines, etc. + */ + pvt->upside_down = (d < 0.0); + + for (band = 0 ; band < nbands ; band++, iband++, oband++) { + if (pedpvt->do_band[band]) { + CARD32 dataclass = pet->emitter[band].format->class; + + pvt->bandInfo[band] = pvtband = + (mpGeometryBandPtr) XieCalloc(sizeof(mpGeometryBandRec)); + if (!pvtband) { + FreeBandData(flo,ped); + AllocError(flo, ped, return(FALSE)); + } + if (IsConstrained(dataclass)) + pvtband->int_constant = ConstrainConst(pedpvt->constant[band], + pet->emitter[band].format->levels); + else + pvtband->flt_constant = (RealPixel) pedpvt->constant[band]; + + pvtband->fillfunc = + fill_lines[IndexClass(dataclass)]; +#if XIE_FULL + pvtband->linefunc = bilinear + ? bigen_lines[IndexClass(dataclass)] + : ggen_lines[IndexClass(dataclass)]; +#else + pvtband->linefunc = ggen_lines[IndexClass(dataclass)]; +#endif + pvtband->out_width = oband->format->width; + pvtband->in_width = iband->format->width; + pvtband->in_height = iband->format->height; + + if (c == 0 && b == 0 ) { + int in_width = pvtband->in_width; + int width = pvtband->out_width; + int x, in_x_coord; + double in_x; + + /* For Scaling, can precalculate a lot */ + + if (a == 1 && d == 1) { + /* just Cropping, no real resampling to be done */ + } +#if XIE_FULL + pvtband->linefunc = bilinear + ? biscale_lines[IndexClass(dataclass)] + : scale_lines[IndexClass(dataclass)]; +#else + pvtband->linefunc = scale_lines[IndexClass(dataclass)]; +#endif + if (!(pvtband->x_locs = (int *) XieMalloc(width * sizeof(int)))) { + FreeBandData(flo,ped); + AllocError(flo, ped, return(FALSE)); + } +#if XIE_FULL + if (bilinear && !(pvtband->s_locs = (double *) + XieMalloc(width * sizeof(double)))) { + FreeBandData(flo,ped); + AllocError(flo, ped, return(FALSE)); + } +#endif + /* coordinate of line is x_in = a * x_out + tx */ + /* however, we will map pixel centers to centers, */ + /* so we plug in output pixel location x_out+0.5 */ + /* for output_pixel x_out. Happily, finding the */ + /* nearest pixel centered on the computed input */ + /* location is then found simply by truncating */ + + /* initialize to nonsense values */ + pvtband->x_start = width; + pvtband->x_end = -1; + + in_x = a*PIX0 + tx; /* location of center */ + + for (x=0; x= 0 && in_x_coord < in_width) { + /* this pixel is useful */ + pvtband->x_end = x; + if (pvtband->x_start >= width) + pvtband->x_start = x; + pvtband->x_locs[x] = in_x_coord; +#if XIE_FULL + if (bilinear) + pvtband->s_locs[x] = in_x - in_x_coord; +#endif + } else + pvtband->x_locs[x] = -1; /* ignore this */ + in_x += a; /* next center location */ + } + } + + /* + * we need to compute the initial input line + * number ranges for the entire output image and the first output line. + * Just for fun, we will also compute the range for the last output line. + * How these limits are computed, of course, may depend on techniqu; + */ + + /* + * For nearest neighbor, we consider lines to have both width and height. + * Thus, if an image is of area w x h, we picture the image as being: + * + * x=0 w-1 w + * y=0 ________________________________ + * | | | | | ... | | | + * y=1 --------------------------------- + * + * + * y=h-1 ________________________________ + * | | | | | ... | | | + * y=h --------------------------------- + * + * The first pixel on the first output line is therefore (.5,.5) and + * the last pixel on the last output line is (w-.5,w-.5), etc. We + * compute the input line ranges by seeing where the four corners map, + * and selecting the coordinates of the pixel whose *center* maps most + * closely. + * + */ + + /* + * first line of output image + */ + { + double left_map,right_map; + left_map = c * PIX0 + d * PIX0 + ty; + right_map = c * ((pvtband->out_width-1) + PIX0) + d * PIX0 + ty; + pvtband->first_mlow = (left_map <= right_map)? left_map : right_map; + pvtband->first_mhigh = (left_map >= right_map)? left_map : right_map; + } + + /* + * coordinates with center closest are just truncated doubles + */ + pvtband->first_ilow = pvtband->first_mlow; + pvtband->first_ihigh = pvtband->first_mhigh; + + + /* set threshold so we get all needed src lines */ + /* ...if we need line 256, must ask for 257! */ + threshold = pvtband->first_ihigh + 1; +#if XIE_FULL + if (bilinear) threshold++; +#endif + /* make sure we get something */ + if (threshold < 1) + threshold = 1; + + /* but don't ask for stuff we can't ever get! */ + if (threshold > pvtband->in_height) + threshold = pvtband->in_height; + + if(!InitBand(flo,ped,iband,pvtband->in_height,threshold,NO_INPLACE)) + return(FALSE); + } else { + /* we're suppose to pass this band thru unscathed */ + BypassSrc(flo,pet,iband); + } + } + return(raw->bandMask ? InitEmitter(flo,ped,NO_DATAMAP,NO_INPLACE) : TRUE); +} /* end InitializeGeomNN */ +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateGeomNN(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + pGeomDefPtr pedpvt = (pGeomDefPtr) (ped->elemPvt); + mpGeometryDefPtr pvt = (mpGeometryDefPtr) (ped->peTex->private); + bandPtr oband = &(pet->emitter[0]); + bandPtr iband = &(pet->receptor[SRCtag].band[0]); + int band, nbands = pet->receptor[SRCtag].inFlo->bands; + register pointer outp; +#if XIE_FULL + BOOL bilinear = (ped->techVec->number == xieValGeomBilinearInterp); +#endif + + for(band = 0; band < nbands; band++, iband++, oband++) { + + mpGeometryBandPtr pvtband = pvt->bandInfo[band]; + int width; + + if (!pvtband || ((pet->scheduled & (1 << band)) == 0) ) + continue; + + width = pvtband->out_width; + if (pvt->upside_down) { + + /* we're going backwards, which is actually *simpler*, + * because we don't get ANY data until we have ALL data. + * Thus, first time through, just map everything we have. + */ + if (!pvtband->yOut) { + if (!MapData(flo,pet,iband,0,0,iband->maxGlobal,KEEP)) { + ImplementationError(flo,ped, return(FALSE)); + } + pvtband->lo_src_available = 0; + pvtband->hi_src_available = iband->maxGlobal-1; + } + + outp = GetCurrentDst(flo,pet,oband); + while (outp) { + int lo_in,hi_in; + + /* get range of src lines for this output line */ + lo_in = pvtband->first_ilow; + hi_in = pvtband->first_ihigh; + + /* rest of output image is off input image */ + if ( (hi_in < 0) || (lo_in > pvtband->hi_src_available) ) + (*pvtband->fillfunc)(outp,width,pvtband); + else + /* Compute output pixels for this line */ +#if XIE_FULL + (*pvtband->linefunc)(outp,iband->dataMap,width, + bilinear ? lo_in : hi_in, pedpvt, pvtband); +#else + (*pvtband->linefunc)(outp,iband->dataMap,width, + hi_in, pedpvt, pvtband); +#endif + pvtband->first_mlow += pedpvt->coeffs[3]; + pvtband->first_mhigh += pedpvt->coeffs[3]; + pvtband->first_ilow = (int) pvtband->first_mlow ; + pvtband->first_ihigh = (int) pvtband->first_mhigh; + pvtband->yOut++; + outp = GetNextDst(flo,pet,oband,TRUE); + } + if (oband->final) + DisableSrc(flo,pet,iband,FLUSH); + + } else { + /* + ** nice normal image progression. This means that I know when + ** I am done with an input line for the current output line, I + ** can purge it, because it won't be needed for subsequent + ** output lines. + */ + + while (!ferrCode(flo)) { + int map_lo; /* lowest line mapped by output line */ + int map_hi; /* highest line mapped by output line */ + int last_src_line = pvtband->in_height - 1; + int threshold; + + /* access current output line */ + if (!(outp = GetDst(flo,pet,oband,pvtband->yOut,FLUSH))) { + if (oband->final) + DisableSrc(flo, pet, iband, FLUSH); + else if (iband->current != 0) + FreeData(flo, pet, iband, iband->current); + goto breakout; + } + + map_lo = pvtband->first_ilow; + if (map_lo < 0) + map_lo = 0; + + map_hi = pvtband->first_ihigh; +#if XIE_FULL + if (bilinear) map_hi++; +#endif + if (map_hi > last_src_line) + map_hi = last_src_line; + + if (map_hi < 0 || map_lo > last_src_line) + (*pvtband->fillfunc)(outp,width,pvtband); + else { + + threshold = map_hi - map_lo + 1; + if(!MapData(flo,pet,iband,map_lo,map_lo,threshold,KEEP)) + break; + + if (map_lo != iband->current) + ImplementationError(flo,ped, return(FALSE)); + + pvtband->lo_src_available = 0; + pvtband->hi_src_available = iband->maxGlobal-1; + + (*pvtband->linefunc)(outp,iband->dataMap, + width,map_lo,pedpvt,pvtband); + + } + + pvtband->first_mlow += pedpvt->coeffs[3]; + pvtband->first_mhigh += pedpvt->coeffs[3]; + + /* have to be careful about -0.5 rounding to 0, not -1 */ + if (pvtband->first_ilow < 0) { + + pvtband->first_ilow = (pvtband->first_mlow < 0) + ? -1 + : (int)pvtband->first_mlow; + + pvtband->first_ihigh = (pvtband->first_mhigh < 0) + ? -1 + : (int)pvtband->first_mhigh; + } else { + /* if ilow was positive before, needn't check for negative */ + pvtband->first_ilow = (int)pvtband->first_mlow; + pvtband->first_ihigh = (int)pvtband->first_mhigh; + } + + ++pvtband->yOut; + + if (pvtband->first_ilow > last_src_line) { + /* rest of output image is off the input image */ + /* we will exit after filling output strip */ + while(outp=GetDst(flo,pet,oband,pvtband->yOut,FLUSH)) { + (*pvtband->fillfunc)(outp,width,pvtband); + pvtband->yOut++; + } + if (oband->final) + DisableSrc(flo, pet, iband, FLUSH); + else + goto breakout; + } + + map_hi = pvtband->first_ihigh; +#if XIE_FULL + if (bilinear) map_hi++; +#endif + if (map_hi > last_src_line) + map_hi = last_src_line; + + threshold = map_hi - iband->current + 1; + + /* make sure we get something */ + if (threshold <= 1) + threshold = 1; + + /* but don't ask for stuff we can't ever get! */ + if (threshold > pvtband->in_height) + threshold = pvtband->in_height; + + SetBandThreshold(iband, threshold); + if (map_hi >= (int) iband->maxGlobal) { + /* we need to let someone else generate more data */ + break; + } + } /* end of while no flo err */ + /* want to make sure we GetSrc at least once before Freeing */ + if (iband->current) + FreeData(flo, pet, iband, iband->current); +breakout: + ; + } /* end of else on normal order */ + } /* end of band loop */ + return(TRUE); +} /* end ActivateGeometry */ + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetGeomNN(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + FreeBandData(flo,ped); + ResetReceptors(ped); + ResetEmitter(ped); + + return(TRUE); +} /* end ResetGeomNN */ + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyGeomNN(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc)NULL; + ped->ddVec.initialize = (xieIntProc)NULL; + ped->ddVec.activate = (xieIntProc)NULL; + ped->ddVec.flush = (xieIntProc)NULL; + ped->ddVec.reset = (xieIntProc)NULL; + ped->ddVec.destroy = (xieIntProc)NULL; + + return(TRUE); +} /* end DestroyGeomNN */ + +/********************************************************************** +**************************** Fill Routines ************************** +**********************************************************************/ + +static void FL_b (OUTP,width,pvtband) + pointer OUTP; + int width; + mpGeometryBandPtr pvtband; +{ + if (pvtband->int_constant) + action_set(OUTP, width, 0); + else + action_clear(OUTP, width, 0); +} + +#define DO_FL(funcname, iotype, CONST) \ +static void funcname (OUTP,width,pvtband) \ +pointer OUTP; \ +register int width; \ +mpGeometryBandPtr pvtband; \ +{ \ +register iotype constant = (iotype) pvtband->CONST; \ +register iotype *outp = (iotype *) OUTP; \ + \ + for ( ; width > 0; width--) *outp++ = constant; \ +} + +DO_FL (FL_R, RealPixel, flt_constant) +DO_FL (FL_B, BytePixel, int_constant) +DO_FL (FL_P, PairPixel, int_constant) +DO_FL (FL_Q, QuadPixel, int_constant) + +/********************************************************************** +********************** Neareast Neighbor - Separable **************** +**********************************************************************/ + +/* (x,y) separable routines (eg, scale, mirror_x, mirror_y) */ + +static void SL_b (OUTP,srcimg,width,sline,pedpvt,pvtband) + pointer OUTP, *srcimg; + register int width; + int sline; + pGeomDefPtr pedpvt; + mpGeometryBandPtr pvtband; +{ + register int xbeg = pvtband->x_start; + register int xend = pvtband->x_end; + register int *x_locs = pvtband->x_locs; + register LogInt *src = (LogInt *) (srcimg[sline]); + register LogInt *outp = (LogInt *) OUTP; + register LogInt outval, M, fill; + register int i= 0, w; + + fill = (pvtband->int_constant ? ~(LogInt)0 : 0); + + for (w = xbeg >> LOGSHIFT; w > 0; w--, i+=LOGSIZE) *outp++ = fill; + + if (xbeg & LOGMASK) { + outval = BitLeft(fill,LOGSIZE-i); + for (i = xbeg, M=LOGBIT(i) ; M && i <= xend ; LOGRIGHT(M), i++) + if (LOG_tstbit(src,x_locs[i])) + outval |= M; + if (i > xend) { + if (fill) outval |= ~BitLeft(fill,LOGSIZE-i); + i = (i+LOGMASK) & ~LOGMASK; + } + *outp++ = outval; + } + + if ( i <= xend) { + w = (xend - i + 1) >> LOGSHIFT; + for ( ; w > 0; w--, *outp++ = outval) + for (outval = 0, M=LOGLEFT ; M ; LOGRIGHT(M), i++) + if (LOG_tstbit(src,x_locs[i])) + outval |= M; + + for (outval = 0, M=LOGLEFT; i <= xend; LOGRIGHT(M), i++) + if (LOG_tstbit(src,x_locs[i])) + outval |= M; + + if (i & LOGMASK) { + if (fill) outval |= ~BitLeft(fill,LOGSIZE-i); + i = (i+LOGMASK) & ~LOGMASK; + *outp++ = outval; + } + } + for ( ; i < width; i += LOGSIZE) *outp++ = fill; +} + +#define DO_SL(funcname, iotype, CONST) \ +static void funcname (OUTP,srcimg,width,sline,pedpvt,pvtband) \ +register pointer OUTP; \ +register pointer *srcimg; \ +register int width,sline; \ +pGeomDefPtr pedpvt; \ +mpGeometryBandPtr pvtband; \ +{ \ +register int xbeg = pvtband->x_start; \ +register int xend = pvtband->x_end; \ +register int *x_locs = pvtband->x_locs; \ +register iotype constant = (iotype) pvtband->CONST; \ +register iotype *src = (iotype *) (srcimg[sline]); \ +register iotype *outp = (iotype *) OUTP; \ +register int i; \ + for (i=0; i < xbeg; ++i) *outp++ = constant; \ + for ( ; i <= xend; ++i) *outp++ = src[x_locs[i]]; \ + for ( ; i < width; ++i) *outp++ = constant; \ +} + +DO_SL (SL_R, RealPixel, flt_constant) +DO_SL (SL_B, BytePixel, int_constant) +DO_SL (SL_P, PairPixel, int_constant) +DO_SL (SL_Q, QuadPixel, int_constant) + +/********************************************************************** +************************* Bilinear - Seperable ********************** +**********************************************************************/ +#if XIE_FULL + +/* note - could use BiGL_b since this is a silly anyway */ + +static void BiSL_b (OUTP,srcimg,width,sline,pedpvt,pvtband) +pointer OUTP; +pointer *srcimg; +register int width; +int sline; +pGeomDefPtr pedpvt; +mpGeometryBandPtr pvtband; +{ +register double s, t, st, result; +register int isrcpix; +register int *x_locs = pvtband->x_locs; +register double *s_locs = pvtband->s_locs; +register LogInt constant, val, M, *ptrIn, *ptrJn; +register LogInt *outp = (LogInt *) OUTP; +register int srcwidth = pvtband->in_width - 1; + + if ( (sline >= pvtband->hi_src_available) || + (sline < pvtband->lo_src_available) ) { + FL_b(outp, width, pvtband); + return; + } + + t = pvtband->first_mlow; t -= ((int)t); + M=LOGLEFT; val = 0; + constant = pvtband->int_constant; + ptrIn = (LogInt *) srcimg[sline]; + ptrJn = (LogInt *) srcimg[sline+1]; + while ( width > 0 ) { + isrcpix = *x_locs++; + s = *s_locs++; + if ( (isrcpix >= 0) && (isrcpix < srcwidth) ) { + st = s * t; + result = 0.; + if (LOG_tstbit(ptrIn,isrcpix)) result = + ((double)1. - s - t + st); + if (LOG_tstbit(ptrIn,isrcpix+1)) result += (s - st); + if (LOG_tstbit(ptrJn,isrcpix)) result += (t - st); + if (LOG_tstbit(ptrJn,isrcpix+1)) result += st; + if (result > 0.5) val |= M; + } else if (constant) val |= M; + width--; + LOGRIGHT(M); if (!M) { *outp++ = val; M=LOGLEFT; val = 0; } + } + if (M != LOGLEFT) *outp = val; +} + +#define BI_SL(funcname, iotype, CONST, ROUND) \ +static void funcname (OUTP,srcimg,width,sline,pedpvt,pvtband) \ +pointer OUTP; \ +pointer *srcimg; \ +register int width; \ +int sline; \ +pGeomDefPtr pedpvt; \ +mpGeometryBandPtr pvtband; \ +{ \ +register int *x_locs = pvtband->x_locs; \ +register double *s_locs = pvtband->s_locs; \ +register iotype constant = (iotype) pvtband->CONST; \ +register iotype *outp = (iotype *) OUTP; \ +register iotype *src = (iotype *) (srcimg[sline]); \ +register iotype *trc; \ +register int i, j, in_width = pvtband->in_width - 1; \ +register double s, t, st; \ +register iotype val; \ + \ + t = pvtband->first_mlow; t -= ((int)t); \ + if (sline >= pvtband->hi_src_available) \ + trc = src; /* or fill line with constant */ \ + else \ + trc = (iotype *) (srcimg[sline+1]); \ + for (i = 0; i < width; i++) { \ + j = x_locs[i]; \ + s = s_locs[i]; \ + val = constant; \ + if (j >= 0 && j < in_width) { \ + st = s * t; \ + val = src[j] * ((float)1. - s - t + st) + \ + src[j+1] * (s - st) + \ + trc[j] * (t - st) + \ + trc[j+1] * (st) + ROUND; \ + } \ + *outp++ = val; \ + } \ +} + +BI_SL (BiSL_R, RealPixel, flt_constant, (float)0.0) +BI_SL (BiSL_B, BytePixel, int_constant, (float)0.5) +BI_SL (BiSL_P, PairPixel, int_constant, (float)0.5) +BI_SL (BiSL_Q, QuadPixel, int_constant, (float)0.5) +#endif + +/********************************************************************** +********************** Neareast Neighbor - General ****************** +**********************************************************************/ + +/* NOTE: for GL routines, would be better to keep running srcpix, +** and srcline variables outside of scan line routine. +*/ + +static void GL_b (OUTP,srcimg,width,sline,pedpvt,pvtband) +pointer OUTP; +pointer *srcimg; +register int width; +int sline; +pGeomDefPtr pedpvt; +mpGeometryBandPtr pvtband; +{ +register double a = pedpvt->coeffs[0]; +register double c = pedpvt->coeffs[2]; +register double srcpix = a * PIX0 + + pedpvt->coeffs[1] * (pvtband->yOut + PIX0) + + pedpvt->coeffs[4]; +register double srcline = c * PIX0 + + pedpvt->coeffs[3] * (pvtband->yOut + PIX0) + + pedpvt->coeffs[5]; +register int isrcline,isrcpix; +register LogInt constant, val, M, *ptrIn; +register LogInt *outp = (LogInt *) OUTP; +register int srcwidth = pvtband->in_width; +register int minline = pvtband->lo_src_available; +register int maxline = pvtband->hi_src_available; + + + constant = pvtband->int_constant ? ~(LogInt) 0 : 0; + /* could pull out inner if (constant) */ + M=LOGLEFT; val = constant; + while ( width > 0 ) { + /* in our coordinate system, truncate does a round */ + isrcline = srcline; + isrcpix = srcpix; + /* prepare for next loop */ + width--; + srcline += c; + srcpix += a; + /* if (isrcline,isrcpix) not in src image, fill w/val*/ + if ( (isrcline >= minline) && (isrcline <= maxline) ) { + ptrIn = (LogInt *) srcimg[isrcline]; + if ( (isrcpix >= 0) && (isrcpix < srcwidth) && ptrIn ) + if (LOG_chgbit(ptrIn,isrcpix,constant)) + val ^= M; + } + LOGRIGHT(M); if (!M) { *outp++ = val; M=LOGLEFT; val = constant; } + } + if (M != LOGLEFT) *outp = val; +} + + +#define DO_GL(funcname, iotype, CONST) \ +static void funcname (OUTP,srcimg,width,sline,pedpvt,pvtband) \ +pointer OUTP; \ +pointer *srcimg; \ +register int width; \ +int sline; \ +pGeomDefPtr pedpvt; \ +mpGeometryBandPtr pvtband; \ +{ \ +register double a = pedpvt->coeffs[0]; \ +register double c = pedpvt->coeffs[2]; \ +register double srcpix = a * PIX0 + \ + pedpvt->coeffs[1] * (pvtband->yOut + PIX0) + \ + pedpvt->coeffs[4]; \ +register double srcline = c * PIX0 + \ + pedpvt->coeffs[3] * (pvtband->yOut + PIX0) + \ + pedpvt->coeffs[5]; \ +register int isrcline,isrcpix; \ +register iotype constant = (iotype) pvtband->CONST; \ +register iotype *outp = (iotype *) OUTP; \ +register iotype *ptrIn; \ +register iotype val; \ +/* some variables which describe available input data (for clipping) */ \ +register int srcwidth = pvtband->in_width; \ +register int minline = pvtband->lo_src_available; \ +register int maxline = pvtband->hi_src_available; \ + \ + while ( width > 0 ) { \ + isrcline = srcline; \ + isrcpix = srcpix; \ + width--; \ + srcline += c; \ + srcpix += a; \ + val = constant; \ + if ( (isrcline >= minline) && (isrcline <= maxline) ) { \ + ptrIn = (iotype *) srcimg[isrcline]; \ + if ( (isrcpix >= 0) && \ + (isrcpix < srcwidth) && \ + ptrIn ) \ + val = ptrIn[isrcpix]; \ + } \ + *outp++ = val; \ + } \ +} + +DO_GL (GL_R, RealPixel, flt_constant) +DO_GL (GL_B, BytePixel, int_constant) +DO_GL (GL_P, PairPixel, int_constant) +DO_GL (GL_Q, QuadPixel, int_constant) + +/********************************************************************** +************************* Bilinear - General ************************ +**********************************************************************/ +#if XIE_FULL + +static void BiGL_b (OUTP,srcimg,width,sline,pedpvt,pvtband) +pointer OUTP; +pointer *srcimg; +register int width; +int sline; +pGeomDefPtr pedpvt; +mpGeometryBandPtr pvtband; +{ +register float s, t, st, result; +register double a = pedpvt->coeffs[0]; +register double c = pedpvt->coeffs[2]; +register double srcpix = a * PIX0 + + pedpvt->coeffs[1] * (pvtband->yOut + PIX0) + + pedpvt->coeffs[4]; +register double srcline = c * PIX0 + + pedpvt->coeffs[3] * (pvtband->yOut + PIX0) + + pedpvt->coeffs[5]; +register int isrcline,isrcpix; +register LogInt constant, val, M, *ptrIn, *ptrJn; +register LogInt *outp = (LogInt *) OUTP; +register int srcwidth = pvtband->in_width - 1; +register int minline = pvtband->lo_src_available; +register int maxline = pvtband->hi_src_available; + + constant = pvtband->int_constant; + M=LOGLEFT; val = 0; + while ( width > 0 ) { + isrcline = srcline; + isrcpix = srcpix; + if ( (isrcline >= minline) && (isrcline < maxline) ) { + s = srcpix - isrcpix; + t = srcline - isrcline; + ptrIn = (LogInt *) srcimg[isrcline]; + ptrJn = (LogInt *) srcimg[isrcline+1]; + if ( (isrcpix >= 0) && (isrcpix < srcwidth) ) { + st = s * t; + result = 0.; + if (LOG_tstbit(ptrIn,isrcpix)) result = + ((float)1. - s - t + st); + if (LOG_tstbit(ptrIn,isrcpix+1)) result += (s - st); + if (LOG_tstbit(ptrJn,isrcpix)) result += (t - st); + if (LOG_tstbit(ptrJn,isrcpix+1)) result += st; + if (result > (float) 0.5) val |= M; + } else if (constant) val |= M; + } else if (constant) val |= M; + LOGRIGHT(M); if (!M) { *outp++ = val; M=LOGLEFT; val = 0; } + width--; + srcline += c; + srcpix += a; + } + if (M != LOGLEFT) *outp = val; +} + +#define BI_GL(funcname, iotype, CONST, ROUND) \ +static void funcname (OUTP,srcimg,width,sline,pedpvt,pvtband) \ +pointer OUTP; \ +pointer *srcimg; \ +register int width; \ +int sline; \ +pGeomDefPtr pedpvt; \ +mpGeometryBandPtr pvtband; \ +{ \ +register float s, t, st; \ +register double a = pedpvt->coeffs[0]; \ +register double c = pedpvt->coeffs[2]; \ +register double srcpix = a * PIX0 + \ + pedpvt->coeffs[1] * (pvtband->yOut + PIX0) + \ + pedpvt->coeffs[4]; \ +register double srcline = c * PIX0 + \ + pedpvt->coeffs[3] * (pvtband->yOut + PIX0) + \ + pedpvt->coeffs[5]; \ +register int isrcline,isrcpix; \ +register iotype constant = (iotype) pvtband->CONST; \ +register iotype *outp = (iotype *) OUTP; \ +register iotype *ptrIn, *ptrJn; \ +register iotype val; \ +/* some variables which describe available input data (for clipping) */ \ +register int srcwidth = pvtband->in_width - 1; \ +register int minline = pvtband->lo_src_available; \ +register int maxline = pvtband->hi_src_available; \ + \ + /* in our coordinate system, truncate does a round */ \ + while ( width > 0 ) { \ + isrcline = srcline; \ + isrcpix = srcpix; /* no fpu?, move down in 'if' */ \ + val = constant; \ + if ( (isrcline >= minline) && (isrcline < maxline) ) { \ + s = srcpix - isrcpix; \ + ptrIn = (iotype *) srcimg[isrcline]; \ + t = srcline - isrcline; \ + ptrJn = (iotype *) srcimg[isrcline+1]; \ + st = s * t; \ + if ( (isrcpix >= 0) && (isrcpix < srcwidth) ) \ + val = \ + ptrIn[isrcpix] * ((float)1. - s - t + st) + \ + ptrIn[isrcpix+1] * (s - st) + \ + ptrJn[isrcpix] * (t - st) + \ + ptrJn[isrcpix+1] * (st) + ROUND; \ + } \ + /* prepare for next loop */ \ + width--; \ + srcline += c; \ + srcpix += a; \ + *outp++ = val; \ + } \ +} + +BI_GL (BiGL_R, RealPixel, flt_constant, (float)0.0) +BI_GL (BiGL_B, BytePixel, int_constant, (float)0.5) +BI_GL (BiGL_P, PairPixel, int_constant, (float)0.5) +BI_GL (BiGL_Q, QuadPixel, int_constant, (float)0.5) +#endif +/**********************************************************************/ + +/* end module mpgeomnn.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/mphist.c b/xie/xc/programs/Xserver/XIE/mixie/process/mphist.c new file mode 100644 index 0000000..851bea0 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/mphist.c @@ -0,0 +1,568 @@ +/* $XConsortium: mphist.c,v 1.4 94/04/17 20:35:20 rws Exp $ */ +/**** module mphist.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mphist.c -- DDXIE match histogram element + + Larry Hare -- AGE Logic, Inc. August, 1993 + +*****************************************************************************/ + +#define _XIEC_MPHIST +#define _XIEC_PHIST + +/* + * Include files + */ +#include +#include +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +/* routines referenced by other DDXIE modules + */ +int miAnalyzeMatchHist(); + +/* routines used internal to this module + */ +static int CreateMatchHist(); +static int InitializeMatchHist(); +static int ActivateMatchHist(); +static int ResetMatchHist(); +static int DestroyMatchHist(); + +/* DDXIE Match Histogram entry points + */ +static ddElemVecRec MatchHistVec = { + CreateMatchHist, + InitializeMatchHist, + ActivateMatchHist, + (xieIntProc)NULL, + ResetMatchHist, + DestroyMatchHist + }; + +/* declarations for private structures and actions procs ... */ + +typedef RealPixel MatchFloat; + +static void match_hist(), flat_pdf(), gauss_pdf(), hyper_pdf(); + +typedef struct { + CARD32 histphase; + CARD32 histsize; + CARD32 *histdata; + void (*histproc) (); + void (*lutproc) (); +} miMatchHistRec, *miMatchHistPtr; + +static void doHistQ(), doHistP(), doHistB(); +static void doLutQ(), doLutP(), doLutB(); + + +/*------------------------------------------------------------------------ +------------------- see if we can handle this element -------------------- +------------------------------------------------------------------------*/ +int miAnalyzeMatchHist(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* for now just stash our entry point vector in the peDef */ + ped->ddVec = MatchHistVec; + + return TRUE; +} + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateMatchHist(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* attach an execution context to the photo element definition */ + + /* always force syncing between inputs (is nop if only one input) */ + return MakePETex(flo, ped, sizeof(miMatchHistRec), SYNC, NO_SYNC); +} + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeMatchHist(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + receptorPtr rcp = pet->receptor; + bandPtr iband; + CARD32 nclip; + xieFloMatchHistogram *raw = (xieFloMatchHistogram *)ped->elemRaw; + miMatchHistPtr pvt = (miMatchHistPtr)(pet->private); + + iband = &(pet->receptor[SRCtag].band[0]); + + SetDepthFromLevels(iband->format->levels,nclip); nclip = 1 << nclip; + + switch (iband->format->class) { + case QUAD_PIXEL: pvt->histproc = doHistQ; + pvt->lutproc = doLutQ; + break; + case PAIR_PIXEL: pvt->histproc = doHistP; + pvt->lutproc = doLutP; + break; + case BYTE_PIXEL: pvt->histproc = doHistB; + pvt->lutproc = doLutB; + break; + default: ImplementationError(flo, ped, return(FALSE)); + } + + pvt->histphase = 1; + pvt->histsize = nclip; + if (!(pvt->histdata = (CARD32 *) XieCalloc(nclip * sizeof(CARD32)))) + AllocError(flo,ped,return(FALSE)); + + return InitReceptor(flo,ped,&rcp[SRCt1],NO_DATAMAP,1,1,NO_BANDS) && + InitProcDomain(flo, ped, raw->domainPhototag, + raw->domainOffsetX, raw->domainOffsetY) && + InitEmitter(flo,ped,NO_DATAMAP,SRCt1); +} + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +static int ActivateMatchHist(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + xieFloMatchHistogram *raw = (xieFloMatchHistogram *)ped->elemRaw; + miMatchHistPtr pvt = (miMatchHistPtr)(pet->private); + receptorPtr rcp = pet->receptor; + bandPtr sbnd = &rcp->band[0]; + bandPtr dbnd = &pet->emitter[0]; + + + if (pvt->histphase == 1) { + pointer src; + + src = GetCurrentSrc(flo,pet,sbnd); + while(!ferrCode(flo) && src && SyncDomain(flo,ped,sbnd,KEEP)) { + INT32 x = 0, dx; + while (dx = GetRun(flo,pet,sbnd)) { + if (dx > 0) { + (*(pvt->histproc)) (src,pvt->histdata,pvt->histsize,x,dx); + x += dx; /* nhist += dx; */ + } else + x -= dx; + } + src = GetNextSrc(flo,pet,sbnd,KEEP); + } + + /* Is it time to switch to phase2 */ + if (src || !sbnd->final) { + /* + Since we are keeping data for the second pass, we need to + keep incrementing the threshold so that we won't get activated + until new data is available. + */ + SetBandThreshold(sbnd, sbnd->current + 1); + return (TRUE); + } + pvt->histphase = 2; + } + + /* finished with accumulation, figure out desired LUT */ + if (pvt->histphase == 2) { + + CARD32 nlev = sbnd->format->levels; + CARD32 nclip = pvt->histsize; + MatchFloat *pdfdata, pdftemp[256]; + + + /* + ** NOTE: Could try to maintain for longer periods of time, + ** OR could try to put on stack for small sizes. + */ + if (nclip <= 256) + pdfdata = &pdftemp[0]; + else if (!(pdfdata = (MatchFloat *) + XieMalloc(nclip*sizeof(MatchFloat)))) + AllocError(flo,ped,return(FALSE)); + + /* generate LUT based on match curve type */ + switch (raw->shape) { + case xieValHistogramFlat: + flat_pdf(NULL, pdfdata, nlev); + break; + case xieValHistogramGaussian: + gauss_pdf((pTecHistogramGaussianDefPtr)ped->techPvt, + pdfdata, nlev); + break; + case xieValHistogramHyperbolic: + hyper_pdf((pTecHistogramHyperbolicDefPtr)ped->techPvt, + pdfdata, nlev); + break; + default: + if (nclip > 256) (void) XieFree(pdfdata); + ImplementationError(flo, ped, return(FALSE)); + } + + /* match the histogram and the new shape */ + match_hist(pvt->histdata, pdfdata, nlev); + + if (nclip > 256) (void) XieFree(pdfdata); + + + if (nclip > nlev) { + /* zero tail entries, then mask instead of compare input pixels */ + bzero(pvt->histdata + nlev, (nclip - nlev) * sizeof(CARD32)); + } + + /* Reset src to start from scratch. + ** The domain automatically resyncs in the SyncDomain call. + */ + (void) GetSrc(flo,pet,sbnd,0,KEEP); + pvt->histphase = 3; + } + /* now processing to create actual outputs */ + if (pvt->histphase == 3) { + pointer src, dst; + + src = GetCurrentSrc(flo,pet,sbnd); + dst = GetCurrentDst(flo,pet,dbnd); + while(!ferrCode(flo) && src && dst && SyncDomain(flo,ped,dbnd,FLUSH)) { + INT32 x = 0, dx; + if (src != dst) memcpy (dst, src, dbnd->pitch); + while (dx = GetRun(flo,pet,dbnd)) { + if (dx > 0) { + (*(pvt->lutproc)) (dst,pvt->histdata,pvt->histsize,x,dx); + x += dx; /* nhist += dx; */ + } else + x -= dx; + } + src = GetNextSrc(flo,pet,sbnd,FLUSH); + dst = GetNextDst(flo,pet,dbnd,FLUSH); + } + FreeData(flo,pet,sbnd,sbnd->current); + + /* when dbnd->final goes true, we are done */ + } + return TRUE; +} + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetMatchHist(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + miMatchHistPtr pvt = (miMatchHistPtr)(ped->peTex->private); + if (pvt && pvt->histdata) + pvt->histdata = (CARD32 *) XieFree(pvt->histdata); + + ResetReceptors(ped); + ResetEmitter(ped); + + return TRUE; +} + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyMatchHist(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc) NULL; + ped->ddVec.initialize = (xieIntProc) NULL; + ped->ddVec.activate = (xieIntProc) NULL; + ped->ddVec.reset = (xieIntProc) NULL; + ped->ddVec.destroy = (xieIntProc) NULL; + + return TRUE; +} + + +/*------------------------------------------------------------------------ +------------------------ action procs to do histogram -------------------- +------------------------------------------------------------------------*/ + +/* +** NOTE: Consider revamping Export Client Histogram to not use +** 'pvt' structure so that more sharing of code (and thus potential +** future optimizations) is possible. +*/ + +static void +doHistQ(svoid,hist,clip,x,dx) + pointer svoid; + CARD32 *hist, clip, x, dx; +{ + QuadPixel *src = (QuadPixel *) svoid; + + for ( src += x, clip -= 1; dx > 0 ; dx--) + hist[*src++ & clip]++; +} + +static void +doHistP(svoid,hist,clip,x,dx) + pointer svoid; + CARD32 *hist, clip, x, dx; +{ + PairPixel *src = (PairPixel *) svoid; + + for ( src += x, clip -= 1; dx > 0 ; dx--) + hist[*src++ & clip]++; +} + +static void +doHistB(svoid,hist,clip,x,dx) + pointer svoid; + CARD32 *hist, clip, x, dx; +{ + BytePixel *src = (BytePixel *) svoid; + + for ( src += x, clip -= 1; dx > 0 ; dx--) + hist[*src++ & clip]++; +} + + + +/*------------------------------------------------------------------------ +------------------------ action procs to process lut -------------------- +------------------------------------------------------------------------*/ + +static void +doLutQ(dvoid,lut,clip,x,dx) + pointer dvoid; + CARD32 *lut, clip, x, dx; +{ + QuadPixel *dst = (QuadPixel *) dvoid; + + for ( dst += x, clip -= 1; dx > 0 ; dx--, dst++) + *dst = lut[*dst & clip]; +} + +static void +doLutP(dvoid,lut,clip,x,dx) + pointer dvoid; + CARD32 *lut, clip, x, dx; +{ + PairPixel *dst = (PairPixel *) dvoid; + + for ( dst += x, clip -= 1; dx > 0 ; dx--, dst++) + *dst = lut[*dst & clip]; +} + +static void +doLutB(dvoid,lut,clip,x,dx) + pointer dvoid; + CARD32 *lut, clip, x, dx; +{ + BytePixel *dst = (BytePixel *) dvoid; + + for ( dst += x, clip -= 1; dx > 0 ; dx--, dst++) + *dst = lut[*dst & clip]; +} + + +/*------------------------------------------------------------------------ +-------------------------- process matching curves ----------------------- +------------------------------------------------------------------------*/ + + +static void +match_hist(hptr, pdf, nlev) + CARD32 *hptr; + MatchFloat *pdf; + CARD32 nlev; +{ + double sum, sf; + MatchFloat match, closest, delta; + CARD32 ilev, jlev, plev, hsum; + + /* sum up the probability curve distribution */ + for (sum=0., ilev = 0; ilev < nlev; ilev++) + sum += pdf[ilev]; + + /* normalize and accumulate the pdf */ + sf = 1.0 / (sum ? sum : 1.0); + for (sum=0., ilev = 0; ilev < nlev; ilev++) { + sum += pdf[ilev]; + pdf[ilev] = sum * sf; + } + + /* count up the histogram entries */ + for (hsum=0, ilev = 0; ilev < nlev ; ilev++) { + hsum += hptr[ilev]; + } + + /* match the histogram and the new shape */ + sf = 1.0 / (double) (hsum ? hsum : 1.0); + for (ilev=0, plev=0, hsum=0; ilev < nlev ; ilev++) { + hsum += hptr[ilev]; + match = (MatchFloat) hsum * sf; /* normalize, accumulate */ + + /* search forwards to find closest match */ + for (jlev = plev, closest = 99.0 ; jlev < nlev ; jlev++) { + + delta = match - pdf[jlev]; + if (delta < 0.) delta = -delta; + + if (delta == 0.) {jlev++; break; } + else if (delta < closest) closest = delta; + else if (delta > closest) break; + } + hptr[ilev] = plev = jlev - 1; + } +} + +static void +flat_pdf(raw, pdf, nlev) + pTecHistogramGaussianDefPtr raw; + MatchFloat *pdf; + CARD32 nlev; +{ + CARD32 ilev; + double sf = 1.0 / (double) nlev; + + for (ilev = 0; ilev < nlev; ilev++) + *pdf++ = sf; +} + +static void +gauss_pdf(raw, pdf, nlev) + pTecHistogramGaussianDefPtr raw; + MatchFloat *pdf; + CARD32 nlev; +{ + CARD32 ilev; + double mean, sigma, a, b, xx; + + mean = raw->mean; + sigma = raw->sigma; + + a = 1.0 / sqrt ( 2.0 * M_PI ); /* .39894228 ..... */ + b = 2.0 * sigma * sigma; + + for (ilev = 0; ilev < nlev; ilev++) { + xx = (double) ilev - mean; + pdf[ilev] = a * exp( - (xx * xx) / b); + } +} + +static void +hyper_pdf(raw, pdf, nlev) + pTecHistogramHyperbolicDefPtr raw; + MatchFloat *pdf; + CARD32 nlev; +{ + CARD32 ilev; + BOOL sf; + double cnst, lg; + + + sf = raw->shapeFactor; + cnst = raw->constant; + lg = log(1.0 + 1.0 / cnst); + + for (ilev = 0; ilev < nlev; ilev++) + pdf[ilev] = 1.0 / (((double)(sf ? nlev-1-ilev : ilev) + cnst) * lg); +} + +/* end module mphist.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/mplogic.c b/xie/xc/programs/Xserver/XIE/mixie/process/mplogic.c new file mode 100644 index 0000000..cb086fb --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/mplogic.c @@ -0,0 +1,814 @@ +/* $XConsortium: mplogic.c,v 1.8 94/04/17 20:35:21 rws Exp $ */ +/**** module mplogic.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mplogic.c -- DDXIE logic element + + Larry Hare -- AGE Logic, Inc. July, 1993 + +*****************************************************************************/ + + +#define _XIEC_MPLOGIC +#define _XIEC_PLOGIC + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeLogic(); + +/* + * routines used internal to this module + */ +static int CreateLogic(); +static int InitializeLogic(); +static int ResetLogic(); +static int DestroyLogic(); + +static int ActivateLogicM(); +static int ActivateLogicD(); +static int ActivateLogicMROI(); +static int ActivateLogicDROI(); + +/* + * DDXIE Logic entry points + */ +static ddElemVecRec LogicVec = { + CreateLogic, + InitializeLogic, + ActivateLogicM, + (xieIntProc)NULL, + ResetLogic, + DestroyLogic + }; + +/* + * Local Declarations. + */ + +typedef struct _mplogicdef { + void (*action) (); + void (*action2) (); + CARD32 cnst; + CARD32 endrun; + CARD32 endix; +} mpLogicPvtRec, *mpLogicPvtPtr; + +#define SHIFT_FROM_LEVELS(shift,levels) \ +{ CARD32 _lev = levels; \ + shift = _lev <= 256 ? (_lev <= 2 ? 0 : 3 ) : (_lev <=65536 ? 4 : 5); \ +} + +static CARD32 rep_cnst(); + +/* +** NOTE: might change over to use mergerops (see mfb/mergerop.h) +** NOTE: might change constant operations to use dyads with prefilled +** constant strip; this would slow them down, but would +** conserve code space. +*/ + +/*------------------------------------------------------------------------ +------------------------ fill in the vector --------------------------- +------------------------------------------------------------------------*/ +int miAnalyzeLogic(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ped->ddVec = LogicVec; + return TRUE; +} + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateLogic(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* always force syncing between inputs (is nop if only one input) */ + return MakePETex(flo,ped, + xieValMaxBands * sizeof(mpLogicPvtRec), + SYNC, /* InSync: Make sure ROI exists first */ + NO_SYNC /* bandSync: see CreateLogic */ + ); +} + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ + +static int ActivateLogicM(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpLogicPvtPtr pvt = (mpLogicPvtPtr) pet->private; + int band, nbands = pet->receptor[SRCt1].inFlo->bands; + bandPtr sband = &(pet->receptor[SRCt1].band[0]); + bandPtr dband = &(pet->emitter[0]); + + for(band = 0; band < nbands; band++, pvt++, sband++, dband++) { + int pitch = sband->format->pitch; /* bits */ + LogInt *svoid, *dvoid; + + if (!(svoid = (LogInt*)GetCurrentSrc(flo,pet,sband)) || + !(dvoid = (LogInt*)GetCurrentDst(flo,pet,dband))) continue; + + do { + (*(pvt->action)) (dvoid, svoid, pvt->cnst, pitch); + svoid = (LogInt*)GetNextSrc(flo,pet,sband,FLUSH); + dvoid = (LogInt*)GetNextDst(flo,pet,dband,FLUSH); + } while (!ferrCode(flo) && svoid && dvoid) ; + + FreeData(flo, pet, sband, sband->current); + } + return TRUE; +} + +static int ActivateLogicD(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpLogicPvtPtr pvt = (mpLogicPvtPtr) pet->private; + int band, nbands = pet->receptor[SRCt1].inFlo->bands; + bandPtr sband = &(pet->receptor[SRCt1].band[0]); + bandPtr tband = &(pet->receptor[SRCt2].band[0]); + bandPtr dband = &(pet->emitter[0]); + + for(band = 0; band < nbands; band++, pvt++, sband++, tband++, dband++) { + LogInt *svoid, *tvoid, *dvoid; + + if (!(svoid = (LogInt*)GetCurrentSrc(flo,pet,sband)) || + !(tvoid = (LogInt*)GetCurrentSrc(flo,pet,tband)) || + !(dvoid = (LogInt*)GetCurrentDst(flo,pet,dband)) ) continue; + + do { + /* This is the code that might rather utilize INPLACE */ + (*(pvt->action)) (dvoid, svoid, tvoid, pvt->endix); + if (pvt->action2) + (*(pvt->action2)) (dvoid, svoid, pvt->endrun, pvt->endix); + svoid = (LogInt*)GetNextSrc(flo,pet,sband,FLUSH); + tvoid = (LogInt*)GetNextSrc(flo,pet,tband,FLUSH); + dvoid = (LogInt*)GetNextDst(flo,pet,dband,FLUSH); + } while (!ferrCode(flo) && svoid && tvoid && dvoid) ; + + if(!svoid && sband->final) /* when sr1 runs out, kill sr2 too */ + DisableSrc(flo,pet,tband,FLUSH); + else if(!tvoid && tband->final) /* when sr2 runs out, pass-thru sr1 */ + BypassSrc(flo,pet,sband); + else { /* both inputs still active, keep the scheduler up to date */ + FreeData(flo,pet,sband,sband->current); + FreeData(flo,pet,tband,tband->current); + } + } + return TRUE; +} + +static int ActivateLogicMROI(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpLogicPvtPtr pvt = (mpLogicPvtPtr) pet->private; + int band, nbands = pet->receptor[SRCt1].inFlo->bands; + bandPtr sband = &(pet->receptor[SRCt1].band[0]); + bandPtr dband = &(pet->emitter[0]); + + for(band = 0; band < nbands; band++, pvt++, sband++, dband++) { + pointer svoid, dvoid; + CARD32 shift; + + if (!(svoid = GetCurrentSrc(flo,pet,sband)) || + !(dvoid = GetCurrentDst(flo,pet,dband))) continue; + + SHIFT_FROM_LEVELS(shift, dband->format->levels) + + while (!ferrCode(flo) && svoid && dvoid && + SyncDomain(flo,ped,dband,FLUSH)) { + INT32 run, ix = 0; + + if (svoid != dvoid) memcpy(dvoid, svoid, dband->pitch); + + while (run = GetRun(flo,pet,dband)) { + if (run > 0) { + (*(pvt->action)) (dvoid, pvt->cnst, + run << shift, ix << shift); + ix += run; + } else + ix -= run; + } + svoid = GetNextSrc(flo,pet,sband,FLUSH); + dvoid = GetNextDst(flo,pet,dband,FLUSH); + } + + FreeData(flo, pet, sband, sband->current); + } + return TRUE; +} + +static int ActivateLogicDROI(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpLogicPvtPtr pvt = (mpLogicPvtPtr) pet->private; + int band, nbands = pet->receptor[SRCt1].inFlo->bands; + bandPtr sband = &(pet->receptor[SRCt1].band[0]); + bandPtr tband = &(pet->receptor[SRCt2].band[0]); + bandPtr dband = &(pet->emitter[0]); + + for(band = 0; band < nbands; band++, pvt++, sband++, tband++, dband++) { + pointer svoid, tvoid, dvoid; + CARD32 shift, w; + + w = sband->format->width; + if (w > tband->format->width) w = tband->format->width; + + if (!(svoid = GetCurrentSrc(flo,pet,sband)) || + !(tvoid = GetCurrentSrc(flo,pet,tband)) || + !(dvoid = GetCurrentDst(flo,pet,dband))) continue; + + SHIFT_FROM_LEVELS(shift, dband->format->levels) + + while (!ferrCode(flo) && svoid && tvoid && dvoid && + SyncDomain(flo,ped,dband,FLUSH)) { + INT32 run, ix = 0; + + if (svoid != dvoid) memcpy(dvoid, svoid, dband->pitch); + + while (run = GetRun(flo,pet,dband)) { + if (run > 0) { + /* needs to clip to second source, yuck */ + if ((ix + run) > w) { + if (ix < w) (*(pvt->action)) (dvoid, tvoid, + (w-ix) << shift, ix << shift); + break; + } + (*(pvt->action)) (dvoid, tvoid, run << shift, ix << shift); + ix += run; + } else + ix -= run; + } + svoid = GetNextSrc(flo,pet,sband,FLUSH); + tvoid = GetNextSrc(flo,pet,tband,FLUSH); + dvoid = GetNextDst(flo,pet,dband,FLUSH); + } + + if(!svoid && sband->final) /* when sr1 runs out, kill sr2 too */ + DisableSrc(flo,pet,tband,FLUSH); + else if(!tvoid && tband->final) /* when sr2 runs out, pass-thru sr1 */ + BypassSrc(flo,pet,sband); + else { /* both inputs still active, keep the scheduler up to date */ + FreeData(flo,pet,sband,sband->current); + FreeData(flo,pet,tband,tband->current); + } + } + return TRUE; +} + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetLogic(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ResetReceptors(ped); + ResetProcDomain(ped); + ResetEmitter(ped); + return TRUE; +} + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyLogic(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc)NULL; + ped->ddVec.initialize = (xieIntProc)NULL; + ped->ddVec.activate = (xieIntProc)NULL; + ped->ddVec.reset = (xieIntProc)NULL; + ped->ddVec.destroy = (xieIntProc)NULL; + + return TRUE; +} + +/*------------------------------------------------------------------------ +--------------------- Lotsa Little Action Routines --------------------- +------------------------------------------------------------------------*/ + +/* NOTE: would be nice to use mfb/mergerop.h. beware though. the roles +** of dst, and source are somewhat reversed. This will be almost +** necessary if we choose to support mismatched levels, and should make +** it simpler to make fine tuned assembly or C code. +*/ + +/* M: (*(pvt->action)) (dvoid, svoid, pvt->cnst, bw); */ +/* D: (*(pvt->action)) (dvoid, svoid, tvoid, bw); */ + +#define MakeM1(name, op) \ +static void name(d,src1,con,bits) \ + LogInt *d, *src1, con; \ + CARD32 bits; \ +{ \ + CARD32 w = (bits + LOGSIZE - 1) / LOGSIZE; \ + while (w >= 4) { *d++ = op; *d++ = op; \ + *d++ = op; *d++ = op; w -= 4; } \ + switch (w) { \ + case 3: *d++ = op; \ + case 2: *d++ = op; \ + case 1: *d = op; \ + default: break; \ + } \ +} + +#define MakeM2(name, rev, op) \ +static void name(d,src1,con,bits) \ + LogInt *d, *src1, con; \ + CARD32 bits; \ +{ \ + CARD32 w = (bits + LOGSIZE - 1) / LOGSIZE; \ + LogInt A, B, C, D; \ + while (w >= 4) { \ + A = *src1++; B = *src1++; C = *src1++; D = *src1++; \ + *d++ = (rev A) op; *d++ = (rev B) op; \ + *d++ = (rev C) op; *d++ = (rev D) op; w -= 4; \ + } \ + switch (w) { \ + case 3: A = *src1++; *d++ = (rev A) op; \ + case 2: A = *src1++; *d++ = (rev A) op; \ + case 1: A = *src1; *d = (rev A) op; \ + default: break; \ + } \ +} + +#define MakeD1(dname, mname) \ +static void dname(d,src1,src2,bits) \ + LogInt *d, *src1, *src2; \ + CARD32 bits; \ +{ \ + mname (d, src2, 0, bits); \ +} + +#define MakeD2(name, rev, op) \ +static void name(d,src1,src2,bits) \ + LogInt *d, *src1, *src2; \ + CARD32 bits; \ +{ \ + CARD32 w = (bits + LOGSIZE - 1) / LOGSIZE; \ + LogInt A, B, C, D, E, F, G, H; \ + while (w >= 4) { \ + A = src1[0]; B = src1[1]; C = src1[2]; D = src1[3]; src1 += 4; \ + E = src2[0]; F = src2[1]; G = src2[2]; H = src2[3]; src2 += 4; \ + d[0] = (rev A) op E; d[1] = (rev B) op F; \ + d[2] = (rev C) op G; d[3] = (rev D) op H; w -= 4; d += 4; \ + } \ + switch (w) { \ + case 3: A = *src1++; E = *src2++; *d++ = (rev A) op E; \ + case 2: A = *src1++; E = *src2++; *d++ = (rev A) op E; \ + case 1: A = *src1; E = *src2++; *d = (rev A) op E; \ + default: break; \ + } \ +} + +#define NaDa + +MakeM1 (mono_clear, (LogInt) 0) +MakeM2 (mono_and, NaDa, & con) +MakeM2 (mono_andrev, ~, & con) +MakeM1 (mono_copy, con) +MakeM2 (mono_andinv, NaDa, & ~con) +MakeM2 (mono_noop, NaDa, NaDa) +MakeM2 (mono_xor, NaDa, ^ con) +MakeM2 (mono_or, NaDa, | con) +MakeM2 (mono_nor, ~, & ~con) +MakeM2 (mono_equiv, NaDa, ^ ~con) +MakeM2 (mono_invert, ~, NaDa) +MakeM2 (mono_orrev, ~, | con) +MakeM1 (mono_copyinv, ~con) +MakeM2 (mono_orinv, NaDa, | ~con) +MakeM2 (mono_nand, ~, | ~con) +MakeM1 (mono_set, ~(LogInt) 0) + +#define dyad_clear mono_clear +MakeD2 (dyad_and, NaDa, & ) +MakeD2 (dyad_andrev, ~, & ) +MakeD1 (dyad_copy, mono_noop) +MakeD2 (dyad_andinv, NaDa, & ~) +#define dyad_noop mono_noop +MakeD2 (dyad_xor, NaDa, ^ ) +MakeD2 (dyad_or, NaDa, | ) +MakeD2 (dyad_nor, ~, & ~) +MakeD2 (dyad_equiv, NaDa, ^ ~) +#define dyad_invert mono_invert +MakeD2 (dyad_orrev, ~, | ) +MakeD1 (dyad_copyinv, mono_invert) +MakeD2 (dyad_orinv, NaDa, | ~) +MakeD2 (dyad_nand, ~, | ~) +#define dyad_set mono_set + +static void (*action_mono[16])() = { + mono_clear, mono_and, mono_andrev, mono_copy, + mono_andinv, mono_noop, mono_xor, mono_or, + mono_nor, mono_equiv, mono_invert, mono_orrev, + mono_copyinv, mono_orinv, mono_nand, mono_set +}; +static void (*action_dyad[16])() = { + dyad_clear, dyad_and, dyad_andrev, dyad_copy, + dyad_andinv, dyad_noop, dyad_xor, dyad_or, + dyad_nor, dyad_equiv, dyad_invert, dyad_orrev, + dyad_copyinv, dyad_orinv, dyad_nand, dyad_set +}; + +/*------------------------------------------------------------------------ +--------------------- ROI operations work on subranges ------------------ +------------------------------------------------------------------------*/ + +/* MROI: (*(pvt->action)) (dvoid, pvt->cnst, run, ix); */ +/* DROI: (*(pvt->action)) (dvoid, src2, run, ix); */ + +#define MakeROIM1(name, op) \ +static void name(d,con,run,ix) \ + LogInt *d, con; \ + CARD32 run, ix; \ +{ \ + LogInt D, M; \ + CARD32 sbit = ix & LOGMASK; \ + d += (ix >>= LOGSHIFT); \ + if (sbit + run >= LOGSIZE) { \ + if (sbit) { \ + M = BitRight(LOGONES,sbit); run -= (LOGSIZE - sbit); \ + D = *d; *d = (D & ~M) | (op & M); d++; \ + } \ + for (sbit = run >> LOGSHIFT; sbit > 0; sbit--, d++ ) { \ + *d = op; \ + } \ + if (run &= LOGMASK) { \ + M = ~BitRight(LOGONES,run); \ + D = *d; *d = (D & ~M) | (op & M); \ + } \ + } else { \ + M = BitRight(LOGONES,sbit) & ~(BitRight(LOGONES,sbit+run)); \ + D = *d; *d = (D & ~M) | (op & M); \ + } \ +} + +#define MakeROIM2(name, rev, op) \ +static void name(d,con,run,ix) \ + LogInt *d, con; \ + CARD32 run, ix; \ +{ \ + LogInt D, M; \ + CARD32 sbit = ix & LOGMASK; \ + d += (ix >>= LOGSHIFT); \ + if (sbit + run >= LOGSIZE) { \ + if (sbit) { \ + M = BitRight(LOGONES,sbit); run -= (LOGSIZE - sbit); \ + D = *d; *d = (D & ~M) | (((rev D) op) & M); d++; \ + } \ + for (sbit = run >> LOGSHIFT; sbit > 0; sbit--, d++ ) { \ + *d = (rev *d) op; \ + } \ + if (run &= LOGMASK) { \ + M = ~BitRight(LOGONES,run); \ + D = *d; *d = (D & ~M) | (((rev D) op) & M); \ + } \ + } else { \ + M = BitRight(LOGONES,sbit) & ~(BitRight(LOGONES,sbit+run)); \ + D = *d; *d = (D & ~M) | (((rev D) op) & M); d++; \ + } \ +} + +#define MakeROIM3(name) \ +static void name(d,con,run,ix) \ + LogInt *d, con; \ + CARD32 run, ix; \ +{ \ + return; /* NoOp */ \ +} + +#define MakeROID1(name, op) \ +static void name(d,src2,run,ix) \ + LogInt *d, *src2; \ + CARD32 run, ix; \ +{ \ + LogInt D, M; \ + CARD32 sbit = ix & LOGMASK; \ + ix >>= LOGSHIFT; d += ix; src2 += ix; \ + if (sbit + run >= LOGSIZE) { \ + if (sbit) { \ + M = BitRight(LOGONES,sbit); run -= (LOGSIZE - sbit); \ + D = *d; *d = (D & ~M) | ((op *src2++) & M); d++; \ + } \ + for (sbit = run >> LOGSHIFT; sbit > 0; sbit--, d++, src2++ ) { \ + *d = op *src2; \ + } \ + if (run &= LOGMASK) { \ + M = ~BitRight(LOGONES,run); \ + D = *d; *d = (D & ~M) | ((op *src2) & M); \ + } \ + } else { \ + M = BitRight(LOGONES,sbit) & ~(BitRight(LOGONES,sbit+run)); \ + D = *d; *d = (D & ~M) | ((op *src2) & M); \ + } \ +} + +#define MakeROID2(name, rev, op) \ +static void name(d,src2,run,ix) \ + LogInt *d, *src2; \ + CARD32 run, ix; \ +{ \ + LogInt D, M; \ + CARD32 sbit = ix & LOGMASK; \ + ix >>= LOGSHIFT; d += ix; src2 += ix; \ + if (sbit + run >= LOGSIZE) { \ + if (sbit) { \ + M = BitRight(LOGONES,sbit); run -= (LOGSIZE - sbit); \ + D = *d; *d = (D & ~M) | (((rev D) op *src2++) & M); d++; \ + } \ + for (sbit = run >> LOGSHIFT; sbit > 0; sbit--, d++, src2++ ) { \ + *d = (rev *d) op *src2; \ + } \ + if (run &= LOGMASK) { \ + M = ~BitRight(LOGONES,run); \ + D = *d; *d = (D & ~M) | (((rev D) op *src2) & M); \ + } \ + } else { \ + M = BitRight(LOGONES,sbit) & ~(BitRight(LOGONES,sbit+run)); \ + D = *d; *d = (D & ~M) | (((rev D) op *src2) & M); \ + } \ +} + +MakeROIM1 (mroi_clear, (LogInt) 0) +MakeROIM2 (mroi_and, NaDa, & con) +MakeROIM2 (mroi_andrev, ~, & con) +MakeROIM1 (mroi_copy, con) +MakeROIM2 (mroi_andinv, NaDa, & ~con) +MakeROIM3 (mroi_noop ) +MakeROIM2 (mroi_xor, NaDa, ^ con) +MakeROIM2 (mroi_or, NaDa, | con) +MakeROIM2 (mroi_nor, ~, & ~con) +MakeROIM2 (mroi_equiv, NaDa, ^ ~con) +MakeROIM2 (mroi_invert, ~, NaDa) +MakeROIM2 (mroi_orrev, ~, | con) +MakeROIM1 (mroi_copyinv, ~con) +MakeROIM2 (mroi_orinv, NaDa, | ~con) +MakeROIM2 (mroi_nand, ~, | ~con) +MakeROIM1 (mroi_set, ~(LogInt) 0) + +#define droi_clear mroi_clear +MakeROID2 (droi_and, NaDa, & ) +MakeROID2 (droi_andrev, ~, & ) +MakeROID1 (droi_copy, NaDa) +MakeROID2 (droi_andinv, NaDa, & ~) +#define droi_noop mroi_noop +MakeROID2 (droi_xor, NaDa, ^ ) +MakeROID2 (droi_or, NaDa, | ) +MakeROID2 (droi_nor, ~, & ~) +MakeROID2 (droi_equiv, NaDa, ^ ~) +#define droi_invert mroi_invert +MakeROID2 (droi_orrev, ~, | ) +MakeROID1 (droi_copyinv, ~) +MakeROID2 (droi_orinv, NaDa, | ~) +MakeROID2 (droi_nand, ~, | ~) +#define droi_set mroi_set + +static void (*action_monoROI[16])() = { + mroi_clear, mroi_and, mroi_andrev, mroi_copy, + mroi_andinv, mroi_noop, mroi_xor, mroi_or, + mroi_nor, mroi_equiv, mroi_invert, mroi_orrev, + mroi_copyinv, mroi_orinv, mroi_nand, mroi_set +}; +static void (*action_dyadROI[16])() = { + droi_clear, droi_and, droi_andrev, droi_copy, + droi_andinv, droi_noop, droi_xor, droi_or, + droi_nor, droi_equiv, droi_invert, droi_orrev, + droi_copyinv, droi_orinv, droi_nand, droi_set +}; + +/*------------------------------------------------------------------------ +---------------------------- some other goodies ------------------------- +------------------------------------------------------------------------*/ + +static void action_tail(d, src, run, ix) + LogInt *d, *src; + CARD32 run, ix; +{ + LogInt D, M; + CARD32 sbit = ix & LOGMASK; + ix >>= LOGSHIFT; d += ix; src += ix; + if (sbit + run >= LOGSIZE) { + if (sbit) { + M = BitRight(LOGONES,sbit); run -= (LOGSIZE - sbit); + D = *d; *d = (D & ~M) | (*src++ & M); d++; + } + for (sbit = run >> LOGSHIFT; sbit > 0; sbit--) { + *d++ = *src++; + } + if (run &= LOGMASK) { /* may be unnecessary due to padding */ + M = ~BitRight(LOGONES,run); + D = *d; *d = (D & ~M) | (*src & M); + } + } else { + M = BitRight(LOGONES,sbit) & ~(BitRight(LOGONES,sbit+run)); + D = *d; *d = (D & ~M) | (*src & M); + } +} + +static CARD32 +rep_cnst(levels, dconst) + CARD32 levels; + double dconst; +{ + + CARD32 con = ConstrainConst(dconst,levels); + + if (levels <= 0x100) { + if ( levels > 2) { + con &= 0xff; con |= con << 8; return con | (con << 16); + } + if (levels == 2) { + return con & 1 ? ~0 : 0; + } + return 0; + } else if (levels < 0x10000) { + con &= 0xffff; return con | (con << 16); + } + return con & 0xffffff; +} + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ + +static int InitializeLogic(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + xieFloLogical *raw = (xieFloLogical *) ped->elemRaw; + pLogicDefPtr epvt = (pLogicDefPtr) ped->elemPvt; + mpLogicPvtPtr pvt = (mpLogicPvtPtr) pet->private; + receptorPtr rcp = pet->receptor; + CARD32 nbands = pet->receptor[SRCt1].inFlo->bands; + bandPtr dband = &(pet->emitter[0]); + CARD8 msk = raw->bandMask; + BOOL hasROI = raw->domainPhototag != 0; + CARD32 band; + void (*act)(); + + if (hasROI) { + if (raw->src2) { + ped->ddVec.activate = ActivateLogicDROI; + act = action_dyadROI[raw->operator]; + } else { + ped->ddVec.activate = ActivateLogicMROI; + act = action_monoROI[raw->operator]; + } + } else { /* no ROI */ + if (raw->src2) { + ped->ddVec.activate = ActivateLogicD; + act = action_dyad[raw->operator]; + } else { + ped->ddVec.activate = ActivateLogicM; + act = action_mono[raw->operator]; + } + } + + for (band=0; bandaction = act; + if (!raw->src2) { + pvt->cnst = rep_cnst(dband->format->levels, epvt->constant[band]); + } else if (!hasROI) { + /* gack, an alternative is to use INPLACE for SRCt1 */ + bandPtr tband = &(pet->receptor[SRCt2].band[band]); + if (dband->format->pitch <= tband->format->pitch) { + pvt->action2 = (void (*)()) NULL; + pvt->endix = dband->format->pitch; /* bits */ + } else { + pvt->action2 = action_tail; + pvt->endix = tband->format->pitch; + pvt->endrun = dband->format->pitch - pvt->endix; + } + } + } + + /* If processing domain, allow replication */ + if (hasROI) + pet->receptor[ped->inCnt-1].band[0].replicate = msk; + + InitReceptor(flo, ped, &rcp[SRCt1], NO_DATAMAP, 1, msk, ~msk); + if (msk && raw->src2) + InitReceptor(flo, ped, &rcp[SRCt2], NO_DATAMAP, 1, msk, NO_BANDS); + if (hasROI) + InitProcDomain(flo, ped, raw->domainPhototag, raw->domainOffsetX, + raw->domainOffsetY); + if (msk) + InitEmitter(flo, ped, NO_DATAMAP, hasROI ? SRCt1 : NO_INPLACE); + + return !ferrCode(flo); +} + + +/* end module mplogic.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/mppaste.c b/xie/xc/programs/Xserver/XIE/mixie/process/mppaste.c new file mode 100644 index 0000000..fc6e050 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/mppaste.c @@ -0,0 +1,557 @@ +/* $XConsortium: mppaste.c,v 1.6 94/04/17 20:35:21 rws Exp $ */ +/**** module mppaste.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mppaste.c -- DDXIE paste up element + + Dean Verheiden, Larry Hare && Robert NC Shelley -- AGE Logic, Inc. + July, 1993 + +*****************************************************************************/ + +#define _XIEC_MPPASTE +#define _XIEC_PPASTE + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzePasteUp(); + +/* + * routines used internal to this module + */ +static int CreatePasteUp(); +static int InitializePasteUp(); +static int ActivatePasteUp(); +static int ResetPasteUp(); +static int DestroyPasteUp(); + +/* Fill functions */ +static void FillReal(); +static void FillQuad(); +static void FillPair(); +static void FillByte(); +static void FillBit(); + +/* Action functions */ +static void PasteReal(); +static void PasteQuad(); +static void PastePair(); +static void PasteByte(); +static void PasteBit(); + +/* + * DDXIE Paste Up entry points + */ +static ddElemVecRec PasteUpVec = { + CreatePasteUp, + InitializePasteUp, + ActivatePasteUp, + (xieIntProc)NULL, + ResetPasteUp, + DestroyPasteUp + }; + +/* + * Local Declarations. + */ + +typedef struct _pasterect { + Bool active; /* indicates this src is not finished yet */ + INT32 sxoff; /* src x offset */ + INT32 dxoff; /* dst x offset */ + INT32 dyoff; /* dst y offset */ + CARD32 width; /* clipped width of src on output window */ + CARD32 height; /* clipped height of src on output window */ + CARD32 receptorIndex; +} PasteRectRec, *PasteRectPtr; + +typedef struct _mppasteupdef { + void (*fill)(); + void (*action)(); + INT32 nextline; + CARD32 iconstant; + CARD32 numRects; /* Number of interesting src for this band */ + PasteRectPtr rects; +} mpPasteUpPvtRec, *mpPasteUpPvtPtr; + + +/*------------------------------------------------------------------------ +----------------------------- Analyze ------------------------------------ +------------------------------------------------------------------------*/ +int miAnalyzePasteUp(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* for now just stash our entry point vector in the peDef */ + ped->ddVec = PasteUpVec; + + return(TRUE); +} /* end miAnalyzePasteUp */ + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreatePasteUp(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + int auxsize = xieValMaxBands * sizeof(mpPasteUpPvtRec); + + /* Force syncing between sources, but not bands */ + return (MakePETex(flo, ped, auxsize, SYNC, NO_SYNC) ); +} /* end CreatePasteUp */ + + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializePasteUp(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloPasteUp *raw = (xieFloPasteUp *)ped->elemRaw; + peTexPtr pet = ped->peTex; + CARD32 nbands = pet->receptor[SRCt1].inFlo->bands; + PasteUpFloat *fconst = ((pPasteUpDefPtr)ped->elemPvt)->constant; + mpPasteUpPvtPtr pvt; + xieTypTile *tp; + bandPtr iband, oband; + CARD32 b, t; + + if (!(InitReceptors(flo, ped, NO_DATAMAP, 1) && + InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE))) + return (FALSE); + + /* Figure out the appropriate action vector */ + /* Use first source for the band types since they all must be the same */ + iband = &(pet->receptor[SRCt1].band[0]); + pvt = (mpPasteUpPvtPtr)pet->private; + for(b = 0; b < nbands; b++, pvt++, iband++, fconst++) { + + /* Zero out "interesting" rectangle counters */ + pvt->numRects = 0; + pvt->nextline = pet->emitter[b].format->height - 1; + + /* Clip fill for constrained data */ + if (IsConstrained(iband->format->class)) + pvt->iconstant = ConstrainConst(*fconst,iband->format->levels); + + switch (iband->format->class) { + case UNCONSTRAINED: + pvt->fill = FillReal; + pvt->action = PasteReal; + break; + case QUAD_PIXEL: + pvt->fill = FillQuad; + pvt->action = PasteQuad; + break; + case PAIR_PIXEL: + pvt->fill = FillPair; + pvt->action = PastePair; + break; + case BYTE_PIXEL: + pvt->fill = FillByte; + pvt->action = PasteByte; + break; + case BIT_PIXEL: + pvt->fill = FillBit; + pvt->action = PasteBit; + break; + default: + ImplementationError(flo, ped, return(FALSE)); + break; + } + } + + /* Disable completely clipped srcs, determine minimum y of non clipped src */ + tp = (xieTypTile *)&(raw[1]); + for (t = 0; t < raw->numTiles; t++, tp++) { + iband = &(pet->receptor[t].band[0]); + oband = &pet->emitter[0]; + pvt = (mpPasteUpPvtPtr)pet->private; + for(b = 0; b < nbands; b++, iband++, oband++, pvt++) { + INT32 dst_width = oband->format->width; + INT32 dst_height = oband->format->height; + if ((tp->dstY + (INT32)iband->format->height) <= 0 || + (tp->dstX + (INT32)iband->format->width) <= 0 || + (tp->dstX >= dst_width) || + (tp->dstY >= dst_height)) + DisableSrc(flo,pet,iband,FLUSH); + else { + pvt->numRects++; + if (tp->dstY < pvt->nextline) + pvt->nextline = (tp->dstY > 0) ? tp->dstY : 0; + } + } + } + + /* Allocate space for srcs that are not completely clipped */ + pvt = (mpPasteUpPvtPtr)pet->private; + for (b = 0; b < nbands; b++, pvt++) + if (pvt->numRects) { + pvt->rects = + (PasteRectPtr)XieMalloc(pvt->numRects * sizeof(PasteRectRec)); + pvt->numRects = 0; /* Will be used as list is built */ + } else + pvt->rects = (PasteRectPtr)NULL; + + /* + Build list for each band containing srcs that are displayed, adjust + thresholds for srcs without minimum y + */ + tp = (xieTypTile *)&(raw[1]); + for (t = 0; t < raw->numTiles; t++, tp++) { + CARD8 amask = 1, active = pet->receptor[t].active; + iband = &(pet->receptor[t].band[0]); + oband = &pet->emitter[0]; + pvt = (mpPasteUpPvtPtr)pet->private; + for(b = 0; b < nbands; b++, iband++, oband++, amask <<= 1, pvt++) { + if (active & amask) { + INT32 dst_width = oband->format->width; + INT32 dst_height = oband->format->height; + PasteRectPtr pr = &(pvt->rects[pvt->numRects++]); /* Yuck */ + + pr->active = TRUE; + pr->receptorIndex = t; + if (tp->dstX >= 0) { /* clip left */ + pr->sxoff = 0; + pr->dxoff = tp->dstX; + pr->width = iband->format->width; + } else { + pr->sxoff = -tp->dstX; + pr->dxoff = 0; + pr->width = iband->format->width - pr->sxoff; + } + if (pr->dxoff + pr->width > dst_width) /* clip right */ + pr->width = dst_width - pr->dxoff; + + if (tp->dstY >= 0) { /* clip top */ + pr->dyoff = tp->dstY; + pr->height = iband->format->height; + } else { + pr->dyoff = 0; + pr->height = iband->format->height - (-tp->dstY); + } + if (pr->dyoff + pr->height > dst_height)/* clip bottom */ + pr->height = dst_height - pr->dyoff; + + /* Adjust thresholds if necessary */ + if (tp->dstY != pvt->nextline) { + if (tp->dstY > pvt->nextline) + IgnoreBand(iband); + else + SetBandThreshold(iband,-tp->dstY+1); + } + } + } + } + + return( TRUE ); +} /* end InitializePasteUp */ + +/*------------------------------------------------------------------------ +------------------------ crank some single input data -------------------- +------------------------------------------------------------------------*/ +static int ActivatePasteUp(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + pPasteUpDefPtr pvt = (pPasteUpDefPtr) ped->elemPvt; + PasteUpFloat *fconst = pvt->constant; + receptorPtr rcp = pet->receptor; + CARD32 bands = rcp[SRCt1].inFlo->bands; + bandPtr dbnd = &pet->emitter[0]; + mpPasteUpPvtPtr mpvt = (mpPasteUpPvtPtr) pet->private; + pointer src, dst; + PasteRectPtr tp; + CARD32 t, b; + + for(b = 0; b < bands; b++, dbnd++, mpvt++, fconst++) { + INT32 dst_width = dbnd->format->width; + + /* Get pointer for dst scanline, Fill with constant */ + if (!(dst = GetCurrentDst(flo,pet,dbnd))) + break; + + (*(mpvt->fill)) (dst,*fconst,mpvt->iconstant,dst_width); + + /* Skip any constant lines */ + if (dbnd->current < mpvt->nextline) { + while (dbnd->current < mpvt->nextline) { + if (dst = GetNextDst(flo,pet,dbnd,KEEP)) { + (*(mpvt->fill)) (dst,*fconst,mpvt->iconstant,dst_width); + } else { + PutData(flo,pet,dbnd,dbnd->current); + return TRUE; + } + } + } + + mpvt->nextline = dbnd->format->height; + tp = mpvt->rects; + for (t = 0; t < mpvt->numRects; t++, tp++){ + bandPtr sbnd = &rcp[tp->receptorIndex].band[b]; + INT32 tdy = tp->dyoff; + INT32 tdend = tdy + tp->height; + + if (!tp->active) continue; + + /* see if this src has a line for the destination */ + if ((INT32)dbnd->current >= tdy && (INT32)dbnd->current < tdend) { + + if (sbnd->threshold > 1) { + src = GetSrc(flo,pet,sbnd,sbnd->threshold - 1,KEEP); + SetBandThreshold(sbnd,1); + } else + src = GetCurrentSrc(flo,pet,sbnd); + if (!src) /* all tiles for this line should be ready */ + ImplementationError(flo, ped, return(FALSE)); + + (*(mpvt->action)) (src, tp->sxoff, dst, tp->dxoff, tp->width); + + FreeData(flo,pet,sbnd,sbnd->current+1); + if ((dbnd->current + 1) < tdend) + mpvt->nextline = dbnd->current + 1; + else + tp->active = FALSE; + } else if (tdy == (dbnd->current + 1)) { + /* Tile missed on this line but will be needed for next line */ + AttendBand(sbnd); + mpvt->nextline = dbnd->current + 1; + } else if (tdy < mpvt->nextline) { + mpvt->nextline = tdy; + } + } + + if (mpvt->nextline < dbnd->format->height) { + /* ... still more tiles to copy */ + (void) GetNextDst(flo,pet,dbnd,FLUSH); + if (mpvt->nextline != dbnd->current) { + /* ... find the Next bunch of tiles */ + tp = mpvt->rects; + for (t = 0; t < mpvt->numRects; t++, tp++) + if (tp->active && tp->dyoff == mpvt->nextline) { + AttendBand(&rcp[tp->receptorIndex].band[b]); + } + } + } else { + /* ... fill in remaining destination with constant */ + while((dst = GetNextDst(flo,pet,dbnd,KEEP))) + (*(mpvt->fill)) (dst,*fconst,mpvt->iconstant,dst_width); + PutData(flo,pet,dbnd,dbnd->current); + } + + } + return(TRUE); +} /* end ActivatePasteUp */ + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetPasteUp(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + mpPasteUpPvtPtr pvt = (mpPasteUpPvtPtr)pet->private; + CARD32 nbands = pet->receptor[SRCt1].inFlo->bands; + CARD32 b; + + /* Free any lists that were malloced */ + for (b = 0; b < nbands; b++, pvt++) + if (pvt->rects) + pvt->rects = (PasteRectPtr)XieFree(pvt->rects); + + ResetReceptors(ped); + ResetEmitter(ped); + + + return(TRUE); +} /* end ResetPasteUp */ + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyPasteUp(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc)NULL; + ped->ddVec.initialize = (xieIntProc)NULL; + ped->ddVec.activate = (xieIntProc)NULL; + ped->ddVec.flush = (xieIntProc)NULL; + ped->ddVec.reset = (xieIntProc)NULL; + ped->ddVec.destroy = (xieIntProc)NULL; + + return(TRUE); +} /* end DestroyPasteUp */ + +/*------------------------------------------------------------------------ +--------------------------PasteUp fill routines ------------------------ +------------------------------------------------------------------------*/ +static void FillReal(dst,ffill,ifill,width) + RealPixel *dst; + PasteUpFloat ffill; + CARD32 ifill,width; +{ + while (width-- > 0) *dst++ = ffill; +} + +#define PasteFill(fname,stype) \ +static void fname(din,ffill,ifill,width) \ +pointer din; \ +PasteUpFloat ffill; \ +CARD32 ifill,width; \ +{ \ +stype *dst = (stype *)din, fill = (stype)ifill; \ + while (width-- > 0) *dst++ = fill; \ +} + +PasteFill(FillQuad,QuadPixel) +PasteFill(FillPair,PairPixel) +PasteFill(FillByte,BytePixel) + + +static void FillBit(dst,ffill,ifill,width) + BitPixel *dst; + PasteUpFloat ffill; + CARD32 ifill,width; +{ + memset((char *)dst, (ifill ? ~0 : 0), (width+7)>>3); +} + +/*------------------------------------------------------------------------ +--------------------------PasteUp action routines ---------------------- +------------------------------------------------------------------------*/ + +#define PasteAction(fname,stype) \ +static void fname(sin,s_off,din,d_off,width) \ +CARD32 width, s_off, d_off; \ +pointer sin, din; \ +{ \ +stype *src = (stype *)sin, *dst = (stype *)din; \ + src += s_off; \ + dst += d_off; \ + while (width-- > 0) *dst++ = *src++; \ +} + +PasteAction(PasteReal,RealPixel) +PasteAction(PasteQuad,QuadPixel) +PasteAction(PastePair,PairPixel) +PasteAction(PasteByte,BytePixel) + +static void PasteBit(sin,s_off,din,d_off,width) + CARD32 width, s_off, d_off; + pointer sin, din; +{ + LogInt * src = (LogInt *) sin; + LogInt * dst = (LogInt *) din; + for ( ; width-- > 0 ; s_off++, d_off++ ) { + if (LOG_tstbit(src,s_off)) + LOG_setbit(dst,d_off); + else + LOG_clrbit(dst,d_off); + } +} + +/* end module mppaste.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/mppoint.c b/xie/xc/programs/Xserver/XIE/mixie/process/mppoint.c new file mode 100644 index 0000000..28bffca --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/mppoint.c @@ -0,0 +1,1037 @@ +/* $XConsortium: mppoint.c,v 1.5 94/04/17 20:35:25 rws Exp $ */ +/**** module mppoint.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mppoint.c -- DDXIE point element + + Larry Hare -- AGE Logic, Inc. May, 1993 + +*****************************************************************************/ + + +#define _XIEC_MPPOINT +#define _XIEC_PPOINT + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzePoint(); + +/* + * routines used internal to this module + */ +static int CreatePoint(); +static int InitializePoint(); +static int ActivatePoint(); +static int ResetPoint(); +static int DestroyPoint(); + +#if XIE_FULL +static int ActivatePointExplode(); +static int ActivatePointExplodeMsk(); +static int ActivatePointCombine(); +static int ActivatePointROI(); + +#define LUT_EXPLODE +#endif + +/* + * DDXIE Point entry points + */ +static ddElemVecRec PointVec = { + CreatePoint, + InitializePoint, + ActivatePoint, + (xieIntProc) NULL, + ResetPoint, + DestroyPoint + }; + +/* +* Local Declarations. +*/ +typedef struct _mppointdef { + void (*action) (); +#if XIE_FULL + /* below here for crazy pixels only */ + pointer (*convert) (); + pointer buffer; + CARD32 constant; + CARD8 shiftok; + CARD8 shiftamt; + CARD32 mask; /* for all 3 bands */ + CARD32 width; /* for all 3 bands */ + void (*merge) (); /* for all 3 bands */ + void (*store) (); /* for all 3 bands */ +#endif +} mpPointPvtRec, *mpPointPvtPtr; + +static void P11_bb0(), P11_bb1(); +static void P11_bb(), P11_Bb(), P11_Pb(), P11_Qb(); +static void P11_bB(), P11_BB(), P11_PB(), P11_QB(); +static void P11_bP(), P11_BP(), P11_PP(), P11_QP(); +static void P11_bQ(), P11_BQ(), P11_PQ(), P11_QQ(); + +static void (*action_pnt11[4][4])() = { + P11_bb, P11_Bb, P11_Pb, P11_Qb, /* [out=1][inp=1...4] */ + P11_bB, P11_BB, P11_PB, P11_QB, /* [out=2][inp=1...4] */ + P11_bP, P11_BP, P11_PP, P11_QP, /* [out=3][inp=1...4] */ + P11_bQ, P11_BQ, P11_PQ, P11_QQ, /* [out=4][inp=1...4] */ +}; + +#if XIE_FULL +static void Proi11_bb0(); +static void Proi11_bb(), Proi11_BB(), Proi11_PP(), Proi11_QQ(); + +static void (*action_pntroi11[4])() = { + Proi11_bb, Proi11_BB, Proi11_PP, Proi11_QQ /* [out==inp=1...4] */ +}; + +static void crazy_horse(); + +static void CPM_B3BB(), CPS_B3BB(), CPA_B3BB(); + +static void CPMRG_B(), CPMRG_P(), CPMRG_Q(); + +static void (*action_merge[3])() = { /* [intclass - 2] */ + CPMRG_B, CPMRG_P, CPMRG_Q /* [byte,pair,quad] */ +}; + +static pointer CPCNV_bB(), CPCNV_BB(); +static pointer CPCNV_bP(), CPCNV_BP(), CPCNV_PP(); +static pointer CPCNV_bQ(), CPCNV_BQ(), CPCNV_PQ(); + +static pointer (*action_convert[3][3])() = { /* [intclass-2][ii-1] */ + CPCNV_bB, CPCNV_BB, 0, /* [out=Byte] [inp=bits,byte,pair] */ + CPCNV_bP, CPCNV_BP, CPCNV_PP, /* [out=Pair] [inp=bits,byte,pair] */ + CPCNV_bQ, CPCNV_BQ, CPCNV_PQ /* [out=Quad] [inp=bits,byte,pair] */ +}; +#endif + +/*------------------------------------------------------------------------ +------------------------ fill in the vector --------------------------- +------------------------------------------------------------------------*/ +int miAnalyzePoint(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ped->ddVec = PointVec; + return TRUE; +} + + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreatePoint(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + return MakePETex(flo,ped, + xieValMaxBands * sizeof(mpPointPvtRec), + SYNC, /* InSync: Make sure Lut exists first */ + NO_SYNC /* bandSync: see InitializePoint */ + ); +} + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializePoint(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + xieFloPoint *raw = (xieFloPoint *)ped->elemRaw; + peTexPtr pet = ped->peTex; + mpPointPvtPtr pvt = (mpPointPvtPtr) pet->private; + receptorPtr rcp = pet->receptor; + CARD32 nbands = pet->receptor[SRCtag].inFlo->bands; + CARD32 lbands = pet->receptor[LUTtag].inFlo->bands; + bandPtr iband = &(pet->receptor[SRCtag].band[0]); + bandPtr oband = &(pet->emitter[0]); + CARD8 msk = raw->bandMask; + BOOL bandsync = FALSE; + CARD8 passmsk, lutmask; + CARD32 band; + +#if XIE_FULL + if (nbands == 3 && lbands == 1) { + int oo = oband->format->class; + int ii = iband->format->class; + int intclass; + CARD32 c0, c1, c2, ctotal; + CARD32 iimin = ii, iimax = ii; + + pvt->width = iband->format->width; + + c1 = (iband+1)->format->class; + if (c1 > iimax) iimax = c1; else if (c1 < iimin) iimin = c1; + c2 = (iband+2)->format->class; + if (c2 > iimax) iimax = c2; else if (c2 < iimin) iimin = c2; + + /* Create CRAZY pixels by multiply/accumulate */ + if (pet->receptor[LUTtag].band[0].format->width == xieValLSFirst) { + (pvt+0)->constant = c0 = 1; + (pvt+1)->constant = c1 = (iband+0)->format->levels; + (pvt+2)->constant = c2 = (iband+0)->format->levels * + (iband+1)->format->levels; + ctotal = c2 * (iband+2)->format->levels; + } else { /* swizzle band-order MSFirst */ + (pvt+2)->constant = c2 = 1; + (pvt+1)->constant = c1 = (iband+2)->format->levels; + (pvt+0)->constant = c0 = (iband+2)->format->levels * + (iband+1)->format->levels; + ctotal = c0 * (iband+0)->format->levels; + } + + if ((c0 & (c0-1)) == 0) { + (pvt+0)->shiftamt = ffs(c0) - 1; + (pvt+0)->shiftok = 1; + } else (pvt+0)->shiftok = 0; + if ((c1 & (c1-1)) == 0) { + (pvt+1)->shiftamt = ffs(c1) - 1; + (pvt+1)->shiftok = 1; + } else (pvt+1)->shiftok = 0; + if ((c2 & (c2-1)) == 0) { + (pvt+2)->shiftamt = ffs(c2) - 1; + (pvt+2)->shiftok = 1; + } else (pvt+2)->shiftok = 0; + + if (ctotal <= 2) /* Could happen if levels were 1/1/2. pretty silly */ + ctotal = 4; + + SetDepthFromLevels(ctotal,c2); + pvt->mask = (1< BYTE -> BYTE */ + pvt->action = ((pvt+0)->shiftok && + (pvt+1)->shiftok && + (pvt+2)->shiftok) ? CPS_B3BB : CPM_B3BB; + } else { + /* Do it the hard way */ + pvt->action = crazy_horse; + if (intclass == BYTE_PIXEL && oo == BYTE_PIXEL) { + pvt->merge = CPA_B3BB; + pvt->store = 0; + } else { + pvt->merge = action_merge[intclass-2]; + pvt->store = (oband->format->levels == 1) + ? P11_bb0 + : action_pnt11[oo-1][intclass-1]; + } + for(band = 0; band < nbands; band++, pvt++, iband++) { + ii = iband->format->class; + pvt->width = iband->format->width; + /* might allocate extra space and use lut instead of multiply */ + pvt->convert = action_convert[intclass-2][ii-1]; + if (!(pvt->buffer = (pointer) + XieMalloc(pvt->width << (intclass - BYTE_PIXEL)))) + AllocError(flo,ped,return(FALSE)); + } + } + + /* protocol requires msk == ALL_BANDS */ + msk = ALL_BANDS; passmsk = NO_BANDS, lutmask = 1; bandsync = TRUE; + ped->ddVec.activate = ActivatePointCombine; + + } else if (nbands == 1 && lbands == 3) { + + for(band = 0; band < lbands; band++, pvt++, oband++) { + int oo = oband->format->class; + int ii = iband->format->class; + + if (oband->format->levels == 1) + pvt->action = P11_bb0; + else if ((iband->format->levels == 1) && (oo == BIT_PIXEL)) + pvt->action = P11_bb1; + else + pvt->action = action_pnt11[oo-1][ii-1]; + } +#if defined(LUT_EXPLODE) + if ((msk & 7) == 7) { + /* Only works when all 3 bands selected */ + msk = 1; passmsk = NO_BANDS; lutmask = ALL_BANDS; bandsync = TRUE; + ped->ddVec.activate = ActivatePointExplode; + } else +#endif + { + /* must actually activate these bands instead of using passmsk */ + ped->ddVec.activate = ActivatePointExplodeMsk; + lutmask = msk; msk = 1; passmsk = NO_BANDS; bandsync = FALSE; + rcp[SRCtag].band[0].replicate = ~msk; + } + + } else if (nbands == lbands) { + /* Standard Case. Map each band thru its own LUT */ + + if (raw->domainPhototag) { + for(band = 0; band < nbands; band++, pvt++, iband++, oband++) { + int oo = oband->format->class; + + pvt->action = (oband->format->levels == 1) + ? Proi11_bb0 + : action_pntroi11[oo-1]; + } + passmsk = ~msk; lutmask = msk; + rcp[ped->inCnt-1].band[0].replicate = msk; + ped->ddVec.activate = ActivatePointROI; + } else { +#endif + for(band = 0; band < nbands; band++, pvt++, iband++, oband++) { + int oo = oband->format->class; + int ii = iband->format->class; + + if (oband->format->levels == 1) + pvt->action = P11_bb0; + else if ((iband->format->levels == 1) && (oo == BIT_PIXEL)) + pvt->action = P11_bb1; + else + pvt->action = action_pnt11[oo-1][ii-1]; + } + passmsk = ~msk; lutmask = msk; + ped->ddVec.activate = ActivatePoint; +#if XIE_FULL + } + } else + ImplementationError(flo,ped, return(FALSE)); +#endif + pet->bandSync = bandsync; + return(InitReceptor(flo,ped,&rcp[SRCtag],NO_DATAMAP,1,msk,passmsk) && + InitReceptor(flo,ped,&rcp[LUTtag],NO_DATAMAP,1,lutmask,NO_BANDS) && + (!raw->domainPhototag || + InitProcDomain(flo, ped, raw->domainPhototag, + raw->domainOffsetX, raw->domainOffsetY)) && + InitEmitter(flo, ped, NO_DATAMAP, + (raw->domainPhototag ? SRCtag : NO_INPLACE))); +} + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ +/*------------------ (1 Band, 3 LUTS) --> (3 Bands) -------------------*/ + +#if XIE_FULL +#if defined(LUT_EXPLODE) +/* +** NOTE: +** This code was used in the SI alpha drop and works fine. However +** using our new band replication feature, we can replicate the +** image band and use the 3x3 mapping code. On the three machines +** I compared the execution times on, the results were within a few +** percent; but this code was faster. If you want to save a bit +** of code space, turn off the define LUT_EXPLODE. +*/ + +static int ActivatePointExplode(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpPointPvtPtr pvt = (mpPointPvtPtr) pet->private; + bandPtr iband = &(pet->receptor[SRCtag].band[0]); + bandPtr lband = &(pet->receptor[LUTtag].band[0]); + bandPtr oband = &(pet->emitter[0]); + pointer lvoid0, lvoid1, lvoid2; + pointer ovoid0, ovoid1, ovoid2; + pointer ivoid; + int bw = iband->format->width; + + /* asking for 1 should fetch entire lut strip */ + lvoid0 = GetSrcBytes(flo,pet,lband,0,1,FALSE); lband++; + lvoid1 = GetSrcBytes(flo,pet,lband,0,1,FALSE); lband++; + lvoid2 = GetSrcBytes(flo,pet,lband,0,1,FALSE); + + if (!lvoid0 || !lvoid1 || !lvoid2) + ImplementationError(flo,ped, return(FALSE)); + + ivoid = GetCurrentSrc(flo,pet,iband); + ovoid0 = GetCurrentDst(flo,pet,oband); oband++; + ovoid1 = GetCurrentDst(flo,pet,oband); oband++; + ovoid2 = GetCurrentDst(flo,pet,oband); oband -= 2; + while (!ferrCode(flo) && ivoid && ovoid0 && ovoid1 && ovoid2) { + + (*((pvt+0)->action)) (ivoid, ovoid0, lvoid0, bw); + (*((pvt+1)->action)) (ivoid, ovoid1, lvoid1, bw); + (*((pvt+2)->action)) (ivoid, ovoid2, lvoid2, bw); + + ivoid = GetNextSrc(flo,pet,iband,TRUE); + ovoid0 = GetNextDst(flo,pet,oband,TRUE); oband++; + ovoid1 = GetNextDst(flo,pet,oband,TRUE); oband++; + ovoid2 = GetNextDst(flo,pet,oband,TRUE); oband -= 2; + } + FreeData(flo, pet, iband, iband->current); + if (iband->final) { + FreeData(flo, pet, lband ,lband->current); lband--; + FreeData(flo, pet, lband ,lband->current); lband--; + FreeData(flo, pet, lband ,lband->current); + } + return TRUE; +} +#endif + +static int ActivatePointExplodeMsk(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpPointPvtPtr pvt = (mpPointPvtPtr) pet->private; + xieFloPoint *raw = (xieFloPoint *)ped->elemRaw; + int band, nbands = pet->receptor[LUTtag].inFlo->bands; + bandPtr iband = &(pet->receptor[SRCtag].band[0]); + bandPtr lband = &(pet->receptor[LUTtag].band[0]); + bandPtr oband = &(pet->emitter[0]); + CARD8 msk = raw->bandMask; + pointer lvoid; + + for(band = 0; band < nbands; band++, pvt++, iband++, oband++, lband++) { + register int bw = iband->format->width; + pointer ivoid, ovoid; + + if ((msk & (1<strip)) + return(FALSE); + } while(GetSrc(flo,pet,iband,iband->maxLocal,FLUSH)); + FreeData(flo,pet,iband,iband->maxLocal); + } + continue; + } + + /* Or process similar to ordinary Point code. */ + if (!(lvoid = GetSrcBytes(flo,pet,lband,0,1,FALSE)) || + !(ivoid = GetCurrentSrc(flo,pet,iband)) || + !(ovoid = GetCurrentDst(flo,pet,oband))) continue; + + do { + (*(pvt->action)) (ivoid, ovoid, lvoid, bw); + ivoid = GetNextSrc(flo,pet,iband,TRUE); + ovoid = GetNextDst(flo,pet,oband,TRUE); + } while (!ferrCode(flo) && ivoid && ovoid) ; + + FreeData(flo, pet, iband, iband->current); + if (iband->final) + FreeData(flo, pet, lband, lband->current); + } + return TRUE; +} + +/*------------------ (3 Band, 1 LUTS) --> (1 Bands) -------------------*/ + +static int ActivatePointCombine(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpPointPvtPtr pvt = (mpPointPvtPtr) pet->private; + bandPtr iband = &(pet->receptor[SRCtag].band[0]); + bandPtr lband = &(pet->receptor[LUTtag].band[0]); + bandPtr oband = &(pet->emitter[0]); + pointer ivoid0, ivoid1, ivoid2, lvoid, ovoid; + + /* asking for 1 should fetch entire lut strip */ + if (!(lvoid = GetSrcBytes(flo,pet,lband,0,1,FALSE))) + return FALSE; + + ovoid = GetCurrentDst(flo,pet,oband); + ivoid0 = GetCurrentSrc(flo,pet,iband); iband++; + ivoid1 = GetCurrentSrc(flo,pet,iband); iband++; + ivoid2 = GetCurrentSrc(flo,pet,iband); iband -= 2; + + while (!ferrCode(flo) && ovoid && ivoid0 && ivoid1 && ivoid2) { + + (*(pvt->action)) (ivoid0, ivoid1, ivoid2, lvoid, ovoid, pvt); + + ovoid = GetNextDst(flo,pet,oband,TRUE); + ivoid0 = GetNextSrc(flo,pet,iband,TRUE); iband++; + ivoid1 = GetNextSrc(flo,pet,iband,TRUE); iband++; + ivoid2 = GetNextSrc(flo,pet,iband,TRUE); iband -= 2; + } + + FreeData(flo, pet, iband, iband->current); iband++; + FreeData(flo, pet, iband, iband->current); iband++; + FreeData(flo, pet, iband, iband->current); + + if (iband->final) + FreeData(flo, pet, lband, lband->current); + + return TRUE; +} + +/*------------------ (3 Band, 3 LUTS, ROI) --> (3 Bands) -------------------*/ +/*------------------ (1 Band, 1 LUTS, ROI) --> (1 Bands) -------------------*/ + +static int ActivatePointROI(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + + mpPointPvtPtr pvt = (mpPointPvtPtr) pet->private; + int band, nbands = pet->receptor[LUTtag].inFlo->bands; /* ??? */ + bandPtr iband = &(pet->receptor[SRCtag].band[0]); + bandPtr lband = &(pet->receptor[LUTtag].band[0]); + bandPtr rband = &(pet->receptor[ped->inCnt-1].band[0]); + bandPtr oband = &(pet->emitter[0]); + pointer lvoid; + + for(band=0; band < nbands; band++,pvt++,iband++,oband++,lband++,rband++) { + pointer ivoid, ovoid; + + /* 1 should fetch entire lut strip */ + if (!(lvoid = GetSrcBytes(flo,pet,lband,0,1,FALSE)) || + !(ivoid = GetCurrentSrc(flo,pet,iband)) || + !(ovoid = GetCurrentDst(flo,pet,oband))) continue; + + while (!ferrCode(flo) && ivoid && ovoid && + SyncDomain(flo,ped,oband,FLUSH)) { + INT32 run, currentx = 0; + + if(ivoid != ovoid) memcpy(ovoid, ivoid, oband->pitch); + + while (run = GetRun(flo,pet,oband)) { + if (run > 0) { + (*(pvt->action)) (ovoid, lvoid, run, currentx); + currentx += run; + } else + currentx -= run; + } + + ivoid = GetNextSrc(flo,pet,iband,TRUE); + ovoid = GetNextDst(flo,pet,oband,TRUE); + } + + FreeData(flo, pet, iband, iband->current); + if (iband->final) + FreeData(flo, pet, lband, lband->current); + } + return TRUE; +} +#endif + +/*------------------ (3 Band, 3 LUTS) --> (3 Bands) -------------------*/ +/*------------------ (1 Band, 1 LUTS) --> (1 Bands) -------------------*/ + +static int ActivatePoint(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpPointPvtPtr pvt = (mpPointPvtPtr) pet->private; + int band, nbands = pet->receptor[LUTtag].inFlo->bands; + bandPtr iband = &(pet->receptor[SRCtag].band[0]); + bandPtr lband = &(pet->receptor[LUTtag].band[0]); + bandPtr oband = &(pet->emitter[0]); + pointer lvoid; + + for(band = 0; band < nbands; band++, pvt++, iband++, oband++, lband++) { + register int bw = iband->format->width; + pointer ivoid, ovoid; + + /* 1 should fetch entire lut strip */ + if (!(lvoid = GetSrcBytes(flo,pet,lband,0,1,FALSE)) || + !(ivoid = GetCurrentSrc(flo,pet,iband)) || + !(ovoid = GetCurrentDst(flo,pet,oband))) continue; + + do { + (*(pvt->action)) (ivoid, ovoid, lvoid, bw); + ivoid = GetNextSrc(flo,pet,iband,TRUE); + ovoid = GetNextDst(flo,pet,oband,TRUE); + } while (!ferrCode(flo) && ivoid && ovoid) ; + + FreeData(flo, pet, iband, iband->current); + if (iband->final) + FreeData(flo, pet, lband, lband->current); + } + return TRUE; +} + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetPoint(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ +#if XIE_FULL + mpPointPvtPtr pvt = (mpPointPvtPtr) (ped->peTex->private); + int band; + + /* free any dynamic private data */ + if (pvt) + for (band = 0 ; band < xieValMaxBands ; band++, pvt++) + if (pvt->buffer) + pvt->buffer = (pointer) XieFree(pvt->buffer); +#endif + ResetReceptors(ped); + ResetProcDomain(ped); + ResetEmitter(ped); + return TRUE; +} + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyPoint(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* get rid of the peTex structure */ + if(ped->peTex) + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc)NULL; + ped->ddVec.initialize = (xieIntProc)NULL; + ped->ddVec.activate = (xieIntProc)NULL; + ped->ddVec.reset = (xieIntProc)NULL; + ped->ddVec.destroy = (xieIntProc)NULL; + + return TRUE; +} + +/*------------------------------------------------------------------------ +--------------------- Lotsa Little Action Routines --------------------- +------------------------------------------------------------------------*/ + +/* +** bitonal ---> LUT ---> bitonal (only 4 possibilities) +*/ + +static void +P11_bb(INP,OUTP,LUTP,bw) + pointer INP; pointer OUTP; pointer LUTP; int bw; +{ + unsigned char *lutp = (unsigned char *) LUTP; + + if (*lutp++ == 0) { + if (*lutp == 0) + action_clear (OUTP, bw, 0); + else + passcopy_bit (OUTP, INP, bw, 0); + } else if (*lutp == 0) { + passcopy_bit (OUTP, INP, bw, 0); + action_invert (OUTP, bw, 0); + } else + action_set (OUTP, bw, 0); +} + +/* +** bitonal ---> LUT ---> bitonal (input is single level) +*/ + +static void +P11_bb1(INP,OUTP,LUTP,bw) + pointer INP; pointer OUTP; pointer LUTP; int bw; +{ + CARD8 *lutp = (CARD8 *) LUTP; + + if (*lutp) action_set(OUTP, bw, 0); + else action_clear(OUTP, bw, 0); +} + +/* +** anything ---> LUT ---> bitonal (output is single level) +*/ + +static void +P11_bb0(INP,OUTP,LUTP,bw) + pointer INP; pointer OUTP; pointer LUTP; int bw; +{ + action_clear(OUTP, bw, 0); +} + +/* +** DO_P11b - single band, single lut, bit to bit +** DO_P11c - single band, single lut, consume bits +** DO_P11x - single band, single lut, consume bits (to bytes only) +** DO_P11p - single band, single lut, produce bits +** DO_P11 - single band, single lut, non-bit versions +*/ + +#define DO_P11b(fd_do,itype,otype) /* see P11_bb, P11_bb1, P11_bb0 above */ + +#define DO_P11c(fn_do,itype,otype) \ +static void \ +fn_do(INP,OUTP,LUTP,bw) \ + pointer INP; pointer OUTP; pointer LUTP; int bw; \ +{ \ + LogInt *inp = (LogInt *) INP; \ + otype *outp = (otype *) OUTP; \ + otype *lutp = (otype *) LUTP; \ + otype loval = lutp[0], hival = lutp[1]; \ + LogInt M, inval; \ + for ( ; bw >= LOGSIZE ; bw -= LOGSIZE) \ + for (M=LOGLEFT, inval = *inp++; M; LOGRIGHT(M)) \ + *outp++ = (inval & M) ? hival : loval; \ + if (bw > 0) \ + for (M=LOGLEFT, inval = *inp++; bw; bw--, LOGRIGHT(M)) \ + *outp++ = (inval & M) ? hival : loval; \ +} +#define DO_P11p(fn_do,itype,otype) \ +static void \ +fn_do(INP,OUTP,LUTP,bw) \ + pointer INP; pointer OUTP; pointer LUTP; int bw; \ +{ \ + itype *inp = (itype *) INP; \ + LogInt *outp = (LogInt *) OUTP, M, outval; \ + unsigned char *lutp = (unsigned char *) LUTP; \ + for ( ; bw >= LOGSIZE ; *outp++ = outval, bw -= LOGSIZE) \ + for (M=LOGLEFT, outval = 0; M; LOGRIGHT(M)) \ + if (lutp[*inp++]) \ + outval |= M; \ + if (bw > 0) { \ + for (M=LOGLEFT, outval = 0; bw; bw--, LOGRIGHT(M)) \ + if (lutp[*inp++]) \ + outval |= M; \ + *outp++ = outval; \ + } \ +} + +#define DO_P11x(fn_do,itype,otype) \ +static void \ +fn_do(INP,OUTP,LUTP,bw) \ + pointer INP; pointer OUTP; pointer LUTP; int bw; \ +{ \ + otype *lutp = (otype *) LUTP; \ + bitexpand(INP,OUTP,bw, lutp[0], lutp[1]); \ +} + +#define DO_P11(fn_do,itype,otype) \ +static void \ +fn_do(INP,OUTP,LUTP,bw) \ + pointer INP; pointer OUTP; pointer LUTP; int bw; \ +{ \ + itype *inp = (itype *) INP; \ + otype *outp = (otype *) OUTP; \ + otype *lutp = (otype *) LUTP; \ + while (bw-- > 0) *outp++ = lutp[*inp++]; \ +} + +/* +** DO_P11b - bit to bit +** DO_P11c - consume bits +** DO_P11x - consume bits (faster bit eXpander for bytes only) +** DO_P11p - produce bits +** DO_P11 - non-bit versions +*/ + +DO_P11b (P11_bb, BitPixel, BitPixel) +DO_P11p (P11_Bb, BytePixel, BitPixel) +DO_P11p (P11_Pb, PairPixel, BitPixel) +DO_P11p (P11_Qb, QuadPixel, BitPixel) + +DO_P11x (P11_bB, BitPixel, BytePixel) +DO_P11 (P11_BB, BytePixel, BytePixel) +DO_P11 (P11_PB, PairPixel, BytePixel) +DO_P11 (P11_QB, QuadPixel, BytePixel) + +DO_P11c (P11_bP, BitPixel, PairPixel) +DO_P11 (P11_BP, BytePixel, PairPixel) +DO_P11 (P11_PP, PairPixel, PairPixel) +DO_P11 (P11_QP, QuadPixel, PairPixel) + +DO_P11c (P11_bQ, BitPixel, QuadPixel) +DO_P11 (P11_BQ, BytePixel, QuadPixel) +DO_P11 (P11_PQ, PairPixel, QuadPixel) +DO_P11 (P11_QQ, QuadPixel, QuadPixel) + +/*------------------------------------------------------------------------ +--------------------- ROI operations work on subranges ------------------ +------------------------------------------------------------------------*/ +#if XIE_FULL +/* +** The Proi11_XX routines only map within a single type. By making new +** routines here, instead of using the P11_XX routines above, it +** may be easier to optimize the more important P11_XX routines by +** virtue of starting on nicely aligned boundaries. +*/ + +static void +Proi11_bb0(INP,LUTP,run,ix) + pointer INP; pointer LUTP; int run; int ix; +{ + action_clear (INP, run, ix); +} + +static void +Proi11_bb(INP,LUTP,run,ix) + pointer INP; pointer LUTP; int run; int ix; +{ + CARD8 *lutp = (CARD8 *) LUTP; + + if (*lutp++ == 0) { + if (*lutp == 0) action_clear (INP, run, ix); + } else if (*lutp == 0) action_invert (INP, run, ix); + else action_set (INP, run, ix); +} + +#define ROI_P11(fn_do,iotype) \ +static void \ +fn_do(INP,LUTP,run,ix) \ + pointer INP; pointer LUTP; INT32 run; INT32 ix; \ +{ \ + iotype *inp = ((iotype *) INP) + ix; \ + iotype *lutp = (iotype *) LUTP; \ + while (run-- > 0) { *inp = lutp[*inp]; inp++; } \ +} + +ROI_P11 (Proi11_BB, BytePixel) +ROI_P11 (Proi11_PP, PairPixel) +ROI_P11 (Proi11_QQ, QuadPixel) +#endif + +/*------------------------------------------------------------------------ +--------------------- Crazy Pixels Action Routines --------------------- +------------------------------------------------------------------------*/ +#if XIE_FULL +/* +** The Activate routine will nominally call this routine to do all +** the necessary moderation per scanline. However in the typical +** case of going from a triple byte to a single byte image, one of the +** CPM_B3BB or CPS_B3BB routines will get called instead. +*/ + +static void +crazy_horse(ivoid0, ivoid1, ivoid2, lvoid, ovoid, pvt) + pointer ivoid0, ivoid1, ivoid2, lvoid, ovoid; + mpPointPvtPtr pvt; +{ + ivoid0 = (*(pvt->convert)) (ivoid0, pvt); pvt++; + ivoid1 = (*(pvt->convert)) (ivoid1, pvt); pvt++; + ivoid2 = (*(pvt->convert)) (ivoid2, pvt); pvt -= 2; + if (pvt->store) { + (*(pvt->merge)) (ivoid0, ivoid1, ivoid2, lvoid, pvt->buffer, pvt); + (*(pvt->store)) (pvt->buffer, ovoid, lvoid, pvt->width); + } else + (*(pvt->merge)) (ivoid0, ivoid1, ivoid2, lvoid, ovoid, pvt); +} + +/* +** Some cpu's are not to good at multiplies, so we need two versions. +*/ + +#define MakeCrazyPix(name, itype, otype, OP, field) \ +static void \ +name(ivoid0, ivoid1, ivoid2, lvoid, ovoid, pvt) \ + pointer ivoid0, ivoid1, ivoid2, lvoid, ovoid; \ + mpPointPvtPtr pvt; \ +{ \ + itype *i0 = (itype *) ivoid0; \ + itype *i1 = (itype *) ivoid1; \ + itype *i2 = (itype *) ivoid2; \ + otype *l = (otype *) lvoid; \ + otype *o = (otype *) ovoid; \ + CARD32 c0 = (pvt+0)->field; \ + CARD32 c1 = (pvt+1)->field; \ + CARD32 c2 = (pvt+2)->field; \ + CARD32 msk = pvt->mask; \ + CARD32 bw = pvt->width; \ + CARD32 j; \ + for (j = 0; j < bw; j++) \ + *o++ = l[((i0[j] OP c0) + (i1[j] OP c1) + (i2[j] OP c2)) & msk];\ +} + +#define MakeCrazyMergeLut(name, itype, otype) \ +static void \ +name(ivoid0, ivoid1, ivoid2, lvoid, ovoid, pvt) \ + pointer ivoid0, ivoid1, ivoid2, lvoid, ovoid; \ + mpPointPvtPtr pvt; \ +{ \ + itype *i0 = (itype *) ivoid0; \ + itype *i1 = (itype *) ivoid1; \ + itype *i2 = (itype *) ivoid2; \ + otype *l = (otype *) lvoid; \ + otype *o = (otype *) ovoid; \ + CARD32 msk = pvt->mask; \ + CARD32 bw = pvt->width; \ + CARD32 j; \ + for (j = 0; j < bw; j++) \ + *o++ = l[(i0[j] + i1[j] + i2[j]) & msk]; \ +} + +#define MakeCrazyMerge(name, iotype) \ +static void \ +name(ivoid0, ivoid1, ivoid2, lvoid, ovoid, pvt) \ + pointer ivoid0, ivoid1, ivoid2, lvoid, ovoid; \ + mpPointPvtPtr pvt; \ +{ \ + iotype *i0 = (iotype *) ivoid0; \ + iotype *i1 = (iotype *) ivoid1; \ + iotype *i2 = (iotype *) ivoid2; \ + iotype *op = (iotype *) ovoid; \ + CARD32 msk = pvt->mask; \ + CARD32 bw = pvt->width; \ + CARD32 j; \ + for (j = 0; j < bw; j++) \ + op[j] = (i0[j] + i1[j] + i2[j]) & msk; \ +} + +#define MakeCrazyConvert(name, itype, otype) \ +static pointer \ +name(ivoid,pvt) \ + pointer ivoid; \ + mpPointPvtPtr pvt; \ +{ \ + itype *i = (itype *) ivoid; \ + otype *o = (otype *) pvt->buffer; \ + CARD32 c = pvt->constant; \ + CARD32 bw = pvt->width; \ + if ( (sizeof(itype) == sizeof(otype)) && (c == 1)) \ + return ivoid; \ + if (pvt->shiftok) \ + for (c = pvt->shiftamt ; bw > 0; bw--) *o++ = *i++ << c; \ + else \ + for ( ; bw > 0; bw--) *o++ = *i++ * c; \ + return pvt->buffer; \ +} + +static pointer +CPCNV_bB(ivoid,pvt) + pointer ivoid; + mpPointPvtPtr pvt; +{ + bitexpand(ivoid, pvt->buffer, pvt->width, 0, pvt->constant); + return pvt->buffer; +} + +#define MakeCrazyConvertBit(name, otype) \ +static pointer \ +name(ivoid,pvt) \ + pointer ivoid; \ + mpPointPvtPtr pvt; \ +{ \ + LogInt *i = (LogInt *) ivoid, ival, M; \ + otype *o = (otype *) pvt->buffer; \ + CARD32 c = pvt->constant; \ + int bw = pvt->width; \ + int nw = bw >> LOGSHIFT; \ + for ( ; nw > 0; nw--) \ + for (ival = *i++, M=LOGLEFT; M ; LOGRIGHT(M)) \ + *o++ = (ival & M) ? c : 0; \ + if ((bw &= LOGMASK)) \ + for (ival = *i, M=LOGLEFT; bw > 0 ; bw--, LOGRIGHT(M)) \ + *o++ = (ival & M) ? c : 0; \ + return pvt->buffer; \ +} + + +MakeCrazyPix (CPM_B3BB, BytePixel, BytePixel, *, constant) +MakeCrazyPix (CPS_B3BB, BytePixel, BytePixel, <<, shiftamt) +MakeCrazyMergeLut (CPA_B3BB, BytePixel, BytePixel ) +MakeCrazyMerge (CPMRG_B, BytePixel) +MakeCrazyMerge (CPMRG_P, PairPixel) +MakeCrazyMerge (CPMRG_Q, QuadPixel) + + +MakeCrazyConvert (CPCNV_BB, BytePixel, BytePixel) +MakeCrazyConvert (CPCNV_BP, BytePixel, PairPixel) +MakeCrazyConvert (CPCNV_BQ, BytePixel, QuadPixel) +MakeCrazyConvert (CPCNV_PP, PairPixel, PairPixel) +MakeCrazyConvert (CPCNV_PQ, PairPixel, QuadPixel) +MakeCrazyConvertBit (CPCNV_bP, PairPixel) +MakeCrazyConvertBit (CPCNV_bQ, QuadPixel) +#endif + +/* end module mppoint.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/mprgb.c b/xie/xc/programs/Xserver/XIE/mixie/process/mprgb.c new file mode 100644 index 0000000..1773aa1 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/mprgb.c @@ -0,0 +1,1346 @@ +/* $XConsortium: mprgb.c,v 1.6 94/04/17 20:35:25 rws Exp $ */ +/**** module mprgb.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mprgb.c -- DDXIE Convert To/From RGB elements + + Larry Hare -- AGE Logic, Inc. August, 1993 + +*****************************************************************************/ + + +#define _XIEC_MPRGB +#define _XIEC_PCFRGB +#define _XIEC_PCTRGB + +/* + * Include files + */ +#include +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include +#include + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeToRGB(); +int miAnalyzeFromRGB(); + +/* + * routines used internal to this module + */ + +static int CreateToRGB(); +static int InitializeToRGB(); +static int SetupToRGB(); + +static int CreateFromRGB(); +static int InitializeFromRGB(); +static int SetupFromRGB(); + +static int ResetRGB(); +static int DestroyRGB(); +static void ClearRGB(); +static void CheckRGB(); + +static int ActivateRGB(); + +/* + * DDXIE Convert To/From RGB element entry points. + */ +static ddElemVecRec ToRGBVec = { + CreateToRGB, + InitializeToRGB, + ActivateRGB, + (xieIntProc) NULL, + ResetRGB, + DestroyRGB + }; + +static ddElemVecRec FromRGBVec = { + CreateFromRGB, + InitializeFromRGB, + ActivateRGB, + (xieIntProc) NULL, + ResetRGB, + DestroyRGB + }; + +/* +** Local Declarations. +** NOTE: use #define EARLY_SETUP to do setup at create time +** NOTE: uses RGBFloat's for matrix multiply. +*/ + +#define EARLY_SETUP +typedef RealPixel RGBFloat; + +typedef struct _mprgbdef { + void (*action) (); /* every one needs these */ + void (*post) (); /* clipping, or CIELab, for floats */ + CARD32 iclip[3]; /* clip values for integers */ + pointer (*cvt_in[3])(); /* !0 if need to expand input */ + pointer (*cvt_out[3])(); /* !0 if need to compress output */ + pointer aux_buf[3]; /* used for cvt_in/cvt_out */ + RGBFloat matrix[12]; + INT32 imatrix[12]; +} mpRGBPvtRec, *mpRGBPvtPtr; + +/* +** NOTES on BASIC ALGORITHM: +** 1) All transforms center on a matrix. Either a passed in XYZMAT +** or one synthesized from Luma values. +** 2) White Point adjustments, if specified are applied to this matrix. +** 3) Bias (YCbCr) or Implicit Biasing and Scaling (YCC) are applied. +** (Float to Float stops here, matmul is done as floats) +** 4) If inputs are integers, a scale is applied to reduce input +** input numbers to range 0.0 to 1.0. +** (Int to Float stops here, matmul is done as floats) +** 5) If outputs are integers, a scale is applied to expand values +** back to output range. For tripleband with all 256 levels +** for inputs and outputs, this cancels step 4. But allows +** for mapping say an (8,8,4) image to say (16,4,4). This +** final matrix is turned into a scaled fraction integer matrix. +** (Int to Int stops here, matmul is done as scaled fractions) +*/ + +/*------------------------------------------------------------------------ +------------------------ fill in the vector --------------------------- +------------------------------------------------------------------------*/ +int miAnalyzeToRGB(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ped->ddVec = ToRGBVec; + return TRUE; +} + +int miAnalyzeFromRGB(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ped->ddVec = FromRGBVec; + return TRUE; +} + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int +CreateToRGB(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + if (!MakePETex(flo,ped,sizeof(mpRGBPvtRec), NO_SYNC, SYNC)) + return FALSE; + +#if defined(EARLY_SETUP) + if (!SetupToRGB(flo, ped, 0 /* modify ?? */)) + return FALSE; +#endif + + return TRUE; +} + +static int +CreateFromRGB(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + /* always force syncing between inputs (is nop if only one input) */ + if (!MakePETex(flo,ped,sizeof(mpRGBPvtRec), NO_SYNC, SYNC)) + return FALSE; + +#if defined(EARLY_SETUP) + if (!SetupFromRGB(flo, ped, 0 /* modify ?? */)) + return FALSE; +#endif + + return TRUE; +} + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ + +static int +InitializeToRGB(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ +#if !defined(EARLY_SETUP) + if (!SetupToRGB(flo, ped, 0 /* modify ?? */)) + return FALSE; +#endif + + InitReceptors(flo, ped, NO_DATAMAP, 1); + InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE); + + return !ferrCode(flo); +} + +static int +InitializeFromRGB(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ +#if !defined(EARLY_SETUP) + if (!SetupFromRGB(flo, ped, 0 /* modify ?? */)) + return FALSE; +#endif + + InitReceptors(flo, ped, NO_DATAMAP, 1); + InitEmitter(flo, ped, NO_DATAMAP, NO_INPLACE); + + return !ferrCode(flo); +} + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ + +static int +ActivateRGB(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpRGBPvtPtr pvt = (mpRGBPvtPtr) pet->private; + bandPtr sband = &(pet->receptor[SRCt1].band[0]); + bandPtr dband = &(pet->emitter[0]); + CARD32 npix = sband->format->width; + pointer svoid[3], dvoid[3], stvoid[3], dtvoid[3]; + CARD32 b; + BOOL stop; + + for (b = 0; b < 3; b++, sband++, dband++) { + if (!(svoid[b] = GetCurrentSrc(flo,pet,sband))) + return TRUE; + if (!(dvoid[b] = GetCurrentDst(flo,pet,dband))) + return TRUE; + stvoid[b] = pvt->cvt_in[b] + ? (*pvt->cvt_in[b]) (pvt->aux_buf[b], svoid[b], pvt, npix) + : svoid[b] ; + dtvoid[b] = pvt->cvt_out[b] ? pvt->aux_buf[b] : dvoid[b]; + } sband -= 3; dband -= 3; + + do { + + (*(pvt->action)) (dtvoid, stvoid, pvt, npix); + + if (pvt->post) (*(pvt->post)) (dtvoid, npix); + + for (b = 0, stop = FALSE; b < 3; b++, sband++, dband++) { + if (pvt->cvt_out[b]) + (*pvt->cvt_out[b]) (dvoid[b], dtvoid[b], pvt, npix); + stop |= !(svoid[b] = GetNextSrc(flo,pet,sband,FLUSH)); + stop |= !(dvoid[b] = GetNextDst(flo,pet,dband,FLUSH)); + if (!stop) { + dtvoid[b] = pvt->cvt_out[b] ? dtvoid[b] : dvoid[b]; + stvoid[b] = pvt->cvt_in[b] + ? (*pvt->cvt_in[b]) (stvoid[b], svoid[b], pvt, npix) + : svoid[b] ; + } + } sband -= 3; dband -= 3; + + } while (!ferrCode(flo) && !stop) ; + + for (b = 0; b < 3; b++, sband++) { + FreeData(flo, pet, sband, sband->current); + } sband -= 3; + + return TRUE; +} + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int +ResetRGB(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + +#if !defined(EARLY_SETUP) + ClearRGB(flo, ped); +#endif + + ResetReceptors(ped); + ResetProcDomain(ped); + ResetEmitter(ped); + return TRUE; +} + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int +DestroyRGB(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + +#if defined(EARLY_SETUP) + ClearRGB(flo, ped); +#endif + + /* get rid of the peTex structure and private structures */ + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc)NULL; + ped->ddVec.initialize = (xieIntProc)NULL; + ped->ddVec.activate = (xieIntProc)NULL; + ped->ddVec.reset = (xieIntProc)NULL; + ped->ddVec.destroy = (xieIntProc)NULL; + + return TRUE; +} + +/*------------------------------------------------------------------------ +------------------------ Action Utility Routines ----------------------- +------------------------------------------------------------------------*/ + +/* + * Used for CIELab conversions. + * + * NOTE: Investigate use of stock cbrt() function in libc. + * NOTE: Borrowed from lib/X/XcmsMath.h + * NOTE: Copyright 1990 X Consortium + * + * NOTE: Investigate use of stock cbrt() function in libc. + * NOTE: Used better choice of seed values with emphasis on + * range of 0 to 1, and other smallish numbers. + */ + +#if !defined(XCMS_CUBEROOT) +#define XCMS_CUBEROOT _cmsCubeRoot + +/* Newton's Method: x_n+1 = x_n - ( f(x_n) / f'(x_n) ) */ +/* for cube roots, x^3 - a = 0, x_new = x - 1/3 (x - a/x^2) */ +#ifndef DBL_EPSILON +#define DBL_EPSILON 1e-6 +#endif + +double +_cmsCubeRoot(a) + double a; +{ + register double abs_a, cur_guess, delta; + if (a == 0.) + return 0.; + + /* convert to positive to speed loop tests */ + abs_a = a < 0. ? -a : a; + + /* arbitrary first guess */ + cur_guess = abs_a < 1. ? 0.5 + .500 * abs_a : + abs_a < 1000. ? 1.0 + .125 * abs_a : + 10.0 + .0125 * abs_a ; + do { + delta = (cur_guess - abs_a/(cur_guess*cur_guess))/3.; + cur_guess -= delta; + if (delta < 0.) delta = -delta; + } while (delta >= cur_guess*DBL_EPSILON); + + return a > 0. ? cur_guess : -cur_guess; +} +#endif + +/*------------------------------------------------------------------------ +--------------------- Lotsa Little Action Routines --------------------- +------------------------------------------------------------------------*/ + +/* (*(pvt->cvt_out)) (dvoid, svoid, pvt, npix); */ +/* (*(pvt->cvt_in)) (dvoid, svoid, pvt, npix); */ +/* (*(pvt->action)) (dvoid, svoid, pvt, npix); */ +/* (*(pvt->post)) (dvoid, npix); */ + +static pointer +cvt_bit_to_pair(dvoid,svoid,pvt,npix) + pointer dvoid, svoid; + mpRGBPvtPtr pvt; + CARD32 npix; +{ + LogInt *bitp = (LogInt *) svoid, ival, M; + PairPixel *pairp = (PairPixel *) dvoid; + int nw = npix >> LOGSHIFT; + for ( ; nw > 0; nw--) + for (ival = *bitp++, M=LOGLEFT; M ; LOGRIGHT(M)) + *pairp++ = (ival & M) ? (PairPixel) 1 : (PairPixel) 0; + if ((npix &= LOGMASK)) + for (ival = *bitp, M=LOGLEFT; npix > 0 ; npix--, LOGRIGHT(M)) + *pairp++ = (ival & M) ? (PairPixel) 1 : (PairPixel) 0; + return dvoid; +} + +static pointer +cvt_byte_to_pair(dvoid,svoid,pvt,npix) + pointer dvoid, svoid; + mpRGBPvtPtr pvt; + CARD32 npix; +{ + BytePixel *bytep = (BytePixel *) svoid; + PairPixel *pairp = (PairPixel *) dvoid; + for ( ; npix > 0; npix--) + *pairp++ = *bytep++; + return dvoid; +} + +static pointer +cvt_pair_to_byte(dvoid,svoid,pvt,npix) + pointer dvoid, svoid; + mpRGBPvtPtr pvt; + CARD32 npix; +{ + PairPixel *pairp = (PairPixel *) svoid; + BytePixel *bytep = (BytePixel *) dvoid; + for ( ; npix > 0; npix--) + *bytep++ = *pairp++; /* already hard-clipped!! */ + return dvoid; +} + +static pointer +cvt_pair_to_bit(dvoid,svoid,pvt,npix) + pointer dvoid, svoid; + mpRGBPvtPtr pvt; + CARD32 npix; +{ + PairPixel *pairp = (PairPixel *) svoid; + LogInt *bitp = (LogInt *) dvoid, bitval, M; + for ( ; npix >= LOGSIZE; *bitp++ = bitval, npix -= LOGSIZE) + for (M=LOGLEFT, bitval = 0; M; LOGRIGHT(M)) + if (*pairp++) + bitval |= M; + if (npix > 0) { + for (M=LOGLEFT, bitval = 0; npix > 0; npix--, LOGRIGHT(M)) + if (*pairp++) + bitval |= M; + *bitp = bitval; + } + return dvoid; +} + +static void +act_mmRR(dvoid, svoid, pvt, npix) + RealPixel *svoid[3], *dvoid[3]; + mpRGBPvtPtr pvt; + CARD32 npix; +{ + RGBFloat *mtrx = &(pvt->matrix[0]); + RGBFloat r, g, b; + CARD32 i; + + /* + ** dvector = matrix * svector + */ + for (i = 0; i < npix; i++) { + r = svoid[0][i]; + g = svoid[1][i]; + b = svoid[2][i]; + dvoid[0][i] = mtrx[0] * r + mtrx[1] * g + mtrx[2] * b; + dvoid[1][i] = mtrx[3] * r + mtrx[4] * g + mtrx[5] * b; + dvoid[2][i] = mtrx[6] * r + mtrx[7] * g + mtrx[8] * b; + } +} + +#define MakeIntFltMatMul(name, itype) \ +static void \ +name(dvoid, svoid, pvt, npix) \ + itype *svoid[3]; \ + RealPixel *dvoid[3]; \ + mpRGBPvtPtr pvt; \ + CARD32 npix; \ +{ \ + RealPixel *mtrx = &(pvt->matrix[0]); \ + RealPixel r, g, b, rr, gg, bb; \ + CARD32 i; \ + \ + for (i = 0; i < npix; i++) { \ + r = (RealPixel) svoid[0][i]; \ + g = (RealPixel) svoid[1][i]; \ + b = (RealPixel) svoid[2][i]; \ + rr = mtrx[0] * r + mtrx[1] * g + mtrx[2] * b; \ + gg = mtrx[3] * r + mtrx[4] * g + mtrx[5] * b; \ + bb = mtrx[6] * r + mtrx[7] * g + mtrx[8] * b; \ + dvoid[0][i] = rr; \ + dvoid[1][i] = gg; \ + dvoid[2][i] = bb; \ + } \ +} + +MakeIntFltMatMul(act_mmBR, BytePixel) +MakeIntFltMatMul(act_mmPR, PairPixel) + +#define MakeIntIntMatMul(name, iotype, shift) \ +static void \ +name(dvoid, svoid, pvt, npix) \ + iotype *svoid[3], *dvoid[3]; \ + mpRGBPvtPtr pvt; \ + CARD32 npix; \ +{ \ + INT32 *mtrx = &(pvt->imatrix[0]); \ + INT32 r, g, b, rr, gg, bb; \ + CARD32 iclip0 = pvt->iclip[0]; \ + CARD32 iclip1 = pvt->iclip[1]; \ + CARD32 iclip2 = pvt->iclip[2]; \ + INT32 bias0 = mtrx[9] + (1 << (shift-1)); \ + INT32 bias1 = mtrx[10] + (1 << (shift-1)); \ + INT32 bias2 = mtrx[11] + (1 << (shift-1)); \ + CARD32 i; \ + \ + for (i = 0; i < npix; i++) { \ + r = svoid[0][i]; \ + g = svoid[1][i]; \ + b = svoid[2][i]; \ + rr = mtrx[0] * r + mtrx[1] * g + mtrx[2] * b + bias0; \ + gg = mtrx[3] * r + mtrx[4] * g + mtrx[5] * b + bias1; \ + bb = mtrx[6] * r + mtrx[7] * g + mtrx[8] * b + bias2; \ + if (rr < 0) rr = 0; \ + if (gg < 0) gg = 0; \ + if (bb < 0) bb = 0; \ + if ((rr >>= shift) > iclip0) rr = iclip0; \ + if ((gg >>= shift) > iclip1) gg = iclip1; \ + if ((bb >>= shift) > iclip2) bb = iclip2; \ + dvoid[0][i] = rr; \ + dvoid[1][i] = gg; \ + dvoid[2][i] = bb; \ + } \ +} + +#define SF_BYTESHIFT 20 +#define SF_PAIRSHIFT 12 +MakeIntIntMatMul(act_mmBB, BytePixel, SF_BYTESHIFT) +MakeIntIntMatMul(act_mmPP, PairPixel, SF_PAIRSHIFT) + + +static void +act_postClipR(dvoid, npix) + RealPixel *dvoid[3]; +{ + RGBFloat *fp, f, zero = (RGBFloat) 0.0, one = (RGBFloat) 1.0; + CARD32 ipix, band; + + for (band = 0; band < 3; band++) { + fp = dvoid[band]; + for (ipix = npix; ipix > 0; ipix--, fp++) { + f = *fp; + if ( f < zero) *fp = zero; + if ( f > one) *fp = one; + } + } +} + +static void +act_postCIELab(dvoid, npix) + RealPixel *dvoid[3]; +{ + RGBFloat *xp, *yp, *zp, x3, y3, z3; + CARD32 ipix; + + xp = dvoid[0]; + yp = dvoid[1]; + zp = dvoid[2]; + for (ipix = npix; ipix > 0; ipix--) { + + /* XXX, if numbers are small, do some more work */ + x3 = XCMS_CUBEROOT((double)*xp); + y3 = XCMS_CUBEROOT((double)*yp); + z3 = XCMS_CUBEROOT((double)*zp); + + *xp++ = 116.0 * y3 - 16.0; /* L* */ + *yp++ = 500.0 * (x3 - y3); /* a* */ + *zp++ = 200.0 * (y3 - z3); /* b* */ + } +} + +static void +act_preCIELab(dvoid, svoid, pvt, npix) + RealPixel *svoid[3], *dvoid[3]; + mpRGBPvtPtr pvt; + CARD32 npix; +{ + RGBFloat *Lp, *ap, *bp, *xp, *yp, *zp, L, a, b; + CARD32 ipix; + + /* must be careful not to smash the source */ + Lp = svoid[0]; ap = svoid[1]; bp = svoid[2]; + xp = dvoid[0]; yp = dvoid[1]; zp = dvoid[2]; + + for (ipix = npix; ipix > 0; ipix--) { + + /* XXX, if numbers are small, do some more work */ + L = (*Lp++ + 16.0) * (1.0 / 116.0); + a = L + (*ap++ * 0.002); + b = L - (*bp++ * 0.005); + + *yp++ = (L * L * L); /* Y = ... */ + *xp++ = (a * a * a); /* X = ... */ + *zp++ = (b * b * b); /* Z = ... */ + } + act_mmRR(dvoid, dvoid, pvt, npix); +} + +/*------------------------------------------------------------------------ +-------------------- utility routines for initialization ---------------- +------------------------------------------------------------------------*/ + +/* Scale entire matrix by single scale factor */ + +static void +scale_mtrx(mtx,imtx,iscl) + RGBFloat *mtx; + INT32 *imtx; + CARD32 iscl; +{ + RGBFloat fscl = iscl; + int i; + + for (i = 0; i < 12; i++) + *imtx++ = *mtx++ * fscl; +} + +/* Scale each row of matrix by respective factors */ + +void +scale_rows(mtrx,scale1,scale2,scale3) + RGBFloat *mtrx; + double scale1, scale2, scale3; +{ + int b; + for (b = 0; b < 3; b++) *mtrx++ *= scale1; + for (b = 0; b < 3; b++) *mtrx++ *= scale2; + for (b = 0; b < 3; b++) *mtrx++ *= scale3; +} + +/* Scale each column of matrix by respective factors */ + +void +scale_columns(mtrx,scale1,scale2,scale3) + RGBFloat *mtrx; + double scale1, scale2, scale3; +{ + int b; + for (b = 0; b < 3; b++) { + *mtrx++ *= scale1; + *mtrx++ *= scale2; + *mtrx++ *= scale3; + } +} + +/* +** Our matrix routines for integers use a BIAS like so: +** YCC = MATRIX * RGB - BIAS +** But when we are going back to RGB we would have liked to do: +** RGB = MATRIX * (YCC - BIAS) +** So we multiply do transitive property of matrix arithmetic +** to get a new BIAS' (BIAS' = -MATRIX * BIAS) such that: +** RGB = MATRIX * YCC - MATRIX * BIAS = MATRIX * YCC - BIAS' +*/ +static void +flip_bias(mtx) + RGBFloat *mtx; +{ + RGBFloat mtx9, mtx10, mtx11; + mtx9 = -(mtx[0] * mtx[9] + mtx[1] * mtx[10] + mtx[2] * mtx[11]); + mtx10 = -(mtx[3] * mtx[9] + mtx[4] * mtx[10] + mtx[5] * mtx[11]); + mtx11 = -(mtx[6] * mtx[9] + mtx[7] * mtx[10] + mtx[8] * mtx[11]); + + mtx[9] = mtx9; + mtx[10] = mtx10; + mtx[11] = mtx11; +} + + + +/* Seed matrix for CIEXYZ and CIELab */ + +static void +copymatrix(pvt,input) + mpRGBPvtPtr pvt; + double *input; +{ + RGBFloat *mtrx = pvt->matrix; + int i; + + for (i = 0; i < 9; i++) + *mtrx++ = *input++; + + for (; i < 12; i++) + *mtrx++ = 0.0; /* bias */ +} + +static void +copywhiteLABFromRGB(pvt,tec,vec) + mpRGBPvtPtr pvt; + xieTypWhiteAdjustTechnique tec; + double *vec; +{ + RGBFloat *mtrx = pvt->matrix; + double a, b, c; + + switch (tec) { + case xieValWhiteAdjustCIELabShift: a = vec[0]; + b = vec[1]; + c = vec[2]; + break; + + case xieValWhiteAdjustDefault: + case xieValWhiteAdjustNone: /* calculate from pvt->matrix */ + a = mtrx[0] + mtrx[1] + mtrx[2]; + b = mtrx[3] + mtrx[4] + mtrx[5]; + c = mtrx[6] + mtrx[7] + mtrx[8]; + break; + + default: return; + } + + if (a < .0001) return; + if (b < .0001) return; + if (c < .0001) return; + scale_rows (mtrx, 1.0 / a, 1.0 / b, 1.0 / c); + return; +} + +static void +copywhiteLABToRGB(pvt,tec,vec) + mpRGBPvtPtr pvt; + xieTypWhiteAdjustTechnique tec; + double *vec; +{ + RGBFloat *mtrx = pvt->matrix; + double a, b, c; + switch (tec) { + case xieValWhiteAdjustCIELabShift: a = vec[0]; + b = vec[1]; + c = vec[2]; + break; + + case xieValWhiteAdjustDefault: + case xieValWhiteAdjustNone: + { /* White Point comes from XYZ Matrix. Must invert it first */ + RGBFloat *m = mtrx - 1; /* number matrix from 1 to 9 */ + double determinant = m[1] * (m[5]*m[9] - m[6]*m[8]) - + m[2] * (m[4]*m[9] - m[6]*m[7]) + + m[3] * (m[4]*m[8] - m[5]*m[7]); + a = (m[5]*m[9]-m[6]*m[8]); /* inv[00] */ + a += -(m[2]*m[9]-m[3]*m[8]); /* inv[01] */ + a += (m[2]*m[6]-m[3]*m[5]); /* inv[02] */ + b = -(m[4]*m[9]-m[6]*m[7]); /* inv[10] */ + b += (m[1]*m[9]-m[3]*m[7]); /* inv[11] */ + b += -(m[1]*m[6]-m[3]*m[4]); /* inv[12] */ + c = (m[4]*m[8]-m[5]*m[7]); /* inv[20] */ + c += -(m[1]*m[8]-m[2]*m[7]); /* inv[21] */ + c += (m[1]*m[5]-m[2]*m[4]); /* inv[22] */ + + a /= (determinant ? determinant : 1.0); + b /= (determinant ? determinant : 1.0); + c /= (determinant ? determinant : 1.0); + } + break; + + default: return; + } + scale_columns (pvt->matrix, a, b, c); + return; +} + +static void +copywhiteXYZFromRGB(pvt,tec,vec) + mpRGBPvtPtr pvt; + xieTypWhiteAdjustTechnique tec; + double *vec; +{ + switch (tec) { + case xieValWhiteAdjustCIELabShift: break; + case xieValWhiteAdjustDefault: return; + case xieValWhiteAdjustNone: return; + default: return; + } + if (vec[0] < .0001) return; + if (vec[1] < .0001) return; + if (vec[2] < .0001) return; + + scale_rows (pvt->matrix, 1.0 / vec[0], 1.0 / vec[1], 1.0 / vec[2]); +} + +static void +copywhiteXYZToRGB(pvt,tec,vec) + mpRGBPvtPtr pvt; + xieTypWhiteAdjustTechnique tec; + double *vec; +{ + switch (tec) { + case xieValWhiteAdjustCIELabShift: break; + case xieValWhiteAdjustDefault: return; + case xieValWhiteAdjustNone: return; + default: return; + } + scale_columns (pvt->matrix, vec[0], vec[1], vec[2]); +} + +static void +copygamut(pvt,tec) + mpRGBPvtPtr pvt; + xieTypGamutTechnique tec; +{ + if (tec == xieValGamutClipRGB) + pvt->post = act_postClipR; +} + +static void +copybiasYCbCr(pvt,bias0,bias1,bias2) + mpRGBPvtPtr pvt; + double bias0, bias1, bias2; +{ + pvt->matrix[9] = bias0; + pvt->matrix[10] = bias1; + pvt->matrix[11] = bias2; +} + +static void +copylumaYCbCrfromRGB(pvt,LumaRed,LumaGreen,LumaBlue) + mpRGBPvtPtr pvt; + double LumaRed,LumaGreen,LumaBlue; +{ + RGBFloat *mtrx = pvt->matrix; + + if (LumaRed < .01) LumaRed = .01; + if (LumaGreen < .01) LumaGreen = .01; + if (LumaBlue < .01) LumaBlue = .01; + if (LumaRed > .99) LumaRed = .99; + if (LumaGreen > .99) LumaGreen = .99; + if (LumaBlue > .99) LumaBlue = .99; + + /* + ** FROM TIFF 6.0 + ** + ** Y = (LumaRed*R + LumaGreen * G + LumaBlue * B) + ** Cb = (B - Y) / (2 - 2*LumaBlue) + ** Cr = (R - Y) / (2 - 2*LumaRed) + ** + ** Cb = .5 * (B - (Lr*R + Lg*G + Lb*B)) / (1 - Lb) + ** Cb = .5B/(1-Lb) - .5(Lr*R + Lg*G + Lb*B)) / (1-Lb) + ** Cb = .5B/(1-Lb) - .5 Lr*R/(1-Lb) -.5 Lg*G/(1-Lb) -.5 Lb*B/(1-Lb) + ** Cb = .5B(1-Lb)/(1-Lb) -.5 Lr*R/(1-Lb) -.5 Lg*G/(1-Lb) + ** Cb = .5B -.5 Lr*R/(1-Lb) -.5 Lg*G/(1-Lb) + */ + mtrx[0] = LumaRed; + mtrx[1] = LumaGreen; + mtrx[2] = LumaBlue; + mtrx[3] = -0.5 * LumaRed / (1.0 - LumaBlue); + mtrx[4] = -0.5 * LumaGreen / (1.0 - LumaBlue); + mtrx[5] = 0.5; + mtrx[6] = 0.5; + mtrx[7] = -0.5 * LumaGreen / (1.0 - LumaRed); + mtrx[8] = -0.5 * LumaBlue / (1.0 - LumaRed); + + mtrx[9] = mtrx[10] = mtrx[11] = 0.0; /* bias */ +} + +static void +copylumaYCbCrtoRGB(pvt,LumaRed,LumaGreen,LumaBlue) + mpRGBPvtPtr pvt; + double LumaRed,LumaGreen,LumaBlue; +{ + RGBFloat *mtrx = pvt->matrix; + + /* should/could check that LumaRed + LumaGreen + LumaBlue approx == 1.0 */ + + if (LumaGreen < .01) LumaGreen = .01; + if (LumaGreen > .99) LumaGreen = .99; + + /* + ** FROM TIFF 6.0 + ** + ** R = Cr * (2 - 2 * LumaRed) + Y + ** G = (Y - LumaBlue * B - LumaRed * R) / LumaGreen + ** B = Cb * (2 - 2 * LumaBlue) + Y + ** + ** G = (Y - Lb*(Cb*(2-2*Lb) + Y) - Lr*(Cr*(2-2*Lr) + Y) ) / Lg + ** G = (Y - Lb*Cb*(2-2*Lb) - Lb*Y - Lr*Cr*(2-2*Lr) - Lr*Y ) / Lg + ** G = ((1 - Lb - Lr)*Y - 2*Lb*(1-Lb)*Cb - 2*Lr*(1-Lr)*Cr ) / Lg + ** + ** R = 1 * Y + 0 * Cb + (2 - 2 * LumaRed) * Cr + ** G = 1 * Y + ... + ** B = 1 * Y + (2 - 2 * LumaBlue) * Cb + 0 * Cr + ** + ** note: mtrx[3] == 1.0 when LR+LG+LB==1.0 + */ + mtrx[0] = 1.0; + mtrx[1] = 0.0; + mtrx[2] = 2.0 - 2.0 * LumaRed; + + mtrx[3] = (1.0 - LumaRed - LumaBlue) / LumaGreen; + mtrx[4] = -2.0 * LumaBlue * (1.0 - LumaBlue) / LumaGreen; + mtrx[5] = -2.0 * LumaRed * (1.0 - LumaRed ) / LumaGreen; + + mtrx[6] = 1.0; + mtrx[7] = 2.0 - 2.0 * LumaBlue; + mtrx[8] = 0.0; + + mtrx[9] = mtrx[10] = mtrx[11] = 0.0; /* bias */ + +} + +static void +copylumaYCCfromRGB(pvt,LumaRed,LumaGreen,LumaBlue,Scale,oband) + mpRGBPvtPtr pvt; + double LumaRed,LumaGreen,LumaBlue,Scale; + bandPtr oband; +{ + RGBFloat *mtrx = pvt->matrix; + + if (LumaGreen < .01) LumaGreen = .01; + + /* + ** See "A Planning Guide For Developers" from KODAK PhotoCD Products. + ** Typical CCIR601.1 values of (.299, .587, .114) are used for + ** (LumaRed,LumaGreen,LumaBlue). + ** + ** Y = ( LumaRed*R + LumaGreen * G + LumaBlue * B) + ** C1 = ( -LumaRed*R - LumaGreen * G + (1-LumaBlue) * B) + ** C2 = ((1-LumaRed)*R - LumaGreen * G + -LumaBlue * B) + ** + ** From the same paper we are treated with the following equations + ** for packing 8bit pixels: + ** + ** PACK: UMPACK + ** Y' = 255/1.402 * Y Y = 1.3584 * Y' + ** C1' = 111.40 * C1 + 156 C1 = 2.2179 * (C1' - 156) + ** C2' = 135.64 * C2 + 137 C2 = 1.8215 * (C2' - 137) + ** + ** Extrapolating a bit we can see that this is: + ** + ** Y' = 255/1.402 * Y + ** C1' = 255/2.289 * C1 + (.612 * 255) <2.289 = 1.402 * 1.6327 > + ** C2' = 255/1.879 * C2 + (.537 * 255) <1.879 = 1.402 * 1.3409 > + ** + ** Y = 1.3584 * Y' + ** C1 = 1.3584 * 1.6327 * (C1' - (.612*255)) + ** C2 = 1.3584 * 1.3409 * (C2' - (.537*255)) + ** + ** So we are left with a choice between the magic 1.402 and 1.3584 + ** values. Hey, better idea. Its now an XIE protocol parameter + ** called "scale". + ** + ** In future versions, its possible we will want to accept the 1.3584 + ** number as a technique parameter in addition to the Luma. + */ + mtrx[0] = LumaRed; + mtrx[1] = LumaGreen; + mtrx[2] = LumaBlue; + mtrx[3] = -LumaRed; + mtrx[4] = -LumaGreen; + mtrx[5] = 1.0 - LumaBlue; + mtrx[6] = 1.0 - LumaRed; + mtrx[7] = -LumaGreen; + mtrx[8] = -LumaBlue; + + if (IsConstrained(oband->format->class)) { + + /* Scale each row of matrix by compression factors */ + scale_rows (mtrx, 1.0 / (Scale ), + 1.0 / (Scale * 1.6327), + 1.0 / (Scale * 1.3409)); + + /* Bias expressed as fraction of pixel range */ + mtrx[9] = 0.0; + mtrx[10] = 0.612 * (RGBFloat) ((oband+1)->format->levels-1); + mtrx[11] = 0.5373 * (RGBFloat) ((oband+2)->format->levels-1); + } +} + +static void +copylumaYCCtoRGB(pvt,LumaRed,LumaGreen,LumaBlue,Scale,iband) + mpRGBPvtPtr pvt; + double LumaRed,LumaGreen,LumaBlue,Scale; + bandPtr iband; +{ + RGBFloat *mtrx = pvt->matrix; + + if (LumaGreen < .01) LumaGreen = .01; + + /* + ** See "A Planning Guide For Developers" from KODAK PhotoCD Products. + ** Typical values of (.299, .587, .114) are used for (LR,LG,LB). + ** + ** R = 1 * Y + 0 * C1 + 1 * C2 + ** G = 1 * Y - .194 * C1 - .509 * C2 + ** B = 1 * Y + 1 * C1 + 0 * C2 + ** + ** By inverting the matrix symbolically we can deduce that the + ** constants .194 and .509 are not arbitrary: + ** + ** R = 1 * Y + 0 * C1 + 1 * C2 + ** G = 1 * Y - LB/LG * C1 - LR/LG * C2 + ** B = 1 * Y + 1 * C1 + 0 * C2 + ** + ** Note: mtrx[3] == 1.0 when LR+LG+LB==1.0 + */ + mtrx[0] = 1.0; + mtrx[1] = 0.0; + mtrx[2] = 1.0; + + mtrx[3] = (1.0 - LumaRed - LumaBlue) / LumaGreen; + mtrx[4] = - LumaBlue/LumaGreen; + mtrx[5] = - LumaRed/LumaGreen; + + mtrx[6] = 1.0; + mtrx[7] = 1.0; + mtrx[8] = 0.0; + + if (IsConstrained(iband->format->class)) { + + /* Scale each column of matrix by compression factors */ + scale_columns (mtrx, Scale, (Scale * 1.6327), (Scale * 1.3409)); + + /* Bias expressed as fraction of pixel range */ + mtrx[9] = 0.0; + mtrx[10] = 0.612 * (RGBFloat) ((iband+1)->format->levels-1); + mtrx[11] = 0.5373 * (RGBFloat) ((iband+2)->format->levels-1); + } + +} + +/*------------------------------------------------------------------------ +-------------------------- initialize element . . . ---------------------- +------------------------------------------------------------------------*/ + +static int +SetupToRGB(flo,ped,modify) + floDefPtr flo; + peDefPtr ped; + int modify; +{ + peTexPtr pet = ped->peTex; + mpRGBPvtPtr pvt = (mpRGBPvtPtr) pet->private; + pTecCIEToRGBDefPtr pCIE = (pTecCIEToRGBDefPtr) ped->techPvt; + pTecYCCToRGBDefPtr pYCC = (pTecYCCToRGBDefPtr) ped->techPvt; + pTecYCbCrToRGBDefPtr pYCb = (pTecYCbCrToRGBDefPtr) ped->techPvt; + + pvt->action = act_mmRR; + pvt->post = 0; + + switch(ped->techVec->number) { + case xieValCIELabToRGB: + /* if whiteAdjusted, or calculate from inverted matrix */ + copymatrix(pvt, pCIE->matrix); + copywhiteLABToRGB (pvt, pCIE->whiteAdjusted, pCIE->whitePoint); + copygamut (pvt, pCIE->gamutCompress); + pvt->action = act_preCIELab; /* calls act_mmRR */ + break; + case xieValCIEXYZToRGB: + copymatrix(pvt, pCIE->matrix); + copywhiteXYZToRGB (pvt, pCIE->whiteAdjusted, pCIE->whitePoint); + copygamut (pvt, pCIE->gamutCompress); + break; + case xieValYCbCrToRGB: + copylumaYCbCrtoRGB(pvt, pYCb->red, pYCb->green, pYCb->blue); + copybiasYCbCr(pvt, pYCb->bias0, pYCb->bias1, pYCb->bias2); + copygamut(pvt, pYCb->gamutCompress); + break; + case xieValYCCToRGB: + copylumaYCCtoRGB(pvt, pYCC->red, pYCC->green, pYCC->blue, + pYCC->scale, &(pet->receptor[SRCtag].band[0])); + copygamut (pvt, pYCC->gamutCompress); + break; + } + + CheckRGB(flo,ped,FALSE); + + return TRUE; +} + +static int +SetupFromRGB(flo,ped,modify) + floDefPtr flo; + peDefPtr ped; + int modify; +{ + peTexPtr pet = ped->peTex; + mpRGBPvtPtr pvt = (mpRGBPvtPtr) pet->private; + pTecRGBToCIEDefPtr pCIE = (pTecRGBToCIEDefPtr) ped->techPvt; + pTecRGBToYCCDefPtr pYCC = (pTecRGBToYCCDefPtr) ped->techPvt; + pTecRGBToYCbCrDefPtr pYCb = (pTecRGBToYCbCrDefPtr) ped->techPvt; + + pvt->action = act_mmRR; + pvt->post = (void (*)()) 0; + + switch(ped->techVec->number) { + case xieValRGBToCIELab: + copymatrix(pvt, pCIE->matrix); + copywhiteLABFromRGB(pvt, pCIE->whiteAdjusted, + pCIE->whitePoint); + pvt->post = act_postCIELab; + break; + case xieValRGBToCIEXYZ: + copymatrix(pvt, pCIE->matrix); + copywhiteXYZFromRGB(pvt, pCIE->whiteAdjusted, + pCIE->whitePoint); + break; + case xieValRGBToYCbCr: + copylumaYCbCrfromRGB(pvt, pYCb->red, pYCb->green, pYCb->blue); + copybiasYCbCr(pvt, pYCb->bias0, pYCb->bias1, pYCb->bias2); + break; + case xieValRGBToYCC: + copylumaYCCfromRGB(pvt, pYCC->red, pYCC->green, pYCC->blue, + pYCC->scale, &(pet->emitter[0])); + break; + } + + CheckRGB(flo,ped,TRUE); + + return TRUE; +} + +static void +CheckRGB(flo,ped,fromrgb) + floDefPtr flo; + peDefPtr ped; + Bool fromrgb; +{ + peTexPtr pet = ped->peTex; + bandPtr iband = &(pet->receptor[SRCtag].band[0]); + bandPtr oband = &(pet->emitter[0]); + CARD32 nbands = pet->receptor[SRCtag].inFlo->bands; + mpRGBPvtPtr pvt = (mpRGBPvtPtr) pet->private; + + CARD32 c, cmin, cmax, l, lmin, lmax; + CARD32 band; + + pvt->cvt_in[0] = pvt->cvt_in[1] = pvt->cvt_in[2] = (pointer (*)()) 0; + pvt->cvt_out[0] = pvt->cvt_out[1] = pvt->cvt_out[2] = (pointer (*)()) 0; + pvt->aux_buf[0] = pvt->aux_buf[1] = pvt->aux_buf[2] = (pointer) 0; + + if (IsntConstrained(iband->format->class)) { + /* Already set up to activate floating routine */ + return; + } + + cmin = PAIR_PIXEL; cmax = BIT_PIXEL; + lmin = (1<<24); lmax = 1; + + for (band = 0; band < nbands; band++, iband++, oband++) { + + c = iband->format->class; + if (c < cmin) cmin = c; + if (c > cmax) cmax = c; + + l = iband->format->levels; + if (l < lmin) lmin = l; + if (l > lmax) lmax = l; + + if (IsntConstrained(oband->format->class)) + continue; + + c = oband->format->class; + if (c < cmin) cmin = c; + if (c > cmax) cmax = c; + + l = oband->format->levels; + if (l < lmin) lmin = l; + if (l > lmax) lmax = l; + + } iband -= 3; oband -= 3; + + + /* Scale each column of matrix to scale from input levels to 0 ... 1 */ + scale_columns (pvt->matrix, + (double) (1.0 / ((iband+0)->format->levels - 1)), + (double) (1.0 / ((iband+1)->format->levels - 1)), + (double) (1.0 / ((iband+2)->format->levels - 1))); + + if (IsntConstrained(oband->format->class)) { + + /* Only RGBtoCIEXYZ and RGBtoCIELab will Unconstrain the data */ + + if (lmin > (1<<1) && lmax <= (1<<8)) { /* ALL Bytes */ + pvt->action = act_mmBR; + return; + } + + pvt->action = act_mmPR; + if (lmin > (1<<8)) /* ALL Pairs */ + return; + + for (band = 0; band < nbands; band++, iband++) { /* SOME Pairs */ + int levels = iband->format->levels; + if (levels <= (1<<8)) { + pvt->cvt_in[band] = levels < (1<<1) + ? cvt_bit_to_pair + : cvt_byte_to_pair; + pvt->aux_buf[band] = (pointer) + XieMalloc( iband->format->width * sizeof(PairPixel)); + if (!pvt->aux_buf[band]) + AllocError(flo,ped,return); + } + } iband -= 3; + return; + } + + /* If we got to here, we will implicitly HardClip the outputs */ + pvt->post = (void (*)()) 0; + + pvt->iclip[0] = (oband+0)->format->levels - 1; + pvt->iclip[1] = (oband+1)->format->levels - 1; + pvt->iclip[2] = (oband+2)->format->levels - 1; + + /* Scale each row of matrix to map output from 0...1 to 0...nlev-1 */ + scale_rows (pvt->matrix, (double) ((oband+0)->format->levels - 1), + (double) ((oband+1)->format->levels - 1), + (double) ((oband+2)->format->levels - 1)); + + /* Adjust bias for integer YCbCr and YCC */ + if (!fromrgb) switch (ped->techVec->number) { + case xieValRGBToYCC: /* fall thru */ + case xieValRGBToYCbCr: flip_bias(pvt->matrix); + break; + default: break; + } + + if (lmin > (1<<1) && lmax <= (1<<8)) { /* ALL Bytes */ + pvt->action = act_mmBB; + scale_mtrx(pvt->matrix,pvt->imatrix,(1<action = act_mmPP; + scale_mtrx(pvt->matrix,pvt->imatrix,(1< (1<<8)) /* ALL Pairs */ + return; + + for (band = 0; band < nbands; band++, iband++, oband++) { + int levels; + levels = iband->format->levels; + pvt->cvt_in[band] = levels <= (1<<1) ? cvt_bit_to_pair : + levels <= (1<<8) ? cvt_byte_to_pair : + (pointer (*)()) 0; + levels = oband->format->levels; + pvt->cvt_out[band] = levels <= (1<<1) ? cvt_pair_to_bit : + levels <= (1<<8) ? cvt_pair_to_byte : + (pointer (*)()) 0; + if ( pvt->cvt_in[band] || pvt->cvt_out[band]) { + pvt->aux_buf[band] = (pointer) + XieMalloc( iband->format->width * sizeof(PairPixel)); + if (!pvt->aux_buf[band]) + AllocError(flo,ped,return); + } + } iband -= 3; oband -= 3; + return; +} + +static void +ClearRGB(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + mpRGBPvtPtr pvt = (mpRGBPvtPtr) ped->peTex->private; + + if (!pvt) + return; + + pvt->cvt_in[0] = pvt->cvt_in[1] = pvt->cvt_in[2] = (pointer (*)()) 0; + pvt->cvt_out[0] = pvt->cvt_out[1] = pvt->cvt_out[2] = (pointer (*)()) 0; + + if (pvt->aux_buf[0]) pvt->aux_buf[0] = (pointer) XieFree(pvt->aux_buf[0]); + if (pvt->aux_buf[1]) pvt->aux_buf[1] = (pointer) XieFree(pvt->aux_buf[1]); + if (pvt->aux_buf[2]) pvt->aux_buf[2] = (pointer) XieFree(pvt->aux_buf[2]); +} + +/* end module mprgb.c */ diff --git a/xie/xc/programs/Xserver/XIE/mixie/process/mpuncnst.c b/xie/xc/programs/Xserver/XIE/mixie/process/mpuncnst.c new file mode 100644 index 0000000..fb99ad5 --- /dev/null +++ b/xie/xc/programs/Xserver/XIE/mixie/process/mpuncnst.c @@ -0,0 +1,314 @@ +/* $XConsortium: mpuncnst.c,v 1.5 94/04/17 20:35:26 rws Exp $ */ +/**** module mpuncnst.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mpuncnst.c -- DDXIE Unconstrain element + + Dean Verheiden && Larry Hare -- AGE Logic, Inc. May, 1993 + +*****************************************************************************/ + + +#define _XIEC_MPUNCNST +#define _XIEC_PUNCNST + +/* + * Include files + */ +#include + +/* + * Core X Includes + */ +#include +#include +/* + * XIE Includes + */ +#include +#include +/* + * more X server includes. + */ +#include +#include +/* + * Server XIE Includes + */ +#include +#include +#include +#include +#include + + +/* + * routines referenced by other DDXIE modules + */ +int miAnalyzeUnconstrain(); + +/* + * routines used internal to this module + */ +static int CreateUnconstrain(); +static int InitializeUnconstrain(); +static int ActivateUnconstrain(); +static int ResetUnconstrain(); +static int DestroyUnconstrain(); + +/* + * DDXIE Unconstrain entry points + */ +static ddElemVecRec UnconstrainVec = { + CreateUnconstrain, + InitializeUnconstrain, + ActivateUnconstrain, + (xieIntProc)NULL, + ResetUnconstrain, + DestroyUnconstrain +}; + +/* + * Local Declarations. + */ + +typedef struct _mpuncnstndef { + void (*action) (); +} mpUncnstPvtRec, *mpUncnstPvtPtr; + +static void CastQuad(), CastPair(), CastByte(), CastBit(), CastNothing(); + +/*------------------------------------------------------------------------ +------------------------ fill in the vector --------------------------- +------------------------------------------------------------------------*/ +int miAnalyzeUnconstrain(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ped->ddVec = UnconstrainVec; + return TRUE; +} + +/*------------------------------------------------------------------------ +---------------------------- create peTex . . . -------------------------- +------------------------------------------------------------------------*/ +static int CreateUnconstrain(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + int auxsize = xieValMaxBands * sizeof(mpUncnstPvtRec); + + return MakePETex(flo,ped,auxsize,NO_SYNC,NO_SYNC); +} + +/*------------------------------------------------------------------------ +---------------------------- initialize peTex . . . ---------------------- +------------------------------------------------------------------------*/ +static int InitializeUnconstrain(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + peTexPtr pet = ped->peTex; + mpUncnstPvtPtr pvt = (mpUncnstPvtPtr) pet->private; + bandPtr iband; + int band, nbands, status; + + /* ped->flags.modified = FALSE; */ + + status = InitReceptors(flo,ped,NO_DATAMAP,1) && + InitEmitter(flo,ped,NO_DATAMAP,-1); + + nbands = pet->receptor[SRCtag].inFlo->bands; + iband = &(pet->receptor[SRCtag].band[0]); + + for(band = 0; band < nbands; band++, pvt++, iband++) { + switch (iband->format->class) { + case QUAD_PIXEL: pvt->action = CastQuad; break; + case PAIR_PIXEL: pvt->action = CastPair; break; + case BYTE_PIXEL: pvt->action = CastByte; break; + case BIT_PIXEL: pvt->action = (iband->format->levels == 1) + ? CastNothing : CastBit; + break; + default: ImplementationError(flo, ped, return(FALSE)); + break; + } + } + return status; +} + +/*------------------------------------------------------------------------ +----------------------------- crank some data ---------------------------- +------------------------------------------------------------------------*/ + + +static int ActivateUnconstrain(flo,ped,pet) + floDefPtr flo; + peDefPtr ped; + peTexPtr pet; +{ + mpUncnstPvtPtr pvt = (mpUncnstPvtPtr) pet->private; + bandPtr oband = &(pet->emitter[0]); + bandPtr iband = &(pet->receptor[SRCtag].band[0]); + int band, nbands = pet->receptor[SRCtag].inFlo->bands; + + for(band = 0; band < nbands; band++, iband++, oband++, pvt++) { + register int bw = iband->format->width; + register RealPixel *outp; + register pointer voidp; + + if (!(voidp = GetCurrentSrc(flo,pet,iband)) || + !(outp = (RealPixel*)GetCurrentDst(flo,pet,oband))) continue; + + do { + + (*(pvt->action)) (voidp, outp, bw); + + voidp = GetNextSrc(flo,pet,iband,TRUE); + outp = (RealPixel*)GetNextDst(flo,pet,oband,TRUE); + + } while (!ferrCode(flo) && voidp && outp) ; + + FreeData(flo, pet, iband, iband->current); + } + return TRUE; +} + +/*------------------------------------------------------------------------ +------------------------ get rid of run-time stuff ----------------------- +------------------------------------------------------------------------*/ +static int ResetUnconstrain(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + ResetReceptors(ped); + ResetEmitter(ped); + return TRUE; +} + +/*------------------------------------------------------------------------ +-------------------------- get rid of this element ----------------------- +------------------------------------------------------------------------*/ +static int DestroyUnconstrain(flo,ped) + floDefPtr flo; + peDefPtr ped; +{ + if(ped->peTex) + ped->peTex = (peTexPtr) XieFree(ped->peTex); + + /* zap this element's entry point vector */ + ped->ddVec.create = (xieIntProc)NULL; + ped->ddVec.initialize = (xieIntProc)NULL; + ped->ddVec.activate = (xieIntProc)NULL; + ped->ddVec.reset = (xieIntProc)NULL; + ped->ddVec.destroy = (xieIntProc)NULL; + + return TRUE; +} + +/*------------------------------------------------------------------------ +--------------------- Lotsa Little Action Routines --------------------- +------------------------------------------------------------------------*/ + +#define MakeCast(fn_name,itype) \ +static void fn_name(voidp,outp,bw) \ + pointer voidp; RealPixel *outp; int bw; \ +{ \ + register itype *inp = (itype *) voidp; \ + register int ix; \ + for (ix = 0; ix < bw; ix++) \ + *outp++ = (RealPixel) *inp++; \ +} + +MakeCast (CastQuad,QuadPixel) +MakeCast (CastPair,PairPixel) +MakeCast (CastByte,BytePixel) + +static void CastBit(voidp,outp,bw) + pointer voidp; RealPixel *outp; int bw; +{ + register LogInt *inp = (LogInt *) voidp; + register RealPixel One = (RealPixel) 1.0; + register RealPixel Zero = (RealPixel) 0.0; + register LogInt M, inval; + for ( ; bw >= LOGSIZE ; bw -= 32) + for (M=LOGLEFT, inval = *inp++; M; LOGRIGHT(M)) + *outp++ = (inval & M) ? One : Zero; + if (bw) + for (M=LOGLEFT, inval = *inp++; bw; bw--, LOGRIGHT(M)) + *outp++ = (inval & M) ? One : Zero; +} + +static void CastNothing(voidp,outp,bw) + pointer voidp; RealPixel *outp; int bw; +{ + register RealPixel Zero = (RealPixel) 0.0; + register int ix; + for (ix = 0; ix < bw; ix++) + outp[ix] = Zero; +} + +/* end module mpuncnst.c */ diff --git a/xie/xc/programs/xieperf/Imakefile b/xie/xc/programs/xieperf/Imakefile new file mode 100644 index 0000000..74867a3 --- /dev/null +++ b/xie/xc/programs/xieperf/Imakefile @@ -0,0 +1,22 @@ +XCOMM $XConsortium: Imakefile,v 1.8 94/01/12 20:44:41 rws Exp $ + + SRCS = abort.c arith.c await.c band.c blend.c cache.c compare.c complex.c \ + constrain.c convolve.c creatdstry.c cvttoindex.c dither.c \ + encode.c errors.c events.c exportcl.c funcode.c geometry.c \ + getnext.c import.c importcl.c logical.c math.c modify.c \ + mtchhist.c pasteup.c point.c purgecolst.c query.c redefine.c \ + rgb.c tests.c uconstrain.c xieperf.c + + OBJS = abort.o arith.o await.o band.o blend.o cache.o compare.o complex.o \ + constrain.o convolve.o creatdstry.o cvttoindex.o dither.o \ + encode.o errors.o events.o exportcl.o funcode.o geometry.o \ + getnext.o import.o importcl.o logical.o math.o modify.o \ + mtchhist.o pasteup.o point.o purgecolst.o query.o redefine.o \ + rgb.o tests.o uconstrain.o xieperf.o + + LOCAL_LIBRARIES = $(XIELIB) $(XMULIB) $(XLIB) + DEPLIBS = $(DEPXIELIB) $(DEPXMULIB) $(DEPXLIB) + SYS_LIBRARIES = MathLibrary + DEFINES = $(SIGNAL_DEFINES) + +ComplexProgramTarget(xieperf) diff --git a/xie/xc/programs/xieperf/abort.c b/xie/xc/programs/xieperf/abort.c new file mode 100644 index 0000000..78843b1 --- /dev/null +++ b/xie/xc/programs/xieperf/abort.c @@ -0,0 +1,209 @@ +/* $XConsortium: abort.c,v 1.8 94/04/17 20:39:03 rws Exp $ */ + +/**** module abort.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + abort.c -- abort flo test + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include + +static int AbortAndWaitForEvent(); + +static XieLut XIELut; +static XiePhotoElement *flograph; +static XiePhotoflo flo; + +int InitAbort(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XieDataClass class; + XieOrientation band_order; + XieLTriplet length, levels; + Bool merge; + XieLTriplet start; + + XIELut = ( XieLut ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + if ( !(XIELut = XieCreateLUT( xp->d ) ) ) + { + fprintf( stderr, "XieCreateLUT failed\n" ); + reps = 0; + } + + if ( reps ) + { + /* set up a flo to read a lut from client */ + + flograph = XieAllocatePhotofloGraph(2); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf(stderr,"XieAllocatePhotofloGraph failed\n"); + reps = 0; + } + + class = xieValSingleBand; + band_order = xieValLSFirst; + length[ 0 ] = ( ( AbortParms * ) p->ts )->lutSize; + length[ 1 ] = 0; + length[ 2 ] = 0; + levels[ 0 ] = ( ( AbortParms * ) p->ts )->lutLevels; + levels[ 1 ] = 0; + levels[ 2 ] = 0; + + XieFloImportClientLUT(&flograph[0], + class, + band_order, + length, + levels + ); + + merge = False; + start[ 0 ] = 0; + start[ 1 ] = 0; + start[ 2 ] = 0; + + XieFloExportLUT(&flograph[1], + 1, /* source phototag number */ + XIELut, + merge, + start + ); + + flo = XieCreatePhotoflo( xp->d, flograph, 2 ); + } + if ( !reps ) + FreeAbortStuff( xp, p ); + return( reps ); +} + +void DoAbort(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + + XieExecutePhotoflo( xp->d, flo, True ); + + /* now, the flo should be active and waiting for data */ + + if ( !AbortAndWaitForEvent( xp, p, 0, flo ) ) + break; + } +} + +void EndAbort(xp, p) + XParms xp; + Parms p; +{ + XieFreePhotofloGraph(flograph,2); + XieDestroyPhotoflo( xp->d, flo ); + XieDestroyLUT( xp->d, XIELut ); +} + +static int +AbortAndWaitForEvent( xp, p, namespace, flo_id ) +XParms xp; +Parms p; +unsigned long namespace; +unsigned long flo_id; +{ + XieAbort( xp->d, namespace, flo_id ); + return( WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo_id, 0, False ) ); +} + +int +FreeAbortStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + if ( flograph ) + { + XieFreePhotofloGraph(flograph,2); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} diff --git a/xie/xc/programs/xieperf/arith.c b/xie/xc/programs/xieperf/arith.c new file mode 100644 index 0000000..5e77455 --- /dev/null +++ b/xie/xc/programs/xieperf/arith.c @@ -0,0 +1,472 @@ +/* $XConsortium: arith.c,v 1.6 94/04/17 20:39:03 rws Exp $ */ + +/**** module arith.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + arith.c -- arithmetic flo element tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include + +static XiePhotomap XIEPhotomap1; +static XiePhotomap XIEPhotomap2; +static XieRoi XIERoi; +static XieLut XIELut; +static XiePhotomap ControlPlane; + +static XIEimage *image1, *image2; +static int flo_notify; +static XiePhotoElement *flograph; +static XiePhotoflo flo; +static int flo_elements; +static int monoflag; + +static XieClipScaleParam *parms; + +int +InitArithmetic(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XieProcessDomain domain; + XieArithmeticOp op; + XieConstant constant; + unsigned int bandMask; + Bool constrain; + int useDomain; + int idx; + int src1, src2; + XieRectangle rect; + XieConstrainTechnique constrainTech; + XieLTriplet levels; + XieConstant in_low,in_high; + XieLTriplet out_low,out_high; + int cclass; + +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xp->vinfo.c_class; +#else + cclass = xp->vinfo.class; +#endif + + monoflag = 0; + useDomain = ( ( ArithmeticParms * )p->ts )->useDomain; + op = ( ( ArithmeticParms * )p->ts )->op; + constant[ 0 ] = ( ( ArithmeticParms * )p->ts )->constant[ 0 ]; + constant[ 1 ] = ( ( ArithmeticParms * )p->ts )->constant[ 1 ]; + constant[ 2 ] = ( ( ArithmeticParms * )p->ts )->constant[ 2 ]; + bandMask = ( ( ArithmeticParms * )p->ts )->bandMask; + constrain = ( ( ArithmeticParms * )p->ts )->constrain; + constrainTech = ( ( ArithmeticParms * )p->ts )->constrainTech; + in_low[ 0 ] = ( ( ArithmeticParms * )p->ts )->inLow; + in_low[ 1 ] = 0; + in_low[ 2 ] = 0; + in_high[ 0 ] = ( ( ArithmeticParms * )p->ts )->inHigh; + in_high[ 1 ] = 0; + in_high[ 2 ] = 0; + + XIELut = ( XieLut ) NULL; + XIERoi = ( XieRoi ) NULL; + XIEPhotomap1 = ( XiePhotomap ) NULL; + XIEPhotomap2 = ( XiePhotomap ) NULL; + ControlPlane = ( XiePhotomap ) NULL; + flo = ( XiePhotoflo ) NULL; + flograph = ( XiePhotoElement * ) NULL; + parms = ( XieClipScaleParam * ) NULL; + + switch( op ) + { + case xieValAdd: + case xieValSub: + case xieValSubRev: + case xieValMul: + case xieValDiv: + case xieValDivRev: + case xieValMin: + case xieValMax: + case xieValGamma: + break; + default: + fprintf( stderr, "Invalid arithmetic op\n" ); + reps = 0; + break; + } + + if ( !reps ) + return( reps ); + + image1 = p->finfo.image1; + + /* we must have image1. image2, however, is optional */ + + if ( !image1 ) + return ( 0 ); + image2 = p->finfo.image2; + + if ( image2 ) + flo_elements = 4; + else + flo_elements = 3; + if ( useDomain == DomainROI || useDomain == DomainCtlPlane ) + flo_elements++; + if ( constrain == True ) + if ( image2 ) + flo_elements += 3; + else + flo_elements += 2; + if ( xp->screenDepth != image1->depth[ 0 ] && constrain == False ) + { + monoflag = 1; + flo_elements+=2; + if ( ( XIELut = CreatePointLut( xp, p, + 1 << image1->depth[ 0 ], + 1 << xp->screenDepth, False ) ) + == ( XieLut ) NULL ) + { + reps = 0; + } + } + else if ( IsTrueColorOrDirectColor( cclass ) && constrain == True ) + { + monoflag = 1; + flo_elements+=2; + if ( ( XIELut = CreatePointLut( xp, p, + xp->vinfo.colormap_size, + 1 << xp->screenDepth, False ) ) + == ( XieLut ) NULL ) + { + reps = 0; + } + } + + if ( reps ) + { + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else if ( ( XIEPhotomap1 = GetXIEPhotomap( xp, p, 1 ) ) == + ( XiePhotomap ) NULL ) + { + reps = 0; + } + else if ( image2 ) + { + if ( ( XIEPhotomap2 = GetXIEPhotomap( xp, p, 2 ) ) == + ( XiePhotomap ) NULL ) + { + reps = 0; + } + } + + if ( useDomain == DomainROI ) + { + rect.x = ( ( ArithmeticParms * )p->ts )->x; + rect.y = ( ( ArithmeticParms * )p->ts )->y; + rect.width = ( ( ArithmeticParms * )p->ts )->width; + rect.height = ( ( ArithmeticParms * )p->ts )->height; + + if ( ( XIERoi = GetXIERoi( xp, p, &rect, 1 ) ) == + ( XieRoi ) NULL ) + { + reps = 0; + } + } + else if ( useDomain == DomainCtlPlane ) + { + ControlPlane = GetControlPlane( xp, 13 ); + if ( ControlPlane == ( XiePhotomap ) NULL ) + reps = 0; + } + } + + if ( reps ) + { + idx = 0; + + domain.offset_x = 0; + domain.offset_y = 0; + + + if ( useDomain == DomainROI ) + { + XieFloImportROI(&flograph[idx], XIERoi); + idx++; + domain.phototag = idx; + } + else if ( useDomain == DomainCtlPlane ) + { + XieFloImportPhotomap(&flograph[idx], ControlPlane, False +); + idx++; + domain.phototag = idx; + } + else + { + domain.phototag = 0; + } + + XieFloImportPhotomap(&flograph[idx], XIEPhotomap1, False ); + idx++; + src1 = idx; + + if ( constrain == True ) + { + XieFloUnconstrain( &flograph[idx], idx ); + idx++; + src1 = idx; + } + + if ( image2 ) + { + XieFloImportPhotomap(&flograph[idx], XIEPhotomap2, + False ); + idx++; + src2 = idx; + + if ( constrain == True ) + { + XieFloUnconstrain( &flograph[idx], idx ); + idx++; + src2 = idx; + } + } + else + src2 = 0; + + XieFloArithmetic(&flograph[idx], + src1, + src2, + &domain, + constant, + op, + bandMask + ); + idx++; + + if ( constrain == True ) + { + levels[ 0 ] = xp->vinfo.colormap_size; + levels[ 1 ] = 0; + levels[ 2 ] = 0; + + if ( constrainTech == xieValConstrainHardClip ) + parms = ( XieClipScaleParam * ) NULL; + else if ( constrainTech == xieValConstrainClipScale ) + { + out_low[ 0 ] = 0; + out_low[ 1 ] = 0; + out_low[ 2 ] = 0; + out_high[ 0 ] = xp->vinfo.colormap_size - 1; + out_high[ 1 ] = xp->vinfo.colormap_size - 1; + out_high[ 2 ] = xp->vinfo.colormap_size - 1; + + parms = ( XieClipScaleParam * ) + XieTecClipScale( in_low, + in_high, out_low, out_high); + if ( parms == ( XieClipScaleParam * ) NULL ) + { + fprintf( stderr, "Trouble loading clipscale technique parameters\n" ); + reps = 0; + } + } + else + { + fprintf( stderr, + "Invalid technique for constrain\n" ); + reps = 0; + } + if ( reps ) + { + XieFloConstrain( &flograph[idx], + idx, + levels, + constrainTech, + ( char * ) parms + ); + idx++; + } + } + + if ( reps && monoflag ) + { + XieFloImportLUT(&flograph[idx], XIELut ); + idx++; + + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + idx-1, + &domain, + idx, + 0x7 + ); + idx++; + } + if ( reps ) + { + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + idx++; + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + flo_notify = True; + } + } + if ( !reps ) + FreeArithStuff( xp, p ); + + return( reps ); +} + +void +DoArithmetic(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + } +} + +void +EndArithmetic(xp, p) +XParms xp; +Parms p; +{ + FreeArithStuff( xp, p ); +} + +int +FreeArithStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( parms ) + { + XFree( parms ); + parms = ( XieClipScaleParam * ) NULL; + } + + if ( XIERoi ) + { + XieDestroyROI( xp->d, XIERoi ); + XIERoi = ( XieRoi ) NULL; + } + + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + + if ( XIEPhotomap1 && IsPhotomapInCache( XIEPhotomap1 ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap1 ); + XIEPhotomap1 = ( XiePhotomap ) NULL; + } + + if ( XIEPhotomap2 && IsPhotomapInCache( XIEPhotomap2 ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap2 ); + XIEPhotomap2 = ( XiePhotomap ) NULL; + } + + if ( ControlPlane ) + { + XieDestroyPhotomap( xp->d, ControlPlane ); + ControlPlane = ( XiePhotomap ) NULL; + } + + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } +} diff --git a/xie/xc/programs/xieperf/await.c b/xie/xc/programs/xieperf/await.c new file mode 100644 index 0000000..5e229ef --- /dev/null +++ b/xie/xc/programs/xieperf/await.c @@ -0,0 +1,424 @@ +/* $XConsortium: await.c,v 1.12 94/04/17 20:39:06 rws Exp $ */ + +/**** module await.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + await.c -- await flo element test + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#ifdef WIN32 +#include +#endif +#include "xieperf.h" +#include +#include + +static XieLut XIELut; +static XiePhotoElement *flograph; +static XiePhotoflo flo; +static unsigned char *lut; +static int lutSize; +static int AwaitHandlerSeen; +static XParms xplocal; /* we can't pass args to signal handler */ + +int InitAwait(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XieDataClass class; + XieOrientation band_order; + XieLTriplet length, levels; + Bool merge; + XieLTriplet start; + int i; + + lut = ( unsigned char * ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + XIELut = ( XieLut ) NULL; + + xplocal = xp; /* so the signal handler can access it */ + + lutSize = ( ( AwaitParms * ) ( p->ts ) )->lutSize; + lut = (unsigned char *)malloc( lutSize ); + if ( lut == ( unsigned char * ) NULL ) + { + fprintf( stderr, "malloc failed\n" ); + reps = 0; + } + else + { + for ( i = 0; i < lutSize; i++ ) + { + if ( i % 5 == 0 ) + { + lut[ i ] = ( lutSize - 1 ) - i; + } + else + { + lut[ i ] = i; + } + } + if ( !(XIELut = XieCreateLUT( xp->d ) ) ) + { + fprintf( stderr, "XieCreateLUT failed\n" ); + reps = 0; + } + } + + if ( reps ) + { + /* set up a flo to read the lut from client */ + + flograph = XieAllocatePhotofloGraph(2); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf(stderr,"XieAllocatePhotofloGraph failed\n"); + return( 0 ); + } + + class = xieValSingleBand; + band_order = xieValLSFirst; + length[ 0 ] = lutSize; + length[ 1 ] = 0; + length[ 2 ] = 0; + levels[ 0 ] = ( ( AwaitParms * ) ( p->ts ) )->lutLevels; + levels[ 1 ] = 0; + levels[ 2 ] = 0; + + XieFloImportClientLUT(&flograph[0], + class, + band_order, + length, + levels + ); + + merge = False; + start[ 0 ] = 0; + start[ 1 ] = 0; + start[ 2 ] = 0; + + XieFloExportLUT(&flograph[1], + 1, /* source phototag number */ + XIELut, + merge, + start + ); + + flo = XieCreatePhotoflo( xp->d, flograph, 2 ); + } + if ( !reps ) + { + FreeAwaitStuff( xp, p ); + } + return( reps ); +} + +AbortFlo(xp) + XParms xp; +{ + XieExtensionInfo *xieInfo; + + xp->d = ( Display * ) Open_Display( xp->displayName ); + if ( XieInitialize( xp->d, &xieInfo ) ) + { + /* abort the flo */ + + XieAbort( xp->d, 0, flo ); + } + XCloseDisplay( xp->d ); +} + +#ifdef SIGALRM +#ifdef SIGNALRETURNSINT +int +#else +void +#endif +AwaitHandler(sig) + int sig; +{ + int pid; + + /* + hmmmm... bad news. some possibilities include ( first time in this + function e.g. AwaitHandlerSeen is 0 on entry ): + + 1 --> Signals are messed up and SIGALRM was triggered by mistake, + although this is an unlikely possibility. + 2 --> It took more time than we expected to do the tasks in DoAwait() so increase the alarm() value or start pleading with your boss + for a faster system or network + 3 --> The flo didn't finish for some reason - maybe the child had + problems executing + 4 --> XieAwait is broken: possibly it did not notice that the flo + had finished and thus XieQueryPhotoflo never was executed, or + it *did* notice that the flo had finished but *still* did not + allow XieQueryPhotoflo to get out. + */ + + /* We have a big problem now: we could try waiting some more ( nah ), + or we could just take the easy way out and exit, or we could + spawn a child which makes a new connection to the server and + aborts the photoflo. Let's try spawning and see if we can abort + the flo. Also, we will restart this alarm and if we timeout + again we have no choice but to exit as things seem severly hosed. + First, however, let's check the value of AwaitHandlerSeen. If it + happens to be 2 then we have already have timed out a second time + and it is time to exit. */ + + if ( ++AwaitHandlerSeen == 2 ) + { + exit( 1 ); + } + if ( ( pid = fork() ) == -1 ) + { + exit( 1 ); + } + else if ( pid == 0 ) /* child */ + { + AbortFlo(xplocal); + exit( 0 ); + } + else /* parent */ + { + /* if this alarm triggers, the XieAbort failed, + or it worked and we have a situation similar + to one of those listed above */ + + alarm( GetTimeout() ); + } +} +#endif + +#ifdef WIN32 +struct _data {XParms xp; Parms p;}; + +void ChildProc(data) + struct _data *data; +{ + XieExtensionInfo *xieInfo; + struct _XParms _xp; + XParms xp = &_xp; + Parms p = data->p; + *xp = *data->xp; + xp->d = ( Display * ) Open_Display( xp->displayName ); + if ( XieInitialize( xp->d, &xieInfo ) ) + { + PumpTheClientData( xp, p, flo, 0, 1, + lut, lutSize, 0 ); + } + XCloseDisplay(xp->d); +} +#endif + +void DoAwait(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i, pid; + int status; + XieExtensionInfo *xieInfo; + XiePhotofloState state; + XiePhototag *expected, *avail; + unsigned int nexpected, navail; +#ifdef WIN32 + struct _data data; + HANDLE child; + DWORD threadId; +#endif + + /* this is fun! */ + + for (i = 0; i != reps; i++) { + AwaitHandlerSeen = 0; + XieExecutePhotoflo( xp->d, flo, 0 ); + XSync( xp->d, 0 ); + XieAwait( xp->d, 0, flo ); +#ifdef WIN32 + data.xp = xp; + data.p = p; + child = CreateThread(NULL, 0, + (LPTHREAD_START_ROUTINE)ChildProc, + (LPVOID)&data, 0, &threadId); + if (WaitForSingleObject(child, GetTimeout() * 1000) == + WAIT_TIMEOUT) + { + HANDLE child2; + fprintf(stderr, "transfer timed out\n"); + child2 = CreateThread(NULL, 0, + (LPTHREAD_START_ROUTINE)AbortFlo, + (LPVOID)xplocal, 0, &threadId); + if (WaitForSingleObject(child2, GetTimeout() * 1000) == + WAIT_TIMEOUT) + { + fprintf(stderr, "abort timed out\n"); + TerminateThread(child2, 0); + } + TerminateThread(child, 0); + } +#else + if ( ( pid = fork() ) == -1 ) /* gasp */ + { + fprintf( stderr, "couldn't fork\n" ); + exit( 1 ); + } + else if ( pid == 0 ) /* child */ + { + /* connect to the server */ + + xp->d = ( Display * ) Open_Display( xp->displayName ); + if ( XieInitialize( xp->d, &xieInfo ) ) + { + PumpTheClientData( xp, p, flo, 0, 1, + lut, lutSize, 0 ); + } + XCloseDisplay(xp->d); + exit( 0 ); + } + else /* parent */ + { +#ifdef SIGALRM + signal( SIGALRM, AwaitHandler ); + alarm( GetTimeout() ); +#endif +#endif /* WIN32 */ + /* if we query the photoflo and it is active, then + XieAwait didn't really do what we wanted it to */ + + if ( !XieQueryPhotoflo( xp->d, 0, flo, &state, + &expected, &nexpected, &avail, &navail ) ) + { + fprintf( stderr, "XieQueryPhotoflo failed\n" ); + break; + } + if ( expected ) + XFree( expected ); + if ( avail ) + XFree( avail ); + if ( state != xieValInactive ) + { + fprintf( stderr, + "Flo state was not inactive\n" ); + break; + } +#ifndef WIN32 + wait( &status ); + if ( status & 0xff ) + { + fprintf( stderr, "Child process abnormal termination: %x\n", status & 0xff ); + break; + } + } + + /* whew! somehow we got through this mess unscathed */ +#ifdef SIGALRM + alarm( 0 ); +#endif +#endif + } +} + +void EndAwait(xp, p) + XParms xp; + Parms p; +{ + FreeAwaitStuff( xp, p ); +} + +int +FreeAwaitStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( lut ) + { + free( lut ); + lut = ( unsigned char * ) NULL; + } + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,2); + flograph = ( XiePhotoElement * ) NULL; + } + + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } +} diff --git a/xie/xc/programs/xieperf/band.c b/xie/xc/programs/xieperf/band.c new file mode 100644 index 0000000..9d84030 --- /dev/null +++ b/xie/xc/programs/xieperf/band.c @@ -0,0 +1,684 @@ +/* $XConsortium: band.c,v 1.6 94/04/17 20:39:07 rws Exp $ */ +/**** module band.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + band.c -- BandCombine/BandExtract flo element tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include +#include +#include +#include + +static XiePhotomap XIEPhotomap1; +static XiePhotomap XIEPhotomap2; +static XiePhotomap XIEPhotomap3; +static XieLut XIELut; + +static XiePhotoElement *flograph; +static int flo_notify; +static XiePhotoflo flo; +static int flo_elements; +static int cclass; + +static XStandardColormap stdCmap; +static Bool useStdCmap; +extern Bool WMSafe; + +int +InitBandSelectExtract(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ + XieLTriplet levels; + int cube; + int which; + int type; + int atom; + + which = (( BandParms * )p->ts)->which; + type = p->finfo.image1->bandclass; + +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xp->vinfo.c_class; +#else + cclass = xp->vinfo.class; +#endif + XIEPhotomap1 = ( XiePhotomap ) NULL; + XIEPhotomap2 = ( XiePhotomap ) NULL; + XIEPhotomap3 = ( XiePhotomap ) NULL; + XIELut = ( XieLut ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + if ( xp->vinfo.depth < 4 ) + return( 0 ); + + if ( IsColorVisual( cclass ) ) + atom = XA_RGB_BEST_MAP; + else + atom = XA_RGB_GRAY_MAP; + if ( !IsStaticVisual( cclass ) && type == xieValTripleBand && !IsTrueColorOrDirectColor( cclass ) ) + { + if ( !GetStandardColormap( xp, &stdCmap, atom ) ) + { + fprintf( stderr, "Couldn't get a standard colormap\n" ); + reps = 0; + } + else + InstallThisColormap( xp, stdCmap.colormap ); + } + else if ( type == xieValTripleBand ) + { + if ( !IsStaticVisual( cclass ) ) + InstallColorColormap( xp ); + CreateStandardColormap( xp, &stdCmap, atom ); + } + else + cube = icbrt( xp->vinfo.colormap_size ); + + if ( reps ) + { + if ( IsTrueColorOrDirectColor( cclass ) && + type == xieValTripleBand ) + { + levels[ 0 ] = TripleTrueOrDirectLevels( xp ); + levels[ 1 ] = levels[ 2 ] = levels[ 0 ]; + } + else + { + levels[ 0 ] = stdCmap.red_max + 1; + levels[ 1 ] = stdCmap.green_max + 1; + levels[ 2 ] = stdCmap.blue_max + 1; + } + } + if ( reps ) + { + XIEPhotomap1 = GetXIEDitheredTriplePhotomap( xp, p, 1, + xieValDitherDefault, 0, levels ); + + if ( XIEPhotomap1 == ( XiePhotomap ) NULL ) + { + reps = 0; + } + } + + if ( reps ) + { + if ( !CreateColorBandSelectExtractFlo( xp, p ) ) + { + fprintf( stderr, "CreateColorBandSelectFlo failed\n" ); + reps = 0; + } + } + + if ( !reps ) + { + if ( !IsStaticVisual( cclass ) ) + InstallGrayColormap( xp ); + FreeBandStuff( xp, p ); + } + return( reps ); +} + +int +InitBandColormap(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ + XieLTriplet levels; + Atom atom; + + useStdCmap = ( ( BandParms * )p->ts )->useStdCmap; + if ( xp->vinfo.depth == 1 && useStdCmap == True ) + return( 0 ); + +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xp->vinfo.c_class; +#else + cclass = xp->vinfo.class; +#endif + + if ( ( IsStaticVisual( cclass ) || IsTrueColorOrDirectColor( cclass ) ) + && useStdCmap == True ) + return( 0 ); + XIEPhotomap1 = ( XiePhotomap ) NULL; + XIELut = ( XieLut ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + if ( useStdCmap == True ) + { + atom = ( ( BandParms * )p->ts )->atom; + if ( IsGrayVisual( cclass ) ) + { + fprintf( stderr, "Switching to XA_RGB_GRAY_MAP\n" ); + atom = XA_RGB_GRAY_MAP; + } + if ( GetStandardColormap( xp, &stdCmap, atom ) == False ) + { + fprintf( stderr, "Couldn't get a standard colormap\n" ); + fflush( stderr ); + reps = 0; + } + else + InstallThisColormap( xp, stdCmap.colormap ); + } + + if ( reps ) + { + if ( useStdCmap == True ) + { + levels[ 0 ] = stdCmap.red_max + 1; + levels[ 1 ] = stdCmap.green_max + 1; + levels[ 2 ] = stdCmap.blue_max + 1; + } + else + { + levels[ 0 ] = xp->vinfo.colormap_size; + levels[ 1 ] = xp->vinfo.colormap_size; + levels[ 2 ] = xp->vinfo.colormap_size; + } + + XIEPhotomap1 = GetXIEDitheredTriplePhotomap( xp, p, 1, + xieValDitherDefault, 0, levels ); + if ( XIEPhotomap1 == ( XiePhotomap ) NULL ) + { + reps = 0; + } + } + + if ( reps ) + { + if ( !CreateColormapFlo( xp, p, useStdCmap ) ) + { + fprintf( stderr, "CreateColormapFlo failed\n" ); + reps = 0; + } + } + + if ( !reps ) + { + FreeBandStuff( xp, p ); + if ( useStdCmap == True ) + InstallGrayColormap( xp ); + } + + return( reps ); +} + +int +CreateColormapFlo( xp, p, useStdCmap ) +XParms xp; +Parms p; +Bool useStdCmap; +{ + int idx, decode_notify; + unsigned int mylevels; + XieConstant c1; + float bias = 0.0; + int pointflag = 0; + XieProcessDomain domain; + int cclass; + +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xp->vinfo.c_class; +#else + cclass = xp->vinfo.class; +#endif + + idx = 0; + if ( useStdCmap == True ) + { + c1[ 0 ] = stdCmap.red_mult; + c1[ 1 ] = stdCmap.green_mult; + c1[ 2 ] = stdCmap.blue_mult; + bias = ( float ) stdCmap.base_pixel; + } + else + { + c1[ 0 ] = (( BandParms * )p->ts)->c1[ 0 ]; + c1[ 1 ] = (( BandParms * )p->ts)->c1[ 1 ]; + c1[ 2 ] = (( BandParms * )p->ts)->c1[ 2 ]; + bias = 0.0; + } + + mylevels = xp->vinfo.colormap_size; + + flo_elements = 3; + + if ( IsTrueColorOrDirectColor( cclass ) ) + { + pointflag++; + flo_elements+=2; + if ( ( XIELut = CreatePointLut( xp, p, + xp->vinfo.colormap_size, + 1 << xp->screenDepth, False ) ) + == ( XieLut ) NULL ) + { + return( 0 ); + } + } + + + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + return( 0 ); + } + + decode_notify = False; + + XieFloImportPhotomap(&flograph[idx],XIEPhotomap1,decode_notify); + idx++; + + XieFloBandExtract( &flograph[idx], idx, mylevels, bias, c1 ); idx++; + + if ( pointflag ) + { + XieFloImportLUT(&flograph[idx], XIELut ); + idx++; + + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + idx-1, + &domain, + idx, + 0x7 + ); + idx++; + } + + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + XSync( xp->d, 0 ); + flo_notify = False; + return( 1 ); +} + +int +InitBandCombine(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xp->vinfo.c_class; +#else + cclass = xp->vinfo.class; +#endif + + XIELut = ( XieLut ) NULL; + XIEPhotomap1 = ( XiePhotomap ) NULL; + XIEPhotomap2 = ( XiePhotomap ) NULL; + XIEPhotomap3 = ( XiePhotomap ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + if ( reps ) + { + XIEPhotomap1 = GetXIEPhotomap( xp, p, 1 ); + XIEPhotomap2 = GetXIEPhotomap( xp, p, 2 ); + XIEPhotomap3 = GetXIEPhotomap( xp, p, 3 ); + + if ( XIEPhotomap1 == ( XiePhotomap ) NULL || + XIEPhotomap2 == ( XiePhotomap ) NULL || + XIEPhotomap3 == ( XiePhotomap ) NULL ) + { + reps = 0; + } + } + + if ( reps ) + { + if ( !CreateBandCombineFlo( xp, p, cclass ) ) + { + fprintf( stderr, "CreateBandCombineFlo failed\n" ); + reps = 0; + } + } + + if ( !reps ) + { + FreeBandStuff( xp, p ); + } + return( reps ); +} + +int +CreateBandCombineFlo( xp, p, cclass ) +XParms xp; +Parms p; +int cclass; +{ + int idx, decode_notify; + float bias; + XieConstant c; + XieProcessDomain domain; + unsigned int mylevels; + int pointflag; + XIEimage *image; + + pointflag = 0; + + mylevels = 1 << xp->screenDepth; + + idx = 0; + image = p->finfo.image1; + + flo_elements = 6; + if ( 1 << image->depth[ 0 ] != mylevels ) + { + pointflag++; + flo_elements+=2; + + if ( ( XIELut = CreatePointLut( xp, p, 1 << image->depth[ 0 ], + mylevels, False ) ) == ( XieLut ) NULL ) + { + return( 0 ); + } + } + + c[ 0 ] = ( ( BandParms * )p->ts )->c1[ 0 ]; + c[ 1 ] = ( ( BandParms * )p->ts )->c1[ 1 ]; + c[ 2 ] = ( ( BandParms * )p->ts )->c1[ 2 ]; + bias = ( ( BandParms * )p->ts )->bias; + + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + return( 0 ); + } + + decode_notify = False; + + XieFloImportPhotomap(&flograph[idx],XIEPhotomap1,decode_notify); + idx++; + + XieFloImportPhotomap(&flograph[idx],XIEPhotomap2,decode_notify); + idx++; + + XieFloImportPhotomap(&flograph[idx],XIEPhotomap3,decode_notify); + idx++; + + XieFloBandCombine( &flograph[ idx ], idx - 2, idx - 1, idx ); idx++; + + XieFloBandExtract( &flograph[idx], idx, 1 << image->depth[ 0 ], bias, c ); idx++; + + if ( pointflag ) + { + XieFloImportLUT(&flograph[idx], XIELut ); + idx++; + + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + idx-1, + &domain, + idx, + 0x7 + ); + idx++; + } + + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + XSync( xp->d, 0 ); + flo_notify = False; + return( 1 ); +} + +int +CreateColorBandSelectExtractFlo( xp, p ) +XParms xp; +Parms p; +{ + int idx, which, decode_notify; + unsigned int mylevels; + XieConstant c1, c2, c3; + float bias = 0.0; + XIEimage *image; + + which = (( BandParms * )p->ts)->which; + + image = p->finfo.image1; + idx = 0; + + if ( which == BandExtract ) + { + c1[ 0 ] = (( BandParms * )p->ts)->c1[ 0 ]; + c1[ 1 ] = (( BandParms * )p->ts)->c1[ 1 ]; + c1[ 2 ] = (( BandParms * )p->ts)->c1[ 2 ]; + + c2[ 0 ] = (( BandParms * )p->ts)->c2[ 0 ]; + c2[ 1 ] = (( BandParms * )p->ts)->c2[ 1 ]; + c2[ 2 ] = (( BandParms * )p->ts)->c2[ 2 ]; + + c3[ 0 ] = (( BandParms * )p->ts)->c3[ 0 ]; + c3[ 1 ] = (( BandParms * )p->ts)->c3[ 1 ]; + c3[ 2 ] = (( BandParms * )p->ts)->c3[ 2 ]; + + bias = (( BandParms * )p->ts)->bias; + } + flo_elements = 7; + + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + return( 0 ); + } + + decode_notify = False; + + XieFloImportPhotomap(&flograph[idx],XIEPhotomap1,decode_notify); + idx++; + + if ( which == BandExtract && IsTrueColorOrDirectColor( cclass ) ) + { + mylevels = stdCmap.red_max + 1; + XieFloBandExtract( &flograph[idx], 1, mylevels, bias, c1 ); idx++; + mylevels = stdCmap.green_max + 1; + XieFloBandExtract( &flograph[idx], 1, mylevels, bias, c2 ); idx++; + mylevels = stdCmap.blue_max + 1; + XieFloBandExtract( &flograph[idx], 1, mylevels, bias, c3 ); idx++; + } + else + { + XieFloBandSelect( &flograph[idx], 1, 0 ); idx++; + XieFloBandSelect( &flograph[idx], 1, 1 ); idx++; + XieFloBandSelect( &flograph[idx], 1, 2 ); idx++; + } + + XieFloBandCombine( &flograph[ idx ], idx - 2, idx - 1, idx ); idx++; + + c1[ 0 ] = stdCmap.red_mult; + c1[ 1 ] = stdCmap.green_mult; + c1[ 2 ] = stdCmap.blue_mult; + bias = ( float ) stdCmap.base_pixel; + + XieFloBandExtract( &flograph[ idx ], idx, + 1 << xp->vinfo.depth, bias, c1 ); + idx++; + + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + XSync( xp->d, 0 ); + flo_notify = False; + return( 1 ); +} + +void +DoBand(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ + int i; + + for ( i = 0; i < reps; i++ ) + { + XieExecutePhotoflo(xp->d, flo, flo_notify ); + } +} + +void EndBandCombine( xp, p ) +XParms xp; +Parms p; +{ + FreeBandStuff( xp, p ); +} + +void EndBandColormap( xp, p ) +XParms xp; +Parms p; +{ + if ( useStdCmap == True ) + InstallGrayColormap( xp ); + FreeBandStuff( xp, p ); +} + +void EndBandSelectExtract(xp, p) +XParms xp; +Parms p; +{ + if ( IsColorVisual( cclass ) ) + InstallGrayColormap( xp ); + FreeBandStuff( xp, p ); +} + +int +FreeBandStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIEPhotomap1 && IsPhotomapInCache( XIEPhotomap1 ) == False ) + { + XieDestroyPhotomap(xp->d, XIEPhotomap1); + XIEPhotomap1 = ( XiePhotomap ) NULL; + } + + if ( XIEPhotomap2 && IsPhotomapInCache( XIEPhotomap2 ) == False ) + { + XieDestroyPhotomap(xp->d, XIEPhotomap2); + XIEPhotomap2 = ( XiePhotomap ) NULL; + } + + if ( XIEPhotomap3 && IsPhotomapInCache( XIEPhotomap3 ) == False ) + { + XieDestroyPhotomap(xp->d, XIEPhotomap3); + XIEPhotomap3 = ( XiePhotomap ) NULL; + } + + if ( XIELut ) + { + XieDestroyLUT(xp->d, XIELut); + XIELut = ( XieLut ) NULL; + } + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} diff --git a/xie/xc/programs/xieperf/blend.c b/xie/xc/programs/xieperf/blend.c new file mode 100644 index 0000000..68291d4 --- /dev/null +++ b/xie/xc/programs/xieperf/blend.c @@ -0,0 +1,389 @@ +/* $XConsortium: blend.c,v 1.9 94/04/17 20:39:08 rws Exp $ */ + +/**** module blend.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + blend.c -- blend flo element tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include + +static XieRoi XIERoi; +static XieLut XIELut; +static XiePhotomap alpha; +static XiePhotomap ControlPlane; +static XIEimage *image1, *image2; +static XiePhotomap XIEPhotomap1, XIEPhotomap2, XIEPhotomap3; + +static int monoflag = 0; + +static int flo_notify; +static int flo_elements; +static XieProcessDomain domain; +static XiePhotoElement *flograph; +static int decode_notify; +static XiePhotoflo flo; +static XieRectangle *rects; + +int +InitBlend(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i, idx; + int useDomain; + int numROIs; + int bandMask; + XieConstant constant; + float alphaConstant; + int src1, src2, alphasrc; + + useDomain = ( ( BlendParms * )p->ts )->useDomain; + numROIs = ( ( BlendParms * )p->ts )->numROIs; + bandMask = ( ( BlendParms * )p->ts )->bandMask; + constant[ 0 ] = (( BlendParms * )p->ts)->constant[ 0 ]; + constant[ 1 ] = (( BlendParms * )p->ts)->constant[ 1 ]; + constant[ 2 ] = (( BlendParms * )p->ts)->constant[ 2 ]; + alphaConstant = (( BlendParms * )p->ts)->alphaConstant; + + image1 = p->finfo.image1; + if ( !image1 ) + return( 0 ); + + image2 = p->finfo.image2; + + if ( image2 ) + flo_elements = 4; + else + flo_elements = 3; + + if ( useDomain == DomainROI || useDomain == DomainCtlPlane ) + flo_elements++; + + alpha = ControlPlane = XIEPhotomap1 = + XIEPhotomap2 = XIEPhotomap3 = ( XiePhotomap ) NULL; + XIERoi = ( XieRoi ) NULL; + XIELut = ( XieLut ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + monoflag = 0; + src1 = src2 = alphasrc = 0; + + if ( xp->screenDepth != image1->depth[ 0 ] ) + { + monoflag = 1; + flo_elements+=2; + if ( ( XIELut = CreatePointLut( xp, p, + 1 << image1->depth[ 0 ], + 1 << xp->screenDepth, False ) ) + == ( XieLut ) NULL ) + { + return( 0 ); + } + } + + rects = ( XieRectangle * ) NULL; + if ( useDomain == DomainROI ) + { + rects = (XieRectangle *) + malloc( numROIs * sizeof( XieRectangle ) ); + if ( rects == ( XieRectangle * ) NULL ) + reps = 0; + else + { + for ( i = 0; i < numROIs; i++ ) + { + rects[ i ].x = i * 100; + rects[ i ].y = 0; + rects[ i ].width = 100; + rects[ i ].height = 200; + } + } + } + else if ( useDomain == DomainCtlPlane ) + { + ControlPlane = GetControlPlane( xp, 2 ); + if ( ControlPlane == ( XiePhotomap ) NULL ) + reps = 0; + } + + if ( reps && p->finfo.image3 != ( XIEimage * ) NULL ) + { + /* alpha plane */ + + flo_elements++; + + if ( ( alpha = GetXIEPhotomap( xp, p, 3 ) ) == ( XiePhotomap ) NULL ) + { + reps = 0; + } + } + + if ( reps ) + { + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else if ( ( XIEPhotomap1 = + GetXIEPhotomap( xp, p, 1 ) ) == ( XiePhotomap ) NULL ) + { + reps = 0; + } + else if ( image2 ) + { + if ( ( XIEPhotomap2 = GetXIEPhotomap( xp, p, 2 ) ) == + ( XiePhotomap ) NULL ) + { + reps = 0; + } + } + + if ( useDomain == DomainROI ) + { + if ( ( XIERoi = GetXIERoi( xp, p, rects, numROIs ) ) == + ( XieRoi ) NULL ) + { + reps = 0; + } + } + } + if ( reps ) + { + idx = 0; + + domain.offset_x = 0; + domain.offset_y = 0; + + if ( useDomain == DomainROI ) + { + XieFloImportROI(&flograph[idx], XIERoi); + idx++; + domain.phototag = idx; + } + else if ( useDomain == DomainCtlPlane ) + { + XieFloImportPhotomap(&flograph[idx], ControlPlane, False +); + idx++; + domain.phototag = idx; + } + else + { + domain.phototag = 0; + } + + XieFloImportPhotomap(&flograph[idx], XIEPhotomap1, False ); + idx++; + src1 = idx; + + if ( image2 ) + + { + XieFloImportPhotomap(&flograph[idx], XIEPhotomap2, + False ); + idx++; + src2 = idx; + } + else + src2 = 0; + + if ( alpha != ( XiePhotomap ) NULL ) + { + XieFloImportPhotomap(&flograph[idx], alpha, + decode_notify); + idx++; + alphasrc = idx; + } + + XieFloBlend(&flograph[idx], + src1, + src2, + constant, + ( alpha != ( XiePhotomap ) NULL ? alphasrc : 0 ), + alphaConstant, + &domain, + bandMask ); + idx++; + + if ( monoflag ) + { + XieFloImportLUT(&flograph[idx], XIELut ); + idx++; + + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + idx-1, + &domain, + idx, + 0x7 + ); + idx++; + } + + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + idx++; + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + flo_notify = True; + } + if ( !reps ) + { + FreeBlendStuff( xp, p ); + } + return( reps ); +} + +void +DoBlend(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + } +} + +int +EndBlend(xp, p) + XParms xp; + Parms p; +{ + FreeBlendStuff( xp, p ); +} + +int +FreeBlendStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( rects ) + { + free( rects ); + rects = ( XieRectangle * ) NULL; + } + if ( XIEPhotomap1 && IsPhotomapInCache( XIEPhotomap1 ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap1 ); + XIEPhotomap1 = ( XiePhotomap ) NULL; + } + if ( XIEPhotomap2 && IsPhotomapInCache( XIEPhotomap2 ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap2 ); + XIEPhotomap2 = ( XiePhotomap ) NULL; + } + if ( ControlPlane != ( XiePhotomap ) NULL && IsPhotomapInCache( ControlPlane ) == False ) + { + XieDestroyPhotomap( xp->d, ControlPlane ); + ControlPlane = ( XiePhotomap ) NULL; + } + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + if ( XIERoi ) + { + XieDestroyROI( xp->d, XIERoi ); + XIERoi = ( XieRoi ) NULL; + } + if ( alpha != ( XiePhotomap ) NULL && IsPhotomapInCache( alpha ) == False ) + { + XieDestroyPhotomap( xp->d, alpha ); + alpha = ( XiePhotomap ) NULL; + } + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} + diff --git a/xie/xc/programs/xieperf/cache.c b/xie/xc/programs/xieperf/cache.c new file mode 100644 index 0000000..a0847f5 --- /dev/null +++ b/xie/xc/programs/xieperf/cache.c @@ -0,0 +1,570 @@ +/* $XConsortium: cache.c,v 1.5 94/04/17 20:39:09 rws Exp $ */ + +/**** module cache.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + cache.c -- Code to support caching of photomaps in the server by + xieperf. + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ + +#include "xieperf.h" +#include + +int CacheSizeMax = 4; /* cache size, can be increased with -cache arg */ + +/* cache list element definition */ + +typedef struct _cache +{ + XiePhotomap pId; + Bool active; /* unused */ + time_t timeStamp; + XIEimage *image; + struct _cache *next; +} Cache; + +static Cache *PrivIsImageInCache(); +static Cache *PrivIsPhotomapInCache(); +static int SetAndScootch(); +static int RemoveFromCacheLRU(); + +static Cache *cHead = ( Cache * ) NULL; +static int cSize; + +/* cache functions */ + +void +CacheInit() +{ + Cache *ptr, *next; + + ptr = cHead; + while ( ptr != ( Cache * ) NULL ) + { + next = ptr->next; + free( ptr ); + ptr = next; + } + cHead = ( Cache * ) NULL; + cSize = 0; +} + +void +FlushCache() +{ + Cache *ptr, *next; + + ptr = cHead; + while ( ptr != ( Cache * ) NULL ) + { + XieDestroyPhotomap( GetDisplay(), ptr->pId ); + next = ptr->next; + free( ptr ); + ptr = next; + } + cHead = ( Cache * ) NULL; + cSize = 0; +} + +int +SetImageActiveState( image, active ) +XIEimage *image; +Bool active; +{ + Cache *cPtr, *prev; + int retval = 0; + + if ( ( cPtr = PrivIsImageInCache( image, &prev ) ) != ( Cache * ) NULL ) + { + retval = 1; + cPtr->active = active; + } + return( retval ); +} + +/* unused */ + +int +SetPhotomapActiveState( pId, active ) +XiePhotomap pId; +Bool active; +{ + Cache *cPtr, *prev; + int retval = 0; + + if ( ( cPtr = PrivIsPhotomapInCache( pId, &prev ) ) != ( Cache * ) NULL ) + { + retval = 1; + cPtr->active = active; + } + return( retval ); +} + +int +AddToCache( image, pId ) +XIEimage *image; +XiePhotomap pId; +{ + Cache *cPtr, *prev; + + /* just in case it is already in the cache */ + + if ( ( cPtr = PrivIsImageInCache( image, &prev ) ) != ( Cache * ) NULL ) + { + if ( cPtr != cHead ) + { + prev->next = cPtr->next; + cPtr->next = cHead; + cHead = cPtr; + } + SetAndScootch( cPtr ); + } + else if (( cPtr = PrivIsPhotomapInCache( pId, &prev ) ) != ( Cache * ) NULL) + { + if ( cPtr != cHead ) + { + prev->next = cPtr->next; + cPtr->next = cHead; + cHead = cPtr; + } + SetAndScootch( cPtr ); + } + else + { + if ( cSize == CacheSizeMax ) + { + /* annilate the least recently used entry */ + + RemoveFromCacheLRU(); + cSize--; + } + cPtr = ( Cache * ) malloc( sizeof( Cache ) ); + if ( cPtr == ( Cache * ) NULL ) + { + fprintf(stderr,"Error allocating image cache memory\n"); + return( 0 ); + } + else + { + cPtr->next = ( Cache * ) NULL; + cPtr->active = False; + cPtr->image = image; + cPtr->pId = pId; + } + if ( cHead == ( Cache * ) NULL ) + { + /* only one in the list */ + + cHead = cPtr; + } + else + { + /* add it to the head of the list */ + + cPtr->next = cHead; + cHead = cPtr; + } + + /* put the list in LRU order */ + + SetAndScootch( cPtr ); + cSize++; + } + return( 1 ); +} + +Bool +IsImageInCache( image ) +XIEimage *image; +{ + Cache *dummy; + + if ( PrivIsImageInCache( image, &dummy ) != ( Cache * ) NULL ) + return( True ); + return( False ); +} + +Bool +IsPhotomapInCache( pId ) +XiePhotomap pId; +{ + Cache *dummy; + + if ( PrivIsPhotomapInCache( pId, &dummy ) != ( Cache * ) NULL ) + return( True ); + return( False ); +} + +XiePhotomap +PhotomapOfImage( image ) +XIEimage *image; +{ + Cache *dummy, *cPtr; + + cPtr = PrivIsImageInCache( image, &dummy ); + if ( cPtr != ( Cache * ) NULL ) + return( cPtr->pId ); + return( ( XiePhotomap ) NULL ); +} + +static Cache * +PrivIsImageInCache( image, prev ) +XIEimage *image; +Cache **prev; +{ + Cache *cPtr, *retval; + + retval = ( Cache * ) NULL; + cPtr = *prev = cHead; + while ( retval == ( Cache * ) NULL && cPtr != ( Cache * ) NULL ) + { + if ( cPtr->image == image ) + retval = cPtr; + else + { + *prev = cPtr; + cPtr = cPtr->next; + } + } + return( retval ); +} + +static Cache * +PrivIsPhotomapInCache( pId, prev ) +XiePhotomap pId; +Cache **prev; +{ + Cache *cPtr, *retval; + + cPtr = *prev = cHead; + retval = ( Cache * ) NULL; + while ( retval == ( Cache * ) NULL && cPtr != ( Cache * ) NULL ) + { + if ( cPtr->pId == pId ) + retval = cPtr; + else + { + *prev = cPtr; + cPtr = cPtr->next; + } + } + return( retval ); +} + +static int +SetAndScootch( cPtr ) +Cache *cPtr; +{ + time_t tLoc; + int found; + Cache *cur, *prev; + + found = 0; + time( &tLoc ); + cPtr->timeStamp = tLoc; + + /* find a node which 1) is not the node being moved and 2) has + a timeStamp greater than or equal to our timeStamp. We will + insert ourselves right before it in the list */ + + if ( cHead == ( Cache * ) NULL ) + return( 1 ); + + else if ( cHead->next == ( Cache * ) NULL ) + return( 1 ); + + cur = prev = cHead; + while ( !found && cur != ( Cache * ) NULL ) + { + if ( cur != cPtr ) + if ( cur->timeStamp > cPtr->timeStamp ) + found = 1; + if ( !found ) + { + prev = cur; + cur = cur->next; + } + } + + if ( cur == ( Cache * ) NULL ) + { + prev->next = cPtr; + cHead = cHead->next; + cPtr->next = ( Cache * ) NULL; + } + else if ( found ) + { + cHead = cHead->next; + prev->next = cPtr; + cPtr->next = cur; + } + return( 1 ); +} + +int +RemoveImageFromCache( image ) +XIEimage *image; +{ + Cache *cPtr, *prev; + + if ( ( cPtr = PrivIsImageInCache( image, &prev ) ) != ( Cache * ) NULL ) + { + XieDestroyPhotomap( GetDisplay(), PhotomapOfImage( image ) ); + if ( prev == cPtr ) + { + /* must be head of list */ + + cHead = cPtr->next; + free( cPtr ); + } + else + { + prev->next = cPtr->next; + free( cPtr ); + } + } + return( 1 ); +} + +int +RemovePhotomapFromCache( pId ) +XiePhotomap pId; +{ + Cache *cPtr, *prev; + + if ( ( cPtr = PrivIsPhotomapInCache( pId, &prev ) ) != ( Cache * ) NULL ) + { + XieDestroyPhotomap( GetDisplay(), pId ); + if ( prev == cPtr ) + { + /* must be head of list */ + + cHead = cPtr->next; + free( cPtr ); + } + else + { + prev->next = cPtr->next; + free( cPtr ); + } + } + return( 1 ); +} + +int +TouchImage( image ) +XIEimage *image; +{ + Cache *cPtr, *prev; + int retval; + + retval = 0; + if ( ( cPtr = PrivIsImageInCache( image, &prev ) ) != ( Cache * ) NULL ) + { + if ( cPtr != cHead ) + { + prev->next = cPtr->next; + cPtr->next = cHead; + cHead = cPtr; + } + SetAndScootch( cPtr ); + retval = 1; + } + return( retval ); +} + +int +TouchPhotomap( pId ) +XiePhotomap pId; +{ + Cache *cPtr, *prev; + int retval; + + retval = 0; + if ( ( cPtr = PrivIsPhotomapInCache( pId, &prev ) ) != ( Cache * ) NULL ) + { + if ( cPtr != cHead ) + { + prev->next = cPtr->next; + cPtr->next = cHead; + cHead = cPtr; + } + SetAndScootch( cPtr ); + retval = 1; + } + return( retval ); +} + +static int +RemoveFromCacheLRU() +{ + Cache *ptr; + + if ( cHead != ( Cache * ) NULL ) + { + XieDestroyPhotomap( GetDisplay(), PhotomapOfImage( cHead->image ) ); + ptr = cHead; + cHead = cHead->next; + free( ptr ); + } + return( 1 ); +} + +XIEimage * +GetLRUImage() +{ + if ( cHead == ( Cache * ) NULL ) + return( ( XIEimage * ) NULL ); + return( cHead->image ); +} + +XiePhotomap +GetLRUPhotomap() +{ + if ( cHead == ( Cache * ) NULL ) + return( ( XiePhotomap ) NULL ); + return( cHead->pId ); +} + +int +DumpCache() +{ + Cache *cPtr; + + cPtr = cHead; + fprintf( stderr, "Head of list is %x\n", cHead ); + fprintf( stderr, "Cache list is:\n" ); + while ( cPtr != ( Cache * ) NULL ) + { + fprintf( stderr, + "node %x pId %x active %s timeStamp %x image %x next %x\n", + cPtr, + cPtr->pId, + ( cPtr->active == True ? "True" : "False" ), + cPtr->timeStamp, + cPtr->image, + cPtr->next + ); + cPtr = cPtr->next; + } +} + +#ifdef TESTCACHE + +XIEimage image1; +XIEimage image2; +XIEimage image3; +XIEimage image4; +XIEimage image5; +XiePhotomap p1, p2, p3, p4, p5; + +main() +{ + CacheInit(); + p1 = 0xaa; + p2 = 0xbb; + p3 = 0xcc; + p4 = 0xdd; + p5 = 0xee; + AddToCache( &image1, p1 ); + DumpCache(); + sleep( 10 ); + AddToCache( &image2, p2 ); + DumpCache(); + sleep( 5 ); + AddToCache( &image3, p3 ); + DumpCache(); + sleep( 5 ); + AddToCache( &image4, p3 ); + DumpCache(); + sleep( 5 ); + AddToCache( &image5, p3 ); + DumpCache(); + sleep( 5 ); + AddToCache( &image5, p3 ); + DumpCache(); + sleep( 5 ); + AddToCache( &image4, p4 ); + DumpCache(); + sleep( 5 ); + AddToCache( &image5, p5 ); + DumpCache(); + RemovePhotomapFromCache( p1 ); + DumpCache(); + RemovePhotomapFromCache( p2 ); + DumpCache(); + RemovePhotomapFromCache( p3 ); + DumpCache(); + RemovePhotomapFromCache( p4 ); + DumpCache(); + RemovePhotomapFromCache( p5 ); + DumpCache(); +} +#endif diff --git a/xie/xc/programs/xieperf/compare.c b/xie/xc/programs/xieperf/compare.c new file mode 100644 index 0000000..3ed310e --- /dev/null +++ b/xie/xc/programs/xieperf/compare.c @@ -0,0 +1,324 @@ +/* $XConsortium: compare.c,v 1.5 94/04/17 20:39:09 rws Exp $ */ + +/**** module compare.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + compare.c -- compare flo element tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include + +static XiePhotomap XIEPhotomap1; +static XiePhotomap XIEPhotomap2; +static XieRoi XIERoi; +static XiePhotomap ControlPlane; + +static XIEimage *image1, *image2; +static int flo_notify; +static XiePhotoElement *flograph; +static XiePhotoflo flo; +static int flo_elements; + +int +InitCompare(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XieProcessDomain domain; + XieCompareOp op; + XieConstant constant; + Bool combine; + unsigned int bandMask; + int useDomain; + int idx; + int src1, src2; + XieRectangle rect; + + useDomain = ( ( CompareParms * )p->ts )->useDomain; + op = ( ( CompareParms * )p->ts )->op; + constant[ 0 ] = ( ( CompareParms * )p->ts )->constant[ 0 ]; + constant[ 1 ] = ( ( CompareParms * )p->ts )->constant[ 1 ]; + constant[ 2 ] = ( ( CompareParms * )p->ts )->constant[ 2 ]; + combine = ( ( CompareParms * )p->ts )->combine; + bandMask = ( ( CompareParms * )p->ts )->bandMask; + + XIERoi = ( XieRoi ) NULL; + XIEPhotomap1 = ( XiePhotomap ) NULL; + XIEPhotomap2 = ( XiePhotomap ) NULL; + ControlPlane = ( XiePhotomap ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + switch( op ) + { + case xieValLT: + case xieValLE: + case xieValEQ: + case xieValNE: + case xieValGE: + case xieValGT: + break; + default: + fprintf( stderr, "Invalid compare op\n" ); + reps = 0; + break; + } + + if ( !reps ) + return( reps ); + + image1 = p->finfo.image1; + + /* we must have image1. image2, however, is optional */ + + if ( !image1 ) + return ( 0 ); + image2 = p->finfo.image2; + + if ( image2 ) + flo_elements = 4; + else + flo_elements = 3; + if ( useDomain == DomainROI || useDomain == DomainCtlPlane ) + flo_elements++; + + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else if ( ( XIEPhotomap1 = + GetXIEPhotomap( xp, p, 1 ) ) == ( XiePhotomap ) NULL ) + { + reps = 0; + } + else if ( image2 ) + { + if ( ( XIEPhotomap2 = + GetXIEPhotomap( xp, p, 2 ) ) == ( XiePhotomap ) NULL ) + { + reps = 0; + } + } + + if ( useDomain == DomainROI ) + { + rect.x = ( ( CompareParms * )p->ts )->x; + rect.y = ( ( CompareParms * )p->ts )->y; + rect.width = ( ( CompareParms * )p->ts )->width; + rect.height = ( ( CompareParms * )p->ts )->height; + + if ( ( XIERoi = GetXIERoi( xp, p, &rect, 1 ) ) == + ( XieRoi ) NULL ) + { + reps = 0; + } + } + else if ( useDomain == DomainCtlPlane ) + { + ControlPlane = GetControlPlane( xp, 13 ); + if ( ControlPlane == ( XiePhotomap ) NULL ) + reps = 0; + } + + if ( reps ) + { + idx = 0; + + domain.offset_x = 0; + domain.offset_y = 0; + + + if ( useDomain == DomainROI ) + { + XieFloImportROI(&flograph[idx], XIERoi); + idx++; + domain.phototag = idx; + } + else if ( useDomain == DomainCtlPlane ) + { + XieFloImportPhotomap(&flograph[idx], ControlPlane, False +); + idx++; + domain.phototag = idx; + } + else + { + domain.phototag = 0; + } + + XieFloImportPhotomap(&flograph[idx], XIEPhotomap1, False ); + idx++; + src1 = idx; + + if ( image2 ) + { + XieFloImportPhotomap(&flograph[idx], XIEPhotomap2, + False ); + idx++; + src2 = idx; + } + else + src2 = 0; + + XieFloCompare(&flograph[idx], + src1, + src2, + &domain, + constant, + op, + combine, + bandMask + ); + idx++; + + XieFloExportDrawablePlane(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + idx++; + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + flo_notify = True; + } + if ( !reps ) + FreeCompareStuff( xp, p ); + return( reps ); +} + +void +DoCompare(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + } +} + +void +EndCompare(xp, p) +XParms xp; +Parms p; +{ + FreeCompareStuff( xp, p ); +} + +int +FreeCompareStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIERoi ) + { + XieDestroyROI( xp->d, XIERoi ); + XIERoi = ( XieRoi ) NULL; + } + + if ( XIEPhotomap1 != ( XiePhotomap ) NULL && IsPhotomapInCache( XIEPhotomap1 ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap1 ); + XIEPhotomap1 = ( XiePhotomap ) NULL; + } + + if ( ControlPlane != ( XiePhotomap ) NULL && IsPhotomapInCache( ControlPlane ) == False ) + { + XieDestroyPhotomap( xp->d, ControlPlane ); + ControlPlane = ( XiePhotomap ) NULL; + } + + if ( XIEPhotomap2 != ( XiePhotomap ) NULL && IsPhotomapInCache( XIEPhotomap2 ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap2 ); + XIEPhotomap2 = ( XiePhotomap ) NULL; + } + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} diff --git a/xie/xc/programs/xieperf/complex.c b/xie/xc/programs/xieperf/complex.c new file mode 100644 index 0000000..bfa2400 --- /dev/null +++ b/xie/xc/programs/xieperf/complex.c @@ -0,0 +1,883 @@ +/* $XConsortium: complex.c,v 1.4 94/04/17 20:39:10 rws Exp $ */ +/**** module complex.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + complex.c -- A complicated flo that does lots 'o stuff + + Syd Logan -- AGE Logic, Inc. January 3, 1994 + +*****************************************************************************/ +#include "xieperf.h" +#include +#include +#include +#include + +static XiePhotomap XIEPhotomap1; +static XiePhotomap XIEPhotomap2; +static XiePhotomap XIEPhotomap3; +static XiePhotomap XIEPhotomap4; +static XieLut XIELut1, XIELut2, XIELut3; + +static XiePhotoElement *flograph; +static XiePhotoflo flo; +static int flo_elements; +static int cclass; +static char *techParms1; +static char *techParms2; +static char *techParms3; +extern Window drawableWindow; + +#define NUMTILES 5 + +int +InitComplex(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xp->vinfo.c_class; +#else + cclass = xp->vinfo.class; +#endif + XIELut1 = ( XieLut ) NULL; + XIELut2 = ( XieLut ) NULL; + XIELut3 = ( XieLut ) NULL; + techParms1 = ( char * ) NULL; + techParms2 = ( char * ) NULL; + techParms3 = ( char * ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + XIEPhotomap1 = GetXIEPhotomap( xp, p, 1 ); + XIEPhotomap2 = GetXIEPhotomap( xp, p, 2 ); + XIEPhotomap3 = GetXIEPhotomap( xp, p, 4 ); + XIEPhotomap4 = GetXIEPhotomap( xp, p, 3 ); + if ( XIEPhotomap1 == ( XiePhotomap ) NULL || XIEPhotomap2 == + ( XiePhotomap ) NULL || XIEPhotomap3 == ( XiePhotomap ) NULL || + XIEPhotomap4 == ( XiePhotomap ) NULL ) + reps = 0; + if ( reps ) + { + if ( ( XIELut1 = CreatePointLut( xp, p, 256, 256, True ) ) + == ( XieLut ) NULL ) + { + reps = 0; + } + else if ( ( XIELut2 = CreatePointLut( xp, p, 8, 256, True ) ) + == ( XieLut ) NULL ) + { + reps = 0; + } + } + + if ( reps ) + { + if ( !CreateComplexFlo( xp, p ) ) + { + fprintf( stderr, "CreateComplexFlo failed\n" ); + reps = 0; + } + } + + if ( !reps ) + { + FreeComplexStuff( xp, p ); + } + else + { + XMoveWindow( xp->d, drawableWindow, 424, 120 ); + XMapRaised( xp->d, drawableWindow ); + XSync( xp->d, 0 ); + } + return( reps ); +} + +int +CreateComplexFlo( xp, p ) +XParms xp; +Parms p; +{ + int tech, idx, pasteSrc, lutSrc1, lutSrc2, lutSrc3; + int pntSrc1, pntSrc2, logSrc1, logSrc2, logSrc3, logSrc4; + int geoSrc1, geoSrc2, geoSrc3, geoSrc4, blendSrc1; + int selSrc1, selSrc2, selSrc3, mtchSrc1, mtchSrc2, ditherSrc1; + int selSrc1Prime, selSrc2Prime, selSrc3Prime; + int cstSrc1, cstSrc2, cstSrc3, tagSrc1; + + GeometryParms gp; + XIEimage *image; + XieLTriplet levels; + float coeffs[ 6 ]; + static XieConstant constant = { 0.0, 0.0, 0.0 }; + XieConstant logicalConstant; + XieProcessDomain domain; + XieConstant in_low,in_high; + XieLTriplet out_low,out_high; + static XieTile tiles[NUMTILES]; + int pointflag; + int mylevels; + int retval = 0; + + idx = 0; + pointflag = 0; + flo_elements = 39; + image = p->finfo.image1; + + mylevels = 1 << image->depth[ 0 ]; + + if ( 1 << xp->screenDepth != mylevels ) + { + pointflag++; + flo_elements+=9; + + if ( ( XIELut3 = CreatePointLut( xp, p, mylevels, + 1 << xp->screenDepth, False ) ) == ( XieLut ) NULL ) + { + return( 0 ); + } + } + + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + goto out; + } + XieFloImportPhotomap(&flograph[idx],XIEPhotomap1,False); /* 1 */ + idx++; + XieFloImportPhotomap(&flograph[idx],XIEPhotomap2,False); /* 2 */ + idx++; + XieFloImportPhotomap(&flograph[idx],XIEPhotomap3,False); /* 3 */ + idx++; + XieFloImportPhotomap(&flograph[idx],XIEPhotomap4,False); /* 4 */ + idx++; + + gp.geoType = GEO_TYPE_SCALE; + gp.geoHeight = 256; + gp.geoWidth = 256; + gp.geoXOffset = 0; + gp.geoYOffset = 0; + + if ( !SetCoefficients( xp, p, 4, &gp, coeffs ) ) + goto out; + + XieFloGeometry(&flograph[idx], /* 5 */ + idx, + 256, + 256, + coeffs, + constant, + 0x1, + xieValGeomNearestNeighbor, + ( char * ) NULL + ); idx++; + geoSrc1 = idx; + + XieFloBandCombine( &flograph[ idx ], 1, 2, 3 ); /* 6 */ + idx++; + + XieFloGeometry(&flograph[idx], /* 7 */ + idx, + 256, + 256, + coeffs, + constant, + 0x7, + xieValGeomNearestNeighbor, + ( char * ) NULL + ); idx++; + geoSrc2 = idx; + + XieFloBandSelect( &flograph[idx], idx, 0 ); idx++; /* 8 */ + selSrc1 = selSrc1Prime = idx; + + domain.offset_x = 0; + domain.offset_y = 0; + domain.phototag = 0; + + constant[ 0 ] = 120.0; + XieFloCompare( &flograph[idx], /* 9 */ + idx, + 0, + &domain, + constant, + xieValLT, + True, + 0x01 + ); + idx++; + tagSrc1 = idx; + + XieFloBandSelect( &flograph[idx], 7, 1 ); idx++; /* 10 */ + selSrc2 = selSrc2Prime = idx; + + XieFloBandSelect( &flograph[idx], 7, 2 ); idx++; /* 11 */ + selSrc3 = selSrc3Prime = idx; + + lutSrc3 = 0; /* shut up gcc */ + + if ( pointflag ) + { + XieFloImportLUT(&flograph[idx], XIELut3 ); + idx++; + lutSrc3 = idx; + + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + selSrc1, + &domain, + lutSrc3, + 0x7 + ); + idx++; + selSrc1 = idx; + + XieFloPoint(&flograph[idx], + selSrc2, + &domain, + lutSrc3, + 0x7 + ); + idx++; + selSrc2 = idx; + + XieFloPoint(&flograph[idx], + selSrc3, + &domain, + lutSrc3, + 0x7 + ); + idx++; + selSrc3 = idx; + } + + XieFloExportDrawable(&flograph[idx], /* 12 */ + selSrc1, /* source phototag number */ + xp->w, + xp->fggc, + 0, + 0 + ); + idx++; + + XieFloExportDrawable(&flograph[idx], /* 13 */ + selSrc2, /* source phototag number */ + xp->w, + xp->fggc, + 256, + 0 + ); + idx++; + + XieFloExportDrawable(&flograph[idx], /* 14 */ + selSrc3, /* source phototag number */ + xp->w, + xp->fggc, + 0, + 256 + ); + idx++; + + XieFloImportLUT(&flograph[idx], XIELut1 ); /* 15 19 */ + idx++; + lutSrc1 = idx; + + XieFloImportLUT(&flograph[idx], XIELut2 ); /* 16 */ + idx++; + lutSrc2 = idx; + + domain.phototag = tagSrc1; + XieFloMatchHistogram(&flograph[idx], /* 17 */ + geoSrc1, + &domain, + xieValHistogramFlat, + ( char * ) NULL + ); + idx++; + mtchSrc1 = mtchSrc2 = idx; + + levels[ 0 ] = 4; + levels[ 1 ] = 8; + levels[ 2 ] = 8; + + XieFloDither( &flograph[ idx ], /* 18 */ + geoSrc2, + 0x07, + levels, + xieValDitherErrorDiffusion, + ( char * ) NULL + ); + idx++; + + domain.phototag = 0; + XieFloPoint(&flograph[idx], /* 19 */ + idx, + &domain, + lutSrc1, + 0x7 + ); + idx++; + pntSrc1 = idx; + + logicalConstant[ 0 ] = 7.0; + logicalConstant[ 1 ] = 0.0; + logicalConstant[ 2 ] = 0.0; + domain.phototag = 0; + XieFloLogical(&flograph[idx], /* 20 */ + pntSrc1, + 0, + &domain, + logicalConstant, + GXand, + 0x01 + ); + idx++; + logSrc1 = idx; + + logicalConstant[ 0 ] = 56.0; + XieFloLogical(&flograph[idx], /* 21 */ + pntSrc1, + 0, + &domain, + logicalConstant, + GXand, + 0x01 + ); + idx++; + logSrc2 = idx; + + logicalConstant[ 0 ] = 192.0; + XieFloLogical(&flograph[idx], /* 22 */ + pntSrc1, + 0, + &domain, + logicalConstant, + GXand, + 0x01 + ); + idx++; + logSrc3 = idx; + + levels[ 0 ] = 256; + levels[ 1 ] = 0; + levels[ 2 ] = 0; + in_low[ 0 ] = 0.0; + in_low[ 1 ] = 0.0; + in_low[ 2 ] = 0.0; + in_high[ 0 ] = 7.0; + in_high[ 1 ] = 0.0; + in_high[ 2 ] = 0.0; + out_low[ 0 ] = 0; + out_low[ 1 ] = 0; + out_low[ 2 ] = 0; + out_high[ 0 ] = 255; + out_high[ 1 ] = 0; + out_high[ 2 ] = 0; + + tech = xieValConstrainClipScale; + techParms1 = ( char * ) XieTecClipScale( in_low, in_high, out_low, out_high); + if ( techParms1 == ( char * ) NULL ) + goto out; + + XieFloConstrain( &flograph[idx], /* 23 */ + logSrc1, + levels, + tech, + techParms1 + ); + idx++; + cstSrc1 = idx; + + if ( pointflag ) + { + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + idx, + &domain, + lutSrc3, + 0x1 + ); + idx++; + cstSrc1 = idx; + } + + in_high[ 0 ] = in_high[ 1 ] = in_high[ 2 ] = 56.0; + techParms2 = ( char * ) XieTecClipScale( in_low, in_high, out_low, out_high); + if ( techParms2 == ( char * ) NULL ) + goto out; + + XieFloConstrain( &flograph[idx], /* 24 */ + logSrc2, + levels, + tech, + techParms2 + ); + idx++; + cstSrc2 = idx; + + if ( pointflag ) + { + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + idx, + &domain, + lutSrc3, + 0x1 + ); + idx++; + cstSrc2 = idx; + } + + in_high[ 0 ] = in_high[ 1 ] = in_high[ 2 ] = 192.0; + techParms3 = ( char * ) XieTecClipScale( in_low, in_high, out_low, out_high); + if ( techParms3 == ( char * ) NULL ) + goto out; + + XieFloConstrain( &flograph[idx], /* 25 */ + logSrc3, + levels, + tech, + techParms3 + ); + idx++; + cstSrc3 = idx; + + if ( pointflag ) + { + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + idx, + &domain, + lutSrc3, + 0x1 + ); + idx++; + cstSrc3 = idx; + } + + XieFloExportDrawable(&flograph[idx], /* 26 */ + cstSrc1, + xp->w, + xp->fggc, + 256, /* x offset in window */ + 256 /* y offset in window */ + ); + idx++; + + XieFloExportDrawable(&flograph[idx], /* 27 */ + cstSrc2, + drawableWindow, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + idx++; + + XieFloExportDrawable(&flograph[idx], /* 28 */ + cstSrc3, + drawableWindow, + xp->fggc, + 256, /* x offset in window */ + 0 /* y offset in window */ + ); + idx++; + + if ( pointflag ) + { + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + mtchSrc2, + &domain, + lutSrc3, + 0x1 + ); + idx++; + mtchSrc2 = idx; + } + + XieFloExportDrawable(&flograph[idx], /* 29 */ + mtchSrc2, + drawableWindow, + xp->fggc, + 0, /* x offset in window */ + 256 /* y offset in window */ + ); + idx++; + + gp.geoType = GEO_TYPE_SCALE; + gp.geoHeight = 256; + gp.geoWidth = 256; + gp.geoXOffset = 0; + gp.geoYOffset = 0; + + if ( !SetCoefficients( xp, p, 1, &gp, coeffs ) ) + goto out; + + constant[ 0 ] = 0.0; + XieFloGeometry(&flograph[idx], /* 30 */ + selSrc1Prime, + 128, + 128, + coeffs, + constant, + 0x1, + xieValGeomNearestNeighbor, + ( char * ) NULL + ); idx++; + + levels[ 0 ] = 8; + levels[ 1 ] = 0; + levels[ 2 ] = 0; + + XieFloDither( &flograph[ idx ], /* 31 */ + idx, + 0x01, + levels, + xieValDitherErrorDiffusion, + ( char * ) NULL + ); + idx++; + ditherSrc1 = idx; + + domain.phototag = 0; + XieFloPoint(&flograph[idx], /* 32 */ + idx, + &domain, + lutSrc2, + 0x1 + ); + idx++; + pntSrc2 = idx; + + if ( !SetCoefficients( xp, p, 2, &gp, coeffs ) ) + goto out; + + XieFloGeometry(&flograph[idx], /* 33 */ + selSrc2Prime, + 128, + 128, + coeffs, + constant, + 0x1, + xieValGeomNearestNeighbor, + ( char * ) NULL + ); idx++; + geoSrc3 = idx; + + logicalConstant[ 0 ] = 7.0; + logicalConstant[ 1 ] = 0.0; + logicalConstant[ 2 ] = 0.0; + domain.phototag = 0; + XieFloLogical(&flograph[idx], /* 34 */ + idx, + 0, + &domain, + logicalConstant, + GXinvert, + 0x01 + ); + idx++; + logSrc4 = idx; + + gp.geoType = GEO_TYPE_SCALEDROTATE; + gp.geoHeight = 256; + gp.geoWidth = 256; + gp.geoXOffset = 0; + gp.geoYOffset = 0; + gp.geoAngle = 12.0; + + if ( !SetCoefficients( xp, p, 3, &gp, coeffs ) ) + goto out; + + XieFloGeometry(&flograph[idx], /* 35 */ + selSrc3Prime, + 128, + 128, + coeffs, + constant, + 0x7, + xieValGeomNearestNeighbor, + ( char * ) NULL + ); idx++; + geoSrc4 = idx; + + constant[ 0 ] = 256.0; + constant[ 1 ] = 0.0; + constant[ 2 ] = 0.0; + + XieFloBlend(&flograph[idx], /* 36 */ + pntSrc2, + geoSrc3, + constant, + idx, + 256.0, + &domain, + 0x01 ); + idx++; + blendSrc1 = idx; + + gp.geoType = GEO_TYPE_SCALE; + gp.geoHeight = 256; + gp.geoWidth = 256; + gp.geoXOffset = 0; + gp.geoYOffset = 0; + + if ( !SetCoefficients( xp, p, 4, &gp, coeffs ) ) + goto out; + + constant[ 0 ] = 0.0; + constant[ 1 ] = 0.0; + constant[ 2 ] = 0.0; + + XieFloGeometry(&flograph[idx], /* 37 */ + mtchSrc1, + 128, + 128, + coeffs, + constant, + 0x7, + xieValGeomNearestNeighbor, + ( char * ) NULL + ); idx++; + mtchSrc1 = idx; + + if ( pointflag && 0) + { + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + geoSrc4, + &domain, + lutSrc3, + 0x1 + ); + idx++; + geoSrc4 = idx; + } + + tiles[ 0 ].src = mtchSrc1; + tiles[ 0 ].dst_x = 0; + tiles[ 0 ].dst_y = 0; + tiles[ 1 ].src = pntSrc2; + tiles[ 1 ].dst_x = 0; + tiles[ 1 ].dst_y = 128; + tiles[ 2 ].src = logSrc4; + tiles[ 2 ].dst_x = 128; + tiles[ 2 ].dst_y = 0; + tiles[ 3 ].src = geoSrc4; + tiles[ 3 ].dst_x = 128; + tiles[ 3 ].dst_y = 128; + tiles[ 4 ].src = blendSrc1; + tiles[ 4 ].dst_x = 64; + tiles[ 4 ].dst_y = 64; + + XieFloPasteUp( &flograph[idx], 256, 256, constant, tiles, 5 ); /* 38 */ + pasteSrc = idx; + idx++; + + if ( pointflag ) + { + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + idx, + &domain, + lutSrc3, + 0x7 + ); + idx++; + } + + XieFloExportDrawable(&flograph[idx], /* 39 */ + idx, /* source phototag number */ + drawableWindow, + xp->fggc, + 256, + 256 + ); + idx++; + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + + XieFreePasteUpTiles(&flograph[pasteSrc]); + retval = 1; +out: + if ( techParms1 ) + { + XFree( techParms1 ); + techParms1 = ( char * ) NULL; + } + if ( techParms2 ) + { + XFree( techParms2 ); + techParms2 = ( char * ) NULL; + } + if ( techParms3 ) + { + XFree( techParms3 ); + techParms3 = ( char * ) NULL; + } + return( retval ); +} + +void +DoComplex(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ + int i; + + for ( i = 0; i < reps; i++ ) + { + XieExecutePhotoflo(xp->d, flo, True ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + } + XClearWindow( xp->d, drawableWindow ); + XSync( xp->d, 0 ); +} + +void EndComplex( xp, p ) +XParms xp; +Parms p; +{ + XUnmapWindow( xp->d, drawableWindow ); + FreeComplexStuff( xp, p ); +} + +int +FreeComplexStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIEPhotomap1 && IsPhotomapInCache( XIEPhotomap1 ) == False ) + { + XieDestroyPhotomap(xp->d, XIEPhotomap1); + XIEPhotomap1 = ( XiePhotomap ) NULL; + } + + if ( XIEPhotomap2 && IsPhotomapInCache( XIEPhotomap2 ) == False ) + { + XieDestroyPhotomap(xp->d, XIEPhotomap2); + XIEPhotomap2 = ( XiePhotomap ) NULL; + } + + if ( XIEPhotomap3 && IsPhotomapInCache( XIEPhotomap3 ) == False ) + { + XieDestroyPhotomap(xp->d, XIEPhotomap3); + XIEPhotomap3 = ( XiePhotomap ) NULL; + } + + if ( XIEPhotomap4 && IsPhotomapInCache( XIEPhotomap4 ) == False ) + { + XieDestroyPhotomap(xp->d, XIEPhotomap4); + XIEPhotomap4 = ( XiePhotomap ) NULL; + } + + if ( XIELut1 ) + { + XieDestroyLUT(xp->d, XIELut1); + XIELut1 = ( XieLut ) NULL; + } + + if ( XIELut2 ) + { + XieDestroyLUT(xp->d, XIELut2); + XIELut2 = ( XieLut ) NULL; + } + + if ( XIELut3 ) + { + XieDestroyLUT(xp->d, XIELut3); + XIELut3 = ( XieLut ) NULL; + } + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} diff --git a/xie/xc/programs/xieperf/constrain.c b/xie/xc/programs/xieperf/constrain.c new file mode 100644 index 0000000..ac13c62 --- /dev/null +++ b/xie/xc/programs/xieperf/constrain.c @@ -0,0 +1,334 @@ +/* $XConsortium: constrain.c,v 1.10 94/04/17 20:39:11 rws Exp $ */ + +/**** module constrain.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + constrain.c -- constrain flo element tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include + +static XieLut XIELut; +static XiePhotomap XIEPhotomap; +static XiePhotomap XIEPhotomap2; +static int flo_notify; +static XiePhotoElement *flograph; +static XiePhotoflo flo; +static int flo_elements; +static XieClipScaleParam *parms; +static int monoflag; + +int InitConstrain(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XieLTriplet levels; + XieConstrainTechnique tech; + char *tech_parms=NULL; + XieConstant in_low,in_high; + XieLTriplet out_low,out_high; + int InClampDelta = 0; + int OutClampDelta = 0; + int decode_notify = 0; + XIEimage *image; + Bool photoDest; + XieEncodeTechnique encode_tech=xieValEncodeServerChoice; + char *encode_params=NULL; + XieProcessDomain domain; + int cclass; + +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xp->vinfo.c_class; +#else + cclass = xp->vinfo.class; +#endif + + monoflag = 0; + image = p->finfo.image1; + XIELut = ( XieLut ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + XIEPhotomap2 = ( XiePhotomap ) NULL; + parms = ( XieClipScaleParam * ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + tech = ( ( ConstrainParms * ) p->ts )->constrain; + photoDest = ( ( ConvolveParms * )p->ts )->photoDest; + + XIEPhotomap2 = XieCreatePhotomap( xp->d ); + + if ( TechniqueSupported( xp, xieValConstrain, tech ) == False ) + reps = 0; + else + { + if ( ( XIEPhotomap = GetXIEPhotomap( xp, p, 1 ) ) == + ( XiePhotomap ) NULL ) + reps = 0; + } + if ( reps ) + { + flo_elements = 3; + + levels[ 0 ] = xp->vinfo.colormap_size; + levels[ 1 ] = 0; + levels[ 2 ] = 0; + out_high[ 0 ] = xp->vinfo.colormap_size - 1; + out_high[ 1 ] = 0; + out_high[ 2 ] = 0; + + if ( levels[ 0 ] == 256 && + ( ( ConstrainParms * ) p->ts )->clamp & ClampInputs ) + { + InClampDelta = levels[ 0 ] / 2; + } + else + { + InClampDelta = 0; + } + if ( levels[ 0 ] == 256 && + ( ( ConstrainParms * ) p->ts )->clamp & ClampOutputs ) + { + OutClampDelta = out_high[ 0 ] / 2; + } + else + { + OutClampDelta = 0; + } + in_low[ 0 ] = 0.0 + ( float ) InClampDelta; + in_low[ 1 ] = 0.0; + in_low[ 2 ] = 0.0; + in_high[ 0 ] = ( ( float ) image->levels[ 0 ] - 1.0 ) - + ( float ) InClampDelta; + in_high[ 1 ] = 0.0; + in_high[ 2 ] = 0.0; + out_low[ 0 ] = 0 + OutClampDelta; + out_low[ 1 ] = 0; + out_low[ 2 ] = 0; + out_high[ 0 ] = out_high[ 0 ] - OutClampDelta; + out_high[ 1 ] = 0; + out_high[ 2 ] = 0; + } + + if ( reps && IsTrueColorOrDirectColor( cclass ) == True ) + { + monoflag = 1; + flo_elements+=2; + if ( ( XIELut = CreatePointLut( xp, p, levels[ 0 ], + 1 << xp->screenDepth, False ) ) == ( XieLut ) NULL ) + { + reps = 0; + } + } + + if ( reps ) + { + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + } + + if ( reps ) + { + XieFloImportPhotomap(&flograph[0],XIEPhotomap,decode_notify); + + if ( photoDest == False ) + { + XieFloExportDrawable(&flograph[flo_elements - 1], + flo_elements - 1, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + } + else + { + XieFloExportPhotomap(&flograph[flo_elements - 1], + flo_elements - 1, /* source phototag number */ + XIEPhotomap2, + encode_tech, + encode_params + ); + } + + if ( tech == xieValConstrainHardClip ) + { + tech_parms = ( char * ) NULL; + } + else + { + parms = XieTecClipScale( in_low, in_high, + out_low, out_high); + tech_parms = ( char * ) parms; + if ( tech_parms == ( char * ) NULL ) + { + fprintf( stderr, + "Trouble loading clipscale technique parameters\n" ); + reps = 0; + } + } + } + if ( reps ) + { + XieFloConstrain( &flograph[1], + 1, + levels, + tech, + tech_parms + ); + } + if ( reps && monoflag ) + { + XieFloImportLUT(&flograph[flo_elements - 3], XIELut ); + + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[flo_elements - 2], + flo_elements - 3, + &domain, + flo_elements - 2, + 0x7 + ); + } + if ( reps ) + { + flo_notify = False; + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + } + else + FreeConstrainStuff( xp, p ); + return( reps ); +} + +void DoConstrain(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo(xp->d, flo, flo_notify ); + } +} + +void EndConstrain(xp, p) + XParms xp; + Parms p; +{ + FreeConstrainStuff( xp, p ); +} + +int +FreeConstrainStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } + + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + + if ( XIEPhotomap2 ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap2 ); + XIEPhotomap2 = ( XiePhotomap ) NULL; + } + + if ( parms ) + { + XFree( parms ); + parms = ( XieClipScaleParam * ) NULL; + } + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} diff --git a/xie/xc/programs/xieperf/convolve.c b/xie/xc/programs/xieperf/convolve.c new file mode 100644 index 0000000..0ae7bb9 --- /dev/null +++ b/xie/xc/programs/xieperf/convolve.c @@ -0,0 +1,492 @@ +/* $XConsortium: convolve.c,v 1.6 94/04/17 20:39:12 rws Exp $ */ + +/**** module convolve.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + convolve.c -- convolve flo element tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include + +static XiePhotomap XIEPhotomap; +static XiePhotomap XIEPhotomap2; +static XieRoi XIERoi; +static XieLut XIELut; +static XiePhotomap ControlPlane; + +static XIEimage *image; +static int flo_notify; +static XiePhotoElement *flograph; +static XiePhotoflo flo; +static int flo_elements; +static float *data; + +#define DATA( n, i, j ) ( float * ) ( *data + ( i * n ) ) + j + +int +InitConvolve(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XieProcessDomain domain; + unsigned int bandMask; + int useDomain; + int idx, n, src; + XieRectangle rect; + XieConvolveTechnique tech; + char *tech_parm = ( char * ) NULL; + XieConstant constant; + int ( * kfunc )(); + int monoflag = 0; + Bool photoDest; + XieEncodeTechnique encode_tech=xieValEncodeServerChoice; + char *encode_params=NULL; + + + photoDest = ( ( ConvolveParms * )p->ts )->photoDest; + useDomain = ( ( ConvolveParms * )p->ts )->useDomain; + tech = ( ( ConvolveParms * )p->ts )->tech; + bandMask = ( ( ConvolveParms * )p->ts )->bandMask; + kfunc = ( ( ConvolveParms * )p->ts )->kfunc; + constant[ 0 ] = ( ( ConvolveParms * )p->ts )->constant[ 0 ]; + constant[ 1 ] = ( ( ConvolveParms * )p->ts )->constant[ 1 ]; + constant[ 2 ] = ( ( ConvolveParms * )p->ts )->constant[ 2 ]; + + if ( useDomain == DomainROI || useDomain == DomainCtlPlane ) + flo_elements = 4; + else + flo_elements = 3; + + data = ( float * ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + XIEPhotomap2 = ( XiePhotomap ) NULL; + ControlPlane = ( XiePhotomap ) NULL; + XIELut = ( XieLut ) NULL; + XIERoi = ( XieRoi ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + if ( !kfunc ) + return( 0 ); + else if ( ( n = kfunc( &data ) ) < 3 ) + { + fprintf( stderr, "Error getting kernel\n" ); + reps = 0; + } + + if ( reps ) + { + image = p->finfo.image1; + if ( !image ) + { + reps = 0; + } + } + + if ( reps ) + { + if ( xp->screenDepth != image->depth[0] && photoDest == False ) + { + monoflag = 1; + flo_elements+=2; + if ( ( XIELut = CreatePointLut( xp, p, + 1 << image->depth[0], + 1 << xp->screenDepth, False ) ) + == ( XieLut ) NULL ) + { + reps = 0; + } + } + } + if ( reps ) + { + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + reps = 0; + } + else if ( ( XIEPhotomap = + GetXIEPhotomap( xp, p, 1 ) ) == ( XiePhotomap ) NULL ) + { + reps = 0; + } + } + if ( reps ) + { + XIEPhotomap2 = XieCreatePhotomap( xp->d ); + if ( useDomain == DomainROI ) + { + rect.x = ( ( ConvolveParms * )p->ts )->x; + rect.y = ( ( ConvolveParms * )p->ts )->y; + rect.width = ( ( ConvolveParms * )p->ts )->width; + rect.height = ( ( ConvolveParms * )p->ts )->height; + + if ( ( XIERoi = GetXIERoi( xp, p, &rect, 1 ) ) == + ( XieRoi ) NULL ) + { + reps = 0; + } + } + else if ( useDomain == DomainCtlPlane ) + { + ControlPlane = GetControlPlane( xp, 2 ); + if ( ControlPlane == ( XiePhotomap ) NULL ) + reps = 0; + } + } + + if ( reps ) + { + switch ( tech ) + { + case xieValConvolveDefault: + break; + case xieValConvolveConstant: + tech_parm = ( char * ) + XieTecConvolveConstant( constant ); + if ( tech_parm == ( char * ) NULL ) + { + fprintf( stderr, + "XieTecConvolveConstant failed\n" ); + reps = 0; + } + break; + case xieValConvolveReplicate: /* XXX Not supported in SI */ + default: + fprintf( stderr, "Invalid convolve technique\n" ); + reps = 0; + break; + } + } + + if ( reps ) + { + idx = 0; + + domain.offset_x = 0; + domain.offset_y = 0; + + if ( useDomain == DomainROI ) + { + XieFloImportROI(&flograph[idx], XIERoi); + idx++; + domain.phototag = idx; + } + else if ( useDomain == DomainCtlPlane ) + { + XieFloImportPhotomap(&flograph[idx], ControlPlane, False); + idx++; + domain.phototag = idx; + } + else + { + domain.phototag = 0; + } + + XieFloImportPhotomap(&flograph[idx], XIEPhotomap, False ); + idx++; + src = idx; + + XieFloConvolve(&flograph[idx], + src, + &domain, + data, + n, + bandMask, + tech, + tech_parm + ); + idx++; + + if ( photoDest == False ) + { + if ( monoflag ) + { + XieFloImportLUT(&flograph[idx], XIELut ); + idx++; + + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + idx-1, + &domain, + idx, + 0x7 + ); + idx++; + } + + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + idx++; + } + else + { + XieFloExportPhotomap(&flograph[idx], + idx, /* source phototag number */ + XIEPhotomap2, + encode_tech, + encode_params + ); + idx++; + } + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + flo_notify = True; + } + if ( tech_parm ) + XFree( tech_parm ); + if ( !reps ) + FreeConvolveStuff( xp, p ); + return( reps ); +} + +void +DoConvolve(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + } +} + +void +EndConvolve(xp, p) +XParms xp; +Parms p; +{ + FreeConvolveStuff( xp, p ); +} + +int +FreeConvolveStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( data ) + { + free( data ); + data = ( float * ) NULL; + } + + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + + if ( XIERoi ) + { + XieDestroyROI( xp->d, XIERoi ); + XIERoi = ( XieRoi ) NULL; + } + + if ( XIEPhotomap != ( XiePhotomap ) NULL && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } + + if ( ControlPlane != ( XiePhotomap ) NULL && IsPhotomapInCache( ControlPlane ) == False ) + { + XieDestroyPhotomap( xp->d, ControlPlane ); + ControlPlane = ( XiePhotomap ) NULL; + } + + if ( XIEPhotomap2 != ( XiePhotomap ) NULL ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap2 ); + XIEPhotomap2 = ( XiePhotomap ) NULL; + } + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + +} + +/* convolve kernel functions. add as many as you like. all must correspond + to the following prototype: + + int foo( float **data ); + + The return value is the dimension of the kernel, which must be odd, + and greater than 3 in value. The kernel function must malloc an + area which is sizeof( float ) * dimension * dimension in size. + The caller is responsible for freeing the data after use. And it + will do so therefore dynamically allocate the matrix using malloc, + please. + + The kernel function is responsible for initializing the kernel. + + See the declaration of ConvolveParmVec[] in tests.c. + + A convention for naming the function is to concatenate the name + of the transformation represented by the kernel data with the + dimension of the kernel. For example, if the kernel is LaPlacian, + and the matrix size is 5x5, then the function would be named + LaPlacian5(). +*/ + +int Boxcar3( data ) +float **data; +{ + int i, j; + + if ( ( *data = ( float * ) malloc( sizeof( float ) * 9 ) ) == + ( float * ) NULL ) + { + return( -1 ); + } + for ( i = 0; i < 3; i++ ) + { + for ( j = 0; j < 3; j++ ) + *(DATA( 3, i, j )) = 0.11111111; + } + return( 3 ); +} + +int Boxcar5( data ) +float **data; +{ + int i, j; + + if ( ( *data = ( float * ) malloc( sizeof( float ) * 25 ) ) == + ( float * ) NULL ) + { + return( -1 ); + } + for ( i = 0; i < 5; i++ ) + { + for ( j = 0; j < 5; j++ ) + *(DATA( 5, i, j )) = 0.04; + } + return( 5 ); +} + +int LaPlacian3( data ) +float **data; +{ + int i, j; + + if ( ( *data = ( float * ) malloc( sizeof( float ) * 3 * 3 ) ) == + ( float * ) NULL ) + { + return( -1 ); + } + for ( i = 0; i < 3; i++ ) + { + for ( j = 0; j < 3; j++ ) + *(DATA( 3, i, j )) = -1.0; + } + *(DATA( 3, 2, 2 )) = 8.0; + return( 3 ); +} + +int LaPlacian5( data ) +float **data; +{ + int i, j; + + if ( ( *data = ( float * ) malloc( sizeof( float ) * 5 * 5 ) ) == + ( float * ) NULL ) + { + return( -1 ); + } + for ( i = 0; i < 5; i++ ) + { + for ( j = 0; j < 5; j++ ) + *(DATA( 5, i, j )) = -1.0; + } + *(DATA( 5, 4, 4 )) = 24.0; + return( 5 ); +} + + diff --git a/xie/xc/programs/xieperf/creatdstry.c b/xie/xc/programs/xieperf/creatdstry.c new file mode 100644 index 0000000..d943383 --- /dev/null +++ b/xie/xc/programs/xieperf/creatdstry.c @@ -0,0 +1,333 @@ +/* $XConsortium: creatdstry.c,v 1.7 94/04/17 20:39:13 rws Exp $ */ + +/**** module creatdstry.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + creatdstry.c -- create/destroy resource tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include + +static XieLut PhotofloTestLut1, PhotofloTestLut2; +static XiePhotoElement *flograph; +static int flo_elements; + +int InitCreateDestroyPhotoflo(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int lutSize; + unsigned char *lut1, *lut2; + Bool merge; + XieLTriplet start; + + lut1 = ( unsigned char * ) NULL; + lut2 = ( unsigned char * ) NULL; + PhotofloTestLut1 = PhotofloTestLut2 = ( XieLut ) NULL; + flo_elements = 2; + flograph = XieAllocatePhotofloGraph(flo_elements); + + lutSize = xp->vinfo.colormap_size; + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + lut1 = (unsigned char *) + malloc( lutSize * sizeof( unsigned char ) ); + if ( lut1 == ( unsigned char * ) NULL ) + reps = 0; + } + if ( reps ) + { + lut2 = (unsigned char *) + malloc( lutSize * sizeof( unsigned char ) ); + if ( lut2 == ( unsigned char * ) NULL ) + { + reps = 0; + } + } + if ( reps ) + { + if ( ( PhotofloTestLut1 = + GetXIELut( xp, p, lut1, lutSize, lutSize ) ) + == ( XieLut ) NULL ) + { + reps = 0; + } + } + if ( reps ) + { + if ( ( PhotofloTestLut2 = + GetXIELut( xp, p, lut2, lutSize, lutSize ) ) + == ( XieLut ) NULL ) + { + reps = 0; + } + } + if ( lut1 ) + { + free( lut1 ); + } + if ( lut2 ) + { + free( lut2 ); + } + + if ( reps ) + { + XieFloImportLUT(&flograph[0], PhotofloTestLut1 ); + + merge = False; + start[ 0 ] = 0; + start[ 1 ] = 0; + start[ 2 ] = 0; + + XieFloExportLUT(&flograph[1], + 1, /* source phototag number */ + PhotofloTestLut2, + merge, + start + ); + } + + if ( !reps ) + FreeCreateDestroyPhotofloStuff( xp, p ); + return reps; + +} + +int InitCreateDestroy(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + return( reps ); +} + +void DoCreateDestroyColorList(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + XieColorList clist; + + for ( i = 0; i < reps; i++ ) + { + if ( !( clist = XieCreateColorList( xp->d ) ) ) + { + fprintf( stderr, "XieCreateColorList failed\n" ); + break; + } + else + XieDestroyColorList( xp->d, clist ); + } +} + +void DoCreateDestroyLUT(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XieLut lut; + int i; + + for ( i = 0; i < reps; i++ ) + { + if ( !(lut = XieCreateLUT( xp->d ) ) ) + { + fprintf( stderr, "XieCreateLUT failed\n" ); + break; + } + else + XieDestroyLUT( xp->d, lut ); + } +} + +void DoCreateDestroyPhotomap(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XiePhotomap photomap; + int i; + + for ( i = 0; i < reps; i++ ) + { + if ( !(photomap = XieCreatePhotomap( xp->d ) ) ) + { + fprintf( stderr, "XieCreatePhotomap failed\n" ); + break; + } + else + XieDestroyPhotomap( xp->d, photomap ); + } +} + +void DoCreateDestroyROI(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XieRoi roi; + int i; + + for ( i = 0; i < reps; i++ ) + { + if ( !( roi = XieCreateROI( xp->d ) ) ) + { + fprintf( stderr, "XieCreateROI failed\n" ); + break; + } + else + XieDestroyROI( xp->d, roi ); + } +} + +void DoCreateDestroyPhotospace(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XiePhotospace photospace; + int i; + + for ( i = 0; i < reps; i++ ) + { + if ( !( photospace = XieCreatePhotospace( xp->d ) ) ) + { + fprintf( stderr, "XieCreatePhotospace failed\n" ); + break; + } + else + XieDestroyPhotospace( xp->d, photospace ); + } +} + +void DoCreateDestroyPhotoflo(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XiePhotoflo flo; + int i; + for ( i = 0; i < reps; i++ ) + { + if ( !( flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ) ) ) + { + fprintf( stderr, "XieCreatePhotoflo failed\n" ); + break; + } + else + XieDestroyPhotoflo( xp->d, flo ); + } +} + +void EndCreateDestroy(xp, p) + XParms xp; + Parms p; +{ + return; +} + +void EndCreateDestroyPhotoflo(xp, p) + XParms xp; + Parms p; +{ + FreeCreateDestroyPhotofloStuff( xp, p ); +} + +int +FreeCreateDestroyPhotofloStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + + if ( PhotofloTestLut1 ) + { + XieDestroyLUT( xp->d, PhotofloTestLut1 ); + PhotofloTestLut1 = ( XieLut ) NULL; + } + + if ( PhotofloTestLut2 ) + { + XieDestroyLUT( xp->d, PhotofloTestLut2 ); + PhotofloTestLut2 = ( XieLut ) NULL; + } +} diff --git a/xie/xc/programs/xieperf/cvttoindex.c b/xie/xc/programs/xieperf/cvttoindex.c new file mode 100644 index 0000000..a634331 --- /dev/null +++ b/xie/xc/programs/xieperf/cvttoindex.c @@ -0,0 +1,369 @@ +/* $XConsortium: cvttoindex.c,v 1.10 94/04/17 20:39:13 rws Exp $ */ + +/**** module cvttoindex.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + cvttoindex.c -- converttoindex flo element tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include +#include +#include +#include + +static XiePhotomap ditheredPhotomap; +static XieColorList clist1; +static XieColorList clist2; + +static XiePhotoElement *flograph; +static int flo_notify; +static XiePhotoflo flo; +static int flo_elements; + +extern Bool showErrors; +extern Bool dontClear; +extern Window drawableWindow; + +void EndConvertToIndex(); + +int +InitConvertToIndex(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ + XieLTriplet levels; + int cube; + int cclass; + +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xp->vinfo.c_class; +#else + cclass = xp->vinfo.class; +#endif + if ( !IsColorVisual( cclass ) || IsStaticVisual( cclass ) ) + return( 0 ); + cube = icbrt( 1 << xp->vinfo.depth ); + if ( IsTrueColorOrDirectColor( cclass ) ) + { + levels[ 0 ] = TripleTrueOrDirectLevels( xp ); + levels[ 1 ] = levels[ 2 ] = levels[ 0 ]; + } + else + { + levels[ 0 ] = cube; + levels[ 1 ] = cube; + levels[ 2 ] = cube; + } + clist1 = ( XieColorList ) NULL; + clist2 = ( XieColorList ) NULL; + ditheredPhotomap = ( XiePhotomap ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + if ( !( clist1 = XieCreateColorList( xp->d ) ) ) + reps = 0; + if ( ( ( CvtToIndexParms * ) p->ts )->addCvtFromIndex == True ) + if ( !( clist2 = XieCreateColorList( xp->d ) ) ) + reps = 0; + + if ( reps ) + { + if ( ( ( CvtToIndexParms * ) p->ts )->useDefaultCmap == True ) + InstallDefaultColormap( xp ); + if ( ( ( CvtToIndexParms * ) p->ts )->addCvtFromIndex == False ) { + ditheredPhotomap = + GetXIEDitheredTriplePhotomap( xp, p, 1, + ( ( CvtToIndexParms * ) p->ts )->dither, + 0, levels ); + if ( ditheredPhotomap == ( XiePhotomap ) NULL ) + { + reps = 0; + } + } + else + { + dontClear = True; + if ( !GetXIEDitheredTripleWindow( xp, p, xp->w, 1, + ( ( CvtToIndexParms * ) p->ts )->dither, + 0, levels ) ) + { + reps = 0; + } + else + { + XMoveWindow( xp->d, drawableWindow, WIDTH + 10, + 0 ); + XMapRaised( xp->d, drawableWindow ); + } + } + } + + if ( reps ) + { + if ( !CreateCvtToIndexFlo( xp, p ) ) + { + fprintf( stderr, + "Could not create ConvertToIndex flo\n" ); + reps = 0; + } + } + + if ( !reps ) + { + EndConvertToIndex( xp, p ); + } + return( reps ); +} + +int +CreateCvtToIndexFlo( xp, p ) +XParms xp; +Parms p; +{ + int decode_notify; + int idx; + XieColorAllocAllParam *color_param = NULL; + XWindowAttributes xwa; + Bool colorAllocNotify; + Bool addCvtFromIndex; + + addCvtFromIndex = ( ( CvtToIndexParms * ) p->ts )->addCvtFromIndex; + + if ( addCvtFromIndex == False ) + flo_elements = 3; + else + flo_elements = 4; + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + return( 0 ); + } + + color_param = XieTecColorAllocAll( 123 ); + if ( color_param == ( XieColorAllocAllParam * ) NULL ) + { + fprintf( stderr, "XieTecColorAllocAll failed\n" ); + XieFreePhotofloGraph(flograph,3); + return( 0 ); + } + + decode_notify = False; + idx = 0; + + if ( addCvtFromIndex == True ) + { + XieFloImportDrawable(&flograph[idx], + xp->w, + 0, + 0, + WIDTH, + HEIGHT, + 0, + False + ); + idx++; + } + else + { + XieFloImportPhotomap(&flograph[idx],ditheredPhotomap, + decode_notify); + idx++; + } + + colorAllocNotify = True; + if ( ( ( CvtToIndexParms * ) p->ts )->useDefaultCmap == True ) + { + colorAllocNotify = False; + XGetWindowAttributes( xp->d, DefaultRootWindow( xp->d ), &xwa ); + XSetWindowColormap( xp->d, xp->w, xwa.colormap ); + XSync( xp->d, 0 ); + } + + XGetWindowAttributes( xp->d, xp->w, &xwa ); + + if ( addCvtFromIndex == True ) + { + XieFloConvertFromIndex(&flograph[idx], + idx, + xwa.colormap, + xieValTripleBand, + xp->vinfo.bits_per_rgb + ); + idx++; + } + + XieFloConvertToIndex(&flograph[idx], + idx, + xwa.colormap, + clist1, + colorAllocNotify, + xieValColorAllocAll, + (char *)color_param + ); + idx++; + + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + ( addCvtFromIndex == False ? xp->w : drawableWindow ), + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + idx++; + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + XSync( xp->d, 0 ); + XFree( color_param ); + flo_notify = ( ( CvtToIndexParms * ) p->ts )->flo_notify; + return( 1 ); +} + +void +DoConvertToIndex(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ + int i; + + for ( i = 0; i < reps; i++ ) + { + XieExecutePhotoflo(xp->d, flo, flo_notify ); + } +} + +/* this is for the ColorAlloc event test ( see events.c ) */ + +void +DoColorAllocEvent( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + WaitForXIEEvent( xp, ( ( EventParms * ) p->ts )->event, flo, 0, +showErrors ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + } +} + +void EndConvertToIndex(xp, p) +XParms xp; +Parms p; +{ + if ( ( ( CvtToIndexParms * ) p->ts )->useDefaultCmap == True ) + InstallGrayColormap( xp ); + if ( ( ( CvtToIndexParms * ) p->ts )->addCvtFromIndex == True ) + { + XUnmapWindow( xp->d, drawableWindow ); + dontClear = False; + } + FreeCvtToIndexStuff( xp, p ); +} + +int +FreeCvtToIndexStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( ditheredPhotomap ) + { + XieDestroyPhotomap(xp->d, ditheredPhotomap); + ditheredPhotomap = ( XiePhotomap ) NULL; + } + + if ( clist1 ) + { + XieDestroyColorList( xp->d, clist1 ); + clist1 = ( XieColorList ) NULL; + } + + if ( clist2 ) + { + XieDestroyColorList( xp->d, clist2 ); + clist2 = ( XieColorList ) NULL; + } + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} diff --git a/xie/xc/programs/xieperf/dither.c b/xie/xc/programs/xieperf/dither.c new file mode 100644 index 0000000..59d318f --- /dev/null +++ b/xie/xc/programs/xieperf/dither.c @@ -0,0 +1,313 @@ +/* $XConsortium: dither.c,v 1.9 94/04/17 20:39:14 rws Exp $ */ + +/**** module dither.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + dither.c -- dither flo element tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include + +static XiePhotomap XIEPhotomap; +static int flo_notify, flo_id; +static XiePhotospace photospace; +static XiePhotoElement *flograph; +static int decode_notify; +static XieLTriplet levels; +static XieConstant in_low,in_high; +static XieLTriplet out_low,out_high; +static char *dithertech_parms=NULL; +static XieClipScaleParam *parms; +static int maxlevels; +static int flo_elements; + +int InitDither(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int threshold; + + photospace = ( XiePhotospace ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + parms = ( XieClipScaleParam * ) NULL; + dithertech_parms = ( char * ) NULL; + flograph = ( XiePhotoElement * ) NULL; + maxlevels = DepthFromLevels( xp->vinfo.colormap_size ); + threshold = ( ( DitherParms * )p->ts )->threshold; + + if ( ( ( DitherParms * ) p->ts )->dither != xieValDitherDefault ) + { + if ( TechniqueSupported( xp, xieValDither, + ( ( DitherParms * ) p->ts )->dither ) == False ) + { + fprintf( stderr, "Dither technique %d not supported\n", + ( ( DitherParms * ) p->ts )->dither ); + reps = 0; + } + } + if ( reps ) + { + if ( ( XIEPhotomap = GetXIEPhotomap( xp, p, 1 ) ) == + ( XiePhotomap ) NULL ) + { + fprintf( stderr, "Couldn't get photomap\n" ); + reps = 0; + } + } + if ( reps ) + { + photospace = XieCreatePhotospace(xp->d); + decode_notify = False; + levels[ 0 ] = levels[ 1 ] = levels[ 2 ] = 0; + in_low[ 0 ] = in_low[ 1 ] = in_low[ 2 ] = 0.0; + out_low[ 0 ] = out_low[ 1 ] = out_low[ 2 ] = 0; + out_high[ 0 ] = out_high[ 1 ] = out_high[ 2 ] = 0; + if ( ( ( DitherParms * )p->ts )->drawable == Drawable ) + out_high[ 0 ] = ( 1 << xp->screenDepth ) - 1; + else + out_high[ 0 ] = 1; + flo_elements = 5; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + } + if ( reps ) + { + flo_notify = False; + XieFloImportPhotomap(&flograph[0],XIEPhotomap, decode_notify); + + if ( ( ( DitherParms * ) p->ts )->dither == xieValDitherOrdered ) + { + dithertech_parms = ( char * ) + XieTecDitherOrderedParam(threshold); + if ( dithertech_parms == ( char * ) NULL ) + { + fprintf( stderr, + "Trouble loading dither technique parameters\n" ); + reps = 0; + } + } + } + if ( !reps ) + { + FreeDitherStuff( xp, p ); + } + return( reps ); +} + +void DoDither(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i, j, idx; + char *tech_parms=NULL; + XieLut XIELut; + XieProcessDomain domain; + + j = 0; + for (i = 0; i != reps; i++) { + XIELut = ( XieLut ) NULL; + idx = 1; + flo_id = i + 1; + if ( ( ( DitherParms * ) p->ts )->drawable == Drawable ) + j += 2; + else + j = 2; + if ( j >= maxlevels ) + j = 2; + levels[ 0 ] = j; + + XieFloDither( &flograph[ idx ], + idx, + ( ( DitherParms * ) p->ts )->bandMask, + levels, + ( ( DitherParms * ) p->ts )->dither, + dithertech_parms + ); + idx++; + + in_high[ 0 ] = ( float ) j - 1.0; + in_high[ 1 ] = 0.0; + in_high[ 2 ] = 0.0; + if ( tech_parms ) + { + XFree( tech_parms ); + tech_parms = ( char * ) NULL; + } + parms = XieTecClipScale( in_low, in_high, out_low, out_high); + tech_parms = ( char * ) parms; + if ( tech_parms == ( char * ) NULL ) + { + fprintf( stderr, + "Trouble loading clipscale technique parameters\n" ); + return; + } + + if ( DepthFromLevels( levels[ 0 ] ) != xp->screenDepth && + ( ( DitherParms * ) p->ts )->drawable == Drawable ) + { + if ( ( XIELut = CreatePointLut( xp, p, levels[ 0 ], + 1 << xp->screenDepth, False ) ) + == ( XieLut ) NULL ) + { + reps = 0; + } + + XieFloImportLUT(&flograph[idx], XIELut ); + idx++; + + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + idx-1, + &domain, + idx, + 0x7 + ); + idx++; + } + + if ( ( ( DitherParms * ) p->ts )->drawable == Drawable ) + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + else + XieFloExportDrawablePlane(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + idx++; + XieExecuteImmediate(xp->d, photospace, + flo_id, + flo_notify, + flograph, /* photoflo specification */ + idx /* number of elements */ + ); + XSync( xp->d, 0 ); + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + } + } + if ( tech_parms ) + { + XFree( tech_parms ); + tech_parms = ( char * ) NULL; + } +} + +void +EndDither(xp, p) + XParms xp; + Parms p; +{ + FreeDitherStuff( xp, p ); +} + +int +FreeDitherStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap(xp->d, XIEPhotomap); + XIEPhotomap = ( XiePhotomap ) NULL; + } + if ( dithertech_parms ) + { + XFree( dithertech_parms ); + dithertech_parms = ( char * ) NULL; + } + if ( flograph != (XiePhotoElement *) NULL ) + { + XieFreePhotofloGraph(flograph,4); + flograph = ( XiePhotoElement * ) NULL; + } + if ( photospace ) + { + XieDestroyPhotospace( xp->d, photospace ); + photospace = ( XiePhotospace ) NULL; + } +} + diff --git a/xie/xc/programs/xieperf/encode.c b/xie/xc/programs/xieperf/encode.c new file mode 100644 index 0000000..d3dbfb4 --- /dev/null +++ b/xie/xc/programs/xieperf/encode.c @@ -0,0 +1,653 @@ +/* $XConsortium: encode.c,v 1.8 94/04/17 20:39:15 rws Exp $ */ +/**** module encode.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + encode.c -- EP/ECP encode technique tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include +#include +#include +#include + +static XiePhotomap XIEPhotomap; +static XiePhotomap XIEPhotomap2; +static XieLut XIELut; + +static XiePhotoElement *flograph1; +static XiePhotoElement *flograph2; +static XiePhotoflo flo1; +static XiePhotoflo flo2; +static int flo1_elements; +static int flo2_elements; + +extern Bool WMSafe; +extern Bool dontClear; +static XStandardColormap stdCmap; +extern Window drawableWindow; +static int visclass, type, interleave; + +int +InitEncodePhotomap(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ + XieLTriplet levels; + int encodeTech; + char *encodeTechParms = ( char * ) NULL; + int i, idx; + XieProcessDomain domain; + int needconstrain; + float bias; + XieConstant c1; + XIEimage *image; + GeometryParms gp; + Bool exportClient; + int decodeTech; + char *decodeTechParms; + XieLTriplet width, height, rgblevels; + XieConstant rgbbias; + XieRGBToYCbCrParam *RGBToYCbCrParm = (XieRGBToYCbCrParam *) NULL; + XieYCbCrToRGBParam *YCbCrToRGBParm = (XieYCbCrToRGBParam *) NULL; + XieEncodeJPEGBaselineParam *JPEGB; + int doYCbCr = True; + unsigned char scale; + int atom; + + needconstrain = 0; + decodeTechParms = ( char * ) NULL; + XIELut = ( XieLut ) NULL; + XIEPhotomap = (XiePhotomap) NULL; + XIEPhotomap2 = (XiePhotomap) NULL; + flo1 = ( XiePhotoflo ) NULL; + flograph1 = ( XiePhotoElement * ) NULL; + flo2 = ( XiePhotoflo ) NULL; + flograph2 = ( XiePhotoElement * ) NULL; + + image = p->finfo.image1; + interleave = image->interleave; + type = image->bandclass; + +#if defined(__cplusplus) || defined(c_plusplus) + visclass = xp->vinfo.c_class; +#else + visclass = xp->vinfo.class; +#endif + if ( type == xieValTripleBand && IsDISServer() ) + return( 0 ); + + if ( type == xieValTripleBand && xp->screenDepth == 1 ) + return( 0 ); + + if ( IsGrayVisual( visclass ) ) + atom = XA_RGB_GRAY_MAP; + else + atom = XA_RGB_BEST_MAP; + if ( !IsStaticVisual( visclass ) && type == xieValTripleBand && !IsTrueColorOrDirectColor( visclass ) ) + { + if ( !GetStandardColormap( xp, &stdCmap, atom ) ) + return( 0 ); + InstallThisColormap( xp, stdCmap.colormap ); + } + else if ( type == xieValTripleBand ) + { + if ( !IsStaticVisual( visclass ) ) + InstallColorColormap( xp ); + CreateStandardColormap( xp, &stdCmap, atom ); + } + + XIEPhotomap2 = XieCreatePhotomap( xp->d ); + if ( XIEPhotomap2 == ( XiePhotomap ) NULL ) + { + InstallGrayColormap( xp ); + return( 0 ); + } + + width[ 0 ] = image->width[ 0 ]; + width[ 1 ] = image->width[ 1 ]; + width[ 2 ] = image->width[ 2 ]; + height[ 0 ] = image->height[ 0 ]; + height[ 1 ] = image->height[ 1 ]; + height[ 2 ] = image->height[ 2 ]; + + if ( type == xieValSingleBand ) + { + if ( IsFaxImage( image->decode ) ) + { + gp.geoType = GEO_TYPE_SCALE; + gp.geoHeight = 512; + gp.geoWidth = 512; + gp.geoXOffset = 0; + gp.geoYOffset = 0; + gp.geoTech = xieValGeomNearestNeighbor; + + width[ 0 ] = 512; + width[ 1 ] = 0; + width[ 2 ] = 0; + height[ 0 ] = 512; + height[ 1 ] = 0; + height[ 2 ] = 0; + + GetXIEGeometryWindow( xp, p, xp->w, &gp, 1 ); + XIEPhotomap = GetXIEGeometryPhotomap( xp, p, &gp, 1 ); + } + else + { + GetXIEWindow( xp, p, xp->w, 1 ); + XIEPhotomap = GetXIEPhotomap( xp, p, 1 ); + } + if ( image->depth[ 0 ] != xp->screenDepth ) + needconstrain = 1; + } + else + { + + if ( IsTrueColorOrDirectColor( visclass ) ) + { + levels[ 0 ] = TripleTrueOrDirectLevels( xp ); + levels[ 1 ] = TripleTrueOrDirectLevels( xp ); + levels[ 2 ] = TripleTrueOrDirectLevels( xp ); + } + else + { + levels[ 0 ] = stdCmap.red_max + 1; + levels[ 1 ] = stdCmap.green_max + 1; + levels[ 2 ] = stdCmap.blue_max + 1; + } + + GetXIEDitheredStdTripleWindow( xp, p, xp->w, 1, + xieValDitherDefault, 0, levels, &stdCmap ); + + XIEPhotomap = GetXIETriplePhotomap( xp, p, 1 ); + } + + if ( XIEPhotomap == ( XiePhotomap ) NULL ) + { + fprintf( stderr, "Couldn't get a photomap for image\n" ); + reps = 0; + } + + if ( reps && needconstrain == 1 ) + { + XIELut = CreatePointLut( xp, p, 1 << image->depth[ 0 ], + 1 << xp->screenDepth, False ); + } + + encodeTech = ( ( EncodeParms * )p->ts )->encode; + encodeTechParms = ( ( EncodeParms * )p->ts )->parms; + exportClient = ( ( EncodeParms * )p->ts )->exportClient; + + if ( reps ) + { + /* determine flo size */ + + flo1_elements = 2; + flo2_elements = 2; + + if ( type == xieValTripleBand ) + flo2_elements+=2; + if ( needconstrain == 1 ) + flo2_elements+=2; + if ( type == xieValTripleBand && + encodeTech == xieValEncodeJPEGBaseline && + doYCbCr == True ) + { + flo1_elements += 1; + flo2_elements += 1; + } + + flograph1 = XieAllocatePhotofloGraph(flo1_elements); + flograph2 = XieAllocatePhotofloGraph(flo2_elements); + if ( flograph1 == ( XiePhotoElement * ) NULL || + flograph2 == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + } + + idx = 0; + if ( reps ) + { + XieFloImportPhotomap(&flograph1[idx], XIEPhotomap, False); + idx++; + + if ( type == xieValTripleBand && + encodeTech == xieValEncodeJPEGBaseline ) + { + if ( doYCbCr == True ) + { + + rgblevels[0] = 256; rgbbias[0]=0; + rgblevels[1] = 256; rgbbias[1]=127; + rgblevels[2] = 256; rgbbias[2]=127; + + RGBToYCbCrParm = XieTecRGBToYCbCr( + rgblevels, + 0.299, 0.587, 0.114, + rgbbias + ); + /* XXX check for error return */ + XieFloConvertFromRGB( &flograph1[idx], + idx, + xieValRGBToYCbCr, + (char *) RGBToYCbCrParm + ); + idx++; + } + scale = ( ( EncodeParms * )p->ts )->scale; + JPEGB = ( XieEncodeJPEGBaselineParam * ) encodeTechParms; + for ( i = 0; i < JPEGB->q_size; i++ ) + { + JPEGB->q_table[ i ] = + (JPEGB->q_table[ i ] * scale + 50)/100; + } + } + + if ( exportClient == True ) + { + XieFloExportClientPhoto(&flograph1[idx], + idx, + xieValFirstData, + encodeTech, + encodeTechParms + ); + idx = 0; + GetDecodeParms( encodeTech, encodeTechParms, + &decodeTech, &decodeTechParms ); + + XieFloImportClientPhoto(&flograph2[idx], + type, + width, + height, + image->levels, + True, + decodeTech, + decodeTechParms + ); + } + else + { + JPEGB = ( XieEncodeJPEGBaselineParam * ) encodeTechParms; + XieFloExportPhotomap(&flograph1[idx], + idx, + XIEPhotomap2, + encodeTech, + encodeTechParms + ); + idx = 0; + XieFloImportPhotomap(&flograph2[idx], XIEPhotomap2, + False ); + } + idx++; + + } + if ( reps ) + { + if ( type == xieValTripleBand ) + { + if ( encodeTech == xieValEncodeJPEGBaseline && + doYCbCr == True ) + { + + YCbCrToRGBParm = XieTecYCbCrToRGB( + rgblevels, + 0.299, 0.587, 0.114, + rgbbias, + xieValGamutNone, + (char *) NULL + ); + /* XXX check for error return */ + XieFloConvertToRGB( &flograph2[idx], + idx, + xieValYCbCrToRGB, + (char *) YCbCrToRGBParm + ); + idx++; + } + + XieFloDither(&flograph2[idx], + idx, + 0x7, + levels, + xieValDitherDefault, + (char *) NULL + ); + idx++; + + c1[ 0 ] = stdCmap.red_mult; + c1[ 1 ] = stdCmap.green_mult; + c1[ 2 ] = stdCmap.blue_mult; + + bias = ( float ) stdCmap.base_pixel; + + XieFloBandExtract( &flograph2[idx], idx, + 1 << xp->vinfo.depth, bias, c1 ); + idx++; + } + + if ( needconstrain ) + { + XieFloImportLUT(&flograph2[idx], XIELut ); + idx++; + + domain.offset_x = 0; + domain.offset_y = 0; + domain.phototag = 0; + + XieFloPoint(&flograph2[idx], + idx - 1, + &domain, + idx, + 0x07 + ); + idx++; + } + + XieFloExportDrawable( &flograph2[idx], + idx, + drawableWindow, + xp->fggc, + 0, + 0 + ); + + flo1 = XieCreatePhotoflo( xp->d, flograph1, flo1_elements ); + flo2 = XieCreatePhotoflo( xp->d, flograph2, flo2_elements ); + } + + if ( !reps ) + FreeEncodePhotomapStuff( xp, p ); + else + { + dontClear = True; + XMoveWindow( xp->d, drawableWindow, WIDTH + 10, 0 ); + XMapRaised( xp->d, drawableWindow ); + XSync( xp->d, 0 ); + dontClear = True; + } + if ( decodeTechParms ) + XFree( decodeTechParms ); + if ( RGBToYCbCrParm ) + XFree( (char *) RGBToYCbCrParm ); + if ( YCbCrToRGBParm ) + XFree( (char *) YCbCrToRGBParm ); + return( reps ); +} + +int +GetDecodeParms( encode, eparms, decode, dparms ) +int encode; +char *eparms; +int *decode; +char **dparms; +{ + static unsigned char left_pad[3] = { 0, 0, 0 }; + XieEncodeUncompressedSingleParam *USP = ( XieEncodeUncompressedSingleParam * ) eparms; + XieEncodeUncompressedTripleParam *UTP = ( XieEncodeUncompressedTripleParam * ) eparms; + XieEncodeG31DParam *G31 = ( XieEncodeG31DParam * ) eparms; + XieEncodeG32DParam *G32 = ( XieEncodeG32DParam * ) eparms; + XieEncodeG42DParam *G42 = ( XieEncodeG42DParam * ) eparms; + XieEncodeJPEGBaselineParam *JPEGB = ( XieEncodeJPEGBaselineParam * ) eparms; + XieEncodeTIFF2Param *TIFF2 = ( XieEncodeTIFF2Param * ) eparms; + XieEncodeTIFFPackBitsParam *TIFFPB = ( XieEncodeTIFFPackBitsParam * ) eparms; + + switch( encode ) + { + case xieValEncodeUncompressedSingle: + *decode = xieValDecodeUncompressedSingle; + *dparms = ( char * ) XieTecDecodeUncompressedSingle( + USP->fill_order, + USP->pixel_order, + USP->pixel_stride, + 0, + USP->scanline_pad + ); + break; + case xieValEncodeUncompressedTriple: + *decode = xieValDecodeUncompressedTriple; + *dparms = ( char * ) XieTecDecodeUncompressedTriple( + UTP->fill_order, + UTP->pixel_order, + UTP->band_order, + UTP->interleave, + UTP->pixel_stride, + left_pad, + UTP->scanline_pad + ); + interleave = UTP->interleave; + break; + case xieValEncodeG31D: + *decode = xieValDecodeG31D; + *dparms = ( char * ) XieTecDecodeG31D( + G31->encoded_order, + True, + G31->radiometric + ); + break; + case xieValEncodeG32D: + *decode = xieValDecodeG32D; + *dparms = ( char * ) XieTecDecodeG32D( + G32->encoded_order, + True, + G32->radiometric + ); + break; + case xieValEncodeG42D: + *decode = xieValDecodeG42D; + *dparms = ( char * ) XieTecDecodeG42D( + G42->encoded_order, + True, + G42->radiometric + ); + break; + case xieValEncodeJPEGBaseline: + *decode = xieValDecodeJPEGBaseline; + *dparms = ( char * ) XieTecDecodeJPEGBaseline( + JPEGB->interleave, + JPEGB->band_order, + True + ); + interleave = JPEGB->interleave; + break; + case xieValEncodeTIFF2: + *decode = xieValDecodeTIFF2; + *dparms = ( char * ) XieTecDecodeTIFF2( + TIFF2->encoded_order, + True, + TIFF2->radiometric + ); + break; + case xieValEncodeTIFFPackBits: + *decode = xieValDecodeTIFFPackBits; + *dparms = ( char * ) XieTecDecodeTIFFPackBits( + TIFFPB->encoded_order, + True + ); + break; + } + return( 1 ); +} + +void +DoEncodePhotomap(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ + int i; + + for ( i = 0; i < reps; i++ ) + { + XieExecutePhotoflo(xp->d, flo1, True ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo1, 0, False ); + XieExecutePhotoflo(xp->d, flo2, True ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo2, 0, False ); + } +} + +void +DoEncodeClientPhotomap(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ + int i, done, size; + char *data; + + data = ( char * ) NULL; + size = 2048; + for ( i = 0; i < reps; i++ ) + { + XieExecutePhotoflo(xp->d, flo1, True ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoExportAvailable, + flo1, flo1_elements, False ); + if ( type == xieValTripleBand && interleave == xieValBandByPlane ) + { + size = ReadNotifyExportTripleData( xp, p, 0, + flo1, flo1_elements, 1, size, &data, &done ); + } + else + { + size = ReadNotifyExportData( xp, p, 0, + flo1, flo1_elements, 1, size, &data, &done ); + } + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo1, 0, False ); + XieExecutePhotoflo(xp->d, flo2, True ); + PumpTheClientData( xp, p, flo2, 0, 1, data, size, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo2, 0, False ); + } + if ( data ) + { + free( data ); + data = ( char * ) NULL; + } +} + +void EndEncodePhotomap(xp, p) +XParms xp; +Parms p; +{ + if ( type == xieValTripleBand && !IsStaticVisual( visclass ) ) + InstallGrayColormap( xp ); + XUnmapWindow( xp->d, drawableWindow ); + dontClear = False; + FreeEncodePhotomapStuff( xp, p ); +} + +int +FreeEncodePhotomapStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIELut ) + { + XieDestroyLUT(xp->d, XIELut); + XIELut = ( XieLut ) NULL; + } + + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap(xp->d, XIEPhotomap); + XIEPhotomap = ( XiePhotomap ) NULL; + } + + if ( XIEPhotomap2 ) + { + XieDestroyPhotomap(xp->d, XIEPhotomap2); + XIEPhotomap2 = ( XiePhotomap ) NULL; + } + + if ( flograph1 ) + { + XieFreePhotofloGraph(flograph1,flo1_elements); + flograph1 = ( XiePhotoElement * ) NULL; + } + + if ( flo1 ) + { + XieDestroyPhotoflo( xp->d, flo1 ); + flo1 = ( XiePhotoflo ) NULL; + } + + if ( flograph2 ) + { + XieFreePhotofloGraph(flograph2,flo2_elements); + flograph2 = ( XiePhotoElement * ) NULL; + } + + if ( flo2 ) + { + XieDestroyPhotoflo( xp->d, flo2 ); + flo2 = ( XiePhotoflo ) NULL; + } +} diff --git a/xie/xc/programs/xieperf/errors.c b/xie/xc/programs/xieperf/errors.c new file mode 100644 index 0000000..6b4098d --- /dev/null +++ b/xie/xc/programs/xieperf/errors.c @@ -0,0 +1,1611 @@ +/* $XConsortium: errors.c,v 1.11 94/04/17 20:39:16 rws Exp $ */ +/**** module errors.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + errors.c -- XIE error tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include +#include +#include +#include "xieperf.h" + +static XiePhotoElement *flograph; +static XiePhotoflo flo; +static int flo_elements; +static XiePhotospace photospace; + +static XieRoi XIERoi; +static XieLut XIELut; +static XiePhotomap XIEPhotomap; +static XieColorList clist; + +extern Bool showErrors; +static int errcnt; + +static char *coreErrTab[] = { + "Success", + "BadRequest", + "BadValue", + "BadWindow", + "BadPixmap", + "BadAtom", + "BadCursor", + "BadFont", + "BadMatch", + "BadDrawable", + "BadAccess", + "BadAlloc", + "BadColor", + "BadGC", + "BadIDChoice", + "BadName", + "BadLength", + "BadImplementation", +}; + +#define MAX_CORE_ERROR 4 + +static char *errTab[] = { + "ColorList", + "LUT", + "Photoflo", + "Photomap", + "Photospace", + "ROI", +}; + +#define MAX_ERROR 5 + +static char *floErrTab[] = { + "Unassigned ( invalid error )", + "FloAccess", + "FloAlloc", + "FloColormap", + "FloColorList", + "FloDomain", + "FloDrawable", + "FloElement", + "FloGC", + "FloID", + "FloLength", + "FloLUT", + "FloMatch", + "FloOperator", + "FloPhotomap", + "FloROI", + "FloSource", + "FloTechnique", + "FloValue", + "FloImplementation" +}; + +#define MAX_FLO_ERROR 19 + +static void +ErrorEventPrintError (display, error, fp) +Display *display; +XErrorEvent *error; +FILE *fp; +{ + XieExtensionInfo *xieExtInfo; + XieFloAccessError *flo_error = (XieFloAccessError *) error; + int idx; + + GetExtensionInfo( &xieExtInfo ); + if ( xieExtInfo == ( XieExtensionInfo * ) NULL ) + { + fprintf( stderr, "Couldn't get XIE extension info struct\n" ); + return; + } + + if (error->error_code == xieExtInfo->first_error + xieErrNoFlo) + { + /* flo error */ + + fprintf (fp, "Flo error: "); + if ( flo_error->flo_error_code > MAX_FLO_ERROR ) + fprintf( fp, "unknown.\n" ); + else + fprintf( fp, "%s.\n", floErrTab[ flo_error->flo_error_code ] ); + } + else if (error->error_code >= xieExtInfo->first_error) + { + /* other xie error */ + idx = error->error_code - xieExtInfo->first_error; + if ( idx < 0 || idx > MAX_ERROR ) + fprintf( fp, "Error code is out of range\n" ); + else + fprintf( fp, "%s.\n", errTab[ idx ] ); + } + else + { + /* core X error... hopefully */ + + idx = error->error_code; + if ( idx < 0 || idx > MAX_CORE_ERROR ) + fprintf( fp, "Error code is out of range\n" ); + else + fprintf( fp, "%s.\n", coreErrTab[ idx ] ); + } +} + +static int +XIEErrorHandler( d, ev ) +Display *d; +XErrorEvent *ev; +{ + if ( showErrors == True ) + { + fprintf( stderr, "X Error received: major '%d' minor '%d': ", + ev->request_code, ev->minor_code ); + ErrorEventPrintError( d, ev, stderr ); + fflush( stderr ); + } + errcnt++; + return( 0 ); +} + +int +InitErrors( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int which; + + which = ( ( ErrorParms * ) p->ts )->error; + XSetErrorHandler( XIEErrorHandler ); + errcnt = 0; + switch( which ) + { + case xieErrNoColorList : + break; + case xieErrNoLUT : + break; + case xieErrNoPhotoflo : + break; + case xieErrNoPhotomap : + break; + case xieErrNoROI : + break; + case xieErrNoPhotospace : + break; + default: + reps = 0; + break; + } + if ( !reps ) + XSetErrorHandler( None ); + return( reps ); +} + +int +InitCoreErrors( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int which; + + which = ( ( ErrorParms * ) p->ts )->error; + XSetErrorHandler( XIEErrorHandler ); + errcnt = 0; + switch( which ) + { + case BadAccess: + fprintf( stderr, "XIE currently does not generate BadAccess\n" ); + fflush( stderr ); + reps = 0; + break; + case BadAlloc: + fprintf( stderr, "Sorry, cannot reliably generate BadAlloc\n" ); + fflush( stderr ); + reps = 0; + break; + case BadIDChoice: + break; + case BadValue: + InitBadValue( xp, p, reps ); + break; + default: + reps = 0; + break; + } + if ( !reps ) + XSetErrorHandler( None ); + return( reps ); +} + +int +InitFloAccessError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + Bool merge; + XieLTriplet start; + + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + XIELut = ( XieLut ) NULL; + + flo_elements = 2; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + XIELut = XieCreateLUT( xp->d ); + XieFloImportLUT(&flograph[0], XIELut ); + + merge = False; + start[ 0 ] = 0; + start[ 1 ] = 0; + start[ 2 ] = 0; + + XieFloExportLUT(&flograph[1], + 1, /* source phototag number */ + XIELut, + merge, + start + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + } + if ( !reps ) + { + FreeErrorWithLUTStuff( xp, p ); + } + return( reps ); +} + +int +InitBadValue( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + return( reps ); +} + +int +InitFloErrors( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int which; + int retval; + + which = ( ( ErrorParms * ) p->ts )->error; + errcnt = 0; + photospace = ( XiePhotospace ) NULL; + retval = 0; + switch( which ) + { + case xieErrNoFloAccess : + retval = InitFloAccessError( xp, p, reps ); + break; + case xieErrNoFloROI : + retval = InitFloROIError( xp, p, reps ); + break; + case xieErrNoFloDrawable : + retval = InitFloDrawableError( xp, p, reps ); + break; + case xieErrNoFloGC : + retval = InitFloGCError( xp, p, reps ); + break; + case xieErrNoFloElement : + retval = InitFloElementError( xp, p, reps ); + break; + case xieErrNoFloColorList : + retval = InitFloColorListError( xp, p, reps ); + break; + case xieErrNoFloID : + retval = InitFloIDError( xp, p, reps ); + break; + case xieErrNoFloLUT : + retval = InitFloLUTError( xp, p, reps ); + break; + case xieErrNoFloOperator : + retval = InitFloOperatorError( xp, p, reps ); + break; + case xieErrNoFloSource : + retval = InitFloSourceError( xp, p, reps ); + break; + case xieErrNoFloPhotomap : + retval = InitFloPhotomapError( xp, p, reps ); + break; + case xieErrNoFloDomain : + retval = InitFloDomainError( xp, p, reps ); + break; + case xieErrNoFloColormap : + retval = InitFloColormapError( xp, p, reps ); + break; + case xieErrNoFloMatch : + retval = InitFloMatchError( xp, p, reps ); + break; + case xieErrNoFloTechnique : + retval = InitFloTechniqueError( xp, p, reps ); + break; + case xieErrNoFloValue : + retval = InitFloValueError( xp, p, reps ); + break; + case xieErrNoFloLength : + fprintf( stderr, "Sorry - cannot reliably test for FloLength errors\n" ); + fflush( stderr ); + break; + case xieErrNoFloAlloc : + fprintf( stderr, "Sorry - cannot reliably test for FloAlloc errors\n" ); + fflush( stderr ); + break; + case xieErrNoFloImplementation : + fprintf( stderr, "Sorry - cannot reliably test for FloImplementation errors\n" ); + fflush( stderr ); + break; + } + if ( retval ) + XSetErrorHandler( XIEErrorHandler ); + return( retval ); +} + +int +InitPhotofloError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + flo = ( XiePhotoflo ) NULL; + return( reps ); +} + +int +InitFloMatchError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + XieLTriplet levels; + + flo = ( XiePhotoflo ) NULL; + flograph = ( XiePhotoElement * ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + flo_elements = 3; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + XIEPhotomap = GetXIEPhotomap( xp, p, 1 ); + if ( XIEPhotomap == ( XiePhotomap ) NULL ) + reps = 0; + } + if ( reps ) + { + XieFloImportPhotomap(&flograph[0], XIEPhotomap, False); + + levels[ 0 ] = 17; + levels[ 1 ] = levels[ 2 ] = levels[ 0 ]; + + XieFloDither( &flograph[ 1 ], + 1, + 0x07, + levels, + xieValDitherDefault, + ( char * ) NULL + ); + + XieFloExportDrawable(&flograph[2], + 2, + xp->w, /* source phototag number */ + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + } + if ( !reps ) + { + FreeErrorWithPhotomapStuff( xp, p ); + } + return( reps ); +} + +int +InitFloTechniqueError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + XieLTriplet levels; + + flo = ( XiePhotoflo ) NULL; + flograph = ( XiePhotoElement * ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + photospace = XieCreatePhotospace(xp->d); + flo_elements = 3; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + XIEPhotomap = GetXIEPhotomap( xp, p, 1 ); + if ( XIEPhotomap == ( XiePhotomap ) NULL ) + reps = 0; + } + if ( reps ) + { + XieFloImportPhotomap(&flograph[0], XIEPhotomap, False); + + levels[ 0 ] = ( 1 << xp->vinfo.depth ) >> 1; + levels[ 1 ] = levels[ 2 ] = levels[ 0 ]; + + XieFloDither( &flograph[ 1 ], + 1, + 0x07, + levels, + 0xff, + ( char * ) NULL + ); + + XieFloExportDrawable(&flograph[2], + 2, + xp->w, /* source phototag number */ + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + } + if ( !reps ) + { + FreeErrorWithPhotomapStuff( xp, p ); + } + return( reps ); +} + +int +InitFloPhotomapError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + XieEncodeTechnique encode_tech=xieValEncodeServerChoice; + char *encode_params=NULL; + + flo = ( XiePhotoflo ) NULL; + flograph = ( XiePhotoElement * ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + flo_elements = 2; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + XieFloImportPhotomap(&flograph[0], XIEPhotomap, False); + + XieFloExportPhotomap(&flograph[1], + 1, /* source phototag number */ + XIEPhotomap, + encode_tech, + encode_params + ); + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + } + if ( !reps ) + { + FreeFloErrorStuff( xp, p ); + } + return( reps ); +} + +int +InitFloSourceError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + flo = ( XiePhotoflo ) NULL; + flograph = ( XiePhotoElement * ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + flo_elements = 2; + flograph = XieAllocatePhotofloGraph(flo_elements); + photospace = XieCreatePhotospace(xp->d); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else if ( ( XIEPhotomap = GetXIEPhotomap( xp, p, 1 ) ) == + ( XiePhotomap ) NULL ) + { + reps = 0; + } + else + { + XieFloImportPhotomap(&flograph[0], XIEPhotomap, False); + + XieFloExportDrawable(&flograph[1], + ~0, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + } + if ( !reps ) + { + FreeErrorWithPhotomapStuff( xp, p ); + } + return( reps ); +} + +int +InitFloElementError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + XieEncodeTechnique encode_tech=xieValEncodeServerChoice; + char *encode_params=NULL; + + flo = ( XiePhotoflo ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo_elements = 2; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else if ( ( XIEPhotomap = GetXIEPhotomap( xp, p, 1 ) ) == + ( XiePhotomap ) NULL ) + { + reps = 0; + } + else + { + XieFloImportPhotomap(&flograph[0], XIEPhotomap, False); + XieFloExportPhotomap(&flograph[1], + 1, /* source phototag number */ + XIEPhotomap, + encode_tech, + encode_params + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + } + if ( !reps ) + { + FreeErrorWithPhotomapStuff( xp, p ); + } + return( reps ); +} + +int +InitFloDrawableError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + flo = ( XiePhotoflo ) NULL; + flograph = ( XiePhotoElement * ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + flo_elements = 2; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else if ( ( XIEPhotomap = GetXIEPhotomap( xp, p, 1 ) ) == + ( XiePhotomap ) NULL ) + { + reps = 0; + } + else + { + XieFloImportPhotomap(&flograph[0], XIEPhotomap, False); + + XieFloExportDrawable(&flograph[1], + 1, /* source phototag number */ + ( Window ) NULL, + xp->fggc, + 0, + 0 + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + } + if ( !reps ) + { + FreeErrorWithPhotomapStuff( xp, p ); + } + return( reps ); +} + +int +InitFloColorListError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + XieLTriplet levels; + int idx, cclass; + int cube; + XieColorAllocAllParam *color_param = NULL; + XWindowAttributes xwa; + +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xp->vinfo.c_class; +#else + cclass = xp->vinfo.class; +#endif + if ( !IsColorVisual( cclass ) ) + return( 0 ); + cube = icbrt( 1 << xp->vinfo.depth ); + levels[ 0 ] = cube; + levels[ 1 ] = cube; + levels[ 2 ] = cube; + clist = ( XieColorList ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + if ( !( clist = XieCreateColorList( xp->d ) ) ) + reps = 0; + + if ( reps ) + { + XIEPhotomap = GetXIEDitheredTriplePhotomap( xp, p, 1, + xieValDitherDefault, 0, levels ); + if ( XIEPhotomap == ( XiePhotomap ) NULL ) + reps = 0; + } + if ( reps ) + { + InstallDefaultColormap( xp ); + flo_elements = 3; + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + color_param = XieTecColorAllocAll( 123 ); + if ( color_param == ( XieColorAllocAllParam * ) NULL ) + { + fprintf( stderr, "XieTecColorAllocAll failed\n" ); + reps = 0; + } + } + if ( reps ) + { + idx = 0; + XieFloImportPhotomap(&flograph[idx],XIEPhotomap,False); + idx++; + + XGetWindowAttributes( xp->d, DefaultRootWindow( xp->d ), &xwa ); + XSetWindowColormap( xp->d, xp->w, xwa.colormap ); + XSync( xp->d, 0 ); + + XieFloConvertToIndex(&flograph[idx], + idx, + xwa.colormap, + clist, + False, + xieValColorAllocAll, + (char *)color_param + ); + idx++; + + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + XFree( color_param ); + } + + /* this should cause a FloColorList error */ + + if ( clist ) + { + XieDestroyColorList( xp->d, clist ); + clist = ( XieColorList ) NULL; + } + + if ( !reps ) + { + InstallGrayColormap( xp ); + FreeErrorWithPhotomapStuff( xp, p ); + } + return( reps ); +} + +int +InitFloColormapError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + XieLTriplet levels; + int idx, cclass; + int cube; + XieColorAllocAllParam *color_param = NULL; + +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xp->vinfo.c_class; +#else + cclass = xp->vinfo.class; +#endif + + if ( !IsColorVisual( cclass ) ) + return( 0 ); + cube = icbrt( 1 << xp->vinfo.depth ); + levels[ 0 ] = cube; + levels[ 1 ] = cube; + levels[ 2 ] = cube; + clist = ( XieColorList ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + if ( !( clist = XieCreateColorList( xp->d ) ) ) + reps = 0; + + if ( reps ) + { + XIEPhotomap = GetXIEDitheredTriplePhotomap( xp, p, 1, + xieValDitherDefault, 0, levels ); + if ( XIEPhotomap == ( XiePhotomap ) NULL ) + reps = 0; + } + if ( reps ) + { + flo_elements = 3; + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + color_param = XieTecColorAllocAll( 123 ); + if ( color_param == ( XieColorAllocAllParam * ) NULL ) + { + fprintf( stderr, "XieTecColorAllocAll failed\n" ); + reps = 0; + } + } + if ( reps ) + { + idx = 0; + XieFloImportPhotomap(&flograph[idx],XIEPhotomap,False); + idx++; + + XieFloConvertToIndex(&flograph[idx], + idx, + ( Colormap ) 0xffffffff, + clist, + False, + xieValColorAllocAll, + (char *)color_param + ); + idx++; + + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + XFree( color_param ); + } + if ( !reps ) + { + FreeErrorWithPhotomapStuff( xp, p ); + } + return( reps ); +} + +int +InitFloGCError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + static GC myGC; + + flo = ( XiePhotoflo ) NULL; + flograph = ( XiePhotoElement * ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + flo_elements = 2; + flograph = XieAllocatePhotofloGraph(flo_elements); + myGC = XCreateGC( xp->d, xp->w, 0, 0 ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else if ( ( XIEPhotomap = GetXIEPhotomap( xp, p, 1 ) ) == + ( XiePhotomap ) NULL ) + { + reps = 0; + } + else + { + XieFloImportPhotomap(&flograph[0], XIEPhotomap, False); + + XieFloExportDrawable(&flograph[1], + 1, /* source phototag number */ + xp->w, + myGC, + 0, + 0 + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + } + if ( !reps ) + { + FreeErrorWithPhotomapStuff( xp, p ); + } + XFreeGC( xp->d, myGC ); + return( reps ); +} + +int +InitFloOperatorError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int idx; + XIEimage *image; + XieProcessDomain domain; + + XIEPhotomap = ( XiePhotomap ) NULL; + flo = ( XiePhotoflo ) NULL; + flograph = ( XiePhotoElement * ) NULL; + image = p->finfo.image1; + flo_elements = 3; + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else if ( ( XIEPhotomap = GetXIEPhotomap( xp, p, 1 ) ) == + ( XiePhotomap ) NULL ) + { + reps = 0; + } + else + { + idx = 0; + XieFloImportPhotomap(&flograph[idx], XIEPhotomap, False ); + idx++; + + domain.offset_x = 0; + domain.offset_y = 0; + domain.phototag = 0; + + XieFloMath(&flograph[idx], + idx, + &domain, + ~0, + 0x7 + ); + idx++; + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + idx++; + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + } + if ( !reps ) + FreeErrorWithPhotomapStuff( xp, p ); + return( reps ); +} + +int +InitFloDomainError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int idx; + XIEimage *image; + XieProcessDomain domain; + + XIEPhotomap = ( XiePhotomap ) NULL; + flo = ( XiePhotoflo ) NULL; + flograph = ( XiePhotoElement * ) NULL; + image = p->finfo.image1; + flo_elements = 3; + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else if ( ( XIEPhotomap = GetXIEPhotomap( xp, p, 1 ) ) == + ( XiePhotomap ) NULL ) + { + fprintf( stderr, "GetXIEPhotomap failed\n" ); + reps = 0; + } + else + { + idx = 0; + XieFloImportPhotomap(&flograph[idx], XIEPhotomap, False ); + idx++; + + domain.offset_x = 0; + domain.offset_y = 0; + domain.phototag = 1; + + XieFloMath(&flograph[idx], + idx, + &domain, + xieValAdd, + 0x7 + ); + idx++; + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + idx++; + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + } + if ( !reps ) + FreeErrorWithPhotomapStuff( xp, p ); + return( reps ); +} + +int +InitFloIDError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + flo = ( XiePhotoflo ) NULL; + return( reps ); +} + +int +InitFloValueError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + char *lut; + XieLTriplet start, length; + + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + XIELut = ( XieLut ) NULL; + lut = ( char * ) NULL; + + flo_elements = 2; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + lut = ( char * ) malloc( 128 ); + + length[ 0 ] = 128; + length[ 1 ] = 0; + length[ 2 ] = 0; + + start[ 0 ] = 0; + start[ 1 ] = 0; + start[ 2 ] = 0; + + if ( ( XIELut = GetXIELut( xp, p, lut, 128, 128 ) ) == + ( XieLut ) NULL ) + { + reps = 0; + } + else + { + XieFloImportLUT(&flograph[0], XIELut); + XieFloExportClientLUT(&flograph[1], + 1, /* source phototag number */ + xieValMSFirst, + 0xff, + start, + length + ); + flo = XieCreatePhotoflo( xp->d, + flograph, flo_elements ); + } + } + if ( !reps ) + { + FreeErrorWithLUTStuff( xp, p ); + } + if ( lut ) + free( lut ); + return( reps ); +} + +int +InitFloROIError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + XIERoi = ( XieRoi ) NULL; + + flo_elements = 2; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + XieFloImportROI(&flograph[0], XIERoi ); + + XieFloExportROI(&flograph[1], + 1, /* source phototag number */ + XIERoi + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + } + if ( !reps ) + { + FreeFloErrorStuff( xp, p ); + } + return( reps ); +} + +int +InitFloLUTError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + Bool merge; + XieLTriplet start; + + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + flo_elements = 2; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + XieFloImportLUT(&flograph[0], ( XieLut ) NULL ); + + merge = False; + start[ 0 ] = 0; + start[ 1 ] = 0; + start[ 2 ] = 0; + + XieFloExportLUT(&flograph[1], + 1, /* source phototag number */ + ( XieLut ) NULL, + merge, + start + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + } + if ( !reps ) + { + FreeFloErrorStuff( xp, p ); + } + return( reps ); +} + +void +DoBadValueError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + XieTechniqueGroup techGroup; + XieTechnique *techVector; + int j, i, numTech; + + techGroup = 0xff; + + for ( i = 0; i < reps; i++ ) + { + if ( !XieQueryTechniques( xp->d, techGroup, &numTech, + &techVector ) ) + { + continue; + } + + /* we shouldn't get here, however, clean up if so... */ + + for ( j = 0; j < numTech; j++ ) + { + if ( techVector[ j ].name ) + XFree( techVector[ j ].name ); + } + if ( techVector ) + { + XFree( techVector ); + techVector = ( XieTechnique * ) NULL; + } + } +} + +void +DoColorListError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieDestroyColorList( xp->d, ( XieColorList ) NULL ); + } +} + +void +DoFloErrorImmediate( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int i; + int flo_id; + + flo_id = 1; + for (i = 0; i != reps; i++) { + XieExecuteImmediate(xp->d, photospace, + flo_id, + False, + flograph, /* photoflo specification */ + flo_elements /* number of elements */ + ); + flo_id++; + } +} + +void +DoPhotospaceError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieDestroyPhotospace( xp->d, ( XiePhotospace ) NULL ); + } +} + +void +DoROIError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieDestroyROI( xp->d, ( XieRoi ) NULL ); + } +} + +void +DoFloElementError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieFloImportLUT(&flograph[1], ( XieLut ) NULL); + XieModifyPhotoflo( xp->d, flo, 2, &flograph[1], 1 ); + } +} + +void +DoLUTError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieDestroyLUT( xp->d, ( XieLut ) NULL ); + } +} + +void +DoFloIDError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int i; + char data[ 16 ]; + + for (i = 0; i != reps; i++) { + XiePutClientData ( + xp->d, + 0, /* photospace */ + flo, /* flo id */ + 1, /* element */ + True, /* signal that this is all the data */ + 0, /* band_number */ + (unsigned char *)data, + sizeof( data ) + ); + } +} + +void +DoPhotomapError( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieDestroyPhotomap( xp->d, ( XieLut ) NULL ); + } +} + +void +DoErrors( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, False ); + } +} + +void +EndErrors( xp, p ) +XParms xp; +Parms p; +{ + int which; + + XSetErrorHandler( None ); + which = ( ( ErrorParms * ) p->ts )->error; + fprintf( stderr, "There were %d error events received\n", errcnt ); + fflush( stderr ); + switch( which ) + { + case xieErrNoColorList : + break; + case xieErrNoLUT : + break; + case xieErrNoPhotoflo : + break; + case xieErrNoPhotomap : + break; + case xieErrNoROI : + break; + case xieErrNoPhotospace : + break; + } +} + +void +EndCoreErrors( xp, p ) +XParms xp; +Parms p; +{ + int which; + + XSetErrorHandler( None ); + which = ( ( ErrorParms * ) p->ts )->error; + fprintf( stderr, "There were %d error events received\n", errcnt ); + fflush( stderr ); + switch( which ) + { + case BadAccess: + /* not implemented */ + break; + case BadAlloc: + /* not implemented */ + break; + case BadIDChoice: + /* not implemented */ + break; + case BadValue: + /* nothing to do for this test */ + break; + default: + break; + } +} + +void +EndFloErrors( xp, p ) +XParms xp; +Parms p; +{ + int which; + + XSetErrorHandler( None ); + which = ( ( ErrorParms * ) p->ts )->error; + fprintf( stderr, "There were %d error events received\n", errcnt ); + fflush( stderr ); + switch( which ) + { + case xieErrNoFloAccess : + FreeErrorWithLUTStuff( xp, p ); + break; + case xieErrNoFloDrawable : + FreeErrorWithPhotomapStuff( xp, p ); + break; + case xieErrNoFloGC : + FreeErrorWithPhotomapStuff( xp, p ); + break; + case xieErrNoFloElement : + FreeErrorWithPhotomapStuff( xp, p ); + break; + case xieErrNoFloColorList : + InstallGrayColormap( xp ); + FreeErrorWithPhotomapStuff( xp, p ); + break; + case xieErrNoFloDomain : + FreeErrorWithPhotomapStuff( xp, p ); + break; + case xieErrNoFloColormap : + FreeErrorWithPhotomapStuff( xp, p ); + break; + case xieErrNoFloID : + break; + case xieErrNoFloLUT : + FreeFloErrorStuff( xp, p ); + break; + case xieErrNoFloROI : + FreeFloErrorStuff( xp, p ); + break; + case xieErrNoFloOperator : + FreeErrorWithPhotomapStuff( xp, p ); + break; + case xieErrNoFloSource : + FreeErrorWithPhotomapStuff( xp, p ); + break; + case xieErrNoFloPhotomap : + FreeFloErrorStuff( xp, p ); + break; + case xieErrNoFloMatch : + FreeErrorWithPhotomapStuff( xp, p ); + break; + case xieErrNoFloTechnique : + FreeErrorWithPhotomapStuff( xp, p ); + break; + case xieErrNoFloValue : + FreeErrorWithLUTStuff( xp, p ); + break; + default: + break; + } +} + +int +FreeErrorWithPhotomapStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( photospace ) + { + XieDestroyPhotospace( xp->d, photospace ); + photospace = ( XiePhotospace ) NULL; + } + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } +} + +int +FreeErrorWithROIStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( photospace ) + { + XieDestroyPhotospace( xp->d, photospace ); + photospace = ( XiePhotospace ) NULL; + } + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + if ( XIERoi ) + { + XieDestroyROI( xp->d, XIERoi ); + XIERoi = ( XieRoi ) NULL; + } +} + +int +FreeErrorWithLUTStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( photospace ) + { + XieDestroyPhotospace( xp->d, photospace ); + photospace = ( XiePhotospace ) NULL; + } + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } +} + +int +FreeFloErrorStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( photospace ) + { + XieDestroyPhotospace( xp->d, photospace ); + photospace = ( XiePhotospace ) NULL; + } + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} + + diff --git a/xie/xc/programs/xieperf/events.c b/xie/xc/programs/xieperf/events.c new file mode 100644 index 0000000..72d2f68 --- /dev/null +++ b/xie/xc/programs/xieperf/events.c @@ -0,0 +1,815 @@ +/* $XConsortium: events.c,v 1.12 95/04/05 19:59:08 kaleb Exp $ */ +/**** module events.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + events.c -- event tests and XIE event routines + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#ifdef WIN32 +#define _WILLWINSOCK_ +#endif +#include +#include +#include +#include "xieperf.h" + +static XieExtensionInfo *xieInfo=NULL; +static int timeout = 60; /* in seconds */ + +static XiePhotomap XIEPhotomap; +static XiePhotomap XIEPhotomap2; +static XieLut XIELut; + +static XiePhotoElement *flograph; +static XiePhotoflo flo; +static int flo_elements; +static char *data; + +static int size; +extern Bool dontClear; +extern Bool showErrors; +extern Window drawableWindow; + +/* general event stuff */ + +int +GetTimeout() +{ + return( timeout ); +} + +int +SetTimeout( time ) +int time; +{ + timeout = time; +} + +InitEventInfo(display,info) +Display *display; +XieExtensionInfo *info; +{ + xieInfo = info; +} + +GetExtensionInfo( info ) +XieExtensionInfo **info; +{ + *info = xieInfo; +} + +Bool +event_check(display,event,arg) +Display *display; +XEvent *event; +char *arg; +{ + int xie_event; + + if (xieInfo == NULL) + return(False); + + if ( event == ( XEvent * ) NULL ) + return( False ); + + xie_event = event->type - xieInfo->first_event; + if (xie_event <= 0) + return(False); + if (xie_event > xieEvnNoPhotofloDone) + return(False); + return(True); +} + +int +WaitForXIEEvent( xp, which, flo_id, tag, verbose ) +XParms xp; +int which; +XiePhotoflo flo_id; +XiePhototag tag; +Bool verbose; +{ + int Xsocket; + XEvent event; + XieExportAvailableEvent *ExportAvailable = + (XieExportAvailableEvent *) &event; + XiePhotofloDoneEvent *PhotofloDone = + (XiePhotofloDoneEvent *) &event; + XieColorAllocEvent *ColorAlloc = + (XieColorAllocEvent *) &event; + XieDecodeNotifyEvent *DecodeNotify = + (XieDecodeNotifyEvent *) &event; + XieImportObscuredEvent *ImportObscured = + (XieImportObscuredEvent *) &event; + int retval, xie_event; + time_t endtime, curtime, delta; + struct timeval tv; + Bool done; + fd_set rd; + + retval = 1; + done = False; + + /* set up for the select */ + + Xsocket = ConnectionNumber(xp->d); + endtime = time( ( time_t * ) NULL ) + timeout; + while ( done == False ) + { + /* see if there is anything for us in the event queue... */ + + if ( XCheckTypedEvent( xp->d, xieInfo->first_event + which, + &event ) == False ) + { + curtime = time( ( time_t * ) NULL ); + delta = endtime - curtime; + if ( delta <= 0 ) + { + retval = 0; + fprintf( stderr, "Timed out on receiving XIE event\n" ); + fflush( stderr ); + done = True; + continue; + } + tv.tv_sec = delta; + tv.tv_usec = 0L; + XFlush( xp->d ); + FD_ZERO(&rd); + FD_SET(Xsocket, &rd); + Select( Xsocket + 1, &rd, NULL, NULL, &tv ); + continue; + } + xie_event = event.type - xieInfo->first_event; + switch( xie_event ) + { + case xieEvnNoExportAvailable: + if ( ExportAvailable->flo_id == flo_id && + ExportAvailable->src == tag ) + { + if ( verbose == True ) + fprintf( stderr, "ExportAvailable event received\n" ); + retval = ExportAvailable->data[ 0 ]; + done = True; + } + break; + case xieEvnNoPhotofloDone: + if ( PhotofloDone->flo_id == flo_id ) + { + if ( verbose == True ) + fprintf( stderr, "PhotofloDone event received\n" ); + done = True; + } + break; + case xieEvnNoColorAlloc: + if ( ColorAlloc->flo_id == flo_id ) + { + if ( verbose == True ) + fprintf( stderr, "ColorAlloc event received\n" ); + done = True; + } + break; + case xieEvnNoDecodeNotify: + if ( DecodeNotify->flo_id == flo_id ) + { + if ( verbose == True ) + fprintf( stderr, "DecodeNotify event received\n" ); + done = True; + } + break; + case xieEvnNoImportObscured: + if ( ImportObscured->flo_id == flo_id ) + { + if ( verbose == True ) + fprintf( stderr, "ImportObscured event received\n" ); + done = True; + } + break; + } + } + return( retval ); +} + +/* event tests */ + +int +XIEEventErrorHandler( d, ev ) +Display *d; +XErrorEvent *ev; +{ + if ( showErrors ==True ) + { + fprintf( stderr, "X Event received: major %d minor %d\n", + ev->request_code, ev->minor_code ); + fflush( stderr ); + } + return( 0 ); +} + +int +InitEvents( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int which; + + which = ( ( EventParms * ) p->ts )->event; + XSetErrorHandler( XIEEventErrorHandler ); + switch( which ) + { + case xieEvnNoExportAvailable: + reps = InitExportAvailableEvent( xp, p, reps ); + break; + case xieEvnNoPhotofloDone: + reps = InitPhotofloDoneEvent( xp, p, reps ); + break; + case xieEvnNoColorAlloc: + reps = InitColorAllocEvent( xp, p, reps ); + break; + case xieEvnNoDecodeNotify: + reps = InitDecodeNotifyEvent( xp, p, reps ); + break; + case xieEvnNoImportObscured: + reps = InitImportObscuredEvent( xp, p, reps ); + break; + default: + reps = 0; + break; + } + if ( !reps ) + XSetErrorHandler( None ); + return( reps ); +} + +int +InitPhotofloDoneEvent( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + XIEPhotomap = ( XiePhotomap ) NULL; + flo = ( XiePhotoflo ) NULL; + flograph = ( XiePhotoElement * ) NULL; + + if ( ( XIEPhotomap = GetXIEDitheredPhotomap( xp, p, 1, + (1 << xp->vinfo.depth ) ) ) == ( XiePhotomap ) NULL ) + { + reps = 0; + } + else + { + flo_elements = 2; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + XieFloImportPhotomap(&flograph[0], XIEPhotomap, + False); + + XieFloExportDrawable(&flograph[1], + 1, /* source phototag number */ + xp->w, + xp->fggc, + 0, + 0 + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ) +; + } + } + if ( !reps ) + { + FreePhotofloDoneEventStuff( xp, p ); + } + return( reps ); +} + +int +InitColorAllocEvent( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + CvtToIndexParms cticfg; + EventParms *evcfg; + int retval; + + /* the idea is to use the convert to index init and end + functions, but use our test function. These are located + in cvttoindex.c. What we use in this files are wrappers + to those routines. Probably should do this for other test + code in this file too ( some of them are close or identical + to already written code )... */ + + /* initialize a convert to index parameter struct */ + + cticfg.dither = xieValDitherDefault; + cticfg.useDefaultCmap = False; + cticfg.flo_notify = True; + cticfg.addCvtFromIndex = False; + + /* save the current one */ + + evcfg = ( EventParms * )p->ts; + + /* set the new one */ + + p->ts = ( XPointer ) &cticfg; + + /* call the convert to index test init function */ + + retval = InitConvertToIndex( xp, p, reps ); + + /* restore the original test configuration */ + + p->ts = ( XPointer )evcfg; + return( retval ); +} + +int +InitDecodeNotifyEvent( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + XIEimage *image; + XieDecodeUncompressedSingleParam *decode_params=NULL; + XieEncodeTechnique encode_tech=xieValEncodeServerChoice; + char *encode_params=NULL; + XieLTriplet width, height, levels; + + XIEPhotomap = ( XiePhotomap ) NULL; + XIEPhotomap2 = ( XiePhotomap ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + image = p->finfo.image1; + if ( !GetImageData( xp, p, 1 ) ) + reps = 0; + else + { + if ( !image ) + reps = 0; + else + { + size = image->fsize; + width[ 0 ] = image->width[ 0 ]; + height[ 0 ] = image->height[ 0 ]; + levels[ 0 ] = image->levels[ 0 ]; + } + } + + if ( reps ) + { + XIEPhotomap = XieCreatePhotomap(xp->d); + XIEPhotomap2 = XieCreatePhotomap(xp->d); + + decode_params = XieTecDecodeUncompressedSingle( + image->fill_order, + image->pixel_order, + image->pixel_stride[ 0 ], + image->left_pad[ 0 ], + image->scanline_pad[ 0 ] + ); + + flo_elements = 2; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + reps = 0; + } + } + if ( reps ) + { + XieFloImportClientPhoto(&flograph[0], + image->bandclass, + width, height, levels, + True, + image->decode, (char *)decode_params + ); + + XieFloExportPhotomap(&flograph[1], + 1, /* source phototag number */ + XIEPhotomap2, + encode_tech, + encode_params + ); + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + } + if ( !reps ) + FreeDecodeNotifyEventStuff( xp, p ); + if ( decode_params ) + XFree( decode_params ); + return reps; +} + +int +InitImportObscuredEvent( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + flo = ( XiePhotoflo ) NULL; + flograph = ( XiePhotoElement * ) NULL; + + flo_elements = 2; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + + XieFloImportDrawable(&flograph[0], + xp->w, + 0, + 0, + WIDTH, + HEIGHT, + 0, + True + ); + + XieFloExportDrawable(&flograph[1], + 1, /* source phototag number */ + drawableWindow, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + XMoveWindow( xp->d, drawableWindow, 100, 100 ); + XMapRaised( xp->d, drawableWindow ); + + XSync( xp->d, 0 ); + GetXIEWindow( xp, p, xp->w, 1 ); + dontClear = True; + + flo = XieCreatePhotoflo( xp->d, flograph, 2 ); + } + + if ( !reps ) + { + XUnmapWindow( xp->d, drawableWindow ); + FreeImportObscuredEventStuff( xp, p ); + } + + return( reps ); +} + +int +InitExportAvailableEvent( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int lutSize; + char *lut; + XieLTriplet start, length; + + XIELut = ( XieLut ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + lutSize = 10; + lut = (char *)malloc( lutSize ); + data = (char *)malloc( lutSize ); + if ( lut == ( char * ) NULL || data == ( char * ) NULL ) + { + reps = 0; + } + else + { + if ( ( XIELut = GetXIELut( xp, p, lut, lutSize, lutSize ) ) == + ( XieLut ) NULL ) + { + reps = 0; + } + else + { + flo_elements = 2; + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, + "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + length[ 0 ] = lutSize; + length[ 1 ] = 0; + length[ 2 ] = 0; + + start[ 0 ] = 0; + start[ 1 ] = 0; + start[ 2 ] = 0; + + XieFloImportLUT(&flograph[0], XIELut); + XieFloExportClientLUT(&flograph[1], + 1, /* source phototag number */ + xieValMSFirst, + xieValNewData, + start, + length + ); + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + } + } + } + if ( lut ) + free( lut ); + if ( !reps ) + FreeExportAvailableEventStuff( xp, p ); + return( reps ); +} + +void +DoPhotofloDoneEvent( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, True ); + WaitForXIEEvent( xp, ( ( EventParms * ) p->ts )->event, flo, 0, showErrors ); + } +} + +void +DoDecodeNotifyEvent( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, True ); + + /* send only part of the data - should cause the event */ + + PumpTheClientData( xp, p, flo, 0, 1, p->finfo.image1->data, + size / 2, 0 ); + WaitForXIEEvent( xp, ( ( EventParms * ) p->ts )->event, flo, 0, showErrors ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + } +} + +void +DoImportObscuredEvent( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, True ); + WaitForXIEEvent( xp, ( ( EventParms * ) p->ts )->event, flo, 0, showErrors); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + } +} + +void +DoExportAvailableEvent( xp, p, reps ) +XParms xp; +Parms p; +int reps; +{ + int i, done; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, True ); + WaitForXIEEvent( xp, ( ( EventParms * ) p->ts )->event, + flo, 2, showErrors ); + done = 0; + while ( !done ) + { + ReadNotifyExportData( xp, p, 0, flo, 2, + sizeof( XieRectangle ), 1, &data, &done ); + } + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, + flo, 0, False ); + } +} + +void +EndEvents( xp, p ) +XParms xp; +Parms p; +{ + int which; + + XSetErrorHandler( None ); + which = ( ( EventParms * ) p->ts )->event; + + switch( which ) + { + case xieEvnNoExportAvailable: + FreeExportAvailableEventStuff( xp, p ); + break; + case xieEvnNoPhotofloDone: + FreePhotofloDoneEventStuff( xp, p ); + break; + case xieEvnNoColorAlloc: + EndConvertToIndex( xp, p ); + break; + case xieEvnNoDecodeNotify: + FreeDecodeNotifyEventStuff( xp, p ); + break; + case xieEvnNoImportObscured: + XUnmapWindow( xp->d, drawableWindow ); + FreeImportObscuredEventStuff( xp, p ); + break; + } +} + +int +FreePhotofloDoneEventStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( data ) + { + free( data ); + data = ( char * ) NULL; + } + + if ( XIEPhotomap ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } + + if ( XIEPhotomap2 ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap2 ); + XIEPhotomap2 = ( XiePhotomap ) NULL; + } + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} + +int +FreeImportObscuredEventStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} + +int +FreeExportAvailableEventStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( data ) + { + free( data ); + data = ( char * ) NULL; + } + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } +} + +int +FreeDecodeNotifyEventStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( data ) + { + free( data ); + data = ( char * ) NULL; + } + if ( XIEPhotomap ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } + if ( XIEPhotomap2 ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap2 ); + XIEPhotomap2 = ( XiePhotomap ) NULL; + } + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} + diff --git a/xie/xc/programs/xieperf/exportcl.c b/xie/xc/programs/xieperf/exportcl.c new file mode 100644 index 0000000..96f5c35 --- /dev/null +++ b/xie/xc/programs/xieperf/exportcl.c @@ -0,0 +1,958 @@ +/* $XConsortium: exportcl.c,v 1.14 94/04/17 20:39:18 rws Exp $ */ + +/**** module exportcl.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + exportcl.c -- export client flo element tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include + +static XiePhotomap XIEPhotomap; +static XiePhotomap ControlPlane; +static XieLut XIELut; +static XieRoi XIERoi; +static unsigned char *lut; +static int lutSize; +static XieRectangle *rects; +static int rectsSize; +extern unsigned int dataCheckSum1; + +static XIEimage *image; +static int flo_notify; +static XiePhotoElement *flograph; +static XiePhotoflo flo; +static XieHistogramData *histos; +static int flo_elements; +static int useDomain; +static int histoSrc; + +extern Window monitorWindow; +extern Bool dontClear; +static char *data; + +int InitExportClientPhoto(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + char *encode_params=NULL; + int *size; + extern char *imagepath; + unsigned char pixel_stride[ 3 ]; + unsigned char scanline_pad[ 3 ]; + char buf[ 64 ]; + + flograph = ( XiePhotoElement * ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + flo = ( XiePhotoflo ) NULL; + + image = p->finfo.image1; + if ( !image ) + return ( 0 ); + + sprintf( buf, "%s/%s", imagepath, image->fname ); + size = &image->fsize; + *size = GetFileSize( buf ); + if ( *size == 0 ) + return( 0 ); + + data = ( char * ) malloc( *size ); + if ( data == ( char * ) NULL ) + return( 0 ); + flograph = XieAllocatePhotofloGraph(2); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + switch( image->decode ) + { + case xieValDecodeJPEGBaseline: + if ( ( XIEPhotomap = GetXIETriplePhotomap( xp, p, 1 ) ) == + ( XiePhotomap ) NULL ) + { + reps = 0; + } + else + { + unsigned char h_samples[3]; + unsigned char v_samples[3]; + + h_samples[0] = h_samples[1] = h_samples[2] = 1; + v_samples[0] = v_samples[1] = v_samples[2] = 1; + + encode_params = ( char * ) XieTecEncodeJPEGBaseline( + image->interleave, + image->band_order, + h_samples, + v_samples, + ( char * ) NULL, + 0, + ( char * ) NULL, + 0, + ( char * ) NULL, + 0 + ); + } + break; + case xieValDecodeUncompressedTriple: + if ( ( XIEPhotomap = GetXIETriplePhotomap( xp, p, 1 ) ) == + ( XiePhotomap ) NULL ) + { + reps = 0; + } + else + { + pixel_stride[ 0 ] = image->pixel_stride[ 0 ]; + pixel_stride[ 1 ] = image->pixel_stride[ 1 ]; + pixel_stride[ 2 ] = image->pixel_stride[ 2 ]; + scanline_pad[ 0 ] = image->scanline_pad[ 0 ]; + scanline_pad[ 1 ] = image->scanline_pad[ 1 ]; + scanline_pad[ 2 ] = image->scanline_pad[ 2 ]; + + encode_params = ( char * ) XieTecEncodeUncompressedTriple( + image->fill_order, + image->pixel_order, + image->band_order, + xieValBandByPixel, + pixel_stride, + scanline_pad + ); + } + break; + case xieValDecodeUncompressedSingle: + if ( ( XIEPhotomap = GetXIEPhotomap( xp, p, 1 ) ) == + ( XiePhotomap ) NULL ) + { + reps = 0; + } + else + { + encode_params = ( char * ) XieTecEncodeUncompressedSingle( + image->fill_order, + image->pixel_order, + image->pixel_stride[ 0 ], + image->scanline_pad[ 0 ] + ); + } + break; + case xieValDecodeG31D: + if ( ( XIEPhotomap = GetXIEFAXPhotomap( xp, p, 1, + False ) ) == ( XiePhotomap ) NULL ) + { + reps = 0; + } + else + { + encode_params = ( char * ) XieTecEncodeG31D( + False, + False, + xieValLSFirst + ); + } + break; + case xieValDecodeG32D: + if ( ( XIEPhotomap = GetXIEFAXPhotomap( xp, p, 1, + False ) ) == ( XiePhotomap ) NULL ) + { + reps = 0; + } + else + { + encode_params = ( char * ) XieTecEncodeG32D( + False, + False, + False, + xieValLSFirst, + 1 + ); + } + break; + case xieValDecodeG42D: + if ( ( XIEPhotomap = GetXIEFAXPhotomap( xp, p, 1, + False ) ) == ( XiePhotomap ) NULL ) + { + reps = 0; + } + else + { + encode_params = ( char * ) XieTecEncodeG42D( + False, + False, + xieValLSFirst + ); + } + break; + case xieValDecodeTIFF2: + if ( ( XIEPhotomap = GetXIEFAXPhotomap( xp, p, 1, + False ) ) == ( XiePhotomap ) NULL ) + { + reps = 0; + } + else + { + encode_params = ( char * ) XieTecEncodeTIFF2( + xieValLSFirst, + False + ); + } + break; + case xieValDecodeTIFFPackBits: + if ( ( XIEPhotomap = GetXIEFAXPhotomap( xp, p, 1, + False ) ) == ( XiePhotomap ) NULL ) + { + reps = 0; + } + else + { + encode_params = ( char * ) XieTecEncodeTIFFPackBits( + xieValLSFirst + ); + } + break; + default: + reps = 0; + break; + } + + if ( reps ) + { + XieFloImportPhotomap(&flograph[0], XIEPhotomap, False ); + XieFloExportClientPhoto(&flograph[1], + 1, /* source phototag number */ + xieValNewData, + image->decode, + encode_params + ); + + flo = XieCreatePhotoflo( xp->d, flograph, 2 ); + flo_notify = True; + } + } + if ( encode_params ) + { + if ( image->decode == xieValDecodeJPEGBaseline ) + XieFreeEncodeJPEGBaseline( + ( XieEncodeJPEGBaselineParam * ) encode_params ); + else + XFree( encode_params ); + } + if ( !reps ) + FreeExportClientPhotoStuff( xp, p ); + return( reps ); +} + +int InitExportClientLUT(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + XieOrientation band_order = xieValLSFirst; + XieLTriplet start, length; + + XIELut = ( XieLut ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + histos = ( XieHistogramData * ) malloc( sizeof( XieHistogramData ) * + xp->vinfo.colormap_size ); + lutSize = ( xp->vinfo.colormap_size ) * sizeof( unsigned char ); + lut = (unsigned char *) malloc( lutSize ); + data = (char *) malloc( lutSize ); + if ( lut == ( unsigned char * ) NULL || data == ( char * ) NULL || + histos == ( XieHistogramData * ) NULL ) + { + reps = 0; + } + else + { + for ( i = 0; i < lutSize; i++ ) + { + lut[ i ] = ( xp->vinfo.colormap_size ) - i - 1; + } + if ( ( XIELut = GetXIELut( xp, p, lut, lutSize, lutSize ) ) == + ( XieLut ) NULL ) + { + reps = 0; + } + } + if ( reps ) + { + flo_elements = 2; + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + } + if ( reps ) + { + XieFloImportLUT(&flograph[0], XIELut); + + length[ 0 ] = xp->vinfo.colormap_size; + length[ 1 ] = 0; + length[ 2 ] = 0; + + start[ 0 ] = 0; + start[ 1 ] = 0; + start[ 2 ] = 0; + + XieFloExportClientLUT(&flograph[1], + 1, /* source phototag number */ + band_order, + xieValNewData, + start, + length + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + flo_notify = True; + } + if ( !reps ) + { + FreeExportClientLUTStuff( xp, p ); + } + else + { + XMapRaised( xp->d, monitorWindow ); + XSync( xp->d, 0 ); + } + return( reps ); +} + +int InitExportClientROI(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + XIERoi = ( XieRoi ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + rectsSize = (( ExportClParms * ) p->ts)->numROIs; + rects = (XieRectangle *)malloc( rectsSize * sizeof( XieRectangle ) ); + data = (char *) NULL; + if ( rects == ( XieRectangle * ) NULL ) + { + reps = 0; + } + else + { + for ( i = 0; i < rectsSize; i++ ) + { + rects[ i ].x = i * 10; + rects[ i ].y = i * 10; + rects[ i ].width = i * 10; + rects[ i ].height = i * 10; + XFillRectangle( xp->d, xp->w, xp->fggc, + rects[ i ].x, + rects[ i ].y, + rects[ i ].width, + rects[ i ].height + ); + } + if ( ( XIERoi = GetXIERoi( xp, p, rects, rectsSize ) ) == + ( XieRoi ) NULL ) + { + reps = 0; + } + else + { + flo_elements = 2; + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, + "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + XieFloImportROI(&flograph[0], XIERoi); + XieFloExportClientROI(&flograph[1], + 1, /* source phototag number */ + xieValNewData + ); + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + flo_notify = True; + } + } + } + if ( !reps ) + { + FreeExportClientROIStuff( xp, p ); + } + else + dontClear = True; + return( reps ); +} + +int +InitExportClientHistogram(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XieProcessDomain domain; + int idx, src; + XieRectangle rect; + ExportClParms *parms; + XIEimage *image; + int constrainflag = 0; + + parms = ( ExportClParms * )p->ts; + XIELut = ( XieLut ) NULL; + XIERoi = ( XieRoi ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + ControlPlane = ( XiePhotomap ) NULL; + histos = ( XieHistogramData * ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + if ( parms ) + useDomain = parms->useDomain; + else + useDomain = DomainNone; + + flo_elements = 3; + + image = p->finfo.image1; + if ( !image ) + { + reps = 0; + } + + if ( reps && ( xp->screenDepth != image->depth[ 0 ] ) ) + { + flo_elements+=2; + constrainflag = 1; + if ( ( XIELut = CreatePointLut( xp, p, + 1 << image->depth[ 0 ], + 1 << xp->screenDepth, False ) ) + == ( XieLut ) NULL ) + { + reps = 0; + } + } + + if ( reps && useDomain == DomainROI ) + { + rect.x = parms->x; + rect.y = parms->y; + rect.width = parms->width; + rect.height = parms->height; + + if ( ( XIERoi = GetXIERoi( xp, p, &rect, 1 ) ) == + ( XieRoi ) NULL ) + { + reps = 0; + } + flo_elements+=1; + } + else if ( reps && useDomain == DomainCtlPlane ) + { + ControlPlane = GetControlPlane( xp, 2 ); + if ( ControlPlane == ( XiePhotomap ) NULL ) + reps = 0; + flo_elements+=1; + } + + if ( reps ) + { + histos = ( XieHistogramData * ) malloc( sizeof( XieHistogramData ) * ( 1 << image->depth[ 0 ] ) ); + if ( histos == ( XieHistogramData * ) NULL ) + { + reps = 0; + } + } + if ( reps ) + { + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else if ( ( XIEPhotomap = + GetXIEPhotomap( xp, p, 1 ) ) == ( XiePhotomap ) NULL ) + { + reps = 0; + } + else + { + domain.offset_x = 0; + domain.offset_y = 0; + domain.phototag = 0; + + idx = 0; + if ( useDomain == DomainROI ) + { + XieFloImportROI(&flograph[idx], XIERoi); + idx++; + domain.phototag = idx; + } + else if ( useDomain == DomainCtlPlane ) + { + XieFloImportPhotomap(&flograph[idx], + ControlPlane, False); + idx++; + domain.phototag = idx; + } + + XieFloImportPhotomap(&flograph[idx], + XIEPhotomap, False ); + idx++; + src = idx; + + XieFloExportClientHistogram(&flograph[idx], + idx, /* source phototag number */ + &domain, + xieValNewData + ); + idx++; + histoSrc = idx; + + if ( constrainflag ) + { + XieFloImportLUT(&flograph[idx], XIELut ); + idx++; + + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + src, + &domain, + idx, + 0x7 + ); + idx++; + src = idx; + } + + XieFloExportDrawable(&flograph[idx], + src, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + idx++; + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + flo_notify = True; + } + } + if ( reps ) + { + XMapRaised( xp->d, monitorWindow ); + XSync( xp->d, 0 ); + } + else + { + FreeExportClientHistogramStuff( xp, p ); + } + return( reps ); +} + +void DoExportClientPhotoCSum(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i, done; + unsigned int checksum; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + if ( image->bandclass == xieValTripleBand && + image->interleave == xieValBandByPlane ) + { + ReadNotifyExportTripleData( xp, p, 0, flo, 2, 1, + image->fsize, &data, &done ); + } + else + { + ReadNotifyExportData( xp, p, 0, flo, 2, 1, + image->fsize, &data, &done ); + } + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + checksum = CheckSum( data, image->fsize ); + if ( checksum != image->chksum ) + { + fprintf( stderr, + "Photomap not read correctly by client\n" ); + break; + } + } +} + +void DoExportClientPhoto(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i, done; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + if ( image->bandclass == xieValTripleBand && + image->interleave == xieValBandByPlane ) + { + ReadNotifyExportTripleData( xp, p, 0, flo, 2, 1, + image->fsize, &data, &done ); + } + else + { + ReadNotifyExportData( xp, p, 0, flo, 2, 1, + image->fsize, &data, &done ); + } + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + } +} + +void +DoExportClientHistogram(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ + int i, done, numHistos; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + numHistos = ReadNotifyExportData( xp, p, 0, flo, histoSrc, + sizeof( XieHistogramData ), 0, ( char ** ) &histos, + &done ) / sizeof( XieHistogramData ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + DrawHistogram( xp, monitorWindow, ( XieHistogramData * ) histos, + numHistos, 1<< xp->vinfo.depth ); + } +} + +void +DoExportClientLUT(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ + int i, j, done; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + ReadNotifyExportData( xp, p, 0, flo, 2, + sizeof( unsigned char ), lutSize, + &data, &done ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + for ( j = 0; j < lutSize; j++ ) + { + histos[ j ].value = j; + histos[ j ].count = (( unsigned char * ) data)[ j ]; + } + if ( memcmp( lut, data, lutSize * sizeof( unsigned char ) ) ) + { + fprintf( stderr, "ExportClientLUT failed\n" ); + break; + } + DrawHistogram( xp, monitorWindow, ( XieHistogramData * ) histos, + lutSize, xp->vinfo.colormap_size ); + } +} + +void +DoExportClientROI(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ + int i, j, done, n; + GC gc; + + gc = xp->fggc; + for (i = 0; i != reps; i++) + { + done = 0; + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + n = ReadNotifyExportData( xp, p, 0, flo, 2, + sizeof( XieRectangle ), 0, &data, &done ); + + if ( n == 0 ) + continue; + + for ( j = 0; j < n / sizeof( XieRectangle ); j++ ) + { + XDrawRectangle( xp->d, xp->w, gc, + ( (( XieRectangle * )data)[ j ] ).x, + ( (( XieRectangle * )data)[ j ] ).y, + ( (( XieRectangle * )data)[ j ] ).width, + ( (( XieRectangle * )data)[ j ] ).height ); + if ( gc == xp->fggc ) + gc = xp->bggc; + else + gc = xp->fggc; + } + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + } +} + +void EndExportClientLUT(xp, p) +XParms xp; +Parms p; +{ + XUnmapWindow( xp->d, monitorWindow ); + FreeExportClientLUTStuff( xp, p ); +} + +void +EndExportClientPhoto(xp, p) +XParms xp; +Parms p; +{ + FreeExportClientPhotoStuff( xp, p ); +} + +void +EndExportClientHistogram(xp, p) +XParms xp; +Parms p; +{ + XUnmapWindow( xp->d, monitorWindow ); + FreeExportClientHistogramStuff( xp, p ); +} + +void EndExportClientROI(xp, p) + XParms xp; + Parms p; +{ + dontClear = False; + FreeExportClientROIStuff( xp, p ); +} + +int +FreeExportClientPhotoStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( data ) + { + free( data ); + data = ( char * ) NULL; + } + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } +} + +int +FreeExportClientROIStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( data ) + { + free( data ); + data = ( char * ) NULL; + } + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + + if ( XIERoi ) + { + XieDestroyROI( xp->d, XIERoi ); + XIERoi = ( XieRoi ) NULL; + } + + if ( rects ) + { + free( rects ); + rects = ( XieRectangle * ) NULL; + } +} + +int +FreeExportClientLUTStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( data ) + { + free( data ); + data = ( char * ) NULL; + } + + if ( histos ) + { + free( histos ); + histos = ( XieHistogramData * ) NULL; + } + + if ( lut ) + { + free( lut ); + lut = ( unsigned char * ) NULL; + } + + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} + +int +FreeExportClientHistogramStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIERoi ) + { + XieDestroyROI( xp->d, XIERoi ); + XIERoi = ( XieRoi ) NULL; + } + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } + if ( ControlPlane && IsPhotomapInCache( ControlPlane ) == False ) + { + XieDestroyPhotomap( xp->d, ControlPlane ); + ControlPlane = ( XiePhotomap ) NULL; + } + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + if ( histos ) + { + free( histos ); + histos = ( XieHistogramData * ) NULL; + } + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} + diff --git a/xie/xc/programs/xieperf/funcode.c b/xie/xc/programs/xieperf/funcode.c new file mode 100644 index 0000000..9f8d16f --- /dev/null +++ b/xie/xc/programs/xieperf/funcode.c @@ -0,0 +1,607 @@ +/* $XConsortium: funcode.c,v 1.6 94/04/17 20:39:19 rws Exp $ */ + +/**** module funcode.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + funcode.c -- "Let's mess up the encode parameters and make sure + things are lossless" tests. Both SingleBand and + TripleBand. + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include +#include + +static XiePhotomap XIEPhotomap; +static XiePhotomap XIEPhotomap2; + +static int flo_notify; +static XiePhotoElement *flograph1, *flograph2; +static int flo1_elements; +static int flo2_elements; +static XiePhotoflo *flo; +static XieLut XIELut; +static char **encode_parms; +static int testSize; +static int type; +static char *parms; +extern Bool WMSafe; +static XStandardColormap stdCmap; +static int cclass; + +void EndFunnyEncode(); + +int +InitFunnyEncode(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ + int decode_notify = 0; + int i, idx; + XIEimage *image; + extern Window drawableWindow; + XieProcessDomain domain; + XieEncodeTechnique encode_tech = ( XieEncodeTechnique ) NULL; + XieEncodeUncompressedSingleParam *encode_single; + XieEncodeUncompressedTripleParam *encode_triple; + extern Bool dontClear; + XieLTriplet levels; + int techParmOffset, floIdx; + FunnyEncodeParms *ptr; + int depthmismatch; + XieConstant in_low,in_high; + XieLTriplet out_low,out_high; + XieLTriplet mult; + XieConstant c1; + float bias = 0.0; + int constrainFlag = 0; + GeometryParms gp; + int atom; + + depthmismatch = 0; + parms = ( char * ) NULL; + image = p->finfo.image1; + type = image->bandclass; +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xp->vinfo.c_class; +#else + cclass = xp->vinfo.class; +#endif + ptr = ( FunnyEncodeParms * ) p->ts; + + if ( type == xieValTripleBand && xp->screenDepth == 1 ) + return( 0 ); + + if ( IsDISServer() ) + return( 0 ); + + XIEPhotomap = ( XiePhotomap ) NULL; + XIEPhotomap2 = ( XiePhotomap ) NULL; + XIELut = ( XieLut ) NULL; + flo = ( XiePhotoflo * ) NULL; + flograph1 = ( XiePhotoElement * ) NULL; + flograph2 = ( XiePhotoElement * ) NULL; + encode_parms = ( char ** ) NULL; + + /* check for match errors in the ED */ + + if ( type == xieValSingleBand && xp->screenDepth != image->depth[ 0 ] ) + { + depthmismatch = 1; + XIELut = CreatePointLut( xp, p, 1 << image->depth[ 0 ], + 1 << xp->screenDepth, False ); + } + + if ( IsGrayVisual( cclass ) ) + atom = XA_RGB_GRAY_MAP; + else + atom = XA_RGB_BEST_MAP; + if ( type == xieValTripleBand && !IsTrueColorOrDirectColor( cclass ) && !IsStaticVisual( cclass ) ) + { + if ( !GetStandardColormap( xp, &stdCmap, atom ) ) + reps = 0; + else + InstallThisColormap( xp, stdCmap.colormap ); + } + else if ( type == xieValTripleBand ) + { + if ( !IsStaticVisual( cclass ) ) + InstallColorColormap( xp ); + CreateStandardColormap( xp, &stdCmap, atom ); + } + + if ( reps ) + { + if ( type == xieValSingleBand ) + { + XIEPhotomap = GetXIEPhotomap( xp, p, 1 ); + encode_tech = xieValEncodeUncompressedSingle; + } + else + { + encode_tech = xieValEncodeUncompressedTriple; + + gp.geoType = GEO_TYPE_SCALE; + gp.geoHeight = 128; + gp.geoWidth = 128; + gp.geoXOffset = 0; + gp.geoYOffset = 0; + gp.geoTech = xieValGeomNearestNeighbor; + + if ( ptr->useMyLevelsPlease == True ) + { + levels[ 0 ] = 1 << ptr->myBits[ 0 ]; + levels[ 1 ] = 1 << ptr->myBits[ 1 ]; + levels[ 2 ] = 1 << ptr->myBits[ 2 ]; + + out_high[ 0 ] = ( float ) ( ( 1 << ptr->myBits[ 0 ] ) - 1 ); + out_high[ 1 ] = ( float ) ( ( 1 << ptr->myBits[ 1 ] ) - 1 ); + out_high[ 2 ] = ( float ) ( ( 1 << ptr->myBits[ 2 ] ) - 1 ); + in_low[ 0 ] = 0; + in_low[ 1 ] = 0; + in_low[ 2 ] = 0; + in_high[ 0 ] = ( 1 << image->depth[ 0 ] ) - 1; + in_high[ 1 ] = ( 1 << image->depth[ 1 ] ) - 1; + in_high[ 2 ] = ( 1 << image->depth[ 2 ] ) - 1; + out_low[ 0 ] = 0.0; + out_low[ 1 ] = 0.0; + out_low[ 2 ] = 0.0; + + XIEPhotomap = GetXIEConstrainedGeometryTriplePhotomap( + xp, p, 1, levels, + xieValConstrainClipScale, in_low, + in_high, out_low, out_high, &gp ); + } + else + { + XIEPhotomap = GetXIEGeometryTriplePhotomap( xp, p, 1, &gp ); + } + } + } + if ( reps ) + { + XIEPhotomap2 = XieCreatePhotomap( xp->d ); + if ( XIEPhotomap == ( XiePhotomap ) NULL || + XIEPhotomap2 == ( XiePhotomap ) NULL ) + { + reps = 0; + } + else if ( reps ) + { + decode_notify = False; + testSize = ptr->floElements; + + if ( type == xieValSingleBand ) + { + flo1_elements = 2; + flo2_elements = 2; + } + else + { + flo1_elements = 2; + flo2_elements = 4; + } + if ( depthmismatch == 1 && type == xieValSingleBand ) + flo2_elements+=2; + + flograph1 = XieAllocatePhotofloGraph(flo1_elements); + if ( flograph1 == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + } + } + if ( reps ) + { + flograph2 = XieAllocatePhotofloGraph(flo2_elements); + if ( flograph2 == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + + flo = ( XiePhotoflo * ) malloc( ( testSize << 1 ) * sizeof( XiePhotoflo ) ); + if ( flo == ( XiePhotoflo * ) NULL ) + { + fprintf( stderr, "Couldn't allocate vector of flos\n" ); + reps = 0; + } + else + { + for ( i = 0; i < testSize; i++ ) + { + flo[ i ] = ( XiePhotoflo ) NULL; + } + } + + encode_parms = (char **) malloc( sizeof( char * ) * testSize ); + if ( encode_parms == ( char ** ) NULL ) + { + fprintf( stderr, "Couldn't allocate encode parameter table\n" ); + reps = 0; + } + else + { + for ( i = 0; i < testSize; i++ ) + { + encode_parms[ i ] = ( char * ) NULL; + } + } + } + + if ( reps && type == xieValTripleBand ) + { + in_low[ 0 ] = 0.0; + in_low[ 1 ] = 0.0; + in_low[ 2 ] = 0.0; + if ( ptr->useMyLevelsPlease == True ) + { + in_high[ 0 ] = ( float ) ( 1 << ptr->myBits[ 0 ] ) - 1; + in_high[ 1 ] = ( float ) ( 1 << ptr->myBits[ 1 ] ) - 1; + in_high[ 2 ] = ( float ) ( 1 << ptr->myBits[ 2 ] ) - 1; + } + else + { + in_high[ 0 ] = ( float ) ( 1 << image->depth[ 0 ] ) - 1; + in_high[ 1 ] = ( float ) ( 1 << image->depth[ 1 ] ) - 1; + in_high[ 2 ] = ( float ) ( 1 << image->depth[ 2 ] ) - 1; + } + out_low[ 0 ] = 0; + out_low[ 1 ] = 0; + out_low[ 2 ] = 0; + + if ( IsTrueColorOrDirectColor( cclass ) ) + { + out_high[ 0 ] = TripleTrueOrDirectLevels( xp ) - 1; + out_high[ 1 ] = out_high[ 2 ] = out_high[ 0 ]; + + /* make a fake StandardColormap */ + + mult[ 0 ] = stdCmap.red_mult; + mult[ 1 ] = stdCmap.green_mult; + mult[ 2 ] = stdCmap.blue_mult; + bias = ( float ) stdCmap.base_pixel; + } + else + { + mult[ 0 ] = stdCmap.red_mult; + mult[ 1 ] = stdCmap.green_mult; + mult[ 2 ] = stdCmap.blue_mult; + bias = ( float ) stdCmap.base_pixel; + + out_high[ 0 ] = stdCmap.red_max; + out_high[ 1 ] = stdCmap.green_max; + out_high[ 2 ] = stdCmap.blue_max; + } + + if ( in_high[ 0 ] < out_high[ 0 ] || + in_high[ 1 ] < out_high[ 1 ] || + in_high[ 2 ] < out_high[ 2 ] ) + { + constrainFlag = 1; + parms = ( char * ) XieTecClipScale( in_low, in_high, out_low, out_high); + } + else + constrainFlag = 0; + } + + if ( reps ) + { + techParmOffset = 0; + floIdx = 0; + + for ( i = 0; i < testSize; i++ ) + { + idx = 0; + + XieFloImportPhotomap(&flograph1[idx], + ( i == 0 ? XIEPhotomap : XIEPhotomap2 ), + decode_notify); + idx++; + if ( type == xieValSingleBand ) + { + encode_single = XieTecEncodeUncompressedSingle( + ptr->fillOrder[ techParmOffset ], + ptr->pixelOrder[ techParmOffset ], + ptr->pixelStride[ techParmOffset ], + ptr->scanlinePad[ techParmOffset ] + ); + encode_parms[i] = ( char * ) encode_single; + } + else + { + encode_triple = XieTecEncodeUncompressedTriple( + ptr->fillOrder[ techParmOffset ], + ptr->pixelOrder[ techParmOffset ], + ptr->bandOrder[ techParmOffset ], + ptr->interleave[ techParmOffset ], + &ptr->pixelStride[ techParmOffset * 3], + &ptr->scanlinePad[ techParmOffset * 3 ] + ); + encode_parms[i] = ( char * ) encode_triple; + } + + techParmOffset++; + if ( encode_parms[i] == ( char * ) NULL ) + { + fprintf( stderr, "Could not get encode technique parameters\n" ); + reps = 0; + break; + } + + XieFloExportPhotomap(&flograph1[idx], + idx, + XIEPhotomap2, + encode_tech, + encode_parms[i] + ); + + idx = 0; + XieFloImportPhotomap(&flograph2[idx], XIEPhotomap2, + decode_notify); + idx++; + + if ( type == xieValSingleBand && depthmismatch == 1 ) + { + XieFloImportLUT(&flograph2[idx], XIELut ); + idx++; + + domain.offset_x = 0; + domain.offset_y = 0; + domain.phototag = 0; + + XieFloPoint(&flograph2[idx], + idx - 1, + &domain, + idx, + 0x7 + ); + idx++; + } + else if (type == xieValTripleBand) + { + levels[ 0 ] = ( long ) out_high[ 0 ] + 1; + levels[ 1 ] = ( long ) out_high[ 1 ] + 1; + levels[ 2 ] = ( long ) out_high[ 2 ] + 1; + + if ( constrainFlag ) + { + XieFloConstrain( &flograph2[idx], + idx, + levels, + xieValConstrainClipScale, + parms + ); + } + else + { + XieFloDither(&flograph2[idx], + idx, + 0x07, + levels, + xieValDitherDefault, + ( char * ) NULL + ); + } + idx++; + } + + if ( type == xieValTripleBand ) + { + c1[ 0 ] = mult[ 0 ]; + c1[ 1 ] = mult[ 1 ]; + c1[ 2 ] = mult[ 2 ]; + + XieFloBandExtract( &flograph2[idx], idx, + 1 << xp->vinfo.depth, bias, c1 ); + idx++; + } + + if ( reps ) + { + XieFloExportDrawable(&flograph2[idx], + idx, /* source phototag number */ + drawableWindow, + xp->fggc, + 0, + 0 + ); + flo[floIdx] = XieCreatePhotoflo( xp->d, flograph1, flo1_elements ); + floIdx++; + flo[floIdx] = XieCreatePhotoflo( xp->d, flograph2, flo2_elements ); + floIdx++; + } + } + } + + if ( reps ) + { + flo_notify = False; + dontClear = True; + + /* display the normal image, dithered to the levels of + the output screen, in the left hand window */ + + if ( type == xieValSingleBand ) + { + GetXIEWindow( xp, p, xp->w, 1 ); + } + else + { + levels[ 0 ] = out_high[ 0 ] + 1; + levels[ 1 ] = out_high[ 1 ] + 1; + levels[ 2 ] = out_high[ 2 ] + 1; + + GetXIEDitheredStdTripleWindow( xp, p, xp->w, 1, + xieValDitherDefault, 0, levels, &stdCmap ); + } + XMoveWindow( xp->d, drawableWindow, WIDTH + 10, 0 ); + XMapRaised( xp->d, drawableWindow ); + XSync( xp->d, 0 ); + } + if ( !reps ) + EndFunnyEncode( xp, p ); + return( reps ); +} + +void DoFunnyEncode(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i, j; + + for (i = 0; i != reps; i++) + { + for ( j = 0; j < testSize; j++ ) + { + XieExecutePhotoflo( xp->d, flo[ j ], True ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo[ j ], + 0, False ); + } + } +} + +void +EndFunnyEncode(xp, p) +XParms xp; +Parms p; +{ + extern Window drawableWindow; + extern Bool dontClear; + + dontClear = False; + if ( type == xieValTripleBand && !IsStaticVisual( cclass ) ) + InstallGrayColormap( xp ); + + XUnmapWindow( xp->d, drawableWindow ); + FreeFunnyEncodeStuff( xp, p ); +} + +int +FreeFunnyEncodeStuff( xp, p ) +XParms xp; +Parms p; +{ + int i; + + if ( parms ) + { + XFree( parms ); + parms = ( char * ) NULL; + } + if ( encode_parms ) + { + for ( i = 0; i < testSize; i++ ) + { + if ( encode_parms[ i ] ) + XFree( encode_parms[ i ] ); + } + free( encode_parms ); + encode_parms = ( char ** ) NULL; + } + + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } + + if ( XIEPhotomap2 ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap2 ); + XIEPhotomap2 = ( XiePhotomap ) NULL; + } + + if ( flo ) + { + for ( i = 0; i < testSize; i++ ) + { + if ( flo[ i ] ) + XieDestroyPhotoflo( xp->d, flo[ i ] ); + } + free( flo ); + flo = ( XiePhotoflo * ) NULL; + } + + if ( flograph1 ) + { + XieFreePhotofloGraph(flograph1, flo1_elements); + flograph1 = ( XiePhotoElement * ) NULL; + } + + if ( flograph2 ) + { + XieFreePhotofloGraph(flograph2, flo2_elements); + flograph2 = ( XiePhotoElement * ) NULL; + } +} + diff --git a/xie/xc/programs/xieperf/geometry.c b/xie/xc/programs/xieperf/geometry.c new file mode 100644 index 0000000..d8a554a --- /dev/null +++ b/xie/xc/programs/xieperf/geometry.c @@ -0,0 +1,713 @@ +/* $XConsortium: geometry.c,v 1.12 94/04/17 20:39:20 rws Exp $ */ + +/**** module geometry.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + geometry.c -- geometry flo element tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include +#include +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +static XiePhotomap XIEPhotomap; +static XieLut XIELut, XIELut2; + +static int constrainflag = 0; +static int drawableplaneflag = 0; + +static XieDecodeG42DParam *G42Ddecode_params=NULL; +static XieDecodeG32DParam *G32Ddecode_params=NULL; +static XieDecodeG31DParam *G31Ddecode_params=NULL; +static XieDecodeTIFFPackBitsParam *TIFFPackBitsdecode_params=NULL; +static XieDecodeTIFF2Param *TIFF2decode_params=NULL; + +static XiePhotoElement *flograph; +static XiePhotoflo flo; +static int flo_elements; +static int flo_notify; +static int size; +static XIEimage *image; + +int InitGeometry(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int band_mask = 1; + int idx = 0; + float coeffs[ 6 ]; + static XieConstant constant = { 0.0, 0.0, 0.0 }; + XieProcessDomain domain; + XieGeometryTechnique geo_tech = ( XieGeometryTechnique ) NULL; + char *geo_tech_params = NULL; + + XIELut = ( XieLut ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + image = p->finfo.image1; + if ( !image ) + return 0; + + if ( TechniqueSupported( xp, xieValGeometry, + ( ( GeometryParms * ) p->ts )->geoTech ) == False ) + return 0; + + constrainflag = drawableplaneflag = 0; + if ( xp->screenDepth == 1 && !IsFaxImage( image->decode ) ) + { + constrainflag = 1; + if ( ( XIELut = CreatePointLut( xp, p, 1 << image->depth[ 0 ], + 1 << xp->screenDepth, False ) ) == ( XieLut ) NULL ) + { + reps = 0; + } + } + else if ( xp->screenDepth != 1 && IsFaxImage( image->decode ) + && ( ( GeometryParms * ) p->ts )->geoTech == xieValGeomAntialias ) + { + constrainflag = 1; + if ( ( XIELut = CreatePointLut( xp, p, 1 << image->depth[ 0 ], + 1 << xp->screenDepth, False ) ) == ( XieLut ) NULL ) + { + reps = 0; + } + } + else if ( xp->screenDepth != image->depth[ 0 ] ) + { + constrainflag = 1; + if ( ( XIELut = CreatePointLut( xp, p, 1 << image->depth[ 0 ], + 1 << xp->screenDepth, False ) ) == ( XieLut ) NULL ) + { + reps = 0; + } + } + if ( xp->vinfo.depth != 1 && IsFaxImage( image->decode ) + && ( ( GeometryParms * ) p->ts )->geoTech != xieValGeomAntialias ) + drawableplaneflag = 1; + + if ( reps ) + { + if ( IsFaxImage( image->decode ) ) + GetXIEFAXPhotomap( xp, p, 1, False ); + else + XIEPhotomap = GetXIEPhotomap( xp, p, 1 ); + if ( XIEPhotomap == ( XiePhotomap ) NULL ) + { + reps = 0; + } + } + if ( reps ) + { + if ( constrainflag ) + flo_elements = 5; + else + flo_elements = 3; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + + XieFloImportPhotomap(&flograph[idx], XIEPhotomap, False); idx++; + + geo_tech = ( ( GeometryParms * ) p->ts )->geoTech; + + if ( !SetCoefficients( xp, p, 1, (GeometryParms*)p->ts, coeffs ) ) + reps = 0; + } + if ( reps ) + { + XieFloGeometry(&flograph[idx], + idx, + ( ( GeometryParms * ) p->ts )->geoWidth, + ( ( GeometryParms * ) p->ts )->geoHeight, + coeffs, + constant, + band_mask, + geo_tech, + geo_tech_params + ); idx++; + + if ( constrainflag ) + { + XieFloImportLUT(&flograph[idx], XIELut ); + idx++; + + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + idx-1, + &domain, + idx, + 0x7 + ); + idx++; + } + + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); idx++; + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + flo_notify = True; + } + if ( !reps ) + FreeGeometryStuff( xp, p ); + return( reps ); +} + +void DoGeometry(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + } +} + +int InitGeometryFAX(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int band_mask = 1; + int idx = 0; + Bool radiometric; + float coeffs[ 6 ]; + static XieConstant constant = { 0.0, 0.0, 0.0 }; + XieLTriplet width, height, mylevels; + XieGeometryTechnique geo_tech = ( XieGeometryTechnique ) NULL; + char *geo_tech_params = NULL; + XieProcessDomain domain; + char *decode_tech = ( char * ) NULL; + + if ( TechniqueSupported( xp, xieValGeometry, + ( ( GeometryParms * ) p->ts )->geoTech ) == False ) + return 0; + + image = p->finfo.image1; + if ( !image ) + return( 0 ); + + if ( !IsFaxImage( image->decode ) ) + return( 0 ); + + FlushCache(); + G42Ddecode_params = ( XieDecodeG42DParam * ) NULL; + G32Ddecode_params = ( XieDecodeG32DParam * ) NULL; + G31Ddecode_params = ( XieDecodeG31DParam * ) NULL; + TIFFPackBitsdecode_params = ( XieDecodeTIFFPackBitsParam * ) NULL; + TIFF2decode_params = ( XieDecodeTIFF2Param * ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + XIELut = ( XieLut ) NULL; + XIELut2 = ( XieLut ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + constrainflag = drawableplaneflag = 0; + + if ( xp->screenDepth != 1 && ( ( GeometryParms * ) p->ts )->geoTech + == xieValGeomAntialias ) + { + constrainflag = 1; + if ( ( XIELut = CreatePointLut( xp, p, 1 << image->depth[ 0 ], + 256, True ) ) == ( XieLut ) NULL ) + { + reps = 0; + } + if ( ( XIELut2 = CreatePointLut( xp, p, 256, + 1 << xp->screenDepth, False ) ) == ( XieLut ) NULL ) + { + reps = 0; + } + } + + if ( xp->screenDepth != 1 + && ((GeometryParms *) p->ts )->geoTech != xieValGeomAntialias) + drawableplaneflag = 1; + + if ( reps ) + { + if ( !GetImageData( xp, p, 1 ) ) + reps = 0; + else + { + radiometric = (( GeometryParms *) p->ts )->radiometric; + if ( image->decode == xieValDecodeG42D ) + { + G42Ddecode_params = XieTecDecodeG42D( + image->fill_order, + True, + radiometric + ); + decode_tech = ( char * ) G42Ddecode_params; + } + else if ( image->decode == xieValDecodeG32D ) + { + G32Ddecode_params = XieTecDecodeG32D( + image->fill_order, + True, + radiometric + ); + decode_tech = ( char * ) G32Ddecode_params; + } + else if ( image->decode == xieValDecodeG31D ) + { + G31Ddecode_params = XieTecDecodeG31D( + image->fill_order, + True, + radiometric + ); + decode_tech = ( char * ) G31Ddecode_params; + } + else if ( image->decode == xieValDecodeTIFF2 ) + { + TIFF2decode_params = XieTecDecodeTIFF2( + image->fill_order, + True, + radiometric + ); + decode_tech = ( char * ) TIFF2decode_params; + } + else if ( image->decode == xieValDecodeTIFFPackBits ) + { + TIFFPackBitsdecode_params = + XieTecDecodeTIFFPackBits( + image->fill_order, + True + ); + decode_tech = ( char * ) TIFFPackBitsdecode_params; + } + else + { + fprintf(stderr,"Invalid decode\n" ); + reps = 0; + } + if ( decode_tech == ( char * ) NULL ) + { + reps = 0; + } + } + } + if ( reps ) + { + if ( constrainflag ) + flo_elements = 7; + else + flo_elements = 3; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + } + if ( reps ) + { + width[ 0 ] = image->width[ 0 ]; + height[ 0 ] = image->height[ 0 ]; + mylevels[ 0 ] = image->levels[ 0 ]; + + XieFloImportClientPhoto(&flograph[idx], + image->bandclass, + width, height, mylevels, + False, + image->decode, decode_tech + ); + idx++; + + geo_tech = ( ( GeometryParms * ) p->ts )->geoTech; + + if ( !SetCoefficients( xp, p, 1, (GeometryParms*)p->ts, coeffs ) ) + reps = 0; + } + + if ( reps ) + { + if ( constrainflag ) + { + XieFloImportLUT(&flograph[idx], XIELut ); + idx++; + + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + idx-1, + &domain, + idx, + 0x7 + ); + idx++; + } + + XieFloGeometry(&flograph[idx], + idx, + ( ( GeometryParms * ) p->ts )->geoWidth, + ( ( GeometryParms * ) p->ts )->geoHeight, + coeffs, + constant, + band_mask, + geo_tech, + geo_tech_params + ); idx++; + + if ( constrainflag ) + { + XieFloImportLUT(&flograph[idx], XIELut2 ); + idx++; + + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + idx-1, + &domain, + idx, + 0x7 + ); + idx++; + } + + if ( drawableplaneflag ) { + XieFloExportDrawablePlane(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->bggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); idx++; + } + else { + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->bggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); idx++; + } + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + flo_notify = True; + size = image->fsize; + } + if ( !reps ) + FreeGeometryFAXStuff( xp, p ); + return( reps ); +} + +void DoGeometryFAX(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo(xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + PumpTheClientData( xp, p, flo, 0, 1, image->data, size, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + } +} + +int +SetCoefficients( xp, p, which, gp, coeffs ) +XParms xp; +Parms p; +int which; +GeometryParms *gp; +float coeffs[]; +{ + double sf, rad; + XIEimage *image; + int type; + + switch( which ) + { + case 1: + image = p->finfo.image1; + break; + case 2: + image = p->finfo.image2; + break; + case 3: + image = p->finfo.image3; + break; + case 4: + image = p->finfo.image4; + break; + default: + image = ( XIEimage * ) NULL; + return( 0 ); + } + type = gp->geoType; + if ( !image || !gp ) + { + fprintf( stderr, + "SetCoefficients: invalid image or test parameters\n" ); + return ( 0 ); + } + + switch( type ) + { + case GEO_TYPE_CROP: + coeffs[ 0 ] = 1; + coeffs[ 1 ] = 0; + coeffs[ 2 ] = 0; + coeffs[ 3 ] = 1; + coeffs[ 4 ] = gp->geoXOffset; + coeffs[ 5 ] = gp->geoYOffset; + break; + case GEO_TYPE_SCALE: + coeffs[ 0 ] = image->width[ 0 ] / ( float )gp->geoWidth; + coeffs[ 1 ] = 0; + coeffs[ 2 ] = 0; + coeffs[ 3 ] = image->height[ 0 ] / ( float )gp->geoHeight; + coeffs[ 4 ] = 0; + coeffs[ 5 ] = 0; + break; + case GEO_TYPE_SCALEDROTATE: + rad = M_PI * gp->geoAngle / 180.0; + sf = ( image->width[ 0 ] / ( float )gp->geoWidth ); + coeffs[ 0 ] = sf * cos( rad ); + coeffs[ 1 ] = sf * sin( rad ); + coeffs[ 2 ] = -sf * sin( rad ); + coeffs[ 3 ] = sf * cos( rad ); + coeffs[ 4 ] = image->width[ 0 ] / 2.0 - sf/2 * (cos(rad)*gp->geoWidth + sin(rad) * gp->geoHeight); + coeffs[ 5 ] = image->height[ 0 ] / 2.0 - sf/2 * (-sin(rad)*gp->geoWidth + cos(rad) * gp->geoHeight); + break; + case GEO_TYPE_MIRRORX: + coeffs[ 0 ] = -1; + coeffs[ 1 ] = 0; + coeffs[ 2 ] = 0; + coeffs[ 3 ] = 1; + coeffs[ 4 ] = gp->geoWidth - 1; + coeffs[ 5 ] = 0; + break; + case GEO_TYPE_MIRRORY: + coeffs[ 0 ] = 1; + coeffs[ 1 ] = 0; + coeffs[ 2 ] = 0; + coeffs[ 3 ] = -1; + coeffs[ 4 ] = 0; + coeffs[ 5 ] = gp->geoHeight - 1; + break; + case GEO_TYPE_MIRRORXY: + coeffs[ 0 ] = -1; + coeffs[ 1 ] = 0; + coeffs[ 2 ] = 0; + coeffs[ 3 ] = -1; + coeffs[ 4 ] = gp->geoWidth - 1; + coeffs[ 5 ] = gp->geoHeight - 1; + break; + case GEO_TYPE_ROTATE: + rad = M_PI * gp->geoAngle / 180.0; + coeffs[ 0 ] = cos( rad ); + coeffs[ 1 ] = sin( rad ); + coeffs[ 2 ] = -sin( rad ); + coeffs[ 3 ] = cos( rad ); + coeffs[ 4 ] = gp->geoWidth/2.0 - 0.5 * ( cos( rad ) * image->width[ 0 ] + sin( rad ) * image->height[ 0 ] ); + coeffs[ 5 ] = gp->geoHeight/2.0 - 0.5 * ( -sin( rad ) * image->width[ 0 ] + cos( rad ) * image->height[ 0 ] ); + break; + case GEO_TYPE_DEFAULT: + default: + coeffs[ 0 ] = 1; + coeffs[ 1 ] = 0; + coeffs[ 2 ] = 0; + coeffs[ 3 ] = 1; + coeffs[ 4 ] = 0; + coeffs[ 5 ] = 0; + break; + } + return( 1 ); +} + +int EndGeometry(xp, p) +XParms xp; +Parms p; +{ + FreeGeometryStuff( xp, p ); +} + +int +FreeGeometryStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + + if ( XIEPhotomap && !IsPhotomapInCache( XIEPhotomap ) ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} + +int +EndGeometryFAX(xp, p) +XParms xp; +Parms p; +{ + FreeGeometryFAXStuff( xp, p ); +} + +int +FreeGeometryFAXStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + + if ( XIELut2 ) + { + XieDestroyLUT( xp->d, XIELut2 ); + XIELut2 = ( XieLut ) NULL; + } + + if ( XIEPhotomap ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + + if ( G42Ddecode_params ) + { + XFree( G42Ddecode_params ); + G42Ddecode_params = ( XieDecodeG42DParam * ) NULL; + } + else if ( G32Ddecode_params ) + { + XFree( G32Ddecode_params ); + G32Ddecode_params = ( XieDecodeG32DParam * ) NULL; + } + else if ( G31Ddecode_params ) + { + XFree( G31Ddecode_params ); + G31Ddecode_params = ( XieDecodeG31DParam * ) NULL; + } + else if ( TIFF2decode_params ) + { + XFree( TIFF2decode_params ); + TIFF2decode_params = ( XieDecodeTIFF2Param * ) NULL; + } + else if ( TIFFPackBitsdecode_params ) + { + XFree( TIFFPackBitsdecode_params ); + TIFFPackBitsdecode_params = + ( XieDecodeTIFFPackBitsParam * ) NULL; + } +} + diff --git a/xie/xc/programs/xieperf/getnext.c b/xie/xc/programs/xieperf/getnext.c new file mode 100644 index 0000000..32b3ab3 --- /dev/null +++ b/xie/xc/programs/xieperf/getnext.c @@ -0,0 +1,213 @@ +/* $XConsortium: getnext.c,v 1.7 94/04/17 20:39:21 rws Exp $ */ + +/**** module getnext.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + getnext.c -- Get a line from stream, and parse for command to run + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include +#include +#include + +#define MAXARGS 5 + +int +GetNextTest( fp, repeat, reps ) +FILE *fp; +int *repeat; +int *reps; +{ + int i, j, len, max, start; + char line[ 256 ]; + char *args[ MAXARGS ]; + +otravez: /* Spanish for 'once again'. */ + *repeat = -1; + *reps = -1; + line[ 0 ] = '\0'; + fprintf( stderr, "> " ); + fflush( stderr ); + fgets( line, sizeof( line ) - 1, fp ); + if ( feof( fp ) ) + return( -1 ); + len = strlen( line ) - 1; + line[ len ] = '\0'; + for ( i = 0; i <= len; i++ ) + { + if ( line[ i ] == '#' ) + { + line[ i ] = '\0'; + break; + } + } + + if ( ( len = strlen( line ) ) == 0 ) + goto otravez; + + if ( fp != stdin ) + printf( "%s\n", line ); + + if ( line[ 0 ] == '?' ) + { + fprintf( stderr, "Enter command, with optional reps and repeat args\n" ); + fprintf( stderr, "\nExample: point1 -repeat 1 -reps 1\n" ); + fprintf( stderr, "Example: converttoindex -reps 3\n" ); + fprintf( stderr, "\nUse ^D to exit xieperf\n" ); + fflush( stderr ); + goto otravez; + } + + /* grab up to MAXARGS */ + + max = 0; + for ( i = 0; i < MAXARGS; i++ ) + args[ i ] = ( char * ) NULL; + + args[ 0 ] = line; + + /* get rid of leading spaces */ + + i = 0; + while ( i < len && isspace( line[ i ] ) ) i++; + start = i; + args[ 0 ] = &line[ start ]; + if ( args[ 0 ] == ( char * ) NULL ) + goto otravez; + else if ( strlen( args[ 0 ] ) == 0 ) + goto otravez; + + for ( i = 1, j = start; j < len && i < MAXARGS; i++ ) + { + while ( j < len && !isspace( line[ j ] ) ) j++; + if ( j != len ) + { + line[ j ] = '\0'; j++; + while ( j < len && isspace( line[ j ] ) ) j++; + if ( j != len ) + { + args[ i ] = &line[ j ]; + max = i; + j++; + } + } + } + + i = 1; + while ( i <= max ) + { + if ( !strcmp( args[ i ], "-repeat" ) ) + { + i++; + if ( i > max ) + { + fprintf( stderr, "Improperly formed repeat argument: skipping line\n" ); + return( -1 ); + } + else + { + *repeat = atoi( args[ i ] ); + i++; + } + } + else if ( !strcmp( args[ i ], "-reps" ) ) + { + i++; + if ( i > max ) + { + fprintf( stderr, "Improperly formed reps argument: skipping line\n" ); + return( -1 ); + } + else + { + *reps = atoi( args[ i ] ); + i++; + } + } + else + { + fprintf( stderr, "Unrecognized input: skipping line\n" ); + return( -1 ); + } + } + return( TestIndex( args[ 0 ] ) ); +} + +#ifdef STANDALONE_TEST +main() +{ + int reps; + int repeat; + int retval; + FILE *fp; + + fp = stdin; + while ( ( retval = GetNextTest( fp, &repeat, &reps ) ) >= 0 ); +} +#endif diff --git a/xie/xc/programs/xieperf/images/image.001 b/xie/xc/programs/xieperf/images/image.001 new file mode 100644 index 0000000..b6214f5 --- /dev/null +++ b/xie/xc/programs/xieperf/images/image.001 @@ -0,0 +1 @@ +–m`hkklmjjkkjlmnllnpoomnnoqqopqqqsqrqptrqqtttttuwtttwwxxwvvvvwwwwywwwxxxwxwxx{{zyzzzy{||{|~}}}~~~���€�~~~�€������‚ƒ‚��‚‚‚‚„„ƒƒ„„……………„„…†„„…†††‡‡†††…†ˆˆ††…‡‡‡†ˆ‰Š‰‰ˆ‡ˆŠŒ‹ŠŠ‹‹‹‹‰ˆ‹‹‹Œ‹ŠŒŽ��Ž�Ž���ŽŽ�������‘���‘�’’’’“’“’’‘‘‘“’�‘’“••‘‘‘““’‘’’”““‘“”———•””””’‘“•““”–”“��’““–•“‘•–—•””•––—˜™›�™—•––˜—––™——˜š™™˜™™™š››ššš›š›œœšš™œœž��š››œ››œ�›œ��œ���ŸŸŸ�žœ�žŸžŸžŸž   ŸŸŸ¡¡      ŸŸŸ¡ŸŸžŸžŸ   ¡žŸžŸ  ŸŸž¡¢  ¡¢ŸŸ   £  Ÿ¡Ÿ  ¢¡¡¡Ÿ�ž¡¢   ¡¢¡¡  Ÿ¢££   ¢¡¡¢¡ž   ¢¤¢ŸŸŸ ¡¡ ŸžžŸ¡ŸŸŸ     ���¡¡    Ÿ     žŸž ¡¢ ¡¡¡ ¡¡Ÿ��£¾ëýýúøöñœuelmmmnmooppppppqrttrqqquvvvvwwwxyxxwyyywyyyy{zzyyzzyyz|{y{{{|}}}}}}€|z~€��€�€‚‚‚�‚ƒ…���ƒƒƒ„„…†…„ƒ„……††………†‡‡‡†‡†‰ˆ‡‡ˆ‡†‡‰ŠŠŠ‰‰‰‰ˆˆ‰ŠŠŠŠ‹‹ŒŒ‹‹�Œ‹ŒŽŒ‹ŠŠ‹Œ�����Ž�‹����“‘ŽŽ����ŽŽ��ŽŽ’””“’’“”””““‘““””““––•”•–˜˜˜•”•˜˜–•”––˜—˜˜—•——˜—˜˜˜——–—–—š�š˜™šš˜™—˜—ššš˜™™˜˜™™—˜š˜—˜™›œ��›˜™œ�›��ž���ŸžŸ ¡ žœ�žŸ Ÿ›™�Ÿ¡ ��¡££¡¡ ¡  Ÿ¡¢£  ¡¡¢££¤¥¤£¡ ¡¤¢¢¢¥£¡ ¢¤¦¤¤¡¡¢¤¥¥¥¦¥£¤¤¤¤¥¥¥¥¦¦¦¦¨¦¦¦§¥¥¥¥¤¤¥¥¥¤¦¦¦¥¥¥§¦§¦¤¤¦¦¦¦§¥¦¦¦¦§¨§¤£¤¦¥¢££¥¥¥¥§¦§¦¦¦§¦¥¤¤¦§¥£¥¤£¥¨§¤¤¦¨«¨¥¤¥¤¤¥§§¨¦¦¦¦¥¦¦¤£¢¢¦¨£¤¤¤¤¤£¦¦¦¤¤¡¡¢¥¤¤¤¥£¡¡¤¥¤¨Áïÿÿÿþûõœsdkmlmnnmmlnoopqopppopnnorrttrrttrrrtsuvvvwvvvwwxwwwwwwvvvy{{zzzzxxzz{{{y{||zzz}}}~~}~~~€��€€~€�€�‚�‚‚�‚„ƒ‚‚‚‚ƒƒ‚ƒ‚ƒ…†‚‚ƒ†………††……„„†‡‡‡††‡ˆˆ‰‰‰‰‰‡ŠŠŠˆˆ‰ˆ‡‰‹Š‰‰‰‰ŠŒ‹ˆ‰Š‹‹�‹ŠŒ���‹‹‹Ž‘“�ŽŽ�‘�ŽŽŽŽ�‘’‘‘��Ž�’’‘‘’“�‘‘““”•–“‘’“““•”””“’”—–“••••””••—–””•””–˜˜–•“”’’’––•——”–—™˜˜——˜š˜˜™™™œ›™š™š™››œ˜—˜š—š››š™——›žœ�����žžŸžž�ž���Ÿžœœž����››œ  žžŸ¡ ž››ž Ÿ   ŸŸž¡¢   Ÿ ¡££¡ŸŸŸ £¡¡¡£¢££¢ ¡¡£¢   Ÿ¡£¢  ¡¢¢¢£¢Ÿ� £¢ £¢  ¢¢¤¤£¡  ¡£¤¤¢¢¡¢¢££¢¡£¢¢   ¡¡¡¡¡¡¢  ¡¢¢¡¢¢¡Ÿ¢¡¢¡ Ÿ¢¢£¢¢¤£Ÿ ¢¢ ¡ŸŸ¡¢¢¢¢  Ÿ  £¡Ÿ�ŸŸ Ÿ ŸŸŸ ŸžŸ¥¼êÿÿøøøò�uflonnorqpppqsqqqrtutsssuuuvxwwwxvvuxxxwxxxxyzzxxy||zzz|||{||}}}|}{|}}}€~€‚~‚‚€‚��€‚‚‚�‚�‚‚ƒ„……†……„„„ƒ„„……‡………†‡‹‰‡…†‡‡†‡‰ŠˆˆˆˆŠ‹‹ˆ‰‹ŒŠŠŠŒ�Ž‹‹ŠŽŽ��ŒŒ���ŽŽ��Ž���������������‘�‘‘‘‘““’““’’”“‘�‘”–“’“•“•”“•——™—•••–™™˜™—––™˜˜———™™˜—˜˜˜˜™™šš˜——˜˜——˜™™šœœ›™šš›š™—š™™˜™™™›œ›™›��››œ�›››��ŸŸ ŸŸŸ¡Ÿ��  Ÿž�ž¡£¡Ÿ���ž ¡¡¡ŸŸ¡¥¢¡Ÿ¢£¤¤¤££££¤¤¤£¢ ¡¢¤£££¥¤¤¤¤  ¤¨¦£££¤¤¥£¢¢¥§¦¥¤¤§¦¦¦¦¦¦¤¦§§§§¦§¦¦¨©§¥¥¥§¨©§¨¨¨¦¨¦¥¤¥§ª¨¦¥¥¥¦§¨¨§¦¦¦¥¦¦¨ª¨¦¦¤¥¦¨§¨§¨¨©¨©¨§¦¦¨§¦§©§§¦§§¨¦¦¥¥¥¥¤¦¦¦¤¦¦¦©©§§§§¦¥¥¦¨¥¤¥¨§¨©©¦¦¥¦¤¤¤¤¦¨¨¦¤¤§©©¨¾îÿÿÿþüõ›qbjnmklkllmmoopqpnooppppppqrrsttrsrtttuvvutuuuuwwxzyxwxwvwz{{{|zyyzyz|}|zz{}||{{|~}|~~~|~�~}€€~‚‚€�€�€�ƒ„ƒ�‚„‡ƒ€�ƒ„„‚„„……„…†……„…†ˆˆˆˆ†††‰‰ˆ‡‰ˆ‰‰ŠŠŠˆ‰‰ŠˆˆŠ�‹ŠŠŠŠŠŒ�ŒŠŠŠ‹‹ŒŒ������ŽŽŽ��Ž�Ž������‘“‘‘‘‘‘“’‘�‘’”““”––••••“””’’”•–•””””–––•”“••••••••–———˜˜–—–—––––”–˜›—””–˜™———˜˜˜š™™™™šœ™š™™›ž�œšœœœ›���š›œœœ�Ÿ��žž�žž   Ÿ¡žžž¡ŸžŸ  ŸŸžŸŸž ¢ŸžŸ¤£¢ŸŸž  ¢¡Ÿ�žŸ ¡¡¡¡¡¢¢¡¡Ÿžž¡¢£¡¡¡¡¡¤¥£  ¢£¡£¡žžž¡¢¢¤¥££££   ¢¡££¡Ÿ ¡¢££¤£  £¤¥££¢¥¤¢¢££¢¡¢¢¡ŸŸŸ¢¡ ¢¥§¥¡¡¤£¤¥¤¡¡ ¡£¤¡££££¤¢¢£¥£¤££¢£¢ Ÿ ¢££ ¢££ ¢¢¢ ¡ŸŸŸ ŸŸŸ¡¢¢¦»äüÿýüúö¡wgopompssqtsrrttutsstutuuutwxxwxwvvwvxyzzzxyz~}z{|}|||}|}}~}}|~~~~€�~�€‚�€�„ƒƒ‚‚ƒ„ƒƒ„…„†…„„„„……††„…‡‡……†ˆ„…†ˆ‰‰ˆˆˆˆ‰‰ˆ‰‰‰ˆ‡ˆˆ‰‹‹‰‰ˆŠ‹�Œ‹‹��ŽŒŒ�Ž����������Ž�‘‘‘‘“’‘����‘‘���’“””“‘‘’’“••“’’•–“‘–•’�“—˜——•–˜˜–•—™›ššš››™˜�œ˜˜šššš›š—šœ›šš›œ›™˜šœ�œœœ�››��œœšœ›ššš™š™š��œ›œœœ›�œ�žžžŸ ¡ŸŸŸ¡¡ Ÿ ¡¡¡£¡  ¡  ¢¤¤¡£¡¡¢£¢£¡¢¢£¦§¤¥¥¦¦¤¤¤¥¥¥¦¥¤§¦¤£¤£¤¤¦¥¥¥¥¤¤¤¥¥¦¤¤§¥¦¨§¤¤¥¥¥§¦§¦¦¨©¦¦¥§©¨§©ªª¨§§¦§¨¨¦©©ª©ª©©©«©¨¨ª««¨¨¨©¨¦¨©«ª¨¦¨ª¬«ª¦¦§ª¨¨¨ª©©©¨§¨©©§¨§¥§©ª©©©ª¨¦¥©ª©§©¨¨©ªª§§¥¤¦§§§¨¨¥¦¦§¦¦¦¨§¥¥©§¦§§££¥§¨©¦££¦¦¤§©«½êÿÿÿÿýøœtdhlkllmmoppnpopppoppqsrrrrrsttssquuvuuuwuvvvxywxxxxyyzywxyyyzz{zz{}}}}}zz|~}|{{}}}||}~‚‚�€}€€�~€‚ƒ����€‚‚‚‚ƒƒƒ‚„„……„„…†‡…„ƒ……†‡‡‡ˆ‰‰‰ˆ‡‡‰‰ˆˆŠ‰‰Š‹‰‰‹ŒŒŒŠŒŽ�Œ‹ŠŽ�Œ‹Š‹ŒŽŽ��ŒŒ��ŽŒŒŽ����������‘‘��‘‘���‘‘‘’”’••“‘“””“––•”””””••–—––•–•••—––•––––™˜–––˜—––™——–˜š™•–••––•—šš––•—™ššš›š›››˜™™›œŸœœ›šš›š�������››œœœœž�žŸ žžŸ¢Ÿ��ŸŸžŸ žžžžŸŸ ¢¢ ¡¡¢ ¡  Ÿ¡ ¡¡ Ÿ¡ ¡  ¡¡¢¥¤¢££££¦¦¤¡¡£¦¦¦¤££¤¥¤££££¢¢¤¤¢ ¡¤¨¦¥£¢¡¥¦¦¤¤ £¦§¥£¢£¤¤¦¥¤£¤¥¥¤¤£££¤¤¤¤¥¤¤¢££¦¦¤¢ ¢¤¥¤££¤¤£¢£¤¤£¤¢£¤¤£¤¢  ¢¢¤¦¦¤¤¤¢¢¢£¢¡¢¥£¢¢¢¡¢¢¢ ¡ ¡¢¡  Ÿ ¡¢£¥¸ãÿÿþûùô zimrpppqqttsruwutstvwwvwxwuuvwyxxyyxy{zyz{|||}|{|||€€~~|~~~~~~�}ƒ‚���‚„�€�ƒƒƒ‚��ƒ„†ƒƒƒ†……ƒƒ„…ƒƒ††…„„†ˆ‡†…‡†††ˆ‡ˆ‡†…ˆˆ‡ˆˆˆ‰Š‹‹‹‹ŠŠ‹ŽŒŒŽ�‹ŒŒŒŒŒŒ�Ž���ŽŽ�����‘’�‘�‘‘’’’‘‘�‘�‘‘‘‘‘‘‘’”””’‘’“•••““�‘•–”•——“’”™šš™——šš—–—ššššš˜™™™šœš˜™œœžœš››œœœ›š›�››™›œžž�œœœ�›››����œš™™›œ›�œš›��žžž�ž�œœžŸ ŸŸŸ¡  ¢£££¡¢£££¡£¤¥¢£¡££££¤£££¦¦¦¥¤£¥§¦¨§¤¢¢£§¥¥¤¦§¨¦¦£¤¤¦¦¦¦¦¥¥¦¨©¨§¥§§¨ª©¦¨ª«ª«©§¦§¨ª¨¨¨¨¨ª¬«ªª¨¨ªª¨¦¨¨ªªªªª©©©«ª¨¨©ª©¨©©©ªªª¨ªªªª¬ªªªª©ª§§¨«ª©§¦§©ªªª©ªªªª«ª©¨©©©©©§§¨«¨§§¨ª««©§¦¨¨¨¨ªª©§¨¨©©ª¨§§¨¨¨ª«©¦¤¢¦¨©¨ª©¥¥§¦¦¨¼ãÿÿÿÿýøžxejkmnooponnqqpppoqssssstssuuuuusssuuwwxwvvyyxxxyyxxzzzzyx||{z|}||~|||~~}|~}|||}}€�~€�~~�€€‚ƒ�€‚‚‚‚‚„ƒ��„„„ƒƒƒ……„ƒ„„†ˆ‰…„…‡‡ˆˆ‡††ˆ‰‰‰‰‰ŒŒŠˆ‰Š‹‹‹‹‹‹�‹Š‰ŠŒŒ‹ŠŠŒ�‹Œ�ŽŒ�����������Ž���ŽŽŽŒˆŠ��“‘‘‘‘�‘’“““’““”““•—–••••““”–”•–––———•••—•——–“’“•–––––—˜—••—–—™—•–———˜—––™šš——˜™™˜™š›šš››š�š™šŸžœœŸŸœ›œ��œ�Ÿžžœ����¢¢žœž¡¢¡¡Ÿ�œ¡¡¡ ŸŸ ¡ž ¡  ¡¡¡¡¢ ¡ ¡££¡¤¢¡¢£¢   ¡¢¥¥£¤¤£¤££¡¡ ¢£¥¤¤£££¦§¦¤££¤£¡¡¢¢¢¤¤¥¥¥¢¡¢¥£££££¦§¨¥£¤¦§§¤£¤¦¦¦§¥¥¥¤¢££¤¥¦¤¤¦¦¤¥¦¥£¢¢¤§¥¥¥¥¢¡¡¢¡¡¤¥¤¦¦¥¢¢¢¤¤¤£££¤¤¤£££¤£¡¢£¤¤£¢£££¢¡Ÿ¢£¤¤£¡ ¡¡  ¥¶Üúÿúøöó¢{hoqqprsttsrruvvuxvutuuvxxxzyxxxwxxzz{zyz||{||}~~|€�€~}}�‚‚€ƒƒ€�ƒƒ€�‚ƒ���€‚…ƒ‚ƒ†…ƒ‚ƒƒ„„ƒ„††……………†††…‡‡‡††‡ˆ‡‡‡ˆˆ‰ŠŠ‰ŠŠŠ‹‹‰ˆ‰‹ŒŠ‹ŠŒŒ‹‹ŒŒŽŽŒŠŒ�ŽŽŽ���Ž����‘��Ž�Ž����’��’���‘’’“”’‘‘“““•—–”””“””–——–˜˜—–˜™œ�™—˜š›�›š˜™™›�ž›™™œš˜˜›œœœœš™šœž�œ™™š��žžžžžž ž››žœ›œœ›››››š›œœš››ŸŸž���žž ŸœœŸ¡ ŸŸžŸ¢£¡¡¢£¢  Ÿ  ¢£¤¤£¢£¤¥¥¦¥££¥¦¤£¢£¦©©§¥¤¥¨©ª¨¦¥¨ª©§§§¦¨©¦§§¦¨©ª¨¦£¥§©©©§¨¨¨¨ª©§¦¨¨¨¬¬ª¨ªªªªªªª©¨§ªª©¨«¬¬ª©¨©ªª««ª¨©©ª«©©ª©ª©ª©«««©ª«ª©ª««©©««ªª©ª«ªªª©¨ª««««¨©ª«©©©©©©©«¨¦¨©©¨ª¬«¨ªª««ª¥¦§ªªªªª¨¨¨¨¨¨§©©¨¦¦¨©ª¨¦¥¥¥§§ª»áÿÿÿÿþø weimkmopoonppoqsqqqsutqprtstvtuttsttvtvwxxwwyzzxxxyyz|z|||~~zz{}{z|€~||}{|~}|}||}~}}|}~������€€���‚‚‚ƒƒƒƒ‚ƒƒƒ�‚‚ƒƒ…„……†††………††‡‡……††…†††…‡‡ˆ‰‰ˆˆˆˆˆŠŠŠŠŠŠŠŠ‰‰Š�‹‹��ŒŒŠŒŒŽŽ�‘�����‘“�Ž�•’�ŽŽ���Ž��“““’’�‘‘’“••”“••••”””–——–•”––—––•–—˜———™—––—˜˜––———™›™™™™˜˜—••š˜–”––••—˜—””•——–™™™™——››™—››�œ›šš›ž�œž¡Ÿœœœœœž�››žžŸŸ Ÿ  ¡¢¢   ¡ ¡¡ ¡¡ Ÿ ¡£¢ Ÿ¡ Ÿž¢¤¤£¤¢£¢¢¡¡¡£¤¢¢¢¢¢¤£¢££ ££¤¢££¤£¢¢££¤¥¥¦¦¥¤££££¤¥¥£¤£££¦¥¥¤¤¤¥¥¥¤¤¥¥£££¥¦§¦¤¥¥¥§©¨¨¤¢¡¥¥¦¤¤¤£¡¤¦¥¤£££¥¥¦¤£¢¥§§¢£££¢£¤¦¥¤¢£¤¦¥¤¥¥§¥££¤¤¤¤¦¤£¢£¢¢¢£££¤¤¤¤¡¢¢¡¡Ÿ  ¡£´Ùúÿýúøñ¡xfkopqqrssttsqsuwvvuvuutwxxxxxxyyxyyyzzz{{{}}~}}||{~~|}~~€}€‚‚‚„���‚�‚ƒ‚‚ƒ‚‚„„ƒ„ƒƒƒƒ…†††††‡‡‡†‡‡‡‡ŠŠˆ‰‡…‡ˆ‰‰‰ŠŒ�‹ŠŠ��‹ˆŠŠŠ‹ŒŒŒŒŒŒŒ‹‹ŒŽŽŽ���Ž��Ž���‘�����Ž��‘‘���’’““‘‘’“”•’‘‘•––”““•–•“““––••••———––˜˜˜šš—›š™™šš�›››œ››œžž��œœœ›™œœ›œŸ�›™œ��›žžž��œ�ŸŸ�œ��›š�žœ™š™šš��œš››œš›œ�ŸŸžŸŸ¡¤ žŸ   ¡¤£¢¢¢¡¤¢¢¡£¢¢¢££¥¥¥¥¥¥¦¥¥¨¨¦££¦¨¦¥¤¥¥¦¤¤¦§¦§¨¥£¤¦¦§¨¨¦¦¦§¦¨¦¦¦¨¦¥§ªª¨©©§¨¨¨¨¨©ª«ª©§¦§«ª©¨©¨¨¨¨§¨©©§§§©©§©«¬«««©§ª««©ª§©«­ª©©©ªª¬­¬©¨¨ªªª©«©©©ªª«ªªª¬««ª«¨©«ª©ªª©©©©¨©©ªª©§¨©ª¨¨ª­«©¨¦¥§©ªª©©¨¨¨¨©¨§§§ª§¥¥¨§¤¤¦¦¥¦¶Þÿÿÿÿÿù xdjmnlnoonpppppprsrrrtttttsvtsuwwvuutvwyyywxy{zyxx{{yxzzzzzy{{}||{||}~~€€}}€�€~��€�‚�ƒ€‚‚‚‚ƒ‚ƒƒƒƒƒƒ‚……„„…„„„ƒƒ……†††…†††‡‰ˆ‡‡‡‡‡ˆ‰‡„„†‡‡Œ‹Š‰ŠŠ‹Šˆˆ‹‹ŒŒŠ‹‹ŠŠŠ‰Œ�Ž��ŒŽ�Ž�ŽŽŽ����‘‘‘‘���’’�‘��‘“““’’“•“‘�”•–”“““•””••”•–––˜—––˜˜˜———™™˜———š™——————•—™™—˜—˜˜™—˜–—˜š˜——™™––––”–—˜———™™››š™™˜šœ��›˜™›��ŸŸœŸ ž�žŸ £ �žž  ¡¡¡¡¢¡ŸžžŸ¡ŸŸ ¡ ¡£¢¡¡¢¡£¢¡¡£¢¡¡¢¢¢¡¢£¤¤¢ ¡¢¢¡ ¡¡£££¢£¢¢££¡£¢¤¦¥£¤¤¤¤¥¥¤¥§¦¤¤¥¥¢¤¤¦¥¤¢££¥¤¤¤¥¤¤¥¦¥¥¤¤¤£¥¦§¦¦¤¤¤¥¥¨§¦£££¥¦¨¦¥£¢¢¥¦¥¤¤¦¦¦¦¦¤¤£¡¡¥¥¤¤¦¥¤£¤¤¥¤¢£¤¥£¥¤¤¥¦£¡¤¥¢¢£¥¥¨¦£¡£¤¤£¤¤£££¤¡ Ÿ¢£¦²Öõÿýùöõ¢zehnqrrrtuuttuuxxxvvvyyxyzyyxyzyyyzz{|||}}}|}}~}}~€}||��€ƒƒ���ƒƒ‚‚…„‚�„„……„ƒƒ‚„„„‡‡…………††‡‡ˆ…„…ˆˆˆˆŠ‰‰ˆ‰ˆ‡‡‡‡ŠŠˆ‰‰ŠŠ‹Šˆ‰ŒŒ�ŒŒŒŒ‹�ŒŒŒŒ��ŽŽ��Ž���Ž��‘‘�ŽŽ�Ž���Ž��’““‘‘’““’“““��“–“’“–•••–•––––—––˜™——˜™™˜˜˜š™™š›—™œœ˜˜˜œœ›œœ››œœœœžžŸ�››œ›œ� Ÿœš››žžœ�œœžž�œœ��ž›šš���›œ›œ››š›œžœœ››ž  žŸ¡£¡¡¡¡ ¡¢¥¢¡¡£££¤¤¢¡¡¤¦¦¥¥¥¦§§¥¤¥£¤¤¥¥¦¦¨§§§¨§§§§§§§¥¦§©¨§¦¥¥¨©©§¦¥§¨©¨§¦©«ªªª¨¨¨¨«ªªªªªªª¬««ªªª«ªª««©¬­¬©©ª¬ª¦§©©¨¨¨¨¨ªª««¬¬«©©«­««ª¨¨««©ªªªª¬ª¨§¨ª¬©§¨«ªª©ªªª¬­©ª¬¬ª¨ªª©¨ª©ªª©§§¨¨¨ª¨¨¨¨¬¯­«§¦¨ªª«­ªªª¬ªªªª¨¨§¨©ª©¨¨©¨§¨«·Øÿÿÿþûù£|ddloonpppppprrrrrqqstttwuutvvwvwwxxvvxyxxxyzyyzyxy}~|xz|}z{|~€~{|}~~~}~€€€‚‚€‚ƒ€�€‚ƒƒ‚‚�‚„„‚‚‚‚‚‚‚�‚ƒ„„‚ƒ…ƒƒ„‡…„„…………†††‡ŠŠˆ‡‡ˆ‰‰ˆˆˆˆˆ‰Š‰‡ˆˆ‰‰ŠŠŒŒ‹‹‹ŒŒŒŒŒŠŠ��ŒŒ��ŽŽ�Ž�ŽŽŽŽŽ�’’‘��‘’’‘‘‘““’‘“”“‘’“”’’“””—–”””–—•••”•–˜——•—š›˜˜˜˜–——˜˜˜˜———˜––—ššš™™–•–˜˜™™™————•––•–••”•••”••—–—˜›˜˜™œžžœœœ�žžž Ÿœ�ŸŸžžžŸŸ ŸŸŸ¡¢¢  £¢    ŸŸŸ¡¡ ¡¡¢¤¤¢£   ¢¡¡¡¢£¤¤¢¡¡¡¢££¢¢£¡ ¢¥¤££¥¤¤¤¤¢¢¡££¥¤¤¦¦¦¨§¤¤££¤§¦¦¥§§©¨¦¤¥¥¦¦¦¥¥¤¥¦§¥¤££¦¨¦¥¥¥¨§¦¤¥¥§¤¤¦¨§¥£¤¤¤¦¦¤£¥¥¦¥¦¦¥¤¤¥§¥¥¥¥£££¦¦¥¥¤¤£¥¥¥¥¥¤¥¤¥¦¥¢£¤¦¥¦¤¤¥¥£¤¦¥£££¤£¢¤¥¤¤¤£¢¡¤¤¤£¯Ëôÿûøøô¤ijnrrrrstvuvtvwwvwwwvyzxwxxwwx{zxz{z|}~{{z|}~}}}}~~~€~}~€}{‚‚�‚‚‚‚‚‚ƒ‚ƒ„†……„„…†…„„††„ƒƒ††ˆˆˆ†ˆ‰Š‡†‡Šˆ†…†‡‰ˆˆˆˆ‰‰‰‰ˆˆ‹Š‰ˆ‹Œ�Ž�ŒŒŒŒŒŒ‹ŠŠŒŽ�ŒŒŒŒ�ŒŽ��Ž��Ž�’‘��’‘����‘““‘��‘’‘’““‘””•””””“”””–•”•––————š™˜—š˜˜˜—–—˜™™š™™˜™™›�œšš›››œœ™™œžœž�žžžœ›˜›œžžœ›œœ�ŸŸŸž�›œœœœœšš˜—–—™›š˜—™ššš�žžŸŸŸ¡¢Ÿž £ŸŸ¡¥££¡¢£¥¥£¢£¥¥¥¥¦¥¥§©§¥¦¦¤¦¦§§¦¤¥§¨§¨§¦¥¦¨¨¤¥¦¦§¨ª¨§¥¦¦¨¨§§¨¨§¦¦¥§§¨¨§¨¨§§©«ª§¨ªªª®­­««ª«©©©«¬««¬®®¬«««ªª¬ª««­¬«¨©ª­¬«ªªªªªªªª«ªª««««ªª©ª«ª¨©¨©©­ª©©«©¦¦©ª¨¨©©ªª©«©©ªª¨««ª©­«ªªªªªªª«««ªªª¬¬¬«¬««©ª«¬ª©§§¥§¨¨¥¥¦§§§©µÕúÿÿÿýú¢~bcjokloqomnqsssqqqrrrrttsrtuuuuuvvvvvwwxxxxyz{{{yxy{{|zzz|||}}||}€‚€~}~€���ƒƒƒƒƒƒƒ‚��‚„‚‚„ƒ�ƒƒƒƒ„……ƒ†…ƒ�‚…‡†††……†‡ˆˆ†ˆ‰Š‰ˆ†ˆ‰Š‡‡‡Š‰Šˆˆ‡‰‰ŠŒŒ‹ŠŠŠŠŒ��Ž��‹�ŒŒŒŽ��Ž�Ž��Œ������������‘’‘��‘“’‘‘’’””“’““”––•••”“”––—•••––—˜™••—™™———˜™˜˜š—–——–•”•—™˜—–—™š™›™••—˜˜–•“‘“”–šš”‘“–•–—šš™™š™›��šš›žžžž���žžž�ŸŸŸ ¢žžž¢¡ŸŸŸ   ¡ Ÿ ¡¢¡¢  ¢¢¡£¢¡Ÿ¡¡¢  ¡££¡¡¢£¡¡¤¤££ ¡¡¡¢¤¢££¥¦¤¡£¥§¥£¤¥¤§§¥¥¥¦¥¤¤§§§¥¥¥§¦¥¤¥¥¥¦§¥¦¦¤¥¥¥¦§¦§¥¦¦¦¥¥¤¥££¥¨¥¥¥¨¦¥¤¤¥¥¥§¨§¥¥¦¦§¦¥£¥¤¤¤§¨©¦¦§¨§¥¢¢¤§§¦¦¦¦¥¦¤¤¤¦¤¤¤¥¥§¤¥¤£¥¦¤¦¥¤£££¥¥££¢¥¤¢£¦¥££¥¬Çñÿÿüúôª…kjptrqrrtttrttuvwvvvwwwwwwyyxzz{zzyzz}~~|||~~~~~~~~}~~~}~�‚�‚��‚�����ƒƒƒƒ……„„„……†……††…†…††‡‡‡††…‡ˆŠ‡‡‰ˆ„„‡ŠŠˆˆˆˆ‰Œ‹‹Š‹‹ŒŒŒ‹ŒŽ�‹‹‹‹ŒŽ��Œ����ŽŽŽŽŽ������‘��‘�Ž‘’’‘‘’’��‘�’‘’’’‘•“’’•——””••“”–—––————™˜˜˜˜—™šš™›žž›š™™™™™›››››œš™™›œ�›œœ��Ÿž�œžžŸœš™›ž�œ››››šžž�›œœ›œœš™——••”š¦¨ž“‘•—™›››œžž ŸœœŸŸ¡ ¡£¤¤¤££¢£¤£¢¢££¦¦§¦¤£¤£¦¤¤¤§§¦¤¥¥¨§¦§§¦¦¥¤¦§§¥¦§©¨¨¨¨¦¦¦©«ª§¨©©¨§¦¥§©¬«¨¨¬¬¬ªª©«ª««¬«ª©ª«¬­­®­¬­¬«¬«ª¨¬«««««­ªª«­ªª«¬¬ª¨©««®®®«««®¬¬¬­«ªª¬­­¬«ª««ª«¬ª¨¨©ªª©¨ªªªª®«ª©«««ª¬ªª««ªªª©ªª©¨¨ª¬«ª©«ª«©©©ªªª«¬ª©¨§§§©ªª¨¦¦¨ªµÎöÿÿÿþ÷£ƒljlljloomooooqqpprrtssrssttssttuvvuvwwxzxvwy}||yzy|||{zy}}|{{|}|||||}~~€€~~�€|€‚€€€€ƒ‚ƒƒƒ„…ƒ„ƒ��ƒƒ„ƒƒ‚‚ƒ…„…†‡…†ˆˆ‰†…„††‡‡ˆ‡ˆ‰ŠˆˆˆˆˆˆˆˆŠŒ‹ŒŒŠŠ‰‰‰‹ŠŒŒ��ŒŒŒ‹Ž��Œ������’���ŒŽ�‘‘�Ž��“���’“’����’”’’‘’•—–”•““”••––—–—–––––––—–—™—–––—˜˜——™˜™——–˜˜™˜˜—˜˜˜™™˜—–”••“��ŠŠŠ‘–•‹‹Œ�’•——˜˜˜˜˜šš›››��žŸž��œ��Ÿžœ�  žœž Ÿžžž  Ÿ¢ ž�ŸŸ ¢ ž¡ ¡¡¡Ÿ    Ÿ¡¢¢¡£¤¤£¢ ¤¥¦¤££££££¥¤££££¤¦¤££¤¥¤£¤£¥¦¥¢££¨¨¦¤¤¤¤¤¥¥§§¥¢£¥¨¨¦¤£¥¥¥¤§§¥¥ª¨¦¥¦¦§¦¥¥§¦¥¥¥¦¤££¤¤¥¨¨¥££§§¦¥¦£££¥¥¤¤¤¤¦§¦¦¤¤¤¤££¡¥¤£¢¤¤¤¤¥¥¥¥¥¥¦¥¥¨¦££¤¤¥¥¥£¢¡¢¢¤¥¥££  Ÿ¢¤«Áïÿþüøô¨‹rnmppttsssstsqptuutuwyxwxwyzzwwx}|}||{{|||}}}}~}{|}~~€~~€�~����ƒ�€‚„……ƒ‚ƒ…ƒƒƒ„„……††…„‡……††…†‡‡†‡ˆŠŒŠŠŠ‡†‡ˆˆ†‡‡ŠŠŠŠŠ‰‰Š‹‹Œ‹Œ��ŒŒŒŒŒŒŽŽ��ŽŽ�Ž���Ž�Ž�Ž����‘‘‘’’’’��’‘’“•““’““”“’‘‘“”’’“–—•”••”••””—–——™—–—˜–˜š››š˜š›šš››˜™›ššœ››šœœœ™ššœœœœœ›››œž›š›žž�œ››���œž��››˜—”••’‰{pntuvƒ�”–˜›™›� žžž¡¡ Ÿ ¡£¡¡¡£¥¥¤¤¤¤¦¥¥¥¥¥§§¥¤¦¨¨§¨¦¤¤¥¨©¦¥¥¦¥¥¨¨¨©ª¨¨¨©§¨©©¦¥§¨§©©©¨¨¨©ª©¨¨ªªª¬«§©ª«ªª¨§§ªªªªª¨¨«««¬«©©ª««¬ªªª«««ªªª­«ª««¬®­­«ª«¬¬¬¬¬¬­®¬­««¬­ª«¬«©ª¨¨ªª««©©¨¨ª««ªª¨©¨ªª¬«¨¦ª«¬«©©ª¨¨ª¨©©©¨ªªªª©§¨¨«ªª¨§©«©©©©¨©©©©¦¦¨«©¨¦¨°Êöÿÿÿÿû£ˆngkonnnmmmooooppoorttssrsttstttuvwwyywvyzyvwwyyzzz||z{|}}{{zz{~~~|||€~||€€€��€��‚���ƒƒ‚���‚‚‚€�‚……„ƒ„ƒƒƒ„„„„…†…ƒ‚„„„…††††‡‡‰‰‰‡‰‰‹‰‡†ˆŠ‹‹ŠŠ‰Š‹Œ‹‹‰ŠŠŒŒŒŠŒŒŒ‹‹‹�����������‘��ŽŽ����ŽŽ�‘�’‘��‘“”’‘‘‘’‘‘‘““–––”““—˜—“”–——–––—™˜–––——™—•–˜———™–——™—™š™˜———˜˜™™™–—•”““�Œ†|bLOYfqs|‹‘�’—˜––——–™ššš™šœ žœ�   žžžžžžž¡Ÿ� ¢¡ŸŸŸŸ¡¢ŸŸŸ¢¢ Ÿ¡¡¤¤¢ ŸŸ £¢ ¢£¢¡ ¢££¢¢ ¥¥£¤¤¢££¤£¢¡£¥¥¤£¥¥¥¦¦¤¦¥¥¥¨§¦£¥¤¤¦¦¥¥¥¥¥¥¥¦¥¤¤¤¦¥¦¥¤£¦¥¦¥¥¦¨¦§¦§¦¦¦¦¨¨§¥££¤¥¥¤¤£¤¤¤¤¦¥¥¤¥¥¥££¥§¢¢¥¦¤£¥¦¦¤¦¤¤¤¦¥¦§§¥¥¤¥¦¦¢£¦¥¥¥¦¦¥¥¤¤¤££¡£¢££¤¢¢¥§£¡¡££¤¢¢ªÂíÿýúûù«�tjossrttsrtvvvvuvxxvuvxxvxxyxzy{}}z{z|}}||~~€}|~~€�~~��~‚‚€€„…„€�ƒ……‚‚‚ƒƒ„ƒ„„„„†„…†‡‡‡†……†…„„‡ˆˆˆˆ‰‡††ˆˆ‰‰‹‰ˆ‰Š‰Š‰‰‰Š‹Œ�Œ‹ŒŒŒŒŽŽŽ���ŽŽŒ����Ž��Ž��‘�����Ž��‘‘’‘�����‘“’’“”“”“““–—•“•—˜š—˜˜™™š™˜——™œ˜˜˜™™™™˜˜š›™š››››˜˜™œœŸŸž›�žžž�›œ�ž�œœœ���›œ��œœœ�œœœ Ÿœ›œ™™��—“�‹gTMNS[`fs‰”–”——šœœšœŸ¡¡¡ ŸŸž¢¤¤¢¢¢¤¤¤¤¤¤¥£££¦§¨¨¨¦¤¤§©¨§¦¦¦§¦§§¨§§¥¦¦§¦¥¦¨¨ª¨¦¦¦¨©ªªª©ªª¬ª¨¦¨¨«««¨§¨©¨ªªªª¬¬ª©ªª©ªª¬­¯«©©«ªªª«ª¬­®­ª¨ª¬ª©«­«ªª¬¬¬¬¬ª«¬®­«ª«ª¬«ª¨©«ª«¬ªªªªª«­«¬«ª¨ª«ª¨©¨¨§««¬ªªª««««ª¨ªªª««ª¨ªªªª«ª©©¬«ªª«ª¨¨©©©©¨©©¨©«©©§¨¨¨¨®Åôÿÿÿÿû¦�uiilmonnpqnnnqrrpqrsttsrqsuvttuuwuttwwxxxxwwxzzxxyz|~~|zz|{z|}}~}}}}}~~}}}€€€€€����ƒ‚€ƒ‚‚�‚�‚‚‚‚‚€‚„†††…………………††††…‡‡ˆˆ‡……‡ˆ‡‡‡ˆˆˆˆ†‰Š‹‰‰ˆŠŽ�‰‰‰ŒŒ�ŽŒŒŽŽ�ŽŽ�ŽŽŽ�ŒŽ�ŽŽ���ŽŽŽ��‘““�‘‘’‘’“•”““’““”””’“”•“••”“’’–——•••––•””–—™——––—™—••——˜–•—›š—––——––—˜™™™–”“•“‘�‰€lI?DFHLPWasˆ�Ž‘••—••–™™›ššš�œœžŸž��ŸŸž Ÿžž¡Ÿœž ¡¡ Ÿ��Ÿ£¤¢ŸŸŸ¡ žž ¡ Ÿ ¢¡ŸŸŸ ¡ ¢¢£ ¢¢¢¢¤¤££¤£££¥££¤¤£¢£££¢¤¤¥¤¤£¤¤¥¥¦¤¤¥¦¥¥¥¥¤¤¤¤¦§¦¦§§§¦§¤¤¥§¦¦££¥¨¨¦¦§¦¤¤¤¦¦¦¥¦¥¤£¦¦¦¥¤£¤££¥§¦§¦¤¥¥¤£¤¤¦¥£¡£¤¥¥§¦¦£¤¤¦¦¦¥¥¤££¤¥¦¦¤¤¤¥£¤£¢¢¥¥¥£££¢¡£¤¤¤¢¡  ¢¢  ¥»èÿý÷øøª”xnnqppsussstuuuuvwwxywwxyxyxzzzzzyzzz{|}}}}}~€~}€€€€€~~~�ƒ‚‚€�‚ƒ……ƒ�‚ƒ†‡…ƒ„„†††‡ˆˆ‰ˆ††‡‰‰ˆ‡ˆ‡ˆˆ‰ˆˆˆŠ‰‰ˆŠŠŠ‹‹‰‹Œ�‹ŠŒŽ�‹Š‰‹ŒŒŒŽŽŽ�‘Ž�����ŒŽŽŽŽ�‘�����‘‘‘‘’’’‘’‘’’‘’•”’“””””••“”••”––•“•——•—™š—————˜™˜™™›››™ššš›�›œœœš››œœœœœ›œœ�ŸŸžœ›œžžœ›œž Ÿž›œœžžž���žœš˜———•�މy]HADFGGLRZh‡”•—™˜šœ��žŸŸ ¡Ÿ ¢¡¡£¥¢¢¢¦¦¥££¢¦¦¦¦¦¦¦¦¦¦§¥¤¨¨§¦§§§¦§§§¦¨¥¤¦¨¥¤¥©©§¨¨§§ª­¬©©ª«©©¨©©ª¨ªªª©©ª«ªª««¬¬««ª©©©«ª«­®««ª««¬©©«¬¬¬¬¬ª©©ª­¬«ªª¬®¬­¬­¬«¬®««¬­¬¬¬¬¬««©ªª««¬­¬ª­«ªª«©¨«¬ªª©©§ª¬¬«¬«ª¬­®­¬©ª««ª««¬«ªª««­­«ªª¬¯­ªªªª«¬ª¨¨ª©§¦¨§¦¦¨­Âñÿÿÿÿþ§“yhjomkmnoooopqrppqrrrqqstuuvtuvxvutuvwvvwxxwxyz{zy{|~}|y{{|zz{}}~|~~~}}~€€�€€€€€�‚‚ƒ„ƒ��ƒ…ƒ��‚„„„„„„„„†††……„†……„††ˆ‡……††‡‡‡ˆˆ‡†‡ˆ‰‰ˆˆ‰ˆˆˆ‹‰ˆ‰‹‹�Š‹ŒŒŒ�Œ‹‹Œ�ŽŽŒ���ŒŒŒ���ŽŽ�Ž�‘���‘‘‘�‘’��‘”’’’‘‘’‘’““’““•—•’“”•”––•—–••—–•””•™—–•–•––———––˜—˜™˜™™——––•–––’“““�ŽŒˆ}cB?>?BDEGLQ\r†Ž�“—•••™™œœšš›œŸžœ››�žŸž�žŸ ¡     ¢ ¢ ŸŸ¡¡   Ÿ   ¡ Ÿ ¢¢£¡¡    Ÿ£££££¡¢££££¤¤£¢£¤¥¢¢¢££¥¥¦¤¤¤¤¢¢¢¢¢¤¤¦§§¥£¤£££¦¦¥££¤§¤¤¦¦¤¦¥¥¤¥¥¦¨¨¦¤£¦©©¨§¨§¨¨¨§¦£¥£¤¤¤£¤£££¤§¦¥§§¥¤¦¦£¤¤¥¤¤¤¥¤¤¤¦¤¤¤¤¤¥¥¥¤¤££¤¤££¤¥¤¤§§§¥¤¡¤¤¤¤££££¤¤¢ ¢¥¤¢¢£   §·æÿüööó­™}kmssrsutssuuvvvvxwwuwwxwwwz{{zzyz}||}~{}}}{}}~~~~€~€~~���€‚‚‚���„ƒ„ƒƒƒ……ƒ‚ƒ‡‰ˆ‡ˆˆ‡‡†…‡ˆ‰††…†‡ˆˆˆˆ‰‰‰‡ˆˆˆˆ‹Š‰Š‹‹ˆˆˆŠŠŒ‹‹‰ŠŠŒ‹ŒŒŒŒŒŒŒ���ŽŽ���‘����������Ž��‘‘’’‘‘“•”’“““”•”“““•••••“••••—–•–—˜—••˜˜———™šš›™˜———›š™™››š—™››œ›™˜›œ›™™šœ�žœœœ����Ÿž��žœ›››œ›˜—–””‘�†vX@>@?CDGIOUYa{“””–ššœž���Ÿ¡¡¡¡£¢¡ £¤¦££¦§¥¤¥¦¦¤¤¤¥¤¥¦§¥¤¤©©¨¦¥£¥§©¨¦§¨§§§§§¥¦§©©¨§¥¤ª¨¨¨¨¦©ª©¨©©©©«¬ª©ª«¬«©©ªª©ª¨©¨ªªª¨©¨©ª««¬­«©«¬«¬«¬«ª©«ª««­­«ª®­¬««ª«¬­­®®««­­©¨©«ª«ª©§¨¨ªªª¨ªªª©§¨ªªªª©«¬¬ªª«­¬¬«ª§©ªª¨¨©ªª©¨©«ªªª«©§¦¨©ªª©§©ªª¨¨¨¨§©¨¦¥¦§«¿îÿÿÿÿý¦—{gfmnnnpnmmppoprrqrrsstttuutuuwxxvvxzyxvwxyxxxxzzzxxxzyyy{{|{{{||}}||~€€~€�€�€€‚‚‚‚‚‚�����ƒ†„‚„„„‚ƒ‚ƒƒ†††…„„ˆ†„ƒ…„„†ˆˆˆˆ‡‡ˆŠ‰‰‰‰ˆ‰ˆ‰‰‰‰‹‹‹Š‰‰‹�Ž‹ŠŒ�Ž�Œ‹�Ž�ŽŽ�ŽŽ�ŽŽ��Ž����‘’‘‘‘“’‘��Œ�‘‘�‘‘’’’�‘’””•••”––“““••–””•–••”––˜˜˜–———————––™™˜™™˜˜–—––––”•–•’••“�ŽŠ†~cH>98:;>AHKRW[l…�‘“•—˜———š�›™›ŸŸž�œœžŸ ŸŸ ¢žŸ�ŸŸ  ¡Ÿ ¡ŸŸ ¢¡¡ŸŸ £  ¡£¡¡¡¡ ŸŸ¡¤¤¡ ¢¤¢  ¢£¡¡¡¤¤£¢£¤¤¡¡¢¥¥¨¥¢¢££¥¥¥¥¤£¤¦¦¥¥¥¥¥¤¦§§¥¦¥¥¥¤¤¤¥§§§§§¥¤¤¥¨¦¥¦¨§©¨§¤¥§©©¨¦¥¥§¦¤££££¥¦¦¥¥¤¦£¢£¤£££¥¥¥¥¦¥¥¤¤¥¦¦¦¦¤¢£¥¦¦¤¤¤¦¥¤¡£¤¦£¤£¤¢¡¡¡££¤¤¤££¢£¤¤£¤¢¢¡£¡¢¨ºæÿúøùø¬š~jnsqpqrusssstvvvvuuwzyxxxxxz{yxxzz{||{}z{{|}~}}}}~}~€€~�‚~~‚‚€�‚‚‚‚ƒ‚‚††…ƒƒƒ……„ƒ……‡‡‡……†ˆ‡‡†‡‡‰ˆ‡††‡ˆˆ‡‡‡‡ˆŠŠ‰‰Š‰Š‹ŒŠŠ‹ŒŠ‹�ŒŒ��ŽŽŒŒ��Ž������ŽŽŽ����‘‘�‘‘‘‘“–—”‘’’”””•”“•––“•”””–”“”••••”“”••–————–˜˜—–—˜™———››™——˜šš˜›››š›››™š›�œš˜›��œœœ��›™™š›��›˜—™›šš–’‘�‡vQ=>;;==>BIMORYfz‘—•–™™šž žœœ  ¡££¢¢¢¤¤¢¢¤¤¤¤¤¤£¨¨¦£¥¦¦¤¥¤¤¥©¨£¢¥¨¨¤¤¦§¨¨§¥¥¦§¥¨©©§¦¥ªªª¨§¦§¨ªªª©©©¨¨¨ªªªª¬ªª©©©««««©¥§©«¬«©©©¨©ª¬¬«©ª¬¬ªª©ªª¬«««««¬¬«««¬««­®¬­«­«©ª«¨ªªª¨©¨¨ª¨¦©ª««©¨¨ª««««ª¬¬­­­«ªª­­­¬«©©©¨©««ª©¨ªª«««¨§¥§©«ª««ª¨¨¨©¨§¨©§§¨¨¨§«¼îÿÿÿÿù¦—}fhmmoonoqqqrqprrrqssutsqrtuuuuttvwwvvxxvvyxyz{zzx{{{|{xzzzzz{{{z{|||~€{|~€€€‚€~~��������€��€ƒƒ�‚‚„…„€€�„……„………††„„„„…†‡‡ˆ‡‡†‰‡ˆˆ‰ˆŠ‰‰ˆˆ‰Œ��ŠˆˆˆŠŒŒŠ‹ŒŽ��ŽŽ‹ŒŒŽ�ŽŽŽ��ŽŽ�‘‘Ž����ŽŽ���Ž���‘”‘ŽŽ�‘“��‘“’’’‘‘“••““”•——˜•“‘“”˜˜–”•—˜˜–••˜˜—•–———˜—–•—˜™—˜——•–”‘’”“Ž‹ˆ~fK;98::=<>BKRWWYh…��“˜—•˜››š››��žžž�žœŸŸ  Ÿžž ¡  ¡ ŸŸ ¢  ¡¡¡¡£ŸŸŸ¢ ŸŸ ¡ ¢¢ Ÿ  ¡££¢£££¢££¦¤¤¢¤¤£¢¥¤££¤¥¦¦¤££¤¤¤¤¥¤££¤¤¥¥¦£¤¤¥¥¨¦£¢¤¦¥¢¢¤¥¥¦¦¤¥£¤¤¦¦¦¦¦§¨¤¥§¨££¥¨¨¨§¤¢¤¦¦§§¦¥¦§¨§¦¥¥¤¤¦¨¦¤¤¦§¦¦¥¥¦¨¦¥¥§¥¥¥¦¤¤¤£¡£¤¤£¤£££¥§§¥£££¢£¦¦¦¤¤¤¤¢¤¤¥££¢£¡¡¢§¶ãÿýûùõ«ž‚jkqqppsrssstustuwxwvvyxwxz{{yyxyxyyyy{{|||}}}~}€~�}|€€�€€�€€‚‚‚ƒƒ‚ƒ††„‚ƒ…†…‡……†ˆ‡††ˆ†……††‡‡ˆˆ‡‡‡ˆˆˆ‡‡‡ŠŠŒ‹ŠŠ‹‰‰ŠŠ‰ŠŠŒ‘“Œ‰�Ž�ŽŒ‹�������ŒŽŽ���‘‘‘‘�Ž����‘���’’’�’’““•–•““’“”•““”•••–”““•••–˜–––˜—–•˜˜˜———šš™›š™››šœœ››››œ›���œ››œœ��œ››œ�žžœ›œœœ™˜™›™›™•�މwVD>;=<9;>?EQ\]abl…•–•–šœ��ŸžŸŸŸŸ¡¢ ¡£££¥¤¤£¤¢£¤§¤¤¥¥¤¥¦§¦§¤¥¦¦¦¦¦¦§¥¥§§¤¦¥¥£¥¤¥¦¨§¦¨©§ª©¨ª«©ª«©¨¨ª¨¨ª¬¬­­ª©««¬¬«ªª¬«ªªªª««¬¬¬«ª¨«¬¬««©ª¬®­®ª«­¯®¬ªª«­¯¬©ª«©¨ª­«ªª¬¬ª©«ªªª©©«­­««­­¬ªª©©ªªª¯¬«««««ª««¬ª««ªªª©©ª©ª¨¨¨©¨ªª­¬©¥§©ªª«ªª¨¦¨§¨ª©§§§¨§¨¨ª¬»çÿÿÿýú¨š}dfllmonmmnoqpqqpprqrssrstuvvttvvwwvvvvxwvvyyzz{xuxz{||{xxzz{{{{}||}}|}~~€~}}�ƒ���‚�€€‚ƒ„�ƒ„ƒ�‚„„��ƒ††††ƒ�‚……„ƒ††ˆ‡‡‡‰‡‡ˆ‰‡ˆ‡‡ˆ‹ˆ†ˆ‰‰‰ŠŠŠŠ‹‹ŒŒ‹‰ŠŒŒŠŒ‹‹‹��Ž��ŽŽ�ŒŒ�ŽŽ�����Œ���‘“‘‘����Ž�������’’“’‘�‘‘““““”•——–““”———•”•–––˜——–˜–•”˜™™——•––˜—””–––––•““‘މ~gG?>667;:89@JRYa`^l�Ž�‘–™–—˜ššš—˜˜š�žœœ�ŸŸž����Ÿ  ž��   žŸŸ ¡¢¢¢££¡¡Ÿ  ¡¢¢££¡Ÿ  ¢¢¢ ¢¢¢¡¤¥¦¤¤£¥¤¤¤£££¥¥¥¥¤¤¦¦¦¥¥¤¦§¤¢¥¦¤£¦¦¥¤¥¤¤¥¥¥¤¤¦§£¥¦¨§¥¥©©ªªª§¦¥¥¤¦§©©£¡¤©¨§¥¤¤¦§§¥¥££¤§¤¤¦¨¥¤¤©©¤£¢£¤¥¤¤¦©§¥¢¤¥§¤£¢¤¥¦¥¤£¥¥¤£¡¡£¥¤¤¥¥¢¡ ¢¢£££¡£¤§¥¤££££¡¡¡¢¥°Ûþúöøø¯ „jlqspqqqqqsuuuvuttvvwvwxxx{|{yzzyz}{yz{{z{|}|~~}}}€€}~€‚€���€€€����‚……†„ƒƒ…††ƒƒƒ……„†ˆˆ…„„„…†………‡‡ˆˆ‡…†ˆŠˆˆ‡‰‰‰ŠŠ‰ŠŒ‹‹‹‹ŠŠŠ��ŒŒŒŠŒŒŽ��‹ŒŽ‘‘�Ž��‘‘�����’‘ŽŽ‘’’““’”“’‘‘��‘””””“’’””•••“””–––•“•˜—”“—˜ššš——˜˜˜˜˜˜˜˜›˜˜™š˜˜˜›šš™š›œœ��›šœžœš™š›››œœ›ššœ››œ™˜˜™˜–“�‰|eF=:868:<=?DKRZ[[[g‚—–•–šœ��œ�ŸŸŸ¡¡¡ ¢¤¦£¢¡£¢¢¤¥¤§¦¦¥¥££¦¥¤¦¤¤§§§§¨¦¦¦¨¥¤¦©§¥§§¥¨§¦¨¨¦¦¨ªªª«©©¨©ª¬ª¨§¨©ª¨ªª©ª¬­«©¨ª¨ª«¬¬«©«¬¬©¨¨«©¨ª¬¬«©«¯¯¬ª¬¬­­®­¬ª««¬¬®­¬ª¬­®®­ª©ª«­¬ª¨«¬«¨ª¬­«¬«ª««¨ªª¬«ª©ªª«­¬««««¬¬¬ªª©©¨¨§¨¨ª¦¦¨¨¨ª«©¦¦¦§©©ª¨¦¦¨ª«¨¨©©¨ª¨¨¨¬¹æÿÿûüü§ž‚hhmlklomppppqqrqqqrssrrsstuwvvuwvvvvvyxwwxzzxxyywwx||zyyz{~~|z||}|~}}{{|~~}}}~}€}}�‚€‚�‚��€�‚„���‚‚‚‚‚ƒ„„„‡†„‚……†††…†‡‰‡††ˆ‡†‡ˆˆˆŠŠ‡‡‰ŠŠˆˆŠŠˆ‰‰Š‹‹‹ŒŠ‰Š���ŒŒŒŽ��Ž�‹‹���Ž�����ŒŽŽ�������������’’“‘‘�‘’”“”’’“–”’‘“•–––”““”–––•––™™––––˜—˜˜˜—™™™˜——–˜˜—•”•–“”’�Š‚kP>97963368:??=??ACGLSY[Y]fxŠ‘�‘“•–—˜—–™žž›œ��ž����� ŸŸžžžžž¡¢ŸŸŸ ŸŸŸ¡Ÿ��¡£¡Ÿ¡Ÿ  ¢  ¢¤£¢¢¥¦¢¢£¤¦¥£¢¡££££¥¥¥£¤¤¤£££¤¢¢¢¢£¤¤£¤£¤¤¥¥¦¤¤¤¥¥¥¤¤¢¤¥¥¥§§§¦¦¥¦§¦¦¦¥¤¥¥¦££££¡¦©©¥§§¦££¤¤¤¦¦§¦¤§©ª§¦¤¦¥¦¥¥£¤¤¤¤¦¥¥¤¤¤¥¤¤¥¥¤¥¦¢£¢££¥¤£££¤¦¥¥£¡¡££££¤¤¤¤¤¤¤¤¢£¡¢  ¡  ¦±Ûüüøõ󪢇iippppppqqsttsuuuuwxxxxvvxxxxzzyy{zzyz{|||z{{}|||||~~~~|}~��~���€�‚�ƒ„‚‚„„„„„„……„„„……†…†…………†ˆ……†ˆ‡‡†ˆˆˆ‰‰‰ŠŠˆ‡ˆŠ‰‰‰ŒŒŽ��‹Š‰ŒŒ��ŒŒ���‹‹Ž����‹���Ž��‘‘��‘‘‘���‘’’’’’’‘‘”“““”““‘‘‘”•–”’‘”––•••“•——””•——˜———˜˜™—––™™™šš˜˜šššš˜˜™™š™›œ�œœššš���ššš›œœš˜™š—––”–’‹‚pR???>??@ABDHIKNQV[^^aq‹““•—˜››�žŸŸ ¡¡¡¡¡£££¢£¤¤¦¥¤¦¦¥¥¥¦¤¤¤§¦¦¤¦¦¥¤¤¥¦¦¦¦¦¦¦¤¤©ª§¥§§¨¦¥¥§§©ª©§§¦¨ª«©¥¥¦¨©ª©§¦§¨©¨¨¦¨ª«ªª©««ªªª«ª©«««¬ª©©ªªª«¬««ªª©«««©¨ª¬«ª©©§§ª­®ª¨ª«ª«¬­««««««©ª«««¬«ª¨§§§¨¨ª¬«ªªªªª«¨¨©©ªª§¨§§§ª¬ª©¨¨©ªªªª§¥¨¨©©ª©¨¦©ª§¥¥¦§¦¥§§¨©´áÿÿÿþü©¡…ffklklmmnnnpqpmpqqqrqrstqqsvtssuvvuwwy{zywyz{zzxyz{y{||y{{||}|z|~~~~}}}}}�‚�~‚��€�€‚‚��€€�„‚��ƒƒ„„„‚ƒ‚ƒ„„ƒ………………††††‡‰ˆ‡‡‡‡‡‰ˆ†‰‰‰ˆŠ‰‰Š‹ˆˆ‰ˆ‡‰‰‹�ŽŒŠŒŒŒ‹�ŒŠŠŒŽ�ŒŒŒŽ����Œ��‘�ŽŽ�‘‘“�Ž�‘‘“’’�‘��Ž��‘““’“““‘‘‘“•“““•“““••“’”•”’““”•—––•“•˜˜•–˜—–—–••–•“‘’‘’”’އx\E<::;9:;=ADEJIJNTXYXZg�Œ�‘“•——šœ›™™�žž�ŸžŸŸ  žžŸ¡¢¢¢ ŸŸŸ ¢ �œœ  ¡ Ÿ�ž¡£   ¡     ¡  ¢£¡  ¢¤£¢£¤¡¡£¤£¡ ¢¡¡¡£££¤¤¥¥£¢¤¥¥¤¥¤¦¦¤£¤¤¤¤¤¥¥¥¤£¦¨§¥¦¦¤¦©©¦¥¤¥¥¦¦¦¥¦¦¦¤¦¤¤¤¥§§¤¥¦¦¥¥¦¦¦¤¤¢£¤§¥¦¦¥¤¥§§££¡¢£¥¥¥¥¤¥¦¦¤¤¤¤¢£¤¥£¥¤¤££¤¥£¥¥¤£££¥¥£¢ ¢¡¡£¦¤Ÿ�¡££¡¡¡¢£°Ûýûúù÷¯¦Œiinqppprrrqsssrsttuwzzwvwxyvxwxyyxz{yxz{}|}}~}||~~~€€~}€€��ƒ‚„„‚‚‚‚‚ƒƒƒƒ„„…„„……„„‚…‡††‡†††‡††‡‡‡‡‡ˆˆˆŠŠ‰‡‰ŠŠŠŠ‡‰‰‰‰‹Š‹ŒŒŠŠ‹ŽŽ�‹‹Ž���ŒŒŒŒ�ŽŽŽ‘‘‘�������’�ŽŽ�’’’‘‘‘’‘“””‘‘“”’”“““”••”““”–••”””—˜˜–—–˜˜—•––———™™–—˜˜——™™™šœ™™™›ššš›šš˜™™›�ž�š™š›››™—––—˜•’‘‘ŠxRBA<97::@DEKPPQWWXZf‘“’”™››œ�žŸ ¡¡   ¢£¤¡  ¢£¤¤¤£££¦¦§¥¤¦¥£££¤¦¥¦¦¦¤¥§¨¦¥¥§§¦¦¥¤¤££¥¨©§§§¨¨¨¥¦¨§¤¦§§¨«¨¨ª¨¥§¨ªª¨©§§©«ª«©©©¬ªªªªª¬ªª©ª¨«­¬¬«¨¥§ª¬ªªªª§¨ª¬««©««««¬«ª©««««««ªª«¬«¬ªª©««¬ª««¬¬¬ª©§¨ª«ªª«ªª¨©¨¨¦§©«©©§¦¦©¨¨¨«ª§¥¦¦¤¤¥§©ª¨§¦¨¨¨¦¥£££¥©³Ûÿÿÿýø©£‡eflmjjjlllkmoqppprrrqqrsssssrrutuuvxxwywwuwwxyyvvxzzyzzyz|||}~{yz~}}}~~~~~~~€€‚‚�€€€€‚���‚€����ƒ…ƒ‚„„ƒ‚‚ƒ………………††ˆˆ‡†‡‡‡†††ˆ‰‡‡‡‡ˆŠ‰ˆˆŠ‰Š‰‹‹‹Š‹‰ŠŠ‹‹‹ŠŠ���Ž�ŒŒ��������ŽŽŒ���Ž����“’��ŒŽ‘��“’’‘��‘���“““•–””“““•”‘“–••””•“–˜–“”–˜˜˜™›˜———–““”””•’’�ŽŠƒqV?77;964459BEGNPRTWZaj|ŒŽ��“•——™™™šœ›š›�ž ŸŸŸ¢ ŸŸŸŸ ¡ ž¡¡¡ŸŸŸ ¢  ŸŸž¢¢¡Ÿžž ¡££¢¡ŸŸ¢¢ žŸ¡¥¥£¢ ¡¡ ž  ¡¡¢¢¦¥¤¡¡¡¡¡¢£¤¤¤¤¥¥¤¥¥¥¥¤¢£¤¦¤¤¤¤¦¨¨§¦¦¥¦¦¥¥¥¥¦§¦¦¥§¤¥¦¨¦¤¤¦££¥¦¦¨§¥¤¦¦¤¤¤¥¥§§¦£££¥¦¦£££££¤¤¤££££££¤¥¥¥¤£££¦¤¤¡¡¡¤¤¤¤¤£¢ ¡¡£¦£¡¡ Ÿ¡¡£¢¢¡ŸŸ¡¡  ªÑöø÷ôó«¥�kioqppopprrrprrtttuvuuuvuuuvwwxzyyzzzyzxz{{{|||zzz||~~}}}}}}}~~~€~~~ƒ‚����„„ƒƒƒ…†„ƒƒƒ†††……„†……ƒ……‡‰ˆ…††‡‡ˆ‰‰‡‡‡ˆ‰‡‰‰Š‰‰‰ŠŠŒŒŠŠŒŒ���ŒŒŒŒŽ��������ŒŒŒ��Ž����‘‘�Ž����‘‘��‘‘�’““”“““’‘“““’””••”–—•”’“–—––“’–•––———•———–˜——™™—™™——˜™—˜™˜•——šœœ›œš™™œ›š›š˜˜˜™˜–•••��dB;<:9556999:<>?CGGKPTY\^`gz‘”’“—šœ�žž Ÿ ŸŸ ¢¢¦¤Ÿ¡¢¤££¢£¤¦¥¥¤¤£¤¤££§§¤¡¢£¤£¤§¥¤¤¦§©©§¥¤¤¤£¥¤¦§©©¨§¥¤¦§©©¦¥¦¨§§§ªª¨¨©¦§©ª¨¨ªª©©©©¨©©©©ª«ª¨ª«ª­««««ª«ª«««©©©ªªª«¬­¬«ª««ª©ªª©¨«¬¬ªªª©©©ª«ª©©©¨¨¨¨¨§§§©©««¨¨ªª«©¨§ª©¨¨©¦§§§§¦§¨¨§¨¦¥¥¨§§§¨¨¨§¨¦¤¤¦¦¨¨¥¤¤¤¥¨°Õûÿýþû§¡‰ddimllllklnmnnppppsqppsssrrqrrttuvtttuuvvwxxwwwyxxx{{zzzz{||||{zyz{{|{|}|}~~€}|~€�€��€„ƒƒ‚ƒ‚‚ƒƒ‚‚ƒ…ƒƒ‚‚‚………„………‡…„…‡‡‡‡†„‡ˆ‰‡‡‡‰‡‡‡‰‰ˆˆ‰‰‰ˆˆˆŠ‹‹Œ‹ŠˆŠŒ�‹‹ŒŽŒ�Œ‹‹ŒŒ���ŒŽ�ŽŒ‹‹‹�‘���ŒŽ�‘�Ž��‘�ŽŽŽ���“‘‘““’’’’’’“–”””——–“•–————–•••”•”••˜—•”•”””••”’‘‘‘�Œƒw\77743114324;<<>ACEIMOUY]_`r�’�Ž’•“—œ�š››œœ�œ�žžžŸžœœ� ¡Ÿ  žŸ ¤  žŸŸ¡ žžžŸ£¢  ¢¢¢¤¤¡Ÿ ¢¥¤¢¡¡ ¡¢¤¢¢¢£¡¡¢¢ £££¢££¡¡ ¢¤¤¢¢¢¥¤¤¤¦£¥¦¦£££¤¤¦¥¥££¥§§¦¥£¤¤¤¤§¥¤£¤¤¥¥¤¤¦¦¥¥¦¤££££¤¨¦¥££¤¦¥¥¤§¦¦¤¤¥¦¤¤¤¤¥¥£¤¦§§¦¦¥¤¥¥£¥¥¥££¢£¢¤¤¤¢ Ÿ£¢¡¡¢¢¡¢¢¢¡£¡¡£¤¢  £¢     ŸŸªÓöúùöó­©�mhnpqppppprrrrstutttvvvxwvvxxwuxzzyyx{||z{{}}|{{}}|||~€~||}€�€€�‚�€�€€‚‚‚‚ƒƒ„ƒƒƒ†„„„„„††‡†…„………………‡ŠŠˆˆ‡†ˆ‰‰‡‡ˆŠ‡‰‰‹‹‰†ˆŠŠ‰ŠŠ‹��Œ‹‹‹Œ‹Œ‹Œ��ŽŒŒ����‘���“‘���‘““‘��“““‘““““”“’’’’”’’”••”•––“•“‘‘“•™–””––———–––˜™˜——™›š˜™™™™™™››š˜š›š˜š››š˜—˜˜˜™—˜˜—–––”””ކtW85442003359::;?@DKSRPV`ed`o‹–••˜››�ŸŸžžžŸ ¡  ¤¤¤¤¤¡¢¡£££¡¢¤§¦¥¥§¦¥¤£¤£¤££¥¨¦¥¦§¤¥¥¨©¨¦¨¨¦¦§¨¨¨§§§¨¨¨¦¨¦¥¥¦¦¦©ª¥£¢¦¨«««©©ª¨§©«ªª§©«ª¦¨¨¨¨©ª«««ª©ª¬«©©««ª©¨¨¨ª«¬ª«ªª¨ª©©ª¬««ª¬¬«ªª©©¨¨¬«ª¨¨©¬¬¬ª¨¨ª«­«©©©¨ªª¨¦ªª¨¨§§¨ª¨¨§¨§¨ª©¥¥¦©¨¨¦¤¥¦§©©¦¤¥¨¦£¤¦¦§¦¦¥­Ñûÿÿûù¨£Šgeilllkllmmoopoppqpoorsssutrsstuuusuvvvvzywtvvxzzxxxyyyyyzyyyzzzz}~}|{|{~}|~~€|}‚ƒ€‚‚�€���€‚ƒ„ƒ‚�‚‚�‚„††……………‡‡…‡‡ˆ‡‡†ˆˆ‰‰Š‰‰‰‹‰‡‡‡‰‰‹‰‰‹ŒŒŒ‹‹‰‹ŠŠ‹�ŒŒŠŠŠ�������ŽŒŒ���ŽŽŽ��Œ������““‘������“‘‘��‘““’’”’“‘’“’‘“““”•””––•“““••—•••–•—–•“““•–•’‘’’’’‘�ˆkK:6521.//12458:=?DKOOOUXZ\]k…�’‘””–™œ›™—™š�žž�ŸŸ¡£¢Ÿœ� ¡  ŸŸŸ¢¡¡Ÿ Ÿ ¢£ ��ž¡¢¡ ¡¡¡Ÿ¡¡¡¢£¡£¡ ¢¤¢¢¡¡¡££¤¥§¤¡¡¢¢ ££¢ ¡¢££¥¥¤¢¤¦§¥§¥¤££¤£¡¤£ ¢£¤¤¤¤¦§§¥¥¤¦¦¦¤¥¤¦¦¦¥¥¥¤¤¥¦¥¥££¤¦£¤¥¦¤¤¤¦££¥§¥¢£¤¦¦¤£¦¥¢¡¤¤£¢¥¥¦¤¤¢¢£¥¥¥¥¤£¥¦¦¤¤¢¡¥¦¤¡¡¡££¤¢¡ ¢¡£¡¢££¡¡¡ Ÿ   Ÿ§Ëòýùôñ­¨‘khlnnopqqqqqsrrrtssuxvusttuuxwwvwxywxzzzyxz||}}|z||~~}}}~~~€�€€ƒ‚€€€€‚……„‚…ƒƒƒ„ƒ„„„„„„†††††ˆˆˆ‡†„†‡†„††‡ˆ‰‡ˆˆˆˆ‰Š‰‰ŠŠŠ‹ŠŠŠŠŠŒŒŒ‹ŒŒŒ‹�Œ‹Š�ŽŽŽŽ�Ž���Ž‘‘“‘��Ž�‘‘“���’“”“��’’’’’‘‘“”“�’’“•–””’”””•˜–•”•”–˜––—————˜•”•ššš™™™›š˜•—™›››š™š™™››™š›š™›™™˜˜•••“�Œ~aH<75332/0/1367:>CGKOTVY\\X]o†�“•˜—˜�ž��  Ÿ ¡ £££¡ ¢¤¤¤¢¡ ¡¤¥¥¥¥¥§§§¥¤¤¤¤¥¦¦¤¥¦¦¤££¥¨©¦¤¥¥¦§©§§§©¦¦¨¨¥¥¦¨¦¨¨¨¦¨¨§§§¨§§¨ª©¨§©ª«ª«©§§¨§¦©ª¦¨ª«ªªªª«ªªªª©©©ªª«¬¬©©¨ªª«««©ª««ªª¨¨ªªª¨¨§©©««ª§©©©¦¨©©¦¦¥§ªª§¨¨§¨§§§ª©§¦¨©©¨ª©¨¥¦¦¦§¨¨¥¥§¨¨§§§§¨§¥¥¨§§¦¨¦¤¢¡¡¤­Îôþýù÷ª¤‰hejkkkmmnnollloopppqsrrrrrrttuvwuuuwuuuvvvwxxxxzzyxxzyyz{z{yz{}{||~€}{z|{}~�€|�‚�€‚‚‚���‚„ƒ‚�„„‚‚‚ƒ„„ƒƒƒ…„„„……†††…††ˆ‡…ƒ…†ˆˆ‡ˆˆ‡ˆ‰ˆ‡†ˆ‰‰‡‡‰‹Š‹ŠŠŠ‹Œ��ŽŽŽ‹‹Ž��Ž�Ž���ŒŽŽŽŽ‘’’������ŽŽ�‘Ž�Ž���‘‘‘�‘‘“““““““’“““”“’”””•••””•–““•˜—•”••–——””••••–”’’‘‘’ŽŽŠ{T=:85421/0.0259=?EKMQVZ[acaahwˆŽ�’”•—˜ššš™›œœœ�œœ�žŸŸžžŸ ¢��žŸŸ¢¢ Ÿ  ¡¢¡    ¢££Ÿžž¡££¡¢¡¡¡¤¤£¢£¤¤¡¡£¤¤¤¤£¤£¢¡¤¥¤¡¤¤¥¤¥£¢£¥¤¤£¥¥¤¤¦¤¥¦¤££¤£££¦§§¦§¤££¦¨¨¥¦¥¦¦§¦¦¦¤¦¦§¤¤¤¦¤¥¦¦¤££¥¥£¡£¤¥¦¦¤¢£¢¢£¥¥§£¡£¤£¤¥¦¤¤£¤¥¦¤£¤£ Ÿ££¤¤£¢¤¤¥£¢ ¡¡¢¢¢¡££¢ £¥¤¤¢ Ÿ ŸŸŸ¡ §Çîûøðñ¬©’ojlmmppppqrqpqqssvuuuwvuttuyyxwxxxyxzzzzzz|||{||~~}|{|~~}~~€€}€‚��‚�‚���ƒƒƒ„„ƒƒƒ„„ƒƒ„‡†…„…†ˆ……„†††‡‰ˆ†…†‡‡‡‡ˆ‡ˆ‰Š‡‡‰Œ‹‹Œ�‰‰Š‹Š‹ŒŒŒŒ‹‹��Œ‹ŒŽ���Œ����‘�‘‘“““��‘“‘’“•”’’’’‘“““’“‘‘”•’’“••—”’’”••••••”“”•–––•–—˜——˜™••˜š˜˜˜››ššššš›››˜˜–™›�›››œœœ››™—–––•“�‹xR9:9<:62212357=ACDINU\bacfeegs‹—”–™ž��œžŸ  ¢¢ Ÿ¢¢££¢¢£¤¤£¡£¥¨¨§¥¥¥§§¨¦¤¤¤¥§¦¥¥§§¥£¥§¦¦¦§¦¨§§§©¨¨¦¦¦§¥¥¥¦¦§¨©¨§©©©ª©¥¥¦©¨§§¨¨§©«ªª©§¦¨ª©©©©¨©ª«ª¬ªªª¬©¨¨ª©ªª¬¬¬¨¨ª¬ª§¦¨ªª­¬ªª§§ªªª¨ª¨¨©ª¨§§¨¨§§§©¨¦§ªªªªª¦§ª«¨¨¨ª¨§§¨¨¨ªª§¦§¦§¥¥¥§§¨§§¥¦§¨¨©ªª¦¦¤¥§§¦¥¤£¥«Ëðþüúû¨¤�ifhklkkmmllmmnoppopqrqqqrssrsqrtvuutuvutuwxwwxxxwwvxxyyyxxy|zxxz{{{}~~~|{}~}||€~�~‚€~��€�‚‚�����ƒƒ„ƒƒ‚ƒ��‚„ƒ„„††††‡††††…„„†ˆ†††ˆ†‡ˆ‰‡‡†ŠŠ‰†‰Šˆˆˆˆ‰‹‹Š‹���Œ‹ŠŒŒŽ��ŒŽŽ�Œ�Œ�Ž������ŽŒŒ��’’’���‘�‘���“’��’““’’’’“••‘““•”“’”••”–”””•••••–———–•““––”�‘‘’��‹‚rO799:8335333348@FGGJQXZ\]`_b_e€’‘’’”——™››š›œœ�Ÿœ››ž ¡Ÿž�ŸŸ   Ÿ ¢¢¢ žŸ¢£   žŸŸ£¢£¢¢ ¡¡¡¢¢¡¢££¢Ÿ £¢¡£¢££¢¢¡Ÿ¡Ÿ ¢¥¤¢¢¢¢¤¦¦¥¤££¤¤¤¤¤¢¢¢¤¤¥¦¦£¤¤§¦¥¤§¦¤£¥¥¤¥¥¦¦¥¤¥§§¤£¡££££¤£¢¡£¥£¢¥¥¥¤£¡¡£¤¤¢¡¡¤¤¤¤¤¡¢¢¤¤¢¢¤££¤§¤¢¡¡¢ ¢££¢£££¢£¤¤  ¡¥¤¢ ¡¢ ¢¤£¡¡££¡¡¢¡Ÿ¡¡¡žž¢Àåøøô𬪒ojmmmnpppppqsqqqttttuuuuuwwvvuttvyyxxzxwx}}||||{{{|}}|{|~~~~~€€€�‚�~�‚�‚‚‚‚„……ƒ„„„„†……„„…ˆ†††‡‡††‡ˆ††ˆ‹‰‰ˆ†ˆŠˆŠ‰Š‰‹��ŠŠŠ‹ŒŒŒŽ�‹Œ‹ŠŒ�‹‹ŠŒ�ŽŒ�ŽŽŽ�����‘““���’““’’’’‘’‘’”•””’‘�“””’’“•“’”–——–””“•••“•–™˜•”———••—™™™šš—–˜š›š™———›™—–—™››š™›››šš˜˜™—”‘‘�Œ„uO:;==98755568:=DHFHPVZ_cddfggm‡”••˜›œ� Ÿœ�¡¢¡¡ ¡£¤¡ ¢¤£¤¤¤¤¤£¥¥¥¦¥¢¢¥§¦££¤¦¦¦¦¦¦§¦¦¥¥¥¦¥¦¨ª§¦¥¦¥¦¦¨©¨§¦¥¦©©ª©¨¦§¦¨©«¨§§©ª©¨ª©¨¨¨ªª§§§¨««¬©©ªª©ª««¨ªª«©¨¦§¨««««¨¨ª­«©¨ªª¬ªªªªªªª«ªªªªªª©©ª©§¨«©©©¨¥¥¥¨¨¨¨¨¥¦¨ª¨¨§§¦§©ª¨¨¨§§§©§¦¤¦¨©¦©¨¨§ª©§¦§©©§§¦¦¦§§£¢¤ªÄêýüõ÷¦¤’meillkkmnmmoonnoooqrprqqrsqrrrrtttsstuuttswwxwvw|yvvyzzwxxzzzzzyz{{|||||z}}}}}{||}��€‚�~~‚‚‚‚‚€�€‚‚ƒ‚‚‚„�‚„…„ƒ„…„ƒƒ„……‡†ƒƒ†‡ˆ‡††ˆˆŠ‰ˆ†††‰‹‰ˆˆ‰ŠŠˆˆ‰Œ��‹Œ‹‹‹Ž�ŒŒŽ��Œ��Ž�ŒŒ���ŽŽ�ŽŽ��ŽŒ�’��ŒŽ�‘‘“‘‘�‘‘‘““‘���‘‘‘‘““““”“““’“––•“�’•–••••”——–““’”“‘��ŽŽŒŠ~lI8<;866664349:;7678979<>@CBHLMOV[\[_ffai~’˜–—›žž��ŸŸ ¡Ÿž¡¡  ££¢¡¤¢¢¢¤¤¤¤¥¦§¦¤¤¤¦¦¨§¥¥ª¨§¨¦¤¦¨©¨¨§§§¨¦¤¥¨ª§§¥§§§¨«©¨¦¨¥¤£¦§©©¨©«ª¨¨¨©ª¨¨©¦¨©©¦¦¥©ªª§©¨¨©««ªª©¨©««ª¨©¨¨ª¬¨©©ª¨ªªª©ª©©¨ª©©§§§©«ª¨¥¥¤¨ªª¨§¦¦§©¨¦¥§§§¥¦¨©¨§©ª¨¨§¥¥¥¨¨¨¨¦¤¥§¨¦¦¦¦££¤©©¥¥££¤¦¦¦¦§¥¥¥§¤£¢£§Âéÿýöö§¤“pfhjkkmlkknnmmmnonooqqonqssrttrsttsstvuutvvvvwwxxxwwxyzzyyz||yywxz{{}||{zxz|}|||}~~€�€~€€ƒ€��ƒƒ�€‚‚„ƒ€�ƒƒƒƒ„„ƒ„„………ƒ„„„„‡ˆˆ‡ˆ†ˆˆ‡…†ˆŠ†„†‡ˆˆ‡††‰ŠŠŠ‰‰‰�ŒŠ‰‹��‹�ŒŒŽ�‹‹‹Œ�Ž�Œ�Ž�Ž�ŠŒ�Ž�����‘����‘���ŽŽ‘’’�‘��‘“’“““’““•–••–—•““””“”•”•”““•–˜•“’’”—•“�ŽŽ�Œ€gI:<944453437>?>@BFJMPWZYWY^ZXbyŠ��“–––™››™››œ�žŸŸžŸ�žŸ�›�¢¢žœžžžžŸŸ žžŸ ŸŸŸ   ¢ ž    £¤£¢  Ÿ£££¡¡ ¡£¢ ¡¡¢££££¢¡¢£¤££¢££¤¡ŸŸ¢¤¤¤¤¢¡¡£¤¤££¤££¤¦£££¦¦¦¤¦¦¤£££¤¢¢¤¨¤¢£¤¤£¤¤¥¤£¡¢£¤¤¤£¤££¡¢¢¢¢¢££ ¡ ¡¡¡¢¢£¡ŸŸ ¡¢¢¢£¢¡££ Ÿ¢ ¡¡¢¡¡£¡Ÿ    Ÿ Ÿ¡   ¡   ¢ŸžžŸŸ¢¢Ÿžž£ºÝöùôò¬ª•tiknnnoopqoqqqpqrrrttttwvttwwwvvvxzxxxyyyxyy|{{y{{||}}}}~€~}}~~~~~€€~}~�‚€‚‚�‚‚‚ƒ†…„„„ƒ„„ƒ„„…„„……„†‡‡‡ˆ‡ˆˆˆ†††‡‡‰ˆ‡‰‰‰‡‰‹ŽŽ‹‰ŠŠ‹ŠŠ‰‰ˆ‹‹ŽŽŒŠŒŒ‹‹��‹ŒŽŽ�����’’‘Ž�‘“””‘‘‘’’’��‘““‘���‘’‘‘�’””’““”“’“––•••”‘“•••——–•—––––––—›™—˜™š›š™™™›œ››ššœœ›™›™™šœšš——•“�Š~dI>=:9973368:>ABBJORRV[`__`aWVe|Ž•–—šš›œ�œ�Ÿ¡¡  ¡¡¡ ¢£¢£¤££££££££¤¤¥¦§¤¤¤¤£¥¥¥¥¦¦¦¥§¥¤§ª©¦¥¤¤¤¦¦¥¤¥¦¨¦§¦§¦¦¦§¨¨¦¦¥¤¥¦¦¦¨¥§¨ª¦§§§§©©¨§¨¨©§§©ª¦¨ª«ª«ª¨©©ªª©¨©©«¬¬«ª§©§§§©¨¦¥¥¨ª©¦§©©§¨¨©©§¦¨§§§ªª¨¦©¨§¥¥¦§§§§¦§¨«ªª©«¦¤¤¦¦§¨¦¤§§§§§¦¥¤¥¥¥¦¦¦¤¤¤¦¦¦¤¦¦¥¤¤¢¢¡¥ºÞùþøô¨¥•vjgiikklmonooonnnonnprqqrpprutrprttsuvwuuuwvvvwwxwvwyzyyxxxyz{y{|~|{yyyz{|z{}~}}}{|}|~~€�€~~‚�ƒƒƒ‚‚ƒƒƒƒ„ƒ‚�ƒƒ……††„ƒ……†…††ˆ†……‡‰ˆ‡†††ˆˆˆ†‡ˆŠ††‡ŠŠˆˆŠŠŠŠ‹‹‹ŠŠ‹ŽŽ‹‹‹��ŽŽŽŽŽ��‹���Œ�Ž���ŒŒŽ�‘����‘”““‘’’”••“‘’““““‘�‘”•–••••“’‘““–”•”•••“”‘‘••““”“’’“�Œ‹Œ†x^G==9758855667:;942212688:?CFEHMQTY[bfeeilp��‘”—™™˜˜™™›››œ�ššš›œ  ž�žŸŸžŸ ŸŸŸ¡ Ÿžž¢¤¡ ž��Ÿž   ŸŸŸ£¤ ŸŸŸ¡¡ŸŸŸ Ÿžž¡ŸŸŸ¡¢¡Ÿ  ¢£¡¡¡Ÿ¡¢¡¡¡¡ŸŸ ¢ ¡ ¢££¡¡ ¡¡££¦¤¢¢¥¤¢¢¢¢¡£¡  ¡¡£¥¦£¡¡¥¤¢¡¤£¢¢£¤¤££¡¡¡¡¡¡£££¢¡ ¤¢ Ÿ£ ŸŸ ¡¢£¢¢¡ŸŸ¡¡¡ ŸŸ Ÿž�  ¡Ÿ��¡¤£ Ÿ  žž ¡ ¢£¡ŸŸŸŸ ŸŸž¡žœœ¡²Ôöýö󬪞njoommoooqrqssrqrttttttuuuvwwxwwvwx{{zxxzzz|~~}}||~~~}}{|}€‚}}|€€~}€�……ƒƒ‚‚���‚‚„ƒƒƒ†††††…††‡††††††‡‡ˆˆŠ‰‡†‡‡ˆˆ‰ˆˆ‰Š‡†‡ŠŒ�‹‰‰‰‰‰‰‰Š‹‹ŠŠ‹�Œ�Œ�Œ�Ž��Ž����Ž����‘‘�����Ž��“”‘‘‘’�‘’““‘‘’’“••••••–”““•••““•——•••–˜—–––——––——šš˜•—˜™———™———™——˜›š™——˜™˜—–““‘�ˆvPA>:8:97678<>@BAACFJQRSU[ckjdcmv‡”—–—™›œ�ŸŸž £¤£¡  £¢¡¡£¢¢¢¤££¥¥¢¤£¤¤¢¢¤¨¦¥¥¥¥¦¤¤£¥¥¦¦¦¤¥¥§¦¦¦¤¤¦§§¥¥§§§¨¨¤¥¦§¦©©¦¥¥¥§ªª¨¨§¦¦¨¨¥¦§ª¨§¦§§§§¨¦§§ªª©ªª§©¨¨¨¨§§§¨©§¨¨©¨¨§§¦¨§§§ªª«ª©§§¦¨©©¨¨§¥§§¨¨¥¤¦¨§¥¨¦¤¤¨¨§¦¤¤¦¥§¨¦§¦¤¥¦¦§¥¤£¤¥§¦§¥¦¦¦§©¨§¦¤£¤¥¥¥¤¤£¥¤£¢¤¥·Ùúÿú÷©¦›~jdiijkkmmnppnpoomrrqqqqrqqqrrtttttuuuuuuwvuuuuwwxvvvxxxxxx{{zxyzz}}}||{}|}~€~|}~�€~€~~€€�€€���‚€€€�€‚„†…ƒ‚ƒƒƒ„„„‚„††…†„…†‡……†ˆ†††††ˆ‡‡‡ˆˆ‡‡‡‰‡‡ˆ‰‰Š‰‹�ŽŠŠ‰ŠŒ��ŽŽ���ŠŠ‹�Œ‹‹ŒŽ�ŽŽŽŽŽŽ���Ž��ŽŽ�‘‘‘‘����’‘‘Ž��’‘‘‘’’’‘’’“••“’‘“”””••’’“•’’“•••’“‘“•“ŽŒ‹Š„sN>><<99999=>AABACGHGLQUTW[_afjlp�’‘“””–—™™››››žœœ›œœ�žž�œœž ¡£ �œ� £ žœž ¢¢ ��ž¡¡Ÿžœž ¡ŸŸœ�Ÿ¡¡¡ Ÿ��Ÿ¡ ¡ ¢¢¢£¤¢  ¡£¡ ¡¢¡¢¤£ ŸŸ¢££Ÿ ¢£¡¡¢¢¡¡  ¡¡£¤£¢¢¢£££¢¢¢¤£¢¢¤¡¡¤£  £¤¢ ¡¢¢¢¤¥¦£¢¡¢ £¤¤¢¢   ¡¡¡¡ŸŸ ¡ŸŸ ¡ ¢¡ ž Ÿ ¡¡Ÿžž   Ÿ   ŸŸŸŸŸ¡¡ŸŸ� ¡ ŸŸž¡¡ žŸžžžŸŸžž­Ðõûóð¬¬�„njnomnoopqpqqrrrrrttsrtwxvvtwxxwwwyyxxwwy{{zzzz|z|}||}|~~~}~}}}~~ƒ‚€�ƒ�€€€�„„ƒ‚……ƒƒ…†„„…†„„†‡‡…„††ˆ‡††ˆˆˆˆˆˆˆ‡‡‡‰‰ˆŠŒŒŠ‰ˆ‹�Ž‹‹ŠŠ‰‹‹Ž�ŒŠ‹‹Œ‹ŠŠŒ���ŒŽ��ŽŽŒ������‘���‘��‘‘��‘‘‘‘’’’’“’’’“’““”•–••”•“‘’••˜™•””•“““•—˜˜˜™™–—˜š™˜–——˜˜—————˜˜˜––—™——““��މrN@@:<<=@?<<@@BFFELLNRUVZZ_a`eoty…”••—˜››œžŸžžž   žžŸ¡¡¡¡£££¤¥¤¤£ ¡£¥£¢ ¢¦¨¦¤£¤¤¥£££££¦¦¥¤£¢£¦¦¥¤¥¥¦¦¦¤¦¦§¥£¤¦¥¨¦¥£¥¦¦¦¨¨¥¦§©©¨§¦¦¨¨¦§ª©§¥¨©¨§¨©ªª¨¨¨§¦¥§¦¥¥¥¦¤¤¥§¥¤¥©¨§§©§¤¤§¦¦©§¥¤§¨©¦¦¦§¤¤¤¦¥¥¤¤¤¦¦¤££¥¦§§¤¢£¥¥£¥¥¥¡¢£¥£££¤¢¢£¤¤¥£¢£¥¥¦¦¥¥¤¥¥¨¦¤¡¢¡£¥§¤§´Ôùÿøö¦¦�„nehkllkjkknnnmmmonoooopsrpprrqqqrrrttuutsutwxxvwxywxvvvwxxxxz{zz||{x{{{{|{{|~~~}{{}}|}|}}€~~ƒ�~€�‚‚��ƒ��‚„‚�‚„„„‚ƒ…†„………„…„………†‡ˆ‡……†ˆˆ†††‡†††‡‡ˆ‰Š‰‰Š‹‰ˆ‡ŠŠ‹��‹ŒŒŒŒ‹ŠŠ�ŒŒŒŒŒŽ��ŒŒŒŽŽŽ��ŽŽŽŽŽ�Ž��ŽŒŒ������’‘�����‘‘’“’’’“”“••—•“‘‘“”““‘’’””•“‘‘“’���އsM@A=:;=A>;<=<@CEFJNPPQUYZ\__dkpq~Ž‘�‘”————šš›œ›š››››šš›���žž�Ÿžžœœ�žžŸžžœ�ŸŸŸžžžŸ  ŸŸž  ¢¡Ÿ›�  ž¡žžŸ   £¢ž�Ÿ¡¡ŸŸŸ¢£¡Ÿ ¡¢¢¢ ¡ ¡¢¡ ¡¡¡¢¢¢¡¡¢¤£¤¡¢¢¢ ¡¡¡££ ¡¡¡ŸŸŸ ¡ŸŸŸ¡¡¢¡ Ÿ¢¢¢Ÿ¡¡¢¢¢ ŸŸŸž  ŸžžŸ ¡ ŸŸŸŸ ŸžžŸŸŸžŸŸžž ¢¡ ŸŸ ¡ŸŸžŸžžŸ ŸŸŸ¢¡ŸžŸ  žž�žŸŸ�žžžŸŸžž��«Ëñøñ着¢‰pflpppmmnqpprrqrqsrrstttuuuvvuwwvuwxyxxwwy{xxx{{{z{z}~zz|~}}}~~~~~~~~~|~��}����‚€€�‚‚‚‚‚‚‚„„‚„…ƒ…†‡…‡‡†††‡‰†……†††††††ˆŠ‹‡‡‡ˆŠŠˆ‰‰‹‹‹Š‹‹‹‹�ŒŠŠ‹��Œ‹Œ��Œ‹�ŽŽ��ŽŒŽŽŽŽ��Ž��‘�Ž�’’������’““���‘‘’’’’’’’”•““”––“““••””••————–””—™™———™˜——˜™™———˜—˜—˜˜˜–––™—–“•›œ�sQFF@>;=AB?AAEGIHIKMOTVX\]_bekrur~“–””—›�œžžžž¡¢£¡ŸžžŸ¡¢¡  ¢¡¢¢£££¢££¤££¢£¢£¢¤¤¤¤¦¥£¢£¥¥¥¥¥£¢¢¥¤££¥¤£¤¥¤¥¥¤¢£¤¥¤¥¥¤¥¥£¢¥¦¥¢¢¢¤¦ª§¦¥¨¨§¦¦§§¦ª«¨§¨¨¨©¨¨¦¦¥¨ªª¨§¥¥¨¨¦¥£¤¥§¥¤¦¦¦¦¨¨¨¨§¤¤¥¥¤¦¦¦¥¦¨©¦¥¤¤¥¦¦¥¦¥¥¦¦¤¦¦¤£¥¤¤£¦¤¤¦¤¢££¢¢£¤¤£¥¥¢¢£¤£¥¥¥¤¤¢¢¢¤¤£¡¡¡£¡¡£®Î÷ýóô¥¥�ˆmdgkjjilmmmommnooopoooqqqpprsqrrsstttuvuuuuuvvvuuwxxuuuvvxwxxzzzy{zz{||{}}}{~}{{{|~}|~~~€€€~~�ƒ�€�‚„„„„„�‚ƒ‚‚ƒ‚ƒƒ„……ƒƒ„†††‡‡…„†‡ˆ†‡ˆŠˆˆ„……‰Šˆ†‡‡‡ˆŠŠ‰‹Œ‹ˆˆ‰Š‰‰‰ŠŠ‹ŠŒ����ŒŒŠŠŒŽŽ�ŽŽŽŽŽŽ�Ž�ŽŽŒŽ�����Ž�’“”’���‘‘““‘�‘’‘�‘‘‘‘““”“”““‘’’”•“‘�’”•““““��“�Ÿ‘nNBD=;9=<=?A??DECEGINRTW[Y`ebcjom{‘‘‘’•—˜˜——™›™˜™���š›šœ›œ›�›œ�ŸŸžž�žžŸŸŸœœ›žœœœŸŸžž¡ ž��žŸ�žŸŸŸ¡ žœœ Ÿžž ŸŸŸ¡     ¡¡£¢¤¤¡ŸŸ¢¢¡¢££¤¢ Ÿ Ÿ¡¡¡  ¡¡¡£¡¡¡¡ŸŸŸ¡¢¡ ŸŸž¢ ŸžŸ ¡¡¢¡¡¢££¤¡  ¢¢ ŸŸ ¡¡¡¡ ¢ ŸžžŸ¡   ¡¡¡Ÿžž¡¡ ¡¡   žžŸ¢   Ÿ�žžž��žŸžžž   ŸŸŸ  Ÿ ž�œž�›™œ�Ÿ©Ëóøðñ­« Špejmooomnprqrqqqtttttsttvvsuuuvxwvwyyzxxy|{zzxwxxz{{{|{{||}}}}€~}€€~~€�€€�ƒ‚€€‚ƒ…†…‚‚ƒ…††‚�„†„„…†……†††…‡‡…†ˆ†ˆˆˆ†‰‹Šˆ††Š‹Š‰‹‹Œ‹Š‰‰‹�ŒŠŠ‹‹‰ŠŠ‹‹ŽŒŒŒ�Ž������ŒŒŽ���‘�Ž�Ž‘��Ž�‘‘‘’�‘‘““’��’•””•’’”•••“•–—–—–———•”–š˜”•–—˜˜——–——™—––™™™˜™—˜—˜š™–•–˜˜—–“—¢©™xWJFB>>>?>???@CABDHKOUWZ_a`__fool|’•˜š˜š›žœœœŸ¡ŸžŸ¢¢    ¢¡  £¢£¥¦¤¤¤¦¦¤£¢¢¤£ ¡¡¢£¥¥£¡¢¤¤¤¥££¤¦¥¤£¦¦£¢¤¥¤¤¥§¤¤¥¦¤¤¥§¥¥¥¦¥¥¥¥¥¥¤¥¦§¦¦¦¦§§¦¤¤¤§¦¦¥¥£¥¥¦¤£¤¦¦¦¥¤£¤¤¥¦¥¥¥¦¥¦¦¥¥¨¨¨¨¨¦¨¥¥¥§¦¤¥§§¥¥¥¦¦¦¤££¦¦¦¦¥¢¢¢£¢£¡¡¢¤¤¤¦¤£¢¢¤¨¥¢¢£¢¢£¤¤¤£¢¢¥¥¥¦¥£¢¤¥¤¤¤¡ Ÿ ¡£¡¬Ìùþó𦥜„jbhiiklkjklmmmmooomnmoopqpnqqpprtsrrtttuutvuuuuuwwxwwvvvyyxxwwwxxy{{xzzzy{|}z{|}|~~}|}~��~�€€€ƒ€€€‚‚‚�ƒ„ƒƒ„ƒ��ƒ„ƒƒƒ„ƒƒ‚ƒƒ……„„……ˆ†……†‡‡‡†…†††‡ˆˆ‡‡‡‰ˆ‰‰Šˆˆ‰Š‰ŠŠŒ‹Š‰‹‹‹ŒŒŠŠ�‹ŠŒŽŒŒŒ��ŽŽŽŽŽ�’�‘��Ž‘’����������‘’‘��‘��‘“““‘’““’‘’’‘‘“”•‘“““‘��‘’’‘‘�–Ÿ¤—uPFD<=<<<>?CCA??AFHNPQPU\bccdgjll~’’—™˜–——˜™˜˜›šš�Ÿ�œššœžžœœœžžž�ŸŸžž žžžžžžœŸŸœ›žŸ  žž�ŸŸ   ŸžœŸ ¡ŸžœŸ¡   ŸŸŸŸŸ¢¡�Ÿ £ ¡¡¢ŸŸŸ¡  ¡¤¢Ÿ ¢ŸŸ¡¢ ¡Ÿžž  Ÿ¢¡ Ÿ  ¡Ÿžž   ŸŸ�ŸŸ¡¡ŸŸŸ¢¢¢  žŸŸ    £ ŸŸŸŸ  ŸŸžžžžž�ž ŸžžŸžŸžžžŸžžžžžŸŸŸž¡Ÿœ›žŸžž���  ŸŸžžžž ŸŸŸŸœœœ�œ›››ŸªËöøî �pfjnmmmoonpsqpprsqqruuuvvrrrutuwxvwwyyyxy{{{{zxxyzx{||{}||{{{}~~~~}}~~€�€€�ƒ‚‚‚‚‚„…††„ƒƒ„‡ˆ†„ƒ…†‡…‡‡††‡‡‡‡‰‰‰‰Š‰ˆˆˆ‡‡‰Š‹Œ�ŒŠˆŠ‹Œ‹‹‰‰Š�Œ‹Š‹Œ�Ž�Ž������ŒŽŽ��Ž�‘��Ž��’’‘��““’’’’’’““’��“–“‘‘”••’“”•”–•”•˜•“•———˜–••˜˜˜˜˜—š›œ™—————™›˜–—š˜••———š—–˜¥«£‚XDBABA>>AFFHHCABGLOSUUYbca_dioos‚�’ž¥�˜˜œž�œžŸŸ £ŸŸŸ£¢¢¡¡ ¡Ÿ¡¤¤¡¡¡££££££¤¦¤¤¢£¢¢¢¥¤¢¢¥§§¥¥¤¤¥¦§§¦§§£¤¥¦¤¥¥¥¥¥¥§¦¦¥§¦¥¦§§¨¦£¤¦¨¨§§§§ªª©¥¥¦¨¦¥¥¦¥¥§¨¨¦§§¦¦¥¥¦¥¥¤¥¤¥¥¥¥¦¦§§¨¨¨¦¦¦¨¨§¤¡¤¦§¦¦¤¤¤£¢¥¤££¤¤££¥¤£¤¤¤¥¥££¡¢¢¥¥¥¤£¢¤£¤££¢¤¤£¤¤£¤¢¡¢¤¥¤£¤¥££¢£¢¡ ¡¢¢¡¤­Ìøüòô¥¥žˆkbhiiilkkjllnnnmnnppnopqomjgltsrpsttrssttvuvvustuvvvvvwwwvuuwzzxxx{zyxxyz{}{{|}}||}~~~~~€�~~€���€€€€€�‚‚‚€€�‚‚ƒƒ…ƒ‚�„†…�ƒ„…†ˆ‡…„………††……‡‡…„††ˆˆ‡‡‰‰‰ŠŠˆ‰ŠŠˆˆ‡‡‰‹Œ‰‰ŠŒ‹ŒŒŽŒŒŒ��ŒŒŒŒŒŒ���Ž����‘�ŽŽŽ‘‘‘��Ž�’’���‘‘’’’‘��’“““““““’“••‘’‘’‘““””“‘‘‘‘‘�‘“˜�¡œ€PEB====@AABEEFGHIKNQQSZaa`dhjjnw„ˆ‰�¬¢—”˜——™žœ››œœ›œœœœœœ���›œœœ›œ›œ�ŸŸ �››Ÿ Ÿžœ��ŸŸŸžž £  Ÿ � ¢¢Ÿž�žžŸ££¡ž��ŸŸ¡   ¡  Ÿ ž žž ¡Ÿ  ¡¡¢¢  ¢¢Ÿžž¢£¢ ¡¢¢  ŸŸŸ ŸŸ�     ¡¡ žŸžŸ £  Ÿ¢¡¢¡¢¢¢ ¡¡ŸŸ  ¡¡ŸŸžŸŸŸžžž�›žŸŸž    ŸŸžžŸŸ�žžž��žžŸ¡ž›š�ž  ŸŸŸž�žŸ����œžŸ���œž¨Åðõñ睊£‘qdkmmmnnlmopqrqrttrtttsssuspruuuwyxvwwxxxxzzzxxxzxxyzxy|~}|{{{|}}}~~~~~�€��~��€�‚ƒ‚ƒƒƒ‚��‚ƒƒ„„†„„ƒ……‡†……†…‡‡‡…‡‰‰‰‰ŠŒŒ‰ˆˆ‰‰ŠŠ‹‹Œ‹‹Œ‹‰‹‹ŠŠŠŒŽ�Œ‹Š‹‹‹‹Ž����������Ž�����‘‘‘�‘‘‘�’’”’��’’•“““““’�‘“”””””–•••–––””•—•”•————————————˜š——˜™˜˜———š™˜–˜•””•—Ÿ©¬¤‡UGGB??BBBDHHKKIJOOPQUVY\\bhjjkmrŠŠ£´«š—œžžžœŸ ¡¡££¢£££¢¢¡    ¡¡ ž¡£¦¥¥¤¤¢¤¥¥£¤¤£££££¦¦¦¥§¤¤¤¦¦§§¦¤¥¤¤¤¦¦¦¤£¢¢¥§¦£¤¤¤¥¥¤¥¥¥¤¤¥¨§¨§§§¨¦¦¨¨¥¥¥§¦£££¨¨§§¥¤¤¢¤¥§¤¤¤¥¥§§§§¥££¥¥¤¤£¥¦§©¦¦¤¦¦§©¨¤¤¤¤£¤££££££¤£££¤£¤¤¥¤¤£¤¥¦¥¤¡  £¢¢¢  ¡£¡¡¡¡¡¤£££¤£¤¢¢ ¡  £¤£  ££©Èõüöø¢¥ Žlbhjhjjjjjjlmnmklmoooooonnppqqrrqqrrtssrttttuutttvvvvvuwwwvwxzwwwxxxxxyz||}|zz|||}}}}~|}~~~�€��~‚‚€‚ƒƒ�‚‚ƒ„‚„…„‚„„ƒ‚‚„…„††ƒ†††ƒ…†ˆ†„„ˆˆ‰Šˆ‡‡†‰ˆ…†ˆŠŠˆ‡‰Š‹ŠŠŠŠŠŒŠŠ‹�‹ŠŒŽŒŠ‹‹‹Œ�Œ‹‹�Ž�Š‹Œ�Ž�����ŽŒ�““�����������‘‘’�‘’“‘’’“““““““’’““”’��‘��’—ž££�ƒXEA>AA@>>>?DGGBFMPRTUTY`[Y\ehllkx…ƒ›°«˜‘—™˜—™››™š™™™›š›�žœœšššœžž�����Ÿ¡Ÿžœ�ž�œŸž�œ�žž›œœžžžŸ�œ�Ÿ Ÿ�žŸ Ÿž�Ÿ�žŸŸŸ¡ŸžžŸ¡¡ŸŸž ¡ŸžŸ¡ ŸŸ  žŸŸ¡¤¡žœž ¡¡¡ŸŸž  Ÿ¡  ŸŸŸ¡Ÿ ŸŸž ŸŸž  ŸžžžŸ ¡ Ÿ Ÿžž ¡ŸžŸŸ ž��Ÿžœœ�œ�œœ�Ÿž�ŸŸŸžž�œ›ž���žœœ›žžž��œž��žŸžžœœ��œ›œ›œœœœžžž¥Åðöíî©©£”rckmmlommmpqqppprrsstwxvuuwwutsstwvvwzxxxyz{ywwz|zxx{|||}{{|}|{~~��~}}}������€~€ƒƒ�~€€‚ƒƒ�‚‚ƒ‚„„„…††…„„„…†ˆˆˆˆ‡‡‡‡‡ˆ‡ˆ‡ˆ‡‡†ˆˆ‰ˆˆˆŠ‹ŒŒ‰‰‰‹‹‹‹‹‰‹‹‹Š�ŠŠŠŒŒŒŒ���Œ�ŽŽ��‘�Ž���‘�‘‘’’’�‘���’’”“‘‘’‘‘‘’’‘“••“”““’’’””““”””“•––•”•––——•–•——š˜˜˜˜——•˜š™—–––––™ ¦§©¢ŠcOFECB@CDEBHMMIINW[[YWZ][Y[^ippm{†…Ÿ¸³ —›ž¢ ���ŸŸ¡¡ŸŸŸ ¢¢£ŸŸ¡¥££¡¡¡£¡¡¢¤¤£¢¤¦¤¢£¤£££¥¤£¤§¦¥££¦¨¦¦¥¥£¤¥¦¦¤¤¤¥¥¥£¥¥¤£¤¤¦¥¥¥§¦¦¥©©§§¥¤¥§¦¥¤¤£¦¥¦¥¦§¨¥¦¥¦¥¥¤¥¥¥££¤¤££¤¥¥£££¦¦¦¥¥£¤¤¥¤¤£¢£¥¥§¦¤¤¢¢¤¥£¤¥¥¤¤£¤¢¡ ¡£¥£¢¢£¢££££¤£ŸŸ ¢ £¤£¡££££¤¤¢¢£¢¢££¡¢£¢¢£¤   ¡¢ªÈöùòò¤¥¤‘objljikkklmllmmnmmoqqpopopppprssqrsssstuuuuuvuutvvxxwvvvwxzxxyyxxxyzxxxz{}}}{{zzz{{~~€€€€€€€~����ƒ‚�€�ƒƒƒ„‚‚ƒ„…„ƒƒ…„††…„…„†††„„…‡ˆ‰†„ƒ…†ˆ‰†…†‰‰ˆ‰‹‰‰‰‹‰ŠŠŒŒŒŠ‹Š‹‹‹ŠŠŠ‹Œ‹ŒŒŽŽŽŒŒŠŒ��‹ŒŽ�����‘““���������Ž�’’“���’’“’“””’’“’’’’�“•–”“’“’“‘’’“œ¦§§ŸŠkUIG?>CDDDCBFJKLRWVTXXVRSY__dhjq{€œ±°¤™”——˜š™™š™šššš›œž��œœžŸŸŸŸžž�œš�ž ŸœšžŸ Ÿ�›���žŸŸŸŸŸŸŸ ŸŸŸ¢ ž��Ÿ Ÿ  ž�ž ¢¢¡ŸžžŸ¡ ŸŸŸŸ¡ ŸŸŸžŸ ¡¡£¢ Ÿ ŸŸŸžŸ£¢¡¢¡ ž  ¡Ÿž�žžŸŸ¡¡¡   ¡  ž��  �ŸŸ¡ ŸžŸžŸŸŸœ�žŸžžžŸžž�ž ž�›���œžžŸ�ž›œž��Ÿ�œœžžž žœ�ŸŸž�žžž���Ÿž�œœšš›��žž¦Äîñêì««¥—qeiljlmnnoonmnoqsrqptttttsttuuvvutvwxxxxwwx{zyy{{}}{yyz||}}}}}||y|~~~~�~}~�€���€��ƒƒƒ‚‚‚‚‚‚ƒ„……„‚‚„††††‡‡‡†‡ˆ‰‡ˆ††‡‰ˆ‡‡‰‹‹‰‡ˆŠŒŠŠˆˆˆ‹ŒŒŠŠ‰ŠŠ‹‹ŒŒŒŽŽŒŒŒŒŒ‹Œ����ŽŽ�����‘’‘��������‘��‘”””“””””’‘••••––••“’”””•••””••”––˜—š—••˜—••—––—————˜˜˜š—•”•˜£««©¥–yWIHFEFCCEFFINLNSYWVWZZ[\^_bejpuy}…ž²µ°¡—™�ž��žŸŸ £¡ŸŸ¡¢¢¡¢   ¢¢££¡ ¢¤¤££¢¡££¤¢¡   ¢¢£¢¢¤§¥¤¤£¤¦¦£¢¢££¤¥£¡¡¡¤¤££¥¥¤¤¤¤¦¦¥¤££¤¦¥¨§¥¢¤£¢¢¥¤¤¤¦¦¤¢¤¤¤£££¤¤¤¢¢¤£¥¤¤£¢¢¤¥¥¢££¦©§¢¢£¥§§¥¤£¢¢££¤¤  ¡¦¤¢¢¤¡ ¡£¤¤£¡Ÿ ¡¢££££¢ŸŸ ¥£££¢¡£¤£¡¤££££¢¢¢£¤¤¦¦£ ¢¢   ŸŸž Ÿ ¨Çóúòñ¤¥¢’m`hkhgihjkllmmnmmmponmoopqpppqqqpprtrqqrsttutttvvvvwvuuwzyxxyxyyyxy{|zxx{}}|{{{zz{{|}{z|~~}}}~~~~€€���€�‚‚‚‚ƒƒƒƒ‚ƒ„††…‚…†‡………‡‡…„„…††‡ˆˆ‡††……‡Š‡††‰ˆˆ‰‹‰‰‰ŠŠ‹‹‰‰ŠŒŒŒŠŠ‹ŽŒŠŠŒŒ‹‹‹‹‹Š‹Œ�ŒŒŒ��ŽŽ�ŒŒŒ����Ž‘�‘’’��‘“’‘�‘’””“‘��‘“’’‘“”•‘‘‘““–•“‘“••“•˜œ£©«¨�†[EKIB@DHKIGIMMOSUUTU\^Z]accejpnnsƒ™¨¨¥›“”—˜š˜™™šššœžŸŸž›››�›››�œœ›œ››œ Ÿ�œž�����œ����ŸŸŸž�� Ÿ�� ž���œžŸ  žžžŸŸ¡¢¢ŸŸžŸ ¢ ¡ŸŸŸ  ¡ ž�žŸ�œœ��ž  �žžŸ ¡ŸŸžžž ŸŸŸ¡ŸžŸŸžŸŸžŸŸŸ ŸžžžŸŸ  žžžŸž�Ÿžœœ�žžŸŸŸžŸŸžžž�ŸŸ žœ� žžž  Ÿž�žžžžŸŸ������ž��œžžž�ž���œœœœ›šš››�ž¤Àïõî쨧¤•rcjllmnmlmoppppqqqqqrsqsttsuvwtssvxwwvyywwxxyxwvzzzzzy{{||{|}}}}||}~~|}}~��€€�€‚„‚‚‚‚‚ƒƒ„„…††„„„…„…†‡†‡ˆ‰ˆ‡ˆˆˆ††ˆŠ‰‰ˆˆ‡‰‡ˆˆ‰Š‹‹Šˆ‰‹�Œ‰ˆ‰‹‹ŒŽŒŒŒŒ�ŒŒŒŽŒ���ŽŽ�����������ŽŽŽ��‘��‘’‘’””�““••“‘�’””“““•–—•”“•––”–—™–••˜˜™—–””—™™™˜———™–—––˜›—•”—šŸ£¨««¬«›kIJIFIMOKKKNNPRURUUSUWY^adfltvqpy‰’œ©­¥™˜™œ���¡¡ žŸŸ Ÿ�Ÿ¢¢Ÿ   ¡£  ¡¢ ¢¢¢  žŸ £¡¡¡¡£¥¤¡¢££¥¥££¡£¦¥ ¡£¥¤£¡¢£££¦§¦¢¡£££¥¥¤£¥¦¥¦¤¤¦¨¦¥¤¦¤¥§¦£¤¤£¤¥§§§§§¥¥¤¥¦¤Ÿ £¥£¢¡¤¥¥¤¤¤¤¥¦¥££££¢¤¤¤¤¤¢¤¦¦£¢ ¡¡¢¢£¢¢¢¡¡¢¤¤¢¡¡  ¢¥¤¢¡¡¡£££¢££¤¤¤¤£¢¢¢¢¢¢£¡¡¡¤¢¡¡¢Ÿ�Ÿ  ¡Ÿž�ž §Ãôüóò¤¥ “m_eiggfhhiikkklmklmnonnnppnoppoprqsstssrstvutttutssvvutwzzxxx{xxxwwy{{zzxy|}{xz{|}}}~}}|}}~}~€}}‚ƒ~��ƒ‚€‚‚ƒƒ„ƒƒ‚„ƒƒ‚ƒƒ……„„„…………„„…††…†„…††…‡‡ˆ‡‡†‰‹‹ŠŠŠŠŠŠŠŠŠŠŠ‰ˆˆŠŠ‹‰‹Š‰‰Œ��‹ŠŒ�Œ‹ŒŽ�Ž�Ž‘‘��‘�ŽŽ‘����‘‘��‘“••’���‘””””’‘�“”“‘‘‘”””“““””“’’””–œ ¢ªª¢››WFEGIIIIGGKNJJNOOOKLOSUY^cddfmr|ˆ’˜¢¨¤œ––——˜š™˜˜›››š›™›š›™šœž››œš™›š�Ÿžœ›�ž�›œœž���Ÿžžœ���žŸžž�žŸŸŸžžžŸž�žŸ�ž ¡žŸ £   ¡žžŸŸ ¡¡  žŸŸ  žž  ¡£¤¡Ÿ�ž¡¡��›�žŸŸ¡Ÿ�žžžŸ Ÿžž ŸœœŸ ¡¡¡žž�Ÿ�Ÿ  ŸŸž�ž ¢ŸŸ�žžžžŸŸŸŸŸ��žŸžž��Ÿ�œœœ�Ÿžž�žœž���ŸŸžœœ�ž�œ›œ��œš™œœ—™š›šœ¡¿íôì§—sdkljjnllmnnpoonpppppqrrttstttsuvvuwwwvxxwxyyzxxxxy{zxxyzy|||||z|}~}~|}~€€��€�����„ƒ‚�ƒ‚ƒ…„‚‡‰†��‚……………ƒ…‡‡ˆˆˆˆ†„‡‰‰‡‰ˆ‰‰‹‹‹ŒŒ‰‰ˆˆŠŒŒ‹‹Š‹ŒŒŒŒŒ‹Š‹Œ�����Ž��Ž��Ž������Ž�����Ž‘‘‘‘‘��’“““‘‘“•“’““•”“’””“”–••–˜——•“““”––•••——––——˜—–”–——————–————›Ÿ˜˜«¯šŽžšjGCKKJHJHHJMKMNMKNOIHNT^ggc_agv…‘•�¦§§¥š˜šžžŸŸŸžžžŸ¡  Ÿ Ÿ  ¡Ÿ¡£¢  ¡£££¢  ¢¥£ ¢¢¡¢¡££¢¢¤¤¤¢£¡¢£££££¤¤£¢¡ŸŸ££¡¢¤¤¥¥¨¦¤£¤££¢¤£££¥¥¥¦¦¥¤¤£££¤¦¦¥¦¥¥¤¦¦¤¡£¥¥£¢ ¢¢¢¢¢£¢£¤¦££¢£¢££££¤¦¨§¥££¢££££¤¤¤¦¥£¡¢¡¡¡¡¢¤¡ŸŸ¢¥¦¤¤£¢¢¡¡¢¤¤¢¡¢£££¤££¡££¤¡    £££¡Ÿ�ž¡ Ÿ Ÿžž §Áôúôô¤¥¢•o^fhgggikjjjjklmmmmpooooopppprsrpqrssuurrsuvuuwvvuvvvuuuvvvtuvvwywwxyyy{z{||zxx{{|||}~~~}}}�€}}€€~���€��ƒ�€€‚‚ƒ‚������‚ƒƒ‚‚ƒ„„‚„ƒ……‡‡‡……„††‡‡†…†††††ˆŠ‹Š‡†‰Š‰‡ˆˆ‰‰‹ŠŠ‰‹ŒŽŒ‰ˆŠ�ŽŽ�����ŒŒ����ŽŽ���ŽŽ��Ž�����‘‘‘���’��Ž���‘“’�Ž‘“”‘��’’’‘�‘’“‘‘’••••š•–¨¯¢–ŸšqE@HIIHHHFFFIKMLLKMEEIOYdc\SR[oƒ‘𡧬°©˜’•—˜˜™›œ™šš›šœš™š›››���œœ�Ÿ��žŸœœœ�ž ŸŸžŸ��žŸŸŸŸžœ�¡ �������žŸžŸ�žž��Ÿ  ŸŸŸŸŸŸŸŸŸžŸŸŸŸ ŸŸ�¡¡ŸŸŸ�Ÿ  Ÿ  ¢¡  ¡ ���¡¡ŸžžžžžŸžŸžžžŸ Ÿ�œžžŸ Ÿžžžž��›œ�žœž  žŸ�žž���žŸ����žž ž��Ÿžž��œžž�›œžž�ŸŸ�Ÿžœ›››œœœœœœž�œ›š—™™™›¢¼éòí쥧¤–rdjlilnmjlkmprpppqqpqqqrrpsuvtttuuuuvvwwxwwxxxyyxxxyyz{{z||~}}zz|~}~~~}}~€|~€~~}~‚€€€���‚ƒ‚‚‚„ƒ‚‚ƒƒ‚ƒƒ„…„‚ƒƒ†††…††…ƒ……††‡ˆˆ†‡ˆˆˆ‡‡ˆ‹Š‰ˆŠ‹ŒŠŠŠŠŠ‹‹‹ˆˆ‰‰‹��ŽŒŒŽ�Œ‹��ŽŽŽŽ��Š‹��’��������‘‘““’‘‘‘’””“”“”•—–••––•“”–––•“’“”––——••––—–—––””–————––––”—˜œ¢¨¨­¯¯¬¬£�HFHEFHIKIFEIRTJIMKJILNW`c^WS\l�”ž§²´´¬œ—œžžœ›œ�ŸŸ£¢ Ÿ ŸŸžŸŸ¡¢¢¢¢ Ÿ¡¡ ¢¤¤£¥¤ ¡ ¡ ¢¢£  ¡¥£££¡¡££¢  ¢¢£¤¥¤¢¡¢¢¥¤¢ £¤¤¤¥£¢¢¢¢¢¢£¦§¦¥¥¤¥¥¦¤¤£¤¤¥¤¤£¤£¢¤¤£££¢ ¡¤¥¥££¢¥¤¤¢¡ ££££¢¢¤£¡¢£¡¡¡ ¡£¤£££¥¤¤£¥¤£¡  ¡¡££¡  ¡¤¤¡¡¡¢¢¢ ¡¢¢ ¡¡¡¡¡ŸŸ £¡¢¢¢ Ÿ¢¢¡    ž�œŸžžžŸ¢¼ë÷ð𣤠“qbghgfhijjkkllllkknmmmollmpqpoprropqssrstvtrrtsssuuwwwwwwwvuvwyxwyyxzyyxzyy{{xyyz{{z||||}~|}|||~~~���‚��ƒ‚�ƒ‚‚‚�‚‚‚�‚‚ƒƒ„„…„„„„„†ˆ‡……ˆ‡†‡‡††††„…†ˆŠŠˆ‰ˆ‰ˆŠŒŒŠ‹ŒŒ‰‰‹��ŽŒ‹‹‹Ž�‹ŠŒŒ�Ž�ŽŽ�Ž�‹��‘��ŽŒ���‘��Ž��Ž�ŽŒ����‘“•“’���’“““’’’““““’�““”‘‘”šž¡£©®°®«£ƒNCFFGGHDCBDJ[bNEHGFFJKNU[[URVg|‹™§­¬©¦›——™–—›œšššš˜š›œ›™™™š›œ››šœ�Ÿžžžžž¡ ŸŸ  ŸŸ�žŸ�� Ÿ�œŸŸž››š��žžŸŸ��žŸ¡¡�žŸŸŸŸŸŸ�ž ¡žž�ŸŸŸŸ ŸžžŸžžžžž ¡ŸžžŸŸŸ¡¡�žŸŸœ›�ŸžŸŸ ŸŸŸŸŸž��œžŸ�›œŸŸŸž�œ��œœ�œ�žŸžŸž����ŸŸœœšš›ž�Ÿžž�ž��ž�›œ���ŸŸ��Ÿ�š��žžžœ››žž�›šš�œ™––—™˜–œ¶åñëꧦ¥˜vcilkkmmkklnopppoqqrrrppoqruuuutsttuvuuuvwwwyxxwwwz{zxyy{|{yyyzzxz|}}}|}{|~€||~€~~‚‚€ƒ„‚��ƒ………„„ƒ…ƒƒƒ…†‡‡‡ˆˆ„…‡‡……‡Š‰ˆ‰‡……Š‹‹‰‰ˆ‹ˆˆ‰Œ‹‹ŠŠ‰‰‰‰Š‹ŠˆˆŒŽŽŽ��‹ŽŽŽŒ�‘���Ž��ŽŽ��Ž��‘����Ž������’’��”•–”’’”“““••’”•–”’‘“–—––”•–•”•••”———•”––•˜™—–——•——�¢¨ª¬¯²²¯¯©‘cMGKLHDFEEGLRVLGGIKMKILW`_VQXix}–®´´®¤Ÿ›š�ŸŸŸž��ŸŸ ¡ŸŸ¡£¢¡žžŸ££Ÿ�Ÿ¢¥¥¤¡  £¤¥¤¤¢ Ÿ£¥¤¢¡¡¢¥¥¤¡ ¡¢¡¡ ¢¤¤££¡¡¡¤¥¥¤££¤¥¤¤£¥¥¥¥¤¡¡£¤¤¤¤£¢¢¤¥£¡¡¦§¥¤¥¥£££¤£¤¤£¡¡¢¥¤¢ ¢¢¥¥¤£¢¡¢££¢¢¤¤¤££¢¡Ÿ ¡£¡¡¡£¢¢¡£¤£ŸžŸŸŸ¡£¡ ¡¡Ÿ¡¡¡ ¡¡¢¡¡¡¢¢£¢¡£¥¤£¡ ¡¡¤£¢ ¡¡¡ ¡ Ÿœœœž���ž�¡ºêøòò¡¢¡“qafihihggjlkimllmnmmmmlkjkoqqnnnqqqppppprrsssstssrtvvttuvuvwvxwwwyxxwxyzyz{~}||{|}~}}}~|{~~}�~~‚€~~~€€�€~‚‚�ƒ‚ƒ‚ƒ„…ƒƒƒ„ƒƒ…†…„„†††ˆ‡‡……„„„††‡‡†…‡ˆŠ‰‡†‡‰‰‰‹‹ˆ‰‰ŠŠ‰ˆŠŠŠŠŒŠŠŠŽ�ŒŠ‹ŒŽŽŽŒŽŽŽŽŽŽŽŽ�Ž���’�ŽŽ��‘‘‘������ŽŽ�‘‘���”–•’‘‘“““’“’’’’’’“™ ¢¢¥¨¨ª­«¥™xOAJIKKFBBBGKNNFBFFHJFHMOOOOT]oŠŸ¨®¯²®¤š˜™™——–˜™™›��œ�œœ›š™œ››�Ÿœ�œ���œœŸ��žžžžœœ�  žœœœžŸ¡Ÿžœžžž  ���žŸ�����žŸ¡ �›œŸ¢Ÿž�ŸŸ  žžžŸžž  žž�ŸŸž�Ÿžž�žžŸŸ žœ�Ÿž�žž�ž¡ Ÿ›œžžž  ž���ŸŸŸ ž››�Ÿž�œœœœ�›���››šœœ�œ››››���œœœžŸœš›œœœ™›��››šœžŸžœšœœžž›ššš™™™›™™—˜�¸çôí줧§›ydjkkjjkmmomoqrqsrrpqrrqrrrtrqstsstuuwuuuwwwwwwxxxxzyxyz{zzz{{|||z|}}~~{||~~~~��‚‚‚�ƒƒƒƒ‚��‚„ƒ………ƒ„††…„…††„†††…†‡ˆˆˆˆ‡‡‰‹Š‰‰‰ŠŒ‹Š‹ŒŒ��Š‰ŠŠŠŒŒ‰Œ�ŽŒŽ�ŒŽ�ŽŽŒ���ŽŒŽ������Ž����‘‘“‘‘‘‘“•’��“’����’–•”’”––“”““•˜––”•–••—˜–•••–—”••–•–—š˜—––—˜——›£££¥ª­¬¨§©£‹UCKMKMHFBAFLLNKGGHJJGGIKQQOWcu“¢¨«³¹º¯Ÿ•šž�››œž¡¤¢ ŸžŸ¡¢¡¡Ÿ¡¢¡¡¡ž ¡£££¡ŸŸ¡£¤£ŸŸŸ¤¦£¡¢¡¡ ¢¢¤¤£¢¢¡¡¢£¡¢¢£¤£¢£¥¤£¡¡¢££¤¤¤¢¡¡££££¤¤¥¤¢££¤¤¢¢¢¢¤¥¦¤£££¢¤¤¤¢¡¡£¥¦¥£¡¡¢¢¢¢¡¡¡¡£¢£¢£¢¢¢¢¢£¡ŸŸ¢¢£¤¢¡ ¡¢£¢¢  Ÿ¡   ¤£¢ £¢¢££¢¢¢££¡ŸŸŸ ¢¡¡Ÿ ŸŸŸ¢¢¡ ¡ ŸŸ ¡Ÿžœ��žŸŸœ ¹çõñ𤤣–s`fghhihjkkiijklkkkmmnnnmoopnmnpooprprrpqstuusrsuvvuvuvtuuvvwwwvxyxxwxxxzzz||{yz|~}}||{}}€~}}€|~~~€�����‚€€€€�‚…��‚ƒ…ˆ…ƒ‚‚„…††„„‡†…„†‡‡†‡†††ˆ‡†‡‰ˆ‡††ˆ‰Š‰††‰‰‰‰‰‰‰ŠŒŠ‰ŠŽ‹‰Š‹‰‰‹ŒŒ��‹‹‹ŒŒ‹ŒŽŒ����Ž������������‘��‘’’“‘‘‘’��‘��‘�‘’•’’“””““““’��‘���Ž„†Ž‘“‘‰~[FFEEDEECBDEGMLDCCFFFDFGHINV_oŒœ¤®³´³®ž”—š˜———˜ššœ›œœœš™™œœœ�œ›šš›››žžž�žžž�žžœœ�›�Ÿ ž›œžŸŸŸŸž›�ŸŸž�›œ�¡¡Ÿž��ž�œœ�žŸ  �œœžžžŸžžžž�žŸŸžžž  ¡¢£ Ÿžž  žœ›œžŸ ŸžœžŸŸžŸžŸŸž��›žž�œ�žž�›œœ�žž›››››žž�œ�››��œ››œ�žŸžžœž�››œ�Ÿžžœ››œœœ›››šš��š››œœ™™™šš˜˜˜˜———œ²ãðì馨¥›xehljjikjlmnooooooqqqrrrrrttssutrsvvvvvvywttvxxwxyy{ywwx{|xz{|z|}|{|}~}}~||}~€€€€�€���‚„‚‚‚‚�‚ƒƒ�ƒ„„„„„ƒƒ…‡ƒƒ„†…†‡‡†ˆ‡‡†‡‡‡‡ˆŠŠŠŠŠ‰‹‹‹‰‰‰ŠŠŒŠŠˆŠŒŒ‹Š‰‰Š�ŽŽŒŒ�Ž�ŒŒ‹����’��ŒŒ�Ž�ŽŒŽŽ�‘‘‘�‘‘’’’’“““‘“�‘“•”“�’“”——““••••”””•—––”•••••”––—––—™™˜˜–••�‡ƒ…‹’–™š™Ÿ¡›ˆaGHGGIHBAEIJILKGFFFFFHHHFGIQXl“£¦¯µ¸º¸©š—›žœ����Ÿžžž ŸŸ� ¡ ŸŸ  �ŸžŸ  ŸŸŸ   ¢¡¢   £¢¢¢£ Ÿ¡¥¤  ¡¢¢¢¡¡¡¡£¥¡¢£¥¢   ¡¤£££¤£¡¡¢£¢¡   ¢¢¢££¢¤¢¡¡¤£¢£¥££££££¢££¢¢¢¥¤£¡ ¢¦¥£ ¢¢¢¢¤¦¥£¡  ¢¢¢  ¡£¡  ¡Ÿ ¢¢¢¢¢¢¡¢¢¤¤£¢¡¢¤¤¢¡¢£¡¢¢£¢£££¡¡¢£¢ Ÿ££¢¢¢¡¡¡¡¡    žœ˜›œ�œž¡·äöïì¡£ —wbdghihhhijijkjjkjklnllkooooppoooqqpprsrqqqttsqsuxxvtttvvvuuvvvxxxyxwwyyyyzwy{|||{|||z{||~~}||}€}~�‚�~��‚‚‚�‚‚ƒƒ„‚€‚ƒ„ƒƒƒƒƒ„……ƒƒƒ…„…††………„…‡……‡‡‡……„…‡Š‰‰ˆˆ‡ˆ‡ˆˆˆˆŠŠŠŠŠ‹‹‰ˆˆˆŠ‰‰ŠŽŒŒŒŒ��Ž��ŽŽ�‘��Œ�Ž�‘�����’’���‘‘’�‘�‘�‘���Ž�’•“���’”’‘�‘‘“’ŽŽ˜�¡¤¦¥¥§«ª£�cIJMJDAFKJHGCBDJHGFEECBEEFJLRe‹œ ¦­²³¯¥™––™™š™™™œ›ššœœœ›šœœœ››™™™›�žš™šœ��›��žžœšš›� žœšœœžžžš™›ŸŸž���ŸŸžžŸŸ�œœžŸžœœ�žŸ žž��œœœžž����Ÿžžž�ž�œœœ›œ�žœš™œž¡Ÿžœ�œœž ž�››œžŸ�žž��žžž�›šž¡¡�ŸŸŸžŸŸŸ�›�Ÿ Ÿ��Ÿžžœ�›œœžœœ›�›››��œ����œ››œ�œŸ�œœ�››™šššš™—˜˜™™˜›¯Üðî릦£š{dhkmljijllmmnmmmppqpnmoqsrrrsstssstsrrtttvwwwxwwwzzzxwwy|zxyz{|{||{||{|}~~||}~~€‚‚}|~€�‚‚�‚‚‚‚‚�‚ƒ…‚„ƒ‚ƒ…„…„„…‡‡‡††‡‰ˆ„†‡ˆˆˆˆˆ‡ˆˆ‰Š‹‹ŒŠŠ‰‹‹‰‰ŠŠŠ‹‹‹ŠŒŒŒŒŒ‹ŒŒŽ��Š‹‹�ŒŒŒŽ�ŽŽŽŽ������’’��Ž�‘“‘��‘”–•‘�‘”“‘�‘‘‘’”””“”“”’“”–——”“”•”””••“”””•––——–•”•�¤§¥§«°²²®¬¨–hIGJJGFGMMLKJIIGGEEDCAA@EIKR^oˆ•—›¡¦©­© –™� žž���  œ›œ�žžžžŸ  ŸžžŸŸŸ   žžž¡¡ ¡£¡  ¡¡   ¢¢¢¡¢¡ Ÿ   Ÿ  ¡¡¡ ¡££¢¢¢¢¥¦££¤¤£££££¢¢ ¡¤¥¢£££   ¢¢¢££¢¡¡ ¢¡¡£¤¢¡ ¡¢¤¢¢¤¥¢£¢¢¢¢¢££¡¡¢¢  ¢¢ ¡¢¢ ¢¡¢¤¤¢¢¢¢¢¡¡¢£££ Ÿ¢¢ ¡¡£¡¢¡Ÿ� ££££ŸŸŸ¡¡žž  žžŸ¢ Ÿžž�žŸ žœšœšš›��Ÿ²áôðퟟŸ˜xbdhhhhihijlkmjhjllkkkjmnmmoomoppoonpppoqprsuutsstwwtrtuttsuwwttuxxxwxxyyywzzzyxy|{|||{{~~~}|{||||~€€€€~~~€€�€‚„‚���‚ƒƒ‚�………………„„††„„‡ˆ‡……††‡†††ˆˆ†…‡‰Š‡‡‡ŠŠŠŠ‹‰‡ˆ‰Šˆ‡ˆŠŠŠŠ‹‹�ŒŒŠŒŒŒŽ�ŽŒŒŒŽŽŽ���ŽŽŽŒ�����Ž�‘’����Ž‘‘‘’‘���Ž��‘‘‘���‘“–”’��‘”•›¢¤¥§§ª¯±¯ª¤“eFHJIBBCFEHGCDGHIGECCB?@ADIR\jrux‚‡‰Š�’“–—•––˜š˜™™˜™š™™™™™™˜šš››�œ›˜˜˜›�œœ�žœ�Ÿžœ����žœœ�ŸžŸŸ�šœœ��Ÿ�›šœžž�›ššžžžœžŸŸžžŸ ž�žž��œ��žžžŸ�œœ�žŸžŸ�›š›œž›��œ�Ÿ  �œœžŸ�œœœ�ž�žŸž›œœžžž›››�œžžžŸœš›ž�›šœ�žœœšš™›�žžžœœ›œ››œœœœ�ž�›�š—˜œ›š›œ™˜˜š™š™™š›™˜——™›˜™­Úïì餥¢™zefijjkjkmnmmnomnnpprpopprtrqqrtuttuuutuuvuvvywuvwwyxxxxwwxyzz|{zyyy{}}||{~€~~‚€�€ƒ€€�‚�‚‚‚€ƒ‚‚‚………„„„………ƒ„…„…†‡‡‡†‡†‡†††ˆˆˆˆˆ‡ˆˆ‰‰ŠŠ‰‰ˆˆˆ‰‰‹‹ŠŠ‹ŠŠŒŽ��Œ�Ž�ŽŒŒ�Œ‹�ŽŽŽŽŒŒŒ������‘‘‘‘��““““’‘“••’�‘“•““’’’——–””“•”•••••••••——•“••••˜˜———–••––™ §ª©©ª±¶´±­ªœmNNLHFEFFFFGGHGGHLIEFDAACFMRTV_lƒ�¥¦ªª¦ž˜˜�žžœœœžŸŸŸŸŸž¡ ����Ÿ¡ œž ¡Ÿ ¡¡¡ ¢¢¢¡ Ÿ ¡¢¤¤ŸŸ ¢¡¡¢£  ¡£ Ÿ¡££¡¡¡£¡¡¢££¡ ¡ ££¡ ¤¥£ ¢¢¡ ¢¢¡¢¡Ÿ ŸŸ¡¡¢£¡¡¡¡¢ ŸŸŸ¡¢  ŸŸ¡£  ŸŸ�ž¡££¡¡¡£¡¡Ÿ  ¡¡ Ÿ¡    ¡¢¡ ¡¡¡žŸŸ¡ ¡¡¡Ÿ   Ÿ¡ ¡ ¡ ž��   ¡¡    žŸžŸŸ¡žžžŸžžžž����œœœœ��Ÿ²Þññ¡—xbdgihigghjikkiikkkllkjlmnppoonpoqqqprqqpsttssrqqruuutuutrsruuttxyywvvxwxxxxy||{yy{|{{||z}}}|}}|{{}�€~~|}~€~‚€€��ƒƒ‚�ƒƒƒƒ…„‚ƒƒ„…„ƒƒ„„ƒ………ƒ„†‰†„ƒ…„„…†‡ˆ‰‰‰‰ˆˆˆˆˆ‰‹ˆˆˆŠŠ‰‡ˆˆ‰ŒŒŒŒŒŒŒŠ‹‹‹Ž������ŽŒŒŒŽ���ŽŽŽ����‘‘’’�ŽŽ�‘���’�’’�ŽŽ�‘‘‘���‘•”‘�’’’˜Ÿ£¦¥©¬±±¯«©§›wWHJJJFB?BHIFFFEEAAAB?>>AAABFLU_x˜¥«°²­ �“———˜——šœ™›››™™™™™››˜š›››œ›˜™�œ››�œœœŸŸž›šœŸŸ�››œžŸŸž›š™šœ����œœŸžžœ�žž›��œœ�žžžžŸžž�œœžžŸžž��›œ›œ�žž�œœžŸ���››™›œœ›››œššš››œ›œ���›››œœ›››™š››šš™››�œž�œ›››œœ›››šš��›™šš›šššž��››™›š›™˜˜š››š———š›š™™˜›š™˜˜–––œ¯Öéêæ¤¦£�~hfkkkikkmmnmnnnnopqqqqppprrsttruuuuutttvvvvwvvwvwz{xxxyxwvwxxx{|zx{|||}zz|~~~~€~~���€~�€‚…ƒƒƒƒ��ƒ††………ƒ……†‡‡…‡…††‡‡‡ˆ‡†‡‰‰‰‰ˆ‡‡‡‡†ˆˆˆ‰Œˆˆ‰ŒŒŒŠŒ‹‹Œ�ŒŠ‹Œ�ŒŒŒŽ��‹‹Œ�ŽŽŽ�‘‘‘’‘‘�’“’’‘‘’”“’�‘’““’�‘’“‘“——““”•“’••”••“•—–”–”••—–––˜—––——˜–”–—œ¥¬ª©ª®°±±°¬«¢ˆ_HGKIFFGDGKJECDDCCEDA>?CE?CHOT]l‡¥³´º¹ª—•œžž�ž�  žž��žžžŸ¡ žžŸŸ     ¢£¡ŸŸž  ¡¡¡Ÿ¡¡£££¡   ¡£££¡¡¡   žž¡££££¢¢¢£¡¢££ ¡  ¡¥¤£¢  ¡£¡¡£¤¤¤ŸŸ ¢Ÿ  ¡¡££¡Ÿ ¡¢¡ ¡¡¡¡¡Ÿžž¡ŸŸž¡¡¡¡ŸŸ¡£¢¡¡žŸŸ ¢¢¢¢  ¡Ÿžž¡¡  ¡¡¢ ŸŸŸŸŸžŸ ¡Ÿ   ¢ŸŸŸ¡¡  Ÿž  ¡¡¡Ÿž�ŸŸŸ Ÿ�žŸ���žžœ›�œœž²Ùîïï £ –udfihfhhhijjllliijnnnmnnooopqqqpooqrqqpqqqpprtssssrtsstuuuuuvwuuuwxxxwxyzyyyz{|{{zzz||{{}~~|z}~~~~}€€~�����€����ƒƒ‚�‚€�‚„‚‚‚…„„„†…„„……„ƒƒ„†………†††ˆ‰ŠŠŠ‰ˆ‡‰ˆ‡‡‹��ŠŠ‰‰Š‹‰‰‰‰ŠŒŽŽŒŠŒ�ŒŒŽŽŒ���ŒŠ�ŒŒŒŽ���������ŽŽ�‘�‘�ŽŒ‘’’������’’“•”‘‘’“‘’““‘“‘“•—�§¨¨¨©¬®¬ªª¦š|WCHKIDFDBABBBAAA@=?AC??@@>DIKOZfz¢´²­« ••š›—–™š›™˜™šššš™™™››š˜™™›�žœœ�Ÿ��žžœœ�ž�œœ›�žœš›™�žžž�™™œŸžž››œžžŸŸ�œ�œœŸžœ›��ž�žœœœŸŸ�›››žŸž�žœ™›œ�Ÿžœ›šœ�žœ›š�œ��ž�žœœœœšœ���œœ›œ�Ÿœššœœœ™›››š›™™š�›™ššš›�œœ›››�›œ››š��œ››ššš›œœœ��›š˜š››�œ™œœœœ›˜—––—˜˜˜˜˜›¯Öêí袥¥ž�hghjkmkjmnnnnnopqpoopqrqqruusrstusrrttsstvvwvuuwwxxwvwwwwyz{zxxy{{||{z|||{{|~€��€�‚‚‚ƒ‚‚„„„‚ƒƒƒƒ…………†„„„„ƒ„…†……†††ˆˆ…†‡ˆˆ‰‰ˆˆŠ‰‰‰Š‰‰‰Š‰‰‰Š‰ŠŒŒ‹‹Œ‹ŒŽŽŠŠŠŒ��ŽŽŒŒ��ŒŒŒ��ŽŽŽ��’’’’‘‘‘‘‘�““’���”“““““••“’’””””•“’’”“””•••””“••—–•””–——••——–—•–š£ªª¨«¬°³³±¯©ž\MJKKGGHBDEGIF@CAACDEFBBCCFGISepw�«¶¸²¨›—šž��›œž  Ÿž�žŸŸŸŸŸŸžžŸ žžž   ¢£¡  ££¡ ¡££¢¢¡ŸžŸ£¤£ ¡¡ ¡¢Ÿ ŸŸŸ¡¢£Ÿ ¡¢£¢¡¢¢¡¢¢¢¢¡ ¡¡¡ ¢¡¡¡¢¢£¢¡¡£¢¢ ŸŸ ¢¡¡¡¢  ¢¢Ÿ¡¢¢  ¢¡Ÿ ¢¢ ŸŸŸ  ¡¡¡¡¢ ŸŸ¡¢ žž�ŸŸ¡    ŸŸŸŸŸ¡Ÿ�Ÿ  Ÿ¡    Ÿ¡   ŸŸŸŸ  žŸ  ž��Ÿ Ÿ�Ÿ  žŸ�žžŸ��››�žžž­Öîòï¡£¡–xfcffffhhijkikhijkkllllmnnmnonmooopnnmooppqrtusprrstuttttuwxxxwvuxxyxxwxyzzyxxz{zyy{|zzxy{~~{|~€|{~~~~~€�€‚ƒƒ�‚€��‚�‚‚ƒ‚‚‚……„„…„ƒ…†††…„†††‡††‡ˆ‰‡‡‡ˆˆˆ†…†ˆŠŠˆ†‡‰‹‰‡†‰ŠŠŠŒŒŒ‹ŽŽ�ŠŠŠŒŒŒŒŒŒŒŒ��ŽŽ�ŽŽ���Ž��‘‘�Ž���Ž�‘��Ž‘‘�‘�Ž‘’“‘‘�‘‘’“•‘‘’“—¡¨¢£©¬­««¯¯ª–mSNIHGJJJFDCGHGDEC@?AA><>@@EIO^�’‹„œµ¶®Ÿ“–™˜——–˜™™ššš™š™™™š™š›žœš™šœ�›ššš›œœ›�žž›››�››œ�›››�žž››››œžžž�œ���žž›œ›���œžœœ›œ�žœœœ��ž›™›œœ›››ž��œ›››šœ�ž�›™™šœ�žžžœšššœœœš�����›œ›ššœ�œš˜˜›œš™™œ�›™š››š›››šœ›šš��œ›œœ››™™›œš™š›ššš››š˜šœ�š˜˜››™™™˜˜˜—˜——––˜±Øêé夦¥�ƒlgfikkkmlnmmmmmooqppppnnorttsrrrssssuuuuvuvvvuuvwxyyywwxxxxzyxwyy||{z{|}|}~~~~€€~���ƒ��€��‚��‚…††ƒ‚‚„„„„‚ƒ…ˆ†„„‡†…†‰‰ˆˆˆˆˆˆˆˆˆ‰‰ˆˆŠ‰ˆ†ˆ‰ŠŠ‹ŠŠŠ‹‹ŒŒŒŒŒŠŠ‹Ž��Œ�ŒŒŽŒ���ŒŽ���ŽŒ�����ŽŽŽ��‘‘‘’‘‘’’��‘“““‘‘�“““‘’’““““••““““‘“”–•—•••˜˜—••••–—•›£ªªª«¬­°µ³±¬œyZJMMKKNMGEFFGFFHFB?A??@@<@FJKVq‰‹‹›¶º¸¨˜—œœœœ›››žŸŸ��œ�ž �žŸŸžŸ ¡Ÿ¢   £¡ŸžŸ    žœ�¡£   ¡  ¡¡ŸŸŸ¡¢£¤¡Ÿ   ¡¢¡ŸŸŸ¢£¢¢£¡£££¡¡ŸŸ¡¢ ¢ ŸŸ ¡Ÿ¡  Ÿ ŸŸ�¡¡Ÿ ¡ ¡Ÿž�žžŸ¡Ÿž¡£ŸŸŸ   Ÿ Ÿ Ÿ¡  žžœŸ¢¡ŸŸŸŸžžŸ  ž žœ�  Ÿ�œœžžŸžžž�Ÿ žžž���ŸŸŸžžžžžŸœœ�žžœ›žžŸžœœžžžž�›˜š� ¯Óìô –yfefgfggijhghjjiikkllmmmmommmoopnooqpopppprqqrrppprqssrrrtxwuswwvvyxvxxyxxxxxxwzyzz{{|||{}}}|}||}}|~~~€�}}}~~}€€€‚ƒ���ƒ…„‚ƒ‚ƒƒƒ‚‚�„„……„ƒƒƒ†……††…††…‡‡‡‡‰ŠŠˆ‰‰‰‡‰‰‡†‰ŠŠˆ‡‡ˆˆˆˆ‰ŠŠŠŠŒŒŠŠŒ�ŒŒŒ‹����ŽŒŒ��Œ���ŽŒŽ����ŽŒŒ‘‘‘���‘‘‘�‘‘“’��’‘‘““’’’‘”˜¢©¥£¦ª¬«¬­­§—sTHMIDEBDFGFFGGFFCB@><<>><@HOQTXZ`qŽªµ¯�‘–™™———˜˜››š—––››š™šš™™™ššš™™™š™š›�šš™™™›œ›™š››œœœ›œœ›š››�œ�Ÿžš™›�œžž�›››�žœšš›žž�žœ›™›�Ÿžžœ›™š›œ››š›œœ››š›��œšššœ››˜›œœœžœš™œœ››››œœœžžž��œ�›šš�››šœœœ™™™™ššššš˜š››™š›�›™—››››š™™˜š›š™™—˜™™›˜–˜šš™˜™——•——˜˜˜—œ®Ñêíæ£¤¤Ÿƒmhikkklkkklmmmmmmnonnppooqrrrrqrrtsrruuuuuxxxuuvwuuuwwxxxyyxz{{yzzzz{{{{zyz}}|{~�€€~�‚‚ƒ‚��‚„„��ƒƒ��‚�‚‚…†……††‰‡†‡‰ˆ‡‡………‡‡‡‡‡‡‰‰‰ˆ‰‰‰‰‰ŠŒ‹Š‰Š‰ˆ‰ŠŠ‹Œ��‹ŽŽ���ŒŽ�ŒŒŒŽŽ‹‹ŒŽŽŽ����Ž�����““‘�‘���‘��‘“’“•–“��’•”“‘‘’““•““•–“”•–””–—•–––—–•••–——�¦¬ªª¬¯¯±²²®ª›}\LMJFFGIGFFGIFFFFB@=??BEGJSm…eX]j‹­¹·¦–—��œšœ›ž�žŸž�Ÿžž�  Ÿž�žŸ  ž��ž¡¡ ŸŸž¡¡¡¡¡¡ Ÿ Ÿ Ÿž¤¦¡     ¡Ÿ¡   ¡¡£¢¡ Ÿ¡¤¢ ŸŸžŸ¡¢¡ ¡   ¡   ¢¡¡ŸŸŸ¡ŸžŸ¢ žžž ¡¡  ¡¢ ŸŸ  žžŸ ¡Ÿžž¡ �œ� ŸžžŸžžž¡ žžžŸŸŸ¡¡¡ Ÿž¢£ŸŸžžž    ¡ ŸŸŸŸŸž���œžŸŸžŸžžžžžž�›� žžŸŸŸ�œ›œœœœ›™š�®Ïêð쟡Ÿ–{hbfhhhgghjjkkkjkikklkkkmmommmoqpmmnnnopppprqrrsrsqqrtttrssuutttvwwuvxxvwvwvyxxxxwwx|||zy|~~}~~~~}||~~~�€€�€€€�‚‚����‚ƒƒ‚„„ƒ‚‚ƒ†…„‚ƒ„…„…††„„„„„„……†‡‡†‡††„†‡‡†††‡‡‡‡‰‰‰‰ŠŠ‰ˆˆŒ�ŒŠ‹ŠŒŽ��Œ��Ž‹Š���ŒŒ���Ž�Œ��Ž��ŽŽ�‘�Ž�ŽŽ�����ŽŽ�“’����’’���‘‘’�‘“𡦢 ¢§««©§¤¡˜yXHKHGGGGHFFEEBBCEB><=>@HRVRx™”‰yu…›¬³² ““˜š˜••–—™š—–—™˜—˜—˜šœšš™™™›šš™šš››››žžœ�ž›šš›���œœ›Ÿ�›š››œ�Ÿ�™˜››œ���œœœ�œžž�œœ›žŸŸ›™˜šœ��œššššš››šœœ›™™˜™™œ›œ›››žœš™›š›�Ÿžœ›™š›››œš››œœœ›���››››››ššœ›š›œ›™–—˜œœœ›�šš›�œ››œœœœšš™™™ššš˜˜—™˜—–—˜™™››š™™š™—–—˜›¬Íæí磣¡š�mggijkkjkjlmnmmmnoqpppoopqppopqsstsrqutrrsuxwtrvwwvuuvwwwuxzzxy|~}|z|z|||y{|}{~|{|}~~~€€��€‚ƒ‚‚‚„‚€€‚ƒ„„‚€‚„…„ƒƒ„…„„„†‡ˆ‡……ˆ‰ˆ†‡‡ˆ‰Š‹‹Šˆˆˆˆˆ‰‡‡ˆŠŠ‹ŠŠ‰‹Š‹ŒŽŒŒ‹�Œ‹ŠŽŽŒ���Œ����Ž���ŽŽŽ�‘���‘���‘��‘’��‘‘“”“’’’”••‘�‘““•””““”•••••—––•••••—–•“–––™Ÿ¤¦¥¤¢¤§ª©§£—|XGIKHHGGDHHGDEEDDB@?A@@FW]W{¡œ�iYkŽ©µ³¥––™œšš˜›žž�œŸŸ�œžžžžŸž�ž¡ žœ���žž�žŸŸ    ¡  ŸŸŸ¡¡ Ÿ££Ÿ�žžŸ¡£ žžŸŸŸ¢¡¡¢ ž¡¢¡  ž      ¡ŸžŸ¡¢¡ŸžŸ¢¢ Ÿ��Ÿ¡ž�ž ŸŸ¡£  žžŸ ŸžŸ¡ŸžŸŸ��  ŸŸŸžžž   Ÿ ŸŸž žž ¡ŸŸ ¢Ÿž¡¡Ÿžžœ›œŸ £ �›�  �ŸŸŸŸ ¡ŸŸ�����¡ ž�žžž��œ���žŸ�œ�œ›ššœ­Íêñë�ŸŸ™„k_cggghgggihhijjkkkkllkkmponnppomnoooppppqqqppqssrrssqstuvvtuvvuwvwuwvwwxwwwxxxxxxz|{{yyz||}|{y}}}}}}~~}|||~~~€€}�‚€€‚‚‚���‚…„‚‚‚„……„„„„„„‚„……††„……‡‡‡…‡‡‡‡‡†ˆŠ‡……ˆ‰Š‰‰‡ŠŠŒ‹‹‰ˆˆ‹ŒŒ‰ŠŒŒŠŠ‹ŒŒŒ��������ŽŽŽ���Ž������������‘’’‘‘�‘‘‘�‘“’���‘‘‘“˜—Œ‚€ƒ…‚�ƒ�~oSCDHHIFGGGEBBDB?A=9?BDDHNLXejmonns€”ª¥‘‘•—––”•—š™™˜˜———›œš˜š™™šœœ›™˜™šœš›�œ˜™›žœ›šššœœ››™—˜™š›œœ™š›ž�›™š›œ�Ÿ�š™››žŸš˜™��œ››šš™š››˜˜—™š�œ™—™›��›ššœœœ�›™šš›™™™ššš˜šš™››˜—™›™˜˜˜™˜˜˜œ›™™›š�›™—˜–—š›™™˜˜™›››š™™™š™™™™˜˜—™›œ™™›š˜˜˜˜˜™™˜˜——–˜——–—––•••———¤Åáê㡤¢ž‹rdhkkkklmjlnnmllmnoooooooqqqooprrutrssstvvusssuuuvvtuwwvutwyyxyy{{||zz|}|||}||}~}~~~}~€€€�ƒ€�„„‚‚€‚„‚€‚‚‚‚ƒƒƒƒ„…†„„…††…†……†‰‡††‡‡‡‡ˆ†‡‡Š‰‰‰ˆˆ‰ˆˆ‰Š‹‰‰Š‹ŠŒŽ�ŠŠŒ��ŒŒŒŒŽŽŽŽŽŽ�‘‘�����Ž��‘‘‘�Ž���“‘��‘““’’““’’“““•—“’“•”’’“‘’’”’“’•––•””•—–•”•••˜�¢§¤¥¥¥¥ª®¬ª¥–zZLONNQONPOMKLGGGFB@?CBBDIVq…�•™ž ¡¡¡¡ª¦š—š›œ›œ›��žžŸŸžžœ›ŸŸŸž�žŸ¡¡  œ›    ¡��ž¡¡ŸŸž ¡¡  ¡¢  ¢¡�žŸ¡¡¡ ¡¢¢ ¢¢¢  ¡¡ŸžŸ¡¢ ŸŸ Ÿ��¡¡ŸŸŸŸ ŸŸŸŸ�žŸ¡ ���Ÿ¡¡    ŸŸŸ¢  �›� žžžŸžžžŸŸŸž Ÿœžž�›�žŸ���Ÿ�œ�¡ž›œŸ�œž�œ� ŸŸŸ¡ Ÿ�›œŸŸž›œœžŸŸŸŸœšš�¡¡Ÿž›œŸ�œ��››——˜œ›™—˜š©ÉèðꛟžšŠqadgfefghhgghjijjjkkkljllnmlkmlmmmopnnppopqpqpppqqrrrqrrrsuttstvxwttwzyxwxxxwwwxxxwxy{zzz{|}|zz{~}||}zzz|{||}|||€~|~€�~~€���ƒƒƒƒ„ƒ‚‚…†ˆ†„„„„…†„„‡‡…„„„„†‡‡ˆ‰†††ˆ‡‡‡ˆ†……ˆŠ‹ˆ†‡ˆŠˆ‰‰ˆ‰Š‰‹‹ŒŠŠŠ�ŒŒŒŒŒŒ‹‹‹ŒŽŽŽŽŒŒ��Œ������Ž��ދޑ‘���‘‘‘’’’‘‘�’‘‘‘—Ÿ¥ŸžŸ¢£¦©©¤ •}WDMQOKJLMJKLNIECEA<:8:@EJ_Š˜—›¤ª§¨ª­¬§š�‘—˜™˜˜––”˜››™——™›šš˜——˜š›™šš——™››šš™››š›���›šœš™›œš™—™š››��›™šœ�šššœœ›ššššœ�›™™›œš›š™–šœ�››šššœ�œ™˜˜™ššššššš›œš›™˜˜››››š˜˜™š™™™˜™šš—ššš™ššš˜ššš™ššš˜š›™—™™˜—–•––˜œšš˜––˜™™••–™™——™™—––™™˜˜™™™˜—•–——–—––•••”’“•¢¿áêã¡£¤ �uegllkkkmkkkmnnnooommnooqrpqssrppsttqrrtttttuwvvtvxxuuuxxuuwzzzyyy{{{{~}}||{||~~~|}~~~}�����‚‚�‚��‚‚‚‚‚‚ƒ‚ƒ„„„„………„……†††„„„ˆ‰‰‡‡†‡ˆ‰ˆ‰Š‰ˆ‡‡ˆŠŠ‹‹‹Š‹‰‰‰ŒŒ‹ŠŠŠ‹ŒŽŽŒ‹‹‹ŒŽŽ��ŒŒŽŽ����Ž��ŒŽŽ����‘�����‘����““�‘’�‘“•’��“•“‘’“”““”•”••”•”•–——˜––•˜›£¨§¥§ªªª­±°ªš~]LOTTRQSRTUVTOLOLGCA@>?FQg�Ÿ ¦¬¬­²···®Ÿ“—œ�š™™�žœœžŸž��žžžžŸž�œžžŸŸŸŸŸ�ž�Ÿ¢ �žžŸ  Ÿž¡£¡ŸŸŸ žŸŸŸ�žŸ ¡ ž�ž   Ÿ���Ÿž¡¡    £¡ žž�Ÿ ££ ŸžžŸ ŸŸŸ¡¡ ŸŸžŸž ¡¡ ¢ ŸŸŸ   ŸŸžŸžŸŸŸžŸžžœžžŸŸ ŸžžŸ��Ÿ œ›�žžžž��›œ�œšœžŸ�ž ¡��œ›�žž�œœ›œœœœœ�››œžœ�œ�š›››™š››š™™™™˜—˜¤¾ãðꜞžšŒq_bfedefgfghifgijjkjkjjjklllkllnpomnpqpppqrsprttstsqrutrrsttsttuwvvuvtuvxwwwxwwxzxxyy{{{{||||}||~{{{|}~~€€~}}€��‚€€�‚€ƒ��€�‚ƒƒƒ��ƒ…†…ƒƒƒ„„…‡‡ˆˆˆˆ‡…†‡‡‡‡‡ˆ‡‡‡ˆˆ‡††ˆˆˆˆ‰‡†ˆ‹ŠŠˆˆˆ‰ˆ‰‹‹ˆ‰ŒŒŠŠŒ�ŠŠ‹ŒŒ��ŽŽŒ��Ž�Ž�ŽŽŽ���ŽŽ�Ž�Ž�’’�ŽŽŽ‘’‘�‘‘“’’‘‘•ž¡ŸŸ£¤£¦­®¦Ÿ•~]MRWWXUUWXUVYVLHIJHB==@ERo“��¡ª«®²²±´±¤••–—————™™™›œ™——šš›šš˜™™œœ›™šš››š™˜˜›�››››œ�››š››�œ››�›š��ššššš›�œš›››œ��››š›š››™˜š›œ›š˜šžž�›ššœ›š™šš˜šž�œš››��››››››œœš™———™šššœ™™š›™™™ššš›œš™››››˜˜š˜˜—˜˜˜———™˜——™˜˜—˜˜™˜˜—––—˜˜˜—˜–––—˜š–••—•—˜—••––•–––•“”•ž¶Þëæ¢£¢Ÿ’vegkhhikjjillnnommoqpnmoqppqrrqqqssrrrssusstttvtrtvwvvuuwyxxwwx{yyx{zyy{|}|yxyy{}}}~~|}~�€}}‚€��‚�€�ƒ…ƒ‚€�‚ƒ‚ƒ‚ƒƒƒƒ…ƒƒ„‡‡†„…†††‡ˆˆˆˆˆ‡‡‡ˆˆ‡†‰‹ŒŠ‰ˆŠ‹‹‰ŠŠ‰ŠŠ‰‰Œ��ŽŽŒŒŒ���ŠŠŠŽ��ŒŽ����Ž�Ž������ŽŽ���’���’‘’’’‘‘‘“’�ŽŽ�”•“‘‘’“”””’•””•–””•–”““”—›¡¤¡¡§««ª¬¯¯©ž`RW^aa_ZX]]XWUPLONHGCAAGUt–ž�§­«©´¸¶·µ§——œŸ�™—™›œœŸžžœžžžžžžžžž�ž ¡ ŸŸŸ žž ¡��� Ÿžž ŸŸŸ¡¢ �ž¡¡ŸŸŸžž¡¢ŸŸŸŸž ¡¡žŸŸŸžž��ž¡¡  ŸŸ�� ¢ ŸžŸ ŸžŸž��Ÿ  Ÿ žžž¡ ››ž Ÿž�ŸŸ ŸžŸ ��� Ÿ¡Ÿž�  ŸŸ�œžŸ žœœ�ž�žžœ›�œž��œœœœ�ž�žžœœœ�œžž�œ™˜š›œœœœ����žœ›››ššššš™˜———™—˜˜™Ÿ¶àò蟟Ÿ�‘t`bfegghggegghjkjiikmmkjjmnllmnmmnppoooopprrpnnpqqpoostrqrsuuttvtttvutuuuuuuwwxxxxxxyz|{{{|{|{yx{|{{{z|}|}}~~~}~}������€�€��„ƒƒƒ…ƒ‚�ƒ„„ƒ…‚ƒƒ……„„……†††……†‡‡†††‡‡‡‡ˆ‰‰††‡Š‰‰‡…‡Š‹‹Š‰‰‰ŠŠŠ‰‰‰Œ‹ŠŠŒŒŽŽŽŒŒ�ŽŽ�����Ž‹‹ŒŽŒŽŽŽ�‘‘��ŽŽ��’‘�Ž�‘‘’•œ¢¢ £¤¥¥ª®«£š‚bPZ^]^a_YYXUSQKFCCCFEA>DUv“œš¢¨§£ªª©­¬Ÿ’‘”•”—––—™———˜—˜˜˜™œ›˜–—˜›™™›››››——™š˜˜™˜˜�›ššš˜š››š›œœ››šœ�›˜—š˜š›š™�œž�œ›œš™™š™™™šš™™–˜š›š™™›™™š›š›˜˜™š™™š™˜š›�›˜˜—˜˜š™™˜™™šš›™——šœš™›™™™—šš————š™˜——–šš™˜™—••˜˜——™™—————–•———••”––˜––—˜–——˜––—™™————•••–•“”–›´Þî䢤£¡‘vbeiiggjmkikmnmmmmknppooorqqopqrqrrsrsstvurqtuuuuttvxvurtvxxxwwvxyyzzxxz{|{{{}|||}}~~~|}~~��~�€€€€€‚��ƒ…‚€„……ƒƒƒƒ„†……†††……††„…††ƒ†‡ˆˆ‰‰ˆ†††ˆ‡††‡‡ˆ‰ˆˆ‰‰‰‹‹‹ŠŠŠŠŠ‹ŠŠŒŽŒŒ��Ž�‹ŒŽŽ�Œ��ŽŽ�����Œ�Ž�Ž�Ž‘‘‘‘‘�‘’’��‘‘““’’’�‘‘“”””•””’‘‘‘‘“””“••••”•—›¤­¦¥¨­ªª¬°¯ªžŠgS[db]]__]``UOKFF?>@FGGJ_|Œš¤¦©¨¥£™•ž¬¨˜“—ššš›œŸžžžœ›ž���žœ›œœ�ž�œžŸ¢ žžŸ ŸžŸŸŸ  œœ�Ÿžž  Ÿ��Ÿ Ÿž�ŸŸ ŸŸž¡¡ŸžŸŸž��Ÿ¢¢  žž�Ÿ  ���ŸžžŸŸžžžžžž�žŸ�Ÿ Ÿ��žŸžžŸŸž Ÿž›žœ�žŸŸŸŸž�žŸ¡¡ŸŸŸŸŸ ŸŸ�ŸŸŸžŸžž���ŸŸ���›��œžœ›œž�œœ›™œžž��›››�žž›š›œ��œ››šœœ™˜œœ››š———™š™™¡ºáñꜟ�›�u_bffefffeeghgefhhghikjjhjllkmmnnpollmoqrqqqqnoopqrqqpsrqqsssqqstttvvwwwvxxvuwxywxwxxyzzyzz{{{{z}~~}~||{||}|{{}}€�‚‚€�€}€‚�€�‚ƒ���ƒ„…„ƒ�ƒ…………„„„„†††………†…‡‡‡†††ˆ‰‰‡‡ˆ‹Š‡ˆŠ‹‹Š‡……‰ŠŒ‹Šˆ‰‰��ŒŠ‰Š‹Š‹‹‹Œ��ŠŒŒŽ�ŽŒŽŽ��ŽŽ�Ž���ŽŽ�‘������’�����““–�¤£§ªªª¬®±®¨��jRX]]\\[[WVRNKIDA<;=DIIJ`‚”›�Ÿ œ�ufcm‰ŸŸ“�“––—–––˜™˜–˜———˜˜—˜———™˜˜™š™™˜™˜™š™—˜™››œ›šš™™šœœœšš›š˜™šœ™™™ššœšš›�››™››šš™›™™—™š™–˜™š™š™™˜˜˜œ�œš››šš›�œœ›œœ�›ššš™™šœ››š›š™™™››š˜™™›››—˜˜›š™™š˜˜————–˜š™™™˜———™———˜—˜™™˜˜˜™—˜™——™—•••–•”•———–˜——”•””““’•••”›²Úëä ¡¡Ÿ”yddhhijiiiiilnnkmmnoponlmnooppopppprqrrttussststttvvuuvutuwxxuux{yxx{zzz|||zzz|||{|~~~||~�~~ƒ�€���€~��‚�ƒ��‚ƒ‚‚‚‚‚‚ƒƒ„„………„†‡‡††……†‡ˆˆ‡ˆˆˆ‰‡‡‰‹‰ˆ‡ŠŠŠˆ‰‰‰ŠŒŠŠŠŒŠŠ‹‹‹Œ��ŒŠŠŒŽŽŽŒ‹‹���Ž��Ž����ŽŽ����‘‘‘�‘‘’‘‘�‘�“•“’’�’“““““““’’’““•••’’’““–––™¢¨££ª­­­±³¯«¡�lSYa_\[``\WSLNNGA??AGHHNhŒ›ž ¢žŒq]`fak‡œ™–š™š™›››œž�žž�œ›œœ���žŸŸžœœ�ŸžžŸ¡¡ž��žŸ¡¡ ���¡¡¢ žœŸ  Ÿ    Ÿ�Ÿ¢¡žŸ ¡žž  ž�ŸžžŸ ¡ žŸžŸžŸŸŸŸžžž��Ÿ  ž��ŸžŸŸ Ÿžž Ÿžž žœ�žžžŸ  ���Ÿ¡ �Ÿ���žžžžžž Ÿ����œ››�ž�œœœžŸŸœœœœ›œœ���›››œœ›š™›�œ›š™›››š��œ™™™œ›š˜˜˜˜••—˜™™Ÿ´áò隟 œ‘w`beeegggggghghijjkiiikkkjjlmmllknmlopooorrrpooqqqqqqqqqrrrttrrqvwxwutxxxxxvwxyxxyzzyxy{{{{{||y|{{{}|||}}~~~~�ƒ€€€����‚���‚��‚‚‚ƒƒƒ……ƒ‚‚„†…��‚‡‡†ƒ„…‡†ˆ‡†…‡‡‡‡‰‰‡‰ˆˆ‰Š‰‡‡ˆˆ‰‰Šˆ‰‡ˆ‹�‹‰‡‰��ŒŒ‹‹‹�Ž��Œ��Ž���ŽŒ‹ŒŒ��‹ŒŽ��‘‘�Ž�‘‘�ŽŽ��‘‘���’‘•˜žŸ›ž¦¨¨¨©««©Ÿ‹dMRZYXY\ZZXYURMF?==ADFIPhˆš�œ“~aV[joddmy‘—’“••—š˜—™šš™™™˜™š››š™šš››œš˜—›œžœšš››˜˜š›šœš˜—š›œ™šš››››››››››œ�œ›š��œšššœœœšš�Ÿœ›šš›™˜š™˜˜˜˜™�››››˜˜™›�ž™›œœššššš›š˜—˜š™˜˜š››šššš—šœœ˜˜—ššš—————™™———˜˜™šš™›š˜—˜••—š™˜˜———””–˜—•–––•˜——–™˜——––—————”““”“‘“”™«×ë䟡¢ •x_dkiihhhkkjjlmmllknonmmoqpopoppppppsssqqrusqquutuvvttuuuwvxwuvzz{z{zzyzz||{xx{|{{{{}|~€�€}��‚‚���ƒ„„ƒ…„ƒƒƒ„†…„ƒ†††……†‡††‡‡††‡‡‡†‡‡‡ˆŠˆ‰‰ŠŠŠ‰‰ˆŠˆˆŠ‹Œ‹‹‹‹‹ŒŒŠŠ‹Ž�ŒŠŠŒŒ���ŽŽ�ŽŽŽŽ���������‘‘‘�������’“”•‘�’“‘‘‘’“”‘��““”““’’‘‘‘“••“••–˜œ¥¬¨¤¥©­¯°°°¬¢ŒiNSZ^]`_YWYYWSPMFBADKPMQk‘ž ž’j]agpsfflxŽ™™˜š›œ�žž���œ�›����  ŸŸŸŸ ¢¡Ÿ�›ž ¡ žž�ŸŸ¢¢Ÿ��Ÿ¡žžžžžžŸ¡¡ žžŸ ¡žž�ŸžŸ¡ �ŸŸ  ¢Ÿœž¡ŸŸžžžŸŸ�žžžžžŸ¡  ŸŸ�žŸ ž�ž¡¡ž������žœ��ŸŸŸžŸžŸŸŸžžœœ�ŸŸ�œœ����ž�œœž�žž�œžž�ššœŸžžž�œ�žžžž���šœœ›šœœœšššœ�Ÿ�œœ›š™šœœšš˜–•––˜——š°Üðæšœ�œ”w_bgeffhhgfikigjjkjkjjlkjillmmmlmkmmmmopomnoooonoppqqqrsrrpqqtuusuvvuuwzxvvvwxyxxxxxwvxyyz{yzxxy{{{{|{{{}~}||}~~}~~���€��€~‚�€‚‚�‚���ƒƒƒ�‚‚……„‚„…ˆ†…ƒ„…‡‡‡‡††ˆˆ††…‡‡ˆˆ‰‰‰ˆŠ†„‡Š‰‡††ˆ‹Œ‹‰ˆˆˆŒ�Œˆ‰ŒŽ‹‹Š�����ŽŽŒŽŽ���ŽŽŽŽ�������‘’��ŽŽŽ����Ž�‘‘”�¥£¡£¥©©ª««¦�‰fNRVVWYZYVTTUSLE@ABEJKFLcˆ›�”‚[Vfy‹Šuu{‚“˜••–—™™˜——™›››™˜™™˜›˜˜™™›œœ›™˜š›��š˜™˜›œœœœš››œ™™›œœ™˜š›šœ�›šœšššš—˜›œ››˜™™ššš™™šš™˜›�œšš˜™˜˜—™™›šš˜˜—™™™˜™™™™™›š˜–˜˜šš›˜˜—™˜˜˜š™˜™š™˜™™——˜˜˜™˜•–•—˜™———˜˜————˜˜—˜˜˜—••˜——––•–—˜—–•–”••——˜———–••——–”““•””’“••–«Ùî➢¢ –|afjifghjlmmmllmmmnnmnnnmonpppoqoqqqqpprrstttttuwutuwuvvuuwxwuvxzyyxxxz}|{{{yyy~€|||~~}{}~~�‚€��~~€���‚‚��ƒƒ………††ƒƒ„…„ƒ„ƒ…†‰ˆ†„…‡††‰‡‡ˆŠ‰‰‰ŠŠŒŒ‰‰ŠŒŒŒ‹‹‹ŒŒ‹‹ŒŽŽŒŒŒ�ŒŒ‹‹‹ŒŽ��‹ŒŒŽ��ŽŽ�‘��Ž����‘��‘“’��’“’‘‘‘‘’�‘‘‘“•“’‘“’“•—–”’’“““•–••““•™¡ª§¦§«­¯°²­¨ �kRW^]^^\XZ[WPKGBCCFKRPJPhˆ¡£™�WQiŠ�¢¤¥§¬®£•š�ž›��Ÿ Ÿœž¡¡���ŸžŸŸœ��žŸ¢ žžŸ ¡Ÿ¡¡ŸŸ ¡¡  Ÿ ŸŸ ¡žžŸ¡¡ Ÿžž ¢ ¡Ÿ�ž¡ ŸŸŸŸ ¡  ŸžŸ¡¡Ÿžž ¢Ÿžž Ÿž�žžŸžžž ž›�ŸŸžžžŸŸŸŸ Ÿž� Ÿž�   žžžŸ¡¢¡Ÿž�Ÿœœœ���œ�žŸŸ�›�›œ�žž�œ�žž�œœ�œ›�žžœœ›œ›���™›œšš›››››šš›ššœœ™ššœ™™™šš™—˜™ž®Úð虜œœ•z^adcdeefhhggefhhgghjjjljjjllljkklllmnmmmooooopqqppppoqqrrqqtssstttutsstvxuutvvwxxwyyyxyxyz{yyy{zyz|}{|{{|~}}}~}~���€��‚��ƒ��……‚ƒ�‚ƒƒ‚…„„ƒ†††ƒ‚ƒ††„‚ƒ„†……„„††††ˆ†……‡‡ˆ‡ˆ‡‡‡‰‡†ˆ‰‰Š‡…ˆ‡……Š‹‰…†‡Š‹Œ‹Š‰ŠŠŒŒŒŒŒ‹‹Œ�Œ��ŒŒŒ�ŽŽ�Œ‹�Œ‹Ž‘‘‘““����‘���ŽŽ‘’”š¢Ÿ £¨¨¨¨©¨¥ž‹hQW[X\\YWVVTRMLHDACDNSMPdƒœž”€XVuŽž¤¦¨ª­­¡”“–˜—š™˜—˜˜™šš˜——˜›œ›˜—˜›››™™™šš››š—™œž›š™š›œœ™˜˜™š™—™™™˜š™™š�›˜˜™˜˜˜™šš™™˜™š™›œ›™™™™™™—››™–—˜šššš˜——˜™™™™˜˜—š››š›™——˜š›šš—–˜œ›™˜››™˜——•˜————•——˜˜™˜——˜—•—˜—–————™—–—™—•–˜”“”–•••—••––•••––•–“““–••“““•’’‘‘‘—¨Ôêâ�¡¤¡œ€aekkiiijjkkkkkkmkllmlnmmloppnnnopppprqpprssrstvuuuvuuwwuvwxxwxyyy||zwx{{xyy{||||{|{{|}||}|{|��~€�€‚�‚€�‚ƒ‚‚„„ƒ…†…………„‡‡†………ˆ†……ˆ‡‡‡ˆ‡‡‰‰ˆ‰‰‰‰‰ˆˆ‹Œ‹‰Š‰‰‰‰ŠŒŒ‹Š‹‹ŒŒŒŒŒŒ‹Œ��Ž�Œ��Ž��ŽŽŽ�Ž����Œ�����Ž�‘’“•“�Ž‘“”‘��‘��‘‘‘’•——–”‘‘’”•––•”••—™Ÿ£¦¥§©­­¬«ª¨¡‘nWZ``ddb^[Z[RNIFCCEMRVX]oŒŸ¡™‡c^{š¨¨­°²´¶©�š�ŸŸž��ŸŸžžžžž¡Ÿ�œœœžžžŸ  ŸžŸŸ ¡Ÿž���žŸ¡¢¡žžž¡ž�žž�ŸŸŸŸ žœ� ž���žŸ  Ÿ�ž¡ žž�ŸŸŸ���Ÿ Ÿ�ž  Ÿžœ�   ž�›�žŸžž›��ŸŸŸ�ŸŸŸ��žŸ ŸžŸŸžž Ÿ›����žœœ�žžž›™™œœ›œ›šš���œ�œœ›��œ›œ›œ››š›ššš��›šš™šœœ›™™™›œ�™™™™–˜šš˜——˜˜———›¬Øîç—›�›•{_afdccegggfgfffijjijijjjklklmlklmnonmmppppppppqppprpppqrrrrrrttttwwutttuuvuutvvxxwxyxxzzzzxwzz{{|{}||z{{|~~}~~€€}~€ƒ�~€‚‚‚‚��‚‚‚�‚„„ƒ‚‚ƒ……†„„„…ƒ„„†††…†„„„……„„ˆˆˆˆ‡†…‡‰ˆ…ˆŠŠŠŠ‰‰Š‹‹Œ‰‡‰ŠŠ‰‡‰Œ��ŒŒ‹�ŒŒŒ��ŽŽ�‹‹ŒŽ��ŒŒŒ���‘�Ž����Ž�’“‘�Ž�‘”—›ŸŸœž¡¦¤¡ £¥��iOS]bb^[WYZYQLIG@>BJVacZcƒ› ›�€€’šž£«¬®®¯¨œ••—™š™——™›š››šš™˜˜››š˜™šœšš™ššœ›š˜˜™šœ�š—˜™œ›š™›››˜™˜˜š�š™››™™šš™™š››�žš˜™šššš›š˜˜›š™™š™™™šš˜˜—š›š—˜˜™˜šš˜•—šœšš˜˜———™ššš›š—˜˜™™™˜™˜˜˜˜•————˜˜˜˜šš—•–———•—™š–••———––•–”••––——–••———–—”“”••——–”—˜—”“’““””‘‘‘–¥ÑçÞžŸ ¡š~cchihghhijkijkmmmmnnmmmmnooonppoopqrrqqstusssuuvvutsuwwuttwwttxy{zyxxxyxxz|yx{|{z||||~~~~~�}}‚€~~€�€€€‚‚‚ƒ……„ƒ‚‚ƒ……‡†…„„„„„……†‡†††‡ˆ‰‰‡……‡ˆˆŠˆˆˆŠ‰‰‰‹ŠŠŠ‹‹ˆ‡‡‰ŠŠ‰‹ŒŒŠŒŠ‹ŒŒŠŒ�Ž��ŒŒ������Ž‘���Ž‘���‘‘‘‘‘‘“““’�Ž‘““’’‘‘”“““’‘“•–“““––•––“–—–”˜ž¡ž˜˜››–“•˜—“‡jOXbdbb`]]\XQMLHDFKTfpd_o�Ÿ¦¥¡�Ÿ¡¤¦«°±±´³®¤˜™�žž›™��žžžœœž¡žššžŸŸ  žŸž�žžŸŸ Ÿž� ŸžŸ¢ Ÿžžž  žœœž    žžž   Ÿ ŸŸŸ¡¡¡¡ žŸŸ¡¡�œž��žžžŸ ž���žžœ�žŸ��žŸžžžŸŸŸŸ  žŸžžœžžœžŸœ�œœ›ŸŸŸŸŸ��š›œžžžœššœžžž›œœ���œœœ�œ���›™™š™™™šš›�››››™›š››››š˜™šœ›™—˜˜˜™™—–—˜š˜———™ªÖðçš��œ—{_adbdegfgfffghjhikkijklljjknmkjklnmnmmllmpnmmppooorrpnppqpqrrqttuvvtttuuwxvttwxyxwvwxxx{{|{{yzz{{||{zyy{}~~}{{}}}��~€€€‚ƒ‚����€����ƒƒƒ���ƒ„†„ƒ�‚ƒ†‡…„†„††„ƒ„………„†‡‡†ˆ††‡Š‡†ˆŒŠ‰ˆ‡‡‰‰‰Š‰‰ˆ‹Š‹‹ŠŠŒŒ�ŒŒ‹ŒŠŠŠŒŒŒŒ��ŽŽ���ŽŽŽŽ�ŽŽŽ�ŽŽ�Ž����‘‘��‘“–”ƒz|†‡…�|urn`OV[][\]]]\XRMJGFDEOhypmz’Ÿ¤¤¡Ÿ ¡¥©¦œŸª¯ª¨£“‘—š™˜—˜———›™˜—˜—˜šœ™—–˜šš˜˜™š›™™™šš›œ�œœš›ššš›š™™™—™™™››››œ›››œ›™š›˜šš›™™˜™œ›——š›™šš™™˜˜˜šš˜–—™›™š›š—šœ›››š™˜š›™˜–˜™˜˜š˜——™›š˜™˜˜—––———˜—–—˜–––————™˜–”•˜™—˜—––—–”••••–—–––””•—•••———–—••–—––•••–•’”–˜–“‘‘”¥Ðê㛟 ¡™bceghhgghkkkjjllllkmonnmoopppoporpoopqrrrsssrrtrptuurtttsuvvuuuwxxxxwwzzxxxz|z{}~|{{|~~{|~}}~~}}~}}~€���ƒ�����‚‚�€�ƒ„ƒ„ƒ‚ƒ…†„ƒ„†……„……†‡Šˆ††‹�ކ…‡‰‰ˆ‰ŠŠŠ‹Šˆ‡‰‰‹Œ‹ˆ‰‹Œ‹‹‹Ž�Šˆˆ‹��Ž�‹ŒŽ��ŽŒ�Ž���Ž�ŽŽŽ‘‘‘‘‘‘����““���’’’‘’’“’’‘’“”’’’“”••––“’’•••—š”–�  ¤¥££¡“ƒgRV\\``^_][WWRKGFDFQlxe_xž§¥¥¥¥¥¨­°­¢Ž�¤™Ÿ«ž˜œ�Ÿž�œ�œ�žŸž����žŸ ¡ŸŸ�œœ¡¡ŸŸŸžžž Ÿžž¡¡ŸžžŸŸ¡¡ŸŸŸŸžžŸŸ¢ žžžžž�žžžŸŸ�Ÿ Ÿž�ŸŸŸ�œœžž�››ž ž�žžœœš›œžœ›��žžžžž�žžžŸŸŸ žžž žžž¡¡ŸŸŸ¡ �œœœœœ��ŸŸž�Ÿ����››œ��žžœ››œ�œ›œ›š™š™œ›››œ››š››ššš›œ›š™™™š›š™—™™™–—–——————›§Ôîçš›šš”{]aeeeffeggggfffhhhjjjjllkijjkjllkloomlnooonnnppppppqppqsqqqqprsstvutsrsvxwtsuvwvvvxxwwxzzyyxzzz{|{{zz|{{|}}~{z|}~~~}�|~‚‚€ƒƒ�€ƒ„………ƒƒƒƒƒ……„„ƒ…‡‡††‡‡†††‡‡†…‡‡ˆ‡ˆˆ†…‡‡‡†‡ˆ‰ŠŠ‰ˆˆˆŠŠ‰ˆ‰‰Œ�‹‰Š‹�Œ‹Œ‹‹‹�ŒŒŒŽŽŽŒŒ��ŽŽŽ���ŽŽŒŽ�ŽŽ�Ž�Ž�’‘���Ž’™ žœœ ¥ª©¨¤¡��jNQY[__^^\ZVROLBEFGOfpbh€–�Ÿ¤£¢£§ª­¯¨•‡‡€™°œ“˜š›˜™˜—•——˜—––š�œ™™˜—˜™›™——™™š˜˜šœ›œœ›šš››››™——›�›ššš—ššššš™š›�š˜˜›š™˜™™˜˜˜šš™™—–˜š™•—™›š™˜˜—˜š�œ™˜™™™›››——–—˜™——šž˜——˜š˜˜ššœž™™—––˜———™—˜™š—————————–———˜——˜—””—•••——•”•–˜——–——˜–“”——˜—’••””––•“““”““““‘”¡Îèâ�ž  ™~bcggiihijjijjlllklmonmkloponnnnnppoopqrrrqqqssttututsuwvtuvuvxvvwyxwuxz{zzyzz{zz{}}|{{}~~||~�~~�€€€�‚�€ƒ‚�‚‚‚€‚ƒ…ƒƒƒ„„†„„‚ƒƒ……††……‡ˆ†„…‰Š‰†ˆˆˆˆˆ††‡‹‹Š‰‰‰ŒŒŒ‹‹ŒŒŒ‰‰ŒŒ‹��Œ‹ŒŒ�Œ��Œ‹�ŽŽŒŒŒ�����ŽŽ�Ž�����““‘���Ž�‘”‘‘‘““““�‘““’‘‘‘�‘‘–—–’’“–—�¥¦¦¦¥ª«¨«ª¨£’lRT[\\^`^^\ZUTPJGGJTh~ˆŠ‹” ¦¨¤§ª¯±´´¯ž‘Š‚™²ž—™ž�œœœ���ž�›�ž¢ ž�žŸŸŸŸžžžŸŸŸžžŸ ¢¡ ŸŸŸŸŸŸžœ�  Ÿ���žŸ  ŸŸŸ¡¢ŸŸŸžŸ ¡ŸžœžŸŸžŸžžœ�ž žœ›ž�žž›œ���ŸŸŸ���žœœœ�œœœžŸ �››�Ÿ �šœž¡££Ÿ�š›šœœ�›š˜›�Ÿ�œ›››œž�œœœœ�››šœš››ž�œšššœ›šššš›œœšš›˜˜™š™™™™–—™›š››š™˜˜™————–•˜¦Òëæ—˜™š™abeeeddffeehiihhghhkjhhjjjhiikjijkkkkkmmnnnnooonpppooorropqrqqqsstttttsuvywuuwxxvxxxyyxxxz{xyyzyzyyx{{{|~}{xz|}~�€}}|}}~~~�€~€€ƒ‚�‚ƒƒƒƒ†„ƒ„…………ƒ„‚ƒƒ††…„„ƒ†‡‡†ˆ‡‡†††††ˆˆˆ‰ˆ‡†‡ˆŠ‰ŠŠŠ‰ŒŒŠ‡ˆŠ‹Š‹ŒŠ‡‡‰ŒŒ‹Œ‹‹�ŽŠŠ‹�ŒŒ‹ŒŒ������ŽŽ���ŒŒŽŽ�Ž�����Œ�‘œ££Ÿ ¢¥§¨«©¤ ’pQRZ_bcb^]XTNMMLFEJVp‹�Ž�–ž£¦¤§©«¯³³©‘‹“„“°¡—”–š›š™——˜——š�š——˜˜˜˜˜—š›š–—˜š™››š™™šœ�œš˜™œ�›š˜š™š››™šššš›™˜˜šš™™šš™š››˜˜˜ššœš˜—™™ššš™—–—™™———˜™™›š—•—˜š˜˜˜—–š™–––˜š–••—™šš˜——™™˜••–š˜—•–———˜˜————•˜˜——–”––—––—š—••—””•–•“•——••–—–•“•––•–””•—•”’““•”‘’”’�’ŸÊæäšž Ÿ›�fehhijkjjijjjjlmllnnmmnponnponnppppqqppssssrqqsssttttvvtsuwvwuuwwvxxwvzzyyyzzz|}|}{{{||~||}€€~~~~}}‚�€€��‚‚‚���‚�‚ƒ„ƒƒ‚‚ƒ‡„‚„†††‡‡‡‡ˆ†…ˆ‰ˆˆ†……‰‰‡ˆ‰ŠŠŠˆŠŒ‹‹‹‹‰ˆ‹ŒŒŠŠŠ‹‹Œ‰‰‹ŽŽ���‹ŒŽ��Œ���Ž�Ž�‹�ŒŒŽ‘‘���’’‘���‘‘’‘‘‘��”—•“••–––”•”—˜—“”•••˜ ¨¨¥¦©­­®±°ª§—x[\`eiic__^[VQOLJKP^}–––™ £¨¨¨ª°µ¸»¹²««°­®­¢›šž Ÿ›œ�Ÿ  �ž�žžžžžž ž�ž�œ�  ž�ž��Ÿ¡ŸŸŸ¢ ��ŸŸŸŸŸŸžžžŸŸŸŸžžžž  Ÿ���ŸŸ¡žœ›žžžžŸŸ��žžžŸžžžžœ�œœžŸ�Ÿ žš›�ŸŸŸžž�œœœžŸŸ����œœ›œ�ž›��œœŸŸœ›š›œœ�Ÿ��œ››ž�››œœœœ›š™™›ššœž�œšœž�ž�›™š›�›››™—š››™›š™˜™šš˜˜———™™˜˜––”•—¨Ðëè—™››—~baecbcfdghhfggjjjiiiiiiiikihhklkjkkmlmmnmnoomnmmnooopppqtrpooorrstvusrtssuvuuvwwwxxxyzwwwyyxwyxz{{{{{||z{{|}}|}}}}}}|}}~~~�€€€€��€€�‚‚�‚‚ƒ„ƒ�ƒ„…‚‚‚„†‡………†‡‡†…„„†††…‡‡‡††„†……†‡‡ŠŠŠ‰ŠŠ‰‰ŠŠ‰‹‹Œ‹‹‰ŠŠŒ���ŽŒ��‘�‹Œ����Œ‹ŒŽ�ŽŒ�ŽŽŽ���Ž���‘‘‘‘���“ž§£žŸ¢¦¨­¬ª¤Ÿ’qRV]`bge^_`]URSNGDK\x‘—™šš’—£©«®±³´¸¹·´¶¶¶²¨�–—š›š™—˜˜˜—š™™™š™šœœ—”•˜ššššššššššš˜šš››™—™š›š›šššš››˜šššš˜™šœ›œš˜—›™™™™—˜˜˜šš˜––—š››———˜˜š›™—›šš———˜˜™š›š—••˜™™™™—•–˜•–˜š˜˜˜š˜˜–––˜™™˜—˜˜—————–––˜™™—–”””——––—••˜š™˜—•••–•”“•”“’“””’”•—”““•”‘‘””‘‘‘‘‘“‘�“¡Éæã—�Ÿž˜‚dddgghiiiijjjjjkllmmmkmlllmnommkmnppnnqrqrssqqrssuutrtssrtuuuuuuuxzxwwy|{xxyyzzx{||zzz||||}}}~~~~~|~~€€€�‚‚‚‚ƒƒƒ�‚ƒ…‚‚‚‚„††……„†……†ˆ‡‡‡ˆ‡‡‡‰‰ˆ‡‡‡‡ˆ‰ˆ‰Š‡‡ˆ‹ˆ‰‰‰ˆ‰‹Ž�Œ‹‹‹Œ‹‹‹‹ŒŒ��Œ‹�ŽŽ‹�ŒŒŒ�����ŽŽŽ‘‘‘‘‘�Ž��’‘‘‘‘‘‘���“““““‘’“••’’”•••”“‘’”™ §¥¥¦ª¬°±±¬ª¥™uX^ddfmneca\XVVPMJO^~•™›ŸŸ ¥¬®°°±¸¾¾¼½½¿ÀÀ»¯ œ�œš›œžžŸž��žžžŸžžž����Ÿžž�ŸžŸžž�Ÿ  ŸŸŸ¢¢Ÿžœ�ž ŸŸž�� £¤Ÿœ›žŸ ž���œ�ŸŸ�œ››œžž��›œ�žœ�Ÿ�›���œžžž��œ››œŸŸžž�ššœŸžŸ�››œ�ž›˜˜œžžž�œš››�œšœ�œœ››™™˜œžž››œœ›œš™š››››��›šš›šš˜—•šš˜™™˜›š˜——˜™™˜———šš—––™—•–™—–•––š©Ðèæ“—››–€bacedccddefdcehhhijjjihgiikjkkkjkkkkkllmooonmnnoonmnmppprsrrpqrrrssutrssuwwvvvvuwwwuvxzyyyyxxyy{|{{{{|||{||~}}|~€�}~~~~~~€€€€‚�€€€€ƒ�����„„„ƒ…„ƒƒ„…………ƒ‚ƒ…†…††…„…†ˆ†…†††ˆ‰‰ŠŠ‰‰‰‰‰‰ˆ‡‡‡‰ˆˆ‰‹��Œ‹‹ŒŒŠŠŒŒ‹ŠŠŒŒŒŒ�ŽŽŽ�Š‹ŽŽŒŒŽ���ŽŽ�‘‘���Ž�’’�Ž’›£¢ œ˜Ÿ¤Ÿ¥¢�ž—z]]__dlle`^\ZUPLJEHVw�–—œ�œŸ¦ª¯²²´¶¶¸»¹º½¾¹®ž–—™—™šš™™˜š››š˜™˜™œ›˜——š››››™š›œœœš™™š›�›šš››ššššš›š›šš˜™˜šššš›šššš˜šœœ›™—˜ššš™™—™™š›š———™˜˜™™–—˜š™š™——™š˜—–––˜š›šš˜—–——–“•˜�œ—––•–˜˜˜˜–”–––•––—•••••—••••–——•–––––•”“••——–”””•””•–““••””’’••””““••“’“‘��‘ Çâäšž Ÿš�hfhheffhijihhiillmmmlmopmmmoommoqqqppptsssusrrsqsuvtrtvutuuutvvxwwvvvxyzyyyzyzz|||}}||||}}~~|}~€€}~�‚€�‚ƒ……‚‚���„„……„ƒ„„…††ƒ„„†††††…‡ˆ‡†ˆ‰ˆŠŠˆˆˆˆ‰ˆŠŠŠŠ‹‹‹‰ˆˆŠŠ‰‰ŠŠŠŠŠŒ�ŒŠ�ŽŽŒ�ŒŒŒ�ŽŒŒŒŒŽ���Ž��Ž������Ž�‘“‘ŽŽ‘“‘‘‘��’””••””“”•–•“’•——•••˜˜�£¤£¢Ÿ¨¨¢¨¢�¢šza]behghhe`__[WTOKKVv•ŸŸœ—Ž›®±³´¶µ¹¼¾½¾ÁÅ¿³¢š›œž  ž�œœ����žœ�žž›�Ÿ Ÿ�ž¡Ÿ��žžžžŸŸŸŸžŸŸ  Ÿ��ž ž�ŸŸžŸŸžœ�žž�ŸŸžž��ž¡Ÿ�œžœ�žž�ž�žžŸŸŸž��ž¡Ÿ�œžžŸŸžœ��Ÿ�Ÿžœ›���œ�œ���ŸœššššœžŸžž›››��œœžœ˜˜›œ›š›œ™š�œ™™˜šš›šš›�œ›™˜˜š™™š�›™š››™™™™™™˜˜—™˜˜˜š™˜•—˜—•——–••••—¤Îå䔘œœ˜€b`bdedddeffgggfghjjkjkjjijjjjkkkkkkllkklnnonnlmnpqqppppoqqrtrqttssrsqrrtuvutrtvxwwvvuxyxyyyyzzzzzyzyzz{zzy{}}|}}}}}}€€~}€€�‚~~ƒ�‚„ƒ‚����„„ƒƒƒ„†„………„„ƒ‡‡…ƒ„……ƒƒ…………†‡ˆ‡‡‡ˆˆ‡†‡Š‹ŠŒŠ‰‡ˆˆ‰‹ŒŒ‰ŠŒŽ�ŠˆŠŒŽ�Œ‹Œ‹��’ŽŠŠŽ���ŽŽ�“‘�Ž��‘�’‘�’”‘ŽŽ— ¢¡¢¤¨¬­­«¨£—y^^b`dgkhd_^YVRRMIIUn‰”™››’˜¨­°²µµ¶¸»¹º¼¼¼»² •™—––—™˜”–˜˜™˜˜˜™™œœ›˜˜—˜˜š™™˜™™›š™™™š›œœš™š›�›š—™˜™™™———™™™™™™™™———šš™™™™™˜˜™›š™˜˜™œ›š˜˜˜šš™™˜™šš˜™™˜———™™˜—˜—˜˜šš™˜–••••™šš˜™—–•—–——™™˜•–—™™˜–••–––———•”•———•””——–”••“”•–”““”•“’”““‘””“’“”–“’’“““���‘“‘’žÅàà–šŸž—~ebefffhhhgihiiijjknmkkmnllmnnoopopppoooqqppqqrppsutrrqrststttuwwvuvxzvuuxxwvwyzzz{z{zz{}|}}|z|~}}~~~~}}|}�‚€~~}�€‚‚ƒ‚‚‚‚ƒ„„ƒƒ„…„…„ƒ„‡……„††ˆˆ†„…‡ˆˆ††‡ˆˆˆ‰‰‰‹‹Š‰‹‡‡ˆ‹ˆˆ‰Œ‹‹‹‹ŒŒŠ‰Š�����ŒŒ�Ž���Œ������ŽŽ�‘‘‘‘‘‘�Ž�’��“‘‘’•‘‘’’‘”””’‘“••“’’’˜¡§¥¤¦ª®®®¯®«ª›x[ahjilnjfdaZURRNLLSkŠ›ŸŸ ›�¥¯³¶¶º½¿¿½¼¾Áù¥˜›�žžž�œ›�œœœš™œœ�ž�œœ�žžžžžŸŸŸœœ›ž��žŸœœ��›œ�ŸŸž��œ››�ž››œ�šœœž�›š›�Ÿžœ›��Ÿžœœœœ™›œ�œœ››š��œœž�œœ�›š™šššœšš›�›š›��žœ›™™™š›�›™™›œœ››™™ššš˜˜˜šš››™˜›š™—™™ššš™˜—™™˜——˜˜˜˜™——˜›™™—––˜˜˜˜š˜—–—™˜—˜˜—™———˜–••••¤Èäæ”—›š–€f`adbaccddeeeehgghjijkkkkllkjkkkmmjlkkjlmmmnllmnooonnopppprsqorssqsssssrsvxtqsuwwvvvuwxxxxxyxxvxzzzyyz{{zz{||zzz|}}||}~�€~}~|{~€�€€€��€€��„†…‚ƒƒƒ�ƒƒƒƒ††ƒ�‚…†ˆ‡…„„…‡ˆˆ„ƒƒ‡‡‡‡Š‰‰ˆˆˆ‰Š‰‡‡‰ŠŠŠ‰ˆ‰‰ŒŒ‹ŠŠ‹Œ‹’–Žˆ‹Œ�Œ�Œ‹ŒŽ�‹‹Œ�ŽŽŒ��Ž�Ž�Ž�’‘�Ž�‘“�”›£¦¥£¡¥«¯­«¨¤˜zZ^defjjebb`ZSNKGGHPc€•™—›˜›¢ª®±±²´·¸ºº»¾¿¼µ£––˜š˜™™š———˜˜˜–––™™™———šœœ›™˜š™–—™›™››š˜ššš˜ššš˜˜™™™š››š˜š™™™ššš˜˜—˜˜ššš——–—˜›™™™———™™˜––•—™š˜˜—–•˜˜˜˜™˜———–––––—˜—–——““”–•––—˜š™—•“”–———•”•—–••••––—˜—••“••–––•””–˜—••••”“•“””•••”••–“’”•“”““““‘’“‘‘‘‘‘‘‘œ¾Þà—�žžš„gbdifeegggikkijjkklkjkmlmmmlmmnooooonmopqpoonppqqspppssrptvtuutvvvvvwwvvwwvvwvxxxxyyzy{}}{{z{}~~~|~�~{z~~€}{|€�€€€�„„ƒ‚‚‚€€�‚‚„††„…„‚�„††…‡†…††‡†„†ŠŠŠ‰ˆ†ˆˆŠ‰ŠŠŠ‡‡‡‰‹ŒŠˆˆŠ�Œ‹ŠŠŒŽŒŒŠ‹ŒŽŽŽŒŠ‹�����ŽŽŽ���‘’��Ž�’‘ŽŒŽ��Ž��‘�’“•”“‘’“““’’“•••““•˜�¦«©¦ª¬¯®¯®«¦›|`befjmieefcZVWTIFMTi†ž�� �Ÿ¨³¶¶¶¹¼¿ÀÀ¼¾ÁÄ¿·£™™œžŸžœšœ������œ�Ÿž››�ž ž�œ��Ÿ�œ›��žž����œšš›œž››œžœ››œ��š��œœ�ž��ž�œœ�Ÿ�œ››šœ��™šœžžž�œššœŸœš›�ž›™›žžžžŸ�œš››�›››žœš˜˜˜™›œ��žœšš�››šœœœœ�››››››šššššššš™™™š›™™˜™š›š››š˜š—–—š™—————˜˜—•••—–—–—––•••———–”’“ Èâ䕘™›˜…fbacbcdddfgfeffghhhhggijjjllkhhjmlllkklmnnmnmmnoopnmnpooorqqqrrsssrqrttssuwuutvwxwvvvvxywvxyxxxyzzzzzzz{z{yy|}{|{{}€~||€€€€~€~~~€€€�ƒ‚‚€‚€�‚†…„‚ƒ‚ƒ„„ƒƒ…†…ƒ„…†ˆˆ†„ƒ†‡ˆ††…‡‡‰‰ˆ‡†‡‰ˆ†…†‰ˆˆ‰ŠŠŠ‰ŠŠŠŠŒ‹ˆ‡‹Ž�ŒŠŠ‰‹�Ž�ŒŒŒ�ŽŽ��ŽŽŽ���Ž��ŽŒŒ���‘’‘�‘‘“˜¢¦¦¤¦¦©¬®¬©¡—{_blprlgffc]XVTOKGJPi‡——˜››œ£¬±³´¶¹º·¹º»¼¿¾¹§˜–ššššš˜˜——˜™™š™˜˜˜›››šœ››œ�šš˜˜–™™š˜——˜˜˜™˜˜š›™˜˜ššš™—–—™ššš—–—™š››š™™š›š˜˜™ššš˜™™™™›˜˜——•——˜™—–––™š™—–––˜™˜˜˜•••˜™˜–———˜™—–—˜˜˜————˜˜˜—••—™™—™—–”••——–”•–—––•••••–———”•”””•””““’’’““‘‘’”””’’“”“’�‘�‘‘‘�‘š»Øß–šžž™‚fcfhfffghjhhhkmlikkmlkkmonmmonmmoooopmmpsqrqporqqqrqqrsrttuvuvvvtuwzzywwuvwxxxxz{yy{zzz{{{|{}}}}~}}~€}|~}�~}~��€€€�‚�‚ƒƒ‚‚‚ƒ„ƒ‚„„…††…ƒƒ†‡‡ˆ†ƒƒ††……‡‰‰‰‰ˆŠŠŠŠŠ‰‰‡ˆˆˆ‰‰‰‰‹Š‹‹‹‰‰‰ŠŠŒŒŒŒŠŠ�ŽŽ��ŽŽ��Œ‹ŒŒ��ŽŽ�ŒŽ�‘‘‘��Ž�ŽŽŽ�‘ŽŽ�‘‘‘”•’“’”””•˜”“”••Ÿ©©¥¤¨­¯°¯«¨¥›z`foruokhhec[YUPMMLTp�™�Ÿ�–˜§µº¸··»¼½¿ÁÀÀÁÄ¿ª™š�ž�ŸŸžŸžž�ž››œ¡ ž�œ�ŸŸž� žœœœœ�ŸŸž�ŸŸŸœ›œž�žžžœž¡¡��žŸŸž�›š›�œœ›œœ  žœ���œžŸŸœœ��›œ�œšš›››�ž�žžž�œ›œ›�››š››�œ››œ�œ›œœ™›œ›™š›œ››šœš››���›ššššš™™™š�››™™˜šš—–š››™˜˜™——™šš™™—––˜™™˜˜——–—•––––˜˜˜–————•“‘�’• Æßä“”™›˜‡oa`cbceeddeeefehiigggjhhikkjjiiknmkkmonlmnooolmnponmnnnppopprrrrtvrrrttsrrrtuutuvxwwvxzzwvxyyxzyyyzz{{}{yz|z|}~}}}~~|~�~€����‚���‚ƒƒ�ƒ„„‚ƒƒ‚��‚‚„„„„‡‡„ƒ……ˆˆ†……………†‡††‡‰ˆ‡†‡ˆˆ†‡†ˆˆˆˆ‰‰‰‰Œ‹ŠŠ‰‰Š‰ˆŒŒŒŒŒŠ‹����‹Œ‹‹ŠŒŒ�Œ‹ŒŒŽ����Ž�ŽŽŽŽŽ’’’““‘—Ÿ¤¤¤¤¦ª®¬©¥�”{bbfeimppmieZYZXPJJSf€”�œ–�“¡¬²²³·¹¹»»¼¾¾¼½¹¬œ˜š›™š›š›š˜—™™š™›™™œ�››š›šš™›ššššššš˜—–˜˜—–˜™ššš˜šš››œ™™™˜˜™š™˜———šš˜—™šš™™———™™™——–™™—–——˜˜–—˜—•—™š—••——˜˜›™™———˜™š˜––˜š—•–——™˜—–——–•–—š—••—–—™˜•••——–—”““”•—•––”“–––••••“”””••“’’“••—••””““’““”’’““�����š»Ùà–š��›Špccggfggihhhihhhklllmmllmnmlloonnppppqonpsrqqqsrrrttrqrstttqtvwtuvxwxxwuwyzxvxyzzzyzz}|zz}}}||{{{}~}}}~||~€~}}€���‚‚‚‚��ƒƒƒ‚ƒƒ„„……„ƒ‚ƒ„†‡‡…ˆ‡…ƒ…„…‡‰‰‡††ˆˆˆˆ‡‡ˆŠŠ‰‰‰Š‰‰ŠŠˆ‰‰Š‰‰ŠŒ‹‹ŠŠŠŒŒ‹ŠŠŒŒŒŒŒ‹�Ž�ŽŽŽ‘‘“’‘�’’’’’‘’““““““”’��“•–“““““•”’’•–”•–•–œ¤©¨¨©­¯²¯­©¦›yZ_gjkpusmhc^XUUNIJSe‚™ž�”€�©´··¸»»½¾¿¿ÀÂÂÄÀ¬œ›œžž Ÿž›››��ž��� ŸœœŸŸž������ŸŸž�ŸŸ¢Ÿœœœœ�žžœ����ŸŸžžžž���Ÿžž�žžžžžœ�ŸŸ��œ›œž�››œ�žŸž›™›šœœœ›œœžž��œœ›œœœ››�Ÿž�ššš�œœœ���šœ›œœ�›››››››››››š™™œžžœ�™–—šššš™™™™——™™˜˜™™—˜˜šš—–——˜˜———™š™šš˜—˜™šš——•””———•”“ŸÀÞã“•šœ™Šrb_cceecccgfecefgffhiijihijkhijmllkkjmmkjlmoomlmmoonnoppqqqpprtsttsrrruttuuvxxvuvwwxxwuwwwwxwxxxyzwwwz{{{{|||||{}}||~}|}}}�‚�~€‚‚€��‚…ƒ‚�‚��‚ƒƒ…„ƒ‚‚ƒ…„„„ƒ„††„„…‡†………„†ˆ‰‡‡‡ˆ‡‰‰ˆ†‰ŠŠŠˆ‰ŒŒŠŠŠŒŠŠŠŒ��Ž�ŒŒŒ����Œ�ŽŽ������ŽŽŽ�����Ž��‘‘�Ž��’’’–Ÿ¤¥¥¦§¨ª«¬ª¤–|`^digkppnib]XVQLJJO^y•𗕉”¨®®±²µ¶¸¸º»½¿¾»¸«�˜—˜˜™™˜—™˜˜™™˜ššš˜™œŸœ™˜™›™˜™š˜——›�œšš˜œ›š™œ›˜™š˜——šœœ™——˜›™˜———™™™˜š™™˜—”–—˜™˜—•–—™™™˜™˜—–˜šš––—™˜˜˜˜———™™—••™š™——˜š˜˜˜˜˜˜••—œ›—–—˜—•—™˜—–––——˜——–•“•——“””””––•””““•–““““•••”•““’’‘‘‘“”•“’””““����‘‘’�ŽŽ˜·ÖÞ–š�¢Ÿ�rechgffhggihhijjkmnllkmkmmmmnnnmmnpqqpnnopoooqppprrrrussswvuttuwwvvvvwwvwwxwwwxxxz|{{zzz|||}|z|||}{|}}}~~€~~~€‚�‚‚ƒƒ‚‚‚‚ƒ……†††…„‚ƒƒ††††‡„†‡‡„„„…†‡ˆˆ††‰‰ˆ‡ˆˆˆŠ‹‰‰‰‹‹ŒŒŒ‰ŠŠŠŠŠŠŠŠŠŒŒ�Ž�‹��Ž���ŽŒ��ŽŒŽ�”“’��ŽŽ��‘’’‘’‘’’’‘’�‘’’’”“’“—–”““““•”•–—œ¥§¨§ª¬°²²°«¥›|_ainqvxtolic]YUVUUUd™œž¡Ÿ¡ª²¶·¸¹º¾¿ÂÂÂÅž­ ›œš›Ÿ ž�›œ�Ÿ�›žœ›œ�Ÿ ž��ŸŸžœœœ��ž�žŸŸŸŸžž�›�žŸŸ�›��žŸŸ���žœœ�Ÿžžž�œžžžŸ�œ››šœœœš››���›š™šš›��œ››œžž�œ›š›���ž��œ�›››������œœ››››››ššš�›šš›ššœœšššššš™™™™™™›š™–˜™ššš™š——˜™———˜˜˜˜™™™—––˜™˜˜–—˜—–—••”””––––˜Ÿ¿Ýç’—šœ™Šoa_dcddddddfeeggfghhhghhjhijkhikmmlkkkkklllmnmkjkpolkmnoopoooqqqqrrqqpqstsssuuvtuvxwvvxxxxxyzyzyyz{{||{{z{{{z|{z{~~~}{}�€~~�€€�€�ƒ‚‚‚‚‚‚���‚ƒƒ‚‚€‚ƒƒƒ…………„„…ˆ‡†ƒ„…ˆ‡†††ƒ…‡‡‡‡ˆŠ‰‰ˆˆˆˆˆˆ‰ˆŠˆˆˆŠ‰‰ŠŒ‹ŒŒŽ�‹‹ŒŒŒŽ�ŠŠŒ��ŽŽŽŒŒŽ������Ž�ŽŒ�‘‘���’••–ž¢££¥¥©¬«ªª¤™�i`fonmlhklfa\ZXTRTT_y˜›—›¡¥©¬²µµ¶¹»»»¼¾¾ÀÀ»ª›˜™˜˜˜˜˜š˜—˜™™˜™š™––—››™—™˜š›š—˜˜™˜š››˜˜—™›™™š™˜˜˜˜™™—™˜——šš˜˜™–•”˜˜™˜–˜˜˜—••––——˜˜˜——–˜—˜˜––—˜™™˜—˜˜—–•–•–˜œš™—˜˜™š™˜˜–••—™˜–––™™––•—–—˜™˜—“’”˜˜˜•””•”––••““”–––””“””•”’‘“••“••”‘’‘““’’’‘‘““‘�’�����‘���‘™¶Ôß–˜��›Žwc`fffddehijggiljkjjjkkopnnpommpqnnproooqrrqqprpprtssttrsuusstuwuutttxuuuwxxvyyxxxzzzyyz|||}}z}}~||}~}~}~€||~~~€�‚‚ƒ‚‚‚‚‚‚‚‚‚ƒƒ„„‚ƒ„„ƒ…††„„………††‡‡ˆ‰ˆ‡‰ˆ‰‰Œ‹‰‰‹Š‰Œ‹‹‹‹ˆŠ‹Œ‹Œ‹‹ŠŒŒŒŒ�Œ���‹‹‹Ž���‹Ž�‘�‘��Ž��ŽŽ���Ž�‘’‘’’‘�‘’“““”‘��“”•“““—˜˜—›¢ª¨¤¥ª¯°¯­«¤šddlommpokhic^[ZWSQUb~›�›¢«®­°·ºº¹¹¸½¿ÃÃÀÁÅÀ°Ÿ››ž�›�Ÿž�ž ¡ Ÿ›››�ŸŸ��œŸ¡ŸžŸ  �œžŸ��žž����››œ›››œœ�ž�œš™žžœœšœœ�›œœ››�œ�œ›šœž›™›šœœ��œš›››��žžž��›�šššœœ��ž�œ›œ�›š›œ›œ›™—™œœ˜š™›��šš›œš›™š››ššš™™™™™š™›š˜˜›™——šššš˜—˜˜™ššš˜–•—™š˜˜˜™—––˜—–•••——–––“““””“–�ºØæ“–œ››�xb_ddeeeeeefefeghjgfeijkkihjjklmlllkmmmlmmmkmoolmoqommpqpnnnoppprsrppssusrrtsutttwxwvvwvwxwvuvyyxxzzzyzz|{{zzz}}|{z{|||}~€||~€�~~€…�€€�€‚ƒ‚‚€€�ƒƒƒƒƒƒ„ƒƒƒ„…‡……„…‡ˆˆ†……‡‡‡‰ŠˆˆˆŠ‰‡†‰‰‡‡‰‰‰ŠŠ‡ˆŠŠ‹‹‹‹Œ��Œ‹‰‹���ŒŠ�����ŒŒ���Ž��ŽŽ�������’‘�‘“—ž¥¤£¨ª©§¨©¦¢˜~abilnprmgbc`ZVXQJIM[x–—“›¢§ª­±´µ¸º¹ºº»»¿¾¼¹® ™—˜š™—˜™™ššššš›œš™™š››™™˜šš›š™˜˜˜šššš™™˜™››˜˜˜™˜˜š™—™™š™™™™™™™™˜˜š™—–˜˜˜˜˜–••—˜™˜˜˜šš˜–˜––—˜˜—˜–••—–———–˜—˜šš˜˜•—šš˜–•—˜————–––—–——˜–••—•”’“””””””””–˜™—•––’””––•“•”””•‘‘‘’“””’‘‘’‘‘“•’‘’•“‘‘“‘’‘‘‘‘��’�Ž˜²Ñá–™œž�‘|fbgifffhhhijiijkjijkkmmmnnnmmmnnoopppppnoqqppppppqooorrqsvuutuuuuwwxxwwvuuwyywxxzz{||{|zyy}}|}~~~~}~~~~~~�‚~�…�€€‚��‚…ƒ‚ƒ‚€‚ƒ„…………†„„…†…†††‡‰††…†…††‡‡‰‰††ˆˆˆŠ‰ˆ‡ˆŠŠ‰Œ‹Š‰ŠŒŽ‹‹ŒŒ‰ŠŒŒ‹Š����ŽŽŽŽŽ��ŽŽŽ��‘����‘’’‘�Ž��’’‘‘’‘‘�’’““••••––”’’•˜—–—Ÿ©ª§§ª¬®®®¬§œ…iginprrrkfdb^YWQMKOZwš¢ž ¤¨¨¯³·¹¹¹¼¾ÂÅÅÄÄÄ¿²¢œ›���žŸžŸžž�žžžœœœžžžžžžžžž Ÿ��žžœœ ž��ž�žŸ¡ �����žž�œœ�Ÿžž�œ›��žœœœž�ŸŸ�˜˜š›œœ››œœ�žžœœ›�œŸ�š›œ›››�œ››šœ��œš›�œœ›œœœ››™™™››�œ›š™šœœ›œšš™™™›š˜˜˜–™™™™™———››š™˜˜™š™˜———™›œ›™˜™——–———–•–™™—˜—”•—–——••—•“’”•�µÕä“”––—�zc^ccccddbdefefffgjhggkljffjkkkjijkmlmmmkklnmmmmmonnomnooopppprpppsssqqqtussvvuuuvwywuuxxyzxvxz|yyz|zyz{z|}|zz|||{z|~|}{||€}}~}��}~�‚€€�‚€�‚……ƒƒƒ�ƒ‚………„…†ˆ‡„…†ˆ‰‡ƒƒƒ…‡‰‡……ˆŠŠ†††‡‡ˆŠ‡†ˆ‰‰Š‹Š‹‹‹‹‹ŒŠ‹‹‹‹���‹‰‰‹Ž�ŽŒ���Ž���‹��Ž��Œ�‘“����Ž�‘”’’—Ÿ£££¥§§§¨«ª¤˜~dcgmnjhkgb^]\\WNGGNYt˜ ›™™ ¨­°²±´¹¼ºº»½¿ÁÁ»­ž—˜›˜——˜šš™›™˜—˜——–™˜—™š˜˜™››š™———šœœ™˜—™™™š›˜˜———™˜—˜™˜———˜———˜–––™˜˜˜˜–—˜—–˜˜—•–˜———™™––˜˜—–—˜—•—˜˜˜˜••”–———–•”•••—˜•”’•”–”””••••—™™™™––———“’“––•“”•˜•””˜–”“””””“’’“””““‘““““‘�’’“’’�“””‘�‘’’’“‘��‘“’���˜­Ëß“–›Ÿ›�}g_dfhgffgggijijkkkkmlmmmmnmlmoonmmlnoppooprppopqqppoqqssssttuuttvvuuwyxvwyyxuuv{{{zyxyzzy{{{|}}|}}||~~~|~~~€‚€€€�€€€€€�‚‚‚���‚„ƒ„„ƒ‚ƒƒ…†‡……………††††‡‡†…††‡‰ˆ‰ˆˆˆ‰‡ˆˆ‰‰‹Š‰ˆŠ‹‹ŒŒŒŽŽŒ‹‹��ŒŒŽŒŒŽ‘�ŽŒŒŽ‘��Œ��‘�‘�����Ž��’’’’“‘“‘����‘�’“‘‘”—•““““•–˜š¡©©§ª©«­°®«¥��cchoqpnpmgaa`]WQKJNWqž£ž–Š˜®¯±¸»»¼¾¼¿ÁÃÿ¾´¨œœžŸžŸ�šœžžž�œ›œ��žžžœ�›œœ�œŸŸŸž ŸžŸ ž›œ�›��›�ž�š››Ÿžœš�žŸŸž››››œž›š›œ�œœ›œœ���œš™ššžŸŸ�››�ŸŸžœœœ›šš›œ›››››œšš››™œ�œ™™™š›œš™šš˜˜™™›œ›™™™›››šš™›š˜˜šœ�šš™™šš˜˜š™—–˜˜——˜˜˜˜š˜˜˜———˜˜—•––••––—–˜˜–”•••••”“’”™°Ñç‘”—š™�|d\bbccddccefggfefghgdfikiihjjkkjijkkjjjjmmlllkkkoomklmoooopnnpqpprsrrrsuuvtttttuuwwwuutvwywuuwyzywwx{yy{{{}}{zzz{|}~|{{|~~~~~~~~~}��~‚�‚‚…„ƒ‚ƒ�€‚„…„‚‚‚……„ƒƒ„ˆ…‚€„†‡‡‡…†ˆˆˆ‡……‡‰Šˆˆ‡ˆˆˆ‡ˆŠ�‹‰‰ˆ‡ŠŠŒŒŒ‹ŒŠ‹‹‹ŒŽ�ŽŒŠŒ�‘ŽŒ‹��Ž���ŽŽŽ‘“ŽŽ�����‘“•šŸ¡¡¥§©¨©©©£›€c_ciqqnlijha[WRKHKKQj–�–�„�ª®®¯²µµ·»¼¼¼¾¿¾¼¯Ÿ–—˜˜–——™™šš™˜™šš™˜——™››˜——˜™™˜˜”–™��š––˜™—˜————————˜™™˜—˜›š›——˜š˜—––––––—™™–———–—–––˜——–˜—––•”—™š™–•—š˜•”””—˜˜–—“”—š™˜–•”•——•”“”••–––•””™™—“’“••—–”“•••“”””””•••”““”””••“”‘‘’•”“’’���””�����‘’’����‘�Œ���“©Éß–˜œœž–€f_dfggfefgiijiiijjkkkklklmmnoononoonnpppopommpppoqqqrsrrtttttsttuuuuxxwvxxxxxwwxyx{ywy|{y||{{}||||z|~~|}}~~~~~~~€€}€�‚ƒƒƒ€‚�‚‚ƒƒ‡‡………ƒƒ†‡‡…„„…†ˆ‡††‰ˆ‡‡ˆ‡†‡Šˆ‡†‡ŠŠŠŠŠŠ‹‹Œ‹Š‰‹ŒŽ��Œ��Ž�����Ž�Ž��ŽŒŽ�’‘�ŽŽŽ��‘‘‘�‘’––“‘‘‘‘�’“•”��’”’””•“–––”˜Ÿ©ª¨ª¬¬¬¯¯ª£™b_dipssppmicb`ZNJKOVo–œ•”˜¡«¯³·¼½º·»¿Á¿ÁÂÁ¼³¥œ›�����Ÿ Ÿœœ�Ÿ žœŸ����œ�ž  Ÿ�žŸžžžžœ�žŸžžž�œžŸž›››��ž�››œžŸŸ›š›�œ›››ššš�ž›š›šœ�ž�›šœŸŸ��›š›��œœšš›››ž›››œ››™››››œ›š››™›œ››™™™œœ›šššš™š˜——šœ›™™™™™™™˜˜—š˜––˜™››š˜˜——˜˜———————˜™—–—˜—–—˜––—™——•––——–•““”–•“•¬Ïå�‘–˜›“€c]bcbbddefeceefdffhghghikihikkjjklkkkkklllklmmkllopmkmopqppooprqqqqqrrrrstvuutvvtsussuvvwxwvvxxyzzxzyxxxx{{{yy||z{|{{}}zz{}}~}}~‚�}}‚‚��€�������ƒƒƒ„„„‚‚ƒ†„ƒ‚…††„„ƒ„‡ˆ‡……††††…††ˆ‡‰ˆŠ‰‰‡‰ŠŠˆˆˆˆˆˆ‰Š‹ˆ‰‹�‹‹‹‹Œ���Œ‹�����ŽŒŒ��������Ž��Ž�Ž���Ž‘— ¢¡¢§ªªª¨¥¢š�cadgmswqlec^]ZTMMNMPgŒ”‹‰– ¢©°³¶¹¸¶ºººº½¾¾º¯Ÿ–—››š˜—™˜————˜››™›˜˜—™™›š—•—šžœ˜••˜˜˜˜˜——˜›˜˜™™–—–——™™™™—–––—™˜™››˜—–——–•——˜–––——˜˜——˜˜––—–•••——™™—•––˜——••”––—––••–—˜—•”———–”’”–—•—™˜”””•”•““””“”””•”•”””–•”’““””––•’‘’”“‘��““’‘‘�‘‘‘“•‘‘�’’”“‘Ž��‘‘�ŽŽŽ•¨Æà”–›œ�—†gafhffeggjkkjkjjjmmlmllmmmnnooononmmpppooopppoopssrrsrqsstrrqsruvvttuxxuuwyxvvvwyyzyyy{zz{|{{|}|~~~|}}}~~||~€€~~~‚���}~�…ƒƒ���‚ƒƒƒ‚ƒƒ‚‚……†…„„‡‡†…††‡‡ˆˆ‡……ˆˆ†‡‡ŠŒŠ‰ˆˆ†‡‡ŠŠ‰‰‹‰‰‹Œ‹ŒŒ�Œ�ŽŽŽ�ŽŽ���Œ����ŽŽ‘��‘‘���’‘‘‘‘��’’��’’‘“•••‘��•——•”“”””–––�¨«¨ª«¬¬­¯¬§�Šnghprvwriec^]\WQPRRXo‘•‰‹�¬®±´º¾ÁÁÀ¾¾½¿ÂÄÂÁ·¨œšž�›œŸžž��œ��žžžž�Ÿ¡Ÿœ›œ�œ�žžžŸŸŸž�›››���›œœ�œ›šš�Ÿžž�››šœ��œœ›žžžœœ›�œ�œ›šš››�ž›™›œžžžœœ›››�ž�›��žž�š˜šš››š™™›œš›™šš››œ›œ›šš›™™›œ›šššš™™šœœ›š™™›˜˜š�𙙛𙗗™š—•–™š˜—•–—˜——–––™˜™™˜–•••–˜–––••——••””””“™©Èã‘’•™š”‚d]acadffdeeddeeffhffggghhhighjkjjhjjkjkkmmoommmmlnpomklmnpppnopspppssrqrqsttsrrsuvutttvuuuwvuuwwxwvwzzzyyz{||zz{||yz|{z||~}}�‚€}}~€€€�‚���€‚‚ƒƒ‚‚……„„„……††††ˆˆ††††‡‡‰‡‡‡ˆ‡‡ˆ‰‡‡ˆŠ‰ˆ‰ŠŠˆˆ‡‰‰ŠŠ‹ŠŠŠŠŠ�Œ‹Œ��ŽŽŒŒŽ�Ž‹ŒŽŽ���Ž‘�‘‘‘��Ž�‘‘��”ž¥¤Ÿ£¦©ª¨§¥¢š…jcennpnf`eje]WROMLPTiŽ�‚‚�ž¦®°´´¹º¹·º»»»¾À½³£––™™™™™•—™œœš—˜–™œ�š™—™š˜–•—š››œ›™—˜˜™———™™šš˜–•“—™™————˜˜˜–—————”“”–”•–˜•••˜—••—šš˜–––———••••–™—–•–•————–•—˜˜——–•–”““–––”””—˜—““•–––•“‘“•“•––“““––••–•“‘”““’““””“‘’““‘‘’““���‘’“’’‘’���‘‘�‘’‘‘‘’’���‘‘��“ ¿Þ’•›ž�™ˆi`fgfeffgiihhhikllkkhijljklllmllmnlmnqqqqqqppprqqpqppqtssqsrrruusstuuuuutvwxvvwxyzzzxxxzz|||||{{~~~~€~~ƒ‚€€‚�‚���‚��ƒƒ‚�‚ƒ„ƒƒƒƒ‚ƒ‚„ƒƒƒ„ƒ……‡‡…„„„…†††††‡ˆ†‡‰‹Š‹‰ˆ†ˆ‰ŠŠŠŠŠŠ‰ŠŒŒŠŠ‹Œ‹ŒŒ�‹‹ŒŽ��Œ�Œ������‘“‘���‘”•“�’““’’‘‘�“““‘“••’”’’••““““——–𤍍§¬«­­­¬¬¨Ÿ‰oinvwusrjhhd`]YUOLOXp•“‰‰Žœ¬³¶·¹»¼»º¾ÁÁÀÁÀÁ·ª��žŸ�œ›žžžžž�›œ�ž�žŸ¡Ÿ�œž��žŸž�›Ÿ ŸœœŸŸŸŸ�œžžž��›��žžŸŸž�žžŸŸ�™™›ž››šš›œ�œœ›™™››��žœœ›œ›���šš›�œœœœ››œ›™™œœœšš™™—›ž�š›™™šœ›››�™–˜˜™š›šš™™——˜š™™™š˜˜—˜šš˜–˜˜™™—•–˜š™˜—˜•••——˜——•–––••••”“”•—˜˜•”“•—™–”“”‘‘•©Èâ‘”—››“�f^cecceeecddeggfffggghhjjjhjhhikiihjjjlmmlllmmmllmnmmkmmoppoooqqqqppttrsuuttttsuuwvxvvvxxyyxvwx{|zxxxxzzzz|{||||~~|z|}~~|~~~€€}||~„ƒ€}}}‚‚€�‚�‚ƒƒƒ„ƒ‚‚…‡„ƒ…†…†††………†††††„…‡‡‡ˆ‡†ˆŠˆ‡ˆ‡ˆˆ‹Šˆˆ‹‹Š‰‹‹�ŒŠ‰ŒŽ��ŒŒ�ŽŽŽ�‹‹Ž��ŽŒŠŽ�Ž��ŽŽ���‘�Ž�‘”‘�•Ÿ¤¤ ¤¦¨©ª©¦ ›ˆldfouuqnlhb_\[ZRJKPVhŽ–”••›¥ª¯±´¶¶¶¸º»»¼¼¼»´¥•–———™—–—››™™š•–˜šš™˜˜››˜–——˜™™—™™˜˜›œš˜——››š™˜——˜˜™š›™˜˜š™™˜—•—˜˜••˜œš˜—————˜˜–˜˜™™š˜—•—™—•••—˜™˜˜––—————–———————••“–•–•””—˜˜””•””–™—•••“”–—•—–•”•——““““”””•”’’“”“””•“““••–“�Ž�’“‘‘�‘‘�‘��‘‘�‘���‘‘����‘’¡ÀÛ•”šœœ˜Šiafhffhiiijjkjkkmkkkkkmnmmmnnmlnonnnoonnnppqqqoqrrrrqqqssssrrtustuuuutvwxvvxzwuuyz{zzzzz{{zzz}~~||||{~}}}}~�€€€€�����‚‚€€ƒƒ„ƒƒƒ„„„ƒ„†„‚‚‚„………ƒ„†‡†‡„…‡‰ˆ‡…ˆŠŠ‰ˆ†ˆ‰ˆˆŠ‹‰ˆ‡ˆ‰‹‹ŒŠ‹‹ŒŒ�ŽŽ��ŒŽ��Ž��Ž�����‘“��Œ��‘‘“‘��““‘���’’‘‘‘“””“••”’’’–—˜–˜Ÿ¨©©¬¯¬ªª­­§¢ŽpghnstutwpfbcaZRMNTZn”ž›ž¤©«¯³µ¹º¾¾¾¾ÀÀÁÃÄÀ·©�™œœšš››�žœœœœ�žœœ�ž�ŸŸŸ�›™™�ŸŸ ŸžžŸ��  Ÿ�œœ�›��œ››œ Ÿ�šžžžž�œšš›�›››œ›šš�œ›˜™™šš›››œœ˜—›ž�››œ��Ÿ��š›œž��ššš›™ššš››˜˜™™š››™šœœ™š››››™šš›™™™˜™›šš™˜™™š™™™š—•–™˜˜šš——–——˜––—˜˜—–”•••”””•”””–••”–•”“•––”’’“•—¤Ââ‘�–𛕆d\cdaaddddffgffeggiihghhjjiihjljijllkkjkkkkmmmlmmlkllnonmmnoonpqqqqqsrsssrsqssttvvvuwxxwxwwvvxxyz{yyxz{zyyxyy{{{|}||}}~~}|}|z~}}||€‚~~��~€‚�‚„„‚…„„ƒ†……††„„„……†ˆˆ„‚„‡ˆˆ‡……†‰‰‰ˆ‰‰‰‰Š‹ŠŠ‹‹‰‡‡‰ŠŠŠ‹‹ŠŠŠ‰Š‹��ŽŒŒŒŽŽŽŒ�ŒŽ‘‘ŽŽ��’’’������’•˜¢£¢£¦©«©¨§£ž�sifipqpmmebb`ZUPONPTi’Ÿœ� ¤¥ª±µ···µ¶·»½¿¾¾¼³¤˜–—–—˜˜––—™™˜—–—™š—˜™˜˜™˜š™˜™šš››™˜™™™šš™™›™˜š˜—˜—˜š�™——š™———˜™˜—•”—˜˜——–—•—˜˜•–””•—™˜”•–˜—””–––—˜˜——•––———•••™™—””””•••––•–—˜—•’’’–——––’““•””•”““”•”’’��’“““‘‘�“”–•“‘‘‘’””“’‘���‘��Ž����‘‘’��Ž���ŽŽ��Œ��‘œ¹Û”•™›œ™Šh_dgfffhghjjhihikmkijllkmmjilmlloppmmmpppnoproppopooorrrrrqsstrstwvuuwwwwwuuwwwxyy{yxxwy}{{z{{|}|{}|{|~}}}~~€€~~€€€€‚€�‚„‚‚�‚„„�‚‚��‚‚‚†…ƒƒ„…†„„„……†…††‡ˆ‰‰ˆˆˆˆ‹Œ‰‡†ŠŒŒŠ‰‰‹ŠŠˆ‰ŠŒŠŠŠŒŒŒŒŒŒŒŒ����‹‹�ŽŒŽŽ�’‘���‘‘’““‘�‘‘‘‘‘�“””’’’””•”““•–—––””•›¤¦£¤ª«­­¬ª§¡”|mjrwwsusnhea\YRRTXZm•¤£¤¦¨©±³µ¸»»¼¾¿ÀÁÀÃÆÁ¸ªœš�Ÿžœ�žžžŸ›šš›�žœž���Ÿž�ž�ž ¡ž››ŸŸž��ž ž���œ�žžœœœœœœœœžœœžŸœœ›�œ›šœšœ›››œœšœ›˜™ššš››š›™™˜˜™�œš˜œ›œœœš›ž�šš››™™š››—™š™—™˜š˜˜–˜˜˜˜ššššš˜˜˜™™—–—˜–——˜˜›™–•—˜™˜™™˜™šš˜—˜˜™˜•——˜——••“”•–•••••–——–•““•“‘’”””“• Àã’“———”‡d[bdccdedeeedffggffihgghjjjiihijjikkkkmllklmmmmmmklmklnnppnmknpqpqqqrrqrrrrttuvwxywttuwuuvyxxwxwyyywuv||{zzzyy{|{zz||{{}|}}~}}ƒ�|{}��€���~‚‚€�„„„‚‚ƒ…„„„„„…………„†ˆˆ††ƒ……ˆˆ‡……‡ŠŠˆ‡ˆŠŒŠ‡‰Œ‹‰‹Šˆ‡ŠŠŒŒŽŒŒ‹�Œ�Ž��‹ŠŒŽ�Ž‹ŒŒŒ����ŽŽ‘“‘‘���“‘�’š£¤Ÿ ¢¤§©©¤ ™�}kbfhlnqoidffaZROTY_q‘Ÿžž£¨©¬¯µ··¶··¼¾¾¾¿¾½¶§—•››š™™—˜˜˜–——•–šœ›™—––˜™™——™�œ›˜–—ššš˜˜˜˜––—š™™™™˜š›™—˜—•˜›™–––˜˜˜˜˜—™˜—”•––•••”“•˜™˜•–——”——–•••™˜—••”•–—–”””•–•”•”””———““”—––––•–––•–––•”•••••’’•—•––•‘‘”—•––•““’’’“”“’‘’‘‘���“‘‘‘“’’‘��“““‘��‘‘‘��Ž���’�»Û’•›�œ™‹i^fhhfhhhfhhijjjjmlkkkkllllmlmmmlnnnnppppoopqpqqppqqrssttrqoqrrruvvvutuxxvuuuxxxxzz{yyy|||z{{{{{||zz}}}~}}}�€~~~~€�€����‚ƒ‚ƒ�‚„‡…ƒ‚‚ƒ„ƒƒ…ˆ†„†††‡‡‡†…‡‡ˆ‡‡‰Œ‹Šˆ‰‰‹Œ�‹‰ˆ‰Œ‹ŠŒŒŒ�Ž�ŽŒŠ‹Š�Ž��‘ŽŒŒ���Œ�Ž��ŽŽ���‘���‘“”“’‘’‘‘‘“‘‘”’‘“••”’”•••—˜ž¥¥ ¥¥¥¥¦¤¢ œ�{lfjnpprokfdcaZUSX]du—££¡¤¨¯´´´¹»½¿ÁÁÀÂÂÄÅû«˜—›žžœš�žž�›™›œ  �œœž��›œ›œ�Ÿž��œ›�žžœœ��›šš››œž��œœœ�ž ž�� ŸŸžžœ��Ÿ   žš˜›�žœœœœœžžŸœœœœœœšš››š››››œ�››››™šš›™˜˜ššš™›››š™˜›�ššš˜™›››™™™›š—–˜š›™™—™™˜˜™˜˜˜˜™šš——–˜˜—–——™™™––•–——”••–––—––””••”•“•••”“’““’• »Þ’“—™™—ˆg[bddceddeffgffghhgiihghijhghjjjhiikkkjkllllmnmllmmlnopnoppllknprrqopqsssrrrssqttvvvvwvwvwwxxwvvxxxwxz{{{{zz{{|{{{}{||}||}}}~~}|}€��€}‚ƒ�‚��€�€ƒ‚�€�„ƒ…‡…ƒ„„„„„�‚ƒ…ƒ…††…††‡ŠŠ‡††‡‰‡‡ˆˆ‡‰‡ˆ‰ŠŠŠ‹Œ‰‰Š‹‰‹‹‹‹Œ‹ŠŠŒŽ�ŠˆŒ�����ŽŽ�����Ž��‘‘������‘—ž›�‹‰ŠŠŒ‰†��{qgfglmmmjfdee`WRNRY^l�žžš›Ÿ¨¬¯²µ¸ºº¸¸»¾¿¾¼¼µ¦—–˜™™™˜™—–—™™™––—™™š™—–•–˜™˜˜—˜™›™˜——™�™—•—™š››˜•”–™™˜˜˜˜™›œœš•–—™™˜—˜™™™–––˜™™—–”–—˜————•———•–•———–••”•–———–”’–˜™•“‘“–—“““•”•––•““•–•••–””’“““’“““’•”“““”•”•”“”’’’“““‘�ŽŽ�“�‘’“‘“““’‘�‘‘‘‘���’��‘’Ž�Ž�Ž�‘›·Ú”•™›�šŒi`fgffihgfggijihjjlkkjkjlmmkklnnnnmnnoopppnoorpnoqrsrqpqssqqqqtuuuuuutvwwvwwwwwwwwzxwwxz{|yxy{{}zyy}}}|~}}|~~~~€ƒƒ‚€€€‚�ƒ‚‚�‚‚„ƒ‚‚ƒƒ…†…ƒ‚‚ƒ„‚ƒ„„ƒ†‡ˆ‡‡…‡‡‰ˆ‰ˆ‡†ŠŒŠ‡…†‰‹Š‡†‰Œ�‹Š‰‹‹‹Œ�ŠŒ‹‹‹Š‹ŽŽŽŒ‹��Œ���ŽŽ�ŽŒŒ��’�ŽŒ�’‘���““’“““’““”””••’““’’”—œ“ˆ‡‰‹Ž�‘�Šƒwkegkrpopollgc]WSTU[^jŠŸ£Ÿ—�®²µ·º¼½¼¼¼¾¼¾Àÿ»­�šžŸ žšš›žžœœ›™� Ÿ›™šžŸŸžžžŸžžžž�œœžžž�›œ���Ÿžžž�š™š��›š�Ÿ��žžœššœ��œž›™˜šš›››™™šœ››››™™™šœš˜˜œœœœ›˜™››šš˜š››œ�›››šš››š™˜˜™ššš———šš›šš™˜—™™™™™™šš———™—–—™™™˜˜——˜™–—–—–––—˜•“”–•••–•••••–““–••—–•”•”“”•“‘‘“�ºß’’”—™–Œj]_cccdeddecccffgggfghifghjfffjkkihhklkkkmlllmlmnmkmmnmmoppnnnoprpppqrrpooqrsqsuututtuvvwwvutttwxxwxxxwxxyxyyzyxyz{{|~}{{~}}}~~~~}~���}�‚�€ƒ‚€‚ƒ‚��„…†„„„„ƒ„ƒƒ…††‡ˆ‡‡ˆ‰ˆ‡††„…ˆ‰††‡Š‰ˆ‡Š‰ŠŠŠ‰‰‹ŒŒ‹‰ˆŠŒ�‹‰ˆŒŽ�ŒŠŠŒ�Ž��ŠŠŽ‘‘�Ž��’’‘‘���‘�‘•›��œ ££¥§¤ —‰ueckortnmjfcb^WNLNV]m‡™œš—�¨®°±´¸¹··¶¹¼¼¼¾º´¦˜”—š›™˜˜š˜•—šœ˜—–˜˜˜—˜——•˜šš˜—•—˜š˜—–—™™˜—˜™™™˜–—•–™š™—•—––˜›š™™™™™š™—•–˜—••–—••••”˜——––•••–—–•””“•””“””•–˜˜–““–˜——–—–••—•––“””–••’“”–””’“””’””“’’’“•–”‘’’““““•“’�’��‘“’“’’‘‘����‘‘‘‘‘�‘��‘““’��Ž���‘�ŽŽŽ�™¶Ú–”—›�šŽk`dfeffhihfhiihghjkjjihillkkkkmnnmollmonnlmoqpooopppqqqqqsssqrrvvvuuuutuuwwwxxwvwxzzzxyxyyzyzxz||z|~}|z{}~}||~~~~~~����‚ƒƒ�‚‚‚‚‚‚‚ƒ„„ƒƒ„…‚‚ƒ†…„ƒ„„„……ƒ„„†ˆŠ‰ˆ‡ˆˆ††‡‰‰ŠŒ�‰ˆ‰�‹‹‹‹‰‰ŒŒŠŠŠŒŒ�Ž��’’��‹����������ŽŽ�����‘’’‘�Ž�’’’“’““““–••“”’“–••œ¥¥ŸŸ§®®­«§¤ –mhpqwxsmllljdWMMSY`p‰›Ÿ££¦ª±µ·¹¼»º¼ÀÀ¿¿ÀÄĽ­š—›�ŸŸŸžž�Ÿ Ÿšœœ�Ÿž��šœžœœ›�žŸŸŸž�œž›šœŸžŸžŸžžœ›š›�ž�›š›ž�œœžžžžžœ��žžž�œ™›�žœ››ššš›š™˜ššœ››˜ššœ›šš�š——�žš˜šœ›ššššš˜šš›™™™š™š™˜–——•“—™™™š›š——™™—–—–––——™›š———––™˜————––•––—••••”•”••—•“•––””•–•“’”’“”•’��”�»Ý��”—š˜ˆh]acbcdeddcddedeghgfefefhhhhhghhhhhhiikkjhkllkllklnnppnnmmnpnmmprrooottrrrqqstssrssrstvvvvwuuuutvxzxxwxxzzxwxy{{|}{||||||~}|z|~}}}~~~€ƒ��ƒ‚�‚ƒƒ‚…„‚‚„………††…„„†‡†„„‚ƒ„……††‡‡†……ƒ†‰‹‡……ˆ‰‰‰‰‰‰ˆ‰ŠŠ‹‹ŒŒ‹Š��ŒŠŠŒ�Ž‹‹��Ž�ŒŽŽŽŽ�����Ž‘‘‘�ŽŒŽ�““—¡¥¢¤¦¦¨ªª¨¦Ÿ”€ofiosrpookgd_VRSSW^nˆ›žžŸ¤ª¯±³²¶·¸··¹¿½¼¼¼´§š—™šš™ššš—˜˜™˜˜–——˜™šš™–—–—™˜˜™™š›—••––—˜š———œœ™•–˜˜–˜—–™›š™š™˜———™˜—––”•–—–—–——–•””–——–•••—–••–•–––”••••—˜™•””–˜˜—––••“—™˜““”–•—•“’“••“•—•““”’’”–’’“•“““‘‘•••”“‘‘‘’‘‘�‘‘‘“�ŽŽ��ŽŽ�����‘‘‘’‘‘��ŽŽ����‘��‹�˜µÙ•’”˜œšŒlaeeeegggggfggghhijjgiilnnlllnlkjllnonnnnmmmnppmnnpoooqqssspppsttrtttuuuvwuuwxwwwwx{zyxy{|{{z{{||{||||}{{{}}~}|}����€����‚„„„�€€„„„‚‚‚„……ƒ„ƒƒƒ……†ˆˆ……††ˆ‰ˆ†ˆˆ‰‰‰ˆ‰ŠŒŠˆˆˆˆ‹Œ‹‰‰‹‹Š‰Š��‹‹‹�ŒŽŽ�‹ŒŒŽŽ���Ž���Ž�Ž��‘ŽŽ��’‘��‘‘“‘‘’”““••”’“’’”—˜ž©«¤¨©­¯±®«¤¡—ƒkfjpz}tpnjhhe\XVXZ]kŒŸ¥¥¨¨©°¶¸¸¸¸¸»¾ÁÃÁÁÂú«š˜œ ž��Ÿ�›œ�žŸ›š›››œ�›š™�œ���››�žœœžžœž��œ�œœžžœœž�œž�™›�ž�œœ�œœ›œ›š™œœ›™——˜›œ›˜šš™™›››š›šœœš———š›™˜˜™™š™™™››ššœšš™š˜šš™˜™™šššš›�›ššš™š™™˜™™˜–—–˜–••—–––˜™˜˜——•––•”–••”•”••—–––—–••—–”””““•–•“”’““““”“•’��š·Ü‘�’—˜”†h]bcbabbbbeedccceggggiihhihheegihhhhgikkjkjijjkkkklmnmmoonprrooorqqqpprrppqrssrsttrssvuutvvvvyxwwyzvuuvy{zywxz|{zz}|{{{z{}~|y{~~~}}~€~€‚}}�€€�€‚ƒ„‚��„………††ƒ„†‡‡‡„……†…††…„†‰ˆ†††ˆŠŠŠ‰‡‡‰‰ŠŠŒ‹Šˆ‰ˆ‹Œ‹‹‹ŠŒŒŒ‹ŠŠ‹ŽŽŽŽŽ����‹�Ž‘‘‘���’““‘���‘“˜¡¤¡¤¥¨ª«¨¦¢ž”�kcfoxxrpomga]\WUWUU`—Ÿœ £¨­²³³²³¶ºººº»¿À¼³¨™•–™——™›˜—––—™––—™™šš––——”•˜›š˜—˜————•—˜™˜˜˜˜———˜—–˜˜˜——––•–——””•————˜————–•”•––——–“”””“–—–“”“““•••••––””••———••••”——–“““–•”“•••••”””••””““‘’’“““‘“‘“””’“““““““’��‘’’‘‘’�Ž�’’“�Ž�Ž�‘�Ž�Ž��‘’������ŽŽ�Ž�‹ŒŒ”°Ø—”—™œ›Žmadfffgghhiijhhhjjkkkklmmllmmllnmllmlmnoopnlkmnonooqsrppprstttuuvtuuutvwxwvuvvxzywwxyyzxwzyy{{z||}|{{||}~~|}}~~€�€��}~�€€‚‚…„‚‚ƒƒƒ……‚‚ƒ…„„…„…„„„„„††‡………‡‡‰ˆ††‡‰‹ˆˆ‰Š��ŠŠ‰‰‹ŠŠ‰ŠŠŒŒŒ��Œ‹ŠŒ��Ž���ŽŒŒ�����’’�ŽŽŽ������’“’‘’‘‘“”””–”“““’”“•••–˜›¦ª©§ª«¬¯¯¬§¤™ƒlipy~~wxtmgd`\XXZZZd›ž“Ÿª¯°´¹¾»º»¿ÂÄÀÁÀÂÁ»¬œ™�žžžžž��œ�Ÿ �œ›œ›œ›ššœ�žžž žœœœœšš›��œ��ž����œŸŸž�ž��››š™šœ�›šš›œž��››™™—™›œ››››™™œœ˜™™˜šššš›™™™š™šššš™™™———››š™˜™™š˜——™™™—šš›™˜—™›œ™™™™˜˜˜˜˜——˜˜–————™•”•–••”–——•••——–•”•••••”””””””–•””•““•“‘’’’’‘‘���š¹Þ“�“•™—�o__bccefdcedddffggfeffhhgfghhhiiiiihijkkjihkkkjmmmkmlmmnnpppooooqsrpoprrtsrqtssststuvuvvvvuttvwwvvvxwxxywxxzyzz{{||zyz|{yy|}~~}|~~€~}€��~~�€}€}�…‚ƒ„ƒ��‚‚‚ƒ…ƒƒ„†ƒƒ„…ƒƒ…‡†……„†ˆˆ††„†‡Š‹Š†ŠŒ�ЉˆŠŠŠŠˆˆ‰‹‹ŒŒŒ‹‹ŒŒŠŒŒŒŒ�‹‹Œ‘�Ž��Ž‘‘�Ž�‘““�����“™£¦¥¥§¨¬ª©§¤Ÿ•kgpsssppomdcb]WVXZX_w“—Œ–¥©«±¶µµ¶¸º»¼º¼¾¾¼¶¨š•™™˜—š˜––—˜˜—––——˜˜•—––—™™›››šš——˜™˜—–˜›››˜–—››™™™—™—˜˜––™———˜••—˜–•˜—––—––“–˜—•••———––””•••••”““”–˜—•“““––—––”–—˜—••”’“–—–•—–•”•–—–•”””•”“‘‘“““““””’“•—”‘‘’’“‘“““’’�‘‘‘���‘��ŽŽ�‘‘���ŽŽ’‘‘���‘����ŽŽŒ‹ŠŒ“®×–“—›ž›�kacgffegggfghjjjkkjjjhjlkijiiilllkkkmnnkllklnnooooopponoqsqrqrrsssstttttwwuttuwvwwxxyzywwvwwxwxz{zz{{{{|}~}}}}|~€}|}���€�������‚‚ƒƒƒƒ„‚„……‚��ƒ…†††„‡‡……†‡ˆ‰‡‡‡Š‰ˆ†††ˆˆŠ‹‹ˆˆ‡Š‹ŠŠŠ‹‹Œ‹‰‰‹‹‹Œ��Ž‹‹‹�Ž���ŒŽŽ��Ž�Ž‘‘‘���’’“““’“’’’•’‘‘”“”–•““•”•�©«¨§ª­°°¯ª§¢™‡rmsvyyutrohd`ZWYZY\jƒ›¡žœ¢«°´º»º¹»¾¿¿À¿ÁÅź¦˜™œœžžžœ›š››žžœ›�žž�›š›œ›œ›››ž���žž�œ�œ�Ÿ ››œ�š™›��œœšššš›�š›ššš›š™™š››››™™›››š™™™™š˜™šš˜˜˜›™˜˜˜˜›šš™˜˜™™™™˜š™—–™›š˜˜™›˜˜˜˜˜š›››™šœ�›››™——˜™™š™˜—™˜š™™˜˜———™—————–—˜—•””–••’”””“”‘”–”““‘“”“““••”’’‘‘���‘‘“™¹Ý‘�’•—•Œra_``acddddedddffgffhheeeggfgihfghjhhhhhjghjkijjjkmlllmnmnnooonnoppqppoqqqqqruvtttuvusutsstttuvuuuvwywvwxxyxwxxxy{zz{{z{{}|{{}~€~}~€€~}~�����ƒ…„ƒ�‚‚„…………ƒ‚ƒ…„‚‚ƒ†…‚�ƒ„†………ˆˆ‡†††‡†……†‰Š‰ˆˆˆˆ‰‰ŠŒ‹‹ŠŒŒŒŒŒ‰ŠŠ‹ŠŠŠ��ŒŒ��Œ�Ž�Ž�‘����“‘‘‘’‘‘“™¢§¤¦§©««ª§¤ž•†qiqtvxzurmhdaYUSUVWa|•Ÿ�™œ¤­°²²µµ·´¶·»¾À¾¼µ©˜•˜šš˜————™˜——˜—–•˜———™—–”–—˜™˜•™š˜———˜šš›š™—˜–—˜›™˜—™™˜—••–˜—•”•–—–——˜––”–––•––•””•–•”””“““••”–””“•——“”’“–˜——••••–˜™––””•••———–––˜˜—•”“•–—•“’’““••”“•“”“”’’’”“‘‘““’‘‘‘‘‘‘’‘’’’���‘�ŽŽ‘�ŽŒŒŽ��ŽŽ��ŒŒŒŒŒŒŒ�‘«Ó““••™œ�odfgfedfgghhghhhijiihiijjkkkjklmllkklnmlmmlkmmonnnpoooqooqutrqruurrrtusttuuuvwwxyxwxwxzywwxxxxxxxzzy{{||||~}}}~~~€�~}|�‚ƒ‚€���ƒ‚‚‚„„ƒƒƒƒ……ƒƒƒƒ„„……ƒ…†‡…‡‡‰‹‹‰‰††ˆˆ‡‡‰Š‰‰Š‹‹ŠŠ‰‹Š‹Š‰‰‹Š‰‰‹ŒŽŒŒ��ŒŒŒŽŽŽŽ�Ž�‘‘�ŽŽŽ��‘‘�Ž’‘��’’�‘‘’’’’“••””“•’’“œª«¦§©­­­®­¨ —ˆspuwz€ƒ}xtsnh\XWY[^j„—¡¥¥¨¬°³·¹º¹¹¹¼¾¿½½½½¸«œ›œœ›�ž�›››ž �™—™›Ÿžœš™™›œœ›�››œ Ÿœ›�žŸžœœ�œ›��žžžŸ ��œžœ�œ›š™™šœ›››œšš›œ˜—˜›�žš™™›�ž�›™˜˜˜š›š˜˜˜™œœšš™šš™—š›™—™™›šš™™šš™˜™››ššš›››š›šš™š›œ™˜————˜š˜—™˜–•˜–•–™——–—–——•’“”–•––””“““––•””’’’••“‘’”•’’���‘�Ž�˜ºÝ“�‘•˜—Œra`_``bdebccffddffeeffeefhhhhihjijihgjjjiijlljihhjmmkkmmnnnmnnoopqqooopprrrrrsstssstsrruuuttsvvwuuvyxxxxzzxwyyxyzx{{|{{z|||}}}€€}{}|~��~€‚~~����}�ƒ‚‚€€�„†…††††††…ƒ„††……ƒ†‰‰†‡‡‡‡ˆ†…‡Šˆ‡‰‰ˆ‡ˆˆ‰ˆ‰‰‹ˆŠ‹ŒŠŠ‰‹‹�ŽŒ‰Š�Ž��ŽŒ�Ž��ŽŒ�������‘“”“‘�‘”™¡¤ ¤¨ª©«ªª§¤˜‰smosv||xuuspom`UUWX\o�¢£¡ ¥­²²´¶··»»º»º¹»»¶«™”—›šš™™˜™™››š˜™™™™ššš—•——˜œœš™———œ��›™–—˜›™˜———œœš™––™›™™——•˜˜——˜—˜——––•–––˜–”””–™—••—––”””–•—––••–˜——•“’’””””’”——˜˜˜–•““‘“––“““–———•””–•–——“’’•––’’’”“““”‘‘“–•“’�’�ŽŽ�‘�Ž�‘’��‘‘�‘‘’‘ŽŽŽ��������ŽŒ�ŒŒŠŒŒ’ªÒ–“–™›šŽsdbdedddffhfgijhhgiiiihhkmlkkkjmmmlmmnmnmooomnlmnooprssqqrsqqqrstststtuuwvvvvwwwwwwwwzzzxwwxxxwyyz{||||~}}}}}}}~~~�‚€~€€€~€‚‚‚‚€‚ƒ„ƒ‚‚‚‚„„„…„„„„„†…†…„ƒ…†‡†‡‡ˆ‰Š‡…‡‰‰ˆ‰ˆŠ‰ˆˆˆ‡ˆ‰‹ŠŠ‰Š‹ŒŠŠˆ‹ŒŒ‹‹Š��Š‹ŠŒŽ�ŽŽ���ŒŽ‘���‘���’‘�����‘‘”“‘‘••—••”––““—�¦©©¨ª¬¬®°°ª¤š‡nlxƒ€|zx|{onqn]X\][c{—¦¦¦©®±¶·º¼¼¼ÀÀÀÂÃÀÀÁ»¬›™šœž��Ÿ�›™›œ�››™š›žž››šš��œ�œ››�ŸŸžžžž��œ›šœŸ�š›šœ����ššššœ�›šœœœ›žœ›šœœžœ™™›šššš˜—™™ššš™™šœ›™—ššœš™–™››š››š™™šš™šœœš™ššš˜˜˜š™š™š™ššššššš™˜˜˜————————˜˜˜—˜–••———––––“‘’”•“”””’“”•–—”””–••”•••“’’’’‘‘��Ž��˜¸Ý‘Ž‘’–—‘uc]^]`bbcddcccfffeeefeeeffffhhghhikihhhjklkjiiikkiillmonlmmmnnnnooppoprqqpppqqssssttttvvvvuutuuvuuvyzyvwvxzyxz{|zyxyzz{}}|}}|{}|~~~}}€€€‚€}}�€���€��‚ƒ„‚‚‚…†††‡‡††………††…ƒƒ…‡†‡††‡ˆˆˆˆ†„†‡‡…‚�…Šˆ‡ˆˆˆ‰‹�Œ‹ŒŒŒ��ŒŒŽ������ŽŽŽ�‘’’‘��“•—•‘‘•™£¥££¨¨¦©«¨¦¢šˆojt{|}zz{}smjh`^^\\ap’§¤Ÿ¡¨­°²µ¶µµº¼¾¾¼»½¼¸«š•——™™˜—˜˜—™™˜–•”˜šš——™š–˜˜—˜™—”–˜˜™š™˜˜˜——–™˜—•–™™—˜–—–——˜––––—˜˜•———˜™——•–—–”–––•–””“•””””“’•––•••••–••’’”——–””””––•—•”••••–“‘‘•—–••“•””“”““’””””’’’’“••”’‘�‘�’’�Ž��‘‘’‘’‘���Ž�‘��Ž�Ž’‘���Ž�‘Ž‹Œ‹ŒŒŽ‹‰‰Œ“­Ô“’•˜š˜�ue_cceeedfddfihgfgiijjihjklkkjkkmllllmpnmnonlmoppnnooqrqpqrtrqqstusstvvuvtssuvvvwwwvxyyxxxxxyxwvx|}}{zz||||}~}}|~�€€�€~�€€€€�‚����‚‚„……‚‚ƒ…„ƒ……„…†‡‡†…†ˆŠ‹ˆˆˆ‹ŠŠ‹ŒŠŠŠ�‹ˆˆ‹Šˆˆ‰‰‹Œ‹Š‰‹��‹‹‹‹‡‚}…Ž�����ŒŽ�‘��Ž�’‘‘���“•–“’’“’““–––•”“““””•˜�¤§ªª«ª«®±®ª£›Šwu�І„„yqpsoa]``]bwž«¤£§­´··¶»¿À¾½¿ÂÂÀÀ¿º«�™œžžœžžžœœ›››�š—˜œž�œœœ›��œ›œšššžŸ �›šœœœœœœš��œœœœœžžœœšššž�œ›œ›š—˜™›žž››™—˜šœ›š™™™ššœ›™—™šœ›™——™››�œ——˜š™™———š››œœšš™ššš™™™šš››šš™››šš™˜šš™———˜———™•”•———˜”’“––––”’”•—–˜•““”’’”–““”•’’”•””“’’��‘���Ž‘‘“š¸Ú‘�’–˜•�ud]```accbbbcedddeeffffhhfghhgiijikkjhjkmlkijjjlmkkmnllmnnnnmoopoooqqpprtrpppqrssstuustuvuustttuvuvxzzzwwx{xwwvyz{zyy||}|~}~~}}~~~€��~}€€€�‚�…�����‚‚‚‚‚‚ƒƒ„………„††††††ˆ†…„‡‡†„†‡ˆ‡†„…‡ŠŠ‰‡‡ˆˆ†|pmx…Œ‹ŠŠŒŒŒ‹Œ���Œ‹ŒŽ�����Œ����Ž��“�Ž�Ž�‘‘““““— ¤¤¤§©ª««§¤ š‰wt~‚€|�‚‚vqsnf`__\`t—§¤¢£¦­±´µ´´·¹¼¼¼¸¹»»µ©™•˜™™˜™——˜™–˜™˜–––••––™š™——™™—————–›››˜—––•—˜™—•”—™—–——–—•””••–˜™–••˜˜˜–––————••–“‘••“’”–—•”“”•–•–——–˜™—“’“••––•”“”–™™™—–•••——˜–•“–————””•••–—“•”“‘‘““�’••’‘‘‘�‘‘�����‘���“‘�Ž���‘‘����Ž���Ž�Œ‹ŒŒŒŒŒŒŒŽ�Œ�“¯Ð“’”™››’}g^`cdfddeeghhhhfhhiiljjjkjkkkklllmmllllmmllmmnnpoonpoopsqqrrrtttvvuuvwwvxxxxxwxwxxyyyyzzyyyzzyyx{}||{||}{{{~~~~€�€~�‚‚�ƒ‚‚‚„…„�‚ƒƒƒ…………†…„…………‡‡‡†††‡†ŠŒŠ††ˆˆ‰Œ‹‹ŠŠŠŠ‰‰ˆˆŠŒŒŠŒŒŒŒ�ŒŒ�ŽŒŒ‰ykr}…‹�ŽŽŽ���’‘Ž���‘’”’‘�‘“’�‘“““““’“•–•““——––�§¬ªªª¬­¯¬©¥£›‰uvƒ…~~‡�‰€xwzvhaccej|œª¥¥«²´µ·º»¼¿¾ÀÀ¾¿¿¿½¹­ž�œ›™›œžž�œžœšœ›š™šš›œ›˜˜šž�›™™š����œ›š›š™™šššš›œ�œ�›�œ���œ›˜™™ššš��œœ›™›œœšš˜š™š™˜———šš™———˜˜š›š™™››š™š™˜—™™››š™ššœœ�œ››œœ›››šš›š™™ššš™š™™˜™™šš˜——–—˜š™—••—————–—––“““””———–”‘’”•”““””’’“•“‘�““’�’‘��‘��“›·Û���”––Žyc]`a`aaccabdefdbcegggfhhhfhhihjjklljjjkllllkloonmmknnonppomnopppppqrrpqqtsrqttvtssuuvvvtvuuttvxvvuvxyzzzz{yxxzzz{}{||}||{{|~~~€~}{~�}}��~��~‚„‚‚���……ƒ��ƒ…„‡†……††……‡‡‡…ƒ„††††††‡‰ˆ†††……ƒzqv‚‹ŒŠ‰‹‹‹‹Œ�ŒŒŠŠŒ�����ŽŽ��Ž�Ž�Ž���‘���““‘��‘—Ÿ¥¤¢¤¨¨¨§¦£ ˜Šsq{„‚ƒ‡…}xz|n`Z\Z\`s”ž”Ÿ§©ª¯³¶¶¶¶¹¹¹½¿¿½½¶¨™™™—–––—˜™™››˜–——™™——˜™—˜——™š˜™™™——˜›˜––———˜˜––—˜˜–—˜™˜™˜˜–•“•™™˜˜—˜——•••–——–”””–”””””•••”””””””•——•”•–˜˜—”••––˜–••••˜˜—•••˜š˜–––••˜š—””••••–”“““””’’‘“’‘“••“‘��‘”““��’““•“‘�‘���’‘‘‘‘�Ž�����Œ�Ž��ŽŽŽŒ�ŒŒ�”®Ò’‘“—š™‘}i`cddffgfffhhgghhhghijiiijkklkkkllmllkmmnlmmppnnnooopqopprrrrrprtvtttvvvuuuwwvxz{zyxxxxxxvvvxyzzzz|||{{z|}{{|}}}||~~}€�€€}}€ƒ~€‚„‚ƒƒ‚‚‚‚„…„„�€‚†„‚‚„†‡‡‡……†‡†ˆˆ‡‡†††‡ˆˆ†‡‡‰‹Š‡‰ˆ‰‹�Љ‹‹‰Š‹‹‹Š‹‹†‚|{|€Š•‘‹ŽŽ�Ž��‘ŽŽ�’‘��‘�Ž�‘“’‘‘‘�“’’“•••“““•“”˜¢¦¥¤¦©¨¨©©¨¤›Œyw€Œˆ‡ˆ‚}}x��qa[\\_dt•�”£«¬°³µ¹»ºº¼½½½ÀÀ¾¼¹­žš›œšš›ž�œœ���››šš™™™œ››š™™œŸŸœšššœ�œš›š››œ™——›œœœ›™™š››šš››™šš›™™™š˜™˜˜˜�œš˜™šš™™———™™˜™™—–—˜™˜™——–˜™š™™™›™——š›š™šœ›š—™™™™š™š˜˜˜™™œš˜˜™™˜˜™™——˜˜•••–•™˜—–—˜˜––•••––——–““•””””��’–••““‘��““‘�‘‘��‘‘���ŽŒŽ‘—¯ÔŽ��“–•Žze\```adfdb`bcgfecdefefhjhghhhhhgffijjjkjjjjjlkjjlkkkmmmmnnmmnmmppooppppqqrrsrrssrrsuvusstvvuuuvwxutuxxwvwxyxxxzyzzxxy{|}|}|||~~~~~}|€~~€~}~€‚€€‚ƒ…ƒ„‚�€ƒ‚��ƒƒ„ƒƒ„ƒ……„‚ƒ†‰‡†„†‡‰‰‰‡‡ˆŠˆˆ††‚skq}ƒ�—�‡‰ŠŠŠŒ‹‹ŒŒ‹ŽŒ�ŒŒ‹Œ‹Œ�Ž��ŽŒŒŒ�’‘���’“”““– ¢ �”Ž“�¤§¥¤ŸŽwsy€ƒ„„‚zp|ƒzd\^__an�”Ž¡«©©¯µ··¶µº»»¹¼»»¹¸«œ˜™š›˜—••——˜˜˜••–šš™–——™™—–—˜š™™—–•–™œš——˜™—™˜—“”–––—––––––––••••–™˜•••––•”””———–•”–•””––••••“’’•––““•—••“’‘““•–•”“–˜šš—•””••–——“““•——”“““”–“““““’’’“’’’’’“‘”“’�’‘’‘‘���‘�����‘��’��Ž��‘��’’ŽŽŽŽ�ŒŒ�ŽŽŒ‹ŠŠ’¬Í��”˜š˜‘}h]abeeeefgffffgghhhhikjkkkklkkkllnlkklmmmmmoppoommnopqpoqrrqttrqtvvstuvvuttttvwwwxwxxyxxxyxxxyyy|{z||{yz||||}~~|}}}}}}‚�€��€€�„ƒ}€‚‚‚ƒ‚‚‚…††ƒ„…††………†††…††‰ˆˆˆˆ‡‰‰‰‡‡‡‰ˆ‰ˆ‡ˆ‹‹‰‰ŠŒ����‹‹‹‹†xou‚Œ“š’‹Œ�ŒŒŽ‘‘�ŽŽ‘“’�Ž���““‘�’“”“””””••—˜˜••–𣦣—zjq†¡¯«£›�|�€ƒˆˆ…�|w}†jcdabhu��ž¥¬¯µ¶·¹»»½¾¾¾ÀÀÀÁÁ»­�šžžœšœœŸ�›˜šœ��œœ›™™�œ›ššš�Ÿ œ™›žžžœœ™š›žœ›ššœ�œ›››ž›šš››�œœœ›šœ��š››››œ›š™š›š˜˜™šœš›››››˜˜–—™œš™˜˜™™˜˜—™™™š™˜˜™—˜œŸžžš˜™››œœš˜˜™››œ›™™š›šš˜˜˜›šš–––˜˜˜——–—˜–•——•••–••••–•“•••”•–•”•••”“’‘‘’“‘��’’’’’��Ž�—±Ð���’•”�|e[abcabbbabcedcbcceecccdddefefhjhhhjjjjkkkjkkkjkjjlmmlllnmmknnonmmpqpopqqpprsssuutqqsutuuvtttuuwwwvvxyxxwwzzyxy{}yxxyy{{zz|}~~~~~}}||~{}}��}}|�����€�‚��€ƒ„ƒƒ‚ƒƒ……ƒ‚„…„ƒ……†‡‡…ƒ�ƒ†ˆ†„„†ˆˆˆ„„€wrx€ˆ’™�‰‰‹ŒŠŠŒŒŒ�Œ‹�Ž����Œ��Ž��Ž����‘‘‘�‘‘’‘““”ž¤ ‹i`o„›¥¢ŸšŽ€|„ˆŠ†„{z�„�ugbcc`cq�ž¢¥§¨ª¬±´µ³´¶¸¹ºº»¼»µ§™—˜˜••™›™———šš™—————•“•——––———˜™˜—•–˜™˜–•––˜˜˜˜˜––•—–•••–˜™••”–•••˜•”””•—–”‘‘“”””•–—•”“””––•”•”••–•””–——––“’–———–”““•———™—”“””—–““”•——•“‘’••““’““”’’’”’‘�‘�‘’”’’‘‘‘‘‘‘“‘’’’‘�ŒŽ�‘‘���Ž�Ž����Ž�ŒŒŒŒŒŒ‹‹‰‰‰‹‘¬Ì�‘‘—šš“„k^afffghhfghhghhiiihiikjjhjjjjlllllkkmnmmmmooonooppqqqrqooprrrsssststtvvvvwvxxxwxxxxyyyyxxxyz{zzzzxxy{{}}}z{}}}~€~|~~€€‚‚‚€�‚‚€ƒ‚‚‚ƒƒ„‚�‚…ƒ�ƒ„……††ˆ‡†„‡ˆˆ…†††…‡‰‹Š‰‡ˆŠŒŒŒŠ‰‰‰Œ‹‰ŠŒ‰‹‹Œ‹Š‡‡‚ƒ“ ¥¤“‹Ž‘�‹‹ŽŽŽŽ��‘’”“�Ž‘“•““”’‘“•••––•”’““—™œ¡£Ÿ‘pgr…ž­©¤��}|ˆ’�‰ˆˆ…„‰Š�ogdggeet“¦§¨¦¨±µ¶·ºº»¾¿¾¿½¾¿À»ª—š  šš›ž�šš›œ�žžžž�ššœž››œ�œžžŸž���œŸŸœ››œœ››œœœœ›™™›œš˜˜šš™˜šœ›šššš›œ›˜˜š›™™˜˜˜™œ�œœ›š™œ�›˜š�œ�›™™™™�œš˜ššš›š™š˜˜š›››™˜™œœ™˜—™™š›��œ™˜—™™™™šš™——˜™———————–——••——–•—˜™——”•–•””””•”””•”’�“““”“‘’‘‘�‘����Ž��—®Î���“””��f[_babbbbb`adedcccddfeefgfgfgijgfgiiiijjjjiijkkmlllmmmmnmklmnonooopqpqrpqrrqrrutrqrsuvvuututtsuvvuuvxxvxwwwzzyxy{|{{z|}}{zzz|}}{||~~~~~~|}}~~~~��€�ƒ‚�€�‚„ƒ„„ƒ��ƒ…„„………†…„…ˆˆ‡„ƒ…‡‹Š‡…††††‡………‹“› ¦¤�†Š‹‹‰‰ŠŠŠŠ‹‹Š‰‰ŠŽ‹Š‹�Ž’��ŒŒ�‘’’’���‘““’–œ¡ž�f^k‚�ª¢�˜Ž|x€…‡ˆ‡„‚‚…†}ldekmhco�£¡¤§ª¬¯±´¶¶¶µ¶¸¼»ºº½·ª�˜•—˜›™™˜˜™š™˜—–•––––——–˜™—“–—˜˜™————•”–——–––˜––—–“”——””“••—••••–—––”““•—–•””””“•”•••–—”••–•””•••–—––•”””””–“”””“””“”——–••“•––––•”••–˜˜••“•••“‘�’’’“““’‘‘‘‘‘���‘���‘��Ž��‘�‘‘‘��ŽŽŽ���Ž��Ž��ŽŒŒŒŒŒ�‹Š‰ŠŠ‹‹�§ËŽŽ‘–——”„k^`dcdfhffdghiggghghhhhiiiijkkkjmomklmoopmmmooqqppqqpopqrppqqrssqrsusstwwwutsvzxvvwxywyyxvwwyxyzz{|yyzz{|{{}~~~~~€€�}€€���€�ƒ„‚‚ƒ���‚‚‚‚„„‚„…†††„…†ˆ‡††‡ˆ‰‡…‡ˆˆ‡‡†‡ˆŠŠŠ‰‰ŠŠŠŒŒ‹Š‹ŒŒŒŠŠŒŒ�‘™¡¨¯­š�����Ž�‘��ŽŽ�‘‘‘‘�Œ�“”–”’‘”••”•••“”’’”—™Ÿ¤£“peq‡Ÿª¨¨ ‘ˆŒ‹ˆ„Š��ŽŒ€oilpmjju—¬­««°³µ¶¹¶¹¼ÀÀ¿¿ÀÀÀÀ»­žœœ��žž�›šš›š˜–˜›�œœ›œ›œœœ››�Ÿ�›››�žŸ�›™›œœš���›œœœ››™šš™šš›››šššš™›š›™ššš™™˜˜˜™™™™™™™™™›�ž™˜š��›˜™™˜˜™™˜———šš™šš™˜™šœœ™—˜˜š›�š—˜™™��›———˜˜–˜™˜™™—–•—––•—••”•”––”“”•—–•”’““““”””’’‘”””“’’““”“““‘����‘‘�ŒŒŽ’©Ì‹��‘•”�‚hY^a`acdddbbbdeecdfhhfefhhfghgggjjiijiiikiijkknmkjlmoommoollnonnnooqppopppprrrrsrqqrruuuvvuuuuuuwwwuvvxxxxyzyxwxy{{zxz||{zxz|~}~|}~}|}|~}|}~€}�‚€€€�‚‚‚„„�€�…‡†„‚ƒ„…„…†‡††ƒ†……‡ˆ†…„†‡‡………‡�˜œ ©¬—ˆ‹Ž�ŠŒ����Œ�ŒŒŒ�‘‘��ŒŒ‘”“�‹�’’’‘�Ž‘’’‘‘”šŸ ‘nbmšª¤¡š‹xu}‡‹…~†‰‰ˆ‰‚~‰†x{€‚ƒ˜¨¨¨«®¯²³³µ¹¸¸¸ºº½½½»·ª›–˜™š™——–——˜—––———•——•“”–˜™˜••—šš™—–—––——•––™˜–•••—™›————••––”“•••”•””’”–•••”•”””––—–••—˜˜—˜˜—˜——•–•––•““••““““”•••’“—™—”““”””’“”–””–————–””“•—•”’��“’’��’”““’’���’””’���������ŽŽ����Ž���Ž�ŽŒŒ�Ž���Œ‹‹ŠŠŠŠ�¢ÁŽ�‘•——–‰m[acddeegfffghhfjjiihijljjhllljjjnlkklnonnmmnppoonpoooqqrrrrtssqttuusstttvvutvvvuwvwwxxxyzxxy{{{yz|||z{{|}}}}{|}}}}}}�€~~~€ƒƒ��‚‚‚„ƒ‚‚„‚ƒƒƒƒ†‡††††………‡†…†††‡‰‰†ˆ‡‰ŠŠŠ‰‡‰ˆ‰‹Šˆ‹‹ŠŠ‹‹‹‹ŠŒŽ�‹Œ�Ž“ž£©«¨•Œ�‘‘�Ž�������‘‘‘’”“”‘“””“”’“••““”——————™¡¤¢’thp~š­ª¥¡“�~ˆŽ�‡ˆŽ��ŠŠŠŽŸ§£¢¡¤¥©«¯±±±µ¹»¸¸º¼»»½¿ÁÂÀ¿¼®Ÿœž�œ››˜œ��œœ››™›žž›™™™›œ�œœš��œ›œ››ž �›™›››››š™˜˜šœžœœ›™—˜šš™›™›™˜šœ™˜——–™›™™™™™››šœœ˜˜—šš›šš™››š››™——™›š—–™š™—˜™™˜›�Ÿœ˜•—šœš™˜˜™š››››š™š™——™—˜˜™———™——˜š—•—˜—–•••••“••”’”•–”‘Ž‘““‘‘’““‘‘�‘’“““’�Ž��‘��Œ�“ªÈˆŠ‹�””‘†kZ_``^abbbbbbcccedbcdeeegijifffhfffhhhhjijjiijjjkkkkmmmllkllnmmmonnoqppqqppppoqrrrrssttsqrtuutsuuwwuuuvyxvwx{zxvy|}zyxz{~}{zzz}~|}}}}}}~~�~�ƒ~€‚��€�…‚‚�ƒ„……„„††‡„ƒ††„„ƒ„„†ˆˆ†††‰Œ‹ˆ…‡Ž›¡¥¨¤�‡ˆŠ‰‰ŠŽ�ŒŠŠ‰Š��ŽŽ�Œ��������‘‘‘�’’��“••”•™Ÿ¡“rdm}—§¤¡ž‘‚‚‹Šˆ‡‰‹��‰‚”¤ª¨§¦¦ •“ ¯²­°²´²´¶¸·¹º¼¼¾¾»·«�—™™—•–——••”•–˜˜˜–˜˜—––••–˜˜——•–—˜––—˜–—–––—•”““”••–˜—”’”””–—”’’““–––“””••–•”””””••”””“•–—•””•“””––––“‘“–˜˜–“’’’”•–“””“’“••”•”––•••”“”•”””’’“”““‘“�“••““‘‘�’’””“‘���������‘‘�Ž��Ž������‹Œ�Ž�ŽŽŒŒŠ‹��‰Š‹Šˆ‹Œž»Œ��•™›–‹p_addcdeeccefeffghheghkhjkljiiiijkkkkkmqrplmnpoqppmonpqsrrrrrsqpruustsssussrttvvvtvyyvxxywuwyzzzzzz{}}z|||{||}{{{{{||}}}~~~}~}€��~��„„ƒ�‚‚‚‚�‚„…†…„ƒ…ˆ‡……„„‡‡†……†ˆˆˆˆˆ‡Š‹ŠŠŠŠŠ‰‡‡ˆŒ‹�‹‰ˆ‰‰‹ŠŒŒŽŽ“›¡§¬ª•‰Œ����Ž���‘‘‘�“””““‘“’��‘’”•––““”—”’”––™ž¥§šum|Ž¡­©§£—�~Š�‘��‹��’‰Ž¥°°°¯¯©¢—›«²°¬­´¹¹¸¸º»¾¿¿ÀÃÀÀ¼°�ššžžž›ššš™š›œ›��›�œœ™›››��šš™š™›™™šœœ››››š›››šš™››œ›˜—›››™ššš™˜™š™šš™˜˜™˜˜˜šš™˜˜—˜˜™™˜•˜œ›š™™™š›œœ�›˜–——™™™–—˜›—————š™™šš——˜™˜—™˜˜˜ššš˜™˜—––—˜——–––——–••””————˜–••–”””•””“””““““““’“’’“’�‘‘‘��‘’‘‘‘’’�‹‹‹�£Â†�Ž‘““‘ˆm\^aaabbaaabbdfeeccdffggggihgfhhhjkiiiijkkjjjkkkkkjlllmnllmooonoooooppoprqqrrpsssssqrrrsutttvvvvuvvvuwxxwxxxwwwxx{{yxxxz|}||{z||||~||~~}~~~~~�€‚ƒ����‚ƒ‚‚‚ƒƒ…ƒ‚‚„†‡…„ƒƒ„„‚…††„……„‡ˆ‡ƒ…‡‰‡ˆˆ‡‡Œ–�¢§£“ˆŠŠŠŠŠŒ�ŽŒŒ‹‹‹���Ž�ŽŽŽŽŽ����Ž�‘’‘‘�‘“”“”™¢¥¡›šš ¦¬ª¦ž’z‰�ŽŠ…ƒ†Œ�™­±¯°¯¯ª¥™•ž­°®­¯°²´¸¸µ·¹º»¼¼¼¸¨••—™—––˜––––••”•–———™––•––™™––——–•––—˜˜•““•———••––••”•••”••””–•’‘’“““””“”•˜—“’”””••’––––—•––––”’”–”•—•“’’•••“•””•–••••”•–•••“’“•••–•“”–••”•’‘’•””“•“”••““’’’“‘�������‘���‘����Ž�Ž��������ŽŽ�Œ‹‹‹ŒŠ‹‹�ŒŠ‡ˆŠ�ž½���“˜™–Šn^beccehggeefgeeehhghiiiiijkkkmlklmmnklmonnlommnnnqpoooqqppppsrqrtuwvusuxwtuuvwwwwvvxxwwwyywwuxzzyyy|}|zyxy||{|||||||||~~~}�‚~}}��€„‚‚��„†‚‚ƒƒ‚„„…‚ƒ††…†„††ˆ‡††‡‡‡‡‡‡ŠŒŠˆ‡ˆˆŒ‹ŠˆŠŒ�Œ‹‰‰‰Œ�Œ‹Œ‹Œ”ž¢¥ª¨™‹Œ�’�‘��ŽŽ�‘���““‘�Ž‘”’‘‘‘’“•””••’“”—–—™¡§©¦¤¦¨¨ª­©¨¦›‚~ˆ�‘‘’�����­±°®°±±­ª¤¡¥±±­°·¸¶¶¹º»»¾¿¿¾¾¾¾®›šœ�žž›œœž�œ››™™™œ�›˜››œœ�œšššš›žœ™™šœ�š˜—š™šš™˜™šš™™™™šš™———˜™™˜˜–——š™˜—™™š™™™™–—™›š™˜™›ššš™——˜šššššš˜—ššš˜—––˜™šš›™˜™™—˜™š™™–—™™˜›™˜˜˜•–™™——››˜–˜˜™˜˜™š———š–””–––••”””•—“’’’“”“‘�’‘“““““‘‘���‘���Ž������’¢ÀŠŒŒŽ““‘‰o\_a```aabcedcbcdeddcedffhggfffghhhhhfgikjkiihkkjhjjlmnmlkllmonnopprsqoqppoprsppqutsrtuuvutsttuvvtutwwwwyxxyzxvvwzzzyxwyz{zzz~}}}~}|z|~€~||€�€���‚�~�‚��‚ƒƒ…„ƒ‚‚ƒ………‡‡††‡…„„……‡‡‰ˆˆ‡‡‡Š‰‰ˆ‹‘™� £¡’ˆ‰‹ŒŠ‹‹ŒŒ�‹ŠŠ‹Œ���ŒŽŽŒ�����ŽŽ�“•”‘‘‘‘’“’— ¦¤¥¦¦£¤¥¥¡œ“~~‰‰‡ŠŽ”�‹‘£¯±¯¯¯­­­ª¤¢§­¯­®°±´´´µ¶·¹¹º»¾¼ºª—“—™———–™š˜˜——–—–——˜˜––––——˜˜˜—•–˜˜——–————–”–––––••“•—˜—•’”•––—–••”•••““’“•—••”••—–”•–•—˜—•••–˜•”••”–—•‘“”•”•”””–——–•”””’“””’”““•—––•””——•’““•”“““��‘••’”“’�‘‘������‘‘‘������‘”“������Ž�����Ž�‹ŒŒŒ��Œ�ŒŠ‰‰Œ›¸Œ��“——–Žq[acdccehgedfgghhhihhhhiijjkjkkkikklkkkmmmllooopolmppnqpqqqpqqstrrrtvussuvvvvvtvvvttuvvxxzyxxzyyyyxxz|}|||~}}{||{z{}}}~|{||}€‚���‚�€�‚„ƒƒ‚ƒ„„‚��ƒ……„……„„†‡……††ˆŠ†…†‰‰ˆ‡‡†ˆ‰ŠˆŠŒŒ‰ˆ‡‰ŒŒŒŒŠ‰Š‹ŒŒ�ŒŽ”Ÿ¡¤§¦•ŒŽ���’���������‘““‘‘�’’“’““••••––––——––˜ §ª©©¨¨¨©¦§¦¥˜…‡Ž’��”�‘§³³´··µµ²±ªŸž­¶¶°¯±µ¶··¹ºº»½¾ÀÂÁ¾²¡—–™œœ�›œœžžž›™˜›���›˜˜™™››š™›ššš›š™š›šš˜˜˜š›�š˜˜˜™™™™˜—˜˜˜•–˜›—˜˜–—™š™˜™˜™ššœœš———˜™™˜—™œšœš™—™šœ›š™™šš˜—˜™™–™šš——˜›šššš˜˜˜šš™š›˜˜šš——™˜˜˜™—–—›™˜–——˜™˜——––——–”–—–––””•–••““’””•••’’�‘’’’“‘���’���ŽŒŽ���Ž�Ÿ»†�Œ�““’‰oY]``_aabbddcabdfedcdeeeeefffgghhihhhhggfiijkkikmmlkklnmmjjjnnnnonoooopoponorrrppsttrstvusrvvutwutttuuvvvvwwwwxxxwxxzxx{}|{zz{}~}{{|}}~~}€€}{}~€~€€€€€ƒ€€‚ƒ‚�ƒƒ‚‚‚„†…ƒ‚…‡‡‚ƒ…††…„……‡‡††ˆ‰‰Š‰ˆŒ—ž¡¢¡‘ˆŠŒŠŠŠŠŠŒ‹ŠŠŒŒŒŒŒŒŒ�ŒŒ‹�Ž‘‘‘‘“�ŽŽ‘‘�‘•”’–ž£¤¥¦¦¦¥¤¤ �˜‰‚ˆ�’ŽŽ‘•šª®­¯±±¯¯®­¨ž–›©¯««®³³´¶¸µ··¸»½¾½¹°£‘�™�™••———–——–”•––”••–––—˜˜–”’“”——•“““””—–”’••••—•‘�’••““““““””••—••–———”——–––––——•••––••”••—•••—––•“‘“•”‘’“““““’““•”•”””””•““‘’••••“’““””“’‘‘“““’’‘‘�’’“‘��’’’‘��ŽŽ����ŽŽ���ŽŽ�Ž‹‹Ž��‹‹ŒŽŽŒŒ‹ˆ‰ŒŒŠˆ‡ˆŠ‰‰Š™µˆ‘�“•—•Žr_ceccceeeeffefeffggiiiiihjjjkljjkkkkkjjlnmmkmmonnoqonmnnpoprsssssrrttsrstvsttwxxvvuvvvvvvwwwwx|zzxyy{zzxxx{|{{}}}}}{{}€}~~}€�€~€ƒ€€€‚ƒ‚‚‚‚‚„„„„†††ƒƒƒ„…††‡…†‡‡†‡‡‰Š‰‰ˆˆˆ‰‰‰‡ˆŠ‹‹‹‰‰‰ŒŽŽ��Œ“œŸ ¦©™ŠŒ���Ž����‘�’’�Ž‘‘���‘“““••’“–˜–��“——•”–œ§«ªª¬¬¯¬¨¦¦£œŒ…Š�•—–• ¯µ³¶¸¶²´¶·¶°¦œ›¬´³²²´¸º¼¾ºº»¼¾¿¾¾½»³¡–™›��œ››œ�žž�™˜˜œœœ›››�œ��›˜šœž�›š˜—ššš™———ššš™˜™›™™˜™˜™š›™—–™››š˜˜š�š——˜™šš›š™˜›››š›š˜–—šœ™˜——˜››™™˜˜——–˜—˜˜˜˜™™šš›™™™˜˜—™™ššš——˜�›™•––™—––™™—–——–•••••”–•“’”“””•––’’‘””””’‘��““’”’����Ž�ŽŽ‘���ŽŒŒŒŒŒŽ�Žš¶…�‹�’“‘‰mZ\````aaabcbccccbbbcegfdcfegggfiigfhjjjhffijighjlkkjklmllkmmmkmmoonmmoorrppqrsqqprqrrtsttrrtuuuttvxuuvxvvwwvxxwuvx{zyyzzz{{zz{{||~||{}}~}}|}}€�€�€�ƒ‚‚‚ƒƒƒ‚ƒƒ„ƒƒ�‚ƒ……„ƒ…†…„ƒ…‡ˆ†††ˆˆˆˆ‰‡Œ•žŸ££”‡‡Š�Œ‹‰‰Œ��‹ŒŠ‰‹ŽŒŠŒ�ŽŽŽ‘’’���“‘�‘‘��‘‘•�££¤¨©§§£££¢�–„€ˆ‘–•“™¥¯°±³²°°´±¯««¦¥©­¨©°±°µµ¶¸¸¹»»»»º¼º·²«š�•™—••—™š˜šš—••••–—–”””––—••–˜˜—–•••”•——““•––—•••”“”—–•“•“”••”••–––••••””—”””””–””‘‘“—–––•’•”’‘••“•”’‘‘‘“”•“””••˜˜•’’“”““”“‘“••”““““‘”””’“’’‘“““�‘‘’‘’’���Ž�“‘Ž��Ž�ŽŽ�Ž�ŽŽ���Ž�Œ�����ŽŽŒŠ‹Œ�‹ŠŠŒŠŠ‰‹ˆˆˆ‹•¯‡ŽŽ“˜˜–Žo[adabdffheefgghggegghihhhhhhijkljiknnmmpmkkooooommmooppopoppoosusqsssssttstttuwwuttvwxxwuvyzwvvyxyyyy|{yx{{||||{}|||}~}|€~}}€€����€€�ƒ„†„ƒ�‚ƒ†…ƒƒ††…ƒƒ…ˆ‡†……„…†‡ˆˆ††ˆˆˆ‡ŠŠŠˆˆ†‡‰�ŒŠ‰ŠŒ‹‹‹‹Œ“šŸ¡¥¤˜������ŽŒŽ��‘’“’“••””““””•˜˜•––š—””•–˜——˜Ÿ¤ªªªª«¬ª¨§¦¢›Šƒ‹˜š—›«³³±´¸»º¹··µ³°§¥®¶¶µ´´¶»»¼¼¼¾À¼¼¾ÄÂÁÁ½¶¡�–š˜˜œ�šœ››™œ�œ˜šœš——š�œš˜˜™ššš�›˜—™šœœ›˜™™™˜ššœ›™•–™˜•–™š™˜š˜˜™š™™—ššš™š˜——™›š——™››š˜—˜˜™™™——”–šœš—•˜š™–—˜™˜—˜šš˜™—™š™˜—–˜˜˜˜™˜—•—˜—”•———˜———˜™——–—•–”””””–••“““““‘��’”“��‘’’“““’‘���’��Ž���Ž�‘�����ŒŒŽ™²‚ŒŒ�“•“‰nZ]a```__`bbbcceedcdbcdgfedehigggggggghhiijjkiijkkkijkmljjklkkmnnnoononooppqpppqqrqqrqruutsqrrsstttsvvvvxvvvwwwwvvxzyyxxxxx{zzz|zzz||}}||~}}}€�~}~��‚����€��ƒ‚‚�‚�€��‚…„‚‚ƒ„„†…ƒ‚…………ˆ‡…„‡‡‰‰‰‰ŠŒ’𡧤•ˆˆ‹���Œ‹‰ŒŒŠŠ��Ž�‘��Ž�‘�Œ�‘‘����’’“‘‘’”•›Ÿ¡œœ�ž›—–˜š™–�ˆŒ—™–š­´±±±²µ´´±±®­ª¦¦¬²³µµ²±µµ´´¹¹¹¸¹¹º»½»¸²¬ •“”’“•—–””’”“”•———––—˜•““”’“–—––——”“”–—–”’”•™™—”’’’‘‘’••——•””“‘“••““’“’”—–“”––•••—–““••””•”““’’’”“’�“““’”••“’�‘“”••’�“•”‘‘‘’’””•”“���“•”“’�’“““”“���’��Ž�Ž�Ž�����Ž���ŒŽŽ�Œ‹���‹Œ��ŒŒ‹‹ŠŒŒŒ‹ŠˆˆŠŠŠŠˆˆˆ…‡‘©„‘�‘—™—Žs]bedbdefedcdfhhhhggghhhhjkjhijmllkmllkkkmmmllmnnlmnnmonooopsqqqqqqrutqqqssuutuxwvtwwvvxwwvxvuuwxxvvxzyzzxxy|{{yzz{{||}|~€~~€�€‚���ƒ‚‚€�‚„‚………‚ƒ…‡ƒƒ„…„„………†ˆ‡‡†Š‹‰†ˆ†††ˆ†‡ˆ‹‹ŒŠŠŠŠ‹‹‰Š‹‹ŒŒ�Œ�“™Ÿ¤¨¨˜ŽŽ���‘’���‘’���‘‘“’’’””•••••“”—™—••••–———™™�ˆ‰“™œ˜�‹‹‹�“—––›§²·µµ¶¸¸¸¹¶³¯°°ª¦­·½¼»··¸»»¼ºº¼½¾ÀÃÄ¿¾»·ª–‘š��ššš™—š››œ��žž›™™››™š™––˜œœœššš›šš˜šššœ�›šš™™šš—˜–˜œž›˜•—˜˜•—™›™™œ›—˜™™™š›˜––šœ›™™—™™›š˜–—•–—–•–—˜™˜—–——˜––—™––•–—™—•“”–˜—”•———˜——–——™™™˜—–˜™—––”–––•““•”’“““�‘‘‘‘“‘‘���’“’�������“’�Ž�ŽŽ���ŒŒŒŒŒŽŽ—­€���‘””‹q\_`````bba`cbddeeddeddddddeeffgfffhhffiihghjjijjkljiilmmkkknoooooomnnopqpomnqpppqqtttqpruusqruwvvusuwwwwwxxwuwxxvvvxxxxyyzyzyz{||{zz|}}~~}~||~€€€€€�‚‚€�‚ƒƒ€€�ƒ„ƒƒƒƒ…ƒ�‚ƒƒ…‡‡„ƒƒ††‚‚…†‡‡†…†Š‹Œ�“𡤠“‹‰Œ��ŒŒ‹Š‹ŽŽŠ‰‹�ŽŽ����’’�‘‘’���“•”��‘’’��”˜•™Ÿ¡ ¡¡Ÿœœ™“�“‘‘œ¯±¯±µµ³²´´±°°®«§¡¢²¸´´²²²³²µ¹¼¼½½º·¼½»º¶´°¦•�“—•———••”–—˜–••—–““”––••••–––”””•“•”“’’”•–—–””“”–—•““”””“““•“”––••“““””““””’““““’“••”““‘““”’’”—•’‘‘’”““•“‘�’’’’“’’“•”””’�”””•–“‘�“•“��””’’“‘’“‘ŽŽ�’‘���‘‘�Ž���ŽŽŽ�ŽŽŽŽ�ŒŠŠˆŠ‹Œ‹‹ŠŠ‰ŠŒŒ‹Š‹‹ŠŠˆˆ‹‰‰ˆ††�¥�‘�’”——‘u]^decbdffecbbcdfgheghihhhkkjjlkjkkjklmllllmmnmnnnnooppponmoprrttrrstttstuutttutuwwuwxwuvvvxwwwyxxyzzzz{zzxzz{{{{{{}}||}~||€~~~}~€€€€‚‚‚���‚„…ƒƒ…††…„‚‚ƒ…††ƒ…‡ˆˆ‡…‡‡‡‡‡……ˆˆ†††ˆ‰ˆˆˆ‰Š‹Š�‹‰ŠŒŒŒŒ‘—Ÿ¤¨§œ‘�ŒŽ���Ž�Ž�‘“��‘’��’‘‘”““•˜•“””•——•““–™››¢©ª¨«¬¬ªªª¨£Ÿ�—‘’Ÿ°¸¸¹»»º»»»»¼º¸··¯¦¤¶¾½»·¶¸¹¸º½¾¼¿¿¿¾¾¿ÃÀ¾»·¯™�˜››™ššš›š—•—™›šœ›˜—œ�›˜˜˜››››š˜˜˜˜˜™™—˜˜šš™˜ššš™ššš˜˜˜˜–—–—š™––—™™™™˜™™››™˜˜˜™˜—˜š™—–—˜—•–˜šššš˜—–——™˜˜–”“–—™˜–•–—˜™™˜——˜™——––•––––—––•———”•—–““•–•””“““••”’’’“’‘��‘““’‘Ž��’‘�����Ž�Ž�ŒŒ�����Œ‹ŒŠ‰‹�•ªŽ‹�‘•“�q[]aa``bccabcddceffcbbdffeedffgghggghiiikhggilkjhjkljjkmkmlkkpponnopomorrqqppprrrrtsrrtttqqsuuuvvuuvvvvwvvvvuuuwwvvxxyxxxz|~|zzz{zyy{}~|||}|~~~~€€}~€�€€�‚„ƒ���ƒƒ…ƒ‚�ƒ‚‚ƒ……†„„…ˆ‡†‡‡††‡‡††ˆ‰Š‹�’—�¦§›�‰‰‹‹ŽŽŒŠŠ�������Œ�ŒŒ�‘�Ž��‘’��‘““““‘Ž�–𢧧§©¨¨¦¦££ �–‘�‘¢±°´¶¸º¸¶¶··µ³²°¬¥¢§³´²²³´´´¶¶¸º»»¸·º¾¿½º¹·¸µª™��••˜˜–•”••””•–––––••––•“•••”——–”“’“—˜“’“•–•”“•••–•“•“““”’’““‘’••“”““”•”“•––”“’“‘‘‘–”’‘“”•’”•—–••““““‘‘’’‘‘‘””•””‘‘‘“”••“‘‘‘’’‘“‘‘’–••’’���“‘‘��Ž�’”’ŽŽŽ��‘‘��ŒŒ�ŒŽŽ���ŒŒŒŠ‰‹��‹Š‹‹‹‹‹ˆˆˆŠˆˆˆ‹Šˆ††‡‰�¦ƒ���•™š�t_adcccddeffcddfggegeeeiiiihhhjjjkkjkkllnlkjlmmmoommnppqqooooqqqrsqrrssttrqtuwtttvvttvxwxxwvwvwwyyxwwwzyyyyxyyyzzz{|{{{}~~|~~~}���~‚€€€ƒ��‚ƒ‚ƒ‚„„†ƒ��†††‡‡…††††‡†…‡‡‡‡‰ˆˆˆˆ†ˆŠŠˆŠŠŠŠ‹‰‡ˆ‹ŒŒ‹Š�–Ÿ£¨¨ž’ŽŽ�Œ�ŽŽŒ��‘““‘‘�‘‘‘‘‘’“•••””•—————”“•˜šŸ¦¬¬««««ª©§§ –—˜™¤¯´²º¼¼»¹ºÀ¼º¼º¶µ´®¨ªµº¹ºº·¶·»¼¾¾¿ÀÀ¾À¾¾¾¿ÀÀ¼¹´¦’”šš›šš˜š™™™™—˜™™———šœœ™——˜›œš——˜š™š›œšš˜™™™—˜™™™›™—™™˜—””š›š—–•––™—••––˜š™——˜˜———˜˜–——™—–—š™™šš———˜˜——–••–™œš˜—–“•–—˜™———˜––•——•”•••”•—•••”’’‘””“’’’”““’“’’’’�ŽŽ��‘������“‘““’‘’���’�������‘��Œ‹ŒŠŒ‘¥€‘�Ž’––Žu]]___`a`aacbbbbaccaaccfefeefhggggghjihhiijkkiiijjljjjklnnmklmoonnnpqponmonopsqrqpprsrrttttsrqsuvttuvuvvwwwuvvvvvvxyyz{zyyy{||z||~}{z}}}|~}}}~}}~€€€€€ƒƒ………ƒ„ƒƒ��ƒ……†‡…„„††††ˆ‡‡†‡‡ˆ‡‡‡ˆˆ‰Š‹Œ“™Ÿ¦§™ŒˆŠ‹Š‹Š‹‹Œ����‹ŒŒŒ�Ž�Ž�ŽŽ�‘‘“••’’“”“”’’”�¤¨¥¥§ª¬«§¤ ›•‘�˜¬³²²µ¸»»º¸º·¶´²±±­­¤ ¯¸³®±¶´²³´·¸º·¹¹º¹º»»¹º¹¹¶­œ��–——–•–••”•”–••“““••––•““”–——–““”•—˜•“’•””•—•”“•””••’’“••“““––•’”“““”““““’••••“’””“““’’“••”“‘’’•”’“•”••”“““•–•“““‘’“”““‘‘‘“��Ž‘�‘’’‘’’‘�������Ž��‘’“‘�Ž����ŽŽ�ŒŒ��Œ‹ŒŒŒ��ŒŒŠ‰‰Œ‹Š‰‹Š‹ŒŒ‹‹ˆ‡…‡‡ˆˆ‡‡Œ¡“‘’•——“{aabdddccceeeegfffgfegigdfhjhiijjmkjkmlkjlmmmmmmmnmkmopnmmnnopqprrstrqtttrqqstrstuuvuuuwvwvwxxvxyywxzyyz{zzy{~~{zz}}~}}}�~||�����~€ƒ��ƒ„ƒƒƒƒ‚„ƒƒ……………†…„††‡‡‡†††ˆˆ‡†‡‡ˆ‰Š‰ˆˆŠ‰‰Š‹ŒŒŒŠŠ‹�����”šž¤ª¬Ÿ‘Œ�‘‘��ŽŽŽ�’•’�‘‘’’“’““““””’‘”•—™™•“———šŸ¥«ª¬­¬¬¬ª¨ ›˜šž¨µ¹¸»¹»¾¾½¼»¼¼¹¶µµ³°¨¦µ¾¸³´»»¹¶¹½½¼¾¾½¼¿ÁÀÀÀÁÁ¿»¶«™�˜›œšš˜˜—••™œœ™˜˜˜›››™™–—™œ˜——˜˜˜–—˜˜——–———˜š›™›šš˜™˜™™™—˜–––————–—™˜—˜˜˜˜™™˜—™™™——˜š˜™˜˜™š——–————™™™™———™™š™˜–——™˜˜™˜•””–—•““••••–””••““’”“”““””“””•“�‘’’’’’‘�‘��Ž�Ž�Ž����ŽŽ����������Ž���‹Œ‹ŠˆŠ‹’¥z‘ŒŒ�•”�x^]_aaa`aabacccbbbdcbbdeeeeeegihffhiggfhikjighiiijkkkjjjkkkhikonnlmloqsppomoqqqpprrrrrrstttusrruvvtuvvuwwvwwxxwwxxxwww{zzyyy}}}zz|~~~{z|~|~€€|||€€}}€‚��‚ƒ‚‚‚ƒƒƒ�‚…‚‚ƒ‚ƒ…ƒƒ‚…†…ƒ†‡‡…ˆˆ†…†‰Šˆ†ˆŠŒ�–šŸ¥¥˜Œ‡ŠŒ�Œ��ŒŠ‹Œ��Š‹��Ž��‘‘��ŽŽ‘‘‘‘‘�”••’‘�“›¦¬¨£¥«­¬¦Ÿ—•’��²±±´¹¶¶¸¸µ¶¸¹¸¸¸µ²¯ª§­¹º¯¨¬¶¶¶µ¶µ·¹½»¸¸»¼½¼»»»¼º·°¡“‘–›˜–”””•”•––•––•••–––•”“––••”’’’––—”’�“•––—–“”–——–”””””•“•••“•••••——••””–”““’‘’””’’”–”•””“’’–“’’•“’’““’“’““—–”‘’’”“’���’’”’����’’‘�‘�ŽŽŽ�‘‘ŽŽ�‘��‘��ŽŒ����ŒŒŒŒ�Ž�Œ‰ŠŠ�Ž�‹Œ‹‹ŠŒŒŒ‹Š‰‰‰‰‰‰‰ˆˆ‡‡†‡†Œžz“��“™—”}d_aacdecdeddeeeffffffgghgiijhiiihhiiijkllkklmkllmmlkmoqpnnppoprrqpprtuttrrprruuusttttuvxxwwwwvxxxvvuwx{zyy{|}||{{{~~}|{|€~|~‚‚�€}€‚���~������ƒ„„„…„„…‚„…„„††‡‡‡†††‡‡‡†‡‡‰ˆ‡‡†‰Š‹‹ŠŠŠ‰‹Š‰ˆŠŒ�Ž‘˜Ÿ¤¨§œ‘��““��‘‘Ž�‘“’“’‘�‘‘“““’’””“””•—––••”—™œŸ§¬ª©®®­¨£ž�›š�«¹¶¶º½¼½¾½º¼¿¿¼¾º¶µµ±¬¬¸¼µ¯³ºº¹·¹»½½¾ÀÀ¾¾¿Á¾ÀÁÃÁ¿¼¸±¡�•››š™™™˜˜š™™˜š˜˜˜ššš—–•˜˜™™š™—˜š›™—––•——˜š™—™šš–—˜š™š™—”˜›™˜˜™˜˜˜˜–—˜›™™™—–—˜™˜˜––—˜˜˜—––—˜™š——–——™˜—•–––—˜••–˜™™˜——•••——–”““”““”–”•“””““••“‘�’”•”‘��‘‘�‘’“’�Ž��������‘ŽŽ���‘��ŒŒ��Ž�ŒŠ‹Š‹ŠŠŠŠŠ‹‘£tŽŠ��”•�x`]__a`__`aaaccccccddbdeedddfgjhffggihhhhgghhhjkiiiihjjkjkkmmljklnkjmponnnnooprqqooossssusqqqstsuusrrtwwvuuwyzxwwxxxxzzzywwz{{|zyy|}|z{|~}}||}€~}}~}���‚‚ƒ�ƒ„‚‚„„…„„‚‚‚„…„ƒ…„…‡‡†‡†…†ˆ‡†‰‰‰ˆŠ‹�“˜œ¢¤›ŽŠŠŠŠŽŽ‹‰ŠŒ�Ž���Ž�‘���‘�����‘““‘�‘“““””–œ¥ª§¥§§¨¦£›™——¥²²°²¸ººº¼¼»»¾¿¼¸´´´¶²©£·À·¬­µ¸¸¶µ¶·¹º¸¹¹¶¶º¾Â¾¹¹¾½·°¢��“˜•””•••”’’’•–—––”””””•••“”••““”••”“““”–––“““•““““’””“‘““’‘“”•“““““‘”••–—––““’”’“”’‘““–•’’’”–•””’“”•””��‘•““’’‘‘‘’’��’“‘‘’”‘��Ž���������������Ž�ŽŽ�ŒŒŒŒ����ŒŠ‹Š‹Š‹Š‹ŠŠŠŒ‹‹ŒŒ‰Š‹ŒŠ‡ˆ‰Š‰ˆ‡ˆ‡‡…†…‡‹›x���“——’|d_`acccaacfedbehgdeeffiihhijjkjjjlkkkmmkijkllkjkkmkklonllopoqoooqppprttrrpsuvtssttuvwwwwuuuwvxxxwywwwyy|}}zzz|{yyz|{|}|{|}}~~}}€�€€~€�€��‚„„„‚‚‚……††††‡‰Šˆˆ‰ˆ‡…†ˆ‰‡‡‡ˆ‰ŠŠ‰‰ˆˆŒŒŒŒ‹ŒŽŽ�’˜Ÿ£¥¦ž’�Ž’‘ŽŽ�����‘••’�‘‘’”–•”““•———•“•—™—––˜šž¦®«¨ª¯­¦ ›ž¢ªµ¼¸¹º¾ÀÀ¾Á¿¾¾Â¿¼¼ºµ´¶´¯°¼Àº´´¸¹··¸¾ºº¼½¼¼¸»¾ÁÂÁÁÂÂÀ¼·±§—“™šššœ——˜œšš››˜™™››˜———™ššš™—–˜˜™™—•——–—š—•—™˜˜™—–—™———™———˜—–—›š™——•˜›™˜—–—š™™™™———š™š˜••——™™˜••–——–––•–——–•—––•••–”••–””“”““””“’’•˜–”“““”““‘‘�‘‘‘‘‘��Ž‘“‘����‘���ŽŽŽŽ��‘�‘�ŽŒŽŽ���Œ�‹‹ŒŒ‹Š‰ˆ‰Ž uŽŒ‹�’“Œy`\]_`__`ca`_aaccbbcccbcceffefhifgffhhgfhijihfhjjijijjjiilljjjlmllmnmoqqopopppqrrrqrttrqpprrrsttuttsttuvvvwwvvwwvwwxyxx{zxx{|{yzz|}|{|{|~€}{{~~~~~~|}€‚€‚‚��‚„€€�…………ƒƒ…†„ƒ„ƒ„†…‡‡ˆ‡†…ˆ‡ˆˆ‰‰‰‡‰Ž•›žž£›ŽŠŠ‹‹ŒŒŒŠŠŠŒ�‘��ŠŒ�‘���‘‘�’““‘’““‘’”——––›£«©¦¥¨¨ ——— ³¸¸·¹º¼½¾½½½¼º»»»¹¹¶µ²°«ª´»¶°¯±²¶·µ³²¶º¹µ¶µ¸»¾¾¾½¾¾¾¼¹·®›’•˜—•––““•••••””–”’”••••——•”••”““”•“”””“—•“’‘‘”•”“’’••’’’““’‘““•••””“”••”””•”‘�’““”““•—••“’‘’’“‘““““’‘“‘��“““”’�Ž�’’�������“’�Ž‘�‘‘‘���Ž�Ž��ŒŒŒ‹��‘ŽŒŠ‹‹ŽŽ‹ŠŒŒŒŒŒŒŠŠ‹‹‰‹‹ŠŠ�‹‰ˆŠ‰Š‹Œ‹‰‡ˆ‡‡†‡††„†˜t’��“•—“�h`^ccdddccdedddfffffffiiihhgihiijjjjmljijjkmomklnoppnonnnonooqpppqqqqttssqrrqqrrrsuuvtuuvuvvvvxxxwwwwxz||{z{{}|{{||}}~~}|}}~~�‚�€�€ƒƒƒ‚‚‚ƒƒƒƒ‚‚„††…„ƒ…‡ˆ‡†‡‡‡‡†…‡ˆ‰†‡ˆŠˆˆ‡‡‡‡ˆ‹‹Š‰‰‹ŒŒŒŠ‹����—œ¡¤¦œ�ŠŒŽ�Ž��Ž�‘’’’’“’’’““•–—–••••——•’”—™˜˜š�£¨ªª¬¯­§ š››¥·¼ººº¾ÀÁ¿ÁÁ¾º¹»½½ºº¸·´¶´³º¿¹³³¸··¶¸¹¹¹¼¼¼¼¸¹½ÁÅÆÅÅ¿¼¾½·ª›‘—ššš™™š››š—•–˜šœœ›™™™šœœ————–—™˜—™š˜˜™™—––——˜˜–”•—˜——–—•–————˜š™™™™˜˜š—––—–—–————™™š˜˜—••—––—–——˜˜–”––––—•””•““””’““””•••••—•••–““”•”“‘“••““���’””’‘‘‘‘�‘‘‘��Ž�Ž��ŽŒŒ�Ž������ŽŽŽ��ŒŒŠŠŠŒŒŠˆˆ‡Œžo�ŠŒŽ’’�}c]]`a`_``bbb`bbbbcdecdccdddddffeeegfhgfhighhihhjkhkljjjklkiijkkmkkmpommooppoopqqrrqqrrsrrqtuurssuttrrrutstuuuvvvuvvwwzyxxzyy{|{zz}}|{{{{}}}}}~~~�€~‚‚��~~€„„ƒ�‚ƒ„ƒƒ‚ƒ„…ƒƒƒ„„„„…†…„††††‡‡ˆ‰ˆ‰Š�–� ¢š‘ŠŠŠ���ŒŒŠŠ‰ŠŽ��Œ����‘�‘‘��’’‘’“���“–•”˜›¡¨ªª¨¤�™—• °²µµ¶¸»¼¼»¼´¡—Ÿ°´¯°´µ²°¯­­¸¼´±®®°´²²²³´º·µµµ¶¸º¾¿¿¿¿¾»¹¶´¯Ÿ�“–—–•“•—–“””••”””••••”“”“”“”•”‘’’“’’’”“”””’�‘”•’‘��’–•“‘’”–’‘‘“••“•••””“’‘‘”••““”•’’�““‘���’”•”’‘’““‘�‘‘’’’‘‘�‘“•’‘ŽŽŽ���‘‘���‘’������Œ���ŽŽ������‹Œ��ŒŒ‹Š‰Š‹Š‰ˆŠ‹‹‹‹ˆ‰‰Š‰Š‰‰ˆ‰‰‰‰ˆˆˆ‡……††„†…ˆ•o�ŒŽ�””�i_`bccddcdfffffgggfhijkjhiiihjjjhhijikmmlkmmooommlmlmnppqoompppppoprrrrssrsuuusuuutvvvuttvwwvwxxvuxxxwxx{{zyzz||zz||~}{{~~~~~~~€�€~~‚‚ƒƒƒ„†…†‡ƒ‚„‡ˆˆ††…‡‡‡††ˆ‰‡‡†‡ˆˆˆˆ‡‡‡ˆŠ‰‰‰‹‹Œ‹Š‰Ž��“œ£©«¦˜‹‹�‘�Ž�����’’’’’���’””””’”–š›—““””–˜—–™�¤«­¬­¨Ÿ›¡¦´¾¾»»½¿ÀÁÁÁ¿¶§Ÿ¥±´³¹¹¹¶¸¶µ³¾Â¿¹´²³´µ´¶¸ºº¹¹¸ºº½ÀÂÁÃÄÄÁÿ½¼»¯Ÿ“”™››™˜˜˜˜™˜––˜˜™››˜˜˜š™——˜˜–—˜˜••—š˜˜™˜•–•——™—••———••—™˜˜˜”“•˜šš—––™š™——•–—š™—••––•——••””–—••–—•––—””•———–””––—•”•””–———–””•””“”““‘“““���’”’’‘‘�’‘�Ž������‘�‘��ŽŽ��ŒŽ��ŒŽ‘�‹ŒŽ��Œ��Œ‰ŠŠŒŠˆˆˆ‹›lŒ‹ŒŽ“’‘‚j^]_``_``_aaabcccdedbcdedeefeghhfecdgihgghjihhjkjgiikkjilllkkkmmmmmmnnonlmoqppprqqpqqrrrqrstsrqsuvtrsstuuuusvuuuuuwxxwxxywwx{{zxxzz{{zz|~~zxx|~~~~€€€‚„ƒ€‚‚‚~ƒƒƒ‚‚�‚„†…‚�„…„„……„„††…‡††‡ˆŠ��—�£¦Ÿ“‹‡ŠŒŠŠŒŒ‹‹‹ŒŒŒ�‹‰�Ž��‘’’��Ž’’““‘��’••“•—Ÿ¨ª§¦¢›—Ÿ­µ²³¶»»»»¼¾¾»´¦¢ª­®¯²´´²´´¶¶º¹µ²¯ª¨¬®­°°±³´²°°°±²³µ½¼ºº¿¼¸¶·±¢�Œ•˜“’””“”””–•””––”“•”””“’““’’“‘‘’“‘�‘“””“‘“”•””’’‘“”’�“’“““’’‘’’’’‘’‘’’“’““”“‘�‘���’‘‘’‘�‘‘‘’’’‘�Ž�‘�ŽŽŽ‘‘‘��Ž‘“‘���‘‘�Ž����Ž������ŒŽ’ŽŒŒŽ���������ŒŒ‹‹Š‹‹ŠŠŒŒŒŠŠŠŠˆŠŒ‹‰‰ˆˆŠ‹Šˆ‡‰Šˆ‡‡ˆ†„�ƒ…‡ˆ•mŒŒŽ�“’��ka`cbbcdcbcdfffefffdfgjjigghkkkkjjiiijjkjlmmklmnmnnnmnnppmklnprrppqqsrsrrrrrssuustvutuuvvvuuvxxxvvvwvxwxxxxxwyzzzzz{{|}||{||}}}}€€~‚�~€€€‚ƒ���ƒ„†……ƒƒ„ˆ‡†………‡‡……ˆ‰‡‡‡ˆˆˆ‡‡‡‰‰ŠŠˆ‡‡ˆ‹ŠŠˆ‰ŠŒŽ‘𡦩¡“‹Š�Ž���‹�Œ�����‘’’““•——”’”—š™™—––™™˜—˜šŸ¦¬¬­¬¥žœ¤µº¸»½¿¾ÂÁÁÃÆÃ½²®°°°´¹½º¶³·½À½º¶­¥¢¥¢ ¡§¥¡Ÿ¦¤Ÿ¥®±­¤«À¾ª¤¼Á½¼½º°¡—“–™™———š™™˜˜˜˜™œ™–—™™™›˜——˜™™—–“•—™˜™——————˜˜˜—˜–•––•––—–•’”––•——–”•—˜–“”–•—™——••–˜–”“••–••–——–”“•–••––•––”””——–“’‘“”•”“‘’’““’’’’‘““‘’’�‘‘‘�‘‘’�’’������’’ŽŒ���Ž�Ž��Ž��ŽŽ��ŽŽŒŠŒŒ‹ŠŠ‹ŒŒŠŠ‡ˆŒšhŠŠ‹��‘Œi][`a`_aba`bbabbcbcccdecddeeeeggeefeghggfhijhhhjjjjkkkkkklkjjkkkmmmmmmonoopoppqprrqpssrrrrstsrrtvxtrrtuvuutuwxwwwwvvwyyxyzwwyz|{yx{|}|||~}{{}~~~}�‚‚�€�€~€�‚ƒ„„ƒƒƒ…†„ƒ„………‡†…„†††…††††Š‹�™žŸ£ž’‰‰Œ‹ŠŒ��ŒŠ‹�ŽŽ�ŽŽŽ�Ž�‘””’��’“”••‘‘‘”•——›Ÿ¥¦¨¦ ™›¦·¹¶¶·¼¾½½ÁÁ¿½¸±¯®¯±´´¶µ³±³·»¸±§š’“œžœž§ŸŠ|ˆˆz‚‘�£¥®ºµžš¹Áº¸¶µ±¨–Œ”˜˜•—––•“‘••“‘’’””•”““““••’’“““•’�Ž�“”“’�‘’•““’��”””–“��’‘’““’’�’’’’“’’‘‘‘’‘�����’’�‘’���‘‘‘‘‘���“‘���Ž�‘��Ž����‘�ŽŽ�Ž��‘����Ž���ŽŽ�����Ž�‹�ŽŽ‹‹‹ŒŒŒŒŒŠ��Љ‹ŒŒŠˆ‰‰‰Š‹ŠŠˆˆ‰‰‡ˆ‡‡‡‡…†‡‡†††††‰˜iŠŒ�’•–’‚j_^baaacddcddeeffeeeegihffhjjjjhhhkkkikklllkkmmllmmmmonnnommnqqqooorqqqqpqsttttssrtuvuttvvxuuwywvuwwwwxxwxxxxyy|{zy{|~||{|}~~|}€€€€€€€‚�€€€�����„„ƒ�ƒƒƒ„„ƒƒ…††„„„†‡ˆ‡‡……‡ˆˆ‰†ˆ‰ˆ……ˆ‹‰‰‰ˆˆ‰‰ˆ‰‹Ž�•›¡£§ •‰‰Œ�������������‘‘��“•––”’”•šœš––˜šš™˜šŸ¤ª­¬¥ Ÿ¥­»½¼½Â¿¿ÂÅÆÂÀ¿½¸··¶·¹¼¹µ³¶¹¼¸µ±ª¦ª­°­¯±° Œˆ‰ƒ‚’©±¬®¸µª¬½Á»»º¾¼¶£—™žž››™——˜˜˜˜—–—————˜›š™–––——˜˜—••—™—–——””—–––———•–•—˜˜–˜˜˜˜šš™˜™™™›š˜—˜–—˜š˜—••“•–——˜–”—™–”“’“••““•–•—–”’––”•–––•”“““““‘’““’”““‘“‘’’’‘’���‘’’�Ž�’‘����Ž������ŽŽ��ŽŽŽ��‹���ŒŒ���‹‹‹‹‹�ŒŒŠ‰ˆ‹—eˆ‰ŒŽ‘�Ž�k^Z__`^]]``__abbabaccabdedeeddfefddeffhfffhggihfhjiiihhiiklljjjlllkmmonnmooppoooqqpprrtsqnpprrrqsturqqtvvsrtvwwwwxxxwwvxxyxyy{{zyyy{}}{z{||||z{|~~~||}~}€‚‚����€‚‚�ƒ‚����ƒƒƒ„…}}…‰…„††„„†‡†‡ˆŠŽ—žŸŸ™‘‰ŠŒŒ‰‰‰Š‰‰‰‹Œ��ŒŒ��Ž‘�‘�Ž�’’’“–”‘Ž�’”“–› ¢£¤¡šœ¥°¸ºº¸ºº¼¾ÁÁ¿¾ÀÁ¿¼¾¾½º¸³¯­±³²´³µµ±®¯®¯¯±±®¡ŽŠ‘‘‡†•ª²³³¨š�¸¾¸·¶·¸¸­œŒ�•”“••”“”““””’’“–—•“‘‘“”””“—••””“““””••“‘‘”•”’’’’’“’”””‘‘’••“‘“••““““”““’“‘�Ž��‘�’“”““���’“’‘‘�‘’‘�Ž����‘‘����‘�‘ŽŽŒŒŽ���Ž���ŒŒ�Ž�Ž��ŒŒŒ‹‹ŒŽŒ‹ŠŠŒŽŒ‹‰Š‹ŠŠ‹‹Š‰‡‡‰Š†‡‰‹‰‰ŠŠ‡ˆˆ‰‡‡‡‡‡‡ˆ†…„……ˆ•hŒŒŽ‘––’„p__ddabbddcdffddefegggfhhhghhhhhfgijiijljikkkjllllmmmkmmonnlmnpppoooqtrqpqrsstuusttuutrtuvvvwwvvwwvvxxxxxxyyyy{{{{}{{|}|||}~~~}}}�}}‚~~‚€€~~ƒ„�€€‚‚‚ƒƒ‚‚†‡ƒ‚‚…†…„†††……†‡‡‰‰ˆ‰‰ˆ‡‰‰‰‰ŠŠ‹ŠŠŠ‹‹�”œŸ¢¤¡—ŽŒ�ŽŽŽ�‘��Ž��‘‘“““‘’‘“•–”•”–™™˜–––™›™—™ž¤¥£žžŸ§°¼¾¾¾¿ÀÂÁÁÀÃÆÅÅÅÅÃÃÁÁ½¼¸¶µ¸¹¹»½¼ºµ´µ··¹¹¶±¥—•š›˜ŒŒ¨º¼»¯ª°ÀÁ¿ÀÁ¾¼»¹¬š–šœ™™™™™™˜š˜™™š˜˜™™˜››™––—™š™˜—––›™—–——–—œš–””–™›™——˜˜—–•–——™—••˜–—˜˜—•“••—˜—•–••––•“’”—––––•••——–“’‘””•—–”••••””“‘‘““““””’�‘‘��’��‘����’����Ž�’’’���ŒŠ���ŽŽŽ�Ž�ŒŒ���ŒŽ��‹‹ŒŒŒ�ŒŒŠ‹ŠŠŠ‹ŠŠŠ–fˆˆŠŒ‘‘�ƒm\Z^`___```abbaccbbcccdebdfgeedfgfdeefhgfffikiiiiijihikjjjlkkklmmnnljkonmnnopqqrpqqqqsttqrrsrstrpqtttuutvutruwxvvvyyyyyyzwwxzzzzzzzzzzyxx||{z|}~~}}~€��€��‚��€„‚‚‚‚‚„…„‚‚†‡ˆˆ‹Šˆ…ˆ‰‰Œ—�Ÿ ›�ˆ‰‹‹�‹‰ŒŒ‹ŠŒŽ�Ž�Œ�ŽŽ�‘�Ž�Ž�’“””•–”‘”–—˜›�—Œ�–š¡­»½¾¼º¸º½ÂÂÃÄÂÂÅÄÁÁ¿¿¾»¶²°²´·¸¸··²±±³±³·¶±ªŸ””Ÿ¡�„‘­º¹º¼»½º¼¼¼¸¶¶·° ”’••”•••––”””“•–—“”””•—”“’“•””––““’’’“”“�’’’’“’“‘”••””’‘‘‘’““‘‘‘‘�’’““‘Ž��‘‘’‘‘������““��‘‘’‘‘�‘‘‘��ŒŒ�’’‘��Ž��������Ž��ŽŽŽŒŒŒ‘’�‹Œ��‹‹Œ�ŒŒŒŒŒŒŽ�Œ‹ŒŒ‹ŠŒŒŠˆŠŠ‰‡†ƒ…ˆ‹ŠŠ‰‰‰ˆ‰‰ˆˆˆˆ‰‡‡‡†ƒƒ„†‡“dˆŒ�‘’”“Œx_]dc`adddedeegeeehhhfhhhihfgikjhiikllijjlkkjllllnmmmnnonoonnopppoppqqsrqooprrttvtsttuuttuvywuvxwwvwwyyxwxxxzzz{zzzzz{~|||||~|}~€�~||��€��€€‚‚�ƒƒ„„…‚‚‚„„…†„��„†††……†…†‰ˆ†ˆˆ‡†‡Š�ŠŠŠŒŒŽ��ŒŽ�”œ¡¤¦£˜��ŽŽŽŽ�Ž�Ž�‘’’‘‘““””‘‘•™–’’—šœš™˜——™š™šŸ£¡–�•ž¦²¾ÀÀ¾¿¾¿¾ÀÃÅÆÇÅÈÇÄÀ¿»¸¸¸ººº¾À»¶´³³³··¶µ³§””ª«��‘¨»¾Á¿¾¾ÁÁ¿½ºµªš—�š™›˜™™›š™™šš™˜———™™˜———š™šš™™—”—™™——––—˜˜—••˜œš•“•˜˜™——•—–•••”••–—”’’•–––••––•–—”“’“”•”—–””•–•’‘’’“•–“‘�“””’“““••‘”””““‘‘‘‘‘‘�Ž�““���‘‘����Ž����������Ž�ŽŒ���Ž�������Œ��ŒŠ‹‹ŒŒŒ‹‹‰ˆˆˆ‰‰“d†ŠŠŽ’’�†r^Z^_``___bbbaa`bbcbccdcdcdcdefgfedeefghffdhiighghghhjjjjjijkkkmmjkjlmpoljlloopqqoppppqrqporrqprqqrtststsuttuxyzwuwwwxxxxxwuwyzxyxxx}}{yz{{||z|~~~{|~€€��‚‚‚€‚‚‚€€‚‚„„ƒ„ƒ„……„…ƒ„‡ˆ‡††ˆˆ††ˆˆ‡ˆ‰‰Š�š¢¤ž“Љ‹‹Š‰ŠŠ‹‹ŽŒŽ�‘��‘‘Ž�’“’‘��“––••”–”“•——›¡£™šš–¢²·¸¹¹¶¶¶¸º¼¿¿¾¾À¿¿½¾½»¶¶³²±³³³µ¶µ±±²´±±³¶³¯£�ޤ¬§•ˆ˜±ºº½À»¹º»¾½·¶·¶ª‘Œ””””“•””“““••”“““”’’““••”•”’””“���”•–“�’”““’’’’‘‘�‘““”’’’’�’’’‘–”’��‘’’“””“’‘’‘��‘’�‘���”“�Ž�‘�‘‘ŽŽ�ŽŽ��ŽŽŽ�����Œ���������ŠŒ�‘�ŒŒŒŒŒŒ���ŒŠ‹‹‹‰‰‰ŒŒ‹‰‰‰‰‰‹‹‰‰ŠŠˆ‰‹‰‡Š‰‰ˆ‰‰‰‰‰‡‡ˆ‰ˆˆˆ†ƒ„„…‘aˆ�ŽŽ‘•“ŒzaZacc`bbcbcdfffeedfhhhgijighhiijhijkijjjjkkklmkknnmmmmooommmnopooopprrqrrppprttssssttuuutvwxuuvxxwwwwxywxyzxyz|||{{y{{~|zy{|}|}}~€�€~}~€‚�€�€��‚�ƒ…„„„……„„…„ƒ„„††‡……†ˆˆˆ‡‡‡Š‰ˆˆ‹Œ‹Š‰‰ŠŒ‹‰ˆ‹��‘›¤¦ š��������ŽŽŽŽŽ�‘”––•’’•˜˜™˜—”˜š››š—˜š›š›Ÿ¥««§œ�—¥§«¬­«­°·¶¸¼½¼¼½¿Á¿½»º¸¸¸¸¸·»¼¼¸µ²³´¹¹·µµ´«•�¢®°¦––ª½¿¾ÁÀ¿¾¾¾ÀÀÀ¿½´ž”›š™˜—™˜——˜˜˜šœ›˜—˜˜™™›š™˜š˜—˜˜———––˜˜•—˜™••“•—˜—–”–—™——–•–˜˜”’”–––••”•”••–——••”•——”““•–—–“‘‘’“••“�”“‘‘’’““”“‘�’‘‘�‘”““““�‘’”“‘�‘�‘���‘���ŽŽ�ŒŽ���Ž�ŽŒŒŽŽŽŒŒŒ�ŽŽŒŽŒ‹‹�ŽŽ�Šˆˆ‹‹‹‹Œ‹‹‰‰†‡‡Š•]‚‰‹ŠŒŽ‘Šv_Y^^aa`__^a````_``bccccdeeddefeedeeeegeffegiiheehjhhjjjjkkkkkklmonnkmopomlnoqrqooprpnprqnqqtsrrsstttttuwxvsstvxxwuxxyzzyzxxx|||}|yyz}}z{{|€|}~€~|}{}‚€‚�‚��€�‚���ƒ����„……ƒƒƒ††‡‡‡†††ˆˆ‡‡‡ˆˆŠ�š¡¥Ÿ”ˆˆŠŒ‹‰†‡‰ŒŠ�Ž���’’’‘‘’•“�‘”“”““”—–•”——•𡥦£œ”“‘Œ‹…ƒ…ŠŽ•šœššš� ¦¨©¨ª«­¯¯¯®²¶¶¶·¶²±²°²²²´¶²¦�� ¯°« Ž�¨¼Á¾º¸»¼¼»¹¹¹¹³ ’“–˜––—–””“”—•””•””““”—•“‘“’‘�’“”’‘‘“”“‘‘‘’“”•”“‘‘‘”’��‘�’’’’�Ž�‘’‘’“’’’“““’’’“‘‘‘‘�����‘‘�ŽŽ���ŽŽŽ�ŽŽŽŽŽ‘’‘��‹�ŽŽŽ�ŽŽŽ�ŽŽ�ŽŒ���ŽŒŒ‹ŒŒŽ�Œ‰ŠŠŠŠŒŒŒŠ‡†‡ŠŠŠŠ‰ˆ‰‰‰ˆ‡†ˆ‰Š‰‰ˆ‰ˆˆ‡ˆ‡†…††††„„……‚…�]„‹Ž�“•–�~a]ccccdcbddcddeefdddffffhhhghhkkiffhjijiiijkklkkjllnnmmnmmmlkmnonoopqpppprsqrrsrrrsqsvvtttttutuvvvvwxxwxwxwzyyy{|~}{y||{|{{|~~~}}}}}~~~~€€~��~€‚€‚����ƒ‚‚ƒ†ƒ‚„……†„ƒƒ„……ƒ†‡†‡……ˆŠˆˆˆˆ‡‰‹ŒŠŒŒŒ�˜Ÿ¤£¢š�‹ŽŽŒŒ��ŒŒ�‘’’’‘�”—–‘•—™—’’—˜™˜—˜——˜›�žž¢©­©¡——˜™˜•‘’”””š”‰�—š’“˜™‘Œ�–£­±µ·¹º¼¼»µ³µµ·¸¸»»·­™—©´±­¬ž‘›·Ä½¼¼¿¾¼»½¾Á¿·¥˜–—˜—–™›™™˜˜•˜™œ›˜–˜˜››™———˜–”˜˜—–˜˜—••”••—˜–”—˜—–•––—™™–•”–”“”–””–™—”’”–˜•’’”””•–˜•’”•”•••””“”‘“““‘�‘•”’’““‘‘“’‘’’’““‘“‘‘‘“‘�‘“‘���Ž������ŽŽ�Ž�‘Ž‹‰ŠŠŠŽ’�ŽŠ‰‹�‹‹ŒŒ‹‹‹Œ�Œ‹‰‰‰‰‰ŒŒŠˆ‡†ˆˆˆŠ–Z‡ŒŒ�Ž�Šx\Y___`_^^a``a``accddbbccbbededefgdcbdfhhffghgigghkjijjikjkkkjlmmllmnmklnnmmmoooooopoqssqrqqstrpprsssrsrstvutuxxxwxvxyxvwy{zxvvx{{yy{~||zzz|~~z{|~€||}€€}|~~€~‚��‚„ƒ‚‚„„„„„ƒ„††„‚„„„ƒ†ˆ‰†‡‰•œ  Ÿ•‡‰Ž�‹Š‰‰‹ŒŒŒ��ŽŽ�‘‘��’‘‘‘‘’–—–“•—˜••—›�� ¤¨¨Ÿ”“–˜–•”™™˜—˜�Œ•˜–“”—–”�Ž”Ÿ¥¦ª­²·¼¹³­¯²¶µ´³µ··ª”’¤¯²²¬¦—’ª·°°±µ²²³·´³³®¡“Ž’••–––••“””–••—˜•“”•“•––“’’”—–”“’’””“‘’‘‘‘“””‘�‘”•“‘‘‘‘’““’‘‘‘�’’’‘‘�‘‘‘��Ž’‘‘‘‘’’‘���‘Ž�‘‘Ž���‘‘Ž�Œ��ŽŽŽŽŽ���ŒŽ��ŽŽŽ���ŒŽŽŽ��Ž�Š‹‹ŒŒ��ŒŠ‹����ŒŠˆ‡‡„„‰Œ‰‰ˆŠŠ‹‰ˆˆŠŠŠ‰‰†…†‡‡††…„…‡…†ƒƒ„„„�XŒŽ�“”“�z`[bbb``bbb`abdddcefgfgghihggfhiiiihikijiiillljkkmmlklmnmmnoppnnoppoqqpoqqpprqqrtsqqstttssrtuvtuuuuvvwwxwwxzyzzzz{{{{|}|zy{{}|}{{{||}€~}�~~€‚�‚‚‚‚‚���ƒƒƒ�‚„…„…ƒ…‡…ƒ„†„„†‡…†‡‡‡Š‰‰ˆŠ‰ˆ‡‹Œ‹‰ŠŒ�š  £§žŽŒ‘‘�Ž���Ž�‘’��‘”•—–”“–™–”•˜——˜›šš˜š›�›ž£©¨©¤››�žŸŸ�œš›œ›——›ž›š� ž›˜š™›�¥²·¶º¾¾¹´³µ¶¶··º»»³ š¬µ¶µ¶µªš˜˜š£¡™”“•šœŸŸ �’Œ—š˜˜˜˜šš›˜—™›š™˜˜—–˜š›˜˜––—››š˜—””—˜—•“•––”•——•”•••”——•”––˜•••’’•——•”””””–•”’““•••“’‘““““”““”–•”’‘‘‘““””“’’’“’’’“““’’�‘‘’‘‘’’’’‘���‘‘‘‘‘‘�Ž�Ž��Ž�Ž�‹‰‹���ŒŒŒŒŽ�ŽŽ�ŽŒŒ‹Ž��Œ‹ˆŠŒ�ŒŠ‡††‡‡ˆ•X}Š���“‘Œz]Y_^_____a`__aaaacbbcdcccedddeeffeefffhhhgffhhffijiggghhjkkjiijllllkikmnlllnnpokkmnppoonnorrqqsrrsuttsttvvurtuxxwwvwxyxxxxwwvxyzxxxyyzzyxz|}{z{|}}~}~��~~~�€�€€€�€‚��†‚€�‚‚ƒ…†……„††ˆ††ˆ‰ˆŠ“›¡§¤–†‡Ž��ŠŠ‹��‹ŒŒ‹��‘����Ž’”““”–”•—˜—–•˜••˜ž  œž¤¬­¨ œ�žŸž™”•—›œœ™˜š�›˜–•“—™¢°³³¹½¾»³±±±±²´¶··¯¡Ÿ¬®±³²²®¡“Ž—ž“ˆ‡…„‚|zz||‰––“•˜—•“•––••–——–””•••”’�’’’“•••‘��“•”ŽŽ‘““’“•“���’’’�‘‘‘‘‘�‘‘‘‘“”“‘’‘‘���Ž�“����‘�’��Œ������Ž����ŽŒŒ�’‘’‘‘Ž���’‘���ŽŽ��’ŽŒ‹�ŽŽŽŒŒŒŒ‹ŒŽ�ŒŒŠŠˆŠ‹Šˆ‰ˆˆ‡†ˆ‹ˆ‡‡ˆŠ‰ŠŠ‰ˆ‰‰‰ˆˆ‡ˆ‡‡‡‰‡„ƒ†„„††ƒƒ�U}‹Ž�“”•�}_Ybccccabbdccddccceggdefeffgghihhiiiijjihijkjkmnmljhknolmnononooqpoopqpppsspqqqsrsrrrtssstvxutsvxzxwvuwxxxyyzzzxz{{z|}}{{{}}|~}{{|}}}}}}~~€ƒ‚‚���ƒƒ‚ƒƒƒƒƒ�‚„ƒ‚ƒƒ………‚ƒƒ†……„††‡‡‡ˆ‰ŠŠ‰Š‰‰ŠŠŠ‹‹Š�˜  ¤¤›ŽŒ���‘�Ž��‘��‘“’’”—––•••—™™•–—™™˜˜˜˜™›Ÿ�œœ—Ÿ±ÀÂÀ¾½»º´¯¨¡ššŸ££¢¢¡  ¡ž›ššš¤´ºº¿¿À½¹¸¹µ·¹»»¼¼¸¬©´¹¹··¼½² —œž˜��ˆŠ���‘�‡†�›žš˜œ�œ››š˜—™™™——––—š™˜——•—˜š—–˜™˜—™–•—™™š—––™™™™˜••˜™——–•“•˜˜•”–˜˜••”””———”••–––——•••••••••““”–•”‘‘‘””•“‘�““‘“’’’“‘‘�‘‘“””�����‘��ŒŽŽ���Ž��ŽŽ��Ž��ŒŠŠŠŽŒŒŠ‰‰‹ŒŒŠ‹Œ‹‹��ŒŒ‹‹‹Œ‹ŒŒŠ‡‡ˆˆˆ‹“Tz‰ŠŠŽ’‘Œy]X^]_^__``aabba``abbbbbbddcddeeedffedeefeeeghjigfgiihhijjhjjjikkmlnkklmlmlklnppnnoqonppppqpppttsqstutsstvvvttvyxxwwvxxwuvyywxvxzxxy|{zzzz}}}}}{{|€€€~�€ƒ€����„„‚€ƒƒ„ƒ„„„„‰Šˆ………†††‡ˆˆ‰Œ“šž¤¥šˆ‡‹��ދЋŽ�ŽŒŒ������‘“–”’‘“”–••”––—–••—›Ÿ¡Ÿ ¬½ÂÂÁÄÁ¿¿¾»®˜¥¹³®ª¤Ÿž ¡žœš™™¡°¶¶»¾¾¸²°´µ·µ´·»º´©¦¬°³¸½¾º²©ž™™—’ŽŽ’””””��‘—˜—•–—•–—–•–•–—˜——–”“–––””““”””••’�‘’“””’���”•–“‘�‘’”’‘‘‘’“‘‘�‘’’’““���‘‘’��‘“’‘���‘‘‘‘���Ž�’’�Ž�‘������‘�������Ž�‘ŽŒŠŒ��Ž�Œ‹ŒŒ�Œ‹ŠŒŒ�Œ‹Š‹Š‰ŠŒŒ‹‰ˆŠŠ‰‰‰ˆ‰‰Š‰‰‡ˆˆ‡†ˆ‹‰‰Š‰‡†‡‡‡‡…………„„††ƒƒŒRzŠ��’–•�~`[adbabcb`bdfeddfffghggeffgghjkihhhhijihhkklkjjkjkikklkkjlnnnmmmoppnpprqqpppqqrsspprstusrstvwvuuuuvxvwwxvvvyxz{zy|{{zzz{|||{{}~||{~~~€��~�}‚ƒ�‚‚‚……‚„ƒƒ�ƒ‚„…ƒƒ……„„…‡‰‰‡ˆŠˆ‡‰ŠŠˆŠŠŠˆ‹‹ŒŒŒ‹‹Ž—Ÿ¥§§�Ž���Ž��‘���‘“––“�“’“–˜•““––—˜™˜˜™™™—ššœž£¦¨§ª³ÀÃÁÄÅÆÈÅ¿´¡°ÊÇÃÃÀ¼¶³°¬¦¤ ¡¨¸¼¼¿¿ÀÁ·µ¹»»º¼¿ÀÀ»®ª¯¸º¼Áż«›œ��›š›žœ››™˜™�žœ™šš›š�š——™™š™™™˜——š™—˜š™˜˜™™™˜˜–———”––•”–—–•––—––—˜—•—•“’–—˜—–•–••”•“’”–––”””“““““““•–•’“‘’‘“”•“’‘””–—•”“’’““”“‘�‘‘’‘‘�‘���’’‘‘‘���Ž���Ž����Ž����‹Œ‹Œ�Ž‹‹Œ�‹‹ŒŒŒ‰ˆ‚�ˆŽŒŠŠ‹ŠŠ‰ŠŠŠ‡‡‡ˆˆ�Lt†ˆŠ�‘’Œ{\Z_^]`b`^]]`a``aabcccbddeddegeeccceedeghhfefhgfffgghghhhgggjjhhijkkkjlmmnnlknoonnmnnooppopqrrrsrqrtutttutuuutttxxxxxvvxxvtuxxvwy{{zx|}|zyxzzzy{zz|}|}€€�€€€€‚‚‚€ƒ�‚‚‚€‚„†ƒƒƒ‚„„„„„…ˆ†††ˆ‡‰Ž”𠡦ž‹ˆŠ‹Œ‹‰‰‹ŒŽŽ��ŽŽŽ‘��Ž��’“““–””—˜—––—˜™˜šŸ¦¨§¡œ§²»½ÀÃÿºª—¬ÌÆÁÀ¿¾¿À¼±¨Ÿœ °·¸¶¸¼¼²¯³¸·µµ¶º¼¸®©­´·¼¿ÂÀ¿½¯¡ž ¤¦©©¨¦¦¦¦¢œ–––••——”•––“——–•”“••–•“‘”˜•’‘‘’•”’‘’‘“““’‘���“’’““““’‘‘‘‘’‘�‘’’���‘����‘“’‘ŽŽ���‘‘��Ž�‘’‘���Ž�‹Ž�‘��Ž�Ž��‘‘��ŒŒŒ��Ž���ŽŽ��ŽŒ‹‰ŠŒ���ˆˆŠŠˆ‰‰‰ŠŠ‹‹Š‡‡†ˆ‡‡‡ˆˆˆ‰Š‰Š‰ˆ‡†…†„‚‚††ƒ……………………†…„ƒƒ…�MvŒŒŒ‘•“�`\bcabccbbbbbdcdcdefffeeefgggghiheffghjiihijkjjiiiklmlkklnmmlmnooqpppqstsoopqssqrrrtututsstuvwwuvvwvwwwyzxxyxwxzz|||{}||zzz||}~~|||€€}||~~~~€‚€��€�€ƒ…„‚„…††…„ƒ„ˆ‰†††‡‡Š‰ˆˆŠŒŒ‰‰‰‰‰‰‰ŠŒŒŽŒŒ�—ž¤¨ªž�Ž’�Ž���““’�‘’’‘“•——–––˜œš™š˜˜˜œžœ™šš�ŸŸ ¦¨ª«ª¨¥¨±»ÃÇÄ¿¯�³ÑÉÈÆÆÃÃÅÇÀ¹®¡�§µ½»µ·Àù¶¸»··¼Á¿½¹²«¯¸ÀÁÃÆÅ¼®£°Àÿ¿¾ÁÁÀ»¯Ÿœ›œšš———™š˜˜š››š™˜—˜˜š™™—•”——˜š˜–•”–—–•––––•••–•••••˜•“““’“•—–••”“’“•–““““’””””–“’’”““•—”•—–“‘’””“““““”“••”�’’“‘‘‘’’’’‘��‘‘“’�Ž���ŽŽŽ��Ž���ŽŽŽ����ŒŒŒŒŒŒŽ�Œ‹ŠŠŒŠŒ‹‰ˆŠ‰ŠŠ‹‹‹‹‹ŠŠŠŠŠˆ††‡ˆ‘LtЉ‰���Œ|]Z`__^`a__^``b``_bcdbcbcddcccdddeefddehhfeefhggeddhjighhgikkkkkkknmlkmnnnolkknpqppppppoqqqqqrrsrsrsstsssstutttttuwywwxzxttuyzyy{xyyz{|{|{{||{|~~~€�~}|~~€‚€€�€‚‚��ƒ†…€�„„†„ƒ…‡‡ˆ†„„ˆˆˆŠŠ‡ˆ’šŸ¥¥™Š‡ŒŒ‹ŠŒŒŒŒ���Ž�‘�‘•“‘’”•—•”••———˜˜•˜šœœ� ¥§©ª¬­¬§¤¤ª³¹·¬ ®ÅÁÁ¾¾¿Â½¶®¡›£²·³¯±¼¾²±¶¶µµµ¹»½·ªŸ¤µÀÁÁÁÀ¿¾¼´¤£³ÄÇÂÁ¿½»»´ª�˜•–•—–•”–•“•–••””–——•”“””“‘‘‘””••”’’‘””’‘‘’“’‘�Ž‘‘’’”“�Ž’‘‘‘”“‘Ž��������Ž���Ž�����Ž��‘��Ž���Ž�ŽŽ��������Ž�����Œ������Œ�ŒŒŒŽ��‹‹Œ��Љ‡‰‰Š‰‰ˆŠˆˆˆŠ‰ŠŠŠˆˆˆˆˆˆˆ‰ˆ†††ˆˆ††‡ˆ††‡††……„………ƒƒƒ„„„ŒKuŒ�Œ�”“�}`Z__`bd``acccccddcdffgfffhgghhehffgigfhkjhggjljhijkkkklkiimoonnloppoporsssrrrrrsrrsttuuututvxxvvuvwxwuuwxvvxzy{yz{|{zz|zzzzz|~}~}|}|}}€€}���‚„‚�€�ƒ„‚‚ƒƒ„…†„‚‚…†…ƒ††„………‡‰ˆ…ˆˆ‰Š‰ˆ‡‰Š‹ŒŒ‹�”Ÿ¥©©Ÿ�Ž‘���Ž�”“‘��‘•““””’““–—™˜™™™˜˜˜šœœ›šœ¡£¤ª­­®±°¯¯±±°°°¨  ´ÄÃÃÅÅÂÂÅÄÁ¿¶¥ž¦³º·µ¶Àù³·»º¸»¾ÂÁ¹ªŸ¥»ÈÆÄÃÅÆÆÃ½±§®ÅÈÄÀÀ»¸·²¦�›šš™™——˜›˜––——ššš˜˜—™—˜˜˜——•—™™—–•–˜—–•—•”••“““•–˜–”“””••““”•••••“•”“’”•”’’“•””“•””–“’““’’’”““’“’‘’”’““”““‘‘‘““’����‘‘�Ž��’‘‘���������ŽŒŒŒŽ��Ž�Œ‹‹Œ�ŒŠ‰ŒŽŽ�ŒŠŠ‰‹ŒŒˆˆ‰Š‹ŒŒŠŠ‡‡†ˆˆˆˆˆ†…ƒ‡�FqŠŠˆŒ‘�‹{_Z___]__`^]]`````aa``bdcbbdeeecfeddffefgffffhigghiiiijlkjhhikklkkjllmmmklllmmooonooomnppopprqqqrrrrsttrsruxwutwwwutswyxvvuvwywuxywwwy{|{yyy|}~}zy}}|{|~�}‚}€‚~~����‚�‚ƒ…ƒ‚‚…„†Šˆ„‚„……‡ˆ‡Š’›ž¡¤š‰ˆ‹ŒŠ‹ŒŒŠŒŽŽ��ŒŒ�’’�Ž�’”•”•““”–•”–š––™œ›Ÿ¦¬ª©­­®®°°²¶¸©˜—œ£°·¼½¼º»»»»¶£š¤´º´­­¸½µ²´´µµ··ºº²¦�ž¯¿Â¿¿ÁÂÁÀ¾µ¦£³½½µ°¤™‘�‘•˜˜––”•—––•”“•–––—“’’•–———•“’••“’’“’����‘‘‘���‘�����’��ŽŽŽ�‘‘‘‘�����ŽŽ����������Ž’‘�ŒŽ��ŽŽŽ��‘‘ŽŽŽ�ŽŽ�ŽŒŒŒŽ�ŒŒŒ‹ŒŒŒ‹Š‹‹Œ����‹‹‰‹ŒŒŠŠŠŠ‰‰‡ŠŠˆˆŠŠŠŠŠ‡‡‡‰Šˆ‰‰‡†‡†‡‡‡††……†‡……………††„„ƒƒƒƒƒƒƒ„‰Fs‹�Œ‘”•‘ƒe^_bbbcbabbabbeeddcdhgfeffhhgfghhhhhijjjjjjkjjikkmmllmlmmnnnnnnonnooppppqqqpqpqqrqqqsstuuttuwxvuuvuuuvuwxywwwzz{zzz{{{{{{{{z{|~}~|}}€�}~~~~€€€�‚€€‚ƒ„‚‚ƒ„††ƒƒƒ‡††ƒƒƒ…„…………ˆ‰‡…†‰‰Š‰‰‹Šˆ‰ˆˆ‰�‹‰‹•�£¦¨ŸŒ‹Ž�“‘��Ž’”””•““”–•–——–—™š™™˜—™�œœ�š›œŸ£§©­®²±±¯±²²´½Àº°°©žšŸ®»À¿¿¾Â»©¡ª¸Á¾³´Áʶ¸º¸·¹º¿ÀºªŸ¢±¾¿²µ¿ÉÇÆÆÂ°¡£³¯��Ž�Š”œ�œ››�œš˜™œœ™š™˜˜š˜––˜››™™š™——™™˜—˜–••———•—™˜–™™—••–•”“•––––••“””—––••””“““’’”“““‘‘“•“’‘‘‘’‘��‘“•“’’”“��’’‘““’�����‘��Ž‘‘’’‘���‘�ŽŽŽ�‘‘��ŒŒŒ�Ž����Ž‹‹ŒŒŒŠ‰‹Œ��‹Š‰‰ŒŒŠŠŠ‰‰‹‹Œ‹Š‰‰ˆ‰Š‹‡††††Ž?jˆˆ‡Œ�’�~^X\_^\\______ab``abbdbccdcdcddeddceeffffhhfeehhhffgjjihihiiiikjkkllkjikmmlmlmmoonlnmoppnooqppqqprrstrrssqsuutttuvwvvwxxxxwwxyzzxyxxyzyyy{{||~€~{||}~~}|{}€€|~€ƒ�€�‚„„��‚„‚��ƒ‚‚†‰…�ƒ„‡ŠŠ‡‡Š“–™Ÿ¦ŸŒ‰ŒŒŠŠŒŽŒŒŽ��‘�ŒŒ‘’’’–••–˜˜˜––—™—•–™œ›˜œ ¢§¦§¨©ª¬¬¬¯¸½¹°²¸»²¦ž›ž«···¸µ¥Ÿ¥²¼¾¸º¾À³¬¬®­¬­°±±±ª¢£°·±¡¢±ÃÅÂÁû©•’‹‰�—˜˜••—™˜–—•••—•••–•––—–••–”••”•–•“’’““”””’’’”“’�‘‘“••‘‘ŽŽŽ’“’����‘�������‘�ŽŽ‘’�Œ��ŽŽŽ�Ž��ŽŽ‘�ŽŒŒŽ‘‘�Ž�Ž��ŒŒ�ŒŒŒŒ‹�ŒŠ‹ŒŒ‹ŒŒ�‹‹ŠŠŠ‹‹‹‰‰ŠŒ‹ŠŠŠ‰ŠŠŠ‰ˆˆ‡‡ˆŠ‰‰††„‡ˆ‰†………†ˆ‡‡†……††…††‡††††…†……ƒ„„ƒ�Š@kŒŒŒ�“”‘‚d]`abccb`bccbddedddfeggfggghhgiihggeghkjiijjkkkijkmmlllmkkmooommnpppnmmpppoqpqqpprsrsssrsstrsvvsssuuwwvvvvvtvzzxwxx{{zz{y{|}z||~~}|||~€||€�€€�‚€�‚€€ƒ„„ƒƒ‚‚…ˆ„‚„„„…†„„„†‡ˆ†……ˆ‰‰ˆ‰‰‰ˆˆŠ‹‹ŒŒ�“𢍬 �‹‘““���‘‘�‘“”•“’”˜˜—™›š˜šœžœššžžž��›�Ÿ£¤¦¨ª¬°²²²²·»Àü±´¾ÇÉÉÁ³Ÿš¢ª­¶¼®¢§µÀ¼»¿Â¶ª¥§Ÿœ�¢¨­«¦¥®µ¹²¦£«ºÊÌÈÇÀ²¢�žŸžžžŸ››››™™š›™™—™š››™˜š›™™——–˜™ššš———™™——–”–˜™—••–•–˜–•”——–•—•””•••““•˜•‘�’““‘’”•”’’’”””‘�‘•“‘‘”“‘‘““””’’’“’�Ž��“���‘Ž‘””���‘‘’���������ŽŽŽ��ŽŒŒŒŒŠŽ�Ž��Œ���Ž‹‰‹ŒŠŠŠŒ‹‰‰ŒŒŒ�ŽŒŒ‹Œ‹ŽŒŠˆ‰‰‰ˆˆ‰‡……�:c†Š‰ŠŽ�Ž}_Y]]__^____`aaaa_``abbacccbcccdecbbcffddfffeeeggghhfiiihgghiijkllklmmmkkillllllooonnoqqomnpqqopooorqqrtrppssuusrtvxwtuuuuvvxxyxyy{zzxz{{yzy{~~}|||~~}|~~~€}}~~€�€‚……�€‚…„ƒƒƒƒ„……„ƒ‚…‡‰ˆ‡‡‰�–ž£§�‰ˆ�ŽŽŒ��‹‰��‘‘‘�Ž‘“““””•™š™—––—™˜——˜˜š››œ¢¨¬­®­®°°°³·½»±°´½ÄÇÄÿ¸¨—–§²§�¡­¸º·²¶¸¬¤¢ž•”œ¡�™œŸ�£°±¦¡¦ª§µÁÄÀ¿º¬œ•™œ›™›˜––šš™š™•–––•”“–—–••••“’““’‘““”““‘”“’ŽŽ�“‘‘�’‘�ŽŒ�‘‘���“’‘��Ž��‘’�ŽŽŽ‘‘�ŒŒŽ������Ž‘��������ŒŽŽ��“‘�Œ�����ŒŒŽŽŽ��ŒŒ�����ŽŒ‹ŠŒŒŒ‹‹‰‰ˆˆ‰‰‰‰‰‹Š‰‰‡‰ˆˆˆŠ‰‰‰‰‡ˆ‡‡‡‡††‡‡††‡†……‡††…†„„„‡…„ƒ„‚‚‚�€‚Š:e‰ŒŒ�““’‚d\_`bbcbbacdfeddeeedfhhhffehhhgihhhiiiiijjgfhjkjjjklljkmmmnnnnooppppqrqppppqpprsrsssrsruuutttvvtrttvxxvvxxxvwwxxxyzy{|~|{{{|}{{~~~}}}€~€€€�€�‚‚€„†„�‚ƒƒ„„ƒ�‚…†„„„„†‡‡‰‰ˆ‡‰ŠŠ†„…‰Šˆˆˆ‰Š‹‹Œ‹�Ž�“œ£ª¬£ŽŒ��‘‘‘���“”””””––––˜–˜™š˜›œ�›š™›œŸŸž�žŸ¥®°²²²´¶´´µ»ÀÅ¿³°¸¿ÄËÏÎÍËÇ¿¼½»¬¥«²¸»»³¸¼¯ªª¤¥¢¡¦¥ ¢¤£¥«²±¬¸·¥¨ºÊÇÅÁ¸¥›œ¡ žŸŸž›™›ž�œ�žœš™š˜™˜—™�›™˜š™™™˜—˜ššš››™™—˜——˜—””•—–——–”––˜˜–”––••““’”–—”“‘‘’•””•”‘”•—””’’“”’��‘”“——”‘’“•“‘‘‘Ž‘““‘’’’’’’’‘�‘’••“‘‘‘‘��Ž���Ž�ŽŽ�Ž�Ž����ŒŠ‹��ŒŠŠ�Ž�‹��ŒŠ‹Œ�ŠŒ�ŒŒŒŒŠŠŠ‹‡ˆŠ‰†‡‡‡††Š5`‡ˆ‡ŠŽ‘Ž~aY]^_]^^_^__````a`acdcbaabcdccddcdccegdcdfggfffhhffhkkjihgjihfhjmlmmmllklmommlmmmmmoppnoopppqsrrrrqqrsssrsssttsstuuvxwxxxuttxz{zyxyyzyxz|}{{|~}{{|��}|}€‚��‚‚��„„�€‚…†……ƒ„ƒ„ˆˆ†……‡‡‡‡†ˆ�—Ÿ£§ŸŠ‰Œ�‹ŒŒŒ‹‹Œ�������‘“–”””—˜˜—™—˜šœ›š™š˜›�Ÿ¢§ªª©©©ªª«°´º·®­³¶¶ºÂÇÉÈÉÊÊÅ·¤ž£¥¨­´µ·µ­¨¦¡žššœŸžœ›œž¤®°¬½Ã¯ ¦»ÆÇÀº°£™œŸ¢žœ˜˜™›™™™™™™™—––˜—••—•“’•””“”’’’“‘‘“•”’‘‘���’•�Ž�‘‘““‘��‘“’’��ŽŽ�’�������‘‘�����‘����Ž�ŽŽ���ŽŒŽ�����ŽŽŒŒ‹��ŽŒŠˆŽ��‹ŠŒŽ�ŽŽŽ��Œ�ŽŽŽŒŠ‰‹ŒŒ‰‰‰‰‰‰‰‰Š‹ˆ‹‹‰‰‰‰‰‰‡†‡ŠŠ‰ˆˆ†ˆ‰Šˆˆˆˆ…†‡‡……†††††‚��ƒƒƒ‡4bŠŽŽ““”‘ƒf^_baabbaaaceedbbdedfghfedfhihhffghiiihiiijkjjkkjkkkijkmlkkmmmoonnnppmnopppoqrsqqpsssssttstttvvuuttvwwvvtvyzwwwxxyyzzy{{zzz{}}~||{}|}}~€‚‚‚‚�‚‚�‚€~‚„ƒ�‚‚‚‚……†…„„‡ˆˆ†…„„†‡‡…‡ŠŠˆˆˆŠŠŠ‹‹‰‰‰‹�’™ ¤ª£ŽŠ���“’ŽŽ�’••”“•—š˜–—š›š˜š�žœœ�œ›œŸŸžž¡  £§¤¥©¬«¬¬®°·¿¼±±¶º¹ºÀÇÌÍÏÎÏɺ¨ ¢¢¤±»´³»²¬¬©œ˜ ¢££¡ ¡¡¦®µ¸ÊÑŰ©²ÃÈÆÂ¿¯ž�¡£Ÿž›œž�œ Ÿ�š››œ™šœœ™™™œš˜˜–••™™—––————–•’““•––”––•—•”–˜˜—˜—••“•––•–”””–“““•—–“”“’”””–•‘‘’““•“‘�’“•“‘��‘“’“’���������‘‘“““‘’‘‘‘’�ŽŽ��������ŽŽŽŽ���Ž����ŽŒ‹���ŒŽ�‹‹�ŒŠŠŠŠŠ‹‰‰Š‹ŠŠ‰ŠŠ‰ˆˆ‡††ˆ†…„‰2]‡Š†Š��Œ�cZZ]__\]]_`_^`cb``_`bcb_bbcbdcdefdcceffeedeffeegfffhjihhjlijjjkmmlkkjlkjjmmmnnnnoopnmnrpooqrrrrrstsqprttrrrrtvttruwxvwwwwvvwvxzzzxxwxxyz}}{z|}€€~|}~}}~~|||~�„�‚‚ƒƒ��‚‚„„‚ƒ„„……„„†‡†ƒƒ†ˆ‡††ˆ�–�Ÿ¥ Œ‰‹‹Š‰ŠŒŽŽ��“–“‘‘””–˜—““•™šš—–•—œž›šš›�Ÿ£§©¨ª­¯­¯²´´»¿»°­°´µ·ºÀÆÈÇÉÊÆ¹§�œž¡¨­°²¶¯®­§—”ž£¥£ž�žŸ¡§®·ÇÎÌĵ¦§·Ã¾º²©žš›�š˜˜™šš™˜™™™—–••••’’“•“–—–‘�‘••““’’”’�’‘��‘““�����‘‘“’’’‘‘’““‘ŽŽ�‘‘’‘�ŽŽŽ‘‘�Ž���ŽŒŒ�‘��‹‹ŒŒŒ�Œ‹�‘�ŽŽ‘�‹‹�����Ž�‹Œ����ŒŽŽ��ŽŽŒ‹‹Ž���‹‹ŒŒŒŠˆ‡ˆ‰ŠŠŠŠ‰‰‰‹ŠŠŠŠ‰‰ˆˆ‡‰‡Š‰ˆˆ‡†‡‰ˆ†„†‡ˆ†††ˆ†††‡ƒ�€€�‡2]‹Œ‹�•–”‡i__`aa```aacceedcdegeeefeefggghggghhhgijkhjijjjjkkkkkkmmllmmmomnmmmooonooqomnrttrrqpppsutqstuuwuuuvvwwxuuvyywxyzzzzzz{||y{{|yz{||||}|}}~~~��€���‚‚ƒƒ„„„‚‚�ƒƒƒ‚��…ˆˆ…„…ˆ‰‡†…††ˆˆˆ‡‰ˆ‰‰ŒŠ‡‡Š‹ŒŒŒŒŽ—ž¡¦«¥“Ž��‘‘”‘‘‘““–——•””˜šš›œ›—š���œš�œ�Ÿ£¡ŸŸ¢¨¬°±°²²²¶¶¶¹¿ÅÁ´±³¸¶¸¼ÄÇÊÊÍÎʾ¬¢¢Ÿ¡¡¡¨²µ¬©«­§¤¦©¬¬¤££¢�¤´ÃÏÔÓÎź®³ÁÆÅ¿´¢ŸŸ  ¡ Ÿ�œœ�œ�žœšœ�ž›˜———›š––•••™™˜–––——™—–•———˜™–“”””•–––––••”–––••“•••““‘�‘““““��‘”••’‘�““”’“‘‘�‘“•”“’’‘‘’’‘‘‘’“��‘“‘‘�‘‘’‘�‘“‘‘����‘����ŽŽŽ�ŒŒŒ�Ž����‹‹ŒŽ�ŒŒ�‹‹���ŒŠŠ‹Ž�Œ‹‹ŠŠˆˆˆŠŠŠŠ‰‰ˆ†‡……Š.W†ŠˆŠ�‘�‚h]\\^]]\]^^__abaaa`acdbbacccccccccdeddfffffefffeefhhghjihhjihiiiijjjjlllijknnmlnmmnonnoooopooqsqqqqqsttqpoqqsrtuvvvxxwwxyyxyyzz{|{xz{{z{|~}||~~~~|{|~€||€€}|~€�€}}„ƒ��ƒ……ƒ���ƒƒ………ƒƒ�„………‰‰‰‡‡‹’˜¡¥�މЋ�ŒŒŽ�ŽŒŽ““”“‘‘•——•–•”–————–˜››˜š›��ž¡¦¨¨¦ª©©©ª«°¶¹¶­«®±¯«¬·¾ÃÆÈÊÈ»¦˜œ�ŸŸ¡¦¬«žŸ¨¦¢ ¢ª«¤™šŸ£¢¥±ÀÅÈÍÎË´©¬½Â½­––žŸœ™™›™———––•—˜———–•“’“““””’�‘”“““”“““”••‘�’””“’‘‘�‘“’’‘��’“‘’’‘���’‘‘�‘‘��‘‘‘�ŽŽŽ�����ŒŒŒŽŽŽŽ‘ŽŒŒ‘�Ž�ŽŒŒŒŒ�ŽŒŠŒŒŒ�ŽŒ‹Š‹‹‹‹�ŽŒ‹Œ‹‹‹ŒŒ‰‰‰‹ŒŒˆ‰‰‰‰‰ˆ‰‰ˆ†††‰‰‡‡‡‰‰‡ˆ‡‡‡‡ˆ�‘‹†‡‡‡‡††„„…†……‚‚‚„�ƒ-W†Œ‹�’”“‡j]^`b`a`aaa`bcedccddcdefffeffggffgghhihjigfgikjhhhkmmklmnlmmopqnnopoooppqqpopppsrqqqqrsssutsswxwuuuwxxuuuutuxxzyz{{z{z{z{z|}~~}{}~~}}~�€~}~�ƒ€�‚���ƒƒƒ‚‚��„„ƒ‚‚ƒ„…†„ƒ�„…‡‡ˆ…„„…†ˆˆˆˆŠ‹‰ˆŠ‹Š‰‹�Ž�‘›¢¥¦¡‘Œ�‘’““‘��’•™™–”•—š˜—˜™——™žœœœ�œ��ŸŸ¡¡ Ÿ ££ ž¢¦©¨¨¨­°´³±¬®¯°¯¯µÁÉÎÏÍÊÁ­  ¤¤¡¥¬°­ª¦¦¤¨ª¬±¶±¤¡¤§©¬±¹¾ÉÓÑÏÍÆº®±ÀÂ®š–ŸžŸžžœœœ››™™™›��›œšš˜™—˜˜™š™–•”—••—šš™˜•••—˜˜––“””•——“•——–••–••”••““•–••”““”••”’�“”””•‘�‘““‘‘’“’’’’’’’”“‘‘’‘‘�‘��’“‘’�Ž��‘ŽŽŽ�‘�Ž��‘��ŽŽ��Œ�����Š‹ŽŽŽ�‹‹‹‹ŒŒ�‹Œ‹‹ŠŒ‹‰†„„‹Œ‹‹Š‰‰ˆˆŠˆˆ‡‡††††„„‡*R‚Šˆ‹��Ž„m]Z]_^^^_^^^_`a``_aaccb`bcbccdefeeefffffeghjgeeiiihhhhhgiijhhjjijkmllkmljklkmllnmnonmoqropnopsrrprrsssrrrrrruwuuuuxxxxwuwxywwwzyxwzz{ywwy}|{{}}}|||}~€}|€~~~€~}|~€€}€ƒ����‚�ƒ†‡†††ˆˆˆ‡‡ˆŠˆˆ‹Œ“ž£¥�‹ŠŒŒŒŽ��Ž�Ž��‘‘‘‘‘‘”—–•”–—šœœ˜˜™œœžŸ�™šš›ž¥§§ª®°°±³·¹»¶­¨ª¬¬ª­°¹ÁÊÉÇÇ�žŸ¤««¢  ¤¤¥ª±¬«ª§¨ªª¬¯±¯«°ÃÊÌÌÉô¨®¸¯™�—›�™˜–––™˜•””–˜™™˜•””–––••“““““””’”—’‘‘“•“��‘“”’‘�‘�‘’“’’‘�Ž�‘‘��Ž‘‘‘’�ŽŽ‘‘�Ž��ŽŒŽ��Ž�ŒŽ��Œ���Ž�‹‹ŒŒ����Œ‹ŽŽŒŒŽŒŒ�Ž��‹Š‹ŒŠŠŠ‰‰ŒŒ‰Š‹‹ŠŠ‰Š‰Š‰ŠŠ‰ˆˆˆˆˆˆ‡‡ˆ‰ˆ‡‡†ˆˆˆˆˆ†††‰†�|ƒ‡†††……„…††…„‚ƒƒ�ƒƒƒƒ,U†Œˆ�’•’ˆpb]`___abbbcbdfedcddfeecddeehhgfdegffhihhkjhijjmmlkmkkjkjllnoppnmlnoooponorrpnprrpqrsrtsrrsrrsuwvvuuuxxvtuwzyxwz||zzxyzzy{{}}|{{}~}}‚�~€��€�‚��‚�‚ƒ‚‚„ƒ‚�ƒƒ……†„��†ˆ‡„„†‡‡†‡Šˆ‡‰ŠŒŒŒ‹‹‹ŽŽ�‘”˜¢¦ª¤“Œ���‘““‘���“•••“•—™˜™™›š›œŸ¡¡Ÿž�ž¡  ¡Ÿž¢©²µ³³´¶¹¸»¿ÄÅ¿µ°¯¯°µµµ¼ÅÍÍÌËÊ»©ž¢¤¦¨²°¨¦¦¦ª¬±µ°°²¬¨§¨ª®µµ­ª¶ÄÎÐÐÎÆ¶«­²£š›ž ŸŸœ›˜™šœšœœœ››šš––—™™šš——™™šš––•˜šš˜˜˜˜–———••”––•““•––––”•”““”“““•––”“‘‘’••“�’““‘“”’‘���””“’‘���“’‘�““‘’“‘‘��‘‘�Ž��Ž�������������ŽŽ���ŒŒ�ŒŒŽ�Ž�‹��ŒŒŒŠ‹Œ�‹‹‹‹‹‹ŒŒŠ‹‰‡‰ŠŠŠ‹Šˆ‡ˆˆ‰‰Š‡‡……„……‰)Q�ˆ…‡Œ��‡n_[\\\]^\]^^^`a`__^`bbb```cbdcbacbccdeddfgggggeeehhfefhihhhjjkjighiiikkkklmmmlkjjjlnnnpommoooppoppppsuutttrssttuuvvvuvuttwyxvwxwwxzyzzzzzy{z{||z}|}}}}~}||~~~~}|~€‚€��€‚€€�€€€‚…†…ƒƒƒ…‡‰ˆ††‰ŠŠ‰Œ“ž¢§ ‘ˆˆŠ��ŒŒŽŽ�Ž�‘�‘‘�‘”••””“•˜�œ™˜››ššœš™›ž¢¥«­¯¯²´²²³µ»¿¼°«ª®¯«¨«³¿ÇÊÈÈȽ«��ž¡£­¬£¡££¥¨°²¬®°£ ¢¤ª³µ«£¡¦«¸ÆÍÊÈÀ²¥Ÿ—•˜žœ˜—•”–˜™—–———–—––””•—””””“”““““’“•”‘�‘’’ŽŽ�“’’‘’‘�Ž��‘��Ž�‘”’Ž��Ž�‘‘’������Œ�ŽŽŽŽŽŽŽŽŽŽŒ‹���ŒŒŒŒ‹ŒŒŒ‹Œ‹ŠŠ��‹ŠŠŠŠˆˆŒ�Œ‰ˆˆŒŽ�Š‹ŠŠ‰ŒŒŠˆ††ˆ‰‰‰ˆ†ˆˆˆˆ‡‡„„„…………††††‡†‡††‡ˆ‡……‡‡†…†‡……†…„†……„ƒ�€ƒ*S†ŠˆŠ�““Švc]aaa`aac`abdfebcdgeedeefffeeeeefhhihigggjiikmkjjkjkllllllmmnoommnnmpooopooopppqrrrrrsssrttttvwyttwzxwxxwwwyxwxz{{zzyyyzzxzz|{||}~~|||~~~}}}€}}�~‚‚‚‚‚�ƒƒ„„ƒ‚‚„………ƒ‚‚…‡…„„‡‡‡‡Š‰‰‰‹ŠŠ‰‹ŠŠŠ��Ž”š� §¤˜�ŽŽ���’“��‘”••””•™›š˜˜™šžž�œžŸŸœžŸ¡££¢¡¡¨®±±±°³¹¸·º¿ÂÀ·²¯±¯°±´¹ÄËÌËÍËIJ¤¤§¦¨¯¯«¨¨¨ª®¶¸²¯°ª©«²µµ¯©§ªª«¯»ÊÎÍËÄ´£œœ�¢ž›š�››™œœ›šœ�š™šœš˜˜›�žš˜–——˜–——˜———™™˜•”–—–••••••“•”””———••”––”‘’“•••“’’’‘’”•“��‘“’’‘��’�’‘’���“””’‘��’’““’�‘‘’��‘’���’‘ŽŽ�’��ŽŽ�Ž�ŽŽŽ���ŽŽ��ŒŠ��Œ‹ŒŠ‰Š‹‹Œ�Œ‹‹Œ‹‹ŒŒ‹‹‰ŠŠŒ‹Š‡‡‡‰‰ˆˆ�ˆ„………„‡(M‡‡ˆ��އt`X[]]][[\^^^^^__b``bcbb`bbbcdbbbcdeedecdegfdcdeffffgghhggjkjhhiihjkjkkjjkkmmllklooonnprpooorrrqqprqqprrtstqsuwvttvwxxustwwwwxxxxzyyyzzzxzyxy{}}z||{{|~~||~��€~~€ƒ�€€€‚‡†ƒ€‚…‰ˆ†„††ˆ‹ŒŒ�—œ£ �ˆˆ‹ŽŒ‹‹�‘��Ž�’“’‘“’“––““—™—–™›™™™›Ÿ  �œšŸ£¤££¦©§¥¥ª¯³´°«ª­¯®®²´¹¿ÄÄÄÂÁ²£Ÿ£¥¦¬®§£¥ª­­°²««²°«¤¢©­©¤¡¢ ¡£¨¯¶¿ÊÇ·§œ——�Ÿ�œš–——–•˜—–•——–“——–––”’“““””““••‘’‘��’��‘’‘‘‘‘�‘�����Ž�ŽŽ��Ž‘���������Ž��ŽŽŽ‘‘Ž��ŽŒŒ����Œ‹ŒŽŒ��‹ŠŒŽŽŽ��Œ�Ž�‹ŠŠŠ‹�ŽŽ‹‹‰‹‹ŒŠ‹‹‹ŠŠ‰‰‰‡…†‰ŠŒ�Ї‡‡‰‰ˆ‡††ˆ‡‡‡‰†ƒ…ˆ‡†„…‡†…„†‡‡†…ƒ…††‚‚„‡ƒ�‚����ƒ(O�ˆˆŒ�““Šxc\^__```_a___cccccdeeeefgfeegghgffhgghheghiiijljiiikjjllkmmmlomkjmmmmonmorromorrpprrsstsstututttutttuwzxvwwyxxwwxzz{zyxxyz{||||zz{}}}|}}~}~€‚�‚�€~~„�€�‚�‚‚‚„„‚‚ƒ„„„………ƒ„…‡‡‡‡††ˆ‡……‰‹‹Š‹‰‰Š‹ŒŒŒ�–› ¦¤•�ŽŽŽ‘“‘‘“’’•————•–—ššš™››��ŸžŸŸŸ�ž £££¡�› ¥©°²²²²³¶·¾¼´°²²³²²´¶·¼ÂÆÆÇǺ©£¨ª­±³±´´¹¾½¼½·²±²¯¬¬¯¬¥¤¤¦§§¥¦¨¯ºÊÌÀ¯¨Ÿž¡¤Ÿ�Ÿ¡ž›™œž�›šœ�žžŸœ™—™™›š™˜š™™˜™™˜——––•”“–™™•”––—”””•’’”—”“’“•–”’’‘’“”“’�’’’’’’’’””“���’‘‘‘“’���‘‘’‘‘�‘‘’’“‘��‘‘‘��‘‘����’’�Ž�����ŒŽ�ŽŽŽŒŠ‹ŽŽŒŒŒŒŒŒŒ�‹Š‹‹Š‹Œ�ŒŒŠŠŠŒ‹Šˆ‰‰‰‰‰ˆ†…†‡‡‰Š‡…„„……†ˆ$I|‡…‡��ŽˆwbW[\\]\]_`_^]__acbaaaaaaaadedabbddddgedccdgffffegghhhggghggiiiijjjjkkllmllkkmokjklonmmoppooosrqoopsrrqrrssrrsuwvttuwwvutuxxxwxxxvxxzzxyyy|~}zyz|~}{|}}||{}~~}}€€}��}€ƒ‚„„‚€�‚……†ƒƒ…‡†„ƒ„†ˆ‹�’˜œ¡¡‘‹‰‹ŠŒ�����ŽŽŽ‘”••“‘“•—–•”–™š™›™™™�Ÿ Ÿžž¡¦ª­®°³²°²µ·¹¿¼²ª©ª­­®¯±±³ºÀÂÄÅ¿²¬¬®°´µ¯¬ª®³º¾Á¸±±°®²¶²©¥¥¥£¢¢¢¢¥¥¦¯»½°¢›œœŸ�š˜˜˜˜˜š�š–•—˜˜–™˜—–––”•—–•’‘�“”•”“‘�‘‘��‘‘‘�‘‘’’‘’•“��‘���‘’ŽŒ��Ž��ŒŒŽ�ŽŒ��ŽŽŒŒ��ŽŒŽŽŽŽ�Ž������ŒŒŽ��Œ‰Š‹�ŽŒ‰Œ‹‹ŠŒŒ�ŒŒŠ‹ŒŒŒ‹‰ˆ‰‰ˆ‡ˆˆ‰‰ˆ††‡Š‰ˆ‡‰ˆ‰‰Šˆ††‡‡„„†ˆ‡†…‡†„ƒ„ƒ†…ƒ‚„……„„„„„„„ƒ‚€‚‚‚ƒ&N€Š‰ŠŒ‘’ŒxcZ____aa`bbabedbcdefeebcdffgggefggghhghggijghhhjkjllkjkkkkmkijkkmmmonoonnppqoonpppqrqqqqqqssqrttuutstuxvvvwwzzywwxyyyyz{yww{}}{{{}~~|{y{~~~~}~}~}}~‚‚��€�����ƒ„��‚„ƒ………ƒ‚‚…‡‡…ƒ…†‡‡‡‡‰ŠŠ‰‹ŠŒŒŒ‹Œ��”Ÿ¢¥Ÿ–‘�ŽŽ���’’�’“”“”•–—š��œœ››œŸ ¡   žž ¥¤££§­²´¶¶···¹»¼¿ÂÀ·±¯°®¬­³¸·ºÁÉËÎÊÈÆÇÅÆÄÀµ­±¶¹¿ÃÁ»¶µµ·¹ÀÀ·ª¤¦§¦¦¤¥¤¤¦©¬²¶²©Ÿ›ž Ÿœš�œ››››�›››šš�™™™™——š›™˜˜˜˜˜—””••“––•‘“•––”””�‘““””••“’“““”“‘‘‘“���‘””‘‘‘‘‘‘���‘‘‘“’‘�’’’‘’�ŽŽ’’’‘���Ž��‘‘����‘‘Ž�ŽŽ�����Ž�ŽŒ‹‹‹����ŒŠ‹ŒŽŒŒŠ‹‹‹‹Ž�ЉŒˆ‰‹ŒŒ‹Š‡‡‰‰‡‡‡‰‰‰ŠŠˆŠˆˆ‡‡†‡‡ˆ…ƒƒ„ƒ…#Fx‡‡‡‹�ŽŠ{eV[]]\]\]]^__^_a``a`^`ba_``bbc``bedcceedcccdedddeeefhhhggffehjjhihjkihijkkilmmkkkmmnnnlmmnmnppoponoooqrprsrqstvttsttvutsuuuuuvxxxxxyyyxxxy{|zz|~{zyyz}~~{z{~|}}�€~}}}}����ƒ‚‚ƒ„ƒƒ„ƒ‚ƒ†††…††ˆŠŽ“™�£Ÿ“Š‹�����Ž���Ž��““—•””–—™˜˜˜œžžœœššš�ž�ž ¥«¯±²°³´³±´¶¹¿Á¶¬©­®¬¬²·º¾ÄÇÇÈÆÅÄÇÉËÉÆÀ½¿ÂÅÉËÈ¿¸µ¸½À¹¬£¢¤£¢ ¢¢¢¡ ž£§«© ˜™œœ™œ›™˜˜™™™•••—•–˜˜””““‘”–—–”’’’‘’’�Ž��’”“�‘‘‘�’��Ž��‘“�ŽŽ���Ž�Ž��ŽŽŽŽŽŽ���Œ��ŽŒ‹ŒŽ�ŒŒŽ�‹ŒŒŒŒŽŽŒˆŠŒŒ‹ŒŒ�ŒŠˆ‹�ŒŠ‰‰‰‰ŠŠ‰‰‰‹‰‰ŠŠ†ˆˆˆ‡ˆ‡‰ˆˆ‡‡ˆˆˆ‰ˆ‡‡ˆ‰‡‡…„„ˆˆ‡†‡‡††‡……‚ƒ„‡‡„ƒ„„ƒ…„ƒƒ…ƒ�‚„�€€�(O‰ŒŒŽ’“�|dZ_`bba`accadedbddccdcbceeffeedfeffhhhghfggiihhjiiikkkjijjkkmllkmmnnoopmmnoopppprsqpprrsrrqrrtsutuuuuvvvuuuxyxxxxwxxxuwy{yz{|{||}~€�~{{}~€€��~}~�ƒ„‚~‚‚��ƒ„„‚��„‡…„‚‚‚„…†††„‡‰Šˆˆ‡‡ˆŠ‰‰‰‹‹‹‹Œ�— ¥¨Ÿ“�‘���‘”“’”“““•——––šœ›š›�œœŸ¡Ÿ›ž ¡žŸ¢¦¥¥¥©°®«­­­¯°²³¸¾½·²±´´´µ»¼ÁÄÅÉÌÌÌÉÈÌÑÑÏÎÌÌÎÐÐÑÒÒÍÉÈÉÆÆÈʽ¯¥§§¨©¨§¥££¤¦§¨¬®¨  ŸŸž ž›™š›�œš™˜˜™›�œ˜–—˜—™šš——•–•–•““””–——”““”———”““”“”••’““•““““““��‘“”““‘������‘’“��‘‘‘‘““������‘’‘Ž�Ž��Ž����Ž�Œ����ŽŽŽ���ŽŒŽ�‹�ŒŠŒ���‹‹‹ŒŒŽ�Œ‹‹‰ŠŠŒ‰ˆŠŠŠŒ�‹‰ˆ‰ˆˆ†ˆ‡‡‡‡†ˆˆˆ‡†…‡ˆ‡……‡††……„‡#Bu„†‡ŠŒŒŠ}dW[]]]]\\[\\]\^_a__^a`a``_``bbaaabbbbccddddcdedddffedggggfghhiigghkijjjiiikjkkmkjjmmmmlkllnommnppprtttrrqsrttuvvuuuvyxuswyxuvvwyzx{yzzxxz{||~~}{{|}}}~}}}}€€|~�…�ƒ‚~~�„€��€‚„ƒƒƒ„ƒ„…†††ˆˆ†ŠŒ‘šŸ£Ÿ“Œ‹‹Ž��ŽŒ�‘�ŽŒ’“””““–——™™™šššœš—˜››�ž žžž£§ª«­­®®¯°²µºº´­©««¯´¶·¼À¿¿ÂÄÂÁÅÆÇÈÊÉÉËÍÍÍÌËËÊÈÄÁ½½¿Âº¬¢¤£ žŸ ¡Ÿžžž�Ÿ¢¢Ÿœ˜—˜››™™•••–••”••—————•“’’“““”“‘‘‘’’’‘‘�‘�‘‘���Ž�’’�Ž������‘�Ž�����ŽŽ�����ŒŒŒ�ŒŒŒŒŒ��ŒŒŠ‹ŒŽ‰Š‹Œ‰‰‹�‹‹�Œ‹Œ‹‹‹‰‰‰‰‰‹‰ˆ†‰ŒŒ‰‰ŠŒŠ‰‰‰‡‡‡ˆ‡‰‰‡‡††††‡‡……†‡…‡‡‡ƒƒ…‡†‡‡‡†„‚ƒ††„ƒ…ƒ‚‚……„ƒ„„…‚��‚‚‚‚‚�}(Q}†ŠŒ�‘’Œ~c[____^^_```bbaabcccccddffedefgeeeefhhhhiiggikiiiiiijllmlllmnpmmmllnoonnmoqpommoqqqqrqqqttsssrstuuvvuuvxvtuxxwwxxyy{yzyz{{zz{{{{||}€z{~�}}�����~„„�€����‚�‚‚�‚ƒ„†…„‚ƒ„‡†…ƒ……‡‰Š‰‡‡ˆ‹‰‰Š���ŒŽ‘œ¢¥¦ “��‘�ŽŽ’”““”””˜––•–—™™œ�›�  Ÿ¡¡Ÿ¡¡¡£¢£¦¦¥©®±±²²±±²µ·¸¾½·°¯±²µ¹¼½ÂÃÀÄÉÉÈÇÉÊÏÐÑÏÏÎÑÒÒÐÐÎÌÈž¸¶½Â¼°©ª§§¨¨¦¦£££¤££¢¡ŸžŸŸžžžž���››™���šššš—™™š™™šš˜—••–——–””––––•‘’“———•““•––•••••”’�‘�‘’’’“‘��‘�����‘’“��’’‘��ŽŽ����������‘‘�ŽŽ�����ŽŒ�ŽŽŽŽŽŽ���Ž���ŒŒŽ�ŒŠŠŠŒ�‹‹ŒŒ��Œ‹‹‹‰ŠŠ‹‹‹Š‰ˆŠŠˆˆŠˆˆŠŒ‹Š‰ˆ‡‡ŠŒ‹ˆ‡††…††‰†„ƒ„‚ƒ† @qƒ…‡‰ŒŒ‰€iXZ\\\\\[\\_``^__a`_acbbbaabdcccccedbbccedddfdddefeffefhihgggjjjjihjjkkkjjiklmmllkmmnmmorppoooqqooqrtsqpqrtrptvututtuvtttwxywvtvxyxxxwwwyyzzzzyx{{{{{{}€€|}|€||~~�€€���„‚�‚†‡†„ƒƒ…†††‡‡‡‹Ž“š�  ‘Œ‹Œ‹‹ŒŽ�Ž�’‘’“““–•’”–˜˜šš™˜™œŸ›ššœœ £¢žž¡§§¥¥§§§§§©ª®±´¯­­°®®°´¶¹¼¿¿¾ÀÂÃÄÇÊÊÊÉÉÎÏÏÍÍËÈÂÁÁ½¹¹»·®©§¦¤¡¡¡££¡ Ÿ››žŸ�œ™˜˜œ›™———™˜———•’’•—”““”””””’”””‘“”“��������ŽŒ��Ž‘’���Œ‹Ž�’Ž�‹ŽŽ�ŽŒ‹ŒŒŽŽ��ŒŽŽ���‹‹‹�‹��ŒŠŠŠŠŠ‹Œ‹‹ŒŒ‹‹ŠŠŠŒŠŠŠ‹‰ŠŠ‹‰‰‰‹ŠŠŠŠŠ‹ˆ‡ˆ‰Š‹ˆ†‡ˆŠˆ†…††ˆˆˆ†‡……„†‡‡†„„…†††„„‚„…††…„„ƒ……††„ƒ„‚���‚‚�~�€€€'O{ˆˆ‰Ž‘�Œ€fZ_`__^__aaaabbcbccdcccddddecdeffefffffefghhhghijjiijjkjiikklokkkllmnomllnopopponooppprrrrrtvspptuutvvwxxvuuxyxwwyyxxxxxxzzyxyy{{||||}{{|}}��~‚€€�����‚„…ƒ‚�ƒ†…�‚„„„……ƒ„…††ˆ‡‡†‰‰‰Š‹‹ŒŒ‹Œ�˜¢¤¥ •������”’’””’•™�œš—š››ž ž�œžž ¡¢¤¡¡¢¥¥¦¦¦§¬­¯²¶µ·¸¸·ºº¾½´°²µ²²´»¼ÀÂÂÁÄÆÈÈÊËÍÍÏÏÑÔÓÒÐÐÏÌÆÇÈȾ»¹±¬ª©¥¦©«§¤¤§¦£¡¡¢¢¡¡ Ÿžš�ŸŸœœœ�œ›šœœ›››››——˜™™™˜–••—–”’““””•”“””’““””’‘’’‘‘’“‘‘‘’‘‘��Ž��’�’’‘��‘‘��‘ŽŒŽ��ŽŽ�Ž��Ž��Œ‹Œ��ŽŒŽ‘�ŒŒ�ŽŽŽ��ŽŽŽŒ‹Š�Ž��ŽŒŒŒŒŒŒŠ‹‹ŒŠ‰ŠŠŠŠŠŠŠŠŠ‰‰‡ˆˆŠ‰ˆ†‡†‡ˆ‰‰ˆˆ‰ˆ‡ˆˆˆ‡ˆˆ‡…‡‡‡………†…………†…ƒ† =m‚‡‡‰�ŽŒ~eTY\][[[\\]_^____````abb`aabbb```ccdcccedcdeedddfeeefdddedffggihhhhhhhhiklmlklllkllmllkmmpppoonoppprssrpoqtsssssuttsuuvussvwvuuwxxvwyzyyxyy||{yz||{}|z{~}||}~~~~~€�}€‚}€�����ƒƒƒ†…��„†ˆˆ‡††‰Ž’™š¡£šŽ‰ŠŒŒ�ŽŽ�““’““‘’–——–••š›š—˜™œžžŸŸ�� £¢£¦¨­¯²´··¶µ·¸»¼½º´®®²²®®³··»¾¾¿ÁÂÂÇÇÆÇÊÊÉËÎÎÌÈÅþ½ÄÊĶª­¯¨¤¤¥¥£££££¥¢ ��œ  ž››œ›˜˜–—˜™˜——“–˜—””•˜•““••“’“’‘““‘‘����’’“’‘Ž�������ŒŽŽ��Ž�ŽŽŒŒŽ���ŒŒŠŒŒ‹ŠŒ��‹‹ŠŒ‹‰‰Šˆ‰‰‰ŠŠŠŠ‰ˆ‰Š‹‹‹‰‰ŠŠˆˆ‡ˆ†ˆŠ‹Šˆ‡‰‰Š‰‡ˆ‡ˆ‰‰ˆ‡……†‡†…„†‡‡†……†††††ˆˆ‡†‡‡‡††„†††„„„††„ƒ……††…ƒ‚‚‚‚ƒƒ��‚‚€�}€&IwˆŒŒŽ��Œ€dW^a`]__bbb`aaaaccccdddddddcdeeeeffgghhhhhfgggfhhiiiiijjjjllkjklnlnnnmnonmnoqpmnoprpprssrstusutsstvutuxwvvwvvyxvvvxxxxxwxy{{{z||{{|||~||}€}}~}€�~~�€�€€���‚‚ƒ„„„„…„„„ƒƒ„……††……„‡‡‡†††‡ˆ‰‰‰Œ‹‹��– ¤§¤œ�Œ�‘���•••––•—™›š™˜™œž�šœž   Ÿ Ÿ ¡¤¤¦¨©©­³µ¶¹º¸¹»½¿Â¿ÀÀ½·¶·¶´¶µ¸»¿ÀÃÅÈÉÉËËÊËÐÐÎÐÒÒÒÍÌÊÇÇÎÎɽµ³²­¬©¨¨©ª©¨¦¥¤¤£¢¡¡Ÿ ¡£¢žœ�žžœœœœœ››™™—™™™š™”–˜š–™˜•••••••”••–—–•“”–—”“’’‘’“•“’‘�Ž�’‘���������ŽŽ�’��““�‘��Ž�’’�Ž���’“‘��������ŽŽŽŽŽ‹��Ž��ŽŽŽŽŽ��ŽŽ��ŒŒŒ�Œ‹ŠŒŒ‹ŠŒŒŒ‹‹Š‰ˆˆˆˆˆŠŠ‰‰‰Š‰ˆˆ‰‰‰……†‰‡ˆ‡……‡‡‡†……………ƒ‚‚„„‚„:i€‡‡‹�Ž‹�gWZ\[ZZ]^_^]_^^^__bb`_aaba`_accaabdedcbaadddefddceeffgghhffefgiiijjhjkkjjkmkklmkkkmmmnmlmqsqnopqponppqstrsqrstsstvtrstvvuuvxxuwvxxxwxzzxxx{|{yyyz|~}zz}€€~}~~~|}~�ƒ‚€ƒ€~€�‚�ƒ‚…‡†ƒ‚�…‡‰ˆ‡…‡Œ”›ž  ˜�ŒŽŽŒŒ��Ž�‘’‘“’•—˜——–—˜šœœ™—˜�ŸžŸŸŸ¡¥¤¤¤«¯±±µµ¶··¸¼¼¹¸¼»¸´²±±´³³µº»¿ÂÂÂÈÈÈÇÇÇÉÌËÊËÍÎÍÊÅÅÊËÄ»µ°¬§¨¥£¢£¢££¤¤¡�œŸ¡¡Ÿžœžœ™˜™˜˜˜›š˜”“”˜—”“–—”’““““””’’““‘’’“’‘ŽŒ‹�’�ŽŽŽ���Ž���������‹Š���ŽŽ�ŽŽŽŽ�ŒŒŽŽŒŠŒŒ‹ŒŽ‹‹‹ŒŒ‹ŠŠ‰‰Š�Œ‹‰ˆ‰‹‹Š‰ˆˆ‰‰ŒŒŠŠ‰‰‡‰Š‹ˆˆ‡‡‡ˆˆŠ‰ˆˆˆˆ‡‡‡‡†‡‡ˆ†…„……††…„„ƒ„‚ƒ„„‚ƒ…‡†„„…„ƒ…„„„…‚‚‚„�����€~~}~€$Ep„‰‰�‘“Ž‚eY]__````dca``acdddcccdedcdefeheddggfffffhhiigfhiiiiikijjjjiikklllllmooommnnnmoooprqrrqpqsvvsqtutstvutttvwtuwyywvxzzxxxxyyy|{yyz||{||||{|{||}{|~€�€‚ƒ„„‚€����‚‚‚‚‚�……‡‡…ƒ†………‡†…†ˆˆˆˆ‡ˆ‰‰‰ŠŠ‹‹�‘˜�¢¤Ÿ”��“”‘Ž�’““•––———™š˜šœ��    ¡¡¢¢¡¡¢¤§§§©¬°¶¸¸¹º»»½¾¾¾½½Â¸µµ·¼¿ÀÃÃÇËÍÌÌËËËÏÏÏÐÓÒÒÏÌÉÌÏÎÈ¿¸´°¬­«ª¨¨¨©§¦¥¦£¥¦¦¥¥¤¤¤¢ Ÿ  ¡  ž�œ�œœšœœ�›™—™™š™˜———˜˜˜˜—•••“””•”‘‘”•”’’‘““““““””“’����‘“’��‘�������“’’������ŽŽŽŽ����‘��ŽŽŽ�ŒŒ‹Œ�Ž��Œ‹�����Œ�‹Œ‹‹‹‹‹ŒŒŒ‹‹ŠŠˆ‹ŠŠ‰Š‹Œ‰ˆ‹‹Šˆˆ‰Š‰‰ˆˆ†‡‡ŠŠˆ†ˆˆˆ‡ˆˆˆ‡‡‡‡‡‡ˆ†‡†„ƒ……„‚‚�7b~„…ˆŒŒ‰ƒkVZ]\ZZ]^_]]]_^____aa_`aa``_````acdbbbcabcddddebcdeefeefhhgfdfgiihhjjjhhjmkllllllklllmmlmnponnqqqpooqqppssrrssrrstsrsvvvtuuwvwwwwyyzyyxxzzzzzz|{yy{||{}|‚|}€~}‚€~€�€�ƒƒ���‚‚††‡‡††ˆˆ‡††ˆŠ‘˜œ�›”Ž‹�Œ�ŽŽŒŽ�‘�’’’’•––——–˜›››šœ›žŸ �œž¥¨¦£¦¬²´´³µ·¹¹¹¼»¹ºÁÿ·±¯±±´¶¹¹¾ÃÂÂÄÅÅÄÄÅÈÉÉÍÎÎÌÎÍÍÉÉÊÊÅÀ¶³¯««ª¦¥£¢¡£¥¤¢ŸŸ¡¢Ÿ  Ÿœžžš—šš››œš˜˜—–™›˜—•””–”“”—•””“���’’’���‘‘��ŒŒ�Ž�����Ž���‘����Œ�Œ‹‹‹‹‹ŒŒ���ŒŠŠŒ‹Š‹Ž��ŒŒŠ‹‹Œ‹‰ˆ‹���Œ‹‹‹ŠŠˆŠ‰ˆ†Š‰ˆˆˆˆ‰ˆ‰Š‹‰‡‡‡‡‡‡†††††‡ˆ‡………‡ˆˆ†‡…‡‡‡…†‰Œˆ‚‚ƒ†††††…„‚‚‚ƒ‚…ƒ„…„���‚„„�}‚‚��~"@m†‰‰Œ���…iY^a``aaaa`aaaabbcabbedbcccdeeeedfeefffdfhhghggfghhgffkjjiijkmmlkkkmllnpnmmmnonommorrrqqrssrrstrqruutsttvvvuvvwvuuuwxzxwxyyzzzzzz||~~}yy{€€{|}~~}{z}��€��ƒ��‚…„‚‚‚„…„ƒ‚‚…‡„‚„……†‰ˆˆˆ‰Š‹ŠŠ‰‹��”™›  —Ž‹�“•’‘“—˜˜••“—™œš™™›Ÿ£¡ŸŸŸ¡££¤¦££§¨¨«­¯°¶·¹º½½½»½¿ÂÂÂÇÈÁº¹·¶µ·»ÀÂÅÅÆÈÊÊÊÉÈÇËÎÐÐÑÑÏÏÏÏÎÎÌÍËĺ¶²±­¬ªªª©¨©ª©¦¦¦¦¦¤¢¡¢¢£¡ŸžžŸŸž�›œ����›��œ˜–—™š™™–•””“––•“••”“•“’’“’‘‘““��‘”””“‘‘’’’��������Ž�’“’ŽŒ�Ž��Ž��Ž���Œ‹�����Œ�Ž�ŒŽŽŽŽ�ŠŒŒ��‹ŠŠŒŒŽ��ŒŽ��ŒŒŠŠŠŒŒŒ‹Š‰ŠŠŠŠŠŒ‹Š‰‹‹ŒŠˆ†ˆ‰Œˆ†††‡‰Š‰‰‰ˆ††‡ˆˆˆ†††‡ˆˆ‡‡„…ƒƒƒ‡‡…ƒ‚6a}ƒ…ˆ‹‹ŒƒiV\^]\]]]]^^]^_^]]_`__`b`bbb_abcbbabccbbbdeddcccddfffeedgiifhhiihhhghiijjjjklmkmmmmmmnmmmpppppppoppppqqqrqsrrqstvtttttuuuttvxxttvz{yvvuwwxxyy{{{yy{|zyyy}~}~~}}€}~~}~€€€�‚‚‚……„„…„†ˆŠ‡††Š‘›œœœš‘‹ŒŽŽŽŽŽ�’’’“‘‘“–—˜–˜–™›�œ�ŸŸŸ¡£¢ £¦§§©¬¬±´¸ºº¹º·»¾¾¾ÁÀ¾»¸´²²µ¶·»ÀÂÁÄÄÃÃÄÂÂÄÇÊÏÌÍÏÏÎÎÌÌÉÇÉÈÁ¹·±«¦§¨¨¨§£¢¢¤£ ž¡  ŸŸžœ™›��œ™—˜››š˜˜———˜—––˜—–•––”‘‘‘‘�‘’‘‘�����‘��ŽŽŒŒŽ‘�����ŽŒŒ�����ŒŒŒŒŒŒ‹‹‹�Œ�ŒŒ‹ŠŠ��ŒŒŒŠˆŠŒ�Œ‹ˆ‰‰‹Š‰‰ŠŠ‹Š‰†‰Šˆ‡ˆ‰‰ŠŠˆˆˆ‡‹Š‰‡‡†ˆˆ‡†ˆˆˆ†……††„…ˆˆ‡…ƒ„„„„„€~�„ƒ…ƒ„„…………†…ƒƒƒƒ„„‚‚���„‚�€�!=g�‰‡ŠŽ�ŽƒgY_aa_`__`ca``bbcccbceebbcdeffccdgfedfffeffhiigggjjgghhhkkkkllkjjkmmomnoonnnpqonnqqqqqqsrrqrssqrqssttspsuuuuuuwwvwxxxwwwzyyz{z|{{z}}}||}~}}~~}}~€€}||��‚‚‚ƒ„‚‚ƒ„ƒ�‚ƒƒ…„�…………†„„†ˆˆ†††ˆ‰ˆŠŽŽŒ��–�¡¡ž™‘ŽŽ’’‘��’—–””•–™œ›šš��žŸŸŸ¢¤¤¤¥¤¥¥§¨ªª¯±´·º»¼¿¿½º¹¼ÁÅÃÃÆÄ¿¸º»»¸º¾ÂÅÈÈÈÇÅÄÅÅÇÍÑÒÐÐÏÐÑÒÐÏÍÍÍÍÆ¿¼ºµ¯¬ª¨§§¨«©§¤¤¥¥££¢¢ ¡¡ Ÿ Ÿž›�ŸŸžž�œ›™—˜›œ�š™———˜•“’”•—•––“’””“““’’““•”““““•‘�‘‘���‘‘‘‘��’‘Ž��‘�����‘������Ž������Ž����Œ���ŽŒ�ŽŽŒŒŒŒ‹ŒŒ�‹‹ŒŒŠŠŠ‹ŒŠ‰‰‹Š‰‰‰‡‰‰ŠŠŠ‹‹ˆˆ‡Š‹Šˆ‡‡‡†ˆ‰‰‰ˆ††‡ˆ‰‡ˆ‡‡‡ˆ‡‡†††††…„„…ƒ‚‚……ƒ€€5_|……‡ˆŒŒƒhVY\]]\\]]]]]]_^__aaa``ab``abbcca`addebaadddddceefeeddddehhfggghjhhgjjjgjjjiklmkjjlnonnnmnorrppppqpprrpqrrrrrtrrstusrrstwuttwwwvvuyyywvw||zz{}{yx{|{xxy|||z||~€€�‚€~€„ƒ‚‚„‚�ƒ…ƒ„„…ƒ„…‡‡‡ˆŠŒ’™›Ÿ�“�Œ��ŒŽ����‘““–•””™œš––™›��žžŸŸ ¢£¢££¦§ª«¬¬µ½½¾½¼¾ÀÀÀÁÁ¿Á¿¼¸·´µµµ·½¾ÁÂÂÀÀÁÃÁÂÈËÌÌÍÍÌÍÎËÈÆÉÈÆÂ¿º·²«§¨ªª¦¥¤¢£¦¥¢ Ÿ¡Ÿž��šœšš™›™ššššš™–”“–––••••“’�’‘‘‘‘�’““’‘Ž��‘’‘������‘Ž‹‹�������ˆ‹Ž��Ž‹‹‹Œ�ŒŒ��‹‹‹‹‹�ŒŽŒŠˆ‰ˆ‰Š‹‡‡ˆ‰‹ŒŠˆˆ‰‰Š‹‰Š‰‰ˆ‰‰‰ˆ‡†‡‰‰††…††††‡ˆˆ†……„†‡‡…………††……‚„†††…„„„†‡†„ƒƒ‚ƒƒ…ƒ‚�„„……„ƒƒ��€€�ƒ�€ 9bƒŠ‡‹���…j[]`_^\^]__aa__`ccdddbbcdceefeffggigghhhhhhihggiiiikiiiijmmmkmjjlmmoomopooooppooopsrqooorrqrsrrrqqrsstrstvvutvwxxwwxyzyzyzzzxyzzzz{{{{|{{{}}}~}|~€~}}~�|~‚ƒ‚‚‚‚�‚‚‚�…‡ƒƒƒ……†………ˆ‰ˆˆ…†ˆŠ‰ŠŒŒŠ�Ž•œŸ¢¢—�Ž““”“��’””––””—˜š˜˜™žŸŸ ¢¢£¢¡¤¨¨¨ªª¬²¸»¾¿ÂÄÅÈÉÇËËËËÌËÌËÊÅÀº···º¾ÀÂÄÅÇÅÅÅÆÅÅÊÐÑÑÐÐÎÎÍÎÍËÉÈÈÅÁ¼¼¹´¯­­¬©©««§§¥¦¥¦¦¥¢¢¢¢ �œ�žžž›šš�ž�™™——˜™™œ—•–™™–”””•—•“’’’•––••’‘’•“’‘‘��’“‘��‘’’“‘��’’�Ž‘‘ŽŽ‘‘���‘����ŒŒŒŽ�����ŽŽŽŒ‹Š‹‹‹Š���ŒŒŽ�ŽŒ‹ŒŒ‹‹Š‹‹Š‰Š‹ŒŠŠŠŒŠ‹‰ˆˆ‹ŠŠŠŒŠˆ†‡‡†‡‰Š‰ˆˆŠ‰‰ˆ‡„…†‡†‡‡†…†‡†…†ˆ‡†…‡‡…ƒƒ„…‚‚�‚‚4\~‡ƒ…ˆ�Š�fX[^]]\\\__^]]\^___````^^^aa__aaaacceedabccceecccdbbefdeehhhfeegijijihhijlljkkkklllkmnollmppponmppomnonnossqqsssrutsuvvwvustwxwvvwxwwwwvxzzyzxxy{z{{{xxy||{}|{}€{|��‚‚‚€~‚„‚‚ƒ„ƒƒ„†…†‰Šˆ‡ˆŠ“›�ž�“ŽŒŽ��Ž��ŽŽ�‘’“”“‘’•—˜™˜ššœžŸ�ž¡££¤¤¦­¹½¿¿½ÃÈÇÈÉÈÇÇÉÊÈÆÉÉÆÀ»¶´´¶·¹·¹»¼ÁÃÁ¾¼»ÁÆÉÈÉÊÌËËÈÉÉËÈÅÃÃÃÀ¾»²«¨«©¥¤¡££¥¥£Ÿžž¡¡žœ›œœ››™—––˜˜——–•””–•”’”““‘“’’‘““’���Ž��ŽŽ����Ž‹ŽŽ�ŽŽ‹ŠŒ��ŽŒŒŒŠŠŠŒ‹Š‰‹Œ�ŽŽŒŒŒŒ‹ŠŠŒ‰‰‰‰‰‰‰‰Š‹‹‹Šˆ‡‡‰Š‹ˆ††ˆˆŠ�Œˆ‰‰Š‰ˆ‡‡‡ˆˆ‡ˆˆˆ…„„†‡ˆ†…ƒ…ƒ††‡‡…„†„ƒ„„ƒƒ‚‚‚‚„„„„†…„ƒ‚�ƒƒ„„ƒ‚ƒƒ„ƒ€�ƒƒ�����€~~}€5]�‰‡‡‹�ކjZ]_^]__]^_```___ccccdccccbccedcdfffffeefggghgggggjihghikkkiijkkkmmmklmonmmmoqommqpooooooopqqrrqqqtxvqrtvutsssvwxxxwvwxxxwwz{{z|{{{|zz{zxy{~}}}}~€~}}}€���‚�‚���ƒ„„‚„„ƒƒƒ„………ˆ†…„†ˆ‹ˆ†…‡ŠŒŒŒŠŠ�‘–œ�¢£š�Œ�’’�����–––•”“—™™™œžŸ ¡¡ ¢¤§¨©¨¨ª®µÀÀÁÃÅÇËËËÇÇÊÌËÌÍÎÍÌËÇÁº¹¹»¹¹»¾ÀÃÅÉÇÅÁÃÈÎÏÐÐÎÏÏÒÑÎÍÏÏÎËËÉÉÈŸ²¯°«ª©©§©©§¦¦§¤¢¢¡¢£¢ žŸž�›œ›œ��šš˜˜˜šš˜˜–––•—š˜–“•••““’‘�’““’��’’””’����’’‘��Œ����ŽŽ��Ž�Ž���ŽŽŽŽ�Ž��ŽŒŠŒŽ��ŽŒŽŒŒ��ŒŒ��Š‹�Ž���ŒŒŒ��ŽŽŒˆ‰‰‹��‹ŠˆŠŠŠ‰‹‹‰‡‡‰‰ˆ‡ˆ‡‡…††‡††‡‡„„„‡‡‡ˆˆ‡ˆˆ‰‡……„…‡ˆˆˆ‡†ƒ……†ˆˆ„„‚ƒ„„‚ƒ2W}†„„ˆ‰ˆ€eTY\\Z\Z[]]]__^^^`_``a__^aa`_abbaaabcdb`bcddeeddeeeeeefeefhfeefgikigfikkkkkliikllnnmmmnnlmnpponmnpqponoorttqqqqqrsttuuuuuuuuvwwwwwwzzywwvxwyzzxzz{{||zz{~~}}~~~~}}}€‚��€€ƒ‚�ƒ„„‚ƒƒ……ƒƒ†…‡‰‰‰‰ˆ‰�›žŸ�—�‹Ž�Œ‹�ŽŽŽ‘‘�‘“’‘’•—™š˜˜œžž�Ÿ ¡¡¤¦¥§¬µ¶»¿ÁÁÃÄÃÁÄÆÉÈÈÊÌÌËǽ»¸··µ¶µ¸¼ÁÂÂÀÀ½ÁÅÊÊÊËËËÌËËÍÌËÉÉÇÉÇÄÁ½²ª¨«¨¦£££¤¤¥£¡Ÿ ŸžžŸŸ›™™›��›™˜›œš–—˜—“••“’‘“•“’‘‘’’‘�Ž���ŽŒ�Œ���‹‹‹�ŽŽŽ��ŒŒŽŽŒ��ŒŠ‹��Œ‹Š‹‹�ŽŽ‹Š‰‰‰‹‹‹‹ŠŠ‰‰ˆˆ‡‡†‰‰‰‡ˆˆ‰‰‰††ˆ‹‰‡‡ˆ‰‡‡‡‰ˆˆ………‡ˆ‡‚ƒ„†…‡††……†ˆ‡†††††…„„ƒ„„„ƒ………ƒƒ„†…„‚�€‚‚‚���‚‚‚„„ƒ‚���‚�€~€~~}€3Y~†ƒ†ŠŽŒƒhWZ]^^`__`babbbabbddcbccccbddeefedeggfdffhhhhgfffffhhhiiiiiiihhhkkkkmmnmmmonnoppnnpropopqtsttuttpqquuspqsvvuvvvwyxwtuy{xxvyzzy{||z{}~||{|}}~~~{{|}}€~{{��~~~€��„ƒ��‚ƒ‚„…†††…‡…„„††ˆˆˆ‰‰‡‰Œ�‹Œ‹‰Ž•�Ÿ¡¡�‘ŒŽ�’“‘‘�‘”–•••–˜›œ�œšœž £¤¢¤¤§©ª¨«®²¶»½ÁÅÅÅÇÈÇÆÆÉÊËÍÏÎÍÊÇÂÀ¿¿»»º»º½ÃÈÇÅÅÂÂÉÐÏÎÎÏÏÑÑÑÏÐÑÑÎÏÍËÈÆÁ»²¯¯¬ªª­­¨§§¦¥£££¦£ žžžŸ�ŸŸŸžž�ššœ žš—™˜šš—”“”–•••–••““”•“’’“‘���Ž��’‘�����’’‘���Œ�’’‘���ŽŽ‘“��Ž�Ž‘�����Ž‹‹Œ�ŒŒ����‘�Œ‹‰‰�ŽŽ��Ž�‹��Œ‹ŒŒŒŠ‰‰Š‰‰ŠŠˆ‡‡‰ŒŠŠˆŠˆ‰‰‰‰Š††…ˆˆˆ‰ˆ†‡‡ˆˆˆˆ†††††‡……„†††‡ˆ‡ˆˆ†‚‚„……††ƒ‚‚‚�„.S|ˆ„†‰ŽŒ‚fVY[]\YX[]_\]]^^___``^_^_`b``bbbbbabbddcbbbffdacdedeeffffeghifgghihghikjjjlkklmllmnlkmmmnomnoooooqqqooorrpqrrqqqsrtuttutttutvwxwwvwvwwwxyyyyyzxxxxy~}|zyy|}}{{{~~~}||~€�€‚‚‚�ƒ‚‚‚ƒƒ„††„……„†‰Š‰‰�™ž£¥ž�ˆ��ŽŒŒ�Ž��“““’’“•—˜ššš˜˜œ  £¤££¥¦¨©­±µ·¼ÂÅÄÅÅÄÄÆÆÅÅÅÈÊÉÈÆ¿¼¹º··¶¸¶º¿Ä¿¾½ÁÆÈÊËËËÊËÍÏÍÎÍÍËËÈÇÄÆÂ¹±¯°­ª§¥¦¥£¦¤¡žŸ ¡ ¡Ÿœš››ž›™š›››˜–—˜–“•–•“••“‘‘‘“”“�‘�����‘�‘‘�‘’‘�’���ŒŒ��Ž�‘Ž�‹ŠŠŒ��ŒŒ‹ŒŒŒ‹Š‰ˆ‰ŒŽ‹ŠŠŒŒŒŠ‹Š‰‰Œ‹Šˆ‰‰‡‡‰Šˆˆˆ‰‰ŠŠŠ‡††‰‰ˆˆˆ……‡ˆˆ†ƒƒƒ„…†‡††…†‡‡†‡††„…„„„†‡†ƒ‚‚ƒ…ƒ€‚„„„‚��‚�‚‚‚�„„„‚‚€€€‚‚ƒ‚€}z}€.Tˆ„‡‹�Ž…i\]_]^_^]___`a````abb`bbcccceeedededeeeffggffhhhffgihihiijihhijlmmkmmmnnoppmmnpomlqqqppopprssppprsrrsuuttuuvuutuuwvwvxyzyxxyyz|zyyz||z{{}}|{~~~|~��}}~~}€�~‚ƒ‚‚ƒ„†ƒ‚‚ƒƒ†……††‡ˆ‡…†‡††‰ŠŠŠŒ�•ž¢¤¤�‘Œ‘“’‘“��“““”–———˜˜™˜œžŸ�ž ¢£¦§©¨¨ª¯³¸»¾ÄÈÈÈËÊÊÊÌÊÊËÍÌÌÊÉÅÁ¾½¼¾¼º»»¿ÃÆÅÄÂÃÅËÎÏÎÏÏÐÏÑÑÑÏÐÑÏÑÐÍËÈÆÀ·³²²¯­¬°°¬§¦¥¤¦¦££¢¡ŸŸŸ¢¢ž�œ�œ›š��›šš———š™—•““–—˜•’’”–•”’’’––•••”“‘’’�Œ�‘‘�“‘����Œ������‘�ŽŽ‘�Œ‹��ŽŽ��ŽŽŽŒŒ��ŽŽ��ŽŒŒŒŒŠŠŠŒŒŒ‹Œ‹‹��ŒŒŒŒŒŒŠ‡‡ˆ‹‰Š‰‰‰‰‰ŠŠŠ‰ˆ†ˆŠ‹Šˆ†…„‡ˆ‡‡…†‡ˆ†…†‡†‡‡…ƒ…††„†††…………„‚‚‚…………ƒ€€~€�,Ny…‚„‡Šˆ�iXWZZ[]\Y[\]\\]^_`_]^__^__a```a`````babbbbddddddcccddddddfggfffhhihihijkhikklkihjklkknnjjkmmommmnopponnppooqqoopqsqqrtsrrtuuttuwvttvvvwwvuvwyy{||yz{{z||zz|~}zy{}~}}}�‚€€ƒ��~€ƒ‚‚ƒ‚‚„……ƒƒ…‡‡‰Š�–›Ÿ¢�ކŒ���ŽŒŽ����‘“””—˜šš›™š›�žŸ ¡Ÿ¢¤¦¦¬±´·¼ÁÅÅÅÅÇÈÆÄÅÈÅÅÅÈÉÈÄ¿»¹º»ºº¼¾¿ÁÂÂÂÀÁÂÈËÍÊÊÊÌÊÊÊÌÉÉÊÌÍËÉÈÅÁ¼µ¯­ªªª§¥¤§¦¥¢¡ŸŸž Ÿœ˜™šœœšš˜—–————–•——•“”––””“‘Ž’‘�’’‘������Ž���ŽŽŒ���ŠŠ‰ŠŠ���ŽŒŠ‰‹ŒŒŒŒŠŠŠŠŠŒŒŠˆ‰Š‹‰ŒŒŒ‹‹Š‰‰‹ŒŠ‡†ˆˆ‰‰‰‡ˆˆˆ‡‰‰‰ˆ‡……†ˆˆ‰ˆ‡‡‡‡††……ƒƒ…††…ƒ„†‡‡‡†„ƒ…†…ƒ„„„„‚‚€€€‚ƒƒ‚ƒ‚‚‚‚��‚‚‚ƒ�€€�€€€€‚�~~}}}}}{+Mz‡††‰ˆ†„n\]__]]]^_``_aaaabbb`aaccc`aaceecbceeeddefghihheeehhhhhghjlkkkjjjkjjmnmnnooonnmnmoonmoooopqqqooopprqqprttsvvurssuuuuvxxxzzwxxyxyxxz{z{|~}|yyz~~}{y|�€}}|~~~�ƒ��€€€‚ƒ…†‡…„ƒƒƒ„„„ƒ„ˆŠˆ††ˆˆˆ‰‹‹Œ“œ ¢¢Ÿ”Ž“•“‘”“““”•–•˜˜˜š››››žŸ¢¢ ¢¤¦¦§¨««°´º¾ÃÈËËËÍÍËÌÍÍÌÍÍÍÍÊÊÇÁ¾ÀÀÁ¿¿¿ÁÁÄÄÃÂÃÆÉÍÐÐÐÐÎÎÏÐÐÐÐÏÎÎÏÐÏÐÎÉÀº··±®¬ªªªª¨¦¥¤¦¦¤¦¥£¡¡ ¡¢ žŸ›››��ž�œš™—˜™˜—–••–——••”•’’’•”‘�”–”‘��’“‘‘���‘‘‘‘���ŽŽ��ŽŽŽ�Ž�Œ���ŽŽ���Ž’‘�ŽŽ�‹‹Ž�‹ŠŒŒŒ��‹‹Œ�ŒŒ�Œ‹‰ˆŠ�ŽŒ‰ŠŠ‹Š‹‰Š‹Šˆˆ‰‹Š‰ŠŠŠŠ‰ˆˆŠ‰ˆ‰ˆ†…††‡‡†ƒ„…‡‡ˆˆ†…††‡‡††„ƒƒ…………†„„„„„„„‚€€‚*Jx…ƒƒ‡‰ˆƒnYWWXZ\\ZZ\]]^^^^``_^^____^``a_`abaacca```bdddddddcceeefgfghhgeddgghjihijjhjijkigkmmjmmljlllmmmmmmpqpopoooqooorqpprrsttstuurqruyxxvvw{yxvvvxxzzyxxxyyzzxzzz}~|}|{z~€�}}‚‚��‚ƒƒƒ���„ƒƒ„†††††‚…‡ŠŠŠŽ—™ž ›�‰Ž‘‘ŽŽ�����’‘’’•—šš˜›ž››�¡¡Ÿ ¡¡¡§ªª®·½ÀÃÆÆÆÈÉÇÈÇÇÇÈÇÇÈÇÆÂ¼»º¸¹º¼»»½Á¾¾¾¾¿ÄÈÊÊÊÊËÌËËÌÍÍÌËÊÊÊÊÊÊÈ¿µ®±­«©¨§¦¤¥¥¤£¢  ¡¡ œššžžœ›š—™™š™—”“”˜–”““’’’’‘�‘’“‘��Ž�‘‘‘�Œ��ŽŽŒ��ŽŽŽŒ‹Œ��ŒŒŠ‰‹�ŒŒŠŠŠŒ��Œ�ŽŽ‹ŠŠŒŒŒŒŠŠŠŒ‰ˆˆŠ‰ˆ‡ˆˆ‰ˆˆˆ‰ˆˆˆ‰ŠŒ‰†‡‰‰ˆ‰‰‰††„……††ˆ…„…‡„„†…„„„„„……„…„‚�„„ƒƒ……„‚‚�‚��‚…ƒ��‚ƒƒ‚‚ƒ‚�€�‚‚€�€|}~~}~}})Kz‰…‡ŠŒ‰„p_[]_]]]^]]^_^_```ab`_bcddbbcdccdddeefffdggfehhgfghhhhhhikmkiikkkkkjkjjjkmonmmmooonnopmlmppppqqrqrrtttttssstuuuuxxxutuyyxvvvyz{xxy{{{{{|}{zz{}|{{|}~}}}~~���€€€€�ƒ€€‚‚‚‚„†……‰…��‡ˆ†„†‡‰‰‰‡‡‰ŒŒŒŒŒŽ“™ž¢£Ÿ’Ž‘•“’‘‘�’“—™™•—ššœŸž�œœ £¦§¦¥§¨©ª®±¶ºÃÈÉÈÉËÌÌÌÌËÌÍÍÌÌÊÈÆÆÀ½¼¾¾¾¾ÀÀÀÄÅÅÆÄÂÇÍÍÌÎÏÐÎÎÍÏÐÑÏÏÏÏÌÍËÊÆÁ¸µ´´²¯¬¬¬ªª¨©§¥¤¦¤¥¤¡žžžŸŸ ŸŸž›››œœ›šš—––™™˜–•“—˜—“”–”‘�‘““’“••”’��‘•’��’���’��Ž��‘Ž�Ž�����Ž��‘‘���Ž�‘��Ž�ŒŒŒŒ‹ŠŠŒŒ�ŽŽ�����Ž�Œ‰Š‹ŠŒŒŒŠŠŠ‹‹Œ‹‰‰ŠŠ‰Š‰‰ˆˆ‡‰†‡ˆˆ‡ˆ‡†…†††††‰‰†……†‡‡‡‡‡„…ˆ‰‡†„………„„ƒƒƒ……„ƒ‚‚‚�€€€€%Etƒ€„†ˆ‡ƒp]WXZ\\Z[Z\\\[\[]]^^]]^___bb`__aba_``aabbbacccacbbceeeeefhhggfgfffihffiiklljjjkklmmmmmmmmpommppnmnnppppopqooottqqqsrrrrqttuvvuvvwwvtuvwwwwxzzzyyx{zxwxx{zz{{{~}}{{}~~��€���ƒ„„‚ƒ�ƒ„†……†‰††‡ŠŠ‰‹�•››Œ‡ŠŽŽ����‘’’’•”“”•–—š›››œ� £¥¥£¢¦ª®®°²»ÁÅÄÅÆÈÈÈÇÇÈÈÈÈÉÈÈżº¸º¸¸¹½¾¿¿ÀÀÁÁÂÅÉÊÊÊÉÉÉÉÉÌËËÊÌËËÈÉÈÇÅ¿¸±®®¬««ª¨¨«©¦£¢Ÿ ¡£ Ÿ™—˜››œ›™˜›š˜—”’“–––––““’‘�‘’“’�ŒŒ���’‘�ŽŽŽŽ�Ž�ŒŽŽŽŒ��‹‹ŒŒ�ŽŽ‹Š‹��‹‹ŒŒŒ‹Š‹‹‹‹‰‡ŠŠ‹Š‹ŠŠ‡ˆ‡‡‡ˆˆ‡‡‡ˆŠŠŠˆˆ‰ˆ‰‰‰ˆˆ‡‡†ˆˆŠˆ‡†„„„††ƒƒ„„…†…ƒƒƒƒ‚‚„…ƒƒ‚„„…ƒ‚‚„‚‚ƒ„„ƒƒ‚„‚�‚ƒ�‚ƒƒ€�‚‚��€��ƒ‚€€€~~|x%Fx‡„‡Š�‹‡q_Z\]^^^^```aba``bcddbbbdefedceefeedggedeggffefgggghhiiggjjjllijjlmmmnnllkmmmmoppoooqppnoorrrqqprrrpqrtussstttuuruuvwywvwyxxyzzzzz|{yy{{{xzz|||||{||~}|||}~�€~€€€}~�‚��‚ƒ‚…‡‡„„…††††……‡ˆˆ†‡Š‹‹Šˆ„Š‘‘�–›“Ž‘���‘“‘‘•––—•••™�Ÿ��œŸ¡£¤§§§¥¨¬±²²³¹ÃÉÉÉÊÊÌÍÌÊÉÉÌËÌÉÉÊÊÄÀ½¾¾¾¾¿ÀÀÀÁÂÂÄÄÆÈÍÍÎÎÎÎÎÎÏÏÑÑÐÐÎÍÎÏÏËÇĽ¸µ¶²±¯®­¯­«§¥¤¥¦¦¥¥¤£¡¡¢ žŸž›œ››œœ™™™™˜˜–—––“’•˜–“���“’’”�‘’•“‘‘�‘““’��ŽŒŽ‘‘������ŽŒŠŽŽŽ��ŽŽ�ŽŽ�‹Š‹���Œ�Œ‰‹ŒŒŠ‹ŒŒŽŽ‹��ŒŠ‹‹�Ž�Œ�Œ‹‹‹Š‰‰‰‰‰Š‹‹‰‰‡ˆ‰‰‡‰††‡Š‰‡†‡‡ˆ‰‰ˆ†…†ˆˆˆ†‡†‡‡‡‡‡……„‡†‡††††„…‡‡…‚‚ƒ††…„ƒ€~}$Bt‡„„‡Šˆ„raXYZ\\[YZZ\^^[\^^``^^_bb___ba`_bbcaaabcccbbccccceeedddddfghgfefeghhghhhijjihillkkllkjlllmnllnpmkkmpqpnnorponoqsrrqrrtttrrsvvttuwxwvwwxxwwxwxxxwxwxxzz{zzz{||{{z{}}~~~‚‚‚‚‚�ƒƒƒƒƒƒ„‚€ƒ‡‡…††…ƒ……†…†‹‘‘��ŒŒ��Ž���’’‘‘’““•—˜šœ››�Ÿ ¥¦¨§££©¬¯²·½ÅÈÆÆÆÅÅÆÇÇÅÆÅÅÅÈÆÅÂÀ½»º¼¾¾½½¼½¾¾½½ÁÄÅÇÊÊÊÉËËËÉÉÉÊÉÊÊËÉÉÈÆÀ¶²±±¯®¬¬©§¥¨§¤ŸŸŸ¢ žž�›˜š›œž�š—•—™˜••””’““–•���‘”“�ŽŽ���ŽŽŽ������ŽŽŽŒŒ‹�ŒŒ‰‰‹ŒŒŒ‹‹‹‰ŠŠŠ‰ŠŠ‹ŠŠŠŠ‰Š‰Š‹‹ˆ‡†‰Š‡‡‰‰†„†‰ˆ‡‡ˆˆˆ†‡†‡†ˆˆˆˆˆˆˆ†……‡‡…„„‡†…„…ƒƒ„…ƒƒƒ„„„„„‚‚„…ƒ�ƒ…ƒ��„…ƒ„ƒ�ƒƒ……‚‚„‚�€}~�€~|||}z$At‡††ŠŒ�‡vb[\__]\]_a`^`````accbaa`bcdbabddcddcdddeeffgffhhfhgihhhiijjijiijjiiiklllmlmkkmppoonnoqqnpqsqrrppqtssruusqrstuvuutxxuuuwxxvwuwyyxyxxx{yz{{{|{{yz{{|}~}||}~€~~‚€€€�‚„………ƒƒ„††…………‡ˆ‰‡‡‡ŠŠˆ„‚…‹Œ�‘””’‘‘’’’’“•—––•–—ššššœžŸŸ ¢¤§¨¨§¨«¯°²¶¾ÄÇÆÉÊÊÈËÊÊËËÊËÈÉÊÊÈÆÃ¾½¾ÁÁÀ¾À¿ÀÁÁ¾ÂÃÇÉÌÍÏÌÌÌÎÏÐÐÎÌÌÐÌËÍÎÊÆÀ»··¶¶´³°­««ª¨§¤¡¢££¤¢Ÿ�žŸŸž��Ÿ�››��›™™˜—”•˜˜•““”•”–•‘�“‘‘‘’’‘�’‘‘��Ž�‘‘��������“‘���Ž�Ž�Œ�Ž��ŒŠ���Œ‹���Ž�‹‹‹Ž��Š‹‰ŒŽŽ�Œ‰‰‰‰‰‹‹ŠŠŠŒŒŒ‰ˆˆŠŠˆ‡‰ˆ††ˆŠ‰ˆ‰ˆ††ˆˆ†‡‡‡†‡†‡‡‡††††…††††ˆ†……„„†‡†……………‚ƒƒ„„ƒ‚ƒƒ„„ƒ€€€~!f€€ƒ„„�rZWYWYXXX[[[ZYX[[\[\Z[\][[\__\[\^^^\^_`^_^````_]_acbaabcaaabbcceefedcedfffghgiffefghhhijkjjkkhhhihjjjkkjmoollmmjehllmoonmopqoonoopnllmifb]Z[^afhib]bc`finrvuurqrwyxvzxvvz~{xwyz~xlfq|xuurqy†ƒzw{�ƒƒ†ˆˆ‡†††‡‰‹‰ŠŠŠŠ�Ž‘‘‘‘’‘‘’–—˜˜˜™™›ž£¦§§­¯´ºº¹½¾¿¿Á¿¾¾¿¾½½¾¿¾¾¾ÀÀ¿½»ººº½½½»¼¼½½¿ÀÁÁÂÃÂÁÁÃÂÁÁÁÁÃÃÃÁþ·³µ±®­ªªª«©¨¦¥££¢¢Ÿ�›ž��›œ›™—˜˜˜—••’’“‘������ŽŽŽŒŒŽ‹�‹ŒŽŽ‹‹‰Š‹‹‰ˆ‰‰ˆˆ‹Œ‹††‡ˆˆ‰‡…„‡ˆˆ…††……†……†…„‚ƒƒƒƒ„„…††……‚„„ƒƒ„…‚‚„†„„…ƒ�„…†…ƒ‚�€‚‚‚‚„ƒ‚‚…„�‚‚����€€����€��~~}}~~~~~~~}}zzz||}|||ލ¹½¹¸¸¸µ³±¯­!8b‚„„†ˆˆ„x]Y[\[YY\\]\]\\]__`^\^``_^_a```bba_bbba``aaeecaccccceffeeefefffhjjjghhhhiiiikjjkkjjllllmllmnmljlnponmnopooonnprooorqpoqqrqppqpqpomkhcabffedioohgcbelqtsqqw{{vqpv{}ztz}xuz|xy|}}xpswytsvxz…€wv}‚„„ˆŠŠˆŠŠŒŒ‹‹Œ‹ŒŽŽŽ‘””•—™™˜—™››šœ�ž ¥§©©«­²¶ºÀÄÁÂÃÅÃÁÁÄÄÃÅÂÄÃÃÃÅÄÄÁÂÂÀ½¾½¾¾¾¿ÀÁÀÁÂÅÆÆÆÈÈÈÄÅÅÆÆÈÈÈÇÇÇÈÇÇÇÇÇÇ¿¹·µ³°¯®¯®«¨¨§¨§¦£¡ŸŸŸ žœœž�œœšš™š™—””–—•“‘��“•–’���ŽŽ�’�����‘���Ž��Ž�Ž�ŽŒ‹‹Šˆˆ‹ŒŒ‹Šˆ‰ˆ‰‰ˆ†ˆˆˆ‡ˆˆˆ‡‰‰Š‰ˆ†‡‡ˆˆˆˆ……ˆŠˆˆ…ƒ‚†††„††‡†…ƒƒ„„ƒ………‡‡†„…………„‚‚‚‚‚„„‚�„††ƒ‚ƒ…ƒ‚‚‚‚‚„‚‚‚����ƒ€}~€€€€€‚‘«¼¿½½½»¶µ²±±!:e�€„††ƒu\XXXXXXZZZZ[ZZZ\]\ZZZ\][[]``^[\^^^__``__^^bb_\^aa``bba`ccbbdcccfddfgecceeggggggfiijkifhhiiljijjjkkjjlkiijkjjkmlmmmlkkmkkkmkigdcc`c_[ekkkmlidbejfhrqnppptyxwwprxywvwzuqtxxwy{yyupmtvslpwy~{trty‚���ƒ‡‰‡……ˆŠ‹‰‡‰ŒŽ���‘’•–––—˜›šœ›œž¤§ªª««°´¶»¾½¾¿¿½½¿À¿¼¿ÀÀ½½¼¾¾À¿¿¾¼¹¹·¸¹»¼»»¼¿ÁÃÀÁÂÄÄÃÀ¿¾ÀÁ¿¿ÃÅÄÂÂÂÄÁÁ¿¸´´±°®­¨¨¨§¤¤¤¢ŸŸŸ¢Ÿ™™œ���œ™••–—•““”“‘�‘�����Ž�‘Ž�‹‹‹‹Œ‹‹‹Œ‰Š‹ŒŒŒŠŠ‰‰‰‹‹Œ‡…†‡‡‰‰……‡‡‡‡…„„†…„ƒ……††…ƒƒ„„„………‚‚…ˆ‰†„‚ƒƒ„„„„„ƒ‚�‚‚ƒ‚„‚�‚‚€€‚„„‚€‚‚�}€€€‚}€�~€���~�€~}}}}}|~|{z||~~~|{ޤ¶¼»¼º¶±°®°¯5^ƒ…ƒ…ŠŠˆ{bX[[\Z[]_``\\]^^^^_`__^````bba_``bbcaaabbcedcbccedeeeeefffhfghkjjjjlmljhfhilljjkjjkkkkjkjkmnlklnopojiloonmmoqponoopomknlifca_[[bhjjlmi_`eournppqtupot{yvz|yuvwz|zvx{}ysqtu{~|uwyww{|rt~…„€~{y{{�„‚ƒ‡ˆ‰‰‹‹‹‹ŒŒŒ�‘���””“•••–››œ�ž��Ÿ£¥ª­®¯°³¸¾ÁÂÀÁÃÅÂÂÁÁÀÃÂÂÂÃÁÁÂÄÄÃÁÀ¾¼½¾¾¾¾¾¿¾ÁÃÆÈÉÆÆÅÅÃÃÃÄÄÆÆÅÆÆÇÇÈÆÆÇÆÃ»¹¹¹´±­¯®®¬¬©§¦¦¤¢¢¡ ŸŸžž�žžœš™———š™˜•”“••“’‘�’–”‘Ž���Ž�����Ž�Ž������ŽŽŽŒŒŒ‹‹‹Œ‰ˆ‡ˆ‡‰‰‰‰‹Š†„‡‡ˆŠŠ‰‰Š‹Š‰‰ˆ‡ˆ‰‰‰‰Šˆ†‡ˆ†‡…††††ˆˆ‡‡‡ˆ‡……„‚†††ˆ†‚�€„††ƒ‚‚ƒ„…„‚‚‚‚‚„„„‚ƒ��€‚‚‚��€�€��ƒ�~��}�ƒ‹ž¹ÃÁ½»·¶³²±µ 6a‚��††ƒt_WWUWWXWXYYYYYZZZ^]ZX\\\\]\^__]\\]]__^^]^_aa```_`_```_``ccdhlnooqsuvtpnljmkjijhgfikkkjgggjligjihhhhjjgffjkkijiijjffdc`b`]\`egkgbb`eppomlmrvsonnrtpmjmwxtttrnrtvvvuwuupkhmv{xogu~rkmtux~‚�yoryx{}}ƒƒ…‡‡„ƒƒ†Œ�ІˆŒ��ŽŽ�Ž’•™––˜›š›ž¢¦«¬«¬¯²¶¹½¾¼½½¾½½¼½¼¾¿¾¿¿¼½¾¿½½¾¿¿½»»»º¼º»»»¾ÂÁÁ¿À¿¿ÀÃÀÀÀÁÀÀÂÂÄÄÃÁÁÿ½·¶³±°°¬©¤¥¦¥£££¢ žŸŸ�ššš›š™—–•–”•••‘��‘’“���Œ���Ž��‹‰‰‰ŠŠŒŒŠ‰ŒŒŒŒ‹‰ˆˆŠŠŠŠ‡†††ˆŠ‡‡…„†ˆ†…„‡††††…„ƒ……„ƒ��‚…†…ƒ„„……‡‡†„„ƒƒ‚ƒ‚‚‚ƒ†„�€€�€��ƒ‚�€€~ƒ‚�€€€€~~~€~~~}}€��~||}~€~|}|{|{|{yzƒ”°º»¸¹µ°ª©«²0\ƒ†ƒ…‡ˆ†|dXX[^\[[[\\\\[]\]]_^`]\]``_^^_`a_`aa````_bcdcbbdddcdeeehiikosvxy{}€€~~ywwwsmijlmkllkklnllmmllllknmlkkkmmlkkijhfc`]ZUUbmppmfbeebhlpttrtsssvtqqvvrtttuxxvvrnruwuvy|vqtxopwxxvtmmpposwwz„„ƒ~zw{|{}‚„…‡ˆ‡…ˆŠŠŠŒŒŒŽ����““““–™š™š›�Ÿ£¦§«­®°³´º½ÀÀÀ¾¿¿ÃÂÀÀÂÄÃÁÁÂÁÀÀÀÀÀ¿À¾¿¿Â¿½¾À½½½ÁÃÄÄÅÅÃÂÂÃÃÅÈÅÃÆÅÅÄÇÆÆÅÅÄÆÂ½¸µ´²°­«ªª¨¤¢¤¤¥¥¤££  ŸŸ›œ����›™–––—–••””•”‘��“’“’�ŒŒŒ��ŽŽŽŒŒ�Ž�ŽŽŒŒ�ŽŽ�‹‹‹‹Š‹‰‰ŠŒŠ‰ˆˆˆ‰‰‰‰ˆ†‡Š‹‰‡ˆ‡ˆˆ‰ˆ‡…‡‡‡‡‰ˆ†……†‡‡†„ƒ�‚…………ˆˆˆ††……ƒƒƒ……„‚‚„†„‚‚‚ƒƒƒƒ‚�‚�‚‚‚ƒ„ƒƒ€�‚‚€‚�€€��‚~�€}~‚€€…•¬½¾½º¸¶³°²¶1^€€‚…†ƒxaWWVVVYYZYYZZYZY\^^[\\\\]]]]\^_^]^_``_^__``a`__`_a``___beiotwwxyyz€ƒ‚~}|{ztpkiiihhhihfhikkkijkkjkjjiiggeeb_\YXZZZ]\\_e[U]gjiilmoqqklpsonopnnpqqopruuussofepttnkq{zuuuoqwwuolkffnpqopx~{ysrvwtux|}}~‚„…„„ƒ…‡‰ˆˆ‰ŒŽ‘�ŽŽ��‘”•••——˜œžž¤¨«­¯¯´¸ºº¼¼½½½¼¼½½½¾À¾ºº¾¾¾¾¾¼¼»»»¼»»º»¹ºº¾ÀÀ¿¿¿¿¾¾¿ÀÂÂÂÁÃÄÄÁÃÃÃÁÂÁÃÁ½¶²³²®ª©¨¥¤£££Ÿž�   Ÿ�˜™››šš˜—••––“““’’��‘�ŒŽ��‹Ž�Ž��‹‹��ŠŠ‰ˆ‡‡‰‹‹‹Šˆ‰‡‡‡‡…‡……‡Šˆ‡†‡‡…††…„………‡†„†…„‚………ƒ„„…‚‚‚„„„„€€‚„„‚���‚‚ƒƒƒ��€�����€€‚€€€�‚ƒ‚}}€}}~�}~~~}}||}|||||{zz|zz{~||~Œ¥·ºº¸µ°®­¯²0Z€��…‰‰‡j\X[[\\\\]]][]^_____`a_]__`___aaba``cca`bbdcb`addddddeefinrx{|z}€ƒ‚ƒ…ˆ…ƒ‚‚‚�|uomlkmnmjlmmkmlmkkknonmljhd`ab_[]dfcb`\]inmkstsrolltwtpqssqrtqgkvuqpprv|}yqooqtsqlhs€�‚xopqqpkeinomqssuy{xwuvyywyx{�ƒ�‚ƒ…„‡‰ŠˆŠŒŽ�ŽŽ��’““’�““•—š›�žŸŸ¡¤©­±°µ»¿¿ÀÂÀÀÁÃÃÁÀÂÃÃÂÃÁÀÀÀÀÂÂÂÁÀ¾¿¿½¼¿¿¿¾ÀÄÅÆÆÇÅÉÉÉÇÇÅÇÄÃÃÃÄÆÇÈÇÇÈÈÅ¿»¸¶¶´²­¬«¬¦¤¥¥¢¡¢£¡Ÿ�� žœ›š™™™™——˜™˜™–••–”‘�“‘Ž�‘��ŽŽ�‘���Œ�Ž�‹����‹‹ŒŠŠŠŒŒŒ‹Œ�ŒŠŠŠ‹‹‡‡‰ŒŠˆ†‰‰Š‹Š‡‡ˆ‹‹‹‹‹Š‡„…ˆ†……‡‡‡††……„…†ˆ……††„„„„„†…„„„‚�ƒƒ…†…‚ƒ‚„……ƒ‚€��‚‚�‚……�‚„����ƒ‚€€€�ƒ‹¥»À½ºº¸´®°µ/Z~~}�ƒƒƒ{dWUWWWXYYZYYYYXXYY[[Z[\\\\]\\\]]]\\]\\^^^^_`a`__]``abb`cgmswwz|||~‚‚���‚‚€|wtphdgjmjgfghjjjhiiigiifaWUakopf\XZ^`_gklpssttrlggntpljilrrple[drqjfchu……zkchmlkhffknourjghkmkjhgjhbllhovwrmkkmllrw{}}~�€�„ƒƒ…Љ‡‡ˆ‰‰‰�ŽŒ��‘““”——™›��ž¡¦¨¬­²¸½¾¾½½¼¼¼»¼¾¾½¾À¾»¾¼¼¼½½¾¼½»ººº¸¸¸¸¸»¼¼¿ÀÁÁÂÄÆÄ¿¿¾ÀÀÀÂÂÁÃÂÃÄÁ¿¾¹·¶³¯ª§¨¨¦¦£¢¡ žž�žž�™—˜š™—“’”“••”’‘�‘‘‘�‘��‹ŒŒŒ‹�ŽŽŠ‰ŠŒŒ‰‰ˆŠŒŒ‹‹‹�‰‡††ˆ‰†…†ˆˆˆˆ†………ƒƒ„†„„‚ƒƒ………††ƒ††…„…†‡…‚€€€�ƒ‚��‚‚ƒ‚„„„‚�€€€~€‚‚‚�€~~~ƒ‚~|~~~�€~{|~{|~~}|zz{||{|}~}||€}|{~|||~~‚“­»¼¹µµµ³­««.W�‚‚ƒ‡‡‡}l\[^_]\Z[\]\\]\\\][[^a_^_a__ac`babaa````bccddabceeddfeegou|�~�†…„…†††‡†…„…‚yvnjjmllmkjkjkmmjhhjmkg`]drsibffbcdfloomqx}zuohdkvsomnrx{zvqhginlidadn{‚zjdhllnjghmqqnhbgnsnilrppnhkolhikjljdgowx}~�ƒƒƒ………†‰‹‹ŠŠŒŒŽŽ�’’’””—˜š—˜˜›¡¦§¨¬¯°±µ»¿ÀÀ¿¿¿ÂÁÀ¿ÃÂÃÂÂÁÁÀÀ¿ÀÃÄÁ¿½½¿½»»½½½½¿ÁÄÃÆÅÅÃÅÅÈÈÆÅÅÅÅÄÅÅÆÆÄÅÅÆÆÄ¾»¹º¶²¯­ª«ª©§©¥£¢¡¡¡¡ž��Ÿ�š˜™šœ™——˜•”••““••“‘‘‘‘’“’‘��Ž‘‘‘�‹‰Ž�Œ�‘�Œ‹Œ‹ŠˆˆŠ‰ˆ‰‹ŒŒŠ‹ˆ‡†‡ˆ‰‡‡…†…†ˆ‡†††……†ˆˆˆˆ†„†‡ˆ††‡ˆ‡‡‡‡„…††††…„…‡†ƒƒ„……†„„„„ƒ„‚‚‚„ƒ‚‚………„ƒ‚‚‚„„‚ƒ‚‚€�ƒ„��€�€�€�~�����‚„‹›´¿¿¼»¸¹·³®­+T~�„„„{k]^bf`YXY[[ZYYYYZ\[[[\[[\][\\]\\\^__]]]]^__`b`````bdebcfnw~~‚‚~‚…†……„ƒƒ�€~~ytjhhjkkihinqojgghhhhea\^emjechhdfhikggkt~�yqjcYbqojgjmt|�yk``bfa_`b`bkrndchjggec_ekmigeemqjjooc^_`bdfffglnmlqwyuy}~~}ƒ…ƒƒ…‡ˆˆ‡‡ˆ‹�ŽŒŒŽ‘‘•˜š›œœŸ¤¦§¬¬¯²´·¹º»»¸¹»¿¿¾¼½¼½¼»»¾¾¼»¼¼½¼º»¼¼¸·µ´¸»ºº¼ÀÁÁ¿¿¿ÂÂÁÁÂÂÀÀÁÁ¿¾¾ÁÂÁÁÂÁ¾·´²²®®¬ª§§¦¦£¢ŸŸŸŸ›™ššš™š™™˜—””•–“’��‘’�‘‘�ŽŒŒ�Ž��ŒŽŒ‹Š‹‹‹ˆ‰‰‰ˆ‰‰ŠŠ‡„†††‡ˆˆ‚‚„‰‹‰„„‚„„††…ƒ„„„††…„†‡……ƒ��„…ƒƒ‚„„„ƒ‚‚ƒ‚‚‚„ƒ…‚€€����€�€�‚~|�~‚~€~}~||‚~}}{}}}|{}||||||{zzz{}„‘£´ºº¶´±²®­­­+V‚‚ƒ†‰‡ƒ{plsunbZ[]_]\Z[[^_]\]]__``__^_````_baaababbcccbbcdehiiikqz�ƒƒ„ƒ�ƒ†ˆ‡‡‡‰ˆ‡‡‡……ƒ€wmhjjjkmptzxtokhhhjhfbdddjuytliiilnjjmp}‰Ž…xnhddfgeeggiptpllaajigff__ejieafhfa__`flnlormlmkgdb]\^dfdbhikoopuvxxz„………„…†‰ŠŽŽ��‘�‘���’’”••–™™›ž Ÿž ¥¦§«®±³º½¿½ÀÀ¾½¿ÁÂÂÂÀÂÂÂÁÁÁÁÀÁÂÁÁÁÁ¿¿¿¾º¼¾¿¿À¿ÁÄÄÄÄÄÃÃÃÄÆÆÄÃÁÄÆÄÂÅÅÅÅÅÅÆÄ»´´´²¯¬«¬ª¨¦¨¥£¢¢ Ÿ���ŸŸŸœ›››œž›–””•••””““‘‘‘‘Ž��‘�Ž�������ŒŽ��‹Œ�Ž��ŒŒŒ‹‰ŠŠ‹‹‰‰ŠŠˆˆ‰‰ˆˆˆˆ†††ˆˆ‰ŠŒ‰‡„„†ˆ†…„‡‡†…‡†„„…†††‡‡‡ˆ††……„„„…ƒƒ�‚ƒ…„���‚ƒ…„‚ƒƒ~€„„„€�‚�€€‚~‚�€‚‚~~€‚ƒ‚�~}}�‚‚†•¥²¹»¼¼¹¸¶´²²¯*W~~}‚…†…~xx|{rfZZZZXXXZXZZ[[[[[]^]\[\]__^^]___^_^_]]]```_aelqpnptz~~‚ƒƒƒ†……„„„†††ƒ€}{ujdfhiiksxzxtlfefeeca`dacu„�tkd_^ekfddhmqvuqkgaca\_dbY]ghhgc]_dded]VY_bceehe]XZ]_chgeea[[_^[WWYVVafd`ejmjjlswwvzƒ…………†‡‰ŠŠŠŒŒŒŠŠŒŒŒ�‘‘‘““•–••˜™š��ž¡¢¡¦­¶¸¸·»¼¼»»»½¼º¹»¾¾¼»»º¼¼»»¼¼¼¹¹¹¹¹ºº»¹¹º½½¾¾½½¿¿½¾ÀÀ¿À¿ÂÂÂÂÂÀÂÂÃÀÀ¿½·´°®®­«¨¦¢ ¡¤¢ Ÿ �œœœ˜—˜šššš—•••“‘���’‘��‘�Ž�ŽŠŠŠŒ�ŽŒŒŒŒŠŠŠŠ‰‰Š‹‹Š‰‡†…‡†††ˆ†…ƒ„„„ƒ‚„†„„„„„‚‚ƒ‡‡‡„…„„„„„„ƒƒ‚‚�€ƒ…„ƒ€€‚‚‚‚����€€‚€€€€}~~€€~~~}~�||}}~}|||{|||}}|}}}}}}}~~~|||~~‚Œ ±¹····¶µ³¯­¬«*V€�ƒ„‡‡‡„‚‚€{n^[]]^]]]^^__^^^^_a__^```acba_``a_`bddddccchovyyy}~~}�„„‚ƒ‚…‡‡………‡‡‡ˆ†ƒ�~wnlmiknu~ƒ�|ywrkfdceececcs�ƒzmcaabda^`fcejppnhace`__Z[]a_ega[_inlhb]Y]bcba`^]_bbaehikgcaba`]\\_]_flkijlpuvx{yvv|�†‡‡†‡ŠŠ‰ŒŒ��‘�ŒŒ�‘��“••——˜˜˜šžŸ¡ ¢¥¨¨¨«³¹½¼»½¿Á¿¿ÁÂÁÁ¿À¿À¾¿¾À¿¾¾ÀÀ¿¿À¿¼»¼¼»½½½¿ÂÃÂÂÂÂÅÃÃÃÅÅÅÄÄÄÅÄÆÈÈÇÆÄÄÆÈž¸´´²°«ª©©©©¤¥£¤¤¥¤ žžžžžžœœ›™˜——”••••”““”•‘��’’���‘‘ŽŽ��ŒŠ‹ŒŽŽŽŽ�‹‹‹ŒŒ‹‹‹‹‰‰ˆˆˆ‡†‡‡‡‡ŠŠŠˆˆˆˆ‡‰ˆˆ‡‡………‡ˆ‰ˆ…„…†„„††…†…†……………†…†ˆ†‚‚ƒ„„ƒƒƒ„„„�€€„„„‚„„ƒ�‚�‚„ƒ�€�…�€~�ƒ��‚��€~�€~€‚‚†•ª¶»¿¾»»»¹´³²²¯-Y{|�‚ƒ…‡…‚�ƒyl_YY[\ZZ[ZY[]]ZZ[[\]\[\\]^_^^^__^^``^_`deginswwxx{~}€‚€}€‚‚‚‚‚„……„‚€}{urliglsz|zxyume_WXacee[VZdmmgedba\]```bbbaacb^___\WSRYXZac`\UX][[YSTRRUXZZYbicccehnqoiilpnjddba`djmmmlkmruuvutv|~‚ƒƒƒ‡‰Œ‹‰‡ŠŒ���ŒŒ���‘•””••–šš›� Ÿ¡¡¤¨®´¸¹º¸¹»ººº»º»ººº»»½¼¼½¾»»»¼¼¼½¼¹¶¶·¸¹ºº»¾À¾¾¿À¾½½¿¾À¿ÀÁÂÀÀÁÁÀÀÀÂÂÁÀº³­®®¬ª©§¤¡¢¢£¡ŸŸœœœœ›š˜–•——–’‘‘••“����Ž�Ž‹‰ŒŽŽŽŽ‹ˆ‰ŠŠˆˆˆ‰ŠŠ‰ŠˆˆˆŠ‰ˆ„„„†‡†„ƒ„……‚‚‚ƒƒ……‡„ƒ‚„ƒ„„…„…„„ƒ‚�ƒ‚ƒ„…„‚��‚‚„‚�€€€����~~ƒ‚��~}~‚�€~~�€~}�}}|}€}}}||}}}}}||z{z{{}~~}}€Ž ¬µººº»º¶³±°¯®ª*U~‚ƒ…†‰‰ˆ…„„„sc^]]]]_`cfiifc`_``aaba`_`aabbacedbbcdimpquz~}~}���ƒ‚ƒ„„„…‡‡‡„…‡ˆˆˆ†…„„‚€zxsmlryymehhgc\XZ_`bf^XZcif[`efeb][`gfc]Y]dgdcbcd`YWSTWYSQTWX[ZZZ^eihdccdegffcddksvqkhkjjieeghghmrtttvvuwywvw{{xqorvx~ƒ†……†‡ŠŠ‹Œ�‘”’“”˜———™™šœŸ¡££¥§§¨¬³·»½¾¾¿¿À¿¿¿Á¾¿ÁÁ½¿¾¿¾¾¿ÀÁÀÁÁÀ¾¾»½½½½¾¼¾ÀÄÂÄÄÃÁÁÁÃÃÂÃÄÂÁÄÄÅÅÇÅÄÄÆÇǾ¸´²±®®­¬©§¦¥£¡£¥£  ŸŸžžšš˜š™™™™˜˜–”““““’’’�“‘��’��ŽŒ‹‹‹Ž�Ž�ŒŠŒŽŽŽ�ŒŠ‹Œ�‰ˆˆŠ‰Š‹Œˆ††ˆŠ‰†‡ˆˆ‡ˆˆ‡ˆ‡‡‡‰ˆ†…†ƒƒ……„‡†„ƒ„„„„†…„„„„„…………†……„„‚�€��ƒƒ…„ƒ‚‚„„‚�����‚�~�‚�ƒ‚‚€€€‚‚ƒ��€�€~~€��†—¯³¸½¾»º¸¸·¹¶´²±-[�„„………€�‚|tib``_\\ajnmklh`[\[]]][\\^^_`abhmkhdbgoquwz{~~}yy{~~€�������‚‚‚‚‚‚‚~~~�~wnkmtxqRL\bb_\[^\\ZXRRX__ZZ`eea```[]`^ZXZYVUXTSTUSTW\]ZVY_a^]`d`\_gle^YYWXVTYfnpi]VWXX\adhlhcfiimqqnopsnnqurwzsnpqrsw}�‚‚€~€‚‡Œ�‹‹�“‘‘—›—‘‘”•˜�¢¥ªª¥£¦¯µ»¹·¸»»»»»¹»»»»»»½»ºº¹¹ºº½½»¼º¸·¶´··¸¸º»»»¿ÀÀ¿À¾¾¿À¿½½ÀÀ¾¿ÀÅÁ¿ÀÂÀ¿¾¹´±­«©ªª©§¥££   ��œž�œ˜–•–—™–”””’’’“’’‘��‹Œ�Ž��ŒŒŒŽ‹‰‰‹‹ŠŠŠ‰‰‡††‡‰‰ˆˆ‡‡ˆ†††‡†……†……ƒ‚�‚‚„ƒ‚‚‚ƒƒƒƒ‚‚‚„…ƒ‚€��~€‚ƒ�ƒ…„€€�����€~~��€€€}~~~��€€€€€~}|~~~~~~|}‚}{}}|z|}~|z{}}||~}{|ƒ—®´¸¸ººº¶µ³´´²®«-\�‚„ˆŠŠˆˆ††ˆˆƒzmigggffkosuuqmjigb``bbbbccehjovxzwphnw||~�ƒ……‚„…„„„……†……‚…††ƒ‚‚……†‡…‚‚ƒ……€|xuuwxtVThgYUV[aijf_]XVW[^^``_]]][YXX[WQORT[gh`\_ejjhfdba`gga[]_^YZZ[^a_[\`_fpuo]SW_bbejjkkkiiecekptrqpqqsxxy~€~}}{|ƒƒ…‡‡„‡Š�Ž‘‘‘‘••’�’–—–—™™œ §«°°­¨¬´º¾¿¾¾¾ÀÀ¿ÀÂÀ¿¿¾ÀÁÂÁÀ¾½½À¿¿¿ÂÀ¿½¼º¹¹»½½¾ÂÅÅÅÅÄÄÄÄÅÃÃÃÅÂÂÂÄÃÅÄÄÃÄÅÆÆÄ¾¸µ²²°°¯¬§¨¦¦£¤£¡¢£Ÿ   ž�›šššššš—•’”—˜“��’‘“’“’‘ŽŽ‘‘�Œ��Ž���Ž�ЉŒŒ‹‰ˆŠŒŒŠ‰‰‰‰ˆˆ‰‰ˆˆˆ‡………„†………„…ˆˆ‡…‡‡……‰ˆ†ˆ‡…„…††…„ƒ…ƒ…†…„„‚„„‡…ƒ��ƒ„‚�‚ƒ„ƒƒƒ„‚‚„„‚‚€€�€€€€€~€ƒ�€�‚�€�€€�~~~~€~~„ˆ—¯»¿¿½¼»»»¹¶´³°­+Z{}}~‚„…†ˆ…ƒ‚‚wiigiiklpprrstsomhccefc`_``dkqtwwwupjqvvw|€€€�‚�~~€€~€~€‚‚~}�ƒ€|xtqtwoTWjgPEKSY^]][VRQOMLMPOQW\[VSX_eaYRTX`giec``_`]XTWVRPOOMQUZ[bhhedbdb``foulWSckiihhefgie_^befhmpnlrrooqx|ywy{~ƒ…†‡‡„……†‰ŒŠ‹‹ŒŽ’”’‘–žŸœ—˜›Ÿ£­¬§§«°¸º¼¼¼»»º»¹º¼¼º¹º»»ººº»ººº¼»¼»»¹·¶µµ¸¹¸¸¼½½¾¾¾¾¿¾¾¿¿¾Á¾¾ÀÁ¾¿¾¾½¾½¾¾¾¼·³±±®­©§¤¢ŸŸž¡Ÿ�›��œš˜–—–•–˜˜–”’’‘�Ž���‘‘�ŒŽ�Ž‹Š‹ŠŠŠ‹‹‹Œ�‹‰‰‰ˆ‡Š‹Š†………„…‡‰……ƒ„„††„„„‚‚ƒƒƒ�‚‚ƒƒ…ƒ‚€ƒ�‚‚ƒƒ„…‚€€�€‚‚€‚��€~~~~€}|€€}~~~}}{}{|}~~}|~||}{|}}|}zzzz|~}€ˆš®º»¹¹º¹¶´²²°¯¬©+Y|€��„‡‡‰‰ˆ†„�yrmjjottruvuuuxvtrqmorqheeiov{{zzxxwtx|}}�ƒƒ……††††„�‚……‚‚�ƒ„ƒ��‚„††ƒ€�‚…„‚}|{{xxkONcaQIKKKPMKKNOTZ[WVV]ehd\VZ^ab_VPTVW]\UTWWSWY]ab_^`efdadda`aa^\[\XVX_lxn[Wfmkfehljjllhfimpruvtqrpnry|}|~��ƒ‡Ž��‡‡ŠŽŽŽ�ŽŒ��‘’•™™�£¦¤¤¢¢¢§¬¬¨©®µ»¼¼¿ÁÁ¾¼¼¿ÁÁÀ¿¾½À¾¿¿À¿¾ÀÁ¾¾¿¿¾¾½¼»»½¼¼ÀÂÀÃÅÄÁÂÂÂÂÄÃÃÂÃÂÁÁÂÄÂÁÂÅÃÂÄÄÀ»³³³´±®«ªª©¦¦¥¤¡¡¡ Ÿ�œž�™™—™™™—•’“”•’“••“‘‘“’�‘ŽŒŽ���‹�Ž�ŽŒ‹��ŽŽŒŠ‰ˆ‹Œ‰ˆˆŠ‰‰‰‰ˆˆ††…‡‡‡……‡‰ˆ†………‡‡‡†…„„‡‡†ƒ„„„ƒƒƒ………„…………‚‚„„‚‚…„€�ƒ„‚‚€€�…„„���‚‚ƒƒ����‚����€€��€}}€‚}�}~ƒ�Ÿ²½¾¾¾¿½¼¹·µµ³²±*X{~€‚�ƒ…„ƒƒ�ytmkijjlnpqqtuuuutspqqqqrpnmpsvwyzyxvtuxzz}~}~‚„‚‚���ƒ€~||}}}€�€‚�}��}zqieg`PJPPSUUV[`YROPQVZXQQWZX[YUPTTQMNNNOPTZZZ_`]^dfb]^\[[ZWVWZYWVXYZYVTRSWZcmhZVdlj`[]a_bfjkiiostttutropu{|||~}}~€‚………ˆˆ†ˆŠ‹ŒŒŒŒŽ��“˜™›ŸŸžŸ¡£¤ª©¦¤¥ª²ºº¹¹º¹·¶¹¹¹»»¹ººº¸¸¸¹·º»»»¼¼¼½¼º¸¸¸¶µ·»¼»»¾Á¾¼º½½½¾À¿½»½½½½½½¿Á¾½¾¾ºµ¯®®®«§¤¤££¢£¢ ž›™šœ™—–˜–”•—••”“���”‘‘’’�ŽŒŒŒŒ‹Š‡‡Œ�ŒŠŠˆ‰‡ˆ‰‹ˆˆˆˆ†‡‡‡††„„……„ƒ„ƒƒ‚€€ƒƒ‚‚„‚�€�‚‚‚ƒ„„‚�€€�����‚€~~€‚}|€€~}€�}}�‚~~~€€€~~�~}|~|}{|~€}z{{{|~|~€€~~|~~|{}}{z{|}}}�‹�®³·¹¸¸·¶³±­­­­«*W|‚ƒ††‰‰†ƒ€|wrpollmppqtxyzzzxvuuuwxxxy{{zz{{{yz}{x|�€��„„ƒƒƒ„††‡‡……�€�‚�‚�‚��„…ƒ…„……†„�}uecda\XWTW]a_]\[XVNGGPQPQTQNORRQWYYY]ZTOV`fb__`][\]Z[YYXYXVUZ_][^_Z[ZZ[]_bfjkk_[iujZ_ikdcefhkovxwvxy|~{vy~z|}�„„„†‹‹ŠŠŠ‰‹Ž����’“’�“”–—™›œž¥©ªª«­¬ª­µ¹¾¾¼¼¾¾¾¾¾¾¾½¾½¼»¼¼¼¼¼¾¾¾¿ÁÀÀÀ¿½¼¼¼»»º¾ÁÁ¿ÃÁÁÁÂÂÀÀÀÂÁÁÁÄÄÄÃÃÁÃÂÅÂÀÀÀº´°±°¯«¨©¦¤¤§¤ œœ�Ÿ››œœ™ššš˜˜——•”‘’”””“‘‘‘�‘�Ž�Ž��ŽŽ‹ŒŒ��‹‹ŒŒ�ŽŽŒ‹‰‡ŠŠŠŠ‹ŠŠ‡……‰‡……ˆˆˆ…ƒ„„„„…„…†††‰ˆ†ƒƒƒ††‡‡†…„ƒ„ƒ„„„ƒ„„‚‚ƒƒ‚��„ƒ€}ƒ…ƒ€‚ƒƒ��ƒƒ‚�‚„ƒ���‚‚‚��ƒ€�~~~€€€~}}}„‘¢´¸»»»ºº·¶´´²¯­­+Vz~€€‚ƒ†…‚}ytolhijloprruwxwwvvsssvvvwww||zwuwxyyzzz|~}~}€�€��„„‚€€€|y{|€~{{~€€€‚……††…ƒ€{xtuuo^NHM]cUNNJJLQPPPSQRW[YXZZXYYXUSSRSVXXXVTRVXXTQQWVSSVXWW\dgedfimkggloomjhj^^qq`]jqg\_gkommtutrvvuttomqy{yw{€…‚�…‡†……†‡ˆŒŒ��‘Ž�Ž���“•–˜™�Ÿ¢¥§§¦¤§¯¶¸·¸º¹·¸¸ºº»»»¸¸¶¹»»¹¸¸º»¼»¸ºº»»¹·¸¸¹¸¼½¿½¾¾½¼º»½½½¾¿¿¾½¿À¿¿¿À½¼½À½¹³²¯®ª¨¦§¦¤¡žžŸ¡Ÿœ˜—™š˜™–•”•””’�Ž��’‘��ŽŽŽŒ‰‹‹‹ŠŒ‹‰‡‰‰‡ŠŠ‡‡†Š‹‹ŠŠ‰ˆ‡‡ˆˆˆ‡ˆˆˆ†…ƒƒ�‚ƒ„„„„ƒ‚�~~~€����‚‚‚‚‚€€‚‚���‚�€€‚�~}€~|{~~~~€€~}~‚€~}}~~|zz}€€}|{~}{|}{{z|}}}~|zy||zz{{z}}…“¤³µ··¸¸¶³³³´±®ª¤*W{€ƒ�„‡‡‡…‚€{uppmmmpsxxuuxzzzzxxxxyyz|~~€}|||~~€€ƒ…„…†††…„„„„‡‡‡„ƒ€}}€ƒ€€€‚�‚…ˆ‰��Šˆ…„‚‚~}{lWIP_jd]Y[_bcca_\XXWVSSSOKLMNLNNQSWXWVWZ\XY\[Z\acfhggjmnnrqqppopprrrqqked\[hrngipl\bprvvxyyvvvvpkcahrz~}z}ƒ‡……‡‰‡‡‰ŒŒŒŒŽŽ�‘’’““‘“–™˜™œŸ£©ªª§§¥©¯·¹ºº½¾½»¼½½¾¾¼»½½¼º¼½½º»¾ÀÀ¿¿¿¾¾»»¼¼¼¾¾¿¿¿¿¿ÀÀ¿¿ÀÀÁÀÀÀÀ¾ÁÁÁÁÂÃÂÀÂÄ¿¼·¶²°®­­ª©¦¦¥¥£¡ Ÿ�žžœœ››œ›˜˜˜—•”’“”•““‘‘‘‘’“‘���Ž��ŒŒ‹ŒŽ�Œ‰Š�ŒŒŒ�ŒŠ‰Œ�ŒŠ‹‰ˆ‡ˆ†„„…‡‡‡‡†…††…‚„„…„„„‡…ƒƒ……†‰‡„‚�‚……ƒ€��ƒƒƒ��‚�€‚‚‚�‚ƒ………„‚��ƒ‚�€€€€€€‚��~€�‚€}~€€~~��€�}}}~�†Žš­»»º»»½¼·µ³´²°«§(Qt|€�ƒ……ƒ~ytqnnmllopqprqsvwutvtrtvxxxyz||}{zyyxzyz}��}}‚‚�€€���€�}{|z|}~~}~~�ƒ…†‰‰†„‚ƒ�|zzzxrh]YY_a\ROOOLFDFFIIHKMMKJJMQOJLOTVUW]]^_dfhhhikjjjllmmlnnoooooqrooprpog``[Y_ghfhmld`htxsoovvnlmligimuxxvw{€………‚‚‚„‡Š‰ˆˆŠŠŽ����Ž���”•–—› §ª©¥£¢¦­µ·¸¶µµ¸¹¹¹º¸¸¸º¹···¹¹¸¶¶¹º¸ºº»¸¹·¸¸·¶·»¼¼½¼½½¼¼»¼¾¾½¾½½½¾¿Á¿¾½À¿¾½¿¼·²°®«©§§¥¥¢¡ž ŸŸœš˜˜˜˜˜š—••–——”���’“‘��‘�ŒŒŒŒŠ‹‹‹‰‰‰‰ˆˆŠŠ‡†‡‰ˆ††…ˆˆˆ†††ˆ††…†„‚�‚‚‚‚��‚„„�‚‚€€€€‚‚‚€€�‚‚‚�€€€~~}�}||~~€€€~~||~}}|{|{{}}~}|~||z{{|}}{z{||{{{{yzzzyyyy{„�šªµ¶´¶µ³²²°®®¬ª¤ (Rv�‚„‰Š‰†‚}zttrsqppstuwuvyzyxxxxyyz{}~��€€‚ƒ�}}~‚‚��‚ƒ�‚„‡††……‚‚‚……„€~�‚��‚ƒ��„ˆŠ‹ŠŠ‹‹‰Šˆ†„„�ziXQONSYUMFEEGGHHIMRQNPOMPVXVW]c`^bhiijjjjjjmppmnnqpppqpsrqpssqpqssstvspg`bbahkhdikjhgis|{uu{}vrrspooovyyzy{…ˆ‡…†‡‰Š‹‹‹‹Ž’��’••”””“–™œš›Ÿ¥«°­¨¤§ª°¸¾¼º¼½½»½¾¾ÀÀ½¾½¾¼¾¾½¼¼½¾¾¿¿À¿½»»»»»»½½½¾Âÿ¿¿ÁÀÁÁÂÂÀ¿¿¿ÂÄÁÂÂÂÃÄÃÃÀ½¹·´°¯®««§¥¤¥¤¡ ¢¡�›š››�›š™˜”•”••–•”‘’”•“‘�����Ž���Ž�Œ‹ŠŒŒŒŒŒŠ‹ŒŽ�‹‡‡‰‰ˆˆ‰‰‡†‡††‡‡„…‡‰†„‚ƒƒ…††ƒ‚„‡†††…„‚„…†††ƒƒ‚ƒ‚�€„„„ƒ„‚��‚‚�€€�‚‚�ƒ�~€�€‚�€‚���‚€~€�~~‚~~�€€€�|~}~}~€…��®»½º¸·¹¹¹·¶²¯ª§£&Nq}€��„……ƒvppqppooorrsttttuuuuuuvvxz}{{}��|||}€��€~�ƒ€�‚€€~~|~|zzz}}{}�ƒ„†ˆ‰ˆˆˆˆ‡„�€}t]H?FIPUSMJJKOQSUZ^da\\^`aacceefffgjjjjhhiklmmmllllmponmooppppprrqpoppnld^`bekga]b`_beeitsmuywqomknoopuxzzyz‚„…„ƒ‚…‡‡‡ˆ†ˆŒ��ŽŽ����‘“–™™š›¡¨¬©¥¢¤¥«±³±³·¸·¸¸¹»»º¹¹¹º¹¸¸»»º¹¸··¸»º¶´µµ´´µ¸º»»¼¼¼»¼ºº¹¼»»»ºº¾½½½¾À¾»»¾¾¼¼¼¸³®¬©©¨§£ žžŸŸœœœš˜—˜˜—–••’‘’’“‘ŽŒŽ��ŒŒŠ‹‹‹‰‰ŠŠ‰Š‰††‡ˆ‡‡„…†ˆˆˆˆ†………‡†…ƒ‚ƒ…ƒ‚ƒ��‚„…„���ƒ€~��€‚€€‚‚����~~‚€~}~}}~~}~}}~}|~}{z|}}|{z|z{yz|~|}}}{yy{{{|{{{{{}}}||yyxz{||||{‹™¡«¶·´µ·¶²²²²¬©£ ž'Ks�ƒ‡‡‰ˆ†ƒ}vssrrrrtxxxxxxz||{{yy{{|~€‚‚‚€�ƒ‚‚‚…††‚�‚†………†…„�‚�~~~‚�}~€‚€�‚„…‹��Œ�Ž��ŒŠ‰‰‡~jTMQX^`djpporx}~~{umifiiijkkklmmnpnnnopqoppqqqrttttsqqsttsuvwuusrtvuuqh`jhdkmheecbfnpmrokx{upoprrrpsx}~}{…‡…„†‡ŠŒŒ‹‹‹‘““��‘–•”••–žž�›œ¤­°°«¦§©®´¶µ¸º¼¼¼»¼¼¾¼½½¾½½»»¼¼¾¾½½¼ºº»¾»º¶¶·»¼½½¿ÀÁÀÀ¿¾½¿¿¿ÂÂÀÀÁÁÁÀ¿¿ÁÄÁ¾ºµ³¯­¬¬ª§¤¤¥£¡ Ÿ��ž�››˜˜™š˜–•——–”“”•”‘‘�����Ž����Š‹Œ�Œ‹‹‰‰‹‹Š‰ŠŠŠŠ‹Šˆˆ†…„‡†††‡…„„‡ˆ‡„ƒ„†„„††††…‚ƒ…‡„………ƒ……†„„‚ƒ„‚�„†„ƒƒ‚‚�‚‚„‚€€��„„ƒ���€€€�€~~��‚�}}~~ƒ€}z}€||||}~~~}}€…�¢¬³¼»»»»ºº·¹µ²®©£Ÿ$Fm}‚ƒ…ƒƒ~|wropppprttstsswwwxzwvuwx{{}~€€~�‚€�‚€ƒ€€~{|{{z{|}}}|}|{|}}}~�ƒ†ˆŠŠ‹‰ŠŠŒŠ‡…‚}wtwy|€‚€�‚ƒ‚„†…„„�ylffiiihjkkijhhkmnlllmmooppoooopppponoqssrqqsssrqqssojkd`cf`[afcakrjjhhpusojmtrnnvvvz{{�„ƒ„„…†……‡ˆ†ˆŒ�ŽŽ�”�Œ�’’—˜—–šŸ¦ªª¥  ¥«¯²±±³¶·¸¹»¹ººº¹¹¹º¸¸¸º¹¸¸¸¸·µ²³³´³²³··¹¹»¼½º¸¸º¹¸º¼½»¸¹¾¾½»¼¾¾¼¾»º¹¹·´®¬¬¬¨¦¥¢ ž›š���š˜˜˜–™•’‘’““““’‘Ž�’’‘�ŒŠŠŠ‰ˆ‰ŠŒŒŠ‰‰‰Šˆˆ†…‚„†ˆ‡‡‡‡…‡ˆ†‚ƒ„‚‚‚ƒ€��€�†ƒ������‚‚‚‚€€�€€€�€€€���}~}��~~~€}{|}}~~}|}{{{||}|{yz{zz|}||}~{z{}zzz}{{z}yvvyzz{zyyy�“¦¯²¶µµµ¶µ´²±¯­ª¨£ž$El��ƒ…‰ˆ†ƒ€|urtruuwwxxxvwyz{|{yy{}~€€€€‚ˆ‰‰ˆ‰‰Š‹‡„ƒ…‡…‚‚ƒ‚€}}�ƒƒ�‚ƒƒ€€�………„‡‹����Ž‘‘��‹Š‰ˆˆ…„†ŠŠŠ‰‹ŠŒŠŠ‹Š‹�Š…|rmkjkmmnnmjkmooppppppppqrtsqrttqsstrtuwvvvvstvwwxvusnd_bdibY`fegtykjovtutqmpwwtttuy�‚€†Š†……‡ˆ‹ŒŒ‰ŒŽ��ŽŽ‘–•’””•šœ��ž¤¬¬¯ª£¡¦­¶·´´¹»»»½½»½¾¾¾½º»»¼¼½½½¼¼¼¾¹·¶·¸¸·¹¹¹¼¿ÀÀÁÁÁÀÀ¿À¾À¿À¿ÀÁÁ¿ÁÁÁÀÀ¿¾¾ÁÀ¼¸²±®¬«¬«¨¢Ÿ�Ÿ¡¡Ÿž›ž�›—˜˜––˜˜–——•••“”“•”‘Œ������މ‰Œ��ŒŠ‹ŒŒ‹ŒŽŒŠŠ‹ŠŠŠŠ‰Š‰ˆˆˆ††„……ƒƒ„‡ˆ‰†„�ƒ…‰†‚‚……„ƒ„„„‚‚ƒ…†…‚‚ƒ‚�‚…‚��ƒƒƒ�‚ƒ…‚‚��€�ƒ‚€~~�€~}~~~€~|€~~~€}|}€€}~||}~~€~}}€‚…“¬µ¸¸º¸¸¹º·´µ´±¯©¡Ÿ$Dh|~�‚ƒ…„€zupprqpptwwssrtssssrtvuvx{{{zzz~ƒ‡†……‡ˆ‰ˆˆƒƒ„�~{yxyyz~~}{}~~�……‡ˆŠ‰‰ŠŠ‹‹ˆ†……‡……‡ˆ†‡‰Š‡‡‡ˆˆ††‡‡�ukhhhkkkmmkkmjjkmlllmmonnmonopooopqrooosttppprrrqrrrpjYWcokYNS_hjoqjsxtmpspceptssrtwzyz}€�~‚…„††‡ˆ‰‰ŒŒŒ‹���Ž�Ž’•———™ §¨ª§£ž §±±°¯±µ¹¸¸¸¸¸¹¹¹¹¸·¸¸¸¸¸º··µ´²±¯²±±±²°±µ¸º»¼º¹»½»¸¹º»ºº¾¾¿½¼»»º¼½½»»¹¶²­ª¨©§¤ ¡ ž��žŸ�œ››—––˜•’‘””””’�Œ‹���Ž‹‹‰‰ŠŒŠŠ‰‰††‡ˆ…†‡ˆˆ…„„‡‡‡„„„†„„††ƒ„„‚�„�~}}~�ƒ�€‚~€�~‚�€€~~~€€~~}}}€~||~}}~}||~~}}{||{{{{zz{||}}y{{|{{y{||z{yxxzzzz{yxxwy{|{zzŒ£«²·µ²²²³²±®«©©¤Ÿ›#Cj��ƒ†ˆˆ‡„}wrttvxzxwwwwwwxywwwvvxxz|}|~}�†Š������ŽŒˆ††‡ˆ‡‚€€€}{|ƒ‚��‚‚�€€‚ƒƒ„‡ˆŠŠ‹ŠŠŠŽŽ��ŒŠ‰‰Œ�ŒŒŽ�ŽŒ���Œ‹���І{smmlpptxxuspooppoppppqrrqtrrsutstuttstuvuttuttuvxxussmebmi\TYajpuoju|utxztnlovyxvz}||}�‚‚ƒ„…‡ˆ‹‰ˆŠŒŒŠ‹Œ�’”’��‘“––—›£§«¬¬§¤¦­³´´µ·¹¼»»»¼»»¼¾¼»»¼¼»¹º»ººº¶µµµ¶µµ¶¸¶¶»À¿½¿À¾¾¾À¾¼½À½»¼¿ÀÀ½¿¿ÀÁ¿¿¿ÂÀ¼¶²¯®ª««©§¤¢¤¢Ÿ��›™œœš™™˜˜—™——–•“”““‘’‘��ŽŒŒ�ŽŽŒŒŒŠŠŒŠŠŠŠˆ‰ŠŒ‰‰ˆ‰‰ŠŠŠˆˆˆˆˆ………„‚ƒƒƒƒƒ�‚�„„„‚�ƒ†„†…‚‚‚‚€�‚‚‚�‚‚„ƒ�~�‚����‚€€���‚‚‚�~~~}}|~�~}€}€}||}}||~~~~�}€~}}|~€ƒ� ±¸¸¸¶¶¶¶¶¶²¯¬ª¥ š!auvuxz{{zzyzz{z{{{{}{||}}}~~��€�ƒ‚€€�ƒ„…ƒƒ‚„‚‚‚„ƒƒƒ…ˆŠ‰ˆ†……††………†…†ˆ‰‡ˆ‡‡‡†„‡Š�ŒŠŒŒŒ��Ž��Œ‹‹��Ž��‘‘’’“‘‘���‘‘������Œ���Ї„†‰‰‡‹ŠŠˆ‰‹Œ‹Š‡ˆˆˆˆ‡ˆˆ‡……†††‰‡†…†……‚}uqppmkjh]IEJPRPNSSTSTUTMMPUWVRU[^[_fhgjmeceknnloorvtqsx~€‚„ˆˆ†ƒƒƒ„…‡‹‹‡‡Š’œ�—’— ¥¢¢¢¢¢£¥§¦§¨§¥¥¦¦¦¥¤¡�–�ŒŒŠŠ‰‰ˆ‹Š‡…‰Œ�Ї‡‰‰‡‡‡ˆ‡‰ŠŠ‰‹‹‰†‡†ˆˆ‡ˆŠŒ“�¤¤¤¦©ª¨©ªª¨¡“��“‘‘�’‘�����‹‰‡ˆˆ‡…‚�€€€€€€€€�}}|zzz{zyyzz{}|zxxxyxyyyxxxxxxxxyywwxvuuvvxwvvxxvrsuvuwwwuvuwxxtrttuuvwxwy|‡š«®«ª¬««ªªª©¨¨¨©ªªª¨©ª«ªª©©¨¨¦¦©©¤ž‘ssttsrqqutrt~‹šŸ£¤¦¦§§§¤¤¦¨¥¡œ™–“�ŒŠ!6Ytyx{}€€}{|~~~€}€}}€�€�‚…„„„……„„…††‡††‡‡…‡…†††‡Šˆ‰‰‰‰ˆ‡‰ŠŠŠ‰‰ˆŠ‹Œ‹‹‹�Œ‹ŠŒŒŒ���’‘‘‘‘����’�‘‘‘‘“““’’“•””“•–—••““““‘Ž�ŽŒ‰‹ŒŒ‹‹Š�ŒŒŒ��Ž��ŒŒŠŒŒŒŒ‰…‡‹ŒŒ‰ˆˆŠ‰‡ƒ€zurrnnlkdQGJSVTRTTRQPQURQTYTPSW\c`agmmospkjnrsstsu{{vy~‚�‚ƒ‡Œ�‡„‰�•™™‘‰Š�”�¡ž—™¢©¥¥¥¦¥¨««¨¨ªªª¬¬¬«©¦¢ž™”‘�ŽŽ�ŽŒ���������ŒŒŒ‹‰ˆŠ‹‹‹‹‹ŽŽ�Œ‹‰ŠŒ�ЉŠ�𩬬ªª«®¯¯®¬§ž–’’“••“‘‘������Ž‹‰ŠŠ‰‡‡…‚‚…„���ƒ�‚‚‚€~€}}~}{~€}~~}}z{{~~}zzz|{{xxzzyyxxxxz{{{{yyxxwwwzyxxzxxwxxyxxyyyyz|}}…—¨¯°®®®®®°®¬ª©«¯­­¬¬­¬¬®®­­«©¨©¬®ª¤–„vvwwuuvwvvwwy��œ£¥©ªªªª¨ªªªª©¥¢žœ™–“$:\uvuxy|||zzxzz{{{zzzzz{~~||}€���„�€‚„‚‚„…‚‚€�‚ƒ„ƒƒ„…„†ˆ‰†††ˆ††‡‰ˆ‡††ˆˆ‡‡†‡††‡‰‹‹ŒŒŽŽŽ‹ŒŽŒŒŽ�Ž�’‘�Ž�‘����‘“’‘���‘‘‘��Œ‹ˆ‰ˆˆˆˆ‡Š‰‰ŠŠ‰ŠŒŒŒŒ‰ˆ‰‰‹Š‰‡…�‚„‡ˆ‡…††…„‚€ztoomkgd_SIOZ_[TQUXVTUTOPV[YUTT\a[\emfippfcioonprtxwux}z}|ƒ‹‰‚ƒŠ‘•™–Œ†ŠŠ�šœ”�’œ ŸŸž�Ÿ£¥¥¥§¨§¤¤¥¨§¥£Ÿ˜“ŽŠ‰Š‡†‡ˆˆ‡‡‡‰‰ˆ†‡†‡‡…„‡ˆˆ‡ˆˆ‹‹‡‡‡ˆˆ…ƒ„‡ŒŽ�œ©ª¨¥¦¥¦¦©©§¡˜�Ž’‘‘�Ž�Ž���Œ‹‹‰ˆˆŠˆ…ƒƒ��€€~}}}}~}|||}}}|{yzzz{}{zyzzyyzzxwvxvuvwwxwwuwuuuwyyxywwussuuvxwustuwvurrsuuuuvvwy{€�¡«ªª««««¬«ª©«ª©¨ª©ª©ªª««©§§¦¦§§§¥�Œ|tstuvvsssttw}‡Ž�–ž¤§¥¥¦¤£££¥¦¢¡ Ÿ�š—!5Wt{xz|~~~||}~~€~~~�~}‚€€‚ƒƒ„„„ƒ†…†††††……„„„†‡‡…†‰ŠˆˆŒ‹ŠŠŒ‰‰‹Œ‹Š‰‰ˆŠŠŒŒ�‹ˆˆ‹ŒŒ��‘����‘�Ž�‘““’’“““’““••–•”””•••••’’��ŽŽ‹‹ŠŒŒŽ�������ŽŽ�ŽŒŒŒŒŒŒŒ‹ˆ‡†ˆ‰Š‹‹‹Œ‰†‚~xtqnlmlcXNOYdg`UXae[UW[XX__XVX`gddkoghrtpmloqrtvw}{vu~‚‚ˆ�����‘‘••“”�††ˆ�••�ŠŒ–š——˜š�£§¦§©©©¨©©©§§¦¥¡›’�Œ‹‰ˆ‰‰‡‡†…‡ˆ‡…†„†‰‰‡ˆ‡ˆŠ��Œ�Œ‰ˆŠŒˆ„‡ŠŠŠŽš¨ª©¥¢¤¥ ¡¤¨¥›’“––“’‘‘’’‘‘����ŽŒŒ‹Šˆ‡„ƒƒƒ‚�€�€�‚‚��€€€~~~~|~~~}~}}|{|}zzz||{zwwxz{{xxwxxzzzxxwzz{zxxxyzyyyxwwyyxvwvwwxxxwyxxxz}…—ª­­¬­®®¯°¯­®­¬¬­¬¬«®¯±¯¯­¬ª««¬ª¥�Œ}xxzyvvvywwy…�’��œ¥©¨¨¨¨§©©¨ª¨§¤£¡Ÿ�#8Zvvwxz||yzyz{|||{||{}||~€€~~ƒƒ�€��ƒ„……ƒ‚‚ƒ�‚ƒƒ‚„„‚�ƒƒ……†‡††ˆ‡‡‡‰‰‰Š‰Šˆ‡‡ˆˆˆŠ�Ž������ŽŽ�ŒŽŽŽ��ŽŽ����Ž����ŽŽŽ‘�‘‘��Œ‹‰ˆ‡††ˆˆˆˆ‰Š‹ŠŒ��‹Š‰‰‰ŒŒ‰†‰‰†„ƒƒƒ†‡‡‡ˆˆ†‚zsomljihdWOOV`cZPVbc]TQWRRXXUWV^cabiibgstpihkmmttuzyxxxx‡�ŒŠ�’��ƒ‚…ƒ‚‚„†‡†‡Š‰‰‹‹ŠŒŽ”˜ž¢¥¤£¢¢¢¢¡¥¥¢Ÿ�—ކƒ„„ƒ‚‚�€}€���‡„�ƒ††……†ˆ‰‰‰Šˆ††‡„��ƒ†ŠŠ‘™�œž¡£žššŸ¢Ÿ•��“‘ŽŽŽ�Ž�ŒŒŒŒ‹‹‹Œ‹ŠŠ‰†‚‚‚~~~~}|||}}|y{||wy{|zz{}|yxwyz{xwwxwwwvuwwxwwvvuuvwwvvwwvvvwvvuvwywwvvuwvvttttttvwvuwz��Ÿ¦ª¨ªª¬ªªª««««®­ª¨ªªªª©©©ª¨¨©«¦Ÿ“…zxwwtuttstw€Š�ދВž¡¡ ¡£¥¥¦£££¥¤¤£¡Ÿ�!6Xwxwz|~}}��}~€�����ƒƒ„„†„„„…………‡‡……††„……†…‡‡†„‡‰‰‡‡ˆ‰‡ˆŠŠ‰‰‰ŠŠ‹‹Š‰ˆˆˆ‹ŒŽŽ��ŽŽ������‘‘‘’’‘�‘“”“’‘•”–•–““’“’’�Ž‹ŠŒ�Љ‹‹‹Œ�Œ��ŽŽ�ŽŽŽ���Œ‹Š�Œˆ†„…‡‡‡‰ŠŠŠ‰…�ztmljkje[UQSZb`TWdh_UU[WPSWYXX`fcelmfiuuqljmprvuuzzxzzy€‰‘�Œ‘‘ƒx|……�‚„„„…†ƒƒ†‰‰‡‰ŠŒŽ�Ž’œ¤¤£££¡¤¦¦¢¡¢¡š�‡ƒ„„ƒ…†††ƒ�ƒ…‡……„ƒ†ˆ‡†‡ŠŒ‹ŠŠ‹‰‰‰‰ˆ‡…†ˆŠˆ‰Œ‘–› ¦¦£¥¦§¥ž–’””‘’““�’’�ŒŽŽŽŽŽ�ŽŽ�Ї„„…ƒ‚�‚€��€~~|}}|{}|}}|zz||}}}|{|{{yyy||zyzzxxxxxxxxxyxxz}{ywyzzy{yyz|ywwyzxvvwxyyz{}ƒ‘Ÿ©ª«¬®®°®­«¬®¯­¬¬­®¯¯­¬ªªª¬¬¬ª¥›’Š…~zxxvwwx|ƒŒŽ��™Ÿ£ Ÿ¡§©©§©¨¨¨§¥¦¦£¡¡!3Xwwuwyzzyzz||{{{zzyzzz{||~}|~��€���€€€ƒƒ��ƒ‚‚�‚��€‚‚ƒƒ‚ƒ…„„„ƒ„„†ˆ‰†…†ˆ††………†…‡‡ˆŠ��Œ‹‹‹ŒŠ‹�Ž�ŒŽŽ�ŒŽ�������’’‘�‘�ŽŽ��ŒŠ‰‰‰ˆ††‡‰ˆ‰ˆˆ‰‰ˆ‹‹Œ‹Š‰‰ˆˆ‡‡‡‡…‚„†††‰†„……}tmlklif_TTVUT[[NWe`RNUUTNN\_QT^dachg`doofbgjlmpprwytrtx{ƒ‰†‚‰€x}}}~€€€€�‚„ƒƒƒˆŠ‹Œ��‘”””–———˜˜”“”•Ž…}~~�€‚‚‚�~}~€€��€�ƒ††„„„„„††…ƒ„…†…‚€�„†ˆ�––•—�Ÿ�š™———˜”ŽŒŽŽ�ŒŒŒ‹‰‰Š‹‹‹ŒŒŠˆ‡…„ƒƒ�|}~~||{{{|{{zzz||zyyyyyyxwyyzyzyywvuwwvvvvvvuutttwvvtuuuuxxvuutuwtqssttsstvutsuuvuttxxy€Ž™ ¢¨ªª©§§©ªªªª«ª©¨©©©¨¨¨¨§¨§¨¦£¡›Žƒ|vvuuzzyy~Š™ £¡ œž¡¤£££¤¤¤¤¤£¢¡ Ÿ!2Vuxvw{}~~~|}~~}}}}}}|}~~~�ƒƒ‚‚„„��‚‚ƒƒ……†††……„…„„„†„„„…††††‡‡ˆ‡‡ˆ‹‰ˆ‰‰ˆ‹Š‰‰Šˆˆ‹Ž��Ž���Ž���‘Ž��‘����‘’‘“““’’”•‘‘““’‘’���‰ˆŠŠ‹‹Œ‹Œ‹ŒŠ‹�ŽŒŒŒŒŒŒŒ‹ŒŒ��Œ‰ˆ…‡‡‰ŠŠˆ‰‡†�{qnmlkh^QS[_acZMVf`QOYWY]dgaZ]bebbhlbdomedmppnprw}yux}†ŒŠ‚}{~…‚~ƒ�}ƒ‡ˆ†††ŠŠŠ‰‰‰ŒŽŽŽ�‘�‘””“•””“‘�І†††‚�€‚ƒƒ€€€��„††„�‚‡‰‰ˆ…†‰‰‰‰‡ˆ††…†…†„……�‚‰ŽŒ‰Š����””—�¢ž•�’”•‘���Ž��ŽŽŽ�ŽŒ‹Œ‹‰†…�‚‚‚�€�~~}~~~}{{{}~|||~~}yzz{{|{ywxzyyyyxxxzxxxxxzzyxxxyxxvvuwxzyxwwwx{ywtuvxxxwxy{}‚�—ž¨¬­­®­¬¬«««­««®¯­®­­¬®®°°­ª«©¦Ÿš”Œ�zy~‹�Œ�„�¡¦§¦¦¦¦¥¨¨¨§§§¨¨§§¤¤¤¤ 1Trusuxzz{zyy{}|z|{yxz{{|||}}~~~~�����‚ƒ‚��‚~~�‚€€€‚„……„„„†„†ˆ‰‡ˆˆ†„†………‡‡‰‹‹‹ŠŠŠŒŒŒŒŒŒ‹Œ���ŽŽŽ�����Ž�������ŽŒŒŠˆ…††‡‰Šˆˆˆˆ‡‡ˆŠ‰ˆ‰ŠŠŠŠ‰‰‰‹‰Š‹ˆ…‚„†ˆ††……ƒxnjhihe[PR[_`_[RX^[RRVVSWcf]U\_\\_fhZ_mphceimrtrrwytpvy‡„yoqy|yyyyx|ƒ�€‚††……‡†………‰‹‹ŒŒ‹‹‹ŒŒŽŒŠ‰Š‡‚€�€€�‚�~}}~‚ƒ‚€ƒ…„‚��„ƒƒ„‡……ƒ€€�€|||~|{{�†Œ“�Ÿ¡¢¢¡œ‘‹�‘‘Œ‰‰‹ŒŒ‹‹Š‹‰ŠŠŒ‰‡„„‚�~|}|||zzzzxzywwxxxwxxxz{z{yxxxuuuvvvvutqtuututtsuuurrrstutttsssuutsrrsrrruuuvuswwvwyxw{„�˜Ÿ¨¬ª©§¨¨©©ªªªªª¨¨©««¬ª¨¨ª§¦§¨¨§£œ•‹‰‰�”—”‘Œ“Ÿ¥¤¢¢££¢£¤¥¤¤¤£¡ ¡¡¡¡ž /Ssutxy}}}||{}}~~}|||}������„�€�‚‡†……………„„„‚‚ƒ†…ƒƒƒ‚ƒ„…†‰‡†‡ŠˆˆˆˆˆŠ‰ŠŠ‰ˆ‡‡‰‹Š‹�Ž�ŽŽ����ŽŽ��������’“’‘�‘’’’’‘“’‘��Œ‹‹ŒŠ‰‰‰ˆ‰‹‹ŠŠ‹‹Š‰‰ŠŽŽ�ŽŽŒ�ŽŽ�‹‰‰ˆ…„†Š‰‡†…ƒ|qlkkkkdZTX_cb[OSWTXYUUSXdh_W]bdcdhiZaooedknoqqtw{zurw}�„�|xwwy|{y{}}}�…………‡††ˆŠˆ‡‰‰‰ŠŒŒŒ‹�����Ž�ŒŠ„�€‚ƒ‚‚‚€~~~����ƒ€€€‡‡†……†ˆ†……†††…ƒƒ„…‚€}€ƒ€‚ƒ‡‹–¢ªªªª©¤�”��“•��‹ŒŒŒŽŽŒ�‹ŠŠ��Œˆˆ†ƒ‚�€€~}~}}~~||{~}|{~}}}~}}{|}}|zyyyyzzywxxyxwvxyywwuwwyyxvwwwxwvwyyzxwwxvvvxxxwwvvvxyywwz�‰��¦¬¬¬¬®­­¬­­¯®­«­®¯®®­¬«ªªªªª«ªª¦¤¡ž›šœŸž�˜š ¤¤£¥¥¦¦¦¦¨©¨¦§§§¤¥£¢Ÿ-Orttuxy{{ywwyzyyzzzyzz{|}}~~~~}}}}~��‚ƒ‚‚‚�€��€€€€€��ƒƒ„…‡†††ˆˆ‡†††††„…‡‡……†‰‰‰ŠŒŠ‹‹ŒŠŠŠ‹Š‹‹‹‹�����ŽŒŽŽ�������ŒŒŠŒ‹Š‡„ƒƒ�…ˆˆ‡…†‡‡†‰Š‹‹�ŒŒŠŠŠ‹Šˆ†„‚ƒƒ‚„„‚�wmiijjfbZYZ`cbYQTULVYONS[ad\UUY\`_dfVZikgfihjnqrsvpjktvv{}zywuswwxwxxz{}~�‚���‚„……„„……‡‡‰‰‡ˆ‰‰ŠŠŠˆ‡…‚€~|~~{{|yxz|{{z|}{z}€�„„„ƒ��„‡…‚€���|}}~€�…Œ”Ÿ§©¦¤¦¥�‘����‹‡††ˆ‰ŠŠŠˆˆ‡ˆ‰‹‹‰†‚€€}|}|zz{~~|{{zzz{zyy||zywwwxwuuwvvuwuuuwutuvtutstuuutrrruuutttuuuussvtsssssstttrsuvtrttwzƒ“¡§¨¥¦§ªªª¨¨¨©ªªª¨©ª¨¦¦¦¨§¦¥§¦§¥¥¡ �œœŸœ›��œœ��žžŸ¡¤  ¡¤¤¦¤¡Ÿ¡ŸŸžŸ/Tuuvxz{|||{{{{|}}||{{{}}€�€ƒ„„�‚��ƒ…ƒƒƒƒ„ƒ‚ƒ„ƒ‚‚‚‚ƒ‚ƒ…‡††„…††‡‰‰‡…‡Š‹Š‰ŠŠ‰ˆˆ‰ŒŠŠŠŽ�Ž�ŽŽŽŒ‹Œ�Ž���Ž�“‘‘‘“‘‘‘“““‘’““‘‘�ŽŽ‘�‹‰‡††‰‰‰ˆ†…ˆ‹�ŒŒ‹�ŽŽŽŽŒŽŽŽ�‹ˆˆˆˆ†…‡‡…�|vromjjhe^\\_ef]PQRQ\ZOU[_ae]QPX_cejgZ`nnkijhinrrtxtonw{~ƒ†yzywyxwvxxy}�‚‚†‡„…‡‡††…ˆ‰‰ˆŠ‰‰‰‰ˆˆŠŠ‰‰‡„����~‚ƒ��}~~~~}„ˆˆ†‡………†††ˆ‡†††ƒ‚�€~€…Š�•ž¤©««««¬§Ÿ˜”““�Ž‹ŠŠ����‹‹Š‰‰‹ŒŠˆ‡…‚�‚‚€}}{~}€€~€€~~{|}}}€zxzzz{yyyyxyxxxzxyyyxwwwwvwwxzwtvvwxzyxvxwxzyxxuvvvxxwuvvuwyzxvxx{}…”£©©ª­­¬«­®¬¬­­«¬¬®®®­ª§©©©§¨§¨§§¤¡žŸ Ÿ›š�Ÿ ŸŸ ¡�œ�¢¢¤¤¥¥§§§¤£¤£¢¢+Mosrtvyzyxwxwxxyxyyzzyy{|~~€�~}|�€~}~~~}~}}€}}�€„ƒƒ„†‡††‡‡…‡††ƒ……‡†……‡ˆ‰ŠŒŒ‹ŠŠŠ‰Šˆ‰‹Šˆ‰ŠŒŒŽŽ�����Ž���Ž��‹ŒŒŒŒŠˆˆ†„ƒ„„…ƒƒƒ†‡ˆ‰‰‰‰Š‹�ŽŒˆˆŠŠ‡„‚ƒ���‚{wojgjjg`XVY]abYKIPU]ULY`^ab\NKUa_aecW\jkhhjhginllqvsruwx~�|qquuusomnrvx{~€~~�„�‚„ƒ�‚„„ƒ„…†††‡‡†ˆ‰†ƒƒ‰Š�y{{{|~~~|zz{}|{|€€�ƒ�~‚„„�|||||||~�…ˆ�›¦©¨¨¨©©¥¢™�‰Š‹�ŒŠ…„„‡‡‡‡ˆ†„„„„…„�~|{{|~{xx{|{{}{yxxxxyyyxxwwwywvvwvvsvvvvvvsrstwwvvtsstvxurrtutrutsttstrsttsttrrqutttvuutvuvvw~Ž�¤¤¥©­ª¨¨ª©¦¦©ª¨ª©©¨ª¨¦¦¦¤£¢Ÿ�ŸŸžœ›™˜˜—–•—˜›�žš•’‘‘–šžŸ¢£¢ žžž  œ,Ruuux||}||xy{{z||}}}|}|||~�„‚€ƒƒ‚‚�ƒƒƒ���ƒ����€�ƒ„‚‚„„…†ˆˆ‡‰ˆ‰ˆ‰Š‹‰‰ŠŠ‡ˆ‡ˆ‰‰‡ˆŠŒ��ŽŽŽŽ��ŽŽŽŒ����‘�‘‘’““‘�‘����‘““”’�Œ�Œ‹ˆ‡…‡ˆ‡ƒƒ†‰‹‹ŒŒŒŒŒŒ�ŒŒ‰ˆ‡‰‰‰‰‡ƒƒ€€‚„€zsmkjffbZY\adbZNLWa^PMY`acbYMM[gfehdW`pmhekjmqtnmqutttux||slt|~|usuwxzz€ƒ„ƒƒƒ„‚‚„†„‚‚„‡‡†……†ˆˆˆˆ††ŠŠŒ‹ƒ}|~}}~{{~€€~ƒƒ‚„‡‡…ƒƒ�‚‚„€}~~~‚ƒ‚‚…‹’”𣫬¬¬¬«¬ª§ž’���‘Ž‹Œ�Œ‹Šˆ‡ˆ‹Š‰†††‡„��€~}~}}}}{zzz{|~}|z{{|||zzy{zzxxwxwvtuwwwxyvuvzywuuuwxxvvuuvvvwxwvuusttuuvuvvxxwvuuwxz~‡•¢§¨©«««««¬ª©ª¬¬®««¬­«ª§§¥¦¤¡Ÿ�� ¡ž›š›™šš›œ Ÿ ›“ŽŽŽ“—œŸ¢¦§¥£¤¢ Ÿ¡'Iptsuwxyzxxwyxxxzzzzzzzz|}{}~~}}€�‚~~~~||~~|}~€�~}}~€�€ƒ„…ƒ„„…„„…††ˆ‡…ƒ„ƒ„„…†„„‡‹ŠŠ‰ŠŠŠ‰‹‹‹‰ŠŠŠ‹Œ��Ž�ŽŽŒŒ���Ž��Ž����‹ŒŠŠ‡†ƒƒƒƒ�����„‡‰Šˆ‡ˆ‹Œ‹Š‰†ˆˆ‰‡‡…„„‚~€{skijifaZXXX\_YHELWPJOWXY_cZLKWca`ccW[hi``ffgmnopspoqrrrrpkhrzzxwttuvuv{€~}}���€�€�‚�€€€‚ƒ‚…„��„„ƒ€�‚ƒ~|{{{}{|yuxz{}|{€��}|�ƒ…‚||~‚�|~~~~~}|…Œ”�ŸŸ¦¬©§¨ª¨¦£ž‘‹Š�ŽŽ����Œˆ††††…€€‚…„€~}}|~~}zy{|{{{|{xwwwzzyxzzzxxxxvuuuutuvusttssvwvsssuvwtussrstusqqstssstsrrrpqqsssqqsuuuuuuttv{ƒ�ž§§¥¦¨§§§©¨¨§¨¨ªª©¨¦£¢¡¡  Ÿžš™ššššš™™—–•—™™—”�ІˆŒ’šž¡¢¢¡¡  žž�+Mputxz{{~}|{}}}}}}~}||~~~~��‚‚‚‚„����~~}~}~���‚€�„„„„„…ˆ‡‡‡‡‡‰‡‡‡‰ŠŠˆ†‡‡ˆˆ‰‰ŠŒŽŽ�Œ�ŠƒƒŽ��‹Ž�����‘“’‘‘�Ž�‘“’“‘‘�“’‘�‘�Ž‹‰ˆˆˆ‡…„†ˆˆ‡ˆŠ�Ž���Ž��ŽŠŠ‹Œ‰‰‰ˆ………„�~|upkkkkcZXYW]a_QKJICGPZ\[`eYGJXedbcd\_jojilnnqqqsvsrrrrtwvrptx|zxvxwwx{|~~€‚‚„„„‚���ƒ††……ƒ„„……†„ƒ‚„„‚}yy|{{|}}|…„‚€„„………ƒ‚����ƒ„‚���~~‚„‡”¡§££©¬ªª©ªª¬ª¥›‘Œ����’’�Ž�Œ‹‹ˆˆ†‡†‡††‚€€~|}~}~~|zz|}}|{z|||zzzzz|||zxvwxxyxvuwwvvxxywuuyzyvvuvvvvwwwywttwxxvvuusuuwwvsstwwwxvtuxxzŒžª­¬«­«­¬­­­«««¯­ªªª¨¨¦¤¥¥¥£ Ÿ Ÿžš�œ™–˜šœ››šš—’ŽŽ•� ¡£¤¦¤£ ¡¡¡ 'Gouttvxyyzwwwzzz|{yz}}{{|{|{{|}~~}}}}{{zzyxwx||||~~€�ƒƒƒ…††ˆˆ‡†„…‡†„…‡‡…„„†‡‡‡ŠŠŠ‰Š‰ˆ„…Š�ŠŠŠŠ‹Œ‹‹‹‹ŒŒŽ���ŽŽ���Œ�Ž���Ž�‹‰‡†„„ƒƒ�€„ƒ†‡ˆˆŠŠ‹ŒŒ‡‡‡‰‰‡‡†„„ƒ�€|wtlihhhdXTV]`a[OOTNMKKTZ[Z[QFJXba_`]Z[chkkigimmnrtolmpppptttpprvvwwsruuwy{|||€€~~��~�„�€€€‚�€}}}~~}~|ywxxwwwxy{yz}~|}€~€‚~||}|€‚��~|z�ƒ…�™ ¡¡ ¥§©§¥¥§¨§¢ž–�‰ˆŠŒ��Œ‹Œ‹‹‡…ƒ‚�‚‚ƒ‚€}}{{{||{|{zxxz}zxwxvwwzzwuvwwwwvvussstuuttttssruuustttuvvsrssrstuttturrrtssrrrsrttrrssttstsrruux„™£¨¨¨ª¬©¨§ª©ªªªª¨§¦¥¦¦¦£    ����›š™˜•”“••——–——’ŒŒ”œžŸŸ  Ÿ��žžœ�*Jpuuwy{}~~{{}}€}~}~€€~~€�‚��ƒ‚��€‚�~||}}€�~}‚€�ƒ…„„ƒ†‡Š‰ˆˆˆ‡ˆˆˆˆˆ‰ˆˆ‰Š‡‡‡ŠŠŒ‹�Ž���ŽŽ�ŽŽ��ŒŒŽ�Ž�Ž������‘’“�‘��Ž�’’‘���Œ‰‡‡‡…ƒ�‚ƒ†‡‰‹Œ‹ŒŒŒŒŽŒ‹‹Š‰‰‰‰ˆ††……‚€|vomkjif_YY_``YJNUPRRPVZ\\[RIIVaa]__[^hkljhdhpqnotrmkmlntywuqruxxwutuwvy}€�€€‚��‚�‚‚„„…„‚€�‚„ƒ���}}€}z|{}{{||{~||ƒ‚€�}~~‚……‚‚€ƒ„‰�˜¢¦¦¨¨«««««ª«¬«©¦ •Ž��’’‘‘��Ž�‹‰‡†„…………ƒ‚}|€€||}}|~}~||}~|z{}}{{z{{{{zyxvwxzxxvvvvvxwvvvuvvvvxzvuvvuwxxvvuvttuxxutttuvvvuvxywvuwvvvxxz…š§­¬««®­«¨ªª«­­­­­ªªª­­«¨¥£¤£¢Ÿ Ÿž››šššš˜š›››™—““›  ¡¢¤¤£¡¡¡¡¡ &Fmsquxxx{{xyy{{{|~}}}|zzz{|||~~~€~~~}||{{z{z|}}|}}}}~~€€€�„…„„…‡……„„„„„……†……ƒ…†‡‡‡ˆŠŠŠŠ‰‰‰ŠŠŠŠŠŠŒŒŒŒŠ‰‹Ž�Ž�ŒŽ����ŒŽ��Ž��ŒŠ†ƒ�‚‚„€�‚‚‚„†‰‰‰ŠŠ‰Š‰‰ˆ‡‡‡‡‡†……ƒ�~~{uohiiic]XX[ZYTIKPOPNKKORSLIIJR\ZVX][_fiiggeinmikpngedbajprpppsuuuusqpqu{}|z|}€~|~���~~}|zz{{{|}wtuxyyxxvwxywz}~||{{}��}}z|~€}}ƒ�€�…� ¤£¡£¦©©¦¦¦§§¨©¦ •‰‰Š���Œ‹‹ŒŒ‰…ƒ‚‚‚‚‚€||~|||{{||zvvz|zzwvvxywuuvwxwvvvtttsqtutqrrrruussrrsttutsqqqstuttrssurrrrrrqqrrrssrrrtssrsststy‰�¦¦¥©ª©©§§§¦¦¨¨¨ª§§§©©¨¦¦¤£  ŸŸž�š™›š—–––—˜™˜—”‘�–œŸ���Ÿž��žžžŸ'Gnuuvx{||}||||}€�€€~~|~~€€‚‚��€���€�€~}}}~~~~~€€�‚…„„ƒ„…††‡‰ˆˆ‡‡‡ˆ‡ˆ‡ˆ†…†ˆ‰ŠŠ‹‹‹‹������Œ��ŽŽ�Ž�����������‘‘‘�����‘‘�ŽŒŠˆ‚‚‚„‚„‡‡†‡ˆˆˆŒŒ�ŒŠ‹‹‹‰ŠŠ‰‰‰††„………�}vpmmkhc\XWWWVOLQVQRNICFNSKGILU_YRRXX]hkighgmroikpqkhea`juvpppruutrpoqty{}~€€€~€‚~}}�‚€~}€}|}zz}~{||yy||{|}{yz{~€~|~~…†‚‚€€€€‚‚ƒ…„„†ˆ‘Ÿ¦¥¢¥ªªª««©¨¨ª©¨¡˜ŽŒŒŽ‘“‘����‹ˆˆˆ…‚€„……ƒ€}~~}€€}||}}|||{zz{||zzz{z|xwx{wuvvuxyzwtrtuwxwutvvwvwwwuuwxvtsvvvuuuvwwwuttvtuuuvvtvxxtvvwwy€‘¤«««««¬­®®­ª««¬¬­¬­¬¬««©©¨¨¦¥¤¤££ žžœœššš›™šš››š™ ¤¤¡¡¢¢ŸŸŸ¡¡ŸŸ$Birrswyz|zxxzyz{{z{|~~|{{{|}}}}~~~}~~}|}}{y|{{z||{zzz|‚‚€€�ƒƒ„„…„„…‡„ƒƒƒƒ………………‡†‡‰Š‰‰ŒŒŒŠ‰ˆŠŠŒ‹Š‹�‹Š‰‹‹Š‰‹Ž�ŽŽŽŽŽŒŒŒŒŒ‹‹Œˆ…‚��‚‚��‚‚ƒƒ………ˆˆ‡‡ŠŠŠ‰ˆ†ˆˆˆƒƒƒƒ‚‚�}yrjffgcXQPSWNGMQMKIJFCFNQMJNMT\XTRPOXdhbaecdjiijppi```bhoqnooooqrqonoswyx{||z||}{yxzzz{{|{{{{zzyyvvvz||{|zzxwwyyxwvvxxxzzyxxx{}~{{|€€€�ŠŽ– ¥¤£§¨¨¥¦¦§¨¨¤¤£Ÿ”Š‡ŠŒŽ�ŒŠ‰‰Šˆ†‡‡…�€}�~{z}|{xzzzzzyzzzywxzzyxuuuwwwwurrqttuuuvvusstutuuurqpqrtsrssqutttttttssttqrrrruusruutsvvurttstz‰œ£¥¨¨¨©«¨§¦¦¨ª¨¨§¨¨ª¨¨¨©¨¨¤¢¢¡ Ÿ žœšœœš————–˜˜˜˜š�žž¡ žŸž�›��žŸ'Gmtrtwyz|z{z{{|{€€€~}|}}€������ƒ‚�€�€€€€~~~~}{{~}}€‚‚…„„„„„†‡‡„…†ˆ††‡‡‡†††‡‡‡‡‰‰Š�Ž��ŽŽŒŽ�Ž�‹‹�ŽŽŒŒŽ�Ž‹Œ����‘‘��Ž���‹Ž�ŒŠŠ‡…ƒ†‡…„…‡‡ˆ‡††‰ŒŒŒ�ŒŒŠŠˆ‰ˆ‰‡†………†…ƒ{uokiid]USTVLGQTNJIJGDFNQQOOOU[WUTSRW_g`^efhnnonnllidaadosnpppqpnplnrutv{~~}|}}}~~{xvvxxwtpprsvvvvy{{yyzyttvvuwxyyvwxz{|zz{~}~€�}{|€~|}€��ƒƒ‰•™ž¥§¨¨¨ªª©ªªªª¨¨«©¡•‹‹��Ž�ŽŒŒ‹ˆˆ‰Š‡…‚„ƒƒ‚�~}}~}€~zz~~|{|{{||z{z|zxy{zyyxwwvvvwxxwvuxxuuuvvwvvuutuuvvuuuvvvuuuuwwurortuvwuvuuuwwwvvvvx}‰–ž¤¬¬­¬¬ªªª¬¬­¬¬ªªª­®®®­ª¨¨¨§¤¤¤£ Ÿž�››šœœœšššœ��ž ¢  ¡¤¡Ÿž ¡¡¡&Djqrtwwxzyxxxzz{{|}}}}}}}||{}}~~}|~~~}~|{y{{{|{zy{|||€€„‚„ƒ……ƒ„…„„ƒƒ‚‚‚………††‡ˆŠŠ‹ŠŠŠŒ‹Š‰Šˆ‰‰‰‰ŠŠŠŠŠŒ��Œ���ŒŒŒ�‹‹‹ŒŒŠ‡†„ƒ‚€€�‚ƒƒƒƒƒƒƒ„„†‰‹ŠŠˆˆ…†††ƒƒ„„‚‚€€�€|unifedZQLPPNHHIIFGGHJJMQNJJNOOUSOLMS^`XVcefhgfgfggd]]adjljkmoroljihkjjox{zxyxyzywuutpiknnhhhgmsrrsvtsrtqoopssrsuuvtrtxyyy{{{z}|{{{|€���…Š�‘’—¢¤¤£¤¤¥¥¥¥§¨¦¤¥ –Œ‰ŠŒŽŒŠ‰ˆ†……†……‚ƒƒ�}}~}}}{xz|||zxxyyzzxvxwxwvuuuuuwvuuvxvustsrrssssttrqrssstuuusrstsssrrsstttrqpqqqqqqrsttsqqruvtstw{…”¡¨«¨§¥¦¨©§©«ª©©¨ªª§©¨¨¨¨§¥¤¤£¤ žœ›™™———˜•”—š››ššœžŸžžžžžŸ���ž$@hrttwz|zyxxz|||}}}~~}~~�}~��€‚‚€~{|}~|}}}}~~�‚ƒ‚„‡…ƒ†ˆˆ…†…†ˆ†……†‡‡‡‡‡‰ˆ‰ŠŒŒŽŽŽŽ�Ž��ŽŒŒŒŒŒŒŽ��Œ�Ž��ŽŒŒŽŽ�ŽŽ��Ž�Šˆ†„ƒ…„„……„†††…‡………‡‰ŠŠŠŠ‹ŒŒŠŠ‡‡‡†ƒ�ƒ„„‚}vplige\SNRPKGFIKGHKOPLJLLLMHNVYSONQYbc[Y_]cmjgffhhd^Y\cjlnmmmpqmhgimooqxz{{{zy{{{xtqpnqrroopstvtrtwwwwxyxxxxutvwuy{zx{||y{}}|~��||‚‚€‚†ˆŠŠ“šš••™¥©©§¨¨©§¦¨«ª¨¨§¤ž—‘‘����‹‹Š‰‰‰‰‹Š‡ƒ�~�~}€}|{}z{|~|zxyyzzzzyyxxxzzzyxuuuwvxvvvwwwvtsuuvuvxxvvvvvvvvwutttstuutvuuuuvwwvuuuuttvvxwx}‡–¤ª«©ªª©¨«¬««ª«ª¨©«ªª«¬¨¨¨ªª©¦¦¥¤ Ÿ���žž��ž�››››œž�   ŸŸŸ žŸ  #Afqqruxyxxvvxyy{zzz{{|{{{|z{|}|}~}~~~~~zwvy|{zzz{z{|€‚�‚‚��ƒƒƒƒƒ�‚ƒƒ�€~�„ˆ‡†…ˆˆ‰‰ŠŠŠ‰‰Š‹‹Š‰‡ˆ‰‰ˆŠŠŠ‰ŠŠŠˆŠ‹‹‰Š‹‹‹ŒŒŠˆ…„��€€‚€�…††‚‚ƒ†………†††††……‡…ƒ�€~€‚}wnlhf`ZLHLJIIHGGEGILGGIMJJHHJNMMLNOW`aVQV]dgc`adhe`][X[cjjjhhhljfghhklpwwxywxzxxvursronoorsuvtqquwvvvvvvvuuuxxvuwx|}~~}{zz{|yy~�€�‚„ˆŠ‹‹�•˜–”�–¡¥¡¢¤§¦¤¦§¨§§¥¥¤¡˜‘��ŽŽŠ‡†ˆ‡‡ˆŠˆ…ƒƒ‚}{}}}|{yz|~{{xxyyxyvvvuwxwutvyvttvutttstssrtssrttutssqrrrssssqrrtrpppqqoppqrsrrrrqpqqsturqqtttrttz…• §§§¨§¦¥¥¥¨ªª¨¦¤¦§§¦¨§¦¥§¦¥£££¤¢Ÿ›˜›ž¢¢ Ÿž™™˜™——˜››��žžž�žžžœ#@grsuwy{z}{yy|}}|}}}|}}€~}€~��€€€€€€{xwy|}}}}~�‚�€ƒ……ƒƒ„ƒ…††………†…„���ƒ…ˆ‰‹‰‰ŠŒ‹ŒŒŒ‹‹‹‹ŒŒ‹Š�ŽŽŒŒŒŽŒ�‹ŒŽ��ŽŒŒŒŽ���Ї…†††……ƒ‚�ƒ„†††„„„††‡ˆ‡‡‡ˆ‰‰‡‡…‡†…‚�‚„„…‚{snkhd]SLKIMPMJKJMNQQOLHINMLKMJMQTTX`db][Ybjd``aff_VW[]ejghecfmmghjmqrtxwwy{z|{{xxvvuvwwuxxwwwwtuuvuuuutttvttuwxz|�€~€€}|���‚‚„‡Œ���““‘“•“��𧍤¤§§¨¨©ªªª«ªª¨¦¢›’�Ž�ŽŠ‰‰‰ˆŠŒŒŠˆ†ƒ�~{}}~}}{}|||}}||zzyyy||yxyxwuwxxwwvwwvtvvvvwwvvttuutwvuttuustttsrrttstvutttutssstuuvvvvvvwuuv}‹�¨ªª¨¨««ªª©ªª¬««¨©¨©©ª©ª«ª¨©ªª¨¥£ Ÿ�Ÿ¤¦¦¦¤ �œ›�œššžžžž¡¡Ÿžž  ž">coqrtxyyxxwyxxwyz|{zy}}}{{{|||}}|}}||z|{{ywwz|{z{{{|~}�‚�€�€€€ƒƒƒ�‚�‚ƒƒ€€‚„„†……†ˆˆ‡‡‡‰ˆ‰Š‹‰‰††ˆŒŠ‡††ˆ‹Šˆ‡‰‹ŒŒ‹‰‡ŠŠ‹‹‹‰‡ƒ‚‚‚ƒƒ�‚‚‚‚„ƒ�‚ƒ‚‚‚„†…„„„„††…‚‚‚‚�€‚�zskfc^[SLGDKUOE?EJLGFAAEFINNMNORSSSX`c\VVX_d_\[\[\ZVW]`b^\`cccdb`goonnonoprppnnorpppppoonstqnoprqsqqpqpojhnrrrsvwwustuwxzyz{{{€��„‹’˜™—•”–™™—�Œ” ¤¢¢£§§¦§¨§§¦§¤¤¡ž–�ŠŒ�‹‰‰‡††ˆ‰†…ƒƒ�}y{{{{|ywvxywuuvxxxxwvvwwwwxvvwwtttvuvuttsqqruuttrssstuqqqssrqpoprtsrrqqtsppppqpppqqpqqrpppqpsttqt~� ¨¦¥¦§¨¦¥¥§¦§¦¦£¥¨¨¥¥¦¨§§¦§¦§¨¥¢ž�šš›¡¡¡ Ÿ�œ›šš�›˜™œ�Ÿž›™š��žœ">crtuwyyxxyxyy{}~|||||~~~~€�}�~~zzyzy|}}|}~~€€�ƒ…„………„„…†††††……„†…„†‰‰‰ŠŒ�Œ�ŠŠŠŽŽŽŒŒŒŒŠŠŠŒŒŒŒ��Œ���ŽŽŽ���Œ�ŽŽŒŒŠˆ…†ˆŠˆ…‚„……†……‡†„„ƒ…†ˆ††…ˆ‡ˆˆ‡…††„�€�„ƒ�|ulihb[RJEGKOIEBCHLIFCCDFGLPQONOPNNU`g`WTU\c`]\\XVY__\[Y\aeb_`ffckpnnnmgknopoljlpsrpnnptttrssqrvuuuvutssrrrsttuwz{yuuxzxxwxy{|€‚ƒ‡‘›£¤£¡¢£¤¤ š–𤍥¥¥©©ª§§¨«©ªª¨£ž–�‹�‘��ŒŒŠˆŠŽ‹‰ˆˆ‚~}€�}||{{zz{{zz{{z|zzzzyyxyxxwyxyyyzxwvuwwuttuwwwxyxvvvvtuuttttutttwwttvvrrrssuutstuwtttttttvvtuwƒš¨©§§©ª©¨ªªª©ª¨©©©©ª©©©ªªª«©««ª¦¤¡¡ŸŸž§¨§¥¤¢¡¡¡ ¡¡Ÿž� ¡ŸŸ ŸžŸ¢Ÿ";^nrruwwvvttstuxxxxxxwxyzzz{|||{{{~~~~~|{y{zyy{|{zz|~~~€ƒ‚�������€€~}€�ƒƒ‚ƒ…‡†ˆŠŒ‰‡†‰ˆˆˆ‹‰ˆ‡ˆˆˆˆŠ‰‡ˆˆˆˆˆˆ‰Š‹‰ŠŠŠˆŠˆ…‚ƒ„„��‚…ƒ€€‚………„‚€‚‚‚ƒƒƒ„ƒ‚�ƒ‚‚‚‚��~€ztkfaZSMFACFCBBC@DGGC>=ADDFFHIHGJKJO\caYWW_c^ZZYYZ]ZSSZWV[^^]a__ahjjgijkmpqqpprqnllonjjkkkmmnkknrqpnppqoppoppprtwxustuuutvvwwz}�‚…Ž�¤¤£¡¡££¢¡ž›š¡¤¢Ÿ¢¤¥¤¥¥¦¦§§¤¡ ŸšŒ„Œ�Œ‰‡†ˆˆ‰‰‡…††ƒ}zz}|{zyxwvx|{xvwwxwutvvvvwvvtuuuvwuttttsqpqpqrrrsssqqsussrssuqopqqrtqppqppooorrqqrrsrporrrrqqrsuy†ž¥¥£¤¤¦¦¦¥¨¨§¦¦¦¨¦¤££¤¥¥¦¦¦§§¥££¡Ÿš™š�Ÿ££¡ Ÿ�ž Ÿšš��šš›œœœ�œ›š›#=crvvwx{{|xvxzyz|||}~}}~€~€€‚~~~~|zyyz|}~~€€€��‚‚‚ƒ„„…„„‚ƒƒƒ„ƒ‚‚�‚…ˆ‹ˆ†…‡ˆ‹‹‹Š‹‹‹Š‹‹ŒŒ‹Šˆˆ‰ŒŒŠŠŒŒŒŒŒŒŒŒ�ŽŒ‹ŒŒŒ‹ˆ…†††ˆ‡††††…„‡‡†††……††…†……„„„††††††„ƒ‚„„‚}wmhZPMLEBBFIHHHDFHHC@@@@ACBFIKILONR\bb[WW_gd`]]]]ZVVYYWUY`c`^WZdggjliksvvttuvwtsrqpmfgilnponlnossrrstssstrrssuvw{xuuwy|xxxy|€ƒ……Š• §§¨¨¨¦¨¨¨£Ÿž¤§¦¤¦¦§§¨¨¨ª«ª©©¨¥ •‹���‹Š‹�ŠŠ‰ˆ‡ŠŠ†€~€~}}~|{||{|{{{{yyxzzzxyz{xyzywvvxxxwuttuvvtuutsttwwwxxvuutuvvuursuututsqqssrtttttuvuuuttuvtttvv}Œ §§¨©¨ªª«ª©©ªª««ª©¨¨¨¨¨ªª©§¨¨¨¥¦£¢Ÿž�¢¥¦¦¦¤£££¡ŸŸ�žžž�ž��œŸŸ¡Ÿœ!:]oqrsvvwvuuuuuuuwxyxyyzz{z|}~{{|~||{{z{zzzxxwwxzyz{}}}}~~~�€�~~}~~�}��‚„…ƒ…‚‚…ˆ††‡ˆˆˆ‡‡‡‡‡‡‡‡ˆ‰‰‡‰‰ˆ‡ŠŠŠ‰ˆ‰‰‡ˆ‡…‚‚‚‚‚ƒƒƒƒƒƒ�€€ƒƒ„ƒƒ‚‚�‚�‚‚‚‚‚�€�ƒƒ�‚~}€}|um_TNVOC?AADFD>:<>=>?@DBA>>>CEFKSSW]c^WWY^`^ZY\\XVUURMKNQVYXORVYY]emfahptrpooopponnjedefjjkkkiinqnjhhjnnlmnpooptutrusuwwwww{}‡��“ž££¡£££££¡ �� ¤£££¤¤¤£¤¥¥¥¥¥££¢ –�‹ŒŠˆ‡‡…‡‡†ƒ‚‚ƒ�~|||z{xxyzxvuxxxwxwxvustuuuvvvvsrsuttsttspqqqqtsqppqrqqqqpppprqpprrrrqqrrqprqpoqssqooorttsrpprsru{‰š£¤¦¥¥¤¤¤¤¤¥¥¥¤¤¤¤¤£££££¦££¤¥¡Ÿž�œš––™Ÿ ¡¡ŸžžŸž�šš™›››š›š›�žœœ›!9[psruyzzzvuwxwwx{z||}}}|}}}~~~~~||}}}~~|{{}}|z|~€~||�€}~�‚€€�‚‚‚‚‚‚‚�ƒ‚‚‚††ˆ‡ˆˆˆ‡‡ˆ‰ˆˆ‰Š‹‹‹‹ŠˆŠ‹‹‰ŠŠ‹‹Œ‹�Œ‹‹‹‹Œ‹‹‹Šˆˆˆ†………„†‡‡„„„…„……†‡‡‡ˆ……†ˆ‰ˆ†……†††‡‡‡ƒ‚„‚~wpgXPWRFFNQGB@?<@GF@@DMLD>@DHGMVSS\c`ZWXZZTSPPQVWOMOOSWYYVTWXYZ[\`hdbdgimopnmlopplg_acefcdjkhhjnmjfgjljlnnlnnosxuqruvvwwxxxyƒ’›˜–™¡££¡¤£¤£¢ž™™¢¥£¢¢££¥¤¢¡¦¦££¤££¢ž–Œ†††‡…‚�€€~~�‡„‚€|{{}}}zzwwx{yxvuvwvtuttvvsqqssrrsqppssqpqqppqrqqrtrrrrppoqqrsspppppoprrqqpommprppoqpqqrrsssqrt|Œž¢¢££££¥¤¢¢¤¤£¤¤££¡£¢¡¡¥¥¥¤¦¥¤¡ �š™—–˜ž¡¢¡¡ŸŸœœ˜š™™—˜—™››šœœ›››"9[ptsuxyzzxvvuwwzzz|~||}}}}€�}}~€{{|{xzz|{{{}}~~|{zxz~}~��‚‚ƒ���‚‚ƒƒ„„„…††„…‡ˆˆ‡‡‡‡ˆˆˆ‰‹Š‹‹Œ‹ŠŠ‹Š‰ˆ‹ŒŠŠ‹‹ŠŒ�Œ‹Š‰‹ˆ…ƒƒ„‡………†††††††††……‡‡‡‡‡‡‡‡†„†……‡Šˆ†…„‚€��€}wohYNSMEGXaYIGIICBFHCAFORI?AILLQZUW`iid_]]^YYWUWVQSQORY][XWYZ[Z\]]amnnmkhkqtsrqppqtmcaehlkklnnoopqpmmnooqrqqssswywrrtwy|}}|~€‡Ž™œ˜›£¥¤¤¥§§§¥¢š™¡§¥££¦§¦¥¥¥§¨ª¨©¨¦¦¢›�Šˆˆ‡‰‰‡ƒ��‚„‰‹ˆƒƒ‚�€�€~~|||~~}}~{xxxx|zxwwuvwvuuwxvtuwxwttwvutuutsttututvvuutrstsrrtuvssstssuvuutuuvuuvvtuuuuw|‹ž¦§¥§¨ª¨¨¨¨¤¥§ª¨¦¥¥¦§¦¥§¨©¨¨¨©¨¦£ žž››™ž ¢¢¤¢¡ Ÿžžœœž����œžŸ  Ÿ�!7Xnrpuwwvvtsprrttuuwyzxxxxxy{{}|{xxxzwvuxyzxxx{{{yzzxuruy{||{||}}}}�€~ƒƒ€�‚‚‚„…‚„„„„†††………‡‡ˆˆˆˆˆ†‡‡††‡ˆ‡‡ˆ‰‡ˆ‰ˆ…ƒƒƒ���ƒ‚„„„ƒ‚‚ƒ„‚�ƒ„ƒ‚‚ƒ‚ƒ„„„„ƒ„���ƒƒ„‚�}y}~}|yunfVOTMADLUUJGNVRIIIKIGGJJCDIJFNZVT]ee\WWZWQOTWRNOMJNY^\\]]\]ZZXWW`iifjkgbglpppommmhbdeeebaeikjlmmjkjkkmmllmmmnqspprstvtttxz|~ˆ•˜”𠣡 Ÿ ££¡œ––¡¥¢Ÿ£¥¦¤¥¤££¥¦¥££¢¢ž•Š…†‡ƒ�€€~‚„ˆ…€|}||}~|yxxy||zzxwwwwxvtsuuustsssttssuvutrrpppsrssqpppqqqrqopqrrqponnpppppqqpsppprpppssrqqqppru|�¡¤£¤¤£¢£££¢¤£££¤¡ ¡££¢¢£££¥¦¦¥¤¡Ÿ�œœœ™––™œŸ ¡  œššœ�œ™——™œ›œ�œ™—!6Xouswy{{zvtuvuuvxzz||{}~}}|~}|zxxwxxz}}|{|~~}|}{yw{}}}~‚‚‚‚��€�ƒƒ‚‚ƒ††‡††…††‡ˆˆ†‡ˆ‰‰ŠŠŠŒ‹‹Š‹ŠŠ‹Š‰‰ˆ‰ŠŒ‹ŒŒ�Ї„……„…‡‡…††……†…ƒ…‡……ƒ„†‡†‡‡‡††…„„…‡ˆ‡†………‚}‚zwpgUOZQCDGOOGJQQMJKQQMLNSTIHLQOSZWT[ec]ZXZ[XVVVOMMMNU\ZX]de^[Y[[^]akkilmhbairtppqrrmdbdihhhhjlmopolmoooonmlnroorwuuuvvyywux}}Œ™�™—�¤¤¢£¢¤¥§¡›™¡¦¤¡¥¥§§¨¨¨§¨¨§§¦¦£ž“Ї†ƒ……„‚‚€‚‚…ˆ‹‡�}}}�|z}}}||zzzzxxxzwwx{wuvvwwvuuvwwwwwuurtuvuutsstttttuttstttttqqqtssssqrrssssttsuvvuvvtrsu}‡™¥§§¦¤¦¦¨¨¦¤¤¥¦¥¤¤¤££¦¦¦§¨¦¦¦¨¨¨¥£  žžœ›—˜››�¡¤¢¡ ¡¢¡žŸ››�ŸŸ¢¡ž›™3Qlrqrvwwusppqrruuswyzxxxzzzzyz||ywvtvvvwxwvvx{|{y{zxvxxzz{|~{|~~~~}€€}‚ƒ€�€�‚ƒ‚…„‚‚ƒƒƒ„……‡†ƒƒ…††††‡††…††‡‡ˆ‡†„‚€‚ƒ‚€�‚‚����ƒ���‚‚ƒƒƒƒ…„„„„�€€��ƒ……ƒ‚‚€}{|}yzxrfSJSKCEJOOFJMHEGKNMIKNTTNHHJKPZXVZa_[YVUXXXWSSSRNSYZTV]b[URTW]\XZdhhijjhccglmlmkleZUW\`dfedehhijhffhjjiijjjmmpsqmopsqssuxzy{†–š””š£¡ŸŸ ¡¢ ž™™ž¤¢¡¢¤££¡¢¢¢£¢££¡ž›’Š�||z|}���…„}{||}~{xvvvxxxwwtttuuusstwvutsssttsssrqstqpoqpqqrrpoqqrpoppppqommppqqqpqpooqqqqtvurpoooqqqqps~“Ÿ£   ¡¡¢£¤¤£¡ ŸŸ¢£¢¢¢¢¢¢¡ ¢¢¢££¡¡Ÿž›œ›š–“‘’’“˜��›�Ÿž��™™™œœ�ž�˜–’!4Tntqtwyyzvsstuutvvvxzz{{{{|}}}}zxwwyzzz{{|{||~~|z{|~|||~�‚‚‚���„††ƒƒƒ†„„ƒ…„……ˆ‡……†‡†‡‡‡ˆ‰ˆŠ‰‰‰‹Š‰ˆ‰ŠŠˆˆ‰‰‰Š‰‡„‚„ƒ‚�‚ƒ……„„†…„ƒ……†……„…†ˆ‡…‡‰‡†……†‡ˆˆ‡†ˆˆ‡„€~€}yvgSKSPIKWa\SOOJGGQZSFKU\YUNMLLT_[V[ca\[WY[[[YRQQUU[_\VW\_\TLPW[]YYdkkloojhghgkmpqqh]XX]deceghhijmmkklkhfjmpnlmstpmoruwwx{}||��œŸ—–ž§¥££¦¤££¢ž›ž£¥¤¥¨¨¦¦¥¥¥¦¤¤¤¦£�Ž„‚…‚€€��€�…ˆ‰†�~}€}{z}|zy{||zwuwxxxxywvvxwwvvvxwxvtstrsttsttstuutuuuuutustsutsqqrsttstttuw{‚І}usttstrqrx„š¦ª¦¦§¦¥¥§¨§¥¦¥¥¥§¤£¤¨¨§¦¦¤¤¤§¨§¦¤¤¢ Ÿ žœ˜—”’”›  ž¡¡¡ ¢ ¡¡ŸŸŸŸŸ›—•.Lhqoqsuvurnnpsrqopruvwxxwxvvx{zyyxvvuvxyyxxwxxz{|xxxyy{|{zzz{|~€€~€��€��‚€~‚„‚ƒ‚€�„…†……†‡……ƒ„„…ƒ‚�„…„‚ƒ„…ƒ���€€����‚�‚���ƒƒ…„‚�‚ƒ„ƒƒ„„��‚ƒƒƒ„€€}}zywxshRHOOIKXa[OJHFEIQWPGENWWNMNNJOWXWZ`a^ZTV\\YSPOQSY\\WQPTPLJJORRUQRemkhjlmi`Y\`joolg^YUY_`^`a_^bfikffiighgiijjmqrpppqrstvxzzxzˆ—š“Ž–¡¢ŸŸŸ ŸŸ�™–œ¡£¢¡¡¢¤¡ŸŸ¡¢¡¡¡Ÿž•Š€€}~}||~€€€�ƒ…„€|yy{zyxyy{yyxxwurttvvuttutssrqrqrrqqrrrqqpppprsqooopqrqrpppqppnnmonoopopry}|€‹•—”Œ€wspsssqqr”£¤¢¢££¢¢¢¢¢¢¡¡Ÿ¡ ¢¢¢£¤¢¢¢£¢£¢£££¡¡¡ž›šš˜•“‘Ž�“˜šš™›žŸ�œ›œ›››œ˜—”Ž0Nksstwwxxvrstvutsstxxwwyzxxy{{||}{ywyyyy{{{z{{||||{z{~}~~�€€�€‚‚‚‚„…ƒƒ„ƒ‚‚ƒ„„ƒƒƒƒ……†……ƒ…‡ˆˆŠ‹‹‡‡†‡ˆ‡†††ˆ‰ˆ‡……„ƒƒ„„‚€‚�‚„…ƒƒ‚‚‚‚ƒ…„ƒƒ„„„‡‡†…‡‡‡„ƒƒ………„†††„‚~~}zsgTJPOKKW_^TNIGEGKOPNJNRRMOSSPRWXX[_YWYXX\XWRPVWV]b_UNMNNQTOJJRURUfkigmppkhb_`gmomf[Y\_`_^^ccbcfhkkmnnlljlmopoprvvwvuuwy|{zy~‡—›“�–££¡¢££¢¡ž—–ž¥¥££¥¥¤¤¥¤¤¥¦¤¢ ž“‡‚„…ƒ€€ƒ€�ƒƒƒ†‡‡ƒ�}}}|{{{|~}|z{ywwwwwwxvuststttsstuuvvtsrqruttttttststtuuussrtttsstuutvxŒ”�–ž¤¢Ÿš’‡zsvvttuy…™¥§¦¦¦¦¤¤¤¦¦¦¤¦¤¤¢¤¥¥¥¨¨¦¥¤£¤¥¤¤£¤£¡žž��™—”“’’•››œœžŸ¢¢ ŸžžŸŸžœ˜•�+Feqoqruvvsqoqpppppsuuuuvxwwxzxwxxyyxwwvvvxxxxyyxvvxzz|{y{|||~}}~~}€~}}��}}€�€~€€€‚ƒƒƒƒ�€‚ƒƒ‚„„„„ƒ�‚��ƒ…„„„ƒ‚��~€€~€€|~€€€€‚€‚ƒ‚��‚‚�‚††„‚€€€�‚€~||}|yxuqhTFKKHKQXWPGGGGBBDGGJSXUWUUXXTRTSS[]YWRSSVXTJRVV\]YSLINX\ZXPMNRRT^fgeehjjjg`]]cijjjjgdacffbb_Z[dfc`cfcaefhjkmpssssstvvxz|xx|„‹‹„„‹˜žŸŸ žœ��ššœŸŸž ¡¡¡¢ žž¡¤¢ Ÿš‘†���€~�}�€€‚ƒƒ‚~}zywxxzyxwyy{|wssssttuuurrqrqrqrrssrpprrpooorrrrrpoopqropooprqqoopqpppqy‰šŸŸ  ž¡ �•Šyoottrrwƒ˜¢£¡ŸŸ ¡ ¡¡¡  ž   ž ¡¢¢¤£¢¡£¢¡ ŸŸžžœ™——–”‘‘ŽŽŒŽ�“–——›���œšš››˜“�ŒŠ,Ihtsutvxxvtqpprttttuuwwwwxy{{{{|{xxzz{{yxxx|}||}~|}}}~�~~‚€~~€�€€�‚‚‚‚ƒ…ƒƒ„†ƒƒ………†ƒ………ƒ………†ˆ†††††ˆˆ…††‡‡‡…ƒƒ„��€�‚„‚‚����‚ƒ��ƒ…ƒƒƒ�ƒ……ƒ……ƒƒ††ˆ†…„„‚ƒƒƒ‚ƒ�~~�|zyyqgSJPJENU[XRD@EFFHLLOXcebdecbba[YQS]]WWUUTVYWR[\UVWXURRWZWU[[UPSQVbhd_gkjklke\Y[ckppolg``cfeb^]]checfecdefimopqtvwvvvxxz|~zz~ƒ�‚…‹”Ÿ ŸŸ  Ÿž›™œžŸž¡¢£¦¤¡¤¤¥¥££¡ž•‰‚ƒ……��€‚���ƒƒƒƒ‡‡…�}{|~}{y{|}}{yyxvuvuvvvuvvvvvuutssrttuutrtttstsrrutsrruusrrssrssrrrqtw…›¤£¡¡¥¥¥¢Ÿš‘‚vstutw|‰Ÿ¨¤£¡¢£§¤¢ ¡¡£££¡¡¡¢¥§§§¨¥¥¥¤  Ÿ¡ ž�š—š˜•““’’‘��‘“•—›žž¡¡ž�žœš•‘ŽŒ)Cdonpssvvsonlnoooooqqqrtuuvvwwyyustvwvussstxwvx||zxx||||z{|}{||}}}|~~}}~€�€€€‚€€€~€„ƒƒ�‚‚��‚‚�‚„„‚�€~~}€~}|€€}~|}€~}~€~~‚‚�€���‚…„ƒ€€€�}|~}zxx{|ywtofRHQH>DQTMLIFGGJNW^acceegggfffe^SN[]WQQPQTWSMSXUPNMMQZ_ZOKNSQMOQT_d`Ychiikkg]WY]afkkjfa_add_]__^cfgd``egghkmlmoqpooruxwwxyyz{~€…ŠŽŽ‘••™œœ™“’—žžœœ ¡ žŸžžŸ¡¡ žš�†�€€~~}~~}}}€‚‚‚}xxxxxzywvwzxxxxttrttsrrpqqqrsqppqqqonprqppppooorqpoolmnpqqoopponnoommot•Ÿ¡¡Ÿ ¤£¢žš“‰zomopqx†�£ žŸŸŸŸ¡¡ŸŸ ž�›œœ�ž�ž¢¤¢¡Ÿž››™™š�››˜””•“‘Ž�‘’��“”““•˜›�Ÿž�›˜•’Œ‰…,Girppuxxwspopoprsqrrttutuwzyyy{zzyyxyzzywwz{xwx{{||~~~€€€€€�}�ƒ�‚‚‚���‚����„‚‚‚„ƒƒ„………††††…ƒ„„…„…………………‚‚‚ƒ‚€‚€�ƒ‚��€€�€��‚�„…†„ƒ�‚„„„††……‚‚‚„‚�}z|{}}|z{xtiTGMGAELKDCEHFCDN_ihhillmlmkkjie]Y^]VRPSUVWSMTYUIHFEJWcbXPNSXZSSZbfb`fmmonnnk_Y]aemomgd``hjifdcffkkfdcdfimnpppruurorwxuw{zy}†Ž�‹�–œ——™žœž Ÿ™˜�¢¤¢¢¢££¤¤¢¡¡¢£¡¡�•Š…‚‚€€€��ƒ€}~‚„†…�||{~||{yxzz|||{zxwuuutsrsutqqqtttrrrsqrsttsrrrqqrssttsrrqttrrrppqsrpoqs{‹¡¦¥¥§¨¦¦£¡žš�„vrrrs}�£¨¥£¡£¥£¢¢¡¢£¥¤¢  ¡¤¥¨§¦¥¥¢¡Ÿžœœ�  Ÿš••““’•–•“–›��ŸžššŸŸ   Ÿœ—“Œˆ…(Acpnpqtttpljlnopnmnqqpprsstututttvuuvvttttuvwvxxxwxx{||z{{||||}~}|~~~~~~}}}€~ƒ€~�€��€‚‚€€��€‚‚‚‚„ƒ„‚€}|}{{{~}{{}}}}|~€}~~~€~€�ƒ‚ƒ����~~~|{{{{zz|zzzyrgWNKDCHC;79;>B?BNajifijkijjjiijjfc]RKOOQRSSPOUYSICEIJP^^YQKHNURLP[ccbbejlnnkic\YZ_chihfb^bfkidcdgjjfc`_]agjklmppnllnpqsttvy~‡‘•“•šœ›š››�œœ˜•’—�¡ŸŸŸ ŸŸ ¡ŸŸŸ Ÿœš“‹„�~}{€€}}{{~�€��{y{yxvwxywwwyxwvurqqussqpooqrpqspooppooqrrqqoonprsqqrpooprpomlooppommoqv…›£Ÿ ¢£  Ÿ�›—Žƒuoqst|�ž£¡¡Ÿ žž�ŸŸŸŸ  žžŸ¡¡£¢¡ŸŸžžœ›™˜–˜š›˜•’“‘�Ž��‘“—œ��œš˜˜˜›œ�™—”’Žˆ�(Afrpptvwvsnoprqtssqssstuuuwxxxvstvwuwvwwwwyxxz|{{yzz|}~}}~€��€€~���~|€�����ƒ„ƒ‚�ƒƒ‚‚ƒ‚„‚‚‚…††††††„……ƒ€�…„€}~~€€}~��}�€�‚€€€‚�€�ƒƒ€‚„„‚‚€�~ƒ€}{}}}|~}ztfRFHB?CFFCC??FGP^gjjillklllnnnnllkeYUVTRUTSPS[_XPGGMQW__ZRHEIQQOR^dfd`_eghghhd]XZ]\^dgdaacjljbbfmmieebb`fjmmmooqqopooqvyyyz‚Žš��œžŸžœ�����š“Ž– ¤¢¢££££¥¥¥¢£££¡Ÿ—‹ƒƒƒƒƒ‚‚€€€€��……†�}}~|}||||z{{}|yxwwuwwusttutttvutstsrrtuusrqppqqqssrqsqrrrqrrrrrrrrrqpor{ŠŸ¥¥¤¤¤¥¤£ �š“…xqrtv‚—£¥¥¤¤££ ¢£¢¡¢£¤¢¢£¥¤¤¤¥¤¢¢¡žžœ›››��›™—–•“““”•šž¡žœ›�›œœššš™˜–‘‹†ƒ~$>=CJOWchijkjjllkklmmnnmljid\OJMRQNP]bZRSSKKPX\WLGCDGOQT\cbZRU\_accedb_TRYWW^bcchllgeeeekmjijighjkmlkrrnmqttruvuw{€ˆ�˜šžŸŸ�™“Ž‘••‘ŒŽ›¡¢Ÿ ¡£¡¡¡¤¢¢¡£¡ ›�†ƒ…„�~}{~~||~‚„„‚�}}|~€}zyzz{{xwwvxwuuvvvvusssvutsstuttutsrqoooqqrpooppoopqrrqqrpnooqru„›¥£Ÿ££¥¥¢ŸžŸž™�~ussw„˜¤¥¡ŸŸ¡¢¡ ¢¢¢ ¡¡¡ £££¤£¡¢¢ž��œ™˜˜š˜–••’’‘“’’’•›ž›—–—™›š•‘���‘މ„�~~$8`qonqssrpkjhjkmllnoonlkkkmlkjjjlkkmppqppopoonsuuvwwwwxyxxxz{{z||}|||}|{y{}}}}~}{{}}}}~|}}~}~~~~€€�‚‚‚���|{{yxyxyxwvwxxwz{|}|{z{||}}}~}}{|}}|||}{{xwrtwwyzxvtog_TJKB;>EKJB>?GQ[aeefgghjjjkiiikmnmlig]OINRQKOX]TOUYMFFKLHEC@=BJNOY]\USV^`abeedca[UTVWSV_fceggdd`]bhfebabdfhhhjopommoprsuuvw{…’—••˜œœ›™•”’‘“Ž‹“žŸœš�žŸŸŸžŸžžžœ˜’‡��~|}}}zzxwxz|~|zyy{zzxxyzzxxxusuvtqqqrppppprrrppppoppqonnmnppmmmpoommlmlnllkkknomklmnpw‰œ Ÿ  ¡  žœ™š˜—‘ƒxsrtzŠœ¢Ÿžžž�œ������ŸŸ      Ÿžžž�™•“’“••’‘ŽŒŒŽŽŽ‹�‘™œ›•””””“�ŒŠˆ‰Š‹‡€zzw%A>9>GQV[^__abdfgfhhhfffhhhijiffgf_ULJJRSMIKKB@HRWOE@=>BELVZZ\abceeddeebcba`baZSVWVU[bb^[]eigaYZ\\_dbccglmlnklsupmnptx~‰”’‘�‘“˜›™”�ŠŠ†…�›ž›šœžž�œ›™‘�™›”Š„��}}|}{zxxvvvxz|��~yxyzywuwwwvvttrttsqpommoonmmnmooooooonomllllnmlllllmmjjklljjhlnlikjlo{‘Ÿž�������œ›œš˜˜››š˜š™”ŒŒ•¡¡Ÿ���œ››�ž�žŸŸžžŸŸŸœ™—–””’’�‘�ŽŽ�‹ˆ‡ˆˆ†„ƒ…„„†Ž•™—“ŽŽŠ†ƒ……€yxxzw"6\pppquuurqmnmppommooppllmmkklljiijlkmmponmomnprqrsuuvvvxyyx{{{{|yyz|z{{zx{zxz}}}}zxwxwxz||||�€}~€€�€}yuuuvutsqqruuwutrtvwwxxxzyxy{{yxyz||{xxyzxxvuqpljg`XVWWRJDABEC>?>>>DNWZ^`bceghfeillljhhjkjkkkjjkkcZQOONLKHDA>>DQ[XKC?ABEIQX^_adffiihfecdgfddcb_WUY^\_dbXXckhbX\`\_cabdiomlllnrvsprrtx}�†‰ŠŠ�”›�›˜•’Œ…†“ž¡ž›œ Ÿž�Ÿœ–“›œ—�‹‡‚€€€€}yyyyz}~��zxxzzzz{yxxxxxvvutqqrqqprqqqqppprssqqqqoooppmnmnoomnmoonlmmlmppmkmmns�—¡Ÿ��Ÿ¡¡ŸžžžžžŸžŸžž�›™—““š£¢Ÿ  ŸžŸŸŸ ¢Ÿ    ¡  �›˜˜—•’’’’’��ŠŠ‹‹Š‹Šˆ…††ˆŒ”™›š—’�ŽŒˆ„�~~{z!3Xkllnppppnmjlmollkkiklkihiifeefffghhhiiklnlkikmmknpqqrutvvtuvvvuvvvvwuvuuuvvwxyxwvsrrstuuwxyz|{{{}|}||{|zxvqoppnnoppoprstppppsusssuuuuvqquuuuuvvuvtsstqnfbaaXMHNSOB<>@A?A??<=>EOYZ\afeeghffikihhgeegijhhghfd]UKJHFEIGDGGFJWZL?;;?BGLQUY\aaaacccdececcdca[SOTXUS[]YU]be_TT\[\^`bdhiikliinrompsruy�†‰Œ“–––˜˜–“��‡ƒ�™œ›˜š›œ›š˜˜“‘˜›•�ŽŠ€|{{||zwvvutvxz|~zwtuwzxutsstttrqpooooonmmkmmommmnooljjnnljjijlkkjjklkkklkjhjjjhjjkkkmpzŽœ›ššœœœœžšš™˜–˜˜š™˜––“‘�–�œœœ›™š��œ�œ��žœœ›™––”––’���ŽŒ‹ŒŒ‹‰ˆˆ†ƒ„„ƒ‚‚‚ˆ‘˜˜–“�ˆ‰ˆ…�}{z{zyu!2Zlmlorrrqnlkmoonnnmkjlmmkigihhggfghjijjllkjikmmnonoruvvuuuvvyzxwyxxwxwwwwxwvxzzyvututuuwxzy{{~~~~}}}~|zxwsqooorssrrprrrrpoqsuttuwvtuustvvwuwyyvvuurrmjeddcYQQNIB=88;====@?=?FNZ]`dghijjjkmlklkihhjjkjjijihfe`\VONPUQGGKNZZNA>>?CHNU\aabdfdcbbdeedcbdefb\UTVXUTZ]Y[ae_RRZZZ^`_ahjjjmijormkmrrtz‡“˜˜šœœš™š—”��Љ’›�ž›œœœœ�›˜“”œž™••’Œ…|}|zxxwxxz{~~}zxxzxwxxwtrsrrrttqoppomnnpoopqnnonmoolmmmmmmnmmkmoonnmonlkljjmnkjloop|��›œ�ž���Ÿ�›š›œœ››šššš˜–•™¡ ŸŸŸžžž   Ÿ ŸŸ��›˜–””•••”‘ŽŠ‰‰‰‰‰Š�‰‡……„ƒƒ‚…Š‘—˜–‘Œ‰†‡‡…~|||zw/Rhilmooomlhiijkjijjjjkjhhhgeeefccceefggefhjijjjjjklnoqqpprrttttttwusruvussstvuuuutrppppprruvxzyxxz{yxxxwwwtqqsqpnnopnnmnonmmmoppqrrrrrqpqrsrsstutqompqnfb\WVPG?<534326:96:=@AINS[`a`egghgegjkhjjiefffeffhhiiheda\QJLRQEBFMWWLB==:>EOQX\]^`aa``aba`cb___``YWSNRVSUWYVZ^^VQRVZ]`^]_eddhddmnlknoprx��—˜––—™˜•“�Œ‡‚ƒ�™œ˜˜˜›šš˜™——˜›˜––•“�Œ‚{yxxutuuvtuw|}ztsuwvtttsppqronnppommnmmnoommklkiikkklmlkkjkkkiihhghijjjhhgfgkkiiikijr‰š�™——˜™››œš˜™™˜šš—•––”“”—œ�šš™››�›š˜š™™™š™–“���’’ŽŒ‰‡†………†††††„ƒ‚ƒ‚€€„‰�““’Žˆ„……„‚}z|zzzz 1Sjmnoppqomjklmmkkknnnmmlkiheggghgghggiiiikjjjjjkjmnnorrrrtttuvvvvvvvvvvuuuutvvusttsqppqrstwxz|||zzyyyzxxxxwwwxwwtsqqqpqrrrssqqrruwvtuuuuurrsvvurppqqpnh[I@??<82544542678:<@IS\_`cdedghkkjhjlmjlihhgfgiihhhjlkhdd_UIJRWLEEOWUH?;;>AFLSZ]\_bc`bba`bdfc`]_abYSNLOWXRRVY[^^TPV\``_`cehggijlplkmopsw{…‘˜šš˜˜˜š™•ŽŒŒˆ‡‘˜œšš›œžŸž›œœœœœ››˜˜—–�ˆ}{z{wwwxxy|~}{xwwwxvvwyvtrtrrrrnnnqpoprrpoppoomnmmmljklnmmlmkklljjjkljihijkkmlljkknv‡•›››šœ�œ›ž�›œœœ�œšœœš———œžžŸŸžžž  œšš››š™˜•’‘’‘”“�Š‹Šˆ†‡ˆŠˆˆˆ‰ˆ…ƒƒƒ‚„‰‘—˜–•�Œˆ††‡†ƒ~��.Rhiimooonkhgiihhikiikkiifeccccbddddcdfeeffefgcegihhikmonpqqrrrrqqqqqqrrpppprppprrpmommnommptvwwwvtttusrstsuuuuurppnmoomlmnopooqsqssrqsrrpqpomkmoonkjll`I524134421.-,1457=DMU^``accceeeefeddghhfgfeddefffddeggfdb^UJIPUQGDHQPH>::<;COSUWX\__\\^\]_`______ZTRSMEFRNFIT[YVVWX[ZZ[``adeccchmkilmnnow…�‘’”–”””•‘Œ‰�Š…‡�•––˜˜———™™––—––—™˜—”“ŽƒwtuxvtsssvzzwussrsuusqqppoooolkjkkklmmmmmoppkjihhiiihhhihhhhfgefgfghfffggggghhijjimyŒ——–™–––———–––——–•“•••”“•™˜˜˜˜˜šš™—•••–•“��ŽŽ���Œ‰ˆ††……‚ƒƒƒ�‚ƒƒ€~}}~}€‰‘”“�Ž‹ˆ„„…†�}{{|.Rhkjkopokiffhjiklmllmmkjgfeddeeccdgeeegfgggfhffgiijikmooprqrrrpppqqrrrqrprppqsrrrqooooqqpppruwwuurrsvuurrsvwvtuxxuqpqqpponntutqrrssrrtuutrnnnnnmonnmnk_KA62355652//1457AMRY`ccbbabbcdgghgedggghgfihedeffhggffefeaUMKT[SIDGTWJ?99<ENMJNTXWWX_`[X[]^]_cjy…�yojt‚‰ƒ|ww}}v{ƒŠ‡††Šˆˆ‡‡ˆ‰‰‰ˆˆŠ‰‰‰ˆˆˆ†…wmjhjjjkmmnlfaafhfdddcca_bacht�‰……‡‡…ƒ�ƒƒ�~vg\]]]\\\\ZZZ[Y[\\YZZZZZYYXXYYZ\\YZ[]]afq€Š‰‰ŠŒŠŠˆ‰ŠŒŒŠŠŠŠ‰Š‰‡†‡‡‡…†ˆŒ‹Š‰ˆ†‡‡ˆ††††„ƒ‚€��yvwxvuttrqqrrtv|ƒˆ‡††…„‚�|vvvyvspstvuu \ No newline at end of file diff --git a/xie/xc/programs/xieperf/images/image.002 b/xie/xc/programs/xieperf/images/image.002 new file mode 100644 index 0000000..d21b617 --- /dev/null +++ b/xie/xc/programs/xieperf/images/image.002 @@ -0,0 +1 @@ +£ ¢¡¥¥¤¤¤£¤¦¥¥¥§©¦©©¨¨¨¨££¢¢ ¡¢ ¡ŸžŸŸ�¡ž¡ž����œš›–™˜–™˜˜š˜™—•––š››–š›˜›˜š™˜›•“—š˜———™—–—˜™˜——˜—•š–—•—–””•–™—•“’•••”‘•–’’’”•˜““‘��‘‘�‘��‘�ŒŽŽ��“’’�’‘‘�“”•‘‘‘’‘‘‘”’’•“’’‘‘�‘‘�‘‘��’��’‘”���ŽŽ‹�Ž��’�‘‘�‘‘‘��’�‘�������Ž’�’��Ž��“‘‘’Ž�����ŽŒ������ŒŒ�Ž�Œ���ŽŽ��Ž����ŒŽŽ‹Ž�‘‘��Œ��Ž����‘Ž�����ŒŽ�‘�‹Œ‹ŒŠˆŒŽ����‹‰�ŠŒ’��‹�‹����ŒŒŽŒŒ�‹‹�Š���Œ‹�Š‹‰‹�‹Œ�ˆ‹‹‰ŠŽ�Š‹Ž��‹ŒˆŒŽ‹Ž‹Œ‹ˆ‰‹‹��Š‹Œ‹ŠŽ�ŠŒ‹‰‹ŒŠ‹‰ŒˆŒŽŒˆŒŠŠ�Œ�Š��‹‹��ŠŠ��‹�ŽŒ�Œ‹‹‰‹„Љ‹Š���Š‰ŠˆŠ‹ŒŒ�Œ�Ž�Œ‹Œ‹��’Ž�‹‹�‹���‘����‹‹Œˆ��‹ŒŽ�Œ�•’‘Š‹‘‘‘�Ž�ŽŽ‹y`Wb|†�Ž…|cYat‚��‘•‘‘“��“�”‘££££¤¤¥§¥¥¥¦¦¦§¥§¨¨©¨«§§§¥¤¤Ÿ £¤¢Ÿ  ¢ ¡ ¤Ÿœ›œš›šœ˜™›˜ššš˜˜˜—˜˜šš›šššœ›ššššš—–•š˜˜š–›——–˜˜™˜˜–˜˜™–•––˜•••–”–—••—–’“—–——•”’•–—––”‘��‘“’‘Ž”’���‘”””“’‘””‘”“”‘”’‘��•˜“•‘”‘“�‘““”�‘‘‘�’““‘��“��Ž���‘‘’��‘�Ž��“���‘’”‘��‘�‘�‘’‘�Ž‹���““‘�‘���Ž�ŒŽ��‘‘�ŽŽ�ŽŽŒ��’�Ž��Ž�����Œ�‹�‘��“�Ž‘Ž���‘‘�Š�Œ�ŽŽŒ‰Œ��Ž‹�Œˆ�Ž��‹‹���ŽŒŽ�ŽŽŒ�ŠŒ�ŽŠŽŽ���Œ��Œ���ŒŽ�މŒŽŒŠŠ‰Š‰‹‹ˆ�Ž�Œ��Œ��Šˆ‹�����ŠŠŠ‹‹�‹‹Œˆ��‹ŠŠ‹��‹‹‹‡‹�Ž��ŠŒ‹Œ‹Œ�ŠŒŒŒŒ��ŒŽ‹��‹Œ�ŽŽ‘ŒŠŒŒ‹Š‹‹ŒˆŒ��Œ‰ŒŒ‰����Œ�ŽŽŠŽ��Ž�Ž���ŠŒŒ�“‘’’���Š���ŒŒ�����““��‹�”Ž’Ž’‘Š€lW]s�ŽŒ‰|kZ`uƒ‹‘“”•“•”�–�‘‘“¤¥¤¥¤¥¥¥¥¥¦¦¥¥©§©©©¨¨¨¨§¥§£¦¡¢¢ ¢¡   ¡Ÿ¡ žœžžœš�ššœ˜›™šš™—›™–›˜š™›–™™š™˜š™™˜™––˜œž™—™˜˜™™˜•——–—–––—””—•—–•—”––””””——•“––””—–˜˜•”��“�’�“�’��’’•”’‘“‘�‘’‘“‘•”’Ž�”’‘’”’‘‘’’’’•’”“’‘‘“‘�“‘�‘’Ž��‘�““�Ž��‘�Ž��‘��‘Ž’“’�Œ�“‘Ž‘”‘��Ž��‘��Ž�‘��ŽŽŽŒŒ����‘‘ŽŒ‘������Ž������‘Ž’Œ��‘Ž��‹Ž��Ž‘���Œ‹‹��ŒŒŠŒŒ�Ž��‹ŒŒŽ�‹��ˆ������Ž��ŠŠ�‹ŽŽŽŒ‹Œ�ŒŽ���ŒŽŠ�‘Œ‰‰ŠŠŒ‹‡ˆ†††Š‹‹‰‰�ŒŠ�‹‰Š�Ž�ŽŽŽ‹Œ‰‹�‡ŒŒŠŒ‹ŒŒŒŠ‹Œ‹Ž�Œ‡Š�Ž��‹Œ‰‰Œ�Ž�‹ŠŠ��ŒŒ‹ŒŒ‹‹ŽŠŒ�Ž�Š‹Ž�ŠŒŒŠŒŒ‰ŠŒ‹�Œ�‹�ŠŠŒŽ�Œ��Œ‹�����ŒŒ‹Œ��‘��ŒŽ‹Ž���‹���‹�‘‘�Ž�����Ž‘‘Š…qZWc{„‹Š~n^`o}‹�’’“”�”‘‘‘“�‘�£¦¥¦¦£§¦¥¥¦¦¨¨¨§¨¨¬ªª©«©¦¦¤¥£¤¢¢£ ¢¡¢ ¡¡¢�ž žžž�œœ˜››™›šš››˜š›�™——š›™š›š›š˜–™—˜—šœ™—™•–˜˜––••˜–˜–•••‘“–˜—•—––™–“–————“””““••—˜••�“‘‘”’�’��‘‘””–�““—•”‘‘‘“”’’�‘‘‘‘’•’“‘‘•“‘–‘“’�‘“‘’�‘‘’�’’Ž’”‘�”�Ž�������“”��‘“���‘‘�‘Ž���’Ž���‘‘�Ž�������‹ŒŽ’Ž���‘�����‘‘‘���Ž����Ž���‘��Œ’Ž��Ž����’�����ŽŽŒŒŒ������Ž�‹��‹‹Œ�‘Ž�Œ��‘Ž‹ŠŽ��ŽŒŒ‰ŒŒŽ���‹ŽŽ‹�Œ�ŠŒŠŒŒ‰Š‹‡‡‹ˆ‹‰‹‰����‹‹��‹���Ž�����Ž��‹ŒŒ‹Š‹ŒŒ���‹‹ŽŽŒ�‹Ž�ŠŒŠŽ�‹ŽŒŒŒŒŠ�ŠŠˆŽ����ŽŽŒŒŒŒŒŒŒŠˆŠ‹ŒŒ�����Œ�Œ‹‘ŒŽ���‘���Ž������Š���ŽŽŽ�‘��������’’��Œ�’��‹Œ‘�…u]U^o„†‚p][q}†�••’“‘’””’““‘’ާ¤¦¥¥£¤¦¦¦¦¥§¨©©©ªª©¨ª¨ª§§¤£¤ ¢¢£¡¡     �Ÿ žžžœ™œ�››™šœ™››››œ™š™™™˜—™ššš›˜——š–šš—šš˜™—˜š™–™––——–––••“””–———––˜–•š˜””—”•“–”–––—–““’•“’�‘�”‘‘’’’’’’–”””‘”““‘‘’�‘‘‘Œ‘‘’““’’�‘“’•’’‘�‘“‘‘“’‘‘‘��‘‘•�“‘‰��‘’’Ž’‘‘���’�‘�����‘Ž�Ž�Ž�‘��‘����Ž��‹ŒŽ��������‘�‹Ž’ŽŽŽŒ��’�Œ��Ž�“��‘��‘�����‘��������Œ��Œ������Œ�Ž�ŽŽ��Ž���Œ�����ŒŽ�Š��Š�ŠŽ�ŽŒ�ŒŽ‹���Ž�ŠŠˆŒˆˆˆŠ…‡ˆ‰ŒˆŠŒŒ�Œ�Œ���Œ�Œ�ŒŒ�ŠŽŽ�ŽŠŠ‹ŽŒŒ‰‰ŒŒ�‹Š�ŒŒŒŠŒŠ�‹ŒŒ�ЇŒŒŒŒ�‰ŠŠŠŒŽŒ‹�ŽŽŽŒ�‹��‹ŠŠ‡‰‹����Œ����‹���Ž��Ž�‘Œ�Ž�ŒŽ�Œ�ˆ‘���Ž�’���‘��Ž�“‘Ž���”��Šˆ‘‹{gRWg{€‚�p`Yey‰Ž‘”•’’�‘“’�’‘’’‘¥¥¥¤¦§£¦§§§¦§¨©ª«¬¬¬¬«¨¨¥§¤¤¥£¡£¢¢Ÿ   ž  œžžœš›š›››šœœ›š›�››™š›š™™š˜—œ›™™™˜–™››™š™œš—™˜š™™”——˜—™˜—–“••“—™––—š˜™˜š™”œœ’‘“•””–˜•–’˜’”’’�‘‘—“’““’”“‘‘’•“””•”’’’“‘’’‘’‘’““““‘’‘’’“”‘‘�‘�“‘“’‘�Ž��“”’’Ž��’‘”��•–��”�“‘ŽŽ’�Œ“Ž���ŽŽ’�Ž‘ŽŽ�ŽŽ�����Ž���‘�������ŒŽ“Ž��“�ŽŽŒ‹�Ž‘‘����‘‘‘’“Ž�‘“‘�Ž����’��Ž��‘ŽŽ�Ž���‘��������Ž���‘��‹‹����Ž�‰�ŽŽ�Œ�Ž���‹‹‹‰‡ŠŠŠ…‡ˆˆ‰‹‹ˆŒ��‹������Œ�ŒŒŒŒ�‹‹ŠŽ�‰���‹Š�‰‰Š‹�‹Œ‰‰�ŠŽŽ�ŠŽŒ�ˆ‹Ž��‹Œ‰ŒŽ�Ž��ŒŽ��Œ�Œ‰Œ‹Ž‹‰‰‹Œ�‹�ŒŽŒŒ�ŒŽ���’�’‘‘����ŽŒ�ŒŽŒ�ŒŒ�Ž�‘Ž‘““�����‘����’‘ŽŒ‹�„q[R^u~u`\avˆ�•’““““’’••“””“•�¥¤¨¦¥¥¨§§¨¨§¦©¨¬ª¬«ªªªªª©§¥§¤¢¡¢¤ ž �ŸŸŸŸ�œ�žšš™œœšœœœš™›�žœ˜˜šž›™˜š—————™™—›šœš——›˜š—™˜›�š•–™™–›˜––˜”••––—––—•˜˜—”ž›—’”•˜•••˜—–“”‘’‘�“�”””’’’•“‘“‘““’•”—��”””’“’–‘�’•““‘‘‘““•’�Ž��’“‘‘’’�‘�“‘””“�Ž�Ž“‘�’”‘���’‘‘�‘�����Ž���’��‘�’�‘�Œ��Ž�“�Œ��Ž�Ž�Œ’Ž��Œ����������ŒŒ�ŽŽ‘��ŽŽ����‘“�‘����‹—šŽŒ�‘‘ŽŽŒ�‘‘�Ž�‹��‹��‰�Ž�‘Ž“�‹ŠŒ�ŽŒ��‰�Š‹������Œ���ŽˆŠ‡Š‰ˆ……ˆŠŒˆŒ‰‹Ž�Œ�ŽŒŽŠ‹�ŽŒŒ‹‹‹ŒŒŒ‹‰��Š�Œ‰ŠŒŒŒŒ�Š‹ŒŠ�Ž�ŒŠ‹‰ŽŒ‹’���ŠŒ�Œ‹‰Ž�����ŽŽŒˆ‰‹ŽŠ‹‹Œ‹ŒŒ��‹Š‹�ŠŠ�‹ŽŒŽ�Ž‘’��ŽŒ‘�Œ’������‘��‘‘�‘��’‘���������ˆ‡w^MTh|€{n_Ydv��“’�‘’’“‘’‘••‘‘”�¤¨¦¨§§©¦¨©©©«ª«ª«¬«­«¬©ª©©©§¦£¦¤¥¢Ÿ¢Ÿ �ŸžŸ�žž�˜šš›ž›™œœ™ œ›š˜›œž�›œ›˜™™˜›•š›››š™™™š–˜šššš˜—™—š—š–—•›�•““•–——–————–”——–’”™—–’’–•’’––““”��”–“•“““’•”“’•””•••“’’“’“••�‘’””’“‘“–”‘•‘‘’’�’’“’’Ž‘‘“•‘•’’����’�‘‘’��‘’��’�����’’‘�‘‘��‘’‘�‘‘‘��‘�’’���Ž��Ž�‘��‘‘�‘‘”’‘‘�������‘’��Ž�Ž�Ž����������’–’�‹‘‘���Ž��‘‘Ž�Ž����Š�Œ����ŽŽŒ�Œ‹���ŠŒŠ‹Ž�Œ��Œ���‹‹ˆ‰Šˆ‡ˆ…ˆ†ŠŠ‹ŠŠŒ����Š�ŒŒŒŒ��Š��Œ‹��Œ‰Š�‹��ŠŒ�ŽŽ�����‘��Œ‰‰ŒŒŽ‹���Œ����‰Œ‹�‘Ž�Ž‹ŒŽŽŠŠˆŠŽŒŒŒŒŠ��Ž�ˆŒŒ‰��Š�Š����ŽŽ����Œ��‘��‹���‘“•’��‘‘‘”‘Ž‘������†wdJLbv~p^Zbu�‹�“““’�“•”’‘”“——•”’¦§§§¤¤¦§§¨§§©««­«¬ªª¬«ªª©¨§¦£¤£¢¤  ¡Ÿœ   �šœ �››™š˜››™œ� ˜˜™˜™›œœ�¤ ˜˜™—•—šš››š˜™™˜™ššœ�š—˜˜˜˜——˜•˜˜–––”—––˜™•—˜—•‘•–”•˜–˜˜�’“—••••“”“’�•““�’”••“‘”“”“•–•••••’”�’““��’�‘”““–””•‘’�”�Ž���’Ž���’‘‘���‘’��“”’‘��“‘�‘�‘����“‘���‘�“���‘’–‘��“”‘‘�‘�’���’Ž��‘���’‘‘Ž‘“���’�’‘’‘�Ž��Ž���ŽŒ‘’���Œ���ŽŽ’’�Ž‘‘Ž���ŽŒ��ŽŽŽŒ���������Ž‹�‘��ŒŒ�‹ˆŠ�‰Ž��‹�Œ‹‡‹‹…‹‰ŠŠˆŠ‹‰ŽŒ‹Œ‹ŽŽŒ�ŠŒŒ‹Ž���Œ�Œ‰ŽŒŒŠŒ�‹Œ���‹��‘���Œ��Ž‹‰ŠŠ‹ŽŒŒ‰Š‹‹��‹�ŠŒ�ŒŒ‹ŒŠ�‹Š‰‰Œ‰‰��Œ�‰��Œ�Œ‰��ŒŒ��‹���������‹Ž‹�Ž�ŽŽ�’’‘�‘��Š‘‘’Ž�������ˆ|eNIVk{}s^Ybv‚ŠŽ‘�’��Ž’��”•�“•”•’”§§¥¥§§¨§©§©¨ª©¬­­®«­«®¬©©©¨¨£¤¢£¤ ¢ ž  Ÿ Ÿ›šœžšœœ™™š˜�››š˜—›–˜�››œ ¡š—™™˜–˜™™ššš™˜—™—˜š˜™—–—•––—˜˜—™—•˜•˜––––”—–”•—•–”•–•””’’——“”–“••’•”“—••‘�••”‘“’””’˜š–‘•’”�”‘–‘�‘”��•“’••”••‘““�‘‘‘‘�����’’‘���‘‘�‘�”��Ž��‘“�’‘Ž”Ž�‘Ž�“‘’‘“‘‘�‘’“•�’’’‘�Ž��‘‘��’��‘���‘��Ž�Ž�Œ�‘��Ž������’���‹‘�“‘“���Œ����“Ž��“’Ž�‘�ŒŽ�Ž���‹‹�Ž‹�Š������ŒŽ�ŒŽ�Ž‹��ŽŽŠ‹�‘‹ˆ�Œ‹�‹‹�Œ‰�Š‹�ˆ‹‹�‹ŽŽ����‹Ž��Œ�‹Œ�����ŒŽ‹��ŒŽŽ����ŒŒ����‹Š‹Œ‹ŠŒŒŠŒŒ���‹Š�����ŒŠ‰‰��Š‹Œ†Š�Ž�Œ‹‹‹ŒŠ‹��‹�Ž��‰��ŒŽ����Œ‹�‘Ž�‘”Ž‘’’�“���Œ�’Ž�‘�’��ŽŠ�oSGNbtywgaco€ˆŽ�‘��‘’”–‘‘“’’“““”’”§§¨§¨¨§¨©¨¨©ª­ª­®­¬¬««­©¨§§¦¥£££¡¢ž œŸ�žžž˜���››žš››˜œ›››—•™šœ �›ž›œš˜š—™–˜šš–™›—œ�™˜›˜š–˜š—––™•˜˜•——˜˜–••––”•–—”””•˜•™”–•”“™™”“–˜–•••‘”—•—–‘””‘”“““•’”–˜–’“•‘“•“�•’’——“–’”‘–—”•’”‘�Ž‘�’’����‘“�����’‘�‘��Œ���’�‘����‘Ž’�’‘”“�‘‘‘���–’’•�‘��ŽŽ�‘‘Ž�����‘’��’“�‘�Ž��Ž��ŽŒ‘��Œ���Ž�Ž“‹���ŽŠ���Ž‹�������‘�‘�ŒŽŠŽŽŽŒ‹ŽŽ�‰�‰�‘Ž�Ž�‹����Œ�Œ�‹Œ�‹ŒŽ�‹‹��ŒŒ��‹ŠŠ‰‹ŠŠˆ†‹ˆ‰‹Ž�����ŽŠ��Œ�‰ŽŽŒ�‹Œ‹���‰‹�Ž�Ž���‹��Ž�‰ŒŠ‹ˆ‹‰Š‰ŒŽ�‹ŒŒ���ŠŒŠ‰‰‹ŒŒ�Œ‹‰ˆ‰Ž�ŽŒŒŒŒˆŒ‹���ŽŒ‹‰‹��Œ�Œ‰ŽŽ�‹�’��Ž‘����’����Ž’’��Ž���Š…pXHNblwoehmq‡‹Œ�‘���‘”’‘•–�“��””’“©¨§¨¦¨¨ª©©ª¨«¬®¬««®¬¬¬«ª¨©§¦¤¤¥£¡£¡    œ  �ž��šœšœœ���››�˜š™�� ›œ��™›™—›™™™š™šš—™˜��—š—˜š™™––˜™—–˜–•™˜™˜–”˜–•–—–˜•””——˜——“—•––•–––—˜•’’———’—‘’””••‘’”•••–•‘‘•“““–“‘““–••”•“””“—“‘’’’‘‘’�“‘Ž’“““‘Ž’ŽŽ‘‘Ž‘’�Ž‘��““��Ž�‘��’”��“Ž��’‘Ž‘��‘””‘‘�����‘‘‘‘���Ž‘’�‘‘’’���‘Ž��‘����‘�‘��Ž�Ž‘Ž��Š�‹Ž’��Œ�Ž�‘’��’‘‘�Žˆ�Ž‘‹ŽŠŒ����Œ��Ž�Œ�‹‹�Ž�Ž‹���‹Ž‹ŒŽ‘�Ž��ŒŽ�ŠŒˆ‰ŠŠŒˆŠ‡‰Š‹�Œ‘���‹Œ�ŽŽ’�Œ��Š�Ž���ŒŽŠ‹ˆ‹����Œ�ŽŽ‹ŽŽŽ‹��‹ŠŽŒ�ŽŽŒŒ���Ž‹‹�‹�‰��ŒˆŒˆ†‹‹�ŽŒ‹ŒŽŽ��Š�Ž��Љ‹‹‹�ŽŒ‰Ž‘‘���‘���Œ�Ž‘‘�‘‘��“’’�Ž�’�‡xbKN[ltnc^i{†Ž�ŽŽ“���’“•——”’—–’—•”‘¥¨©¥©©ª¨©©©ª«ª««®­®­­«­«©§¥¥¥¨§¡£ ¡ ¡¡�œžœŸŸ�Ÿš�šœœžž�œš›�Ÿ�››™››žžšš—šš™šššš˜˜™˜™š›™™˜˜–œš˜˜–˜•—™™—––›—••–˜“™˜—™™—••–”™––•••˜•”——”•˜”“–˜•““”“‘“–““”’•–“”’””’•“–•“’”“•“”““”“•‘’’�‘‘””‘’‘‘‘�‘”—’�Œ‘‘�“�‘�’�’’��”‘’“����ŽŽ”’�‘ŽŽ�•�����“‘“��‘‘‘�‘�‘‘��‘Œ�‘’‘‘‘��Ž�’Œ“Š��Ž�’�����‘‘�‘Ž����Š�Ž�����������‘���ŒŠŒ������ŽŠ��Ž‹�Œ�‹‰‹�Œˆ‹ŠŽ�ŽŠŒŒŽŒ�Ž‘��ŽŽ���‹‹‹‹Œ‰Š�‹‰‰ˆ‰�����Œ����Ž������Ž‹ŒŽŒ‹‹ŒŠŒŒ����Ž�‹‹‹��Ž‹ŒŒˆŠ‹‹��‰�ŒŽ’��‹Œ‹Œ‰�Œ��‹ŒŒŠ‰ŒŠ��‹Ž�����‘ŽŒ‰‰‹‹Œ�Š��Ž‘’‘�Ž�Ž’’��Ž�Ž“����‘Ž��Ž��ˆ}dMN[goj`]kw‚Љ�Œ“�����”“”“–”–˜—––••‘©¨©¨ª©©©«©«¨¬«®®­®°­­«««¨§¦§¥¨¥£££Ÿ¡Ÿ ¡ž�� �žŸ›››šŸ��œ��ž›žŸœ›™™›œ›™˜˜™—šš›�š—––˜š—™™š——˜œœ˜———˜˜˜š–—˜™™–—–––•—™™˜–•“”˜˜—•••“™—”—•”•˜•—”•—‘“�‘‘””””•”“•“‘“•”’•–”•’�•’––•““’‘“’�“’“–”‘‘“�‘Ž’‘••”�’“•’��“�“�����’‘�“’���’‘“’Ž“�‘���‘“‘��’�‘��‘“‘����Ž‘‘’Ž”���‘’‘ŽŽ‘Œ��‘‘���‘�ŽŽ��’‘Ž�‘��Ž‹����ŽŒ’���‘Ž‘�Œ��ŽŒŒ��‘��ŽŽ��‘‘��Ž�‹Š�ŽŠŒŒŒŒ����‰‰Œ��“�ŒŽ����Ž�Œ�‹Š�‹�Ї‹Œ�‹ŒŒŒ�ŽŒ�Ž�’ŽŽŒ�ŽŽŒ‹‹�Œ�ŒŒŠ��Œ�ŒŽ‹‹Œ�Ž���‹�‹‡‡ŽŽ���Ž�ŽŽ‹Ž�‰Œ‰‰�Ž��Œ��Œ�‹Œ‹Š‹Ž�����‘�ˆ�Ž‹ŒŠŠ����Œ�‘Ž�Ž’‘����Ž��‘‘�Ž����ŒŠ„oPMScmi^[gy…Œ‰�‘’’’’‘““’•””“”––—’•–˜©©¨¨«ª­©ª«©©¬¬­­®¯­­®¬¬©¬§§§¨¤§£¦¢¤ � žž›œŸ���›šœ™žŸ››�Ÿ›œšœœ›™—›œš˜•˜—˜››œ››™›™™™™˜š———š—™›–—™—–™™›š—™•˜“—™””•–——“••–•——“”–––——•˜–”–—–’“•“–‘�‘“”�‘•’’–’’”••‘”’““�“’�“–••“”‘��‘”–““““’����‘“–‘‘��”””Ž��’’Ž�“�‘“‘‘‘�‘‘�‘‘“““�Ž����”’‘���’�ŽŒ�‘‘‘“�Ž�‘‘‘Ž�’���“��‘‘Œ�Ž’�Ž�‘�‘�Ž�’�‹�ŽŽŽ������‹�Ž���‘ŒŽ������‹�‹Œ��Ž�Ž�ŽŽ�‹‹�ŒŒŒŒ��ŠŒŒŽ�ŽŒ�‹Œ�����‹�Ž�Ž�ŒŽŒŽŽ�ŠŠ‡‹‡‹…Š‹‹Š�‹ŽŽ‰��މ‹Œ�Ž‹ŽŠŒŒ�‹�‡�‹�ŽŒ���‹������‹Œ‰ŠŒŒ‹‹��‹ŽŽ�ŒŒ‹�‰Œ����‹Š�ŒŽ��Œ‰‰‹Ž��‹Œ���Œ�ŽŒ���ŒŽ���ŽŽ’ŒŠ�‘‹‹ŽŒ‘���Ž����‘�ˆ|pYJO\eh\V`s~†ˆŽŽŒŒŽ“”’�‘’�••’’–’“’’’��©¦©©ªªªªªª««¬­­«®®®®¬««ª«§§§§§¡£¤¥¡ ›�Ÿ�›¡›Ÿ��™–™››  ›ŸŸ�›š•œžž™—™�˜›˜š˜››—šš™šœ›˜˜š™š—˜˜›–––›—™™™–œ•˜˜˜˜—”™––•—–••—“•“–˜•—“—“––—”–””•—–“••“““””•’’•”•–”“––”—”‘���“”’”“•““““�’�‘–””’•�”�Ž�’“‘“’‘‘““‘�’�“�‘‘�‘’“��’����”’“�’�‘‘�‘�“”�“����‘ŽŽ�’’‘‘�Ž�‘’’”���”‘’“•‘���’’‘Ž’‘���“‘��Ž������ŒŽ�ŽŽ���‘�‘��ŒŽ‘���Œ�ŠŽ�Ž�‘ŒŒ��ŽŽ���Œ�ŽŽ��‹��”Œ��ŽŽŽ�Œ�Š‹‹��ŽŽ�‹‹ŽŒ‹�‹‰‹ˆ…Œ‹Œ��‹�ŽŽŒ�Š‹Œ�ŒŒ‹�Ž‹�‹���‹Ž�ŽŽŽ�ŽŒŒ‰Ž���‹Š‹ˆ�ŠŒŒ��‹Œ��Љ‹�‹��ŒŽŽ‹Š‹���‘�‹‡�ŽŒ�Œ�Š�‘Š�����Ž“‹�Œ�Œ�‘�ŽŒ’�‘��Ž�‘’������‹„t[PMR]bZQ]ny„Š�Ž���“’’’“�‘’“’’–•“‘”“‘’�¨ª©ªª©ª¬««ªª«®¬­­­­¬®­¬¬©©¨¨ª¨££££¡£�ž�žœŸ��››�š›œ��žŸŸ ��—˜š›œš˜œ™™šš–™˜œ�˜™™˜š™š™˜›š˜•———˜“™—™›˜™–—••˜˜—•˜•—•–™—™”•“’•–•”••—•–’”–—“—’•’™•———’“”‘••”•”’—””–’”�‘��”“•’’“—•“�’�Ž�•�‘’‘•���Œ�‘““����‘’�“�‘’��’�‘�“��������‘�’‘����’�’’’�‘�‘‘�‘‘����‘‘��“’‘���“’’”‘�‘��’““Ž’‘������Ž�ŽŒ���ŽŽ���‘��‘��Ž��ŒŒŽ��ŒŽ�Œ���ŒŽ�‹��‘‘ŠŽŽŽŒŠ��Ž�����’���Ž�‰��‹ŒŒ�‘��Ž�ŠŒ‹�Ž‹�Ї‡‰Š‹ŒŽ�ŽŠŠ�ŒŒŒŠŠ‹�‹��Š‹Œ�ŠŒ�‹���ŠŽŒ‹‹ŒŒ‘�‹ˆ‹�Œ�‹‹Œ‘ŠŒŠŠ‹�ŠŽŒ�ŠŽ�ŒŒ‹Œ�Ž‘�Œ�‹Ž�Œˆ�‹ŠŒ��ŠŽŽŒŠŒŒŠ‹�‰Š�‘��Œ����ŽŒ�’����‹Œ�†z`IJUTTQPYg{„‰�’‘“�Œ‘Ž‘’”’‘‘�‘“•’”�•’‘‘ާ¨©«©«©«ª«¬¬®«­¯¯°®®­¬¬ª¬¨¨¨©­£¢¤¥Ÿ ¢ œ¡žž œ›��››š�ž žžŸ¡�™—œ›œœœ˜š™š–™š™™šš™˜›šššš››™—˜˜–˜—–—›—š–›–—–˜˜–—“—”–™•••—•–”’’•”’•••“•–—–——•–”“•••––”’““‘–••”“•––“““�‘”’‘––••“š™“��‘�’’�’”””‘’“��‘�““����‘“’”’�Ž�•��“�‘���Ž��“’������’�’“���’�’�‹�‘‘‘Ž‘�‘�‘‘“‘�Œ‘”“��”’��‘”‘�“��Ž�‘Ž�Œ‹’�‘����ŽŽ�Ž��������ŽŒ���ŽŒ�Ž��ŽŽŒŽŽ‹�“ŒŽŠŽŒ��‹‹‹’�‹Œ�‘����������ŽŒ�‹Œ���‹‰ŽŒŒ‹Š‰‰Š‰‰Œ��Ž�‹Ž‹ŠŒ�Œ‹Žˆ�Œ‹Œ�‹Ž�‰����‹��ŠŠ†‹Ž�ˆ�‰Œ��‹ŒŒŒ���Ž‹Œ�ŒŽ��Œ�Ž�‹ŠŒ��ŽŒ‹Œ����Œ�‹‰Š���ŒŒ�Œ‹‹�ŠŒ�Œ���’Ž�Ž�Ž�Š‘��’��Œ‹ˆfJGKQJGISet�Š‹��“��’�“�”’–‘‘�‘‘�”’•’““‘’¨¨©¬«©««¬««­­«­®¬®­®­¬¬©ª¦¨¨ª¨£¡£¡ ¢  Ÿ�Ÿžž�ž›¡žž›��œŸŸžŸ››™Ÿ¢Ÿ™›�™š™•˜™™œ˜™˜™š——˜••œ˜—–™—™—–————”œ™—•—–š——•’—™––”•––”–““•–—––•”•–—™–——’“•““•”’““’’“–““•–“’‘’�“‘–�’“–“’”’™“‘�”�Ž‘’�••‘’“�“‘’�”““��“““•”’�‘�‘�“��‘��Ž‘’�Ž�‘�Œ�������‘’’�’�‘ŠŒ�����•��Ž’•‘���“�•Ž“‘ŽŽ‘‘����Ž�����Œ���Ž�Œ�Œ‹�‘“���ŽŽ‘‘��Œ‘����’�����‘ŽŽ‹���Œ�‰��ŒŠŒ‹ŽŒ��������Œ�‘‰Œ�ŽŒ�����‰‡†‹ˆŒ�‰ŠŠ�Šˆ‹�Ž��ˆŒ��‰‡‰Œ‹ŒŒŒŠ����ŒŒŠŒŒˆ�‹‹Ž†Œ‹‹ŠŠŠ‹‹�‹‹‹�‹�����‹Œ‰Œ”މ‹ŽŽ‹�ŠŒ‹ŠŒŽŽŽ��ŒŒ‹‹‰ˆ��Œ��ŒŠŒ�Œ‰ŽŒŠŠ�‹Œ’Œ‹��ŽŽ�����‹Š‰„nO?EGGFGOav„ˆ‰‹���Ž�Ž�”�”•‘��“�‘��’‘‘’”•‘©¨©««ªª«ª«¬­­­®­­¯¯®­­«­¨¦©«©¥¡¡¢¢¡¡Ÿ  �œ� ž���›��žž›œ��œš›››£ ››››š›™““š˜šš———”–˜•–˜˜˜–™——˜”•š—˜––˜™•—••—˜•–”—––“”˜—”–•••“”•—•”—˜–•—˜—”“•“““••“”‘��•””“”’’’‘��’��“““‘•‘’’“’‘����’”•’“�‘‘•‘�‘‘•”�“’”’’”•�‘‘‘’‘‘Ž���Ž��‘’���Ž��‘��‘��““�����Ž���Ž’”�ŽŽ‘‘‘�Ž’�‘Ž‘’��“�������Ž‘’�‘Ž����ŒŒŒ�ŒŽ“���Ž‘’�������ŽŽ‘’�‘�‘‘���‘��ŒŠ�‹��‹‹Œ���ŠŽ��‹’‘‘�ŒŽŽ�Š�Š���ŽŒ�ˆˆŠŠˆ‰‰‰ˆŠ‡ŠŒŽ���ŽŽ‹‹‰Š‰‡ˆ�‹��‹��‹Ž‹‹��‹‰‰ŒŠ‹‰ŒŒ�Š�‹ŽŒŒ��Ž‹��Ž�‰‹‡‹‹�‹�ŠŠ�‰�‹����Œ����Š���†‹Œ����‹Œ��ŽŠŒˆ‰‰‹�‹Ž�‹ŠŽ‘“�����‹‰‚sVA@EC@JR`sƒˆ�����ŠŽ‘‘‘’’•‘��“‘“‘“�‘�”“••”¨¨ªª©ª©«ª«®««®°­¯¯¯­®««¬©§©¨§£¤¢¡¡¢Ÿ¡ Ÿœ›��šŸœšž�žž›š››�››™›ž��™š›š›™———˜šžœ˜—••–—˜™š—–˜–—–˜—–˜˜–•••–˜—˜——––“™™•™–“”—•“—”“–“”“—–—’—”——–”“•’–�“””––‘‘“•“’“�’’“�“’‘’’•‘’““‘�’“”“”���’–•�’“”’”��“”’�Ž•“•–“””“”�‘��‘’’�‘‘�‘�‘‘’‘�Ž�’’�‘���“‘�����”‘’��’�Ž‘”�‘��Ž�’�‘���������Ž‘‘��’‘‘Ž�’�Œ�Ž��’Ž�Ž�‘‘‘���������‘�‘��‹ŽŒ�����‹Ž��Ž��ŒŽ�ŽŒŽŒŠ���Ž‘‹�‹�Ž�‹�ŽŠ‰‹�Œ‹‹‡‡‰‹Š‡Š‰Š����Ž�ŒŒŠŽ�Š‹‰‹�‡�Ž��ˆ�Ž�‹���‹‹�Š‹�‡�ŽŠ�‹ŠŽŒŒ‹Š���ŽŠŒŒŒ‹Œ��ŠŒ�Š��“Œ�‹ŽŒ�ŽŠŒŒ���‹Š�Ž�Ž�ŠŒ�‹‰ŒŠˆˆŠ�ŽŒŽ‹‰‰‘Œ��‘Œ‹‰ƒqWB?AD?FUfv~‰��‹Œ�‘�Œ�����–‘‘‘Ž�“�‘�‘“’’’’“§«©ª«ª««©®¬®®®®¯­®¯°®ªªª©§¥§¤¦£££ Ÿ   �œššŸ�™› ���›››š�›œ™™˜šš˜—™››šœœ˜™š™››™š•šš›–—˜–—˜––———˜˜˜—š•–“”™—˜–š”“˜—˜—–˜–’‘—•‘”•�”—”“”–’•—–””—•••““–”–˜””“–”“”“’””�’—“‘“”�““•“’�““’�Ž‘�’’‘“’’”’�’“�•‘’�’“”‘”‘“””‘‘‘’Ž’��Ž��“�’”�’�”Œ“’‘‘’�”“‘”‘Ž�������“’�“‘Ž‘’�’Ž���‘�‘����‘�Œ�‘�‘’�‘Œ�Ž������‘‘����Ž����’Œ�Š�Ž•�‘����Ž�Ž��ŽŽ’����ŒŽ��Œ�Œ�‹��Œ��ŠŒŒŽŽ��‘ŒŒ��‹���ˆˆˆ‹‹‰‡ŒŒ�‹��ŠŠŒŒ‹‹Œ‹�ŠŠŒ�‹�Œ����‘Ž�Ž‘�‹�‹‰ŠŠˆŒŽ�ŠŠ��‰Œ��Ž“‘ŒŽŽ���‹ŠŒ��Œ‹����Ž�ŠŒ‹�Š���Œ��Œ�ŠŽ��Œ‰Œˆ‰‰ŒŠ‹Š‹��ŒŒŽ��Š��ІtYE>>AADUhx}‡�������ŽŒ�‘�Ž“”–“Œ�‘’�‘‘�”•““””«ªªª«ªªª¬«­­¯­¯­±®­®®¬¬©«¨¥¨§¤¥¢¢¡¡£ž �£ ›œ�›œœœœ�œ�šœš›™™™šš–™™——›šœœ™œ˜™š›—šš–˜š˜–™•–—––—˜˜š—––˜•˜•–“–”——˜—””—––™—”—–“’“’•–––‘••’–””“˜”–•””’“•——–”””“””’”‘•’’“””“‘“‘•“’‘�‘““‘Ž‘’’““••�‘‘�•“�’’‘‘�“•‘‘�“’’�’�“’’“�Ž‘’’�‘��““‘��’�‘’�””‘‘’Ž“�“�’’’”‘��”���’����Ž����‹������Ž�������‘�Ž‘‹��‘Ž��Œ�Œ��Ž��‘�����Ž�‘ŒŒ‹���ŽŽ’���‘�’����’Š�Ž�ˆ���‹�‹‹����ŽŽŒ��Ž��މ‡ŠŒŒŠ‹ˆ�ŽŠ‰�‡ˆ‹ŒŒ‹�‰‹ŒŠŒŠ�ŠŒ���Œ��Ž��Ž���‹ˆŠ‰Œ‰Œ‹Œ�Ž‹�ދޑ‘��Ž�ŒŒŽ�Ž�‰�ŽŒ‹‹‰‹Œ�‰�‹Œ�‹‹Ž�Š�‹Š�Œ‹ˆŽ��ŒŒ��‹�‹ŠŒŽ‹‹���ŽŒ†~sXB;?AEHSfx‚‹‡�‹��‘��Œ��Ž�‘”“‘‘����Œ��’�‘•‘”“«ªª«««««¬¬­­¯¯®®°°®°­®««¨©¦«¥¢¤¢¡££¢ ¡¢¢Ÿ›››œœ››š�›™˜œŸ›šš˜œ™šš™—™™š��˜˜›™—›šš˜˜•™––˜––•—š—•šœ�—–›”•–—––•–š•”••“”’––””•–””’””•––‘•’•—””�•–—‘“–’•––•—•”—–’’�’––’““’‘�‘‘’‘‘�‘’‘•“��‘‘”“”��Ž��’‘�‘’—‘�••“‘‘‘’’“‘�‘‘‘�‘‘‘��’‘‘”•�’’‘‘’�“‘‘‘�’��’�’“‘‘“’’�’“‘”‘�“�‘‘���Œ‹�’Ž‘��ŽŽ�ŽŽ�Ž�Ž��‘�‘Ž���ŽŽ‹Œ�Ž‘Ž�‘����‹��‘�Ž‹�����ŒŒ����Ž���Š�މŒŽ��Ž�‹��‹ŽŠ‘�Ž���Œ�’Ž‘�‰‰‹‰ŠŠ‹ŒŒ‹‹��ŠŠ‰ŒŒ‹‹ŒŽ‹ŒŒŒ‹‹Š‹Œ�Œ�ŽŽ��ŽŽ‘�Š�‡�ŠŠŽ���ŽŽ��Œ‘“���‹�‹‹‹‹��ŒŒ���ŒŒŠ‰ŠŒ“�ŒŽŠŒŒŠ�ŠŠ‹�ŒŒ‹ŒŒ‹ŽŒŽŽ�����Ž�‹ŠŒŒ‰‰�tUEJSYft~‚…‡€z{}ƒŒŒŠ���‹’Š‘‘‘��’“���’‘‘‘Ž“““”’”‘­ª©¬¬¯«­¬­­­­¯°¯°¯±®®­ª­¬§§§©§¥£¢�ŸŸŸž›�œ›š–››š™™›››››˜œš™™™™œ™š›�•–š˜š›™™œ——”˜˜˜˜˜––—˜•“•—š˜—“•–•—”“•–“˜”�‘�’•“”“•“”––˜”‘“’’–••””’”“•’’“’•”��‘“”“‘‘“”�‘“”“’‘““‘””�‘�‘”–��‘“’’“‹�‘“”–“‘’•’”’’Ž�‘‘‘“”’’’‘’‘Œ�����‘’��“‘’’Ž���“�‘’“�•�‹Ž����‘ŽŽ�‘��’’’��Ž““�’��Ž���‘����Ž‘ŽŽ��‘’“�‘����Ž��ŽŽ‘‘‘�‘��Ž���ŒŠ�ŽŽ‹Œ�ŒŒŠ‹�Ž�‰Œ‹Œ‹Š‹Œ‹‹Š‹‡�Ž��‡‹‹Œ��‰�Ž‹��Œ���ŠŠŒŒŒ‹ŒŠ‰ˆ†‡‡‹‹‰‰†ˆ‹‹ŒŠ‰Œ‰Ž��‹ˆ‡ŒŒŒŒŽŒˆ‹ŒŒŽ�ŒŒŒŒ�ŒŒ‹‘‹‰Ž��ŠŠ��‹‹‹Œ‰�‹‹ŽŠŒ����Œ�‘Ž�ŒŠ‰‰‡Š��Ž��ŒŒ��ŠŒ���ЉŒŒ‹ˆ…ˆˆ�‹‹ŒˆˆŠ‡~m[GA?IS^fsz‚‚€}vw~„ˆˆŽŠ���‹�ŽŽ’�‘�Ž’�Ž��““��Ž����–‘ªª«¬¬¬¬­­­­®®°¯¯¯¯®°¯­ª®©©¦©«¦¢¡§ �žš¡œ�œ˜™™›š™™�›œ›››œ™™šœ™›››šš�––›™—œ››˜›—•™™——™•–—˜—“—™™—•˜––—”“”––••“��‘”””””––––•––“’—”””—”“—•‘‘“�‘�‘���’“‘“‘••’��’��•”‘‘“••’’’“––’’‘“”�’�‘”“”–’’‘�’““�’’“‘’�”�“‘�’�Š����’‘’””“’‘��’��‘��“’’“���������‘�‘‘�‘��Ž�‘•‘‘Ž������Ž‘��‹�������‘�‘���ŽŽ�‘Œ��������‘ŽŽ�����ŽŒ����ŽŠ���‹ŠŒŠŒŠ�ŽŠŠŽ‹��‹Œ��Š‹‹‹Š‹‹�ŒŒ‹Ž��’��ˆŠŒ�Š�‡…‡†…ˆ‰‡‰ˆƒˆ‰‹‰ŠŠ�ŒŒ�ŒŠ‰‹‹ŒˆŒŽŠŒŠŠŒŽŽŠ…‰‹Š‹�ŽŽ‡‰���Œ�Œ�‰ŒŒŽ‰‹ŒŽŽ�‹‹‹‘����Œ‘ŒŒ�ŒˆˆŽ‘�����‹ŒŽ‹‰�‰�‰‰ˆŠˆˆ‹ŠŒ‹‡‰‰„‰‚pVG<>ET`ju|~vqy�…ˆ‡Œ‹ŠŽ‘‹ŒŒ��‘��ŽŽ’��Œ‘’�Ž�‘‘ŽŽ���«ªª¬«­«ª¬­­®¬®°°°¯°®®ª­«ªª¦¨¤¥¢¢Ÿ¡žŸ¡žŸžœ�››Ÿžœ››ž›››™—™œ™˜š›š——››šš––˜™š˜˜˜—˜˜˜š™˜––™––——˜™™•–™•–•‘–••“•’”•“˜“••”””–••š˜”’””“”—“•“”’�”�“’“‘“��’’’�‘••�’�Ž�•’”�•�˜’“““’–””�‘”‘�’’”‘“’•“��’”’’‘‘‘���‘‘�’’‘�Ž�Ž���‘‘“‘”���’��’�ŽŽ’’’��ŽŽ���ŒŽ���’“‘‘Ž�’�’�‘�‘�ŒŠŽ�Ž�‘�’�Œ�����‘��‘����ŒŽ�‘‘�Ž��ŽŽ������‘��‹ŽŒ��ŽŒŽ����‹‹�ŠŒŒ��ŒŠ‹�‹�‹‹��ŒŒˆŒŒ���Љ����Ž�‰‰��ŠŠ†…†‡‡…ŠŠˆ‡†ˆ‹ŒŠŒ‹‹�‰�ŠŠ‰ˆŠˆ�Œ�Š�ˆŽ‹Œ��‹ŒŠŠŠŒ‹Œ‰Š�‹�‹‹�Š‹Œ�Œ�‹ŒŒ‹���Ž‹�‹��Š‘��Ž‹‹‰‹Œ‹�‹�Œ��Œ‰Œ‹‰‹‹‰ŠŠŠ�‹ŒŠ‹‰ˆƒsXC?CKSZepsxsnkuyƒ…‰Š��‹Š‹‹�‘����‘““�ŒŽ���ŽŽ�‘“‘‘Ž�‘‘’“ª«¬ª¬¬­¬«­®®°®±¯²±°°°­«­¨¨§§¥£ª¤¡¡Ÿ��œ �™›š�›—˜——–™š˜››˜˜•–—™ššœ˜–œœ�”–—™–›–””•–—––˜––˜–™——˜–—••—”•”””‘•““˜”–”—�•™––˜—–““‘�““””’“”•“Ž�•••��‘••“˜�“����’’“’’���‘“’’’‘”•’’—“‘““•‘‘Ž�’Ž’’‘””���’�“‘’’Ž‘’’•’��‘‘�”�‘’���‘�‘’–���‘’��‘���Ž’���Œ��Œ��’���‘�“‘’�‘���Ž��ŠŠ�Œ�Œ‘‘Ž�‹ŒŒ�ŠŒŒ�Ž��‹����‘�’Œ‘�‘ŒŽŒŠ�‘Ž��Ž�‹ŽŽŠŒ�Ž‹���Š�Š���‘Ž�ŽŒ‹Ž‹�ŠŠ���ŒŒ‹‹ŒŠŠ‰‹�‹Œ‹Š‹ŒŒŒˆ‰‡‡‡Š‡‡ŠŒŒ‰ŒŠ�ŠŠ‹ŒŽ‰Œ�����‹‰†‹ŒŒŠŠŒŽ‡‰��‹‹ˆ‰‹�Œ‰‹ˆˆŠ��ŽŠ‹ŠŠ‡‹�ŠŒˆˆŒ‹ˆ‹�މ‰‰ŠŒŠ‹�Œ‡‡Š…‡‰ŠŠŒŠ‡ˆˆˆŒ†ŠŠ‹Œ‡†…ƒ{fTGADMS[jsqromiq~†ˆ‰��Ž��‡�‹�‘��’�‘���Ž‹Ž�“”�’•’““�‘��‘’ª«ª¬««®¬«­®­°®±²°±¯±¯­­ª¨§¦¥¢¤ª¬¢ž¡¦Ÿ¡žœž›š˜™–š˜––˜š™›š˜”——š–—Ÿ ˜–˜™š”–››———•”˜–•”–”•—•—–—”˜˜˜–•—–•“˜–”—““•–’“““••””˜•–”””•““•–•”••���‘’’’’‘’”–”–“”“��•�’’‘���‘“‘“‘““”�“‘’’‘”““��‘��’’�’’Ž�‘�‘”””‘‘““��’��ŽŽ’�“‘‘��‘“��‘–‘�Ž’‘Ž‘‘Ž��‘‘�Œ���‘���������”��’ŽŽ�ŽŽŽ‹‹Œ����’“ŒŒ‹�Œ��‘�Ž�ŽŽ�Œ�‘��‘�ŽŒ�Ž‘‹‹�Ž�����“�ŠŒŒŒ��Ž���ŒŽŠ���Œ�����ŒŒ‹‰‹‹�Œ‹Š‰‹ŒŠ†�‹Š�‘މˆŠ‹‹ˆ‡†††ˆ‰�‰‹‹ˆ‹‰‹‰‹‹Œ�‹�ŽŽŠ‹ˆ‹ŒŒ�ŒˆŠ�‹�ˆ‰�Œ‹ŠŠ‹�Š�Š‹ˆˆ‰‹��‡ŠŠŒˆ‰‹ˆ‡ˆ‹Š‹ŠŠŠŒ‹ŒŠ�‹‹Š�‹‹ˆŠ‡‹‰Œˆ‰‰†‰‚„‡ŠŠŠ‡‹ƒƒ|tdRGEIUX`fpmlkoot}„Šˆ‰���Ž�‰Œ�‹Œ���‘‘�‹���‰�‘�‘�’�”‘‘’���Œ«¬««ª¬¬«­®­®®¯²¯±®°¯¯­­©§¦¦§¥¢¥¨£ž Ÿž�ž��œ›–—˜”——™—˜�šœš–—›˜˜˜˜œ˜—šš˜™—šš––™•“•–•“”•šš––––˜–˜™•””——•˜••—””•”•••”˜”“•–˜•—•“””“””•”“‘��““‘‘�“–��““”•�Ž‘�’�’‘”Ž’�““““�”’’”•“”“‘‘“Ž”�‘�‘‘�“‘���“‘�‘Ž’’’’’��“�Ž‘ŽŽ‹‘’“‘’�‘���‘���‘’‘��’�‘‘��������‘��Œ�Ž�’Ž����’��ŽŽŽŽ‹Ž‹���‘�Ž������‘’‘��‹��Ž�Ž�ŒŽ�Œ�Ž��‹����������ŠŒ‹�“Ž��ŒŽ������Š��‹Œ�ŠŠ�‹ŒŠ�‹�Š‹�‰Š‹Œ�Ž�ކ‰Š‡ˆ‰†ˆˆ‰‰‹‡ŒŽ‹ŠŠ‹ˆˆŠŠ‹‹Œ��ŠŠ�ˆŠ‹�ŒˆŠ�ŠŒ‰Š‹‹‹Š‹‹Œ‹‹‹Š�ˆˆ��‰Œ��Œ‰�ЇŒ‹�ŒŠŒ‹��Œ��Š��ŠŠ‰†ŠŠˆˆ‰Œ‰‰‰‹Šˆ†ˆŒ‰‡†„€uk^RLGJUZhlilhems{}…ˆ‰‹‹Œ��Œ����Œ‹�‹��Ž�Ž‹�Š��”‘’’’‘‘”‘’Ž“’�©«©¬«­ª«¬®­®¯±±°±±°°­®®¨¨¦ª©¢ ¢¥  œ Ÿž�ž�›œ˜š™–š›š™˜™—š———›˜œ——š–˜›™—š——–—™˜–š“–—•—–˜•“”–“––—–•••”•”˜•—•—“”•—”••’•””–—”˜“–“�””””‘““��Ž‘•‘‘’�‘•‘—””‘‘Ž‘‘’”‘‘’”�’’�‘‘’“’‘“’’’”’’”’�’���‘‘‘’��’‘����“‘Ž’’•‘‘�‘ŽŽ��”Ž��Ž�’’�Ž‘‘”‘�‘�Ž��‘�����Ž��“ŽŽŽŽ‘‘Ž“ŒŽ‘‘‘ŽŽ��ŒŽŒ��Œ�Š�����’‘‘���‘Ž������ŽŒŽŒ����‹��‹�ŠŠŠŒ��Ž�‹Ž�‹Œ�Ž�Œ‹���ŽŽŽ‹‹‹�‹‰�‰Š��Љ��ŒŠŒŠŒŠŒ��Ž�Š‹ˆ††‰‹ˆŠ‡Œ‹ˆˆŠŒ‰Œ�ЉЇ‡‰‹‹‹ŠŒ‹ŠŠˆŠ�‹ˆ‹ŽŒˆŒ‹ˆˆŠ‹���Œ‰‰�‡ˆˆŒ‹ˆŒ�Œ‰ŠŒ†Œˆ‹‹�‰‹ŠŠ‹������ŽŠŠ‡…‡�Š�ŽŠŠŒ‹‹‰‰…І…~zncRNJOMX[emmibdkv€…„‡ŠŠ‰Œ����‹�Ž���ŠŠ��Œ��ŒŽ‹Ž�‘��“�‘��’‘Ž���«¬¬«¬«­­­®®±®®°±°°°¬°¯««©«­¨¤¢¢£¢¡  ¢œž� œ—šœš˜™›˜–›˜–™š“™˜�–š——™š£ž——–˜––˜™šš˜”˜”™–™••”––••”——”””“’”–š••“”’–•—–”•”•—••—”’”“•”“���’‘”’�‘‘‘’““””””�‘‘”“Ž�‘‘�‘•’Ž•�‘‘“““’”••“’’’�’’‘’’’‘’’’�‘‘’‘‘�’’�‘‘���Ž��‘‘��’��Ž�‘�’���’�”�’��Œ��‘‘�ŒŽŽ�’‘’Œ��‘�’Ž‘�–—’����Œ���ŽŽ���Ž����ŽŽ�Œ�ŽŒ‘‘��Ž�Œ�‹��Œ�ŠŽ�Ž��‹‰ˆŽ‹‰ŒŒ��‹ŽŽ‹ŒŒ‹‹�Ž��Ž‹Žˆ�‹‹ˆ‹‰Œ�Œ‰‹��ŠŠŠŒ�‰���ŒŠŠ‰‡‰‰‰Œ…ˆˆ‹‰ˆ�Š‹‡‰ŠŽŠ‰‹‹ˆŒŒŒˆŠŠ‡‡Š�ŒŠŠ‰‹Š�‰‹Œˆ�Ž‘�ŒŠ‹Š‹ŒˆŒŠ‹‹‹�Œ‹‰Š‡‰Œˆ‹ŒŒ‹ˆ†ŒŒŒ�Žˆ‹Œ�‹…‰Š‰‡�‹Œ‹‰‰†‰ˆˆ†€{skZTKOQY]_aaebeelu……‡…‡ˆ‰�ŽŒ��ŒŒ‘‘���ŒŠŠ���’��Œ�����‘‘”‘���Œ’‘�ª¬«©¬«®­­®¬­°°°¯°±®­­«¬©ª«®£¥§¡ � Ÿ¡¡›œœžœ™™�™›šššš–˜–”™™š™™™—™šžœš—™™”—”—•š˜š™–•˜”˜˜˜–’’•““”–”–•“’“–––””’–“••–••“•–••’”’’’“’‘•“��‘��‘‘‘Ž”’““””‘‘�‘’““Œ’���““�‘”�‘�‘’��‘‘–”–‘‘�“’��‘‘‘‘”‘�’”�‘������”�‘Ž�‘‘�Ž�‹����Ž’��‘������ŽŽ‘���’“�Ž��‘��’‹�‹Œ���‘—˜••‘����‹Œ’‘‘‹����‹Ž‘Œ�‡��ŒŽ‹‘����Œ�ˆŽŒ��І�Ž��ŽŒŠ��‹Š�‹�����‹‹‹ŽŠŽ�‘�Ž�ŠŽ�ŒŠ‰�Œ�‹‹Œ‹Œ�Š‹‹�‹Š��Œ‹Š†‰‹ˆ††‡ˆ‰‰ŠŠ��‹Ž‰ˆ�‡‰Œ‹Š‰‹ˆˆ‡‰‹ˆ�‹Œ‰Šˆ‹Š‰†Šˆ‹‹�ˆ�‹ŒˆˆŠ‰Œ‹Œ‡Š�‰ŒŒŒŒ‡ŒŠˆ‹ˆ‰‡‰Œ‰‹Š�‹‹ŠŠ‰‡ˆŠ‹‹Œ‰‹‰‰‰…‰‡�‚}ugXSQTSS[`b^\XYagr}‚ŠŠˆ…†‡‹���Ž‹Œ‘����‰Œ���‘Ž‘����ŽŒŒ����‘��Š�Ž�Œª¬­¬­­­¯®­­®°°²°°±°°¯®­ª§§¨¤¢¤¡¡Ÿ�œž œœ�œš™šš›™™ššš–™—™–˜›˜—˜———›š––”—˜”–””™•–˜š™—–—’—•”––—•••—–•’’’••••–•“•“–—‘”””–””’””•“““”‘‘Ž“’�‘““�’’““‘•�”’�’’��‘‘�‘�Ž“‘Ž““’‘‘’Ž”�’“”“”‘‘‘’���“‘‘’“‘‘��’�Ž‘‘”‘“’Ž���Ž�‘Ž��‘���‘�Ž���’Œ���Œ’‘‘’�‘��““‘�Ž���‹�ŽŽŽ’•–”“��‘��Œ‘‘‘��Ž���ŽŽ���‹�Œ����‘���Œ�‹Œ‹ŒŽ‹‹‰��Ž�Ž��“�‡‹�ŒŽ‹�Ž‹Š�‹‹‹��Ž�‹‹Ž‹ŠŒ‹‹�Š‹‹Šˆ‹ŒŠ‹ŠŒŠŽŽŠŠ‹‹‡ˆ‹‡ˆ…†ˆ†‰‰��ŽŠ�‰‡Š‰ˆŒŒŠˆ‰‹‰Š‹ˆ�‹Š‹ˆˆ‰�‹‰‰‰Š‹Ž‹Ž‰‹ˆˆˆ‹ŠŠŒŽ‰‰Œ‰�‰Š‰‰‹‹ŠŠŠŠŠ�ŠŠ‰Š‡Š‰ˆ‹‰‹ˆ‰‹ˆ‰ˆŠ‰†‡ˆ„ƒxxraTJMOUY[Y^ZYWZ`kuƒŠ†�Œ…†‹ŒŒ‡Ž��ŽŽ•�‘��Œ�‘‹�����‘“‹�‘�‘���Š�Ž����ª¬ª«¬«¬­«­®°¯±¯°±±¯®­«©©ª¦¦¢¥¡¡ � ž›œœ��›�™›™™š›˜—•™“™˜–——™—šš—•˜—””––—•––––––—˜˜—–”–”–’•––™—•—”•‘”’”–––•”‘”•’“”’”’’”’�’“”””���‘��““’‘’‘’Ž�“‘’”�‘‘‘�Ž��‘‘�‹�’““Ž’”“���‘•�”�‘��Ž��Œ‘‘���“‘’�������‘�‘‘”�����ŽŒ�Œ���Ž�‘‘‘�Ž�’�Ž�’��‘‘‘’����’�������Ž���Ž’‘�‘����������Œ�‘Ž���ŽŒ�Ž�ŒŒŒ�ŽŒŽŒ����ŒŒ‹Ž�ŠŒŠ��Œ��‘��‰Š‹���Œ‹�ЉŒŠ�Ž��ŽŠ����ŠŒ��‹‹‰Œ�ŒŠŽŠ�ŽŒ�ŒŒŠ‰Š…Љ‡‡„†‰‰‹Œ�Œ‘��‰Š�…ˆŒ‹‹‹Œ‰‹‹‹Œ…�Œ�‡‡Œ�‰‹ˆ‹�ŠŒŽ�ŠˆŠˆˆŠŠ‹ˆ‹‡ˆ‹‰‰‹‰‰�Š‹‹‰‹�‰ŠŒˆŠˆ†‹‰ˆŠ‡Š‹‰‹‰‰ˆ‡ˆ…ˆƒwndVPLLOV[b^[[WRZiu|�‚†‰‹Š‰�Šˆ�‹ŒŠŒŽ���‘Ž‹ŠŒŽŽ�Œ�‘ŒŽ�‘�Ž�Ž‘�ދБ�Ž���ªª¬«««®®®¬¯°¯±±±®±±®«ª­ª§¦¨£¤ ¢¢ŸŸž¡›šžšœ ™›™™š™™˜–š•––—™˜—“˜——–——––“˜–—˜•–•–—–™——””•“”””—”™—”•””’•—’••””�‘“–“‘“”“�’”‘“‘’‘�“•‘�ŽŽ’�‘‘‘’”��‘Ž���—•’’ŽŒŒ‹‘‘���’‘�“”�‘‘��’�“��‘��‘’‘Ž���‘‘��������‘���‘‘�Ž��Ž���Ž��Ž�Ž��‘��’Ž‘���‘�‘���‘‘ŒŽŽ����‘‘Ž‹‹�����ŽŒ��‘���Œ�’�Š�����Ž�ŽŒŒ‹Œ�Œ���ŽŽŽ‘“��ŒŠ�‰Ž�Š�‘����‘�ŒŒŠ‹Š�ŒŠ�Š�ŠŠ‹Š�ŽŠ�ŽŒ�‹‹ŒŒ�Œ‹‹Œ�ŠŠ���ŽŒ‰ŽŠ‹‹ˆˆ†Œ†ˆˆ‡‹‰††Ž����ŠŒŠŠ„†‰‹Š‹��‹�ŠŒŠ�ŽŠˆ‡‹Œˆ‹‹‹ŒŽŒ��ŒŠ‰‡‰ŠŠ�Œ‹‡ˆŠ„‰Œ‹Œ��‰‹‰�ˆŠ†ˆ‡Œˆˆ‹‹‡‰‰‡‰‰Œˆ†††‡‚�xsg\PLKNQS]a`_YY]_ixƒ†††Š‹‹�‡†ˆ‹‹��Ž�‰���Œ�ŠŠ‹���‘��Š�“��‹‘��Ž��‰���Ž�’­«­©¬¬­¬­°®¬¯°²¯®²±¯®«¦§§¦©¤¢�¢¢ žšŸ¢›˜š��›š™–—›–—–™˜™–šš——•‘–•™˜™—™˜–•“š™˜˜˜–—˜˜––“–’‘“““•””—““””–•’“”•’•“‘’”‘�““‘�“’’‘‘”“”�‘”“‘’”���”‘‘�‘‘’�’“’’‘����’Ž�‘‘“�’ŽŽ‘Ž��‘‘‘“��‘�’’‘’“�‘�’’�‘Š‘��‘��‘‘‘‘�‘�ŒŒŒ‰��‹‹“���Œ�Ž������ŽŽŒ����“�ŽŽ��������Š�‡��ŒŽŽ���Œ�ŽŽ�Ž��ŽŽˆ���ŽŒ���‹��ŒŽ�‹�‘‹����ŒŒ‹ŒŒŠ�ŽŽ��Šˆ‹’ŽŠŒ‹��ŒŠ‰‰ŽŒ���‹�ŽŠŒŒ�Š�‹Ž‰ŒŒ‹Š�ŒŠˆŒŒŽ‹‹‰‰ŠŒŠ‡ˆŒ†ˆ‚ЉŒŠ‡†ŠŒŽ�ŽŒ‰Œˆˆ‹‰‰‰ŠŠ‹ŠŒ‰�Œ��‰ˆ‰ˆ‰ˆˆŒ‰‹�‹Š‹ŒˆŒ‡‡‰ˆ��‰�Œˆ‡…ŠŠ���‰ŠŠ‰ŠŠŠ†ˆ‰‰ˆ‡‹‡†††‡‰‹‡…~‚„zsf[SNHMOQQVZ\]ZWaknx„ˆ‰‡…†ŠŒˆ‡‹Š�����‹‹Œ�ŽŠŒ�‰‹�‹‹’��ŒŒ��Œ��‘��ŽŽ�Œ�ŒŠ‹‹«ª­­®­®¬¬°®­±¯²°±²¯¯­¬©¥¥¦¦¢ž   ›œ ¡�œš›�™˜›•—š”——š™——––š–’–“–——•˜˜•••“–––—š™™š™–”—–•”“•’–’–’’“”’••“”—–””’”””””•”””‘‘’—�–””’““–‘‘‘���‘‘“‘’��”‘‘�‘”‘‘“�‘Ž’����Ž����ŽŒ�‘’���Ž‘“��”��‘‘–‘‘�‘Ž��ŽŠ�Ž’’’�Œ�����Œ‰‹Œ�‘���‹���‘������Œ�Ž����Ž�‹‹Œ�’���‹�‹Ž‘‹Š’�ŒŒ���Œ�ŽŽ‘’�ŒŒ‰�����Ž‘ŠŽ‹‹Œ�Ž���‰ŒŒŒ��‹‹†��ŒŒ�Š‹Œ��ŠŒ‹�‹�‹‹‹ŒŒŒ�����Š‹�ŒŒŠŒˆŠ‡Š‰�Œˆ�‰�ŒŒ‹‹Š†ˆ‰ˆŠˆˆŠˆ…ˆ‰ŠŠˆŠŒ�Ž‹�Љ‹ŠŠ‰‹‰‰ŠŠˆ‹‡‹‹‰Š‹‹‡‰‰‰‰‡‰ŒŠŠ‹‹Œ�Šˆ†�‡ŒŠ‰Š�Œ‰ˆˆ‡ŠŒ�ŠŠ‰‹Œ‹‰‰‰‹Š‡ˆ‰‰‡ƒ…‹‰Š‡ƒ�}zui^RKMNNSSSQRSY]`hlx~ƒ†‡Š†ˆ‰‰Š‡†‰‘‘����‰�ŽŒ�Š‹�Ž���Š��’Œ���‘�Ž‹�’�‹ŽŒ�Ž���ª­««¬­«¬­­­®±°°°¯°®­­¬«¥¥¥£ ¡¡¡�œž�žž›�š››š–™–———š—›˜•”•–˜••˜”——˜•—’•—–•“—–™—•�ž—•–•–•“’–‘’”–”’�”™•‘”™’““�“–““““•”–”‘•““‘‘”‘‘“•”‘‘‘����‘�’�Ž��‘�•–”’�‘’��‘�ŽŒŠ����ŠŽ‹��‘�ŽŽ‘‘�Ž‘‘���“’’��Œ���‹Ž��““’��‘�Ž��Œ‹�‘�����Ž�������Œ�ŽŠŒ�‘�ŒŽŠ‹ŒŒ���’‹‹‹‰�Œ�ŠŒ��Š‹�Œ‘Ž���“ŒŽŒŒ�‹��Ž‘Œ‹‹ŠˆŒ�����ŠŒ���Ž�Š‹�Ž����ŠŒŠ‹‹ŠŠ‹ˆŒ�ŠŒ�ŽŒŒŽŒŒŒŠ‹ŒŒ��ŠˆŒ‹Œ‹‡‹�‹�Š‹‰ˆ†Œ†‡‡‹ˆ‰…‰ˆˆ‰‰‡ˆˆ‹�ŒŠŒˆˆ‰Š�‰Œ‰ˆ‹Šˆˆ‰ŠŠ‰‰‰‰‡‰Šˆ…‰Š‹‹‰ˆˆˆŠ‹ˆ‰‰‹Š‰‡ˆˆŠŒ‰††ŠŠ��‹‹Š‹‰‡‰ˆˆ‰‰‰†‰‡…„‚‡‰„„vqg\WOJLPSQZZVSUZ_krz€‚††‡†ŠŠŠˆ‰‡„ŒŒ��ŒŽŠ‰����‹ŒŒŽŽ�Ž‘ŒŽ�“�’�‘���Š��ŽŽ�Œ�Ž���«««¬«¬«¬¬­¯°¯°±²¯°±­¬­«¨©¤¢¢¡¡ Ÿžœžž�›œ™šš›šš™˜•š˜——˜”–’“˜’”••––•—––’”“–“”—––”˜›••–“•–’“—“�”–“‘‘’–“”’”““‘““’“““‘•�”••““Ž••”‘”’�“‘‘‘�‘“���’���‘‘‘“•“�“��•��‹‰‹Ž��‘�‹��‘���������‘‘�‘Ž‘�“����������“�Ž‘ŽŽ�Ž�‘�ŽŽ‘�’�Œ��Ž�‹��‘ŽŽŽŽ��Ž‘�Œ‹�������‘‹Œ‹�Œ�Œ���ŽŽ��Œ�����‘���‰‹Š‰Œ�ŠŒ‹‹�Š�Ž’�Œ�ŠˆŠ‹ŒŽ��ˆ‹�‘����‹�ˆ�Š‹‹‰ŠŽ‹��ŽŽ‰ŠŠŒˆŽŠŒŒ���‰ˆ‡‰ˆŠˆŠŒ‰‹‰ŠŠ‰ˆ‰‡ŠŠ‰‰ˆ‰‰‹‰‰‡ˆ‡�Œ…‰‹ˆ‰‰Š‰ŒŠ†ŠŒˆ‰‰Œ†‹‹ˆ‰‰Šˆ‹ˆŠ‰‹‰�Šˆ‡ˆ‹‰ŠŠ‹ˆ‹ˆ‰‰‡Š†‹††ˆ��ˆ‰‡Š‰Œ‹ˆ†ˆŠŠ†„‰‡ƒƒƒƒ€€}qf\QONMOQRVTXZZV^iu|~„ˆ…ˆ‡‡‡‰�‰ˆ‹†‡ŠŽ��‹�‡‹ŒŒŒŒŠ‹ŠŒ’“�‰��Ž�’’“‘ŠŽ�����ŽŒŽ�‹�‘�ª­«­©«®¬®®®°¯°¯°¯°®®«««©¥££¤Ÿ¢žŸ��››œœ��šš›™››˜™–—••–”˜––”—™””•–—––•—““•—•”—”””’“––’”–“�’”�’–’‘‘””–“•””“’�’’““–’‘”�•””�‘‘‘‘“’”Ž�‘““’‘’“�”‘��‘’��‘•‘“Ž’�‘‘’��‹��“�‹Œ“���������ŒŒ�ŽŒ�‘��‘”�ŠŽ��������‘‘’‹ŒŒŽŒ‘Œ‹Š�‘‹�ŽŽ����Ž���Ž�‘Ž��ŽŽŒ�������ŒŽ‹���ŽŒŒŒŒ�‹���‹ŽŽŽ�Š�‰�‹ŽŒŒ‹Ž‹�Ž�Œ‹��‘��‰ŽˆŠ‹‹‹��Œ��Ž��Œ�ŒŒ�Œ‹��ŠŒŽŒ‹Ž‰ŠŠ‡‡Œˆ‹ŠŽŒ�Œ�ŠŠ‰‰‰ˆ‹ŠŠŒ�ŒŠ‹‰†‡ŠŒŠ�‰ˆˆ‰‰ˆŠˆ‹‰‹‰ˆŠˆ�‹Šˆ‰‰�†‹‰�‰ŠŠ‡‰Š‡ƒ‡ˆ†‰ŠŠˆˆ‰ŠˆŠˆ‰‰‹ŠˆŠŒŠ‰‰‰†„‡Š†‡‰Š‰‹Šˆ‰‰ŠŒˆ…ˆ‡‚„…†…„€xvljeYQQIELLLSTNOTRahp{‚‡‡…‡ˆ†Š‹�‰‹‰‰ˆˆŠŒŒ‰��ŒˆˆŠŒ‰‹‡†�‘Œ‹‰Š�Ž‘’’‘��’�����ŠŠ‹�Œ��Ž­¬ª­­­¬­®®¯®±¯²±²°¯®®«ª¥©¥¢¢¢ œœœ��™›��žœ™š™™™›˜––—””•—”–”˜———•š–—•–••—‘’”–•”—”’––—“““•’””•””’”’”“�‘’’•‘‘“�““““”’�‘’’’‘’‘‘��”�‘‘“•“’’’”’–���’���’‘Ž�‘��‘���‘���‘���’”�����’”�ŽŽ����’‘�������“‘��’’��’Ž�Ž����’ŒŒŽŒ‘Ž�’��ŽŽ�‘���’�Œ����Ž��’���‹ŒŒ���ŽŒŒŒ�Œ�‘�Ž�ŽŽŽ�ŒŒŒ‰‹Ž��Š���ŠŽŽŽ‹ŒŠŽŽŠ‹‹‹�Š‹ŠŒŒŒ‹Š‹��Ž‹ŒŽ‹�ŒŒ�Œ‹‹Ž�Œ�Œ‹ˆŠŒŠŒŠŠŠŒ‹‹ˆ�‰Š‰Š‰Šˆ���ŒŒŠŒˆ‰†‡‹ˆ‰††‹‹‰Œ‰‹�‰ˆ‰‹�Љ‡‹ˆŒˆ‰‹�ˆ‹‰ˆ‡ˆˆ†‡‰ŠŠ�Š‹ˆ†‰Š‡‡‰Œ‰‹‰ˆŠ‹Š‹�‰…‰‹‡ˆ‰‰ˆ‰‰‰†‹�‹………„…‚}~smaVXRNHHFIGGMSLGJK[nx~ƒ‚ˆˆ†ƒ†‡ˆ‰‹Šˆ�ˆŠ†‰ˆ��ˆŽ‰ŠŠ�Ž‹‹ˆŒŠŒ�Œ†ˆ‘Ž�““�’����‘��Ž‹Œ‘��’�ªª¬ª­­­¬­­®¬­¯°°³°°­°©©¤¥¥¦    ™ž�™››™›™œšš˜›˜››˜š—š˜–˜•”“˜–˜™—–—’•”“”“’”•”–””“”–––˜••�•‘’–“““‘””“‘�’’”�Ž“”‘“”�’�’‘‘�”�‘����‘’�‘�”���’’’“‘“�“ŽŽŽ’‘��”’��‹��’����Ž��’’�‘��‹““”�����Ž‘‘‘“�ŒŽŽ�Ž��‘ŽŽ��������Ž��‘‹��Ž��“�ŽŽ���Œ�‘Ž’�����’ŽŒ�Ž����Œ��Ž���ŽŽ�‘���Œ’�ŽŽŒŒŽŠ�Š�‹‹�‹��ŒŽŒŒ‹ˆ��‹�‹Œ��ŒŒŽ��ˆŠ‰�ŽŒŒŒ��Ž�ˆŠ‹‹�ŽŠ‹‹ˆŠŽ�‹‰�‰ˆˆŠ‰ŠŠˆŠ‰‰ŠŠŒŒŒ�Š��ŒŒ‰ˆ‡Š‹‡‰ˆ‹‰ŠŠŠ‹ˆŒ‹ˆ†Šˆ�‰‰Œ‰Šˆ‹‹‹ŠŠ‹‰ˆ‡‰ˆ‰‡‡‹ŠŠŠ…ƒ‰‹ˆˆŠƒ‰Šˆ‡Š‰ˆŠŠŠ†ˆŠ†ˆ…†‡‰†††ˆ†‡†ƒ…€�|ytpf]YPPMJEGBBFDILOILR[j|€�€ƒ…€€…†††ˆŒˆŒ‹ˆˆ††ˆ‹�ŠŒ‰‰Š‰ˆ‰‰ˆ†‡Ž�‹…ˆ��Š�’‘�����‘‘Ž�‹Š‹Œ�‘�©©««ª«­®®®®¯®°²¯±±¯¯­«©¦¨£¢ Ÿ¡�ž��š™š››š˜——™—ššš˜™˜£š“˜˜™—™––˜—•—–’—–““•“–••’—••˜”—••”’’••““–‘””–‘‘‘�“�‘�‘‘–“’�’���•��‘•‘‘’‘‘�Ž�’’‘��’�’�’’“‘Ž“‹‘Ž�‘“‘�Ž���‘���ŒŒ��’’ŒŽ‘Œ��‘‘�Ž�����Ž�’���Ž�ŽŽ‘�’�������‘ŽŽŽ�ŽŽŽ‹��‰Œ‘���ŒŒ����Œ��Ž�����Š‹��Ž�Ž���‘Ž�ŽŽ‹�“‘ŒŽŒŽ‰��ŽŽŠŒŒ�‰�Ž�Ž�‹‹��‹Š‹ŽŒ‹‹ŠŒ�ŠŽŒ�Œ‹‹‹‹��‰Ž����‹ŠŒ�ŽŠŽŠ�ŠŠ‰Œ‰�†Š�Š‡Šˆ‹†Š‹�Š‹‰�Šˆ‹Š‹‹‹Šˆ‡ŠŠ†‹��Œ‹†‰‰ŠŠŠˆ…ˆ†‰Š‰‹‡…‡�ŒŠ‰ŠˆŠ‹‹‹ˆ‡‡ˆ‰Šˆˆ‡ˆ‰�‹‰„ŠŠ‹†‡‹ˆ†‡Š‹‹ˆŠ„І‡‰‡ˆ†‡†„�„„‚~ypkg`ZQOKMJGKH?>>AABNT]citwz~€ƒƒ‹Œ�’”�›�Ÿ¡¤¥£¤£¢¤¤¤¤¥¥§¤§¨§¨¨¨¨©©§©¤«¨¦§§©¦¨¨§¥§©©©¨ª§§¨©©¨ª¨©«©§¬¨§ªª¨¨¡¥¥¥££¦£¤¡¡¡¡ ŸŸ¡ ž™—’‘‘�Ї€zriinux|„…„ƒƒ„„€€„†‚ƒ‚€‚……†„‚‚„ƒ…‚ƒƒ‚†„‚ƒƒ�ƒ€…………ƒ�„„ƒ~€‚|€ƒ…€€�‚�„„����~‚ƒƒ‚~‚„…‚‚‚€ƒ…�‚†‚‚ƒ„�‚€€‚…„ƒ„„„‚„Іƒƒ„†�„…¬¬­­¬¯°°®®°±°±³®¯ª«¥¥¡ ž�š–—œ—–�“�’‘�’“�“���Ž�‘‹��ŒŒ�‹‹�‘ŒŒ�������‰‹�Œ��ŽŠŽ���Œ���ŽŒŠ�‘‹�‹Œ�ŽŽ‹Š‰Š‡‹Œ�‹‡ˆŠŒŒŽŽ‰�Œ‹ŠŠ�ˆŽ�‹Œ‹ˆŠŠŒˆˆ‰‰Š‰‡†‡ˆ†‡Š‹Ž†‰‡‰‹‹ŠŠ�ˆŒ‰�‹‰‹Š‡††ˆ‡Š…†‡�€upofdX[a]XWMIELNKPT[gljgged`ZQGCBHT`fgac\Y[^fmw{z}~„†ˆ‡‡ˆ��“’˜“•‘”’••™ž›žž�� ž ž�›™–”‘�‰�znhcZ\ZYOKEBB;0,-,)-.-3=DKXdmqx~‚ˆˆ�‹‹�˜˜Ÿž¡£¡§££¥¥¢¤¤¥¢£¥¨¥§¨¦©¦¨¨¦¦¦§¥§¤§§§¤¥¨¤¦©¨¦§©©©¦ªª©¨§ªª§§©¨§©§¨«§¦¨¤§¤§§¦£ £¤¤£¡¡�Ÿ™˜–’““‘�ˆ}vurtxz���ƒ…‚‚„€„‚„ƒ‚‚‚�„‡„„…„ƒ„„„…††„‚‚„�€„ƒ�…‚‚„�€�„…‚�‚ƒ~�‚‚‚�ƒ€�†„~‚ƒƒ€ƒ‚‚ƒƒ„†„�…ƒƒ~��ƒ„…ƒ†ƒƒˆ†ˆˆ„…††‰‚‡¬®¬®°¬¬°°¯¯±±¯±±­ªªª¥¦ ›�–—˜œž—‘’�’‘�“‘‘���Œ����ŽŒŒŒŒ�‰��Œ‹����“Ž�Œ‡�Ž’Œ�ŠŽ��‹‰�Œ‹Œ‹ŽŠ�‹‹ŠŠŒŽ�ŽˆŠ‹ˆŽ‹ŒŠŒŠ‡Š���Љ�ދЉ‰‰Œ‘‰‹‡†ˆŠŠ‰‰ˆŠ‡…†‰‡ˆ‰‰‹‹‹Š‰‹ˆŠ‹ˆŠŠŠ†ŠˆŠˆ‰ˆˆ‡‡ˆ‰Š‰ƒ„€wxofbb__de_WSHEIMRTagjuzsstnfbVOHCGPT_ca\^VTV^gmuv{z~�ƒ€ƒ„‹����“�Ž‘Œ�’—›˜›��šžž�œ—˜’‘‘�††tmb\Y[XPD<4.>1   !")2>GV_kp}‡Š‰Šˆ�”—š Ÿ¢¤¡£¤££¢¤££Ÿ £££§¤§¦¥¦§¦¥¤¤¤¥¦¤¤¦¥¢£¦£§§§¤¨¨ª§§©¨¨ª¦¨¨ª§ª§©©§¦ª§§§§¥©¦¦¥¥¥¦¦¢¢  žœ››™˜—•”‘ŒŒ„„zuz�……†…ƒ��ƒ…„‚‚�„‚ƒ�†„‚‚‚€‚†„„„…ƒƒƒ~�‚���„„ƒ~‚‚€~„€‚�ƒ�‚‚‚�‚€|ƒ}��‚‚‚…ƒ…ƒƒ}€€€ƒ€�ƒ�ƒ�€„ƒ„‰„†ˆ„‡…‚‚„­¬­«¯­®®²®±²²¯²°¬­«§ª¤¡œ›™–—››™“‘”’��““’Ž�“��‘�Ž�Œ‹��‹ŒŒ��Œ�‹ŒŽ���‰‹���Ž‹‹���‰‹ŒŠ����‹‹‰‰‹‰ŒŒŒ‹‹‹ŽŠŒŒŠŒŠŠ‹Š�ˆŠŒ‰‹ŠŠ‹‰Œ‰‹‰‰‹†„ˆŒ‹Š‡‡ˆ‹„†Ž‰ˆ‰ˆ�‰‹‹‰‹‰‰‹ˆ‹‰‹‰‹‹‰‰‡‡ˆˆ†ˆŠŽ……‚vtka\[cchj`XMIJNSXbkqr~}|xxuneaVNJGKTWaaa\XSV]_joruuzx|}~‚‡‹‰Œ�Œ‹Š‰Œ‹Ž’”—˜˜š›�šš˜–”��ŒŒˆxlg]ZYTME9(�"#(3?KXjx…†ˆˆ‹Š�–—›Ÿ£¡¢¢¢¤¥¦£¢Ÿ   £¥¤¤¤¦¦¥¤§§¡¤¤¢¡£¤¡¡£¤¢¢¥¥¢¥¦¥ª¥©©§¨¨¥¨¨¦«§¨¨ª¨«©«©¨ª§¨§¥©©¥¦¥£§¢¤¡¡œœ›™šŸ™—””Œˆ…|vv|}‚††………ƒ€…„„�ƒ�€‚�„ƒ…ƒ„~€�„ƒ†ƒ‚„…€€€€�„€…‚ƒƒ~�€‚~†‚�~€‚‚‚�€‚„€�„…~€ƒƒƒ„†��€|‚ƒ�€~~„ƒƒ‚‡ƒ„…Šƒ…†‚…‚…‚…«­­«­®­¯¯°°²°±°°¬¨§¨¦£žœ�™——•™—‘‘–‘•’‘““���Ž�Œ�Ž�ŠŠ‹�ŒˆŠ‹�‘ŒŽŠ��‹‹‰ŠŒ���‹ŒŠŽŒ��‹���‹ŽŽ‹ˆŠŠ‡‹‰‰Š‹‹‰‹‹��ЋЋ‹‰‰‹‰‹�‹‰ŠŒ‰†‰ˆ‰ˆˆ†ˆŠ‹ˆ‰Š‹Š‡‰ˆˆˆˆ‰Š‹…�Š‹‰‰‡ˆŒ‹‰Šˆ‰ˆ‡‡‡ˆ†‡‡‹Œ‡„{wrkbY]dhki`WOJNSYflsx�~~{|xqld^VPMKQW_^`c][X\ceinooqtvx{€‚†‡ˆŠŠˆ„„…‰Œ��”’•—˜š™–’“’�‰‰†€wnk_\VPQC3(!*5FVl{…‡‹Š��Ž–™šœž ¡¢¢££¡ž¢ ¡ ¤ ¡¥¤££¤¡ ¢£¢¢ ž¢Ÿ  £¢ž £¡£ž£§¦§¨§§¦§¥©§©§ª««¨¨ª¨ª«§©©©¨¨¦§¦¦¥¢¦¨¡¥¢¡ŸžšŸžŸ›�š”�Š€|vyv€„…„…„�ˆ…ƒ‚‚„ƒ‚}~‚‚…�†‚€ƒ‚ƒ€‚€‚ƒ€„�|€~…‡�‚}‚‚ƒƒ‚|€�„„‚…‚��{z~†ƒ�ƒƒƒ…ƒ�†ƒ€�„�‚€€€ƒ�„„„†„††‡ƒ„„ƒ€€‚…¬«­¬­®­®°°­±°±³°­¨©¨¥¤�žž———™–”“‘’—˜‘�‘��”ŽŽŒŒ���‰‰�‹†‹Œ‡ŽŽŽ‹�ŒˆŒ‹‹Œ‹‹ŒŒ��‹Š�‹��‹�����‹‹‰‹‰ŠŒ‰Š‰‹‹ŠŠŠ�‰Œ‹ŒŠŒŒ‹�Š‹‹‹‡‰Šˆ‹ˆŒŠˆˆ�†‹ˆŠŠŒŒŠ…„Š‹‰‹‰ˆˆŒŒŠŒ‡‡�ˆ…‹�‹Š‰ˆ‰ˆ‡………ˆ‹‰„�ywof\_Zdnji\TMOTY_kwzz~��~ztpidaZVMIPW]_d``a^_cefgkknqpty{|€…‚„‚†�‚„Œ‰���“‘•“””�Ž�‹‹‡xphe_XPKD4%&6K_s€‡Œ�‹ŠŽ’•—™™Ÿ�¡£¡¡¥¡�ŸžžŸ¡ž¢¢¢ ¢¡¡ ¢ £�£ž ž� žŸ�Ÿž ¢¤¦§¦¦§¥§©§©¤«§©©§¨ª¥©©©ªªª¦¨§¨©¨¦§¦¤¦¥¤¤¡£¡  ¢¡ ž›—“Š…‚zwv€ƒƒƒ…†…‚…‚‚„~}~|‚‚ƒ�ƒ€„€�ƒ€‚€�‚‚†{}�…�€�‚‚€��‚„�}‚…‚ƒ‚‚‚�}{{€‡‚}�‚‡„�‚…‚††ƒ‚~„‚€„�‚€�‡„ˆƒ…„�ƒ†…ƒ�…ª«­«­®¬¯¯¯¯²®°±°¬«¤§¤¡ž›››”˜––”’’‘•“’Ž���‘’�ŒŒ�ŽŒˆŠŽ�ˆŠˆ‹��ŽŒŽ��Šˆ�ŠŠŠ‹ˆŒŠŠ�ŠŠŒ����ŽŒŠ†�ˆŠŠˆ‹‰ˆŒŒŒ‹‹‹‹‹‹ˆ�ŠŽŠŒ‹ŠŠ‰‹ˆ‰…ŠŒŒˆ�ˆ‰‰‹Š‰ŒŽŠŒŠŠ†Š‰‰Š‰‰‹†‰Œ‹‰Š‡ŠŠŽ�‹Œ‰‹ˆ‰Š‡ƒˆ‰Š††||skd]]_chih\QMPV]iqz~~{}zqiiea_\WSISV\`c_bcfdebiknkjkkmrww{|}}€�}}}€„ˆ�‹���ŒŽ�����І�zphe`[WLE6&$'$%;Vh|ƒŒ�Œ�Œ‘��••™œ›Ÿ£  žžžššœ›��Ÿ� �� Ÿ�Ÿ  ž�žœœœ››››œ� ¤¢¦£¦§§¦¦©§©§©§«©¨ª¨¨¨©©¨©¦©¨ª¨§¦«¤©¦£¨£¢¢¢£¦¢  žšš”ŽŒ‡�xy}�†ƒ†ƒ��…�€‚}}‚„�~|€}|�€ƒ€�~€‚‚€‚‚‚€�€…€‚…ƒ�€~‚‚�€…ƒ~|}|€ƒ€„€‚��~�…††~€‚€�‚�€€…ƒ‚„„ƒ€ƒ‡…€~�‚«­«¬¯­°±±°°±±²²°­¬¨¥¤¤�›™™–•˜•“•�”’•““‹ŽŽ�’�Ž‹�Œ‰‰ŠŒ��Šˆ‹��‹Œ���Š‹‰‹‹‰Š‹ŠŠ‹Š��‰ŠŽŠ�ŠŠŒŒŠŠŠŠˆ‰ŠŠŒŒŠ�‹ŠŠ‹Š‰ˆŒ‹�‰‰‹Š‹‰Š�‹‰ˆŠŽ‰‰‹‰‰Š‹�‹‹Œ‰ŠŠˆˆŠˆŠ‰‡Šˆˆ‰‰Š††‹��‹ŠŒ‰Š‡ˆ‡‰Š‰ˆ‡ƒ€zreaY]cidd`XOQQ[_lvx||zrslaa\Y__^^RRORZ`aadeegkillljhjgmmqpvyy|€|yw{€„„‡ˆˆŠ�‹‹‰Š�І‡‚}unia`ZVI:-$.94"!4Mcy†�‹ŒŒ‹����“–—›››¡Ÿœ ™™”–—›š››—™�š›žš�šœ™˜š•›™™œŸ™ž�  £¦¡¦¥¥¥¨§¨¨§¦«§§©§¦ª©©§©ª§«¨©§«§©¥¦¥¤£¦¤¦£¥¦¢¡ žœ™•‘†�|{||��ƒƒ„„„�„~€~|~€‚ƒƒ„‚~€�€€‚‚€‚�}€ƒƒƒƒ~|~€€ƒƒƒ‚�~€�„‚|~}‚‚€€‚‚‚‚€€€|„‡†ƒ}ƒƒ†€„…„‚ƒ„„„‚‚�„…€€…«®««¬­®°®±±²°°°®­«§¥¢¡Ÿ�˜š”–—”‘’’”’��“�‹ŒŽ’‘ŽŒ��Œ‹‹ŒŒŠ‰‰�‰Ž‹ŒŠŽ�Œ�‹ŒŒ‰ŠŠ‹ŠŠˆ�Œ‹Ž‹�‹‹Œˆ‰ŠŠŒˆŠ‹ŠŒ��ŠŽ‰‰ˆ‰ŠŠ‰Œ’‹ˆ‹ˆ‹Š‹��ˆ†ˆŠŒˆˆˆˆŒ�ˆ‰‰‹ŠŒ‰ŠˆŠ‡ˆŠ‰‰‡‡‡‡†‹‰ˆŠŒ‹ˆ‰‰‡‰†ˆ‡Š†‡ˆ‰„€yoe][^bca^ZUUSN[gns|{ywsq`XQNLOTZ]_WTVOW^b`bchmnnpmhjfdbfimnsswz~{xz{€ƒƒ‚„……‡†…………‚~|vsmi^]VOB."0>HC0+B_t„ŠŠŽ‰ŠŠŒ�’�‘””››�žœ›•“““–”——’––˜”–•–”—•”˜—˜–—”–›—œœŸŸ  ¡¤¤¤¤¤§©¥©¥¥¨¥§©¦§¨¨¦¨«§¨¨©§©©§¤§¥§¤¦§¤¤¦§§£ ¢œ�–��„~y{}~…„ƒ�ƒ�‚ƒ}~}‚‚€…†��ƒ‚‚‚}~{‚„}€�…†„‚‚z}{�„ƒ‚}†�‚‚‚�{z€�ƒ~~~‚…~‚��‚‚„z��‚„…ƒ„�‚ƒƒ„ƒ�…‚ƒ€‚�„ƒ‚‚�‚‚„‰¬­¬¬¬®®®¬²°¯°³®®¯©¨§¢¢¢››—–•–””’�‘‘’�‘Ž���‘’ŽŒ��Œ��ŒŒ�ŠŠŽ‰Š�Ž�Ž��Ž‹ŒŠ‰ˆŠ‹ˆ‹‡�ˆŠ‰‹ˆˆ‹‰�ŠŠŒ‡�‹‹‹‹‹‹��Œ‹‹‹‰Ž‹Œ�‹ˆ‹ŒˆŠŠ�‰ˆ…‰ˆŠ‡‰ˆ†…‹‰ŠŠŒŠŠ‹‡‡‹‰‰ŒŠ‡†Š…†‡Œ�ŠŠŠ‰Š‰‰…‡ˆ…‰ˆˆ†ˆˆ‡€vpe]_e``]UWQRTU^fov|{ysmfYLC@BEMUW^\ZTUZ`e\\gjmtrnkkgdabbfhmolu{~{yyy|{~�ƒ‚…���€||xxsumgcYSK7%.DSO5)?\s‚Š‹�Љ��’‘”�“’˜š›�––•“��‘•–“•””•’��“““�–”‘“”“‘”–™˜™™››�¡ ¢¡ §¤¥¤¥¥¥¤¥¦¨©¦¦©¨¨¨¬¦§©§¨§§©§§§§¨¦§§¤¦£¢£ žœ™•�‰|~y}‚‚‚�€ƒ‚„ƒ‚~~‚‚�……‚ƒ‚€ˆ…€�~€€€€‡‚…„€€|~„����ƒ€€…ƒƒ}}}~�€€‚�…~��‚ƒ�~€‚‚…†‚†‚€†…ƒ„��„‚ƒ„„„„ƒƒ~~‚�‰««®¬¯¬­¯­°¯°±±®¯±ª©¥¤£¡›––™•”•”–’�Ž�‘Ž�Ž������Ž‘Š���ŠŒ�‹ŒŒŒŒŒ��‹ŒŒ�Љˆ‡ŠŒ‹‹ˆŠˆˆ‰‰‹‰Š�Ž�‹ŒŒˆŒ‹Š‰‹‹Š�‹ŠŠ‹ˆ‹Š�ŠŽ‡‹‰Š‹Ž‹Šˆ‰ŒŠˆŒŠ†„‡ˆŠˆ‰Š�‡†‹‰‹Š†ˆ†‡‡ˆ‰Š…‰�ŒŠŠ‰‰†‡ƒ‡ˆ‰‰‡ˆ‰„…†�vj]^acc^VQOKPRV`kqwx|vqjeXOBB=>FJT^]]WW]\_UXbkostpmkef``^`cllnrv{yzvy|~yz~€€€~|{ytuppsle`[RG0)@OG1(<[kƒ„Š‹‡Š‰‘’’�‘•——š›—•‘•�‘’‘‘’‘‘’’���Ž��ŽŽŽŽ�‘�Ž�Ž‘’•—–—š™™™�¡›Ÿ  Ÿ¡ Ÿ¡¢£¢¢¥¦¦§©©©§¨¨§§¨¨§ª¨©©§¦¨¥§§¨££ žž›—‘‰…��|z€‡€„�†‚‚ƒ‚�€„ƒƒ„‚€€„…�~|‚~€ƒƒƒ„‚�~€��„�€‚€‚‚‚~€…†„~~�~~|‚€‚†€‚�ƒƒ€…‚‚~�ƒ…ƒƒ€‚‚……�‚…ƒ†‡…„€€��€‚‚«©«­®¬®®­°±²¯°°±¬©¨¤¦£œ™——™˜—”’‘“‘�”�’��‘‘��ŽŠ������ŒŒ�Ž�‹†Ž��ˆ‹���‹†‡‰‰‹‹‹†‰�‹ˆ‹‹‹‹‹ŒŽŒŒˆŠŠ‹‡‡‰Œ�‹Œ�‰Š�Œ‹Šˆ�Љ‰��”“Žˆ‰�‡‡‹�‡‰‡‰‡‹†ˆ‰†‰‹ˆ‹ˆŒˆŠˆ‡‰‰……‰‡ŠŠŠ‡ˆˆ†‰ˆˆŠ‡…ˆ‡‡†…~rc]^bb`WRLNMNRW`jqxyytnih`QJH>>AIUY]]ZV[YWV]]ammsnlheef^[``hgkmpvxwuwxyuv{x{}|xvssmonnmf^[QB(#4>9$'@[p„‡…ˆ‡‹‘“•‘——™›››—‘“’��‘‘“��Œ’�����Œ‹‹�‰‹‹ŒŠŠ�ŒŒŽ“”’•”—–™™™›š� ž��žœ�¡¡¢£¥¤¨¨©ª©©§©©§ªª¨¨¨¨§¦©§¨¨¤¦§  �ž™”�‰ˆ€|z~„‚„„„…„‚„‚ƒƒ‚z€��ƒ…‚ƒ„}€‚�ƒ…„€‚‚ƒ€ƒ€€�‚�|ƒ�‚†�‚€‚}‚€~�ƒ†��‚ƒ‚„‚|€‚ƒƒ}ƒ‚„‚ƒ„„‡……‡…���„‚†…ƒ««¬¬­®®®°¯®°¯°±°ªª¦¥£ œ™™›˜–’‘””–��‘’“‘�‘‘Ž�‘��‹Œ�ŒŒŠŠ��ŽŒŒŒŒ�Ž‹ˆŠ�ŒŠŠ‡ŠŠŒŠ‰�Œˆ‰‹‹Œ‹‹Œ�‹Š‰�‹Šˆ‹‰Š�’‹‰‰Š�Љ‰Š�‹���Š�‘Œ‡‹‹‰‰�ŠˆŒ‡Šˆˆ‹†ˆˆ‡‡†ˆˆ‹Œˆ‡‡‡‹‡ˆ†Šˆˆ‰…‹Š†„‰…‡ˆ‡‡………�{sb\]`]]QQMNOPQW`fuzxupmpkf`TRF@BDP\`^\VW[YXZ^bhnifigfeg`[`dichjjlqprutrrrrtsyxz}vqsojkqkohc\U<%!($*A[r~„…ƒ„†Ž�“““—š™œ�˜“’“’‘‘�����‹�Œ�‹‰‹Š‰‹††‰…‡‡‰‹‰ŠŠŒŒ�‘‘’’’˜••–•™˜š—™˜›šš¡¡¡¡¤¥§§§¨§¨§¨©ªª¦©¨§¨¨¨¨§§¥£¤ žŸ�š•�Žˆƒz{�€~€‡ƒ†„€‚…€�~��„��‚~€‚€€�ƒƒ�‚€ƒ‚‚~€�}��ƒƒ�…�‚†ƒ€ƒ€‚‚…„€~€ƒ~€€��|„†�€‚‚ƒƒ�‡‚„ˆ‚„‚��…€…ƒ‡«««®¬­¬­¯®±°²®±¯««©¢¢Ÿž�›œ——•“”–“���”‘’”–���‘�Ž�ŽŒ‹ŒŽ��’‘�‹‹���‰‡‰Š�‹‹ŠŠŠŒŠ‰‹ŒŠ‰Š�Œ�ˆ�‰Š�‹‹‹‹‰Œ‰‹�Љ‰ŠŒŒ�ЋЋ���ˆ‰ŒŒ‡‡ˆ‹Š‰ˆ†‰‹‰Š‰�ˆ‰‡†…ƒˆŒŒ‹ˆˆŠŒˆˆŠ‰†‹‰‰ˆŠˆ‰‰‡‡ˆ‰‡‡…ˆ†‚‚|r`[[`ZXQQKRRPPXdmwwxtrlrokc^YREE@MZded\YY]^]`adkiefidggebaddf`bcegnlpnsompnnouwxtqnljnqommg`T:"+E`r|ƒ€ƒ…ˆŒ’“–˜˜˜œœ™•’��•�“���‹Œ��Œ‰‰‰ˆˆ„‹„ˆ…ˆ„†ˆŠ‰†…‹‹�Ž��‘‘Ž�”•’•˜’“–�”˜››ž¡¡¢¤¤£¥§§§¨©¨¨§¦©©§ª¦©¦¨¨¦¨¦¥¤¢ž›˜”�Ž�|z}}€‚‚„‚‚ƒ€‚~€€€‚‚�‚„€��}~|~€„€~ƒƒƒƒ…�‚€�}‚ƒƒ‚|~„‚„ƒƒƒ„�ƒ‚€‚€‚€}ƒ|‚‚�…ƒ�€€€~…ˆ„~„‡ˆƒ‚„‚„……‰‚…�„«©¬«¯¬­±®®°¯¯±¯­ª©§¥¢ž¢žœš™™””“‘—”‘�“““”’‘���Š��ŠŽŒ��Ž�•‘Ž�‹‹�Žˆ‹‹Š‹Œ‹‰‰Œ�‹‰�ŒŠ‰Ž‰‹‹‡‹‰‹‹‹‡Š‰ˆ‹†ŠŒŠŒŒŠŒ‹ˆŒ‡��‰‹Œ…ˆˆ‰ˆ‹‡‹‹‰Š†ˆ‰ŠŠˆŽŠ�Љ‡…ˆ‰ŠŠ†ˆŠ‰ˆŠŒ†ˆŠ‡Š‡‡ƒŠˆ„†Š…ˆ‡‹Š†‡‚}qc[\_XVQOPSQQQU_lvvvusrpqllg]ULIDM]eikd^]adfabcehhkgjfiig``d`a`_]`ekfjmkjjhijqsstnnnlknpqnkdR;$ 1N`u|€�‰��”•••™›˜—’‘������ŽŠŽ�މІˆƒ‡‡„„†ƒ……‡‡†Š…‡‰‰‰�ŽŠ��‹��Œ�‘Ž‘����’’˜šž¡ž¡££§¤¨ª¥§§ª¨¤ªªª¨¨¨¦¦¨¨¨¥¦¤¥£¤ž�™—’Œ…}}‚€|‚€€~€€�~}~~€€~ƒ„‚€‚�€}�‚ƒ€‚‚„„��‚€~‚€€‚ƒ}~�ƒ‚€�„‚ƒ€‚€~~„ƒ€~‚„€€~€�€~~ƒ‚…‚„„‚��„…„„ƒƒ…„�®©«­«­®¯®°¯°²°²®­¨©¦¡¡¡��š�š‘”’’•“‘�“•–���‘��Ž���Ž‹ŠŒ�ŽŽ�Š�‹Š‹ŽŒ�‹Š‹“މ‹Œ��ŠŒŒ�‹Œ‹Œˆ‡‰‹��‰‡‹ŒŒŠˆŠŒŒ�Œ‹Š‹‹‰‹‰Œ‹‹ˆŠˆ‰ˆˆ‡‹‹ŒŒˆŠ††�ˆŠ‰Š‹Š‰‡†‰‹ˆ†‰ˆ‹‰ŠŠ‹††‰…‰ˆ†‡††‰‡ˆˆˆ‰‡…†‚~zqcTVZUWQQRSROMVXdtuyuvvrmmmka]XLIQ\fmjebagkkjfghhfljmihhfeaca^\]Z^beddeeeghgflnoqkjmklmosrneS=#(8Nis}}‚…‰Œ’‘–••—™–•�’’�Œ�ŠŽ‹�‹Š�‡‡†„„…€…………†„…‡‰…ˆ†‡…ˆˆŠŽ�‹‹‹Š��‹‹‹Ž‹��‘�––œœ £¢¡£¢¦¨§¥ª©©§¨§¬©¬©©©©¨¦©¥¨£¤¢¥¡š›—�‰��‚€�€|~~€ƒ‚€~{€~ƒ€ƒ„ƒ�€~~~ƒ€…}€‚„„€�ƒ�€„€„‚‚„€ƒ€„‡„‚�€€€€‚€„€‚ƒ�‚�€�~€‚ƒ€€„„ƒ‚ƒ‚}‚�€ƒ‚„ƒ„…�‚«¬ª«©®®®¯®°°°²°­ªª¦¥¥ŸŸš™—•••”’‘’‘Ž�’”��Ž���ŽŒŽ�ŽŠ�Œ‹�ŒŠ‹ŽŒˆ‰ŠŒŠŠŒ�Š����Š‹‘ŽŽˆŒŒŠ‹ˆ‹Š‹ŠŒ‹�‹�ŠŠŠ‹ˆ‹ŠŠŠ‹�‹Œ‰Šˆ�ЉЉˆˆ‡ˆ‹ˆŠ�Š‹ˆˆˆ‰Š‡‡‰‰Œˆ…‹Š‰‡†…ŠˆˆŠ†„†ˆŠŠ‰‹‰‰…††Š‚†„…ˆ‡†‚|voaQORORPSSQOKKS[altxwuxxqqmjhc\QMU`diojeehkmojhhklklmmkffdcb^Y[X]]cab^adf`_a^chhkkgikmpqqsqjY@& .719=LZdbVQTTY_dkpux||wvwsqnkhba[eloqrsopoqmllhkjfkggihc_]aca][XXQQOROOKKMOUZ`d`jlqusuupl_I:+%&0;IUfpxw}{{{†ˆŒ‹ˆˆ†‰‹‡ŠŠ‹‹ŠŠƒ…€‚~€€€€|~€|��€‡†‡‡††…„…„„…†‚……‚ˆ‡‡ˆˆ‰†…‚‡‰‰‰‹�“•–—›�œ¥¢¤¥§§§§¨©¨ª«§ªª¨ª©ª¨ª¦§©¦¦¤¤¡›™•“�ˆƒ€�€ƒ‡ƒ‚€~‚…€€�ƒ�{{|€‚‚€…€€‚„‚‚�~~€„~€€�€‚€‚ƒ�‚„~~�€‚‚|y}|€…€|�€~‚ƒ‚€‚…ƒ…ƒ„‚ƒ‚„…‚‚‚ƒ…‚~‚„¬§ª««­«¯°°°±®°°­¯«©¤¤žŸ���™””�•’���‘�‹���Ž���ŽŽ‰���‰ŠŠŠŠŠ��Œ‹†‹‹‹‡‡‡…‰�‹‹‹Š‰Œ‡‹Š‹‰‹‹‰…‹ˆ‡‡†ŠŒ‹‹Ž‹‹‹‹ˆˆˆ‹‡‹‰†‡‡†‡„…„‡‡Š†Š‰ˆˆŠ‹ŒŒˆ‡ˆ‡‡‡ŒŠˆ†‹‰‹ˆ‡†ˆˆ‰††…Ї†…‰‰‡‡‰…ˆ†‡‡‡…„€ƒ{vcPA:39GY[a_\ZWW^_hiqqsrwuvtppmfibbafmqrmoqiikjnecgfehfiiggeebcc_[VQUSOPMKFFLSVX_ejmnuwssokcZQD?90*"%*49JS^bnqw|}~ƒ…†…‡‚ƒˆŠŠˆ‰‹‰‡…„ƒ~ƒ~�€€~€{y~�~|€€€€…†‰…„‡„‚€€‚€‚ƒ�ƒ„ƒ…ƒ†ƒ‚€‚‡………‡Š‹Ž�••˜œ�›ž¡Ÿ¤¥£¥¨§¨¬©¬«¦¨¨¬ª©ª¨©©¥¥¥ ¢ž˜�Š}{}~ƒ‚„„€€{|€�€�…„€}~‚}�€ƒ€{�‚�„�‚�‚ƒ|}}€~��‚€€‚‚|�…‚��||||‚€|„‚��€��„~~‚‚ƒ„‚…„‚ƒ€€~„ƒ„ƒ€‚�«©ª§®ª®«°¯®°±°¯®««§¦¤¡›™———š’’””���’ŽŽ‘�‹Ž‰‹�““ŽŽŽŠŠŠ�ˆ‹‹�Œ�‰ŠŠŠŠ‰Šˆ‹Šˆ‹‹‰‹Œ�Їˆ‡‡‰‰ˆŒ‰‰‰†…‰ŒŒ‰ˆŒ‰‰‹‹ˆ‰‰‰Š‹ˆŠŠ‡‰„…ˆ…Љ‹‰†‰Œ‰‹�‹ˆ‰‡Š†ˆˆ‡ˆ‡Œ‹ŠŒ‰‡ˆˆ…„†‰Œ„„…ŠˆŠ††‚†ˆ…‰…‚}‚|vjR?535CIQZbglloqtz|~€„‡ƒ‡ƒ„„‰‹ˆ†ˆˆƒ‚‚‚|€}|‚‚ƒ�~„�~€~��…ƒ…‚„ƒ€€|~|}~�{~€~|}}|‚|€��ƒƒ…ƒ††‡ŒŒ�’�•—˜ žž¢¥§©¨«¨¬«ªªª«¨¨ª«¦§¥¤¤ ›–Ž…zqux~}„�„€ƒ}€�|€‚ƒ‚~‚€‚‚�~~�‚‚€||€‚}|€~€ƒ�„�‚€y�€€…€ƒ…€€�|~€‚}ƒ‚��„‚‚‚‚ƒ€�‚†„……¨«­¬¬«­®®¯°°­®¯­ªª¥¥¥�›–›˜“””–”‘��‘’‘����ŠŠˆ‰���ŽŠŒ‹‹‹‰�ŠŠ‹�‰ˆ‰ˆ‰‹‹‹‡Š�Š‹‹Š‡‰ŠŠŠ†Š‡‡‡ˆ‰‰‰‡„†�‹ˆˆ‰Œ‡‹…‡Œ‹‹ˆ‰‹ˆŠˆˆ‹‡‡†‰Š†‡†‡‡ˆŠ‡………‡‡‰ˆ†…‰‰ŒŠˆ„…‰‡ˆ‚…„†‰‡‡‡ŒŠ‹…‚‚Š…„ƒ…‚‚|xkR=/+0:+&.7;BDJU^`ahnqtnmeecabdglkjiikfeb`bccjoquuz|{||wvxtpkifkjhbc_[YZVVTOROLPRX]adfdgcdekkljknknhe^\\XVYZUTYZWY[a\bceeijggnpv~ƒƒ‹‹�‘ŽŒ��Š‹Šƒ�€~€€~€z~~ƒƒ�€ƒ�‚„€€€{}~}}|z{yz|{{w|wyx}vyx{v|||{~€}}�ƒ‚…‚‚ŠŠ��’“˜›� ¥§¦§¨©ª«¬ª«ª«ªª¨¨¦¥¥ �š–�„|ukdjsy}ƒ€}€|‚€€}}}|~‚„€€€ƒ~€‚ƒ€zx~|€}€…�~|~}€�~{‚‚€‚‚~‚‚��~}�ƒƒ€~‚…�‚‚}€~{||‚‚ƒ~ƒ€‚�~~¨ª««­«­®®¯®¯®­°­ªª¤¢ œžœ–™–—”“”•“��Ž����Œ��‰Š�ŽŽ�ŠŒ‹‰Š‹‹ˆ‹ˆŒ‹‹ŠŒŒ‹Œ‹‰‰ˆŒ‰‰‰‰‡�ŒŒ‡‰ˆˆŠ‰Š‰‡��Œ„‡ŒŠ‰ŒŠ�‡‰Š‹Š‹�‹ˆ‰�–Œ‰Š…„‹†Š†……†€‚…ˆ†…ƒ††‡‡†ˆˆŠ†‡…Š‹‰„„І…‡ˆ†††‡‡ˆ…�„‡„‚~xfH5')18;CHMV\b_bknspmkfacccefjkhikaa_]^bdfgkorx||~~zyuwticfkjdfg_]YYVVTOQQJNQSYdghhgbdbglhifkknebZWX\^ZYXXZ_\]^b^ddhhhijlqxz~…‹ˆŒ’“’�‹Œ‹‰…ƒ~}~||~z|~~~ƒƒ€‚€����}~{x|x}~{zxyyzzxzzwxvzzwyz|z{{|~�}‚€�„„„‰‰‰Œ�‹•••›£££¥¦¦§ªª©««©ª¬©§©¨§£  ›™‘‹{sifhnu{€}€�‚…�~~}|€}|€€�„�‚‚�‚�|z€‚‚}‚�€}}‚€}|€~ƒ€}�„„�‚€�„€�{~~„€‚‚‚€}�}}€~‚‚‚}„‚…€€�~ªªª­­«®­¯¬®±®®­°«ª¥¢žŸ�𛕕•“”‘’�ŽŽŠ�����Ž‹�Š���‹��‹‹‹Š‹ŠŒ‹Š‡ŠŠˆŠ‹�Š�ˆ‰†Š�ˆŠ‡‹�Œ‰‰…ˆ‰�‹‡ˆ‰�Œ‡‡ˆ‹†‹Œ‹‰ŠŠŠŠˆŠ‹�‹‹‰Š‹Š‡‰…………†ˆ„…ˆˆ‡‡‡‡…ˆ‚ˆˆ…‡Š‡‰†‰ŠˆŠ‡‰ˆˆ†‰Šˆ†Šˆ†‡‡ƒ�†ƒƒ|pZ>&(-37>BMMWZ]]cgksqojgfdbebdfihghc\]_^^bdacgnwv{}yyyytmjhkkhnjea]ZVUWTRPONOQYbffhdecgegdfgjfib`][a_a_^^]`__decaajjlnlmry|€…‰���“‘�‘‘ŠŠˆ„‚}~�}€z}€~~ƒ€€�}€~~€€y|v{}yx}yuwyztxzyvwuyywy||y{|~~€‚€ƒ†�…‚‡ˆˆ‡ˆŒ�Ž�–—�ž ¥¦¦¦¨«©«©©«§©§©¨¤¥£��š‘�wmeehksv~{}€€‚‚‚€}~‚}~�~‚€€~}~€€�‚}~}‚ƒ€€€}ƒ��z�||{~„‚�}}€€€~~|ƒ€ƒ€�€�€€€€ƒƒƒ‚€€‚~�‚«««««®¬®­°¯°¯±­®ª¨¤¤¡ �™˜˜˜–’“‘‘�������Œ��‹Œ���ŒŠ���Œ��Œ�‰Œˆ‹‰Š‹‡‰�Š‹ˆ‰‡…‰‹‹ŠŠ‹ŒŠŠŠ†Š‹‹‡‡‹‹Œˆ‹ŠŒŠ‹�Œ‰†‹ˆ…‡‡Œ‰�ˆ‡‰ˆˆ†ˆ†‡‡‡‰†‡‡‰ˆˆˆ‡‡‡‡‰‡‡†ˆŠ‡„‡Œ‰‹‡ˆ†„‡Š†…‡ˆ…‚†‰……„ƒƒ„zcJ2"&,29?GLNUX][_efiplljfcdecdbgggedba_`_^bbbeikuz}}xtyuuojiipnkjhd][ZWZSSSQOTRV[bfijfdehhdbbbc`b]``b^acccebdghddahijmpquzyƒ†Š�’‘ŽŽ’‘���ˆ…‚‚€€~}~~€~}€ƒ~€~|{~|~~~z{}zzz{~z{y{zyuxxytwxwxx|yz{z}||}€�‚…‚†……„ƒ‡Š††ˆˆŒ��’’™œ� §¥¥§«¨«©ª«§§©ª¨¤¡£Ÿ›–’��yrjbaajtx|z|‚|ƒ�}€|‚~~€~€~‚~}€€~‚�~}�€€~€‚‚€€}€€||‚‚ƒ�‚�|€„‚}}€�ƒ~~~���~�‚€€‚ƒ�‚€€�‚‚€€©©«¨­«¬¬­¯®¯±±­®«§§£¢  �˜–•“”‘”’”��Œ���ŒŠŒŽŒ��‹ŽŠŒ�ˆ�Œˆ�‹Œ‹‹��‰‡‡‰ŠŒŠ‡Šˆˆ‰ŒˆŒŒˆ‹ˆ‰‰‰‹ŒŠ‰‰Š‹†‰Š‰‰Œ‰Œ�Š„†‹…†‡‡‰††‡††‹††††‹‰ˆ…†Šˆ‡‡‡ˆŠ‡‰ˆ‡‡ˆˆˆˆˆ‡‡Š‰‡ˆˆ‡‰Œ„†‡‡‚‚ƒ†…‚ƒ�€rY<( %/3;?CKNPTYY\^agfijjggkhhiiiifhhhb`_c_ddddknsw{zxsuzvqkktusrrlheb]\\XRUQQVWXY^djlmfgjgeaa^b[\^[]cfdekgebeifgggimpnsw}{€‚ˆ‹�‘���‘‘�‹Œ‡††�‚�‚€~€��‚~~|}~|}}~zz{{{~|{{}|}{zxxvytwtzyzzv{||z}{€€ƒ„…€…‚…ƒ�…‡ƒ„„‰‹�Ž�““˜œ�£¢§¤§©¦©¨«©¨§¨¦¤¢¡ž›”�Ž€zpg_WY_lwy}|~~€€~€~€€}}�}ƒ€||}}|~�~{}�€}}~‚‚€€~|ƒ~€�‚„~€‚€ƒ…}}~€‚‚€~‚�‚€‚€€€€~€�‚€€|‚‚~|‚¬¬©­¬¬¬­®¯°¯±¬°®««¤¥¡ ››™—”™”“’’�”‘��‘ŒŒ‰�‹‹Š�Š‹Š‘ŠŠŒŠ‰‹����Œ‹‹ˆ�Š…ŒŠˆŒˆŠŠ‹Œ‹‰ŠŠ‡ˆŠ‰ŒŠ‹ŠŠ�Œ‹††ˆŠ‰‹‰Š†ˆ‰‹‹Š‡ˆˆ†…‡ˆ…ˆˆ…†‰†Œˆ‰‹‹‡††ˆˆ…†‹‡…††‰‰†ˆ‡…ˆ‰ˆ„…†‡‡†ƒ†�…ƒ€ƒ„‡‚‚€|kJ-% #,4;?DEKRRYZ^aaeefeggioonmnijjkomgabbhilhinou|}|wsqvxrqquwyurokjf`^\XVOSTTZ[Z\dgmkghjmida_bYYY[[`cchhgbggdfgghkosuv~‚„ŠŠ�‘�‘�““‘�ŽŠ…„„…„‚‚‚}€~�}}~|~~~z|{wz}z}~~{~}|~zw~vwv{vwxy{y}||}}z{‚��ƒ€‚~…ƒ†ƒ„‚�†‡‰Š‹��‘‘–›Ÿ ¥§¤¦¨¬§«ª©§¨¨¥§¢ž›—•�‹‚ukc[XS]it|w|€�~€|€|~}~~‚€zz~~€|€~€€€}|||�‚€~€~€ƒ��„„€€ƒ„…‚‚‚ƒƒ€|�|€��ƒ‚„ƒ€�‚~~€|�~ª©«¬­«¯­­®®®±®°«­¨¤¢ ¡ž—˜—•—’“‘’“’ŠŽ��‹‹ŠŒ��‹Œ‹Œ‹�ŒŠŒŠˆ����Š‹‹Š‹ˆ‰‰‰ˆŒ‰Š’Œ‰‡‹Œ‡‰‡††ŠŒŠŠˆ‹�ŒŠˆ‰ˆˆˆ‰Œ…‹ˆŠˆŠˆŠ‹ˆ‰ˆ‡ˆˆˆˆ„ˆ‰‰ŠŒˆŠ‡ˆ‡†‡†…„‡‰‡†‡‰‰‡Š‡‰„‰‰†……Љ††ˆ†„‚„„…†‚†q_?%#%&/4=ECHHOQW[^eddfabghkrqrqppikmnnnfbfjjlnmqsw}~wtuxxuuz}|usrslgc``[VQRVZ\]\]ehghcfkomkbc^ZVVYX^_dcc_aabdehilptwz|�ƒ…ŒŠ���‘�”’’”�Œ‰†‡ˆ‚…ƒ€€‚�ƒ~~z{}}}{{|~yyy{wzzz{}~~|{{|z|zzyyzz|~{y}|€|~�€}€€ƒƒ�††�„|„„„†„†ˆ�Ž�’”š� ££©¦¥¦©©«§ª¦©§¥£¢ž–“�‰€uje[SSXdnx||~x~„€~~|~{~€z}|~||~|y~€€~{~{|~ƒ‚€‚‚ƒ‚�ƒ‚€€€~€€‚€~€€„‚ƒ}~}~�‚…€�‚€€€€ƒ~~|~~~¨ª«««­­­¯¯¯²®°®¬¬§¢¢  �›š–˜“”���“����Œ‹Œ‰�Ž�‡‹ŠŠŠ‰Œ‰��ˆŒ‰Œˆ‰‹‹Œˆ…ŠŠŠˆ‰ŠŠ��І‰‹‹ˆ††‡‰Š�ˆŠ‰‡‰Œ‰�…‹‰†ˆˆŠŠŒˆŠ‹‡ŒŒ‰‡‹‰ˆ††††‰ˆˆŠŒŒ�ˆ†‰†ˆ…„†‡‡‹ˆˆˆ‹…Œ‰†ˆ†„††ˆ„††ˆ†‡‡ˆƒ†„€€kV5""('/7>BFINJNST^bcigcb`flrtvuuqppmqqnlfiooprsrrz|��|uyxywy}€xvtrnjgbb]UTXX[__`_dehffdjmmnc`\X[XYYZ``_^\[_bd`jlnrw|~~�‰ˆ���””•”’’““ŽŒŠˆ…††‚…†„‚‚‚|}|{y{{zz{{yywzw||z}{{€�~~}}z|{}z}yz|}{|{~|~|~€~|€�‚€�„…„‚~~„„††Œ‰‰�Ž‘•˜� ¦¥¥§¦¦§©¨©ª©¨§£¢ ›™•�‡rjd[VTRWdouxz||€€€}{}~}~}~z�}€|z~|€z~||}~€~~‚�†ƒƒ„�}€|ƒ‚ƒ€~�€ƒƒ…‚}�~|z}‚ƒ�~€‚€~ƒ€€€„¬§««ªª­­­®®¯¯±¯¬©¦¥¡ �œ›šœ–’’‘‘ŽŽŽ��ŽŒ‹�Š�Œ‰ˆ‹Œ‡ˆ‰�ŽŽ‰‰‹‰ˆ†ˆ�ˆ‰…†‹‹Š‰‹Œ‡�Šˆ‰ˆ‰ŠŒ†ˆ‰Š‰ŠŒ…„†Š‰Š��Š†ŠŠ‰ˆ�ŒŠˆ…Œ�‹ˆ‰Šˆˆ‡…‰…‡‡ˆ†ŠˆŠˆ†…†ƒ†…ƒˆ‰‹Œ‹Š‡‡‹‰†ˆ‹‰…‡†‡ƒ…†‰†‰‡ˆ‰…‚zeG+!"&/28?GGEIBJIPW]cfh`ecemrvzwuutuvtvvusortxzvst||€�|yuy~€}}}}~{zvpkhcc\XYVVWcc`ciggggdhkkkga]X^`Y]\[\`a[`]aekmovvy}€‚…‹Ž�’—•’—––”—�‘ŽŽ‹ˆ‰ˆ„‡‡ƒ…€}zxzw|zz}y}wuuzyy|x|}|{~~~|}|{|z{{{~~{|€~~ƒ‚~€„‚‚ƒ„�€€‚„ƒ…†‡‰ŒŽ‘”–œŸ¢¢¦¥¦§¦ª§©§©©§¥¤¤›—‘‹‚ume[YTNQZjqv{|}~{~�‚~~{€z€‚~€�{}~~||‚|}}~{~}}€ƒ€|‚„ƒ€€~}}}€~}‚‚‚��€}~~}|€ƒ��~‚�ƒ�~{}‚‚}�€†„ª««¬«­«®°°¯°±­­®«¦¦¤ œ››šš˜““’‘‘Œ�Š�ŽŽŠŒ�‹�ˆ‹‰Œ†‹Š�Œ‹‰‡‰Œ‰‡‰‹‹‡„†Œ‰‰‹‹‹‹‡‹‹„��‹ˆ…‰Šˆ‹ˆ�„‰‰‹‹‹Ž‘ˆˆ‹‹ˆŠŒ�‹Š‹Š�‰ŠŠ‹‹‡†‰ˆŠ†Šˆ†‡†„‡†…‡†ˆ„�‰Š�‹‰ˆ‰ƒˆ‰ˆ†Š‡„…‡„‡ƒ…ƒˆ‡……ˆƒ€tY=$ #(/49AGGBDB=DPQZ_ggc`cgmpszwzwt{zyz~{|{{{|zyyz|€|~}xy|}~�„}}~~{wuqjc^XYTUU\def_fhgjhhjhlmif`_\`]b^]^\`a_adjpvuzxx~…†‰Ž”’•————–š”——’��Œ‹‰ˆ……†€�zz|z||}||z|xywzxzz{|}||||}~€€~~{{|{}|€{}|||}|}�€~€|~|�‚€€ˆˆŒ��‘˜š�¢¥¥¥¨¨§©ª§©¨©©¥¤£›˜“Š…|vjd\XSOOU^gtz}{{‚}�~|}€€��€{}~{~|}~}}}{~|‚‚€€{€€€‚‚€€€~{z}~~~{‚ƒ�ƒ€}~}€…ƒ€‚ƒ‚{}�€€ƒ„ƒ«©¨­©¬­­­®¬¯±°­¯ª¨¥££ž—šŸš˜–””‘’�’‰Š�ŽŽŠŠ�Š‹Œ�ˆŠŠ‰‰‹‡‡Šˆ‡ŒŒ‰ŒŒˆˆ„ŠŽ‹�Š�ŠŠŠ‹…ŠŠ�†Š†‰†Œ‰Œ‡ŒŒ‰‹‹�‹Šˆ�“‰‰�Žˆ‹‰‹‹Œ‰Œ‹‡ŠŠ‰‡ˆ‰‡ˆ‡‡‰‡…‡„†‡Š„†‡‰‰‰ˆ‡…ƒ…††ˆŠ†„…„‡ˆ…††„ˆ…„…†}viN/! (*+27@AE=8<<@FPUZaca^bgrtxzzyuv||‚‚…„‡‡ƒ‡€|�„‚|‚|xzz}~�ƒ���€~wsje_ZRTWW`ggfdekkljkmkjqmkfdfbdcbcfdfceglqux|}|„…‹Œ’•˜›šŸ›››˜–š——“�‹Œˆ†‚„�{z|||}€€||~|||v{y|z{||€€€€~~|||z}x||€}}{}z||{}|~z~||}|}}{€~€ƒ„‰Œ��“•™™  ¢¦¤¥¨¦©¨ª©§§§¡ ›˜’‰†{voebWRPHNX^nw|}|}€}~€€€~~|€�}~}~~||~|€~�}�ƒ}}~€‚€€€~~|€}|~€�„ƒ€|€‚€�ƒƒƒƒ„�‚~€}€|�ƒ~€‚§ª«ª¬®­®­°°¯°±±®ª©¤¥Ÿžœ›˜˜—™�–‘�’“�Œ‘�‘ދЋ�ŠŽˆˆˆ‰ˆ‰‰‡‰‡‡ˆŒ��‹�‰Š�‹�‹‹Š‡Š†ˆˆŠŒ‡‡ˆˆ‰ŠŠ�‰Š‹ŽŒ‰Œ‰ˆ‰‰ŠŒ�‹‹�‰Š…‰Šˆ‰‰‰ˆŠˆ‰…‡‰‰Š††Š†††††„ˆ…‡†‡‰ˆˆ‰‰……††ˆ‰…‡‡„…„‡‡ˆˆ††‡…ƒ€u_@'%%(+3=A@>=747@DMQSZ^_afmvwz{}€|y}{|……‡�‰‹ˆ†‡‡†‰‡‡ƒ‚}zxw|~…‚�€��|rpgaVQSZY`cjgihjjlnpooorsopljlkiimljhikmtwx€€„‚‡Š�‘–™�›œ� œ™—––—–“��Šƒƒƒ€{}||}~‚‚‚ƒ€„||}||x€{{|�€~}z}|~|||y~€€~~}{yzw|z{}{{|}|}~~|{}�ƒ‡Š��’“–�ž ¡¨£§§¨¨§©©§§§¥¡Ÿ™“Œ„xqgbYSNHMQ^ju{|{}}~||}}~~€‚€|{z||~||z~~€~}~~€‚„‚}€‚‚�€|€�{€}�~}€€ƒƒ„€~€}‚€‚ƒƒ‚„ƒ‚‚~�}~ƒ„~~ªª©©««®®¯¯¯®°®®­«©¦¡¢ ™š˜—”š¤˜Œ‘•“ŽŽ����Š‹�ŽŒ‹ŠŠŠ‰ŠŒ‰‡‰†ˆˆ‹ŠŒ‹�ŒŠ‹‹Œ‰ˆ‰‰‰�ŠˆŒŠ‡ˆ†‰‡ŠŠ‰‡ˆŒ—�†‰‰‹†‰ˆˆŠŒˆˆ‹…‡ˆ‡†††‰ˆˆ‹ˆ†ŠŒ‰ˆˆˆŠ‡Šˆ„‡ƒˆ……‰†‡‡ˆ‹Š‡‡‡„ˆ‰‰…ƒ…†††‡…†‡ˆƒ„‚~nT8%!%(*/56=>:64417?ELPS[^fnnvy}ƒƒƒ‚}~‚†‰��Œ�‹‰Ž���‹††€~xwy‚�ƒ„…€„~{xrpdXTSWY]fhehlnnonqsvqvsrstupqpstppmoquv}€ƒ†……ˆŠ�‘’–˜œ�ž��œ™–—•““’‘‹†„€€€~~€€€ƒ…�†ƒ‚„…‚€��||~~}{{€€~}{{wxzx|zv{}€€€~}~xwxx||}{~}}�|}~z~~‚„†ˆ��’‘—œžž¢¥¦¦¨¨©¥©¨©¨¤¦ �›“Œ‡€}tleXTJIFJQbnuz{zz|�~}}}}~{|‚|~}|}}‚ƒ�‚��€€€}€€}}|~|€~€„}��‚��€„‚�€…�~�}�€�ƒ©«©«©¬­°®®±°±±®®­¨¦¦ �ššš˜˜–š•��••‘‹ŽŒŒ‹���Ž�Š‹Œ‡‹‰ŠŒ†‰ŠŠ‹‡��Œ‰‹ŠŠ�މˆˆ‡ŠŠ�Œ‹‹‰‰††ˆ†ˆŽ‹Š�Ž‹†ŠŠ†ˆ‰‹�‰Š††‰ˆˆƒ‡‡�‡ˆŠˆˆŠ‡‡‰‰ˆ‰�ˆ‰ŠŠ……†‰‡‰„…‡‡‰‰Š‹ˆ‡ˆˆ‡�ˆ…ƒ€‡‡…‡„„…†„€ugL0#%(*0259:=611437=BEOQZafmrw|„†ƒ†‚ƒ…„‡‰Š�Ž��ŒŽ�“”“Ž�І‚}{~}€ƒ…ƒ…‚„€�{xqpd\YTXY^begjljmksw|zwzyxvvxvvwuxvrtuxx}„†‡‡‡ˆŒŽ‘‘’™›œ›�›™––”—’“��‰Š��‚€~ƒ€€‚„…†‹‡‚…‡…‚€€€~~€€{|{{}|~}{{zvuszxzw{|~}‚~}{|wvzz}€}~}~�‚~~~|||�‚‚ˆŠ‰Š�‘—›ž£¡¤¦§©¥§©ª§¨¦¨¢¡Ÿ�•�ˆ‚xslcYQJBCGJXgqv{|}}}~z€}~zz~|{~„€~||€~€‚ƒ{��~€€�}€~|�}�€z~‚‚‚€„��‚�{}|€‚�„‚}|ƒ�~€�„ƒ�¨«ª¬ª«­°®®±±±¯°¬¨¨¥£¡Ÿœšššš“–“‘‘”’’���ŒŒŽ‹�ŠŽŠ‹�ŠŠŒ‹‹‹‹�ˆ‰‹��‰ŠˆŒŒŒŒ‰‹Š…�ˆŠŠ‹ŒŒŠ„‡…ˆŒŒŒŒ‹‡‡‰ˆ‰ˆ‡‡…ŠŠ‡ˆˆ‹‰‰‡Š‚†ˆŠŠŠ…ІІЋŒŒŒˆ‰‰‰Šˆˆˆ†‡„ˆˆ…Ї‡‰‡‡‰Š†‡‡„„„ˆ‡‡‡ƒ‡„†~yb@,$&,.378<;851/536>?CIR]`imtx|ƒƒˆ…�ˆˆ‡Š‹���‘“�”““”“‘‘�‹‡„~~}~€ƒƒ†‡ƒ‚€|uopd_[YYZ\_dglllmssv}xyz|yz{zzz|z}zy}x}}~‚ˆˆŠ†…Љ�Ž‘•––›�™›————•�’”��Š…„„~���{ƒ…ƒƒˆˆˆ‹†ˆ„‚��}|||||}zzw|z}{{xxyyyzzz{{}~|}{yvz|~|||��€}|~{~€~†‡ˆŠ��”–šœ ££¤§©¦©ª©¨¨¨¦¤¤ ˜™�‹ƒ|rl_YTIDEFKQ^hp|x|}|y|||}~x|x€z|~€€€~~€ƒ€{}{€ƒ€€€{~~|€€~|~|€�~�‚~€{|€„ƒƒ�{|�‚‚~|€�ƒ€‚‚©ª«ª««¬¬®®°±®³®¬ª¦¨¥ Ÿžœ�›š••–“‘’•���•�Œ�‰Œ�‹Œ��ŽŠŒŒ�‹ŒŒ�ŒŒ‡ŽŒ‹Š‹ŒŠŠ‰‰ŠŠŠŠ‹Ž��‡‡‰†‰‰‰�‡Š�‰ŠŠˆ‰‰ŒŠŠˆˆˆ‡Œ‹‹††‰ŠˆˆŠ‰‡Š‰ˆˆ‡‡��ŒŠˆ‡‹ˆŠŠˆ‡ˆˆˆ„‰‰‰Šˆ‡†‰ˆ‹………„‡…‰†‡‡†……�~sY7'$%.036;=97503239>DCJY^cnoty||‚„†…‰‹Œ‹Ž�Ž��’’’“–˜••‘“�’Œ‡…€|{ƒ„„‚��zvpmba]^YYZ\cgjmpqvxy|{}‚|~~}|z}}|��‚€…ƒˆ‡Š‰‹ŽŽ’““–—›˜™›š›™›—”•“��Žˆ‰‡†€‚�~�€‡ƒ…†„ˆˆ„„ƒƒ~�}}}|z}zx}{y|vyw|zxyz}||}�}€{zz|z}€ƒ|�‚~€~||€~€„„…ŠŒ�Ž––š�ž¤¡¦¦¨¨ª¨¨©ª©¦¥¤¡�™•Œ†wtlaVPGGGASOS\mz|{x{{{~z€x{y|{|€~{}z~€€~|{}~€}€}€€}}€€€~�€}}€�}~{�ƒ‚‚€|‚€„����‚„ƒƒ€~¨«««¬®«®®­¯®¯°¯ª©©¥¡ž�›››˜˜™”“’”•‘‹Œ‘’�ŠŠ��Œ����Œ‹ŠŒ��Š‹��ŠŠŠˆŠ�‰‰‰‡ŒŒŠŽŠŒŒ‰Š�ˆ‰‰‹ˆˆ‰�‰††‰Šˆ‰ŠŒŒŠ‡‡Šˆ†‰Šˆ††ˆ‹ˆŠ‰†ˆ†Š†‰‰‰ˆŠˆ††Š‡‡‡Š‡‹Œ††…Œˆ†‰ˆƒ†ˆŠ‰„„…„…‰‡†„‡‡ƒƒ‚|mQ7 #&*.59>@7:44677;@GGKQ]hkoqz|}�‚ƒ†‰Š‹ŒŽŽ“‘‘”““–—•–””‘’““Ž‹‡ƒ€xv~�‚€zypg_[^\\YU]bdlktsywyzw€€�ƒ„‚†‚���‚‚‚„€€}‚„‰‰ˆ‹‹��’“˜“™™�›œŸœ��›–š•’’�‰‹‹ˆ†€~‚~…‚„€……ˆ†„„„ƒ€�}ƒ€�|z}~||~z|||z{}y||}{~€�€}~z{y{}€~€€€||~{~}€�……‹‰Œ�“˜™›¡Ÿ¥¥§©¥«©§¨§ª¨¥¤¤�™—�„~ukbTNHDDEJMJVhsz€z{}}|y€‚}|y{}|€}|{~~|z}~~}x|}y{|��}€{€€|}€~~‚|~}ƒ~}|€€€�~€ƒ€€~|€�‚ƒ{¬ªª®ª«­­®°°¯±¯°ª­§¤£ �ž›œ––—“‘’‘“‘�‹���‹‹��ŒŽ‹�‹Šˆ���‹‰�Ž‹ŠŒ‡Š‡�ŠˆˆˆŒ�‹�ŒŠ�ˆŠ‹Œˆ‰Š‹‹Œ�‹‰†‰Š‹‰Œ��‹ˆ‰Š‡‹‡ŒˆŒ††�Šˆˆ†ˆ‹ˆ‡‡ˆŠ‰‰…‰‰‡…‡‰ˆˆ‹Œ‡ˆ…†ˆˆˆ‰†ˆŒˆ‡‡†…„‡‹‡ˆ…ˆˆ…ƒ‚ykL3"&*.0379<863479;:8403.166==;@@JPY^gljns„…ˆ�Œ‘’”———˜™š™—™˜˜žœ�›�œœš›™™˜™•“�‡}n]ZYdgjdgkopqrtsvyz~‡Š‹‘”‘�““•˜–™’•š˜——›šœž Ÿ¡¡¡£¤¡¡£¤£¡¤¤¤¤¢¢¤¥¤¢¦¢¢ ›� ž›™•Ž�‘��‹‡†‡…†„‰ˆŠ‰�І…‡†……ƒƒ‚‚‚�…ƒ€�z}ywuzzw{}z|yxxuvv{t|yz{uxxz{{|€„ƒ€�‚ƒ„††ŠŒŽ”–™ž ¢¦¥¨¥¨¨§ªª¦©¦¦¤ ž•�ƒvpb[MQNLKDECCFCAIP]duxxzzw|z~z}zzw{}~€~||{~z||€}}~}€|€|~~|~{~zz}}{€}~||y‚�|yv}€‚‚€~|€|�~©¬ª­­®¬¯¯°¯¯±±®°­¨¥¢Ÿ��—˜˜•˜••�������Œ‹ŠŒ�‹‰�Œ�Š‰ŠŠŒŒˆˆ���Œ‡Š‹ŠˆŠŠˆ‰Š�Šˆ‰†‰‹ˆˆŠ‹ŒŠ‡ˆ‡ˆŠ‡ˆˆ‹†ˆ‹ˆ‹‹‹‰‡‡ˆˆ‰‰ˆŠ†Š†ˆ‰…†ˆ‹Œ‰‡ŽŒˆ‡ˆ†ˆŒˆˆƒƒ‡‰‰†ˆˆ‡„‡‡†ˆ††ˆ……†ˆ†‡„ƒ…„„�|s_C./5;>:<972223598?;?AIPXdfimsy€…‰ŽŽŽ�•™˜˜š˜š›š™–™œš››�žž�ž�™—œ™—’‘…{q^]]bfefhpruyxxuy}€ˆ‹‘”””�’•—™™˜˜™˜™™›™ œžœ ¢¤¢¤¤£¢¤¤¤£££¦¡§¤¤¤¥¥¡£¤¡ � žš›™’”�ŒŒ‹ˆ‰‡ˆ„ˆ‡‰Š‹�‰ˆŠ…‡‡ˆˆ…€‚€‚�€€„|€{{zyxxyz~{~~}|w{wzy|y{|zxxzy{€�„‚‚€|‚�‚ƒ‰…ˆ‹�‘”�œ¡ ¤¤©©©«§ª««§¨§¥£¡–�‡zrdXONQRODBCBDBBGORbrzzwy|{zz}y~~~~{z||€z{}|}€|y€�}~{~}xx€{~}€~{‚}z{}‚€~€€ƒ~|�~‚}©®§­¬¬¯­¯°°°°±¯­«©¥£� �š–‘–––�‘‘��Ž�ŠŽ���ŽŠ‹‹ˆŒŠŒŽŠŠ‰Šˆ‰Œ‰Š‡ŠŠˆŒ‰‰ˆŠŒŽ‡ˆˆ†Š�ŒŠŠŠ�ŠŠ‰‰ŠˆŠ‰Šˆ…ˆŠ�ˆŠ‹Š‰‡†ŠŠˆ‰Š‹Š�ˆ‡Š‡†‡‡�ˆŠŠŠˆˆ‰‰Š‡†…†‡††‰Š‡ˆˆ‡†ˆˆˆ†‰‡„‡…ˆˆ„…„‡„~{n[;,.4;?9878677577;;=>CISY_ijot{ƒˆ‹Œ��“•–—›˜š�Ÿ�››™�œžž Ÿ���žœ�ž™——�„zk^``^dikoty{}~~|~~€Š��’˜–—–™›˜™™ ›™™›š™Ÿ  ž££ ¢¢¥¦¥¥£¤¤¥¤¥¤¥¤£¥¤¢¢£¡¢ ¢ ž�›•˜“�Œ��‡ŠˆŠŠ‹‰‰ŠŒ‰‰‹ˆ‰„ˆˆ…ƒƒ�€�‚„�||z{y{~}�}�|€~}{}z}|}y{~y|{{~‚ƒ„‚„�‚ƒ…Š…‰���–—›ž¡£¤¥§§¦©¨©¨©¦¦§¥Ÿ�–Ž‚tj[POOULEFDFGBDBIMZitx{|}{w|�~�}}}~|z|~{|}||{�}zz€€~|‚~||{|‚‚�|}|‚|{~}z|~{€~€{~€‚€~z‚‚…}}­««¬¬°­°®¯²¯¯±°¬ª©§§ž �šš›’““‘������‹�Œ‹Œ‹Š‰ŠŒŠˆ‹Œ‹‰Œ‡ŒŠŠŠŒ‰‰ˆ†‹�‰Š‡‹�‰‰Œ‰ŽŠ‡ŽŽŠ�Š‰ŠŠ‰‡‰ˆ‰Šˆˆ‡ŠŠ‰Š‹‰‹‹‡Š†Š‰‰†ˆ„‰Š‡ˆ‰Š‡‡‰‰Š‰ˆ†ŠŠ‡Š…‰„‡ˆ‰‡†‰ˆ†„‡ˆ‹…‡†…‡ƒ‡‡‚„„††xjS6+,7<=83679;6959<<=?GNR^gnnow|€ŠŒ‹�‘•˜—›šš›š�ž››ššŸœŸžŸžŸžžœœ››˜’Š~rd]]]]eiluxy€ƒƒ‚ƒƒ€€‡Š�“•–˜›š—›˜››™›�œ››�¡žœ¢¢¡ ¡£¢¤¦¤¦¡¥¤¥¥¤£¦¡¡¤ ¤£¡¡¢¡¡£Ÿ�˜™—“‘����Œ�Œ�Œ�ŠŒ‹ŠˆˆŠˆ‡ˆ„�ƒ�ƒƒ‚ƒ�€€}|~|}z{€‚‚ƒ„}~€~z||}|||~z|}ƒƒ‚……‚€ƒƒ…‡Š�‘�”—•œŸ  ¤¨¦§¦§¨¨ª§¨¥¦¥ �™‘†{l`UNQLGGIHHBACEDMTanv|{~{x|€~{}€|{|€�}z||~~}}|�~‚€€€€|{{~�€€~ƒ‚€€~~~{{~�|~�€{~}~…}}|�ƒ‚~}ª­««¬¬®­®®¯°®°®¬¬¨££¡¢œš�š”’������ˆŽŽŽ‹�Љ�‹Š‹�Š�Š‹‡ŠŠ‰Œ‡‰Œ†…†ˆ‰‹ŒˆŠŠŠŽˆŒŠ‹‰Š‹‹ŠŠ�ŠŒ†‰ˆ†ˆ‹‹ˆ‡Šˆ‰Š†‡‹‰ˆŠŠˆ‰‹Š‰†‡ˆˆˆ…†ˆ‰ˆ‡‡‰‰‡ˆ†ˆ…ˆ‡‡‡‡ˆŠ‰‰†‡‚‡„‡ŠŠ‰„††…ƒ…ƒ…ƒ……zeP2/0;A;8337667;8;;=ABFOUbflmsw|ƒ…�Ž‘�˜›–™š›��žœ™š�ž� ¡� ¡  �›�š˜’Š‚zi\TTX]fkn{|„…†ˆˆ„ƒ„ƒˆ�’–—››š˜šœšŸš  › ž šž¢Ÿ¢ ¢¡ ¤¤¥ ¢¥¥¤¤¤¢¦¤£¡¥¦¢¢ ¡Ÿ¡¡¤  �˜—–”•’’��’‘‘�‹ŠˆŒŠˆˆ…‹†ƒƒ€‚€�……‚€��}€€}}z{|…ƒ€ƒ�‚€�||z|}{|{‚ƒƒ„†ˆ…ƒ„‚…‹‰��’–—šœŸ  ¥¦¦¨¨¨ª«©§©¦¦¥¡ž˜’‡|rcZSTJIIKGCA@@>AINZksyzz}x||}}}~|~z}}€}|z€}z||z~†�||€{xx|€}wƒ�…‚z|~y€‚}~|}€�}‚��€~~}««««¬¬¯°®±¯¯±°°«­§¥Ÿ¤žž›™™’’“��Ž�Ž���‹Œ������Œ‰�ˆŽŒ‰‰‰‹Š�‹�‰†ˆŠ�ŒŒŠŒˆŠ‹Œ‰‰Š‡‰‹‹ˆ‹‹ŒŒˆ‡ˆ‡…‡ˆˆ†‡ˆ‡‡ˆ…‰‰‡ˆŠ†‡Šˆˆ†Š†ˆˆ‡‡ˆ‹ˆŠ‡ŠˆŠˆ†ˆŠŒ†ˆ…‡†‡‹†ˆ…†‡ˆŠ†‡‡‰…†ˆ…‚†ˆŠ…ƒ‚ziL:049B?8345958?:>?>>AIQY_dkpswx€†Š�““•š˜›šœ™œ›œžœ���    ¢   ™š—•‘…|n^TIRUfhow}�†Œ‹Š‹„„††ˆ��—•™šœ—››�œ�¡�ž  Ÿ¡žŸ¡¡ž £ ¢¥¤¡¢¤¦¤¤¦£¥¥¢ ¢¤¢Ÿ  ¡¢¢ ¡Ÿ�™˜˜•—–‘�”�”�Œ��‹��‰ˆ‡‡…„„€…ƒ�„€�}z|~€x{}€€„‚‚„‚~}}€z~z}|}}€€~�~‚„‰†…†ƒ…�ˆŠŒ�’”™™›�ž¡£¥¥¥ª«¨ª¨¬§§§¥¥œ™�ˆ~reaVPLIEGEAB<@@BEMRemvz{zx~}€€{z{y}€~€€~}~{€~~|‚ƒ|~}{~zwy€{~ƒ…~€…‚~€�}~�‚|�}~€€~€}‚€©ª¬««®¬®®¯®±±°°®ª§¤£  ž�š•–’”ŽŽŽŽŽ�Ž�Ž‹ŽŠ������‰‰‹Œˆ‡‰Š‰‹‹ŠŠˆ„‰ˆ‰‹‰ŠŠˆ�‹‹Š‡‰�ˆŒŠŠ‹�‰‰‡‡ˆ‡†‚ˆ…‡ˆ‰…ˆ‹‹…ˆŠ‰†‡ˆ††‡ŠŠˆ†ˆˆ‡††Š‹‰Šˆ‡‡‰ˆˆŠ…ƒ†ˆˆ‡††‡„‰ˆ…ˆ„ˆ†‡…ˆ…‡†‡ˆ…‚�zhP9,1@@?;445388<=>ACADMR[eiortxz€‡‹‘Ž”—™�›™››�›�›��Ÿ�žž¡¡¡¤¡ž�œ—“Ž‚x`TINR[eqwz}„„ŠŽ��‹‰‰…ŠŒ‘“‘•š›š™œœœž›žž  ¡¡£  ¡  ¢££££¢¢¡¤§¥¥¡¦¢¥¡¡£¡¡¡¡¢ ¡¡ž��žš–—™••”‘“’“•ŽŽŽ‘‹‹‰Š‹…‡ƒ‚€‚��„€�|}|{zzy{}wwz||�}||z~|}{{��€‚~„„ˆ…‡†…„„ˆ‡�Ž’”—˜�Ÿ¡¢¢¥¨§§ª¨ª¨ª©ª©¢£›˜’…}rh]UNJKECD??;>:8ABFGLLXiv{z}z|~}{{{|{|y|}�||{{||~|zz~�}}y|€~~{|€}}‚~~}€~€~~{}}€~|~|~zx|¬ª¬«­­­®®¯°²°±®®¬¨§¡¤žž—“�’”““’‘���Ž��‹Ž‹‹‘ŠŒŠ‰Š‹‰‰‡‹‡ˆ‹ˆ†Š‡„‡ˆ‹ˆ‰Šˆˆ‹‹�‰‹‡Œ‹‡ŽŠˆ†‹‡‰‡Š‡‹‡…†Š�Š‹Œ†‡‡ˆŠ‰Œ‰‰‰…ˆ‡†‡‡†‹ŠŽŒŠ†ƒ‡ˆ‡ˆˆ‰ŠŠ‰�ƒ……‰‰†„ˆŠ‰……‡„††‡…‰‡‡‹†…„~~|gF,&/799;424;;@?@>EEFJSYdmty{ww~�‡‡‰�•˜—š›™›š™›ž��� Ÿ Ÿ¡ ¡Ÿ  ›““ŠyeOGHPYfmwy�†‰†‡‰�“”‘�‹�Ž’”’••—›ž� ¡��ŸŸ›ž¡££¢¦££ ¢¡£¥£¢¢¡£¡¡¤¥¥¤¤¥£¥¤¤¦¥¤¢££  �žš—”—“‘�“�‰‹�Љˆˆ†‹†††‚……€€€~|‚~€~z€zvzw{{ytv{z{}}}~|}{||}y||y~{~~‚„„‡…‰‰Š‡‰†…‹�‹•˜™œž ¡¦¤¨§§¨«ª©ª¨§¨¨£¡�š“‡{rhZQNLFC@=:;;=AEGGILSanx|€{}€€|{y|y}|}y‚|xy||}€~{|€€~xx€{}~€€|zx~€{|€~~€|{~‚}}}}~�y|y}©©«­¬®«­®¯¯³±±²®¨©§¥Ÿž�˜•“—‘”‘“��Ž��Ž�ŠŒ��Œ‘�Šˆ‹‰‹�‰‡‰Š‰ˆ‡‰Š……‰ˆŠ�ŒˆˆˆŠ‰‡ˆˆŠ‰‹•‘ˆˆ‡‡‰Œ†ˆˆ‡…ŠŠŒ‹ˆŠ‡ˆˆ‡ˆˆŠ‹‡‡ˆ‡ˆ‡Š†‡ˆ‹‹Œ‡Šƒ†‹ˆ…‰‡‡‰Š‰†„‚ˆ‰ˆ‡ˆ‰ˆ„„……‡„‡„†‡…‰‹†„„‚zeI/(/3:895677:=>==>EDIKNPV`fqy|zzwz~ƒˆŽ–•—™›œ�›šš››�� Ÿ�ž ¡¡ žž™“ŠkXQT\cmpy|�…Š‹ˆ‰‘•”—“”•••’““˜–šš�Ÿ¡Ÿ žŸœœ  ž  ¤¡£¤¢¤¤¥¥¥¢¤£¤¤¢¥¦¢¤¤¥§£¦¥¨¦¥£¤¡ž£ž›˜˜•““���‹ˆ‡‡‡‡„„„„„€ƒ~|yx{yz{zvzxvwxxw{wwyvz{|}€�}||{zyvw{z{|||�ƒƒ…ˆ……‡‡ˆ‰‡‰��•™˜�ž¡£¤¥§ª«¨¬¨««§¥¦¦£¡œ“‹ƒ{pi^SLFD@<9;<;>AGKHIHNUbkvx{|€}}z|~~€z~}~{x|y}}�~z{�y����{{~€}}‚|~€}��‚€~€�||�‚‚~{~�~}€z¬ª¬«¬®ª¯®±¯°±°®®ª¦¦¡ž œ›™–“••‘‘�Ž���Œ��Ž‹�‰Ž‰„‰†ˆ‹‰ˆˆŠˆŠ†‡‰ˆˆ‡‡Š‹‹ŒŠˆŒŠ‰‰…ˆ‹ŒŠˆ‰‹ˆ‰ˆ‰„‹‰……‡‹‡ˆˆ‰‰‰Š‰‡‰‰ˆ‹ˆˆŠ‹‡‡‡ˆˆ‰ˆˆŠ‰‡‡Œ†‡‡…Љˆ†ˆˆŽˆŠ‰‡‰Š‡ˆ‰‰‰‰‰‰‡‡‡‡‚†††„‚�ycF,'*29===>?=<;=AJMOPRYckvx|{ws{~}€ƒŒ‘•—™š››››š™œœ›�¡Ÿ   ¡Ÿ›ž–�†xh`dckpsy€ƒ†‰Š‰ŠŽ”•™——˜•————••™ššœ£¡ ��ž ŸŸ�¡ ¡ ¢¥£¡¥¥¤¢¥¥¤¤¥¥£¥¦£¦¥§¥¦¦©§¨¤¥¥¥¡¥ �›˜™–‘��Š‹‹‰‡„‡†�…ƒƒ�€‚|€y||vwzzwwvxvyxywxxvvvz|~~~|~~{|zxzz{yz}‚„ˆ†Šˆ‡‰‡‰Š‹�“”–™��¡£§¨§©©ª«©¨«©¦¥¤¡ž�•‰„ztj\TJID?>9:9=>ADJGFHNOXbsy{~|}{{{}~{}{}z{}}||~‚y||||~€€}~{{}~�€�}}||}{€�„€{�}€€€}€�€{}�€€~«¬¬¬¬­­­­±¯°¯±±¬ª¨££¤�žœ˜›–“–’�‘‘‘Ž��Ž��‘’ŠŒŠŒŠŒ‹ˆŠ‡‰‰‰‡‹ˆ‰Š‡‰‰‡ŒŽŒŠ‹�‹Š‰‡‰‹ˆ‡†ˆŠŠ‡‡ˆ†‰Œ‰‰‡…†ˆ‰ˆŠ‰‰Œ‹‰‹‹Œ‡‰Š‡ˆ‡†Šˆˆ‰‰‹ˆ†‡‡‡††‡ˆˆˆˆ…‰Œ†Š‡‡�†‰†ˆˆŠˆˆ‡ˆ†‡„„‡‡‡„�ƒueB,%&08:;;@=>@ADFGGDGHPYfnsyyz}|€z~~|~|{|y||}|}}}|�~z€z|~}|z|€‚‚{{~|}}‚‚~}yƒ}{~�~~€~z€€«¬ª°«®¬®¯¯¯±²®®®ª¥¥¥ Ÿœž™˜—”’���Ž������Ž‹‹‰‹ˆŽŠŠ‹‹‰‹‰‹‹‡ˆŠˆ‰‹ˆ†‡‹ŽŠ‹‡‹‰ŒˆˆŠ�‹Šˆ‡Ž‰‰‹‹ŽŒ�‹‹ˆˆˆ†ŒŠ‰„‹ˆˆŠŠŠŠŠ‹‹…Šˆˆ††ŠŠ‹�‹ƒˆ„†‡ˆ‡‰‹Š‡�‰‰‡‡‰‰…Їˆ‹Š……ˆˆˆ‰ˆ‡†…††„‚�zcK/$"-33@:>>AGKR]cfmsyxytpquz|�†‡��•“••–•–––••š�žŸŸžœŸœ›’„xprx„€‚‚ˆŽ’�Ž�Œ��“˜œšŸž™›�š™—™š›œŸ ¡¢¡¤¡¡¢ž¢¢ž ¢¢£¥¤¥¡¦¥¤¥¤¤¤¤¤¥¤¥§¨§¥¦§§©¦¨¦¥§££¢  ŸŸ ››••“��ˆŠ‡†Š‡†ƒ…„‚��†ƒ‚}wx|{utvwvy|x~x{x{y{{}~|z|y{{|{~}‚ƒ…„…‚ƒƒ†ŠˆŒ��””š›ŸŸ¡§§¦¨¨¨§¨©©©¨¦¦¤£˜–’‹„‚wma\SKIA>==>===?CCJFEDGLR_jtxy{}~{�~|x}z�}||z{|y~~||x~|~~€|||{€€€‚|~}}}}�‚|}€|{€~€{}�€{|~‚}€„„ª­««­¨®®­±¯¯°²¯¬§¨§¢Ÿ�œ›–™—‘�‘Œ‘���Ž’��‘‹‹‡‡ŠŠ�Š�‰Š‹�‡‰‰‰‹ŠŠˆ††ˆŒŒ�‡Š‰Š…‰‰‹†Œˆ‹ˆ‰�ŒŒŠŠ‹ŠŠ‰‡ˆ‰ˆ†‹‰‰�‡Šˆ‰Šˆ‰ŒŒ‡…‡……ˆŠŠ‹‡ˆ‰†ˆ†Š‡ˆˆˆˆŠŠ‹‡ˆ‡ƒŠ‡ˆˆŠŠ‡††‡‰…‡ˆ„‡‰†………€{iM3""(,/7?<:<9=>>ADGGDEBFLOR^qwvz~y}~uxz}}~{}{€€{y}||x�~}||}‚~~€||€�}}|{|}}|y}}~~€~~€ƒ‚ª«¬¬­­®­¯°±¯°²°©«©¨¢ �›™—•˜”�����Œ�ŽŽ’����‹Š‹ŠŠŠ‹‹Š‰ŠˆŒŠ‡ŠŒŠ‡Š‡ˆŠŠŠŠ†‡Œ‰‡†‰‹‰‡‡‰Š‹Œ‹ŠŠŒ�‰Œˆˆ‡ˆ†‹Š�Š‹‡‰‰ˆ‰‡Ž‹‰„††‰ˆ‰Š‰‰ŠŠ‡‡ˆ‡Š‡ˆŠˆ‰ˆˆˆ„„†‰‰‰‹‡…‡‰ˆ‰„‡Šˆ††ˆ‡……‚�|hK2# &(35=4<4788734355:;CJQZahntuompqs{~‡���•‘‘‘���“’”š—›�œ ¢ žœ’‚|{ƒ„Œ�‹‹‡„ˆ‹��—•”’���•–˜�Ÿœ›�›��œœ�ž�Ÿ¢¤¢¢£¤¡££¢¥£ ¢ ¢¢£¢¥£¤£¤¤¤¦£¤¥¦¦§§£¦©§¦¨¦¨¥§¦¦§¥¥¢¤¢ Ÿ œš˜–‘‘ŒŽ‹ŒŠ‹‹ˆˆ„†…†ƒ„…€ƒ|€ƒ„†ƒƒ‚ƒ��€€†ƒ€~€|z{{{|…†‰ŒŒŠŒŠ��Šˆ‰Š��——™��¢£§¦©¨ª¬§©©ª¨«¤§¥¤ž™“‡{phb_[TQMECFCC@EBA@DAAACDGFGPZkttw~{|}zzxzz||y{{|~~‚{}~y{}��€}|~{}€€}{|€~{|~|}}|}{z~}~‚~|~~|}ª¬­­«®®¬®¯°±²®°«¬ª§£Ÿž™š——˜”••����ŒŽ���Š‹ŒŠˆŠ��Œ‰‹ˆ�‹‰‰Œ‹‰�………‡Œ�ŠŠ�‡ˆˆ‡„‹†Šˆ‹†…‰‹Š‹�‹ˆ�Ї‰‰ˆ†‰ˆ‹‡‹ˆ†‰‹†ˆ‰ŠŠ‡‰‡‰…ˆŠŒ‰ŠŒ†…††Šˆ‰‰…†ƒ‰ƒ‚‚‚‡…†…†ˆˆ‰‰Œ…†‰‚‡…ˆˆ†…„��zmT3&$#)/:94556674;?BOSZcnpsnmpquxƒˆ�”•’““�����’•–šœ�™¡¡¡Ÿ—‹~z‰‹‘�ŠŒ††Š‹�•–””’�‘Ž’–›š�š›žž››ž›žžžž¢¢¤¢¤¤£¤¥¢¥¤£¥ £¤¤¤¤¦¤¤¢¨¤¤¤¥¥¥¤¦¨¦§§¨©ª¥§¨¨§¦£¨¤§£¢¢¢¢žœ›–”’‘��ŽŒŒ‹‹‹‡ˆˆ‡‡ƒ‚‚€‚�‚„„†„…ˆ‡…„†€€‚ƒƒ‚}}~|}}~ˆ‡‰ŠŒŽ‹�ŒŒ‹Ž�Š‘‘’–—��£¢¥©¨©¨¨¨««¨ª©©§££ ›“‰olb]VROLIJDDDDBBAACAA?CEIFFKVcmsvtx}|zzyy||yxzvz~||~€|||€€~~~~}||~|}‚€{{{{„�}~|‚}~€~�~€€ƒƒ|«©¬ª¬¬®®¯¯°¯®°±¬¬©§¢žž›˜˜š””–“‘މ�“’Œ�Œ‰ŠŠŒ�‰‹‹‰ˆ‰Œˆ‰‰‰ŠŠ‰ˆŠ‡ŠŠŠŠŽŠŠˆ†Š†ˆ‹‰‰Œ‡†ˆ‹‰Š‰ŒŠŠ‹‡‰ˆ‡ŒŒ‡‰Œ‰ˆ†‡‰‡‡ˆ‰‰‡†‰‡ˆˆˆ†‰‰ˆ‡‡‡„‡‡‰†‰Š…‡ƒ„‚ƒ…ˆˆ†……ˆŠ†ˆ‰Œˆ…†‡‡…‡‰ƒ…„€nY8'"'&*2137784799<;ILV`hprnllquz†�’“—•”’“��Œ�“˜—š��œœ ž–�‚}{‰“��Œ�‹‡‰‹�‘”——”‘”‘’–—™™˜��š���žžŸž¡¢¡ ¤£¤¤¤¦¦£¥¦¢¥££¦¤¤¦¥¢¤¦¥£¥¢¤¥¢¥§§¨¦¨¨¨¨©©ª¨§¨©§¥§¤¦¥£ ¡¡�œ˜—–”‘�����ЉŒŠ††�„€€��„„‡ƒ………ˆ…†…‡„�€€‚�ƒƒ€€|}��„‰…ˆ‰�Ž‹�‹Œ’��‘“”•™›ž£¦¤§¥©¨ªª§«ª¨©©©¤¢š›˜Œ‡rke\TTPJJIHJDBCC@BC;<>AGGGCGPXesrsuz|yz|~|{vvy{~}|~{z}~{}|~��~{}|z~|~|y{€€€€|~|��€|€~}}|€€|«««««®®¬°±®¯±¯®¯­©¦¤žžœ——•””‘‘•��Œ’����ˆŠ‹Š‹‹ˆ‹Œ‰ˆ…ŠŠŠ‰‹ˆˆŒ‰‰‹Œˆ�Œ‰…ˆŠˆˆŠˆŒ‰‹†ˆˆ‹�‰‹‹‹�Šˆ†‰ŒŠŠ‰‡ŠˆŠ†‡ˆˆˆˆ†‡‰…‰Š‡‰‰‰‰†…ˆ‡†ƒ‡…†‡‰††‡†…‚„‡†„ˆ‡‰Š‡‡‡‡‰„‡…†„ˆ‹‰…‡„€}s]?'%#%'+-359334::;?AJQ_gronooryŠ�”›––—”’‘‹ŒŒ“–›ššš›œ™—‹€€€†Œ––’�‹�Љ����”••“”‘‘”•™˜™™™œžš� ŸŸ� ¡£¤¢¢£¤¤¥¥¥¤¥¥¡£¥¥§¦¥¥¥¥¤¦¡¦¢¥£¤©¦¦ª¨§§¦©©§«¨¨©©¨©¥¢¥¨£¢¥¢¢žš›—–’‘‘��ŒŒŠŒŠˆˆ†ƒ„‚€ƒ‚ƒƒ††‡ˆ„††††�€�}ƒƒ€‚„€€}€€~€†…‰‡ˆŒŒ�Ž����‘‘–•˜››Ÿ¥¥¤§«¨¨©ª§¨¨¨©©©¥¢Ÿ›˜’ˆ€ribXTOGLIGJH@CDCE=;7??HHDCGIP]nusx~€|}z|~|ywwzxz}z|{yx~�€z|}€{{z{|~��{ƒ|€}}|~~||{|}€€€¬«ª«­­¯­¯°±±±±®¯««¦¢Ÿž˜——”‘“‘’•���Ž�‹Ž‰‡‹ŠŠ‰ŠŠŒŠŠ‡‹‰Œ‰Š‰Š‡ˆˆŠŠ‹ˆŠ‹‡‰†ˆˆ‹‡Š�І‡‰ŠŒŒˆ‹�ŒŒŠŠˆŠˆŠˆ‰†‡ˆŠŠ‹‡…Šˆˆ‰‹‹…ˆŠ‹‹ˆˆ‡ˆˆ‰Š„„ˆ†ˆ‡‰†…‡††ˆ†††…†‹ˆ†ˆƒˆˆ†ƒ…ƒ†‹‹‡†‹„ƒvcC)$$&'.+21346968;=AGK\dlqlqtt}„Œ�–“—–—•’‘Œ‰Ž“–™™—™˜•Œ‡€{€‹“••“’���Ž‹��‘‘•••˜—”••—˜™˜š›�›���›žž Ÿ£¡£¡¤¦¥§¤§¤¤¤¢¥¦¡§§§§¥¤¥¤¥¦¥£¤¦¨¢§§¨¨¥¦¨¦ª§¨¨¨§¦¨¨¥§¤¤¤¥£¡¢œž›�–“˜”“‘’ŽŒŠŠ‰‡†ƒ€�ƒ‡…‹Š‡†Š…ƒ‚‚„€€€‚�~…‚~€|€‚‚…ƒ‰†‹‹‹‘�‘‘���”•™—›�ž¤¦§¥«©§«¨¨«¦ª¨ª¤¤¢žš›”Ž‚zsf[TLJHJJHFFFCGA>9=?<@EILDFJUhpu{|€}z{{xw|w{|€|z~|{|{|z~~{|~|||~|{‚|{~||}}~{{€~}}|{z|{|}}�|«¬««­«­­°¯±±¯±®­ª¨¦¢¡žœ˜—•–‘“‘”‘�ŒŽŽ��‰‰Š‹‹Š‹ŠŒŠŒ‰ŒˆŒ‹‹‹ˆŠŒˆ‰‹Š‡‡ŠŠ‰‰†‡ŠŠ‹��ЇˆˆŠŠˆ†�Ž‹�‡�‰…‡‰Šˆˆˆ�‹‰‰ˆ‰ˆ†‹�І‰ˆ‰‰Š‰‹‡Œ‰‰ˆ†ˆ…ˆˆ…Œ…‡„ƒ‰…ˆˆ†ˆ„Ї‰‡†…„…�…‰‡‰……‡…ƒ€ziG.&&$'(,./13668:@@GINWbihpsxx|†‰�‘”�’‘‘”�Œ‹�‘˜“•��Žˆ|y{‹�”——‘””�‘Ž�Ž��’‘™•˜™™••™——™š™�››œœ�¢ž¡ ¡¤¢¥¤§¥¤¦££¥ ¢¦¥£¤¨¦§¡§¦£§§§¥¦¨¨¨¥§¦¨¨§¦§©©§¨§§©¦¦©¦¥¥¦¥£¥£¢ ¡¡Ÿœš™–”““‘�‹Š„†„ƒƒƒ„‡†ŽŒŠˆŠ‡…ƒƒ„€‚�€~€„�‚‚‚|~…ƒ…‹ŠŒ‹ŒŒ‘’‘“”’˜–š›ŸŸ¢¤¤¦ª¨©©«ªª¦©©«§¨¦¡¢�š“Œˆ‚ujaUOMGHKJHEHDFB@@>>??CGGGDFL^muv}|~~}|||{{{{~~€z|||{x~|~~}z}|{z||€~{~|{~{zƒ|z}}|~‚}z{|z~€�ƒ~~¨ª«­­®«®°°¯±±°®¬«¨¥¥Ÿ¡�™–––”’–”����Œ’�ЋЉ‹‹‰‹‹ŠŠ‰��‰‹Š…ŠŠ‡ˆˆ‹‹ˆŠ„ˆƒˆ‰ˆŠŠƒŠ‰�‡‰ˆˆ…†ˆˆŒ‰‹Ž�ˆ‡Š‡Œ‹ŠŠŠˆŠŠŽŒˆˆŠ‹‹‹‰†…†ˆ‡ˆˆˆ‰††ˆˆ‰†††‡‡………‡‰ˆ‰†††Šˆ†‰…„…ˆƒ‰…„ˆ†ƒƒ……€ykO3&$'$',-0048:6>?FELQT\gioz}~„…„…‚ƒ„…�‡‰‹��Ž’�Ž…‚zuqy|‰“–——“‘’‘‘�ŽŠŒŒŽ�’•˜™œ•———˜–š–šš˜œœœž¢ ž ¡ ¢¤¥¨£¤¢¥£¤¤¥¥Ÿ¤¦¦¦¤¥¤¥©¥£¨¦§§§§§¨§§§§§©¨¨¦¥¦«¦©¥¥§¨¥¥¥££¥§¡¤¡¡¢ œœ˜—–”�ŽŽŒ‡‡…€ƒ……ˆˆŽ�‹�Љ‚†‚‚ƒ‚ƒ}€}��‚€�††ˆ‰Œ��Ž”‘“––“‘–—›� ¡¥£§©¨©©§«©¨«¨ª¨©¦¨¢¢š˜‘Šƒ~wm`[QJKGHGGGDADB?B>>=B?DFHC@JVcpw{||}~z{z|{xz~{z�{�{{{||{�|}||}|~|€|{|}ƒ~~~{z}~|~�€|{}|{|�~ª¨¬­®®¬®°°®°°°¯®¬ª§¥£Ÿžšš–˜’’•”Œ���‘�ŽŠ‡ˆ‹‹ŒˆˆŽŒ‹‹‰Š‹Šˆ‡‡‰Š‰‰ˆŒŠˆ‰†ˆŠ‡ŠŠˆ‰ˆ‹Š†ˆˆ‡„‡††‰�Š‹‹‰‡‡Š��‡Š‰Š‡‹‹�…ŠŒˆŠˆ‰††‡‰‰‡‹‡Š‡‡‰††…†††ˆ‚‡†…„‰ˆˆ……ˆˆˆ†ˆ†„„†„„…††„ƒ„€‚~lV9,&&&),-2559=CCGGGKQRYakqx}€zrqmmqzy€€…‡†‹‰‡~wtovu�Š’™—š–““�’’Š‹‹‰‹‹‘‘–›—™——˜™˜˜–˜œšš��ž™�� ¡¡¡¢££¥¥¦¢¢¤£¤¤£¤¥§¤¤¨§¦¥¨§§¨©¨¥©§§¤©¦§¦§©¦§¨¦¦§¨¨§¥¨§¤¤¥££¤¥£¢¤ £¤ž�ž™™•””�ŒˆŠ„ƒ‚‚‰ˆŒŠ�Œ��…‡†‚„ˆ……�‚ƒ}€~~€~‚€…†ˆŠ‹�Œ‘”“•””˜”•˜™œžž¢¤¦¦ª¨¨¬«©¬§¬©¬©§§¦¡¡š™‘Š„{ui_[XQJHDHFEEC@@DAC@?>GFDBA@AFFIECGMYdksywwyz{yvxyx{~~�||~{z|||}~~|y}�x|}~|�|}‚ƒ�~||{y||€‚€}}€|€€¬¬­®­ª®®²°°±¯±±¯¬­ª¡Ÿœœ�–“–––›�“Œ���Š�Š‹‹‰‰‹‡‰ŒŠ‹Š‹Š‹ˆ‰‡††ˆ‰‡ŒŒ�‹ŠŠ‰‹‰ˆˆ�Œ‹Š†‡†ˆ‰‹‡‡ˆ‰Œ‡ŠŠŒ„‰„ˆ„Š‹Šˆ‰Š…‰Š…‰ˆ‰Š‰ˆ†‰‡‡††‰‡‡‡‹ˆˆˆ…‰ˆ…‡…ˆŠˆ†ŠŠ‡…‡‡„„†ˆ…ˆ‡‡„‡ƒƒ‚ƒ‡…„xhH0#"),05;@DEDBBGIGEINY^jpw{xiZLGFPW[`flqtnpssvspt}‡“–—œ™–””’���Žˆ†‡‡ˆŽ�‘˜•–•˜˜˜˜ššš››œœœŸŸ›� Ÿ¡�¡¡¦¢¥£¥¤¤¥¤¥££¥¤££¥¦¦¥©¥¨©¨¨©¨©§§¨¥§©£©¥§§¦¨©©¥¥ª¥¨¨¨§¦§¥£££¡£¤£¥¢£¡��›™™��ދЄ„‰ˆŠŒŒŽ����Œˆ‡‰�Š��‡‡…‚€�€„…ŠŠŽ�Œ‘’“”•™™™›™š› � ¥¤¥¨ª©©ª«««®­««©¨§¦¦ŸŸ™–‹„yoe_XVUNFFGIGDCBCHIHFB@?DDHECENVV]luuxzz{xyvuuy{~ƒ€}}|yz~x|~}zzzy~|}y{}|€„�|z|xv|{}‡‚~{|~{‚‚|©««¬­®­¯­°³¯¯±²®¬ª©¢¢ž›™•’‘˜¤¢���Œ�Ž��‹Œ�ˆˆ‰‹Š‹�‹ˆŠŠˆˆ�‰‰‡‡†‹‹��‰�‡ˆŒ‹‰ˆ‰Š�†‡‚ˆˆ‰‰‡ˆ‰†ŒŠ‰�‹‹‡ˆˆˆˆ‰‹‡ˆ‰Š†Š‡‡‰‹‡‰ŠŠ…††‡‡…ŠŠ‹ˆˆˆŠ‰‡ˆ‡„ˆŠˆ‹‡‰‰‡…†‚‰†††„†…ˆˆ„†……ƒ„ˆ‚{iL4' *208>BBCBA;@GGGINV`ju|xkS?9:DPX\eklqqmrtvy€~…Š’–ž›�š–•’��ŽŽ‹††††‡��’•–—™˜˜˜˜›š�š��� ŸžžžŸ��¡£¤¡£££¥£££¥¦¤£¤££§£¦§¦¦¦¦¨¨§ª¨§§¨¦§§¥¥¦§¥¨¨©¨¨¨¦¦¥§¨¥§§©¤¤¢£¥¡¤¥¤££¡ž¡›™™”Ž’�Œ‰‡Œ�ŒŽ“�“”‘’ŽŠŠŠ‹Œ��ŠŠŠ‹‡‚‚ƒ„�†Š��Œ’”••–—™™—›šž� ¤¤¢¦§ª¨«ª©¬ª««¬ª¨¨«¦¦¥ ž™–Œ„yqg`[XVOLIDFDKEDFIIFFABHFBEFGJNNQTapuv|z{zzww|}|~‚„{|~z}}{z}{xz}{~}z~}{|||~�{~€||y|||‚‚€z~~|}€||«¬«®¬®®®¯¯°²°³±®¬«©¢¢ œš–““•œ•‘’�ŽŽŽŒ��ŠŒŽ‡Š�‹ŠŽ�ŠŠ†‰ˆ�‡‰ŠˆŠ‹�‹ŠŒ‡‡‰‡Œ‡ˆˆŠ�‡‡‡†‡ˆ‡�…‡‰Š‹‹‹‹‡ŠŠ‰‡„ˆŠˆˆŠ‹†‰ˆˆŠŠŠŠ„Šˆ‡…ˆ†‰…‰‰Š‹Š‹‹‰ˆ††Š‡ˆ†ˆ†‡†�‡„‡ˆ…†„…Љ„……ƒ…†‡†ƒ‚|kS7,#+/06>>@@=:;>CKIKOWalv{p[@.-4@N[^intstty{„‡Š‹““šš››˜š–’’Ž�ŽŽ‡……‰‡ˆŽ�‘•””•–—˜›˜š�œž žž � ›œž ¡£¥¤¢¥¥¦¤¦¢¤¢¢£¤¥¡¥¥§¥¦¨¤¨¥¨©ª¨¨¨§«ªª¨§¥§¨¦¦§§§¥¨¦¥§§ª§ª©¤££¢¤¦¡¤¤£¦¢�¡�œ•–‘‘Ž��‹�Ž’‘”–“’“–‘�‰ŠŠ‹��‘��‹‰ˆ„ˆ‡ˆ‰Œ�Ž‘“–——››™š›�š �£¥¦§¨ª¬ª«®««­ª¬ª¬ª©¨¨¥§¡¡›š’‡€tkd]ZRRNJGGGGFDJMGFGFCJGFBEJHKKPT_gqxzzxxyzz{{||~‚}€~y{z{z|zxx{|{{‚|}{|~~{}~|~~||}€ƒ~~~|||{~y«««®®®±­°²¯®²²±®©¨¨  �ž›”•“‘“Ž’�‘�Œ�‰ŠŽŠŠŒŠˆŒŠŒˆ‹‹‹ˆŒ‹ˆ…‡‰‰ˆˆ‰Š�‡‰Šˆ‰†ˆŠ†ˆ†ˆ‰Šˆˆˆ‰‰…ˆ‰‹ˆ�ЇЋ‰‰‰ˆ†‹ˆ‰‹Š‡ˆˆŠ‹‰ˆ‡…‰‡ˆ‡ƒŒ†ˆ„‰‰ˆˆ‹Š††…‡‡‰Š…ˆ‡†…„‚‡†‚‡ˆˆˆˆˆ„††ƒ‡††�„oX?.()/0677>7;58@GIKCMVfkuweH.&%25EQ]douz��ˆ‹�•”——œ™š˜›——”�‹��Œˆƒƒ‰…Š���’“”–—˜˜›™™› žžŸ¡¢¡ž�›� £¢£¨¦¢¥¥¤£¤¥¤¡£¤¤£¥¥¤£¤¤¥§¨¨¦§ª¨©¦¨¨ª¦¥§¨¨©©¦¦§¦¨¨§¨§©¦§¥¥¥¥£¥¥£¥¡£¤¥¢ž��™š–•“�‘’‘‘–“š—˜˜•—“’ŒŽŒ�Ž‘’‘‘ŽŒˆŒŒŒ‹Š‹��‘••˜›™ž���žž¡ ¡¥¨¦«ª¬«®ª¬««¬««¬­©©©¥¦§¢ž�—�ƒysje^WWSMGJHDEEKNIJBHFKEEFFEJFLPRYbksw{{y||zx|y}{|z~z}{}|zwz}|yx|}y{~€~�{{~|~}|}‚|}}{|{€|{zz}©«¬¬¯¬®¯°±®³²²¯¯ªª¤¡ �ž˜——“‘‘��‘��‹Œ†ŒŠŠ����Š‹…ˆ‹‰‰‹‹ˆŠ…Šˆ†‰†‰‹‹Œ‰Œˆˆˆ…ˆŠˆ„ŠŠ‹‡‰Œ‰‡ˆ‰ˆˆ‹‹Š†‡‰‡‡‡††�‹‰Š�Љ‚ˆˆˆˆŠ„‰‡‡…‡‰†‰†…‰‡�Š‰Šˆ…‰‰‰†ˆ…†‡…„†ˆ…„‰ˆ†…ˆ…†„‡ˆ‡…„�…�~qcI1.*//42235787@DDDENVdkuq[:$ #(2A?ER\inn^?& '(,2=OVhx€Š�‘—”˜™–——••”ŽŠ‡ƒ€€‚€{y|�…‰Ž��”””—–˜˜œš›�� ž›¡¡›ž žž £££¤¢£¤¤¤¥¤§¥¥¥¨§¥¤§¨§¦¥¥§ª¨©§§¨¨¨¨©§¨¨ª§ª¥§©ª§ª¦¨§©¦©§¨§©§¨§§§¨¤§¦¤¥£¢¢¢ ¢�›œž�›š››š›ž›™—•—‘——•š“’‘•“�“’’”””�“–š—œ�ž ¤£££¢¥£¨¥¨¨¨ª®®¬¬¬«­««¬®­®ª¬«¬«¦§¦¥¤ ›–�Œ…|wi`Y[YTJHGHMJPNCGHGFIDBCGNOFMT_hq{xzzwwxzwy|w{{||€}z|w{z~}~{{~~{y||€ƒ|}zz€{|{�ƒ|z‚}~}z|‚ƒ|­ª­¬¬¬¯°¯±¯²³²°®°ª¤£ž››››�••“�••‘–Ž‹��Ž‘�Œ…ŠŽ�ŠŒ‰†Š‡ŒŠŒ‰Œ�ŠŠŠ‹‰‹�ˆ‡�‡‰‰‰�ˆ†„ˆ†ˆŒˆˆ‰‡‹‡ŠˆŒˆ†ˆ‹‰ŠˆŒ‰Š‰ˆ‡Š†‰‰‡‡‹…‡‡ŠŠ‡ŠŠ‡„…‰ˆˆ†††‰ˆˆ…‡ŠŠ‰‰‡†ŠŠˆˆ‡ˆ…‡ˆ„ƒŠ†„†…ƒˆ‡„„†ƒ‚~sbQ>04220,++3578===FO]hohV:#$%%/5DTeu‹�—™˜˜—••˜•”�‰ƒzzz{}x{uz~†‰��’“•˜—–˜—™�š›œ›��žž  ›    ¡ £¤£¤¥¥¤¥©¥§§§¦¨§¥¨¦§¥¦©¨¨£©¬ªª©¨ª¨¨©§©©§¨©§«§§¨¨¨©ª¨©¦§¦ª§¦§¥§¦¥§§¥¢¢£££¡¡ ž›Ÿ Ÿ›� ��š›——•–˜ž™˜•’““•“’‘”–‘™•—–�›�¡¢££¡¦¤¥§¨¨¨«¨ªª­«®®­ª©¬«¯¬¬¬¬ªª«§©¥¥¤¢Ÿ˜’�މƒzsf_a`YOLJIJJMKEFIFKDFDBGMPHOUZ^nzzzz|zvx{yz|y}{}}|~|x|y}~~€y{}}|~|yz|y€~}||||{||€z}©«¬ª®¬®°±®³³±°°®¬ª¦¡¢�›—� ™•”‘–”’•����Ž��Šˆ‹�Ž‹‹ˆˆˆ†ŠŒ�Ї‰�ŒŒ�Šˆ�‰Š‰‹‡‰‰‰‡‡…‡‡ˆ‰‡‡‹„‰‹Š‰Šˆ‹ŠˆŠ‡Š�ˆˆ‰Š†‰‡Š…‡‡ˆ‰„ˆ‡ŒŠŒˆŠ††Š†‰……††††„†‹…‰Š‡‰ŠŠ‰‹‡……ˆˆ„‡……‡………‡Š‡‚‡‡…}vmWD634650-035:<=BFIVeoriR5#!$)+03@Qetƒˆ�˜˜—“˜˜•––”‹…|~vutxzwwy|~…‰‘�‘”——˜–š›—š›��š�žŸ Ÿ ž  ¡ ¢¤¤¤¥£¤¥¤¦¦§ª§¨¨¨§¥¨ª§§¥ª©¨¨©«©©§ª§ªª¦¬©¨¥ª¨¨¨«©¨ª«§ªª­©ª§¦©©¥§¨§¨¤§¥¤ ££¥¤¡¡¡   ¡� ¡�››™š™——�œ›™——•–—”—˜–”•˜˜˜™œ�žŸ£¢¥¨¦§¨§¨©¨­ªª¬¬­­­ª¬ª¯­­­®«­¯¬©¬ª©¦¦ ¢œ——–�‰|tjhdb\ULJKGGIEGGJFDEFEFILMPRWZblt{y|}xwy{||�~|}~}}~||}~~|~|z|‚~{€~~~{{{}|�||~~~€~{}„€««¬«­®°®°¯²¯²±±­®®ª¡¡››››™™“’‘”����ޑޑ�ŠŠ��ŒŠŒŠŠ�ŠŠ‰Š‹‹Œ†‹��‰‰‰‹Œ‰‰ŒŠ…‰ˆˆ�…‡†ˆ‰ˆ†‡‡‰†‹ŒŠ†‹Œ†ˆ‹Š‰ˆ…ˆˆ‡ƒŠ…†ˆˆ†††††‡ˆŠŠ‹‹…‡„†‰‡‡‡ˆ…†‡ˆŒ‡‡†‡ŒŒ‰Š‰…†‡‡ˆ†…†‡ˆŠ†Š„ƒ‡‰‰…€}scL:24787848;@BHNQT^kvvhJ2$!%(*.238EUdw€��”–”••˜–—•“‹„|uusssssww|…‡‹�Ž�–˜–˜™˜šœ›™››�žžž�  žžž¢¡£ ¤¥¢£¦§§§©¦ªª§§¨§¨©¨ª¦ª§«§¨¨«¦ª«©§¦©©§¨ª©¨¨¨ª§¨ª¨ª§ªª«©©§©§§¨§§¨¨¦¥¥¥£¤¤¤¤¥£¡£££ £¡�£žŸœ�œœš �œžš››šš˜š™™—•ššœ�� ¢£¥¥§¨§§¨««¬ª©«®©¬©®­¯¬­­®«­­ª¬®®«­­§ª¦¦ ��›˜‘Ž~zvkkb^NOMJKIGHEJKGDHHIEGJLNSY]glvww|}{ywx|}}~~{zzyzz~€~~}~~{{|~‚~�€||z{|{€€|€~~~y‚€«­«­®¬­¯¯°²³±²°®­«©£Ÿ��›�˜–’’‘�‘�‘�‘��ŽŽ�Ž����‹ŠŒŠŒ‹Š‹ŠŠ…ˆ‰ŠŠŠˆ�Š‹‡…ŒŽˆˆ‰‰‡ˆŠ‡‰ˆŒ†ˆ‰ˆŠˆŠ�‹ˆ…‰‰‰ˆ‰„„‡‡…ƒˆ…†„†‡‡…‰‡ˆŠŠ‰ŒŠ‡‰…‡„†Š‡………†…‡ˆ…‡‡ˆ‰Š‡ˆˆ‡ˆ‡†††ƒ‡‹�‰„…‡‡…ˆ……€xiQ?857<=DDDEFMQY\_ekwtfI7),,.48::AGWkv†‰ŠŽŽ‘‹–š‘’”‘‹‡{vsvqosptw„†‹‘�‘–”˜—››š��œ�›š›œ�¡¡ ž Ÿ  ¢¦¤¤¤¦§¨§¨¨¨¨«ªªª¦§©¦¨©¨ª«§¨¨«§ª¬©««¦ª©¨¬¨¨¨§¨¨¨¨¨«¨ª¨¬¨«ª©©«ª¨¦¦§¦§¥¢¤¦¢¥¦§§¥¥¤¡¤¡¤¤¢�¡ž žŸŸŸ Ÿ� ¡›žŸžž�šœœœž  ¤¡¥¦£¥¦¦¦ªªªª¬®«¬­­¬­®¯«­­­±®®®®®­­«¬­«¨©¨¤ �ž™—Žˆ{{rj^VOMNMJJILGLMJEDKGFFJGLTU^eprz€{||xwwz|}}€|||~x}‚}~{}|‚|�‚}€||{{~ƒ‚~~|€€…}|ƒªª¬­­­®­°²²°°³¯­­¨¦¦¡›ššž•’��‘‘�“‘�”‘�‰�‹Ž‹��Š‹‹‰�ŠŠ†‹ŠŠ„‡‰‡‰‡ˆ‰‹‹†Š‹�‹ˆ‡†‡ˆ‡ŒˆŠˆ‹ˆ†ˆ‰ŒŒŠ†…††ƒˆ�‡„‡‡‡‡‡‡†‚„ˆˆ‰†ˆˆ††ŠŠ‡Š‰Šˆˆ†‰‡„„…†Š‡Šˆ‰‰‡Šˆ‡‰Š††‡ˆ‰Š††‹‡‰†ˆ„…ƒ‡…†…{mZK:59AEONRRTX_b`agmrugP=244;<=CCGQ\n{ƒ‰‰ˆ‡„‡�����‘‹‡|vrqlikrru‚„ŒŒ���––—�š™š›œœ˜›œœ�šžŸ��œŸž¢¢£¤ ¥¦¥¥¦¨§«ªª¨¬©¨¨ª¨«ª©§«ª©©ªª©ª­­«©ª¨ª©ª§©§¤©ª¦©¨©«¨««©©©¨ª©©¨©¥§¥¦¥¥£¥£¦§§§¤¦¦¤¤£¤¥ ££¢ ¢¡¢¢Ÿ¤¢¡¡¢£¡ŸŸ¡žŸ ¡Ÿ¢¥¦§¥§¥§¨©¦««ª¬««®­®­¯ª¬­«°¯­­­«­­«¬­®¬©ª§§¥¥¢Ÿš–�‰€{teZSRKNLKJGJHILKHCFHJHKHNRQWdosw|v}y{xyzz|€€~zzyx�~|}~{}||~�}}€zyz||~{��|~€{ƒ~{€ƒ¬ª­­®¬²°®±°¯³²°­­¦¥§£Ÿš—�–”Ž’”�‘����Ž���Ї‹Œ�ŠŒ‹‡‰Š‡ˆ‹“Œ†ˆ…ˆˆ�ˆŒ‰ˆŠŠŒŒ‹‰…Š…ˆˆ�ŠŠ‰Š…‡ˆ‰ŠŒŠ…ˆˆ†ˆ‹�‡‡„‡‡‡ˆ‰ˆˆ††‰‰ˆ‡‰†‡‰�‡‰‡‹Š�…‡…ƒ‡‡†ˆˆ‹‡ˆ‡†ˆˆŠ†„ˆ‡ˆ†Š‹†…ˆ‰†„…ˆ‡„ƒ‰‡„�}uhUD:8DLT[[]_bafgdgksleT@:=<@CFFHNSclzƒ‚}‚‡…�ŠŠ�ˆ~ytrigimt{ƒ‰‰ŒŠŽ�”–™šš›š™›ž˜�šš ž�ž�›�  Ÿ££¢¥ ¨¤¥¦¦§ª©©«©¨©©ª©ª¨«©§©¨ªª««¨¬¬ª«­§ª«©©¦¨¨¨ª§¨©©§§¬ª¨©««¨©©¨©©§¦§§¥¨¦¤§§¦¨¥§§§¦¥©¤¥£¤¦ ¢¤Ÿ¢ ¤££¦£¥£¥¤¡£¢¢¤¢¤¥¥¨§§¦«ª««ªª©«­«­­ª¯®¬¬°«°¬­­¬­®¬­°­­®«¬©¦¨¥¡ �š’ˆ„{vg^VSRPMMPHIDHNGHHHLKJGHMLOWbnpqzz|}|{z|x}~€~{{zz}�‚~€�||}{}z|z€}|}~y€‚€€}€€}€‚‚{��„ª®«¬¬®¯®¯²¯±°²®°«¨¨¥¢�™™—•”‘”Ž��‘ŒŒ��Œ�‘ˆ‰ˆˆŠ‡‡‡ˆ‡ˆˆˆ‰�Їˆ‰‰ˆ‰‰Œ‡ŒŠ�Šˆˆˆ‰ˆˆˆˆŠŒŒ‡ˆˆˆˆŠ�‰Š†ˆ†ˆˆŠŒˆ„…ˆˆˆ‰‰‡‹‹‰Šˆ‰…ƒ‚‰‹‰‰‰…‹‰†‡………‡‡‡‡‡Š‹…‡ˆ‡‡„…††ˆˆ…‡‡ˆ‡ˆ‰†‡‰†‡ƒ„Š…ƒ„zr`NEBGR]ehhjgggjfhlokaPB9AFDHHILR\`ntzyxuqtyyz€…ˆŠ‡ƒ€|sjccios|�‰ŠŠŠŽ‹”–™——››–›�›œ››››�›œ�ž�Ÿ¡¡¢¤¤¥¤¤£§¦©©ªª©©ª«ª©©¬©©¨ªª¨¨«ª«©ª«¬©©©¬©¨ª¨ª¥¨¨ª§§ª«¨©ªª¨ªª©¨©©©ª¨¦¨¨¨¦©¨¤§¦¦¦§§¨¨¥ª£¦§¥¤¨¢¤££££¥£¤¥¢¦¤£¨¥£¦¤¥§¥¦©©¦«¨««ª¬¬«¬­«¯¬­®­®®©®¬­®®ª«¬®­­­«««¨ª¨¥¥ ž�š“Œ†~pi]ZXSORRKIIDFNGKHHIGHGJHHOS^cksuxzz{z~{{}zzzz}€€€}~~}|}~|{{yzƒ|z|z€~€~|~||€€�|€€‚…¬«­­¯®®®¯±°±±°¯®ª©¦¢£žœ™›–”•”’����������ŠˆŠˆ‡‰‰†Œ†‰ŠŠ‡Š�‰Œˆ‰‰‰‹‰‡‡ˆ‹‡ˆ‰‹Šˆ…ˆˆ‰‰‹Š‰‹‡‡‰�‹‹‰‡ˆ‡‰ŒŠ‰……ˆ‡‡‡‡ˆ‹ˆ‰‰†‡…†…‡†ˆ‡…†ˆ…ˆ‰…ƒ…‡‡‰‰‡ˆ‡ˆŠ†‰‡…ƒ…ˆ‡……†…‡ŠŠ†‰‰‰‰ˆˆ…„ˆ„…ƒ|wj]RHJS]fkmkjlplelknn`K8:ADGJJNNSY`fntsqlnmmrw{„†‡€zqgd^flw|�‡‡‡ŠŠ��“—–™�›˜–š���›�œž�™�šž� ¡¡£¤£¥¥£¥¨©ª©«¬©¬¨ª¨«©§«¦¨«§©©ª¬©««««¨ªªª¦«¨©©¨©¨©ª¬§©©©©©ªª§ªª¨ª¦©¨©ª§©©©«¨©¦§§¨¨¨ª§¦¥§¥¥¨§§¥¤¨¥¦¦¥¥¦§§¦¦ª§©¨¥©©««ª¨ª¬ª¬«ªª­««¬¯ª­­®­­¯®«¯«­«¬­­««­¬ªª¨¨§¥¢¡ ��“Š„}pg`\VWRPTMLHCFKNLFDEHIIJHHIPV]hqwvw{x}|z~z~y~{yywy{}€�{€~|{€|~y~€~|}|z|{}x}{{{}€{~�ƒ€«­«®«°®­±±°±±¯±°©§¦¥ › ›–™——”‘��’Ž’Œ�‹’މЉˆ‹�ŠŠŠ‰‰ˆ‰††Š‰Œ‰Œ‰ˆˆˆ…Šˆ†‰Š‹ˆ‰‡‡…‡ˆˆ‰‹Š‡‡‡ŠŠŠ†‹ŠŒˆŠ†Œ‰‡ˆˆŠ‰†ˆ‰‡‹‡„Ї…‡‡†††…ƒ‚†‰‡‡†…‡…‡ˆŠ†…‰…†‡‰…„„‡†††ˆ†‰‰�††‡ˆ�Іˆ††…‡‡‚€vuk\SMQ[fijmnromnlkmm`C429EEHMLQWW\bkkkgiefflrx|{~~€yslc[`^nt{�…ƒ…ˆ‰Ž�’•˜›™œšš˜�žžž™›ž››˜™žœ¢Ÿ ¡£¥¥£¢¦¤§¨©«¨¬©ª¨ªª§©«©¨©ª«©©©¨«©©«©ª¨ª©©ª©¨©ª§ª©©§¨§¤ªª¨§«§ªª©©¬¥«ªª©«ª©ªª§¨§©¤§¥§§¤§¨¥¨©©¤¥©§¥¥©¨¨¦¦©¦©©¨¨§ª¨«©«ª­­«ªª«¬«­­®®®¬­®­®«­­¯¬­ª°­­®¬©«ª©¥§¢¤  �𖔉…wmdb\YUSQSPKIFDDJJFDBGHHLIIJHNWckuvuxzz|v}{zwwz{yz{||�}|€~|�~{~z|~}|{|~{{{~{y{~~«¬®­­­¯®­±²´°±²°­¨¥§£Ÿššš–––••••�‘’�Œ�ŠŠŽŠˆˆŒ�‰�‡ˆˆˆˆ†ˆ†ŠŠŠ��ЇˆˆˆˆˆŠ�މ†‰‡ƒ…‡ŠŠ‹‡„„‰‰‰Š†‡ˆŠˆŒ‰ˆŠ‰ˆˆ‰ˆ‰‰‹ˆ‡ˆ†Š‰‡††…†‡„ˆ‰‡Š„†‡‡ˆ†…‡†…††ˆ†Š„…†�†‡…‡ˆ‡ˆˆˆ†„‡ŠŠˆ……†††…„�€}{qeYQQW[dgnpnrqqopmhX@2+3:DHKSOWXZ[bejdc``ckotuuuvxvmg_[[_jq|~„‰†ŠŠ�“•––›™™�™™œžž�›ššœš˜š›�ž ¢¤¥¥££¦¥§¨¤©¨­©¬¬¬§¨©©¨¨«ª¨©©ª«¨¨¨ª«©«©ªªªªª©©©©¬¨§§¨¨§¨¨ªª¨§¬ª©©«ª¨«ª¨¨¨«ª©©¨ª§©§§ª¨¤§§ª¦¨§ª§¥¨§§¦§§§¨¨¨©§¬ª«ª«¬¬¬©­­®ª¬«­«¬­­«­­«¯¬¬¯°®®­­¬­­«®«¬¬¬§§§¥ œ �𛑋ƒtlg`^YRSKNNGEFACFCCDGIGMNIJIHPR]hpx|zz~}{y}z{z{{w{x{{||~���}|{y€€~{{}‚~~z{||z|~~€€‚~¨¬®«­®®¬¯°¯¯²±±¯®©¤¤¥¢›—™—”—””�’Ž���Ž�‹‰Œ�‰ˆŠ‹�‡‡‰†ˆ‡†‡‰‰ˆˆˆŒŠŠˆˆ‰ŠˆŠŒŠŠˆ„ˆ†‚‡‹Š‡ˆ†‡‰‡Š�‡‰‰‰ˆ†ŒŠŠˆˆ‹‹‹†ˆŒ‰†ŠŠ‰Šˆ…‡……†‰ˆ‰‰ˆ„……‡‹††ƒ††‡‡…ˆ…†Š†…‡‡††ˆ†‡„„…†‡‰ˆˆ…‡‡…І€‚~€}zrfUNNT[fmpsoupqigaUC3+,09COQWUSX[[\`]YY\djijknllnof^XXX`gpv|‚…„ˆŠ�”–••œ›ššœ™œ™ž�››š—œšš›››ž¡¡£¤¤¥££§§©¨©«©©§ªª¨¨¨©«©ª­ªª«««©©©««©¨««ª§©§¬¨¬ª¨ª¬¨©©ª©ª§¬¨«¨¨¨ªªª««©«©«ª§««©§©§«©¨¦§¨©¨ªªª§ªª¨¥¥¨©««§©¨­««ª¬«««®­¬®©­­«®­°¬®­®¯®®«®®¬¬¯®­®­«­­­®©©©§¤¡¡Ÿ�››•‘Œ‚tpib]UTPKJIGE=?BBFCEFHHNKLLKNMQX`nv~|{|z{x||{{{{x||}~�{€€}{y|y|€}y}~��|}x}yz|yz|||~|{~€­¬­¬­­¯®²°±±°´¯®¬«¥¢¢¢™›–”–”“�’�‘Ž���Ž�‰�‹‡ŽŠŒŽ�ˆˆ‹ŠŠ‡‰…‰…†…Šˆ‹ˆ‰‰‹Š‹‹‰Œ‰ŠŒ†‡‡Š‹…ˆ‡ŠŠˆ„Šˆ‹‰‰‰ŠŒ‰‰‹ˆŒ�‰ŠŠ‹„‹‰Š‹ˆ‡…†ˆ„…‡‡ˆˆˆ‡ˆˆ‰‰„‡‰ˆ‡ˆˆ‚………ˆƒˆ…ŠˆŠ†ˆ„ƒ‚…„‡††…†‡Šˆ†‚€„„�}{n`QKQTbntuqrnea[ZXI=7--4?GNQUQRQQUXQQOX^idgcghkmbXXTQS_div‚‚‚…‹�’—“™›™›˜�šš›œš›—�›ššš™��›¡¢£¥¡¢§¦¢¦¨¨¨©««§©©©¨ª«§¨«©¬©§­§©««ª©«ª¨ª¨«¬¨¨««ªª¬¨§§ª¨§©ªªª¨¨ª«ª§­©ª©««««¨ª«¨¨ª«¨«¨©ª§ª©©«ªª¨ª§©¨¨ª«ªª¨«­«©©­«ª­®¬­¬¬«®­¯®®°®­®®¯¬¬­®®®®­¯«¬®¬®ª®«ª¨¦¨ £žš››•�ˆ‚{unb]VPPNOLDDCC@EDEGHGHONKPKGKQUZeqz{z|z}zz{{{z||}z|�€€~€€~{y}}|z}~}|z‚€~|z}{y{{||}}|~€�«««­­­­±¯±¯°²°¯¯­¨¦¨¡ž›—˜•–•�’‘‘�‘Ž���ŠŠŠŽŒŠˆ�ŒˆŒ‰Š‰‡‹‹ˆŠˆˆ‡†‡‰‰‰��Œ†‹ˆŒŒ‹‹‡Š…Ї‡‡�ˆˆ„…ˆ…‹‰†ŠŠŠŠ‰�‹‹ŠŒˆ‹Œ‰‡ŠˆˆŠ…„…ˆ……ˆ‹‰‰†††Š‡ˆ„Š‹…ˆŠŠ„…†…†…‡ŠŠ‰††‹…€„ƒ„ˆ…€ˆ…†ˆ‹‡‰…ƒƒ�‚�{kbRNQ_hmsnkcZTNS\WRE<345>FKICDCJKHIJHNWa``ca^acWRNJMO[_iqu|}€„ˆ‡Œ‘”›š•šœ™œ›šœšœœ›—š˜™›˜œœŸ£ ¤¥£¢§¥§§¤¨ªª«ª«¨©©ª¨¬¬¨ªª¬««§«ª©©­¨¬ª¨©©ª©©§«¬§©¨©«©¨©ª¦«©©¨«¨«ª©¬«««««ªª««©¨¨ª¨°¨¦©§«¨ªªª«­©©¨«©¨¨ª««­«ªª¬«®¬®¬¯¬°«®­¯¯¬°®®­®®°­¯¬­®¬®¯¬­¯®¬­«©­¬¨¨¥¢Ÿ  ™™•�Š„~vkcZZUOOOJIFEIGGHHJFHGHIMLIKNORU^irz|vw{}z{{|zy||x~€~}|}}z||yxz{�‚{|||y{~{{|z}|{{|‚~|­«­­­®°®±±±³±±±­¬¨¨¤¡Ÿš™•“•”‘“Ž�‘���‹Œ‹‰Š�ˆŒŒŠŒ‹�ŠˆŠ‹‹‹†‰Š‡Š‰†‡‰Œ�ˆˆŠŠˆ‰ŽˆŒ‰‹†ˆ‹†‰‹‰†…‡ˆ‡ˆ†‰ˆ‹‹ŠŠ�ˆŠŒ‰ˆŠ�‰‰‰‡†‹……†‡‰†Š‡ˆˆ……ˆ‡…††ˆŠ…‰‹‡‚‡†‚††ƒˆŒ…††‡†‚„…‡‡…ƒ‰…‰‹‡†‡‡…�€†‚�ztg\RV^dfjg^VMHHQ_ee\L@:87<978@:@CC=CAFP[__^^YVTSJFJFMR]eksx}|€‚ˆ��“–™››š��œ™�š˜š–˜™™–˜�›žž¤¡¡¦¥¤¥¦¤¥¦©©©ªª¨©©¬©¨¬ª©«¬¨­ª¦«ª«¨«ª«©§¨ª«¬ªª«¯©ª«¨©§©¨¨ªªª©ª¨©ª«©©§®¬¬©«ª¬ª«ª¨©«®§«§¨««ª«¬«ªªªª©««ª««­®­««®®¬¬®ª­­«¯¬­°¯¯¯®­®®¯®«®®­®±«¬«¯«­¬­­«««©§¥¢¡¡�—›“�ˆ{ria[USRPQJIGGDKLJLOJHHGJJLLNRPPTXdpuvuu{zz||z||z|~}}{~{}y~y~zx{x|€|}z{y}}�|~}}}~}}~‚}}««­®­®®®®¯°±°±°¯¬©©¢���™—•””“‘•�ŽŒŒ�ŽŽŠŠŽ�‰�ˆ‹Œ‹�‹‹‰‡‹ˆ†ŒŠŠŠ‹‰‰‹ˆŒ‡ŒˆŠ‰ˆ‰‹ŠŠŠ‰‡Œ‡‡‰‰‹……ˆ†ˆ‡ˆˆ‹ˆ‰ŠŠ‹�Š�ˆˆŠ††„ˆ…ˆ†„…ƒ†Š‰Š‰…ƒ†‡ˆ†ˆˆ‰Šˆˆ‡†„‡………„†…†ˆ†‡…†ˆ…ƒ‡…†‡Š‰�Œ…†ˆ‰‡ƒƒƒ„ƒ€{pg\ZZ[XXYQIEA>QainkdYJ<80/-1167<:7:<@JSX[ZXRSQJDCCAFNYcfpux|~~†Œ‘’—œšœš�›��œššš›•—˜˜š™™�� ¢¡¢¢¦¤¥¦¥§§¨©¬§«ª¨©«©©©«©ªªª©ª¨§­ª§¬­«¨ªª©©¨«©«¨©¬«ª«¦ª¨¥ªª«ª¨¬¬«©¨«§«©«¬©«­ªª«©ª«©©ª¬©©ª¬ª«©©¬¬««¬¬®ª¬­­­®®®¬®­­¬®®«®¯°¯®°¯­­°®¬­¬®¬­®®®®¬­­«¬®««§¥¦££ž¢›™˜”Ž…{sqga\WWQRLLGBKKJNMMPNLJGLIJNQVURPSZfqtqtwx|y|{{~z{}~|}|||wzw}~}�z}~}{xz|}}}}}|~z�~~€€|ª¬¬®­¯®±®²²±´²¯®­¨§¢ �™š–˜•’’’‘Ž‘‘�ŒŽŒŠŠŠ‹Œ‹‰ŠŠ‰ŠˆŠŠŠˆŒŠŒ�Œˆ�‹��Š‹ˆŠ‰‹‡‰†ˆ‹‰‡Š‡†‹‡Š‡ˆ††Šˆ‹ˆˆ‰ŠŠ‹Š‹ŒŒ‰‹‡‡…ˆ†‡„‡‹†ˆ…‡ˆˆŒ‹ˆ‡‡‡ˆŠ…‡‡ˆ‹‡ˆˆ††‚‡‡†ˆ‡‡ˆ…‰…ƒƒ‡…†……‰„‰‰�Ї…‰‡ˆ‚……�…€~yrg\UPILKGFA?EQ`mqtsg[I9,**-//29789<==CIV`cmsv||‚ˆ��“™š�š›œœ¡™�›š˜™˜›˜šš››œ��¡¢£¤¢£¥¨¤¦¦ª««©©©««¬©¬ª­©©©©©­¬ªª§«««¬«©©¬«ª©ªª©«¨ª«¬ªª¨¨§¬§©ªª©««©ª««ª©©©«©©ª©ª¬«ª¬ª©ªª§ªª¬®«­®«­¬«®¬¯­ª¯­®®®­¯®¬­®®®±°¬°°­¯­®­®®®®®­°­®­¬ª­ª®««ª§§¦£Ÿ�Ÿžœ—”Œƒ|spi]Y\RPOLIDFLJMIOIKNKHJJFFORPUQKLX_govrzxzw~|~~y}{~€{}}€vzy|‚€}z}}‚yy|}|~~~~}~~|‚€‚€€­­¬¬­«­°®±¯±±°±¯­§§¥Ÿ›——š–“�’‘����Ž�‘��ˆ‹‰ˆŠ‰‡ŠŠˆ†Œ‰ˆ‰�Šˆ‰ŒŒ‡Š�Ž�‰ŠŠŒ…†ˆˆ‹ˆŠ…‡†ˆŠ‡ˆ†‡†…ŠŠ‰Š‰‹ˆ‰‰ŠŒŒƒ‡‡‰‡‡…ˆ‡ƒ‰ˆˆ‰‰ˆ†Š††ƒ…‡‡‡�Š‰Šˆˆ…†ƒŠ†‡Š‡‰…‡††††‰�„…‡……‡ƒ‡‚Œ‡‹‰†„†‡………†…ƒ‚yocSB;;@@CACHP_jtz{ukWD7-+,--/14697>@GIJMJLFA;867:>HSV`joxzz„ˆ�Ž–”œ›�›œ���žœž™™š˜™–››™žž¡¡ £¥¦¥¥¥¤¥§©§©©ª§¬©¬ª¬¬«ªªª¨¨­©ªª««««ªª­©ª«©«©ª«¦©­««¨©§«©¨ª©¬«©«©ª«­¨«§«©©ª¬ª¬ª©ª¨¬©ª¨­¬­¬ª­¬¬«®«®­­¬®«¬¬­®¯­­­«­­­­®¯®­°¬¬¯¯®­®­­±¬­«®­­¬®¬­¬«¨¨§¦££  Ÿžœ˜‘‹…~wme`ZWSONLGJKLLGLKKMKFFLGCCMQVQLKKOW`htvxxxy}}{||y|~zz|}}z~~}|x}}|}~€€~}|}{z}{~€z�|~©¬®¯«®®¯²³µ³²°¯®®ª¤§›œž›—˜“““������Ž��Ž�ŒŠŠ‰Š‡‰‰‹‹Š‰‹ŠŠŒˆŠŒ‹ˆ�‹ŽŽ…ŠŠŒ†‹ˆ‰‰ˆˆ‰‡†‰†‡Š‰Š‡ˆŠŠ‰ŠŠŒˆŠ‹Š‰†ƒ…†‰‰ˆˆˆˆˆ‰‰ˆ‰†ˆ‰‰‡…‹‰‰ˆ…Šˆ‹‰ˆŠ†‰‡‰‹ˆ‚Љ„ˆ‡‰Šˆ…†ƒ‡‡††‡ˆˆ‰ŒŠ†‡�ƒƒ†………„�ƒ…ƒ‚vlVD935::@>CK]iw}�xufQ<3/,.-/054579=CGGEDG@<69346;FNWbhmx|y€†Œ’’–™šš™Ÿ›�œ¢œ�œ˜››™—™œš� ¡¢¢ £¤£¥¦¤§¨¨ª©ªªªª«©ª¬¨©«¨ªª«©¨«©¨­¬«¬««ªª¬©ª««ªªª«©­ª§ª©©©«¨«©©¨©©­«­¨ª««¨ªª«©«ª«­©©«©«®«®­«¯®°®«°¬­«®­«®¬®¯¯«­¯®¯¯ª®¬®®¯­¯®­­«­«­­­°­®«°¬¬­¬«©©©¦©¤ £žœ ›˜”�…ytfd^YUUNJHIFOJNIKLHKHFIJD>AJOSSQJLINT`qu|yyxxzyxxy|€~|zz�}}{�}|~|}~€|‚�z~|}|z~~}y}€}|­¬­­­®®®±²±²³¯²¯­§¨¤žŸ›�——’’““‘��‘��‹Ž�Œ‹‹ˆˆŒ…†�‰‹‹‹��Œˆ‡Š’�†ŠŠ�‹‹‹ˆˆˆŠ‡ˆ‰†Šˆ‰ˆˆ„Љ‰ŒŠ‹Šˆˆ‡‹‡‡‰Œ‰‡„……†ˆ‡ˆŠ‹Œ‰†‰ˆ‹‰‡ˆ‡‡‡ˆŠˆ‡ˆˆ‹†‰‰ˆŠˆˆ‡……‡†‡Š‹ˆ‡Š‡‡‰‡†ˆ††„‰ˆ‰Œ‹†„ƒ…„‡„‡…‚„ƒ‡„ƒ€xiUD80./34;FTgv}€~{o^H;4013/,40032:>@?A<>;5412//8FSTahsx{|ƒ���•—˜™›œ�Ÿ›žž�œš›™š›˜œ™›œž ¡¢££¥¥¤§¤©¥ª§©¨¨©ª¨¬««©ª©©©©§©«««¦ª­ª§ª«©«ª­«­¨«®ª©ª­§¨©¨©¨ª«©©©¬¨ªª«©©ª¨««««««ª­««ª«««¬¬¬­ª­®®¬¯­¯¬®¬­­¬­¬®«¯±­¬¯®­¯°­®®­°±­¯­­®®®¬¬­­¬¬®­«¬«©©©¥§¢£ž£ž�™š“�†�vgd[W[SQKELINKQKKJKINMJGCA?IIOQTPJIILZitxvvwz}{{xyz|z~{}|}�|~{{~~|�~|‚~~|€}{yz€|}|z}}{{­­¬©°­­®°°±±²³°®¬ª§¥ Ÿš›–—•”–‘’“Ž‘�‘Ž‹ŒŽ�Œ‰‰‰‡ˆ‹��Œ‹ŠŠŠ‰ˆ‹�ˆ††‹‹‹‹ŠŠŠ‰‰ˆˆ‡‡ˆˆ‡‡‰‰ˆ‡‹ŽŒˆŠ‡ˆˆ‹ŠŠˆŠˆˆ‹…‡ˆŠŠˆ†‰ŠˆˆŒ†‡ˆ‡†ˆˆ‹‰…‰Š‡…‰‡‹Š‡ˆ‹ˆ‰�„‡ˆˆŠˆ‡Šˆ…Љ‡‰‡‡‰ˆŠˆˆˆ‡‰‡ƒ†ƒƒ†„‡†�…ƒˆ‚ƒ{uiVC4+(,..?Sdr€€~rbOB>88732/0/.54599:7630-.+,29DLYckts{~€„��’”˜™–��›Ÿ� žœ�›�šš˜š›˜�œ ¢¢¡¤¢¢¤£¨¨©¦««ªª§©ª¬«¬¬¨¬¬¨¨©¬ª©«ª©ª¬¬¨¬¬¬ªª««¬«ªªª«©¬§©ª©©¨©¬ªª«¬¬ª­«¨ª«¨¬­¨®­ª¬¬«««««¬«­©®®®««­¬®®¯¯°®®®«°®¯¬¯¯¯¯°°¯­®°­®¬±®®¬­¯­­¯®¬®¯­«°¬ªª«¨¥§¦¤ž£ ›�›–��Œ„zlc\YZVQLJILJKOONKILOOJGD?=>DJQVSQHGITeowyvvw€€{~xz|{||€~||�{€|}|€|~~}z}{‚€ƒy{}}|z­«¬¯­­°±¯¯²²²°±®«§ª¤� ›–”••““–™��”›—���Œ��‰ŠŠŠ…ŠŒŒ�‰�‹‰Š‡‹ˆˆŠ‡‰ŒŽˆ�І‹‡ˆˆ‡†ˆ„ƒ‹‡‰ˆŠŒ‰‹‹‰ˆˆŒˆ‡‹Š‰‹‹Š…ˆˆ‰‡‰‰ˆŠ‹‹†‰†‡‡ˆ‡Š‹Šˆ‹‡††‰…Šˆ‰ˆˆ‡…‡‚‡ˆˆˆˆˆˆ‰…ˆ‰Š…‡ˆˆ‡†Š‡‰ˆ‹†…ƒ�ƒ†…‹ˆ…ƒ„„‡��|ukX@1(('+8F_mz}‚zhVIBB=<7;21)+/3310/,*-+)$))/6BJZcgqsw{‚‚ŠŽ�’—˜š™œ�ŸŸ ž ™œ›™˜™›™š˜›¡¡¥ ¤¤¡¥¥£¥©¬¤ª¨©¦©ªªª©¨ª««¨©¯¬««¨«­«©«©«¨¬«¬«©«¨¬©¬©¨««¨«¨¨ª©¨©««¨«¬ªª¬¨«¨«««««­««­««­¬¬­ª­­ª®®«®®¯­¯­¯®«®®®®­­­¯¬®®«°­¬°°¯­­­®®­®¬°¬®­­¨­®¬¬ª«¨¨§¨¨£¤Ÿž›™˜”’�ˆ…yqc\Y[VSKNJGIQNNKKKJOPLHB@8:?FKVXVRKJU_iuu{xu|€xz|}~~z~|{~{�x}z|}w|}zz~‚€€z~~{{~z~~­­­«¬®®°³±²±²²±«®§¦¤¤ ›˜•””“““•��—š•�Œ�‹‹�‹Œ‹ˆ††ŠŒ‹‹Ž‘‰‡ˆˆŠŠŒˆ‹‰‰ˆŒ�Œˆ‹‡ˆ„…�…†‰ˆŠŠŠ‰Ž��‡‡Œ‰Š‰ŠŠˆˆˆŠŠ‰ˆˆŒ†‡‡‡Šˆ‰‡ˆˆˆ‰ŠŠˆŠŠ‰„„ˆ†Š†‰‡‰‡‡„‰ˆ†„‹…‡‡‡ˆ‡ŒŒ„ƒˆˆ††††‰‰‡‡‰„†…‚ƒ†ˆ‰…„……†…ƒ~sgR;1&'*3CVky}~xlXNFB?=BC<5,*.7/(()(#%&#"%(-6@NYdijqq|ƒ‰��“™——™›�œ��œš›–™”š™œ˜š˜Ÿœ¢¡¤££¡£¦¦¨§¨¦¨§©©©««ª«ª«ª©§«©¬­ªªª««©¬«ªª©«©©©¬©©©¨§ª¬ª¨«¨ª©©«ª©«¬©«­ªª§ªª©«¬¬«©­ª«®¬««ª­­­­¬®±¯¬­®­®®­®¯¯­®¯®­­­¯­¬®®¬­­®¯¬­¬®­°®«­­­«­«®­¬¬«ª©§ª¦¤¥Ÿ�š—˜•‘މ‡~vmc_XWUQNPJJLQPQNLIKJKLHE>;9=DKS]^ZUTX^guvyzx|��ywz}~{~{~€z||~|€|z|{}~{x~~{}{~|{}€}€{|}‚¬­«­­¬®®°²²´°°°±­©¥§ž¡¡�—”–˜”’‘‘‘“‘ŒŒŽ�Œ‹‹ŒŒ�ˆ‰ˆ†�Œ‰�ŒŒ‡‹‰‹‹‰‹‰ŠˆŠŠ‰�‡‡‡ˆ……††‡‡‹ˆŠŠŒ‹�ЇЋ‡Š‰Š‰Š…ŠŠ‡Œ†‰Šˆ„†ˆˆ‰ˆ‰Œˆˆˆˆ‰ˆ†‰‡ƒƒ‰†ˆ‡†…‡††ƒ‚„†ƒ†„†ˆ‡„‡‹�ˆ…„ˆ‚…„…ˆ‡ˆˆ„……ƒƒ†Š†‡…„††………‡�|rgR;,&,,;Shz~�}ynZRKGBCFJF>4003+)&%$ " &'+/DNU[bgosx|…‰���”™ž›�šš™›˜˜˜“”—•–˜˜š› � £¤¡£¡¤¨¨¨¦§¨¥§¨§¨©©©«§ªª©©««©«ªªªª¨«§««§¨¬¬««ª©©ªªª¦ªª¨©««­¨ªª¨ª«©«ª®¬©©­©«««¬­­©¬««­¬«®­­®®¬­­°­¯­¯¯®­®±®¯¬®®¯°¬¬­­®­­«¬¬­­­ª¬®¬­­°¬¬¬®¬®«ª¬«§¨§©¦¥Ÿ›——”�ŠŒƒ~zrf^[[OSSNLQLPQQSOGHJLKKGFE>=>CFQ`jj^bccjlryzz{€~zzxwzyyy€{}}|y|yz~}{{z|€||}}}yy{€||}|ª¬­®®®±®°®µ²°²²±ª§¨££›�š˜–šš’��’’‘����‘�‰‹��ŒŠ‰‰‰‡ŽŠŠŒŠŠŠ‹ŠŠŠ‡‹Š‡Š‰�‰Š†…‡††‡ˆ…Їˆ†ˆŒŠ‰‡ˆŠ‹†ˆ‡…‡ˆ‹ˆ‰‰‹ˆ‰‰‰…‡ˆ‹ŠŠˆŠ‰ˆ‡„‡„‡……‰‚‰‹ˆ†‡†Š‡‡ƒ€………‡‡‡„„†ˆ‰ˆ…‡ˆ‰…†„‚…‰‰‡………‡‡…‰‰‡‰…ˆ‰†„†„„‚~neM>0+*;Nhx€„€zp_SMNEEKOKFB:932%'$$ !!#%%+6?KSY_emtt|€…Œ�’“•š�š›š˜™™•––•“”™šš™��¢Ÿ£¡¢¤ £¥¨¨©©¨¦¦¦¦©©©¬«ª««ª«ªªª©«©©ª««©©­©©ªª¨««««¨«ª«ª¨«©ª«ª«©«©ª«««¬­«ª««­««­®«¬«ª­®­«­­¯¯®¬¯¬­­¯®±¯­®°­¬¯®­¯¬¯¬°­­®°­¯­­­­®®¯­¯­­­««¬­¬¬«­«ª¥¦§¦©§¥¢œ–•‘Œ†|wrle_\RRQRMLONOOMPNJIJLIKIEFB@@ACK\golljgimuvv|z|~zuy}y{xxx|}||{{z‚~|{~|~�{}{zzvƒy|||‚««­ª°°­±°¯´³¯²²±¬¦¦¡¢ž�›–––—”��������™™ˆ‡‹Š‹‰Œ†Œ‡ˆ�ŠŠŠŒ‹“’Œ‰ˆŽŽŠˆˆŠ�‹†…‰‡‰†‰Š‹†ˆˆ‰†ˆ†‡‹Œ‰‹‰Š‡„‰‡‰‰‰Š‰Œ‰‡Šˆ‡ŒŠ‡Œˆ†ˆˆ…‡†ˆ†„…„ˆ‰ˆ‰‡†††ˆ†…�ƒˆ†‡‡‡‡�……ˆ„„†‡…ˆ‡‚‚……‹Š‡…„††‰‡‹ˆ‰‰†‰…‡‡††ˆƒ|neP?53?CHV^josqmkrtvsv|zyyy|z|z|y{~€|x{}zxxy~~z|||~|~}x{{z~~€||{z€ª­«®®®±®°³¯²±³°°©©¦£ ��š—”“–•��������—�Œ‡‹ˆŒŠŠ�Š‹‰‹Š�ŽŠ�—›�‰‹Ž‹ˆŠŠ‹‹‡‡Šˆ‡‰‰ŽŽ‰‡†ˆ†……†ˆˆ‰�‹ŒŒŠ…‡Š‰‰ˆ‡‹‡ŒŒˆ…ŠˆˆŠ‡Š‰‰‰ˆ……‡Šˆ……ˆ……††††‚…‡…ƒ…‚Ї…‹ˆ…‡††…†„„‰�‡‚€‚ˆˆ‡Œ…‚ˆ††ˆˆ…‡ƒ‡ˆ‰……‡†ˆˆƒzsdWMCDUhuƒ„ƒ{uj_YYLKKV\VTMGA9/,&""%&&&&&.2CGLTckrmonsruvxv{zz|||}z|yw}||xz~yuvz||z€~|~€}~~||}|~~|~€~¬¬¬¯¯¯®®²°³²²²¯®¬¨¦¡ŸŸššš””’“��‘�Œ‹��Œ�‰Š‰‰‹‹�‹‡ŠŒŒ�“‹‰Œ‘›‘ŠŠŠ‰‡ˆŠ‹Š†‰ŒŒŒŠŒ�‹‡ˆ…‰Š‡†ˆ‰‡‹Š‰‡Š‰Šˆ‰Š‡‚Œˆ‹Œ‡ˆ‡†††Š†Š†‰‰‡††„‰‰ƒˆˆ‚‡…„ˆ…ˆ„‡†„………„ˆŠ‰†Š…‡‡†…‡ƒ†„…„…Ї‡ˆ…‚††ˆ‡ƒ…Šˆ††„‰„ˆ…‰‡…ƒ|tlcYU]gy~‚ƒ‚xoceYQLNV_]WPKF@5/-(&(('))&-6;FN[aegjszƒ‰�“•—˜™›˜—–—••”‘”““˜——�œœŸ  £££¤¥¤¤¨¥¦¨ª¦¨¨¦¨¨¨«ª©«¨ª©©©§ª§«¨«©¨ª©«ªª«¨¦ª«««««©ªªª§ªª«¯«©­©©«¬©¨ª«¬¬ª¬¬®­®¬­ª®­°®­­®­®®¯¯­®°®®®°¯­¯­¬°®®¯®¯¬­®®­®¬ª­¬ª®«¬«¬«¨«¬©««¨¨¨¦ª¦¤¤££¥£ Ÿ�––�‚sogaZ[VSQRLKKVPRTWSQQNNOPOPPNIGGEAAC>DITepltrsuvutz|vx}|xy{}wz{||yz~xuyzzw|{|~{{||y{~{|¬«®­®­°­²±®±²°´­­§£§¢œœš˜—‘““�’�‹ŽŽŒŒŠ‹ŒŒ‰ŽŠŠŠ‡‰‹Œ��‘†‹‹��ŒŒŒ‡ˆˆˆŠ�†ˆ‰�‹��ŽŒŠ‡…‹††††ˆ‰ˆŠˆˆˆŠˆˆ‹‰‹ˆ„‹‰‹ŒŠ‡Šˆˆ…‹†ˆ†ƒŠŠ…„†Œ‡††Š††‰‡…†…‡ˆ‚ƒ†ƒ„„�ˆˆˆ‡……„……‡ƒ…‡‚‡††…ˆ†ƒ†…‡ƒˆƒ„‡ˆ†‰……‡……‡‡„�€zxumhkry€„}ysg`^UTPU^^ZSOGE:6/(*)*,**+-48DLY__iisw|ƒ‰�‘“—™™˜™–––—••’“�—•˜š››�›¡¡¡£¤¡¢¥¥¦§¤¦¨¨¦©§¨¨¨©««©§©©¨§«¨¨©©ª¨ª¬©©ªª©©«©ª­«««®©©ªª«««««¬«ª«ª«ª¬«««¬®«­­«¬¬«««¬®¬®®®®®®¯­­­­¯°°¯®ª²®¯­®®®®¯°­®«®­­«®¬°­¬¬«¬¬¬¬©©©«ª¨¨§§¥¤¢¢¢¢  �™˜•�‚slb[UTPRSRNQONQVRVVROOPMORQPOIGBECCA?CBLYiprsuv{xzz~yy{}wy|€{|||z}}||v|||z|€�{|}€~zz~€��€}«®­®®¯­®°²¯±±±²­«§¦£Ÿ¡™™——’””���Œ��ˆŽ‹‰‰‹‰‹ˆ‹†‡Š‰ŒŽŒ‰‡‰Š‹‰‹�ŒŠ‡ˆ‰ˆŠ‰†‰ˆ‹ŠŒŠˆ†‰�‹‰‰‰‰‡…‡‰‡†‰Š‰Š‰‰‡‡‡‡�Šˆˆˆ†Œˆ‡‡‡…†‡ˆ…ƒ…†Š‡‰‡‰ˆˆ…‡‡„‡‹‡ˆ‡ƒ††�†‡Œ†ˆ„�ƒƒ……�ƒˆ†…„‡†††‚ˆƒ„„……‡‡…Šˆ‰ˆ‡†‡†……�‚~�~}y{z}‚…�~}rpli`TPR^]`XXPLE>.'**+**/)+37?NRXY^knr~…‹““–™•—˜˜—––™–“�’••—›š›››¡¡¢¡¥£¥£¢£§§¤¥¨¨¤¨§¨ª«¨§«¥ª©«§¨ª§ª«ª©ª©ªª«¨©ª§©©«©©ª©¬«¨©¨©«¬ª®§¬ª«ª¬©¬««­®®¬®­¬°®««­­¯¬®®­®°®±®®¯®®°®­°®®­­°¬¬®­¯«­­®«¬­«¬®®©©®¬ª¨©©¨¨¥©§¨¨¤¥¢¤ž���œ�—–‘‹€vka^TLRNTVPPKLORWVVTOMOPLNLNNHIEBCBBAAEGO^gpsxvz~~{{zx{|{y|~{}|zyz|€|||}z|}~€€€}}}|~}z|‚|¬ª®«­°¯¯±±±´±±²¯¬©£  �™—˜˜––����Ž��ŽŒ‹ŒŠ‰‹†‰Š‰ˆˆ‹Œ��ˆ…‹‰‡‹‹‡ˆ‰„…ˆ‰Š†‡‹‰‡‡‡Š‹ˆˆ‹ŒŠ�‰‰‰‡„‡†‡Œ‰Š‹ˆ‰…ˆ†‡Šˆˆ†ˆŠ‰ˆˆ‡‡‡‡ˆ……†‡‰†ˆŠˆŠ‰‡‡…‰‡ˆŠŠ‰…„ˆ†‚†‰ˆ…†‡‡††‡†…„‡†‡………†‚…†ƒƒ†„…‰‡‡Œˆ„‡ˆ………„…�„‚�‚…€€{„�…‚€}yuszgUSTV\X][SQC;.+(*.,0*+.25AAMPU[gov{}ƒŽ’�“•––•—˜˜™—”–‘““”™™˜˜šŸ¡ ¡¤¡¡¢¥¥££¤¥¤©©¨¨¥ªª«¨ª¨«§«©¨«¬¨ª¨«¬«©ª¬¬¨©ª©©ª­¬ªª­§«®ª«©«©¬­­ªª¬ª««¬¬­­««ª¯¯«­ª¬­­¬¬¬¯­¯¬®­­­­±®°®±®¯¯®¯±®¯¯¯­ª¬°®®¬¬­««¬®­©®«¨©ª¨¨¨¨¨¨©¥¤¢¢¢žœœ›ž™––ŒŠ‚wkfbSRPPUVURPQTTTWXUQMOLLMMLJIKFEDFED>FGIYdmsyu{|w{|zzz}{|{}~z|{}|‚~{~}{|{}€}‚|‚z}}||}|z{~«¬«­«¯­±°°±´²®°­­¨¢¡ ž›–š––””���’��‘�ŽŽ‡�ŒŠ‡ŠŠˆ†‰‹Žˆ…ˆˆŠˆˆ†…ˆ…‡…‡‹Šˆ‰ˆ†‡Š‰‹ˆ‰ŠŒ�‰†‹‹ƒ…ƒ„‡ˆŒŠŠˆ…‡ˆ„ˆˆ‹‡ˆ†ˆ‡‰‹†ˆŠˆ‡†„†„†‰†‡‡…ˆŠ†„…‡ˆˆˆŠ‡††‡„‡ƒ‡ƒ…‡‚ƒ„‡†…„ƒ††……„‡€‡…ƒ†ƒ„„‡††ˆ†ˆ‡‡‡‡„„†…†‚†…‡„…„€ƒ‚„‚„}~x{}q`TPTZ\_\]SI;4(+*,.11../69AEISYfjquy~‡‹’“••––š—••••™�’“•—–——™›�ž¡¡Ÿ¡£¢£¤¢£¦¤§¦¦§¨§¨¥©¥©¨ª©¨©©ª©¬¨§¨ªª¬©«©¬§¬©ªª­«©««¬ª«««©©­««­¨ª­¬¬®¬¬­¬­­¬®®®±«®¬­ª¯°­¬°¯®­®­¬®­®°­¯²¯­²­­®«¬­«­®®¬««­«­­ª««ª¨ª§©¦©©¨©¤¤¤£¡¤ž™š›”—’ŽŒ…€xph_UPRSRTXUXVZUVUWWQOKMINLGJLLFIFHDADDIKQXblu{xxwxwxx}}|u{~z{{|y}}~|}w}~}}{~|��{|z}||y}wz}~«¬¯¬®®­²®±±°°²²­¬¨¢¡¡Ÿ�™—––•�ŒŒ‹’�����‹Š‹Œ‹ŠŠŒ‡‹‹‹ŠŠ†‡ˆˆ‹‰‹……„†‡ˆ‡‡ŠŒŒ‰ˆŠŠŠ‡ŒŒ‹ˆ‰Š�‹‰†…†‡ˆ�ˆŒˆ‰‡‡„†ˆŒ‡‡ˆŠ‹‰‡†‰‰‹‰‡„„†ˆ‹†Šˆ†‡†‡†‡†ˆˆŠ…‡‡ˆ††„…ˆ†…‡„……‰‚ƒ…†……ˆ†‚……„„ƒ‡„ƒ†ƒ‡†‡‰ˆ‰††…‰†ƒƒ‰‡…„……†‡‚…………„�x|qbVPTY[^`_ZKC1,+.05032+026:AEQYbenqu{†Œ’Œ•–——–”–––’•‘‘—–•–™˜š�ž  Ÿ¡¢£¡¢¢¡§¤¦¨ª¦¤¨¨ª§¨¨¨¨©¨«¨©ª«©¨ª©¨©¬¨¨ª¬©«ª«ª««©­««©ª«©¬©¬¬ª««¨©¬«©«®¯­®­­¬¬®®­¯­°«­®­®¯°±¬°±¬¯®­¯®°±®°­­®®°®¬¬­®ª­«®©®«¬¬««©ª¨¨¨¦¨§©§§¥¤¥¤  ›š–•“�Ž„ƒ|yrj`VSPNQWUQX\YUTTXWSPNLMPPNHOIGEOLEEDGJOSOYes{xxz{wuzzzxz|~~zw|{z~||~{z{~|}~~|~z{|~|z{zv{{{­ª¬¯­®®®±´±±²³±«¬¦££ Ÿž›™™”“���’�’‘’ŒŒ�‹ŠŠŠŒ‰ŒŽ�ˆŠ�‡ˆ†‰ŠŠŒ‡‹‡†‡‰ˆ‰‰ˆŒ‹‰‰‹‹…ˆ‰‹‰‡†‹Œ‰‡„ˆ‰ˆ‰ŠŒŠŠ†ŠŠ…‰‡‡Šˆ‰ˆŠ‡‡†‹…††‡ƒ†…††‡‡ˆˆˆ…‰…‰„„ˆˆ†‡†‡…„…†ˆˆˆ„†�‡‰�„‚„††�……‰…„„ƒ‡ˆ…„…‡ˆ†ˆ†‡‡‡†‡‚ˆ„„‰„‚…††…„‡…‚‚�|€}wiXMPRV]`[]QG82/.33310-.16<=FKU\chmnvˆŒ�”“––™—”–—‘”•“•”–˜•›™�œžŸ¢¡¢ £ ¢££¦¦¦¨¨©¨¦§§§¨¨¨©¦ªªªª©«©©©«©¬©©©¬ª©©®ªª§ª­ª¬©¨§ª­ª«©ªª©®«¯¬ª«¬®¬°«­¯¯­®­­­­¯¯®­®­®®¬°°­®®®¯®«®®®¬°®­®­¬ª¬¬«ª¬«¬«¬®«¬ª««ª¥§§¦¦§¦¦§¥¢£ž �ž–”�ŒŠ�ywurj^TQRPQQOQSWWQMQVSROOPPMPONGGGGMNIICHIONJSaivwxzzyszywww}}}zvzz{~}|{{zzzxzz|{~zz{{€~{|}{{|{wª­®°®®°°±±²³°´°­©¨¤¢¢ŸŸš˜•™”’Œ�’�˜���Ž��‰†‰ŠŠ���ŒŠŒ‰†ˆŠ‹Š‹ŠŠ…Šˆ‡ˆˆ†‰ˆŒŠŠˆ‰ˆ‰ˆ‡‡†Œˆ‹ˆ‡……ŠŒ‰†‰‰‡ˆˆ‹…‰…†Œˆ‰ˆˆ‡†‡‡†‡…�…………„‡ˆ‡‰…‡‡ˆ„‡†Šˆ‰ˆ‰„…†…‡‰ŠŠ…‡‚„ƒ„…††„‡„„…‡„†…†ƒ‰ˆ†ˆ†‡‡‰‡ƒˆ„‡……†‰†…‚‚…………€†‚…†�‚„€{o_QMKQ\_^[ZO?4323450,.126:>DIQ[blmlr}„‰�Ž‘•˜˜˜•˜•“”–””——––™š˜ŸžŸ ¡¡¢¡£¢¢¥¢¦¦§¥¦©§ª¦ª©¦¨§ª§§§«¥ª©«©©ªªªª««©««­¨ª©­©¬«©©©­­«¬¨­ª­¨®®ª«­°«­°¬®²®­­®¯­®«®®°¬®¬¯­®±®¯¯­­°­¯³­­®®¬®¬­ª¬¬««¬¬ª«¬®­«©¬¦§ª§§¨¦¦¦¦¤£¡¤£¡¡�š•�‡‰~tsrog\ROOTOPONQRQNNRRNONNLQMQMNCCEHKJIFHHMPILRWeqx{zyyzzzwxy{}}|yyyw|}{~zzy{zxwz~~z|zxy}~€~}}€�{ªª¬®°®­®°²´°°´±ªª¨­¥¡›�•˜”—”“�’�����‹‹Žˆ‹ŠŠ‡Š‰Œ“�‰Š‰‰ŠŠˆ‰‡ˆ�‰Œˆ‡ˆ„‡‡ˆ�‰‹‡‰‹ˆ……‡‡ˆˆŠŠ…†ŠˆŠˆˆ†ˆŠˆŠ††‡‡‡‰‡†„‡‡†Š†‡‡‚‚„‡……‰‰ˆ…ˆ‡‰†ƒƒ…‹ŠŠ‡‰……‡„…ˆ‡‰‡†„……‚………�„††††„„††‡ˆ…‡†‡ˆ„…ˆ…„……‡ˆˆˆ‡‡…†„€…‚†ƒ„„„……�ƒ‚�|sgRLGOR]\\^VI<72474,-0349:93353..5<879?DJS[dgfgmt|�†‰��–˜•–––˜–˜”“�“•“˜—™�š ££ž¡£¡¡¡¡Ÿ¥§¨¦¥§¦§ª¨©¨¦ª¨§¬©¬¨¨©«ªª«¨«ªª¬¨ª¬¨ª§«ª©®ª¬¦«¬¬¬©ª«­«¬«®«¬¯««­¯­­­¯®°¬°¬®¬­¯¬¯®­²°°¯­¯®®®®¯®¬¯­­®­¬­¬«¬©¨«ª©¬ª®ªªª©ªª§¨¨©¥¦¨¥¡£¤£   šž—‘Œƒ|wllkhf^WUSOLIMKNKMORRMIQLJLJLIJDHFCFJIGJHMRROONPScnxxw{|x{|}z€zx|yyzz{||{|{zzx��}|~~{{~{{}~||z}z«­ª­­®®®±¯³±±°°®®¦§¢›œž•—–”’��“Ž��‹‹Š‡‹‹ˆ‰‰ŠŠˆ�•‘Š…ˆŠŠˆˆ‹…Œ…†‰…ˆ‹Š‡‡‰Šˆ†„‰‹ŠŠŠ……„…‡‹‹‹‰†Š†‰†ŒŒ‡ˆ…††ŠŒ‡ˆ‡‡†‡ˆ‰‡ˆˆ…………ŠŠˆˆ†‰‡‚„†††ˆ††‡Š‹ƒ…‡…†††Šˆ†„ˆƒƒ�€…‰‰‹‰Š„…ƒ†ˆŠˆ…‰†„„‚…ƒƒ†Šˆ‡‰Š‰‰‚‰‡††„‡‰„„ˆ‡……„†„……‚zn^NGHLR]bbbTD7853642:?777BGMW_aeegmsx‚†ŽŽ•”˜•——•“—••’’”–™˜—˜šž   ¡¡£Ÿ¡¤£¥£§§§¤§¦©§¨ª¨©¨¨¨¨«¬ª««ªª«©«¨«­«ª©©¨¬©ª©©¦ª¬ªª«¬­«ª®ª¬¬¬«¬­«¬¬®®¯¬®­­¯¬®­­®­­®±®®¯­¬­¯®­®¯®«­­°¯¬­­©©«ª¨ª¬¦ªª©©©¨©«§¦¬¨¥§¤¨¥¡¥ ¡£ ¡››–‘‘Š„zqnkhgd`^ZXOJLHHHJMNNQJFFJIEGCDAEJHEGLLJLJMVPPSPNV_ltwyz|}||{y{{z{ww{yxw}}|xzxxy~|}y}}z|{y{�|}{y||«¬­­­°­­±±°°³±®°°ª§¤£žœ˜–“•’�‘����‹‹‰ˆŒŠˆŒ‡ŠˆˆŽŽ‹ˆˆˆ‰‰ŽŠ†Œ‡‡„†‡…�‰‡ˆ‹†††ŠˆŠˆŠˆ‰†‡ƒ‰‰‹‡Œ‡ˆ‡‡ˆŠ…‡ˆˆ†‰Š‰Šˆ‡‹‡‡ˆ†ˆ‹ˆ‡ˆ††ˆŠ‡†……ˆ…„††…†ˆˆ‡‡††††‰…„†„ˆ……„………‚ˆ„‡‹Š…†‡‡„…‡…‡‡†‡††„„‚‡‰ˆˆ‰‰‡†ˆ‡…†‡ˆ…ˆŠˆ††ˆ…ˆ†‡ˆƒ|sgSIEJPV[ceYL;653755::677?GNW__fbhjv|€ˆˆ‘’“—–—“”—•’‘–’”•—•–››�ž ž¡Ÿ¡ ¢ £¤£¦§§¥¨¨¨¨«§ªª©¦§«««ª­«ª«¨ª§««¨ªª«ªª«ªª¨«§­¬©­ª«ª«¬¨¬­«®®®¬­¬¬­¯¬«±«¯®¬®­­®¬­­¯®°­¯±®²¬¯­­¬±®¬¬¯°®««¨­§ªª¨©ª©ª¨ª©©¨¦¨¨©©§¥¢£   ¢¡¡œœ™—�މ„zqmklfgba^XSIKGJNHGHOLDEEIGEF@@DCEFFHKKJGHLNPPOQRRcjovx|y|~~zwz{xyzzz{{zy~}xxtu|‚{yyyzzx{|z~}�|{|€}ª«®­®¯®°¯±¯²²³±­¬¬¬¥¡ž™™—•’”‘�‹’Ž��‹ŠŠˆ‹‰Œ‰ˆ†…Š‹‰ˆŠˆˆˆ‹…ŒŠˆ…‡ƒ‚‰‰‰ˆ‰†‡ˆ…ˆˆŠ‰„†ƒƒˆ†‰‡‰ˆˆ†‡‰Œ‡†‡Š‰††…‰‹‹‡ˆˆ†‡‡‡‡Š‡ˆˆ‡…†Š‡…‡„„†ˆ„†ˆ††‹‡†€…†Šƒ‡„ˆˆ‡‡„†‡ƒ†„„‚‡Œ†ƒ‰†…†…„††‡‡ƒ‡‰„…ƒ„††‡Š†‡Š†ƒ„„‡‡„‰†‡„‚ƒ„…ˆˆ…†€~wp_QHHNP]bb]M=84488344847?IMX^ebdgmsx€ƒ‡��”‘’””’“”’‘’“’””’—šš�›��¡¡ ¥¢¢¢££§£©¥©¦¨¨¨©¨¨«¨«ªªªª§««©©«¨¦¨«««ª¬«ª©§§«¨¬­ª©«¬ª¬ª«ªª®­««¯«°°­®®®«¬¬¬®­®®­®®¯°¯°¬¬¯­¯®®¬¬®¬¬««««­­««ª¬¨¨¨¨¨¨ª¥¨¥¨¥¥¥¨¨¥¤¤ ¡¤ ŸŸ¡ž�™”’�ˆ‡‚xxokljdeca\TMOOKIGBGIFD?HIHC?5487:655867=DOW\aaeipv{~�ƒ…Љ’”‘‘’‘’“’“��”””’—™š›œž¢  Ÿ¤ ¢ ¥¤§¦¥§©¦¦§ª©«ª«¨¦©ª¬§««¨¬¬«§¨©¨­­¬­¬©¨©¨«ªªª««­«­ª««¬¬­¯«­¬¬­®®®­­­¬««¬­¬®®®¯­°°®¯¬¬°±­®®®¬«¬¬­«¬«¬ª©«ª¬§¨©ª§¥¦§§¥¤¦¤¥§¥£¢¢¡ž   ¢žš™“�‡‡„~{xkmkieccb^TSSLMGEBBBG=CKKFAC=?CEEKKMJG@DFCGHGKLV[ckkmquz{{|yxzx|w|y~}~yy{{{v|{y{zzx|€}wz{{|z}{|yz‚}¬®®­®®®®®²®³±±°±«¨¦¥¤¤˜˜šš”���‘�Ž‹ŠŽ�‹‡†Šˆˆ�‰‰‹ˆŒŠŠˆŠˆ‰ŠŠ‹‰‡‰„†ˆ†ˆ�ˆŠ…ˆˆ…ˆ‰‰‡‹ˆŠ†‰Šˆ‡ŠŠˆˆŠŠ‰ˆˆ‡ˆˆˆ‡‰‡ˆ……†ˆŠ‰…‡‡…Š„…‡…†‡ˆ†…‡‰…‡…ˆ‰‡„„…‡‡‡„……†…„‡‡‡…†„…ƒ‡……†‡‰…‡††ƒ„‡†……ˆŠˆˆˆ†„‡††‰ˆ……‡ƒ†ˆˆ††‡„Šƒ‡†…ˆ‡……ƒƒ‚ui`PDBJTZ^^UC857:942<688>BKQY_`genr{~�~ƒ†Š�’’••“��’’‘��‘’’”——ššŸ Ÿ¢ž  ££¤¥¥¥¥§§©¨¥©©©ª¨«©§«¨¦¦«ªª©©¨­¬«¬«©«­©©«©ª«¬­¬«¬­¬««­«¬¯¯®«­­®®®®¬°«­ª­®¯­¬­®®­¯«­®­¯®­°­ª¯¬««««¬¬­«ª¨«§¨§¨¨©§§¥£¡ £¤£¤¤ £ ¢Ÿ Ÿ¡�ž�—•’‹††|wulmhig_dd]YWSQLDDD??@BFIGF@C<@BCFFGKFFIF?;?>EINS\fijmrx{~{vx~wyy{zzuy{|{{{}uw}{{}{{}|ƒ{zwx{{~«­ª­­¬®«°°³²°±²­ª¦§¦£ š˜›—•’����Ž‹Œ�‘‹‰ŠŒŠ‹ŠŠ‡‡ŒŽˆˆ‰…‹�‰ŠŠ‰‰ˆ‡ˆŒ‰Œ‹Š‰‡…‡‡Š‹‰†Œˆ‡†‰‹ˆ‡Šˆ‰Š‡ˆˆ††‰‡‡ˆŠ‡Œ‡…ˆ†Šˆ†‰Š‡………‡†ˆ‡‚ƒ‡‡‡‰††……Ї…ƒ…‡‹‡„†„‰„…‡…ƒ„„‡‡„„…††…‰„†ˆ‰…†…‹„‡„‰‹…‡ˆ„„‡…‡‰Šˆ‡„†……‡ˆ†ˆˆ‡ˆ‡‡‡…‡†ƒ„…{rdTGAGNS\^[F;86;:969888=AGPXX[afjpuz~�€…‡��‘”�’�“‘“‘��‘“’”“˜—šœ Ÿž Ÿ   ¦ £¥¥¦§§¨¨¨«©¨¨¨©¬ª©§©©ª«¦ª¨«©¨ª««¬©¬¨¬¨¨«¬©©««ª«­««ª«¯®®¬­­­­¬¬®¬®®®¬¯®®®¯®¬®°°ª¯¯¯­¯®­­¯¬«­­­ª««¬«¨¨¨¨¨©§§¥¥¡ž�ž Ÿ £Ÿ£¢Ÿ ¡�ž�œ˜—�“�ˆ‡€{zywpllia_^^]]YSSOIDCB??CDHFBEA>@AAEGGGEDH@=;:>DJGWafiotwz|||zyzwtyyxw~~zw|x||}}yxz~€{|€}‚~|zzy|}|ª«««­¬¯­°­³²±±®®ª©¢¤£ œš˜–—•”‘���‹‹��‹Œ‹‰�‹ˆ†‹ˆˆŒ‹†„…‰Š‡‰Š†ˆ‰ŠŒŠ‰‰Œ‰‡‰‡‡‡‹‡‡‰‰ˆ‰†Œ…‡ˆˆŠˆ‹†ˆ…ˆ‰ˆ‡Š‰‡ˆ‹‰†„ŠŠ‡†ˆ‡„„…‰††ˆ†‡†ˆ……‰‡„†…†‰…‡ˆŠŠ…………‚†‚‡†„††………Š…‡„†„††‰‡‰ˆ…ˆŠ‡…‡…Љ…�‡‡Š‡Šˆ‡…‚„…ˆ‡ƒƒ†…ˆ‰‡‡…‡…ƒ†…€‚|zm^IDDLS^c]O=85;;9=978<=BFOQUV\afmry€€ƒˆŠ��“•�“”’’“Œ‘’�”–“——�—œœž› žž¡£¤¤¤¦¥¤§§¨¨¨§¥§©§©©§¨©©©«¨©©ªª©«©¬¬¨­ª¨¨©¬«ª©­¬ª«­¬ª««¬­®¯««®­¬­­¬­­­®¬¯¯­®¬«­¬­¬®«­­®°®¬«««ª«©«©©¬©¬©¨¦¦¨¦¦¨¡��››ššž�   žœ›œœœ—–“��„ƒ€{xutqoikkc][ZX\YVTPGGFICAAA?BGDA@@>>BGHIFFCC:><=DGKUfiqst{yxwxzxz}wzxwwyx}}|{x}}‚{zzxz|~€€}}~xz}y|€}«®­«¬¯¯¯²±±³²±¯«ª§¥¥¦¤žš˜—””•��Ž��‘�‰ŠŒŠŠ‡…‹‹‡�‹†ˆ‡†……ˆ‰ˆ‰ˆ‹Œ‹ŠŠ‰‹ˆ††‡‰Œ‡ˆ‰‡……ˆˆˆŠ…ˆˆŠŠˆ†Š„…ˆ‡‡ˆŒŠŠ‡†‡„ƒ‡Š…І€‰ˆˆ‡„‡‰„І„††ˆ„‡ˆƒˆ†�ˆˆ‰Œ‰†…„„„…„‡‡……ˆ‡„†‡……„†‡ˆˆ†‡‰„‡ˆ‡Œ‰„‡‡ƒ„‡ˆˆ‰ˆ……Š‚ƒ……ˆ‚„„‰‰ˆ†…‡ƒˆ……ƒ„~~wdRJGMP[icS@:8<>=;6879=@HHLQS]_emruz|�…†�’‘’’˜’•‘’��‘’’“—™˜š™›���ž› ¢ ¤¤¦¢¨¦¦§¥§¨©©ª§¨¨¨©¦©£¨¦ªª©«¬©ª¬ª­««««¬¬­ª­«¬«­ª­¬«®¬«­®«¯°°«¯«««¬­®®¬¯¬­­­­­®¬­®­«­¬­¬­¬©«­«©©ªª«©¬¦§¦¥§§¥¥  ›—™™™›�™›� œ�ššš”‘�މ„€{plmomnkk_[ZWXVYWROMJLLJIFCAGIFF>?::BFDJDEDA;>@>DHMZdnoxvwwuyyzx|{|z|{|w|{|yzz{€€{~{zz|~~|}{{|~�}~~~ªª«®®¬®®±­±³±±¯®©¨¥¥¢¥ —š—“�‘�Ž���–މŒŠŠŠ‰Š†ŠŠŠŒŠƒ†ˆ„‡‰Šˆ†ˆ‡‰‹‡‡‰‰ˆ††ˆ‰†ˆ‰††‰…†‡‡ˆˆˆˆˆˆ‰‰Œ††„…„ˆ�ŠŠ‡‰†ˆƒ…†‰††ˆ…‡†‡…‰ˆ…‰ƒ‡……‡‰‡ˆˆ…„†ˆŠ‰‰†††…‡„ƒƒ…„„ˆ†…ˆ‡†ƒ„‡†„†…„ˆ†‡„„‡‰Š‡††‡…„‡‡‡ˆ††…†…††ƒƒƒ€ˆ‰‡„‡‚ˆ‡„…††��ym]SIGN]hhZF<;:::;<8;7>?@GLLTW`fnpuz|{ƒ…‹�’”’�”““’�‘’“‘“•™•™œœ›™��žŸ¢¡¡¡¡£¥¦¥§§¥§¨ª§§¨©©¨¨©§¥¥¨ª««¥««¨¬ªªª¨«ª¬ª­©¬¬«¬««¬ª­­¯¬­­­®­®«­¬ª°¬¬¬¬®«®­ª­­­«¯®¬¯«««­««­©©«¨¨©ª¨ª¨¨§¤¦£££¢ �š––™™——š˜›œ�——”•��Œ‹ƒ€~{rmfiilmge`WUUURQTSPNQNSSTPKHKJFD>>>9?@C@DDB>BA=AEMP]dntsw{uvv||zy~|z||{z{yz|{yz}z{{{{yx}}}x|ww|~~{€{ª«¬«­¯¯®±°±³°±±¬­ª¦¢£¢Ÿ™š—–��ŽŽ�Ž�–��‹ŒŠŠ‹‹‡‡‰‰‡†ŠŠˆ‰„ˆŠ††ˆ‰‡‰†‡ˆ‰†ˆ‡Šˆ†…‡‰Š†ˆ‡‡ˆ‡‰…ˆ‹†…ˆˆ‡„†„‹ˆŠŒŠˆˆˆ‡‡‡…„…………‡…ƒ‡…‰Š†ˆƒ…†‰†‰‡†‡††ˆ…І†…„…†ƒ„„ƒƒƒ„…‡ƒ……ƒ„…‡…‡ƒ†…�„†ˆ‚†††ˆŠ‡†€ˆ‡…‡ˆ†„�…†………‡…†„‡„†…ˆ†…‡……†„�{uf\KCHW_f]K?885:=<>:9=>>DGNRSZemorvz|y~ƒ‰��’’’““’�‘�•‘””–™–˜šžž›�›  ž ¡ž£¦§¤§§¨©§©ª¨¨§¦ª§§«¨§©§©«©ªª«¬¨­«¨«©ª¬ª­¬­¨®­ª¬¬­©«ª®­­¯«®­«¬«©¯­®­«­¬­­«­­«¬«ª««©©­¬¬ª©ª©¦©ª§¦§¨§¨¤¦¡¤¢£¢ Ÿ›š–•™–—–•˜–——“•�Œ�„ˆ‚}vtlidachffc[XWTQMNRRQOPTVZ[YSMOKOI@@<<=<==@>A?CABILLS_empsyu|uz{}|z|}~|||z€z{}€}~{yyzy|||€z~||z~{}~}|­««­©®°®¯±®³±°®¬¬©¦¤¢�š˜œ—–’�‘Ž‹��”‘‘��Œ‰ŠŠ‹‰‰ˆˆ‡ŠŒ‰‰†‡ˆ‡‹„†…†ˆ†‡ˆ‡„††‡ˆ‚…‹ˆ‰‰ˆ‰†ˆ†Š‹‹………‰…„ƒ‡‡�‹‰ˆ†‡‡ŒŒ…‡ƒˆ…€„…ˆ„ƒ…ˆ†‡ƒ†„†ˆ‡‰ˆ‚„…‡ˆ…‡ˆƒ„……‡†ˆ…„„‡‚†„†„„€…‡‡…‡…ƒˆ‡„ˆ„……‚Šˆ‰‰ˆ‡ƒ…ˆ††ˆ‡„„‡„‡†ˆƒ�ƒ‰„ˆ…‡‡‚ƒ††‡‡‚€{qfUCDP]d_PB;597:??@8>==EHIOTXcijquuv{}‚ˆŽ��“’’�Ž��‘“‘”–”—–š�š�š�š žŸ ž�¡¢¢¦¥¨§§©ª§¦§¨¨¨¨¨§ª¨¦¨¨¨«ª«¦ªª¬ª©ªª«¬­®­­®­­®««¬««­¬¬«®­¬­­¬­«¬«««ª°¬«ª­­¬«¬ª«©©©©««¨¨§§¨¦§©¦¦§¤¥¤¤¤Ÿ£ ¡£Ÿ �›•““•–“’Ž––‘‘Š‰Šˆƒ„}ztngea^ceba^YYVXSNNSTSQTVVZ]]\WWRRNJDDD=:9:=@A@@EHKMWZ_gksvyzxyx}}{|{|zz|||{}zz{�|yyx|||{}|~yxz~{{z€z~{}~¬«¬­®¯®®®±²³±±°®§«§¤Ÿ¡™œ›—•“’•Ž��ŒŽŽ���Œ�Š‹‹Š‰Š‹†‹‹Œ‰‹‡‹ˆ‰‰‡‚…І‡„†‰‰Š‹ˆ„†‰ˆ‡‰‰‰‹ƒ‰‡ŒŒ†‡‡‡‰‰ˆŠˆˆ‹‡ˆ†‡…ŠŒ‹ƒ…„„ƒ„‡‡‡†‰‰ˆ…‚…†‡‡††…�…‰††‡†…Š‚‡„‡ˆ……ƒ†„‡€„ˆƒ†‚…‡………ƒ‰�…ƒ†‡…„„‡ŠŠŠŠ†‡ˆ†„…„ƒˆ‡…‚…‹…�ƒ‡†‡‰†…‡„„‡…‡‚ƒ�~xn^HEJ[ecQH>8567==C7;>>DFILQYafjlosrw|�…‹Œ‘‘“‘‘’��‘‘‘‘–”š˜˜œ˜œœœš  žž›ž£¢¥¦¥¦©¦¨ª¨ª¥¦¨©§¨¨§¦««¦ª¦¨¬©©©©«««ª­«¬¯­®®­¬¬«««­­««­®¬­«­­«­­¬«ª¬¬¬¬ª©¬ª«««ª¬«¨¨¨©ª¦¨¦¦§§§¤§¥§¤¤¢¢ ¢ ¡¡žŸ�ž›˜––”––‘‹‹��‰†‚…}}~zurjce`_^f_VYZZ[[TKKLWXYVUTZ_bbabYZWRNJNG@<<==@CAAHMQ\^bhmrv}yywz{z~z{~wy||||}zx}€~w{|}|~{||zw€zy||}{{�€§©¬­®®®®²®°±±²¯°­§¦£¢�šš˜š•’“–‘‘‹���ŒŒŒ���‰Œ†ˆ…ŒŠŠŠ†Š‹Œˆ‡‡ˆ‡‡‡‰ˆ‹ˆ„…‰‹�†ƒ„…ˆ„‡‡†‹ˆ‰‰‰‰…‰…ŠŠŠŒŠˆŠ‰ƒ†…†ˆˆ‡‰†ˆ‚„�‚‡‹‡‰‹‰‰†…††††ˆ‚…„‰‰„††‡…‡„„‡†„„‡…‰‡„ƒ……‰‡ƒ…††„„„‡‹„…‰‡‡‚…‡ˆŠŠˆ‡‡‡†††„………†…„„‚‚…†ˆŠ‡‡ƒƒƒƒ�……�„ƒ€tgMDHT]`]I>997;:??==<=CDFIQS]cfjgnpru{…†Œ‹�’“‘‘�‘’’’’•“™™–™˜™�˜›����Ÿ ž ¤¤¦¦¥¨¦§¨§§©¨©©«§§©¦©§¨¨¦ª¨ª««¨«««®­¬­¬¬¬­«­«¬®¬«®¬¬®®¬®­®«®«­«§ª­ª«¨¨«©«­©©¨©©§¨©¦©¢¤¥£££¡¡£¥£¡ž¤ž  Ÿžœ� �š™”•–”–ކƒ†…ƒƒ€}{yxsnijab^^^`\XX_`cZWRMMTWYURUZaeecc_^_[VXROIC>@>EDEFHOV]eemstvz{xwyyz{||yzwz{{yxz{}|zz‚|€{||z{|||xy{~{|}}ª¬ª«­¯®°­±±±±®²±¬¥¥¥¢žœššš˜�“”’��Š‹���ŠŽ�ŽŒ‹ˆ‰…ˆˆ‰‰…‰‹�‡ˆˆ‡‡…‰‰…‡ˆ‡‡ˆˆ‰†‚…‡ˆ„†‰ˆ‰†‹‰‡…‡…‡‹�‹‹ˆŠŠ…ˆ„€ˆ…†‡‡‰‰„ˆ„†…ˆ…†‹Š‰ˆ††…„…‚„ˆƒ‹„‡Š…†ˆ†„„ˆˆ…„ƒ„ˆˆ†…†‡‰…………†‚„„ƒƒ‡…‡…„„„ˆ…„�Šˆˆ††††‡‡†„…‡‚†„„‡ˆ‡‡Š†ƒ€€‚€ƒƒ………‡€zkWDDMZe_OA=<45:;>=<==;?CILQZ^_deklmwx‚……��’�‘‘�Ž�”””“—–˜˜˜–››šš›œœ Ÿ›Ÿ¢¡£¤¥£¥¨¥¥§§©©§ª¨ª§­¦§§§ªª©¦©©ª§¬ªª«®±¬¬®­«¬¬«­«««««¬°­©«­­®¨­­©¬ªª«¬¬¥¬©¨ªª«§ª¨§§¨¨¦¥¤¤ž ¡¥ ¢  ¡�  ›� ��œ›˜™™–’’“’ˆ…€€}€}yzttsokiha``_a`[VX^a`^[TUQUWWUUW\_fhb_]da_`_^VNKD@@CEDFLQZ`imnuuvwzzwy{{z{zzzzuyw~z{{z}y||{€|z�yz|yz|z|{~|~~|‚ª¨­««¬¬¯°±°°²°®¬­©¥¦£žš˜š�ž”’��”˜ŒŠŒ�‰ŠŒŠŠ‹‡‰ˆˆ†‰ˆ‰„‡ˆŠ††‹Š‹ˆˆˆ„ˆ‡ŒŠ‹‰‚„ƒˆ‰‰ƒ††‡‰‡‹ˆ†„…‡‡Š‹�Œ‡‰‰‡‚‚…‡…„††‡ˆ†ˆ…„„‡†…ˆ‡ˆ†…„„……ƒŠ†‡†‡ˆ‹…‰‰†„ƒ…‡„‚ƒƒ‡†‰†††‡‡‡Š……�ƒƒ‚…†…ƒ‡„ƒ„ˆ‡‡‡†‡‰‡‰†…„‡†„„……„†‚‰‡„ƒŠ…ˆ„„ƒ‚ƒ†………‡‚}o_EBIZfcTG@73348<9<;@FENW\_cfhkntwˆ‰‹Ž‘‘ŽŽ���””“•“••š˜˜™™™š››š�ž¡ž¡££¥¥¦§¥¨¥©¨§¨¨«§§§¨¥§©§¥¦¨¨«¨ª¨«©«¬«®®®­«¯¬­¬«­«®¬®®¯¬¬©«­¯««©ª«©«¨¨§ª¨­«©ª¬¦¨¢§¤§¢££¢Ÿ�›¡ ¢œš›–š˜��Ÿ��—™˜˜”‘’‹ŠŒ‹ƒ|zyuvrumjomhie__b__aZU[^d`b]ZVXYZWWUSZXcf`b^[`gcef^YSKECDDCEJUZakmmnwvzuywwyyxxwx~zxwyyyy{{|x|~~|z|{yxwx{{}~z}z||~}©­¬­¯­®®¯°°²²°°­­«§£ ž›™š�¡•‘�‘–œ�‰��‹ŠŒ‰ŠŠ‹‡‹…‡Š‹‹‡ŠŠ‡‡ˆ‹ˆŠŠ‹ˆ…‡ˆŒŠŠ‡ƒ‡‡ˆ‹…‡ˆˆ…†Š‡ˆˆƒ„Š…ŠŠŠ‡‹ˆ†‡„ƒ‡„†……‡ˆ‰…†††‚ƒƒ„…‚†„„„�ƒƒ…ˆ†‡†‰‡ˆ‡†‡‡…††‡„…‡‡……‡ˆ„…‰††„‡ƒ‚„…ƒ‡†…‡Šƒ‡†„…‡†‡‡‰…††‰†……„„€†……‡…†‚‡„…‰……†„…‡ˆ„ƒ…‚}u^KBIUcd]N>64377==><9:7>>AIQWachekmqx|„†…Š�Ž�Ž��“””•—™–™˜™š˜˜™�›œœ›���¢¦¦¨¥¥¥©§¨¨¨§§¨¦¨«©©«¥§¥¨¬©ª¨ªªª­¬­«¬©¬¬®­¬¬«®®«¬¬¯¬­®««®­ª¬«ª¬©©©ª©©§©¨ª§«¨¦§§¥¥£¤¢¢¡žœ��ž¡�˜—–”–—™˜œœš–”””‘‘�‰„ƒ‡|rpllolidkjdab`^aa^^TYZ`cdgc^_``ZXYUSUZbad`a\dehefd]ZVOHCBDJKQZbimoqtzwvxyzzww|w€�€yz{zzxv|}€€y}~z}xwwwwy~~|€€~€¨«¬­­­®®¯°°³±²±­°­¥£žžš™˜˜–“’’‘‘”‘‹Œ�Š‹�Œ‰Š‹‹Šˆ…ˆ†‡Šˆ‰‹‡‰ˆˆ†‹‰‡…‡Š‹ˆ††††‡„‡‡Šˆ‰‡‡‡ˆ‹‡†‰Š„‰‰ˆ‰�ˆƒ…ƒˆƒ……Šˆ„„‡ˆ…ƒ„�„‚‚…ƒƒ„…ƒ…�„„„‡‡‚†„‰„ˆ††ˆ‡‡…†…†……„…„†…‰ˆ…„††„„……†ŠŠ‡††‡„‡‡…†„†…†„‡…†„†ƒ…„†………„‡‚‡…„†‡Š…ƒ‰†………ƒƒ~zhP@HRafcSF:85558:<99554:;EOV]c`fhmpu{€‚‚ƒ‰Š�����”’“‘—˜”—˜———ššš�›ž����¢¢£¢¨¦¥¥¤¥¦ª¤¨¦¦¨§§ª¬§¨©¦©ª©«©«ªª®¬©¬«®¯«¬®­«««¬«­®¬«¬®«®¬ªª¨«ª©¨«¨¨¨¦©ª¨¨§§¨§¥¦¤ ¡¡¡Ÿ›š�›˜�™•–���’–“—•—““‘��ˆ‡‚€{}€ulncjlfb`aac``a\fabZXYZ^cekgdcgbb]UUOW[`ffca^f`ddfd`^bUMHBHKHO[cimnuxuwvvz{{yxz~{}}{}y|}wutz~zyxx|zuwytv}{|z~|~««ªª¬­«±±²²¯°±¯±­«¢¥¡�š›™š–“””Ž���Ž�ŠŒŒŒ‰‹�‹‹‡‰†…‡‡‹…‰ˆ„ˆˆ†Š‹ˆ‡†ˆŠ�††…†ˆˆ„ƒˆ‰ŠŠ‰‰‹‡‡‹ˆ‡Š„ˆ‰„Š�‡‚„…ƒ…†‰‰Š„†ˆ‡…‡‚‚‚ƒ…‡‡„„…‡„††�…†…„ƒ„‰„„…‡Š†ˆƒ‡‰…„††ƒ……‡ˆ…††„†„…‡…‰�„„„…†„ˆ†ƒ…†…†……ƒ„……ƒ††‚ƒ†„…ƒ…„†††‡„……„ƒƒ…†„‚‚{iVDCPZegYI?54/2557>:84318CGS^`^cggmw{�z}€…ˆ‹�Œ��’�“••••™˜–—“–™˜›˜�››��¢ž¤£§£¥¥¥§£¤§¤¨§¥¨«©©¨©§©©¦ª§ª«¬§¬¬­¬««®¬®®«­¬­­­¬«°¬®ª­««©«¬«¨ª¨«¨§¦§§¦¨¨¨¨¦§¦¡¢ ž¡ž ™›™——•–‘”މ‹�����’“ŽŠŠ‡†ƒ{twusomidgec]\\^a^`^^bd^^ZZ]^cijfgijhe`_VRZaadgee`aacgcifb`[SPJLJFS[blkouvyyyw{z{{{{zw{|x|y~zwyw~|{tuywz}yvxxuv{~|~|{|}|ƒ~««¬««®®¯¯°±¯³°°­®¦¦¥  œš˜—–’“�ŒŒŽŽ‰�‹ŠŠ‡ŠŽ�‰……ƒ‡‡ˆ†…†‡‡ˆ‡‡‡‰‡‰…†Š‹�„‰†Š†„‡ƒ…ˆ‹Š‡‡†…‡‡ˆ‡Š‡‰…Šƒ‹‰ˆ„…„…ˆ��†††Š‡‡‡„„„‡‡‰‰ƒ……‚„†ˆ…‡ƒ�‡„ƒ„†ƒ‰†‚‡‡„……‚…†„„ƒ…†………ˆˆ…ƒ†…‡�Š€‚†ƒˆ‡…„„‚‚ƒ„„ˆ‚………†„„…�‡„„†„†…„……‡‡„…‚…‡†‡€��woZGBGQ]b\PA71114669:54//4=EPW]_abdmv{{|w|ƒ†ˆŒˆ��’’•”•–˜–”—“�‘—˜—š˜›œœ žž¢¤¢¥¥¥¥§¦¤¤¨¥¨§§§¨«©©¨§©¨¨§ª««ª®«ª©«ª«­­¬«ªª«ª­«¬¬­ª­¨©«©«¨§©ª¦§§¦§¤¨¥£§¨¡¨¤£ž�œŸ � ›•”–’’•’Ž�‡ˆ‡Šˆ‹‰Œ�‡‡‡~wwolhmihc`b^_YV]_`a\`aab]]Z`^\ecjhhkimjge`Y[[aghhec`[eeeiic__]ZTQIGJYahrpuzzwxxzyw{y{vzzzwy}{|{|z|}{uvvy{zxzyvrwy}}zzz~}}©«­­­­­­°°±±²®°®­§¤¤ ›��š˜”‘‘��Ž�Œ‹‹Œ‰†ŠŠŽŽŠ…ƒ†‰†‡‰…†‡‡‚†‡‰ˆˆ‰††ˆ�Œ…†‹…‡…„…†„‰ŠŠ†„‡ˆ……‡‰ˆ‡‡Š…ˆŠ‹†‚‡ˆ†Š‰ˆ††‰†††„‰��‡…ˆˆ„„„„†…†„……„„„�…†„…ƒ…„„‡…‚…„‡†Š…‚ƒ„††‡‡„‚ˆ‰ˆƒ……†ˆ…†‡…€‚ˆ…„†„ƒ…‡†…‡‚…„‚�„„„€…„……‡„„„ˆˆŠƒ‚�€zqZMCCL[b]UF:4/4/245740+)0;BHSU^[abku{{yyw~„…Š�����”•––™”—”��“———˜ššž�ž� ¡£ ¡£¥¥£¢§§¨§¨¤©©ª©§¨«¨¨¨¨¨«¨ª¬««««¬­­ª¬ª¬«¬¬¬ª­ª«®­ª©«¬«ª§§©©¤¥¦¦¦¤¤¤¤¥¥¤¥££ž›™›—›š™••“‘�‘ŽŽ‹ƒ€„†‡„…†ˆ‚€|ztpkedece`a_]\[[\aY`Y[accb]`bdadelljmohkjkd[]`cfhhea^]acefjgfca\[QMHNT^eovzx|wz{yx{|{z{{|{|{{|||~|zvwvz€zzzzyvyy}{}}}{�}~«¬¬®­¬®°±°°°´²²­­ª¨¤¤š›Ÿ›””””�‘��Ž��ŒŒ�ŠŒŠ‡�†…ˆ‰‰‰……ˆ………†Šˆ‰‡‰‰‚…‰‰ˆ†…ˆ†ˆ„ˆ†ˆ…‡†‡Š‡‡…‡Š†‡‰Š‡…ˆ‡ˆ†‰…‡‡††…†‰‡‡ˆ‚…ˆŠˆ†……ƒ‚‚‰†‡‚…ƒƒ‡‰ƒ…‚„‡‡‰ƒ†ƒ„…‚€…ƒ†„……‡†„„†Šˆ††‚Šˆ…ˆ…Љ…ˆ‰„‡„„‚†‡ˆ†††„‚ˆƒ„‚†ƒ€„‚……ƒƒ�„ƒˆˆ†€‹Œƒ„ƒ�zsdSEBDT[_YK;943.3100/('',6;EMNQZ^dgo{yvyw~…†‰���ŽŽ�–”––‘—–��•–—•™–˜�š›Ÿ Ÿ£¡¢£¤¤£¤¥¥©¥¨ªª©¦©ª§§«¦¦ª¨©©«©«­¨«®ª©­ªªª¬ª«¬ª«ª««¨ª«¨§©§§¨¨¨¦¤¦£¦¤¤¢¢£ ¥£¡žžœ––“�––‘’��ŒŠŒ‡…��~€}||�}|{|urkb_^_`ae`_cY\`_[]V[Zd^abbcd`cemtoklnikngia]cbfdhgab][_bbgigbebaZRMQTYems}xyuxxyyw}{|w{w|{zz{|{}{{x|w|z{wy{{yxz}|}{}z€}~©®­­®®¯­®±±°°°°±¬¬¨£¢�—š˜—–““‘ŽŽ��Š�ŠŠˆŠŒ‹‰ˆˆˆ‹Šˆ‡…†…………Ї‰ˆ‰‰…„„††…‰‰†††‰……‡…†„†Œ‰ˆˆ‡‡‡…†‰Š‰…‰‡‡††„†‡ƒ†††‡…‡‡‚………ƒ…‚…ƒ‹Šˆ‡�…„‚ƒ†…†ƒ……‹Š‡…�…ƒ„€††††‚…‡…‚…‡†‰†‡‰‡ˆ†„…ŠŠ…‰‡††…€�‡…‡‰‚…„…ƒƒ†‚„…�„‚…ƒ„€€„„„ˆ†€…„‡……ƒ{tbQE<=MX_XK>;524010-+(&$,49?GKKU]_hlvzzwvz‚�…‹Œ���Ž�•—•–“�‘‘�–š—›˜™™œ�ž¡ £Ÿ¡¢£¥¤¥¦¢¤¥©©§©¥©©©¦ªª¨©©«§©ª§«ªªª««««©ª««©¬¬©«©¨«©ª¨¨§ª§¦¦§§¦¤¥¡£££ ¡ ¡�žž�—™•�Œ�‘Ž��މˆƒ„‚|~|yzxuwwwyxxrogc_]^aabac^]Z_][YZX^^^]bcaceegqvqlppjkkigcffacghgeb\\_eabhlkghe`SSVZ[dpquw}zxzzwy{{|{y|}z{||}}|zzzy~{}xzy}|z{{{|{~}~~«ª«¬¬¯¯®°°°°°²°¬­®§¥ œšš˜•’’�Œ�‹����‰Œ…ˆŒ‹ˆˆ†‡Š‰ˆˆ†ˆ…†ˆ†‡ˆ‡Š…ˆˆ†ˆ…‡‰ˆŠ…‡‡‰‰‚†ˆ…‡†„ˆ„Ї†…‚‡ˆŒˆ‹Š‡ˆˆ…††‡…†„……„‰„‡�‚†‚ƒƒ…‹‹‹‡ƒ„‡�ƒ……‡„�ˆ„ŒŽ†ˆ†„�…ƒ„†…„ƒ„…ƒ‡†‡‡…††ˆ‰‡„ˆ‡‰‰Š‰……ƒ…††ƒ†„‡†„„„‚„„„�‚ƒƒ�ƒ„†‚„…„‡ƒ‚‚ƒƒ„„€{sdSH@;CS]\KB=91/.-))( *-6:AEJRY^bjuy{xv{~‚‡ˆ‹Œ‘Œ�‘’••–�”ŒŽ‘’—š˜˜™š›�žž¢  ¡£§¥¥¨¥§¢¥§¦¨¥§©§©¨«ª©¥¨ª¨¨««¨ª¨§§­©«ª©©ª¨©«ª¦©ª¦¨¨¦¦¦¤§¤¥¦¦¥¤£  ŸŸ�ž �ž™™—˜”‘‹ŠŽ‹�Šˆˆ††~|z|xyswurosmtsnnhfb`^_a^beda___\ZY[\\Za\ce``aikprqmionikhbejcddiefedb_addegiiikeaZ\^]`agpvwzwv}twx{}xvxz~||||z|~~}{wz|~}|zvv{~yzz|}|€~~}{}|«©ª­¯¯¯®®°±°¯¯°®¬¨ª¦ ¢ž™•–‘�����Ž��Œ‹‹‡‡Š‹ˆ‡‡ˆ‡†„‡Šˆ„ˆ‡Š…ˆ†ˆ‹‡‰†‰‰Šˆˆˆˆ…‰‰‰„‰‡‡ˆ„…‡ˆ‡†…†‡…†ˆŒ‡‰‹ˆ‡……‡‡ˆ†ƒƒ‡„‡„†‚†…ƒ…ˆˆ‹‡„…‚ƒ„†ƒ‡…„„‡ˆ‰ˆ‡„ƒ�‚‚~„„†ˆ�…†……ˆ„ƒ„…‡†ˆ‰‰‚ˆˆ‡†‰‡‡ˆ‡…†ƒ„„‡ˆ†„†„…ƒ„‚‚„‚…�‚„„†…ƒ…ƒ„€ƒ‚ƒ€~|yiZIC=@MWXPE>;4/0,'$!!%-45;BGMWW]fqwwwty|�ƒŠ��ŽŽŒ��—”‘‘��’�””˜˜™šš��›�¢¢ ž ¡¥¦¢¦¦¤¥ª¨§¦¤§©¨©©¬ª©¦ª¨©ªªªª¨¨¥«¨¦¨¨©©§ª«¨¨¨§§§¦¨¤¥¥££¦¤¢ ¢¢Ÿ ž›œ�›�œ—••‘�Ž‹†Šˆ‹ˆ…‚}€|wwuvwsqoqlmmmjkiicba^_]`eee_a`\^\\]Z\^\b`dd`cinnroijkhjiiehgcghigghfddfcfedfjghgegf`bb]`ksxvzxzzwx{}wuzx{{~|x~|}|{~z|z}|wvz{}||z|€~||~~|€{¨«­««¬®®°±±±°¯²­¬¨©©¥±¦”•–““�‘�ŽŒ�‹‰Œ‹‡‡‰‹‡…†‰‡…†‡‰„‹ˆŠŠ†„†„ˆ‡†…†‰††‡‰†ˆ‡Š‰ˆŠˆ…†„ˆŠ††ƒ†‚ˆ„‰‰ˆ‰††…ˆ‰†‡‰‡‡†‡ƒ…„‡�„ˆƒƒ„†„„„†‚‡‡…‚„……†…ˆ‡ˆ†‚…‚‚ƒ‚�„„„Ї……„‡‚ˆ†‡‡„…„……„…†‰„‡†‡‡ƒƒ‡…ƒ…†…‰‡‚„‡ƒ†…„ƒ‚�ƒ�……‚„…„ƒ‚‚‚��€€vn\UG==GQWPIB:8..'%"'*28=CHRWZamuvtpsu~‚‡���Ž���•”‘Œ���‘’�”•–™˜›� ›ž£�¡ ¢¢¥£¥¢£¦¨§¨¥¦§§©ª§¨§¨¨©§§©©ª©§§§©¥§¦§§§§¤©¤§¢¦¥¨¤¡¢¢ ž¡££ž žž œœ–—•—™—”�Ž‹�‹ˆˆ„„…‚‚||{ytspspmillkhdgcdedca`]]^`cdbbbb``^^[UY\]bdddabkmoqplklgjigefgcgbdcchddedd_ecccdfejhcb^^^\hrtww{~|vvz|zuvxz}{{{u||y{}~z{yzzwywz|yuzz|xzyz|}««¬¬­­­°°®±°²°¯«ª«ª¥ª­¢–˜˜•“‘’‘�Œ‡Œ‡ŠŒ�…‡‹ˆ‰…ˆˆ…ƒ„‡Š…ˆˆ†ˆ‡‚ƒ††„ˆ†……ˆ‡‰†Š‰Š‰‰…†ˆ„‡……†ƒ†�‡†�…†ˆ‰‚‡†‡‡ˆˆŠ†‡ƒƒ…ƒ…ƒ„……ƒ‚††„„…††‡ƒ�„†„„‚†ˆ‰‰†�„„ƒƒ‚‚‚„‰‰‚ƒˆŠ„€‡†…†„…††€ƒ�‡‡†�†ˆˆ…ƒ‚ƒ„…ƒƒƒ‚„�…„‡…„„…�„………†‚ƒ…‚„€ƒƒ��ƒ€|xqbWH?>CGRQKA;72-(  $')5:85-% (/29CLPYbhntwrlpx†…Œ������‘��Œ��’‘�”•”—™›ž��ž¤£¡£¡¤¤£¤££¥£¥¥¦§¥¦¨¥¨¦¨¨©¦ª¨§§§§§¨©§©¥¥¥¥¦¥¥ ¥¢ž¡ ¢¢ �š�œš›—›—œ›�–•��ŒŽ‹Œ‰†ƒ…†‡‚ƒ…}}|yvsojmmhhfhegghaccccaa`_a`ba_a^`bfdceda]UQPY`hcacffihonmkihkhhchkfea^dadbbbb^bgmgfbeiile_ba^_`jsyzz{{xx|€{x{www|{vz{~||}~zuyyy€~{z}yvuw~|{||z}~¬©¬¬­®­­±±²²°­°«¨¨¨¤ ž �š˜”””�Ž�‹Š�‹ŒŠŒ‰†‹Š‡‡ˆŒˆ„…‰†‡‰†Š‰�‡‡…‡ˆˆˆ……ˆ‡‚‚‡„‡ˆ…ƒ†††‡‡‡„…††…‡‡†ˆ‰ˆˆ……‚„‡‰‰†‡•�…ƒ…„…‡ƒ……ƒ†…ƒ‡†„…‡„‚ƒ‰‡………‡†„‚ƒ…„‚………�‚†ƒ…†ˆ†…‡ˆƒ††ˆ†…ƒ…ˆ„†„„ƒ‡†…„ƒ……ƒ‚ƒ…„€„…�†‹……†„„†„†ƒ‚†�‚ƒ‚„…ƒ„€…€~ui_SC:7;DLIC;50.%"$(.89GLV_bosuqmly~�…���‹‰‹Ž��‹‘‘’��‘”••—›œœœž¢££¡£Ÿ¢¤££ ¥¢¤£§¦¦¨©¨§¦¥¨¨ª§ª¦©¤¨§¨¦¨«¥¤¦¤££¡¤¡¡Ÿ �� ¡�œ–š›˜—–”–˜š™˜‘ЇˆŠŠ‡‚„„„�€~~}vwttliijldhgegedb_bgb`gfb_aadab`^_fdfcgeb\XUSX^adbiihjhmpnnnjlnfgmlhd_\cbbcc_ccejkiiedchha_`aa]^bkqzzzx||€~{{{xvz|{|{~~}|~|txw€{z{yz{xy{~~{}}€ª«¬¯©¬®¬®¯±¯±­¯¬ªª¨ ¥ œ¡Ÿ™‘–’‘�‹�ˆ�Žˆ‡Š‰ˆ‰Œ†ƒ†‹‡…‡ˆŠ‡‡„‹‹�Їˆ‰…�‡…‡††‚‡…‚…‡ƒ†Š„…‡‡ˆ‡†‡†‡ˆ††‡ˆ‡…‡„…‡††‰ˆ‰”Ž‚‚„‰‰„††„„‚ƒ……‡‡‡……‚†„‡…†„…‡†ƒ‚…†‡�…„‚ƒƒ‰‡††Š…‹ˆ…€………†‚†‰†‚�„„…†††„‡‚†ƒƒƒ…„†�„†‰‡…†…ƒ……‚ˆ„‚�‚…ƒ„��ƒ€ƒƒ‚}zmdYI=55?86*+% %)5>EKP]hntnhjq|€ƒ…‰‹………‹‹�‰����‘�”””—–››šž�¡£   Ÿ ¢¤ £¡ ¥¡¤¢§§¥£¦¢¤¢¥©©¨§§¦¦¨¥§¥¤£¤ ¢ž��œœŸš˜˜š™˜”•”“�މŠ�‹�“��†‚|xvxy|}vuoqrssorplcegcbcedhb_]^_`ced_f`^acbe`Y]Zbbda__bb^[[]_]ahhgjiijknqrqokilmkkilegfab``[dikijhiheeabbce_a]^`gtwsw|}||||y~|zvy}}x{ƒ}|wvv|z�{|yuzz}{}z|x}{zw©­©«©¯¬¬°±¯¯±¯°®¯ª¤¢žž�˜™–•™’����ЋЅˆ‰‰‡ˆˆ…†„ƒ†ˆ†Œ•ކˆˆˆŠ†‰‹ŠŠˆˆ„ˆˆ†…ˆ‡‡‰�‡„‡ŠŠ„†ˆŠˆƒ‰‰„‡……„‡…„…„„ˆ„…ƒ‡ˆˆƒ„„††ˆ…€‚ƒ‚„�‡‡†ƒ………‡‡ˆ…†�‹…ˆƒ‚„…€‚…„ƒ„‡††„‚†…†‚„ƒ„„„‚…†ƒƒ�„‡…„‡ƒƒƒ„„……‚…‚„�……ƒƒ€„‰„‚…‡‡ƒ„€„„‰ƒ�ƒƒ€‚€|}ujbTD828=?>97,$%*/9?CJVempnidpz{‚…‡‹‡€‚†ˆ‰Œ���Œ��‘’’”˜—š›žž   �  �  ¡¡Ÿ¡¢£¢§¥¥¥¦¤£¢¥££¨ª¥§§£¨¤¤¤£¦ Ÿ š˜—›šš”™™——“”‘��‹‡‚…‡„ˆ��‹‡€ytttwwxuoomjnqmmnhefbaa`cddb^^V]cgcbadaaaddc\ZZY`b_ZY]bfb^^`acfggeehkjlkrssnkkjkoinlkeefbb`]ehigihkkgddffei[_a\[bnuvvzzyw{{w{~wzv|wx{~}yzzwzvy|zy{{vx{}|yy}xz~yªª«©¬®®®°°®¯®²°®®¨£¡¢ž�˜˜–––��‹�‹ŒŠ‰…ˆ…ˆ‹†ˆ‰†„†‡…‰��‰ˆ‹…‡‡‡…Їˆ†„„„…ƒ……ˆˆ‹‹†…‡‰‡†‡ˆŠŠˆ……‡ˆ‡‡‡†††ƒ‰†‡†††‡‡‡‡…‰‡ˆˆ‚ƒƒ‡ƒ‡…Šˆ††„…ƒ‡†„‡†‡ˆ„ˆ……††ƒ„††„†‰‡ƒ…€„……‚…‚…‚„‚ƒ†‚‚„‡…‚ˆƒ…†‡…„ƒ€…………„…†��‚‡€†ƒƒ„……}ƒ‚…‚�ƒ‚‚~€€~yumbRE<38=;;;6,!',5;>JQ]dojkenw€~ƒ†‰†‚‚†‰Œ‹�‘�������—–›šžœ  ¡¡¡Ÿ�›››¡¡Ÿ¡¡¤££££¥££ ¡¢£¦¢¥¥§¤¥£££¢¡¡œ›–”‘““’”‘‘�’’��ŒŠ†‚€€~€�ˆŠˆ…|vvqsruvrokihinllkfb_[]_a_bcaa][^`dfabdcc_bba[ZWXX[^]XYadbabc]dfdddfkkflorrqqnomkjmmlnhaacba]bbiikgejhhdggifc``\X`fqwyyyzxx}|{|zxz}wvx~}{z{||zz|zzy|||wz{z{}z||xªª¬«¬¬«¬®¯¯±±­±®­©£¢¢£œš•—’��‹�‹Š�ˆ‹‡‡ˆ†‡‡‡…‡ˆ††‡ˆ‰ˆˆ‡‡„ˆ†‰…ˆ…ˆ…†…„…ƒ€‡„‡ŠŠ†‡…‡‰‰Š‡�‡ˆ‡ˆ‡‡†‡„ˆ†ˆ‡……Ї†……ˆˆ…‡†ˆ‡‡†………†‰ƒ…†††…ƒˆ‚„€…†…†‡ˆˆƒ†…ˆ„‡†‚†††ˆ„‚ƒƒ„†‚„…‚�‚…†„„†ƒ……ƒƒ‰Šˆ…�„ƒ…†ƒ„…‚†�„ƒ„‚‚ƒ�„‰……‚~……‚��‚{|vpg\RE=6;7:772*! ",-37AMT`hiihmsuy€„�ƒ}{~ƒŠ‰ŽŽ��ŒŠ����“””™œ�Ÿ›� Ÿ Ÿš››ŸŸžž¡¡¡¤¥££¢£ž ¡ ¢¥¢¥¤£¡£¡ž¡ž�—–’��‹Ž���‹��Š‹‰‰‚|y{|w|‚�ƒ…‚yuqroqqomlnjgljflje^^]`^___e`b`aZ`edbecb_^^`Z_^VYUWYXXZ]^`bgcaacbaahmjjqmonnonlmkkdmpkcdefcf_`egjhdeidegegdgc[ZZZSZkpvtzxswyzz{y|zzxuu|{|x|€y|xz|z||~{|vwy||yx}yyªªª­¬­­°®¯°°³®®«­©¥£¢�œš˜‘“ŽŽŽŠŠ�ŠŒ‡‡‰……†ˆ†……†ˆƒ‡…‰‡ˆ†ˆ†ˆ‰‰‰…‚…€‡‡†††ƒ††ˆ‰†‡†‡Š‡‡ˆˆ‰‰‡ˆ†‰†‡‰‡…‰ˆˆˆ…‡ˆ„ƒˆˆˆ…†„†ŠŠ‡„‰ˆ…‰‰„„†ˆ†‡†…‚ƒ‡„„ƒ‰„…„‚‰„‡…‚ˆŠ…‹‡�„‡ƒ„ƒ‚ƒ�ƒ…„……ˆ€……‡ƒ‡‹‡€�ƒƒ„ˆƒ„„„„€‡„‚ƒ…�„‚„‚„„‚�„‚‚~~}€{vtl_WOE;8775592($ $)/0=FP]gdeegopwz‚„€ƒv|†���Ž�‰�Œ��Ž”‘•™œœžœ� ¡žž›šžšœžžžž¡ £¤¥¢¢ž�ž�£¡¢¡¡¡›Ÿ ¡š›�•“Œ�†‰‹ˆ„ЇІ‰ƒ„‚ytvrtwrxz}€‚xplmonkkolmheffgjjaa^aZ^]^ada`b`Z`ecda^bda[\^[YVVXWUXUXST\bfgb_a^^bhkhkqopnmmnmnkkeimhehglgdchechiecccfhfgecaXWWVRR_jpuxz{xxwzx|{yzxs~{{~z}~|{|{w}~ƒ{vvv|}zwx|||©©«¬¬¬¬­®¯¯²³®°°«©¤¡¡Ÿšž—’��ŽŠ�ŒŠ‡ˆ‡ˆ†…‡ƒ‰……‡ƒ†…‡„Œ„†††ˆ‡ˆ‡‡„„ƒ†††‡‡…†…ˆ‡‡‡‡†‹‰Š††ˆˆ†‡‡…ƒ†‡ˆ„ˆˆ†ˆŠ„†ˆ……‰‹‰ƒ„‡†ˆˆˆ„†‡†ƒ‰ƒƒ†„…†‚„€„†‰ƒƒ………ƒ…ƒ„‡ˆ‚„Љ…†…�ƒ‡‡…�„��‚ƒ……„„……ˆ‡†„„‡…ƒ€�‚„„……�…‚‚ƒ‚………‚„ƒ€€„ƒ‚‚ƒ‚~�|zystqgYQHB:71/2322.'"  &'.8ENV__bdfgjn|€„€}wx~ŠŠŽŒŠŠ�Ž‹Œ��‘—–™™š�œ¡¡£�ž›šš™�›�� Ÿ�¡¡¡ž›šžŸž¡œ��™›˜›™˜––‘‘Š…‚„……ƒ�€�€€||{prmoqmpntv~}xpkmkklnmmliebbagfe]ae_^^b^_bd``\]a`]`c`b`]_][YRYTTVTWSRVZdgh^```_dkfiopmppkmqoljchhichikggdggcaaced`cccgc`]bXTVSQNP^muyvzyyyzyzz{yxx}}}}y|€yx{{{€xvsy{vwy{{|¨©«¬«¯«®¬°°±²¯¯­¬§¥¡¢œ™˜•’’”‘‘ŽŒˆ‡‡Šˆˆ†‡‰‡†ˆ‰ˆ„…ˆŠ�‡…†‰Šˆƒ‡‡ˆ„ƒ†‡‡†‰ˆ…††………ƒ‡„І††„†‡‹‰…„††‡‡Š‡‚‰‰€ƒ„…‰ˆ‰‡�„…‚‚�‚‰‚…ˆ‹†‚…‡‡„„†‚„ƒ†‹‡‚ƒ…�ƒ�…†ˆ…ˆ…‰�‹†‚�~…†„€„…€‡„‡‡„‡„†‰ˆƒ†‡„‚…„„†…ƒƒ…„�„ƒƒ„„…ƒƒ‚��‚€†„€€‚€~xwumhc_T@7842+()*+,-*' !$/6DIMRV^ccaho{{|€z{y}ƒ‡Œ‹ˆŠˆ‹‹Š�’”’”™›šŸŸ£¢¡¡ž–™�˜›œš��  žž��—›™™››�™˜”’�•–“����‰ƒ��‚�~yz|yyutmikhiimjlkvyvjmkljnomfjheb`aagb_dabbaba_cgb]^__`\bbae_]^[ZZUYTQQUTUXSYafgcba_abmjhqspnqmmpoojfgdeflhecdeehc`^acecdhhia`ba^ZZTNKGUemxxwwxxz{xyyyxzz~y{z‚z|{}~}~~|||yzzz{xz}zª««®­­¬¯«¯°±¯°®¬«©¤¢ �˜–””•‘’‘�‹ŠŠ‰‰Š‰‰‰‰‰„Љˆˆ†‹�‹„…†‰ˆ‡…„‡ƒ†…†…†ˆ‡…„††Š„„„„††„†‚†„†‰……†‡�†‡…ƒƒ‡ˆ…ƒ…‡„†ˆ�†„„„�€‚„††‰ˆ†�†ˆ„„„‚ƒˆ††ƒ„�…„„��…ˆ‰‡…†Ž˜Œ‚‚ƒ…„…†ƒ…ƒƒ…ˆ†ƒ……„ƒ…………„‚‚„††ƒ„‚…„„…ƒƒ‚ƒ�ƒƒ�‚€€‚‚‚�€~{wqg[PC>5,()(' !" "&$&"$ !",6;BGIRX^`^dmvz|~~yt{|ƒˆ‰‰„†‡ˆ‹�‹’‘�”–œ™›  Ÿ ž›–••›šš™œ››Ÿ›œš˜•“–”–š•“’Ž�ŒŒ‹�‹Œ�‹��~�~~zsvwtpqjfffjejgheksqonlmjiikjkefe``bbaddeebdc`a_cea^`[`]^Z^bbbb[ZZWZYVOVTXX\YY^ahfgcbfbjkiqtrppkjnnkiidccffecggeikffaaafifidhbceb]__WLHIN^mtuqutzx|||xwtwz}{}wy~z|z|€|w|y||x{{yz|}¦¬«¬©«­®±­²­²¯¯­¨ª¦£ŸŸ˜—’—“����ŠŒ�ЇŒŠ‹‹ˆ†‰‰‰‰‡††‡ˆŠ„ˆ‡Š…„…††‡‰‰ˆ†‰‡…‚ˆˆ†„†‡€ƒ‡ˆ†‡ƒ‡ˆ†‡…‰ƒƒ‡ƒ…ƒˆ…†…‚…†„…ƒ�„�‡€‚‚………ƒ††„�ƒ„„…„……†‚…‚‚„…ƒ…ƒ…ƒ†……ƒ…Œ’ˆ‚ƒ…„„‰ƒ„ƒƒƒƒƒ……†ˆ…�„‚‡ƒ‚„‚…‡€‚„�‚ƒ„„ƒ„„„€‚�‚‚}|€€{|{xuqhX@80,(#"$  % #%!!! !-29;=ALTZ\aainuy}y{squ‡‰‡‰‡„†‡ˆ�����“–šš™ ž¡ž˜‘’••—™—šœ™™™š–’’’“”’•’‘�†††‡††……††‚~{z|{yyrrrjlidff`eejgeddnqplmjffdhiafecccacbbecdc^aabbfg____aXZX]^cee^]ZRXZXRSWWZ]Z\_dgfkibdhgehrrtpkjkkjklkghheghcehhehcbfeddeccffafd``c^]PGHHSeortxz{xz}{xuyx|z{yy{{{{|}€~x|yz}{{|{z{}}}ªª«¬¬«®«­°®­¯°¬¯¬«£¢¡œ™—”•–‘‘�ŒŠŠŠ‹�Œˆ‰‹‰ˆ†Œ‹Š‡„„…‡…�„…Š…ƒ††‡‰…‰‰…†††‡„…‰ˆ…†‡ƒ†……‡‰†……†‡†‚‡Š‚‡‚†…‡ˆˆˆ…‡…‡‚ƒ…ƒ……‚†ƒˆƒ†ƒˆ�„ƒ„�…†‡„‚‚‚„†ƒ„ƒ…†…ƒ„…ƒ„‡‰…�ƒ„‚‡‡…†……€�ƒ„„………„ƒ………ƒ†�†…„…ƒ…~�„ƒƒƒ…‚�€}|}}|zvtpji]PA+'%$# !##% !  !   !&*3464>ES\]\aipov}wuoqs{„‡ˆ…ˆ„„…‰Š�‹ŽŒ‘—•—��œŸ›•‘��“–™˜•›˜––—“�������ŠŠ…}~€‚|€€|yyxvxysmnkjikfcbb_hcgebiilhijig`ecgegdbgfd`efdhdc^bbdffbfab^b]WXY^_ba^^SRW[ZWRTWV]^^deeegigeieadkoqpnlljllolgfiegifcfhhfehfede`ccceec^^^c`^SIEAKYjmsx|zw{||wvxy{xz|xxzzz{{x|{{zyy€zy{vwy~|~§¬©ª©®¯«°¯¯¯°¯­°¬©¥¤Ÿ�–™”–”‘‘�Œ�Œ‹�ŒŠ‡‰†ˆ…‡‡‰Š†‚ƒ†„€…‡„‡ƒ††‡ˆ………ˆ…‡…†…„ˆˆ‰ˆ……ˆ‡†‡Œ†„…‡†ƒ„…ˆ„‡„…„‡†Š„‡‡‡„†…†…€†ƒˆ„ƒ�„†„†………ƒ€„…�ˆƒ…„„„…†‚„‰ƒ………†ƒ†‡�…‡ƒ�ƒ†……ˆ…€ƒ�„�ƒƒ…ƒ‚‚†‡„‚……‡ƒ…„‚�„ƒ‚�‚ˆ„ƒ�}€{zw{{rqod]VNE7-!! !! #$$!!!"" " !(,04435AMYZZaajktvyumnr|�„††ˆ‡„€…Š�‹‰ˆ‘�’—œœœ™œ’‘‰Š�—”“•”•“”ŽŒ‹‹�‹‹‹……†}zzz}{z{zxwuvsstpttnjjigheda`afdgcdfhcifdgbdfdefhgffa`cbdjkfcb^dgfcegcabb\[[[]bcd^ZVTY]ZUVUVU[[bhfdbgigjid^cmpqmmnolnljkigeggifehigghiekfcadbdfb`]Y]bb\TKF=>M]ku{|uw|zyvx{|vzy{{y{{~~yww{|zwz|{ywwy€|€ª¨ª««­¬¬­±¯°®°®­ªª¥£Ÿœ�›—”’Ž’�ŽŽ‹Š‹‰‰‡‰‰ˆ„††‰‡…ƒ…ƒƒ€†……‡…†‹‰‡…„†„„‡…†††…„�ˆ„…‡Š…ŒŒ„……†ƒ‚…ƒˆƒ†„†‡ˆŠ„‹†…‡‡„†ƒ„ƒ††„‚‚ƒ�ƒƒ……‡…ƒ€€††‚ƒ††ƒ‡……„„…ˆ†…ƒƒ€„…‡…„„€„…�ˆ„†…‚„ƒ…„„‡…ƒ„ƒƒ†‚ƒ‡ƒ…‚‚}…„�‚„€„ƒ�~xxtopmh^ZQB74*%! !&#  "!"$&("" $**-13019FSRU^`gkosuqolku€‚„†…~€‚ŠŠ†††…��––—•˜—�ˆ†…Š�‘“‘Ž‘‘��‡„„†ˆ‰…~yvssrsursuvrqponjmrsqjigfkgd_[cbbdaddbaffc`cbfe_dfghefabbehkea_^dbebhbfbcdba]^_]aaX][XV]WWVWXY_]cjidekghhmfbegmmjmnopplhkjdjchlgbfhgoffhgfd^cfgaa^ZZ_b__WRG<@DWfrxzxvwwuuzxzwyzz|xz{|{vxwzzvzzzzzywx{{‚ª¨«©¬¬¬¬®­°¯¯¯¯¬§¨§¥¡›¡�•”‘��Ž��ŽŠŠˆ‡‰ˆŠŠ…††‰ˆ…Ї„‚ƒ…ˆˆ‰Š…Œˆ‰‡ˆ€†ƒ„ƒ‡‹Š†‚ƒƒ„……‡†‰ˆƒ‡„…ƒƒ‚‡‡…‡„…„„…„ˆ„††ˆƒ…‡……„„ƒƒ„�ƒƒƒƒƒ†‡…‚††„‚ˆ„…ƒ„„„„‚††…„‚„…†ˆƒƒ„„†ƒ…‚…ˆ†††ƒ„…ƒƒ……„‚ƒ‚„…„…†……ƒ�‚‚‡„€‚€…~~zuofa_\RKC8,''$  !$""!!%')((%%%!$#&+.00108?LOSV`hhkrrojhjrz}}‚‚�€|€„�…�„ˆŽ””••–’Œ……|……��‰…�‰†„ƒ€€zvutsqiloqutrrrpqnhhinnlmigghecd`]dbabfb^dgebbbdcgaagfbefbb]dhkfaa`cabccbdbcdc`aaZ[^[Z[Z[VYZXZYW^__cjjieffdinhfddgkgnpmopojklmhghigfdfklegfg`bceea``]\VZc_^XQF:9=Obktx|z{xxvutzwx{y|€}{{yy{yw{wywx{{x|wx{}|§§¨«©­­­­®°°­¯®¬©§¥¡œœ›˜™�������‹‰‹„†‰‰ˆ‡‰Š…Ї‰‰Š…‚ˆ†…ˆˆ‡†‰‡„…‡‚†ƒƒƒˆ��‡ƒ…†‡‰††‡‡†ƒˆ…ƒ„„†„…‡‡……€‡‡ƒ‚‡„††‡ƒ„„‡‡„…‚‚‚……„„‚…ˆ†„†„†ƒ„‚ƒƒ†„ˆ…„„„…‚…††††„ƒˆ‡‡€‚…‡‡††…ƒ…„„ˆƒ‚�„„„………ƒ�„�‚…„ƒ�‚€€zvrh_RHD?64/'"! $$$% #)&*...'+(%%'.,-.//20>EMORXbbjkoohbkovpxz‚||z}|}�†��”‘”“�Š�~{}€…„�ƒ€‚€|{~|z|yspotollkkppqlqooonifefkigkifffefa_Z]abcabhbec_eehhcfcab``b``ddigeccb`_```ebcbba[bXW[Z]WZZZ][]ZZZ\a_chikibbbfikgheffjpronnnkjjkijheekgchlkhfd__abdda]ZVYZ\_^VPD:5=H]hrwxxyzwwpswyyyyz|zzvz{yyxuxxxu|ysz||~ªª¨¬ª­««°°°¯°¯­©ª¨¡��š�˜š˜ŽŽ���Ї‡ˆ„ˆ†„‡Šˆ‰‰„…‡ˆ‰†ƒˆ„…‡‡††‹‡‚…„„ˆ…ƒ„ˆˆŠ……‚�Ї††„…„……ƒ†‡…Š……ƒ††‚ƒ„„‡ˆƒ„…‡‡ƒ„†‡‡„…�„„…†ƒ„…††„„ˆƒ‡€‚‚†ƒ†…‡ˆ‡ƒ‚„„ˆ……„……‡…†ˆƒƒ„…‡…„………ƒ‡‚‚ƒ„„…ƒƒ†„€‚‚€„…€‚€€~wshdWI<,.*'%# #"$$%"$(,,+/4.0//-.,,/3,/0-/7DHHMT[aghkje^diqprv||ywwu|xz|€€ˆ‹�‘’�Ї�xyy{~}}zzxzuwy}vvtsqonmkhifikmihllnmhc`dfjkojffggd^]ZYb`d`bcdfebadghcca^`_`ce_ecdhdd_b^[`a_eedda^]\YXY\]YW[\[[YWY^\``cgjihd_d`fjhfhfhnmpnqpmqmnnhjgegghbfjljgc`bbbfa_]YYU\]Z[UME97:DZgqtyxzyuwwvyx}z{}}|}zzwz{zuwzvxyx|zwu|{|©©ª¬©®¬­­¯®°°°««©¨¦ Ÿ¡™—–��‘‹�Œ‹‰‹ˆ†‡‚†††‡‰…‡�……ˆƒ‰‡„„……ƒ‚‡†…ƒƒ„………€„„……‡†‚…‡…ƒ�„‚„†„„‚†‡‰‡ˆ‰ˆ‡ƒ†††††‚…ˆƒ†ƒ†‰……„„„‚‚‡„……�„ˆ…„……€ƒ„†††††„…‚„ƒ…ˆƒƒ†�‚‡ƒ‡…„„„„‚†‡„…†ƒƒ„ƒ‚‚ƒ�…ƒ€ƒ„‚‚ƒ€‚„„€€{xshYLB7'  !!"%%'$&(+,-4579466834101,,+.5?DFFRW\aaeb`]`djjkltwuutowpsv{�ˆŠŒ‹�‰‰„€wrurvxspoqssovrrqqopmkdgdcigeefffgkigd`gefjlidejkg`^^\__dacdegibdggea`b^]]`fdd`ffgbec`\_`[abdb`]_aaX[Z[Y[XTX_\WW[^aaabejeja_]]eficihkmmqqsmnquqnghggiiebgkilmd^aabfc]\[XYZ[\\YOH?89@O`kowwxwusstz{|zyz~xzz{yx{zwwuutwxxx{vxv{¦¨«­¨¬¬®®­®¯°®®¬«§¤Ÿœ�š–”�”�Ž‹Œ‰ˆ‰Š…†………‰ˆˆƒ‚‡†ˆ‰Šˆ…‚‡…‡ƒ†�†‚‡„„ƒ†‚‚„„„„…€……„†………‚‚‡…ƒˆˆ†‰‡†‹„‰Œ‡„†‡†ƒ…ƒ…‚„‚…„…„„…ƒƒ†„†‚…„ƒƒ�„†‚‚‚„…‡‡„‡ƒƒ…ƒˆƒ…„„„ƒ€ƒ…†††�ƒ…„ƒ�„…‡„‚„„€€€ƒ�€€�‚ƒ‚ƒ�{zvldUG;/'$$&(+**,..18;<==8;99574.,+03:?AGPVV\b`\VU^cfdbgnrvstnpqoqv|…„…†††„€yupnkmqmlkplnnmllpoolkfbe_]badgcdecebh`affgegfgbhkid_^aa`abefeiffgddddaa`caadgbfgggfcde_^\]]be_a[^\^Y[_aZ[WSV]ZWU]a_`bdeegdc_[[]bbdiinhmottottsurhfdjiedageigifb_``ad^\\VXX^ZWVSG966;KYfnpxuwxvvuw|}zy{{wwzz~|zxuutxzx|||yyx|z§¨ª©®ª«­­­°¯­®¬¬«¥¥ �›œ˜‘“‘�ŽŠŠŠ†‡‡„…ˆŽ…†‡„‡‡…‡‰ˆ‹ˆƒƒ†‰‡„�„…ƒ„…‚…„‚…�……„‚†ƒ„‡„†‚……‚‚ƒ‚ƒ…„‡†„‡„…††ƒˆ†ˆ……ƒ‡…ƒ„„…ƒ‚„„……‚…€‚‡…ƒ‚‚†„�…ƒ†…‚†‡…�†……†‚…„�„ƒ€ƒ„†‚„€‚‚‚ƒ„‚‚ƒ‚€€€�„…~‚‚ƒ„„‚~~~wsodYK<4)" %%++.,/,28;?BDFBFEFGD>:862/2.06;;?BEDNQRMFGNVXZVXbjpniggfijnmtz|y{yvqnikhhghgidedfdgfgkhjjcc`]WTXV^``bhbef]_a^`fcceeegefhgfjggacbgmmifhggcjhfiibcdgcfbhldbcc`ZY\^]_]^\UUUY\[[YY[X[UXW_bddddcdgch__YZ[Y[ggkkjmpwxsvpx{umjigikfegabgcadbac_^\\][]][Z[TNC8005?LU_kvw}vwwuyz~zwxyyvxy|yyzwwzzww|zz~w|€¨©ª©ª¬¬«®°­¯­®­ª§£¡ žššš”Ž’“–�‡ˆ‰‡‰‡†Š‡‡ˆŠˆ„„†ƒ…‡…�…‡…��…‡‡„……ƒƒ„‚‡†‡…†‡„††‡††‚„„†ƒ„†…†ˆ‰†‚…ƒ†……„††‡…ƒ…††‚†………€„„„‡……ƒƒ…‚€„�„…‡�‚‚}�ƒƒ‚‚†…„†„†‚|ƒ…‡……€~€†‚„‚„„�„…‚…‚€€€€~ƒƒ‚�‚„‚}yvraQA0""%)++/49?EEGIJFICCA;=73/2078<::>@IMKH@@DQUWUN[ejgd^^_ccfilqurtrohdfggeabaeca_`ggfacggj`a`UTPYZ^]caeefd`d_aabecb`bhejifikhiggdhimjfhggijljlebbebadcdhcdbfb]]ZZ[]\YZRQXYXYX[[[Z\XY\_bdfdhegfccc`]ZY\[beffkmrpsuttz|usnhgeffgi`adbbcbbcY\`]^Z[^X]]XMC50239BMYcowz|wwxv{wxwyvxvs{|xyzvvz}wywv{|zz{{¨©©©¬«­«¬¬°°¯¯«¨¨£¡œ�›šš˜’�“ž‘‰‡ˆƒ†‡ˆ…ŠŠƒ�Ї…‡…ƒ„…„‡…„ƒ‚‚…ˆ……†‡„„ƒ…ƒ†…†„‡‰‡†…ƒ……„ˆ†††††„……�ƒ‚††††‡…†ƒ…ƒ‚���†…ƒ„„‚ƒ†‡…†‚…ƒ‚ƒƒ�ˆ‚ƒ…€�€�ƒ‚ƒ‡†……„†ƒ…€‚„…„ƒ…€€ƒ†‚…ƒ„„„ƒ„ƒ„…ƒ€€€€‚‚‚‚€~sniZI7" " $().12=AFIGHMHIDJB@:<5007789958>AEEB<?86266655847>B;==ADINKLKRV[YXZWZVW^Y`celha``_`]Z]^^``X]dfeia_afca^^XTPOSS[aaebedea^]aab_^eccdhmkgdkhggkikjhjbeeefhedigjfd_^\b_fa`b_ab``]Y[[ZWWYUUUY_[Z[Z]\Z`_eghlif_bffbaa_^aa^dbfgiksssvrtpqmkkigdikgjfdfac`bb__^``Z[X\]a[SE65,/03=LZhxxszw{wuutvx{wuwwwyyyvvzyzyxxxzxxwt©§ª§ª©­ª­°®«°¯®©©¤¡¡ž˜˜•”����Š‹‰‰†ˆ„Љ‡†‡ˆ‡‡………‚†‰ˆ…„†�ƒ…†ƒ‡…„€†�†�†††„‡†…„‚…††††††„ƒ‚†‚‚‚„„ƒ‡ƒ„„†„†ƒƒ„€ƒ„ƒƒ……‚‚ƒ‹‹††ƒ…‚ˆ…„…‚‚�ƒ��€�ƒˆ€�‚„ƒƒƒ„„ƒƒƒƒ‚…ƒƒ‚ƒƒƒƒ‚„„…ƒƒ�…‚‚€��ƒ‚€�|vlcXJ/ +'" " ""%(%026=CBGGKKKIKHFCCB=6862303449;<:=>DIJGEHPSTSUYUUSTTXVYbaa]Y[bZ[[X][W\Y\_^bcbaa^]a]]WTQPQU\b^cbcga`][``][`cadegmjhehkffmjfejb_bfcdc`dfiidcc]_\a___a]\_\`^[]]WWWUTVR[\Z\WX][a_`ghkikecadga_aa`]_deecjgklpvqqpnmnlihgbcglhjgeaca_aa_ba]\[V^cYXQE?40+21;HYhssvy{ywuutvw|{uvv|~z{|uzwy||yyzwxwu¨§§ª««©­«¬­­¬®­«§¡¢žš–•—“��‹�‰‹‰Šˆˆ…Š‡Šˆˆ‹Š‰…„ƒ€ƒˆ†„……†‚‡†…ƒˆ„„„†ƒ…‡�…„„…„ˆŠƒˆ‡†‰ƒ…†„‡„ˆ‡‚„„„‡€„…„„ƒ††„„‚‚‚ˆƒ�„�†‚ƒƒˆˆ……„�„„ƒ„…ƒ�„�„�ƒƒ„…„„„‚�‚ƒƒƒ„ƒƒ„‚‚ƒ„ˆ�€ƒƒ‚ƒ‚�‚…‚„ƒ~�ƒ‚~}}vtreXH1   "'"##%# $$%+36>?BFEEJKGKEFBDEA=87446454775::71./49ARcktux{wxvttvvww||y{|xzxwuwx{{y|zy|yw§§ªªªªª­«¬®­°¬­©§§¢Ÿš”•“•‘Ž‹��‰ˆ‰ˆ‡ˆ‡††‹‡Œ‡‡„ƒƒ…ƒ‡ƒ‡††ƒ„ˆ…‡ƒ†…ƒ…„†‡„…„‚‡„‹Œ‰…‚†††…†ˆ†††‰‡…………‚ƒ�ƒƒ‚ƒ„…‰……‚„‡‚‚‚„‡�ƒ‚†ƒ‡…†‚…„†…ƒ‚„ƒ„„ƒƒ……‚†„…‚‚€€……†…†‡ƒ�ƒ…†‚„„€‚„�†‚‚�ƒ‚ƒƒ‚�zuph]F8"  #(*$%&%$! "$%#%*47@?@CBEHLJGHFBAGB>:;973767576385;@BDBBFIMPQVQNSUQVVWX]ZWXVVVWZYVXYSWWW]Zab\TW`[__\SOOOVX\_^^\^`_]X^acdfa_dejgjjhhffba^bca_\ae`^^^^cecfhg^]]^_Z\_\ZYXYYY\YXYTNOOSWYVWWX]ZZ^bdeaefbaeifcdid_a`gfdciljfikmmmjfgkgd_^\cgeifg^`c`eeaa]ZZ[[YZXTSJE92.304:L[fpsxvyxtxtzvwyz{x|x{{y{vxu|zxy||}|v¥¨©©ª«ªª­«¬­®«¬©£¥¡¡š–˜›š���ŠŒ‰Š†‰‰‰‡…‡ŠŠ‰‡ˆ…ƒ„‡ˆƒƒ„†‡…‡…‚„††„…‡…†‡ˆˆ„‚††…††…ƒ‡†„…†‡ƒ�‡‡ˆ……‡…ƒ…ƒ…ƒ„ƒ„…‡„‚‡†ƒ‚……‚…ƒ†‡‚………‚„„ƒƒ‚…ƒ…‡ˆ‚„��„ƒ†„ƒƒ‡†…‚…„�ƒ€…„†€…€‚‚‚‚ƒ��‚ƒ‚�€~}zwgYH. !"#$()**(%%#$''$$'*58==>?@CHKIDGHGBD@@<;<97665563456::;@@AEHKOQNQPVURSTXXYXVSSUPSZWUUSSRPQUZ`[WYZZZ^_ZUPNORZZ\[_`_]^[]^`bfdeeddffmhleed_^^_`_]^a^[YZ\[`ccecfa__^^]]a_ZWSXYY[[ZWTQQQSXWXVWX[Z]a__ccbeccdddghhecdddbgecliighmjkgddghc^`bfehikaabddcaa`^]`_ZZZ[YVKB=64//44CNbnuswqxxux{zwzuz{usty{{xyx{zzwvx{ww§¨¨¨©«««¬­­«­¬«©¨¥Ÿ�˜˜–›—‘�Ž�ŠŒ‰‰‰‰„ˆ…‡†ˆŠ‡……„†ˆ„…„€�„‡†‚�……††‚ˆ„ˆ††ˆ‚…ƒ†‡ƒ……Š‹„„‡…ˆ†„…ˆ†�‡„„€„‚„…‚�…ˆƒ‡†�ƒ…ƒ‚‡„‚‚……†„…†‡‚€�€‚„†ƒ…††„‚‚�…‡�ˆ…��……„‚„„‚€�‚�ƒ„€ƒ�„‚‚�„€…€„�‚�||ywj]B*! !&(++(((#"%-'%%(+368=A>@CIHKGIDCDCBA;<:;:784123484799>?@CBKOLOOSPRWVYURVUQROPORSSTOONPKNQZZVWWVTZ^^YTNPRUZXX[_ba_[]]]cfbgggffdcikhfha_YY[_]]]^ZZ\[Z_[dd_cbd^^[^c`_][TSTY]Y]XTUTROTQSUVZ]YY]__\cahdjecabc`gdddiihkefkhkihkggd``g_b`ccgddgkccfda`c_c`]ca]ZVZYVIC>855217@;A?EMJIIED>BB?<:;:::44344555798?@??DFLMRKQOQWY\UQRPOQPKMQRPOLMKKJOQTTSTSQWUZ_WURSRUVSS]_bdaa`\[^b`iiifgcgjige_a[VW[][]_\ZZY\[WY`bZ`ac_Z_^`e`Z\WRVZ\[WSVUUPPPSQSY\XYVY[[_`dggkhjhc_^cacikljiiihhgdcigbZ^_a_b``efbbcced_bc_`caaab_[[Y\WRMGA963443:ARbnstuytx{{{wxvxzzzz|{~zxxz{ywuzwwz¦¨§§ª¬ª¬¬­®­®®®¥§¢ž™——–•������‹‰ŠŠ‡‡‡…†ˆ‡†††ˆ‡ˆŠ‰…‚…‚ƒ„‚„ƒ†„…�‚‚…€†„‚‚ƒ„…ˆ…††‡………†…„†ƒ„�‰†ƒ‡‚†ƒƒ…‰�„††…ƒ‡ƒ�ƒ……†‰ƒˆƒ‚�…ˆ‡‚ƒ~‚~€€ˆƒ�ƒ„‡�ƒ„……ƒ‚„‚…ƒ†„„ƒ‚€€€‚‚ƒ�‚ƒ‚…€~~~}|wn]?##%,./,+)&,&'$#$&%)0599>;?DFKJJHEF=;=A;;94:8349334598899>=@@DIMLKNORUYWROOQLQLKKOQSMNINLIOOONPPPNTTYZZRVXWYRVU[\dbdc`\^_bdjjhjdefhfhe`[XVYX^]\^]]\[^XY[_Z[[_dbaaabf]ZVYUXWWVTXXTSRQPRTTTYWVS^[ZZ]ceeimihfa_b`aimiiifiieeeekjb[Z[[^_]`bcd__abbaeca]``cbb\_ZXZZUPJA7651557>M\jpuwvytwy{wzxxvz{{~}|xv{x|xw{z{v¦¦©¨©ªª«¬­«®­¬©¨¥¢ž˜–———��‘�Ž‹�‹‰‰‡‡‡„„ˆ†…„……ˆˆˆ‡�„€€‚†„‚ƒ…†�€€ƒ„ˆƒƒƒ„…‡…„…‰……†�……ƒ‚…†„‡‡„‚……„†„ˆ‡„„„…‡‡‡„„„ƒ…„ƒŠ‹ˆ„ƒ‡�…~€}‚‚„�ƒ‚€�‚��„„ƒ„…�ƒ�†‡…�‚€€„�}†�‚ƒ�~�…„}||vmW<" ! "''./0,--*)*"&%#$+*+378;=@CHJIMICB=?;<;<77476634:697:888;:;@BEIIJLQTTURPKKQNKNOPMOPNLKOLEKKKPOLOQQRV]VVXWX[UYZZ]aadgbacd`gehkicbceeeb\[ZT[[`__`_Z\^^[VZZZX[^`bbb_aea^ZWTXPRTSVYVTRRUUYWWQQVZ][[X[degjkjjiccdcbgkjigfjejghihif]^[]_d^Z]]baa_aaddc_c_`e__Z_YX]YTOKC8:48;:;>FWiqvusuwyw{xtuszuy}}|zuv}{}wwwwzxz§¨¨¨¨¬©«­¬ª®«¬©¨¥¢¢—˜—–•”���Ž�‹‹‰‡‡‡„ƒ‰‡…†‡……Ї†…ƒ„‚„ƒƒ‡†ƒƒ‹‡ƒ€„Љ‚‚‚†‡‡„‚†…‚„††‡„†ƒƒ†„„…‚„‚…ƒ„„ƒ„†……†…†„†„„��‚†ˆ‰†ƒ†ƒŠ‡€�~~€‚€€€ƒƒ�‚�„‚„ƒƒ‚�„†ƒƒ‚‚�„‚€„‚„…���‚��€€€|~{tkW= !! #$#%'*/4,.02..*&((&)('*277=<@@DFINIH=B<9;9;>6777834894::;49:99=EVbkvuwupy{{{{xwvw{{~wrw||~vzz{|y¨¦§©§«©««®®¬«¬«¨¦ª¢™š——’“‘���ŒŠŠ†ˆ‰‚‚†‡‡…‡„†…„†�†ƒ†††„ˆ††„�•…††„…„‚…†‡†„„…�‚‚„……†„†„„ƒ€„‚�‡ƒƒƒƒ‚‚†„ƒ‚†„ˆƒƒ‚‚�†„ƒ†‡†ƒƒ€ƒ‚‚�€ƒ€€€‚€€�„€€ƒƒ„�ƒƒ„�ƒ…‚‚ƒƒƒ‚„„‡ˆ„‚‚~„��„||{slW9"12""#&$!&%,,/2.1543/00)*,*)&*244;;:BFGHJIGB@=>=998577689444889;98878::C??AINOURRNOKKNNLOLKNKPGJJHMIHKMOHLNRSUTWU\YYYYY[Zb`_a`bdbbggdjfdcd`ab`^[[YZX^`baZZYZ^]WUVTVVU[]abb`bbgf`YUTNROQVXXVTWYYUXXSTW\[_\^biegjmmdcgfjgcgiijihiomjmlnga^cba_Z[YV\Z_a^^``_edbefd]_^YXVTVPQJ;65375<B75:879<;><=DINPPNPQKMQNLNNLJMOHILIEKKIIGNPQLTUSRUTYZWY[]`b]_]_abbbcebfdgeb_^a^[[]YXZ_]_^ZXWZYZYRRVSYXY_ddcbd`dd^[XUPLQRTRSSTTZW\ZXTVX[]\^abfcjmjmegiemehmkhjkkkkqilmmic]a`a]ZZ\Y[^bbeb]acahggbab]ZXVPQSNRH<:5002=@CKKUiruvwwstw}{x|yw}|xxwwxz{{vwu|yyw¤§§©§©©«««­­­­©§¢¢ž›˜•“‘�‘Ž�Š‹ˆ‡Š‡ˆˆ„‡ƒ†ˆ‚†††ƒƒ�‚‚…�‚‡Š…€„�‚�„�†‚…ƒ„‚„…‚‚…„ƒ€†‚„„†…‡…„‰‡†�…‚……�„‚�…‚‚†…‚ŠŒƒ€€‚‚‚„„„„��~‚‚€‚€�~€ƒ}‚}€€„‚�‚…ƒƒƒ��€ƒ…„ƒ„„„‚‚~~}|z||tiT4 "#"(("%(,-.00358:>>>1533,*,-377::8674;77:864988C>477578<;:>==ELMMNQONMKOMQPJLMKJKLJFFIJGGJMMNUQQPOSZ[[\\a__]_]^`be``caabdeab^a\]]\]UW]W_WWYXTWYSSRRXVZ[`fhifdbc``bZVPLRRVNNMSVWYZ\\VVVY\^_`ddbjlmmjjhegckfpkmimfikgkokgb___a][[\Z\`daceec[`chkff^[WYXSSQOOIC70,.5;@AAIL_nuuxxvwz{xwx{yyzywtuvyyxyvvsxzz©¦¦¨¨¨©«ª­«­­«¨¨¦¡žœ•˜’��Ž���Š‹‹‰‡…††…††ˆ„„‚†…ƒ†ƒƒ‚‚ƒ„„‚†�ƒ~‚~ƒ�…„„ƒ‚‚�‚†…„‚ƒƒ„„…‡…†„†„‚†‚€…„…ƒ…ƒ†€„„ƒ…ˆ††…€€€ƒƒƒ„‚€���€‚�~��‚€~�~�€��‚‚ƒ‚‚…‚‚ƒ~}‚„ƒ€�‚€…€{‚~~|{{xkW8 !#%*)%$%*//1225:=BKGB<<60,,/276>BCGHLGHFHFC>96736;5;9:79786865456369;<>@EJZjswvxxxzxusz{|xxzswqvw{|{wwuw}x¤§©¦©¦©©«®«¬®¨¬§¥£›˜˜•“��Œ�”‘ŒŒŠ�‰……‡…�ˆŠ†…†„†…‚…ƒ€†„€„„‚ƒ„€ƒ€ƒ‚‚‚‚‚„„€„ˆ€ƒ‡ˆ‚�…ƒ„„ƒ�‚„„†„„€ƒ†……‰…ƒƒ�‚ƒƒ‡„€€„ƒ„ƒ‡��‚‚�ƒ€€‚‚€‚ƒƒ€ƒ€~‚���€‚‚‚�€ƒ€}€�ƒ�€~�€€ƒ~|€~{~|xoW= #($)&##'*./1114=DHOROHB<7.//447<>@EFFNMLIF@<>8:6977;677779655577528:<@>;@E@BHKKOMNKNKLLJMMLJJKIGEEDGEJMMHQOQOOPWW\X_``]]_YY\^a_`][ba__^b`a]_^YZ[XY[\Y[YVVXWYSRSXX[^_agiggd`egd^XSQRRRNNPPST[\YWW[^]^Z[`aa_ffglhefgeigeinljjkgfcfgeeegc^[Z[][_Z^__^bgcdZ]bdcc_ZZ]^VRSONJI=63/,349:@GWfrtsux{~ztt{ysvxwuuuqwwzzvuwxvz¥¦¦©©¨ª««¬ª®¬­¬§¤¡Ÿ™—•—‘�Ž‘™’‰‰‹‹ˆˆ‡…ƒ…‰Š‡„†…ƒ…†ƒ…‚…ˆ„…„„„…�‚€‚ˆƒƒ€„„‚€�‚�‚‚…�ˆ��‚‚„~€‚‚ƒ…‚ƒƒ�„‡‡‚ƒ…„~„€‚€ƒ†€�„€ˆƒ�ƒƒ‚ƒ‚�‚ƒ„�‚…€€‚~€|�ƒ�€‚‚€ƒ‚‚ƒ�„€}€€€ƒ…‚~�}�}€vn];#! &(')%'%((///35;>JT^[ZVME;5.-45:<=>?CGKHMKGAB=42/+/698?ERhnsstw{yzvvyyvwyxxxuu{vwytxyx{x¦¦¤¨¦©¨«¬¬ª¬ª®ª¦¦¢Ÿ›—š—“�’�”ŽŠŠ††ˆ†„…„‚…‹ƒˆ…„ƒ…„‚……†‚……ƒ†ˆ„„‚ƒ……„„„„‚„�…„€‚…†ƒ„‚…‚„„‚ƒ„ƒ€‚€ƒ„ƒƒ€…„ƒƒ€„‚‚„‚ƒ†ƒ‚†„‚…„‚‚ƒƒ‚„ƒ‚‚|€�†~€z�€�€�„ƒ€�‚�€‚€��€ƒ��‚{€}~wq]=!! !!%)*,((&#(,/347?IS]djkg[QC524437;;;>>AHILMFDC?<;;<>?:=;84996874635249<;;<:=>?GECGJEJJNDGCEEIQLKGAFFJIFCJNMPMIOKPSYZ\^a]^ZZWV_ZZ^^[]\^b^[_\]\`aZ]Z]Z_\^WUQVXX[XUUYW\ZZ\aaeebed`\]XXMMRNQSSSSTXYXWW]X^]^]b`cagfd`ca_eeefcmmjkeihbfdbeggc__[\Z[^]Za__]fa^^_][\bdc]\TSRQPRKIE=:31.0:;58COdptuqusuuurwxyvyyzwzvvvtwuz||yw¦¦§§§ªªª¬¬««¬«¬¦¥¡žš–™–•‘��ŽŠˆˆ‡…ˆˆ‡„…„……ƒ‚‚}�†�…„„‚€…ƒ‚†„ƒ‡†ƒƒ†……‚„‚…ƒƒ…„…�†ƒ‡„……Š„„ƒƒ…€€‚ƒƒƒ…ƒ�€„‚‚…„ƒƒ†€‚‚‚ƒ…ƒ�…„…‚‚€„…†‚�~€ƒƒ€‚ƒ‚~€ƒ‚…}‚ƒ�€€~�ƒ~‚~€‚~ypdA!!! &$'*0**%%&*.149=BN\dpzvrfXD=41169:=::;AAGJKFGCCA<=A><9:89;;>99:6852/4?:5;888;:DCGDEEKLKKEGGIKQQMGDBFIHFHILMMMNNOOTW__``a\ZYVVVVV\^Z[_`^\\[_Z_a^Y[[Y[aZWTUT[XZZYUUVW[`]_```cdbc`YWXTOKPMQVUUWXTWXXXVWcb[`aedddcdebeabcffgglnkekieeb^`beb]^\\][_^^^_\`d]X\`c][^ed^YSQQJMRPLC?820.2:?:8DKcmxvsttnvwuuy|y{xxyxwvsuwy{{zyv¥¨§§§©ª©ª««­©«ª§¤¡ž›˜—–”“‘���‰Š‡‡ˆ‰‹ˆƒƒ‚…�‚‚�„‚ƒƒƒ‚†€†„…‚…€„‚„„�„……ƒ„ƒ„‚†„‡ƒ………ƒ‚‚‡‡‡‚ƒ†††„………ƒ€†„ƒ‚…ƒƒ……‡ƒ…€ƒ€†�‚€ƒ„……€€‚‚„„ƒ�„†€„�‚„€‚‚€€„‚‚�ƒƒ�‚�€{€€‚�~�~€{xucJ' !$'+*++*$(&(-/59CFTcs{€€~p]K@60-359966:<@@HGHHICC@>?@?<;8=<==4456347:?AB@EKGNHNKMINQPQHHECGHLJLLLNPNMSMSTV`][_c^\ZTYYWWY_ZZ]c]_^abXZ`[ZWWW^a]ZRWY[XZZZWWUYZ`k^^Za]acb^Y[VSNKLMRTTRTWUVYVTSZ^`abehjcceddffcddcceghmieijggdb_b__`[^[^[[[__c`cf^^X_b^\^^`_[WRMGJMKPD=61-,5:<>:==>>=;;;45/047285356;?ABCFIHHKNMMLQRMPLGHIKJKMKNMQPNPOQSWUX[\a`a]YWZ[T[[^XZ`b^`]^\[Z\YYTVX_^]YXVWZ^\[]]WUQW^h]X\_a__aZXWUTMJKLRQRRWXVSVZRQY\\`bfeheeaebeheab`bcgcjffkhnef`cb_\Z[[^][]a`bdbca]\][\[]\aa_\SSLJIJMJD=41.+-5@A@A?9@=>:2/63553046487@BDAHFGNMNLNOPSLLKJLLKKKQTQTTLQSSUUTVZ^\]aY]YTWU[VWV]`_[\^\XUX\YXVY\^][]XYXW[\Y]]\VSQV[Z^\\]a_]X[XVXSMHORTRUZXXUXZQRTXY^`dgg``daccfc`]_cehfdeigiheacb]ZXZZ\^cY]_eeehfa]\ZZY\ZW^[YZRNRIGMKID::3*().7ACADN_otxusttvquu{y{y|yyywuqtsvtxsw¦¥¤¤ª§¨ª«¬«¬­«¨¥¥ �™š˜˜—š•ŽŠ‹Š�‹�ˆƒƒ„‚ƒƒ†††‡ƒ‚„……†�ƒƒ…ƒ‚…ƒ„‚}�…„�…ƒ…‡‡ƒ‚‚‚‚‚€��ƒ…ƒ‡…†ƒ…‚‚�ƒ„„†‚‚ƒƒ„……†„€ƒ€��€„�„„ƒ��„„|~€ƒ€€�ƒ€ƒ�‚~�‚†„ƒ‚€€€�‚€€€�€{{tm_; "!")(+.-,($%#'*-5=F\ex‰�’“†|gO;.-.00065:?C?C@@@@A?A=A>;837766201582::CB@ABGIKOMJNQQNKNNOHKKOSSUUPLSLORPSUZ_]^]YTTTQWVWWXZ\\[X[YXX\XVSW\\[Z\]Y[[XX]XY\WXXPTWZX]\]`^^YYZWXVQNTTTUU]\WYZVTOWX[^`befc_c_^ac^]`^afccbefcfcbc`^\ZYZ_^\`]_bhgghfa`[UX^^[YZXUROUOHIMPMDA:5+()*78>AFKXfrwuuyvvszxy{||y|zxywwuuuz|wx¦¤¦¨¨ªª§ª««¬ª«¬¨¢¡ž�›œ™—•’��Œ†‹�“‡ƒˆ‚ƒ…‡‡„„ˆˆ†‚†…„‡‚�†€ƒ…‚‚‚€�€„…‚…‚ˆ‚„„‚‚€‚ƒ„„„‚„€‚‡†ˆ„‡‚„„€‡„†ˆ„‚�†…‚„„‚‚‚ƒ‚‚€�„ƒ‚‚ƒ�ƒ‚‚€|€€‚€‚}~€€€���}~€‚‚‚}ƒ�‚‚����€‚~~wscC#!#$''*/-*+$$")*07DQbq‡�‘—‘Œ€oW@4/./2/46;<===;?>BB@AA??==>?CECCABCCA?8776=:6343325?AA?:@CJKMKOOPRMNKNKKLMRRTXRRONPLNOTTX[Z[]ZQPPSQVWTUVZZWWZYY]\USV[Y^^_Z]]Z[SZXYTZY\YTVYYVXY[_]ZUUXXWRQSTVVVZTYYXZWWVYUZ\Y^aeeaa^^]b_]^bce^[^^cb`bbab^aaXZ[^[_^abghhiifa^XZX\][VZSRSSPHKNNPID>1-)&(/66>?DN_kruuvwsuuuv|u{wrwz{|yuwywyx{¥¥©§§ªªª««­«ª«§©£¡œœœ—•–“““�Žˆ�ŒŒƒƒ„„‡‡……„†�Œ…ƒƒ‚�„‡�‚€ƒ†‚�€€‚‚ƒ„„„……‚€}�…‚�…ˆ„�‚„ƒ††ˆ†‚†��‚„„„‚……„€€‚ƒ€‚€�‚„‚‚ƒ���‚ƒƒ„Š…}}�~�ƒ€~}~…€ƒ�~~‚‚�‚}ƒ€�}�ƒ€‚€€{|yuhM' "'*),-)')"#%),5?JYhw„Š”•–’�„w]D7*+-/4687:669==;@@A?@@?=<>EFBBEFEBCAA8:69<8623./26;@=A@@@>A??EGDEFHICDC>=:;:>8:40./157<=?=@CAHJNKNFHKKLNSMNORSY\UQQPOLOQQQSQUV[RJJLOKMORSUVPUSWRTWSRUSTSYX]\\\SWRTTSVW_ZZ\XUUVWUXZWYWVTW[TTUYXY\\TRVVZ\ZZWXUXVX]]ceb[`b_YY\bb[[[aa_aYZ\]acbca\^``^bacfiidebgd_c__ZXVTYSTNLHLNMIHE;.++&%(+,2<>EKaksuzwuvsv|xvuzyw{xvyywwtwv}¤¦§¨§©¨ªª©««ª©¨¥�¡šœ™•”���ŒŠ���‹�…„„ƒ…„ƒ……†‡��„€„„ˆ‹…‚‚�‚‚‚�„‚€‚„…„„‚‚‚��€„ƒ†„€�‚�‚‚……„…‚ƒ‚}‚„�ƒƒ‚‚ƒ€~‚€…‚€€„……„€~€…„†ƒ~ƒ|�‚…€}‚€€‚}‚‚�ƒ€~�~|~€{}}}{u]> $*+//./*((&(*3?ITgvƒ‹“•˜™—‘�|kM<,.0.4331111:::=<>>?>@???BBGGDCHEHGC>?<::;>:30,./467><>;?BEHJLKGFJIJKOPMRSSVZYTOQMNNOQRSVTVUMJGHKKLOKOSTVSTVVQSRQQQORY\WXXZVTRRSRVY[^[]YWWXUUVXXUVVUXXRWYZ[]^[USXVY\[\]SVWWWUZ]b_]`_^\YY\]YZ_d\`\XX\Z^``ca`]^^`a`chgfaacddfab_]\VUTTSNKKOLMLGG;0-+&'(*%19>ABDGEDDDEFFDA@??;>:822,12/27<<<<;>ADLLKHFFDGHQNNPRTYWXVRONKNLUWWWVUSKIEGLJKKKPSTRWVUTOOSPNONNX[WTTSTNQSVRSVYYY\YYWUUSVZZQTU[WXYV[X]ZWYVXXTY]]\WRWVUUVVXX\]Z]`^WZ[ZY[[[[[[Y\Z[]^]^aaac\acc`ghh``bcbde`^[\]]UUROLJNKPOKG84*+&$())+3:@KSfmspsvvztsvx|zzwuz|vzuxwwvw¥¥¥©¤©¨ªªªª«««©§¥žœ›™”’’”��Œ�‹Š„~ƒ…‡‡††„……ƒ„…‚ƒ‚€‚��‚‚„„†�„†‡‚„„„…ˆ†‚‚ƒ�‚‚�„‚‚„�†…ƒ„„„ƒƒ‚‚|€��€ƒ‚ƒƒ„‚€€‚‚„‚ƒƒ�ƒ€�ƒ~‚€‚�ƒ„…‚~‚„…€€€ƒ‚€|~�‚‚€‚‚}~}}€€€}}~}ys[5%$&(,.//-...,:BP\ix‡Œ�——˜š˜““…uXE512737:5.123747<;:=>=>DECAACBDDFBFGD@?<;8:82/0,-05264748:>DBB@>DDGGIDGIPOOROIJLNQRTQTUVPKJFDLIIIHKOLHMKLMMMNNPIJKMQRUWWTQMORTRQQRRQS^_\XWWZZZX][ZSTQWTWWWUTWZY[UX\]ZUWSWVQRUUUWT][X^_\XXTUWWWTSYWWWS[ZX\achddeghf`aca[\_a_]\[XRKKKIIPKPRQRH<0%%('*)$ "%1>EMajqqrzz{zwuswtxxyyvvywywzz¦¦£¨¦¥ª¨ª©«¬«ªª§£Ÿœ–˜˜›˜“˜•ŽŠŠˆƒ†‰Š‰„†��†„ˆƒƒƒ€ƒ…€…†‚‚�€‚„„…„�……‚ƒ�„‚…}ƒ€€‚„‚ƒƒƒ„�ƒ�‚€…€�‚„…„…��€‚‚ƒ�€€„€„‡…€‚�„ƒ„…ƒƒ€‚„�ƒ‚€����€�~�€�€„€ƒ~~{{{woZ3#$$'(,++-3157=>@B@CABDCDHCCCC?>==;661.-0/161220449:;;A@ADCCFFFIILMQQKIIKLPPTWTUQNKHIIJMHGGHIHIHJJNLLLKMKLIEMPQQURPONTQRSQSWQOXYZYPXYWXXY\SUQTTRUXTNVUVUXTUUYZWTVXVUUWVVTVVY[]`\\ZXUUWVPRWTTVYZVZ\^`]b_cdedc_d_`]]][]U[XULHKKNOIKSQPL???A@FFFCJHMJLFIGKOQQSVQNKOIEGHJGFHHHIJFIIJNLJONLLIGLLOPQQROPPOOQPQRQPSYYUOWU[STSXTUVVTRUTTQPQPVVQTTXVSWUUWWYXPUQVX]X]]c_XRSTUSPPQTWWY[Y\_[\Z^`aadeea_a`[Z]Y[UYZQOHHLPNLNPQSKB0%%%)&(&'%(-4=ENanwwwz{vuywwwwztuv{{wwuz|¥¥¥¦¦¦©§©©©ª««¨¥¢¦£›—˜“�‹���Œˆ‡……ˆ…‡…†„ƒ‡€��…ƒ…€ƒ€‚‚„‡���‚…�ƒ€‚ƒ€‚‚‚€€~�‚‚…ƒƒ�‚‚‚‚ƒƒ‚ƒƒ‚„†ƒƒ„…€€‚‚€ƒƒ‚„�ƒ€€€�ƒ‚€�…�€�‚‚�€�ƒ���‚ƒ�ƒ‚~{�~�ƒ€�z|xueR-"$"&#"+),489@GS]hz}‡‹��•™™š—š˜�ƒoV@93841,035412.45455789;=:>DB@DABIKJGHKIMMRONLKKGGDFIGGFGEFKIGJJLKMLLNNMKDKMJLPPQQQMNNLOOOLJSVTSYVTVSQOVQUWUVTRWRSLLQNSQRTWQRRUUZYXTOPVWW\\\]``XSQXQSPNSVZZ[W]b`Y[ZZ_`aa]bb__][YZWWXVSOLJHNSSROQQOHB1('(()+)),,,.8?I[lsuwzwwqvxx{ywuuwwwvuv}£¤¥§¦¦¨¨¨ªª¨­¨¨¦¦ �›—–“’‹����ˆˆ…‡ƒ†…‡†……‚~…‚‚‚ƒ�ƒƒ�„€�€�„„„‚~‚‚ƒ��„ƒ�€‚‚‚‚‚……‚€}€€„‚�‚‚�…ƒ‚„ƒƒ„€„€ƒ€€„‚��~~‚‚�…�€…„‚ƒ€€�‚~‚ƒ���…€‚ƒƒ‚���~‚‚||wzm\< "##&%*.3;>DKUbhuƒˆŠŽ�–˜—™›˜˜’‡sXC95863505252324353:666::;>AC?AABBDEDIICC?A=;<9640/2(-.--,--31247:<;>AGB>:@DHJFFDDFKKOMKNLJFBHHFGGFCFFILMLNNKMQJKLMIGNGLLMNOTPLKKONOIHJQSQSTVQSSPQQTWWQQSUSQMMKNQNPPVVPQOQUZZTRRQU[ZYZ]^ab[XWWXRMRU\Z[YZ]_W[VZZZba_]_bca^VYWXVSQQMPLMMVVXTPQPKB5)(+..**,.-,(38DRfnsvz{xuyvvx{vzuzvvxxz{¥¤¥¥§¥§¨©¨ª«¨ª¨¦¡¡�š˜–”���Ž‹‰Š‰ˆ‡ƒ†€…ˆ†„ƒ‚€„ƒ��„‚„ƒ‚�}ƒƒ‚‚‚ƒ„ƒ„„ƒ�ƒ€ƒ„…‚}�ƒƒ€ƒ…€ƒ€€€…‚‚€€€‚€€…ƒ€ƒ‚€„�„‚€~€€€�ƒƒƒ€‚€„~‚ƒ~€€€~‚ƒ‚€‚€ƒ„ƒ‚�€€‚‚€€€{}zzsgG)#" !#%)07>DIMV]hu…‹Ž”–š˜—››–‘Šw[B7545344661246.437;3762:;@DC@EA?DFFFBAABDA@::68423-++*.+*0.212156<:@EEC=:;;:>;=@?BDBCFIGKIMNIFHEEFFKJKJJKLQQPOOKMOMINIFFCDFIMOLOMLOSMLHCDFNQOLJINNMMNOSWRMNLKPKIJNLSRQUSVRRXXYYTWWYVUWWTWX^_^_\]XSUWYWXXZ[[QY_[^^`_d`_`eZUWWXTPSWYPOORRRVVVRTRNB:,,.00..),.,,,-6FVepqxywstvyvwuyuty{{v|}u¥¥£¥¥§¥¥ª§ª©«©«¤¤¢¡—š—”��’�Љ��‰ˆ‡…„‚„€�‚‡†�……‚‚��~ƒ~�‚‚„�„„„ƒ…‚ƒ€€~‚€‚ƒ€�}„„„�†…ƒ„ƒ€…‚ƒ�~‚€�ƒ……ƒ‚€‚„€�����‚„‚‚€�‚€‚€€€�„€€�}€~€�~~�{zuiM0! "!!%(.7DQ[]\^djrz‡ŠŽŽ•›™—š˜–‘Œx[A52310378::;423697793356<@A@>A>=?C?BCB>?@A>==<:432,,))'$&&(&(.(1/./8;<:8598799Qamuuzxqxyuuuuwwsvzvyy|v¥¤¥¤¨¨¨¨ª¨«©ªª¨¦¢¢žœ›™”�‘Ž��Œ�Œ‰Š‡ƒ…€„ƒ€‚‚‚‚„…€‚‚€€}€€€�„†ƒ…€‚‚„€�€����€€ƒ„ƒƒ„ƒ�€‚…„‚„�‚‚‚„‚ƒ‚�ƒ‚„‚��ƒ}ƒ€‚‚„€‚‚€€€ƒ���~�ƒ�~€}~‚€‚�€€~~|z€zzs^B'" #&)09IZgdhgklpz†Š�‘“•–š˜˜•”Žz\@1411348=877445683903358=@D>>;<<@A=CC@A<=AA=>=:61-*)'''%$$%(*-.,,+/09?63474585<>@>@>=8=?BJLFD?CCIGKIFDDEMOPPJKMOQMKHFIDA:>FGQRNORPMJGC<>DKHFIEGIILONMORPPJJPMMOILLOUUQPPRWUXUQUWRPSXWWUXY^][^_^[UXVWZ\ZZWUZ[`]``fe^`^[[ZWRVRRTZ[ZWTTV]XTQXUUNG;4,0000.011:H/,->Q\msx|yyxyyxx{zxvxuvx€xy¦£¦£§§¨¨©©«ªªªª¦¢£Ÿ�›˜“�“�ˆŠ�Œ‰Š‹‡„ƒ……‚€ƒ�‚„‚„}‚ƒ}�‚ƒ}‚‚‚„…ƒƒ‡„€€ƒ��€„ƒ‚�€ƒ}„€„‚€€„‚ƒ…‚�€‚‚€‚€��€‚…†„ƒ�ƒ‚�‚€~ƒ‚�€�~€…€‚„{€€€„|||}�}}||}~xupP3"'*+0?S_jquoopsz…‹�“‘”™™”——–ŠxX@73231267:82709777735379=@@@99:=?>;A=;=;==?=:830,+(()%(!!"),11/11.17951224/,14845831247>BCDCAABBCBHGEACEGIHDGHJLHGDIHFA@DEHJMRTOQQNEF>ABEEHHKHJLNIHMNQUUROMKGLJKPOQOQPRUYYZSVVVQTTWXUQUTZXY[]_ZZXVYWYZZ][UZaZ^acdb\XTYVROWXX\_`ZZVVXTV[RVYUPE;753::83631/136>DN^htuz{uzxx|||vyzztvv{z|¢¥¦¤§¦§©©««ª««¨¢¢¡ž›––““��‹�Ž�‡ˆ‰ƒ†………�†„„‚€‚ƒ‚~€€€€��ƒ�ƒ�‡„„�„��…‚€€‚ƒƒ�€�~�…�€‚�ƒ‡�„€ƒ€‚~ƒ~€‚‚„…ƒƒ‚��‚ƒ€‚�€€�‚€||{~€‚‚�‚}€~|€}|z~~€€{{ywmV2$%-7DObq|�‚}yzzw‚ˆŒ�—“•“–™–ŽŒx\F711-345<989575777753:<=99:::=@>?9::443.,*,(%$"%$%,334300.5852/40../342250-..3:@CAA>>A;=97555;?GNO^kruvvwuvzz|vwxvvsvtwx{£¥£¦©©¨§¨¨ª¨«¨¨£¢ ››““Ž��ŒŒ�‘‹†…ˆƒƒ€ƒƒ…‰Š…‚‚ƒ��}�ƒ~„€‚ƒƒ…‰„ƒ„�€ƒ‚‚‚€€€„€‚ƒ‚€ƒ‡ƒƒƒ€€‚ƒ‚‚�€‚€~‚‚„…‚ƒ}ƒ‚‚��‚~~�‚„|||~�€~„�~€}€€€||{‚€€|}}}€�|y{ugH,  $+3:HZkx€††„€||ƒƒŠ�”–“”——–’ˆx\?6000/29:;;=7;6978566:;8678:=A?>CDAHGC>@>?:954554./*1((&$$''.14322/0574525/.*0001/030..6;@C?=;>=@@AADFAGCCHLIGIDGEFEGDDGGBDDAIGMQOTKIIABBBIMKLDIENPMONQTQQLMHKJPMLQQQQNRQXZWTUSTNKQQRWXVVTSQW[ZVTTQVZRZ`aYSZYZ`_^^[XSSRTQWZYZ^^WYVVPMJRRTWXYOE8/26:@CA<<77=@HNPT\gpstwtwzy}vwyxvwxuwx{y¡¥¥¥¥¦§©©ªª«¨«¦¦ žž–”–‘�����ŒŒ‡„„„†„�‚ˆ˜�‚„‚„„‚�€~~‚���€ƒ‚„ƒ†ƒ€‚……‚ƒ‚€‚ƒ�€‚€‚‚„†‡‚ƒƒ‚€€��€ƒ€��ƒ……†ƒƒ�€€€‚€�~}‚‚~~~…€ƒ‚‚‚€…~||�~�{~€}€|}wq_@ $'+6>Qcx€†ˆŒŒ‡ƒ€~€ƒ‰Œ�“–’”“–�‡uW@:/.-+47=??::;>:;:48975029:8IJE?=:50,,-06=@>;9999202559;CADECDJECA=?<98823101---'('%%*,218:7357776;930..,0--..42./1349;;>=<@@DFAFDCCDCHLJIHGFGGIEGEDGEGEKJCIMIHMFB=>>@DKIE??CJNSRRPQRPHJDIIDEJNSRPPRRSTTSRPLJKRMOVVPKMKQRPRTPOTQSXYYZXYWVZY[XXTQRRSPRW[WSSWSUPKFFNNNQQQKE=1347?DKKFA9:;@BDDGGJDA@?@;442300/1,(+%'$%*-36;;99657:<>4410/3-2/344//+/-259ADDBCDECCIFFHFGJNKIIICDCHIFJLEDILKLEA=@>BFDFEGEBB>:853020112+)'''"%(+5=7@>;888<7>95401/0/26443-,*,/55;=>77=?BBCBEEGCDEHHFGNOOJHHFDFJIKJKFCHIHLHAA=?:?CCDAA=EIMROMMMOJFDDGE>=GLNLPQPNRUSPMHEFCGKPRLKIHILLNPOQPNONUXWORNLNRRSVSRQVVSRUUVUSTSOPPHIGFLOMMKE>3//756;=DEGQ\elsvvxyuxsvutvw|xv¢£¤£§¨¦¦©©ª¬©¨§¤ž ž–•–‘����‡Š‡‡…‡‡ˆ…‡„‚ƒ„„€„„†€‚€�€~„€ƒ‚ƒ‚ƒ�‚‚�„„ƒ€€‚€�}‚��€‚…‚„‚„„‚�€€ƒ~‚‚‚‚€€��‚‚„~�}��‚�€�‡‚€~~�~‚€€|||€�}}|{}|z{{yjU0  #*6>K^m…�”–™——•Ž„�€�‡Œ‹��‰‡‚zs`K;//,,/03498?@GIGC>>=;324376578A?BDEGFFD?=678502142,.,+(&&',3;;@@;=;;<=::=;86441236623,*+0027;<529=BDGDCFGGCDDHNIHOSMLJIFIIJNOPLIFIFLNLID?>:>EAGA?;BEJQSQRHPGECEGE??EHGLNQNNOOSKLJFDCDMMMJMIDGFJJJNJMORMQVWQNMMNOOPSROMWTXSPUVTNPUPOQLLEGNPJLE>=30465327689;<9<88>ABDQ^gtrtwsusursvuxvvv¢¥¤§¦¤§§§¨ª«§©©¢¢žš˜•–”���Œ‹‹‡‡Œ…†‚†……„„‚€„ƒ„�‚€ƒ‚~�|††„‚�„‚‚�……„~��ƒƒ‚�ƒ‚ƒ‚��€‚�„€„€ƒ€‚�ƒ„�‚€‚ƒ‚‚€€‚€��€‚„…‚|~€~‚€€‚}z|~€€€}}~}||~vraB"     "/7DUbn|ˆ‘———›••�‡ƒ��„…ŒŠˆ‰€wqdVB52--/.*.348=GIHGAC;:844537:36;>ADGFFIFD?:95573/004-0,+)(%*,3>>FBA><@@?=@A>>;95566:653/(-0415:4319>DCEEECHHBDCIJJHLMKOIMEHJINPPNNNIIMPRNI@=;=DFGA@>C?INOPSJHGFEGHEDA>AFHJQMMMMNOQJGB?CGNJKJJECACCEHKMOOLVTSMNQOLLNPQPPMVWWVVTTTOQSRMNIHDFRVNGC@71347720//059;7864;:;@FWglwtvuxvsswv{uwsx¢¥££¦§§§ªª«ª«¨§¤  š–—”“�‘�‹‹‰…‡Œ……‚††„„……ƒ‚ƒ‚€�…‚‚~ƒ€�„‡‚€ƒ�‚�ƒ†€ƒ�ƒ€ƒ€‚€~†‚‚†ƒˆ�ƒ‚€€ƒ~€�„�‚‚€€�‚ƒ‚‚���}~~€~�€����}~�‚}|~~}€|€}~~~}xvlQ(!'-@MZer€‰‘—š—›˜•’Š�~~�„„…‰ƒ|paZK=3/-,*(+-278DHLHCCB?;555556369==C@CAKJJC@>65:76/240--,.,%,/08>GEDB>=B@EDBHBA=>:87=>:860.033768223:BBHECAFEJHFDGJHHKMJLJLDCFLQJNLPMIONORSLC>?=EHIBDDCCCFJNRKGGDCEGGGDACEIKOOLORMNMWIB?DGKOJJABCCAAAFHKOOQTTRNLLJHKMJKOLQSTVRUUSSOSRSMOHFHIOVLGC<94877600,-/2162433159?CR]iqsvvwuuuwzusqs{¤¥¤¥££§¤ª¨¨ª«§§¢¢š———“‘‘’��Œ†††‡†ƒƒƒ†ƒ…„…�ƒˆ‚€€€‚ƒƒƒ�‚�‡‡…‚‚„‚‚„…��€„€‚�‚‚‚‚ƒ……†ƒ‚‚€€‚‚„€�„‚‚ƒ‚„€„‚€�~}‚€‚~��„‚�|�€‚�~~€|~}ƒ€‚}ƒ||~~wp_= #,5BO[eq„Ž“™šš™™—“‰�|{y}~�ƒ�uhVOG:.-.+&)++48=GJJGCDC???;:3551899=?>?BHIGF@=87575230..*-+(*,03;EGIA>A>ABBCFMONPQNLMMGKKKKIJFJNPWSQUWRSSQQSQNJIIFOQMIC>:569724.,///././4.//37BJW`quyuvxyxvxxwurx£¢¤§¥¥¤¨§¨ªª¨§§££›˜••‘“�’ŠŒŒ‰ˆ…ˆ†…€ƒ……‰†‚…‚ƒ€€�„ƒƒ��€„ƒ‡‚�‚‚€‚…ƒ�…��‚�‚‡ˆ��ƒ…†ƒ‚‚‚ƒ„‚‚€€�ƒƒ…€‚‚‚ƒ‚‚�€~��ƒƒ€�|€€~‚‚€‚�‚�|}�„}�~|~|{wfK( !!'.@BJJHEBDBC=?:7637668<=EHOKIFFCC@989::976::72683557:=EJJEGCDDHFDFGEGNJKNNHGCJIKMNOOMPLMLNPNNF?@FHNPJJEACABHOOHIIIGEIFHDFLFFHNPSSMJKJKEC@?AI?B=>>@B@CCIIOLNKOOLLFHLLLLICEKNRRWTSNQURPRNJHKKLOQNIB?<5:63400,.-.(+,-/2,-.4;@K\hswrtvwxxxxuxvv¤¤£¤¤§§¨©¥©ª¨§§¡ �——–”�’‘Ž‹ŒŠŠ‡†…‚€‚‚………€‚‚ƒ€�‚‚ƒ‚~€€…‚‚„€���ƒ…ƒ��ƒ€„‚€€…†…�„ƒ„„��~‚ƒƒ‚€~‚‚�€€‚‚~ƒ„ƒ‚€��„€€��ƒ€~€~|€€‚‚€€ƒƒ~€|}‚€�~z~z{xoX3  ""!+/:EO^kw„Œ”šš›ž—”‘ˆ~vnkmptyveUA;3/*(*('((.8=BCFIGGCDEB@>887756899@BC@HEIB@=86543.303./+.-)*38=GE?><7@BEHKKGIIGF?;79<=9;<=;88795738;CGKFHIDGFGFCGDAHJILLQHEIHILMLQPNMOPMMPNNFCACHJPOKCAC?BDINJKJHHFFMIGCCFEIPVSQOMIIJHC@???@?A=?CBAFEHOMKKNIPOKHHKLJLHHFLPQVUURPRTSRIKLKKLQTPPGC;;774330..-+.,((*/-./*067FU`oqqrvxz{xuwz{x¢¤££¥¥¦§§©¨§ª¦¥£¡œ›™”�’‘‘ŽŠ‹Š†ƒ‰††…‚„ƒ†‚‚�‡„„€‚‚‚ƒ€ƒ�…~…‚€‚ƒ„„…ƒ�‚‚‚…‚ƒ~‚€�„ˆ‚ƒƒ~‚ƒ„€��€ƒ‚€ƒ€„�‚‚„€���‚€~~€~}}}€‚‚��ƒ‚„‚€}}}€‚}}{{x{{tiF#  "! #$.3:EPYhv}Œ–˜šš�™–�‰~sgeigimiXF>3/(')$(&'(+4;B@EEDEEFHDB;=;8978;?>::855688?BBABFHEHLKNMLKOSNIMJJJPKLMLOSTVSTUTRQQOMMKONRTRMKD?;5162230*+//+.++.1.,/116=GXgqtrtxxsuuywzx¢¢¥¥¥¤¥§§¬©¦ª§¤¡ �š˜•”“’��‹ˆ‰ˆ‡„ˆ†ƒ†…†ƒ‚ƒ‡…„�‚�‚„ƒ†~�„„„‚ƒƒ€€�…„„‚ƒƒ�„†…„�‚€€�†ƒ†‚ƒ‚€€ƒ‚ƒ‚�€„€„�€~€ƒ‚‚‚€ƒƒƒ‚�€€~„€€~}~�‚€�‚„‚‚€€‚|{{|{xq[0  !## "&,2>HKUdr~Š’™™š›™•�†yne]][]`[M@5.*(('$%"$(/4;;@ABGDHLHFD?@;=<::??@?ADFIFAC?<;85654722+/0--//49>C@965;@>AGJROPKHDAA;@DD>==?@>79898:8=DHIHHJGGDIKFFCILIHOMOMKKGJGOURQSNHJNNLMKNHB@EPQOJEBBFFCIJHIGLHEHKKHBBDFHNRTTTMHHFIHD@=:;A=@@BEJKGHMQOJQMQQNONFIJLNONSPOPVVVTVOUXSQMPRRQPONMG?81001341/025./-*.//.1/.15DVcrsqsusvxv{z|y£¤¥¤¥¤¦¨¨§©¨¨©§¢¢ž�˜•“•‘�ŠŒ‡ˆŠ‡‡‡‡‹†„…ˆ……………‡……�‚‚‚�†‚ƒƒ†‚ƒ„€‚‚ƒ‚ƒ‚†ƒ‰‘‡‚†„‚…„��…‚��~‚€ƒ�‚€‚€€„„…�‚€�€„‚€€‚€�~�€|}~}ƒ~€‚‚€|‚}€‚~~}{{{sbB!  !")&%*-3>FNW_q‹’–™˜›™—�…sh^URRQNLA8-+%('%%$"*,.57<<>?GGLNJHDEAC>?<:<=A>@BDFC>A=<<675774451-2-/+.58@?=<588<>AENQNJKME@>>@@BC=>@><799=;>==GHGHGDEEHKGFHKGIDEJOMMOLJJNNPRTMPGKLNIJLLGCECIQLFJADFLCHJHJLEHCHEHGGGFJKKTQUUOJGGLKHB?=>??A@BGLJHJQOTQUQONKPMIJINONPRQMNUWWSUPRVSQQQTPTMMPID>60/2.9751462330-,..-//,,3>N_mptpvsxwxwxzz££¢¤¤¦§¥ª¨¨©©¨¥¢¡��™–”–‘�ŒŠ‹ˆ†………†Š‡ƒƒ„‚„ƒ„„ƒ‚„‚€�ƒ‚ƒ„…�‚ƒ…��€‚�ƒƒ†ƒŠ‹Šƒƒ‚€ƒƒ€�‚‚‚}�‚�ƒ€€€}‚ƒ„„„€€ƒ�~‚€�~€‚‚€��~}~}€~�€}€€€}�€|€|~€}~wnR/ $#!%,17?GMSbo{Œ‘˜–�˜—•��p]RJJFE??8/-(&)(&#$*0.-259;:>?=<:<;58866344/2,/,.1:>>;8646;=>DLNLINGD?;@@A?AA@;=@9:?>==BADFCEFII@FFIGGIIHEIIHNOLLJJKLNQQQMLLKIJMLNIBBCJLIEHFGCDCICGIKGCFHHGGKNNOKRWSRQPNGJFJGFB=>CAABDGHKGQQQQQRSOMJNNNINLNNPRPPSZW[WSTORRSRTSQNRQNPE70/.1/6452537223.,)+-0/,,0:K[iqurvyy|w|zwx££¤¥¥¦¤¦¨©¦ªª§¥¤£Ÿ›™•–“��ˆ‹Š‰‰…ˆˆ‡‰„……„…‚‚��ƒ…��€‚‚„€‚‚€ƒ€€}€ƒ‚�†„‚…ƒ…„‚�…�‚‚��‚€€��…~‚�~‚€ƒ€„……|ƒ€€}€‚�ƒ€ƒ�~€€|€€|~�~~€€}}|}|sgA#!"),7>>GMXbp}‹’”ššš›–Ž‚lYLA?>:62.0+**(*$&&),(,/448>CIOQOJHKIFB=>>;><@B@=;==><9>=:=:75665331-/,14==:6844::>?BHQLMKCB@CDBC;A>@>@>?>=?@??@ABDDEJKGDHEHIIIILKNJKOKNLILKLJOUTTPGHLPQNJD>AFFDGGGEFDGDIDJLFEFHGEHTNNPPVYUTNNRTLHMIGEA=DAC@@HJMNSRNPQPOPKGMMMMIHLJMQQOT_[^ZRSQQQPPWPRQQSRNG:3-.-.4:30028523-,/..20+*)3CWdksqtvxywt{wy¤¥££¤¤¢©©¨©©©¦¦¤£ŸŸœ——�‘Œ‰‹ŠŒ‹‹ˆˆŠŠ††‡…‚ƒ‚~€ƒƒ€�‚~€��„�ƒ‚€€ƒ„ƒ~|ƒƒ���‚ƒ„��‚€€€ƒ�„€{€€€‚‚‚ƒ€‚€�~ƒƒ~„‚ƒ„„ƒ~�‡„|€€€~}}ƒ{~}~{}yzmX7"!#%-1=AHLZan{‰�—š˜˜˜”Œ~hUG?:73-..).'),)'$$'+*,//0;:CHSOJDDJGG@A;=@::=<:;8:><<===:;9924574300-015:>=974478:AAGNOMED?BDJEBB=CDDAAA>@AA?ABCADEHIMJGDFGKKKKMQNIKQOKIIOKJMOSXTNHELNLMJE?ABBGDCEEFGGDHHCJIDFIFJKNQPRSXWUUQOQVQNPMHIDCBE@GCMPLITSROQKLMNJKKNICJGKMTRQYWc^ZTWWVVSTUUPTSVJKC62,++-2652.25321.0-.-.1*(-1<99;6;><;9;@<>>792225333,.604;=<;:669:8:@EIMOC@>BMHJE@BBGCDDA?<@CBB@@CFEIJMHGKCFHPMRSRSMKPNNNMLIJKQTTTOKJNIKJKDB??@GDGHFEIDEIGHGIGKMJHMLOSQTSUUQSTSUTTQQLKJEBHHDJMPNMPVRPMKKILPNNJDFHIMSWTV[`^^UVY\VXWUXYUTTOODB9.%)+-/.410158203-.(()/))(28GYjtrruxstnxzu££££¥§¥§§§§¨©©©¦¢žŸ™•’’��ˆŠ‰‹ˆ†††‡…‚…„ƒƒ†ƒ~}�ƒƒ€€��‡†�}�„~}�‚‚‚€‚€�ƒ€„„�€„��€ƒ€€€„�‚�€}€€‚}���~ƒ�}‚}���„�|€~€�}~~{|}{}~�~€~~ywk[8" !("(.4?ANRXaoy…�•™›™–•�|aJ=40.,,(,...,-(+#$$&(*.,,5AGJNMGDFKKG?>@BAA9:789=98779:@==;66174331/237759;;455779=;DLLGE@?BGJJGCDDEEEDC;B>@A@@EDDIIIHJJJHHKONRLNMOONOTOOIGFLNRRTNLPKLHIEFB@>GDDIFGIFJGHKGHHGILHHJPQTRRRRROTSSSVVRPRMLLDGHDGNQKMPUSRLLJIJNLFMHEIIOVTVT[_^XXV\^XYVV\YUPPPKD>9.*&(-*.420234452/.)*(--,**5CYessuwwwrsv{u££¢£¤¥¥§¦©ª¦ª¨§£ žž”–‘‘��‹‡‡ˆ†ƒ†ˆ……‚‚‚€……‚~„€‚|€ƒ€ƒ…�~‚ƒƒ€€€€~€€€„†‚‚~€ƒ€‚ƒ~€€}�ƒ…€€€~ƒ�€}€€€�„}‚�€}{‚ƒ‚}€}ƒ�~~~z~|€}€~}~�~~}zsdF.#*/68<7:::59598<:>@<;88263201033675:42473699?CKLID=BCIGDGGECCCBB>>??>>?BEHIHJIKJGGFKONNOIOLKTOQTRPIFFLPOSPQQMNHJEHC@@CBDDGJFGGIHGMLFIJKKGHNNUVSPSTOLPSTXYSSSPOLLIMHGLNQNJPOORJLMKKMIHJGGJJPSYWWX]\XWW[ZX]WYXVSRROF=:5+*&'+,*2030014331-,)*..-*+1ATbmssvvxtvuvw££¤¥¤¤¥§§¨©©©¨¤¤¡¥ —’“’’�ˆ†Š‡†…‡…„…ƒ„‚�€ƒ€…�‚€}€€~ƒ�€€€ƒ�€��‚ƒ‚ƒƒƒ��}€…ƒ€�‚ƒ�€€�ƒ€����€�~~��„€�‚€�ƒ…€€{}€‚‚~~€�‚€€~||~€‚€€ƒ�}}~vp[9$$)/6>CKSZ^iw„�“™™–™“ŠzbE5,,0115464,.+0&$)/+$#%*08:=;=::554/3337556557131278:=EGKJDAABDGIIIMLIEIDJINPKGLOMNPSSNLIIHLSROOROMIGICFECC??FEGGEGIHCFNKFNILFHNOUTTPOPOMLNTXV[UVOQSQOOMLKMPPNJINOOKLMKIIKGGFHGNNSZYWZZ\WX[\Z^^VXUYXVSNF<5/%%'((+-3/-31.,/24/.+/,,.++-9L_nsvxwwywyxw£¡¢¤¤¥¨¥¦¦©©¦§§¤¥¢Ÿ–•““‘�‹‰Š�Šˆˆ…„ƒ€�€‚‚€ƒ‚ƒ€‚€‚z~�„€€€�‚€€†ƒ‚}€�‚�€‚ƒ‚‚„„ƒ��ƒ�{‚‚�‚}€„‚�~�ƒ‚€}‚‚„€€�‚|�~€}}€�‚}|€|‚‚‚€}€}�}~xtgM3!!).7;>IQU]hu€Ž”—˜˜—”�{dG52.,3377361/.+('*/* #%-489721278=?=;59316444756665632137=;BJHID??DEFEGFCGGD@@C@CAC?BDCCKHILMKGGEHINPKKLNMNPURNKIHEKORNNRMOGHEEGGGHAEGFLGCEIGGHNJINKIIMNOVSUNORORNQVYYX[QQSTURMNPNQNOOIFGQOKNKLHHLIIGGHMNU\^X[^[[ZZY]b]UUUX]ROQD82-$"%+*((11++11+-01-//22.((+,6CVcpwwsuuwxwy¡££¤§¥¤¥§«¨§«§¥£¤�š˜—“‘�Ž‹ŠŒ‹ˆŠ………‚‚€�€‚‚‚�}„…�z€}‚�€€‚}}ƒ‚�~~‚‚��‚‚€€‚„‚„ƒ„ƒ€ƒ‚€��€ƒ„…€�‚�„}�‚„„�€‚€€€€|z}~ƒ€„€�~}||~�‚‚~€}}}}}{zwr_B- )/3;>FJQait~Ž’š—™•“�|aI?52025653501/)($%%)' (/96::;563014A>?;9;;8776273856687721189;DFIIBB>@BEGFGCDFFFDBBCBABDBDIJHEKKHJIOOIKMLKKONSOQQMILGDEPSSLPOIDGEBGEGBBDGIGFFILIHJJNLKKKJNLPUURRPOQRPTV[YV]SRSVSRPQNTROQSLHHQOOQNIJHMFIFHIIKVa\[][cb`_]Z^^XSVZXSJKE:0*'!%&&%.*,*...,+/**+061+)')(2BQ`orvwy{xwww£¡£¤¤¤¦¤¦©©§ª§¨¦¢��š—“•��‰‹‰‡‰‹‡†ƒ„‚€€€�‚€}�‚}€�‚€�‚„‚����‚„€€€€ƒ„†„‚ƒ€€‚}‚‚‚ƒ��„€�„‚‚‚‚}�„ƒƒƒƒ€~�ƒ�€|}‚€‚‚€}{}~€‚~{}}}{xvqZB+#+/8;AJR[bl|ˆ�”–—––�cOB856445133,-*(%&$''%!$(/6489AADBEKJHEB@::A=<>:7353207;=>>><><;=@E86645773756321458;CGIDB>:@EEGFFCBFECDACA?=AEFGIGIGJHIFLONLLKJMKNNMQPLJNPLGFKPQNJOJGJLBCCGDCCDFGGLKGJJNLJJKKPJIOPTSSSSQOQSPXVVXVUVUSRSRUQRONQROHKOQURMMMIJJFHKNLMU``^Y^cbdc`[VVYTRWVOLNG=/+& "$$#&&,/,,+/,-***,1*+('&(29BWdrrqwxwyww¡¢¤¤¥¦§¤§§©§§¤¨£¡Ÿ›˜˜””’Œ�‰†‡ˆˆ†…€ƒ€€��ƒƒ‚~{}�‚ƒ��€€€‚ƒ‚‚�‚‚�€~‚€‚~�€…ƒƒ‚‚‚ƒ€€‚�‚€€‚ƒ‚��€�„�‚€ƒ‚‚�ƒ€‚€‚„�€|�‚‚€€€�€€~€}|~~{xkX<(%%/3=9;4373335;=;::BI@456468624220004:9@GH?:9?CFFGCEBB;:<::84775469==<7=AF=887;934344221089=ACE>67;BCHFFDCEC=>CCFDABGGGJGKGHJFIKJPIJNMLLKIKKKMKJGJGHKJLMLJKOLQMB?@FCCFGJGGFCGIHMJJJLMTNPRWSSSQKLLJJMLSRQVXZWORSSQOLOPXTNDAMQWTQPNLNHJHLGJMRZea`a`bdd_TNKRRWWTOQQI>>74.)+(%),*0.(+11010*-,**(&()14:I\ensuqqywv¢£¤¤¦£¤¨¨ª§¨©§¦¢¡œ˜•—”�‘��‰‰‡……Œ‡‚„€‚‚�ƒ�ƒ€€€}�‚€€‚�}}�„‚€‚‚†‚‚�€�€€„…ƒ�‚�‚€€~…�}�ƒ„‚€ƒ€‚‚‚�€ƒ‚ƒ€}ƒ}‚{ƒ�€�|€}€€~€~€€�€}{wumX8"&(/158BIRZbr�‹“–••—‹€iSC:3971.1./*,'+(*%'""(%(+.6;CGDC?==DEGFGEC>7=;7948625798=;<;@?=?A?@7869:3244502/59:A>@>=536;BDFGDBCC@>@ADGBEGHBEHFHKKKHMNNIIPQKILHJKKHLFJEJFHIJONJIMNLHA@BCGGGGFEEECGGHILKHPUQOMUSRPPMLMGEEIMRPQRZXSPPOORQPLQQULECGLPXSMLHMMLNLJGKR]dd`___gc`ULMSQTXWSOOEFDC>88301-/10./-/355420.+,((%)/4:GWcqtruszzt¡££¥¤£¦¨§¨¨¨§§§¤¡�™—•‘’��ŠŠˆ„ˆ„†‡�†ƒ‚„ƒ€~~�€‚���€€��~~�€‚„‚†…����€�„‚‚�€€�€€}~€‚€}}�ƒ€€~‚�€�€€�‚ƒƒƒ}€~~ƒ�…‚‚|€|}�€€�~‚|}}{{umU5#$!! $)-/49>GOZas|Š�”•”“ŒlPC:;9:431/.+(+),+&!" %%)(-5>BCE?D<>>FCJGHC=9=;9667522::7;:;>?>>=>=<88<<877155.215:::A=;=4498?DGCDDDAAA>@BBFAGHHCCGLNLHKKOKIIONPIJHJJKJGGIJNHGKNNLLLLIGDADBAIJEEDFGGBEIHJGJLPSSOOTNPMMLOKFHFGNQQNQUXTURNJMMNNOTQQEELJMTTNMKJNLIPRONTX_ce^]\de`UNNQNTWVRMKFHKKLIIGBA>64433117;C=;;624.,,*,3=FQarrsusxxv¡£¡¢¦¤¦¥¨¥¨§©§£¥¤›™˜–““Š‹Š�‰Œ‹…‚„…‡…„„‚€}‚~|}€‚��€�€€€€€€…ƒ�€„‚‚�„ƒ€€€‚�€€€€�€�ƒ‚€€€‚€�‚‚ƒ�ƒ‡�€€€€~ƒ€„ƒ‚~~€}}}��~~~€�~|}yxwgP.#&'%! #',+24;9893630+*+)')(),""(&)'05@BBA?<>;=EGKKCC?:=?<;;551468;5;?>>:;>>=:8;=;9854422//6;=>?;9;7798A?DEGHGEDHNLKHJMJIHJOMMLFFMEJGIGIKNKFLKKJJMMMGFFCBBHFDFEHHEFHMIHJJKMORPQOKLOIIJMKDGIMRPOSTRSVOLMKOIIPUTOMIJJLNQNKMMKHKMPQQTW_`cdZa]`YYTPSONRRJLHFBHOTZWWWTJJBD>8:;9=FHGDA?>861,/5?GTdnrvssqxv¤£¤¤¤¦¦¤¦§§¦§©¦¦¦�—˜”’�ŽŽŒˆŒ’Š……†‡„…ƒ‚ƒ†‚�{~‚~‚€€�ƒ‚�~�ƒ‚ƒƒ~�„„~~�„…‚�€‚�ƒ€��€‚‚‚‚‚€ƒ€€€�€€€‚‚�ƒ‚‚|€}����€„‚|ƒ€‚�‚|}€€‚||}||xseG,'*30( $%),.5>COY_ly†Œ‘’”’‹|fK<8874505/-*)*(&(37+#))*&0;?BC?;;8=FILJGFEBB?@><<60403478;99=::>:;5;:8;8597353538;;>==99787;>ABEFCDA?9;;<86531./-.+,,)%(,.()(()+49=:8@AIKGNKGEEAB?@<674400539746;:9686849;;::88853479<;=:<88558:<>FDBBC?;7867>ABGEIGHHGIIIIIIHIJGLKNMGIGHGKDKNLLIHEJMHJMKMFGEFDFCDEHHJJKIIKKMNKGLNPUOKLOIKIGNGHILMNLHNOQQQJKNNHEJKOQOOULJNRUSQOQROPUSSVUX^`^YVVY]WTSQOQKPOHJD::ARZ^gjkhgfj_UOMJLKGGNKMMGEDD:9>;77>AEJGNNQMGGFF@=<77820/445453689655479;;8:59857478=89:<888579?>CDECB>87375<<@DGFDDDIKNKGGHHFFFKOOMKJEIGOEFLNMLKEHIHFHJIGDBFBDDBDEGEIIIIIKKLJJMKQUPNMKIHJKLHFFIJJKIHSPOOMKLMEDIKMNWRQMNNPVSROROSRTSZZUXZ[\YY\ZWSRQRSSPQQKLH;;BGRXekmijpuok^XYXPLILLMKHC?GE?=EK[bmrrwvww¡£¤¥£¥¤¤§«¨©§£¥¡�˜›–”“’��Œ‹ˆ‡ˆ†„„„„‚ƒƒ„€€}~�‚‚…‚ƒ�‚ƒ‚~€‚‚……‚ƒ„~‚€€€€‚�€‚€�~}„‚…€€~~‚„…��€ƒ€~€~��‚�€ƒ‚~€�€‚„€~ƒ�€|~|{||zwiR.,;KSG0#!!%./09;HR_nt‚‹�“”Œ„sUB9543/2/+-'*('-()),+&'*.39>>:579ADIIFKQNLHFJJ@=>776120142042477953235:82579;4:5977:787754669>>>CEG?=93447:;@GEFB@BFFHIEFECDDCIMMNLEIKHHCGGLJFGGAEGEHFJFCDBACC>AFDFHILIIHJJIIMLPPQTKFGIEKHGCEFFFHDGOROTONLLCFHJFMSSUMRORSSRQPQQSSU^^ZZY^XTU[[YURPRTRPMNMOGA;CFLZakkmksvvvhbge\SPMPLCC@AACC>CM[emostxzs¢££¤¤¡¦¦¦¦§¨¥¨¥¡ž™š——•”‘ŽŽˆ�‰…„„„‡‚‚‚‚„ƒ‚‚�~|‚~�~ƒ‚‚‚„‚€€�‚‚……‚�}ƒƒ}~€����~��…€€}‚€}|€}‚�}‚€€‚…‚‚€€~€€}ƒ„€}�~~}{}�~~|{{zqfE( ,;OYO;%!!&+.05:DN^lz„‹”—’Ž„jP?772231,,'($&*+)*+,-)')19@961134411.04777433178556398455956469751265:=?;;84354?AFCDB@@CDAFBFCCEFCEGGKGEHJIDCEIJDCDDDEBDEGDGGCBCFGEGBEDFINJHGIHIIKKMMOMJHBBBCFCDCFFCBCFMKKPTJLJGGHGFMRWQRNLPSSQWUPPQRVXXX[\Z\VTX^[\VQQSSRNJJJHA7?FNTaijlpqvvwpjkg`XRKIHE?>:;:9:@LValsqwwwt¡£¡¤¤¥¥¦¥¥¨ª§¦¥¡�š›™•–”ŽŒŒ��Œƒ„…€�ƒ‚‚„ƒƒ„‚€���€||�‚‚~}|€�„‚‚€y€€�€�‚~�…€~ƒ�ƒƒ€‚€€~€||‚€‚€€€€€„ƒ†„}~~}€~�‚~}~~~|}~€€�{{yn[>(L[my‚�’”’‹jL:12120/,*&(())(,(*/.'+008@F?67:=DFJJLMNLIKNOKIGA>>:636340//1-7474423551623455429555558414747=9:=?=><:71/25<=ACDB@ADABBDAADFB?DDCFDEEFFBDDHIFDCCCEBDCDDFEFDEHCEGCDBHDIJHHJILJJIJONKLHGA=?DAABCB@C?DHGIPKIFFGFDHLLPUSQIJRTSPVRRORSRVXYXXXWXVXa_b_VQUWUNNJJC=9I\dmrsvztv££¢££¤¢¦¦¦¨¦¦¦§¡žœ™š—““�ŽŠ�އ‡ƒ„„‚ƒƒƒ„„‚‚„ƒƒ‚�€��€ƒ€�}~��„€€€€}€�€€~€}ƒƒ‚‚€��€€€�‚|�~{|�‚‚…‰…€‚}�‡…~ƒ~}~€|~ƒ~~}~}}}vlR0&7SZ[D*# #(&+/569?JYkw†�“”’‹~dH61//.10+&+''++/,-.0,-.326BB=98<@EEJMKLJJNQQUPLHEFA?:5503/02/04.324144623320/20744223799041699898<==;73/1258ABDEBCAEECGFEDDGGDG@DGBDDFJIFHFFDIEEFHIIGGKHJLLHGIKKKKBCE?@AA?=E>CIJHIKNNQMEMMORNNTSRPQTTUZYWVZXYY`ahd^YUWSRROGC9=:>DIR]^fnnrsqsnpe`ZTMHB=:7402129EWensrwwwx¢£¤¢¢¤¤¨§¦¥§¨¨¦¡�››•™““�ŽŠŠ‡‡…‰…ƒƒ…�ƒƒ„‚|†Œ…€}��…‚‚‚€„€€~�„~€€ƒ~€}~‚�‚€|‚€‚€ƒ„€€€€�€€€‚‚‚|€}€�ƒ‰‘‚��~~�„‚��€€{|~|€|€~€‚‚{~‚{�|{xlO+ &3JZ[I3# #()*-13:?<;=CCGEIKKJKMRRRSLJIGF?A86233/1/02.00035625301,32/4422-/874/03357::::=;895.2444;@>A=;<>B;@??@===9@BEGHGEF>>DIJGEEFKMLLMJOMOLNRWPQTVTTWXUV[Y_[_gieaZZUWTSKC<><:=?MO]bhipqojmqj`^RME=5943/-/65BRcjosuvwx ¡¢¥¥¢¥¤¤¨¨§§§§¢ž›œ˜•“‘�ŠŠˆ‰†…ˆ…ƒ„€…ƒ‚~~€ƒˆ‚€€€„ˆ„„„ƒ€€€€‚ƒ}€€€‚€�~€}�~€~‚‚‚€‚€‚‚€€‚���€�‚€€��…‡��~‚}€ƒ€‚‚ƒ‚€{~€€}€€�„€~€€€�z|wfD&!""/G[\L;%!%')+,/36>HWg{‡Ž••�Ž|bC4..,/*-/(,),.2*-+/-23169:>ABIIMOMNNLOQPKKLFG@66973/1112.,-245632..2,/4243/+.0533045653967<;:972,+138<<@@;;<9:@>9939=@@>BDGD>CA@CCDHEEGGGBFDEDCJJFCDEG@CEHIBEF?CFDDIIHDDGGGDHAD<@=>A;=;;78;DFGHDGDDBEGHFEDAJPNQMEFFJHJPQNPSWPMRY[W[^_\afggc][XUSOLC>8<857>NR\`dkligaiha[TLE>6773,-,3:@L]emquuuu¢£¤¤¤¤¥§¥§¥§ª¦£Ÿš›™˜“‘�ŠŒŒŠ‰„‡…ƒƒ…�‚�„�ƒ€„‚€€…„ƒ…ƒ�‚~€„€�€€‚‚~~ƒ€€��ƒ~‚€€€€�‚|~�‚�ƒƒ€„€�~‚€€‚…‚€�ˆ‚€~€~€�}��}~ƒ~~�~~~~|}{yre= $.CX]S?&"(*),,386=HVkxˆ‘–””�|bG70,,,)-+,(/./+,*/*.,1247<<==:98;>@AEIGBHHFDDEGGHKKHEACFA?CJGFDA?GHGDFGIGFIKDFGEBBA?<>??:>;9;623410/031432/.210.066500-/461/33494912556711/,.1/4687985:7=94/0037?>@=>AB>CDGGIFCDEGKGIGIJLIBEAAFGHJDFEGEGDFHGGDHJHCHEAB>@BA==:>=:?BDEEGACEHECAAAB?BISMNIJAEDDDDIIOPGLMSY\[a]XY[_bdfa\WSLDB<4,+,.6?CLQV[aaa^[\ZUROGD?54/+.24:@LVakpuvvs££¢£¢¥¢¦¦§¦¨¨¥¢ ™š—“”��Ž•�‹ˆŠ†††††ˆ‡‚‚‚‚‚�€‚~‚€��ƒ‚ˆƒ€ƒ€ƒ~€€��„�|�‚‚ƒ€}€�‚‚ƒ‡�€}€�~€‚�~|€‚‚�€€€�‚~|‚��‚‚€~…�|€~‚€~‚~€~yz{yvwtlV0%HRbr‚�“”—”�}hUE;710(%+--*,-.0.-,1//0338??:869?==ACHNQPIHJMSURNMIGG>A@:=66403159323.*--.32-35530-5893022266320537310002016;444948>;94//-39:;;:>=?@?@A?CBBEGDEFHFJJIDGGHIJHF?ACLJKHGECCIFIHJDFHGIGDAF@@=C@=@>;=>BFADAACBHHGDHBC@;4.**/.9=CJPVX``]XXSOMKMF?80.--79>EKZelovyyw¢¢£¤£¥¦£§¥¥¨§¦¥¡Ÿ˜›˜—“�‘”�ŠŠ�††‚„†ˆˆ€‡�‚€€€ƒ‚‚‚�‚‚„‚‚‚ƒ€‚ƒ|�„ƒ�‚‚‚€†ƒ‚€��€ƒ�€…‚}€‚‚�€„€ƒ‚‚‚€€��~�€€|���€~�����€~„€‚z€yz{svfN&(5N_dU9%$(-1,-37=4.*,-/+,/,-/////-12689=9::;;@>@BGILNIJMQTSTPKFIKGGC=@>8<89;:;753..,.,/02-321//0575413255.,../470+115457<76535579<5,)/399998;;<@?B>=@EADIDCFHJIGHHJJKIKKDBEFGMLJFGBDHJGFKDHFHHJHDFC=@?@???=>@DAFBEE?>@GHDFGD@+"%'262.79@KVeq~Œ�“™˜–�…vdZMB=73+-/,,.1.-/,21--2/39;9;7=9:<>@DDKNIIIMSQRUPKKJLJJIDE=@@=;=@?=:411-.,14//,/,.,1142500/10+*++02340*/254668740597772,%,2:;788:7:<=?>>>ACDDBCHIMFHGFHILKMHEEFDGIGGEGABHEHJFEEFDEFHDD=A>;>BB??@EEGGDEFA=?CFDEBB==>@CCLGJE?CFEBACHGPMOPRRSTZW[Y]]]]ba`]RC7753.)%*365<@IIQUSTPOHEJGD;50.,-5=CHXZhnssrrv¢¢¡¤¤¢£¤§¥¥¦¨¦¦£¡ž™™–’““‘‹‹‰‡Šˆ†ƒƒ†€ƒ„‚€‚„ƒ���~€‚��„€�€|ƒ‚��€~€‚€…ƒ‚€}€}~€|„ƒ�ƒƒ‚„‚‚~}€�~ƒ‚‚~�€€€€‚|{~ƒ�}}~�ƒ€€€€€~‚€€||~|~xsp_=$7Oad^M6'((,:@D=>>HR`my†�“—š—˜’ˆ{n^ZLF<:-00.),-,*-0./4--05898457:7>>DFGJNKHIJOMNTNKLMIMNNHDFCD>@A@DB=42034/172/.,./-.130/-0/,,*++,6334-/,1048587533:684.(%(378595675;@A;=@BFDDADGNLGGEGJNKJKKIHGGDECIDC>AFGGFC?EHHDEBC@?><>?;>CGIEGACFGDAADJHOSRSVRPVWXY`a_`_a^]TE:500.,&$'.57=CFLLQPUPQHDAA;41-/45:BIT_fpstqwu¢£¡¤¡¡¦¤§¦¤§§§¤¡ �š•š”��Œ‹‹‹ˆ‰†„ƒƒ„ƒ‚‚�ƒ„�€~�ƒƒƒ€�€}�€�€€�€…€ƒ��€€‚‚€‚„�†‚‚�‚~}{}‚€‚~~€‚€‚ƒƒ€|}�‡„€�|}‚ƒ€|‚}~~€}|~{~zvm\4 "&6L`liX?.*-4CLQICDO^bq}‹“•™—šš”Š„tkaXME=30.+('+)+/.,*//.03867217568:FFHHJJGHHLLMSQNINNLMNKFBDBB@DDBDA9637938714.+.,*12-./0,).),).2864114.//579:77356824,&%)34;895457=@<=>?CDCDEDCIGGGCGKKKGJLIGKKGHBF?A?BGIDCB=@IEAGICBC;;;CCCDCBFFEEFGE@=:=AHDADA>===ACCJGDCGIGEAIGJQOVSVRQORUX][`]]^^]UK<45/-)&)+08=@@BFADEBEGDDEEGGJIKKOKIEHGDAC>@BCEGEBBB?A@DHGEE@<=:BEDD=@@DED>EFD98;?CD>AHD;?@@ABEHFGGKGHBFHKORSSUSQQMPTYX[ZY_`[UL;5312)# "*,28;CJHEIGINLNGE>>94/516@KU^eipswst ¡¥¤£¦¤§¦¦¦¦§§£¢ ž›˜—’��ˆ‰‰ˆŠ‡ˆ„…„„„�ƒƒ���„‚ƒ�€‚‚‚y~€€|�ƒ‚„‡ƒ€€€€„‚�€€€~ƒ�ƒ„�€�ƒ�„‚€ƒ€~€ƒ€�‚‚�‚ƒ€‚„Šƒ€€…ƒ€‚‚€~€‚~�|��‚}‚}�z€€|||uhG#$%/Gettp[E88@R_eb^\esz��”—š›œœœ™“�„~vofZL;4,)%%%''')..+,1/2;:41/48542;C@@:AGHIJHLLLJPOPSRSKHEJHDCHGKGJFB??@;851200/2/..0*/)-/+,).0133..0/134553443433300-*.+253895:866;:@=@DEAACAAFCB@CGJGJKHPNFEGICBA>9CEGDD@B@B?;<>DDFCGHKLNORVXYUKIILNHEKMJLLHFFDCA?53331233111//-*-,--.013/-0-0347433/-114212/-,*.5559786369:?>>DGEB@>@AGLIHLMKKLFJECABB=BEEEBC@@>;>AIGECEB>>BDBDAAEFHDB;?C>>=AAD?>CEIBBBAFHHMONOLIFKOLQSXRRWRSSYYYZUTXZ[^VE>:62,(&#%",..4:BFHJHEBBEJGGB?>::=;>?CB@A>??A@?==DIOGLHFMKHGEDDB?>CFBDCB?<>>>ACDGEDA>>CBABBEFFFG@9=?@?>@@B>AEIGE@@GKKLPLLJLKJJLPQRVWSUUUZ^[[[VRYWZ\VD96830))%#$%..158BDJJDA@BFEIFD@;<98?B??><>:>@C:ADFLLFDFINIDBEEBC??@AEAA><>==>CABAC@?CCC?BBIGEGH>:<BAD?GHHA<<;@GNV]]gnsuzvy¡¡¦£¢¤¤§¦¦§¦§§¥  ›™˜’����ˆ�•’ˆˆ†„…………�~��‚�ƒ€€‚€€�€€~�€€ƒ€�ƒ‚€~€�‚�†ƒƒ€���}�‚‚‚�€€�~„…‚€€„€��~ƒ€~�‚~‚~�„‚}{}ƒ€‚���}yvmT* %%*9Ihu||qaYXfp{�‡…„‡�”–�››�›ž�ž�™—•‘�‹…y_@/$$$#$&$#$%'*+.0077:963454473479;>@A?BDLJJPWZX]WMLLKLMLHJNNIKOKKJJKIA?;A>>=@::=>=??AD@>@DCCCDFGHGJ@>;9?BB>CB?BFHHGFFKMLRPQOORSLKMOPOPTTURTY[^[^]X`aYSOB7332/-*$!$#*./4457;8;;;?A?ADB=@BDETZ`ahoovyww ¢¤¤¤¡£¦¥§§¦¦¦¥  ž˜••�‘��‰��‰ˆŠ‡„�‡…ƒ��‚}‚€~‚€€€€ƒ}~~€ƒ„ƒ‚‚…~�€€‚‚‚‚‚~€€‚‚€ƒ‚�€€��€‚„„‚„ƒ„€��€�€‚~€€…�€|€~€~‚‚€€||wsjG! (/?@DEIJNTTVYXRNPNNMNMJNNKHNRNLLGLI?B@====:96546/2.557732.21/3338;8124237303,*).7987352025778989;?<9><5686=BCGDGGGEILEC?BDGB?@=?>@=>>>:<;;9@??ACFGFBBHHHGHGA@=7=>BCA?@AIOKIIHIPRTSRPQNMQMMPRMMPRTUUY\Y\_^\_`]TNB411-++''$!&*-.131535554:;;7;@=@EFLT[cejnqxuuu¡¡¤¢¤¤£¤£§¦¥¦¦¦¤ ž�˜““‘�‹‡‹ŠˆŠˆˆŠ†‚…ƒ��€€„…€‚‚€}ƒ€}~}�‚…Š‚‚��€€���ƒƒ‚ƒ�ƒ€~€�‚‚�ƒ�€�„�€�„�‚€ƒ�ƒ„�‚€€€�‚ƒ‚~~{}z���‚ƒ€€|{uq`> #'3@Vl|„�|rilw|‚‰ŠŒ��“–™�›�šœ›ŸŸ��šš••�‰w\B/'"$ !$"%#%'(+.038840.02/32/3.153<<:?CBHNSTSSPKJMSNMLNJMOIJJOQQJHHHCAC>>?;7677864..069:313/2115:986062041..0+''-5:5420022356:996:@97A:6234:ADGGGHHHKIEECDDEEA?>A@AB@A?=<;<;8>>>@IIHDEFLHDGFB@?:>CDDBCDAILLMJJLTUUOSTNNQLPLPQQOQSSSV\[^]`\Z^^XQKB:5.,%*%%#$$'*-+3..4784788565;;=AJQWcefssv{yz¡Ÿ£¤¡£¤¥£¥¦¦¥§¦ ž¡ œ’“‘‹�‹Š‰Š‡‡Ž‹„‚ƒƒ„‚‚€€ˆ†�„������‚~~��ƒ„„�‚‚�‚€€~‚���€�‚€~‚‚�€‚ƒ�‚ƒ€|€ƒƒ€~~ƒ€††ƒ€‚��~~��€�}€€€€~~}ƒ‚�}yvnW/ #%+5B[m|ƒˆ€|tw}�ˆŒ�’�”–——žœ››ž����›˜–—•�‡sX?-!# #% " ##')',1330,2./*,.,0+-/,57:??@DEKRRPLMGLMQMOHIJJLJKPOROJJGHCEGAB@<;:88651//4785653035579:73317573/.-,*,.661320-.5558:>?7:;88;:8:35AAADEHGKGLJHGGCEGBFCC@>=<=?>;89>BGFCFGEKOLOPLJQVTNVUPMPROIMVRSSQPPQ]]`^[]a_]^QI;30,)'%&#'$#'(,+*-+/2;864342209=?KT]hkknpvz~ty¡¡¤££¢¤§¤¥¦§¦¦££�ž –•”�Ž‹Šˆˆ‰ˆ†‰……ƒ„‚…€€�‚…‚�„�‚€‚‚�|€��€‚‚‚‚‚‚‚€ƒ�‚€�‚‚��€�‚�€‚ƒ€„‚�€�€„~‚‚€€ƒ„‚†„„ƒƒ~€�€}�~€~|„€‚|||~}�€~€{{qjL( $%.9L`q‡Œ…�z}€†‹��’‘”•–™����Ÿ�ž œ�™™–—‘…rV=*%#&!$##&!#&&(+031-,/0,(*-.+/+.01;7<=?DILPQOHIHLPLLJFEFIMLKOQTOMRHEGFEBBBB@8=663..4279:4553664865863156510+/2..1310000--5538<==9<978::768>?CDCGIKHDLJJEGDD?>=?>?@BB<;>=>>9;<;>DFIED@ECHAHGE?@B?@BBBGHIHMNLSOMLSTSMSXOOQRJILPQTSRNSTX_Z]]]^c^a]R>2-(''%&%%!"'**(*)--04430130,.55;GXcmooqrtxyv{ ¢¡¢££¤£¤¦¥§§¥££žž™“””�ŽŒŒ‰‡Š††ƒƒ€�„�ƒƒ‚ƒ�ƒ‚„„~€‚…„~}}�‚€‚„�‚‚€„€€��‚‚~�€€€�€ƒ€„��€~€~}��‚€ƒ~�‚ƒŠ…ƒ€€��€€€}€ƒ�}€|||{}~€|zwqa>   #+=Ugw‚‹Œ‰ƒ‚ŒŽ�’�•‘””›œ��œ�œ�����›˜–�‡sS9($#$%## $#"##$+,,.20,/..(++01//.138<=>CBLSKMMMIMNOMIDDBBGNLNQUMLMNKLGEDEFDBC;=:962043844;866637446:<465342-/-22024224/2/0134;:<:<<9979;7:;:DJHAGGJHFGEIFEB>;;=C=>;?A<;<7=:@<:>;ABGHKCEFCBGBBAA?B==ABDKEEIPNRTRNPTQLNSQPRPPNORPUURSVRZVZ__``b^^_XG7.%$%%$&%""'&()&)1.,3351.(,+/.3:?S_hqrssvwxwvŸ¢¢£¢¢¤¤§¤¤¦¦¥¥¡Ÿž—•’“�Ž�Œ‹‡‚…†‚‚��€€€„„ƒ€€‚†ƒ„�€~�‚ƒ€�‚��€ƒ‚„�‚„€‚�ƒ~€‚‚}€€‚€~~„�}€�…‚€„‚‚ˆ‚€ƒ€~~�‚„���}€€|{{|z||wnV4 "-?Zm|‡‰‹‰ƒ€„…‡‹‘��“‘“•™›�žœ�œœž�›�š—”’…lL7'$!$!#!"#!$"$%('**+00.0'()*+2-*/257;9CIMMMOKLHGLKFHADFFEBB@69751546348835385346<8601333*//3524264423..0.3:<7:99:797<9:;?=OFBFCHHFBDIDB><=>>???;>?;<;;9;<:;?;>AGHLHDCEAG@>@AAC=>@CAEDELNNVRRNQOMNNPUOQSSRNRRSOUUVSTW\`c^``[[[UI>3(""%!$#%%''*'*.,+/030,#(,/1049DXerssuuvwvz¡¡ ¡¡£¡¤¦¤¥¦§§¤¢  ˜–––�‘Ž�‰‰…†……„‚}�ƒƒƒ„‚�‚ƒ…„€€€‚…„��‚‚~�ƒ‚ƒƒƒ�€‚}€€‚‚�~ƒ€‚}�ƒ‚€~~€€�~€�†~‚ƒ�ƒƒ„��€�ƒ~€€��~}€…�€�€€z~y|z|{yugJ, %1A_s€ˆ��Š„��†‡�Ž�•’“”–ššž�œ�›�šœ››œš–�†kK4*#"""$$!"$%"&'('**../1/'%((*-*,.037==<>DHOIKGIHKJJEA=58;@CFKQLJGGELIHBBHIEIF@A=8575888666831374737:456750.,,//2136886200..03773<:9:888;97:;>ICA>ECEE@BKC==??>==9=???;?<::58=<>8?BBGHJCBDBA>=DCBB@<@EEEBBHMNPTRNJLQONPSPRSRQQRTQPSXXUZX_b`\`W[VTQC99." "$#$"&.++,)%,.,+)&"$*..367?O]fqvuwstwy¡ ¡¢¡¢¤¤¥¤§¥§¥££žž™””‘���ŒŠ‹‡…„‚„„�…ƒƒ„}‚ƒƒ�€ƒ�€���„�‚���~ƒƒ‚…€„€~€�}ƒƒ„��~€�‚ƒ‚€ƒƒ€}‚‚�‚�€‚‚‚‚ƒ�€�€}~„�~ƒ‚||~|~~{{ws_A%  $1Hdy…Œ‰��‚†ˆ‹Ž�’•“““—™››œ œ››››˜™š•��iH0+#$$('#!%%%%&&+-,),,*,*'%'(,*,-0036?;<78;5:=>AJLLDFIIKJDBGFJMKCD?;;6679<785443456464477564100-.-0.057;:742.3/027:;9:=:68977766>CA??F@A>@BA@?=:789>>?7:7:=;<=A?BGHGBBC@@AAEF>=A=>CCECACJPSSSPNSNIMQTVRUQOSRTTPUTUSZ\bda]]^ZZTKC73.)!!""(%#&,,+-0)*-,)' #$*(1047=EVbpvwvstv{ ¡¢¡¡¤£¦£¥§¦¦¤¤¢žž™•”‘��Ž‹�‘�†ƒ„€ƒ„ƒ‡|}�…€�‚�€�ƒ‚�‚‚~‚ƒ„„�€�…‚‚€��‚€~€‚�…€€��€‚~‚�ƒ€‚ƒ€€~ƒ€ƒƒ‚€„ƒ€„‚‚‚‚||~€‚„€||~}}zzpY8 #2Mh|‰‹�‹‰„ƒ„���‘‘‘““——ž�œ››�šš›˜ž™˜‹a>*'%%(($$$'$$$&')++-+,(&'%$%*+-/1616<<>9;=@D@ADDHGC?7-/49=9:>CDDBCFIHJGGDDJMMFE>>;;;=;;96630636:621275477440////039;;7:7130265599;<;8:;874815>>>@BCE>;>?A==>?><8859==B?9:;9;9=DA@CEDBAB?;A>EB>AE@@@BGBFFLOQTQQORQNNRRSWSQRQTUSTUSNPX_cea_\\]\VJ>6,)$" ##&(%(,*)*,-+,++#!%#&&).38:=N[mvstusww¢¡¢¡¢¢¤¤¤¨¥¨¥¥¥¡Ÿ�›•“”’���‹��ƒ‚‚€�††ƒƒ€ƒ��|€…�€€‚‚„ƒ„‚€‡ƒ…��‚ƒƒƒ€€€‚|€‚„„‚ƒ|‚€��€}�ƒ�€ƒ„|�~‚€€ƒ�~€€‚‚~€€€�~€}}}}|{ukN+(%BGFHF;;/(+34579::CB>DGIIHFDFGGMOKI@<8<><9;95205589:572358646322///-03599:8631753657:;9=9;9793647=A?BDEE>>=>??>==88:;79=?>>;88:9>=CAAECABBABB?<:=ADBBBGCADDBFGIORQPNOOQUQNSRWQVSRQSWVXXTSPX_ea_^]]ZZUJ>3.%%!" %'())'(-&(,--/,'$""&&%*,/589GXjquwuxw|¢¡¡ ¡£¡£¦¥¦¦¥¥¥¡ž�›––••�‘Œ�‘“„ƒ‚„‚„‡ˆƒƒ„����‚ƒ~‚€€�ƒ………‚‚…€‚€ƒƒ„„€…ƒ~|��ƒˆ‚€€~„€~�†€‚€„€€€‚�ƒ‚��‚€‚€~�~€€~€�€}~~~zzra@## 8$ !'9TsŠ���އ~|}ƒˆ�����“�“˜›œžœœ›œš›ššš‘„pI.)'**'(&$'%&%%)$()(#&'''$''&.0999599;9;7886:=ADEFB=4/%,.83238;>=ADFKJGDDFIMNMMMD@<><=:867558::;934469:843700102.35569:77405657676:888999:7688?>>???>>==;<<;9>=;=>=99:>=>DBCEB?<=ACD>:>>>BCDCDEGGIDDEIJMNNLPMRXRPQUWSSQQORUUSXYYSW_gaa^]\]YUO>6-'"'&&+*()/&$''',,,-+&%"*)*'*+.5:8BPcmrou|ww¡££¡¥£¥¥§§¥§¥¦¦  ›œ—’’’��Œ‰Ž‹……‚…ƒ‚‚ƒ€�„‚…€|€„€‚††}€„€‚‡„€€ƒ‚„„†…ƒ‚‚„€|{�€‚ƒ……‚‚��‚ƒ~}‚…„€„„‚€{‚€„‚ƒ}|€ƒ‚‚€��~‚�€~€€�~~}zzwoU1$&8Ss‚‹�Ž��†€zy€ŠŒ�Ž�’’Œ”–›œœœ�˜™›››––Ž‚_>(+'+)%))(&(#%$"%%%%%#%('%%'/29::<;62546257799?DGCC;3+*+.41/2<:66?DHLIHDGDIHMNJLB@>=:;;95787?<<<8325:89;5423-/2.273566::731526874;?7;6:7:6:99>?=<>?EG>?@B>@=@8BE>>:==;BDCHEAGGHCJHJLKLMOPTVRRRXX[WTULNOOQRXZ\X[\ccb^\]^ZQK@9,%%#*)-1/+-'('*'-,-2+)%%,,*/+'0488:41331.23678>BFCA<2.*+,01.47726=GJIFDDFFHHKJGHD?@>:@?<476::989=;8::7:=>?>>?CBB@CA>@@>?>;A==<;<9C?BC<@BBDCHGC?<;>A>78=>CCBBEGDEHHENLJNIKMQSYXXYZ[Z_[XRNOSRPMOX[^Z\bba]ZZ\XQH=5+%'$,-2850-+)'*++-,10/(&)*,-0-/3589DVbjptx{¡Ÿ¡££££¦£§§¥¨¤¥ŸŸŸ›–“’�Ž�‹Š‹†‰…‡…„‚ƒ…ƒ„ƒƒƒ‚~�„„‚ƒ„„�ƒ‚~~~‚‚„†ƒ‚‚�‚�€‚‚‚ƒ‚„€‚€‚‚‚‚†ƒ„ƒ}€�‚ƒƒ|}‚}ƒ„�|~�‚„€€‚€‚~{zwq_< !,?Wq€Š�“”“‹†€~�ˆŒŒ�‘�‘“•—š›�›™š›™š—™‘ƒgA&#$$*),-***,$(%#$#!#&$&$&),,38;>9>920341//174:>?AGD72(),.--042013:CEGFCDBGKEGHBBDCA?ABB=;798:>A?825258552854///233544476601645:9<:>;9=;<><<>9@@????@@ED@>>C@>BCBAB@??BD@ACBCEFFG?9>@?=89;?@G@ACEFFFCGLLILIMNOUWY]]]^_`ZXRPQWSQSOUZ_]ab_d`ZV[[PH:0('%%-.5;:=51/++/.,0.,**'))*00152216?MZhmo{{} ¢¢£¡£¤¤¥¥¦ª¥¥¤¡ ›™š‘����ŒŠ‰Š‰ˆ‡„…ƒ„‚‡�…ƒ€€‚�ƒ„…††‚~ƒƒ…‚€‚€€ƒ€€~ƒ‚‚ƒ‡‡€ƒ|€€€{�ƒƒ~€��€‚„…„�‚ƒ„€‚ƒ‚€‚~‚‚€}ƒ€‚}~‚‚ƒƒ{‚‚‚|€�~}}usmU,#/C_v‰�‘‘’‘�„††…Š��‘”“—–˜—�œ™˜˜š›—™•�{X3#"$'*+,,-../.+'(#$ &''%')/33:=;;;41.034/12238:7998964441550.376273477525/248;5:8B<9=?>BECA==A?B@>?ADG?<>>BBCEE@CEC=?=>;CAB@CE@CBCB@;9<<;9;=@BDABBBGC@ADHHGLGIMOTX[^``c^[ZVPUUVYOSXUZ`_dbZ]]^W[URH9/%#%&/-2>?D?:820.0-,,(*)-)*,-2463--1;GTagrswuŸ ¡¢¢£¤¤¥¥¤©¦¥¤¥�›š•“��ŠŽŒŒ‰ˆˆ‡…‡„…ƒ„…‚�„‚‚…‚‚�ƒ„„ƒ€‚��ƒ€‚„}��€�€~‚„†‚‹Š€‚�‚‚�€ƒƒ‚ƒ���ƒƒ…�ƒ€„‹„‚€�ƒ„‚€�€‚}{~~���€~|€zwuvfJ%$1J_s�‹Œ�”’‘ŽŒˆ…ŒˆŽ�‘‘••—™™›™™–˜šš™”�‰mG(!#%(*,..1042.0*''$!$%%)+.138:=<=70-11//./22357==>941---%(),/,'(0147AAA?DMIGNECAB:>A>?BA==??FEA<8;9:6630254320/668631976562/655847??:9;AAIF?>@CADBGFCDDB@@>;>?B>AGG@BADA=:;=:=;8==@EF@A@BEBFCDDIJIKKOTX^_`fad\VWRUVUVQOZWZc`_a\^]^[YUUG9(&# &*,1?B==>ACFFCB?:;=AA9254324511377522575373384558;<:=9>?DEF@?A>C?CA??DBFBBCB@DBDIAFAAAD;<<<=@FKD?>CC>>:=><8;==CEGE@>DFFHBBDMKKPQNRW^agggdaZYSSSNQOSX]aa][Y^]^[[WRRH9($!',1;FRZPI=94.,-).-.*)-024553...9BQZfoutw¡¢Ÿ¢ ¢¢¤¤¥¦¦¦§¤¤ž›Ÿ˜‘‘��ŽŒˆŠˆ……ƒ„…‚ƒ„‚‚ƒƒ„…ƒ�‚„€‚‚‚ƒƒ��€€‚„„�‚ƒƒ…ƒ…�ƒ�ƒ‚…‚ƒƒ…€„�~€��ƒ€„€‚€�€‚€�€~€��€}‚€~|||||}�~{xsZ6-7Ofw�Ž�‘”–’��Œ‹‹‰‹��’‘–“—™˜˜™“•—•–‘‚pG. ##$(*11241456100-'$"%&')/225541540,0*+-.46;85453;>=73,,)#%&,,*&)./23;?>ELFHHED>BAB>:>=<=<>BBACB<;:=D?;7648455105552335233223545459;67>??CCAC=D<=BIF@@>A>?;:<<89@<@@DBCCGEFJAAEILJOSRQUabafkgh_YRMMNLTP\Zab][U[XW[ZWWRJ>+" "%)1=CS]ZRIE:31,,,/*,*//06333.,)6>HRgmsv{¡ ¡¢£¢¢¤¤¥¥¦¦¥£¢ž›�˜“���‹ˆ‡ˆŠŠ…†„ƒ‚‚‚�ƒƒ„€€‚‚‚€�€‚€€‚€€€ƒ‚‚ƒ�ƒ„„…�‚ƒƒ�€…Ї�‚€‚‚„„‚‚�}€~…ƒ„„�„‚€}€{||€€}~„‚€}||~~�ƒ{skO, #-9Od|„‰��•””’��Š‹‰Š�Ž�”••“™———–”˜““Š|Z9%"$%(%,012573484752*%((%+*-13222/2,-**,0157<=:74446:=71)'%(&%++)()+-.27;;:>955774434573452603211/222333799;8?CAAC@@@=@>>ACDB@A>BBCCEDFHFBGHCHA=897:B@EC?=B>:78:89=@A>@>BCDJKHIGDIFHIKLQRY^_ehfhgdaSOMPRTURW_`_[XVVUXXYWRO:,#  !$,3BP[^[XTA:20**++)*+(.//0.,,,5=FS]fqu¡¡¢£¡¢¢¤¥¦¤§¤¥¤¡�›™˜•Ž�Š�‰‹‰‡‡„††…ƒƒƒƒ‚€�€�„€‚�€ƒ„€�€…‚ƒƒ€‚€‚‚�„€„~ƒ„„‚†‘…€€ƒƒ€ƒ‚…ƒ~€„ƒ„†�‚€~~~{�€€€�‚�ƒ�€‚€~~{y€€‚‚€~{zueH$  )8Mh}…Š‹‘”••‘“Ž‹‹‹ŒŒ��’”’”™˜˜˜–’™•Ž‚kG-&#'"$&(0-247468:;821))&'))*+----*+++)(+.4<;=><74/347=71/*++$$+((%**/-29=AFD@?==>>=>>CFCBC>;7<8:67547254465432720341233/0233899;;A?CDDB=>@B@@>CCCCB@EDFFFDE@@@DDHDB<:67<BADFNOOKIJKIGKIKLUW]adhkjmi`ZPMOOVRQY^Z[^ZZXVXYYXTK:'$! )0=JR^d`]P;91,()+''*&)0/.2+*.5?IQ_iqtw ¡ž¢££¡££¤¥¥¦§¥¢žžš—”�ŒŒ�ŠŠˆ…ƒ„……‚„ƒ�ƒƒ�‚}‚€€‚�‡‚ƒ„…ƒ€„‚„�‚‚�‚ƒƒ‚††�‚„…�……€„~}ƒ}�‚„‚€„ƒ‚}|}‚‚ƒƒ€ƒ‚„ƒ‚‚‚~z|}‚‚€~{y|r`:"%+6Leyƒ‰Œ�““–”“��‹ŒŒ��ŽŽ’‘”——™–•–’�‹vX5%'# "&%()-3345;9>@:73.)%$%&'(*'(**&&,++-2;:=>@:332,05842-)($$&((#$'+(-,:;@BGEFB@B?>EDA=?=@@>?>BCFFE=:877;7695554865340163010022122/559:=8<<=>CD@@;?BCBCDADA?BEKFEEDEBA>?ADGD?5499>?<=>=<99?;8:=><@A?AIEIOMHFKLLEHKKLSTY]eiikmna]VJLOQVRU\\^[]`^TV[[ZTI8)!!,4CLXad`ZL@5-()+)&&&&010,--59CKPZdptr¢¢¡ ¢¡£¢¢¤¦§§¥¢¡ œ›“”Ž‹ˆ�‹‹‰††……„ƒ…„‚‚ƒ€ƒ€€€�€‚…‡€�‚ƒ……ƒƒ„‡��ƒ�‚„……‚‚�„ƒ‚„‚�…„ƒ�‚‚‚}€€~€‚…ƒ��‚„†�|€��‚�ƒ�ƒ‚�„€}{~{�€ƒ}y~xlT2"&,:IbvƒŒŒ�‘“•“’’Œ‰�Š�‰‹�‘““—™˜•˜’‘�…hG,%&#'#&('-*2358:<@=:962+($$($$(&$'$#(+'./77=@A@@84-01/111,($"$"%(%')(,)+0;@EFDEB==>ADE@?A>;?<>?DGGGE><923585975457452141225-/-145034647559989=>CC@???DCDCH?@>CFIIFDEHEB<>@BF@<974:;===>=<:::68:>KP]de]VI@7/'*))&$*-*10-.9@GIRWbmts ¢ ¡¡¢££¥£¤§§¤¢££ž�–’�‹ŽŒ‹Š…†‡ˆ‡†�€�…‚†„„„€ƒ‚ƒ‚€��ƒ‚‚‚‚ƒ…†ˆ€…‚ƒ„„‚ƒ€€��…ƒ‚‚„„…€‚ƒ‚~€‚�€�‚ƒ€ˆ‡ƒƒ~}}€‚�€€€‚~�~||}}€z{tfG%"*6=M^u…‰Œ�“••–““��ŒŒˆˆˆ�‹‹‘—•–—–‘ކtQ8%'%!&')'+,-359:>=??;9651+'%&'(%$% &%((%-378>?AC=:31//0.1,,$!$$$$%%%()%),17?CIACA=9;BDAA?==;<>@@BHIJD@:<45893;8454353465:333/00.46233617678847:>C=<=CAECDDHBB>EJHHFGFGID@@@@??;8998:=;:==:9;::9;<>@@A@AACGHHFIHIJFKHNMNX__ahgeggh]YRQQVU[[[Y\]^cc[a]ZVQB0"*9EKV_e\YRGB9+*'*),,,-1.48=DJLQV_mss¤ £ ££¡£¥¥¦¦§¤¢¥�œ˜—•‘�ŽŒŠ‡ˆ‡†‡……„‚‚‡„„‚…€„‚€���‚�‚€„€„‚ƒ…���‚‚‚„ƒ�ƒ�z€€€ƒ�€†‚�‚„‚‚‚‚€‚�€��}�„Œˆƒ�‚€~ƒ�€}�~€�|~||€€zwq\;!"-9DH]q‹�’“—••—”Ž�‹Š‡ˆ†‡ˆŠŽ‘˜˜”“�‹{e@+(%%%%%().//139>?AA?:7:;62/-*'(((&"%%&-(/199<@BA@:63020-/.'! ###&&%&'**,/39@CCCB:;>?@BB==:==;>CFHKGDA;;966839;5741:6679:4-20210302-4638959:;9:===;>=BEGCADD@@GHJHOHGNHCD@BB@>:=8::69;=8;:<=;::9;CGGGIHHGJMPQT[dcegdbfb`YTUUUY]\\WZ^`bc[^YZYRA)  )6@FP[]][SNKB2+(+*+//2749@DJJMOWansuŸ ¡ ¢¡¡£¦¤¤¥¨¤¦Ÿ�›˜˜–�’‘Œ‹‹……‡ˆƒ†‚�ƒ‚„ƒ‚„�„…‚ƒƒ�„‚‚~�€€�€…„‚�‚‡ƒ‚~€�…‚‚~‚ƒ�‚ƒ�€„€€‚€‚ˆ‰†�€ƒ€€ƒ~€€~z€ƒ�‚|~|~~|‚„~~uulS1#3AJP]oˆŽ�”•—–˜“’�ˆ‰†„‚„ƒƒˆ�””“�Œ€kR2'#$#$'%(*(1105;<@C>@::<8;9422-+*%%%&+((+/28;?BDC?:=;54.-/,)&!#)'$%#))-,,06@?DB<67;@?A?<;<;==>@EGIGC<:;?;9878877787:878952/2//2410435489:689:<:::>@B@DEB>AF>IIIGIKMIEEE>?A?@;:<98778797957:;=<>?B@BB>?@A=>?FGGKHKIKKPNVZ`dedb`^b^ZYYWTY]^^X\]_b`\YYWYO<$ (05BNWYZYTQLD:0*.-239;=?@CGJORUVbltsž¡¡¡¡¡£¥¥¤¥¤§¦¢¡››–˜��’ŽŒ‰…‡„‡„‡„„…�ƒ€„€„…€�€�‚€‚ƒ~ƒ��€|}~�}����€…‰†††€€„ƒ…‚€ƒ€�€‚ƒ�ƒ�~ƒ‡ˆ‰�‚„ƒ��€~‚�€€‚€‚€|~~ˆŽ}{zskL+'4EU\ajˆŒ‘“—™—”•“�ˆ…ƒ€||†Š”•��‚pW=,%%&'(&)+*+.1358=>@=;:;9::;8540,)('%()(*..17;@@FB>9<>:52*.,,&#! %('&($#)+/-+2>A<:659:=@AAAFDIC@:8::=:55329;;78666::630305345156337:89:98=;=:>=:@CC@@BBBINLHDHFCCCC>?@?999:876668972799:<.(#!''*&*),20139679<;<<;8;<::5860*'%.(--.0208=ABHD?>>?:83/..,(#$$(%(&%%).')15=<846:;@>=;>9B@@ADEFAD@=8=8>@=;6307;;=;;47;<713133331246417:7:=<789<>>>=ABDHLLIFCCABEC<867:9595688588868>?@@DGGECADD??EKGACEKKHJMPWXZ_de^Z\\ZYZ^XV\`aZ^_^\a``b]YWO<# *2:>INKONKLG=7319BLLMQTTQNRRS]chpuu  ¡£¡£¥££¤¦¦¨¦£¢ššš˜—’��ŽŠ‹‹‡‡‚‰†„…‡ƒ�‚ƒ‡‹€~€‚€€€~}~~�‚€�ƒƒ€}€„€�‚„†„€�€€ƒ„†„…€ƒ‡�€…ƒ‚�„„…ƒ€�ƒ�„„‚‚„€‚~„�‚�z€|{{uoX5#5Nemhjs€Ž””—”—™”’��„~{vvkmvƒŒŒ„s\B,% !$$#&*('/2//34:8;<;;897::=<878/+*'(.022204:<>DG@@?@>>492/0,%#!$(*&***(*)*)/88:7567=9<:><8>>74346><9<:758:754024/2726457::;:;;759;>>?A@?>BBA@EFIMFCFABAF@;:<>8377;667:87:99669=DCAHGEGFEKDC=GJEDFHHMMGOVXWS[`g^`c_]^^[ZX\b]]\`^baaa`^YRLB!%07;ABEIOJHD>634=HSWXZ\]^YVSWcfkouvŸ ž¡¢£¤¡£¤¥¤¦¡£ Ÿœš˜””�Ž��ˆ‰‡…†‰…„…„†Š…‰š�~~~�„~�~~‚~€€‚‚��ƒ€�‚€…Љ~€€€�€‚‚‚ƒƒ…€ƒƒ…€ƒ€~‚‚„‚ƒ€‚‚�ƒƒ„‚€‡€€‚€‚~�}~~�}zwtmP* %! '5Ldonio|Œ’“•——™™”‘�‡�{qgccmz…€u_B/%" !##&%))-....338==;99;:9:>@<9;83-(()-.22228:<@ABC@>>?;7510.)( #&)*'**&)-((+/2973358::87;<886EJJBED??AC@=6:76694:;768:879:;99?ECBHGGGJKLIDBDIEEDGIIIPQRUTUZ_^aceb]_\]YY[]X[]`bbe`a``XRN@ '28;;@FJDBD<408@Y_ceedegcZ[\dknppr¡¡¡¢£¡¢¢££¤££¥¥¢Ÿ›˜–•”Ž��‹Šˆ‡…ƒŠˆ……„„‰‹Œ�‡~€€€�€|~ƒ€‚~�|€~‚��ƒ„€„‰ƒ‚€ƒ‚}‚ƒ‚�‚ƒ€ƒ‚…ƒ��€€|…ƒ‚�‚„‚‚€��‚ƒƒ€‚€}~~}yvgI"#$)*' "(5C[qrko��’–˜˜™–•“�Š�ymcYWbnwvgH2&# "#%"(%))*,0,+028<;<99:A=9;===963+%)'.,10/37;@AB>BB>>;59;512.(" !&**%((%%((&,-0451247:74794446>@CFC=?8511789:88823597277961674811.3479:469?99:899<<>CEDBBBDDDBABEGABD@:=AD<4355:99<8798<<999<=>BBFDIGHKOOMHJDFDHHHKIMNORTVXY]]^`cec]ab]ZUWVX[`d^dfea]^YWN<#$/8:9:?GCA=60/6G\mnpkmknddgflmrspu¡¡Ÿ ¢¢¢£¢¥¤¦¦¥¥¢žš––•–���‹‹„†„‡Š„„‚‚„‡‡‹�~€~��‚~��„€€ƒ€€ƒƒ„��„�…‡�„„ƒ€�€€�€€‚ƒ€€ƒƒ€‚�€ƒ~���}€€~‚�€~€ƒ‚„}�„�‚€~~{zo\8'.4-' (2=Thusry‡Œ””—š˜–•‘‘�…yg[QKTdf_L6% ! ""%&&'&&%.,-335:;7:<>B=?;:<<<40)&+**+./-14::B>=@A><476::55/%""%(&&'%&&'%&)',/44/73576459610=?CC@A>863/43:685:6545784357457588933154;8:9:=<:9877;:>>>:847646;=>;=86;<<==>ACCDJFLKLMROSMHECEHIJNNPQUUX]UX_]\_bceddb\ZVRY[aaabgda^\WRG5" %057;;>@B==4./9MertvsnrokipjosurwwŸ ¢¢Ÿ¢£££¤£¥¤¤££��–”•�‘ŒŒŒ‹‰ˆ…ƒŠ…„„�ƒ……‚‚€‚}�ƒ„ˆ…�‚€�€†‡‚}‚„ƒ€‚‚‹†�‚‚ƒ�€„…~€€‚�€…ƒ‚‚€‚„}���}}ƒ�€ƒƒ‚€�}…ƒ€~‚€€‚€~ƒ„}jR/'4=8,$$/7Marwuz„‹“—“—˜—•”‘�ˆzeSHCHPQG;+%! """"$#%%',*.202589;<<<<<>8;<840)()+*++*.035:<==B==86287?>50+$"#&((!'"$%&+'(0214443575336544:C@CA><87226848:57883533247774768;;735468=89:=:;>987::=:AA7868335;=>>@;;7;;=B>BDIEFKLHHMNP]TOKLFEJKKNQQQVXYXXZ[^^^bfiefea[Y[[_dbef_ca^VQG8$"(/48;7>C@53//:Vk|}{vnqtptrrsuvszy    ¢ ¡¢¡£¤¤¥£¥¡¢¢“””“��‹��”‰…†……‚‚ˆ‡…„‚„€€}€€ƒ‡‘ˆ~�ƒ|�‚„„‚�€„~€€„ƒ…‚~…‚€�„‰‰€‚ƒ€€ƒ�€€ƒ‚„‚€~�€€ƒ…}€€ƒ…‚‚‚…‚~„�‹„~€„…ufJ"-.$#)3F]sywzƒŠ‘”•—–™–•“”�jQ<69:;2+&%""!"'## $'$%)-,2,034457:9:8A==>;9945:@>93*#!%$(&$&"$($'%+0550351444163369;=??==612443015540784330126844399:880755<@<=><<>:=::9:=AHFBEBBDF>CHGGB>?:9:>?96984537>>@B@@DGGGLKJLINS]ZRPHGFGGIJRQNPSRVUW][^`^fhiefba^]^cffhdac][VPH9 ",177:;=?=2,,B[u‚|vmnpusuwuuswxv� ¡¡ž¢ ¤£¤¦¦¥¦¢£¡š—••‘‘�Š‹�Œ„ˆ„‡††…‡…‚ƒ„€�ƒ‚‚……ˆ„~€}ƒ‚ƒ€€�€„„ˆ„�€}�ƒ���„Œ…�}€„€‚‚|�~€‚ƒ„…‚|‚‚‚~ƒ�|~‚ƒƒ€ƒƒ‚‚†~|qb@"  .CIF1%",;1*#! !&##!"##$'%+/54/3-1/-22.2159:<9;9530.31..0440/3556301299122998:65546=:?@>@<:;:99:8=CCABCCCCAACGGGAA=>;;<;95663469==>@=;=>AD?FEDFGFGLLMNKRVXTRCJGGFKINKOPNQTVY`cc_]afggb__`\^afigd__`\VUK9#!(20448:986,-Cb|…‡zoprvyxvxrvx{zž¡¡¡¢¢ ¡¢££¥¦¥¤¡œ›™—–“����‰Š‰ˆˆ†‡‡…Ї‚„„…��‚„ƒ„ƒ‚ƒ€€€‚��€ƒƒ��„…‡ˆ„ƒ�‚„„†ƒ�€€€‚€~ƒ‚~‚€ƒ………�‚€‚���ƒ€€…€‚‚��~ƒ�‚�‚||{vkZ6 6FOH7% %8I`s{~„Œ�’““––—–—•’ŠxZ<+'"%!# "" "$%!$$$(&'(,/114046556489=>>>:=;942443054/338<:<9;9:34674<::4+" $$'$ !%'),00321.-,/-.,,1219:856100.20+-0/3/1139753/5884-3777786639<;ACCC>8=?<>=8;@@?AB>B@A@EGCEEC:9?=;;765469:9:>?@>@>?@@?B==:><;961124;6888:94664446:91+! $$$%!# "%&+1/1/+-0*-,+.&)101444/,,-.0+)+*/-.333693526:634357777344<<>BFC@:9>@==CFGDCBBAEGCCA=;:;<<9:8;97<;:>@>CD?;=CGGHFHGKHJMQPPKOORNHFJJKLHJKPLNRWUW[]]afadeehcd]_a^abhfabdjbVJ8!$*)13.006716Eg…��€}wwusqxwx|{{xz žžŸ¡¡¢¢¡£¤¤¦¥¥ ¤š™–’“’��ŽŠŠ‰‰‰Š†…„ƒƒ‚ƒ‚‚€„„~€‚‚ƒ‚�ƒ�‚€~‚ƒƒ‚„†ƒ‚�‚~€ƒ�€„‚ƒ€}}~„„‚‚~€‚�‚ƒ…ƒ„€€€���€ƒƒ�~~�€‚€}}}sgO/$:R\Q5%);Qesz€„ˆ�’““˜––˜•’“‡qS9)('##! !%%'!$%$,*'-/115459475557;@@ADDGLIJIFB=<3.213777785567;:99982.&" $%"" "%&'.60/.,*-,,*+()./)-/,,*(*-**&)*'-..0263/005;.668473324347;A?DEB;<;<<@>;<<@=DIIGD=@>ACCB??9:;;?;7::::<;>?@CHI?>>@GFIKKMKIDKMLMMHRONLMKMNLMINMOOQTUVX]_agdeeledf`_add_gd```adWK>"!"*18/.32449Be„�Œ…z|vssuxzvz{ttw£�¡ž£¡¡¢ ¤¤£¤¤£¤¡–—–“”“�Ž‹Œ�Š‰ŠŽ„…‚†‚ƒ�‚€€€�‚�ƒ‚„‚‚‚€€€}|€ƒƒ‡„ƒƒ��„‚ƒ‚‚‚„„ƒ�‚�|��‚€€‚€‚ƒ€ƒ‚�~„�‚~�‚ƒ€„‚€~€{�€|~{qiL((>T]O:& ,7G_ky‚ˆˆ��“–“—˜˜—“��wX9.%$"##! $%#&'%**,)+//12147357569:AFIJKR[XZQPFE=4.00453357344:=@9:<64/("$$"%" ""&&'./0/,*.*-+&*%*/,*%+.)&''(,((&*(()'-/5101447007957311336:;?ABDA>99:>=>:>@@BDGCCC=<;>>A@B@<;9@@<<<<<9<@>BDDIABDADFHLJHHKHIKOJJHHJKMSTSOQTPHLINORTUUX]```gcghfbaf``a]dcaa][Z\VK:' "',42.35347Feƒ’�‚|wwwww|€yzwxuy� �¢¡ ¡¡¡¤£¤¤¥¤£¡��˜’“�“�ŠŽ‹‰…ˆ‰……†„‚ƒ�‚€‚€€…‚��ƒƒ‚~~ƒƒ}|ƒ‚��€‚„„‚„…„�„€�…‘‡~‚‰‡„‚‚�€�‚€‚‚�€…�€��‚~€€€}�~‚~|~zzujF&(=YbU7*!")/AWhu}�ŠŒ�“”••–•–”“Ž‚cA/&#"%#"&$##((#%'',++-,-1404434679;>HLVZZ]fggc]TNB5,-.2/.23135;=BE>A=520-)%%&$"%$'*.020)),.)'$&**0-(())(&(''*(()')%&()+31//.2/344633.42445:89>BDA=?9=>>=:@DBDEGA=A=:;;>CBB>=<<>>>;<@;7;?BDFEDDEABBDEJMHIIIHGMHCFJHJLRVUOMSSJCHHRWTWUV[acaccfid^[bdb__]_[^\XVURI8% !.2+.,1.17Fd…��…{uxvwvz{zwwwvx ¡    ¢¡¢¢¤¤¤£¤¢ �˜—““�‘Ž�Ž‹‹…‡‡„„„…„�‚ƒƒ€‚€�‚‚��~ƒ€€�‚ƒ}€ƒ‚€€„„„~‚‚ƒ~€†‹�~€ŠŠ�ƒ„‚€‚…‚„‚„„‚€|€‚€€€€��~€€~}~~y|~{yqbC!3(/GWbS;( "->Qcq|�…���’‘“–•–—–�ƒiM5+'&%$$"%##&&'(%').**0*/03346259<<@IW_dhiovvtng\H;/-)+,,.0248;CFHIE@871,,'%%$#!!(*1,,/,*,*()$'*1/.*&(&%&$)(((()'&&%'*,-1/,1/..2530/28/5637<:A@BC@>==?:7:?EBABFC==;;=>>?@A>><=;>>9?C@DCDCGDEIEAGIGGFIIFILHHIJLKKSQQMKNRRDDLPTTVTWZ`dc^cinkf_bcb\V\^[\[WTTPK4 "*--*+-./5Ee…’�ˆ|wt|y}|zvsyvuu  ž¢¡ ¡¡¢¢£¤§£¥žœŸœœ”“�����’ˆ‰…†…‡‡†€ƒ€„�‚‚…„�€}‚€€€€}�‚ƒ€‚€„€�…�„€€‚|~‚„€€„�ƒ€‚…„€‚‚ƒƒ‚‚……„‚~€„��€ƒ‚~�€|~z||{||wp[91!#2K]cXB+$+9I]ku…�Ž���•—––—•“Šs\>/+)*%"##"%$'%&#%'(*,,.+/01535396CNMHHH?820-*'$$!""$))2//1+,-+)+&'-22-,,(%(%*',)$&+%%%$&+./..*2./-280.03425256:@CC>C@???:677?CBCCBC@>=>;<>@>>>?D@EBFGFGGBHIKHEDIEDDFKLGIEJFGMLLIOKKGKQLCIMQSTZYZZ^_abahomhgdd`^ZXZ^[^\VTLM3 !%-+*,++/2Ed…��‡{vtw|~wuwzswvsŸ¡ ¡ Ÿ¡¡¢¤¥¤¥¤¡¢ �›š”•�’��‹ŽˆŠ†„†ˆ‡„„‚�‚„‚…†‚„„€}‚~€‚�|€ƒ‚‚�€†��„…‚�‚€€ƒ‚€ƒ‚€€ƒ€€‚�‚‚„�‚|ƒƒ�„‚€€ƒƒ€��ƒ�€�|||{}{|xxoZ8#3M^dWC0''6HSbp~ƒˆŒŒ�‘‘•™—•–”Œ€hH://*(%$$"$"&(%&)()',,2//.05214489ETet{‚ƒ‡…‡„€~kV>3-.00*..5=@GMNOJGB;6/-,'&" ""&""%(,+./-/.0-)))'.13--*(+*('**+)***((#((..//,00/-130.314544:;>>AABD???>9779;>@BCBB=;BB9::A>A@?@?A=;GUl{ˆ‡‹ŠŒ�ŒŒ‹‡xiN:3111..16;AIKPTMJEA6-,/($""'"#("((/,/1/121.**)+.13,++.'++)'('*+(-.(&&(+/-.,-0-,-4../03755;9==B=ABA>AA9:84;9:@=;;?>@A>>C>?=>>@@>?@<=;88.6;@AC=>???@><@C@=CBB@@DB???FFIGGLHEHEICAHDDGJNHJFILECF?FHKKKLLMKHIIKPQRRQTXYZZ\bbccjkkgkgg_\Z][Y[^ZXRN6 "")*)/)*/Hiƒ�ކzyw{zvtszxvzzwŸŸžŸ¡¡¡¢£¡¤¤¥¤£ �›˜––”�Ž��“�ˆ‰ŠŠƒ†…ƒ…‡„…€‚‚�‚ƒ€€‚€‚‡€||„‚€‚ƒ„‘ƒ�„‡†‡��€€ƒƒ}€�€…�ˆ‚‚~€~ƒ~€}‚�„��„‚ƒ~‚€}~~}z||{ofJ% "#")9Q^aRD5/)'+0;FOUcm|€‰Ž��•–”˜—“–“�‚uaO=76/&(%"%$%(%%)**,---/3-33488;>OczŽ�“••–’”’”��…pS=;:36338?DHKLPMKIE>?<=::8;98936>@BB?BAAC??>CB@=AHEDDGFB?FHKFFHJKJDADEBACGHHLMLGIKHHCCAFIHMJEGJGDINRQSOQW\XXX[^bfhpqjdehfa\X]YZ^[[UTI3"*+,)*+6Gjƒ��‚|wvtywtvyzyw{z ž ¡¡ž¢¢¢¢¤¥££¢¡¡™›–—‘���ŽŒŒˆ‹††ˆ…‡‚‚‚ƒƒ‚�„€ƒ„‚€€ƒƒ‚~|~ƒ††ƒƒŠ‹€~��‚ƒ‡ƒ}|‚ƒ‚€‚ƒ�‚€}€€~�~€‚‚€~€€‚ƒ‚€€~|€}|{}~}~{vqbB%  /@Q]_VC73/*.6@JSV[gs�„‰�’‘“–˜—”˜—’Š|q]H?93.)'%''(/(((*.,0/1145<7595;DUk‚’˜˜–——•——“•’�z_J>95623:?FHKLPMMHD950,(%#&(&$,,/10,046754013/3124000-/,..+-1.,+.5.2.-)03411/,.31/-0.02439999@9<:97==:<8579>=@BADABBB@DE?=BFIFGGFBCGHEFGINLHCD?EA>>EHIFPLIINJHKA@ADDIIDEFHHOQQNLQSV^YY\\]_dmopljffe_\UZ[]]\UQQB1 !$&',,,./3Jn‰���wxvtswuxx{{y{|žž¢ ¡¡ ¡¢£¢¤¤¥££ œššœ”���ŽŒ�ˆŠ…‡‡ˆƒ~…ƒ„‚‚‚€€„„‚�„‚ƒ‚~€€ƒ‰†ƒ�„‚‚€‚€€€„‚{€ƒ€€„��ƒ�„ƒ‚‚ƒ~€€€�‚‚~��}�€‚€‚‚‚|€zz~}‚}zyu\> .BO[ZQD=8516:EQVZ]cm{ƒˆ�Ž‘•˜–——•—”�‡}jZJ<74-*,(**00)',./44025<@?89890*'&&&$$&//03/126676413101.43242/...-3031--143.0///3044.,.,./+....11559::<7:89?>>@768::>?>@DDA@CAFC@AADHGJIC?CEIDCILIMIE=CEC;8?GKINOKJJHNPLCCCEEDGDFGKNUXUQQV\[ZWW\[^cinkiije`^ZSS`^ZXVOGD2 !"*-.../3Lpˆ�‹wvwrtwvuvz}zwzž›Ÿ ¡¡¡¡¤¤¢¥¥££¢�œ™›š‘�Œ��‹Œˆ‡‰ˆ…†‡……Šˆ‚…€€„�‚„€€‚���…„‚‚ƒ�„€€ƒƒƒƒ‚‚‚„‚��‚„„„‚€~€�ƒƒ‚‚‚�}€~‚„„ƒ€€€~}�}|‚�zwsR+ .@LTWPI?::78AHN[a_eiv‚‰Œ�“““––—––““’†yfSF@941++*-3,-+-,254442;EFC<>DVl€�—š›™œ—š˜š—˜–”‡sZKA93,-5:EDJQNKJHGB71*#$&%(%&,03001477:557411/0355243/.00210001253214/44435211/.0011/01244597997:=?DFGKMLKKIPRPJFIBHEFFIILMQZXRVYWZZU]]a_ehgkhjib__\OX[[YTTQEC0 %$*,.,(7Krˆ�Š€{vttuzxyzzw||x�Ÿž ¡¡¢ ¡¢¥££¥£¢žœ˜™—“Œ�‰�‰‹‡ˆˆˆ†ƒ�†‡Šˆ„‚†€€‚‚~�………�ƒ€€‚‚}€~‚€‚�����‚„„€‚‚„†„~�„†�ƒƒ‚€‚~�€€‚‚‚ƒ�}|~…�‚ƒ‚…ƒ„�€€‚}~€�€~zzyiJ&.==9AFJR]^`dhs{„‰�’”“–•˜•—–—”�ƒu^TIE>83.*0204//.578928AOTNGCOdx‰˜œ››››››š™šš™–‹ybO@;00,38AEHKMLGEFC6-%'($&((),2411/6<:=758:5/114435711/13.1//4556853344557738534/321.2034446769:<=?=<75:8:>:9;:CFDEE?DFA?CHNHGJF@>@EHCCLKGGD>>DB<55?EGMMNOLMNPNIIGGDFAJJKLLPTUSSSYV\Y^cbckgijhii_]V[TXZXTTTOHC/!  "$+')*16Onƒ�†�yusuwtvzzxvzxuž  ¡¡¡¡¢£¡£¤¦£££ ›–—”�‘Œ�‹ŠŒ‰†‡‡„ƒ„†ˆ„„ƒ€‚‚€ƒ„�‚ƒ…ƒƒ„€}€‚�€„€‚‚‚~��ƒ‚‚‚�ƒƒ…€‚€‚ƒƒƒ„…�€~„ƒ€ƒƒƒy�€�†ƒƒ‚‚ƒ€€~{~~zzygB# .=BEFC@<<<>CFMV_]`clqz…Š�“““—–—˜——˜ž”‡kaTMB?:604688:3369=89?::=8959=<85@?>EHDFAG@F@CJJFBACCCBHF?BJLHGG@=DF=24:EIKGKOKDLIJJKICGPKIIJLLKT\SOWVZZ`^fffjinkjif`XZURV[YXWVSG>/"!$'&)*09Soƒˆ…|vwzy{uvwwwwxww� ¡ ž¢ ¡¤¢¥£¡¦¥¤Ÿ�š•””’��‹ŒŠ†„ˆ†„ƒ…‰…�€‚„�……�€„„„„„~�„�ƒ€�ƒ�‚‚‚��‚‚�‚„‚ƒ…€ƒ€‚ƒ‚‚‚ƒ‚„ƒ�‚‚†Š†~~„ˆ…�€€}{‚|~~|{€€~{|~vgE,5:A?>::8>A@@=>96;=DB=@Nbnrfag|Ž–›šŸžžžž�Ÿ™š››—”Šv]I?8.*.5>FGFLIGED<6,()('&)01,.-,.5:;:::8565555585<1534453022545684964358:897645702223/475695776;<:@>::6:;9:8>>ADGFIDADD@BGGF=>@DFKGGBBHGHHKB8BCA75Tpƒ…~xswyvvuwtxvuuuy ž¢ ¢ž¡¡¢¤¢¤¤££¤ž›˜˜—“’�ŒŒ‹‡‰…††ƒ…‡Œ„€‚ƒƒ€…‡��‚‚€��ƒ€�„€€‚€…ƒ„€€€„ƒ~ƒ‚‚‚‚€~‚€…‚‚ƒ�‚€„‚…‚‚„��|}„„‚‚‚}|}€~}|}}€||}}}|q^5 "%-6:8<534=CFHIJT^giiozƒŠ‘�•““”–•˜–š——”�…zkdWNGIKNMILIF?FHJIEATn{|xqy‡”š› �¡Ÿ¡žžžœ��›˜–�~iNB60),4?DDEILIGC;60-)(&&./30//,07<>:;;89;566999:>40476720653333646757789;::5566237314147:98;75:<=@>=<:8;79=9>>GGEFACCCB>?DC??CCHJHGB?DCCHI@98<@:79?IIFGFFF@ACDJLMLMJIJKPTNNRUWWWQPNW\ceimnnnjid[VRYY^i_ZWOG:+ $$(/4>Zv†…vxuuwzywrv{zwwxž£ž¡ Ÿ¡¢ ¡¤¥¤¤¥ŸŸœ˜˜••��ŽŽ‹‹ŠŠ‰‚„…ˆ‡‡‚‚�„€‚‚„‚ƒ€‚€€‚‚‚„�‚�‚ƒ‚†ƒ€ƒƒ�€„„ƒ€€���……€�‚ƒ�ƒƒ„„‚ƒŠŠ€‚‚ƒ„‚}€€~€€}~€|}~|unM+!',/54/)19AIFB;IZeklq|ƒ‹�’‘”“••–•—™———“�‡xpd[SQZ[aa`[VMMPVUVP`u‰‰ˆ‚…’–š›¡ž¡£�  ž�œ››››‘ˆs[I=/'+6?DCEMMKFC=752*'(')0-../036>=;>8;9958:;;<;;3/255623745406837855957:<9:45656523238:8<<:87;;DC;@;=:;9=;;>AGCB?FC>@=;=@CDDDDLJFGFCA<@?=<:=A?=CDFGDIJHDBD@>BEH@?89@@>==AEJFDFKGBBCINJJHINLLNRTSOSXXSTRSTTWZ^`ehihed^TT][\``^TPG<'  $!#*,7@Hb{Š‹�x{yz|z|x{ux{|ww ¡   ¢ ¡£¢¤¥¥£¤£žš™——�‘Ž�’“‰‡ŽŒ‰‡„†……ƒ…†€�‚„�ƒ‚…„}ƒ‚€‚‚„�ƒ„�‚„††��‚‚‚€ƒ�€~€„„�€€‚ƒ‡ˆ…‚„€€†ƒ„‡‚€‚€„�€‚|~�€‰�||�€|ubA!#'250'(*4>?;13BVagntx€‡‹�““””’”–—˜–˜˜š–“ŽŠ�xrruy{{�}zqifn{yvy‡�—•——›ž¡ ¢Ÿž¡¢¡Ÿ ŸžŸŸ�™—‘€fM9)(.>CIJLJLJFC<84.,**((+-+0/5789>@C<934577756554744866743859:6988:99>><;899965574655>;;?CBACGD>?BDDEB>>BEILKFFIFFE?=<>B@BA?=?C@CEDFIGIFHDIGDGHKNILMMKLSUXXXY\Z[UY\VZZX\]`ee^_ZOVW]]\__SRI8( !###%*,03;3,,)-+(,0--25959;@C>;3517:812555669;8883479;:6694;<=?>>=:77:;457896<><=>AB::=7>=?A=>CFECEEG@AFHHF?@@GGLLJDCCDA@>899?=?C?>DAADHFCJKLJKLMJJFMLPMMMQNQRWY[[^^d^^X[\\][\^`b^Z[\RSYb^b]]UUE4&  "%$&(*012:Jo†��€yxxywwxww|yxwuu ¡��¢  ¢ £¡¥¥¢££ ›–””��–˜‰Š†‡…‰‰ˆ…„…ƒ…„……ƒ†�~ƒ€€ƒ†‡„�€‚‚}€ƒ……�ƒ�‚ƒ…�€�€€��†ƒƒƒ…Œ‡€€�…‚‚ƒ€‚€„€‚€�‚‚~�€‚ƒ€|€€„}‚{}|xmW2 %*57/$"'19;D++9Nappu{}ƒŽ�Ž””’——˜—˜˜™œ�ššš—”�ދЉŒ�‘‘‘�Šƒ‰�Ž��•šœžŸžž¡   ¡¡£ £¤žž¡� ž�›”ˆrX<,.8ENKCCEFEFBB;42)**./,.003488:>ED?:74675556457696=669755876568:<9@AC?=<568:;66<:<>ACBB=;BCC??=><=@@BBDIKDBCEBDDFICC:?EKMKID>A@??=96979@>ADEDDDGGGEJNQMOLMLQTQNMRUTTPRVZXZ[cbaa[Z\`^[X_]ZWYXVVWXZ`_]]VXH2% %((*(.2/:Nq‰�‹€wurtuxwvyxuvxx�ž¢ ¡ ¡£¢¢¢£¤££¡ š––“�‘”�ŠŠ…ˆ††‡ˆ‚†ˆ†„‚„ƒ†‰€€‚}€€€€~‡†ƒ~€€ƒ�����……ƒ„~€�‚~€�„†�‚‚ƒ‚€…ƒ‚ƒ‚‚€‚‚�€‚€~}�‚‚‚}}€€€}}��{uhM+%-43.#&*05;;**9M^lmsw€„ŠŒ�”’“•—–˜•›››››žš™——–”’‘“’–—–”‘��••”•™›¡ž ¢¢¢ ££¡¢¢¢¢¤¡Ÿ¢Ÿ¡¡ ›—‹z\>/0:GKJE@GIECB>;74)'%(,/023495;=<@C@;:45556627496::4;<946486736;8;C@ECC@ADCA?CA>?ADBDEHIGCBDEDBEEDF<@A=;=988:32:ILE@?DDEA?>972,&')+321439;:<>@?A<88482;5477;<<557745365:46899;?@>;@@544:<>?CDHFC>CDA@AE@A@CFDEGIEF?AGDDGBHIA9CGDA>@=>AA@>>>:8<<>BEGKOKNKMIJSQQQNOSTV]XVTTROLRT[^]\Z`ebfg_aa_^`[\X^YSVW\ba^^[ZN@3%# #% (()(-,0=Sw‰�Š~wzxvyzurxzwxyvs ¡¡   ££ž¢£¤£¤¥ ¡œ—–’���Ž�Ž‹‹�‡„…І„„ƒ‚ƒ‚„ƒ…„ƒ„…�€‚‚„ƒ�‚�€€€„‚……ƒ€‚‚€ƒ€„‚~~€€��‚€€‚†‚‚�Іƒ€ƒ�}€€€‚ƒ��€‚„~‚~€{vqaB$#'030#$'#-4,$ )9Tdjqtw|‚ˆŠ�“’–˜–›˜˜™��›šž�œž���›�›››Ÿ››œšœœž�Ÿ�¡ ¢Ÿ¤¢£ ¡¡££££¢¡¡£  ž ��˜�~`@04?GB><6@@9857;<:;CDCGCDEDBCCDGBEGDCEGFHGCDEBCDBBBIBCCBD?<<<@AFDKLNPQPJOOQSMJMRTWZZXUUUMPPUX]_^]]_behfbhc`_][^[WXVV`ca`b^SJ;0'#!',+),036SxŠ�ˆ‚zwxwzvwtvyzzzxuž¡   ¡ ¡  £££¤£¢Ÿ›˜–“““��’�‹ŒŠ†…ƒ†„„„„„……„‚ˆƒƒ…ˆ€‚„‚„€‚~�‚�ˆ„‚‚‚�‚€†„�€‚€~€��~�…Ї‚†††ƒ‚€€~€‚‚�€‚‡‚€€‚‚��}|{ws^=$(/2.$ "#0>4"#+CXhntv{{†ˆ‹Ž“•–—˜˜›˜››››žžž�ž�ž Ÿž�ŸŸ�ŸŸ�œ�ŸŸ�¡Ÿ¡£¡¢¢£££¤¤¢¢¢¡£¡¡¢ ž¡žŸ�›“‚`?02@B>85/;>DB;;75-+(+%(,/-1/3469:>=>:7:>78866887;=<9787::756545;;:<@DA><9;;7:996<<@>CEFFCDEEHEECHJGKFFIKKJGCECAEDFCADD>@BAB?;7::?@HFHC??==AEEDLLNPOMQPROKJMQSVYXYVWUVRRV\_b\]b``bggdheb]]\YZWYV]cedc_ZXJ=/'# !(*),.6<[|Ž�ˆ|xvsv{wxxvyzzuvvŸŸŸ ž¢¡£¡¢¥¤¡¢¤ œœ™—“”Ž���‹‹Š‡††�ƒ‡�„†‡†‚„‰Œ€…ˆ†‚~ƒ„„„�‚„�ƒ‚„€„‚ƒƒ…ƒ‚ƒ†ƒ€…ƒƒ€�‚€€~�„…†„††„„„‚‚‚�‚„„„…ƒƒ€€�€€‚|{zuoZ5+'#),0,"#*K= "0Halsxy{|�…�Ž”–˜˜˜™™›™››žž�› ž    ž žž¢ žŸ� ž¡  £¡¢£¢£££¤££¥£¤¡£¡¢¡ £Ÿ¡ ž›–‰hA/.8<:4-/7=C@?:60-*('),-,-,./3678=??978;;::76:457;;85<:<7834475:88AACD=@9:=9:68;9A>>>EADDCGLNDDFGGHHJJMMKKECEBFFJJEDDGFE?DG@>658:?DDHID@@=ADFCCIMPPNPOPKIMRQQUZUQSVXVYWY[`d`baddcdggef_[]]]UXVY\hligb_VK=0%"("#(+'(+4G_€�ކ|~vqwyyzzwx|zwww�Ÿžž¡ž¡£¡¢¢¤¢¤¥ Ÿš›––”‘�‹‹ˆŒŽŠˆ‡ˆŒ„†‚…„ƒ„‡�‘��…‚…�„�‚ƒ„…�Š�€€‚ƒ€€‚€„ƒ���‚��ƒ†…„~�‚ƒ‚€‚�„„�‚‡ƒ……‚…„‚‚…‚�€‚ƒƒ‚€���|||xkO. "(-+'!!*5/!"1Icrvzxy{|ƒŒ�’•———˜™šžž�›œŸ�� ¢Ÿ�¢Ÿ¡¡¡¡ £¡¡¡ ¡¡¢¡¡¡¤¢££¤¦¢¢¥¤£¢¢£¢    � ž�˜ŒpF00143-(+6;@C@65,+'')(*/-)+/24468?A><69:8898735:85788@@8;76459558>AECAC?B<;<:<<:C@?ABCCCFEEIKHFGIHGHHLLJHMIDHGDFJJJDINMJGDGCA8857;=>CMHEDADBEBDFNKPTTURMLPPSNVRSRRUVWY_\^ccbbchda__ada^YXYTQRYT^ikkkc_VH:*(%%)% %)'+*2Ke€�Œ„xtvvzxwzvx|yxsu Ÿžžž££¡££¤£¤¥£ �š–—™“��ŽŠ‡ˆ‰ŠŠ‹‡�……„‚‚„‡…�ˆƒ„‚‚‚…ƒƒ€‚‚‹›�ƒ†…��…�…~�}‚„‚‚‚ƒƒ�„‚ƒ„€€…ˆ…ƒ‡ƒƒƒƒ�ƒ‚‚…‚‚�‚‚ƒƒ€‚……}}|ueF(""$$&!!!%&$%#"/Jgt{~{wxƒ‰“‘“™—™™—šœ›��¡Ÿ œ Ÿ ¢Ÿ¡Ÿ¡£¡¡¢£ž¡¡£¢¢£¡££¢££££¤£¥¡ ¤¢¤¡¡¡¡¡žžžž™�vN61...*'&.:DC>50,'&(&),-)+.12244:@E=;85:9:9659:564386;:76755;9567@:@=>==@ADAEEACHFIEGIHGGMLJIJIHIJJFKKFJIHHDKOQPHFJIB?545=>@?>737<<8;5:<:8938747456686:67:;>AEECC=@??>A?=:AACECDBCHILIIDEINPNIEDFIKJLJLILLKHDEJRNHJGIGA8/7=>>?CDDCJHJEDKKMMRYYZY[XNKQQQQQSLORVY_begca_eike\db]XXVQUTQNSX_kponj`YD0%'+,*+(%  (04++5Nf€‰†|uwwwzwqu|zvxxxwuž¡�ž¡¡ ¤¢¡¤¥¥¡¡¡�›š¢”��Ž�‰Š…†ˆ‰Œ‘‰ƒ„„‡†ƒƒ‚„�…€�„…ƒ�‚�‚‚ƒƒ‚„�ƒ…ƒƒ‚„…Œ‘†Š…†�…‚„‚„‚ƒ‹Œ�‚„‚„†„‚„‚†ƒƒ€‚€�‚‚‚‚€‚‚‚€~~z{q]8!"(* $'%"#4Gh~‚„||�„‡�‘•–—››™››œœ�ŸŸžž  £ž¢¡¢¢¡¢£Ÿ¢¡¢ £¤¢¢£¡¡¥£¢¤££¥£¡¤££¡¡¢¢£ �ž¡ž�š–„c=.&($!$%.<@A;64/$#%%%''(*-1/14:<===9348<:<:99===89;84862548896:99;=ADB??C@D@AAA?DAEBCFFHGMJIHDCGLNNE@DGGJIILHMMNNKHCHNRKHDIIB939=AA=?BB?JMHHIJOQSVWZYV][VRSSMPMOKNPQYVbefcbdhjmkgf`^XUTSTWUORUdmpnki_V@-"$*,.**)#(2:1/:Oqƒ‡‡|vvx{xxvzxyxzzxuw�Ÿ �¡ž ¡¢¡¢¥££¤  ¡�™””��ŒŠŠ‡‡‡ˆ‹�‡ƒ„†�†‚ƒ‡ˆƒ�€„…‚‚„Іƒ„�‚ƒ„„€„„„�„†‡‡‰ŒŽƒ‚ƒ…ƒƒ�ƒ‚ƒƒ�ˆ‚„€��„…ƒ„†‚‚‚…��…‚ƒ~‚��{z{xmT2" %%$# )1Ga}…ˆ‚€�†‰�‘”•˜™›ššœ�ž�ž ��� ¡  ¡¡¡¢¡Ÿ¡¡¡¢¡¡¡¥£¡¡¢£¤¢¦¥¢¥¥¦¢¢¤¢£¡¢£ŸžŸž¡�œ™‹qH/+&$!'(19?@8930 "$#&%(%(+21348>;;<76379:97AFDF?@BBBCFC@A@AEDFIKLMMJGGDGLNOHBCGGKKIKLLLJRRGGLQNLEBHDD?68>@?=A>A9EHKMNQOTUTRTSTX[]YUORSMMLLOPUVZ^aegjommmhhc[XVVXZZ[RW]ckmnmg`WA,"%%*,'*('*4794>Sn~‡ƒzutwuuyzz|zzwxyxwŸ     ¡¡¡¡¤¥¤¤¤£Ÿ�š••‘�‘ŽŠ‹Ž†‰‹‰‡„‰‰‰‹…ƒ†„ƒ‚‚}€‚‚‚…Š•ˆ‚‰…�„€�ƒ…�…‚…„ƒ†ƒƒƒ‚ƒ…„„ƒ��‚�‚ƒ„„‚ƒ€„…ƒƒ…†ƒƒ�‚€ƒ‚„‚�ƒ‚‚{{xkK. !"$"""(0Dg|‡Šˆ…ƒ†��‘•–š˜š››š��žŸŸ   ¡ ž ¡¢£¡¥£ ¡  ¡£¤¡£¤££¥¤¤¤¦££¤¢£¥££¥ ¤¡ œ¢� ›ž–�T5*'"!#+.4??851+#!""$%"($,52149;=;<:5257879A;>@:<>::=>8/04688:4696>BFIIB>ADDGCD@B@?EIHKOLNLLHIDFGINIHHGHIQKKLNIMOSOKPNNIGCEDBA>9@A>??<<7;>=9:<;<<3-,57757396;;CDJMIC>?=>?BGEIPQPRIJHHOUURUPSUPMMMNKPLMU\fiinkoqj`\Z[bba`aca``gffhfcaZO?)"! %))*((%   )57>KKNFDCDEIHBDBBHQNNLNLIOLGGGEGCBHFFFKONNOLTPPNRVWPPJKGAHFCD?=>@BD>BC@CFDEJRRQKIKNLSSSOOSSUQOSLMJMOU]abdjlike]\[_]ad`a^[_eedccbabUK=)# "%'+*)&(& &.8CMd|‚wyvzuzzuywzzv{w|z{Ÿ  Ÿ¢¢Ÿ¡¡¢¢¤¡££Ÿ ›š™—•‘“”Ž���ˆ‡‰‹Œˆ†‡„„ƒ……ˆŠ‡„„�‚‚„ƒ…„‚‚‚‚‚…†…„„ˆ„ˆˆ‰†‚‚�ƒ…„……‡‡„ƒ�…ƒ†ƒ………‚‚~„‚‚„‚€~„�‚‚‚ƒ�‚€ƒ�‚}xp^='/7=/*.47.#""!%#/3?COby†�ŽŽŠŒ�•™™œ™žššŸ� ¡Ÿ¡žŸ¡ ¡¡Ÿ¢¡¡¡¢¢¢¡¤¡¤¤¢¢¥£¤£¢¢£¥¤¥¢¥£¤£££¦¢£¢ ¢ žœ–•––—‘}^=+ !&/056361,&  !$#&)(.-.*04330.32284683=99=:8;742.5:587=85596>DINJEDCFHHDHDBKQMJOJHJJNIGDEI@CIGGFJMKKPPRPONVWUVNPOKIBFD@?:@=BA=EFBGECEHNPPLNQOMPQQLKKMMRQSQPIJNW]aaadghfc\[\^b`bd_\^^clfga`][WJ7'% #''*+)'($" !-9@Rk~„„wwx{xxyxwwtxxy{zz}�ž      ¤ž¢¤¤£¡¢Ÿœ�”•••—“ŽŒ‹ŒŠ‡‰†‰ˆ†„‡ˆ†„�‡ˆ‡†„„ƒ€ƒ�ƒ„€ƒ�€‡�Œƒ……‡…†ˆŠ‡��‚„…ƒ„‚…„„„„�‡……„‡‚‚ƒƒƒ�„„……���‚�~€€ƒ€‚†„ƒ„yo[7"#2DF:/*7CE9' "#"#%,5DJR[g{ˆ�’Ž‹‹�•™šœœžž����Ÿ     ¡   ¡¢¤Ÿ¡¤¢¢£¤¢¢£££¥¡¥¢¤¤£¤¤£¡¤¥¤¤¥£¡££¤¢¢ž›˜’’••�‡kG0!!"*-16552-1)&" " %"&(**(,,110.2214534687;88:::8711:@749?>9787;CHKKECHJGJBGCKMJNKILJGJNLDDIIGFFIEECIKLKPQQORUUTSPTKMFIKFF>;9;=@=BBCDGEGGINJPRROLJNOJNKLINPVURJKNT]``\deeca][__ab]ca`a^eji`a[_[QC3'" ##'))(&$*("*4DXs~‚�vs|y|zxtuvv{z|yx{ž �£ž ¡  ¡ £¤£¤ �žš”˜––”�ŠŠŒ‰‰‹…‡‡‡‡ƒ‡Š‹‰†…ƒ†„„ƒ…ƒ��„�‚„ƒˆŠˆ‚ƒ†‹†…††ƒƒ„…ƒ�‚…‚ƒ„ƒƒ„„†††‚ƒ�ƒ……†„„„�„ƒ‚��}€„�‚ƒ„‡ˆ…uoT5 /DPH5-->MQ?,!%$%!&/=LYbgo{‡�“��‹Ž•˜››ž›�žŸœ¢¡¡¡Ÿ  ¡¡¢¢¡£�£¢£¥£ ¡£¤¢¤¥¤¤¢¢¤¥¡¢£¦¤¤¥¡¤¢¥¢¢¤¡¢¡  ”–���•ŠxT5$"%*02:5710-&'#!"! (''(**../0,0342957:8679>=8:=:207?676?B:554=>HOIEEIIMLIFDLLLLLIGIHKMNJEHOHIJHFHDHJHPNTSNPWSSQTQMLJHJHC@:8:;<>CBFGEHIJGHJOUTOLNKNJHIJKNOWSSPMQV]`_``aacdZ_[[\_`caccfeje`[ZZZQA.#$ "$&)*&('#'&%2H^w~|{wwzzyusuwvx}|zxx|Ÿ ž   ¢ ¡¡¢¡¤¡¤¢ �š•˜–’“ŒŒ‹Š�Š�‰ˆ…ˆ…„…‡‹�ˆ„‡…‚ƒ†…€‚�‚…………‡‡†ƒ„�„…ˆ‡…‡‚€„„ƒ…„†ƒ€……ˆ‚„„†…€†„‚††ƒ…‡„………€€€€~�‚ƒ‚€ˆ‹„}znS6/FQQ;0/8I[_J2(%($")6BXdpss{ˆ�“�Ž‹’”™��› ž›��Ÿ Ÿ¢  ¢¢¡£¡¡££¤¤ ¢££¢¥¢¥¥££££¤££ ££¥£¥¢¥¢£¢£¢¤¢¡¡ ž›—އ‹’Œ�b>*"'069;388,&# ! $&&%.)03./-2047:<6;;28=<8;::;406:54;>>93449ADLLHDEGPLNDCJLJHIGGCHKOOKDHLJEGJQKJGDIJNTTONPRRNPRNLMNSNKDA;>>>BAGHJKJJLKIIKS[RMKHJKGIOMKQNRRRPNSVY\`^VY`]^__[Y]]^`a`dcicZ[TTYN>,&& !!#%''('$%""(4Ggz�~~{vvzzxusuuu|||xuzx  ¡ŸŸ¡¢ ¡¢¡¢¡¥£ žž™˜•”’Ž���‹ŒŒŒ‰‡ˆ†…€‚‰��‹……ƒ†€„„„ƒ„…‡‡„„…€„ƒ‚„ƒ……‡…ƒ‚‰Š‚…„‡‚ƒƒ††„ƒ‡…†‚ƒƒ‚……‡„†‡‚‚…‚€€ƒ€€ƒ‚€ƒ…†€{ypW.-BRTH1/0ATcfT?-%*+'+AP`rxxz}‰Ž’���Ž•˜žš� ›�¡�¡¡£¤ž ¢££¡¢ ¡£¤¢¢ ¤¤£¤¥£££¥¢¤¤¤¤¤£§¤££¥¤¥¦¢¤££¢¢¢  �˜�„‚Œ�„nD-# )/8:;<<;2)" #!!!% !%&*-/022./1165:7>;49A?<:A<<5108668=<;44:=AEFHGGEINQLDFHMIIGDHGGILJLLJJGBDMOLJBGFEQRRMOROPQRSNNNTXPOKECADDD@HLMILJPMMLIQVYVOFMMNLNJNQRTSVWQLNRZ[TST^`Z_b]W^_[]_`bbed[ZZSWL:.$&"!"%%&%'&'#%#&8Qg}‚€€~|z~|{zwwxtwyztu|u�žžžžž¡¡£££¢¢£¦¡�›™–”•‘‘�•“ˆŽŒ†‰ˆˆˆ†ƒ„‡‡‡ƒ‡‚€‚�‚…�ƒˆ‡ˆ‚ƒ‚~€€�‚„…†‚„†‚„†ˆ‡‰‡‚‡„„††�…„…„‡ƒ††„„†‡†‡†„†…ƒ‚~€€€‚ƒƒ€€||wkN(%)# 0CTUI412?KHHJJLQNHHGONIEEIHFJHIPLMNJECGOMJGJFENQOLKJNLORSOONSVRQNJGBGFIIKNHJNKKOSQMJPZ^UNKQRRLNOQQXZZZSLLNSRNLOY]Z^d_T\a]\]_aec`\Y[ROH7-&%#"$&"$&))%%*%$!!+=Ts‚}||~€€yxxzzyx{zuxytŸž¡žž¡¢  £¡¢¤£¢Ÿ�››˜•”�’—•�Š�‹Š‡‹†‡††……‡…„„‚ƒ„‚‚ƒ„…‰„‚�€‚„ƒƒ‚ƒ………‚€‚……ˆ‹†‚…ƒ…†‚‚„……„……†ƒ�„ƒ„„……‡†„…‡€z�{‚…„�~}{zwgG%/GS\I6-8;3:BA@?@<>;8:=AFJJNIMNQIGHILHJEEGGGHHONLOJDA?HNKGIFEKQNILIIMMMQONORROPMPJHINMKOQQKNKPMWWOMMXXXOJLVQQNRPQZ]]\YMDHLLLKNX[[]^]X]_\]^\\\^YYUWPPF8,%% "&$"%'%))(&$,?^s€€}|xz‚�€wyz}}{|z~vŸŸ ¡ ¡¢¤¢¤¡¥¤£¢£Ÿ›�——”““›“‹Ž‹‹‡‹Š‰„‡†……„„„„‚……‰ƒ‚€€„ƒ�€„ƒ‚ƒ„…€„„…†„„…„�†„‡„‚…†„…ƒ‡‡‡…ƒ„„†„€…†ƒƒƒ„‚†ˆˆƒƒ}~|ƒ�ƒ�€~{~|vf?""0GU\I3)08CHXhxvdL7+.:Pft‚ЉŒˆˆ‹’”“�Š‹�™�œ�ž�Ÿ ¢¡Ÿ ¡£¡¡£¤ ¢¡¤£¡¥¢¤¤£££¤¥£¥¥¢¤¥£§¤¥¤¦¢¤£¤£¥¥¥££¢¥¡¢£žœ�jkx|wY8*%)4;CGB<74,& !" !!#!$$$(,.-+-/*/69;:>:/4>>=?AHC=44;75==;@@=89?B?AJJOILOQLEEGHHGEDDGIIGPPNNIHB;BEIHDGDNLQLNKNIKJNONLRMJQRXQMLPNRSUSOMNJLSXRRKNTXQQNPQTRNPU_bdaYKBCGLLPQRUVX_]Y[cc`]__XPSPQRNLC5*((#""$$#%%'))&% -C]x€~{x{€{|}zzz{z|zz~}}  ŸžŸ¡¢ ¤¢¤¢¤¤¥¢ �˜–”’’“”Œ��‹Œ‰ŠŠƒ„„…ƒƒˆ�„„‚†…†‚€~‚�ƒ€‚…‚ƒ„†€�………�‡Š‹†€ƒ………ˆŠ‚††ˆ††‚ƒŠŠ�ƒ†‡…ƒ„‚†…�ƒ„‚��€~ƒ‚}ys`;%4FTUG0(-4@JRYlz��p\:12>Xn€‰Ž��ŒŠŠ‘™‘އВ›�›ŸžŸž ŸŸ¢¡¢ ¡¡£¢ ¢¤¢¥¤¢£¤¢¥¦¢¤¦¤¤¥¤¤¥¥£¥£¥¢¤£¥¤¥¤¢¢¤£¡¦ž¢Ÿ¡š–†h\dqq^@)&)45?CC@73,&$$ !" ##""&,()*,.0143>>><737@?@=>C<6<>GCEKROPQLLGDGIDGEGIIIJLNPQOMMD;IVYan{†‰ygL86J^w„Œ�‘”ŽŠŒ”•–�ˆˆ�˜���žœŸ¡¡ ¡ £ ¢¢¤¡¤¡¢¡££££¥¢¤¤¥£¤£¥¤¤¤¤¤££¥¤¥¦¥£¥¤¦¦¥¤¢¢¡¡¡¡Ÿž˜‹nTRdi`J0(-339AC>85-)#!$! !"!#%!%()&)*,0238>;=<669CB=:@GD?97>=?C@69A@CDKPRRQNLJEEFECGIOMIIMJOSPLKH>;=CBGHDINPKLKGLJJJLJLPOSUSQSNSUSQRQTXVNOLKQTVTQNRQSVTTWQHNPVZ^^ULA=CELNRSQVY[YZ[b^[[XXSQLNQKHD7)''&#"!!#"$%&&&%!0Nfx�{vzxu|wzyxuw|zy{z{x}�ž ¢¢ž £ ¢¢¢££¥¤ž ™••“�”–‘�‰ˆŠˆŒˆ‰‰ˆ…ˆ‡ƒ„‚ƒ€ƒƒ�ˆ€„…„†„‚�…ˆ†‚„„…†„ƒƒƒ……€„„„„„‚‚‡……„……††‰„……†…„ƒƒ�‚�ƒƒ€�…‚�‚ƒ€€}|zmT1* $6K]ZB+!-5GOXYer�‰‰‚rS;?Np|ŠŽ•“”Ž��—––�ŠŒ”š��Ÿœ¡Ÿž ¢¢¡¢¡ £¡¢£¢¢¢¢£¥¥¤£££¥¥£££¥£¥¥¥¤£¥£¦£¤¥¥££¤¤£¤¢¤¡¢¢ œš�yZIU\^K6,)+67>@D<70)##"'% ""$!"''*$))-*116;;;636;AA9>?KG?>7=A=A?@@?BB;>A>ADMOSOOROKDGF@FNJQMIJGNORPNLEB<==CEKJNMLMHHHDIHKHNNORVVVSTQSUWTQSW\\XSOJLQVVUVQLPZZSWPNPRUVXVSNEBBEMPQQTZZWYZZ__\YXSQRQOMRF;/(&(##$"#" "$&&'  :Vm|‚‚zxxywy{z||zv|z{}|�~|�Ÿ¡ Ÿž  ¢¡¢¤££¥¡¡ž™˜“”‘•–‘ŽŠ‰‹‰Œ‰Š‹�ˆ‡…„„‚…ƒƒ‡‰�…‡�†…„†††‡‰†„……„…‚„„„€€ˆƒ‡ˆ‚ƒ……‡†„„„†„……†‚†…ƒƒ‡ƒƒ�†€„€€�ƒ…ƒ€}�|ykQ0'7N\]I0!,=NY]^iz�‹�‰}cMI^tƒŒ‘’–“““�•˜–’�Ž”š��ž œ ¡ž ¡£ ¡¤¤ £¤ £¢¤¢£¥¤¤¢¤£¥¤¦¤¥¤£¥¤¥¥¥¤¤¥¥¤¤¤¦¤£¤¢¤¡££¡ž¡›”„bIETRJ=1..039CC991)#%""!$$" ! %*(&)+'*.03:;;5/0;EIF=55613:A?92/*&&"$##### %"%))(**%%,/56:74/29;>=;BB@D?==B@BB@DDJE@>ADDDEENVSKIIGJGJGOLLPIIIKLMINPKFDD@DGDBCIONGCGCGELLLQPSSRT[XVPRV[]]YX_]]SMNQQRQRUW[VTQPJEHGMOPIFHGEAGLLKQVWUVVZb``_^VMHLPSUMI:,(*(#%%!"  """%*$" *Fbvyvuvz{zz|zzzy|}zz{}ŸŸ    ¡£¡¡£££¤¢£¡�š––˜–‘‘�Œ�†‡ŒŠŒ‰‹‹„…ˆ„…†…ˆ†„…„ƒƒ‡ƒ„ˆ„‡…ƒ……‡……ƒ……ƒ„„‡‰�ˆ„€€‚ƒ…„††€„‡~‚„ˆƒ„…€€ƒ�‡†ƒ„�ƒ€~ƒ„…���€~viS65- 3L_dS7(5Gamrnpx‚Œ‘�‡ye`n‚Œ”’———–”””˜—˜”“š�›Ÿ¡ž�   ¢¡¢¢£¡¢¡£¢¡£¡¢¤¡¦¢£¤¤¤¤¥£¥¤¥£¥¦¤¥¢¤¨¥£§¤£¥¤¡££¢£¢¤¢¡ž¡™‘vU>==;8:<<34:@@<5/+'*'"(%$$ ##&&%'%*)'%,24<;:20053?B<C:8.*'(('*%(!"$&$$(*.*)(*.2:9=8223-5;DBEFFIHPMOHHJGFCAHMJOJIOMFJJNRRQIEEACCFGIKLILFIKLNMNLKRUUVW\]SWXVSUVZ]WXWTRLOOTRPU][WRMJC@@DEEFCAFDFHILOORVSW[\\_]aXOHHHOQPJ@.(/+&#$$ !"%$($%"8[o{yxwzvy|{|y|zv{~~~~|}ž¡�¢  ¡¡¡ ¤££¢¤ �Ÿšš˜“–’”’�ˆ‡‰ŒŒˆ‰Š†‡†ˆ…………‰†…‰‡€„…†‰‚†ƒƒ„……‡…‡ˆ…††ˆ‡„„‚††……†ƒ‡‚……„†Š†�‚‚ƒ……‚ƒƒ„„ƒˆ…�‚„„€†€‚‚}ƒ{yraB#$ 2F\eU9" ,AHEFFKLPKCDJGBDFHHIHHPILHDFFMSXMJHHDBDFIGEJOKJJNOLSRNRTV\ZW^YYTTQSXQRSTSSSNOSSRMV\WTOOJD?C#/B[aX8"$ .DXlqvv|…ƒ†‹��…€ƒƒŠŽ“—š™™™––˜™š›��™¢ž¢¢Ÿ¡¡£ŸŸ¤¡¡£¢ ¢£££¡¢¤¡¤¢¤¤¤¦¤¥¦£¤¦¦¢¥¥¥¤¥¥¥£¥¦¤¤¥¤£¤¦¤¤£¢£¢Ÿ Ÿ™Ž{U8+,00354488<>4/+**(%+++&*%')())*,()*'3;C<2,5439>>?@DCCAGDEBCJKKGKMMHEFGDADHGGJJGGKJKHC=FOYSPOLKBCCHGFHJJGIORSTRSPSWZ[]Z\XSUQRXQLHMLLLNMRWRPRXYUQJLEA:==?DFGCAHJKKOYSVWTZZ``a]aQGGIMSMB:,+%&%&")##  $""#2Ndsyytwvsxww{{{w|yz{~|xyzzz �   �¢Ÿ¡ £¤¢¢¤ Ÿž�™—”–—™”����ŒŠŠ‰‹‰‡…†‰‰‡‚ˆˆ‡‚ƒƒ…ƒ…„†ˆ„……†‡…ˆŠ…†ˆŠŒ‹„„ƒ‡†…‡„…ˆ„�ƒ„�……Š„‚€†��ƒ‡‰Š……€…‚‚‚‚‚��€€€|u`;!!.D[_S>(,&#4E]svvv‚…„ˆŒ�‹‹†‡‰Ž‘•›šš™œ——™›œšœš¢£ ž¡   ¡¡¡¡¡££££¡£££¤¢¤¢¢¥¢£¢£¥£¦¥¤¦¤¤¤¥¥¤¥¦¥¦¥¥£¦¤¤¤¦¥¤¥¡¤¢¡¡ ž›’ƒb@-,,.4552478872,,,,&+'(*+*$))**)'*+++1;??3.068558::6BAHDCBIHGEKMQKDADB<@CEGLGJFGKMJIECLVXPQMMGDHGFFGCHHNNTSVPOSTRTW\`]YTVTSSKIHCGHFHMRXUSWUVWUKKDB??EDDEMJHKUVXXXWWXbcbcaXLLOTQI;4(&$'%' &%" # )=\nx{zvzxsrtv||{wy|z{|xzxyzž Ÿ   ¢ž££¤¤¤££¡� Ÿ——“–˜›’Ž�‰‹‹‰‡ˆŠŒ‹ˆ…‡‰‡„…‡„†‚††„‚…ƒ‡‡„„…„†……„‰ˆˆƒƒ……„„‡‡‚ƒ„…„„…ƒ‚‡††…��…‚€‚†ŠŒˆ„ˆ‚€ƒ�„ƒ‚ƒ‚€‚~€|u\9 #-EY]M;* '8Mdrxxy€ƒ‚‰Š��ˆ„‰Œ�’”››™˜š———™š���  ž ž¡¡  Ÿ¡¡ £¢¢¡¤¡¢¢¥££¢£¡¥£¥¤¢¤¤£¥¤¢¤¤¥¤¤¤¦¥¤¥£¥£¤¤¦¤£££¥¡£££žžš–‹nH/((/4755897951-,,)%&'*),*()'*))'(+103>B<3//45044764?EBB>@>?ABIA;=D@BCEDGBFJPJEGA?:>BADHHGCECIKMLDJRVTROKKLJJGGCGCFPSSXYRQWTVVV[[^ZZ_]TROMICDGBCLQU\ZWXUWSNLHD@<>@=>@BIHKHKQPW[ZZX[agceb\TLNPOH9-''(''%%(%%"%'0Jbx|}|vy|vrwwv{zxwx|~~|yxywyŸ�¡Ÿ   Ÿ £ ¤¤¢¢¢££ž™˜”•••’Ž‹‹Šˆ‹‡†ˆˆ‰‰‰‡‡…†ˆ††…„……„……††‡……„†‚†……ˆŠ…†„„ˆ†…†††‡‰…………‡„†…‰„…Š‹‚€„†�Šˆ‡†‚‚€ƒ…„€…‚€€€zq]8 '!/CX]Q5  (>Qftywx�ˆˆ‹�ˆ†„‡��“—˜œ˜œ™œ˜—™››� �œ ¡Ÿ ¡¡ž¡  ¢¡¢¡¡¢¢¢£¢ ¤£¡¥¢¢¤¥¥¤¦¦£¥£¤¥¤¥¥¤¤¤¦¦¤¥¥§¤¥¤£¢¥£££¡¡¡žœ˜‘|S5-&,5:8=A<;780,+,))*(,+*''(,&*,*',-/4D@:3/045355736DC?C?FC=CHJGGBC<8=@>CDGBADCHIFFGKTWTRRQNOJHEGD@DLLLQUYTTUSXVVZ[ZZ^^\]XYULGDGCHINT_ZZTTUUOMKG@AEAAB@EJGGILNRW[Z[[\aea^gaWQOMI@6'%#('(%((''! "" ,BXmy}}}xx~wwyyy}zxvxy{yz||vyyž ¡Ÿž £¡¢¢¡£¤¤¥¢¡¢š™–˜””‘‘�ˆ‡ŠˆŒ†ˆ†Š†‡†ˆ…„ˆˆˆ„…�‚„„‡‡…ƒ…ƒƒƒ††…†‡…ˆ††…‡ˆ…„ƒ…„ˆ††„‰‡„€…‡…‡†�‡�‚„…ˆ‰‡‚…ƒ��‡…„€…„€|~{xpX7"! !0FW[T4#2AXktyyzƒ†‰�ˆˆ††‰‹�”–ššœ››šœ™—œ�Ÿ œž   Ÿž¡ ¡¡ ¢¢£¡¡¡¡£¤¢¡¢¤£¤¤£¤¤¥¥¥¤¤£¤¤¤¥¥¤¥¤¦¥¥¢§¦£¥§¤¤¥£¤¤¢¤ ¡ �›”‚c?,&,4;;:=;>99//.,-*+,+,))(,+,-+++++,7B?61/239749534=@BFG@>;8?EG?;CA>@BDCCBDHFHFA<;>>ADCD@ADGGHEGIJLTVVURQQMMFHIIFGJHGOVTVWYTXXZ[YX[]\^^`]VOKGFGJPSWYURSRTMONEEFIDACEJMMKIKORY\]b]\abc`gb`WLMD:-(%'()%((&'%%$%%! #0Jew€�{||zzz{{z}€~~yv{{||yzy}   �Ÿ¢¢¢¢¢¢¡¢¥¤¢£ ™›——•““‘‹�Œ‹ŒŠ�…†‰‡ƒ†ƒ…‡‡ˆ†††‚„ƒƒ„…‡„…†…„ˆ†‹„…‡…†ˆˆ‡„††ƒ‚ƒ‡‚ˆˆ‰‡†ƒ‡ˆˆ……†‰„†‡†„ˆ………ƒ‚„‰†‚ƒƒ��{{wmW=&/,!-E[]N6"$3G]nuw|~€„‡Œ‰‰‡…‡Š��•—˜™œœ››¡›››�ž ¡Ÿ�¡ ¡ŸŸ ž�  ŸŸ¤ž¢¡£££¢£¤£¥¥£££¥¥¥¥¤¤¤¤¥¥¤¥¤¥¥¤¤¥¤¥§¢¥¥¤¤¥££££¡¡Ÿ�™–‹sG0'39@B8<:><803-.--,.)*,**,/0/,,/--3;A96255687799<>>>?>CCABCDIHJCA<><<@B?E@AFHIIMIJJNOVYXWRTSPLLJNLJJEFKORWXUWZWVYW[V\[]\`_YYQJILMQVXSPMSPPMKLJGHGE?BFMMOGJNTWZ]bd]]__`bhcYXTK@5+&$*'*$*.('&&$%&" (9Pj‡„||y{x{~{{}|}||x{{|z~||€ �ž¡¢¢ŸŸ£££¢££¤¡ �›Ÿ›“—–•��‘�‘ŒŒˆˆŠŠ‡„€†ƒˆ„„………„…†ƒ„ƒˆ€„………†…††„†…‡…‡ˆ‡‡‡…„ƒ�‡…‡‰‡„…………„‡‡……ƒ††ƒƒ†„‚€€ƒŠ†…„‚ƒƒ}zvlX5 ( +BW`R8!(4Ocry||}€†‹ˆ�‡ƒ‚…��’”——™�ž��ž™šž� žžž    ¡Ÿ›Ÿ¢ž ¡¢ž¢¡ ¢¥¢£¤¢££¢££¢¢¤¤§¤¦¥¥¥¥¤¤§¦¤¥§¥§¥¥¦¤¦£¢¤¢£¤£¡Ÿ�ž�™’xW6/5=DE<?9895593889:=@;;>>C@?@=>?DB@;;<=>>>>>@DHKE?9<::;@>BBEIGGGNKHIKIPUWWPVVRMPNSNNOGGIPPUWWY_[ZXTUQV[\Z\b[]VOOQLSZSKNNNOMNJIIFGICBBKMMHHKOW[]egbc_bfdagdWSQJ?3)'(((&(&.*)')'$&&  +>Zw„Š…{z}{y~€||||z~|{{{||y�žŸ ¡¢¡  ¡Ÿ¡¢£¤¤¤ž  £�˜˜š–���—œ‹†Š�ˆŠ…‚……†„…‚‡‡…†‡„†…„„„„‰…„…ˆ„…‡‡†‡ƒƒƒ‡‰†††„……†‰ˆˆ‚‚†‡„‚„ˆ…‡†‡†…„…„ƒ�‚††………†‚ƒ~}~xlU/+EU\Z;#%#,9Wrs{z|€…‡‰Š…€„†Ž�’š™™œ��œ�œ�› �Ÿ ž¡ žž¡ Ÿ ¡�¡ ¡¡¢¡¡¥££¢£¢¥¤£¢¢¥££¥¦¥¥£¦¢¥¦¥¤¤¤¦¥¤¥£¤¤¥¥¥£¡¤¡£¤¡ �Ÿ››˜’‚c@/5EGEB>;<;93,/,.0,.+1,,//22//.0,45@@=88849534=89;>;?>?=?B>=?D@>C:9<;=;9;>;=:<:=@=DHEGJJGGKKFMQSQSUXRSPOTNONNONQRTTUZ_\ZXXOPRW]]^^^]YSSSQTQPMNLLOMLMFEFIGGEEFMIHHHPT[_agcghic]aibYSNG:0+&")%*$,,*,*(*%%""#3Ie€ŒŒƒ~xvz||�|y~ys|}{yy{|z{z„Ÿ ¢  £  £¡¢¡£§¢¢�žŸ›˜–š›—ŽŽ�–“Љ�ŠŒ‹‹„††„„ƒ„††……„………ˆ„ƒ†…ˆ…†…††…Š„…€�„†‡…„‰†‡ƒ†††ˆ…‚……‚€ƒ†„…„…‚„‚„„‚‚……‚…ˆ†‡ƒ}|znY3 *;"*>RZS7##A1)@_sty}}…ˆˆ‡�ƒ†�Ž–™™šœœ�Ÿ�� ŸŸ�žŸœ ŸŸ¡ ¡ ¡�Ÿ¡ ¢££¢£¤¢££¡¤¤¢££¢££¤¦¥¤¥¤¥¥¥¥£¦¤¤¥¤¦¤£¥¤¥¤¤¤¤£££¢¢ Ÿ›˜›—”ŠqM74?EHCA;9<;42./1..,-42//.020//7229?=:<:68<828<479==>=@;@B?<>;A>E@99<<9<<9ADHEC??<:;@?;?DBEGHJHDGGGGHPSSQRNOOLQONPRQTRVTWW[[^b]^SQLRTZZ[[ZXWUQRNRRKOOKJPNLIEDFHFCGKHHJLJJPZb`cfdhi`]`b^VSLB4-*(!&$))*+1.+**%"#! &?YuˆŽ��€}vw{ƒ|x{|xv|z~xy{|zz� ž  ž   ¢¡¢££¥¥£žžžš˜˜™˜•‘Œ�‘ŒŠ‹ŒŠ‡Šˆƒ…ˆˆ……†‰……ˆˆ‚„‚…ƒ‚ƒ……‚„†‡ƒ……„‚‚„ƒ…†„†…†‡„‡†Šˆ†ˆ……ƒ…††‡†ˆ‡€�„ƒ„……��ƒ†‡„‡„„€xmV8"'!1?UZO3!!,*1Heqs}}�~�„„‹‡‚�†Š�‘—–››�›ž�Ÿž¡��ž   ž œŸ ¡ œ ¡Ÿ¡¡¤¢¡£¤¤¤¤¢¢¡£¤£¤¥¦¤¢¨¤¤¦¥£¦¤¥¥¤¥¥¥¥¥¥¤¥¦¢¥£¤£¢¡¡ ¡œ˜———”�|Z?:?CDD@A?::5-0/0.,2-241-/00201765:9<9:95::797653;8==AA>EFA<<==AD=>=A>>>=;>FKICGDC=@AA9=@@DDICGDFC?GENPVSIIGGNOPNMPQTYVUU][]```\YUTPMQVVYSQQQOPNQNNQQJHKLNHGEIEFGGJKFJQMKNZ_^fhedc`][[WROK9-,+''$%((+-0-()'&!$"!/JeŒ‘Œ†~~xx{}zuvyvz|||zzw~zzw| ¡ž¡�  ¡¢ž¢¢¤¤¢¡¡ œœ˜–•™›‘��ŒŒ‰‹�‹‰Š†‡†‰†††…ˆ„ŠŠ‡…†„€ƒƒ†ƒ‚……ˆ‚„‚†‡…‚‚„‚†ƒƒ‡††‚†‰‰†„ƒ„„ˆ…„†‡‡„€„…ƒˆˆ„‚�…„ˆ†……€~xoZ4 -@RZN8&7Ohsvz||€‚…‹Œƒƒ‰‹�’•—›œš�ž£žžŸ�� ŸŸ�ž� ¡¡  ¢£¡¡¡¡Ÿ££££££¡¡££¡£¤¤¤¢¤¤¦¤¤¤¦¦¤¦£¤££¥¤¤§¤¥¥¥£¥¤¤££¡£¢ž›–”—––‘†fC99>>?BEDD:401*/+./1.42,/..0536516:779:5:<96<78999?=?@ACBC;<>A@E@=>AC?>>==FGHDEFDDDDDA@;ABHGAECECBBEHPRRMGB@FHELOOLTX\W\\a\^]`[Z]]STMQTOLNHNPMMOOLJMMJIMOIFGHHHJJHGCHKLPSU[[afaca\Z\\ROH?7.))*'&"*)-//0*%"$%$!&9Tpˆ‘’Š‚~zuw}}yzxzy|y||z~{{wyz|žž¡�  ¡¡Ÿ£¡¢¢£¥£¢¡žž™š›š•����Š‹�ˆŠ‰Œˆ„‡„‡‰†‡‚ˆˆ…‡ˆ…†„ƒ„…ƒ‚‚‚…ˆƒ……†„…ƒ‚„†††…†ƒ‡†‡ˆ‰‡‡†‡ˆ†‡…‡„„…„…‡…‡††„ƒ……†…ˆ�‚ypW8!-Titz~}~|~‚…†ˆƒ„‰Ž‘—˜š˜›��ž¡  �Ÿž  žŸ�� ¡  ž¢¤ £¢¤ £¤¢£¤¢¢¤¢¢¤£¢¥£¢¢¦¢¥££¦¤¦¦¤¤¤¦¤¤¤¥¤¤¥¤§£££¦¢¢ ¢��˜‘’’“—�qP997:8CKKG<1./,,0.3101/.,.36561134658;<:9>=;:<9:>;<;=DBEFHD>>==G;?>CBB@>@ECGIIBB?FDEHFCA=DHIDDGG@@>EELSOKEC@B@CILLQUZXY[Zb^_`a\aa^]ZUTSLHHGIMLLNOLGJPLKJJJCDMLENGGDFHEMITY\_eaa^]ZWXVOPF;2..)&,(#**+//--%""!-Kc}�‘‘Šy}zvw}y{zyy}zy|z{v|wwwz��Ÿ ¡¡¢ ¢ ¡¤¤¤¤¢¡ �›�›œ˜‘ŽŽ���–‘‰ˆ‰‹ˆ‰†‰†ˆ„ƒ„„…„†…………€‚…ƒ�‚…„‡ˆ„…†‰„…„…ƒ‡††‰‡ˆˆ‡†‡†ˆ‰†„………‰„„„†ˆ„‡‰‹ˆ…„„‡ƒ‚‚€~�~~mV5 (DMMF:;4+.02//001310573873314347><99;>@7;=?<=<@A?ADFD@@B;BCA??@BBBACFIFHFB=?BB@DG@@ADHIEDCHDA@EHJSLLFC@A8=?EJMTZVV[__^`__Y^__ZZa]UOPH?GNLLLOOLLOLIGKGEEJJHNJKFHKEKMT__bbdcb^`^VOMLC61/+**.(&***1-/,%!!%;Vt„’—“‹�~z|vz€yww{w{|zu€zx{vvv{��ž  ¡¢Ÿ£Ÿ¢¡¤¡¡£¡¡�š˜ŸŸ˜‘�“‘“’—�…‰ŒŠ‹‡‰�‡‰…‚‡†‡„……‡…ƒ�ƒ…ƒƒ„�†…†„‡……††‡„„‚……ˆ‹Š�‡……†ŒŠ„†‚‡‡‰„„†„…„ˆŠˆ…ˆ‚…ƒ‡‡�~~…}{o\4&9LPM7%0 5Obmr{~€}�€ƒ‡‡„ˆŒ�“––šš›�ž ¢£œ   Ÿ¡¡£� ¡¡Ÿž£££Ÿ££¡¤£¡¦¢££¥¢¤¥££¤££¤¥£¥£££¤¥¥¥¢¥¤££¦¥¤¢£¤¤¤¦¥¢¢¦¤¡¢Ÿž—�ЉЇˆzaH67=AHOOC=GC//-/*,/150-14:84463450657?8567>99=;<<=@??<>AA>?@?@CDCAAAACC@GDC?>@:=B=8@B>ABAGGDCEHKDJIKKJLLFDCC<43:AGKLLRWZcaY[]YY_\Y]_^^XTO@CLLJNQTQPONIILNQNNLMJNOINNHJSYdgfdbag_\[QNPJC4/-,.,((&)(,-,/*&! 0Jf|Š–™’Œ„{yz{y|yxwu{|ww{~|w|xxxuŸžŸ¢  ¡¢¢ ¡££¤¤¢¡ š˜™™š”•“””—�‹Œ‰‰‰‹�ˆˆ†‡‹ƒ…‡…ˆ‡‚‡‹‚ƒ„†‚……†…††ƒƒ…‰‡…‡‡‚…„ˆ…ˆŒŒ‡…ˆ…†Š……‡‡‰ˆ†‚†ˆ…„‡‡‡†…�††………‚��|xq\5  ,9HNF0!$$$8Qeswz|�€„……ƒƒ„�‘––š˜™›�œ ¡£Ÿ�ž Ÿ£ ¡ ž¡�Ÿ¢¢¡¡¥¢£¢¢¤¢£¢£¤¦¤£¤¤£¤¤¤¤¥¥££¥¥¥¥£¤£¤£¤¤¥£¥¤¤¦¤¦¡¤£¤¤£¡¡ž�𒇂††�xcP:46BILI?9<>00/0*30021/56399236955677:;55589;?>73:==;>5;>=?A<@CFABC?ADC>FFC;;78><8;98=>?@EGCEDFIJFLLHHNHHDJJ@80258@ACIKV[^]YYYZ]][W]_[WSJGDJNLOPRRSPQQNMTURMORLLLNRNHJP]ekdabbcdZUQKMJ>3/0,-.,)%%*.,.**# (:Xp„’—™”Œ€zuz||w�z~xzz{v{|zxz|ytsŸŸžŸ Ÿ ¡££¡¢£¢¤¢¢¤�›ž›—œ–”“–•Ž��ŒŠ‰�ˆŠ‰ˆ„ˆŠ…†ˆƒ‡…‚†‡„‡†††……††‡‡…‰ˆ„‡ˆ††‡†‰‡‰‹Š‹‡‹‹‹‡†‚ƒ„ˆŠ‰ƒ…†††………‡‰‡ƒƒ„†€�ƒ‚}~wvY5 (;IK?+#+>\pt{x|}€~|~‚‚‚€ŠŽ””˜˜›˜œšžŸ¡¡žž  ££¢¢   Ÿ¡Ÿ¢¦££¢¢£¢¦¥¤¥¤¢¢£¤¤¤££¤¢£¤£¥¤¥¦¥£¤£§£¥¥£¥¤¥¥¢¥£¤¤¤¤£¤¡¢ ¡ �‘‡|{zrdWD53>HSG?5314+0/2000439:7688356668:98:=67:999;9515;>;:68?;@A:@E@@A@?DG@=@>?DDHLFIGFFINIQJGGA610159;>DNTRX]\WZ\\UXTVSNHCCHGOOQQPOTRQSQTU[SRQPOKLONNNNR[ch_`_a^[\TKIND700+.,)*'%%',)'(!!"!-NiŒ“™–Žˆ€wvzyzxy|~}x|{x{{{{yxzwxu  ¡¡ ¢ ¢  ¢¤¤¢£¤££ž›™™™ž•“““ŽŽ���Šˆ‡Š‹‰ˆ††‡‡†…І……„†††Šˆˆ†‡ƒ‰…††ˆŠˆ‡‡……†‹‹‡ŠŠ�‰‡‰��„„…ˆˆ‡‰‰‰„„†…ƒ††…†ƒ…„‚……€€€�€zpZ1("%5DI<+#0I^lvv{}ƒ€|w|€…‰Ž‘––™™š�œ�Ÿ  ž¢ž  ¢ £ ¢¢ ¡£¢¡£¤¤¢¥§¢¤££¤££¡££¤¡¥£££¦£¥¥¥¤¡¥¤¥¤¥¥¥¥¤¥¦¤¤£¥£¤¦££¤££¢¢Ÿ�—†wrttkaYG74:FKH=5/0200/680147956;;30598:88997;<;9966:9559<:8;:;B@?A?@@CBA:>=CC>>?B@C:5/47789<<>??>BBACEHBFDGHHNOLHHLI<72.,566?CFLTTZXYWZXTNNPMHBCHIMQQRNOSQRPTV[YSRSTMGHGQLJLV\b_]`__]WZQMJE81,-,/)**'(''*+%$%!)DFHB<@CDD><>?@@B:415:9:;==?>CDGCDC@CDGHHNQOHHKKJG=96//86:DDBGOWXTRTVVMLIOKAEJKQPONNRYTPNR\[VSRPPQLFCFJGNZ^^X\``\XVURHF?6-')/-*)+*'*()$%%#!'4Lk~�–™›’†yswuwvvvwz~zwwxv{{€||wyŸžŸ¡¢¡¡  £¢¥¤£¥¤ �›—˜•––”��“Ž�Š��ˆ‰‡ˆ‰…‰„†‰‡ˆ††‰„‡††„…‡…‡ˆŒƒ„„‡‡‡……‡††„…†ˆ‡‰Œ”‡†‡‰Š…‡‰„„…†‰…‚„„††‚‰„……ƒƒ„‚ƒƒ„‚ƒ�~|lQ.#*!+6;1% :Ultw}|}}x{~~€ƒ…‰‘•˜–—™››� žžž ¡  ¡¡¡¢¡¤ ¡¢¢ ¡¢¡¢¢ ¤¤£¥¤¤¤¤¤££¥¥¤¢£§£¤¤¦¡£¥¥¢¤¤¤£¥¢¥¥¡¤¥¡¦¤££¦£¤£¡¡¢œž›�w_Z_^SF?739BD>:236232,/14635;=99=1,.68:;;;;:::9<:667737=>;;99:BAAAA@BHHDAGGDA;<>>>?C@85568=:<=AAABDDEAB>>@ILKOPNKMIEEEB@;4779BCDCKMSKMRVVNEIIJIDJLUSOJMUVWSMRXXOTVPSQMIEGIKRV]\WX_[VVWTOGF?-'+(/,%-+**(()&"!$ *>Xqˆ�–››’…zu|ysv{z|w~z{txwx{}}{|xx||�  ¢¡¡ £¡¤¢¢£¤¤¤¤Ÿš™™–••–‘–š���Œ‹‹Œ‹ˆ‡‰ˆ…‰‹Šˆ‡‰†‡‡†‡‡Œ†‚†Š‰…‘Œ†„…„‡‹‡„‡‡ˆŠ‹‡Œ�††‡‡ˆ‡‡‡†ƒ†‡‹ƒ†‡†„†„ˆƒ…†�„‡‚„‚‚„€…‚zjM+&-1( '=_pv{~{{||}�‚}€ˆŽ’–––˜—šœ� ž �¢ ¡ £ ¢¡¡£¥¢¡¢Ÿ ¡¡£¢¢¢¢¦£¤¥¢¥¢£¡¤£¦¥¤¥£¤¥¢¦£¥¤¤¤¢£¦¤¤¤¤¥£¤¥¢§¤¡¥£¥¡¡£ ��š•bOQTO>4359DA>825572230/:745?@8790-,59:::<;=?869;555/5:8<=:68;>@@BADBF@DEFE@=@@=9::FF>95287>;@@@?BACDDBDCEHHNOMOLQJFLEILE:657ABCEFIJMISQPNEGFGHFHNSMNKJRSPSPPTRNNQVUOLEGIPTUY[]X_\[ZTSQMIE9,'*--.))+*-+(-)$ $7Jcw‡�—š–�„z|zur{|{~xw|z|yytuz~yyxuxx¡ŸŸŸ¡ŸŸ£££££¡££¢¢�›œ——”–˜•”•�ŒŽ�ŠŠ‰‹‡‡ŠˆŠ†Œ‰ˆ‰Œˆˆƒ‡ˆ‰‹†‡‡‰ˆ�Ÿ‹ƒ‚…„‡ˆˆˆ††Š‰‡ŠŒ†‹‚ˆŒƒ…‡†ƒ†ˆˆ‰ˆ…‚†‡‡„†„‡†‡ˆ…~�†‚„‚ƒ~viH*&(&  $,B]ntuzyz|}€�|y}‡‘”“–——™šœž�žžž¡¡¡¡�¡¢¡ ¤£¡££�£¡ ££¢¤¡££¥¤¥¢£¤¢¢¥¦¢¢£¥¦¢¤¦¦£¥¤££¤¤¢£¡¢¥¥£¤¥¥£¥¦¢£¡¡£Ÿž›š”ˆiLDJI;./3:BC@95253533245758;<885,-/:;57:97:>869;4234578;:95::8BA>?BD?>CACA?>B<=77;CGD952279<@AEDB>DDEEFHGFHNOQSNNKKJHJMPC>>;DCEPSSOGLRUTPOOQQSQOTUNLGFGRTUT\[YZ\[]VRRLNE7*&*-..+*(*.+(20 #+>Qh|ˆ‘•˜’Š~yy{xwx~{xyuwzxw|uswyyzxtzwŸž¡  ¡  ¢¢£¡¤¡¢¢¢žœ�˜—–”—–”‘�‹ˆŽŠ�‹‡‡ŠŠ†…ˆˆŠ…ˆŠˆ……‚‹‹‰‹„†ˆ‹��‡ƒ‚„ƒ„ˆ‰‰Ž‰‰…‡ˆŠ…‡‡‡…†‡‡‰…††ˆ†‡…ˆ‚‡…‚††‡†ˆ…‚ƒƒ„†�‚~weK+$" 2*0Fbjntvz{{y}|}yy€ˆ�••—–——™œœŸŸ�ŸŸž ¢¡�¡£ž¢¢¡£¢¡£  ¡ £¤¡¢¢¥¤£¥££££££¢¤¤¤¤£¤¦£¥¤¤¤¤¦¤£¢¢¡¥¢¥¡¢¦¥¢£¤¡¤¡¢��ž›—ŠuT>>?90+3=DB;<3037222016678;:7760+15947986:=<7670545;46:<<=?<:BBC>>BBCBCCAD?@>>7877BD>335479?BCDCCCDEFJLLHILPUWRQTQLGHLSQGC?@D>B@>@@GIKFHDFAAFBCQUVROPVUUQMJQXUSUTTOLKLKOSSS[\XY[[UWUULLE5+)).00++,'--,00$  "/EZo�‰�˜•�…ywz|xzww{rxvwvwy}xvy{wwvvuy�¡¡Ÿ¡¡¡ ¡£££¡£¥£žšœœ›––—–‘‘“����ŽŠˆˆ‰‰Š‰…………‡ˆ‹‡…„ƒˆ‡‡…‚……ˆ‡……ƒ‡‚‚‡ˆ‡�Ž‹‰…‡††‰…††„…ˆˆ�‰„……‡…‡…„ƒ…„…ƒ††„†‚€ƒ‚‚‚€€|ueI*"#$"3Qgnsuvvxxxyywyy~‰Ž”—•––™œ›�žž�¢ ž  ŸŸ¡¡¡£¡£¢¢£¢¡  £¡¥ ¢£¡£¤¤£¤¢££¢¥¤¤§¢£££¤¥££¥£¤££¤¡¥¤£¢¥¤¤¤¤¡¢¢¡¢žœœ��˜�xZ>/206/5=@>:://34/,-/084959556//*/83388687:;:31333959:99<>?;;?B@A?BCA@?>7<:668B>67325:>D=B@DDCEFIINLFJNNVUTTUNIGKORMKDADB@=>;BIMEHGHCBDC>BJVRRPRSTSQILRXNOOXTNMKRTQRSV_[[WXV[RSOOIC2****,,*.,'((+(*%"(8N_uƒ�“—–��||zxz{vxuwzwvwux|zxzzvvxwz~¢¡ž  ž¡¤ ¢£¢¥¢¤¢Ÿž�žž™—š•”•™”•�“œŽ‡ŠŒŠŠˆˆ†‡‰†‰‹‡‹ŠŠ‰ˆŠ…‚ˆ………ˆ‚…‡ƒ†ˆ‰ˆŠŒˆ†‡‡…‡Š‡†ˆ††‡Š†…„„‚„…„ˆ……ƒƒ‚‚ˆ†‚‚€��„�ƒ~|~teF*#( #$AVhqsrsxyyyxxwvw€ˆ�––™•—˜˜š›œŸ žž Ÿ¡¡�¡¡¡¡£ £ ¢¢¡¢¢¡ ££¡¡££££¥£¡¤¤¢¦¤¢£££¥¦£¥¦¥¥£¤¤£¡¡¡¦¢££¤¤¤¤ ¢¡¢¢žžœœ˜—”ƒf@,(-.49??<9>@<=;:>DE@ACAEFDAA?;99=;967;>:AGJDDGIGBGA;BKPPMQOQTWULKQRONPRSOUGOVPPTV]\[VW[[ZUQMG@/*&+*,(*+,)')%()$ %0CP_s‡�””‘‰�{{|z{vzt{zxyyxuzxxwxvvt}{tz �Ÿž£Ÿ¡¢££¡¢££¡ £¡œ�£™—™”’•’˜•‹�•‰„Š‹ˆ‡…†„†ˆˆˆ‰Š‡‰Šˆ‰„…Š’Š„‚„‡††††‰………‹…‚‚‚…ˆ„‡†…‡†††…ƒ„‚……€…‡ƒ‚�„„€‚‚€‚„ƒ€zqb@& +>Vmlrruvz{wvsuvx‡�“•—•˜˜•›œ›žžž �  ž  ¢žŸ¡£ ¢££¡¡  ¢Ÿ¡£¢¢¢¤¢£¤¡£¥¤££¤¤¢¢¢¤¤¢¢££¢££¢¢¤¢¤¢¡¥¤ £¡¢¢¡£žœ�™—š•’…lF'!#(37><<952021.,56243356<82/-,*14559:79589:7;527=??=:=B=<=<;CGHCDECCBBA><56=>=97:=<:6157:?GGABHOJNNIDCPVTWXVWTOMTQTMHHB>9>>?CFHCHLIGB>;FMPKOQQPQUVJNPUOMMJMMNJLKNSYTYVTWZ]_Y^UHE;-'')),+(,(()*#%%$ )8GPbu‡�”–Œ†€|xwzzzuvv|zy}yxvutuwttxv|xw�¡žž   ¢¢¢¡¡¢££    žœ•™›—�”“‘�Ž�‹ŠŠ‰Œ‰ˆ…‰„…‡ˆˆŽ‹ŠŠŒ††„…‹‹…‡†ˆ‰‰‡‰Š†‡†…‡†�…ƒ…‡ˆˆ‡†‰…ˆ‡‡…ƒ…ƒ„†‡††ƒ~€‚‚z}ƒƒ„‚ƒƒ�{q`B) /A]nnsuv{zxwvvwxx€‡‘‘•––˜”™™›Ÿ›�Ÿ žŸ žžž¡  ¡Ÿž¡ £¥¡¡Ÿ  ¡ ¤¡£ ¢¤£¢¤¢¢¤¢¤£¡££¢££¢££¥£¢¢¡¥££¢¢£¡¤¡¢¡¢¡¡œ ›˜—“•�‡nM. ")5<>=>54//73.,384.22455221)(03548637;:876;<3529=>>;@?=:=>ACDGJFIA>@@BB@89=<>949@>9:468:>DC=@FA@DGIJLNNHHIMUSW\Z_YZRQROPLGC>@B@ELKJIIHGDC734365226A;>@@>CCDHLKNGHJJOQSVY[]ZPIJQOLKCA>CAHLLLGFFAE>?ELLMMMNSSOPKIPWPKHHIFIIHKTTVTURTX\[ZWTTN?3('())#*$.*'%%%# #%5512144133:;<989;:9>>;>FHHID>=??B;;9@>89::8<893369;CD=;;?=@EEDGIJILIILLSSZ\[WNKNMJHGC@@BBEHMHHDAEEB?DKKJONOPROIEGPOOJCGDDGGJMYUUVYXUZW]ZSR[N:.($*%%*'&++)#% " %,8>JYlw‡ˆ†€€z|w|y�{vsqrsssstqmrstttsqpq Ÿ¢Ÿ¡¡ ¡¢¢ ¡¤¡¢  Ÿššš•‘””‘��’“‘…‡†‡…ˆ„†‡Š‡Š�Œ‚†…}�„„††ƒƒƒ‚…‚‚†ƒˆƒƒ…‚‚‚‚…~€€„ƒƒ„�……‚�€€‚…€‚€€}€ƒƒƒ€€~�~~z|}wqhU4#$2Lcmqqonqsrt‚}kpxƒŒ���‘�’�““—›š›››ž˜šœž�›�œŸ��ž��ž œžœž��ž� �¡� ¡¢ ¡ ¡Ÿ�  Ÿ ž ŸŸ ž¡ Ÿ¡ŸŸžŸŸ ¡ žŸ�¡œšš™•�‰Šˆ‹ƒrX=-*3<86B6*+')-/11122/0,,+((*-+&&*.41,028:600/.100576<8889697=:?:::<>:76526524387;?A<857>>EEH@@A>D=>CKKJOOMLLNICABHKGDCC@:EIOXTPRVTYXUURRT[I4*&!$%%*$&&&(#!%07DHZhz€�€{zyuusuwuupqpvokjlnuunnknmpoqlkŸ ž ž¡¢ ¡ž¡ ¡¡¡¡¡›�˜•—•“’�’Œ��‹„‰‡‡Š‚‡„‡……ˆ�…‚…�ƒ�‚ƒƒ‚‚~€€€„�……„€�‚€}‚�‚ƒ„‚€„ƒ~{�€€~€€}€€~~}~~�~€~{yyuncI. %4Pbknnlilmow{nelw‚ŠŒ‹����Œ‘’••––˜šš›˜š—œ—˜�œš�›š˜›�š�™œœ›œœ�ž ���›�žžŸœž�ž›�� žžžžš ›œ��œœ ›�››�™›š˜˜•’‹€€�…�pZB579;89;4)(%(.3,0..4,..(*()(,%+'),.20-05?70.,3/20077;>;8:9<:;56:BIED@:<=696<<78573744455;=8;=>;969@>A=@KGGDIIG?HGGPRMIFFE?=;=A??=>@A@D>@@A::>EKJNGJDCGHB>?DGDAC?:7=FL[RIRPPTTRTSORNE5*"""##'%'%$# !+6B>@@;>?>;:>GHJFCD??;>>@=;8?:<=@><>?ACCCCCB>>>CBBBDFLMKKJKEHFMNQROHIIDDACEGCDFFHGEHIHKEAGHLJNOLKGLOOHGOOLMKJEDGMTXUX[[X]Z]^\[[WKD94264369:9:751.1..148BHOZany‡†z{~~{{|yyy}|z||ywy~€€{||z~~|~ \ No newline at end of file diff --git a/xie/xc/programs/xieperf/images/image.003 b/xie/xc/programs/xieperf/images/image.003 new file mode 100644 index 0000000..73dea5c --- /dev/null +++ b/xie/xc/programs/xieperf/images/image.003 @@ -0,0 +1 @@ +98:88869>>;::9;;::::::<;:;<=>>FKB=>:;;8@>;?B>:=:9;9;9::9::8;::;8;DD9665577567655898889766563664>@;9:;;<:9;=;>>:<;;9:=<;BIGJLNLJGFICDD><;<<;;;::;;==7686645456547865896::6867665576467>@;;===<<=;;8789;::<:9;:9:<<<>@?9:<9;;<==<:<=@BB>@A>?AABCB>D<56553553564796755736534547@AACBB@BC@?A@A<><988::9:<<==ACB>>B@=<:877777:868679966757>;786765665365?A;:78;:;<;<9;;CF865565555664:CAB@>?@>@@ABFHF>886:9:699887:8666797576866><==??>@A?>AEG?>=<<:999888879:8568:9997879;?CIPEHJRYSSSECRSTVXM9=G=;9:>:66756755556466557799:99;::?@=;:<8;<:<<9;>>AGLJDBEFEE@;<;9=BCBCBDF;:<;8::::>::;:;=<<:@@:>>?ADFFLMHIKGAC;=A>;=>;:<9;?96878687788766877778=7797687798759>B:;;=>==@<::968=;<=<=>?@>>==?BB@>=<=>;=;99;ACBBAA@BAA><;=A>>A?@B@??>@AABA>AHHB@<=?;9:;<<;;98:76639;79;==@AAFL=BPXXRLKJLQNPTSO><;>;=ACBEGK^`JDBGHDG@=:<:>DEDB??B>9<=;:=<:;<:<=<@DEGKA578579676868:79<99:895955;79>@=:<=;=><=AA@EDGHDEJKIIMKFKJ@FCB@CA@@CA>BA<<=97:;><87;877977:967897:68>8799888878879=D=8<8<>;?=;:<:B=<>=;>=;>;9;?>ACCCCCCDDA@DBA>:67876876987;:678848857:79@ECADCABAACAAAE?ABA@CC?AB<;89>=;75:8899:7699896996:;88:97B><;::<<9;;9><=G;869:78868969CECCEACFBBDEDHH?;=:9;9::<9:=<9::7:<97:;678;?A?=>CBBBBEIJEAA>><::>@<=:9<>;8<;<=@=>A?=BB?A>8;>==>A?@FPD@BMWVPKNSNIOPUO<6:=A<;<<967877;67697679767:7998::8;A?<=ABAECELJGNLCGGB?BBCJG@A:9:DD:::=8:;9;@?CFGFDCBEGB586667666669879:87:957:76567=><<>?@CFBEDCBC?=;;:AF?BNNKMMGBB@CE?>?>>=?@<<;8:99=;778677867;867867876=767768:77;957:?=<=:=<:===>><=:;;?BDBACCBBCA@B@AA767967865986;:557656958758@CBCDABBABBAB@B?AEC@=::9:8787<>977:8776887869767789:78:84<@97867:659875;A<=;9:9:<;;8;:657649:9<>>?CA@BC@BBACFDBGF>9:::;999;89:=<:;87;9597788:@?>>?ABB@AGHHFC><:=:;@A?A@>@A><>=>AA>@A@?CB??=9:=>?@>==DORPINTUTJFMMOPGTOGFG<::9=<768955976795779578;96998:<;@CHGGGBDIIIMIKMCBGHAAIHHFC?9<<:>GBC@B<<=;ABADDABBAAAFFFENJE:656578579968:;7;7686578549=?DDBDFD@@A====<<;79:;=>>CNOLMIBBBCA>;:<=@@A=::999:<88857877898:95797587:9757958997875:B?=@>;>=:>><;=:;=>?=<99;:::::@DA?@?>>==;=:9;?ADEBBEA@AC?@CAA97676668669789865755867677=?A==>;>DDC?<777548588;<898689569689589857:78;88:79@<678967857969B?:<;;:;:8<:::<=@@>?DA?B>@AA@ADDDDDDD>66:;8:989:98>=9;849:687989;@@?>?BBA@ECCIGDA?>CB?BB??A?;??<;>=B??A@BBBBA?<;:<@=?>?978675657974676:767:98:989;:?CDGKLKJJJILJLKFCCEB@CBBEFB?=;8@E?B@=>FDBDEDDCAAB>=>>DR]PNH:455568748747777743677:>?@BDDC?>?@;9::89988::9:;7:;:??;::::<;=;677785987787568558699446758;89:<8;?>==;:<;9=;:9:99=>><;89;99;:9=D>=>===>;<;<;;>AEEABE@@AB=@CAB>746646854766;76663555789<@DBBC>;<;=:;;:<@@>;6666565457:=977787688667579889979;87:87>=568668778768@A:;;8;:6:;;::@C??C>BAB?ADBBFDCD?789:9:89::88;;9965:969:87:;?@<;>@??DIBBIGCCA?B@;>>::;:7?>;@@@@BB@AA>>=:>?;<@@=CE?BPJDRRONRQKLKOO>>GD:49=77956766::757668646:;99;:9;:?BBHLLMNMIJJLLKILJBC?B?=DGFC>?@CGEEOdPFGFEFFDA@@A@?ABGa‰\OJ>55744863574497<;=??@@ABAA@?@?9788669888:88:99;:89;::AJJMGBDEBB@===>?@?<9:;9<;<<87888698878777766669;8898:<<7;;=:9>>=:89::9:;:;9:9<=;;=87:99;::=<>==<<=<;;>BEEBCECBBB@ABBD?856776766667>978;9;==>>>>AE@>?;9<::8:;::<=:77657576656:>95798469676667779:989:87:98<=66678668:757>A<:98997::;89??>@EECCB?><;98647:9:;99@?<=>>>>>?BA@AAA@><<=;;;??>DE?758<96767757:6577777779<<99<8:;8>ADKLJGGJJJJLKKJJLFKDIC?BCDB@ADFIOU\gRBDHGHIGFDCEGGHKJc�nUNE:66249679><>CABCDCBC?=<9888:>:68;7:9988:99;:9;;::;;:>IKJKDDEBBA<;=?AAB=9;;8:;9;;889778997:78887777:>=:;<;;;8:9989A@<=:8:;::>:;<98<>:;=:79::;<;?>?>>><><:=?BDFEDEECBBCACBD?876885886889@@>@DA@CB?>?99C@98=8;=88;<::=>8695896697678=:8768768768777;878;89;78;:8<@778:77679;::AC=;;98:;8:<9;;BGDBBCCBBCAACBABC@@BBDDABDEDEG=:<<;<::;::;==99:888:6=:8;;@EDBBEDBC@;<:779886779=;9<;7=C=;AAB@>=BA>ACDD?><<><<>@BCB?@CEMVTJKHOFHFDC=977786767878;:7?EIKIFHLKHIMJK@@EMIEABC@CD@<>BGLVOADEDJIFHGDEFEDHGIKZr`TLD?87:=>?@@ACCBA?<;8897667889:>978:6:779889:9::987;89:9BJIFDEDAA?;;;<===<>;;<<<@DACDB@BA>CBAAC@867679:99;:AC@=:865655:@>:978=:9;;::9:<8666656655654><67876764765579796599678988;=9887987::9:=?A?:96:::;:;<:8?FEBBAABABA?CBBB?@A@AABBBCBBCDCC?CB@>@=>>=>?<877:88;<<>ABEFA=>>@>=?A==ABBDB<<=;<=@?>B@===:7669;:9:9788:>=CHIKLLNLIILHLC@@CEB=AFGDDB==>DBB?ADEDGGCHEADEF@CDHKODHHHFB>=ABABC?;;77888887878779888>:7788788:7679988778:99::@IJECCBB?<;;:<>?<=9987997<;68988:96969698:89;;<9656876767874:B>879;97:98:6:79997:7687877::=A@;><<;;;:9::;?BAABACB??@A>?CA<::9;@?ABA>988:::<<9767:@>7:99::789:77>DFDAABBA@@??@@?@@A>BBACB?AACDGFCFFEGEFFGHEB>6;;=>>BBCCBDEA<;=<>D<2565667765599897577:=@==@<:<@>?@>>?CA::<7;;;<@A><65=IOKKHJKFGKKEHFC=77FJCDEA?CCBBB>AEDDFCGC@EDJJEKICFHCBJICA?;9889877878::779869978969><77::78789978:97899;96;<;GLJCCDB@=;<;;;<<;:997;<7;?<=@@>@@69;97789;;9;>956668:6896779B?:;:9:8:96:7:79:::;9888769::?B>>:=?>;9<=;=??BDBBCBABB==?@DEAADB@@<:9;;9=9588778766657<=;7776776779>?<97<;:::8;=:C??C@A@BBACCABC@@DGFGGFGIGFFIGGHDBCA>B??BBCGEDDB=9>><@?>?ABACCDF<:<;=<><<>?<:9CPIBILNOLQPPIHDGB96<:976867885677777;;:979968=@FJSUKJLIKHDHMEF?@FGGDFDACAA=?CBCBBACDBDEEEBCEEKFEEGHGC:DD:797687777887989877698886778<<77976776799768::988;99=9BJKEBBB@<:<<;;;;:;;878:9;@A>>@A@?787967976897995776778769676AD9698886977796998:9789868:87=B=;;:;<::;;<>=>?@@?A@A?A=<=<>ABBCDA=;<::<;<<6557665565769A=7;99:889987:=<6655665555659;7676657757554786988;=?ACBB@@9576467678669?@:9;;99:;7:::9AFEEECBBB@BB@=@@@@??@ABA?AFFFEDEDCEFEDFFDBDD@B?>><>@DBDFDC>:;<@@876667549667678667777:>====@>?>>@@BCAB=::<:;;<=<@>>ACHNNLNSNAEDG<8?GA77=@7586665775767755567;;9:::;:87>>BHHMTSPJLKJQLGEDHJKLJHCADBA?@CDCB?=GFGGHJOJELKHGEB@@KLCGF;8;78;88:88;6778:987879::979<<79:899978877989:98;99:;:DKJFDBCCA<<;<;=<<::::;=<;<<;?@:9887:968::9898676778587775?F<789:78:88677:88:8:87:97898=B?=;<<<;<<=>@CA?BBCA>=:88977;CEEFDBCB>>=A>?<7667675574489@A8:::;;88:9::<=967855636766;;7886668779677<<>B@@E@>>?>;765786786777?B:8::;:;:9;9::BGFGFDDDCDCF>B?>BB>@C@@CBDEHGFGGFGJHBEGCB@?CA>BB?=DBCGGHGF@:;=?>97687587677678768:::<:?>?>>>??>@@AEEFE?;::<<;<>>?:=GGEIMKNPPKHGD88DE=55?@6688785676876787667;98:96:::8=BGLLGGNPKMJNSJICEFACFDHF@DBADADGBBG?DFIJIFCDB@@EIEH<;CEFFI>999;:869:97:98:9889979:79:9LNECBBA?><<><<>;8;<79;;9==9;;9>B:58:8:;;9887:<75:56966:9776>F?987:87;:9::87:98:98:967:87B?ABCCDEB>:88;7987886:BGDDGE@BA>A@>>B867656976765:B>:;::;;9:<;:;>?<:89865855768>;65777;::>?>?A<;>>=>==>>?>?A<787898758857>B>:;:;:8;;:;;:@HFDFDDBDB?CC?CB>AA?@BAADFFGFGCCEBDDA=??>??CBCBAA?>CCAEGGE@;:>B?586785768689:88;88:::><=???BBACCCE@:=<<:<=<=B=8BF@FLFJTKIMHC;;BA>87@@4486687577877769737;::<;99;8:9?ELOLKMNJLLLLHLHFFAAGGFIJIFDGEHJGGDDECA@B@?BA>@FHD=??E@EDEB;89::89:8<<:89888;87;:799;9:A:;:89;988879<;9899>:9<;;?IKHEA@A>==;;<;;8;;<7;<;<<::;;8?C;9988:88;8889<;775:9:58;:57;D?:;:::99;8887;89:<:;968:::;:@CDBDCBBFE@AEDC?989;99879897:ADFGGEB@??@@=AB878788658968<89=<<;<<;;;:>=9;989959578:=::==<<@;;:;;<>;==>@@>=@?=>@?>;;598:988789=>?BDCAAB@?@ACEEDF@;=@B=79789:9977878;;78<;>?=;<@ABCCHLHGKEEGBDEC::A=7788889487777877878=;79=87;89?B@>@BACFC@A>?FDABGC<:879989:97:;7;869;99;87:<9AALNGB@=:==8;<9:;88;=77;99;98;<88?=6;:6::78:978;869667757:8779BA98::78;:79:7:;89;988998<=<@ACEFD@A>?@>?CDB=::78;78977:79?FFFGCACB=@B=?B:77567875885:?>;>:9;96;<:9:;<=;:;:67663686<=A?>?>>?A@7;66:9679769<@@;7;<;<;<:;;9>FFDECABCBAABABBADCDEFFDDB@A@C>???>@?=@?=??@C@A>AAAABBCCCCC=;CC87978:87787989;<::<>;;?AAABBFC?DFFGB:;=;:<;:<@?;=BCCBBFFBGKC?GKG??;;@;68:67794:9777777768=:9<99;;9;8?APQFJRTNGKBECFJGKDCKQSNJHEGNKA>ACC=>B?ABBBBABCDGFBABCDCAEE>9::8889;999797779999:78=;8;?=8886;9897789:<<=A;79777678769;;:7667645868869AB98;77;78:776<98;>=;<>??<9;@A?>A@=9866776643669C=:;9<8<<;::9:@>;<;668655665;=;;::;889<;8>?=>>>@@@@@@=>@>><75877697776:AA=;<;:;;:<;<:=EGEFCCDBCBBBDECEGEDEC@BD@?B?D@>?>A?@@?>>?>AD=AACABBCCECAEF>:CB79976<78798<97;=99===>=?ACBABDEEGFEGFGHA:<>9;<=;???<9:<97>C937877787856976665689889:998987<@DLLLKGIE?AJKFIEFCEGKQNGEGNPIAA>?@BFACDDBGC@BD:5767:859:8869778489789768:6;>:88589889=<:;;:<;:;:9:;=;9:;:;;9?@@??==<=6675669687757=BFGFE@?A?==?:;:8:56553469=;9:9898687::;==>==<@@<>>=<;@;456669847859?A;:999;:9::9::AECCCBCEBDFFECBC@A@>?=>A@??>A>=<@?>@?>@>=?A@;?AAB>@@BBCBCD@;@C75557766999;979:88<;<::=D@BEBCGHEFGFGHF<:;<:;:=>AAA<767<@DABBAFMLDCGFD?@E>78999998::979:879:98799888999;99:;:8DKJF@9:9898988978:7:::;=<:;:8:9;=9976956977;:898568857976856=?9799;<<<@@=;;==>=><877988<9:>A>=>=<>@?@BBB@:576699798865<=8545984545647>=8:;9::888668<>:::7754576369;<;:9999898:9===>===>>>?>==>?=658768868:77?C::<99<:99:7<><=@@;?@=?A?@ADCBCD?>C?65587647:9::888989<:<;<=AADGDEIJGFGFFGG>::<:<;<;9:;89;??EJKIIKIHEICBFBGDCFGGCAAHUYXIIE?EBCED?@BBBA@BDDEDDBCHGGCDH?:98::98<79=:::;9<<:9:879;:LJF@;98:78<:8<8:9;9;>>>><8::8=??:<:6:979896898:778:587987:;@F>:?>;>?;;<;:;>@=>=;::8898;8;?C@=>A>>BA>@BB@;57:9:8:87995=DCDGEAB@>A>>>A>:768777678688>?<98:97875785:@;88946766:659>=;;::;:8<<:<===<>>?>>???B767:86778:95>G=9;;:?>==EIFFECDFAEDCADCCDBBBABBAB@AEBB???@?AB@=>@=@CA>@@>@B@ACCBCFA?D=6885977::99:<9:<;;<<:>??@ABA><:8;=:>BBAC@=<<;:9;B@768767:879888778:88:::;<::@AFDDEECLH@DDJYXNJRB@AEEEAAA?ABAAAABIJ?ADACCEHC97::::9:98;:;89::;;>?>??=<;;><;;:;7:999::;:999;:98;99<;:978===;<:799789:>C>?@@AAA@A??AA<788787788:88:BCCEEA@A@?=><>?;96:767655577??877766767755:=;:87565658667=<9::::88:::;;;<=;>@><=??>==>A668798987876?>?@;=<=;;CGDCCABCBDDBCDCDDCA@>@A@AA?BAB?=>A>@>>???>?DB>=CBACFGFEFGFHHFGC>?<<==@?AB???;7<@AGIFDGG@;;<;8=B<58967687787657678776A?BC@@CFCAHFBCFAEFBWbLKPJEGGFEGCGJGEDJUSKFIFCAHFD@DB@AC@?A@BII@BEBADFEF<8;=99<:78;=::;;=<<99<88::9:;8:=95:;89;99=IIKC98:99:879;9:=89=;;<<79:89<<<@858876986899:<=@AAAAA<=?=<>FCB?:::77;<7;;9>>@>==;99987:8<;66975773577<@7586567675568;;:85576568466<=<98::8:;:9;=:<><=B?<>?>>><;><79::89>CGC?BDBCEEAEFBCEB?A?>@A@AA@@BB<>><>@><>DB>AA@CAABA?@BDAFD77;98775899:9859;66;88>=;6;B;479788765756766:::??CA@A??B@<;9:9:===???AA?A@?===::98::9>?:99:89:99::79<99:9::89:;GJLC;9989:8798:<<99;989:88:89:9<@:56968:=>@@?ABBA@=<><789569BBB><<;97::7;;7=>===;:999::98<@?@CA>@@@@BB>C@8798686786798;CEDDDA?CC?AA?>=975865864677:?9666566666767<<:76578567586:=<:9;989::9;=;;=;;A?=@?=>?::B;8:98:=:8<=:BB<<@?<>DA?B@>A@?@@@?AEDEA98;:66757:878769:78:98<;9AEEGFECDECCCBBED@A@==<=>@=?BEDED>>A??CIDCBB=>:>E=6688787679:;=?AEHHNR><;<:7:989>BBACIJB=@@==??CC?=>?@@ABA???=??>=<;9::9;:8=@;::99::988:9998<;7;;999:BKLE;998998888;<;:998799:8978<:>A<<>A>@@AACB>AA<97447547656:@DB>;<<:9998::7:?<::;99;99:88:?@AB?A@>>BCA?B?;977688776796;CEEEDA@BA>?;;9<>=<>?<>B>;;8::;989767?C=789999:88:::DECCBBBABCADA@DDBBBAAA>=@?<>B@;><=>A==>>=>A@?@??AAABACCBCJG=997676478:6795976999:9:89BCDEAACBA@BA@BDC@?===<=>>==ADHHDBD?:=?@?ACBBDBEH=58869::<>>AAAJPRPPTR97:;867:89>@BACFIE?AD@<@FCOJFFHJGJGIGA??A@@KLC?DACCAAADBAB@AGD::<:=C?GKB>AA?@B@=>?<>==:?>;><::<;:;:<@=::::9;:78::;:78:89<<9:;@JKH;8:;9997:<9;>:7::9<;<=@?@DCCFCBEDA?A=88:68<856776976676:AFD?:;=<::;::<:8>?9:=;<><9::79@CACCABB?AB@>BB<997899687698<@GHEGD>@C@=@A>B=48778:899759C<6:7777667666>=9;87875795679?=;:;<;:<<8;<==<<>?=?A?>@AABEE;;9777749936@B=;:8;989<8:;9BFEDCDCBCDEEEBBDD?CB>BC?AA>@CC>=@<<=ABAA@DCBCC@?@<<>><=>=>EDGJFCA==DDBDFHFHHEKB;:=A@@A@=:::>JMPRNQS6677686:68;<<>BEFCA@?@=?HJJGFJIILJCGF>?B@?=AFECAAEB?BB@@BAABDE999:??@CHB>;;;;<<;<;;<9;=;:;;;<;;::97;>;:::9:;87:89:999989;:8<:@@?@@C>678:669875:79ADEFECA@A@>?>>@;;:7577686678=>7546866765679<<867665666675@<:;;:9::::;:====<><=>><=>@CEEDCFCBBAACCCEC96976:96787:98;:=;89867879?CBDA@ACAAA?>?>>>;<<=<<>>>=AFDEHFFFBDGEEHJGHMHCHE??>:;;8888:;?@@CGFCDGJINKBBCABD@<>ACBEAFD@BBCBAA?@BDE:789@>>CFD?;9;::<;::;<<;=<9<;<<;97997;<;::98:977988868979;9799:9IJI>7899879;;??@?DDDFEGFD@?B@<>BBB>86:6668565885557636757976DD=;;989967757::99776799:9787?@?A>667856:957968>DCDEA@?=??>:985576465465<@7456955664547<<856655666555;:8:979::::9;DB>@@=;:967:869>D<877556556748A?99:879989998>CBAAACCAACC@BABBABA@AA@@>>?=@<;;;=:==<<=@AABA>>@?====??BEC7688998656679679:876677766=<<;==:<>=;<=<>BEHGBBAEFHLOJFF@:;;989898679:DNQOQQN669969:78:679>CEHFCCCFHHHG@ABKKILD?BGECDEDDFJDE>BCABACCBCBCBGE;;89>BDGJE?<99=>=<<;;><;<:;;<;;<98;<:;@=8;:9:989;;8999::9;;79;87GKJA=::?@@DHIKHKHFFAAC@>A?@CA@BBA<:8677669777976775786775585AEA<;968:9789:8:;7:<98;88;99:;?BDAAB?B@B>>?C?:758966886876?FDDIB?C@>?><@?;8:8697656766;?9556666874666;@;67766784665==9;<:=@?@A><=;:8;86:97:;789;B;:97776676785>B;9:99;88:8;:??@@;=<>@?AB>=>?>>?==><<>>>ABFGB88;957:659:8:;88::;9:78:78@==>><>=<<;=?CDDCAAB><989ACFIHFJLHHGC?8:;:7:869::88889999:7:>:EHJEDDBEGGFDC@@@A>CAA@@@@A@@A>=A?=:9976765766986665557556575=BB<::889879777:=:9;:78889898:@AAB@CA@@A?=?B@9676676796684A>@>=6664676466459>:5655465555568==87775565698@AD?>A>:97::999796876899::97;D=875564466478>A;99;:68977;78CC@BA@BBAB@@B@EABBBABABA?=<>AA=@=;;=;<=========<::==>=?BE?76776688588777977:79;76997>;<<<==:759;=EJFCB?HLNOMIEGA;9:9799798999>INQOPN6777688566865=>EMKIJHHKJHD@GBFHILHJKKJFEGFIHGHDG@BFIC@DDEEBDGHC9:;>GJHJJB=;<<<<==:;>:;=9;=;;;;97:<;;=?<;:7:;89;99::::::;<<=CCBJOLGEDDEFDDCBBC@?BBABB?AC?@BC?>C?:;7667678767878755643765777=656665664676<><>;79:<<<><:>C?<<;88:78:99:9::7879878998<@A:55466675576>B;89;79=887;6>>>>=;=<><><>=<><>==>BCE>86787787578:988789:9997799;@D@<=AACAD@?>@>=?>?<:;<;;=B95887;DIGFB>HKINKKEGD=:::;:88888::;=HJIJHA;<;;=<9;=;;<=:?=;?=::<;;;:;=@:;;<:;;7:<:;<<=?@AAA=<>;=JJEDDCABBABA>?BAAB?@AB>=>>>@@=>A>=:8687567668987656665766976CC<:<:78:88:;9:<7:;:;<99;978:??BB@ABAB?@ABCA>958947:65776:BEDEFBACA?A@=?A87:6797667757@?964886764788;@BA>?=;;;8798:A@<;:88:98<76;;88:99:869:79=@A966776676658?@>><<==;=<;==;>??>>BEC=8688778847:87:87:;88:957;:=BBCDADC?<==;<<;;<><<=;<>>>B;9898:EHEGC@GHIGJFDFH=9;:::97797:;=JQNRRS877879994778::?BIMJGGHJFDEAEDHAELE\lXGJGCGCGFGHFGEILMEBDECBECDF>;==<=<?AB@?A?;<=9<<89>GKGD@AFC@DB?BB??????>????>BA>?@A>>979997978978;8468897847846DB>==;:=;9:<:9;:;999<:9;;:999;CC@AB@ABAABA@B=787978787987;BDFGFECCA?@A>?A<:<897468878:?A864874:;9===A?<==89;;58897;89<:8<;8:;85:<79<989989<=B965777594886;C@9<::8;:;<9:7?DBCBADD@ACDBCCBFCCCDDCAA>=@?@>=>==;=><;<>=>?=<>??>@CD<989977875988:<88998998;=>@BCCCAA>>9;=<9<<;=<:?><=>??@A=9988;BFDEGEHGIHMIBGF@=;:;:8999:9;:HMNSUU66777789578669?BILHGIGGEBBBABGBHKH]cTEBHIC@@?>CGGCDBDHGACFDDDFE<:<><=<=::>><>?==AA=>>;>A;<;679968:969:69945875866885AE>:<=99;98;:8;<89;8;988:;789>@DCABB>@B?@C@A?7988868857879BFDDDBCA@A@>=AC::86787679659=@:;<;A>==<9<;<>:88;:7:979:::BA<;;88:89;::9:7799:;877997:>A:877:65776778@B:8:;::;99:;8@EBACBBCBCDEAAEADCDADE@>A@=@A??<>;;=;==;<><;=><<=<:8789:8767968:9:>>@@A;=;9:<8:><;=====?=>??A@87:9;CGEFGEEHFFJLCEG@<<9:<87;99:;:CNNPQS76666896778577=@GJHIHFFEECD?BGBHIHJRMFFB>==>@EEFGIJB@GEDEDBCEFH@:<<><==<;?><>><<<;;=@ADFFFEDCDF>:;;98999:78;999998DKKECBBB?>??>?>;>>==??<>@>>?>=@A??=76666997:88:8655655856;;;EF@=?;8;87998:99;<<89979<;998:BDBBEA@?A??C@BB77:9756747667?EEFFCBB?AB<>@A>8755865887;=@G@=<<;99977979><79<79;;899::A@<<;77977:87:<98;89:999:88;<A@@?<====<;<==<;;><>@=>?CFA;68:77969<==>B==?>????>??>@A@BB?=?<:9<9:<;:=>=>??>B>?B?87:78@EHHHHFJFGHHFFHA<;99:98:;89;:ANONPR66666555686664:?EHHIGCACBCC?HIFILJEEEDB<9<;>CHCDIIJB>;@DCBBBCED?87>BDINPIGC@@<9;9;<::9:<;:<==<>==><;==<>>=<=;<<<>==?@=;886597667868625788=>??@=?CCA>:78;8687:;96=;887978868769BABAA@A?@>=>?B@7687786486546;@DDCAB@=??=>=@>9657778:<<;;?C@:89546544657<;9:98::979776>?=;879987997;787:9788778987;C<655664655644?D=;98:<9:<:;9>@?=:<:;<=;<<::=<9;;;:=<:=?<<>=<=?;=<===<<>==?@@?@>=><89997:98;;==>>=<@>=?=87769LONQP769769;7679888<@DGGFDCDECDCDOLJFIJGDAEC:;=>BIEEEGMLC?@=AECCDBAFB::?BBDJDFHLH?<;;;9;@<>CADCBBAAAAA?==>?CGIIIF<8:87:968:89:98998:<>>>=@;;;=<=>=>=>>@?;967956789:<>==@CA>;:;;;8789:99:<;=<988987778@A@@A>@A@>???BB:675598586647=AEECA@?<>=<=>@@=<>><:<=<;;:;BA998668546646<<9:99;9969988=@?;9:;968899:759998987:98:9:@?647648758866>D@=;:;<:7:798:BCCB?BCBACBACCDBBA>A?=AA@@?@AA=;<9;=;<;<;8;=9:;99>=<;>=@EB>?@@?==:;<:::;<<====??>?><=<88::89:9:;;=?==?@?76789:@HJHHHIJKMLEHEA<989;87986999;JMKLL:68:88?;6;::8::?FHEDECBHCCBCFFHGPQI@>DC??=BJMEDDCIFGA@@AEGDDEBCF=<>DHEBEDHLB=@>>DGDIFFBB?BA><=?=:=>;>BDBHFDCB:8:89;98;9:<;99:=:;HLGD>@A>?>?>>==>=??=<=B>;<87::<=BBB@?@@B>?A><><<=<;>:;;89:8;9:<=?;=;999:7898>CB@AA?@A@@AAAC?876877767:75:BEEGEB@@ABA@??@>?>=>=;=>;;=:@D:98:67967877<<99<9:;:9::99;9:::989999:?D:8996:768887=FB;=;8;;6:;8:<=>><>>:==;<=;:><:>EA=>?@FGECA>;;>:<<=:>><@>=@>====<@BA?B;<<<:;<9:<;;<<=@@?????BC96::8;AGLKFILLMOKGHIF>::9::79<88;;9FKHHK788978=;9799867?DDCDDBCIBAAD=CGCmrO=?BBBCBFJJDDAAFAEB@;>EDCAEBEF;;;>@>>@BHIILKEADD@AA>=><>=<;<>=;<<==?AAB>==<98:87:::;99::9::979FLGC??A?=?@=<><>=<<>>=====>>=?C@?D@@?>>=A?@><=<;;<<<:;<<=<:9CF?>>;::8;99:<9;:=::::88979:7;B@@?A@@BBAAABB<8989678488669ADDFCBB>?A@>=<<<<;9==:<>;:<;>C<88965876986:?:9<;8;;::;:8;B@=<9:=:9;:6;:89:99999889999>B:989768657739GB8;:89::;;:::BEEDBBCC?BA@<@<==<=@AKODBB@AAC?;=?=:?=9<=<;;<:<;::?A@?CFIID@@><=>;;;<9>=<>>=?=;<>=?<;;::::8;<9:;<=?@?<>>CDABDBDE;9??@AEADIIGJG@>@=;<<9<@;<<==>>:<=;<>>@C=8::66:869;9:<98::8:<769CKKE>??>?;><;<<;=?>=@BB?BA?BD@A@>:>=:<>:9><;=;:;>;;@=99AC??=;:;79;9:>98;<98;85987;95>A@?AA@@A@AD;4::65:<7::8:<@CD?;@A:==;:<<9:<99=:9<=::;;=B>77865746975:?:9;88:99;;87:BB?<9;=97997;958;77:98:97897:A:378548548738DB99:989;9;;9:@DDC??A?:??9><@?NXG@AB@>B@;<=<;<<9:<:9;=:<>=@@EEDGGMLD@@>==::9:9:=<==>?=<:;?=;>>;>?;9=97::8:<88;;:>@=:A>=AA87998<89;86;:699789:6@FEFG748757877966975GIEEOSHA>5>JJIEF=BB?BBADFA>BAAEB>?FFB@=<=<<<<;:;>;;=;===:<<<<<=AC:79977:87:;89;88:988;88:=JMF>@>===<;==<=>???<=?A>ACCAA>>A=:<<;9><:<>::=;;>;:=?;;?<9;AB?>;:9889:79<87<<89967997876=B??B@A>@E?7:;79;::9;9:9@BA;9>=:<<::=;:<=8:=89;<::;7>;99;97:8::868;879967966758A<388556568758AB;;:89;9::89<=AA@>=?<=@>:<=;;>=;?B=AE?>C??AA:;<<::;:;<;:<;<99<;8:;78<86::78;87:96@HDEH558866778856755:@IIEIPPJEIPLAHKGC?CCABBABBB@A?<>:89BDB?>==<<=<;<:;;:=;=<<=><>=;<@A:89:999::9899988998898::8ILG?@><>==?=>>=B@AA?>@B?@A@A@>@A=:;;::;::=<:<<;<=<;=;:;;:;>BA??@;=;;:5867666=B?;<<:::<;:=:<=>:9;9:<;9;;7=B<595557769745:<8999:89::999<>;998887:7997788:7765655884;A<696656576447>?9;97::9;9::99A?;>><=>=<=:<==;;=;;>=@B@?ADEBBA>?:;FOQC?DA@C@>=:<=;;<;:<;=>@A?@A@?><87::::;78;:89;88:89::9;:98>EFGI5579768867767769BCCEECBEDCEELPC?ADEBGDDFGEPXRQR\o\AEKKCEFFDDDA===>=>==<<;;>><>?>=>?=>>8;<:8:::;979;98::89;::<:FOIAA@=?BAABBB?B@?>C?BB>@@>?@AABB=;=::><<===<>>;=>9;=:<><=;>BB?>;;<89;78::8>:79;76:999988AA?A?BA@?>?;;=?;8;86;868:869:BA;;>=;=>::;>:<8;98;<8::7::@A=;<>;>><;>><BE>>BA@GJHGDBAA?>><;:;:@?@?=9:<8;<:=<><=>=>?<:>>;:=;9;<9;=;:<:9>?>?C??EEBC?=@@>>@@==:;8;8:;:8:;::<:8;989;88;:9=HHHL6774664576566567?BBDBCCBEEAA@?CEFKHILGGFHLU\[QHICBBCHEFDFCCA>@?=?=;;??CB><<;<<;<;<=9<;=;<=>><=>>><@B=;;9::76::88989;97889:<;;DMGFBADC?>A@=>?@BC@BBA===>>>>=@C?;<=9<=;><;<<=;;<98<=9<<:<<=CC?899779967867<987678868857:>A>A=<<;9=<::;<;;<;;::;::;<::;:::;;;:9;@@896678677658;;:87;989::::<;A=:9898764674667766766555657>@677586676665=<<<:><;>;;==EGD>>CCBCDDFEDBAB=??<=?=;<><:<<:;<::<;;;<::=<<=<<;<<;<><;<:;;;::;:;?>?CCBA??>>;=>?<@AFFMSNHGHE@A><<>:;;@A><9;:8778878769:99;<<====>KLG>?>@CCB>>@?CB@=@==========?A@::;::9::;99::;;9<<9:;;:9;99CC=8679778766769687568898899:;<=;:;;=::==>CFFEECAA>=;<;;=<;==<<><:<><:::::9::<<:?C=:?A;::9:9=:<:9<;;><;<:9:;<:>:;=<:9>?<>?==AA@@;===<:;==>><89769787999:88:86897777978:CHGH7566688547766754BDHIIMIIJGECAABA==;=;<==EA9?C?>B>7;<:8<:<>?FC?<<<<;;<;<;=<<<>>?=;=@==B@:<>8:887<9:;<;;?=<;:99<:?@BC?@>>?@<@@<>?>?A?:<:9:;;:<;;<<;;<;<>;<;=<;<:>G?99769:667758<;7;89;::;8459>A=<:<;;8;=89:=>9676775867875AB;::::::;:<8;<<;;::<::99:99=B<675666676867;;;;;<<;<;;<;:?;656744767964687465575478668;6=:778666667:@@:::8<8::8::9=B>:=><;<;:==>CD?EHDDB>;<>;<>=;><<<=>==><<;;<=<:<<:=<;=><>D?9==@@;8:;<;::;<;;;>@<<=;:><>>>>;>=;<=>=??@CC==?<;;=<<;;>=;?A98:989:8:8:;:78;989::::::8;AFGG5665555665754765:AACDCEEBAGLGIDEEGEFGDAAA@????@><;=:<;:AA;;<==??<<9;>=>=@>CE<<;9:<=<=;<=::=<<<@>>==<<==?B<;;:::;<<==<;88<:7:97::9;AKKB>>=ADA>>@@?A?@==?>?><>?AA::=:9;;:=<:9<=:9;;;;;;:;9:;@;89::9:9::;:9::9::99;:9:98@@DCBDBBB?>?<<=<;:<<=;;:;=;<<<;=>=<<<;<=;::;;;;=>>;B@89>?>:==>;=<<==<>==;<=<>A>@B@<=<<=<<;<<;<>>?8789779996:87::868::896;:99>EFH6676687566568669:ACFEDFEEIJHIGCBDBDCC?AEBAC@=AA=<;<=>>@@>=;:;???=><;=<;>;;=><>>>>?==?>=>>@B>>>B>><;::::89;88;:9;::;=LJGC?=AB@A=>@B>B?>>>?>>A?@C@>AA=;:::<=:;;<<<;<<99<=<;=;;:<=EA><989<:8;<::;:8766776665579@=;:;;;:<8887:<9789676:67:66@C=9:;::;:;<;;::;;:::;<:988:;?=7475766565669=<<;:=:><<;<:@?866656566666875766777666568=8==7764464477>G?88;8:8:9999;DEDGDCFDA@C??C@>>=:<=;;;<=<<<:=>;;=<<>>=<<<:;<:<;=<<;<=;>EE=>CA>>=:>;:<<:<>==@BAA@=?>=;>=:><;=>==@B@=BC=?>>><:;;=>=>==>997897:889;:9:98:98:88:98:;A=?CA@@@>@@>>==>?@>><>=><=?D=9@?>A=:<::8=<;:=?<;><<>><=>=<@@?=:<:9:;77;;99::;>;;=EKGC?=???A>>?A?>B?=>??>@@>@@>@D=:;=:<<;;=;:<;:<<:;>;;=>;>@?BB@<<=:::98;:6:>768678657876:?<;<:;::89768;<;868:76776667>;;<;:=;>?956765863686677685588667879?A<>9465646778>E>9:8;99=>=A??GEABAA@@>>?==>??<<<;<=<:<>>;?>=@?=>>=<<<;<>;;=>;;=>>>;<<:;=>==>>?BB?BC?=@=;;<9;=<=>>==:899869;78<:8:97:<:9:79;86<=>BG877987877;=>@C@BBFGGDCDDCED@===;@??AA>AA?>AA>AB=<>;;>=;=>@?<<<8@?==>=<=?<@?AB??@@>@B?@=>>??==<8;<89;9<;::==>?=CJMG?>?@AA??@B@CB>>B??A@?>@@>@A>;<;;?<:;=;=>AACDBDFCBC@>;:;::;9:::;<>::9675588558:>>:<:;:9;:7679?>778:8877::97;C?::;<;;;;=:9<;:<<<<=>?><;<=A?;77496798457<@=;;>=<><;=><<@:65556936898786588786357769>C<<988799=>?@AEB>=??===9;=;:@B==>??>>=?@?===?>=@@??==<==<=>=><=<<>@??=<<><<@@>AB?@@@?>@<;=>?@@??ABCCB>?===<<<<<>==@A<7;98:;98:;9:::::;98;;;==:??>>?65988<@B@AC@@=;:=?DDC@CGDBDB:>=<>?>>BA>AA?@A>>AA:;<<=>:;
>=>@<9<<<>=<?B?=A@>@B??=;<>=88;99;;:<<<?AJKI?=?@AA@=>AB@A=>@>>A@=?B@>BC?:<<8<=;:<<=AAADDEDGHDJEBCAABD;8;98:;89::8:>87:667668858<>9769:7::8:98;CA:9<::<<;==9<>:>;<=<<>=;=<<;A=56656756887786578668668748;;::?=@DCFFDFE=:;;98985697>><;=<;>=;=><>>=<>?=>@>==;;<>;>?;==;;<><@D=:<789<=?@<;@==@A??A??B@???=;>>=;??AC@=?BAACA=?=;<<<<===><=A@8:::;;98::::99;=<:>>=>==;<=:8::=><>AC?@B?@@>>>@A>=<ED?=?A>>B>@?DF@>??@@@?>@@??B?AA@???@@A@>@C@?>=>???><:<:8:;<::<;=@@BA@IKJB?AAAA@>???@A>A???@B?@B??A@@<:<9::89889:98<:7686575378668>A999<=;:97:98=?9688678:8:96:CA;<<:=>>>>>===9:;;9;:8;;9<<=?9667665866669>><=?<>??;=<:;C<5644666676778777645766764;?BCBA@>ABDDBB@>CC957667786666@?=>>=?@>?>??@><<=<:==<>>=>><;>==??>??<;>>;A?<<=;;=<:>DA=:46888=B@<@???AA?@??A@>A><>>=;=>>?A>>BB@ABA??==<;<<=<=?>>AA:9::;987:;<==;>??>?>??=;>>;<;<:;9:==??<><>=<;;=?A??@AA@==>>>?=>>=???>>??@?=>=<<=>;8;78:99;:9;=>=A?@@FJMF=<>@@>==>>@=??=>=@>?==;:<<::9:77999:99::89::?:365456577569;<;=:;><<:;;:;@=644455555465677546643457=GFIGDC?><>=;;967>A9355675676558@A====><=<>=>=>=>=<<:::;<;<<=<<;<=;>@?>>>=<<=<><=;;::=>=AEA:5246559<@?>@A?A???>?@?>?<<=>=<=<>?==>@@>@@@B==><;=;;<>><>B?;888:;;<=<;;<;::86575455566586778855557565659757DE><==?@><;<99:A=@?@>@>>>==??>=<;;:;<9:9>@A?=>=<==@AAEDBBA?@A?>@??=>=>?>??@@>=>@?>A>?<<<===:99999::;;;>@?><><=@BBDDBBCDADB?A@>?>??CJKIJKJIFCACAA@B@<:9999899798::8998557646869B>78;97877977;>:5898<:;<;879?D@==;:989:99::98:89:99989::;><4775665675789;:=;;<=<;:;::@>65645655746565643799;>>?FJFHE=;:877665655=A:665775676677<=<>>>>?>==<<;:::;:<;;<<<=<;=>===<=<:=<;=?>?>>?>?AC>524454658:>@>?@?@>=>>??=<;=<><<<<@?<=<>@=@@?@=><;<;;;;<<:<@A@;;9<;<<<9876644676767465665776689677578567:8597BEB=??=??;=?<:@A@;A@=>><>A==>===<>;:::=EB=?>=@>;>><>B@>?B??B>?@?>AA>>>>@BAAA?@=>>?=>99;9:=<<>==ACAADABKMGB@>>A@=?A>>@==@@?CEC@CC?=>BDEA@B>??>><@?@JMIILJHIBBBCCBE@;:::;97::99:;:798687666677:B@98::78:8787:A>59<:=<<;<<97?D?<;9;<:9:99::8:<9:<99;:::;=>>978777766667>@DB759666785895=D=787678686687>?=?>=??>?@>@@@@>>=>=;;<<:>>;=>===<<>><>@?@AA@@A@@AA@A=<=A@7467857586=B;;@@AA@?=?A=?><???>>@@@BB@B?===>:<<;>??BDFF<;:;96567688666777779766:7789776776657867685575?EB>?><;<<;;;<<=>@?>>?>>><;=>>?=;;=:>:9<=;>A?=<<==9<<9;@B?EEBC@>@@>>>?>@@>A@?=A?>?@=>BAAB???=>@<=9:<:=><=>>ACBBBCABFLJDA?>AB???ABA@@ACAB@><;:768?>=>:<=;;<;97=C=<;9:;:9988:98::9:;9:;:99::@>766766587676;@=;<=:=:;;<:;=C:4546879<<;=ABDEDA??<99867889776676884;E>58876:686776@A=A?=A?<>@===@@<=>=<;;<<:=<<<<<<@B>AB@@ABA?=;:=<:=?=A?=:B?>=@@?ADGC6665965786676776768768678679:567569777966663774=;;=?=;?=;;==??>@@>?B?;==>>>;;=9;<<=;?><@==@B?@FDADA=A@<=?==B><@@@?A@@AC>?@@BD?ACBDCCA?;79836968ACABA?@@<=?>;>FJLNJHFABAD?@CEB>:88;85::79:7>?878857:55857@A87<97;989966>A:@?:>>;:=86:;?>;999988989;9:;89;;9;<88;;8?@6787476687559=:;;:<=9::;:>?B>;:8;>>BABE?99955746:9:??789767855854;B=7:78676:7666:@B@=?A><>=@==>;;=<:;>:<@<;?A:>@B>625766:68<;:=A@>@>>DC=B>;A???>>@DA=<=???CB@A:<@>;=?<9;:76;CC:7677589557646856767786876786478469677757756775;EC@><<>><<=>>@?>?@>=A>>A>BA>;<=<>A@@BCBAC@AACCCCBBCB?AEDBCB=>?=>?>>B>>@@@@@AA@B>A>?BD?=?=;=><<=<<>AAACDDCCACFCAFJIHFBDEADB?;:?=>DIKKIIDABDB@@CCA@;::;:8:98::9==:98867866966@D;:<779889759=A;@;;>;;;9798:@A;9:;88::8::9:;:9;;9;<8:<<;=@ABEHGFDACA?;<>:8:7:>;7996686588:>B858758:77866:@@<88777698675:BB?>@>=?@=>@==@?A><=A=>??>?=78>=;>=9<=:<@==@<:<==<>BA=845847864?>;=?>AC>?BD@AA<@A@AA>>AB?>?@>?CBAD>?A;577546856:?E?6787679558758956;589759:87746896666677587697669CEA@=>==<====>=?A==BA?AA@BD?DF@?>@ADCAAA@=?BCCGGFD@BBAAAACECB?>>?=>>??B@@AAA??AA@@>@@=@C@>>==<;=?A>?@?BAEEDHGBEHCBCGMIB@A@CA=<=;9@>;<;967867:668BBBB?@A@@@>=>@AHLIGDBBACAACA?B@999::;989998:::86677666868?C=:9698578567;@<=7:;9<<86957AA;99:89=:::;9;:999999:9:=9==A9765885884468=A>=>>;?A>=@?=?B?=@<:;85866658<><:;=;>@:;=<9:=:;>;@D=565669555:<8>;=C@>AA@B@@=@>>AA=<@??A??B@BACDA=974555765767@E=6853985576588568859876657764679876876:668888856BF@@<>>?;?>=>?=AB@ADEADCDB@>AEGFCFDAAB??A>>?A?BC??@A@>AB@A??B>=DB@B?<=?==CCAAABBFEBMOFFGFFGIKIB=;;><9:988:9?E?988:6:;:;=9:<99<:8<=::;:8?B<::969869:9;@CEKIJGJGFEA?CEFF>77:767988868;979966876988@D=87776786668:>B:888865986877>B>???>>>>=@>@BBBB?<;;9:9<778659;88;;<=<;<@:;<<;<8:=<;@B@?A>>C?@B?=@A@ABBCFFCGFG;875784586697=DB76:598:778667878:6677:8778946766777765577589668>E@=>@ABDDCCA?>>====<@EFFGDA@@?=>>;=?@FGFDECDBBABBBED?@>?=>>?=@AAA@=>@??@>@>?>>>BACC>>?>>@?<=;:@CBBCHIEDB?BFIKGA==ACBA>?>;@>:988777787867;ACAA@A@?A?=?@>GIEFCB@AC??BB@@A;:8;;::8;:88:;8776776777788B@;779977877:9?>;::;:::98867>C<7:98::5<::8998;:69;::;;::=>?:77:<=>AEGHIHGEEAB?=>><=>=CF;589678778557;978778867;96=A?;96786587676B>?>?>A?>AA?<<:69:68968877776876868:;<;;<<<><;<:9>;8:;<=BA67668668EA76:;=>>@BAAACB>?@?AC@?BCDEBA><:8<>?>?@=<<;<=DEFDCCBAAA@@@CD=>@=<===>=>==>==?>??>A>=@><;:8888AC@BBD@=AB><9ALHB=A?AA=>=;:=>98966777795777AAAA=@@==>==<@B?9:9797899976=D>696:9878589889:9::87;;66;:;=;<:<@<<==;@F=5977745675978:75676756657:@>765675555765:B>575569786666=@?A@?>=9998976778845656656756656755:=<=<;<::;;;9;;:79;9:??74545568??<769;;:<>??@B>>?=?DDAA??>;;:865586A>6466566566549B?876675576466477664667755975667768648666777887;:=FEBBCCA@?><><>@B?<<:=<==EGCEDA@?><=><<<>@GGDFCBDC??AAEH@<@<;<><>??=@@A@>B=<<><=@>9:72796764777@@B>BA?>??>>>?CGFAABABCBACAACA=:988;;8:;:;;>:886776686787>B>977987866999@;:<<9::::966>====;;;<<=?=;>=;@H@6:997:7777869;76787787768;AB<778766666986BB67:668855786=;<<;=>;<=97::79;;;AB966566868=869:==;=@?;===<=;>@????===;=<=:@GCABB@@><<=<;<=>AFB@DCCA??@BCDB=<=;=<>======?>?CA@CDABBABDB<=<:<<:989:8:>AAB@DB@@BCE@>HIE@@B@@@<:=::<;8885566656656?A@@AB@>@A?>>>BDABABBB>?@@BA?@>987:887799:9;:755666669665;A;977:889775:7@;;9;8898:67:9A@78989:97997898:>>>@AA@>;:::BDBA>?A==?<;>=:;>;9<==>=<==>BA5899667565559<968889566577BE;975876776768>@6797668777669=:6797756578676776667556578687756779;:::;:9;9;::98:99;;9=B;454766558849?@@@???>A=>?=@@;999:85994675596;@:746555555778?C:56797566556666565676596679:66788778;==B><<9>GJHGGB=?>=>=?<==>=AA>>?>=?;;;<>BGGCD@>?==>><<>==BCFBCCCCCCCCDGC<<=;<><>>ABCDCCDCCDCDBEDADDDB=;=<;;999:97=ABBDBAAFGGF@@HKEA?BB><;;;;:A>7887835886788>@F@ADBAC@=>@@@DCBCBABB@>ACB?>=8:98:9:::::;;:875574568677;C>96687776996;><88:7:;977778AB::988:7;<<;ABCEB>>;99997688AD@>?>==>=;<;;:;=<;>;>><===>CB7688897867668;96689767876:BF?867667::8;:7AC978766887766:=:8688876696676676566676676575766668<;9;<<=:;;=:;:;:9;;9>B;55477<:>==@BA===;<@@=CAB@B?::87874686687687:B;556635757867?F<88688556667866686987::7988868=>>>><:?=>?>>>>;>>>>ECBCA>AA<=@<>@???BEDCA@DCACCCDD=;=><>AA?BCCDCABDCBCCABCAAFD?;=;:=<::87:;;?B>ACB?BDAACAEKJA?CB?=<;==:>=8688578497668<=DECABA@A@=@B?BA?AB@?AC?@CA@A?:8;86<:88:9:=<8776667586689A?<77876665769?<:8;:99;:7667>B<:99;@A@AC==?<::98896699377=BB>>@?===;;<;:<;;<==>?==>?=@D75877::758656;<98789667766?F?;::9;<;979;:@B;77976:966858?:7;869869:588767867:758667766976978<===>=<=?<;<;;<=:;<:@A=>=><:=;9=@??DB?B@<;878755775766879A<656547756865;E>:7769868855:97;:8:88:;88996=>;89:77958857957?A>@HEA>@@>>?<=<>???>@>=?>=>>EFDA@CB@@?=??@@??BCGCCBBABCCCFFACCDAC>ABB@BECBCBCCABCB@CD@DB=<<:8::<8;CDBCACBBCDCACFIICB@B==<<<:;@>6676997799756@A??@<;<==><9<<;>??<>>;>>?>=??>=?;;>?=;=?=>DD@B@>=>=<<<9;;<>;:<;;?@ACB@A@<679668755778988?=647646764777<@A;8778989:78;89<878978888897888657769:478768979;>GCC>@>=>>??==@=>>??>>>>AABCBACBBGIGIIEDEB>?A??A?AEEBBCBACB?AAAADEB?<:<<<:8:7:;9BFDAEC@BB@ACCDLKDBA@<<=:<<9>?:99778877:77:;@EC@ABBAAAAAB?DBB>DCBAA@@A??BB=:889;98:;79=<9996777686797??<88:76::79;7=?779<:>@@@DEBCEB;<89:968778976:94896784887?>====>;;<;:=<=>@;<77;><@AABCEDCB=9886797888:BA678688779:78=<6:7:878797687699789479897967<76977>@=>@>;>><>?>;=@>>DC@><9;9;;:;:;;>?;9::;9A?CCC@A=766767755778687>>757845864686;AF>>98;:78:89:86887697799788769556656764676776797=HDA=?>@=?=?A??@A>>><<<<>=>>>?>=?=AEFEGJJIJKIIJFGEB?AA>@?>BDBBCCBABAACBB@ACB?<;<<;;969979CECDEACCBBBBADJKFA>??=9:><;>@:8956756786758AECBECACB??DB?DBBACCCCB@BC@?BA<::98:97;:9::;:776776784675@@;8::77657978@A>?BDCCDBBCAACB>77669666:68876775786785795;B@???==>>=<<9;=:9;==@@<;@E?9:767877748:<@BA?BC=@A@?BACD?:77876768968EB6:7679759966;>7967:7889878669:77967:889857977876=@=ACA>>?<>?>>>=;=?==BC@:879987:999;=<::;;;9??BCE>A>866755764667686>@8567457556669CF?<8798567667866977857:6578645665657744665566753;ICA@=>>>?@<:<<===>=@@>?=<<;>@=BB>AACILKHHMMFEIHFFB>A@@@>=?@A@@CA@BB?@@AA=AA=;;=<:;96668:ADAAA@CCBBBAACINI@<<>:89;9:=@:5777865655775@A@CBCC@B@AC>@CA@CA@A@=?@@@>?@<;98:86988;:8::668665687877??88967889<><@CCAEDCCABD@=>>??>655776556767566477587657758AA;??<=>=:;:9:=89::;>>=>=<<>C@<:85688>>?@>>?>>>;;87777;=CD;667777557747B@5956877676768>8666968:7666887879869775675766<<==?>==<;<>==>?DB84789697877798799979;>?BB?B=557445545545765;A8554345445579@C>8555466466577566774765576567566865955766676775:FF@@====>>><<====@><><;<=;>=>CC=>A><@BAAA?==;;;=AFIKIGEDDDGGFFB>@@@@@=@CA@ABAA?>=@?@B@@A>::<<<:998998=CCCA?BCCBCC@CHKIC>;=<::=;;=>:7767665875885?A@BBBBAA@BB>?BC?BBA?B?@@??>@?@<78:97:8899:<<8778878<8:::@@<<===?AAAA@>@C?BCBA@?A@==>?@?886674785677358689667558667?B=>=:==::<9:9=9;<:;==<==<<=@A?>CAA@@>;:9666564676599?B;767777668667?@9876875886789<9966966976788877799789789=>>@?BCAACC==?BA?=>>>EA756996:88787688777769<>?AAB<6465454565447557B9464455446557=B@:5665784566656455678677756677779778:56866778888BHAA@>;><<=@>=@?>A@>????BCECABA>=?>;;:6::77@BFILHBADGGGDEA@AB@>@?ACB@ACCBAB?@A@AAADC<9;=><:<:::7:>=<=?;7988886;88697A<=B?@CA@BB@?@>@BA@;78676878779757877977767677@B??><==<;;;<8==;=<<=>==?>=>@AECCA@?<:8888:99867967886:8=B?;87:98:87888?D;9:76988:868:=;;97<:58988:7689:;?==@?<=?>>@ED;96::6698899788799969:>>BA?<:68856655586:;<=F<576467677657?=>?=<><=>=?BCFFB=<>=88877876:756?@>@BA?ACAABD@AA=ABACC?;<===:98788;CEAFCABA?>>::AIGE=@AB?<=;;<>>87879868676:69BDDBBCAAA?ACB@EBAABAAB@@CA?BAA@?;9;9:=;99;9;B@<>>>=A@>=??EGDFFDB@>;=?;=AAAB??ACA???@@?A=76898668769867766757975886?B?>>=;==:;<98=>9;<;<>>>>><=?BHA86878:89:9998858:687869:;AA;78988986877@ABCEEEFCB@>>=999978:877:BAA???>>>?;=?==>AE=;69:6788768878879977;>=?@?>:67868:89:<>?ACCI@777458667767;@C<976:659658987778:85:76696567657655877774885876=JD>@>=;===<>;@><@@ABBACEFA:87686688689686779@DFHHFFHKIGCDB==??>@@>B?=ABA?ACBBA>?@AAC>9:<;<:9:9<=;??>>==;955755;GJD?C@@===;9:==86767866967878BCCCBBA@BA?BC@ED@B@@@A@@B@>?AABA;9:89:<::>;=@@?:;=;@FCBDD@@@;;=:87876568568657776666965895>C><==;<;9;<8;<=9<><;>=<<<;;=CC>7487779:98767867967875896BB858866676884;C@88789757975:>?796:<:<=;:==88:56776996796868B@=;<=:;>?B=;667778669978;:9;::::;<=<>?:8;;;=@BBDCDEDC>G?656458556666:8577676666757965867687667555568655856764875774;HF?>>;;>;==><@?>@@>>AEGED@?A@=:85687687578777868:?EEGGFGGGFCDB?;@?AB@@ACBAA@>>BAC>9=;=:89=:89867767:66676?DCBCBAACC@@@AEC@A@A?@@@A?>@A>>A<9=<:A?>B?:;=:9=;7:;;?ECBED@@@;:=>=>A>AB>?@>;>=:=@?;78566449749747975785966785>E?==><;;:;;<;;=;=@>;<;:<=9:>?<:7468749969858976794695677@B956975665884;DA6::789679747=>8<:AECCFEBACFGB:8:96894776588679658976;@A?<=@>;<=<;=?B?976795::68;88<;9998897:>>>CBABCA@CC?ABAABB=>B???@?>?DMG@@=>@=>==@<;<87:54765476586767649DKG@9==>:=9:9<<:7577665666746?B@>?@=>BA@BA>>>??=:9;:9:;:998=>DEDDCAC?;=;;=>==@=<@=>==<:<>>=74575656647667566555755956;DA===<;;<=<;;;;<;>==;::<;89<=;96476687779667677766775678>C9476676555657A=:9997:867668C:;>===>>::;:;=?CA877888::78968;9:9655759>?BB??B?@A@@BB8775455566358=D>65885665655557579676558867678548878958956977;<ADKG@=>A>?:9679669879886:96899>CIKLHFHFGDCA@@>?;>CDDBBDDBCDCBBDACBBEC:78758:78:987776957:758768?IHD><>>;>=;:=?;8769:77:87775?EDCCCAAB@?CA>@DBACA?A?@CBBDEFGDB@>=:;><9>>><>>>>><=??;=?:<<>>>@=:>><=?CB9776;79:88:;:;<:8956:77A?<=B@?A@?CBA@BB=AB?>F:59767655736887686676677457777896966:86765676584689899;=?@CEECACA?A@=?><=>=>?=7787765677867667776<=EKJGHHGGECA@>==;>PJDBDC@ACCAC?=?@;<@?8:977877756664583576668558?KKB>@>>>>;<<<=<9668976876868>@CBDAACB?>?>?BBBABBCCCDGDCEB?A=<:=:;;<:;;=><9:;;::9;;<:;=ADFD@@B@=?@=;>>>@=;>>><<>==>@A94786679456669966678::;>;;;C@>?<=>;:;;:9;;:>>>=<:;<;;;;==77677487878767866876676777:C:587777657679@A<:9:;=@BDCBDFEA:7:96888676;PGAAB@>AA??@A@A@>AC:675476477686;?@8776777668767868:679959<:6435657799===@BBBB?;89?CB?=@@?=====;<=<;;;=====>==<><67667556777556767768@DGGHIHGECB@=A>?98BADB?AB@@===;=>86656655666555653654446764>KID?:;=>;;=:9=:65554585565779@CBBBA@A@?A@ABEDBBDCAB?;;;<>?=;9=:::;9999:;:99:9::999:7:<@EDB@@A@===<;:>><;=;;;=<<>;=A?845455665556789:;;:97677768@74565556666578656566566637:@<6466566769=?DF@<>A@BCCC@=<>?945546566657@?>@?????=@=>@<645445546556:BA976676566544555678:9:8:9858:;:>@BDGCA><99757767=CBB>@>B;>@<:=>>>><=?=<>?<=?<==67776676799677778768?BIKIIIIFECDCFCFDCACC=??:;??>>><><<<<;;=<6587777568739ABEDBABCBCGFFFG@=>;>=;<<;:>@:<>::>::<;::;:<:8::98;:8;<:9;ACCC@?A@<<>;@<=<>>?=@@<>AA@;56557698<;:;;9689777777786=A?==<;:89=99<::;<;==<;;:9;;;>:567667856:846656777677766:C?6797=@?DEBA@BCDAAC>=<<<;:;=;<577666877868AA759769667:6576876656777:?FA@=>=<=>==<<>74@D;6977887675676677678569::><;>????@@?A?>=>>A<>>7664456555488?F@78775556779;:;:89;:::=::A@CDA@?==<977676766886;BA?>=======;=;=>>=:<>;<<=====?97576556767567568665:?GKGBBFEFHFEEECCAABC?;;<==<<==@>@A=A@:6765776666585364755655557@FHM@;;?;;;;<;;;97667666658869BB@DFCCCABC@>@D>=<::<;9:;:;<:;;;9=;<>>;>79:;;9:8768776556668556735:B>:=;:<99<98;99:;:<;=89<:::<@;6476565667656756765465667:DD@@AA@?>====><><<=:;;::::;;9;<665676575677?A9576586567555558::;<=>>@@@AA?==;<=<;>@?<9?F?768767656876766784876688<>??==?@?>>??>=>=>7643555554466=CC;9686897<@;::<;<=;=@AAED=>>;;:7;;<:8776:769966:ACBA<>?><>?>=<=;=><><<;C;59988:97777777766778@EKMIEFIIGGFDCDDABCD?=>>>>>?BA?A>BBBC=6777767856866566686666668AFFKEB;<<=;=<:;?:67886:<<@CFBEHECDC@?>BE<<=9@?<::==9:<;;==<>>=:>;:<;;=;:;;:99:979::;89:=BCB?=>>=<=<<>=?A;<;<<<==<>?@CA:98877777854886666585697659C@=?=;<;:;::::7;<=;=;:;::;9;?:4577497567677545757;:<=>>>CGB==><<;8;<::;@><;89:;::::::;<856757767676?D;575475568;;:=?@AB@?BBBCA@FFE@@AAACDDDEE@@D;559565766876767877686569:?>?==>=B965465565688;ABD;;98879:9<=;=BBEDDDEEFEE:::;;8::;=:7;988988877:AB>@<=><=??<;=<=><=>=;;><<>>=@96777788689768767886;ABHJHHFFIFFAEDBBEBADA=?@>>BBA?A@BC?AC;7785486675887467675568758@FEKEB==<==<:;9>?<<=CECEBBADB@EFED?;>;><;<=;;><:;:9<=88;;:::8:9;;;<=:>>@?<<:><<>>==?@@?:67765754874697568578578868B@<>=:;;:;;;:;:;>=;><9;<;;<==A?767878657866:<;;=;:;9:<:9;;:<<::<:;85599;<=?@A@AB@AEC@BB@BCBACFDFCACDEECAAA?>A;56:86786677787688667667:=?CA=AC??@==A>>>>>=>A;655777<@?ABAADF>:9769=???A@CECDGEEECDCB99;:;;;9=9;8:69995996:;>E?=?=A<==<>==>A@>=<;<@=?A=877799898787;788877>ADFHKJGFGGCBCBCCDBCDBBA@AB?ABA@@D??BA<;877787883683384767864657BGGIDDA<<>;<>@@DGFEGHFFGBBB@=@ADEA>>=CHB=<;?@B==<<=;:<;;;<=>><:<;:;=;<;<:;>:9=:9:8:;::<=>><<>?>??>??>:78747937965875755:78777487AA==;<=;<<<;=;<<<===;:;<::>>?D<:796678:>>@=;;=;9:<98;;:=:88777697755=GD=@@AB@ADCBCDCBBDA@BA@BBBBBCDGC@AACA@@>>>?A?68667;666887887786877789@@AA???@A?>??=???>>?B?<;=@?@GHDGRQECHB@?@?BB?A@;=BB@BB@CAABCB;:::78;9;;<896897678879?C@=>>?>;?>:;?=<>=:=?<=?=;>=;??968767977977:859788>??DHJKIEFFDADCABCABDBBB??@??AABA@D>BA?:986666885585585757665538DDFKDEHCBBCA@@@>CGFHGDEFB??B=?C??@??=AC>>=;;??>=;:><;<;:;<>??<:;<:<;:;<;:;<:9;;99:9;:98?@>>=>;=@>??>=?@?@?>=>@>@?6695685686687676677:559558>A?;;=<;;<:9<=:<><<=<:;<:9><9??@:>899<=CDBC@7575498557779AB;;;:<<:;=;:>@A=<9;<8:<:8;<:<:976767:7886@A??>>??A@@BAACCCEFEFHFFEPQFEHDCAAA?<99947>C@CA?CBBDCB79;8::6:<<;985697797767=CA=>>><;@><>>>=<=>><==<=<>=@CB887687689967876:769;?DCDJLIHHFCC@BACCCCEDCCB@AB>BAA@@BABC@;96786797568555656644558AHGJOJLNFEEA??A?>BDDFEDEEC@B@?@B@??=>><;<;8::;@><;<=;==<;<>=?@<9<<;<99==;;=;9<<;::;:<<==?>@CCA@?==>>:=?@A<=>@@@A?==??@B>48767565765777776487567659;A@><==;999;<<9:?==>;:;<<>?==?AB=<9<<=>DECEA8675577558768?B=:9;=:9;<;:>=B>=8<:9;=<9:<:<<66665785984:DDDFFDDBCCDCBCBBBDAADBBCCBADBCCA@BFC@AA@@A@AC:6987886776688568769667:57=?AA?>?A?=AAACB@CC>BCDGGGGFGGDDD@EB?<:876655679;DCAC@EDABCB86787879::;:85776777677:EA<<=>><=>;;:=;:<;::>@@CCB@BAB84578678667695856758@CAAELKGGEABABCCDBB@@AA?>?@@A@B?>AA@A><9765787766455434669;;>ACIKJNKGICBA@><>>=?CBAFGCCBAA>>>@@=<<;98::899:8?==;;:;<:8;=;=>?;:;:;;99<:9;<99<<<<;;=;;<<?==??>>>>=<<>AB<374574564566665755755665569A?><<=98::;:988;?=?@>;;<:9=A>AH<8798;@DBEE@9565555665667:A?:99;97;;:::;B><9<;:<::;:99=;55555645665;CEDDEGEABB@B@BBBBCBBAAAABB@ABBBB@CBA@A@??>?@C968556875566555566657667676=@A?BFCB>>ACBAEGHGEDBAA@BAA@9656556654787BFABBCBBBCC:889998:99:=97996687787:CE=<<;==::;<:;>A@@B?ABB?@?>==B;7767988976986866677?B@BDHLFDEABBABEAA@??AA=?A>?AA?A@?CCAA>::8777855868:=;=>>A?????BFFKKCGBCAA==?@=>CDDDDDCA@?==>>@<;;9989:79:97<@=9<;<:;99<<=??9:;9:::9;;9=?<;==;;::<:::99ACB@>>>>=;;<:<=>A=>===>=;:;=>@?754567576576665666654865547A?=<<;89;9:;<=>>B?@CB=9655CFEDCFDCAC?@?AA@ABCB@@A@@??>BB@@?A@A??@?>==>A9566577766775466668657667769>CA=;=DB>DHDCC@BGEEECDB>?;;;=>FAC<656556666557?F?BBBCCDBE88::88;7;<;;;967:888779:>E@=?=;;?@@BB@ACAACA>@?:<><;=B>9998987;:6::879868:=ADCCFIIFHBADCBDBC?BCAAA@AB?AC?AE@CECB?;:99:;<>>>@@>B@??@@>?<==?EEIKDGEDD@=@A??@CEEECDDB@B@?@?B;;97::9:89:88=9==:==:;<9:=9:9<;;;?DFB>>?==><<==>@A>=>=<==;=>==?B;79678657667767766766975677@A>=>><=@A?AAACEDBABA@8479=JPD?99;:<<;CC@EF<5676777776598@@;:=;:<;;;=;;@@;9<;:;;:9:::;?7:;;<>?=ADBACDDFDBFDBCD@CC?ACCABCAACA?BBBCB>?BA@@AAA@??>A<5:8887788689679769868876;::@ED??DFDEEDDCEEAACGCAB@>?>@CC?9667757:7788@ECCBFDDEFD79989997:::<:977799889:7=D@BCD?@D@ABAAB?>@?=<=;;=>:<=>?:8897789:7987597798<@BBBCHMHEAADEBBBCAAACBBBAA>@@@@DB?ABCA@>>????@A???<=;99;<<>;===EGGIEDDCD>?@=>@?BEDFECBBBB@?AA@<98788998::99=<<>:;;<=;=@A>>>><=@>=>;;;9:99:9=99:<9<:=CGA=>>=>><>=>>@?>=>><<=>><>ADABABA>9679:?FD?9899::8BCAEE?9564678875496?@<:;<<<<;;<;=?A;7;99:=<9;<<=ABBFA?>@?=ADCECCECCAEDCCCADCABC?>AB?>BACC??BB>@B?>@?=<>?5:87698887897698699;9===@ADDFGCBFDDEA>?>?@ABBEFBBA=>=:??>>CC@86678669968:BCEADCAB?>?>>@?>?>=>;<><=<==>?;9778987:98696788;6:?@AABGKHFCACGCBA@BB@CBAAAA@@?BACC@BBCDECBB@?=<=:9:8:::8::<=>=;;@FGIFDB@?>A=<@A?BFEEDA@AAA?>?@A=8878769:9:99:?>;<<>=<<<<>>>A?@?>=;;;::9=:9;::;9:98:;899>CDA>>=>?=;<<=>A>>@=>=>?=;<;=@?=556768887536866678987;:9;;>EEAA@@A?@B??@@?@@?AC?76977?GGB9978977>BBBDB9564377556565?B;:;;=<:<::;>@@:;;99:=<<<<=>CEA=>=?>>==>=>CECAADCBCCDBACABBBAAAA@=?>>@ABB@@AAA?>@B@><>>95796587777988::=>=@AFFEFGGHFEB>>@????=>>??CDGFCA???==;?ADF@B956764676777:BDBCCCCEBC:89;88;::;9:;967<99<;;?@@CEB>AB?@>>?><<>=?>=@@<:969:78:869:7699879?@B?BEEHJEAEECCCAADABAC@@ED@BB?AB?>@;?DA>>=<;=>9;<9:<:8:8;=@><<=BHJHFC=>BA<>B??BDDED?@C??A>?AA<::77957:97799=A=<=?<;?<:>A>;><<<<;=:;9<;8;;9:;98;97<=@CEA??>=>>;<>>>>=@<<@?<>A?796568568668:88:9:=<:<<99:8@D@?BA>AFC??B@@A>>EBA9777;DKL?89:7997;DCCFE:6:65965574789A?::==:=?;:>@>@>:;?==@?<;==;@C=?@==>@=?CCCDCDCCAADBADCAEC@BBA?@B=AA@AD@>CB>?A??A>:>D:8876977:;9?@=@DFEGIEFLEEHHGDJC>DA>A@>>B=>@B@GHDBA??@=<>B=BA@:7:779766558:=EEGCECBEF:8::999:;<<=?<<<=>BBACFA@EE@>AA>>?>?>=>======>=;<<=<==A<9889978857966679689AAB@ADDFHECCAAEEDCDAECCA@A???;:9976868@A>@=:=<:;;;:::::::8=<==<:?FJID??DC@>@A?<@CEDAAB@@?@>?@>?;976687578899>A=>?==;99:98:;?@>===;:=::::;:988999::;9;=;?CC>=><=?<:?>:@@;?@<@>>>>;FE<@?98665589779:;=>;78978767956@@@AB?ACAA@=?@@BAA@>B:7757GMB;87;;999=@@EDB=7557777765774C=:9;:;=;;=>=>C@;>>;=<;;:;<>;==>><<>?ACBBEEBABABEBDADB@AA@@A@=?AAAC?@?>>@>=@><>>A=:68<<=?BBCFEEFECDEGEFIDEEEHEFECB@@AA??=>@@@ADDDC??B@<>@=;?B@9986977675578@EBCHFCDDE:8;<;<<<=?BBEFDCCBBBBADC?BEC@?@?>>?=?><==>?>??<>=?>;=?C>8;78;9678889:7987;6>DBABGDBGGECEBFGDDCA@AB=::869968756:86AD>=@<;=<;==98<;:==;:>=:==;DLJFA?CAA<>A?>BDEFD??AA????AC?;;67799:<:;?=:>;::;9:<;:;::9:;::<<;:;:8=;7;<>DB=???@>>=<@>@BCA>DC><;<;79947977887766?BB>ABAACDBA>>@A>AC@B?9677;;=>>>@>>=>==>=;?B<=ACCDCCEBCCFCCFCBFDCBA?@A?>@B>ADB?@?>>A?>A@<@EB@DADFEEEFCBA>?ED@DCGEFCEFHGHGFDBA@AA???>ABAAEFEBADC@?<==>>AB8:967:7897779AH?8EB?;>>>AB@?>>>?DACB@@CB?@B@?CD@??>???>@><=>>=@?=>>=<>=?@;;9:968868:68;877:8=BCDFECDEBBA@CCD@C?879877877755774687:>@@?=<=>>=<:89;;:=;;<<;;;;<@FHE@>>>>>=>@@@BFD?@A?A@>A?@<<;>:;<::<<:;;:;:898:::=<>CA>@@<=>;=>=;?BAAECAA??FHA<:>CA=<>::679788558768868967766AA?@B??BABC@>ABA?BAAC?88768:;;;98:::8:@BCCF?8877778;66786B?;<<;;=;9==??@>=>>:<=<<<<=>?AA@>>@?=>?;=?>@CBCFEACBEBCECBCBABA???==A>>B?B??>>>>@BCCCCGIDECDCABA?>??>@DCCEEEFDCFFDEIGGFB@A@>?BB>?B@ABBFCBCDD?=>?A?BB:878777977:69AI@9BDA?@<;><=B@A@=?BA@@A@=?C@?@=?=>=>:<;::<=<==<=<:=;;;=A<:<;:78769879698:<AA?=>AE@D?6866776686567547555:=>>;<<<=;<::9;99978<;:<<;<=BJFA?>===>>==<@CDCA@@@?<>?>>>=<8899:989989997::997999:9:::>=::;::<:;9;:9::99999878999;;<<9>AEBBAAB?@@@?>?@A>==??A@@>CA887788<<8:797679=@BDFB8576556757654@?::::99:<;:<<==:;;<==:;;:=<;?==;>><=;>==<?=<>=?>@B?=?ACDCA@@@>BEACAA@?@@@>>>=>@CDCCEBBDDDCEEDDFC?@?=>>=??AAA@@CD?>B@>?;=B@@B@:9;?95445767=B:>BEDDCEHBAA?>=:<>:<@B@A>@FBABCA?AB@@A>;><><;<==<>>;=>><;>;;;;>CBGGGB;;:69<:>>>>9887;??DID???B?A>9698678777556657676>>>>>;<==>;:;;8:;<7=<<>=;:==ALLA@??>?=><=>@CCCCAA@>>>>BAA<=8:999877::8::8;:;:;::;;8:=:<>:<>;:>;<:;::<:69<99<87<8<;BB>A>=@>;?@=<<@GBA?AB@A@??A@?>B?BBCACB;9:977:;;;789987<@GCB>9656667;67955@A;9<88;:;<=:=?@;=:<>=::=<:;<<>;==<=>@A?BEFDFEDDBA>?>DBA>A@=@@=>?<>?A@>96865886;?9?CDAEBDFAA@>=;9:=<;@@@A@A?@A@BB@BC@>===;=;;><;<=:;====;:=<=ABRIHFA@@@@AA?=;766756768:;@FE@?=?@@>@@7786667657656654575=><><:;>?<<:7:<::;;;=>:;=<<=@GICA>=====>=<@AABAAAA?>=@@@A?977:88:967779:999:68;::;::<<>@<:<=:;=<9;<::;:99:9::99:;8@BAA@@C@>?>@=>ECA>>;;?@CD?>??B?756567475566765578666555758@A?@??AA@@@A>AA>AABBB:79;758;>:68:9::>>AA?>:656757876875=D>:<;::;:9;<==;=<<==;<==<=@<:=;>=<=;BB@@CCACBCCCBBB@@@ABCDCDEDDFFCAC@A>=;<=>?==?B@@??=>?>;<=;<@ABGEBFEDCDBCDEFEEB=???@@@BBCBCB?@A???@DEGHEBAC=99;97766766:?:>AD@@B=GBC@=;;<<<;>CBCEDBCDBDEA=>=;<<<<<<<<<>>><<><=>;<=>:DCEDED@A@==<::997:;==>=;=<=>BE@=<=?A?CBA:86666886676767676;>>?;<>?><<978;::<:;><;<====?HKEA=A>>?><=>>@FFB@?A?@>BA?A?;8:987998978::9:::::;<9>=;@@?A=;>;;=<::<;9:;:9;<:998;;:;ACCCB?>?<<>;=?@?=;<;==<=><=>:;::;::::<;=>;;==AECBDDCCBDBEBDCDCDFGEEGFDFDDDDB@?<=>===>>?@?>C@>A=<=<=<;;<>ACCEDCEEEDFBCEDEEEEB?=AA?@CCDEA?=@BAABADHFJFDAB<98B?77657569>:;CFA==?:;><>>=<=>;=?<;=?=>@;>=;BC@;>@<;=;;>@>=@@@@>=>@<=><<@CDA=<=A?>@@?;86577699657556759>==@?<=?<;;9;<:;=<:==;;===@BGKG@=B=:=@:<>=BHEABB>@B=?B@?A=::::79;8999;==:;=>??=;@?:;<>B==;=>:<=8:=;;<;:;<::::;;:;BB@==<=><<<=>;=>>;>==?>=?@@A867785888776679758859768758CA>BB@@BBBA>@B>A?D?@E@9:86876:=>@@CCBDCBEFD>756676665896;B?:;;9;<99=<:=><;==;=<<><;=<>@>@;>;>?><;=>AED@?BD@DECGHGEGECDA?@ACAECAADBA==>>>==>>?A@?CA=@>=<<====<=BCCFCCEFDFEDCDDCEFFD@@ABA@CECDC@?ACAADACJHIHHDE@>@FA87756768>=;@D=;9=@@B?;==>;9;;?@@@CA?CBBCB@@BD@<>>??=>?<>;><>?>ABA@E?>@>>@>=@??=@AAAA?A@==>?=>?=@B==<@@BA??A;788699687745987::=?@?>??=::;<;:9;<9>=;>><@BAEJIBA?>=?=====BGFB@@@C@>?B=@B<;8;=::;;=>;<><<>;9<<:;;>C?=>=><D@>=??>>>=?@@>>>>;?A>>@ABB;68897975:65786688578768788?@@A@>?A@BA>?A??AA?ACA><;88866>@BCBCADCABEE?977887866867;B@<=::;;<;<:<>?=>><>=::>>>><>@?=;>?==?<;><=DD@ACECEECCDDED@BB;;>?DDBA?>BAA>=>??==@@???@C@?>?>=>><>?<<@CCEDCGEBEDBCDCBDEFD@A?BCBEFCDECCBCABC@BIIFJKGDC>@?;96676877=@<<@<<:=C@@?;;=<;<<<>C??CB?DDBBCA@CDB=?><@<=@>=?A@AB@@B??ABBBADBCA<>?>?>=>?><>BB=A=??><<@?;?=@?9798888677568967:=?A=<@?=<;::><9=?;@?<;?>=@@DJIB?>?<=>=;>>BJGACDAAB?>@>?B>;:<=;=@==?<===9;<;:<99<:9<;=DD<=@><<@@>?==@@AA@@>@;=?>=BEEDEA?@?=?B??@?>?@>??@>77877876977896599589767975?A@AA?@A@AAA?@A>A@?ABB@=:79:75=@ACCCBCDBCDEA:77767966777:C@;=;:<;;<<<<>@?=><=>;;<<==<<@?<<BB??>>BCCADD><@DDCA@?@@B@@=>?@?>@@=?@>CA>>?=>?=<==<=ADFFDCFDAEDBCDCBDFFFC?@CDCHHDECCABCBBA@BHJHMOJDC987677667787=A<:?@AABCBDCABBBBDDA>>=>>>@B@AB@?BEBADABCEBBDCBED>??>??==@===?B>A>=>@>>>=<===AB<;?<>@BA?B@<95677567576665:>??==><<<::7=:=?>=A@==??=>>CKJB>?>=?>>C?<=<;=@>:<<9:>8:<<:<:8::979::CG@@B@@>?@>?><@A>>?>>>>>@?=CFGEEBBB??ABB@CA>@@?@@==A@>>???>67864887577687688577557765>B?ABAAACBCC>CA>>B>ACDA:66::55;??BCACCCCEEDB:467668768757@A===:<<::<>:<=B==?==<<<<<<<<><9<:9>?DDEEEDA@BDA?BBAC@A@@?>>?@?>==??=CB?>?>>>?>=><99;;?>=<;;;;<:;;<@CC@AA?@>@A>@BCC@;>@:?BD=<;<>=>===;<<;==;;;;=AAA>:<9===?A?>?;67666656666528;<<;==;<;:<89;=<<==>@>;<>?>@JKD==<<;=;<:;AFGEBAAA?>>>;<@?>??<<=:9:97:;7:;:898796798;>@A>?>??@B@AACDAAB@@=A@@=>@>>?@BAABA?@BBBAB>>@>?A@==@>;=>??>5677566666666666666455568:@>@>?>A@AC;7787568@A@ACDDED:366666587655;B?:<=;;:;;::::@?<<><:;;;=??@CGBADAAC@>>;78>=68<<<;;:<>>>=>>>==<:?D@@?=>><===><<>@DCCBDCCDCBDECCEEDFHD@A@@AEC@@BCC?ACAABFKLNNNGD:676586587579><=989;9@??=;<;:<<:<;>ACAAA@?@AA@@ADDA?A?>?CGEBDDABB@@==A?===?;>AD>><;======<<:@>=<=><<>=<<;=AC=@>:<;<<=??<<=>>?IJD=?;;=<<;;;@FFEDB@C?===;=?AAA@>>=;9:98;99::879:8;;9<;:AA@>AEABBD@>??A?>?>=;??<;:@?>??B?<=@@?AA@@A=@@?<@A>=>=;;<>@A65668556875555457799:9;:9;=ABA@>?@A@>>>>>A?=@?=?C>8997676:?A=@BAABCCFF=566656465866:A>:<=::9:;99;:?==:==>??>BDBACOLC>:98557767>>7888<;;<9;@CFGFDB@AC@?BABA@BA==>=====<<=?<:=<:;=?CBBBCFEEB?CCA@?>>AFE>@?@@CB==A@@=?BA@@DKLNPPKC;855764676556=:788::7AAB@<=>:<>;;<>??BCBEBACDBBFGFHJFFEDCDA@@>:;AB@>?@=A<>A=>>=>===???=<>?=>?=;;>>A@>A<>:==<@DCAB@;8768:667868:;>?=;<=<<==;>@?>>=?@?AA>=>>@GME@?=<@>DGDDEBCC?>@>?@CABENL?:9;:8:;:==<;=><:>?>?>@EFCDFB??;99866;:577689779<;@AA@?>=>?>@B@BACB@A=?A@=>>=>?@BD976885866766887:<9;;<:?;87;A@BB@ABA@@??AB?@B?>@AB?78:7987>?AA@EEACEEDFB768657747976:BA<=<==:;;;:==@BABCCEEDBAB?:;LP@9697878986A?:=?@ADDEDBCFCADBBBACC@>=?>@AA?@DBAGJEDC;=?<<;<<?AACECBEJLNQPKD>766777779879=;>?9<=;A?AA<<><=>==@A?=BBADDDFHFGHFHHFB@?<:;999756;@?@@???;?<<@><===;@=?@?:>@<<>=;==<@A?A>99=;:=@BBA??>:579547747:9?@>=??:;>=:<=<>>>FOGA@@<>><@C?AIRK>:9:;::>===A<=BD>=@>=>>>A@AAC>?A??@@=>?;>A>AC:67866:99:98;=9;=;868488658@CDB?@A?@CA>?@?@A=>@@AA;799:58==?B@AEBBEEAGD6576688489548DB==<>>:<>>=?DCFGDDCB:9:56:96@CB:9:4;:7:;6=?GBB@?BFACF>??>=CDCDF@@A??@>?????CCDEGDGDCFEBDE@?CA78974874776767=A?<=@<;;;=?<>BA=;=?<;<:<;==B?>=?=>><<><9>D?EB>8:<;;<==CC=?A<7764675677=A?<<=<<:;;<=:9<=<>@><>>?FMFCC@?=<@><;=ACFEADEBCD@?>C@>AC?<=;;>>?A@A?=>:>@CC=::98598786968778769977885885776867:<;9;=;<><>@?>?AAAA><=@=;>?<8::566667656:7677>EC?=?A@C?@?A>@A>>?=>@B<58:9789?C@A@BBDCCCD@65766868:879:@C?;>>AD<977976877;>==>;B=?=?PSHB<=><978795867965767;>DJDEECC@BB?@CB@BDCEEFKNNOQJC<7668989==>BDCAD?;:9AEC?AB@BCBEFDEGIGDFC>?<9;;78>=47976965865776=B>=><:<=;=?;>C@;;===<;;;<9>D>=A<:?>:<>::?ECEF@><;;<<>=:46976764=@=?A=:>>:<=:<>;:;9;>><<>>?BFJJEB?@=<@>;<=>CGCBEFB@BA@BB>?A>>A?A>;?@ABB=<====>=EB?AA@BD@@A>?@A=>?=>@A;7:88:89@B>BA@AECACD@:767999===>ECFGBBFFBBD@CGC@?=758659748856:>EK@69:689758:=@AB=CA=??AB@<9DKHHHEEHDBEF?DDA@B@:97479769;@9?>@A=<><89979;965:699779866756=?BHJDHLDCFFCDD@@DCCGFEKQKOPHAA>@<8:<:7876DDCBB@BEFDGHECDA=;::99779878<=996675687456559?>?@=:>?;<;:?C<:>====;==:;=@@=>><<<::;:;CE@=A?76765744;>=>=;=<;==>:<;99;78=>;:<=<<>>@DAAEEAAAA@@=?><>ABBADBBBAAAD<9775675699797::766575885577785677578576569<;:<;9<<8====<=>AAAA=<====>A@B96676676676567866668975765=D@?B@?A@@>A=?=@=?>==?@;9:9:;5:=CCCDDDDA9:;<87:866777876885776687578669968:>@;879866957757BEFFHHEEFE==A<==89;:::<:8:::>A;??;==;?CA<>>CCEFCB@=:;<;<@A?CE?AB?:875975=B==?=<<<;7=<:=?=<=@>BCFJGDB?>=@@==?>@DCBBB?BB?=BCACECBCBACA>?@A@C;869889669<:8:<<;667869;86779:;988788787768==;=>;;<;:;<<>A???A>>B>=AC=9;:987;>B?AB;BGC@DEFFDEDFGEFEA=@;:D@87677:9878=CA@AAC?>>;:>97@EDBAACD>=>967::8:99:977:768:@<8659677667878:77:885;649768868;<<;<<8:8679:98868<=:8767776656766:??<<><=;<<=;>>>==<:;<<<=>?CDFFEC=<;:;=<=@@BCA>AB877665:>=<==>>=><>;<;;==;:===?==>?BFJICC??>>?>@DDBA@<>=?=>>B=8869;977889::<><68:8:886876:<;;;877677766:9:<<;;<<;;=:;<<<==?BD@>??@>@@B:776758767868967:756774875:DCABA??B@A>>>@?>@@=>@?><::;:57=A=BDAEHGEHHFHGDB@<<==9:976>EA=9697778777868878876796678?::8::77<:797?A@=A=<=?78<<<<>DEB=;>:68979;99<9678778DDEEDCCCB@B@@BCCEFCCGFHHHJD;:88978:888878:86987BE@==;=;:997776776898568>755745666377367=>=;<=<;==;<@GFB>;;;:;<<@@?CA?=@?=65767=@>;:<;;;;;=<:;<:<>;<><:<==BGIJE>>BABA@@?AA?>ACBCB?@@<;>>?A=;====:;;=<@?>@@<@?=>>=>@><=<>>64;<<>>AEFDFFEEFEDD@:;<99696;98664;BB=8556666656775577447667767::879887688768AB@?<=@=>=;;8789;;>DFC@<;<996596699657657:BC<6676664685576666566655755665877;9=@CEAB@?ABA?@?<===??CFGIGMF97766865677687756666?B@=><;<<;;>::;;88769869;:558<::7687566666668>><<==>=<>>=;?>;<;;;;;:;<;<=?B?=>><;==:<<=G>ACDGB=;8:=;;=??ADBA>C?=8558>>=?<<>;:<><:<99:;:>?>>>?ABDEJH@A?==8:=A@?>:<<>=;<<56656666675567965667686668@DBBAAA??BA=>===>?>>@BDCBCFFGHGGFHDAAB?===;878786867:;7649?EC8577667666756656657876658;;7888=<877779@CA>==@=<@FE@>=?<9679@B=:86777;=@>A5667656676687677786766766665776=?=@BGDBC@??>>?;9;;:;?CEIHKPL<5577886777876748687===<=@>=A?=>=;<=;9;>BA@@@BB>::;;<<;<>>@BA?=>@=:55<<;?=;>=;:=:999;>??@A@@A?=?ABGHCDCA>?@><<;>A;98:99;:9;:9;A?>?;9;9887676645669;9787676577558;;:;;;:::<::;=;;;:=A>76775576576566667766656856@C@@@@>>@@>@<>>?BFFDFEDEDBAA?DCD?DB=;:96897777667788;:9647@KH;687656755756765566664668:=7:89<;:9887:?A@@BABBBCDA?>@><>>>BDC==<;:9@;HH;::56998999@76776566577766867756656646657:?CEEEDD@?@=::<>=879::;=AAEGJMM?9678678666766766586:A@;?;7<<:;<;;>:7654688756767;>:5656765665546:@BB@??=:9:78>?<;:9<:;;<;;;=>>>><==;;;;<;=?EBBCDCC?;99<;<>:<=>?>?A@@BCA?>=<;=>>@BCHIGB?=<;87788:>::8::<;::::9=<<=====9<=;?;8565756;75676=:778667786557::8887897776557:::;;;:;:<<;<;::9;=<=?==DDBBEB76765665676676567768555756>>>==;;@B?>>?=876678668655769:999767@EB?9666776666677665566657669>68879:;:;;<=?DC@?????@DEC@@?==F>99?<@?<:69<975568>85666656766667866545456;<>AAAACBABBDA>=<967;?>:89:;<=BBFIIKOB99777787677696767569AC=?>9;<:;<>:9;748757878:7779=89547338858:<=<=><9;8868876:<;9=<9;;:;=?==>>?>;;<=:<<=E@@CECAA=8;>;;><:<>?BEA>@?A@@BB@@ABA@BAACD@<=<<>@@@BB;;>BGJD:8876667969?<:8=::<::<;:;@A=<;==<<<><;=?;9777864984685;;979979977876896877679677669:;<;:;<::;;;;;;:<<;;<<=?ACFEED97687667577478579766668755;DCBEBDFGFIGFHEA@A?<;;:==<<=<=@><==9797577679667768:899768>=:@>597579578677766777666778A:999:;<;99=<:@@;9;9997?FECC@;?B>E?>;?E>:;::8=@;8BE886666>;66766766665577789;<>;;@BA>::<<=ADHJJOLNE9788779858869876:66<@DA=;<=;;<==<==:8757667764876=:877::;<;;<::97:88686776766;BA=<;;=:<;:;====>>=@><>=;;<>ABACDBDCC??@=??@?@ABAABBC?:=JHDKC::869979968A=:=<:;<8;;<9;?@??=;=?>=?==??=9867976789;78;<;7;8998789549:6975689578879;=<:<>;;<=:=;<=<==;==;=AA?BDHGA><=878878648777877646778@@==@=;>>;=;=;57:767789977888898;9868;;:>@997578758457767865689:99A?;9<:;:987987888988797:EEEE?9>C<><<>=:<;;;;:?A=>A?>=AAADCB>;<;<>BDJIIPLLG;688778957677:76986:?C@<<<<>;:;<<==96656887654676A?<;:;;:;98976799588778977679>?<<;;>:;<<;==;>>><>?===;9><=??=9>=>CA::;:;:::;>>>A>@CD@A@==>>>@C??B@ACC@ABB?>==?<9>KE@KF;9:8::56868>=8=;:<<::=;:;=>?@>:=@>?@>=A>>:9767779:9<:89=<8<:88:778648:7896798679679:<<:;>;<;?<<<=;<=<;>>;@@DJIECEDDEA?@AB>CA;;??;=>;=>;??<<;:578889879986988997::777:==;?@7778675745988996799:::9>@89;899788989967:9777:;FFEGB=;;AC?<<:9:;;<<==?@<99599;?48889;??>@?AC@BAC@A?:9::9<<;;<<<<==@@=<>>?ADB@?=<=B@>>;;=;9=<<;>:5765886688:<:A?:<9976765775697576487677577<><<9:?;:<;:<<=@?>>>>=<==;>;?=?BB=;;9;=<:=><@@=?CDDDC@@BABEDBCCABC?<=<<>><9;<:==<:>99:=@@>==>>=@>@=:788758:68968?::<<878567668967:7778689468::;<:;<<==;;<>:;=;<>=<==?FB==DB?HF;78735769;;=?==>=??@;;:>EEDDCB@@@>?@@>@@<<=><=>;=><>?;8:98768788688568668:7896679>=8;B<6589589768979:78:66866>?79976:869:87977897877:EGDHD;=<=E?;?C<9989:<:6<>99:85877:C>;?A>@BABA=<<:9:==;<:7;<<=<;<<<;<>;>D=;?=;@EDB?;<>=@DIFFIIGI=67867877:976:67967:;CC<;:::;9;;::;<8678876777:::>;7:56765687776555455763455659>=:9::;;:8:99;B?>?<<=<:;=::>@>=A?<><99;;<:=<<>>===>AEDCDDDCAA?@>==<<;:;:<<;<<<>AAACHI>9575544656:=:;99<<:<<89;<@@==>><<<<=>@@C<778876776546:>;;;;564465568877657776765649;:;:::;=:<;:<:;;;=::==<;>BCACA;DC;769::;;<=>??<<97966673;GGDB?=???=?>==?>;>=<=<<<<<<>?9776975676589767646886856667<<67>A77:6789776876566546736<@69789:87:967778867775;CFFGA9<<9=:;AC<9845:;67:87:;8889:<@BAGB><;:9:;;::9;;?<99;<:=>;<>;<==;9>C?@==>??AA==>;:966656676677656577675546669>>9::7:;;9::::@?==;;<<;9:99;CA@>??B@;>@:9::::;====<::<>@BBA>>=;<<====;?=:<;9::;::<>>=BGKB85766445669>:9::<:9<<:;=;>@==<=;=<;<=A?B:6888888565768=?;:8465576557974556866566657::9::::::=:9;:::;;::;<<:::;?><><8:6775659658874==>?<=<<=:@?<<;;;9:<<9<BBC?9::9><;BB>8914556889;:9;;9?@C=88@?;8:::<;:9::9;<9:::79<;8;<9;<;;:;=A>:<>?=>@>=;;<:@?>@CAEI@469867966556587755?@EC>?==>;;;;:;<<<977976;<98<=;B;98965766766886677667687778;@@;;:=::>;<<>:>@==>=<=><9=;;DE>?CABCAAC>9<=<;>;=@=<<=>=?BBA@=>B>=>?<>=>@><<<<==<<=>>>CHHF9698777666:@;<=;=;;<=;;<;>B?=>===@>>?@=A>758:87867:957?>;;6677678767:96868867776777:;:<=<:==;<;;9<;:=><<==>@===;<==;?A>>?=<;;<<>=<@<89778778966888787869:687789;>95;>?:78666676668769966:66;B<;<8::7:<87;:8:<9;;=<=>@ABCA<9:>?>@A;:<75678<@><=<99;;BI>9;?A>>??=;>=<@=>BC?EIE:688987:8679779979ADFD@?<<=<8;<:;<<;7579868<77;:8?:899765677777666765775:87689@A;;:>::<8;<=:?@>>=<<;=?>@>@AD9=C?>AA@B@::<=;>;==<=>===?AA>??>A@<>>;>>=>=<;<<=<<<:>@AAFIF;86:87768:<>;;>;<<<<>;;=>>AA>>=>;>??>???=746985777:678==::8688678757;:897:878686797:;:;:;;==::>:;<><<>>=?@ADHDFINKH?><=><:7788869879:68:8:>A<;>:;><<>A><@;==9;=::<;9;<=<<<:<<;<>=;==:<=;>=?B?;=>?<<@@=>=;>@=>A>@FF:58877898776995987?ACGA=<:;:9:<;;:=>6587678:97879><886776746755666757577776588=@99<;:=;7:=9;=@@?>>>=?@C@?C?D;=A=><<@BC>::==;<>>><==<<=@CA=>>====??<A@EJH=8685966:>9<=<>BA?==>>@=86676885798889>9967877876887;9699::7667777;;9;;;:9;;==<=???BCCEDEEAA?;AJGDB=>@CA<898678478677:6>;<;9;=<<<=?>><<<:;>=:=<;:77688769968989786678775557:@>8:9;C:86746657675886766857=C79;>;;??;::;<<:9;;;;;;=>:>?:9:>BA@@A?=99;999<:9:99:::::9:9;:;:::=97<>89<<<;=;;=:8:=:<=9<===@?====<<=>@;>ABC:867:9878687659789>?AGA@=<><9:=<;<<=9668778::6798=?856868847865885676577486569=?==:;;:;><9;>>DDAAEA<@>;:<:>=>A@HB<<>;;>==?==>@?=BBAA@=?@>>B@<=@==A=;<<:<=;9?@>DJG?9:7986:;>DD?=><;====>?=>>ABB;;@><>?=?B@@<849798765984;?76:96:9799768;98;<=<7698768;:<;:<;:>@>@DEEGFFEB>:;95984CE@==>>8:856976:97:DDB>===;;<>;<=:<>>9>A=@>:9>>;<><<>;7::577799759:67:78:9679659:AA;:?AB@;779956:568846848956@E;<==<>>;;=7<><<=<;<<;;>><@A=CFC?><9=<7;=:9=96=;79;:9<:8<<9;C?;=<:<<9;>=;<==<=;9>:9<<8;<;;==:;=>BE>:?=<>?;;=<<@@@AD??D>58779:66987:977;:>@=EB?<;=;:<<;<=;;:548567976765<;5776896685669658646657954979?>::<<;<>==@@@A?9;;9;8999::=@DBA>::<=<>?=>=?@?BAAB?@??@=<=<;;;>:;<=>CIJB899767;?CCF?=;;==<9;<===;@B?>>?<>A@@@?A@<767767767775:>87;85966:7558<=:9>>::966676:><;<<=<<=<<>:686696669767679998899;<=@BBECA@ABDD?8785658658657567656>D?;;<;=;:==<=<;=<;::<:===<@ABCDE=99::879::;889=88:;999779:;AC>;:9<;;:=;:;;<===:;:;<=;9;<9<=:9<<;BB@<==:?=>?@=>@@@A@>ABA88777779858;87976<>>HA@=;;=<;<;;><<;757:76:<9996;?857:68;8699677778659968759:9>?>=@?>>A?9;=<@=;<:<:;;;<<:;DC:@B==??>DE@>><;=>=?@=?A>?ECEBCAA?@=>>=;A<;=?:;?==<><=A><<>?;;=<<==;>?<>=?DB=?AA?>@AABAC?988:87:76897:>;98879:88=566=@><;>>87:<<<=AEGCDF@=><9;;58>;:8;87:826839DBADCHGCEB?>@;87777898:EG?8;8:;99<>;=<;;<=:@?=>A><><;>?=>?<77:79786:758678:<>ACBCDCDFGBDDACDDEF@:8766:668669876766?E@;;=:<:<><<<=;<=;<>>=>??>??D?:98::79:97:;;>98:9;;?BABCBCFC:==;<>9:<;;<=>=<<;;>:>;::<9;;<=<<=?CB=>>89@@@A@>@B@AAAADB79759778977:97996<<>DC?;:<;:==;<<;>=6777688:7896;?968767:768778657867956889>>>BB=:<:::;<<=<;@>:<;::;;:<;9?AAABB>>><<>==@?=??>>C@BB@>??=?A?>?@?@>;=?8;?:9=><>CFIH><<;;9;86::=>?=;==<=>;<<<>A@??A@@A@AB@@C?787867787877;=<:78788788787;@?9:899798756759@EFA>>?=?BB><>9777789:BEA<;87:;:;>><=<;<<<;?>>>@?>@====>??;88878887687=>@DCDEEDFEDDDEDBFDBDCDFECB?:5786:8568877768>B@<<<::;>><===<=>=>?>=;=<=><;?=AA;88;:8;;8:;;=?<>ABCBEFEFCCADD;=<;>>;<=:<=<=><8:<::=;:===<;<=<;<<89;;:;=::;;9::;<7;>:;;9:9:;;;899=BA<88>@@@>@AA<<=::<>?>====>>D@A?<==><<<:<>><=<;<;<::=;=?=>@?@@=@B@7768766665577:<986776673656:??@EFCCC@@@==<=6987698556669>:8;9877667347EA<:;8:::79;;;<;:;;<===>@<=><;;<<<<;:87578::;>@AABFFEEECBEDBABCDCBAAA@BBACCB?:846765655676669@@;::;9;=;<>>;>?<==;;<=<<;;:;;BCEEDCCBBB@@?AC<:8;;9<;88<<9:=:9::8;:;:;;<;;:;;9:;=?A?:77:=A>>@A?@A@@B@B;7679778987756856<<;?H>;;>;:==;<=:<>5666668776678<:677677577579:<<:<=;<;;:9<:;EA=;;::<<:<<9?B=?@@A=;<<;===?=>>>>BB?>>?<=?=>@=>B?<<<;<=:;=>==9::::967:6=<;8;=:;;;<;::=B>??>>??@?@@?A@8678685696597:=8755679==>B@DEBBA@=<<9:9:9:<76;;998668869<<<:8:86797566=A>=88858789@D@<=955<<=::@;;=<<==:;=<=?>>@B@ADGFGDCFFCDGEBDDCBCBDCEBBDBACBCEDBA=65665765677658@B<:<::;><<=>;=?<;<<;;<><;=<<:;AB:8;8798989;989;=9:;:;;:98;;:<:9::;ACB=85;=?@@AAAA@@@@A?=76687677887667668;:=F?:9=<:;;:;<:8<8556456658866;;566579:;;8878;<;;:9::999::8AC>;;:9:<;:;:9=@9:>::;;9:;::;?=7;<@==?=?=A@<9<<;=;:==>>>>>B@=?=;=>==?==BA?>>;;;<:<><=>BHI@8:78787696:<=::<;;;;:;;<<@??=@>>??>>A?>@96666756676559=;===A@BCA?A>@=;869967986899=:8998677679759=997877666764:7766765:A@B>;98688:7889:??<<;;::99?A;?;;:>:<=::<=?CEECEDDEEFDDDDEDCEECBCDBBDACEBBDCBDCACDBCA;5775676666668@D===:<=;=;;=<;><:=?<:<=;;>=;;:?C<89978:99::9::ABEEBBCBBB?@B@C>;9;;;:>>;==;>>9:=:;:;;9;99;;;;;:8;;?CC@;89>@A>@BAAA?=@B?=6976767767887895:;::456556646657>?8:;:9768775558<<;:::::89;9:CD?;=:;<::::::=C:;>:;;:9;===?B?8:;?@?==<>?<<==;==;<=<=><>AC?A=<<===>>=>CA>?>;;;>;9><=?@HJB87876777769==::;;:;<9<<;;AABA?@>=>>>???A<85856466::=@BEDEB?@><<:886665578799996779>99987766557749>688697546665:BB<9:875666879BD?>FJC=:999:;:99;>=:9:88:98<;;=<<=<<<=<<<;<;:<<<;>;<;::;:98:79<99;;9;<:;;:@BB>89@B?>?@AAA?@BBC?7896877767767774;;=;DB;:;:;;;<<<<:=<266556789::9@A88977764673659;<<;;:9:9:<:8@G?<===<<<:<;:<@;==<>>?=>?>>BC=;<:ABB?A?=>>??<;;<==>=><=>ADA@=><<@?=?@>@A;=@<=<><;>=<=@GKE97:77987789==;:<<:9<;;<<:ABA@>@@AA?>>=?C:7:<:>?ABDCFJHFC@=88675655875778989<<9788:?99:88875478678>9798986576778@C<89996696787;CCCGFDCA?:<<><;::;;9:;99;:9:??=<<;=<>FHGEFECCEDEGEDECDFEDCEDDDCDDFCCDDBBCBBEDBCEA;968979;:664;E?;<=><@=<<>===>=;<=<<<;<<==?<>=?=<<<;<=<:=>9::;;9:8;<9:;;:<<;<98>DB@<9@B@BAACBAABCCBA:797887877777766<=<=9:9::;8;<:;<>@965475465456768:7:=;;:;<;::?E@=>====<<=<>@?AB>==@A???>>@A@?=;<>>=>>=<>>?CB>A?;>A>=?>>@@=>@@?><<==<==?EKF<9:789989:8>>:<=;<<<;<=;:@B?@?>?BCA@A@BFABCCEEFGFGEBEDA?:868668667988;86987;=988:8<<9:77886468578=:;998:6797899?C=::<98:987889:BHFA?BDA@@?=<;:99;:99:;<:::>?<==;?<;<<;=<<:>=>?>>@@=;=<:>?;=><<>=;BA99<989:78:8;=::=<:==;==;?BAABB?AD>BCA>;869:87987888;??<>>>@D=:>>::<<===;===9:;:<9:;9:9<>878476587585748:89<<;:;;;:;;DC<==>@@>>@?>@@@A@>>A>>>>??>@DA>>?=;<;;=A@>>><=@@>==<=><>CBAC>;>?>>>=>AA?>@A?A@=<==<=?DHH@9<89:98999=>;<<<<>=:<<;;>A?BBAADFBCEBDGGHFFG@>@>@?<@CB?;869849578879:998898::9:;88<9:9778867857:<9<988;89:8:<;?B=<=<98;996879=CBBC@AABBB@==;;<88::99;::::=?=?==>;<><<><=CEDBEDCEDDCDEDEECCDCDEDDAGDFFCCDABFCAAAA@A?@GE=5897888:99AB::??=?@=<==<=?<=?<=>=;DC9;<89<>;;>?CBDEDDCCCBDDCCDB@E>9;<=;>><<=<<>?<;<;;;<:=;;==;:<<;<<<;?CFD>@BD@@A>AC@?BABA=88:989;;:<>AFJK;=?>@H>;>=:<><=?=;<@<7987998;::9:>96868874975557;=<<=<:<:9:<99FD@@A@@B@?AA>>?=>?=>@@>=??>?@AC?8>;;<<;:@?<=A?;>A==>==>=>BDAA><>@@<=>=@B>?ABABE@>>@@@BDHJD<:98998798;?=:<<<;;:9<;<>DCEGDEGD=?E@?BA=B@><:=;>=;@B@>:7578586669668987998:<9;:99<79:858868966:;9:;568:8:87::=C>;;;<65:66;98CD98=ABAC@DC@@>::<97;:899:88=><@=?=<:==;=>=BGFCEEABFBCEECDDCDFDBFCCDECAFDBBC@>@?=>;::96>HA98989<;:88?D<<;=:;=<;<><=?=?<;@??EEDFIFDDHBFEABEB@DDBABBC?<9;<<;=<;><;A@;8>:::=9;<:;><:><9;;;8>BCEC?@EA?BABCA?ACAB=:8;><>CEFJLHGHC=4459473745546<<:<<98;989;8:DCCB?@?=>>>=>===>=<>===?>>>==@C=5:9>;@=:=BA=<====<>>??B@>=>==?@?<;<>@@AABCBEDB?@CBADGIFC879777766;>;:;:<==@ABDDGGEECB@>;9=><;9::==:=:<;=;:;<99667:;9AE:7:68@EA?DACC@::;;::98:;999;?><=>>>:;><<=;@DCEFD@CEBEEBCEDDEEDBCA@A@?<=EEA=;;9677567668CD>965789;86?E<;>;9;;<<===>>>>=><<=;<<=?=?=<<=<BDBACABB@?@BA@BBAGDCDGGFFFDFGFFHIGA@>CCEBABD?=>==;::<=;8979:9767679>>55385868568659;9:;879:88997CDA==>=<<<=<=>;==<<<=:<==;<<;@D=4:7;@@@<@<;;>A><;;<<<>@=?B>?<;<<<>@=:;<>?@AABBCBCB?><@DCHHE=78976777:>>@A@BEHGHLPLID?9767659:97796:;<<:788998:?B@95666755675788:76::998::899<97767754676679=997588687764;B>9997868:78>B=678787;BB=?@@@=:<::;:9999999===::<;=<:9;;:?DCCDD>ABBBB@BBA@@?>>?;99:759@;555556667694599BA866975678;<=;:<;;;;@EHHFECCDDB@ABEFEB@AAAA@>@>?=AA<9:9:;;<;9<><<;:9:98:;:;89;;;;;;;:79;;>@?=>AB@=@CBCDHIHIHDDB>>CCDGGFFFEDB@?CBA>;>@ABA@?>=>7;:9;;8:8689=>7778;77978897:=;<=;9<>:8::8CFA?@>?@>=?@=??==<=><>?A>??>>@AA@>?@==?@==@A>>@=<>@>ACCCEDBDGDA>AGEIGDB<:<=<>??CHHJNMKQUOQXPDAA;9:77;98;:::;99;<:9:;9;9:>@CB<66796965878:;98:<;9:<9:99;<;9998976678797;:;87677:;89::BC9;::9;;79=B?:78:8778:>D?=CDB>@?=>;9:9888:<>=<;=<<>=:<=<@FCDEDBDBBADA@@>::;:99879786:A<9:7676777587988>C?879:8896;D@:<=:=;:<><<<<;<><;>>===<<==;;><=;;::::9<><::;<<9;<<:;=9=DB@CEDEHIIIEEDDBDEDCECBDCCFEBBEEC<=CBAAA;<<??===>9<::=<88:868=>98769768795878<<9;<8<=97;;9?FA>=>?A@==>=<:A@;;>>===@EB69=:@@B@=B>?B??@???=??>?<>DA>B@=>@?===679;5:9779979<;=<7:<<8<<89=<89:98;859:88:9;<97797::6898AF=<:;;;>88CA:8:88879787=DB=BB@A@<=>;:;;9;<;?>;<>=;==9;>=?DDA@A==>>:=<:;;98::77:77;69:?=99668778759:5796BE=79976989EC8<;<;<<:;=<<>=;=>=<;>===;@EEFCDFBBFCEDFEFC>@@??AA??A>?C;<><:<>?>=?>:<>;<;;;==;9<=<>;<=9<<>;;78:;78;8677:=:8577658756759=:9;:::98;<99>DC=<=>?==@;<>=:>=<;=;==<;<>=?EC68<:>>==?A>??<=B@=>===><=B@AB?>>??>A=:>@ABAACDBACFDCGGHGJHFFJNNIHFJI>?BAA?AJ`fb]QFMN?6579978;879986:85:69;99:=?AC>767669567958;::::99::8:98:=<8988887595674;=:;7687;:79:8?E9;;:==:9@C<7777985776598?BA=@CFFC>:;:998:9>>:=<:=<;<>@?>A@;:;9:988:99:9:98:7786786:7>=:778875758766474=F@:8667879DB:;:;=;;;==;<><:<=;>;<@>:=<;<=:=DEFCBD@DDBEEEHDA>=>?@?>@@@@@C=<;;;=><<>>==>?:<;<=;99;;:::9;<9@DBGDFCEDAADDCEDCDCBECBDCEEECBCAACCBBDDB=<<=>??>;9;<:AEA>?A<><77;96::67769;=658758548855:<9;:6:;:9<;;=>BD@<==>=;;>=;;=<;===>GB989:AA;;??>@?=>A;>?=>>>:?B@BB><>?;>A;:A>BBBABEDBCEEJKHIJKHHEHHFBDIFB=BBAA@AKSQQVOGeuN1655977:779878;87;67;87:;::E?58:678559738::9::7<===A=;<;;9668:66975:99<=978857;57::;>E<;;:99:?B;667769658767878@EA??EGHEA@;99<8:BA=?@==<@<<>=<=>;<=9:>:;FFEDEEDECCFDCEE@;A@>@@=>B??AB>:;::><<=@<=<>@=:::;99:9:@CBCHA@C??@=>@B??ACBFFEDHCCGC@DEDCECBDA?ADB@ECA==;=>=@>99::::>BAA<:=;78:87:987776=;5664665466467:;;99=<:<<89;:@E?==<;===:<<:<<9:;9;==>?=;;@CC;9;=??>>=?@==>A<=>>;<<;<==@B?===<=@=;?@@BDBDEEHKKGILFDFEFFFBDDAACBCCB?8756568565656657::@E??GJEDD=;?>=@AA@?=:;:77:689757667988:986977878:85896667;>75576664456477458>D@9676657>C=;<<=<<><;==<=<<;;<<:<=<=<;<=9:DDBCDDEDAFFBCED@<@=>>>>@>=?@@?;9:==:<;<<=<=?<;=>?@CDCCDA@@A=>=:<=;;==?;;?>@@:::;::;=>C?:?<98::78:87:78;?668776658:68>><>;8:;;8;97:;@FA=<<=;>><<=<;>=;<>==@>==>:?DF<@?>>@A=?>?@A?>?<<>?<>BA?>;<@?>@ABFEHIJHEHIGGUjWCFGEFFEBBCDCADFECDACBBDHIKLJJPTZM656:7678859869868:769868876@D88:6998:::;==99<888:88887:97;7689::986:;7<=99:86898:<:7>ABDED@:8877758779766955858>CBADGHFDCC@>>=<:9967:76:77:857988:979:89:8889::977876998=:5577577576578668:@G>667867>;<>@=>:;;;;<<;;<=;=?<>@>@??@@>?BB>:::<=<:<:=>>?CGEEFFEEEDDA@>>=:<<<;==<>>=@A>DFEFFEEEGFDEBADDABCCBBCAAAAB<<;<><@A99;;8;<8878868:78768<>77779<;;<;77::;=98::9:;9998?E@;>===<=<=@<>=>;=>;;<=>@BE>:C>>>=??@A=>>??@A>=?=>>>>?CB>ACDGHHIFGCFFBABDLICY€rBJEGFFF>ABDECBEGFCBFFGHKIIMKORRPF96797688567857759:88888:767=A:;<;<<:;:79<9779767788776999;679777889887;=99<:8:<:::9:;BILJHHHC<977:7767758766746::89:7796698689887878879988899:997:999997868:77<:57766677765766788:CE:87757;C@=;<=====;>>><=<:;;:==;<==<>===CFCEDEEFEEFFEGEAA@=>B@>>@>?BB@<:::<>??>=>>=====??=@A?DEEDFEEGHGFFCBDEBCCEABCBBDBC;:=<;:>?9897999999=><===>==<<<<<><::<;:<>>?B>:>=>>?BEEEFEDEFFFEDHFC???AhuAHek@FEJIFE@BDDB>BJMKJJHFDFLSYa^]SFDC93655655476775666567689899:C@977677687786677667657755767896788687776558747;9576455566455346557;@B?86758C?;:;:<=:9;=<:<;::;;:;;;<;<<=<;<>DEBBCBBCDDCDECB@=<==>??@?@ADD?<@@@AA?====<@?>>>??@@?@?;=<=>=<;=<;==<>@@@BCCCFDFHFFHFDEDCBBBBBBA@CDED==;<<;??868989887;::9978767767778;:99977788788=EA>>@>>=?>=;<<<==;;<;:=<>C>98<::==::?@@AAADBA@CCEEEFGHFHMFBABBBEGJIIC?BEcoD@KMEFHEEIFBGHGHKKJMKFIIEBHWhleel[C?B;36665765675776668999:;:;;9<><77566775777549678754688789:98676696667957877769;9:;7987=LKFGI@76655696:9;>@ACCCCB??BCCCGGIDA99?D@=:767778786786776665666888797788677776666667;;4675665457644457668;:;<;;;<<;;;:<<;<=CCBCADBABDEDDCDB=CBBBBBCEFIJIF@A@>=;745554=@===>??@>>=<==>=<=>>=====?@A@ACDEFDHHHFFGHGEFDACBCDCDFHHG;<:;==>>:89:4788778:>ED=:7566766549>;6975876886678;9;79:969:899:CD<=>>=>?<<><=>:9;<>=:;:9;<;=D:;=::=@>:78=CBCCGDFFCEEDFGBCGEHB@BABADGFIJEABDHMEBEBGDAAFHGDADGHHEBEFCEFEDFUX[ba\RGBA=656756757787:<::<;::98<::6:;;965765776567467677568889889:9576568646548:888789:688776:FFGFA959::;=AABB@CC??BDBACBBEFHLJIIKC=9>BCA<778686778777767856878:99978799677767769;:>=4584666647557567567::>CDB=;DG>9;::;<<9;;==<;<<;:;><:=;:<<;>=DAFB@CCBBDGDBFDFDHILJGDDGIKGFF@:7665777774>==?@?==<=@><>??>>==??=?B@ACDGBDEGJIGKMIIIGEFFFHGFIKFI:;;;<;>@;8;878::?>=?==@DA9578677469<<8796775775666<9789998:9:;99BE<=><>>;===:=>;;;:::9<::<:;;D:8>B?=BCB=9=>>>>@DFGCFHGEF@>FDDDDFECCDEDFGFCABBBBDKLMHHIIKGC>??BDIG?8;ADC>986677576777768778678797687886998::;==<:<;5665565544446456465665;@BACFHB=;:99<=:9;<;=<;<<:;=<:<=:;>:=;DBDC@ACDCDFDCHIHHHIIJHEDECCBA?;968665667759??===>>?@?>@=?==>>>>===>>=?ACBEEHDFEFIJJKMMJJIIIFFEDCDEEF:==<<;<@>:=@?>??@>>;:98>DB<89877668;<87:77757757989:978978;99:;:@E?=?=<>==>=;<<=<<:99:;9;<;;=A<=DID?>=>>:::89?7@BFEIOIDFB?DDFGHGGECCFEEFFD@ACCABHJMJMJCKJEACFECHLJKCEHE@>>>@DOZVJFGC:9<;9><;;:;:;989::;<;::;99;9=978787568778696698977:879:;<;778667577866988998868899:=>CIJEFFBCEEBCBAAFCGHGIC@?:788=@:<;;<>BFHA<=?BEB;8877798888667589777977999;:9<<;<<<=<858:8765754467456468655766678?CHMHA<:98;=:;::;>=;<<<;>=;=>;===;??>@@>A?C>CA>><=??==???ABACEFGHGGKMONMMLLIDDDB=BABEGHG<==>=<=@D@?A@??>;:98:;99>DC><987786:=;98887678658:8::89::8;98:;:@F@>>><=>:=>;<>=;<>;:;9:==??CDDCBCB=:98:<<;7:C6@>BFEHC>A?>ABEEDDEEDCFEEEFGDBFGB?BCCCCB?HKHFEFE@DJIICBEB<:=<;?>;?==CHE>;=@DC><:78:779876876788:<9;<<;=<:;<757778779<;5866787676457777558676988:CJIEA;::9:::<<:>=;<=;:==;<>=<><<>?>>@A?CC?>@=>??<<@@?C@AACBFLILLJJJIIHC@BBA?CBCEGEE<===>=CB998888:=<988876775558:;88;:99<89;:9>D?==>===:>><<>=;=?==??ACCDEDDG@:;;77?B=<=C:@>=FB<<>@=><<=:8==?>>>=<=;>BEHB=<@DCC<989578889:9:;;=><<?8<78;8775849BB????@B?@C@ABB@?@>?@?=>@??AEDC=BFKGHGGGHJJJD?CF@DCDDGDDG<==>?=;@C:;<<=><9<;97999;98?C?<8:689><876874665766:<:7:;6::79::8;CA;=><>=:====@AAA@ACDCABDABBFA?=6796:@?>==?CEBCEEDCBADCDFHFCGGBEEADC?AAAALJCDLQWTD@DDCOXTK?=:BHHHHJHFC:<;8<:::<<;:<<;<;;;:9;99699<=85887787599587869:789769::==76777;78:<>AB@BC@>?A=<>==CFDFHDBB>;;8689669=<>B>;?=;>;6;>?>?>;??=>@=BIG>;?ACD>97:7<;9;?<@::;;;@@<;>:;><;==;=?@>BIKJIFFGEDFGFFHFDCBBDDDBDCADCCFA:::67:979;77?A>A@=@A?@BD>CB@?@?>A?=AA>@DEFCAABGFDFGDEHJIEB@FDAEFCDGEE><<@><=?@<9:;=::<<9<977899::<=@BA@AFFGDBDDEB9<<=?ANF?<7467;<9;99=>>?9A=?ECLXREAABCACDDAAAACBDGGFFGHIHEFGFAKGBCNNIHGGDDFHLLD@;;BEIHJNLHB<<;9<9;<=;<<;;;;::<;8<99988>=6797566699898777764766998;@>97;;>>8>?>@A>?A><==>ADCCCEDBE>9:78;978869678=?>;8:>?>=:8>B>>?=?=>=>;=BFHC:===;9678779767754665767666897677;576664665346557657666566:67CA8879@EC>@>;=>><<<>====@?@DDGHLKGGGFHGEEEFFHHFGD@CEBEBCBAEBBGC>>:569;79566<>AC@@BA?BCABC??BB?CCACEDBAA>CFA@BFFFGFHHFIJECDBEEFBDGFCE==;=>=<=@;7:::999;889::99::78:?C;AHEBA6776566565566::896978:7779=CD=?=?@BFFGECBCB>AA@LG8<>=>@DD@:84778<:66:;??>@AFB?=>BA@CDGJIJJJHFDC=;C=GJB@@BCGQTIBFAEE?><>AFFHIEDB@;9;8:::;;;<;9989:79:;9::8789<977666778878766;886789;;<=@@=@AA@@?=>;;<@D>?B966699779665478;=>:99>?=><9=@==<=<;<;=;:;=CHD<:=C@B=975978865665577567365666566776668;:5685554563345545656667768:@?>:799;>BFB@<>>=;;>>>BFJJGGFDFGFGHDEECCDCCCEGGEBA?@BDC@@ABCDCA=;::67:97765:A?>@>>>?BBBDCBACAB@??=<===>>=>D@@ADDCHHEGJHCA?@BDBAAABFD@>;>?>=?CA<;9:<;:;97;:78:99;:8;@@>CB?J;9:8677567877::999;;;;=??ACDDFFEEIBAAAB@ABA@DEBA<;BC?D@>CD=;966:=::??>??B>F?;?BBNNED@?BAB@DBAACBCECFKKIJJIHIFABDAEKHBGIECBHKFDHNDA?CDIGHGGFEFC?=;:;><:<;:9;:9=<;<;;;;;::<6:?<8:88:867;97::7:<7:==>@BBBDBBD=;=>?@ABCECCDB@?ABADBAEA;=;><<>>=??;@A><<>;====?=<>AGIB:;BC@?8788759;778668766957:788768978:;;984665655467468457857966867@@859::<=>ABDEJFEKHHHHFEHGDEEHFHEFHEFHDDEDEFFEFIE>CBBDBCADECEFC>>?88::97978:?BAACEEBEA@@B@;?@>===>A>=@@@>??AABCFFEIKGHIEDAABBDBADDCD>=;<@A<=DA9;97<:8:;8:97:;99:<;:;@A;BAJC=88747967957<:;=>==CDCEHGFEAA??=@A>BBAAC@ABDB=?=<@A@BB@?C>89879@ED??AEF@>BCEEDDDCDGJKGJKFIHEHJDEFFIKHCEGEDEFBAEDEKEKKGFICDEA>EJC?;>;<@<;>=8<=89=;:=<9;;<9;99A>8:<:9878;=:;=;=A@=ABBAB@<>=>DCEEFFBEDABB@?BD?ADABBDA>;;BA:7:87978687;97;A@;::=@?><;<=@?>;?>>>>><>=;=@CHG=:>ACB=;8868<8786779967768857:87:858;9:87678748766458865974;768;:>=;<@@B@=AA=?A>A>@<=A?=A@=??>?A>??>?BDCDJHGKHEIHCACCCCEBAECB>9:==<=<@B799;9;:988;79;99::99;99=A=AME@;756769<:;>@>BECBECDDA?BCA?@@@?>CC?@@AA?C@@@B;:9799:BGC><=ED99>EE;=DBCECCEACDGCADBGGGEFHGGHFFEBBEDHIE@AKJIRLDGFDDDEHECB=C<7:BECC<;=::;==9;:99:;:::9;;9:;9::=<:99<==;@@@>;:=ABCEGGDCA@BAB@@?AABACC??CBBDBB>999A?:8:88967:77;87=><;;9=<99=B<@<==<=;<==;<=;=BDF?9<@C@>968:78867777746665777669:8897;:66544556567666666668855967;C?=CFGIGCC?;=>=@HFEFFFGGCDIHFFFDFFFEGGFFEEDEECFFAAA@ADAADDBBECAB?=A<;:>>=>=?@@>=@><@@??=>=<>=??=??=>?>>==<>C@ADFGJJGFGFD@?@@CAB@DDE?<;@><@=@D<89=88:;9:9999;88<67<::<@>AHE?=;9;==AEBBHEBAB==>=?GF@CFCAB=>AAAAD>@DC@A@?FF>>@BAFEBBBB=?;58::>=<>=A=;:CG@8>CEDDHC?GD@B>BGFBCDBGKHEEFDFGFCGEAEIEHECFECFILKEHBBDHAEMIEFCBFF@BE;:>?;;=<9<<:;;9<=9:=<9<=:79==?A>?CCBB@?@?:@ACBGFFFFBCC>ADBABEBBIA=DB?BD??DA@FFD@=:9=A@=;7::779988;:7<=<=<9=<=>;;><;<>?EIB=>?CF@:9:76:75:9669669558965:97:97<=569565:478468657735867;<<@CFGGB>@@<<:679779?EFHEEGFDGIEFIFEHHEFGFEFFCFGDFHECC@ADEBCHEDFEDDA>AA:;?A;=>9=AA?A?>?AAAA?=@>;?A=>A?=?A==@<CCDEIEEIGCCC@?DEADDCGL>;:;<==;>C:7;::9997:877789:97899<;=?BCDA>@CECCD?==<=?=<;==:>CB??BEC?>@=@BA?@A@BB>>BEDCBA@BFDBA@A>>:6768<<<<;?C<:A?98=BCDCCBACBB>D@@=>ACADFEDEEDEEBEECCDDAJGADKHDA?BFFCEFEFEEFHEHGBDD@@<;=;:=<7;=89;89;;:<<999<:;@ADBDEEEEDB@A>=A?<@CABABACA=@AB@CA@BBABEE@<:9::>C>769758:979679:;;=9:<<:<<99>A=?>;;<=;;:<<;<=<;;=@EE@9=DDA?:8:85897686678567879789988<;57755666754565489:><>@>9;=<=?;:?A>?B>>A>=@@=>>@??<>??>=??<>><=@?@BDFEEDFFDCFEABEEGHHJLM>=<=>=<<=C?979:8=979<98:87;978:9==@>DGIFC?<@A>@=;<@<=>;;<=<;?BAAEEA?=@A?AAB?@DCAA@BGHEDBAAEFCCAAA@<8798:?=:>BDDDDDDHCCF@@?@DFBDECDDDFCCDCDEABEDIKF?@?;;;@KJGEHF@?CA?ADBHIA@@=;>=:=;::><9;<:9::;B@A@BD?>?ABBCDCCEDDCD@@B?=?<<@?:=CCBABABAAADCBBB@@CEEFB;;=::>>E>97876799697789==?<;=>=;;;9=<=<<=;=>=;<>;:;=?EHB<>>BFB<:978978:867:67::6:89<<87>?56766565889:<<;=?@@?>><=:;7?B:678679876785786>EFEGEEFDEHFDEFEDFFEGFDEDEFEEEECBCEDEFHGHKJGB@?@@=AB>>A?<=@@>>@??==>>>>=?=>ABGDDECEFEDGGGIJJLKHHHF<<;<==?=>F>8;:9:<:8;:67;99;DA;89==;<<;<<;<<;<;;;<>CBBAACBBIJEGD?CFGEDD?BA<86879=<=<@MD9?A<89=@CHHEEDE@CECCCEGFCCCAAEDDEECECDCBCBFJD?@ADFABJHGDDGFD?;;>=AFCCEAA@>=:;:8:;::<=<>A??A?<>@=?BBGEBBDEEDDC?@@@??=@@>@@<>A>=?BDCBA@CCAADBBBBAADDEF>;><;;<=C>:8986897687788<>@<==>:9:87;@=?==>?;>@=<==;=><;<==@EFEB;=CFB?;68:789988979::7::9=B<7?=6888:;;:?==>?@@><;<:9988:;6>@<=><:=B?AB?=@?=????@=>??=@@<>?<>>>?DFBDGDEGGFHJJKKGEDB??@9<;9;=<:779886878:==>CB@@<:9>;986:6>=989:;<:<9:899;:::99:;<==>??===<<@A=?A@@@?ABEIGEB@BEFEDBAC>;855579=;6=ED;?D>9:79@HIDCCCF?=>BBFFFDDCBCABEDBBC@ABD??CICCBBGFGHEDCBCDKHA;9=@EHC@CDBD?:9::8;=??><=?>@@?>=>FEDA???>>??>==>>>@?=?>;>?=>?@CCB@AAA@BA?@A?AA?BC?><<:8<:9B=79978985776575:=<:=;9777658??<;==<=<=;<;;<;;;;;;><:>FFB;:>CD?;9877878756:66898=<=EF@;<<::;=<=@<<>=>=966867666;96:C:67677656765675795;CEHGFFEEFFEEDEEDEFCCDEEDEEEFDDEDCFGDFGGEFE?=>;:==<<9:7;>>>??>><=?<==>>=>=>=<=>=<>?=<====@CDFFGHEFJJEBA?<;=>??A;:<;=>;:>?>>?@A@@>?BA?@EKJGEADCBDDB@C>;878::9IKDAA@JHEECBCGDBDA?AABFF@?ABDBE>>@LHFGC?<@ECIG@CEESK@BBDHKFFF?@DB>??=??>>A?=?@@@B?<=<<<:88AA@?=<=@?=@@=>A>>@@?@?=??===ACCA?@DBABA>?A>>?AEC<==<:8;::@>99;99:868756768<:8::8986668>?<;=>:><<;<=;;<;:::;<>:<>AEFA;=BEC?;999667578779;8???<;<::=;;;=>><868879877<868E;5765886775685676679=ACDEFGCDFDDEDCFDDEFEEFFCDGBBCDCFGBEIEFGF@=?=99<9:7:88=?>=>>=;=>;=;====><;>?<=>==?ACFIHJJFCEA;::9=CDDCCBA;;<==;:;>GBCDB?@@@A;898667549A=::65648;;9:99:;<89978::6:979<:>?>>=?>??==AB?AA=AC>=FJGGFCACADAA=A@;9;99;:9BM:;?DCGC;9:;?CBBEB?CEFED@<>JHFGD>::>FKFBFFCJDBB??CD@DE?A@AA??=@A>>A@@AAA@?<97776686>A==>>==?>@A?@A>@A@A@>??@>==@CC??@DB@A@@@@A=@ED><;;=;9:<;>@;9::88867657687:96997689669<>><;=<;=>=;=<;==;:<;:<<<;<>IKB;<@CFC<:9768899=<=@==@A?==<<<<<>;;==<;=>>>;8:;888889977D=7776897667778779678879<>CIFCFECEFFGDGFEFEFFCEGCADGBFFDDFGFGIB>A>:997::;99@@>>>>>;:<<=>=><===>@>=><<==?ACBFLGFKIGD@<;<==?@CJHEBBBEB??@BCCC?ABAA>::9875456666668>>;976757=;:9989<:997779:8::8:99=>?>>=>>@?>A?ABB@ACB?CGEEDAA???=;<=>=;:89:77@@BGFCDBGKFB@A<;CFIFKPJDBCEDFFEEEB;?GHGGDBDBBIHD@C>>;:?>>??@=;>??>BAABAACDD@@@>;:98687955777?C=<>?=<=>@BA@AAA@BB?@A@?>?@@DEAB@@@AAAB@@@>CD><=;<<=9<<;?>@><=<:;<<=<=<<;;:><;<;;69747769=>=>==>=<>?>=><<>=;<>?@CFEDHIFFD@=?=<<>?DFFHGEDEA?DACGFEBADDED:8897778687666656767<;;897776>=::<;9<<:96887::9:9:::@>=>B@@B@@CCA@AB?@CAA?@88;DFGEIFFL>9LJBMRIEFDIMEEB@<>GKLHQSKFCDFGFGEDCC>>GKFHGDGEC@BE>?><=?>?AA>@A?@@>?CCFIHEFHF==;::;:9:89846686>D@=?>>@@??CB@CC>AADBBBC@>ABCDEDD?A@ABDC?A?ADC?@A=><<:<:<:D=9;9:9766875874::78::9::767<=;;<<<=<==;;<<:<>;>=<>=<==:<=:;<==<;=>=<;<;9<:68985=?877768769777866:86:7676689@IJHDFGGEGFFGHFEGFEHFFEFEFCCFFDEFHE@>=878768589><==<==<>><>@<>@???DFHKIGHFD>?<=??CFIHHIHIJIHHFD@=B?HIC=<=;=F=87977887:857768767998:967874>>9:==;:;9::;8:889;:;<;;>>>>>@>A>@BA>@A?>=;=A=:>=;;9978:86<:;<7?E;9:BFEFGBCGA:KJAPSGGEEDD@FBCAEIJKLJDDECBBCED=@=>==<;=<89;686777:4:DB>??>AA?@BBBCA>A@BBABA@@>?BBCCCA@A>ACAAABEC@A@>=:<;9;;;;E?;;::9865766576;>:9:7:<<968;?>><<>=:>=:<>==>;;>>=?ABAHDDEFDILF><>BDB=<<=;A?>>><;:9:==;>>:<>=;==>>;;<:97:76875;B:666688689698779:5878::89;?FJHEFEGCFFFCFEDFGDEHDCECDDCEEFFFFE@=;799779887<@?>>=<;;===>>>==@BCDGHJKKJE?<<<;?>>FH@:;:8;CC;6:78887;967779868978;:67895;=89;<<:8:;9:6<97:;;;:::<>?>?B?B>>???=>>?>;=?:9=?;<8679776:<<=:;><99AECGBABED=@EDDEFFEDCB>CGFEGFIIJIEDCABB?BA;<<:;?DHHA<;;:8:959777897:AB??@AAA@BBBCD@A@A>ACC@AA>?BDDBBAC@>ABB@BECA@>>>;;=;:<<;;C?<<:789877675899??<:79=;888:??=<<<;=><;;<=??>BEDFFGFGFEGGGDDCFHC;B=>?=>=:::;==>>;=?>?=<;=<;>>:;>968877:57:@<8669858::6;988;:7;;=BHEGDGDGGFHFEEFGEFGCEFCDEEFDDDGHC@>979;78;7;9;?=@@?@DGEGHIKIC>>===?EEGFCHHJJLF@BDBCEDC=<====@GC;9888?B<78676658765687875675:;86886:>:9;;<;;99866:97;:;;;:<@@>@CB@@=?EFEEECAC@>A>?CFG@?@?C@BCEFDCC>@?99;86;767877957AD@@A?>@BADFBCCB@C@@BB?AA>ACCGFAACBB@BB@CF@=?<:==:<<;<<;8?A;99669:67866866>?;;89;;7699=??:<>=;>><=AAAFHIIHEEHBDCBBCDC>=>CIE?=;=A;:==<>@;?=;;<;;;=;;=:;>=:;;669876669C<5976;:58:88;:6:<9<98:65:94::=>?@>??<>BAAGEDIJFFB?;<>>BECCHJHKJGGJFILHCBDDCCA>?=<=>;;DF;88569:=747755566357677666549:65765:>;:98<=969858789<:;>><>@>=?AAA==>A?@A?>==<;<<<=:6;:5855864<<::;:7?=99FHDGECHC?GHFHD@FFEA<>HHDCFEFGEGKE?FDABDEDDCAACJIFDDDEGFIIIC>?CDDBA??AJKDA<=?ABEBFEDBBB>9:8597697767656@AB@=?BA@DDDDFDBDB??A??@A>>A?GIA@AAABCADH@=?<==::9<8;;;=9@C;:9677686557648=@?@;;=86778>@<=>=@@CCFHGGIGEGFEDB@>BBAA@DA?=<>CIIA;A?>AA?AA=>?=;=<<;?;;=;:<@<9>968679;779A?8566888==?A=<<<;98667765876;GIGFFEFEFGEFGFFEFGGEFEDDEFEGEEGEAA<579668667:=B@??ABDEBDJIFFC;>=;<@DCDIIHKHGIGIFFGIHJGDA?=>@@?B?>?<=9?GA:96679:6676666763478766686589755768<;:;89:79:;7;8;<>;:?@;9;;:;:<@;;==><>>=<::;99::97:754766549;:9:88A=6:ABGGFDGIBFIEE?5?GDA=<:CGEHCEHGECB@BB@BAA>@AACFJJMME@DGACDGDEBBIG@AC@ABEI=26?ABAAFCDA@@?;99667757567784:DB?>?BBCDDDDFD@B@><=><=<;?@@EG??=B@A?AGC==>=:;;9999::<99>=<@>?=?AA=<===?EKD<:=BBA=?A><>@B@<===<9=:9:855887:<<;<:9;968:976>=978;;<>><9977877697777657787;HFGFFEBEDDGGEEHHGGGCBCCCDFDEEDDA<:7886686657:BCBCDDHJHCB?=::9<@@AB@@FHFGIFBCFFCAGGIJGD?<=@BBB@;>?;::>BDB<77:::999767687567778679688:868656=;9<:9<;;=A>@?><><:;;:;;;;<>====;=>=?>>><::<;:;:::;66:75659;;:::8@C97@IGCDDEIHGHC969@EABCBEECB@A@;;;88:799877954;DHFDFDBDCDBBDBAA@>?A@?BA=?A=BE>;A>=@AEDCA@?=<=>;:;;:=;;;=CC<8788689669757<@>@=9<=?DFDFHGIGFECCCBBAAEE?>@@@?>>@@=?AB@??=?A@ADGG@=:ADB@@>EC@>;;:88:857:7997799667668966:@IFEEHEEFEEFGEEGIDDFCEFCEEEDEDEC>99<979999<@AEFGHHD@?=;:;ADBAA@@>C?;<9:7:778877975:957769787:869;75??;>>=@B;<>=;<>;:<<:<;8:;9;=9;>=<>A?=A?<==:;;9;:;:<79985989<<;99:>E:8;HOBDFFHHEIF=::=EGFCBCEBBECBAA?@BAEGGJTb^TVSOPNKJIECFFEFFEFCB?DCCB==GE>EKJGEECDEEFDAACB?<;98;769;956:5;CCEECACB?DCAAFBBB@@CBAB@=>??AFA>>B>=DI@BCAA>=<==:==:;>?;?EB>;778788:56:86?>>CECDFFHHGFGGDBEE?@BA@DB@DA?BA=?B>=@?>ADA@@>>AA>@DEGF<;?CBB@<=<<:9;:9<:8:979<98>A;=?<<:9BE<8879987:67:68:976987879:9:8:>GIFEGFEFFEEHHEFHGCDEDCFDDGCDGEEA;:::;<;=:9;<8::9;87:;;99;9==;<==<@?;<><:::9;::9:98953568<<87::7=:89@HDEECEDCDB?>=>EGFEDBB=?A@BEDEGC>DCCJSYUOUUUTLIIJTYJDDFGFD@@EBEED@?CCAEFEGEACCBBCADFCB?<96967679657548ACBA@BBABBB@BB@B@ACAAAAA>>>@?FC=@@<@FC@CCAAB@>=:9=;9<;<;@B>@FA?A@>?;?AB?==>>>=AA??HG@=>=>=:;;9;::78@D=66997579659667788975679775789CJFEEFEFEEFFEEFFFBDBEDDDDECDFDC@;<=@AEFJGHF?<<:7;@AB@BGIGFFGDFB>?CDEEBCFEECDIFDHIMQJEDABGHGHEB@>B97<<@FB65;8796566749766656975998:;>=>=6;;A>?<==;;=;7:;::9:7;;59;:9;<9<<::;;;A>9:>:9=;9:;87:76966896;>97:86:=87@DC@??>@@A@A@CA@GHECGD>CA=AC?@HFCMTOKTbXTXWQRMILHEFCHLKJEFEDGGBEF?>GH=DQIBFBBDDABCCCEB><8578548966958;@DDB?@BABCB@BC>CEAADB@@?<;>>AJC>A<:><9<=:=?B?;;:;>@ABC@CCBE@EGEFDDDBBCABEE@AC?@BA@AA=?F@;B@=A>??A>@AAB@>=??;><:<<9<=:=;8:=>===;:=;:::4;?B<8769956946956877:855887::76;:?JHBGGCCHFDFEDFHECHECEEBCFDBCBACAAGIGFCC>=?;ED957679657658657567::9:<<98:7:96:97=><;;;9:;9:=:99;:8;:8997:<9:<=;;;==<<=;;9::7:<889987676874;<8898:==<<>ABBB@?@=@?>BA?FKIDDD?====>>:>ECDS^XPU\UOPYRMUMJEDTSIKHD?FBCIBACFB@DF>BLC;??FCBADCCEDCA<75666769576677>EDA?@@>@BAAB@?B@?ACA@@??@>AEEBACCBBBBCFD@BA?@B>AC@?AC??>=>>==A>BB=;?@>>@@??@@BJF>;<@DC@>=>=@=<>;:<<;:<=:9<><:;:;;::<87::C>86787658778467649976776997::7@??CGEGHCBCECBBACHHGHFBBEFEFGGKJKEDGIFHGGGFGJGBDDDIIIJIE8687:GE<7787:856986999<==>=:78978:87:7697=?>=;=<89;:;;:7<::::9;;::<:8<;;;9:::;:89;86:66993:?;=@>>ACA@CA>AA@CEBBDC@BEILJDD@>;==;;>=?FEERZPJOV`UQWRPfTIFJ_]JFEC?DGEIG@AGFDBB>@C==AADGDCDAEDDDC;7757777:477779?CBABAA@ACABAADA??>=@FG<@HD?A>?CAA@@AABA>@==<@@>AABBBDEFC@DBCEHDJA@CDCBDDBBCAAFC@@AA?B>@B@?@B@?@>>>>=<@<>??AB@>>@@?@A>??=@DGGD=:?CDCBB=?>===<=<:::<::==<8;9:<>;=;:;;DA97896787787878866:76767788976;DKFGGFHGEFFEFGGFFEADCABDEEGHECD@=<==?A@CGEEGCABAAACDCCECFIHEEDEFFFEFGFIIKIKKJJIHHJHGJIBFFBIIHHHH;7:99CD<9868;::<>=?@=<=<=;=96866997897697:><;;<<9;::<;:;=98;98;99;;:9;<:=<=<;;:;9:8999<979998987<==BD@@CBAA?>?DCDFDBEDDFECDGJMMHDF@<=><:;<;?FFDMQEBMRTWSYQU]RIGEMKCFHDBDGGJGDADDAAAACA=BDAEJA@@@BCCDB<987768876887899CDB@BB>?BABA@A?B@AC?AB@>?>=ADGBEE@=?>?CCCCBABCABFIGFFDB@?DBBDFFCBEDBACACD@DCCBCCBCDBAFCA@B?=@>@A?=@B@AB@@??>BBBA?>??=?@>@?=A@>BLH>:=ADFC@>=>=>==<<;:<:;>?>:<:<=A=;=;==CA=98:789768796;888968:68989968A@BA?===<;;9668769867677;A<:==<;8:=;9;<;98::::9::9:;;<<:9<;;:::9:988::::;<>><;=<;>CDCJODAS_LQR[ZROLHHFCGJMOECEDJKJJHBA@=AEJE=CA>EJEFD?CEDEC<89956777789968;CCBAAB@@A@B@?B?@?BA@A?>?@>>ACHGC=>>>@ABFFDEFFEEFGGDDA@<;;EHCABBABAA>=>?DDBFDCBABCCCCDDCBA>????A?@??ACA>@A>>><>@A?ACC?>?>>>>=>>=>A>>;AFGD=;ADFDA@>@<=<<9;;::;<@A<:=>=?>;<<;;@A<8:8688778867877978:868:78;77;IGDEEEGGFGFEHIGFHGHHEFDB@==<=BFFFGDABB?CADEB@ACCBACBADFHPJFCEHGHJHGFEFFFFJPRQPHCEEDEHIHEBEFFFHIH:889;=FD9667=B?<@?=?@=><;=<987557568666947B>:<;;;89;<98:::98888::99::9==<;9<9;;8::<==>>>===::<>HCBA@GFA@BDCDDA?@;>=IKECA;:;956@KIIHB<<<;;==<@CBFHECN[TVYV[LIIIHJJMPOLD@EGNOMLKBAB?DJJEAB>:@IFGE@@??@@>?>=ACEFHIFFEEHGCA@=:899:99>CGCB@>?=>?>>@DCCDGDA@ABBBAACCCAB=??=?@??A??CA<=>=>==>??AABB?=@=;?==<<=:>>?<<>DJG@;>DDDC>@=><;9:;99:;>A>;><=?=><;:;=B;69867:7799786897688778879989<;>@DHHHFCFFB?@=<=BHJFAABBBCE@ADOT[MEFEHJHHGGHGEEHJLQTMMHCDEEGIIKH@BBEHJHI;888;=<;:9:957;@CC?@AGGCAA@??>===;;=DA866633423@MHIID;==:;:;;?BB@@BCHMQSQILGEGKGFMMJLKD?DIJHKNECBACCFE???>;>GDD@>BBDCA>:57857667865597BGDAA@>?AB@???@>>@?>@@??@@BGIFDDGDGFFHH@ADA@A=:8798798:9?CCCBDFBBCFD@?A@ABBCACC@A@>=<>>@=?@????=<>><>>>?@@@C@;=<:=<=;:>7:><<<:;AJJA<;ADBA?><><<:;979;<@A>:;;::><;;;;A<4687677667657868777986876979?FGGFFGIIKMMJHID@=<9<<>?FJJLKEBBACFE=>=@>IKIGCABCADE?CJVVHEDFGHGFFFHJHDCIHNMJFMJCDHGILJHFBA=AAGEF;:9<<:?C?:9:;>><==?B>==?><::75646556646765<<:;;:9::898899:9::7:988976::<<>==><<;<==<<>=<>@:4134479:=;<:99?A@A@AEKJGGBCCCDGJHDJJEIMGDHKFAHNDC@@FEDCBA?BA=EHHEBADEDB?;75676679666788>BDB@@@@BCA@BA?A>AAAABDDHIIJKIGJKECA@@???>@A><<86988998:;?BB@ABBDECCCDCCBCECBAABAABCABDB??=>>?>=?>>@@>>@>>?>?=@?=BAB@=<=<:;==;<:;>><9<;9?EJG=;@FDBA>=<=;::9;;=BA>;<<;<;<;;<=><>@=;><<;;;87547566655765;=:;<:::988989::98:7::88::9:<;>@>ABDGHHEGIGD?<;:;:9?A@CDEKKFCEGFDFEKPJFGHFBBDGKLJJHHE>=BHMOJHGAB@=EJDIB@FEFFA;65887967677877;CDBB@?BCCCECBCE?BDFDGHHJJIIHGEBDA>B=@@<=>@A=<;9987<97888?>=>>>><?>?>?>>>ABC?=<;;<=<<<<:;>=;<<<<<=CKIA;=BFC@?><=<<;;<>BA=>><;>;:;<;9BA879767777967878:7699779;9=>?EEGILJIIEB=88;=>AFIGFFFDFHGGEFIGFCCKRI`QGGHJHEDCEFFHFFFEEEDEFHHHHEEGGGB>EEFGFHRPGHJHHHHIFGCBBEIHC=<;::==@E@99=A?<>;>=><;<;<=;98656736656675:?;:<::;99;<9:9<9;;;<<:;=<:;<78:88;;869887789759@C@BB@E?<88=@@@=<><==<<=<>EFEHKIGHHFGFFEKFFC====;;>BCBCFJJHEEFDEGEQVLFFJJB>BEGIHLJEA=@BBFNMB?AA?@CJ@?B>DGEFD<77876977887598;DFBBCA@DECEGDEGEDIHEFFB@@=:B@>@@>>>>>@@>@=9;:8;<69;;=CFDDDBCFCBBEACCDDED@?AAAAAAABCCAA>@A?>?>=?@@@@>>@>=A??@@@BA=<==<=@9=><<>>===<<===AGJF<;?CCCB@>>?==>=?A?><>;<;;8<=9AD:69969:69;78<;9887899;;8<<;>>?;9<88;89<<9<<<=<;<;<999766659:87:97976:868978?A?ADCAB=667=<=?==<<;====9:?BCA?BHJHGGDFEFGJLKHFDDFHFCHJFOIKMCA@?;?EAADABBAEEDECEFCDE>985587958877889@DDCCDFFDEHHFGHFGGB?<<<<<<=>>C<=<=??>><>==>??;9;899;8<8;=??@=>?>?AA??@C=???>??@BA==>;=@@;?=;=>>=<:;<>>=>?EJGB<>?==BC>=><:<<9<9;;?B;8=86=889;87<88998<;<:9=<;9;:887566557627548>;9<98<<<<<:<><;;:5587698567769779978757:8669?DB>?EB98:4688?D@;<=<<<>;=<<;=@?AFCDGIFHGFGMMKLLGECBFIFBGMNNPOSI@>@@@DFCABD@>ECEEFEFEDD>777668866:46:6;EGDEGFEGFDEEBDDCDE<7;;89<<<>AA<>=;>???@>=>??@@>A@=>B>==A><<=::>>>?>;AIGC=<@BDBBA=;>?>@A>><:8;99;;:?D<7<:8:879;;7:;:=@@BFILKJGC@=:<;=@FGIIFGFEFGLIIKFECFIJJFHLHLQDDS[LEKVNKKHEGEBCDFEEBBFECEFBEKFBEDBEGCABFGNKFIMDEFCDGFDFKHIHDDCFFA@;;<>EEB@=<9:;::;:9;85766476647568<>;;9:>=<<:7:;;;;757667866767998996898668867;BEACFA<8855665@D@?=<>@==;<>>CGGC@CFGFGJJGGGGNMD???<=<=ACCFGIJKHEHJIJNKJJEBGKIIIFKRLHSKCCEDADECJKAA>=@?ACHHGFGD<77679776877987?HHFIHDDEA?>=<>AAA<7;>:8;<<@@?AA;=><<=?>;;;99998<99;BDBDDCDCBACBBACBCCA@B?@BAABCCCEA>A<>>>==@@@B@?A@?>????>??AA>??<>B@>@=<?>;;;;;8;;9<@E@:<>@>:89<;<@>CFDEJIDCA<<>=HJFEGFBHIEHJIGDBFGHGILLEDIJZbMFHHEDFFDDMXRD?A@AIIECDEDDHFEIJGFEDEFFFDDFIJKJHH@>@GKGEFEHIGFCEEDIB?<;<>CFC@=;?B;<=;=;><<;::::866555577689::@B>;:9789988789;997687886665778:88::9::9888<=@=>GIB@DGHIHGFFGGMXNDA@?@<<=@EEFGNMNFFCELKPMKIEDJKFHHNQSFGQNOEBCDBACDDFFE<=BBHJKHGGF?86798:;<<;;AC>=<;::;::=<BCBBBCCBEABABBDBCBDB??A@ADBADDFA@@=@?=?>>>?CBA@@?>>>@@=@??C@<>?>?D@>>>AAAA:<===>ABGLD<9?HGCCDBBCADC@@>=;;;;<9@?BEFIHGGFC?><:<:;=BD?<;<@>=<>><:;9:<98;9558868:9;9:=<===?=<;=;;@CEDCHFKLDAEHSSLIJEDJMKFCIGFMONLGBAC?<:>BAA@CB@ABCFIGCED?:8:=@GD;=?===<;=;:?=??;9:=;9;<<>>?A@<>A=;==:=><:>@<;=99:999:98@CBDBBFB>BAA@ADABDB>@?=A@?BBACCA=@>;>==>>=>A=@?=?@>>A?@?<=?@@@>?>@B@B<:<<;:=?<<>==>>BIH::AECBDEEEGEAA@=>9<=;::CDADDDBBGFNJHGA?<:;=?AEFBBFDCIJMSOMOLF@BEEIHFFHIJFHJJJJFXZJNVMFIIOVERoio}nL?CADLLHEGIOJFHGHHGGKIDGGFFFJKLMJJIGF@AFFDCDBCBEBCHBKG?>:<;B<==><9=<9<<:::878=;;=<;;::;BB<98667469658767857:869757754965:86986:97BG@?ED;8;778767978BE?>?=;><====A;7;@CB?@CEB>>GGFGFEFCBGHECA?>=?>BDGHHC;>?:@:9;;:8><>D?<>@>:==9;>9:?;9<::9:87;;8?DCCDA@D@>BC?ABBACB??A>?CA@AECCBAA@?;>>;=?=?B>>@A<?A@=>>==?>>??AAB><><;>=;>>=?BFIC=>?DFAEJHC;A@=>=?GHBCFHLNIGF@?<<8?CCCECCHFGLMQNPTSQNIKJTPFIGJKHFIJFKKIJJHLKDDJUXLUk�YHPQadYKBAEILMJHQSYNIJHGJIFKHBGIEFJKLLPNJIHFECBDDCBDECEFEFFGMB;;;:<::59:46945;AA@>=>=<;<=<==@EHFHKHFKMIHJIJOZWIF@==:=AACCCDFPOMJIJOSMFHGAAFHFIHCBJMWKFH=9@aL5FF?AGEBEFGJKHEHHB>@A==>>ABA?@@QjiK:<>==><;;9;<>>C?;@<;;;88==;BC<=?>;<=;<<::;<;:<::<99797:AA@=@CADC@?AC==>:>@=>AB@?=?=>?=?@=@=>CB>;>@=?A>=??>A>;;===??<<=>;==:@@BIG=;>BCFGEDCA@A>>BEBBFHGLMHHH@=>:;?A>ACBBBDGGHELYOTPLKHDB@FFJKHJJID@AGKKKLIIGEMTZPLacNR\[NFGJIFFGHOKFLOLGJNOJHIIHJDFIEEIHFGJGQOOMNHKJDBDABEEFFFDCHEBMMA=?:8=;<@D@:?A>?>;=>;;<97777=?;;><9;<;;=;4776997687388776557967976876:857867979CD=CH?:;=77:7697699=EC@=A<==A>>@EAGFJILLT`mePKKFDIIAIKGJJJHOKRR<5BR>:HIGIIEFJE@B>:BGED@CHJC8ACADD=@OURI@:=A@;==;<;9;BD??>9;=99;<=>A@>>=<=;;<=<;=;;=;=<=9698789:CF?ADD@CD@AB@ACCADD>?B@>C?AABB?@?=>><>A>>A?BB?=>@<=?A>?@>AD@>A@@=@?=@>?@A<<>;?A=<==<==<<>?<>BDGE<;DFEDDABEHBDGEFIKJHGAA>:;>@>>@BDFDFJKILOIJNQIKGBFC>CGFFHHFHGB@>=CKMFJIH^cSTYPNcj\OF6HNHFDDDHMOKMONKJFEGHKMOLIEDEFEFGFFEIOLMMLIKIEDDBFGDFGEFFIDCJLE><99::=>AB?=>><:88867856758<<:=;8:;<8:;9;@?8855975696676697478579668648666897899?EB?D?;9986975984676;<>==;>A@AFCHJLI[msjUJJGDIOGBADHFFKRMQR@5:;8>FGHGDDG=?AAFJGEHFDNKH?9><>>BACFFGG@9>=;;9:;=:;;@DC?;:;:7<<;><>A>><>=;<><:;::=<:=@99:96898:CF?@B@@B>B@B@@ABDDA@A@@?A>@BA?@@??=>@??@>>@?>>??>AB@?@>@?>>?A>AA?<==:=>;==<;==;=><=>=?FHE@;?CFEFKIIHLLHHEAA=;;?=>@?BDEFFEEDKSRNKIFHJCEDB@CCBEEEFFCADD@ED>GJHKQHP~zSTUJMXhdQclWPFADGIMNJKPONKHGBFFLMKJEDDEFCDFEFGHJKMLIKIIHEDFHEGGGFHKJGHGMKB:98;;89:968758:86867<=9<>;:;<::;:;@A78778776:767669956877897796798888788;CDBCD<78:86875995677;FD=>@=<>><?>@A?FCFNOIUZZZRJIGHDFGDNKB>BMQJIJB>?@>CHAAFOMCEPJJHFKIBAFOOQHDB=;9>BEEDDFD;=>;;<=;>==:@DA?>=<:9=>;==@A?=<<><;=;89::>?<<>9:::68;::AGCACABB?AAAABBBDEA?BA>?@@>AC@?A@@=>???=>>>?>=?>=@@>>@AA>>@?@@??A>C@?=<><:==>=;=?=;>=;<==<@DGIA<>AAGKKHIIEA@><>>>@ACDDCEIJKHFFFLNKKH@ACE>DEAABEDABEEBBBCA>FD@JHIPRJOjeQ[_MKJbŒ`}¨nWKUWOKMNNPONPLGJGFDFGGHFEEGGFHGFEIHHHLIIJJKJGGHHFIGDFKKJKKDJKC;;:;;;=>?@@BHHCDCFC@C?CEGJOKHLJB@AA=?B=BEBMQNLKLKJKIIGCGCFPSF>CIIFHGCDCCFIE?DIZZHHNIMJBII?@INTVSTDA=:;CJGCBED=>?<<==;=><<@B@?==>;;=<<;A@=?A@@AAAAA>?@><>>@C>>@@=@@>@?>>@BA>??=?A??A>BAA@==<=>=<>;=@>=>><:>=;>>@HJEAA@A@DAA??=?AAEFDDCBDIHJJJKHHGGIFBDD@BCDAEE??ABBDDEHEACD@?CA@DEJMMIN[^TV\QMHY¯l¯}`Pgp\MKNQQOJJKKMLFEDFIIJHDGHFJHHEHKHEIGGHHHKMIGJJHHFGLKKMMAGKE;<<7698788887667;:<<:::;:::;;:?B;87877789788786598675875888;;<>=<;:=DDAAB>9;76789678678769@@DB?@=>=>=>AA<>GB=ACFFHGGKILKKJHIIFB@??>AAAEFFJKJONGGIHFDFKDHIKEBFEBCDA>CGBDDCCCER_OAFJSPOOGB@IVTR^`EBABAFIIDADC=@>=<<<=<>==>A@><;=<<=;>>>?A>==<;;=;9;<;<<><;::;:89:::;>DHGBBCABA@AABAACECBB>?@?>AA>BD??@>=@?=>@B?@AA@@>>>?>>ABAA@>??>@@A@CBAB?;<>=>>=<=>=>>=;<>==<:?EEIIGFFB??@@CDEEDCBBDEBFKIJFIHJGDDGD@ACBEEBCDC@?AAFHDCFC=@ABDAC@ACCGKBQeaPHKKJFH‡�Yˆm]O]eUONKLJHCBEIJIHEFEEGGDEGDDHFEFIGFHHFEDDEJKIHGJLJILJLMNK;CMD9=?=??A@?>7;<66887878:67679:;<9::99:;;:9<@>878:5788887578557689:;<=;<:;;;:975;EBAE><9966789678688678>BDA?>>@===>BHB@FECFJFFGIGKJLLNNLIJKD?=@>@?DGGCFIOQLGIJEDHGIJHEDFLFC@><::BHB@BDD>>DSMEJLUYTPJC;CWVVbbI?@FECFHC?DD<=<>;=<=<=<=?A?<=<=><><>@@?A?=<;;:<;9::::=>=;::::89;99;=CIFCBCAA@?AAB@BBEGC@@@@@=@A>BA?@?=<>>=@?==>@@AAA@==>???>@AA@?@@@=@@@@BAAB?====>><<==<<==;<>==<;?DCBHFHNHCDGFDCBAAA@ADDFFJIGGHBHHAEIEADECDABBDGEEFEHGDCB@@BAAB@@ABA?BCABB?BCBB@?BSVKBGQKPIFJKHDFDBB@EIHFDEA@EBAGHDDEGDFEABDCDEDCGHFGGHJIFKKMLLMJ:@IC<>==?>@A>@99;65567668:87767<::99;99:;:99:?@8669656678767;;9;;<;;;;<:867665457?EABF<:8676678668767667=D@@?<>=<=<>CVPDLIBAFCBCEDFFGKNQVQHIH@><===BUIDJMNLIHJIFFIGFHD>GPTFB@<;:9=A@@@BEHF@BEGFBEUQIJC;>LYWSZM?>GC@BB>>EE>;:=;<;<<;:==A?=>=>=;>=<=>=>>?@>>A???>=>>===<=??==A>@?A==?>??>>?@?????@??B>>BBAC?<====<;<<=<;=<<<><=>;;BGDGHJKA?BCBCCE@=BCBEDFFKEAEGDGHCEJECDBED@DBGGFKHADFB@AC@?BABB?BFDAFCCAAADFCBCCEDCB@ABAFB@?CB?@>?@AB@E>@A>>@B@@A>>@?ABEB>@>@BECADFFGIGFHIHKIDFG;@GA<@?>B?>???=:;75667677886666:;::9::99:999:?B86767679::9:;;<<;:;97767547766775;CB@EC:88677667667767767:BAA@==;=<<;AUSHLF@BFLFGGFDEDIKRY[PFGC?9;?BEVLHKJGGHHJJHHGIEEGEKPNJECCE>6;CA?@BDKL==ACDCAKKINIBBIRLOZRGBFB>>@@ADEA;;;<=:<=;;;;@@?>=<:<<<>=?=<@=<;;:;<:9:::;==<9:99<9899::@GECCAEBAB>B@BBBCBBB?>A>@>?@BB?=;<=====>@>>==>==>>??>@A@=@?@@BA@CBAB@>===;=<=<;<;;<<=;;<>@@DFHIHHB<>@>ACEHHGGFED>?CHGABDIGFEAADDCCBCKKDFCBDD@AB@AABA@B?BDDCIHDCEDEEEFGIIFEEEFIECHGHFEDDDDCCECBEAECCAA>@BCA@A>>?@@>DA@A@@AA=?ED@ACA@@BDC@>?:?FA;@BACA?==>B=<:76775787785669:;=99;:9:::987896687587766778778>CBA===?;><=FOHAEEIKMEBFGCHGJIOQWWGBEB=<=<;?>><<<<;==:9:;:;>>>@ADC=>==>;<>=>;<@??A>??>>?==>??@B>>??@ABD@@CCC@<;<;:=>;:;;<=<;<>=>BEHJIEE@::;8:B?BCABDDCCDB@D?CDE@DB;:EEA><::86799898689;;<:::;;:<:8?;9:6967778678768:76987667976>DAAE<77876:6698786688779?A@B>>?><EJC?DC@CDCBGGFIIMIILIIKHHGCADMECBCPQPLF@CHFIKLKSH@EPJABFJMD:9;@BCDABJHHEEJIIGGFNREEBCETRHEGFIIECEEDD@<=:=>BFB?A>?=?==>>;BA<<=<;><:<<;;??;<:;;<;;<98;AEDE@BDB?DC?ABA>BEBA@@A@>CB>>?==??==?==AA??????>>A@=?A@BAA>CBAADAAC@BA=;<>;<><=<>?=A=@EHGIIDFFCA><:A@BFF@?EGFEFV]GEGIIFDFGFEFGGFBAGGACCCGD?FF@@BCBADEBBD>BEBDIIINOMKLMMMLJKGFEIIFGGFIIFILE@EGELTMJGFCDEDBABAA@?DEAAB?CCEBDECEDBGIDBCACFIGFG;;FH<=BABBB@?@C>B=;==87878879789:<9:;8:<;;:;AA@D98:83486668887778648867897576888@D?BC<987779668888668888<>=;>DC?@DD@BEHJKHJGFGKHKLKRTLFEEELGCGHMKIFCADEFLOMLOHDCEDEA=AGD<;::@CDEDCHBGKGBIOKBDJA77:?OOGEFDCFIEOQCCD;::><;>==<>;=CEA@@>>@>:@@=?><>>;=>>>>@>><;<;9:;87::=EFEBCDCBBBBCA?ACBBA?@@??@B@@@D???=<>><@?<=?CC@@@@???C@=@@A@EHEGGEEFCCE>:@@BDFCGIEB?AFKLGDIF@AFDDCIJEEDBCBBDCDEB@AD@BGDBBA@BDDDDDD?CCDGJKJKLLMLLNKFIJFGGGGKIGGEDEHHCADCHLFDHBED@BCDB@A@ACDDGF@BJCBCCCCFC@GJDDC?FHJGHK;>DHB:>CB@BC?AC?@;6:<85676676569;;<9:=<;<::<:9?B75684799487666657878746:56875888AD?AA959776:769756867989ACACB@=??>@=9:>CFEAEOVYLEGEDBDFDA@DC;8:@BBHNCBD?DCEELLKNKGA::?CCDCHDFEFIKSPEHE=>;;>;9;;9;<;?GE@BB@?@>?C><>@<=?>>?>=@B@BDB<>;89;8799:;=AFFCCCCAAA?>A?=AD@?B==A?>A?>@C=;>@;=@;;?C>>@?>C@>A@EHEBDEA@AABCBAD??C?@EECBCAABBAECFGC?BCBCCBBEECCBCFIGHL9:DMG<;>?CBAC@A?B:6:;85676876899==;;;<;:;88;75?@==ABADIHGEACCBCJGOJIOLHQ`cWHKLJIJBCGD;79BHGBAGNUKEADGIFIF>FLC99>@BAB?ADBBJCCIOHFLFBE?CD@=?DDDCBHHHIIORH>=<<;<><===;;ADAADDAC>>??<>@B?>?>>==>>>?@=@AA@>AC??@?>?>>AA@?BACBB???@BCA>?BADGEFGFGECBDEFGHF?>>;>D@CMJGHGFFECCDCBIKEEF>ECCEEGDEGDBBBDEDBCFCEFFCCEDCCBCDCB=ABDFCDJLKLKIILOIFFDEEECEECIGEFGDBDEDDFEEECABBBABCBBBBBBCC@ABGDCBCEDDDBCFEBADEGMFHK;:GRJ?;<=BAAB=DA@=99;;9899;=JNEFBBCA@CCBACDAAIJFA>FABCLHROSE8?LWQIJMLKOJJDFG>:;@GGIIJTRMF?FKJJGGHLLA:@DDBA=AKBCIGCCHHCDD=>D>;><<;AHIKICIJOPMRJ@<>>@>>>;=;<:?B@ACC@@A@A?>@>>==>ADBADDCCDDBB=:;9::::<=:;CHFFDDBDAA@AB@BABCABBA@=@=@>??A>=>>>>>>=>@?ACB@BAA?=@>>AAAD@@>A@@A@A?AA@GIFFGFGFFFADHBILKIHGILF@=;BEFBEFIHE@DFGHHGCFKFDB@KMFACECDDCEFDFDDBGGAFEBDCAACFDBGFDCA>BDC?HMLNMJLNNMHEGFFDFFCBJHBCFFFEDDCBFCCFBFCBEEDBDFCGHEFHCGEBCCADGFDBDFEECCEILLKK:9BMKA<;;@?@=?@>>@==>;:7:69557665687:C;687487676867856886965666867887;C@@F>579668776657:879::@KFBHEBEABA?;:<=;DEHJGDEFJKDBHNHAFIFDEFGB>CE@9?B?;;>OM@:<==;>D@==::;>BCIGEHIIHDAAA>>>?><==;<<:?@=?BBAB?>AA=>===?@@ABAAB@>>@>A=:8:9:;99;;;AHCADDBAB@?BBABB@AC@?C@=>@<<@A?=??==<=>=?@==@CA@C@?@@>=?@?AA>@@@>@?@EFEHHFEGICCECEFFFJE?@BCBBFF?<@?;BB>A?<>AB@>=<=>;<<;9:879867977967B?97:66:767777974:967867:9598678>CACB<:897778798989>>?CDCDFFGDGDBF>=<9;>=:@HBAEJFGAHLLFGQLEFFGGJFFIKHKKKLMEGGFMMFCLNLGFGKGJDBFEBCA=@DHC@LE?;@@=A?<<=;BDIGCDEGIKJECA<=?A=>>=;;=>>@??CC@?BA??B<@?>@AA@@CCAA;>?>>?:9;;;8:;9<=?GHDBFD?DB?@AB?@BBC@=@@@?>>A>C@<@><>>;:B==@B>>C=>@>AGHFFHHEEFBCHHCDGABCAFD>?ABB>ENF::?CEDEFFGGEFGIGEIFAFC?BEEGHG@DDBFGEEEBDDDB>>@FEBCEFB?C@?D@ACC?BC@@EGEHHINNHFHHCBGABDEFEHGDEBADCDED>CDDACA>CHJGCD@FFCBDDBDBBBB@DGDDBDGFDFGKIJH;9@KKA<:>@;>==;:AB<<<@C?=<;;=;=:<;766654785695798;GMOG?@A<9=?BC@CBEDFEGEFHJHHJJLFAA<:==;?@>ABC@@DAAA@?BA>@@??A@?B?<>>>=?>9;;:9988;;>DFCCEDADB?BC?@B?@DA@@@@>@=?=A@@A==>=<<>?=A?ABC?@B@B@>?AA=ACAEGDBGJJHFEEHGFHHGBED>>?BKHACD>AB?GEA@BHCBBBAGJHFCADEHHDD>AEDIHDE@ABBDEEEA<CD@<<;>AJJ;=CFNQK><<><9>>;;=?@>??C@A@D?>@?>A@=>?@A@?ABC==@@<=;99:99::9=>BHEBADCAB?>@@@@CA@?A?>C>>==A>@ABBB@?@@?>@BADEDDEEHJFEFJIDILGFFEFE?@BB@ADJFDC<>DBCFCDHKEB@BCDFHKHBADCEHGDEGAAGC@EDADFBADFB>==B>?BADFCDCACCCCDBFF@@B?BDACEGGEGGGJHGIICDECBCGEGKEFJJ@DBBDB@ABBBADELTLCBBBDCBEC?EDBDDCCDB@ADB@DDDFKIE:;=GGAA<;<<>@===BD><=<=@9:;<<::;:885355467656768D84666764575566659679547646659<>CEA==BB>DD?=@ACFFEBCDEA@DCBDGGD@@>>>:@FLFFDGF?QeYJGGJFDIQKHKKLHFGCABACGHIKFJGE>CEAEJFKKC>;=IEC=<=<>=<=><<<=?>=@AA>?B>=@??A?=>=>@BB@CB=?@><<8:<:87;;9;>A@>@A?AA@??@==?><@B==@>=>>=>><@AAAA@>BB?CFCDHHDDJEDGFFHIFEGDBCB>CDA=>BAC?BCFFADC?CGFAFHCB@@CCDFGGFHIDFEEEEBAAEEFGCBCCCCCDFMA@<AFFEEFGIIFEGGFDDDCECCIHDDAHADAAE@@BCBBDBAHKD@B@ADA@CB?BCAABA@CCABEDBDDABHGG;;=ELDB;:;;=@==;>CB><>=>;<:;;:8;:676346667766757C955777744875496476576799:;<>?>:C@JYM?;>EFCEGKM>EHHD>=<=>=;>><=<;>>>BCC?@AA>@B@?@>=??@BA?AAAAC??<99;;:8;;9;=ADFDEEC?@@@B@>@@@CBAAB@??A><===>=@@?@AAABCEFEGIFDGDDAKGCFDEFEBB@=CMKEDEEB@?ACC?BFB?D>:@@?BDEEGFEJJEDEFHGFEFF@BGCBA?@BDACGB@ACACDACFE@A?A@CABCBBCBBBA@@BCCDFEDDDBCGFI;;;BKDA=<9;>>?=;;>A>=>==>;9;>;8;9787457657777767@<778766568655857869>;;>AAA@A@<<@DB=<>@ACACC>?@CDAB>=AB=AEBBFCDCA??CECFEADIHDFCBAKLGFKKHHBBA;:>FHIGGKIH]j\USLEKTVHJEEKSNFGEDIGFEEBHPF?BJJNFB;=>=?>=BDBABB??BA?@@@@A@@C@A@BCADA?>:8:;:;;:8;=@FEEEEC@ABBBA??A@BBBA@CA>@>=?BDA??>=A=>AA?DFDDDFHHGEGIBCCFBHFEFCED@FHBAHKCBAEFBB@D@ACFE?DOJ@FFCDC@BEFCGGCBGD@QVCACDCGJFHDAECACEHDBAFIGOICB?BEGEGJDADAADABIFAC@?@BBBDEDHIFJJHDEFDIGEEEDBEFA@D?BBCBHGBAEBBDBDFG@BACAACCDCACCCBCC?CFEDHFCDGCDFEE;;;AIDC><;;:A?==?;=<===<99976777666677678>@:777656657;;8=>>:>?A@@BBA><<<>AB@=>==@?ABA>?BC?CBECFFCC@<=@DCDCCCBEDABCDJKLJHJLJ@@?<;OOGA=DIFIRUQMA=CGNNJ?:;CGFGEFJOSIFSF>?><<>=>>=>>A@>BBAAAA=AA@AB?@A==ABBDBACCAA?<9:<99;:99;:@EDEGECCBBBBA@@A@BDAB?A?<@@>?ABA@A???>DB@DEDEGEEHGEFHIGDACEDCB@?HJCIMGB@EEBBBDBEBBBADDEC@BACCCFDDHGHJFFGFEDGEFGECEEBCEACDEAAEBBDDCDDBBDCACBAEBACBAA@CBABBDECCGEEEDFDDEEE;;:?JGF@;<:99<=<<<>AAA??;=>>=>?<9:96566677777657>?A>=;;=?@@?:=>==>@?===@A>?A?@BDBADEDDIEEEA?@EDBCCB@BDDCCDHMROKKMK=;;;::AGJHIHKJMh}mK@JJHGHGHKIIKIACIEAEF@HFG=HBBMF@BABDEGO]XRJE;679CFEDEJGABACYH>>=?>??@<=>=AAABDBDBBB?;::9999999=;@BFFIGDCAAA@BABCAAD@CAA@?A?>>?CB?ABB@CDCCCBDBDGHHGHHHGHFA>?@DBBDJIGGEBBDKHDGBCDACDBAFHDAABA@CDFFCEBDFBEDEGFGE=CKHAFJFBCIGFFECCDADEGEBACAABDBAA?ADCCDECD??AEDD?@ACCBBCDEFHGE@CDDFFEGHEFGEDDA@DDCCCDCCEFCAACEBBEADABAAB@ACDEB?ACFGBCECDA@CFGFFE;:9;GHHB;;;:9:;;<=>>BFB=><==?@><77;7365457756867;A<:;<=>=?A=9=;;D<=8;@GE>;==<<=@?@C:<=>;=?===9@D=>A?@ACC=DDDDFCDGCABBCCDCDABBFB@EFHPPLLLK@?=>G=AEDFKIIHNVNQaYORH@FDDNJFFIBDLE?BA@GFPALIIGC@BEHCCGFTXNL@B?:C:669@AB?BNG@HBA>B@>?BCCE@;=>>A?>?AA?AA@@BA@A>?C@@ED@AB>?>;9998:9889::AFGIGDBBB@A@?AA??BAA@A???==>@EGCCDFCAB>?AK\IDHFEGHEDB@>DI@AGCGGDEGKJEDFBDAFCAJHBFDA?DC=AGFBEFEBBBEGHHHDB@?BAAEFJJEJGDCFFAEHDCDACCGA?DBCBCBABC@ACAABCAF?@BB@FBBCC@@A@BBBACB>@FCEGGGFHEBGECCA@BACCCBBGEAACBADBCBF>BABDB?>EE?@DB@FDBCF??AFHIHDB<;9=<@HC<;===AA><:797565478:;>@=?>CCA?;;:99776579?==:>ADC>=>??>>@BBA:;=<;=>BFDCACCBDF@@AEFDEEEDA@CEBDDEBDFDCCCDEFHILLHHE@DTBCJLIIJHGKNQe|nYeOACIDMKFACDEDCD=>CACFIQMHKFCFHJHDEFHGEEFIF=;>:?DB@BDBHNIGDGDFGCEEGKKB<>>=>BA@@@??@?AAA@@AA@@@@CBCBBBAA=?>99999999:::;@BBDFDCBBB@?A@AB@BDB>AA@?AA?BFEFHCA@@EHNSV`LAKI@?@BCFEAAHEDDCEA=AFEEECDFHDAEDHEEA@@BBGHDFEA?ABBDDEDB?CFBCBB@@@AEBBBDB>?BC??@@CCBB@@BDBEEDBDBCEEEDCCCDGEADCCDEDDCAACABFFEEEDBCBDABDA@DC@BFGGDBCA@@A@BGNLC@B9;;=ELJD=;:=<::;<><9?DA><<>>B>=@>9:;9:;<@ABEGFBBFCA<876567567778@>;;;=BD@=>@@>>?DGA::>;;>@>>CBCGHHGFCCDFBA=ABADDFFAAEEEEDFCCDEDBGHIPPIKNKJEBADKLHFGEJIFLQMECIRYPIEEHJIHGGDBDFB?FGGICFE@ANJFKGEE?@IHCHGDQGJNG9KRGEHGJOPJBFCGII?DDNZ`M;@A<=BB??>?B@>>>BBB@@A???CBDCB??><=>:9;;988:<>8<@EFDDE??G@CEGFCBBDFB?DGFHFBBJD?AFAAGFCCED@?LGGECAFEFEFFGFCEE@>CGDLLIFBAHPOBBKHHIEBCC>?=D@BCAC@?DFFBBB?BCBFED@ABBB@>@A>CEFCDBCCDCBEE?AECCDBDBAACEDDDCEEDECDEADDFE?BCCBC>?EEDEA=<@FBB?B?B?>=B;=;>;>@CA@B@DCABD?;?EDCGFDA@?>=;:JG;88667789667:9A@;<=>@A@>>??=>BBEB;:><>DFHIJFACA@@@>=???BCBCFHEEGGGFFLGEOTPQRLJIKIHHFBSSGFIEHJFGONEADGPHIGEIEIHDEE@BKF@GHGHFEFBC?9CIA@GBAMICMBDJGRWI@AGHGFBCLQJFID=?JE@HYV`T=?@==@B@AB?>A??@@=?B@A@@@CBAADAAC<=?<:::87:<;=@>?C@@LMFDC?>@@?CABCEB>EDDFEB@EXZHLQMIAAD>AC<;FHEB?@@CDBABCGFFBBEA@BBFKGCDFHBACDGDDCA>AHECHFBCFGBEABGHGCECACCCEEDHLTTMMKCDHHKJILJHDDECCB?BB>@C@>@CEEDCEDCBEDCDE@=??>@CB@BBCDDDCCBCCBBA>>@CBBEA?A@AABBBCCBBA?BBBAEA>@BBBB?=@C@?B>>?>?@A>>@=9>@<<>8;GGFF>?=:;9;;:==;<@CDDCDJIGMME>EFB@==;:99;:8;JK>777468995999=?A;;;?@>==>?><@?AHB>?DGCFEEEDCDA>>>>@@=>BBBGFCJMLQTRLIEIJJJIILMMSNCDEDEFEBBEHHFGKOSXUTFEHIELGCDEBFIEDCKCDE?CDC<:BPNFE?=GGCJGHFKHFGLMRPNJCBBCFDCCCFHH@GJZbM@B@>>@@BBA?B@=@B=AD@@A=<@@B@D>?>?=AA;;=:9;:5<>?><=AA^\HECAA@BAC@CEDDBCA???CIZwgGME@><:9=B?CDD>CCC@BCA@?>ABA=CCABBA?BA?@@?>>?>CCACC?@A@@???ACCBAB?BFC@BBCBDACB==@?@B>>=<@B@B?A@?>;;9>?<<9;<:;<:89<=?JI;9:69;88;;6985??>A@>@><>?@E@;9><>=B@?A>;AHGHGEDHHCBC>DEBDGDBCCACHJKNMNNKKJOHFIDEGIIEKHKHOHLIGIJKJIIWq„ˆU]FBENIDFG@BBBD@@AEFFDFFFC=@BCFIC<;DMBHKEFKJTUTTUPNKFCCIJFFFEGJFBGGILH@>?><@C?AA??A>?B??BC@>?>?BCBAC?AA@>@>89;88:79??9;?@LOKDCD@?B@BHGECC?=ABBDCDJTZNAB<<@>AB@AF==DMOMGBCBB@>CBE@CGFD@?@?ADBAAEFFHE@IKCFFCADE@=AILIIHCBACCBAA@AIJFFC@CKOLLGCDABQNDCDDABFIFDA>A@>@@>ACCCBA=?B>?EA?AD?=?@<=A@B@?>?B?>A>@FD=AB>BB>AB?<>A>CB@A@@ABB@?CABFGCIEB@EEBCB@A@?CB@=A???@??@=@:=9=DIJI<;>><:;:;;<><>AED?AE>;;:76647959<;>;?A@==>><=@ABH?<<<>?=?A@=>@ACGJIJJFIGBCFGFGGEEGGFFCCMXTOLCEGJGHNOKGJMGJKPLNNWNNLKHHIHE\lQKORJNJLJJGC@BBGF>CD=??EBBJG?=:DLLB;=BKKOHCKPLLKNKGHKIHNNGGGGHCENG=@EJMID@>>>?B?C?>C?@CAABBABB><>@BCA?@CB=>?>:997:;7=>=BKUJBCBFGFFFFC>=;>?EGDFEAACCCDGEBCDEGE?@?@EHEAABA@FCFGHFCCAAADHGDDCCB@DACEGCDFB:AHECFGFFJIKM@BBAEKHEFEDACEDJFAB?BEBBAAB?@C?@?>;>@?>BADDA>@BA@C??CB>BAB?@ACB@BDFCADA=@A?ACCDE??BB@>@BBECFHJFADGEEB??BA?BAAB????A?>@??:<=@JOLF>:<>@?ABFHHF@B?=@?=98;878978:97@@@??>?@@A?BG;>;==?=>D@=?@AEILMKJJMGGIIIFIEEFDBBDDDDDCFJJJLMKHJKKJJMNMLIJPa…NEJJIFJLIHKLIILJLLKGHIJGKJGFCB>?B>EFCB?>;GQTSE;<>IKF@=>>=?AA@@ABAAA@CCCED@>@>?CDBABCBA=@?:99:;9:<<;;=?@AGFIJIEACDA@BFB@>A@BFGNEACHJEKF=><=@<:?HEEGDB?=?CIICD@ABAHEFEB@@EE@ADGGIFGBCGBAEFAEKE=?@>CBFEEEE>BDEDGKIHJEBEQNKMFAEBDFFFGFGIHDGJCI@DHGCDC@CA>ADEAI@A@>BAACDBBBADFCFEACBEABDCEHGGGDAEHDFDACCABFDFDCGGBCFFDBGJKKEADFGGGHE?>ABABC??>@@>=>@?<;;EOIHIEBGFHJJHIIJE;:;?D88796665687567=?@<88755668848876;F>;=;:@=<>>=?CADI;;<:::<=>AA@ACGIJKKLLGFDCGKDADDDFEEGHHIJGHKKKGDFDFGEIIEJPUQNOYzQEGJHOWNGJGLaaJUNKEEHEEHHDBC??C@==<@AA>@A@>ABABB@BA==>>BCDA?DCA@>@=;:9:999<89=?DEDCCB?>?BEC>CMEDCBK`bOIIWQCFDBFD@<@?<@@=@EC@CA@DCDF@@@AC@FGBDCB@BFFFCKYBB?ADEDC@@?ADC?=ADJNLC?BE@@EEGECBFKCACJIIFDBHGHIHFGGBCGBCJDDAGFJGB@@B?>?=@A@ABA=?>@?A><@BCECCEGHHIJGJIGJHFECCGJGIDDFBCEBCGFEHEBEFDCCIKKJD>ADGGGHF?;?BCC?AA@B?>@=>??CHFKI>?IIIKLGGJJKMC6;=@@:=;8797697569778676769D?;:<?>BD@?A>>HJHKKJJNIFGHEGGEDGGHMKEFFAADGJKNJGEEJNHDHKIOWSMKSQJKEDIGIOJHMQ_aLOJRIIFGEHLJA<@AACJOHHL@DEFGAACHKIGEHIKCDLFLOLIHHJJE>GTJHJMLIJEBAA=AB>>AAABBB@>>>@DCDACBDF??A<;;97899=BADCBCDA@DB;=EGBAA@ABH@S^PJHGLH@?CEBDB?CFEBBDDEFC?BEB@?DCDBEEADF@AAFGBEC=AJYEFEACBA=?AA?AFC?=>GNOEC?A=@FIFEGCAFGDGCCACEDGICDFECCEFGB@DDDC@CAGJF@AB>@D@ACCA@>>>?>>87886676788;?DC><87968866567786655876679BD:8<=@==>>=?FIGC<<>;<=;=>@?@@A?B@C=@?@BAAA?<>A@CCBBDBBDA@>:;;;>?BB;9<>>BABBCBA=?BBEBC??@@GGMKHHEBA@?DHA>BCEDF>@CHHJEA@BFIHAA>A>AG@?;@FDFGABFEHDHGA>@?BCAC=BJEBCAAAJD@@98CHGABEA?@BHIEDCEEFBCEJGGD@BCBACEADECB@CGIHGFCCB?@??AA?B@@<9=?>@>:AIIKHIFHJDCCAAACCEHGLKHIJHIFFEFJFCFGFFA?HEFJIEB@DEGE@@C?<=BA=@GCAFGKPLHMNNKNL?;:6@E8798669=BFCDBAAA;67:87:857:75:7578468469DG<@;@B>:A?<@IKIG>:@A<;B<=@>>@DHLNMMNKJMOMMMMJKKIKKGHMLLRQOOQJJKLJPKIKMHHQPGNOIMRFGHDILECHLJLYYNSMHNUIHLMMFAGLHFCENCABD@A;>@BKFAA@FMPFBCIMOLNHCLRHGMIHMTSSQODA?<>A;=@><@@>AB?@B@CBC@@DA@DA<>@?ADCCEB@D@@BABBDC?ACFVL?>@BDABEE?>ACFFA>::ED?PPHFFD@CCLUC=?AA@DFMEIGDDPhofYE>?BFBDG=B@ABCIHBEFA@@AE>;??FBDJDDLIBCDA>DDAC?9AIEHOJ?>AAEEECGFBDFDHJHEEDDFECCJHBGEDACGHJIGLKC@B??CC9?@@AFB>DGA===CDBDDDGLMHJKFJJEFJJEGJGFD>BGEEJLFECAAFEADE?:>ECB@@=?@A??BHIFECCC@FHA8567897877775566:<>ABBBGG=<;>=<=><<@EIIC==>><>=<>>@=>@FJKLKKLLLLMNLNKIHILNKMQOLJFFHIHLKJKPMJKLJJKGFMJHMOGIHGOIMUNHHMTOHMHGl~OIKKKF=;@CA?CHDDLD<=9B>@ED?B@>HNKEHJLINRLEIKJHIIJKMPSWRKD@??><>@==??>AB@BABCCB@BA?AC>=?>@CEACBBCECBDDCA@A@<=Tr]CA?DCHDGC@@DAAEAB8>JD=BFDADC?@@JPA=>ACE?DNNJFBJ^ok]PECBEEBDC>BEA@BEGFCCB@@>D>?EECBFIFDHGAABBDDEDEEAAFDOSI@BECBDIFEDFDGEDDFCDDGMHFDGHAEBBBCGHGDDIJGHHDDFCCHYNLNIDHJFA?@CGFDJJE?>==EFCDBBEILKLJFIGGGJHFGHGEB@FHEEJLIGFB?CCCDB?;>FFFAA><:@>>>?@@:?HECIGJIIJMKLNOJ>::;@B@>ACIQSE@=<AFIIMONMJJA:;<;;>@=;?DIHA==>;;?@FHIKMMLLMMKKKJJMLKNPLKKJGB@@?CBIHIKMNLKNNKIEDGHGNLKPOLIAMWRHEKLFGJHEwœVHGFCBDGMJBDJIBAMIA>:?=@ADGGEEEJIEIIHIKNHIHINGEILNMMORNLE@@@<>>>?>?CCBCCDDGEA@C@>>@FB=M\P@BCEFIDEAABFB=?DE;=?>>=BGHB9@RLDGSTJC??GG@@BFBCDCDB@@BGIC@BBEFHBFIJDCCCAADDBCB@CEFDEHHDCBIHBAFGEDEJHECHGEGEFEEECFFEGFCBCEC@DA?GFBABCFIHGHLDRWgWNJKGGIIF@<@FCBHJFDCBBHDDDBDFIIJKHGIDEIIGIFDFCADHHDEJHHJHCADBBDA@=;CHHC@?;9;>==?@@<=FGFIGHGIHKKKMPK@<;AGEEIMJOQI<;;;<>=;?ACEB?<<>:<=@CILKNNLMLHGEFJD>==?=>B@=><;===>@>@@@EHIJKLHIOMJKKHIMNMNMIFDB@??>>?>DGIHJKJIKMMJFDEHFLNJNJGDCGQRKEHMLLMMD\sRKIHFJU[]UIIKHB?CKJF?>CDCDKJHMJEFFIIKGFKFHFKPMKJHLQLHFIGE??A?>>?>?@>>BCA@DBAECAACCAAB@?@ADBCFFDAB@>AC@B=@DHC@W^KAA>;=BAAKEAI=?KIDGKEACBBDE?@HLEDGFEB?@EJLF@AFHKLFECDGCBEB?DHDBBBBDGGFMGDB?AGDADFEDCCDGDBHFLIIDBEKMDBFCFFEGFCCCAEGECDGDACIJNJIMLKDOPHEHIHFCEMNCAEFGD@BECGGCEGIIJILEGHEGHJHGGB@EGEGEEHIHHJDBFFDFE@>=CGGE>B<9:??>?=>=;@HGDEFGFHFDHNPIA;9=CEHE>==<:;;8;?=>:<=DJIIIGFHLIJLJKGGGEHEA@><::::;:>?DEDFEFFIMNJGIIEBIMGF=?OKISTKHHIMNMMLH@FOJNPPSSPLECFEFBCCGE?GJLGFBEHHJHJGFCGAFQIBCHOPKIEGMHDDFGF@?><=>==>????@@A@BBBADCB@@>@DCBDFCAB@?@=>>?ABB>;<=:;>A@?BDCDA>?AB@@B?>?AGF?>B;@BCABC??DCBJRB?FC?DEFEEDB?@BAFHHC@GECEG=CEFECFC@BCACFSTDCAEBADEDEBCCCCACDABDBFJJJLGDGKNHEFILGEHHIIHACJGFJKIKJCCFFHJGFCFDEFFCGID=?DCFHGEGGGIGEEFDDFD@??@GFCAB<8=:AKHFJKFELD:GMMD=:?FGHNPNMLF::;:<:;=@>;:>>GID<:;<;>@?>CEIG?<;;<<<;>@>=8<;;:::9:98<=;=ACCEFEMPNJILIFCNRNKHDSNHFOKFJIKMNPSJJCMHNNFEFGFAEMHEHHECC=IORHJFCEBDJME>BEFINJIHKKFBFIHJJHDDJIA?=>?>=?A<AFEC?>?@:@HB??>?@CA:;@=79>A?;?EFF>>>@A<=C@<=BDB?=>@ABBA@A??FGCDA>EJGGCFGEE@<=EFAEGMCDRRPEIC?DC@DE@CH?CIF@AA?AA>BDCHIDDBA@BIBBEDDCABBBDCBDBAA=BAADCDCEDCANRBEBBDA@DCC?CA@>@DCCEDCHMHHHJKGHMLFFJJGDDFIHFIIJEEGHHJHCDCCEEEEDGEGF?;BF@:?DCFEEEEDFHFHGFDDFB?@>=>@==AILMNKFFKG?EFEC<=CCGLNRSME>;:;:9:==@@>;<>:9?DIKNHIEDHKFLMHIFAEGG=;<;<>@A@DFJE?@??@?A@>@>9==;<;99<;==:=BCGHAISRMOMEEJNMMMTRJKJIHDEIJLLLRNTcUOJIHCBFJFCHHEGMPPOHBHIFFMJIF>>KSD>DIGHEEKJKLHBCKMJJLJKNJ@B@?>A@<=?=>AAA??@FBCCFFCDD?>BB@@A=?DHGC@:9DGC=;=;59A@>>?GGFA>?@A?>BB@===GG?@>EA@FEABBBBIHE>BB?EDBBADGFDBAB@GHB?BFECFEEHB?EFBCAFGHHDG@DEBDGGHEBDFCABCCCC>FABHFHKJLPOLHGHFMMOLGHILMIJJHIHJHHFEJLHCHFACCBEKJKJIJC98@D>=FGEBC<:9>=>?@?<>=<>@>ACFDAFKLLMIB=<==:?A?=>@@>BA?DEBFDDCB@=@A@CHG@E@?DCE=>;;CC;;<==7>@>A>A>@BA=@?><:<>=>??<@><::A@;@BACDA?A=FSYUILFCDCDE??D@==?B@ADDDGGQBHIDDCB@>@FIDA@B@AEHKIEDEEEB@BBAGFEDBDBEDCEGEBCDCAAABCEFEAGLEBIHHIHHFHJKKKLLHELQOMHCDFHJJFGIIHFDHGEKJEHGA@AA>GHIHHHD87@@>ACEGGDDBDDDFHFFFFCBBB?<;BGDEE@<<=?>=:A?9@HIJJD>HGICCFI@AEEHJFCDFB;>=;;;9<;::;=?=:98;89:9:;==@DDGJMONJEDIGDA@:=?>BFIHDB@>??>====>;<>>@FIGJKIJIB?=;<>><9=;::99998<>:;<=>=BACGJLIGJJGHKJDDWe`OEAGIFFHGILLKNSWOQLIIKJOMOSHAHMIMGEF??BCCFFGKJEABGEBHLDENNOLLKHDFIKPLHJOHDBAA????BEFGHHFHDDDC@=DAEGHDCGFBBDB@GGB??<99>B>>@CB>=?<>AADA=;??B?>EE@@D>FMA>DB::AGLHGEDCDGJJEF?DFC>GF@=<<;AHE@FKIHJDACDDE@@C@?GKGBACBEMGGGB=;B>A=AA<@CAGIEEIDHGDHI><=AGIEDEA:=@:::=:;<:9;<===;7:97;;8:<>=@A@CDHKF?@JGAFC=>>=@HKH?=@=?>=>?>=<<<=@>FKIHGDA@=;=>;;;:8=><;<;:;<8===:@<CGHHDFGFIIGHC?dWFGMPOMJKJHKKX]cYRIFGFEHHW`NGNHHECAC@;BDAGOJFFFHFCCBGFGFHIGJLWOCBEKHMIA?LGBCACCFGILHDFEB@@A9DL?BEBAEDBDA>DFC=AC@>I@=@GA;BA;IK@?A?>>?@?@@>DJCBB@DE==CCBEC?BB99@BABDE@@HFEGCABA>?CBABA@DFDCDCBBCFJHDJMGIONKKNJMLHLQNMOHFKNKEIGGIGGCHGDIHFGEBGLF=@JHHJIF@A@BBBFFEFEGEGIGEFEBHHCEE?>BEFHIFEF@;>BAC???<>CDHKGGHGGFFLI><=?<889;=8=<=>CD@??>?==AFIG:5=@>==?=@@?=>?>ABEKIB?>;<=<<;;<;AEBCB?@><<:<=<===?ADEBCCA><@EFHKHGDFGLS]T^pxdHKLJNV[MIGJHIHHJKGEGHFISJFJIBBFKAERMGIGFFGH@KMNLFKIFJKHGFPUIKGFDGJJHJOTMKSK?@A?@BA?DAIEHFD>>FIC=?D?:9FGHACAD?<;89>?=@B?=@KC?AC?ADB?BB@EB>?C?B?B@=>AA?@C@;>DA?CB@ADA@JF=<@CDGKIHIFGJDHI>9=<;CE?==>>>:97:989=;=><=?><<:7:;89=;<;;:::?E@>??>EFCEKF>;:C@=CIF><<:<>;;:::@ABBC?BFA>@@?DE@@A==?=BEA9:?=<@BBIBCEFHFv¤raqcQNTJMMKINGHKJFINKEHIDFGHMOj{[DAKFBFHA?CKNDDNMKLJIGFDDLJHEBHGDGLKDJJEMNLIF??@=CNL?BAD>DB?CDCB@ILB?B?>?A@=BAAHGBAE?EJ?;@?=DF>ABCACBB?A=<@>>DBDJD=;>@EGFGFGE@>CHGBECDEANGBDB>?AA?BFDGGA?CFCAEEDEBDC>>CC?DFEEHF>DIECEFDABEBEC?AB?ABDGIGCBFGGEDGIDBEEACHFCJKGKMIKMILONJMNMKLMJLJGIJIIMOKJJGAFIIJIHGDEIEB<@NLD?@BMKCDEGIHHFHFDHGCEHGEEGEEGDBIIDFHDFGACABDB==@>=@A<<><<=69;9<9:=;=>>>?><>;8<79;8:>A@@@<7:;7:>>@EEEGIIFFMI@?>???BBBDFFFE?<=<<;==9;9=CA@?ADBELF=ABGKDCDECB><>?=>=9:AC>@DCGMGIFu¯{NPROLKJIGKJKOROHFGGGOMJHCILMOmmWHFEFFJDBKIGKEHMMKWNONJECDGJHCDHJJPPDGKIECCDA?DC;?JJBFBABF=BGDAEDAEB>FKGBBDCEDC@BC;88;>BIJB=DGDD?>BBCC??@ACB=>JD?DC?@A@<@?CGCJHHID>@ELKBFDHMEMB@GNJDCEABHEBEBDEKDCCCCA@CEBBHGADFDBEGAEGE@CGGA?EEFCACA>ACFIGDECDHIJGCILFEH>AFDBIOLMLFKNILORRNLLJMQOMJGIIGJKJMNOJGCACHJGIEBF?>=@EBJbKBHDCBBGIGGFGFEHFDDFGDEGEFFBCIKHGJDGHCCBEIG<:??:?EACONIIFIGHC988<>=><:=<;:88:69:86;>====?B<:;;787899:@D@:9:88:>>;;;;==<<>=?CCGHDHK^{fICHMGILABLRVLHRNJGEC`oe\PVJFBIMKGGULCDEGKVWIKFHKGJDFC?DFJSPIGCBEDJKDCCHBACB@ADFECC@?C?=FIADGCCIAAIC@FGC@=@JE@@DC?<:7;=>GGDAC@A?@A@BB==@BJOEEB?=AFEDDDEEEFEDBCDFFDEFDDBDHFILIEB@?ACEE===AA<@CAIMMHHHFJE>:<>>=;:<99;:9:<;9:;9<@=<>?@?@?;=;=;99<::;=;9;;89;AEDEHMLFDGLOJGFFHGLMKCC>?@>;::99==9:;9=>A>=@@EDBDGGHFCFFFEMKHHDB==@>==;;====AEFHGIOPRNEDV\IIYO@ISNHKDHHCKNUWKJJGCGBAEFHELHDDKOKPTJIHGFEHFQLEJD@PSJLMHDBCABFIMFECADFCA@BD?>DDHHLFMICJQGDFCCCBAAACGABGBA>;=CC>BC>CAD==DCAD=ED;>GLICA>@@?>HB?>>>=8?HB>ACCCEA>?EI@EGEB>BV\EGHBCCBBCGJCBFA9BA?BADCCDDBEIECDA@BAAHHBBA?DEBEBACHF@ABDFEEEHHEGB@@DGBBEFIOPMORNPRQPONMJIILONMJGHIHHEGIKLMKIHECFDADA=BE?>GI=>@A?=>@BDEFCDDGHCBCACDCFFEHFCDCFEFFE@ADDBC??>??>?DD?HKIKIIIG>9;>=<><:<;;;=;;=<9<:=BB<:;=:9<;;><9<>=?@AADCBEFDJMJIIIGHIFDBDHFC==<=@A?<>>;@IHFGJJNNKJKPQNMQRHFUOOLHHEKNMJID>FKGLNS^XVNMJCDLFDMIDHOQHMKJQVGDJDOTIFGG?BBEENKJHFADCBDEB@BA>CIA=MIOKFFEEFB@B@=>ADD?ADJDAEA>MOADD@ABB>?C??B@AFEADHD@?>9@==BBB@BIMQUTSURPPQORPNIJKLNOMIIIGHJFIIFGKMMOKHHGD@;=AFHFDFJJMQLB@ABFGFEHEJKC?DCABEDEGFHGDDFDCFEDAFFCB>==>?>?A@BA?CIQSPE;9<:68;8:;9:99;@B@?D@?CB>?A>><=8<>=@=<::;;<;:;;<<@BEDDHIOIEJQONMA@@=<;:::<;:;;:;<<;<:8:<<;>>@ACDEGHJKJMPHCGJXcg]RJD@>><=A><>>8@INHHGFJKHHGACLNQWSELUJTPOKMKKHEIMVYRa]UdWOINNOIEB@JNEEMQUTNRJPIBGEGGA;>CAKHFFKKCHG>IE=CEBBC@?GG?>FHFDGE?BIF@B?==AH@KHFFD@EA=DC??>@BA@ACABEFC@A@>ACCA@;:<DFADEBABCFEDEFFEDA<CDCABCBCDEABABFDAAA@EFDGDBCCEGFDCDGDBEDCECAECBFEB?DIPVWVSRRNORNRPMHHKMNOKHKHEGJFFIFGIHHIJLMJGC=8?@@:>==ACBBCBC@@A=><;BB@@ABA?<:@A=;9::;<8>B>>AA=CGFGKNQMJD=:76=98;:8:;:<<9:;:79;==A<=CD@AIIGIGIMPOIJIHQZq{^FBA?<;<<=>@=>>>LMHFC@>>HX^UFEMTTMFIGONPQSKS_NTYQPLVRNTTVMNOOJCA?@GDADKOLKJBFEBBC@AC=@>9:=<:@IBBFDBDGIC>>=>@>AC@@HABFB?DE@DE<>EC;A>=>F??B=CC?BE?DDDB@>>EFIHKB@CBACABACABDAB@BA@ADCABACFGECCDDBFFDEBFECBCAABCGNTSPROMPOOPOPOHDJPNMLGGGEFEFFFGGFDGHILMKKJCBBH>AAA?>?A@>98<>>>?<<>??@@@AA?:>EBDDDCEBBAC@>>?@@A@?@>?AA?A@@A@<7>?:;::9;:9=>;;;9;=<=>ELHDB:=9789689:8::7:<;;87:=>@?D??FEAFNLKLIKMMMILLKIK\gWGBA@>>>;>==B@>DKECB;>@9:<;ABC@FGCDBB@EF@AB=;AFDGNEC@>AFE?BA;@II>9;=>C>>A<>EOKCDFVaXQBC@DGCEHDB?@A??BCAAA>@IDCFGABDABEB@ADBDGA?CB=A?=@@>=B?8===>?<:<;=BDBCFE>=CCFEIIJDC?AA??@A@BA@B@@A@>@>=>BB>?A>>>;:=><;<;>=;=;;=;CI@>=9<9:9989:::;;87:<<;?BDDBCEFCCCCIKKMLLLMKJKLNMONLHKHCBA@?><=LUKHFEEEB???C>7AD=CKJID@DFIEABA8;@GEFH=;B=<>;A=;CJIA@D@8DLCBC=@CFIEEB@?=@DDB@=9?OMD:<@?CJQKCDCFISZIHDDF@CGEDBAB@>?CGDBB@=CCAAABFFDB@BFFDACABCCFBBDABFEDDED@ADEGIDEGEEFDACEFGE@DCCADA?CEBAGLKMNMOSNNQNOLLJKKKOJAA??@ADBADEDEEGHHGDFHFD@CBGJIHKIGHGDBA>ACGDBC?@B@@@>;<<;=>:;<=;=@=<==?@>><@E=:=<:>?=<;:;>?BFE@>@BEFIEHDBBB@?@@=>@??C?=BABABB?CCCEECCD@?@@<;;:?@?:?DJHIIGGGHDBCEDDIMJKOOKHMNLMQMLLKFDDAA@><<@>=GECGB>?AAGKHK\J?DHLHB?@>BFE?@?==AB=EE@BJKGGD>>FFBCJB>B>?CC?>A?@D>9DCAFECEFABDB?BB>BB>?>>=BND9C?C?A>@GIDEGEEDBABFAE@BCD?>>AFHJKPMMJNNNTNGGJJKMNKC@?>=<A>=???=<<<=?<>>>:=>=@A=<>?=;<>@EGCCDDCEDABBAA@><<;::<=?AAABBABBCBACABDBABDFE@<@?;=@<<;??>=AC@B>>=;=;89::;;=;@CBDMPLJGBTRGGA@CCADHCCC;FBCEDC@@FC@EA?AB>BC?=BFFFGD>>DE@JIB@DFCC@DA>BB@B?>=AJDEFEIHDEHJFDFBBCCD@A??B>=CC@@@>?@=9>ECHCADE@>@@=DJFDEBDWXTJDBFDECDECDDABDDDCBA=?BCJGFGEBBCADIIDAEFCEGFFFC>?EHEBBEC?EIFGGCDJF@DGHIFH@BFEFB@?@AACFEEHJJMLLNMOJINJKNLJGDC@=:?BBACBAEFEFGFFHHGGCCACC@BABEE>9:;9=C=>><:>A?AA?=@>:==:<=>;>>>?A??@@><=<>@;9::=<>AACBDGGEDEEGEEA??==<<>?==>=>BCBADBBDCDBAABDB@A@@BDBCEGEFFCEHGHHFDDEBAD?==;8<;=>>?>DHGJGEJJIFEHIHCEJMMJKMNOJJHHIHEGKJKLNOKEBBBBC=;=DDEDFFGFB@>?CDHJJJGHMTNNSLDCDEC?@GNOJBDFKSIKJMLEB>89;=DEBEEFHFEOIia?BCCFJ@EEFFC<>>BHEACHGCGB==?@>EBDCBFDDA?D@A@DJPA@>DGDBDECBBDGC@BFMIH@DI@=CA>A@=?ED@C@:>;AEGF@@?A@DDCILHEFFDLKGNEDCDGEDEC@@BBDCC@BFEDDFBAGGCGIFDCFIEECBCKOIFDBBCCFE@CEBEIDHIBCHIGHHFGHGHADCFPF>@@AAAEGGDEGIKMTZRNNIHIKMLHEDC?=?AB@?AEHECEFEGHHJHA>A==>>;<>>A@====;=;??A?=>?=========@=?@@@AAA@?:==;>B9;9;9=ACFEADHFBDEECGC>A@>==:<>=>?@BAC?BBCABAA?A?@A>>@?ABCF@FCCBEDEGFFGEEHA@EGC;<::=B@@FD@CGGEEHEGCBCFDGFIOONLJLJCHFFHIHJKKLNPSUTPJE@?C@@AFBCFECCC=;DHLGKFLSKSUSOIGHEEG@BGILXIN[KFB?BDC>9:;AF@CAB@LK?EHRL?HQNST?GGFCC>;GEEEDA?CDBC@CBHBBCCBFGDB@CF@A@;DEFDBFA=@CB??AAMS@==GHDAIIC@>@GD>AB@@B?A>AGB>=@C?BC>@?<<9?:AGCA>ABDCAGOK@DFADJFILCA?JDGLC@B?;>GEACFGGGGDGDAA?>AF>CDCBAB@JPMFC??CDEFBE=>DCBFHCCAEIGHIDAEJFAFGCCBABCCABC@?DCBIHKNPHGIEFNOLIEBA=>?CFFBCCEJFBEEDIJDG=;8<;;;<>=>?>@B=<<=<>>9=@A==>=>=<><9???AA>=><9<===@BBA@ABBABAABBAAAABA?>@>AAEADDBDBB>AGA@FGFBA;CDCEBCFGDBCCBCDDEFDEBFEEDGG@HOMKIGEEGGGHMROPRRTVSRQPQLFD=>BGFDAABCGFAGFLRQRRVVSMFDKSFADSZVGGLC?CHFDFB;;@CAGNGHFNHDECEGCGJEIKAABHB>?BTH?CEC>@FIMEG@G@AEDDBBEC>AFC@ABIDDE>CB>B@CD@??EG@AEHHB@ADFBGGC@??<>B?9?AEDC??B??>AFB??CB=AEED?=@:?MLKPKDDEDFSBEDADAACDDDEDBAAA?DLKRHHB@CBCFEBCC?FAEBBDDCBGHDDDACDDDF@ABDDEB@EFFKG@DDCHID?@ADCABACA>EHEBCBAEEFJFDGIFGMOOLDBA@@ABFF@DEGHHFHLGDGID=::9;::>>>=>A@>=<>>==>:;DC>=>==??>@=>>??>A>=?>=<=?=?<9>=;@DB?BDABCCCDDDFFGGHHCGDC?=>=>?ACCBBCCCBCDCBBBB?AA>>?@=>CCBDCCDBDDIKEDEEECC?DHFEAEHGFECHFFIDHJHGIHKMKIKEBEIIIKMLMRSQTTQPROLHGLPKHJHEHFHHJ@:;@EEEGEFD=>AC=?BBFFFKQSUUOIGKOJJIADHGDH?CCCCACDBGKEACA>CKFFC>=CCDJFBA>BBCDDCCCQNGAIH??CA=@CA=?ECCC=@BBC@@CB@>DGA<;A>=BCADJHHLHCDKIKOBHDBDBBDCDEEEBBDNPHXQHEIFDEEEDCIOJCDACDFE?DDFLJECBBEGDB?BDFHIC?>=BJIEEGDDEFEB>BCBBCEDEHEBBGBDFCDDJIHGIHHJKKFBEC@DEFDAEGIIHIIGFGFHEA9;;<9;:;>>=<;;;9?>>>?A=?CCBB?>>><=<>><;<>=A?CGCBCECBCCA=BBFGBCCB?C@=@CABFD@AAAAEB@B?AAD@@B?==>:AA?BDCADFCKRH@DFCCDABCCEEADIHFEFDDHFEEFHGKHIIFFJLPV[ZURSQNSOMJIFJGFJMNOMHHIFBDC?@ACBADCGKHHF::AIJFGFEIJFBDKMGEJJIKKJJGLDGFDD@?@DIIBBWeHED>DBEGG@@@EEGQLJKCBBBC>@`\I?CGA?GI@BFBBC=>ADB>?EFEGHG@BGA@BEBIHAECDHHF@=?CHGFBBBMIFD?@?CCA@>>=ADDFFDFU_W\]ERbJHQHB>DCFFDA@CECDLMSDGPICEIFACCBCFGEFEAFGDEECBDCEGDCBAEFGEBFFDDGCHECDIHADGGFDFCCAA>AA>ADCKQFFDB@EFFIMHEOSIFJHKNGEEEFEGGBCCEIJJHHHDEFE>;:;<;;<<<;;<>>@?BB>?=<@@=>>>?AA?AEBCDB=>?>=???@?BC>=<<86?@?>=?=A??@??@@?ACB?CBCCBB?BA@B@@A=?=?>=@BBBDEAEEDCCFCBCBCCCBDDGHDGGDDFGFIJJGLNNOSOPVQRSMLMKJIIPNKMMONNMKIGPUVSGG@C?;<;9=FLIGDBFHEBBEHFHGMJMNOIDBBCHLIHNOSJTCFCBCDACFEEHHWoR@KYFLMRA=IETUBEHF?@LJADDFMLHFGFBCFJGAHACA??EFCCBGFCAAGABDCE?ECACDBB?EFBC>=ADGDB@C>EKDCGDACC@@D@ACCAEECJG@BCA><@A>?CC@CBDFEDIZj�ŠVHHPTJNL@ABBDIE?AACEFNGFLILKAFHDFFFIG@?DFG?G@E@CCEDDGDACCEEFIDGCBJUGGGDFFIIDGFDFHBABBBCD@AFDBFJE?C?@BCCFCDCLNBBNPMLKHEJKFGFDEAHMKJIDEIHJEC:;;=:;>>;?C?<;<;==?>A@=><<>>=<<>@A@B?BDDCA?>?@?>>A;<979956:7:@@9:;89:9;<<:<@BCB>???<=>::=<=@A?BB?>A??@A>>?<<>>=<><<>>?@BABC?@CCBBD?BEB@BFFHHDFIHJMLMRURUXPOUOOPKGILHIPOMOUSSTPMLNE@>>>DE@@?<:9@LLFCCGLF>DFJFOSNMIGGHPPH??HKGKPPJKBHFDDFCACCDGLT[FFPfVHR^LJOJMG>CEFC?HHBGFDEFRMIKCAFACLJJEFBADD?=?BADB>GD>CBBDGA=CEGDHFABDB>BBDD>>BBFKIC@ABBBAAAACABCCBAABD=AGB@CDA>DEABB@BCBCKXcYFEFRVBDFAGEB@HJ@@A@EFHHKKJKGB@EFCDFHE@AADGAEGCCHDBGGEEECCECCHFCEHGJFEBBIGHJCCIGCEE?BDCCD@?BCEDBB=A>?BCACA?>CB<<><:>@@A@;==<:>=:<::<>>?@AB@BABB@<@?>><=><;=;9=??AA?>?@<>B>>A?>>>>=>=>?=>A@=>B@@@@CCBACDBCBCAGLJNSTUUQRSQNMOMKJLMRPONNONMLLNQONOJED@CD>::==<=><;=@><;9?EMSTRIABEGLMJHHERGFIPDDFEFDEJIHEIPICEKDGIIMIAAGD98DFDEDCFEABEIEAEB@IHFBDB==9688:ADA?CE>BGFGF@=DFSOFDBHK>DEDEEBFAADA?=???DHDADC>AGCACE@BC@ADEFECFFEFNXKDHNSIGNFBB@GHFKLKKIE?==AENIBBCDEGIDFGFFGGDGDEFCCEEBDIB?ELFDGBBFHFEGDEFDCBCCBCCBEDBC@BDCB@BBA@BADB@BC=>A?@AAEKKQNMMJDFGGKULBE@>GCCD@=>?>=>>=??>?@@@@=;=<;;>=:;::>=>B?@BCAABDA=?>?@??<797767857::?><:997897:799;BA>@A=><;<;=<:<>@?>@A>=@@=>@====>==>@A=@A?BBDFABEACABBBGOSRSRQMNSPOOMNQRUTSSQLKKMLKLOQPLKME?=;=;::79;;>?:<>>==<<;>MPPLDGLLNNFBEBCGB?EB@DMVUTQF=BKNGEBIOSVHDFOLJNE@CDEFHFHDCBGHHGIKDDIFRdHFJGDGCB?ACJMGEFABBDCC==A?==@?<=>>DJJHED?BEEADNPLJEFLHDBFJECDNIEAFGC?=>@@DEEIEE?DEE@B@EFFGABGDBDFABEAB@FHDCGJIGEJZ^`VFQOKA===EMLMNKJGB?CC>ANHACADHHIDFGDGFHHFFHIFCEECHLHBCEEGECEIJHEDDEHECAAEHCFCDHECABEDCECCCAADDCAGB?BAABBCDJIQQLKJDHGJIYTGICCJFDH?>==?>@?>@CC@?>=<:<;=;<=?=;;<<=ACAACBCDBCB>>>CA===878685789::;<<:86886776889A@>==<:::::;::::=<==>>=<=><<>=>@?=<<;><=;==9AL@>BBDBCCBA@BDABKPOLMOPQQORQNNOOLOHDDHDGFCDHGEDAB??::8:89;8:;99<<;<><<<=9:FLIDABGHECBCAA>?>ADC@@?DMUXODCDFC@ADDLQD>FJGFEDHGCDCBCDCBDF?DHFCBAGKZzMAJGF>=CCBGKJEDB:;>AA>==BDBDGDFC?ADGDDC>ABCINDVePFJGEEEBBGFEACDCCFKOF?CCAEFEBEB<@EECECCBDFACFCCBCEGA@??EG?Cr~SCEKWXWI>B@;89::968AIJKLIIHE>C?@GGCEA?FGGDA@ECEHEHGBDJGDEDCHIHCBAEFEBEFEFDBBBDEEEBBECFDCCCACCCBCFA@>?ABAAADA>BDBCDCCHHLPMJJIKGGEMOKIEEECEH><;===>@>?AA?=====;;<;<;>>=;<;??>?>66897648877=<9<97866778779;?=;;;;:;;9::8;;;;<>;<>;<><?C?<;=:=<;<=DD@ACABC<<=<=>;<7:::<<9;;79>=;B<;=;:7CIAAB@@?>?EGA?BA=C@BD@<<@IV]UGDD>?C?>BGBDFJKLKDGOIFLDIB@EGC@CKIFF@AJNVPPJDGBADGFHE@>>>@C@BAA=;@?;?ECBA@BBDACC?BACGMEV`OCGG@?BEAHEC>@ABAFGKIDBDEFJB?>>>==<<=>ABAA@C@@?>ACA?ABA=868795576589=:99:965776989;=8;;9:9;;:::9:<::;;:;<:<<;;>>>@B@=:<;<=;;<;=BA?@BCCDA@B>>B@@DKNLNKHHGA;<;96<;;<<;>=779;;>:9=<=AFGCCE?=B?@FDA?B@C??BC@?ADDJXSDFFA?A??DC?GFGKFFIHLONQJTLHFFCEEGGKSPFDCBFBAOCDDFFFFC@BCAFA@?EEHFFDA@@BIGAAEGBECCABA=IJ@BD;8GRKBB@B@ONDCBAHFA@@EJFEEGEMONWZ\RGC@EIFHIFED@GENGDEHNPJC@ABAGEBICACBDEC@?CBBABDACCBNLABCB@ACC>?B?DC?CDBDEDBAA><<>@?BGMKLJKHGEDFGCEFCA@FDDH?:>=;;@=>A@???>=?9;<=8<>==;<>>?=?A?A>?>>=@@CECDDAC;57887:63885=;8<<979769969>=8<:8:<9:<;9:;:;<:9=<9<>9;>;;@DA@?<;=;9==:;EECCC@AA?CEB??C>>FB===::7<AGDBDCHEDEDCFDDB>@DHEDGDHD=>JLJNLHILFHJHEHHBBFIPJDCBFC<>EABIFFG>;BA;;739DEJLHMKNHFEB??DDBDCEBBBJF@E@?DHGAA@=CJMJIQCDFBHGDAAE??D@BFCBEFACB@ABGECD@EJD>C>EGFGEDGECCFJHCBFEAQPDCB=>>???AADFCCGIHKOPORGEFIGFGCBD@BKRJFEBIQOHCAADDACDB@CCCCGBADCBBBBEFC?EUREFDED@DD?>BBBEEC@BEADC@>A?=A@=AHHHKLHGJFBEEDFGDABDDHG?<<;<===B?=CEA>@>9=><<<@A>>@@>@?<>>>@BAEFBACD<68868845867<;:<;788679878<=::::9<99;;9:99;;9:<;:>;;==<>@C@>><;=;:>=<;CGDAA@@BA>???AB>?AC@@A;>:;>?8:=;;===ABBEGHEGEFBDDDEA@CB>AE@>CEBBFCBCAEFB>?BBCAABACEEECDIEABDIGHHEFB?DKGBGA?EB=BFHGGFEHFBEC@AD><@BA<==6BA@?DCBGJBBICCGHE@GHDEEEHHDDFDHOE@>=>>CGEB>>DJFBEEGMLMMQGFGGFBBBCDEFPYGDDBHDCFC@AAA@CC@DEDFGFBCFBCCDDCFC@FKJFC?BD?FCAAB@ADHFACAAGGDC??BB>>?DFILIIJGDFECHFEFDACFHFB>;;==>?@@>BEDEB=?@>>@>>>?>?B?>AA@??>>A@??ABEE@BEC=79857747788;;;;;788778877<=9:;;:;;;;99<:9:::<;:9<:<>;;?BA>=<;<<;=<;=;>DD>@DCBAA?AC?=>;9:@>;A>@@@@@A?@DACAB?;==??A@CGFCADFA@CEACCEE@CAA?@EA>CCCDCAB@ABFB??ABC@>FGB=?CCDBHFHDDPPIGFIGGJNCE?GRJDEEGGGGIUTFIC?@KKA>CJICCCB>AEACFFEDEEFDGL=9;=CDNYPA?C?ADCEGFKKMKMLEDDFCBECCGGFGGED@CADFB@B??DD?ADBBDEECEDCBBAEECBCCCEA?>A@>FCBCF@@CAAB@>FLQHE=;ECAA@@FJIJJKIJHDBGEFHIGDCEHB:<>;@==@?=??@=AB@@??>??<=>?CCBBBAF>78867868797;<:<<88:77:869<=;<;;=;<==::<;::;;;<;8<<:==:=B@>>=;==:;<<;=??B?DCCB@@@@ABA>=>A>>CB@=;=?BAAADGIGBEE=?FEA@CGG?AGE@BBABEEABB?DFFCFBD@GGA?HIDDBDKB>>DECCEFMID_\DEIKFJOZQJKPUNIHIJJQVNGHIHDB?BCGAAB@AAJEEECDEHHEB@HG@HFD?A?=?AAEHECCDCAAECDEJGEDHHDDJMFCJC>?>ACPWTG>A?>CGFCDIKJINMGKDCCBGIFEEEFFFEGCFFEFDC@BCCDDEHHCFCBFFEIIB@BDCDFDDEA@CFAFFCBBCCED??ABEHKDC@?AABAADHGIKJLILFEBFEEEIHECCGD=<>>?=CCAADEC@??BA??A?=A>>B@>@B??A<=<<=;<;<;=?<>D@CFCA@@@ACBDCBBCAA?AA?AA@BB>?CA@BBA??;9??>>@ACEEFFJEA@DEBCCED@EKGCBLGCECAC@=BD@@EDA>E@BCGGDBDIGCEEA@EE?ACDEIJEEMLCEHEFGILQIECEFE?KQP\lqY?DFFDECBEHHID=:BBBACEGCA@CDFGC?>?>@DCA>BB>DBBECEFDDBFDCGFFRMFBAGJINQLDBDBF<@DGPQCA@==BGDCECPTLMRLKEGEEHHDFHDEDCCCEBDDCDCCCDDBAACCGGGACBCCHCAAABCCBGFADBAADBEEB@BEC@BACCC?@?>>AB@C@=DJIJLMIGFCCHCFGEEEBACA=>>?>>><>AABBCCFE?=@B??@@>???@B>@@>?A??BBBCCEDBCDB=9878767796:><9:8889998999=;::;::=;;;=;;>=<;<:9:98==8<=?>==;==;><;;=ABFD@ADFGFBABAA?@B@B??AA@@A@>BBAAA@@=<@A=>C>9BGDBCEFFCAGFDFKJFFGJBGGDFE??@<=DJBEFBCFHIHCBEFCBDBACEA@CA@DEB@EHCEKHHFDEGFDCIFABGGHIRh_>DDFEIEFFEFLOLHIHDJNNLGPOT[TND=AA@FECDBDDD@BECCIF?BGJHJHIEFBCCEFHFDPRCCDPCB>CJLFEE?;BDBGBN‘“[SQKEEDDDDDBBCCDDEDICDABDCEBABBABECBECEBDMG@GHC@CGEBDFDBGCCDBD>CABHFCBBDDDBC@B@DGEHMKJEDDDGGIC@@DEEGC?@@@=@A==??BABEGF@?BAAAA>@??AB??@@@BDCBDDEBDEDEECC=87984696776>:::8758966886;>;;;<;:<<<=<<==:9;:9:<8:;8;><;><:;<<<<;;AAAA@?=@@>?A??BABBA=<;;=;;=?>?DEGFCGB@>CGDAAFEEHHFFGHHHEKEACAKA?AAHH@@B@?AFDDFCDCAEHB@ED?>CFBEFABBBC??>@EGDEHGEABCBGDCF?FDGGEMYPBHLJGABCFHICBDHNPOJHONO_ffaTCEMGA@HJFLNGIGJIC>AJBBGCB>=A@@BACE=C?BBFBFCA?DD<=??>IFCAFBA@BELGDEBAGOF?DD?CH@AFJMHJTSQPCADFFDCFLKHk“hLOKJGHDAHICDHDBCABDFAC?BABBABC?AD?AJHEACAA@CDDBEDDECEEBCFB@ACAFD?ABACDACH@@@CBAC?A@DBCGFDEKKIDFDIFGFFFDDCFD<;==<=A>>>>=;=:9:9:9;:<;==<<==<=<>A?@>@@AB@>?BBBBA=<=;<<>BB>@AEEADEECFJDAKOCLMNGC@@HFDDDGEED@@BCDEDHIA??CB@?AHG?AFD@ACCB=CEAA@ACKKEGB?ADAEFEEB?HJEEKOIFHDEAC=@@?DHGHFCEILKLOQbg^UM?QQJB@EBAEGFHTMIGD?C?AFHE>>?=?DD@DA@DFBDHDCECAB=;CEDEDBBHGBFGEDFFCBA@CD@A@E>EFFELUQKFBGGEGGECCDDDABDBC@@@DEEBA@AC@AEB@?CCBCCDCEDACEEEEECD@BGDCCEA@ACBBEC@ABCB@>CB?=@@HICCFECGKEFEEBDEBEHDCBCC@=<====@@==>?@>=>DC>ADCDCCADD@ADBBBDCBCBC@;@DDFCEBE?87676766787;<<988767976889?>;;<:<;==;;=>>=;::;::8;:::<:<>;<><<>BGGIIEDDBEJKHHHEDD@>CB??BA>=C>>A?@B@@@@B?DA><<>B?==@CDDACB>@FFEFHEDEHD>CLE>BCCHLOJC?GKKGDDGEBBED?CBB>AE=@@FEBBFIFCEFA?GFFDD>ECFGDEEJSOBECE@?FGKHDJHGEGKMLEIFA<>CBBAGFJIHHEDHOOR_WRZSFRgXEGICDHHMPOLKHFCD=>CE?<@CBACDBCBDB@EFE@=@@DGCCFFC>FBDCBDBFGDLKCDCA@>BFCCBCGGC@OSJLMMPGBA>?BCCEFFHFEC>FLHFGDCCEFDACCBGBBACCBFF@AA?DFACFDCDCCBEFEEDCDGFBFG?CBBBDDBCBBCDDDEECC?EA?BAC>BGE@AEFFFFDDFHFFDEHIECFHB>>;<<;=>>?>>>>?<>AABCFFGFCCECCFEEECCBCEBB@@ACDCFGCDA<977979:68:;<;:89988:978:7@@<<><;<>=;>?=@@;:;9:9<:<>;;>>>@B@CHEDECFECA@BCHKGDEDBBB>@BB?AB?>A?>AA>@@>@CB@?AA=>BB?@=?DEEFGFEGHEGFHGBAFCAEHEBCDEDFCJICDLGFDD@@A?CFCHIDCCFBCHFFGD?BHEDFB>CGEBFC=?CCEE@HZVEIEEFIFGEFGKF>;?GMICCE>?AEDBFECGDBEHB=BAABDEEGFACECIEEEE@C@EDCBGLIGGMUF>AB@EIGCCB=:>CDCBEFFIFHEBCJGIFBDB@EHKHDBBBGBFFBDE??DEDBDCBDCDECBEDFCEGEFEBDIFBFDBB@A?AACGE@?BCDCBCBABAACCC@@CEDDGEBFJHIFCBHEBEGB=@?=@<;???>@A>>=@@=ADEDDGHEDFEEFECCCBCDBACACEDAFICDA<86863:87:9:=>95:97:967865@>:<><>=:<>=;=B@;;;98<;;<<<>@BBDHFAAFGDCEH@C??DIECDCB@A@AB?>AAA??>=>@>>?>@B@?ADDB?>BDA@BA@DGDACBBGBECHC??EDEFGHHHFFB@FIEA?HHGCBCC@AJLIGHFACA?BFDDC?=CB>DDCBIFB@C@CB@BEDBMYPIKHGFKDDIHAFA>@=CKDCDB><=?CDDFHIJJHGEADEEIHMY]]SLLMPMHHDCJMHIBJHFIFBCFFEECEHBFHCB?B?BEDACC?>DDACACIIDBAGFEFEEABGIFCED@@EEFCADGIGFHHEDHA>@??>>CDBCB=>DFC@EGGIGHHECIEIHIHDBBEHFC?DDCBEECEJFACAADBBCFBBBACEDBEFHIECDFFEBCA@BBDEC?ACEC@B@?A@AD@BLIB@A<=EEDFDDDGKJFFEBHEAGF?=>A?>==??=??@?A=@A@CDDCEHHDEGCDFCBCDDCAACECDCD@FJBD@<87996695798<;:799759:67;9;A>;<<:<><:==>C@89;<:=;:?@><<>CGC>@CBBBEBDA??BCEGDACC??A@>BB=??<=?>>@A@?AA>A@>AB>ABCBEDBBCACG@<@>?B@=EFC@EGECBCB?>@=B>DG?@FECBACEFDCGGDDGBADC@C=?CC>AF>>DHAHGCCCCAD@@CDDADJHJSKEMJIJFBGE=:;CGDFA?A=>@ABBGIJKKFFE;CE>EHCDECHIIGDFB?CFFECEIDA?CIHFGFEHFHLF@@@CA?<::@?@CED>;;>BBDIFEECDEBBELJGKE?BEE@ECAQJ@BGDEHC?AAABB?CDCBFBC@CDEFGHEAAEEDBBCA@CACC@BEFB@C@@BBACA@GE?;@>=CECEFFDIHDDDBAFDBGC<=><;A?><=>ADAADEDFFFDGDCEEBBEDCCCBCDABCC@BDCDHADB=87866867696><86987667799:;<;;<=<<@B>;;:9;@@>=>>>??ADBBEFDA@CDBFFBBBCDCB@>?DDAAGJHCBFFBDDAHKDGHCAF@CJGBBACDDECDC?BCACED?@=FE=?EE?ADGBGDBE@BDB@>AFGC?CGHKJE@?GIFAIH??FJFEG@=B>@@@?CKNKIKLG>;@KSJGFDJNVOHGJFCJMNLD@=??=FLHCADCCDFHGJHHFD@C@AFD>=@AAEEAGHCEDDFFCCEGBBFC@BCCD@EGFEDEEORC;HOEEMMKGBA@@?@DGE@HE=><@GKJID<>B?AGIHEFC>@BAABDBTIADDCCBBACDBCB@BEBCD?AFIELMECDBBBECCDDA?C@BEDFIEBDB@CC@AB>=>?DEDDFFEFFECFDBECDCFDCECADEBABC@CBCCF@HG>:9998786976=;::8999:::;88<@===<@>?@>@DCA?:;:8:;FMGA??@AIJEEEAACBCF@D?DEBDDCB@@@@AA?A?A?@@AB@AADABTNIHGJHJICCDAFNOPMDAJLDBDEIJHEEDCGJFFLLFAABDDFFEBCECAENKCCCIIHEFBFFFFC@??BJGAFFGCCEGILA>KNGIOOOREFBC@AACC?DJHD@=BGQRGBC@CFIGFEFGEDABCBCEICHJDB@DDEEDFECBBCBICDJQPOQNIFEDCCDBDFBCCBBEGGEGDCHB?DF?AA@=AAAC?=@EEAEFCGFGHIGBA??ID;>?=><>>>?=>?=BEEDEFGHHGFHFDCFCEGDCCFDBFFDEDBCCDEEF?EE?88956898886<=;78:88:88:76:B@ABAAA@>?>9;<<@CFJGECB??DFCAA@BBAADD?@EAACBAA@>>A@?@?>A><<@=@B?AC?=?EEB@DCGEADBDCABCB@BFEAADHDDFFC???ACBEJHDEHEDCGEGEGIA?DC>>EE>BACECBAAGNJJROB?ACFMFLQMHCGF?@DGJFGIEEJHBEFIFCEDDFEEDDCCABHFDBDFFEIJCECCCDHE@BGGBFFCCEFIBEDGNMFHLDILEHGHIF?FF@>DEFHB?BLNJHGCFIHEFHHGHFABCFDDECFFDDDEDEEADFCACD@IDGNLHMJJIDFGEGDCCB@DECACDDCEFEDA@BEAAA@?A?AD@;>GGBEEDFGHEGHCBB?GE;=>=<<<<>@<;=;@DEDCEGGIHEFECCFEBFBDCEECEEDFEAABDEFHCGE@968957:7695:?:89;88;979:79>A??B?@A@?@BCEDBEFFCDBGF@@D>?B@BCACBFA@B@>?@@@A==>=;@@=AFGCAB@@BDGJC@DEBHDB>ACBCEDCBEHABBCBADIF@DFDFGGGDCELE>DDB@AFF?@EDA?BEA?DGCCHKGA>?FRVQH@>ADBCCEFD?@DE@AEA@FHKNNHBEECGEIIHB?ABBEB:BFCCDA=A@CKIGMLDACHAFHXQIMGGGA?HIHNF>@?BMI?8?JHCDHKHDHJCCJHC@FCBCE@BC?@CCBCGGIOGCHHABCDCGHABEAADDGEBHEJGJHEEFFIIBG@FGFKRKGD@NTE>CGGFFD?FEEGHGACHJIFDCCDDCECBGCAACCCFEB@@CDBGEBFD@BBACCHFAGIFHECB@>@BDABB@BDEEA@AABBADHCBAAAB>?GFBDDCCEFBDCDEBBFC=<;<;:<>=?====>BEEBDFCFHDCDDCDEBDCDDECDDBBBC@@@ABCIAEE@958958775:79>;88:86;;77:68?@>?BBCEFFGFDEB@?@=<=;5796687>ED@@A>@E@>AEDDEA@CA?A@==@<:@>?@B@AJE@AA?BIHDHB=?CAFEDAACABEBCFEGFBBGBGIKJDDIIHEEID@CFB>BGFBCHHECCDFFA@@@@EA>FFDAACDKQNJD?CIGFKGDDBABBCFHC??CJPRMIFFHHBHLIFECBDD@>CEAAAA??BDKOFCGDCDHABKUBWTJFDCELGBG=:BBACE?<>FIGIEENOIIEFMG>?CC?AHAAE?EBBEHDD;6KSIBADDGKC=@CEHJC?GJHKLEAEDECFAAEECEDBCEC@BCBFEDBCDE@=CIGCGIEHJCCDBCC@>?CCBCBAACCBA@DEC?ERGAAAA@@@BDCDFBDCCCFCECCGFA=;;=<:=>>=??>??@CDAAEEEFFEEEEDCCCDDBBBBB@A??>?>BDBG=FE?98877658877:=8888677:74768AFHEEDDAA@>;=<89767:778:68758=@ABABEB?ABACCE?@@==ACB??@?>?@B=AAADECBEECHIDBC@?ADDBCDDDCCBBBDHHEBBEBIHHHB?CHE?DKDAEDEFEIIJFGHHC@AAA@==CBFD??BFDAEEEGIKGBDGDDHFFBABA?GJDDEA@FKHKJEDGIDGGDIJDDFA?DC=>A=@BABDHICCFCCGKMIKQAuWMHEEFFFFCADEBA:@BC<EB=FC<:9@HFEEBJFGC@?BFEBEJJIKKJID@CGFAC@DCEHFCCDACGFECAC@BECDIIDEHGFGGCDABB@?AADFCBAABCED?AEDC?@DBB@A@??BCBDEECCC@BCBACEDEA::==:<=9<=?=?@=BD@AEEFEDDDECACDBA@?@@<;<=;;=<>>CDEEDC>><;9:63576675588568;7868:>CDBABBA@AC?A@@<<;<CDCBFDCGFBEHEBCA?BECCBBCEECCDBBEEA@A@DBBCF@>@FC@DHFCDGIFGHHHCDHCAAA==?=BCADD@GG=?C@:?B=@A>=AA?BCBBDFIRJJSOmOKJIKHBDFDCEDA;@8@H?=HXTIGGGEBC@>DG@=BCBEB@?BDBACB>CHAGJFFD?>BC@ADA>CDEDDCEJEEJKFCGGDEBBHJ??BCCLH@=>DDDGCFL>EDA>@AADHFJKHEMSEAD?EFBACC@CDABD@CIDAAEEEHCEEEBBECCEB@DGBBD@>ABAACA@BAAFD=BF@BC>@ACAAB@@CB=AEDGFFDDC?ABABE@9<<:<<<;?<:;>=>BC@ADCCEDCHC@BBDB>;;><8:=;8==:>?@DGC;DD@=87667676586=<<:9=;;<==>B@8864564688587698677556::<=;?@BCB@@?=BFA?>>=;:<;ACDFEECAC@;>DBEEDCBAADDDEFECBA=@BAEBA@CEDDECAABA>BCD<@@FCCEHGFEFGCAFH@ABFFA@G??CC@AA@E@?@CE?AD>A@CB@?DG?=BJACCCEFFEGE??B@AC@=AFH>B@HGBCHIA=FE<>@;<<;<>?A?=ACB?B@CHOFDDIJKKHED@;>CCCA=@E>??AFFB@AC@<>DD@DEAIPIC@>DB=@CB@ACAEEADEEFDGD?><@IIFFEC=BAAA@DCA@DGE>=@=??C@BBBAEHIJGAEOKFCC?EE@A@?ADCAA?>@ECCGCBDCHHCABBBBBCDCCC>BCAD?@@?B@CDBCCCABD@BB>AB@AA>=?B?:=<:=:9==:=:<;?BAAA@ACC@CECCFEDA=:;<97;;:==<===A?==@=<;789;;56:88:8659799758:6898;@AACB@BB<=?ACDFCA??<>:;B@AEFACFCBDDBA?ADAAAAAACEEEECBCFA@AABCCBBDECGEACFD?CFCCD?FGFHLKIGECCEDFCA?GLD?FDBBA@CECBC@BEJDCD?ADEDFDDFCBCJEDCCDCDGFEC@???BD?B@>CCCFD>@DJIEKMJHDBDEAB;;AMKDFDGJIFBAABCE>CCCBKHEGEAAFD>IPAEEACFI?BCCCA>AFDACBCEG?ABC?=ABEJJLKDGCC>@DCFEFGHECFD?;><>??;@BB==;=8:?;=>><>?=CFE98::;<<<;<<;9965456765698677676767578667679<=>B>@A>====AB>>@>>@>>@A><=A@EEDCEECDEC@@?;@ACCCDA?CBFBD@DHHGHEDGDBFD@?BEEDADGDCC@=;B>79>:BEC=AIOA>BBCCECB@HDCDEC>AEEFGCEEFFFGGFJKHHIEFFD?@>BBDBOQDBDA@BBBGFD?EACBDFIGGLPMFBDACAFFDCEGECCCBDCCB@BCGBBD@@BBBBB?ACCB?B???<@DCAACCCBBABC>A@?=A?=@B@@GFFKNFJGECBCCDEA>>><><=<>>B?<<;<=;;=<;<;;<<>?BDB>>DD@=??<<;86564445653456567898557664455566:<=?AC@@?:;=>@BB@?=<:9=@>>=AB?ACBA@BBCFFDC@==>@>;9::99>B?@BCEDAAC?ACBAE@@ACABCCFDBCBAA@DABFE?>EB;@DAADBBBDA@ECFEEFFGCACEEABABAD@EADFFEEEC@>>>@EOPDFGFGB<>@A@=B=@??<>HGE?@GD=:99:CEA=<;:=@B;ANMKGBEG@BEB>CDEGHGEC??BCDBGCBCC@EJGA@BCDFD=BB?CC=BFCA@BA@DDDA?AHFEHFGFECBGHFHCA@B@>GB@BDHJECB>=A@?CB@DCEBAEFB@?=BCBA@BBAACIGDC@AB@A?@A>B?BB@A@A?<>ABABAAB?;?B>>AA><>><>FHJIFJJGC@@AA@BB=:;=;:<<;=ID:;;<@BBBEDDEEEFFFEFD><<9;=98;;<;==>>?BC@CGHB;88754764666687466478558::6666777896>A@CC?>>;:=>>BA>@A?<<===@B@A==CFDGGABB@><<=?B@>@A9:;89:8=BBABCDCDE??FBDCHBFBACCFEBACGB>BB>=?D?@CBBCHOKEGHECCILGAFIBEMPFCGFDDB@AA@=CFDA><?9=RVLLJFFBBKKHBGGHJFFECD@BEFCFCEGJEBCEB@ACHIDHE>FHBAFCBBA@ACB??A>A>DHEDFGIFFHGEJLGC@B@@?H>@BABFHEBDDGQ<;@>CHGGGFB>>BGFBFD>BD?@DBCEDECCFFEHJF@HQF>CEAACEAECA??@ABB@ACACAA@?=@A?>B><=?A=>IKKJJKJJB?ED@@FF=;;<>;8<==BC><;<@CEDBHFFDDDFHHDC?=<;:<:8<==;=<<@AB@>AAA@=;=>=<8:::;;=9;@<<==?CC@B@>>>=><;<>@AAA?;89::::999689<@CEBDFBDC@@A=@?A@@AAAFF?@DCEC@>B9=CC?@DECBDIIAACEEDDI>@AB?CBCIE>BFCFKDEEFFCDEA@B@@A?AA??EDA@>EFEE@BFBAC@@A@@CBB@?@BA@?>ABBDB@>;=CBBB?@>=9;KRQUJDDC@CII@BFEFC@??EIFDA@@DJGB@?EGA?ABBBCBECB>BMJEB@CEA?CD?<@=B@GFGGFGJOMD@DDA?>@=?BA?DFBBEA>C8:;8?EEEEC?:;FTYMEGEDCA>ACCADDBBA@@>@@>FEDBFCBKHDCFIDBDDCBCA@ABAABC@AC?>BBA=A@ABABB@>>?@=@E@ELMLLHDFCABCCADF?:;<::99<<8==;;>AABC@ACDBA?BDFDC?;<=:9:9:;;;:;<@?BA==@G@66767767676677675667866BCB@><=>@C@>=:7676678::=>;ACBDB>?CCCCCADDD?@9998::778<:8;;8:99BBE?>ACC?AD??DCBCCBFFBCFGDFDEE@?EF@AFMNEGFFEDGDBCEEBCCCCFCC=AACEDDELLEEGGHFEIHJHE>CBAB=?EA@BBGFEBEC?BHHDBEECCBCCBA>CCCC=CC=@DC>?E>8:9=GDGE@FEBJQFGELLKNFB@FGJEDEBBDFF@?>AEA?>BCCDDBCBEG@ADBFHDDDBBCDC?>??@B@ADBAACCC??C@>?BBBA@????==>=><=>@@B?;<<::;:8<:;;<;B>>B:;?A><:::877;99;:><>DA=>>;=@>><<7<:<=:68:8699789:;:;9;::::;?BBBDECCDB?@CD@DB>CC?ABCFEEAACCA=AEF?ACBCDBCFDEIJIEIEECCFBA=?D@AB@CDMFBCGGGGFEIGJOFBCFCCCGCAC=;DGDBEC=ACEE>>C@==BHCBDDEFDBCFC@A>AE??CA>@D@=CC9<@A>CAAABCD>8ANMLPQLHFBDCF@DGEEEDB?@@DDFLMC=CB??FEABB@AACGECBFCBFCAACCDE@@C@A?C=>CBAEEDFFEEJJBDD??CAD=<>A?>@ACGEBA@???@=@ABBA>?BBBFKMLIGBEB?AD@=@BA=>;;:;<;<9;;<;=?==>==<;;=??@A@AA=;;<;:<:;=;;;<@>?A;68?A;6885789758556859969>?@CC@?><@FDFB?>;8:?95AB@=DA@;=<=B@>=99979975:>8:=878999:8;=;;:;99<;;?CCBFGBBCC?@@ADD@EFEBCFECDFDBCEBACED?<>@FIFGHEDEGEFDEEFCGB@CECABCCGHPE@AEDGHFCEDKPD>@CC=HHDHLCBEEB@?>@B>CEABDBAA?CDDABD@BCBDFBBEFDBDGA@CB@?@B>@<=?C?BDACA=:>GKLJLPMFCGBA@CCEFA?DDEECIFIFACID@?@CEC@ACCADE@AD@BFBCEEAAEBBDADB?@FFAADCFFCDFHEDFCEFD=AC@BDBDFADJEBFIEAED@?BCBACC@@DEDB>IKPSGA@A@BDCFGEF?AACEFFAEBKMIEEFA@@BBAD?CA@@@AABCAAFB=CCABC@ABD?AB@?AC@DIJJEEDGB>?@>?>@C=;<=<<9<<;;>=>>=>>>>>@>A>BECCCEC=:;;;<;;<=??A?779?@:767766866756778:=?BCA??>@DHDBBACD@;<><==8;BA=CDA;==;@A??=:89965678896<:99;86:97979<<<:;:9;<;=ACACFCCGE@BCADFCGEBACDCDFFEEAFCA@CBABFGGEBDHD>>DC>?G?ACECDHHHHDEIDGJH=EMDCD<>DECDD?>FF@IECGHBCDC?=@>>B@@CCCBBCBCB?DCCGA>ADFE@BHECCDGCCCA??A>CJ>>EEA@B>AC@AFEABEDCBCECBGEFCCDC=?GFDECDB?CHFEEFEDG@CACCAAEEACGDDCA@CELKEAA@BDCDEDEEFCDADDACCLKDBCC????C=CA=@>>BCA@AA?BD<@EBBFBCCE?>A??BB>AHIGDEFGB?@??B@@D?:<=<;9<;==?==?=:=<:=<;;><=>=??BA666?E;58877744656B??===;<>?CFA==A@CB@A??=<:667666677785;<98:88987886;<7;;7;;>;>DFEFGDDEEC?B@EFCDBBC@BEC@BGDAFD@ABECDFFDA@DHE>@EA=?DBAIGJJDIKDFKGFPNJHKPKFC?AEFCBC??DGEEDDIJ?AD@@ABB@CEDDFGID@BGD>BDCD@=BDBEGFGGCFEECCDB@@AAISGAHDBBEBAD@AETTBCB@CEHJLMJILJLMLKKJAAHFAAFEIJHEDDFECBCFGEDDGHCCJGDDCBCEDBCFBD?@DC@ADABDADDBHJPIFDABIFGFAACBEJICECIGFHOJDCCBADECEFEDCGDA=DLHBBCACDBA??CFFEIONFBEECACDC?@BADECC>A@=AA?=>@>BC>AEA?CCACCA@@@AEC=?FKKJHFFCAA@?@A?BB:;;=;=;==?=<<==?BA@CA==?ABFEDDD?=><;>=:<;;;==>><@BBCC@>@==>??;:<<;:;@CBAAA?>>>>;>=999=:8:7456674667568777877689676999:87989;=@BFDDE@AAABF?AEE@ACC@=@EFGC@BDAA?@CB@@CGHE@@BDCACAB@ABIMGHHGHHMEFNLKEDDILJHFEEB@@?FFBBHD>CFCBCCCDED@CDBDJFEBBDAADCB@BC?ACBACBADC?ADBCFPOOLDCEGMG>@DGIKE>CHMOMK^KCEBAA?ACCDDCAEEAAAFHGEDABBA@>B?AEKY_]LBDBAAC@<>@@A@GBABBC@@>?>?@>??ABBC>?A@@@ADDB@CE@>BJMLHEEA??>?A?=BB9:;>;<;;;<:<<;=?>;:;77:9?CBBCEE><;9=<::=:;<8:@D@D6869B>558:>@@CFC><;9;<;;;=>>;;BB>DID?;:>?DBCDD?@?@@?BEB@BA;@BA@FCB@BB>AILMOKIIGMLJI?=BIJGFGKGB???ACBABBDHFCBBBAAEH?@@?CDFCCACA=@CC@ABAAEEED@ADEA?BBADHPUTF@=LMEBBCDDDD@CKIOOJQFBDACD@@CBBA?ACAAGCCFHIIDAA>=?BACCK``YL@BCBBB=@@>??BBBD???B?=?GKC=?@B?AGJJHGFC?AAAB>=CB9;:;::;8;;;<<==;9779679:=B?ABCD=:;9:99;<<::79C@?F9868BD;@>:::79:87896<;;A@:99876976787;<89<88<:79:8:=::;:::;9;ACDFDBEGC@C?CFB@BBA@CCCEDCBDA@@BBAAGGFDDFGGHIDBIGABFM[WRLGAAHGEIGECEFIHD@GJB?DEBBCCCHIFDDDJLGDDCDA??BE>DFBCBGHHD?BEB@EHFA=?ADCAGKBEGBABDDBBA?=?IRPOLNLPTJIG>IPIGLNIGGE>BA@CFBAEFFHGCAACCDIBAA?BCFEDDBCB@CEDCBE?DFFDBACGEBBBDFILPPJCDMCCKIJKEDGIFKHKKJDDDBBFFCBA=<@BDCCBCEGHBEJGCDB?@>>BBHVRKFACCABBACC?BABFECACB@DEABC@ACA@DC@AB>CDA@HMFBC>AACDJHIJJGBDEDBDBAB=<;=:<>:<>===??><89::7:;=;><;??;<=;>@AE889>FEA@?A@??<=9<<<<;87:::;89=?BC?;>?@A>;==;99;99969:77877;;<>=><88656647789;79:99:989878;:9;;:9::9ACBDC@CCABCCCBB?B@A@@DFDBBADCACDEEFHEJKFABDHJA@HHA@EJD?EKJB?FJFEGIFB?FC>COICACAADFEDGHFECBHGBADDABC@@B@BFB?CEABDB@DD@@DEGC=BCEDBFFIGCHFCAAC@>@EFCCF>AACDDBBB@HURNNRSRRLIIESO@CPREAGIA@@BHEACFDBCGC>BCDBADDDCCFCB@BACGC@AECBD??ABCEECBFE@ACBDIGCKGGLC@JNQOJJHGCHKJKIEFEBC@DD@>:8?DDDCDBAFHB>DFGFEDBB<>BEA?>=@GGCB@@CB@DBCCBCACAADE@BCBBBB@ABB?A@ABEDCHFACC@@C@EDDEED>BCCDFC>BB9;==:?<;<<==@@>>;78;779>=ACIBC@EG@BC?<<>>;:777::<>779:<@??ABDA@=:<<:::69:9:;989:879:6::9>>:>>=87867998;;::;78;8689869:;;;79;979AADGAABA@FBBCA?@B>=A??HHBBGFBEHFJKEDBGIHE?AHD@BFHHDCFDDCHHAAEHHBBGDA@DG@DTHDFC>AGCDBA>BDB@CGGEGHEA@AEBDEBADEC>@CBACBB@=DGD@C@@CDGLIGNE?EE@CD??>HPPPQLRSUUMIHIHB=DFFGJKI>ADKDBBBDDCIF@?BCBEFFECDDEEA@@BBACC>AB@BCCCDCACBBEEAADDDFKNRVOJECLKDGMLGAJNGEGEDECBBF@=A:4=EDIH@AEEBGD??JJHJDAABAC?89<=EGEBBCA@DB@FBA@CA>CDBAAA@A?AEC@CA<@A=?CAACC??AA>DGEADB>ADADGDAAB@;<;:==;=;;=>>>@>8996::9?@@BBFBAA@?ABBAED>AA?;=<<=<<<<<98;;=>>=BDDC>?A@=:8767878=<9<89;879998:;8=?>>>@;<;::=;;:<<;:6788878889:;;8589779>CCECBBDAAABBC@ADA?DDBJKFCHFACBBIJCAC?@EHEABDDAAKMHGFGDACECEKCCCBDB@ADEEFEE@ACF?CGCFDCCCCAAA@@B=?GGHCFFJLEFHAACA@@GJQMOJRQRVSKHGLKFONRWLJLEIHEDCDECDFIGFBDDBIFCGC@BEEDDDEBBED?@DBBCAEGBAEDBFIEFEBCHR]^]KEGGKKHILLGDTKEKMICCFCEGCA<88?GEDF>>EBCDEDCGIKKDEGC@AA<:?BCFEABDBCDABB=:=><<==;@CABD>9=97;97:AEBEHFEEBCGFEEDBAEAABB@C>=?BB=><;;@@?@>=<>=<=>?AC>;?;588687885::<=89986887:;::<@BA=:<<99:;:979;:85777::88:7;887687688@DA@AEGDDEEFHFCDACBD@CGGFEFEDBEGD@@@@AECA@DGDBEC@>BGJABFIFEIGE@?DFB@BDBCDGC?AADFFHFCDEFDADCDBJCDB@DDBADFFHEEB@@EFJFEHEEDCA?ACACA=ABGIECCDJLGDCBB??CCIOMILRSNQUNKMLJQ_ZW`ILRLQJEDEB@CDBBHMG@BDDCEHCDCACB@ACHDCABABBDB@ABAFHCDFGHEF:@IJQFCCIJ@==ABCIJGFACBADB@CDDA==<;===<:;:999:99?BDEFFECDEDEECACBDBDB@@AED@=?:;>>>?A?<>==?@ADC>98:9=<88;968:77:DB@=:99869:979:8;;77889;:989:8:877876:<@FC@?DECDAAC?CHGEDBDFEFCECEFFFIFECAGJIFCBCDFAACEJEBEGA@GGCCGFFIGGGFABFA=ADD?>BFFEEHIDEC?LNFCCDFHB?DDCBFCAFFEDCBDGFFEDBCA>EGIFGFILIDABBAFBB@CJIHGBCIKFCDDDAABEFHLJMNQPNROJKIFLWUJKTZd`JCAGEBEEBCCLWCBKFCIFBBCBCEEBCD?CCFCCFAEGCBBC@?@AIHFJJ>>EBA>?>EGBDKJFLGFFGFLEIJFGECGJB?FEBEFFCED?DFGHDACGIHJHFFB=>DDDBDFCACFEDFGCA@ACECAABBAGGAAAABFBBGLD?A<;@?>ADCEE?<;887:88=ADCEGGFCADDEECA@DCDE?@G=;=;;;;<;>A<;>=@B?=>==A@;:::9::9:<;8776787888==<98:879:9:=>><<;=;97:688866869=978887;76879<9668878::?CD@A@>>=@BA>CGBBECBGGFDCBAFBBDEB?CDADECECAAABBGE?@GIGFEFGDBDCBABE??BEDCCEE@@BDCCEC@DEBBSLCEBACDFCFECGGBBFBGHBEMJEFEACFGFCEHBBCACDCAABA@>@BAC@CDABBBEHGGFGFFFAAFA?A>ADDBDFDHKHGDHHHGDFIECDCCBBD@ACCCCDBFCBEFDCDA?EEBAE?>BAACBBCCDED@=<CFBDFA>ACCBDEBA@CEELNHGC@AABDCACCEA==A?B?A@?ACBCB@<98<=9;:>?CC@BEDEDBEDDA@BB?>@=CD:8=;:::;9:=AA@<:988799999:79<;986577557759;:796:;::=;:<::9:;79666:;86768:779678<8<<;;<866899859>>B>>=@A@DG@AB?CD@A@B>>ABCHJBCGFC@@EF@=@D>DBF??ADGFFFD@ADDFJEBDCDDBCAEHCBFDACFCBGBB@@CGFABFA?GGAAD@@==?A@DGIJJFCCBDA@ADEFEBADFFKIADF??@=CJKIEHKJIKMF>DHC?DIEO^VKID>CD@@ACCAEDBA>@ACEE?@BDDCC>=CDCBB>AAB@DGCCGHGHMMBAACHIA?BA>AEEEHHGIFHBHHKEAGEACDDB@ABFD@@@CBCEDDCCDEAEOHBAGA::>?DCBDCA?GJ=<<;=@DBA@==>@@GLHE?=?A@@ACEBC@?AAAAABD?@@AABGMDB?<7>>=?==>?@AAA@@<997;779::?@BD=;=>;;=@>?@;>BB=CD@@=:8:;::8:7:87==778788787878;;;;;8887:=:9<;::<:9;68;;97878;98;<<@@@?>=>=;9:978;88?A?CDCADFCEHA?ED?AC@DHDDC@EGD@AHDAAAHKEEBC@CFB?EHBAFIEBADG?>AHBFCJGGFGKGAEHEBADDCFGDFFDBGEFIFBEGADGHDHGAAC?DGHDEDCJJEBC@>>=AFDCBBBBDJHBCB>HKCFDBEHIHKJBDG??A=>DJJHHHLIHKOF@HEBLNCJINZ_OC=EFBCCACGB@>A?EBEHFFBABEFB@BFAAABBJJCAHIMQMIKOMGCBFDJG@HPQOJD?GLGHGGDKLGGENLBAGGBDHE@CEAEDAFDCBBFFDDILGA@ID<=?ACFDCCCBEHC@BA?CBB?E?>=@>EJEBA>@A@=>ACCDCACB@BC@?BCBBEBHODAB<8=ABBBAAEBA@?>>@ABBBAA?:669797:?>@?DEDB>>>@B==???ABBFE;<>A@<:;<=AA?>==A@<;:86977796799;??;666468677958;:9978::<=;9998899979:9::6888<>>>?ADBA?==<<;9878:967>FDACCADEBGHC@B?>CDAADDHEC@DDBDD@A?BF=@BCBACBABEFCACEA?BEEAFEIEFEID@AFDA?@DD@BDCBEABCEB=BDBCDDDDDA>CDBAEB@BGHC?BCEHCEBBDA>@<>ADDBAA@ABCBDBGHEBCBACGIJGA@CBB@BB@CFEGEIMLKLJFGIKJJECGWdhUGECD@?A@FDA??ABECFEAEDFHGEA@@CBCCBB>DEADIJOPJQYVSOICJPKDHV`OHHBIJDIIFAHHGGGEEGFDACDCFDDABGYOIDBCDCA?@FDADCDD?==ABCAACDBACCBAA?ABCCC@<;@>CFA>>?AADC@@BA=A>BC@BC@@ADABAEEHDCEA>=>BC@@?CBA@>@=A@>=>CB@AA=9889<9@?<>A?>BA@BAACCBBBDA>;><>=<=;:;;:98:8<8878;:;=:66778969987:<;979::;<;:;<::<=;89679;76998?BBCDCCB><><86577777=FDEFFEFGHKKECEA@DB>CGDDDDDFCE?BAAEEGHDBDA?BD>@CFDCCEFEHKJB?FGCBFIDAACCFCDD@@CFHGCAA@DFJGFDCBCGIEDECCB>?C?A>BGHHIQNHLPMJJGCDEAFOed[LDDGDBA>DFECCDCCDFECEEADHFECDDCBDCDEHEAOXTRQIISUSUZQKPFHFV_QJHEGGGGJJHGFHECBCDDEDABEGDECFGWJOHB?CFC@BB?CFA@HFC=CBDFEDFB?CA?AEBBCFCABAA@>?@>?A>>@C?BBDBD??C@>?A@@DB?DBBKGFDEA==?BDC?>DC>@AA?>A?>>?BBA?<9<>=>:=AB@>=<=@ABCCDCC>>CCC@?AB@B@CGA><::;===:9;<:9;=99:;7:976:97:79=>>??=>=;><=86:89;87;;:<@A=@CDCC@A>><<979969@?@EFACDBFKJJMF@BCBEECFGEHFGAADA=BDECCDBABBDBBCECBGGC@FG@?BFB@@EECAFBADHFFFDFECEGIGKBDKFA>ACBDIE>CCBDFCDCEABDCEDBEFEGEEDCHEDLIBEE=AHD@FIDCA@BKKEFIGEB?AGGDDC=?C>?BACGIILOHHPNECID@?ODH]^QVKBFDCEEC@ECCDDCDFBEFC?CEABCACCFBFDCDCCKSTUVMKXUNP\cLPMLGKMIHIHGFEEJJGECCDCDGDBEDCDEGDFEFDHFGHDABFEBED@BC@?HHC?D@BDA@DDBCCAACBBFFBCE@?@?=AB?@A@@CBBEDCDA?ABA>=A@@C@ADCJKIECB@>@@AB@@AD<>AD?@C@?B@>@>;?C?<=<=;@CDBAABCCCDDCFE??ECCA>ADEBBCCC>;8=<8<<;;=<;==<<;;9;989<97;A=9:978998999::>>@?=AA?AA?@??@==;<89;=;<:99>CBB@CEDC@??===9;<99;;:?D?CDAFEHHIJIACFBFFCFBBHGEBEFDCECCGGBCDA??BCAGBDECCAEHDA@FE@@JGDDCIGIIKIDEHEACDDACCDAGDC@BCFJE@DEEDDCED@DA?ABCCCEDCGGGJGDFGGCFFADID?DLKJFDCBEKIFEFEDFKJDB@<@DAB@AC@BC?AEDDDC??BABB>BDCBADDEJJEBAA@???AA?AE=@EA>@@A>?BEDDCDEEDCDDFEDEEBB@ADCEEAAC@>;:9<;9:<=>>><<>;8;97;:6:899=<:=;67966:86:9@AD@ACB?AC??BA@>A=@<:<:;?@B@ABBCB@?@<;>:8:97::89ECBBGHHKLLIC>@DAADAEBEDEDBFFDBCDCDFFCBB>A=@ACBBECABDCABBCCDBIJEFCHIHEFGC@BDACCG>ACBCDIF@GHIICEFFCBDCDCAECB@EHECEHDFIKKEIFECCBDCDGFAENJEHEBB?DEACGHFINJCBA@?C@>@??@JJIPMKMJIDGCCNIJ[T[STSKGFDDC??ABACCBDCDFHFFHDADCADECBHGCCECJVYY\TIKKHKO`MEDBCIGDHB@EDGCGHBFEACBGGEGECCDFGEDEDDDEFCCADHDADEDBEFCDHFCABDECDDCCCBABB@CBCAADCDHC@BDCBCBCC?CCDCECB?@@CDA@ACCAB@BDGDBAAAAB@?A?@H?<@D??A>>=@??DDADA@BA??A??BCABCEDCCBDDBEDCABCB?FCCEDA?>9<<;<@??@?>?@=89;89<86988<>><:968;56778<7=BCBBDCADDACCCD@BBAB??=;;<9;@@ACCA@A=?AA<<>96998999:EHGKNNOKKOQ@:CGDBB?EEDDFDEEGBACCCC==EFBDC@BCBADFD?ACCEFFGGIEDKFBBGEFADGD@BEADGF?BFCFCBABGGIJDCDB?ECBEFEGGCCGFCDGHDBFJFBGFAJGCFGGDADHIFDFEEB@>DGGIIEJNHDCEA@A?@AA=CLKPPMSNDNTIFEEBDTVNVecXNFBBCCCBDBDBBDDDKJCACCEJGDDBCAECAAB@FRUSTOFIKGGKMKHEDDGEBD@DICFEGDBCBBEHEGFDEDCCDFCBFECCEEEDAEEEDCDCBDFDGHIGCBBFCBDDCCCBAA@BBDCCJGCHFBDEDDDBBCBAEFDECC>?AADB>>CCA@?@DGFCA@@AB@>>?@J@ABEA@FB@CCBDEBBB?>@@=@C@@CAAA??BCCADDADCCCED@=DEFAA?A<;<=;=?><==:99798887545:=>>;96475765764:BDEDEFCBCCAAA@=?A<===;;><9:==>>>>@=;=>==<;96798798:=BLOPPMLJKHC?AFFB?=BDACJLFEE=:@@?DGDAABBBBCB@DHGGB?ABCA?EILCFHEB>FDABHNJEFEFECEIHDB@BFCBB>AFCCCABIEFGDGEA>@DG@>CEDAAHJFBFHIHIIDBBBFECCGGFGCB?BIJHEEHHEDDB@ADA@DBCDDJMNX[OADSKGJG?IROCQhkeUC?BAEFBCDBB>AFBIF@A@?FKFCEBAA>?@AB@BHNNJGHGIKMJLJKLHGCCCDGIHBAGA@GIGDBGCEHFEDCCFEA@BFCCBADB?CBDEDCBCBDDCHKH@BDEACDDDB@@DHHBCAAAHFC@@AAACEC?CDBACDABBB?>@BCA@DABFEAADHGF@;<==>ABCHJDCHCDEDDCAAB@>>@??AB@?ABCDB>??<;=?ABB?CECACA@@>ECEFA@A=?>=>?=::?>9;=<;:;989988:9?<>@>@@<;=<<;9;=??=>====<;<=879:9897:?AMNNPMJJHEDDCEA@D@ADBEHLECB:8?BDQSF@BDCB@BBBEIFAB@BDCB@DICADICBAEIHFGKJEDENTACKGCC?EIGCBCEGFEECCEDFCFKH?CBDEA?EAAAAGCGGBCB@ADECCA=DABBDDCBCHLJILHIJLIJFJG?CGEEGIGEC>C>AGIHE?BBAIJDCEDEEDEDDBDBAB>?ADDDDCACC@ADKGF@AEDAABCCAGSUSRAA??CABCAAA?@CBC@EFCCA@@AA@B?>AA@ACBCGFCBEGCFC@@@@@EIHKJE@CDCA?@B>>?==>?@AFB??BA@A@=>><==;;?A=@AA?><::>HEBGFB?@B=?;>;:<><9?::;@=A@@>A=:?>9::65889;=>CEA?A@>?=;>;;;?@>@BC@>;:<:69=>@C?<>>==><<>;999:;;9:@FJLNSOKIGFHFDEBBEB?@EBEKD@C@=?AEMOFBHGD?C@BFFCHID?ADDCBCFDBDLHFEFJJDDIHA@GLMCDDBFHCGGDACHIJHDGE>?BE@NPLFAEEFFDGLMIEFHE@BDAABDECDDABCHHDFGHGBCEFHHFGHEBBDBABBFLKRROHLPOOJNXNKEADIIDEBAN`]NGDCDBDBBBDCEFFDFKGBBB@BGDB@>@IJGDCDEGHHKMMKKHFHEIHCCMTIEHDADD?@BDGEBDDHFCIIEEGEBEFHIFCFJEFBAAFGEDDBCF@EFF@BA@EGFBCDBDO^YOKADBBCEDCFECBCCCDBDE@@BBAADB@BAACA@CHDCDFDIJEEGJIIHGGFFHJE>DD?=BCCA>>@>>A@BCBCCEDABB??A@@C?>@@@?@DAFGCEDB@@?>>;;9@C@A=;>;<:=;=>C>@=;;?<;>;76;99<;<>A@@@><@@==<:;=;;AA=?A@>:998768=>@A@>>>;?@<<>=:8899;:9=EIMNSOKFEFHEADECCA=@DAGGA@EDAACBDGGFHFA?DAACDAHMCAEECBCCIKDGHFDACFBCFEADHDDFHCDDC@AB@EE?DC=CBEDLKIIFB?FJFIMLJ@CJFA@DD=BFFEFDBEEEGEGFDFCEBDHKHEGE?BDA?EGCGFLPKEIIHHJYhTKBDDEGKICADPOJKFDD?BEE@CHCHD@EJC;>BBEFBFBA>A>CFEDCACEGJBB@CECCBFBDJDACCBABABCA>@B@ADE>@EDEEACFABCCCGIIHHJKJHHGDFHIF?CB?>CBB?==>>@BBAAA==?=>B=;??BFFEDDDBBB=;;<9<@ABB=<<:9<==::747:9;=::;=;??;=?>@B@?CA>=?=;<;:@D?=B?<::757788<>AA?>><:A>9<>:9:889:98>BHQONQHEEICABBBBDA>DBAIDBCD=>FEDDEDGHC?CDA@BABED>CIACECHPH@BC@@A@FB=@HFBGGFEHGDGE@AFABC@>@EB?CB@GB@FFDEFECCEE>DFGG@BJIDCHHCDHFIGADHA@DGHIFACCDDFGDGGA?BCA@BB@@@>DDBEDBA>ABBC>AEBBEDEGIIFHIKMJKIFFIHEBBA>>A??@=;<=<@B<=A@@AA?>>>>>?AA?A>@=;;>?>AABBGCAABABB<8::9=AACC??A?<96898987878::?><=@<<@>8<@@C@=:<:6:67:<<@B??><=@;;==:9977:988=AFNNMTJDEICBDACCAAADA@EEDDBCFCABDECA@HHDDE?>CD@GQUVUMDLJUHJFBMLEHEDGGFFIFEEJDJPC>FKHEDACECBB?@AA:AEDECCCCDACFCBHD>DGIOTSMLNJIOQJFJCGJJLHEBBC>FKBBFBCH;>FKEAGHFHHDCEDDHBAHD@BCDBFFCBCEHHB;;=>@EDADDCIDAJJFHGFBGIGFD>=AB@CCAAA??DC@EHADCBCDB;AD@DFEEGMHGLIILKKHGEFJE@B@;>=<>B;:=<;BC>=?A=B@<:?>==??B@<>?===>@BC>@CEDABAAB@>??<<=CBBDBAA<:85786899<;<=<@?;=>;;=<:=@=>CAB??>==:<<<:<>=ACA?<9:<;8:=;=AA@A?@DGKPTMEIFFGFAED>@FD@ABBCDBEJFD>AA@B?>AA?BCADDBA>>=@FEAADGB>BEFDCDC>?DEEAGGECCDCABEDCDE?AA>DAAAABBBCBA?>>=CBBKGBJIEHJHDCDFDD@E>=?@CBABDFDACGD@BHEEFD>ABDDEMSQMGILINFGEISADDDKKIGDFIFFNDFGC@OOHFCDFBD@=>>?B<<<@A@@CFDCDC?BEECD@JMPNKNVLGMHIDF\d\JMHDHHEEEGC=A@BD=@G@@FGDEJJEEFABDAABBBBB@CBACCHKEB@<=>?BCDDBDIIDDEGGFE@ADBBB@>E@?BA>@BACBAAFGFIKIIIIIIDFIHC?@=;>;9:?=>?@AAA=9=?=?@9;==;>>?@><=<<=?@>A@?@AFGDFEACCADEA?BCBABB?A>:<:699689:<<99;A>?@=;===???@EABBB><><;>?CD==;8<>;<=>@BC@@B><<=<<><<879::9;AA?DIKQQKKIEHK@B?>AGIEEFA@FGDEEECEAB?CCDC@DDCABEFCAAGMB?AFHDBBCIH=A?B?@DDCDDCEC@CFFDCEDGFBFHHFC?ACBA@DA?CCBCFGJGBHIDDIKD>CGAACFCCBHFB?CGCBFEGGBCHGFGD>ADBCDBBFI?BBEBCGACGC@BBAE?BHHDFEFOWRPORLFKFGFJ_hfMKJCFJEEGGDAEA@>?BGBAHOFEKKFEEDCCEDBEBAEFBDCDFIHEEAADDBBGEHDEFGCBBBA?B@@EEFEB@JF>;@BCEEBAAA@CDDEEB>CC>?CBBCAAGJGIMKFKHDEFHGHG@B@ADCBC?:?@@A?;7=><>=>>>=<<;>CB@AA@>>EBBEA@BBBA?=??BB@>=A>;;<77:857866:88;;>@@<>>=CC?CEA>>>===><>BCBC@<:9::8;>ABBB@@A><<::<;888::79>@><>FJKNMHGKI@??BB@@DHE@BFECCAACB=BDABEEEGEBC@BGEE>AF@BFEFGCACED@?CCACADFADEDBBC?@EA@DEA?ACEC@?BCABCCB?AAC>AEEBAEGDAEGDCCEGDBCEABDDBAB@BGD@DG@@FEED>=@BDEFHLKDEJECEEFHOWKC@GMLJKJGFGGGBFCEEDC@DCAABDCEC?BBEFFEBCBBDB>AECACDAFA@JPKLN[WJIKKEJU_cMHHCEGBDFCGIC@>?@CCAAEDDEFFFEEFFECDEEBBABBEDAFIFDEEDEBBDBCECCEEDBCCBBC@AFC@CB?DE>?BBBA??CEBCF?BDBB@CBAC>?CAACGHFIIGGJHDFGFFGDA@:799878=>A@BBB@=>?@?=;7??=>=??>@<87??>;9737::9897785777789=>;<=>=>>AD@=>=88;<=?D@ACDA>?==<:;=;7999;:8?@<:;@GLJFEJIIB??BCA?BC@?ECDAAECE>@@ECBBDG@CA=ABABAEKG@AEABFEF>;=??GNKLMC;;CBEGCMIQNJLJHIHIJLJGFHGBEEEF==CB=FMFFDBCAADCB?BA@ABB?==;=@CCDABGIJIIMXSDBGJJIJPaNCDAGB=ABBIF?A=<=?C@@DDJJB>AFFCDCFDBEACB@>BDCCEFC?>CIAEEBCD@EDDDC@@AB@@AABBFD@<@A@>AA=AC?AB@@AA>>BA@@ADBCEGGEFDBAEFGFDEEB<6546868;;>>@?>@A><>><<:;;;>=?=;<86:;=BB@@A@=FBEDDDA=<>=:;;978667748<868767878:7;;<=>>;=>==@CAAGBBBCC?<;<=<;AC@<;>CCCCCDCCCBBABCB@>>@>=8889<:@CBBCBDDC>FDAACBBA@CCCGCA>A?GDCACACA@EC>?BFCGCBB@DFFIMECC@BGB@HHABCA>CAEDBCC=9>>;?CHBD@?FGEIHKIFHECDEIKLDJH@>@BCA?AFJHECGAAGGDBFKLLJIGLOMKIIMJFHJHAD@CLD@CAEVVDIICDAFBAAAABB?DB;;<=?HK@@@DAIMJHNNPPLNNKIRfaMCDLOE?EDBDACBBG=;A@=DJGA>:=DB@B@ACFGHOC@@FEBED@AB@DJEDGAMTGCKRNDBCACEBAAA@BFBEDC?=@B@>ABCC>?AACB@?@@>?>=@B@?BDDFBHEA@FIHGHHGA:64664689:>=>??<=@??>;8;??><98778:>??EB@AADCABD@?A?;76566657666768:768856769:99=<=>==>898:====>;:<;?GLJKBDGDB@AAACDB@@=ADABBAAABBBDEEC>?DB==BECC@AB@CDBDC?>>>>BDCGA@ECEDCCBA@ABBCB<=BBAD@GJDACA;::=?;CEED>BBEGFHE@BGD>CGHGDACC?CEBCB?ALQABGC>GFD??AA@;CCECDJMLMJHGHJKNJI_oUIHFDBDDAA?=A?@ICDMABGMIAA??AA@AB@EGCEGB@CDBCFEABBACBBE@A@BBB??ADDDAECBADIGEGHGA;8367169>??><>>>?>=>>=<999:>>:7799869@?ACB@@CBBCBBEDB@95668556766666<99:799778:878;=?>=@C@AA@CBDB?CCA><:;<>=<=@BCGHGHFHDDFEDFDDCEGCCEC>><>><699:;=<>?;:=AGHIGBEIGCEA@DEFFD@=AGCDC>FDBDCDEDEBBFC??@CDDDCFDEFCDFBBA=BFFABAB?CCAHGCBB@@DB>=BK@CB=CIE?CA:::<@CCCEDD?CDGEEEBBGH?BCICDEEF?EFDDD?AMNCDHB=DFBADIKF@ADHKNNLG>BPMLOKKCDFDELOLMMKGEGIGFFPOHFJHDFHHFB?EFSTODDBBBCD??C@=<::CC??EKLMMIFEGKIHHJWgUIE>?BEEEDACD@=GDEJ@@DHICCDFFDFHJDDEHIBDDGFADEDEGEAIJDGCCCJMG@FFDEEEEA?AAACCBA@>=@?@@@DBACA@DACD@CBBBCCBBBBA@ADDFEEGFBEIHFHJHD<855446<@C@>=>>>?=<;CCCDA=85556536756675:<9899789799;9<>>BA?AA@AAB?BB=@==?A?AA>@CDEDEDEHCCDFFBBDCCB>AA;<=:;<89::=>@@>>@DHGEFIEDKH?DDBBCDCDC>AGEAEBBGC>BFDCC??ED@>?BECBCFEDCEEBB@?CEC@BA>CCDBADFDBBA@>?@>BF@AHIBEG@?A??@BCCFCAEF=EECCGHDDFGEGFHDFCFFABEDA@@AFIDCGCAGIFDDDFLHABHDDNIJF>>BKECHCBDEEJNJLMJFOCFDDBDJKIHHHEFFECAECLKIBCCBGHJD9@A<99:CEA@BIJIQMDFIHHJIJLMHFEA@EFEKKCEHD@BABKEHFCDCHIEFHGIJGCCIGBEDGEFJGEGHFM\IGLIC@DHE@CCBCEDCECDACCB@AAA@>@CCB@=?D@>CCAD>CBBABDDABEC=ADDGHGKLFCGIHIKID<85656<><@>==?A@=>><@F?@<:99:78969>DCCECCDCBDE@BC>A=577775:878467:<9::::8;88;9;;@ABA?>@ABA?@CA?@@C@A?B@?AB?@AABCHGEGHFEFCDCBCA?@@@??>=>BDGCCABCABEFHFCDDD@>DABHFFBCCFEBBBA>?AEB@EDEEADEBABCDFEBABDCDDBFFFGIJHGGGDEEEEBAFD@@CC??ABHJFILGEJGIF@?DLKFFIEDLIIG96@K@GFFGGDEKLILLEFTEHFDBCBEMLJJGGHHECFA?DGGGEFLJID8;;9==>BGDDCGPNNKHKJHIJHEGDDEHDEEECHMEBHDDG?DKDIEDAELKBEJFHJECA?AEGFFCFIGFEGGIUFDHGECCCACCCBCC?BGAA@A@CABDE@=ABBB?=BC@@BCBACCABDBCEAADC@ADCGGFIJHCEGIJJIE?<67<9DA==>;>BB@?@?ACBA=>CA=;;7889:99>CB>AA?@B??BC>?CDBEB@A@>@@?=@CCEHFGHGFFABCAB@?AAB@??><;>:998:>AA@BGGHJC@EFBIKBBCBACBCD@ACEDGE@ADBBACB@@@ACC?EFEDBD?BC?AAAGHFHEDFIFDGHJGEGDCDABDCA>CGCBDFDE@@DDABB>AC?@DHBDEACECDIIGFHHCABCFA?DC>>ABCFEEHFBEJF?IGGDABFHGFHMKHOQEG?>FJAIGILJHKNMKMJACOKFGKAC>?GMLJIHIHKFHDCCDHGCDLEAC?=??ACFCEDCDIQNNNMOMJIHIDHHFFHEEEFEFF>=CCFI@DDDCAEADLKDFKIHKGFC@?DHEEFDFHFBFIBCOIECGCEFBADEBCC@EGDBAA=@CACD@AB@ADCAAC@BCEB>HDBDEBBCB@ABACDBFGDGIHEFGHJHGFBA<@@><=<=?><>?=@A=@=AC@<;;:8::::8==?98;===?>>DIHHIGB?BAIHCGECDC@CEAACFECC@AF@CECCEB?BDBBFEFFD@?DD@EEBHKEFGFKNHDIKHGIHBBC@CGDCBC@BDADGC@BEDBBA>ADBBFEDFGADFA@EFEEDGF?AFF@AEEAADEDFFEFCAEECDBAFNG>BDCEEBBGCEEDGJMJOOMNLJLLJGGHGIGFDGFDDB>=AFGDABFFCDJFDJJGFGGHHDHFECDEDDFEHHEEGGCCMKECGADGBBEEBCCCDDFABA@AA@BD@BCBBCB@?@ABDF?AFB@CA?AA@AAA@EC@AHEFHGEFGFFEDDA@=?@>;><;=;:;><:===?@;?CC><:9;979879<@CCB?BCCDCACCBB>:8575666555666599776887987:87>?BBBB?AB@@CC>>EDBB??>>?ABACD?@CBBABA?=<=;99<>??=>ADHHJJDA??DEGBBA@@?CEA@BEKAAABD?@@?CEB?@CAA?BBDD@CEFFGBBHHA@CDIGEBHLGGJEA@@??FFBA??@AADC>@DGD@@@BCCDCDACCCBABB?CIGAAGHAAEF;BACBBEDACGECACFBA>AFN?:;CHEBDJOMKNOOLJJDKFHKHHJKIILLEDE==A?EHE=BB>AJOJIKEEFM_\EAACCIHBBCCA@BCBFEBCFGOOLLMKHJMLIJFGHFEECB@>?BCCBDFECGKGGGJLHEEEGEEKD=FFBEFCGFEFIFBDHGEHFGGDGB@CADCBCBBBCB?@A@CDABDA?@CBAA>?B>BBBA?ECA@BCABAACA?BCCBCFHGDDDEEEDCBBA=;:;;==<<;9:<=<<>=;>=;?ABA<8;;86887:;?CC@BDCBCCACFDA?>:56767665656868<9798789999:8;ACBA@??@A@?@><;>AEDAA==?<;BE?=BA?A>=>@??CIIIHDF@;?QVB@?>@@BD@@BCGC?BBDA???CC?@BBBDBDBCDBCBEGE@@EE?>BBDA=@HJFHLID>@B>@D@==@@@?HCA@AFD@@AABDDDE@?A??@AACEIHDCFDAABD=?>@AA??AEGGC@ABA>FIHGHBBE]_\PIBC??BCDDA?@AF?HF@@AEJONLIHIGJJIJHHEBBBA>><=ABBBFHEEKKKIF@FHCBCEHGID=CGDCDFFCEHGECBDHJHHHGBFC>?@A@CCACAACABACAA@B>=BAAA@@>@B?BBAAACD@@?BA@BB@AB?=EHHFIHDC@BCBADEA?==9;;;;=<;:;::;:;<;=;<=>B=88;97799889>CBBD@@EFEDCDEC@A?5589698689888:;9889::99<9<<;>FA?CAAB@=:=:7;@BAC<<:88:9:?A@@ADAA@@?CABCCDEEDBABA@??=@;9::;<>>=@EILKJFJKGI[`PCAB@?BDC@BFCFDEBA??C@ADDEEEDEEFBDDB?>DB?BAAEC@BBDCD?FHFHIIC?ED=?@?AA@CB?FGFBADB@DD@BFBCDA@EC?EIFHGEEFDCB?CAAAAABADA@CEEBCC@CE>=GH@IB>GKF@BIMMOMNRJDAFEJIDEMOJJLKGABBCDEJGEHFBJLC?ADGEDFO`[Q]_OGFBFDBECB?>C@CHCBDGEJMHEIKHJJHJJHCEACDGCACDDBEIGGFEIJCDDBEFFEDFDFIBEHEEFLGCEDDIFEGGJIGADHIEBC@@BCA@BBCDA@BBBFDBBEDAC?>BCBCDAACCDFHB@A?ABC??DB@CEEEEGEHBBFDDFDCFD>@>==<><<>:::;;<=<=>=>C@@@<;<966:;;=<:8;77677898:>=>CCABC?@BBABCA@BBBAAA@>?>@=::98=>;@EA=A@?DECDBECDDABDA>CD@BD>@CEBEGDFHHEDBAABCCBC@ABCBD@BEECDC<>C@CH>?GL<@B=EJBAGJJGMWX[c_VHEEDDCEDB@>CFCEFCCIEFLJGIIHJJHKJHDCCDFIIEEIFDD@EHDFHFAGDEFIDBFHHLOLKHEAELEFJFFLJFFEGIECEGKEDEA>CA=BFBBCBCF@@BCB?DEACD?BEBBEEBDDAHEBA@CACE?@CB@BGBAEDCFDDEFCDFEED@<;>;>>>;;<9:><;=;<>>==@A?BCBCDCEEBBECAC@:9989<866966:67==<==;:;:7<<;=A>?@;88879<>?@=8798:979;87::9;@B?DA>BC@BDAB@A?@ECBCB>@><==779<=@?@A@BBA>>BB@EF@BGHDA<>EOXXC===A>BB@ABAADCABA@EE@@AADDDBCDCCBBEEECDFFACBABDBACB@@AACFFCCBAECAACCB@DF=?EBAGFADE@BELLJNLC?HPLHFFEFG>>LQLHA?GHGHKNQOIEDEB?B@ADGFHCDED>@EHHKOOMIGCEECEGDGHHIGDGKFBBEGFFBADEA?EEBC??DABCACICB@BABBCBBC?@CC@?ABADDCB@@??@ACBBDFCCEDFBDFCDCBDB=?>;<><<=:9;;::<;:>>=>;<@;:9@<:=><<97:<779789889?>==>:9;99<=>??=><:<==<=?@AA>;=>8;9:<;9:=98>@=@D@@DCACECDECACBBEEAAA<FBAEB@B@AEFHGFE=DGEACB=AA=@B?>EHACDABCB@DACDA=@FM^^D@ACA@DCADBADD?@DA?AF?BE@HLGEFFCDEBBCBEDGFBEBAED@EHCABBCDEKDEC@DDBEHDBEFGDADBEQIDAHFJMQLJOLA=HNINMJKIFCSUOOMHFILGHMV[UNHMFABCA>?DIMKJZeSFGEEEIDBJIEHFAEFBDGGHGFGIJEFIIHHGDFHEFIGFDFDDEGHIIECDDEFDAEGBDGFDFJLLJGFJGHHIHIIDJIEDJLHJJEEFDFFBBBCBADDACEDDAABLJCAECACD>CH@BGCADC>ADCCFBAC@?CCBBGFDHIFFEDDFDBDFC@D@=B?<==:8=<;><=?>>>C=?A;98?><@@=??=@DC@EDBC??=?<@A@A?;78:86:88:969:<==;;<:;=>>@B?==>;>@?A?=>??>>>?=:;9:<::;;79<=?A@BCCBCD@DDFCCAADECAC?;?A:9979@>==?FFGFBED>@@<==A=CE@BFEDDBADA@B@AA@AA==>@?<@EEDBEABCA=B?BDCDG>?@BBA@BEEAADCBABEEEEGED@GHCHHBBFC@BABFDEJED=>CA@CBACBCDAELDD@?BCBEDBBGIGC@FEHNIEAMHFHNJJQLAIQGHSSNIGKRP@@INLIJIHGMP[\\MIGDEEBD@?GJIKLRICFGECABCILKGBBFFDDECHDHEHIFHIHJGBDHDEIHFDGICCKHIKFEEEDCFCGJEDJGDFFJMKJIJIEGIEAFHHKHFDFGFGFGKLGBFDDEBCCBACCBFGBADEBCAB@ABAAEFBCEFDEBBBBCDEBCCDCAA@CFBEEFFFEDHFDDCDEDB=?==>>:<=;?B?;?A====ACCDDDA>A>;>>>ACB?<:::988998:;7:=A???>@BDEDB@?C?BCCAC?=@@>AA==>98::87>;;=;97<<>@FE?ADAAA>?A??FEECHEGF?BGDB@?CC?DDADAADA>AD@@AABD@?ABCFE?B>BCFFCCEEBEFAGOJGHFFGNRQ`tVJJFFDADF@@FGHILEDEICCDDDDEGEDCEEDADEGDGFGGEHKJHGHHFHGDGHADGEDIHFJICCGDDKIGIIJJECFFHKJKJKNJHHIEJGIIGJGHKGGGDGJGCCCCCDCBBAAEHDDFCCFBBBAABCBCEEFGEDFBBCDCEEGDBBAABA?CDEBFDFFIEGEBBDFEFC?AA@>?@@?>>@@===;A@989<@A@?@BA@?ACCFDB>?>>?<>C@>>>98;989::::7:<>BCB>>ABDDB@@AAAFFDCCA@>;>@?>?=:;<:::<;><79:?@CCFFBBECBFECEEAACB?AB?AA;;DD?A??CCAADECEFGJFG@A?>@C@?AACEBBEBA@>??@BAACBBEFBBDAEG?BA?@CFGIHCBACDBDBDBEGGKIFGEBED@FG@ACFCEHBCBABECCEA@DEDBCFACDB@B@CD@BEEAADECFBCFGBEEBGHB@DDFEJEBNIfr[NPOFFV[TMMJFLPMLF=DJMLHHFEJUVTVXNPKKIEEEHE=AEFFKHFENLJDUUIEFECFIFCDEBEFHFHKGFIHFGEDGHBFIDDJGFHGEFFEDEGCGGHFGDFJHEEFHGFGJLIGFEJIKJKKIFELNGFHJHHGCDCDE@@BDCBGGCEFC>A?ACEDABADEEFEDDCCEEDBCECDCC@@B@@CBCBBDFHJHIHGHHDDGD=?B?=?@>AA>>@>;=<9<=>=@@CEB=>ABA@?>AB=ADFCBCCA?>?AA?>>:=<8:7:;::89:=A@?A?BCEFADBCDHFFGFEDD@?A@?A=@CFABA=@DEDCDDHJHGKIFBEAADCBBAACCEEBDEDB=?GJC?CCAB@?ABDEDAADDC>CGEC?@E@AFFFHDFFDEDDB@@?ACEEC>?FEHHID@ADC@BCDCBDDACEDDBDBABCB@ACDDCDEFEDDEEDBADIHA?EECDHCDKKY`SMSK?FOLJFDEFMLHHICFJJMNJFDFHQaSWbPJHGDCFFIH??FFHMKMdf[]Yg\FGGEECEHHFCHGEHGHHFFFGF@CJGELGDGGAGFGFCEIICDFFHHECAILGAFIFEGKLKHJJEIKGEHKJHJMLJFGIIIHHFFFD@CFFCCD@BDFC@BBDCBCAADDDHHDCFEHECBBCEACDDABDAABFECFHHKLMNMKLKDBFD@@ACB@=?????>;<@>:<;?@@@CB?B?AD;<>><;>@?=B>:::;;<=:<>>:A=>CB??>=<;;A?=>=;>;88:7::679;=@C@ADCGJGFCFCABCCFECC@@A@A>CB??B>@AAADHGGKJJIJGIKD>?<>@C@DF><@BADFA?=LMAHD?BFB@B?DDBCDFFGCA@ECHKC@EEAEGBDFB@AA@@A?CGCCHEBA>BCAFCBBBAA@?AB@DFC?FFGGCCCBBBDC@CDCBBCADGBFGDEDCILC>EIFDI@DJKJMOOTPJQPEN_UFBLMCAGGIJKLPRJFIEKUQVRTVJHFEFJHEGA@IFGOMZVQNUh[GHGACFFDFHHHHFGHHHIHFGGCCIFFIFFGIEGIIFDCGJECHGGDCEECHDDHHGIJJJMGHHEILIHJKFEKHFIHIILLGEHCEDABDFCEFBACEC@BBDECCDEEDCCDBCHIHCCDABGDADDDDB@@DHCHMKJOMPRPNOOCBGA@B@A><=AB=9>@>>A?>F=9<:=??><>??@BB>@?>?<=:;;<;>?><>??<;=>@==@@?CEA=<=;9;;=??>CHEHEBAA>>@?=>=>;=:99896:98=AACDDDEDDFD?BGB?EEBBA@A@>A@@>>=?BAFDEIGEECDDBACBACAB<;?>@CCBA@@@DCGB>>FGB?:ACBDCDFDCDDDGECDC?BDEFCACCCBFABABAAC@ABB@AA@GHAAABA@FCABB@AB@?@BFDCDFHFEEBBCADGC@BABCABGCBADECCDEHJD?EGEHGACGJFGMNOQQU\\WYVGEFGDAEMMKKLOUQHHGEKQMHXZVIJIBGKEBDCDHEGJKKMEEMJFDFFCEBCAFHFEDFGFJJGGFFCADGIEFDEGFELGFGDFGEEFFEDJGECBIHHFEGFDELFIGHEJHGIJEEHHFDFIFGHHFEBB@ACBGHDEEB@BEBCDCECCFFDCCCBBCDHCACGCBDCADDDCB@ACCCFLLIMLPQPLLKDDFA@?@=<:>?ADC@B989::;?@>=>@?>@?>;;;<;=><:;;><=DGDEGEC?>=>>>?>=:;:99;:;=@=@@@DCADGCBFE>>BC?CDBBB@?AABCCBFEEFHGFFHB<=<==;A=B>ADC><>=;@FFBDIDC?C?AC?ABEADFBCEDEDEBBCD@ADCCDHF@=?DCBBCA?FCDDDB@?B?=@@HFACDB?A@DEADFDCBACDEEGJHEHDAABCCEECA@DCDCBFDABEF@ACEHHEBEEDFHADHFFHMLLMOQVUKKSGIHEBEIINMKIKSSNJIHKJN^Z^\LJNGDFEEHGBADDEHKJFCBEFCDFFE@C@HIEGFGEDHHGFFDCEGJEFCDFFGFGHKIGIHDBBFCDJJEECFFGA@FFDBB@@GFDEHGFEFIKKHFIKFEIFHD@C?>CDEEDEDCBFFDDDEGDFECCFGEFGDACBA@DDCBDDEGA@CBA?@EGJLJIJILLLKHEFFB>;>==<>>@?@ADBCCA@AC>>9889:;=@=>>;::<=><=<;8;B@>BAAFEEHIIHJEAB>:=?=;<=><<:BEFAEFBB@=?><>@>;>>==A>@C@?@??CDADIECFE>?A@=BBACB@CGDDFC@FGEDECCFD<::89?AB=CEFEAA@><CCBCFEBABCED@>BBDC@@DDABEJG?AC@CEEBEACEFDCAA@A?=@CFHCBBBBC@EDCDEDEIHDFCDGGECB==>NRJFECAADDEFECCCACDA@BGGFDACCECGAFEDEHNMLMQOKLKNJGFJEGEKJLMLHFLOLLMIGGK_ZULKHNLDBBIKDBBBEGFGGGEBFJFFDBFHDDJGFJIEHJGFHGEFEGHJDJD@DEECDGIGGJHEEKIFBBDDAMPHGEBEGGE>CKFGFCHIGAFLOLGGJIGGLEIGAEA@BEEBACDCDGDCDDEDDCCCDFGEEFEDADB@EDCCHEDGCACB?@DDGHHHFJEHLMJJEDHC<:<=<>?>A?>BGHGFC?@A??=988::<=::;99:;>A==BBCC>?=:<:9;;>CFGHHHJKHJIKHDA<;=>=>@><>?<=BDECDB@@>>A?>B??A@@@AA?CAA@@@?CECDEBCEC@=?@AD@@BADFDFHDBCFEADCBBEA;:989>?A?CBHCCB=;@CBAA??DJDA?DECCFEDC@BEHGCA@BBCDFB>;>OTLGGCADBAEDDBC@ADD@CFGGFB@DCFDFCIEHHMLHILLKMPNNDEHKJIIHIHIKFCINKHKOGFDPUHAIHHKHCBFG@CKHEIGEKIEGFCDIKDDHDGEFGFDFIIFFIHHGCDHGHIEDDCDCJHCDDDFGJKFE@@CIDLQKLKCCIJICSoJIGFGFGBGLNLFFIIFGGEIGEGCEBDEBBDCAAABDCCDCE?BECABDDDEECDACEFCDC@BDBBECBFEDDFDEEGHIMHDGDCHF?;===A?@@A@@CGGFB?BACDC<:;;:;::::9:<<=<>??>>?:9<<BBBACC@DC?BA=>>=?CB?=B>@CC@@?@CBDEEDCFDBABBACA<::89>?;A?=>>@CEDCFFEHE@BBACA<@C?CHD@DBBBE@CDCAGKDBEBAFB?CAEEB@@@B@@?==;8;EE@ADD@CCFFD?AEBAD?>CBABED>DEFJJEDECAAACBEDCBCDFCCDFGFCACDGGF@HGLNNIJRUTQMNKJGEKKKHLKDEFIIHKLIHIMGDBFJCDKJGHIGBBB@FIGBDDBDEBGEAFKIGF??@EGDLNQJDFHHGHGDDGJHEIJEEFHLKEB??EHHDC@>;GQICBFON@@KKHEP`GDBCFDCFFFGFBAILGHGEEKFFFFACDCFGDBCA>DBAEEFAAEA>?BDDFCDDBBCGCFB>CC@ACCCDCCFHGEPXMLHDEEEEHF?<<=?B>ACAA@DEEE>=AADEB=:;;9;9:;<99=:<@A?>@@==>>:?><=:>FJKIJJGGGE@DD?=>=>>=?A?;:;:<>DDEDDDB>>@@==>@BBBACCBCCCCEC@@>>=@BCCACAC??BCA@>?BCDCFFBDEBABABCB><;;<=>=@@?DBB>?DCACCCFFEDEICLE@B@BDB?BCBEFEGG?BHJ@DFEDDIGAA@ADB@ABEFC?>CD?=>;?KG?CA?B@CFEDEDDDED@@C@?DCCBBA?JFAEFCCFFBCEBCDDDGECDEAAFFBA?@DEGG?DJNLIHLOTZUKIIJIEGFGJJKGHIKMLLIGLKGFGCFHAFLLMKJIDCDEIEABCECABAAFHGFBFOFD9KGCPUVNJFIKFFJLHHJHEJGFHEGHHFC@AEHIE@<:5BPJC@CLQC>JIFFB;@CCHJDCFFBAD?;EIEFIFFPJDFDBCGHCCIKIE=BDCCCCBBCCABB@BFDDCCBFGFEGC@DFDCCA@EBEIJEXgOIFFGFFGHF?;?A?@?=AD@CFGEAABAACAA@><;7:;:9=;79;;?C?=AB@?A><><;>;CECFEBEDCBBABCCCBAABEA?CEAABBACB?AABDDDEDDGECCBBBC@<=@BDDFA?=?<@AA?BCAABDCBAAGDKHHC@BBDEEDBBBAFGBFGEEEEB@CHGT`QDC>FDEGHC?BHD>=ABGRUQEA@@DCKDGIB@BEECEDBEGDFGBCCBADFGGFFFFCCCCBEDDFGBCFGIIHGCCCBDC>FNLKOLHEGKKLMKOJADGKNIIHMSPKKLJJKKFNMJLLGHJLKLJHHFEIIHGJKMJJGHHIHDEGJPSOCIBDHIPPKGOPHIONJJIIJGIIIFFEDEHFDGKNE;866?LNECHKJ?@KIHGBDFHRWQCHGDDCEDADGGGGIINKHGCCFFGEAGQNFBDFBDEDFFDFFGEAEDCFDAABGFHHCBEFCB@@DCDFFGJLGGGGIIHGGIG@>?@A>=>BCAEGEDCCA@ADDBBD?:7;=::<;9;<;ACACDEBBDA=<;9<;:ADBBBBEBFABDFHGB>>><==8:;:9;=@DAB?CFEGHECDB7DHB>@C?@@==@CCBCCAEDAED@?BEEDDBECEHFCCEDFBACCCDDCCFDDHIIMOKIJEEDCAHIHIUOLLEGMLOOPFBHLNPLIEOVQKKMLKLJLWNNLKKHHHBEKJHDEIHIGKLIGIJGGGFHLNJHKHNA7?JIMOIKPLGLNJJIMIKGJFFFIDEGKKGIMTH?::8>IIBCIJIDAHIFECGIHOLDAFGFEC@CDCIHJKNKMIGHHECDDC@CJHFBGIBABACIKLHGIDCFAA@AADGFFFEDEFEB@BAAFEDIKIGJLGGKMGDHGEAA:?>A@A@@CCA=?B>?@EFDBF=::=<;=>?A?@CEC??DFD@CB><<:;;<;<@?@>;@EGEEFCCA?ABDACDBCDFFEB@BB@AA=@A==@A@@BA@@?>?@BCCCCEDACD?@DBAGG?>??>=:FIC><@B>>A@BFB?BBAED>@FC?DFA@ACHG@?BDCGBDAAFECFLOE=DJKDB@GJMEAC<6?GGKKA=ED?B@>
AFFDEECCBBEFBBEEEDGKF@DIEHIHEDCEDIJJGAOYKILGBIIIJMIFGLLNNMMJJLMY[SLHJJBAC?FLIGEEDFDBCEEGHHGFFEGKKJJB:FOZQBFHEECBEDEJFBCEDEEB@@DKECFEELHEFDBBFIDADEDCA?FEAFBAGHCCCBBEGBBB@DFJEEDFFDBDDCB@C@BFIHEHEJFFHGGCDIAED=;>>><@@@B>A@>BDBDGFDC>;;CGF@AB>==<;:<@EEDDFCEED@DDA?DB=@A<@@>=DGAADCDGCDBCCGBDFEEBAB@AAABB@@B>>@B?@BB??A?@B?ABBCAEBBB?@CB@DGC@B=<;?;9:=>AA=>ABCD@>A?DFFADEEEEC><@BCFDBFDDGCEDCDLQFFLDFKKHKJCFEFHKMORLGLXOZ^NFLH@BCBCEGJJFA@EBFGGEHIGGFCCHKIMK@?QRCEPTSOKILLGHKJFGGGLHHKFDBHIDEHJHFNMD<;9GNC=GKC@>DLEFC<==@DGEFHBCFCC?ALMFNKDIHDDFBBDDCEHCA@@CFGDAHEDGFACGBBICCEFAEKDBFFBDFDCCA?BBCFIEGHBFEDCFJHHIEEBA;CC@>AB?@B@??<=GDAB@>A@CFEGDFJGFJHD@A:CGEDA?<==>=:9=CDA?A>B?<::9=C@?=>=>>:;><=>A>ACA@@ACB@?CBDEEEBDG>DEAB@?@@@?@?ABB?<=A@@A=>?>@ABB>@><@@BCB?>@@AAAABEC<99::99=@?;>??DE@ACB@EEA>??EFD><@@@BCB@HEBAB@ADBACEFFECFINDCDDKPKFIB<@DHFAEDIHFBDEPB;GLIIDGIEFFFIGIHFEJEHHCBCBECEEA@BD@DEAABABABGIC@HCBC=DEF@FHEECDEDEDCDECGMJDIGEIJIFKQMIJZPJFFJMEADECBBEJLIIEGJFGFEFGIGHFCEDGOKFGNFEGMJMLEFGEILHIHGHGJHEJF?>HMEBDCDCQYICELC>>@BBFBD>5:;@IG>FJCDHDCB>GFFIOIMLEB@BEDDDA?>==ABCA@AADBAB?=?CEBEDEFHFFGGEEGGFIEF@?;CCDC><=;:><98=?>=769:99=<=;;@@<@C?BECBCCAC@?BCB>@>=A?>BB>?ECAAA?@@<=>>>A@;=?=>@?<A?;;@@ADA>?B=>BDBBED><:>B>>BA=;=:>DA=><@HC>?A@<@@CEB@CGFEB@CDC?AEFDFGHIGEBEIIKHEDC=AHE@@DBEIHCFJEBDFQ`AGHHCDJGHLHDHKGEECBGCBBDA@BBABEDBCA@AABEI?BMA?@=AFEAEJHEDBEEB@BGFBGHEJJ@DNKHDJFJPFJQFDKKGDDDBBA=AHIHMFINGDFFEEIHGEEBDHFLNJJGDDIIFIKGEJLFJJJEGIHEBGJC@IRF@EGDCIKFHMLC>?=BJKIN?FKG@996;@ACC@ADDBA==<@ACHHBEGEGHGGHIGHJEFMF@?=BAC@<=<88:986:::98>@;=BB@AA?;=>?ABECABB@@ABCABD@A@@?@>@>?<=@=>==??=>>>?=>=@>?B=?>@@>@BA?@B>@BEDDEF@?ADEABD?@A>>>C@9;??C?:<=<@F=;BC:?B<=DB@DCCEDEGDDABEDCICCEDCADHKMIEFE@AEB=>EICQXGBDGKGHSeDHEFBEDCGLJHLMHCBA@CD>B??BACBACEDEC?ABBEI=BKBA=LOLA>AB>@A=>B@AFD>?B@ACBACC@>A?=B@>?>==?=<>@@>ACCA>?BA?AC?ABBCCAA@EEBGFCD?>@AA=DB::>BDA=@B?BG?=?IA@CA=DFDBDECCFE?DECCGEFCBDEDDGGGLNIGH@BD@:?KQB\vXBFEKHEFW`YIFEGEDGNMILKEEEABBC?BD@ABBDCAEFCC@@?ACG?BJDB?=ADDBCHEFFCAFC>GHDBEECBCGIJIHMFMGCEKNIJICBDEDEFAEEVRTMFEJLIIIGFGGHDLQNFFBDHHIKGDFHMLFHKMGGIIFHGEFHCAHKIEECCCFIIGDGF>=FG=AGCBDGKIJI>78AHEFJHFEFDADBEDECEJJJIDBCBCLTEGOB@BEAEDBDEEEEHIIEDFGB@ABABBCB@BEEBABEACCBBDGDADC?@A@BB@BG??>BBABCDCA@><=>@@DDFCIJGGJHGIIIIFFGIJACECBB@>=<;:;9:8:;C?@BDAAGE@?C>>CCCCBBBB?@@?@ABA?B>A?A@>?B@??>>??@BCAACBBCAEB?@A@@?????=;??<>><@?A@??@ACCABC@BAAEEBBEGIGFFECBAAA?@==?=@CIKFKRMHILLGCG]riLFIGDBBAFIJKGEDBAC>@B@??@?===@BBDCDACADABECCDLHGKHJGKIF=;ADGDCGGGFBB@ABFFDGIIHLJCCDCBBCBCHBCEEDGDBEFCDFFHGCDFDBACDDCABCBADFDACCA@@EBEEB@GOG@CAB?>BG?=>@BCCBBBAA>;=>=ABEEDIJIJIGHJHHIGHHJIDDCBBBBA@=:9:;;99=@C@=?=<=B@@>AA>@@>=@A?@@BDFDCBABDBA?ABACA=?>>@>@>A<>>@AAAB@BCADDBBCBACFHFHJLLJGFFB>A@A@?=:<@>@CCBDFBABACBC?EEBABFGFEEGFBADEEAAJFJRGCAAC@>>@CDDJHD@BIHKMIEGKMMMNICH[wlLEDJIJC;CPUSMIHDECCAB><9:?B><@DCAFCADBEBBGG@:@CBDEHHGGECEGHBDFFGGFDABDGIDDHMJJFLWTLEADFCCFIGIHE@DDFEGGFFGIHEHIIIBHJFFDFDDIKIHHLQKHIHDCLJEDFHFAEGBEKJCBEEIFGGEECDE@99EPMTXKRMEBAFSMADFBDFHG@ACAFFIHHHFGJHCADEEFHECCEDDBDEEDEDACDCEDAFGAGCAEFCEFCBCDDCCA@ABBBBCFD@GYZD@BB@BDFB?=?ABBFD?BD@=>@>?BFCEHIJNKGGHHHIHJIHJE>C@?A?=<;;9;;:<=@AA@@CB>>@@A??>@GAB>:<=<;==99<@CAA>?>>AAA?B@=@A>=ADDD?>@A@@EC@A@?@@>>>=<@??=>;>@?AA?ABABCAABBBAGIGHIIEDFCDE?@@>=<==?B=>CCABA?@@=ADACCCDB?BDDAAFHEDHGCCGIDILEBA>@@=AEDDHKKLECHKMIGEBBHNKLOHFIXTKDCILMSOQah`SIFBBBB@G;696:JTIADCDGEACACAAGFA;CGCAAEIEDDFFKKFC@>GSHADBEHKIKMMNPKMVSE?FFBCBDGDFNE@>>ELHENQGCIJJJIJGHHHCEJE@DGFIKMMGEOPB?DFGIJHDFGCBCEICBBCGHDCEEBDIC:9BONVjQWXB=?JPE>?@ACDEE>>ABCHJIGGFFHHDBFGDDFDEEEDGFCDEBCCADEECFDDEADGDCBCEEC@>DKJNE??EECAFNDAC@AD@=<;<>=<=<::?><:;9:=;<=98B@>?@?BA@CC=>AAB@CDB?@@A>@BA@AA??A>>>><>==>?==BA@BCABBAA@BB@AAEEGCCDCDDACFCBB?><@=A@>?@BA@@@AB@?>?BBC@@ABDBDEEFEEGDACLKFDEEDGECCDHGA?FLIKFBBFEIGEA?CJOKKNIDBHJEGT__hcYdoePCDCAB@CD=5777CSN@?AECCA@@DABJA:>CCDD@BEDDCEBGJGCDCDQXKABBIJNOPKHNRNLID@EFBCA@DBFJIEBAGEDJNPJ@AJPMEDEGFHDDFECACFJMKJKRNVHHEKNKONGGE@@BCB@CCCEEDA?@ADGC;6@MOPaMNOC>AD>>LLCAB?=?>=>BDFIHEGFDFJFCFCABDCFGCEFFCED@BBABEEBDFDBFAEFA@BBBB@<@GHMEACCCBADE<7<=;ABBD@=AECCB@??LMHNKHMNJHGFHJHHHIIH?>DB><==?=?>@>?=>BCFC>;9;=:<=:;9=<=<;=<<<;98:;>ADBB?B@A@@BA?>@A???CDB@?????@B@A?>A?>>><><>@>>><>ABCEEBBBADBCBCC>>BEGIKHDDCFEBBCHJGFDBEEEECCHKLKDIDHFDDDEGEDGHDGNKJKLC@HECH]ikupX_qeNBFCCBBDD@757:?DC@BDCBCA@CDBCF=7@GDEEABDDEFGGFEFDGHFJSNDBDLKONMKEJONJDBDEEDDC@@EGGLFGCE?EKJJKKF@GICA?ABA?BCDFDADIJHIR]MVPJKKPNNMIB@DDBCA?BEDEDFE<@EFHHB?EIJGGFDDIELK>BFFIIGJIFFHFDEBACCEEGDDC@BECABBBCCCFCCEDFGCCCBCDBFLHB::>ADDBD>B@;9:;BCFGD?@@>B@AA@CFKGDD@?AMNHLJGKLJHFHIHHIGGIGA?DC@=<:??=;@>=A@=<=;<><:?=;:@=<=;==<<<=;9;?BBB@?@=?@BA@@?@B@>ADAAB>?@??BB>@?>@@??B?<;?<<=<@DBDFDEBCDDEEEEBBBDA;;>=A<=BEFKICB@ACAD@>?=>=DHJNKEDFGED@DMVKGBKMGDFEBCHON@IGEFHHEJONHJMKKLKFFHCGEC@FVklkeSR\UKGFADEDBDC=;=BDD>@JIDBDCBCDAAB98BGFIGCEEBEGJKEEGFFFGGDDFCGMOQLLMJJKJHDCCCDBEJD?EEDIBDDDEGFEGKRM@@B?=>BFK?AEBDFDADJKIMTTRQGJHJMKGFDCFFEE@?AEFBBCEA@DDFIJKHDDBCFCBHGQVEBGGGEA<;;<=ADDGHIIIIFEGGEFEBDDCCGDBFBCFEAACCEDBEFEDEBEEEDCEFCIQLC=>?CEABGBCC?====@BGN@ECHFB@>IHCHKDDECKHBDDAEEGGJJHHJLJHIGGIIHIIKE?B?><::<=:;>=;???<;;<==>=;=>>>==><;<;==<=>====B?A?A?=A@??CC>?A?>?@ACB?AB?BB>??>??A@=B@;>==?==>><@EHLLGEFHFGHJS^KFBNOIFEEACDCF?EB>AFFDENVNJNPOMLFHFHJGCFKSNEJECEFB>DKKHLTSOMIGEILHFEFFCCDCBBEFB>ADD?@?>BHIGDCBGEE@B@ESKIIGGHHA;=?CFDDFHIFEEBCEGFCDCED@CHFADEEFFCBEFEED@HKDAFCEGDBCDEEDDBBDBGGDAFDCA@>=>>?AHRFDFIC?@BMKEOQGDCDEEBFFFCFIEEIGGKLJHIFIJIHJJIE@?:<=:::;::><>@A><=;;>>=><<=>:;<<:<<:==;<==<<=?A@>@A>@@==BB?@@<:<=?BC@AC@BB=>>?>>B?;>>:?>=?=>=AA?@@?AEC@C>AEFBEGEFGDBCEEFC>;A?A?>@BEB>?@@A?=CC?=BA>ABCHKHGFDEEINFKKBGCELICBC?AD?BC@=>?BBCCENOIKOLJNNJDKGFD@CEFCDGFBDGFHHBACB>CD@CFC@BA?BA@CEFAGD@AC;>CFD@BDDFHFHIFHJEFH??EB@HOLKNJGPMIIJC@EDCDDDEDACEFFCIFFGDDAAJIEIIHGGFBCEGNQPHDDDE@:?IKHITXMHFEFIGGGEECAACCBCCCADFBADA@DFFHG??DCCBE>CLM?AGFHJC=CCGGGEEIGDCCAAAEHFCCCB@DIHBCACFFBCGEDHF@GFCBFDCDECBCEEBBDECAFGDBC@BCEB@A??@DJHAFEC@BFIGIIHIFACFEBFD@BDEFEGGHIJJIIHGHEHJGFFA=<><89;<<>A?>AA@B?>A@@BA@AA?<?A?BCAAB=>@?=>A?>@><>A=<@==>A>>??@AA?BCB@AA@DFCGHGGFFEEFDEB?9<==?>=BHE@BB@B@<>C?=CA>CACIIFFGDBDGG>?;=DB=@DEGLMDIPGBEEEHGEEECGLKIIFIOMILEA@AB?BBAEEBBEE@AGIFGBBEOKCFHHIIFFHECDKZXKGFABD@=AHGHNXKFKECHGEFC?@EC?CC@DDCCFBADEEIICEHDBCEEGEBNMI?@EEEGDAEEBCIFCEFECB?=@DEFC@ACBCGDBAADFFDDDBBDDCDGCCFDCCEBFE@CE@>CFCAGEECBBAFEAAB@ADFFGFGCCEGHGRQHEFA?IHBBBCA@CBCHHHIFEGHFFJFGJFFG>=@A=89<<@>@@??@?=;;;;;<<;<:9<<>>=9:;<>;:==>=>BCC@CBAA@BCB@CDABA???=A@CAAA@@?A@?@>?@@>?>?>?A@@=@CBBBCBBBADAEGJIGJJHIHGFEED@;>?@A?EFFB@BCECA@>C?CBDCBBGIGGGFGGFFDD<CFFBDEFKLKLJEDFFAHGDAECBDEEEDFHGCCEFFEDEFDDFEBBBBDEDFFEBBBBC=?GEDECDJTP>FIF?BDCNPIHMIEHJLJDMNFDHC=CCCDCCGHFEBABBCCGDD@@FVM@EJIGIIHHHFNY[_SRNBBFD@?BGKJMQMKHJJHEFEDEFGHC>AECEBGECB@FIFFIKHDEFFECBLM??BB?@CGIFFHHGGHGGHGGFIGGH==>?=;;;;?>==@=>@<:;9;=;<<;<<><==<;==?>=AA?>==ABCCCAACAABBADC@AA@??>B@A@AA@A>@A@>=?@>=>?=>A?=@??BA>?BAACACAAAB@DIKJIJKHHHGGFEEC@ABCCDGJIB>BED@AA?@@BBEGBGIHHIIFGIGGFHACEDHGDFIEEEJK@EC@BGDAGHHCCEIJFGLKEDGHBDCADIGDBDHHDEIHEECBFGEDCDCCGDABBDECCFDBBC@@>CABGCFGACDBBDDCFDECBADCBDBBFHEFHIDGRW^RQXOHEAEFA;AKKKQOKFFGFHHFEEDDIEAB?DDAKFGGBDHHJKLLABHFCC@AHCAAFHCCGECEBEGJFDHIFEB@CIJECDHGFBBGGB@DJJKE?EGDGIIIFGIKKDJFHECHGFDDGDILTYEFJFFHEDFHLMLLIFAA?B9;gycNFEB=>A?:@>=@AEGHIHHJJIIIIFFFJIIG?==<;:;;<;=<=>>=@=::;<<=?=<>???>>@A>@C>>B?=>=>@BCA@BABE@?BBABB>>A?>AC>AA@AA?@A?=>?>@?=>@?=?@==@@@B@=?BACBA@?@??DHGHHEHIDFIGDFDBB><@DEACEDDGFCBA@A>?@BBBCBDIHFHGEFFGEIGHIIC@BHFDECCEACEAGJBCCFFGCAFCAGGBDDHGBCGBDGHBCGDCECDICBCABBCDABEDGD?@A@?DFEFFE@@><;AEDDCEEBCDFE@DDFBMODEEGKJJLHBHJBABBCC?BEECBACGDBBEEB@FG?BG?=CCADD@CGGGIAEONUb\TOE?DI?:@FFGIIDHEAHLFCE@>A@?AABABDDKIEGGHOMECD@EGFC@EF@=@BABADGC@AFJGFEDEADEDDFGCACCDCBGDHGDEBCHICAGGCFIGCFEEKHEDFGJNJCEGHCDDAJJHIMJLQOJHINMGC?=;>BA=@JGDECA>>@==<:>?=@GGFIHEEHIHGEFFGFHJ?>=><98;=9<;=?@@@===?A=B?>A>=A@=??=?DB?@CBAD@?BDABB=>AA@AC?BC?@A>??@>?@==@B?=?>;@?>AA?@BBBC@?>>>@DIGIJFGIFDGFFEEB?B>>CFDA@DGGDAA=9?BBBBFCDFGHHFEFFGFIJKJGGIE?@DGFDBCDB@FHOLBBACCDFGCBACDBEEGFGFIBBGNFBGB?FEAFFECDE?ABCACCDCBCCEDCKLKKJ?>D:6AGDDFEDBCFGE@EFFFIFFIGEHJJKJGHMICFDC@ADBCGDDGDCECCFGFIF=DG@:@EEGNIEHEELJDDC?ACDCBC=?CFDBCCFJGFJEED?AABBGIC?DD?ABBFDBAGTPBGCB=?ACDCDD@BCBCAHFBEA@BFDEEBCDEDEEFFFEEEGEHMSSKGFHKEEKGJMJKHFSv}UAOIAID>>BDBA@AEDB?>?>@@<>>8;@B@FGEEFFGJHGJICEHGFJ@;@?=<<<::;;<@@?>><@?=@@>?>>@@A?CBBAA@BCC@><<@A@ABCACADCA@?>=>=>==>?@>=>>>=;A>=A@>?ABABDAAB=ADEEHFGHGFFGFEHGDDCABCBFFA@CE@>B?:=BEEDCDEBFIFEEEDGGDHHGHGLHFEBADEDBHH@@EECBCDGGCACBAD@=CGHECEH@DCEFDGE=>ACBBGICAA@CCDDDC@CGECDFDJOIMIFAAD=9?FHCAACDCGECECAILKIEDHIIKMJGHJGDEE@CCADDCDBBDFFDBECECFCAAKMDEEBDCEICCGJJIGGLVOLLJHB@EEABE>;;;>DABGDACDACEDEDB@DEDBDEABFDFGDEFDFCBBFFGLPKGLOIJNJGBIFEE@TiXBBIGFKAAA@;>@AA@@?@CA<>;:<<>@BCGIFFHECDEEHIECHJB>=??9:<<9;===@?>CB>>=====9=?==>?;B==A>>AA?>?D?@BBADB>AE=@B?>@>>@@;=@>=?@>>@A?AC?BCABEA?ADBCGGGKHFIGEEFFEFB@CHDDEEDBAAADDBBAAEDCCFCDLJFGEFIKHEFJELJGGHHEHKIMNJLME?EHAFJDAFF@DGADABEIE>DHBDDBCEHA;A@BICEEAAHGBBBAACDCECACGIILJFFG?@GC<@FDCIGGIGDHFCCIKJIIHIKEHLKIJKF@FGGGCCEEBADABDFCDEBCGCBCDBCF@@DA>GHFHHGEHJEHKJGK\QMKFDHF?AECPNEGGFJLECDEBDEBDDFIEEFCDEDEFAGLFDIFBDEABCABC@A@>>>BAAFB@ED@>@A@AEEFDEEFFCCHECCAHMFAFHFBOGEFFHGFDGKJHJLKJNIJDBDIHBGHEDCJOFDFIKGFA==>C@>>=>AA>@B@@@==<<;=>=>::=:;;<>><=?=;<=<:;=;====@?=?=>A@=>BA>BABEBDBAB@A@=?A??A@ABA@BBA@A@>@>?@?@=>>?>>@>?AAB@A@AA>=>>=ACEGHGEEGGFFEEDFBDDCBEACGEBBBACDDDDGBACDDEGEEGFGLMJEFHLIFIHIGEFHIJKNNLFIAFELE=ADBAEGCCFFHFFFDEFFB@CAEG?<=BHGFFAACEDDBBAACEGEBFFFGJEDEE>BGC=AGDFIFGFEDKIDEFFGBDILQNFGJJFDDCCDFFBCEEA?DD@AFDDBADA@BJOHDB@GCCHKJCDBEJIDGXYEIIHDBDHAAFLGFKHCHMDDECBEAAACBDC@DHIHHGDGHIEHFDSLDDCBABCAAD>><@<=CBADBBGEBCCBDFDDDIEDFJFEEDFFDBFEFORGGGGJLJILLJIEEFIMIHA>CJDCFFCCDDDBEFIHEC?=<>A@@?@AB=@>>;>>=?BB>==;=>;9;<;<<<=>?>@@>>AA>AC@@EFDDCDECACD@?BB=@DA@CBCECABB@@@??@A=>@?>A>>AA?@A@ADB?@?>>>>=>?ACHHFJIFGFDEGDDIECEFECDDCCCDEDCCD?BEE>DGFHJECIIEJNKFIIMIJIKKFGLKILKJMIDCCBCKLAGGC@@EEFEEDFIFEEBFB@BBHJB99CDEEEEEBHFEECFDACGGA><@KF@BEE@DHB;@FEGJFJGEDGFEHFDGEDIJLMHEFFFDCHDEDDEDFEACDB@DFECFDFEFFJIFEC@A@AECADIIHCCACGIHKPMPQICDCDGEDHKJFJMHJKEHFDCFACCECBEB@EFFGFDEGIIHFEJOMEACCCECEGEDA>::?=@@@DHECFFEEGHDFGEFGGHFDFFB@EHIJVQMKJHILMIGHIIGCCJKHHGBDIPLFEDEFBGMGIGCCA@>=AA?@@>>A<@CC?B>>>CD@>=;@FEEFEEGECDFFFHHIJG>===;<<:;<;<=??ABB>;=;;<97<:;;;=@?@?>?>?@?@AB@CEEDEEDFFBBB@BBBEEDBCCBCDBAB@?A@=?A>?@?>@@>A?@@>?>AB>>?@=??>?AA@@EEHKJIIJHIFECFDDDCCEDCEC@CEDFEDCFFABEFEFECFKKIKMJIFHKKKJLHHIMPOOMMLIJBBCAEVHNL@?BBDGDEEFHHJECCEBACEGF@CFDGGCFIDCEFGJGDJOJGJJIGBACDDBHDDDEFGEHMIC@CEDECDEHEO[VGBFIGABEDDDFFFGFCFDLMFLLHQNCBDDADHFHNMHJLIGFFHFBCEEDFIE=CFACEDCGFBGEFFHG@KMFEFDDEBECEA@@:=E?@B@EHEEGFFFGHDFECHIHHJIGIIGILNJNKJJKGEHJHCFLJHEEIHDFFFEGQMGHHEDEHKEIEDB>?=>AA??A>=AACDEBCB@AEECA?BFFFEFFEFECEFFEIGGGE>=>>;=<==:<;@=@BBB?=;;::;;<<7:;=@@AAA@@@AB@@>BBABEBDEDFGEDDDDCDDCBDACDBBABAAA@@@@>>B@@B@A@A>???>@C?>>>A@?AAAAAABFJJIJKIHGEDCDAEACCCDDDEEDCBDFGFBFPJGEFGEDGJKJIJIHGDKFKKJHLMHJLNPNLGLHGEA@JIHIGBBBADDBEEGHFHEFGGD@CDEHCCDDEAGHECDEFEIIFFCBA:99CGDEE<@B>>AABGHFGIHBFEDIIFCJOJIJFDE@AECDGHEDEEFFBELIGCDBBFB@FFBL\YKDBDB@FEGEEDEDEDHTLKKDGJKJF@FGACFFFFJLLIFGFCFGHCEFFCFFC<>EDDFBBEEGGFIKFFEDDECBCBCDC@A>@@=BFBCC@DGFFEEDDDEFGEHNJGILLJJKMLJILJECHGHDFHHHHIGDDFCECFAFFGFFFGIDAFEDDHIEA?=<>?>?A@=AFECDFEFGEDFDFGFGHGD=:<<;=<>????=<;;:76:<<9::9>B@?@>?A@@A?=@>AFFEEGGGEDGGECDFFFCCBDCCBBB?@A?>>><<@B?BA?A@<>@<<=@?>=A?>BBAGIIJKJIHHFDGBAECBBGEBEDBDCAEIBDEMZLKDEIFCFIIKNLJGJEKFINLGKIEEINMMNDEHBBFJCCCFLIC?=@EEFFCHEFJLCDGB?CFFCAACFBFFBCGDBBEFCCFD=777?HF@@;>@@FIFDGHGKFCHGDINLIMIAFJEEHHHFHCBEFEC@@BFGCDABGCBBDJGSUJHMGAJMEJGCEF@BAFPJEHFEHIJIDEMKFGCFHFJNJEFHCEHDGIGCBIDBBABEECFKFGKHGJMGEFAABAABCBDGAAAA?@?ECCBBCEECFFBCEEGKHMOJFIKGDGGFFDGWLFFEFFEGGEIHBEFDD@DFEBCFEFEEDFGEDBDGHKE?@>=?>>@B@<=@CDECDBBBDD@A@?<;=;==>@A?>?@>;;:9869::8=;8;@C?>@??@@AAA??AFGFEEIHFFHHEFFFGEBABCBBBBBA?@B?=?=>=A@@@>=??@@?>@DC;:==>>>@?@?A@FIIHHHGFFFCEABBECCEEDDDCFJHDFACDKWNMLGFDBDJKINNKIHEIJKOMIIEDGIJJLIB>BFA?IECDCGFCBA@BFGGEFFKHJFBEC?DFBBDCDDEDDDDEEE@ADBHOD8678;GE>=@D@?<;??AHFBDFHEEFFECMQJHKFENPJEHDEBEBHHGC@A==CBADCEGDF@ESIKKFKOHFLIEGEBEE?@@@ABEHBENGHJGFLIBFDCFFGJLJFEEDFCIHGCEJECDFBDFCKPHGJHCFMKGCBBABCBACCFCA@BABAEA@EDBEHKKGGJJLGKMKIGFEHE?BCACBG]NFECHDFGDBDEEFGEBDEHDA@FDEEHECGHD@BEFFF=>?;@A@@A?<CECDC>@DEBECFFGDEHG>=<>?=;;<<=B@?CBBBAEGKKJILLJGFGIIFGGDEABCCBD@B@@A?@?>?@@>CAB=A?>?@?==CE<:<=>=>AC>=?=CJIGHGFFDCCBCCBDDFDDDFCDNPJCHFFEHNLHIHDDDBHMJMMJHFFHKHMLHIGEGIIIJHC>HMD;@EGA=ACBEDCFLHFIIGJHFHFCDEDGGCGDBCFCFHFDHJCEHHPQB76888DEA=AAB><===@DEFEDHDEIDCCIPKECFLPQHCBAAAB@KJC@AC<=MM?BFGEDFCHOIDDFHECHFACAC@EHBAA>>><:<>;?BCBCA<<=9;<79898:<:>BA?BAADBBBBCBBGIKNMLNMJHEFIJHFGEDBDABDDACA@@@@>>@>B@AAC?@@?>??=@?CB=<==CIKJHHGEFDCACACCCECCDJLFFLHAHFFFEFDHEEEDCBELJJLIGIGGKEIJIJHFGKLHHHFAJHB?@DGADA?DDBBGKGFDGFDIEGFBFGDHIDEDACFGIHHFHIEHOPOMB78878?FC?B@A@<==<>BDEEHIJHHCBDIOOHELRNJD@>C@@CDFGBDFD>@SWA?EFDCEDGKHCKMGEHHGE@@GCKJFDD>;CIH?=IQQEEFHLGH@BFGEEILIFC@GGFHGEECEFEGIHIFBFGIHIHFC=DJGDAECAFC@GA=>BHKBBEGLKJLJHKKKJKGFDC@DDCCDGJGCCCFC@CE@DGDDFDEGGEFHGFECFEEFDEDDDDDEFFDCDDD??=@ABCAACDC?@CCDAD@A?ABBB@@BCCCEFGDDDGHHGHGEFHG>?=;==???>ABB@=<;;;:8997;<;;AC?ACBDECDEBBCBILONMMLIGGEFIFFGGBBECBDABCD@@C@?A?@@A@@@A?@B@>@@==?=;:;ABBA??=@>BGLKGGFDFB@BC@BCCBBBDILD?DDCFEADCAAHFCCDDDGIIIKHFHEGIEHJIJIFFIKIFGFCAA?CEDE@FA>ED???CDCFDGIEDEHLONNMOQJEB@DC@ACFGCEHGDCFIGCACCFDGFEKFCHJFGHDDEACHHJEFECB@BHG=@NOHGIEPLHMIDEGGEEHGABAGHCFFEDFGCEHGDEFADHGHIJGLHFHHJMIDDHIFKGFEIHHJLJHKKDBCAELLFHHDAEADEDCCFFDEEDJC@EFAAEDBFGDGHEFFEBDEECDCABBCGDBDCBAEEA?D>AEGFFFDBAB@?ABBBB@AB@CC@@@AFEABGGBCCHIGFFGHEEG><>><>>=<=<>>>>?AB?;;;:<<8987;<;;@DCDECDGDDC@BB=GLONMMLHFHEFHDFGGCBFECDBCBB@AC?@A?@@ABA??@A@??@?<=A@:9:ABC>AA@B>?EIGEGDCC??BB?ADEACCCEC?CE?EFEADDBCDDCBEEFJIJIIFGFEFGCHKGHJFACIIGJGDAADDGG@=AEDEFEFGIIFGGDDECAEDAKG@EGKIKF>=;8=A@<99789?D@B?DCA@?AA=AA=>DDHHCKNMMNNLJHEFA>FFDA=:@?BABFCJQC?AECCCGCFBAFB=CLIBBDCDHGCDDCEHD?DF?DVTGEFJUQNNOKJHEDBCFD@=EG@FECCKJCEFDBFH>AGBHMOLMQKFISUKCGKJLJKILKJFDFFDHEA?9;AJKHBACDC@EFBBFHGFCFHGDFFDDCEDCBDDEGEDEECFBGFFDBDBAFDABBCBBDDDC?AGEEDA@ACB>>>A=ABGABGGACABCBDBBHDAFACEGCFGGGHF><<=;>@<=?@?@AA????=<:;=979988:::ADBDFCBDA????A?DLMNMOLHGGEFHFFGGBBGDDEDCBA@AEB@DCBDEA@???C@=?A><@D@:<>>CBAEDBDA@EGEEFDACB@?A@AEFCBCCEC?BEDCCGBCDD@DEEDDCGKIJIJIHGFEGFGLKHIGAAGHEJIDIJD@EHCEEFF@>AGHB@AFGDEGIIDDGCAEFCCEAHLDDIHHLF;79;::;;<;888=CBDBDEA>ACA@@=7>DD>@B>>@@AB?GTKEEGCCADBCABCDCCJMEDECBEDCDFFFNG<@DDFCBA>=>HJHEBCDBBAEA?FGDBBCDEDCFDACAB@CFDDEABGGFEIDCEA@HFCEFDCCBBDIBC>ADFDAA?:9==;>B?BEFGFCDED>AC@AGEBDDCCACDFDDFGEDG=>><<@C>@BBA@@@@@@DB<;;99:9;9:9:;@CAA?@C@??A?@AACNMNPPMJIHFGEDEFBAAGFHGEFEEFEFGFHEHHFD@??@B@@@??@?BF??B@BBEECBD@BGGFFEDDFCAD@CAGDEEDDFCCFDEDFLECDDBEGDDCCEFHJMMLKFFEGIKPOJKGBDHGEGHDLNAGBIKILJHB;@GHEDCFGFGKGEFFHGEFDCFE@JKCGLHHQI:89;@@>AA>9969CECCEFB@BBEE?>@@@DFEGCFHDEDBDDCDA=@EDBGD@@ACA>>CFCGJFBGECCEDAGHCFHFGGDCECBEEEDKGBBBFJOXWFCOUROKLKJILGCEGC?AACGGGEFEA?DGHDBFEBBEBFMQJGECKICGLJEEGCB@ACFDAFFD@AA@>;<>?A??AEFEABCBAAABDEDEGEADCEGFCDJHDDE??>=?BCBABB@@@BBDFDA<:;:==;=:<;::@BB@>@CAB@@BB@ACMPOOMJFEFEC@ABB??@GHJJHJHHJGEHHGDGGFFC??@???@>>?=BGBCAB@@@@>??=?GJHIGFHHFCFE@@EEDEDEGDCFFBCJMHCACFFFGHEBDEGJNKJHGJGJLLPRLJHFGGFGFFEBEGB@ABBEKKCDIBBAABEFIKGGGGGHHGFGEBEBCD@JMNPXI<;A=@BAEFCHMGB@=>BAABCB?>EFBCGDCC>BGFEDEDEKDFFEBGJHEFGFILHIBDCDIGDHDAEEGLMNIEQ^UYSNFINNJJJIHEA>=CBIFJFIKEDGGGHGBACEFGMMNJLGKIFJD?CCFCDBABFD=@ILLE>?EIECHNKJGGJJCACCDDEHIDBB@A@DHFHEBBEHHGECEHFHJGGJCAFGCEE@?DNQLGFABBCFGDC@?B?<>=?@>>AABBB?ECABAAEEEIEDFDADGFDFGGEGHB=>ACDDACDFEFIEEGCAA;89;;;;;89;;;?AA@AAAA@@>A@A@AIOKFGC@?A?=@??>A=@HLKOMIIGGHFDEFFEFEB@@=><<<@DB?=@>==>=<>=>FKIHJJHHGEDFC?CIECCCEB@DFDCIGFEFDDEEHIGCEHDHMIGEFFIJMELNKHHFFGFGHECB?BBECBAADEC@BGE?EDEGGGEEDDGFGIHGDDDDEGFDLHHKA:<=8;AAFNH?7:9=BEABEBEGDFFDABDABBBCAIKE@=?DDACCA@A==ABADDBCDCDGEA@DCEIECHDCEDEJKFDJMECCAGIDDFDBACHJIIJQURONNGDNTNJIHHIGA=>DDEEFEDGHDBCBCFECGGFFFEEHGDBFJJD=>ABTkKADDC?DIHHGCBEEDGEHEFDDJF@DEDCCBCECCDECBEEEDEDCBDIHEEEBDDCAIKFDHGD??DBIVOJHC>B?>EB>@ABBB?==>>>CDCBCA>@>?CDABCCBCDBEE@EGCAEBACCFEFFEFFFIGLHFIEBEDCA<87;<::;99<;:=>@CBAAA@A@AAB<@AHC@@A@@A?=@A;>B?>HIJMNKGHGGGEEEEFEFA>B?=>?===ADB88:=>EECFEADGFGIEHJE?AECAIJDBBACC<?BADGDAGD?IG@?BFEI?=CLIDBFIHFACJECFEDEFBCEBBHKIGKSUNNFLMGHKSLIIKJHID@FCDEIDGCBFIHHGFFEBDGFDAHGIIHBMQIFC@?AQWECE>CAFIHGECCCBDHFEFCIGGIGBEECADDCFFACDEDDBBEHDEECEFFFFGEEJIFJCIMI>DMIGKOKHBC@?DDEBBB@?>?>>A>BGGDBBA>??;=A>@ECBCHFGF@?CB?BDCDCHJIJIFFFHJNJGEDDDBCA<:9::99::9;:69;>ABCC@AAAA@BABCCB@A@?@@>>A>>AA>?FMNMJIIGFFFDEEDDFDA?>=>>@=<<<>?ACB?=;?>@?<==<:@IJJMKGHIFHEB@DCCIIFECBBCFBDFECEDEFEAEJGCDGIHJHFIEHJJHJNKFFDGPKEJD?ED@DDA>FD997;?ABCBADFDEFFHFMGCAEDEIHFC?@A?>BC>@EFCDC?AACDEGEEEEFDBFF>BCCCCDGGFF@CIECBFAAEDBD?>EIHIXZPTWPPJJIGEGGGILNHHGDGJIIJGEBEEECDHECFOPFJFFDDFFCPTLIDFOGEGBBBABBEIC@DB@CCBBBEBDDDHFCCDDDDBDEDDADEHADCCBCCED>@EGJHIHLFGCDAHIGC@ABBHHHLDC>?CEEC@B@<=>>?@<@FFDFECFE?>>@BBBCBANLILJFEHEINJGECCCFD><:879669659868<>AB@@A@@@C?@CAABB?@@=?AA@>@>EMKMLFGKGDFEDDEDBFB>>=:>ABA<=;>>;?><<>=?HLIKJEEHEFEDABGDCGFCBDABDBBEBBDFCEGBBGEADGGHKJHKIGHJJINKDFFBFHABA@HDABDF?=DECHKCBHGENNJFAACHDBFDGMGCBFDCCE@EEC@;9>BAA?<>>FB77:9AD@BHFFHFAEFCHDEFIIDGEEEFC?@BADHBCCEBEEEDDDHECBEGCCFEAFHDEGGCDCDDBCBBA@DEDKG?:BFCDDBC@=<=>?@ADC@?AAA@AC=;>=B@?CC@BMJLKIGEFHLMLJFBBEDDB:997959748889:;>@>=@A>A@@?BB@AA@@A@>?@>>>==>=>@FJKLKIIHDCEBDDCBEEB@>>=><<<<=;==>C<<<=;<>=====@GKIKLIIIIHEBBBCCDCAABAAA@BFB?CFB@EEBCCDEEEEILHGIGGFHJIIIEFIABFFDIHME>CDDB@B@?EGKJHCHKFIF@CHJDAEDEGDEDDEGFCBCCCE=6;>AB@<<;@=6:87=CGJFGLIFDCDECDBCGC@BJIB?;=CEGEFHHHECAA@BEDEJKFBDADGCCDD@CDCFGDACEBFC@ABAEFDDBAABFIEFR^`c^JILKURFGMLIIKGGJGGJKFCIECDCDHKIIFIMKIHCEGJLIDCKTOJEBDDABB@DIGHHHFFJIHGEKID@CEBBDB?ABAEGDBFBCACCECCHJGEEECCDBADCACEAEFEAABBDFNQF=>HD>=;=@A=?A;;><=ABBEEFDC>;?@>@CBADNLLKJEEFGLNMHFFBBEFC;:;:868977:98:<>AAA@?A@A@@BB?AAA@AA?AC?>A@>>@?=EKILMJIJHDFDEEFBCECA?><==>>>==@?BB@<9>><>>>>>>?EKIKKIHLHECAABDCDDABCE@@CBCBDCDBCDDEDBBDFCEGJHGHHKIIHIJIFGJHDFFHIHOGAIEDCAFFDIKMMLHFEIGIFHHHIECECEGDAACFGDBFFEF>779<<=<;:;;98;9@HLHHMNOKGDDIGHIKIGFGLLJE@FHJKJKFGKIFDDCDEACEFFDBCFED?BEDDFDEFECBCCDFHC@CEFFCBAABEGEGHV_cMIIJIMNKLMKKKKHFEHHHLGIQD@HFELOHDFFGHIJHFIIMHNalo\FGCCFCB@CDOICELPMKLJMHCCD>BC?ADB>CFBEGEADCCGFGDDBDGFEDA?AFBBDDDDBBEHGACDABGQPKABDB:=?BCBA@=<=>><:=A??ECFHEEC@>??@ACBACMMKKJIFDFMMLKIGDEECC?9:8767;87988:9<@A??>>>??AAA?AC??@?>?AA??AA@?=@CHJLKKIHFEFEDFFCDEBC?>>>>>>>>=@?@D@=??==??>?DHGKJHIKEEEB?DFCBBBBDE@CDB@FECEABDDEHHACFBCGJLIJJKJGEGGFFHHGFGILHEIIFHFCCGHECHRPEIIFIIDGGABGGHGEFKMAAC?FFDCJFEE<79989::8:;:88;@GLMLJHHJMNIGKJJLIJJLLNNMNKDEJIJNIEJJGEGDDFA>CGEEE?CC@ABCFFGCBCDEDECCFIDBFCCFEBDC@EHIOLOSQHIJMKIIKJIOOIHEDCFDEHDJMFTQDELKCDFEFIMGHIMIVbagjbTGFEFGCD@>BIC?S_^TJJKJGCBD>AA<>GD?DFBCFDCEGDFIEAD@ABACC@>AD@ABDBDCDCJEAFDCDDHDIGEB@9?CCCDB@=<=>@A@@>=<=>ACA=<=?@BEB@ECFHCECC@>@@@AA@AOLKIHIEBDMLMLJGBABEE?9;87:779879:<=?AB?=>=@@=ABC@CB@@@BA??>ABAA@>?C=HKLNLJIFGGEEFEEDDDF?>>=?@@>=@?@@>>=@?=@@@?>?@ABHJIIIHJHCBEDAFFCCDDDBBBBDCCHFECEFDDEEGECDCGKKJIJLJEEEEEEFEEGEGIGFJKDDEEFGDAGIHNHCBCGLIDFGGKLJHEEHF?CGIIEEEGGEE=7;<;<999:::9<@FKLMOJFHGIJFJLHFJIMJKNLJIKICFKHFKHFEJKHGGFGHFBDHIG@BDCBDAEFDCCDCCDDDFCCEEDDCDFECBCFGKMLKLHJLILLMJJHHOMCADEDACEEBDHJ[TB@GIDGFGLKJFQ\dZT\VKECJRRFECDA@=B@?AY`XQHHGCBGFA=?@??@?>=@==>?BA@??BDDD?@FD?BDCB?>?A?=?AAOMKKKHFEFKKLMKHEECAEB89976789<>=???@@?>=><=>=ABBBCB@@@?>>?=?@?@??=@?FLMOOMIFFGDFGFFFFCE@>>=>??>>@?>>?=;><<@?>>??>=AGIJJJJIHEDDD@DGECCCABGFEDABIFFFGGDDBAECADEGKIIJHIHFFHGFHGFGFBBAFEFIBCGIDDE@FMJEIEB<>DGFCCCEGCEHDDACCJJHFDCEGGE?8:?=;989:::>@BFMNJKLJIJJFHLJFHIIIIKIJIHKFDJKHGIEABMOMLKIILLD?BIEFEGFACECDEFEDBABDECBEFBAFEBBFFCCEFILMLJMMMKNMMOOKMMEHICDCA>DDBCHEGKGCFLIFDCJICEcttbIU[[a^\TUGEDA;ACBABCRTKJIHFDCLYB?@?>B>>A=?;;<=AAA@@BAA@<>FC>ACAAA>>@???@BPOMMJFDEEHKMKJHCDDACC88:;7<>?@@AB@A@==>@=>>=@A@A??B@>?@=>@>==?>?><=>GNONONIFDFDEFFFFHCC?>>>>>>@@?>?=A?<<<=;==<=@?=@FJILKIHHDFBA@CFCCCAACDBEC@CFCDEEEDBACCBCCCEIIFJHDEGFHHGIIGHEDECKB@C@EGFAIMBAIQEBBEKKHBEA:EJGDDFDIHEEEFFGEE@79?<=:788;:>BCKLJILMIGIIGOIFGKJHEJKHMJFLICFLGHLGAHOKKOKIJIGEA??CGFA@CDFCEGGDBCBDCDBDFBCDEDB@EJFCFJLNMMLLKNNMNT\UMPIDRM@A?A;@BAAEBAIPKFIHFCBEGEDW]TFCdhbmidXLGHHA<@EBCDCTYIBGGHIHP`DABBBCCDABGFDFABGGA@AACB?CFA?CEE@BEAAABEEBECCEFFECDCBC>:;<=>?@=B@=;::;@B?ABA@?>=>>@ABA@AB@>>;=A>@CNMNKHDFCBGKKLIFDCCCDC><@A?BCCABCA@?@@A?>><>?=>@@>??=@?<>>>==@==>FNMLLMKFFGGGGEEEDEDA>>>=>@???=?>BB>;=>;<<<<>>=@EIGIHIGHDDCC@CFDBABCE@@?ADBBBDDFAABBEDDDCCEIIHJKGFEEDGGGHHLIFGIKDEGFJJFFKMFCEGGCDFKKIILLFEFHKOJHJHJHHJLLNKGGECBIHJPLHKOKHIJJIGFEEE=@GF>ADEEEFEGFCEEDCCDDEBEECEHGGKKJKKLGGJIJNQOKR[]SMIHOLBFA>?>>@AAACBSXIHJFFC?ABDC?>@@IVQHILXeUIIEC>CCGEAACCACEA?@EC@CBBFDBCFDBBBCFBAF?=>@>=DEDE?:;=>=?AA@>=?;<=?BBAAA@?@AAB@AD?ADEC?@?=?@?BNMKJIDFECFLLLIIGCCCCEC@DC@ADB@CC@?>>AA>>BB>=><>>>>?@=>><>>>=====@>=ACLNNLLJEFFEDCCAA?@BC@>??>>?>=>==AC><>>=>=;;=<;@EHHGHHGFEDDCACFEB@@CCADA?ECDCDEDABEDDEFDDECIGGIHHGEEFHIHGIKICDGJHILKINPLDINDAACEAENMFFHHFHIGKLGIKFDFGFEFDFFEGIB98:>??ACABFOOHKLFEB?GHIEORVXac^``Y[]TNIC>=>?>BEGEEECEEEHHIGHDDELBACCFDCEA?C?DE@FCCD@@CDCBABBBCEHGEDDCDDEDDFDBCBCE=;?C?=DEEG?9:<>>?AA=>@=?CA@BA@@?EADDCDFDBB?>>@CBBNLKKHFEEDFLLKMLGDDBCEDCD@AADABAB?ABBB????@??>?A@<;>=<=>>?>>>@DKMMJGEABA@<>@>=?=@B@??B?=A@=?==?B>=>>==><;?@=?DHHIHFHGDDCBBCEDDC@CC@AFBCAEEFDCCDDDEFFGGDAGGFHGJGEFFGIIIIGIFFGNGGEGCJNLEIMBBBDFFFFHFELKMLKNNKIIGEDDHGDCEGFDDGH@9:;8<=88978?KKDHLLLLIJIEKNKHJNFFKOONKIPSLLLDDILLJKHGEGBEJDFGFFGACFBCEEDELMGNPGKILEFGLLNRNMLLNLHHEDBEFIIIIFNROKKGLRF?GGHGE??@A=CEHDAEPSDBCLTZaP\ca_][WY^]ZWOGFFBAFD@FECAADFEA?EFBGIB@?EA@BBDDB@CBBCDFEEAAEFABDA>?CADFADKEDFCBFEBEGCBDEBAA=??>=CDDC@<<>==<<<=??ABA>ACA?AD?=CCCGCCDCBAA??DA=ANKKKGDCDEDKJLMIHGD@@DDCCBCBBAAA@?BBABA>>?>;@?;>>>?@>==>=<>==?>@@@>ADDGEDCB@>=>=;>??<@=@A=??@>>@@>>>>?A?<=<<=<<<=?=>BDHGEHFFEDBCDBCEDBBDEAADDDCCGHFFFCBBDDDIGDFGGJLLIIEFFDDGJGILLOHIEFFHGFEDEFBADBEHEECHDDKKMKIIIGHKGIGFHEGEFGIB@EHA:?=:A@;::;<@KHIMGDJJKOJHJMHEHKEILMONLLLJGILE@KHJLKEIFFDHICFGGLKF?EBEFHFFFOPUXIOMLNMLMLNLJLLVRFJNIEDFDFJHGCHIKKKILNEDIIOPLFEC??=>AB@@NWKJGN]_`QJUba[QMPRUYZYPAEFGCBEC@EEBCCCCBBC@ED@C@BB<>BDA@DCB@EGCECACCFFDDC@BFDDCBHMDCDBBFDCGHCCDCC@=??B??>???=?><;@@CCCBB@@C@AB?ABBDDCDDAB?=>>=???====??>>@A>AA>B?ABDBB?@?@A>=?>==@=<@<=A?=??=?A@=?><==;=>;<><EGD?@FHIMGKMIEFBDLKEEHHGJGC@DBIDFEFFDA:6=>:?>:7?=CGNZSEHLWYOMTWYYLTd\UXVM?KFEFJGCDCBEEBBC@?C>BFBBCDBBC@?DEBDCABDECBIHBABCDA@CC@?EBINCCFECHECEGCACCDC?>>A=9=@@A==B@??B7;BDCFGDB@<>CB;@BACECBEDB@?<>C@=APNNNIFFDCGJNMKJHEDFEBEFDEDDCCEEA?B@AB>>?>=>?>?A>>?=?B@?ABA@@@@@B?@BBADA@@A?=A@>?@??>>>ACA>AA>@B?=?>?@A>>?<>>>>?=>@>@GHFGJFGFFDFD?DGFGHGEDGEGHJHJHFJIHJLJFHJFGFFFGGFJJKMKFCEGIJILVPCCEHIOOIAAFIFCCBEICFJOJNICJROKLIEEGJKCDFJCEEIKHE>79;9?>8:>9=KHEIKJFIKIKKLLKKJKKJKHFKMLLMKIMKIDFDGFBEHLIGDCGJGGHFFDEDELNNMMKKKJIMNIHGFGJGFGFCEIGGMMGGFBGGECDBBDJKJJKLNSNNPLKONE?@B?<:>CBCQ\GNIUbeZ[a[WLFGHNWREQNJGJDCBBBBEFDDDABEEFCAFKDECEGDDEEFCDD@DCGCGF?DD@CEBBBBDFEFEFCAFDBDEB@ACDCD>DHAA<=?=>?ABA??BCBEB>@CABDFFF><@?>=>@@CBCEFCCB@?ADFFDPONLKIDDFFHKKJJIFFGECEGGFEFCDECACDCEB?B>>?>=>@@>>>?@AA@@@@?A?>B@@?@ABBAACA??@@@?>=@==AA?B@AAAA@?<=?>?@=AAHSbPJKMWfUEVgP@Ueb`R?HLOJIUKCBGJDEJEACDCDGFKBEGGIIIDAEDCCCFBH?BGICABCCBEFDBBIFGCGBDBDCBDBAED@CDAA?ABB@=AB<;?BBA?@CEFBBAACDFILF@<8:=@?>CDFDGEFGEBB@?AB?OPNKIGFECFEIIJIHGDCCBFDGDBDDBDB@AECACB>;==>===?@:>@>@B?=@?=?A?AA?>@@?BA@ABA?>@?>A@A>?BA>=>=>A?@=><<><:=>===>CGEDHFGEEDACDGGGECDFEEDBGDFJIFEDBCDFEGIDFIFFEFECKGEEIOMFEGJIPVEFIJHHFBDSWE=@==AGJIKDHHKIHBBKMJMRMGORDEHAFGDIJID=<<:>B;@A>=>?AHNKMGEEGOGEIOHCUebXH>CGEGGEHEKOJEDFMJADADEADDECFHIGFC@BEEDABFC@GJBBDHFCEFBBFCCECFBEB@BBCDBADA?C@ABBA>A>=?@>@BAA@ABBEAB@BCEGGEE@;:9;B@=BIEEEB@ABB@CC>?@PMNNKDDGDEFIGKKFEFC@EGEDDCCCA@C?@DBCFE@;>==??;>>>9=@>AA<>B@=AA>@B>@A>@CB@@DB=A?;?@=?>?>@BAB@?@A?=?>@=?=><<<>>>>>=>@>CGGEEFBDJFFFEEJMHDGHCEDECDC@FFEEGFCDECGFCHHDEIHCHEDILQLBDHKMLJGJGGGEFHDFC;<@DEBEGCNHCHKHGJMKHFIPOIOOIEEH@BDEHFA:8=9;C>ACGIONMD@GLIFHMMDGKDDHJJMIIKNIFKJGLNIIED@DFFHKIJMMNPLJGJH@CEGCBDFHQSLHFGIIEKGIGIEHJIDJLFHGCFIEFEGCDGDCEFDCABJRLDNJGJKH@B>@C@=>BDGKDCFLGDGFDJULUjf[YSIECDAIHLHIPJCEIHCCECCDGFCG@CIGCBDCAEF?>FEEIJIEFEFHEABCBCCB@EA@A@?BCADECDEABCCABBE>==??@AAA?=@C>BE@@CFFJGEFC>?DBABAACE@ACABDCBCB>==MLMNKHFCFGDIKJEEECDCBDCA@ABADGCCGHDCJG><<;>@==@;>>?>@@?A@>>>=>BB@AAA=AC?@@?@?=>>??;@=<>>ABC?=??====>?>>>==>==<>=>A>>CDEHJJIHMHIECGJHECCCDIDFFEDAHCDDBABECGKEGLHFEHDHIFFGKNKGGIGFNNGNOOLOKICGIAAC?@BDIHMNPOJLGGGGGFIPRKONIKEDEFEEKHA<::9?A@EOLCADEIGDDJHOPQQLLVZPFIWHEIJFBFECDEDABDCACFDGDCEFEGFCBCEDECCEEDFKHBCECCC@?DEAACDAD?ACBBDDBCEDBCBEDB>?@=?>@@?ACB@@A?AB=@AEFGFDCB@ACBCCACEA@BAD@CCCEC@ABMMMNNJGDDEEIJJDDHHEEEBCFCCGHFEGEGIHEFIA=>?=A@;;??=??>AA=CB?@A@ABA>@B>>CC<@B?AC@>@??A=A@=?A@>=@B??>BF@>BCBGIHKOJIKJJGGDJLHDEEDHFEFDABGFDGHCDIECR[LKIEEHHGEGIHLJINLIIKKKKLIFEIMJDEF=@CCBIICFLLOSPMIIKHJHGMMKGILKLGCIHDFGHC<;8ADHJLGGLMLLLLHKFIJGGMKCDIKGIJFKKIKLLKNMMNOOOOKEJHCEGHIFIGCHFAB@BECAABC?DGFGIIKIFGJGDHLIIIFGIGEGHFFJIFGHGFFECDHDBBFGIDEJHACGECA=>B>?HG?>CHGHMKKKIHHE=DOUCMRPJIKHGDDHFDHFBFD@BHGCGHCEIGHIDCDFDEIDGIBDLLB@FC@B@?AHDBFECEEBCEDBCEBBDB?CGCB@=@?>?@>>DD@BA>ADA?BA@?A@?BA>CGEBFCEGBBFCBAEDADC@CELLMKKKFCDDDHKKHHJBDDBACDCFGHHHJFFIEEFE>?<=?>><==>?=>>A@?>?A>>A?A??A?<B>?@<<>>>@?>@@=@=?>CEFHIOPMHGHFDGIIKIHEFFGIGFHJHHIEDFCBEFHDEBADDDEGDDBA?>=9=CCIKSYOHGGMRSLKACGJIFGJLIHHDEIGHFBBEGCEJHEFFGHHGFEFDIFEGICEGEACEAAC??ADABCCBCCCECAA@CCADA?ADA@>??=<@?@?@<>C@=?@@FGGFFDDFAACA?BDCA@>AC@NLLMLJHECCDHKLJIHEECEEDFEEFJHGMFDJEBIGC??=???<<><>@;>B@=A@@AA@?==><@<<=D??A@>DFBBFC@CBBCDB@EIGIIIJMKGHHGHHEHIJGDFGDCBEDDEEDEIGDBGEBEFBFFFGJJIKLLKNNLLIHGIECJJGHIHFJKKHELOLINKINLGGIGFLOKIKGHIMKGIHKMJBDLGDFBBFGHLLGEMLLNKGHMLEHNLJLJJMLILKJLKMOKKNNGGGKHFFGKMIDFHILNIJGD@DDADDACEDBCC??DECGFITPGHIGFJJHHIEBFEGHFGGIHJKFBDEEEHIDFHA@@CDDCCDB@==>?>?<@F??:=FGFNZWJGINQPMGF??BA?@@@@=><==>?AB@ADB=>@BEFGHGFDFDBCCBCCBB@>ACALKMMJJIFECDHLKKLIEDCDBFFFGGIKKJFHJEFGFC??=>?=<>>==@?>A?=AA>@B@BCA?A@<A@>AB??@A@??=<@CCCDCCB>CBBEFFDEEBACBCCCBBCDGHIKKLKHHGGIFFIHKGIGFEFCEDDFFEFHDDEDEADDCFFEEIHHKIKLLLHECFIKJJJGEFHIJILNIGNNLLNNJHJJILHFJJLKGIJGKFHKGHMMGEIHFGBEJJILKGINKKMKIHJJGMNLNQJLNKKOLLOMLPNMMGFFFJGEGIIMICDGMORLJHECDCDD@AEDBA@ACBCDDGDDKLFFJGHKGEDEDGIGHGGGFHHJKHEEFFEIJGHGD@AADECCEDA==>>>=;AC?A@BGHDHKHGHIIHGCFFFEFDACCAEHFFFECFBDEGBBBDGDFGEDCCBA@DCBAD@BDBACGCAE@@C@>>>=???@ABFEDBA@>@BBDGFGHEEGECDEDBA@AC@?CDIINKKLGDECADHHHKIEFDDCEDDEGHJKIIHHGDDCB?=<<<;??=@@?AB@=?A=?@@@B@A@<>=9:>?A>@?@??=<=ABB@?CFEEEC>@ABDEDCDCBBA?ABBCCA?BGEHIHHKJDFIHDCEFFEGEEEEBACEEEEFDCBEDBCBACEFCDFFGEDGGFAECBEIHGHHJIHHIKIGICEGJLOMLKGHJIGGJLIIIGFFDFFHIIHJKJFCGGFBDIGKIEEJGFJNLIIGKMMLMLKJKHJLLKKMLIKLKJDEFGGECCEEFHJLNQPPKHGAAEBDC>?DCBCA?@E@>DCBBACGGHGFA>C@=DIHGHFFEFFEIJGGGFEHIFGFCEDA?EDBDDA>;9;<<:;<;=?@>C@AAABBA@ACBABBA@@=?@AMH?=>@?=?@>ABACBAC>@CEDDCB@?ABA@CEEGECFEB@@AC@=>AB@@BAGLLMMMKGFFDEFGILKGHFCBBEFEFHJLKKJIGGFBEE?@AA@BA@AB@@C>>@>>BBA??@@@=<=>?>?>:=>@AED?@C?ACACC@>=?===::;<8:999=><@DCCGHAF\\AGHFCDDFFHEIMJKHCC?@@CF>>?@??@FGDDEEEECCHEEDDDFDDAAB@?>?@?>?ACBBA?AAAA@BAAA=<@;ALHC@=>@?ABADECECA@?DDEEDDEAADC?>ADFFDEDCB?AAAB@AB@AAABHLKNNOMIFDEEEFGJIIECDABFEDEFGHJIHGHFFFEDCFDDB@ABA>@?=@@>?@@@@=>A??@=;>?==?@A?BBEEDAABACB?@>=;@?>?A@EFDEDCBBCBABABADGGFFGIGFGHIJHDCEFFHJCFFCBCBBFHDEFADECBBAACCGGEGNPMOWZOLIGD@GIIJMMG@CKNMLMMOILGIIHNRLGLMIJONLJJLJHHEHJIKIGILMIGHMMIDFGMNPMLMMMLKHGIIJGKGBGGHJMNNOONHGNJGDGGIEFEFFHJKMLLPPKKLDBCFDADCCFCABBC@BDD@AACD@EIIE@>?BCBEGGDHJKIFFFHHIE@DGEEHGGFFGD=@=BC<<><:<<9;:79>>;=?@ABABC?;@MIFGDDFIFBGKKHB?@?=@CHDBDDBCDDAEEDFEGGEEBEBEDECCABBBBABAADBBFCBBDCBA@?A@=?A@@?A?@EBBBABDA?FHCCECABBAECFEGDBDCAABCFIBCBDBAC@?BCBBBABCCHKONLONKGCCDEFFIJIEDECDFDEGEGIJKHFHFFFCBFFDCAABA?>=??BB@B>=?B@AABBCA@@@BCEFEBCCDECBBDDB@=?BAACBABB@DEDDCCECCECCBCBBEEGGFGGHIJIHGDBDGHEHDDEECCCCFHHFFCDCBECCEGJOIGQYVPSXUOIJH?A???>=;;<=;;;879<::>@ABDA@C@@DGDBJGLECBANNGF@<@DB@EGCBAEHKLHEGGEFJEBBABCBBDCCA@AACCAC??ABBEDABC?>@?@@=<=>AA?A=AECABBAB;9DICC@DB@=?97:;:8=?BBCDA?BB@CDECIJGEEOLNLGIG@FNLFLIDGEFMMFFHILKFJHDFBCFDCCCC@ACCBABA?CBCBEF>@B?=>==AA=ACA?DG@CDCAEDBD?>IMEDDDCC>??DEEHFEFEEDEFEEFBDCBCCBDFGDCFFFDCHJMMMMKHDCDDDFFGIKHGDCCGGCGIEGJGHGFFFFDCDB@DEEHGEIGCDCBCAFADGHHKKIHHFEFD@CFBCDB@DBCCBBA?>@CEBCCBCC?BEDCDCDFEEBDDBACHGGIFIKJKJGGGEBDGFGDBEDCDFFB@DFFFCBDGFDIPPPTUNHGFCCDILFGDDEIJHJKGHLNNMIHFIEHFJGIIHIHFJMJIJNLIKLHKMKJKONMLKNNJMPJMIBFIIJMJJKLKFDDGPJIEIKJFB@HPPNMKKLLIKHKHGIEGJJJNMHIIEGIHFJGGBELJECBCCAABCBDFBCE?@ACEFGEDEEEDCDGEGONKIIGHHECDEBBCCBDFEEFDCDC?@>:;==:;;99:9:=BBB?>BC@>@?BDBCDBCC>=CDCCB@????AABCB@>?=>>@AAB@?>>BAEBCCBABCACFFJLDBEFEC??AEFEDAAACB>CAABEAAFCDDCDEEEFGECDBIHMMKJLJGEDEDGHFJJGGFCDGFDFGDGJFIEDJGFFDEGFIHEIFCGDAEEDEGIGHJIIKKGEEDDEFDEHDDCBBDBBDBBDBA@@CBCBBCB?BEDDEBBDFFADCCBAFGIKHJIIKJHGGFDEGDGACFFDEGECEEDFGEEFCECHLQOQYVLGHIFFLJILIHGIKLMMKKLNNMJIJIIHHKJMJKIKLNOLLMOLKLMKPPMLPONONLMMJJJGD?AFGHMPKGIFDCCDIRGHIGILKDBHONNNLMNMLKKJELLIGKIFIIGHGGIHFDIHGDHLNEADBACDDCDGHGEBCD>ADFEEGFADHCFGDJOMJIKJHHGDEEDEDFHDFEEGCEEBBD?<=<==:8:;<;=@BDEA?CB??=;=ABCA@@BHFCMRSOIIHK@HHDEHHHHJHFCBCDDA@EFDBCFEB?BDCBCCDFB?AAA>BECBE@ACBCDA>BD?BBB@EDDBCCACCAGIEEDDCD>@@ABCAAB@BFCBDD@BHCCCC@ACFGJIHIKKJIGDEDCFEGFECDCEDEECDFEEJGEEDDCHMSUSSQJCCEFHINMMSMDEIJMQLJNNMKINNMKKMKJMMKJPOJLNKNPLMOMKONMNMKNNKKNMIFGCAAACGJGGFFDBBCDFFFGIIFFJNLEEMPNNNNNNIKMLJJJGGJJEFIJKGEKKIGJF@EILNFBBEECEFABFIBDCADE?BFIHFFDDGFFFFBIKEHMIGGFEFGEDFDBFFCCGDBEDCEA;=?><=:8;>;=BAAEC?@BA==><@B?AB>ADFFIHBDLJEIDBFGABGECELIFD=<@DCACACDBAAAACBCCD?BBACF@?CC?>BA@CA@C>?CEABC@>CE?BFCDFC@EEDA?>@FDABDCBDCBCBABECBFBAEECFEBDECACELKKKKNLKJHFDEGKJKHFCACBDHHFEFEEHGFEDECCDAADEEIJHHGGGIGEHGGFIFFGEFDDEEHIFGJHFFBAFCABCBABB=>@=>AABAC?BFCBEDCEFCDCB>@@EHJGIKJKIFECABCFCHHCCFCDFEEBDFEILGFFFHGGELOOROGFIGGIGHNVVKECHKKNMMOONOONNMJONNMMMLLPPNNMMOLNNMOLMNLJJJKHHJKMJE>>E@@GJJHHFBCCACFECBEEIGFJJJGLLJNOLLNOFLNJJJGEJGGGEDHMKHKFGKJEEDCKLHA@DFFFDACECFECBDF?AHGFGFEHIFFIGEIKHEHJHEFEDEFGFFFHEGFFEECBDEEA>@==<;;>>>@?>@@=@B?>?>=???>BA?ABGJHFIPQMJD>CEGBCGEFEEBCC@ACEFCD@ECAB?>>>?ABDILF@DCCBEEC@BAABCCBB@>??BEAGCEBDFDBBEEEHEEECAB@?AECABEEDCEGDCCECABFCCCBDFEEFFDCFCKJKJJJKKJJGDCCJGGHGC@AAEFFDCDBCEACBCDDDGDEFCEGFEDDFFFFGJJHIKEEDCBAACEFFHGKGIC@@CDAAB??A@>=@>?@A@BA=>AAA@ADDDB@BAA?>HIJJIIFEGC?@>CCFFGGDBDCABFDADFCFIIJGGGGIGHFHIJFCEHIHKJILHD?A?AEHCHD?BCCB@JPBBBDFIIIFHIHLKONEEHJFKLIIFBCGCECGIHPUPJMJEDFB>@JMHC@@DHDBGABCBBCCADA>CGFHKIGHHDGFIIIEBEHBAABBBEFB@DADBDB?=<>CB?DC:;===;=;@?>>=<=@B@@?<;><>>@@=@=ENHCHQQJKF>=A?>AAAIECBA@@B>AD@@@==<<>>?AGBIJECDBABBCEGFBBD@@A>>AACCDBDEBCEECGBDCHGIFGDDCBBDDCCBBLFIIHJLKJJHEDGHIJHGIFACDCDCA@CEDEIIHFEDEBABAABDCBHGEGGHFIFHIFDCDEEFFEFFEEHEEEBBEB@ADCBCCA>@A>@B@CB@>CEDEBCGGDCAB?@BDHHFEFEBAA?=?BCBFDFBBDEBDFFDEDCHJJJKJDGHFIIHGJJHKOOMLIFJIGBDHJMKIJKKMRONQOMLJJJLNMMKJLMKHJJILJJNJIHILJIGDHJHFCAB@B@EGFEGGDCDDCGIACEDFMLMKJGFFFJKIIJIGJNKHJIHDADFEEFKMLQMDEHKGA@LOGA@BDEEBBECCDEBDBBCEAAIJHKLLFEJHJJIHHHEAGF>=>>=<<@FD@A@@AA=?A>?DC===@=@A>>=<<=<;@CCC?==?>BBA=?@ABCEFIKKNKBABCFFBBCACA><;@A@BDDIRLGFDCCCGGFEEHD89?IFFEAAA><:;@A??CDA?GD=@B@ADHEACDFGCEFCCC?>BDA@DECDDDFECEGDEIFEEGCCDDDEEDEDCLHIKLJLKFFIDDJHJKKHEFCBDCDIIEEGFC@DACBBACBBABABIIGGGFFFDFJGEGD?DGEFHFCFFBGJHDCDCCC?ADB@BD@DD?>AABCB=CFDEECCGGABBA?CBDFF@AD@>A@>@DCDIEEDBBEECGHECEGEGIGRJFEIJJLOLMOLIKLIHOKJNGABEHKLMNPPLMNNPRLKJFEEIGIJJJLKIKKKJLLKKJFMLJIIHHHHGAECECABJKGDCDFFFCCFBADGCIFGHMJIIFILKMMNGHNMCADGJKGDEHGHNOTRIBIJIAIEEDCBCEDGLKGCEBFGCAFCBA@AHLIHOLDIJLHMLGLF?GJ@9=<8;;:>BB>>@@DD?>?>@ED?@@=CEA<<=<<<:=A@?BA>?ACEAACB==GLLKILGGNID@@B@>@CDFLPPMKIMLHEEFEGKGEHD@@:7;9;<<@DEBAB?EH=8?ADEECCFECHGCCDEHC=@ED@CEBDGFFHDDFJGFHHFGECEGCCGFDEEKIILKLNKGFEDBFJILEDAB@B@>CGDAB@>>@@BBCCAA@A@@ACFGHBEFABDFHEHGCCFEEFFFEBBEDIJEDBABCAABBAB@>BA??@@AA@>@DEFECBCDBCB@AA@CDCBBAA@==>>>ACEFHFE?EGGIGDFFCCGFEEDEGFIJLMMOOMMMIMLJJLKB@BHKOPONPQLMLIHH@BCAQIDGFFKKJKNOOLJMJOMIKMOLKLHEGGCBBBED>CHGFEAEFDGFHJIKGJILEDEKGJOOPKEDDKKHMMFGIKGCCEFGGEFGHIKGHFILNSLCADEDGMNHFCBBEKEDD?=BC@DEAFJIHMINLMNKH@=FG??@=<;;69<<;@<@B@>?><>ACGB=AC@>:::89::;<<==<;=>=BC@<;;>AECAHIJNMICBDEDABBAAABEHHIHOMHFFGEFEFHIFEGD>><9;B;:A?@=::;;;?BB>?>>EHB?BAECBABFECGGDEFEFFB@AC@ADDBDECFEBGGIDGFDEFCCFECEFEEEIIKKLLKIFDADD@?BA>=><=@?@?=@D>>A==B??ADBEJDAEECEJIHHEFFEDGHEGHDADFFHGABDD>CC>@B?>BD>>DAAA?@B?AECABCC@BE@@AA>FFBAA>?A><>>=BGDEIEEGGHJKIGIGBFIEHHEEJGFIJJLMHCPVJKKGJMMHHIIJOMGKKHLNIFJJCEEAJDCDIJKMJKOPNNLKKOPIJNOKMOHFIGDD=BFA@JIEDIHFJIHKIGKOQIJLNJLLJNPLMOJGHJKHKIDEABDDCDEFGGDFEEDIDFJMMLLH@BC@BJJ@HDAEECFDB??CFGB>CIHGMRJLMNLJAA>@=;=BA<@EBGMJGGEEG@@@DEDECCF@@OMKIEEDGFDGIGFGGC@A9:;>;AD<@@::;::<<:;=:=<=@?=>AA@@@?@@?@BBACFFEEFEIFGFEEFDDCHGDGGCCGHDDHBDBBAC@AA@@A@@AAAA@A>>A>=<==AEEFLJJGHFFHIGHIFFGGHJIEFHFEFEFJKIILLHHHGLKHGFBEJKIHJIHHGEECDEFEDHDCFJJKJJKMNKNMLJJOMKLLKNMFFHEDBBCC=@JHEDKKGKKJMJJNMKKJFLMPNMOOMJHHJKILJHECCEEGEFDDJKIIGBCHKIJKHEDEEDCEECCDBFECHFEEDCDBAGJD=BHFFJIHJIIGB<>CCCEGC>@>>>=;;;:=:<>;:=<<>B?AC?<@DEGJHCDJFFJFIMCBGLGEFABDBQ\MMIFDCFEEGIHGIID@B88:9>C@<@A::=<==;::9:;BCDHJDDFB@@@DFFEFFCA?>?>@ADCACC?@DCAAFFCECCEFCCFCAEECBEBDDECBEA=@B><=<9<>>A@?@A=>BB@AB??@>?@CAAB?ABB>CFDEFGFEGFDECCDGEEFFGHGHJGDGIAAJCBDDAB@BCB@=BC>A@?>@@?B=CFFB?CCBDDBCDB?CFAABABA@>=BEEJILKLJJIHHJHIHFHGEDIIFFJGFGIGIKKLHEFGIGIJGFHGEHJHIIIJIHHF?@CCCBGGDGLJILLJLMIKPNKKOLNNNLNJDFHDCEDBD?>FJJGILJJKKLLLKLHJKNOMNLLLKDFIHLMKOGGIHHFGIEEHJKKLLGKKLNOPKEDFE?CFFHDCDDEEDEFIGCFGBBGJI@>DEGGDGJHEDFBACEFHKGDECCE?==@=<=?@DD>=>?AEABA<88899;<=>>>@C@=A>??>DGJKKNNMPPMKHIHFIEJMGEJPNLG?DEIWTSNHGCBEGJHGGGKKGEC:9:9@=::=@?>>=>?;:;;>>>ADIFECBA@A@AEFCCDDCC<:?@ADCABA@BECBBEFFHFDFFCCEDCDDECDA?>A>>@@??@><=>?@@>@A==@@??>>@?=??A@AB@?@@?CEDFGBBEFEFFCBFHFJFDEGGFFFFFFACJDBDBBCCBBC??DA=?A@>?@>@=BFDADECBEEBCECBCCBEEDHBADBDCFLHILJKIIJKJIJHFEFEEJIGIJFHKIHKJHIHFHIJJIJHHKIHIMKGGHJJHHIDADEDDDEEKPJFLNMPPKMOMKOMMOLLMLHGJHCEGBDDB=CHHFFJKMKIMNKKLKLPROLNJIKGGMMJLLLOHIKJHDEHGJMLIMRMKNNJJMOLHJHHBEIFDEEDDFCDEFGHGGFEEEIJEBACFJHGKIFDHECDDDGHDFJIHH?<;<;:<>==?@BDEAEFFJKKNQRQROLLIKLMKGHJEIFGFGMQMDAFGMMGOIGFEDGILJHHHKLJHD;;;;=;<8:@BA???>?>@BED>?BFDBBAACEC@GGDDEECD@=@A@BBABBBCGHFCFGHIHFFECDEDEEDBEEC==<<===>??>=<=>:;<9;<8899=>A>@A@???ADBCFCBEFHFDHEEIHHC??@CDCFFEEDDFGBCABBBA@@@@??<=>@>>=>=B?B=:===?>;>@;:;<@@?<<>=:<>>?@>?ADLLRQONLHHIFIMKIILJCDICHCGFKQLB@CHLMOHDHCCHGFGIIKMMKJLFD=8:9:9;=>=?BABC>@BDDFD?=>ACDCBCEDBBCEGGDCC@ACA=<>@ACB@EHGFBBFFEEDEDDFDCCDCCDCA>>==>>>>???>99;<;88998979=?=>==><==<>?@A@AAA?ADEFFGJIFFICFGDGJEC<=@AEGHGFHGHFHACCCB@>@@@@=?@===>:;?@==CCACDCBDD>>?BCFGIECIIGC@ACDBEGFJIGFGEFEBCEEFHHLMHGEGFFFHJIGGHGHJIHFGGGGIGLKHJCAHHGGGHEHFFHIIFCDGGIJIGDELOLOPLJMLMMNLIHGDCB@A@A=DKKKJGGIHIIJMNLKLNIJMJGHJIKLJKJIJJKOMMLMMNNKFJMMIHKIPORTTPOJIDFHHHIKKEBCABCABDHGE>ACFIILIDCA@DEJIKLHDCEEDDBAABA@>;?>?BA>;:<<::::=<<=?HD>::>?@?=<=ACGKLGJKJGLNIHJMLIJKGCFEJJHFIQJ?FKPSJJIGJECGHFEHGJOROGLJF>::<=<=CCABDBBD@AADBDG?=:>CEDBBDDA?CEFGCCD?CD?===>?AACHHFFACECDDDEEEDBCCCAEEBC==>>>=?>@???978=:8:8:;;:8<=<==<>====@>@???@@??BFGHGFHCDIDDEDGHEEBDECFIEDCFFHIKCCCBCA?AA?>==><=<;;;>A?=CA@DGE@AD@=BEDEEFFDGIHBAFDCEIGGHFFFEEHEBFIHGHILJEEFHFFHGIIHGFHJIHHHHGGHJHIIHGDFHJLGFJIGFIFIIGBGIKKJIDDGHLNNPPKLJNPOOKKKFDEAA@>?ILHGGEGJMMIHKMMLNNONPJGMMLLJKLKKKJJOKKQRMUXLKRMGJRTPONSTTRTKIHKIIKJMQKBEDACB@AABB?DCDKKOPFHEABHPMJLLGJLFDFFBCFE>?ADBAA??<:=>=>@?=>?=BHD;::>AED?>=AE@BA?CLPOQOKKPMILLMHJOHMGFHOLGFCAGRUQMIDKJDHGEJIGFHMSUPKLMJBACDGJEHKFBFGABBAACCDF?<;>BDFD@BC@?DFCEFBFBABA??BBA?BIJGHFDCFCFDDIGCEGFEFCBFCB>@=>=@??AAA?;:99;:9::<::6:=>><<=><;>?B>@@>>>=>;:;<<:=;;=@AB>>CFGDBEF@EGFFFGHHGIGDEEDDHJGFEEEEDEEEFFHHEFJIEDEEGFFFGGIJIHHIIHIHGDFGIGHHFHGHHJKGIIIFEFEFGGEHHJHFFDEGGHMKNKKNKPPOOOMIFA=AB=>DJIIHHEFJKKIGKLJMOMMNMHFPNMOLLNMJGEHNKIQWJMQLKSTLMRNKKLJPQWTIFHHHEGLMLGAAABCBA@ABBA@BCFGEGHGDE@FLMKLKKLJJFBEF@@AEC@@@??@@==>=<<@?9>@ADA@>:<=@ABDFEAFGFFFCCHOMOOJKKHIIILNLPIGEDDB@CECGX\MFEIHF@=CEHGFDEKQQOOLLNIFHFFIGA@B@CFDBCDADG@B><A@=<>CDCC@DDFEFEBDDDDDDEDCEFCCFDCD@?A@>@B?@ABB?=:89;::=88:86:??>=<=><<>?A?B???==<@C@=BGGEFHFEDFFGJJKIHJICADEFGHIHHDEGEEFGFGGGHIKJGGFFIGHHIHKJILKHIHJJHIFFHEIKHJHGGILIHJIIFJGHIIEEGGEEHGILKMMGHHGMLMNOMMMJFA@EB<>B?=@CFGGFCDEBCBCCGECDG@=?<87:98:::7:88:??<>==><>=>>@@??@>>>AEHGEHIIHFIFGIFGGFDFFFGHHFJJGGMKBEBBDECCCCDA<9:<:9;;<>=?B@ABFHDGGFEFFEEHGIHGKHB@DGEFIEEGFBGEEEIGFGGFHJHFFEEIGGJHIIJIJKHGGGHDHFGGIHJKIGGFHKJHLLHCMOIFHFCDD?BHHIHGJHFBFDFHJIJMMJIF?BD=<>><;CBCGFCBA=<@B??BBA?>@?<=DECDFDBEECHFFECECIQPMOMJIGIJMGIEMLIHDBAAFLKGGKFGIB?GFIHHA@DELTSSTPFGHFGGGDDC?AHJGJHCCBAAAAADCBDEDBCD@AACEGCCBC@@@<>CBABBABEFFCBBDGFCEDCFDCEFDDEE>@??>@??>>@?;89:88989:::;;>@==>=><<<>??A?>A>>@ACHHDGGEFGCEIHFGHEEHFGIGEFIFFFGJEEABBCCDEBEC;<;9<;<;>??@CDCCFEFHFHGGGKIGJIHFKJFFGKIHIHHGFDEDDGHFFGFGJKIHGDGGHHHFFJLHHIHIJIGHHGIJFGMJGEFFDHGCPWHDOQOGGEBFB>BFLMFHHEBCGEDDFDHOMGHC@F?=CJIJLLMMMGKLFGLKIMMLKJJIMMKNPJW[PLLNJJNLGMPXTTUONLIPTUZMNOJKHKLEGGFGGFFHFBDDDBDCBC@??BB@A??HLEEA@BFB?HGEHIJJC=<=?;<@@?ADADFHE@?==@A==@??<>BB?>CFFB?????AGDDCBFABHONLKJJGKMHGJHPLFFCFFBGKGHJHGEFDDEGHIFCBADHGFILIEDFCCD@CECBCFHHJEEELEEF@?><>AEFEEEB?EEGFCG@ADCB>@BCFDDCAADGCBFECDFCDFDDCDGGFDD<;>>=A?>A@AB<88:989>99<::<<==<=?>?B??A?>?ADFJIDJKFGFFHJFGGHFGFDEGFEGHEDIFHFC@BCACECCB=9;;:;<<:@=?DFCCGECGGFEFLLNHJIJGILFEMKGGIGFFFAEGCIIFFFFGKKEHIFGFLFIJFGMKGHIHHJHHNIGJHFGIGFFD@ACAHFCAFE?AB?@DB@FJIKKGIDCBGECFJFHMJFFDA>;@EKLIJLIHKHIMMJKMIHMKGJNLMMJJMLSZRJKJIFMMLNOSPUUPPQMOSMJMNKGJJKNFFGFDFGEHH@BCBAEC?BE@?BB>?B>@HGBAB>?BB>EFCCHHB?<8?>:?BD@DBCIKEBC?>@A=CEB>???B?=DGB>B@?<=DECFE@BECFHDDED@@@;@>>??@@@AAB>9;:89<;;:;8:8>==B@@B?>>@?DIJIHKIGJFFKHFFGFEGCCGFGGFGGFCEJFCCCBABCABB<:;99;<;==;@EGFFKICEGJIDOIFEIJJIKQJHIHJEDHJDCEEEEIHFHIIIJIHHFHKIIJJFFJJIJJGFIIHLKIHGJGKJIKD?BDEDD@?CEBEDBA?A@@CEJOMKIFGDGEEFFFINLHEEFA=@HKGJMJLLKFIJHJKJMMIJJKJNOLLMKIQXVNKOKKKMILMTTROORURNMOVUMNJIJKLHFEIJGFEIIBEE@AEA?DCCEECCFEBDEDCDB?ACA@>ADEGIIEBAB@?ACBFDAHLIEBABA=>AGID@<@AFDEFEDC@@AA=@ADCF>CDCACGILPMJNLQNJLJKKHCA>@DDGLNKGEB?AIGCGCDHGFGFEFFHID@?CFFDD?>>>ADEEFDAACEFFDECB???==?ADEEDIGDFCBBFDDGEEFB?DGCEHED;??@>?>???@?<8878998:77:98=@?<<;:;9;<=@=>>>=?>>@;67:999;9::=EKMJGEBCHKIABEEGGJIGJna>DIGCFML@GCDGGGHHFHHHIIIFFIGKKIGDGILLJHGIIGJIIHJKIIJIGHB?A@AB@AA?DB>@???=?A@EKLMIEFGHCGDCGIHKHBACC=@GGKNMKJEDEGGGGHIJMMIJGIKNLKKJKNLKKIKMKLNMLJMTOX]RMRSOKKPQLMMKNLLKEHEFFEHIIEA@@ABBBCFEBCEGCDEEIGFEBCFICAA?=@?EC>?=AFID@BC?=@@=<=<@BCABB@?CAAHPTMEFCDJGMIHEHC??BHKKHIMID=>NNCEHC@EHGFBAOiY@;==<=<;:;=@DDBDC@AA==>;:=?=@DDCBBABBEDAAAB=<=<;<@AAEHF?BFD@CDDBDEEFB?>ADFFDG<@@@A@>?@AAA?88988::9;9;::;=@><==>>>=>@A=@??BHHEGJJIHEFGGHFFFFHGGJHEEFDCE@@IEA@CDBCCBCB>8;;8:989<==BLQOGBDEDIID>BADEHFDE]iPBHFEGSTHDGIHHJJIIFFIIIHGFEHIFHLJHKKIHHJJIJIKIGKKIHIHFJEACBABAAC??BA@AB?<@@@AFS]XQEHDHBEJHIIJGECAA??EEFEDHHGIIHEGGEEGLMIHIMJKJLHIFIQQLMQMHIJJNLLTRPVSONQSMIQTPPMIIMNIHHGFHGGKIEDDDCDC@EKIHHFGGKNIHHJLHFFFELHAADDDGIJMKJJJJIGE@FIKKGC?=?>@DABA=?ED@@@>?D?:>>=>?=@@@>A@>ACBCGKOKCCILIIIEDIE@?DHGHHGLNFDLcXFDEFGEFIEGQ]p`;:<<>@BCBACAEC??=;<=>>>BECACDDCBDAAA>=<<<==>?@A?@;=DCBCECCFFEFD@=?DFFFDC><@AABA;7<:7;:79;;9=@A?>==>=;>>@A>@C?@FJIEGKIGJGEKJFJIFGFDFGGFFFFEFBKD>AABBBDDAB@87;:7<:;?PXIBFFHGBCC?AAEEHGCHVRGFFDGJGEFDFNKHJJGGJHEHLHDEEEGILMMKNOKHIIIJJHFKIHKJJJJGIIA?DA?BDBAC??BAB>BHB?EGIMSWIFAFECMJHLLHFC@?@?GLLJFOMHJJKIJIEGKKNMKJKLKOQNPKKNMJJLNJKMNMONURUYVMFDLRLLOMNNNJKJIGFGEIKHFHJFGKRKFMDJJMLIHIOMGJHGJHHGFEHIHDDGCCGGGILHKONMOLJJHHHD@CB9=AC?BB?BBA>@A?@A?BC;?BCABB>>>=>CGDDKKLOJJIMHGDBGHCEIHEFIHGOKHQbPFGDDJICBFR[^qa??=>C==>>9=ECEHFFEFC@@?><>==>ACCCABDDEBABE@@EC===:=A<=<9<>?AAEECDEEEDCBBD@DEB@===AB>>>?CE@;:9:;::;ABBFEDA@?;;<;?>=;@@;@>BA@=?GIIIHJMKHHGGFEDEFEBDGEFFEFEGHGJD>A?@>@A>?A?;69;:9:;=:??KRH@ACDBEEBBEA@EFDFHIFECADEHLGBHLLIFIEEHFEHIIIFEEGFHJMGKILLGDHJHEFHHHHJJHMJIGFBCGC@BABC>?AC@>@?@??BEKS\VIFDFAEFHIKIHHFDC?>HMIIJOOJMMGHGGKIFLPLIJLJJNLUVKKOMKLMIFMMLIEMTRQPRNHJJFHNPNNJJDJNMIDCKLHKICCDEOTTHNKFIJMHGHFFHHFFHFLJECEFGGFEBBEDDDFHFIKLHFFFDEFBBEB?AB><>=>>>BD>>@>=?@CGJIEDIFLNJFGA=JOGGIGEEILKICDOOIDEDEGFB?DPYbwkB?AGGEDCABC>??=<>=>BEBACCADEBACEBCGE?<:9;=;<967:;=CBECBFDCCAAACBF?;>;@?=BCBDEEFD?;@CAEIHIKIGFEA@BA<>==>@>?B?:;::;:7:=>@HGEDECCFCEDABDCCGIHFJHEDDEFIHDCGIJJECGHGIHFILLHEGEGIHLJIJMMEJIKGHHFHJHLLHKNKEDBBDF@ACEDCE@@DA>AC@AFGLQ_WMGGIFCCIKJMJCFJC=BJKOKJKLJMOJIKNJGHKONKJKLKLMNKKQQQROQRMLMKJHJQXYUSQIHGIIKPIIIMJJMMHFHJLJGJGIEGOQQLLKGFEKIEFGIIIFEEIKGGEDEDEIJCBCBCDFGCEFFGFDFEDBDDDDDABBAADEHIFGIGBA?=B@B@@?BDA??BCAAADFIBDDGGHJGCDDGLKGGGBALPLHBBFILDDFEGHEKIFRZc_F>D@??;>?:=?@FHDDADAED@=?>;;=CDG??B@BBDEFHFEFFA?>;;:;:;<9>?>AEGBADC@CB?=AC@=7<=<>BADEFEBDCDGFFDEFGJKHEFEAA@@===>=;=??=@?;:;:::9;==@FDEC@A@>CDDEEEEEEFFEGECDBEFDBCEDHJIHGEDIKKEINKIHFGJIJKJIMLJIJHGHHEGIIJMKILMGDHGBDECA@ABCCBBDC?BDAACEIJV`TGDGDCFIIKLHCBEB=DILOOKJLMNMKKKHGGIJMOMKLLLMNMLNQRNMKPQOMPMLJJOXVSZUFFGFDIHEELIJILMIFFHLLHJGIEJGKMIFEGFDFGEGHHHKHDGGKKHFEC>=DIDB@CDCBCCA@?CDCFECDFFFFECAFFGIINPLHIIAB???<<@A?@@BBHCDCEDFIIFFGEEGHHFJdKIGIEBCFGHHDDHHLXTOJKJIEB>;>==99;@BGA:@@?BEDDFFDED@>=99:98<=9=>:=DB?AA@=><=>>=;:7?@B@@CFFEE?=BFHGHFGFGJJHEDEABA><>>>>?=@C>>@>>?>=BJIEGJFIKIIIGGHGEGEEDFFGFHFHIIKKF@@AACEAABAA<=;;<<:;?>>FFEEDCCEDDCA@FFDEFFCDA?EEEDB?AEIHHFFGFEHJLEHKLJJHINKILLJKNLJJIFIIDFHGHKJIKKIHLKECCDAB?FFABBAAABDDDEEHINUPKGHDEGGGIIFB@A?>FIMNMJKMMLLMNLIIIGHMNLKMNNMMKJNOPNLJLLKJMMJIKOTURTTHDGFFNHHELFHIKNMJGEHGDCFBDGFHLIGILJGDCFKHEFIKGHFJMHEEB=>;=<;=?=<<>??CCDEFC@@EHJIHGDBCDGFIr tGEFHEGDCHJFFGL[^UUIEEACA=;>===<==>BEKGBC?EFF@??==<;>DDB;??@BEBABA@@@>;8568657979:8=B>=CD>;86;>?<>87?AA?=@EDFFBDEFHIJGIHGIJIHHFCBC>@?<>?=;?B?>@?>@>>AHIHKJHIHHIGDFHGFGGFHIIIJFDHJHILG@AAADDBBBAA>=;===>@A@AFEFFFEFGCCB?@GEDGGFEEAADD@DBBDFJHFFGGFFGLJEGILLIHHJJILNKJNKIIIFHIFEGHFIJJKLJILIDAB@BCAEHDACDBBBBCEFEHKKJKJKJJGFGFGGDAAA>?DEGHHJMNLKMMNOLJJHFMNMMQQONNLJNMLNKEHOLNMNMJILMRSPRLHKRN`OMINMLMJJLJC@JG=@DDHGIGLONPPMIGDDIJEFFJGHEHJGEFE@ADAAHFEFGGD@DFJIDCEDA@ACBDCDFBBDEEGFDIMKFGGC?@><>?;=A@>=@CBEDBEFECABEHEDGB>DEFFP�°†KEGJFGGFFHJJHQa[LGHEHDEAA?>@<;=<>@AMZRDF?CEHDABBA>>AFEA>?=A@CB@@?=?@=<:757757:;=@=>EB>DG?==;;;B?><7>@?@A?ADBAABDEJJIGHHIIIGHIFD??>??===<<=?@?<=?==;BEJGGFEGGGEDFKG@EHGFJIHFHECFGDGKE?@?AEBCCAADB??A?>@@?ABBCEFDFEBCB@@@>?CBBCBECDBA@C??DBDEEEFGDCHHFEIJLLFGFEGHHJLIIIJGEGFGEFGGGHIKLHDFHGBAA>BB?@EB@CDCCCCCBBEHJKMIGIJIGFEGJCA@A@C<>>BEGKMLLMKJLLIIIIGMNMNPONKKNNKJJID?FMKOMNNJHJJLQUSOQRSN[KLJLNKLIGIB8ANL@A?CGGDELNOQPMJHFEGKHHDDFHDHHEEFCBGE@AEACB>@===CFDDEIJC?>BBBDGFDGGGFFD?AFGGJFDBC>?>?=<>?=>@CD@B@EDEEB?BAAFFBCBAGKPczPFEHFEEFEFGFJKJPQHA?BGGFBAB@=>=;<>>@SZMBB>ACBAAAAA??ABB>@>:>B>>>>=<==;;:785679;>B@<97>@ABC@>DDDCEBCLMKJKIJIIJIKHB@===?=>>=<=?>?>=>?==;=??ABBHCHFCDCCBA@ACAAB@DGGD>BC=>AACGGDFIGEIGHHNMMMGGGFHIHIKIHJKGFIFFFIIGHIJKKHGGGGE@@@BB>DFBBCCBCDBEC@GHIKNKIJLGGIILIBB?AAC;=>DHIJKILMKLMLJKJIILMKNNLLIGLJCCFIFCHKHKMJKJHKRRQSPNPPLLHGJLIIGHGGJC@KMHCB@>?DFILLJNNLLGGIIHHHDCIFDIIECCBEHGFEECA@=>>A>ABACEGHFD?>@>@BCEEEFFFFFF@=DKFFDCB==@>;>??ABAABABECCCC>ACAGGFGB@DHLTAEDHEEHGEDDBFGFIGJIA?CFJHBBCAA?>=:9:?K\PD?;?DCAB@@B@>>@>>::;<@>==>==><;:9::7576<>B>>=AFFFEA<99<;<>A:7@AB????@AB@B>?GMNIMLJHHJGFFBB==<><>=<<>?<=><>??=?HGFHFGIGHLJDAA@@GGFFFEFIGFHGGGIHFGHFEFDDDA?A=89;<<:<==BCBFDHFDBBFDFFFEBCDACHHE?BFBABHJGFFJNLIKMKIOKLOHFEDJKIJLLKLIGFFHGHHGHIKKKKKJGGGFAA@DBBGHHFFCBCBACC>FHKLMPNJLJHJNKCCB@@@>=ACEHFCGHGH@=HJHHBA<@B=;<@GF@@FFAEB?FFGDCDBFEBEE@@EIDCJIJKJGFHDDEBDFHJHHKHHIPKICCD??DA;:;=Ed^HF@><@?=>>;<>=<<99<;568:<@87???>=<==<<<9:;CKNIKLKIFFECCCB<><><<<==>>@?=<=A?>>EHHDDFGHLPOIDDDBGHFGGGGFHGFGGGIGB@@????>A=>@:9::<;;===@BCDCEECBDDFFCEFBDD@DEEFDEEECHLLDCIMMJHJNJGIGKOIECDFIIILIJMHHEEGFFDFFIJKKLJGGEFFGEAFEFGHFECABDCBCBCDILKMNNILJJJHECC@>;<CEAB>?@DBDFEEEFABHIGEB>BC@=:>BEDGKF@=ElpJHOFAD@@BB@AEC@A===;==A=<======<=:69969::>A>;>CECBAA@?@@;?=<8<=??<<=<>>=;<>CJKGBFJHFEFFEEB@==>;<>=<BC@>DGJFCDEJJKKHEDCEJJFEFGGGHGHHGGLIB?>>?B@?A>>B<;;<<;=>=>@BBFDEHECFGHHEEGFCCCEEDGDDEDDJHHGGIIIIHGKMJHKKNLGFGFIJKJGIJHKFFEFDFGEHKJHKNKIEFHLJCIJHJIDEFECFGDGHGFKKGKKGJKJNNIEDBA=<>@LKLLMKKKMIJLJMMIILJHHLKLMLHIIHHGEFFEIMNKNOOKMJOPHFIHFIHIIFFEHIHCEFEJGCHKKJEFBCAEFFGHIFEECDGHIGKDBFGECIIDCDDCDFDGFIWIDDGFDFDBEEBDFFDHHLKOI>=CCDFFGECEDBHKJFEDDDFB@CA@DABYfLGD>ACEHFBBFEACGECC????=<<>==><<><;;9:89:=>=:?EEC@>AAA>D??>:;??@=;?=;A>>@ABCFDC?DGGGGGGGFDB><>=>?===A?????>@<=DGIGECDIGGIGEGFGJHF@@EAEGEEFEEJJA?A>>CA@>>>A>;?>>===<=ACBDGDFFBBHGGFFFHGEGFBCFABEFCADEEFCDIJJHMNLOOLLMHEFFCDIJIKJHLGBBECKHDFJHFILJHHFGHEFJLJHKFBHHCDHECFGFIJEHKHIIIINNHE@BC@>BJMKJLMLJKJJLKKJHJIHEGHFEDHCBFFGGBCB=>DJIKIKLNKHJHDCFEDFHHEEEFOLDDIGEGIMKIIAED@BEFGFKKGCBEFDEGEFGEEDBEIGCDDDEDFCDGEEHDCHDBEGCCDCDDCCIGJGMIFD?=AFECEFCC?CGIEDCFDFI@BGEBCDC?BFEGGEDHFFFHKIFEEGEAEILLJJIIGFJIFDGISOHD?>>?@=@FECCEDFGEEFBACCCDGDDAA??A=;==>9>?><>@<<>B?AA>@?>??BGIIGHEIIGGGFGHHIGHDEC@FFFFHIGHID@@>@C?@>?@A>=@==?><<@ABCEECGD@CDFHFGEFIEFE@AGEECDCCDDGFBHOMLNPLMPPPPNHHFDDFHGHIHJJEBBFJMJGHFFHFGHFKGGHFCGHFDIFEHEDFGFAEILGGHHKHKJJFTXGDB?DF<@HLLJLGFFEGKLJKHDGFEEGFCFFGHHEEFCCGDDDBBGIGHMPIILIEFHBDEDGIHHHUOGHHDGHFNOJFBCACDFJHHHGFFEEFEHCBGFDHGEFGEDGGCDHFDDE@JUPHHFEGECCBACCCCJJLHLIHFEC@@CEGGFA@CBKFBEHJFA>>ABCHBAFFCDJFDDCCDDDFHGEGGGKJFJLICEBDFGJKKLOJHGFKHHHICFKLGA?@CDBDDHFGGDFGDFFDCDHFDECFAB?A@@<>==?>>?=<<;88;78;;9:;>FIA@DEBC?>A@?<=>A@>>@??D@>E@BDGCFHKLLJEHIDFGA??>==>=@?A>@FGIIGGIGEGFDGIHGIIJKIGHKGIJJEDKGAB@@CB@B??B@<;>><>=<@BABHHEGECCECDDFDCDBB?ADHJACFDDECCFCBILJMMKNOSQLPJEGEDIIEGKIIHEADGHFKI@BGGFDAEKHEIFBEIFBIIDEHDCFDBFEECGGJNJGLJFJJDEC>?D@>CHFDEEBDEADGCBCEDFJJHFEEGIGHHFFIHCECABDGCDDDGIKGGHCHGFDAAGEGEJHEEGEDHGFJFC?B==AJIGJHBCB@DGD@CDBAGBDGFCFDBCEDCDGECIECJCEMKFFGHEHMHJNIGGEFIIIKGDGIHEEFBCEBCCGEGGFEHFCEC@ACBBEGEFGBBB?<=<;=>>@???>>?@@A@A?CBFJKLMMMLKIGEGFBA>=>><===<=??>?@>@@CIFGGFEEFGCFKHGJIHKKLJKIGIHFEEIJEAADCDEHDBFA;==;>?<>A?@EEIJECAEEEGEDFFBCB===@A>=;<968877987:=BHJONY“}HA>COF>====?@>@=?@?@@HNOMMLKLNNKEDFB@><=>><<=>>=<=>>;><::<;:??<>DBGJCD@ACB@ECADA@A<=@C@BCICDA>AFEBBEKLMJONOMNOKGECBFGFHGLJLGFIHIIJGDGIJIGE?BHGIHGDHHGIHGEDDFECFBDDDIKMMPB8=DIBAD?<>?BA?@@@EJLH?>ACDDADFCDDGBAFEDHEDEHECIGFDFGEFHGDEGGGABGGIFJMNJLNJB<<=<;>><>>AGA>BBCEDEFGGDLXHDFHCECDBADDCBCEBJLLGGEJFEGFGGGJHGJHFGDFEEHHGJKGCEFECCBCCBHFEEGIKMLKE@EMKFHFFHDDCB?>>==<;==:>:6866689:;;?A>>A>=A?=ACA?FLMNLLMMNNMIFEDB@?;==<==>?>>=?B>=@>?FFCCEHGGIGEFGEGLJHHHIHGEGIFGJKJIGEEFEFEDEGA==?=;@?DEBDFDACBBDFEBCC><:9=><=@ECDDIJIHECDJQOKMNOMNPLGGEFJHGJJLKMKFJMBPVLEHFGJKF=DFFGIDFBCEILOOKDCGFFCADEHGIMJB@@DJGCBAEIGJIFEDGFEHGBADDEFHEJJHFIFDIGBDCADIFECDFGFDBCB?EJEBBA??DCDGCCHDGIFCDFCADAAAB>AECABABGIJKG??FDEBDFFD?BIFCCCCCEDEFFEFGHIFEFFEFFGHFEDAILHGJKHHJMKEB@??<>CBEC<@FFBBCBBEFGFEQUIFCFCGDDCCFCDGBDILPOFFHMIIKICEKKHHGEEFEDGDFHEGJIDDFDDEBBFDEFGHIILKQRHBGNKHIGHIHFEE==<:??;=>;;=:66798>B?@>CJGFIHO†˜QCADKJ?>>>?>?==A??CC@FOLLOMLLLONKGDCA?@=>>?=<>B?>@<=@>>AAGGKHFGFFIHDFHFEKMEIIGJJGGIHFHMKGFFDGIEEIEED@>>==?=;=@>?DFCFFFFADDFD>=DB8<98<>DH@:?A@CC??AC@?ABIHFGIJHGG@>ACBD@CEGGJGDFHEACCBBC@?GDDCCBCFGFDA?CCDEFECFDBDGABEABHEADFEBFKGCGGCCCDGGGFGIHMLHHJFGGGLONLNK=;?EDE=BHLCFJFEGFBBIGEDDAEEFEEDCIJGFEGKNKKRIHGKIFIJGIQRJGFFFEFHGEFHHJLKFEGCDHBCFCEFJIHMLPRJEJNIJHJHJJFFFB==>=?@==?=<>:6<:=AGD@>CJKJFFNdhIFIEFE;=>==@=>>>>?A@@CIIJNNMONLKGEECAB?<=<;<<=<<===>@<@@@GIDDDFEEFFGHGEEJLIHHHJEDGGFFFIJGEFEHEHHCCDC@==<<=;;>@>BBBDEBCEBBDD?<>?A<<789:BGHECA:CA<=GKHEFB@ECCCDBFFCDIHJIC?BE?9<>@@A@?@><@?>DFCCB?ADBDDHEGDAADACFBAFKFADCEBB@?<=;?>:;>?==@>;?B>?BBHOOKMNLOLHEEHCBC><@=9>>;=@>;?@>@B=AHGDGEDGGDFIEFIHEJHEIIHEGGDEGEFKIDJIFGGEDGC@>><;=::>@=?EBAE@?BFBBE@<@EDC>68:9;>CFGEEJKGFLOKNQMEJLJKJJLIDEHIFEFGDFEEGCBFFCDGFFIIIHHEDHJFDC@CDDEGHEFJFHKJJKE@CD>>CDCFGEEE?>A@=<>=<>CIJDBEB@CBBEFEFEDGIIFA??AB=9==<=CEEEEB<>>=:<<==@@@>B@EFGDBB?>ACIg‚_GNJFGDFE=?<>><>A=<>@>AB@IOLJMNLLIEEGECBC?<<>===;>@=?>>=A>>>EEEFEFFFFGHFHHIFGGCGIHHIHFGFDGMJCGEEHECGEABB=;=>;:=<=@AA@A?BEDBBCA?@=@BA<;9:=FEDFFFHIHHB?:;;;>BB>AFBADBADFCGFEDJJFC?=@A;9=@>??A>>>;>BDEDEE>;=@BCCKFEDEEGHECCC>@B@BDC@C@ACEEBDD@CEBAA@AGEEEDEDCCBDFCCDAADBAEDDFHEHFBCDDBJKIGJHFHJIJIFEGFBCDCB@BC><??>?@ACHC?@EEEGFCDC?>CEAMjUGQJGIDEF@?<@?>>=@BBAHOMKMMLLIHDHEEAC><==>>=<>>@=?@>?=?:><=AA@?ACBFECDB??;9;CBB@;;;AKC:9889;::AHDCDA@CFCFHGCGJGF?;@@<:=A>@@@?A>;@ABDCCA?><@A?AFC?=?BEHIFEDCECCBC@DEA@ACBABAAE>=DBC@GEEDBBDCABCEDCC@CECDEEDFHBDFDCDGDENJHIFDCGGHIEBDDBBEDEDCFFA>FIEFJJMPIDGBGICGKJIEHOMHHHDEGGGGEGFEIFIMKJHHLLJMLKKJGIGEGFEEEGFEGGEGJMLIJFEBQPBBDEFIQOAEIIJNNLI`bM@?BEEDCFFGHEABFCCDBBBCC@AA>98@@=?A?>=A?AAEMNLMMLNKKFIFDBB>>?==?>=>>A=?@>A=<>AGGFFEFGEFIFGJJHJFGJHHJIGEHIDFILFEIDEECDGECA?==@><>==@@A?EEDEBBEDA><@=EDDE>9;=AOPFEPRGEHCFHNMKHNMMNMOMFCEEFGGEAAC@D>@GFDDEEDEDCGFEHJFHFFDEFB@ABCFHDJGGHJFGIGBBGIHIJB@FIGA@?=8:<<;>@=AGC@CB?CGDCHGEDFHHA;@C?9?A?@B=:>CBCEB=?A??@;=?@>A@<=?@FJFDHHHCCCDFE@AA=?CBCD?;?DECEEBFECDB>@DEFGFBCCC@DFDGEACEDCDFC@JGBCDBFFCIMEADGFEHFGJEDJHCA@?AHKLNJADL`YGGIJFFKTVJGIFFGGFFFHFFHIJKJJKLNQTSMJJLIHGIGGFEEEEGHGHHELLLKIFBJMFE@=FKKIFBIHIMVLHW\OBCHIJFCDEDCFCBC@ABB?AGC>DD=;A>CHBEJCDH:?>>=??>??@?A?@ACJMMMLMLJKIGFDCA@>>==>>?>?A@>?>B>==@DEDEEEFGGEFHFJJIEFJHIJGFGIGFHHKHEDGECDEDBCB@>??=@><==>B@DDDD>?CDEB?B>CJGE?9>;@FDACDA?DGGHEKJKILNLMQOJFEFEHIHI>;GBA;@FDEHFFGEFGGDFDCDCA@@DHGCBDFHHGGBDFJHKKJGFEGIIHGFGMJBAA;7@DACFFBACCABCBCDDDDCEEFIGA@??AA>=>AABDA@>=?@==>=>>@??@><@B==CADEBBHGFC=;?A?CECAAA?BDA@EAAFGEFEBBDFEBCBCFFEHLECGFDDDECCBCCE?>>>>CFCFJEBLb\IOHIGEIU\KADFHIHJHEHIHGJGBIIGGJcvg^PNMJFHGFDDEDFDDGFFFGFGMNLIDDBFHABHHKMHDGHIJMLLMKSKCGGEEFFEDFBCB>>ACGCCHB>EHE?B?C@@BA?@G9?>?>>?>=>@@>?@@CJNMKJMLKKIEFGCBA?><=>=>=?B@=>=??>=>FEDDEFEGHDGIFGJHFHJIIHHHGGFGHHIHCCBBCDBABCA@?>>?@>===@AAEC?DA@BCFB=@=CHCFJHECDGA@CBCDEEFBCFGHGA;=AB<;=?B@A@@@==@A@@A@>>@<=?>=@@>?AA?>?B@<>DFGGHJIDCFBBDCB@@C@?BBFEBEECDFDCDC@ACAB@BDEDDDDGHJIIIFFFDGHEECCBBA????A@<==@CADE?GC=?@@@@>@HHCFVXI_KFHEIRODAABFJKGFIKIJIGDGHHIHEEVnqSFHJIHHJGDDGGFEEFFHEEGFIMLKEFIJGHKLQQHCBFIHMY\SLXOAFHEEFDDEEBEACFHHHGBCFEEGHEJJDBEB?LEC9?>>?<>>?>>>=???DKMLKLLNLKIGGEDCB@>;<=<<=?@@<>==<>>>DEEDCEFFHFBFIDIGHGIHGGJHDFHFFFFJ?AAABB@CCBC?=??>=>>>?B>AFCBEECBEFA>>?CBACC>=B@CDDB>@@AJIFHJKLJIJMLNOKFFGGGFFGAB=BCGGFD@DDCD@@CFEBHFHJJDFJIEEHEABDKLKHKKMJLGGLIGJIGHFFCDCAB=@ILEHJGHGHH@=CADFCGFCFFFGID:;AA<:<>A?AA?><;=>>?>@C?=>=<>>==A@=@?;=B@=DHBA@@@DHFKKB?@?@@>AFECGHCEBBAEEAACACHEFADBBFDEHIFHKHFJKFAC<;:;9;88<@?==:8>===?=><=??A>@DHLLKLMNKLIGFEECB>?><=>>>??@>@==?>==AEEEDDEEFFECIGHFHHEGGHKHDFGEECHN?BCCABAB@AC?=?=>=>==?@?@BFEDDCACEBCEINDFHE@?@B@?CC?@?AGFCEMOLIIIHHJJKIEFFEDBBBDECDBAADA@CEDEEHFFEA>BHJEHHGIKJHDBCJLNJKIJJGGJMJIGGNMDCC>AAC:>FKILNLJGKMA@FBECDDDEEFGHFB?:>B@;;=@ACAA@>ACDDBCBBA=====>==?@@>>@>?B>@B@AB>@ABABIKHHFCBAFD@EEDEA@DCDDCAABBGHFEIFEFFBCCGDACACEA@@9;::9::9<>=<<=:<@=@AB@@@DEE=<>@BBGJGDEFEGIEFFGGDDDACEIOIEGGIIEDEHFGKIEFGDEEDHIHEIFEGDDGFEEEDGGFDEDEEEGIIHHGGIJLJFCEHHHMNPLMJBCDDGCEGECD@@CFDCBA@@CDACELEIIFIFGKFD8=>=><>?<??ABGLLKKKMLKJHFFGEC??==??>?>=BAB<@?<>>=AC@==><?@?DEDDEECCFFHPOGDFEC>??AC?@EB<9;DECEGNKGHIFFHJJJKGCECCAAACDCBBFJHHGFD?DOPDEFE=GLIJLIIMKGFEEHKKKKKIKLIJKKLJHLIDABB>?>>>BDEJMLIHKJC=GCCDDFGCEGHGGF?9>D@<=?CEBCEDBEEDEDCC@>>>==>>?>>?=C>AD?ACDGFGFDEEHEBDEFFDFGGHFEFDC?:;;8:87:<<8:?;:<<>@BBB?=EOOB=>=?GLKJEBDDBDGEEIIDEDCFHHFGGCHHFGDEGFGGGIIGFFEDHKGHGHGGCFHFGHGHHHHFGEFE=ACB=ACC??BFGBAFKJMIE?;BMCA8=??>BB>>B@BGKMLMIKNMJIEDFFCA>>==?>>>?>AA?BB?@@BEFEDEGFFGFGFGIIIGFGFEJJFGHDCCDKA???@@@>>@A>::?@<@>?>CCBEFFFFFDBCEHKCCDFCFAADAACDCB=8:>FA?GHFGEBEFCDGEBBCCBA?@BGEJGFFD>AGB=>DR\J?:@=DMKIJKKJNLFFFGLMJJJIJKKHFJKJJIHGE>AB>:=?>?FGEJNJGFDADCFCFEFGDDGGEEB?><>><=?=?A?>?@ABDA@CA@BBAACDEEB<<>?CGGGKJFCC>=A?<><9:>ACFGEDCEGKJKJPO@DC@?;799:79;;><;@@>??>?B@A?@EFMH???>GNKIFD>CBBCEDCGECFEDEFEEFCBAFCCEEDGHFGGEBDCFJFDGGFFHIFHHEGJHEJGCFGF?>>>BDEHLJDEGGCFDEFC?AEKQMLNHEBBA>>@?A@><>BCACDDDAGJMCDBHGNODB89>>==??>???>>??@B??BC?CAAGIFEGGHJGHGHHGHHEEFFEGIHGFDDECJGCAAA>A==@>;:<<;>=@=A@CCBBJFBDGFCFFA>@@CDB=BDADGEA@><@CDFGDDIHJFFEEHJJFBAEHEDEEBEDDEC>=BEDB=?GB<<:?@>===?A?CB@ACDDCB@>BFDDDCFG@>:9;=<;<:89;@BECHFEJIGINKPPA?A?<8;<;8:9:<;<>??@CA>???BA>CGIFA>:@IGJLEDEFFDDEHCAA?ADEFDCBCC@BCABGCBFCDJFAGJINNGCDGGFFFFGGFFGGGHGBHCF?@@>???ABCFDDHIM?CEJPULDB69>?>=>>?<>@=>@AAEJKLMKJLLIGEEFEBA?=<>?;@?=9:;79<:;<<=>>>ABA@BFECCDFFCDGC==@ACCB>@B>?B>>A>AGGEEICEGDCEHJMOKGHC=BDA@DACDB>B=9?DBAAEH>=77<A>:?AADDADKJCCDDFAB?EECFGDDDCCBABDCADDCCDFDBCBACEBAB@AC@=@<<>>;>@?=@A??AAAEA>AA?ACABC@?BCBDGDDGABCD><=::><9==88<<@BEGC==>>BIMHFCCGFDGFEDFC?@BBDFEBCD?BDC?AC@DEFIIGNXSKKIIGIEEGDDHIGHJHIFDBFF@FQG;@??BCB>?EDCEJIDA?BOVVG@C88?@=@?>>>@?>B??ACIONNMLMLKGEEEEBD>=>>>>>>?AAB>DAAEC@EIFFIGEGFEFFFFGGFJLHCGHFIGA??BHMA>=<8;9::9:=??>>>?>?ABDCDEDBBBDEFFB@>?CECABABCCACHEACFFHJIDB?EKMMMKGGEBCBD@@B@BEBFDA>@DCBCB?AC@78<;=ABAFGFIJECDBCF?ACBEFGCDGEADD@@CABEEBGEEFDBBBBBDDBBCA@A??>@>=A>=@@>>?@@BDCBB@CCCBDBADECDEDEFEABGC?=@A>==<==99?JPLLMK\DCGFKMHLLBB<;79;88:;6:=<>@==?>>=>??AACHG@??>??BEFFEFHEEFFCDJE??@@@ACCFCB?BFECDHE?EMKINLKKKLJJIFCEDFIHFHKIIHDEIC?INGDEEIJIKKNLLJHCCB>@=HMNND=?K]]_]R@?7;>>BBCEABEBEMI@?@?KIDKaM66@=@A@@B@CILMMMLMMMJJIIEBD@=>><===@@BBAAFDCBAEIHHHFGGIFDIGJIGJHIJGDEEFG>:>?BG@A?9::5896:>>=>A?A@>A@BCGDBBAAFIGGFAABFDBDAB@>=@B@ADEIIBHHDC@IMKLIHD@@CFBBFBAADCBCB>ACBDCBB>BEFB:8=AILMKLLJKLOSMFGJGJHDEAABABCBCEFGGC>>>>B@@INNJJIECBBGD@DADCDGEDDEFBACCCBBCGBFGCBBEEEEDEDCCBC??>=@?@>>?>@A@@ABACAABBEEFFHEDECBDACFABCFCB@;9>A?<;<><:?>>?>==?ABAADGE?>??=>BCDEHDDCGGDBDEFEB?@??CJFAB@?FEAHLFGKKKKLHFMJJHIIJIHHILLIGKNJIGIHAGNM_ZMHGIPSQONNMMMJHGGBGNJGC9=A@@EHEDECCGJJGE@@CB?LyY56@>?ABDINLKMMMMMHFFDCE@<;<===>?BBBBEABB>BEGFFGDCGFEHFHFHGFEFCFGDFGDDAA?=B>E@::<:;>=<==>>>B@>B>>BDAFB@DCDHGECBB@A?@=@CDHHDB@?BDCBEIBBFHGFEIHDCDCACCA??BA@CBA@@ABDCBD?;;?DEF;>ADHJLLJJHHNNHBGGGGDBDA@CCBBCDCDEGD<=;?DDBCFLMKGED?@FBABBBDECEFBCDCAACABFCDEEBBDADBCDCBABBBB@>=@@>??=>@@>:;>?CDBDDEFIDDEDBCCACCACBAADDA>:89<<::=<9;=CFDMKJGA@>;CJFEDA>=:97<@AC?>>=9<=<==>=??CCAAAD@>>=<99;>>>>@>@??@DCGMJJJOMHKIIGCDDB?<=>>=>??BB@CFDC@@CIJDDGEFJGBIGEGGFCGEEIHDEFBDFEBEFED>@BCEBCF@?FA?DBDCEEEG@ACABCB@?A==@ABDHCEHCAEB??>8AFD@ABDFMKEF@?EF=BC@CDDCDGCCDABCBBEGCDDBADCBABDCBDBCDA?@?@>?DB=?@ADC@CGEFCBBCCBBDCBDC?AACBC@=:987:;:==98>BMDGMIB@>=BECA@A@<;;87?>:<><;>@@=A@?ECBBA<;<:89;=FECCEEDEFEB@AHH@>@??@@BCCAA@ECFHHCAGIEFIEMQKFIIGFABGFEIIDCFF@ACFDUfagjVS`_VOOLMNMOI?@CFGHEBJ[]QXXJHGAGE@?EA?CC@FJEFMMLABFFB@_Z68;>>>?>@ACGLJJONNMLGHEDDCA=<><=?<=CBBFIJIFDBCIHEFCDJHDEFDEFCCECDDFFGHEBBEHIFFFCEADBBCAB@<>?<>A>ABAB@=<>>=>??BDB?AECEGDDDAAE?>@=@HFFEDECHLEEDBDFEEDABBAA@CBBDCDEDA@BBABC?>@>>CCAEILILNJCBCGOLBCGEGDBBA?@A?ADDCDGFA?:9DEDCCC?DHEFFBDGF;AD?FDCCCFBED@CCBDDCBBDABDBAAACDDDABBBA>?:?@?AEECECAB@@BA?@CDDBBDBCCDD@?CB?CFEEEC<;::9998;;88:>H@@CBBA@=BCA>=A?98979>>>>>:?@::=<;==>>CA?DCB??<;<879BDDI_aafcTTXXZPMNQQSQRVII?AFEEILOSZ^TSFAEKDBKEABAADJKHKSZCAIEBCMQ66;?=??;>@:<@>>B?>DIJKMMKPPJHHGDFC?@A=>?=;>A@FHJHLHGJIGIJEDEFGGCCFEDCGECFFBFJGFD??BA@AFBCBE@IPF@A>:@A;===<@@>BB?BGDCHHDEDBCEDDFGAEEDCBA?CFFHGDAGHHFECDFEDED@BDABCCDDFCFHCAB??DEA?@>>AA@CEGLNMMKC@FMOKD>FFGDDEA=AB>ACBFHC?>A>AC@@FDCCCCCDCDHFEDBCBFBCHDADFDBDDCFD@EECBEABDB>BEBBC?@ED?AB@ADBCHGCAB@>AA>CC>DEDDFEADDACEEEIGIGHFDBA:::89977996<=9:;9=CE@AAA>AE>9888;<>B@;;=<;=;:=;>?><8:99BEBCEDBEGDFD>>B>?B>HL648=?><=>>>@=?DIIKMIJMKJHEFEFBC@=;>=:<>>@DDDFHJLMEDLJGEDEFGDEGGEEECDFDCEFFGE@@>:?=B?>BBBHJD>><<@B@B@AA@?AFDBEJJHJFBDCCBDCEDECEDCEC@ACEEFFDEGECCCFGECDEC@BDBCCBCECDEDDED??CBBB?>@A=AE?DMMMMID@EIJLEAFCDIGCGGACBDADEDBDDDFDCDDCCFDBDCBBCB?BECED@BBBACCADDADDGC@A?=@A=CC>DGDDDBAEGEJMJKLHHGGEEDC=:98:968:98;9:998A=:<;9<=99=>@CA@CDA?B@A@=:=?;;??>@C@ADDDGD?AB>@B??A?=DB@@CA?CABFFACLMKKJEHHHDFC>>CGILJEGGAACFILMNPZ^PCAENSQJQUPSKGE\UKMGFIEEGFBDFDCFFDDHGEEDHOFBEGEJhRFGBA<;B556;@?<<>>>?=>>=@@AGILLJLMLJIFDEFDE@=?==<===ABDCIILOMDCLKIHGFFGHDBDBC?AEDBBDEDCED@=>@??<>B@@AAA@BACECFJEFEA=BEBCEILKJDABBCEDAECDEEECEDABCFDBFFGECBC@DHFCEFBADDCCBCCCDFFACDBA@@@BC@>@@?CC>DKKKKIEBBBDIF?DEDDDABBBA@BBA@ABBAA@CB;<<;AA;AGCDKE@FE@CCCBCABFEBEHFCCDBDCBAEBD@ABCBBDDBBBA@AE@CFDCDAAA@??>@@>@A?DFDDFCFJMMNNMKHHFFHEHEBB=98988;979:9::;=BB@CDFD?;;;;:<;9<>>AA@>B@?=HHD?99>@=@A=>=@=@>?AC@BA@AA??AB?>BA@ABABD@>ADAADDKNJHIEEFHE@AEJJHFEFDABEFDHKKJJPPEBGOSLMTRQIJJEJHKLFCNWMBB?>?@AAACEHGHFDDCBCEBFJYTFDFHA>F666=;>?>??>>?A@@EKMKLNNMJJHEGGECB?@>>====@CHHKLKNLGEIJGHGEFGGC?=<>=@EDB@DDCCFE>?B>B>=?@AA?BBGMKJICEKFDCD?BDBBFJKKJGBBCDGFCEFGFGGEFEEFEEDBIHCFCCEDBFGEFGEADFBCDBCAECEDB?>@?BC@?@>?ABCCBFILIJJECCBBCEACEECFDCDECCEA=BFA>BAABA<:=:?>=AFB?CB@DJCADCACBAEGEEGHEDFCDCCAEFBACAACBABBAAFCBGCBDEB>@==@?>AB@@BA?CGGHJLKNMMMMLIKIHHJFHKEB>;8;;9;:78;:7>CCBEBDFFA?@>?@=88<<;:;<>?AA<>CA>>B>CLPG@;;=>>ACA>@A>A???B@@@@ABB@@DB><@A@CAADD?=ABACEJMIKHJHIKHDCHHFGGGFECCF>CJIFGMYZJAGV`KMPKMHEBEDADFCDU[G?CA>@>=@>@ABKMJKLLKJIEFFECC@==>=<<==?DIKKJLOLGFFFECCDCDDEA;>>?DGBCDB@BEA????>A?>==AHBBCHJJJEACFDBDBBCBBBCDGFDDCACEEDEFFFGHEFEDFGBCFEHECCCCACCFFEEFGB@DBAA@@>???BB?@AAABB@?@A@AAC?EJJGKGBB@@AA>>CECDFCBECBC>=>@B?>@AA@>=;::9:BDIBCCBBC?BDECCEEFFDDDEBBEBCAB??@ABCBBDBA??>AB@AB??@@>AAKKKKLMNNNMJJKIIKKHGHFCDA<:9::9789<9=CC@>?AEDA@?>??>>=<;<<;=<;<;>?AB>>?BACA?=ADIE;:;=>?A@=>>>=?@>@B??A?>?A@?AA@A>>>>??A?@B?>@>>EFHEFCHKLHEFCDGGHGDDEFD>>CCIFPZ^XICEHKPPJHLHCDJLKJMSTOC=??FKOK7738>=<=<:<<>==>>?@AGLJKLJMJGEEEEDD?=<=>====>DKJLKPOLHDHHEDEEDEDDC?BCDHD@@B???@?>?=?BB?>>>EIFHHFEEGFCBCCBCABA@BC@@BC?=??@CABDFGEHHEEEEEDCDJJDCC@BCC@CCCDCBEB>A@=@A??=?@@AAA@@?=?@B@B=BIJIJE@?=>?<=>BDEFECBDB>=;7:?@?<;@BB=?:99989<=@C?:<>EA@DBBAABDB@BCEFEECABAB@@?>?==;:@A@A@BB@@=A@@@A>==>=>?=>?>A>@GJHIKJIJJJIIIJJKIFIFEGBA?<879988;;<<:===?@=<;;<:9:::<=@@===>CBB=:===;79:9:>>>==>==@@A>?>=??=><>A?>A@>?A>AGGEBBCGICFIEIFDBAEFDDBACDFFCCFIHDDKKKIFTXNS[ULDDGMQIEBCDJKS^YPOI@>:>=:CEC@AEDBBFIKJCBDKOH5747=<<==<>?><@>>>ABEKMLMMMLFEFGFCED=;>><=>>=BLLLKKIGGEHJHGHFEFDBF@?A??>A=;?@>@BCDC@??><>>FIDEFFGAEKEBDEADEABABCB>=BA>@B@?BDDHGGFFCFGGCDDGIHEACDAFFDCC@BD?=DE>>ABBCD@BB>=@?BBBCAAB?@AABCDFHGGID>>=<=@DBADDFFDC@<:978=?=>>>>AC@>=8::78=??><97>GB?FAABBBCDCEGFEFEA@B??BB=<;78<9>CAAABA?>?AABBBC>>@?>@A>>?=??FIJHHLMKLMLJLMHJKHHIHJEC?><8::8;AGEHFCABCCB@;;?=<@CC@=<<<<<<:9;=>AA>==ACB=:<@?<:<:=>9>????>?>=A@=>>==@@>BB>?AAACFD@DHHLKFJLJKGDABFGBBBBCFHHIGIJKLMSWRWRZa]TSSGACEHKKJJIKLW_`\RG??AB@=ANXMGD>=CHHHFBCGCFFFDDFFGMNJ5667;<=<;=;>=====A?BFKNLKMLJHFEEDCBD?<=<;;<=>AIMKGEBDDBCIJHGC?AA=?==<<;?ABABBA@@?@@:89:699BCCCBBFDBFGDDBBBBA@@@B@>@B???>@@AEEEDEDEBDEECBFHA@EBCCBAB?AB@@@>:HI<>?@?EED@@@?AAA?<;:78?BCBFFFEB=;;8579;=<99;<>BB=DB@AB@@DD@BB?AB@?>=;@=::986<;;BB?BBA=>=>AAAAA@@B>=CA@@>?=@@GIIHHKLJIJJHIIIIHEHGFGBB<::8:>AFDEEEEADB=AA;:;:;;>C@>><;==;;;:;??>=>ABB@:=;==9:;@B=::BB@@>@=??>>><<===?A?AAB@@@>A??CHFGLHHJKHFIFFDCBBBDB@BFKNKFFFFOMQQR^iaPKOPOFDFIHIFMOLOPQVOB>@EA@BBDRE>=?AEIFEHDACDEGJFBAAADFD6556;@=<=<<=>>=?>@@AEKLKLMLJJJFFGECG?==>===@C>>AD@>><;:::;<:::;8;<@DDFDFGFDFGEECBECCB??@?A?AC?AB?CBDEGFEEGBFEEEIIDEEBCCBAA>=<<::;:@C=>DB@DCEA?B>?<=@BBBC@?CDFFFGCCDAAB><<<98ADBDFDFD=::8989<;:=?@@=?>;<<::;;97<><@B?>>DCBCCEBBEEA>@CCEEBA:89;=<89:;=88BEBDDBBA=>?BBCD@>A@?CB>?B>>??HMNKKLKKKIHJIIMKHJIFDGCB@=<<@DDDEGGGFDGE?DE?;;;;<=@CA=;<><=;;<<=?A?=DCB<<<;<=9@CCD?AB>ABC@<<>>>>>@CA??>A?A>ADFGILIIKJIGHKIDBAEF@@EGKLLKGECEGFJLN\g^OKMNPNFEHIJHLNNNNXUHFB;>>?@>GH@fnPGNKFFGFDBDHGLGDC?BCDA6666;?=<A@@B@@BA?B?=>?;?@>?BB?CCA@?=:@?::<89<;<<:::;:<;>BFEDHIDEEB@@DBCC@@CB>@?>AD@?A@A@CEEGDCGDBEGFDDFECB?;;87<76:8679;87=BDB??A@?A?<=??>A@@B@BADFEBCADA?>>;<=99?CAAEB?A<99<:8::;<;=?A=<>;:><9:=89<>@><;:=DB?CBBB@?B@@EGEGID@;97:<98::9<:9?CBBCBB>>B@BAAB@>@A>@A=AAA>A@DIKKKKIIJKIILJIJFBBDACDB>=?CEEDFFFEFGECFBBDA=><9<>>?BA==<<>=::=?=?CDEB@:<>;:=@DKGAA@=;98=?@=BBCA@@?AA==?><>B>?B@@AA>@>@CAFLKIFLKKJGGHGEACFABIJJLMGFECEDFEHIKPPJHIILLGDFHGFJMIMVXQMLEDF@@>CFCK�ŸcCJKFDDB@CDGGKEDCAADDA477:??<A@<>B@DKKKLKKKHFFDDCBCCCB>>@BAAA?BA?>?A=?@@@BGGHLID>:<;:8:;><;;:;;;@?7;;9::;@@DGIKHFGGECBDCDDBC?@B=<>CCA@@AAB@EFEEDDDEHIFEFDED=978787477476788:>EFB?CBB@D@???>?@@BCBCDCDECABFA@@=;<=99=<<>B??D?A@EB@@B@?CC?BE?@A>?@????=@@?CJIKKHJJIIIHFDBDDCEBBDC?AEBCFEFGDCEFGDFDDEE@AC??A@@AA@===;>=;@CCEC@<9>>;=BEIKDA?===><;;;=@@A@B?@@?=>@>@@=?@@=?>ABA?ACBEIIHGIFHHHEGJGEDEFEGHIIFHEDAEGGGJHFIIFIHEIJDDHFGFGJMOQSRNKNRP>CBORC]–”\DJLHGE@?ADGGIFBCB@CCB68:8BBBGJIJJFFGHCCFFECCCBBBBB@@B>>@A>=CCDKLIHLKILJD<:8:::6>=:;<;:<;=?;7:::9;A?BHIJKFEJHA@CCBEAAA@>@A?AC?@DA?BBABFC@DEEHEBDGCCF?848668659765655:?BDEBAEFCCA>??>>A@?CDBAACCDB?CD@@>::;:8<@??BB@D?=EF?<;99<>=>A<;<;<=>::<78;:>A>>??FDBD@DHFIIDBEEDIJFB?76;<:7877977?B>@EB>AA>AB>>@B;ABAJKIGJJDBEDEGECFBADBCCEB@C?;@EGFFGEJGEEHCBDEA@BABCBCACB@C@=>>=<>ACBA@=:<@;;?DDFFB>>?=>?=@>>ABA?>>=@@>@@>?@@<>A?@@AABCCDEHFHHEJJFEIJIGDBDFGIIHFGFAFKHFJHGIJIHJIFGHCHGFFJIJSTPONOQSS;BFIOEe˜ƒUDFJHFGA>AGFEGDBBB?BDB5654:?>??<>>?>A>>AA?DJJGGHFFGGFGGCFD?=ADFE@?CDB@HIGGIFFJJHJKJLMJC=87;;98<>9:::<;8=A:9<;;9;>ACFJHIEEGCCECDCDAB?AAC?@CABDB@ABB>DFBBCEFDCBEEACF=6663764575466667;ADFDDFGBA=<:<>@CBACDB@BBEB@?BC@?=;;<98>?9;B???>BE>II<7:<=>?@=<>;9=<;;<;88<@BADEDGHGBEIHFGHEEFFGIIHEB87899;888;:7;BDDEB?A@@A@?ABAABBA@AA@@?>@??CFFFGFDDFEEHDCEBBBDCEEA@?<:>B@GJGEHFBHGDEEECCB??=>=@@CDD?>??>=ADCB@>A?<<==AEGC@@==BDBA?>?@??>?@??=>BBAAA@?>AHHEGGJHGJIGIKKIGCADDFJHEHGEDGHIKJHGHIJKHFCGDGGFIMIHTWPNQSNJG?EFDFFZqcLEFGGEB?>=;;;<<=>==@=?EIJIIFBCBB@@A@ACEFHKHDFCBA@CHHKIFIIKKJJKKKLE;7:97979<:99:;;9<>9:78688:A>EJIMHABBBCBABBAB@@AAAA@@??@@@?=?BG@GJEDDCACDABC<7526665656676666:=?B>AA?C<<;7:=>@AA@>>AAB@@<;;:97877:<<==>DA:778;?B?>==:8<=:;;>DBAB@CIDB@ID>CGEEHGCCFEEJIIF@;788897789668??>>==?@@@?@@A??=?=>>>@CFDDDEEACCBDBC@BBAB?;>>:9<<>@?:>=AFEB>>;=;:==>:;;?@?>>A@@>@==>?A>;<:9@GHGGGHEHJLHDFKKJGB@ACFGHEDGEFDIIIGHHHKIHJEFHEDFILHHNOONNPKFDGPGBEHLLIHGGEGE<;=GDCEIBAA@@A@A58638<>=<>>>=>>@ACDB?CEDEA>@DDDFFFIHEDEEEDDCCFDDEEFJIEHGDHKJIKLKF>99::78:<;:9:::9<@:9:9::99A?EIJLHB?>BDBADBABABDB@ABAABBA@B@@AF?FFDDFDBDDBEE?:5534565546766787>><<<989999769?<;=@;BMA99846>A@A><>=>BCBCBBEE@???B>==GD@EHEDHJEDGEDGIHHC;899787989769@=<<@?@B@>?AA?@A>=<>B?ABGGCCFCADBCDCBBB@?>?;>A=;<;<=DHGFFEHGHFFFFA<<;9:B===>?BB<>BEDCC@;;<;;A>BC@<<><=<:=>=:;;=@B>=@@>=ABAB@@@@=>=><=<>A?=<:>DGIIFHFCIHHIDCHLLJFBADCFHECEFGDHHHGIJGHGGKFFHFCEGIHHLLMLJMNNLMODADFGEEHGFDDB;:BHEEGGAAB@A@?B87546=@<>:<=>?AFGDDD?<>?CEEHKKGFD?<<;78?CEDCECEEBGHHJEDIHEIMKJKKH?<:::;8:><<;:<<9<@@98;88<:@CDFJNJAAFEDCBBBB?ACCAABBBBACBACC@CDEBEECEEEDCDEFC:67569566665:969:@BCCBA<;;?>><9=@?B?>BB<9;;:9<:59:7:889??<8B=?ECCEEDFDDFBBGC@CCA@BCDIFDFHFGHIFEGGFIJGFA6::69:8;;;:99==@A=;>@>A@AACGHC><:;><;=>=>@===<;AA@@>?=@@>@CBBDCAA?>=<<;=>@AB>FFDBEFBCDCDCBE56557>C>;?@DD>@@?@A?l—i:EIGB@>7653555>FDCBDEECGFEGEDHHEHKHGKKHA:9:::8:<<;;98;:;?<69;88;7?CAEJMJACIECB@AB>?CCBAB@@B@?BB@BA?AFC?DDACEEDDEFEB<6666996885996:<<:BA::879::=?A?@@=A?979:79<97;967898@><:=9=B<;@>=DDADCDDGGCBEBAEDCHFACCB>BE?FFBCHFFHHFGIFFHGEFA7::78:9<=:89;>DFD@CC@?B@>BA>AA@?>ABDFDEGEDBDCFDADDDCFCAB@==><7<=9:A@:;::?EHGIFFGGGGEDGE=;=;>D<9?A:?EB@CEEA<;7<@AB@<:=<;=?<>@=;=>>@@<<=>?<@A@??DFC?@D>@@=<=;=?@?>@DDCCAEEDBCEIIGGJMMKHDAEGEGJHHIIHIHFHJHEGFFJKGGHHBCDBFIKKJKILJFF??EGC@EJHECA??DDCD=CECABBCCCD;<FC=;958@>6552782:FEBDCBEECCFEEHHFHHGEHIHIE7:;88:78>;8:;8;<;<8:9<;87?BAGJJEACGEE>ABA?BBBDCA@AB@?B>AA@CDDADCBDDEEFEEFK@<7478777866:56:98;:;>@C@AB?;976977>BABB>=C=8:989:8788:8:<;?>:;749>;=@BB@ADFGFCEDCDCCCBCFFC@@@<<<<:8988;><6898AB<<=;BFFCEFCDFDCGFACEBCEB@?@?@=<;<=::79>;89;>>IIGHJGGJHBCFD@=::@?8??>@<;<;:?><<;=<>>>@=<;<<=A;=AB@?DDBC>@>CA>?<??CCCACECCCDELHFKMJKMGABAFFFGFJJHJKFEJGDDDDKKLJKIIFEDDFEDFHHIHDGD>@BB?>DDCDA>>?BBBA>ACBBCACDAC?=@AE>BBAAA>?ABA@CBBEDABA?=9979;>:6545558?ECEABECCDEEFHGFHIEHJGGIE9::88:79>;7::8:<:=:;9::88=CDDGFBDFGHEACCAAAABCCAAB@CB@>CAACCCDGBBFEDFFDCCIA;7688647668655676>>?BFBEEB@<669:::=BBGDBAB<:;76:;9:;8<:<;:=99>;:@ABDDDEGBCDEEDDAACA?A@>@A<<>>:9=:=AEGAADFHEEFGDFFEFHE@=;6997;=<8;87;ECCFDCCA>??=>?=:99:AECAFDCFGCDGDBDCADHAABBAA>;;=;:;88<>;9::@C<;@B@CJJIID?=99=H?=>=;>>:;??=?>>?A==>=<=>;>@<=@@BB?BCDA>@?=>><>@><<==ADCBCEADECFKJHHFGMMGFFBBGIGEJJGJJFGGDFFHELJHIJIIJHFGGCCDEGKKFJC?@AA@DC==???CA>A@=@A>>AB??@>AA?A@?@BCAAB@BDA@@?>==;=?ABB<::99;?<4554568@FDDDEEDFFFGFEGHJIIHGIKD<::999:;=;7:7::::=:;89;<<@FDBEEDGIHIEFCAB?ACCCBAAA=BCABEBA@@CEECBEDBEFDCDCD<7566567788665687>BECEACDAB?98;<<=@@@HEEC@==;869<<=;::;:;=;>?DEEEDCCCDFHECBDCBAB@>=<<<:99;<===:<:?>@FCADFGEFFDEFGFEEEB>:7889;<>>;9:;CDACECA>;<:9<:9:;7;ADDCEDDEEEDDEFDCCEDDED@@?==<;<=<:;;=<:99<=EJKJJJIHEECAC=@@?@B@@@FGJLC<=<:?HF:99:<<:;>=?BBBAA=;==;<=><>=;>@@AA>AC?ABA===<<===<=?:@BAEDFCDDAFIFHIDELMHJGFFBEFJGGJKGEIHEIFIIHGFFFHHHIHIIFFEDGNMIJF<<=?A>:@EA<:7::968988989;A@?@>>BCBBCDDC?<==;89;9<:?>=?CDABGFGGJFHEDC??>?@@ED@BB??CEFEC@BCBDFEBDEBEGCEFDG=8367558967:76866=BBCBA@CABDA>>?<>?>?DFB@>=<;:89:9;:=:?@CEFGEEDBDDACEACEBBBAABDB?>=<=<99:>:=>>;::=?ADHHFFFDEGFCGIGEGC@B=:99<>?=??<8:BB?A@:=<69<9:<87<<:@DEEFFCDEEFGEEDFBBCCDD?>@?==?<:>?;;<8:;;:<@JMMKILIGIGBBA??;BDHFBADIJE?:=A@<>>?<>@;?B==@?>@A?EE>=?><=<:=>=<@ABEFCEEEEFDEKJFFMLLGIFEFFEKLGCBCHKIJIIINIHHJHFJHEIHEFHIJMLIJB=???>A?<@>:?HA8<7798;9:969968=;<=?AEBCEC@?>;;=<;:898<;ACC>:;99;@<3665647?EACDCEEDFGGGIKIGJIGGFG@;9;8987<<:<;;=<=C@>=?;998;?>BEHGJEFDF?;;;77;@@@FIGCCFHCC@ACCDEDCDDDFECGDCH@97774567988:78699A?C?A?@@ADA>>>>>=>@ADED>:=<:;;8;@AEEFDECEEDFBCD@?@A@CEDEAAAB>=@=9<<::;<;?>?>>8:>>=ADEEEDCGHFEFFIIGFDC@A?<=BC@??><@A@@:;9989<::<<99<<<=><;:<:8::=;>?>>??>>>>>>>>B>=>>>?>>@BCFFEAAAAA?<;<<;<;:=>>>>>?@DCCDIGGHGIJJMNJJKJDBDBEFB>?FIFJLIMLIIJGHKIHGGHJIEFFHJGG???@@A?=?A=DJIEJFCDE9698578=CCGMNICEB@A@=?BDEEEEDEDEFEFEFC;856767;=::;:9698@ABBBBCDCDD@?=>?;@A=BDEB@>?BABEDBBCFDCFBEFCDBBBCEEGFEFFD?A==A>;:;;<;;<;>?;=>=9<==?B@?CEGIBEB><;:;<:;=::;::;==@EFDEEEEEEFEAAABCEBB@??>=>@AA?=><=:<=;;::<>HONLLLJHCCFDA;?GIIJLHCA=;<>LPD=A@;99=>>>====<===;==@A?=>>><<===?ACDEDEB==CC>><;>;9<=:;>@>B@CDBAGHBCGIHFKNMLNNMIFECB?>?BHJHIMMLFIIHJJJIGFHIHIHFJKIC@BBBBA>>A@?BG><<9:::7:959:669;DCACBAADB<::978:9=?7655556;BAFGCEDBCCEIIIHJHGGFFB;:;=>>ABAC@956636543567958?>BFICIHCAD:556764;CCHGFIEA>AB>?>BECBDGFCBFFGHAGD?8575797:>::;<98<>ACCBEIB?DB==;<>>>A>CBCB?@EEA=;<>>?CGFA?=<>AEFHFDGFCCFFCC?>?=::9:;<=;;=:<<=::8:<=<@>>DGFFGHCGHGGIFGFGBDF@>ACEKLMLLD?A?=:::9;<9:;:::;;>AFDDCDDCADFA@CC@@BA>B>@?<<@B??>>><;;<:::;89AMQONLJGE@BA>;BBENMHHE><;?NPKC?AA>;96=?=>>;;>;;=<;=@>>>=<<=<>>:=ABDGGCA@=>@<:??;;<=:>CBBBBAAABGKIGIKJNMNMOONOOHEBADCBEGHLLMFILJIJKIIFCJKHIGHIJ@@EDB?BA=CDAFB;<;:978778878869>DEDFFFFHC<867754;FGFFFCDB@A?=<@DCBCEEEEBECBFBDD><665799;;;869=?A?>>;<;=?:;;;<@BBDEB@=BCEFC?@?=??A?==@A>=?EDDFDDEEDDEDB>==>:8<=<><;=<<:?A=;9<>=AEDEEEFEEHHDHGCAABEFFFGIIILMIE?>==;;:9;;;;::8<9:;?DDEEDDECBDC@BB>AB=?@@>@?:;=:::9:AKPONJGEBCAB=?GGKMNJC@?;>IOIE>=ABB?:8;??==<;><<;===>=<=@=<=====>@?ABDDA??==>=>=;?@===<==DCBB@DNUJDHIJHOKIMMNPOOPOMJEABEC@BGLINHGLJKJFFGIKJIHEGIFD?DEBDC@@@ABFF<::7<89999798798:B?A>;;<;99:98;<77:79=BDB:7789>B95465674CECBDCBCDDDHHFHHGFGKG>977887878;947766667568758>?@B>EEHIHI;7676548EMGFFBBB>AB=A@@DECEFDDEDDDFBCD?E:467779;:;?=988>H@><<;979:;ACCDFDDC?;<=BDGECA>@>B?C;8;<>===AEFEFHGEEDFFF>=<>=;<=<===><;<@BBB;=>>=@@;BGCEGGFGHGEGFEE?CHGGHHHHJLILKF=;=:;=88;==;=979;:;=EDDBEGEDBBBAA>BCC>>>;>>>??AA>=:;<;8;8:::;CEEKPMIFDEHHCAIGJJGGA>=:?MOJFB;=><;<<==>?<>BBDEC>>=;<<<;;=>=>=?AECABBDBFHFFHIKRNIJPOONQNLNNJHC@DBBDHJJIJLHKKGGIJJHHHDFHHABCFDBCBCCCEF?:<:9;989889:8899==FD>>AAAA>?B<9;;:8<<7:<:7<;8:@BF?77998?A5676686;BECCDBBCDCFIEFHEFJLH@;89;979;87>559768857:868:=??E@CGFKJG?9468649CHHHBBBC>@@>>@DCDDCFFCCGDAEBAEBF=797796897;<;77<@<:9;=>>AD?ACA@DFCBB??AAB@>AA=;>B9::87:><=?ECBFFGIEEEIDEB<=>=;>=<>@@=>=<>@B@B?>?>>A>?FFDDGECDEEFHFFBCGIKHGIHGHJHHH=9>;:=;9<<::>?99>::=BCECDDABDEB>BB?@C>=>>B@=<=;;>:::9:BCCBDGKKCBHLJKEEHIHD@@<:=>CKIB>;9;AA?>>=>?=<>=:<;:;<<=@><=>=:=<;?<?AA@?>>@B<?><>?BEFBDEEDDECDHJKMLJIIKRNKMMKKMLECDA=ADHGGLKMNNKJKLLJIIEFKE@CEECDCBCBEIA:9::8:999;89<:8=?;@B@@BA=?C=<<::;:9:;:9<:;:;:AEA9:;87BC?BEHJM@7755768@GFAA?DBBA@?@=BEDDEDCADGBCDB@FAD<7668756779;89>>@@AABC@@BBABGDBEDAEB@CA==<<@@<=@@;;979<=9;@@DGFEHHFEFEHCD<>??@@?>=>@@B@=?@@>=B@?FFBDCDBFAFHFFFEAEHFFHGFIJGGHD?;;;;==;=>:;@C@B?=;<@EDAABCBDF@?@@A@???@>>@?=@A@>=><=?<<>?CD??CEIHBEIHIMIEGHH>>@>;?;9B@<=?=?BA>@B=<>???<<=<>=:<=<==>>AA=?>=?@?<=?=>?;=?@?FEDGGFDEGEEGGHJJILKHFKLLNLILLGEHFA?B>BADEHGGJMKJJIJHIJGIC?CCDCDBDEDFF?:<;::;98::79;;<@?;>BBAAB?AC@>BC<:<96;;69::;<9::;=@BADFECDFDDEBCEC>E@<:7668625779@AADBAACDBA@CFC@ADE@DFCBC??A=:===?=;:=;6:869;>?CBCHGEGHHBCDFED;>=>=>?@?AA>@>=>AC?><;B?=B@@DEECEDBCEEGIHGF?AHHFHIFEGJCDF@;<::@=:>?<<@CDD?<8;?AD@?BECAEC@AA@>A>=?>>A@>>B@;<<==>:>BA>?>>CHEADHGHKGAAA?@<=@A?BHC>>;=<<>@?<=A?=BFA?A=:=<<=>;>>A=?A>@@=<=<;=<:<>:<;>:=A><===><?;;;88;=7:::9:<@A=<=BBDBCBBECDDEB=;;;:9;;<;<;8<9:=ABC?968;<@?567655?DGECBDDBCEEFJJKKLJILH?;<87;:7988:534665555577>89::<<:9;<<<<:;BAADDEHIGHIFEDCDEFF>>??>>>???@???BBBBB<;?A>=ABADECDFEDEGFFHFFF@EHFFGHEEGHD@DB=<;8==;=@><==BA?@BCCCEDBA@@AB?>?>=CB>@BC@;:=??@CBBHIHKKI@AA?=>:<=?BB>99;;==??=?;>>@?ACB@>::=<;=>7?A@@BCCBB@@B>::9:8968788:<=>=;<@?=BDCDDD@DBACB@@CBAEHGFICEDHKLKKJIC@EGIKGECBBCCB??A>>?=AGGFEEDEKHCEFEFGF@;;;<=;:;96979>@>AB==>CFBDBA@CEIEGF>9;;;<<=<<<;::;:9?DED=8:::=C>4556:<<9:;:9:9<9625864:<:8:??=?BC@DDIVIIIHHGDHHABAB@BBB?AB@?@DHEDECDECDCB<>FI>;;>@ACECA@@BAAICACDBDCEGGGHIIFGECD>=;>==@>?BCCDDAA@A>?DDCFCFKKKKHEFFCHHIFA=?@?>?>>@AA???CDC?<=>?=<>BBCFEDFGIHHGKJIGGCFHGIHGGGEGF=BF@;=:<;;>?<;AC@@AA>=?B@BDFFDFGCA@@DC?>=?@?@B@>@DC=9=<78A=7889:<@C=>=>>=?AFGFB=::<<>?=<>DACCBCBABCCA<8::;;9878998;>@A=?CCCBEB@@@?=<=<<==>>AKLJJHHB@FGHJKIC@EIEHKFAADCC@?AC@>>=?@CNPLPVOGKFBCCEFB?>=>=>BC<=:9@AEB?@?@AEDBCA?BFGHHGHD=:;;::><8;89;>ABCBBCA;:;99?B75779AFGGFBBEEA:76=IJKMLKKLKD=::;9:<89;;7466558::::?@;=DA??DFJHIMLHFEEC@BAA@BCC=?AA@>DGCCFEEEDCB<8>HHCA@??BA?A@@@A=CFABBECDGFEGIHGJHFACDCABFEDGGEGHGHGCCBDB@@CEFBEJJIIGEFECFGGFC>>>>@??AA@@A?=B@=;<<><:::?CDFFDFEIHEFIHHHGCBEGHHGGGEEEAAFB<:<:;<>;A>=@??BC@=@ABBEEABCBCGJKKMLFEBACACB=9:8>E@;<:9:=AA>@>???>@HIG@99;;<>=<<<@ACB?>@?AB@><<:<@>?>98:979@>;=<<<<<;BDFFGDAADGABIHDDD@@=@BBCBABA=@ILGLTFBGCAABEDDGD??>?DECEACHDEC@AAA@GGADGHJMKGHGGH@9:<;9><8;?ACEHDEC?AE@9;;9?B>4786CEBHI@BE>::<9:EGHJGIOIIH@9:;:;;:8;=<46446648::?B?=CE@=EBFMKIKIEDB@BBBAA?>A@>?@@<@GDCGC@A@AAB@AHDA?B=@=;BBAC@@BB@??<=<;;;=99:>CCDDCGDCHHCFFEGHD@FIEFHFEGFBEBCB>:9:;<@A@DDBDFDBCDA@BA>A@@>A=?@?=@B@?BC@?>>@DDAEFHLG>@DCA?BB?@CGD87>DCEDBB???A?>A@>?@>AHHB=89<<>:=<7:;>??>=@?>@?<=@>=@AA?<88:88??<>?@AABABA<>?;;>?<;>=>AELIFBA=>BEEBAB@AEBA@EAEDA?BA?CA@BCCAAB<;<=>BC<@C?@BAEHC@BC?AACDGHFFCACDA?BGGIMNLPKIJJGEID<9989???BEFIHDCEBAABC<:<;>@B;678?=?EFEA<::;?=;=>=BDACD>GOHHJFCB==;=<=A@?AAAB@@ADBAEB:;A?ACACEDEHFHDGIECFFLIFGGGFGGHJGDDEBGHJGFEGFGHEDECABB?CDCBFEGFEFHHDEFCDDCB??=>CDCBAABBA?=?C?;;;<888>B@BDCEECGHDGDDEEE?EIFDGHEFGCEBCA@<:<:<><<@??DCA=CFCEGFEFDACEB@DB?A>?=A;>CA<=BA@AB??>>?AFACIKE>88;<=@FB;@BFE=;AAADFFFEB?>=;@A??>=DHJ?9:<=<<:?;8<:9;9;;=><;==<@D=?BB<>:69;9AA;>CDA??@A?=<==;>A==@@=?ACJJBAA@AB@>BB>@BA>CF@=><9=?A@>@ACABBCCDDEBBABBBACKIMPNMQJHMIDEEA==>=CCEFIDDIFBFEBAA@BD<;>=:BE85;;9AEFHE89??<>>9>IJIMKJINID@>9::89:98>835543:@?@>;=CAAHD?DHEEFDCFA<>B=>C>>@@CFHCCEFCBFA9=BD@DGEBHHEFIFDGD@EE@AA<>BCEFDABDBAB>@CA<;@<8;8:BC@EEBCEECEFCEECEABDGHCEFECFFAEDA<=<;>@<@A<>>?BBBCCGIFFD?AEEDDCBDB>A>A=AD>=>>DEA=A@;AB@AADIG?89;8=EHE?>:?B;<@=>FFD?::<>:8=?9:=:48868888:::@=<::;::A=:?B@DF?=C@<>=<>>??@?;>AEFJJDCC@?D=@DA@GIACDFEEC@CA@A@?@?>?A@@CABCEABCA;=<;?A98?>?AC@?CCBCBBADAAGELKOMMNNKIHDABB@ACDGHDFFECCFFEECCBAACD>>>=9?G?89;?EECGE<:@>>>>;9BKLLLKKLIID>;=:9;::9==64446???@><;BB?CD@BEB?CGGGEF@=;:===>>=?@>?BABDDFHHFHIJHHGCAABFFIEEDFEHIGDBEHIKHGHFEFGHHJIEEGEHKIHKHDFFFCDC?CA>EHCCFEEFHEFH@@FB>@?=@@DFGDBDECBF==@?==@@=>;8@D>EG@ABAACDDFFDEEBDEGCCFDDEEBCF@<>?@AC@AA><;>BA?@EIGDFCABEDDCAAEB@BA?AA@A@@ADDA>B>?DDB>BKKC<9;>>HKIC??;<<99ADDECCHEAB@;9::9?ED@?<<:=;8==<;;868:78998;8:<=7<=:<=;<@@<>A==?<=EIA>AA>><?B@AAAEJIDFGHFDBBDA>A@<>@>=A?>@ADHIFDE@;??<>?;<>;9;=;9>A??@BDECDGDMKPNNMKHFDAACCDHGEIEEDECDEEEDBABCB@BABA?>??BE>8@FEB=BED>>;A>=<:<=9:<:=>9;<669AA<@><=:=?@A=BD??BABBADGIFJJJIJMIGHJKC@?CEDFIFEDDDIGEFFDDJKHIIGEHFGHJIFDEHIGFHEEDIFFFEBDDA@DDBDAAEEDFIF@AE@@?=@A@BFEBCDBEDD<<==>>?@@>::@C?DFAA@@@AACEECDD@EFCEDCBEDBAAB@>?ACDABBAA>A>ACCBFGCFECDDBBEAADDA@AA@A?=BC@ABCAAC>ADA?AFMMC9<=?HNEDC@::;688=@CC?;9;<=====;;988778::;:888:;;>:9<<<>@>>A?===;@EDD>GKFJIHEFDBCBA@@??@>?>>=@=ACJGDDB@@ABB@B====B@;;>@CFFIHDNMMLJHIDCFCEIEGIGEEEHGFFDDFC@BB@DDDBCDCEABB@DC@ED?@>?FFC>?>?=>><@INNLLLJKMG<<::><;<::<:>ACBB==B@=:;;EHHECEDCA@?=;A@>FEDAB@AEC@CD@>>EIJLIJMJJKLIFRVEDEBFECEGBDDDBEGFHFCHKIHJIHFHFEIIGDEGFHEFGFDEGGDFC?EC?DECB>BCBGCEGD?DCA?@AACACFECBCECD?::DIACDB@@@>ACEFEEEDABFGAFFBDDAACCAACCABCBADCFB<@HKFEIEEICACDBFDBBFD?@CA?CCA@B>?CCBDBAEB@DKMLH>:=AEBJF=><99:88>?===>:=?;:<99;98::8;9:9<;:?A@AA@BA@?><=>?DFCGKJGB@AACCGJGFHHCFEC@>??AA?AA=>A??=DFJKHFDAABFEBB=<@BAB?ABCB>=>>?@BHGEHJHDCEDEIHGIHGFFGFDDEFEBBECBCBDEGGIFBAFFBBEBCGKH?=?>>ACG>=>>;<@<;DKKKNKKNLGC>:;@=8679?DA@BA=>:?C=9:;BGB;=DC==>>?BACADCACBBBED@@??C?DKKKJLMKMMJHDBA@B@CCBGDBABECEFCDHEBFKKLJHIKGEHIFHFBFEBABFECEECFFCAABBCCCEAAEDAA@>?@CBECCC?@GLNLLG===A9;A><<::987:<;<>=<>:;<;>BBEGA=>><>>><<<;98:8878:88::8:=<:??<=??@CCEFDBA>>==>@DDBEC@CCCABC>=>;;CFDFJIHC=@BADFFCFEBDCA??<;=>??AD@@A>>>CHIJHFFDCEFCA>>@CEADCCCC@>>?@=@=BEFB>@=;<><8=FJLLKMLMIG>==A?<77A=<<;>?>=BEB<>CBBDABBABCEEA?AA??=@B;?CBFFEBCEGCFFBCGE@EJMLKIKJHJFFGIFBEECACCEDFEFEHDBBBCDDDEB>BBCCD@CADEBAABDBDCEDCCBDBBCD:7@FEDEFFFCCD@FC>>BEECDFCCFECBEEEGDDDBCB@?@FE@CDDEEDEBBBDDEFEEEEEEFDCDBDCACDB><9989===::99:;9==ACDC@===><;;?A;99;:79;97:8979:;==@>??>CCCFDEDA=@@?>@B?=@BBBAAA@C?;B@AEGHHIJFCC@AD@CFDEABEAAA>;<=<<==?AAAA@@EIJGIHDCCB>>>=@@>?@JOMNNLLJIJLKFFHHGFABCGCBEFFFFDFFE@CA@ADBCFIGEAFIAA?>CBCD?>?;;?>;:>GLJJKNMKKD>BC@=<>A@<9<>=<8>?BHD>DDDEA@ADCCJPOKD=@?>=?A=:;?A;@>IOJMLMKMPLID<:;BHIRRGJCBFIDBEDAFG?>CKKKJJIHGHGGIFAEE???ABBDCCHCCBCBBCCCED>AFAAGCBBAEFA@BCAAEF@CFAACC@DA9;BDCEEDGE?C?DBBBEEEFDCCCFHD@DDFGCCFDA>@AACB=AHCIGCBFDAEHDEIGFHFCEFBBDFBCBCA<7;BEBAA??AAACHE>ADKOLKG@>;;979;<<<8:9989;;=?<<;?AA>AAC@=<:;AC?=<=>;@?=@B?@B>>?>=????A?>=<@C@=?DA>;?@EGHEFJHFIEACB@@DEFBBCA@@=:<>=;;<<;=??ABFHHIGIHEFC??;==AB?@@>=??>?>@CB@BB=C>EMONNNLIHGGIKFFHDFGCDDDEDFCBECCDDDC@ABCDEGIFEEBFHA=?CEBDE=@<:=>;8;DKLIIHKLLHAAAA=?BB@AEC><<>A?>@ACB@=<=>ADFGKNHIMMJD=AC>@MLEC>BB9@>FHIMMNLLOKECDDIRQNPLCGGCBBDDA@@???<>EHLIGIHEEEEDEEDD@A@BD@BCBADB?BCBBCEEEC>CCADBBBBFBABACBACFEADBACAAAD?8BBBCB?CCCCDC@AHJKMIB<;:;:9=?=;;899977;;;<<<==@BBA@?>=<:=A?==<<:>;=>A=9998;96788799<:<<;@@@BA>?A>>A@<<=>=>=?@?>=<<=@>;??=><>?CEDDDJKFCFGA>@@CDDC@CA=;<;<<9:;=::9;?CEGLKGHHGECB@CC@B>>=?>=>??==???BBA@B;BIKLOMKKJHJJGFFHFFFDEHGDFFDFECDGECC?=BAHGCEEFFCCHG<>DCDDDD=<;<==;9=EIHGIJHKJGBB>=A?CHJJB=<7>?=BGG@A@=BFFFGFFKOKKKFHG>DB=?MH:?CC@:>?B@?@CCCHEEBFEFGCEE@BABDBDC??BBBACDCDEEDCBECBEBC?BFCB??EEACFDDFCCBDBCCFA;>CDFFGE;AFCEGEDFECDDDC@C?==C=>@?@BB><=@CCBCEFDBCEDFCCDEDGFDFFCCFCDEEE@=<:;;:@IJKLGA<9:<;8?<>;:9:96998;;:>?BAAB>=>?=;<;;@?<>;;<<;<>?;::97:;878;;;;<><?BA@A>?@=<>A?@?>>==<;:;==>=>?=>CC?ABB?=BIJIKLKKIEHIFGIFCFDCFGDDGEDDCACCAAAB>@ECBDCCEBAHFA=>=>EEFC?;=??<9;BHJHGJIFKJB>A@AEHJHGE@=:>DEGIC?DGEGJGFJHFGBB=CIBAC=@=?C??DDCEFCDDAAFCDDDB@A@>AB?BFFFDDCCECDCBAACEEA@DCBBEIBCBAAC@AADB<<<>@=<:;?DEDEDFFBAFA=CJHILG?;::=;9?@>:<;999:;===AAAAB?>>=>>><<;;??<<<<<<>==A<7;:9:;:9;>=>>;=?=ABFCDD@ADDCA>>>>=>?><@???A>;=<9:<:;??=?ABILIFFEDB?ABBA?C=;><;??:??==?>=?<;>=;<<=DBB>>A@?AGD???@AFGDCGGHI?@DCICBDAFECBB@BDHBCFDCBBBDEBDB@@C??@B??ABDCFBCDCCDBCC@AGGA@EEBBDDBB@@A?BBBCGA;=>=>?>@@CEJKJKJGCCCCB@ABCB?CECFCCFFACA@CDCDFECFFDGC?<<==<==;?A@@@@=@><@?;<==?>==<<==>=>?A:99:::;::=;=@@><>?@CC@ABBEGCCD?;@==>>=>?===@>;>?=<=;?@?>?A?C@>CHJIHEFGGB@AABB@<;<<<=>::=:<=<>DHDEEBCECCDDDDFB@>?>??=>=>?>=CC>BE@@B=;?>BEGDCFDCEFDB<;;CGECDCB@>@@E>:>A?BCDFEB@@ABCJFCIGEIA?GMPC:>@FECFJGDNLEDECCEECDGGKRHCIIHDFEEFGDGHC?==@DBCEEBEEEEGCCFEBADBBBCDBAABCB@BA?@CEDDBAEEDCCCAABDCBADGBBCCB@A?@?>?=:::>@?@@?BBCBCGKLJMLJKKFCDEB@BBBB??CCBGGEFDABBBCEEDEGEFFC?<=<;;=;<>;:<=8?@<<;:9>>>@>@<>@?===>=?A>9;=<=>ABCEDB@>;?><><=>>=>???@AABB>CB=?BB?CIJIFEDHC?AA??A>==<:;;9:;:<=;ACDABDABDCDCBCDD@>@?=>>=>==?>=>DJKHHJIJKGDFC=:97;AAEHD@@@?BA?=><999<>DDEDEFEEDCG?;@CCEFEB==?=<;8>GHIJHGEC@B@@BBCCBA@@ABD<<>=@BDHHFFCDC?CDFCEIHKLECGEGGFFCBCGIGGHIHFDEIHGFHIC@=ACCGHJHHEBADECDFDEGEBC?::<<<=9;>=>?>=<>??><==9==<;=@<>=;9;:9:;;:<>=?>>>>=>?<=>><=><=???=;<@ADCCA>@GA;BA;=EKKGFFHD@C@=?C?>@>;<:8<<89:;@DA?AC@@CCCEEBDEA<>>=>?<;>><>DDCEC \ No newline at end of file diff --git a/xie/xc/programs/xieperf/images/image.004 b/xie/xc/programs/xieperf/images/image.004 new file mode 100644 index 0000000..a893283 --- /dev/null +++ b/xie/xc/programs/xieperf/images/image.004 @@ -0,0 +1 @@ +ap‘cr”gv–cw˜au•]v–^x–f§h†®l‰«k‚§h~¤[p”MUwGE`>6E6/3/++//+3/+///////+/3+///+6/6;36>6;IC[GGjKIkGChC;^>;VCEcIKjpx‰S^‚S]„Xd„USqMMhGG`GEZE>I>6@63>93>@>OIIdIMoKSrIKpEEj>9Q93>3/993>93C@6C@9EE9GC9E@9E@;U;3C;6E93C;9U@>SIOrM^ƒQa…Od‹O`†Oc‡O[‚OcƒM[IVvIUvGUrIOrGMuGItCEkCCh;>j>;c;3U93O93M;/C9/;6/>;3>>3EE6K>6G>6>>6@9+;/+6/+++'#/'++'##'''+'++/+/3/993>@6C@6CC>KC6@E9I@6@;/>93E3/9++6/'//+//'/+'+3//3+39/93+663>93E>9I>6C;3G66@6/69/>6/66+69/;939>9C;9EC@ZCC^CEcG@c@>c@>Z@9V;6E93@9/666;;/696@6/9//39/;6/63/69/6;/6>6EC;MC@SEC[IKhMStKQyMMkKOpMOuIOtOSzS[|QZ�S^†S]�S^‚S^…UZtU[vS]tXd|]dqXfoZcrZ^lX]oQVfSU^OMXSXkQVhMXnKVrIStCIq@Eg@>^@9OC;O@;OC@[GE`GGcC@dEIfCEfC@d>;[>>[>;V>;IC;S@9ZC;SC>SE@XG@]C>QC;MC>O@;M9/@9/6////'/3+9+/39/@>6ME;U>;O>9G>6E3/9+'+''#''#+'#+''''++''+##//3;6G@>]IQuScƒVd…Ug‹ShŽVf‹Q[€MMkKE]E9@>336+#6'+3++3/+6/36/36+36339/99336+/3'+++/''#'#''##'#+'#/+'9//633;36>3@639;3;93;@6>@3;;3C9/;3/93///#/++++++/+'''++''/+33'6/+'++'3++/++9/>3/;3/9+++6+36+33//933;39;+69339/9>6@>9S@9UGKuKS|MQvIMuGKqGIgEKoEGcGEjECdIGfKKjMOxKU}EOqg|Ÿk�¥o�¥gzž`w�axž`yŸ`¥j†­r�´o‰¬k„¥dzŸZkŽSZ|GC];3C6666/36/6//6639;3@9/;63>96@>6>@9GC>XC@XC@VC;O;6K96I@>cEErKQ|MS}MQwOSwOKnGE^C>KE9M>3>;3>63>>6CC>QEC`IGfGIkC>X@9M93E3/33/69/993>@6G@3EE9I@9E@9I96E9/99/>6/6;6S@;UKQpSa�Oa€XnŠSd€Qf…M^|K`‚M[…IVEOtEMqIMrIKlGGpCGfE;c@9d>9X>6X9/M6/E6/;6+;3/;9/96/6C9K>9K>6I;6@3'9++3/+++''+'+'''#''+'++''3+33+/6/9C6EG;EC>MC6G@6G@6G9/@6/>6/;/+63+9+'/+'//'+/+//+//+66+69/@96E;3C;3C9+E33@6/;6+>6/66/66/66//6/696@;9IE>UC>UE>[@C]CCa@;V@9S>;O>3C93>9/963>3/33/36/69+9636>3>;+9>3>>6G;9CE>SE@XIGfIIdKGdIKhGGlIKhKMoQSpQSvS]ƒQ]�S]yQ[|Q]�S`ySZtSZpQ[kSZkVajXanU]tV^qU]kSXjSZkS]rU^vQ[uMZzCSu@Gj@C^@;QC;OC;IG@UICUG>[C@XC>[@9U@9M>9V>9O>9K;9E>6I93G;3>E6EC9GC9ME9IC;ME;V@;SC9X>3@3/6/+/3'3/+6/+693C93C96G9/C6/6++3'''+'+939+##++/++//+//'+93GC@]GKkSa„[o–[q˜Vo�Xq•]n�V`…UVrOKl@6;;//9+'+''3'+/+'3+/3+36+663/9/36/36++3+3+++'''+#''##''+'#/++6/33663//6+/9369/393;;3>;3>;6E;6E3/96/6/'6++/+++/+'+++''+++'/+//'+++'6//3/36/;93C93G63>6+96/36333//3/+6+/6+69+96+/9/@@6QCChCEjIIgC@[>;V>;S@9V@;XE>fC>`E>ZE@^GGhEIgIKkj lƒ§k€¢h|¢cz�`x—a€¥j…¬kˆ­pНo‹±o‡®h¤ao�V^~OMg@9O>9I>9@;6@93E>6K@9O@6Q>6O>;M@>OC;OC>S@@V@>MC;S>6K96I@@hE@nIMKS„IS~MQMKgGE^E>SE;QC9I>/>9/;>6G>;IE>XE@`C>a@9U>9G3/93+3/+39/;63>@6E@9GC9EC9K@6G96E;3C9+;3+996I@>XKQlSg‡VgˆXl€]lˆShƒM^„I[‚IZ‚IU~IQuIQxEItIKoGIg@E`@@]>>c@;]>6S93M6/G9/;9/;3/;6+99/>@6C;3I>6G63>6'6/+6++'+'#++++''#'+'''/'#6+/6/36/9E6EG;IE;KC;K>6C;/C9/>9/C3+>/+93'9+'/+'/+'//+//++/+/6/;3/993C93C;6I9+C33>6/;6+;93;9/66/36//93963;;6CE>XGC[G;]CCcEEl@>]C>XC;U>6I96;6/36/;//++//3//6/6939>39;/6@3>;3>;6@C;IE@VE@[ECZEEdIG]IGhIIjMMkQSvQVvSXxU`€Q[U`†QX}QXwQSkOXkS[lSZkVcnZckV^nVaxS^kV]qS[rU[nXcvO^zOXpESuCGlCGfC>SC9IC;I@;KG@OE;KC9S@;O;9I;3E>6M>9K99I99C9/96+9;6@@6>C9E@9C@9GC>KE>V@>O@6U>3C63;3+3/'3/+33/993@;3C93>6/;3+3+'/+++++++'#+'#/'+++//+/3'/;6MCInEMnUfŒ^rœ]tœ]r–[r–]n–[d�UVpOKcC6>9/+9/#3'+3+/6//3/33/36+66//3++6//3+'3+/+'+''#'#''##'''/'/3+39/;3/33/39/;9/99/96/9;3;>3C;6E;3E3/;6/9+'/''++++/+'++/+'+++'/+/3+++''/+//+39/@;6M;6I>6I;+;9/66/33+/3/+6+/9/39/96++63;@6IC>`CCdGEf@>U;6K96E93C>6U;3I>9V@;XE@ZGE`C@]CC^n„§nƒ§j¡h| h~¡d~¡`}¢d€¤h‚ªj‡ªl‰¤k…­d‚¥cx˜ar–S^�IKnEMo@@ZGElGKtIO|IMyIKuEMwEKpGIpGIgECd@@aC@^E@c@;[@>kCCqGGwIQ‡GO‰GS†IMyIEnGEjGCcE;ME9I;3>93@93;669>3E>3I9/E9/@3+33+3/+3/+66/96/>;3@@3@;3>;3@;3@93G93@6/63/663@>9KGM`VdƒZjŠ`r�Xl…Vh}Qa€I[‚GXƒGQEO|EOyGItEEgEEhCEcC@c>@`@9V;3I6/E3/C3+93+9+++6/66/9>3M>6U>6I;6E9+;/+3+'#+''''+/'+'+'+++/''6/6939@9@I;EI9CC9CE9M@6I;3E9+C6+E3/>/+;/+9/'3++++'+//+3+//+33+33/63/6;6C6/;6+;36;9/@9/E6/33//6+36/3;3963;@;GG@QE@OG;XE@^GIkE@dE@^CCXC;K66>6/6//3/+3+++3+39/;6/6>39>/9>3>9/99/6>6@>6C@9IC>QE@ZEC`IEgIGgMIhOSuQUzQZySZyQ[€U[‚OSqMSqKO`KMhOQfS[oQZhUZgV]jU[oXcpS]rXcxS`xS^rS^tS]uIVuGQqGIhCC^E9KC;KC;KC6E>9G@9K;6C;6G;6E;6G;6K36;66;93;6/996@>9@C9IE;QE>UC>OE@VECaE;ZC9M;6C3/63+9+'3/+36/66///+3+++/+/+'+''#'''''#+'#/'+''/6/66+>@;XKUwK[�[j�avœ[t™Vp–Zr˜Xk�VdŠOU|IId>6;9//9/+6+/3+/6//6/63/36/93/36/36/66/33++/'/+'+'''+##/+/6+96/993C66@3/6//3//36+/3/36/6;/>96G;3E63G6+>'#+''+/++/++++3/+//+/3+36+3/++3+6/+3;3E>9Q@9M>9M9/>6/69/99/63+/6+/6++6/69/963@@9G;3E@;S>9M;/>/+3+++++/3/33+66/@>3M@6U>6I>6I>9Ol…¤f€£j�¥f}£d~Ÿc~¡^}¤d~¤f�¨f‚¨j†«l†ªjƒ¨j€¥dy¡Xl’Q]‰K[‡MV‚IV‹K[�O^�M`�Ka”I]�KX�K[…KU…IK€GKuGGvEEk@Co>EvCGzEEyGM‚GO…EM†GKIGyEEu@;ZC;I>6;9/93/33/3//+///3+6/+3/'//'+/'+/'//'66+96/@9/>93C6/693;93>//93+/3+3/++3/9>6EGIcSawVcz^r‡Zp‚^n‡UfˆIX‚GS}GKvGKwCKrC@gC>UC>]C@`@>V>;V93G>3O63G/+69/;3+3/+393E>3IE;X>;Z@9[>9O;/;6/;/++/'+/++3'////6/393/;3;;3;@9CG;GE9C@9M@9O@9M>6M;/I;3O3/>3+>/'6++3/+//+//+/3+/6+36/963963;;9E;6E;/I66G63>3/96+33+/6+36/3C9GC9E@;KKCUKEMI@ZC@[CEaGGdIIjCC`EE]>>S>9I66>3/663;6/39/66/6>3;>/9>3;;3;93>6369/663;>6GC;IE;IGGdEGgIKhOSpQSrMS}OZ}OXuUXxMQlKQcGKaGG[GIXKM[OS`MS^S[lV^uU^hU`qV`pQ[tV`rQ^rQ]uGSnGIjGE^E>ZE;GC9G@9C@6>>6;;3E;6G66C96@6/;;6E96E66@>6E9/C>;Q@;QG@XC@]E>SECXICcIIhKGhGCV@>U;3@9+;3+36/66+33//'+++++'''''#''''''''#+'#/'/''/9/>;+ICEgKXK[ˆXl•Vo”Zt—Vpœ[q™Vk�UaˆOSvKIf@6C9/36//3+39/66/39/66/36/39/96/63//;396+3/+/3+++'//'/3/>;6O>6Q;6I66G/+3'+/++'/'++'33+36/36/C>3K63K93K/';+'+///6+96/;939;6>;3>9/6/+/3////6;3E>9Q@;O>9K>/C9399393/3/+/6+/6+/9/66//6/9>39;3@96C;3E3//+'/''''''++++'+/+39/;9/>9/93/;3/;h~žd¤f�¤dzŸ`yŸc}¢^x¤d€©f~§f‚§k…ªh†¨l…­p…ªl„ª]p–Uf�O`‰K^ŽMa•K`“Qc”Qg˜Od–Mc–K`�M]ˆK[�IU„GU…GK|GCoC@n@EvCG|EEqEK…EIƒCI~GI€GCkC@k@;a>6G;396/9/+63+'//+//+/+++''+#'+''+++/''/'/3+;3/@;/C9/@9/@3+66+9/+36/63+3/+/3/;;6GCCVQ]tUc~[q‰`tˆ[n‰Ud‡MX|GOyCIpCIl@EhC@f@@ZC>V@@XC;S96O96M>3E6/C/+66/33+66/@>9K>;[ECh>@^E@a>9Q;3E9/63++3++/+/3//3//9/6;6993;>3>@6CG9GE9@@9KC9SC;O@9Z@6V@6X9/I6+@6+>/'6/'3/+3///3+3936;3@;6@>9GE@U@;OC9Q;;O;3G93@6363/+9/9>3>G>IG>KKCZKCUICXG;SC>VGEZGGkGGlIInKIk@@ZC>S>;Q96@;6E6/99/63/3;33@/9C3>;3@;6>9/393693>>6EC9KC>OIGjIGhMKrQVuSVpMVyS[‚QZOXzMSoKQkGEZGEZEEUMO]KO^MQcOVfU]tU]hU]pSZqSZqV]lQZpOZkIQpGKhGE`@>UG9E@6C;6>;39;3C93>;6E;3M93@63E93G96I99E;6E;6Q@>[@>^C@]ECgKEhGE^IGaGIgKGkIGcEC^@9K;/;3/63+63+/3+/++'3+++''+'++'+/'+/'+++'+++/+393G;3K@@cMQ|O[…Xl–Vn–Xo•Xl’Xo–UfŠV^‰OQuIGa;6>9/39/33'/6/6;6;6+66/66/66369/69/39/99/96/33+//+63+66/>>9V>9M>;U99K3+9+'3''++'#++//+/3/63/;;/G6/G;3I/'@'+/3336/393@96@@6@;3@>3;9396+33+3;3G;6G;9G;6I;/;939;6>9366/69+69339/6@3;639;6>63;6/69/>3+/++3'''+'+'+'+'++'+3++6+3/++3+/6/;dx¡dyžcy¡^x ^wœ^vœ]v›^y¥[x¡d|¡d§kƒ§qЬpˆ«oƒ¬rƒ¦Uk–Qj‘Oa�Oc“Oh›QlœUoŸOlšMh–OdŽOc”IX†KU†IU…IMxIIw@@n@CpCCwC@oCEvEG|CEvEErECo@>f;6O93@6/39/;3/@6/6//++'++'++''/+++''+'+/'/3'93/6++96/>6+99/;3+63/66/66/63+36+66/>96CGEVMUqOVoXdv]p…Zl†Qa�ISvEKjCCd@CU@C[C;QC@S@;K>9O>9Q96K93I6/>3+9/+69/@9/@>>^GIqGSIOvES}GOxEEcC9M96C9/66/+6/39/9;6CC;KE;IC9MC6I@9CC9EE9EC;QGC`GCaEIqEGvCCn;9]9/M6+@3'6/+3/+/6/693>@9ICCQEEXGG]KMaOOlOOgEI]C>ZC;U>9G@9E@9EG@XMG^MIaMI`OE]IEXI;O@>SCC^EEdIKpEIrIOxIOqIMk@Ed@@`@;U@6O@6E;3>>6;C6E@6G>6E>6E>3@93>93@96>C9OE@^GEdIIqOQtQV~OXxU[}QZ€QZ}QV}KOnGG`C>OC>M@>GC>IIIQGKVMM^SUhMUcSXdSXgMVdOXrSXhQVkGMhIG]GEVC;G@6C>69;3;9/6;3;93>96C66G>9Q;9U;9U;>]>>[@;X@;`CCaEGqGKoGGjEEjCEaGE^GEjKGlMKlIGaE@ZC9K;6E939;396/33+//+'+'++'/'''+'/+'+3+36/;//993E>3M@@dIQ}KV„Uf‰Vn™Uk–Uk‘Oc‹Oa‰MUwGKjEG]>6C;/>9393+66/36/36/693>;3>;6@9/;9/;;6@93>6/>6/69/@93>;6I>;[>;[>9O66E+++''/#'#+'#+'/+'/3+/3+>93K96M93G6+I3+;6/;9/9;6C>3E;6;@6@>6;;6>9363/36/93/66/693C;3@>3E>9G66;3399+3>3;@3@G;G@9GE9I;396/36339363+6/+3+'++'++#'+''/++/++/+++++++/^ršZr™]wœXpž]r–[q“Xk–Vj•Xl”^ušay¡dzŸl…¬t‡©v‡©axœSg—M`ŽIX�K]�K^ŽM`�Oh—Oc”MfŽK[ŒI[‰IX‰GQGQ€GGlE@aC>a@;[>9XC;`C;]@>p>@lCCpECl>;^93O>6O93@9/C63E93;3/3/+++'+''+/+'++'/++/+/6+993G3+E9+@6/9///6+99/;3/69/6;39;3>;6@;3;C@KKQoKQoSawSa|XavQVqIIgEG^C>KC>I@>EG>MC@OE;Q@9K>6E63G6/@6+9/+9//693E@;VEQ~M`�Kf“Uo–Sn—Og�GUwIIjGG^>3@>3;>6CC>MKKhMMlMMpKKlGGfE@XC9CE;IGC`KMuKSzMXƒM`ˆMZƒGO~>>c>9V3+6++//+/93>C9GG>XKG`OM^OOnUXqV`VZwKOaMGaIIcKIdIG[KC^SMlVQoUQlQMlI@SICUC9I@;KC;MC@[IKuGMtKQuKV}S^„KZ~EMpEEj@>Z@9G>6CE;IC6O@6O>6K;6E;6>93;93;93@@9MC@ZIIhIIkMMoQUvQZyOZyKUpMVuOQoGIk@>X@9E;6@;6@>9@>>EC@IKIVMQfSVfOVgOXpMVhMUjOQfKO[EK`CCUC>O@;G>3;;3;6/993693696C;9G;6GC;]@;a>>j>Cj@EgCCpCCtCKvGMyIS|IKxIMpCE[G@[GCaMMxMMuKKjMIkGC`@;S;6C@3@@3>6/33++/+'+'+3/9;3@3/96/;9/C63E;6K;3I@>cGKuEOxIU‚Qa�OaˆMaŒKZ€KUwIOpC@Z>>O;9C;3@6/63+69/6966;3;;3>;3G;6@>6I>6G;6C>6E96G;6@93E93E>;U>>]>;V;6I33>+++''+#'#+''''+/'+/'+/+96+E63E93E9/S93E;6G;6E93@>6E@6C@6@>6;;6;;6>93;;3@3/63/6639>6>@9C96;;6@93;;+9C6C@9CE9CC9C@6@;39;6;>6;>6;6393/33/3////'/+'+3+'3++/++++'/+3[pš[n˜[o™Xk•Zj’Vg�Q]ˆO]‰Xg�[l•`užg¤o‡­o„­l€§^v™Qc�M[ˆIO‚IXŒGVƒKZ‹KZŽK]‘I^�IX‡GV�IS�IMwEGoGEnC>[@6Q;3K>9UC;d@;d@>k@@pCCpC>c@;c;6Q>6Q>6K>3K;6Q;6G;3;/+//+//'/3++3+//+63+36+96/>3/E6/>6/@6+;6/;6/96/;>3@>3@C9E>9CC6CE@QKQkKMkOXrQXoQZtQSnII]GG[C@QE@OE>QICVIEVE>O@9K>6I6/@/+63+9/+63+9>6SCEkIV�Qc�SoœVw›UušVt—O^‚MOxIMoE>U@>ME@UKIdKSxMUwQX€MMnKMqCE]@9GC9IECZMStMVSf�Xk”VfŠK[Š@It@@j93E/+33+3639@9EG@QKIZMKaOQlXVjX]~UXrQUoQMgOKhOOnQOjSKlVSpUUvVQnOOuKEaKC[G;Q;6GC;IC>^EIgGOuMVzK^…Q`‡M[‚IQtIMtGCcE;UC;SE;KE6KE;Q@9S;6K;6E>6G93@;6G@6MEC[IGkIKoOSuMOtQX�Q[zQUxSUxSUkGKgC@X>6>6/6939639@>CE>IIIXOQ`QXaOUfOVhOXnKOdKOaIIUCE[>>MC;O@9C>3993;6/3;39;3696>;6@@;QC@X@@f>Ck@ElCEpEGuCEpEOxIQ~IQyIKxGIlCE^ECUCC^KOtOSyMSwIOvIE`C@Z>9E;39@6@6/63++3+++'//+3/+36/>6/>93E63K;3O@6V;9VCEgCEhGMvKVMZ�IV…IV|KMpIIc>;M>;E;6@93@;3;6+99/6936;3>9/;>3E>9G>9M@9O>9G>9K;9K@6G;3G;3E;9I>9S>9O93E33;+'+'#''''+''''++'+/++++/6/@93S>3M9/Q96M>9O@3E93@;6>@9>@6@>3;669>3;93;;6@3333/3639>39>9>96;>6@;6;>/;;3>@9GE9CC9EC6C>6;;69>66;9996>6396/3////'++++6+33++3/+++'/+/^l–Xk’VhŽScŠOVOUyIOtMQzSV~V^ƒ]n�au‘h~¤gyŸctœXh•IQ~GMtGGuGMEMIVŠIU‡IO~EKzCKvGIuGGtE@cC>]C>XE9E>6>;6@93EC9M@3QC9]@>jE>lE@pC>k96X@;XE>]EC^C@`C@[C9M9366/63+39+/6++;/96/>;/E9/C6/M6+@6+C;3G;3G9/@>6MC6EC6EG>IC;GG;OGCQGIcIIcGSlKOjMMfIKcEESC>ME;IGC]IGZIEVKESI@S>9K;6G3/>/+66+9+/63/@@;]CEqGX„Slœ[v¡^}£]}¤^~¡Zr—UcŒO^ƒKUvKQoMVzOc‡XnŒZn–Zk�S^‚QZ€IKdC6G@9ECCdOX…Uc‹]q˜]w¡aw Xo™KVˆGQ}@>U;6@93;@9EE;KE@SGCXIG^KOhOSkUZwUVoOSdOOjUUrXUrXVv[X|a[a[‚ZXOMkI@SE>SE9Q>9KC;IE>QIMpIQtOZ†OcŒSdŠK^ˆO^…MVxIKkGEdCC^E>O@6O@9M>9Q>9O>6C;3@9/>>6I@6GC>VGCdEGfMQpQSvOSrMSxMSnMOlKMpGIpC@[>9C6/66/363;;>E@;EE@KKO`OUcOQdMQdMSdGMZEGXIEU@@Q>;I@9K>9G@3E;6C96C>3;936;6E>9I@;ME>Z@@hCCn@In@GoEEoCItCO}GOxGMwEIvEEnCE^C>V@CfGQyMV‚KV…KO}IKyEIoC@X@6CE;I9393++/+++++/+3/+36+96/C9/I;9V>6S>/K63M;6M96MC>`EGkEGuGQrEGhCCX>>M@;K@@U@>M@;M;6@;/@9/6636;3>@6I>6K>6M@;U@;S@9Q@6M;6G>9G;3G>6G96E;9K;6G6/9//3#'#'''''#+''''++'+/+++'/6+@6/K>6X;3X>9V>;Q;3;6393/33/+93693393;;3;6399//63993696;E6E@9@>9@>9E>9C;3>>6>@6C@6@>3;C6@>9@@9;@;@@9;96>;6@6393//3+;6/96+66/36/3+/+3/3VcŒUc‰Q^ƒMSyIGlGC`E@Z@@UGE]MMjSZq[d…[l�cn•[jŒOS}GGr@CfC@kEGvEK|EGwEEpEEqE@h>;[@@X>9MC;S;9I>9G>9>@6G;3963>;3;>3I@9^>;^C>fC@g@;d;9]C>^GEgIO|KQyKMuGEd@6E9/96//>3;>3>@6G@6X>6S>3X9/S9/I6/@;+O9/G;3@;6II;QK>QG@VE>UE;IICUEC`ECcEEgIIdGGgC>XC>UC>QE>QEEXIEZMCZICUG;S>9G9/C6/E/+3/+3//;63E@@hCEnI[…Oj”Qo–^y ]x›`z›cyžXj�Sg�Qa‡Oa‹ShŽZq•f|›f}£cy�]n�U`…KKkC>SC9KEIjOZ„UhŠaz�k‡«kƒ§`z¡Ul“Qf�GQ|GIgGE`GKdGGaIGaGCXC@S@;KG@VC>KE;KGEUOKdOKhXVy`[€f`…fc‹faƒ`[ySOlG>SG>QC3E>6GC;IG@SIEgGKpMV�OcŠQa‡QcŒOaŒIVƒKSyKOvGGkEE`G>XC>Q@9U96G;399/66/993>>6EC>VEC]EGfMMpMQvMOrKQvIMpKQpIKjGGdGGdE>V>6E;3E;6@>>GCCKIGUKKcOUdOXhOMhKOgEEVC@VE@M@;I;;I@9O@9K>9I>9M>9EC6CE6I@9K>>K@9MC>[>>f>Cd>CgCIpCEu@GrCItEIvEGx@ClC@l@@^ECjECoKQ~MUƒMX�KZ…KOxGInCCa@9I@9I6363++/+++'/'+++'33+33/;6+C96Q>3K9/C33@3/6/+9;3G;3O>;^;;Z@@[E@VEE^EGcGKfII`GGVGCXC9K@6C;6;@9GC;SE@^CCc@;S@;Q@;G@6G@;G>9E93C;3@96C>6K;6C9/;+/''''#''''#''#''++'++'#++/3+63/>>6O@>jEC]CCX>9E6/6//+6/39/39/9;3;;6;3/36/33/3639;69>6CC;@C>E>;E;6;@3@;3;9/99/393>@6@@9@C;GE>CE>E>9@>9>66;96C9/@;3@;3@;3>9/36/3636U^ˆS[ƒOXzIIqC@[ECV>9G@9IC9EEGZMUpOUzVcˆVa„U]„KMvECl@@lC@jEErCIwEEtCCfECk@>a;9O>9G;6E@6K;6E>9C>6@>6@@6@63;939;3E@3Q>9]E>cE;g@;`>6]CCcGIhKQMUOSyKKl@9E>3;;/>>6;@6@@6QC9]C9^@6`>6`;/U;/K;3M>3M>3O@6MI>QI;KI@VG>IG>KIC]E@`CElCCkEGcEE`C>[@@Z@>OE@UIEVKG]ME]GEVE>Q@;Q6/;/+;//39+@6/E66MC@dCIuG[„Mc†Qj�Vp“Vq›]vœ[uœVjŽSjŒQc†Og�Vo’`wœk€¡n‚ªhy�[jŒQ]ƒIKhC>OEEXGQvQ^‚Vj�`| c„«h‡©a€¥Sn˜Of�M[ŠIQuGMnKQrKInIIfGE^C>IC;K@;G@;E@6EECOOGcQMk]Zy`[gc‹jcŠf^|]Z}MKdIC]E>Q@3@>6CE;GGE[IKpIOvO[}M`‡S`†QgŒOc†M`ƒMUIOrIMoGKkIEfE@[>9O>9I;6>6/363;93@>6GE;SE@`EEaIIlKMpMMxKQwIMkKIcKKqGIhEE`EC]@9K>;G>9EGEVGEVKG]KOkMSjMQcMMaIM]GGZ@@V>>O>9M63C>6K>6K@9KC9O@;MC>IE;GE;IC>OC>SE>[@;^>>^>Ca@GoCCp@@rCElCItEGqC>fC;d@;[CCfCElGO€KU‡I[ŽIZ‡IS~GU|EGd@>QC9I///3+3++'+'++'3+'33/63+63+;3/E93M9+C3/>/+6++36/@;3I9/C96M@@ZEE^CG`GMqIQqKSqMQoKKgE@S>6E>6>C9OC@ZC@ZEGh@;[@9Q>6C>3C;3@;6>93C63;96@;3@63>3+/+++''#''+###+'#''++'++'#''+3+963E>6M@ChCCaEC[@;I63;3+/6/69399/996;;6;6/9/+3//'/++96;C6EE;I@9@@9C;6>>3;;/;9/99/36/39/693;>9C>9CE>IE>IC;E>9@>6C>3I>9K>6C>6@;699396/6SUwQQvMKpE@[@6I>6;96>66>;69@;EECQEC^IStIOuGIlGCdC;Z@>^C@fE>fC>kC>[C>SC9U;6G339;9>;3>>3>639@;KE;MG>S@>K>9I@6@93;93>;6O@6O@;V>9S@>dEGlKMtQZ„Q`‡U^}MSqE>M>3>;/9@9CC;OC@`EEpEElE>j>9d>6U>3V;3G;/G;/M@9QG;SI@VG;ME@UG;OE>[C>]@@d>CfE>cC@d@;XC@`@>UE;VGCVE@UK@XI@UG>S@;Z9/C6/I3+;93E93O>CjGOyGQ|GV|MdŠIcŠM^ƒKd‰Od‡Ql�Od�Kc‹Qa‡So˜Ztœ^y c}¦h�§av—XcƒS]ƒIQuKKkKKnO]…VlŽZn“fz£l†©n†¬`}¦]|¤]všUh‘Uh‘Vd„QaŠU`ƒV]‚KKkC;Q@;Q>6;>6;>/@E;II@[SIgZUta[yha�faˆ^[€ZXxOKhKC[G@QC6EC;GG>QG@[KGfIIkMQwKXQ[„K^…M^‚K[„M[‡MX~IU}KUyIGjCCc@>U;6I;3;>6;;3>>6E@9CE;UE@^@@aGChGIkKIlEKjGIdIIdGIjGGlEE`EE]E>SG@VC@[II]II^MMVMOcMQaMQ^KK`GI^@CV;6G;6G6/E96G>3C;6G@6GE;XE>QI@QK@OG@UG@[C>QE;U>;[>;^;>]>@`C>a@;f>>a@>h@;j>6X@;S96O@;]@>dGIzIS€KVƒKV…MSGQ|EEf@;V>6K3+9+'#/'#+'++'++'//++/'+/+363E6/>3';3+>/++++3/'33+93+>96K@@^GGjIQwO]|Q`„Sa‡QX}OUuGC`C9I@>I@;OIGlIGrEIgCCZ@>O>6C;/;93>;6@6/;6+9>6G;9E;9G93;//3''''#'''+##''+''#''##'+'/63C>9IECnIMjMSjIGX>9G93996@>9KC;Q>>M@>Q9;E6/6++'+++3/9;/>>6@C9EC9C>9C;/;>36;369/33/39/6936>6EC6IE;I@;M>;G>;IC>SC;Q@@S@;K@9I@6;93@;6EKGdIE^C>VC>O>3>C6>@9@;9>>66>9;;9@>9G@>UE>[E>^@9M>6K@9OC9XC;VC>^C9SC9M>6G;6I63;9/993;>6C>9GGEZOMaMKgKOkIGcIC^C;Q>3@93@@6CC>V@@`@EoIM~MV†Sc�Sa�U]‹OVvGCaE>U>3C@9KC>UECgIErGEvECv>9f>3U>/M9/I9/C9/C9/CC6KG;KE;K@>OG;OE;^C9X>9V>;aC@hC@gC>aC>]C;[C>KGESIGUKC^IG[G>X@;`;3I3+@3/@>;Q@>^CM|O[†Oc�Mf‘Mc‹Ka‚KZCQuEQwG[�K[‰G]ˆKa„Sn“UoŽZp‘Zrš^t™ZkŽS^�Q]�OZzS`„S^‚Uj‘]t•`xŸd€§j†«l†«j‡ªc}¢azž[v ^vŸ`u›]r™]n—]k‘Z^†KKhII^E;GE9EG6GE@GSMfUKj]Vvc]~d`‚c`ƒ]Zv]VvVMlOEaI@OC6GE>IGCKI>OE@QGG`KMoOUwMUxKZzM]ˆM[„Q`„Q]�MX„QXwKQxKKqGKaC>O@6EC9C;6@;3>>3;>9IC>Z@@[G@fEC^GEgEEgCCfECfECdCCcGEfE@^IGcIEdIIfKK]KE]OMfKIaMOaKKcGEX@CS>;M;3G9/C//;/+96/>6/>>6E@;QE9KI>KI>SG;GE>K>9K>6G93G9/G66@66E;3G6/M93K>3O6/>9/I6+E6/>>3K;9X@>jGGnEIpGMxGKtEGrC>c@9VC;M/+33+//+++'++'//'//'++''+'/+'3/'33'9;;I/+/''+/+3/+36/>;;SEKoKV~S^„[j‹Zn‹Zq“[g‹Vc‰IIaEEVCCQGG^OSoSUtMUoIKgIG`@9GC;I;6C>9G;3K;3G@>XC@X@>Z>;U66E+'/'''####'##'#'##'###'+'+63C@9KGGdMZyS]wQQcC@M@>G@9EGCSIG^MMhGK`GI`@;O3/93/63+/>/9@6CC9CE9@E;E@/>>6>;3;6/36/9;/>;6;>6CC9KC;ME>UC>QC>V@@U@9QC>XE>XE;V@6C93>;6EG@[C;M@6K>6G@6C@6;C9G;9@>9>>9>>9C;6C>@S@9MC9K@9K>6G>6C@6O@9I@;OE>SC6M@6K93E33963393;>6E@;KKK`UVvSVxS]|IOkIKkE@ZC9M@;XC>OECcC@dCGpIU‡O]ŠUd�O^ŽQ^ˆKSxE>XC;S;3C>6GC9VEEoEEoGI|EEw@>d;3O;3M9+;6/;9/@;3GC6C@6@I;M@;KC;SC>[@>c>9a>;dC>kC>jC>c@>a@;VE>UCEVCCSMEaGCSE>]@;];/M9/Q6/@@9Z>>cEQ|Qc�OcŽSn—QfŽMd‡M^€EV}GQzCV~IX†I[…K`„Sj�Sl�Xo•Ul�Xh�[jŠS]�U`S]ƒVc‹Xk�Zrœcxžf}§h„§kƒ¦jƒªg„ªc}¡d~¤^yŸa|£c} `w�`wœ]o’[dŠKQvKIdI>KE9EK;OGEUSKfUMl[Ur``~c^„ca…`Z|]UwQIlI>UK@OE6EC;GC>@G;KE>OCCZKIgGQqMUuI[O]„O`‰O]„O[�K]†SZ€QVzQUwKIcGEVC9IG;G>6@;6>@6@@6E@;S>>UE>^C>]C@^@@`>>ZC>^EC]@@d@@]G@XIGfIEZIIcKI]IE]MG]II]MO]KK`GE`>@S;6M63@6/>/+9/+69/93/6;/;>9IE;IE;KC6GC9G@9I>6I>3E3/;3/>3/>6/;6/>3+E//;6/@6+96/;/+33+6;/E;6V>9^C@cCCgCCgECl@Eh@;X@6M;3G/+3/+/++'+++++++'/++'+''+'/'+//+//'33/9/+/''++'/3+66/@>@^IQpQ]ˆ]k�^n“`u•]q˜Xh�Ud†KOtGGXEEQIGhOU~UZ€KZ€KQoII`E@U@9K96E>6K@9OC;]@C`ECfGIk@;];6Q//6+'/#######'##''###''+3/9>6IIKgQ]yUa|QSaGG^EES@;IIE[MOhMSqOUlKOnEC]99G3393+3@/>@6@@9>G>GE;EE3E@6@>6>6/+6/;;/>96;;6>@6EE;EC;OE@SE>QC;KC>c@>SE>]E;V@6K96E>;I>6>>6>>6>>6CC9CE9CE;E@;CE;C@>E@9G>6I>>M;9G@6G>6;>6@>9E@6CC9KC9SC;M@9I@9G;3>636966;6CE;GGEXSVq^d€]gŒ^n‘Xf„U^KUyKInIKnIIkMQ~KU|GV‚M[‡M]ˆO]ŒO`‰O[‡KSvGCfE>^C;]@9UE>dGEpEGtCEuE;g>3X3/;3/93+66+66/93/>>3CE9KE>XECdGC`EElCCn@@r;;a@9^@9c@6[>;]>9U@;ZC@XC@OG@ZIGdG@]@;^>3X6/U9/I@;X@CoEX„Vl”[r•]u›Ul–Sk•Qd…K`‡Ma‰KfŠQa�SkŒQg‰Qh�Oh�SdŠO]�Q]|Ua�Ua„Ug�[o•]q•avšc|¤g�¢c¥g‚¦g€¥g€¨a~¡d£c|£ax f~¢g¤f€§axœ^r˜Zj‹UXtOQoG>IE>KK>QGCOSKhVMr]U|ga…gc�f^„aXw[SlQG`M>QK;M@/@>9EC;CG;IE;MG@SKG^KMfKKkGUyKXwKZ�O^‡O`�K`ŒO]ˆU`†X`ƒOQrQMfOGXMEXKCUE>IE>IC;KC;Q>;S@9U>9O@9V>9M>9U@>UC9X>9Q@;UC;SC>XG@ZECZEEQIEUIEVIG]IKXGGVGCQ@@U96E33>6/9/+;/+93/63/693;96>@9IC6EG;GC;K;6>;6>6/6++9/+;'++//+/+//#3'++/'//'++'/3+9'+/6+93/;9/I>3G96G@6UC9U96O;3K6+;6+6''++'#3+3+''''++'++''+''+#+''//'3/#/'''+'+#''/'/6+;9/G@EgKS}Q]ˆ`n–aq—^t“`t•[n�Xf„OUvKMkIIaMQvSZU^ƒVc…S]~OSwKI[@;M@;SC>XCCdGIpGMuIOyGO}GGo@C^63@++/#'+##'#'##''###+++93G@>QGQqUa[k€X`vQVlIKaEEXKI`SShU[uU]}Q^}KSoEE[@>I669>/;C6GC;E@9C>9>C3C@6>>3@;3;93@>/@6/>;6E@6IG9IE>UKC[GCZ@;MC;U>;X@9O@9QC9I>9K;9K>69>6@>3>>3@@6@C6>C9EG>KI@UECZC@Z@>V>>M>9IC9IE9I@6@@;>>6@>6G>9GE;O@6C>6C3/633>939;6@E>QGEUV[t^n‹cqŽat‘[l�^lŒS]�SZ€MSpQXzQ[…OcŽOd�K]�K^‹K]ŠIS€MU„GSxGGpECjC>dE@aC@kEEn@>kC;f>6X3/;++33+3/'//+//++3+9>6EC>VIIkKSyKUwGS|GOzEK}CGz@@oC;f@9`;6Z;6S;6O@C]@>QG>^C>VE>]>;]>3S93]>;`EGqEIwG[‹Ol�Qn–Vq•Vl•Vl�Ug‰Oj“Sf‹UnŽ[t›Zp–[t—Xk�Qd‰Q]ƒMXwOUuQ]~UhŒVk�awŸa| f~§h�§f¦c}¤j€¤f~¥fy ayž^}Ÿ^yžg|¡g‚§f‚§g„¤g|ždv [k‘Q[~MQtE>UC;GE;IGGVQKjVSt]Uv][�aXwaUz^Qj`MhUC[I;KE9CC3E@9EC9>>6@E;O>;IC;EECUGEdEQpKUzIU}KZ†Q`ŠM^„Uf†U^ƒU^~SVySUlMMjQQjMKfKIhKG^EE[C>]@9Q>6Q>6M>3I93E6/I9/G;3I93G93G>6I@9Q>6K;6G>;EC;I@>ME>UECSEEVC>O>>K96E/+33+3/+3/+33+/3/393966>@6K>6>;69>6C;6;;3@939/+6/+3'++#''+'#'#'''++#+++/'/+'+/+3+'+/+3+'/3+//+33//6+93/66/@3/6/+3+'+''#''#'''+''''++''''#+'+''//'3/#++'//''339/+/6/;;3OCElKU‚Q^‡Xg…Vf‰Ud‰Vd�[fˆ[g‹S]�QXqMUrQZvV`€Vd‰Vd†U^‚U[yMOjEC[C>^E@fGGxGIyIUzMVƒKVƒKQy>Cg93G+'3#'##'###'#'###''3';;3IE@ZISySg†]j~^f€SVjKQcIIZECSGEUMQdS[zU]|QUyIOoEK`>>Q@3C@6I93;@3C@6;C39@6;@3C>3;93C;3C6/;;3@C6KE;KE@UI@XE@Z@@[>9M93G;3G93C;6C96E;6E>6;>6;@9C@6E>6;@9>E>KIEUICZGE]GIjEEg@CZE;OG>VC9GC9C@9@C9G>6G;9EE;SC;G@6E3/33/9;3;;3>E@SEEXX^z`o“gp•gxšZn“]o•ScˆUZQ[~S]�UcŒSg“Oa“Ma�O[‰IV‚GQKO}IS~IIqEEpEEoECkEEuEEqE@lC;a>3O3+>/+/3+3/'+/+//'/3/;@6MC>SKKtM]ˆO]‰Oa‹M[‰IXŠEO|C@jE>n>6];3O93I;3M>>U@>SE>XC>UC9];3S>6Z;9f>>dEIpCKxEV‚Og�OjŒQl–Vl–Qh�Sd‰Sh�Vg‰Ul”ay›^u˜]q“XdŒScŒQ]GOtKSvS[~Uh‰^q�axžf}£f‚ªg�¦g¤c|¢h~žfy¢`r˜Zu—[t‘]q�aw�g~¦k€¡k�¢d~£jz¡Zl–Ua…MUuI@VC9GC6GGEVSKnUQt[SuZVy`X}[Ot]K^]GgO@UG9CC39@3@93;@9C@6@C;C>9CC;EC@MC@SEKgIOrKUyM[ƒSaˆQc†Uf‡Va�V`~UXvSUoQSoVVnOSnQQoMOrGIaC@X>@ZC6X>6I>6K96M6/C9/E9/@63@3/>>3E93C>6I;3C>9@>6C@;CE>KC>KCCMC>Q;9O;6G3/33+3/+33/66+693>>3;93;;3G@6C>6;;3>@6C93>6/9++3+'/'++'+'+'#+#'#'+##/+/+'//'++'+/'/+'/'#++'#'''9/66+;/+63/69/9/+++'++'#''#'''+'++''+''+'++'/+'3/'//'/+'/+''+'+/+36/>;/MCEjKSOX…UfŠO[‚S[€Q[~Zd‹ZdŒX^†S^€Q^yUZrU`„Ud†Xg…Q[�SX|MMgECa@@[GCnGIvCKzGS~MX†KZˆGQ}CEd9/E++3#'#''#'''#'''##'+3+;;6KC>XMSrUf�Zl€Xd}QVoKQcGG[E@SECVIMcMSjOZwOX~ISyIOp@@X@6EC6C>6C>6;>6;E6IC9E@6E>3>9/>9/>6/9;3@@6CC;OG>VG>MC@O@;K>6Q93C;3@93@93>93C96EC9I@6@@6@>9@>3@@6@GCSIIhMKcMOuIMoGKqGG[GC`K@SG>KC;E@>CE;KE;K>9GC9O>3C;3>//3/++3//;3;E;IIG]S[y[f‡^h�Zj‰Vj�V`~Q[|MUxMVvQ[�Zg‘Ug�SjŒM`‰MX‡KU‚GK}GKxGQ~IGzGKyEMxIMyGKyGGuC@nC@g;3G6/;6/66/9/+//+3/+/3/9@9SECcQXSd’Vo˜Xp—Zt“Ul–G]�IQ€GIvC;^;3S93I;3Q>;M;;G@6M@9O>6U96M>6X;9^CEnGO|GU„EX�I]‰K^…K^…Oc‰Oc‚OZ~M`„Q^†OcŒZl”Vp•Xj‰Ud‹Oa†MZyKV|OV|UaŠXj‰Zp�ayŸa}§c~¥f�¦dz�f¦fz [r—[l’VlŒXn�]q�ax�c~¢j¤o†©l„ªg€£^qšOaˆKX~E@S;3;@3GE>QOIhQSpQOrZVwZSxVIkVE^V@UK9IG6>>//@+693>>6>@6G@9I@;GC9K@;IE>QGOrIQtISvQ[�O`�Qa‚Ua‡U]yUZyQVpOQrSQlVUoSX|KQuKQwIKnEC]C@aC>`@;S>9S93I3/@6/;9/;6/93/;9/69/C;3@6/;93993;;3@@9I>>IC;MC>S>9K66;63@9/;6/C;6EC@M>9EC@Q>;I;6G>3>;3993>;6@>6E@6C63;6/>+//++'+'#+#'''+3+63+93+@3+6++//'+'''''++'''''3+69/>;6I;6G>6I>9Q3/9/''/''+'+++'+''/'+/'//'3++3/+/3'/++/+++#''/'/6/>;3I>>]EIqIItEIkGIjEInIMuQXxQX}S[†Ua„U^€Uc†Zh�XfˆZhˆS^�MX}IIhE@^@>[C>fC@r@@kCKtEKxGMwGKt@@c63@3/9''#+'+''+'#'+'#'''6/;>9SC>^IQwSazVfƒU^qOVnIOd@CO>9G>6@>;MGGVKMgOZzIQxIQxIKhC;ZC;V@6C@9@;9>@3>C9G>6@;/;3/36/63//336>3@@6CC9SE>M@>I@9K>6M63>6/99/66+/6/663>E@OE9IE9MC>IE;II@MKMjOUuQVyQZ�MX}ISzGMcE@[KEXI@QG@OG@SG>UE>[@;V@9M>6G9/>3/3336969@9GIC[GKaSVwUZS`‰Q^…Q]~OQtIKfGE`GIfOUrSa…Qc‹Qg’Qa�O[‡GS}EM}GMvGO|GKyIM~IQ}IS�GMIIvEEdC;X@9Q93C>6E>6G9396+93+363@@9OECgOV‚Uk‘[užZv¢]x Zu Uk�KZŠKU…C;g>6U93M>6U66E99C;3G96>;3I96K@6X;9`CElGSES‚GXƒIU}GUyCSyGQyGQvKSp@OwGOrM]zM[I`…M]„KXzOZzKXwKVyOZ|Uj’[p•Vo›]tœay›`wœ[}£^xŸaz¡`v�Vn•Uh‘O]�Sd‰Qf�ar’g| k‚§p„§oƒ­nƒ¦fx�Vj�MZ‚EE]>6G>3M@CVKIhOQwVVyZV}VQw]IfQ9QK6@I6>E33@/3>+9>6;>6;@6CC9IC9IC;E@>ME;MEIkEKpISxO]ƒVa„VgƒXd�QZxOVtMQjKIaOM`QMcKMgKQqIQqKIlKKoGGjE@a@;U@9U;6O6/@6/>9/>3+;/+66+36+;6/;//66339/9;6>@9O@>IC9K@9I99E93@;3C>6;>6E@;OE>UCCUE@OC@V@;O>6@;3>93@@9C>6EC9E;3C63;//3'+'/+'+'/3/>9/@9/@6/C6+;/+6+#'''''##''#'''/+/;/C93I@>XECcE@a>;V6/96/3+++/'3+'+/+'3++3+//+33+3/'+'''/+/'+'++/3+96/C;3M@>`@>V>6I;3E99C@@ZMMlMOtS]†Vg�[g‰XdˆVa†VdˆSf‰S]‚OX}IMpCC`@>U>9V@6^;6X>;O>6VC9^@>X>>Z93E6/>/'3+'+#'++'++'+'+/3+9;6O@;QGMpMV|S]SZ}KShGI]@>I;3@9/6639>6C@@UIGoIStKXIOxE>`C>]>9M>6@;3@@/@@6E;6G6/9++//'/'+'/++6+3>3E@9M@;OC9I@9K>3G3/96/+6/+3+33+663@GCME@MG@QE>MICXKGZQVvSZ‚SZ…S]O[MQyKMgEEdMGaICMI@SKGZG>XE>Q@;Z>6C>6G>6G63693>>;@@;IGGdIKnMSxUZ|O[ƒKZ|IMrIKjGGcECVGE[KMkQ^€SfˆUk–O^�O]‡IUƒGO}GItIS€KS€KQƒIU„KS}ISGIrGEdE@ZC>S>6GC9Q>9G;3@93>;/;3/9@9SEEgKU„ShŽVn“^y¢`}¤[u£Ql˜O`ŒKZ‡ECj>;V;9Q96G96E96@93E96C;3G6/C>6Q>;c@CjGO|GV…EV~IV€GSvEMnEKlEIoGMlCKrGMnK[vGQvEQoIV|IU|GU~KSvMZ�OZˆUf�Vl•Uj�Xo•Zp“[r‘Zx ]w ]x�`r˜Xj–UfŠK^�Qc„Qg‹[l‹h~œk�¥r„¢r‡ªn„©c}£Qg’Q`ŒIIg@;O@6QCCXKIkOS|UV~ZU}XQyUE]Q9IE69E36C/3>/+>+6>6@@9C@6E@9GC;IG;EC>SE@UCG]IOqIOvQ`ˆUf‹UaˆU`€QZxOUtKMlIGSKI]MKcKIjGKjIIkKOjIKhCEaGGfCC`@>V;6M6/C6+993;/+//+36/;6/63/66+6636936>6CC;S@;G@>M>9I;9G93@;6@>6@@9KE@SKCZIGZOEVGE`@>M>6C>6C;6CC9OC9MI>OC9I>9C639'/'+'+/'363G;/K>3I;3K9/@//3+'+#'#'#'+''#''3+3>/I>9OCCdKKlKMn@>];3E9/9++'+'+/'33++3//6/6//33+33'3+'//+'''+/+33+93+993M;9O>9Q6/96/33/6;9GIEcKMuQ]ƒXhŒ[k‹Zg�UfŒUd‚U`}OXƒMZ‡GMuE@c@;X>6K93G6+E93I>6K>9M>;M>>U>6S96K3/63'3+'3/+3/+3///3'393M>;QEKnKSwOX|OVvGQgEIc>>I;3;>3@636;39>9GIKlIQxKUzIS}GElC@`@;O63;>6E>/C>6E;3C6+3''++'''''+++6/3>3;>9OE>UC;Q>;G>6K;3>9/39/66//63396CG@KICKI@SKG^SSvQQhXc„SaˆUa†VaˆU[}OSyKMfIE]KE]QGZKEXMGZGCSE@]C@U@>G@6G;6>;3@>;GECQIEfKKpIQwOX~OO~KQzIOnIIgIE^I>VE;M@;KKKjS[}Sc„UfŽUf”Sf�M[„IU|IOuIQwKQyKO|KQ~IMvIKvGEfGE`E@XC>U@9OE;QC;IC;G@6I@6E;6G;6EC>QIKzK[…OcŒXq˜]|¢[uœUl˜Sg�IVƒEInC@a;9O;9I;9E66E93>96>9/@93E93G66K>9VCCpCIrCOxEIvEGoEKpEGoCGrIIl@GkCEf@IoEIqEKoGOpGMrGOnKQ|KV�OU|SZU`‡Q]€OaŒSg‰Sf‹SkŒXo–Xo—Zk‘Q`‡Q]ˆIV~OZ€S[Vc†ak‘jx™l€ fyŸh}Ÿ`všSk“Og‹GOuEEaC;XEKhMVyOX‡QV…ZZ�VUyUE`K9CE36>33>/+>//C/;E6IG;GC;EE>UE;SE;IC@QG;OGGfGOjIQqU[…VfˆQ^xU`xSSpOOqGG]EEUE@OC@OCCS>CVEC[ECUEEgCC^GCcCEcC@c;9Q96E>6G9/>3/33/36+63+/3/3//+969;3;>;I@9G@>K@;EC>M;9E99C;6>@9C@6MGEUMGVMM]MKfIE]C;S>6@;6;96@>9GC;GG>I@9E@6I;6>333/+/3'9>6O@9U>6X@6];3M++3+'#'''''''##'#+'+9/C;6QGKvMUMSyGIkC>];3C/+/+'++'+3++3++6/33+66/33'/+++/+++'+/+/3+;3/93/;63;9/9/++3+3/++3/3>;QGE^MU|Qc�^lŽScŒSc‹Q]‡M[xKU€OXGIyCCj@>]96C/'6+'++++3//;3>@;S@>V@;U>;X;6E9/;3/;6/;3////36/9339>6GC>`EMpKU}IQlEG`>@O99C>6>;36939;39;6CECfGKwEO€IV‚GKzCGp>9K;6E;9I@6K>3I;3E3+3''++''#'#''#/+';/;@6M@9KE@^@;O>3K;6C;6;6//;3696@;9EE@KKCQOI^SOjX]~[c€Zf‰Vf‰VcŠS^~MUuOOlIG`KEXMESQIZOIcOKdKEXG>ZC>UC9K@6E>6C>6G@;KECUKIpKO|IV„IUƒKOwIOzKMpKGdMEVSE`KCZI@[MG^SXxUc‰Vj‘Vj—Sf�QX�KOxIKlIKfMKlIGgGGjEC[CCXC@X@;K@;MC;K@;ME>UE>SG@VG;MG>S;9E@6G@9ICCjEOtMVSf�Vq•Ul”Sj–Q^ŠMVvEIk@@V>>O@>M;9G;9E@9I@6G;3C93I>6G96M>9V@Cg>@f>>]@>[CCg@EgGGkGKrIIqEMwGOxGKvIMwGO|KO|KQrIQ|IIpIEcKIpIKuIGkIKlCKnIMuKS|M^‡S`ŠQcŠSa‰O[„OVIOuISuISxQUwXc†^kŠalŠ`lŠ[l–]n”Uh�VhŒKUyKMlGGoGKjMUxMX€U]‹UU~VV�QEaI6;@33>//C//E3>K6QGCZKIfG@XIGVE@OGCVGCVG>UCG]GOdIOpOX€S[wO[zSXvMKdKK`EC]C>SE>KE>OC>S>>OC9IC;KE@XEE^GCcGGaGGdECh@>S@9I>3;6/;3366//3+36/6/+393393;C9EC>KC@OE>SC;M;6C;9E96@>3>;3GG@UKEXGI]KGcGE[>>O;3;;3>63;>9EE;UG>M;6C;3@66>///3+/6+@;6K@9O@9X@;[93E'+'''##'#'#++'#''#+'/9/@96MEEhMU�OX€IQzC@[@>U93;+'+/+/3'/9/36/9939;3;9+6/+/3+/+++/+33/63+9/+9/+//+'6//6+9//36/9>9VECdKOuV`‚Ua‡Q]O]„QX�IU|GQ�GU€EO~CCpC;^;3G6';/'3'+'6/993>@6KCC]GEhC@`>;S@6K;6K93C9/66+66/63/69/3>9X@EdEKjKOpCEa>>X63>;/9;/;6//;3>93C@9UEEfEK}ES‚GM~GIv>;V@;V>>UE9[@;U>6K3+/'''+'+'''''#/'+9/6;6Q@>VGEhC@XC@`>>V>6>9/66/696E>9OGESGCMSMcUVoXa‚]d‚[h�Vk”Xc‡UZ~MQkKMdIG`ICXMEUSISSIcSMaOG[I@VE>QC;I>6C>/@>6E@9KC@QKKlKQxKQ}IOƒIKzGOyKKkMIlSGdSGcUGaQIdMIcVXzS[Sh‹Xn�Uh�QZ…KMoKIcGKfKGgIIhEEgE;UE>Q@9M>9C@9K@9IC;ME>SE@ZG@MG@UI>Q@;G>6@>9IC>[EGkKVyQ`ˆSd�Qd‘Sd�Q[€MX€GId@>O>>KC;Q>>K>>I@;CC;I@6K96G@;V96U@>]CCf@Cj;Ca@;X@@^@@]GGnEGpIIkEKrIUwGSyKM|IS}IU}GIjIKnGEaGEhIEdIE`C;[E>[>@`EGpEGrIQ}QXxS[‚UX�IOzKMuCIpEIrGIkKMuSZzU[zXgƒXg„XdˆZj‘XkŽVjŠOXyOSqKOtIUxIUwMZ�UdŠZ`„VSyM@^G6;>//;/3G6@I;KO@fIG`KMoKKnMKlKGdKG`EE[IC]GKgGOtKSxOXxSVrQXwOVoKIcIG[ECZ@>SC;MC9IE>Q@;G@9CC;KE>UECZGC`IMkKSwEKnC@XC@V@9E93@3/96/+6/33+6/+/969636>9CC;MC@OC>ME>I>9G6/>636969>6IE>UGC[ECVG@ZC>V;9K96>93;93>;9E@9IE9C@6K;6C639//+3+/6+C;6I@6U@9Z>6U93C'+++'##'#+#//+'#'#/+/9+>;6ICCaOU|OX€IQyCE[@;O6+3/+//++3++;3;;3>93>9396+/3+3/++/+//+33+33+6/+63/96/39+36/63/6639>9QE>UKQuQ^~ScƒQZ}Q[KUvIUEM~EM|EKxC@g>@a>9S6/;/+//++;/>;3CC9K@@ZEEkE@f>;U@9Q>9O;3@6363/99/@/++6+3>6SEGkGKgIKoEGg@>U96@;3;>3>3//9/66/;>6M@ChCEqEMwIIxEIv@>a@>]>;U@6X@9O>9S/++'++/++'''+''/'';/@@9VC>[GGgGIdECj@;V>6@;696/396C;6IKGXKEZKI^VXXaŒ]k�Xj�Vf�XcƒU]€KMgGI]ECMG@MOK]UIUVKZSMXQIcICXE@SE;IC6E@6E>9@E@VIE]IKoIOIQIO|IGqGIyKIqUMkXOh]SlZOnVIaVMcUZ~Sc‹Ul’ZošXk’Q`�KQoMMfEEZE@UE>S>6M;3;93;6/99/;;6@@9I>9KG>MI>QKCVOEXMCV@9I@9Q@6I@6M>;UCCfIQxKV€MSyIXKQoMMnGC^@9M;6G;9C>9@>;C@9IC;EC9K>9KE>V@CjEMpGIuGKyCKv@>[@>^;>SC;QC@VIGaCIhGIkEKqGEoGKkIKoECdE@aC;S;6O;3G;6@;3>>6G6/;93C>6M@>XGEgGGgIKkIEgE@[@Cf@@dC@fECdIG`IIaEG^KSoMQlQ[|Sf‡Uf‹Q[�Q]~MQvIUuQXwQ[}S^‚UZzSUvMC]G6C>36G9ISEdQMkQOyUa†Qa†O`ˆQX~KXvMOoIIcIIlGMrIQuIXzMUuOZ|GSvKKcIE[E@]@;M>9IC;OC9KE@OC;OE9GC;GE@UCC[KOqMZxQVzM[�IOpIE^@9K6/93/36//3+33/////6339/;>6@C;MC@ME>U@;I;6C63;6/993363@>6GC;K@>QC;O@;V;9M;6C96>93@>;K@;M@9@>6E;6@63;/3/3+/3+;;6G@6O@6Q9/@3+6''''''#'#+#+/'''+'3+3;/C>9QCEcOVyOZ~K[€IKgC@X93;/'33+36/39/6;/99/99/9;/63+/3+//+66/;6/;3+63/963;9/99/69/;3//63@>;SE@XIIpOU}Q[ƒQVyKSvKU‚GSvEU‡EM|EKC@n@@d>6S9/C6+;/+/93;>3EICXCCZEEhGG^>>X@9O>6G93@93693>@6G63;;3;>6OCE`GMnKUxEIjCG^;9G6/9;3;///6//6/69/@;;U@>`EChGIrEIuEGr@C`@@[C>aC>`@9O636++33+/''#'++3++9/9@;ZC>aEIrGKpEIuCCc@9O;6@;6C93@@9OKIUKG[MMgSXyU^‰Vd‡XdŠU`ŠU[�SVwMMgGG^@@KGCUMEVUOhVK^XM[UMcME]IEQE;I>3@;6@96>C>QG@UKIlKOxGMvIKyGChIIqGGfOKfXMj[Qg^MfXMfVSqXZ}Xc‰Xl‘Xk–Xg�SaŠKSpKIfC>OC9O@9Q;/C;/;93>9/C;6E>6MC;I@9IG;MI>KI@SMEVMCV@9K;6@;3I;6E;9M>6Q@>ZEGjCEgGInE@]ECZC;O@9G;6>;6;;;I>9@>6>C>IC9ME@[KKoGSwIQzIS€GU…GSEIk@@`>;S>6G93@C6I;;Q@;K>;QC;^>;[C>[>6O>6S6/>/+93+63//3+>6/9/+63/93/3;6IC9MC9Q@;U@;S@6K;3I;6G>9M@9MC;QC;O@;GGE^IG^MQwOX€OaŠQZ‚OV~OU~GUwMZ}OVzQ[~QSyMMoI>UG9EI>OOGcUSX[…[h˜Vl”Xk–Uj•SfŠO`…MSyIV}KQuIZKXM[„O]ŒMU~ISzIGaC;M@>M96C>9@G@ME>KC>SI@SI@SG>IKGZIMcSX�VgŠVk”Uj•MZ€KSw@>U3363/66//6+66/93/;669939>6E@;G>;G93;6/9//6/+//+33+/++393>;3@>6G>6O;;Q;;Q>9Q@;V>;X@>Q@>QC9E63>6/;336//+9//3+;93E;/C6/6/+6/'+''#+'##'#+#+/'+/++6/9;/G>9V@@cKS€MX}IUyIKhGEc;;K3/66+69/3>6>@6E>3C>3;;/963;9///++9396+96/96/96/3>6>;39;/>93996>@6KC>VIGpOSxKUyKMjGIlCGkEKtCI|CK�CEr@@p>>d>6I6/>/+63/69/>>6G@;XC>^C;c@9Z@>S@9M;6G;6C;366/6>6@6/9;3;C@^IOpMZ‚Q`ˆMZxIUx>>Q9/96+6++/6/96/69/;93K96I>>`ECqEGrEKtEMpGMrGEtEEdC@V;6@++/3+/'+'++'3'+6+6;9S@;]GGvEKvEIu@@l@6K;6C93;96C63@IIUMI`OMqQSrV`…X`…UaŽU]�SUvOUoMKdIG^C@KG@MK@QSI[ZQ^ZO^VM]SI[KEUE>K;6>9/693CECUIEXMMoKMyGM}GGtIGkGE`KGcUMfVKa^M`[MaVMdUOnVZxVcƒVk—[p—Vk“U`†OOuKKgEE`@9Q@9S;6K93E93C>6M@;UC;UE;SE;MI9GG;IICSK@OICUE;Q>9C>6I;6M6/G;3EC;QE>^@9V@@dC>UE>X>9G;6>>69>6>>9C;;@>3CC>KE9MEG`KOuIUyKX}MZ„IZ„GOzIIuE;c>;U>6G9/;;/963>93>;3@>/K96G>6K93@9/>6/6++63+/6/33/93+6//39/69/663@;3C;3C>6@>6G;6E63@>6K>6E;3C>6@>6@C>EE>UGGXMQqKSzQ[~U^ƒMZ€OVzKV|KV}KV€OVxOOnKGgE>ME;GGCZMMqXa†UdŽ[n›`v ]uœZr¡UhŠOcŠS^ƒK]O[ƒIZ„K[ˆM]‹O^…Q[ƒIU|IKjC;I@9I>6I@9GG>KE>KE;ME>KI@IK>MMMdMMdVc‰[n“^ršXo˜O[„KQzC;S6/6//66+69/96/63/9;6>;6@>;O>9G;9C;6;6/6++3++/'++3++3+93/993996C@9O@>X@Ec@@ZC@c@CfCC[CCXC;I;6E;6C333//+6//3'963C;3@3/33+9/+/#''/'''''+#/++'+++6+;93E;9OCElKOqMUyISxGInEEa@6O93;;3>;36@6C>9E>9I>3;>/;93>9/63/693>6/;9/>63>;6>@9@>6@>6;969;3;C9QG@[EEgIIuIMkGGjGGlEGlEItCGxCEw@@o>;c;6[;3G6/>3/33/36/9>6@@>U@;S@9O;9S>9K@6E;6G;3E6/63/6;3693;@9GC@cMU~OZ€Sd‹M[ƒKUw>CZ93>6//+'+/+++++3/66/;63C;9O@@gCEoCKvIS|IUyGIwECdC@a;3C+'3/'/+'+'++/''6//;6S>>]CEkEKyCGr@Ch>;S>6M9/>33>3/@MIZKKcIG^SUtQUwSUrMVOUvSXyMVpIIaGEXE@IE@QMCZQGSXOcVO^UOfSI[ME[G@Q@6@C9E>9EE>MMG[OOqSSzMOtIQrKElICdQK`UIcZK`UIZZK[XM`VQfZ]UcŠVjŒUl�Ug�UaˆMStKIgGGcC@QGC`C;]E@fCCdECkGElIGhKG[G>OE;CI>MG;OI>QG>QE@VC>X@;S>6G63E9/C;6E>3G@6S>;Q@9MC9K@6E>9@;6@@9>@;;@;>C;I@9GE9VGGfKMoGSxKV‚M[†KX„GQ~GEhECg;6I;3E9/99//3+63+6///6+9/+3/++3+63+3/+3/'63+93+69/;6/66399/69/363>9/;9/96+36/99/C3+33/69/993>;6>>6@G;IICSIE^IIhKS|OUzQa†M[MSyGSuMSwMVwIMrKKoIEkE@dKKlKOrV[„[l�]rž`y¥^}§]y¢Zv XužUn—Sh�OcŠOaŽKdŽMf�Sn”Qg”MaŒKX„KU|GE]GCZ>9E@9GG>KE@OG>QG>IK@SKEVQQtQXzXf’cw¢^u¡XpœMd�IV}>>I++//++636;/@9/>;6I@@ZCC]CC[EC]@@K>9I6/6/+/+'//++/++63@63;9/9;9G@>U@@cCGlEIqEMyEMvEQxCOoEE]@>M;9C66;966>3;6+69399/36/3/+//++#''''#''#'#/++++++/+3;/G93M@;^GKnGMpGIjGEcCC^>9Q;6>;6>;69@9@@6CC9M@9G@6E>9C;6@;6C;3@9/@93>93@;6>E9IC9K@6CC9E>6KE9MC;OC;[C@[@@Q>;XC9XC;^@>`@@n@>j>9U>3S6/G6/>6+>9/9636;3@>3@;6G;9K93E63@93GC9S@;UC9I@6@;6C9/993>@>MIIhQ]…Vh�[q–Uf‰O^‚IQo;6C6/6////++3/33+3/+3/+363CC@gEGrGQ€IZ‚IVIQ}GKoCC]939++/+'/+'+++++''/+33/>;6M@>dCEnCCq>>d>6Q;3G6/;/+33/6MI[QKcQOlOKdOOkQOnMMoOSqQUtSUrMMgKG]CEOK@QM@OQGUSK]UQ[XS`ZScVMdIEUE>OG;EE>SIEVOK`VQoVXzOVuKQqMIhMGkQIfUKc[ISVIfUIZQI[SKaS]zUa†Qh�VfŽVgŒUc‰KUwMOtIMlIIjKMkIMuIS}KU€MZ‡MZ‰QZ‡OSpIGZG;OE>OI>IICUG@ZE>]E>X@9K@6Q96G;3E9/@;6C9/@;6G@9IC9KC;MC>OE;GE9GC;E>>CG;KE>KGC[CEaIIoEIoGMqGO|GMr@EkC>[@6U66C6+39+39/33/;9/63+/3'3++3/+//''+'+/'3''//+36/9;/E;3;E9MG;IE9C;6C9/93///++3+33/33/33/36/;6/3@6CC6EE>EI>SKE]MKoIKoIMrOStKQvKIpIQoGOjIOqIGkECZGGhIIoMOqMV}Sh’Zu ^x ^z§Z~¨Z|¦Zv¢XtžVq—Xq”Qp™Qk–Ml–Ql”Oh”Qk˜Mc�Kc�KUwKKpIKoGCUE@VKCXKCVGCZG>MI@KMCUQUuQX€Vf‰]q ]qžVq™M[„GQy@;V//3///>3;>3C@6GC@]GIjIMpIOwGOrIOlCE`>9M96E33;+++/+//+6;6@@9E@9KC@[@CgCOyGV„G]ƒGZ…GX�ESwGOpEE^>>O;;E@9>@6@>3C9366/+3+//+3'''#'#/'''''''/+''''#/+33'63/>;6MCC^C>Z>@fC>a@;U>6I;6E;6@>6>@6EE9M>9E@6E>/C;6C>6C;3@;3993993@;3>>9@@9EE9CG;I>9CC9GC;OE9G>6K>6G96@>3E;3C>3I>6U;3V>3S9/E6/>3/@6+>6+>6/>6366/39/69/933;3/@3/;93G@;S@>UG>X@;I>6E@6GC;IGCQKKoZh‡^r–^wœXq–Sn‘MZzEE^C>S////++'++3+3++'+++6/@@9fEEqGVˆMa‡O]ˆKSƒGIpEEa6/9''++'+#'#''#+'#++#'+/++666E>9V>6Z>9];6K;3E9/;//3++/KKVQMfQI]SKfOMgOI]KK^QSoQUnSUlOSfMKcIKZGGUMIVOKXQIUXU`]XdZUkZSgQK^G@QE;CG@OKIXQOcVUnXXzQUzOQuSOfQIhOGfOI[UGXUE]UG^UKaSQnSUvX`ˆQ`ŒXk�Xf‹Q[…GQxKSxIQwMStOVzKU‚O`‹O`‘Sc“Sd�Q[†OUuIE`E>UE>MI>MKC^KC^C>UE>ZC9MC9S96C;3>>3C>6C;3G96CC9GE;KG>UICSKCVG;MGCK@@GG>OGCZG@[EEgGEcCCh@CfEEl>>]>>[>6M>6O/+33//3+/9+39/>;3;6/33'3+/+/++/'+/'+/+3/+93+66+99/>@6GE>KE;ME9E>6C9/>3///++3+36/6//33/66/99/>>6C@3@E;II@QGCVKMnGIhGMtKMpGGfGCfIIcEEaGGhGIhGEaEEdIQwKZ‚MZ‚Vn™[t ]y ]}§Zy¤Z|¥Vu�XuŸUr Vp—UoœSo˜Mk�Oo”Ok•Sn–Of•Kf�O^ƒOU|KQvOQjIIaMI]ICOGC[C>KG@KQKgSQrQ]UfŠZnšZo—Xn—IX~GOu@;M3/6633>3;E9KC;EC@]KQtKQtMX„K[ƒKX}GKhCC]>;O93C3/33//3+9;3@>6@IEXGGkCInCQ}G[†I^‡G^ƒG[�G[…IV€CIhCEc@@Q>;C@3C>3G93;6+33+++'/+'+'##+'#+'''#+/''+''+'+3'63/;;6G>9KC;O@>X@;X@6O@6K93>9/;;39C9CC9I@9E>9G>3@93>>3>936>3@9/6>3C;39;6;C9CE;IG;MC;E@6CC;Q@9G;3K;6>9396/99/;;/C93E9/C6+;6/@9+C3/>6/;9+C6/>63;;3>>6C;3>//663C6/C>9UC>ZECZI@aG@Q@9I>6E@9CME]KOxUf‰]q–`wž[ošXq–Ma€GKk@>V3/9+++'+++'+++/+'+3/;C;jEExKXˆOdŠM`€KZ…EKnCEa3/9+'//'+####'#''#''#''+'++6/C93G;3Q;9X>6O;3G9/;++3++3MM[MG]QKcSM`QI^MGSIGSOUjSUjX]l[`rV]uS]pUXqUVoZZpX]v[axa`u]VrSQdQKcIEOI@KE>IQI[UQ^XUqVVySVqUVwVMlSMnMG[MCXMCQOCQQE^OG]UMkSVvU^‰S^‹S^†OVzISyIUxKQxMX}Q[‹O^�Qc’Sk™Uj›Vj˜Xn™Uf‘Q]€KOvMEcIEcG@[KInKIgECfG>ZG;S@9G>6K>6@>3C>6@>3G>9KG>QKC]MG^UK^QI`KG[GG[GGXIEVKIaIGdECaGCk@>g>9V;3E6/G3/;6+66/6++//'+/++9/3@9G@6@9396+;/+3+'++'#+''++/'+/3'96+39/@93>@6MG;QG;K96@;/@6/36/;3/66/66/93/36/993;>6@>9GC;GC>IICXGCaGKlCEfE@XICVG>U>@QC>MC>QE>]CC^C@aGOyQ^‹Mf’ZvŸZw¡[w¤[x¦UpœUr¡UpšVqšSpšVq™OrœUoœUp›Oo›OlšQoœOh–Mj–Od�S`‹Sc‰S^�S^‚QUtOOoKIgG@SG@SMKfQVwS]†Vh“Uk–Vl—I[ŠCMqC@d;3G6/6636@6@E9GG>SGGdMZyOZ‚S^†SfŽUd�MVIMrEGh@>X96;;3@6/9;6EC9GC>SGGlGKvGV‚I]ŠG^‡E`‰G`‹I]ˆI]‚CQyCOtCG^@>E@6E;/@6/63+33+/+'/++'++/+''''++'/+''''''''3#6+'36/693>>6@;3@93;;3>>6E;3;;3>>6;@;C@;G@9K>6E;/;93>;3>;3>>3@;3@9/;;3@>6C@9GE6>C6K>6C;6>;3C;6>9+;6/96369/63+/3+3++'/+33+33'33+>++96+99/@;3C>9U>3>;3@;3@66;66@96K>>ZIG^GI`MI[G@U@>K>6C;6CE>KKMtUd‹[n‘av“]r–[u‘Sf‡MVwEIk96C+++'++++/++/++/63@C>`IMwM]…Qg‘Qg�MX‚EIj@C[9/9''++'/'+''''+''/'+#''#+'++393G>6];9[@9V@9O;3E//3///MKVQK^SM[OG]UI^SEQKESSS`[Zh`jdl‚]gcqˆ]l�^n�`n“cn�dqˆcf„``}[XpXSkOMkICZI@QMG^UUkXZq][Z]}^[zZVoSQuOIlICSK@QMCUKCVKCSUIfQSvOQyQZˆSZˆMSyKOyGO|KQ‚O`ŽQ`�Od�Qa�Oj™Sn›XpœUnšSg”Q^…IS|IOnIIkIGoIIvKKrGIrGC]GC]C@S;6E>3;>6G;3@;3I>9EICUICVQOkXUj[VkSSjMMdKK`KE^IG`IEcGKhGGdCCf>9U;6I63G3+;6+993C/++6/36/3>3;>6CE9I@9G9/>//33++3++/+/+'/++/6+;3+69/E9/G;6I@6I>3>93@9/>;3>9/6>3>>6C>6C;6E;6C;3@;3@@6GC>KC@VGEgIEnGIl@E`E@[E;IE9QC>M@9EE9KC9GC>VECcGQzQa‹Ql˜Vw `|¢Zw Vp�QqšQošSn•Oo–Uq˜SqœSvžUrŸQv SqœOl˜Qj–Oo˜Ur›Uq—[rœXr›Xr�Xk’VdƒU[|QSpC@QE@MOOgU[}Q`†Uh�Vn”Sk–IV‚CGl@>X9/;6/9;6>C9>C9@C9ICC[KSqKSyQ]…Uc�Xg�O]ˆKKqGMo@@U;6G@3@;3@;3@@69E;SGG^EMrES‚EZƒG^ˆG]‰Ga‹GaˆG]‰EV�GVyEKq>@MC;O6+96/66+/6+6/+6/+++'+//+++/+'3/+/+++/'//'3++/6/993;9399/96/39/9;6E>6E>6E>;G@;M@9Q>9M>;G@6E6366///+36/99/66/66/;>6@@6>@9@@9C>6@93;6/6;396+96/;6363+36+3/+/3+'/++++#/'//'6++;3+;6+>9/C>9K@9I@6CC6E;6>;9K;9MCCVOMgIOfOKgG@K@>G9/996;C9EMKdV`zXadq‘[o�Zn’Vk�MX€IQq99O++++++/'3'''++/63@G@fIO}O`ŠOf’Md�MZ…GIlC@]9/>'+//'++++'+'/++''##'+#'/++6/>9/G>;Z@9V@6V>6I639639OS`QS`QOfOGXQK]OGUKCQUUd[]ocjzfq…hqŠgy“fwžj| k| fuœct�anŒ]`‚[^XVlQKhKEaICUMKZOMdVUo``�[][az^XwXU~SMnMCVK@OK>KQ>KM@QOE`SOrOQqMS€KOzKOqKMyGO}IMzMZŒQ^ŒQ[ŒO`�Qh”Vl•VnšSk–Sj”Q`ŠKV�KQtGKnGIuKKwMOrIQyIKlGEaE@Q96>>6>;3>>3@9/;;6@GCQKE]UOf]Xl^[uXVrQShKKcIG^KK^KGfGG`GEaC@]>;Q;3E63E93G93>6/9+/36+36+3@3>C;QG;KC9M>/>3/36+3939/+//'//+;3+96+>;/K;3K;6M>6M>3@96E93>9/9;3;E9IC;IC;M@;M@6G;6C@6I@6IE@[EE^GGcIMvCEd@EhECdE;OG9MC;G@9E@9I@6KC>VGEjIXS`ŒQl–Vv¡Zy¢VvžZp›QlšQn—Up™Qj”Ok˜SlšQržSnšUt›Sp›Qo›Qk“QnšSpœZtœ]y§]y¡axœ]q˜^nŽZg‰OUrCCUE@MMQqV^‚Sa„Zk�XošSk“G[ˆCKj@@X6/66/39/;C9GC6E@9CC@[IOqQXxQ]„Va‹Va…OXMOvKKlC@V@;O@6E;/>;6C>6;E;MECaEGjEUGZ‚G]†E^�G]„Gc‹I`‰K^†GV|EQ|@EVC9I3+6///3++6++3+33+////6++/+++#33+6//+6/63+6++//++;/;;3>;3>;/6;39;6>>9Q>9S@>V@>UC>X>>O>6G@3E63;636/+//+33+36/363;;6@>6@@;@@6C96>3/66/9;3;3+96/96/93+6/+3/+3/+++'+/'++'+/#3/+93+99/C6/>>6G@9I@9C@9E>>G>9Q>>QKI[QM]OOcMK[E>E>9E9/993;>9>IGcX]rU`|an‘]n�Vj�UkŒKXyISq;;O/++'+'/'/++'/+/;6KIEjIKyO`‹McŽM^…MX€GIjCC]93@++/++/'+''++/++/+'''+''#'+'3/99/K;6K>9M>9K@9G63693>SSfUQcQQgOK]G>EK@GQISXVd]]oan�fw�gy˜q‡¥q…¤tŠ­t…¯n€§h|›hr�`g‰Z`‚VXoOOoMIgIGgMOjQZrU[~Za…Zfƒaaz]`�]]€ZZwQSoQMaK@OM>QMCUM@MSEaOKlKKqKEdIElGCnCEfGIxIQOUKVKU…MZ‰K[‡Qc‘O]‹Qc�MZ‡IU†IQxIOzMU€MU~MOuGMyIKpIIkE>S;6K>3@;396/3/+3936G@IOIZZUp]^q[]pXZrOOdOSgMGZKG]KEXKIaGCXE@[@;M@;S@;O>6S>6M;3G63;6/3939C9CE>OG>SC>M>/@3/63/33+3/'//+6//>6+@;/M;3X;6U;6Z@9V@6X63E;6C>6@@6GI>OKCQI@IGCSGCZC@SC>OE@UGEdIMqGMuIOwEKw@ItECfC>O@6E;9C>3C>/>>6@C>SEEjGUySg’Ul™Uu XtœVuœZp˜Kg”Qh‘M^ƒOcŒIfŽMd”Ql™Uo—Qn—Sl—Qh“Qh˜VqœSt�[|¤d‚§f„­d†ªf€§k}œ`r‘Uc€KOZQQdVZwXj�[l’`q–]v�ZtœMc‹GSuCEk;6G3/363;>6;C6E@6G;9ICEUCC[KOxQXxOZ|SQtOKlIG^C@Z@9GC6G63>3/6;33;6>@>ZCEgEOuGU�IZ†E[‡G^IZ€K[�I]�GX}IU|EC]C@Q3+93/36//9/69/9;6;6/69396/63+;93;93>9/>6/;3/63/3;39>6>636@6E@;E@;SC@XGEdGGhEGgEIhEEXE>SC6O639/++++++'+++//+36/>939@9C@;@;6C93;6/66/96/63+6/+////93;3/3/+//+'+''/'+/'//+6++;3+96/>9/@96@;69@6>E;I@@OC@UIG]OM[QM]OOaKIUC9C63;6/6/+3;39C9IOSgSXh^duVd}]o‚Xd…OVpIMp6;M3/3'+'/'/////++;9EE@fKOuKZ�Md‹Qd†KU€IIlC>d93@++33+/+'++++/++3+##''#'##''/+6/';96K@9S>6G>6C;6@>6EZ^ySM^OK]MGSICQKGUQKUVQ^X[fag|hy”h}šoŠ­u‘³t‘´t‹²t„¦n‚¥j|™an�ahŠX^QVxOSuKMkKVxQZ~UgŒ`n�^lŒcp”co†clŒ^gˆX]ZXySIdM>QM@VI>XM@VI>VE;XG>[C;MC;Z@>^C>[@@ZEC`EC`GGnIOuIU�IS}KU…MV‚GU€GMxGGtIKxKM|MSMU€GS}KIkGEfE@[;6E;3;9/;6+6/'36/6C>GGEIVXnZ`u[`wZ]rOOhIKdKEZG@IMCUIG[E@QC@[C>ZC;S>>[@>UE>[E>X>9I@6G>9EC6@@9IE;QE;S>/@63>6/63+66/;6/>6/I>3Z>3Z@6c@9h>9`C>f@9d;6X>6Q>6EE;KI;MMG`KGUICMICZGEaGC[KGaMSlOUxKSyIU}EMtGOyECcE@QC9I>9C@6C>6@>6>C>QGE`GOrK^†Md�UqœSn—VpšSl™Oh�Md�K`ˆI`‰Ic�MaŽKk“Od‘Kf•MaŽK]‡Ma�Vn—Xqšc}¤h‚¥r‹¯uޝrŽ®g¤cwœZh‡U]vU^|Xf‚[p–cw˜jz£hƒ¦g~¤]r›Oc†KX|CC^;6C93;@9E@9E@6I>;I@@Q@>MGC[IIfIM]KEVKEVECZ@9M>6C9/96/93+93//3/3>6K@;V@EjEQyGQxGU|ISvIV~KZ|MZ}MZ‚KVIUrGC]>6O96;;39>3>@6EC6@;69;3;;3>93C>6G;9G@9O@3O>9M;6E;39;36;3>C9EC;ME@XGEhIKuKVwKS}MQyGMjII`G>O6/9+++'+++''+'+/'/3/996>@9EC;K@9M;6C63;9/69/;3+>6/66/63+63+6/++/+'/'/+'+/'/9+C6/G;3O;6K;3E;6CC6G@9EC>SEESIKaIG^KM^KIOECO@;G939+///'//+/6/3>3@GEMOQaXX]X]kV^lV`vIOjGId;9@3+/+++3+36/693;;6EIEfIM|MVzIZ„KV~KQyEC]@;[6/6++3/+/++'++//++/++#++''''+'/+3/'96/@;3E96>;6>;6G>6G]dyVVgQMfKEQMCQK@QOIXUSaXVd]gxjw�j}œpŠ­t޲u�³w޶q†ªp�£jy’do’ak‹XfˆU]|SV|MSuO]ƒS^‡VcŠ`l‹dq‹ct�j}—hwšco”`gŠZ]€UKgK@[K>OI>XK@ZE;OG;Z@9Q@9I@9KC>XC;Q@>QC@X@;QC@`GIkEEnGGoGItKMxIKu@GrGEnII|IQ|KQ}KS€IS€GIuGGhE@X>9I;3@6/93+//'33/3C;EE>KSOd][jZ^xUZtMQqKIcIEZE>KK@OG@OICXEC^C@QECa@CfCEaECcEEc>;I@9G>6C@3@@9IE;GC;M>6E96>6/96/>6/@;/E93Q>3X@6]@9aC>l>9fC;gC;f>9Z@;VC>QC;II>SMG^MEUKG[KC^GEaKIfMKkKMjMUtKSuIQEUEQyGIqC@UC9K>9E@6E@9GC>IEC[EIjIXzKa‚KcŽSn˜Qq—Qo”Uj•Oh“Mc�K`‹K]ƒI^…M`�Mg”Od‘I^‹K]ˆIZ‰K]‡Uj–Zt c} nˆªp‹¯uޱl‹¬k�ªdzœ[kŠ]h†Vd‚]j‰`q’d|Ÿl‡«p†ªn…§f} Sh‹Qa„EId;9E;9@C9EC;K@9E>9I>;IC;KGCQGEZIGOKCXGCQE@S@9K;9C936//33/36+/3/3;3>;9K>@cEIjEOtGSyMVxKXyOUtS^„OZ~SZ|MZxIKcE@]>9C>6>@6@@6EC6C@9C@9E;6E93G>9GC@SC@[@9O@;U>9@9339/396;VSdC@KECZIKrIMyMUyOZ„MX~KQtKIcIC];6C3+3''++'++'++'+//3;6CC>QE>S@;S;9G93@6+99/;6+99/;6393//3+63/3/++/'/3+33+;;/I93O>6O;6M>9O>6E>6C>9CGEXII[KK]IK`IIZE>E@>E93>/++++/+'+'+++++9/>E@IKIVSU^Z]lSXfVZjKIZEE];6>3+/++39/993;9/6>9KE@cEMxKZƒK^†M[‡IOrC@[ECZ6+3/+63+3+/+///3//+''#'+#'##'#+++/+36/>;3@93@636;6C;6CZ^vXXkQSaMIZI@OK@MMEUSO^VScZcz^rŒdw™h†©l‰²r�²qŠ­n„©f}¡jz�ly�ft›]o‘Xd‰XgˆQc€Vk�[o�[t˜`r”aw“j€ pƒ«q‚ªj|�hp–ag�UU}QE^G>OI;IE9M@9O93C;39>3;93@96G>6E;6;93@6/3>3EC9SC9QC>cE>fC;^@;]>;ZC>dC>fGGhIItKMrIOyKInGE`E>V@;I;6;6/63/33+96/6@6@C;@OKaQShSSjMQoGIaEG[E;KE>ME;M@;IC6KC;UC;OECZEE^GG]KGdEE`CCV@6C>3@;39>6EC6G;3>9/966>;3@;3C93@;/M;3Q@6]@9^@9a@;d@9d@9a>9[>;]C;aC;]C;SG>SI@QGCQGCVICVKIhKE`KIgKMfKIlMQvKQxGQ|GQ|IMwGGfE;V>;@G@OGCVIIgMVoOZzM^ƒSl�OgŠOk”Ol˜Ok–Od“Ol–Uh�KaŠKc�Ic‹K[‡I[�M[ˆG[ƒEO|EOrMU|K[zOgŒav“k€¦l‡ªk†«lƒ¦n�¤g}Ÿ^w›[q–[p–`q–axžhƒ¨o‚§o‰«l…¨h�§^u•XgŒKUt@C^@>QE>VEC[C@XC>U@>OC@SC>MG>OG@KMESKCOG@M@9E93;9/9/+63/63+++++/+/3/9;6I@;XC@ZGIjIGgIIdOMgMSoMStO]‡Q]�MV„KOvEE[G@S>9GG;KE;EC>SC;K>9IC>XCC]EGcGI`MKkGG^C;K;6;93693;C6G@9ECC[KMtKQwOZ�S^…U`…OZ�MMgIGc@;G6//+++''++'++'/3+6>9GE>KGCXGEc>;S96@96;9/99/;;3@9396+63+33/6/+/3/96/;93G>;f@CfGGlGEfECg@>O@9GC>OIEaISqGMuGIfECS>9E63>6+3+++#''+'+#''+''/+6@;GEEMOMSXU^VXfOQXEESE@O66>6//6/39/9939936@;KKIlKSvM`‹OdŒK]�IMq>;O99G6/33+66/9///6/36+//++'++''#'''//33/>;3G>3I>3E93;6/993>]f�X]|VZrSMaIESKEOKGZQO`SQfVf~^q”dxšg‚ oŠ­rНp†­nƒ©nƒ§k€ t€œk~ gxŸ[p™Zp™^r™]r•`w—dz¢c}£d£k„§r‰ªtŒ¯o‡ªgy¤dršVVyQKjKEfI>VE9I;6G93>;3@;3>;3;;6C;36;6;;3;>6@;3@;6>;3@93@9/C6+;9/;6/@>6C;6IC>ZGEjGGcIKqGIoIIgC>U>6K>3E3/36+9/'6/+3936@9EK@SMI[MKZIK`@@Q@>K>3C>9>;6>639>6C;3G>9KE>XEEaGGaKG]IIdC>V>6K>6G>3C93@9/;93;9/;96E;3E;6C;6I@9X;3Q>6S;6M@6[@6X@6Z@9^>6X;6S@;SC>OC;QC;OE>OC>MC>OG@XGEXICZKEaEEUKG[KMhKOyIVƒGVGOzGGnE@g@EVIK`MQuQ]vSc„Vc‰Sg�Sl�Sl”Qh“Qj–Mc‹Of�Mg“Md�Md”I`�I^‰M[…GXIQzGUzEGh@CcEIkIQxK]}Zn”`t˜dxŸcxŸd~£fy fz `u™awœatšcxœdw¡f~§n�¨j‚¦g€ j�¤`w™]p†M^†EMnCC`GEcGEcGElEEfGE^IEcG@SI@UKGUK@OKEVE>IC9C6399/9++3/+3/'++++3+/++33+9;6C@9GC;SE>XGCQKCUMG^MOnU^zSf‡S`ˆU^ŠKQtII`>>G@6C@9GC>MGC`@@[ECcKKfIQkQVoQQjQVkECK;6>9366/6@9E>9EC@VIGlIKqQ[„XdˆUc�O]„MOrICZ63>3++#''+++/+++'+//6@;IC>QIG]IEZGC[;6G;/>9/9;3@>6C;6;9/963>6/;93>;3K;3I>9[GKzGSIQyKSIMrEGcECUKMcKQtMX€ISqGOo@@[;6>//3++++'#''++'+''#+'#+'/939C>CKGSSUdOS]IO`IIUC@Q96;;33>6>>3>;6@>9EIGcOSzOZ‚QfŽSh‘QdˆGIl>9I93;3/33/;6/96/>6/63//3/+++/''#+++93G9/E>9Q>9M@6K93;6/693@^h�[azX[uQM`KGUOGQMK^SZoVZo[k‡dz�fy�gƒ£n…­kˆ¯o‰¨pˆ¬rˆ¬l€§n€¤n€¡h~¤cw—[p”au™`xŸ`z�ax�c}£d¤l…¨p‡ªq‡ªt‹¬kz¢cq–XXƒOIfKE]G>Q@9G;3C63;93;;3;93;;6@>6>@;;>6@@6@;3>;6>;3;3/66/33+63+3/+9;/C;6E>;KIEjGCcGKqIKwKKpE@`;6I;6E6/66+33+;//3>9C@6EICZIG[GEUGE^@>M>;I9/>;6>;3;3+;>6G;6G>9IE>VCCVGIaKKhGEZC>M>9K;6G@6C63@93@336;/>9/>;6C;3C>6M@9Q;6M>6M>3M>6S;3G6/E>3Q;6K;6QC;VE>UC>]E>QE>QC>QECME@SG@VICUG>OECQICZIG^KQwGS}GVƒGO~GInGIoEEXKMgOUtUc�Xj�Xh�Vl”Sl‘SjŒQdŽOaˆOc‹Oa�McŽOg�KaŽK[�K]„KU‚EQvGOrCOrCEd@>^C@XIIkGSyUc„[o�`o˜dwœ`u–dy�av—avš^q–cq“`r˜axœ`x dyœfz j€Ÿj�¤ayœ]q’O`‡GOlEGfGIhKMoIKjIKnGGZIG`GCUI>QKCOMEMI@OG>M@9G93;9/63+9/+/6///++3++3/;3/69/6>6@>9IG>KG>MG@MIE[MKdQ[xVfˆUj�S`‡ISwKMhE@O@6K>3;@;K@>VC>XECaMSqKUnS[uSUjOUgEEK@6C;396/9@6E@;IGCXIIoIMtMXU]�Zd�Q^†KOlEE[93>3'/''++++/'+/'/3/6@>OCCOKIaIE^C@Z96C9/>;/;>3C;3>93;9/66/;3/996E>3O>6O@>aIQ�KU€Q[‹MXƒKS€EGgKMpKMjQV}M[…GU}IQx;>U6/3/+3+'++''''++''#'#++'+'3639@>@IEKMQaUXjKQ`IK^GIZ>9E@6>;3;@9C>;GE@QIOlQX„Qc�Uj’Qj’Ma‹GGo>6E63;9369/993993>6369393/++'/+''+++96G>3S>9UC@[@9O;6>63963;`n‹ZdZa�UVnOMdMM]SZu[g…]h‡dt–jzœf} j†©h‚§h†ªkƒ¨oƒ¡n„¤wŠªq†©nˆ­n…ªh|¤g£c}¢dzŸg¤d€¥f€¥h�§g€§n†ªp…¯l‚¨dw™ah‹VX€MGjKE`E9I@9E;6E96@>3@C9EG9M@9MC9C@9@C;E>9C;6@6//3+/3+66////+6+33/993693;C9GE@cEEgGMxIM|IOƒEGr>;[@6S6/9/+/+'3/+/;39C9GE@MIG[IE]C@O;>G66;6/96/36/63/69/;9/>;6C@;IC@ZCCXGE]GG[@@QC9M@6G@6>@;M;3@93;;3@96@>9G;3C;3I;6K;6Q9/@9/99/>6+>++/3+6;/>>9SC>ZC@dE@aGEfGGfECdC@]E>VE;QC;KC9KG@QE@XGCfKMpIX†K]ŠIUƒIOzIK|GKkKOfQXwXd�[hŠ`nŒ^p–ZkŽQf‹Ma†QaO]‚M^‰K]ŽMa�M[…MZˆGZ‰IQvGMqGGoEE]>>M>9I>6EC>UEE]OUrV^‚[g‹]l–]q’^hƒ]nˆ[kŒ^q�^k�cr�`nˆ]n�`o�cu”]p“fwš`tœ[n’QdˆIX|EQqIOrKQtMVzKUwMUqOQdQK^ME[MGUK@KG;IC;I@9E;6>;39/+6//3C;G+++6+/3/6/+39/3>3;>6E>9EC9IG;KG@SKIaQ`…Zn’[k•Ug�O]~MSq@>K;3E>6E@;QC>U@@ZIIkMSlSXrV^xX[kOSfECO@;E>6>939C9GC9GC>SKIjMMoQZ�U[ƒV`ŠSZ}KIfC>Q96@3/+/++6+33+33+693;@;KG@QKKjKKhE@S>9G6/9936>3E>6>>6;6366/993@93>>9K@>VIGoIS…I[‰Oc�Qa‹KV|MV|KV€O[}S^‡Qa‹KXƒGKl;9K3+/+++/'+/''+++++++''+''+#/6/;>9@EEQOSfQ]|O]zMQtIKoC@V@;Q>9GC9E@>KECXMQrS`‹Uk–[tœSh�O]…ECa93>6/96+393@>6E96@63693;6//++/+/'3/3@9ZC;^@Cg@>O>9I>3C93>6/;al�]f^f‚V]}QVqV[qV`�^l‘^p–cy k¤g}§g~¥h§g|¦g| h¢j}¤g�§h}Ÿh~¤gƒªj~§k�ªgƒ©g‚¥j…«h‚­d~¢a~Ÿgzœgxœj~Ÿfxœ^l�^gŒXV|I@^E@ZE;KC6G>6I@9GE>IC;EG;KC>OG>IC@IE;OC9G>3E93;6/3/+/3++///9/66/99/99/>@9MEChIKpESƒKS…IU‰GK€@@cCCc;3E6/3/'66/>@6EC;OIC]IGaCCZC;M96>99@93@33+;6;339;6@93>93@>9K@@U@E^GEcG@]@@Q>9E@6EC6G9/>@6M93@C6K>6G>6C;6I>6M>6M;3O;3G>3E9/96+6/+33//;39>6SGCgGGfEEnIM}IM}CGtGGjGCaE@XE;KC;MC>CG@XICZIIvIV„KZ‰K[ŒIUIM~IQrIKhMUwQ[}]h‡ZgyXf�Q^zQ[zKX|OZ‚MXyOSwKSzM[KVzIOwEIrEGa@@VE;O@9I@6@@9KC9KC;GE@UIE]OOtQOlUZuV[w[[q^^o][y`dx^`t]`t]]vXZzZd|Zf[kŒZg�VhŠVh�O^„KUvKVrKUxQZU^zVazU[uX[nUQ^OK[MGKI@QG@QG@QE>Q;6@;3;3+6/+66/3//+6+/3+3/+3;39;39@6E@9@C;GE;IGEZIIfQ`…Zn”]q˜ar–Vc�MVpECZ;3@9/696E@6O@9VECcKKgUUgZ`rX[qQVkIGX@>C>9@;6@C;ME>KE;IKGcOMlOStSX„SZ„OV}KIcE>Q;6>9/36/39/3>3>>3C>9KC@UKEVKG`GCZ@@S;6C3+693;6/9@9E>6;9/63/33+693>>3C>9OEEfIU�IV„McŽOa‹Oc†M]‚O]„O]ƒQ[ƒQ]‚EOq@@[3/6/'''+++++++#+++/'/'++/++/'/9/9>;EKIcQVrOa†ScˆQ[†OX~IKlE@Q@>OE>XC@ZIKkMXwUcŒVg‘Xr—O`‡KZ€@@X9363+36/663;>3@939639633/+/++//+/;6I@>dC>k@@^@>S>6G6/63/933;ahŒ]d�ZaX]xU^xX]rVcƒ[n�^o–cuœdy¢g€¤ax `x¢g~§fy cv�avšdz¡f~¤g§k‚§lƒ§l…¨o‡¤d€ k†§j€¦g¦c}¢`p”co�^n”^o�[f‹^]‚QSvIC[E;UE9EE;IC;K>9EI;IG@MG@SE@ME;EGCSE@VC;K@6O9/;9/63+6/++6/33+/3/66/36/3C9QE@jGIrGQ�IX‹KUˆGOƒCEhC>f>9K3/3/+6;6CC;ME@VKGaKIcG@[;6I96@66>6/;>9@>6E>9I@6>;3C;6C@;O@;S@@aGE^E@Z@@U@9O@9MC6E>6C@6C>9E@6K;6M>6E;3E;3I@6Q;6M;3C;3C9/99/93/66/6;3;>;OE>[GEdIIpIOIO}EKwGIkGIlE@[E;MG;SG>MI>UI@XKMqKV€K[‹KZ‹KVƒKSKUtIIgMMjOVpS[rSZqUZuVZwQXtQVvSUvOUqQX}GOwKSzGOzEEl@CdC@^>9K;6C;9C;6@>9EG;KC;ICCQIGXQKfMK`QSjVZlXU`[Sg[Xk`[j[ZcaZhVSaXZhZVoV[qXa�Xc†Xd†UdˆQ^€K]yOXxQX~U`}Uc�Zcw[^x^`vUScQKQOMMIEUI@SIEUE@M>9>>6@3/9///6/33+/6+36/9/+/;/9>3;>9EE>GC9CC;EEE`KKgQ`‡[n”^qš`t–Ud‡UZu@>Q93;6/363>;3@;9I@>UMKaQSdZ`vUZrMSkIGU>;I;6>@6EE>KI@MG>IKGZKMfSSuOV}OU‚OSpIE[E>O>6G;/96/3936>3;@3I@6IE>QGCXIG^G@QC@Q96C9/99/66/;;3>;6C>3>6/63+39399/;>6KC@`GOyIU„OaŒQaŽMa‰O^‡O]ˆS`‡Q`„OZ|EKg@>V++++'#''+++++''++++'''''/''/'6;6EC;IMQkS[zS`†Vd…Ua‹S]�KQoGCXE@UG@[GGaKQwMX€Vg“Xk�Vo–Oa†M[€C>[6366/66+33/693;3/36/66+33//+++///GC^@CfEEpCCd>;I>6C3/3//33/6X]yU]|V[yX[zZa]d~Vd†Vh�ZhŒ^q–]r“Zj•^p—]lŒ^j‘^o’Zh�[j’[l�]p’^r”^tšnƒ§g|¡lƒ©j…ªo„¥d}§ay [q•[p�Xa…XcŠU^zUZzSUwMEcG>SC;KG>QE;GE;IE>KK@VMCSI@MIGVKG]IEVGE`G@]C9U;/@9/;/++3+'6/36/33/96/66/9>3EC>]IGoEM~IX�IU‰GM‚@ElGCg@6M6+63+993>C;UE;UE;V@@X@@V>9K66;669;3>@9;G;ME@QC;IC6K>9KC;Q@9K@>UE@VEC^;9I;6>>6E;/>;3C@6C;9@@3I@;S;6G>6G;6GC9S;9Q>9M>6G>6E>6E3/6;3;>6C@;MIGfGGjGMzKU†IU†EQ~IOwIIqIKkG@OG@VG@MKE^MIgQS|M^ŠK^‹M^‰O]‹MU�ISpGGcECZE@OE>GGCUIEXKG[MOdQOdSQhQQgUVtKMjGGgE>[C9]>9U93;3399/696@E>OC;IGCME;GC>MKEQKCOQK`OKXZMS]KOXIG[KM[KK[KK^KKUEIOGMMESOIVQOfOQoSZ|SVyMZuM[wO]vVgƒ]k�`n‡andhw^fnZUfQO^QOUMIUGCMIEUIIZGG[E;M93C3/96/33/36+//+3//6;3;;36;3CC9K@9KI;OIGcKKqS`‹Zl’]n”[o–OaˆIOtEC]93>9/;6/;9/96/>;6IE@SGEQQOaZQ`MO[EEU>9@;39;6;E>OI@QK@UG@UKGXKKjIMpOQwKMhICVE9M>9C;3>936939>6C@9OC;XEC^GC]IE]G@V>>I;6@3/66+33'66/36336/93+36+33/+6/993>>9MEEnGMuIV�M^ŽKcŒOa‰U`…U]‚Q]‚MZuEEg>;U++/''''''+''/++'+//+3/'+3+/3+9@;UGE^SUuQV}Q^‚Vc‰Sa„QZKMpIGd@>]G@[IMnOV|Xf�[k”^q”Sn—Oa‚M[�C@d@;I>9K>3@6/6;3@6/3636;3>6+66/>96@CCcEKvGMyEKq@6O;3@/++//+/+/KIaQQpUXwV]wX[yZ[yUc}OZ}QXSZxMXrKSuM^}OV|S[SZxQ[‚S[V[|SaƒVf�`p–g|¡k‚ªl†¨h‚©l…ªo~£`t–]nŽXf€UXyOSwKSnKIfKGcI@SG@UC>KMEUMGUIEUMI[MESSKOSKUQM^USkMMlIIhGEdE>^>6I>3G6/63//6+39/93369396+3;3C@;XE@kCGtGKyGQ„GK}C@lC;^@9O93;6+;6/>@9IC;QE@X@>U@;M63;33>339;3@C>OE>MKC]G9IE>OC>IC>U@>U@>ZC@Z@>Q;6G93>6/;9/33/66/393;>6@>;KC>SE@[@;ZCCcC>UG@ZE;K@9G@6E;3>9/99/9@;OGCfGEoIQzKU„KX‹KZ†KZ‡MX�MSvKGaIEZE>EIEXMIgSSvO[�K[‚QaŒU^‡QX�MQhIIgICZG@UG>KG>MKCSKESIEUMKcXUkZSdUSpMI`IGXC9M>3E3/>3+363;;/@;6CE;EE;IG>QG;KC>IKCKM;EQEOOKSVQZ`USf[^aVXf[`cVUcU[]QSQKMM>IG@II@IKG^IOnMQlOSq[axZc~^l…dpˆgt‰ku‡hoxcgoVV^OMZMOQOIUMKSMM]QOhGGSGES>9G93;6393//6/63/63+9;/;936@9G>9@C9MG;KC>XGIgKV|SdŠUg‹S`„OZ}GMp@>Z;6E93@9/@>6>66>93G@9EC>IMI]OM`MK]GGU>9@>9@>6>@;EI@M@;CC>IE>OE@XGGdGEcE@XE>OG9K@9E>3;93;9/3>6G@9KC;VC@XGEcE@VE;Q@>K;6C6/33++3'63+33//3/6/+3/+///+3++6/3@6G@>]EInIV€OU�M]ŽK[ƒS]~Q]ƒSZ‡KUuKInE@Z6/9++''++/'+//++++3+//+/9/6;3ICE]IKlSUzO[„KUƒKX}KMkKMg@@S@>M;9KC@VKOrOX�Vh’Zp›[qœVo–Qf�O]…KS€IKpIInIC[;9G>6G63;96>C6O;3C>;V>;UEGjIV‚IU‚GOu>9K6/6/+''++''+EEXKKcMMjSZtUXuV[uUZvOQtMQpIIcEGXEC[GIaIIfMOkMOlMQnMUtQVqQZ|S`~ap’hz k�©l…ªk†§oˆ¨nzŸcu™Vg…Ud…SQtMOlGG`GEZIEXICQKG^KI^QIXQI[MGS`]k|w„„~‡‹ˆ•†ˆ—|�˜kw�]f‡V[�GGg@;M>6>6/66/+9/6;6;63;9/66/3936@6QC;[CGrIKyGO„EErCCk@>a>6G;3>9/>63;@6E@6I>6O@;Q96G6/666>66;>3GE;KG9IG>OK>UC>OCCOC>VC>]@@^E>ZC;Q96E9366/6G>K3/>6/996;C6M@;QGG`GGhCCdEEjEGhIEhC;KE9I@6E93>;3@>3C>;MGCgGGlGSIU„KZŒK]ˆO^‹Q^„MQuIKcIE]C@GKE[MIgQUuQ[�Ma†ScŠS[‚U]�QSnIKfIG]ICSE@MG>MMC[MCOMI]SMfZVkZSgZQjKG^KGXC9K6/;3/93/666;>3;>;EE>MG>MG>QI>KE;EE>@I>GKESQKXXS^`^gc^gf^gddodapa]gZQ`QISKCME;EE;GC@OEE]EC[IOjU^xVcyfpgq‡dq‚jtƒgnwcgoZ[gUS`OKQMKQSMZSSdSSaKKZIEZ@>Q96>6//3+36/33/63/99/3;3;;6>>6@>6@C9GC>SEC^GUwO[‚Uc‡Ua‰KStIOnCEc>6K;6E93>>3C>6K;3E@9E@;KIKaMK^MMaIIX@;E>6C939@6>E9@E;G@;I@;MG@UE@ZGEaC@VE>MG9IC9I>6>9/99/;>6E>6G>;UECaGCcGCZE;I>9C;6C6/;3///'3/+3+///+3/'+/+//+'3++3/+93>@>ZCEgIQ|MX„KZ‰M^�U^…U^ŠSX‚MSwKMoGGh;6G3//++3+'+/+++'/3+///+9/;@9XIKoKOoOUzMU|ISyIKpIE[E@K>9E>6C;6EE@ZGOvMZ~Sf“^q›]tœZo•Qh�Qc‰MZ„KSyKQvMMnE@UC>Q@9I>;O>9M@;S>>Z@CdGMrM]„K[…KV€@;K939++''+''++>9CC@KKGcSUxOQpSUoQSuGEZECS;9>96;66>99@C>UG@SGCZGCQIEUII[OQoOVwZhŠcwžh£n�¥p‰®n‚¥az¡cn‘Ud‡QVqIGZKGgGCVE@SKGZOGXUK`XQ`php®©­Á·ºÇ³¯Á©�ɸ®¯”‚œ†“�}}uzlhpgk}ckƒdq‹cx•OXu93993;>3>63993993;9/;>3I@;S@>cECqGEqECkCCl@>Z>6K;3C6+;3/9;3>9/;;6E>9E6666/696>;9@>6CC;EE6IC;IG>OE@SC@ZMOnEGgCC]C@VC;U96E9/69/69/63/3;3;93>@9M@>SIIlOX�MX�KQzGMuIKuG>S>3@>6E93;93;>6G>6KGCaGIuKV‚Q`ŠQfŒOj�Ug‚XhˆSX}OOfOGUIEOOIaMK`SStV`zUc€X]S[€XVxUSfOK`MIaI@SI@QM@VICQQI[OI[QMfVQh]VkXMgQIaKEVC9G;3@3/39/;99@>9@C>GG@IC;EKCXG9@C>CG@EKCSOIVSO^`^|ac�fgƒhk‡fn‰^c[]rSQcMI]E9G;6>;3>93>96;C>KIGVS]uZdwko€nu‚kr‚cow^hpfgo[[jUUcOSVMMXUQXUXgX]gSSaOOdECZ@>K>9C63>6+33/3/+66/99/693>96>93C93>;6I;;QCEcGOuISrIQ|IMqGIg@>[>6I>9E>;GE;I>6E>6I;6>;9CE@OKG^KM]KISC>G@9C96@;3;>6;>6C>6C@6@C;MC9I@;OC>IE;IE;Q@9M>6C9399/3;/C>3K>;[@;VE>a@;SC;O@;K>9G;3;9/9/+93+6/+/++//+3/+//+'/++3/+93;@;V@@`GMyKZ‰KZ‡Qa‹Q`ŠU^…V]X]‚MU~MSyE@`>3@3/6+'/6+/3+39+663@>6CC>dMMpKOtQUzGKqEIj>9M>9E;366396/3/+3>6EEGfKQuSc�Vk‘]q›Vl”Ul‘Uh•Ua�Xa‰X^‡SX�MQuMMwEGcEEhIIrIIgEGjEInI[‚Qa�OaŠKV~@@V;6@/+++''''+G>KC@GGGVSUt[ZxZVvSSpIEXG>M;6>966669969@9EE@QE@KMCUMGUKCOMMaMUoZfŠdtšf|¡r†§o†ªj£cu Zg�Q]zOSjIEVICZKI[OMcSM]QQf}y~®¨¨ÛËÆ×Á·Ñ¸ªÏ¶ Ã¦Ž¾ Š­’~–…€’}vxkhd]`VS]UQ^ZZfSUhMUn]qŠfy�SVkC9I@3E;3>;/>;3C>6I>;XCCjECnCEp@>^E;[C6U>6G9/E6/;93C63>;6G@6E@9GC6E@>M;;>C9EC;IE>O>9@E>SC@]GGdIIkGKtCE`C@X@;K63;;3>;/>>/>3/69/996CC;VCEaIMvMX†OZ„Q]…IQzIKjE@O>6E93;3/96/9;39@9KGEjIInO]‡Uh�Uj‘Zq“^r�ao†[czUVjQS`KGSQISQKaZXlVZnVZu[]w[[y[SqUSkSKcOE]K@QG@OI>OI@MMGZMGZMG[UG^UK^UGZOG[G@VC;I;6@;9E@;CGGSGCK@CIC>EC;E@9C@6>>9>E9@MEUMMcQVqZ^}aj‡`n�]k�ao�ckˆZd‡SUoIG`E;O6/69393/9;9@>6@GEVQUjU[o[`o^hy^dk`dr`fl]`lV^gUZcUU]UQ]SS^UXgUZfSXpVUfGGV>;I;6@6/66/93/>3+99/96/696;96;6396/633>63@;6G@@ZC>[@CfCCaCCaC>M@9I>9CE@OG@O@>Q@6G>6C96>E;OGCVIGZIKZEEVEEX;9C@6E>6@>6G@6@C9I>6E@9I@6G@6@C;OE9O>9K>6E6/66/99/;;/E;6Q>;S@9X>9Q@9K;9I;6@>6K;6I3+>9/>3/63+36/33+///#/++3+36/6@9Q@>ZIIoMV�IX„O`�Vc‡Vc‹Va‡Va‹U^…MQIEf@6I93E6+33/+//39369/9@6CC>ZMKqOQtOQvCC^@>Q63@9/93+/3//6/+/+/;3@>;UIIlOVwQcŠUhŽZkŽVk–Vj–Xg�Zg�]k•V`‹O]ˆOXMX|KSzMO|IKwGQyEOvKVQ`ŒSaŠKU~GC[>6E/++'+''+#G@EG@SIGZUUn]XrXVrXQhGCMC>G>9>;6>63999>@9EE;MI@MKESIEQKCOQM`OSpUa„`q˜c|¤n‡¬j„©h¤aw—Zj‹Q`KMcKGXMK^MKZOM]QK]c`gÇÀ¾ÛÐÏÞËÁÚø׾¯Î´˜Æ§�¼Ÿ„­“‚™‚v�zlzocdX`[UZQKSOKVKIUKI[QUcVac}œKIcC9G@6E;69>6K@6M@;UEGhC@gCCj@>]@>^C;]>6Q;/O9/C939;3>;3@C9E>6@KEVG@OC;EG>QC>IC9IC@QE;U@>UEIaIGqIKrGGn@@[C;S;6C;/>;3;@6@63>9/>;6C@6O@>]KOwOV|M[…OZ…IQ}KKlC>Q;6>96;6/>9/;936@;OE@`KKlO^†VjŽXl”]t˜]r�aq…]fvXZnUXfMOUQKUSM`XSgZ[h[[p[Vn[Ul^SlVQg[OgSKfKCZG@KE@IG;KI@OG@QMEZMCVMG]OCVG@ZICU@9EC9G@;GGEUGGQIEU@CIE@EC>C@6>@6@;6@G>EKCSKIXQVvVc„[g‡`n�^k‘]oŠ^jŒ[c�QVuGGc@6K6/99/9//3636@6@E@SMOcQUcZ`oZft]anX]gZ^cZ]hVZhSVfV[dUS^QUZUXcSZhSVgSS[IGZ@;I>6>6369/;6/;6/;>3>@;GQZ[V[^IO[CEK;;E99C63;;;G@>O@;`C>VC@Z>;KE>SE>MGCQGCSG@O@6O>6E;9CE;IMIcIIcIOhIKdGEX@;Q@9K@6E;6C>3@;/>>6@;39;6@@9KC>QC6I>9O@3K6/>6/6;3@;3I93M>6S>6S@9Z>3I>6M96E>6K>6G6+@6/@3393+/6+93+3//'3++3+';/>>9Q@>VIIoKU‚KX‹O^ŠS`ŒVc‘SaŠUaŠU^ŠOS}GEg>;K63>6+39/9//6939936>6;E;]IGZOOqMIoCCZ>9S639;39;/93+63++3//9/;>;SCEaOV|S[ƒS`„Vh�Vk’Xh“Xg�Zg�[k•[j–U^‡Ua‰OZKUyOSzKQrISxISyMX„Q^ŠO`ŒKX|C@X;6E/+++''''+QIVOIZOKcXZl^[pXUgQM`IEVG>I@;C@9@;6>@;E@>IE>KMGVSKXSQ[QIXOOdQUqU^|cp˜`r›gz§c}¤g~¡cq’U[zQXqKK`MM`MI^MMZXXdqklØÎÍåØÏåÖÈãÑÃÞɶØÁ­Ð²•ŧ�¿¢ˆ®’…š„w�|ovkdc[ZUMOOK[OKXKIVIESMIXOO[OUjcr�]g�ICU;9@@9GE>V>>Z@>^@@ZE@hCCjC@c@9U>6Q;3S96G;6C@6KC9IKCZE>MKE[IESE@IKEVC;EE>O>6IC;S>>XCEgKIoIKqEIoC;S@;G;3E;6>@9GC9@93@9/9333;/CC>`CCfGQ}KZƒOV~GIqEEc@>K>6I;3E6/>93>;3;;6EIGcKMjS]|Xn�]q–fr–ar‹ft†Zj~X]oV^tSXdSVjXXhUXlUZqVZpUOdSMdSIfQOaSK[OG]KEVG>OE>EE9EE@KE;EE@SG>KG;QI;ME>QC>@C;GECKGGVMO]SOXSKVIKVC>C;6>9/69/663;C;>KCMKK^OSkV`ZdxXaSfˆXj�Vc†MVuKOpCC]>3@3//3//3//3/39/3@9@GEQKO`VXdZ`pZ]pXZaZ`jVVcXVgVXhVXaSX`UX^U[dUXdOUjQS]GGU@;G>6@639@6CECMxƒ}ÀÅ¿×ØØääêÛÚåÑÐÝÔÔÞÀÆÐ¶ºÆ•ž± «°–¤¬S]p@>Q@>M@>MG@SI@VKGZKCVICUC9I>9@;9;@;KMKkKQpS^uOVrMQpCEfC>XC9IC9I;3;;3@;3@;/9;3>;6E>6I@6M>9O;6E93G9/;9/@9/C93Q;6O;3I>6K>3K63@96E>3I>6I;3O>6O;6@93>9/96/96/+3+/3+/93>C>SC>VIInMMxKS�O[…S^‰U^‡S]ˆQ]ƒKQxKOu@>X9/;3/63+/3++++/3'/6/3>36@6IIC^IEdGC^@>[;6I3/96/33/////6/+6+/93@>9OC@aKMnOXƒQ[Sc�Uk�Qk‘Ud�V`‘Va�Ud‡Q]ˆV^‡MV�IMtKOrIKpGMvGMtIQwOXƒMS€EMt>9I939++##'#''+QMXVOcUOjZVkVUgVQ^VKaKCQG>KE>KE@KE>KGCKGCSMG[QM^OOdQO^UQ^VSpUVvZ]~XjŒ^o’j|šdz cyŸ]n’Xd‡OVuQOgUSdVUj^Xa°©£ÜÖÓéߨêßÛéÝÓçÚÍáÌ½ÝÆ³Ò¶œÅ§Ž¼Ÿˆ­—€’}‹}tpjd[XZUS`OO^MKQQKSOMVOKVQM]OMZOVn^n†k„�GEZE>O@9I@;QC@^C>[EEh@CfC@gC;`@9[>6S;6I@9OC9IG>VGCQICUKEXSKZKGSG>QC;EC9I@;V@9Z>9^@CcEEqECjCCfC>U@;M;9C@9EC9KE;C;6@>6@6/96+>93CC9ZC@cECgCCa@@XC;Q>6G>6I>6E>9G>6CC9Q>9KIEXKMfS]|Vhˆ]pŽ[qŒ^rŽZpŽ]ky[dtV]nU[qS]qZ]oZ^tX[xSUlQO[UMcUG^QMaQIXQI^K@SG@OICQGEVGCUE@SE@QE>KE@KE6E@9I@>GECMIGUMQ]SSV[[gVV]IMU;9@96;93;@3>>6>E@KMGSOM[SOhQUkQUjOQfKQlISoKQnGI^@@[96G6+;6//6//3+3///633@9EE@QKGVQUfV[jUVgUX[UV`VZkVZaX[lV[dQU`QS`QVkSZdSU`OMZIIU@;G@>Ct~yÊÍÎÞßäêêòìíóìíòéêòÜÜéÆËÛÜÚæ¸Äס¯É³¼Ó¶ÀÒ¸ÃØ¶¸ÈMXlEEZKEXI@QOGXQK[OGUKK^G>VE;K@>OC@[KQqMXzO^…Q]‚QZ�IOxIIjIGgC;M@9G;3>6/66/66/963>>6I>/G;6K;3I9/G9/C9/E9/I;3S93K;6Q;/K9/G6/;6/9;3C63>;3M@9S>9MC9K;3>9/>9396/66//>3@C>XCC]IIjMMxKMtOZƒQ[S[~MOtIIoEE]@>O;3@6+3/+//+/+'#+'/6/6639>3@C6IE>SC@SC@VC;Z>9M6/>3+33+//+/6+33/9>9KC>]ECfIMoKVwO[Q^ˆOcŒSfŽSd�Ua�VcŽQX€KV}KS~GKxEGcEGcE@aECgCCdC@hKKnIGfE>[936//+/+''''''+SM^SO`VUg[UhUOjUQjMI]GEMICKE@CCCMGCXIGUMI`OMgSQdQOaSQ]XVhVSkVVqZ[w[g‰]n’at‘dwœcr˜Zg�X^‡S[}VUpUShXZhhagÜÓÐçÞØìãÝëáØëßÒéÝÐãÐÃß̶Ӹ™É­–ç�¬˜Œ’‚x‡xlokn][cUS^QS`SS[QM^QO]KIOMKZQMXQSaS^t^p…cn‡C9KC9KC@XE>ZECdECg@>gC;[@9V>6S>6X;9ME>VE>XI@SICVMEVQI^MGUK@UG@MC>MC9O;6G@6Z>6d@;dE@jC>]@CaE>VE9S>;EC9GC;GE9K93;>3@6//3'633993C>6O@;VC;V;6IC9M>6E>3K>3I@9K@9G@6E>9GE@XKKdSZzZh…^l‰[oŽ]pˆ^r‡Xc|Z^pX]pXaxZ`tV`uXaxUXqOShUO`QI]OCVOG]QG[MEVKEUIG`GC`IGcIE`EGZEEXC;ME>I@6CC;IE>EIEVKKXMMXXV]VX^XUZIMS>9>>6@;3>@9>C>EMGMQMZSOZSQaQSaOK[IIZGG[EEXIC[ECQ>9K96@6+96/36/6/+3/+/6+3>3@@@OKIVSS^UXhUZfSVaUVcXUaUZjUXlXZfUU]QS`UZnSX`SVhSUdKI[ECM[caËÌÌèèðêìòìíóííóìíóéêòרäºÁÒÓÓᥴ̋ž¾”§Æ–©Ä“§Æž°É`tˆOXjKKgKI^OMZOGOQI]KG`ICXGEXCCXGGfOU}O^„QcˆQaŽO]‰K[‚KMlKIfC>S>9K93;3/+3+/3'66/;>6G>/C;3I;3E63G93I;/M;/M6/M63O9/I;/I6/>3/9/+69/>9/@>6Q@;X>>U@;O;3@;3@6369+6;3>;6@@>VEE^KKnIMvMQxOUzQUzKS|IKkC@XC;Q>6M939/+++++/'++''++/9/6;3>C6GC6MG>XC@VC>Z>9U>9S;6G6/63///+/9/66/9C9[EEdEEgKQuOUuOX‚O^…O^‰Vg�O^‘Q]ˆS^ƒUX|GMqIKq@C`@;M@>S>6K>9O@;SC;`C@aE;a>9K6//3+/++''+''++SKZVVcVUcZXjUM^VOcGEOC;OC;IE@SOMfMIfQZqS]~V[|UZwVXqUXvXUkVSnVVlZZt[^zZa€Xg‡Xl•Zk�U`ŠSXzQVuUVoZVgcZl¿¶®êäàìçáîéèîéèîçãêàÙäÒÁß˲Ӿ¯È¬–Á¤‘­•‚–ƒq†|vkjk]]g^Zg]^kE9OC9OMKVE;MECSQS]OUaOOfEE`nƒ�V[rE>SG@XECXGE`E@d@@cC>^C;[EEcC>^>EkGIjKGhKCZOI]KGZKG^IESGCSE@ZC;IC9Q;/K;3M;6Z@9]C9a@>lCCkIEdG@UC>ME>KG;KK>MC9K@6C///6/9/+//'+3//6/>;3E63@;6C;6@@9GC9KECUE>UE;KC;GGCVIGVUZwU^yZd�Sc‚VgVd|XdxXcyXfySg}Xcy[f]a|X[lUVnKI^KESOCQOK[XK^QMcKI^KMgIKoIMuKOlIMuKKpIGaIE^G;MGE[KGVMMcOQfSVcXZfZ`kUU`IIU@>G;9GE>KG>QE@OQIOVO^XQ]^XfVQZMGSECK@;EC;IE;KC9E@9E93@6+69/66+63+33//6//;6;C@OGGQQQcU[lXZjSVcQSZSS[VU]ZZaXZcQQ`OUcQS]OU^SUfOO[IGO¤¨¥ÝÜáìíóííóíîôííôîîôíîóéêòÓÐßÅÈØÆÉÛŒ ºƒ›¼ˆœ¸…�ºƒš¸ƒ™»�›¼†•²^axVUhSKaQKZSI[QIdIEaIIlIQpKVƒUdŠQg�Uq•Vk”Sk�SfˆOUvOQpG@V>6C;3@/+/3++6+63/6;6@>3C;3G>6O6/G;3Q;3O9/K93Q6/E9/@9/C6/>//66/3;/@;3@>6M>;Q@>V@;V>9E;3@;6;9/99/;>6ICC[GGlKKqMQxKMpKMgKMhIE`C>V96E////+//+'/'+/+3+'+/'++'/>3I>9IE;XE@`G@XGE]ECZ>9V;9O96G6/;3+3/+/9/9>6OC>aEEhEKrKQuOUzIS�O[„M[‰O[�OX‚QVƒMU}IGgC>`@;U63@//6/+/3+//+93/93/99/;6+33+/3+//+'/'''+++/'SK]ZVf[Xp[`tVUlSSdEES@>KEESKKZMSnQXvVf‡[l�]k‰Zd€V`V^]ZuXScVVk`Xj[Sk]VqZ]qV`XaƒQ[QUtOSpUQhZQ[xpræàÖîêëîëëñîïïííïëéíäÝæÖÆáϼÖÁ²Ç¯œ½©–§’‡•†€„|xqpqa`fa^lXXfMK^VVfGCVGCZG@[XZgZ[gUVkIIlV]zw�«ck†C@QECQKCXKIfEEdGGdGGlIQ}IV†IZ‚S[„S]�SSwIMcKGXG@OGCVGC]GC`ECaC>^>;[@6X>9fC;cE;h@;h@>aE>]GC]GEVICUK@UMCS@9KC;O;9G6'9/+6/'++++/+39/;96M>9Q@6GE9MC9IC;ME>KG@UE@KICVKEVOMhQUlUXqQ]yVc|Ua~S^wVcxV`tVd|[g�Zc|V`€MVlMUrMKcKESO@SKK]QKaSKaOMjMMlMSrKVOXIX�KU�QSrKMjQOlIKjKMdMSrS^wV`yZarUZlUVaKKVICUE@MI@SOESOK^XO[]U^aZh]Z`UU[KIOG@K>9CE>IG>KE;K@6G96>9/69/36/96/9633933@9C@@QIIZSQfV^wU]wSUdSV`SVgUQ]OQ]QS`QS`OO]MQXQQ`QOcQMX][gäãéììòííóîîõíîõîîõîîôîîóèéñàÞêßÞéÁÇ×� ¼‡›»†œº‡™µŠ™¹ƒ˜¸�Ÿ·‹œ»|ˆ¢XVoVUlOI]OG[OK`KGfMOtQXwSa‹Vn˜XršZuž[v›Xq›Sg�SZSUyKG`@9I96@6/36+69+;63;@9E@3E>3G>3C;6M>6M;3M;3V63S6/I6/>3+;/+33/36//;/>>6>>6K>;S>;O>9O;6G93>9//6/3;3C>6GECdEEgMSzMStMSoIGXC>V>;G;3;333+'+//3++'3+'+'/++//++/+3>6GC;[ICdMElIGdIIdE@]EEl@@a@;Q;3E9/696C>6I>9OE@dEGjEKqGMpKMxKOzGOuISrKUzKKxKIpKIjC>Z93E6+9+'+''#+'#''#''+'+'+'''''+##++'/+#/+'3+'93;+/+SOa][h`at^auZ^uUVhGI^IEUE@QKOdOUqS]}[lŽ[l•]n”^lŽXd†XaƒXXvXUja[xcZua[u[UoZZuS[~QZyQZuQQlOOlQOaaX]§–…êæáïíîðïñðïñðíðïììíæãçÚÐãկ׾®Ä­Ÿ¸¢’¤“Š�‚ƒ‚}ygltfdf`]c[`lZ[fX]aG@[KE[E@VZZhXZjUQcKIpMVpn… x‡¤E@QICQICVIGcGKoIKlGOuO`ˆQc�Sl“Vk�Vh�S[KOhIM`GCOGGUEE[GEjGIlEGrC@dC>n>;f@>aE>aC>f@>[E>]IC^E@SG>QICVG>KE>SC;S;9G;3E6/@3'3/+33/9;6I>9XC;VE@XE>KE9E@9KG>SG@UGEXKE[MGZMIdOMhQMcOUlOVpO]rS[tU`vU^rSd~Xd€Zf€Sa‚S^xMUwMMfMEUI>OIGVSQgUSkOMpKQoMX|M^‡O]…M[…MX„OVuMQoOKnIOhOUlQZ‚ScƒVfƒX^qS`vU]nKMVKEVECOOESOGSOGQVQ[]V[][da^dXU`MIMIEKC>GG>MG@MG@UC;K>;E;/;;3;93993;93;>69>6@C>QGCXQSjV`xU`vS]nSVhQSfQVcQOQOQXQQcMK[MO[QO^KM`OO]kjoééïííóîîóîîõíîôîîõíîõíîõèéñåáìåãìÂÈØ�Ÿ¸…™µ„š·…—µ…–²ˆ“°‘Ÿ¼� ¼�–ªfg|^`wOOfMI`IG]IGdOSoOVzXh�[o—[u [w¡[vœXt™Sj�S^…S[~MKcC;M>9G93;6/39/;93>E9IC9I>6E@9G;6I;6K>6Q>3Q93S63G6/>9+>9/;6396/6>39>36>6E;9K@>X@6U>6G9/>6366/36/6>6K@>XEGjMSvMOuIKhGG^C;Q>6C6/6+/'++'/+//+/6+//+//+/3+36/@@;QE@^IEdIEuGGjIKkECaC>]C>X>9Q>6G;3@96G>9O>;UCEjGIoIKqGMqIOwGKqGGnGKpIMpGGuGCdC>c;6G//6/+/''+#'#''''##''''##'#+'#+##''#/+'/+'/+#939/+/XZgdk‚flƒgnŽ[`€UZrOSgII]KGXMOdU]zXc‚[o�f~¦g|£^t›Zh“Zg†V^[Xn]Zlc[laXjZUl]SaSOhQOhMIlMKgOOdVKZ�ˆtÝÑÁîìêñðòñòôññõñðóðïòîêéêßÕäÕÆ×Á²Æ¯™½¦–¨–‹‰�€}|zhhqcdjafpdchaft``jGE^QOcE;U^`lE@]GCcIGjMQrUdˆh�¢QSdKCVKISKG`MStOX|Od‘Xq™]vŸ^|¥azžawš]k�S]wOUuMUnMUkMUqOU}MUzKQ€GM~ECvCEu@>cC;Z@;Z@;ZC>VE@VIIXG;IE;KICQIGfIGfCEfC@g@C^@>QC>]CCjGIlIOtKStIOrGIaGCXGCUIGXII`MMfKIcMIfIEZIEVIE[KK`KKcOUjOVtQ]tO[wQ`vS`�S`„Q^‚KUwIQtII`MKcOG]IGVSOaQKdOKkMSrKVwO[†OZ…M`†Ma‹M]OX}OV€O]ƒO^‚OaŠSl�Sg�Vc„Q]pSZkOScKIZQGSOG[QIUQMXUQZZQXa`l``h^]]VSZOKQKGVKE]OEZQK^IE]GCZXSg Ÿ«¸´½ÈÈÑÎÎÕÀÃË‚�£[kˆXc[f‚Vc~Uc‚S]vU[rU[nQU`OO]QS^QQXKGVKI[MM^OOaUSaŠŠ†ììóíîôîîôîîóîïõîîöîîöíïôèêñèæðçæïÆÈÖ¯µÉ·¼ÌÍÏÞרåÑÔáÁÇÛ­´ÎŸ©Å•¤Ä”£À� ¿� ÁŠ ¿‹Ÿ¾~’¯‰”­l€�^l’fxšaw¢cy¢]t˜Xq–Uh�S]}QVxQQlIE]G@X>6G>6C@9CE;QI@QE;OICSG;OE9K@9O>9Q>6U9/I63G9/C93>9/6939>6C@6GC9C;3I@;QC>Q>9S;6@;3C93;6/39/;;3C@;Z@@fKMoKMuIKoCC^@;K;6C3+/+/'+++/+33//C;E6/99+99/996CE>X@>[E@]@@fCEnEEgGCd@@^@>X;6Q>6M;9M;9K>9Q@>VGEfEGkEGkGGkIGqGGpCC[C@V>;OC9S>9M;3C3+/''++'+#'#+''+##''##''#'##'''#+''+''+'#/+#/+'+''/+/X^vcnŠju�jv•hp�`g†X[tMK^MI[MQaQ]yVgŒ[u–`zœcz¡au Xk“Xh�Z]y^[q^Vo^VfaUacVg]S`MMZMKaICXICZC@OQMVÖÇ´éßÐïîîñòõòòöòò÷ñðõðïòïêéëáØæÚÌ×òǰ§»¤— –‹…„†||xqqwfgkfkofjuglpffkKE`VVhGE`akuKKgV]tQUtKOnXcƒcu”jt�ICUMI]OQpO[ƒQ^„Xoš]u d}¦f�ªk©f|¥`q�UdˆUfƒUa|UcˆQa„Vc…Sa‹S]†KVƒIQwCGoC@c@6Q;6M;9E>6E@6I;6GC;EC;MOIaOXxS[uO^ƒOV„K^€K[‚O^|Of†Qf�Vl�Uj�Uf†MVuOStKQgOQxQStMQ|QQpKMhGCXC;E@6G;;IEEXGGXKQoOZ}S[Sc†O]ƒO[†MZ‰KS|GOuKIkECXG>SGEVOG[I@SKG]KMgKOpKU�Oa�K^ˆM`ŠK[ŠM[…OZ‚K^ŠMf�Md�Qh’Ok�UfˆQ^€OStMVgIEQKGOQMdOI^MIZVS[]V`d^jdcjkgjZV]UOUUK]OI]SOf^]z|† }ަz‚¡�„¦¯›²àÚããâêãàéßÜ覧±cg~MMacn�cr’[nŠVc}U]tUZoQM[QUXOM[OK[MI[MK]SQaSO`‘‡Šìíóíîõïïôîîõíïõîïõîîôîîôêêòêéòêêòãâ캸ɪ«Ã� ½ãâëÎÏܺÁת¶Ì–¥Â�Ÿ¿‰™ºˆ™ºƒ›¾‚–»|•ºy�¸y“¹~–¹z“²`u™`zœa~ ^tš]r›Qd‡U]Q]vSQuKSqGKgGCVC;EE;ME>KKCQO@UK@QG@VGCZC>OC>U@9V;6O93I;/E93>;/>639>6;C6C@6>;3C@9I>9K>6O>3EC9M>6E9/693;93;>6I>>XGCdGC^ECf@>X>6C9/9/+++/++++++36/39/393>C6IE9E@9MG@X@>XC>[>6U@;V@@`C>Z>6S;9O;6I@6M>6K>9V@;U>>ZEClCCfCCkCEfC>fECk@;U;6C6/39+;6/;3/9++''+'+'+'+''''+'#+''##'#'''#+'#+#+''+'#+++'#''''+/UZwao‹drŒkx�fp�`jŠ]^rSM`QK^OM]SZyVc„]q�]uš`u�avœZj�Xh‹[aw]Zt`]k`Vg^Vg[UfVK[OK^OIXG>OG@SC>GUKSá×ÈêáÓïîìñòöòòöòòöñðõñïòîêêêßÖæÙÐØÃ²Ã­ž¸§žž”�‚„‰yxyrvynnoloyhnrkpxhktIC`XSgICadkrOQkjnyV[rU[wZd~aoŽx�ŸGGcIGcOVzQ^�OaˆSh–`x¢j§g€¨f�¨az¡`r’[n’Xf‡Sc€Xf�VdŠXfŽUhŽUa…OX€MKqEEnEEkC9O;9K639;3;93;96>C;EE>SOQoU`zXd†XjŽUj•Uj’Vk�Zo’Vq•]qœ`xŸ]t˜Xk�Uc€S]zSVvQV}V[|OX|MSwKMnGC`@6G>6E>;E>>QGE]IOqOX|O]‚Qa‹S`ˆO[„MX†IU�GMrKGgG@UI;SIESI@UG>KE@MKIcKOrKSwKZ…I[ŠKaŒK`‰O[…M[„K^‡Sg�Qf‘Qg�Ok“Vj�M]~KQrKSqGEQIGMKIXKG[KM[US^[Xn^alkhqhaga[]]UXVQcZQdf]w Ÿ²¯¨¶¡œ§yz–lpˆjg‚¨”¦àÝçãáéÞÜèÒÒÜ£©¶KE`OQpV^|`pŽ^pŠS]vXZpSQaQUaOKZQKVKGSQIZQO`XVaˆƒ„íìóîîõïïõïïöîïõïïöîîôíîôëëôæäïæãîÓÕ㚣¾‘œ»’š¸æåîáàêÅÉܸ¿Õ›§Å�Ÿ¿�›½�’³v�³�¸|“¶t�¶v�²x”¶�–ºfu•fy¡dz ax ]t—ScˆS[yUZxSUwKQtKKnGE]E@ME;OG>SICQM@QK@OG>GE@OG@SC>SC9S;6K63C;3C;3@;3C;6>;6>>3@@6>;3C@6G>6C>6M>9K@9G@>K;3>;3>93>>3G@9SC>ZE@aECfC>Z93;3/3/+/+++/+3/+36/6@6>>6EE9EE;ME;MG>X>9K>9Q;6U;6M>;S>9O;6K;6K96@>6G@6M>6O@;V@;[CCfCC`CCgEGhE@^C@c;6G6/;6/63+66+3/+/+''/+6+'+++++++/+++'##''''#+'#++'+'#+'#+'#+'#+'''##+'/QVn[d|]dwap‡`d~`crXZvOM[UKZIISKSpOX}Xh‰Zp™]p›[uœaq”`p�ck…fk|cdwc`qa[p^VgZSaSKZOIXG@OICSCCKhXXèÜËìçàðïïòòõòòöòòöñïóðîðïéèéÞÖæØÎØÆ¼Æ°¢¶¤ž¢”�„€ƒ}|znwyuw~txtx~ww|trrG@VE@]MKnE>[KIaVXjIMgU^}V^}Zd}‡’¢OQjQVuQVvQa…Q`†Vj�Zo‘]t’Xo“[p–[q”^n“XjŒXl�UaˆSc…Qf…VgŒUc‚Uc„OXxQQtKMtGCZC>O96C//36/36/3;6;GEQKKgSZu]r“^u–f}¡cyž`z `~¡f�¡h€§lƒ§lƒ§k„§h}™au•^o�XgŠZgˆVf�U]}MQyQSvC>U;6C939639;9OC;UIIjKS|MXƒMa„S^ŠO]ˆOV…KU}GQwGCdC>OE9MC>GE>GC9GE;OIE[KIkKQuOVM[�M`†K^‰KZŠM`‰IdŽKf‘Mf�Sj�Sk�ScƒO^OZyGQhGIZGEOIE^KE[KKdUSfZZo]`ldfngcfa[c`V`d^t½·ÁÏÂËÓÃÁÖÀ·Ñ½»Î´­­ £|w…UQh~n€À´ÁàÝé×ÔãÐÏÞ‡�¢@6I@9KQUk]fyfu�aj‚QQaOMVMGOQKZMIZSIUQM^XO^y�ìíóïïöïðöïïõíïöîîöííôëìòççñÎÐàÅÆÙÝÝ魲ˡ­Ã“¡¼ÏÈÜéèñääîÁÃÓ™¤¼Œš¾„”º‡‘µyНƒ’¶x�·|’¶|‘¹y‘¸w‘¼|–ºq�®a|¡`v›[l�Q^yQXrQXrS[‚OZxMX}KKcGESG@SMGXMCQMCSGCQG@UGE]IGXGCSC>S>;M>9C>9I>3@;3@96;969>3@@3C9/;@9O>;I@6GC9MC;OC>O@6E@6C;3>;6E93C>6Q>6Q>6M6393+//'+++''+#/+//+6336@9EC9KK>QMGZMGgMGcC>U@9O93K96G>6I>3G33;3366399/;;3>63CC9M@;SC;V>;XCCc@CXC;]C9V>6M//3//+3#+++#++'+'#+'++'/+++3//3++/++#''''#+++++'#'''#++#+''''''''''+MO`SVkV]pVZpUXlXZjQOcQMdOIXIGVKQgMVtQc…Xp–`v›awždu˜hy–kx‘or…fgufcr^ZdXS`VOZMIUOGSGCOE@EGCGÀ¹²ðîñïïóñðóñðõðîóïìðïêððíòßÎÍÝÏÈãÓÆÕÀªÀ­ ²¡—™�����z~wxvz}„~xzy€…~z|uojuolzvtwrqztqyvtzwtjfjch}fn€ox‘Z^wOUrOXzIUvISzMQqMXxKUyKVlQXnOVxS]€OaƒSc„S]ˆOXKUwMXxKQkOOvMOoMKfGGcE>QC9I;6@63;;399//>9CIEaKOlVc…cu–cw�n�¦l†ªg…­h‡«oˆ­pˆ­v‘³q‹¯rНj€¢fyœd|œfv“cq”`k�U`‹MSvIOo@9I6+63/+//363CC9UGEfMV~OV�Sc‹Qa�Q^ŠOV„IIrIOxIC[G@SG9IC@GG>OE>SE>GKGaOIpMUtQ[~Q^…K]‡IZ„I[ŠM]ŠKa�Mc�K^ˆMa�Sj�Vl�Ma†Q]„MVoKQkII`MI[OQcMQgSShVXh]`ra`h`[ldXfrdqÍÃËÜÌÌàÒÏàÐÊßËÄÞÌÅÛŹѴªË²¨€x†OMcQMgÈ¿ÎÖÓáÌÎß²ºÎX[u@6MEC[Z]g^cvnw‘`h€SUaKEQMGUQKUSKVUQZXM[†€ììôîîõðïõïîõììóïðöïîõîîôìëóÝÞéÌÏÞ±·ÎÇÆÛ¸½Ö¤­Åš ºÉÁØëëóªªÃ�–¶‰˜´Žœ¾ˆ—»}Œ°|޳x‹²w�ºz“¹z”¸x�¸y‘¹~—¹q�´cw›^p–Ud‚U^zOVyS[‡Qa„Uc�QVtOQgOOlKESI@SI>QKG[KMoIIlIEhKIpIC^>;K;9C@9K>6@;6@;6@;3>;3@>6@93@@6I@9O>6GC>ME;KC;E>6C>6C;3;9/;6/96/;3+;/+3/++/'++++/+'/+'/+6//363;>6@@;KK@UVI[QIjOI`C;M@9M9/E93E;3C9/9//33/3//+3+/6//6/;>3E>6M@9]>;XGGf@;VC>f@9O;3C/+/++/+#'/''+'++''#'+/'/6/63//6+//++''+++++++++'+'+++'/''++'/''''#''+MKcMM]MMdOOaSO`QQ[OM^KI[IGQKI]KShKSnZl�]t—ax˜g}¤l~šn}˜lt•rt„hhrgcjVS^VKXOISMGSMGVI@KE@IQMVäàÞîêííìðìêîíëðïîòîéïéàæëã踡§Ã¶°ßÑÆÓ½ªÁ©“²£œŸ��‹…ƒƒ~~}|}�ƒ€€‡ƒ„ƒxu|ttvkhphllfllclogkpkljdonnuow‚qv�cg€OSvMUvGUwIKlGGcIIcC@XCE[GG^IMdOSvMXwOXwKZ~MZ}IUuIOlKMaKGaOI]KCXG>SE;KC9I;3@93;;3;@6C@>MKMlOVvXcƒcv•fx™h�¢jƒ¦l‡­q‰«oˆ¬u�¯tŽ­pŠ®n‡¨k†¦h�¡f|¢h}�ar˜aq’UcŒOVxGI`>6G9/66+333396;C;OGEgISyMX…O]ˆS]‡O[ŠKS|IQuIOpGC`G>ME9KGCSI;GG>UG>KMIfOInQUzQX}KZ‚IV~K[„KZ†MXƒI[‡K]†Md�QdŒQg�SfˆOd†S]€MZzKMfMKfQMkUSgSVjVVoVVoZXo]]p[U^~ow®£¥ÜÏÓÝÉÅãÒÐäØÒäÖÐâÒÊßÌÁ×¾¯Ò¶¨¸¨¤QOdQMdˆ~–ÕÒàËÍÞ²¸Î~ˆžMG[@;Oa]f^^lfl‚q…šahzMESOIXKIVQISXS^UMZŒ‡‹îîóïïõðïõîìóìëòïï÷ðïöïïõííõèçðÝÝ鯶ϯ´Ï´¸Ò§¯Å• ¸«§ÃéèðÊÊ×�£¾�™ºŒ˜ºŒ™»|‰­’µz޶~‘·€•º}”¸w’¶n‰´qˆ¯y’¹r‹¯d~£Ud„MZyQXzS]�VdŽUcŠS`€U]|UZtMGZMEXI@QGE[KKjIKnIMuIEgGEg>9K>;GC;G>3@;3>96;936;3@;39;6E@6O>9I>3E@9K@;M>;@>6E>6C93>6/33/66/9/+3''++++/'+/++/+++/+6+93/;63@@6E@;KG@XQIZQKhOIa@9E@9I9/E6/;9/96/63/33////'6+66+33/3@3G;3K>6U>;S>;O>;Z@3U@6X3/6/'++'+/#''''++'+'#''+/+//+/3++6+/3++++'+++/+3++++'+++++''+''/+'''''++GESECOG@OKGUQIaXM`VQcOKZMGQMMZSXyUa„]q�c~Ÿg€¤nƒ¦w‚ p„žny”lp…cfr[XjQM]OKVKESKGUOIVOK`MESwnjìêêíçæïîðññòòòöòòõîêíðîóñïó¯–œ­š’ª™‹Ï¸¤· �§“Ž‘†€…zq‚un†‚„‰€y†~}�|o–‰‚�wcXfhaf|olƒxp„zv}pkƒxtzoqpounjrtn}qpƒUZ�KQyGIlGC]C9I@9C@6EE;KC9EC>GE;OC@XC@V>@]CC[@CZE>OE@GI@KI>GK>OK@XG;IC;@>9E;6@C;GG@UKG]UZxUc…Zh‰`|œaz™a€¥j‚§h„«j„¦lˆ«l‡ªj…©g�¢hƒ¤l„¤kƒ¦k‚¢f}ž]u—[p�Q^ƒKMjG@V>6>@6>>3;;3@;9E@9OE@cKQxOUzK]‚QZ‡MS~KOvGGhEEdKC[I@VK@XGEUGCSMI]MGUMG`MGaMMkOQuOSxIQvGMyGMrIKwIU�IS~IZ�OaˆQdƒQd’UkŒVg�Ug‡SXjQVlQQjUUoSVpV]pXVqZVhQOaqdqÙÌÏàÓ×çÝÞêââêãäêäâéâÞèÞÛåÖÎÞ̻ۺм´�Š�ZQdKG^ª¤·ÈÉØ¯¶Ï¤¯ÇŠž´E>QQK`ddtklzpuˆv‚—ZVfQISMI^UOcVVlof€àÛåïïöïîöïîõííóèæíðîõðïöïðöîíóéåîåàèÅÄÖª­Éª¯È¥«Á©­¾”œ¸ÍÂ×èçðÐÏÚ�™·Ž™º�›¾uŠ«‚�²�·‚•¸gq–^k‘ECcE6Z@6XMQ|v’¸x”¸[l“MZ�MZ‚Qf�[q–[t–]r›Zk‰Zh‡VXqQKdIE[IMlQSpIQvOUzEGcGGfC@VE@XE@UE>O@6G>3C939;6@@6G;3G@9S@>U@;O@9KC;O>9C@6G>6@9/93/6;6C3+3+'3+'++++/++/''3/3//36/@6/I;6M@6KC;ZI@ZKEXKE]E>Q>6E;6>/'9/+69/96/36/6///6366/39/66/69/69/E;3G;6O;6I>6S;/K;3K3/3''''''/'+/'+/'+/''++/3+/3+/3//6//3/'/+33/33/96396+6/+//++6++6///++/+/GCSG>GG@QKEXSMaUM]OK^OM^UQ^UXhVd~Zj‹a}�o„¨q„©q†§u„¢p�¢gt�dhwVXcKKQGCQICMC@IKIUMO^VQ`¬¯´ÓÐÏëèêîëðïîòðïóíêñëçìéáäãÙÞÛÒÚÄÁ̳°º¬§²£ §œ–žŒ‹�~}Šhn€xy„¶´¾ahzafugjw�zy’‰ƒyndd`[kgj…|nŒ|l��p‘‚p‘�v‘€x”ƒ}”‚‚€ŠU[€IKuEGhECX@;@G>KI>QE>OG;IE9C>6E>6C99E93;66@369@6GE>CI>QI@QICKE>OI@UG;I@9I>6CG>IKEUSVqX]}Zd�]q”`y�`xœaxŸg¤a~¢jƒ§l€ g~žc| j~Ÿh|™cwžf| fz£^y�]rš`o“QZ|KMnGCUG9II>MG9K@6EC;EE;QIGlKMxKQyIVzMOrKMrIIgEC`ECaGESE@QG>SECKI@KE@OKCVICVIC]GE]IGXGGgCEa@@f@@aC>fEKtEMqGQyOaˆMaŠVj’Xo•Zo”VhƒX^xUXtUShVUfUQaUQaVQfVQf]XkÐÅÌæÝáêãåìèìîëðíëîíêîìèéëçæéàÜåØÔáÏÃÔ¼¬¿§ž��—MIZOG`Œ‰›²¶Ìª²É§²É`j|GEUUQcvltloyzzŠ…�£SM`QM^ZVp§”¦áÛåðïõïîõïîõïíôéèðæäíëèòðïöðïõìéóêèñêæïáÞæ½¹Ë¶µÍ­ªÀ²°É¥«Å ›¼éçðäãí—¢¾�›¾��¾|…¨…�±†’µ £È¤¬ÁUUpC6ZGCj^p˜uްGCgU[…oŽ´QZ|O[zUk�d|£c| nƒ§gzžfu˜cl‡SZpQSqOSqQZ‚MZƒOZ‚KOpKMtISpIOnMOqMOpIGdECQ@9C@9IC9IC>`ECfEElIMpC>OC;O>;I>9K>9K93>;3C>9E3/3/'33+33//6//6//6/663>;6M;6U96K@9V>;[E@cGC[E@ZE;K96;9/3+'3+//6336//6/63+/636;3;;/33/39396/9;/C;3C63>96E;+C9/>/++++''+'3'/3///+/+''++//+/++/6/69/39//96G;6E>9E;6C9/@///6//6/+9/36/3639G@QE>KE;OKG]OGXOIVOM]SOdSKXUVkXg‡[l“d|¤k‚¨o‰¯r‡¨o€£o~™cn†VXfMKSE@GG@KE@KKGZMKVSQfqvzäâæéçèåßäáÙààØÞÜÐÕξÊɾÅÙÌËÖÅİ™¡Ž„‹~vw…||»¥”¥”ƒ›ˆz|qgf]^j^^­§ªploxnggacjo}~x€nfaVVccdwwqkƒvn†vhŠxkŽ}k�u–‡…–†�|‡S]€IKqCE`E>IE;GI>KM@XI@OI>EE;C>6>6363/33/666;96;@6GC>CI@QE@MKCMI@UMEUG;MC;IC;IKCXMI^Q[|Z`‚]jŒ`o�]vœ[t˜^xœhz¤f f‚©d} a| ^wš^r”at–`r—`t™`t–]u˜Zp“[jŠS^~MKlGGVG;MK@MM@OC9E@;IC>QICcIIpIMtKSvKMjIGkEE[C@VC>ZE>S@>IE>OC@KI>IE;GE>IGCUG@VI@[EC]@>Q@@^C>^C;]C;]CEhGOlGU|K[ƒOg�Sj•]o™[o”Vk‹UawSZpUSgXSfVSj[UnZQgVSkrh}àÖÛêãçìæèíêîîíòïîóîëðíéêìèçêãáçÝ×âÒÇ×´ŧž¹§¡OIZGCX`]t¬²Æª°Ç¯µËŠ�ŸECVMEZuqvzvxuƒ…›ZZlSOak`xáÙâîíóïðöïïõðïöíìóææïäâêàÜèïíôïíôíêóëèïëéñèäìÖÏÜÆÂÖª£¹¦žº©ªÇ�“´ÖÎàãàí ­ÆŠ•º�›¾Š®~Нƒ”´¸®ÎÆÊÛz‹¦E9VOMzo‚­z–¶IGjIEdp‹±`x›O^‚Xp›g€§k‚¢l‰©l‚¤l¢fr’V`|U[xS[~Sa‰O`†Q`…KXKVuQXxOXwQXzQSyOQuIIcE@VE>QG@VGCaGGlGIkMQoGE^@@[>;K>6G>3G;3E9/;3/96/63+96/93//9/69/;93;;6I>9U>9^;9X@;Z@>fE@`E@UECXG>I;3>9/9/+3//36366363/93/+6/3;/99/69369/99/;;/C63>3/;93@6+>6/9/+//++++'/'/6//3///''+++3+3/++3/39/69/9;6K>9E@;M99E63>3+36//9/3;3;6/6939MMfIGVIEUICQKEUOISMI[UMaVVhXcz^p‘au˜g|¢p‡©p…¤nƒ¨kz˜cq‹]awKGUEEQG>IG@IGCKOGSXVl[]r``y¾´»¤’œêæéíéêîíñïíðîìîïìîðíñáÖÖ …‚wgZ}jdtgc|nf†rd„uj‚rdug[znd«§³tuvzuoœ��dZ[¤§§�~‰jdpdckwnc~p^~p`ƒq]�p^„qc�}p�‚†rkrOIfC>U>>KC;CI>IOEVOE^QG[OCQI>K@6C93;3/33/3639;9EC9IE;EG9IG>KMCVKCSMG^KGXGCUECOICXOK^U[wXa�Vf�[o�Xj‹VgŽZn�cuœay¢]ušZk‘Zn�Sa„KX}M]€MX€OZƒQ^‚Sg‰UdˆVaˆQ[‚OMhKG`I>KMESMCSE@KE@SI@[IIcMOrKQrMVyEC^EC[C;K>9G;6@@9EC9GC6KC>KE;IE;K@6EC9G>6>@;Q@;K;6E>;O;3@>9K;3I>;UC@XGMwM]‡Qd‹Zp–Up™Zo˜VjŒVa„UZuSUkSK^VSg^Qf[Qh^Sj̸¶éãæíëñìéñÓÃÒÚÇÖîìòðîóðìïïìîìææéÞØæØÑÝɺη§Á®¤ut}GCZCCQ–™³­µÎ´ºÌ¼ÀÑQM[KEUƒz}Š||‡€�~|’��¥|l…áÜåïïõñïõðïôðïõîîôáÜåÐÆ×ÉÃÐÀ¼ÐåÞéîîõíêòèãëëèðìéðêèñåàèʼϲ§¼ž’¯“’¬–œ¼œ¤À’ž¿Ž˜¹�›º…’´}ˆ¯Œ­ÇÀÖååîÅÅÕnvœz‡¯�·‚–¶o‚¥KMjIItv�³p‹±OQj‚ªu�³x�²uŒ°uŠ®j|˜anŠ`hŒ[g†Ud‡Xk‘Xl•VgŒXg‹Qd‰Vh‹[g�ZhŒZc…U[zMOqOMjSSlOOwMVOZ‚KVzGMqEIuGIg@>]@9U;6E93963;6/96/;3+66/;939;3>>6I@;Z>>h>>c@@kC@g>@g@@dC>V@;U>9G;6@9//3+663@>9I>9E@9K>6>9/393;9/36/963363>9+9//36//3+33'63+/+''/+/++'3+36/+6/3/++/'/9/3/+/63>;3@@6@@>S@@ZEE]@C`@9S63;9399/6;36633;6COQuIGZKE[GCOKCQKCQMGXSQcVSgV`w^oŽ^q–j�¥k„¦nƒªk‚¢gp’`kˆSQjE@I@>EC9@KCOK@MVMX[Xh^arcg‡ÅÃË–�˜¸¬³ÙÀÁÖ¾ºÒ¶°±Ž‹¢„…¦„„£†‹ŒnjfKGaKI`IKcKMvacjjŠvr“Œ�Ÿ“�©¥¬tlcƒ}p|ld¢¤¡¼¼À]aqv~†wru}k`€vo‚tgypdq^wl]xrh|pfgakG>O>6C>9CC;CI@SSG[UG]SE[MCQI>M>6>;6;3/3639;9C>;IG;SE;CG;IIEVKCQKE]OI]MEZOG]IGZIE[MOkMOjX^‡SZ€U]‚M[zS^�S]�ZhŠZhŒVaŠS]~OZ}EGhCEaGE`CCUEGfEGjMV~QV}SZƒQVyMKgMI^I@UK>IG>KE;GE@OE@VGEfKKnKKpIKhE@[C@O;6C639636>6>@9GC6IC@MG>KE;M>6>9/6;/;;/>>6C63993@;6@;3;9/>>9K@@[GKtQ`‰Qd�[o™Zr˜[tœXl�Vc„OVxSQhUQcQOaVQ^`Qd“}‡çÝÝïìòѾȲ¤¾àØåðïöñð÷ññöñïñðíîíççëáßéÜÙßÊ·É´ªÂ­¥¥”–KEZE>Od^y²µË·¼ÍÄÆ×��–UQajdq ��–��”‡—ÓÈÔëçîñðõððöñðöðïõîëòîêòíêñæÞèãßéÔÉÙæßêìêóîíôãÝåßÕãêèðìèòìèðãÜåú̧¢¼”˜µƒ„¥™œ¼�šº�𹋖º‰—·~…«‹�±ÐÇÞëéñæäí¶¹Ð®²Ìů܏¾Ó�œ¼q‰§@;Sq}¤„”µu�°t�´x“·}–ºx“µy�¯n…¢l} kw˜dv’ctšauœfxž^x�^u˜Zr—]u›fx�`p—]o–]nŒV`…[f…U^‚U`�VfŒVc‡Sf�ScˆO`‰KVEIg@@[@6I9/>6/>93;6+96/;9/6;3;;3>>6G>9M@>n@@nCEkCEq@@j@>f>;[>9U>6G93>;3>9/G>6K@>SC>ZIEnEEa@>E9/39/39/>93;3/96+6//3+/+3+33'33+3++#+''/+/6+/9/39/3/+++'+/++3/6;3C>6EC>UGG]GGZIIfEEf@;U;6G;399/39333//3/6OQpOGcKC[I@OMGUOGVOI[QOaXXnVc|^q“^tšg}žg‚§n‚¤j| aq�[fQUfE;I>9@G;EKGQMGXVMXZXo^awdg…ÃÂÉŸ”œop‰Å–‡Ê£“Ï­žÆ ™§~u}VOvV]oSVkQOkMOjOQcKKkMMpOKhOKvacƒnf¨£±wolzphl^V£¥®ˆ†“SOZnxŠuq}Šyl‡yp�ƒ}�~tzk]yl`}rdyoca]lE;I93;;6C@6@K>QOCUOEXSGXM@QK>K@6E93;93363;;>E>>SE>SE>IE>MGC[OG^MG`OIcKG[IGaGESOKfMI^MMgOQkOStOUrIUvOUxOVwV^„Sa„Q^€KQoKOoCCcCCU@9K@6GC>ZCC^KQpQUwSV|QV}QQlOI]IEVGCMG>ME>EGCOKEaKIhKIlMKgIG[GEXG>S>3@93>3/3>9CC9IC6K@>GG;KC6I@3@9369399/3;3;;3>93C@6@>6>;/>>9O@C[GKpQXƒSf�^q›]uœXn�Vk�Q^…QZvVXpUOaSO]XS]n^oº§¯ìéîðíòäÝæÝ×àëæðòñ÷ññöñðõñïóïíñíåãìáÝéÝÜÞȸɲ«Ã­ªª—“QMaGESQId±³Ê¼¾ÓÈÇØ³µ¿hg|cZh©œž¦•˜¿¯¹íëòðïõñïöñðöñðõïíóîìóðíôîéñéãêæäìÏÆÐÝÖàéæïðîõêèñß×äéáíìèðìèòéåîźϧ£»––­~}œ‘’²“Ÿ»Œ—»†–¹Ž˜¶z‚¦‡‹°ÓÉàëêòéèðÓÌÜÃÀÓËÇÛÀÀÕ‘ Á‚—¹C>XZc�z�±�•µu޵}”¹}–ºy“¶y�³uŠ­l~ jy›h~œhy dz¡j¨az¤dzžax¢g| dz cuš`q™^o˜]k”[hŽVf‹]g�^j�Zk•Uk”Vk’Oa�O]„GOpCEd@9G93@93C>6>;/>9/;96;;3>>6C@6K@;S@@a>@d@EfC@n@Cl@;X>;O;9K>6I63@;3>9/G>9Q@@[IGgIGgIIc>>G9/99/393@;6C9/>6/9+++/'3++/3'3/'++'+++++++9+6;/39/63/++++3++3+3;9G@9IE@[GG^GIaGGfCE]C>[>9K9369/36//3/+639IOtKEfIEcKESI@QKEUQKXQK]SMaZc�^o‹^pŽcyœf|œg|ž`wœ[j�XdOMdE@KC;IG>IKEOQI[USaXXk`fyjqˆ²ºÅª¤²…�¤Ð«¢¸zd¯‚ríäâêÜÙâÎËåÐËÙ»±Ì¬ ´‘‰“rqfMUtZ^w^[tVXpSS}^Z¤Ÿ©aXVrhj��ˆfj}]Z]ZXcVV[fkw†€yŒ€r˜„x•‚�}tqzlVyn^tnjZOZ>6E6/93/6;39E9GOCUO@USEZI@ME9K;3>93663996>@>O>@UE>[IGVI@QECUKG^IGdMMhKGgKIhGGaGCUIE]EEVIEaE@[GCS@>OE@OCCUKEaGGaIKkEE]C>U>3E//33+33//6/;>6ICE^OSxQV|QVzUSqQOpI@SI>ME9I@9CC;KG;QE@XGG`GE^EEZ@9MC9M;6C93;6/9@6EC;IC9MC@MG;KG;O@6C>3;;/96/693>93>@9KC9E>6@;/>>9ICCSKMqOUO^ŠVh�Xp™Xn”Sk’UdŽU^†UZ}SOjSQaVShÀ¶¼ØÎØæàçëæîïîóåÝçðíõòòøòò÷ññõòïóñíñîåäéÚÖèØÑÝȸɵ¨¾¬¢£”“tqxMI[GCX¤¢¹¾ÀÔÌÈÛÖÖྶ¹tq„ò¸ÓÂÒñîõððöòðöðïõñðöðïõðíôïìôïíôîêñîèïëéñáÝéÉÅØÐÅÕëèòðîõïíóáÕÞêáêçßëçàêæãëËÃÒ——¸xzš}}Ÿ¥¨Á‰—»‹—²Ž—¸z„¡x~§Ä·ÏëêòêèðÛÖåÜØå×Ô⮯Ɩž¾Š–·[j…G>acn–~޳t‰®~•»tŒ°w�²v‘²t�´pˆªp„¤j�¢n„©k‚¦l†ªh�­h‚ªd§d|žgx›fuœ^q”^p•^p–Vl•[k•Xn”Vl–[n–]q™Vn•Ul–Oa‰KS|IKj>>S>9KC;U@6M>6G>6C>6;@9C@;I@9M@;O@>^@@k@@aC@X@>`>;Z>9S93K;3C93>;3>93I@;UGGkKIrKQqGIjE@]>9G>6C93>@9K>9K;3E//3/+///3/'3/++''#+'+///9+69//;363//+++/+/3/3;3E@9ME@Q@@UCC`EC]CE`@>[>9K;3@93;3/+3//3//IIhGC`ECXG>OE>IE@MIG[MK^QMjS^|Zl�]r—cyŸc~¡d}£`t–[g‰Vc€OMfG@OC@KIEUMESMIVSQ`[[|[cvht��¤²¾¹Ã´»É¢Œ“¸’‡²uZÞÁ­áÆÀêÛØåÍÍØ²­¿”Œª€yÁ¢“±���`^~]Z~cf‡dc“lg¥š¤VIK^UUt|ˆUKS[VZ^]g^Z^OKS`hxSIIn`[Œ�yƒwltj^rh]qkcSIO9396+63/9>3@E>KKCOKE[MG]G>K@9@93;;6>;9C>;SC>`@@`GC`EEVG@UC@UGG^GIdMQhMKcIKkII`E>UG@O@>OC;O@9EE9G;6C>6>C;GC6IC>ME;E>6I;9E93;3/66/69/3;/9>6@EGdOUwSVzVZ[ZyUQjMEXG>EE9E>6>;9>@9G@6ME>QE@XE>UE;ME;I;3>63993;@9>G>QG;MECOI;II;K@6@;/3;/6936939639>6EC;I>6>;/;93>@;EECaIQrMU~S^ƒUh’Ug�Uj�UfŽSdŽS]ƒSSoMOnŠ„—¬™§×ÏØÔÈÎßÔâîíòØÉÓïíõòò÷òñøòðõòðòñíñîææéÛÔçÖÏÛÇÀÅ­¨¸¤›¦–—�‰ŽcaoMI`~u‹ÀºÏÕÐÝÞÛæÙÔÛÙÒÛÝÌáÞÐàèßìðïöñïöðîõðîõïîôïëòíéñîëóíéñìèðìæïëæïçãìÛÓàÍÅÔêãëîëòîìòÔÆÔ¶ ¯Í½ÒìéðéçîÀºÌ�”¶y~ ••¯ˆ–¶�𵀓¶€�¬w‚£š–ºéçñêéñØÔãßÛçäãíµ¶Ëž©Æ‹–¸jxœE;[C>cMMur„¯‚‘¶oƒ `pštНy�³wбu‰®nŠ®o‹¯o‰±wŒ²oˆ«pˆ­p†«^y dr”]l’^hŒ[l�Xl–Zp•]p›Vk–Xl˜Zl—Xk�[l‘Zj“SfŒOV~KQxGIjGCaCEdG@]E9S@9M>9EE;GC9EICS@>KE>VC@^CC^C@d@Cd>3O;6S63K6/>3/96/99/CE;VGE^MQqMUwISwGE`C@X>;M>;QE@aCCf>;U>9Q96I/+6/'6++/'''+''++/9+66/36+6/+''++/+/3/6;6K;9I>>O>;M@;OC>V@>S@9V>6I>6C93>6363/663>ECaE@^E;ZE;OE>VE>VGCZIIhMMjS]yXj‘^n–`y cz ^u›^q‘^g�Zf†QOlGCXECSIEXKEQSI[VQf[Zu]dxco�‘™­ÀÀÊÅÊÒŒ}Žª”�¼|^з­âËÆäÉÄèÖØÙ¶³†^Zθ¯äÔÑÈ¡š†day]X~`]�kl—qo§šœdXXuryfkzXOQXVZ[[jSOXC;EVZf>66I@@uhc~o^qjctharj`KEQ>6>;39;6@@9CIEQQM]OI`MGZICM@;@@9E;9>;9@@;M@>SC@]E>cC@SG@UCCZGE]CGcIMfOMnIKjGG]E@SG@SECXC>O@9GE9M>9E@9E@;IE9O>6E@6I;3@>6E93663>6/9;3;936C;GEC[QStV]†[^‚[Z}VQnMC[G>OC9EC9@;6@@9GC9GC;ME;SCCQC;M@9K@6I96;;6>C6EG>OG>QE@MKCOK>O@6@>/;;/69/393996@;6@@6C@9E>/@636>9;C@[IKoKOpOZ�QaŒSaˆUj‘QaŽScŽS]�MSvKOpĿǰœ°äßçÌÀÆÔÈ×îíóÒ¿Ëîíóòòøòñ÷ññöòïòñíðïéêêÙÐæÔÉÙĺí­¸¤— ’�“Œ–qpyKGXg^u¶­ÀÙÖáÞÖáÙÐßâÖåÜËßÜËßêãïððöñïöðíóïìóíêïîëòìèòìéñëåíêäíéãîíçðëçðçáìÓÎÜÚÐÞéãêîëòäàéøɴ¥»èâëëèïËÃМ�»‹­|‚ ‹“³Œ“µˆ–³„’¯wƒ¦Ž�¹âÜêêèñÓÎßß×åçäî¿ÀЧ®Å�—³`jŠC;ZC;ZG@flv¦£¤È ©Áj‚§l‚¨w�²u‹±x�³pŠ®tŠ«qŠ®tŒ²v�´qЬj�§^w™[o“ZcˆV`€[h‡ZgŒZh�[k‘Zk–Vg�Uf�Va‡VdŠXg‰Sa‡OZzKUzIKnIInGGpIGkE@VE>V@;GG>MG>KE>MC>QC>QC@[CCaC@`>@[>9[6/;3/>6/;3/69/;9/GC;UECUMKpKOjKOpEIjC@[>>M>@SGGhEGlEGh>>[;9I3+9+'3++3''''''+++6+36+/3+3/++'+++++/+363G>9I@>V@;MC;M;9I@>M>6Q;6E;3>9396/693>3/;E>^C9O@;UC9ME;UE>VC;]ECdIIhOUvUd�Vh’[q“ayœ`uŸ^t–Zh…VgˆOUpOMkKKdKEVMG[QKcQOf[^z[d}`hŠv�›¿ÂÌÌÆÎpq�„ŽÌ–qâÙÐîççíÞßែ�x[^Å¢”Ú¼²Ì¤ –pl…hlvX[ˆhoœwp°©¯˜‘“�Šra^o^X^OIKCGQUhal€ž¢«UEK@6;^UUng]lc[kf^ojcICKC;GC>OCCZIIgQUqVZrVZvOXwOMaIG^GC^CCX@CX@@ZGEZEC`E@`GGaCCaC>ZE@^@@^EG^IEcCC`CEaGC[E@ZEC[C9OC9QE9IC9IG;OE;IE9M@9G@9C;3@>6@>6>>6G@6G@9@@6EC9OKGfXVy]^„``ˆ^Z…^Z}QGaI>ME9E;3>;3;>6>;3@@;I@;CC@QE>QG>XE;O@>ME;KE9GI@SI>OGEQI>MK9O@6@@369/39/36/3639;3C@9C>6@;3@96;@;@@9IGCVCE^KKpQ^„Q[€OcŽUd�Sc‡Q[�KU}MV€ÔÐØÝÓÛäÜå;±¢µîìòÓÀÈïíóòðõòðõòðóòîððëìïæáèØËãּ̺³¿§¢¶œœ ������„…QKd[Qn¡�¢âÝèζÑεÏå×çîìòïíòñðöïíõïíõíéñëéïêäëêåïêäìêäìèßéçàêæÞèèàëìçîìçíèãìÜÖáÌÇØÑ¿ÎêäìëèòÐÄÔ¶ ºÐ¾Óçãí®¬Á˜˜´uz–ž£¾‘™¶‡“´‚�µu†ª…‰¬½´ÒåàëËÇÔÜÕæêèðÓÐÞ£¨À‘–¸Œ±KKlG;ZZ]‡�”¹×Ïá§£²wŒ¯r‹²n‚§rŒ´r‹°t�´r‰«t�«nˆªrˆ¯oˆ¯g| `uœ`nŽSVxKIfOSkOSwQX…V]�OXˆQ[‚S[QUwOXzQVzV]}QQoOSuMSvKV}OZ�MUxIIgGG^E@KMCUI@OG>MC@IECUEE^CEfGEn@Ea>9U9/;6/C3/96/9;3@6/>>6C@9@C>KIIhKIkGGgGGfEC]GGlMS€M[†MZ„GOvCEg96I6/@3+6/+/+/+++'3'66/66+6/++'++/'/++363@93C>6E;6E6/996@96>9/>;3C93;93>;6E93>96CC;V@9Q@6SC9U>6I@9Q@;VC>^E>]IMpMZ�Q`ˆUl•Xp•`u–Zj�Xg‘SfŽQV}OOqIIdOI`OIXQK[SOgX]zZa}`h†lr�ª±½ Ž–cc�acÊœxðíïïéîîáä¼…‡—hošuyçÙØïéíëÝÜÓ³³·�‰¯”“¯¤­¥�«–Ž˜æääéãá‡qjwtt€…Šak~|‚Š–œ¦rhkG;CSMSaVZf^[g]Va^^—¡ªZUlVVuQMjKSvU]xXhŒVfŒZgŽVa~U^�QZyMVyM[‚IUwMUwIQtKSoEC^EE[C>[@>VE>Z@>aC;QE>O@C]@@]IGfGCaEC]C@ME>VE9GC;UG;OE>OIC[C>SC9G@9E@9IC6K>6CC6CE9CE>QG>SKGgVVy`]†]`Ša`…]VvUMgI;QE9M96>;3>9/;6/6;3>>6EE@XG>UG>XICXKEUG@OMEUKEXMEcKGZI;KM;SG9E@3>;/96/39/96/3;3C>6C>6@E6K@;EC>C@9EC>OE>XIIfMVwSZ|O]~Oa‰K^„KX�IQzEMuXUxË¸ÅØÈ×Ŷ½…y�ãÜã̾ÄíçéòîññíðñîîñìêñéåîáÛçÒÅáȾϴ¨¸�’¯œ�£��¡��£��fZp“‚ž½¤ÀñîõÜÊÛÔ¼ÕíéññðöñïõðíóìåíëåïéâèëèîçßçдÈ×ÂÕÛËÚàÕáæÝèæßçæÞèêãéêãêêåîèßèêäíÚÓßÀ²ÈɱÃçáêÌÃϸ¦´ÙËÚ×ÐÚÀ½Ð†�±‰Œª‰”µ‡‘²‚�¯ƒ�¬|€¡£ ¾ÓËÝËÉÛÙÑáêèñØ×åšœºŽ”­…�«‹•´„•´|Ž´´¯ËÄ´Èlf†E>`C>c>6^E@gOOyl„­rŠ®p‹¯r‰§v‹¯o†¬}‘´`tš]g‹UVxIEXGCXIEfMKoOQoKMkMKkIKgMGgKEhIEaKKfKEdMGaOSuV^‹Q`�Q^ƒMQuIMh@@QC;CI>IG;ME@GC@X@C[IKnIIrGGj@@a;3E6/;9/>63;93;9+>93;>6@@;@EC[IEaIKqIKtGKkGKvQc†Mc�Uj“Oa‹GX…EIl;/K6+>++//+3/+36'33++6/63+/++//++/+33+99/@939//93/36336366/963;93;;6@>3E>9K;6KICaC9XC9XC6VC9U@9O@9X@;ZE>^GIgMZ†M`ŠUk’Zn”]oŽVdŽUd‹S`…OVzMOpMMjMIcQMaUK^OK`SVkX]t^c‚r|�±¹Á �œ[^[ZtÄ™xñïòðêíìÜãªtu”lo©éÚ×ïéíïèíÝÆÃϹº³©´‚y‰‹�‹·¦¤íìðéáÝ�††‚Š�w|ˆUVfœ�Ÿ¤£¦g[dG>E^[[ZU^c]VVMKnrz §´ccq^cxX]vSaƒVf‰]kŽ^o•^p–Zh„U`�S`ƒU^‡S^‚Q^�OXKV~GOlGEfECXG@X>;O@9O@;U@;OC;Q@;U@>[E@^E@[@@XECXE>VI>MC>XG>QC@QG@]C@[C;SC;IC9GC6M>9IC9IE;CG>SIC[QMn^^€``„f^‡`a‡^[yQMjG;SE9I636///9/99/;96;@6EC>OG>UG>XK@UKI[KEXKEUQIcQIaOOcOG^OE[I>Q@9@>699396/36/693>C6EC9CI9KC@MICEG;GE>QC@MIG`IQpOU|OcƒO^�O^„OU�GMpEKnQOqÊÀÊ̼Ë×ÅËŸ’ž¿´Â² ¬îëñðëëðìëðëìñëêðèäíàØçÔË߯¿Ê­ ºž–´™’¨–œª’“±›™º­ºÂªÄÁ©Æïíõíêñêãíòïöðíõðîóíçïéãíëåíêãêá×àȯº­�¨ª�ª¯”­¯“¯ºŸ¶¿§ºÉµÆßÒÞèàçêäíéäêéäíåÙáÓÌÜĺÈÒ¾ÎàÜåÌÆÏ´ ´àÛãÎÍÛ‰”®�…¤‡�´…�¯€ˆ§‡�ªryš˜šºÆ¼ÏÎËÜØÎàêéðÞÚãžœ¸Ž”²†‘µ‰•³ˆ�°}‹³™�¶œ‹¯xn’VVwMMoIIqftšl}£[p�p‰­n‰­p‰¬tНp…«q‰®`xŸ[f�SUnE>QC;IG@XIG^IEdGE`I@]GCVE>UE>SE>UE@QG@UKGZMMrU^ˆUaŒO^‡QVyIKhC;KI@GC;EE;G@>CE@VE@[KQrKMxISzC@]>6G93C93>6/;;6>;/9>3@@9GC9CE@UGC`IMlIMvIMwKSvSa�Sg‘Zo–Sj‘Kc�EMn>6Q93@/+/3/3///6+36//6/33+'++//+/++/6/>6/96/63/93/63/36/36+663;93;;6C>3@>6G;6IE;ZE;UC9S@9[>9SC>[@>^C>`E@aIGjIMoISxQ^‡Uj�XhŽSc‡OX}KZ}KSvKKkKM`MI]MI`MI^VQjSUjSSg€‰˜¡šªŠ|Šy‡a`out|º�uîêìîåäçÌο“’­‡„°�¤ÝÒÖÔÆÐ±Ÿ®‰ƒ�†yƒ ©xrº”ŠÇ¾Á˸º¯”šrnukaXg[X†‹‘Ÿ ­€z‚`XZSMOQIMSKOMEESUh€Ž—}ŒUSXSU[`gzXjŽ^nŽ]q“]q•[q›Xn‘VdˆUa‡Vj“Ul–Uj—Uj“S`�O]~KOnC>OE>V>;I;6E;9I;6E@6I96@>9MC;SE>[EEfGEcE;SI@VEEaGG]GIgIGfIGnECaECZGC]E@Q@;IE;KI@KI>QKCUQOq[X~]`ƒ]cŠcc€aZ~UMoG@VE;V93;9/99/96/39/9>6EC;KE@]IC`MIgMMcQMhSMaUVlXVpU`‚X]xX^UVuOOjIIf@;Q@9G9/9;6EE;IG;GKCSOGSMGQI@OG@IC@QKIdIOoSX~OXuQZvSXvOSuMOlIInSQlÝÕÛ´¤µÖÄÍߨ×vo…€r‰ìéïîæäîçåðçåïäÜïæâñïóçÜÜѯ¡Ï¯œÃ¤•¾ –´™’˲¶ÑºÇÛÄÖ¿£¾¼�¿íåïòñöòðöðìôîèñíéñëãìêáëèàéҾͰ–¯¶™´´›²©�©¬�©©‰ž²•¯¯”­ª’ª¬•­Î»ÐêæïìçïìéïéãìæÝæàØáȷʳ ··­Ä¨ªÀ«¢¸ÏÅÖ™ ¼…�¯‡Ž«Š•¯}†§z‡§u| •˜·¿¸ÒÓÎÝÑÆÚêçñáÞè¡¡¾“–²ÉÄÙ¥«Á~‹¤Œ�¤±Ÿ»¯˜¹àÛå½ÃÔˆ˜¶kxœ^h�]dŠMUzC>[@>[cw�h€§p…­d|¡]n’Vc‡KQpE>O>;EC9IC9O@9G@6K@6E>9I;3@9/96+6;36>39E@MKKhQZ…O`„Sa�MSzGGc@9EC9CC9CE9EC;C@>OGEgMUwO]‹Q^†KQIIhC>S>3C;6C>6C9/@;6@>;@C9EEEUGIcIMoKSyKSyIU}OcŠSj‘[u [pœVn—I[€C@c@9S93;93>93>;+6;399/66/3/+/3+3//63/69/96/3++33/63/36/63'36/9;3>>6G>6I;6M;6MG@SC;OE9[C6VC9[C9ZE@fECdEC]EEdGKfKOtKVzQ^yO]ƒMXzKUxMZ€MSyMQvKMjOMaOIaQK^QIZQOaXXgÑÔÙ­¦µ›“žËÁÈÁ¸¶Àº¾ãÖÐàÙØëçêàÓÛÆ¸Â´£¬†qw|juº­«ÚÊÉ̲³ºšœŒw�y‰„y‰°¤™ëçæáÏÀ†rdnZQUMM¢§°�z€`XfSKIIGKQKKUOSjq~Š’¥› ªZ[hEG]MXt]j‚Xh„]oŽ[p–[o—Vh‡McˆSa„SdŠVl–Zt�Vo—`u›Xl“S`�KSrCCVC;K96G;6>93C63693>3/;639C;IC9O@>ZEC]ECcKKnIKuKIlIMnMKnIMqIMlGEdGEdG@V@;GI@UG@KMEVKEXUOo[Z}]]€]aŽa`„^X‚SIjICXC9M93;3/693>;3C9/693;E;KI@ZKE`QIaOMfOOhX`€^hƒ^lŒgx™dx™fy�cuš[j‘[k‘OZyGE^@CX>6GE;EI@OUKZUK[UMVMIXI@UE@SIG]GOnKMoOZtQSpOVrU[u�Чty‘[Sfæáç×ÐÕœŠ›îêð¹§­ÔÊÒïíñïæãíãàîäÞîæåîäãòïôÖÃÁÁ —Ï®›Ç©œÈ«©êãëÉ­ÇÕ¼Òä×åÝËÛìçñòð÷ïìóïëñíèîìåëëæíêãíÚÈØÃªÀ´œ´´–²¸œ¶§‘§§�§¦‰¤§�ª´”ª­�®¯�­¢…¢§�ªÛËÜìçðìçïëçíåÞèÞÐßå×áÜÒßÄ´Ê œ¸Š’¯Œ�«ª®ÄƒŒ¬‚‹§�—°��ªЍ‹¨�“²³¯ÆØÖàÏÇÙêéñàÝã§§º”“¯åâí�Œ SSllX|ÞÔåéåïÞØä`UqE;V;6K@6O@3O;6OKEnpu›ž¯Æo†§k¤axžVh‘Sa‡IMj@;K>6@>3;>3>;396/9>3;9366/;6/96339366//>6@G@ZMQtMZO^…MS‚IKl>9E;6>;39>3;>9C@>KGE`MV}Qc’Sg“SaˆMX|GKnC;QC>Q@9I>3@;3E@6CC>MKKkKMnOZ„K[�IVIQ|M]†Oc‹Up™[vŸXv›Uf�MOrEIgCCX>9G>9G@6G>3;>6@939///3+/3/66/>9/>6/////3//3//9/96+3;3;>9G>6EC9K96G96KE>SC9OE;XC9UC6ZC9XE@aCC]ECXGIdGIjIMkMV~MUwMVxOVqMUvMX�MQyMOpKQnMIVOKaQK`VQhVUj^[jÌÏÑãáèáàåèçëçåçææéçäçäÛÜäØÝ˸í‘–¢ƒ‡dkw^d¼¨¤áÏÉŪ¯ Š‘vo}�yy¯”‹Æ±ªíééßËÀ‚qd]SKKEE©­¸��žjcjSKSQIOXS^oq|…ˆ™†’„Š–>9EEGlIU€QfŽUo‘Xr‘Xn—Sf‹SdˆIXxM[MZ|Sf‹[uœ]x›^ušXl˜Vd‚OOrECUC;K96E96>63;336;/93/66/;@6KC;UC@cEEfEElKGhGKvKOrIOpMQuISyKQtIG`MKkG@Z@;IG>UE;GMIXMG[UOjXZzXX~Z`‡`^ƒZZQKnC>MC;K96>6/9>3C;3@>3@;3>@;IG@SKEZOIfSVrQUq[dƒap‘cr–qƒ§u‡«r†ªn�ªg~ at˜ZhŠKSoIKf@>MG>MK>KSI[VK[VK]KEVICQ>@OIG`EOgMQvQZxV^~Zaƒ[[u}–ˆ‡›^Saëçîèæí‹z‰ìçëëçèíìðíäáîãØíâÛîáÜïãßïççòðô϶­Å¢˜Ñµ¨Ò¶¶ÓºÁàÌÜÊ­ÈѸÔñîõðîôòð÷òïöïìòðëñíåìíèïíçëáÓàè·¹ž¯·Ÿ³´•®¼¡¸ª’¤ª�ª¦†™·–«µ—­´œµ¬”°¤‡¢¢ˆ£Æ¯ÈìçðìçñìèîæáéÝÒßãÖãàØäØË×››·‰•´Š“­�•²�•¶ƒ‰¥‰•²ƒ�¯y‰¥„Ž­Š�¯°ªÆÝÙäÉÂØêéñàß第Ŕ˜¶åáì[OfC9OVEfåÝêëéñ³¤¼SKoC9S;6M@9SC6U@6Vv�©¶´Î£°Æ€“²l€¡^t•Uf‹QZ~KKo@9G;6;939>3@;399/;;3@96>93>;3>9/99699/3;3;@;XV`€KV|Ua‡QX‚MMq@>O>3;>39>39;9>@;MGEgM[zUg‘Vj“SgŽOZƒIQtEC[C;QC9K>3C>9G>6>G@UMKhMUO^‡MZ|IVyEOvMZ„Oa�Zr™]tžZu�Sk�OX}KQy@C[@>Q>;I>3>@6C@6E;363/36/6//66/;6/;6/33/93/36/3>3;;/9>6@C9KC9M@9M96C96IGCQE>QG;XE9V@9VE>[C>XEEaKEaII^GIdIIkGOkKQkMSpKQtOXxKXuMSxOSwOOlOOgUOhUSgZQg[Vd]Zd¯­­­¦²¥–œ–Ž•}lxogw¸“ˆàÒÌâÔÒª—§cO]ZQ^™‘–±­´œ’�Ū¨Ø¼·Ñ¬ªª}r¬zu¼›�µ�ŸìèèßÌÄ€tqSGI][^¯°¸‡�ƒ�qjrfaVV`’™«–𬄂ˆSM[;6>3/;GS}K]�Mc’Kg•Mk–Qn�SršQq OvŸSn•OcŠMa�Un–Xu�XpšZl–Vf†MQoECUG>Q>9I>6E63>9/96/93/>3/3>3C@6O@C^GKlIIxOSzGQ}KQxMQ|SS|SXzOSqOOpKIdGCVC>UG>QE@MIE]OKgQUtZ]|X[ƒZ]„]VySOqKE]E;K>6C93>6/;9/;C6O>6E>6@@;CECUICaOKpZZzX]€`l‹jyžp€ t‹±~’¶y�´x�¯r‰°q‚ªdt˜V]yQZvIIdGCSI@OUIVQIZUKSOGXG@UE@QI@`GOnKQqMVrOUqMUoSQcSIZMEU[Q`â×àîìóÀª´íèëåÎÂåÎÁéÖÂêÙÇìÝ×íà×íàÝïççòïôÀ�˜Ò¯ªêáæçÜæØÂÑͳÍÔ¸ÍäÕãóð÷òïöñíõðìòîèñîçñîèñäÖáβõ–«¸›´¶œ¸´ ¸³•­®Œ¥§Ž©³•®¸œ·¶š±¯’ª¬‘¤¤‰¦©�©Ÿˆ¡œ…¢Ó¾ÔëåîéäîäÚæáÜéÀºÍ·¨·ÃµÉª¬Åƒ�¯€Œ§z‡£Œ–´‰•­„Ž®�š¶|‰ª†–¶‚‹ª´¬ÆåáêÐÄÕëçðáÞ笨¾‘•²ÃµËK@]C9MMCaèäîåßé­ ºVMjICglyŸ�–¶Žœ»y‘¸Á¾Öáàë–£¾~’´€”¸XjˆM]�OUwEG`@9I;6@93;>3E;3@;3E@6G>;K;6M>6G>6M>6E>6@;6C@;KIKnKSyO[KU|IOu@@Z9399/99/396>;6G@>ZKSyVj“Uh–Uj�Q`†IX€IIjEE^E@S>6G@6C@;EKE]QV|SX}QaŽM]…K]GQnIQwIV~Sg“XqšXp™Sk“SaŠOZ}GKqGGaCCXC9EC9>C9C@6>9/69/993@93G>6K;3;96E;6C;9E@9C>6E@9MG@VC>U>9O93G63CMGZE;QC9MC6SC9VC@ZC>UGGaGCUIIXIIXGE[KMaIKkIOkKOnMOuMS|KSzMStOUqSQhUQhXSg[VoZVh]Xlzu�¯¬¶ÐÑÔááæÕÒØÙ×ÛïïòãÝãàÚÝ´¥¯Ì»½Ó¿À«�„’rvŸvvæÒÒá¾ٳ«¿‘…©|tÇ­ ²“�äÖÐèßÞ‚kdjhn‹—¤—›£œŒ„�}udft“‘¡’š®}~‹`ah6+36/696KKf�Kd’Mg’Kj™Qo›Ol—Qr Qp Mu¢Sv£Sx£Vx§V§U}§X�«Vz¢Vu–S[IOaGEV@;K;3@3/;6369/6//36/;;6>>6G>@]IIhGGdIMrGOyMOwOXzOSySSoXVuSOaQIcMEXII`GEZII`MMqOQ|S]€Za„[c†V`…QStQOpG@V@3E93;6/;93@;3E@9Q>3M>6M@;MG>XIEcQKkXZ€Za‰ap”kxœl} uŒ¯€“¸}’³~“¸y�´w‰­h| ZkˆVg‹QVtKIcOI^QI^SKZVK`QKaKMfII[GG^EMkIOkKUrUVrMUpOOdQKaSM`OI`ª¸íêñîçìܸ Ý¿ªá˺çÒÄèÔÈÞÀ­ê×ÇìÝÛðêîòîôж¼Ð¸ÈͯÌïéòòñöïéñôð÷óñ÷òíõðìóñëôðëòïëòìãëҴɸ›²¹œ®°–°·—¯¸œ°ª�©¾£·¯�¬«–¯¸™¶º�·«�§¢… —z–�„š�™“~›š… —~–·ŸºèàëèáéäÜ๱Ŋƒ¤�‡¤ˆ‚�ƒŠ¡}… €‹©‡Š¥‰•±…‘­Žœ¶‚’¬Œ—¶‹�¬¯¨ÁèçïÓÉØéåîäáê¡¡ºz}¢ÒÆØZSoQKlkr™ÐŨɏÐȻ˜¦¾†“°ƒ”´†•º…–º‰—¼áßêÓÕá‹–µ€‘²u�²k„£GQpIKjEEaC>S;9E>9K@6E@;G@;VC>X@>O@>ZC>^C>]>9I>6I>6I>;GEEfIQuKVISy@Gd;9M6/36//93/636;6E;;SCGlMVƒO^‰M^‰KZƒKX€IOtGIlEC]@9Q96@>;EKCZOS}S^‡QaŒM^ŒKZ�EKuGMuGOuM[‡Sf�Uf�QaŠO[†O[„MQwIIdIE^G>KG9GC9CC9C;6@;3@93@;6O>6O>9O>;M@;OC>QC;KG;MG>SE@VG@]@@S;9O96KICOE>MC>O@9O@;QC;UE@QGCVECOIGSIESGGVIM]GKdIIhMMtKQrKOrKOxOSqOQhQOfSOd[Vl[[p`Xfa[hlal»³ºÐÌÐàßäÛÓÛÖÐØãÖÞÙÉÅäÜÕ»­·áÎÐçÖÖØ³¯Ì¤¢Ô±²çÎÌÞº²Ù±¥Ã•Š®‚~Óž²�‹Ñ°¤æÙÒ˜}q|€„©¯º��š™ˆ�€qq†”¥ƒ}�}~†llwC>E6+6;3C@>[Mc�Kd•Od“Mh–Ok—Mh–Ol˜Mn�Qv Su¡Sw¡Sv¢U}¤Qz¤U|¢U‚ªXƒ­Zt›MVrMMf@>I>6C63;3/33//3/93/3;3;>6E>;QEEkECgIInIQ|MQxOMlUU|QSqVQcVShQI`OGcECVIE]OMoQU|OX‚Q]‚Xd‰Vd‹S`�QUyOKkE>Q>3E9/>93>93E>3I@9Q@6I@6M@9MG>ZKEhQMpXX[f�cr“gr•jwžr†©uޱu�´y�²tˆ­q„«gzŸ`t•VlŒSc„QQaUOdSK^UO^ZVhVVlKMoOMpKMlGQoIMoGQpOUqKQnVVqQIfOK]OIZ¤‡”éãêç×ÖØ´–×µ�Ú¸ æÓÈã̻ЋӭšìØÌñêìòïôëáèÚÃÕ̲ËéÛéòðõóñøòð÷òïöñìòòìóðëôðëóèÜæØ»Òܳ¼—²½ž±§‡§´–²¼žµ­’¬¸›´´’¯¸›²¯•¬´™´œ‚�œ€œ�rŽ–v�¦�§§“­˜�žœ�Ÿ¦‹­ãØáçáêéãì×ÐÚ•”°Š„–yš…Œ§z‚¢|†£z… ‡’¬�—²‹–³�“®‡”²…’¯œœ¼åáìÎÅ×èãîäà鋊 [Vu×ÉØ|t�yy˜‚�®ªœ¼É¼ÔäÝ褪¼–Ÿ»�©Á„–¸‚“ºª«Éáàê¾Àщ•´‘±w�³uŽ­GMnIIkCC]C>V>;K;9E@;M@9IC;VGCa@>ZC@fC>aC@`@>X>9O>9K@;QEChEMpIQrGIvCCh96E9396/36//63696@>;O>@aGMxIUzKX~IU|EOwIMoEGfEG`>9O96;>9CG@VKMoMV‚M^�M[‰KVƒEIoEKrEOwKX„M[†O]ˆM[~MSxOVzIQrGGgECVI9IC9@C9CC9>93;>6E93C>9O@;S@;S@>X@>VECXE;KE>SE@]GCaGE]EC[>>Z;9UKGUE>OE9O@9M@9VC;SE@UEESKGSGGMMGZICUKK]IGgIEcKIfKMlKQrQVuOUpQSkSQcUSl]Vl^Zv`[p][o^Zr¯²¹�‰šËÇÉš�Ÿlr‘hpŽÁ”xÖ¶œÌ¿Æœy~Ÿxz–pk§|}³„„Û¹¹Íœ–Ș�¿‘‹¢Š�‰�¾‘‰É–‹Ç—Œ×¿«¼³¶´¸È�Љw|„Ž�ž}vŠrwƒ[ZfE>I3+36/6>6MESvMd‘Mg�Ol–Mk–On•Ol˜Qq›Sq Mu¡Ux¢Sw¡Uy¢U|¦Qy¦V}ªVªX€¤X~¨[ƒ­]‚©VhŒECZ63@9396/9639636;3>@6C@>KE@^C@XIEgGGgIIaGGXQKdSK`SMdQK`OIgMKgKKkIMrMVxQaŠSc�Sj“[k”[o•Qa‡QXuKOkC;Q;3>93@6/66/@>3KC;X>3I>3CC;QGCgGCaSSzQXƒX][c[h‡an�`r”du™fwšgv–fz™dw›g|¡^wš^t•[p“Zg„[f€XXqVUnZZqV[~Xa€Va�Q]yKVqOUnOXvQVwQVpQQlSSjOM`VUd²™¤áÒÙêàáÖµœÜÁ­ã͸ãŪßÁªÂœŠÌª˜ëÙÒîåêÝÆÜòíôïèñÚÄ×òïõóñ÷òîõòíõòîõñìóòìôñìôðìòœ±Å ²Ã–­Åœ´Çœ´³š¸¶˜¸®�¯³–«Ò»ÏåÞçëåìÙÎ×¶œ²š€ ¬“¯¨�ª´•¬ª�ª±•²§’²—œ•zœ­”²éäíéãìêáìÙÔߢž¸Œ‹«†ˆ¨z„¥r|š„�©z„£‡—±‹”°‡–°}Œ­…“³†“³¤¤ÃžÐãÜèÛ×ßK@UOCcÚÌÛßÛä¼¼È`c�aQt¯Åêçð½¼ÌľÑ××䭲ƴ´ÌÝÜé±²À–œ³Ž”©€Ž­y�®„•´q‡£Q]wGGjC@Z>>Q;9GE;OC;OC9ZE@dGG`CEfCEgCEfEEa@>S@>Z>;M@@Z@CdCEf@>`@;X63C93;93;>6>96C;9E;9I;>X>>V>@aCEkCKhEGjIMrGGfGEdC;S>6C>9C@;GGGoGMwIUIO}GMt@CdC@c>@cECfGIlEGoCC]C@ZCCc@C`@;I@;I>3>C6@C6@>3;>6@@6@93@;6I@9QGCZC@[GGfC@UG>OE;OE>VGE^GGcIMuEIoCIqKEQG>SC;M@9K@9OE;SG@QKI[QIOOKUQK[OIUIIVIG[GCUIE^KIaOOhSQnSSaQUpV[u]`z[]yZ`x]]t[Zg[Vk‚‚޶´¼¼ÀÆ�“ªlšwƒ ÃÄÉÙÌÉͺµÈ¨¥ÚËË«��qXZxX[špl�df—qr˜|rq„ŒxzÁ”†Éš�Ș�ÙÇþ²·°­±œž¨ª¦¯š–©hcqMEM@3;;3@6//;3EGEfKc„Mh”Mk˜Ok—Mk’Qn™StŸUrœUt£V}¥r•¶r“²]}¤�­Å¼ÏÞÍ×åÎÙæÃÒßy›¼v–¸‡¤Ã“­Ì–®Ë|”®>9G@9E;6E@;EC;CC;G@@UGC[GGcGE]@@UE>UEEZKC[OMaSK`K@XMGZOMjISyKU~Qc�Vl•VtœVu Xu›XuœUj•OX|KQwEC[@6I;3@63C;3I;3G;6IE;Q@9Q@9OG>SGE^MMtQSvUZyV[}VXzSXvS]uQVoUXuQVnZ^x]f…cwšhz�hz lžky™k|˜ah…]g^f}doŒaq•]o’[f„Uc}S[vSZnSVqQSlVVnSSnOQk‚nuÝÈÉêßàðìðß¾¨åμèÒÂíßÏáȰÁŸ‘Ù¿»ñêñäÖßϲÉßËÛìãíóñöòïõòðõñíôòíóñìóòíôðëòñìôáÐÝÄŸµÐ¦·È¡¸»œ¶¹˜´´•²À¤¼Ò¿Ôëäîìèïîêòíçïîéòèàê­‘¯¡ˆª¡„¤¯“«ª‰¤ªŒ¨£…¤žˆ ›…¤™… ¼§ÁÞÒáéäíåáéÐËÙŠ‹­�‘¯„‰£~…�rz–z‰¦��«‹–±ˆ•­z‡§†”¯~ޝ‹š¹¦©ÄÁ·Ð��•C;MQEcæÜéãÜã��ŽE;SK@`—y ìêñÉÁÐØÑàãà黺ÏÒÏÝŸ¥¹‘–ª‹”«|Š®~”µ�”²†—±‡–­��«GOrECdEC]>>O@9K@9M>6O@>S@@VCCa@@`@@cCE`E@]CC[>;Q;;U>>U@@a;6S93I93C93;>9IC;MCEZ@@Z>;X9;M>9I96G96I;>O;@Z@EcCE^EC]@;[@9G;9C>9G>>Q@>^@@a@@aC@c;;Z@;Z;9O@6V>;Q;;E;9E9/;;3>96>;3@;6>>/6@6;@6>E3;>3>@3;;3>@6KC;ME>UC@]C@VC>U>9K@6GC;QGEaIIjKQwIS|MZ„ICSE@OE>S@;SC6SC9QE@XEGUMGUSKVSOZQMSMK]KI[GCXGEaIG^OQkOM`UXhU]uZ`y]f�]c…Z]yXZoZVg[Vgjfv©­ºÃÆÌ—š«�žµÈÒÙíîóîêïÒ½ºÚ¾ãÆÃ­‚‚‹kg½ šÂœœ‚a^€dhvw‡}ny˜qkºŠ€Éœ�Ó¶ªÙÎÑ®ªª²¯´ª¤ª�š§‰zƒ^OZVGKE9C;393/+C9QGGlKhŒMk“Ok‘Qo˜Qp—Qp™Sqž`£h†ª›µËÎÙå¶ÆÛ^�¥È×ãÝäíàåïàäîÛáë¶ÉܳÄÚ³ÂÜ¢¶Ð™¯Ë‘¬ÇQSdE;KE>M@;GG@KGCSCE[EGXEE]GEXC@XE>QECZM@[MI`MG]ICUKE]KMkKX€O^ŒOcŠVo�Vt [z¢Zv ZtœSn—O^ˆMX€EEgC>U>6E93@96E;/@>3IC9S@3MC9QC@XE@aOMkQUySVzXX|UVwQMgQShMK]MK`OO]UXlXc~`r‘l€©l€ªq„«l¤kxœhq‘aq�fr�gu–gvšdt“cn’]cZ]~Z^tV]lX]pXVlUVrQOh…qyÓ°ªëâãñìïÝÀ¯ãȲæÎ¼îáÖã˼έ àÎØñëòñìóêàéòîõóñöòðöòïõòîôòíõòìôñìóòíóðêððìóѲÅŦ¾Í«ÀÁ¡¸µ˜­¸œ¶À¤ÁåÜèëäííèîîéðíèîíèñïéñíæïȵģ…¦¬”²©Ž©©‹§ªŒª§ˆŸ¬–²¦�§ž†§œ†¥Ã­ÈéãíèãéãÞæœ›µŽ�«‹’¯|†¢ow“tz—�¦Š˜²†•®w†¨‰—²€�¯‰š¸�š¸ª¥¿�ƒ•E9MUEféâíÙËÖ‚q‰I>ZUGn¤‡¬íìñÏÅÑߨääàèÃÁÑÁ»É––¦†’«…’¯��­wŒ¬�’®‰™¶‹š²ƒ’²IOpECa@@V>;K>6G>6G>6Q>6O>;S>>[@@aCEdEGhECcC@a>>X>;V99M@>V93G3/;63C96@>9KE@ZIMdCE^@@[;;V>9G33C93E;9O;;S@@[@CaC@X>9Q>9I;9C>6@96C96E;9K>9Q;9O;6O>9Q>6S>6K93@;6C6//9+39/69396/36//9+3E6>E6@E6;>36@36;39C6GC9IG;OE>VC>U@9K;6E9/E>9EG@XIEcKQuKX�MZŠG>ME>IE;MC9OC9VC;QG@VIEXOGUUM[UO`XO]SQdMOlMOlMI]QXjQZqV^uZfˆ^l†dq�fw–ft–`jVXkXXh[Xfddw€ƒ�®¦¶êìñïò÷ñòöòòöòòöèàèÔ½¼ìßãàÄËcn…ht…u|npjkw…vv­‹‚­ˆ�°ŠƒÂ­©É¸µª ¤œ‘š�‚†vXXnSShMV`OXUMUG;I@9C6/3C@[IMoKg�Sp“Qq—Sqœa€§|˜±ÅÒß×Þì×ßêàåïßå零Íc…©š«È”¤Äw‘´fƒ­o�±¨»Ô¥¸Ð§·Ò—¨Ávtvoh`uohhgoSOcOK[SO`SSoOVpMUgKOgQUrIKfGCVG@UIC[G@SIEUG@MKEZOQqO]‚Sd�Vl—ZužXpœVqŸZuŸUu¤[r¡UcŽO]‹GKuEC[E;V@6M;9G@6KC6M@9OC6O@;IEEaGGlMO|U^…ScƒZd†X[xVXtOOcOIVMCQQIS[[t^al}Ÿvвx�µ}”¸x�®v‹§n}�k}›l€Ÿo‚¤u„ªn~ gv–gj‡`c}Z[jXV^]ZhUUhVVpSVjXSk×ÂÁßËÆïçêîèìÍ©šÐ¯—Å¢�îæëèÝçÈ©ÇÝËÝîçïôñöóðöóïöòîóñíôðìóòîõñëñðìóñìòñêòîæïǤ¶·˜¶¸–²¶š¶²’§±’¤ØÅÖìæîêáëìçïìæëìâéíèïìçïîèñìåí¹¢²¬�«¬�¬­ˆ¤§ˆ£³—²¤Œ¥ ‡¤˜€žhƒ–‚¤Í½Ñà×ãäÞèÒÏÝ’•®Š‰¢†Œ®€‡¨x„¦x…¤��°‚’²t�¡�’¯~�®z‰«u„¨q| Ÿ”§M@^Žx›ëçïÚÎÙ¬ŸµSGd§™¶ãÞéîëòߨäéåîßÛ㯭¹��–~‰ ~�¨�¥yЧ}‡ |ˆ£~Š¢zˆ¢|†ž[j…ECfCC];6I9/;93>3+;6/;63;>9VC;X@@f@@d@>X@>X>9Q;9M;9O;6K63C6/@63C;9G@>VGKlOXyEOkEKq@Ec;9K96G93C93G66I;;S;9V>9K9/G;6G;6I;3C63C3/9/+33+3/'/6/>9/>63C;6C636939;3;9+9;396/363+;33;/3@39E6>G6;>33C3/;/+C39C6;C6;@9G>9G93>3/66/696>@;IE@UKKkOZƒOZ‡G>EE;GG;QC>S@;OE>SECVIGZOIUSKSSSdUSkVUnQQgSQjV[yX`�Zg‚[k‹cwšf|œo„¤ožlzœkv�`ay][k|�‰ÓØÜèêïÞÛæîîóðò÷ðò÷òó÷ñòöðîôƳºáÓÙ¸˜ ­¨­¯¬¶�™¤°°¸³­¶ËÀ½èäéáÙฬ°—��‹nt„hh‚f^y]ZhQXnUVjSUaOZXIQI>IC6C;/3IOnMZ€Kd�Vo�[vœ–ªÁåéñçêñÙàîÒÛçÎÙèÃËÞ‚—´g„©fŒ­�ºÐr•¶X}¢Ÿ´ËØßéßàìäåîâáë�td^Xf^Zlgd€�œŒœ±w�“][t[`w[gXc�VdUaUa|QVoMKfKEaKEXME[OG^QKcQUtV`†Uf�Vl’UtœVu›StŸXuœUrŸVužUd‘Ud�SZIIcGE`EEXG>MG;UG9OC;ME;KE@VIIpQX|U`ˆVgˆ^n‘^l‘ahˆ`fˆZc}]VnXQg]Vochƒfl�p�¢w�³‚”º�™»|‘´y�´uŠ­q‰ªq‰©o„¦oƒ§n�¤gw–cg|][o]ZkZS`[Vf`ZkZXtSSq[[w–€‰ÙǾ¶“ŒíäæíæèáÒÖÓ¾ÒÓ´ÐìàìòðöóðöóðöòïõóïôòíôòîôñìõñíõïêòñêòðëòïéïïèíáÎÛ¶š´¬‘§©Œ –x’�r��w“¯’¯éáêçÛáëâëëäéëãëêãìèÞæëåìëãëéßç˺Óy”‹v˜�t’Œt–ŠxŽŒv–�v’…t”„qŽ–‚œÉ¹ËߨâÚÒÜ®¨¹”•´‰Ž±‰¥|‹§vƒœnz–~‹ªv†¥|Œ¦}‘­r€œl€žMQh­¡¶h[|ÎÃÓÕÆÔÜÎÚÏÃÐ�†œÀ¶ÎäÝéîìòéæíëèî¹½KCEC3;>6@E;GMKf]j…dk~cdgk}]dqUUfGKjCCdEEg;9M93C6/3+'63/663;93G>;Q@;X@@]@9UC@Z;6E;6I99I93G6/E3/>66C>>VCE`KUuM[}KU|EOv>Ea93G66G63@99G33@96E63@93C3+;6/;93C6/9//6++/''++++/'+++36/96/9>6@;3@;6C@6@;/;;3>>66;3/;33>//;/+>/3C33>//>/+9+'93+@3/>369396/33/33/+3+/3/9>9IC;OIIgMV‚MX…C>IG>IG@OC;IC@ZE@SGCVIIZMIUQKSSQ]MIUSUoUVqXZvU[yUg�^n“at•g}žj€¢rˆ§v‡®t€Ÿow’tyˆ“�¥ÒØÞïðöñò÷êéñÞÛäíïôðòöññöòòöîìñ ��£‹šÃº¾çãåæáç§©²ÁºÁÐÅÈËÁÃÀµÂ¼­´«™ Šrq…koƒcf…hn�cfqX^gSZcQX]MVQEMI@KE>G>3;MSvSj–Oj“y�¬œ°ÆÝãìêìóÞâí¼Ë߬¸Í�¤Áv�­c€§Z|£v˜¹‡¤Äa‚¦d‰¬ÒÛçáäðâäïææíÜÑÓ‚pfg]Xc^Zxzƒ�¥Á–­É“¨Ãfl…`f}`o…ak„^l„[j„Zh†U]xQXtME]IGVOIcUOgSMfQUuUc‰Ud‹Sl—VnœSn™VvŸVu™UuŸUp›Vk’ScˆQZMSpMKhGGVGCQICOE;KG>QE>IGG]OQwQXxXh�[q–^v™frœaq”ck‘`f‚`[n[Ul]Uhdj…hqŒn�§~’¸}—¼˜¶~”¶y’¸uŒ²q޳vŒ­tˆªv†«n£htŽ[f~^]l[UhfXf^Ua^Q^XXqXVkV[xka}¼§§µ”‰ÞÌÎëàèíéð̱ÏäÖåðêòóð÷òðöòîôòîõòîóñìôñìòïèññìóïçðïéðîèñîèïîèï×ÄЯ•°�„�¢Š™’t‰ ‡£ž†¡›„¢åÚæéàéëäíéâêëãìëãëèßçêãêåØãàÒÝÁ±¿‚j…k‡†n‰}h€jˆŽ~š‹v‹„q‰…w�ƒoˆŸˆ�ÎÁÑÙÎÚ¼¸É§ªÃ‰Ž­…�§ƒ‹¨}‰ªv„¤xƒ v‡¤y‡£~�¯dw˜`p�@;UŠ„Ÿˆy›ÚÐß²�¶×ÆØ×ËÙ´±Á½´Êäßéîìóìèîéå쎇†C6@@3>96;>6;;3EQOhZ`v[[vpwŽXauGGdEE]GEnEEg;9K93C6/93'93/963@;3G@9S>9U>>U>9K>9K63>66>63>63>93G6/C96G@;QCC^ISvM]~ESt@Mq;@S99G66E96C;6K63G;6E33;6/63+>6/C93>;/@/+3'+++'//+++++++/9/;93C>6>@9C>6C;6>>/>;3>>6993/;33>+3;3+>//>3/9//@/3;/+>3+@3/;/36/36/3GEO//+3'6//3@6GE>VIIlIOKV„C;GE>KE>OECVGEfIGcGGgIGZOIVOIQOO]SQd[XoX^zZaƒZg�^o–]t™d|žp…ªn†«x�¯yŒ¯x‡®²·»íïóðòöòò÷òòøòóøòò÷ççíìîóêìòêêñëëò§©Á‘™±ÂÁÍóñõòñõçß秦´¬¨¬ÑÌÑÝÓÙ¶ª¯²£ª�tuŒpt’qq�pw�ffwcdlU]nXacSXcMSUISKCGG>GGCUSg…]u˜š¯ÂæéñëìóëîõÝß뚣¿Xrž]|£† ¼Ößél�¯Zz Uu›Z}£r޳ØßèààìßßêèèòÝÏÆÆ§‰k`Uh``w€Œ–¦¾‘§Ã”ªÆ”©ÇŒ£ÀuŒ¦`q�gw•hz—dœ^t”]lŠU`�UZxVVtOGVUOhUQqV^xUg‰Vg�XpœZw XuŸUt–Sn˜Un—Xt�Zn�Vl’Zf‰Xa�U^}SSgOKaOG]QGcQK^QM^UUpS]�[d�^o•cwœgzŸj}ždvœ`p”]jˆ[]q]Zqcathp�pw‘w†ªz�¶‚–·|™¹�•±}�²x�°u�±~•µy�²q…¤o‚£jq‘[[p[XkaXj]ScaVhd[n]XrZXwVZ|Z^|kc�ǯªÉ´ÆÛÁÙîåðòðöòðöòïõòïôòîôñíôïêðÆªºº�´ßÎÚîèðîèïîæîïéðíçïîèïëäëÔÂ˪�£§Œ §�©›~—ªŒ¬¥‹¥ª�£µ•°ÖÀÑíæíëáéíæìëãìéâèëåëÙÈÖšš–}˜˜�œ�v“–~™�x–‰v�•€Ÿ”€—…q�td€l]|~k‚‚n‰ÕÉ×ÜÐÚÐÏÚ“—µ‡�®‰�°z„ t…žq~—u¡r�¢v„¥ap–IIj96EE>VˆŠªÁ¸Î™†¤Ñ¾ÓáÖäÎÌØÐÈÝéäîïìòéæêÐÈÉE;@>6;>/6>6;9/3;39;3@;3>>6@aj�IOcEEaEGlEEdCEd>;Z>6O;3>3/963;66@93>>6O>6M>9Q93C>3E9/;3+6/+66/;6/E3/>66C;>O>@ZEGjESqCQxCIl6;K63C63C96G96C36C96E63@9/;/+;//96/;6/3++6++//++3+96/963C@;V>;XC>S;6C96@96;9/;;3;;66>699//>+/@/+;//>3+9//>/3;3/@39E69C9;>6>;3993@3/93+693>C;OEC`IMlGQwIQqE>KE>QG@UKI`KGlKKnKMpII^OKdMIVMK]OOcSXnU`€Xa‡[k“]o”^v�cz›o†ªq…¥uŽ® §ÀÒÖÞòòöòóøòóøóóøóóøòó÷òóùóóøñò÷ðò÷ñò÷ìî󇘴~�©�™«îìïïêïæÞá§¥¨�—–¨¦£²¬ª³§®›„„ˆqr�pt�nk…ll}ckx`ddSVdOX`OU]KVUISICKE>CQZwÌÔàÎØåàæïêìóêìòåéñ~‹®ZtšUuž¶ÉØÙßꜩÅaƒªc†ª‚¢¼ÅÔàÞäìêëóØ×åáãíçäçÒ·˜«�qf`Z�—²�§Ã˜¬ÇŒ¤ÁŠ Àd€¤Zwž[y�`z–ar’dzša~ž`ušau–ZkŠX]‚V[uUQfUMcUSnUZyVg‹Xl‘[r›^|¤`}¢Xv Vr˜Xq™Xo•]t˜]o•ar–ck‡]f…X[uUVhUOfMCUVUgUVq[c„aj‡^n�dw™f~¥c€¢h~£cwšduš^p‰]]tZZxc^rdo‹ku–rƒ¦qŒ¯t‹°v‘¸x’³z’¶y‘´}“¸|’´rŒ¬j…¨g}£akŽ`^t`Ud]Sa]S^ZSd]Ug^`|[a€fk‰rp‘šŠªÜÈÛêßéòïõòïöòîõòïôñìóñëóîçîäÙã³–°¨Œª¥�ª«�©È°ÆÞÎØïèîîèñíçðïèðîéòîéñÁ¯»©Œ ¯–­®”ª±–¯§‡ž¾£¸´–ª·”­éÛæïåëïéðìäëÞÌØË±À§ˆ¡¬�­�ƒ¢ Œª¡…– ˆ¦ª’© Š¤ Š¤Šu��v��|•ˆp‡yc~p[}ˆr�ÞÔàÝÒß´²Ä�”±Šˆ¤…�¯w€œtƒ¡cpŽn|›n€ gw•@6I;6KKI`gw•MG`‚u“ÔÀÏçàêÞÛãàÙæêåíîìòÙÔØ‰|uE9CC9EG9EkV`]KKVISQEOU@IM>C>6@96;>9KEC]EElEGkCCd@;[@9M;3I93C96G;3E;6I93E;6>6/36//3++3+3/+36/63/;;3G66@99I;;Q>@Z@Ga>@c;>V63@63>33@93K96I66I;3I63C96@/'>/+6/+/3+33+>3/;93G93E>9S@@ZECaEEdIGd>>K;9@633;/;;6>@9@@6>@6>>+/@3+;//9/'9/6>3>>3;C9EC;GE;K@9G>9C96>3396/993>@;OGGdGIqGOpGMxE;GIEVE@VIGcKKoKKkIMjIIkIEZKGVKGSMKXMSfQ[wQ[|Vf�]p™]vždy¥f€¢f}¤w‰©ÒÓÜîïôóóøòó÷òó÷óóøóóøòóøòòøòò÷ðò÷ðòøðòöëíó„”®t�ªzŒ¢ÎÀÆçàãäÝÞ¶¯µ£œœ¦¤§¬§§¨š –}ƒ�uq�uoŽor„jny[^r[agOVaOUaQS`O]SIUI>GC;E[g‚�˜³Œœ¹¾Æ×ÔÖåÌÏÞª´Í^xžSqšUqœ† ¼‘¢¾pŒ²¦½Ñ±Å×ÄÓâÚâìãçðééñÜÝèåæîãÔÈɬˆ”wdggd�§Å–¨¿™ªÅŠ¡¾gƒ¨Sr›Zy Zx—a‚¡^t“du�`x–cw�awš]o‹Za€U^|VS`VO`SOjUVuXdˆZg‰^rš]zŸ]y¢Xu�[w™Xt–[t–aw™`x›at˜dq‘cn�Zc}ZXq[SdVMcVVj][rak‡cp”cu—dwœg}¤g~¢h€§dy�ctšZk‡Zaz[Xra`tgnŽor’t€ t�¯y‘¶v“¸v�¯w’µw޵u�­y‘±t‰«j}Ÿax™^jŒZ[p^Vj[U^[Q`[Qhc]l^a]d‚†€–º¨ÄË´ÓåÙæñîõòðõòîôñíôñîòïëòïêñáÖß¾¤¸¤‡£¥‰¥¯“©³–¯³˜¯ºŸ²êàéîçðîéòðêðíåîîéòáÚ䜄–¤‹£¦‰¤²‘­­Ž§µ•®¶–±¶”ªØ¸Ìîåíïéðå×ßµœ² †ž©�£§‹ªœœ Ž«–• ˆ ›‚Ÿ¥�¨¡‰¡‰r‡”~™•€˜zg~j[zq[pyd‰Ä´ÊÖÊ×ÌÅÓ’–°†‹¨„ˆ§�‘¯q‚ grŽp~˜jz™ap“>3E;3GKIhXdC;O]OoØÈÙäÜæÝÖàâÛçêåîîìòËÀÂg[]E9IUEQjU[r]g^MQ[KOXGMZGMUCI@9E63;;3;EC`E@c@@cCEf>;V>9Q;3K93>;6E>6K;3I>3E;9C9/96/36/33+//+36/96/;6/@33@>;Q;;O>>Z>E[;;M99K66@93>63C6/@>6M96I;9O63E93C/+9++6//+6/36/C63E>6U@;VE@^GIrGMrGKtKMn@@O96@639;/;@6EC9CE9CE9GC3;>/+;/39/';39@3>@9CG;KE>KG>KC;GC;E;9@6/96/;63>E>XECfIIhEGpCGlE>MKI^IGcMOqKOzMOxKMwGKcIIdMKaKMfIG]KQnMUxMSzO]†UdŽ[o’Xo“cv–l} ÍÊÅóóöôóùòóùóóøòó÷óóøòóøóô÷ñòøòñõñòöðòöðò÷êíô…”²u‰§t‰¢�©ƒ†Ÿ“•�¤£°–�Ÿ‘‡�†tv‘wx�ww�vq�q|‰np‚hku[fqVZjU^gSZfQZ^MZVKVI@KKEVÎØàÜâëÁÏÞÝáêãæïÞãíh„¤Ml—Uo’Sn˜Sp™`z£ÛãìÖÞëÒÜéÓÜéßãìéëòææïççïçäéÕ¹Ÿ’|jf^^Ž º“©Æ“§Á‡Ÿ½Up–Ql�Vp�] `€¤f‡ªa}—Zq‹^u–azœcxœ[q’]hŒXf„QSlOI^KI]OSoV`�Xfƒ[p•awœax§^z¤`yœ`xšaz™n€£oƒ£rƒ¦k|¤gvŸco�ZcxXZk[XpZZq^cy`jˆfq“fr—d|—h}™h~œf~¡cwœ^p”[j�]c}[cy]]pah~kt‘p€¤w‹«|�±uŒ¯u‡©u‹¬n‡­h‡¯nˆ®g‡«cx™cxšZd„Z]rZUf[S`aVh[Vf`^~™‰§ÎÄÐðïôñîôñîõòïôñíòñíóïéððèñïêðîçïÒ¿Ì›€š¡†¢¤„œ©Ž ¬‰œ¡�Ÿ¦‰ž¦† ¯‘¬ÓºËêáéíäíîçîïéñìäïË·¼ª�¡±”­¸œ¯±�¦¾�·¾›¶Ãœ¶º‘ªºŽ¬À™°¸–¯©‘§¤ˆ ®‘ªªŒ¤«�®—~�šyš—€œ•~š–�œ�}”‰tŠ�vŽ}h~|lŒ…u‘tavdˆ…r�’|šÖËÖ¼¸Ë ¢¹‡’±|Š¥}†¤wƒ¡gr…gtŠGIa>/E6/;MMf@;K>6C>6IÔÇÖÔÆÖÛÑÚåÝèêæîîëñªš•UEIM@I‹tu„jpx]]t[`jV]aKOUCIO>E93;3//6//9/6C;VCEc@@`C>fC>Z>6U;6Q>6I;6E;6I>6I;6;;/69/66/36+3//39/66/96/@63;93E96K;9K99K66C63C63@6/>3/;6/;96C66I99I93C96>/+6++33/393>;9O@@`CEdIKpKOvMZ�OX‚MU~KQr@CZ;9E669@9KC;QE@ZE>UGCXE9ME6@C6>>3996>C6EC;IC>OG>OE>GC;IE>O;6@63>3+9;9CG@]ECaIGfCEcCEaICQOQpSXzMV}MX‡KU€KQyIOwIKpKMfKMkIKkIQrGKuKMtIQuMV~O^�Vg“y~�½¼Áñëãôôùõóøóóøòòøòóøóòøóóùòóùïñöðñöîñ÷ñò÷îðõçêòŠ›ºvˆ¥~“­�§¸}‰¤šŸ¯™˜±…�§­·Ì›…Œ°Ž‹�}z…nh‚ghƒdhƒfl|^`|^avX`lSZgSVfMSZISOIZV^|¥¯¾”¤ÀwНª¶Ë¹ÅÕ€–¶Sq“Qk•Zvœ|š¸kˆªºËÛêìóËÖåÁÑáÍ׿êëñêêñêéñçáæÖ»¥Â¡zg`Vv‚Œ’¨Å�¤¿�§ÅXl‰OdˆOgŽ[yž]} ]�¢[¦d‡«[z›Sd‰Xo–[o‘[o–[gŽXf‡QUlIEZIC]KG[O[yVcƒZlŽcvœ^uœ]yŸay£`zžf}£pƒ¤t†§vްr‡§p‚¡fr„^j]cxZXr[^}`a„Zg‡]l‘`k�^p’dv˜dy›fx˜hyœ`u™]l�ZczV`u]^u`k‚go„ny™u‡ªrƒ¦vˆ¥q…§oƒ¦j‚©`~¡d}¤ay¤^p˜Xn‘Vd‚VZnUOcVQ][Vkga€É¸ÇñîõòðöñîóñíóðìòïêñïèðïéïíåïîæïçÞçÉ®¿¤‹¤£‰ £Š¥œžª�§¢„”››¤‰ œƒœ��™œ‚œ«’­ëàéíåííåïîæïíçîÜÌÙ¯’¬¸œ´¶—¯¶�§Ãœ°É©¾Á—°¹›²¸’­¾ž¸ºžµ½ º§‹¢¥…£¨Ž¤�|”Œq�‡q�Žp‰¸ª¿ Ž¢ˆpŠ’y–ŒrŒ“~œœŠ¤ˆt’h�wh‰l[yž‹¤×ÒÞ°«¼Ž–·�Œ©~‰§w€�q|–cr�C>M9+@6/@Zd�>3E>6>>6G�…¢¢š´ÓÇÓäßæéäìîìñŠwjK>C‘rz§ˆ„šzz’qouZ[lVX`QZQCIQ@G9393/+6/+6//>6G@9O@CaC@^>>S@6Q>6G>;C>6G@6C>6G>;C;3;;399/96/693>;3;;3E;3C63@;6I93C;3C69C66@3/;3/;33;3/>6/>;6>96G;9E96E;3@3+;/+693@>9KCEnEMrKVyO[€Q]ˆKX|OX|IXKKr@CV@>M;6I>6KC;ZEE`IGhGG^ICfG@XG;MC6E>6@@6E@9GE>KE;EC9G@;K@9G>6C;6>>3>>;GECUECXCCX@;I>>MKG`SVvQX‚Qa‹M]„MXzGMvIO|KOvKMoKOnIOtGMoGInIOtIMrKUwQ]|Sc�Ÿ ®áÝÖòîêôôùôóøóóøòóøòóøóóùóôùòóøñòøïðöîðöðò÷éìóãèð—¥¾tŠ¢…¡¶–­Àr}œ�–§››·…”ª«¸ÏŽw†ÝÁ¾Í¨ž®‡…„hqal‹ox�hlŠff�]`tXanSXgOVUGOSQkt…›ãæíÖÛè¸ÆÕáæïÓ×å~�±QjŽUo–w‘­·ÈÚ~–²ÏÙäëíôÁÏáºËÜÓÜèìëòêèðëêñàÏÈÒ¯‹«Šljkg–ª�¥Á�¢¾�›¹Sh‰O`ˆSl–Zy™]| ]€¡^ƒª^„ª`„£MUzQd†Uj�Zn’Zf�U]€MOkE@XECUGCSGMhOVyZf€^q•[p›^uœdvždxŸk¢p„¦t‰ªw�®t‹­p„§gu�]f]az[^uXZzZa…Xd[gŠ[d‹]p�Zp�cu•fzœk| dw˜^n�[g…[g^aw^gxhlƒkv—q�¥vƒ¤rƒªrƒ£l‚¦g¤c~¢]y¢]yŸZn�Xh�V^}UXnVSdUO`|h|ª–®îëòòïöñîôïíóíçðìåííçðïèðïèïéßêìãèůÀª‹¢¨�¤��� †Ÿž‚�ª‘¬�ƒ™™�› ƒ ™…¡¤‰¢ŒrŒ™‚�ãÒßîçîíæïëàéíçîíåê¯�Ÿ»—­¹–©¼•ªË§¸Ê¤¼Åœ±¸–°¹–­»œ´ºš´»¡¶¤…Ÿ¥‡£›ˆ£�x–Žv“Šq�° ²ÝÔÝÁ´Á�w‘™�™•zšœ„ —ƒœxcyqc}o^zcOnj[€ÈÁп·Ä�’®Š�­ƒŒ§v‚ tœjx�;6@;/C6/>V[q;3>;3C@9I~™�„¢¾²ÆæáéèâêïìòyhaK>G°’“¯��¥ƒ†‘vv|^]qZZaKMOCKI9C9369336/+3++6/393;@>[ECd>;Q>3G>6G>9E>6E@6CC9I>;@>3;9/39/363663>@6>@6I;6C96@;6>93;93>96E66C33>33;6/6//;63@;6@;6I>9I99C>6C3+;3/996@@>VGKoIS}O]„S]„Q]�M]�OVzKUzKOr@@[@>S>;MC9UEC`EEfGIpKKoIGkGCZE@UE9M;6C@9E>9G@;CC9GC;G@9I@9G;6>96>93@>;EE@UE>SC>O;6I;6EUXr[g‘Xh‘[k‘Uj•UdŠIU~KO|KMtKSyIOoKS€GS}IMzKKtKMtIQpMUrak†êççðæ×ôññõóùôóøóòøòóøòóøòòøññöñò÷ñò÷ðñöìîõïò÷ËÒáÞåíÂÊܘ¯—¯Ã“¢¼jt’wƒœ³´Ê‘§¾ª¼Òƒ€™°�ˆÞÁ·åÌËÀ’“˜qw˜on–jpšjkŒdc…`f‚[[xXZdQZgr…ÀËÓèéñÛÝêÛàëäæðŽ¡¼ž´ÌVo“—²ÈÍÚåÕÛéq�«¼ËÙëîô»ÈÙ´ÆÖãæîêéïéèîìéïÖ¸’Ë«�k]Z„–ª’¤¿�¥¿q‚ Sk‰Oa…Qj�Qp–Ur˜]z�Vz¡Zy�^z¤]€§Zx˜GStKS|O^…U[ƒMU�KOtE>M@;I;3@>;GE@XIKoS^ƒVg‰Vk‘ct‘aw˜f}¢q„¨r†¨v‹®wŒ­xˆ©n}žcn‰]dƒUZrSUnUXwU]�U^€UX|Zf†VhŽ]n‘au•gv�kyœ`q‘`jŠ[f[`wad^c�kt“q~ r„¥n}¢k� k}›a|œVrœ[t™Zn•VkŠUh�UZ�XXuc[uª›¬îìòòïõîéñíèðíêñèàéëåííèñíäéìâêîèïêá캘¯¥‹¤ª�¥�™Ÿ†¡�†¤›œ�ƒœ™��ž‡¢–�—‘x—‘t‘“x�˜€ Ñ·Èíåðîæîïéñïëòïçïìåí·�¦Ë¥¼Ï ¸Ê ±ÄŸª¼–°Ã¢¶¾ž·º›³­‡ ¨�ª›~™¡‚™�uŽš}žÑÆÖÔÆÓàÓÞåÜåÜÏÝ¿®½�z“…o‹n]rh^wgXtxazn[xgUldQtoa�§’«ÏÉÓ�•²‰�°|…¤oy�q–]j‹;/@;3CKVh939;3CQMnnx‘o|—~�žÀ²ÆáØäíêït^X~`jɬ¨½Ÿ ¸”“Ÿ~}ƒklzcagQVO>EE9E936>6;9/36//3+63+/96@>;V@;Q>6O>9G>9GC;K@9IC9G>;>9/36/33++9/933;@6C@9E>6I>;E>9K>;M99G99G66G66K96C6/6//393;93>;9K@9G;6C;6;3+996G>;MKGrKVM]†Q`‰M`ˆM[„ISyMV|KUrIOpEEcC@[CC^E@aC@hEE`EIoEIdIKqKGkGGaE@UC;MC6I>9I;3>;6;>3>>6C>9C>9E@;G@9O@;KC;KC;I;6>33663>]lŠct›f}¡l‚¨]w Uo™O]ŠMV~MS|KOvMU~KU|GStIMtKMpKMhKQtMUu®²¹òîïðçÙóñðõôùôó÷ôóùñò÷òòøòòöïïõîïõñòùííòêìóîðö­¶ËäêðÜß똫ȟ´Ëx† fq“x�©ÐÒጢ»¦ºÑ�¤¿[CIdIGЭ¤Î –³ƒw–khŸjd¡ndœjkškkœhh–a^rV`¬ºÉäçîæéòÛàëáåî§²Ëàäî¾ÉÝZn”ÁÏÞÖßéàäîj~ ­ºÌíîô´Ä׸ÉÛêêòèèïëêñáÓÌÊ­�’w`klq‘§¼�¡ºˆ›¶OX}MaˆQhŽOd‰Qn’Vq�[xšZ|œX~¡[y¤Xx ZyŸEIgIGjGOuMOtGKoEEf;9E6366/66/993>@>KKMpQZzUgŠ[r–`r“ay�p…§q…¦tˆ¬uŒ°v‹«ršgt‹cp‹X]xMOjKMlIOjKKdKMlOUtS]Zh‡`o‘ftšhyždw”`p’alŠZ`w[^v`a|jn„lt�lx™oz o~Ÿcwš^q”Uk�Xk�Xk‘Vh‹VdŒˆ„£áÝçêèïññöòðõðíóìçïêàèëäëìæîëáéìåêëãéêÞæÈ®¾¤ƒ™˜ƒ ž‡žŸ…˜¦‹¢©‡�¨�¤œ€œ¤ƒ–›–­”ª¯�§°�¢ª�¨´‘§¶šµÐ¸ÍñëòïèññëòòìòòìòòìòâÓßϯ¿Ì©¸É§¾½—²Æ¨º½˜ª¾ ³¬�ž €—Ÿ‡£—‚ž£Šž½§¹âØãéãìæÞèæÞêçàéãÙãæÜäøƊy‘ˆr��}“�q�“v’’y”Šq�~p‰u^~zjˆ¬™´µ¸È‹“¯Œ­v‚£n|˜lx”UZrIC]CCS9/99/9^`zow‘ju”q|–€†¥®§Áêçí~c`¹–˜Î­«É©¤Ã Ÿ°��—|…qwnZZUEIO>G;6>>69C;C9/36/93/3633>9K@9M>6I@9E>9G@6@>6C>3>9669/33//3'/6+36/3>6@C9IE9K@>IGGcIKlEGdCE[>9M;;Q;>S;3C6/>9/;;9@>9G@9E96@;393+;;6I@@VKMrO]‚Qc…O`„O]�MV}IUxIQrGOpIOjGKdEIkGKkIGkGGgEGlEIjEInIMuGIfGGcGEfC@VE;M>6;>6>93993996>>9C>9EC@MC>VC>S@>K>9C9393/66/9jx™n�nƒ¦n†­f~¤[q›Qf�KX�MX‚KSzISvKQvIUyGMqKMuKOpMVvQZvÏÐÒòììðçÚóðíõôøõôøôóøòóøòò÷ññ÷íïõîñöòóøîïóëíóêíóªµÆèìñäèñ ¯Ì ¸Ën� gx˜˜¯ÁÔÜè…�¶ª¾Ò¦¯ÅpISdEG�lgÍ “—‘”g`—fg›hh jf hg¢jf¥khp^oÌ×áéêñæèð¶¿Ó­ºÏÆÐÞàâì°¾ÐUj�¼ÌÜÏÙçäçñdz ¡¯Áìíó¿ÌßÈÔáêéñêèðìëòÚÁ­¨ŽpudXz‡–—©À“¤¾|‹©KZ�Ok‘Sh‘Og�SlŽSk�Vq˜XzžXzœ]zœX} ZyœCKhE@^EEjKIoEEcC>U;3>/+33////+6/3>9EIIgKSvUc�dp’dr—d|Ÿl€¥q…§r‰©tˆ¬w�«r„Ÿgu’an�S[|KMgIG`IGfGE]GEfMOoOZyXaz^jŒgu”gt–cv™gq•an†]d[^rZ]qgh�fp�hv—jwšhv–aq’[p–Sh‹UdŠUf�[n’ZjŽÁ¶Ìòñ÷òñ÷òñöòîóðìôìèïîæîëæíìåëìäêìåìêßåÞËØž˜š€˜ ˆ¤™‚ž¢�¦¡‰¥§ˆ §�£¡�«‘¨­’­µ›®«�¤¯�§®”®»œ´¶˜´É­ÅñêòñéðñìóðëòòìñðêòïèïáÔÞÆœ´É¦¿Áœ³Ä¡·º—­¶š²œ|–¢‰¢©Ž¨œ„¡ÖÈÐáÖáëãíìçïéâêêãíêåìèàèèáéçáèȺÉ�†œœ…£¤‰¥œ…œ�y“‹u‘‡tŒq^uc„„r–´´È–�ºŠ‘²t„§o}•ry�cpƒVaz96;9/66/6`f|lu•ft�nx–|‰¥ˆ‘ªáÜæ�okÁœšÉ§ªÇ¡ Àœ›¹—–¤†‡�w}o[aVGGK>E;3;939>9;;/69/63/3636>6@@9O>6O>9K>;E@6E@9@;6>9699+66/33++6/36/3>3;E;IC;ICEQKOoMSvMSxGSrCEcCEd@Ca;9K96C6/9>6C>9KC;E93;;393/999M@@XKMrS`�M`ƒM[yMUyOUyIUzKOvGQvIKpEKhEKoGKoGEnGMtCEfGEjGIgIIqIIdGIdIIjE@UE;O>9C96;;36933;6@>6CE>IEC^E@]ECX@;M@9K6/+6//6/9tˆ¤y�«z‘³w‰¯p‡°kƒª[t O`ŒQ[‚KUxIOvKOvGOrIUxMUxMOjMMoSZwéèìóììðäÒóíæõôùöóøôóøòò÷òò÷íîõëíõíïöñòøíïôîñõàâì¼ÆÐéìòéêðÈÎߣ¶ÍjzšŠ˜­ÖÞèÉÐÞ€‘¬™´Ì­ÁØvVf‚MStU]qS[Ša^�aa•faœlg¤ng«qn±ujŠƒuœ ªÃ ªÃ¼ÁÓ»ÈÕÒÛåäçïáäî ®ÆVo” ¶ÌÅÒàêìôp¤��³ëíôÑÖåàåìçæïíìñêæèÀ ‚g[Xf`^¢²Ä£¬Á‘�¶Q^Od�Qd‰Oh‰McŒSo’Oj“UpšVt›Zz ]z¡[yœf|šIXv@9Q;9O@9V;6K;3>/+'3+/3+3//6;3;@>IKMhQUv^k�cp–guœhyŸl�¤k€£t�¤v†¬}‹¨q†¥lw–coŽQVyIKhGC]C>QC9QC9QECZMMfQXv^g†ft‘gq”cq“`k‹ahŒZg€[ZoVZq]]qdk‚gn‡gq‘cr‘aq‘Xl’ScŒSdŒdk”´ª¾ÞÙãòðöòðöòïõòñöïéïäÙäîçîîçïíæïîçììãìîçįֿ̂…•«’¤²•­½ ¹¶—²»Ÿ¶´—©¸˜«´˜ª«�ª¼¡·»˜²·ž¸£†›µœ¬»ž¶¾ º¶–´¿¡¾ñéñðêñïéððéñòìòðèîòêðñëòãÔããÑÝâÐÝÖÂÌÁ¬À¼£¸¦ˆ¥«‘­¼žºêáéïêñíèðïèñíæííæîëæïçßçæÝæåÞææÞççàéÖÏÓyf€‚o�ƒn…yc�†oŒrd}lXtg[}�†œ¤ ·ª¯ÆŠ•³‡Œ©w…¡o�gt“dp�GG]9/3633Z`thpŒhn‰ox™y†£w„ŸŠ�§ƒf^¸‘ˆÀ•Ž·�ˆ¸Žˆ±�‘¤ƒ~�vtoZZSCGG;C9/96366/36/+3+//++6/6939>3;@9M@9E@;M@;M@9I@;G9696/36/69/36/3939>3@>6KC@SMQqS[}Ua†Vf‹OaˆKZ�KU}IInEC]@C`;6I>6>;9E@9G6396///+9;6I@;VKKjOZ�O]OStOUwOUrKVzKOxKQtIQuEOpGMoEIqKKuGKqCGkEMoGMlIGnIIhGIjIIqGCjGC]@>M;6>@6>@6;>9C@9GECVGE[IE[CC[@9I;6;3+/+/+3/3z“¶}‘µ~�´|‘³v�²u‹²g¤Vl”Uf�OZ~KOqIKrIStKSuKOqMMjOMlX[vîíòóííðãÓòéÜôóùôôøóòøòò÷ñòöçêòçêòéìòñò÷ãåíìïõÐÔåÎ×ÞæéñêíôÏÑá¡´Ïn¡ÀÌ×äçð’ ³ ¥Ã�§Æ³ÆÜ}w•nMVxIIvdhz`f‹`a•da–a^˜cfÇš•åËÅêßá×ÝèßãìØÞçßãëíîôçèðãçñæèðª´ÍUl•r�ªÅÒÞìíöt„§�“¯ëíóßãìèéðêèîìéíÕÀ¸k^`ZUv�Œ‘œ´’ž²wˆ KX€Of‰Mf‹Oh„Oj�Uo˜Mk’Qo—Uq•XwžQk�ISr[p„Sg‡@;V63;6+;3/9/++6+33+36/663;>6@ECSUZvZ^|fr–kw›kx�gyœcv–cu“n|�r…¤uƒ r„ gyšdt‘V]~KIfE>U@;I@9KE;ZE>UIG[MMj][r^fŒak‘fq‘^k‡Zk�Zf‚UXqZXkZXh]^r`av^f‡^jƒZfˆXd�]hŽ~zšãßèñïõðîôñíóòïõòðöóñ÷îçîçÝæïêðïéñïèïðëòßÉØÈ¤º²“®³–°²“ª²”©º ³¹œ°À£»¸”ª¼Ÿ¶¯˜°Ó½Òëäêϼͯ”¬²•°¶œµ¿ ¶Å¨¼¾œ¶¾ ¸îäîñëòñêñòêñòìòòìòóîôòìòòíòòìôòíóñêòðëòïèðîèïðëòðéòòìòîçðìæïêãëãØÞäÛãÞÖÞÎÀÊØÎØÏÃÐ÷ÀÏÊÔÁ¹ÂZOgcSpXGc]Kf`Sn]Qh[Sl`Qn‰‹ �š°©ªÀšž¶��«‚‹§}�Ÿlw•gr‘^duGCS936OMd^`tgf|ft�p”q~›t‚–>66K>C xt¨}wª}tœto„faz^aZGK;69;363/33//3/+6+/6/3/+/6/3;3;933C9I@;KC@M@>OE@[C>U@;I;/99/96//;3>93;@6EC>UIGkQXzVfˆ^l�]lŽVg‰O]†OZ„OQvIIhECc@9I;3;93;C9G3/36+3/+6;6EC@[KOlQUrKOjOQjMOnMQoMSuMQpGOpKQwEKrEKqGIhEEnGGqEKhCGlCEdEEgEGgEGkGGhEEfE@^@>M@;C>3;;6;>6@@;GC>SEEXEC`C@Z>6G>6@3+//++3/6�™º€–¸޲|’²v�²u�´k„«^uŸXk�Q`…IQyIOuKStIOvOOvMOgOQo]^uîíñôîïñåØòæÒôôøõóùóó÷ñòöñòõåçîçéòèëòñò÷ÛÞééìòÎÒâÓÛäåèïëîôÆÉܯÁÐ…˜´ÓÝçáåï€�¤¼ÀÓ�ž¸¶Ç݈•°hVduKMkMQˆrx…X]›hh�gj‘a^¼‰†äÌÉìèîêëòçéðçéòëíôìîõàâìäèðéëó´¾ÔUl–az–¸Æ×ëíõt‡§„“ªêìóæèïèçíéèïæÞÞ¼ ’cXSach}� ‹—²ˆ�±dw�K^€Qc„Md†Of‰Oj‘Qo’KkŽSn–Sr™Sn‹GEZOQVS^wQd†@;Q93;6+;3+;3++63+636;3;96;@6@I@SX]t^f…`p–nx˜ju›gw˜`t•^r“hyœoŸu� n jxšcr“S[€KIcICXC9Q>9GE;ME>QICVOKfXVlag‡dh‰`lŽ]n�Zj„Vc~SVnSQfZSj]Zj^[n^dak„Xd‡]h�”�¯ÐÉØñïõñîôñîôñîóòðöòðöóò÷ïèðîéïïéññëóðëòîæíÆ£±Àœ¯À ¸ÁŸ¼º™¯ÀŸ¸¼�´¸š²µ–°¶�¤É­ÄçÁëãìîåê־˳•«¼œ·¹›µº•¯¾�µ¼ž¸¾¢¹êßêòëòñéðòìòñêñóîôóïôóïôóíòòíóòìóòëòñëòïçîðéððéòïéñíæíæÚååÞèß×á̽Å×ÎØÎÆÔǼËÑÈÔǺü®¾È¾Ë¤œ§VIZXI[ZGa`QhaQf[MfcSqhVn™š¯¬¤ºª©¾­­¿�•³‚�¬y‚ r} lz™dj}SSdC>IKI^X^z]cudlˆlx�oy•lxŠ>3;@6>gMU qj upŽggy^UjQSE6;9/69/33+/6/33++6/+3+//+'6//;39936@;E@;O@>MC>XCCZG@]@>M>6;9/69/3;/9;6>@;ME@XIIhO[„Xj�[k�Zk”UdŽQ^…O]�KQpIKkEGd>9G>6;;6@;3>///3/+/'3;6E@@SKMlQUtQUnUUkOMjOOkIMnMQtIOvIQtEIlEGjCEdECjCEj@C]CEgCEfGGlGGgCEkEEgCEaGEd@;O;6C936;36;6C@9G@;SEC[C@^>>O;9C93;3+'/++++3‰Ÿ¾�“³~‘²t�­w�²u‘¯qŽ´g¦dzžXh�OZ|OX|OStOUoMUrOQoOSuZ]vììñõñôñæÛðãÍõóöõóøôò÷òò÷ññöàäîãæïæéððñ÷ÈÏàØàêÎÐà©´¿åêïëìò±°É–¡³ÝàìÛâìÏÓä…™®Ýãí®·Ë³ÆØª¾Ô�œ¶aIInGKnGI¢Œ“•ff–fd”`]¾Ž‰åÏËììòêêñéêòéëòìîõçêòÒÚéÞäîìíôÇÎàVq•Un–Ž ¶ëíôt„¦Œž¶éëòêëòèèîèåëʲ››€c]SMy†•‘ž¯‡™¯cy‘O^~Of�O^‰Md�KdˆOhŽQj“Kf�ShŠKOlSSS~v^Œ~fVZlMf‚@>O3/66'93/66+/9/3936C9G>6EE;GIGSZ`v`j‡ft—hvœcp‘[n�ZgˆXg‚]f‚dt”hx”kz–hv–`o�Va„KKdE>UC>ME9OE;QKCZIESKK^ZVpZ]z]c„[h„akˆ]h‰Zf�Zav[VjXU`Z[k^`p]cv[f‚`h„Á¼Ëðîõñðöòðöñð÷òñ÷òðõòðöòð÷òíôïéïñêñòíòñêóíåíÔ´ÇÇ›±É¢½É µÏ¨ÂÁ™­Æ¡°Èœ¯´�ª´Ž¥»—±çÙáîæîòëòñêòìä먊¥¸—²®‹¨·š¶¸˜±¼ ¸°’«ßÎÛîæïñëñòíòòìððéïòéññêððèðîçðìáêíäíìæïêäìêáìåØäçÞçÜÓݾ¯¼º®ÄÁ²ÃÌ¿ÎÛÑÖÜÒÛÜÏÛãÜçÜÐÙ¼¬¹¨˜¬qaxrcxwj‚ycxvg‚l[nl`|uc€—‚”Ä»ÇÓÌ×ÉÃÓÊÀÏÆÀË�§º‡¤t}žp}œgpŒ[dzV`rECQOOcVVk]`ugk~fl…Zaq;3993693;M;ClSZ`a]GGI>;9/36//3++/+/++'/+'/++3+/+++3/36+36/3@9EE;MECSG@ZIIjKIkIK^C;KC9C>3;;3;96CC9UGEcIMpMZ}Ud„Vd‡Q^}MXxIMnIKoIKdGE`@>U@9G>6;;9C;3>3/33//3+;93E>;MGE[MK[OM`QKZOI^MI^KKjKKkKQuEEhCCdGGf@@X@9U@9V>>[>@^@@dE>cECaC@cE>a>>V@>X96E3/33333/+63>93>>>OC@ZC@^@;M;6G;3@3++/++++/„œ½}”²wŽ®w’²|�®x�¯z•¸tŒ¯n„ªavœXg‡OXxKSlMOnQQjSVkSVyVZuÝÝáõó÷óíîñÝÀóîêõó÷õôøòñ÷ñòøáäìàåíäçïðñ÷ «Ê²ÀÓÔØån~�ÅÎØìîõ¥¥Án|šéëðéêó¸¹Ò£¼ÍÏ×äÛß裶зËÞ®Â×ln‚aIItMSz]^¯—žÃª¦ØÄÁêÝßìêñìíôéëòéêñéëñìîõåèñÓÛè×ÞéìîôØÝêZq•QhŽh€žèëòuƒ ¨¶ÈééñääëâáèÝØà´“ulXQZVS‹ž¯�›­x�¢K^‚Ka‹KZ�M`‡Mg‹QdˆOa‰Ka‰Md‡@9IVOIŽ~aƒv[}r[OUoMc€@C[3/36+;///6//936>3@@6C@;CG>GMGVSUoVZo[c†Zh„Zf‡UcƒSXtSZvV`}`l‰dq�lz–gv”dq‘[a}SQkKGXG@GI@MI>MKEVMIXKI`XVpX[}]c€[h…[kŠ^nŠ]h‰[a|[`}[auaf}ch|dg�¡“­ÛÒÞòñ÷òòöóòöóò÷óò÷óò÷óñ÷òðõñîõòïóóïôòëòóîõíßèØ­ÃÑ«ÀÓ²ÅÔ´ÅÆ¢ºÂ˜¯À–§Æ¤¾Äž¶É ¶Õ±Âîãíòíòñëðòëññèðñéð¯�¤³“«®Œ¤¸œ¶´—¥¶œ²²�ªÎ²ÆêÞëïæëïçìðêñïçðîåíîæíìáëíæîêßæéßèèßéçÞééáéçÚâëáìçÜæçÝãêåêϸǼ–°âÓàéàêéßçãÙâ°–©�x“l‡“v’†r�‚h~ˆpŠ�|�„o†•”�y™Æ¸Êà×àÞØáÔÉØÙÑÛÓÐÜ�‘ ƒŽ¯v��py•fr�ah}`duQSdE>IMEMSSdV[tZ[kZao9/36//3/36/33+/>66>63//'/++/'+/++/+//++3++/++3+///+//'6//6//;3C>6C>>IKC^QSqMQrOUuKE]C>Q>66;39;3>>9KGE`GKuOXOXuQUvEGZ@@O>9E;;O>;M@9G>9G@6C@9E>6E;6@6/6936/+993;>9GC9GICVICQI@SG@QG@OMI`KKfKIdCCg>;V>9S;6I9+E;6K;6I>9O>;UC>d@>X@>^@>S@;V@;S;6K6/69393+///36/393C;9O>9Q;6K;6E63;3//+++///†š¼}‘·x�²w�¬uް|•¸z–·}‘´t�°j|¢[jˆU]~MOoKMjQMfQSrQUuVZw¾»ÃôòöóñóðßÉòèßõóõõó÷òòöññöææïÜâíäæîðð÷“�¸Ÿ±ÂØÝécu–¦µÂíïô ¥Ãfv–æêðêëò¸»Ï»ÎÞÊÔâÖÞ鮶βÆÛ´ÆÚ‰š¶XGMdIUvOV¦‘–ÙÎÎèØÜìçìëìòëîôêëòééñèêòëîõåèñÖÜèÐØåëíôáãî[w˜OgŽ]r–åéñt„£¹ÃÏççî×ÖáÚØàÐÇÍŸ€hgVIgc]Ž›ª‡–§j¡K[}McŒM^‚O]zIZxGStO]}M^‚KZ|E>@phUƒxZc[QkaZMSpOd‚EGc6/96/96396369/3>6@@6@C;CG;@MESSQfXZpV]€Zc…Xd…OZzQVnOUnU]v]h�fo’jxšgv”ap–]d€USjQOaKEOOEXKCQQGZQO`QQlZZt]a€`a�`l‡`n‡^k‡[g…^d�^du[czhj~hlƒvu“ÜÕßðïôòò÷òòöóò÷óòøóòøóò÷óñöòïôïëòòïóôïõóîõóîôòëòæÎÚϬÅϨ¿Ò­ÄÉ£½ÆŸ¶¼�ª¿š¶¿�«Ëž´ßÄÔðèñòêðñéðòëòñêðñëòº ··—±³—°» ¶¶š­·�µ§Œ§Æ¦½àÎÝïèíïçíïçîïçîñèððéðíåíìåíëÞèíäìíåììåííæíîåíñéðïæíéÝä×ÃÒ¥}‘¢€œ¸–¯Ï¶ÆÏ¹Ç¶š¯Œt‘�y–†p•Žw–~p‡l„ˆv��€˜…k‡–‰¢�…¡×Ê×ãÜæßÙãÝÔÞÜÖàËËוœ±‡�®|‚£nx•dp†`gy`jxUVkE>KGCQMK[VXjXZhX]j9//6/33/96/66+/6//6/+//+3+//+/3'/+++++'/++/+'3+3//+''+6+/6/3;6>>6@@;KIE[KOpOU}SUoKG^C@UC9C;3;;6;@9IIGnIGnKQuMQoKMfE@O>9G3/693>99@;6>;6E>6@@9CC;IC9I96@;696+;93>>6@C;GC>QC;KG>ME>MECOGE^GE^GG`C@];6O93C3/69+>6/99/E;6K>9Q@9[@;U@9U>9K>;V>9M63>3/66/63/'/+6///93@96G;6K;6K93>9/;3///+3+++|“°|“±v�®x’¯x�´|–·€–¸–ºy’µr†ª`p�V`ƒKSoIMjIG`QQpQX€Q[}ovŽñïõóòöïâÔïÜÀôîêöóøòñöðñöçèðØÝëßäìïð÷�š¸��«àæïay›n�—íîôŸ ºfw“Þäìëëó¹ºÒåêñÏØçÐÛèßåí�²Ê­ÂÔ ºÔgx™XVndM]qQXfKSź¿ëìóìíôèëòéëòèêòèêòëìóêìòãåíËÔåÝãîèêòayŸOf†Vp’Úâìrz•œ¬ºàáêÛÙãÓÑÜ´ “‹oXcUI…Ž‚’£l‡ŸKSzOg‰O[IX|IQpCGgMd†M`}K^>>MhcO†xXXX[^[XKGMMVuQh‰MVt@;K@6G>9GC;@>6>@6CC9GC;GG;GGCQOG[QOfU^yUXyQVxIOkQVxSXtZg€gq•k}›j~¤j~Ÿhz—`k�XXpUOdQI[UMaXOc[VoZ[v]^y^f~]h‰^kŽ^n�]l�ao�[j‹[h†]h…gk�ku�pt�ØÐÙòò÷òò÷ôóøóò÷ôò÷ôòøóò÷ôò÷óòöòíôïèïðéïóðõóïöóîöôïöóîóàÁÔÖ°ÅÒªÀΧ¼Äœ²Á–¯Å™­Ã—³Äœ·À•ªîãêóëñòëñïçïðæíñèñÑ»ÌÀ¨À¸—°²’ª«�¨ª’­ª‹¤®�¬Ï´Âîçïïéðñéïðèïòêðñêðñéððëñíåìñêïîçîðéïñêðîåìðèí×Àͯ‡Ÿ­Š¤§ƒŸ¨… žx˜˜�œŸƒ ™x”�u“Œu��x•�x‘�x’Œo�‡t‘…t‘”�›±¡¶ÜÐØçàçáÜçÐÅÕ×ÒÝÉÄÑœ›®~‰ ~�œƒ�ªy„ŸdnŠ^c|]cyZcoUVk^dy636^d€ox’nxˆGEO93;6/;;3@9+33/+3++/++3+3/+/3+//'/++'/''//'/++////+'6//6/+6/9>6E;6>G>UOSqMUwMUzIMgIKg@>K>6C;6EC;MGGjIKkOSuIGZKEX@6@96;;6;;39>6@>6@>6C@9GC9GC9KE>Q>6E@;E93E63>96;@6>;6G93;;9;@6G>6@@9M@>Q>>Q>9Q63C63@++//'3++3/+/63@66E;3O>6O>9U>6K;6O>3M6/@3+93+33+3/+6++333;6/66/C93K;6E;3C6/3////+6r‰§u‰§vŠªv�ªr�°w�¬z�µ•¶�”µr†§ap–VgŒISpCE]GGfKSoOZ~S`�Xd‡ÞßçòñôòíîíÙ½ðáËõóöôò÷ñïöìíóÜáìÙßêíïõŒ™¸k„¤åéðg}¢[o”åéï–œ¶cw–ÀÌØìëòº¼ÒäéïëìòçéñãæîÊÔ䜪Ŝ²È„¤Àp‹­ž¯À­²Â ¤¸åêòîîóíîôèêòèëòèêòèêòêíóíïôêìóÔÞëÀÎßÚâìv‡¬Ma‹Sj‘ÁÐÝt�¢VgŒàáéÜÚ⪪¶Ê²�p]Qga`†’žo‚–Vp�EQqIVpMZuKZvCIjEUMc‰KSpIUn@GajcV„x`SOOEC@GGUOVrMdSdxMUfMIXIKVIESE>GG>OE;E@@KG>KICIMKaQMaSSkSVtOOhKQoV`|Vcƒat–k~¢r‡­y�´rŠ«u‰§gv˜[XtXUkQK[UOgVSnad„^nˆ`oŒgw–fv”fr—au’`q�cp�]gˆ`q�do�coŠ}~�»¯Èòñöóòøóòøôôøôò÷óò÷ôòõôò÷ôò÷ôñöñìóëàéìÝäòìïôðöôîôõðöõñõôîóà¼ÌÖ°ÃΧ¼ÈŸ´Ê–­È”¤Å›°Åœ²Æ�µÚ¶ÌñæëòëññèðïçíðçïÞÌ×ê¾µ”¬°’°Ÿ�Ÿ¦‹ ¥�£¯’°µ™²îçïïèïòëòòêòòìòðéððèòïêñïèïîèïëãëîçïíäëåÖÞÆ§¼ª„œ¯‰¤¯�§§‡ µ•®®Œ¤ ƒ›’}œ“~–�z•ŽrŠ™„™�y˜†o‰�z•˜~šÍ¾Ïß×âÝÖÝØÍÙÓÎØº³Ãª¤¹§ª¿†ˆžq|—lv‘v|’v}˜}‰¤w‚œak}[`u]ar`[ofh|93;C@X`kŠrƒœSZd;3;+++GE[^h�;9>33/++/3//3//3///+/3/+6+'3+'3+///'/++6/36+36/6@9E;9@@>SIKqOSzMZ~KQnMKfGEZ@;S@>QE@UKIfKOrOSuMK`MG^@;E@;;;6;>6E;6>@6;C9G@9>E@GC;GI@UE;UE>S>6I96@;3>936;3;6/3939>6C>6@>6G@;O>;O;9I63;3+;/+3/'3/+//++/+/3/>;3C@9O>6S>6K93I;6I63C6/693;6/63+93+9/+66/@3+93/;93C63;93;3/6//6nžtƒ¢q„¡v‰ªrŒ®wŒ­y޲uŒ¯yޱrƒ¡`p‘Sc‡GSk@EaEC`MOpMUwSa‚Ua€ÁÍÚçêïóñóëÕ¸í׳õòöóòöñïóíîôàäí×Ýèìïõ‹œºj¢äéíl€¤Zn�Ýâçœ�ºau–«ºÅìíóÀÅÕàæîìîóëìóçêòÌÖäÉÐàŽ§¾~œ¸n‡«ÏÜèÁËÞ©¸ÒéìóïïõìíôéëòèëòéêñçêòãçïãçïÛàë¼ÅÖ˜­À´ÄÔ�®OcˆQf‹µÅÓ}ЧUc‹ÛÝäÐËÔ¡ ­Ë­‡vcXtx|…’�dx–Mc‚ISvIXwM[EOjGMpGa‰K^‚GOnIVxGQhgaUzpZwnXQG@>6;OSxQjˆVkˆU]kSVcQV`QMXECEI@OE>GC>GGCMKIXQMdSSlUVhUXrOOqKQrS`„Xf‡cvœqˆ¬u‰¯x�´z�®wŒ¬kw™`cZ[xSM]VSk]Zrfh‡ft’kw•k|Ÿg}žnzŸf}›`p–`n�^nŽ`j…aq�frޖެߨáòòöóò÷ôó÷ôóøóóöóò÷ôòöôò÷ôò÷ôòöñëòìäéëßåñèìóîóõðöõðöõñõõñõëÙãÖ­»Êœ¸É�¶Ò¢¸Ìœ¶È�±Ã–­Å–²ëÜçòéðòëòòèîñéïðéñéá绚±²’««’°ª�¥­“¬©Ž©±’¨°‘ªîçïïêðñëñïæîðéòïéïñêòïéðîæîíæïêßæïèïíåëÁš¨®‰Ÿ§~˜¸�§´ŠŸ°Ž§¶–ª¨ƒŸ¡…¦œ€š›‚—’x�Šu�•…šŠuމp‹�€–ȸËÞÔßÝÓßÏÄÐÀ¹Ë¯­½œœ°‹Œ£ƒƒ�x€•uy’v~–y}—yƒ˜w–‰¢ku�]f~Z`y`czcfz;6@;3@QQox†œ^h@>G+++;6>V]wVcv6///+/3+/6///+//+/3//3++3/'3///+#/++6/39/36+3@9G>;EECZIKqQSzOZxKUrMQkIE^E@VC>VC@VMKjKMoQUtQShOI]C;E>;>>6C;3>@6@C6C@9G@9CE;EC>MGCQGCVE@Q;3I96E93;9/663;9/;6/3;39@6>@9SC@Z@;V>9X93>3/9/+3/'3/+3++///663C>3I>9K>6M>6K>6M@6M93E93>9/;6/6//6///6/@6/@3+93/693>93;6/;//9++3]o�`p�dq•gz›gy jzœj} l‚Ÿl‚ ft•[jŠOZwGOgCC]GEcKQtMV�Q]€Q]|¥¿ÕºÈÜòðôîáÙëЬòêäôó÷ôò÷ëìòéêñÝàêæêò’ ¾f} ÚâçyŒ®]q‘ÁÌØ–›º^oŒ–¥²ììòÍÐàÙàéëìóííóììóÛÝ谼ιÈ×k„¤…¥¿ÒÝêÃÒãÚãîéìóéêòáåîÃÉØ˜¢¸x�§Œ¤¼œ·Í·Ìß„Ÿ¹‚¤»†¥½‘®Á”¯K[€K]ƒ ²Ä–�²Xg…¤®¾ Ÿ¯�‰�Ŧz}}ƒ~…’u€‘OcCG`KVwKZtM`~CGdKZ„KfŠGSnMVrK[|KZOGG}r`~q[xnVOIIKKaSg†`x”runkxkjt^XaMGOI>KE>IKEMOI[SO[XVlX[qX^ySZvUZuO[~Vaƒ^nŒl†§v‘²}™¹€˜¹y’´xެl� akƒX^rUVg[]v[^xlr•hvšk| pƒ¤n„£q†ªn…¡fx˜cx–ao‹`n†Zg†kt”ÛÒÞññöóò÷ôôùôôøôóøóòöóñõôñöõóøôò÷ôñöòìóðçîïåìëÜäíàèôïôõð÷õñõôïóôîóòêðΟ¸Ëœ¯ÓŸ³Îœ¶Æœ°áÉÔîáêòéðòçîóêñôêñóëññåíðè𶕯¹¡»ªŒ§µ™²±‘ª­�¦¯�¦¯�¨ìäííäêðéðïèðïèðìåéïåíîèíîæîìãêéÜäíäëìãéɪ¸½˜­µ‡�¶Ž©´…Ÿ¾™³¼š¯²’ª°‘ª—v‘¨ˆ –z‘‘x”ŒuŽ–€žÓÉÔÔÉÔÐÅÐüʦž²�‰¤“•®��¤Ž‰žŽ“¤|}�||�xw‰yy‡tv‡tz�t|”|‡£t…¢y‡¤]g}]c€ckŠIKZ3//96;ow�t€™]jƒ//63+3;3>xƒŸ;9;/++3+/3+/3+33+//++3/+3+'6+33/+//+6/36/+3+/>6@>>KGC]MOrOUrQa~O[zMUtKKaGCXE@]MG[USqXX}XZxSVoQM`E>I>;@;6>>9G@9C@9>>9@>6CC;EE>OC;K@9IC9M>6Z96K;9E9363+96//633;3@@6G>>ZE@c@C`@>g;9Q96G63C;/@;/E3/;6/@93G9/C;6E;3G;6E6/C;3G93@63@9396/93/>3/;3363/;6/@63>93@;3@6/;3/>3/;QSjVZtU^yVa~Zc�[f†Vd~Vc~[a~ZczQZ}IOpEKaCE]IGgKQyMSyMUxQSuŸ¾Ò§ÂØÍÏØñîòíÜËéϯóòôóòõéæîëíôèêòÒÙçŽ�¼axœ¼ËÕ�—¸Zk”¯»Çª³È‚œ´½ÌÚäçîÝßêÊÑÜÂÅÓÆÉÖÉÉׯªµ ž³}r„Ž�¸�´ÈÃËÝÇÕãØàêÝäí–©¿�œµƒ¢»ªÂÕ‰¥½¥¾Ï�ºÐªÃ؆¤¾^}šu˜²c��z£ÀShŠO[}y� n�‘S`}‡•£‡Œšphp¡‰k‚�˜„�œUg}CGaGUtKVuM^yGMlEIjK^…GUuGOkM`‡Ka‰Sg‚|p]haUc[MxhSQGCIGaOgƒk}•…ˆ��z‰uru^V[G@EE>GE>IKGVMKZUSc`cufjyckyXax[gVj…at�cy™n„¤x�µ~–º†œ½€”¸�“¶v‡¨fx–cr�ZawXaw`gƒgv•p�Ÿp‚¤rˆ¨w‹¯t†®l…¤l�cx—clŽ^f}^h„Ž…£òðöôò÷óó÷ôó÷ôòøôò÷òïóòðôôñöôòøõò÷õñ÷óîôòìòðæíìÝáëÚáíÜèöò÷õò÷õïóóéïóëððäëÏŸ³Æ”§È™°åËÙòëñòéðòèïòçîòèîóéïóíóóìòòëñº•°³‘­¶–±²›²²—°®“­›Ÿ§ˆ£ØÅÔëàçêàåíåîîèðíäìîæìíäìîåíîèíîæîïèïîåêîåíÞÌÔº”­¾�´¹–±·“ ·�Ÿ¸™¬§ƒ�¬‰¡ª‰¡¡~—–�œ¶ ¶ÔÉÔÍÇϬ¦µ•’¨œ—§ ˜¤˜˜¤›“�‰‡�wunkztu}tv‹pl|lq…tv…qt…rw‹~‰�x†Ÿw�š|„˜fp…ahƒ`p…6+33+3USrn}™o|•GK`/+/3'3^h‡]jt93;3+/3+/3+/3+3+++/++6+'6+33/+//+9/36/36+6>6>E@OIGlQX|SZ€Sc…OZS^‚MOoQGhMGcSGVSKjUSrVZ|UVpOQaE>K;9;>6E;6@@;CC;GE>IG;KE>IC;G@9C>9G;6@9/G63@96E6////66/6939>3I@9Q;9SECgCCf@@p>>[@;`;6K>3U>6V63C6/C93G;/E63;93E93;63G;3I63C63@6/99/>3/@3396/96/96+C339>3C93@;3@63C93GEGUMOdMQhOSgQSkQQgMSkOUlQUkSZuIQjEG`CEZGGhGEdMQoMSuOVzKSq§ÀÖ©ÃØªºÎíìñêßàç˨òïïóòôëçìçéòæèðÐÔá‘¡¾`w𤴾— ¾[p–¸ÇÐÂËØ—¨¼‰š˜§¼”¤¸nz”w‰¢’¥º§ºË�Ÿ¯|‹ p�›�™ªªºÉÃËÙÁËØÝãìæêò ´Í‰£¿‚¥»ªÅ׆¤½™·Î¢»Ï¤¿Ð‚¤ÀZw–u–­f„–n•´Xx™O^yXg|`vŽO[yŠ”¢z|‚cVU„yr…�›‚Ž›M`|CIgK[wKVyISpKMkIX€MZuEQtIXzMaˆMf�O]t�t]a[^d]OxkVUKEGE]Qc‚k‘�‹Žˆ|€unpc[cE>@C;>E;@C@IKEQUSa^fzgj~fp[h€^l‚Zk‹`u‘aw•l†¥v�¬|•²‡�¸ˆš·„˜µ|�¯n€ kw”^k…`f€ak„dv—o�žr�žv‡©wŒ®xˆ®l„¤hy™ft–^k‹]c}]c¾±Áóòøóó÷ôóøóò÷óòöóñöòïôóñöôòöõóùõó÷ôðöôíòòìòòíóïæìîâêîàèóìòôòöôïóóíòòéïòèîÞ³ÁÒ ²Ò§ºñæíòéðñæíñçîòçíóêïóëñóìòôëñòêñʪ½¹›´²–±©‹¦©Œ§¥‹¥¡† ¨Ž¢Ï·ÉéàæèÞèìäëîçðëàëïçíîèððèðîæìíãéïèìîçíïéðíåë¼™ªÀ™«³Ž©¶–­¶Ž¨º™´©~™¶“§¤„šš~œÆ¼ËǹËÉÁΪªº�‹›œ–¬¯¦²¦ §”�™|zƒrlvnn€nn€tw„pw‘pp�u}‘rr‹pp‰r|‘rxŽz‚žv–u–r€›nx–fu�6/93+3C@Moz•p}”Zh€//3/'+QUun}�EIV3+/3+/3+//+//+'3/'6++9/33/+3//6//6/+3//;39C;GIGnOV~QZ~Oc†Q[~U[�SStSKcQEXSEQUKfVMlXVvZVnUVlE@O>9;>6@>6CC;GI@GC>GK@KICEIGO@;C96;9393/>9/C63>6/33/93//639;3@;9G>>`CCcCCpCCk>@l>;a@>`@6X>6S93K93E93E;3K;3C93C6/;6/@6/>63C63E9/@;3@33>3396/;//6/+993>93;;3C;6G;3C96EE9G@;E@>IC>KC>IC>K>>IC>KG@QGEVECQE@S@CIE@UIEXMIfMMlKQnII`¥ÀÓ­ÄÙ¨Â× ¬ÀÍÌÓÈ®¨ãγðìêðíòáá뺽Ìàå뜤Ä`q˜‹Ÿ®²ºÏfqŒU]u„œ±[pŒQZoa}�Ž®Ãw’¯Š¦¼–²Ã¦¾Ð•°Åy”°g‚œ†¤»¡¶ÅÁÏÞ×Þçàäìßã슠¸„¢½‚¤¶¤ÁÓ}š¶�«Á§ÀÓ£¾Ô€�¶]z”a�šg‰žVq�d‹ªOgˆKQdXl„ao�–§ZS]XOI‡ŽŸŽ fq„EMoK[|ISnO^€CE^EGoO`IKhEQqKa~Oh�Oc„KK[�t^XQOzlZrk[KEIIIaM[kx‘“…‡…uywjg]QSI>>C;;>69;6>@;CGGMZ`h`kzjp€jt�ft„[r‘cu˜fx�l…¤q‹¬w�³�”³„œ»Ž¡¾…–³w�­v†£l~œjx’lv˜jv’gz•hz–n–p�£t�¤l~¡ky•ar–`j‰]d~pnˆïìòóóøôò÷óò÷ôò÷óò÷ôòöôñöôòöõòöõóùõôùõñöôïôôïöóîóòéîðçîìÞæîáéðåëöñôóíóòëñòêîòçí׳ÅçÓÞòèíóêñòçîòçîñäëòèîóèíôîòóìðóêïԷé†� ��š}™œƒ¡–u‘™~“–€™¼ ¸ëãëçØâìäííåííäëïæîëâéîèïîçîïèïîçîîäêïåîïãéîäéêÞåèÞáãÑÛäÔÜæÚâèßçÛÏÚʸÈÛÒܼ˩¢³’�£­¡ªµ¯·¹®¯¤˜££�¦}xŒy|•wz‘�…¢†ˆ§�… „Œ¨…ˆ�‚†Ÿ†ˆ …ƒ™y|–�™~�’}�œw~–ry’t|�nx‘GGV3/33//^h„kx™jx˜EMc9/>3/6qu‘u�˜633/++3++/+/+/'6/'3++6+/63/6339/69//6+3>39C>GIGfSV‚QZ�S^xVZ‚VX€[SqSGVO@SM;IUEVQEXUQpUKZMEVC;K99>@9EC;IG@MSMSUKQh^]udkudd]QX@9@>3;9/C63;93>9/93/66/3939;3E@6M;9X@>h@@kCCq@Cq@@k>>[@6]>6M93M96K93K>3M93>63>6/93/;9/>66@93@93>9/@6/C3/;3/;6/@3/;63@;3C>6E;9C;9I;6E>6>@9@@9C>6@@9E@9@;9C@;EE;CC>G@;C@;E@@EI@QICSICKICSKGXIGX–´Â¨ÃÔ®ÆÛ”°Ë�š²ÎÏת™—ÀªœïëîçæíÆÇÕáæî§©Ãdq�Vk�x’°fƒœMZwx–°ax–Q`kl‹¡”²Æoލ‰¨»¤¾Ð¤¸Ì–²Ë‚œ·l‰Ÿ€�°�¬ÀºÈ×ÕÛäéêðÉÍÝv”­|œ´¤½š¸Î’¬Àœ·µËÛ›ºÏ‡¤»`|˜lŠŸ~ º^z–gŽ«a…ŸKMjUj~kz�†�Ÿ[QQonf„Ž jv‹M`~GUwIZwGVuIUrGUuMcƒGQnIUwG^„OhŠO`�Sa~SU[…x^„u^zlSC;>CCUOUuMa�jx� �‹§��§ŒŠ”}xp[[`QVM@K>9;;39C;@QQ[Zaohw…kv€hw…gy‘av‘cv”h€žk€Ÿp‡§x‘±ƒšº‚›¾„™º~“¶‘µw‹§x† uƒžo~–lw’aqŠct“ft�du‘fx’coŽcl…]f~ŒšÔÉ×óñ÷óòøôñöóñöôó÷õô÷õôøõóøõòöõó÷õóøöó÷õñõõòöõòøóîòôîòòìòñêîðçìïæìõðõõñôóíòòêïóìïóîóòìòòèíóéìôêïóêïòçíòæìòäìóêîôëñõíòëÛãÊ�±£„ ©ˆ ¬�§£†›ž�šœ€™°�§ëãêéÞèìáéëßèìäëîæíìâêíåêìáëïèïîæêîçíîæîîåëðæìðæïñëòòìòñìòïèìëäíÜÒØÔÏÙ¼´¼Ÿ–¥¯ª¶®¡§»ª¯ªŸ§ŒƒŽ‹‹ ‹‰šœ—§ �¦£�¯––±•�ª™”©�Œ¨ŽŠ ‰‡Ÿ†‚�…‚š„|’}�”|”~��x�šzƒ–u”o|�gu�MO^3/+ECQ`fyfw˜ar•SUk/+/C>O^j…]jy6/33++3+///+6++3+'6+///+//+9/69/39/6936>;@GE^QUxQ]‚UaƒVZ|UQrSI[M;CI6;I69K9@K;GQEVOESK@QC;K>9>C;GC;IOIKfX[rfp™……ª�„§ƒ�†lhXKMG>C;3@;3@;6@9393366/6639;6@>6G;9]CCj@>p@Cp>Cj@@k>>f>;[@;]93G63@63@6+;93@93C6/;3/;9/>6/;93G;3C9/;6/>3/;3/963@9+E96E@9M>9E@6C;9@@;O>6;@9@@9E>6>C;KC>K@;E@;CC>G@>EC>IC;KC>KE>KG>KG>KI@MIESE@O—¯À¦ÀÕ¯ÆØ—²Ê… ¼¤¯À²¤ ± —ãÛ׿ãéàá骪º‘œ°ao‡Zjxhƒ›lŒ©Q^yv�«]t�OZplˆŸ�°ÆqŒªˆ©½œ¹ÎŸ¸Ì™µÊ€�´nŠžy–±„¥¾žµÈÛáéíîòº¿Ôp�¤w–«…¤º›¶Ì ºÏƒ¥½¿Ðßš¸Î�®Æ]x“lˆœ�­Áa�žc‡£d‹¥KUkVh�q‚’†‹•a[V}‚„†�Ÿ]n†MZvM`‚I]|Ma„GIkM`‚M]uIStK[|Ic‡Og‹S]wQd�QQX†y`…xd`XKC@OGQtOVyQc‚kw‹±—�ħ¢Ç¨¤½›’’xu~ffZKSG>GC9CC>>OQVV`jhtny}lx�atŒat�^r‹`q�k}–k€žqŠª}•¶}–º—¹€–µ}•¶~�¯tˆ©w‰§q‚¢fu”apŠ`l‰]hˆ^kˆ]oŽ^jŠ^dacuòÂîêñóñöôòøôòöôò÷ôô÷õóøöôøõòöõò÷õó÷öóøõóøõò÷õñöõò÷óðôôîóòìòòêñòêïïäçòêïõñôóïòòëîòêíóìïóìñóìòóçéòçìòåìôèíòçëóèíôìñôìñóéëïãé޼ȶ•¯¹™¯¸›±šx�²—¯µš²²“©éßèëÞçíäìíãéíæëìáçëßæïåëïçðïçîìáèìäìïçìïèîñêïñèîòíòòìòðêðíæìçÝä±¼º¶Å§�©²¬²¯¤«¸±º§œ¤œ’›ˆ€’—Ž¢ž’§¥•¦¯œ§±¥´©š¬ÄºÈźʨ›­�� �ˆ™‡†œ‚|�~~˜y|•~„žz‚žx„œv�˜t„ t}–q˜dt…6/39/3QQhaw”fy’an†3//6/3II`p�•9693//++///'/+'3+'6/6//+3++;3;9//6+/;39>6>IGlMQpQZ€S^�VZ}XUwSEUM9;E66G36I3;I6>I@KK>OK@ME>O>9>C;GE>KXKQn]`‚pt­““º™—²���un^SQK@EC6E>6E>9K>6>633936936@6K>6O>9[@;d>;`@@t@Co>@n@>f@6^>9X96G//9//69/;9/99/C6/>3/>9/@6/>63C63;;/93/;3/93+;3/66/@96G>9GC;ME;G@9C@9G@9@>6;C9EG>GG>MG>GGCQG@KE@GGEQ@>CC;EE>GG>GI>GG;EG>IGCKE@I–¦•²É’­Ã~�«q�’au�–œ¢­­®­ž—ÕÉȽ¯°—–”p‚–kz’V^nUk„h‹¥O]yx�©]v�Q`tk�¥”°ÆpСޭÁ§ÁИ¯Æ›´Éz–ªnŠ£x”¬•­¾ÒÚåïïôïîóš§Àjˆ¡q�§‚¤º–­Ä°ÆØ’®Ç®ÅÕ�ªÀ”²ÈZw˜azŠ‚§ºu˜²[w”gƒ–Vk‰[n†|�Ÿlnx~†Œ�—¤xާO[rIXxOf‚Md…Od‹]q‘KXuISuI[~Of‘Ml’O`€Uc|Sh‡GM]g^VZQUGM`MVvOZ|Q[yM`~u†šÏ·¯âËÐäÊÌßÁÁÆ œ²ŽŒ~fg[QZQEMI@IOIZSQZhpwpv‚ow…drƒ^n‚]o…[l„^q�cv‘j~—tŠ«vŽ­ƒ–´}–¹–·ƒ–¶|’²|ޝl¡gt’`k…Z]xSZkUVlQVkVVfVZknhyïìóòñöôòøôóùõò÷õô÷õóøõó÷öó÷õó÷õò÷öò÷öóøöôù÷ôùõò÷õñöòïôñéîðèíóëòóìñòíðíàåôìñõðõóíòôìññéîòìóôîôóìòóëðóçîóéîòåìóèîóéîôíñõïôòêðéÑÛΠ¹ÂŸ²Ã¨À¶—±«Ž¨¡‚šœ€™äÛâìäìêßæçÛãîæìéÝçêÞçéÜäìâëïéíîæíïèïïçíñëðòìòôîòòíñòëñêàæãÚἯ¼¥œª³©²È¸½Ã¯²»«¯��‘ŒŠ—€x‹—Žœ¶§¯¤–°¶¢´ �¢¹ ¶ëãéáÖÝÜÎןÈÈÅѱ³Ã� ¸�œ¸Œ™¸�˜¶Œ—µŒ—³‡’­†–²ƒ�«ƒ�§ˆ¢x†¢`n…3//6/;[h}l}�p‚–KS^3++/+/S[rECO3+//+/++//+'3++9/6/////'9/3;363+3;36@9>GE]MSzOV€S[€SMnSKgM>@G39C39C36>/6>/6C9EI>KICVE>OC>GE>GKEKcX[Šqn¨ŒŒÅ¤§É«ªÀŸœ™|v^QQVGII;EE@O@>K>6G96@93693;>6CC9Q>;[@;g>;j@@o@Cq@@l@>n@;h@;d;3I96I339;/E>3G;3E9/>3/;6+>3/93/693@93C6/>6/C93E63;6/@6/@;9E@9KE>I@9ME;O@9C@;CC@IIEQQIXXM^UO]QI[QGSGCKC@G@>GC;CE>MG>IE>EG;IE@KE@Md|Ž‚¢¹€ž¸}–­x‹™gw†^r‰[l€ctˆfjxqoo‰|ƒwpu…S^nXl‡l‹žQ^xz•¯^y•S[ly—«’²Ãx”¯“®Ã­Å×’©Â™¶É~–¯q�¤|˜¦’­¾âåíâåëÖÛå~�¥SQcSMXqkp“¬À¢¼Î¥ºÎ–²Å“¨¸¯ÅÔ`t‘[vŠn�¢| ¼`|œZn�`}—]l‚|ˆ”gfh˜¢­†”¡cv�Qd€Ut”Mc…gŠ©©½ÌzŒ¢KZwKZ}Ka…Sp’Mk‡O`zQd†Sc…SjIQfSd~M^OXxM[~O[ySayy„“àÊÅéØÜêØÝçÓÔÒ­¯Âž™–w}o]gcS]OCIKGMMIV`aqfo|hqcn�[gVfVcyXj†Zg‡^v’c|–j€ q‡¬wˆ§wޝ�¯�­w†©q} `k…`f~VUdMG^MEZIIVQKaQOdƒoƒòðõôò÷ôò÷ôóøõó÷öô÷ôòöòèìõó÷õó÷õòøöòøõó÷öô÷÷ó÷öò÷õòöóïôèÝãå×ÞïçîôîóòíòòêëïâåñåéôïòôíòñèìîäëóíòôïóôîóôêíóçîòçêòæíòåéôéðõîôóìòñåêÖ§ºÅ—®ª†¡£„Ÿ§Œž›ƒœœ‡žÖÄÔíæíëßèêÝåéÝäêÞäìåéêàèîåëïèìðêðòìóóíóóîóôîôòëðñëñéÝçÕÇл¯¶¬£®ÍÀÆË¿Ã­¡¯™œ¬‰…“™‘¡¤˜­ªœ®­ ³¤“¨¡“¨¯žµäÚàêáçíæìíéîéäêÌÁϤ¥½š¢¾•š·�˜µ�™´‰“±†’©�—²‹”­’˜¯ˆ“­‰”°†�©€�§}Š¡KSa6+3@@Qkz’n~–ny’939+/'/+/3+33+3+++++'3++/+'/+///'//+6/+6/'3//939>6;IE`KOkMSxOVuOKcOEXG9EC3;C3;E3>;/>;/;C9KIC]KI`KGfGGVXO[dX[�qj´�†Âœ–Ò¶°Ë¯«¼ž•ƒladVX^QZK@E>9C@;G@9E93C93>639>3G>3G>;f@>k@@lCCu@Er@CuCCu@>j>;d>;Z>9U;6M;3I;3@@6Q9/93/;6/9//33/69/6;3C63G93C63C63@3/;93@@9E@9EE;G@9@>6C>6;@9EE>OGCQSMfVMaXO^SKZXM[GEKC>CE>IC@QE>KE>GE9CG>GECKE>O^n‚�¢½nƒ˜€–°tާgxŠdyˆfy‹]k‚]n„]k~fhkh`Qf[X`p„[|’k�¡Vj†~™¬f|’Vatx–ª‘°Ãz�¦’°ÅªÅÕ–¨Â¡¸Ë|“§g„˜qˆ—v†—³¶Á¬§·œ‘œladl`Sœˆfȯ‹†Žž�µÆ¥¼Î…¡º“®Ã”¯ÂhœVh�f‚–| µ]x˜Uj‡Zq‡Vkˆwƒ�hno’›­Š”¥UgƒXu“Vt”`yœ£»ÎÈÕàXkŠKZvO`…So™UjŒOd‚OczQd‚Sg†SjƒZpˆXn‰M[|MUxOXwOVtM[uv}†áÎÇéÙÞêÛàæÑÏÓ±­Ã¢£š|to^lgS^OEOKEOQO]Z[gdjxkp|]l�[dvZazZa|Vc†]g†[pŠ^t•cx•l~Ÿq„ªt…©v‹©t‰«v„§ozšcn…]g|SQcKG[MEUGEQOGZSMf—‚šòñ÷ôòøôò÷õóøõó÷öô÷ôðôçÂÎõòöôñõõòöõòöõóøõò÷öòööñöôðöôðôîåêêßâæØàòëðòíòóìïðçêïäæôîòôíñîãçìÞåñçìõïòóíòòèìóæêóéïóèïòçíôëñõíóôëñóêïÖ§ºÅ�­­‚ž§†¡ª‰¢¥ˆ¡ž‡ŸÑ·ÉëßçëÝãìáêëáçëßçëäééÝãðçîðèîòíðòíóòìòóìòóìññèïîæíßÔÝ´¡¯­ž§Ä¶¾Å³ºÅ´¸�“Ÿ•–¢���·ª· �¥ª›¯¬—¨§–­©�­ÙÎ×ëãèíæìðëïìæëäÜßǻʻ¶É§ª¸™žº–ž·“š±Œ•­ˆ�¥‰�¤ˆ�©†‹ …‰Ÿ�Œ w�•qxŒpy‹^hw;9@63>cp�o|–ft‰633/++////++3+/3/3+/'/++//#3++//+/+'6+36++9//>6;>;@IE^OMjMQzMSqOKhOCXE6@G6@@6>E6@>/E@3GC;QKGhKIaKMpKOfaXdxdlœ|pœ“˧ Õ´­È®§µœ�zkct^]tZZ[MQC;@C;@>9I96G63>636>6M@;S;;[@>l>>rCCq@Cv>@kCCu@;h@@r>>c@;c>;]@6O;9K>6K93>6/>6/;3/66/>93>>6G63@3/;63@63;63C96EC9GC9GE>K@9EC9EC;GE>GICUOGSUM][QaZQ^ZQ[VOZMESECMC>K@@IE;KE9GC>EE>KE@ME>GSVd~š®du‰ay‘tŒŸo†�aw•dyŽk~�dr�`oŽ`t†[laoƒcadq}„p‹¤cy–v˜®f~•[l|z–©‹ª¾‰¤·‘¯Â§¾Ñ–¨¹¡¸ÊozŒÀ­ŒÜ•âÊ�ïãÉðáÀïÜ´äÂŒ¾›jǤnãÁ�çΚœ‡…�—¦ƒ›²‰¨¼„¦½‡¤½UkŠUhƒk�ªxš¯a|•IMkXo�]oƒ‚�œŠ—ªp‚š� ¸aŸu“«½ÌÞ·ÃÕqƒžQc„Qf‡Zt“±ÆØUj†M^…Qj„Ug‡Sf„VpŒ^p‹Zl‡Ma�OZ}KUjQZqKUkV]pßÑÐêØÖéÙÓãËÁÖ´°Ó®©©‡€g[^^Q[UGQOEMOKQUVadaocfu[gy[cvVaxUaVa€XdƒVh†Zh†Zk�[n�ap’cu˜dy›gzœfw“an†^cxX^uUQ[ICQI>QIGSQKX^VpØËÖóòöôò÷ôòöõòøöó÷ôòöôò÷ôñõõòöôòõõòööò÷õòöõñõôñôóíòóìóòìòòìññëðîåíéÝãëßåõòôôìðóìïñèêôîòóíñòêîìáåôíîôïóñæëòåéóêîóèîòçìóèíõìòôîòóíñУ®Å‡›Ã�§À¢´§‹ ®�«¦ŠžÉ¯¿êÜåçÙáÙÆÓèØÝîåìëáêíäëíäêðæìòëðóìñóíòòíòñêïêáçλŪ�ªÒÄÄ˹¾¾¯¸™•¦�ˆš¨–¬¨›®¡”©¼¯»«–ª«˜®ª–ª¹¢³Ô¼ÌíèîñíòñíòïêïêäéçÞæàÛäÐÌÔª¤³ƒ�“tr…wy†zŽ€��y|‡pu‚uw‰wy„z~Žpw‰qw‰Z[k^]ufnƒ++3C@OGCO////+++++/++/+/3+3;9>//+/+'/+#/++++'/+/6+/6/+6+3C6;@;;II`IInIKuIKlGG]ECQC9I@6E96E>6G>3K@6KE@aKKlOQrSXyUVl‰nuŸw}À–�Ô­ž×¶«Ù¼µËªœ»™‡—ul�ur–pj~caMEMICOC;K;6I93C6/>;3E>6K>9`@>h@Cu@@n>>g>;a>@g@@vC@o>Ck>Cn@@h@>`@;Z>6O;3C6/>93>;3I3/@93@93@63C63;93@6/96+>93C>6C@6CC9C@;E>9C@;CIESIEUMIXVMaVQ^XU`XM`VM]OKUIGSGEUC@MECVICXG@MG@KC@GE@OICV[h|gz”`u�ar’jy‰r†šf|�hxŽgz“hzŒdz”`wŽ]r‹cuŒcvŒgyŒu�¤r‰œk�™t�¥y–ª…¥·Žª¼~Ÿ¸•¯Ã“£¸€�¦Š~uëÓ¢æÆ‰êÑœòäÁòâ¼ïÙªæÅ�¼’cÆ¡nãÁ‚ëΓî׬åËœ§­¯h–~œ´“°Åg|–Zw�Ug‚yš´cz—XqŒUgˆVj‘…—¨l}�|œ¬˜²Ê˜¶Ì¿ÒâÍØå^w˜Sl†Sj�ˆ¡¶ÍÙã�©Q^‚QhˆQf…Ug~Uk…ZpˆXjUh~MZtMZpKVoMUlKVnUVnȸºëÜÞêÙÔäÊÉß¾ÁÜ·¼ÃžœpgkdV]]UZZShZOaSQ`[ZjZUdVZkVXkZ^vX`€S^~Va�Uc�O]~U^ƒS[yO[wQ[~Sa�Vd…Xaƒ]`~VXtSVoOI[GCSICSIEQ[Qk¯œªòíôòðõôñöõò÷õòøôñöôñôóñõóðõôòõóðóôñôöòööóøöó÷÷òööò÷õò÷ôòöóîòòìñòìððèîîäìéÞåóîòîäçðæçôíðóìðôîòëÝÝñäæôìðòêíîÝáñåêõëðòåéñßäòäëóéîôëïêØÝÃ�¤Ìž°Í¤µ­�¤¦‡›ª… °•ªÁ¤´¢€–ªŽ¤Ã¥¸ëÞæçÜâìãëíâéñêïóíñóíòòéìñèëéÞãɼƼ¬´Í»Á²¡¥±¢¯“ޤ –«° ®«œ«Á®½¼²Àª—¬ªž®­–¨¾£­áÐÝðèîòðôñíòðíòíéîáØÛ×É˦– ˆ~�ˆƒ‡€~Š~�y|�|‘ly”qx–pyŠKIOICIUS`lq…x~�pw�cfq`^l99>3///'++++/++'+'/+/>6>G>MOS^3/33++3+'3+//+'//+6+/3+'3+/@9@@;@KMaGCcC@^EE^@9O@6G>6M>3O93G>6Q;3O@6X@@[MKnQSxQZUXt‘rrª‚€Ï¥œÜ¼¯Þ¿³Ýúҭ¤Å¤™²�‚²ƒ«€|ŒpkSKSKEIC>O;6G93@6/>9/C9/I>6X@>n@@o@;f;>^>9a;;[C@r@@n@Cn@@o>@f@;`@;^>;Z;9I63E9/>93I63>93>93>63G93C66@93@9+@9/;>6@>6E@9@C;KC;I@>EG@MICQQIVVOXXQ]ZQ`XQ^ZQfSKUMI]IGZGIXGEXKGaICQG>KIEKG@MGEQQUhk‚—[u“]q�aq†k€’o…•o~�hzŽavŠh}•fwˆ`tˆauŠ`vŽcu‰l}“r‰œoŠ y”©~˜­†¥¸“ªÁš­‹§º‘£·ooy»«�ìÔ£èÌ–ìÒŸñßµòß´ðÛ¯èÈ�º’hÁŸkäĈèÉ‹íÓ�í֥Ķ gx�u“§ŒªÀr�ªZt�Qh‡r”¬h€–]r‰UjŠQaƒo€’ZqŽw–ª•¯ÆÂÓãÖàê­»ÐSn�Sl�Xp—ÅÔà×ÝèXj‰Qf‡MhŠQ`|UhˆVl†ZoŠVd‚Vn‡KXrMVrKUkMQgISlQVv¸ª®ìßâëÞÛçÑÏåÈÎá½Àɤ¢tfkn[jn[fj^fcXcQOZXQ`ZX`SVhSVjZ[tVaU[|V^�O^wOZwMUzMOnMVwKQrMVzQXxSXzOZtOQoOOhMI]IEQI>OIEMt^rÐÁÎèÙéðéñôñöóñõôñ÷ôñõóñôóñôóðôôñõòïóôðóõòõõòööòööòõõòöôñõóïôôïóóíóòìòóíôòìñéßãñêîòëîáÎÎòèìóìðóîòîáãêØ×ñåèôíïíÞãîßàõíñôêîóèíòåêòçëóèíñæíÆ“­Ï µÆ“¤ª…�­Š¡Á¤¸�„�™x•œ…�œ‚™£Ž£æÚáêÞåéáçìßæòêðóìñòìðòéîïäçà×ÜŶ¾Æ¶¼¿³¼�– ¡—©Ÿ™®ª—ª¸¦¶µ¦¶¶¥´µ¤¶¯œª´ ¬¶˜¨Ì¶ÀïæìòîóñïòðìððëïáØÙ¸¤§¥˜ �†”ˆ�‰�y…‚ƒ˜uz�ry–ry’yšv”QMU@6>@6;@9EIES][klr‚hjp[^lCEO3+/3'++++/+'++'9/6I>ISM]QSa63663//+'3+3/+'+/'3//3/'3++@9@>;>X]kE>SE;^>>Q>6I;3E;3G;/E93K;3G;3K>6Q@CaIMpOQtQUrOUk‹pxª~Ò©¢Ü¼³ßÅÁÞÁºÔ±£È¦™´‘„­�w¨~x…hdKCKI@EE>M;6I63@3/;9/@;/E>6QC>h>>k@;k;;];6S>6UC;cC;a@@l@Cn@Cj@;f@>a>;X>6K6/>;3C63C;3K;3G;3E3/@63>6/>63>3+@93E>6G@6EC9@@9CC>I@9CG>GKEUSIZVOcXO`ZOcXM]VO`QMXOI[MGaMMaKIfQMcMISKEMOKXQM`QM[USa”ž´cw“]u”ZrŒ^qŒ^uŽftŠp�–j|Œg|’jv‡j|Œdu‚^w�atŒ^qŠao‰h|�z“¥z—­|›²—±Å€Ÿ®�¥µ‰–±² €èÓ¤ìÒœìÒžìÒŸñß¹ñßµð× éÍœÀ–hàlå„êÍ“íÖ¦íÔ¤çЦ‚ˆžo‚”�«Âv–¯j†œXpŠZl~cx�]qŒay‘Xr’@@UOVk|˜­ÉØåàæî×Ýçdy–Vp�Vp“ºÉÖÔØä‹—®Oa‚VkŽSj†Sc‚XlŠSkƒUg‚UdƒS`xMXtOUqKQlQVnMUoV[v–…•íãåîáãëÙÛæËÏäÆÉÄ ™~llvcovflo`naVfVM^SI]OGUMK`OQfOQfSVqUXvUXtKUvKOoGKlGEgGE`GC^GE^GGhGGfIGcGGfGGfIE[MEVI>MIGS¼£ºÝÆÛÜÃÚâÏßñëòôðôòðôôñõóñõõòõôòöõòöôòõõò÷öòööòöõòõõòööñ÷öòöóïôðéïïèìëáéîæìðêìðêîéÝãíáåëáá̺ÁñèëóëíóëíêßàçÙÝòêíïâàéÙÛòåêõëíóäéòåéñãçóçëôëðÖ¯ºÈ™ªÆ™°Ë¥·Ë«¾¥ƒœ§‰¦²“ªµ™«‹t†�xŒ§†žåÖÞêÞáðçêóíòóîóòëïìåêâÔÝ˸À¾°¶² ª¬�¯¯©µª¢²¿·Á¨•«¨œ¯£’¥ “ª¢�§³ ¯À¬¸Î¯¾ñìñóïòóíòðëïÓÃÿ§¡¶¦¨£˜˜™�—‹‡”‚„‘†‡•v}•vz˜wƒ˜w|‰C;>@6;>6@>3>>39@6>@6;>69C;Eacv^`xQUa/+/3'++++9/+93/C9>G;@OGQSUl>9@9363/+/'+/+'++'6+/6/+3+/@6;G@Ghqy>9G;6G;6E;3G96C;6G93E93I93@;3K;3G>>QIG]KI]IG[KOgyov¢ƒ‚Ñ«©ÞÀ¾Þ·Ý¶ұ¢Æ¢�¬‰wœzp•uq`OSG@IICMIEO>9E93;33;6/99/@96K>;];;^>9a;6K93G;6Q@6XC;Z@>U>>Z@@cC;a@;Z@9V@9Q;3G;6G96@96G;3@;3G66E93C9/E9/C9/G96E@;OE>SI>MC;EC9E@;GG@OG@SOK[UK`VO[UO[VM]VKZMIMQMZOMaOOhSOdZSrXQgu}z�”‘¡¢¥‘�˜�„’£”“Ž�·k~ž`x’[u�]tŽ]o‰]rŒat…l�k~”h}�gz‘hyŒhy‹fyŒ^q‚`r†cx�z–¨v”§‘¯¼†£º‘ª¿yƒ™ÞÇ—ëÒœíÔ£ìÓ›ìÒšðܳñß³îÙ«åÈ‘«�g‹oV›yaêЛíÕ¢íÓ íÙ¯ª �u„™�­ÁŒ§¾|”§f|•Un‹[p„dy’]t”UgƒIUqVcxŸ´ÁÜßèØÞ頰Ȫ¼Ëx�­²ÁÎèêñ}‰�XfƒUnŽUl�Qf€Sf}Uj�Sa~Sg‚Xl†XhMZpQayOXq`jƒ´›¢Åª©æ×ÖïæéïäåîààçÎÏßÀ¿¶•�„ln€lu€hop^f`UfMGMI@GI>GGEVMI]OKhKMjMOlOOpIKjGIaGEdC;[@>SC>OC>OE>SE@XE>OECcEC^ECUECKI@QGCO×ÀÐßÉÙãºÄž»êÞêóðõóñöôòöôñõôòöôòöõó÷ôòöõñõöòööôø÷óø÷óö÷ó÷öó÷óðôïåêíåíâØÛâÔÝã×ÜðéìòëïëàæóìòØÈÍÓ¾¿êÝáðèìòêìéÜÞæ×ØóìðïãççÖÖôìïôëîñÞáñáæðààóæíïáèׯÀÉ›¯Ë¢½Â˜°º˜­·–ª³�§ªŒ¤œ‚—�‚–‡nƒºž®ÝÉÔòêñôïóôîòñêïÜÎ×ÔÃÊÆºÁ¬ ·º¯Ã»²Å¥–ª«ž§œ�¤¤–¥Ÿ� ¬”§´¦¯º¤ª¸¢³èÜãòíòóðõòíòíææ¸£Ÿ«™¢ÇºÁ§™œ¸¯¶––¤‡‹œ}†™‡™�…™‚�USZ;69>6>@6>969>6;;36;39>6>>6;;/3@6>E9@X^u6+/6'+6/+;33;66C6;C9CM@QZU]ECI;366///+///'/+'6+/6/'3+3G@Ofkxqw€@>O>6G>6C93993;93>>6E>;OMVfZhyZkxZdqSaqXcoaq€r€Ž’– °¤§Ö»¶Ü¿¼ÜÀºÙ¹´Ë§–à’§‚y�oh„f`[IMOKO^`otx�fu‚Vgo@CI6/;9/963E>3I;9Z>6S93E63C63>>3E@9K@;K@;M>>O@9V@;V@;[>6Q;9K>6G;3K63>96E;3C63E93C93K;3M;/M@;ZGEgGGgKIcICSE@QC;GC@UGCVMI]QI[UKUQKXUOcSMXMIZOKZQOcUSkXVlVQp`ak¤­­ÀÁÃÐËÔÀ¸¼°¬²­ ¦²±Â~Œ¦^w’[u�^r‹^qŒhy”dw�dw‡o~“n~�f~Šdz�fyŽlyŒgwƒ`u‡dxŒq…�t“ª„¤º…¡¸š´Ä�‘ªÖ»…êÏ–ìÒœíÒœíÑ–è񡧮¥É­‰Ÿ„nXIKQKUh[fçÌ•ìÑœíÐ–îØª¸¥•z� ˆ¥¸Ž¨¼„ ²k�š[rŒ]p‰cu�]z—Sj‰GMdgu‰½ËÔèëòÃÎÝ™­Å¾Êئ¶ÆÞåëßãë]o†Uf†Sh‰Sg…Sg„QgUg…Sf†[p‚Uhƒ[l„Q[vQ[wMUu`o‰ßÒÔêÜÛñæáñçéðæêîààåÌÎܺº¯�Š�ln€jlzhpl[j]ScE@IE;CG9EE@IIEUMI^MMdKMcKKjGIaC@]C@[@>XC9O@9K@;QC>VC>UG>VC@O@@[G@OGCSI@QQMcàÒÝìäëäÙÞÙÁÓæÒáòìòôòöôñöôñöôòöõòööóöôòõõòööò÷öó÷öó÷öóõ÷ó÷õòöóîóïæììåêæÝåæÝäæÝãðéíòêïïæìïæëåØÙò¹×ÁÉïæèòêìðç鿨ÚñéìóëíåÏËðáäõìñóçèñãçñàåñäëôêðèÔÝ×­ºÁ𬾗ªÎ¤´¸—ª¿Ÿ°¥ƒœ ‚š“w�Œt‹�~šÉ®ÄóíòôïóôïóíåçÑÁÉÖÅɳ ©¶ª¼½¯Ã´¦¶£�Ÿ¤•ª£–£¤’  Ž ³š¢¶¤­²�«¶¢¸òìñóïóóðôìáá×¼¤‘ˆ°¢§³£§¢—›–“¤‹ŒŸˆ‰–€…œ€ƒ™‹�¥VMV>9;;3;@9@>6;>6;@6;C9@>3;>6;@6C>39>69@6>E@MI>G>/6;66C69@99C6;G;CG;CVQ]KKS>9;9633+3/+'/++/++6/+63/`akw|„kr@;K>9I;6E;3C>3@;3@GM`Vdy}‹œ�™ Š–¦„’™x‡“x…”†’�™Ÿ²®®½¼·¾ØÆËÞÈÆÝÅÃØ·²Ì£�¾–‰¯†“of…h`[ISVVaffx†ˆ¤‡•¨|ŠœSal;6C;3C63C>6K96M>3M33;3/;93>>3CE9I@9G@;G@;OC6SC>V@;V@6S;6K>6M>9O96G;3E;3C93K93G63@>;S>6[CEgIIkKKgQOkIM`IEVKOrIIlIEgKI`KKdOMcMIZMESIEUIGUKIUII]SZrVZtaf}¤¬ âáäëéíðìñíçíæâèÔÎÓÕÃÉÎÊÖgzœaz–`w�gx�g|–hy–gz�at‹dy�hwŠgy�g•kz‘kz�cyŒdxˆap†at†‚š¯|–§Žª»‡ŸµŸ‰päÈ“ìÑ™ìÔ îÓš»š}�š©„œªƒ�¯~”§o‡•hu‡Ñ¸‹éË‘éÎ’ë̑ۻ‰•‰†x‘¨�§º‹¦¼n€�p�“hz�h~™a� Xo�CC[¿ÍÔçêïåèðÌÖâÙà锦¾çéñèëñ‹•­Uj†Uh‰SfSa}OdxQf‡]o�Xn�dv�^k~U`yVn�[t“ZnŽU`~±®µäÕÏïåãðçêñéëïââèÒÏݼ´´‹‚€loxhrugl]S[OGX@;GC9CC9C@;GC;EG@OGCXGC[EC]C@X>;M>9G>6G;9G@9I>6@@;GC9KE;IG@OG@UMK]USoVQp`[tиÆÓ²Çº�±ÙÁÔáÌÝïåïõòöõòöôñõõòöõòõõòôõñõöñõöò÷öòö÷ò÷÷òöõðôôïóòíñæÝÞâÓÖÛËÎÓÅËÐÅÐÖÉÒÛÉÍìàçðçêèÙÙÅ·²¶¥¢çÛßéÚÙîããîäåäÐÑíãäìÞáßÈÍîÝãôêíòâçîÝàïÜßòçíóêðÉš°Á”§Åœ²Â•®Á›²³�ª«�ª¬�§–‘Šp‰²˜²ÜÆ×ôîòôîòòëîÔÅÎÐÂÈ𺾱ÂßÍÖéßå¿­¶¨“œª‘œªœ£°ž¨ª’œ¬�«ž‘ ©ž¸çÜãóðóóïòæÙÛÊ´«¸¤š‘‚|¬�ž«¡¨ž ­“’¢‘”¤Ž‹Ÿ‰�¢‚Œ¡UMX@3;>9>>6>@69@6;>6@@6>>69@3>>6>>6@;36@6;>3;;6>@6@@3>@9>E99@9;E9@C;CG>IQMXVZdOKVC>E9366/33/+;39MIOUSXuppuvuw~ˆECUC;S>;G>6C@9Goz¬¯º¾¾ÄÓÐÛÕÓÞÖÓÞÏÎÛÈÆÒÄÆÔËÆÕÔÏÝÙÐÞÜÔßÞÓÚÞÎÓÙÈÍζ³ÄŸŽ¼‘~¬„|”rl�g`[IOjgy„Žª¡º²²Æ¦ªÁ‡“¯UfGI`;;K;3C63>93C3/66/6939E6GG;MI>ME;KE>IC9MC6M@;S>6O>9U>6M;6M>6S>9M@6I96I;6M>;U@>]EEnGQvSc„UhŒ[gŠU]wQUjay¤Vh•S`ŒMQzKG`KIdGCXGG^KG[GEUIKdIIcV^r}”œ¥°«áàãòðôóòõôòöôðóñîóìåëÛÐØÜÒÙ³½Ðgz�j�dz�^v•aw�aw�dr†dw‹drƒfqƒfkgl€aj€]j€^j|ao…]p„r‚’š±¾™²À“¯Àut„¿§�íÓžîØ¥íÖ¤áÓ~�–€–¤}–¬–ªu‰˜u�£ƒpgéÊ‹ëÌ�éÌ�è̓׺�v�—�­¾~–©z†šo~“tƒ’k‚“k„ `w�MVgÙàèäèîâçîÝâëÂÌÝÝãìåèðÃÌÚ[q�SlŠUgˆQc‚Qd…QgŽOf„[pŽZr�Š›«dx•Zl‹Xp�`l�…Ž˜¸´¼ˆŽœÐƽïàÙñççñçéïàáèÑÒàÅÀº™�ƒor|gtl^jUO`IESCCUC>MC@M@>OG@SGEUC>QE>QC>S;9G93@;6@;3C;3;@9G@;CC;KE;EE>MOK`QQp[]�lg�vn–~q�áÓÝðìòáÏߦ€¦º‘¶îäíõòõõòõõòõôñôôòõöòõôñõôðôôðõõòöõòôöòöóîòóíñðéìãÖÞÜÑÛÜÌÐÛËÒÔÃÆÎ¿ÆÌ¼ÅǺÂêáåßÐÍ˾Àº¯¶¿¯°ëãäáÕ×ëààáÑÒßÎÐòêìãÐÏáÏÎòëïòäçñßáëÑÐíÖßîÜäÜÁÇ»‘¥Ä ²Ášª¾•£¹�Ÿ§‡ž§‰Ÿ£„›È´ÁæÜãíáêôîóïèìÝÏ×ɸ¼ÆµÂº©±ª–¦¯˜§ÛÌׯ®¼º¨³²š£¬”�­—§¬˜§¥ ±±¥¸Ò¿ÎòîóòîïìäåϽ¸§�œ�‰�’ŠŽÌÃËÀ´Á£œ§¢œ©´²¼  ¯†…‰ZUV@6>>3;96;>9;@9@>69;66@9>@6>C9CE;C@6;C9CC;@C9C>9>>6>>3;@9IG>KMGVgh�‡›ˆŽŸ–™©œ ¦’–œMKSGCKGEIIEGOKQSOQa`annghkk€„‡GG^C@Z@>M]fu‰’£ÈÄÊàÜååãìéçíêçïèåîåäìáÞéáÝéàÞèãßêãßéáÝèÝ×â×ÎÛÒÅÒÁ²¸±š�«Ž�™yl†ldt`^OCG`^rx}–ª¥¼¼ºÌ¼¹Í¤§Àv‡£Zl�EOn>>M96E6/9//33+3969K;OI;GKEUMCOOCQG;MC>I@;M>6S>9VC6[>6Q;6I>9K>9K96E>9I@CZGOrKXXk–`t�at”cu”]kŒSaˆt�³c~§[pžSa‡KKdKKjIIdIGcKG^GEUKK^KOjl‚ޱº¼ÏÑÓëëðóòöõóøõó÷õòõóðöïéðÞÖàÛÐÓ§´Éfx‘jyŽfy’aq‰]nˆ]nˆftˆnx‹‹†�¬œ¥² ¢¯œ¤Ž…’y|„jn€hp‚hr„xy… µÃ�µÆœ³Æy‰Ÿ™ˆtíÓœìÒœìΓèÊ•|ƒŠ�“§y�¢€–¨y�œu‹�XQ[æÈ�êÏ•éΕçÃäÆ�„�œ“ª¸€—¬v†”o~�q€–p„“n†Ÿax“S^xÞãëéëðåèïÖÚåÆÏÝÝäíÖÛæ�™µXnŽZnˆ[oŽQgŒQ^‚M^ƒSk�]t“g~›¦®ºdy˜]ušZu�…ަÎËÍ×ËË|‚—¨§³çØÔïçèñèêïáäçÌÏÞ¼¼´’‹~npugnkapVXnMQfIOlKMdMMgGIaKOdMOfG@ZC>SC;K;6I;6C96>@9G>6E@9GC>GE@EG>EGCOSQkZVqjn”~v¡‡|ŸŒvšàÏÙòîóèØä¼“´¹’³ñêñôñõöòõõòöõñõõñôõñôôðôôðôôïôõðõôðõöòõõîóòëñîçìã×ßÞÑÙÝÍÐÚÉËØÉÌÎÁÇÆ»¾Ç»ÃÓÃÌãÖÕÆ¹¼Á²¸¼®¯äÕÔçÞáàÐÎèØÖßÍÐðçêéØÕäÒÕìßáôìîòçéîØÜë×ÜêÖÙ˧µ»‘§ÆŸ´Æ¡¸¸�£¸Ž¡­Œ¡¯�§À£³àÓÝîåëòêðóíóéáæÏÃÎÆºÂŵ¼¶¨ªž�š§�›Ò¼ÉκŸ¢ª¾¥§ª™£žŠ”¦˜§¨¡±¼®¾áÒÛóïôëáßàÓ͸¦©•��„~�•Œ�ɾÃÁ²»¡Ÿ¨À¼Å¶­»¨§²OGIC;;>6;@6@>9>@6>@9>>69;66C6@@6>C9C;6;>6>C6;@9;@6;>9@C9CE6@KCSqvЄЛ–›¥œ ®¡§¶£¤±¤¦ªž¢§OOXMKZKKSOKOSQVUOS`][lllonq}|IEcE>[GIa�— ¶¸ÃßÛâèåìêçîìëñìéðêèïéçïçåíåãëãáêãàêâÞèàÝèÚÖàÏÈÙËÃÓµ¯Á¥–›žŒ��ytycZgVUK@IUUfdl~�ž®´´Â´³É¤¬Åw‰©ct˜Q^€GG[>@Z6/;/+'3/3936I>MM@MMEQMEOKCOK;O@>GC9MC9Q@9U@9O>9X;9K>;S>6G96E;9ECEVMZ}SdŒ[q›k¡jœjzœ`q�`nŽ–©É‡›Áu�¶c~¤Sf�QX|IIjKKkKIlS]uuŒ•’¨ªËÑ×èèíîëòôòööôùöôùöôøõòöôòöïëòãØäØÌØ–¢²l”crŠarŠo}�o}�v€�qrodjçÛÔòêéñéæñäàЪœ¨†w†kfŒto‰rl}nh‹�•–­¾ ³À‡¡¸x�äÈŽëИëË�êÌ’²’wy„�y� z�£zŒœu‹–nv†Ì¶‰èÌ�éÈ�çÃ�çÆŠ ‡xŒ¢¶�”¤€�˜q�‘u�’w��q„›h~•n|ŽîîòîïóéëòÛâìàåíâä씦À©ºÈ µÅj~˜XfƒQd†Uh‡Uk€dt‘—£²©¯À¤¬¾Xn�Vh�]qŽßÛÝìäåÓÃÄ€}†gv“jƒ¢š–´Ã¸ÆêÛÚàúҲ£–€}rdorgppn€cg‡`kŠ`r‘ar�at”]q’al�Zh…VhˆQXwQUvCI^@;GC>I@9EE>KI@OIEOQIUUMVZUljhƒopŠ€x ‡‚«”†ª²œ²ßÉØÜÆ×À�±Éª¾ÚÁÍôïôóîòôïóôðóôñóöñõöòõôñòöòôôïòóîôôïòóíòðéîíåëéßäÝÔÞÔÊÕÔÈÔØÊÒØÉÌÔÇÎùÁ¿¯­º«ªÍ¾Àº­²Ä¸ÀǼ¼¬Ÿ£ÔÃÈÚËÉêÜßæÜÜâÑÑíãåêÝÞàÌÌóëðôíñïÝÝäÁÈßÅÊŸx�¶�¤¾–§¸�£É©ºÆ¨¹¶’¥ç×áïéîñéïòêòòëñêÝãɸÀȵµ¾°µ¦—¡ ˆŽ§Ž˜¾ª¹Ð¾ÃÀ¨±·¢ª«•žªŸ²¯ª»³°¼  µÕÈÛïêððëíÑý½­¥¡š †„�z|†œ˜›ÒÉÒÙËÒçßãéâã˾¸M@EE6;>6;@6>@6@;9@>69@69@9>@6>C;>@69E9@E;E@9CE;@G>EM>IgS[Á­±×Ì͸±·œœªšœ¬�Ÿ§¡¥¶ ¤­§§´«§¬¡¢ªQMZMIIKGEICGMIMUMIZUUqntuv|vw‚ECZECZ~„�ÒÎÖàÝçëçííêñïìòîìñíëðëêðêéñèæíæåíßàéÜÝèÙ×áÏÒÝÉÊÛ½½Ï±´Ç¤ªÀ‘•¬†ˆ™or|UUVOKQG@SECOMI[Zfv„•«�š«‡œ³r‡§l¥dx VfŠM]w@>O63;3/3>9CG;SKCUMCQMCQOGQK@MI@SC;I>9K@9S>6O;6Q;6I@9I>6G;9K@;OMMhUa…]l–j} q†©nˆ§n€ g}žgy™�¬Ë—®Ð™¬Ìˆ�Ãk„®^u�M^„Ug…hƒ‘«ºÁÔÙáâáçïíòóòöôó÷õóøöôù÷õùöóøöòöóñöíéðÛÔãÔÌÜ·³Åš�¬‹Ž™‡„ФŒ�§�‘•wyfUUo]^ìãàòæãñçäñãÞØº³¹“‡‘uj|hfzf^yc[ujk‚ŠŽš²ÄŒ¦·…ž°¾ª‡éÉ‹èÈ�êË�áÁˆ¦†qwŠ—u�¡}‘ŸzŒ™t‹–ygaÔ¹†çÂåÁ~åÁ€Ú¸€Œ˜€�™x„�u~�xƒ‘z…�u�’l�–x�“éëïëìñäçïäèðãèïÎÖ㆓¬u‰Ÿg�ž`w‘[n‹Xj…py‹�žŸ¦³œ ®˜•œ�‚ŠZg�Xf€||ŽíêìíäçÉ·´›˜�q}‘`t�^u–g~žÂ®¸Î¬š¸™Œ�ouvfnxlzqq‡lyœrƒ¦tˆ­}�¯|ޝx‘´x�¸z�´o†¬h€¥h~¤Xn�Q`‚O[wMMaKEUOIXUOZ[Q`cXfh`rwr’�|œˆƒ§†§”ƒªáÔßèßèÒÁÒ¤‰ª—~£—|œ¶�¨æÖßðçíóðóóîòóíðôïóõòõöòõõîòïçêíæéëàæäØÞßÔÝÑÄÌ˺Á̽ÁÀ¶ÁʽÇÎÃËÊÁÈÌÁÇÀ·¼´©¯¯¦¬¿­®ÐÂÄø¼šŒ‡“„…áÖ×ÒÀ¾ãרÖÃÃæ×ÖîäèãÔÏïåéóìîóêïë×ÙåÒÓáÖÙ²‘¢£€– |ŽÀœ³Æ¤³Ó³ÈòêðôìòóìðêàäâÓÔм¾ÎÁÁÁ®©��€£†Ž¯˜œ¾©²Á¨µ¾¦¯¯˜§­žª²ªµ«¥º¥¤¼§¦··´ÈéãæèÛàèßàŶ²®¥ªŒˆ�~��‚‚“—“œÝÒÙïêîãØÓlSOM@>C6@E;>@9;E>C@6@C9C>6;C9;C69C9;I@CG;CM>CfS[x]c|a^žw~É­¶ÜÓÖ²§¯¤ž§£Ÿ¨› °�Ÿ°Ÿ¢­ ¢­¢¦³§§´­¨­¤¡§MGMICIKGKIGGOIKQOO`ZUjffolguu~Z`uZau¶µ¼çßæëèîîìñïíòïîòîíòîêðëéðéçíèåëåãêßÞæØÙäÌÏÝÅËÙ·ÀÔ­´É§²É™¨Á‰–°��¬juŒX^~V[uSUoOZrV^y^j‰^o�cw“fx’j}žqŸt‚£gx�cr™OZy@>K;6@>6EM>KOCQOEOKCMQGSOCOI>KE;K@6C93>>6G;6M;6K@9O>6C>6IC>QIKgVa‰]l‘l nƒ£q†§j€¤h~œgy™•°Î–¯Ï–­Ë“§Æx’¸k…¯]t–~˜¥ ³»ÙÛßêèíïìòóñõõó÷õóøöóøöóööôùöóøöòöóðöìèíÚÔáÌÆ×µ¯À§�ª¤™¤§–™©�Œ Š‰€pl^QSwfdîäÞñåãñåàïàÙÝ¿µ¿š‹‡j]yf^r`[yfdvfctnjœ°¾�¨º‹¤·™†wçÇŽèljëÍ–ä¿�Ȥyq�ŒvŠ’y‹›uˆ’o„‘`[a´–læÂ…åÅ�äÁ†à¿„t|‰}Œš}ˆ™x�Œz‚ˆ}…‘t€Žq|�|…�èëïêëðäèïçéðÞáꡭŘ­Å—­ÃŒ¤¼r‡ ku†`[fvlu}w€ƒw}‚qw†tu†w}]duZ`u”Œ—îéìîèêÀ¯°˜˜ y�Zh€Zj�]p�’“ªÉ¤–¶��‚qwvhkwpzxw‰|… w†¥‚“´†—µ„–µ�˜ºƒ™½ƒ›½„—¾x‘³w�´h�¢cv™^q�Xc~UUhUQ]XUhdXhd]nkfƒ~w–€~œŠ…«¡’´Ê·ÌðìññìñïéïÛÎÙÀ¦À¨‹ª£‡§Á�»Â£½èÝåóîòôîòôîòõðôõïôðéíçÙÞæÙÝßÒÖÜÊÏÕÅËͽÅŶ¶Ä´´¾µ¼Á²¹Å¼ÃÊÀÇ˾ſ·Â´­´±§§¾®±²£Ÿ½²´�„€Ž‡‰ÒÂÃɸ´ÒÃÁÖÅÀÙÄÃîãåæ××éÞáòëîóëïíÞáäÐÔåÙÞØÅ˯��¨‡›µ�ª¾›±ÝÆÔñéíòìðòëïÕ¾ÃÓÁÄÜÊÈ»¤¡¬Ž‘¡‡´œ§º¥¨»žªµœ¤´ž¤°Ÿ¶¼±¾µ®»«¥»®®Áª¯ÀÌÃÐÒ¾ÅåÖÞäÙÙ¾³°© œŒ†ˆ„ŽŠŠ–�Œ–ßÒÙïëﲜ•K>>G;CG>GE;>@;;C9@E6@>6>@9>C9>C9;I@CQEE`MQ€fh›}w—xwˆjc×ÀÅæÞá´ª­¦ ¯ œ© ¡­�¢³ž¢²Ÿ¡°œ ª ¢«§¥´ª¨°Ÿ¡¦KIGKEIE@@IIGSIOSKK^VSgdcnnhghq[^rVUgÀÀÊêäëìêïïíòîìðîìñíìñíêðëèïéçíåäêåáéÞÝæ×ÖãÆËÜÇËÚµ½Óª°Å™§Ã’£¾‚•¯}Œ¨p}“`l�`h†[`~Ud…Va~`q”cvš`v›ay—fx�g}Ÿp� o€£g}Ÿ[f‚IKd@@O@>IM;QSCVMEOQEMKCKQEUMCME>I>6>63;>3E;6K;6E>9G>6C>9G@;IIIcXa�]hƒgx˜n€¤o�¥l€¢l} l}œ—¯Ì”¬Íš¯Ì�°Ï–§ÉŽ¢Ã¦¸ÊÛßææèïòïôõóööôøöóø÷ôùöôùöóøöóøöôøöô÷õó÷óò÷íêñÔÍÜþҭ§¼¡ ¾�œµ‹‰ �vv€gdhh^c¡ŽˆïçáòåáòäÞïÜÔãÈÀÆ šŽxnwhhvgayjcw`^raa}x}˜¦±˜­¾€�¢Ø½ŽçÈŽçĆàº}ݶy}c[u`^}g^’xaª‹aϬtܸ~çĄ徿ÁƒË§}x‰•…”¢~‹šx€Š}ƒˆy�Šv}�tx‰……ŽêìðìîòåæîßãëßäìÚàè¶¼Ç�˜§rglpfgzfgwfhyjgygfzgj‚nr‚loŽ‚�XZh^arÞØÖêßáñêíų´yŠrz”r†žXl’VoŽjn‚¿šŽ¯‹ƒ†pnrfopkwy}•�Žªƒ”²†–¶ˆ—·‰�¹�¤Å‰�À“§ÂŒ¤Á�§Å�¤Å‰ŸÀ…›¼‘³n�¤jt‰jo‡a`oj`klfuul‚ˆ�ž‹ƒ§ž�­çÜâóîòóïóؽÑàÌÜáÓßíæíñéïðéîÝÐÜdzÉ�y˜¦„™È©ÀñèîôñõõñõòëðíäéëàåâÒØÏ¾ËÆ²¸° ª¯ž ± £´¨²¾°´½¯±¿´´Ç¾Ç¿¶¿®§¯°§®¾¯¨«œš¼´´”‹�Š€�­¥§²¡¢¯  ÖÉÎλ¼äÓÔìÞßæØÚïåèóëíîáãìàãìáäíáèîãêӹɪ‡¡´Œ§ñçíöòööòõîåèáÑÐáÒÓÖ¹´¹––¶–™Æ­´ÝÇÏÞÌÓÅ£­ÒÁÎÁµÃ¼´Å¾¸È»´ÄĽÍÐÉÒÌÅʯ ¨ßÏ×ïêïâ×Ö¾³¯£œ¡……”ƒ†“ˆ…Œˆ‡•̼ÈëåçXKII@CE>@E9COGME@CE;CC9@>9>C;>@99E99‹ol¬†ˆ¯‰}¦�€›wq‘pj‹d^èÞÞÔÊȦ¡¬ ¡­££¯¤£®� ­–œ©cnŒŒ�¥™¢±ž¤´¨§´™œ¢MIMGCIECEIECQGIUOMaXUhf^dgg[XdZXpMMdphnÙÏÔêçëïíñîíòîíòíëïêèíéçíæäìãàêßÞéÙÙäÊËÚÆÆÚ¾ÁÖ±¸Ñœ¥¼‰š´vˆ¤pƒ jƒ£j}šr~œrz˜jpˆfv‘hy—j|—`w—dyœ`v–at—hx›k}žk} k� hy—Va}SXrMMdSSoUUdVUoQMZQMZVK[KEOE;G>6C96C>6E;6C>9IC9E@9C>9C>9CE@QKQdUXxcq‘hy˜l}šfu“cv”gt‘’ªÅšªË˜¬Ë—­Ë𭯧¸ÎÛàéñðóóòö÷ôù÷õú÷õùöõø÷õù÷ôøõôøöô÷õô÷ôò÷õñôóñõîêðÒÍÙ¸ºÌ¡¥¾™�¸œž´�“®�ˆœ}†šqwŒ�~’Á³·ñêêñæçñäáïÜ×çʼղ¦¡€r€jcyhjxfcqadr`axlj‹†�›¤¯‰ ³‚|€Ä§€åÉå¼~߸|ß»�ãºxã¼€èʼnã¼}æÀ€çĉæÁä¿ã¿€†ha†’£‹–£‡•¤x�Švz‚y}€}�ˆv}†|~‚æçìîîñííòêæêã×Ý̰¯Ï°©Ð±¨¾ž˜“w}ˆqt€kqƒlrhp~jpƒnr„qt†zƒ`gvfaoìèíç×ÖèÙÚ¨•˜yŠˆžXl�]q—[t•cr– ��‘€‚rfkqkwxx‰Š‘¥–œµ–£¼‘œ½�Ÿ¼’¡¼Ÿ­Ç ®Å™­Ç‰£½Š ÁŽ£ÅŒ Á“¦Ä–¥Á– ¾†‰§‚œrlvyft~n~–„•·– Á  Î­¬åÒÔòíñõñõãÐÙȪÄÛÊÛ¼ ¼¶˜´ÖÁÑïçíñêïîéíϾϷ˜¯Â¢¿¸—¯Æ¨¶ãÓÜðéïóìñèÛåèÝäéàæâØáÐÉÒ±ª¸­¦°¥— ¡–¡›�‘Á³¸Áµ¸®¤¯¼²¹Ã¶º¢–”¹®¬”ˆ‰Š€‚ªž¦´ªªª ™¬ �ÒÁºÜÌËïçêÞÎÉÜÉÂñèîòêìæÖ×ìâäðæëïäêñéîÎ°ÅØ¹Ëöòõõñôôîðé×ÛìÞØäÈÈÆ¡ŸÇ¤©×»ÁðéìîáçíáåæÙÞÑÃÏÏÇÒâØÝèßæåÛâ×Î妧·ª¯Ä´¾òìðìåçßÓÐĺ·°§¦…~‰w}…w|€�‚…ªœªÆººG;@E;@E;>C9EE;@C;@@9>C6C;6;@6>I>@cMMª‰�±Š¯‰›}v‰jh€daoUQÇ¥¤ÔÀ¸£›¤£¢²Ÿ ­ž¡®œ ­�›ªft�ju�u}•�™«�¡ª�“™E@GG@GGCG;69C6;>66>3;ICMUQU`Z`OI[MMaQQ^c[h}r�ϾÇëéííêïìéíéæìäâéßÝçÜ×áÛØàËÏÚ¸ÀÍ­´Æ§¯Ãš¥ºwŽ¡k„ k€Ÿhy—g|›t€™pœq€Ÿjy—l›k|–jz›au—^q–]r’dzšdx›dx�o‚œoƒŸt… [r˜Vo�Vh…af‡[d†ad[c~V]vUUoMM]IEUC;O@9KC;O@>IC;G@9CC;E;9E>9C>9@GCOMKaZ^tdj�fo†`h€aj�`h€’©Å“©Æ”§È•¤Ä™©Á®½Ëçèîôòööó÷÷õùöõùöõø÷öú÷ôùöô÷öôøöó÷õòöõò÷ôðôòïôëçîÃÄÒ§­À’�¸’™³‘›¸�˜¶„�¥�¤|† �Ž¡Î¾ÀòéçðáàðàÛïÛÖäÁ³×± ¤ƒx~hhwdfvgjwdfudhƒnj†€€���˜ª»xŒ y…×¶èÅ…ä¼}㼂â¼}ä½~èÅ…å½zå¾}çÅŠæÀ~æÁ�儚wf�Œ™‹˜¥Œš¤€‹—yŽxz€wz…qwƒ€„êêïïîòíèìîäæíàáæÌÀÞ½³Ü¹ªÀ�œœ‚y‘vrŒqtkpƒlp€oq‡pr†qtŠx~kl‡w†íèíìáßåÓÒ«™–‹…‡~ƒ‘Xk�Xq“Xr˜hx•“�–…|…ofjwwƒ€‚•�’« ¤¾ž¦¾Ž�¸� ¼£«À´·Ì´¸É¬¸Ï”ªÇˆŸ½‹ ¿�ŸÀœ¤¿§¥¾¬œ®©‘Ÿ©– ¤Ž’°�ˆ²““Á ¤È¤ŸÉ¥žÒ¯«ÝÃÈòèëõñôîãé×¾ÐÏ·ÍÐ¸É³šµ«’¯Õ¿ÔÛÇ×îèííèîåÜåÜÉÚž‚ ‡o‡œ|‘Ȫ»áÎÕìáéìãêèßçäÙßżȴ¬·­§°£œ¢Ÿ˜›‘„†¬¢§¶¬²­§²¹¬µ½²´™‹ƒ´ª­•‡‡‰ƒ‰¨�Ÿ¸­­­¤¦ªœ›µ¦¡½«§àÏÓàÏÇ×ļïåæòêíèÜÞãÑÖòéíòèîñêîëàçíáè÷òöôíñíàâêÙØíÜÙäÆÂά®ÜÄÈëÞäôëïòëïïåëÒ¾ÈÖÉÔáÖàéàæåÜßÙÐÓ´¢¬´­²¸­¯×ÅÉðêëçÝàÝÏΟº¶¨ €Štz†||ƒ|~Љ‰”vyC;;E;;E9;E9CE;>@9>G;>G9C@9@G;@pZV¤†ƒ®‹„¬‡‚­‡˜uj|f^jVV^IG vp϶¯¤œš¡¤¯¤¤¯¡¤°›¡°• ­`gˆ^fƒˆ¢��¤ff�`an@6>@9@C>E@@>>6>>6;@;ESMU[Z]MEOOIVOM[KMXVS`XSfzk|ϾÈèäêìèëçãèãßæÛ×àÖÒÝÖÒÜËËÔ¨³»›¢´–�«�˜¯k~•`t’cv”jz˜n€ nšl›l}ždv–gw—l~œgz•^u™[o�]r�du�dw—hx’o~™uƒ¦w‰¦d~¢`|œ^r–cq—ar•ap‹]j‰[g‚[]vQSkMK]ICSE@S@>MC@OC>IC>E>;@>9C;9>;6;C@KKEVXVj^aycdyhn�fhz^`oŒž¼‘¡º’¡½ŽŸ¸�Ÿº­½Ììëñ÷ôøöõùøõùöõù÷õúøõù÷öù÷óøõó÷õñöóñôñìóîéñèäêÔÓßœ¥¾ˆ–¯�–´„’²†–´ˆ’­†‘ª�’®†“­žœ¯ÚÎÌòéæïÞ×îÜÑîÙÊèܴ̽¤¼–��vq�pp|jh€nl�ol†wwˆ†ŒƒˆŠ—©�¤·‡ ¯~‘¢´–xÞ¾ŒåÁ…á»|ä½‚éÆˆéÈ‹èÄ…çÂ€èÆ‹èÆ‹èÅ…èÆ‰Ï¬z €ly‚Š…�‘�‰}}~~€}}}||€åÜÙòììôîïòêèñäßèÎÆãÄÃÜ»´É¤¤±�Š¥„†—‡œ‚†Œtx„lo‡nrŒq}¸—˜çàáñíïðìîïæèíäåÔÁÀ‰~…ˆ€‰av•[q’[qŽl~›�Š�ƒ�™}}Œ~‰ Ž”ª¤¤½©ªÂ §¿Œœ¶¡­À¶ºÏÔËÖÓÌØËÈÖ¯°Ã¥�¯¬ ¯É«­Òµ°Ô³¯Ð¬¤Ðª¦Ì©§Í¨›Ïª©Í©ªÌ¨¦Í¬ŸÐ®§Ô´´Ñ¯¯Ù·½ôïóôïòíå鹜´Î²ÃĪ½Ï½ÑÕÃÓÁ¬Ã’}žË´ÄéÝçòëñðëðãØß‡t�¢Š©Ò¼ÏÒ¸ÎíãêÒ¿È–ˆ—Á¸¿¸²¸¶®À¹­´µ©°¡›¤–�œŸ’“¨ §¸¯º¶¨�“ƒ~¶ªª™Œ‹‰‚�œ“•­¢ ²¥¥´§§®Ÿœ ”�¤™œÓÅÆáØÙÛÇÌñçèêÝÚϺ»ðçéòëîíáåôïóöñõõïòêÜàé×ÝïÝßâ¿ÜÀÃ׸¿õîóöñôñêïèØÞéÞæäÛáèÞäêäçÓÀ¾½ª©»¯­º®°´­¸½¶»îåêäÙØÛÏÏÕÆÃÀ²¯¤œžz~Ž}ƒ–ƒ„’‹Ž™nuyOKO>6;E6@>9;@6@E;;C;CI;E[IOo[[ªŠ‡º›�¼—�¶�ˆ¬‰}ž~vv`[VIIM>CK@@VCElOO¾­¤¥ §Ÿž¥�˜§kq†VVlE;UntŽ|‰£‡�£yˆ�QScMEG6/3636C>@@9>C;>C9>ICGGCEMEGMCEI>CKEM[^j[azQSdc]t�ƒ™æàååÝãßÙáÕÑ×ÉÈÎÆÃʳ²Á‰›­q‚“q}�gx‰[nˆ`q…dr�kz’l|™fr”du“ao‰^o’`q’ft–`t’^q“[p�Zd„XgŽ]n�gx‘p€žu‚¢vƒŸp…¨j�¨h~¤p‚¦oƒ¦h¢j}™hy�ao‘U]}SVpOK`QI]MCUE>OC9C@9@>6;>9@@9@969E@IIEQSM`ZXd[Udlj~UVg[ZgŽ™²‡‘ªƒ’¬‚‘§ˆ˜°ª·Àíìïõôø÷õùøõø÷õùøõù÷õù÷ô÷÷ó÷óðöðëñíéñãàéÑÎÞºÀÏ� ´€�­�‘§€ŽªyŒ¯�®xާv�­wŒ¨|�¬šœ¯ÖËÌòèåðÞ×ðÞÕí×ÏåĴܶ¦Æ›‹”un‹po‡on†qlŠun“€‚�…ˆŽŠ˜y�©�¤¶˜­¼–ª¶Œ}yÚ—êÊ“èÆ�çÅ‡èÆˆèÆ‡çÆ‹åÄŽß”˧wݸ~æÁ„ä¼�㼀ʤlqqt€ƒ…zxx�‚}z~voϸ¦ñéæôìíóéæòéäóììòîïóïðòíðîåäÝÆÃáÒÎéÛÚêßßçÛÚéÜÖëààòìîòêëòêêñêëñêìñéèãÔÔ‹�‹€y�oz�[p�[rŽv•Ž“§‘‘©‡Ž­Ž–²�™¸ÔÎÙ̾ǠŸ·u‚™›¤ºº¹ËÜÐØÙÅÎÖº¾Ö·²Þ¾µÝÀºßľàôÞþۺ¸Ù¸±Ø¸´Ôµ´×¸¶Ò²³Ó²«Ö¸µÔµ´Ï¬¨½™˜¾˜–Ω¢ðçêñëí×ÌØÙËÒçÙßâÐÝåØäÔ¿Ò�x—�}˜³œ¹Ï¯ÇÒÄÏéâéìæì¬�¬ÆªÆÆ­ÀæÛã¤�ŸOI[[Q`[Q^€q…§œ§±¨³´¬­ž–•�v|–’™¹¯®¬œ“‹~wªŸ ª šŒ…€–���•—¢•–¶«ª´£›©žœ ”—œ‘�©œœãÓÖïæéðçêÖÁ»ñæêóíñóìñóîïõîððåèìÙØðãáéɿٳ´ãÆÈõðóöòóöòóòéëðçìðçëéÞßÊ´¶¾­­¸­°²§ª´ª³»±¹Ë¾ÃØÉÓîèìáÔÑÞÓÐÕö¡—š„€ˆ…Š—’‘‹‚€~I>>C9@C9;>9;E9;C>@@9CXIM‡vt–}y–|€£„|¼˜�Þ’¼™�ªˆ�–tjgaVGMfMVx^fƒ|€¡žŸ ›—‹~y¯�– –�K@K@6E@6G@3GC6OI@a|ˆ …�¢w‡œI@VICC>69;66>69>9;;6;C;@@@>IECK@COCKQIOhfkhhoa[fhfogck}u†ÖÎÖ×ÓÜÊÆÔ¼¼Ç´´À›Ÿ°z‰˜j}�hvŠdn‚[h…Zj„cq‘k|–ozœaoŒQ`S[~S[‚U`ƒ[j„`oŽXd‚QZwIM]OVwV]|dpŽl€ q‚¥r‡¤l†ªrŒ®p‹²w�²r‹¯u‹­o‡¤o�jvœ`j‡[]uVUlQM`OGV@>C>9@@6>E;C@9E@;C>;@E>GG>ISK]ZS[ZV[pkzZXdZXg�”®ƒ�©‚�¤��¨ƒ–¬¤µÀíêì÷ôø÷õøøõø÷õùøõù÷ôøöóöôòõðíóëæìçäè×ÑÜ·¾Ð™ª¾~Ž£y‹©}�­€�¬„“²�ª�®z�­y‹ª~‡£‘“ªÖÊÍñçâïÞØîÜÓíÔËçÆ°Ü·¢º�}œ|u’vuŽwp‰wtŽzx™ƒ‚’‰‰Š�›z�ª‰˜®š¨´œ­¼¤•}âÉšéÉ’æÃ‡æÄˆ×²wÁ q±•v¥†p‚jao[^¯“q⾃߲lÞ³uѪxnZVxyxƒ„ƒ‚}z‚zvzxw¿§ŸîäßôííóéçóëëôïðòíðóïðôðñìàÛÙ»¶îäãïååïåæäÒÐéÚÖðèéòíïòìïòìíðééñéêñéìéÚÖ’†��y€yŽ^p’]p’x�‘‰†��’ª‰“³�—°’–´ÔÈÒéÞÝɼÁ~‚ž•œ®¶­¶Ôº»Ù¹¾Û»¸ßÁÁáÿãÆÃáüß¹ßÁ¸Û½»Ùº¶Ö¸´Ö¶¯Õ³°Ò³°Ó°¬Ø»µÔ´±Å¡Ÿ»—�¹•�½�˜Ò­±äÓÔØËÔÓÀÅØÀÅðéîîäëàÎÚ�w–‡u˜¶ž¶ÓºË–|œ¸¡¶ðèîÜÐÜÔÂÖÈ­ÃØÆÓ†q‚SMdXM]UK[ZOgkZpuhu�…‰rjtXMZ’�’½®§ –•ˆxr ˜š³§ ™���‰‡ •�˜�“§ œ® –©  �—––�‘™‘‘ò¯ìáåðéëßÎÎñçéôíðöðôòéíõïóíâåñäåòäáçĸàÃÉêÛãöñôöòôõñóóëïðçìéÜÞÒÀ¿È³¸Á²¸º­¶·ª²À´¾¼²¶ÓÁÉçÚãëãåáÓÎÞÑÌÅ´¤‡ƒŒ…„’’�ŽjgdOEEE;>E9@C9>@99C9;@9@E9Ezghœ„‘vr�‡‡¥‰‚Àž–Å¡“¼“‚¥„x€c^kUU‡fnɶµÒÆÁ¯¦¤œ—™˜‘˜Šxyº—x¢`fQGMCMC;M>6E@6I@6O^]|}Š�yŠŸZavKCOC9@;69C9C>696//>69>;;C>;OCEKEISQXc^agfog`alhnfgpa^j³¥­ÎÈѾ¼Ë¬¯¿¤§µŒ”£v€”juŒdqˆ`l[gZf}dr‹hv”cv—Xd„OSlOUnKQnQ[|Vc…^h‡OVrGQpIGgMOoOUwXg�ky–t‚£q‡¥t�±lˆ¯r޳pŒ²rаt�²z‘¯l�–gxœ]j€]d~VS^MK[KGOC>I>9>@6>C>C@;C>9>C9EI@GG;GUOVXU^]X`vtzjlunnu‚�¤ƒ�§‚�§Š”§€‘© ®¯êêîöóööô÷÷õù÷ôøöô÷öóõóðóðìòäáéÜ×àÛ×áÓÌÝ´µÅ£¯ÃuŒ§vŠªzЬ}“²z�¯x�¬}Š­}�¯wŒªpƒ �Œ ÔÂÁñæáðÞÖïÞ×î×Éåï޷ž¹‘‚¤ƒp ‚rœu–}xž‚|¤Œ„’‹�ˆŽ£x�¢~‘ª„™­—§²º¥“ãÃŽãÀƒß¸zàºzŽn]vŠ—~”¦‚–ª…š§‡š©hhu׳yÖ¨fУfÀ�^¸�]“lQzut}vu|vr€vo¤‹‡ãÒÈóëêòæäïàßîàÜòêêóîïïäãçÖÓâÎËñèæôîïñëíÆª­òêêõïòõòóôðòôïñòìëñêëòêêçÝݺ¨­›Œ”�w…jt�cr‹„zvžŽ“¤•ž´¬ÂÌÁÎÜÓÙðéëìáßÝËÃ�~�º˜šÙ¼¸äÈÄåÈÅæËÉãÅ·äÈÅáÅÂÞÁÁܸ±Ø·°Ò¯ªÒ­¨Ï­ªÏ­§Ó²°Ö·²Õµ±Ï¬£Æ¤™°�„¶–�¶”“©Š…™yv�y~ä×ÔÜÐÙÜÐÖÙÆÐóïòóîóæÝä¯�ª¸˜¶Ò¾Ï•š~pŒ�t‰ÞÎÜíäêêáèÐÅ΋~�[O`XM`UGVUI]QESQIUOESC6@E6C�Ž›·§£�…„€yv•Š€¬¡ ¬ž›�…§�˜£™’˜Œ�¡“‘ ––ž���‹�“‹Œ’‰�±žœÔÄÃíãåóëïóîñòíñóìîõïòíÞàñááðàáãÀÂñäìöñöøòõõðôóíïçÖÏÓ¼¸Ï´±È´¶ÞÏÈμ¹ØÅÇÔÉÏʺÀÒÅÌëÞáòíïåØÛÜÐÐÑÁº˜“•–›¡“�•XOUG;@E>@C9@G>@G;>G>EE;@@9>O>Mžƒy�‚|˜‚~©‰ƒ³‘ŽÀŸ˜·”ްˆƒ–qzи¹äØØ×ÆÁ«�𢕖˜Œ–¡‘�½œ�Ûµ„¼�`œxXxdOjQGaMG^OaC9I@6E;3GGC^ag…x†œv‚™grŠG@[I>QI>M@9;936>9;;39>69C;@KECKCCIECMGGQKMOKQ[SXlfx‚€’«ª¼”›­‡—ªy…œk|�kx‘jt†dp„[gƒao„fo�ht�]l‰OSkC@VE@UEC`KQnQZ}UZ|KOjEG^C>UIGdKMkUd€dv’l}šnƒ¤jƒ¨hˆªnНvвv�´y”·o…«l‚ªdp‘`h|Z^kSOcIK^MIU@;@>6>@9>C9@C>@G>EK@GVUSgdf…‰‘–Ÿ¤¨ª¯¶µºÅÅËÆÆÎ�Ž¢‚�§…�ª‡‘ª��ª™¨µæåêõòõõóö÷ó÷öóøöó÷ôñõòíòïèïÛÖßÏÌÖ×ÒÛßÔâÉÅ׬³Å|‰ªvŠªyЧx�ª�®~‘¯z�ªwЦt‡§n}œyyŒË¼·ñçáðߨðßÚì×Òݼ¯ÒªœÁ›�§‰€ „}›�|š„|›‹‹�‰ŒŽ�›‚�ª}�§�ªŠš®¾ÆÏ×ÏØÌº¼Ó³ˆß¸�ß·�áÁŒ|…•z’§€•ªƒ“�€Œ‘|„�r^Q¼“g¼Œ]¾‘aÄ�]Ã�Z™uXyrq€zv€|tÛÐÈòîìõðññêèòîìôðòôñóõòòòéèðääóìíòììôíïêÙ×ìáßöóôöóõöòôöñóõñóóííÒ¶´¹™œÁ©©éáåìåçëâæâÙÜçßãíæäòíïôïòôñóõñóõñóóëì˯³·’—áÇÂèÑÎçÐÏéÔÏçËÂãÉÇàÆÃÚ¹¸Ú·¸Ú¸³Û¼´Ô²­Í©§×¶³Ô°­Ï©§Ó­§Ô²¬Ðª¨µ“‹¤�~¯Ž‹­Œ‡¥‡�†qn‚jd…lnкºàÔÜêáèèÜÞóîòôðóòìïðêìîçìÞÌל‡�ƒo†od~‚o‹Žz“ Žœ¯§©»­¬¨¤£}y}yloj]fVMVVQV]V^G9EG>M‡}‚¤š›†z‚~–’’ •�—Žˆ–Œ†›�Œ¤—•–�‘�†’ˆ…�ˆ‹†~z‹ztމ‹‘‹�œ””ι½óìïôíðóíðöñôòçêïßÞòãäêÌÈëÕÜöòõ÷òöóëíá¼¼ëÙÖØÃ¿Ê³²ÛÉÆç×ÖêÞßÖÄÈÎÃÅÙÑÔÅ»ÅÚÈÒòíïìáàßÒд²¦�¡¥¤§qojOCEG;CC;@E;@E;@I;EG@EE>EG>CUEKœxr£‚tž�t�~u«…´�‹¹”�Ì­°ÞÍÌëààÆ°®´�—ªš˜®›“Á¢�ßÁ•¯…`¤|X€]K‚[I‘cMÆ›vÚ±yÔ©uÈ ož�oo^fG>U>6KC6ESOpz†š��§q~–ck‹[]wSM`KEG@>;;9;C;>C;>C>>@;6E@>UIOcX[KEIE@CVKX]V^���€Š }‰¡n•k|˜kw�kv�dq…ap…cq†aqŽ^j‚S^�GI`CC]IIlMSqO[vS`~V^€OSvIOjOSqSUxU[x]j‚py”r}–j~›g~¡h‚¤pŠ©nбt�³qНk„ªf|ŸZf~UXgOMZQIXGEOICGC>E>9@E9@K>KMGQ][f—•�º·ºÇÄÊÙÔÛâÝääßæåâèéåëêçíƒ�£†�«…�§ƒ’¯ƒŽ§�Ÿ¦ãáèõòöõòø÷óöõóø÷óöõò÷óïóðéñ×ÔàÄÆÌÎÍÖßÖâÍÆÖ²¼Î„‘«q†¤p…¢x‹­z�¯}�ªy�­|�®v‹¤ny˜zyŽÏÁÅðèæòæãðäàðãáèÓËäÎÅÛĸ¬©¯˜–�ŽŠ�“•žš ¢™ “–£‹”°}Œª}�¨ˆ–¯ÈÈÐá×ÞÞÒÛ·¦¡Ýº‡ß·�çÈ�€y}€Ž ‡›­€�Ÿ|„…zxqg^[¤�]¶Ž^¾�^Á�]À�X¼�d€j]€voƒ|uã×ÐñìèôïðîáÞóìêõòôõðñôðñóêëòìíôîïôîîóëë߯ÀìßÝõñòöòôõòõöñôöñòóìí¸›™�ƒ�ëãäóîðóíïòêëôðòôðòõñòõðóõðóõñôõòôõðòòêèÔ¶³ÜÃÅíßÝêÖÔèÓÑéÓÐæÏÏãÆÀàÄÀÛ½ÀÛ½Áܼ¼ÙºµÖµ¬Ðª¢Ô¯ªÖµ²Ó°¥Ò®¤Ðª¦È¢—§ˆ¡‰¹›” „…�wtzdfzffƒln¹––îçëóíñêßäíãçôðóòëîòíððéíïèìÁ­¿–‚™f[yh[zcZrZK^…y„™ŠŽ’‡‹pch�zz~zzUIMgcd}zzQCSc[h�–œ¡’Œ�…‚‹…Š“‹�Š�y†zx�…}œ�‡•Œ‡—�ˆphg}ro‘ˆ‚}uu|pj‰‚ƒ�‡‰“�‘® ¤îæèóíñôîòóîñïãåñãáï×ÖéÌËóèîöòööïòܲ¬äÏÈäÐÌΰ¤ßËËçÙ×ã×ÖÛÉÎÆµ»¾¹¾Å¶ºÃ²½èÝäðæåæÕÏÖļ²¢¨¢–�œ˜–MIIG>@G;E@;@C>>E;EK>EM>CQEMjZX…jh¨‰§‰€¥‡}œ€w«Šƒ±‘ŽÐ´´ìããëáà̸¸²�–°›�µ  Ô³‘ܺ�–n}ZG…cM‹dQÉŸvØ®}åËקrÖ­yÁškŒkS|gQXOc>6G@6EE9X[^~jy–ˆ”ª…’©ƒ�žUVqMKUC@>C9@@9;E;>C@;E;>KCI†w�ËÀÀ§�–MCEOEO[Sfƒ�žw„™r„œn|�lw�lz�hvŒ`n}dn‡dqŒ`n…Vf€OZyII]IGdQSpU[‚S^�Va�Zd‚OXuMUnQX|XaƒZg†juŒu~™t~—l€›d| lƒ¥h„¦qˆ¬rŒ°k‡ªkƒ cw‘V]yOMZOGZSMZIGQGCKC;E@;CC>CK@Idfo“�–ÆÁÅÙÕßßÛáéäëíèïìèîíéïîëñðíò~‰œ€‘«‡“¯ˆ“´~ФŒ–¤ÚØÝóïôôòõõòõõò÷öòöõòöóîóïçîÓÐÝ ª¾¨®¸ÑËÐÓÉÙÉÃÓœ¦»t‡ªr„©u‹¯r‹ªx�®~�®€�±v‡ªlwšµ²¶ííïõôöõóõöôöõòôðéîìåçÞÐÏÌ¿¾Ã»¼¸¶¸¹¯¯´¯²¼´´Á¿Ä¨­¸x‰¢t„—�Ž¡ÑÏÕçÝãèÛáÔÊв šÖ¾›á»ά}‚‡’€�”w†|w|yyz|kdlVIM²‡^¼ŒZ¼ŠZ¾�cº�`¯„^og]®›ŽÙȽìßÜáÅ¿èÖÓôìíêÙÓòêçíÝÛçÕÎóêëôîíëÚØÐª¨ðççõòóõòõöñòöòóöñòâÌȺ ŸåÙÛóîññçéôííöðòöòóöòõõðòõïòôïóôðóõðòõðóòëëòìîòëììÝÜÖ¸ª×²«èÒÏâÅÆãÆÆæÎÏæÐÌãÈÇܽ¼Ý¹²àÁ·àÀ¾Ù¸¶Õ´¬È¤œÊ¥ Æ¡ž¾›�¨ˆ}¯�Š«Ž�†laoX]rfk|fd}hhšz|áÔ×ïèìðéíìâçñéïóîòîääñêìêàçìåêäÜá„rp^n€n©Ÿ©Â¶ÃȽÌÒÂÓξÑȵȖ†�vqtuor�z‚ƒ„ŠŠ‚„”Љ›™�‰‡¤†Š­ŠŒ¯†ˆ¡€��…‚‚qhn[U`UGQMCII@KKCMG>EK@Grjj‰‡}•‹�À±»êÞåõñóòëìóêìóêìíÛÝñäé÷òõòåãé×ÒáÉÈÙÈÆÞÇ¿çÚÛÖÁÃÒº¶Ç³ºÁµµ¾²¶Å¹ÁÒÃËçÙáòíñåÓÏÛÎÎÆ´´Å¾º–Ž‹KEGE>CG>EG>EG>CO>EgSU~fa}gg‚kh ª‡‚¤�x¬Š†ª‡‡¶’˜ÞÉÉìãâæÜÛÁ¬¥· �¿¤�Ò²žÕ²Ž°ƒ`’fM™lSÉ›nἂ侄çÅ�æÃŒä½ƒâºz×­tЦoÁ™g–vXycMjXOXKEIC@C6CC9V@9OQKk�ŒœŽ‘Ÿ}‹œ`d}XSd@9@>36;36>>>C;9OCE»¤©äØÜß×Ö´µ¸��¢‡ˆ›tŠo|‘ly”ov�l}�p}�fyŽhrƒ`o‡`pˆ`oˆS`yKUtGG]MUuUZ|]k’[n”cr”]l”S`€U^€S^�hpŽkt�n€›y‚�}‚œhx–cy˜fz k j~§o…¦g€£^t�`k„QO`OIVQM[OKUKK`OGSC@GE>EICEd`jÁ½ÁÜ×Ýêæìîêòïìóñîòòïóòïôòðõòðôòñôv‡¡�®„’²‡’¬†�ªŽ�±ÕÒØñíñôðôõòôôòöõòö÷òöñíòìçìÁÁÍŒ’¨Š“¥¬¬±ÒÈÔÊÃÔ¬¯¾��§t…£wˆ§r‰§vŒ«zŽ­~�­xޝkyœÍÈËññòöõö÷ô÷öôöôòõòëíëäåÜÑÓþÀ¼¶¶º¶¶º´´º·¶Á½¼ÃÀÌ£¢²q‡škz�z‹–ØÓØéÞäéßçÓÉЭŸª·­»Ð¸œá¾‡È¥�…†ƒ…‡vvxrwv]]cfQKˆo]¼’a“dÀŽ]¾Ž]¾�^²Šh`[[zxurry¹¢œóêæóêæóçæêÓËê×ÏåÒÍéÙÐñæàóëéÝżʪœóëìöòòöòóöòó÷òóöòòˬ¡ëãáõñóõñóòèèóëì÷óôöòô÷òôöñóôïñõðñõñóõññõðòÛþʩ áû¾”�Æ¡œáǼæÌÉçÐÎéÓÐãÇÀáÃÁáÇÃÚ¶³ß¿¶âÄÀá¸ֲªÏ« ¿œœ¾š”½›”£ƒ€œƒy™|ˆptx`]wfcyhcwadw``‚ffx`a‰ckìäèêáéïèíðêîéààä×Ûá×ØÃ·½À²¼âÐÛîæííãëçÛèÙÌÜÓÄ×ͽÌŰǼ©À¡–ª‡ž„~žˆ�ž„|œ‚‚ ‰†¢‹…¥ŒŒ¨�‹§’‘­—Œ«˜‹¡ˆ}‰nfp^ZaSIUMEMMEQOIOOEMSGMUGKoajxyŠ‚€°�£éÜãöñôóìëòééôìîöðó÷òõñåæßÇÃè×ÒÜÁ¼Ô¾¼ÙÅÆÜÎÏÖÅÈÐÀ¼Ì»ºÅ¸¿Å¸¼×ÁËóìñóïñæØÚãÐÐçØÙ×ǾaSSQEIKCIE@@I>>p[[†qgŒthƒng†kfŒqr”wo¢€x¤‚|¥‚€Å ¡ÞÆÆîççÜÍÇ˸¸¹¥¡É«›Ô´—Ú¯}Å�aÆ”cÑ kä¼€éÈ’ìÏœêÊ“êÉ”çÄ�ãº}Û¬täÀŽÏ¤wÇ›gŒnQkUIgQEaQEZOC`QE^QCSGGG@E>6EE;UKGg|ƒœ‰‘§‚‘¨dfSIVOIcMK]‹ˆŽ»­¯ÞÏÔàÓÖÙÎÅ¡�™}~Žnq}lq}hp~jq€nw‡lzˆkv�lwŠhr†fw�crŠ]o†S[xMUpGG^KIfQUvXf†Uf‰[lŠ]jŠQ^O[}X`|anˆhr�o|•z}�z�”akˆ[p“]q–awœnƒ¨k‚ ax�]j†S^qOGUMGOOIXQO]MOcKKUGEOEEKMIM¸­±çáéîêïòïôòðôòðõòïôòðóñïóñîóñîóñïóq�œvˆ©w†ª…“¯…�ª–¡³ÕÒÙñìòôðôõñõôñöõñõöòõñìñèâè´´¼“–«�‘¥– ¯Á½Éý˯­¾‡‘¤w‡¤u…¤xŒ¨v‹¨wŒ«~�«v‹­hv–¼¾ðïñõõ÷÷õ÷÷ô÷õñôñéìëäèÝÒÕ¾¼Á½¸¶¼¸¸¿¸º½¸¹ÅÁÆ»»È”›±p~�huŒ€�–ÝÕÙìãæëáéÏÇ̲ª»À¶ÁÏÄÅÙ»�ܻз˜}vtxhfg`XZaOI¦„`¸�f¾“a“dÄ”c‘a¼�cžz[fhhuttlno¾©§òèæòçåòçåñâÞîßÚçÐÎê×ÍïäáòéçÛÀ´Ì¬¤óêéöòò÷òòöòó÷ñóõððä¡ñììöñòõðòîßßóìí÷óôöòõöòõöñóõðòöñóõñòõððõïòÛþäŸßÁ½àŽáûåÉÄäÈÁçÌÉçÍÉß¿¾Û¼¶ÝÀ¶Þ¾¸áüâú߾¹Ô­¤ÈŸ”±�Œ´�޲��›z�xn‹yv„qt}jj�lotc]kXVo[^u]Z]MMfMUÙÌÐÝÒÖäÛâãØÝßÔÖÜÑÔÓÆÎÁ±ÁÖÅÐðçïñéððæðëßëÝÏàØÆØÈ¶Èµ§»¨™²–Ч‰£Ž‚£‰ƒ¤‡‚Ÿ…„¦…ƒ¤’Šª’‹§–�¯›�¬¢–¯ž�ª’‡“tpxc``SKUMCIM@MMGOVIMVGM[MX^SXncfˆ€|±›¥ëáçõñóôîðôíïõîñ÷òöõðñé×ÒâÌÅßɾÖÁ¸ÝÉÉãÓÎÛËÊØÊÇÆµ´ÖÆÈ̽¿ÐÁÇìàåõïòóíï娨ìãäéßÝ’thZIOOEGKCGG@>]IM�rh‹qoŒpq„nfŽqo‘wu–|r¤‡�¤†ƒº”šêÜÛðçåáÔÒÀ§¡º¤¡É­™à¼–߸‡Ô¥o׫uÛ­pã¸~ëË–íÍ—íÍ™éÇ�éÆ�æÁŒÜ°xÛ«wèȘ‘]ª€Q„gMrZGo]Mj]K`QEcOE^OCaOIZMGICKC6MC9SQIk‚‹ …”­~†™XUjQMfKIU|y€­¡¤ÙÈÌÛÌÅÏÁ¶¤––|zhnzahtjkpdlvhqku†lt„ht‡cp‡cpŠcrŒco‰V^qOSqGGXGG]KKhUX}S^zVc^j‰V^…OXvSVxX^}`j�nw–v|Žwy…`g�ZlŽ]qŽcr˜l~¤k„§ct™]h†SVoOEUQK]OI[US`USdSO^OKVMIQZV`ÊÀËìéïðîòòñõòñôððõðîóðîòñîòñîôïîóñïôah„fr�ht’n~—y‡ –�«ÐËÓðêðóïó÷ñõõòöõðôõïóëæìÝØà¥©´ƒ�§‰�¢ˆ’ – ­ ¦²¢Ÿ¤}‰ r€”n…�vŠ©zŽ©~�«�’§Œ¥lv–�—Ÿêéé÷õø÷ô÷÷õõõñôñéììåçÞÔÖÎÂÈɽÀÅ¿ÁÉÁÁÉÃÃËÆÉ¸¶ÃŠ“ªhz�lyŠ›§«æÜãïåëíäéÏÈÎüÇÕÍÖèáèçàåϼ¯ÙÀ¢Õ¯|Ô¬nÙ²zÇ›f¹Ž]¸Š]À�`Á–gÀ’`Ôh»ŽdvZUquvuwz|}€ëàÝóííóìêóëëóìêóïïöñòòèåñåãñçäÙº¯Í©¦õîíöòòõñóõððöðòôëì¹–”ôïñöñóóîïíÞÜõðòöòõõòòõñòöñóõðòõñòôïîôîïôïðÀ¤¢½˜‘Ùµ­Ù´ªÚ¶­Ü¶§Ýº²ß¼®Ù·±Ö²®áý۹µÞ¿ºÞÀ¶Ûº«Ðª¤Ä�“¸�|±�‰­‹�§‡�•wt„rnˆohhfu`dv]ccVSVGIVGMSCEI@@K>CM@CO@EUEGt[kÅ®ÀæØãèßçñëðòíòóìòòêòñéñîáìãÔáÕÅÔ´ ¹–�«•Ѝ�†§�‡¨�ˆª‰ˆ§Œ‹¦††§–Ž©�‹ª›’©¢–®œ‘§¬—¯«›¯¤� …}‹towXQUQGIOGOSIOcS^gSShVao]cn]`‡vwµŸ«ïæëôïñóìïõîðöòõôëëðäßîããèÙÚèÛÛáÏÎÖÃÂν¼Íº¿ÏÀÅÒÀ¿Ò¾ÂéØáòêîôîñôíñòìíàÐÉ”uny]ZaOMUIIICEQEE�pjš}w�pl�qa�rn‹ok–vo‘tn–|¿�¤ßÌÎìåä×ÈÆÈµ¬¿£™Ð¯—àÀ§â¸€ß´|㹅㺂éÊêÊ’ìË”íПëÈ�çÀ‡å¼~ã¸y㺃êÉ—ëÈ“èÉǜc§U“rSƒhQ€cIr`KaUIfSEcQE`OCZQE`QGZMGI>C@6QE;XXVp‰“§Œ’¤y„–OK[`]fzx~¶§¤É¯§Æ¦¡¸–�…uxfcaQOSXSZVS]]^khktdjuajw^kƒfq‹aqˆgq‰Zc|S[uECS@;KC@VCC`GI^KOhSVqSZwMSpGMhKO]U[phn†ppƒgjyX`~Zg…[jŽct™gwœjx cr’U`vSVdG@OKGMUO^SOcVZj[VdSQcVOZwv~âØÞñîóóñõòñõòðôñðôñîóðíòðíòïíòïìððíñVXtU[qU^z[c~co„y‰œÉÀÈéãëïëíõîóòïóòíòñêðçßç×ÐÜž§¸…�¢…Œ�„ŒŸ‹�§ƒ�§‰� uy‡lz’o~”x‰£~�¦}Ž«‚�®|ޝn}››”™ëéèöö÷÷ôö÷õööñôóíñðéíàÖÜÐÈËÍÅÆÌÈÈÎÉÌÏÉÏÐÌÌ—š­�ˆ™q|�w†–©²²ìåìòêïïçíÌÈÊÌÈÐÝÖÝíæéïèìÙÜåÁÎÛÇÂÁÙ¸‹Ù¯wÛ´zÌŸhÅ–a¹Ž`¼‘d»�cÀ’`ˆkUUIItv|†�¬”Šê×Ìïâàòèçðæåíâàòëéóìëé×ÎïåãðçãÙÀ¶½–ŒðàÙõíìôííôíîôëêîßÛ´’Žôððõïïðçåðçæõðñöòóôñòôðñõïðôïðóîîóííõîïóìí¼ •¸š’Ë –Ô­¤Ö¯¡Ö°ªÎ¦”Æœ�¾‘ˆª~vº‡Äœ‘Ь¤Ð¬ Ê¤•º”‹­Šw¥‚x«�‹§‚x¡�yƒokjXVfVUcMOXKOSEIE@;I>CK;@G;>E9>E;@K>GqXg¤‡œëãéòìòòíòòíòòìòòìòñêððéñðèðëÞèÙÇÓŶǠ•¬�Œ¬Ž‹±“‰­�ˆ§‹Š¦�‰§ˆˆª��®œ’¯ž”±£•° •¬£”ª±›§²œ­­™®›ˆ›Š|…h]^[OS`SVcQXp[dt[gt`g|hlwho�nv£‹“ÜÇÐôíòöñô÷óöôìîðåæìÞßáÌËÙÄÆ×ÅÉÓ¿Âμ¿Ì¼¿ÛÈÉØÅËåÔ×ñèëõïòôïòîäáÁ –Ÿxnt[ZkVQdQOXKIUGIUEK–zy ~u™|w‘vw�pg‰lj�ppœ~€¨‚‚æØÕæÜØÚÇ¿¿¦žÆ§“Ô´›â½�澉çÁ�羄êÁ†êÆ–ëÇ�íË“ìË’ì̔翀æ»áµz廀ç½|éÆŽéÆ�çŠèÃ�Û´€É¢k§ƒ^�cMw[Gj[I^O@[O@]KCcQGZQE`QGdSIdVGKC@@9IC;XKEc†Ž¢Œ•§w„�KCXMIZŠv}ÅšŸË šÅ�•}ldXOOMCIMCEI@@OGIVS]XXhX[gZduco†coŠjv‘^k�Q^tEEZ@6G@9IC>dEC^IIfKKcGMoGKpGIZKKgSUp`cufcv^[k[XkS[~Vg�]l‘crœgv™ZhƒOUpMK]G@MQIUOK]VUk^Xg]UgXU`chr¦Ÿ¬êãêñðóóòõóòôòñõòðôòðôòðóñïóïëñîëðîëñUUoX[xVZw]^w]hƒu…–ÇÂÉéãêîéîõíòðëïðêïíæìåÜàÕÊÙ¢¡´ˆœ‡�€ˆŸ‡ |… z�—or‡ltˆr€“ƒŒ¢ƒ�¨}ލƒ�¯z�¬ly”�ˆŠåáÞöõ÷öô÷÷ô÷öòõõðóòíðåÛãÔËÉÎÉÉÎÆÉÕÏÏÓÎÑÌÇË‹˜­€�§tƒ˜ŒŸ­µºíèîóíðñéíÔÎÒÔÊÐãÙâîæìïèíßßåÐÛå¾ÉÖËÀ²Õ¸‘Û³~×­tФo»Žd¼�[¸Ž[œv[UGG[Zh‚�ƒ¼¤˜á˺òäÛîÝÖðäßëÜÖéÙÑêÝÖëÞØÛÁ¸íàÝñæäÞŶÀ›�òéçôîíôìêòêêòæàìÜ×±•�óîîóëèêÝÜòëéõðñõðñóïðôîíôïñóìíóìëóíëóîïóìíÊ´²­�|Í£˜Ñª�ÒªœÌ ‘°‹}§}u™tk�ng²�†¸’ˆ»”‚¶�¶�¤€w ~q¤u—�x™q™~w�jgXKMQEKVGEI>CG6@E;>G99G;@G9;I;@G;CjQf̶ÄèßæòìñòëòòìñóëòñëñòëòñêñïèðîåðèÛæÌÀϳ§¸™‘¬“�°’‹¨–ޝ�ˆ§��¬‹‡¢’†¤’Šª�’¯¥—¯¦—ª¡”¨¨•©¯™¨´�­±—¬¤’¥�ƒ‘tjthV[kX[kV^q[dv^fu`f|ghxgl‚nzŸŒ–Ë­­ôîñöòô÷òõñãäìÞâêÙÝèÙ×ìàãêÜáèÜÞèÛßéÞàìâäðçëóìïõðòóëìëàݺ•‹�a^|^[kVUcSK]OOSEIaOU€cd±‘Ч‚v¥u�pf„ja…lh–yzâªßÌÏçÝÜÉ´®¾¦£À¦˜Ýº›èÉ à·}七êÄŒéÁ…ìÉ”ìÊ™íÉ�íÍ–íÌ“éÄ‹åÀ�á´|亇êÉ–éÅ�éÈ–èĎ濈佇۲~Õ©r¸�c’tVuZGjXI`MC`QG^OCcQGXK@aQEXQIXOCZQMI>MC;O@9Ikk‚‰�ž‡�”QK^KCV~lwۛˡ£Àœ�rgcSIOG@EI>>K@EK@EQMSQQ^SSaXa|co†fqŠjw�`j}S^|ECV>6G@;QGElIKlIKhIKaGIdGIhIIfMMnUXyah[[g[SZXUjX]~U`ƒ[l�cl�cq•VdQUgKKVOGVQK^VQcXQa[S`[S`XSaxw„´«¹ìåëñðôòòõóñôòñõóðôòíòòíñòíòïëñêæëëçíOShX]r[`ycj…`h|w†•ÌÆÎëãëîèíòëðìäéçßåÝÖÝÚÏ×ÏÄϧ£¶‚Š |†–u}�pw‘oy�jv•]j}an�u~‘‚� Š“­ƒ�ª|Œ§x†œly�|u‚ÙÖÕöôöõóööóõöòôòìïïéîá×ÝÞÖØÙÑÒÏÉÏÊÁÁÍÀ¶³½…“­‹‘¤ƒ�§›¥¸¾ÅÎïëïôîòòìñáÚÛÔÉÏßÔÜëäêëãéÝÖßÚßéÐÚæ®ÃÓ¦¸È ¢¨ª”~¶›y�tcQGGVMSnng‚ƒ|Œ‚xÈ« ðáÛòãÝñàÜîØÏíÕÉÞº«Ãœ‘Ʀ˜·‘—и¸éÙÕç×ËâÎø–ŠëÛÓñåàñåäðäÞñæáîÞ×­�ˆóíìôíëéÖÌóíìóíîôîíñéèòëëóííóíîòëëíãàñèæïæåàÔÔšxn¾š�Áœ‹­…} xr‡h^‘uo—xj°Ž}¶‘ƒ±�~�~r�n^ˆojv[S‚og�}qxfX‚pl†unk]`G>C@9;E;>@9;C3>@;;E9;G9;K>EŒq�Áª¿ìåìòëñòëñòíñòëðòëññêïïéððèðïçíîäíêÞèÞÌØ²©Ãž˜²¢ž¸£ž¾­¤¿®§¼¦ž¶ –«•‹¦™‹ ™�¦�”­¥˜±§—´§—¯ª•¦¯—¢±—¡¶ «°•§§‘œ�}‰€pq|lpqdj}hj}hnyhk~dg�pkž‘�μ­ÙµïãßõñóöñóõðòöðòõðóôíñôîòõîòôîïõïñõïòõðòòëëìàÝÀ¡–…d^rVSpZZoZXlVQcSQZKI^MS–wxÃ¤š¾œ‘¯‹‚¤ƒx–wnŒlh�uq¢€�àÐÐÜËÆÏ¹²ºŸ�À¢�̪šéÈšíÌ–ìË”éÅ�漆ëË›ìÉ�íË’íÌ—ìÊ�éÄ�濊â´xæÃ�èˆèÆéÅŽéÆ’ã»�Õ¤lØ©pÚ­vجyÚ­|Êœfª�[—xUp]KcO@dQCfQE`OG[MCcUE]ME^MCfSEfUGXOGC9GE;O]Zr��›ƒ‰–XXrh^q¼‘•Æ–’º‘‡pc]MCIE;CC;>G>@E;;ECCMGVMO[[dƒduŽfw‘hy–[nƒO^}E@SC;OKG^VZxS]~SXwKKgGEdGIhOVxSVw[`~^fzVQZOIS]ShZXqVZyVa‡Va�Zd�OUhOMfMGZMCXVMXVOXVOSUQ[ZQ`k]c¤™—ź¼îéïòñõóòöóòôòðõòðôòîóñíóîéðæáéßÝãÛ×ßX`zVay[cz[h~^kn}�ÆÆÌéßçêâéîæìèÞçßÖáÏÅÐÁºÅ¹²¼¦ µ„‡Ÿx�œ`dvV]rV`wQXrSVpX[klrƒ…‹�‚� |ˆ£u† yˆ¤kw•qn�ɽºõôö÷õ÷öõööòôñêîîçéÞ××ÜÓØÜÒÒÜÔÔÜ×Ü×ÐÕ™š¯ˆ“§†–®’œ´£­»ÎÐÕòíðõñôöñôìåêÒÅÉÐÄÊÙÌÒÖËÒȾÅÀÀÇË×ã¾ÐÞ¶ËÚ±È×®ÂÒ¾ÌØ·ÀÍ��’‡…ƒ’�‚£‘ŽÉ®¢ðáØòàØòáØñÞØëÐÄäÁ´·‹¾ –íæäôîíïåâæÐÆçÖÒåÔÌÜŷ׺ªãÎÀâ˾׸¤Ù¹­Ö¸­–wtîåÞðæÛßɹßÌÄæ×ÊèÜÒêÝÓíãÜîâÜðéæñêéèÝÔíáÜëÞÖæÛÑ®—‹–}w¹–‰®‹y¦‚vªˆw¬‰|¬‰z£€nž|n ~u™wl�th�rhƒpk}kht`^q`Xj[ZkcXVIKC99>99@96E9@E6>I@E[MQh]^š�‰×ÎÕäØáîåíðéïòêðòìññëððêïïçîíåíìäììãíêßêæÖãÕÆÚ°ªÅ²©Á¿µÎɺÎË»ÑκÐȴɺ­Á§š­—�§Ÿ�¯¥—­¦–­¨–««—ª±›Ÿµ‘™³š�¶›¤¸�ª²œ§œ‹”Œ|v‹|v…vy‚ql�oq€jn��z® �ÞɶíÜÎïàÖñãÖôîîöñóöðóõïóõðòôîòôîñõïñòììíäâåÖΰ’Œt]ZjUQ`OMdQQfSQgUUfSSaQSy[`¿�›Ñ¶²Ö¸°Ê© Á �±�‚ª‡� u‰fhÛÇÅéÝ×Ç­¢´œ�º��È¡�éÈšìÊ’ìÊ�îÏ›ïΔîÌ•ëË–êÈ�ëÊŽìÈ“èŠ廃罀è‰êÉæÁŒæÀ„澄âµyá¶xܱ}Û­oÜ®zÔ§qÏ¡oËžh•a­‚Z¢zZ”tS~aKaSGaOE`SE[O@`O@hSGhXIfOGdUIdUEQGE@6CC6KqwЇ��‚�šKCX¥€ˆ»�ޏ�‡xa[SGME;>@;>@99E;>C>>KI[QQd^h�fuˆhz–gw”[l‡S]|C@VCCZKMhV^‡U[zOXvII`KInKOoMUpU]wX]w[[xUOXICISKXXSgUSgX[tUUpXXqMOgIEVMGVSG^QM]UM[UMV]SZg]`ZQX¢œ©ÔËÕðìòòñôòòõòðôóðõòðôñïòïëïêæêÚÓÛ×ÐÙÒËÒfk‹ao‡fq�dl†^j€gt‡´¸ÀçÝâéÞåëãçáÙßßÓßÌÃϸ­º±§´§ ³‰„–‚€“`a}SUoSVoSSlQQfUZpdoƒ~�–�‹�w„¡w‡œq… jx”hg~¸±³õôö÷ô÷öôöõòôðëïíåèÝÕÜÛÓÖÙÓ×ÝÓØßÕØÙÎÔ‘–¬„�¤‡“ª�›´ª´ÀÍÏÒòîòöñôöòôñêìÝÔÔÓÉÍÖÉÎÏÉÏËÄÎÆÃÏÙàéÄÓßµÊÙ¹ËÜÇÕßÖÞäÒÜå­³¾�˜š�‘‰Í²©çÐÀòäÜòá×ñߨïÙÔäÁµÚ²¡¡}r¥‚rÚÄ·òèæìàØÙ¾±ÙƺæÙÒäÒÊäÐÉ߯ºßƳÜijßȾáÎÅÀ¢œä×ÏïãÙßɸ•~v°ž�̺­ÞÏÇèÞÖêÜÔîåáðèåÚÉÃéÜÒäÓÀáÓÉÏÀ°©Š€¸”†¥t }p�vdœykŸyj�qaˆlf‰hdˆkdx^[x^ZlVQ`SU`OSVKIK@EQEII;CC>9C99E99G;CU>Mq[d€ot‚qt‰…„Àº»ÔÉÊêàèîæìðéïñëððèððèïïæîìåìíäììàëéÝçåÕßÑÃÓº²ÇÀµÊÐÀ×ÔÈÛØÈÛØÆÜÐ¼ÒÆ¸Ì­£¼¤–«©˜²ª˜²¯�²­–¬²›²¬– ·š�²–—¶œ¥· «³¢ª¤’˜�†ƒ”…‰‰~w‹x�tvƒrp­ž‹Ñ»¤ìÛÍòåÙòçÞòçàõðòöñóõñôõðóõðòôïòóìîïæåßÎÉŬ¤ª�‡^KMVKM]QQ`MMfQQ^QQ`QShUXoUZ¾œ›ÝüÛÀ»Ùº­Ì¬£Ã£›º˜Ž§ˆ€—yvº‘“èÙÒ׺º¢’´šŒ¸–‡ã½“íÏ�îÏœíÍ–ïϘïЙïÔ§íΙêÈ�é‡èÁ‡æ½„æÀ†êÅŒêÅ�éÎ澄伄ã¸|à²qß±pݵ€Û®vاnФpËšdÆ—a¸ŒcœxS‹nOv[KuaIgSEaM>^KEfQ@dM>gQEgSCgUIcSGfVGfSKG;MC6MQM^ˆ‹”†��`g�gq´Œ�¹Œ‚~g]ZKG@9>E9>@99@9;C>CKGSQQcZd‚du�dw”ky™Xd�S]|ECVE@XKIcQV}S]~OZxIIdKKkMOoSZqUXtQUpVUnQKOKCGOEKXM[XUgXVoSMkUSoKG[ICXKEVSIVQO`SQaQIQUKVUOUXOZ¢› ×ËÓïëðòñôóòõòðôóðõòïóñïôîëïêæéß×âÝÖàÕÐØy…¤uƒ£z‡¥„Ц€ˆ¤x�œ�›¨ÖÐÚßÖßàÕßÙËÒÚÉÐÕÅÔÒÃÑ˽̾­¶ ™­˜•¨€~˜pr�glˆfj€^c…doŠ`k„oyˆp|‹w€”v‚–r†�lzšdg�š‘—ôóõöóööóôõðòìãçéáåÜÑÒØÌÏÚÌÏÛÔÔÙÓÔÆÀÈ…Œ €Ž£…�ª�™°¢²ÃÏÒØòíñ÷òõ÷òõõñóñêðïêïìäéêäèëáæèàçßßçÙáéÎØåÁÓß¿Ñß¿ÌÙ¡±ÁŽœª�–˜Ê´­ðàÙòãßñàÛñÝÒî×Ì༪ŗ„¹’…§„xˆlg†kdžxrº �“rfxcU³�‘®Ž~ÚÁ±Óº£Î´¤à̾åÓÊæÔÊàÕί ˜Éµ ÙůwhaSGEVKIzk[ŽxjÀ­�űŸÒ¾¨ÓƵ¤�€¼©™ †tÆ·§¼­¡}g]|a^jVVdSKu]Sq[UkUOfSOdOIkVSyd]gSQG9;C6;>66E99K;>O>@`IO‚^^˜rq§Šv�~t�pnzorqgftkk|w}ˆ‚€�–•ÆÁÁà×ÞæÜãìâèîåìîåíîåîëáëëßèèÛçäÖàÜÉ×;ÎË¿ÔÑÅÖàÑÞãÖåá×äÞÏÝ×ÃÖɷɳ¦¸¬�¶­™²²š§´ž«­–¤°–£°–¢´˜ ´˜œµ™¡¹ž§´�¥®™¡Ÿ’–ž’”˜Œƒ“‡ˆ–ˆ„—�‚ÝǰëÙÃóéäõîëôíêôððöòôöòóõñóôîððççÜÀ¶Ì±¤Å¬¢¸¨œ´¡’©•ƒf`^VKMZMK[OM]MK^QOfSUÁœŽÙ»­àöۺ´Û¼¶Ó°¦Ë©”Æ¢›·—ˆ‹op¸•œêßׯª–Á¨‘±�xݶ†ëË›îМñÒœðÕ¤ïÓ¡ïИïЙîÏœêȕ㻃ҠtëÈ”êÆ‹éÅ�éÁƒæ½…á¶yീàµ|á¶~ܱwÜ®rÙªnÓ¥tÓ¦uРlÄ–d¹�d¡|SxaKlVGaOC^OE`K>`G>hQE^O@`I;kUK^M@`M@aOCaQCfSI`SGSGE@;Gjgz�Š›�Œ”^`wpXj«ƒ~ƒdaaOOC9;>99C9;G;;ICCIIZQQdZc|`qŒfu’lu—]k„U^tGI]C@OECVGEaIIcIG]C@UOQnSVpU]xS[rSZrSQ`SKVKEKSEIZO]XQdVQhSIcQI^KGZICQMG[OK`XUnUOc^V^UIMUOUVOUŸš¢ÔÌÕîêñóñôòòõóñõóñõòðóòîóñíòïëïîèïëçîçáç�¤ƒ‘­„•®‹—¯�—°Ž’¯‹“§Æ¾ÈÛÎÛçÙâãÙàáÚâãÛßãÛáãØàÛÒØÆÃнºÃ©ª¾¢Ÿ´•’¨ƒ˜r|—nq‹aq‡gq…lx„q}’pz’o€–n~œlrŽŸ”œôóôöóö÷ôöôïòìåëçßåÙÏÔÛÍÊÝÒÐàÔÒÕÌÏ«£¬y|’t’y�”‚‡—¥¯´ËÏÒóïò÷óõ÷óö÷ô÷÷òö÷óõöñóõðóôïóôîòïêïÞáêàæíÇÓàËÛåË×㩾ÎÖÖÛßÔÖñáÞòãÝòàÛðÜÑèÆ¸ß·¨ÖªžÃ™�®„t‹k`x`Uq`VvZVu[SqVQnVUlSMvXVtXUx^Xv[U„k]�hŸn��n}j]©”†}lZvj[|pdogVl[OjXOhZMfVKfVKdVOl]ShXMo]KnaUudV‹xjrdXh^Sj[V[QVQEIKCIOGGOCGK>@OEMSGMSKZ^V`rggœ�…Á«™Â©–̯šÌ«•ɪ˜ª�€xlgnafka`offtlkqu}zx~yx‚‡‡�  º¶º×Î×åÝäèÞèëàééßèéÝçäÖãÝÌÝÓÃ×É¿Î×ÉÕÞÏàåÖáå×åâÓäÙÉ×ɼǻ®Á¤˜¬­œ¯± ´¸�¡µœ©µ›¡±“šµ–›²”š³’‹µ— º¡¯·Ÿª´ ª¬Ÿ¤¤˜˜Ÿ—�˜“Ž˜�ˆ´ª–ëÜÎñçâõíêõîêõíçöóõöñòòéêçÔÐÝÆ¾Õ¾²Ð¹°Ì±¡Ä¬¡„ur¢‘„¨–†xojSMKZMQ[KK[MI]SSº•ŽÜ¹­Û¸²Ù¸µÕ´ªÕµ±Î°¥Æ¥›³–ЇlgÜÉÉïæãв›Á¤„©�tฆêÇŽêÇ�ðÓ ñÕ¥ïÒœîÓ¢îÑŸëɗ滂éÅŒëÈŠæÁˆéÅ�èÁˆåº�乀仂à¸ݱwܯrÜ­pÚ¯tÙ«pÖ©tÔ¤qÒ¢lÊœa·�]ªU‚fKdOC`O@]MG[M@ZI>[I>[G@`M>aK>[K>]M>SG>ZME]SG[I@hQEjZMICGC9IOG`…�š‡Œqwˆ�gqp[[]MO@9;C6;E9;@69C@>KGUOSkZd„ct�dv’cu–^lŠXf‚KQlGEVE@UE@ZCEVEEXMMaV`~^jˆ^k…`gz`h~^cv]ZjZQ^OEGSKQSM]SM]QGcOGXI@QMGVQIVSMcUQaVVnQMXUKSSISSOV›��ÒÇÉïêðòðóóòôôñôóñõóñõôðôóðòóðôòïôïëñêæë€�¥‡“­‡”©�›²�š¸�—¶†Ž¢¼·½×ÍÕëàççÞäåÞåçßãêäéêáèéÞäÝÖÞÔÎØÉÃÒ·±Àª£°�—­€‰ z�›lx�ju†guƒox‘pwŒkxŽp~šru”š�žôòôöóööóõôïòìåèëãäÛÌÍÜÐÏÞÔÕáÙ×ÍÅÉ–“§twˆlr„quƒx~Žœ£¨ÎÏÐóîò÷óôøòöøó÷øóö÷óö÷ôööòõõðôõðóòìñàäëèêïÝáêÅÔâÏÜç¸È×àÐÒêÖÎòåàñäßñßÚêÏÉ㼪๤ԩ–·�€ zncVt]ZnXQvUOvZSwXSlSQlSQuVUrZU…`Ux]X|gXy`Mx^KfVKaOGqVMp[K€o`€paxlXp^VhZOfZK^SI`QMaUIfXQdSIkXKrdUhXÀª“ynZvkX}td�yf`o``nhjvffx`ao`]k^crcdtztt�}®š�¼¢–·¡–Ȩ—ƨ’À¢Ž Š|qggjcfj]]pckxjn€tu~~‚‚‚†�€‚†�’•—¼º¿ÙÏÔáÖßçÜæèÜçæÙæàÒàØÈÛÒÂÕ;Ï×ÈØÞÐßåÙä娿áÓãØÉÖÁµÈ·¬¿§›´¯›§²�­´Ÿ©ºœ«µ—�´’˜²”œ°‘�³’–´–¡·œ¥¶ ¥¹¤­¬ž¢§ž�Ÿ–ŠŸ–“—��Ƹ¥ïãÔóêäõíéõíéôìæöòõïäáîàÛïáâÝÊ¿ÖüÜÉÄÔžλ¸’†‡Œ|oŸ”�†|uSKMXMG[QO[MI`OQ˧›Ù¶­Ù¶¦Ù¸´Ö¶«×¸´Ë©�´•‡œ|o†gnîåäéÜÎÉ©ˆ¢‹r¦y`ëÈ�ìÌ–ëÉŽðÔ¤ðÓ îМëÉ�èÉ澆éÅ�ìÉ”êňåÀ‰á¶„仂仅ã¶|㺂ܮwÜ®uݯqÚ­rÓ¤kÓ¤jÓ¤oТoÑ nË£t¶�cŸ}XoZI`MCaQK]KGZK>]K>XG;ZG>ZK>ZK>[ME]OCUI>aMC]QEZKG^OGgVIXQE@9E@9Cx~Š„�„�`S`fQZSGG@99C9;C6;C9;G@>KIUQUp^g~goŠct�drŽ`n†Xh‚QXqIMcIIZEE[IGaIK[SVn^h€gr…ju‹jq�hq‰fk�dcuZX`I@EOEGOEOSKUSI`MEXICOMG[OKdSKaSOcXUgQKXQIQVKVVMXž“™ÒÆËïêðòðôóñöôòõôòõôòõóòõôòôóñõóðõîìñçä犔­ˆ–±‹–¯�œ¹’œº‹”¨v~–¤§«ËÈÆìåêðéïðêïñëðóìñóíòóîòòëðïçéåÜæÑÈÖÆÁΜ£ºƒ�ªЦv�–lx’htˆfn‚fpŠdpˆgtŽlr’—�¡óïîòæãïÝ×ãÊÅÕÃÆÒ¿¼ÔÃÁÙËÍÞÐÑàÖÕ¼°¸y|“hdv^Zgc[^f^^—šŒÑÑÌõïòøóõùó÷øô÷øôöøô÷øôö÷óõöðôõïóòíðäåëâåëðïôÝàêÃÏÞÖÓÖïÜÕòáÛòæàïÛÍí×ÏçÆ´Ý¶¢Ð¦•¸’‚–ujˆkdz^^tZQnVOpVXu]XqXSoXVnSOpQKlVKrVMv[O‚fOaME[ICfXKo^Op[IrdQt`OvaSr]Oo^Mk[OgZMaQGcQKfVQh^OoaOo]Vo^MqcS ‰txgUtk]zn^ƒxhywz[`v]]p[]gUSfSS^ZVadcj„€’‰ƒª•Š®›’±��ºœ‘¹œ‡ª“†Ž€|qkqldnlhgod`vll~tq€}�~�ƒ}€ˆ€€ƒ‚‚‡‚ˆŒª§¦À¶½ÝÎ×àÑÜßÓàÛÎÜÒÃÒÒÅÖÖÈÖÚËÚàÔãåØäâÓßÚËÛÒÀϽ¯Ã¯¢¶ª˜ª°š«µœ¯º ªÂ «¶œ ²•’¥ˆŒ¯•™°’™²•›¶››´œ¤¼¥²²Ÿ¦« ¨¡š–œ–�ž˜ŒÝ̸òçÛôìæõíéôìåôëåïåàåÒ½òëëöòõìåéîçëîæææÞâáÜÜÐÀÀ§˜”¤‘Œ¡’‰VOMVIG[MG[GEhQQÒ¦—Õ¬ Ó«ŸÓ¯¨Ð¬žÎ§–´�ƒŠngoV]åÕÒáÆ°Ïª€˜vVº�[㼇îÒ›ìΚéÅ�ìÈŽíÌ–êÆ�çÀ„ëÌ�êÇ“éÈ羃潅å»}Û­tÔ§q⸂ä´|ã·ã¼…Þ²vÙ®wÔ§nשpÖ¨tÖ©vתvתrÀ”a}]CgSEcOE^MC[OE]MCXG;[I>ZI>[G@VM@[K>^MEZO@[ME[OEXOCaOC]I@`I@`QCE;>C6EG>Mz‚’|ƒ�t‡KCQE>C>99@93C6;C9>E@GQO`SVjak…dw�gy•hw�gy‘hx“Zh…[g~V^xXa„Vd‚Zf|do‚kx”p|“q€—v–wƒžw�–jnZZ`E;>E>CG@EKEMQGXQGXIEXIEUMGXUQaUUkZUhUOZQKUSKQUOX§œ§ÑÅÎîéïñïòòðôóñõôñõôòõôòöõòõôòöóñõìêîäÞ㈓­�™´�š´”¡¸�𳇓¬pv��œ¡ÉÈÊñêïóïòõðóõðôõðóõðóôðóôðóóîñïçìãÙäØÍب­½Š“­€‹ªx„žny�kt‡cj�`ddl~fp‰gk~ˆ‡”ìÝØí×ÌèÈ´Öªš·‡z¯ƒt³Œ¾“€À��˸®£— oky[UdXMV]MO`UV¤¥–ÚÕÑôðòøóõùó÷øôøøôöøóö÷óô÷òõöðôõðóòëïÜ×àÓÔßðíñôðóñéíïÜÓñâÜóäÞî×ÑìÕÌíÔÉã»§¿�~¶‰w™xk„d]x]Zu]ZlZSp]UqZQtZOrVQjUQlQGrSM}^Q€cQ|`QaOEt]KtaMxcX}cMzcM|aIr]KjVIdSIhVOfUI`QCaQGdUKhXKo^QnZKk]Qn]OhVKl^SvcSzhSvh[qaˆ}l]^tUQ]OO[IEI[SVd[dyrv‰�‘†ƒ“‹†œ‘Ž™�„˜†�–ƒx†ywqqvphnofqqlfwqo~oj‚|€|~„|z}|„‚€‚‡…Œ„Š�’’—£ ¤É¾ÍØÈÔÚÉÔÝÏÛÛÉÕÞÍÛÞÒáâÔãäÔäáÓßׯÖÎÁÏÀ¯Æ®Ÿ²¨˜ª­˜¦¶œª¸�©Ã§­À£¨º™—³“™­•ލƒ‚¨†Š²‘™´œ§¯›¤³�©³ «°Ÿ¤œ˜—œ•�ª¢–æ×ÄóëæõîêöïìõíèóêâîÞÅâͳíäßóîñôïóóîïñêìíåêíåëߨÜêåèðêíâÖÕ‘€|jSQZMKXIIvUVÒ£�Í£“Ϩ Ë¤—™‰¶�‚…dVŠflÒ¶¸æÓô�f�kO§rUíΘïЛëÇ…ëË’ã½…êÅŒíÌ–ìË�êÇ‘çÀƒç¾�澅濉徃什çÁŠÝ²xÙ¨uåº~ã¼�Û¬pÌ›fÌ nÓ£jÕ¦n׬|ÖªlÄ›k¨‚[w`IfSC^OC]OEaOG]MC^KC[MC[ICVG;^K@XK>VK@ZI@XK@XMC[I@aSCcMC[KC]OGcUGgVEUKG@6COGXtuw†dkoKEKC;>C9>G9>C9>E@ESUlX`|dt�k~œn€œo~—l~™l€—g}—gw�q}“hu•fy–n}št–u‚›u‚žuƒž}‹¡ƒŒ¦~ˆžjn}OU^@6;>9;C;@C>@K>OKCXGCOEC[KK]QMgSVlQUgSO]QKZQGSUMXž–¢ÉºÇêãêïìðïìðòîòóïôóðôôñôõòöõò÷óñõêèìãàㄌ§Š–¬�˜³—œ³�™³�“°px�„��¿Á¼ðêîôðôõñôõðôôðóôðôõðôõðôóïóðèïçÝäÚÒ൳ƈ—¬ƒ�«|ˆ¢p}’ow‰ck‚andn�dn‚hn…„‚ŽéÖÊïÚÓêÎÁÛ°ž¾�ƒ¶Œ€·Œ‚½•‰¾™�ºŸšzr}c]nSKUSIOZOO`UU ¡’ÙÖÏôðòøóöùóøøô÷øôöøó÷øôõøóõ÷ñóöðóïêî×ÑßÈÅÖíêîöñôôíñòäßòáÚòâÛíØÓïÛÏìÐÁܳ¤´‹¥q�pg`ZxXQp[VvZOpXMrUQnXMoUIoSKwXK‰dQ�kQv]KfQEhZIu^O}dQ‚jM~cKy]GlVIhVKfXKkVKfUIgUIdUEjXIg[Mn[Mg]QlZMn]Ml^Qn[Ko`SqaQygVwjV~o]‡|lcarSO[OIQOEM^V]fZazpr‚||�~zŽ‚Žˆ…�ƒ~†xqrhxnohffpknqjlqlf�tk‚wr‡~}�€‚~�€ƒ‚€~€€„…†Œ–’�Ÿš›À¸ÆÖÆÐÝÐÛàÑààÑÞäÖââÔã娿äÔäÛÌÙÒÀÐɺʺ¦º­Ÿ««•¤´˜¢ºš ºŸ¦Ã§«½œœ¶–•°‘�²“ŽªŠ„­‹ˆªŽ�²–�¯› ±™¦³ «²£¯¢›��—�±§“éÛËôìçôîëöïíõîéôëâïàÌãͬèØÈóìîõðóôîñòìïîèííæêéãååÜàëåèñëìÁ­¥zd]]MKZIIrSQËœ�Ο�ÌŸ‘Ç “²ˆy¤}orXSä¢ìáÞÔ´•�lQ�hO׫}îÌ•îÌ–íË‘ì̖彇íËšíΘëÊ“éÆ“æ¼å¹|澈彅äº~伃待㹀֧pß±rÞ²y×§lÓ¤gÕ§lתqÖ©qÖ¨rÏ¥uªƒZŒkOhUGhQ@cQ@]OEfUI]K@[ME[K>[M>ZO>[ME[K@XMC[KEZM@[I@[MC^OCZKCZMEcQIhVCcSE`XM@6@E9IVVnuxyfjoX]`@99C6;G9>E;>GCISUjZ]|cu‘p€¡qƒ�u‡¤qƒ¡q‚™j�œq€–u„›j~žh€œo�™r‚¡p„žwˆ xƒ¤}‹§€�­}ˆžah}MQVC6@>69>66E>EQCUQKcGCOECUKIUQMaSSlUXkVUfQKVQGU[OXž˜¡Â¸ÆæÝæìéíìèìðêðòîóóïóôñõöòööó÷ôòõíëîçãå…†�…†—†Š�‰�©†Ž¬ƒ‡¢kp�aj}Žœ™êåçôïóõñóõñóõïòóïòôîñôîôóìòïçëæÜåßÓำ¾Œ�§ƒŠ¤y›tz‘jt„gp‡luŽgpˆkt‰|}ˆ§›ŸêÙÒïÜÎìм߸ªÁ‘‡¶Œ‚º”…Á–�Ä —†x†]ZgUMSOEKOEGUIIZOK—–�×ÑÈôïòøóõøóõøó÷øôöøóøøóö÷òõöðóôîóðçíêãèòíñ÷óö÷òôöîñîÙÓòáÙòàÙìÒÉæÇ¾Þµ¡¼�œxk‡k`‚d[€f[wZUlSMqZSt]QvXOwZI}^Q�gSŸtS–pOx^GkVIu^KyaI”rU‰kQcQ>t`MxaKq[Ko[Mo]KkZGjZOjZKgXIkXIn[Mo^Ol[Kr]Ko`OraMh[OqcQwcMydKydS}p[†yjzqx[ZcZOVUIK`SOl`^ujl}tu}vu|xpvopupprhlcZXaZ[aVZf^^kaazqj‰~y„z}‚|€~|~y}z…�}‚€ƒ‚„†„„‹‰ŽŒ‘‘˜º®²×ËÛáÓàéÛäèÛèéÞççÛääÕäßÒßÕÆÒ±¾´§¶¬œ­ª’š­•ž¾¤¥Ðµ§Ì°¢¸š�´—Œ›„v�rc§�‚¨‘†ž„}¨Š‹¬’™®•˜²™¥³œ¤³¢ª§ž™¢—‘¸¬šíÝÎôëéõîíöðíöîçöìäòäÒíãÚóíîñêìõïòõðòôïóóíñòìòñëïîèìîèëíçêëáßË»²dQMaMIw[[Ê™ŠÉ–ƒÅ”�½“†�k]rXQ£||ëÝÐÜ¿ž�jMÀ�aäÀ�îКîϘîΚëÈŽìÉ�íÌ‘èÃŒêÆ‘éŎ异㻃伂äÀŒæÀŠåÁŽäº€å¾Šä¼‚ß³vΚaÕ§pÙ¬xÛ¯xÙ¯vÙ¯|ЪvÁœj†jOkSGzZG›yU‰lK|cGhSE[MCaK@]MCXI>[I>VG>XG@[K>UO>[KCZM@XI;[MCZM@aOEaQC[OEfVCfZKj[ISI@>3E@9Ojlvjpwju~GEMC;>G;@C9;KGQUZu]k†hy–r…Ÿq†¡yŒ¦x�ªuŒ­u‰¨t‡¥w‰¦q‡¦r„¡t„ p‡¤u„¢x‰©vЧƒ‘ªƒ�«v‚Ÿ]cuMKO>6;>6>>9@>;>I>MI>KKEOOK]MMXSMaVShUUpVSaSOaXOaVMZ��œÀ¯¶ÝÑÝçáçèâççáåìçîîéïóîóõòõöó÷õòöòïôîëñnfplgronzhp�hn„kn„[]xUSddkoÚ×ÔòíòôîòõðòôîòóîòòëññèîïèìëàæÜÑÖÍÃϧœ§xx�fk�fj|agygn€ku‰vy‘x�—u€”�…—ª ¨îߨòàÙðÝÔ俤ɜ‰¿”ƒ¾•ƒÅŸ‘»–Žnqˆ]]jSKOICEOGIXKQZOS�‘ÏËÆôïñøòô÷óõøôöøóöøóö÷óõöòô÷ñô÷óõ÷òô÷óöøòöøóõ÷òôöñôèÓÓìÔÈíÔÆäÀ±Ðª˜Å��Ÿ|jˆld`Vv[XwZQnUMvXK|]Qy^M}[O’jOšlS£qQ�gKvSE‘kU›rÀ•j§xS‚ZG†fI–qS¯ƒ`¸�h´�oœvUŠoSv]Ej[Mn^Op]OnaQo^Mg]Mo^Mq`Mj]Kp^QnVKpaSwdSwdMyl[ufZpZ~z}g`^[VSXOS^QO]SVgZ]ogotkjjffnchjadhZ[XOKXQQ`USlgktjh|un‚zy~xv€~�}y|x„‚~~}z���‚ŽŽ�””–¼²µÝÑØæÛåëÞæêáèëàéêÜçäÖäÞÑÝŹǯ¥¸§œ²¢‘¤¨‘¤«“œÀ©¦Ô·¥Îª•·�‹|[Vy[VwXX�ugŽ~t�x£‡Ž¨��§�–°”�´ž©¶ ¬¤——¤—‹¿³œîßÐõíéõïìöïíöîèôëãòèÝõðñõñóóîîöòõöòõõðóóïòôïòóíðòìïòìïîèëðèëîæéȰ«kVZqVX؄Ĕ„Ô}¤xonSKxXXêÝÕÀšršpSÏ�lîÒ ïÕ§ïÔ¦í̘íÈ�ìË�ëË—èÅ�⼃åºèÀƒçÁ…èÁŒèÀ„çÁŒçÁ‰æÀ‡Þ±rÛ®xתxÖ¥kÌœf·ˆ]À�^À‘^¶ˆZŠkMgQ>gOEcMCz^I˜qO”tVrZElXGcMC]MC^KCZK@]O>VI;[I>`I>XK>^K>VE@ZI>XI>XI@SI@VI@[KC[MG`UC`SC[OC`UGE@C>6CC;Kjogowdl}G;CI>CG;>MMVV]x]k‰ožt…¥xЧ}Ž­�­z�ª|Žªu‹§wЧvˆ§z�©t‹¦q†¤~‹¤z‹§zФ…�©��ªt„�`jzQS]>6;@9;C9;>6;I;IK@GKEXSKdSOcZUj[VnXSdXSaUQdVS^^Xj ’ŸÄ¶ÇçÜäêåìëåêëåìêåìéåêðìñôñóöóööóöóòõñîñh`gaXgf[k^^r^`y``nVUnUQ`^ZhÎËÉðêîóíðôïòóìïòêîðèìíãéêáääÔÖÒ¼½À¬­�‹ˆlhn`[cXVZ]^jchunu…v|’w€�|‡š�†¢°¤­ðãØñÝÔîÙÇ俭ϧ•À›Š¿“‚Áœ•¬�Žhn€^XoQKQKCIMEKSIKXQOŠ‘€ÒÎÂôîñ÷òôøóöøóõ÷ó÷øóöøóõöñôøòõùôö÷òõ÷óõøóö÷òõ÷òõ÷òôåÔÛàÀ´èʼ۲ È �´�ƒ—vf‚g`y[QxZQrUMnUMxZM~[O€^Q„aOœtU¢vV¥wVƒ]I‰cKÛ¿žîܼèÍ¢³zMÇ›hΧvׯæÌ©éϪçɜٸ‹Îª~ ~Xp`Un^Ok`Mr`Sr^Ol]Mr`OqaQj]Kn^Oh[Mr^KrcQqdQvgVxhZƒta‚}xgaaaVQSIG^QScU]dXVh]dlaff^]d[cdZ]^SZXOQ`SSfZXofctnlzvu‚ytzxxzz~|~~|ƒ‚|€�}€~‚€|‰‰Š‘��»²¸âÓÞèÛäìàëìâéëáèêÞéã×ãÜÎÞóĮ¡¸£—¯£’©¥“¤­•ž½¢˜È¤–Äž†¦�l‚`ZŠoc–|n°¤Ž•ŽŽ‚�—~œ‰�¢Š—°–¢´œ¨µ›ª­˜�¦˜Ž¼¯“îÞÉõìèôîìöïíõëáôëáòçÛõñóõñóôïòõðôõñòõïòòíïòìïðêííæåíçêîåçìãåêáååÛׇojrZSÁ‘„Ã’�º�z›qcrUQ ~€ãι�tX¯|XêË–ïÓžðØ®ïÔ¥íÊ‘íË‘ìÏœéÇ�çÂŽè‰ä¹èÁƒæÃ�çÀæ¾çÂ�伃à¶~Ó¤hПgÌœnÏ�fÏ�fÁ–`¢yQ¡~U–qOkSChSEoSGr[E“uU˜rQ‰kQnZGhVEaMC`IC^OGXMCZO@]M>aM@ZG>XI>[K@[G>VG;UE>ZKCXMCVG>ZI@[OG[O@]M@`O@cVEQGE@;@@6Cgj~fowjtE9>G>>E>EMKSV^z`kˆu� wˆ¦uˆ¢~‘­}�­}�­|�­xŽ­x�ªw‰®v�¨u‹§zŒ§z‹§zŒª�£…�«��§wˆ¢ck~VV]@6>@9;@9>@9;I>II@KOGQSK^UUcZSo[Xl]XnZXoZXpZUj]Xn�•§Ë¼Èèßéîêïïêïíèïíéïìçìïêðôñóõòõöô÷ôó÷òðôh[hZQ]SOaQIZSK]QGXOI[QMfVOkœ¥ èâæðèíòêííäåçÝÞÛÌÈÖÁºÖºªÎ­£µŽ|¢r‹g^uUZcMMSGKUO]`]lflƒpz’u‘w�—–‘£ÔÄ¿ñâÙêɹèȶåŴج›Ì¤–œ�¹˜–’…–ffuVQhSISMCGKCGSGIVOSŒ�yÏÊ¿ôîðøóõ÷òõøóõùóöøó÷÷óõ÷óõùôöùôöøòöõîðôíðöñôöñôõòóðéí²�Œ´–�¾—‹žyp�nk|`VpXStZQuVO|[M}[M]O|^X…dV§z]´€V¸ƒU£nQßÅŸïÞ¾óäÍ佋̒aëÓ¬íΡîÕ±ñß»ðݺïÙµêΟᾋڱx¸‘h†q[p`OlaQp]Mq`Kl]Sp[Op`Uq`In]MkZKk^SvcOtgMvfSzjU‚qZ„|vqkog^^VMQXOI]OV`UVfZ]fV]`SX^QVVQX[QX[QQ]SSaXZpfawrvxvtzrxvwv~}~zƒ}|}„„†}€‰€�}„ƒˆ‰Œ’Ž��¾º¾ãØáêÝçíäíëâëìãëëÞéã×ãÜÐÜÁ³Æ« ¶¥˜°§”®¯–¦¶›©Ã® Æª•¼–€¨ˆq¤�u§Š€˜‚~Œwo�‚~ˆrvŽv–~ˆ˜ƒˆ¨Œ–¯”œ´—œ¥“�œ�…¶§ŒíÜÅôìéõîìöïíöîèôìãòæ×óíìõðñõñôöò÷öóööòöõòõõñõóïôïéëçàâÌÅÇûÀÎÇËàÔØÙÏЬ–�°…y¸�|­‚t|^U£yyæÖÓÀ’oÞ´ëË–ðÖ¨ðÔ îÔ£íÍ–ïÒŸîРêÈ�çÃŽåÁ‰çÃŽå½�ä¸|éÃŒéÄŽçÀ‹Þ¯qÏ¡hÉšgÅ’^À‘d½�`µ�^©|S¡|S“oOfSGgUEr^Kz]E`I…gM‚gO„gMz`GkXI[OC]KCXI@XG>^OC[M>XK>]G;ZI@ZK>[M>VG@XG>QE>VE>XK;ZI@ZI@]I@XM>ZK@VI>^Q@[SI[QM>6E@9MZ^lv|†ZXaI>GC>EIISX^x[f…nz–v†Ÿw‰§x‹§v‹§“¯z�­|ާ|�¤y�ªw�©y�©~�¤x‰Ÿx‹¤z‹£��¥ˆ‘¯}ˆŸqq‚]apE>E@;>@99@9>C6CE>ESGUZMc[Sf[Zo[ZoZVk[XoZZtc^v`[qª¡°×ÈÖïçïòîòóïôóïôóïóòîóóïòõòóöòõöóøõòöóðòd[fUIXQIXKCZICZIEOICMIEXKCUago»¶´ÏÆÇÛÒÔ½µ«ª¢�–…~¾•ŒË¡›Ò¤œÁ�†²ƒr•qoƒ`awVX[IMUKUUQX][pcfah‚fkƒ¶¥ èÙÒóçæðÜÔí×ÎíÔÈèÌÉÙ¶³Æ¤”¤‹šww�ZZjICKMCKOEQSGKUIQZOU��~ÒËÁóíñ÷òó÷òô÷òõøòô÷óõøôõøóõøóöøóöøóõõïòòëîðéêñêëóîðïéë´º�zwfa|cXx`[v^VuZMwXQuVK|ZI|[I�fVŸqX¿“jÖ¤hÅ�XÑ�gïÛ·òß¾òßÀèÃ�ÒŸlèʘìË–òáÅòâÃðܯîÙ°îÓ¨ãÁ“ׯ�Ê¡|­„[}cSj`Qp]In]Mk[MrcVtaStaQraSn]QraSn]MugSucOtgU�kQ‚oX�}otqtncaVOQ]MQZMU`S[aUZcVZ`UXZOV]OS^SVcVUcZZjadojhplfltpuwwrtt|z|x|~}€„y}€€~|x}w}�ŠŠŠ‘�•¸¼ä×ßéÞéíäëíãìëâëëÞääÖàÛËÖÀ±¾­›­¨™©«˜­­œ¬¶©²½«¥Á§–¿ ‹«��§�� �Š•†�ƒwuznkulj„opŒpt”vw �€ „z›†…”ˆ…�‡z©œ~êØ¼ôëäöíæöïîôíèôìåòäÓòëèõðó÷ò÷÷óööóõöòöõòõõñôóïòòíñðêîåßãÑÉÓÁºÇéÝÜãÑÈØÅ¾œ‚z¤~o§~jy[SáÎËíàØÂˆ^ðØ«ïÖ£îÓžîÏ”îÑšîЛìË”ìÉ‘êÈ�æÂŒäÀˆéÃ�ëɔ伂㻃à·zܲzÀ•g´ˆ[°ˆ[ªZ£|SŸwU�nK‹gG†gK¨‰frZGcQCdSClZEvaIx^Iw[Gp]IlSCcO@`M@^M@]KC^G@XI>XI;ZI;[G>XICZI>UG>UE>[G;SC>UG@UI>VG>XI@XE>ZI@VI>ZK>aUE[QGaSIQKG@3MC3Gqv}w†�VZcE;>EC@MKZQUg^j‚k|šlœ|‰š~Ž©|‹©zŒ¦~�Ÿ}‹¥x‡ŸzŠžv�¡|�§y�§}Œ yŠ©‚‘¦�Ÿ„‹œpwŽ`dnG@K>9>@9;>9;E6CC9;ICCVMU`Xj]Vl]ZkXVpVSg]VlZVp^Zk¸­µÞÔÜòìñôñõõò÷öòööòöõòôõòõõòôôñôôñóñîòðëñcXgOGXMGXI@SI@VGCVECQGCQGCOMM^ƒˆˆŸ  ª©«ƒ‚‚wz€wnl¶Ž€Ì –Ó§§Ã”‹·‹� vn“nh€^]cMKOGKUKOXSa^[oX[ka^jн²îâßóéåóãÜóãßóæãïÛÖ༴ǩ¡˜Š yz‘XUdG@GG@COCMSGQVIIZQSŽ�}ÎÉÀóíð÷òô÷òõ÷òõøòö÷òõøôöøòõøòõøóö÷óõõñóôîðæÙÝðéëñêíéßàɽ¿ ’“racrXQnUOu[Vy[MvZOyVK‚`Q‹`O˜lSµƒaÌœlКfÛ­qëЩòàÁòÞ½ïØ²Ö¢jèÌžëÉ–ñßÀòß¼ñݺíÔ¥ê˘é˜ྎײ€Î§q¯‹[ydOnaSkZKncUk^Ml^Mp]OvfXuhQq^KuaMp`MtcMwjQrdS~lX…q]‡€vpopfaXOQZOUVIU^QZaS[hVV]OU[QU^S[]QVaUUaZUh`aolkoonoqopportvxux}x|}|zz~vvnwzx�…‡�ŒŒ�Á¹¾åØâëßéîäììäëëâìêÞèáÓáÙËÛ¶­¹§—¬¥š­¬–§¶¢ª´¢ ° £µ¢›¯ŽŽ¬”™³–œœŽ‰•„z‡}wxl`wkf}kh‰nr‹npšwu—zr™}q’„uŠ‚rœ–}çÖ¿óéßõíêöðîõîçôëáñæÖóíí÷òôöóö÷ó÷öóööòõõòõôñôôïóñìîðêîëæëåÜãßÔÞïçäÞɺͳ£¸Ÿ’švk˜wkƒdcëÝÖÙ´—Ùªvð×¥ðÕ¡îÓ íОîÒ íÏ›êÉ”ëÉ’éÅŠåÀˆæÄ�éÈêÃ†èÆŽÙ­uÕ®tÉ j yV£|V¤zV™uSštM“oMˆhI…cG|aE…hSdIhUI`QEjXEoVEt[Et^KtZGkUC^K@^O@]OC]K@`I>[G>XI>UI;ZI;]E@ZI>UG>VG@VI;SE>SE>UG>]I@UE;SE@ZK9[M@ZI>]QC]QE]OEUOE>3G>3Cgkz�‡’krI@IE@@GCIMMZZ`xjv�o|–u‡¡x‰ zŽªy‰ž|‹ yŠ¢tˆ yˆ yŠ y‰Ÿ}‹£}ޤ~Ф|‰¤z�§ƒŒœq}�^flKCO>;;>99@99E6CG>EICIOGSVQd]UoXXhXSgQO[USgZVk[Xo´ª´ßÖÜóîóôòõõóööóöõô÷õó÷öò÷ôòõôðóòîòïéììçë[QZE@MG>IE>KE;QC;MC>K@;KE;I@CKGEQGGSIGVGGSECKQKO™yk¹’…̤œÉ�”¾“†²„~¥xu›ph~c]]MMQIMMEGK@CKCC��yðâÝòèäñäßôçäõíìôééçÃÄÙ¯ªÐ­±ŸŒŸyz�ZZgKCEK@EOCKSIOVGO[SUŽŽxÍǸòìí÷ñóöðóôêê÷ñòöòô÷óõöòô÷ñó÷ñô÷òôõïñôíîàÔÜȾÈżÁû¼¯¦£«¤ yj`p[QrUMyXIzZQ}]Q†[Q’lS qQº‰`È”dȘhçÊŸñÛ²ñÛ±òáÀ㼉ϚdÙ²„ëÉ�ðÛ¸ñܸîÒ¢ìΚèË–âÀ…ß½‡Ò¯ɨ€¸’jŠx`‰t^xfVpcSkaOl^QucOp]OraStdOraSwfUrcMtcM|gKufV|jZ€pX‘‡€„†qnlZQSZOSUKS^QV`SUdZ[cVZ`SX`QQcUUcZZg[cphfprwloqlpqootqoqvwwxx|~y~wvvx|wtwvyyy‡‹‘ŠŒŒ¾¶¾ãÖÞéÞåíåíìäíêàéçÛçßÐÞׯַ®¿ªœ¯§•©­˜¨®˜¨®—¨¯œ ²œ¤¶ž¤·�¤°šžž�””‡zˆ~v|vnvhhzcf‚c]�h`™og•uh‘wj‹yqƒ|t–�väдóèàôìçöïïõíêôëåïáÏõñóöòõõòõöòööòõöòõõñõôðóòîòíèìéäèÞÙààÙáàÖÝÝÒЯ—�¨‘ƒ¸ž�¾¢�ºŸ‹·‘~ض�»…]ïØ®îÓ ïÓ ðÖ§îΕíÌ’ëÈ‘êÆ�ëÇŽç†æÁŒéÅŽêÈ�澂ãº~Å›f†kMfK�gM‘qV“qU‘nK‹jOˆhO�gOxZEw]EnVG‰hI‰nMaQEaM>cO@cOEgUGhQCaM>XI>VI@[ME[G>XE>ZI@XK>XI;ZI@ZI@XI;VE;VE@SE;QC;SE>SG;`MESE@SIC]M>[I;^O@]O>^QE^QEfUIKEE>3;E;Gvy�‰�œMISC;9@9@>9GKK]`f}`l†lz�q™x‡£x†�vƒ–v„›v„—w‡žn‚ŸyŠ�|Œ¢zŠ x‡ |Š |‰ž€Š¡py�]j~GEO>9;@69>99E9EC9CG9COGUSOZZQ`SMVQKQKEMMKcQK]OIV¯¨²ÞÔÜòîóõòõõóöõóööó÷öô÷öó÷öòôôñóñëñëæéìèìZOVG>KC>IC;K@;KC9I@;M>;EE;G@>I>;G@>O@>I>;KC9IC>Gh]^Œvk¿›‘Ï¡‘ÊŸ˜Á•ޏ‰~²„}˜qlnXVaQQQCGO@EdQOâÒÅõêéôììõîìöííöïîõìíòãæðÞÞܶ¯¡Š•wvŽ[XnI@IK>>QEKSIOZMO^SUª¦‘ØËÁïãäðÝÖîÖÍíÐÃïÖÊôëìöòóöñóõïòôíïõïðôîïðèêåÝß¹±¸®§© ž¡£š–¨¡œ§—’|[OrVQƒ^QŽcO�fQ¤tUÅ™jÙ°zฃîÔ¥ðݺîЛñܹòáÃíÏœÀˆXµUìΛòݶñÜ·ðØ®îСëË�ãÃ�Û¶}Û´~Ψy¿–c¶‘f”|[ufZqgZgZKpcOtdQocOvgQqaOudQvhSxfQvhUxdSwfSyjZ‚nZ†ua¤›œ •�”ˆ�nh^QIUSKO[O[XOU^U[dUXfV[aU[dSUgXUf][gdcnhnhdnhgdhghdffppvnntlrxkrwuuptwz|~|ˆ„„ŽŒ”²¯²ßÕÞçÝæìãëëãìêáëæØàÜÈ×о䤳¦”¥§“�¯—¨²™¤°— ²š£·Ÿ¨¸ ¤µ™—®�¥ ��–ŒŽ~}xwpynjxc]„`UˆaV›o`“oc”vn…wj}uj‹‚lÛÆ¦òèÝóìèõîêôíçóêßïßÏõòô÷òõõòööòööòõõòöõñôôðóòíñìåéâÜ㳶IJ´Á·¹ÄººÅþž¾È©¤ª ”Œ¦—�à¿–¸�[Öª~ñÛ²îÓ�ïÕ¥ïÓ íÍ—ìË’êÉ–êÆ�êÅŽèÄ‹éÈ’éÆŒå½Ô¨pÛd¼�]qXElUG�oQ—uS•rQƒgKx^Gw^IoXEoUGgUGhUIjQE‚cIq[IaMC^K@cOE^MC^K@[M@^K@]I>]K@VG>VE>]I@ZG>VE;UC9[G>XI;VG>]I@XI>SE@ZG@[K@ZIC]KCVG@]K>]G9[K;XME[OG[QI`SC`VMQGE;3;gf|€…”x‚ŠG@G;699/9;69KKUQSc^hwgn†ku‰ny�r|�u~—q}–p}”q}�v€–}‡š}…“}„–}ˆ¢ƒ‹œw‚�foX^n@>K;69;6>>9;C6@E9@@;;E>EKCKUIXUO]KISGEQECME@OKEQª¦°ÞÒÖòíòôòôõóöõòööó÷öô÷õóööóõõòõôðòòîóóïòXKSECM@>I@9G@9GC;I>;E>;GC;G@>E@>E@;I>>G>9G@9EC;ESKXhg`¸—�Ñ­ Ò« Ê�‰¿�†·‰x¤|tz^ZjVVVGKcMQ—ytñçåöíîõíîôêèöííöïîõîïõëìóæççËħ‰–|v�^[hOGMQGOUGMZKKcQUxhdɰ¨ÝüêÐÇìÓËêÐÆéɏ鯷îÚÔöòóõðòôîðóìîòììóììîåçÞÒÓ¼²¯®§§¤ —¢˜’¤œ•«œ–‡kgwZQ�`O’jV™kS¤|`¯�ZÅ“aå¼îÔ¦ëÏ¢ëÌ òáÁòâÅæ¾„§qOϧ|òÞºòß¼òÜ·ðرìÏ¡éɖᾂ۷‚ׯwË¢k½˜p«ˆa”zZraZpgVkaMpaMr^Ol`UrfUtdUrcMxgOydMxfQvdQudOxhX�o]Œ|l²­¯º¦¡¯œ��|kUMQVMXVOXZOO`S[fXXhV^cSScOQcXXaZ[dafjgkgahdhkgghchlknqnpwkkrllokldtroxwz‡�|†„�°ª­ÞÒÚæÙáêàéëàèèßèäÖßÙÈ×˽˲§¶§”¢¤‘¥«“¡®›¦®•ž¸�§¾¤©º¡¥¸ ¨¯Ÿ¨¤”‰˜Œˆƒ}r|tnzjfz`Z‡cXŽdX–k]“pg�tj„wqyp…|nÙÄ ñåÙóêãôíêóëåòêáîÞÍõòõöóõõòöõòööóôõòõôñôóïóñíðêåéÛØÝ²´Å¦­¼§®º£«¹¬¬º¨¯¾³¯º­ª¯°§§ß½�»ƒ]åÚðÛ³ïÔ ïÔžîÒ¥ìΗêÈŽëÈ‘êÇëÈ•éĈéćç†޳wΠf¿—d­„[ŽoQqXK›vS�oSŒoMy^InXElZEcSEfSE`QE]OE`O@lSEzaG]I>`MC]MC]OCdM@`OC^KC]K@UK>XE>[G>XK@VI>ZIC[G;^I>]I;[I;[I>ZK>UE>ZG@UK>VE>]KC]I@VK;]K;]M@^OEZKCVMCaOCaSGZQK>9CMEXpu…‡Œ—MOZ@99;6;966>;>KGSXZfZdxcgqdo…huˆo|�nuƒoy‰ky‹qxŽt�u€‘v�”}Š¡x†šuz‹]fxOSg>9C;9@96;>6;C6@@6;@;9ICKMGUUQ^QMUKIUG@QC>GE@IOGU¬¦ªÜÏÔòíñôñôõóöõòõõóöõó÷öóööòöõóõôñôôñôõòöVOUG@IE>S@>K@9CC9G>;E@;KC9EC;E>>G>;E@>K>;I@;G@9CC>EOQU¦˜“ÙÁÀÛ¾»×µ²È›’¿�ƒ°†�lgxa]`IM×ùñåáõêèõèåóèäôéèõëëöëêöìíöíðõééðØÔÌ•�¼‘—£†Ž­“™½¡ Ð³«Û»¯Ü¼­áÁ¸à¼®ãÀ¶æÂ¸åÁ°ß¸ª×§’äÀ¯ëÏÅóçäóëìíäæçÝÞßÔ×èÞßâÖÖÎÀ¼®¤ «Ÿ�¬   ™—¥—Œ¤š�ª–‡›wg§€g–p[}[G€aM‚^G¥}UÂ�dව็ñܺñÚ¯îОʕ^×¶�ñãËòß¼ñØ®ïÕ«ïÖ­éÉ–éÊ™çțݼ’Õ±€ÄŸl´�gžz[ƒlMv`QocQn^Kh]Qp`Qo]OxdSvhUjXKvhSyhU|kX}jSwdM~kS‹h¬§žÛÍÍáÏÄÛǵ·¤‡[VUVIQVKS[OQaSUaZ[dVVdUU^QX^SV]UV]ZZ^XZ]X][[`^Z]`[]][`aadd^a`acgc`hddlkortvuuw¤  ÙÍ×ä×áéÞæçÝææÚâÝÌÚ̺ɿ¯º§–›¤’£¦”¤¦�Ÿ³›¥°œ¥³˜¢ºŸ¦´œ¤¹ ¨³™œ£Žˆ—‹‰†€wzofvf[aXŠ`Z’g]“gaŽqd†og}toxqhwkɶ•îßÍñçÜóëãóêäòèáñæÞõòööòööòõöòöõòõõñôóðôóïóïêîßÙÝÒÌÓÃÃÓÅÄÒÅÀεµÆ­°À¢ª¼�¦µ�¥²¤£­�xƒÔ®ŽïÚ¹ïÙ¯îÓžîÕ§ìÉ�ëÈŒìË�ìË–ëË•ìŃæÀ„Û°vÏŸgÉœdÌ›aÀ•`¾ŒXϤf¤U˜tU‹lQxaKnXIdQEdO@^M@aM@]I@VICSE;[K@dOC`QCaK@aOC^MEZI@[I@`MC]I>XG@[G>aK@ZI>VG9UG>]G>^I>[I;]K>^I@UI9UC;VG>VK@SE;ZIC]I@]O@[K@`O@]M>aSG]OE^M@dUGcUIMIE@6CI;O‚Œ“u�–@9>;3>966;63>99G@@MKGKIMUSUZ]f`^hZar[cp]dpfhojp€gn}pxƒvy…vxƒgnxQXaGMZEEVCEOCES@>G>/@@6>C9>GCIOKX`]p^duSXgGIQC;GG@MXOVž‘“̺Áêâçðëîóïòõòôöòöõòööòõöóööóööòöõòöõò÷SKQE>EE>IC>MC>Q>9C>;G@;K@9E@;K@;G>9E>;I;9GC9M@9CE;GIIO¼¶­åÑØçÔØÝÃÁÊ�ŒÃ•‰ºŒ~�tl�h`ÜúñÝØïØ×ñááôåàóêèòãáðÛÜðÞÜïÙÖéȾòßÛñÛ×êÈÁ㼸ح¦áÀ¸äÃÀÔ«¤Ù²§Ù°¦ß¼²Ú²¢Ð¤›Ï ŒÃ�zÔŠÏž�íÔÊïÛÑåøñèèÞÒÚËÁÅø¸¸°¬¸¬¢­¤ §Ÿž±¤Ÿ§œ–¬Ÿ”ªœ�¯š‹¾£�⌾�†¤}ghK@jOE†fMΫ}äÀ–ëΤéÉœóáÃîÖ¨ìϤ²yUñáÂóæÌòݶñÛ¯ñÛµîÕ¥îÓ¤íÑ�èɑְ}ȧx¶–h®�h—z`kUoZKn`Qr`IpdQo`OznftaKvcOxfSyoX|nSvhU€lU�oX„t^œ™‡Ã¹­èÙÔìàßëßÚÚȰvaaUQUIMVMO^QXfX][OO`QQ[OOZMQ]MQXMMVQOXOSVQVVQQXQUVSXXQUZOXZU[UQQ^VVXVXc]Zdccœ”ŒÖÈÐàÓÜçÛãã×áàÓßÐÁϺª¸¬�­™Ž¡Ÿ�œ¤�—ª”œ¯–¦¶œ¡´�­ºŸ­º�ž¾£ µœ§¤’�™Ž�‚|t|rdyj`~cXŠ^U�hg–k]‹n`ˆodzldurg}vk¶¦ŠëØÀðäÖòéÛóêàòèÞóîîôòõõòöõòööòöõòõôðôóïôòîôéäëÆÅѽ»ÄšŸ³“œ´“š¯šž©¡¤µ�¤¶¥ª·¢ªºž¡´¾³ÂÖ²•îÙ·íÓŸíÒžíМìÉ‹ìË‘ìÍ—ëË”êÈ�å¼�Ú­rÒ£jÓ¦kÔ¤nÒ¤jΡkË�kÌšcÈ™]y^I~^Kx^KlUCdQ@`M>]I@]K>XG>^MC[M>XMC`O@[K;cK@[ME`MCcG;]M@ZI>XI9[I;]KC^I@XK@XI;XG;ZI>aK@[K@[K>[G>ZE;Q@9SE@UG@UC>VICVG>^I;ZK>[K;aO>`OC`M@cUEcUIdUG^UE@9G@9I[Zv�‘ ZZk>9@933>93@;9E;;IC>G>;I@>GE>KC@IGGQMKSSMQQXQUXZVZ^^fdcjga^cdglr…u�˜��¡|‰™u‚—ZdxIESC;EE>ISSg`atnv�ovˆjoƒ]`kXU^dUUw^V�rv˜Œ‘¿³ªæÞÜðéêõðóõòõöòõõòööòôöòôöòööòõõòôOGKC9@E>IC;ME>MC>E;9E>9GC;I>;E@>I@;M>>I>9C>9E@;GE>KKMZº¸²è×ÛêÙâàÈÀÌ¢–Éœ‘½�«zt¨zoòåáïÙÒí×ÓñàÚñßÜîØÒçÅÁæÈÂåÉÅÑš–Õœ‘ëÏÉïÕÔéÅÄçÆÉཱུåöä¼հªÏ§›Ð§•ÈŸ™Çœ”Å‘ƒ¿�ˆ´ƒpº�‚ËŸ�ìÔÆïÛÒÕ¨šæØÓØÌÐÁ·½°§¬¨žœ¡š“¤›–© š¬¤ž§œ’­¡�¯œ‹»ŸŠÆ§�¿ž†½œŽ¶•ytSElSG‰gKέ�îÜÂçÇ–ðÚ°ðתïٲݳÀ’fóæÍóæÌòÞºñܲñÚ³îÖªîÕ­íÑ¢çÆ’È¤n´’h¤‡`¬‰`™}^€lStaSpaQo[In^SoaUultaQxfSygU~lU~lVykS‚pZ‡q[†va¨¡ŽÌÀ«êßÛîåäíåàáÒÁ–Œoh`XQGIXMM]OQcUZ]S[^SS]OOXMKZKKXKKSMOVKQUOQVKQQIQSKKSMQUMOOKOSIMUKSUMS[OO^VU–ŽˆÕÄÉÞÎ׿ÙãàÒÜÛÎÙʻȭ¤¯¤— ™‹˜œ‰™ ��«‘˜¶˜ ´›¤´›¦¸�¬» ¤ºŸœ´˜œ¨–“��І‚zwldyhaz`V‹c[ŠfZ”j]‹k^„o`znavrkyrj¤œ~éÖ¼ïàËòèÛóëáòêãóðòôòõõòõõòööò÷öòõôðôòïòòîòàÝâÇÅβ¶È˜¡·’œ²�œ±Œ–§’œ«’ž®šœ­Ÿ¤³ ¤¶ÏÅÌÞ¼¨îÙºìÓ£ëÒ¤íÒœíË“ëÉ‘ìÌ–ëÌ—äºzä¼�Ô¤gبjØ­rÛ­tÖ©lϤoÍžkÈ—aÊ™a�lKqZKoZGhO@fUE`Q@fQ@]I>]M@`QE^OC]KC]M@]M>^IC^M@`K@^G>[M>]I>[K;ZICXICcKC]KCZI;ZI;`I>aI@[I>]I>[G>VG;UG;UE>VI>UE>XICUE>^O@aMCcQ@cK>`QC^O@`MCfSElVKhZIKC@C6GI@V‡�™ox†KEU966@96;66G;;E>6C>9G@>E@6I@9G>@GE@IE@QIEKIIUOSXUO`XQaVOchn‡†œ˜š³¦­¾œ¤¼’œ´k˜SZrKI]GEOZ]pdjƒu|“t}‘ux‹pr}kcfqa`~hd~g^†tj­œ�çÛÝñêìõñôöòöõóöõñõöòôöòõöòöõòõôòõK@KG@EE@GICOE;O@9E;;G;9C@6E@>G@;G96C>;E;6@@6GC;IE>KQU`ÆÂ¼ëßäíßâç×ÒÓ«žÎ£˜Ä–ƒ»‹|×´©óåãéÉÁéÌÂݯ¯Ô““Ί‰È„€Ä�zÄ�yا�î×ÙïÖÔêÆÂòßÝòÞÝä¿»¾’Ž»��¯…~­‰‚«ˆ…¡|v®�t­ƒu¢~vœrl¨~t²ƒtÇœ–Ì¡”§xg�pa½¯­¶§�¤�˜§›’¡–� “‹¦š‹©œ‘º¤˜Ê¬“ظ–ÞºšÃ ‹¼–ƒÂŸ’ʪ�–wfjOCƒfOªXíÏ¡ðÙ¯ðÛ±ñÛ±Ù§p¿‚QäÈšôæÏòãÄòÜ´ñݶñÚ³îÔªìÌšêÇ’ß½‹À˜d§…[§‚]§†]–yXxfMp^QoaOtcQr`Oo`QthZuhQ|jUtdOoSƒpVƒpU„lS‚pVŠyd�“€È¿ªìäàðéèïèåéÜÏ´§�~xkSIIUGMZKVcV^g]`^XZ]OSUKIVIIVKMVGKVGGVKOVIKVISUGMSGKOCESGKQGIOEGSGMZKM`SQ¥‘™ÒÀËÜÊÓàÎØÔÆÎɺ¿½ª¼«š§¢–¥šŽ�˜�› �›¥�œ¬“œ¯˜žºšž´œ£¶››µžœ°™�œ‹‹”…€}yynctdU~^Vˆ^V‡`ZŽh]�jVyl`qlfvrhxqaކqßË®ëÛÄòéßôëäóìçôñôôòõõòõôòõõòöõòõóðôñíòîéí×ÒÚÃÃϸ¹Èž§»™¢¼œ¤¹•�´�š®�–¦‹‘ž‘”¤�–£œœªÛ³“îØ²êÏžêÌ–ìÏšìË’ìÍ–êÊ�äº|ãº�ݯoÞ²qÞ´zÞ´yÛ«gÔ¤gÏ dɘ`»�V´Š]²†[kUGaO@aOCfQC^M@dM@aK;`M>aMCZI>]I@]I;]K>^MC]I@]I@`K>]K@XE9VI;]I>[I>]ICZG>ZI>[I>XI;^I>ZK>ZI;[I>[I;SC9ZI@[I@[I@UE>UE;[I9`I;fQCdO@dM@`M@[M@aQIaOCl]OdVGMEC@6G]c|‚‹™jt…;33>63>9;E;;E;6E>>MC@KC;MG>K@>GC;ME;OE>KE@IC>KC>XKIcSK‡‚‰¸¯ÂùÍÓÏÝÊÇÔÀÀÓ™¥¹ly‘[l�QXc^hwkq„v…–�ˆ›�ˆ˜‚��…z|ˆyw�ocªˆv¸–‡Ð¯§êÜÜñêìôðòôñôóðòôðòöòôöòõöòõõóõôñõOGKOGOMEOKCOE>M@;E;9G@;M@9E@>M@>G;9I;;G>;IC9IE;IE>GV^cÓÌÆîàçíâçèÙ×⾭Ấҧ‘Ù± ïßÛíÒÏÒžœÐŸžÈ„ƒÌŒ…ɉw¿~vÏœ•äÁ¸ðÙÕ亶ިšíÓÌîÕÔ弻Ζ�Ð¥ŸÔ©§¼“�¤~vœwv•wu‹nl…gh‡hj“rl�od„c`|[VyZ[‚]QqQK‹|l˜Ž�§–€§–ˆ¨–�ª”…´Ÿ•Áª¢ßɾêÕÈß¿£íÛÅÅ ˆÀ—€¾™�Ȭž¯�€dK@|aK‹lOâÆ—ñàÀñß»ïÖ­¿‡Q²xKìÙ¼óâÆòß»òܵðÙ­ïÖªîÓ¤êÇ‘çÆ•ã½…×²Ó¬vË¡q®‡^“rQ}jSl[Ok`Oq`OnaKo]OnaQwcOyfOxfS�q^€lV�pUˆr]ŠqV�vgv}k¿¹§ëãÞïéèïéèëÞÖ¼¯‘‡€pVQUZV]a]gghqlj|jfnc^a^UUaXUXMIUIMUEGOIKUGKXKQ[KKOEEVEIVCGQEIUGGXKO]OMk]`¬™¡Ò¾ÊØÅÔÖÃÐÁ´½Á°¾¹¤º¯�­ •§›�¢–…‘—‡–ŸŠ›­•š­•ž¯›¡³—œ±˜–«‘”¦ŽŽ–††Ž�xuhuhdvc^^V†aX‡aS‚g`ndtjcqncpnjtlc}ua˺ åÖÀñæÜóìæóíéôòõôòöôòõôñöõòöôòôóïóïëñåßçÈÇÓž©¼’žµ‰˜¬Ž–©�˜ª”›´’žµ–Ÿ¶•™²�–§Œ”¡Œ‹‘âÁ îÙ´êÍšëПíОìΙéÅ‹ãº|ã¼~á·xãº}á·xÛ­lÙªl×§lТnË�f¾‘[«€U¢|U§|U™xSw]G^M>dO@dSC]MC^K>^I;`KC]I@]K@aM@`K;^G@ZG@ZG>^I>^K@[I9[I;`I>]I;^I@[I>[I>ZG;^I;]G>[G9[I;^KC`M>VC>UE>[MC^IC`G>ZG;[K;^K>dQE`O>`M@]OC`OCcOEfQEfUCfVE]QCC6>C;K~‡˜‚�—GEQ>66;69C;9@;6G>;I@@KE;OE;OC@OE>ME>OC;ME>MC@QG@UKEZSI�†ŒÁ´ÃÍÆÖÚ×âÏÑÝÆÉÙ§´È“¯p� Vj‡^jzhuŠw€�|ˆ•€Œ ‰Œž�ˆŒ�‚€¯�†Ñ¯­Ü»ºàÀ·çÕÏêÞÝîåãîææîççòìðôñôõòõöòõõòôôòõOEKSGIQEQKESG@QE>E;9EC;OC9I@@O>;E@;I>;@@9IC9GC;IE>GXdhØÐÎîàæíáèëÝÚèȲæÀ§Ù¯’åÍÀòäà侸٧¬Ö �Ɉ€Æ„ƒ¿}r¹|rèÌÇðÝÙìÍÌÞ« å¾³îÐÊæ¾²Û§¡Ü±ªëÓÏäÿ¯€x›wo™tlŽor�hlƒfj�d`‚d`…hcz[[tXUtV[zXMxXM|ka“ƒnª“~·�‰É® ÙƾàÏÌêÞÜîåäëØÎåιïÞÌÍ¢ŒÀ™„º“~É«•·›…cKC€aG‰hMÕ³†ðÝ»ðܵéÈ–¸�O­tMïܸòà¼òÞ¸ñÚ­ðØ©ï׫îÓ£ëÉ”êÇ�ãÁ‰Ù´ƒ×±|Ϫz«‡[”uSzfQo`Ug`SoaQl[Il]OpdQqaSqaOxfOkV€oVƒoVˆtZˆvXulgpug¼µ ìäßïèèðéêéß׺­–†n`^j[]lfg}ruŽxx„uuƒpnthc`gd^aZSUMOSKOUKKXGI[KQXIIQEKSCGQEGUGIQGGSGMdUUpf`²œ©Ð¼È×ÅÒÓÃÏŲÀºªº´¡´«›®§—¨—‰–“†�•‚‘ž†“£Ž–«• ¬–¢­’˜¯“�¬���‰†Œ|w„|}zrnpg^wfZ�^UˆaU†cVd]zkdynlpndnnhrlk}tgµ­–ÞϳñæÚóêäòíéóòöôòöõòöôòöõòöôòôóïóìéîàÜáÃÅј¡²• ³“›«•š­’”¤Ž”¥�–©Ž™ª– ·–œ²�›¬��žÞº“íÕ¨é̘ìÒ íÒ¢íÑœæ¾|â¸t忇ä½~ãº~Þ°pتlÖ§hÓ¢gÏ kÉœf¸‹]¢|SžyOœtM§}U‡kMdS@cOCcQG`M@`M@aK>^OE`I>]I@aK;[K>[I>ZG>aK@^I;[I>VG;]I9]G;`I@`G>[G;[K;[G;[G>]E>^I>`K;^K@[G;]G>[G;]M@ZG>[I@^G>]M>[I>]K>aM;]K@[K@`MCcKC`MCkZGaUCaSCQE@@9Cacv‰Œ™QQc>99>9;@99>;6G>;KC>IC;MC;QEGME>OG>ME>MC>KC;OG>QICUIC}}x¶­¶ÅÁÍÒÏÛÌÏÜÁÈ×§´É†œ¸t†¡ap�fp‚hr†rŒ|„’~Ššƒ‹ ‘†��‹�Ǩ¥Þ¿¾ãÄÃæÉÈßÉÀáÏÂä×ÔåÚ×åÛ×ïèëôðòõòôöóöõòöôñôMGMUIQSMZSIVG@KC;C96>;6E@9E>;E@;G;6C;;C>9K@9CC9EIIUv„~ÝÓÓíáçíâæìÙÔíѺë˱߸˜òäáðÛÔØ¤žæÀ¾ß³­Í�йzx°qoϦ—ñàÜìÓÐèżï×ÑíÓÌܬ�Óž•å½ïÝ×㺴˖Œ‘pq‘rq“tnŒok|cg€fj|acz`ay^`y]XvZSxVQ‰f[›v`¨ƒd¬�yÀ¦�з¤îçãôïñõðòõñòóððêØÉçӾش–ìØ¾Õ®—¹•‚Å ˆÂ¡�dOGu]G‚dI´†XïÙ±ïÛ´Òœaµ~K·OòäÌòà¿òÞºñݶñܱðتîÓ íПëΠáÂ�ͪwÈ kÃ�pª†a—x[xjSp[Ok[KucMk^MpaQqaOrcQo^MzhUƒr`„pV‚va�u`ŠydUMKtyk¼´ŸéàÜîçèíæãåÚѧœ�zvvgdpgkzkv�v…ž�ˆŸˆŒ “Ž’�„ˆzrvnf]Z[ZQQUQQSIGQEIQGIVGIO>@UGKSCCUGKSGKaUUylr¸žªÎ¼ÌÒ»É̼ļ¬º´¡²ªœ­–Žœ–‡�ˆ}†„w��|Š’|‰–‚”•€Š˜‚‡•�y~†tu}phvpjtpkqonrc[p]U|ZS‰`ZˆdZf]unhwndqnhpkXnh]voc�‰tͼŸîáÐòéáóîîôòöóòöôòõôðñôñöóñôñîòâàå×ÓܸºÉ�œ¯—ž´—Ÿ´šž´�—­”—§�‘£Ž”¤ŠŒ–�–¥�“¡�š®Öº¤ëÓ©éΟìΙìÏšæÀ�ãºzæ¿�æÀ…ä¹zá¶zתjÑŸgÏžfËš`Ã’ZÀ‘[²‡U¢wO”qM�nO“lM˜tQw`GcOC`K@`QCaMCaM@fOC^KC^K@ZK;]I;aI@]I>]G>ZE;VG>[G9`K>ZK>XE>[IE`KCXG>ZI;XG;XG>VG;XI;XG@XG;ZI;XG>VE9ZG>ZG;XG>^K9^I;[G;aO>jQIcQC^K@^K@gOCgVEjXEkZGcUE>9>@9Ec]wr�E>I>9;C96C>9E@@E>>KE;OG;M@>QG@QKCQG>SGCQG>MG@UG@VK@^VQŽ�“£¤¯¾½Ï¿ÅÓ¼¿Ï¦´É” »„“®ky�gn}fp�oz‰y„–zƒ”†ŽŸ£™™»©¨ß¿½éÐÎéÒÐâȼӵ¦Èª¤Â¤”¶ Š¾¬�èÜÞóîòôñóõòöôñôóðòKGOQGQVKZUM]KGVE>I>9G;9C>9>>9>>;C;9E;;C>9EC9CC9COQ]Œ•‘ã×ÚîãçìáãêÖÅëίéÅ›êкìÏÐ×�”çļำՠ›¾…~¯qh§jc¦l[êÌÁìÔÌñÞÜæ½¶Ø¡—×¢ŸéÇÁçȾȖ’œrq—jgÈž•Í¡ ²‡}�qny]Zz`]~a^yZV�`OŠg`�fV tZ¹Œa²‰[È�qÔ¦|×§~Æž}æØÑôðòõðòõñòóíîíÞØéÔÅЭ•îßÈðàÍÅœ„Áœ�ŧ�kOEkSGwZG�lMÚ¶‚ìØ±¿†S¾…KÈ�[òçÔòà¾òܲñÛ°ðܶðÚ¶íÒ�íΛêË–Ù´z¨†]£‚[¶�c¤†c˜|[zjOp`Qp`Mo`Mr`Kq`QpcSvcQj^QqdO„ua~taˆw^ˆ|c‚tdKEEŽ�wË¿¤êßÜíäáìäáØÉ¶�‚z}vunnzjqƒkv‡w„œŠ”¨•–§ª ¡¨œ™ –�‚�}roljaaa`dZUU[UX[MMXQQXOOZKKZOKXMMQGKk[Z|hl¥ŒœÁ§´Ã°º¸¦§©ž›¤•œ‘‰‘‡€…}ryqlpxhvxjtylwyhrvhppfdaSS`UVQMMSMQ`ZVg`^nfdj[VoVQ|[V`Z~f^ukhwpdzunxqcpocpj^fa[„}n·«’ëÛÆñèßòîïóòõôòöôòöóðôôñõóðóíêïËËÖ¾¾Îœ¥³Š–¨’œ³–�±–œ²•œ¯•�¯—œ¯–�®“˜¥Š�–‚ŠŽˆ‹”À¨˜çϧèÉ“éÌ—êΠä¾|çÄæÃ‰ã½€à´tÚªdÓ¥dΟgÏždÌš^Ç–^À�[°„Z vM›rO‡hK`G„cG�oKfQ@^M@aM@dM@`I>^MCdMCgQC]I9XE9XC;ZE>[G;]G>ZG9^I;XG9[E;XE>`G>[G>VC9VE6[G;^E;^I;XG;]I>XC9UC;ZG>ZG>VC9VE>[C;]K@ZE;ZM>[I>]KC[K@cOC`MCcMCfVGgVEn]GlVESM>;6@>6M„‰•MO[G@M>69>63C99G>;G@;OC>KC@MGCOG@ME>KE@K@>MG>SG@XK@SI@th^ƒ€„¦¦¶¯µÈ±¸É©­Åœ¢¼Œ”­co�Xdw^k�px‹y‚�x��ƒŠš³Ÿ¡Ñ¶½åÎÐêÖÐéÓÉÔ¸¥Ë«¡Æ§ ´–…�qg�o`ÙÆÆòêîóðóõñóòîîîéèKEKUKQVKZZO[OEVG>I;9C96>;39;9;>9@;9G9;@;6@@9@@;EUX`�–�ãØÞíáçëàãæÒÉèȨæÁ•ïÞÑìÒÏÚ¤�èĽæÃÁؤœ¶uk¦kc gc�[KåË¿îÜ×ïÙÕÜ¥˜Ø£šéÈÂéÉÁÛ°§­vr�c`•kfß¼·Ìœ–©|u�kf}]ZvZUz]Zz^X„aU“oa¤tXºˆ`À�d¯†^ÕcÒ¦wÛ­‡ÈœtãϽôïòõðòõðòòìíïæäëÙÒÓº©äÊ©ñäÒÛ¶–Ä�ɧ�pSGkQCtVCŒgG¸ˆZäɘÅ�ZÌ–ZОgóçÔòÜ·òݸñÛ³ðܵïÖ­íÏœéÆ�æÃŠÐ«x§ƒZŸ€Z¸“h¥…`–x]vcMq]Mk^KpcKo^It`Ol`QncMn]KthXˆr]ƒv`ƒrZŠ}jxldQIQ”‘}ÐíëàÜíãÝëãßÒ¬…}n}wxqozgo‚nu‡u~•†Œ¤—˜¥© £­žœ§›“‡„}utxpkghhra`af`ccXS^VUcXUaVZ`UUXMISMUgXZpdk›‡�²ž§´£§¯  ¤•ŽžŽ‹�ƒ‚yy~pqogjocjd]acVXgZc`V^SIIK@EG@C>;CMIKUSO`[^f]^hUMkOIyXO}`Xz^V|nhxrnxtoupglg]qh[lg]xqf­ ‡êØÂðçàòîòóòöôòôôòõóðõóñõóðóêçì°´Å¢¬¾’œ®“Ÿ¯�œ¬�—§�–§•›ª”—±™¡¶–Ÿ²—œ­’—¤Ž•¡ŠŒ“´œ�ãÊ¡èÇ�çÉ’çÉ’æÁ…çʼnåÁ…à¶zݯpاjÏ¢gËŸhΟcÌ›aÅ”^½ŒV­‚XžwK”uO�lO`I|aIˆjInVEdO>aM@]M>^K>`K@aK@dK>cI9^K>^IC[G;ZG;Z@;ZI>[G;VE9ZG>[G>dI@VC;XC9^G;UG9XC9]I;SC9VE>VE9ZE;[I;XI>UE;]I@]I;XG9^I@ZG>VE;]M@]MC`MEcKC[I@aUEdQ;cU@jUCXQ@969>6Gvw‰gryKEQ@69@66@99G>;IC;SE;SC>IE;KG@MC;G@>IC;OE>SG@XK@SI>g^Vvqn›—¨¡«¾©¯Å¦ªÁ•œ®~‰š[jtZ^lZdwkrƒv’rƒ—‚ˆ—·¤ªÒ·¸çÎÔê××åÏÅÔ¸ªÓº¸Ó¸®¯’}†n`„jgϼ¸òëîóïòôðòðêæéâÚMEOVKX]Q^dXaSIUI@KE>I99;>66@;@>9@63>99>;6CC;E@;CMOU‡‘�ãØÙëÝáèÛÞåË¶èÆŸæÁ”ì×ÊðÝÜݪ¦ÛŸ’Ù¢›×œ•Át«gd¢f^�QI½‘|æË¼×�ŒêÌÃðÚÔèÈÀÌ—Š¼†z™fc±ƒ~Ш¤Þ¸¶�on‚[V„cXrVMoUOya]�k`—jZ¨l¿�`À�Z½Œ[§|U �V²‰XÉ k¿“tØÁ´ôïòôïñóïòñèåìàÜìßÚÜ´ٺ¥èвñäÐÖ­ƒÇ¡‹qVKkSEtVEˆgK“oM£yQÞ¼‰Ô¡fêÔ®òäËñݶðݺðÙ¯ïØ¬îÖ¨ìÏ�éÈ”æÃŽ×®vÆ¢qÆžoÅšj�~VŽuVr`Kk]Mh^OtcMn^KqaOo`QjXIwcOt`Oƒvd†rZˆt`~vl]V`QOS��ˆÓůêÞÙëáÛèß׺¯‘wuxvupnnfkufgxdk|wŒ‡ˆ�¡•�¤–‰š�†…‚vw|qt~rutrrvrqwunkwqq|qo}trypolf^]V]ZOS]QXxoh”„t›ˆq¦Œl¦Žr ‡rœ…n‹zh†u`nc[SOKGEEC;C>99;99;369//933636;9;IEGQIM[VUlVSqVOz]SuaXncXvnnxtktrnqqnqpfnkcnd]kc]wfÞ̸ïçãòïòôñöóñõóñõòðôòðóòñóÞÛß™£º’ž´‘š²�™²”�²”œ®”š©�‘œŽ�œˆ�›�•¡–œ«– ±—œ¬�‘ œ�‘Ôº�寒äĉåÇ�éÈ�ä¼yàº}Ú¯pÙ­nÕ§jÍœaÎ�dΜdÖ`Á’]¹�[­ƒX�tK”lK“nO~aK~]EtXC‘pOŽnMdM@aI;cM@aK@cM@aI>aO@[I;^I>[G>ZC9X@9[G9XG9^G9ZG;aI;^E;]I;UE9OC6XC6XC;VC6XG9]G;XE9UC;UC;ZG;]G;VE;^I;XG9]E9^G9VC9XE>ZI>aK@dME^KCaQ@fQ>dQ>fOC`SCOE;>6@KE`†� fq‚C;;C;6C>9G>;KE;ME;OE>MC>QG>IC;I@;IC>KC>QGEQG@IC;UMG^XU|}Š�”©Œ–¯‘˜®~ˆ›r}ˆ]`j`cxactjq„rz‰x€�~‚�²ŸœÒ¶¶çÎÎçÐÎæÑÈæÒÌæ×ÐäÓÉÀªŽ�n]xa[ë¨ðçéóíïôðòìåÜÞѸI>CVKO]OZXQcSKZKCI96>66993399996;66969;@9C@9E>;CIIMw}vÞÕÑêÞåèÙàçÓÉêÌ«ê̤íÕ¹ðÝÙÙ¡›Ü¤”Ò�„Ì„t¼wn¤aX•ZQvKInGE”l^З€íÖÓéÊŠx¶yj¨k]Ï¥—çËÃܶ­�qk‚a`ƒaS‹g[aX�cVŽhZšgU�fa•a`¶„V´…V´†X°„[¤xS–pOžzSž|[¼ ’ôîñôîðóíïíãßäÓÎãξÝŸïçåäÎÂîܾñãÐèζ”lchM@pXE^G‰jK—pM vMäÈ–ïß¿òàÀñÛ±ñܶñÙ¯ðÙ¯îÕ¥ìОëÎ¢èÆ’ß¼ŒÐ¨tˤqÁœo�tQ}dMtaMr]Qo^Kp^Ip]Iq^OpcUn[Ko`Sr^K€qV…u^‹xdc[gVSgSMX’‘€Ë½¨èÝØêÞÚçÛÑÆ´–‚wg‚uhtfZd`g`[aZZ[]XUnkf€yt‚„y|wttrrxyrrrrwqyz|~}z~yv‚yz�‚|�‚€‰€�|uzd`hVQ]SO]hdc‹x[›„f®’l©�h¨�n§�h›‚a•|]wnUKEC;696//633///6/+9+39/3639969C;;ICEXKMt[Qz^O~f]wjfrkgxrfvwlvxprrgtqhrnfjhdh``f`Z¯¤†íåäòïòóñõóñöôñõòðóòðôñíòÈÆÒ ªº�›²�œ¯—žµ—ž¶–Ÿ¯•ž²š¤´˜œ¬�”£Ž‘ ‡‹—ƒŽ—ŠŽ—‘–ª˜”›¸¤œäÅ�àÁŽáÀ…èÈ�â»}ݶtØ«nÔ©lΡaÉ�cÈ–]È–^Á‘[º‹V´†S©€V›qK™rM…gKy^IvZKw^G€cIŒoMpXC^K;[K>`K>dM@cI>aK>]I;]ICZE;]G>]C;VE;^G9]G;`G;ZE>VE>XG>UE;]E9XE9V@;VE9VI9]K;UC6Q>;VE;XK@XC9[G>aK>`K>]I>ZE;VG;ZE>VG;aQKZG@XG>`M@aO@hVEdQ@hUC[M>KC@@6M‚†•…�–ICE@;9@;9E;;G>9E@;OC@KE@OG>K>9E>>G>;C@9ME>OC9G@;QE@ME>cadhp}uw…qzŠfq�gt‰pw�pxŽlu�nx�lx„p~Šrz‡�Œ�·¤œßÃÀæÐÎëÙÖðæèïåæìâßм¬�wgvfX¼¨ ñèëóîñôðòíåÛÛˬI>CVKVXOXXO[OGQG>G96>93>;3996693963966696>;6>>9>OMMzwnÝÐÆëÜâçÚßçÖÄëÓ¸ìÌ ìÔ»ðÝÜß®­Û “Ï‹�̆z¶p^œZK�SOxIGhEChICÕ­–íÔÌæÃ·¸~nªn`­xlçÌÈß¼²Â“ˆ�j`†d[‹f[ŠdZ†`QŠaU—dV›`QžaZ–^V³‡^ºŒa¼‹]¼‰X²�[«|V›xX‰hQ¤�|òìîôîïóíïêÞØëÝ×íáÞàËÂïèçíàÞãȬðàÆïÞÆ¹�ooQCqUCvZEŽhQ�kG—nOÔ±}íÛºñàÀòÞ·ñß¼ñܸðÚ°îÕ¦íÒ¤ìΣéËžÞ¸€Î¨qƤv¾•h‰tUxdOt^In]Ql[Ko]Kn^Iq^Sj]Mo^Ip^KocS…rX†v]ˆyg[UhXQ`XS[‡‚nÀ°’æÙÎêàÙèÜÐп«�€ltoqgcg][^QOVOOVKM^XQpkkwtowxrtqporppoolrluxxvyy}yt‹€~Œƒ}—‹†‡~~ztwgcqVUcVUahdf‰x^œ…dª‘h¨�d§Œc ŒaŸ†d–cunUKIE;9;6/36/+//+6//9/3933639636@9;E;>ZMIvXQ€aVˆn]xpfuokuodvwlz|rtpgjkaxochf`lccc[]†�pêäæòîóòñõòñõóñôòïóñîòîêïÐËÔ¨¯¿• ¯�–«Œ—§”™ª”›­”œ¯› ´–Ÿ´“›¯’”­��ŸƒˆŒ�‚‰ˆŽ˜‘‘œ¨——áÀ‡Þ½ƒà¾�èÊ’àºxÜ´tתfϦlËžgÈ™[Æ›aÆ–`Ö^º‰U³�V¤zQštK–qOˆgGw[Ip[IoXEpXEqUEqZEfK;fM;fM@fM>fM>`I9cI;dI>]I;dK;`E;ZE9XE9VE;ZC9UE>XG>SE;OC9VC6UE;SC9VE9SC9XE;UE9O@;[E>XG>SC;ZE;]G>[I9XE9XE9]G;S@9SC9]K@^G@XE;[I;`M>fS@`Q@^U@hQCXMG>6Crr�‹�¡OKKC>6@;;@;9E@9IC9QECQG>UG>M@9E>;I>;G@;QC>KC>MC>KC;ME@SMI[ZU`^adhpgl�nz”x€œ|…�x€—u|�kv„pv�tvy€~¤’�Ùº³æÏËíÞÝòêíðëîîçèÔÁ²‘‚pxlfÁ¬¤ñèêóîñôðñëä×ÓÆ¡E>EQIKVMXUKXG@OE;E96@93>>3@>6@6993/996963>93;>6;^[V•€fÞÏÀíàäìàãêÛÒíÔ¸îÓ±ìΨïÙÐæÀ»Ò�€ÌƒoɃv´j]šXO’SK}GE[@;V;6zQEêÖËåŶ·wc»ŠßÀ¶æÆ¼ªxw�f]‰ZQwMG‚SIŠVK�XM–]SœaZ™ZM�XU�ZZšn^ÓaΘfË™jÃ�`¾‰] vO~fQ‡yjèßÞóîñóïñðèçæÖÎàÎÃÛÈ¿åÖÍïçåßǼټ›êؼîÛ¾«|[}VG`I„aG…fC�hKº�cëÙ¼òäÆñà»ðÞ¸ñß¼ïØ­íÓ ìÒ¥êÈ”åÃ�Ë¢t§„X¬‡X²Œ^ŠlQt`MtcOl[Qn^Kn]MqaOn]Mn[Oo^Qp`QvhUqa�wa…}rSOZSScUOVjhZ­¤†ãÔÈéÝ×èÛÒÜɸ¥•z‹ydrcZdVOcUMQIEXKS`QOl^[nhfnlhtnfkopnlkklglkfruowvr…}qŽ‚y�†……||yuwffpZXdVUaa``~uc‰xa›…]žˆa™‡^˜ƒa˜ƒ`�~aznSIEE>;;6/63/+//'9//6+36//636633;36>6;UKKx`Sˆn^‰ta~ulzvkvxoyxotrhrroorfqpglhjga`c^^ngkéåèòïóòñôòðõòðôòðóñíòîêðÞØÞ¯·Æ–¡·�™ª”›­‘™ª’š«Ž’ �”š��ž’–¥•™©–›­‘”ž�Žš~ƒ}�†„„‰ÝÔ֯pàÅ�æÇ�Þ¸vܶ|Ò§hÚaƘ^ɘ]Å•`ÖcÁ�]±…U²„U©~UœtK‘qO�jIv[EnUE]Q@dK@`M>cK>ZG;ZG9dI>fOCjO@^M>aG9dI>[I>^I>^G;[C9`G9[E9VE;^E9^E;VE>VE9ZE9V@9XC;UC6Q@6UC9UE9XC;VG;VG;X@;ZE;^E;SE6VC6XG;[I>VC;O>9[C>^I@ZI;[I9^K>aK;cS@]Q>gQ@^QC>99KEZz~”jnqIE@E@>E>;K@;MC>M@>ME>VG;OC;I@9G;9G>6E>9IC9E@;I@;IC>KECIG@MI@^V]tt�|€šŽ‘¤‡Œ €…œyyƒnnpgjkfdrnlh��}Ì­ªêÚÛïæèòíðñìêìåáξ²–„y‡yvƹ¶ñéíôîòôðòëäÛ×̰E>EOIMSMZUKaMMhKKaEE`@;Q@9G;6>6633399693/6936>69qj[§ŒláιìßãëÞåéÜØì×ÂîÖµêˤí×ÈïÜÖÇ€xË�pÆ}qºpd¨`SœVMvG@]@@S;6U;6˦�Ù­œÃ‰tëÔÊíÚÑÉ–…‡ZOuQGgE>rKCyOG„VK€OG…QG†OIŠMGˆMC‚QM€UI¦|ZÍ™aÇ–c·‹`°…V“oQpZIzg]åÝÛðééðèèçÙÖÛÈÁÙĸàÌÁÞɿֽ±éÝÖж­µ”}àÆŸìØ¶å˨ŽcI€^E~`E‹dGÌ¥vîÞÂñâÆñÞºñÞºðÛ²îײíÒ¦êÉ–åÁŠß¸�¾™n­„Zµ�[¶�`†kMr^IudKoZKl[Kn^KqaSlZOlZIl]Kq^MtgS‚rc€r`vofG@GIEOQKUZSM‰„oÖÆ¸æØ×çØÕÛÆ¸�‡k}lZlUGdOEgQIZMMXOUXMMg]^kfalgacc^hgchccgjakhanklurj}xŠ€r‰r}xyqor[[dVMUUS]cZZƒtaŒ~c¡Ša£‹f¦‰`£‹]˜‡f–�]ylUKE@>;93336/+6/36/+6+/3//9396/3633936C;@l[Vxhc„wk|wgzzlxxuxzvxwnuvrwtlnognjhjdapfgtgfíéîòïóòðôòñôòðõòîóñíòîêïáÜ墬Á’ ²‹—¯‹—ª“�³•ž¸™Ÿ²•š¯–�­Š’œ‹�˜��•ŒŽ™Ž�š‹‹–„Š}}~̧•aÛ¸~âÀ†Ý¶wزuϧpš`ÈœdÈŸjÁ�Z¾“]ºŽXªO¨}M¤xO“oK�pOƒfIoXIdUG[I;ZI>^I>XG;dM>^G9]I>cM>gK>`K;`G9cI>cK>cI@[E;ZE9[E9]G;ZE>^C;V@9S@6Q>9S@6U>6XC9O@3O@6Q@9Q@9S@6O>9VC9S@9VE;S@9UE6Q@9VC9UE;UC;UE@S@6[G;XG>VI>[G;`M;[M>aUCdSCdOC]SIC6EVOnu}‡SQSGGEE;9E@9IE>M@>QG>ME>MC>IC>C;9@;6C;9G>6E@>KC;E@>KE@KE>MC>`VZpoƒuyŒu€’…–ƒ’twƒ`c^UV[XXah`]…upɪ¤êÞÝðéëòîñìèääÜÒ¹¨›–‡†�ˆ�ÕÇËòëíôïñõðòîèäßÕ¿E@CQIVXQcQOdQUrSXvMQuIIhIId@>E96;639666//693;;36wkZ¬�nãÐÁíßäìáçêÙÖìÔ»íÕ²ëͦíÙÅñáÝÉ„~Ì‚tÆ|p¾vc­dV›UMwG@V@9K9/Q93‡]S¯€qº…oíØÒêÑɪzjyQEoK@c>9hI@~MC�SG|MEQIƒQM‰SKŠOEvKEvOI‘jUÅ�[ÀŽV²„V«€[‹jOhUGqaXÌÁ¼ìãâìãáçØÑÛÇÀÝÍÇêààéÛÙÜÁ´ÙõӾ°Î·£¸�véÒ©íÝÁ­}U~]G�aG‹gIѯ�ïàÉñáÅðßÀìܸïÚ´îÔ«ìÏ�éÌ›åÁŽß»„Ë£oÈ kÛl³Š[†jQzaMt`Ip^MncQn[Ik[Kl[Ik]Ko]MtcVzjVqX€tXkcZE>>E>>OIKSOOjh^ɶªàÐÎáÎÇж¯�whq]QcMGgQIjSK^OMXOVVMU`[]jd[h`[dcXd`]aZV^]Z`aafdfnlowqo€wr€wouordgkZ^jQISOM[g^^‰ya”‚c©�c©�fª�nª�f�†a—~[ylVGC>9636//3++3//3//6+/6+3//363/939939;69ZUSocXwj}vhxxqtulxxrtunutpppltrnplljfcgfc}urîêðòïôòðõòñôòðóñîóñíòîêïÜÙà–¡¶�œ°Œ•ª“ž¯”œ±”œ¶–œ¯˜�³�™®”˜¦–™£‰Ž–ƒ‰�ˆ�Œ~��„‡Œ‡ˆÀ”~ÇžkÖ°r࿃ڳpÔ¯qË¢cÁ›`Æ kÅ›^Á–c¸�X´ŒX�|OžzO�xO�pKƒjG�dKlVIgOEXK>]K;XE9VG>`I;[E9ZI>^I>aI;^I>aK9fO@`I>aI>ZE9ZG;[E9[G9XC9O>9S>9S@;S@9M>3O@6M>9M>6M>3UC;U@6Q@9O>6XC9S@9VE;U@9UC3SC9SC9VC;UC9UE;XE>XE@ZG>XG9]I;ZK>^O@]M>aO@cQC]QE>6@MEc|†•VXVMIGC;9GC9KC;MCCME;QG>ME;E;;>96>;6@96C;6C>>I@;E@9MEEIC>ME@VOGjkvot†w|Ž|€�}~�qpy`cfVVXXU]d^a}oj§ŸìßáñéêòíïèáÚÛÑÆ¬Ÿ–�†‡��šÜÏ×òíïôðòõñòðêèãÙÉKEOQGSSKU[[z[h‘Xj“atžZo˜Zh�QVzGGa@>Q99>//6966;63|q^±’wâ̼íÞàëÝãéÜ×êÓ¸ìÓ³èÉ Þ¶‡îÝÐìÒËß³±ÌŒ‚¾tg°dV ZMpC>S;3I6/K93O96K66º”„äÁ¯Ë–…|OI[>9`@9a@>kGClE;qI>}QGzMG€KEwG@uI@vIEjE>wOK¬�U­�Q¯}V¡ySzcIXG@`OK©¤¨½­ Ã´¤ÔƾâÔÏêßÛòîññëìèØÓÖ¾³Í´ŸÊ³¢ØÈ¼™q^Ť‚×j`G…`E‹dEÞœñâËðß½ðÞ¾ïÝ»îÙ±îÕ§íÔ§êÌ—æÅ�äÀŒÞ¹„ÓªuΣo¯„X…lSvaIq]Il]Qn^QjZIl]MnZMr^Qk[Ko^Q|kU†pX„rZUKEC;;C93G@;SIEaVSœ�–½ª¾¾§¾ž�ŸcZcQEOVGGdUQaSM]SXXIVZOUaUZhaZh`[`[QXOIXOKQMGSMIVOQVQMg^[la]naad`k[[`OQ[MGOOKVofd�}cœ‡d®�d«Žcª�d¦Š`™�a�y]ofUEC>;633/+3+++++63/6++6/33/36//936933>;@[SUgadxvo|yo||quxruvovtkvwtrqhoonqngkfcjgc£œ™ðíòòïôòðôòðôòðõòîóïìòëèêØÔÝ� ¶Œš¯“›²•�¶”›±–›­œž« Ÿ¯�™­•œ©—œ§Ž• ‰�˜‹Œ�‚‰”}vl�vl­€vÁœxШrݼ„׳uÒ¬oÆ�fÁ˜aÆ�fÀ™`¸‘[²ŠX¬ˆVšxM–wM•rQ†kM€hIfSCaOC^OCXI>ZMCZK>`K@^K>^G;XE;]E;cI>`K;]K;cK>[G>fM>]I9^I>`K>[E9VG;]E>^E;@96@63G;3K;6M;6G;3M>3M>6K93O;6Q@9OC9M>6O@6Q@9SC6S@6SC6VC9VC;UC9SC;M>;]K>^I;aK>]I>]I;aO>]I>^OCcUEE9CC6I}�Ž[dqSV]@;;C>9GC;G>;E@9IE>I@9C;9>66;63>69E>6@;6E>9E@;MC@I@>E@;OICa]^gaprt„qryrt|hcp[[lZXa[U[aZ`rfg¿ª¤ëÞßðçéïééÙÐÂŶ©˜Œ‰…‡“§¤²æÛÝòîðôðòõñóðêçæÞÕUQgVUkVSdX[u^q’awžhƒªp‰¬q†¬l~¤ZjŽU^ˆEI`93>93996/pfU¤ˆjÝŲêÝßéÜáç×ÔçʪéË¢ä”ȚlÆ›rìÖÌæ¿³ê×ÒÀ}¯cX XMzICV;6K9/E6/I6/E6/a@9²€o˜hVU;9X;9V>3Z;9Z>;`@9fC;kG>hC@jC>lG@jC>lE>aC9^C@„dI§zS¨yU˜nKkS@K>;K;9¤�˜°¤�º«¤¾¯«ÕƾëåãóïòòíîéÜ×Ó¹©Ï¶¤Ì´�͸©Ì´£‰fQ�[E‚^G…aE�jOæÓ³ñáÅñáÆðݹïÜ´ïÚ³îØ´íÕ¨ëПéÉ›çÆ–Þ»ƒÔ®yÌ¢q§€Q|dMt`KnaGqZIp[Kl[MlZGhZKn^Ko`QocQnZo]€o]IC>C;6G;6G@@KC@]VM‘}�ª�¯ ˆªtn‡C;C@9@UGIcSQhUQdX[VKSXIOdX^dXUdVVXQIMIKI;@E@@C;;E;>C;;I@;MCC[SUa[d`Z]UMXICMGEM^XU€p]Žz^—‚d•€^�}^…uX�rXwhSVOE;9;3/+6//6/+3/'3+'6+33//3/63//6//936ECM^cfnqqy~~z~~x|~zwtuvortlrqoppqrpglloffd``aÁ¼·ñîóñðõòïôñïóñïòñîóîêðèåèÖÏÙ�§¸�—¬‘œ¯“œ°Žœ³™œ§‘™§”œ¨—�ªœœ¦“–§••žŒ‘¤…ŽžkrtXSVn[`‘og‡jlšzkܼ„Ï©jЩnÀ lº˜gº’[´�^­‹[¯�X¦�M˜zO™xQ�oQ€gGvaElVG`KC^K@[I9[M@XI>SE;^K>]M;^K>[I>]I>VE9^G;[I>K>9I;6O;6K>6MC9SG;ZG>[G>[E;XG>K@6M>6@3+@63>6/I;3K96I;3O>9K>6QC6O>9S>9U>6QC3O@9Q@6M@9VG9UE;SC6Q@>S>9VG9XG9]K;[G9aS@aM>]K@`O@XI@>6>pnˆnrx]afIEE@>9E>;G;;GC;KG>IC;C;9>66;63>99C;9E>9G@>ME>K@>KC;G@>KE>^OV^V^hk€]ah^al]Zn[]n][k][cXS[ZO]­œ çÙßêàáéÝÜÒÆ¾Å²¤©¦›Ÿ™¦ËÆÆéßàóîðôðòôðòîêèåÜÎVXo[[vZXqZ`y]q”cv—k„ªr‹­rޱt‹¯fwžXl˜KSo;9I93>966^[S•€jÚòéÙÝçÙÜåÔÌèÊ°éÆŸá¼‰Ã™j±ˆ`áʼ߱£ÞÁ³Ì”�²hX¢]SKCS;9E6/C6+G6/C63Q93]>9Z;9M93O93V93Z;9[@9]>6`E6c@;d@>hC>`C;fC;dC>cE>]C@v[I–nMštO“lMfO@K>9K>;œšš°§¢µ¦œµ§¡Ë½·æÝÙòîññêêáËÃε¢Ìµ ÍµžÍ¸®Ô¾²švdzVC�^Gƒ]C’gGêØ»ñâÉðß¼ðÞºñà¾ïÚ´î׫îÖ«ìÑ¡éÆ“èÉŸÞ¸€Ò­wÈ¡kœ|UwaIt^Ij]GlVKh[Oj[GjXGhZKo[Kq^Mp^KzkX~n[|r^IC;C;6E;6GE>IC;^QIˆy‹ †ª›†©kay@9@>6>QEI`SQgSSgVQVKSXGOcUXfZ]cVZSKKE>CC3>>>CC9@C6@C6;G96I>>[MOlaaj`fXUXGCKG>ISOSjdXynX€t]zlXvlUkcO^ZO]SGGEC63///'/'/3/+//+3/'3++6//3/33/39//@9>KKZdjttuxxƒ…y~€v}„ry~vwuqvzqvyttpqrqloqjnjnolÐËÈòïôñïôñïóñîóòïóñîóïëðéåéÒÌÔ¤§µŒ–²•ž°�š¬”œ®’›­”™¥–š¨–—§“” �—¤’• ‰ŽŸ†‹�SU]GGM^SS|dao]^nZZѰ~ЫnÊ¢fáh²ŽZ´�Z¯ŽZ¬�[­�Z§‚O–wM–xO‘rO•rK�uS•wS‚kS„jOx^CcO@XI>VI@^M>`K;`M@^K@UE;QC9O>3I96G;9Q@6K>6QG;ZK;SE9]G>^I@^G@ZI@ZI;XG;M>69/+93+@6/K;6I>3M;6K;6Q@3O>9M>9M@9QC6SC9O@6Q@6QC9M@9SC9I;9Q>9XI;XI6ZI;[I;cU@aM@[KCfQ@`O@C;C[Uppu€]dkMMMC>9E>9I;>GC@ME@K@;@99;63;66C9;C;;E@;E>9IC@KC@IE@MECOG@[OV`X[^]l[`oX]nZUpV[h[atXU[VMXfUdÅ©¸íäæðéêðêìèßÖßÕÏÄ»¯‡z}�……ÝÌÓóîðóïñôïðíçßåÙÈfq˜ht•hp�]lŠ^o”`q”d}¤l†£pŒ®x�´vŽ´qƒ¬[k�IIgE>S936QIEqcϸ§æÕØåÖÛáÏÊæÉ¬çÈ£äÀ�É�v²‡`˜qXÆ–‰¬wd×­£±gZ¤aSˆMIZ>9M9/C3/C6/C63I6/M93K66O96S99S9/V;9U;9[;6[>6Z>6c@;d>9a@9c@;X>;V@>[E@QE;kUGzZGlQCOC9G;6G;;‘Ž�¬¥ ° ›©§­Å½¿à××òîñæÖÐÒµ¢Ì²šÊ² Ç´¤Ïº³ä×λ™�}[E†^E†dE‘gKíßÇðãÉñàÁðß¼ðßÀïÚ²í×§íÕ¦êÏžåÆ”Þ¸�Τp´�`¤~Uw^IkVEjVGcVCjXIn[GkVIfVEn[OhXIl]OugUjSzkXpcE;9G;9G;3I@@SGC[SM…wˆ•�¡’y˜cXq93;>6CGCEaSQg[UcSQVIGUGMXKUZKMVKQOIV@6E>/E99E;6C;3C>3C@6>I>@fXSt^[p^[aX[I@IE@GG;MEEIGGCICGGCECCE@9966693///3++'+/'3++/++/++//'3+/3/33/3633>9@GCOV]xhx�u�’z…”wƒŽv„�t‚‘v~‹t~‹uzˆny…qz‰lo~np|pu}ØÏÐñïóòïôñðôñïóòïòðíòðìñìéìÇÈÑ—¢¸‹š±Œ™³�šª�š³–œ­–Ÿªœž¯––¥•–¤�’£ŒŒ‘†‡�fkp;6@@>GC@GKGI@;>>;@~hUÖ¸€Íªk½šc¬Š[­Œ]ªŽ^«ŒX®�U¶“^É©j˪lÁžh®�] „Z…jKnZIgSCVE9OC6OC9ZE;[G9ZG;XE;ZG>[E;G9/M>6Q@6XI>XG>VE;XI9^I;^K>XG>]I;`I;ZI>aM>^O@`K9Q@9;6/>3+C63E93I;3K;9K@6K>6O>9Q;9MC6I>6K>3K;3Q>9K@9UC;S@;M>6VG;XE;]I;`I;ZM>XI;]K@^O@aO@UMGK;Uy€‰fqSUVE>9E>9G9;IC;GC;KC;@;;966;66C;6C;9E;;E>6E@;K@>IC>KC>KE>OCGUKKUOVZXfSVaX[q][jZVlZS]•rŒÖ¸ÊòïóóñôôòóôòôôòòôñòíçäÌÇÀœ”“áÒÚóîíóïïñìíèáÔÜ̸gy—oƒ¨oƒ¨j| j}�d}œfy›l�¥g~¥p�®rŒ­wŒ®j€§Ud‹QQuE9MGCI^[[¼­£ßËÒáÏ×ÜÊÆåÈ®æÇ ä¿�Èœk²ˆ`„hOrVIpXIͯœ¶q[ªaO�QCf@>Q;6@3+C3+E;9C6+G6/E63I33I66K6+M63S96[;6[>3[>9]>9^;9[>9^;3S93V;6S@>E96C;6O@;K>9C96@66E;6tngª¤£«¤¦°­°ØÒÏìæåÙÀ³Ã¡†Ä¥‹É¯™É®–ɱ�Ϻ²ÜĶ·“u„[E…`E‰dE–gIîáÌðáÈðáÂðßÃïßÂïܶëÑ è̜̤r”qO€cIr]EpVEhM>`K>[I>^K@[K@dSGfVIdVIj[El[Ik[Kp^OodSyhUuhVxkVC;;G>;G>6G@>G@>VMO„u‡™ƒ¤–£f^}>6@;3@@6>MEIUKKZKIXGIZIOZGISEKMCMC9E>6G;/E93C;3@;3C6/39/9>6;ZOIn[MnXIVOME>G>9;;3996>@;;>6@;366336//+3+/+'+//++'++'/+//+'+++3/+/++3+//++6/3IK]SVogr�x‰£xŠ x‹¥x‹§zŒ¤|Цr„œt…�w†—t—o}—px�oxŒpwˆÜÙÜòïôñïôñïôðïóñîôïìñïëïîëî×Öà’Ÿ¶‹–­Ž•­�™²– ²•𝖛²–›«–œ¥�•©‹–ª‰�œdllC@E96>;6>@9E>6;;6;96>C>CŬ‚Ò±x¹—cª�X¨‰V¨Ž]¯‘^ª�[ª�X�vQ‘tK‰pSj^GVM@I@;I>;ME>OE>VI>[I>VE9^K;`I;M@9G;6MC9QE9UE9]I;VG>ZI>^K>[MC[K;ZM@ZI@[I;[I@ZK>^K>`O>^M>]G>UE;6/'>3/@6+@63C;6G;3I;6M>9O>9M@6M;3M>6K>6O@;O@;MC9O@9S@>UC;VE9XG;]G;XG;`M>^OCgS@`O@aUGC9Grv‚tz‡]]]EC9E@;K>>I@;IE;G>9@99933963>99C9;C>;E;9G@@MC>ME>KE@C@;QECOECQMMOOcVUlSUgVXdZUcqdyéÝãòîòóðóôòôôòõõòóôòõõóôôññðìêäÜ×çÛÝòíîñíïîèèã×ÉÓ¾Ÿgx˜p„¤q‡ªo€¢l‚¢h€¡dyŸf} d¢kƒªn†©p‰«n„¨^o‘V[€G>VC;CSUVª£�ÜÉÏßË×ÛÇÃäÅ¨çÆ á½ŽÆœp²‹^…kQtVGlVE™rZ§nV `S’QEc@>Q;/C3+C3/@3/E3+E6/E63G66K93O9/Q99K96V;3V>/Z>6[;6[9;]>6]>6S;6O@9M>>C66@96C99E6;@93@66E;9f^Sª¢�¯§­²¯´Ðý×Á³À¡ˆ½ Š¾Ÿ‰Æ­•ǯ—ȲœÔÁ¿Ñ¶¤¥€aƒ]C‡cG‡cCœkKîáÈðãÆðáÁðÞ¼ïÙ³î׭ܸƒÈžl�hOlVCdSC]M>[I;`I9XM>VI@`MC]OCaOE]UC^UGhZKkZMl[KufUwjVxgXyjQxoXC;6G;>E;6GC>KC@^UU†uŠ�†¤–‚£jdƒ>9E>6C>6@G;CKCIOIG`MO[IQVEIKEGE;C@6E;/@;+G96G>3C9/@9+96/9;3;KE@aQK^SMQIG@69;339/;96@963;3;9366393++/3+/+''++++'++'/+//+'++'/+'3'//+/3//3//KK^QZqgx“yŒ¨}ޤ~�©}�®y�¬|Ž©zŒ¤y† v… r„žy†�w�”t|”rz�àÜãñïóðîóðïôðïóðîòïíñîëííéîÝÙâ•¡´‰“§�—°�›°‘œ­‘œ­“™¯–™«�™§“š¦Š”¤„�›OSS@6>;9C>9C;6E@9;;6>;6>>;>œ†lΰ€Ã£h¦…Q¨‰V§�]®‘`³’^ª�`­�[ªŒV¦‹^‚qMwdEZOCMC>ME>UI>XI>VI>ZI;XG9O@9K>9K@6I@9VI;VG;VG>UG>[I@XI;UK@[K@XI>[KCZK>ZK>[K@[M@[O@aOCaK@[K>C;9;3/>6/@3/E;6G@6G;3K;6K>;K>3K>6O@6M;6K>9QC;MC9O>;M@;QC;VE;VE;XG>XI9^K@[K@aO>aM@cUGC6>a`vp|†Z]`GE>K@;G;>IC@KG@C;9@9;96963/@;9C96C>>E>;C@;K@@G@@MC@IC>M@@QCCOIOQQgUVdSScVV`XXfŸ~”ðéîôðóóñôõñôõòõõòôôóõôòõõòóóðòìéèØËÉïéëïêëÞÕÒØÉºÉ´‘fyœlƒ¨n‡ªtŠªtŒ­tНj�¨d¡h~Ÿf} l„ªl„ªj�¤hyŸ]k“MOrGGXKIUЇˆÎ¾Ä×ÂÎÔÂÃÞÀ£ä˜ใȠp³‹f‡dKrXIoUCrVEw^KŠkV”cXvGE^@9@3+C6/>3/G3/>3+>3/@3+G6/M6/M66I93V;3U;/X;9Q;6V96Q93Q63S>9K@9I>9>96;6393/933>3+@63E96wfM •“§¦¤¤ž˜�‚uš‹x°¤À£ŠÀ£‹Ä§�ɱ Ë´¨ÙÇį�ƒ„aK‚^G‡`G…aE”gEëÛ¿ïÞÂî×®èɔ⾄ɘa…^GyXEnV@aK;XE9I@9OC6O@;SC;KE;SI@ZM>^OEVKEnZKhZIhZKo`QqfSrdSwkUrgVpdX>;6E;6G>;G@>IE@XQQ‰x�£‡­¢‡«zjŠICS@6E;6>@6C@9@G>CQCCUEEQCKC;>@9C>6C;3C;+C66E;3@;/E;/C9/;9/9;36G>>G@>@;;9336//3+6//33/+3/+3/+//+//''/++'#'+#++'+++/+//++++'3+'3'/3+/++/96;QUcZd|k~œ�¦|ލy‹¦‚�¬z‘¬}� �Ž¢yˆ¤vˆ¢x…›u‚œu~™r}Šx}ŽçäéñïôñðõððôðíòðíñïìñíêîëéíÛØßœ¤¸Œ˜´‹–ª�™¯�˜±Š“ª•œ¨•—��•£�“—��œhqt96696993>96;;6E9/363;;9@;9;@@>o]SŦo¸œk²–k¤Œ]¦�]¦Ž[¯�^ªŒ[ …S•|V€oKp`GXK@OC@OG>IC9OC9UC9K>9OC;SE;QE>VG>ZI>ZO@ZG;`I@VI@ZI>XG;ZG>ZK;]M>^MC^KCaKC^MG[O@^K>aM@dKC`OCZK;>3393'>//E96E;3C96G96M;6I>3G;6K;6O@9K>9K@9UE;M@;M>9OC;XG;VE>ZK>XK;ZK;aKC`O@dQCcUGXMGG@Xjh€VX]IC@G@>G;@I@;GC9E>;>99;6396/>9;>96E>>E;9E>>G>CIC>GC>KE>I>@I@@IIIQQaQSaUSgc[n˜y•ïæëòîðóðòóñóóïñôðòôðòóñòóòóõòóõòõòòóÝÚÖ¬¦˜�‹„MEM”zu£�l`q�lz jƒ§p…ªt†«t‰«j§h£gz d€£j„¥g�¤j„§g}¢gx›S[€KOgKQgorƒ¾ª´Ê·Å̺ÀÜ¿¤á¾›ã¼�Ë p¸�]…gQxZIu[G�fM“tU €j­�z�j^lIE@3+;/';3/>3+C6/;3+@3/G63K6/M9/G63O93S;/O63O6/O63M93O93SECI@;G;9C9393/6/+93/>6+@63C96ygK³�o¬‘z…o]ˆ}h•‡q´¤’ò©Ì¹«Ð¿´ÈµªÊ·±ïêëàÌÅ£wh‚Z@‹cG�dC�fI oIΦzãÀŽÒœaОdÏ¢qÔh´†` tM‹`GaI;SE;SE;SE9VG>UI@SG@]OCVG@ZOGdVEj]Kn[Kj[GrgVwgVucQ~lZdXK>96E;9E;6E@>KC>ZOK�z�«Ž¯¯‘³‹|œVQjICV>3E@9G@6;E9CG9EG;EG9E>9G93>;3@93@;+@63@;/>;3@;3C;3@;3@;3;;66963;6;93393/9/3++///+++#+'''+'/'#'+'+'''+''+''''/'+/++//+6/+3+//++/+/;9CSXq]kˆr�œxŠ vŒžyާx�§~�ªyЧ}�¨x‡¢u„ q€–p€•o|�t}Ž}�”êçíñïõñïõñðôïîòïëîîìñìéîéæêÔÐØ“�²Ž–­Š˜­•�³�šª’™¯–œ§–—¢’– Œ�–‡Š�>CG9/3;6663;66993;;3663696;;;;999;66xaQÅ«zÁ¡p¶™^™‚U˜‚S˜„X“€U�yMygK[QCOI>OE@K>;MC;GC9E;3G>6UK@QE9VI;ZK@]KC[I@[I;^M>[K>VK;[G;VC9^MEVI9ZI;ZI>`M@`KC]I@]K>[K>`K@cOC^O>aM@]MCE;6>3/C63C;6I;9I>6G;9I@6I>9I>6M>9I;6I;6K>6O;;S@>K@9OC9ZG;VE9ZI;]I@[I@[M>]K@]OCcSEC9KKCZcloE>>GC>K@@IC@GC;C;9>99;63;63>66C96C;9G@;G@>KE@I@>GC>IE>G>@ICEOKMSS^UVa`ZoË­ÀëáèóñóôòôõòòôñòõòõõòôõòóôòôôòòóîïôñòòïïâÜÒ’•Œ~ƒ‚hgp§™��ƒg[jŠdzŸk~žp�¥p„¤p†¦q…¦f~£dyŸc} g¡k�¦h…¤j~¤j|¢]gŒMUlMSkfj|µ§°Â°¿Éµ»Ú½¦ß¾žá¼‘ÈŸp·�`ŒlOz]Gw`G‹qX ‚f°Žuº™…­‹x“thM96;/'6/+;3'>3+>3+C66E33I6/G3/C6/G9+I9/K66O96K93K9/UC;UG>K>6G;9C6663/6/+6/+>3+C63C93udI¸Œ`»�g�z`€u`‘ˆz¬Ÿ—¼°§Ã´¬È¸«Ë¸¯Ë¸¯ñíîìàÞ¾˜Œ‡]CŒfIŒaC�fGŽaC¤rQèÒ¨éËœêÏ›èÇ�侇à¾�ß½†´Š[tZE[I;[O@UG>ZK>UICUI@[OCZME`UIhZIhXKo[Mo^MvjUvhVk`QvkX]VK;36E>9C93@>;KECZSO�}”¯“¯²•·š„ k`ySK`@6I@9G;3;@9EE6@C6>>3;93;93;6/9;3;9+>96@>3E>/C;/>;/;;3E9/9>69966969@66>669/6///3/+/+'/+''+'++#'+'+'#+/''+'''#/'+/+''+'3/'/'+/+3/+/>;EU]t^n†o‚ xŠ t†�yŒªy�«uŒ¤uˆŸu†¤yˆ¤u„›l~–lz“oy�nvŠ}~‰ëèíñïôñïõñðôðîòðìòîëðìèîéåêÍË׊™²�˜®‹˜­–›¯‘—ª�œ¯”œ¨‘™ �”™‰�˜u†669933;3966>6666696/3639639696;93;36QCC¯•rÃ¥p²–c ‰`”yM„qK€pOvjO`OCVG;UI;UG@K;9IC>C;3E;6I@9ME;UG;VG;XI@VG>ZG>[I;]I9ZG>[I>^KCVG@]ME^I;^M>XG>^K@`M@^ICZI>ZK@]K@cM@^K>cO@dQCUI>6/+>33E93G;6G;6K;9G;3G96G;3G;3Q@;K>9O>9K>9M@;O@;SC9SE9VG;XI9ZG;[K>[M>^K>]KCfUEC;EE;UqzƒC>9C>6I>>IC>KE>E;6;9993/;96@6;@;9I@;G@9G@>I@@IE@IC>GCCG;@KCEMGEVS[XVh|j…èÛãñíñôòóôòõôñõóòôôòõõòóôñòòñòóñòòïïóîïðìêÏÆ³�Š~uyƒrpv œ‡~u^Zf‡ar–cw›fz�k l€¢n£`y�ayžd~¡f~ h~žh€ kƒ¦n¢ar˜V`�S^}[[r™–¡´¤±Á¬²Ó¸ªÛ¶–ß¶…Æ›g¯‡Z�oQ‹nU”uZœ„r²•€¶œŠÀ¡�·–�ªŠqŒq]]KKI;;>3+>3+>3/>3/@3+C3+G66C66E6/M>/M>9I>3UE@XK@VI@VIIKC;G>9E9663/6/+6/+C63C63@96lZG°�QÁ�]¹‰`…v^Šƒu¨ž–²¦ ¸©ž®§¤Ì¾¾Î¾¼ðëíÙÀ°�oUˆ`E‹dG�fEŒcCŒgG‰`IÒ¯~îÛ¶îÛµìÑœéΙêΜײvp[G`QCXO>UK@VM@VI@UI@[MEZOC^MCcVIjZIhVIjVKj[KqfXtdSqfStlZQIC@99C;9C;6E@>OGC`XU‘€–µ™¸¹›º­“¶Šwšwj†UIcE9O>3@;6>>3C;/>;3@6/99/@9/69/@;+C96G;3C;/G>/G93>;3E9/;;36969>99M>>M@>I>@C;;@936+++''#'#++#'+'+''#+''+'''#/++++'+/#3/#/''6+3/33@@OZax^oˆk~˜o‚œp‚œr‚œx„žx„ q�˜r‚–p‚œn›p“p|‰ow�ny�r}�êèíñîóðïôñðôðïóðíòìèïèäéåâéÂÁËŠ–¯ˆ•¯Œ—¬�𮑗«“˜¦�›ª‘˜§”–¢rv}@CE3369/66/366;96963>;3963696;;99E>CG@IKEIOE>nUI¾§z©�g‘€Z‡wX€lMŽuQ®’d°�X¥�ZfXE>69@66I>6`K@kUE’vQ™zO‰oKp`KfO@[I>ZK;VI;[K>VI@UG;XE>^K>^M>ZI>aSK[I@aK>XI>[M@`Q@dM@aMC`OCaSEdSEfUC>63>3/@63C63E66E96G>3E;3I>3I;6G;6I>6K>9M>9M@;K>9O>6UE;[I;UG9ZI>^I@UK;VK>ZK@fUIME>>9Gkj|KE@G>>G>>G@;I@;C;996666/;66C99C99>;9E>9KC>M@@EC;G@;EC>G9>G>;GEI`Xco`zÞÈÓòïóóñóôòôôòõôòôóñôóðòòîïñììòîïòðñòìêíæãçÝÒ³ª›š—Œqul[[XZcdMQQVc~]o�[q–^p•j|žfw›cv•^r“[r™ct˜^x›awŸd|¡jzŸlz dq˜ZdˆUaƒUZr…ˆ— –ž¸¢­Ì°¤Õ³–Û¯}Æ™j´‰Z–vS¡�g¬�v¿¤“¾¦ž¾¥�µ�—«‘�¤�‹…wug]Z[VXSMUIEKECKICQQO^VO^MGXC;>E;9GC9OKEI@;QECUI@ZOCVKGQG@I>9@6363/;//;3693+;3/;3/VK@¡zX¶‰]®~Q|cKyql‘�Š¥ •ª¤Ÿª¤ Å¾ÁØÊÇïéê•lXˆ^G�`E”hG�gG’fG�aC�fIÛ¼‘ïÜ¶îØ®çË–Ø´v»�^�fKgXGjUGZQCVI>[K@]K@]MC[MC^OC`OE`UIkZEh[KgXMn^Sp^MrdSwcQg[QC;9;96@99@96E>;VMIh^]œ‰ ¸œ¼¼ Á´š¼¤�¯œ…¥pcˆOE^E;X;6C9/;;/@9/;6/96/99/69/>9+;66@;/@;/C>/C;3E;3C>/@93>93C>9;UIG]SGcME[OGVI>C963/+++'+'#++'/'''+'++#/+'/+//+'++'/+'/''/+/3/6CCQX`~`o‹fy•cw�k|•o�›j~—l~–l|–n|Œkz”l|—hv…kv‰dqˆkwŽrzˆåâèðîôðîôðîóðîóðíòíéïæàèÝÛ᯶Ɉ˜­ˆ–®Š–¥‹—¤�š§•˜£“šª—ž­‰�šECE6393/99396/393>63663;;6;;9C96;@;CIEKICVMGQG@@I>;ZI@¾«}¼ n›…ZyjMnaG^SKUG;OE>Q@>VC@^KCŸ}XÀ�j¸”^¡‡X‹oI„kKp]GfS@jZGZI>VG>XG>[K@ZG>ZG>[I>]M;aM>]I@XI@ZG>^M@`M@]M>ZM>cM@[M@]O@cQCgS@[I>;3/>6/@33C66E96@;3E93E96G;6I>9G;9K;9M>;O>;I>6O@6Q@6VE;SE9VE;^I@]K>VI;XM@aMC[MCE@@I>Zqy}MGCE;>C>9IC9>63936;6696/>66@;9>;9G>;I@>I@;G@;E@>GC>G;CG@@SIVǦ¸çÙàòïòóñôôòôõñôõóõôòõóòòòðñòíîíäáðëìñììïêèíçääÞÖ®¤š‰†~ltnMIGVUX]^[Vc…Zh‡^o‘^q™av˜av–`o‘XjŒZg�Xl“^u™^uœdwžfw—dt‘gqŒ[c…Zc�UXtxzŒ’Œœ²Ÿ¤Ç©˜Ð­�ׯƒÆ™o±Š`—y[²‘y»œ�ƪ ¾¥ ·¦£«šœœŒˆ�„vpp^[^USVOQ[KGVE@QKO^af€[a}VSgC>>C96C;3E;;G>9M@@SG>UKCZMEOE;I>;>336//93/6/+6/+9/+>33OI@™vQ¯€X§}QvaMrh[’•“ ™™§ž›©§¦ÇÀ¾ÞÓÓíååŒcO„[CŽcG�fGŽjG‘fE�cC�dIãÉ îܸçʘ¼�a yU‰hKzfIt]Ix^Mr[IjUGcQCaQI^OC[OC^M>[KE^QGaUEhZIkZKl]IqaQuaVwfU]QIC99@99@99@93G>;^VSpht¢�¦¸ŸÁº Á¸ ½¬’´¡‰ª~l’XKhI@Z@6G;3>;3@9/;9/93/39/96/;9+>93@;3G;/C;/>>3E>3E93@>3C93;C;CZMI`SGjUIjZMaSGI@;3/'++'/''+/+/+''/'+'''+'+++/++/+'/++3'+/++63;CEVX^q[k†fv“cw‘jv�ct’j|”dx•jx�hw�gx�hv‘dq‰jvŠdrŒovŽ•šªìêïñïôðîóïîóïîòïíòëèîäàéÙ×ᢧµŒ—ª‡•«‹–«Š–¦�•¤˜™¥�˜¦‘œ©y‚Œ93363963;6339/363;636;6CC;C@>G;9@>>EGGSKEXGCVECEE>@C96ž†nÅ­°œh™Š[Œ~X˜„^”~U�rO¦†aœ|S¡V¸–f¯�Z¬‡UŽpMƒjKzhOgQCn^IaO@ZK@ZI;`K@ZKC`I@[I@XG;aO>XI;[I>ZI>]K@[QG]K@^I;^K>[K@ZK>dO>lQEfQ@cQ@;3/93/>63C93@66C9/E;6C;3E;3G;9E;9K>9K>;M>9M>6M>9M@6UC9SE;ZE;XG>[K>[I;^MC]KCfS@QG@E9I†�`hgE;@E@>E>;@9693693/963@69@;9C;;I@>GC>KC>KC@GC@G@@G>@G>C‡f|êÞäñìðòðòôñôôòôôòôôòôôòôòîïðëëðëêëãâíæäïéèîèåîèäéâÛ²§‘vtjcd]XUQQIEVSOXdƒ[l�Zl�au—^oŽ^nŠXjŠMXzMVvQZyZg‰[h‡]hŒXa€X[yZUkUO`QQaUSkflƒ…�“£“¦¼Ÿ™È©šÏ¢qÀ”d§�Q�€g½ •ǪžÐºº¹¢§œ–¢rx€agoagq][^XV`UXhQOZIESGGUM[nct�gpŽ`cyC@G@93>96C9;I>;K>;QG@QG>SGGKG@KC>@9693363393/;/';33;33G>;�dGœuV¤|U…hMoXK—‘�š›š—œ�¢¤¦ÙÑÒêäãïêì�ra†[C�dC’fI�kI’oO�dI‘dIëÛ¼îÞ½åǟΤuÕ¯~ظ�ßÀ�ß½…Ý»ŠÓ°wßk¶’czgO^SK]QEUI>VIEZQGgUEgVEp]Il]KpcSrdU€nZ@66;63;96C;6E96K@>ocjƒv€ª’­º Â¼¤Â¶›¶¯–·¥‹²„w–`VrOEa>6E9/>9/99/;93>6/>6/36/;6';63;9/;9/C;/@>3G>3G>/I;3@;3@@;EOE@ZI@kXMlXIgVCG>;3++'+'++++'/'''+#////+//++6+/++'3/+3'+3+/639GK^U[wZd]n[k}]hx`l€aqŒ]nˆarŒco€`n€`n‡jo‚dl‚lr„ÆÅÎêæîñîóñïôñîôðîóîìðíëðéåêÜØàÇÇÏŒ˜­„“«‰•­�˜¬•—ª•œ¯˜�«“š§��šMSX9/6//////9399/36/999@@>ESOcUXfSZkCG[KOcOMgKI`ECIC>C@66C99aOIű€¿¥u¶ r¹˜hа}Ó¶~·œo³•k¾ k¤‰X•uQ›}Z�vOfO>ƒcIxdIQE>QE>[K;hQClUEˆcIŽoMz^GnUEdM>[I;]I;`M@cM@VG>[K>ZK;XI;]I>`K>cO>`OCcQ@fUCQC;>639//@63@6/@9/E93E93C93E96E96G;9E9;K>9I>6M>9O@6SE>UG9ZI>VE>VI>ZK>UI@cM@cQ>aOGC9EVSh†•I@E@>9@@6>63;69963;93@9;@66E>;G@;E@>IC>K@>KECIC@QCOxZrêàèòïñóñóôòôôòõôòôõòóòíëòíïëãÝ̼¸É´¬Î²³êäâëäâíæàåÝ×âÖ˸¯œa]X[VO`[UaaUhc]V]~Vc‡V`…UgŒZfˆ[k‹[g‡QXwMOjKK`MOkOSlOUdOIcOGXG@@G>EE@EKI[U]qku„žŽ�¯›š¾£–ÉŸxÀ–q­Œc¨Œl¾©�Ʋ§Á¸·žš¦ˆ‰•flp[]jddncdp`Z]]^dUOVOMXMUhVf‚fu‹dq‹^`qECEC>6@9/>66>93E@;I@9OG>QG>MG>GC>>6663+;33>63C66;3363+@;6o]IŽnMžpM„jOo[G‚‡†¤¡¢¤£§¢¦ªÜÔÔîééðìîÁžŒ�dI‰cG�cG�gI“fG˜kI¿•pîݽïßÀîÛ´ëÏšëÔªéÒ¨æÈ’ݸ†Ï¦q¹–g©‡]ž�Xp`I[K@`SE[MCZKC]OCg[MkZGn[Iq`Qp]KxcQpfS;63>66>66E;9E>3KECqho�}•³™¸»ž¾¸Ÿ¼¹¡À¯–µ§�¯‰zœ^UqOEZC;M;3C9/>;/>33;3/66//9393+633;9/;9/;9/>;3>9/;;/;93C93E>6EE9;I@>aOI^OEXKC@69+'''+#+'#'/'+'#'/'++'++'/+/++'+++/+#6'36/3;9@GGVS]uXc|S^vS[lVaoV`wX`yZcz^dx^g€]fz[gxcl„ak�ˆ‰�ìéïîíòñîôñïôñïòððôïíòíëïäàçÂÃО¨º‰•ª…Ž¢‡’¦„’§�–¥�”›•— —š£ˆ�”;9;6/6//33/39/39//336>;GMM]lfulq†dkOVhOUjSXrUVdIISKEGGCCE;9E;6wgVÌ´�ƬxälǨxÀ¢p§u¹œjµ–c©Žf±•d�xV|^G±’]ŒtOI>;KC9QC9zaG’qM£}O©~S¡xOœwSŽrQdO@]OC^K@dMEcI@ZI@`M;dO@[G;^K@]K@]M@dK@gO>fQ@gVGXK>;3/@63;33>93@3/C63C9/C99E99E96I99I;3M>6I>6I;6M@9QG;VE9UE>XI;^K@VKC]I>^MC`OEUICG>U^XorvyG>;E@;@9;>6>936;96@6;E;;@>9IC@E@@KCEG@@G@>OCI¤z—ÝÈÖòïòóñòóñôôòõôòõóñòóïñîèååÛÙÚȺиºëàãäØÐêäãêåâêáÞäÛÒÚÏºŠˆr]ZQZUOh^Va^Udd[U^}X[€U]|S`‚Va‚[h�Ud‹SZSUuMIZKGVMK]MKSG>KG;GC9;C9@@9>G@OOOadny›��¬˜š´›�Æ�y¼”o²‘o¯’}êžÅ­ª´©°‹Ž�pwƒ[^d`^g^^kacua`cXXaSSXMO]UZj]oŽft‰dq†[`qIEKE>>@;3C;9E;6G;;K@9ME>OE@QE;I@;>63;33@66C66@63;33;6/@99aO@€fM™tS†dKw]Eyyu£¤ª¥¢¬§©¯ØÐÍîêêðìî¸�yŒdI„cGŽgKŽfE’gG°„ZßǦïáÆïßÁîÙ´ìÒ¡ëÒ£êѧæÇ�Ù³¸ŒawcK…nQƒkMfVEVIC[M@[OEXIC]QElXEp^Mo]Il^KudOyfV]SI;33;33;63E99C;6ME@rjt�~�¯›¸» ¾¸�º¸ »²šº¨”´ˆyš]VuOE`C9I93>6/99/@3393/63+/3+/3'63/66+66+693;9/99/>9/>9/>6/>93CC6>G>>ZMEZMCVK@>63++'++'+'#'+'+'#+/'++'++'/++++'+++3/+9+/6/3;6@IGVSZpQZqQXnMVgSVcSXjSZrU[vX]tZayXavZf}Zg}]cv¤ ¨îëñïíòñïõñïôðïôððôîíòíéîßÞ奲Ō›¯‚‘ª†‘ž�•¥‰˜­�•¤‘–¡“˜­•œ§~�‡9696//3/36366//3/+3/3;;@MO[ojzruŽdo‚Q[nQUlUZrX[qMKSOIQE@EE;;E;6K@;Å­…̹�Å©qÅ©rĦq¿ qµ—g²”d¶šl’~U^I·–hˆoK[K@K@9UE;hM@ŒlK§‚S¯‡X°„Q­„X§zO‚fGcU>]K>XG;aOEdI@ZK>`M>aOC]I>cME[K>ZK;^K@fSCfOCl[K^SC;3/;33;33;6+>6/C93C93C66C96C96I99I96I>3M@6K;9I>6QI;QE>SE>^M@ZI;UG>^M>[K@ZKCZKEE;GK@Uw€ˆE@>E@>G@C@;@>99;63@99G;6@;9IC@IC@MECE@>GCE]M]ÝÅÔïèíòðòóñóóñóóñôôòõóòòñìîêãÞÙÍÃÖÄÆáÐÑîæççÜÓæÙÎçßܨɾÜÔÉÆÀ°x|hUOEZSGfaSgdVgaSQXvSUqSUqS^Vc€[c†^kŽXd‰U[|SM]E@CC;IC@E>9C@9>@9>936;69>9>E>US^l •£¶ ª³š–¾•v»™z¼ …ħ“̶²Ì·º´¥­‚~…hku[VVc^^cafcdk]^dSXaVU]VZq[fzdqˆhn€daoaX[KECE>9;6/C96C;9G;;K@;ME>QGCMG;OE@@9693/E96C96@63@63>66@99I@9]M;„gKvZKgO@g^X Ÿ�¨§«¤¡¢áÙÔèßÛ×Á³€ZG�]C†`EŽfE�gG’fIãΩîáÉîß¾îܺíÙ²ìÕªêРçÉ•äŗݼ‹Î¥ojXC^Q@ZM@[M@QICVI@[OC]KE^OEkXGn]Gp]Kl[MxgQ~oZ>6/93/933;36C96G@6SK@ulw��­—²º¢Âºž¾·œ¸±–·¦Ž°‡y›ZUpMEa@9G;3>9/99/963;//36/33+//'////6+/6/69/993;93;9/>;3C>6I93E@6>E99O>CE>>E@96/'++#+''++##+#+''+''+''+'/++++'+++3++3+/6/6@;IIIXMUgMUhKOhIMcGI[GIZIMgKOcOSlS[qU[pU]q[g|ahzÏÎÔîìñîîóñîóòïôñîóïîóíìñìêïÑÒÙŒ—¬ˆ•Ÿ‰”¦„’Ÿ‚�¢Œ“Ÿ—š§“›ª—Ÿ´‡�QVZ6//6////33/36/39/3939>>IKO]`kfp†[j}S`vQVnXVjVXnUU`MKUIE@G>;E>6E;9]MG¤‰o϶�ȯ}Á¨r¼¡oºœn¶�o£…X¸‘hέz†pIM@6QC;waKv]E�nO¸’`°ˆX´‡U¶Š^²ŠZ§€U‚fIhV@`O@[K@]IC`I@[I@XI>ZI;[I@]I@ZK>`K>`K>dK>aMCkSGjXGOC;9//;3/>6/;3/>33E63C99;63C96E99C96G;6I;6G;3E96ME9SE>VI>UG;UI;XKC[I@VG@XIC`QGI@@C9I[UrOMOKIKOIOECEC@@969@99C99C;;G@;C@;MCESGOXKUΫ»òîñòðòóñóóòòóñòóñòîçèìååîçæíèæéãÞÒÁ¿èÜ×îéæçÚÔÄ¿­�‰uxpf�}pzxnf[O[UIdXSo`Mg]K]QEUVqOOkMQoS[zXaˆXd…Ua†V`ˆS]MKdE>G@9@;99@;E@6@>69;3;936>69C;EIGS™’›»¦¶¼§©§”‹­‹g¼›~Ï´ž×º¯Ô¾µ²¥�loq[VVUSS]X^`]c]Z]UQVOQVMS`ag~^g€]f|ZZhZUS[MOIC@E9696+>66@96G;9OE@I@9QICXIEMCEC;;;63C99E99>3/;63;3/>69I>9I>6VKC`OGXI@OG@�Œ‰šš”ª¢œ©’�§�xpQErSCtVEZC‡cG‹dG”gMêܾîâËîàÁíܸì×±ëÓ¦éÍšçÊ—åǛ߾�Ü·~ÄŸq~cKcOCVI>QG@ZKESG>XIC]K@fUEn`MkXKn`QukXo`S;6393/93/963E;9G@;QG@vou‹�¯˜­¶ž¼µœ¹¸ž½¯–¶§‘²�u•]SlKE^>6C;/@6/;9/;6/663;3++/++3'3/336+33+36+96/39/>C9G;3@63@93E>6C>6;@3;63363+//#+'''''+'#'/'+'''/+++''+'++'/+'+''3/'6+/6/3@>KOOcQXnOSjIOkKOaKK]II[IGXGI^KG]KMcKQcQVlX`nV]hÉÉÌðíóðïóðïôðîóðîóïíóëéîçå괼ʄ‘ª„�¡ˆ‘¡„� …�œ†�Ÿ‡”Ÿ‘™š�‘—IMO;6963693696;939;66;69CCIQQ^SVlVcvVcwQZrMUpIUgKUlMQgMO[SKMKIGOG@K@>E>9IC>KC>´š…Ô¹†Î´€Á«x³˜cºšfɧp©ŽanXCaG;›yX¦‰]‘oQ¸�`Ë gª€SÀ“cÁ–c¹‹[ª‚U zSˆlMhUC`M>[G>`K@`I@^I@VE;VI;UE9cI>[I;`K@dO@cM@[MCdQCfVCgSEC96>36;9/@6/E63>6/@63;96C63C69E69G;6G>9M>6G;6G>6OC9QC9MC9UE;SG>UE;ZG>VIC^K@]SGKE>E9SlpqQOSVS]UUaKKU@>@@99E;6@;;KCESEI�^kºš¤ÙÁÈòìðóïòòðòóðòóñòòðñêââèÛÛêÚÞìâÙÜÐÅϺ®Ã©žÉ´²ØÉÇÜÖË“�„v|rhkcgj`d]Qlf`•ug­ƒ^¶’aydG`QCQSpOOdQOnUVrX^�Xa†Ua‡Sa„Q[�II^>;;;6;>9>>9@@9@;69;3;;36936C9@ECK���º©¹¾¤ª¥–�®�pºšzβ”Ù¼ªÖ·ª¯œ�cccQIKOMM]V[`VXUQOQQVKMZSZp[cvX`zV^jQIOSIIUIEG@;@6366+93/>96I;9M>;K@;SIESICOEEE;;>99E;9C99>63;33;63>96G;6G>6ME>KE;OC9MC>ƒ€}š™”™ˆqv`OcM>dM@tVEyVC^GaG„dE�gKëܾîßÁîßÂíØ°ìׯìÒ¡éÍšèÉ–åÅ’ß¹‚ܶ}ͧu¡ƒ^ydK]M>ME>VICVI>VGEZKE`Q@hZIk]Kn^OujUZOE;6/;6396/963E;9G@;SKCnjn‹€Œ¯•±· ¾´œ»¸�½°—¹ª‘³�r’VKkKC];6E;/>6+99/;3/36/66/3/+33'63/3E;M6/9;/>9/66/9;3C;3C96>;3E>3E>6>9/6/+3//'/+'/+'''#''##+++'#'+'+++/+++++/++++'3++3+3939CCSMOfS[qS[kOSnMQaKMcKMZGKZEIVKGXKM`MMaSXhSXjUZf¼½ÀïîóðïóñïôïîóðîôïîòëéîãàæŸ«½ˆ“¥‘£‡‘ €Š›„�œŒ‘ Œ•ŸŽ”˜‹Ž˜>>@;36;66;69;6;;9;@;>C>GSQ]``q^a|^hyS[nOXpOSkIVlIKaGKdKKVMKSUIGOE@IC>E96E>;G@>…odÕ»ŠÓº„Å­w¼¤oĦrË®wnVGlXGž€V¯ˆZ¤‚Z¯‹aϨoÉ h¥ySÁ—dÁ–aºŽ[¯„Q§S‡jKjSCZK>^I>^G>`G>XG>[I;ZG;XG>[I>^M;[I>aI@dOE`K@gUEgUEjVGOC;C96@9/C63QIE>63@66>66@66@66C63G;3E;6K@6I;6IC6UE9QC>QE9XG>VG@VE>XI>XG@VI@cSCZOE@9IX[hUU[ZUfMMXKIUC@@C9>C99E@;aMO‰doÖ½¼êáàîèèòìíòîðòïòóðñòîððìíÚÅÈîææðèèèÝÓáÖÐàÖÒã×ÒÆ¾µ§–‘­£œ~yjlochfZhfVld[ƒoaÆ™qÖ«~–X�kKdUGOQkMI]MM^OMlSVzQUtKOuIOuGEdE>M>9>;6;;;>>9CC9C@6>>9C;99>66>;@>;Crwt·©±Á¬¸±�¡¨Šu´“}ŤˆÒ²–Ò³ ¸›‹d][OEIKEGMGGMECIEIMKZOSjSUhUUfKOX@>CE>;I>9I@@;66;3/63';63>66G;;ME;OE>QGEUICQGEG>C@6;@96@96>639339//;66C96G>6G>;@>9G>6G>;ZOE€q^vfO`M@^K>fSC€^EˆaE™lKœoMŸqM§tQìßÃîßÀíÛ´íÙ´ìØ¯ëÕªé͘èË–äǔ߻†Ý¸ͨv¨†[ŠqO[M>SGCUICOE9VKEaUM`QCg]Kj]MpdS]OI>36;3+;3393/>9;G@>K@;SIEqlu‡}ˆ«–±´�¿¹ž¾µž¼°—º§Œ¯€r�ZQhKC[@9G;3E;/@6/93/66/66/33+33'33399/66/;;3C6/69/;>3@;3@9/@;6E>3C;3>3'6+++966/'+/+'++'+'''+'+''++'++''+#/++/+++++6/'9+3;6@GG[QXrV`wZ`~U[wX^pVXcQO]KK[EEQGCQKG[KI[IO^OQ`SS`™––îíóðïôñïôïîóïîóîíòèæëÑÔÛ‰•§ˆ’¡‡•�ˆ“¥„‹™€‹–‹’¥‘–¤’™ª|‚‡;6>C9;E>@G9;G>EE@CKCG[U]kkzyz†xyƒajoSVfQQaKQdGMcGI]KK^MQaQQUQK@K@>I@>E;3G;6E;9G9>«–�˯‰Ô¶}γ‚Ūv¶™h¶™g±“a²�c¸–jº‘dÄ¡l·‘dÁ—aÒ§lÆšc±„Z°†[«„V¦~Q†oMjV@XK;^OCZE>VC;[G>SG9[K>^G>[I>^K>]I;aOCcK>[I>`OCfS@dOChXMha[@;6@6+@6/;3/@69@66@63;/3>63C96E96G;6G>6G>/K>6UC>SG;QE;QG@VG>VI@SG@VK@`OE]OCSIKI@QSOV^X`SSaMMSIIIG@EE;;fQMѾ°áÔÆîåæðìíðíîðìîçÝÜÔ¼¾ëâßæÝ׿ÜÛÔÅÃìáäîèåй¯êàÝæÚÒãÙÒ¸·­•–�vvojh`on]tthhgXhaVµŽgØ«rتpÉžd–xM|fIGEVE@OE@XC>OEEdGC^E>[E@]E@ZE@U;6C>6E;9>;9CE9M@9G;3@;69936>6>@>GX]d¯¢®¾®¼°ž¤˜ƒz›n­‘t €Ã¡‹¶’rvfVQGC;63@9>C;;IGQMMgMSkQQcCCK;9@633@96C96;66966;3/36'933;66E99E>6I@9MC>SG>UGEI@>>96@69C66>666//9//>66E93E>6I@9G>>I@;I>9KC;UGCj[MgXGlVE¥€XØ´zß»�Þ¸}὇ᾄߺ}îãËîßÀíÛ´íܺìÛ¸ì×°éÏ çË�äÄ�ß¼‰Û¶ƒË¥q›|UcMXM>SG@VI@QG>QG@XMCVI@]OCj[QuhUVE>I;993+63+933;66C;9G>6KG@jfo€w†£“ª´ž¾¸¢Â¹œ»¯˜µ§�«}qŠUMdOE]@;O;3@9/993>6/93/93++3+33#33363+/6+99/99/99/>9/>;/>63>;6SC9K>3C6';++++/#/+'/++'/'++'/'/+''++''#''#/++/'#+++/++6/6>;GKKgXZp]f~ZcxXZvQUaSS^SS[KEOGEOIEUMMZSSgOUcKK[SUg�€ƒîìòñïôðïóðîóðîóîìòÔÔ× «´€� …��~‰ŸŽ•£‰�Ÿ�Ž›†Œ§“›¦–›£ZXXE9CE>>G@GOCGOEKOCCa]gpnv€���ˆ|€ƒ[ZQOOMKKMIIQIKZKKVQScQOXOMQIGCG>;E99C99C>6@;6I;@VEC•}rа‰Ó¶ƒÌ®rÇ«wÀ kÁ¢nÁŸlΫr¹™l¼“fÊ kË¢oË¢nÉ�`Í¡d­�S¤�V˜uQ�pMuZCdM@[MC`I>[G>aM@VG;`K>]G9^G>ZE;ZG;]E>[G;^G>^K@[O@dO@lXGn]O~†‹G;9C93@63;33;63>33;39;33>6/E;3G96G;6E@3G;3M@9ZI@QC9OE;SE;XG;XI@XKC^OE`O@[MGE>CMEOSOQVXjVS`OIOQGM~^gÖÈ¿³—›Á�²òíðóñòóðòòíîîèççßÛÞÔÐÐĺȷ©Á¬¨ãØÑÜÍÅßÐÊáÝÙ¹ª ©¨žywpnpkulXvrgruhUXQQGEZMGœ|^Ì lѤoСg¶�` ~QG>V@;E@9I@6G>6M@9M;;QE>ZGCaEG[@>G>9I;9@>9E@6E;6@;6>666;39;69;6;QMX§œ À¯¹´¤²ˆƒˆqcœ~d®�r¸—y±Žtr[MUGC963>9@E>CIGQOOjMOhIIS>9;669333>66>6693333/3/'6/'63+93/C99I@9I@9OGCVK@ZMCIC>E>>@96@96>339/3;33@96G;3K>;I>6C;6I>6K@;O@;XKKh]Iw[G™rQܽ‹çÈ�åÆẆ㿋ã¾ᾄïãÌîàÃíܺíܺìÚ·ìÖ­éФæÉ˜äÃ�ß»„صƒÃœj“uUu]G[I>QG@ZK>SICVGCUG@VM@QC6^KCxlXoSEXG;>6/9//;33;63C>;I@>KECdgjzz†£–³µ ¾µ À¸ž¼®˜·¤�²wo�VKaKCZC;S;/C9/@;3>9/;//36/33/33+3///3'36/99/99/9;/@9/;;3>6/>>6SC3M>3G9/;/+/3/'/+'++#'+#+'#'++++'+/'''#++++++/++/++//'6/6C;KMQcX^x[]wZ]uSUcQQaOIVSKVKGMCCIMGSSUdSXqQZqMO`SS^|îìòñïôñïôñïôñïóìëïÀÂË’˜¤�Žž€Š †�œŠ”¢‰���Ž�…�£�š§”˜¡SQUE;>I@EI@GMCMKCCSGKngjwt~ŒŠ–ˆ��twwXVOOIIMGGGKQGKSMM`SSZQQQOIIG@@G;9@96;96C;9C;9E;9M@>^MEÌ´¤Û¾�Ö¸€Ë®}Æ¥p¢qÒ­x¶�c³‡[Ç¡oË¢oÌ£jÉžnÅšaÅ—aÇœ`’pS…dI’qM|^EoV@^ME]G@[I@]K>XG;]I;`G>aG>XI;^I;^K@ZI>]I>ZI>cSEjOCkSEfSE„‰‘]ZSK@;>6/>3/>66>33;33>63>6/C93C;3G;3G@6E96I>9SC;OC;OE>OC9XI>VICUICXK>]M>`MGSIGGCISKMSQ[XQXSMZ^O]©�ŽÓļÜÃÍèÛãóðóòñôóñóóîñïèèìæáàÔËÐú̼­¼­§Ë½±Ä²§äÐÊÌÉÀ—Ž‚‚‚|xxptoduo`vwggj`KEGQGIVIG‹pXÁ”gÍžhÓ§pŘ]¶ŒX@6C;3;93;;3@>6E@6G@>QGIfMMoMMkIEaE@[;9@96@9/;966939;6;6/36/3///G>GŠŠ�¬Ÿ¨º¥´‡€€ohcuZQ’u]•xc’rafVIUGG;69@CGG@SKIZKKVKKZ;693/+/++9//93393+63/+++/+#33'63+9//>63E>9E;6KGCOG>SKEMC>G>@@66>69;639/69//;66K@@I>6K@>G;9K>9I@9O@;OC>‹tZÝ”çË–êÏ æÃ…äÁ‹ã¼�ä¼~ãÀ…㾃îãÇïãÉíݶíÙ¶ìØ°êМéÍšèËšãÅ�ܺ‡Ö±»˜k‰pUoXEVI>KC>SICSE;M@>XME[QEXMCVC>w^I§uS–nOOC9;3/>33966E;9E@;OIEcdoqt…œ�ª´œ»¹ Àº ¾±˜º¤�±pŒUMdKE]@9I;3@9/>9/>6393/36+3/++/'////9+;9/;93>93>9/;9/>;3E93E;6K>6I>3E9+9++'//'3++/+''+'/+''+'+'''/'++''+#+++/'+++'3/';39C@MSVhZ`r[XgVQ[SM`OKZQIUOGQIEIKGMXVp[dw^f~]gxSVfXU^¼º½ïíóðïóîëïïëðîìòéçì··Á� ³ƒŠš€Š”y‹š…��†�Ÿ‚Žš‚Œ›�–¢���VKOG>EK@EG>>Q@GQEI`XZ~qx�„��ˆ�xywfcc[V[SOQQMOIIKIKMMIMSMZKIMGCG>;;;36933;96@93@;6C;;G>6G@;‡tuÒº¤ÔµˆÖµxЯwÒ´|µ�k˨vË©v̤nÊžfÆœfÇ›`À•aÁ”^½’a¸‹Z´�[„cG†hI|]G`M@ZG;^G>ZG>[I9[I;cI>cMC^M@ZG;XG>[I>XG;^MC[M>dOEcUGgVIk`Sœ›¡¤’yM@9C96C96C36@66>3/>3+@6/C63E93E>/E96E99E>9SE;ZE>XE>QE>OC;UI@XK@ZKC[IE^OEXOGUKIUOVZQVf^c‚rn†rtØÀÎòîñòîñóñóóñóóðóóðóòîïîêéàØÔµ®¼ª¢º­ž¶ ›Ì²±èà×�“Љ…xzxtyuc}tavo`IIIC@>IECVMISGE^SI €[¼•jÔ¦qÕ«vˤq>6@93>63993>>9E>9@E@ZKKfOOuOUzGIcE@Z>>O96@6/96/33/39669336/////933puw–‘—º¤²‘†�vpouZQxaQt`QlaU]USVKMICKECKGCOC>I>6;/336//3//+/+//+6/+63+;39+'+//#/3#3/+6//>63E;6G>6E@>QG>OGEMC@G@@C99>666/36336/+;63I;6I>6K@9IC;G>9ME>MC;MC>Ôº�ë×­êÖ¯éÌ“êΙèÊ•æÃƒäÀ…âÀ…äÁ‹îâÈîß¿îÞ¾ìÙ·ëÕ§ëÖ­èÏžæË—áÀ†Ù´Ò«v±�gvcK^OCVI@ME>QG@QG@MC@QI@XK@[M@`QC�kOÁŽ[¸ƒVvXC@9993/>;6E;9I>6MGEfdltv‡��§¯œº°�¼¹¡Â´š¸©’´‚w˜UMgKCZ@6I>/C9/>;/@6/33+33+//+/3'33/33++6+96+/9/96/66+;9+;6/;;6M>6C>3E6+9++///'/+'3++//'3+''/'++'///++'+++/'//++//+6/+C;KMK^XZp]dyXV]SMXSKXOGOMEQSGQKEKMKZ^dnw”ny–kr…ƒ…�ÅÄÉìêðçàæãÝåäÞæåßååÞäæáçäàçåßåÝÓÙ¼¯¼¨ ²Œ�§‰‘¦Ž’¨‰�¡¼»Åźƶ¤²©›¤�w†MCGOCKMEI`[]}tz„�‡~daXQQQSMMOKQMKMMMOIOOOQXOKQKIKECC>636//63/96/;33>96C9;G>9G@9|„šÅ½¾ÝÔÌÑ­�ÙµxÕ³}Ó­vЧjЧlΦtÈœcÄšf×d¿”^Á•a½“a¼ŠXºŠX´�]€fMt[EkUCdKCdI@`K@]K;]I;cK@cM@aOC`M@ZE>^K>]I>dO@[K@[I@`OGgSGj[I‡¡›Ÿ½–`Q@9C96@66C69@66>93@63C93G;9C;3C;6C96G;3SC;MC;QC>QE;OC;XG>UG@[K>SC@SG@VOE@;;OGKUII`OQŒk€Ä�µòîñòïòòïóòîðóñôóñôóðóñíïçàÛ²§Ÿ´¥š´¨ž´©› Ž…Ì·²ÙŹ–ƒw|qkyuk|vlxupf`]VMKQKIUIGUKIZOKUOKofVœ}ZΠnدwÕ«x96;939939;6>;6C@9KGEgMMkMOhMSrII`EEZ>>K66>9/93++3/39699/63////33/3^dk‘�‘¶¤´šŽ›}tzvXOv`SqaUga]^ZV[XaMIVC@OC@G>6;6/////3/#3/////3/33++6/'3+''+'/+'3/'3/'3++>66@93C93G@;ME>OG@OE@G@@@6;>696/+9/3933@99K>9M>6M@9IC;OE9I>9OECQEEÇ®ˆëزëÙ¶êОéРé̘çÅŒäÁˆã¾�äÅ”îáÅïÞÀíݺë×±ëØ±êÓ§çÍžåÉ–âÁ�ׯyÏ«wª‰`t^GaSGVG@OMK[SOQG>I@;KC;OE;M@6UG@–uZÊ™^¾Ž]ˆcEI>;>66;63E>6G>9QKEaclovˆ�ˆ¡ª—´² ¾º¤Á²šºª’µ‚u”XOlKCa@9O>3G9/;9/;6/;6+63+//'+3#//3/6/36/96/39/99/99/>9+>6/@@6K@6K>6E9+;'++//#3/'3+'/+++++'/'++#+/+++++/'/''3++//+3/+G@QQSj^d~`cwVSZQKOQIXMEOSIUMEOMEKMKUafxlu’rw’rwŽÌÊÒçæëéæìåâëæäíéæíèæìçæíååíçåíéçïéçîãáçØØßÀ½Î¯°Æ©²Æ´¾ÌÇÉÙÓÔÞØØàßßä³´¿QKZQEKOCIa]]|tpwzwvxXZXUQOSMMQKMQOQKKQQSVUSZOMSECCE>>>6393/63+;3/@63>63E;;E>6E@;vƒŽ›œ§ËÅÅȪšÜ½ˆÝ»„×´vÔ­rÔ­vΦrÅ jÅ�gÆšfÁ–]—`×a¼�]¼‹Zº�^•rOqZGgSGfOG^I@]K@`K>`K>dQE`IE`K@]I>aKC[KC]MC]I>aM@`K@dSGgQCgXCrjd†ˆ�Ô¬u]EMC;@66>36@33;3+C93@63@63@;3G;6E;6I;6QC;SE>SE>SE;QE>VG@SG@XK@U@>UGCUKC@99G@EVKKdSZÅ¢ºèÛãóðóòðóóðóòîñòñóóñóòïòñíîâÛÖ©œŽ¬›“³¤œ£“…Ž~už‰�ÞÈȺªš’ˆ…znxqjwokqfhZVXQMQVMI[UK^US]USc]Uˆt[Éšjز„Ô«u@6>>6@>6C>6@C;ME;SGGfGC^IGaCES@@O>>O>>K96@;3>6336/39339366/3///3+/KOZ}~…° ²Ÿ”¡‹„ƒzcV€aQydOpdcofklchSSV>>@;366/+3+'//+93393333396693/93+3//+/'//#///+'3/'9//>6/C93E@;KE9ME@KE@ECC@9;>699369/3>3;C>@K>6M@6VG@OE@QE;K@@KC>MC@’z^êÙ¶ëÙ²ëÖ¬ëÓ£ëÒ¡éËšåËâÀƒäËîß¾îÙ°íݼëÔ¤ëÔªêÐ æÆŽäÃŽßÀ‹×³̧t¢ƒZgXG]OCVKCKG@KC;ME;OECKE>XI;VI>VICœzXÏ�`Æ”ZŸxMgO@MC;>99E;9G;6KGGZ^achy‡…› “¯®š¼¸¡Ã³›¾§’¶‹zœ[StOEg@9K;3C93>;/@6396/;6/33+//'/+/36+36/66/96//6/39/;;/E93G>6M;3@@3C6+9+/+//#3+'6333///+'+/'++#'/''+'+++//'3+++/+936G@QOOg`fx^cqSO^QIMIEKOEMOEKI@GOIMUOU``tju‰u|–·­ÂåãëßÜâàÜåàßèØÚäÀ¹ÒÙÙãÚÜåØÚæßàêããëååìááéÛÙäÐÐ߽Ĩ¯¸Ï²½Ï¾ÀÐ×Ûä¸ÅÕÛÚäáãêhv•Zc}UUkXQVf^gg`ca]^XUMQOMMGGZMMXQK`ZX```^Z[]UVMECMC@;6/6/+63+63/@93@93@69E>9@;6I@@pw~w~…ÕÉÂà�̧yݺÚ´xØ´zЪt¿–gÃ�jÉ¢pÉœ^É kÖfÀ‘]¾�[½�`­€Q®ƒSoSCcI@`I@]G>^I;cI>aM@`I>^K@XG;[G>`I9`G;^KC]I>]I@aMCdM@hU@hSEk^S¶–‡Û¯l¯ˆSC96;33;3/>6/;3/>6/@93>9/G96C;9@;3C93E;9M;;SE>OE>UG@UE;SG@Q>>G@>>9;>69G>M[K`Á ¹ðëðòïòòïóóïóôïóóïòðêîòîðòîïïéêêæã´¦œ¶¤˜ºª�À¯œ¯¥‘–“ˆÙÆÈØÓΟ–�}ztdf^g`[`ZS`XX[SQXQQpc]ncckdf[UOk]Q½“hÒ¨rÑ©qCCXE@SE>SE>XE@]G@VG@[E@VE@QEEUEIcEGdGIfC@VC;I@9>939969;69966666633C>Cdkh­¢«ª™¤—‹�xd]]IqZG^ZM[USXSSC>;33/96/93/>3/;69>63@99;66>9>>99;6/3+/+++/+'+/3++6/+9//93+>6/G>9IC;KE>MECICMC9@@6>93+;/;@6@>99E;6I>3OE@ME>KE;MC9OC>O@CkZOéÛ¾ìÞÁì×­ëÓ£êÑ åÅ�ݶ|ݶzáÀŠíݸíÛ´ìÛ´ëØ°êÔ¢êÑ¡èΟæËœß½…Ó¬uÞj�vXaUE`K@UG>ME>I@;OG;K>9G>6OE;QE;VE>p^KºŒU¸ˆV›qOhUCQG@C;9E;9I@;KIIOKUOS`ov‹˜Šª«–¸»¢À´�º³—´‰|šc[|SKjE;O>3@93>;/C6/93/39/66+66'6////+/3+66/99/96/39/;9/;9/>;6E>6I;6G9+;///63/;339//3///+''/'/++336++'++'3+33/+//+933G@KMM]`f`dwSOSSGQKGKICMIEOMGMMGSMKU^aw…šÄ´ÇåãêÞáêßâéÃÅÔ²­ÈÎÑÞÞßèÞßèàãêàáêáäëãäêåæíçèîçèìåæíÂÏÝ‚š²ap�r‡£Š•²cp�©«ÁÛÝç— ²Qf‰Uh�Zo�VVkVQ[XQVMKKQIGOIESOM[SS[X^Z[c`Z^XOOIGCC;69336/+63/963@63@96@9;E;9C@9C;;jv‰r€Šy€‹ÞØÓÛÏÍÇ¢ܸ}Ú´}Ù°uÒ­tΦqÈždËœgÈŸpÇœdÀ”`À‘]À’`²‚Q¬€X¥}SqQCfG>]I>[K;]K>aK;aKC]M>[G;]G>^I;[I>aI@`K>`I>^I@cK@dQ;gVCgXGrnlÆŸwÌšZ…^CG69@33@6/@63@63>6/C9/@96@69C;6E93@99C99OC9MC>M@;I@9I@;K>>969;99G@KÈ«ºÜÉÓñíòòðóóðòóïòóïòòïòóðòðììéÝÞðéìëåäßÕÔž¶¬ ˜¯£œ« – –‹—�ˆ”xxáÙÓ¼²¤ca]QMSQIIIC@OKIUQOcZVrhcwpjjcfXVUdXM²ŠcË kË£rKKgII`EE[ECVC;MC;OC@VC@UE@VKIcMSxQX}KSlEC[E>Q@9C;6>;6>>6;966666933>;@]fg©�¤² ¨™‹’yfdvXQhUEOI@IC@E@@963333>66C99E;;C;;E96C9;>99@;>C;>@99633+++/+'/3#3/+3/'6/+93+;6/E;6G>9K@>G@>ICKG;K@6C9/6>3@>6;@9;I>9G;3K@;E>9I>6MC;QE>MC@jZOéÙ¾ìݾëÙ³êÓ¤éПãÃŽÙ±tÛ²yỀíßÂîݺìÛ¶ì×­êÔªêÑ¡çΡæÉšÞ¾‹Ï®€»–f„oU[QCcQEVI>QG@OC>SIEME>IE>OC9UICUKE]OE“xSšzQ�cIaQESK@@;6I@>G>9G@@GEKKOZfn‡˜‹¥¬–²º ¾´œº­”²�€¡g^€UMhC;O9/6;/>9/>3/63/69/36//3'63396+36+39/99/96+39/;9/;63>93C@6K@6K6/63/363+933;66969/++++'/''+//++'+'#/++3+3///633KEUSVj]gafrXV^QMVKEQI@IQISOGQOGMSSZcd}À¯ÆäáêææíáãëÒÓÞ¼»ÐÜÝçßáëÝßèÖÙâØÙãÛÛåàßèááéååìççîççíãåë“¢ºh~ Zn�oz’~�§Xh}}ЍÁÈÔ¤³ÃQc„Qa†Vj�Vh…[jƒUQUKGEMIGUKGUMKSOOVUZZZ[ZX]VQOG@>C993/+6/39/+93/C93@;6@69I;9G>9C9;lw�|ˆ™p€�¾¶¸ãÜܸ””Ù´}Û»‡Û´xÔ¯wЧlΣhÈœfÇœhÇ™cÅ™dÅ•`¿�`²…Uª€S xQ–qOzZIZE>]I;^G;gM;^I@]I;`I>XE;`G9[G;`M@ZG9cK>cK@^MCdS@fQ@jUGng^§�†Ì f¾‹OX@;@63>6/C63@63C63>93@93@96C93C;6C96G9;QE;KC@OC>G>9M@>@6;969;99]I^éÞåïëðñïòóðòóðòòîòóîòòîðòîññîïëäääÔÓìçåàÛ×ĸ²­¤˜¦ž•ž–Ž™�„–Œƒ¬“”èãÜÓÆ·][XOKOOIEC>9OIGUKIfZVvojytonjgXSQj[M°‡fÈ›jÚdZgŒSZvOVzIGc@@U@9M>9K>;MC>MKQpS^‚VcŒQ`„IKhG@OC9C;39;93@69>6996996/@;;SQU£œ¥´¢­£• kafcOIQG;C>6;3+>6/96/963@93E;9E;;@>>E>6C>;C>>E@@G@CMIKKCI//'3/#33#6/'9/+6//93/;6/@99G@;G@;G@>E@CC;E>9>>6@C;MC>I@@CI;6G@9G;>@;9E;6G@9KC>OEGfZXç×¹ëܼéÒ¦çʘåĊຄߺ€ß¹|㽂ìÞ½íÞÁìÛ´ëÓ¤êÒ£êТæÈ’ãÅŽÛ´yÆžn²�hq]IZSC`QCVG>QE>SG@OC;K@>IC@ME9VG;MC;SKC`XK^[QaXac]]XOQ@>9C;>E9;@>CKGQOM`fn‰ž�­¯œ´¹ Á¸ ½±˜¶–� oc‡]VrC>U;3@9/>9/>6/93/96/+9369+96693/36/66/66/9;/>6/69/96/993G>6O>3E;/@6/696/>36C9;6333//'/'/'#+/+'++++'/+'/++//+>9>KI^S]|aq�guˆ^^pSOXKEIGCOKCMQGMSKUXZj¬™³êéïééðåçí³¬ÆÑÓàÖÔä×ÖäÛÜèÝÝäů§É²²ÖÍÓèéîëëíëëïêêðçèí±¶Æ]p’Zv–ay”Zo�`lƒ|�­IQrMXwOg‡M`�MaƒMc†UhŽy‚¡¤¯ºSS]GGKMGGMKSIGKKOVMOSQKUIEK@99>636//3//3/+96/@96@;9C;;I>9C;6>63agq~‰–}�œz…��‰�äÜÙ¬‡„·Žrݹ„Û¶€Ø±vÒ¦hѧtÍ¢qË�lȘdÈ–c»�Z¸�[®‚U¤xO�lIŒgEkQC[I9]I;cK>^E>^G@^G;cK>]G>ZE>[E;[I;cG>`I@^I@]M;`K;dO@oZK††¦›˜Ðž]ÀŠQœlEG96@63C6/C63;96;6/@96>96C66E;;G;9G96G;9M@>GC9@969/9E;CgMhÜÁÒñîññîñïêîòíðòîðòíðòíððëìíæçðìíðìîÐÁÀ´²ËÁÁ´¯ª–��’Œ…ˆ~t�‡„“��œ“›åÚÛäÞÙ`]Z@>@>99;63>;;C@>j`]wŒ~vquUOEaUG­€Z¿•`¸‘^]l‹]kŽVa‡IKc@9G93963>93;;69GG`KQqIOgKSkEEaECQ>99>66@;6>99;69636>66>6;KKIœ–’»ª¶®›£ljnG@>E;9>9693/;33;63;66;6/C63C96C;>IC@IECICIQIQKEIGCE>99//+3+'33+/++3++3++6+';3+;63C93E;9G>>>9>>6>939;6;E;EI@QEEO@;9C93G>9@96E;6G;6KC;I>>XSSß̪éÕ®êÕ¬èÎ�çË—åÅ‹åÅŒäÈὅæÏ§íÛ»ìÚµëÕªêРéÒ¦äÊ߼‡Ö±y»’^¥‚UkVGZO@^M@[OCSG>UGCME;O@;KC;M@6G@;K@@SKEXOIVKGUIKQIVSIOVUdVV^SO[@>GGEZMSjox™ž“²­�½·¢¾´ž»¯•·œ‹ª}o”h]wG@S;3@;/C9/>6396369369/69/63336/33+33+36+66+69/99/96/@6/C;3C>6E@3E639963@9;C9>;9>6//'+'/'''/'/++//'3/36++3++966KO[^f|py–n|—cgvZXcKGOMEOOCKUIVkXj’z�êèîéèîæçﶯËèèïêêïëëòççì×ËÏàȪëÛ·ëÚ´êÚ¹éÜÁ騵çÕ²¥Š€vƒar�]v“Xu™Zq�]yœ^yšp„¢`v�KQrIV|K]…K`†K`€[l�ª¯¾±¿ÌUnŽZp‹MM[ECOECM@CIEEKIEIE;I936939/+'3+/6++;63>96@93C9;E>9@;3@99X[nt|Š^lu]cf]ak•Œ�â×Î̾º¨~pزzذwÛ²vÓ¨hÒ§lÌ¡kÊ kƘfÀ”a¯…U­ƒU§Z�jIyZCnSCfM;XG6jK9aI>^M;cO@ZI>^G;dI;dKC`KCcI>^G>[G;^K>aK>`I;kUCoXOxqt¿¨™Î–VÆ’V¤xIUC9C6/@93>9/>96>66>3/@93E99I;;@93E;9E;;;69>9;aIgÔ¶ÈëáçòîñòðòñíñòîñóïòòïññìïìâåìæèçáàáØÞêãæçâ㬧¢›–�“��•�Œœ—�‹†y‡ƒuƒ�zqh`VOOVMSC>>969;3663/936>99d^`‹xt�€|ulnSOKaSE©}U¿�]º�]Vf…[hŠ[d„IIh;6C933939339966;;ECCU@CS@CS;9@>9>;33>66;9396/933666933;69IIG”“”¼§µ¹¤­ytuG>@>96>;393+>3/;3/;66@96@93E>>C@EGC@MGGKEIVKOMEEGCC>6633/6/'33#3/'3/+3++63+93+93/@63@96>99;99>3>9/;;6;C;OGCOC@KC96E;3E>9C;9C66I>9I@;G>>SMQμžè×·êÔ©êÓ£éРèÌ™æÆ�äÆŽß¶wÒ²ƒëÚ¸ì×­ìÙµêÒ¤çË›ãÁ‹Ý¶zÒªo¸’`£UjZGXK>ZI@XM@XICVG@QE;UG@QG@KC9OE>MC>QG@SICUGEUGISIQMCKSISXU^Z^kQUoGG]OVpoy–›�­¬œºµ�¾¸œ¼­“´¡‹¯~u”h]}ICV>3C>3@9/93/63/3;36;369/633;6/39/66+36/96+69/9;3@93C63>@6I>6>@3I@6E@69@99@9@;6>3/++/'//''+'+/'+++6+33+//+'936GIQX`wlw’p€–gnz`^aOIQUIScUc„pv¨–¤Ï½ÆëêðèéîÛÞçÖÓàëëñëëñìëòĸÆÀ«ªêÛÀäÒ½æÖ¼éÜÁëÞÀêÛ¶âȒɯ}²ž}dfrVh‚[v’[q–[xšf~›`q�nˆ¥Vc„GQxGU|G^‚IX�Ug‹~†¡‡˜«O`†^t”`p†@@O;;ECCKCCIE@C@9C9399363+'3+/9//93/;63>;6E9;E;6E;6>66Z^rtƒ”hx…fq‚gv‹|„�ÖËÃåÝØ¯‘�Çžq׳}Û³xÖ¬oÕ©j΢kË�lÉ™f×^¶Š`²„V¨�Z�oM|`GgO@aM>^G;fI9cI>`I;dK>cKCfM@aG>cM>[K>fK@aK@[I>`K;cM>aK;aO>lVGk^Sž™�ÑŸaÊ“V·…OˆcEfK;@93>9/;63>69>66@93C;9C66E96C9;E9>I>GXE[µŠ§ïèìòîñòïòòïòòïòñíïòïñòîñïéééáãäÚßßÖÙÔÎÐÛÌÒçáິ±¦ ¥�‹‡‰„y�‡}Ž�Š�|oqnKCCGCEG>C>9>3/+6/+6/+3/3966[VOƒvt…z~wpjVSQl^SªzQ¿�a¸�cOQgMOhMMgE>O9393/////3369/363/633+/3///3+/3++6//6//9333//3//+//6/3939@@GŒ†Œ¸ª¶´¥²€|‚C>C96+;6/>3/>63;93;66C99C;>G@CGCKOKSOIQMIOECEE>>E@>C996336/+/3#//'/+'3++/+#3+'6/+93+9//9336369339/3;3;C;IE>MC>EC96C63C;9@;6E93E;9E;9E;;MKK”Š‹ÛÉ­ëØ´ëØ°êÖ¯èΙçÇ�äÅ�Öd�dGʨ‚ëÚ·ë×±êÓ§ç˘ໃݶ€Êža²Œ[ zUnXEVI>XI>XMC[KEVKEXK@ZMGUI@OG@IC9ME>VI@OEEZIK]MKZKMXIOUIISGQUM[yŽ©„–¯wˆ¥o|�–�±§œ¸¶ž½¶œº±—µ£Ž¯‡yœth„ME]>3>;/>9/>93>93@;36>6;;/96366+/6+66+36/39+96/69/96/96/;;3>>3>E9QE;Q@>CG>E@9C9696//+/+/+++/+++'/++3+/6///+'9//C;EIMZaj…kuŒnnyzn}« ¦Å°¤Ç­œÅ¥“ÛÈÐëèîéèïÈÆÔ½´ÍéêïêéïëëòììñééðáßèϼÒéçíèçíáÞäſň~ƒ‰p[º–n§Ža�y[MGOQZrXhƒ`vŽ`w’]u’g~œdz–CIhEKpEOrEQyKZ~Oa…Md‰M[~g|›Š–`tƒZ^kIIMEEOICU@;O;6>;396/+93393/;63C93@96@99E;9E>9C96OOVgtƒv��nyzhuv^``tlw²Ÿ§åÞÚš‚‘šrxÒ«uÖ­qÕªnÒ¦oÊŸgËžlÅ—g¾‘c¸ŠZ¥|S�fIvVE`G;`K@^G;fG9jKCdO@aI>gK>hM>dG>dMCcK>dIC`I@^I@[G9aM>]I;fO@]OC^MEvlp¸¡—ÉžnÁ�S«zM”lGZG;;9/;6/@66@96C93C;9C6>C;;C9C¬‚�éßäëãèðíðòîðòïòòíñòïññíññîñïçêîèêíèéåÜááÚÛ¾·º¤ £§¡Ÿ›Ž‰˜”–›–œ£¡žš•�‘ŒŠlnjIEE@;>;6696;>9;63/63/6/+9//666933KEGkfh}rt€wnqknunŸ|[¶Œ^­†VC>C@;C@9E9693/36////3+//3/+/3+3///+3'3/'/+/++//+/+///'3+/3+33/3636;3>C9Gnnq¥”�©–—‚pyG>@63366/;3+>33963>9;C;>ICUIGMGIVGEQG@I@>C@;9E;>I@CC;>63693/33'/++3/+3++/+'/'#/++6/+63/9336/69399/9;39E;IC9G>>E@63>6/@96>99@6/E;9E;6E9;IE@uqpó�ëݾìÛ¸ë×­éÏ¡åŌܷ|ŠaGz]@}ZEáÍ¥ëÙ´ëײçÌ Þº�×°zÆœkª„U›wOkVCVK>VI>XK;XMGZOGSI;UICOG>MC9OE;QGCMC>VKK[IIZIMZII]KMXKIVIS`Zh‚�¥…‘§‹˜°‡–²�™¯™—´²žº³Ÿ½µœ»¨’´ˆyœxk‹SIa>6G;3E9/;93>93>;66;66;/666693/6/66+36/99/96//6/69/96/9>3@@6IE9SE@SGCQI@KC;@>6>6///3//+'+/+//++/+3++6//3//;66>36ECO^dx‘‡”ʼ¶Ò¼±Ð´ Ñµ�ϲ™Î°§ìéîèéïáäìÆ¿Ôççîëêñëëðììòíìñíêòíìòîíñîíòíìòèéï°´·hnvZMK’vS�wU�rU`^VGCSZl‡O[zVg‡[r�Sd€ZkˆUfƒEIkEIlEMqEEcGMrGVxIUzI]…oz‡^oŽZqŒ]hqUVhVZoOQjEEQ>9>6++9/3;33>96@96@;9C9;G;9C;9@9;Z]rp~“ckvakn`nuhqykr|kpt°›¤âÜÙ˹¼ŒnvͤkÔªpÔ¬qÔ§hФjÉœg»Œ^¶‰Z¤ySŠhOy[GaG>[G;aI>hI;gM@kO>nQ@dO@nQ@lK;kMCgM>aK>gK@gMCdO>dM>dK@ZG;cMC`QGdUGyxƒŸšžÑ¥q¶ƒM¤uGdK;OC9@9/@66>63;6/;63>39jKa³ƒœîëîñíïñíïòîññìïðëíòíððëíîêíëçèìæççââØÊÌØÑÐÐËɬª¤„‡‰‡‰‰zxv‚yƒxr…~t��ˆ†‹ˆIEIC>E>9@>6>>9E;3;93>939>6;;3/;6;;66SMQtoo|ux™��–Œ‹“ˆ~’a¡}V¢€Z;96;6993;9363+/3/++/3+///+#3///3+++/+///++/+//++3++63////3/3/+3;3;;6CC;Mhch—†ˆœŠ„vjkE9>93/63+63+93363+C;>C;CECXECOIGUIGSC;E;9;E>>KCIMEGC;>6336++/3'//'/++/''++'++'3+/9//9/3;666639366/3;6>C;KC>K@>M>63;6/>63;66@63C;6E96E;>IC>njn´¥šêÝÁëÛ¸ëÚ¸ç˘༃Ƞf}]EpV>pXEÆžpêÖ®êÖ¯çʛߺƒÖ±zÛg§�S”pKoXEVI>XG>UG;VKEZMCQG;UG>OG>OE;QE>SG@I>9UGG`MKZIKXGEXGGVIOUKUpv‡��§…”®†—²‡–±Œ–«Ž—±¨�¶³›»´šº«”²Ž}¡}l‹OIa@6G>/E93963993;;69;69>39;99;39;/@6+/93;9/69/66/63/63/9>3>>6@E9OE@SGCIIEOC;@@9@6/++/+/+'////++/+'3//3+/3/3;66>6;E>Gzo�ȶ²Õ¼¨Ó¶ŸÕ¶›Õ¶—Ò´—Ö¼·ìêðæçîÖÖâÞÜæêéðëêðëêðììòíëòíëòîíóííñíìòìëñáäê|�‹UScOGIŽyZŽwZ‚o[C;EE>V`t�Va€QUlSg†OdƒQ`‚[k„KSvCIfCKk@@aEMrEKhGOwI[hr‰Ug‡Vj‰gx‹gpwdhuSZwGIS>;C6/+6/+>63;99E;9@;9C9;G;9C;6C96kr‹w‡�gy„dtwhw�oxzjrxfkqzràØ×åÝÙ­‘˜ª}hšfÓ«wѤgÑ£gÌ�cÀ‘]³‡U§�U�kM^GdO@`I;gM>hI;fI>kK@pO@gM@hO>hM@gMCdO>jMCpOChM@hO>dI;dK>[G9aQC`QGjUGhcc�‹�ض�Ï dÃ�V§vMœwSUC9@99@66@63;66C6@¸Œ¥âÏÛñíîñìîñëîñîðñíïðëîðëíîìíëæèåßáß×ÚäÞÞËÄò¤¨½¶´™•–‡ŽŒ„…‡€~y†�z‹…u€|vcd`XVUE@I@;C@;G@9C>;G>9G;9@93;>69@9>@;>C;9]SU~pwƒy‚¨�Ÿ¢”•™�‰Œy]—vX—wV;636/39366333/33/++////3//+33/+/+/++'/++++++++/#//'//'3++6/66/993;C9KG@OfU[‚kg†qjnZ]C9963+33+3/#3++66/;9>C;@E>OCCX@ESECS@9C@>IG>>VMSOEGC9@9396/+63+6++/++3/+3/'3+#9/3C;@E>CE;>9363//3//;6>E>VGCXC@I@96>66>93966>3/>66C9;C;@IGGghg”ŠˆéÙ½ëÙ´ëׯæÌŸ¯�O…cCvXEˆcE¯…ZÛ´xçʘéÐ�çË–Þ¹Ö­u¿–]£|Q–tOxcK`Q@^M>VE9VG>UI@UG>QG@MG@KE;VG9UE@O@@QCGSEG[GIUEM[KMSGMrxˆŒŸ‹’¡‡”­‡•©‡‘§Š—¯‰–©�™²£œ¶­œº«�³”€žnŒSKc>6E93@;/;63993;>96@69@6;EEEG@KG>M;3;6/66/33+/6/393@6/>>6;C9I^Qn€t‹}p€f`rICM@9@6/6+/+/''//+/////+3+/3//33/;36O>E�rqÒ¶¡ÚÁ«ÛïÚ®Ù«ٿ Ö·¢êáäéèîäæíµ­ÅëêïìêðèèíÔËÐäàçîëñîìòííòíëñëêñæçì’—¤`l]k�MMfVKQnfUE;EU`~[k‡XnŠ[r–`v“Zv‘Sf‰Qd‡]q�VjˆEMd@Cc>;SCCa@C]CIpEKtIOoIZ„K^‡SkŽ]t�]oˆ]n†GKX>9@9//936;63>96C;9C99C9;E;9C;6G;C‚Š ���lx}dovalr`ktdnnhnvdju‚tw·�¦çÞ×§¬�r~´‡^̤lÏ£n̤kÖ^Á“]ª�V—pK„dGhM@hI;hK;pO>tO@uQ@cI9qUCoQ>fK>hOCjSCqUGvSEnMCaK9aM@dQ@^I;[K@`OEdQCfZOdac��”Û¸…Ù­lÁŠS°�U‹jI^MCC96SCCVGItUkîçëñíññïòóðñòïðîæéîéëêäçìçèåÞßçßâÓÎÌ®¨­¤¡›£ Ÿ�•™„€‚‚‚…ƒ€}‰‡‡ˆq…‚~…‚zMMOCCEC@G@;EC>QC>MC>M>9I@9E>9I;9E;6;@9>C;@E>C^UX€wr�‚„µ¨«® �š”‘jj[…q`�|l93363/633633/3+//+/++/++3+'//++/++/++//++++++++#/++//+/++6/3//36/9>6@E>@yc`�ptŠlghOO>666/+//#/+'3////+;9EC>KE@VE@XCCSE@XECKC>COCCUGIK@C>69;66>36993966933936;3/@9;ICIUO[SO]MIO@;>9333//93;GCZIEVE@QE;@E>@G>@C>>G@@G@EMGKKGSZ[fklwyx‡àϲèÖ±äɘµ„Q‚cG|[@–lKÛ³rãÀ…çÉ“åÁ‡â¾ƒåÌŸÞ¾�Ú¶ƒÁ˜aªƒU§€U‰pMu`IoZEaO@VKEQG@ME;M@>G@;MC6O@9SC@UEEUEGUEEUGGVGIUEGVUa€‰–„� ‹’¢‚�¨ˆ“¦�™«‹–ªˆ“§Š–²Š–®�š³¥–µ˜…¤ƒt’XSg@6C;3@;3@669939@69@9;E;COOVSOdOGUE;I6//6//9/36/33+3G>Iž� ËÃÌçåêãàæÞÛáÈÅΩ¯¼�Š™GCQ3333++///3//3/+6/39//633VCGɬ™ØÀ¨àɲâκ´›ªž‡ Þ˼ͺ¯Ì²¸îìñããêÚÞæáÞçíìñîìòÓ¶°èÛÂâѽƯ¾æäéêêðêéïÒ×Ýœ¥±`kƒVatXd†t‡žu…•QS`k€�ZfxS]oSZpQZrO[wXk†Of†Qg‰O`�Xg„M^€;9I@@V@Cc@>U@C[CEjGIhCKpIV|K`†QhŠXlŠUg€ShƒOVp;69936;3/;99>63>96@9;C;6E>;GCGƒ�¢��Ÿ~�žw‡�v‚”n~Œjw€hrx^dd`acjcdš}‹çßÝßÕÑŠoƒ�lk±ŠdÈ�dÁ“Z¾’[¶ŠZ”pM€aGdOClO>hI;oM>tO@jQCvSCcI@aI>gI;‚XEƒ[@�XG}XEwVEjUCfM@^I>ZK@VMCXQI`MGlZOhVMqv…ƒ|y¦‚h®„a‹gMaKEdIIaGChMOqUcÉ¢´ñíïòïñòïñòîðñîïñíîëåçèßâÝÕÖÜ×ØÇÆÅ¹²º«¬±™™£‚„ˆ…ˆ‹‹�Ž}t}yt‹ˆ‚nphG>EE;@@99C>;@>@E>I>;@@;I@;C;9C>9E>9G969>69>69@;@E;;VQM}qw‹}‚¯ ¢§� ”�‹[a]�€�¤”•9666//3/33/////3/+//++//3+'+/+/3+///+/+++'/++/+'3/9+/#+'#//++///++;66I@G�hn�njŠlfgOO@993/+3/+3+'3++3/+@;GE>MC@SC@QC>SC@OC>CE@GOCCOEIKCC93363393/>99>69>69936>99E>@QKU[X^ZU`QOV@;C9/36/393;E@QIGVGEVE@EGEKKISGEOOIQMIUUScUUhaj}rz‡xx…п§áƔˢj”hGwZC�`CÈ¡pæÉ“éΜèÌ–åŠᾅྋãÈšÛ¸‚Æœf®�O§M”vQ„kMzdGkUEhUG^QEMC9M@>G>;OC9QGCZKEZIGVEEVGGXIGVIMVGOkhv„Ž£ˆ�¢�‘¢‰“¨ˆ�¢‹”ŸŠ”§�˜ª‰–°ˆ–©‹–¯••°™†¥ƒu’]VrE9Q>3K>3@636663;66966@9@SQZXSfUO`E;I9/66/36+33//93;Ÿ”�ßÛãæäêèåêàÛߨÔÙ¸ºÃ“˜­ŒŸV`u/3/3++3333//3/+933936;69™zrÜÆºßȵåÓÆåÔÃŰ²¹¥°ÝËÁª‘¤¼˜¯ïìòáâêÇÈÖéèîîîñîìñäδíÜ»îãÌÜȺȲ»ÝÕßæåꤪ´rxˆZh`l€l„š|�œjy‹U^jMQdOQlQ[uQVrO`wS^}Qc�M`ˆMa‚Qg~XkˆMXtCGdCC`@@[@>UCCaCGjEEfCEoGOvK`‚Oh�Ul‰VkƒUkŠVg€;;C966933;63C96@;9E;EG>CE@EG@Ex�—~Œ�wˆ–p‚�o€‹nyƒclq^fc^]]^aaa`^vozŪªãÚ×¶  ƒh|ƒ^`»�fÁšdÀ•`¼�Z›pM�jGy[GrQ>‚V@qS>nI>lM>qS>gK@gI>oO@Š^G„]C‚VC‚[EyVEjS@fO@]MC]K@]OCZK@dSKcSKdSGoqrprwvru‡fXrVGfMG]GCQCCqSd¤x�ìáåñîðñîïñíïòïññîïðêëîëëæßßÝÖÛÌÄ̸¸¾Ÿžª�š ––ŸŽ��~€„„ˆŒ‰ƒ~un‹‚xw€yC6@>6;>66@9;C@CC;C>9>>9C;6>96;;9@969633;39>6;@9>E>>QKMuovŽ�†ªœ� ˜–„…~Z][šŠ�­™�63/3/+3//6//////+'3/3///3++/3++/+++/'/'++/+++3+++++//'++#+''''++'#>69QEI†hl˜vv�lggQS>33//+63/6+++++33/;;IC;IC;OC;I@@QC;IE>EECCQ@GE;>>96933636;66;96;36;69@9>C;;E@CQKUXX`[`qVZoIEZ>6@;6>;69C>MECS@@IGGKMKSVVaZ^h]`o[^r^`n`fuht„o}‡q|‹tt‚vlhc^XŠgKظ‚ä˘ëÖ§éÓžêÑ¡êÏžåÄãÀ„Ø®rÖ³ÞÂ�Ô¯xÀ–aµŠU§ƒVŸzV˜wMˆjK|gMn[IM@6K;9MC;K@9UE@UEESGGVIGZGCXGESEMVKSyŠ˜ˆ‘ †�œ…�¢‰�žŠ�¢‹’œŒ“£‹“¤‚�­…‘©†š±�–³��°�€ ^XuC9G;3>>6G63;969933>6>E;@VQXZVjQOhE>Q;39>3>@9Ex… †š´ÃÃËåßäÞÚÝÏÌÐÐÌÓËÈÑœ¤´vƒ–r�–y„‘GIU6////33/333/6/6C6;‚a`Ûųç×ÊèÛÏëÞÑåÙ×ÞÓÌÁ¦­ÔÃÁÙÈÃèÝÛïîòÖ×஥ºëêðîîñìéìïèØíàÁîãËîàÄØÇ¸°§¯–ž¯dl~`juat‰lw…akvMK[GCXKShQ[rQ]yQ^~MZ}M[yQ^O]q@EV>;@3//;6@IMhCEhK^K^�@@[@Cc@IhCE`@EfEIlCIfIVzO`ƒSd„Sgƒ]l„Xh|C9@>69>;;@;;GCGKGVMO[KKUXUZgkodlplu|hqvhor^df`cd[`d]^^^a^fd`dhjllupadƶ¬ÖȯŽ��do²ŠfÊ¥n¶†Z´ˆ[®�S•gGËŸc¤zOkO@vUCtQ@‹ZGΞlÊždtQ@‚ZC€[E‰aG…^G~]IpUCjSClQEhSGaIEZIGaMM|VX�a^zjfru†jpzunrhOEXE@G;>K>>È�±ëßäñíîïçåîæâëßäòìîñìîîèéæßÞàÕ×ÎÈɺ¹ºª«°•š£Ž•œ†ˆŒŒ��––”“�Œ�‡|^`X@9;>9>@6@@69;66G>@E>C@6C;336/33/+///3+//+'//'3/+>66C>EIEKIEOhhn‰~‚ ™��އpxxXX]—Ž�¯ ¤//+6/+3////+/+///+////++++'/3++/++++'3'+++/+'/+#/++33//++/++'+'++'E;9ZKG�ol–xu�rjaOO>666//33+3/'/++3++99>>9>>9>>6@96E>6;IEKMGMZII@966/+3//636966;;3>9;>6;>6;@>@G@EGEMMM]MQjSUjIIcC;M>6E>9CC>IGGXCCIMMXOQ[X]qZcpgn|]dwcn|`j€fq‚pwƒkw‰ck|MUaIIQ¶ |êØ°êØ®êÔ¢êÕ¤êÓ¤éÏœæÇ‘äő۱tÉ¡j½�^׸�ЪrÉ hº”^´Ž[®…V£Q zQ…lQOC9UE@I>;I>9UC@QC@UGCUGGVGKUG@OGKko€„‹“‰Ž›Š�¢‰’ª�“¢��œ��™Œ�œ‰‘¢‡�œ…”©‹–®Œ–ª�š¯�–±a[wC9K>3E;3>;3;939;33>9;E>KUO]XUhUSfq^v�“£š±™œ¶n}•Xj…Xk„¶µ¸Ã¼¶��š�”¥¡Ÿ¤Š“¡u…—t‚–v�•gp‚IIS33363333/>39¯Œ€ÚñæØÐêßÛìâÚîèåèÝÛàÒÌʪ²Å±¶áÓÎíçèîëï½ËÀºÍèèîíëïëâäðç×ãÔÈëàÐîàÄØÀšzd^ggw^fw`dygp�MQXGEOIG^U`�Qaƒ[d‡XfˆQc‚O]vGEQ@;C9/93/39333/+;36>9G>>U@>SEE`CKf@E^CIkC>XEIhEKf@Ed@MuGV‚Mf…VkŒXl€Vk‡Xj€ScuGEUMISMMVUUgXZgSVh’‹Ž¶­ŸhlcSX^guxo|‡w€†w€†o~ˆq|…nuyoxlt|tuxy}‡�„�À¯¨àÕϯ—›u^drZ[Ä™dÈšgÕ[Ó¤l„]@rM>„]C‡VE¬pMã¼~¤wS|SCuUE‹^G‘cGŒcI†]M�j^­„qÁš€¿œ…¸•ƒ·�ˆÈ¦¤ßÓÈÎÁ±¸ª�•…~˜™˜†Œ�kr€rllcIEZIIvOUêÙÛíäßíàÙîçäêàÞíéêðêëñîðìæâŵ·ÌÀ¼�ž�‹ˆŠ‘Ž�“˜¡–›¥�Ÿœ��”‘‡„”މ…І33+3//6/+;/99/9C@GOM[QKVKEO>6;3////'++33+///'+/'3/+;69ECIIIXOQ`no|†�ˆŽ�˜yyV[[UMZ|}„“‹�/+'//+3//3///++++'///+///+'//++/+'++'/'/++/++3++3+/63/3/+//+'++/+'E@@[OM“un–upˆlcaOIC9663/33+3/'//'//+96;@6E96;>9@66;@6@OKQZS^aSUC96/+#3/+333933;99>9;@9;@9;E>CG@GIISGGUIG[KKcIKfE@SC9I@9EC;IG@QECOMIVOQ]Z^nX`r`cwZ^p[cq^cy^k}dq‚gq„afxUZgMO[¡�wêÙ³êÕ£ëÕ¦êÔ£êÒ éТçÉ–ãő۶|Æœhº�^´‹[ضÒ©oÆŸh¼•`·�]¬†[¹•a‹nOXG@O@;K>9K>6QC>QE>OE@UGEXIISGE]Xd~†‘ƒ‹“‚Š•‚‹Ÿ�‘�‡�™‹��Ž�œ…Ž¢†�£ˆ�¡‰–£‡“§�˜¦‰–¯�š²jcI;VC9OC6K@9E;9>>69C;CMEV]Zlf^qtf~ÐÈÒãÝãæãéÜ×àp~œKSrEGcacvˆ�œ“‘�x‚›}‡˜|‡™yˆ”}‰›wƒ•pyˆUXc3336//6//C6;Ó¶ŸáÒÅâÏÏîæäîçæíæçèÝÜÙËÉ̯²Èµ»ã×ÒïéêíéﶬÀÈÈØååëèæëáÍËïæÔÚÉÍÝÆÂëØ²È¤nw^O[]ta`yaj€X`oKIQGCVMXx^jŒpw˜œ¥¸n…“U^pE@GO;>Z@ISCGG6>E69@6>>9;;9@CE^C@Z@>UEM^CGa@@aCCaCId@E^@CZCMpCKqGVwQk�Zp�Unˆ[o‰Zn‚OS^US`VZnZ`v[an[`hˆ‰ŽÙÑËœ›�@;;IMSZ`cpu|v~Žu‰}ƒƒqy}ty}lrtzyyy€„~‚‹phkª“žÝÓË�hrv[`œoZϤlË›`Á›d…VC qOŽdG´yOÖ¤gÙ²u|Q@}VC–fKŽaGŽfKˆ`M­€q™ŒÎ¯œÏª™Í¨˜Ãž�غ¾çÛØÔ²®™‚�Œwª¡•Ž‚€•�‰€†�kotnXVpSO¨npéÒÌíß×ïåÜíåáëãàëäáîèéðêêîééǾ¿°§¨‰†‹ƒ‹Žy|x‚ˆ•–—™–šžœ�›‘Ž˜Œ�qrg33+3//3/+9+9936GEOUSgUUcKGV>9;6363+/++3/'//+'/+'3/+;69GESIGOSXlou„‹†•��œfnkOQUKGMur‹ƒ‹6336//6/36/33/33////++///+'//+//+/+/3333369/@>6>;6@>@EC;I>6>639;9>OIOhZj”wx–th‰l``KK>633/'33+3+#3++3/+669>9;939>9@99CCCKdfozw‚wo|KIM96/3+'//+33'99/;66@69@6>E@CGCMIEXKK^IK`KIgGEXECXC>MC9EE>ME@UGK`MM[MK`OQ`MSaQQ]OQaQScKQcMUfQUaUZfZao`jxdjxŽ�é×±ëܹìÚµëØ­ëÕ¨éÏšçÌ›åǓ۴yÈ›f·�[�jEŸyU˪tЪlÇžhÅš`Æ¢juZG]K@O>6Q@;K>9K>9K;3O@>SC>SGGSECMCI}€…�…Іޖ‚�›‡�š�’¢Ž”Ÿ‹‹•�‘ ‡Ž ‹Ž™ˆ�œˆ‘ …�£ˆ’¡Š‘¥ˆ—±¯²ÂÛ×ÜÙÖÛÔÐÙÔÐÙÕÒÙ×ÓÙÕÑÛÛÖÞáßåäâèàßååâéäâçáÝâ×ÒÙœ ­hq„@;S>6IC@Qq~�r}‹z…Žxƒ�}ƒ‘y…’~ˆœy‡–ty€EGM>99966¢}tåÕÍéÜÒàÊÖñíîñîòïìðéÞᬓªÝËÆÒÁ¼ä×àïìðìéíŽΪ¦ÀçæëåßäÞÆÃïçÜêéíãÝÝÔ®rÄœh«ŒaXSchjy]aqKOcGMaOUqpt�ÃÁÌ·¢©¢y~™lgœon©}|Ϫ¢ÑªšÈŸ‘·’�¤„‚o[]`OXVMQ@>KECX@;K>6M@C[>>`CC[CE`CGf@IgCQrEIgGUvIZ~OaƒQf‡ZlˆXnŠ]j€|wkpttjn�kn‚cjtª¢¥ãÝÝäßà‹�~;3/;3/33/@>;IGGZ]^ntwltzjuqcjfVVS996USaho€©™¢ÞÔ襤x`k¤raÌ n¾‰]Ïžf”^¦vKݯrÞ·zV@ªpO¿�Z�aE”fS›qgÒ²§Ø¹¤Ù½°Ô¶ªÓ´¥Ñ²§Ö¶¯åÚÏɶ¡¶¡‘Ë·¤ÏÁ°Æ»©Á±�º­–‡Š„|€‰‘jrÃ��ê×ÐíÙÐëÖËìÛÒæÑÂäÒÈèߨÜÌÈÙÈÆíéëÝØØ³®­‹Š’„€~‚€|tvutrqyv�Œ�¤�¤‡Š†9/33////+//'6+3933;6;V[nV[hMES>9>6/63++/+/3++++++/'/+';69EGUIK[U]n€ƒ“�ˆ”Œ‹•UZ]C@CICIplw~yŽC;EC;EC;E@;K>6@9369396399369369363369>E>;EE>OGG`IGZKMfMIZKI[IIXOQ`^]qpfo�rp’ql…g[]GEE996//63+6/'6/+//#3/3933>9@C@KEGSMSgvƒ’–�œ›�”jhpIEI;3;///3/'//+633936@9>G@CKEOIESIGVKKXII^GI`ECQC>K@;I@>EIIVIOjSSgMQgKKXEEQG@KGCMGCSG@QIEQMMZOO^Z]rjr‰jr…‹‚èØ¶ëÜ·ëØ¬ëתëÓ¤éÒ èΛåȓݸÚc­…X…fEtZCy^E¥‡[°�`Ÿ‚U€dGq[Gu^IgSEQ@>M>;SC;I;3K>9I>9KC@OCEtx}ƒˆ‹„…‰€ˆ•‹�›ŒŽ™‰�™��™��—‰�›Š�¤ŠŽœ†Ž ƒŽ�Ž“ ‹‘£‹•¬‰’©Žš¬¥®Ä¤©¾¤§¼¦ª¾¤ª¸¤¨»Ÿ§¸�¥»œ§¾¬­¼­±ÁŽ•«±´À±³½®²Á¤«ºƒ‘¬V^w>6M>6ISZtku�p|ˆ|‡—v„’v‚”�Š—‰–x‡MMQ936E;;ÜŴ͵Æä××éÜãòïóòñôòïòïéè¼™¨¿š¨Å¥«îéêðìðêåëåßæ¬ »ëêðáÓ×ìßÕêÚÊêéîÐÎо˜h²}U¯UXEEjjuZ]kIGZUXqrp�ϸ¾Ü·¬Ö¬œÑ£œÓ¨œÔ¨£Ð©¡Ë –ÉŸ�À–Ž´Š~ }pu^^kUUgU]UGS@;C;3999K>>[@>ZCCS@GkCIg@OvCKkEIoEKuEQrGSqQgŠSc�UdzXkŠXf�ak€otvhnyjlp¶¯²åÞÝÓÎÅÛÒЬ£žvpj>999//9/36/36//6//6/+3/+633GCGXX]VUZXZ^�zvÑÀ½Ëº¼€fqvV]Ò¤nÓŸ]Ë›[§rKÇœd‚[C²wO±|Q–dEœgS×¶¥ÜÁ´Ù¹³Ù¾³ÙÀ¸Õµ§Ñ²¦Ë«¡çÕÏÇ«‡½Ÿ�ÏÀ²É¸¡¾­œÅ¯¢åÙÔéáÞ�…„·�ƒèÏÃìØÐìÙÑéÏ»èÑÅéÒÁÝÀ¯Ö²œÉ©›´§�¯¦ Ð»¸àØÓÓ΢�¡–˜¡‹�œˆ„~‚zr|qg…w‘އV]X6///+++++/++3+/6//3//@>GKM^E>M>693////+''/3+/+++++'3++6//CCVIK]V^u€„‘ŽŽ …Š‘MQS>;9>9;^^gnlwICQKE[I@XG@SE9I@9C;9C96@933>9;;9996>>;IC@QGCVII[KI`KQgMKaMQcMUjX]vff€wn�tw�h^…dV]KI>6633+63/6/'3/+//+636936@9EGEZKQhS]v€Œ”œ–¤§ž¡wzƒUX`@9C6369/3663663;69C;GGCKKGQIISMMZMK^KIcEE`GGXC@QECSGCUIGZKUqQMcQKcIEQEGZE@KGCUIEVGCVIEXQQcQQf[Znflclx‚xtéÚºêÚ²ìÛ²êØ¬ëÓ¦êÑ�çÉ‘åȑܷ~¹�]¡|Q€aGvZEw^E~aI…cG~^E„cGu]Ey]Gx`GcMEQE@O@9I;6I;9I>;I@EUKS}}~„�€‚‹�…�ˆŽ“ˆŒ˜Š‹’‰Œ’�†�Š��‹Œž‰�¡…�œŠ�œŽ�Ÿ‡Ž£Œ“¤…”ª‰–ªŽ›²Œ—±�”ªˆ•­ˆ“ªŠ•¬ˆ–­†“¯‡š­‡‘©�–®‰”§‘–¦–šª�›«¤¯À‘ ¸oz�C9O@9IGG^n�–nu‚z„‘xƒŽy��~†’~†Š�…ŽKOQ;66cIIßÌºÛÆÎåÖÛéÝäòðôòñõòðóíççäÔÎãÐÌä×ÒðêèðìîéäèëçìÆ¼ÉæåìÞÇÉïæàìàÓçåëËÇÉ›|n²|X³|VrSGgcrV]pIKcca�©¥¹Ý½´Ü´¤Ö­¡Ü¶®Û´®Ú¶³Ñ«¢Æ˜ŒÁ—‹·�ˆ«‰ƒšyot]flX]gU^XKUE@E;6>>9O@>Z@@U@CZ@GhCKgCQtCQtGMpCElIQrKXvSa~UkŒSfˆUk‹Uc~M[qog`uu|kjo¡™šêåæäßÞ¸±žº´®ªŸžhc`C>>>669//6//6/36/+63/933]V[VMQSKQMKOVMMŒuxèßÜ•t€…cn¾�q×§c¼‘[¸V’fI‹XEÏ h£jI kKÇ•�ÞÁ´ÝÁµÜ½¯Û¾¯Ø¾³Ô´¥Ì­žÉ¨ êÞÞɨ�ׯּ£Í·­º§œÊ² áÎÆçàܯ�‡âźì×ÈíÙÉì×ÊæÆ¶äźèϾӭ™È �“tj’„€Ÿš‘¦“•ÒËÄú°�Ž�™œ¦•™¥‘�‘”ˆ‚Š…y}ypppd@>;6/+3///+'/++6'33/+//+;6>GCMC;K;393//3+'+/+3//++'++/3++6//@@KKIXV^r„��ˆŠžzƒŽIKM966933SS[ffqMM^KMaOMfGGUEEUC>I>;G;9@>9;;9;>;C>;E>@KEG]IIaKMcIMjKSdOQgUarU`tak†qq�zr„ŠokŠh^€cS]EC@9663/63/6++3/+33+639>69C>CGI]ISkU^tŠ� �£¯¤­�ˆ‹noqMISEEKGESECKKGQMGSUM^VXdXZl]]k``yZ`vXZuIGfGEXE@QIGZKQgOQlKM`OOcMM^IK]MM[OOZKM^KIXIGXGKUOQZMQaQXfQS]MQSk[UéÛ¿ìß¿ìܶëÙ±êÓ¤éÓ§æÈ�åŒܶ|­ƒX™tOy^CqV@x]@p[Et[EqU@|aEu]Ix`Ku]E~aMycK€rZK>9C69G>@khhvut�~x~ƒˆ„†‡†‹�‚…�ŒŽ�Ž��…‰–†‰šŒŽš‹�–�Ž”…ŽŸ…‹˜†Œ•‡Žœ†�œˆ�—‡’¤…–²ˆ•®…�©„“¥„”ª�›¯…“¦„”­ƒ–«…’«‰”¦Œ•«Š–«„�¦…�§Œ—©ˆ–¬��¤fo}II]MKkz‡–z‡˜ow„v��w‚�~„Œ€‰”…‡‘SU]G99ª‰táÐÃæ×ÙèÚßíæìòñõòòöïèëݽÇíæßã×ÓɨºïæÜëàÓãÛáëçëæáåÏÐÙêßÓðëæèÙÉ¿¹ÁÅÆÊ�£§¨xX°|S›qUK@OOMZKKa´©´ÝËÇåËÄâÀºãÁ¶ãĹܶ¬Õ®¤ËŸ�¼—�¬…ƒ¡~u‹qr�klychkVXpZ[cSU9369/9>9O@C]@@]CEa@Ek@Cd@Id@IhEIhCMqGX|IXvMc…Mf�Oa~Oa…Sf‰M`�G>K‹wX‡vS’‚tØÏÅäÞÛãÜÜÀ´¯œ”’ooftqkullVQUE>EC9>OCC‘ja¸ŒÜÁ ÝÀ–Ö·‰Àž|¦€d£wd̤œå×Ç˯�¯‚†¥lQŒXI»ŽcÅŽ`Û¬qÔ£g¾Š[†cßÅ´ãɾàÉÂÜÀ´Ýļ׼¸Ôº¯Ò³­Ùº¾ïééäÖÅáÒÄêÞÔçÛÐßÐÅ×˺¶¢‰·‰|éÓÅìØÐëÔÊêоé̾æÉ¶ãŲӨ•¬‡r�rffOI[ICXGC^OVha^~wjvuqorq}‡““˜š•—•”–ptp3/'//#3++//+///++'3'/3++/++3//969C;O;396/63++'++3/+/+'++'/+#6//>;EECQ]^q€��…†–xz�E@E9333+/[Uatp~IIXGE[GGXECSC;MC;E99@639936669;99669@ESEG^II[II[KMdIMZOSjZaw[g~ao‹kq‹qp„‚kfƒ]U}ZSXGC>696/+63+6/+6//63/;6>>9@>9C@>KCCSMZhu|†��–¨�ž€‚ƒgnpOQaOU^QVgQX`VXdXZg^akfjkfjvhnhlydk|X]pQSlKKXIIaKISQUnSVjKQkGGSGESUZhkovwqxooy[dpSVkKKZQScSS`QQ`ECE@>>ydOéÛ¸ëÜ¸ëØ´êÔ¨èÍ›åÇ’åÃ�ãŠῆ·Œ[�nMx]C|^EvZGoXEoV@xX@u[Ey^Gw[Iv^Gx^Kr[MkVGwl[pj`rlhxwtuxv��ƒ}€ƒƒ‡ŒŽ�‰‰‡‡�‰Œ›…Š”‹‘›Œ‹™ŒŒš‡�š†Ž˜„�™„�š„�›ˆ’¤†�¡†�Ÿˆ”®�œ²‡“ªŽ—«Ž–¬Š“¦†�ª‹•§‹�ŸŠ”§Ž“¨‹•«Š�¢‚�£†�¢„“«ƒ’«u}†nr}n�w„Ÿz‡—w„”owzu~…zƒ�}„‹ƒ�jjjx][γ•éÜÎëââêÞäðîñòñõòðôñîïìãÝÒ¶ÀÜÇÃêÞÝîäÖ䯤ßÖ×áÙàëæêËÁÕÝÛàÒ¸Àʰ�pr�›•¤´²ºdQXŽkO¥uSO>@ECISOdÞÐÑæÌÃäÆÄã·äõãú۶§Ð —¿”‘ª‚u˜yo€g`}c^|`[r^cp[`oX^gXX>6>;39CEd>;M>@UCE`>Ca>C`@G`>E[EGaEKoCOtGUtM[M`M]wM^vQc€OawKVtzoX‰vZŽw]ˆq[h^cžš–À¸ªÁµ¬¶­«§œž�Š�j`]t[S£ujä˪ì×­êÒ¥Þ¹‡à¼ŠäÁ•èÉ›é΢éÍŸëÒ¤êФëÖ´ëÔªéÔ²èϤäË ä̧äțغ“Μq䯣Ý÷áÇ»ßÅ¹àÆ¼ÝĺÜÁ¸Öº¯æÒ×ñëíïéäéÝÒêÝÓìÞÔíâÝëàØÕ÷‚ha›qtèÐÁéϾçË¿éÑÁåÉÀج’Ê¡Šªƒv}aVfOK^KGVGC]I>XGKMGIVUM]SOrqk€yp|vr�„|’…vV]]3/'//'3++/+'++'++'3'/3++//'/////+C9E>6@6333/++++3/3+++++'/+/3/+>9EGCO^aqz}ˆ€Œhp|@>>6+/3/+`Z`yxƒGEQEESE@QC@OC;K>9C63966963396696666>>@I@>QECUII]KMcKQ[SVg]h„ak�aq‡dk‚gn~hf†d]`UZGG@6963/63+9/+936663>9C>6>>6C@9C>@IOV^ƒ€ƒ–�“ ”–z}€afjMKVOQ[SXcUZfZ`h]gtghrflwgkwfowfn~ahxZ`uOUkKKZKKdMK`QUcSUhMQcKKZMIZgkq��”˜’›–�—uw‚fkxV]p]cx[av[ZpEES@>C‹tVéܼëÝ»êÔ«èΚçÊ–åÄ�äÁ„âÁŠâÁŠÃ™f•nKwX@y[CpV@rXCu]EuV@z`Gu]Et[Iu]Ev^Mq]InVCxfVŠx`š‰zuovwv}€~~�|€�|„Š‰ŠŽ†‚…�‰‘‡‹–ƒ‡�‡‹“ˆ‰�ŠŠ�Š�”Œ‘˜ŠŽšƒŒœ…‹–…‹š†’¥†� ‹•ª‘›¯Š—®�—ª�–¥Ž“ž‰”ª‹–¨‰•ªŠ‘¦…”¦‡“­ˆ� €Ž¤‚�¢ˆ’§ˆ–¬‚�¡nx�v}…r„”y„“|†•qv…gltv�y€‰�ˆ�lpk‘rj׿§êÜÉîççëàæñïòòðõòïòòïðåÒ×éÝ×ìß×íäãîäØãÅœÛÉÊÛËØèáåßÜäÚÜàÞÚÞ�w†^]f‡z�¿ºÂnalfMK¥wVUEGG@IaVláÎÌçËÂäÅÈãÀ¹ãÀ¶á¾¸Ø­ŸÐ¤–¼’‚ŸyqŒkfq[Zr[]p]ZpXcv^cp`fdVX;3;>3C@Cc>9O;9MC@Z>C]>>Z@Ef@G]EIfEMrGOoKVwQ`‚Uf~QdxQaxQ]wK]zM^~XMEqhO}t[€uXvk]rwˆ€x†„| ›–¬¤�¬ž›©��Æž‡àƧìׯéÏ¢åÃ�âÀ�åÅ“åÃ�êÌ¡éÉ“êÏ¢éÍœëѨëÑ¥êЧéË�æÉ›Þ¼’ݽ�Û¸ŠÐ´‹È¥|ϲ—ÛöáÇ»àÆ¾ßÆºÝÀ³ÝÀ´×¾¶îåèòîðìäÚèÜÏêÞÖëÝÔìáÝêßÖ×Ųu^V—hgçÏÃè˺åÅ´æÇµÞ»¤Ï¡�¹Œ‘n^cKE[IEZGEVE@XIEXGIOC@OGE`XQgcXzuk€wl~vjrod9933/'++#/+//+'/+'/+'3'//++++'//'++'@3>>9@;393/+//36+3//'++'3++6//>9CECK[`pww€z~Œfju>;;6//3/+[Zgzv~IIaGE[GCSGCVC;I>6@339//63//63333333;;>GCCXC@SGEVKOgOVkU`z^n‡`k…Zk]cvcgu€rt…nl�d`fOKE;;963963@69@6@@9>>>@@;G@6@>9>;9>UX[�Œ‘¨œ ªœ¥ˆ€‡kjnIIUEIQKK[V[^[`j`fodlxgoyglzkpz`gpZarQShKM^IGUIIVKKZOO]SSdOSlKQ`SUf}„й°µÆº¾Çº¾§ ¥—“—t}…nx…ow‚fl}OQ[@>@ufOçÔ¬èÏ�èСçÍšç˘çË—åÅ�äÅ�äőײª~VuUCwXEuZEpXCy^E~]E|]Ey^G}`GzcKx^IvZKr`KoZIdOGÀ²§É»²­š–ˆ�€€zy�‹†�~~„|}z†…†ˆ†ŠŠ‰Œ‰Š�‡Œ’ŠŒ“Œ�‘ˆ�™�Žž��—‹�šŠ�š‰Žœ‰� Ž‘¢Š’£Ž˜²‹–«Œ–«‹Ž¤�“¨Š•§‡‘Ÿˆ•¤�–¥…’Ÿˆ•§‡”¦„‘©†“¥…�£‡‘¢|Œ¢uy‚u�w€�y„�}…˜}‡�qx€kkvljr]`d»¡�àÈ­ìàÏðêçëáãîéíòðóòïñåËÒïçâïèßîäÙìåäîã×áÄœžtdæßàÜÍÔêåçÌÈÕÉÀÎÆÈÐlnwŽ„ŒÒÓד™ adlŽjOVEGKCO„n~ãÆÃæÆ¸æÈÆãÁ¼àº²à»³Ø¯§Ð¥ ¶†€�jgƒ`arZ[lVUq[^y]a€cat]agVU;33@;I>;Q>;O>9Q@9I@;V@@Z>CV@CUCC`EMjKZqQZqScuSdzQ]uO[pO[pK[oOZnQ^rQ^tMOjKCXMGS„~v‘‹’ª ›��ƒ¡xlË¥“íÝÃíÙµíÙµëÓªçÆ�èɘèËŸçÈ•éËžëÍŸçÇœçÆ•åÃ’çÉ›æÇ–çË æËŸæË äǜضŠÎ©|ŧ~ª•pŸ‹n~p`¸œŽÎ¶ŸØ¼²ÞÁºÝÁ¸ãÌÎñîïðìëéÜÎéÙÎêÜÐìÞÔëÜÍêÝÓß̶”}p�`dæË¸á¿©ß»§Ý¶¥Ò©�®ˆr�l`jSMXECVG@ZGE[G@]GCXCCXGCVIC^MGul]pcVf]S9633+'6363/'/+'/+'++'++'/+'3+//+++++//++/'6+/@;G@9>3/'+++/+++++//+3/+3/+96>C@KV[ktt†lt„U]c>;@6/3/+'QOQup~IG]IGVC@S@;K@;I>9@339//63//66/333//669;C>OEEZKQcSUnX`y`k€Zg‚Xg€U]vXarntz›’™°›š­–”Š~€f^nSMXOMZQScSUhOK^ECO@;E>9>>9C;>Crw~« ¨²¨®²­­‹‚„rquOKU>>CC>GKQV`co]`rdl|hpwjnzgk�^coZ[kMO`EGSGGXIGZIIZMK[OSjIOkKIVQV]†ŠŒ¾³¸É¾ÅÎÂŲ¬¯œœ x†py�ow‡fo‚KM[>@CG>9àÇ‘çУéÓªçÍ™çÉ’æÊ’æÇ�æÇ�á¾…Ý´uÈœhw]EyZCqZCu^EvX@}]C|`I~cGy`IwaEu[IwaIw^GcQCr]KZIC²¦�×ÐÎÞÖÕ§  ˆ†‚~||€��~|wƒƒ‚‡†‰‹‡ƒŒŒ’‰Ž“ŒŒ–‹Œ�‡Žš‰‘œ‰�œŠ�œ…Žž‰�–ˆŽ™…� ‰�¢†‘§‹–­�–ªŽ”¤Œ•¢‡‘œŒ�œŽ•¤Ž”Ÿ�” †�¤Œ–¦†‘¡‚ŒŸ~Œœ‡�¡€ŒŸhr�r}Šv€ˆ}ƒ—}��|ˆ�w��x†�~ƒŠOOZ̰™â˰ëÞËïéåðìêïèéíãäæÐÔñìçñéßîãÔîäØïêêíåßÚ¸”[OÆ©–ãÛÚÜËζ¯¶¢£§Ž� xzƒwt‚yu€wƒqw†QCIcVMI>G¼¤ªçÌÇçÌËçÊ¿ãøܵ¨Ø«¢×ª Ò¤™¾�†�qh€^[pV[hV[lZ]|]]~``|aa^QQ>6C@>O>;S>>U;9OC;Q>E^>@X>CUCGcEEhEKoEMcIMfIK`IIjGI`GMjIQnGMhEKkEI^GIaOOkOQqS]zŽ~� …–njÛ¼©îÞÇîÞ¾íÙ³ìÕ­ìÕªìÔ¨êТêË›éÌžé΢êÍ¥ëΡéÊ–éÊ›èÉœçË èΠèÌ¢çËžåÉ�âÆœß¾ŽÛº„›�c”„aˆxal`MfZOqaVŠqj¸•…ħ—çÛÙëãÝçÙÏìáÙëÞ×ëßÕêßÔëÝÖéÛÓåÓÄʲ�§ŠuÓ¬˜Ý»¥Ôª–Ï¥‘°…o�fZ]MI`MIVE@ZE@ZECdIC[E>]GGXE>[G>aKCUE@]IEVC@I9;E66++'3++/+'3+'++'+/+++'/'+/++++'++'/++6'3>6@@;G6/++++/+/+++++'3++/++639;9ESSdjo€ho€X]lE@M@9>636KMQjgqKG[E@MC>M>9C;3@966333/333/+63333////99>C@XGG`MSfS[zU`|XawX`yU^wQXoVatpy­¦¬Ã²¸À²´¢˜Ÿ}v�fjrVXhZ[o`crXZlIIXC>I;6;;3>>;C‚Љ¼­ºÄ¶¿¶¯°Žˆ†rpwSOX@>ME@ISXc`dqgkzgoyjp|hquhlw^aoZ[kKK[GGUGESGGUIGMOMVOScMMaKO[MSX…ˆƒº±´È¾ÁËÁÄ®ª¦™™Ÿw€†jzƒky‰ahxIMS@@G>;9Ø¿�æÐ èÏ èОèÌ–çÌ—åÅ�äÅ‹á¼~ݵvШvy^CwZCxZCr]Ex[@~]C}`Gx]Gz`KzaGy`Kx]GkVCnZEw^IUG@SEG~rtÜÖÒ¶¦§“‡Š€‚Šy|x~}y‚‚€†‰‹†ˆˆ�Œ�ŽŒŽ‰ˆŒˆ�’Š�šˆ‹–Œ�œˆ����œ‹Œ™ˆ‘¤…‘£Š� „� Š”¦‰—­‰“¦�’Ÿ‹–§ˆ�¡†�žŠ�Ÿ†ŽŸ„Š™‰“¡‚Œœ‚Œ zˆ•�‰–y„’lq|tyŠv€‚x��v�z‡•}„“€Š•v~ˆOO`Ѹ£â̹ëÜÇïéáðìéñîíæÐÒêÞàñëæñéáîáÎîãÖñííîçãØ·£†aQ•l[Ͷ­ØÌ˲ª®˜��w}‡wƒŽjkpZ]kgqydpZXdVKIG>GÓÀÃçÌÈæÉÆæÆ¼á½¯ØªœÖ¨ ×ª Ò¤˜´†ƒˆfa[ZrVXtSUpVX}aa}`gw`cZKQ>9EC;O;6K>;S;9OGEZ>@Z>C[@>X@E^EMuCOnCEZGI`IOkGIjEGaGQoIQjEI^C>VGCXMMh�Œ£€„œ†‘¢ÕÍÐÛŶݽžîáÌïßÄïܹîÛ¸ìÖ¬íׯìÐ�ëÒ¦ëПêÏ¢èɘêÏ©êË™èÌ çÆ—èÉ•èÌŸçÊšæÆ™äÆšâÁ�Úº�ЩyÓ¯w–}`ynVxnUa[Kh]Oh]MpaU‚od‘xkáÒÎèÙÌêÞ×ëßÙìàØëàØìÞÔëÜÒèÚÏáÐÀÔ¼¨À¥‹¾�‰Ý¾§Ð¨“Å—ƒŸt`kZQZIG]MGUGCUECUGEXE@ZGCXCC^I>^MGfOIM>>S@@`KGQ@@G96//+3+'/++/++//+//'+''3'3/+++/+++'++'6+3OI`VXuC>E//33/3//+/++//'3++366;9@UUcgkchxSXgIEQC@I969KKUjdqIGSC>I>9E93;9/66/6+//3/66//36336///666;CEUKKaQXpU]xXa|XaySVhMQjIG]KQXkyt¿»»×ÎÓ×ÎÒȺº¤œ£‰�’o|Œnw„kx‚gnyKK[C@M9/663/>CEœœ‘ÖËÒÛÏØÓÅÉ¥œ›„€}XXaKQXZ]fgooqupv‚hq‚lq‚lpxkr…Z`qSXoII]EESC@SC@MEEOIIXQUfMOdKO^OQ]w„ƒ³­°Ãº¾Åº¿§¢£“’˜tx‚dr„kr[fuIKZGKU>9>§�rßÈšçÒ¤çÑ£çÍ›åÈ’äÅŒãÃ�ߺ€Ø¯rΣf–rKy]E|^Ey`Gy`G]C€[EuZE|^G}^Gw]Iw^IaK@vcMqZIaMCI@C>9@d]cÞÙÙãàà×ÍȰ¦Ÿ ––‡ŠŽ‰†€‹‰‹‹ˆ„‰‹�‹‹��Œ�‰‹�‰Œ–Œ“Ÿ„�š‰�—Š��…Žœˆ�¤…ŽžŠ–§‰”¤ˆ”©Œ—«‹’¤‡����™‹�š����� ‡Œ™ˆ��…�“‚†–„‡Œ~ƒ‹|�ˆgknqx~w|�w„’‚‰–|†”~‡™q|ŽQXd^cuÑ´–ßÃ¡éØ¿îæÛïêæðêæâÉÍîçáðéßïå×îãÕîçßðëåîêëÝÑЗt`ˆhQ^Qů¦¾²¯¬Ÿ¤xuucdnV[lUZfOMUQSXdo�E>IO@EÞ¿äøæÉ¿åÉÂÛ¯¤ØªžÜ±©Ú´¤Ó¬�¯‰€wXSuXXvVXwVVuSS}Zax[]w]^MEI>;I>9E96G;9G>9O@@X@@[>>V>>O@E`EIoCC^CEOEEZEIlCGjEKgCCZIEgMOoql‘ ¦¶°½Ã†‹šln}“‚ŽéÝÏïßÁïáÈïÜ¾ïØ¯îÛ´ïÞÀîÙ´í×®ìÓ§ìÓ§ìÔ«ëТãÑãÀ�㾋åÄ•æÆ–çÊšæÈœæÈœåÆœàÁ‘ܼ�Ó³‹À�r¶˜u´˜ko`Qk^QdVIg[MdZKj^Vtc[ŽtwäÔÉíáØìàÖëßÐêÞÔëÞÕêÝÕèÙËæ×ÈØÀ°ÙÁ­×Á°¥„t½”€·‰t¢}khSIXEEUGGQ@>ZG@ZGCVE@UE>UE@ZEE]IEaMMrSK`IIXC@OC>SCCM>6@669/'++'/++'+'+''++'/'+/+/++'/++6/9Z]xcv�rƒ”o€Œ66>6/93//3/36/36//63;>9;IKUUVhVZkQSjSShOM`E@KSQUhhqEEMC;C>9@@;E969;39//963;936;9;;6>;6E;@IIMhMSrU]}S`}SZrSUrII[GK]C>O@>CXd^¸²­ÙÎÐÚÑÒÍÃÅ­§­Œ�–tz†ju‚ou…`hrII]C>I;39@9;U`[¶³¯ß×ÙáÛàÜÑÒ¶µ¥œœnpwrw|‚ˆ���Љ–}ƒˆpw‚pwop~jrƒ[anVZkIES@@ME@ME>OECOKKUMO]QVhOOaMQ^x‚¶¬³Æº¿ÉÀij®®›˜œw}‚ow†go~V[n@CM;6;999ZQG»¤uæÎœæÌ–åɘåÇ�ῊàÀ‹Ú°wѤjÈœd zMwZ@u[Ex]Et[G|`Cz^EzaG}`Gx]@lVGVG;t]EqZErXGlVGSGK@6@;3>MCM€w}ÞÙ×ߨÔÔÌɯ§£‰…„…††�ˆ�Œˆ‰Ž�‹‹ŽŽˆˆŽ‘��ŽŽ‘‹�”���†‘Ÿ…��ˆ�›‹��ƒ�¡„�¤„��†–¥ˆ—¯‰’¢‰�–‰�‘ˆŒ™…�“†Š•ˆ‹�„ˆ�„ˆ‘�Š’�†Žz€‡]Z`x}…w„€ƒŒz„�z†–€ŠœQ[kGCXrw…Æ­•Û½™çÔ½ìàÓíàÍîçáìäáíåáëàÕéÛÍíáÓïåÛíäÚëçèÑÂã�•�tn�qV]M–q¦‘†œ‘–zu}XQZOMUQXgMQaU[o]hu^háÀ¸çÌÆçÌÈãÀ¾àº´Þ´ªÜ¯¦Ð¥œÊž“˜oghMOqUOwVZxVX|ZV|[^nXVhVV@>@>6G>3>96E93C>;QC@X>>Z>@V>>U@G[CEZ>9O>@[@@[C@dEMnGMp“�¯ÔÓÜÜÜäËÐÑtz€`ghSMa°‚tÞůïáÆïÞ¼îÙ³îÚ³ðܺïÞÀðݹí×®íÔªíПìÓªìФé΢תrݰzåӿœçÊžèÊœèÌŸèΧçÇ—ãÄšÞÀ˜Ð°…¯˜uœ‰k³ŸxpcQk^Sg]QfXKhZKl[U¹“‘ãÑËìãÝíáÖëßÖéÜÒêàÚêÞÖèØÈáμÜǸҼ§Ì´žÌ¶Ÿ®™�rcUoUKfQQVGCVGCSC@Q>;VECVECU@9SC;UC;[IMhQIwZOtQIkKIkKKM@;Q@CaICG>;>3/3/+/++++'++'++'3'3/+++++@;QOVlnu�q|Žq|‹S[f>;G>6C;9E>;C@;G>;K96>96;@>CC@KEESKK]QQfQQdKI[MM]]`uGCSC>EC9G@9E;6>;69669669;36@;EC>KC>UCGVIUqKSqO]|OXrQXpMOcKK[@@K>9;;9>QVS²ª¦ÖËÍØÐÒÉÁȤ¢¥Œ�•hq�clyjn^guGGS@>C;39GGMlwqÈÀ»âÛßäÞàÜÓÖÁ¶³§¥§v�‡‡�Žœ˜š­¤­”– †�•ou�qw…pwƒko€X^hSVcEEU@CUC@KE>MGEOIKXOQ[SXrMShOSgu�¾¶¸Ë½ÁËÂǶ­ª œ¡x‚”nw‡jrŠUVhCCM969;9;@@@’}^åΠå̘æÈ�äŌᾅ޼…×­pÍ£kÀ�^œvKvX@uZ@x]Cw^G}`Gy`E~aG}cKx]GcK@fOCxaGo[InXGnVEOCE@6C;6>@9CG>I¡œžßÙÙÞ×ÕÌÁÀ”�’‹‹ˆ��„‹ŠŠ•�Œ�‹���Ž”���‹��Ž—Œ�‘Š�œ‹�˜‰’�ˆŽœ‰’¥‡�¢‰’§‡� ˆ•§Š–¬‡‹–ŒŒ‘ˆ†�‚ˆ‹†�”�‡ˆƒ‡�ƒ„…‡�~„Šz‚‰`]ay‡y€‡|~Š~†�z…–~„–IMaGC^z��À¥ŒØ¹—äË­êÚÄëÜÉíçäæÛÚæÝÛÈ´²ã×ÎæØÒèÛÔëâÖéääÎÀÀ›ŠŽ”…‰ŽvpŒhVxVI|`U–…}‰~€qkoKCOMMXOQ^KEQkr€•u„äźéÑËçËÅåÅÂãÀ»Þ¸©Õ© ÈœŽºŽ€[ZvUUwVSwUSxUS}XZ€`coVU`QX@;G;6@96>;6E;9I>;S@@U>>V>;U>>ZCIg@@[;9Q>>X@@cCE`GKpQV€ÐÑÝããéÙÞ䈎‘VXfX[cw]cáǪìÛÀîݼïݺïÛµíÕ¥î×²îØ°ïÙ¶íÖªíÑ¢ìÒ¤ëÌšìУâÁ“دyá·çÁŠçÇœèȘéÌ£èɘçËœåÈœáÁ’ÝÀ™Î­ƒ¤Žo‘~`”�fqfVk^Sk`Uh]Qj^O|dcßÉ¿êßÛìãÛìàÖëß×êÞ×èÝÒèÞÓæ×ÇÝɸտ±Èµ¡§Š|¶šŠ©–€ynaXGC^KIUC>UC>MC>O;;XE@QC;Q@;SC@QC>cMSpVO}^ZvUOjOGkOIV@>I9>VE@M>>C63;333+/++'+/'+''3'//++3//OQl[fypy�jv~Z`kGEX@;M@;G@9C@>KE>QC>Q>6G96;;6;;9@@;GGGUMM`OQfKKVMQ`[]oIGUC>EC;G@;E>6>>69;9@C@KEEMMSnKOcIOoKUuKQrOStIMcECUCEQ@9C96;63;9/6633>;@ƒˆ�Áµ¶ËÀÁ¼²¸�’œy~†]frV[lU[jKMX@;K>9;KOUhuqœ ›ÜÔ×åßääÞáÛÐѽ´° Ÿ�–œ™·±²Ì¿¾Ê¿Á´²º›œ¤z|�puƒpw‡kkySScMMVECO>@QE@SC@QIEUKM`MQdSVjOSdSXcy„„¿¶¸ËÃÅÑÈÌ·­²§ ¥�ƒ†pw†kq|SVc@9@936666>>@KGEÛÛäÈ“æÌœäÆເݹ‚Ó¬vÁ–[·Ž[�kGoV@kVClUCx^E|]EzcGcGfKw]Cu]G}aIy]Iu[ElUEp]MICI>6@;3>QU]C9E93;I@KvlpÎÊÆÔÈÆ¾¯ª•�…�‹ƒ’�‰��ŒŽ�Š”“��‰‘‰Œ‹�Ž“’”›��˜‰Ž›…� ‡�žˆ�œ„�§ˆ‘¤†’¤‰—ª‹–§†Š�…„ƒƒ„Œ‰ˆ…‚ƒŠ�ƒ„…�‚†|‚u~‡hqyv~ƒx||�‹|�†€‡ŠdlƒEEUX]kq}Œ§�†Ó´”ßÁ¤åÓ¿äÛÔÍ« ¶— „z›‡‚¹œ‰É¶©ÙȽÞ×ÔÒÒЪ¨ªœš’šŒ�˜‹‹”„Œhcv]VnUIf`�ƒxrzOM`E@KKG[’pyϬªêÔÎêÓÏèÎÇçÊÄ༷حŸ¸‰‚–lgySUhIEyQIƒZVxSQ‚ZU„]Zw[XVII969>9K;3;93>;9I@;K>>S@>S>;S;;S>>U@E`>6G>9U@@XEGnIQwQ]ƒyžâãèÌÐØ�ž±�Ÿ¦kfd…c]å˪íÙ¶îÙ²îÙ²îÛ¸ïݾïÙ´íÓ¤ëÒ§êÏ¡ëÏ ìѤêÍŸèȑ例來åÂ�æÀˆêÉ—éʘêÎ¥êϨêЭêÏ¥êÒ«çΣå̤ռ•²›w�‚qujUufVqdSrcVqf^zgcÔº°êÝÖìßÖêÝÐëÜÎëß×ëà×åÔÄâϼÞ̾ÖÀ§È²�£†y­˜Œ§‘}ˆhdaZIC>K@CK>>M@;M>9O>;SC;K@;Q@;O>9SC;dKK†d[ƒaV}ZQkSSnOIXE@O@;G66K>;I;;G96>3363+3///+'/'+3+3KI`dkyjoygnv;6;6+39/9C>OE@OECXIG^KGUC@M>9@>6>;36969>6CECQKIXMISIEOKKXXZhGEUE>GKKX>;@>9C;9;>;IMVlX`Zf‚Va~MXrMVrCG`ECZ>9>;6>9996399/9/3633/93993;Uag““’¤¡ ¡›™zŠakxKQ`MM`MMfKKa@;K>9>IGI”™–Áº´ãÛÞçâååàá×Ïζ®¯�™–¥¢ ÆÀÃÔÆÌÖÎÑö·±§§Œ�–|†|��fhxOOXEESC@I@@MECOGIVKIXMM[QQcSVoOOfOQ]~‚|Á·´ÍÃÈÏÃÆª©«‘—›p|}gk|agtOOc@;@969363>@@GEM�‰xâÈ—ãÃŽáÀ‰ß»�Ûµ|Чl¼’^¦S|aGgS>gQ@cQ@nU>tVCtXCzaKx^Iv`E~aMxcGx]Ep[GpZGqZGC;I;3C9/;9+96/;6/;9/9966C9;£•ŒÆ½³ÖÎί¢žŸ–—“Ž�•���‹ˆ”“˜‹ˆ‹ŠŠ‹‘“˜‘”šŠ�šˆ�”‡Œ”ˆ“�†�™Š–¤„� ‰”¦…–¨�–§„‚Š�‰„Šˆ‡„ƒ}vrx�‚‚…„‡|€…rxztqoqv�rvzyy}x€‡x€…GGOSZht}ˆX`vxntÁ§„׸˜ÓÌβœ�À¦ŽtZX¶›�¸¤žª�v­–…±–‚ëœËÌϨ¬¯VVc|y‚�‹•–�––�™•ˆ•�pvgSMkSMqp‹Œ“zxŒ‰jvàÁ¸èÒÉéÐËèÎÈéÐÌæÉÃÓ¤™¾��‚ZXtMKoMIkIC}OI‡[U‚VOƒZS~^[nUO;/393@;6C96;93>;;G>9I@;O@9Q;9K;9O>C[99C@;U@>cEEaIOuIOtZf‹˜¡¹ãâçØÛÜ ¦¥ZV]žraÜ» íÙºíÝÀîݽïÝÁîØ¯î×°ìÔªìÏ›ìÓ¨êÎ�çÉ›äÀˆéÆŒèÈ–æÄ�èÆ’éË™ëÍ ëФëÒ¨ìÓ±íØ°íÙ¶íÙ¶ìÕ¯èϤåɞʯ�†nX‚p]}uj}ucrgSp`Uº——ÞÉÅèÜÑè×ÌêÞÖéÜÐêÜÒêÜÎè×ÉÞ˸Ӹ ÖÀ­¸¤“¡†z®�‘•‡w„vdf]VMIEKGEI@>E;6M>9K>>Q@>O>9K;9M>;K>6SE;aUa€kgŒj`}[VwUSrOKfKCQ@>M>9>63SCCSC@I;;G>;>66++';/;GEVdoxgnygluG>KSUgacxlrŠ]dwMKV@ESKKVQOUE@G@;;;66;9;969>6C@CUKI`KIZC@CECIOQ]EGSE>I@9E>9E>9@>9C>9CQ[w^l‡`pŒUd�OUtIOcCG^@>K;9;;6;969633;6;3/6666666;6>S]kŒ‹•Ÿšž¢œ¤†�‡pt�X[gQShQUnMOhC@KGCIQSQ¥¦¥ÉÃÀåÞàçàããÝàÔË̲¬­œ›œ¤œšÆ¼¿ÒÅÈÔÊÉÀ¹¿²®·�‘›}�‹z„Œhl~OS]C@KC@MCESGEVGCXKM]OQcQUjS]qUVhSZg€‡�Ä»ºÎÃÅÏÃŤ¢ ƒ��cpqdhq]`jKIQ>;>639969@@ECEKrjoàÈœãÄ�âÁ†ßº‚Ú²wΡd»�]¦‚Uv[EfM9dK>cQ@kS>pV@u[CpXGt[Gu[E}^GuaIu^IpXEnXGtZG;6@93;6/993@9/96/;6/36//QGI~tk‘‚xÏÊÈÔÇÁ¾¯­›‘‹—‘�‘�†–‘•ŒŠŒ“‘Ž’’”Ž����Ž�Ž’‡�™ˆ�œ‰�›Œ’¤‹‘£†’¡Œ–¤Ž•¨‘‘–—ŽŠ“Šˆ‚urˆ~‡„‰„‚��wwwqpxnv~rz€w|z…lt}C>Mcjuw€�KOckht²˜‡Õµ˼¾Ã¶³ wq¢vuÕÅ·¶�–‘wg¦ŒuÀ ƒÉ° ÉÆË©¯¶QUaXUggfz�ˆ�”�–“Œ–�†�~oxl[fgSO€y€–�•Þ¤èÎÈéÏÈêÔÏèÐÈèÎÉáÀ¶Å’‚§xouSQqOKvQKlICyQI€VSVM†[V|[XhSQ9//;6@63>936>6>>9K>9K;9M>9E;9I;;O>CZ99K@@]@;SEKnGMoKX}Ucˆ}~Ÿäãç¾ÂÃ�„„ZSZΣ„éѯîÜÁïÝÁîÜ»îØ²í׬íÓ©ëÓ­ìѨíÓ¨êÌ�éÌšæÆ’èÉ–è˘èÇ”éÉ•éËœêÌ î×´î×°î×±íÖ­í׳ìÖ±ëÓ­èΡäș̰ˆ�xc|oXrgZqgXujZ�g`ßË¿èÙÎçÙÎáËÁèÚÓëÝÒèÙÏç×ÈãÐÀÛůзœÉ±™¤Œw¦�¨–‡‹xcvl`UOMIGCMICC>>E;6K>9M@;Q@>O@9K>;K>;M>9VC@carc]`ƒg[…aSyXQyXOlQE^C@U@>I;9O>>ZGGZC>E>>633+'+I@ZUVlcjufou]dnUVjcj|jo~qz�t�“]fqE>MGGSOMOC>@>9C>;>@;>;9@@6C@@SMIfKI^C;CC@EMMZEESC;G@9EKKX>9E;9C;9COZn^l…`v“Vj‚Q[yEM]@>KC;I;3;96;99;9/993963;939;6@>6CKS[•š ³®µ½¯¶«¤¯–“¡vy�hlwgjyV]lOXhahj“�’Ⱦ¹×ÎÈæßâäÜÞߨÝÌÄᥡ—”•~†‰œž•­ª£¸³¬¯¬²¦¡¥‹‘›zƒ�w~Šhn~MScEG[ECUEI^II]KI`KMcMSdQUfU^xVVgVVjƒ†‚ÇÁÃÒÉËÓÈË¡œŸuy~QV]][aXVXGEQ@9C;6@>9@EEOIIZXVn¶£‰Ý×ྃݷ|Ù²vÌ£d²ŒXŸxMpZC]K;aK;`Q>gSCpU@rXCkSClUCpXCtXIt]Ex]GrZCq[E`UI6/69/99/36/96/93/39/9C9;kga‚v�}vƒu±¢˜ÒËËÓľ§œœš’��Œ‹”�‹“‘’–••��”’����“‹Ž��‘ž���Š� Œ• Ž–§‰“¦Œ–¨‘™ªµ­²Æ¸¶Ê¹¯º©¥³ —�––†~rrpgkkkloqttwttzfluGISE@Ov�‹pw€CEV¡•šÏ¾º¸¨¥Æª�¹§ È®¬ª„«Ž‰¶ž˜Ï²‘Á ‡¤†pÁª¤²®²©´º``g„�—´¹Àpoy[[lgfrЉ�“‹”’Œ“‘‰“–‚‹´‹ŒéÓÐéÎËèÎËéÐËèÎÉæËÃС––g^yVOuOKxQIpMI}OKƒXMXQ�VKrXSqVV;66;3>;6G96C93;@9E;9I>9G;9M>9I>9O>@Z>;K;>S@>X@@aEMoIKfKStXf‡¨©½ØÙÜz}rcc^ pZêÒ§ëÓ©íÖ²îßÁíÛ¹ìÕ©ìÔ­ìÔ°ëΛìÐ¥íÒ¨ëÎ�éË•êÌšçÅ“êÌ�ëÏ£èÊ™ëΞìÒ§ïÙ³íÕ¬îÖ¯ìÒ¥éЩêÐ¥êЧèÌ¡ãɤ̰Œ’cpX}nj‚oh‰l[̯¡ãмç×Åà˵¼�“ÚÁ´éÝÏçÖÊäÐÁà˸Ú¯Ѷž¶œ~“t‹ul…vaZMUMIIC>EE@KGCOKIKECQC;M>>S>;SC9O>>K@9VE@fUSdj|X[gSS`�dX}[Q‚[UvXOoQKkMIXECZE@ZGEUE@+/#++';6>]]lccqdllU[gX^qcjyfpƒfo}ly�|‡–z†—ZfrECKGEMIESCCIGGQE@G@>E@9EGIUOK]KKZC>C>;>GEKIIZ@>G@>K@;E>9E>9@;9@GGSQZjduŽcvŽ^nƒM[vGI^CCZ>9G@9C;9C;6;;6>96@>6@>9I@;GIKUƒŒŠ­ª¨Ä¹»·®±¨ ¡…‰‹tz‡or†dj~v„ˆ™™“ÎÃÃßÔÕâØØåÞÞâÙÕÝÖÖÆ¾º¡šž‹‡‡nv|z€‚“‘�ª¥¤¤ ��œ›‡Š‹‚…�z�grˆOU^KO]IIcGIaIK[II`MM`MOcVXqUauX^tX`n�•’ÎÄÇ×ÍÏÕËѧ¥Ÿ††U[d^cuZ]qKGXC>I@9E@;EIISMO`XXlcakœˆvܺ�Û´vÙ²uÍžg«€Q’qM`QC]I;]M;^O@jO@oS>lUCqV@hVChXEoUEjXGv[Gu[Ew]GOGK96>6399369+66/33/3KCGf`X€yo}ynzxl‚}r|vrvvl¶ª­ß×ÖÓËɨš�š�Ž–��™”‹‘‘’Ž�–’��‰’˜‹’›��••˜œ”–›�– Œ‘ Š–§Œ•«šš§ÓÍÓíéìêäçéáàÞÓƒ€yfcdlnnlojgkrC@G;9>dgpgntMMZMOdÏÅÁÔËô–„kQIwlfÃÀ½tgg…ln¬œšÏ¬„Ñ­�Ƨ‡ÑÅÄž‰�¦­¯nrx¯¶À¢§ªa`zkp�]`qV[n`^gjcoˆ��ʤ¤ãÈÃëÓÎëÓÎéÒÍçÍÅà¶Ԩ—ŸoduMKuSOwKIyQMxSMƒZO}SIUIzVKlUS]MI9366//63>63;>6C>9G;9I;9E;9K;3E@@X>@V99E;>Q@>XCCaGKkKQoIXwOZyggx’œžqd`•ohæÌ êϦëÑ¨íØ¸íØ³íÙ²ìÔ©ìÒ£ëΜìϤìѪëÒªêÏ£êÏ¥ëѧêÍ�êΡêÏ¢ëÏ ìÖ²íÖ±îØ±ìÖ®ìÕ¯ìÒ§ëÒ¥êÒ§éϤæÉœåʧÝÀ•¯”xªˆxåÔÄàÑÁÙŬº¤…©ˆvϱšÎ²šÁ¦•г¦èØÎæÓÁãÐÀÝȶÕÀ¬Ë³›´¡‡€p]laVSIEGC>C;9>63QMGOKGOKIE@>KC@MCCO>;O>6Q>>SC>aUVjjvhn|[hwVar[V^a[„]Vƒ]M~XMuQEhSIKC;>63+++++'6//VVahgpcgjSVdV`jZ^o^gvahqaj}htŠp}�r�œv‡›`lwQS]KGUIGSKIQKGMGCEE>III[MKfOMgGCM@;@IEIIMdC;K@;IC;I>9C@;G;9C@CMKSd`p‡hxŽhwŒXg…ISoGI[@>K;6C;9>93;>6C96>;9C@9IC;OEIU�Œ�ª§¦ÌÀÆÄ¹¾³ª²Œ�˜y~�u|Œcl|ˆ’�¯­¦ÙÎÏãÙØäÝÛäÜÝߨÚÛÐËŸ·Ÿ•“ˆ‚}qy}ˆ‡…¡›•±ªª¦¤¢•™ …ŠŒƒ�xŽht„OVgKMaKMaIQcIIZGKdKMaQQgUXoU`rXao[gv”š˜ÐÆÄÚÑÒ×ÎÓ®ª¦‹Žˆ]dl]dxX`kKEUC>E@;E@>GIIVMM[XXjVXkg^cÓ²|دqÖ®lÈœ`¥~O‹pKaO@VG9[M>XM>cO>gS@dQ@kS@kV@hS@gUGjUEt]GrZKlZIE;E63;9/>3//3/33/6///ZUUgc]�yrvqfxtnpng]^]^^f†y�ÐÆÏÞØÙ˾¾©žœŸ–š—–˜•’Ž”‘‘•��”–˜–™›‘’—•˜›”•�“—ž�–¢�”£�–¦Ž˜©´¯¿ëèëìêíìéèèãà§ š„}y`][]^]dfgaan>6E>;Iqv‚MU]@;GV]fÏÅÃ̼ç�aKEƒpa·®~r|lwœ‘�¿£ƒÏ®‡Ë«�ÖÎÉ”�q§«¨ot|¬¶Àko€}|“•›¤pp‡]`r`cxa`qvcqݼ·èÐÄëÓÊêÓÉèÐÅåǺ֫ž¿�~‡^[uMGrMGqKGzQKXQ‚XSzSIzUKxZSfQUOGI6//96666;339;6@>9G96G96C>9I;6C>@];;S96G>>V@>SCEgGKjMSqKVqKSjQUpgny�rgέˆëÕ¯êУêÏ ìÖ´íÙ³îݽìÔªìОêÌ•ëϤëÌ ëϤëЪìÔ­ëУêΜêÌœëÒªìÓ­ìÕ«íÕ¬íÓ¤ìÔ¬ìФëÏŸêΠêÏ¢éЩè΢æÌ¨àÄ�À¢ƒËªœèÛÎÚÈ­Á¯“udZ�vj´–yζ£Ë° Ñ²¡æÖÈåÓÄâÐÁÜñϸ§Ä¯Ÿ²ž€ug]cZQG@@@;9>63E@>MKESIGOIMOGCE@;IC@O>;S@;SC@UC@cXZchpho�cn�^l�^cvncjˆfZŠdZˆ`Z‚]OZMG6/+//'3++3/+E@I^[ccfh[]aXXhX[dZ`o[aoagwgo�kuŠq€‘q~Œw„•gv‹VZgOK]IGOMGOIGKGEGE>IGEUOK`MOhIGOC>@MGQKM^C>GE;K@9E;9C;6@96@;9CC@KXh}lz�l~–hv�U^uMMgCCM@9EC;K;9;;6>96C>9@C@UE@QCCOgyv›¢šÒÉËÓÈÍÇ¿¾¢ ¢„‡”x~�n|‰žŸœÀº¹Þ××ãÛÛäÜÜàרÛÏÎÐÆÈ³¬§–�“�€pv|��Œª¢ŸÃ´±·­²¨¦«‡ˆŽx��v~‡dl~OSaKK]GCVEGUIIVKKaMMaMQfQUfS`u[gukxƒ®­®ÖÉÄÛÐÒ×Îϳ®³—š¤ox€^dtX^gEEOC;G>9>>;EEGSKKZVQjUUaSO]ohk̨vФhÔ[¢yQ’nI]M>SE9XG;ZI>dS@aK;cM;dQCfQ@fSCdSGjSGnVCoZGkXO@9E>6E>6@;36>6EC9KQOXZVV]]]SUZKIQG@IC;CE>EOIV|n‚˜ƒ §�§ÜÖÛÞÖ×ÕÌ䪲£Ÿ™ œ™œ˜™”–•”—“–—œ“•œ”– ‘–—��œ�’��—¦Œ™©�—«¸±½èååáÛÔ«œš��„wqfSMKcccjllknuMQ^^fudox;9@C;Gqy…„x~³«¬À­�lQM}hcœ�r»¸¸œ�™ž“•tOMΰ¦ÝÌÆ–…z†kjºª­„Š”^`klrµ¸Á¼¶Â±ª³„Ž™y„‹x€‹È¦¦ëÕÌêÒÌëÓÌè̽ãÁ´Öªœ²‚r–f]vSSnMInQE|SKwSK~UMƒVOxQKƒXOoXVKGI>69333;366363/6;3;;9;96G96;96@@;M;;Q66C;9M>>S@C[@@aGIgGO`EG[KK^OZqS]ho^V¼‘nêÕ®æÃ�éË�íׯíÙ¶íÙ»êÏ¢êË—êͤëШìÓ°ëÕ°ìÒ­ìÔ§íÓ¦íÕ­ëÔªéÌ¥ëÑ©êÏ¢ëÍŸìÏ�ëÒ«ëΣêΡèΦèÌžêÌžèÍ¥æË¢Þ¾�âË·éÛÍÝθ�‰zcXQI;;K@;^UQŠjgÓ½¬Ô¼¬à˽äϸßʶҸ À¬•¸¡‰”�of`ZVOQIC>E;9G@>G@;C;6@99I@@OG@OECKEEK@;VE>VC@^MMclqajogn}lwŒox‘lw�ktˆnkxŽlcrZQI>6/+'6/+9//9+3QOUZZajfcSOUSQ^VZh]cpX`o]ap^fp^gyco…pz‹v~�y|‹w…–n‚–Z]cKGIOMOKGEGCGC>GGGQMKfQOdMMUE@EOOUOOcECM@@M@;G>;I@9@;9C96;>;;OVhk�qƒ•Zo„Zg~V`xOSfECS@>G@9E>9C;9E@;EECSECXCCUO[Z}‹€ÐÈÆÚËË×Íмµ¶�”œˆŠ—t}…–œ•¹²ªÙÐÌÞÖÓÝÖÖÚÏÏÒÉÉÉÁ¿·°«›“‘’ŠˆvuwƒŠ‰šœ™Ã»¼Á¶¹´«²‰‹”v~ˆvvaftKOXEGQ@>KEGQKM`KQlMO`OO`QVlQVp^guv†ŠÀ¼¾ÛÒÖÜÔÙÒÈʰ§ ¡›œy~†ckvXZfGIU@>G>9@>>GCCMKMZQK^OOVSOaUSfjaoœ‹wÅœ]±‡U™tKfQ>QE;SE9[I;aQ>dM@cM>hQ@cSEdS@kSGcSEgSC¶ ¤ÒÀÆÞÖÖÏÈȺ¸¸‹– jx„^fpMQ[KI[KKUEESIGSGEOC>IC>IKK^wn€œ…¢¤‹¨¬–³ÝÔÙçäæÜÒÒ·«ªª §£›–™™Ÿ›œŸœ—šœ™� › ’˜ ‘–ž’–œŠ“ �–¥‰�ŸŽ—­–—ª¢››©œ’pgX]UOVQQUOK]XSdcf`^]dclGGMCCM^ak]hp`X]´®¤¿§“¸£�«Œ}–yk«“—ÏÈЛ‘”¡ylãÖ×É´³Å¨ƒ–urÜÐÏ §­`Vkƒz“×ÔÜßÞä×ÖÝuu‡Ž‘�¬›¢èÒÏëÓÏêÓÌéÒÍáÀ·×¬¢¾�—la|XMlKKqKKoOCtOI|VV~VO€VUXS[Vf^c>9>;6;96;93693;96@>6>>6@3/633966@@;K6/;63C;;O@CZ@>XCC^@COC@QGIUKQkKQfOVgh]X „‚èÓ´åÁ�éÌ�ì×¶íØ¸ì׳êЦìÖ³íØ¹ïÚ¸ïÙ´íÖ®îØµîÙµîØ±ìÔ§ëТëФæÈ˜éË—éËžêË›çÉ™èÊœéË™éÏ¥é΢êФæÌ¨åÈžèϧèÏ­ßɳ¯¥Žc]ZZKE9//;3/@96wOXçÓÌßȺÝȺÝɸÙIJŭ–ŸŠu•„nkcVSIKMEEI@>G;;KC>MCCKE@KEEMGCGECMG@KGEO@>M>9VEGKGK>9;C9;X]lgp„nuŠowƒjt†ajv[X[IC>ME@VMOI@CG9>udkgddoh^VUQXS[]]hX]dZ[hZ[a[`k^fv]ftkt‚kt†lu‚p~�r~�v…”]dgE@CE>@C>>C;;@9@E>IIEQKGXIGKKCMOM]OUoGCOC;K>9CC;I@9C>;I99;;69`u…—´Æ—±ÉUarQ[tU^uUXoIG]CGS@>I@>K>>O@@MC@QECQC>SIUUo|tËÃÁÙÏÐÙÐÓËÀ¾¤¢«�–¡uz„ˆ†¢¢”ÐÆ¼×ÎËØÏÍÖÌËÎÃÁúº±©�¤–Ž˜‘“}z~ƒ‡~–•“ÀµµÀ²¬²¨¤ˆŠ‘vz„pr~^cnMMZECSCCMCEUKM]OUjMS^QS`VZkQ[o^fkx…‡ÅÂÄÜÒØÞÖÛÌÅǰ¤ž¡˜•ƒ‹ch~[cqKKX@@I>>G@>CCESEEMOI`SSdQMfVSjUM^`Ua¶–hº‘[¥}MgS@VI@ZI>ZK>^K>aK>`M;cK@cOCgO@fOEdQEq]KÞÕÕéäçæßÞÓÍËľÀ›¢§u~…ajrKQ^MKZKISGGUIIUKIXC@KEEQIK[pkƒ—…¤¡�­­•±À§¶ÛÓÕäÝÛ˼¼Áµ²¨¤¥¤  Ÿ›œŸ›–¥œ °¤¤™šœ�‘—��–Ž’ ‹”¦Ž”¦�˜¨ˆ–ª–�§‰‚„^[V]Z][ZXXUU`^Xjha^`gXX[KKUV[jjrxQ[nGCM–Ž…¡Œ“h›„r›}kŸƒ„ÎÁ‰ƒ‚�jnÖÅÁؘί–ˆh]ȳ±ˆ‡Žœ’�ÏÍÔäâçããéÙÛá�œ©Ÿ ­Æ¯²êÕÒêÔÏéÓÍæÌÅÜ´ªÑ£•¶‚u‡fXxXOjMMwOOlMIrOIzOQ‚UM€XOzXUv`g^Zk>;E>9@96;93663;;6G;6@>6>63@3/666;@9I3/663C;>O@E]C@]C>Q@CIGGXGGQIMaKQfKScq`[·žŸèԶ㾉éÌ íÕ­ìÖ¯ëÓ¨ëÓ­îÚºîÛ¼ðàÈñßÂðÞ¾îÚ´íØ°íÓ¤ëÓ¤ìÓ¨ìФäÔèÉ–èÄ�éË èÈ–èÄ�éÍ¢êϦêÒ«êÒ¨çÌ¢æÉ¥çÉ–âÁ�Ó³Žƒ|ooZQ€dSC3393+C96 otìÝÕæÕÊÛÆ·ÚÁ¬×À«Á«˜’~d�td^ZUMGKKEEIC@IC>GC>OEEQOIKEEEEEC96KE@KEEM@>SC@XQS[[`VSXZSXVMZfj}lqƒku‚hoƒcjrSUUMECK@@ujoy[l¡~Œ¸ª¨zxnlhZUSQ`^f[[`ZZ`Z[dX[dZ[j[`ofjqdlxoq~rt~t}Žuƒ’v�“flnIECEC>@>;C;;@9>@>CGCSKIUGEEIEOUSdQVnIIZECU@>KC@M@@E@>K>;IC>Gf‚œ†¢»p}œKUkMQkQVlS[rOQfKKXEGZEC[C@[CCUEEZECUGGZEIX[lp»¸·ÝÔÕÜÔÖÒËË·²ºª¥­„†“ao}httš•ˆ´ª¢¶®£¼±ªº­¥´«§«¡£¢š› ”•ƒxx€�™”�¾¯«Æ´ªºª£‘�”w}†qw…nq€UZjOQaGGVKSaMO`OO^KQ]QUdQS^KScaor‹”•ÎÇÆÝÕ×ÜÓÓË¿¹¯§¥¤™œ�‰‰gq€]dnMQcC@IC@MCE]GKZKKZOMaUSaUScQS`OM`OM`KEO…xdž‰kgUCSE;SE;SI>ZG;[K>[M>`KC`OC[O@`KE^MC¥��êåèëçêæàÞÞר×ÐÐÌÂħ§¯ˆ“˜ZcuX^lQVgKOaOUjKO[KG[KM`SUjtoƒš‹¦§�¯±—²®˜¶­”²ÖËÎçáàáÛÜÆ»¹­¤¡£Ÿžª¤¤²£œ¨Ÿ¢Ÿœ¦™›Ÿ“—Ÿ“–¤�”¡Ž�Ÿ�–¤Œ–¢‹™®ƒ’«fn}^^dgdaohglg`][ZhlkdfdQOXtzƒlpr@@IIEMgkt ›žh^ckff�~zÉ»ºÅ¾¿}x‚ÐÃÆ�rÆ’‡Þ¾²†ja„k`ut�ÉÆÌÚÖÜãÞäÜ×ÜÃÃÏ€…–­…‡Ý¾ºëÖÓëÔÎéÏÂäüӤ–Æ—�žqgzZVyVSrUMuQQpQIyQK~UM}SK|XU‹ry¼¾ÈÀÌÔ“ °€„—GGZ>6@;6C;6@C>E;9@93;96>;6G;6@96C;9G>@U>>K>;@>9GCCKGCQIGXMSkKQfGKSrla‡nfáÁ�ßµ}èÆ“ìÖ¶ëÓ§êÓ­ïÞÄñàÁðàÁñáÆòàÃñàÀïÜ»ìÓ§íÓªíÓ§êΖêÌ—Ü´�å¿‚ç‹ëÍœëÒ§ìØ¶ìׯêÑ¥êѪçÌ éÏ ê̛ݶyЭq«‹^qaQÁœƒÅ¢�`MGI;@MEG´ƒ}ìÝÕëÛÓܱδ›Å¯”¬˜ƒujc]QMEEIECOCCOECMGCKECG@@MKC@96GC@MGCQIEQGGdSKg^U‰h[Å£…̯�˪�甸œ�³›‹§Œ‚‰xt|op^UVUC>K>;°��êÞßéßܺ± gcZf^]c`Zf`dkdlgfngdlaakggqcfffglghonq|oqx~†u}�wu€y~„SS]OMQIIO@CEC;@C>EGEMEEOIGOQKXUQaOQkKI]KKZCCUE>OCCOCCS@>KE>GCCKKO`KQdMVfKM]OOaQUgQVhMQaMMgIG[IIaMK`GG]GGXGIaGK]Xho´±­ÜÓ×ÛÒÖÏÆÈ­ª§–™›z†”aj€Zfp[hqqwxx€‚�Œ…ª�š® ›¨ œŸœ•œ‘–ƒƒ„nw�ƒˆˆ¯§žÁ²­¼¯¯–’–x‚ˆw�}‚�[drQXhMSkOUlUZoQQfMQhKKZIK]IM[fto’”ŒÎÃÃÛÑÕ×Ïϼ²¯¦ œ¥šœ‘�“u|†dp}KSfGGZEEXIKXOQcSUcZVpVUhSUcSXlVS``dn‹Œ�±­ªÂº¶Ê»¡’‰†uocUOXI@ZKCVG>SG>UK@[G;[MG~q`æááëçèìèêêæçèãåæàäßÖÛËÅʸ¸¾…�–lp€]foKUaMM^KKZKK]MM`OScnlyœ�§¦�¯ª’®¥–­ª›­­˜¯ÜÖÛèäçÝÑн²²°¦¦¨¡¢­£¡§� ¨¡ž­£�§Ÿ¤šœ¨Ž˜Ÿ‹•¡�’ †‘£‘ z‹ž†–ªy‡ž”ˆŽ�yu‚xpf^U]XUXUUad`V[cGCK9;Cdforv}Ÿ“ž€x~vz†¬¢¡À¸¸�€w´ ¥¤“‘’ghÁ‡�ëÙÓâĽհ§±–Н§§ÀºÁÛÔÛëèëèæéÑÎÒßÁ»êÖÏìØÕèÎÈäź׬ ÍœŒºƒw‚]XqQIoQGnMIpMIuSKzSSzSKzUK^dÆÆÏÌÓÚºÃËÄÎÙÌÔܧ¸ÂU[rGG]@@U@>K@9E;9C99C>;I9/;96E63>;;G;;@>6>@;KCEQEEUIIXKQcIOcECKVICqXIܺ�Ý´~èË¡êÒ§îÜÂîÝÀïàÈðßÃñáÆñáÆñß¿ïÞ½ïܸëÒ£éÉ–èÆ”çÉœèǓݲ|êËœìÒ¬ï×°îØ³íÕ©ìÓ¨êУêÐ¥éÌŸäÀ„ß·ƒÛ¶¸�`™tOVE;[GCXE@G99I>@VGEƘ’ê×Ïê×ÌÞů»¢‹­™‚‰r^ZQMIIMEEMCEKEGKGCMECMICIC@C;6KC@MEGUI@UKE[QI[SIv[K¼Žjß¾�ݹ„Ý·„ݺ‘ݼ�ݸ…ݸ‡Û¹‡Ú¶‡×³€Ó¯Ѭ�Ô­Žä˰ۿœ¿™wª‹uœxf©†zÅ¡†É¨‹Ô¶ŸÙ¾šÔ¹–˪‘Ì®‘Ȫ�Ë®•Ä¥Š¿Ÿ„¾¢�¼¢Ž¿¤“´ š¦“‹�|rpaa^SXVIMMKQKEKOKVSO^VU^^`nMQcKI]IK[ECVGCVE>KCEUCCQC@OCCOGK[IMcMUgKO`OQgOUkOUlMOfMMkKKcIOdGG[GIXGEQIKhEISVkq³°±ÛÏÓÙÏÑž¼�ž���š|†�fo]hvSZj^grclq‚€t›‘Œ¤œ•¨¤œª�‘§šš�Ž�rx|r|€  ˜¼­­¸­°•�—y€Šx�qxƒ[ftS^qQSjOXtSVhOUkMSdII[MQdIO^huv�‘�ÎÃÄØÏÐÓËʶ²²ž›–œ•—“‘—}‚ŠhqKO`ECMECMKKSMO^OSdVSjUSdUScSUhopv‰†‡¼¯­ÔÈÅÛÐÎáÙÜÞÕÕØÏθ­«†wvvd^ZKESIEVMCUG>|qc¸´¤éåçíèèíéêëçèêåçéãåäÝÞÖÎÏý¾¡¡«y~ŠhpzKO`IGUMO`KM]MM^SUdlo~“‡  �ª£�¨«œ°´¥µ¾²Á˺ÆàÙÝåÝÝÏÄÁÀ²­°¥ ¬¤�¯¤¤¬§¦ª¦§¨¢ª£¤­™œ£“™¨’– ‰‘ž€‹œ}ŠœŒ™ª‹š³½½¼Œ�–œœ—pg^`[X`a]hhaGEI>6>@>>luynt|–�›†~†uy� š¤�‘“jadÁµ²zpt²‡ŠãÊÉë×ÒéÒÎêÖÓÁ“‰±�™Ã´±È»ÀêçéëçëÞØÜèÐÈêÕÎêÖÓèÌÅäù٭œÈ™�®€rvSMpOEoMIlOOgIGrUMyUKyUO|US‡r�ËÒ×ÌÔݰ¾ËÃÏÙÏÖܱ¾ÉpŠ›auˆKOgGEUC@S99@>9G@;O;6;96E93C;;G>;E>9@@9KCCSGEUGGVIK^IISCCKSG@nVGÛº‡Ø­xåŘìÔ¯îÞÃïßÅðßÄðàÃðáÅðßÁñݺðݼï×­è˜㾊äÀ‡ã¾‰åÀ‹â¼ŒíØµíØµï×´ìÓ¥ìÔ«ëЦëÏœêÏ é˙޺~Ú²wÐ¥hÁžn²ŽZt]KXE>K>6G6;I>@SIKÖŒçÐÃçÒÅßŲ´—€¢Ž|wj`SMKIECQGGGC@IECGEEQE@UKGIC@@>9MG@OGEKECUGCXOE[O@rXG­„`Þº‚ݸ€Ý·ƒÞºˆÞ¹…Þ»‡Þº†Ý½�Þ¾’Þ»‡á¿‘ãÁŒâÁ�Ἃà½�ݺ‹Û¼�×·‘ܼ–áÙâÂ�ãÄ™áÂ�ãÆšàÖà×àÖݽ�Úº‹ÛºŠÛ¿˜ÙºŽ×¸ŠÔ·�ÔµŒÐ²‚½ |«�nœ…jcUQaZVVSSc^hlcjxlvMSlMO[KOfIGVCEUCEO@>M>;GC>G>@GCEOEGZMU^MUgQVkV[fSSoMUhKMaKM`GIZGGZEEVECSGG^GIZ[jr­§�ÑÄÁÐÆÈº°¨“’“‹Ž�†‰Œ|y‚nqQVdQSaU`g^cgyzr‘Œƒ¸¬¤ÇººÂ¶µ¯§¤ˆ‰�}‚‰€†‹›–›œ˜�‡Š”t|…rz‡ktƒ]clSZnKKUIOaMQgKO`IKZKM]KMXEIX]ho���ƾ»ÖÍÒÔÊÊ»µµœœ ”’’”�–|€ƒku|MOVEGQCCOGKUMS[SXfSOgOO[QS^x~…º²®ÏÄÅáÖÖçààéäæêæèéäåçààÝ×ÖÏÆÈÊÁÁ°­±†�“~„ˆ}…‡ÈÃ»ßØØëæéíéêìèêìçæêåæéãäèàâàØÛÙÒÒÇÀÈ¥§®‹�–]hqSXcQQ[MKXMQ^SVf]g|vtwv‰�…ж§§É¼ÀÙÇÌÜÒ×ÙÎÖâÚÜäßßÝÔׯºººª¤·ª­·°¶³¯­¼´¸Ë¿È¢¡ª“–©�™¤�“¡‚Šš†‘ Š—¨…˜¨��©du„^ny…“‰wohcZX[```KGKonqptrpru}z„¢›Ÿttþ¾jfjn`h¤¡ uq|Ƨ¥çÔÒêÕÕëÖÒëØÒáÊÂrQO�Z^ϸ²–‚‹¸´½æÚÚë×ÖìÙÓêÓÎãÀ´Ù¯¡Õ¥‘²�w–h`uQKnQInKIoMItQOtSGxQEySMxZ^ÀÃÉÈÑØÁÌÕ ²ÁÇÑÛÊÓÜ‘§·… ¯t–­–¨¦ºÄnwŠ@@S@@S@>S93@;6I;9I>;E;;@@9G@9G@@I@CQEI^IO[EGMGGUOE@dOGض‰Êšlݶ‹íÚ½îÞÂïßÅïßÁðáÉðßÀðßÃñݺïÛµîٰ٪tÛ¯vϧrÛ³èÈ–ìÒ¦ëШëѨíÒ§ëФêÏ é̜㿃á¼�Ù¯nÔ«tϧrÚc©€V¯‡U¢€U‰nKq^EI99I;COCCnSOÁ”‡Ûº§Ö´£­�}™ƒlVOIKCCGEGMEEKCEICCMIIOI@KE>MICGC;E@>@;9KE>ME;QICQE>ZK@|^MØ´†ß¸|ໃ޷�ß¼‹ß»ˆàº‚Þ¸�߸åÅ•åÃŽä‹ãÀ�åÁ�åÃ�æÆ–çÆ�æÆ—æÆ—æÈ›äÀ„äĕ޺ƒÝºˆ×²€Ó­yÓ¯„Ñ­zÓ¯yÒ­yÒ³ŠÐ¯~Ѳ�Ô¯yΨpΨpÈ¡kÃ�nÃ�n½—f¶–n–‚ḩœßƸÞÉÁQXoQXoO[kMQ]E@M@@G>;I>9E@9C>>G>;@>>IIOaS^tX^vXazUXqOXoKKcIG`GI]KIdGGZECUEI^ISc^luª£›È¾»È¼»¶¬§¡—•š‘”Ž�•€€ƒlt|MSfMGQKKMOKE[]S~q¿´­ÚËÉ×ÌÌÌÀÀ°©ª¡›š�†�p~‰oz‚gnvfnxhnydjnVVhOScGEVCCQIGXIG^GI[IKUIIXEIZ]dd~…¾¸²ÖËÎ×ÌОÀ� ¡Œ’“‡‡Œu}…fovUZ`MOOIMUUVSV]^V]d[anahc�Š„È¼¶ßÒÓäÜÞéââëèèìèêëèééäååáßÙÓÏÈÂÆ½·¶™œ�w†‘r�Œ‡’ŽÐÊÉáÙØêæèìèëëçééåäéäæéãåçááäÛÜàØÙÚÒÒÆÀĸ´³–‘™€ƒw|x^doSZcZ]fZdr`gvdhny‚}Ⱥ¹×ÉÌÞÏרÓÓËÈÆ±­ªäàßëçêèàßÞÔÕÚÏÓÒÇÍàØÙãÜÛ¼¯±�œž”••‡…‚‘–£�’¤‰‘ ˆ‘¡Œ–¢‡“©gt‰`r†ECZ‘’�È¿´wna]`[dfckkogkldjpwtxſŌ€‰ª©©lgg®­¬fff[[`Ⱥ¸Ë­°çÎÆéÓÊêÒÊ×µªnKIjMM’d`˜Œ‚‘ƒäËÁêÔÊëÔÌèÎÉÚ¯¢Ïœ�Ä•Œ”dV}XQpMQlSKpKInMEwOKtSGtQMxZ]šˆ”ÉÎ×¼ÉÒ¦¸Å”¦¶ÉÓÝÉÔÜ—¯¾y—©k‹ «¸ÆÍÖßÄÑÛ€‹¤IOcCC]>>S;6E99E69@;>@@;E@9G@COC@UGGUE>EC;ECEUMGCZMCË¢qÓ¨~໓ìÚ»ïÜ»ïÞÃïݾîݼðܸðÞ¼ï×¥ïܶèΜȑcدvªvSêÉ‘îЛíЛìУìΜ介éÌ ëÒªäÊ׭rÒªjǤn»—aµ�[­ŠX¯‡U§…V�uM€gK|fKcSESE@OE@ZGG”njÇ¡‹É£�§oƒh`c[OICCIECGC@ICEKE@OGGOE@OICIC@OI>IC;KC>KC;ME>OG@VG@VM>aSI°Œnݾšß¹€Ü¶~Ý´�Ý·�ߺ‡ä¾†äÁŒæÅ•æÃ�æÆ–æÆ”èÆ”èɘçɘçÈ—èÉ—çÃ�忈㾆ݶÖ±�Ó­}Ë©€Î§|ɤtÇ¥~ƤtÆ£xßr½�qÁ t tœh¼™n³�X±�Z³Œ[°‹[¬ˆZ¤‡`x]SÆœ˜àÉÁMSfS[qU`yUXcGEUC@I>;G99@;9@>;@;9;99@GKXQauU`|ZcvX[rOSjGGZIGXEEUIK[GG[IK^GKaMXgfvxª¤ Ë½¾Ë½¹º°­® ž¤œ Ž�‘z|�govMM^MIQGEKKG@VUIlvd¼´¯ÙÍÈÚÐÎмÀ³²´ª¨ˆˆ�lu�do|]ftcfrdho`hoVZqMOnIK^EEUGG^GIcIK[KKXGGUGGZXX[v€|¾´´ÕÉÇÕÌÏÆ¼ºžž ‹�•~ƒˆqz„hotU][U]VUZ`[aXdhg`ffdjn}†|¡ �×ËËåÛßçßáéãàëçäëæçëçéèâääßßÖÎÉúº²®ª‹Ž‘x„Šr€�“�ËÅÄÝ×ÒéääêåæéããèááèááçßàäÜÚàØÔÞØÖÙÐÒÌÃÁÀ¹¼£ ¤Œ����„dlk[ffZajZckdnr`jp|†�ƺ¶ÖÆÅÛÐÐÈÆÀ¯²¨†Ž�È¿¾ëèëîêîêåçèâååáåÙÎÎ̾¾ª  ¤  žœœ�‹Ž�•£�’�ˆŽœ‡� ˆ“£‡�›kz�`r~C>[XZq›––¡�„gd^jgfkkj`gh]cjtqxÑËÐ��˜–ŽŠ‰‚¾¾¾fgchkcÛÇÀÔÀ¾Ø¶¯Ý·£åɾԩ‘jIKgKMpOS‰wl£„‚çÏÆëØÏìÙÔçÊÆÔ¦œË™�¼Œ‚†]UrOKjKQkQQkKMqOEvOKnQKuSO†ju·´ÂÉÏÔ»ÆÊ”¨³“¤²ËÕÞÄÑÛš²Âr�¡g…Ÿ»ÈÖÎ×ÝÈÓÛ¼ÈÖZfzGKaEE^>;I9;G;;C>>E@@I@;O@CM@@OCCOC;G@>KCCSKE@MI>Á“hß¼‹èÎ¤ìØ°îܸïÜ·ïݼïßÁðÞÀïÞÁîÕ§îÔ¤Þ¼…Ã�cÐ¥pÄ‹cíÒ îϘìМìÑ ëÎ�èÉžëÓªê̜ݺ„ɤnÅ¡g»˜d´“a²�[ª†X¨…]š}S�uUwfKq[EXKCUG@SICUIItZV xk²‘‚“xfoZSXMEKEEKECI@>KCEMECKGCME@OG>ME@OI;KC;G@9MECME>IC;UE>QG;QE>`OC¬SÆ›fجuݳxÝ´v⹃äÁ‡äÃŽæÅ�çÃ�èÅ’äÅ�èÆ’èÇ’èÉšèÉ™çÈ™æÀŠá¸Þ¶ر|Ñ©tЪtɧz̦vʧ~Ë­‚ȤxÆ¡|Æ¢qÅ oȤrº–d¸“c²�a¯Œ[¨ƒV£€Q¡�X¤�V �VwaM”gk׺´OUcXdr`jlclhMSVIMS@@IE@M@>C>;@;;;66;9;@CGSMS`XguV]qQZgEGVGIQEIOIQUOUdMVcOVdQ[gdpw­¤¡Ë¾¾ÏÄÃɺ¶°¤£¡››‘Ž�wz‚ckyQX`OS^OXfU[Xkqkƒr¨Ÿ”ƺ­È¼­Ã·²¼°©µ¨£�ŽˆnuyfkrV^^ZacZcj^foZaqS]qVcvQ]oQVkQUlQVaMS]MQZGKQQX^hql§¤™Ãº¶ÉÀº¶²ªœ™–‰��|ƒ�qzvlul]g^^ja`d[jl^^h[dn]qvo…��Ÿ¡˜×ÌÉáÙÙâÜØÛÕËÞÙÐáÜÙåàÝÝÙÓ×ÏÂÀº­–šˆ�“‚yƒwx€|x�z~ˆtŸ ˆ±¯œÒÐÃåãâÕÐÇÖÍÃÙÎÃØÎÆÏÆ¸À¼¨¾¹¥´°£œ Œ“–ˆ‰�}ƒuu~nkuflukktfpwfqtlrwnz~kœœ‡®ª˜³¯›�’x~‚jqynØÒÎìéëîìííéëìèëçäæÙÒÎļ´Š†‹¢–™¨�™¥˜“Œ�““›ªŠ” Œ‘Ÿ‹‘¡ˆ‘ k|ŽZl|E;QKKfhu‰¾²©ÐÁ¹��ƒgjjkjppuudfjº²¸Ã¹¸upv±®²‘ŒŒ€�n†…nÛ¾±×¶°�‚ˆ~QOÍ¢ Ý¸«wMKnKM”qc‰]XËž™ëØÔëÓÌêÒÉâÀ¹Ë•†Á�}ªzqrSQpOOqSMnQIkOKqSIrOGrQGrSSº¶ÀÎÓÛËÓÛ¤¸ÀuŒœ›§¶ÒØß¾ËÒ“¯¾lˆœ}“«É×ÞÆÔÞ²ÃÔÆÒÜŸ·Âf“K[rCCX@>U@EX@EQ@>M@;O@;K>>M;;@>;IC;G>>MGCCE@>yZOãÅ™êÔ¯íܼîܺîܸîÙ¹îÛ²ðÞ¾ïݼïÙ²ìÏš§zSªzV¶SêÉ”íÒ íÏ–íÏ—ìÖ­ëЧìÒ¥äÂ�Û¸€Ç§n¾ j­šjŸ‹a¯�[¸–a³�X¢ƒX–zS„oMo]K`SCK@;E>;@;6VICK@>SEEXI>XE>ZG@OC>>63@>>KC@I@COGGME@KC;SGEQGCC@6I@9G@;E>;I@9I@9M@;I@6I@;I@9OC6XE6¸‡[Ú¯vܲ|伇æÄ�æÅ‹æÃŽæÃ�çÊçÅ�èÅŽéȘçÁ„åˆä»~Ý´y×­tÒ¥nÊ¢tÎ¥̤v̦vΪϪxϯ…ɧyϨw̪zÒ¯}̪z¼™n¨‹^¢„]–~VˆuSjIrdM�kO~lOn]GQC@Œdd[dhhlfnpkto`VUOIKE@GGCCMGGSCGM@GICCE>CEEIMMSVZdh^ho[dhSX^[^U[^V`ncdl`jrdlpcQ[XX`[„ˆ�¨¥Ÿ¶­£³«¤�“�…�owrr}hrrck`golgqkkyp‰Š��„©šˆ›—~•—”–‚˜—…”�~‚ƒnfrhgtocnfdjc^hZ[hc]g``ldcqkdtggrjdncfqfanh`nd[hf[cQajX‚nŽ�y‰‘x}†qz€dw„ox}hz€ktw]gn]^gS^gUakVjq`lu^nu^kw`r~j˜œƒ²­‘­®–�”w�–vœ ¤¤‚�¡�˜›€�“t~†kz€gu}dzƒk|‚l„nx�fz‚hy€f‰ŽuŠŽv”“y—’v›•~‘’x…j}‡rrgpxcjuacn[oxft|jw~a~ƒk|‚h�„j‚„p…†q€fx~gz‚p…nvzfv~lt|kÒÇÂêåãîëìíêíëèé¼³¿ª¤­•”ždhy𖔢œ”±¤ž““•‘– …�œ‰“¥‡–§vƒ�r�“q�ovƒqx‰qz‡zx‰ÛÓÖàÙÛÆº·¤�’‹€�kjj��†ÉÆÇxry§¦¦kfcŒ‹w†‡u¥�ƒÅ¸¶vpu‘|xÍ«�Ù´¦¯pjÌ¢’‘``¿Œ…ãžìÚ×éÏÅçɼ٭¢ÀŠ~»‡x˜ldtQSlQQjOOjMGqQKpQIwSOqSI’u‡ÔÖÜÓÕÜÉÒØq†˜Ucy§¶ÃËÔÚ°Àʇ¢²t‰¢ž¯ÁÉÕÞºÉצ·ÊÁÒß­ÁÌnˆšSk‚Qawh–QXpEK[GG]>>U>>K@@K>;EC;KC;I@@M>>EC>;UGEܽœêÙ½ìÚºíÙ¶íÝÀîÛ¸ïݾîܺîÙ´ìКٳ‰aG¯wUÜ­zíÑžìÒ¤íÒ¤ïÛ¸îØ´íÔ«îÔ©àÁŽÒµzǪt³�n¯˜kœ‰^­�a²‘`§‹[¡�U�wQudIaXIQI>@99@96C;6@93I@9I@>I>6K>9K>6O@;I>;>69MECKC@ME@MG@QE>SE>C;6@>/E;3E;9G>6G>9E;9I;;G>6G>;K>6oQCŽ`G–^IÁ�aÚ¯wæÅ–æÈ–åÃ�æÁ…æÂ‹æÄ�èÅŽèÄ‹æÁ…á¶uà¶z߸}ܲجvÔ¬zÕ¬yײ€Ô¬uÔ­uײrÔ­rÒ©rÔ³€Ô´‡Ó®uÁžhº—`®ŽaŸS‘wQzdEk^IXQCXQE`XG^UEcSCME>O@Clojuunvrkxrc]]XKMC>ECCEOIMOGMUKVUMVSOZOS]ZX`[akggnlhqgaj^fohcpahp^nt[z|d|yh]f^XaXlqh“�†—–ˆ—˜Šuynunjpfnxplwhrxakuhp~p}ƒn‘�w•’�ž•}†Šu�j|‚jƒ†n~„jt|dku]kq^luctv^rv^fp`fpcdqfr}ltklyclw`qyfpzgpyakudlu]nv`w|`zƒkr~fnu[rz`tyco|fw~dy}`pt`doVcjOgr^ryar|`qx^ozct|gz…f„ˆd�Šjw‚ju|fu€dzƒg~…p„‡h„ˆj|„kx‚gw�dv~fy€d‡Œy~„hv€lz„k|…o‡n‚Šu„kˆ‡l†‰j„ly‚ox~cu�gnzhjt^ry`v|d}…gy€lx�oz‚j€…o…pz~jxo|�ky‚gz‚j}…px}j¼²¤æàÛîëìíêíìéêËÃ̹´½ª§­^`v”‘‰›’†¯¥��‘–‡”¦‡‘¡€�£zޤw†™q€�w�Šwƒ�uƒ”jt‚tx†ÌÇÉåßàÞÓÍá×ÔÎÁÂ�„‹~rx±ª­wnt™–�``^kodƒƒlž”†À½»„u˜��´˜‡¤j]©lfز¢¶‚xÔª¥èÏÎìØÒèÎÅäŹٯ¤È”�Á“�”jdoOKkOMoSMgMGoQMoOKrOKqUQ·¨´ØÛàÍÒØÂËÒ`q…QZu´¿ÌÆÓݬÀÊ~�­x�¡­¾ÎÈÔß¶ÆÖªºËÂÒߥ¾Ìg†™Xo…]h‚’¬ÀŠš¯[d€MQf@>O>@M>;E>>K@>I@>I@@KC>IC@CM>;ÞÁŸéÙ¾ìÙ¸ìܺíÛ¹îÛ¹ïܺïÞÁí׫çŌÖa…]EÈ�dç‰íÌ•íÓ¦íÔªîÛ¶íׯíМìÒ¤ÜÀŽÍ²}Ưy´Ÿn±™f©�f«�]­ŒZ¥‰Z›~VŽtKtdKVOEMG>C96>63@;3@66KC>KC@K>9G;6G93K>9I>;E99C;9K@EKEGME;ME;G>3E66C;6@93@;6>;/E;6C96G;9K@6E>6QE>�rMÌ dÔ§lÄŒ]Ö£næÃŠæÄ�æÅ�æÃˆåÁˆåÇèÅŒä¼~⺂à¶uÞ±pܱwܱ}Ú²Ö¯yذtÛ¶رwÚµ~ײxÓ¯xÕªoÔ²~Ô°Ó°v¼›h²–lª‰]›}V‰qKpaEVO@KC>QG>UM>XQ@aVCGC>K>@y�glv`lycqwaouago[U^S[fX`hZal[fp^gtcn|gv|gu|ct�lv€jv‚hx�dy€jr}jpyhp|j~fŠ„qpr[cn`qwf…‹w“’‚•—�x�rp|jw€pzƒl}…l|‡lz†py†nŠŽt�™�œ•�„€hhnZhjStzcw„ly‚hqyahxchvcgr]vza~|auxdlv`q|f~†nƒŠn‚ˆny„gxƒdx„f|…h|ƒk}ƒhvƒk�‡oyƒkv€cu~cpzcqydnr[gkSjoV`kVktVjwZv}f‡pƒˆfp}`q€ct|cpz[t|]lx[q}]w‚`vƒntdv~cr|cjt`hqUdnUkv]r}^x}]v�dvzalyapy]lw[w~aƒg|�g}€dyfu|cw�gx‚j�…q‚„nyƒhrz^qz^u~`py`lzhju[nxaqzdkyax�krwZt€f„‡n‚‚j……o‡„l¶¯¤ìêììéìëéêÛÔØ©©¶ªª¯goz��~ž“�•Ž„z}ˆw�}†“}‡›†��}�¤z†’~Š�y‚‘t}Œjnxv‚–‹� ÂºÂìéììæçëæçæßáÏÅð¡œrlk€~~]V[cdV}k´³«š–’rwd³µ®‡�…”†u¼ “ѯ¡µ‚zæËÃëÖÑêÓÌãµ߸¨Ö§›Æ�w´‚rƒ^ZrQSkMMnOMnOMnKGgKEpVZ�v‡áÝâÌÒÙÆÌÓª¼Æf~�p‰›ÀË×ÅÒÚºËÓ›­„•¦¼ÉÖÉÖàµÄ̺ÅÏÆÒÞ’­ºa€–Xfx‚„�ÀÊÕÈÑÛ½ÎÖƒ• @9K;>G@;C@>I@>Q>9>>;CC@E@@GK@>ݽ’êÔ±êÕ²ì×±ë×±îÛµîÛ¸îÛ¹íÖ­Ä”Z’gGŽ^Gä¾…êÊ’ìΜìÏœíÓ¤ìÓ¤ìÑŸêРßÁ‹Ë°uÁ¨p¸£q¬šk¯–d ‰[¥‡X©ŠZ£†S’xX‚oOhXCUI>G@9;33>93;;3>66C99E;9E@9C66G;6M>;M>;I>9;33G>@QGEKGC@63@6/@93>9/>63>63@;3C>6G@;I>;G>6G;9G;6M@6dG9È“aáº�ÞµtÆ�]É™dÙ±våÅ‹æÃŠèÄ‹âº}Þ¶Þ´v߸}ݶÞ¸~Û³€Û´}Ù¯oÜ·‚Û´uÛ´wÖ¯vÓ¬xÓ©oÖ®uÙ¸‹Ù´|ɦrµ‘dªŒ` †[†tUxkO`XEIC9I@;E;6MC;KC9cOCI>;C99…j|€jkw``n]jt[pt]^jU^n^fxdr€ht~dl|ht‚d~Šp‚ˆl�ˆn‹r†nz…ly‡n~‹pv€hz�cv�lw~hw€f}„n„†o‰�x�’x�•ƒt}fnxhhuZpzcp}`€…k€„g~‡lŒrˆŠk…‰qrygkp[nu[t}dv}ht`x~^py]nuZ`oXXgSclSpy`p|`rz^p€dx†kˆŽnŽ�v‚‰ky†l‚Ž}�•|™‘~“Žq‡‹t„fv€cr�nu~az`–�tƒaxy[hq[oy^t~c}„g~‰u‹nv€jx‚fy‚fvƒjpz`p|`kycn|^gx`nxV}€h}�cn|]rf~^z|]ƒ…f„†oy‚jnyany]u}`t~ary^q}dx…gx|fx�fwƒjz€^t€dw€du|^u|`w|`rw[gtZhu]kt^r}frzatzfow[nxcnydt}f…†l…ˆr|�h~}a†‡pÒÈÁíééìçæßÓÒ§£± ž­rt‰yux…ƒ…z€†x†˜w„�~†–…–�ˆ’€ˆ•}Š™zˆ•x„‘x}‡tw‚w†‘|„��Ž›èåæìèçëåçâ×ÕàÔÔÓÇÁz}qrrqokt|fz}j¬«©qlj|~l™”�­ª§¼®§È»´ÔÌÅСœêÓÌëÖÎèÍÆáÁ·Þ·¬Ô¤–À�}ª|q€[SkOMnQKqOGlOEhKElMK£��ÝÔØÒÔ×·ÁÅÄÍÕ‰ž¨“¤­®»¿–ª¶³ÅÐÂÏØ�²»y‰�´ÅÓÉÔÞºÊÖ¾ÍÛÇÒÞˆ¡²[v�at�ºÃÏÏØàÐÙà²ÃÊlryUVf>>E>;C>;C>9G>9E>;E@>E>;@K>@×¶“éÕ³êÓ¯êÓ©èÏ£íØ³ìÕ¨íÕ­èÉ”’gC‚^E¶~VéÇŒëΜëË“êÏ èΤåÅŒáÅ’×»ˆÉ®w˲uªn¾ªv²œn±šj±“h©‰Z¦ˆZ•~V„pOvfGcXEE@9>939//;66;96>63>33@66>9/E;3G;9Q@;O>;K>9C66>/6G;>;63;3/;6/;3/>93>63E;;@;3E;3G96G>9G93E;6G>6I>6M@9S>9£qOΜcݳt­„Q‹fEº‡`á¹zãºzÞ¶}Ø«tݲ|ܵzܵyÜ´�ݶÝ´yÜ´xÙ°wس€Û·†Ô¯tÖ­oÔ°uÙ´zÔ±vÒ«o»šg¸œl°”a�|ZlaGfZEMG;C96>96>96G>9E@;E>9dX@OG>~ƒf|gnwaS]QS`Q^dOS]KQ^Q^lVt}a}†op�kt‚h~Šoˆ‹q�–}�”�‰”vny�hv…ow€a‡ˆn�…rq}htfƒ‹xŠŽyzƒlv‚dn|fclVcq[fuVqz`pz^|ƒcƒa|ƒh‰kƒ‹o}…gwhw}axdy€jny^l|`|…jpz`kx`dq[ZfOgpUtju�ct‚hp�dw…lŠŒrŒ‘z}†kuƒh„‹t•–~™–€—–€‡‹p€ƒc~�cw‚lz�cІh•�o€…nw}[nzcy‚g…�q”’}�Šo€‰ku‚jy†g~…fufq|ft|`r~fr}hhvclxaˆˆj‰�nu�jr~g„cx„f~„l}„jwfxgt€cƒŠqv‚dq~fvax�f|€g|ƒgx‚hzƒctclxZgrSjxa€…h~dlzar|hqz^vaw~j|juy]qzdozco|d|f}ƒkxjc~}g«™Žìèêìæãçßá³·²ª¯~zˆœ�“žŽ–†€Ž|‡˜y‚�ƒ�ž}…�‡�w„•|‡”|ˆ–€†‘rw€pv~wƒŒ}‡�‚‡’ÞÖØëååçßÝäÛÙáÖÒÔÈÁˆƒ}|z~lnqgqcrvl˜“‘vqgƒ†uŒ‰ƒ­ª§»®£º®£¾µ­Û´¨êÕËëÕÏçËÄྴݷ¦Ò¤™¾�}›pd|ZSkOIhMIgKCdM@hKCnSSÅ´¼æââÂÅ˧µ¾ÄÎÖ�Ÿˆ„‘ú¼k|…•§´¹ÈЭÃÌq„š­½ÊÆÓÜÁÍÙÂÏÙÆÓÞ†¡µa~šu�¥¼ÈÔÏØâÐÙᔢ§^`fKGV>>E@>I>>E;6@@>E>;E@@O>>GI@CЭ�çÒ­éÓ²çÍŸèШíÛºìÔªìÓ¦Þº}ˆcE�^CÈ“]êÊ�ëΜëÌ•æÈ”åÇ™ãÉھ„е~ǬwͱvÁ©o¸¡j¯–g²›k·œh±–k¤…V–|U~kOk`IQK>E;9E;6933;66@93>33>66;66;6/@63G>;M@;I>9G;9E69;/693/63+;3+;3/93+>9/>6/C99>6/C93E;6C96E;3C;6C>6G;6G>6E;9]E;�aGÕ§kË¢a­ƒMlO>Õ¥hß¶tÞ¶yÓ¤qÛ²xܶ‚زuÛ´‚Û²uÛ´zÛ´|ׯwÙ²زwÓ¬rЭrÔ°vÖ²zÒ¯tЫoÁœh¬�`�‚U„uVf^KZQ@IC;>96>63>93C99@;9@93UE9UOEou`fp]dn[dpZhqgjtkhtjhrkkudn~g~‡qw…r�Œy ˜x¤žŠ –}…‰vˆ‰qy‚jo|nr‚l}…j�–}›“xqy^q|cxƒk„‰n~‚jt|aht[`kZajZgua}„p€†l|‚d}„h€„f‚‰jˆ�tƒ‡l�‹oy€f|‚jˆt}„k…j†ˆjuycnr]jvao|^~„pz‰t‡o}„k~†hz„p‚‹u‰�z‡�rz�f‚‡g�‹ny€dr~fp|go|dlz`lyf|„lƒ…l‚ˆjz‚fxy]tz`„‡nª ‘¾«š–’€}„npju`w~^~€fuzfuxXhqZZkZZdUalX�ƒk……lu~fv|axc|ƒlw�fv}^w}c~„oy‚dyƒlrz]ku]v}gn~hq|^t‚g�…q~†jz„loz[nuXnzcx‚g~ƒdw~^‚…lz‚j~€ky€g~†l||^kr]loZcoVgrdrxfy€c|�hˆ…oàØÓèáàéãàèäåéâä×ÉÌο½çãåáÛÝßÙÛÁ¾ÃŒŒ–Ž”¡}‰–Š•y„•y†š~…“z„’glytyˆ|€Šu||owz “˜ìæåêááéããäÜÙÏ÷pkh¶¶µxox^`dqllrno^Z]][Vrqf§Ÿ•™��†tq–ljåÅ¿êÓÉêÑËäžٰ§Ú° Î¤–“kZwXQoQMlMKdIGdKEcK;lMEdgÁ¾¿×ÔÕ¶¾Ä›¦³ÄÎ׈›¤´ ŸæÚʨ…c€^V¡‚|µ³ºau���ªÈÓÛÂÎÚÅÒÝÀÐÛŒ¥¸‡¤·ŒŸ­ÂÊØÐÙàËÖßhv�OVcGCQC@M@>I@;I@9G@;C>>C@>E>>CC;G¸ŒjåË¡éѧäɤçϦìׯëÒ¦ê͘Хl‚[Cƒ^GÛ±zêÊ–êË’ëΜäÃŽáÀŽÜ¾ˆÖ¶}дƒÍ®nÆ«tŧn¶Ÿgµ�l¼¤qçwºœjªŽdŽvVnaK`VCEC6@99>63>93;66>;9>6693/933;9/93/93/E;6I>;G>9E999/39/+63+9/+;/+;3+96+;6/96/>93>93>;3@96@66>96C96@93G>3@66C;9E;3[@6§}S¾“]}cES>6’dG׳~Õ¯zׯxÖ­vÖ«qر}×±wÓ£pدzÖ¯uЦhÓªpÓ¬rÑ­xÍ­yɧo̪vÇ£lº™hœ‚VŽyQ|kKOI>@;3;9/96/63+33+96/;6/;3/96/963‰tt}gr}hw…lŸ¦�¥¬ž§­¡’œ˜‡“Š�‹|–¢‘•—‡‘—‚˜™}•–~}�f}€jt~ghq^w�qvƒu�ŒvŒ”}“’}w�jryavdpf…�p��u�“~„�u}�nyƒfx„k}…h~…gx‚nx�jy€gqx`ow]…Šu€„kzƒjz€ojt]qyZpz]t}dx�hw‚dw`wˆl~…o~…hz€fy„n‡�t˜“y›–~˜˜�‹u�…lƒŒuzfpy^grarfr}dnwaƒ‹rƒˆp|zZ~�hxza^dSgoUƒ‚h�‡jy�grzdfrXnw]p|fx�f~ƒkw}cu€at€jv�gyƒgy‚gy~`q~cr}aw€dˆˆh~…jŒŒr…‡p†lz†n}†f…‰kˆn€†hw€dq}`qfx€gw~guz]ƒg}~^�†o†u}„k~~goydgp[qx`…„f€„gfo]prfwyf‹…p�Šu‹…nˆƒj”ŠuÆ»²á×ÏÆ±£ÔüéáäéâáêæåãÜߤž§‘�Ÿ¼¸Á“˜§²´¹¤ª¯�‹žvƒ’t€“q‚’v„’…�llrx}„„Šntqfdc Œ‹ëææéããéâàáÔÊͧ[ZU€vn·´²roo„€zxqhxxglk[�€€¶©Ÿlgh§‡„Ë “èÐÉêÓÎêÑÉÞ·²Û´¦Ö­š¤yopSKhOGhKCdGCdKEdGChMChMEÙ`¸ˆ^¼�g‰wt‡ƒ�¹ÅÉ}“�´–�èֹЫrΧréÔ¯ÜË·^fz~ˆ¡ÅÔßÇÐÝÉÕß´ÆÑœ²Áª»ÇÇÐØÔÚâÔÛã®ÄÌQ^lOU`OS]CESCCO@;E@@M>;@>>I>>@>@I@;E‚[OÕ³ŒèͤáÁ–çÉœìÕ­êÏ èʙŗc�[E‰cGß´vèÈ“éÉ“ëΘæÇ™ä‹ػˆÓ²zέw̯yÄ­yȰ‚¿§uÄ¥oĪz̰~½Ÿk±�[†rOaXGMG;>;6@96>93;63;66;63>33>6693/96/63'/+'@;3C99C99@663++3++6/'9/';3+;3+96+63/963;6/;6/963;63@96933@96>96C93@36>96@;6>6/C99K>6hQ>K@9@6/‚]GË gЩtÒ¦qЩrϨnÓªnÔ¨oÔ­uÒªqÒ§jÔ¯wØ´yÖ°tЭtÅ¢fÁŸhº–aª�`�wO€nM]SCE@9>933/'63+6++//'63+6/#3/'+/'+++‰�uˆl~‡nƒ�q«®›¸³¡¡£–ˆ“…}Œ~��…›¤–’”†‡�w“•€ŽŒv„ƒj|„n~ƒh‡o€†qz…n}ŠoŠ“y‘’wzcqu]qr[VaQpy[‡kŒ’y}†jwg‚Œuˆ‰r|ƒgz†np}dhv^luX[fSXjUu|dx|c~}cw}n`gS`hSnz^~†t}ƒjx~`wƒf|„du‚j‡lz„o��vƒ‹nŠ�x�‘|Œ�p‡Œr}‰ox�hox^coUgwcyƒkz„hz†pˆ’y~†nxz^�‚d�~dqt]gpXju`r}gz†ox€gntZgrVr~d‚‚jz~apy^o|ao|`u]�‡g|ƒdz�f~„g€‚cƒ…d„‰j|†g„g|†oz‚hw‚fz†k€…dƒŠh~ˆj�ˆkzdrz^qzft~jrza�‚j�‚cŽŒp…o}ƒouzdku^kr[uuZ�ˆd€…gdlZ|~h„…o’�w’�qŸ”x�ƒo§œ‘ÝÖÓÞÒÌÛÐÈÙÊÂìéìëæèéååçàà­£©‚��”œ¤lu‚Ž•š��™l|‰n~‹r��t�Œx‚‘‚‡�lnox}‡~€}gjpcc`˜†‚êäãéáàçàÝÜϱ§šUMM[UQ�–�¢—“pjn}xpffd]]Z–Œ‚¹¯§vlp¸”Œ×°¤éÐÈèÌÂæËÃÞ¶¨Ù²ŸÏ¤��j^nKEdICfGCcIGaE@dI@kOE}XMÁ�ZÛ¯làºw³ŠpnUX—�”donµ’ŒèֹϨnÌ péЦÜɵ]g~€�£ÅÒÜÉÒÜÊÓÞºÍØ´ÄÐÃÐÚÌÕÝÒ×ÝÎ×ߎ¢³S^kU[gOQ[GIQECQ>>G@@I@>E>>E@;G;>@@;E^GG¼–xèÑ©åÇ™çÉ™ëÔ«êРçÈ”¿”azZ@‚]Cß¶zéË”éÍ›éË—è˘åǔڼŠÒ´€É§p˯uĨvĪzÁ§v¤o̯}Ϋu¹�k¨�]zlOZQGIE>;;6>96>63933;63;63;33;66>6696+63+3/'9/+@99;666//6///++3/'93/;3/;3+99/6/+63/93/>6/633;/3;6/963>66>93@93E69;66>63>6/>96;6/C93G>6E93M>3É£qÒªoѧnϪtÏ¥oÎ¥lϦlϦkѧnÔ¬p×±uÖ²xΪoȧtƤk¹šc³’`¡‰^ƒpM|gIVK>;6696/3/+//+/++/+'3+'3+'6/'/+'+++€ˆj‰ˆo�„o“�vŒ„j€€ny}ft}huƒl|†j‹�xŒ�y~ƒk‚‡qˆ‹p†…k|�jz„k‚€gŒ‡k�ƒjtfnz]lv]hp[ahUrt[xyk~dvzgw}`wyau|d…‹rŠ�|}‰oƒ…h~†j}‡r|�g�…l…‡k††h�€d‡„h|�nƒ‚o|~f…‰jˆp‚�fw�lw‚gv~`w~fv|[ƒdy`w|`zfu|f�…l…qqx`ow]zy]jq[[dOr~czƒgy†nŠ�v€Štkz`tdp€cpy^oxXt^pzc�‰oƒ‹o�cŽ‹n–�u�Špy|dlu]ltZjw[k|`uƒht|^r|[~�cyƒf|„jz‚f~†hy†n|ˆkuy^t€f|„hp~d~…l�„n…k��uy|]p|juh„‡n’ŒnŒ†jyya�ƒf�…d|�dnw`lxa|a�„h‡…onta}�j„hŽŽr‡‚k}zdxwfÜÔÐäÜÙÝÔÍȸ²èäæîëíìçèæÝÞìèêÆ¸À•�’qxŠV[rX[uMQkOMcIC[E9SGI]Q[h~ƒ‚jgppuxqwyZ^^QOM³ª–çÞ×ã×ÑÝÒ˶§’ytcUMG}xd||k¸²¦ª¤ qln�}w“†n¾³§À±©…vqÒ§ äÆ¿êÓÎåÇ¿äž޸­Ã”€£vfoQKgKGaICdICfKE`E@fI>ɤhÆœ`¸ŠSÙ¬gã¾yãÉ֭xæÍ›­]Ú¶�ìÛ¸Ô¯y×hçÍ¡ÞÖËan‚� °ÆÒÛÉÔÝËÖÜ»ÊØÈÓÛÅÐÖÉÓÙÁÏØ£¶Ã—°½ZnzXcnUXdKO]IIU@>K@>K>@GC@M@>C>;@>>CC>>nQIáÅ—æË›æÊœèЧè̘劶�^fO>oQ@ݱwèÉ’êÌšèÊ—èÉ�åÅŽÝÁ�Ö»„Ì©qд†Ì¯wÁªyÅ«tÆ®w˯wɪyº™^¦�arcEI@;>;696/>66>6/9//;3/>66;66>69933;9393/;6/6/'9//6//3/'/+//'+3/+6/'3/';/+63'33+33+63+9/+63/;63;6/633>3396/>3/9/363/;63;3+9336/+;6/@66@;3/+#]C9–pOÉ¥qÌ¢gÉ¡hÈ nËŸhÌ¢hÏ£fÔ®pÓªhɧpÅ kÀ�f²“f«�^¦‹[–�Vj^GcXEKC;3/+//'/3'++'/''/+'3/'+/#3/#++#+++„“}€†jy„g|ƒjhl]jpaqwd|jv~f}…gpzfkt^ju]Œ‹p¤œ…†oz}f“�t‡cwydux`kz`�‰ox~hrz^‚‡o‰‹lƒŠn}‚ft€c‡�r†g…jucu�`kuVpz[xƒhzˆn}†fx�gv~ay‚djuVjvZju^z€d‰‹rƒ‰jv€fz�h|…fly]t€fŠhux^^fUZdUVaUnx`x|^x~^v|dux`pv[orVoq]lu^fu[[kM`q[rxZouZfr[hvVcoXx|[…�r‰�uw…j‰pˆŒky€h}ƒdgpXhqVhqZq}f`pXgnSntZƒŠofqXhu[zarxapyaglVdnZktcpgy…g€ƒ`oycuwalq]w}a‚‡q|‡t||`„ˆo„…hxh�‹o„‚n‡f’‡qˆ}^go]frdz†u|…nw}dƒ„h……oywatvau}jacUfl]uw^ÇÀ­¿µžƒ€kÔËÆíëìîíïïìííëíìæéêçêÞ×Úrz�cp|gx„���‚‹�xˆ–q~Œ[`hMM[QOZdhp[``dgdKIEOMK…h¼± Ïͧœ�of[QICfdX‚‚j}~g�ˆo¿¶ª«¨¨ylnœŒz§—‰ÓËżžžãøæËÃçÌÅåȼãÁ¯Ø´¤œo[}ZQkKG`GCZC;^E>]CC[GEOECœtOÚµv•[ǘ]ßµrêÏ—Õ§lçÉ’Ú°téÏ›íÛ²Þ¾‰½�aáÂ’áׯ‚�¤©¶ÅÆÓÙÈÒÛÅÓÛ´ÆÔÆÐ×ËÒØ¼ËÒ†–¤™¨¸— VjtS^no��U[hGEMCEVC@S@@E>@I@>I;;E;6@C>EECCɧ€áÉ¢åÉ—çʘèΠãÀ„¯ŠX[G9^K;ΣnçÈ–çÊœèΜçÉ”åÆ�ßÀ‘ÝÀ�ܼ†Ô³ϰϯxÈ®wƧoŪx¾ j§Žc�~XaXE>9663/66/;33;3/6/3>93;9/9339339/3;9+;63;3/93/@96/3//++/'//'+//'9/'6+'6/'/3'//'6//93/93'3/+;//93+///6/+//'6/'6+363/96/9/+3/36/+3/';3+;3/63/63'6/'Q>9—wS²�aÁœdÅœdÅœfϪxȤf j¾œj¶�a±“g©�[˜U‹uQ~oQ]VEOG;>93333//'++#++#+''++'/+'/+#//''+#'+'‹“yppXnrVx}fkucozd€‡p�„kufyƒhpxcludny^”’tŸ˜~†…n„€gœ�oƒ�ggjZ]hUt�hv‡q}†lnx]…‡g‰�qq|^w~goy[‚‰l€‰lƒ‹oy„a}…jtz[t~d��cxƒjrcqz[ozaw�dp€gp€jjt[y…k€ˆk|‰jq€gv‚cwƒfk}ap‚d‚d`cMMQGEICCI@dn]u|cx|adkVfo[u|agqVfqXltX`oZXgOclQrvZuycdw`t€gqf…†jŽ�u‹’x~†jt‚gw~`ry`‰†cfgQS[K^kSq~f^jUjkSrzaŠŠggq[oy^�–rtqVxw[XZIV^Sgp^|‡lqz]y‚`|duyd]fSoy^|…rv}fxxZhqXotQlt]‡…nˆ„h€w[…k€|dnv^ry`‰�u‡‹wx|azgƒ�lx~l}€kuw]hkUzwd}|`ƒ~d�}cwxdÙÎÆëåäîêííëëíêëëæçèãâéäçlpƒOIaKGZkkoUXfXaqlw†v‰ghnIGKQQ[SUZSQI;;9E@@€|kuj]Œ€kzrn[QGSQKzxa�z`‰ƒkš�u•‹tÆÃº¶¬©}uzŒ|}À²¦ÛÆÅäÆÀæÎÈåÈÀäŲã¯Ч•ŽdXtUKjKC`C@ZE@[E>[GCgUOZS]t]Vͪ€Ï¤g½�ZØ«kêÎ’Ù­tåÅŠá¼æÆŒíØ«ãÇ”·ŒaÝ»‰â×À’ž±¯½ÌÆÓÞÆÒÜÇÔܹÉÖ¿ÌÒ»ËЛ¯µœ«¸°ÄÌh|†SakX]n�š¤p~‰KM[GESGCQEES>CI@>E>@E>9E@;@@@E•t[áÆœå̤äÁ‰çÌ™åÉ­ˆX[E9^I;Å—fäÆšçÆ–èÊ—æÇ“åÆ�ß¾‰ßÃ�ÞÀ‰Ü¼‡Òµ€Óµ‚Æ«xäoÁ¡l¶˜h”…Z}rOUM@;6696363+933;6393393366/63/93396696+;3/;6/6/+9//+++3+++'++''//#6/'6/'6/+33'3/+3//3/+93+3//63/6/+3+/6/+//'9/+3+/3//63+6/'3//3/'//'6/+93+93/3/#//'93/O>6vZG´�[ØcÆ¢lÃ�k±“h¯Ž[´�g²�a§‹c¢„[ƒtOg]Kn`IUQCOI>>933/+++''+#'++'#++'/+#/+#6/'++'+++–ŽrpoZwvf€�pklZnr]‹Œt€‚l‚~^lx[nzcu~fjw]�`Œˆnz}fzhˆ‹oz‚g|~fgp]r‚fn}co|d‹�uƒ‡gxƒalzgz~g†�d|„hƒ…ayƒcw„`€ˆn…ˆp��r‹Œuƒ�g…‰lŠŽt|…jw‚fŠ�u‡fqc��rq|alyV`oXalSx�du‚fr}`Z`K63'966////33C>>IGECE;hr[htau�j€‡hp|]v}at€gx~[�„f~|cfjVakVku]z€k€†l‹‰k…†l}€aƒ‡rƒ„h~`Œ‡d�‚h‚dt|glx[oz[ƒ‰j““vމhyƒay‚c¨ �–‘q‡ƒdlp[ˆ‡n”�uty^y…o‡‘wƒ‹nx}c`jXy�h�‡rˆ†j‡ŠkwwfdqX�‡tz}[}ax‚oŒŒrƒ‡ku‚c€…k‚…kŸ–}†…k‚hyƒqz}gqua ™ƒ……j‹‹qŒŒrko]w|fЇtæßÝçßÜåÙ×îêëîëëèáãéååß×ÕØÒÓÑÌÍÁ½Àu|ŒZ[fMM]E;OOSadnrVOSC;>CC>OUS;>>]ZUŒ‹wІl‹ˆk–�t……n„…hІoyk|hwzj†‚o„‚l¬¥˜Ä½ºÁª¶ÔÀÈîêìíäääËÉâõãŸ޽±¦zppSMkKCaG@[E>XE@[ECroa€j¢ “vŽ›š Ö¸ƒ¥€U´ˆVçÊ“â¾�áºéË�߸vèÊ�èΚºŒ^دyßθ»ÆÍ¼ÈÑËÕßÉÔÛÆÔÛ»ÌÙ²ÅΪ»Åª¸Å¬ÁÉz��SalU^lnq€¶ÃÌ”¤«U^kGIOGESGCOE@KCCK@CK>9E@9@@;CC;@³�qÕ»‘ßÀŽäÆ”åÉ�·�]OC6]G;¬X຅åÇ”è˘åÈ’ãÎྌÞÃ�ßÃ�áÃŽÕµ�Ñ®tʬt¸žj³›h¦‹[ˆzUukMIE9;3393366/;6393+6/+933663;3/;336/3963C93>63;3//++//+933++/+''/+#3/#3/#/+#+/#63'3/+//'6/#//+/++3/'+/+3/'++#6/'/'/3/+63+6/'+/+++'+/#3++6/+63+3/++/#3/+/+'3/';3+y^I›zUº–`°‘a«�c§ˆX§‹[œ‚X‘xSohKUMCXK>@;6>936/'3+/3++++'+/#''''''/+'++#3+'+''''+fn[kvgp|ft|`dp]nudrv^y�dx‚a�ˆno}gnxcqzfŠ‚a…�d„�j“�u‰‡nagQjq`hu`ry]fra`nX|„kkpZUZGfu`•“x‰Šk]nShq[ct^dqZz…n€†j§£ˆ’�o¨¥ˆ²¥‰ˆ„g†Špއf‘’|„Šrtd‡jkxZz‡k�–}ov^z‡lS[KMXKou[3+'/+'++'+/+3///++++#966EMGnwc��p€ƒ]rtUyfroQ€|^[XGEC@9;6QSIU]KluX‚€]��ox|c}„h}}cgaQcoVfqV`q[oxXfrXqyV…ŠnŽ�oy€clw[oz[ktXvav}[~‰owy[w|dzƒnfkSgq[zdju]jrXuy`~…qlpatt`tw`x�gdqZkpU^fKS^MjlUux^rw[z‚j‘�u–�rx|[y~g†„g�Œw|vfcgUvyc„…o~ƒjkkXy}hœ”‰çàÝÝÎËçÝáçÛ×çÞÞèãäÝØÖª¤§Ÿ¡§Ž�Ÿ�ˆ–Zfwfr|V^f[^g@CGC@@QKIGCC>;;@;>QVMkh[�Šq�f†‰l‡…l……lŠŠtƒ‡luu^]`SloaacVoj]qnlÛÊÐëåæäÙÛëææìæèíèçݽ¸Ø·§Ä›‹}[SdICcG>`GCXE@QC>[UG€uf†vcuhU™¤§£²¶ºÁÅqgx[U`‡lwåÉ–ã¾~éÊŽâ¾wâºxëҞɚcدz×î½ÈÐÄÏØÇÓÝÉÔÝÆÓܾÎÕ³¾È»ÇдÇÏVkrM`oU^n}‚‘±¹ÄÉÑÖ‰•™SS`GGQGCOIGOEEIEEO>@G@;I@;@;9>>9@E9;gKCÕ´‚áÅ“äǘȥpQC;UE9’pOÖ¯}ߺ„åÅ�æË›ãÅ•âÁŒßÀŠß¿Šß¼ˆÔ°wÒ±zɦoºœk³šj˜‚ZytSolOG@9>6696363/93/;3//++6//63/6/+933;33;;393+9/'6+'/+''+'/++/'++''+/#/+'3+'6+'+/#/+#/+'++'/+#+++/+'/+'+++/+'/+'3+'3'/+/+33+3/'+++++'+/#9//3+'3/+9/+++#3++//'33///'9//9/+SE;†rO“�V˜|Q‘wQ�vS}gIcZE^M@SQC+/'3/'3/'9666336/'33++#'''#++#/'#++#'+#++'hp[ly`l}hr|dqgu€fŽŒq��jpv[r�fyƒlv|cƒŠn–’y�Œq„ƒj›�zŽ„kOSG[]Sjuaz|hrw`]hZ]hUX[OEG>IKEv�hty[MXKdpVdt^u…kƒ`��q�“wœ�‚§¡†²¨’žŽr’ˆh�”u|‚crgju^ZhUS`Mdt[Їq^dUr|`GKCGSGV`M3/+3+++/+'+'+'+/++++'/+/666agZ|�k|ƒgpw[jlXkkQzuV[^KKMECGCc]QQSK[fUchMpnZSZMao[opXjhXZcOQZMIUKgu^jxcov^ˆŠq„‡nrz]ju[jv]ajQQ[IVcKnwZtxZrwh}†l}f}€ftxdQZI]gS‡‚k]hV`gUln]]`Vfp^[hX`jVdgU`l`px]‚„duzg„Špœ–z‘†kruXkt^|yf�Žp†~h[`Swxdqq^vzhfgZnuhµ§ ÓüßÔÕíèìéáàèáàéåæÅº¹ŽŠ™w}’fl€ZawGKaIIUIIVhklOKMC>>OICGE@>9;C;;EICXZO��k|kpt^ko^y~d…‡kxx]kjUZXUXXOMIKjf`Šv‚ìæéëäãÝËÊêäææÝàëååãÒÌä–«‡wlOIdKEgOEZE@XGCVKEMECXUO`[Mxt]|}r›¦©¸ÆÍºÃÆœª´Ÿª¸ÝȨåÆ�çÅ„æÃ‚á¹tëԠϢkÛ±yÓŶÀÉÓºËÖÇÓÝÅÒÛÉÔÜ·ÅÒ»ÆÏÂÐÛ‡ž¤M]oIVhXcrª´Á¿ÆÏÈÓ׊ž§V`kIIQKEOKGOCCGGGQ@@M>>I@;C;9C;9@@6;E;6²�hÜ»„áÁˆÒ°|SC9G>3ŒlMÈœjÖ²€àÀ�æÉ•ãÆ”ãĕ޾ŠÝÀ‘Ü·|Ô´Ó²|ήy¼œhª•f‘�QqjMc[CGE;96366/63/9//63+/++6/+63/6//63/93/;6/93+>6//+#/'+'++/+++'+++#++'/+'//#/+#+/#++'+++633/+#++++++/+#++'/++/+'3+'3//3++3/+//'//+++'/+'//+3/#3/'9/+/+'633//+3/+/+'6++3/+63+I;6XK;�wS‡uO‡qQtaKXQCKC9[ZG++#++'//'/+++++93/+/#+''++'++#+''++#'+#++'X]MKSKKOIZfXqy^kxdhy`ft^`fUVhVpuXlrZ`oSrygdjVglVƒ‡n|ydSOGZXVGKGfVZQOXS`kXao`^kXS]OEIEMXIal^U]UOQMU`Mpzcz�dƒ…lnw^o}crxaqvav~fqy^ZgVIOG@C@9C>>@9993633963;99;6663/@;9>>9Z^Q969+/''/#'/#/++@>@EKIEKCVcMOUIGKI;C@IMCKSGU[US[VKVIlrXqw^cnZtzcuwa`aXIUIap]flVnqZagXp|`fqXhu[lw]ju[t|cadUIKEMIEKQMScVV`QMQIfp]gn]r|[QVICI@EG>6363//kfX>>9EEC�‹rlc[GGG>@@glXagS^^VrvcZZQknZova}}h†„dnr^jn[[aZgg[yuatn[kg[`[Mtqd~wgŠ�}éæèÛÍÍàÔÓêäÞÞÒÅÛÏ÷¤›ÝÕØÞÕÓØÏÅÄÀ¾¯©¨rx�XVcQK[IEQMOO[ZQwo]jjZtnhSIGSVUQQO>;9MKIEE@QMK^^UXXO][QVOQ|rdohctklÀ¤­æÚàíèêìæåäÙÛçÞÞßÒÏßÔÐãØÒšvoSQcIEV@;[C>UC>lfXvp]hnUttf|tcwva~h€}j °ºÈÏÔÍÕØ¶ÁÍËÏÌ®¤£—zk¿žqÆ¡oéМàÁŒãÂ�ÜÌÃÃÏ׺ÊÒ´ÈѾÍÕÂÏ×ÅÑÖ­ÄÉ€š¥OVaMSkQ]tœ§³ÁÍÔÆÐ×¼ÈФ²¶‡’‘QMQMISKIQGGK@>E;>C96@>;@;9>>9C;3;96996/™x]Ȩ}Ü¿’t[CE>3^I@°ŠfÆ�hÞº„äÅ“åÉžÞ¼‹Þ¿ˆÝ¼†Û¶~Ö²xÔ²xÑ­vâlµ–f™‰^rjKc]EGC996666363+93/93/3//33+63/3//963;6963';6/63+/+#/+'+++++'''++''++'++'//#//+/#'''6/9+/#++#'+++''++#++'/+++++/+'''+/++3/+3/'++'+/#++#/+//++++'63'6/++'+'+#'+#//'@9;3////+/+'++#9/+K@9ZQEUK>E>9@;;MI>++'6//GE@'+''+#E>6//++'+''#+'#+'#''##+#'++U]Q`fUfj[SXIV^Q[cO[^UQ[QV`Onz`rz]`hUSaVXaO[aOXgXV[QKICOUMQXMIUOGIICGICEE>;9996@C;>;9EGECE>„jrt[jl[IQEIUMCGCCC@@C@>E@@@;;96;>>;;>9399633/+/////+33+3333/+EC@^]InhVjl[]aOSSI///'+'3+/936C@@jp`V^QKQG9333/+;66696IKC[fV@@;CECQZIU]IEI>QVGprZlq[V[QKQGCC>[^SflVfhVhr]SSKV]U]fXkr[KMCX[SIEC>69;>9UVKX`Svvajl^hl[X`Sdn[akZnj[ccXqq^ƒˆt€�nh‹ƒj‚~faaQgl^‘Žw”�tˆ„k‰hˆ‚l”ŠkhjUlqZ‚cjdXUMKQMKpfXŒ}k^^Oƒ€jŠ‚f�€q· ’×ËÂìééìéèíêêæàÞȺ¬­œ‰’ƒxµ¨ Â¹­¸¶¶ŠŒ�z~~|~�~€oooE>EVUM^d[xwcˆ}fƒ‚hukXrzohdUnh[}whnj`�wr¤’‰¡��¦�–«°»ž¤äØÜåÙÝïíïïìïáÕ×ëäãëåæÌ´¸ÝÎÆÉµ°É¸¥�ufkfXSECSC@UC@f]Onq`rw^‰ˆt†}d†€oš•u‡ƒh‰‡q�„t±¾ÄÄÎÑÏÖÛ²¾À¸ÆË°¾À�˜¡xnqçÌ–éÕªéÓ©åÞÝÆÏÖÇÑÙ»ÊÔ³ÇÒµÆÎœ´¼O^kMUjcv‚dq‚”¢´¿ÉÖ½ÌÒµÅȤ´»œ©¬‘¡§~ˆŽUV^IISCEI>;@96;96@969;6;93;6+63/33//9/+E63¸˜l±“gpXEG>9n]I�pMÄŸkÛ¸€ßÀŽàƗܽ‹Ù¸‚Ùµ}׳xÕ²}Ï«vǧt¿žj�…U†qKqaGC@9;6693/;9693366//++6//63/6//63/93693+++'++#/+#++''++++'+'+''#++'+'#'+#++#++''+#'+'++#/+#''++''3+'++'/++++#/+#/'/;99//+//#++'/+#3/+3/+//#++#3/+93//+'''#''3+'3'///'/+''+'++++'#@6/@;9//'33363//++++'+''++#3//3/+;96@;6/++''#''#+'#++#''#'++co]ƒl†ŒqUZIdgUlu[w~gcn^alVgt]huZgr^cr[jy^nvX^n]cn`dlZXfZCGG;>;@;>>@CCGEQSOMMOOVOMIKcnafq]„ƒdrtZtxddjXEIECC>IMK;99>>;E@>>;>669;69;696336663336/+993966;63ZVM…~^˜Žlln]X[IOUO963636>6;C>>Z`U}}h]^OX`OKQEEG@KMGEI@]cIclXX]O^cSkr]U[MGI@qn]urXptX†…ofkVckSgo]o~hkxa`hUqwax|d€‚cpu^dfQot`c^OGG@]gXnr^hpX‡Šn€„n€dvƒhkw`pz`’�tx|dˆ�p}…lŸ–~’�t�„lpvalwaz‚f —wž�r‘‹t‹|a‰jxfklZouawv^~kxn[�zh�„p’‡hlq`��w’ŠrÅ´­ßÔÐèäàêçåéåäêåäÜÒÆÀ³žœ˜‚ƒt[‘‚r›•Š›”’}‚|ƒƒxzty~lonM@Extc€zf„‚t‡�kƒh†}avxg†l‰„j‰�o•ƒy«¯ØÆÉÛËÏãÙÜæÜßãÔÖîìîïëíïëîíéìÝÐÏëãáìæçŪ¦ØË¾Á§ž›�d[S]UQZOMSC@VE@lpaptd~hrq]…}aƒ�k€€f�~f�‹p||a�–œ´¾¿ÌÓÛ¶ÀƯºÁÅÏÓªº¾|~|äÆ�êÒ�éÖ­Þ×ÖÈÑØÆÔÛÁÏÙ·ÈÖ±ÃÇj€ŒU[lny†Xjx‚Ž ª¸ÆÅÐ׳Âɧ¸¿—ª­’ ¨�Ÿ¥…”œjt�XZdCCI;;>99;93@966636;6;6/66/63//63+6/'cK@¾£q”}]KC;QE>qZE¤†XЭxÙ¶‚àĖܾ�Ù¶ƒØ´~Ô¯vÕ±xЭoœjÀœgªŽc†tOyjGKE;;66963@@9;6693/3//63/36/6/+96696333+/+'/+'/+#/'++++++''#''##++'++'+''++#'+''#'''+'#/+#++#/++/''++'+++++#3+#;369663/'//'+++3/+96/;663/+//'3++/+'3//'+#'+#++'3+/++'++'++#++#+##C;6;33/+#'++3++++'''#++#++#+'+63/ME>@>6/'+#'''#++#+''#''''ƒˆqpv]ƒ„ouzc~…k}…dt}dgr[t|f`lX[hScq]hz]~…q††nQXIhnXglV]fQhr^p}lnr^}~fz~j˜�}kqVjx]cr^v…fpy`lw[v}d‚j…Šq‚‡o��k~~f¥ž…¡•y¦˜|gjXhuataw�lt|ajt]kr`hk[�‘o€…p†…qw~dllV^^IZ^OchVty^pu^jq]ov^zƒdqu[tzcjw^jp^z�f~„kp}au�jz„jq|^ft^fp[nuVw€d€ˆj­ ™’nœ�l�Œo|†lnqXŒ�uv‚dnx]ov[�„huycvw]pu`x|]„ƒgxƒhlw]vƒawƒc|ƒh�afoXwz[qtZqoZ…„nz|^|„hy}]‹‰r¤¤‰ —€…�kjhU|vZonX§—y¸ªŽªŸˆ��w‚†ochdXkn]tydˆ†k–‰oŠyh‹‡l�‹r‹‡qȺ¯ÔɽÝÔÉÓɼÔË¿ÜØÒÑÆ¶¿³œ©ž‡…k}jtl[hZOaVKwytuvhol`rvjjk`hdX…‚o„‡o�‡j„‚l‰‡j‚�cЉnqud]^SQVQ}hqÌ´¸ìèèíéííëííêêðíïîêìíéìïììåÝÜãØ×çàßÞÐÎéãàĵ²š†€¤Ÿ”ka]c^QZSIIGESOEXSKtrZŒ…j€…nvw`kfX‰†knpVtxc~yc�~awq^šŠ~½´ªÁÊ̺ÆÈ»ÆÊ½ÈÉ–� ßÀƒèÌ�èΖ¤™žÀÊоÌÖ¼Î×­ÁÈ�¢«hu‡�§¨j~„]]p´ÅË»ÉÐ²ÃÆ’¤ªˆ—¢Š—ž‰– ‚�•†–Ÿ‡“›Œ™¡gv@;E96>93>9336333/36+3/+//++3++6/+C;9O>6‡oV†w[MG;OE;o`KƒkM§Šfϰ€Ú¹ƒÜºƒÛº…×´}ѯx˧rǦqÄ¡d·•gŽzUzkMQK@jVM�ƒhkpc;6696+/'+6////+3/+>63>96//#++#//#/'#/++'++'''+'++'#'+#+'+'#+'##/'+#'#+'#++''/'++'+'#'++/++++#/+#9///+//3+3/'EC@SOEkrVGIC>;6QSG963;;9633#'#''#'+#/'+/+++/''+#'+'/''@999333/'++'3++++'63//+'/+#+/+//+KE;@;6933'''++#++++#'+'#''zcrxaw~cquahqZnwZ„‡l�†c�ˆnŒ•yˆ‰oƒ…p˜—u—Œn�„dopV~‚gx€gw‚hova~…o‚h�Šlˆ�gyy^w‚f‚�p~‚cŠ�wcl]X^Q|�g”—†�nqw[jqVtx^–�lŒ„h–‰n—“u’Œwy~f}‚dƒƒagkXgfUhkSž�~š†hœ�r€†oqyZqy[ƒˆlpz[dqZ}…cŽ—y„g‹�t‰ŠnqyZ^fS�ˆjy‚jƒ‰k‚…n|„n„�x”’z~„hƒ‡kƒ�dhp[lvdr|d„k�ˆo|�`v^lwUqwZ‡�n‚‰tމr’�uuu^vxalu`x€fŠŠnluZq~^ht]yˆn~‡l––tpw]x|`tzVy‚l}ƒlnr[ot`†‚f†~a‘�w€„jw~frw^œ–x˜–zˆ…oƒ‚k”Žw~|frza†ƒdƒˆq�‚fz}f�wcƒwf„„n€g„}aÐ̺̾§Å²–¹®™¤���Œp™–|™�t –rŽ�rkaMnhUpufffVVUIhj^Z^UhgS~}cg`Qjl]ˆŠqƒg€}g‚€avy`zg|~dKMC;63963 „‹ÛÌÌêåäìéêìéêíêêíéëîëíèããæàßÙÏÏÙÐÑåÞÜõ°Ã¶®¾´®‰~rgc^dd]VQKXSIZZMkk]npV†}d†ƒg€„cvxVfhU|y^€}axz[rudš‰g’…t¨˜}ε›¡“†˜—‹¢¯ª·ÈË­º¹™�qÏ´ŒÜÀ‰²œ�¶ÀƶÃ̸ÉÑ¡·¼†�§¤·½[hnV^c¦¶¿²Ã˪¼Ä†š¡z�™‚‘œŠ›§Œ™Ÿˆ”—‚•šŠ–£ž«ªš¯²Q]a99;6/;3/////3/+3'/6/33//93/@99GE@MG;QG;;33;33OE@aSC¼˜`ŠjKu[K¸™nÌ«wÙ·€Ô²wÓ¯}Ï­tǦl j¨Œ]ŒyQvjI‡n[qcUVQCSZK>96@;9;3363/;;3;66SGCOMEGG;93+/+#++'''#'''+'''#'''#'++'#++#'+#'/#'''''#+'++#'++/''++#'+'/+'/+#>99>99++'+/'3+'E>;ZXKd]KE@;OME`hOQXKIQC9//+/''+#rk^6+33//>>9999966EGE;99;9;@;9`UOkk]63/33+/+'3/+933IEEGG>][K@;;'+#++'++#/+'#'#'''ƒ„j€Špƒ�r~†lrv^ouVœ•o‹Œl”ŠožŸƒ‘‘t”‰n¡šx€~c„ˆhuu]x|]pz^ƒ‰n‚‚f’�v•‡o��o�ˆlvt]u€`|…c„…h–‘o|€^yzc��r˜”t…„alnV`]Gtu[‚~`uv[œ�o�‚k~uahjZXZKXXErva|z`gjS��r—–x�Žlv|douXpv[pvXh|aku[�‰d‰d~†g„ŠdŽ�lƒ�fop^…ƒgŠ‹t�Œp‘ŽpŒŽx‡Žu—•xz~gtvd€`}wXƒˆjowa‹�r‰�q†‡nkwZjz[hpS~Xˆˆo‰‹j‘�pvv]”–~pv[}ƒcv~[puZlxZkwZq‚frhy€hlr[watwX„€f�€fgkXxwcœ�p|rapv`lwauxdrw^�™�“�w„€h‚�j‘‰q€k~�fˆ…kpq]nrZƒ…n‹ƒgˆ€j‡‡nw|czzZ•�t–Šn‘�t§Ÿ~™�qˆ…gŽŒpˆƒh™�t”“|^ZMflUdhXdhU]cMvrdZXKhgVd^S^^S]ZKx~j„‚g�ˆnoqQrw^w€g^dU3333++E@>¿²¦ÖȼèãàëææêçåêæäçßÛêåäèãàáØØ¾´´Åº¶ãÜ׳«¤–�¯ª£vrjc^SgcXUMIVMI[UQ~wcwtZ‰€k‹‰pƒ‡gptUklVonX}€hpy[yw^¥˜y®šz¶¤xÊ®‘¶Ÿ†�‘w‚‡‚¯¼¼°À¼„‡ˆ¢–�¦‰x©�~·ÀöÃË®¶¸œ¯°Ÿ¯¬œ±µV^dfdh�¯¶¤ºÀ–«±p‚ˆzŠ”‚•Ÿ‘ž¤‰˜�€‘•€�––¥§�¬«�¢¢IMK969;9@;6663/6//E>@OUKC@;QKGKKGCC@;6/E;9MGCKC@VOEykSº•h³�gUE;w[Gœ}^ŦtÖ·�׸„Ï­vȦp¾¡p¦�aˆtSxgK«ž„dZIKG>[ZGG@;EC>C;;GCCGGCKKCpp[^gSKK>CE>;63/+'+'++'++''''+''#++#''#'+'++'+/#'''''+'''++#'++/+//+''+'3++++'//'3//'+'//'@93QSIfcQutZQMEZ[GkfMZ^KVVG>99963//+;666+363/IUC999999>;;996;;>@@>gaVup[>;6/3+/++>33KE@SSIMOCIIE>99+/'63+;6/3++#+#''+�‘y‹Œp�”u��u‰Žy�„j›“t“’qˆ‹o�…f†�jvp^�Šp‡ƒf�ŒlŠ„d��q”“z��pœ—|¨¡‡ž–v^[M|yaˆnlnX†‰r›—y¤›}š�p�‰q‰‚dŒ„a—ŠnxlXf`Oz|dpoX‚…k�}a‹ˆj‹�r—•z†‡kvxa…‚k‰‡loqVu}d|ƒg€‚dnxdkvXo|Zoz[[hK[gQ^gSlv]akVkr]š�x¡”w‹‹r±¬‘�“r�‰h™“u°¤ˆ¥��‡‡k€~awt[|}]yaw�aŒŽq•’v�Šp‡…lv�`v�`€‚f€‡c‡ŽpyƒdpwXt~]„fy‡dt~ajnVcfMgpOclSv[hqUanSdnUdoUty]�‘w‰Šq–‘v£œ—Žq‚…q€‡l…‰h}€`|ƒa|ƒaˆ‰o’“}ˆ†p‚†r€l‡‹pš�v��wxfyx^v}g|yd|}ctxjЉo‡lnoXtt^†€g‰…d}z^qq[~o^wlZ`dV``QZ^QSQGpyhqu`ou[kqVwy`kqXrw]foUcfVtq]gdQUXMovfSQKEC;;;9C96XXU�‰qªŸƒÀ·«¾¯œÀ¶¤À¸¬Ç½ªÁ¹¦À¯¢Í÷± —À¸±ÌÄ»¶­›§ �~yopkccaZ`ZSXSS]ZU’�x˜“u}`z€fovV^jMXfIhrVdhUwzZ‰ˆh�‹o˜‹n˜‡j �k›‰l–‘r…„fqu[dlZuyk–™Œ¡¬ª¦²¯�‹u�”��©¥¦Ÿ—�‘‡�–†…‡nftahxjoyhZg^Zfdx�Ž†š ‡š™„”�xŽ’w‰‘…––‹ž–}�~^fX`dVVUGjvfU[KOVGOQI[^OakU^gSdkVX`SQ]MKMCSQIhfSz€f�~lrgSzdM£†^zhS|cX|fU[OC~dM¡€UävĬyµžn–€Z€rQŠxZykZhKEMC;]SEtdQ`]KQG@[[MS]KGKEXXKX[OQQEGG@EG@EG@@;;@>;93/C@@C@>KQG@@;66/;63/3+96///+/+'@63@96IKE@>;>>@>6;633;66KEEQQKU]MZZKgt]gnVglUrrXhlQX[IUQGZZKSUG>>;663@@;KKEZ`MIOEKXK@KE6//;66999@@9CC>KOG>@>;;9C@>IIC999>>9GOECI@@@>GKCGG>adQU]Q;;9@;@�…p˜–y’—}’–|šš‚œ˜|¯Ÿ �~˜–z¤¡†¤œ|š–yž˜t“Žl’�rxw`‡h–‘n‘Œr……jƒ€alcVZVOy}hŠ‚h‹ˆgŠ�nЉjƒ‡o}c‹Žo…ˆl�ŽlŒ�t�wcŒ‡j}zf�Šk™‘r€}d†ƒj”�v¦™€~zcpjUjkZw€fƒ�p�Šl��o}ƒclr[ot[ZfO[aKrrVfdUSUKKQG]fX~ƒg¤’vVKC[ZMy�c}z[˜–tŽ�l‡€^‰ˆh‚�[ˆ�o‹“t|Zow^rz`}…f‡Šh~`¨©�“‘r�ˆfx}[q‚dlxXow]koZqw]`lUdnVty[€ƒflrXxƒkx†hx€[nvUjtVdqUdoXux[vx^…k©¥„€€k‰†k™—xŒŽo|€f~€f€‰k}~^ˆ„g•‹nƒ‚o�…l†~f†c•†h�tZ‚}fnqcvq]zy^‚€gˆ†k�Žnd]`Qdk`SSIMOGEGCjjZ š„ˆ†q]cQu|^y†lr|^hwXgnVV`M[gVQXIhz`KOGMQGQUIQUKQSIdhQ]dOOOGwcyxf]XK]kS``Olrdqv]or[z€cquVjnVZ]My~nz|h�|hˆ‹v„ˆq„„n’ŽuŽŽpzf~€k€ƒgƒ…l€€p�”y¤£ƒ“�o�†jhkQVXGEE>>>>CKCU]MotXz`op]‹�uˆ‹j€zdlqUkw[X[MX]K^cUu|j”�q¥�~��t”�x•�t™–zƒŠl€ˆogudcgQnp[X[KKMICICfoap|fw}h†}lvckrh[ja[d]^cVdhUKMEMUK]aQanQapVIKEagUkqXpx`Z]KU[K;;9;96>;9KKGC@;QMGSQGuv`yy^|y`£“t¯ž€˜�k‚}]|wVwqZzpZzoS|w[¤”u–�o|w^†ƒnnpZntXynXtlXpnU~xagaOZUMUZOUVMQ[M>>>;;963/GEEMSKMQGCGE;>;>>;OUK@@9CGC>C;hcUddV`fVx€hkr]S]Q@@>IIGffQhlXnkX}~dkr[UZK]fSX^O^cKMI>a[MVUEQUGIG>SVIZ^QahXV`USZMEIE;9;/3/633///3+/3/+6/3/+''++//'69363/;63663////+'++'666;>>IOE>@;;;99>3Q]KSZO…ŒuŽ‘rŒ’��v‘�z•�x­¤…¢¢€�Ÿ|ŒŠk�Žj�…fƒ„h�‘u„‹vqxa„ƒk†�d�ŒnŠ‹pƒ„hzu`ww]€gutZ‰’q„‹n}zcx}`x|^ux[tz^ny^€}Z––u�Œk�…k�‰g¡š}‚va—�r­žƒ­¤…‚~jy^`UM|k„h„g‡‰lx‚opy]}„clrX`cMfjScjXSMGOOIvyfˆ†oŽz]E@>]^Qgp[w|^–�j –t|€[x]€‰o‚�jqz]x�^lr[nrVqz[„fyy[Œ†d¢œ}Œˆgrx`^dQ`gS|…htqZ~€cjuVnnV~w`w^nv[tz[z‚fhkQfkOnq[^nUgoSza…‹nz€h��ppu[rw]xw^„n€}^‹Œk‡‡p„�dŽ�p‹…jg„zfyhy^……art[ppXX[Q|xX�za„}f��d~�gko[IIICCC>;69;693/E@;rna`VMKMGfl]w‚gcgQQZGGMCGMCS^OIQGO^M>@>@>6ECC;>>>@9KIG[aS]`S‹n�…q`VOMXGGG>cjXoy^z|`}‚cnqXakVSZMU[OEI@QOGdlZanVcfV�a�Žk}‚h€Šr�”tˆ‰lƒ…h�“v��o„ƒf}`ˆ…gtw]VZQOOGGIEIQE^hOgpXjlVno`}|a}yafhQgkQZ^OO[MOVIdk[rt^tva€ƒgˆˆl…„h~€ay|^ltXXcUgr]ludUVK^f[QXUKQIX`Ovycx~nXgSQ[OMVMIIGOOEMQE@>>CE@EIIKMCS]O;6>OSM^gZ[aQEE@GGC333;69;69>;;;69@@;KGE][McjUgoU‚‚g‰€c~ayxZw|^pw``cO]ZKrr^ ���dUVKUVOEG@`hXolVwv]klVŒ‰jqoXgdO]^Q]ZKEI>;669333/+;9;969>>>96;3//666IMG;;9>G;@C;pjXnoXU[KckVZfVGOG963;;>adQ`hSccS�hoygV[MS[KEKCGI>UUGafUclQfqX^dQSZG[dZjr^[gXMXG;39936//+/3///'/'+3/'3//++''+++++///+/'33+3/+'+++/+++'//+3//@E>99633/663>@;9>;��r�‡n‡ƒo†‡p‡�t�‘x‡Œn…‡n|„gt|dp|]oy`�“vqy]lt^rz^jqXw|^ˆƒjxu[ylƒŠf†�l„‰j‡�p|€hŸ¡‚“�tŒŠj†‡d]`KKI@IIEMQIahUcdMklSy~`vz^ƒƒd�Žo˜’zvq[UUMQQEwy`[[O]`OU[IIICEECQVMrchrXXcUMQESZMQQGSVIdkUhqX||fow`ty]‡†h–‹jƒ�d…‚fuuZjnV…ŠnhlV`jVu|]jqO`gOdp^ckXlqZhoV�‘q�dv}dw}]yx`—–|~`€`VaOwza}~dqpX‡‚cª¢‚§žy~`„|[|}Z~€c‚‰h€‡lt~^htVklMX`M[kXhqXVZSUXMht[roV€~h^^OdcOwvZpp^uzcqy]qt^QXOC>>;66]dMjtXjuZchX]jX996;996//6//99996363+;69>3;9>;>;9EECGICQQGQKGKKI@>;>;;663;96;6393699>>@6IMGV`OMSEEC>X[QOMGCOKEGCMXMSUKcfQ]lVVcQ>99;6966633/;99>96;9;MZQMSIMSM^aUy‚kow`dnUjnXMOIOUEV[IhrZ`cUUVMU^O>;>>9;969II>[VKhp[yx`�¡‰qpZ]cUSZKEG@996@;;>;C@C@CC>QSMUVISVOIOKMQMMMCGICCC@GIEC>>GGE>CC9>99>9C@>>9>999;96;9;936936393963633/+333+33+933@9>>>>996C>>XSM`ZS;63>69936;69>9;@>>OQIOUKMSGMOEOOEQXGQVMGICC>;;99;99>C@;;6663963939966GMCV[MoqXSVKOIC]`Oc]SnjSQOE9;366/966663////366/33+63/3633966;69933@>6hX‘za>;996/6666/363/99;>>>@>;@>;>;@;>;9;663///3//+;;3@C>EG@CKCGKCGOEMQI^nUV^MOVKE>>;66//+3//9363+/3+'/////'++//+3+/#+/'//'3+'++/+++//+3//3+/9;93/+/+'3+++/+/33Ž�o•�u”Žp‡lor[lrZkudqg|‚]y‚fgnSajU|ahr^Z^Mhx`agZfkUtwcZZMSSGfpZƒ‰ny}fzx[cnQkpS‚�dlhV^hUSUG3/+3//666@@>;>963/;96666S[Knp]dh[SMM]aS^gQECC3333//69/3//636>;;@C;@C>;9;93/;;;MSK>@>@C@>;9;;6IMCKOEu~fwp]wpX~}^clVZ`KOVIEI@OXKhoQanS]hOIMIVfUVaVEE>S]UVcQVcS[aKgqXv‚jr€govf]jVXfSct`u]ž“n´¨ƒ­�€”�q†|^]]K]fUSUIEI>KQMIMIOXG;;3>C>;99639636;96IIEOQMck[qzgUVI999>@>>>9@>;CKG;9>333CE@CE>>;;;6;969>99@9@;6;936363363933666>9;663EE@OQEhp]w�gnlXSVM@;9QMGcdU;69;9993696;;93EGC>>>999@>;@GE@>>9>;;999>;;9;;;9;>9;99939639669969;69966669;;9>>;@>;KIGQZMXVMjp]ku^VaVEMCEI@>@;;96666>;;>9>96;;96MUGX]MaaQKICIMCGIGE@@>;;>CC666;6696;>>>>;9GC;]QGgUMp`Unc[aUK63363666;>;;@@C>C@6699>9>;;3/633/6339696/6933666969633;3;999993@>@CEG>GE>E@IMGX[USXK;;9;;6@>;OSIMQI>66@9;C;>@CC@C>CCC@C>CEC;>9999633966369/3+3/'6/+333/3363/;39GC@S[U>@;CC>KICCCE96;;>9;66;96>@C3+++/'3//3/693;969;;9EGC>>;gcXž�x¨˜„rp[]`UC>@@9;OQISVIEGC>CC;;>639;;;6;6>@>/36///33/6/36////+;99@C>]`QXfISZIprXZXOKIE969OC@QME6/69666/363/6669696366339666///////+/33999>;;@E>>C>CG@;663///3/}‚c|„lz€gkp[Z]O[cMZaSq}`pyVn}calS[k[`nZVg[MME]p[agXZ^MSUKKMEIME[hZuv^uvaƒgXZKjrUaaQIG>;@9>@;//'+//69696663/3/+933366CG@ZcXQVMgcXz~dr}cIKE9>>;9696/63633696696363/33/6/+6//;663966636/36/+966963EE@SQCaaKkuX]cOUUEC@>;>9KSE[cI^lSZkQ>@>@@;>;;;99;E>>I@@>;EE;GKEQ]Q`gXadVOSKCEEGQIV]Gqv^Œ‰l�€`lhU``SMOECEC@;>3636/3366>>963+99;633//363/633;69;69KSIKIE>99///6339639669366/3/3+IQEGKG>;;@;>@;>GGM@@@>9;933//+/3/;;9C@>GECEIE]]Qch[�€f�‡thj[IEE@@>IKIfj]E@CC>>9369;>>>>E@>@;9>;;@>>9;9;669;93636666396666669669/3936;;;;>>CC>@@@;;;>;;@>>KKIV]OcpZ[dUoxfdo]Q]SGI@EEC@>;966663C;>>9;;9;>99CC@MKC[XKMMEMOEGIE@@@;>>@GC666969369@;;KGEcXOk]�w^”„rŒ}pzjZ93696/>9;>9>CGGCGE;;9CGEEII93;996;6666363363/999663666>6;>6696996;;6>9;;;;9GEC@@@;93;99;99C@@VSKX[Q@>>@;9GEC@E@;>;;6;996;996663333//3/////3/+3/+3//936///63/636;66EE@969999;;>969;69;>9CC>>>;@C@9693363/63+6639969;69>>;969II@n^Suc[QGhhZ``SUSKc`OV^O>;>;9;;69639999;>;@@>999666969933;96>96IGEOSKclU]cI]`GxpXc^QKGC66/]QEZUG6336333/36//669@>;;99;;6@;;;>;66663+>;;@@;EE@MOCIKEIOGEKC9;6633IK@KKEQXOMVI>;9>;699;>>@CC@@C@>>;6666;9699;9;CECIKGGMI996996;;;@>>EE>KOIMOGIOKIMGCE@@;>;;;MQK;99>;;MUIQ]OGK@>@;CEC>>>>9;;9;;@CqpZ„ƒhacQEGE;;;;6399666/663>;>>>>;9999963/3////+/3363/6/3>;9;99;99>C@KSEKUGSZI[aQ^cOCC>;96CG@EICQ`OS]GGQKQZIX^OUfSEKG>C@GIICE>CEI;;>cdVlt`IMK99966636/63+963663@>9C@>KOM>@@>69666639366@96>99;9>;;;>>>@>>@;@;9;;993666/39663336/363/93666633/;96]d^^aUgk[joZcn]guaZ`VIIG93333/CE@]fXpwat~ajv]ƒŠo�ƒq‘�}vpdkk]UMIIGEGGG@>@ZZQZ[SE>CIMKOSK[`Q^cXQ]S@>>9;;966>>9969>;;963;966339336//>>>IMMMUO`kS^kSGQIIIC]UKpwaVVOdfX[VMSOGQKGSVMX`Q^`UjtadjV`jVfk[jta^h[U]QUXIOZIS[KUVKMOEC@@@>@;;9@;@>;>966;9;q`VŠzk†r^‹u`�}jŽ~l¤�v�ŠkaQKIE@EC@QQG`hZhtaZdOU`KSZKCGCGGEGC@MQKQXOKMEEG@@>>@@>GIGE>@CCC>;@;3;;99KIEXcV@@;@@;EC@OQK[`SwpZpgSgfUnnX[`QCC>C@@C;>CCCC;9;96;9;3//6//6//6663//33/;>;666633;69IE>CGG6/33336699699399;9@C>>>;;9;>>ECGG;;;;3;;3;>;>@>;C@;GGC;;;>>>@>>EC@QOKXZOSUMSVMOQICC@OVMX`OEEECECGGCV[IS`QKVIEGCQVKSSIw|ffnUgrXrv[knVjhV“ˆ`faOVXKGC>tZpdK>69;33969@;9SZMS[IU[GaaMckZdnXU]OQVIGKCS^OS]KZgSKUEKSGU[IMUIIOGIIEGCG>;>966663963GIGIOKMQMEG@@@E@;CKSQIIKGEG963;69>;9SUMOQQEGIC@>GMGKVIVfSO`OO^K[p]QVMMMIhn]`fSZgSlz]ZcZOUIlu]VXKCGC@C@@>>@CCGOKEEC@>;IGE@@C@99993933933@;>MXIMUIIQEKKGEE@IKGKQIVSG^^SjoZVaSKQK]h[]cSfnVfnXadSccIOZIKQEK]OScKO^IO[IU`QUgOVfOU`KSgZUcSSdUXjQ^o[ZgVvzaƒ�fqqXQOKMQKOVMKOIMSGIMGZ`QahXhucCGC;9;>;;C@C>@CKQKMOIU[SEGEKMKSSOjo]]fZZf[MOMGIGECCKQIOKEKKGGCCGGGMOI^dQ„o��t—•z…ƒkw|gtyZhn][ZMV]SOQIclZ‚Œp‹ox�dkv]wy^wy`~xhŠ‹o‹†okhV‹…lŽ�xoqc}…nw~lryhpwcw|cwx[pzf]hX[aSXcSajQfr`^gSdoVhu]]hUU]Q`fUZXMdhVt�fhr[qt^x|f`cSqw^x|djl[lq`qv`†„o�‡pz�dlr]taqy^y„lqwX`jVor[qwajt`hrVdqV`lUan[jqZdrZhpVhp[nwaywhvo]pjX|v`”…o¥�q¤�jŠ}jˆv`ykXŠ~j’†fuo[jcUhfZp|fwav}`z|ZtyVfkX^cQny]nv]guVpx^nz[jvajwaq€fcn[`fUdk[gqZ]f]]fV]gV`nZVcQXgScnVgoSoxawnUxnU„z]†}dvuakhVxzdfhV^kVZaK`fQ[aQMOIQOKfhXSUIQVK`fQ`nZXgSGI@wraŠŽnXZMGGC@C@;9;@>C@9>V]SU[QGGCGGEECESVMMVQOQKQSI^aMrz`lt]fq]VaUMMEQSK]fVZ`MV^QV`SclSZdMlo^tu]rx[fo``nSdtVjpUhxdkpXflVdr]klQnrVfoVhtXfpV[`K[]McdO^^MZ^MMOChaOkkVMCCKE@OIEonVhoUltZjn^ƒ`yaqtXjpZ]hOKXGS^KV`IMSGX[QQUIaoUKQEIQIS[QKQO@@@;6;966>>;Xg^V`XOSKEG@EGEIKI[g]cnaXcV;;;C@@VZO}ˆrnucXaUS[SS^KVgO[gSIUIOXIVgSfp`dj[vzfgr[jv[owZZ[MSSGxy]``QIEEGIEKMGMUSO]QKMIOKG`fVV[SVUMMMCKMGKMGGC@QUMSZKU]SQQISUM[fV]hXflUpu[vwXgo`^j[gv`pyZrw[qtX`gV`dKUaMM]ISdQSdOU]KKVIIQIQZKS[IM`OQj[K]OOZOSdVUjZZjU|�gƒ†h~ƒhjrXalQjy[cpV^nUalUn|aycr}dUZIOOMC@>EIEGQKMQG]^UlucX`QV^ShjUƒŠktxct}dnzccoXZ]OclVkralq[ho]V^OdjVoxa‚‡jŒŽn�ž‚“Žp‚‚hr}ahnUagSflZchVou[„ƒlˆhy‚faqZnrXjoXtqZ„„k„€gyv]“•y“–�v‚l€Šj~…hz€gufxatz`kqZ^cVgp]cp]jwcn}go|alwaly^huajuav}^u|`vfr|aqt`ˆƒl‚Œxko[ntVrr]ƒ�h†‚gƒ†k”�u†‡f}�avz`y€h}fv|dglU^`QfcOknUahQZhOQZKUZOgq[nxaoy[zƒcw‚hy„c‰‰l‡k�‡l˜‘u‡}d–‡l›ƒ`‘f‡y]xo[€v]ut[kkXnhZwnZrtXu�fy‚h„x[wwXklSnq`w~`w|ajt[qx^ltUtlr€`yƒfpw`qyau~dw…gr}aq}`ku[jy^gtZ`oXfo[ntXjr]qr[zuZ„€gu]vv`€‚h|xapnX]aQglVfjVnx``lahr`nr[cgQ`hSgnSkx`gtUX^K‹‡o‰‹j]aOZaUUZOKKGUXOVVMqv]ajUQVKU^OU]QagSjrZdkVhoXu�hy‚dpw[kr]nxcjkUoydkx`ou[ltajq]hq[clXur`udpwZkxa[hSgqShqVgq[ku]r|ckwadoSajQdnVlv[jpU`lQZfOZ[MSQGOQGV`O]aS]cS^]M[]OddVvtXflUhqVqu^‚‹ky`nlQXaSZgOOXIS^MZ^KX[OhnXddMcrOGMEGKEyƒgu}dlxdcn`anZhr[|…go~hlxccv]hq]fuaq€du}du|`fu]fq]y„h�“rŠpo|gdtUct]kakyXQ]KMVI[fVq~cu€dw†p}‡gv~clx[jx`gt[v€gy€cntZox`oyfjuZkuZqz`u|c‡Šnuq[y~dv}aw‚ft„kpfr|at~flx^anScoZkwZpy`rx^z|fˆ‰l„€jzzcyd‚Šhˆ�plv]ku]pv[arZZgUXfQ`fQtzaux^nqX`hVOUEIMCISIGOIEICIK@OQKcl[vy^‚`qy`o|jp|gk}dfrXft]crZcpXaq[jpVt}`xƒhq|cu}cw€fqx^tzf€jnoX]fZfr`zƒg~„f€‰n€�wt~ghwdy„kŠ�o��t~‚kr}av~ftzdpu^nn[‡€dއf‰…jƒ|gvyctx]y‚gt‚hz‚kz�hƒfozgguZkw[ozgx}[z‚d€„j……p€€dz�^w‚dqxXoy^nvao|aoy`nwXjvakt`u`ox[oz]x‡q|‚d}…op}gz‚g€‰oƒŠk}†lz…h~Šn}~g††h€…qvu]quXwy]¤œ‚£™„�Žvž›‚ˆ‚c}}c‹Šk�’wŒˆl~j~axx`Š�kzwftpX]cO[cQan]akVlxhow]u|^glVowa‡‡o—”v™‘k�•y�Žt”�v�‰lvoXnkVpucxcpt[`j[vv^~~avw`zƒo‚n}€`gnUlkVzxc‡†jŒ…jux]y|`}~dkpZfq`fq[jlXtv]vyav|ctzcvz`oycuz]q}cgx^pw^qvXu�dwzcu|dˆŠl�…ly€h†‡oЉn‚ƒfppXpuatw]vy^qq]kp[onXrv[hpXpq^qu^ltXchUtwZv€fdq^wz`}ƒgwz`l}gly]€ŠlppXckUVdUV^OOVOhv^dr`ckZnyajq[kt^vz^…†c~�hzƒhy‚gƒ…h„Šo‡†drx`w~cvƒfuz[rt[gpZdpVnrZqxZglVot^hrXglUfoXht]dlUdqU]dU`gSXaSajU[cQajQo|ant`nt^}~dpxclycruXp|dhpUnv]‡Žry€fjoVOXKQZKO]I[fZ^hUpy^‡j}}az|cjq[glVt‚lŠp‚‹o†ntx`wj}‚d~�n||fjrXnxZnz^p�flyZu}`}†fr|`pz^q|`graakXUVIOKGSVOXfS[qVau[h~co€cn}]€‡fx�`w}clt[hoVfoZhpVov^o~ht€jtaxƒh~‡kyd€…j�’n|‡hw„kz‡huft|`ltapy`v~cocltSow]xfpxavy]y€`’�n™‘q‰†f‚~c��q‹†d……fŠŒp��r††k|�aw|cŽ�p�•o™™u“–w~†hu~[px]o|`lz]ju]lyaz�g‰Šo†‡n‰‰n€cwzapzclx`ox]cgSUZIVcO`kSrz]x�dwƒfp}]‚fzƒhz|]ˆ‡f’’y”�u„…h‚†d‚‰hty]r|dy‚gr}alw`qw^z}d‹‡kŽƒfxwgqq^z~ayx^yy`}~ay`�~hƒ|c}z`jkV^]KkqVry]px`n}cgv^hv`ZcQ]jXgjOv€f|ƒgtx`zkuxaxzcx~akrZaoZgq[luZp~jr�lx…hu€kq~`jv[|„hz€jv€dy~[wzZ~‚av‚jpx^qyZr€fhyalw`nv^ov]rv`yzcŒŠpŒ�u„‹r|gvv]~}dŠˆo•’tŽˆlˆ€g�‹lŒŒq‘‰h‡�hƒdppVgnShr]fpVcj[ahVglZgn[hlZw|cf|~d~`‡‰oƒd}}hxy^pw^xc}�`xfjlZklXgnXhnVru[|}cuy[}�j††k’�t•‘t–�tƒ�f‚„oƒncdV`aQdlX~zcˆ„d�‚lwy`rvcjo]lx`kuckpZckZz|a€‚k~‚j|g‡‰lˆŠlz|c|zcyh††hƒ„l€‚dtu]loXnlXouclt`ny`}~a|€cw~ay‚kq|cnrZu}cqxZgt[juZhr^anSgkVrr]nuZaZOa^QZZK`^OUQIMOGEIEIE@U^QanXcq[dlUntZw}`r|fu}f€�j�}jІo‰„h~ƒfv}fpycpy`owcrw^uzanqX]fZ^`MjoZkoZtwX}€aot[`dOcjSXfK]jQ^jUgpX`hSpv]t|^y‚g}�lxfltSjoVu|cnw^jrZtu^qu`fkOZaOU]MX`O^gOclXnrZuw]w|dxydyyawv^pv^y~j|�fy‚frw^w}d�ƒn~}hxzhdnXjr]gu]j}fnyZry^w†lv€fhu]cpXXhXXfS`fS^`SUSKKUMM[OUaMZo[du`hwXƒŠl}€fxycqyhhqXglZkr[t~`r}aq}cta}†gŠnv‚h~„h…‰jq|dtk�…d|‚lv€kpy`py^uy`w€`ltVnv[thpy`orZ~€`”�pœ–u�Šk�~gƒƒf‡‚cˆ†hŽ�u“�l‘�u…�^„„h“�vž•q˜“rŠ�qƒŠg|…c|ƒc|ƒav‚]}„f|„j…Šo‹ŽrŽŒnЇd€[x|jltZfoUkv[hjUMSGVaMclXv^v�fqz^jw[p|lrƒh~}`š•u œƒ›•x��w��r‚†hv}ct}fr}`ju^qu^z‚d€„hЇl�‰pzzcvv^~g}a}ƒg�fkoXknS}}^~}crt^klUlt]lt]pzahqVdpZXjZUVKXZO[`Maq]ju]nq]w~jqzar}apw^ktXht]nz[l|[v~^n|ar€gr}akwXgqXry^qvZwy[€�cwzatfow[prZtzany``gM^jU^fX^jUlpZtyf€c†‰n|�ggfVjnZpqZˆf‘‹l’‡l‰�l‹ƒk…„kŠz]�„c‹…fkpZglUknXfpU[aUZdSgk]lp]fpZkt`oz`rx`}€d��l‹�k||c€‚o‚„k}�gƒ‚f|�jho]do[hp]glUtwcvwdr}c†„d‹†g–‰n–�q�„k„~c‰„r‚jffU`^OgkU~zgdvv]np[kp]fo[dl[fo]dl[kuf}}d|}fr~h~€j†ˆqƒ…f~zcxyjƒ…fƒ‡g‚‚fƒƒjtrXqoVhq^dhVcfSahXu|cy�hq|`k|ajxdpv`p|dp}afo]XdSXcO^lXloZwxcppUlhZcdXojUotZ]aUKICGECMII[aVflSfoUadQgoQpwXly^ty^}�g}zg��h�†q‚fttanq[orXpwaqy^rvZlr[`dScfQoqZtt[||`~~ant]djShnSVcQXdS`dKgpZgo[qv[z�`yƒfvyay|[owagnVrycquZot[lu]ou[gjOdlQ`lVchO`gO]fMlu]rv^qydonVwv]tu^ \ No newline at end of file diff --git a/xie/xc/programs/xieperf/images/image.005 b/xie/xc/programs/xieperf/images/image.005 new file mode 100644 index 0000000..96ae63e Binary files /dev/null and b/xie/xc/programs/xieperf/images/image.005 differ diff --git a/xie/xc/programs/xieperf/images/image.006 b/xie/xc/programs/xieperf/images/image.006 new file mode 100644 index 0000000..6a07dae Binary files /dev/null and b/xie/xc/programs/xieperf/images/image.006 differ diff --git a/xie/xc/programs/xieperf/images/image.007 b/xie/xc/programs/xieperf/images/image.007 new file mode 100644 index 0000000..1e417cf Binary files /dev/null and b/xie/xc/programs/xieperf/images/image.007 differ diff --git a/xie/xc/programs/xieperf/images/image.008 b/xie/xc/programs/xieperf/images/image.008 new file mode 100644 index 0000000..bd3c9c2 Binary files /dev/null and b/xie/xc/programs/xieperf/images/image.008 differ diff --git a/xie/xc/programs/xieperf/images/image.009 b/xie/xc/programs/xieperf/images/image.009 new file mode 100644 index 0000000..e8b27e3 Binary files /dev/null and b/xie/xc/programs/xieperf/images/image.009 differ diff --git a/xie/xc/programs/xieperf/images/image.010 b/xie/xc/programs/xieperf/images/image.010 new file mode 100644 index 0000000..2685bec Binary files /dev/null and b/xie/xc/programs/xieperf/images/image.010 differ diff --git a/xie/xc/programs/xieperf/images/image.011 b/xie/xc/programs/xieperf/images/image.011 new file mode 100644 index 0000000..fae57d9 --- /dev/null +++ b/xie/xc/programs/xieperf/images/image.011 @@ -0,0 +1,12856 @@ +Yv‘o�­{™¹‚¢Á…ŸÀœ¿}�ºƒ Á|£¾r•·g‡¬a€¡d†§^ƒ¥`€¢Z{¡Us–Li�=Vu+9P#1B",    + + + +  + + + + ") , .031 :U##e&)p%%Š5;–99™><¡AF�15‰/4–PK—X_�>@�8.±ce»koÄulÖ�›Ø¦¦ÙŸ”× –Û¨™â»¶Ü´µØ¦¦²RNŸ:.¥@1›I=rG?Z?;1"%      %#6,C-? 5Q#4T$9W%;X(>^)@d"9Y&: 2"(7%3B=Rh[s�jœwŽ«ˆ¡¼—­Å¬½Ï±ÆÙºÉÛ¾Íß»ÍÞ½ÎܺËß¹ÊàºÌá»ËÜÀÌàÀÍߺÎß¼ÌÜÀÊÛ»ÍÞÁÎáÂÑàÊÖâÍÙåÑÙèÕÚåÒÚèÑ×éÊÖçÆÔáÁÎà·ÇÙ£¶Ð—«Ç�—¶j�žh…Ÿ†˜²˜¦À�°É¯¼Ð¬¹Î¬·Ï¬·Î¦µÌ¤´Î¤´È“¢ÂŒ–²q€˜U_qFTaBSoDVjDXnPb…^pŽg{—o„£o„�xŒ¤‹¤‹œ¸’¢·Š—µyŒªn€™^dsNWjLVhU]vXggx•u„¢s~˜rx”et�R[wN[rDWuDQkAQg8I`5AV.:M!)7 '.!(%- +#/%,*#   + + +  +  +   +   + + +      + + +    +  + e€¡vš¹~žÀƒŸÁŒ¥Á‹¨ÇˆªÇ‚¦È€¦Ã|œ¾kŒ°iЬnˆ­oŒ«p�©l‡¬aw˜UmŽ;No,Ts>Or6Hc/?V$/D"-'$% ($*2%/= '5"/     + +      + +   + + +   + + + + + +  >MhEa{G^~Sg…Xm‘\y™d„¦n‹®iˆ©h‡¬h…©j…¨u’®|›¸~¡½{›·l’³a†¨Mm�B\y>Xo5Kg+6I%.;$-&%   +  +   + + 27BL[ƒ0+’8:•98“0+’/+”0.›?5ŸVP§YX¡LHªMF´YVÇzmÊ�Ë~xË…}Ó•�Õ–ˆ×§™×®¨Ï–•ž>;c1  +   +  +  +  &&7&La@PjDWt;Ia6CZ*4E+:%3%(!+'7 &3 &5"  +  +  + + +   +  +  +    + +  + +  +        + + + +   +  +5D`9Pl;RmFX~OcˆSo“]yšh„¦i‡¤e…«g‹©jŠª}•±}›¸… ½œ½t—¸gНZq‘Ga�A]z;Ql0C[(:N .=$0 -   + +  +   + 1!:!F MY,-�23‘22�-)�,*•/.œB6§YQ®e\ EB§L?³WQÅwfÉ}vÇxuÊ„|ÍŒƒÎŒ|بŸÖ«¨Î—Ÿž?>I      +  +   -,B,?V7Sr:X~@_‡GgŠDf�6Ou'<\#5L .$#+)32K[\pŒjšŒ¥Âž´Ï¡ºÍ®ÃÙ·ÊÜÀÏáÆÔâÇÒãÆÕãÊÖãËÖåÌÖçÐÙèÓÚçÔÛçÐØçÏØæÑØæÑÜçÐÚçÏÚèÍÚèÏÙçÎØéÏ×éÐÚåÌØéÎÚéÌØèÊØç¿Ñâ¶ÆÜ²ÅפºÒ ¶Ðœ´Î�®ÉŠ¥Æ�§Æ’¤Ã”§Ã‘¢¾„›¶„š¸ˆ™¶„›µ”§À”¦Á�¥Á„˜¸~�¬k|™VczEQh5CO:HV¹`YÆxlÄsjÅqjÇ|vÉ€z͉}Ó¢ Ïš”È�‹ˆ43 +       + + + +  + "-!1A0DWQ9H_CXzNh‰Vn”d€¡i‹±lްlŒ­u“µq‘±x”¬|›¸}Ÿ»y˜ºq�®nŒ¯d€¡[w�Xs�Hc‚8Rv2Hi)7P%3(     +  + + + + + -#&V66V''\$#x)+�88‘35�($‘)$’/'š;1±`T¹jf¢A=®PA¾kXÅtnÄpcÃrnÆyvÊ…xϘŠÒ¥¢ÅŠ„¹rmd      + + +   ,7#4D4H\C]yCb€Kf‰Ol‰Nn�Ih‹?_�>[z0Ok(?a#;Y/G0$"');K3FWI[qdqŠiz—�”©�´Ë¦½ÒÀÍßÃÑàÅÔäÃÓâÄÔáÅÕáÈÓäÊÖçÌÖçÒÛçÐÚèÐÚçÑÚçÓÜìÑÛêÑÜéÓÜçÑÙêË×èÏÛçÓØêÌÚéÈÔãÇÒâ¹Éá±ÃÙªÁ×¥½Ö˜¶Ñš¶Ò—°Ë�¦Â�¨ÄŠ£ÀŠ£ÀŠ ÂŒ£½‰œ¼ƒš»ˆŸ»Ž¦Á�¤Á‚œ»|’²vŒ¬bw•N_€DXvCUrBSrDXyWkˆs‡£z‹«ƒ•´~’±~“®w„™Xj†M]y6F]2DV0N8BTCOhITmGVpHWmLYtJWn5Gd2Aa6Da1?W)8F"0>'6$2"/!+!.*!    + + + +  + + +   +    +  + +     + +  +  &.>*7K2=SI^m_|–j‰¦v˜±t—»zšº„¢¹„£Ä‚¦Â‡¤Â†¤¼‚¡»…£¼Ÿ½|™ºs“³b‡§^{–Pk„CZu9K_&3J-   + + + + + +  M20d43c-+x**‰./Ž//Š(#�+#•1)�?7¬XH°^V¥D<µ_S¾icÀhaÁofÀmfÁn^Õ©œÜÀ½áÍÌÛÅÈÍ®¸A&0   +   + +  +    !.>&8J2JdK;P\]v‹„›¶…£¿ ¹Ð²ÅرÅÙ¶ÆÛ¿ËÞ½ÌÛ¾ÏàÅÔãÈÔãËØåÎØæÓÚçÕÚéÐÚêÍØêÉÖæÌÙèËÙéÐÚëÎÚèÑÖêÌØéÅÖæÄÔæ¾Ñå»Íâ·Êá²ÉÛ©ÂÙž»×”­Ê†¡ºˆ¡¾‹¤Á‰¤ÀŒŸ¼‡™·~‘°{�®ƒ�®€Ž«vŒ«t…¢`q�Xi‹GXv;Ol4IiE^|Sa~Kfƒ^w—u‹«|“±…—¶„“°y‡¤Ze~FVoBMa7DZ*7G&3@!*7+6K2?U:FY9CV:EY;H`:H`:Ib5AZ/>Y0?Y0?[)3<$-7$3# !!'!     +  + +  + + + +        +  +  +     + + +   '+8;FQEYff˜y–²�ž¹ˆ¤Ã�ªÆŠ¬Ç”¯È‘®Î•±Ï“±Ì’±Ì•²ÌŒ¬É‰¬È‚¦Ä~¢»n�¯j‹¯[zœFgˆ?Y~*;Q"/!   +   + +  7)(d57h14v)%‡.+‹/+‹*&�+"˜5+ A8¢H@«UL«HA¶[S½f]¼f`½iaÂrfË‹wÞÇÀâÏÓãÔØÝÏÔθÁ9!)    +    + +     '.-<%9M0DV5Lb9Lc?T`@XfCZl;UiB\u?]t:Tv4Pp4Gd$8M"7H!3D.C.@'7J/CZ5KcKh†i‚�t“²�«Æ—±Í�¶Íª¿Ô´ÈØ·ÉݼÌáÂÔäÄÒâÊÖæËÛåÏ×çÎÙèÏÛëÏÚèÌÙçÏÛèÒÚìÒÚæÒÛëÒÚéÌ×çÉÖåÆÓãÂÒä»Ìá¸Ê߯ÅÜ­Ãܧ¾Ø—±Éޥċ§À�¤¿Ž¤¼‰ ¼ˆ�¹‘ªwЦq�•cp�YkƒMZqJ\tETg6BW4CW5JcCVsKa|Phˆc|œy�²ƒ™º‘ ½�“¶w�ª`pˆRa{M_y@Rl3@V+;N+4B5CX8E^;If5DX3@Q/@V/7J.:H)6F(5C(7J&5G'4H$0A(7)!    + + + + + + + + +      +  +  + +        + + +,27GUcWn‚w“®�ŸÀˆ¤ÂŒ¨É‹«È‘¯É’±Ê–µÏ—±Î‘°Ì‘³Í“²Ì’±Ì�°ÌŠ«È�¥Àx™¸u”¸b‚¥JkŽ?Z~,U7Ea9De8FY4AS1CU-6J(2<&/=%/5'3A%3E'2B$1@-> +&  +    + + +   +             +   +  + + + +   9ENYsŒl‰¢‰¥À”°Ì“®Ë—°È”³Ñ•³Ê›µÐ™µÐ–·Ï–´Ì–´Ë“µÎ•²ÐŒªÇ‰©Ç…§Ã{¢½ž¹h‹¬Wu›Mg‹1D\&1$   +     &"$d?Ar=6r%(}'#‡.-‰((�)"–61£E<¢G:¥LC¨I<´XR´UOµVO¿seÉŠwÝ¿¸âÑÓâÑÒáÓØÖÈл£±  +     + +  +   (#-$/=0EZ6Le:TsG`{G`€Lj�Mi�Hf�Ij‰Fg†Cb†7Uq1La0Lg,Ge0Id2Gc9PcBhBFo02{,*Š42‹+,‘/&�=0¥F7¥H;¤D:«NC±TQ³SH¹g\Ñž“ض¬ÞËÉäÖØãÓÛáÕØÑ¾Å«�˜   +  + +  +  + + +   #*#3C:Nd@SlSk‹OmŒTv“^~›f„§i‹°j‹¬t–·p�µZz¤Ji‹A\€8Rr8Pr5Ss8St4Nm5QmBaƒTw•\€žw˜¶‡¨Ã�­Èš´Ñ¤¾Ö¥ÀÖ´ÉݼÎßÀÒâÇÖãÇØäÊ×äÎÚéÏÛêÏÚêÐÚèÑÚéÑÛéÑÜéÑÙçÑÛëÌØéÈÖæ¿Òå²Èܧ¾Ò¢ºÒ•±Í“®Ì�ªÉˆ¦ÁƒŸ¹…Ÿ¼��¹…›¼�—¶m†¬aw›[n�Se~Pf‚Mj‰PnŽXr˜Yq“Zs“Ti‹F]La€YmŠ]zœjˆ¨v•¶x𹆤Á�ªÄ‘§Ä}š½s�¯jŒ®i}ŸQc~EUl@Oi>Lg\0@W/;N+7L'7O)8R)4A$/>"/$  +     + + +  +  +  +   +   +  +      + + + +  +  @Sd]~šq‘¯…¢¿’«Ç�¬Ê™¯É’±Ï–³Î˜´Ï›µÒ–µÐšµÌ’±Ì“±Ê“°ÊŒ°Éˆ­È�­Æ‰ªÃ|Ÿºm•¸`€§Qq˜TfJdvaw–b€ g„¦g‹©p”¶t–¹y�¼}�Àz™¾hаOp“?`�4Pp7Jk4Mp7Ml/Jg5JiDd†\}›gЧ€�¾ˆ¥Â�¯ÊŸ¶Ð§ÁÙ©ÂØ·ÊÞ»ÏàÀÐáÆÕåÅÕåÈÕæÌØçÎÙêÏÚëÐÛéÒÚçÐÚéÍÚéÐÚçÑÙêÎÚéÆÓâ¾Ïã²ÆÜ£¼ÔŸ´Ð’¯È�«Ç‘ªÇ‹§ÃФ¿…¢Áƒœ·��¾š¶pŠ©g|šcv�`t�[t�]w“d}›b}œe{š\t“TjŒLb~L^YpŽc{—oްz”²�Ÿ»†¥À‰¨Ä‘«ÈƒŸ¿s�²p�¯g{£SeƒFWo;Lf9D`;Gh5C\,3E(/:)2&4J+:P0?Y0?W1?W.;N)6H+8N&2E#+;!-"  + +     + + + + + +            + + +  + Jatk†¢s�¯~¢¿Ž©Å�©È’­É�°Ï“²Ì�³É›µÑ�ºÒ›¸Ô ¼Ó�ºÑŸ¼Ö›¹Ó˜´Ï‹¯Ç…ªÆ†¨¿uœ¼e‡«YyœE[x+7J(4%    + + + + + + @k4;k!!w'#„'!�1'™:1�=6—50™9-¯SO¬MB¯NAÊ�xÞÄÀßÉÉáÏÐàÕØâÒØÛÏÏÆ­µŽrv      +      +   + +  "(0&6;7PbXo�_}Ÿy–±� ¼„¢À„¤Á�¬Êޫɑ¯ÈŠ¬Ë‰¦Èzš¾Y|¢Hi‰2Jg,@Y1CY3J^7Nk8TpSs’g‹¦t•µ†«Å‘®Í—¶Ï§ÀשÆÛ±Êß½ÏãÃÒãÅÒãÇÖçÉØçË×èÐÛéÎÚçÍÛêÏÛêÑÙèÓÜéÑÙéÒÜèÑØèÊÖçÃÓã¿Îâ¯ÅÛ©¼Ó¢·Ð•¬É—¯Æ‘®Ã™±È�¦Æˆ¥Ç�¨Ã‰¥ÆˆŸ¼~˜¸}�®{ެs�«~”°~–¯z•°y”°q�°tЦh|š^w“Rgƒcx“e„¡™¸† À�§Ã�©Ä“ªÅ�«ÆŒ¥Áy“²{’®g{œTg„P[{8BV3?U2=M/4>$,5")7 '-#+6(2C.=R8Kh'@ /,%    + +   + + '#/)7'9H4K]Qk†n‹«|–µ‹§Å™°Ìž³Ìœ¶Ð�»Õš»Ò¡¾Õ§Àا»Ô‘®Íy›»e†©Gc‡:Wx9Xu")7!*5+6H/>R.:I):L*:M%3O$.=)5#1!"    + +  +     + +  $ + +   [t—l�ªr�®y•³}–¶›º…¡¿ˆ¨Å‰¥¿Œ¨Çˆ¦Á‹¬Ê�¯É•³Í—¶Í”³Ï�¬Ë�«Ëƒ§Ã‰¥¿€Ÿ½q•´g‹«j…¨Qm�)&.%*.%4(*     +         +    +  +  '&$  + + +  +  +  +Ldƒa}œf†¤o�³‚š¾‡£Â•°È•²Ì‘«Ê’±Í�­È‰ªÆ‹§Å‰©Ç‡¥Å…©Çƒ¤Áƒ¥Ã€Ÿ»¢»{›»v•´d…§]|ŸQj�DUo8H_)4F#,9 *9&3*7*:-A&<$90' ( ($&"?%&i,)v(&{$$…*#‹/'Š*'–9+£G<©N?ƒjÊ��ϰ³Ìº¼Î·ºÎ½ÀÏÂÇÍ¾ÂÆ«�«–œ{fd    + +  + + +     + + + + + +    +  #"2)5 -@.DX=RlSrˆo�­z˜¸�¬Éž¸Ñ¤»ÕªÄÛ³ÇÜ®ÇÞ°Êà±Ëà®ÉÞ®Çß§ÄÞŸ½Ù†ªËƒªË�¨Ç‚¨Ç†ªÊ‹±Ï–ºÔ¦ÀÛ¦ÃÚ¬ÅÙ¨ÂØ¬ÄÙ¨ÂØ§ÀØ¥ÀÙ®ÄÛ¹Íà¼ÍáÅÔåÊØæÍØèÊØèÌÚêÎÛêÏÚéÏÙéÏÛéÍØèËÙèÊ×èÈ׿ÁÕåÄÓæÁÓå½ÌàµÉÚ£½Ô™µÏ—°Ê‘­É�¨É“©Å…£Â„ŸÁ‡Ÿ¿œ¾w“µz˜ºoˆ­h„¦i‚£`�žgˆ®q‘¯yš·œ»…¡¿Œ¨Æ‹ªÅˆ§Ä…§Å‹§ÆŠ¨Éˆ¥Äˆ¦Å† ¼�š¸‡�¹ŒŸ»Œ¢º{”µtŒ¯o�žK]~?No4=U&1D&1C"+9)6H'4E$/D 0D".<#0? +='7#!'$.!(<!,%    +        +  +    " !"   +  M[sXv•a€›u”¯‚ŸÀ…¥Å“´Ë™¶Ï–µÎ“³Î“®Ë‹«Êˆ¤Ã„žÁ…£¿�¡Àyš¼|ž¼~™¹žº|œµs‘³e‚¦]{žNiŒEVw;Jb,3E&-<",7&2%6)3&2%.!/ ,$)%+*()$6!#e*-v,*~&&…)#…*+Š)"›>4¦H>­QDÃŒ€Êœ˜¾›™±šŸ°“”²£¥Â°·Á°¶¿§š­˜›‚jo     + +  + + +     +   +  + +   +  %'4/8(;K:OhE\vXv™q�±w“´�¬Èœ¶Ñ¢ºÔ­ÅÚ¬ÇÛ°ÉݱËÞ³Êà¶Ìà±Êâ«ÆÞž¿Ù‹®ÍŒ±Ñ�±Îˆ«ÌŒ¯Î•µÔž¾Ù¦ÁÚ¥ÀÚ§Ã×¥ÁצÂצÂÙ£ÁØ¥ÂØ¬ÂÚ¶Éá¸ÌàÃÓåËÚèÏØêËÙèÊØèÊÙéËØèÊØçËÕèËÖèÉØåÈÕæÇØéÆÖèÁÔåÃÔæ¿Îã¹ÊÞ¬ÁÕŸ·Ï˜¯Ê–²Ê•¨Ê�©È‹¢¾x˜»}—¸}•¸r�´t�´n…¨a~¡c~ž] i‰¯q‘³y–·}�¼�Ÿ½�ŸÀœ¾‚œ¿|™»…Ÿ¿‡¢ÁŽ©Å�¤Ã…�»z�²�–´�™¸†›³n‰¯m…¬bt�DVs:Lh-;N%1G%.D%1?.!.*)$  +    + + & 3B&=S2IhA\wKjŒ]�¦{™¹† ¿’°Ê�¶ÑŸºÔªÁ×®ÉÝ®ÊÞ·ÎàµÍ߸Ëá³Ìä¨ÅÜ�¾Ù‘®Í†ªÈ€§É¨Ê’¶Ó”¸ÓŸ¾Ø›¾Ø¡¿Ù�¾Øž¿ÖœÀÕ¡¼×Ÿ¼Ôž¾Ö§ÁÚ¬ÅÞ¸ËÞ½ÑäÇ×åÊÖçÆÕèÄÖçÇÔçÀÑæÁÓäÂÏãÆÒåÄ×åÆÔèÈ×çÆÓäÉÖæÈÕèÀÐäÀÎâ²Çݪ¾Ö¡¹ÔžµÑ–®Ì—°Ë’«ÆŠ£¾…�¸w’³uŒ­vޝnЬp‹¨n‹§pЧq‘µx˜¹��À�¢ÃФÄ{�ºz—¸z•µy”·{’­|˜¶€—¼…›º‚–·l‹¤y–°}œ»z—µk‰£e~˜R^|5BZ0=Q/BY/?\-?W/C[-8N%0D'5&7 )6'8!/D#/=$:#  + +  + + + +  +    +       "' $%$     2;V8G_>QiLf‰a{že„£w�ªu™¸y�¸€Ÿ¹��½x—¶w•¸t—¶v™µ}œ¹z�½~œ¾{—¸o’³p‘¯c~¡Wp�Og‰AUl9E^2>T(0B$&/$,&/"*3"*/"/A#1C&7O';U%:Z';V%9N$5P#2G&5$/&'U"k'$z&$‹/+‘25•5*žA3žC7�SHqUX[WdARh.9L#/7#:0'£’­™–ƒii + + +  +   +   +  + +  $)4,A1K%;R%9N 5K0F/E'8+ +  + 2=2Qo<]~IiŠY{›b�¥w–³†§Å�®Èš·Ðž¸×¢ºÖ«ÅÚ­ÈܯÇß­Ê߯Éá¯Èà¨ÄÝ�º×“³Òƒ¦Çr˜·n”³y˜·‡¨ÈŠ«Ë•¶Ó•¶Ñ”¸Õ™·ÒŸ»Ö¡¼Ö£½Ø¥ÂÙ¢ÁÙ®ÁÙ´ÉÛ²ÉÛ¼Ñà¾ÒãÁÑâÀÒãÀÐæÀÏä·Ïß¼Îâ»Ïâ½Ìâ¿Ñä½Ðä¿ÓæÃÔãÄÒåÄÕæÆÓåÀÏá¸ÉÞ­ÃÚ©ÀÚ ·Ñ™°Ê�¬Æ’¤ÂŽ£½‡ŸÀw‘±r�®w’´n�°j‡¨mˆ§n‹«v“¶|˜»‚¡Ã‹¨Æ‹§Å€¡Â}ž½u“±y“²vŒ«p‹ªv�°|’´•´v‘©{™¶{™»�›½l�¯^|£L^|0=O'5F.=U/Ba/D`0Ej,@Z):N"/9 -@ -9+9"1B"1H&8*     + +       + +    + +  + "$&#     ,8Q2?T8C_I_}\s�b}œr‹©s•±r–²y—·‚›º~œ¼}œ½yŸ»{¡º|Ÿ¾}Ÿ»€¡Áz™»p“·n“´d�¦Xq”Qo�C[w7H^/=Q).<%&,%/&/!+6$,5$/@'8H+@Z-CZ.Gb.B`&9S#5M-D$1 *#'W!m'#|'$‰0&Ž/1•6*œA3 G=“SWSReDUrS&5K&7L,<\)Cd1Gj4Lj1Fa*8L*8P'4E#/<&3F!2K&8%       + + +   + + + +    +   + "$   +   + 19/ �}§”“}hn + +     + + +    + +  + %,-@+;!3F)>V(BZ4Mi4Qk:Xr/Ln1Kd)Ff$Z"9' $$2+C\Fe†Np–^…©k�´o‘µn�·h‡¯cˆ¬r—¹Š«Ê�²Í »Ö¢ÁÙ£¿×©ÂÖ­ÅÛ±ÈÚµÊÝ­ÇݬÆß­ÈÞ²ÉݯÉߣ¿Ú�²Ð‹®Ë�£Ãuœ¾zŸ¿�©Æ‰¬ÌŒ¯ËŸºÒ£¿Ú£ÁÚ°ÄܱÈÞµÊà·Ëà½Ñã½ÑâÁÒæ¾ÐäºÐâ¼Ñã½Òæ½Ñå¿ÒãÁÒáÅÐåÅÓäÂÓäÂÒæ»Ñä¹ÎàºÏà»Ïã¸Éâ¸ÉܳÈܯÀÙ¦»Ë§ºÌ§¸ÒŸµÏ˜®ÈƒžÀƒ�¼sˆªWvšJi‹LeŠEb‡MeŠUu“a€œp‹¨v–µx˜¸x–³yš·€ ¿‡£Á…¡¾��¾„¡½‡ ¾{˜º{˜¸Ÿ¼z›¿v˜½y—¹e…¬a}£BZ}4Hb*6G&&#.(9E6I_ARmBTn;Ha4Gc&5J!,>(5"+%!  +    + + +  +       + +  +   $&!*#   +   AToNd„Uo�n�¯€�À‚£¿Š©Ç“±Ë“³Ì—´Ò˜¸Ð »Ô«ÁÙ«ÃÛªÄÙ¤ÃÚ¤Àס¼×–²ÍŽ®É�¬Ë‡¬Êw Ày—ºe„§Ka„;Pg/>U+2A(0?)9C-:J-;N1@\8Vq>[zQq�PwœR{œTw—Ln�Ic‹9Or+=^,6šij�z‰d€¦h†ªn“µk‘ªj„¦_wœLf‚BNfSSY “€®˜—Šy~(  +  + +  !,(  !!&"" %#+ 5@0K_7OnDbƒPp’Qs—`ƒ¦W|¤Rt›7Sw+H!6'!+)7.IbGgŠMr–X|¢]‚¤`„§a€¡\zœ\|¡n�²ˆ§ÄŽ«Ç›¹Ö�ÀÚ¤ÂׯÈݲËßµËâ¶Íá½Óã¿ÓçÀÓèºÐã¹Îã¨ÃÜ”±Ó‹®Íƒ£Áq’ºr˜³yŸ¿‹«Ê‘²Ìœ½Õ£ÁÙªÆÞ«Èß³ÊÞ´Îà¼Ðâ¼Ñã¼ÐäÂÓæÃÓæÃÓâÁÒäÃÓèÂÓæÂÖæÆÖåÇÔçÊÕèÇ×åÉÕèÄÕçÅÔâÂÑãÂÒä¾Îä¹ËݲÅÛ¦ºØž¹Óž¶Íš³Ï•²Î’¬ÈŒ§Á†�Áq‰±Xw›Pq™Fb‡E`~He‚Vq‘k�°s�±} ½¡Ã„¤ÃŒ©Ã‘¬Ç�®Ì‘­É–¬Ç™²É…¢Âx˜»y–´l޲l‹±lŒ°s�²e…­^¤F\~7Ns.Gd$.)%2"3D)=_/B`9Ke/?Y)8R!.E#-)&    +   +  +           +   +  + +  !  +"&)%%%%# +  + + DToQlƒVu—lŠ«œ¼‚ Á„¢Ã�¦Ä‡§ÄŒ­È–²Íž»Ð¥ÂÙ­Ç߯ÇÚ­ÇÞ¨ÂÜ¡¾Ø›·Ñ™¹Ï“µÑ•¶ÏŒ¬Ç‚¢Ál‹«Nj‹E[x7H]->Q-:M->Q0CZ3Ib9UhBa€IkŠW¡h‹°dŠ®b‰¯Y|žQq™He‰C\~?Yu:>TU'*n,*�-)�1(’84˜I:‘~‹„Цp‘µ‚¢¿‰©É‡¥Ân�µk†©Wq—DPoSS[§•аŸ¥‹�‰!"0   + + +      +    #%1%6B.Gd2OiCg€ZvšY}ž]ƒ¨Sz¢Ln•>Yz&:S,> +&-.=)F^5Us=^Hh†Kg‹Li‹Kh‹Sr“]y˜lŒ«¡ÅˆªÆ•µÓ¥ÀÛ¯ÃÛ¯Éß¹Îã¸Ïä½ÒäÃÕèÁÖèÀÓæ»ÎåµÍä¨ÃÞž¹Ñ’³ÏŠ¥Àx›º~Ÿ¹Œ­Å’³Ï—¹Ó©ÄØ®Æß³ËâµÌâ¹ÐâºÒá¼Ðà»ÒàÀÒáÀÓãÂÕåÁÐáÁÓäÈ×êÊÖêÈ׿Ê׿É×èÉ×èÌØèÎÖéÈÙêÈÕåÇÕçÃÔäÅÎäºËÝ´ÈÙ­ÁÛ¦»Ö•¬Ì‹¤ÃŽ¦Â†ž¾€›¾~š»q‡®c€£_~¢VrŽJg‹PkŠ[v™w–µŸ¾Š©Ç”³Ñ—³Ï•³Î—²Í–¯Í™±Í’­Î“¯ÍŒ¦Âz˜»x—°fˆ¦\y”^x™\}žYu˜Rp�:Oo0Cc,Cc*=#"!/ )9%0?*W4Sl<]{Rt�\~¡^�£a…¨]�¦Qu˜D^‚+A]!6K(9$.'5$;P*D\1Lg>ZvBaƒCa‚Gi‰Uv—a‚žmŽ®€£Å…ªÆœ¶Ó¦ÁÙªÄÚ±ÊܼÏâ»ÐãºÐäÃ×èÀÓçÀÑèºÎã¸Îã«ÄÞ ¼Ö–³ÏŒ¨Ä�¦Æƒ§Å�²Í™ºÔŸ¾×­ÈܱÉß³Íä¹Ðã¼Òã¸Ðá¾Òâ½Óâ¾Ôâ¾ÓæÁÕåÃÑâÁÔåÉ×êÇ×èÉÖçË×èÏ×êËØçËÙéÍÕèÊØéÉ×çÅÒåÅÔå¼Ìâ¹ÌݰÆÚ«Äܧ½Õ‘«Ìˆ£¿ƒ›¸z—¸y–´v“µn‡«`€¢aƒ§Rr•Ki‰Rm‰]z›u–±|ž¾“±Ïž¸ÔŸ¹Ô¡·Ò˜¶Ð”¯Î•±ÎŽ¬Ë‹©Å‰ŸÃ~šºx–´f„¤\tŒUmŽXw–Rn�Lg…3Hf+>Y*;V':$",'2#0?%7#/-/)!*'"(   + +  + +      +  + + +   )"*!)2(0<'0<%-7%0#/%. '   + + F^x^€�g‰¨~¡Á”¯Î–±Ð’²Ëš¶Î–µÎ–¶ÑŸ¼Ö¡¾Ú£ÀÙ�¾Ö¡¾×ž»Ö–¹Ó�·Õ‘¶Ð˜¼Ó˜ºÓ”·Ñ•²ÎŒ°Ì��µa€£[t—D[8F`2?T5EW;Sl@Xz@_€Hc‡Rn‹Sxœ`…¦`„¦Vt•Qt“Rp”Oo“Rn�OjŽFOpT*.f%"~-#“?8—D=’ae~… u�«{�½„¤Å‰¨Æ… ¿oޱgƒ§Pj…BLcPOP£�†®¡¦Šz‰"(7  #$0+84D3F"6J.B.F*>(7+92C(>P0I\2QeIh‰U{ŸYƒ©k‘¯q”¸k‘¶o“¸dƒ­Ttœ=\~*Fh*>]%8"0&9-:"9R)AZ=YxGg‚Pr‘c…ªuš»xŸ¿ˆ¨Ç�°Í�³Ï˜¶Ó©ÂÛ­ÇݰÊÞ¼Ðâ¼Ñã¾Óâ¾ÒäÃÕåÁÔæ½Óå¶Îä´Êá©ÄÝ�¿Ýš¼×—»×˜¼×™¼Ø§ÂØ£ÂܯËÞ°Êà¸Ïã¹ÏçºÑæºÒãÀÓç¾Óä¾ÓçÁÔæ½ÓçÀÓåÂÕçÄÖèÃÕçÈ×éÊØèÉ×êËØèÊØéÊÖèÇÖåÀÒâÀÓå¾Ñá»Ëã²ÇÞ¤ÂÙ›¹Ó–µÏ�¯Ëƒ¡À}›¹w”´q�±qŒ°a{Ÿd�œc€¤Xz¢Yv›YyŸjЦ{šºˆ¢Á˜¶Ð¤¿Ù£¿Ú˜·Ñ•¯ÌŒ¤ÉЧŋ¦Æ‡¨È‚¡Ã~ž¿€ Áp�¯Y{¤`z¢Ys–LeŒCZ~.?]#6K-= .   "( +"-$-.)!  + +  +      + +  +  $#.$,7'0B.6H/;M/;P0:H+2A'.: )   Ql„q–®~�»‹®È™¸ÒŸ»Ô¡½Ó�½Õ˜»ÓŸ»Ôœ»ÕŸ¼Ó—·Ñ�³Î•µÐ�®Ì�±Ê�°É•´Î—¹Ó—»Ô™¸Ò“³Í’­Êy™°i‚£[xšMb…BWp?RfF\qLfƒIk‹Tt�[|›]œ^�¥_� Z|—Qq”Nm‰Ik�Je�HcŠF_�DMgX06i&$0(”D8�RF‰n}qˆ¦x•¯�¤Ä…§ÆŠ¨Ç~›ºkŠ«`z Jb„?F[MLL¦‘‚­›¡…z�$)4&!$&''9(:/D#=[)?\)Ej(Dd*G`)D_(@U+BY2Je9WrBb}LlŽ[|ž\~¢h‰©k�³t˜½xŸ»{ž¿s™ºn�´_€¦Rp™;X{&?\%7N.A&/+;1?*GZ0Kg@aY�žeŒ®uœ¿¦É†¯ÍŠ¯Ì˜·Ô”·Ò ¿Ù¨ÄݯÈß¶ÍâºÑå¾ÒåÀÔäÁÕçÂÓç½Òå¿Ôæ½Òå¼Ïå´Çá®Èá¥ÅÞ©ÅÞ¦ÆÝ¨È߯È߬Éß²ÉÞµÍã·Íä»Ïè¼Óã»Ôæ¾Ñæ¾Óæ¾ÔæÀÖç»ÑæÂÒç¿ÓæÃÖçÀÓäÀÔæÄÖèÄÖçÆÕçÆØæÇÔçÅ×é¿Ôå¿Ñå¸Îå§ÆÞ¥ÂÚ¢ÀÖŸ»Ô›¸Òœ¶Ò�©Ê‚�¿p’´h‰«f„¡az˜\y�\z¡X~Ÿe©b€§l‘²…£Ã‡¦Ã‘²Ñž¹Õ »Õ“¯Í‚¡Ãx›Áxšºƒ¤Å„¤Äz˜¸�š·|›»q“³o޲l†¬d{žDXu7G`%4G+:(6(## )&")5);#3&&!      + +   +  + +  ! ,"+6%/<29R/;N4>R07J+3C&/:$/=)   +WuŒu˜´‡¥Á‘²Êž·Ô¤¼Ö¤»Ó£¿Ù¢½Õž»Õ—¸Óš¹Ñ”´Í‡®Ê�­Ê†¨Ç…¨Æ‰«ÅŽ²Ë“·Î”¸Ï‘·Ï’®Ì‹§Æs•µa€¡Uu–Th‡OayNayOlƒPq“Rs“`~ša…¦]�¥_„ª`‚¥XyŸPršHi‰Ki‹KdƒCa‚@UuAKe]6?i)(‚3/”G9™YQq‡p�©u“µ‡¦Ä…¦Å‚¢Æ{”¶k‚¦]yžG[}=DXLLM¡”‡­ž¤‹z‚%-=( )+)'/,4 3D#6D#6P%<[*C^.Hg.Jk0Jo0Im1Jg1Lg=WxAd~MoŽ\¡h‹°cбn‘µt—¸xœ¼€ Àƒ£Â{¡Ár•ºeƒ­Sx›=]�+B^$:T2I)9+<#8J/Kb7SpCf…]ƒ¤m‘³}¡Äƒ§ÊŠ®Ï“¶Òš·Ô›»× Á׫ÆÞ°Êà¸Ðä¾Òå¾ÑäÂÕåÁÔåÀÔç¾ÓåÀÑä¾Òå¼Îå¯Çß±Ëá©ÅߪÈߦÅÝ«Æà¬ÅÝ­Èß®Ëß¶Ïá¹Ñã½Ðå½Òä¹Òã¾Òç¾Óå¿Ôæ¾Ôæ¿ÕèÃÔè¿ÕçÃÔé¾ÔæÀÔçÁÔåÃÔçÇÖçÄÖçÁÔèÁÔè¹Ðä¹ÐãµÎä©Åà¦ÄÚ¢À×�»Õ�»Ô ¹Ó’ªÉ‚žÄr‘¶a�¨^�¢Zxž\v›^{›Y¡_�¥f…©s–¸¢Äˆ¤Å“±Í›²Ò›¶Ñ‘¬Ê� Âxš¾w™¹†¤ÃŒ¦Âx˜¹~œ»ƒž¸w–³pޱi‰®^x™ASn6E\$1@$2)&%",%4*3 (3#, * -##)*8%4(3 +&&     + + + +    +  + + !&(0'.6/6E,7E/7E+3C#.>!(8&3 ,  d~ zšº‰®Ä–´Í¡½Ö¤¾Ù§¾ÕªÂÛ¦ÃØ¥½Õ£½Ó�¹Ö—´ÏŒ­É‹®È‹§¾‡ªÅ„©ÆƒªÅ�°É”µÑްÍ�£Æ}žÂk‡¨Xn“MeˆMd‚WoŽVo�Xw•Xs˜Twœ]}Ÿ_…¬^€ªXy UyŸPv™NmŽCb†GaG`}F_�D\{?Nl\P"2F-8+4"3@$8E(?Q*@^*Ba'@_%S-Hb3Kg6Pl6Rv;Ur?^|JjŽXxœ^ƒ¢hŠ®kŒ®m‘¶lޱt–·p”³}ž¸„©Æ‚§Â�ŸÁm�±f„¥Ecƒ-CZ'8H&:R#5H#;T)Fe4Vq<_zRt˜g’±u›À„¨Æ‹±Î•·Ò•¸ÔŸ½Ö¥ÂØ«ÇÞ­Çß­Ëß²ÌàºÒå´Ðã¹ÑäÀÑâ½Ðã¿Ñã¿Ïã»Ïã³Ëâ­ÆÛ¦ÅÜ¢¾×¢ÀÚ§ÅÜ®ÇÛ¤ÂÛ¥ÇݯÊÞ·Ìà¶Ïâ¼Ïä»Ñâ¹Ñä½Óå»Ñå»Òå»Ôæ½×èÃÔèÄ×èÀÕç¿ÒåÃØæÂÕæÇÖèÊ×èÆ×èÅÕçÀÔå»Ñä·Ïã®Êâ¯Çà«ÄÛ¥ÅÛ£ÀÛ¥¿Ö¡»Ó‘®Î‹§Åx™»[‚¢]~œ[u–UršUt˜_�¤d€¥f‰«s—¹w À„¦Ä‡©È”²Î‘²Í’°Í‘±Ìˆ§É„¦Å‹©ÅŒ«É…¡¿‡¨Ç�ªÁ‡§Å|˜´{—¸e�¥IXu;F_&4@%+(,#0"/(9&4F,:L.>T.:S.=T.:T$/D#,= +;$/="-<".&1#,$   +    +  +     &$/#%1'(/$%0 $/$" +#  + + d…¦v›¸‚¤Á�­Ëœ»Ó¡¾Ö¥¿Ö«ÆÞ¨ÇÛ¨ÅÚ¨ÃÛ¤ÁÙšºÓ–¶Î�½Ó�³ÕŽ´Ê‹³Í�°Ê‘´Ì�µÑ�°Ë„ Å{œ¿g�§UjŠJ`|Jb~Nf‡JjˆQo�Kj�NgŠRnŒYv–^{ Su˜TršXu—Nn‘Mk‹Gd…B^zB[}BYy@RpNAQS7;k3-|SXp]mJe€]{œn‹­u˜¾p޲r‹¯n‚¢h‚¡e~ Yr“Q`X`q§š™³¦²˜�¢Na€@Yt9Xy5Qq6Ol7Un3Om2Op2Nj*B^#8L)8J':O$7O'MF28b6,~[_qgzLg…]z˜kЦk޲nŒ³n‹®i…¤b| c}£]x•N^~V\m¥™˜³¤³œ–±Pg‰Fb…@\‚:Wy9Vw9Wv7Uq2Mp1Ki%:R"0F->!/A1<#2?$7N6Kc;SiEc�Nm�Pp•WrŽPo‡Qv�k‡©z�º{ À‰®Ê“µÏ—¹Ò˜µÐ•²ÐŒ®Íq’¶Ru–Da‰5Ns';\%Rk>L^BToEZsIa€Pl�[y¡Zz \y¤TzžUxŸTušWv™\zœLj’Zt9Tm5Nh0C^"1B(4"0:*ZyDg„\€žu›º~¥Ä�³Îš½Õ™»×œºÕœºÖ–¶Ò˜¸Ó ¿Ø›·Ð¡¼Ò¡¿Û¡ÀÚ¥ÃܧÇÜ«Éà­Éß®Éà¬Éâ¥ÃÝ¥ÁÛ¡ÃÛ¬ÈݰÊá®Êß³Íá²Ìâ´ÎäºÎæ¼Ïâ¼Ðä»Ðå»ÏäºÑã¹Îâ²Ìâ¹ÐãºÏä¼Òä½ÑãÀÓæÁÑäÀÑã¼ÏâÁÑäÂÔä¿Ñä¾Ñä¾ÏçÀÑä¹Ñä¸Ïá´Ìâ±Èá¯ÈÝ©ÄÛ§ÂÛ¦¿Ù•»Ö‘±ÎŒ«Êˆ¤Åw–¸l޳c†§kбf‡­g„¤d„¨gˆ«l‰«p“´{š½ˆ©È˜¶Ï™¶Ò¡¼Õ¥¾Ö¤¾Ù˜¶Ò“°ËŽ«Å�«ÈŽ­Ì�®Ç“®Ê‚£ÁzœÀ}�¼w”¸„ž¹¥·Ì²»ÎÂÈØÐÒÞÚÚäÛØâÚÙâÚÙäÝÜâßÙåáÚåßÜååÜæãÝæßÚåáÙåÛÓØÄ« àÚæÜÙäÔÐÝ“Œ¤%&4 + +       + +  "$&!'/%+4%,)(     + ` | ·ƒ¥Â�­Ç›¸ÐšºÖ¥ÂØ ÀØš¾×¥ÂÚ¥¿×£ÃØ¢¼Õ¡¾ÒŸ¾Ö›»Ö”¶Î•´Ò’´Ð’²ÍŒ®Ê‚¢Äx™½o‰¬[u–JUu=Le6M_>N^>Od@Nd7†{ƒ‰Ž¡a�^} _€£b�¦j…¨q�¯~–³~š¸|˜¸z•µ`f‡VP`“‡‚°¥µª�²u�˜Xs—PjŠB^~8Um2Id)?Y&7D%4E'9A-IZ5OdDdˆGgŠKl�Ns–Qs™Qw�]‚¡gЦgˆ¦n’·v•µw›ºŽ°È£¿Ù£ÂÛ©ÇÛ®Éá°ËÞ®ÉݲËâ±ÊÞ§ÃÚ˜´ÐŒ¬Ég‹¯RsšOnŒKl‚Z|•b��m“·v�¿~ Á“´Í›¾×œ¾×—»Õ’´Ò‡¯Ï‹¯Ë�¯Ì�¨Â˜»Ò¡½Ù�¾ØªÇà­Éá¬Ëá´ÌäªÆß¤ÅݧÃÞ¢¾Ù£ÃÚ­ÊÞ±Éß´Ìà´Ìà·Ðã²Îâ·Ðã½Ñã½Ñã»Ðå·Íâ¶ÏàµÉá´Íã¹Íâ»Ðâ¸ÏãºÏäÁÏâ¸Ìá¿Ñâ¸ÏäºÐã¾Òæ¸Ðæ¾ÑâºÏä¹Ïå·ÑáµÍá·Ìã±Ëá²Êà²ÉݨÀÚ¦ÀØœ»Ó›¸ÔŸ¸Ô’¬Íx¢Æx�Âo’µkŒ°eˆ¬Y|žY¤Uy Vy•_€¢lЬ}¥Ä‹­ÍŒ°Ð˜·Ñ•´Ò’¯Ð�©É†¤Å†£ÁŸ¿¡¿€£Áˆ¤Á�¥Å‹ Ä·ÁÏÐÓáÖÖàÜØäÛÙæÞÙåßÚãâÛãâÜáßÚäàÚåàÜäâÚäâÚâàÛäâÜæâÙâßÙåÞ×âáÙâÛÒÕßÕÛãÜæãÜçÜÚãÇÁÐ}u–    +  +    + +  +    $)"1$-8&/=&-:!%%    + +  +  b~žy𷂤¿‘¯É›¶Ðœº×¡¼Ôž½×�½Ô ½×�»Ö›¹Ó�ºÕ›¹Î�½Õ™¸Ó•·Ð•´Ï�µÏ�²Ì‰¨Ç„£Àv™ºr�±i‚¢ScKZrAVpCUjFXuASh=I\?GZ8H[ZrG_yNl‘St•Y}žeˆ©h‰¬f†¯fŒ¬h�±j‡¬Ob‡]zJp—Np—OušMsœTz¡X£Xƒ¡g�®n’¯u˜»zš¸ƒ£¿�±Ê©ÃتÄÚ¯ÉݱÍß³ÌßµÍà±Êâ³Íá«ÅÝž¼Ö”´Ñz�À\„¨[~ Z{šbˆªp�±s˜¸wœÁ|ŸÁ’µÏ¢ÁÙ¡¾Ø–¹ÔŒ¯Î†©É†§Å†¦Â’²Ì”µÏ¡¾Ø¢¿ÙªÆÝ­È߬Èà±Ìâ©ÇÝ¢ÂܧÂÜ¥ÃÙªÈ߯Éß±Éß²Ìà¹Íá¸Îã´ÎäºÒä»ÐãºÐâ¼Îä¸Íâ´Ëá·Îâ¶Íá·Ìá½Ïá¹Òä¾Ñå½Ñá¸Ðä½ÏåµÎã¹Ñã¼Îä¹Ñå¼Òä¼Ðå¿Óå¹Ðá¶Ðã»Ðâ»Ìã¹Íá´ÉÝ®ÅÞ«ÆÜ£»Ô™·Õ™¸Ô�¬Ë„¥Ä~Ÿ¾u“·mб`‚¨^€£Y}¤Vy¡Ts�]‚¦dˆ¬| Áˆ§ÌŒ­Ì‘®ÎŒ¬Ê�ªÊƒ�ÀƒŸÃ„œ¿{šº~�À‚¢À†Ÿ¼œ¯É°¼ÓÏÑÛÚÙäÛØäÞ׿ÞÙåß×âߨâÞØÞÝÙÝÜÖàÝÖãßÚáâÚåß×ÜáØßáØãá×àßÕäÞÓÛà×àßÖÚÚÐÒâÝææÛæàÛåÛ×áÆ¿ÐEAY  + +    + + +   +  + + +    !+*7#,9&/@(     +  _{˜s–·‚£ÀŒ­Ê�¯Í”²Î‘±Ì�¯ÍŽ´Î”¸Òž¼Ò™¼Òž¼Õž¹Î¡¿Óž½Ô”·Ð”µÐ‹°Í‰¬Ç¨Çƒ©Ä†¥Ä‹¤Â™¹k†«d€¡QjŽK`}CTk>McPdHYmIi€[�d‡¦n”²l�±n‘³o•·m’µm“²fŠ®SjŽ?Ea5.+}}ƒ’š®�™¹m�®k‰®k‹²u”¸|šº}›»‰©Ä‡¦Æv�¸MTr96BD68cQLq]`rgma`nOYp8Jb*;G&6<&7C(;G'=J4Le=^wFi‹Vv–Rs“Sq–Mn“Xt—[w–c‡¨q•³p—³p–²t˜°z�¶”²É©ÅÙ«ÇݱËÜ´Îß·Îà¶Ìá³Ëâ±ËߪÄݪÃÛ ÁØŒ±Í}¤Ây¡Áp’³v›¾}Ÿ¿vœ»uš¸{¡¾’¸Ð¤ÁÙ¤ÁÙ™½×‰«Ë}£ÃtžÀ�§Â�²Î�³Ð˜·Ï¢ÂتÇݪÇݯÊÞ¯ÊߪÄÞ¥ÀØ¥ÀÚ«ÃÛ±ÌÞ²Ìá°Éá²Ìá¸ÎàµÎã¶Ðâ´ÏãµÌã¹Ðâ¶Êß¹Îã¹Ïà¸ËãºÎã¸Ðâ»Ñã¹Ñã½Ðä¾Óå½Óè¾Óä¿Ôå¿ÔæÀÒå¿Óæ·ÑâºÑå²ÄÕ´ÆÓ»ÉؼÐãµÊß¹ËÞµÊݱÉß­ÄÜ¢»Õ¢·Ó˜³Ï�¬Ë‰¨Äˆ¥Äs˜»v•¸bƒ«Xy�Uv™HdˆPj‹XvšZ{ŸlŠ­p—»t™ºž½‚¤¿ƒ¤Ãx›¸w›»{�»yš¸‚›¹”©ÂÇËÚÓÓßÔÕàÕÑÚØÔÞÙ×àÙÑÝØÒÜØÏØÛÕÝÚÒÜÖÑÜÜÑØÝÔÜÚÐØØÑÜÛÓÙÙÑÚÝÐÜÞÒÙÚÏÚÛÎÖßÕÛà×Ýá×ÝâÛäåÜâãÜääÚâàÜãØÑÚuoŒ.-D    + +  +  +   + + +   +  !% !$$1&0 '3%      +  + e‚ x—± ¾‰©ÆŒ«Æ�®É�®Ç–³Ï–¹Î–¸Òž¼Õ™ºÒ™»Ô›½Ôž¾Ó¢ÀÖ“µÏ�±Ì‹®Ë�¯ËбÌ�²Ì�²Î’±Í”³Ð…«Ç„§Äy’µb|žQh‡BM^>IT=EOAMWCYlJdxZx�`†¤g�«n’µz–·z–ºr’¶n޳fЬ_{ O\Š;@_-()skh�’Ÿ‹ž¼g‘´t–·q™¸m“»t–¸�¾‡ªÇ�®ÉyŽ´<>S+&/3+.@=DKIP]]]Y]cMYiD_*&2/%&FDEUQ\]_eOZrBTn7Nb.BY)@Z(CY+EU2Q^HfvIfuPiOn‹FfƒIk‰Y{›Z€Ÿ\�Ÿp–°u™¸u›¹d‡®[{‘VthŠŸŽ­¿›¸Ï¦ÄÖ¨Äס¿Ö”´Íš·Ð—¸ÒŒ°Ë‚¡Ãx–´e‡Ÿ_‚œfŠ¥n�±q“³t˜¸{¢Árœ»p•¸{Ÿ¼�³Ï‰±Ì†°È}¢Á{¤Ârž¼o“±n’¯q�¶•·Î•ºÓ”µÒޝÇ�®ÉŠ©Ê’°ÊŽ´Í¤ÀשÃÜ«ÄÜ«ÆÞ«ÅݪÆÜ­ÇÛ«ÆÝ¯ÉÞ¬ÇݯÊáµÍß§ÂÚ¥ÁÖ¡ÁدÈߨÄݲÈܺÐãÀÓä½Ðä¿ÓäºÏã½Íá¾Òã¹Ïâ¼Ïã¾Òå»Ðå¸Îä´ÍáµÍá²Éß»Îà¸Ëá¸Ëß´Ìß³Éà¯ÈÞ®ÄÚ¥»×¡¼Ö »×¡¶Ð˜²Ð‡¤Æp�¶g‡«\ždƒ©_�¨`| Sp™Sp”Yw�]‚¨h‹±q“¶y�»€¡À…ŸÁ¤±Ê´¿ÓÄÅÔÄÄÕÅÃÒĻʱ¯Á¬¨ºÀµÇûÈõ¾Ä´ÄȽÊÎÃËÎÄÈÒÈÌÔÉÑÕÇÐÙËÑÙËÐ×ÈÐ×ÊÏÓÄÉÙÆÏ×½ÈÖ¼ÇØÄÌÜÌÑÜÈÍÜËÐßÔÛâÔÛá×ßã×áãÙâãÛäâÝäáÜäÔÌÚJAY   +   +  +  +   +  +  #&,;%0=&3A$.A($)'!'-%+""   +  + + p�¯vœ½{™»zš½~ž¼…¤Ã�­Ê”´Ð•¸Î›¼Ô À×£ÁØ�¾Ö™¸Ò–¸ÑŒµÌ’¶Ð‘·Ð•¶Ð�´ÌŠ°ËŠ®Ë�°Ç�±Î”·ÎŽ²Êˆ¬Æx—²h€Ÿ_v”M]qDVoCXjD]wNkŠWx•jŒ®p”µ{�¼{Ÿ¾u�¾v—¼€Ÿ½t”´iƒ¦]v”Nb€EFb%Q4.wQO”‹ p‹¡rŽ«i�±x˜¶v”·p‰©j‹¬n�¯q�±DCg0-;"[46eCHVKN>LX6EM7M^9Qa8Uk3L`1HO0GQ?]e?\cGizQv�Q{�Qw–Qs�\™d†žxš´x™·w›¹xš»h‰¤\x�UnnlŒ˜~£·ž½Ò¡½ÖŸ»Ô�­Ê‡¨Å…ªÅxœºl‹ªY{–Tr{UxŒ[™aƒ¢\‡¬e‹«o�°d„¤eƒ¢c…¤s˜¶m—¶g�­eˆ¤e‰ Z~˜\�‘^€‘p–´–´Ïš¶Ð‡ªÃs™´j’°k�ªz¡¼Š¯É£ÂاÂÙ§ÂÚ¬ÈÞ¯ÉÞ¬ÈÞ³Éá«ÅݪÆÜ¥ÁÙ¬ÅÛ¬ÇÜ™¼Öž»Ô ½Ö­ÆÞªÄݯÇܵÊÞ¼Ïâ¿Ñá»Ðà°ÇܶËß±ÉÞ¸Ïá»ÍãºÎâ·Îâ¸Ìã¹Îâ´ÈÞ²ÉÝ·ËàºÏáºÎß·ÌܹÎá¶ËÞµÈÞ´ÅÞ­ÄÛ¬ÃÚ£½Õš´Ñ–®Î†ŸÀv“·r“²mŒ´j‡«c¢Xt›_zž[|¡m‘¯v˜µ€ Á’¯Ì˜°Ì²¼Ï¼¼Ò¼½Ñ»µÇ·­À¼°Ä¾´Ã¶¬·«£¯¿³½¿°¿Á¯½¾°¼À°½Å·Áö¾Ê·¿Î½ÃÏ¿ÈϾÉϾÃͺÀÔÅË×ÈÎØÃÍÚÄÌÕ¾Á×ÀÅÜÉÑÚÇÎ׿ÉÞÐÔàÒØßÑÕãÔÚá×ÝåÚáäÛââÜâãÛâ½®¿WNd      + + +   %%0(; '5 &6##&1(1:&08$+1%    +  + +   +m‰«s—·v–¶yšºzžº„¤Ãˆ«È‘´Ð•¸Ï—¹ÒŸ½Ô¢ÀÖœ¼Ó”·Ð–µÎ”´Î�³Í�±Î’²ÎޱÌ�­Ë†©Ä†©Ã‡«Æ†ªÅ‡ªÉ|¡½g… ^x�Rh‡FXj?Qh9NfEYoMjXy•eŒ§nްt—¸{ž½y Åz Á›½t�±i‚£Zw•K]~DCd$G%$l=Aˆs‚h~‘`‚šh�¯y“³s‘±i„¦iЦi‹«c„§C?[/'D%i07qFO5FK7O_;XmEbx3N^/ET0IO:T`=XbEfvMv—OyœOp‹Ei|Mr‡\€’i‘¬y›¼�¤½z�Áaƒ©Uq‡Fab[~†wš¬•·ÌŸ½Öœ¼Ò‰¨È~ž½z›ºiŒ©b‚¡Tu‘Mk~On~Qs‡^‚¢b†«c†¨j‹¬^€ŸWzš[u‹`‡£a‡£X•Tx�TrƒPn{Rt‚Vx„m“©�¯Ê�®ËzŸ¹aˆ¤^„¤b„›~¥¿‘µÌ¨ÆÛ§ÂÛ§ÂÜ®ÈÞ¬ÆÞ«Éß´Éà¯ÇܪÅÞ¦À×©ÃØ©ÆÚ�¹Öš¹Ó�¼Õ¬ÄÝ®ÅܬÀÙ®ÄÚ¸Íà¶Êà¯ÊÞ¨ÄÛ¯ÈÞ³ËݺÏá·Ìâ·ÌàµÈݲÈà¶Ïã²Ê߯Éà·ÎâºÍâ¼Ïá¹ÌÞºÌß¶Ìà±ÆÝ¶ÆÞ²ÇÜ­ÃÚ¡»×�¶Ò”¯Í…ŸÂy–¹w—¶p�³r‰­g�¢Wvœ[{žc�¡v“´|œ»‡¦Æ•±Î«·Ò¹»Î²±Ë´±Ê³¬¼³§º¸¬¼º­¹±¥±¨¡°º®¼¹ª³¸©µ¶§°¼«·Ã´½¿°¹Â±¼È·¹È¸Ã˵¿É·¼É±½Ï¹ÃÓÃÌ×ÃÌÕÂÆÓ¾ÁÔ»¿ÜÉÐÛÈÏØÃÉÞÍÐÞÎÕÞÑÔàÔØáÕÜäÚáäÛáãÛâãÛäÒÍÔ��¥  + + +    + + !($.$.*#* +1+3;*7@$1: +  + + + +  + ^y™d…§e…©hˆ¨v’µ{›»ƒ§Â“²Í”·Î–·Ñ˜·Ðœ¸Ñž½Ó˜¸Ï »Ñ”¹Ñ•¹Óš»Ò�³Ìƒ¨À‡¨Â{¡»y¡»yœ¹‚£¿}Ÿ¾r•±\q‹QbhMZdBMS;IO3?H6HLE^nSk~b~›j†£{–°|Ÿ¿~¢Ä~¢Ãw›¾a‚£\z˜[u‘Sc…EBY4Q$*wNSgm{e{�lŒ©x›»x–ºt‘³g‰§f†¦Sh…<3J*"Cx0=‚9=‹V`YXgBYk@b|Jq’Jm�7Rp5O^6Q\:Zg?anB^kNsˆ;_|7Vj2JK;V\CdrY˜g�­r™µzš»Z| Gd{6G@Gbidˆ��£½‘±Ê’³Éwš¹^y�TuƒRuˆLpŠIh‚Fdv?bg>`pMixNv’V€�_…£X{œUs‹F^bFhvAesBdu<[k9U\?bjNhtNk|Z~‘r–±t–´i�¬Qw�Ty˜b„™†ªÁ�¹Ò¯ÈÞ­ÆÜ©ÄÛ¢Â×£ÁÙ¢ÂÚ¯ÆÜ§ÃÚ©ÇÝ ÀÔ©ÄØ¢¿Ø•µÒ’³Í•¹Ò«ÄÜ¡¾Ø¡»Õ�»Ó¦¾Õ¥¼Ô¡½Ö¦ÀÖ¤ÀÖ±Éß´É߯ÉÞ£Á×¢¿Ôž½Õ¦ÃÚªÃÛ­ÈÜ·Îà³ÈÞ¶ËÝ´ËܰÆÜ­ÆÜ°Âت¿Ô¥ÁÛª¿ÙžºÖ›¶ÒŒ¯Í„£Ã~˜¸u‘¯r޲p‹®d„§c‚§_|¢i‹®|�À}¢À˜®É¸ÂÖ¼ÃÔ´´È­©¾°§¼ªŸµ¤™­§™¨¦’›§™©«–š¯œ¤¥’�ª“—°—š´Ÿ¤¸¡®À¦¥¾¯µÁ°·Âª±Å­´Ä¬±È²¸Ã§¨Ã§©Ê­®Îµ¼Ð»¾Ò¶ÃÓ¹¿×½Å×½¿×ÅÊÚÃÅÛÊÒßÑÔáÔÙãÖÛãÚÞáÚßäØßߨàÕÌ×1&5 + +  +   +   +   +  ! ,")#'"&&2$/3!(-"*   + +  + + J]pQoŠXs�f‚¢x•·|ž½ƒ¥ÅŒ¯ÍНÊ�µÐ—¸Ñ�»Ó—·Ó—¸ÏœºÑ™¾Ö–ºÑ—ºÓŠ¯Ì‡¦¾‚¥¿y¡¸¤¾z¢¿{Ÿ¾mŽ­b„§Vo‡@PNCSWANT5CK5??.<>8LYG_s\w–iˆ¢w�¬w™¶yš·q�³d‡«Nk�FbyTjŒCBd1%: $=qNQtzŠm‡›}�·‡¦Å‡«È‚§ÆgŽ´\}žMf*+:!-k*/€;;˜]hngtKcxB`sJj‡Dh†7Sd0KL5RW=Z_A`q@[h?]i/MX-FI 3+$<9-GEAcwVx‹a‡¡f�²Xz”=Yg&;41KICbed�žƒ£½‚¤Àk‹§>Z]1JG:X]DgyFds8TR2KF4H@6KJ<`lOsˆRu“Kn‰Hax3FJ6O^6NY4R]-EJ.JP5V]>`q7U_5PQCbpC]o;Zh9V_=T]Ifs}¡¶Š®Å¤¿Ö�»Ô™¼Ò—¸Ò ¼ÖœºÔ�¹Ó�»Ôš¼Ö£Áס¼Õ›¸Î†§Åƒ¥¿Š¬Æ›»Òœ¹Ó�­Ëz�¿„¤¿‹«Ç’²Ê›¸Òž»Ô¨ÁÖ§ÃØ§ÃØš¸Ð�±ÎޱÎ�½Ö¥ÂÕ©ÂÖ»Îà²Çß´ÉÛ²ÈÚ®ÅÛ­ÅÛ¢½Ó�·Òš·Ô�®ÏŽ®Ì�ªÈ…£À�›¼w”¶lŒ«f€£j„£f…¥cƒªiŠ­v˜¹ƒ Â�¨Å©´È¹µÉ®§Â£™­œ”§š“§Ÿ�›š‹˜”†‘ �œ¥‘œ¦�™¡�• Œ–§�–¤Š”©�–¯“—¶œ¤½¦¨Ã­·Á©²¼¦²Ã¬®È®°Á¦¤À  ¾—• £Å§®Í®·Ë¬¦Ï¯«Ô¶¸×ººÕ¸¸Ö½½ÝÉÊßËÒàÍÓáÔÙáÖÛãÚàâÚàà×ß{l…  + +  + +      %"(&5(=&.$-(!,#" %* '+##   + +  + DQ]Toˆ\uŒeƒ¤q’³�½€¥Ä‡«Î‰®Ë‘³Ï’³Ï“µÐ“·Ò™¸Ò™»Ó’¹Ð�½Ó—·Ð‰®Ì€¤»}¡º}¢¾€¦ÀuŸ¾n•´i†¨\žLf{-=:9RYE`oa‚Ÿh†¤mŽªw’©w•²lЬVw™Fe~C`vJ^}1,D## +  :qNTw�–t‰ž~¡½…ªÈŽ°Ì†«Èn�²a€¢G\q$'4%b%,}9>—[dublQ[cA^lBby>]p6N]/EG0GE;TU=Wa?Yc:Wb+IL)A@1-4-%9/6Q[IepTv‡]~�Mp‚:Vb$99(=:8SWUw‰n”¯p’­Vv’3IM(;30NOHhrFbl9RU4GC/D7,A<<[jFgzOk„A`x;+AE*EM.MT)BC*EG2OR5Wc2MY':63Sb2KS,EA.CF-CC>YYk�¢†ª½–¶Ï�³ÏŽ³Ë‘´Í“´Ï‘µÏ�®É“µÏ•µÏŸ¾Ó™¸Ñ–³Ë{›ºm“­{�¸’°Ë”³Ï‡§Ær�¯v˜¬ƒ¢¼†©Æ‘´Í’³Ì™·Ìž¸Ð›¸Ñ‘°Æ…©ÃŠ­É—¸Ó¤ÀÕ­ÅÚ¹ÍÞ±ÈÞ³ÇÛ³ÉÚ¥ÀÙ¥¿Ö›¸Ð“³Ï�°Î¢Â�¡¾x—½u“°q‘³o�±b‚Ÿ]~£c�§^}£cˆ­o�´€Ÿ¾Ž§ÆŸ®È¨ª¾©£»œ—²™ŒŸšŽ¥—��›‹›“‚‘—ƒˆŸŒ– Ž˜œ‡�žˆ’žƒŽ¡‰“Ÿ‡�§‡�ªŽ”¶š¨´�©º¡©¿¥«À¦°Ãª­È«®Â¦§¾¤§¼–œ¼›™Â¡§Ì°²Ë¥£Ìª­Ï¯³Ó¸»Ó´½Òµ±ÙÂÃÜÉÐßÊÒßÒÕáÔÚáÕÞá×Ýߨߩ—®  +   + + + + + + + "#)#+(<':(5%1!,", )#*"% (-&$'(  + FV[Ww‰Zx”gƒ¨n�±t•µm“¶z¡¿ƒ«ÁŒ°Éˆ«Ê„¬Ê�³Ìš¹Ð”µÎ�³Î’´Í’±Ê¡¼zœ±€¡µ�¥Áz¡¹s™¶c‚™Yx�Soƒ;Vb4F@3C@4>62A<->=,=65QSA^hXw•_€ e…žg…¤i‰£f… Tn‰@Wp?Xm@Uu)2  +  #dEJr|Ži™q‘¨‹¯Ê�³ÍЬÈg†ªWpˆ:JU&&' ]()z7@˜QXyY_SUX:S\7Ra1Q\%:?"2/$60(BA3QV4OP/F@'=9"94.,)!' 0$,C99PJOddFal5MT$600%(91:WaJajE\i3LS#2.,!&?;0JO6JN*=9)7.$5'"4+-DD4MP%>A$;;.'1105"("+$$9.Kpu`‰š~¡¶v˜»p•¸už»€¡¿}¡½o‘®…¨À‰­Ê˜¹ÔŒ¬È| ¿c~—WvŠWy�p‘®v—¸fŠ«Pn�Nmr\€”{¢À�¥¿zœ¹r–¯wœ±vœ´`Ѝm—±y¡À…¦Â›·Î£½Õ¶ÊÝ´ÇܲŨ¨Âל»Ó—´Ì–±ÍŽ­Ë�¤Áp�®n�¯j‡ g‡£d„ª`€¢Sv–Vx™YzŸXy›f�®m�²‚ŸÀ¦®Ç©ª½™—®˜�¦Ž†–”Š�—…••…–•‰“Œ|ƒŒ~Œ“�Ž™„—€‰–{„™€ˆœ�Šš{…�|…¤…‹¢„„ª‹�­Ž–±‘•¹– À§¥Ä©­À¦ªÂ¤¨¿›¦º––»˜“ÀžšÇ¦¦Ç¢¡Ç¢£Í®®ÐªªÎ««Ø·µØ¿¼ÝÄÅÝÉÍÞËÐàÑ×àÔÛß×ÞÓÈÒ,&.      +  *%-"4(8 *7$,#%'. +1"*0"+/!*1#'# OdiXy’Vxš[xšn‹«p�³uš¶|¢Â¥Á„§Âƒ¬È‹¯È”¶Í•¸Í’·ÍŽ±ËƒªÇ¢¾jŽ«c‹¥n–­}¢Àw™²j�¦Upx>NI5IC(9:#.("0(!0&!1*(7.'827QXCcqPs�RpˆMl€Nm‰Y|•d~–Vm‡@WeŽMSlRVKGI)BP"68#=B1/("+ $:>+HR.DH!4-.#+' !!1'*>30HA2FB(:9'!.$ 0&)=:&740*( (!-$2&/%/'+!+$&1*2-':3-$%& ' ,(2*511*.$*"$ !# !3'=_jMvŒo“­a‹©e‹¦lˆ›s’ªl�¨Y|—gŠ¥xœ¸†©Ät–µfŒ¤Lp†@\t8SbFbsTu�Mmƒ4LP>XPXz�x–¯n’¬c‡ PsˆLo€Qp}Gh{Tw‰]~™kލ‚Ÿ·�«¾«ÂÖ¦½Ô£¼ÐŒ­ÂŽ¯È—µÍŒ¬È}¡Áw˜¶s–´~�¼{–·iŒ¬b�£Xy™Ln�Nq”Vt”Vv�Yu“e{™™¥À¥¡¸�—­‹‡Ÿ†z�ˆz‘Š|‹Šx„‹pu�u�‘‚‰�‰Ž|‹t�Šoy�u{‘pn�sx�oq•uzœyy¥††�|¡{‚®Œ‘¯Žš·–šÁ¢žÆ§¦É¨¨Ê¨¥¿™–¼•™¿•�Ášœ¿”˜À��È ŸÅš“Ӈ̣šÑ®®Ô¶·ÙÁÂÙÀÂÝÈÌÜÎÒÝÑØÚÐÕ`Rf!  !%%-!).)/"+( //!*.&.&.6".3'(  ! K_dQn„RrŽXwŽk‹¨o�®z�¸|¤Á€¨À†¥Ã„«Ç…¨ÇŽ³Ê”µÍ–´ÍޱÍ}¥Àzž½f‹¦`…žeŒ£{Ÿºk�­`„ŸJbn2C<)72"0+&&')$.'$5,0OZ>alQo�Ml€Kj}BbvOrŠRn„Kbp?TX?TX3=O +  + $R25RQSEQVLkoi�©k”³fƒ›E^r9OO9H?#'(T)+zBE‰PS`MS?BC#7;//1,+&&,"74+GN*=;*#!!&!(/$(94)9."4,%(-'/'/&$#' 1#*!, &%  &) ,$)"&"* +"0'0#''  "!!5)CajJpƒaˆŸ^„�X��\~�h‡›`‚˜Qn…Npˆb„žt™°h‡¢\•?br8P`-EI9QY?av=Zi,A=8NKNlrl�¥_‚šTxŒG`iA]b?XX>_hJksOs[}ŽjŠ›{œ®�¸Î—²Ì�­Æy—±~¢½„©Ç¢¿t—µn‘¯zšµƒ¢Âˆ¤ÀlŽ®b¡OmŽKj†Np�Qs“OlŒQn‡rŠ¡¢¦Á›•ª•’©Œ…›‰|�„w��w‡‡s}…n~ˆv‚Œz�Œy�‹sw…puˆmt„gj†hm†mm‹ip�nn’pt¡}ƒž}‚—w ‚�®�ж“�¼˜šÁ  Â¢¦Ê¬®Â�¦º•ž»Ž‹¿”�¿“޾‘�À””“™»ˆ‚Å™“ˤ£Ð­²×½¿Ö·³ÛÄÂÞÎÏÝÎÒÛÐ×�yŽ,(2   $##+(-!-8%.5#.0"22$-2!),'/4$-2)*  +   /P45??808.1GAKlyPqˆC]l.A@*:9,<1 (!F.0nEK…T`E>;-4.)$ !& $$+ /)*$  !'*)('( /$%  "%&%"!"% &-"* # $<3;\p?dwIj�=Xg60=35FE;JE/A82DE/IN1HR(;7%5.#.&.#'$)!*#-&'91/CA.F;*>5&90 /)0"-$<1+B>0GC'928EA.C>A__TtˆNm€EfwJlzOq~Rkx7H=8MFZ}Žq’¯n�¯]|“;Ta4P]@_jLl…Rq‘Tu‘šŸ¶ �³�‹ …{”„u‰€s‡zlvn|yfp|bl€db}ch~aoz^b{_amUVnRVyZ[yXUyYTsPJyRRvMJ~UO‹de‘jiœup”koŽig˜oq¥zy°‚‚º�•±ˆ„º•“´�~·‡ƒº‡‚¯yy²{wªpl¡_U¨he¬ts¶€|¿‹ˆÅ•�Í££×·ºÛÄÊàÎÑÑÄË�y�%'!&$"$! %%,<@1?F/CI.BF.?:(?9)8/$61!2/ )$&# ! ,6/0=34D?D\nOk‚QlRhrLbhJcmJdpOp€U}“dˆ¤jŽªiŒ¨`ƒ¢Qo�F]k;W\GdpQm€Tv‰Ol~Dbw9OZ'55% ##$&.$#813E>.B<6G:';**=00A>(71#4)"/)  + +"6!&B68%!$1)3*+#-!*""0% +$%#?1-hKKuX_(%    $)'! $!        +   +  + /$,CB/LM(></,0&%5,,;5/>3'4++94(>=(<9"54!/$"-!'&$!&3+$95)<9#73 3'!3).$+ ( 1("74(<9 1)#5*):35RQFexAdz>_r?YeB`iE\f+=7,A=FjvV{�VxŒFcs0DG0DI=[iKi€Qn‰e™Ÿ�º›‘°‚}“€v�~o}juzhpzhtxaj|``|de~_bej{dg}_`qTTqUXyWQuVQtUMtPLxUPxTQySN†caŽgd—pm™on•mi™ko£sg«~y¼”™´‰Œ®‰†·ˆ…ºŠ}¶‡²yy¯zy­rp˜WJ£cX¦ic²{v¶{w½ƒxÉ•˜Ò°°Öº½ÝÉÊÖÇÏ©’¤%*#,#!,%!"" !%$-=?3BC4EI5AB-<7-@7+6*(5)"1*"-' *#' &##$)3)&-#)2)5DC7GI8FB7HJ9MN9LP3KN:WZIeqPo‚GfsEcqD]d8TX3LG6OK;"2.!-( #" $%(;**=6,=1"0%!/%'72'4'%  0!B44675!'$#&%)& 313dX]l^d ##$!$     + +   +    + +  + +  ",$,$)&!)!')$&'% %&)!$+#-#+ $$$'+$$#(*EC;WjA_s+EC-=//C9(;3.'1,&>58Ud5Q_%:8(6**;/4OQCamNg~”œ®’�©Š€˜|m~vhyseyiZ_v^lp]knZcmYbmY^tUVqWYsY\pRPhJJfFAnJHiIFfG?jC@oECnE?oMK]Z‰_]Šc[�b_“gašnh qh§wq´…‚¶Œ‹¥|z¶…‚·ŒŠµƒ{©rp©nc¬ng”RL¥aZ¬uj¥fe¶zqºƒvÄɘšÍ¡œÖ·ºÚÇÌʼÁ/5*!0 #2))4-&&'&(!( !/$,<51>35D=.<5&3&(7%*8(,=1(6/)5&!-%#. $3# -)%)'#!$!(!'$+'4,*2(,7+-=6/AF,:9)63/AD4KJ1HR3EA-=7-?9-A=,CD*<:'31$4)"2*'!*#!.%&""   !!$+-!-%* )*,-$0*(@:=164!+* !"">>8jbgpdr  + + +      "      + +          +          (%' %)'<43LK4JI-$- *#($#."20-)/(/)%6,.A7@Y_nƒ““�«�|”vnƒobtl[in`llX^lXdpZfx]_}a^w`]v\]lQMiPPeF?X>9YA=fC=^A=^94]<3a90a8/fC<)51#-*(::*=:+:@(84$1)#6+$3,"5/"1'"-'*"!! &     !"'%#!(("!3.-?BE062&!0'"2*"!!=>5mcashw + +      +               +    +         +      "     !#%&%6++=4+<6)'&&  )#(!( ,! 0*9+]ryŠ�¢‹‚š{r‹tfxl]oj[lsahs^dmVZmT\xYVu[Ww\Tv][sVLsUQjGG\DB[>=^=5]<9Y92[63[61X4/d<1jIFoFA|QT€PR�YT¦~|¤zxª}}©tw¬|u±‚y«�z§wq©xq­zv°vo­oiƒ@<š^U—YW›^U¦lb´{tÁ†‚º|o½~nËš�Ø¿¿ÛÎÔ}r‚%0)5'%2! .)*,0%0 !1"#1"';)(6(&6'%5%-/&31B4.<.(6)$3&.?-*:%(7"'2%$0%0 $/#.'3 $")$&+")/$)/$-3,%/,"(!#)# )$$ ##)#      + +   ")$113=;?+/'+'8,&6)$  +  ;=1okezsz      +              +    +   +    + + + +   +  +     $  +       !$#" ()-:+‹ŠŸ’Š yr†pbpi\lhUfm\hm\bu`du\^wa`|fdx^[s[^pSUiE>iG;jF=jNKkJJ_B@`=7Y:5W3,T0,U2.c:4f;8c=7jD=uJGqKB‰`\¡vqª{p«zs¨un¬{p±ƒ}µˆ�¶€€¨mg¯uu¬neŒFHx?2…E5~G=”_K�hZ±sj¯fW²l\¿‡~Ö½»ÜËÎõ¾*4&&3&$3$. /(!+"-!3 .%0$3,8%0?1.7+ ,,.'50>(0:%(6!.#3!+=.,@*):#+;$%3!&1'7'. - "!%")(4()$"' &"#!!   +  # !))841;76!&&'6'(6%(  + /4(ki\„z‚""!    +  +      +    +) ''    +     + + +   + + + + +  +   +   + +  +   +     + +    +       + +      "!U_[�‚“Š}‘tgzk_kjZhfV]o[blTTqVXy\Y}^`ƒij‚hh_]lFEcC>hG;eEAaBCa=@dB&'!%'3("/"#  +  +,.%_aXvz$#     +  +        + ' &!! +         + + +    +    + + +  + +     + +  + +     +  +  +     +  px|�~˜†tŒtbkk[ghX\gS_lTXjONpVWpQQy^b‡jj†lr}_blHEcCAhF?gG?cBFc@>a?;X;6U1(R,&M+#M'$W1,V0,T1)W1+`:6d?1zPI�f_ŽaW™hg¡ol¦uq±~yµ‰‹´ˆ‰µˆ¸ˆ†¶}€—ZX„E;s6)ŸvX19,!l:(’QAž\Oº€vÔ´±ÚÃÃÚÍÒ]]i&4,&$$!&'"0 /.(. 0':+$7'%6%* #"1,8"/=()7!,,$2#'9!%3&3%&+".)(    '(!7;6??@$*""$  + +%*PUOƒ{ƒ())                      +    + +  + + + + + + + + + + +  +       +  + + + + + +    +   + + +      + + + $‡†”|uƒufsnZdeQ]eOZhQWpV[oUUtUUvWS{\W‚a_�bepQOdD@`C@aD>dC?_>8_@:fB9W64N..N*$Q*%N+'Q,)M'"N%!P+*T1*X5,d>9‚SM‡YT–aVšjg¢rl­}t¶„„»ŠŠ¶„ƒ´„�¶~{œ]TŠJAzA6£vZ®‚l£t_k:3‚E6“SF·ƒyϰ­Õ¸¶ÚÏÒ™Œž478  %.))%().%$'"!!//9)-8&*($*"3!/+"#++'     @A=ECE)*#,! ,"(   "(MO<‡}~=:5    "      + +   +  + +  +    + + + + +     + +    + +  +   + +     + +   +   + + +  +   + +       +   + +  FSRŽ€�zelu^dlWdcILfKLiMPiTTkROtXPyXS{^]…gbhE?dF:kGFhFAfF@cD=`?;Y94d<5[5.O(M' M& N$!L%"N*#V.)R-&Z3/a;6oH@xNI~RK‡YU›kiŸwo¬�|¶…}¹�Ž´ˆ�°}x­ys�MJ~@5ŒJ@Ÿ^S«xi¨tei94o@-}F5­xgʦ�α¯ÚÈÈ·¨³IDE $$"!! /!"/ ,"$"*!1'*#&" + +  + ;;3EE@*1(&/&&0$",!  + $GG8‡�‡GC?        +    + + + +    + + + +  + + + + +     + +   +       + + +    +  +  +   + +  +  + +         +  + $gnj‡tƒu\mqX]fOVbKOgPWlTSiSOoURy_Y�dd�eeˆiefH>kGAjHJkLLkDBfG@b@>`>9c<6Y2,P)#K&M%K$F$O,%V-%U.(X-*X40pF@1Šƒ„bYU//&      + +     + + +   + +     + +         + +   +     + + + +    +  +  +    + +  +  +   +     ERG||†‚n}pU]mT_gPTbLNcNPiQYtSRwYVy^\…h`„fawcewZV}]_pQMoPKiLIkHCcD=gB=c61Q,(J&EG"G O%M%S-&T0,R,,U0)^0,j>4m<4€MI†XU‰XWžoo°‚}¹Ž�±|w°€{®ul�SM‘_\‘`_¨si¿“ˆÂ—�·‰zxHIb5/˜eV»’ƒÉ¨ŸÓ¸¹¦“•822       #%!$.!) #    '     +   !'!  :=9:=:#,-(% $&!3:,‰ƒ‰zprG?8 #  !          + +  +    +  + + +  +  + + +  + + +    + +  + +      +  + + +         + + + + + +  +   +    + msz~x‡{h{nV_jUUfR_rYbpTSgOOuUY~[[‘on‘pl„bb€_\|Z\tTOyQLpMIhKJgC>pG>gA>Y5.P*%L'!GL M#P&P&L%N&N%T*"\54c81c2*r?6ˆXNŽ\Z†SQ heª}q·‰‡«zt�`^›dcª~|³†„­~|»‘„Á�™Í¯§³–ŽŒfj€M=¬zx¹�ƒÎ±«n[e          !"$  #!!$)&        + +      +#  783:>5")& #$'$-2%‡…ˆ{uxPHB"$   #'$"         + +  +  +    + + + + +    +  + +           + #%     +  + + + + + +   +  + +  + + + + +      + + + +  {v„w‰ydtmSYoW[kT\oVYoSZqQWoQP{[Y�jk„eey]\}`_wSQqSTpPMnK?lKBiD9mF>e=:W0+H%!E HN"P$N L"L#L$P'!S+!^50b2,f3,g83‡SO�`_’^Q¢nbªvj¶†€®{t£jgžli®�„±ˆŠ³Š‘·“޾™•Ë­¤Ç²¯¶š¡~LD¤sq´„zÌ·¶l`k          #" $$$$##" %# +         +        #    7749<3) !%'#+, ‡�v…�‚ZUM"%  "%%-,'           + +  +   +  + +  +  +  + +   +  +     +  +    +      + +     +  +  + + + +  + + +       + +  w‡„rƒnXbuWZuV\jPQqOKsSSqTSmQQtWV‡dd}]`�][‚eg…fe�`]}ZYvMVqKEe@4]=9[8.C%;D N! W'R P S#O#U*&V)"V)#[.&R+%`4.lA=uEByH=„QJ•bX�UI’XJ�SK�WM�jh£tq¦xy§€z¬��¸”•̬¢ÕÅÄÔÇË©Œ‘¨‚~À¢šÚÏÓ²§´>;C      +   +  "'*!"#!            +    + +           895752!!#,0"&"'{yp‰…€a_X  *"'$"&))   + +   !)$  + + + +     + +    + +     + +    + + +  +  +  +   + +       +   + +  +     + + + + + + + $ƒq~~gurU[oUUpTSjUTuXTuZUrWXzWRxVSƒ]Q�]V}\`…ge‡`]Šf\�k_€[Q{UIoG;D*"+  $P'X'"X!U#R!S!Q#P"U*(T( U+&a41pA>rA;vEC†RK‚LCuB8x@9€MJ‘^_‹QJ”e[¡wq¦€yª�|ŧ¦Ñ¿À×ÈÉÛÐÕÝÐÖß×ÙÝÒÔÒÉÏ�…š       +  +    ' 0 ""!           + + + +          + +95155/,"4%'$yth�†‚dc]! "&'#""%(  + +    $#        + +           +  + +      +   + +      + + + +    + + +  +       + +   + + + + + ,4-€n{~cguVYt[brW\lOIz\P}c]}_a~[OyTL~[T~]RZW‡fc�`YˆcXŽnhˆ`^€SNgA<&  + + F'X' \'R%S! Q"P$K!O"Q%S*#b22i<7o>2…QO†RC�MAk:2r@8yE=…SPˆTP‘cb¦~wª„ª‚|À¢œÐÁ¾ÖÉÍÝÔØàÔÜãÖÝÞÔØÖÍÒ¼°¿         +       ,$#! !!!   $  + + + +    +     + + +033./* !   )/'ieRŒ†Špkd! !$!  + + + +   !#   + +  +   +     + +  +  + +  + + +  +       + +      +    +  + +  +     +  + + +        + +  AG;Šntafz_bmQQjPQtUUxX]~ae’qq…ba†fa“lfŒd`Žia–om’pn—sp“mg�db‚YZZ<7  + +    # U-$^,'[*#Y&PGJJ!M"]*"e72i:5sD=sB3qC=e82pC8|LDŠ]Zžrl¢wm«ƒ}±Š‡­‰ƒµ“�Ä´´ÏÁÅÞÔ×ßÓÚÝÕÜáÙßÛÑÕØÐØ93B +      +     *%  +   $'1%'2( $!$"#!)$!    + +  + +  +    + + +   31--1*##   % [\L™�‘‡|}"' "         + + + + +    +   "!        + +    +      +  +  +             + + + +        + + + + +     + +   QVS…ei‚divW\uVTrTVsVT{ZY�caŒmmŽmp�mh�hd�hfŠgd˜zxšvi’pfšzy—kcŠ]Q," + +   %#_4#g5*`+ X'W$Q%I%O%Q%X/(c5+`1'^3)]2(S.+_40nC;‰[W›rj£}t¦{wº—”¶‘‘«‹†ª•Œ½®¯ÔÅÇÝÑÖßÔÖãÚàß×ÜàØá£–¨  + +   + + ('     + +  +  %*1 +6'$(%"$ "  %'!    + + +    + +   + +  + +   !20/13-#% WXJ“�‘Š~$(!!         + +  +   +  "    +           + +   +  + + +           +  + + + +       +   +    + + __X‚c[~bcwZapQMnPNoQM{YR�]Z†gd’sz‘ps’lj�on’qk£ƒ~¡žww {{˜mm‰\U!     D-^6*e/"a+$_(U(!N&"M$ L#!U(#Y+$X+"\3)^9/X5.]3*k@7‚SI”kh£~t©‚z½˜Ž´Ž†®�†´ž™º©«Í¼ÁØÈÄÜÊÌãÚààÚßâ×àȽÇ    ))$  +  +   +   % !!$!$*-*0 #  "#% '%#)"'        + + + +    + + + + +  :6166-"       JK:–Ž‘”‰‡1/(%$     "%   +   +  +     +   + +       + +  +   +  + +   + + + +            +  c^`‡in‚fj|]`qKMlSPqPLuSS{VR†fa�pk“st™woŸxušwy©ŠŒ°Ž‰®�‘¯†„œvw�`Z!     `=/m5+h3(\,&[*!S("U-%M(#P% M!J"F"Q+$T1.`;6|TS�hb¡|wµ‹‰Å¤žÄ¦¤´•�ºŸ¡ÒÃÆÙÈËÖÁÅÆ¦©¼� ÜÏÔàÖÝÝÖÞVP^    $(&  +   + +   + &*))%%(*&''+##$-"+!)")"("%&)*',%(#"    +)  + +    + + + + $$>53A830)"$     + +=A0ž•’ ™šRD;"!     1"!5'%:,"/!%(%  + +    +   +   + +  !'  + + + +     + +    ( % ! me_ˆcm�_g�][oMJoORxTMtRLyWTŽgi’mi’lm¤€|£u¡{m­�ޝ‰‰µ‘�·�Šª‚ƒ›oj5*( !#    S7-k<3n8-^.#X* ])!]1'W.'R-%G#=D$S1)[61pHG�ZQ’j`¹–�¼™•쨻 §Æ°»¨–о½ÙÅÈÕ¼¼k8C½›’ÖÁÀãÙÞ¿µÄOMX      !## +  +   +    +*.((''+-!&#+" *%/!,,)) &'*,,0+*", & #$.".!! + +  '(#D:5G:57.!&%      + + + 9>*œ’Ž¥›™[NB' "#    ,/@61H<=TK-B4!0("* &! $!        +  + !!  +  +  + +   +     )*"'  "zkf�jq‡gk{WRpNRrQNrQL{TM}WK†d`�kn“ij¡{t§‚ƒ¡zz¬Šˆ±Ž�´��·�Ž­‚ƒžqlJ9; !%%   +'J2"j=.k90`1&d1(^/([.([6.I'#@E$O-+V4-hE@‚[L’mf³‘‡´“‘¾§¢°’›ÐÁÂȲ뇇ÞÌÒÙÇ̉Xm˜keʯ²áÕØÕÐÙ“‹�  +      "  + +  + +   +.2"*+'+%)!%"*(#&+5"(.!,('%+),,.'''!,"2%%!#$$ .!/#$    '&"K?4S?8B,,'$#    +  01&•‘�£™žk_W2+'      %/<2FWWL^YSkoD^_8KD(( $! #. +""   #  "  "   + + +    &  +  +  !( !$ #  #!!%%unh�krˆek|Z\sRRsUQvTL{NC†[K…[U’nj“lg›xs©‰ˆ¨‡‰ª‰‚°�…¹—�»™”³Œ‹®€‚“ie$'!!*)$   '&V4%f<-m80m:4d6/f5.^3-Y1)T.)A"J'"W6/qNDŠf_£€y¢…ƒ¨�Ž£‰”©ŒŽ¿¬®È´Â§�†Ìº¼Î»Éc/3ŸokÜÌÍߨÜÖÍÖ'-(  + +    !,0&     + + + +   +,../ -/ !# %$#)'+,2&/!* (($"*"+(,%+ #!#'!+$(#"  $($"(!((#!+*$Q?=L;36)   + + + +  + +  "%Š…€ œŸnie+* +,&   #&(-<.@TRI]^P_\:H6/>1%($%#!"$&##"( 0$"3&-         +        + +"#$ '%#&&'neZ�ir‡`iƒ[]yTTyURxPI{\X‚[W„[LŽe]—oi£zo©‚­‹ˆ³��·�м�šÀŸ¥¿œœº�’±Š‡�orWMP$/$,9((0"$ %" 6*jA6h?5n<5g:-d9/_5*N-+G(%L)!\41_60rTK‹nj”ww�ƒŽri›†…ξÂDzÀ�v�Æ´®žu“a2>É­§ÝÓÕÜÔÜvt…&*"     + + + +  '  +    +   + +,++/ **$"#$'-/+3!%2!-*'&!)"+(0$-#$!"$%)&%# %!! $&#!&"*&% # ,*&MA6i=6a62X3+U.*O+%O0+H)$fH=~g^Žrs�tv‰ldš‚‚Á­±ÙÊÐ̸ƙ{‚ݾˆ^tœshÚËËÜÐÕ¦œ«'(%  +    +  +     +    +  +'*+--+ #  ('+)','*"')*'*$+%"+!,# !("*$&(!"#$  #*&" *,';:<965      + +  +    |sg—’‘zuk%/#%-!,*% $ #(- )))$2!&4%%3 .*$  %('! ."1#/! *!+,)%') !0 .#0$#1$& + +          "*) $%&&"d^S‘loˆfj‚`_zTUvPMzQI~WV|YVŽheœnjœsgšwtžvpœrp²�Œ¹™š½Ÿ Ä¤¥È¦¤Æ¥¡Ãž›¯ˆ‡±Žˆœ…‰4;5&1#" ""!'!+ '#"$,*I6'V;0kA8k=5d;4]70S,#F&"jE9xb`…os‹v{‡ig�nj¸Ÿ£ÍÀÃ×ÊÑɶˎr|¿­±}Rdȱ§ÚËÐÓÍÕ*2.!    +   + + + +    + +    + +    +&)+*'&%' !"('(' #%#($% ('%#!!!&"$$##'*(779143 +        ki\��Ž�xv!" &!% ! !$$'+& #&#&'%#'!.%4(#4( ($-$0 .'&&%&&1"&2##/!  +           "$ +& #) "!ZWN•lo�kk‚cf€ZQXV{UJƒ[Wƒ[Y�ig™vx“mg›wp¡zržqp­ˆƒ»›•Á¤›Ä¤œÉ¨¥Éª§Æ¥œÀ�š¼˜˜¿œŸ§””{rr", $"(%$-.<+,=/#1&%7&$1 #/&/ (0 +1#R@+œz€™x~�dcŒgf‰a]‚\V†`]†_Y�e^™spšso—lf¥{q©„|§�~º–�ƨœË©«È¦«Ê¯¬Ï²¯Ï°°Í²´Ì­¨Æ©ª¸›  ŠŽ+3&(!"+"."*#,+9#0>-*9(4D12D8):%&4%6"(5 !.",@9+rH>nE:rJCtTR{YPyXV|`X~ea–~{´�œÁ¬¨Í»¼ÔÆÌÒÅÏ[ANÖÌÓÚÊÐÓËÒž” 263$'#  !"   + + +      +  + +  $(&.$(")#&" #!"'!!#&"     #($!   !(,&>?::=7$    !  HI9ƒ}q�…Š! "(! !#$$ % #+&%$('( ,,"'""&($     +  +       "$## $ ##"! $## ")+%"!**˜vu¡x‘fc‘ed‡WVŠc_‰_^ƒ[R�ke”je–jd¢yt yr¤|€«x¾ �ʰ¯Ã  Äž›Í©˜Ïµ°Ñ¶²Ò·µÔ¹¹Ñ²±Ï´¯Í²¶ �›^^_%#%$((6%*8'-7(.=)1?-0?-(4%5!!0"1*)41 sWH|PFkOFoTPz``uZW~a[‘ts¤‘�²›ž¶§«²ž§¨�›y`}�•‘ …–9'3oia.62$++  +        +   + +  !& (#'$-#"#"!"""!     +&".*  !#$)0*AD>>?7&    GH9~zl•Œ�(&#"'  " )&!''))+-"&!"      +   #'#*#() &"!""$'  $(+$"  &…oe z€˜ji‘eeŽYZŒd^Œ`Y†^R�ki‘da”f`¡{w¥€~§~©‚{¾¡œÊ³±Ã¡�Ť¡Ë­¥Ò´¯Ì¯°Ó··Õ¹¹Ó¸·Ô»¹Ò´¸Ã±µ£–Ÿ-3,$''%1 *6%'6%*8#0<(/D2'5#"1 ,!-')01qVH�ZSpNJnPMv^`tUO|]V�mh’„‡—‰�~kyQ;F8%.fQacZTbLe..+#,& '(              +   + + + + + "&!!# "#   +    +$0# /# !    ##*)"GHH@B<"        @B0ysf“Š�?94!   + + +    #$'$$' $ %#  #&$%)+'$!$#$! &)"!J@-Žrf™sv“b_�a^ŠZX�`Y�bX‘e[ yzšqo¤zy¦|£~y£yx·•’ĦžÆ§¦Å¦žÊª¥Ó¶³Ì¸³×À¼Ø½¼ÙÁÁÙÁ¾ÚÀ½Õ¿ÄÕÀǰ¦«388 %!/!$3#*4%#1!-#1/>))6#"2 -!$$$)_Q:~WSlKNcGCoSMw``nZ]Hœ•ša[V.1& + + + + +       "#$""'!)-(*/,*.)361RROXb^jx€y‡�~�”Œ“ž‰�›‡�™s�ŽZbhNX\[hi^ns`kq]foELQ=FHBE8<9,11"*($$#( &%%$ �g[¢qk�fc–dW—ib—fd’`Y‘b]–g]¢{w£woœl_¤umª€u®}}µ�Œº™—¾››Â¥¦Å ŸÍ®¨Ñ²°Ò±«×¼»Ù¿¼ÛÁÃÝÆÇÚÅÇÛÈÊØÃÇϿµ¬°=A:('&#  %(:-%O/6   !#&'&%%$!        #!($' ! 9%I+L2#<.2)3%8"<*8-+#  %+-2$25%2+9.8'.(#& &!'-/(JHGCE> + +   + + +    + + !$GM9œ•“njd49+        +  %.+Wae’™œ¦«±Á¿ÊÉÇÓÌÈÒÓÌ××ÎÕ×ÏØØÏÛÖÒÛ×ÓÚÙÖÞÚØáØ×áÚ×âÛØåÝØåÜØáÛØãÚÙãÛÙáÜÙàÝ×ÝߨâÝ×áÛ×àÞÚäÝÕáÝÙàߨßÞÙâÝÙäÜ×àÜÖßÙÖà×ËÖÒÃÌÔÇÐÑÇÑÎÇÐÊÂʼµÀ¬§±¦ ª˜–žŽ‘˜‡†�npwln{npwmou\djT[b=GD)1*#'#!  uZD�sj�ja—eZ—fb”`]‘^T�^T•eaœpjœsi™k[¢vi¦{v­€€³ŽŒº˜”½™š¿œ�¿™•Ë©¢Ïª¦Ð¯§Ö¹¸Ù¿¼ÙÀÀÚÆÆÚÄÂÛÇÈÛÅËÚÅÆÑÂņ„$-($#  "&  >$-  $##"$&."%($$!   $%#&(7';%6'4&9 B%C(L):!5!3&>,>0"6+9':'7*%"#! "!") $+$0.'FDB=;8 + +      + +   @C1™–“}xsAC4$   ' -77€„‡°©¶ºµÀƹÇʺÇÌÁÊÏÀÏÏÇÖÑÅÓ×ÎØÚÔÞÙÓߨÒÝÚÖàÚÖàÛØâÝ×áÝÚàߨäÞØáÞÚáÝÚáÞØâÞØâÞ×ßàÕÝàÕÝÝÒàÜÔÙÜÓÜÜÓÜÞÖßÝÖÝà×ßàÙááÛäߨâÞÕßÛÔÜÛÖÛÛÓÜ×ÓÜÕËÕÔÈÕÓÇÑÖÆÒÓÆÑÔÈÑÓÇÑÏÉÒÓÅÑÍ¼ÈÆ´ÁȵÂÅ®»È´½É¸¼Ç¹ÅÀºÀ¼¶Á•—¢eipEKQ"&   #"pZDžnj™d]™g_“]S�\[ŒYTˆUJšh]œogœkb–fa—gW mf¨|z°‰‚»˜œ¹•”¼–“À›�Ë©¥Ì¬¥Ò¶µÖ¹¹×¼»Ñ¸µ×ÃÁÛÅÃÝÇÊÚÅËÛÉÐÔÅÊ–�’EDB"  &  + +$)!0%%(#% %" !!+%) "%)-6A"C"A!@&F-">$7$6!9%2#+&%% "% &)#%&( ,)#@<;9:6 + +   !4;+•’�‡€yIIA$$%#' " $,$lnr³¦¯¼±»È·ÅͼË˼ÌÏÀÎÓÈÖÓËØÔÈÖÓÍÚÚÐÙÚÎÛØÒÙÙÓßÚÑÜÙÕàÝÕßÛÖâÞ×äÜ×Ýá×ãÜ×àÝ×àÚÍÔÖÃË×ÂÆÙÅÊÚÉÎÝÊÒÛËÒÞÏØÛÑØÝÑÛßÒÜàÔÚâÔÜàØÞÞ×ÚáØàà×ßÞÔàÜÖÜÜÕßÚÖÜÛÓÚÛÕÞÛÕÚÝÕÞØÍרÌÔÕÌÖÖÏÖØÌÔÖÊÑÖÉÒÕÆÑÒ¿ÉϽÊϸÄͽÈ̺Â̹ÁϼÃÊÀÈÊÀʹ¶Á•“ †ˆŽhjl?BF-/2     !žpnŸgišfbšfk�YRŠSF„QI‘]U�^Y”g[”dY‘]X•aWœmf¤vj­‡‚°†w³ˆ‹¹�}À™žÇ¡ Íª­Ñ³·Ò¶µ×¼¹ÛÄÃÛÃÂÛÈÉÜÆÇÚÊÈÝÊÎÒÂʲ¦´*.)   +    $("#%#%!"%-!&/ ( )6;">C"B'C) 9#8$4 5 .!+$&###&'&.#)!"$$$).&($&&&"<;7774    !%%28)��ˆ‰€|RNC &!!%""  CMHsvu³¦µÈ¹ÈÊÀÍÔÈÓÔËØÔÐÛ×ÐÙÕÍ×ÖÏ×ÔÍ××ÑàÜÕÛÜÔßÜØàÜ×ßÚÓÜÚ×áÛ×àÜÖÝÞÕäÚÔÝàÙâÞÓÛÞÌÙÙÂËØÃÌÚÊÓÙÍÕÞÔÝßÔÜÞÑÜÞÓÞÚÒÛÞÓÛàÓÜÝÔÚàÕÚàÖÞÝÖÙãØàâØààÚâàÙáßÙàÝØÞÞÓÛÛÕßÝ×ÞÞÕßÜÕÞÝÎÖÖÉÑÕÊÏÖÉÏÙÍÑÕÈÓׯÌѺÅк¾Ò¹ÁнÅκÂË®¼Çª±È­­Ê±¸Ì¸ÀËÁÈÊÂÇǾƳ«·›˜¨TXd'*)     + �j_£mk�fd›ca�XH‘XH‹VO”ZS”]Z–cb‘_Y�bd�a[šf_£p`¬}u¬…}­„�·Ž„À›“Ę�É¥£Ë­¯Ï²µÓ¶±ÚÂÂÙÄÆÛÅËÚÄÉÛËÊÚÇÈÚÊÒÍ¿Ç\Yd     +       $ # &%#)"(#*&# % 5&5';'6#3(4*,(&#)) +".%)( /&5:'4<.*7*!$!#&$(&,.). %((+$?>C3/2 !"+)%'!01$�Š„�‰„^XL#$"#&"(! '&("*.-”•–ÄÃÌÌÉÔÔÏÚÖÓÝÕÒÜÙÏÚÕÎÜÖÐÜ×ÓÝØÕÞÙÔÝÙÏÛÕÐÞÙÎÚÙÐÛØÒÜÚÑÞ×ÐÝÚÓßÚÓÚÛÕáÜÒÞÛÔßâØâÜÔáÝÖàßÙâߨäàÙááÜäâÚäáØßÛÐÝÛÌ×ÚÍÓ×ÌÒÚÑ×ÛÑÖßÒ×ÞÓÞßÖÜãØßàÕÝáØßß×ÜàØßâÛáäÚäáÛåâÜääØãáÛâß×Þ×ÐÙÕÇÍÙÉÐÙÊÔ×ÈÓÖÆÑÔÅÌи¾Í³¾ÑµÁж¼Ï´ºÎµ¼È­´Ç¥­Ã�ŸÆ¤¨Æ¨­Ì·»ØËÓÛÎ×ÙÌÕÐÅϹÅqnv()'   + +B6&Ÿil¢gg f_’ZS‘VM�XP�WPŠYS�\TŽXNŽYS‹UL”]U˜bV¡ndŸmp¤pp°zq¶‚t½Ž‚À”•Ì«ŸÌ« Ó³·Õ¼À×ÂÁÛÄÅÜÊÒÞËÏÝÉÏÛÍÎÚÊÎÀ²¾.79!  + +    +           !%#- '! ,+#& !"". 3)1)1+/'0--*,4 &.!$$'((/#0/&;:,=A1.2'"*#&!&*,-0+2"(/&+,-%D?;:<> "(&$$%(''!'+ ƒ�z“ŒŽnfb "$%&$,&+#/),,"$!%",$.%$+"&+5#.9(-4-ALO[iq”¢ª·»ÀÅÄÊÊÇÒÐË×ÑÈÒÐÅÔÔÉÖÒÌ×ÒÍÚÔÌÛÓÌØÒÈÐÔÉÕÔÌÖÔÆÒÔÇÐÔÉÑØÊÓØÊÏÔÅÎÔËÖ×ÌÛØÍÖÖÎÚÚÍÚÙÐÙÛÏÜÛÏßÜÐÝÝÐÙÜÒØÜÐÕÜÏØØÃÏÔ¿ÇкÆÓ·¾Ð¸¿Ñ¿ËÖÅÇÛÈÍÛÊÏßÐØáÔÛßÔÜáÕÚâØÞåØÝáÙàâÛäßÖàåÛâæÝåæÜæâÛåáÛåÞØáÛÔÚÜÑÛÚÈÑØÇÏØÇÏÙÄÌÕ¾ÉѲ¿Ëª¯Î²¸Î­¸Ì±ºÌ°¶Î²¼Ë®¹Ä¤±Â¡¥Á¢¢ÉªµÊ¯¼ÒÁÍØÆÒØË×ÕÉÒÇ·¾ªœ¨<78!  „bV kf¡hhšbYŽTN’WNŽRL�UOŽUM�VQ�VNˆTRŽWM�YM›gX™fa›`Y¥sj­xq±}oº‹…Æ�•Χ™Óµ´Ö·¸Ö¾¼ÞÊÊàÌÒÞÑÑâÏÕàÏÓßÎÑÙÊÐ_We"  + +  + +    +  + +            " !$!65$')#!     !..!-%/.(())).(2#,"#"&*,0)0%+$79)9?,06'%,!+$')*,0 )2!(+%(-0.JFEB@:!%&(%"%../#'&'*!,"',"‚~q˜��tlh #''+'0'3(3,2+,()'*,%,##)',7E6K[Vy„ާ®¹¶»ÅÆÈÑÌÆÑÌÅÐÎÅÏÍÄÑÍÁÎÌÅÓÓÉØÓÊÔÑÊÖÎÅÓÌÄÐÌÂÇÐÄÏÒÅÒÒÁÒÔÄÍÔÆÍÔÃÍÔÃÊÑ¿ÈÕÄÎÕÊØ×ÇÕÔÈÔ×ÉÖÚÌÕÙÍÖ×È×ÚÇÔÙÉÒÙÊÔÙÈÑÛÉÔÓÂÒÓÂÊѾÍѹÅйÂÓÀÈØÅÉÛÇËÚËÏÝÎÔÝÑÖßÔ×àÖÜàÖÜâØÜãÙáâÙââÖÞæÜãæÞâçÝäæÝæåÞçàØààÚââÙãÞÑÛÚÉÔÚÌÕ×ÂÍÖ¿ÊÓ¸Äʪ­Ì©©Î®²Ë°¼È¬±Ç®¶Ì°¼Í¬³Ê¬²Ã¦­Ã¥±Ä©³Ê°¸Ñ¾ÉÔÄÒÒÃÊÒ¼Åͳ½��™856$%   TB2‘g[¢ol¡e^–\Q’XK�QJŒQMŽZY‘WQ�XOŠWRŒVN‘YP”bTšd_�`[¡mj­wn°{q¸‡„À’†ÇŸ’Ѳ®Ôµ¸×¼ºÝÊËàÎÒáÓÒãÑ×àÓÔÞÍÓÝÌÑ—Œ›69A + + +                    " "#! 94#$ +      ! !($##!%"!*!*$"*',)*)&#(+0.5#$,!'!+&.&,).'/%)&),'MONLLC&/!+))',"3($2 #1!1*)' $**!'0%|~m›’•}rn" #+*1/$60 5,5(-%/*31$GPIbpq¤°´ÃÃÏÇÆÒÅÀÏÉ¿ÌȼËĶÁÀ´»Ä´¾Å¸½ËÄÎÎÃÏÍÀÍ̾Í̾Ê̼ÁİÁð½É·½É¸Åȶ½Ð»ÉѾÇÓ¾ÃÓÂÉÑ¿ÊÒ½ÊÍ¿ÉнÊϺÈÒÀÍѺÈϺÆÓ¾ÈÖÆÑÕÇÒÙÇÖ×ÊÕ×ÊÓÙËØÜÍÖØÏØÓÆÒÚËØØÆÕÖÃÊÔÀÈÕÅËÛÈÏÝÉÑÝÎÎáÓØáÕÙâÕÜãÙÝãÝäãÛãäÚæåÞäåÞäèßååàåçáæâÛäÝØáâÛàåÛâåÙâåÛáÞÓÝßÐØáÐØÖÇËÕ¿Éг¿É¥¬Ä™™Â”’Ä™œÌª¯Ê¬¬È­µÉ¦¯È¤ªÃ¦´Ê®»Ë±¶Ï¸Â͸¿Î¶ºÌ®²Æ³¿­¢²DAC2%•fe faœ`[•\Tœ`V™^U‘XO“]X“XOŽWL‡TNŒWK’`Y˜dZšg] k]¨tm¬ym´Œƒ¿�‡Ä™�Ê£›Ð¯§Ô¸²ÛÆÅßÉÍàÏÐãÔÙáÕÙâÒÙàÏÔÀ¯»]KV  +     + + + +  +      +  "'    %&!(90!(##  '!(&# #' '!*!** (()%/"%0 &5$+4#$*"+,.%JJKKOK&,&%"& /(8)"/!.(1!'4%*)&*&$0!$+!npgš“•�wu "$"(-8(07'45%4/@C=`lk¥°·ÄÁÎÀ¿ËÀ¸È·ÇµÃÀ°¾À°¸À²Ã²»¿²¹Á´¿Ä½ÈÁ·ÃÁ·ÃÆ´¾Ã­½Æ¶½É´¼Æ´¿Éµ½ÊºÂμÅϼÇжÄϽÆÔ»ÂѽÈϼÈ̸È˶Áɱ½Ç°¼Î¹ÇÕ¾ÍÔÂÑ×ÍØ×ÎÜÙÑÛÚÏÛÚÒÝÙÒÞÜÒÞßÔÚßÔØÝÓÜßÑØÞÒ×ßÒÛÛÉÑÙÇÏÚÄÍÚËÐÜÏÒÞÏÕàÓÛâØÞäÛßåÞäåÝåæÞèéàçèâæèàççÞåçàæåÜäßÔÛßÏÖàÙÛãÕÝáÒÕà×ÝßÍÕÞÈÓßÎÒäÖÚáÕÜäØÞÞÐÙÞÍÑб·Ñ¶¿Ñ¸¾Ì®¶Ì©¬Æ¢¨Æ£©Å§±Å¬³Å®³Æ¬ºÇ­½Çª®É«´È­·È¯±“‰–YQY%pR=›eiœaZš]W™[U–ZO—^X’ZR�ZV“]V’WRŽURŒWN’a\–bZšea¤pf¦o`´‚{»�ŠÁ•žÈ žÎ­¦Ò¶³ÛÅÃÞÉÎÞÏÎáÒØãÕØáÒØáÓÖÝÐÕÀ¯¾!!   +  +    + +  +  +  + + + +   + #"    #% %;4%1+)$"!" #"!!)%'!  "% ""(' ,)%.%1*3''/"'.!/0'LOMGIE(- *&%(.)9'(2$-)/*/** +*8$!/&1!&0$bcTš�‘‡�$% $()2$/9&9<)LWN“œ¡¯µ¿Á¾ÈøȽ³Â¼°¾½«¹¸¦³¾©µÀ®·Â¶ÃÆ»ÇĺÅúÈÁ·ÄÀ­¹À²ºÅ´ºÇ´¼Ç¹¿Ë¹Ä̹ÆÇ¹¿ÏÀÄÒ¾ÄϾÆÓÀÈξÈѼÉйÆÌ¸ÄʶÃÉ«¹È©¸È²¿ÑÂÏÙËÙÚÏÜÛÑÝÙÓÜÛÔÞÜÒÛÜÑÚÜÒÞÛÓÞßÕÚÞÓØßÔÞáÔÞßÓÚàÕÜÞÏÙÜÎÓÜÉÑÜËÑÜÍÓâÎÖáÓÙâÚàäÝáæßååâæèàéèàçèâèéãéæáéæàçæàæâÝáàÓ×ÝÒÔßÍÖÜÃÉÞÉÈàÐÖáÎÐßËÏâÑÒàÐÕã×ÞãÖÜåØÞàÑÙÞÊÒÝËÐÙÃÅÓ»¾Ë±¸É¨­Ç¬±Å¨®Â©³À¦±Ã¨´Â¥³Å¢«Ä§«Ç©¯Ä¯¼±¤µACF#)!F5™e`›aVœ]W�ZQ—VP–[X’WO‘XL’ZO‘ZT�WN€NH•cZ–b\�ii¢ma j[­zpºŒ†¿””Ç¡šÍ­«Ò·ºÚÂÁÞÊÏÝÏËâÏÖãÔÕâÒ×ãÓØàÒ××ÉÐJAQ     + + + +  + +    + + + + +  + + + + + #$ 5*=6'?6&1**"-%*!  !")'&  "'&  $%#! #&-)7'(6#*3%--$IH@GJD,2 +"()"*#/$.#'&)!$%5'+:&/:()8%-8$]YI�’Ž�‰‹55-"#+2)r„…š©¯À½Ê½±Äº­¼³¥·°£°³ ¬±ž®´¤®·ª·¿°ÃÁ·ÃŹÈɸÄÄ·ÈżÈżÈÏÄÒÐÅÓÑÆÊÖÊØØÍØÓÍÕ×Ì××Î×ÚÍØÚÒÛÛÒÜàÕâÛÔàÝÒÛ×ÄÓͶÅÍ·ÄÏÃÎÑÈÖÕÏÛÖËÖ×ÇÔÖÈÐ×ËØØËÚØÍÛÝÍØÙÔÜÜ×áàÕáá×ßáÖâãÙàäÜäãÚâã×ßâ×ÝáÕÛàÑØÛÊÑÚÌÓßÊÔâÕÜäÛáæÜãèÞåêáæéáæéáæèâçêâëèãêéãéèäìçáççÝåã×ÞàÎÖÔ¯´Ìž›Ë£¢Ò£¡Ëž¡Ð¢¡Í›‘Ò«¤Ø¼¼ÜÃÀßÌÖåÓÙäÖØßÑÐàÍÒàÐÓÚÊÏÓºÉͳÀÆ¥°Ä¥­¿¢«ÂŸª¾˜¥º”�Áž�Ä¢¤Ê«³Ä±ºh_l@822,eC2‹ZK¢aZž^W›[S•VNŽXR�XL’VM�XO‘_ZŒUM“`O“_M—fUœe[¤na§m`´�t¿’�Ë¥�Ò²±Õº²ØÁÀÝÆÈÜÉÉáËËáÒ×áÏÔæÕÚäÕÛãÔÙ̺Ç?8A    +   +  + + + +    +  #    %0$5.7-%0*(&(%''%'!"(%+# &%-&/#(! ''1%%1#$&&/!2:,/7)(2#%4'%0$) " !$! !$ )'4$(0$+-#EFDKKC8A-(0'2!"+&(!)'0'-&)!$##/!*8&,8(-9&*7&+5%VYBš”’–”–OPF4CC[jl¯µ¿·±Á¶¬¾·¤­­œ§¬—¥­›ªµ�®°›¬·ª·Â·ÅǹÄÈÁÔÏÈÔÏË×ÓÌØ×ÐÚÖÐÜÔÐÜÖÓÚØÓÞÚÑÞÛÒÝÜÖàÙÔßÞÖßáÚáßÙãâÚãáÛäâØâÞÖåÜÏÜÕÅÒÔÉÑÔÊØÔÉ×ÔÉØÐÇÖÑÆÔÔÆÐ×ÉÌÕÊÑÕÊÖÖÊÖÚÉÙÙÏÖÚÍØÚÑÚÝÐÖàÓÙßÓÞá×ÝãÖÜßÕÜãÙÞáØÛãØßàÑÛÝÑØàÏÖáÑØàÕÛå×ÜæÛâæÝäêßåèÞçèâçêàçèâçêäêéåêèäéëâèèáèæÛãâÑ×È�˜Ë¡ŸÐ¥žÑ¯¬ØÁÀØ¿ÁÚÁÃÙ¿¾Ù½¾Öµ¯Ó¯±Ó¬°ØÂÂÞÌÕÜÇÔÖÁÄÝËÕÞÎØÚÆÓȰ¾Ã¥­Áž®Â¢±¾™¥·‡�¼�“¾�¡Ä£¥Æ®µ²�ª@4,60#C4"’`S¢`U›\P”UP”SG”VQš[T—^]’\Y‘WT�XT’YU”\V�e]—\Sžic®yg½�…ÙŽÌ­©Ï¯²Ù¾¸ÜÈËÝÊÎàÌËâÔÖàÐÖâÓØæØÛäÙÞâÓÖɸÀ“…–!" #   + +  +   + + + + + +     +    &   ,"/).(-(& &'')'&"#&.%.",! ")$-'/".#&##3&'5()7&()!..9+7>05;+2;()9)+8*(5+# !"#$ +$0 &1"*/#JHDTOC-0:(3:$.8#.<)-8)*:,"/'' #!)&#%&$ ",'0 +2'KJENOH:C22?++7'!+$.(0*2)7"+8&+6'%. *!/ (3 '0".#,$,KQ@Ÿž£±­µ·¶Ê·«¿´¤´§’£§ˆ�©‹•«“œ¬“£®˜¨·¥°ÉÂÑÏÈÙÏË×ÐÉÛÏÉÔÒÉØÒÉÙÏÈÚÓÊ×ÒËÖÓÊØÒÍÔÒÊÓÖÉÓÓÊÕÙÏÚÙÐÝÚÒÙÚÑÜÙÓÛÙÒÞÕÉÛÑÈÙÑÅÒÎÄÕÑÃÒÑÄÐÒÆÒÍÀÍÌ»Ê˸ÆÈ´ÄÊ·ÁѽÈÑ¿ÈÐÁÌÑÁÎÑÆÓÓÂÆÕÅÐÖÇÓÚËÑÝÎÕÜËÕÚÌÖÞÌÔÞÍÖÝÎÕàÈËÞÆÐãÊÍåÌËãÍËåÓ×èÕÛäØÜçÛÞèÚâèÝàéÝäêàèèáçéÞçèßãêäåéäæéäêëåëìåéìãêêåèßËÒÈ“Ž¿‰‰Å–•É¥¨Í©©Ù½»ÜÆÆÞÈÌãÒÕæÔÙäÓÚÞËÍÚÃÉÙÆËàÒÙåÖÞäÚßæÙâæÙÞæ×ÚáÍØÙ½ÁÖ¼ÁȦ­º�”¹’™¸�‹º‘•½“™µ�žIC9,/.1�[Iœ\U›VQšWGŸYT’QJ�QH�QI’WK‹UG�VR�WO“b^•^XŸh_§ob­vp»‰|Å��˧˜Õ³°×»¿ØÂÀÝÈÌâÎÑàÐÔáÌÑáÐÑãÔÚæØÝáÓÒÝÆÆÀ¦©?•IB–K;šPB•RH’QL—UN™YR›^Rœ_Ržf`£md¡i\®xp¶‚~¾�ŒÄ—–Æ §Ì¥«Ñ¯ªÚ½¸ÚÀ¿ÞÃÆâÈÊàÊÏåÒÖäÒÓåÓÏçÕ×âÓØäÓÙ×ÀÊ—mx1)  +%*!    !     $$!")$$ */%("  %"($&"!!%%$%"+'2 #+#+$& *#( (# "&$!&(#/ /!$" %&)&?B>@C>(. )$0"/%3$&9''3!&5 &7%(8"(7 *5!;J6kzy�•œ¡’£–xƒ˜{‚›…�—|Œ™~Šœ†�³ª¼¿½ÊÃÁÒ»´Â¸¯»»®Áº¯½¿°À¾®¼½­¼¼®³¿¯ÀÀ¬¹Â³¿Â±¾½«¸½¬¼Â·ÂƸÈÁ³ÆÁ°»¿¨»¾¬»ºªº¶¡µµ¡³±“›¯�™°‘›¥ˆ“¨…”¨„‰§‡•©Ž›±’–º¢®¼žª½—£¿¤©Â©´Å¯·Ä°ºÅ°ºÄ¬´Ç­´Å­¶Äª®¼“›´ƒ‡´‚‰¾�‹¾�޽��¿‘‘Ã�‹À”™Æš˜ËžšÇœ“Ï¢›Ò¬¦Ô´­Ø³¶Ú½¶ÛÂ½ßÆÅàÉÊäÌÌäÌÏäÕÙç××êÚÞèÙÝêÜÝçßâæÖÛåÒÖåÍÏâÉÌàÈÌáÎÎåÓ×çÖÜèØÝäÏÒâËÒÚÅÈÚ¾ÁÙ¹»Ú¹·Ú¼¾Û½ÁÚ¿ÂÝÄËÝÄÉÜÿàÄÆâÌÌܼ»ÝÆËßÊÌåÓÔêÜãëÞãëÞáëàåéÝäêßâèÞáåÖÞոðy‚®yv¦kq°xvµŠŽ¦†�`=2†I>’KG•MI˜RA•QI“PD•TI \Sœ[RœaX f_¡ha¢mg­rh±|q¹‡}–“Ú›Ç�šÎ§¦×º³Û¾·ÞÅÃàÆÌßÇÍãÏÏåÒÕæÑÒæÓØåÓ×äÑØÜÈÒ¨ˆ—;%7   !+!/% !      +  !!()'#4:026)''"&%-,++')#,$,+0!,'!()!+  !&" $#"   #%!CFFFKL%.#%'$%)!,%1 )6'*5 (2!0<(�‹‹¡Žžš…•—z�“t}•y‹’uƒ–x‚¡Œœ»¶ÅÁ»Ì¾·Ë´§»·«¾³ª¸·«½µ©¸° ´¸£´·¨³º¨´»¬½¼«º»ª¹»ª¼º­¿¾¬¾À³Â¾ª·»§»³Ÿ«·¤²³›¥Ÿƒ˜¨Š™¨Œ›ª‹–­Šš®�Ÿ­��¯”�­”¥°”¢¶™§¸™¨½£¯À¦®ÁªµÇ²ÂDz¿Éµ¾È¶¾É°½Ç®¶Á§´¹™§¸›¢ÃŸ¥¼£®¡’•μÆÓÀÈÒ»ÂÍ·½Íª°Ê¥«Ì°¯Ï®¯Ï°´Ó²µÓ³µÑ·¹Õ·¶Ù½ÀÙ¿ÅÞÆËáÇÉàÊÍáÍÑãÏÔäÐÖèÖÙçÖÛé×ßèÜàèÛâêÜàèØßäÒ׿ÑÓÜÅÇÙ¸¹Ý¼¿åÌÍçÙÝèÚàãÒÙÙ½½Ø¶³Ö´±Ó±°Ô³´×º¾Ô³³Ñ³·Ö¹¸Ü¼»Ü¾¾Û½½Õ´±Ó¯¨âÌÊèÕÜêÖÛçØÚéÙÞèÙÞéÜÞèÙßçÖÜãÓÙÓ¬¹»……«ruœ\`—Z[°|€˜r|oILŠD;�E?ŽH@—SO’VN“WQ•WO•WM“XHœZQ¤jf¥kh®xp³yh¸€n¿’…¿Ž‰Á’‡É™�Я¨Õ³­Ú¾¶àÈÊÞÃÅàÇÈâÍÉåÍÏäÐÑäÑÐæÓÕàÏÓä°vUe    ""#MRQ!/#1!#/ & '!!    '(6+)5%%5;133(%"" #%&%$!&. ). )+&,#+%3+6!%+(#!+(1 &-)!(%!$#"'& "  %"FKMFJL'-$!  #& +(2"Ub\„Œ‘˜‚�Žo€�s~Œm{�r‚�q�–~Š´±Ã»¶Ê½²Â­¤¸²¦´¯¡¯°¢´¬Ÿ¯°£®° ²° ²°›ª²¢²² ®·§·¶ °± ®´¥º·¨·¸¨¶º¦¹³¤±²œ­­�°¤�¢¢‡—¤ˆ›«‹¢®–§²™¤³“©°•¦²“Ÿ®�¨¯� ¶–§¹ž­½¢«Áª¸Â²¹Ã±¾Ã«µÆ³ÂÆ´ÄʶÆÌ¶Ãʵ¼Â¬ºÃ¬¼É¹ÇÐÁÊÒÅÒÓÈÐÙÏÓÛÍØÛÊÔÒºÁÒ»½×ÁÇØÆÎÞÆÉÚÄÉÚÅÃØ¿ÅÚÅÆÙº¹ÛÂÇÚÄÉÝÇÇÝÈÇáÎÏâÍÒåÑÕåÔØè×ÛæÔÛè×ÞêÚÞçÛÝëÝâéÝãèÜâéÛââÓÙÜÀÄÚ¼ÀåÓ×êáãìàåêáæêÞàæØÞÞÇËØº»Ø¸²Ò·³Ó±·Ó±¶Ï¨®Ï¨ªÒ­«Ô°³Ð§§ËŸŸÕ¯¥Öª¦Ó¬¢Þ¿ºåÐÔåÔÕéÚÜèÚÝéÙÝçÖÞãÏÕÝÆÉØÁÄ»’ž£dl˜WU©p{¥uxB9�D9�E8–OD�M@�QG�MB’SK”WN—QE˜`T¢j]¥gZ¬wq®xs¸‡€¸€v»†|Ë�•Ч£Ñ¬¦Øµ±àÅÆßÁÁÝÀÂáÉÉáÉÈãÍÍåÒÕæÓ×âÑÒ×Ãʯ•ª  + + [UL§Ÿ¡_^f )!0$0 #  ))   + + +  $2&3$%3#!59(43))'$#))++!#"(#)$%&3()1 '- !+%1&2 )5""-*&"-&1 '1!&,$,'( ) ($'$"#  !HJBJJI)/& "  (!)0<2‰ˆ�—ƒ˜’t��p}�rzŒu‡’tƒ”|‘­¤³¼¹É¼´Ã´¨¹®¢µ¯ ³¯Ÿ­®›­¬›«¯žª±›®¯›¨¯™§µ¤±´ ¬²Ÿ®³¦¸²£´´Ÿµ¸¡¯¸£®²Ÿ«°”œ®—£­•§¢…–ž�’¬�¥¯—¬®™®±™¬´–®·—ª´•§²“¬°™¨¹ ¯À¬½Â­¹Â­»Æ²½Å°Áî¾Æ¶ÇȹÈ˺ÆÎ½ÊË»ÆÅ³ÁʽÌÏÂÏÓÅËÓÇÓÔÆÑ×ÈÎÙÉÒÕÄÌÒ¹ÅÚÉËÙÆÌÚÅÉàÊÉÚÉÌÜÊÎÚÇÑÜËÐÚÀÁãÌÏßÌÐàÌÐãÒÖâÓÔäÏÕãÑÔæ×Úè×Þç×Ýè×ÜéÜàéÝßêÜâëàåëàäëÞçæÙÞàÊÎàÆËçÖÙêÞãêÜâêààìÞàêÞãæ×ÚàÅÆß¼¾Ùµ®Ó¯­Ð©¯Èš™É–�Êœ�Σ¢Í¡˜É�™Æ”–É“’ɘ”Õ­§ãÇÂâÌÌæÕ×éÙÚêÙÝç×ÞæÓØâÐÔãÏÓÙÂÈÄš¦•SR�`Z¥le†ML�A8�F<’MD�KC’PF“QH‘PA–VH›XQ™\R¡i`¦j[«rj¯um±{u¬rfµ~sÉ™�Ñ­­Ò¯°×³®ßÇÇÜÃÄÚ»¹ÞÆ¿ãÍËäÎÓãÐÓåÒ×ãÓÕàÍÒÇ´½&&  £——¼«³qip!(,)$" #%        !/ $.&.#!$&%>:)=9)5+#,',(**$$"! ").<0+7)(6*$,!!, *%)%/(7#%.#+)14?.2?2*9-%/"'3). ,%"$%"##   #NLHMLN.2(%( &$%1%HUJŒ��‡r|†m}ˆs€‡t~‹w€˜‡�«£µ·±ÄºµÊ°¥·¬˜­©™§©˜¥ª•¤­—§¬”¢¬“¤«”¡¯›£°–œ³—ª±œ§¬�ª°›®³›ªµŸ­²ž¬°š¤²�œ¨‡–¦�ž¥Š–žz…©�§¬•¥µ�®´›²µž°µ•¨³–«¸�­µ›®¹¨´·ªº»¨º¼¬»Á«»Ã°¾Ê¸Å˸Ä˽Ç˵ÂɶÁÅ´Â˸ÅʺÂȹÇ̽Â˺ÅÑÀÀнÁλÄÓ¿ÃÚÄËØÃÆØÆÎÚÆÑÜÈÑÛÃÍÙÉÍÛÍÕâÑØÝÒÚÞÒØå×ÜæÖÞã×ßåÚÞæ×ÚèØßåÕÞè×ÝèÚÞçÖÞæÕÛç×ÝëÜÞèÞåëÞãêáæíáçìáæçÜàç×ÚæÒÙçÎÒçÑÎéÑÎëÛÜêÚÝêÚÛëÜÜéÚÞçÔØÝÃÆÙ¹»Ó±±Êž¢Ä��Â�ŽÅ‹ˆÂ’�Ã�…¿„�¸~s·}oÁŠ€Ð¡”Ö®¢Ú¾¿åÐÒæÕØåÕØçÓÙåÓÖåÔÕåרäÕÜÆš§™QI›WPžc`‚<6ˆ?3�I>ˆI:�H;‘KFŽK:•P@Ÿ_Tš[O™[TŸcT›c\¢g_¥gZªk]­q_¾‚wÌ¥¤Ð­°Ø³±Þ¾¹ÞþÝÀÃÞÅÆàÈÇäÐÐåÒÖâÏ×ãÔÚáÍÐÕÁÅ`CX �†|̵·Íº½¤�”#+ +-!$       ''-+-/*4-!7- =2"?0&>, A- <, 6*((#* !$"$$)5%,;1'2&+!,%0 *'$-"0!.%0!'/ (.!+0.4$)3##. &&" JG?HKM)+$!*#/$%."#,%$"")%uy„…w‹‡lzˆtƒ‰v‰“{‹œ�¤¥Ÿ°³¯Á¶¶Çµ±Á«Ÿ´¥–ª¦•ª¦—¦¥“¦¦‘¢¥� ¥‹�¨��£Š˜«�Ÿ¬—¡±›ª¨”£§•¤¨˜©©‘Ÿ®—ž«�˜ªŒšª‰�¢„’¢‡˜¦‰›®”§²™ª³˜§¯”¨®•¦¯”£²“¦±�Ÿ³–¥»£²¹£µ¸¢µ»¤¹½©²Á«·½©±Ä¬µÆ¯¸Å®¹¾ª¸Á¯·Ã¯»Âª¶Á­´Â¨¶ÆªµÄ¦°Ñ¹»ÓÀÄÖÄÇØÇÌÛÊÑÚÈÍÚÈÐÙÇÐÜÈÑÚÏÚÙÌÕÕÊÑÝÒÕáÎÖÞÏÕâÎÔãÓØâÐÚàÏÓâÒ×äÖÛæÖàè×ÚèØÝæÖßç×ÛèÛÝèÜàéÞäìÞåíãæêãèíáåêÛßéÛàëÙÛêÓ×èÏÌèËÈæÒÎé××éרêØÙìÛÝëÜÞåÐÖß¾Àݽ½×®²Ê˜—Ëž˜Ë—™Ä�“Æ“‹½‚…°tx±xxµsiÂ�‡Ëš•Òª§Û·¶àÃÂáÎËéÙÝëÜßêÝâëÞâêÞãæÖÜÅ›©«kq–UP�RR�C@‰>5…B7‡E?‹D;‘NB”QB˜TF–WHœXM¡bT¤g]¥h^ž^S£ji¢g^¸~n¾�|Ö�Ñ©©Ú¿¹ßÅÅâÏÔâËÎâÉÍäÑÖäÓÖãÒ×ãÓÚÜÄÌË«¸U5:ƒZP«€uÍ¡šÙÁÁÛÅÊ̽ÀKGO#$) #"$& %   (+002/3,4,.&:1!=.">*I.!='7$*#$+ #%%#$)/$)5&)3) +'2 *6#$4#'%+ ,)'#)"*&, -/,0$*1$(%!!HEBNJL/.("-&1%)1%#*&&$HXY†q‰ˆs…Œtƒ�~”’�™œ��«¥¸¯«Ã¸¶Çµ¬¾«¥¹ ‘ª¢�££�¡¤Ž¢¦�¥¦�›¡� £ˆŒ§Š‘¤‰“°˜©­—ª«™«ª“¡¨‘�ª•¤¦�£©‘ ªŠ›©‡™¥„�Ÿ‚”¨‘œ­”£«�£«‘ž¬� °”¡°��©‡–©†–°“ ¶ž­µ §·Ÿ±² °µŸ­¶�ª»ž¥» ­Å§²Á¥°¿¥­½ ¯Á¬³¾¦¸Ã§¶Â«´Åª·Æ¯¾Ê°¹ÔÀÆ×ÄÍØÈÌÙÇÉÚÂÊ×ÅÈÚÈÐÜËÒÝÌÒÛÎÔÔ¿ÅØÇÌáÎÏÞÉÍÜÈÎâËÐÞÇÐÜÃÈáËÐáÐÔãÓØæÖÝæÖÛçØÞåÒÙæÖÜè×ÜèÛáéÜãìÜãíáæëãéëßäèÚÝêØÜìÛÞíÛÝêÚÚëÙÚêÖØéÔÕéÕÒêÙÙëÙÜëÛÝè×Úß¿ÂÖ®³Õ«ªÑ¡¢Ó¤ŸÕ¦¥ÉŸ£È–“ÁŒ‡®uv¯ww¸~p½„‚¿‰…ͤ Ù¸¶Ý¾¸áÇÃêÙßìÞáéÛÞìÞàëßàæÚÞßÊÔÔ´½§ji—YZ�GB…@6†C?ƒA8ˆ@8�LG”RK–QE’QA—VJ¡_UžbX aU›\T¤h^§mb²vq¹ƒ}¼‚uÐ¥¢Øº´ÛÂÀâÊÍäÌËäËÍäÑÑãÒÖäÑÕäÓÜÖµºÇ£¦�_\½‹…Ç—ŽÒ«¡ÞÈÈàÊÏ̺Å\V[#*! )%  ##'*&  $-+!302+..0- &#.. 3,1%9, 8%0!*&&%$*&#"!')#".#'1$$4&*9(-:.'1$$!&&%"%!,") "(%0#(4*&-"""#  + + #!DEBLNP:<2'/").&)3<2]ie‰{‹Œ|“‘{‘žŽ¢¤™®ª¡¶­¥¸±®Ç¶³Ê°£» Ž£ž‰œœ…—�‰™œŒ› ‡œž†›Ÿ„•£‡–Ÿƒ�›w‚Ÿ…– ”¥ŸŒ¥¡Œ¢¤ŒŸ¡�¤£‰˜¢‡“¥ˆ–¨ˆ” ƒ��…–§‹œ¤‡�£ŠŸ¦†–¤‹¤z„žu|¡u€¢|„§�™¨”¨­”¤­‘›±š¥¯• ±�𱔤¸•£¼˜¡·™£·�ª¸�§º› ¸›¢º�­Äª³Æ¯·Ê¶¼Îº¿Ï¼Âй¾Õ»½Ó¸ÀÓ¸ÅмÆÓÁÈÕÀÃ×ÁËÖ½ÇֽſŸ Ì³®Ö´¸Ù¿ÄØ»ÂÖµºÖ¸ºÚÀ¿ÝÃÈáÊÏäÏÕäÒÛäÏÙäÍÒáÍÑåÑÕçÖÜçÛãèÜãëÝáêßâëÛßçÓÙæÎÎéÑÑêÓÕì×ÙíÝÙïÛÜïÞàëÙÛìÕÕêÚÛíÝãíààìáãêÕÞäÔÙâÃÎâÃÅáÄÆàÄÆÙ³³Õ¬­ÍŸšÂŒŠÂ‹ŒÅ•�Ș™È–“Ó²¯áÈÆãÈÈæÑÐêÙÚéÙÝéÖØì×ÓéÖÒëØÚèÚáé×ÜãËÍÄ—œ±x€‡BC…A5…?3†?6‰F<“LDšQF—L>–PB˜THšYR¡]S™WJ›\T¡aP¯vp±yxµ|Æ“ˆÓ¬¥×µ±ÞÄÅâËÇäÌËäÎÕåÑÔåÎÒæØÛæÐÕÝÃÊÓ¨¤Ð¢�×±­ßÄÂàÎÓáÓÔÜÎÓ�—¨FOQ$($$' ,$%"/ %   '%/)1./.',17"-7$%)(%%!0(1' '!!"* *&# !!#.%$0&,"& "!&(!*! *")!$)1:(/8&+2#%!  "& #?@>MLN9=7"-$,!AJAЉ–”ˆ—›‹œ¡—¡¢—ª© ³®¥½´¥º±®Â°£¿§œ·™ˆ š„’˜„’š€Œš�”˜Š˜�”š���~‹–z€‘ks—x›‹–š†™™…—œ„–£‡–¢„Ž¥…‘�~„¢Ž�‘�ƒ— …—¢„•›x„™o{—qušouœqu™t…™sžv~¥ˆ•©‹›¦ŽŸ¥Š”­Œ’ªŽš®�—³–¦²—¢¯�–®Š˜°Ž™¬ˆ�³‹—µ•›½ž¨¼ žÃ©§Ç«µÇª°É©«È¥©Å©²Æ©´É°²Ì²»Ê®´È§¢É¦ªÇ¦¬Ê§®É¡¦Ê £Ð­²Î¢©Ë ¥Ð§­Ó³¸ÖºÁÝÄÅÞÈÎßÍËàÍ×ÛÁËÚÃÇãÈÐäÏÑäÑÑåÓØæØÙèÕÛçØÜçÍÑäÆÊἻ忶æÅÂêÏÌëÕÏí×ÔíÛÜìØÙìÒÓîÝäîßçíââíãæïàãíáäëÝáíÜàêÞàêÚßêØØçÓÕâÂÀÞÁÄÜ¿ÂÙµ´Ô¨£Ú¶®åÎËäÊÆåÊÊæÒÑèÓÔèÎÍæÐÍéÖÔèÖÓëÙÙêÙÙìÝÚèÙÛåÕÖáÌÌ®w‚@7€<3ˆA:‚;-ƒ>3“J>˜OE‘LE•PM™UH–SE•SG™XSœ[X¡_X°wn´xp‰�Î¥œÓ®¬Ø··ÞÆÇáËÌåÒ×åÖÕæÕÜçÜáêÝäèÜääÏÕØ±®Ú¶·ãÍÌæ×ÜåÙáàÖÞ¹¨±€x~)/#'&!'+#3$"3 "/#/)&!"!)--$ "(!/$0$' ##'&)"&')6='1='!#%"# +).+'$"''$%&"-"*    & '!(!#, $% $)*49,38(.4(#+ (!"""!!"#!;<9MIL582)"*/)r|ƒš�¢›‰¡£–¤£œ°¥™³« ³²¬¼¶®Â¯«½¥—­›�§‘€•˜‰—‚�—ޛЖ{ƒ–~•���™z…”ou“q{˜~Œ–„•’‚—�”›‚�£‡‘ž�… ƒ�•w†—~Œ �’š|Ž™z‹šs�it’hr“jr™nm™ns’m�—nz–qy¤‰”¡Šž£ˆ”¨Š“­�’®�™³�™ª�Ÿ¬Š“ªƒ•©ƒ‘¬ƒ‘¯…�´‘ž´”™¼Ÿ¨º“Š»›“á¡Â ¢ÂžŸÃ¡§Ã§¯Â«²Ã¥ªÄž¢Ä�¥Âš›ÂšœÄ�¡ÉššÉ�šÇš�ͤ§É™ŸÈ›£ÌŸ¢Ó±·Ø¹ÄÜÁÄßÇÎáÊÌßÉÔÙ»ÅÙÂÈ߯ÌãÍÐãÍÍãÐÔâÓÖçÓÚçÖÛàÂÆÞ¹¼Ü²¬ßµ«âº³èÌÃêÔÎëÒÍëÙÙìÐÏéÑÒíÝàðáåíáæìäèðâãïâåîáæîßæìßãïÞâîßâëÚáçÐÑáÅÉàÃÇܸ¹Ù·¹ßÄÃäËÇãÈÂá¾¾âÁ¹ãÀÂṳུçÒÌèÖÒçØÖéÙØëÚÙëÚÛæ×ÚçÔ×Ϫ¶„>8„<:„@5‚9-‚:/ˆA6’I=ŽG<—NJ—QE˜SD‘OAž[U�]\ [Q®sh±uq¸}oË›™Ñ¨¥×µ¸ÞþàÉÈäÒ×ã×ÛèØáçÜáëÝäéÝãç×àáÊÎàÁÂáËÊå×ÛæÜáÝÓÙ»­¹†}€-7+' '!(&4"%5#%6%#/,)&%$"#$#).!!0")!&$!5",<$)7&$,' )&#%(14 2=&   */)/,(#%!"("""$$!$%%$ "!#&,$8.4/ 22'$(&"%"%"!82*?7940/:EDs}š�¦ ”¨¦—³¡–­£�µª¤¹¯®À¶¯Ä³§À£—¯–‘“}Ž�y’“}‘�yŒ�w‹�x„“t}�vˆ’np�in‚dj‰u|�y„–}�”w„•|„™{‰•u”q~‘r{‘t‡”u†‘o{’gsŽcm�hr‹_j�bl�gu’js’hm”ms–ny–nrœwxŸ~ާ…Œ¨‡‘«‡�©ˆŽª�Œ¤{…ª�…«{�«~‡¬‚‰¯ˆ�¶’š²�œ³Œ‡¹‰ˆ¸‹�º�Ž·‹Œ¸��²‡ˆ¶†‡²�„µ…ƒ¸ŠŠ¸ˆ�ºŽˆ¿�ˆÂ‘�Å�—À††Áދʼn‹ÁŠ‘ÀŠ�É�›Ó°±Ô³¶Ü½ÀÞÇÌÝÉÎÚ»ÈÕ´»×¶¶Ü½¼Ú½ÀßÁÄãÊÎâËÐæÌÎäÍÓÚµºÙ±±Ô¡™ØŸ’Ú£”ẲçÌÆêÌËéÏÐæÈÃä¿»åÇÇê×ÚëÚÜìäçïâäîâæíäçðáçíâçîáåíãçîãæîÝâéÔÜåËÏݼ¿âÆÉãÉÌåÍËåÎÍçÎËçÑÎêÕÕêÑÑåÄÃâ¾²ä¸åÎÎæÑÎéÔÒêÚÛèÛÜèÖÙåÑÑ·}‰�DCv1)|3'}4(„91ŽB3“F<�G<�H>—PC–MAžWI�]U£eY¤d\¥g]·|wÈ–“Φ¥Õ³±Ù¼»ÞÅÊäÐØçÚßéÚáèÞåéÜáèÛÞéÜâèÜßçÛàçÚÞæÛáæÛâÖÉÒ„}€``\7C20>0(5) $,#6'(6%):("1%7#)8&"1.-%'*'+,*+,"4%,>(/@/'8! .)$"(%0/41‹A8ŽC7ŽG8’I=“MA—TL˜VL�^Q¢cY£e\²viÈš’ËŸ¡Ô±³Ø»¸Û»âÍÎçÖÚèÙÜëßäîàæëÞæêÚáéÜÞèÞâìàçæÞàæÝãÜÔÚ]ZYFI:8G+6D4/=.(& .2@/0@.)9&&3",8#.=&&7"&8%':"$3)#+#)&((- 1');/(9*&3$('*&' &* 0,7;%%)&+!#)"(,!04,/2+!$%( &$0% #!"!##"/%2,60!4.#*%('!!")!%"%"$ '".,$>5,x|š�¨��¨£”¬¢”ª¥›¬ªœ³¬¨¾«ž¸« ´�Œ¢”‡˜‹r‚�s‚Šq~…pqŒs€“q}�ou�n|Žk|‰^d†WZƒbg�x‡�p‹k{‘lqŽlr“px�mz‹exŠguˆlyˆdo†`mˆ^lŠ_g‹^^Žfd’mv�np‹qw�kr–o{Žks”lxœ|„�ƒŒ¢‚�¢ƒ‹§ƒ‹¢|~£|‚£v€ t{ rw¤uw¥y~¦|}©ty©roªtn§mm¥g_¤dY¤g^§rv¬ur³�‚´†…·„ˆ¸€µ‚†³z{±rq¶vvµxv·xp´up´tm´|zÂ��Ä–™ÉœœÔ¯²Ó³¸Ö³·Ò§ªË�žÊ žÒ¨¤Ó¬¬Ö¬¬Ö«¯×«£Õª¦Ø³§Ý¼¹åÎÒäÍÎݽÀÙ±§à¾¶åÁÀéÎÌéÔÐêÕÒíÝÝìáâëÜÜéÒÑéÒÐê×ÙëÚÚîáãíãçîãèïâäíâåïáàïâæíâäíÞâêÕÛåÊÓÛ®¨Û±¯Û´®ãÄÇçÍÎãÍÍèÐÒéÒÒéÓÓê××íÜ×ìÚÛëרæÍÍçÇÈèÐÓéÚàíÛÚçÖØãÐÕÕ¶¸V5/q0&u-#€4.„9,‰<1�D5ŠB6‹A2�J=˜UF”UG˜YJ a[¢bY­oeÇ™�Ì¢žÕ¯³Ú¾¼ÜÿâÉÈæ×ÜçÕÚéÝâíÞãëßãêÚáçÙÜèÜáëàçéÞãèÝäãÚànhm=C56D.8E20=3&&"/ 0?.5H8-@.(8!(5 )9''3!'9%*<)(3!*%'(")-&2$!0#'""%!($($,'7:"(,#!$'12*23'$+# ##'$-%"  '-!0*#'!!!("++.4',/'.-#'& -)!0(;<.6:0'*# '!&/0-46)34(44#!23)ceb—�¦›�£›�§Ÿ�¤¥š®« ·«Ÿ´¡“®¢œ±œ‹ž�xˆ‡ox‡o‚im‹kuˆix‹kn‰jsƒho„[d„XUyLL�^g‰mt„lyŒltŠgxŒir‰jt‡gq„`h…bh…coXd…[b€]g‰_h‰di�hq”q|™w‚–uŠ–x†’w�’w‰�wŠ–|„ž€Œ¦‡�£}†¢|‡žw}›uzŸx{žlqœjq¡mmŸmt¡mm£nn�]Zž[Qž\S¢hc­on­sn®yu²�z³ƒ´…‡´‚|´�¸„ˆ½ƒ}¶ts­gg¸x{³vwµ|¯om²yz¿…Á��Õ�É›’̘�Íš“Ï –Å�ŠÅ�”Ë—–Φ¤Ò«©Ö¯µÓ­¯Õ®¯Óª§Ù½¾àÆÊãÒÓæÖÛåÕÚãÎÐåÐÓèÓÚèÕØêÛÝéÙÜìàãìÞßíÝßéÚÛíÛÞíÜßêÜÝîàâîàáïáãïâçïáäëØÜîÝâìÜßíÛßêÚÞéØÝåÍÈáÃÀáÄÅáÊÊçÏÍæÍÏãËÏæÊÍæÎÑçÔÔìÛ×íÝÞìÛÛíÚØíÚÜëÎÐçÕÖëØÔèÙÖèØÛåÕØ“oy`3(s.%x/&€4'ƒ7*ˆ?0�A1‹B6“MG•OF–QEœVQšZMŸ\S¬tjÁ‡uÇ™‹Ð¬¬ÙÁ¾ÞÅÄáÇÌãÎÑäÏÓåÕÜêÙÜéÛßêÛâêÚÞæÚÙìÝâéßåéÞâçÝ⹫·]XW'6%,8-$1&%'*,=./=-0C,&7%#1!. /"2!"0,! &# %"# %&&+3 $ $"0*"20%*.'!)$.+2)#-&*! /%;,;/ *.!'1*!.)&(&$%&#+14(2+%*"(-#=;/NF8QL?691 %%25+645336$()"!y„‘ˆ—š†™�‘¡�’¨«Ÿµ¬¤¿©šµœŠœ›–¬—‹ ‹s„„fr�fr‚hw„gw‚co‡`l…dfƒ[^XZ}JJsFAtPT…nz‡n|‚dj…eq†emŽhlŒgk‰cf€Yb{X\vUXwVX‚`i‡fg‘pr–y†˜~Žœ�…¢…•¡†š¤‹˜žˆ“Ÿ€Œ›w…�€ŒŸƒ�¢„¤{ƒžz�Ÿtu•acŽV]‹QM›ki›he™fc¡^ZšRM�VM¥d]©noªtq¯ur°zt¯~{´†Š³ƒ…·Š‰¹Ž�¸Œ“»‰‘²xs±qk´xpµyw³su³z{µxp³zo»~s¾ˆy¿ŒƒÂˆ|Å�‹Å�ƒÊ› Ç•”Ç“•Ê�¤Ï¥ªÏ§ªÓ§¤Ò¢�Ò¡¥Ö®°ÜÈÎâËÒäÐÔåÕÙåÒÑåÓÕèÔÒéÓÓèÕ×êÚÝêÙÞêÙÛêØÙêרêÖÙîÛÞíÜÞìßÞíÜàìÜÛîáàñßàìÜÞëÖÙìÚÛìØÚëÛÝìÙÜëÙÚéÓ×çÕ×éÖÙéÙÛìÜáëÜàêÚÞÝ·¹Ýµ´åÉÁéÕÓêÖÖêÕØêרíÙÛì×ÚëÛÛëÛÝéÙ׿ÔÓçØÖÌ´½;2#G-v+"w,"x-"‰;-ŒC1Š?.�G9‘H8�K>–VP—OCšUF­h\¼€uÀŠ|Ò¨¥Ù¹¸ÛÀÃÜ»ºÝÀ½àÄÅãÌÏçÒØé×ÚéÙÝëÛàêÜÞéÚàéÝáêÝáéÜÝÙÐÙ’„“%1".% +#*!-"-%%7'/;%1>'.B0()$2%4$",')&!  !* 1)02 #%+#/+)-$$*!$+"*1$'6)#-'!,(:-!8.!+2$)6-'5**#%(# +!+!'#* #*&1"6@45@6.:3)2)$,!+5*DJCXSHVQD;86!##-2-+,*-.+$($!4<:’Œœ›‡œš‡š¡’¤¤›³ª¢¶§“²œˆ¦œ�¤“„Ÿ‘}‘ƒlx‚dp�em�fq‡jt…frƒdi‡]g�UZvLMuCBk>=|_g„mvƒjuƒcm‰fn‹fkŽio†][�Y\~X\wTavSXyZ\‰gt‰lx“x…™}�š„ŽŸˆ˜¢Šž£�¡£‹œž~�™t„šz�ž}„�‚Œ¡z‚¡uzžv}–ab‰QS‰NJŽPL›gfœgdžb]šQD�SI§`Sªog¯sq¯|~´z´ƒw±…‹¹‡‰»�‘¼Ž�º�Œº’™¹‰�´vy±pjµyrµ|z²}~°to·zy±vn´xi»€{º…‚‡vljÁ‡Å�ŒÄ‘”Ç•–Ê£«Ñ©¯Òª¯Ñ©¥Ï¡šÑ¡¢Õ¯¯ÞÆÌãÉÏãÐÒäÒÚãÑÕäÑÑæÐÎçÒÐçÑÕè××èÔÙéÕÔèÕÓê×ÔéÕØíÙÝíÛÜëÛÞîÜÜìÚ×îßÝðßáïÛÛêÔ×êÕÕéÔÔìÖØëØÛëרêÔÕèÎÏæÊÈèÒÎèÖ×ë×ÚìÕÕß½¾Ú¯ªâÄ¿çÎÎèÑÏçÕÔçÓÖéÕ×ì×ÚêÙÚêØÙèÙ׿×׿×ÚØÅÌB:0;.s/#y-!|-%†5)�@4‘A5�C6“G<“QF•SK—SL™SF©k^À‰€ÀŠ{Τ¡×¸¶Û¹º×µ¼Ù·´Ü¹»ÝÆÉèÍÊæÒÓçÙÜéÚÞêÙÜéØÝéÜßéÜàéÜáàÕÛ©š§)1# + /# 1! .",/ '6$+;'+=-((!0 %8,#/"(&%!  ",;)21!!"' '(.")4((2*#,."+2$-7()5*)5**! ,#'.%%2&$/'#1+(4'+9%2@/4@35A33A.,9-4=-8G>L[KP[RBJB,4-#% )!(! %$$ .4.‡‚�“ƒ˜”‚–£—«¦š´§œ°•œ•~’”…š�x‹‰wŠ‚jy€cn�bjƒ^e�`d�ag]f~]`wJFtC>k;9m?AqNQ�iy…dvƒcl}bj‡ckŒai†\h‚Z[}VXySY�]e„amŠn�“�“œ…’¡‡�™‡“¤�¢®–¨£ŽŸžˆ•œ‚‡—v€—wšvž{�–t|’pv‘[VŽSNC=}A9{?9“hfŸlh¤jg¤g^©jd­ur±µŠ†·ŠŠ¶�ˆ¼��»“�µŽŒ»”šº’”ºŠ‹¼�”¼�”·‚†·x|µ~¸„ƒ³‚„³€�ªnn¬mg¯pcµsm·xv½„y¿‹„ÀŽ�¿��À�•ÊžœÎ«ªÐ¬³Ö±³Õ²·Ï £Ë™šË—•Ù»»ßÃÉâÇÍåÓÖäÒÖåÍÒäÉÊäÊÉåÊÈèÏÏåÏÐéÐÏéÑÐçÒÓéÓÓèÑÒí×ÝîÛÚìÚØìÚÛìÚÚìÚÜðÜßíÙÜîÕÖèÓÓèÒÒéÒÓèÑÒèÑÖæÈÃäÁ¿ãÁ¼âÃÀåûåżçÊÎåÉÅཽݷ­ãÆÆåÊÍèÍÉçÎÎéÏÍæÊÌéÖÕì××èÛÛæÖÓåÓØáÊÍmTQ+%L/ q)t(!‚0$‰:/‹@4�@1�D5�I?�PJ˜XNž\S¡`R°wm³xoÀ‘�Ï¢šÓ¯¯Õ®­Ø¶¶Ú·µÛ½½ÞÀÁäÇÊèÔ׿ÐÔèÒÓéÔØéÛÜèÛßéÙàåÙàÓÆÑ8>0'5*%9-!2! *!%!(/&2%'*"4%*=2%6.)!() #"'4 >&;.""!! ""!*#$2'& '*!!, %/##-! )"(#%'# *%".)%."4>-4>-3=)2>.09**8-0A6COAFUE9C3-7*)%'$0$!+$$* $0'ESO~ˆ‹€“—Œ£¥›±¨ ·œŠ ”x‹�w…™‡”“€�ƒlvfryej}bd~^g|`h\_�W[yTWtHNn:7i:6i=:tTW€em}er{au_f€_cˆeq…akƒ\iyPXxRT�eu�v‡•†˜™Œž£Š¡›† ¨—¤¥�Ÿ£Ž ¡‡•£ˆ”Ÿ…’š{~Ÿv{œxy™nv’iq‹do‰ZYŠPL‡MGˆNTŠXY˜jmª‚²Ž”´�–µŠ�¹Ž–¶��ºŽŽ½˜“¼•‘¼™š½™›¹Ž‘º–™¾”œ¾›�¼’—¼‘”¹ŽŒ»“˜¾•™»‘˜µ‡Ž±�ˆ¬z{«sn©lb®ws³~x¾�‘À�ŠÆ•”Ç–”Æ—šË¦¦Ï¬±Ó°°Ó±¶Ð«µÑ¦«È��À�|Ê�–ظµÛÄÄßÇÏáÐÕâËÎÝ¿¾Þ¸µá¾¹ä¿·àÁ¿åËÅåÉÃ寯äÉÈæÈÊæËÏêÒÔëÓÕéÔÒéÈÅêÍÈíÔÌïÛÞîÚÜëÖÕéÌÌèËÄçÊÈèÌÍèÎËéÍÊåÄÆåÿãÿåºäÃÁäÅÇåÆÄãÄÁÝ»´Ù°ªÛ¯¨Ú¬¦ß¶°åÈÁêÑÍêÓÖêÕÐèØÛéÔØæÔØâÈÇ–kl1$e.$t+%�.%†7-Š;1Ž?8�E8ŽG:‘OG’SF™VL¡_R¦igªhe·sÂ’‹Ì¢ Ì ™Ðª¡Ó­¬Ú¸¼Ý¹¼Ý»½çÈÌåÉÊæÍËçÎÏçÔÕêØÔç×ÛåÕÙãÕÜ_]Z-;*(4#* #(#1$4$/!(6(%3%".!)!*!0#-''! + "/: =6=)9."##("& ' ,&&(!*! )"$.!* *#'%&!)!!,!,8(.7-(4%+7'(1!%/$-8(:G8AOC4:.(0%+(*#-!*% ,$%-#p{��‚“’�’¨ µ¨ ¹£™¬�y�ŽsˆŠ|‰•�–Šr‡}gn|cr~^c}]`^f�^hƒ[_~VU{QPmC@pA=qDBlD@~cj€dq{[h{]l{\a�af‰dj‰^b}VdxSX~`k‰q‡•ƒ™—…—���ŸŒŸŸ�§¥ŽŸ����‹¢‚‘¡„�¥~Š›u}›t}›sy—ot“hiŽ`fŠ\aŽXY�de™mwœt~¥}„­‹‰´Œ“´‘–·�”¼’š¹’’¼–™¼™—º––º—œ¾•”¶‡ƒÀ—™Â—œÀœ¡¾•—»”•½““½•–¼”’¼‘’³†�«}‚¨uxªwn®xm³zz¼Ž‹À”—Å•–Çœ—Êž É£©Ì¯¯Ñ¬¯Ñ¯®Ð­³Ð¦±Ì ¤¿€z¿€wÌŸ•Õ´°ÜÄÈßÇÎáÍÐßÄÊÙºµÚ¯ŸÝµ¦â½³ãÀ¼äŽ㿹ãÁ¿ãÅÄäÇÅåÉÉêÏÍêÑÑèÎËèÅÂçÈÇìÒÌïÙÚíØÝêÔÖæÊÇçÉÄæÈÅèÈÌçÊÈèÎÍæÆÉåÈÃàÁ½ä¹äúãÆÈåýäÃÀÞ¹¬Ù°ª×¥›È�mÖ¤“âÀ»êÏÉèÕ×êÕÐéÙØèÔÙæÐÖãÌ˯�~F4/V0!m*z,&„2'…7+‘D8�?,ŒE2‘KB�MA“PIŸ^S¦fe¥`]³um¾‹…Æ•�Éš‘Ì£�Ôª¤Ù´¶Þ»½ß»¿ãÄÇåÅÁåÈÇæÌÌåÓÐéÕÓèÖÙèÙÞä×Ü~tv4D*/9(-!"(&7 '8&$6%+<."2& /!#+$0!"1"#1*+$&  !" 3!>#;,5(2, %-#$*$$$$ $ (-8.+3*&&+! "!#&' "$$$ ,"+7*'1$$-#!0$$/"%, ) )"#+OZQ���‚’¤ °¤–©›‹¢�|‘„l{‹qƒ”zŒŠp|„iw�\aƒ_k[h]`}[`~\bVQ~HDwEC|KNrKPqGLtVYt\lv\cz[ZYb}[_‚]e�^b„Yg„\d‚p‘{�™‡ž™‡™—Š™—�žžŠš�€�šy…™|‰—}ˆ—y‡™uzœy†˜vx—sv–qv—ow™pyœuzœsy¡{…¤€‘¨ˆ”­��¯‰Ž²„ƒ¯‰�µŽ‘³‹—´Œ‹³‹‹µ‹‰¸‘’¶‘—¼˜Ÿ·‚Œ·‰„¾•œ½›¥¼šžº�—¼–�»“˜½™›¾›¡¼–�³ŠŒ²„‚·Š�µŒŠ¾�‘¾‘“Ę—ÊŸ¤Ë¤¨Ê¡¥Ì¥©È§¬É¡ŸÍ¦ªÏª±Ïª²Ê—‘À…{´mgÀ‘ˆÏªªÔ²±Ø¾ÁÝÁÄáÉËÚ¹¼Ö­¯Ö©–Û³«á¾¸á¿ºÝ·µÜ¯¬Ú¶°Ü¹±à»·á¿ãÂÀçÈÅåÌÆëÓÍêÑÍêÒÎëÑÑèÇÄäþäÆÂäÅÆåÈÉçÇÅåÅÀåÅÁäÄÀã¿Áܵ³àºµá½²á¿¾Ô ¢Ï�‚ɇ|ʃtÄzeȆmÙ¬Ÿá¿´ã½ÀäËÉçÐÎéÕÖéÕÖçÔÑãÉÉб®�oq"&,%N(|)�3'ƒ2&‡9+‹=3�B;’KA�I9�MC‘PDŸ_X ][©f\¶yx¹}{¾Š€È™”Í¡¢Ôª¤Ý¹¼Þ¹¼Þ»µà¾¾áÂÀçÌËäÒÒæÓ×åÕÔçÙßéÛᯟª:@--5'"+("-&8+*6"&33F?,=8)5($.#(6,"3%+#')!!"0**! #/5,%(! !"% ),;0-82! ! "'+!"* ,!* &%.$6C:ƒzŽš�žŸ˜¨›Œ¡“~—�|‘‰k{‰vˆŠu‹‡o}|`i{^h}Yc|V^~T`{V[{T[ƒV]~RWxMNvNVyOVsJOpFGzbuy[euY]xV_ƒ_g]a€_e~Z`~[b�t„“„™˜†›—†˜�ˆ›žˆš–€�š‹š{†˜ˆ‘uƒ“x‚•v~˜s{“pv�s{�o{’r{™}†œ{ˆž}‰Ÿ€‰¥‰“­“›¨Œ�¨„‰ª„‡­…‹¬‰’°Ž�µŒŠ¶�’´�“µ�’³��²”—¶”—³„‚¸”•À™�¿˜—»”›¸�˜¼œ£¾šœ¾Ÿ«¿¢¥½�¦À—˜Ã£ Àœ ¹�‘À’�”ŠÅ™›Çž Ç¢ŸË¤§Èž¤É¤¡Ì©ªÌ§¢Í«®Å“–·rm­cZ¦YLÇ—”Ê¡žÒ®ªÖº¼Û¾ÁßÉÈßÅÃÙÁÂÞÅÃäÐÐæÑÔæÍÑÛµ¸ÓŸ¡×¯°Ø¬¡Û¯¦Ý¶°Þ³®â¸¯âÁ¹éÍÉéÑÌîÙÕëÓÒçÏÎèÊÇäÌÈçÍÉêÒÒêÏÑçÎÌéÌËçÉÃäÆÇÞ¼·ß¸´Ü¶­Ý»º½rm±`OÍ�†ÂvfÀwiÖ§‘Û·µÛ°¨Þ¸°ãÆÄäÉÅäÉÇåÒÒæÓÓäÊÉÜ»¹¾™˜.3)&- 8+u)‚4%„4)„7*‰A7ŠF>‘H>ŒG;‰HA—SE•PG‘MDšZP¦eV©j^´{n¾ˆƒÆ‘‘Т�ׯ±Ù²±á¾Áß¾»á÷åÊÉåÐÔåÑÓæÐÑè×ÙçÛÝʼÃ6;++2%#/&6)",$!$).=.,9,)4')8(':0*7(&1&,6((8+(5&(+"'-!,!#*! ,!(","/6*'(#"#%#' %&"%!!(,90(.) $&% ))"(69.]c`�™¨Ÿ±£•­•„–‘y’Šo�‚h|‰u†ƒh~euz]d|^f|V`vJPwNS{VU‚XT„Y_VX~SXzPXyPYoGLoGKw_m{YcvV_yWe€^l|]a}afƒ`fƒdk�~“•€’—ƒ——„“–�”{†“z„–yš{‡˜}�–t€’t|•x†’nu‹il‘p~Œs€“x‚˜x… €‹�~ƒŸ~‰¨�–¬�”¥……¨€†«…Š®‡‰­ˆ�°‹“³�’±‹‰±Š�±‰�´“”¶•™·•—³�•¹™™Á Ÿ¼”•¶�—µ’˜¼�¢¾ž£¾¡¬Ã¥¨Â¢¦Ä¡¤Æ£¦Â ¢»‘“À‘˜¿‘’Æž ÉŸ˜Í¥¡Í¢¦ÇŸœÈ¢ Å�¡È¥©Ê¤§À‡‹±jb¨\S¦\QÅ–šÈž›Í­¦Õ·¶Ù»½ÝÄÅÜÂÁßÅÄâËÎäÑÔæÏÕçÎÒØ«¯Ðœ›Ô§¤×¦šÙ¬¨Ý³°Ý«œÝ©—ß´­çÅÅéÑÍíÙÖíÒÒçÍÐèÇÂæÉÁæËÅêÑÏêÑÍéÒÎéÎÒéÒÑèÎÏäÆÁܰ§Ù°¨Ì–��C?¶nYÔ�—Å{lÊŠxÙ¬žÝ·µÝ´®ß¼»ãǾåÊÂäÉÄçÑÏçÐÐåÎÓݾɩ¥65&+5$96)v)!ƒ2%‰;/ˆ?3‹=5ŽH@“F;“NDŒH@‘G=“N@’NF–OCŸWN¦fZ±qk»{wˆ„Ì›—Õª¨Ø°­à»½Þ¾·à½ºäÉËäÏÑæÒÓæÎÏçØÙçÚÜÕÈÏ?D606(%2$,=4(4-'&*(9(*:-&3$%1#/(!)#0$#0"%5*(5* (! +$* 2)$0(#!",) ,"*!-&.1#&+$$( $'$) '/#$."#*# '"+):,(3* +"&&#/!%- !( )'*"#( $0, $"& !!'"#'2(4>5UVTvŒ~Š˜‘¤�}’“‚š�}�‚it|\k€ky~hy}gt{Zh~Zf{Y`uIKg32m:�E:’TJ’OI�FA‹B5‹G=ŽMB“ME˜QE¨lj²yq¹|vÂŽƒÑ¢žÒ¡šÜ¶µÝ´¯Ú¶°äÊËâÈÅãÊÊåÌÌêÕØéØÛÞÒÕUNP28+#2#(7)&2(!,!-/ (2" +! - +"&%+%3"+5"".!+ ,)1(+!##/()&* #*"%07*(.%&+!,0)-0%.8-3=**7.&1&+9,6C99E5-/*%)"%%1%'-$", -3$1<.2?0.95 % "".()'&!.!!+% #(2*3=7cvw®¸»¼¿Å°¡¶ž“¤™“§�„’’„š�yŒ€`msU^|ct�iƒeo]kY[~VZ~T]sABpAC|MM‡[d�RZ{MOvJNkFKiA>b6;wXZzU^sNVnQSsSRxU^yYc{\f…n€ˆz’�{��|’‹s‚ˆowŠlw�s~�q€�kn”np�vx”mpŽkv‹eo‰dh†dp†en�ow‘o{‘oy”t‚¥ƒ�£�ŠŸuy¤z‚¤{~¦{~¥||¨®…‰­Š“±†‹®ƒ‰´�’°‹‰±‹�½˜›»™š¼Ÿª¼–ž´�”ª…Ž­Œ”¯Œ’´’™ºžœÃ¤¬Ä¥¨É««ÆªªÇž »Œ�¹‡�¶ƒ„·††¹‰�–œÂ��¾�ŒÁ�޼‚‡¹‡‡½ˆ�¼†…¶wq¢VL™H@™K>´zr¼uÀ…~ÂŽ‡Í«¦Ô±²Ø½¹ÛÄÅÜÆÉàÌËäÏÎåÎÐßÃÇÑ­¨Ô±µÛÀ¼Ü¼¶Û´®Ö£¡Ô‘Ù�ŠÝ³¥éÑÐèÖÖíÖÖíÓÒëØÕîÖØäÁ½ãÂÁ忾æÊÁçÐËëÕÔîÝàïÞßíßáéÏÒܪ£œ@6š=0¨P:¸a`×°žÞ»ºâÇÆæÎÑéÓ×éÓÕåËÎâÁÀáý㽷ãÄ¿çÎÍàÀÀÛ¹»`BB#&(*w1-ƒ5)Š8/�=,ŽB4�G9�F=�G:�N@‡=7‰D:ŠH:’NF“OE•RL _T­ne²tk¹}wÌ”ŠÐ™“Ù­©ÜµµÜ³°äÉÆáÃÃãËÈæÐÑçÑÒè×ÖàÓÓ�mu7:-)2!$0!!,#$3)+!!"%'!*" -/9%1;("/() +#* )) )$)( $*(!$19.)-%%)",/)/4)6?46?-/;+,8)->/@M>=F<+0&$-%++:.*4'%-)2%3@23B2.<3'/##+# &+6+(0$%"-"'2&&1!( (&'2/)4.]po“–·¿ÅÅÅÏÆ¾Í£ˆ£–Š¢Œ€š�„˜�u�‚dxvV]tZh}ft€gw[b~Zb}SZ€U[|MTtA@qFC}PS‡Z_�RZzKRuJIg=E_5:[15uXcvSapQXoPYtRTuW^{[l{_o‹r‚‹|“‰yЉ|�ƒgv‰kt�lzŽot�nw�lo”pv’pq’lqˆgm‹gtŠdl‚bg…hnŠou�nu�px˜{‡ž{~Ÿtx™v}¡}†Ÿx}¡}£x�¨yy«‡Œ«†Œ­„ƒ®‚€µ””±�’¹“›¼ �½£¥·–›´‘™­Š�«Š’®‰�´�“¸•�¿™œÀžžÅ¤¦É§¥È¦¬¿—Ÿµˆ‡±„‡²}|´‚‡¹‹�¿”“¿ŒŒ»„}½‡…¹�…¼„…½†y·{x¯ližMA™MA˜QB²re½†‚¿ˆ�À�…ʨ¦Í­¬Ô¶¸ÙÂÆÛÃÇÝÇÅßÊËäÌÎÙ·½Ï­¯Ù¸¿Ú»¼Ø²®Ø±­Ö¦›Ø¥œÜ¬žâÀ½èÓÓêÕÔîØØíÖÔëÖÔî×ÛêÒÓèÍËéËÉêÒÏëÕÒíÞÚïáåïàãîáãìÔØß¶µ«QL¡G?¯bNÇxỲâÿãÊËèÕØé×ÝëØØæÒ×âÂÃáÀ¸áÀºä¿åÌÈߺۼ¸xSU#(+)v2-„2'‹91‹;)‘B7ŒD5ŒA5ŠE?‘KD‡?=ˆA6†H;�MB�MC“UM�WL­i[³qe¶xnÉ”‹Í›–Ö¦¢Ø°µÚ­­âÇÆáÅÃäËÍåÐÑéÒÕêÖÚáÑÔ¤“�GE<)0$",# +!0#)%#!#( +#,.;11?2"1(*++ (*!(! +!+%&%,! 0 *&.3)+2'+.'-2+3<.AJ=?G?*2%%/$*6'/:2*5+"%'2#2?-4B9"))(9)7?.2;.&2&(6+'4.&# .!6B3*1% * ('8//7-/6-jz€—£­¾ÀÈÅÅÑÇÃÏÈÂο¹È­›±˜‰¡ˆ{’��–Š{�z]lxYjvVcƒk|�iz}^izV\yU\zQUwLTvJMqBDxPR}VZ~LUpDIpDFj@E\16X//jKNyWZwQUrR^wS\uPZyYc~gx„t‚‡wЉvƒŠu„ƒhs}dj�ivŠlwŽkp‹iq‡cj‹ei‰de�kqƒ[]{WW€]]ƒfo‹kpŠhpŒnv›t�hp˜ou›pnœtwŸw}Ÿv‚™prŸwy¨~ƒ­‡�«…‡«‚ƒ®ˆ�°Ž�±Ž”¹—Ÿ»˜£µ‘š©~ƒ«€ˆ§€Œ«‡‹®‹’±�š¸‘”¸”—½œ¦Æ¤«ÆŸ À––µ‹�®xy¨tr¨w{°}z·„}¿‰‚¸�€±zy´yu³xp²zw´zq­rp¤^^¥XM­kb²wp¼‡{Ô’Å’”š”Ë©«Ðª¤Ô²ªÚ¿½ÜÆÄáÉÆÞÈÆÛ¿ÀÈ“•Э¨Ó®­Ê—‹Ï™’Ñ™�Ö¥˜Ü³²ß½¸çÍÅìÕÕëÖÔìÔÑìÒÎìÔÑìÙÚïÜØïÜÛïØÚïÛÝîÚÞîââïâæïãéîåæìØÝÚ­¸¨VI¸i^Ä}sמ›åÇÉâÂÁáýê×Ùê×ÚêÖ×êÚÞëÙÚçÈÃâÁ½âÁ¹äÆÁáÅÃݺ¬¡gp..!-.!w20{-#‚3)ƒ2$�@2�A3ŽE:�G<’H;Š@5‰D?‰E8�MD’OB™YM™SJ¤b]ªg_«g_À�vÇŽˆÏ�’׬�Ù°®áÄÀßÁÁãÄÄåÌÏäÌÉçÑÒãÑÒÍÀÇlde)3% *(&+, ". "/!/#+'!!'0&,6),9++". ,''!#!3*"/' ,#+:,1D:'7.)+ $(,%(+&14,?I=JUI@C:$(!!&!!'1B87G9*;6%&,:-0<1)6,&%)$!+$2'+3$%# (ELHu€~³¸¾ÄÂοÀп¿Ì¾̾½Îžɨ™­–ƒ™Šxމ}”‹s†yZnuZiz[nv_ouYfqT^tP\uMQqLRuNQtGQxKRyIHzJP{IP€LT~GP|GQzCIi:?g=FqR]oQ\qQZmPVqQ\uV]}^h‰o|ƒo}„q€‚is‚bl†ft�dj€fd„fi†joŠlp‚eh†`a†db|UU~TY{U]}^e„bq‚dn‡dq‰gqŠfo�ag”ij”im›sušqyœvx–kgžz€¤€…ª~€ ~�¤†«‰Œ­��´”—¶–œµ‘•±†‰›ko£|| w|«‚Œ¯…‰³‹�·Ž�¾™™Á› ÃššÀ™�½•”©vsªsn©sq¦mf¯ur¯vs¹~‚¬ni¨e[§gXªj_®ng·†„´Š‡¯|{³‚…¶‡ˆº‡ˆ¿‰„¾ŒŒÁ�‰¿•’È¥ Ð¬¬Ô³¶Ù»¶ÝÁ¼ÝÃÆÕ±¯Î™”ÄŽ‡Æ‘ˆÄŠ†Ã‚nLjxÍ�„Ö¡•Þ°ªàº¯æÊÇéÎÒéÏÑéÌËêÒÐìÖÖíØÚîÚÛîÙÚïØÚïÛÞïÜßîÞÞïâæðâçíäæéÕÜÏŸ«±cVÉ’‹ÒŸ“㻸èÏÏèÓÓèÑÕåÇÈåÆÄçÏÍè×Úê×ÖêÓÑèÎËæÉÄæËÄáÇÇÝ»¸¸wwZ;1J‘OHŽMB�QK—VD¦dY«if§a]µrhÀƒzË•ˆÕ¨¤Ö§¦à¼¸Û¹¹àÁ¿åÈÆåËÇèÑÍâÍÐÑÀÆwim'2(%&(&4$+=.(3$)'!'%&-.7<,:C6'3#&6&"0 ##'#/!(8-"1'+ '8.,=3 +!+ 0$"%(")+%28-FI;GNB=E9!)"!$!+ 2>04?1+;2((&2&+7*$.$&",% )"+#!0(%.&! ) 4;4‘� ³´½À¾Ë¿;¾Ê½ºÉ¿»É¿¸È¾³Å–‹£�}’…z†l~x`kz]kx^pyXir]mtWasP\rLTwMS|MUxMMyMP{MQ~KT}ELIS‰UW…HU�IRzDFl;7{OG„47x&~*Š72’>8‘?5�@5‡@6‰B5�B6‰C=ŒF;ŽNF�OG�OH‘QL¥aZ®npªgc¹pc¿�zÌ•‹Õ¥�Ó§šß»¹Þ»¸âÅÃåÈÆåËÌæÐÑâÍÌÒÀÆlu*4#)&#*&1,;,&1'(#."&-%$0, ;;1?F:/:.(5$"/"""%)%4#%4'"1(%".%+"$)&5& ('.',5+29+6<0.5*'/'%,% ' "$&!!)"* !+&$#!+# *,#""#.''5& 0&.# +*#*#.6.“¢©³·Ã·µÄ²¯Ã·³Æ¶³Ä²´Ç¿¶Ã½¯¿”„œƒwŽ‹}“ˆq†{i~|i|‚h�~i{cqpT[sMTpGQwNXySY{Ta}MVp:@r9A}@E�U`ŒU^‹PWˆIN„KTHPpDGrQ[jHRmIRpNToJT|Zlbp…o}€fu|foz\gx^fco�^d}ah…ehƒciƒba„_^{UX}Y]~NKuKL}U\zU\‚^`XZ„^^†[Zƒ]`Žaf�dgŽc_ŽebŽbe”mo’gd™pj£tyžvz¢yz¥�ª‚†³Ž™±�‹²�–¯†ˆ§y|�oo pkŸnvœqp£vu±�ˆ³~�·�Ÿ ¾šœ½–“º’�°�Š gd�_\ _^Ÿb^«md±ohªng˜YS–VN¥eZªwo®€{¹‹�¸�•¸’”¹’’¸ˆ�µ‡ˆºƒ‚º…‚¼†ƒÄ“ŠÉ �Ϥ¢Ò¬­Õ´°×º»Ô¯³Ï£ŸÊ˜™ÆŽ†Â‰„Å‹ˆÉ�†Î–„Ò›�׫¤âº­ä¼ãÇÅèËÇæÊÈæÌÍêÐÏéÑÏëÐÑëÖØéÖØîÖÕì×Úí×ÚïÝÞïßäïáåïáãáÂÊȉ’ˆ�Þ¸·âÆÉêÍËë×ÙíÜßíßãìÙÞêÒ×éÒÒéÔÒêÑÑéÑÐçÐËèÍÊæÉÆåËÍàÁÁÉ�‰‘<>‚13y&%s&€."Œ;5�A6“C:”IE‘D:�D:�@6ŒFA�JF“RE—WO•QJ™VQ›[R¥e^¦`\¹wr¾{rÈ�‚Ö¨¢×¯­à½¶àÅÃâÇÇâýåËÎæÐÐàÏÏׯɛ‡•(3$%%%%#,'3#/"(".")!#"4/"J=1<2%;5%-. %, *,#%*!*!-$"2+,7&&2$!,$"!+!0""%*$&,'#&#('*!%)"%,"")$#'$&*!*!"#*") * $/#)1#",#",%"/.BOM`mrŸ¥·¬ª¼±®Á´°¾±¬¼±«»±­À£“¥”‚��}“�–Œ|”Šx‘‚h~zbx|Ui|XgzRbyXe�^n�\m{VfzKVw@Iy9@}CJ‹PWŽNOˆJU‡DLƒ>I†FI„KR‚JRjBGgBBiELmLQlGRsXi~iƒƒo††ixv[`vXVt[bv\]x[bz[[€bd{bc‹lp€[]‚Z^xTWyOPlHMtNPzVVxV]TQ€Zb{SYRQŠ]\Œ`XŠcc‰_c†[\Œ^\�adŒ_a™or˜oj™ruŸw€§ˆ‰«ˆ„ª‚ˆ±‰Œ«�…�pq–kk“io•ghœpr™rt¢ww­w¶Ž‹¹šžº—œº–—´�ް†ƒ©xw“WP™TLšXRŸ[O«j_¬rl bZ•Y[–]W¥ngª‡­ƒˆµ†…¹”œ¼š¥²…Š´‚³�~µ�}¶�zºƒ~Á’�Ë¡›Ï¥¡Ò¯¯×¹¿Ó´³Ñ°´Ò§§Ëœ‘Ä”†Á‹}ÄzÅ…wΗ‰Ò ˜×­¨Üµªßº®âÃÁçÉÃæÎÈéÐÐêÎÏèÏÏéËËèÏÐèÏÑêÒ×ëÓÒìÔ×ìÖÙíÛÞîßäíÞáÈ��§\^уåÐÏêÖÕéÕÙîÞÞïÞáïÞßíÜáìÖÙäÆÄãÅÂäûåÍÈçÏÍèÑÏçÌÃçÈÅΆЖ˜¤QR…22l{( €-&�<1�B8—G@–IG“J>ŒGBŽD9‰D=ŽIE•TMœ`[�^^�^X§b^¨aT®h\¸rl½ypÃ�uÖ¨žÙ­¥à·µÝ»ºà¾ÁàÅÁãÈÊäÍÒãÑÓÛÈÍ™‚Œ%2$$!"!% /'6''6&%4$((!&&+%0,&*$2'=(B. I3!<4&4:/27*-3(+0"(+#. )*!$1$".!0 #!&!$!!!#"'")###"(''3.%3+$#*#& - *#+'.!!+!$2,FV]ƒ�•— ­®²Áµ´Âµ°Á²¯Á´­¾µ«½¨ž´“�”�€–�y“Ž{’�z‘†f�{[nvPdp@JwIQ{Pa€Xl�]k€VfR_~CL{;B~9BŒTa�Uf‹MU†BK€>F‚>BŒLQ†KP}GOlBMb@Je@IlJNjCGr`i~h~~k{t`jsU_wW_vX[vWZxYV\axZZ~_f€^czWU}WXuMLpKRmGGqQTzSQxSP}Z_~PRPQ|RQ‡\Z…[Z‰\[ˆ[[†[\�d`Œ^Zˆde•oošql—qu§‚Šª…Š«��¬‡†«�‡¦yy�pv“fe”ih“hf—kg˜nh£ts°ˆ‡¶“”¸—œ·”�¸•�µ‘—¬ˆ‡¦tu’UP’MA˜VFœ\S©li¬os¢ji›ad on¤nl®‚…³††³Š�¼™¢½–™²ƒ{¯{z­xvµv´�}ºˆƒÃ’�Ë£ŸÍ¥¢Ó²±Ô´µÒ±¯Ö¶µÏ£žÌ�˜Â’“Á‰€Á�uÁ}nÏ—‰Ô •Ø« Ûµ±Þº±àÁ¼æÊÉçÏÐéÓÒçËÍæÈÇæÈÉæÈÅåÊÌæËÏèÎËêÓÓë×ÙìÚÞîßäëÜàÃƒŽ¨`]Ó±¬éÓÕèÖÙëÕØðÞÞðßÝîÜÞîÝßðÚÜåÄÅâÁ»å¸æÎÉèÐÌçËÊåÉÃæÊÈ⿸Ҙ—¬^W—@;q|.$‚0$�=1�>7‘E=‘G<‘K@�F9ŽE<�FE‘LG“RG™\V˜Z\�_V©e]§bZ±jdºyoºxn¿}sÕ¥¡Ö©¤Þ¸³ßÀ¾Þ¿ÀâÇÃäÉÉæÌËâÎÑØÈË™€Š)!! ",(6''3$&4 ,!'!*$!/+$("$#(#7'D1%J3#A6$9>99=639/(,()"-*#-!.=0.8-&2#"##*!  (!!&"#"!-!+4+&$'2'&/$'4(1B/AK::I7  +$  * !' + &3(  %0%2C5;H=7A;>NJey}´»ÂÁÃÎÂÀÍ¿ºË¹´Æº±Äµ®À²¬»³®½®¢¸›ƒš’v‹†dz‹[lŠZg‚HTr:Du6=q4=wAO€LYŽ[h“`m—eu”bn�IRˆ791:†BI’MPŒAH‡8?}/7}/2ƒ=?„AD€;@z<@x?Eq@Eg>Nd;GwMToTZrZfy^dpV[rTYmKRkLUhMQuOQmTWsYZuVVxOIuQPuPUiFJcl•NI”TH˜TQ—MCªf]²ol«gg¶sk·tl´nhÄ‚xÊ�„Ï—…Û´®Ý¶´àÂÀâÂÃàÃÄÛÁ¿Õ¿¿Ÿ…�64*% #   %!0"!3+#3'$4&)3($* "# &*")*$$#-(3%5B9FSEFUF # !."$-""+5*NaZ©°¶À»Ç»µÂ³Ÿ©¦Œ ¢‡•�ƒ™–z‹�ƒŽ˜zŽ�ƒ‘�’‰evu;Mq2:]6;\:;]?AiGHjFJi?;h?9gA7tF:sNGsJGwMMzTSxIJyJC}NK~NJ}WY†_bŠcdŽpv’kn”ns—ofšrwŸtw–inƒSJƒUI†[T‡XI‰ZO‘ke¢‚‚ž…‹©…�¨�’¬‹�®ƒ„«ƒƒ§{x’fa†PM}D=†MF“ZT—f\–hf›gaškg¨}w¡lh›ne¡ql¤zw§~}¯‡ƒ±†ƒ¤oc�WJ•VK›VJ£bS­zv·ŒƒÇ ¦Ê²±Ï±³Ê¢¢Ç¥¦Ê©©Ìª«Ê¥¥È¡œÌ¦ŸÉœ”Ê–�ЦžÒ® ×¶¯Ý¼¹Û¿ÂÜÀ¾áÍÉåÑÑåÎÌßÁÅÍš’É”‘Å’ŒÎ—ŒÏ�–Ò¡šÓ¥ŸÔ«ªÞ¼¶×®²Ô«­¸{xµ�xЧ¤çÑÐìØÜëØÙëÖØîÜÛïÝßîÜÞðßâïÛÞ䷰⾳⿼ޱ©Þ´¨Þ±§â¼¶á²¤Ý¬›ß°¨Ò›™Ï’’Å€{³jg§WVŸNB�NH›UK¡WR—NH˜PL™QF’QH”TL�LE‘NH”ULŽF=¡]Q¨dY®ib´rj¶sjµm]Á~oÅ�rÌ�Š×¬¨Ù¬­Ý·²ß¼¸à¿Àܾ½Ôº¹žxy`M>H6,8-#+'#&%)!(+$1"%0"!*%#" %'*#5)/?.:F6AOB    &!!‚–“¬µ¾½±¿«—ª©”©¬’œ¥� ¤“�œ‹�¡�£ž’¥ž��š€•‘p�y6Bl*4h'/a$k+/u38„HU—_gœgp¨�‘¥q‚¡lyšcpŠBE‚38€.5„:C‰AJ†6?x).x))v('{,+z,*v.)n*,q02_((X))W*.[06d>Bd?HhMWnWbmQ_hISeGNdJMjIIoORnPQmJNiNPnLIhFLe?=_=;]75U54W65]@:gEBmD?l@zJIwNKVPŠbb‰gi‹c`”hi–mošov•ll™nk�Z[|QO|QL‚UM„\Q†e]“xvœwz }{¦…‰®�Ž­„�¢sjœomšps‹ZWˆSS…NG‚OF•cb–ad”cf˜fišgf¥ys—eg˜je›j_£we«tµ‰‡¢oq‘[W†H=ŒOAŽVF§ri¹�ŒÀ™™Å§ªË°¯É¨¬Â ¢Æ¤¤Æ£ŸÆ§¬È žÈ˜�É›™Ë—‰Ìœ’Ò©¢Ô­¦Õª¤Ø³«Ý¼¹ÞÁÀáÄÄäÇÉãÊÇÚµºÊ�†Ç�‡Á‡‰Á†„Ä�…É�‰Íš—Óª©×¬¥Ö©°Ï˜›­b^Ç ”ÛÀ¿èÑÑì×ÕîÙÙëÙÛîÛÚîÛàíßàðßáïÛÞëËÈà»·ã¹µÚ«¦Ú¨�Ù¤–ݰ«Ü¬ Ý¯žß²¬Ö¤ŸÖ›™Ñ•�¿}{´nn¤XU�RK�UK£\ZžXM›WH�UO™XT•SQ—UU˜[Pš\Y�N?¢YR©a[­oe°pe·|tÅ‹‹Ç†€ÇŠ�ÉŒ…Ñ�šÔ£žÓ¢˜Ü´®ß¼´ÜÃÁÏ­¶–eetJ2L8':5$,.)1%(6'&, $()0") %""-$-%,$&#!$*$#%!!-!)5+6@.;D-COF"%#% !%!$+*%(''+23:>4=@CJK§®³µ³À¶§µ­¤µª¡µ°›«¥’¥¥”ªœ�¤¡”§ “§�‰ž�p…†Pbl*/f"&c%g#'z:B‚CL‘[m�n~£q«~Ž¡ly�iw�N[ƒ/4,1�15‰=C‡;@€16q'(q##u)*w*)s''r,'n,,c)(W$$N$'Q)+V,/a>EY7:iQZkQWfJTbFMaCIgHNjGKmOUmSVkLHgGFhINgACe<>b?B`?=f@@mC?kA7nE@vPTuMNpFCvIOvAAhA@wOQzVX�WYŽfgŒf\‹db–jm’gl™q{”nr“jgŠTR{QI|TP†SLˆcc“pq”vs›y|Ÿ}£…‹¬‡’¨�˜jgški–nnˆZVŠ\Y‡YRˆUJ’^]Ž]W“d\’b_šmd¢uw•gf˜ig’d_©|r«‚{®€˜\VˆPKƒJ:�TD˜cS­q¼—™¾›“ƨ©É««Ç¤©¾”•Û�Å¡¡ÃŸ¦Â—‘Å›‘Ç”�Ëœ�Ê™�Ò¬¤Õ³¬Ô®ªÙµªÜ¹¿Þ»ÂßÆÃæÈÈäËÈ×§¬ÂnÂ…zÀ�€¿…‚ÁŠˆÉŽ‰Ìš˜Ñ¤£Õª ÔŸ¥Ã�€­g[Ù½ºáÄÆéÐÏëÕÓìÙØë×ÙíÙØíÚÞîÞâðÝàðÝßìÕÙãÀºå½·Ü¯¤Ö£šÙ¥šÞ³°Ü«žà±¢â·²Ø§£ÖŸžÔ›‘Â�}¹ut¬e`¢UM SP¢YUœ^RœYO�TPšVRšVSšSQœ\Q˜YO”SI¡VQ©cY´wn±kb´xkË——Æ…ÉŽ„È�‡ÑŸ™Ó¥¡Ö£œÛ´®Ý½ºÚÁ¿¾™ž„WJcC/93!,0!(0 ,4)-;*49.44$;:*,5'"+ &'")&*(-101,-$/"#'+!*(4)/9+6=.7@+=I3"""""$%)9?G`ckejt�ƒˆ‘•Ÿ›› ©¦®¶µ¹¸²¹¿¸ÁÁ¸Á½µÃ½µÄ»±¾»®»±Ÿ³©™¯¢™®™‘§›Š£˜Œ¤˜Œ¢—†£“€š‹m†z7Ds+3g#'j&+z8@�Zgš^jšao›br¥t„¦q�œaqŸhu—S^{*3€*+-.�66ƒ26~),q!o"p$%t&(m%!l#!g#"Z"%S"!L&H""N%'R.1X27X;?jSZeFKlHMb@B\CFfGFhKRnKGmMHfFG`??`ABZ9;U63V41W22R51R33\>@^99_;4f:5nCAl@8kB=nJHmD=gCCmC@j>>nGAoLKsQN�`g�`]…deŽ`W�ca‹a]’f_�gj�bd~KFuMGuJ?€SM‡if‹mm‘on›usœ{t¥ƒƒ¢yy–lj“i`•gg�c_�c_ˆ[Y‡XXŒ][�`[Œ[Z‡[W—hcœpr�id�^UŠ`X—mg¨zs£vqšb`†M?ŠTK‹YN™ha¢qk°‰„¸’‘À•�Ç¥ Ä¦¦À™£·Œ‰¼�ˆÃ˜’½�‰¿�†ÁŒ�ɄǑˆÊ–ŽÒª£Ö±¦Ü·´Ü¿¼àÃÀáÄÅàÇÇæÈÈáÄÃ͘—¿o»{s½|o¹yoºzqÄ}ΙšÍ•’È‘”°[[¥PCÍ¥›äÊÈçÐÐëÖÕïØÛíÛÜîÜàðÞÛîÝÛïÛÝíÝàïÞâîÙÜæÍËæÇÃãüὸ佼㾿âÁ¹ä¾¼â¾¸Þ´¬Ü©¦Ù«¥ÐŸŸÄ�Œµpr¦]X¨aU¨a\�TN™RQ�TO›QI¡\X¥a_¤eZŸa[�WQžYM¬i]¼�³rs±nbÉ’�LJ„ljxΔ†Ñ£™Õ¥—Ù®žÛ°©Üµ¬ÙÀÁya_LD<7<.#-!+&+/2"7<(POGSJ5WM5QK7A?482'$.!+#2(,.+0-;=*DH9:=.+/%#$ ) "0'#5),:*1>/5;/29+)6*)9'(/*ƒ‰‘››ª±ª´»®º¾µ»À³»Ã³¿¿±º¾­º·¨¸ºª·¹¤¯·Ÿª²›ª­—¦¨”¤¥�¢™‹˜š‡œ—„š—ƒ˜’~”“�˜‘~—�’‰m~€8Ej&,i%(�FO™n€ j|˜[d˜Yc™ZiŸmzœf~š\m�`u…9F})+w&.},-‚2:/1v&'q$ot$"y'$r$$f a VJEDJ#(H$)S12S:C[LRdHO_DGcGH[AZ<<[83V56S/+V/-O,)P0*R85X54[74_9/b<3dB@a@EgB;d<5d<>kBAg>4j@>jIFxRT|\^WY€[T†a_Šcf‹`]‰_\‹_b‹\[„SSLIvGDwGB†_WŒkn�ik’u}œz}Ÿ~~™w~—fiŽ]\‰\Q‹_b�ab�a[Š_Z…YO„]\�`\ˆYUŠXTšmi˜nl˜h`Ž\ZŒ^P�po•`W�XR~H=ƒUJ‹WN�ZU�gd™sl¯�|·‰�½“�Ážœ¾–œ³ƒ¬€t³�‡¶Š‰·…{½~f¾}h¿zÂ�…É”„Ô«©Û½»ÝÀ½ßÃÅàÀÃÞ»¶Û¾»ßÁÂÙ±¶ÇŽŠ½~s¹}r³ld±jf²nb¾}y»vs¼xs©SW®jdÄ’‡Ù¸¸ÛÀÀßÃÁåÊÆê××ëÙÙíÛÚïßÝïßáïßâîÝßðßâïÙÙêÔÑêÒÐìÐÎçÉÊæÈÄèÅÅæÇÄèÊÇèÉÊ⿾๸޵´Ô¢›Ñ›—¼zv¨\[«]T«c_›QN˜MGŸTNŸSC¤^W¡_V¤f`¦j`¡bU¤b]«l`½…‚À‚�½zvÇ‹€É‡�Ì‘�Ï�„×§¥Ù­¨Û°¥Þ¸¸Ý·ºÏ±®ZZKKVM;A4+1")2&+4%5>17B,MQ`DG\<=V7`ABh>8f=5c;;h>=f@9hB�TM¡^W£ef«ma¦g]¤_W©fY¾‚~ƒ~À�sÃvÆ„yÌ‘ŠÎ•ˆ×®£Úª¬Ù«£Ý¸±Ø²¸¾¡¡QTHMTFCD403$+4'14&:A0>F1KI2KJ6HJ9PL>FD8CH=>OD-;/#0!-5:7):2&34!)5(%.#". '"#)."!1'1C67F70?.(:(-;1+8+%&(„�ƒœ‹›�‰˜�†– „Žš�ˆ™|ŒŸ„�Ÿ�œ|‡—u‚”u~•{~“sy’t|�p€‹p}‹p‚Žy‹�q…„q„‚i||dxw`s~_ws7Ch)2w;=˜t‚¡‚•¡v„–Rb‘M\�HLœgp›do’Q]�R]�KRw&,rpu&+x+-x&,fhijli]TND<?DI$(G&,M3;\CNaBKV>C]?DaHIaDGcDEgGE]?=_?A\=?T9;N34O20P*)D"D"F*'V61S45R/*S64U3.aC>dA:b?EƒVa›z‡£ƒ–£y��MW�HQŒJR—Za‘Q]�OWŒLV}0:r!)rmq!#z)0qldcje^ZNC?E==BC" A #P<‚MD‰XL˜bZ›hfžli™ec’a\€MDu=4p<4|I:}NJ‚QP„TL’d^šmh¦{t¬�|®„�°ƒ�¤sm¡ws¢zp¥xm¤jZ¨j[±oX³o`º{fÅ‘ŠÅ’ˆÏ¦™Ô¨˜Ù®¨áÆÇçÏÒçÒÑæÏÒçÒÖæÒÓàÄÈÍŒ�Âpx®WZªRG±[X§ON¦^\¼ƒvͨ¥Ö°¶×±±ÜÀÀæÊÊæÈÊåÊËçÌÊçËÉéÔÔëÖÔìÖÓíÚÛìÚÝðÚÙîÚÚêÚÜí×ÙéÎÇèÌÌéÎÊêÎÇéÓÍêÕÏëÓÓèÈÏäÁÄØ£¦Ð›”ËŒ‡Âxo»ux°mgªc[«d\©`XœQCœTHœVK¤^T¨c]«e\«ga¶tt¹wuÀ‚q¿yÀ�{ÆxÍ�ƒÑ™�Й’Õ¥Ÿ×¦¢Øª¡Ù´°Å¤¨+* #1%)3'%.')(#+ ) (%8-1A+,9'"/" 1%!4-#0&%1'&92):.&2&+9*>N3>QD7JB!.!,"-*/)!-!0""1#-#1($4)F:8<A!B%&P>AR7AS88R=?W>AZDEbFGV<>T:7P86S72Q4,K-(J)&G'(=9>H)*L35L12N64W;6X73Y88[93[94]88S1-V0,Y81]=6`C>lJIpE@vKEyLDyLH|QO�UQ‚TYvJMyIGtKHnGIsC?|XQ�`e†dd†ig‘rn“snŽci�RS|JB{JCxOL€WM‚XT�YSzRJUOQE{J?~H=„OJ†XO–]Oœe[¤qh”a\‹XNyFBq<2p;6vC1 0"++d_gvlwuals]hmV\sUarU\oT]mSSnS[qOOpOSrMNkGIkJOoJPmIPnKLeCMfBJfDKhCQdDPfIVoMYq9DyGQ’ksšzŒŸ€•št‰‰NX†DM†EJ‰PY“Zd‹JY‰DH€=Bs&-giiv('t")m`]_`^[KDA:;277=@('I13P78N30Q<;V??WAF[GFV>#"=:7?$ J46R74V>=Y=AX7:[97W61^93Y;;R/*X21U2.U51_<;^B?b?;lEEtJ>tGAuIEwLE{QGwJEk>4rE>rIGoA?l?6‡^[Šga‚\P�jb�lk‘hg{MCsG>vG8tHC{PH{SM|UP{PPzSN}QJvKCzIEzJ@|LA…SG�a]•d]˜cd‰RL|JEu?8g:/m<2wE;tG?rH>|UOŒ^Z�bX›mežqh¢oj rj˜hh™nnžwj¤sm¡o`£h\®qc¸{nÁ�{Â�„Ä“ŒÌ¡�Ч¨Ò«®áÍÐÞÅÌÛº¾Øµ¹Ö²µØµ¸ãÇÆèÏÔéÒÖÝ®º¯TV EC�-*}1+‹D=¯qn»‰…ÂŽ’ЩŸÛ¹»ßÀÁäÉÉæÐÑæÒÐçÐÐèÒÓéÖØêØÚìÛÝîÛÞì×ÛìÖÛëÓÓëÖÕë×ÔíÒÒìÏÌéÏÊèËÄëÍÌæÇËåÃÃÞ«­ÉŒ”¿wv»tn¯a]¬`Vª\S©fc­ig¦a\¢YPŸWQ�WO©aW³rj¬idº|w¼zu·og„ƒÃ‚„ÆqΘ�Ñœ•Ñ–ŽÚ´±Û¶·Úµ®¼šž\KK&"&!2'%%)##'!2&%6-#-!."0&# & -"/?62H;EVF>I>3>4$0!$2"&7-#(!#0%#1&)82)8.'+"pfuq\ppZkr\fqWikSZnZaoRXlVVpPXgLSfHNf@GgDHd@GlFJgCLgDMhBIhGTiGUeI[uWjzRcsBJ’iu�kw—r†”v‰”lŠJV‚@E@FƒEI‹MW‹JM†ANy.3r%(efhnp$q !fX\YXSM<<<91./38D./M15N8;S9:\:7bA8eB9lJImE=sIGqHAuI@l=f?5k>4lB8oFA}NAˆ\QŽcYŽcU™kfŸpm›mm“bX›nd¢xt¤ti§sf¡lg©qc­yl¸‚|¾�‰Â‘‰Ë§¢Â“ŸÄ��Ô¶²ãÐ×çÏ×Ù¸ÀË™œÎ™˜Ñ£¢à¾¼çÎÐèÔÚß¾ÈÊŽœ—<8�<7�SR«tm¹ˆ‡¾‘‹Å˜•Ϫ©×´¯Ý½¹Þ¾¾âÅÇãÆÄìÙÖëÛßîÜßê×ÛìÚÚíÙ×é×ÛëÕÕêÕÒìÖÕêÕÔêÔÐèÏÉèÌÊéÈÉåÈÉåÃÃ໺ڲ·Ò£¡¾��±fj³kg°ie±oi±jf´rk¥`X�WN¤_Z­k`®lc´sjºxt¹trµoh¼vo¼wlɉ€Òž“Ô£™Ô£¡Ø±«Ø¹ºÛ¼¸ƒhi/.'$$ &%$!!$#(!0')"$& &7/+=23F:-:/%3*".#$3$%5%3*"4#"5*,(!-%+$#)meswaot\oqWepYfkVaoV]mUWmVYnPXeFHhEMdAIhAEgCGjBHiDOe@Ib<>hELoR\sVlwM^u?P‚[b‘hv’m}•t†–q‚�Ui~>G~„MU‰FQ…CO€:Ar%*j d_joom^Y\VWTB8=82- +249I04I4:N37R:>SCU?@O::O34P66N33F.,E&$E#:0-39%"B.*O65U::Q79Q55T64W8/Y:3V7.L*&K'"K0*R50T43^;6];1a<:iC@mKHi<1pGEqGAmG@b:6^5/j?6f?9c=6oG:~\Z„a`†c]…_X~WVvKIjCFjCBgB;pG9sNFvRO|PNuKEvUKtEBo@;qB†[Q�_P�\M—j_›qf—im•eVžpd¯‹‡³Œ‹¦sf¢nd¯zg³‚w»‹€¼�…¿’‡É¦žÄ•šÂ—“Ò±ªåÌÔçÑ×áÈÐÍ•šÉŽŽÊš—×±¯ßÂÄéÕ×éÑÙãÆË³`j›LDœTO²yw¹Œ�À“’À”�É›–Ρ–Ô®«Ùµ±Þº¸à¾¹èÖÏìÛÜíÛßé×ÛëÚÛíÙØëÙÛëÕÕëØ×íØÕì×ÖëÕÖêÑÎéÏËéÉÌæÇÈæÂÈิܳ°Öª¬ÇŒ‘¼wu¸qp¶qn­i^²rj·|z«gcŸZQ£^U©l_¬kb´sn»~|¹rt¶up¾zo„xƉ„Ïš�Ñš�Ô¤¢Ö«§Ø³¯Ø¸¹fQN),$"+$,%"! &(")$ -"'#,#"4'.?2$1%!/%"+)0#*."/$*0&%4*&5+%'i]cu`joV`gL[eJQgHO]>FX?EV\:D_:?c?GeEHsSYuS`sHYj9Co7>€TZ’h|�m��m~‘iu~AJz46y4;{:=€EL…IOƒ;A{:Bl(3fc^egqkf]X\URH6 40, & ' ) 03>&$K39J34N8:M6:M:+*L64Q;:M:8M51Q52O3/Q65W72N-,H'!K,&Q5/Q3.S5.W85Y73]73p?8m?8h?;oEFpG@lC>f;8Z4.g<7jC:h?8uTP�_^€[X~TO{TUqKImB>g<;e;;kC;rKFlMIvQJtNIwNMuMLj:6e50h7.s:0w=/}H;ŽXM“[SzD>h6/h93k:6l<3j=6d8/h<4g;4pF9SL…XQŽaS wu uošl`—i]—gZ±Œ„ß¡³ˆ�«yv°t²�³}v³�|¹†„¿�ŠÁ”•Æ‘�Ñ®°àÄÈäÐÏäÑÒÛ¸½Î𤾀}Ç’ŠÍž�ßÃÁæÕÙçÔÚæÐÖΗžÈ–šÍ�™È™�½‹Š¼�ˆÂ‘‰¿�ŠËœ‘Ø®¦Ü¶­âùèÏÉéÓÏçØÙìÚßìÚÛì×ÕëÕ×ëØÕíÙÕì×ÓíÖÖì×ÓëÚÝíØØçÅËãÀÃ㽺߸´Ü¸´Üµ´Ñ›œÃƒ�¾~�µli³rk­jh¬c`¦_^¥^X¤e^žVU›VP³pc²vw³om±leĉ€Ç‹‰ÆŠ€Ì“ˆÌ•�Ó˜’Р”Ó§¡Ð·¶DF;.?2'4! 2('!/#)8+"0&""#  %$ " !!(!""+"2@9:D=JUP/;2!3(qbogPZcLU\BKU9=Y=CW7ChAIlv/8q+2a^[cdhme]UPVQA6 2 * ( %  +$ --0@**H02I13L57O:>K<@S89I52J33H//G,,D*'A$!2-4(+7B/,H63O=>Q99S47U64S8/T84U76I&%CE( N2,N12T4.V50T0,]95]87^60h@;jD@fC=oJJb<4[4.b84eD@eFBxNEVQ[_}RLi=:c;4_7,c:1e=9\=5eC:iDR9b7@a+1\(0_*/r:;‰^d‡_lŠetŠgzƒ^pr3:q.3q.3p5D("L0)J0,P0)W4.R0)_;5Z53]53g:2oGBkGAnD>`:7_64\61jF@kF@wTIyVT~YWwLCf;5_6.]4.^83a=9_;:_ByJ=¥{v¡¤Ç¤¤«tz¦qr©tp­xqÍ´´Î­µ¨nd¨of«qn¨vs¯wxªnnªoh¯uj¸|nÅ™�Ù¿ÃáÇÉãÒÔåÈÊß½ÃÌ™ž¸yq»~}Ê™œÖ¶¶áÄÇéÕ×êÙßëÖÜêØÕèÒÓæÍÐãÉÊåÊÊãÇÆâÄÇâÃÅâÅÇäÈÉêÒÐèÖ×éØÝéÖÙíÙÙíÚÜëØÛìÙÙêØÓëÓÓêÔÒíÕÓëÚØì×ÕçÂÅ๳ߴ¶Ø¨¦Ù©¦Úª�Õ§§Ì“ŽÆ��¼zµuq·tk°c^´lb°ka¬fhœQJ�PE§f`¯ia¯jf«b_¸pj¼{xÌ’�Íš“Ë�’Õ£žÐ¢šÒ§¢rZW&/&1 )$*%,%!1( , #' 1)$6-# #!&! +!,"%( !,!9G>=J>:G?mdrbKWY>KS9BI,4K*,J&$N*,K)(N-+K''H(&O*)W26a:@`4@J"L%N #`..r;>�S]‚Zl„Zo‚\n{HUp7Al).l(*u13}FPx;Gv6?n12f$]T]bfdceSLODE?, *  " + " ' $ ,2:!C+2E24I37J44O::S?>D-/C,.D.,B(%? #<"0*,''):' G1/K43J65O2-M73J57P9;P27I)%>">"E'"L.'J,&Q-%N*$R/(]2/\5/]72e<6f@Bc>:nE?[74Z6.[<;`?;fA@sOOwROoIHnG?[63Y54S5(Z6-[6-Z99`:5^<3a>9mFBjI?f<5`-$`/&a*!f."o:-xE:g6-a0)^4/`4.Y2)a9/k<0j<0d5(f7,g;/i@8mA?qFBŽ[N±†|º‘ŒÈ£©¬zu±}~®~zË©¬Ò¸½±yv¦li¨onªpm¦jh¦liŸa[§mf³zrͦ¤Ù¹ÁÚ¾ÁãÐÔæÐÔáÃÈÛº¼½€…·zw¼‚|Ë¢™Ò¬¨áÅÅèÔÓëØÚíÝßéÔÛåÑÖßÅÀáÆÇãÄÅäÄÁäËÎèÏÒçÕÜé×ÖêÙÝëØÕìÙÚìÝÜîÚÝëÙÙíÚØë×ÏéÏÉèÐÏêÎÉëÒÓéÒÐèÉÊ࿽޳°ÖŸšÖ¦¤Ö¦¦Ô¤¥Ò¢£Î £Á‚|¹vr¶nj±km¯i^¯idµqf¡VS¥]R¯mf²j_²jb°mh¶ob½}qÆ~Θ—Íš˜Ñ¥ Ïª¤È¥£>;4",$/,+!-%+&*"/$#3(!-"*! - 1&*$!-(#!#2"'7* '- -$#&:E=BI?7>6#iXmTDNK2* ( $ +  +! ! && -7;'(@)+I30H00I78M67K36D,+F*)@)$@%"61)&())-=,,H5/H6.L80O6/J3-M85H/,J,.B$="< D&"F/%E*#H(#L*&P2,U1-V3.Y5.\9.f92c=4fA?W52X71a??aE>gBAkGEpE@fCCgB6`8-\3.[0)W(Y$h6+n;4j82[1*Y-'Y1)U.*T/&]0"b5-a2(c4&d7-b8.fA:uIA~TKˆWN›kg©|uÁ›™·ŠŒ´}‚´~}žŸÎ²·Â”š¦nl¢ihŸb]›]Z–YU¤d\­ni±upÊ¢£Ûº¾ÛÀÁáËÌéÕØçÓÖÛ·¸Ø­®Ï�¦Â„�‡}Ì”ŽÙ±¬áÈËæÑÓëÙÙëÚßêÔÝàÅÆß½Àݽ¹ß¿ÀåÊËåÊÊåÑÏé×ÛèØÚéÖ×íÛÜîÛßêØÚéÖÙëÛÛé×ÓèÑÑéÑÑéÐÎéÎÈéÏÊæÆÇ໺ݱ´×¥�Ô£¡Ò£¢×ª©Í—�È�‘À‚}µoi¶pf±hg«aU±ja®eb¦]R©fX©hZ«g\«fX®nj·tkµuk¿‚tÆ�€È’…È“�Á™—™xz%+ , $2"'7+!/$ ,$'#*)&#"%"&$ !#!' 6D=5>:.3''.&*!bVeL7?E*/C&$AB"%AD!"C""F"#I##P(,P)+I A?HO$d.3p?@|QVvPbySa{Sbm5@c(,a'*a(/wBCu::s26k,3l-2`!%TUR]^[V[UFFC?:! ! ! + +  + +! $(.6?'&=)*H22G00K66I7%!<&"6!!1+''&')/C,&F2-I5.J74L2/J3.H55I/.G+)@#?"9J+$C*$B& B#M-+M/(S0,^64^85b<6c=2_;4c@9[41_;6Z99`@:iC?mC=k?>f@;FO !O#i49zS[zTauS`rHWi3@c%-^"[ "q;=m3;n/4d(+k,,m,/\QWZ]Y S LF@AB=-'  +    + ! !'2; ;''=+/G11B23M8:M8;E20C+)9##:!2)())'()0A+&N6+K4,J53N41O53J/-D&#<#!<" ;! 6B& C+&E# @#K-(R--R0*Z5/W51_5/Y8-Y90b;2\84c?@c95cA?kFDcA9]>=Z7.N-+K*N,%Q40Q2.X85];3U1,^8-_<9a83Z3)W3-V,"L!Z,#g8/`5+W/$X1)Z2*R.$X/%W/(Y0(\4+b6+X5-^4-j?/tF?sB=$%?#%; <=! > C!=?BB>?EFDX&#vNSoJTtQUrKY`&0^ #Y %^"'f35m6Ab&'`'&a,.d(0XRXXYTP K 2 +$ +$ + 76/    +  + +   ! $,37"$>))=((@1/G63J79J69B,/@*%2.)# $#%'',.?*&M80M3.F15K3,K51?*(9##;%"? "9! 7=$!>%C%C# L)'M+%R,&V1-V4.W.,\92Z60_;4\7/U42`92\93c>:e=4[43T/,R--J%P0%R4-N-'K-$Q,&W2+V4.X51X60T52R,%N&M Z1)X.'[1)pDk=2`5-a2-^/(f70f91c8/e=4e:1e:5g:5r=9zKI„NN‹TO™d_�ld¨vs¥kiÙ‘É£›Õ¶­ÚÆÅ¹~†ž[RŠKF‡F>…C>‡?6„>8“MD¡dc¶}sÈ›�Ø·¯âÈÌáÈÊãÆÊÚ¸·Ö³´ÎŸ¤ÌžžË�—Ê�”Ò«¥Õ´µÞÄÀâÏÒæÒÓãÒÒåÉÈེݼ¹Ý»ºÞ¾»âÇÄæÓÏæÖÙæÓÒíÝßïßâìÛÜêØÜëרê×ÕçÓÔçÒÒãÊËῼ߹¯Þ¶¹Ù¥ Óž˜Í’‹Ê’ƒÊ”�ÏŸžÇ�–ÇŽ‰Ç�‹Â‚x»|vµmm°j_±h^µmhµti¾€s¹zz¹}À„�ºyt·zlº{qĈzÊŸžÏ¬ª¢‚‡ &#"%%$ '-%"! %   + + ,#'4(*<9 .*%#!/),>0M5;<$%?!": !: ?" A!?8=;?AGG?Kb41uM[nIUmKTe6E\"&Z#Y"%\)/i5Ah/6b$$a&$a,,a!VRVY\M I +B % )) + +   +   +  &*46;*(>)'D0/C21M8:L99C/2A($+,'# ""!'+,-A+%E44F1-F34H3.M32>%#=#!A)(>#"9 5;#;"C$D$E)&M,)R0*T1-R2/V2.V5-T4,_6/W2(V1*Z70[;5`<6^:4V1-T-(M)'B$G&L01F)#G*!H*&Q3*O3+Y40Z7.U70R+&P($P&U.$R,)X1&uPH�aWˆ\V~KEj71d4(b7.e8+a90i>3e:3f:4l?:j:9oAB„MIŒYR–bbške¤ro£leº�~Ê¥¡Óµ±ÜÅÈ•¡ ^g‡CA@4�A8€::ƒ=6�HC¡``±xpÁ�‡Ò®ªßÅÂßÉÉâů܏¾Ú´µÐ ¤ÌŸ�Σ¡ÈŸ£Î¨¤Ô®ªÙ¾¸âÊËæÐÐäÔÓäÌÍàÄÃàÅÅßÄÆßÃÅãÌÌèÒÒéØÜæÖÙìÝâíÛâîÚÜé×ÙêÖ×êÙÛéÖÙéÖÚäËÍ໹ڲ®Ø¬­Ô¥¨ÔžœÌ“�È�‡Ê“‰Ì–˜Â‰�ÅŠ†Æ‹Š¿„yÁ‡¶so¯ha³rdµqh¶wp¼ƒ{¶vn¹tÄ‹�¹|x¸{i¾‚nÇ�~Ϥ¡Ì§¦gST#,"+ '%0$ ,"&        +  )&  "0$.>?#2*$!.():+G2"!>!@""C?=;;=DB;7f==qIVmISmHRiBK\#)QQ^$&h3@g/9^#$Z"$^)-^%(UVRRXUG B ( +  +    + $'+14 6$!D-(J41K/3I51R<8G..9" ''! "  "!%)-.>,$G3/G33A0*B-+@)(6:%";$#6!97";$!,.F,'WFIG,.1  +  #"'*-?*)@/.D0.G.)=#$6 8# :# 5!255;"@" B$A"D&#M*!J+!I,%N.&K+&S/(R,%V-&P,(V0-X4,V7/U6,T1(H)*G%!>#!9#?&#B'E&!E%"H)#Q0&V4-X90b:4_;8M)$H#H%!L)!V30\8-lICXS�ba vvª�|±‹Œ qq•il…TUtD@f<5e60a22b24`20l?4ID�L@“d[•`V˜`Z•\K´„zÀ”ŒÔ¿¼ÜÇÊÔ¯¶‚57’RK”WU—YZ‘RQ™XU–SJ¦nh¯uqÉ¢œÖ°¨Ú¶°àÅÇÖ°µÍŸ¥Íœ˜¹~½�{Ê�›Í¦£Î¡œÓ¬©Û¹³àÈÆæÔ×éרçÕÖéÚÞìÜâêÜâêÙßêÚÚéÖØçÕÔê×ÚêÙÜéÒÐåÐÑèÎÍæÓÐêÖÜèרåÍÑàÈÉÝÀÂÙ­©Ò§«Ð�žÅ‹‡À‚yÀ„}¿‚�¿~‚¿ƒ¹xkÀ†z¼ƒ|°km·tk«ii¯hXµpk¯i`¯o_¹€r¿…yÀ‰~ÇŽ‚È“Œ¿„|•nl>2,#*9I@/1:''O?>E+-+  +   !!#*,?('D-)C00?'$8"7!6#8#"9" 334=#; > =#C*$G+#G-&K*$H)$F&#O-*K.)P*$M+'Q/+]8-V82R1)N1*E((E&">='!?%#:!D$@% J'V3,X4/\94i@:f<8P)"Q+"O&"K+#W50^84gB;~UT„\Všpl¤xp«…Фu}§„™pq|EBh<:b1._/-_41f;8i;8LH�JBŽ\S’\U“ZQŽYN¯}l»Œ|д²ÚÃÆØ¹¿“OS lc©yz¨sy¡fi›_`š^Z«md¯zr¹…{Ô±§Ö¯£ÝÁ¾Õ¯¯Ð©¬Õ¥¤Êš˜È’�É’”ÊŸ–Ï¥šÓ¯®Ú¾ºáÆÂâÌÌæÔÕèÖÔéÛÝëÛâìÛãëÝäéÚÛæÔÙåÓÒèÖÚéÖÙèÒÔåÐÓçÑÑèÒÖèÓÔæÒÏäÊÏãËÐáÊÊܹ¼Ó¤¦Ì›™Ç�„¼xoÁ‚yÀ„�À‚€À�y¹te¿‚z½�x®d]®dX¨bX¯k_²mg¬fT°pf¼ƒsÀ†�½†È“ŽÅ’�¼Œ…`KF','#,9IA=LD)4%'2'+7)4B7 *"+"#3')"( ."!1#!0# / 1!*+&''# %#!&.!"4$%6(-$%#3++($"+%T3:M+.G$'D @96CEI@;/ 3P*/lDNmEYjET],8JEJ\)-c.5b#&X$TX&'W 'NILU[M5     +   +  ")/*3 9%!<*'>-,9(+6%#=,,A,-# + +    )()7&&?,-A.-:$ 6" :%!7#$4""21-15 6 47;# A(!H)'H(%F'%G'$I)#N.%K)#H*$H-)V4/M.(J-'Q-&F&!?!=!:"7">#=$E+%J/(Y6-d?3|XUƒ]`|POd65`90_8-\3,[56_;5h@:sJH~ON‹cX�ts¢ytª€…œv{¤}{štqp?@b33]-(_21f60k=9yF@yGB�MFˆ^YˆQN‰QJ—fT¥woÙ™Õ¹»Øº¾´w{“XTša^±|�®{y¯vq¡f`«wo³�uÀ�‹É›™Õµ¦Û¹¶Ú²´Ö³­Û·¹Øµ´Ù¶´×±®Ù²ªØµ´Ú»·áÉÌàÉÊâÍÐæÕÚæÕÙêÙÝëÜáìÜßìÞãëÜáëÚáéÙÜçÖÚè×ÛéÖÖåÑ׿ÐÏçÑÕåÍÌäÌÎåÈÌßÄÅÞÂÁ×±±Ê˜™Â‹‹¿wy¼�{À„{Á‡€ÃŠˆ¾ƒ€ºvt¹zvµtl´so§[Q£\Q«hZ´sf­i`µyo¸zp¼~uÀŽ�Ã�‡Ã—“‹ko),!#1%6B32@3*8+#1.=.4@/8F36G=1C5+<..$##)!-"1#%7'"0 0," )%-!(4%(5)%,!$,*0(" """)#2"'8+):)( *(( #0&Q6?G(0G(*B&%8:@H DE1( * + W22f>E_AMfBLc3?JGET "]%*a$%VQS!!Y+/MHHSYU(       + !)*',2$#9(#;(&5" 8&'-- + +       $('1!$>&$7110 2.0-024765=!@#D)$E&!D)$? I$C# E%N,#N**Q3.D&"E#F(&F%#A$@$$@)#;%">$E($J+ T5/jE?zUMˆaeŠddˆ\[|USk?;nA;mCdDO_7AV!(AEGU$%T#&[ !QRU&(V"'DAKWYI       "'(,+/"4'&:%$3! 3"!)% + +  +   + +%()3$#:%"3.31!0 /,)/.67 96<#"?$$E' D%"G)&;B"B#G% I*%I+(J/)C&&B#>&#E'$@#=$"G/*?$ >#N/#Q1'\::hA9sNI{Z^‡djƒ]\ƒUNrIEoE@oLEn?9mA@lHCzMK|RO‚VW�ce–jd–rs¢tužwwœx€“hpƒU[a-*a1,c2.k<7rA:sC@yJCƒPDˆUN‰WSŽ][“fb¦{r™“ʤ˜Á�£Ÿik˜ZU’XO¢ha©ll±}y®z|¥pm­}yÇ�˜Í¨¢Ü¼°äÍÍãÍÒàÅÉÛ¾ÁܼºÝ»¼Ý½½âÆÄâÑÏæÒÓåÐÒãÐÎåÕÓçÓÑæÒÖéÚÝêØÝèÚÜêÜÝêÛàçÙÝçÖÛèÖÛèÖÕåÓ×åÏÐäÌÍãÇÅáÆÄàÁ»Ø´´×²­Ó¤©Î™›Í™žÊ˜—Å�‹À†{º�}À‡…¾…~¶rd½�t¾~y³pe¥`V—UN¡fZ«md«nfªk_°ri´vk´|r·’†™{{!$&$-'$3&*&*"2")800=./=0(0%,#,"##!/$#1##4+%5'(5#*,( .%*(6).=3-=1'3 />+,:1%!+! ,")/B7%5$- D<5SHPGCGN$"NXUOS(%U+-O DHQVT#   +  +   + "$&(+1#/ *++#  + +  + + + +  $''0!"4 4-2!"3!#0.**-156948!<#B'#?# >%!;=B"F' E*%G($?%#: ;>!;$!<#D'!G+$H/%dLIkJJjHLb?=`@:jFC{TO„YXˆ\^}[c€X\yONoD=nFEtMKpJFrFCrKC}SP„[_ˆda˜ihžt{œsu u{Ÿvx˜qu‚KJh6/g66d/)h52m;7uC8{E?}LD~QJ‡WMŽZU�lf¯…xÁ“–Ȧ¤¦rs’TVƒG;ŠMI•YS¦ng®{u´„€½�‡Æš˜Èž—Öµ®ß¿¹ÜÀ¾Ú¹µÙº¹Ü¹ºÛ¸¶Ú½¾ßÃÃÝÅÇ߯ÃàÅÇâÌÍäÒÐæÒÓèÕØèÙÙçÖÙèÖÙèØÚèÙÛæ×ÛäÐÕæÐÑæÎÐãÍÓâÊÌãËÈßÀÂßÃÂݺ½Ò¥ŸÎ�šÄ†„À†xÀ†}»~x»‚yº~r¿‹~Æ‘�À††¶tu²pbµyn«ojœ`Vœb[ jeªpcžd_™\T«pj¬wsµŠˆsTN72* &!'%#$$!/!"1")#+ 1"., - . (.$ -*:.,=.&("3'%/#/:+:G:/F>-;.1>4$6."6.$8.('5+&7/ -##F:5M6;A JMK=3& + FV/2_AEcALS (=BFO KNNKM""O'*N#"@FLX#!M0           + + +   ""$)0 /++*  + +   + + +  + $&(8()- / 0 4 / 0.,'(0/.13!:%!;#;# 5465: @#?'$;$7# 488"@#?$!H,$A%F,%dF?pQOxYY|XUrNRvTO|Y_}VZ{XR~\[ZY}WStMDnLMlGItNPrEDwIDyJ@zNI�WW‹af–ge˜jgžuyšx{šuz‘bgyEAi33`,"]&$a-'e84wGCGB|NJxNM|VS�ZRŸph¯ƒwŸ˜µ‡‰›gj�E@zD9yF;•\JŸaZ¥md³†׎ɟ Ï¨¡Ò«ªÑªªÑ¥�Ï¢¢Ò«ª×¯ªÙ³·Ù¼½àÈÈàÅÈÞÇÆáÊÉãËÎãÎÏçÖ×åÐÕãÏÓäÏÎåÒÓäÐÒáÊËßÅÅáÆÂàÄÇØººØ´­Ôª£Ò¬¦Ñ« Ð£¥Ì˜˜Ç�‡»|tµwr°rk¬nc±ne¯lc·zn»yu·yr¸uo´{r²{u°rm f[¡ia¡ja£jd¢g_¨mf­y¯€~zXN %$! '(!3& ,%'#),. / -=+'7%$8$"1!'6((7&&6%3F62F;*#1#$7+",!"."/@31E8"0%!.#)"$4( /''-!)"'"3+%D64>IOF6* $ =T*(T/5_CG`8DF<>P!KLVNGR((R#&K!8DKT <        +  + + +  #! !$/!,'(! +  +  + +  + + +&''1"%,0!!212 .+*%(,0-159#!:#<#62068 =$<#9366!9">$!>&!C'!;!D+#S6-eFBmLLtTQqSNrRT|VTƒaf~\Z‚]d}XY|XVuNIsMImLNuKPpFIpHMzKH{QS€QP†ZZ’c^–jhœr{�rxšrv•hm‡X_wABc)!_&"a.)i2+o=7w?:zLEuIE|NKŒ[R—g`¤um¼“‘¶‰�£pt}A>uA>xD<…LH–^\�g^©yw»��–ŒÎ«¦Ð¬§Ì£ Ì •ͦ£Í§©Ó±¬Ø¶³Ù¼·áÈÈàÆÊáÈÇâËÍãÎÐåÑÕäÐÓäÎÏãÊÌåÍÍåÐÏâÉÉÜÅÉÞÄÅàÈÈÜÂÃÖ¸¶Ö´­Ð¦žÎ¥¢Î¦¢Í£ Ä�†Á‡…¸~o±uo¬sn¬oh°ob®ne±qe¶qh´qi´qa±sm®tj¤hb g^ icžf`¥n_¤ja¯zo¤ws’jd?3'$%# %% 3$#/%"/%+!* .+&))7&,;*&4%2#*8),;((9*-=-'9* ,*8();*$3'),:*1D;+(,!+#&&*($%%+-$(#AL L!$;) + $ ' M))M&+^=>[4AM#?9DIIJO<DV/.L"!A/<>.       + +  + !! "!)*(# +    $',2-!. / -.,#!%(+0-/.6# :&"7 /.049;"63256;>!?&8<#A'#D*$R79Z;;mNOwTVvWY|[atOS�]`Œkt…`e}[^yPMvNKrKPjA?vOPvLMoJIoJMvOH{QO„Z\Še_“imžmu�rv˜kp’ba�]Xk22_'#c*#d-(d3,m;2vF?tEFvI=�RCŽ_U™g]¬‡�º��¯„ˆŠLExA;y@3tA5„M@ŠSJ›iY¤ws¨€yÆŸ�Í¢žÈ�–ב—’‘ŠË šÓ­§Ø´®Û»¼Ü½¼ÞÄÁÞÊÄáËÎàÈËâÈÌß¿¶ßÇÁâÎÐàÌÌãÏÒàÊÍÝÅÇßÉÌáËÌÛÆÄÚ¹¶Ï£¡Ó²¯Ó±¯Ð§§Æ��Â‘Ž»†�¹{²tp±uo¬oj«nh²rg´ut²tm£]T¤h^§jf¡hcœaZ—ZQ˜_QšcU˜\RžnfF6-$" ,'%"*#, +!#((&.#3%"1& +)<)1G8)6)-!*!/(6*!1(4@.6C10=,"0!($.);+'9' 2&!3$0C5*>4#3%- (( -")"!%$#!+0,32.1( HJ"A,$ ! G""G!"R38]5r=5zH;}H=Ž]S©wn°ƒ}¿—’Èž‘Äž”š™½Žˆ¹‡ƒ¿•™É ™Ïª¦Ô³³Ö¸¸Ø¾¾ÜÄÄÜÆÃÞÅÂ߯ËÝÀ»Ü½¹ÜÃÊÖ¼½Ö¸·×¾¾ÚÈÆßÉËßÊÏßÌÏØ½¼Ë›•Ò°­Ô¸·È «Â’“ÀŽ�À‹Œ½�‡½�‡°{t¤kd f\–WRž\O”XS¥nc¯~r²€x«tgšbZŠOE•cV�]SŠ\PK?5+ &/"+ "%2#-9("-!$%)7(+"&!%5!,D: .%&&) 0!4$ ,!)&1.7'/;*'2,*;)6K@6G7&6"#6#,<',<-+9+"1('"!-! -)("-$$1,&$'")&'*#,*$2" JD8) $ +H!!K,0X=DW-:<5@DAGDB>B!#N)'P""LK5   +  +    +    +    #!"         +   '0-,-,*)$! "%%)+(-6#"2.'&.022,,+,19 7!3225;& D+(H-,R31eGCkNLvTN~VXZb{UT’nk•ru{U]wQJtPLnIDpHHgBCpIGsFAuFBwNK€RO€RQ‰^X“fi•fk™kp›je”ei�]d}IIq93i3-d60h:1i;/kD?nB:qGBrNHRL�e[¦€z«€›jkwF>zD9xA4sB7r@4‡RL¥sj­}~¾•ŽÄ�“Æ¢–ÇŸ›¿–•»Ž�Äž›Ì«©Ò³²Õ¸µÚ¼½ÚÂÀÜÅÁÚÃÃÛÃÆÛÁÃÚ¿ºØ¸³Ö½½Ð±²Ð²µÖ¾ÂÚÄÇÜÆÇâËÐßÊÎÜÅÇÏ«§Ð³±Õ¸¿Ç𛹅‡½†vÀŒŠ¼�‡º…~«qo™_S�VK�UK–XK•ZS¥i`­€y«|s¦lh™a]†PH›k^ŒdUsRJ'((+3"*4%"-#-;,5C24C7'$#2$)$! +%8+/%&'*$2 %7' -#!&",,9*-8#/;*8F/ARB@PE$4!!0&5#&6!(6&$5)*'!."/".%,!$,%.%"!# 3" ?G 30! + +2A<XAJZH$*P#"FNC        +    !   !    + +   +   ').,+**%" #&)*(+)%"!&)"%$%&+.20-,0766"#D)(B)(F+)\<8`A>iHHy^d|]b}Z^{YX‚b`œ|}‚]btPRgA@lCEkD?lGBtGFzIFwJE|QR|NO~QQƒXS�`Yœnnšff–feŽekŒa_�ROr=9i62f5/j:/l>4jA:nB9sIAvJA„YG•kcžqc™jbtF‚JB†WH�on¬}p¿˜”Ê«¬Î®«Ôµ±Í²®Ñ±²Ö½ºÖÀ¿ÖÀÃØ¾¿Ú»³ÚÀ½ØÅÆÓ´ºÓ³¸Ø·³×½¾Õ¿Áб¶Æ¤›Éª£Òµ³Ù¿ÂÜ¿¾ÜÄÅÚÄÈÙ¼»Óµ½Ó»ÁÔ¶¼À’�³}q±wk¶~r»‘‰½’’±�§qeœf\”ZLˆNB…JC˜f[˜eV”^S™hc“aU•g^}YM82+  (1",2"9>2NWQJUIP]S5E>!0%&&)#0!'6,$!* 0#0(0""#- 08*@J:GRACS>7F:*$) 0#'6(,?2%8)!2)!0#2*) !!"BC6* & % + D<O34V9AK")9 BB;>>:87E&$H#L !J: +  +       +  + +     "   +   +   +   + *+*)(()$!%$##)&    !!&((..233077 859" >$!C%%K.*Q66\?:mKIoKLsTO~`_}^Wˆehšz}•trxOUi@De<4lH@qF9}J>„UKŽaTšoc¨ƒ~”c]†OJ~G:�_U˜l`œpm¨woª}n«‚z»�‡½—�È¢¡Æ¤¢¿Ÿ›Ï±´Ó¶µÕ¹ºÕ¸¶Ú½½ÛÁ¼ÝÇÇÓº½Ì®®Ï°²Î´³Ñ´³Ì¬±Å¡–ɬ©Î²®Ò¹¸×¹½Ù¿ÂÒµ½Î±±Ï¹¿Î¯µÉªª±{sŸcW•aR¡sk£qk§um©uk¥og¦ni›fd‚GBƒKDˆRA‰YLŠ]RLDsJ?lJB""%*3%%0%&# )%.#*/(/!("/'2%,>2 1#"0-%(%/ !$($$1$4A0FRIFPH@G31;'%$!2'!1!,&4),!0%%6((    ##%A?0' ( /C=V;AL+2@8 @>>:> :2:E$J!MF! +    +   + + + +  + + +  + + + +      # "   +  +    ''''**+$!## ###)    #(*.-223663787B$=#";@!M.*M//W;:cFIhNOvTQ}^[ƒc^ƒae“ke”oq‹kjlDIi=;oB>nG?{MLsGGwKHyMLyMI|NKˆ][‘e`�khžph£us�nk’b`vGDo>sB6yQI{TK„YOšshŸ}r¡yt¦}v™f`Œ\W€E9‹[T�cQ¡}r§yq¦|oª~t´ƒ{·‘ŽÁ�˜Á •£ Ë®­Ï¬¬Ð³­Õ·±Ù¾½ÜÄÆÛÇÉжºË®±Î¯­Ï°¯Î¯®È§«É¦¢Ê©¦É­¨Ò´µÔ¶µÒ¶·Ð´µÑ´°Ð²±Î°­Æžš¬ytšg_�YT�[U—f`œka qeŸje¤mc”[S}D:{G;‚OF‚TI|OHrA3`D76+'   !,6,,9+!'+6/ '$'#/!*;.*9)!- %(# $'#$/>-6F4?KB:H>1>.7A*!.)$/$%3#!. , " , *96 =;6<7 62<BI''J@+  + + +         +  +   + + +  + +$#  + + + +     #%$%%'%  "&,,2 &!+-/.57;<>"C" = <# 76 8;"!75A$$D,*K-&T61\=?_BBoMLwTTyUV�ZW‰f_’kjŠij†chƒX\f=;`<}NH~OHˆ]\’eeškcŸrr¥xvšmk‘e_�cY…WRŽf^’ib’jg’mf˜tm¥|t±Œ‰²‹‡¸“Œ®ˆˆ¨xr‰PGI<ŠUK•nc¡zo©}v³’�º•“»™šÆ«¥Ç«£Æ¥˜È¤ŸÍ©¯Ð±±Ñ¹·Ö¿¿Ø¾ÂÓ´³É­¨Êª­Ë«¬Ê¬­É¦¥Ã�š¼—’½•”—“È£¥Í©ªÊ§ª¿š–ÆŸžÊ¬«Í«¦Ì¯±À˜˜©qj¥od¡rl¡uj™kiŽ]OŒPD�SK’YXxD;g;2n=4d:,b;4Y?/    ' (+6'4:2 *)!#.,('-" "$,"!.'4C:?L=;H;4D8&3+".!5D28G=*7)$4%2?1.>6( !2.):1/#,"# &!-(*('">6.) />FF%$R77G")57B8;6 . - .?!#G##L&&@9         +    #  +     +    "#$%)'"  $!)=(,8 >&"A-)G/)H20F)(E*+B+*A))D++J0+G.0@,/<##?'%:$%6=!1gC7lA4jH7M:.%# - ,91$4*$0 4E80?5&/>0/?6+%$+>-->+!#+0(&5+3C909+/;+=I7(91!-%$1":LA5E6$1* , %0$'89)"*:5#0.%* 0,+*-$#/&<0()9CDK0-O35A:=DB:2 . ,2F%%J$%H$%8%  +# !          !$   +  +        #"""(%($  +$(#!/?)):#"9#!;%&E-&O97P86J45H/-I14J/1?)'N16E,-H,)>(%:%&;;: ;>"#F($I/.S22T52\95_AAfIJvQS€\]‚^`‚]_‰egŒgk„[[nJKfA7k=>pFBuD=zML}NMzLF~PN�WU…YT‡_\•pm¢zx¨‚€–khŠ\ZxLA|LHzUO‰_Zšjf™kd�usª†~¯Š‡³‘Š´‘‹¸•–¹šœ·”�º™—ºžšµ’”°�ˆ©ŒŒ³ŽŽ¹“’À¡•Å¥¢Á�œ¿™•À•�Æ¡™Ó½ÁÕ»ÂÔ¹¼Ì°²Æ¢©ÃŸžÄœšÀ˜‘¾—“Á—�Ê««É¬°Å¤§Ê®³Ç¨¨¿˜•Áž�Û–Æ –»”’°||¡lbžmc›i_ pd²Œ�±†‚ŠVMoA5o<0R,#a<2`=4aD4C8(++#&'"#"'0;5(9-%1#4B75F>,6)-?3+;."0'&!+<&.B/"0$ )$ ("2+*:/&0 -=)BQB5E<)70".%;JF8H<$,#$*'6*,;4/=3!/*%+''"%!(6-*,DH! F%&O56 / . /2=" E%"E%#B +      $ #  !  $    +   +  + +  ###"  +  + $7'&;*/:))=)*>(%@(%A/.I20H21I8;L79N;4ˆ`X‹d^|PIY833&+'%+'4('8+*6'!( &,"&!%%)$)"-$1@:,80!$0&@?-,2)!"#!',"-90+<4!2'!'$2!#0 "+#!"05$C5%., $$3B4;JE#5- &!.*!5=gMKvSL|[Y‡`g�`[�YS‚_V�c[Šfa—qt™vpœy{Ÿz{¡€Ÿ{}¥~|´’•³‹’´�“´‘Ž»›Ÿ±Ž�žuu”hj‡ZL€SOƒVJ�VMˆfaˆ_U’ol‹ke†jeŽoi•tl›{u¥‡Š±•š´›™½¥£¿ ¥¼œ�¾¡ŸÁ œÀž—Ë©¬Ñ¸ºÓ¸¼È§¦¸��©ysŒ`YpC5tG>rI>�XN‰fV˜tl«‹Œ°’”›oj�pg¤sn™lcšif rk®†x¤€�œtrxRO`92pJC�`XzSKb?:.&/#$% )%2&  *"+$)#'$4) 0)$@6)=/.% !! *5/.A8(>7% ",%2'(2&D7*76&)-%",.C83G@%80#)<9-) 4-.7" 1.'<5.F',:A964 4 /2208# B%$H#4      !"!    +  + +  :,-8'%8'%<+*;''?,-?12=-0A0/M52I6=Q77N99O66I/0K12F19H0/G02L03I0+I-/D*&E'#E&$<#%>'"C)$F0,I/*P56R94V>9X;9_E=fKEvOHZTuPNgB9pJIvSP‡``’he—lj¢yy¡}z§…‚ª¯��¯Ž�²Ž�®�Œ°‹Ž²’“µ“›°�Ž¥{{‡[Y‚SX…YM‹bY�f\šumœxwŸ{wŸ�z †„ž…}Ÿ…Š«ˆ†­Ž�µ–“¶““·“’º—”¿ŸŸÄ£¡Ï³³É©¬Áž�¼š–µ’�šrmrHBc@6jF@{WD…_\ˆif¢€x¨…‰˜wy€XV�RJƒ\WŠ^U“g\˜ti’j`‰b[ˆ_Ya@9T7,`F=H3-(%"&&2%!.))&)3".=-,$ -%4)%!"#   2*B7);2&6)/&,%-! , -)7(&$'*&!+,;1 +#')!(*5;4:E85B0(5*.:*6C54F;'#'9+#3,!-)#!#' 669&$<51C.0?B;43 6/1-+2 8! J*$;)'+#!+ &     !# &  +>118()3%'5(+>02>+1@.*@,)B/.D/0G14I8=P?AQ==O8;O6:L6:N45U;6O54R1-S:8O46I-+K+)I-+C(&B)#I/)O1-N2*P4/S52Z=;^?AcDBmGBnIBc@9fC>iHErLEƒ][‰aaŽh`šsv }y¤€‚¨u­‡~¯Œ�°��·•“¹›�¸›�Â¥§Å¦ª½ £¹˜�£unœsm¤}y«ˆˆ¯’“´—˜¼¤¦·š¡´˜–ª�Œ©„{¤‚�›xw¯‡ƒ¯‹ˆ·‘ŠÂ§¢Ç¬¨È­ª¿�Ÿ»™˜¿¥£_8=@7< N2'b?2tND�WN�ibXP{SFc@9\86]83hA6xQE}TEyOAwSLgIFI5,"&%()5-"2**,%5&,?2!/%%0&*")1",:1("%$,$ +"   '!+", *-"##" , %/"(1'#-%#$#,=B7EE?41!+,%'( )#<9.F?7-0)) .!,:*/B8*83!1')!. (8-"/+%.&? ;!5!&)"E65A)*=D <81 / 10 #-,7! ;"!N,%1&"(5)+%   !"+!1&#% +<00<))1 3$*:(+:&&?**8('8'':&&;'$A-*G24I65S:8M9jE?iD>a=4Y70H0)S60^<5eE;uOBxQIlG7aI>SD;**#, !-.<-'4(&5(!-"."(7, -!!&'9) 1'=I9DTQ6C@'94"1) ,! /% /+ + )'&%   ," (1%(1%(-( $*;@5A@43. #&## 2%81'99''5)*9+1F38J?.C?$6*)$2#1B6!+ (C&"3*'(&?>,)=+'?*)=,+?*(C)(K43L97P:9X>@X@AT??[AB\DE^B?\C?`GGY6kJAoIEzRKYRˆ`X†d]‘kkšws�xu­‹�µ“‘¼Ÿ�Á§§Ä¨§Ä©­Á¡¡¾ž–¶•“²“Š´•’·™–»ž »žœÀ©«È²½Ë·¹Á©°™mn—odŸui�vs wrª‚|¯��«‹Ž°Ž‹ª‹��v{A !  'U?7cFAmI<|YQ…`[~bb_E>[?4lQDhGC[A4bHCuQJ{\SlMFLA9%-$*$$-&0%3#+8(,9'/=5,-" ( 0#/%*#4)/;4&/( -6A18H6+;4(9-+:0 .+ -  " #! "'"*%& !*#(4(#/ $3,& ) )93 .'%+!*09,8L<>PF6F81A*0B.!4$0 3C8>UK'2,("F1-9@1=A2L85B%%? A5/ /1'#&'"+ +&8#G,&<*!!$'"(         $$*! ,! ,+#"* ((!1($7(%6'(=2/>01@229)*6)+:*-5%'7*(:*):'&>*(=+*;'';')<&)D0-A1,I52P95O:8WCBVC=[BAaF?dIGeKKdDB]B=X=>R52I2.M34O52U73U84Y>5aA8a?7\<9cB<`C9bC8d@7gE>nIIrMGzSK~ZW‡eb�hc—wzœ{v¤†‚¨‘ޱ’˜´“’¶œ›º––¸™•µ”�ª‹†©†„°�Œ­�‹µ˜•À§©Å¯²Ä¬¨©ˆ€§…~¬‹„§…¦{v§ƒ|ªƒw§‡� |‘kfqIII%%-7X=0€^Y}]U{X[†ba’i_‰d^P.*eH:bUjMIbEC]E?U=5A<:9@9$ *5C=7AA(1'(%"'* .#'5#"2&*##' )'!1!'5&(9-+$-)'%  "(!*#/$ + )#($*&)&(!+/!-!'8-.)&!6- ."#((%0')7,,<5!2 +)+:'1@9,:2' %C8/=D8DF8K01D%%A!";30 .41(!&!'!)+# 9%H-)1+'$&#$+!)"*8,$-%$ !&         (!/$",#!/&',&$/#)!)!. 9)'=./>-*@21@12;-+6'*8,.7)(8*':)&:)(=)*:))?-/B.2?0.@.+D1-J74N;>UAAXDCWF@YFCaIJ_JKcHJdJG^B?X=>Q79U73O43V;9Y<=_A?b@8hD@dC?iH>fE8.62%)!0&%4#*9.#3,%$$"-$0!)7&+ "(#&&#  )#,"#.)(&& , /& ,#',($3))###62!/&*(&  %'+;3&6. /$).>0/;1"/(%) ,+8:/E9:^EF`KM^LJ`KI^CC^D=fQLpONhLPhOHmQNfJGlNKkJFkMLkK^A;^D?cB:e@7gI>\@7^A:[<6J1,D.'G>3"()"1$#"!*!#-'$"%" .$!+ #',%*"(')%4" ,#' "%%$   + +     "($2*#1$"3+#++!,"&" +".'((  "4) 2+&$0?52>5) !+"-%B:1H31P2.C73 1 .+/)'%/&"1'!)!-9/%((#)*'#2% + !!.#&0(!. %/%)!$4)#0$"2'%#)+5*&0 !+#2!%7* . .!,"##$%%/&  (19)*'")"$        !$ !"" !(+ 0%#8+)2(*6'!2$"0&%5)'7*(7+*6&%7(':+':**7)*9(&9..;/,=,'D30D57J5.K56P<;YE?\GF\DA[D>WE=[E?^II_FDUBBP:4P83\>7\@>aDAjLCoPOjLEhJFkKGpNCpOJpRLxYTqTNsRJuTFsQGtUFxWOzXS^X†f^ˆg^Šd`‰h_�ga–nb–rh˜pe—n[žua©~o¯Š®�‹šolŽg[�k]Ÿtfª‰�¤††‡_ZuQK[;14%*aI?aE;J60@0*B,&C+"K6/F2,7"2"0!-!68&4<,#*"&#2*" &!. )  ! &,"%!-#",('7&!/$(  + +    & '0&/%!#2"$7+-&($&!-&#(' $+$$62+##+"4( 1'%,)@73I3/M119021 +!&%5)(5,+%'+&&'8$(9+#%4+!1(&!( %!)$3$'$)!/"("+"*7+'.!#$.$2&+!-#."!""- ,!  %(2$;;.=4+E7,E1*(        """# %"!"!'(1&%/$#5,(5'$5($3)&5)(4(&5'#5'"1%"6'%2'&:+2:,(<.)H43K74F41E32N;7M>9UA=TB>[HF]FCbIHeJG]IJZFFT:4M43Q86T77Y=9]B=aG?fG@iLHlKHhKCjLEpRKxWOyZWtUKxVLpMBjL@tOFnOKuRK‚^UyYO{YQ€[R‹\PŽcWŽg[šneŸrc£~s­‡«ˆ{¦…‡•rsŠd`�f\™zk {v‹ggqSL_@34! A1#S;4G2+7' ,*.$.*$'%"/7&3A0$3(!.$ + *"$  !(%2&'    #$2)%2'#0)%"'#   + $" ))6&!.-;,&6/"2%  + + *%2+*&5%)9)"3) -&###/%!/!"!*+%!) !2,,&'.$2& -!$.#5**-!I86P4/E##;;6 -"!)!/$(1!%.()!$3"%3#+#* '5*-:- "48!.;)%- &+&7'3B93B3*=.$/"!-&/"/"0 &)#0 + "(6)(7'&/") &1%)1*.-( !""            !#%& &#&%,#"*! +# -$4'$7+&:*'7)(4'#8)"2&!0#5& 1$!2& 4$#9(#6*'>-*B0.F0.M:8XB:ZA8cGAdF@jJCsQLxTN}YRvYPvXU|YKqRMxTLrRJoODlPIqIBrKB{QG�YT�eT”qdŸ~s¥‚yžtq�f_zTN†^V“ro„`TsNHQ98,  .$2%,!*!%'03>'4>/,4$)3%(5,.?;&!  .>0/?1'4" ,&5$$5')"$!!" ## &!- '4$'5"+8%8KF->8-&&1&&4&"2#+ )$"$*$%$' -")'$3''9,1,-<0)7$#9653$"$()",#(,""$$%#&1*29*#*+4>)3;.&*!&)(2+)1'1A15F;#/$,*!**%0")*-#&'6)4A9'2$(!!1'(:3&1(' ' #" %))$%&! #)3.#%       +  !#()$'*,!+ )2$!0$ 3("3%5'"5'"3'#6(";)#8*&6%$7'$7%#6)#8)$9)$B-*B0)G10F2+M83P:9O98Q8=P<:T=:U@8\@8`D@`D@\=9Z<4S40P52L0,L1(P6.P62P52[?4_>7gF:lI>lI?iEFoF:sK?rK?tNG‚`ZˆeY‹k_ƒcb|UMwRKuRG~ZMˆc[•kT˜qhœxv˜rn�g]�kZ€\XxQGeIDQ?;A2( %"'$%!! "#!"+$"  %%2#(6%,:()5&+   + + +   " , $#    #0""1&&$'$3'8+&82(4/1?<5F>*9./*#(98'4)"2$)$*$&-"0BQALb`.:0%'. 1'- ###(!(/-)-%+<9:2 ' &' ) ".%&(%& $' %'-1!.2#&* ! #"'1%.3'$2#$3# ,#).'2*%.! ++ ),9.,8/+" )5-5@5)2(!-%!+($)&#*+"*!-"3/#02'%)$%.5-"(&    + +    #$' * &+" *!'.. * ,3%#9+%1%"8'%8)!5&#=*)9%#6$%8+(<*%:,'@+'A0*E10F1/I3-E2.K4/H51D2.E53G3.Q63O5,T:7R72U81S77L1*H0-D.)J2+K3-M3)O82U73V:1^8+b@7jD?nG3=A/ ' #"-#*"-#(3-(% + *+)4'"/!(   +  +    $,)!"     %#%(('*622B9/?/, )%#(<8 -( .$ +((%(%4'9K6H]U.>3+$,-$2" /$')&   #$"+1:;=.$.%%-##' &()!*( $(%! "/5(29+#)&/ -9($*%(-!##-!+",$$.'+!+!$!$&.8/.=4BRIJ[Q@IB,-%-*C1)D/'D1*H20F2.F2/E3)C/)C/.F.(E+&@.%E.'I0&R60M3.M5+O3-N5-I4,M5.R3*T5+W<4U<1^C:cF=tVOx^XŠjfš{x™upŠbX‚UK|QFvJ?xMB~SG‚^R–sq™wy„fc�uo�tn†klkPIVD6=C2,5)3:/*8$!0$$3(('!$1&%1("%%!    "* $3"&#)   + +  + + +  + "%  % 1**  + +   '$!#0% ,!((+ 3#,%)$0+#)"*$""(!/$:F4CQ<:J=)94'7-#3(-!)));)(6*,$' %#( 28==2-! (*" !%   (.!!'+(1" %$-&4#:D3)4)#1!&!%#)4GA)$&"'8A7(0'", -@/DPGGXKDRE(40"-'"+!+=1?OD6?0"!#%-%(9*(5,'!(8, +$#6*:LD9MM,<5)8-)7-&3+" (#$%#)%&)+)- ,2"1#0##3"7%#4%&4&"5(#4'%8'!:(!<,&<+'A.(A0+>-'H0*B.(D/);)">-*<(!C/&E1(L83J73K4/P74U;9S=8U:6R94T94R:5U<5`E=eLCpUT{]TŠne�rj…\WuH;nMAhG;c@:iI@xOG…d[‚\R†e\“tp†dd{[[M>7GM?>G;=L=:I:3C45D6*;,$6%/ .$2&%5*&2$, %    (+$$6+->9+=7%4'%6+&2(#1($      -!$*/#&4)&    + #&4&$#% !2)""(#'  ,;-(7'%4' "(/!)$$( 1*#"**#-$8==;,1%91$72#$%$$& &,5$#-%( !) ''/&5)3C3%1#!/ &(%*& 2$->1()&(6D9&3' *,,>5(71#0) *  !""&#$&('#$'))+, *02 .!0"5%2'$5&%9&8' 8)$8(%;+'>+#D.+C/*A-)>-)A-(@+)>+"B-$H5/L5.P7/P94Q:3T;7R:2Q91V:1W>:YB;^C8nRJw]W€d[�toˆc`xPLpH=kHCeF>dD;mL>tRKrNJ~aX…li†e_lSLP?;+-!3=(:E/>J7=OA6C40?*9L92E2&7'#6!*:#+9),=1&4*&4' /%#1A28D6,?15E;/A1,?1(7/%60".$#&#"   ++"'' , .&!+8#+=1#0 &2 -" !&5" ,"$%+&91 ,+#" % +"- &%$$#1#!1#&#/(#/$,%*#-AIA%,*0""&)')PA6B2#(()  '4''0% *#/"#/#)6&#*8I89LD%3*#*"&!$+!) - !.& ,')#&3+%* #2(%/(&4$7K?#+#!.##/"-=3$6-'+# -"(5*-8,!)%) ((!,&!0&+$$4+"2,)7.#/-1+&5+"4+%5,+''"%#*# (!!$"##!$$(#%$%)$%'()',* 0"1!2"3(!3("8($:)%>-$<+&>-(<-,=*%;.+A/,A/+F/(D02C//L70O80R:1Q<2R<,U<1]@6]@8cB7hC9uME{[Q~dgw]VnQLhGA_E?_D;aF:^B7\<1_F<_K@^C2G>17;,5:+0<.5;->@3/8)4<(-5!&2D[YCUN3H36E10D.(9&(6%,9,;J:>NI1A8 ."#,DR?M]H;K=$1#,4/)72#3*"1+" " +  ,)7&!/&.#*'2 4A28F44F5)7($4$!-!!/#+"'"&5%,7#"/ &$/#3F3#1) -!,%!1&2>26B3-=-*6,)!/&&8.",'%!-9/)7.+&$"$75%56$74 20+=1-=6"/&*!0'"/(+ ($!!!"!## %%%(&*),#-!!, 1&1%2$ 0"1"2'#8)$4'!9*"8)":,"=.'=*#B-%B2'D/)I4-D.'L5/X?3bD:jI@lOIgH<`C9`B=G0(E.*C0'B-$:+$C1)G:1C?6,.&(,:-0;1(7.!-$ 0#!,#$-)'0=04G;):/>M?CRB1?.#2"&5&8JA2E8'6)#0-"/" .$2#+:'9QD(8/( "##1&0?5# '    +  "!-'" &)8+%6,'$''(! ,"$2 #2".;):I=1A10#,8,/>7&5+%74")($ *" (&" ,#2( 0#)!-%7/%1!#0!)!$!!$)#>!:&+*)D;3B6/&3&/*#!&( 1(.<,-?2 -",%(8+)8,&+#0&%/C70;0$ 0(-=5"/'"& !('%) '$6):M=E\P>QG6G:(4+-"/$'"3#5I;;I;9F:*7/%, 2C<097(+)(0(!+%#%!10!3/ 20#1+,<-*=4$0' /(&3,"+#&!+"    !! !"!&(&)*)+-. 0".!1"2''0$!9-%5%7&#;*'=*!=)"B/(B.%B,'8%G.%O8.X?2^G=`E>]?8R7+K0)7( 9$8%4'<- A3(>6+@ON+71$+"#+%&$$!& ! .#+=3$6-,<-:I85E9);2-=,3E5.B4/ $6#&<."2%($2!'8*7M@8KC3D9)1*$2&5CB'#$.$ + %/' + +   !&#   .&8,+& #(( '5%'7((6!5>0,9($2$,;6'43( -?="/)%"4+% ( !"# -!/'*&.<-,?4#3$%2")",$&#'$'*$ &+ ** ''!#!*'.1/=1.>8##0"9H:-:-"/#,!(, 0#)*(!!%-!#!)! "!% 1@8#%!0!$ .):/1A:2B<(4,$&%3($5'1C03@:*;1)8)*%'0%,3<9!"-)*$&!+ #7(%6+/%#6+-(#/#'$)$$0/ ,, !!#(%"#! "#$*- ."03#6!4#8%<*#>*%>,)A,$E0'G2,C1%2$.(*)3)!8:08B7&/$*6+):..$  %-!,>:'&"/$%3'%5'.=/+9/ +"&+:+/$$#3 %7#0@*5E4CVGUgYETEBO>7G8;IA)81-+9&8C.)!$?OF0:/&!+"$$''%$$4'+9-"3 )##'%-'4#%3(*/%(:6 /(6D?/96$7),B6$%$1&) &!!(!-".( ')&",9*0B?0?:1B:/?1"1$"&.>:1>8#!!.$ !!'$%) '(."18/!&&#* *!..=6!.)",$!## %.'%+%+ %0+".&  +95!###")"6& ,' !*+>+3D8!+$+!1()91,7/,92"/).>3MD.>8*!$8/#3+' 2&%6* 1(&YldVf[+8'&4#'51H9+;./?1%4, 1$"."IRL.=3,"&.!#4((9-'!*.&.$!1$"4,'81"*&'!'7I9/B6+*0C7:ID8GE/>1*:3*$3E?;SQ+?8#4'(:-$:2(%(1&&1)$"%&-)-%-!-("#)-:48F7BM>.8!(!")()!'* *#%0!"!"(, (1( $"*&."&-%."/;3$* &""$%6+/(("+('+*'1%"$"!9.&60!+)   + "!#"!,##80% ,!&4'$3-'!0(+6(&1)!/,$&7,7IB4?>)1)$&%!."%60(5(4F9+D=&7,$1,, (:.    "#"#('$' *"$"&2' "4&/B3$0%)9(=M?-?6"  $)"(7G>4A; +"6/!0%*"1(#3%%9,+!/N`VRb_"-#& /BVD6F22@. -%&'BK@,:3 ,#%2%(:,,;,$- "-".>6*9/.&$0&!*%#&5!-?.CWM4@:"0#).;+4C7COG4?4.;1#4--?71GA(70(#2$'80*+ "1,!.(*.%+$*"'6."5.0(,#$ )6,;L>HYQ4B1% !'&*-##. %$-%$#'$,"&* "#"(((3'&0%!+&$!2$!2&$) 3-" )<-%9.%7,$/("#!"             '!)#*%"$  "0&%+& .!0**"&6/($$" %!3%*<3-?7*60'!3GG3IJ/M@4C/,9,!&+/@4'7-'92*!$$3''6(,95"((8/1>4%9)"0(#2#/A0?OF/@6!-"#.'&7,/>3':3&%&"$(:1'7) 3$&)%)&) %$**$(8D5@H<-81"27*36*$/&$"* #/#!(!#(!  %#/!(&)  0(%2%#2- +#,$#! 0 *7*&)(,##!   +    +  ! !-!)! $&!)!$!* '4())"$%4)8G71?6'64(3+"5B51E5->-,=3)8/.9/*4/"! +   4+       &#".$+;3 #2$*9'!0&7&9F9ATY)%$",# * %   + + + +   %")'1#"1)'5)*:4&6/$$" "/',0A-'9&-  0"):)->3)5%4A:+5-&)>93G@/@8"1##0+#")!0*+!!*",!3'*90 ) %*& '+& ,/.  $.?7$62,% $3*:B16@3)!!""*$'6-(0(#*&%.&!+(!&&"1-$# '/#$%# 5-$$   +  " +  +  + + $  **"+'"&&',*6%*&% (5'7D3(7-*931?3,6(>N>3H73F75B5/A7->5-61"#"     # N''`>9+(        (& +1B6" "%5(2I@+9-+%4(9JA#,&!!$! +   )!""( "(* -" 0%)!'#!  */-A1,@3!0! )!0#*9.0<-0=3#0'#' %3%9MH2GA)<2*!2*&" "& !)# ## #-#( $ 0$)* + + %2D<)(+!1>:28(3:))!#!&&,$ %"&$1(+#'#$("'  # %)'     #    + +%1%8')9*(+#-#'>20C618+  0#$4,)6'HQ@4B:+A=%94;LB:QK0DC+:4+:3  + + +  + " + Ea<6AF:#)!!        ((%&%. :I89IB(52!-%%"$4-,<15@4(:*"/!)    +  + + + " /&  (!.'#'%7/#6/ &-;/%3(&!,' $#"-$$3'&2(#0%.7)=G>;NH&4*"( /+,%+#   +".)!2& +' *(,#$"2)%60  +  *$&73'6.( %!&5&0<.*"$0(*5)&' '!"'#'%%% )  +  !# )! + +  2+ ! 1* # % . ' &#(9*)4.# - ) + & 2 "2%)$6)$/'2EA=OP2A0/-#! .$-?2"0'( +"-D@/BA(7)     + ) &4*(4?508+(2')6)1A8+7)%0       &0"4A?#-+".)#5"(8*#1&5#:TK-=5'8-)70.;2*:6 *"#/'4&'2" .&'7*  + ,%)""   * )70(#"2#/=,.?.),'7,/C<&71"#!.#(#)##%3&7I/ + +  +    ' + +* !'*#0;09C3/8(.;,2?82?22E6,8,%5+#             )7)1>5&#$!*(8, . ,.@00A:*;3*50/AC.@? ,%' ,'5&(', .>14H="3,#  "(#! !'3+-&/$+=5%."0>-5E1!-)+'90$3,!#%5-#4*%,%'"5-2D89JC) +$);8#2*'7*0@;%3%"    5E;/91!-%! ""   3)*!$"(( 1F??MC4E7&5-!--7(9H8GTLCVO4% )%!%!!$+#-2*  629 ' ' 0090-;6&/#1?6.<-9I@-7+.@/@SG;JC7F;3D6)8,%5'(9/%/($.#    $3!(3!%..<1%4*!+" ##   +$#0!#3"!/# 1($3+- %(!-"2)+("!. 7F:+9/( $! % %% $  .% 1) .!')',(# /", #4/ /)&#( 0%&*%5*)7.8C71!#!&(*")!    + + 2/0%-9*)5(*1++7/*7/2A45E:6C58IC;G:DUH=#-,$2.:'*42(4,&4&!.#+$ "!4,+!*0$)+)!"$ &!% +  #'%       ++."#  "3'0>9&0)&6+,9.3@>&55( ' -+=1-=32CADTM:JD0F@6I=0=JD -%(/?42F;&8/%& !0%9?5--#-&/+"-33#)%# ($2' $ $! ! + + &     + ".)# "#!1-"3-/'   -,#)(:0#3)   +   + +  +  "  &%6)9K>;IA'!/#)'" .):*!%# !&    +$ 31>-6J;:H8@QLU[MRwpj}rk820 #$! ,'( !#5)%6'!1$!)'7/ +     5%41'(3&3I<@RAP[K>KG/81&0($) %,%(5(&/!&2#1E7:JA3=2%2!O^VVi` #" @@0/9.(6)$0$#-%*'&05E50?-(7%2D4,:%&5K=.C<#7.1&(90-=7, '$&$$   /%2A= + + + ! ! + +    (90"4&%/ #)  + 4C/>RG$2&%92*%%($!)'"31-><5D?0?:*=2*&"2&+;1!3(!%!"!"./A3.?74IG7HC8E:(80(8+%7*$3%+@3%6,/$&91&1%"6'1B36>-.0*6$(3'%60!"3"/=7(!.1)7>3-<3()( $#'#       $-"%  + ! &%$ + %#BABKFFQH?bVEnh[ZRQ    %!) (%+#+    +    % &*>0HWCin_07-)+ 6>6%.*#.-)'J_ZBNG/<0JZMO\S'  JJ9%) "/%+%%)91"2)!$/.<.( #!&+.,=23F?0<,/@0(3&%50  *6(5A9*7.!"'6-'"&"!# #.93# -$#, (:-+?06E3EOB):+-    FUQCRN/>20A6 1#"  ((#57*&)3**5/)8/ 2*( ,%)! "/;/ +  /&1B<-95*$3'#2&@RH4B62D60A1.;.0A.>F5>K?-6+1?46G>2A;(6-.>0+=7(#%"%!3CA;FC&#!$)+0"!(!$!        + + #+$#  + +       !"%%& + + ( CEF:56784HI@NOH896  * "&&%$%5*!    %!/B7CSDYdW)3*$5;2'-)!.-% IaZHZX/<*K\JQaU#  !%!NM?$%$&  &%3')!0#6$(8)-?8-=,0C0+9,#4)"  #3'1?47?3,!''/% ($%#/'"%.,  # #&%"%, 1%#1%/A1M_V6E3+@4 #EMJ5D>2?63ID';1   '&'%#"/%%2*!0+"5/ 0**%"!/% ! "$,:/!.&% -#)7/,!%,!-+!1!.'6* #)$  ''4'0?8'3'!+#&!2"%5%- / 1$!1"?TKBTR3C8 "1%)7-,"+%$1+'  !, $2*("*;0+<:$$"/($3(+# !**80&'7-"0&"-()$*)7,*#(!*>:5GD>NE.<3-:*,>3(91&6,   !#,""2'+ 2%!6)$0 )7$+:,-<2#/'#,%#0%-'*!)8)/A<) !/#$+'"' "& +  + + #(0) !''" /'% *" $            !!%!!+' ')"  *2-& + +     "#3# 3+#6)(:3+;/;GC*4,#* -0&())&,'/(0C:=KH!1&E\JHXL # ?7-TI=-1(*.(4A31=.#+!* *"   ).! -!(8)&4#. -!!3D45D8/7!(:%(8#+8*(<*+=*.=-+:.+%( % !%6))&7,AWOASI &$ A<0^M?02%27*9@0)6&$-" %-"',!!/# !%+, 2%,*!(!4D:8=2-3!*5#-<*2D7&7%/@,3H60D5(!0#+ ) /$0!!/ ?QGDSN   ' 9J10;1!/(0!+>*.B-6C;0?22F5*A7,>1#4//%)9.-<0&6*,$,A34K@7I9):1%8+0%' #!&!+"%#0%6GBBPKP]XO`[Rie9G8#5)"/("/*,;0(7)(://&#,;-)#!*!+%&5' 3) !   -#/&1$ -#/"!#("$!45!3C3BPF%#5.)\TEVOH(.)/":?5(5%!1%,#+#6)*<(.", 5C0(.)"  1&-A:#1).)0!' $:.&5-$-:G5)7'&3""7++*6J26G>&70  ,0>-*:)$"0#;LCBE@06/( +->1Ygg„�‘GQ[& #("4K@':3'9/ ,"0)&7-*:.&9+.# ")8.&6/" + )"" )80<(11&0*,:+4E;"/%!,' &"%0'0>80=7.;,#/$' " ,!'6.%"    (  "1'#/")  /**&->07G?$/%** 6/$=1)I)#A&        + +    + +  +  $  +  +   $(  #%(70$3)   +   (%!"  )(9)-@-0J?(:'$4#%#7(-@3"1&    +)(+$-%  &" #+(6&%2# +!"($0#(+'&6/)$( *($>6+d_P==9 :80/6/%2%"'!,#-#(!-!(#  *<0.<5$*#(-&(- /@+%5(&!%((;.!1(&,,=-.A3:QCAZQ.B2#!+;LB7I?7G8#0'"4*#!/;'-;0.(-%'<9,$0*)-)&55 ,&)#&#! #(!  % )!"0--#+#0?;/B=%."$2-'#$ 1*"'!!)"#+%-;4%+'    .("3+*-&%72"4+#'&7D9GKC6'-*"+$""              + + + +!(!!)!$')"!"         +   "#! + +  !!)*A8&7'!0"'9'8M?+?5'!  #0%"/&%#$) 0 1*7-"0&!)$' #-"+#%)'$=7,keP>?9!"!%/$%."#&&)! !%$.%*  + $)=-(8+#-&('$ -9M94F1)7(#&!2#*$!# 1#&9*+A1=SE/@-%"(:,6G7/C6"2',* % $ /0"!1& #4,!$ $(!-'$+#%" '"1'!  "2(+?:""$3*!,"!+1B?%4,&&#$!!1'!-!"/(*4/!-$  + + +%!0("%.% 1&%"3)+)'(?D8JGB1       + + +       + *&(#  +  +  ,#1)$'    "     $ + +  + +$)/E5DXB+<2"/",!" &' $!!-#,"*$ /#2(* #4')6&1&)  + /&&8/$ !/(&-*"LH:tlWAB@ + "&"0" ,&(1$!2"%#!!*##7,*;)7HE>MK4C6.=. /"!-&5'(:*('"! !#+&+  !"  '*& "(&)""#!$4H9AVQ + '6#+<+%5+ ,$!!/!!," ,#!%%#%  '!$#5'BRI7IB(8/%"".8'@D70.("#"!(!27*    +    %3)"   +   $!((  +  +"3*(#&! + +  +   + +  +  +    !  +   + ,$!.$&5)(#4(.A<$4++@,1B1 )%8/!2&$!&;-,$ !')/$%1#'*''!! 0$#1&+$-!+%5((5(#  )*/'"(%83("-+%XUHzq0.( ."!/ % -#):+.=0!2*."3$!/#(+ -#,-%2&!*,:P>DWF.;)"2#11$8M?=NA6*$#4(.;2%.$&&'$&&%1! 0(8&4C8*>5/*(#)"$#"&'#60+ '7'3E?$%'!1-$ZXL‚yl()(&6(!2$!.#%#"4%):0(;2.=-.>3.$&),!$'+.6("+ &0?.BSG:J=$4#!1# 4'E]WI^N0@-6E3@RK$#*.C?"3. /# 4-'*=* / -%6--%$""# &''#'-$-%"#! !0"1)!#4*>2&8. 2-(!  ++ !6,* "&+ + !2%,=6+<21IB-?;'8./ 1 ("/+,97(8. ('!*806E:1<,'0!2A62?43@@'3-"(#+    +  &"# %'& 0$&(! " + +    +   + + +   + + + + +       &  +    &50  !(."!+"(# 0'"72&&%"#"(80*&0B3/>1 .&#):6&40".$ 1$)!%'>/.<0+(,)-*fcP„{m!%!'!!%*!-*$'""0@50A<$++, &7H5 "*&"/ ,"!#. ):-/#(<7&2%'5#%, !&+>.-9.(! . 1F75H6'$+!/# -#!% +  (*!(1C35HA, '$!*&.%&'   "*+& /)-2)+&#"!)! *$2('6((6+)8*-:0# *"$$4# *"(-!+&&'9#9L5"/&(#+ 1$);(-?,!1 ""    +    ,"5C2& ##'",# 1%!#1%)1   + +       + +  + + +        + +   #   +   + * 6E@!*+ ","$5&"3& #  ()=4)#%* 1%$5).$*"#0-$4))#!.$:I9DVL(2.!0-)mcX€{r(.'$  ()6+3?9 #+!&(';2!50,%'* "$3%,&%*9),9''!'@RF$/&$&)) :A=#/*- 4J@3I@+7,/'#8)!.'"*#  %+!##/9H>%5+,!( "%%!".+!/!&(%*&,"-#)#, !'*&   "$2&%3'%0 4G=).)  + +#'"2 * $! ((:.*=2#5+1'*'8%"4&!'*#2);(#1"*(           %&<6     + -$ %        +  +  + + + ++'  +    + "   &   ,4H:/@1)80 # #'%5- (%   + + & +"&50$72* 1"+# 0,&.:.DL>ESS#+'%%65.leY†�x'1&%#  +!"2A:!-'(!-#! !' $$ *%4(%2%*"".C:)!!0!.A9* -&!.;J@(!)0%95101%*8.*61*&  0!."&$',( %,#+6-,;6,;.#$'))6))!)*+5)1FH(7,!6%''&#7-'!#32,:* /(#"'#3&/'   + + +%$+ 2#"5&)9*$. &  !#.0;,'&8+,<0)<.1E9&$4&2D2%7+%8(!2!)'"4*#4"( +   + +)9+2?7*+  $30 + %!         + +    + 0#  /$0A< +  "  $ 2'-%  "($    + + ,"# + +  $&'8)%3+'"(A4,JPI188880oaPˆ€u#/%&*" +  +'"0 '3'&3'(0$# $' #2!)6+ &2E:/<3HZR#&)$#./C1,<*!/%&&6."/%")!$,!!'!"!# $ />-MR?WRA#+#  )*;&$3#&-*"*<0"0(%- 0"&8+$3&) 1.>9#2)$ 1 (9.$2)%%*7))%#" # !(!2 ,)0 ###"$2 0D?).7*9E90?59G8Whdw…‡HZX8K=2A6#!/ "++"(  + +       (7&/8/''  *3-!       #%*%  +   *@7"$6(/>9        '9/*5*   !!     + + + + +!  + +   '"2( 2*(%'2&N6+TOD;B?<:6mdN€yk-;6$,* #"/#!,#0#0<,%0($*8&'7' %&!(6+/406E5GTGXdW(3'#/!!")/@)3A.#2%#6*,<6&')!""%$+&($$$ !,!Y^JohO5;3$%5 1A*#0)/"&&7+ .#.  -&3$#6-%8))4$+!#/(+;2#4$#0 "#*7' 1"0"#5/-$  )!&()/?0&3'#,!)$$1%'59  ) 1=/>LI)8/DRDlyv�˜ m}„R`QIXZ,) 1   +  + !0"*9*     #0%!% !! + + + + +&3?.)7()!(%"*(""0('/, !#'"   +  #%   +  +  '!! + + +"     +   ' + +  + + + +    %"1'"/%&!)&2(%L:)IC:+&%"$"!?;3uqc�{%3*+#*(   !'#'-#7KG.>?%/!+?03JC!3$ 2&!%&)#&,:L3Zl`!/&')/:& + -!0"$4!#/#,9. 3(%6/#,!!,"!##.-?6 2%"))"!# 0']jLu}a…}Q^QAKA$ (8#.A<*:-*#,'$.*) ("+ 1$"2&& +  , 1'$3.!, .*-!4)/$!+ .=8-&.A;(&  '       8IGJ^e8D;>KHISJ*3*`sqŠ“¡‘˜�”§³š§°p…•#%       -%,:1/<6+$'#%#! /( +  "$1%+,93*B?5# $%% $(& +'#(!4$+$   29* )&4+*"$* '');1 +   + + + +'# (C82L:7.-+ $D@:tpaƒ~{-:.(7)'6*,%$  ""1"1F?,>6%(!#!,$&,)#'-'5B1VgZ'81) !&" &5!3B.(7' ,+)  +#)4*0"-#%" * %( 0&+UfRoxlv~p[li:GA" #(* &++)) 0 3E9*>1*5'!.#%3)+@0)9,"4(!!"* ($2&'8*(;0!0) (*8)5C8.<0 (%(#"/$,'!+&0:.[hb– ¬dpoRa]Xfm‚‘Š¡«½“¡¯�¨³¦¬¾’Ÿ¬*  !   + + + '    + -&! + ' +  + /G9(7/!&#40(?8- &"# % ' "-"'   +!$!1#(&$4&9B1!.!) !/!,#!-=5+<;#'(() """2'$ +   +    + /) RC?@1/'!$$#JFAvsf|}~7E>)6)(2$,&+"+! ! -(>4(9/+%'"!*"%(&#.:'Yd[&2+*%+&.!,!!&6"1B,+:)#1#1!*+!0:,9B87.3/## - &)OZJfqjeqmOac?LG "'%#'-',)#.?5%7)!**&7,&;4'5/1% /#)7+**$6., "$1+.@0?PE/;0($ + + ) .%")*!."/(*",<8BWUEUXV`Z›¥°” ­r€Šdqy�𒍱À «¹˜¡¥¤¦¯�¥²4B:#%   + +  + # + + +  + +     *%  +  % #5'.@0!'    *%"   $"2%'-  !!0B51<1"##%/8%.=-+#4#8I8"'%!,&  ,%/;49G>-94  + + + '       + +   S<,C,*##"@@>}{rzsy4HD%1 )6)&( 0*!+#, (    -%&$1. '0#3?/6(:7     +   / />5+;3  #  9J/1@/5H47I9 / /&#-&'"  +!3%*@3*?6!1'!3&*,"$+#$'')" '8,*:(!#   !$  + '2'=I?coq��„–¨‰˜©ž¨¼©´Â²ºÍ¸½Ð·ÁͶ¼Ë¼ÂËÁÇÒÅÈÕÂÉÑÅÇÒÊÍØÈÎØÈËØÁÅÍš›¡mpvI?8MA:"  + +  +  +  +     +   "1&$30  +   !,&#  & ,$'+#)!." !/D<* (#    $-%(! +  + +   &!($!)(,%(45%,%&%!)".-,!$"#5&'4,-&! 0D<%5,$$DA;…�}RJS% + !&5'#! ",'   ! + $ $&$#'     +  +   +     /A6'6/  '!4#-"1%4$)($)#7%-  *&5,"4+ 0#  '"+!!,&$%   +  +"/ + &#*618KParzr‚•{Œžœ§·«µÇ©³Ã¶¼ÈÆËØÉÍØÏÎÝÇËÖÃÇÖÂÆÒ©¯»œ¥°blo$+ $*?A242* +  +  +         +    (40)% + +   ( !#5(.@;$1%&4,'  +  '2%3<12=.*9("+(1($)(  + !(*) !% &)!%!0/=;*&0&- .!"*>4&70-$*>:  +!% !!%#"@<0Ž‹ƒMHI    #6+ $#*)!  "%%. )&! &&  +   +   + )9)&3'  %'$$#.$7*"3-"! 0<0CLDGRL,++:%%7! 2!#4''6+)(6("% !'.$. #6-  +, #          #  + $!,"7LHNemhz�j€“jy}‹�ª¢¯¹¤°º– ¬t‚†lzzp{ƒ=KF3A9"(!0?/>ND2F>          +  + + + + + +     + + + +  />8!       + -"#3" 2#') &    (-"(2&,6*!))6*"-.  + ++% " + "3+."0$$5*%$0)"!"%-+,'3,6&&6)$** $!5-!5., &7,$#$$<;8�†€LFJ  !2#& '$*"&;1   #3('8*$/&  %     +  + + +    ($"$2'4)  %%&$6$&:-(,';F&'   + + ##1#"7)*+/!' -!("2%#)-;*#,#''-B63H65K9%9+(',#"2(BRO+1+%  *$"    0!+"!1&2A;#4.   + +  +   + +     +     +  + +    + +  33    + + +  + (#4&"':6$!   + "&      + + #-!0#,$$ +     + + + + '&   !4# ''$"! + +        +  #!(&&IH>�zzAD9$0+& ) &  + *(86!&2(,5'#(%3%".!'# !$ +  + +  AWM6I="! *#(+>4*6$"1 ,<&@TE# + 0/$*,;5!!$/# '!*#/#/) + "#8+!2&&6,0A7&9.-%"%5("3#&7'!*;*-@5(>1"2&(!&.A0?SCASC,>3#5++!2B3-;-&/&/(".$#+*!1$ * $/ "0!'=G9EM:      + + + + +    $   + +   +! +   + +  + + + +  *'!(+%4'  % '   -'+$, )!  + +("      + $ #0"  +     +   ! ()&FC9‚{}><25(;/&#3#"8(-@0$1)( *,B72E;2#!-'%1C<;LJ*7'(4&$1#,&0 1A2?QC(8.)$(-%/(##/ .;- "2#'6)/#*+11<+   +     +  + + +   "" + + +   + + )#""  +       +   + +  %*=,;TG%&0!+4/%   & +   + + +  "9(*B:,--&8*#4+*        + + +!# +  + +   + !'  ),,IH?wux.2+#:?-H;.e7"I5/# =A;C=6A6,7($(AZMBXQ))"",&     '9).:8!" #/CU=$1$"!)+!-"*=4%"  +  +    ),(##3"."1$  # #,!3,&6**6,$.)9,):/#4(-A:"3'#2'&0',)(#"1 +@78MDAXN_tjqƒ~-5+%, ,?3,=.-D;"43/0(&&!,.;''2"&"3($()9$! +    + "  &$%$  + + +   +  +      + +   +   + + '#61"10#   +     $! + +    "   "" !" # !   +   + + +   + +        + *+ #+*0LE>pjw" !".!&-G0 c7+U0$"-)"&2*):6.>8-&!/ 3&((9*0C5"(!    #!$1+@2.'/&3*#&!#,#*9%EZC>J6'5.,      !0%"      + + +   $+"5)'+'"**$!/@+$3#"30 &82!3(-)3/+=8 .&$#0'(:."1(&:0%8.$5*=TK7GD'".$#5%)8H6:L6BVO$$ ( #%  )%50E-8I6   +  +     + +   +       -' + +   + + +  +       +    +  + + + + +  + + !70        +   + + + +       +    + + +! !!##.-8IFFh\g +#* G+ U0!;,!8@315*'!2/'41,06) + ! .#&7*1A3!.&    #&+ 2# 0%!((72'!"0)(:60/?1&(#5&';1)%0'//+)$2<5,;3'!%2$ .)#2,$+!1!0 PcVXfY=IB  - "1+%!   .C0:NH>VL% !*  +  + +    + + + + + +  +  +   + + + ! ) +      +   +   +  +    + + + + 3B@  + "%% +  + +    +      +   + + +  +    + +#$#(*%+LNJkdt + !4& A F/(3%      %5'0C8(6'%5,+!&   +    + ! ,12 -;-);,(!  + /*   +   + + + +  + + +   +'1)(8*.0#*?1$"0""0#!0"$7('9+*?2#"/%$ (/>2'7.*$!4).$*<5 +*%"(%6$,$",%6+2H>*8/*!" !))!# 3-%#0F; .!!"( $  + + + + + +  $   +  + +  +    +  + +    + + +  +    +   + +    +  +   +  +   +   + + +  % $24 + + + )#+$   + +   %!'# +  + + + '%+57 + +  + + $"!$"/!$."F30q\i   + #% + +  $ * -=(0C4%3)"+ )9.&9.     +   /4D6#1'');)0G4=OD*9.*!"  +  ) &80   + + + +  +  +& 1'  +    3(%0&*'9*(%$"(& 1!/!#&&+>0,>31'","1$)   $5'%/+!4(2%$*)$(*!$ %%1!$3%  /B1*;-   + + +  +  + +   *     + +    + +  + +  + + +   + + + +  + + +  & .( + +      + +     + + '!"   !5*0E?$3/+"  + +  +    + +   +   -()3<  + + + %#5$2B-.€co$ + +  &3  $,:*#-2D95E<5F;2D8("("! + %1(! /   +&!   +  61&68 #4&   %%   + &! , !5,"'(*;*( -&& # %  +&2+ + + +  + + + +  +    + + +      +  + + + '! + + + +  +     +     + + + + +   -' + +  )($;1!. #/&  # +  +  '#$%&2##0 (%#* #2B>%/( +%%   + !-( + +     +4 n#)u$)Wb{%$�EJ&(2(( +    2%%%"$( *%!/&&&"'!(;2&8+ 1& +*&&31 #' 0"-!  ) + + '&6(/  +    " !4.##'&"*(7,, /:LG>PJAQM(!$1E> ..#& 1#"1!#.       *'#("'%& %   +   + + /!"0*(%- #   + + + +       + +   +   + (%! + + + +   + + + ! + +      ,43"53)!!  !2#$90 + + +'   )#$9/#"!2( ())  + + ',9+.%+ ,$&! +  "#  ()!BKj"…06v "‚**¦\iI"( $"(%  $%    '73(!(+!*6)  *$ 0%!2%*!    + +  +    +  " '5"-@3"&)):*-?5"$"  , =8q()£]k¦\f¥Wb�[hK%! ."'1* #' + 4(E:(14'! !'&,#*%   + .&;.4G=:K@2D; ## + (/! (!  + (,!(80/   2%3#!4&"   )$#/##."#   ,3+*;3'(:(%#+ />> + !%    !0#0E9(!  +% + + +    +   +   +  %4&)4(2E785)  +5-<6)"$ + +  '$   +   ,(#&/#+#   +     + +   +  +  "7'$ +&   '  !/) %2,     + + +  + + + !"  +  $%&$ (,6. + # /* JUu()ŸPT£X_x?>  + $%(-':*O0(<)##)5$)6''3&%+!#" +  +  *!  $#5!*=((9%.  +  %''    +    + +   $$( -C7#3(+ * '&5')!  0)+!-$.@?(8-  .!*   +    + + . %"-(   ) + +  +  "  +  +.$ "% $J.$;.! %  + +  #!'   +  !   + +  +  + 22&1-$!"&.")%   %1  + 2%#$''    " 1'.% )+!#    + +  +  ".!"  &!+3(  #* * O?V�@CœQ[|;;  + +   )0#8-6.?-"#$/#- #&+'#6#*<.+"'&&     + + ).B)2D52$! +     + * ! #   +  + (%:&&8)@SK(70#&91  3 $$"$(1)  '$'/$#/#%  .$  + + + + +   +  +     #.,!%8'%!'(  +  +  +  + +  + !, + + +   % *$$% "',2#(/60$.." +  + + + + ' 0&  + +  +  +  + +       +#$  " + *- + +      $     +       # %   &"01   + + + +  + + $! +  %  + +@D Lo!$~()Z%# )5+&4*  $%"'($30*&($/%)",#&  + +;6)6=3"%$   "&!.'5#,?;&<5$4+%!)$#%"   %+3"'%#+!  &&8/!     +  '    +  + %1)    +   $  ,!"   !$  + +  +    + !  --5  #&  +#!   + + + + + +   +   + (#1%!  +   +      +"#         + +     %     + &      + + + + +    +  2@ No{..J!# ! /(",(:)+='-C5&3"  + )>3-A3-#'+& &"  '/!&("$   + !#  *@F5@@4!". 1 ,".@/':. +    + + +     + + $ +    0+  +   +  + $)(   + + + + +  %**$             +  +  + # +  +   +  + + + +   + + + + + + +  +"              + +      ,! +   %!&"5*,"           0--% + +  + + + + +   + / <G n{37@" +   + #'):)0@-'7*% .! /#+'8', +&#*'$      !* !$ 2!!/!'&*:*8PG"  + +     +  !   + + +  $"!  + + !!   +  + + "     +   & +     + + + + '!"     +  !)+2# +#    + + + + $#       + + +  +   + + + +  + + + +    +  + *%2, + +  + +  %#$9)"$  + $(2& +  !    +   +  + + WL(‡mh# 96)-7,&.."5((    + !##!1&-# 1% *%8BZGDYP$4%'! +  ++'+&($*" .!+ *=%H^\ +   #):*('    + + + +   +  + +   1." + +   + +  +    +   +        +   "     $&! + +   +  3! 5-'"#   +'      + +&!-, +   !-)*$+!( 1)  + + +   +    +  + +  + + #  !&     + +       +"#  + + +'&(+A3 0+ -$1B6 +$5#(5&N[P5A:,!'0=&/>**$()    ! Bt23$! ';OE8K8:K12G7&$ + !#(6)"   + +  &!3'$7$"/0@1*:/*" + + '" ""   + 4E1)63  +  !+&   +          +  #      +    + +      + +  + +  +  + +     +   +  +         &" & + +   + "8/$2- +    0+   +'1#* + + +      + +  !' #3#+$,%# + + + +      + +  +    + #'   +    +  &4*/D=5F1 1" + %4&'%6*0@.CL@$.&  .0='1A-'5FA   'Kw@=AZNGXKBO:'2* !+$);/!0& + +     !2")<.!.%*$ .(   + +     + '5)    '!# +   +    +      + +  +  +(#$(  +  + +   + +    + + +  +  +  +  + + +   +   +  +  + +  +   +#    ++9""0$ + + + + +    + $ + + &!  +  + + +'!%4*  $!   +,$80(%   + + -+*;7$70,) + +   +  0>5  $#'# *<"  + +   + +  +  +    *$&  !1B$.:*.$3%$4$(8'#)  3A33A@"#1""\=>�yx2B3BWO$-#$3(      ):RG'$  3I;1C=" % +  +    + +&  #6(*&   + ,!    +  +   +  + + #*) +          /, 44 +      .#  + +        +"   + + + + + +   ## !.#3' +  !&  + + + +   +  +  + + +   (>/$"2*2?9!,# &;/(!% + +  .&"55+*   + + +   + '"R9+uN6‚^F{`S_@,`;+5  +    + + + + +   *;PG)6*(8&'4)*& -!)"'! + -#+ +)$&+33/[WS‹ˆ‘# + +&2' %,.E3#$5)   +  *:&EYJ&$"!-(% -$! +&  $  .     +    + + +      +     + +     +  +   .+ *!%3&/?6#/%  +  +  0-+#''"1%&     +2G='6/.:-0:5)& +     +    +  + "2'!0& .#!     (,$#5)%1( ,#      " + + %  6+*8/!2$0HB$-$   %>4$1-&    ('"$ +  +  + + + +/8.?@3tP=–o[”o\nNBJ29%      %Ri[M_ZKZQ+?2&6,!*$!%"  %!3.1H7;LG#"&-246^\`��ž$     $('5$0D0%'!2#+* %G]ICSL#(6* + ."*A6  $  + & +  +        +    +      +   + +  + + + #,(! #-$@OH&3,   + (#&     + + +  ,=0=M=6E4T[L2A:,=7       +  + $     +  &   + + +  !1'!    #8*&1"#( &) !3'$/(((!5JCE]V% +  + +   0,+  +  + +      +  W?2xUGcA97' '%-. +  +  $ +   +  $5":I?'1*  !!4& *#"'+147:bc`“”Ÿ  - ',#-!/+#%$!$4$3G@.A@$5-0A*,90  (#4# +   )$   + +    +    +         + +  + +  +  +  +%     + #20!(+&     + +;'AQCDRM    $8?((  +   +   +3J= +&37'CC0+7#'8I@ + +    +  + !7+1)!4&    +   +  +     +    + "0 $$"$,"OA2B@:  + + + + )#5#  '"  + + + +   )$L>2kG7h;(\.!"  + +  38)  +  #  +   +  + +  + + ,%  1I04@1(1':,!1"($"3% +  $)*/1??Bdil›�©% 3!$  $*   +%&8-"2"%"$ 2"3##   + + +   +     +   $    +  ,,   )'     + +  + + +  + + +&"C5,gPH~XJg@3T- U'T, L#2( 3++  +  -)0*  + + +  + + + + +     $"$*&.$*1<>:SYc› § ) +  ##"-;6%   05B:",!"     .#!    + + + +&   +&&3! ($#!"%    +  #'2&% "*90".()"(* 13#%!#7',, +  + +!2& + !,-" $#3&& ,7"FG0 )=3  ! + +    +     28*17+ % "  +    + + + +   + + 0( ,!&    $-  + 3L?"0/* + /$XF>I5+_C8gA5jC4`5)\4$T. B%H*O- 'J'Z,A   + + + .C:& ")!   +  +   + %6,#"  +    "!!/$*;,$"4:?:;0 KA-*"!+9+,8'&'*#4&*?3,%$' (&#(4F6% .( !#    5E>'.)&     "    +  + + +  + + + +   *6&$('  GC/#$#  + '2$!-"++"*% . + $  +  +  !)-%&"   +  + + + + + +  !*  + + % +   +  /1%() '&' 4%-"$# 2!(;@/)/#$",#C2%3(E@3D1(A* =5(0#%&  -G0&9 U*!S*!Q);B"P%A#967.  %  +       ( .*)>4 " +   #' $*./BGE™�¥+6.(=1$  +      +  +   - (-  !(?UF,:4  + +   +  +  (-+4"<;(;<+   &;9.+!   + !,#%7+%3++2,!-@;&9,   +  + #*"$ $(3FC&"# "&"!   +8.,80/<1)$$ + +  #+.% 95%‚lj''#*@5-'?57LD&*%* +   +    +  +  !1:/491   +  + +  + + +  +   !  " + + /7)!3#2!/$6/!/)+""%F?1<6(SOC8+#4*!)! %  &005% & 36#9 ;1("& +  + #$  + '    -#'  ,",@B$5.   )  +      !#%)+-@BC™Ÿ¨&"1'  +    +     +  6C2*# + /@38H? +  +    " +  +  + +'*;,38#",#$3( .#   +$4,#5+    +  *'    "!-, - + !AUQL]WGUO#     +"#  (  &‰rlZIE!+;*+" 0+!&4*    + +  +  ")%     +    +  + +   + +      +   +" FK@?!,.&( + + /;8 '!  #' ! % "   +   %)'$# + $ +  %!6+  +!&98% + "      $!".17=BB“š›# "       +  + +  &8G7-9'  ! #"  + +   +  +    + + +   + !&(A8 +  " +   )#! +   + + + "0+  + +  +     + +  + +$5$+ -&  !!!1'    +   $$>8'‡vi|ja!!$ + +  $!    + +    $ +  + +-3&0 4'"    + "!&.$%./;>>�“š(.& (%     + ##" + +  % +  +  +      !+(0+#! 0 -"   +  -'.#   !  +  + #:&   +  ( 3#%7/  +     #+A./G4)6%USCtkfJKD$  + + + + +%.%)  $  +   + +  + "R]LQYI>FC  + + + + +   + + +       +" "   YL/W85; + + + + +    +   2 "     /% "$ # !   + +  1%   %!.%5(!4(%   *%" + "  + %;:0.%#   +  #* %--=@B�•™..,CYZ5DC%%          &  + # + +  + + +   +   +  $3.! "0 '9/%  + +).%'5$*9- +!!,/B6+  +  + +$ +     ,/ ,#   +  +    +    !.@5,>8),(  + +    ".(CLBLWLDOD%'+&RB8_FBM5,;*"#)(.0( #"*@8,;./B1'  6H<    + +"3")6- +    1D<$*$' 0+ +  +  $% (.&-5/5:{}€MHU +)<6%% +        &  +   +   " +   + + +$ + + +  + #   /%  +   + +$   *)81%#1%  + +  "  %3+  !  + +    + &"0  + + + + +  + +#   + + 8=. +        +  +       %/&      + +   + +      #!&(          cM8kG:& + (-( + +!1! + +    +  "33&F?1P@9XF;5,%$*"("!%" &"2(#7,+B55B6  + +A/   '/?2   +   &-?5%##"&&  +   +"!%+(/5-12~�‡OIV + %!-. + +  + +  $  + + +  * + + + + +  + + +    +  # + $)*  *<6  + +  + )&6H< ( +   +  +  + + + ''#!,& +  ),&   + +   +     +&+9.'!   +  +   + + +    + + +&#    !&'!9D7  + +$   + +  /.%>6*D=4#   + + +#7) .='     +   +  +   +$"  3'%5.!1C7&/( 2#%,  ('/-   + +  -B4.?9$!&6,  %"&*(00689}€~G3". *# +'"!#(!&   !  #1(   + (   '!!** # + ("   ..#!  + +  +   1%    *'   3('%  +!1%7NG +  +  +     + + +   + + + +  + + + + +&"   +  +     +   $"3! (8*( +*=7 -)  $ + +    $ +%+8.@P@>L?AG;  +  ,+!,$  + +        + ( -) +  + +  !"! %(%//[fehev +  + (!&( +   #+   '%  + +#)82)8/ ')"  $5$&  %(!" +  + +  3%  /<6*4/#5#:O;1=8** BOA + + +     + " + '#  '(+   *%  +  +  + +   %$  +   + + + + +&" + +        +  +   + ! +   + + + +  + $  "&  %3!!!  +65*#! +  +    + + +  &3$6A:DPD;96  + - &"  +    + +  +   !    + + +  #&#&%,-[binj{   + + + !$(!  + +  *@6*7($ + +  '%  + ..$ --&+!.+ + & !(+ )&61   (:,# ,=74GA'BTFN\X%*'!5%%8'&ARC'       $! $3,#-$#& + +  + !   +    + +      +        ! + + + +   + +        + + + $    + +  + '"2$#   *8)"*#$2( + /""1 $' +      %'".%!.)'!$ %8,(:2 4)  +       -!  !$#')$+/`fh~{Š + +  + %70($."0G;  &J[Q)& +  +  "+!+ '+*#-B=!0'(   +  +0 !  - -",$*   !  !( ,>8 2&'4/$1( +  #0' ()    + + + 595#&#3. 12  + +  +  + + + +  +  4B7#!  + +   +  + +  +  +   +  +  +     +   *)#'%(+   &"(!&7&$&&6%/:,    + + +    + -B-/C1* +  )#+"#0#,  #"$(  ! "'4!      + +  +  *CE     +" + (  + +  +    ##&).5Zadz{‹! + ! + +   "1#'3*&! + '6!   +   ,)  + - *;)  #(##0*  + +  #) " + !0@8 !/#$  +  ,?6:JC)*     +  !     +   +   +  0+,=8$62 %!%&"&  $+7; +  $  +   +    +   + +     +  + C=0;C4(%"*#"+*!)8++;.%):!3C1     +  +   + 3-38(7@&=I<   26,*3"#$#/     #!"  2A35B6+# #"    '<(-(B/.CJA17-#&1%$,"+5(6C/$/%#1'   + +  +   +  + + +  + + +    + *)  ":)(".' 5G@&.6    + + + +  + +   +   + + + + #3+ XE>YFG-':-    + + # %- %&9+  +  + +  + +  + + =5->5*C83%'%(!+)-#2+=- * ! +   +    +.$2,6/;0(-! +?+/=*+:% !0   + + '8,)1-      +  &>, + + +  + + +*     )!$  +   +      + +      "1-$#  &-(.2LT[‰�›<:H +  +    & .!@.#95!+,) '0) 0N,4! +    DYJ&  + +   /+ "3-!  -#      +,"0).%2-!",&$!%%4&    +    + + + -&3?>'6*&70&:3)"     +  + +  +  )7-6G<:PC&   +   +  +    + #A8)<3/NC/6 !#  )<,A%N- ]<&qM0mL8^>.#"'',$   +     + +% +)!!%!    +  +  !* #3'#/% +  +   6$    +      )+.C6  +  +   + +   $*"($   (%&*%*.PTW‹Ž™?9M  + +  + +')!#"eE=@$H/$*"     !     0D9!.# +  +   +   +  + + + ))#-& +    + #1*8, + + +   /+&7,       + + +% 0( &((B5;.>.KI,5C6$! +  (  + + (<4!17 + +       +.% (. *   + +   -%'78&+,"!&$)   +  " '6(G.$_B-[;)?+'( )$0         "$:6*  *:/+:.$4$, 0& &,'=,'  !'   +  + + + !(7+"%! +D5   + /& !"4.  %+%&.-@.(;1%7+(!    +  +  + +  +$&)+2@GN‹’›MH[  +  +  + (. + 0*#, 1/# + +  )( +  %0"%?SD9PO#!  +  + *"  + !  + %  !   (.'  $$ + +  +>NC0?. 1&!'!'"5(-1"OL,45)  +  +   +$11 +  +   + +  ,'!  + +  + +   %$#    #  "4,   +&!4-C3 ($ + + +$/.&2+$(+*1 )4&$ 0$" ") "$-?0$#!0)0,+"$    !!!5$ )(;$8F8,% + $:0   & +    + /#56J9&82##&$  + + +   0&$  + +#%'');@B‹“—c`h + +%!#"#%'4$94'$"/;%3H51D5 /""2 +$)$3#=J?7E4-9+'*&   + + + !*!$ )7+   "  +       + +    + +   *',48E-;9$.#."8*7.@3 ( +  +    +  +  + +  +    "*&'7-1$(#  +     ($    + +  +&.!A)C$ + +   +   !$%+5'   + +#"  + +    + % 1)9)  + +& +  - 6RE/C6';2 1(".D..( +   + + + /)      !   + +% &;/'8*   +      "),   + + "#& &-4>DŠŽ’e_p +  + + +   +(#)"5*'2'$*"'"$9+" "&0@0/>6#.79)*- ,!"-"   +  , 2-.,('*% )# )+ + +  +  + +   %$ +  "& +  *#       +   +$-  7+A/I2    + +  +  +$   +  + +    + +1$,B:%8-$3),,!10#    ##!    +    + #&  +" .'":!+ +    -#)&)8'  "." +  +%"  + + + + 0&   +  + + +  +  .I:+=30//(*A,'6+ 1( +  +  "#$ +  +  + +" + +   '  "$,!0"   + +   +  +  + ,2 +  +  + + !"% #%>CJ…Š”lj{ + +   + ' (6'*>*5F99F=4=2$#Y^R;C5 ) "2)-"0+[W?BF:  +   +  +  .&&#   ($ &9.  + +    ,!    .'  +  + +   +     % I03*     + *%!  +'% + +   + ++?8#53"1)"4'#1-, + +   +  ! + + + !% "   $& (-#$''*$  +  &G2 !   + #      +  +  + + + &"(       + )&   $(>27ND  + +   + + $% +   +    %>NH=QJ0A>   '! %#%$#49>~„‰�‹   +    +  (;,&2(-! + ,  #*,((3*+2)+63.<05D4! +  +  +        )$ '  "'9.( ):/ + + +  + +  +   +     +        +5(<- +  *    #0@B +  ' + + + +  + )*(! )!  + +  + + +      '    $$$'*2%   .  + + + +      0$%   +   +,!      $!##%# + "'7NL % +      &'   + &4*0=2CNC3>3  +   +## (,-5>vy}x{‰ +    + + +  + +  + + 1(/6  + +    ,)#  '*#);C3'! + + )  +   #1*  + + +  '<+  ++! +   +  +  +   4,"  + +  +    +  + )%  &'$ + !  *! + +  + + $ +   +      +   + + + +  *$(/$!       + +   +     +  4)& '!  +  ),!*  0#( + + %3NF*)  +    +   +        +   &4A609,,1$5@3!)!#  + + +  + +"% '*-24t|�~�‘ +  !  + +  + + + + +(;< +#%+!  "3(*5-,#1"6B9);5  + "3&    + +   3& +  +  )- + (     +    /)((   +   + +   + +$$!  !   +*&)$  + +     +      +#( + %" + +       -& +  "   (5+) +       + + &     *-)@."!%+%$W=&U<- &!2!+%  + + '$&:0$  )!  +   +      # (#%*$3@6$ + +   + + + ) $'-26<…‡‹ŠŽ•   #"    +  )"##&     4KI4EB&3* + !0% +  '% + + + !-$4!'6"'-     (  $  ' + + + + +   +   "-&+;3       +(  + && + +     + +      +      + '     + +    + + +   +91!,#     +   + +   &#$)# + &0 )     . !0 + +$!%$)H+J+     +   # + +" + *).B;!     +      ( "2 "/'++6      ",&  "1!-!$6!'6)  + &%);0 + )   !#07>{v}‡�–.D?# !  + + + +  + ! 1#$85 + +  +   +    +    &- +  + + + +     +  +  +     + + &!$')"      + )!%*<,*=+'   +    + (  +  +  #!   + &   + + +   + + +&&% "3+"20  +  + +  + + + +&"    +    !#  +  $$  ($&&@4"9&D(D'G5%A5+ + +  +    0$ + +!  !0%*!.#*#312E:")=/!5- !#71  *5,->54F85IA3FB"#%)%  0$):0!,##!".3:lrz„‰�" '=1.BEH[_,65   +    +  +1(+B?    + +    + +  +  + +$/H4#  +  %  )7- +    + +  %!!  +   +  +" +#"$          +  *" $ 0," + +  +5L@# !'4.(500<2$ + +  + + + +   + + + + '9,%'& !$$ + !%4*(9) *( + $4.!' +  +    +    % +  + +  !,(3####'I$+," &      $&"2$ + #! '  + -% +@8   %!2.,9-)!      #-!%!%6.$) %%*16hov†�–,&!*$ !2-!..(74:RR   +  + "  %&$0+ + +   +  +       .D9=KF!1(&            +#    +      1+ +   )  + +"' +       #" +    '   +   + +      + (0)1?/ %.$(2( 1*(  #  +  )1E9  $.' + +   + +   )   + +   +%( "&:% + 2 8!D)C&  + + + +   + + %0'!-"#       #,!-%0D8 ' '9.0E;&95'&)! %+69jpwƒ�— $#&78&2IA    + &!$3.     + !  !     + & +  + +  +    +  + +4G9$.,% +     +   + +  + + +   +  + ,+" '!    &3+ ,$ + +  +         +    + + + #    +  +      + +,7%,-.  + + + "    +  +  '      ,$  +   !  +5&  + +  !' +  % -#!!*& /X1Y2!1(Z/k>*L1"!!   +  &#3"8KJ     + "5.   &8$  "&  +  % "$-%&5- " #%!#)(/5bjrˆŽ”DRF   + (%/E9 +  +"##&($!  %%         + +    +  + +-%"  !   +  +          $9+#4 !/ -   +"  ) -#""'          + #   +  %2((#  +  +  " 'FSG   + + + +     + +  + +  + +     !  + #"8.$ %$   +  +  +  + + +   - +  $7;$ (:#E45&## + +   "#45  +   +  '%+  $# #%%    %  - 0# '# $)).0_fk…��*4,+<,(8- &+(-(  +      + +  + "++  +      +  +    + /*          +    + + +     *!0 (:()6$)           + + + *+#   %" " + +  5K<"0-   + + +  .,'  + +  +$   + +   $ +   " !     +       +  &8((0( '%-"1-$!%,' + +  +   +     &  !%"2%!8*'7* )""2,#5/!$) -$$$ $(04_eh‰† $!%3'.;- ++,%$$*)**    +    +   + +      !   +     +  + +   +   +    +      +  #-%*!$    !      #       $4+,' +   +  :0+:+( + " +" + + + + + + +          %  +  +  +  !$   #    + + #!,/ !60 $ + +  +  "    $"'$#)  + + +%  + + %   '2)'#3*$)6HA2E8  + 1"&""   2.,@<&,/!&#)-OV_vƒ!$ + +   "#   --     +       +      +    +    +     +     - !,$  +   /!!      #   +      + + +     + $ $$ 92,;70:9- )  +  + !($&-##%!    + +  + #2+*(  ' + + $>3    + +    +       +  "' '&"$     +    + !5($5&(  # +   + + #    "$3$& ( !  + + + 1'(=< ,+ !  !#%,/UXUx�„    +    +  #"  +  + + + 6MD1C=  + +   +"   +  + + +  + +   +   # ".-  +   + $('# +  + +   + + +     +  +   +    +   + +        >>-XUHsmd`ab<8: + '$% + '  +  + + + + #%$(5G8(!  (>@    +  +   + + + +     +     + +  #3+.E:"1%  &1$)+F1"C=* + +     /"# +  + -&  5'  + + +     +     $!  +   +         +  "(,4PXVy‚… + +      + +   +  +&:+=RU!*%    #!)*'#      (5+   &! + .!" +  +  + +    +         +  + +  '         + #)98,@F;!`bToqhwxxFFJ  #3"     + +   #$3#;PE"     +  +      + +   + +  +   + + + .#&12&I&/   + + + +     +$1% +   +(-&     +    + !   + +    +  + '&    +    !#"+2ILVpy€& + +   +          #&  4F;"  + + #)" !% &##!  + + 6G54?+&3!  + +%  + + + ++ +    +   +  +    +  +     #.''"    +  + 5?9TOFXOIURT1, +  + + +  + + +      + +  1#%42  + +     + + (# +   +  + +    ,( &'!7&1!   +  ", +    +    )   &"  $9ME$20   +  +    + +  +!!  + +    %+3OSV|�ˆ"    +  +   + +  + +  + + + +     + #1, + &  + + +  +  + ."!   + +     +  /'!        +  +    +   + + + + + 444 #  +  +     + +.    +   $.#   + +.$(   +  + +     "'  %5%"#"    + "   -%#!  !   !% + + + + ' +  "91, "5%,@4'86  +   +  +   ( +  + + +   + + +  +&$"$%,2IQXx€„$  +  +  +  +   +   +    !    +  + +  + !  + -    +   + + +   +   '#*  + +  +  $#1'   +      +    +      +  + + +  +    + +    =5+I7,6$."8"    + + + 1E:  + "  +     +    +  #+/?)    + + ,#  +  .!  ,% +  +      "%  *! * *% + + + +" +      +  + +  +  + +"  +&*EIVmqx94?  + +   +  +   +  +  + +   +   +      +    +  + +    +  #*%    +   '% +     +$*   +    + +   $"   +           + + +  ;40KE8eWD9/'!$#   +          +   '! " + +  +       +    + + "    + + +"$8,'$  ."    ($8-& # (#  !  +     + !     + + +    +  + !+3KS^ow�75@ +  +   +  *2'A<(>6#!!  # + +       + "   +0L=1&   +  +   +$   +  +     + + #9($7* +   +   +  + + + $$ 1) +  +   + %   + +   + +   R=1SM9JA5?1*! 0,  +$)! + +        +     &# #%"!       +     !  ,A5$( +     + +" + + "%"5*!      $ +  + +    +   "" +"+/JLOq{~DEP "   +   + + !%7:/QH2NA,C:%1)/*$   + #$!-$   "6$J_X#    +   +  )      + &9//"1"3'-  +      + + 6.2/      + -$!5- +  +    + + + + +  =%,  *.#+       .) $3)$+$ +  + + + " 0(& + +     +     +      '&. +  + +    +  + *$      %  +  +  +  + "!  + +    "    &+?AC`glE>L  '% +   + +  ! + -4'EH8SRHYM?XSA`R=YG9,"      + 0!%    *%# +   +>WL9EE!    +       +  +  +   +    '   + +  +    +        + + %'%# +     +  +   +       +  ! % ' $0   +  + + + + + +  !'!5+):5/$   !4' &"+>5"0/            + &",/#55+    +      +   6#!  +  &' + + (% + +  +    +  + + +)!   )  +  "!)1:AG[aq\We   %$*  + +  >@;34,B=0jQD`H6K<*E:5 +   +  +  .%# +  +/8:( + + + + ,&&!  + + +  +  +     '% + + +  )=5 +     !3+   +   + +   $*)   !+(! # +#&'  +      #  + + +$,$%   +0$ + + /B; ./         +     +  + #  '0)  +       /#),   2%+"  +  +$      + + +  !1$   + -%  %'8AD\`nTR] !%$!#  + +   + +   W<2lYLLC0%   + + +   + +   #%, +   #4% + * + +   + +  +    +   +   + +  + +  ! +   +   +>9/." +   +     + + +      + $")$  + +  +&$          +  "2- #!! & *) + +     + + + + +   + !#  + + + '     + -"&   +    &7# (#7&(  +  +    + + + + !$!  +  + + +  (0;>EWYasr~   +    +    + +    +  554      + +  #!    +   + ((          + +   + + , & + +  + *$   +$:2   **   +  +    +   +  +   %  +  +    + +        + + +   + +  ('  ($  "  +  + +   + +  + +     +     + +  +  + +     #    + +  + 5+  +!!&8,.6,( )    +   &%    +&!  ! +    +" $,==AUV[�ˆ–   )*$      +  + +  + + + +    +  +  !1$$ $12 &*# !   + + +  +   +   + + +  +     +   )  + +    />=    + +   +    + +     (-C:#       V7&   +  + +        + +   + + + +  + +) +    #% $ !   + + +  +  +   +     +  + + + + +   +  !  +  + &% + " /:01$ /%*<5!   + +  + +   + +  + +   + + +   "(,:>LTXZ{~Ž  + +  +        +  +     +        +  7,"6. + ** 2$$" + &   + +  + +      +   +   +  + +   ,&   + +   +  +      ) +   !7.0JA  +   + +'    X3)D#$       !   +  4*)& +   ' "! =J8NHD)'%      +   +    + +  +    +    +  +  +    + &'' +  +      + + +  +  +     +   + +   + +#$.=?H[_hxwƒ     + +  "    +   +     + $%  +  +   1$*JY]d{w„'&   +    +    +    + +   +  +    +    + 2"!. * !&& .(%'!   +    + + .*    + + +  +         $<7     + + +  .J< ! +"8OK*( -6*" +     !2+)>7" + + +  '! +   + +  &&!)2! + ).48(<<,00*GF;@<5 + +   +    +  +    +      $!    +  + +     /#    +    + + +   + +         +   + -%%.39=IJQ}}Œ)("+)"   +  +  + +  +  + +!   +  +  +     +  +,!) + + +    $" # +      + +   + #4+ + +           + + "    +  +   +  3' -!1!!3%    L+) +     + + +  + + +   +  +           &( + +!"9@-F<5  + +      +  +       +     +   %),#    +  + +        +  )# $,7/)    +  +  + +  +   +   +  )-  &14)   +   + + + + +    +  +  + +       +  +#$   +  + +   +      + +  +!#&)2IHLЉ“!    +   +#) +*1$ + + +  +   +   # + +  +    + +62 +   ! + - + "   ! + ,*&      + +      +   +  + )=3"3.    "!B+! UB4B;7  *" +  +  +  +      + + "    !#  (& )"  +  +       + +   +  +      +  * # +   +         +   + +$%65*";%! + +  &  + +  +    + + + +     + &   +  $    +  + +  + +     +  + +   + +!3* +  + +     +     +   + + + !   ! $8K>DQC(+'RWVFJF$+-  + + +     +  + + + + + + +    %$  +  +  +   #&  + + !&  + + +   +    +        #$      + + +   +  + +   +   %+#  +       + + + + '$92 +  +   + "   + + +  6@QQT`ˆ†‘ #4*2D4@F@*%($"  +   +  + +    +) "(     + +  + +&    !+*9'#  + *!%&  $  + +  '7)'  + + + (;*+;* + + %'#+*$+!  $0>66J<7>GDME6@9    +  +     +   0( +4F@o|†0B@($        + +    + +  +  + + +  +  +    +     + + + +   1+ 1*!  + + +     +  + +     +   1)    +       + +  +  +B?#31   +   + +  +       + +  (78AIDP…ˆŽ # &!5C287.             ) +  !1  +  -!1.!  ) +0 #4&   &)& + "  + ,%:."    #2#$ +$"! 2(  + "51)"68>:;;(.*7HA,*  +       +  + -% "4*Ric‰˜¥=IO);7  +  +        +!   + +    +   +  +   + + + + + 2B<!   0$#  + +  +    +    +   + +  + +   + +   +  +    + + 0&,(    +     +  "-   $    + + &7;GKKR}�Š  %8:"# +    +        +  +   + + &(#!2'-"$  +  ! +     *  + + +    *+   +   $(=5%  +   +  :74OFM,%(# +    +   +  +0D: !   +   &  +  + + *#    !,!+>3,?3"2)*%! + !"   + +  +  + + ,$!!+& +     "    + + +   +   +       + + +    +  + + + + +   + +      & + + +   +   + + 9/0?-'    + + +    +  +   +  +  + +  +  + + + + +    + +    )%) + " + (;-2=-! +  +    12)5.    ) 2"($   +  +  +  $ +    +  + +  + +    + +&;3 + + + + + +     " + + !% +  + + '" +  2'      + +   +   + +  +          +    % +)'%  *   +   + + + + !0B1#,) +  + +  7%0C/1' ! +     + + '#+';6'!  +  +      +  + + +   + -'  +    + 33* + ('#   +     + +*,0,      + +!     + + + +  + +  + + +  + + +#53     +    + + + + + +  + /!$  %   +       + +      +           + +    +   +   ..   + +    + +   0$1C:  + +  +    4%C0?]CG•‡˜;-6 2$&XEFfEGqIL‹[gŒRlˆOd�BWe)4^#/K*  + +       + :M@,81 + +     + ) #2G>((  % +    +     +   *#,'  + + + + + + +  +  + !)2$-$"$ +      + !2*(    +     + + +   !(     +       + + + +!5, +       +  + + + +$$!   + + + + $ + + +  +  + ,$!*$ +  + + + + + +    +    +  +    + + +   + +  +"  ,-9.!8(&#!  .90 +   +   5F"(N02®˜©¦„š¡rˆ�Sf–K\˜L`›Uh˜Of”Jd“Of‘La�GY~7I|5Gs0;d(/Z'. + + %   +  5D0'       + $ + %$2(1%   + +  +  + +  + +    + +       +) ($!1$     + + %"     95/:3...$$%F;5A70$$"#$'+) + )$ +  + + ### + + ,'  .& + + +   +    +   +  +  + +    +    +   +  &1," + + +     +  +  + + + +    +     )!+#   ++0#    (8,)0&'   7D(2\15¥{”ª|•ŸVq”?N‘>O–JY“G\�DZ–OZŠGVŽKV‘GT†CV†BP…>P~=M~>Va5H +     + &' + + /C;  +   $   + + + + +     +   + +   + + +     +  + +   +  +  +  % /#+.%     +    + + + ! + +     + + + # +  +     +   +&1?5  + +   + *!   + +    +  +  +  + +       + + +  + + + + +  +    + + +  +   +  +    + +   +    +   +  + +  +    +  + + + "(#/        + #5B4,/! + + +  7G +^2;—ew©wŽ¡Uk™H\•F\•IX—PmšQg˜Pd�L]•Uj™Sl„Ha€CWŽFX‡DX‡@Wv>T!% +     '   $4&  + + +! +   + +  !!  +        + #      +  +  +  +  + + +  &+/!,%  + +   +  +  +   ,% +    + + !       +    0&   +  + -! + +   + +    +     +    %;,!44(+   "  +  +  #-     +  +   +   +  + '!!   +   +      !(6)!   +  7G}BPo25ŒEK°€“¹š®¶™­©|—£j€ž`xŠH^�Qj–Pi”Hbv;F}BO�DZ‘J^ŽEZƒ9ON02+$# + + +  +     + +  +  +  +  + + + )   + +  +   + + + +   + +     + + +  +    + + +!0 - !  +  +  331*    + + &   + + +   + + + +,*  ');A(3     +  ,"    +     +"! + + ,%"6*':1   + + + +   + + + +  !   + + +  $& + +  % $      +    2%(4)   +  *q8@x18‹GS‘BY†PZ‚T_Šg~cws[nyktWKShde‹~œ[Q_ZQL‡f‚‹avƒd|TAB}\c…Vg_8A6!& +  + + + +  + &$ + + +  +    +     + +(.     + + + "    +   + +   '1   + + +   + +     +  + +  + +     +  +  + +  , +   $''-."*#    + +  +  + )$&,1  '&8-/$  + +   +  %"    + + +  &%  +  +     '84>OM;JF + + +  +   + +      + +  +       + +  +     +    +  +  + + &#;.$!   +I,4~>V])Ri $o.0�9C}=JR'-w;Eg6D1! P2:C-< ?$,= >$%Q:A^=JJ:CE5@)$,),. + + +  *  + +   $  +   + + + +   +    +  + * ) +    +  + $5.  +   +   +          +    +  + 06*AD8<:4 + +  +  +    + +        +  +  +         + )   +  +  " 3/    +  +   + +  90 + +    + + + +  + +     +   +  + (4& +    + 'O-7Q&'o(*j0.p.2x:@”Pih1:“Zdš]psCKD1#ŽSeT/77%D($R"&D"$="O#)4$%*  +   + !/   +     +     + + +   + + + + +   +   + $   + -# +    + +  + + +   #8.      + #4/  + +      + + +  +      + +  +  +  + :%&I&(ŠAPf.(N'$k/2”Ujr=DuEM�Q`ƒMT7*–[rtBN2,i?:~EKrEJM-'i@‰Qe5(‘[oqG\)(†Wm~O`mIP>/+6)% + + + + + +  +  ,! +    %   )#*"   +   +   + +    +   +  &:,  +       +  + .. +         +   '%  +     + + +  + + + +   + + + +  + + +!/"   + +   + + +  +  + + + +   + + +    + +   +  + +   + + +  + +         +  +   + + + + +   + +     + +   "  + '%."<)"#0  + + +  +     +   '%     +     +   + (   +    +   + + + + + +  %, +   +  0. 0   (  +   +   + + +  + +  + +  +    "% + &#   +  + +    +   +   +               +  + +  + + +     + + + +  +  +      &*1,[lj€�”Z^a +  +   &(90." +   + + + + +  +     +   # +  $   0'/!!5'("#    +      +    &"0%   +  + 2$("#52*( +   #  ! +  + +,$  + +     +   + + - $ #   + + ,%# +   +  +   +  ) + + + +  + +  +  + + +    +   + (--"  +  + +     +        + +$ /  + +   + + + *# + +  +  +  + + +     +     +  + &)9/KVL+0/  + +    +   0(0$"         * +  +     -!5"+.-  +  +   +      (+-! 3+      $3'*:,*:-( *  +    + + +  +  +      +   +  +    "%%    + .$5+    + + ! +     +  + + + +   +      +  + +  +   + + +   + ) + + + + +  !   +      3" 6 +  + +  + +   +    +  + + + +       + +   + 6A6:B?'    + +  +   *=."5)  +   +  +    + + !$     + + +*-#*      + +  + + &.#   "     ) *#):4*!2!&4++-  +     +       + +  + +  &    +  +  +         !0 )<- +  + # +     +   + + % + +  + +  +   + +       +   +  + +  "7* + +  + + +0#+*)  6%; / + +  &   +     + +   +   +  + +   +  +     + + $ +   +  +  /%   $   + + + + &!!) +  +    %/!'"  "  +  +  +  +  + (  (     +      %5&!.!    +    +   !    +  %1&!   +   )!   & + # +  +      +  + + +    + + + +   +  + + + + +#  +       ("&      +   +** %)      +1  + +     + +  +     +   +   +  +  +       +  +  +  + $" + +  + !)  +  ,4*$7.!3,! + !    (&      +  +     + + &      &. 0B5  +   + + + +   +  + +     +)3# $   +  + +  +  +  ! %+   + + +  ")  + +  +  +  + + + + + + +   +  + + +   "4%    +  +  -%   + +  + "0" + +    !4#"%1&$   3 + +  + +  +   +     + + +   +   +   +   +     #  + + +  +  +  +  + +   +   +  " $  +  ( +   (&!)5,!5,,@6" +'% $-$($   +  +  +          & + +    +     '8,,<3         + + %"(             +    +   + $  +    + !' H=#W<) .%$  ) #**  +  + + +  + & +  "     + + % "      +  $     +    +   + +1*      +  +    +  %.    +  +     +  # +    + + +  *""   ! !(+( 1!(  +  +  +  +     /"#5)4%  # + + +! +    +     + )'2% +  -",'"    +    + +  + +   #   +        +   &        !=.1#;'4"D*1*U8'I(#E*C+. 6B' ) =&-'&    -8&   +1'     +    +  +( +  +  + '     +   $    !% +   +  +    + +( ,"    ""  + + + +     +  +    +    ,!#'       +      *"" +  +!1!  +#  +  +     !&" $(    + *!-'    +    +      +    + + /$! &        + &$ !$F1 4.!H90H/#V:%@&D(.O2#0+"?"'-5&"$+#    QE%(#      2B/'3*   + + +  + + +  +  + !0 .  $  ) '&!   +  "      *B+! 78 0 1+  $(   + + +   ! + +   +      +):%&   +  + +       + +  +   + +  +   + +  + + + + +7.-?9  &       + +    + +     +       + +  +  +  + + +           % 4%        + +     +    " + #+;4  +" + ($.A.,% ".'?EL%/?( 2"8E0.=, 9,1A9  + + + +    + +  % +0  +  + $  "    $%#   +    + *+ #  ".     +  +   +  +   +  + +  +(5B.  -#     + + + + +   +"  + +        +   + +    0))" + +  +    +  +    +     +    (!    + + + +  + +  + + +    "   +."'! +     + + +              " + +  $6')!0$ + 1%0<5H[J$!% +    + +  + + +    +  + + + +   '  + %"    +  +   + + +  +  + +       + + 3+   1   +      +!"     % + +      +  +  + + + + + +  #  +   +    +    +   +         + +     %  +   "  ! + +    +   + +   #      ! +    + +#  +"    + +   + )     +  + + & +    +   + +  +   " "+>4!.%$""'8 2>(#5-  + +   "     + +  + + +    +   +   + ,"  % + + +  +   +  + +  +  +  + + + + + +     &   ,  + + +   & +  !   '& + +     + +     +  +   +     $    +  +  +  +      + +  +     + +    & + +  +  #                 +  +      +  ) +            +   $     +     +    +   #8/#  %%#%*(2" 2'  +  !,    + + + +    +    + + + +  +    !  +    + + +  + +    +  +  - + +  +' + +     +  !6(    +  + +   +   +    +  +  "  + + + + +    +  +    +   + +   &!&   +  *3   +  +   "   +         +      +  +  + " + ! +  +   +     +    + +   +   +  + + ( *     +  *"%#      "23,. +    +   +    + +  + + + +   + +   +     %        +  + + + +   + + +        + + +&   +  +      +    +   +  +  + + +      +      +      +  + +  + +     + +  +  +    + +" ."& (-KK9  +   +   + + + + + +!!( " + +  -"  +   +    +  +      +              + "    +  +  $4$"    +   +  + )'70" +   .%&"    %    +    +  + +  + +  +  + + +   ,   + +  +  +   +        +   $ +  +  (   + + +  +  #" + + + +   + +  + +   + + + +   + + + + +  +   + +       +  +  +   +  + + +  + +    +  + + +   +!0%6&6@,!    +     + + + +   "  "    + + + +   +      +   +  +  +     +   +   + + +  + +   + $):*0$"    + + +     #+8- + ! + +  #(&$     + + + +  +    +     + +  ",! + +   + + +  +     !<,#$ +     +   + 52+ +    + +  %    +  + + +      +   + + +         +   + + +   +   +  +  + +    +   +    *9(!-"!      +  +       +%8$    (  %)  +  +  #    +  +       +  +  +  + +  + + + + +  +   + +!,#0"!. #3#  +   $$ .(     + +  + + +    + + !$ +  + +    +  +  +  + +   + + +    + + + 3& + + + + + +     + / 9 + % + +   +  +   +*" +          +  +    +   +  +   +    +           +  , +  + ("     +     + + +  + + $ +    + + +  '"  +  +    +  + + +   ! +     + + +  +  +       + + + + +  0"   +  );#/B+0?+     +  +  +       + + + + +  + + + $     + + +  + + + +    + + +       6P? + +        $ C$3    +   + + + + + + +$   "   +   +          +  +      +  +  + +   + +  + +    + +    + +     + +    + +      + ." + + +       +   + +  + + + +     +  + +  + *     + +       +     + *      *+='%  +  +     + +  + +  "  +  + +    +  +   + + +     + ,C4 + +  + ! +   4@' + + +' #  + + + + + + + +     % "# + + +  +  +   + +  +  + +      +  + +            +    +    +    +    + 4!! &  +     +  + $  $   +      + + +    + & +    + + +    +    +  +       +   + +         + +  +   + +  +            + +   + + + +  + + + +     + +   + + +CZH.46 + +   +  +  +  >!P3*#"0"+     +  + +    +        +    + +    +   + +& + + +   +  + +   (  +  + + +  +    +       ! +  + +     + +  +  + +   +    + )$  +      +    + +      +   + +  +    +    +  +    +  -#+# +  + + +       + -72"&  ' +  + &  +     + + +  " + '" + + + .#%-/!   +   +      +" "   + +    + + +  + + + + +      + +      + +   + +  +   )#2(7*       +  !$ +   +   $( (*!   + +  +     +  + +   +     +  + + + +    + + + + $:% + +   +     + + + , $'@(1E1)#)*<0     =-"0! "   +  +( '    4#  +  ,    +     + + +  )"  + $* (*    +    "     +  +  +" + %'   + + + +              +  + + +    + +*8!& "1 +   +  +   +    +  + + + +  +    /5  + + + +   +       +     + + + + +  +    +    + *   +  !  +))9,           % .;,'5"*""  +  + ;+@R*$ ++%  + $1 $$% + + #  +     + +    + + +    +&!,(5$   + &   + + !  +   +  +  +  +  +  + + +  +   +  +  +    + )<))3%$7&  +   +  +  + + + )$ ,  +  +   &     + + +   +  +     '+#  + + + + +    +    + +    + + +   +  + +   + + +   +     $     + +;+% + + +   #  + +  "#.%!    92<*L1  5/!   "1!,!#!%     +    +  + +       + +  + " +   + + +   +  +   + +    +      + +  +     !  %   +    +   +   # + +!/ -6("0   + +  +    + 6+$)#' +  + + + +    +  + + + +     +         + + +  +  + + +  +  + + + +  + +  + + +   + + + +   +   +      * +   0) +  +  + +   + +;$*=$,#+"% )")! /:,# $+  "2    + + +  +    $!   +  + +    $   + +  +  + + + +        +     "         +        +  + + % # "   +      fL;$"65'" + +       +             +    +  +   +  + +   + + + + + + + +  + + +  +    + + +  +  + +       + + + +  +  *   #   + +$!-7K7$5(+1 $  +;&  +     &-   + #5$!     +    + +        +     + +  + + +    +      + +  + +  +    +     + + +   +'    +   +    +TB2'&aL:lSE + +  !#%          +          + + + + +    + + +  +  + + + + + + + + +  + + + + + + +       +  +         " +    ,%#$-B11E2$7*,$ &%$ &9"3# +    + + #%   .   +   +       +     + +         +    + + +   + +   +  +      + + +       + +     % +   + +        + + !C6))&bF6ŠfP'! +  + +   #)! +       +  ,"%)$0*',%49)  + +   + +  +    +     + +  +  +       +       + +  +  +  &  +  +       + +  + ,3'  ! &-0?.("4$+:/$'+"+ #5$$&,   +  + #    +         +    +       +      +  +   +    +  +   +  + +      + +  +   +  + +     +        + +1"F7,bGB›m_%   +   %   +$(*%& .01==*„‰q˜—ƒyuhjUmn[   + + + + + + +  + +  + +  +   +  + +  + + +   + + + +    + + + +      "%   + + + +    +% +  + + "# &)!   +)  +      +       +%3        + +  2   + + +   +     +!  % +  +   + +       + % +   +  +    +     ("0C9-A0$9($  ,(&     * +     + +   34$w_R‡e[¯Š„9.,     #.)6$K[S]kbbo]“£™§­¦©­§¢¥˜¢¨›ª¬¦¡ª¥��”=R?tsq{m`lZT_IST@ +   + + + + + +   + + +  +     + + + + + + + +  + + + +  + + + + + + +   +   +     + +    + +  + + +    +        !-   +      ! +  +    +)7     +  +  + 4!  + +     + !  +  + %2!   +   + + +  +    +  +  + + +   + +   + +  + + +  +  " 0$'=-+@1&;.#7,$8*1&$9*+! +  +   +      + + +   QE2v[F’iZ±‘‹H>=  +   + )5#s�s‡•‹‚�‚¨°¬µ¹·±´²¦¯©š£œ¢§  §¢“š—B.  +   +   + +  + +  +   + + + +   + +    +   + +   + +     +     +)  +  + +  # +& + +  +  + +      & +     !#*   !  +$    +    (  +  +   +   +     !   +     + +   +  + +     +    +  +  +   + +     + +    +  +  '%-,&7/?Q>ObD@Q:1C3)<.)!  +  +   +     +  $�lUj[IfMª…s~_TD:5   !  +##OZS—Ÿ˜‘Ÿ‘ ©¢œ š¤© ‹�…Š{‹�{ƒ…xHV?jq^LRG*5#$    +  + +   + + + + +  +    +  +  + + +     "  +  + + + +   + +    0$    + +  +  + + +      +      + +   + +  +   +   )*!1"' #   + +       +  +   +  -:$3:%(,($$##%%   +  +   + +      +     + + * "%   +   +  +  *;J2BO1:J6#4&! +  +  +  + + +^H3x[INH7ŽiS_I<4*.   +   !"    + 3;3K]QSYR ('/'>D79A29=2HPJ@UMCK>)0&%      + + +  +  + + + + +      + +  +   *  +    + +  +  +  -*   +   !# + +     +   +  +  + +   + +    + +         )*$4$", )!  + "  +  +   +  + +   +&'8!4%1(1*1+51)# + + +   +   + + +  + +  + )" +       + + + %%4&;H0.?,,         >,^H9=:-lS=*! + +        + + + ) &,'  #!%2@5\ml$*'#    +   + + +    +   +    +   "'#  + +  + + + +  + + +  + + +   %      +  + +  +    +    +     + + + +   +    +  + + + +)<#$%6"" +  );  +  + +         + +  -;(p^?�hDˆjIaAy]9YA,L<(A3@5/)%#!  +  +        +  "   +   +  )&& + +-" +  + + +$ (%   +   +      + +   + +         +  + +  +‹�*4     +   +    +  + + +          +    + + + + + +  "-#   +  +  +  # +   +     +       +   +   !   2$&     + !(&  + +      +  +     +  #&DC&‹qF�W�}S‹sWs\=hQ8J;&5,)!&#*$(#  +   +  + +  + +   +  +  +      +   " +  " + +   + +  + +    + + + + + +  +    + + + +  + :NCXdm"*.    + + + +  +         + + +   + + + +  +    +    + +   4)      + + +   +     "  +  +  +  + +  +   +0  + + #/",   +     +    +  +  + + +   + +  )1w`6”zP”yQš|T…lJ{gEZL361-(($.&*#./68#" + +        +   + +  +    +       +   + + +    +   + +  +   + +      +       + + +   + +P`a*9:     +  + +  +  +  + +   + +    + + + + +   +  +  .    +  + + +   + + +  -"         +     + !&$   +  +     + + + +  +     " +     +         +  + +  + + $%4$,"  UQ+v_9|_;’l=Ÿ‚R „X�uSbR7NE-<6&50/1G@"lc9h`>% +       +           +  +   +   + +   + +  + +        +    +   +  ) + + +  +     + + + + +       + +  + +    +  + + +  + + + + +"   +  +      )$  +   +   + + +  + +     +   +            +     + + +   "N@$aG'w[2Šd6›rB­‰W�U–wLo_:YM-XL*cP(dV0[S%  +  + + + + +  +   + + +      +  +FE,�yJŸSŸ{M¢|I§K©‡U—t@‰jBw_6hZ=`X8haFqfCxlGyqTX]F2:-  +  +  +  + +  +   +     -$ +      +     +  + +  +  +      " +    +        + + +  +  + + + +   + + + + + +     + + + +  + +    # !&&  *      + +     +    + + +   +  +    + /%#    + + +      + +       +$   + +   + + +  +  +   + "       + + +   +     + + +  +   I>"}e3“uJ�wI•zT �bœ|RœyM�xU}gEq^@k_@lcIldP~xUƒ�btrT/6' + +      + + +    +  + +  +    + + +        +    + +      + +    + +   $+ +    +  + +    +  +   & )'* ,  % + +  + + +   +     +     +!&  + + +  +        +   +   + $!     +   + + + +   &      + + +   +  +$ + +  + + +  + + +  + ;7s]€fCš€Yš{J–yNŽyTwiLvhHl`Cf^Eg`BomUvsWpoSIR;(3(!+$  +    + +     +  +     +  +  + +  +    + + +   + + +   + + +    " +    + + +     + +  + +  + +   + +        + +  +  +  + +  + + + + +  .'<6'  +    +   +            + + +       +    +        +  +   +  +&   + + +     # ) +  + +  +   + + +  "    + +     +    $%+"b[:�}[�{QŽ~aqhKjbIgcEcdQaaK`_KTWFRXLHTICI>9C;!*" + +   +  + +     +  + +  + +    +   + +  +   +  + +        +    + &   + +           +  + + + + + +    +        + +   $ <$G#L)FB   +    +   +  + +      + +   +  +  + + + +)    +    + '$   + +  + +   + &    + +  %"!  +     + +        +  +   + + +  *2 9<&\O5JG2@?.PR;_fQacOQVMEK:EG5BI=BH4AI86B9  +   +     +  +!$    +  + +  + + + + + +      +      +   .%,3( + +  + + +  +  +     +  +  +  +   + + +  +   + +        + +    %d:"`1^3H> + + + +   +   +  + +          +  +  + + +   + +&& +  +   + + +   +   + + +    +    +    + +  +   +     +          + + + #%,7)X_I[^J>E;-7+*1%&1'4=+>I6EN@%"  + +  +  +  + +     %*!   +  + + +    +       +  +  + +$0!27, +   + +  + +  + + + + &&  + +    +  +  + +  + +  +  + + +    +   + + "T*F!B'98W/-*# + +"       +   +    + + +  + + + + +  % +    + + +  +   +     +  + + +  ( + +        +  +  +     + +   +  +  + + + + + +  .3"#*    +7H5EI5(*  + + +  +     +   + + +   + + + +"   +   +   +  + +  + +     +  +    + +   +  +     %*  +  +   +  +  + +   +-.&.4* +        + +   +    + +    $    +  + '16,*'.H(Z7!1 + +1!0' +   + + +        +        + +  + +    + +    +       + +  + +  -#6    +  +     + +  +    + +  +  +  + 7I2      &   + +   +  + +   + +   + + + +   +      + +   + + +  +  +    +   +      +     *  + + + + +  +   + + + +  +    + + +  +   +  +  +  + +    + +   + + +  + 1  .K&/(  B'l?C)# + + +1#/) +  +   +    + + +  + + +   + +   + +   + + + + + +   +    + +  + +    +  +  + + +,);" +   + +  ! + +       +   + $/0!'  !    & 1B1  +    + + + + '  +  + +     +  +     + +   +  +  +   + +      + +  + +   + +  + + + +      !. +  + + +  + + +  + +   +  +       + + +  + +     #  +   +    +  +  +: 1$ +   ;!O):"$>( 2&   +   + + +    +  + +       +    +  +    +  +   + + + + +   + + + + +     +$*        + +   +  +    %0 +    + + + + 0G&yO1Z+I#I%(  +    + +#*%52!37& +  + +      + + + +  +    + +    +   +    + +  +  +  +   +           #-!  +  +  + + '   +  +  + +    + +   + + +   +   + + + +  +     + + + + + +   +$+   9;$9# + +  +    +           + +"  + +     +  +  + +     + +  +  + +   + +  +    + +  + +  + + +        + +"&1!    G*v<%n:%T$H07 *   %  + +++*.$! +   +  +       + +  + + + +  + + +    + + + + +   +  +   + +   + + +  +6)@G-%/     + +    +  +  + + + +     +  +  + + + +     +  + + + + + +   + + +  #$* ().   + +      + +   +    +% +    +   + + +    + + +     + +  +    +  +  +      + +   8E( +  + ! @$_*C)*+ + . 4  +$   + */'   +       + +      + +  + +      +&    + + +   + + + +     +    + +   +   +<+"2"%      + +     + + + +  +    +   + +      +   + + + +      +! F&     + + +       +       +        + + + + +     +   +   + +   + +     + +  ( +    + + + +!   + +#1"0;*# + +    #&  + +        " +  $,3"     +     +       + + + + + +    + +  +  +  + + +&   +   +  +     + + + + + + +  '%.&  !%    +  +      +  + + + + +  + + +  + + +   +  + %  + + +    +  + +  +   +     +    + + " +  +   +   + + +     + +  + + +     + +   + +      + %&6$    +  + +  + +   # +  '-   +  +   +  +  + + +   + +  +       +  +     +   + + + + &  +   +*"  + +  +     +   +(% !   (!  +   + + + +      +  + + + +  + + +       + + +0 + +  + +    + + + + + +   +   +     + +  +  + + +   +  +    + + +  +               + + + + + + !$5%  +           %    + *$" !   +  +        + + + + +  +         *! + +  +  + '-'  + +  +   +      +  +  + $  $"  + + + + +   + +  +  !  + +  + + +  + + +   +   + /  +     +     +  +  +  + + + +     +'        + + + + +  +    + +   +   + +    +  + + + "   +    + + +($2%#  #  + +   +  +  +  +%0#* +     +   + +"   +  +  +    +   +  +*     + +  +   #!  +   $   +  + +   +   +  + +    + +  + +  +  +  + +  +     + +      +  + +    + + + + +      +  + + + +  + +    +  + +     + +    +  + ,&7&(6&  +  + + + +   +  #-  +    +  +      +  + + +   *&    +   +  +  )#4&  !  +  + +  !   +   +'/    +   %.+ +"  +    +  +    +  + +  + +  +  +  + ';.  + +  +# +           +    +  +   + + +  + +     +     +    + + + +  +  + +  + + + + && +  + + + + +  + + +  +   +  + +        + .+=)+;'" + + + +   +  !, +  ' +   +    +     +  +   !   +     +  +  + '%  + $" + +    +  + + + !  + + + (      &"!+&$,"'                   +   +  +  + /D1'" + +   +       +  + # +     !  "       +  +    & %       +  +  + + +        + +  + + + + + + + + + + + +  "   + + +  + + + +  + + + + + +     + + +  + +     +   +! + +  +  +   +  + (  + + #  +   +  +  +  +  +       + + +  +   +       + +   + + !   "   +   *EG2E)!8 0/"-"08'53."  +      +  +  + + + +$  +   +  )    +    +  + + +     +    +  +    +  + +    "  "%      +    +        + +     + +   +    +  ! + + + + + + +  +  + + + + +   +     + +  + +       +  !  +     +   +  #' +   + &"      +    +  +  + + +   + + +  +  + + # +  +    +  + +     +!(  +  V:T:O6M7O8M4K:Q6M5L5K2F4C3E3G3F1E5J0A,B-B,@+A)?+>*<-?+=*;,=(>&4&6&6+9$4#5';%6%6(6#1%4!1+9#2 0"1!2 0 .. .!.,++**('& ' &&% $ $ $ # "  "  #"  ! ! !! " "!## " " " "  !                          + +   +            +   +         +     +  +   +                 +   +  +    +   +  +  + +  +  + +    +  +   +    +      +    +      +  +  +  + +�ÄÑ€ÆÐ�ÃÒ€ÅÑÆÐ�ÄÒ€ÁÏÅÚ€ÅÖÃÐ}ÄÑ}ÅÓ}ÄÐÂÍÅÎ~ÅÑ|ÅÔ|ÃÓ}ÆÓ}ÅÐ|ÄÑ~ÅÔ{ÄÏ{ÅÔ|ÇÓ|ÆÓyÆÐ|ÃÕzÇÐzÃÓxÄÐwÄÓyÅØuÅÑuÈÙvÄÔuÂÔvÄÓvÅÔuÅÔsÅÐuÂÐtÅÒsÄÓuÄÔrÂÒqÃÖqÁÑqÄÔpÂÑqÃØoÂÒrÂÖtÄÙoÁÓnÃØpÄÜqÅÛnÅØnÃÔnÃÕnÅØmÂÕmÁÓoÃÚpÆÚnÁÛnÀÓmÀÓlÀÒkÃÙmÂ×kÁÚjÁÚmÆâhÂÛi¿Ök¿ÖmÂÛhÀØj¾Ög¾×i¿ÕjÄãfÀÚh¿Ûh¿ÜjÇîd»Ôc»Õe¸Ñf¹Õc¸ÓaºÙf¼Üc·×f½àa´×`´ÎbµÒa²Ó`±Ïe¸Ùa°Ï^²Ïc¸Ø_°Ñ_³Ñ_±Ñ^³Ñ_±Ñb¸Ý]®Ñ^°Ò]²Î]®Í\°ÑY¯ÌY«ÊZ¬ÍY­ÌX«ÎWªÊY¬ÎY©ÉZªËX¦ÉX©ÎT§ÄV¨ÌS£ÄU¦ÅZ°ÕV¨ÌR¢ÀW§ÏU¥ÊS¢ÆR£ÄT¤ÇR¡ÆQŸÂR ÃS¢ÈS ÆR¢ÇV£ÍR ÂO ÀR¢ÇP£ÃQ ÈS¡ÍT¥ÑQŸÉNœÂR£ËP¥ÎQ¡ÍIš»Kš»Lš¼L�¿K–¹K—¼I™¼L™¾K˜ºH–¸H–¶H•¶G�°F�²G“±I�´I“»E�µL–ÀG“¶G“·A‹¥F‘µF‘´E‹³C‹®FޱE޹C‰©C‹«F‘¼C‹°F޵EŒ±@†©A†«E�µ@ˆªDвA†±>…¦>‚£>‚ª=~¥=}¢<}Ÿ?‚¦Aƒ¦;}ŸBƒ³?€­=}¤9zš:zœ9wš;zš;{¡9w˜7x”;}Ÿ6oŒ9u”9r—8r—8q–7q“2kŠ8n�4m�4m�3l�2kŒ4kŽ2j‡4mŽ5o‘0j‡1j„0j‡3l�4l�1e†2iŒ3k‘/dƒ0h‰2lŠ2i‰4k†1g†/cƒ.`/g„/cƒ.]t.[u+[x.]z-Xr-[{,Xw*Yv0\u.Zu,Xy-Wt,Ut.[|*Sr,Ts-Ur \ No newline at end of file diff --git a/xie/xc/programs/xieperf/images/image.012 b/xie/xc/programs/xieperf/images/image.012 new file mode 100644 index 0000000..adddc02 Binary files /dev/null and b/xie/xc/programs/xieperf/images/image.012 differ diff --git a/xie/xc/programs/xieperf/images/image.013 b/xie/xc/programs/xieperf/images/image.013 new file mode 100644 index 0000000..edb4d93 --- /dev/null +++ b/xie/xc/programs/xieperf/images/image.013 @@ -0,0 +1 @@ +•˜—™˜™˜™——˜”—™˜˜™œ˜˜š››˜˜œ�™œ�Ÿœ�žšš¡šœŸ�›œ�ž››™™�š™™›——›˜›™•�—•—šš˜˜•”––””“’“––˜˜™–”‘�„„„‡ˆ‹Œ�’“Ž“•–™—’ŽŽ���������’’‘“‘—•‘—›–˜˜—••——“š›—š�š›ž�›œ ›™››—–˜š˜˜œ™››�š›�›�ˆ‚y{{~€„…ˆ‰����’���‘‹‹ŒŽ‡†‡ƒ„ŠŒ��‘““�����Ž‘�ŠŒŒ‹ŒŒŽ���‘‘�“”‘���‰Š‹ˆ‚‚‚ƒ„ƒ†Šˆ�Œ�Œ���Œ‰�ˆŠ…ˆŠˆ‡ˆ‰‹Š�‹Š‹ŒŒ†‰…‹†Šˆ‡‰Š‹�Ž�ŽŒŒ�Š‹‹‰‰ˆ�ˆ�Љ��Œ�ŠŽŒ‰Œ‰‰…Šˆ‡‹��Œ‘��Ž�‘‘ŒŒ‰‹‹‹‹���Œ�Ž‹�����‹Œ‰‹‹‰�������ŽŒŒŒ�Š��Œ���‘•’�‘‘‘ŒŒŽŒ�‹�Ž�ŒŽ‘’�‘“”’��’�‹Ž�‘�����Ž‘‘Ž‹‡ˆˆŠ‹‹Œ‘���‘�„rfZQNQRRSLKNLHKKKLIKLKNHHLKGEGIIONLNIJNLOPRPRJJHGDFBDHFKIOJHEGGFEECFD@DCEDBBBCBBAD?@BB•••–™•—™—–—˜˜——šš˜•™˜œ›—˜››�—™œ›œ›™š�››�œš ›ž›œ�›œœœ›˜˜š˜—™”’“—–œ�š˜———˜™•�‘“�”‘’“”Œ��‰…‰ŠŒ‘“‘’•”�’‘‘�‘‘�‘““–˜‘��Œ‹����Š�Ž’—˜™š™••œ—˜—”—–™™–—š››œšœš›�™™›˜—–˜˜š•››—š˜’‹ƒ}{€€ƒ‡„‡�†ŠŠ‹ŒŒ�Ž��Ž�ŽŽ�‰Œ‡†Š‹‹ŽŒ��ŒŽ����”’��’����Œ‰‹�ŒŒ�“Ž“�‘�Œ‹‹ˆ†………‡…„…ŠŠŠ�‹‹ŽŒ‹��Œ‡‹‡†‰†…ˆŠˆŠŠ�‹‰Š��ŠŠ‡Œ‰†‰Š‰ŠŒŒŠ���Ž‹ŠŒ‹‰Š‰‡ˆ‰‰‹�Œ‹ŒŠŒŒŽŠ‰‡ˆˆ�Š�Ž��’�“‘‘‘�‹Š�‰ŒŒŒ‰���‘����މ…ˆ‹‰Œ‰Œ���Ž�Ž“�‘��Š‹ŒŒŽ�‘Š’Ž‘��Ž���‘‘�‹ŽŽ���’�‘��’�Ž���Ž�“�Œ�’��Š‹��ŒŽ‹‘��ŒŽŒ†wi`[UOUUUTSPSLMJHHKLLLRRQILKJFHKONNNILKKMQOPQRJIIFEECFGEAIKHFFKGECCFHC>CECB>EAAAGC@CBFB•–———”––•—™™™š—›››œ˜š���š›››™�›™›œ››™ššž››™œ›œ žœ›š� �›š˜š™•˜˜š—š�•–—˜—š›———”””‘‘‘‘Ž���’�’�˜˜—“—��‹Ž‹‹�’��–—•‘����Œ‹ŒŒŠ‰ˆ‰�”•—™—˜š™š—˜š™˜™˜•————˜™ššž›››œšœ�œ™—š™˜–˜•Œ†~€�…†ŠŠ�Љމ�ЉŒˆŒ‹��Œ‰�ދދ‰Ž��‹‹‰Š‡‹‹�ŒŒ‘�”‘•�““���ŒŒŒ‰ŽŒ‹Ž��‘“�Œ�‹‰Šˆ†‰„„…„‡ŒŒ‰Š‰�‰ŒŒ���‹ŒŠˆ†…‰‡†‡ˆ‰Œ‹��ŽŠ�ŽŽ‡Š‹‡‹ˆŠŠ‡�‹�ŽŒ��Œ�ˆŠ†‡†…Љ‹Œ�ŽŽ��ŒŒŒ�Š‹Š�ŒŽ��Ž‘�”�Ž‘‹�Š�ŒŠ‹‰�’����‘��ŽŒ�†Š‹ƒŠ‰�‹‘���“‘�’���Œ‘��Œ������‘’‘‘����ŒŒŒ��Ž‘‘’�•”—�““Ž’Ž‘��‰‘�ŽŒ�Ž“”‘�Œ†€rf^`VXSVUYVVRLMHKMMMMPUUPQQOOQNRPUUPNLGOKMKNJKGLDGGCEEBIFHGGDDFFCBEBFDAECC>CEDB?BDDDBAD–•–˜—––—˜—––——œ˜šš™™�™›šš�š™œ�›œœ œ�›››™œš››ššž—››šœ�š�›šš›˜šš—™—–”–——–—š–šš™“——•’’‘‘�‘“’—”˜—“’��‡‰ˆ‰Œ����‘‘Ž�Ž‘“Ž���“�Œ‰��’••––—™™••—˜™›�˜—š˜—––˜•——š–š•š�žšœ›œ™™–’‹€{{~‚‡…Š‹�ŒŽ‘�‹ŽŠŽ‰ŒˆŠˆˆˆŠˆ�������Ž��‰†�‹‹ŠŒ�Œ��‘‘‘‘‘�‹���‹‹�‹�ŠŽŒ���‹��ŠŠ�‹†…ƒ‰Šˆ†ˆ‡ˆ„ˆˆ‡Š�Ž���ŒŠŒŠˆ††ƒ‰†‰‰‹Œ�Œ‘���‹ŽŠ‡Šˆ†‡‹‹‰‹���Œ�މЋˆ…‡‡Š‡‹ŠŒ�ŒŒ�‰‹���‹�‰ŒŒŠ‹�‹��ŒŽ‘’Ž��ŠŠˆ��Œ‹�Ž���Ž�‹�‡ˆ‡‰‰‰����������•‘Œ��ŒŒ�����”‘’��’���‘‹�‰Ž��‘�’‘”’—•’��‘‰‰�ŒŽŒŠ��‘�‡…‚~sjida]Z[^YVYUUPNMORSVYZZWWVUXX`Z^ZXROOONKHIJGGHCCGDFDCGFIGGEEDFCCCCBGBDCEE@CDB@B?EAAD>C𙕙˜™—˜–š—™–—˜˜šš››˜™›šœœ�šžž››ž�š �›��›�ž�œ›œ™™›šš��›™™™œššš™—”’““”’“—•˜—˜˜šš˜™˜•—•–��““�‘�‘ŽŽ‰‹ˆ��‘‘“’“‘��‘‹Š��Ž“’“Ž����•”“•’’‘”‘’‘—–˜›–—™™•˜˜˜•––˜•™™”š››™œœ™•�‚xvyƒ„ƒ†‡Š‰‹ŽŽ��‹��‹��‰ˆ‰‰ˆˆŠŠŠŠ�‹����Ž�ŽŽ‹Œ�Œ��Œ�‹��‹‹���Œ�‘’Ž��’Œ�ŒŒ‰‰‹ŒŠŠ�……‰�Š‹‰‹‰‰‡ŠŒ†‡ŒŒ‡Š‹Š‹��Œˆ‰Š‰‰Œ‡ŠŠˆŠ‹ŒŒ‹‹‹ˆ��Šˆ�ŒŠ‡‰‰Œ‰Š‹‹Ž���‡†Š‰†Š„ŒŠ‰†ˆˆŒŒ�Ž‘��‹…‰†‹Š�‹���‘�’‘�‹���Œ‰Š‹Ž�����Œ��Œ�†‹‰Œ‹�Ž���‘•’’”’‘Œ�Š�‰��‘’Ž��”‘�’‘������Ž’‘�‘“——�’���ŠŒ�ŒŠ�Š�ŠŠ‰†„~xsrojhkffa\`YWVW\\\]bgdgfgbcdileh\]UTUNNJJIGIIDCGECEFEFFHJJGDGDFBDEDFBDCBBDGDFBCCAE@CCC“——””˜˜˜™š›™–š˜›˜˜š˜›››—›˜›š›ššœ›œ��œ��›šž �œ�˜šœššš˜˜˜›––˜––—‘’’�‘—–“–•“–”“•”–––”’‘”“ŽŽ’�Šˆ‹Š‰†‹‹���””‘™“‘’�ŒŠ‘ŠŒŒ�Œ‹‹‹‹�’”’–”’‘‘��Š��’•”––“—˜™™”˜˜˜š˜˜˜“™–––˜—•Švv{‚„†††ˆ‰ŠŠˆ‰‰‹���ŽŽ��‹��Œ�Ž�Šˆ‰Š‰‹Œ���Ž‘’ŽŒ‘‘ŽŽ��‹ˆ‰…„ˆ‰�Š���‘’‘����Ž�‹‹……†‚ƒ‚‰ŠŠ‹��Œ�Š��Šˆ‰‡Š…ˆ†ˆˆŠŒˆŒ�ŒŠŒ�Љ‡ˆˆ‡…‡‡‰‰�Ž‹��Ž‹ŠŠ‡ˆˆ„‡…ŠŒ‹‹‹��Œ‡‰‡‰††††‡Š‹�Œ‘�Ž‹‡…‹Œ‰ŠŠ‰‰ŒŽ�‘‘�‘�‘�‹‹‡…ŒŠ�‹‘Œ�����ŒŽ�Œ���Š��‘���“”�‘���Ž���Ž‹‹����’‘‘‘�“‘’�’����—���“�Ž�����‹��ŠŠ‰‡„�wxvyxxyvvoggebbacijkmnnxsqnnrvqrng]YVSSNOLNJJGFHKFECGCIHEMGGGHGHEGGEDCBBBBBDCEACCCBEBD=–“–——˜™˜˜˜™š™š™�™š—›œ ›˜��œ›ž�™�›˜šž›™��žžž�œ�œœ�››œ ›˜™—––”•—‘‘”•”š—–——••�““‘“Ž��‹�ŒŽ’�’‹Š†‡†ˆ‡ŠŠŠŠ��”‘“““�‘Ž��‘�‹Š‡„†ˆ‹‹Š�‰ŽŽŽ��ކ„Š��’’“’•—”–™–˜—�•™š•–š˜•––‘Šwz~…„ˆ‹‹ˆŒ‹�ˆ‰‹ŠŠˆ‹ŽŒŠ‹�Œ�������‹‰Š‹Œ�Š��Ž��‘����‘‘���Œˆ…Љ‹‰ŠŠŽ’’’�‘‘’‘Ž��‡†ƒ‚‚ƒ‡ˆˆˆ‰‹�ŒŽŽŽŒŒ�ІЉ„‰‡ˆ‡Š‡ŽŒ‹��‹�ŒŠ‰ˆ‡††‡‡Œ�‹ŽŠ��ŽŒ‰Œˆˆˆ…†„ˆ‹Š‡Œ‹‰‰Œ‡Œˆ‰ˆˆ†‰Š‰�Œ‰����Ž‹‰ŠŠŠ‡�ŒŽ�Ž‘��‘�ŒŒ�ŒŽ‹�ŒŠ‰‰‹‹‹��’‘��‘�’��‹�ŽŽ’’Ž’Ž��‘•—ŽŒ���ŽŽ‘’‘Ž““�’“”’’“’’���‘�Š���Ž�����ŒŽ�†‚{xz���„�…}vsurtrruy{yy{}‚~yyywuqrkab]]WSKPLOMLNKIIKKHHJJHLJGJIHIBIGDFDDECCCF@BCFEDAHBCš•“––••˜•—š™˜›˜š—˜™›™�œš���œ�œ››œ››œš™�ššœœ› ›œœž�šž›�›œšš›––›”•–”•–˜“–—�“”’”’��ŽŒŠ‡ŒŒ�Œ‹Š‹�†‡ŒˆŠŠ‰Š‹“Œ�‘Œ�ŽŠ‰‰��‹‰ˆ†…ŠŠ‡†‹‰‡†ˆ…ƒƒ„�ƒ†‹�””’•–”•’’‘”—“—˜™™˜ž™˜—˜�Š…y|�…‡‹ŒŠ����Ž��Š��ŽŠŠŠŒˆ‰Œ�‰���Š’‘Š�‘‘����Œ�Š����‘������Ž�����Œ�Œ��‹�ŽŽŠ�Œˆƒ‚�‡‡Œˆ‰‡‡‡‡‡‹ŠŠ‹��‹ŠŒŒŠ‰ŽŠˆ‡‡‰ˆ‰‹ŽŠ�ŽŽ‰‹‹‹ˆ‰Š‡‹……��Šˆ‹Š‹‹Œ†‰…ˆŠ‰ƒ…‡‰‹‹‰‰‹���…Š……ˆ†‡…‰‰‰Œ�Š‹Œ‰ŒŒ��Œ‰‰�‹‹‹����“���ŽŠˆ†‡‰‰Œ‹�‹���‘‘–“‘�’��Ž��Š�‘‘’•‘��“����‘���‘��“’’“•‘‘’‹�Œ‰Œ‰‹Ž‰‘�‘�’‘‘’Œ‰…‚‚„ƒ†…ˆ‰‡„€ƒ�ƒƒƒ‡„‚…†ƒ‚�ˆƒ€ww{vsopmd[WWSSSYURNNOONMJKNOIHIKHEDHJEGGGEBCEEA?FBCCAEAB™›––˜—•™™•š™˜››™—›™��˜�žœ™›Ÿ�›Ÿœ�›Ÿœš™›š›œž›�›™™››š�›�����š›™™–”——”–˜“‘–�‘”�““’”’�‘��ŒŒŒ‰ŠŽ��Ž‹’Ž���‘ŒŠ†„„ƒ�€‚……………†‡ˆ�‹‰‹ˆ‰†„„�‚‚…†�”–˜š–––”�’‘••–”–—˜�™—™˜•’�‰‚ˆ†ŠˆŒ‡�‹‹�’ŒŒŽ‘����‹ˆ‡‹ˆˆŠŠŠŠ�‘‘‘’”��Ž�Œ��‹Ž‹Œ��Œ�ŽŽŠ�‘��‘’��Ž�‹Š‡‰‰ˆ†‹‡€„‡ŠŽ’Œˆ‰ˆˆ…†‹ˆˆ‡Š‹�‹Š��ŒŽŒ�ŠŒˆˆˆ‰Œ‰‡ŠŠŠ‹��ŒŠŒ‹‹†…‹ˆŠ‰†‰ŒŒŽŠ‰‹ˆŠŠ…І‰ƒ†‡‹ŠŠ‹‹‡‰‰ŠˆŠ‰‡‡…ˆ‰‰ŠŠ�‹�Ž�’�ŽŽ‹Ž‡‰Š�Œ�����”‹‹��Šˆ‰�‰��Œ�“�“‘•‘‘”�‘‹�‹ŒŠŒ���’“�““”•’Ž�‹’��‘’�‘—””�Ž‘�Ž‹��‹ˆ‰‰‡‰�Ž’’�Œ�‹‹ŒŠˆ‹ŠŠ‹�†‡ŒŠ�ŒŒ‰�ˆ†ˆŒŒ‰‰ˆ‹‰…‚z€~{€ƒ~wnhdcc`dc_ZXWXRQNLPLLKLLHHFHGCHEFIBBDDDBCFCBEEBE˜–™™————•š›™šœ™šš–š›˜›˜œœœ˜œ�œš�ž›�ž˜��›œ�œšž›™™œ�›™œ›�š™š™™—”’–™•™˜–‘••’”’‘‘“”‘”“‘’’���Š‹�’Ž’‘�Š���ˆ‰„{z||�}ƒ�}„†‰Œ‰�‡……Š‚€‚€„„„‚�†�”•š™—™––“—™˜”””••—–••–™•�Šƒ‚‡ˆˆŠŠŠˆŒˆˆŠ‰ŒŒ‹�����ŒŠŒŒŠ††‰‰ˆŒ�����‘�‘‘‘������ŒŒŠŠŒˆ‡��Œ‘’‘’“��ˆ‰‰…ƒ……„‚‚ƒˆ‹ŠŒŽŒ��Œ‰Š‰ŠŠ…ˆŒˆ†‹Œ‰ˆ‹‹‹��ŒŒŠŒ‰‡††„ŠŠŒŠ�Š�ŽŽ‹Š�Ї‡‰…ŠŠ‡†…ˆˆ‹�ŠŒ�Їˆ…†„†‰Š…Š‡ŠŒ‹‹Š…Ї†…‡†‡ˆŠ���‘‘’‘Œ�ŽŒŠ‰‰‹Ž��‘�ŒŽŽ��ŽŒ�‹Š‰‰���‘��‘”•’‘��ŠŠ���Œ�‘�‘’‘‘�”������‘��“’�‘Ž‘’ŒŒŽ‰ˆ�|stx„‰�ŽŒ�‘‘�ŽŽ�ŽŽŒ�Œ‰‰Œ�‘Œ�’�ŒŠ���ŒŽ�ŽŒ‹††ƒ~€„‰Š…twrnnqroifc^YWUQOOKQQLLNHIIDECDCCDGCAFCHDDAGH>—•––š™–˜—›˜œ�™›˜™˜œœœš››žš™œœ�›��›œ�š�Ÿ›žŸ™Ÿ›œ›ž˜��›šœ›šš—––‘“‘•™—–——–—”‘”’�‘‘“Ž�Ž’”�’“’Ž‘”�•”“�‹‹Œ†‚…|}}ƒ…ƒ†„„‚€~�‚‡„‚„„�†„€†‹ˆ‰‡�…‡�‘‘‘—”˜—–——š˜›™š–™—––”“Œ�Šƒ‚ƒ‡‰‹�ŽŒ‰‰‹‡Š‡‡‰‹Šˆ‰��ŒŽ��‰Œ�ŽŽ���‹�Œ��‘�‘‘�‘�Š�’�Ž‘�‡‰Œ‹‹Œ����’�ŒŠŠŒ‡‰‡ˆ‡„Љ‡‰†‹�Œ��‡ŽŒ�‹‰��Š‹ˆˆ‰‡‰‰Œ‰Œ‘‹‹‰��‰�‰‰ˆ‡‰‹‰ˆŒŠ�‹���ˆ�‹‹Šˆ†„‚€ˆˆŠ‰‹‹‹‹Œ‰‡‰‰‡„…‹Š‡Š�ŽŒŠŠ‹Šˆ†Š‡ˆ†Œ���“�’’��’Ž��Œ�‡‹ŒŠ��Ž���‘‘��Ž‹‹‹�ŽŒŽ’““‘‘”�������Œ���‘‘’’�‘�”�‘–��‘”�“ŽŒŒŒ‹…~vog]`_o{„‡†…‡……„���Ž�‘‘Œ‹ŽŒ��Š�����‘‘�Ž‘�ŽŽŽ‹‰��…ˆŒŠŠƒ||{||wslb]_WVUSYWOMPOHKGGGHDBEEDDFFIEBHGEA˜––—––—•—˜˜™›—›š›™��›š›Ÿ��˜œ�››žœ›œ�š›�™šž™™œ››ž›œ¡œž›Ÿšž——“�’Ž�“�”’•™—“——‘’�‘Œˆ�ŒŒ’”‘�‘’’–•“—‘���‹†‡„~{~|†……‰�ˆ††‚‚ƒ‚‚€|~���‚„‰‰ˆ…„„†�‘’‘‘”‘–•“•—••™œ—�››—‘Ž……€}€�‚„ˆ‡‰Š�‡��‰Š‹ˆ†ŠˆŠ†‰ˆ‰ˆŒ�����’’’“��‘Ž‹Œ�Œ�‹‹�Œ�’�‘•��‹�Š�Š�‰ŒŠ‹�ˆˆŒ‰ŠˆŒ�Œ‰ŽŽ‹ˆ†‰†ˆ†‡Œ‰��‹‹��Ž��‹‰Š‰ŠˆˆˆŠ‡ŠŠ‹�ŽˆŽ‰‰‡Šˆ‰‰ˆ…†‰ŠŠ‹ŠŽ�‹Œ�ˆ„€………‡‰‡ŒŠ�Š‹ˆ�Šˆ‡Š†„…†‹‰‰ˆˆŠ���‹��ŠŒ�Œ‹�Œ���“Ž‘‘‘�Ž�‹ˆŠ�‰‹Œ�Ž�‘�Ž���’Ž�Ž��’�Œ�����”“‘‘•‘ŒŠ�’���Ž��“••�’‘“”�‹‹†�yui`YZROPVchmmhdffnu~…ˆŠŽŒ�‰ŽŠŠ‹Š�‹ŠŒ�ŒŒŒ�����‘��„�…‡��Œˆ…ƒ€ƒ„‡Š‚„sojfc^\]_[UQLJPNJKKIGDHFFBGFEFAEHCAšœ˜™›–š––˜–—˜˜˜›šž™�žœœ �žžžž�ž�ž��š ž�š›žššš›�›œšŸ›› ���š™™•”““•”�“””—”””’��ˆˆ†�ˆŒ�’‘�‹’Ž“‘‘���‘��‹…„„||€††ˆŠ‹‹‹‰Š‰Š††……‚~€‡ƒ‚ˆ†‡„……Š“—‘”—•—™“–•––“—šš›››”Š€||‚‚…†……‡„…‡ˆˆ��Œ‹ŒŒ‰�Š‹Œ‰ˆ‰ˆ‹ŒŒ�Ž��‘‘“�‘•“Ž��Œ‹Š‹ŠŠŠ��“‘’’��’����ŒŠŠ‹…‰‰†Š�ˆ�Š������‡Š‡‹Šˆ‰Š‰‰ŠŠŒ�����‹�ŽŒŒŒ‹†ˆŠ‰ˆ�‹‹Œ��ŒŽˆ‹Œˆ†ˆ‰‰ˆ‹�ŒŠ��‹…‚……†„ˆ…Š…Š‹‹‹��‹�ŽŽ‹‡‡Š‹ˆ‡‰‰���‘��‘”��‹Ž�ŒŒŽ�ŽŒ‘‘Ž��‘“���Œ‹Š‹‰���Œ�Œ’’”‘‘‘‘�Œ‰ˆŒŽ�’�”“‘–”��”’�Ž‹‹��“”‘’‘“”“��‹‡~uj^UNLOJKJKOROPKJINTaivv€‚†‡…ƒƒƒ…Ї†�ŠŒŒŒ�����’�ˆ†‰ŠŒŒ�ˆˆ„ˆ‹‹��Ї„|uqnogkmi\MNLPNSOQMHHJGEEEEHBDEEEA—•š–š™™š•™™™›˜–™™œ™›œ�š›Ÿš��›› ž›žžšžžžžžœ�œœ™šš›š�˜˜ž››ž™—œ˜—š–•—––‘’“�‘�Œˆˆ‡‹ŠŒŽ�����ŒŽ�‹Š…ˆ‰‰ˆ‡…‰„„„„€„……ƒ…‡†ˆ‹‹‹‘�����ˆ‰‹‡‡‡‡…„ƒ‰Ž•—–˜–™–š˜š—™—–š——•˜”�ƒ€�‰†‡ˆ‹†…ƒ„‚ƒ…†‡†ˆŠŒ‰��Ž�ŽŽŠŒ�މމ‹‹Œ‘��‘’‘‘��ŒŽ’�Š��Œ‹Œ��ŠŽ���’Ž���Ž�‡Š‹ˆ†‡‡†‡Š‹�Š���ŒŽ�Œ�‹‹�†…†Ž‹ˆŽ���‘ŽŽ‘���‹‰‹ˆ†ŠŠ‰Š‹ŒŒŠ��‡ˆ�‰‰Š‡‰‡ˆ‰‰‡‡�„‡ŠŠŠ‡‰‡†‰‡‰Œ��‹�Œ‹‹ŒŽ‹‡‹Š‰‹�Œ’�’‘“‘‘“�����‹‹‹ŒŒ��Ž‘�“•��‹ŒŠŠŠŠ�Š���‘‘””““�Ž��ŒŒ����’�‘“““•’�Œ��Š�‹��Ž���‹…xrja[SNMLMHMLKJIIFEEDDKNS\bipplgdjrtyw|ƒ‹‹‹ˆ‹‹Š����Ž���‹��Š‹‹‹���‰Šˆ‡…~|zzxxzqeZURRRQOONKLLILGIIFDDFCCBš˜–˜˜˜˜™šš—›˜šš™š�œ›š››œ�šžŸ›š��œ�Ÿ›žžžžŸ›�žžš���›œ�˜›˜š�›š™œ›–œ™˜———’““�“Ž‹ŒŒ“Ž‘�“‘��‘��ˆ…���}�€„ƒ…ƒƒ�~†€ƒ€‚‚‡Š‡�‹�•““””‘�‘Ž����ˆ�Œ’“•–•™–šœœ™›�™—›™™—•’Œ‚}}€…………Ї…‹‰†ƒ…‰‡…†‹‰Š�Œ‹�ŽŽ��“‹�‘�‹Œ���Ž‘��‘���Ž‘‘�’‘“�ŽŽ��ŒŒ�‹Œ����’Œ‹ŽŠ‹‰‰†‡…‡ˆ‹�Š�‹�‹��ˆŽ‘ŽŠ�ŠŒˆ�ŒŠ‰‹Ž��Ž������ŒŒ�‡ŠŠˆ‡‹‰�Ž‹����‰Š�ˆˆ†ƒƒyloy…Š�‹ŽŠ��‰‡ˆŒŒŠ�����‘�Ž�ŒŠŒ�ŠŒŒ�����‘”’‘‘‘����ˆ�‰ŒŒ��’��‘‘�Ž�‰Ž‹ŠŠŒ�Œ“�‘�’““”�”‘�Œ‘ŽŒ‘’�’‘“�”‘�‘��ŒŒŒŠŽ‡‡~{sjgc`XZSSUXYZWSQMJKDBEDFGHGILOOSKNLRVT\guƒ‡‡„†ˆŠŒ�‘���‰ŠŒ�Ž��Š‹Œ��‰ˆ‰Š†ˆƒ„€…„‡€zqia_[[WWUTQPUQOMQJJGFJFED—–˜–—–——˜™šššš™—šžœœ—Ÿžž�›šž�›ž›™�™œšœ™�›�š�žšŸ�›��ž›œž™›œ–šœ–˜••—˜–––‘——–’“‘’��‘�‘ŒŽ’�Œ‹Š…††‡‚�†‡…‰‡„‚€}…††Š‹�Ž����‘�“�’‘•’“”“�•–””•™—••—–˜˜–˜™œ˜–››™�™’…€{~‚€ƒ…‚ˆ…‰†ˆˆ‰‹‹Š�‰‡ˆ…ˆŠ†‡�ŒŽŽ‹‹Œ����’’Ž�‘Œ�Œ�‹��Ž‘Ž�‘“‘‘��Œ��„ŠŒ‡ŠŠŒˆŒ‹‰�ˆ�ŽŒ‰‰�މЇ‹‹ˆ‡‰ŠŠŽ�Ž��’Ž����‰Š�Š‹ŠŽ�‹�������‹‰Œ�†‰ˆ‰‰ŠŒ��Œ��Œ‹‹„s\PViy…Š�‹��’Œ��ŽŒ�Š‹Š�‹��’‘���’��ŒŠŽŠˆŽ��Ž“�”’’’’ŠŠŠ‰‰‹ŠŽ�ŠŒ���Ž���‹�Œ�‹���‹�“�’“�‘�’‘Ž����Ž‘ŽŽ“��‘’‘•�Ž“‰ˆ~{spka^_baa_aiomme_XVPIEDFHFGGCFCGHIECDEBFKZmsursy�‹Œˆ†‰ŠŠ‹‹�ŒŒŒ���Ž��‹‹�‰‰Šˆˆ…‡€|zrsogil__`Z\^ZZZXOMHJIHFEš–˜—œ˜•–›—˜™š—š›™œœž™œ žœŸ�›ž� œ›žŸšœœœ™�™›š›šŸž›Ÿœ�Ÿ š›�››™›•—˜•“”––“•—˜—–—–’•�”����Š‹ŠŠ‡Š‰�ŽŠŠ���Ž�‹Šƒ‚…†‰‹‘��•“”—“‘����Ž‘‘Ž”••˜šš—�ššš››—™™–•˜•˜–š™š™™‹€{}‚„ƒ‚�ƒ„†�‡…††‹‹‹‹‹�‡ŠŠŒ‹‰�‹Œ†‚z‚ˆ�’’”–�’‘’���ŠŒŒŒ‹‹‹�Ž“‘’��Ž�‹�Ž‹‹ˆ‹‰ˆ…ŠŠ‰ŒŒ�Š����ŽŽ�‹ˆ‰‡†ŠŠ�Œ‹�’�“’���’Ž‹ŠŽŒŒ‰Ž�Œ��‘Ž‹�ŽŒ‹ŠŒˆ‰‹‹ˆŠ‹ŽŒ��‹~`JCK\rƒˆŠ‰Œ�Ž������ŒŠ†‹‡‰�‹Ž‘Ž‘��‘’����ŒŒ��Œ�’Ž‘�’���Ž����‹�ŠŒˆ��Ž����’‘‘“��‹�‹���‘”“‘��‘“���Ž‹ŒŒŒ‘‘“‘’‘��‰|qnnib^]dlllmqy|}xnmhbZTOONGGGBFCCGEJHGE@CBBGRS\TT_fp}}z€‚ˆ‰ˆ��ŠŒ‹‹��‹ŒŽ���Œ��‰†‡„‚}||}wysoolqmjhkgh_TKMHJJE———–›™—˜™——™—™™™š››šš™œ�šŸ�¡›ž�ž�¡›››››žšœœšœ—›�šœ›™™�™��›��™›™•—”•“”•”‘”••˜–””““Ž‹‹ˆ‡‡‚€�…ˆ‰�ˆŒ��‘’�Ї‚�‚†„ˆ†ŒŒ‘””–—–’“’ŽŽ‘���’—–—•–—š›˜�šš›šš—™˜—••š•—“‰zy}‚†Šˆ‡‡ˆ‡…€€„…ƒ„‡ˆˆ‡‹‰Š�‹Œ���ˆ„|x|ƒ‹��‘’�Ž’“”‘�����‰ˆˆ‹ŠŠŽŒŠ‰ŒŽŽŽ��ŒŒ�‰‰ˆ†ˆ‰†Œ‹ˆŽŠ����ŽŒŒ�‰Œ…Љ‹ˆŒ��ŽŒ������ŽŽŽ�‹ŒŽˆŠŠŒ��‹�‘ŒŒ�‰‰ŠŒŠ‡‡‡‰ŒŠ„sYCBI[q€ˆ‹‰‡‡ˆŒ���Œ��‰‰‰‹‹‹�ŠŠŒ‹���Ž�“��‘���ŒŒ�Œ‹‹�‹ŠŒ�Ž�‘�‘‹�Œ‡ˆŠŠŠ�Š�‘’�’“‘������ŽŽŽ�‘‘�‘’’“�‘�ˆŠŽ�����…}k]V\\[[X]jqstvx~€{oimnkgga^ZNJFDBABAECFDFGCEDGHILLLGSYdegmq}�…‹‡ˆ‰ŒŠ‹Š‹Œ‹�������І„~��ƒ~}~|x{|zyyxytndXXPNNL—™—™™š˜š—™�—™šœš™™ž™››œ™œœ�žœžœ�žœžž ›�žœ› ›�›œ�œš››œ›™œž™��šœ™–˜›—•—”–••”•–”•Œ�‰ˆ……„zz{|�€€�„ˆ‹�Žˆˆ…………‰ŠŠ‰‹Š‘‘‘’•‘�•‘‘’”–•š—š—™—•–˜–šœ››�šž›››™–—š—“�|v{„ˆ‰Š‡ŠˆŠ…„‡‚…„ƒ„„‡‰Š‹‹ˆˆŒ�ŽŽ�‡~z}‡‡�‹ŒŒ���‘‘’‘‘�“�Œ‹Ž�ˆ�‰Š‡†�Љދ‰‹Ž��Ž‹��†ŒŠˆ‡ˆ‰Š�Œ��ŒŽ�ŒŒ�ŒŒŽŽŒ�ˆŒ�Œ‹Œ�’��‘���Œ�Љ‰‹Œ‰��Œ‹�ŠŽ��ŽŒ�ˆŠ�…‰pWADG_s†‹�ŠŒŠ‰‰ŠŒ‰Œ‹‹ŽŠ�‘Œ�ŽŽ‹Š‹‹Š‹�Ž‘�•”�‘�Ž‘Œ‰‹‹‰‰Š�ŽŽŒŽ““�Ž�‹‹‰‹ŠˆŠ’ŠŽ�”’‘�’’’‘‘����ŒŽ‘Œ’”’���ˆ���‰‰ˆ€scROPSSUVS\iqyzwxxxuh`aiiilrkeWMGGG?AC@BBBDGGIEHKIKJMJLLVXY[ckrvx€…‡ˆ‰Š‰ŠŠ�ŒŠ�‹�ЉŒ‹†‚…ˆ„„‚†ƒ‚‚ƒ………�‚€ƒ|ume_YTX––—”—˜š™™™š™—œš›�œšš›Ÿ™�›šš�››Ÿ™œ�œœ��Ÿ›�›ž�›Ÿ��›œ�Ÿ˜�›˜š—š›––˜”•š˜—š™••™•’’Œ†…‡‚ƒ„‚{{yz‚�‚||€ƒ‚„„†ˆˆŠ‰�ŒŒŽ�‘�’’“ŒŽ����–“—˜˜››™›œ–˜š——“˜–—š›™™›�™™��˜—‘„{}€„…„ƒ„„ˆ†‚‡‰ˆˆˆ…‡‡‰‰Š†‡ƒ€…ŒŠŠ‹†‚}„ŠŒ‹‘��ŠŒŽŠ���ŽŽ‘��Ž‘�Ž��‰‰ŠˆŠ……„ƒ‡‹ŒŒ�‘�����‹ŒŠˆ‰ˆ‹ŠŠ‡�ŠŠŽŒŽ’��������‹‹�ŒŠŒŒ���ŽŽŽŽ��ŽŠ�‰‡‰‰ŒŒ�‹�ŽŽ�ŽŠ‹‰~sZE@J]w…ˆ‹‹ŒŠ‹ŒŠ‹‹‹…Œˆ‹Ž��Ž�“Ž��Œ�‰‰ŽŒŽŽŽŽ����Ž���‹‰‡‡‹††�Ž’��������‹�Œ��Œ�‹‘�‘“‘‘•’‘’’���ŽŒ�‘��ŠŠˆ…zvxiaRNPXWUUYT`hquvldba`UQRVWalspfZUNNIIGGFDAADGGDGDININKGGHMMNPQRX\cotxx|~„‡ŠŠ…†‡…Šƒ„ƒ†~~‚†ƒ…ƒ……‚‚‡‹ˆ…ˆ‚†‡ˆ‚zpkgif–————˜–š–—˜š•�šœ�˜›œ�œ��ž šœ š�š žšœžœšš›š��›ŸœœŸž�žŸ�Ÿ���›œ™˜™“——•’˜“––™‘‘ˆ€ƒˆ‰†„€‚|yzz�…†ƒ„‚„ƒ€ƒƒ…†…‰‹‰Ž��‘•”•––‘“����•’–—–—™šœš�œ—��–˜™™–—˜™˜˜˜˜›˜š›˜’‡„~…‚ƒƒ‚€€��…‰‰‡‹‡‹‰Ž‘ŠŠŠŽ„†ˆŠ‰ˆ„Š„„†ŠŠ��”�‘��Ž���Š‹�Œ�‹Ž�Œ�‘��’ŒŒˆ„�‚…‰ŠŠ‡��‹‹��Š�Ž��‰Š‹‹‹ˆŠŒŠ�‹���“�‘���ŠŽŒŒŒ‰Œ‰‹ŠŒ�ŠŽ�’�Œ’Š‹‹�ЇЋ‹Œ‰‹�ŠŒ‡…z[HBI[r‚‰Šˆ�ŠŒŠ��Œ‹�‹ŠŠŒ‹Œ�Œ��Ž����ŽŒ��‹�‰Œ‰�Œ�ŽŒ‘Œ��‰ŒŠ‹‹‰‹Š‹ŠŠŽŽ�Ž�����Ž���ŽŽ����‘“’‘‘““��‘Š�Ž‹‰„}qhffbYZTZace]eddkqsk^SMKLJGJKV`kmqnda[VWPOPPJIFEDGFGECHFGHECADEHDHFHDOQTV\aiqu|��‚}yuvwwxywwuyzy||�†„‡ˆƒ†‡ŠŠ‹„{wuys—˜™™–š™™–™˜——–›�š›™š™¡žš��œ›�žœœžšœ ››™›œ›˜›™™››š›ž�›ž›žžš�šš˜—”••Ž‘“Ž�”’�Œ‡†Œ�Ž‹Œ…‚}€|€ˆ†ŠŠˆŠ†‡‚ˆˆŒŠ�Š‹‹ŒŒŠ�’•‘“‘•˜‘’“”˜——––•“–—˜›˜˜œ››™�™˜œ—˜•–˜••–—–”Ž„~�…„…�~~‚€ƒ„…ˆ…‡Š‹�ŽŽ�ŽŽŒŒŒŒ‰‡ˆ‹…‡„ˆˆ�Ž“’••�����Œ�‹‹‰‹�‹Š��Œ�‘Ž�Š‹‹…ˆŠŠˆ…‰ˆŠˆˆŠ‹‹ŽŠ‹�Ž�ŽŠŒ�‡Š�‹ˆŒŒŽ���ŽŽ�‘��‹�Œ‹‹‰Š‰‰ŒŠ�Ž����Ž�‹�‰Ž‰…‡ŠŠ†‡‡�nXD?DWk~‡‡‡†…ˆŠŒŒŽ��‹‹Ž�‰‹‹Š‹ŒŒŽ����’����†‰Œ‰ŠŠŠ‹Š�ŠŽŽŒ��‹Ž‰‡†ŠˆŠ‹��‘’�’Œ�’ŽŒ�‰‡ŠŒ��“‘‘““‘�‘Ž�Œ‹‡~wnjd\_ZZ[`kopoususpnf]SPMIGGHRYhqqtpiif__][WULJFJGFFFHDHCDE@BADBACDCEBBHEHFFJO[doru{zsopruyrtme^^[^dkomvx{ƒ…‡ŠˆŒ†‚zx~€–™•š™šš™™–™™š›—�››™™™›�™››���œŸž¡žž¡Ÿœ¡��ž�›œœ››™š–›™š››››�™—˜“’‘�Œ�ŽŒŒ��‰‰‹‹Ž’���‹ˆ‰‰‰‡‹‹Š‰Ž‰‰‰‡ŠŒŽ��Œ‡Š‰Š��“““’’�”———š•™™š˜—˜˜˜–š˜˜›™•™›˜™›šš™›˜—˜–•’ŒŠ�{€„€†…‚‚…€…‡‡†ƒŠˆ�ˆŠŒ�����‹’��ŒŽŠ‰‰�‰Š����““‘’“ŽŽ����Ž�‰ŒŠ‹‹‰�Š‹ŽŒ��ŠŒ��‰�Šˆ‰…ƒ…„ˆŠŠŠ�������Ž���Žˆ‹ŒŒ‰�‰ŽŽ��ŽŽŒ�‹ŒŠŽ‹Š‰‹‹ŠŒ‹ŽŽ�’ŽŽ�މ†‹‰‰ƒƒ}iRC=>AG[m|ƒ„‰ƒ„„„ˆˆŒ‹ŽŽ�”��Œ�ŠŠ‰‹‰Š�Ž�‘‘�Ž“Œ�Œ‰‹Š‰‰‡‹Œ���Ž�Œ��ŠŠˆˆ‰‹‹ŠŽŒ‘��’–�’‘ŒŠ‹‰‹Œ‰ŒŽ‘�“’��މ�‰‚wuqf^^`[`dnv{€�ƒƒ~woi_XRSMPIIJVclkhgeihdb`]XSJIIGFGGJFGGBEC@AA@CCCCCDACBCFDEAEGKZbiopeejpqokjbXNNJGJLQUW[hv€ƒƒ†„‚}w|€„–—–—š—™—˜—˜š›šš›ž˜ž˜›››�™›œ›š›šœž›š�œ—Ÿž›�žžžž��™™˜›˜˜šš˜’”�““Ž��Š‹�‹ŠŠŠŠŠ…Ї��ŒŽŽ��‘��������ˆ‰Šˆ‰ˆˆ‹��‹Œ�‘““”•“‘“�—••–˜–™š˜š—š›™š›˜–•—–——’•š˜—˜�›šš›•�ˆ‚}����‚�ƒƒ†‡…‰‰�ˆ�Ž�ŠŠŽ‡†ŠŒŽŠŒŽ�’��‘�‘��Ž’ŽŠ��ŽŒ�ŒŒ���Ž’��Œ‹�‹Š…ˆˆˆ‰‹‹Š�ˆŽŠ���†ˆƒ€…‡‰†ˆ‡�‹ŒŒ�Ž�Ž‘�Œ��‹Œ‰‹‰‰ŒˆˆˆŠ�‹��Ž�ˆ�Ž��‰‰‡‹‹���Ž�‹Šˆ‹‹ˆ€qZGA=<:=>IXlp€†ƒ…‡……ˆ‡‹‹��Ž��‘‘�ŽŽŠˆ‡Š†‹ŽŒ‹ŽŽ�����‰Œ‰Š‡‰†Š‡ŠŒ‰�Š�Œ‹‘ŠŒŒ‹ˆ‹ŒŒ�Ž“‘’��‹��Ž‹†‹Œ����Œ‰Š„‰ˆƒ‚{uiglhkmq{}ƒ‰†ƒ€ytgZWTQUSLIFJMRUTSX\\b``YRKEEFCACHI@FDEFCC>ABC>B@A?ACACDEDDCCGN\^_ZSVX``[XVPNJH@H@AFGILO\kpqnojjkmqs—––˜™––™š™—š›�žž�›�œžš��›ž�ž™žš�›˜šš›œ�šžžœœŸœšžž�œ�›™šš“‘Ž�����ŽŒ�Ž��”������Ž’�Œ‘’’’–“–”‘‘”����Œ‡ˆ‰Š�’Ž“–—˜š—˜™™”š˜—••–––˜™—œœ™��››�œ–˜™™”•–™——˜–›–”�…ƒ�„…ƒ…€�‚~……†††Š‰�����‹Š‰Œ�ŒŒŒ���‘��”‘�““•‘Ž“�Ž‹�ŒŒŠŽŽŽŒ�’�‘��ŒŒŒˆ‹ˆ�ŠˆˆŠŠ‰‹‹�†ˆ‡„„†ŠŠ‡‰Œ‰‹‰ŒˆŠŒŠ��Ž’�Œ��ŠŠ‰�ˆ‡ˆˆŠ‹‰Œ�Œ����Œ�ŒŠŠ‹ˆ�ˆŒˆŠŠ‡ˆ„q_NEB?<=<>;?@DA?D@@CECCEFDDEOWZSTKFJJNMIGKDEDCDFBBCCDFHNSRSVQPRU\^™š˜•—˜——˜™—–˜˜œœ™™›�™›�žžš��ž�›�š›šž™™›š�›˜ššœ››ž�šžœš››–”’“–”�‘��Ž��‘•—“–––“““•““‘’������“—•••�����’’“•‘–—•š˜›™›šœŸ�™œš——™——————›ššžžšœŸ——˜™–’�‘�‹…„w{�…†‰ˆ„„‡‚ƒ€†„…‚„†ˆ‹Ž������’‘�‘ŽŽŒ�ŒŒŠŽŽ�ŒŽ‘‘�‘“��‘‹Œ��ŠŠ‹Œ����ŒŽ‹�ŠŽ�ŒŒŠŠ�†‰ˆ‡‡€„……†‡�ŠŒŽ�‰‹Œˆˆˆˆ‹ˆŠŠŽŒ��‘��Œ‘Š‰ŠŠˆ‡ˆˆŠ‡‰�����Ž���ŠŠ‰‰†‚}u_NDB<=><<><=8;;BKWms|‡‰‰Ž‹Š‹Š‹Š‰‹ŠŠŠŽ‹��Œ‘‘ŒŒ�Œˆ‰Š‹‹ŠŠ‹Œ�ŽŒ�‹‹Š‹Š‡ˆˆˆŠŠŠŽ��Ž�����ŒŽ‹��‰�ŠŒ��“”‘“”•�‹�Œ‹‰Š�Œ�ˆ„ƒz|rkd^ZWXUUUWXUSNLPXVMPLKKNJHGDJJOQOQNJJIHIGGEFE>@??CACBDA?@C@C@CBCBECBDDDHRVSKKCFDFBC@AE>?D?F??EFDEDFDGGDHDEFJM—™›˜›™š•›™™—˜œ˜›™™šœœœ��œ�›œžœœžŸœšž™�œ›˜ž›˜šœš™››�›š›™›˜—–—š›–”•“”–•‘—™˜——”•——–—”‘“�‹…†‹‹‘••–•“••š˜™™˜›–—•—›š–š›—��žž��š�›™—˜›˜——™™˜œš�š›š™–އ…�{yx{z}…†„ˆ‡…�‡ƒ…‡††‰ˆ‰‡‰†††„‹Ž�“‘‘Ž‘”‘���ŽŽŒŒ�ŒŒ�ŒŽ‘‘�”‘��‘��Ž��ŠŠŽˆŠ‡‡Ž‹‘‘���ŒŽˆ‡‡…�‚…‚‡…‡‹ŒŒ‹��”ŠŠ�‡Œ‰‹ˆˆˆ‰ŠŠ�Š�‹ŽŒ‹Œ‹Œ‡‡…‡Š‰�ˆŒ����’��Œ‹‚u`OC<><><;?;?:;<:?KZftƒƒ‹‹‹�Š‹ŠŠŠŠ‰Š‹ŠŽŽ���‘�‘‹ŠŽŒ�ŠŠˆŠŒŠ���‹��ދЉ�ЉЋ‹‹�Ž�“�‘“������‹�Š��‘“’”’•”•“”‘�’Ž‹Œ„rphd]VSMQMLOIHMLIHJGMMNKHOMMGILGJLMNMOKJLJJNIIEIGCBBCAA?CBBA?@?BDEEBEEEAAADCGKLGDDBADBBDCCA@ACCABFDCCEFBCDBCBACEE–—“š™—–˜›™š›š—š›�šš››š™œ›™›š�™š›�šžšš ›��Ÿž™��›œ›™š˜œ–——™”––›˜›››–˜˜˜———™“••‘“–•——•’�‹†Š‰�‘“Ž�•”–˜–›œ››œŸ›››™™––˜™—š›™œœ™œ››��š—˜š™˜˜”–—š––•†�w{yy{~~ƒ…†‚‚���„‚‚‰†�Ž‹‰�‹ˆ‡†‰‹ŒŒŽŒ�Ž�“““�‘‘‘�‹���‰‹ŒŽŒŽ‹‘�Ž’‘’‘‘�ŠŒ�‰‰……ŠˆŠ‹‹‹Š‰Š‡ˆ‰‡ƒ‚……�‚…ƒ‹ˆ‡‹ŒŠ�ŽŒŽ�ŽŠŽŠ‹†ˆŠŠ‡ˆŠŠŠ��Œ���ŽŒŽ�ŠŒ‰Š‹���ŒŒ�‡~hNDA@=>B>9<<9==;8;<:::<@NZisƒˆˆ‡�‰���‹‰Š�ˆˆŒ�Š����Œ���މމ‡ˆ‰‰ˆ‰���‘���Ž�ŒŠ‹���ŒŒ����‘‘’�•����Ž����”““““”“�“�‹ƒvg[XUTQQQQMHKOJLJHGGIEJLFHJJLHIIMKPROROLIKGJHGGKKHKFDFABCB@???>?>CAGEECGGBAADADBEEABBDBBABFD?@B??A=>9<;<<6<9>:::>9?CJZjp|ƒ‡‹ˆ��ŠŽŒŒ�Œ‰ŒŒˆ�‹Ž���‘’�����‹‹ŠˆŠ�‹�������Ž‘�ŽŽ��Š�ŽŒ�’��‘““•““‘’���‘��“””�‘�‹|nbZTRNQQUPNQLNQNNMKHHJMRMMKLJNGIGJLPQQRLLMJIGGCDEIJKKMIECCB@@@A=BA@FEGDEBEDAADCCABEAAAAABCBBCDBEEAB?DABAEDBCD@B?@CAB™—–———˜—˜—š–›˜™šš� žž›ž¡š� ›�œ�Ÿ™œœ™˜šššš�š›››œžšœžœš››–ž›–———•“˜“—•––˜–™˜——™™—’–”‘‘”‘“—”•™™˜šœ™™™™˜š–”™™š›œžšŸ���›š›š˜™—˜—–“™™™œ˜š™›™—š˜””‘†‰ƒ„�}‚ƒ„…�‰‡ˆŠƒ„…€‚…†‰‰…ŽŠ‹Œ�Œ�‘��Œ�‹‹Œ��‹�Œ�Š‘ŽŽ��‘�’��Ž����Œ�����’Ž�‹‹‹ŠŽ�‹Œ†ŠŠ‡…‚‚ƒ�„‡ƒ†�†ˆŠ‹‹‹�‹ŠŒ‹ŠŠ‡‹‰ŠŒ‹ˆŒ‹‹Ž‰Œ‹��ŒŒ‹‰�ŠŽ�Œ‘Ž‘ŽŽ���ŒƒkSCC?=@==:=?9=;<;<;=::999>;;>:?AN`iz€…ƒ†ŠŠ����Ž����Œ‹ˆ‹‹Œ�����‘��‘�ŽŒ’��‹ˆ‹ŠŒ��������ŽŽŽ�ŒŽŽŒ‘Ž��”‘‘•��”’“‘‘��Š…{rhbZ[XQSRXW[UMTRPLPLMGIHKOOPPMLJJHJHJLHHIJJKEGEDDDELJLQNHFBBBABD@A@?BCCABBD?@B@CCCACBCCCDAA??AABCAEEBBECACDAABC>BB?C@A™—›–›—š——™™–™�—™šššš››žžŸžœ ��¡ž�Ÿž™Ÿœ›œ›™››™›œ›š›�™� ››�›™›š˜•š““••““—˜—œ˜�›™————•˜—•”••–š—™›ž™�™š›™�—››—š�˜˜�œž¡ž�œœœ˜˜›–—™™•™•——™›˜˜œ˜˜˜—”��‰„€}‚€‚……††‰ˆŠ‡‡†„‡‡„…ˆ‰ˆ‡Š‹‹Š�Ž‹’�ŒŒ�����‹Œ��ŒŒ���‘’��Ž‘‘�‘�Œ‹�ŒŒŠ‹‹ˆ…�ˆŽŽ��‹�‹‡„ˆ…†€�ƒƒ……ˆˆ‹��Š‹����‹‹‹Š‡Š†ˆ‹Š���Œ��ŒŽŽŒ‹�ŒŒŒŒ��ŽŽ’��‘…lQCD>C?@;A<9>==;<:;;:;;:9:99;==<;BAB?BBADBBE@A=>C@C@DDCCC@AC@DBC@A@ACBB?ECCGACBCBBB@BB@D—–˜˜˜™–˜˜˜�š˜�š™ššœ™›œ›ž›™ ˜œ› žœ�œœ�›œš¡ž�››š›š›˜›š—ž�˜�™š›œ™š™–˜–“’“�’•˜—”––˜™˜—››˜šš™—•˜—••˜˜—œœ™ž�š œš›™˜™™›—�›˜œ›™™�››™›˜™•——“———•˜–˜˜˜™–“Ž„~��€€„……ƒˆ†ˆŠ�‡ˆŠˆ‡ŒŽ‰Š†Š‡‰‹‰‹‹‘“�Ž–�’��ŽˆŽŽ�‹Š�Œ�ŽŽ“’‘’����‰�Š…‚„Š�‹��ŽŽ��‹ˆŒˆŠ‡‡…‚„‚……~…‡‰Š�‹Ž�����‹Š…Š‡ŠˆŠŒŒ�������‘��ŠŒŒŒŠŠŽ�ˆˆ€gNE@@ABC>==;:;<<::<9;:;;:<8<;;<<7=FUpЉ‹�†‹ˆ†Œˆ�Š‹ŽŽ����Ž‘�‹ŽŽ�‹‹Œ‘���’’��Ž�Ž�ŠŒ�‹�Œ‘��“‘‘‘’”�‘‘Ž����‘‘“’‘’��ˆ{nief_YVSPMOTWX[YVRPMJNILJHGIKLNPOQRNOSSUTNOGDA@@AB?@@DFCFGCFB@?>@@?B>>A?A@B@BBA@@?B?CCB>CB@@CBCDAAACA@AABBEACC@DBEAAB@EA™—–š–˜™šš™�š›˜œ››œ�›™�™žœšœž›››ŸŸ›�œ�›�� žžŸžœ �œ˜�™��—˜˜™š™™˜™š••–“�••’™—”•”–—”š—™�™™ ›˜šš”—––•˜›—ššž�›  ��š��›šš—˜—™™™›šš›�›™šœ™––˜•””••˜š•–’Š€‚ƒ~‚‡‚ƒ‚‚‚…„†ˆˆˆ‡‰‰‹‹ŒŒ�Š�‡ŠŠ‰ŠŒ������’‘”–��‘�‘�ŽŒŒ������‘’����‹�‡‰Œ�ŒŠ��ŠŠ�Š�ŠŒ‘Œ�ŽŠ‡…‰„��‚…‡‡ŠŒ�Š��’����ŠŠŽ‹Šˆ‹Œ‹Œ��ŽŽ“�‘����ŠŽŠŠ‰†€lYOBCA?>BA<=>;;<9=9:;<8:<;9=:>:?9>Map�ˆŠ�Œ�‹�‹�‹Œˆ‰Š�ŒŽ���“‘�’“��Œ‹‹�ŒŽ�‘‘�‘Œ‘”��Œ‘‹�Œ‹Ž����‘’”’’‘�“����Œ���ŽŠ„{tsl][TVSSJNVRSQQONNPOMNKNGOKQUQPQSROTYb_YSNFFA?@CB?@@BBABDAAAA>?@B<@>DC>BDCABBCB@>BB@CGCEBEACA?B?BBB@BCA@CCE@BBCB™–—™–•™—˜——™™œ›šœ����œ œ���œ�šœ››ž›—›ž–š››œœ�šž���›žŸž—™˜”•˜–’““•”’“•“˜—˜••—”––—˜—™›˜—™˜˜™›—š—™™›•˜™—•–š™œœ�—ž�œ™�›™™–™•›—˜™š˜˜˜�—››™–––˜—•—”�‰€�‚ƒ†Šˆ…‰„…††…ˆƒ…‰ƒ…‹ˆŠ‡������‹Ž�‰‹ŽŽŠ‹�Ž�‘’Ž��’‘�’�����‹ŒŠ�‹Œ�ŽŽ‹��‘”Ž����Œ‰ŽˆŠ‰Œ����Ž�Љ†‡‡…Ї‰ŠŠ‰Šˆ�‹Œ����Ž��Œ‹�‹‰ˆŠŠŠŒŒ��Œ‘�����‹ŽŠ‚ugVIC@A?@>>=?>>=>:=;=8:8:;<<:CDC>@B@BA=EA>AAA??B>@>>@@BABBCBEDBDDAAC?>@ADCCDADBBB@@BCB?A?BC@CBAABBC™—˜˜›˜˜œ–™—š˜ššššŸž œšœœœ Ÿž�š��›�œšž�š™Ÿšššš››ž�žŸ�¡�šš˜––˜““”“’’””•”“–™—™›˜˜™–—”•–””—’”™—›šš˜ž™šš–““——••š›™œ���¡››œœ™—š˜—–™—˜•š˜™—˜˜˜™™™�—”‹ˆ�€‚„‚ˆŒˆ††Š…ˆŠ‹‰‡Š‡‡‰‡‡ˆŠŠ�މ�‘��‘�“•�ŽŽŽ‹‹’Œ��‘’��‘�“��Ž�Ž�‹ŠŒ�ŠŠ��Ž�”‘��’’‘�Ž�ŠŒŠŒ‰‰‡ŠŠ„‡„…†Œ�Ž�‹��Š‹Œ‹ŠŠ�‡ŠŽ��Š‘�ŠŒ�ŒŽ‹�‰‹‹Ž�ŒŽ��‘��ŒˆrbOEDBCC@?>A=>?>>>>::<=>>9A@@A>DPdx†ƒ‡‡†ˆˆ‰‹ŽŽ�������ŽŠŒŠŒ��Œ’’‘‘’‘‘�‘‘‘��‹‹Œ���”‘�‘‘”“Ž��“Œ��‘Ž‘’‘’–�’�‘�ŽŽŽ‹Šˆ�s\RQSUPSSTSPOKKPMJOHJKHJGKLPMKKIHFGGHHKJJIJABDABCDCDB@ACA@??BABCD@CE?@A?>B@B@BBCCACCAC@BDAC?@DCBB@BC@@CCCEEBBBCA=BCBBC–—˜œ›š˜š˜™›˜™˜›–—œš�šœ›œšž�›œœ›› žœŸž›™�›œ�š—˜œš™š›šœœ™˜˜—™—”•”�•‘•“’””“–™—˜˜˜šš—•™’–“’””–”•—–”™™—™š—–˜š––˜›—™™—™›™œœ�›œž›˜�–•™˜’“�’�”•™˜——˜”‘‰‚„…„ˆ†Šƒ…………ˆ‰��‹��‹�Œ‰ˆ…‹‡ˆŒ‡‰ŒŒ���”‘‘’��ŽŽ�‹ŒŒ�Œ������‘‘���Ž��ŠŒŠ�‰‹Œ�‹‘����Ž���ŠŽˆˆ‹‰‡�…~‚‰Š‹����Š�Ž‰ŠŠŠ‡ˆ‰‡‹‡ˆ�Œ���Ž��Œ�Š‹‰‹‡ŠŠ‹ŠŠ�‰†{hULMOPHHDBKGCBDFEGE@BGIDCDHIJEI[o|…ˆŒ‰�ˆ‰‰‡Š‡Œ‰�ŽŽ�’�Ž��‹�ŠŽ�‹Ž‘‘�’�’’‘‘����ŽˆŽ��Ž��‘”“�”‘”‘�‘�Œ�ŒŒŒ‘‘�“��‘’ŽŽŒjUJRMLNNQRRONLMNNJLEHGFFJDHIGGDJEFFEBFFBBBCA>DB>ACDDD@EC?B?BBA?CCDAB@A@AAB@@CC?BCC>@AACAABDDDCC@BCDBAA?CADDDD@E?CCBC>?”—˜–™™š˜�™™š™››œ››œœž›œœ››šššž›œž¡���›�žš�ž�›��œ™›—œ™šš™›——–”�’‘“”•™•˜‘”˜’”™•–˜—–˜–•“–”’““’’–�‘”•••—••›™—œ›–—˜˜™—˜˜—š›˜››œšž›››—’�“�’�””””——ŽŒ‡‡ŒŠŒ‡ŒŠˆ…�ˆˆ„ŠŒˆŠ‹‹‹�”Š‹Œ�ŒˆŒŠˆˆŠ‰‹���’‘’““‘Ž���Œ‹Œ��ŠŠ‹ŒŽŽŽŠ�������Š�Ž�Œ��‹ˆ‡Œ�ŽŽ����ŽŠ‚„�ƒ€„ˆˆ‰ŠŠ‹‹Ž�����Ž‹‹‰†Œ‡‡‰ŠŒ�Ž��������‹‰ŠŠ‡‡‹‰‰ˆ|m^QT_b[RTXZWTOOVYZONUY\[USVZZMJ\m‚‰Š‡Ž�Œ‹‹ŽŒ‰‹‰‹Œ‹��Ž’�’��Ž�‘Œ�Œ‹��‘‹�“�’‘“‘’Œ��‹�ˆ�Ž’Ž�’“’“”‘“’ŠˆŠŽ���ŽŽ“‘‘‘�…o_TRMLMKJMPOMJKIJLIIJMHFEGGHFFDECFACDFDFD@C@@B?=AA?DCECDDAECCCCB@AC@CE?DA??DC>CD>A@@>?>?DDCDCDAABAABBB?BBEBCBBCCC@D>@B??AB@FBBCDDEDAEBACCBA@@??B>??BBBC@@>A?BBD?BC@C@BC>DDE?DABC?@CC@ABB>C>@•˜”˜˜š——˜™˜˜š››š›ž�œ› �› ��›�����ž™Ÿ�š››™››™���›žžœžžœ�œ��š—“–”•’——‘–””™•�‘“–™š™•”‘ŽŽŒŽ’•���“�”“’Ž”��‘��’”••”™™š››™™�˜—˜™—–—˜˜—™š™™˜˜š•—’�†�„…‰Š‰Œˆ�‡‹ˆ‹ŠŠˆˆ…‹‡‰‰Š�‰‹���Ž�����‹����Ž����Ž�Ž���‘‘‘�����†ˆ†ˆ…ŠˆŒŒŽ�Ž‘�“’ŒŽŠ‚|†‰Œ†�ŠŽ‰�Œ‰‡†„……‹Œ‡†ˆ„„‡‚‡…‡‰‹�‹Œ‹ŽŒ��‡Œ��ˆŠ‰‰ŠŠ‡���‹��‹Ž�Šˆ…{j\SWhngaiuxsiipswpg`hrslbbhj^NJYk|‰†…ŠŠ‰‹‹��Œ������‹Œ‰ŽŒ���’“‘“�‘�’��‹‹Œ‹ŽŠ���’������‘“�‹�����’’�’‹ŒŠŠ‹‡‰‡Š‡€sbZNRRRQPQOOLLNHMHHEFHPLKLMLJKKFDD@DA@ADBBBC@EBCCB>CBBDBAACA@EDHCADA?AA@AD>A?B:??@C?@?B>AF@CCAA@>?ACC@CBA@EBC?BBC@>A@@A>B–š—–š›˜š–˜˜——š™™›šš›œœž�ž�›� �žžœžš �œ›�™—š™˜š�™š›šššžžŸš›žš›™™™˜”��‘’‘‘“�“•™™›™˜–’�������‹Š��”’““’”�‘”�Ž���‘””•—•—š›š™ž–�™•”˜“––˜•—™™–’‹‹…ƒ‹‰ˆŒ‰‰†…†ˆ††ŠŠˆ‰‹ŠŒ�Ž���‹‰‹ˆŠ‡ŠŠŒŽ�Ž�‘‘Ž‘�“‹�Š‹ŒŒŒ�Š‘‘Ž���Ž‹��‡‰Œ‰�‡‹‰ŠŒŒ��‘އ„…‰�‹ŒŽŽŠ‰ˆˆ‡†„ˆ‚‰Š‡‰ˆŠ�…†‡„†‡‡…‡ƒŠŠŒ‰Š‹ŽŽŽ��ŒŒŠŠˆˆŠ‰‰ŠŒŒ‹��ŽŒ‡€m^VZcke^elupj_qx}qjcdkpgZYecVKIVn€ŠˆŒŠ‰†ˆ††Š�ŽŒŒ����Œ�Œ�Œ‹ŒŠŒ��‘’�“‘Ž�’��ŒŒŒŽŒŽ�Ž�‘�’“�”““‘’�”‹‹��ŒˆŠ‡‡ˆ„~ytka[UVSOONJPQPLNJLQHJILJHMROPKNHGDEF@CAFAABC>C?ABCC?BEEEACABB@BAACCABBD?A@ADAB???>B@=@@@@BDBBADAA=@C=@@@@C>CED@CBE>@AA>A?@˜˜—š—™›œœ˜šš™››˜™šš››œ�›™�˜œŸžž�žœ�ŸŸš � �›�›™œ™š�˜šš›œž›™œ™›�œšš—‘‘•”‘‘‘�––™š›—›˜–’•–‘�އ†ŠˆŽ�’‘”””’”–•””““’�‘‘•’–˜›šš�š™šš——™—–—™™•–�އ‡ŠŠ���ŽŒ‹ˆˆ‡†……‡‡‰Š�Š�ŠŽ�‘‘‹�ŒŠ‹‰ˆ‹Š‰‹Š‡����‘“ŒŽŽŽ����‹‹Ž‹�Ћމ‘ŒŽ���‹Œ�ŠŠ‰�ŠŠ�‰Šˆ…Š�‘“��ŽŽ‹ŠŠ††‰ƒ††‡†ˆ‰Š‡…†ˆ†ˆŒ†…†††„ƒ‡Š������‘Œ‹�ŽŠŠ†Ž‡Š‡‹‹ŒŽ‹‚scX\fjaZ_fjk`alqsqfadgi`VW\XSIGVn€Š��ŠŠˆ‡ŠŠŠ�‰Œ��‘��Ž‘���’ŒŽŽŒ‹‘�Ž�‘’Ž“�“‘��‘��Ž���‘‘�‘””“’“˜�‘���‹‰‹‡…�ysnlleaZZZTTNOLOPNNKJMLMOMPLMOQWOOQPLJBDDCDCCDECA@A?@?EA?CB@EBBBCCAB@AC@BAA?>D@GC@AAAA?@;A?A>CA@BBB?A@>A>>@>AA@@DECCDADCCCA>DD—”–”––š—™š˜›››�˜››››�™šššœ™›�›™šœ˜˜››œ�œŸ�ž›š¡�œž�œœ—›™š˜˜™›™š›˜”—””—–—”’–“˜–—”””𔑔‘Š�Š„‡‡Š‰Œ�Ž�ŒŠ�‘’—–—““–“•“–“—•–””–™•—˜•—˜˜š�›˜•–Œ‡‹ŠŠ�ŽŽŽŒ�Š‹‹‡‰‡ˆŠŠ‰ˆˆ…‹Š‹‹Ž��Œ����‹�‰‹ˆ‰‡‰‰‰Š��‹�����‘Œ��ŽŠŠŠˆ„‹Ž����‘ŽŽŽŒŒ�‰�‡‹Œ†�…ŠŠŒŒ�‘‹�’�ŽŽ�ˆ‹ˆ‡ˆ‡‡†……†ˆˆ‡‡‹ŠŠ‡…‡‡‡‡ˆ‰…‰‰‹Š�ŠŽŒ��‡��‹‰‹…‰ˆ†‡�rdY[bkb^ckloibkjplidelne]X_\WLGVl‡ˆ�ŠˆŠ�‹Š�Ž‹‹ˆŠŒŽ‰ŒŽ�����Ž�’���ŒŠ���ޑޑޑ�‘’’�Ž���Ž�‘�“““”“”““Ž�‹ˆƒymmiad^XZXYWWRSQNMMMJJNJKLOOSLNRUXTXXWQKIFBBCDCCDDABDBB@@BB@A?@ABD@CBDDAA@BB?>>B@BBDC?A@=A@@>AC?@??@?AC?@@@@BB?@AADACCC@C@ACCBAD˜——–™—˜˜—˜››œœ›�›�š›Ÿ�žŸŸžœ›�›š™š››šš™ž™›���ž¡šŸ�œ£žšœ››šš™–™–””‘�–——–—˜™™š™š˜•’’‘ŒŒŒ‰…ˆˆ‹ŠŠ‹Ž��‹‰Š‰��Ž��‘““–“”•˜•š–—––’‘’‘‘“”—šššš—™˜‘�”‘”��Œ�ˆŠ‹‡‹Š†ŠŒŒŠŠ‰‰Š‰Œˆ‹Š‹�ŒŒ����ŽŽ��Œ�‰‹‰Š…‰ˆ‹Œ��Œ�ŽŠ”�Œ���‰�Ž�ŽŒŒŒ�����“�Ž�’�‹ˆ‰Š‡ŠŒ�ŒŒŒŽ�Ž��Œ��Љ‡‰†ˆ……†„„†‰††ˆˆˆ‰�ŠŽŒŠ�‰‡‡‰ˆŽ‹Œ�‹��Œ‹��Œ‡‰„�vgZ[cmiahqwxmflsnngffpoh[[eeVNIZm{…†…†‰��‹���ŒŽŠ‹ŒŒ‹‹‰��ŒŠ�‘‘�”‘‘‹��ŒŒ��Œ����”’”‘‘‘‘�“ŒŒ��ŽŒ“’�’’’�ކykddb\ZURPPTVNQQLPNNNLNJIMIKNNOSTZ^cbdd^XPIBBDBBADBDBCAB@BCC@@@@B@@?DDCBC@@A?DA?@@A@CD@B@?@CB?BCB@;??;AA=??AAECBAEBEBBEAB@?CCAADA—˜˜˜˜š•˜˜˜˜›™š™™šœ—œœ�¡žž��žžœž›žœžœ›œ—›˜™›—˜››˜›™š ›žžœ›��™––��–”’•••”——•–––•–’�ŒŠƒ„€€„‚‡†‹�‹��‹�‘ŠŒŠ‰ŠŠ‹Œ���•”—–›šš—œ–”“•’’“”–—•––—˜——™˜—•”Ž��Š…‚††‡ˆ‡‰Š�ŠŠŠ‹‰‹Ž‰ˆˆŠ‹ˆˆ‰�Š�‹‘��ŽŒŒ�‹‹†‰ˆˆ‰†ˆŠ‹��Š�’��“��Œ�ŒŒˆ‹‰�‹�ŽŽ��‘�ŒŽ‘�ŽŒ�Š‹‹�ˆ‹‹ˆ�Š‹�ŽŠ‹†Š†‰‡‚��„‚…„ˆŠŽŠ��Ž�Ž�Œ‹‰‰‰‡‰‡‡ŠŠ�Š���Љ‹…wgXXaf__iyvqganstne]bff^TW`bUIJYl†‡‡‡…‡‡‰†‹ˆŠŽŽ�“�Ž�ŽŒ‰‰ŠŠŒ��‘���‘�‘’�ŽŒ‹��ŒŽ�’����”““‘�ŠŽ�‹������ˆtha]^XVTPMINLLKNKNNOMNOKKIKLPORZ\ailprjh`WLEDBBCB??AB@@CCACB@C>=A@@A@@A>DB?BAFC@EEABC>C>A?A?>ABADCA>AA>><@@C>DDD@BED@BG@ABB@@AC@B˜›—™™›š™™—šš™™šššš››ž›™ž�œœŸžžš¡›œŸ�¡žœ�šž›š™™—šœ—™¡šœ›™�žœ™˜™•––––——”�‘ޑޒ•——’“‡‡‡‚…‚‚ƒ‡…‹‹‹‘‘‘�����†Œ‹‰‹‹‰ŽŽ”–—˜˜˜›�œ™š˜—•—•’––”—––˜˜—˜—•’�ŠŒ‰††„†ƒ‡…ˆ†…‡†‡ˆ�ˆŽ��‹‹‹‹‡‹‰‰†Š�ˆ‹�ŠŽ‰‰�ŒŽŠŠ‹ˆ‡‰ŠˆŠŒ��’“�’”‘‘��Ž��‹‹Œ�ˆ����‘“���’‘��Œ�ŠˆŠ‡…‰„ˆ…‡‡…�‹ˆŠ‡…�ƒ‚ˆŠˆŠ‡ˆŒ�ŠŽ���ŽŒ‰‰Š‰Š…†‹‰Š‹‹ˆ��‰„wgTV^c\Ybe^UNXglnh[LONVQRRWZRGHTi{‡�†‡ˆ††…†‡†‡Œ‹���“�����ŠŠ�Ž‹���‘�’“�”•�Œ�‘ŽŠ���Š���”•Ž“�’������ŒŠ|ulcYWVSRQMMLHFKHJLKKNNOKJKINNUS]dgkqsxwmaVULGDDBB>C@>??B?@B@BCABBA>AADAA>@C@@@BEDDDBEAAC>E?=>?AACBAACCA>>C>AACCCBAAEDCCGF@DCD=CCBB–•˜–˜—˜™š›™™œ—™™œ››�œœ›š›žšššš�ž›››�› ž›žž››�™›�š™™›——™‘”—–›—™˜˜•˜™••‘“Š��Ž��‘‘’ŽŠŠŒŠ�ˆˆŠ‹‹††‹ˆ‰‹‰�Œ‡‹†‡‹‰��“‘“•––—––•™š™››—™šš—›š•–——”””’�‹Œ�‹Š‰ŠŠ‹…†‡‡‚€ƒ„‚‡ƒ‡ˆ‹�ŽŒ����‹Œ‰�‡‡†ˆˆˆ‰‰‰‹‹‹Œ‹‹ŒŒˆŒ‹Š„ŒŒˆ�Ž‘ŒŽ”�Ž’Ž‘Š���‰Œ‹�Œ��Ž�Ž�’�‘�Ž�‹‹‡……ƒ€|z}~†ˆŠ‡…†Š†‹ŠŠ‹Š‡Š†Šˆ‹Š�‹Œ�Œ�ŒŽŠŒˆˆ†Š‰‰‹„‰€vaUV]c^YZRKD@KW`b[I@@BGMNS\[UEIUfz‚‡�„‰‰…‡‡ˆ†‡Š‰Š‹‹ŒŽ‘��’�����‹�Š�‹���‘‘���������ŒŽ��Ž��‘’�’�“”�“�„zoeYRJLNJMFGJHJHIJLJHKIIJMJITT[ahprwxzulbRKJGGAFBD?DBA@>A?>@AA?@D@BEADBCB>B@BBBCAADFBCAEACC@@@@A>AABACB@ABC@@C?DCC?BDACCCEBDAAACADD•™––˜—™–š–ž—�›š˜œšž š�›žž›�›šš›œššœ™›˜›��ž��ž�›žš���˜›•‘Š“�——–——––”—”‘‘ŽˆŒ‰‹Ž�‹‡Œ‰‹‹�Ž��ŽŠŒŠ‡Šˆ‰ŠŠ‡ˆˆ‰‡��“–™™˜�š™›˜š•–˜—™™›ššš™œ�™›™ž™““�‰…�„…ˆˆ�Œ‹ŠŠ‡‡†‡‡ˆ‚„�‡……‡‡ŠŽ���Œ�‹Œ�ŽŠ‹ˆ‡ˆ„‰Œ‰‰‹ˆ‡ˆŠ‹���‹Š�‰…‰Š‹Œ�Ž‘�ŽŽ���‘’Œ‘Œ��ŽŒ�‰��Œ��Ž��ŠŽ‰‡†€}wx{~�„„„†‰‹ŠŠŒŽ��Œ�‹†‡�‡ˆŒŠŒ����‹�‹ŽˆŒŠˆ‰ˆ…}raVWcid_ZVHBAHN\]VL>C@AB?BCABCDBDB@BEC@?ADB@BBDD@CDCAB>D@CEAB?BCEAACDD—™š——––™—•˜–™–ššœ››ž�› žŸžžž››���š™š˜›š™™™–˜šš›œ˜���˜˜’��‹�—––’’“�•‘މЄ„…‡‡‹‹ˆˆŠŠŠŠ‹‹‹�Œ���“�”�““���’ŒŽ”–™š–šœ›œœž›š›™š˜š–—šš–˜™——�ž˜–”‹…‚ƒ…†…‰……ŠŒ‡††‡ˆˆ‹ˆ†‡ˆ††‡‡ˆ‰ˆŠˆŒŒŠŒŽŽ�ŽŒŒ�‹Œ‹ˆ††…ˆ‡‰�Œ‘Œ���ŒˆŠŒ�‹‘‰ˆ‰‹ŠŠŠ���Ž’��‘“�����‰Šˆˆ…Љ…„„‚~�†‡ƒƒ‡„€ƒ††‡„‡‰ŒŒ‘�Œ‹��Œ�ŠŒŒˆˆ‰Š‡ŠˆŠˆ��Š�‹Šˆ|iYTScnd^XOD>>FX^^VM><=FKPT^`ULESg{�ƒ�‚…„ˆŠ‹��Š��‹ŒŒŠ�ˆŠŽ�ŒŒ���Ž’Ž‘���Œ‹‹‹‰��Ž��‘‘“‘�“�Ž�‹��ŒŽŽ���wfZTNLHIECDFGFGEHHHGLHJIKIIJPZbiimwzrcSKIHECC?B??>A@AA?@C?ACB@BA@AAA?C@AD?@BCBCC>BCAB??B>CB@EDC@DGD?CEB>C@A@@ADB@ABCCCB@CBCA?AA@@FB˜™™š››˜›–™˜—˜˜š˜›œ�š››���œ� œ� œ�žžžš�œ˜›™—™š•šš˜–ž›™•�����–’˜—“‘��Œ‡…„~„…ŠŠ���‹ŽŽŒ‘�‘’��””•–™•š˜••š™•—›™™š˜™—˜�œž›žž››š�–š™—–˜–——™˜—’Š„ƒˆˆ‹ˆŠ‡…†††�„†ˆ�ˆŠ‰ŠŠŽˆ�‹Š‹‡Š‰†Š‹‰ˆŽŠŠ�‘�ŠŒ�Ž�‘ˆŠŠŠ‹‹‹‹ŒŠ�Œ�ŠŒŽ‘‰‘‹‹‰ˆŠˆ†ˆˆˆŒŒ’�‘’�����ŠŠˆ‡„„‡�…„…€†‡‹‰‰ˆˆŠ„ˆ‰ˆˆ…†‰‰Š‹�Š‹���ŽŒ�‹Š‹‹†Š‡‰‡ˆ‰ŠŽ��‹†|lYOR`f^XTRH@AKX`d\RB>=GMNQZWNHGRh{�„…„…‡…„‡ŒŠŒŽ‹�‹�Ž�ŒŒ�‹‹ŠŒ����Ž��“��Ž���‹‹Œ‹�Š�‘’“�’’“‘”‘���Œˆ†|pfYTPNGNFHGKGGHJKJIFHHHHEGEFJO^dgdiksncSHFFDDCC@B>@>AAB?C?A@?CBBBDE??AC@?@>?CBBAADAADA>@A@C?DCBDDFDBCAEAC@BD?@@AC>AB@BBBBCE@CBAD=ADB–—˜•˜›™™™˜š™—›—š™˜ž�œ›��–˜š�™—ž›šœ œ�¡œ™ž—š›—™šš˜šš–’’Ž�‹‹Ž—™™“‘Œ‰‰‡††‚ƒ€€……Œ‹���Œ�‘”•—•”––”–™–———™–œ˜›�›šžž™—š™—˜˜™—œ�›››œšš™•—™˜–˜”�‰…ƒ„…‰Œ‹�‹‹‡Œ‡ˆ‚†„……ˆ‡ˆ‡�‹��ŠŽŠ�ŒŠ��‹‹Š‰ŠŽŠˆ�����“‘‘���ˆŒŠˆˆŠ‡Š‡ˆŠˆ�Ž�†‹‹ˆˆ…ˆˆˆ‡�‰ˆˆŒŒ���ˆŒ‰‹‰‡‰Š†……†ˆƒ…‹‡ˆ†‡ŠŠ‰Ž�‹ŒŒ‰ˆ‹Œ‡‡‰Œ‹�Œ‹���Ž�‰ˆŠˆ‰‡‡‰‰………„yoZPR`i_XTTPICP\ceXPEDHSWSTZUKFGQcvƒ‚†Š‡�…Šˆˆˆ‰ˆŠŒŒ‹����‘Š��Œ��‰‰Œ�Œ‘�‘�Ž’�Ž’��Œ��Œ���”Ž“••‘’Œ‰„skd]TPPMLKLJJMMIMKMLHFIECGCAEHKQXdjlliqlbTFB@CADBBBB>=CE@@A?=B=CCG?BCA@DDDABAFA=ABA@@BCBBCCCCCCACCCDA@?CEBCCCAC>?AE>>AD@?CCCBB@A@@B?A@—•–”˜™š—››ššš˜�œ›œ�œ››��›š�œš›œœ—š›™ž�žœŸšž�ž��››››••”ŽŒ�ŠŒ�–‘Ї…„††�Œ‹‰‡„„Š‹Œ‹ŠŠŠŠ“—š›˜™š›™šš˜™—”–š™˜�›žœ��šœ�›˜™˜˜–˜––˜˜——œ™—›ššš™”’�‡€‚ƒŠ…ŠŠŽ‰‹ŠŠ‹‹‹…‹‹‹†Š‡‡ˆ‡‰Š‰���‘“”�’��‹‰‡‰‰Š�‹Ž��’‘���‘�Š‹‰‰…ƒ…†‡‡ˆ‰‡‡†„‡†‡ŠŒŒŠŠ‹Š‡ˆˆ†‰‰‡‰ˆ‰‹‹Š����ŒŠ‹Š‡Š…ˆ†‡‹�Ž�‘�ŒŽŒ�Ž‹‰‹ˆŠŠ‹‹‹ŽŽ�ŒŒ‘‰�‰ˆˆ†€~|zpZVSckg^_d_WQMRSTMIIKVcc][^`QDHOdu‰‰Š‡�ŒŠŒ‰‰‹ˆ‹‹Œ�ŽŽ�����‘ŽŽ‹�Š‹‹Œ��Œ‘’‘‘�‘���Ž‹�����‘�“�†€zokaWTPOLNMJMLNLNKOILJGKICFFCEHMYafjpnuwqeTGCBB>CAE=>@A@CCAD?A>AC?A@BBACBDEEBBABAAB@>BCACABBDCEFDBBBCC@???C@B?B?CABD>?E@B>BB?BAC?@?BBD@—•™–•š–š•–›™–™š��›ž›�ž��Ÿš�š››�˜›ššššš™›šš˜šš›�ššŸ›�˜–’�ŠˆˆŠ…€}}~…„ˆ�‘‘��‰‹��Œ�Œˆ��“•™š›˜�ž›�ž›™œ˜™———•˜—›š›�œžœ›šš”˜˜˜’–”––—––›��›�˜—”Œƒ…ˆˆ††ˆ††‰Œ‰Œ���ŒŽŽŽŽ‹Šˆ‰ˆ‡ˆŠŒ�����”“���‹�ŽŽ‹‹‰ŒŠ‰��Ž�����‹‰…‰ƒˆƒ…‚ƒ~|€„…‰ŒŠ�މ��‰ˆ‡…‚ƒ‚…‡‰Š‹�ŠŠ‘���ŒŽŒ‡ˆŠ……‰‹ŠŒŠŽ�Œ��Ž��މˆ‰‹‡‹†‹‡‰ˆŒŽ‹ŒŽ�…~~‚zm[QWalh_eqmiYKFBDEGOUimi_]aXODDPgvzzyz…ˆŠŠŒŒ�ŽŒ��‹‹�‰‡Œˆ‹�‹��‘‘’�މ‹�ŒŒŒŠ��Ž��’”‘’�‘�’Œ�����‰€wusi\TPNQOOQMHNNKLHIJLKKMJKLKIOO\`cecbnwzujZMEEE=@>>@@>BDD@ABA@@D?@=@@B>@B@BABCC@A?A@@@D@A@@?BCEDFBCCF@AA?>?@>=ABBD@BBD?E?AAC>?AA?@AACAB›—™™–š™—™–•——•™�žš ›› Ÿ�ŸŸ��žŸœœž››š›™™››š˜˜˜›š››�šš�š‘�Š�‚‚�‚ƒ„‡ˆŠŠ���ŽŽŽ�“�––”’“•———›™–™œ›��œ �šœš˜˜˜•˜––—š™›™šš—›˜›˜™–•”–˜””–™—š™—•‘�ˆ‡ŠŠˆ‰Š‰„Šˆ…ŒˆŒŠ��‘Œ‘Ž�Ž‹ˆˆ‹�����Ž�Œ�Ž�‘Ž�‘�����ŒŠ��‹ŒŒŽ�ŒŒ†„„…„‚†„�|~€†‹ˆˆŠŽŽ‹Ž‹ŠˆŠ‰…†ˆ…‡ŠŠŒˆŠ���Œ�‘‹ŒŠ�‡ˆŠ�†�‰‹‹Š��Ž��’ŽŽ�‰Š‰‰Š‡‰‡‹‰‰Œ‹ˆˆ‚�…†{n^QR_b`ZdvwhXFB@>DDO[jnhVVXRH?BQby{}u~€„‡‰‰ŠŒ�Œ����ŠŠŒŠŒŠŒŒŠŽŽ��‘������Ž�Œ��Ž��‘’�’�“Ž���‘‘‹‡‚vjaWNIPNOSROQKHJMJGJIKMNNNOPQRU_gjf_VWcs|wpg\RQJHFBBCDABHAABCC?AAB?CBBA@@DAA@@AA@DECAC@B?AAEAF?@DCB@CBBD?@@A>@DA?BA@=AAABAC>AC@AB?@AB@DB™——™˜˜—™š˜˜›˜˜›ž››ššš›�šššœœ™žžžœœ�›œ™™›šœœ�–™™š˜—™•›—‘�Œ‡‰Šˆ‰����Š�ŽŒ‹ŒŽ��“–•™™˜šœœ™žœ—›—˜—˜™™›™››�šš�—›š›—™™•–––”˜œ˜˜š˜š•›“’–––’—‘’Œ„„†ˆŠŒŽ‰�‹‹‡ˆ‰…‹‡‹‹‹ŒŒ��������“‹���ŠŠ‹‹�ˆ������‘’�ŒŒ��ŽŒŠˆ††……�ƒ„„…†‡…ƒ„ƒ‚‹‰‰‡ˆ†‡ŠŠ�‰‡‰‡ŒŠ��‹ˆŒ‹‡Š‡ˆŠŠˆˆŒŠ‹‰‹�Œ���ŠŒŠ‰ˆˆŒ‡����‹Ž��ŠŽ�‹ŠŠŠ‰‡Š‡††‚€�€wiXSQ[[TT]ibWI?>A<>BJX\^VHKIGD?FNcq{}€„†‰…‡‹…‡‰ŒŠŠ��Š�’�ŽŒŒŠ��ŠŒŒ�ŽŽŽ’����’Œ���ŽŒ������’“’Ž“ˆq\SOOKKMRLMONNKNKGLIKIMNOMNRVY^ejgb[SV[mttqmh`][URMLIGFICCBBB>B@BB@ACBBDBBD@D>AD@AABACD?BCAEAFCAC@CAD>B>??@D>CBA@A@B??=???ABDBBABB@BBBCA—”˜˜›—™˜œ˜šššš››��š˜ŸšŸ™š›žšš™š›š�ššš››Ÿ›œžœ›�™š˜šš™™™”•”‘ŒŽ‹����“��‘�’‘••“•”——š˜›žœ�žœ›�››››—–˜™›˜›˜š›Ÿž� ™™š™–––•’•—––——™——”•˜—••Ž„€‚„„ˆ�‹ŒŒ‹‡‹�Œ�‹‹�ŽŠŠŠ‹Š�‰�Ž�Ž���’ŒŽŒ�‹‡Œ‰‹‹ŒŽ‹Œ“�ŽŽ�‘���‹‰ˆ‡…�‚†ˆ„‰‰Š…‡Š‰����Œ‹ŠˆŠˆ‹‡…ˆ‡‰Š������Œ‰‹‰ˆ‹‹…‰‰ŠŠ‹Ž��Œ���Ž���‰ˆ†‰‡‰‹���ŽŽ‹Š���ˆŠŠˆ„„}||sdXPLQUNINTLGC=@;?=?@BEJGD@ECBAAJ\ox}„‰†ŠŒŠ‰ˆ‹ˆŠ†ˆŠŠ�Š�’Ž‘’‘��‹�ŒŠŠ‹�Ž�Ž�’‘‘’�‘ŒŽ‹Š�‘�‘’�Ž�‹‰zgUPNQLOLKKKLJLLIEDMKKKINIMNRWZ[]_a`_^\_`qorrnfhjjea]YRLHEBDAD@B@B?@?@CDDAECBACB?BA?@AACBCCFDJDD@EAD@@B@A>>BCB@BC@B@A?>@A>A>>@C?C@CCCA@AEš––™–”——”˜š››š›�ŸœŸ�›ž�››�ž™™›š�œ›—›–˜˜�›œ��›ž�™›œ˜›œ™—™——“‘Žˆ‡‰ŒŽ“��“•˜˜™˜—™——›–™˜–›Ÿ™œšžž�œ›—›•—˜š—š–››™ž›�™š™š™”˜••”••’‘”””——–’Œ…‚„……ˆ‰„„ƒ‹ˆ‡‹Š‰ŒŠ���Ž�‹��‰ŠŠŠˆ‡Š‹ŒŽŽ�Œ��Œ‡�‹‰�†Š†ŠŠ‹‰ŒŒŽ����ŽŽŒˆ‹†ˆˆˆˆ†„‡Š†�‹“��Ž•Œ��ŒŠˆ†‚……†…‹‰Œ�Ž����‰���†‰†‡†ˆˆŠ‰Œ��‹�‘’��‹Œ‹ˆ‡‹Š†ŠŽŠ�‘��Ž�Ž‹†…}zrbVRKCJKJFEHGBECBB??=;=<@=?@@B@??GUdpwz€„ˆ�‹Š‹�‹‹‰‰‡‹‹††ŠŒ��‘�Ž“‘��‹Œ‹ŽŠ‹‰Œ���“�‘�Ž“Œ‘‘���ˆ‡ƒ�wj[MMONPMPPJILDLIIHFHKJKKMMJLQRRRXTZbcg`_bgqqpkfmuutlgXTNG?IBCDACD@A?A?>B>@@?B@DA@CABB@BBABDCAEDECDDBBEA?A=@@>AD>A?CC@A>B?CAAA=BACA@A@EB?A˜š–š™˜˜–˜™™›š™š—ž›ž›œž ��ž›�Ÿ�ž��››œ™™›šš˜››—�ž›�žš›���Ÿ›š™–’‘�ŒŽ‘�‹�’“š—™™›šš›˜˜šš˜šš——˜›œ �œ�ž�˜œ˜—š˜™™š˜™œš™›˜™—˜›–’•“���Ž�‘�‰„€€„„‰ˆŠˆˆ†„Š…‡‡‡‡‡‹Ž�Š���‘�‹‹Ž‹‰‡ˆ‰…‰‹‰‰Œ�ŠŠ�Œˆ‹Šˆ‹Œ‹‰‡Š‹‡Œˆ�‹‹��‹Œ‡Œ‡‰�ˆ‰‡‡‡‡‹Œ‹‹�Œ�����Š‹…††‡†…ƒˆ‹‰Œ��‹‹ŒŒ��ŽŠ‡ˆŒ††Š†Œ�‹Ž�ŽŒ�”ŽŒ�‘�Œ‰‰†Š‹‹�ŠŒ�ŠŠ‰‚xcTNJMIBCJHGDFHGBGDCFA?;>:=<:?@==9?@ES]ckz‚ˆˆˆ‡ˆˆ‰ŒŠŒ‰�Œ�ŠŠ‹�Œ�ŒŽ��‘��‘��ŒŒŠŠ‹ŠŠ��’‘�’�”‘’ŽŒ†zskZONJKHKJKQQLOLMNJKJJKHLJOKIQHQOOOPT[^_`\]cjrmccjq|siYTOJDCAB@BBCBCBB@>=@=???>?A@@@@ABCBEAA@>ACAAAAACD@BC@BA?BB>AB@AB>CC?DC@@CAAABB>A>?@@C–š–š˜š˜˜š˜˜›™›™š™™›™›››�›ž™�¡�›ž¢œœ�›�›››››•™™�˜—™™˜™šš �šœšš—•”’�‰‰Š�““˜˜™››šš—˜›šš›š—˜——˜™››œ›�›œŸ™œ�›šœ—’š”—˜šš–—˜˜–™–’”‘‘�‡�}w{|„ƒˆ†Š‰ˆŒˆŠ‰‹‹‰‡‹ˆˆŒ‰ŠŒ����Œ�ŽŒŒ�‰ŒˆŠˆ‰‰Š‰†‰ŠŠ‰Œ�‰�ŒŒ�Ž‹‡‰Š‹ˆˆ‰‹‡‰‹Œ‹��‹Š‹‰‰…Љ‰‰Š�ŒˆŒŽŒŒ��ˆŽŒ‰ˆ‹Šˆ‰‡‰‡‰ˆŒ‹Š���ŒŠŠ‹‰Šˆ‹‰‰‡Œ‹ŒŽŒ���‘’��Žˆ‰‹�‰‡‰‹‰Œ‡tZHFHILGCGMDDEEEBDFECCB>:?<<9;;=:;7?::BBPex€†ˆ…‚ƒ‡‡…ˆ���Œ��Ž�ŠŠ‹Œ‹Š�‹‹�Œ�‘����‹ŒŠŽ‹Œ‹Š�‘‘�‘�‹†xhXRNKMFFFFKQPVTQSVQQPMJKKJNMKMNMJMMKRPTYXTW[`cea[ahiaWOLJKFAB>@?B?BCA?BBA?@>?@@=>>@@A?AD>CDB?BAA@@@A>AABBBABC=CC?>@A>AB@@A??CB?AEABBB@AA@@>—–•š—›–™›�ššžšœŸš›››�™™šž››››œ��›šœœžš››™�›™˜œš››——š˜™™œœ›™š›�œ–””���’�‘•–™••‘�•“š—šœœ™�šš—™™™››š™�›œž¡›¡œš—™š–—˜—”•“———™™–•�‡{w}‚€‚„†…‡ˆŒ‹�‡‹ŠŒŠŒŒ‡‰‹‹‰Š‹ŠŠ‘ŠŠŒ��Ž�‹‹ŠŠŒŠ††‡……‰Œ‹��‹ŒŽ�‰�‹Šˆ‹‡‰ˆƒ‰‡‰‰ˆŠˆ‹ŒŒ‹‹�Œ‹Š‹Š‰‰‡‹ŠŒ�Œ�ŒŒ‡Ž‹Ž�ˆˆ†ˆ…††‡†ˆ‹‹‹��‹‹Œ�ˆ‹‹Œ‹‰ˆŠ‹ŒŽŠ‘��Ž�����ŒŠ‰‹†‡~eODBCGEGGGHGDEAAAAC?@>?=<9<:9<;9=9:7;9;;CYq€ˆ‡ˆ‡ƒ………†‰�‹Š�Ž��‘���Žˆ��‹‰‹�‘Ž��Ž�Œ��‘Œ��‹‘�Œ‘Š…|qf]RQPPLHGEHGORSKQQVWUPRMKPNKMJJOHHGKLOLQRUQQTTUSUT\ZVRMHFFDDEDB=?>=@C@B=B?AE>?B=CBB?A@?A@A@>AB=B@@?B?AABC?DCBBBBDBB@C?AC@?@?@>B?DABCCE@C@?@=’–——•˜˜š™—››˜›����š��™™››šš™ž˜™™š—–™—›œ›œœ�˜ž›š›œ–˜›™—š–•š—˜—™š––““•�“”—˜“š‘�Š‹ˆ�”•˜˜œ™›šœœ�œ™›˜˜——™–››����œŸœ˜ž›—•™’“’“—–˜�Š„…�‚�„…†††„†ˆ‡‰Š‹‰���ŽŽŠ�‹�ˆŒŽŒˆˆŠ‰†ŠŠ�ˆŒ��Ž‹‹‹ŠŠˆˆ‹‰ˆŒ‹‹Œ�Š‹ˆ�‹‹‡�‰ˆŒ‡‡ˆ†‡‡‚„„‡‹‘������ŒŒ‹‹ŠŠ‰‰ŠŒ‰…Š��‹‰�Ї‰‰ˆ‡Šˆ†……†‹Œ…�‹�Š�ŽŒ�‹Ž�ŒŒ‰Œ‹��‹‘�‘��ŽŽŽ�‡}hTEF=BFECDGDAAC?@=<==<<89:8;;:>>:8;998>?EWk‚†‰Š…‡‰…†…†ˆ‡‹Š‹‘ŒŽ‘‹��Œ�‹‰‹‰Š�‹Ž�ŒŒŽŽ�’‘’��Œ�ˆ†}ra]WQQORTQJKIIJJNKJKIOQNRPNHKLLNLJIIFEJPKKNNNRRQRNPOSZRLHJDBDCBCCCBB@C??@??ACCADBA@@BBAB??A??A:;B??>B>CA??A@A?@BC@@BB?@AA>@BAA@@B@B>AACACC=CB@A˜–—˜˜”—•—˜–››šš›Ÿœ ž �™�œ›™œž˜™™••——˜œ�™–››—��™�ž˜�››�š™™—™—˜—”–™•”–™”––š™š”Ž�ŒŒ’�•––˜˜›ššŸ�››�›—›š–˜˜–™™™˜šžš››�˜›™•–—”—‘•�‹�†‚ƒ†…†‰‹ˆ‰Š‡ˆˆŠ‡ˆ‡Š‡‹�‹�Œ‹Ž‹�Ž�Š�І‡‰ŠŠ‡�ˆ��‹Ž�‹ŽŽ���‹Œ�‰‡‹�ŠˆŠŠŠŠŒ�‹�Š‹ˆˆˆ…‚„ŠŽ�����’Ž������ŒŠ‹‰ˆ…‰‰Š‰‹Š‹Œ‹Œ�ˆ†Šˆ‡ƒ‡ˆ†…ˆŠ‰�ŽŒ�ŽŒ�Ž‘�Œ‹Ž‰Œˆ‹‰Ž�‘Œ���‹„wbRI>BDCDABBB=@<>B=??=:;8;7;:9:9:?=;9=B@ABB@BCCADB@>A>B?>=>=?<@BA?EA@??AC@BA>A?A???@?AA@A@A?BAB@@A?BD?@C@–˜™˜š›˜™š—˜———™œ™››Ÿ�š›��™ž ���›—š›œš›œž™š˜š˜›ššššššš›˜›››š™�––š™–•–“••—”˜™”””‘“—–––™—”š˜™˜œš›š™˜›š›�›™˜š˜–š˜š”—››››™˜›™–—–�ŠŠ�€~„††ˆŠ‹Œ��‹��ŒŠŠˆŒ‡ˆˆŠˆ‹‹�������ŠŒ�Š‹‰‹ˆ…‹‰‰Œ�������‘�‹�ŽŠ‰†‰‡„†ŠŠ‰�‰ŒŒŠŒ†…‰ŠˆˆŒ‰ŠŒŒ�Œ����ŽŽ‘���ˆ‰‰‰‹†‡ŠŠ‡‰‰‹‰ŠŽ‹‰�ˆˆˆ†‡„†‹‡‰Œ‹�ŽŽ�������ˆ‹Š‹‹‡���Ž‹‡�v^LBAEB?@B?><<;=<=?=>;::::98899:=<99:>Ias|ƒ‚…‚ˆˆŠ‹‹ŠŒ�Œ‹‹�‰‰‰†‰ŠŠŽ�������ŒŽ‹‹‹‹ŒŒŒ��Ž�‡ƒn`YYXRSKLONIKJKFIEJFJHNPMOMLLOOQJNMKOKJLNLKNLJEGFILMILOTTIIFDDB@CA@CC=?AB@CBCBBFB@@@@@@BAC?AA>B@@@>>>A>?@?AAACB@ABCBDABA>?@;???E=@CC@BB?D>@?@B??@——˜š—šš™˜œ—š™–š›™���œ›œš—™››œ›šžœ�Ÿš›ž��™�˜—�–™˜™–˜——�™––˜šššššš˜˜˜™˜–•—•””‘“”•™˜›œ —›˜›™•—–—˜˜™—šœœœž™šŸšš›š—™˜™˜•š›œššš––ŽŠ„ƒ‚�„„†ˆ†Š��‹��Š��‹�‹‹Ž‹ˆ…Š‹Œ‹Ž�‹�ŒŒ�����‹Š‰Š‰ŠŠ‰‰Š�Œ��‘�Ž��Ž��‹‡ˆ‡Š†ˆˆ‡‹Šˆ‹‹ˆ‹�ˆ�ŒˆŠ‹‹‹ˆŠ‹�‹�Ž‘ŽŽ�Ž‹�ŽŽ‰Ž‰‰†„Œ†ˆŠŠˆˆ‰‰Š‹ŠŠ‡ˆ‡�†…Љ‹ˆ‹������Œ�ŒŠ‹Š‹Š‡ˆ‰Š‡|hUCA@@=B?<=:?:>;;>:<;:9;<76999;<:9:9?Rm|„‚‡„……ƒ†‰ŠŠ�Œ���Œ�Š‹�†‹‡‰ŠŒŒŒ�ŽŽŒ������ŠŠ�Œ‹‹‡rf_[Z[SQNMJMJKIGHGEGEKJNMNPPPKNMNGJKKMHIJJJJMIIGEFHIIHLSSTNHFFAABBC@?@>?@>>?@A?A@E@@A>>@@>BA@A@B>@B=A@@BAC?DBA=CBD?B@AAB@A=A;;B>?B?C>ABAC?CA?>@?B>•–˜“”˜™™˜›››››ž›šœžœžš�ššš››™™ššœ˜›˜šœ˜›�˜˜�›™˜�˜–™—•’•’–’””••”—š–™›–˜——•”Ž��““–˜œœž››�›˜˜š——˜š”•—™˜š››› žœž›šœ˜™–™–––™–—•‘�‹‹ŠŠŽ‹ŠŒˆ‰ˆ‰Š‰‰Š‰�‹��Œ�����Š�‹�‡‹ˆˆŠŠŠŒ�ŽŒ‰��Š‹‹�‹Œ‰‹ˆˆŠŠ‹‹�‹�Œ�ŠŠ�‹‰‡‡ˆ†…„‡‡Š…ŒŒŒ��ŽŽ��ŒŒŒŠŠ‹ˆ‰Š�‹‹‰�Œ‘�Ž�Š‹‰‡‰‹ƒ„ˆ‡††‡‰‰ŒŠˆ‡ŽˆŠŠ‰‡Œ‡ˆ‹Šˆ�Ž��Œ�ŽŽ��‹Š‡‰Š‡{lQD?A>>=>@:<<;9;8:;9;8:>:<8;899;<888CTp€ƒ‰‹‰ˆ‰†ˆˆ†…Œ‰‹Š‹Š‹������ŠŒŠŠŠŠŠŠŠŽŽŽŽ�‘�����‡ƒuja\USSQNKHKNGJNGIGHFHILLJKNMPPMPKKGKGHCHIDIGJIIGHDIIIEJUYXNDBCC?B?CEBBA?=>>@;?>?@D?AAB@@@?@B=C>>?>AAA?@@DADBC=C???AA@A@A@@@A@=@@;@@@?A=BBBB@A??@A@—–——”•™™˜™™�œ˜žš� �ž�›�ž››��›™™ššš˜˜–šš™™—––šš™œ›–™˜•—––’Ž��ŒŠ‹‘—•”‘•–™•“’��“�‘–•™˜šš™™žš›��š›˜š—š˜˜—™—š››ŸŸ�žž ššš˜™™—”””‘�Ž’�‘�‘���ŠŠŠŠ‰ˆ‹‰‡Š‹Œ‰‘ŽŽ‘‘����Œ�‰ˆŒˆˆ‡Š‰‹ŒŒ�Œ‹ŒŽŒ‹‹�ˆŠ�†Š‹‹‰ŠŽŠ‹����Šˆ‰…ˆƒ†ˆ…‰ˆŠ‹��ŽŽ‘��Œ�Ž‹‹ŒŠŠ†Œˆ‹ˆ‰‰��ŠŽŠ‹‘�ŠŠ�‰„…ˆ…ƒ†‰„…ˆ�ˆ‹‰‹ŒŒˆ‰Š‰ˆ‰�‹ŠŠ‹�‹�Š����‡‹ƒrZD;@>>?;==:;;=;;:97:;9<;9<9;999:79AD@BADCEC>D>@C???CBB@B?B??A?=?BDA@BCBBCDAB>@B@@>A?B<@A@@?B>@>AB>?@@@@>BAA>B>A–™˜–𖕙𗛗™–™š››Ÿž�šœŸ››žŸ››�››�š—˜—š——‘’’–™•–—”””—•‘‘’�Œ‰‡ˆ‹�Ž�Š‹‹Ž’��‘’�’�’”••˜˜——––—š™š›œœ�ž�˜œš—˜˜––˜™™š�œœœ›�š™š–—–“’‘““���Œ�Œ�Ž��ŒŽŒŒŠŠ‰Š‰ŠŠŒŒ�‘���Ž�Ž‹‹�‹ˆˆˆ‰Š‡‰‰Œ��Ž���‹‹‹Ž‰��ˆˆ‡†‡‰Š‰Œ‰ŒŠŠŒ‡‰ŠŠ†‰‰†��Š‹�‹����Œ��‘ŒŒ�Љ‡Š�ˆ‡‹ŠˆŒ�‹‹�Š‹Šˆ‡ˆƒ‡†‚„‡ƒˆˆŠ‹ŽŽŠ‹‹‰‰‰Š�ˆŠŠŠˆ‰��Œ��‹�„uXF<=?>@<=<;>7;:<9;:8;99:;99:6977;;=?Wm~„ƒ„ˆ††‰ŒŠ�����‹ˆ‡†Šˆˆˆ‰ŠŒ���Œ�Œ‹Œ‹‰‰Š‰‡Œ‰�‹ˆ‡ƒyk^YPHFGGGDDADGIJNHLNMHIIJGIIJJFHEBDEFFDHGFFDBBBABDFKIJRU_`YOGGIJFBEABABAGKMRQNJLJHCCABAB@ABC=AABBCB@D@A?ABABBD@ACCA@??>@???;@>>@@AAB??@B>>@@>C??>A•š›—›™™˜›ššš™–™™›››œ™��™›�›žš›ž›š›œš˜—˜˜–“�””–•�Š��”�‘“�‘�Ž’‹��Œ‹Š‹ŒŒŒ�Œ��Ž��ŽŽ“–”š——™™˜––“™–˜�œ™�›��šœ›š˜–š——›–˜šš™˜š�™—•š”–”‘“��ŠŠ‰ŒŠ��ŽŒ�������‹Œ‹‰‹ŠŒ‹Œ��Œ�Œ�ŒŒˆ�މ‰‰†ŠŠ‹‹�‹�‹������Љ‡Šˆ„„‡ˆˆ‡ˆ�‡‰†Œ‡�Œ��‹�‹Š�‰ŠŒ�ŠŽŠŒŽ‘���‹ŒŠ��Ї‡…‹ˆŒŒŠŠŠŠ‹Œˆ‡ˆ‡ˆ†ƒ„„††‡ŠˆŠŠŠˆ‰�‹ŒŠŒ�Š‹‡Œ‹‡‹�ŒˆˆsUA>?A@@==<9::>:;:7=9999=:9::::78;;9CUr€‚„‚ˆƒ†ˆ‹‡ˆŽ����ŽŽ‡‹†Š††ˆ‡ŒŒ�‹‹Ž��‹�ŽŒ�ˆƒ€|y}€|wcXSLLDFDDBBC@DHHHIKONLKJHJFJJGIGBBCCFFGIHGFGAG@CABNLQVY_dc^ZVXVXVOOJCJJJLJT^^caa]\SNNDCFACE@@BACCD@C@@AA??A@A@?BC?C@@?@??BAAB?@B>B?=@A??D••—”—š—�—šš››�š›››�›—šž››–™œ–˜›˜™˜™™˜š–˜˜–•—˜”’�‰Ž���‘��’’����‹�Ž��Ž�“��‘�‹ˆŠ‰‹Œ�“–šœ››˜™——•š”––š—›�˜ž™žœ™›š˜—›—”˜—•–—•–˜—š˜••’“�ŒŒ‹Š‡ˆ‰‰‹Œ‹�Š‘��Ž”Œ��Œ‹‰‰‹ˆ‹ˆŒ‰����‘����ŒŠŒŒŠˆ‰‹ŠˆŠ��‹‹ŽŠŠŠŒ‹‰Š‡……Š……ˆ‡ˆ‰ŒŒ��‘Œ‘�‘�‰��‰ˆ‰‡‹Š�Ž�‹��ŽŒŽ�ˆ‡‹‰‡‡…Œ…ˆˆ†Š†Š‰Šˆˆ††ƒŠ…‡‡…‚‡††‹ˆ‹���Œ‰ŒŠˆ‹‰‰‰…€lTB=A???@:>;8?=;99:9:;::89;;7:9;6:9:>Pj~„Šˆ„††Šˆƒ‡�‡Š�Œ�Œ��ŠŠŠ‹‹‰Š‡‰‰‰�ŒŽ����‹„yupnnvulXNMGHDCDEC>DBEEHGKKLLNGJJKMHJLIGBDGCFHJJIMFEFGIGJPVUZbfmkllhefffbb[ZXVVTVVY]intvrnkb^QJEFBBBB?HGBC@AD@>DA@AA??BA@?AA@@?D@?A>>A>@@@>;;?:>;8;:::;:;9;89;:<;7;:89;Gdu€ƒˆ…‡ŠŒ‡‰†‡Š†ˆ‰‰‰Œˆ�‰Š���މŒŒˆŠŒ�Ž���‡€xusrsom^SHIIFFDCEEGCGJIJPJKIIKHHHHIJJKLIGHHFFFKIEHGDJLNUYYdgfjprvstmokhgfjkkihnmi_T[`ku{~zxtlcTLLCCDD@C@@AB@C?DB@AABB@?AC@@@?@>A@>AB?=A@B@BA?C????D>ACACAB˜˜—˜–™—›š–š˜˜››œ›���žž š››�™–˜—•——”’‘�Š‹�ŒŒŒŽ�����’�‘‘�‹��‹�‡‹ŽŠŒŠŠŒ‡‰‰ŠŒ�Š��Š���Ž�’‘••—•—š˜›š™›š›˜™™——–˜™–šš™�œ™œ˜—˜š••”‘�ŠŠ†Š‹Œ��Ž‹Œ���Š�ŒŠ‰‹Š‹‹�‹‹ŠŒŽ��Ž�‹‰‹‹‹ˆŠˆŠ‹ŒŠ����ŽŒŽ�����ŠŠ‰‰…ƒ‡ˆ‡ˆ��‰‰Œ‹Š‡Œ‰ˆˆˆ‹ˆ‰ŒŠ�ŽŽ������‹ŒŒ‹Š†‰†…‡†‡‹‹Ž‰Ž�‹‹�‰‰ˆ‰†„€‡ƒ†„ˆ†ŠŒŒŠˆ‹ŒŠ†ˆŠˆ†ˆ„Šˆˆ…„€„‡……„{gN@?@:<<><=;=:<:>:::<9:::888=8:<77;8:DVqyƒ�†‡†…ˆŠ‰Š‡‡‡…‰…ˆˆŒŒ�Ž����‰ŒŒ�‹ŒŒˆ‡{ztnipfYOIIIKGDDDEIIJJMNPMNKKLKGHHGJMKMKJGKKFHIIDFGFJITTZfimckpyzzzxtib[_ditv|||whWQO\eimmtyufTNIEDBEBCCCBA?B??C?BBA@C?@@DC?=B@?>=@A?A?@BC@A?>?AA>@CABBBC>—•š—™›™—š˜˜™ššœ›› ™›��›š™™›˜––•�“‘�…{|uz{z€~�~�ƒ…‰††‹‹††‹‹‹�ŒŒ�‰ˆ‡ƒ|{|‚…ˆ‰��”�””’‘“”‘’““——“—”—›šœ›œœš™›˜—–—••—š˜—˜—šš™—™•�‹‰‡†…†‡‰Š�‹Š�‘�‘‘ŽŽ��ŠŠ��ˆ‹‰ŒˆŒŽŽŽ�ŒŒŽ�Œ‡ŒŒ‡ŠŒŒ‹‰‹�Š‹�‰��ŽŒ‰ŒŠ……ˆ…‰„ˆ‰‡‡Œ‡Š‹�‡‰�‡‰Œ�ŠˆŒ‹Œ‹Š�ŽŒ�����Œ‹‡‹ˆ„‰‡ˆˆ‰‰ŒˆŠ‰ŠŠ‰Š‹‡ˆˆ…†‡‡‡‡‡‡Šˆˆ‰‰‹‡ŒŠŠŠŠ†…‚|xqwy‚€�|yjOC?=@=?<:<=:9;=<=::;9999:98:<8;998;BA;>>A@B@?@@BCAD@A=B@>BB==A@@@B?A??@DB?A@˜––š˜˜˜™›š››˜œœ™�š™˜œ�™—�Œ���ŠŠ†‚|vrqnnprvv}{{€}~‚��’ŒŽ�ŽŽ‰‡€€�‡ˆ‡‰‹‘�’“”–”••—–—””–••’••———›š˜ž›œšš—––•–—’•—–”•——”Ž‹‰ŠŠ‰‰‰„†‰‰‡ˆ‰�‹’’�����”�Ž‹ŠŠ‡‹‹‹ˆ�ŠŽ‹�ˆŠ��Œ‹�Œˆ‰ˆ‰‰†‡‡‹ˆŠ‹Š‹‹ŠŠ��‡‰Šˆ‡‹…„‡†„‹‡ŠŒŠ���Œ‹Œ‹ŠŠ‡ˆ‡ˆ‡‹‰ŠŒ‰ˆ��Ž�‹�‹ˆ‰Œ†ƒ‚‡‡ˆŠŒŒ‹‹‹‹‹Œ��‡†ˆ„‡„ˆ‰ˆ‰‰ŠŠŠ€|rslmmv}{|w|veNA????<<<<>:::;;;99<99;998:7;798699:CXp}„{{zsio{„‚‚ƒ†‰Œ‹Š‹ŠˆŠŠŠŠŠ‰ŠŠ��Œ“���ŠŠ…yd]ancYPLMQRTUUSSUVUTSRSQOPOOPKLNLMPPJFGDEIDFDEFDDIIGKGLMOQHOYfs}}€}tk]USXds�€~r_LCDCLPUXgppeSLCC@B>CCBDCBD?BB>A?AB@?@A>CC?>=@=B@@B@>??D@AA@C@•˜•—–—™–›šœ›››ž™��››š™•‘‰}{xyuqnrojmrppu{}‚‚ƒ†ƒ�€�€|~|„�‡ŠŠ�������ˆ�ŽŒŠŽ���“�‘’�•’–””˜š”�——˜——•—”˜š˜›˜šš˜›�š›š—•—–“–”—•”‘ŽŒ�‹�Š�‹‹ŒŠ‡ŒŒˆ‰Ž�ˆŽ�’Ž���ŽŽ�Š‹�‰ŠŠ‰Š‰�ˆ‡Š��‹�Œ‹Š‹�Šˆ‹Š†Š…ˆŠ†‹ŒŒŒŒ�ŽŽ�‹Œ‰‡ˆ‰‡…ˆŠ‡‰ŠŒŽ‹Ž����Љˆ‡…ˆŠ…ˆˆˆ‡‰Ž�Š��‹�‹Šˆƒ‡††ˆˆ‡ŠŠŠ‹�ŠŽ�‰Š‹‰‹‰ˆŠ„ˆˆ‰ˆˆykdipnenv|wz{{xiO?=>?=<<=<;9>;:;;;99;7<8::8;99999799BXoz��~zxmbjuxzuy�‹ŠŠˆ�‹�ŠŒŠˆ‹‹ˆŒ‰ŒŒŽŽ����ˆ|kiome`XY[`_dacb_]cXZ[XUQQOOMILNNOOPMNHGGHJIHEGGEIIHHJJILKNJILUbjkpmda\SOWcpz~teWLJKUZ`gnuxpbSIDCB@@DBBBG@CCC@AAAD???@>ACA??>?CB@?@@?>C@?BAAA?@C?—š˜•–”šš˜—œ™™�š›�›šš›š‘‹€zzyvsospppmrruv}‚„ƒ‰‰‹‡„„ƒ‚�ˆ„†…ˆ‰ŒŠŒ‹�ŒŽ‘�“��Ž�‘––���‘’Ž‘�””••œ˜ššš˜šš•˜—˜•™•–—™™™˜›™—š—›š•”‘’‘�‹‡‰‹ŠŠŽ‹Š‹Œ�ŽŽ��މ�ŠŒ‹�‰�Š�ŽŽ�������Œ‹‰‰‡‡‹‰ˆŠŠ‹ŒŒŠŽŽ‹‰‰Š†Š‰‰Š‡ŠŠ‹�Š‹‹ŒŒ�Œ‹‹ŠˆŠŠˆ†‰ˆˆŠ‹ŒŠŒŒ�‰Š‡ˆ‰†Š…ƒ„Љ†Š‹ŠŒŠŒ�‹ŒˆŒŽŠŠ‡Š‡ˆ‡Š†Š‰‰‰�ŒŒ��‹Œ‡ˆ‹ˆ|h[^gjgeky€~‚€zhOA;??;=:=;?;=;:=;897977<768;;8897=9>AXn{€}{{xodisupfn|‡‡„‰‹‰‹Œ‹‰���Œ�‹Š‹‹‹���‹‰ƒxyyqkkikklmpmmjdc`_\]\XUQMMMJKOOLKNKMKNJKNKNILHIKKHGGIOLLNHHLPQTWZSTSSQKT_n|„‚{wi]Y`diqrx~€}saYSKIDCEABBDBBCDB?BDABBD@BA=@B@=??BA@?BD@AAC@@@CBB@CA?A>DCB—™š™˜––™š–š—˜š�››™›–�–“�Œ‰‡ƒ„ƒ}}|||~{‚‚ƒˆ�‰Š……………„„‡‹‹‡Œ��Œ‹‹ˆ�Ž“�މ†Œ��”‘��’”““’‘‘”•‘–˜˜™š˜œš˜–�™˜˜š—˜—“–•’•–™—™•—‘”Žˆ‰‡‰‰ˆˆ‰†‰Œ�ŒŽ�’�����Š��‹ŠŒ‹‹‹‡Œ��Ž�Ž���ŒŒ�‰ˆ‹Œ‡‰‰ŠŠ‰�Š��‰ŽŠŠ‰ŒŠ‡�Љ‡Œ‰‹Š‹ŒŒŽ‰�‹��‰‹‡‡Œ…‡‡ˆˆŽ‡‡‡‡‡ˆŠˆ‰‡ˆ‹Š…‰ˆ‹‡‡�‹ŒŠŽŽ�Œ‹�Šˆ‰„„………ˆ†‰‹‹Œ‹�Œ‹�ކvaX_hkhem|„‚�…‚{eMA==::9;;5:;88889:;5;99;:9@Sm{‚||wuqdgpse]d{†ˆ†Š…‡‰‰‰ŒŒŽ�����‹‹Š‰��Šˆ†ƒ€�~yw|~}{yzqqjib^_]_ZZRRPKIMJNJNLPMOOOOPMPMONNNJGIGGJMMGIFHKHJNMHIILOMKRex~„€|snoqrwyzv}ƒ€~sg_WQMIDEEFCEBF@A>CDAAA?EB@@@B@@A@CBBCBABBBEDEEAD??AD@D@@BF•—–šš�™™™ššš›šš—š—•™œ—––’‘�Ž���ŽŠŽ�ŽŒ�‰�ˆŠŠŠ‰‰‰ƒ‚‚ƒƒ…‡†ˆ‹‘’‘’•�’‘’���ЉЋŒŽŒŽ•––––—•™—–——•””™––•˜–š›—�™—˜—•’“’‘�‘���Œ‰…‚…ˆ‰‹ˆ‹‡‰„‡ˆ‰‰‹�ŽŽ�Ž‘‘��’�ŠŒŒ‹Š‰‡�‰‹Ž�Ž‹‘��Ž�‹‰‹‰ˆˆ‰‰…Š‹‰ŠŽŠ�‰�ŽŽ�‹‹‹‰‡ˆ…‡‡‰Š‰��ŒŒŽ‹Š��‹‹‰ˆˆ††ƒ�…‡‡Š‰‰Š���ŠŠ�‰‹‡Š‰ˆˆ‹Œ‹���Œ‰‡…††‹‡‡„†‡ˆˆŠŠŠŒ�Ž…u`Vdopg\iy€„�ƒxaL?=><>==9;;<;8;9:99<87;77789:39969;:CUn}�€{{wi_dmk^Viz‰�ŒŠ‰†‡…‡ˆ‹‰�Œ����ŒŠ�Ž�‹ŠŠ‡†‡€‚�„†‰„€ƒ‚|wuqid^`bbYXTSONMSQQQRSRQRMLMKLLOQPKHGIHIHDIDEBEIGHKHHEGILIHKVfsurqprnx{|qglqxtqg]VRNMMEJHEEHD@@AFB@DB@AFCEACCCCCCDA?FA?DCAEEEGFDDDBB@@EB?—•–š—–˜šššœ››™žœš›››œ›™—˜˜•’•‘•”’“•—••••’’’�ŒŒ‰ŠŠˆ…„†„‹��‘“’�’““–‘Ž’ŒŽŽŒ‹†‹Œ��‘—–”™–›˜—™––ššš•–•–•›˜™›�˜Ÿ�˜˜“•‘ˆˆ„|{€|€ƒ†ˆ‰‰Š‹Š‹�‹‰ŠŠ‹‹‹‰‰Œ�ŽŽ������‹‹‰‰�Š‰ŠŠ�‹�����‹ŒŽ�‹�‹�ˆŠŠ‰Š‰‰Œ‡‹‹Œ‹��Ž�‰ŠŠŒ‡ˆˆŠ�Šˆ‹ˆŒ‹����ŽŠ‹ˆƒƒ€ƒ…†…‰‰ŒŠŒ���‘����ŒŠ‹ˆˆŒ†ˆˆ‰‡‡{sx‰‹‹ŒŠˆ‡‰ˆ‡Š‹‡‹‡„u_WdklYWjy€}~rWD>A>=9?=>:<;=9997=997:89<9:7677::88:>Qkz€}}{ueYbjcXQf|ˆ��‰‹‹‰‰‡‡ˆŠŠ…Œ‹�Ž‹Œ��Œ��‰‹ˆ‹‡‚‚†‰‰‰…‡†‚||zwkiimi``YYTPVRUWX[[VVTPKMMILPOMIGGHLJGGBDADDCCCEIEFDHHFHGITY]][`]dswwmWRPT\_\YLMHLKNIIGDILGDCEHDHEGDDCDDCHHDEFBGBECAABFDBIJLHLLIBCDACFA•—•–•˜––˜™—›››œœ�  ž¡�››››˜”–”˜”˜–––“•—•”’�‘“”‘’‘Œ‘Š�Œ�����‹‹��‘‘‹‹ŒŒŒŽŠ‹‰����’���‘“”–—™œ˜›œ™™›—–––––™š–˜š››š“�†€zz{~y€‚„†Š†ŠŠŒ�Œ�������ŒŒ�Š‹Ž�‹‹ŽŽ�މŽ������ˆ�ŠŠ‰ŠŠ‰‹��‹Œ‹Ž��ŒŒŒ‹‡‹‡ˆŠ…‹ŒŠŽ��Š‹Œ‹ŠŽŽŒŠ‹ŠŠ‹‰ŠŒŠ‹ŒŽ‰Ž‰‡†Š‡‡…†‡…‰‰‹�ˆŒ�ŽŽ�‘�Š�Ž‹ˆˆ‡‡ƒyf\k~‹��‹ŽŠŠŠ‹††ŠˆˆpYS]e^RTer|xvokVD@>>?:?;:;;;<:;9:988;7788869;9998<87:>@<9><:;99;979::99798:4:876::8;8:;:;A?@>><<:9<=:9::8:888;8;5<;69898:799989;7=::=;?AGGDBGJJEKc|†‡†‡†‡ˆ…Šˆ‹Œ�‹Ž��Œ‘Ž�ˆŠ‰‰‰‰Šˆˆ�ˆŠŠ‹‰ŽŠˆƒ�ƒ‚„zztttptrmqojj`_^`dbe[[^``VRSQPRRQOKIJKHGGIKKMJMKNJFFKIGECIJQQX[ev{zqh^XXW[WSNMDEEGIFIFEHGEFFCFFFDJEFEFGJFIGGCECEIDGILOTVYVSKONMNLKKMH•——™™—›™ššš�›˜›™šš›š™™™›™˜˜˜™˜—˜—–••“˜•—˜—–—–—••’’����ŽŽ��Ž‹��Ž����‹ˆŒ�ŒŠ�‘Ž�’�‘“””–’“”—•”•�’”—”˜˜˜–™ššž™™™˜˜–“•�•‘��ˆŠ�ŽŠŒ‹���ŽŒ�ŠˆŒ‡Š�‹���Ž������ŒŒŠŒ�ŒŽŠ‹ŒŒŠ�ŒŽ���Œ�Œ‹Š�ˆŠ‡Œ‡Š‰Œ�‹ˆŒ‹ŽŒ‹‹ˆ‰„…ˆ…ˆ‰ŽŒ‹‹Ž‹ŠŠŠŠ�ŽŒ‡‰‡‡„��€€†ˆŠ�Œ�Ž‹ŒŽŠŒ�‡‡ŠŠŠ‡†ˆ‹‹�ˆn]g{ˆ‰‡‰ƒ††‡‡‡ˆ‡ˆ‡€nOAEC@A>@>>==?=<=<<9;==;9:8;8;7:899>:8899999782885:9:8>:;;;=>A=;=;;AH_x††�ˆ‰Š‡‰…‰‰‡‰Š�‹�‹Ž��Ž�‹Œ‰…‰ˆ‡†ˆ‹‰…‰ŠŒ�‰‰Š…†‚�}yxzzz{z|zuoigbfnmc`flaYTV[^]ZYZTTPOJMPMRRPTTWSSRSQOLHKNLORWaiu‚‚€{pkiiggaZONFFFGECEFEEEHCBFCF@HGEFDDFGFDFBDCEGGJGNRV\caXMIIKKLLJNK—–˜•—–›—šš™š�œœ�›˜�›››œ™š—™™•••—‘“Ž‘Œ�•™••š•�”˜–‘‘‘�‹��‹Œ“Œ��Ž�’“��Ї�‹‹‹‘‰‹‰Œ‹Ž���’••–—•–•’‘“‘’”—–•——šš˜šš�š——™•“‘‹Š…‡…†‹Œ��‘�“��ŠŒŽŒ‰ˆ‰Š‰‰Š‹‹����‘ŽŽ‘Ž��ŒŠ‰ˆŒŒˆŒŒŠ��ŒŒ‘Ž‹ŽŽŒŠˆˆ‡‡‡‡ˆŒ‰Œ‹‹Š�‰‰ˆˆ‡Œ�‰‰ˆ‰‡‡††ˆŒ‹Ž��‹Œ†‚‚€‚�††…†‡‹‹Œˆ�‘‰��‹�‹ŠŠˆ‡ˆŠ‹‡ufo‚†‹ŠŠŠˆˆ‰…„…ˆ…�z[A<@@@?A@>=@>A89;87;79:;:>9;:>><>;=:;7FQm}†ˆŠ‹ŒŠŒˆ‰‡ˆˆ‹‹Š‰Œ‰‹Š‹�ŽŽ�ŒŠ‰…†‡ˆˆ„‡ŠˆŒŽŒŽ��‹ˆ…‚€€„€…ƒ�{{vqiqrriikl`WV]dd`^][_][VUUUWUZYWXTSSWWYRMKOPTSVY]gp|‚‚~{unoprkaVNGGDEBADDDFCHDACFDEEECE?BBCD?DBEFIJLLKMINV_aZQMKLLNJNMM˜—˜•˜—˜——˜™š›˜›�›� œœ››œ˜š›˜—˜™–�‹‹‰ˆ�’’’•••˜–“—�’���”’�—”�ŽŽŽ��‰…ƒ……†ŠŒ‰ˆ†…ˆŽ‹ŽŒ�Ž‘’‘–�“’“’•”““˜••––•“•™——Ÿš›š˜—š–”Ž�ˆ‰„�‹ŠŽ‘‘�“��ŠŒ�Œ��‰Œ‰ˆ‰‰‹ŽŒŽ�����‘Ž�Ž��Š‹‹Œ‹‰Œ‰‹ˆ�Š����Œ‰ŒŠˆ…Š…†Œ†‡‰Šˆ‡‡ˆˆ‹Ž���ŠŠ‡‡ƒ…‡‡‰‹ŒŠ�Š…‚‚……‡ˆ…€‚„‹„†ŒŒŒ‹�‹‹���Š‹Œ‹Œ‡‡ƒxrt€‰ˆŽ‹‹‹‹‰‰†‰……{cF@@A?B=A@>89<<9;<<:EXo|ˆ‹‡‰ŠŠˆŒŠˆ�ŠŽˆ‡ˆ†Œˆ‹Œ‹��‹�‰�ŠŒ‹‡„†‰ŠŒ‹�Š�’�‘�‡‹ƒ„„……ƒ‚„}|zqmtssnkkh]ZZ\^`a[[_ee_YX[[ZY[VYRSNLOSTOJKNTTVZW]ahouwrnc__^a`]WRMIGCEDFECBDC@DEDCDFECD@B>>BBBAAFIKJKMKHJNTYTUQRRNNMKKN———˜˜›™——–—œ—™™˜œ››šš�šœšœ�š™—›”“’��‘“�“•“”””““‘Ž‘‘’–•’“˜–”“���‰�{{‚~ˆ‡‡…‰‰‰�‘�’‘�’“��Ž�ŒŒ��‘’“•—˜–˜š–”™–”——–•˜’—™›—––“�‘‘“Ž’�‘‘����Ž�‘Ž’‹��Œ‰ŽŒ‹‰‹Š‹ŒŠ‰Ž��Ž‘���Ž��ŠŒŠ‡‡ˆ‰Š‡ŒŒ�ˆ‹�ŒŽ�†ŠŠŠŠˆˆ„ƒ……‹���‹�ˆ‡ŠŠ‰‰‡Š‡‰†‡ƒ��…ˆ…Œ…†‚‰‹‰‰‰‹†‰‹ˆŒŒ��‹ŒŽ�Œ�‹†�{z€…ƒ‡ˆŠ‡ŠŒ‰�‹‹…uWE??@>=A>>A>>=@>;><<>;<;99969:<69<;9898:9:9699:::7:976:>95;899::;:;;9:>Lbz‚‡ˆˆŠ†ˆ‰Š‰Œ�ŒŽ‹�І‰Š‰ˆˆ‹ŒŒ���ŒŽŒ‰‰ŠŽ‰‰ŒŠŒŠ���‹Š††‡††‡„�€{smhhgddc]^ZZY[XVZ\_^ccZYX]YWZUVWOKHIFHKHFHGLPPNXWZZab]ZVRNLLLQQQQQOQNKQNIKI>BCACC?EEGAC=DCB?AC=AEFGJKJKKLKSUWUXTTQJHHGI™˜–™™—™›š›——˜›ššœ›˜›™™œ˜››š˜™–™–š™™•˜—––•••’‘”“��’��’–’”““’•’�’…‚€‚ƒ„‰…‡ˆ‰‡‹Ž‘�‘�‘�‘’��‰Ž��‹Ž““–˜š››š—˜›™—–—”–”•––˜——𛕗˜•–•—‘—“‘��’��‘Ž�‘��’��ŽŽ�ŠŒŠŠˆ‰‹�������‘Ž����Šˆ‰ˆ‡‡ˆ‰Œ‹‰‹��‰Œ�‹ŠŒŠ‡€…„„‡‹Œˆ‡Œ‡ŒŒ‹�Š�‰‰……~~x„‡…‰ƒ‡†Ž�‰��ŒŠŠŠ‰†‰‡‹‰Œ‹�‰Š‹‰„~€}~…„‡†‡†ˆ‰‹ŠƒpVGD??A>==?=>@A>>?:<=<<<99=9769777<9:8;9:7;7:5;:587;;7=<79::;<69:89;8::AA@@AGIKJOHPQSVUZ[_ZTONHDFF–•“–—–˜™›™›�›››�›››˜š˜š›•–˜˜””˜š—š™˜—˜š——š“•“‘–’��ŒŒ��“�’�‘‘‘‘���Œ‘�ŽŽŠ‹�‹‰‹Œ�Œ����‘‘‘���’���’“�“–˜˜––ššš—š–•™˜˜–•”••—•––˜™•™œ—œš˜—””‘Ž�ˆˆ‹�ŽŠ‘‘������Œ‹‹‹�ˆŠ‹‰���‹‹�Ž����‹ŠŒŠ…‡‰‡…Šˆ‰ŒŽ�ŒŠ‹‡‡‹‰€……‡‡ƒ„‡‰��Œ����‰‡„~{|ƒ†††…‡ˆŒ‹‹���Ž�ŽŠŒŠ‰ˆ†‡‡‰ˆ‰�ˆ‰……�„ˆ‹Š‰‰‰†‡ˆ†}saND@BA=>A>?@?;?;><:=:<<:8<:;988:;899:9;8:9<8::899998:89<:;=9;<=8<<<8:;AOhz„Љ�ˆŒ‹‡ˆ‰‰ŠŒˆ��‹���ŒŽ‹‹‹ŒŠˆŒ‰Š‹‹ŠŒ���ŒŽŒ‹Š‡‡…‚€‚‚„‚tkedaYVQSTPQRSV\[[`]aa`]^YYWYSSQQMKECCCBDDCGFEBDEGJHMNKKGFIDHAGGINLPZ]cfa^\ZWPLLIIG?CC@A?BC@C>@=?>BGMRRVRRTZYZ\Z]YUOIJFDF”•™•——•™›šš˜œ�››ž�š�›œš�œ—˜˜›™™”š–•–˜—™–––•–’”—‘‘‘����‘�’����Ž�Ž��–“��Ž‹�ŽŒ�Œ‰��‹Œ�ŒŒ‰�‹��‘‘‘�““‘•�‘•�•—”—˜š›™››š–˜”—˜“—––”–ššššš˜š™™‘Ž�‹‡‹‰‰ŒŽ‹�Œ��‘��Ž��Œ†��Љ‹Š‹Š‹Œ��Ž�Ž‘��Œ‰Šˆ‡†ˆ…‰�ˆˆ…‡Š�‡‰‡‡‡‰……†ˆˆ‹Š‹‹ŒŠŠ‹‡~~ƒ…‡†‡†�‚…‰‰‰‹ŒŠŽ���‹ŒŠŠˆ‡Šˆ…‰Š‹‰‡‡‡ƒŠ‰Œ�‹Š‹ˆŠˆƒ„|m\J?=B@@AA;>@?>;>=;=:?;;9<:8;:8:88<::<8878898:<:9::7<968<7:?;::;<;<:;@I]p}…ˆŠŠ‰�‹��ŒŠ�‰‡‰‹‰�‹����‘�‘��ŠŠ‹ˆ‹ŠŒŠŽ�‹‹ŒŠ‡�ƒzzvuqqv{vujga``]ZZVSVSVUY\`bcdb\\W\\\^[YXPLIGD@ACHCDDCECDFEDGEJEGGEFEJHHKLLMKIMTX_UPRZ^`^XUOJFD?B@>?F=A@A?A?BDN[ac`Y^b^[YTTURNIIBAE™—œ˜˜˜”–™™™™™™˜˜›™�š›š›� ››�žš—™˜™—˜•••–•‘“��‘‘”“–‘“’”’•’Ž�’��Šˆ‰��‹�‹�‹�Ž�Ž�‘��‰‰‹‰„‡ˆ‡Ž’’”–––“”‘Šˆˆ��’•”•–™—›šš˜œš™›——™•””—•—š–š™——’�‘ŽŒ�Œ‡ŒŽ‹Š‰‰ŠŠŒŒŒ���Œ�ŽŒŽ�‹‰‹ˆ‡ŒˆŠŒŒŽ�����‹ŽŒ‡‹ˆˆ‡‚„‡…ˆ†‹Šˆ‹ˆŠŠŠŠ‡‰‰‰‰ˆ†ˆ……ƒ‚‚‚…‡Šˆ…‰†‹Žˆ‰ˆ‹ŠˆŠ�‰ŒŠ�Š�Œ‹Œ�Œ‰Š‹„‡†…‰‰ŒŠŽ‹�Š‹‹Ž…†{dLA=>>=??B?B?@?><>;@:>:8989;:989;:8;;95988:69:997:6<59:8:<<<9<7=:<:9IUkz€…‚Šˆ‰ˆŒ‹�����‰�‹Œ‹ˆŠŠ‹�����’��‹ŒŠ‹Œ‹‡‡‚�|xqlfgcaa\^`_cb\[ZY][WXVYZWZ\\_afhf]XWVZ^^^\\WTNFHEDEFEDEADAADFDEFHDDDDAHLQMSQSOMIJHMNSNJHSYdifcVKDDDAED@C?@@CA@CBGR[fehcfic^RPQQJKIGDEA™–™š—–™›œ˜˜˜™›™˜™™œ›™››™›™›˜›šššš—˜•˜“•–“�“��‘”�‘’‘“‘’��Œ���‹ˆˆ‡†ˆ�‰�‰ŒŠŠ�‡‹Ž��ˆ���Šˆ�Š��‘Ž““”�’�„‡‡Š”˜––—”–•™––š›š™��˜›››˜™˜•™“”””’“Œ���Œ�‹����‹‰ˆ‹‡ˆ‡‹Š������’�‹Ž�Š‹‰Ž‰ˆŠ‹‡‰ŠŒˆŒ�Œ�‹�‰ˆˆ†‡…„„„‰Œ‰‰ŠŠ‰‹Š�‹ŽŠŒˆˆ‰ˆ„ƒ‚ƒ‡……‡ŒŠŠŽ‰‹�Šˆ‹ŠŠ‹ˆ‰Œ‰Œ�Œ��‘���‹Š‹ˆˆ‡ˆŠ‡Š‹�‹‹�ŒˆŒ†kOCCAAAA?<;??>>=;;@:>9;;9:97;:87<<;998::7797;88::8:89979;<969:98:==CDDBHFQW^ca`dfmYVOJLMJHBECB‘”—˜”˜—™œš�™—�›˜›š—š˜š—™˜—––•˜–™–””””–”—“•—��’”’’’ŒŒŽ‰…‚‡‰ŽŽŠ‰‹Œ���‰Š‹‰‰†††…‡„ƒ‰Ž’�Ž�’’‘”•��“‘‹…~‡‡‘•™œš�šœ–™—–—˜—–”›˜››�›œ›ž™™——–’�Œ‹ˆŠ�Š�‹ŽŽ“ŽŒ‰‹��‹Œ‰Š‰ŠŠ‹���ŽŒ���Ž�Œ�ŠˆŠ‹„ˆ‰ˆ†Š‰ŠŒŒŒŒ‹‹‹……‰‰‰‰ˆ……Œ‡Š‹‹‹�‹‘‹��‹‡†‚„��ƒ…ˆˆŠ‰Š‹�‘���ŒŽŒ‰ŒŠ‰‰‹��‹�ŒŒŒ’Ž‹ŒŠ‹‰Š‰‡‰Š‰‰‡‡‹„jSKIMD@>:><:;=<<<<=>9::6;999=8>:9::8;:5997;889599;;9;9<:<998@CDKay„ˆŒ‡Š‰‡‹‰ŠŠ‹Œ‰ˆŒŽ�’������Ž�ŠŠ†~laailppnibb]XUUSNNIIGFCEFHNRSRYSUZYWQWUWVX[dliib\\Z\UURMNNJHHJJKKKDCCABACCBBFEHEGFFM[e^YUPRLNKFHIIOLIKIOQSOHFHJLLGFBCDABCEFIHJLNPTQTX_]WTQLMONIFF@C”———–—˜–™››œ›œ�šš™››››™šœ–“““’–”—”�’“”–—–’–’’”�’Ž�ŠŠ…�€€ƒ„‰Š‹‹�Œ��ŒŠŽˆ‹Œ‡„…ƒ�€ƒ‰ŒŠ’��••––””–‘ŽŽŠ…‹�••š››œ™›˜�˜™˜š™•–—˜˜™˜˜›™œš›—•’’�Š�ŠŠˆ‰‹Œ‹�ŒŽŠ‹�Œ‹Ž�‘�ŒŠŽ‰ŽŒŒŠ�����‘����‹‰Š‹‰†‡‰‰†ˆŠ‰��‹‰‰ŠŠŠŒ‰‹‰„�ˆ‰ˆ�‹Œ������Ž�‡ˆ‡ƒ……†‡ˆˆ‰ŠŒŒŒŒ�Ž��ŒŒ�Œ‹‰Š‡ˆ�‹ŠŽ�Œ��‹Ž‘‹‰‹‰‰‹†…ˆ…€rZWc]PB?>BGIB9>:?;;;::;=:::;7;99;7<9=9<89:9;;9:;9988;:898==@=<8:@OSTT_w‚Šˆ‰‹‹‰Œ�ˆŒŠ‹…‡ˆ‹ŠŽŽ�‘Ž���ŒˆŠƒpXPV\gjkiieb_[ZUWOKIHCFCBHIIPOSVZ^^ZUSSPSNNQW`bf`[\\VNNJKHGGHCJJLJKFFGHJFFF?DFGEFHGGKYaa]VSJIJNJIHIJOHJHGMJKFHOOQRJCC?BDBCDGHHJIKLKIMJPSVRTRLNLOFEEE–——˜—•˜”˜˜š™—™ž›™›››žš��˜š”“““‘––”‘’���ŽŠ�Ž��Ž��ދЇ‰ƒ€‚‰ˆŠˆ‹†‰‹‹Šˆ‹ˆ‡†ˆ„ˆ††‡‰ŒŠ�‰ŽŠ”�––•˜—–”–—•“š”––—•–š™™››˜ž™›�œ›–—™”••—˜––‘’�Žˆ�������ŒŒ‹‹ŠŠŠ‹Ž��Ž����ŽŒ��Ž‹�‰‰‰‰Š‹Ž‹����‹Ž‹Š‹‹‰ˆ‰‰‰‰‰Œ‡‰‹ˆŠ‹ŠŠŽ�ŽŠŠŒŠŠ‰‡ŒŒŒŽ�މ‰ˆŠˆ‡ŠŠ‹Š…†ˆˆ‰ŠŠ‹�Œ�‘ŽŽŽ‘�‹�ŒŒ‰‰‰‰ˆ‹Š‹‰Œ�Œ��ŠŠŠŠ…‚oggrlWG=@IMH>>=7;=:;;9:::>:9;:::89998<99;79:8;79::979:87:>CD>8;?L`ic_cu�…‡‰‡‡‰ŠŽ��ŒŒ‰…ƒ‡‡ˆŒ‰‹�Ž�Š�‰Œ‚lURZ`hoifhfdb]aZWQNMFHIMJLMIKNTX[a`[VSUSRTQOQSTUYUWTQNKJLFHBCGIIGGIEFLPROLHHHGDHHHGFIPY^aWPJIORTOPOIMLGIJIFFMIMOTPMFABBEDGHKIGGHJJIJFHGKRUVOLPPLJIHK–˜™™š™–š˜™™–›š™™™˜›š˜Ÿ�›œœ—•”•�”•’��‰ˆ„„†ˆ‡‰ŒŒ‰Œ‹‰Šˆ„�‚……‚„…ƒ„‡‰†…‚…†‚†‡‰Œ‹ŒŽ��–Œ�”��’“”•–———š™šš™š›–—™––˜š–š—››››™š�˜˜˜™–“”•‘���Ž�’ŽŒŠŠŒ��ŽŽŒ‹‹ŠŠŒŠ‹ŠŒ‹�‹�Ž�‘Ž��‹ŠŠ‰‰‹‡ŠŒ‹‹�Ž��‹�Œ��‹ˆ‰†ˆ‡‰†Š‰‰‹‹����‘ŽŒŠ‹‹‹ˆ‹‰��ˆ‡ˆˆ…ˆ‰Š��‹†‹‹‹‡ˆ‰‰‹����ŒŽ���ŽŒ‹�‹†Šˆ‰ŠŠ‹ŠŠ��ŽŠ‹��„|swsbD??CG?B=9=<:>;;9<8;:;:88<9;89::589:989;58::;8;;;799=BD;9=GWkxvkn|„ˆŠŠ„‡Œ‰Š‹Š�Œ‡ˆ‚„…‹ˆˆ‡‰�ŒŠŠŠˆ‚lWT`ikookffd`]]XQORLPNTVUQTNQPWZ_b`ZVT[UTYZWUSORTSVOJKKGGGGDAEEGIGIFJJUXVQOOKJIHMLKGMIMQYTRKLS\Z_^XYSQMGGGKFHEKMJLHGECBGIOOOLLJMNKOJNJHKPVXUOPMMMOQU’š–š—˜™š™š›šš™›œ—™™™™—›˜™˜•”—•’“‘Œ��Œ‡ˆ‰†Š‰Œ�ŽˆŠ†Š†‡}‚ƒƒ�‚‡ƒ…‹‡‡„„ƒ‚……ˆŠ‹Œ��’‘“—••’’“““’–——˜˜šš›ššš˜šš›”š˜˜•–––˜˜š˜š�˜œ›—˜™�”•‘‘���ކ‚€…Ž”���‘Œ��ŠŠ‰ˆˆ‡‹‹‹�Ž‘Œ��‘‘ŒŽ���ˆ‹‰‡‹‹Š‹ŒŒŒ��ŽŒŒŠˆ‹…†ˆ…ˆ††Œ‰������‘‹���ŒŠŠˆŠ…‚ƒ€‡‡Š‹�ŒŽ�Ž�ŒŠ‹�ŒŠ‹Šˆ‹ŒŒŽŽŒ�Œ�‰ŠŠ�‰ŠŠˆŠ‰‹ŒŽŒ�ˆ†‡ƒ�‚|iO==??<=<>=9==::;==99;::88:7:;;8<:=686995898999:87:6==<7;BNfs€{xy€ˆŒ‹‰ŠˆˆŠˆ‡ˆ‹Š‰‚„…ˆ‰ŒŠ†ˆ‹‹ˆŠˆƒ|m^^dnryxvncd\ZZQROQPTY]]\\\]WY\]^bbc]^[VT\c]^[ZXYXWQMJIGHHDGDGGIIHLHIJQVSPNNKLGLJOLLMGIJNPPNJR[bdbc_VVQHHGJKIHIGFHIEBDCIJS^[SRRRTURVVVNPV\`_]VTVSSX]”•——•™˜›™œ™›��œšœ™™š›——š•–™“”�‘�Œ�ŒŽ‹‰ŽŠŠ�Ž�’Ž�‰Šˆ‡„~€~ƒ„„ƒ…ƒ…‡‰‰‰…‡‡ˆ‰‹��‹��ŽŽ�‘‘•˜–•˜””™—––—•—–™™˜—š™��˜�›˜˜–˜•”——•–šš˜˜™š››™˜™–’“��|or|Œ�‹ŽŽ�‘��ŽŽŽŠ�‰ˆˆŠ‡‰Š��Ž‹�Ž‘Œ���ˆŠ‹ŠŠŠˆˆ‡‰ŒŠˆ‰‡‹‡Šˆˆ†‰‡‡…ЉŒ‰‹ŠŽ���‹��ŒŠ‹‹‰†…‚€}ƒˆŠ‹‰�ŒŒŒŒŽŒŽŒŽˆˆŠˆ‹Š‹ŠŒ‹Œ�‰Š�Œ�Š�Š‰ŠŠŠˆ‹�‹‰‡ˆˆ‡‚oXJD;>@<>?<<>7><=8>;::;;:87;;6>:7<:;:6::9:799;7:999<7;9<;F^t}€‚‚††ŠŒ�‹‰‹‰ˆ‡‰‹‹‡……„‰ˆ‰‰†ŒŒŒˆ†‚|xrjjlz|~z|ooaa][ZVVX[]ehedbebdacdcekkhga\Y_gjgcddgc_XTSNPPKGOKKKJLMIKIKMSOMKKKHJJIJLMMNIIGLJJKPTVZ][WTOPJIIKNLFHIFCHDFGHIIW_ib^^^\^b``\UVX_hkgba]X[YZ•–™–•”———š™–˜›œ�šššš�œš›™˜–š•““Ž�Ž���ŠŒŠ�Ž““‘‘�ŒŽ‹ŠŠ……ˆ†‡‹‰ƒ†‡‡Š‹Š�ŽŽ‘‘’‘‘�Ž’’…‡ˆŒ�’““•–™˜™š™ž–™š–˜•™–™™šš�–ž›š™š˜™™™”—•••••˜™šš››˜›—–Šjkz‹‹ŠŒŒ�Œ����Ž�Ž�ŽŽ�ˆŒ�‰ˆŠ‹Š�������Œ��ˆŒŒ†ˆ‡‡‡†„‡ƒˆ‡‰ŠŠŠŒ‰Œ‹ŠŠ�‰ˆ‡‹Š�ŠŠŒŠŽ‹�‹ŒŠ‡|†Š†ˆ‰ˆˆŠ‹‰����ŒŒŠŠ‹Œ‹‰…‰‹ˆˆŒ��‹‹‹Ž�ŒŠŒ‹Š‹ˆ‡ˆ‰ˆ„…|oZKC@?@A<><==:=<>:<;9<98<8:;:7<79:=58;9::8:9988997;979>@Tkz„†‡…ƒƒ‡‡‹‡†‰†‹‡�Ž���ˆ…‰……ˆ‡ˆˆ�ˆˆ€vuz{yvx}�„�}vnljfihbbcfkopnikhkhgokkmtxvqlfchnnnklpkikb`Z\`_VY[SQQIJKKLJLMPNMKLLIGGGKKILLIJLJGGHQQJNMQPLNKHIILOJNJIHHGIMKJGHO^lmmglhgikf_[]^`bhnkhcZXQS™—™—––•–—š—˜™š™™™™›œ›™œž�—™›š™–•“�‘‹Ž�‰Œ�����Œ��‘ŽŒŒ����’’Ž‘‹�Ž���’�‘‘“••–“‘”�†‰Š�Ž’’“�–š•›››œ�ššž™—•š˜“˜–˜•š™œ››˜šœ˜™š˜–––•”˜™”šš™˜›•�{ko}‰‹Œ‰Š�Œ‹ŠŒŽ��‹��ŠŽ�‘Œ�‡ŠŠˆ‰‹ˆ‡�Ž��ŠŽ�Œ‰‰‡ŠŒƒ�‚‚�‚……‡†‰ŠŠŠŒ�Œ��‹‹ˆ…Š‰ŠŠŠˆŠ‹ŒŒ‰†ƒ€…†‰‡‹‰†‡†ˆ‰‰��‰‡��ŽŽŠŠ‹‡‹Š‰ƒ‰ˆ�‰‰‹Œ‰�ŒŠŠ�‹‰‡‡ˆ‡‡„‚|nYEBA@>@>=:>><=<9;9;:<9:8999:89:<9:5:79:8=97:86::9999=L]w~ˆŠ‡‡‡‡†ˆŠ†‡…‡ŠˆŽŽ��‘ŽŠ‰ˆ‰‰†ˆ‰Š‰~olu€ƒ„€‚�ƒ…ƒ{vsoopmkkkpr|xysmnrrptrrw}}€|yvqrwvvvrrsqtmifjpjnge_ZQNJLHHOKKLKOLMLKKJJGIHJLKIIGKELJJJJGKGLGKJHHIIMKLLIIJKHOMLJLYgonqmpmjicYY[[a^ddhe[XRMH•–›š˜™–œ™˜š››ššš™˜›™šš™™˜™–››•›——’‘����‘��Ž‹ŒŒŒŠ‹Œ‹�‘�“’’™’”””�–“’“‘“���–’’’‘�Ž’“”˜–’–••”˜––™˜œš™œš›�›šš�š—™•“—™”™š–›—�šš�›•›˜˜•—’–•“‘ˆ{qs~Œ������‹Š�ˆŠŠ‹Š��ŒŠ�����ŽŽŠ‹‰‡‰‹‡Œ‰�Š�‹ŠŒŠˆˆ„…„†‚‚€€„…†‡†‰�‹‹���І‡Š‹Š‰Šˆ††‡ˆ„„€ƒ‡ŽŒ‹ŒŠŠˆŒ‡Š‡Š‰ˆ‹Š‹�‹Œ�Œ�‰‹ŒŠŠ†Š†ˆ‹‡‹‹Œ‹Œ���Œ‹†‰‡…ƒ{fSF<@@><==>>=?;<;>;=:<:8:8;;9;:::89:9788:99:>89:<7:=D\kzƒ†‡‹ˆ‹‹‰�‰‡‡†‡Š‰Š���������Œ��‹ˆƒ{psz€ƒ„ƒ}}}�„}yzxttsma]jmry~�yztz{zty}€ƒƒ}||{z{{zzywqmpprurtupi^ZTQQHJHLLIJLKLNINJKIOMLIKGJHHHFJJLIIKHKHKNEGGFHLHJJHKHJPNONQR\`glpkhgcYTSU]_`_]`YYRKHD™”˜–š˜š˜š›œššž™š™™žš˜–––””•••’’““‘‘�Œ�����Š‹ˆ†‰‡‡‡‰‹Š��’’“��“’–”““–‘‘�‘’’‘‘�”‘“–——–˜š–™—š—˜˜”——–›–šœš�š›œ�š™–˜–˜•••———š—œ›™š˜š™˜™”“‘�ˆ†z~€„‹‹���ŽŽŒ’��‹Ž†‹ˆŠŠŠŠŠŒŠ�‹Œ�Š‹�ŒŠŠŠŠ‰‡‹ˆŠ‡„„‡††‡…�…‚‚…„…†…ІˆˆŽ‹‰Š††ŒŽŽŠ‰‰ˆ…ƒ†�}�ƒ‰ŒŠˆ‹ŽŽ‹ŠŒŽˆ‰Š†‹†ŒŒ‹‹Œ��ŽŒŒ‰ŠŒ…ˆˆŠ‰‰‰ŠŽ‰ŽˆŒ‹‹Œ‰ˆ‡�wcJC>>?:=;<><;>;<;=98=8:89<999;;<::89:98:9;97988;;:BReu„‚…„‰ˆ‡ŒŒŒ�ˆŠŠ‰‹‹‹�‰ŠŒŽŽ’�����ˆŠ}{}}}}xpjhiljgklnmli_UTXaenx||w}��}~‚�€€‚{srvwzz|z|}ƒ{vvvxuw||qojd[YVNLKLLHJJMHJHLMMKOKHJLMMJHHGHIFKHIJMIJMKHJHHGHIJFHGIJNKNOSUYY\bb^\VXPKPV\_\ZXRKMFED••˜“———˜˜˜™››žš�š›œœ———’”’�‘‹�Œ�‡‹‹Œ��ŽŽ�‰Š�Љ‰Œ‰Š‹‹��Ž‹ˆŒ‹‹Œ��‘������“‘••’””��’‘‘•””™š™�›œ™™™™’˜™•––™š�›˜š�šœ›˜™—š–˜˜––“—˜˜••—”˜•”��ŠŠˆ…‰‡‡Š�‹��Œ�‘������ŠŽ�‹ˆˆ‡ˆŠˆŠ‹Œ�‹�Š�‹�Ž‹‰‡…ƒ…€‚€‡ˆ†………‡‡ŒŠˆ‡‹ˆ‰‡†‰Š‡…ˆŽŽ‹Ž�Œ‰‡„†„���„‡†‰‰‹��Ž�‹ŠŠŒ�Š‹Œ‰‡‹Š…ŠŒ‹�‹ŠŒ‹��‰‹‹‹‡‰‡‡ˆˆŠ‰ˆŒŠŽ‹ˆ„tTI?A==<=::;>:;;;<=?8;8<899<<9<;:9<;:;:;998;78;99AH`u~…‡…………ˆƒ‰‹‹‰‹‹�‹�‘ŽŠ‹�ŒŒ‹ŠŒ‰ŠŠŒƒ€~|{vplkd[SWVSUVY_agibXLRW\eksuxy�…‚‚‚ƒ€|{ylfdjinppxz‚ƒ‚‚}~y|y|{suric^\TPNKNJMMNMKKJLNJNJIKLMMMKMKLIFIIMIIJMMKJLJMJLLIIIHGGJKOPNNQNSUUVWRQLJLPWTTROMIGFEC˜•™•–—•™—™›˜˜›šš›˜�˜””“‘“Œ�‰Š�‹ˆ‹�Š‹‹‹ˆˆˆƒ‚…‡‰ŠŒˆ�Œ�‹�‹��‹‹ŒŒŠ��ŽŽ‹�Ž”•”––“””“�‘‹���“–——�š�››››™™™™š––•–˜—™˜™™™™–›�˜˜˜•””—’’�“�Ž�’���ŒŽŒŒ��‹ŒŠ‡ŠŠ���ŽŽ���‘��Ž��‹Š‡Š‡ˆˆ†Š‰Œ‰‰�Œ���Œ„ˆ„ƒ�€ƒ‚„…‚†ŒŒ‰ŠŠŠ‰Œ‹‰‰Šˆ‰Š�Љ�‹Œ‡…†‡†ƒ‚ƒ€‡…†ŠŠˆ‡‹Œ‰Š‡ˆ�‰�Œ�‹‰‰ŽŠ†�‰ˆ‹ˆŠ‰Š‰Ž��ŠŠ‰‰‰�„„‹‰Š�ŠŠ†~eNA=<:@>:<8<<;9<>:;==::=8;7;:8<8;7<7;888988;;FSj}……ˆ‡…І†ˆ‡Š‹†‰Š‰‹��‘���ŒŠ‡ƒ||~wuknoke`fed]]YUQMQQVYcni^VTXV\empsz{|}€€‚~x|znfc_b]_ehirxx‚ƒ€|{{{{{uuoie`\ZSRRMNLNQKMKLLNHJHHINIKJKJKLGIGIGKFHIIGKMPLQRQMLLJLJIHINLGKLMNOMRPNMILMOPPQIIGGEBD–™ššœ™™™š›™›™š—™˜•“’�Ž�Ž‘ŒŽ�‹�ŽŽ‘‘ŽŽŒŒ†……{~|~†ƒˆˆ‹‰Š��ŒŒ���‹‘�Ž’�Ž�’�”’”””•�”“����’’“�”—•˜˜˜™�ššš™žšš˜—™–—–———•™•™™š™š•˜š™‘��І‡‹Š�‹�‹���‹ŽŠ��Ž��‹�‹�Š�ŽŠ�ŽŒŽ���ŠŽŒŠŠˆ‡‰‰‰‡ˆŠŠ‹‹ŒŠˆŒ‡‚‚ˆ†ƒ…�ƒ………ˆˆˆˆŠŒŒ�Ž�Œ��‹�ˆ…‡ˆ‡ƒ�„‚„€„„‡Š‰‹Šˆ‹Š‡…†„…‰‡ŠŠ‹��Œ�‹‘ŠŠˆŠˆ‡…‡ˆ‰���ŒŠ�ŒŒŒŒ‹†‰†ˆ‰‡ˆrXDA@=@<>>@:<=;8:;99;;:<:<::=:799688<69<:;8:7;8?J]q|„…‡†‰‹‰ˆ‹‹ŒŠ‰††„��Š�Œ‹Œ‰‡{tqpnlcbkke^aemihgjb\YYYU[fqrgVVYZ^ilpqtwwuz{wuuutkhfgeab]acjovyvxuwwwxzrpnjcbb[YTOLQKMTMJKNKKLLHJFFIJKHGJHLHKIGHHGHGLIOVSSORRVUQJMLMLIFJKJMNLQNKKMNKLRQNLIFCDDF”——–—ššš›œš˜š›™™––’މ�Œ‹ŒŒŠˆ‡ˆŒŒˆŠŒ��ŠŠ„„~|~|€ƒ‚„‡†…‡ˆŠ‹ŒŽŽ”’’•—––”’•–“‘“ŽŒ��‘‘””’˜—˜š——˜”—•˜˜–——˜šš™›š›——™—•—•””–•——˜”•™”’�‘ŒŒŒŠ‹Œ‰ŠŒŠ‹ŠŒ‹��ŽŽ�Ž‹���Ž�ˆŒ‹‹‹‰ŽŒ�Š�Ž�ŠŠŠ‰‡‡ˆˆˆ††‰‡„…ˆ†‡ƒ„††Š†…‡ˆ‡Š…‰‰‰‰�ŽŽ�ŽŒ��Šˆ†‰‰„€�~|~�…ЉŒŒ�‹ŽŽ‰‰ˆ‹‡ˆ†ˆˆ‹‰ŒŽ‹Œ��ŠŒŠŒˆ‹‡‡Š‹‹ˆ†‹Œ‹�‹‹�‹‹ˆ…Їˆ‚yeK>?9<;<=79998:887999;8=>==<:=<9>9::=99;<9:<9;6:=:887;858:7E[o�…„…‚„ˆ…ˆˆˆŠ‰ŠˆŒ��‘�‹‰†‚‚€|}|€|}}sikswsqvrxz}}smoukf_gqsgVNSUY^bbfkqrwuwx}qsusrvooqhadhkjmknrtsuutsnplniorib\ZVVPKKMLMMKIEKMONLMJJJLIFHEHKHHHHJKJOLORSRPRTXVSJHIKMNKLKHKIIKJJJKLJPVTTLNOPNLH–›˜—˜˜™š™™™›œ›š›š“’�‹‹ˆ†‹…~{{~z{~€�~ƒ‡�ƒƒƒƒ……ƒ†‚…‡ƒ†…†…‰‰�ŽŽ��–——™–––™–•–’–•–••–’˜•˜™�˜š�›š›™˜•˜—’’˜“•—™–———˜•™™—––�’މ‡Š„ˆŒ��Ž��ŒŽ�Œ���ˆ‰‡‰‰‡ˆ…ˆ‹ŽŽŽŽ�’‘���Œ�Š‰Šˆ‰†�†ˆˆ†ŠŠŠŠŠˆ†~yw|z€~‚ƒ‚†„��‹Ž�‹‹‹Š‰‹†Š‰‡‰…‚‰…‡……‡ƒ„‚ƒ…†ˆ†�‰†‰ŒŒˆŽ‹‰‹�Œ�ŽŠ‰‰‡ˆŠ‡‰‰ŒŒŽŒ��Œ�ŽŒ‰Œ‹‹ˆŠˆ‰‰‰Œˆ‰‹�‹Œ‡qS@=A=?<;;<<;<==5<=:;9;:9:;;9;7<9;;899;8;5779>DXq‚†‡‡ˆˆ‡‡‡ˆ‡‹ˆ‰‰‹ŒŒ��ŽŠŠˆ„‡…‚‡„„ƒ€xhlqmmps{~{}|ukfgjc\W^a^YSONMQRW\_gjpsvwxyyustuwtsk_[^djoqqnnovzwuqonnfhjh]XWXXTSMJONLNIIKJMMMKMLJLJKIKDIIGIKJJNLNLLKKSVXYXTQNJIIKLLNMHFKNJKLLHJMKXWTNNLOLMM–œ™œ™š›šš™˜šš™™–•‘Œ‹Š‹†‹�‹‚…‚ƒ}€�}z~|��ƒ‚„‚‚„†‡„„‹‹��‹���‘‘’•“�‘‘�•••š™š™™˜—š–˜—•–”•–™–——š™––˜˜–——•“––””“’’“–“’”��’’Š‹ŠŒ‡�ˆ‰Š‰ŒŠŒŒ�Ž����‹Š‹Œ‡ˆ‹Š‰ˆŠ‹����������ŒŠˆŒŠ…‡†‡ˆˆŠ†ˆ…�~y{}}€�‚|~}€€…ЇЋŒŒŽ�‹�Œ‰‰‡‚€ƒ‚‚�ˆ†…‡††‰���ˆ�‰Œ‡‡Š††ŠŒ‹��Љ�ЋЋ‡�‡ˆˆ‹Š‰‰Œ�ŒŽŽ‘�‹ŽŠ‡ŠŒ‡‡Š‡‰†‡„iF>CCA>:=>=;<=?9<9<=::<<<::;9=;966;9998;;97;9:>Ti{„…‡ˆŠ‰Œ‹Œ‹‰Š†ŠˆˆŠ‹�‹ŒŠ��ŒŠ�ŠŠ†‚|pggd_X_n{{yrleYUYXXQPRTVQPNQROMOUYdjptptyvsxwvtsmh_XRU]agilfjpv{wsttvmjf\\YWVWTRTOOQSNOJJOKGLLLPNKMLNMJMKKIJHIJKNNJILIRWY[\XTMNIMGINNLMLLKNMQKMGLNUWTNNJKLOO›—™š™››š��˜›™š–—”Ž‹‹Œ††ˆ‡ˆ…„„�ˆƒ€~~ƒ€†††ƒ„†Š‰‹Š…†‡ŠŠŒ���’’“‘�••—“�’““”’•••˜˜–––š——–——•——”–”™”—–˜™—––˜˜”—”–“”�’�Žˆ‹‰Ž��‹ŽŽ��ŒŠ‰�ˆ‹ˆ‹ŠˆŠŽ�ŒŽ�Ž�Ž“Š��‹‹Œ…ŠˆŒ‰‰‹��Œ�‹‰��‹Š‡‹ˆ†††„€‚{x{}�„€‚~€ƒ‚�{�ˆ†††Š‰‹‹�ŒŒ�‡ˆ�‚|€�‚„…„…‰‹‹ŠŽ‰Œ‹Œ�ŠŠ‰ˆƒ…ŠŠ‰Š…Œ�ŒŒ‹‹��ŠˆŒŠŠˆ‡ˆ‹Š‹��Ž‹�Š�‹ŒŠ‡ƒ„ˆˆ…{ZIF??@@;><>?<>9;<;;=8;:=:::>:<9:;89;;88:=8;8=;=F]r|‰†‡Šˆ‰ˆ‹ŒŠ‹‹Ž‹Š†�Œ‰ŠŠ��Š���‹…~pkhgfYPQ_ni_Y^ZTQRRPROSVUNLLQOQKOLT_iklnnvxqwokff[WUNLMWZ^_cbijqtssruxqmj`ZXV\VVRRUVSUUQPSOONNMMMNOLOMMPPMOOMMNMMKMKKJIOLV[WYUUQLOMJJIJQLLONOPPNNKMNVOMKHKKKN™•™—›››šœœ™žššœ˜•’‘�‰‚…ƒƒ‚€~ƒ„‚„ˆˆ†‡ˆ���Š�Ž��Œ�ŽŽ�‘�Ž�ŽŽ’‘’•’”“™˜•–“‘”“•’‘”’•———™™˜™š™™˜–—•–‘’˜’’“—””™—™™––��‰‰‡ƒ†‡��‰�ŒŽŽŒ�Œ��ŽŒ�‹‰ŠŠ‡ŠŠŒŒŒ�’ŒŽ‘ŽŒ�ŽŒ�‹Œ‰‡Š‰�ˆ‹ˆˆ‹‹Š�‰Œ‹Š‡…ƒ|x{{…ƒƒƒ„…†……„……Œˆ‰ˆ†‡ˆ‡ŠŒ‹ˆ„‚zx~‚…„‡†ˆƒ…†ˆŠ‡‰ŠŒ‹Ž‹��ŒŠ‡Œˆ‰††ŠŠˆ‰‹ŒŽ‰Ž‹Ž‹��ŠŒŠ‰†Œ‡ŒŒŠŠ��‹‹�Œ‰‹‰‰ƒv_MD>?>;===?<=><=<<;8<<98;;>6><:;:<9:<89::89;8::D[v„„„†‡‡‡Œ‡ˆŠŒ������‰Š‹‹‹ŒŠŽ‹‡zmbnoonaSPTZVSMQQVVPQQSVZ]YQJIMPPMJIMWabaekmpmhbYQTQRMHNOQQR[^acionnnkqvpjge_^`^^]^Y[[][\WWXWVVURRQRONQOOOOPJLQPOORNMQKLKMMPNQRTTPTOPNQNPSRSQNTPQNNLOLLQNNKIILK—˜——˜™™™šš››™žœ™–—��Œ‰ƒˆ…‡‚„‚„„‡‰‹‰��Š‘’’‘”’�’�‘•Ž”•Ž�‰Š�����“••—•–“–“•”““–”’”—’•–•–˜š™˜™–š™”––””“�‘“”–™——™•‘ŒŠŠŒ‡‡Š‹ˆ†‰ˆ‡‰�‹�����‘���Œ‰ŒˆŽ‡ŠŒ‹ŠŒ����Ž���Š�‹ŠŠ‹‡…‰…‰ˆ‹Š‹��ˆ‹……„|{‚…„�~‚‚ƒ„„„„†…‡‰‹Š‹ˆˆŠ‰‹‡‰ƒƒxz}…ƒŠ‰ŠˆˆŠˆŠ‡ˆ†ˆ‡Š‹Š‹�Œ‰�Š‹‰Œ‰ˆ‹‡ŠŠ‹Š‡Œ�Š��ŽŽ����‹��‰ŠŠ‰…ˆ‹‹Œ‹ˆŽ�†aLEA?=>;?<<@=<9<=<<<;:9;;;<;<:;9;8;9;=:7::7<:::H^tƒˆˆ…‡„†‚‰‰‰‰Š‹�‘Ž��‹ŽŽŽŠ‡†‰„x_^hqw{sdWSSNPPQRSWURNNQV^e_RGILQLGDHFMRRQU^a`[XOKHIMOKLNOQOUZ^cjmkmkiigooqnjlebefdggefea^_\``ZY[SSSROPRLOMNOOMPMPPMOOPMRKLPKOOMQOMPQMRRSTX[^VTRYZWSSTPRPSPMNLJL™˜™–›—˜š–››˜š™š—˜’‘“”ŽŒ��‰‡ŒŒŒŽŒŽŽ��ŒŒŒŒŽŒŒŒ��†Ž‹Ž‘‘Ž‹Š�‘”��“”’‘”’•’”–“—”š——˜˜˜—”•–’”–””•—š—™—œ™™–•˜”——“’—”“��‹ŠŽŒ“‘‹ŒŒ‡„‡‰†……‡Š‹Ž‘��Ž���‘Œ�ˆˆˆˆ‰…ˆˆ‰�ŠŠ‹Œ�ŽŒ��‹ˆŠ‡Š…‡ˆŠˆ‡‹ˆŒ…€‚ƒ…Œ„……ƒ�~‚~ƒ€�…‡ˆˆˆ†ŠŠŠŠ�Š„‡€|xy}ƒ†‡Š�‰‹ŠŽŒ‰‹‡ˆ‰†‰ˆˆˆ‹‡Œ�‹‹�Œ��‹Œ‹�ˆ‰‡‹‹Š‹Š‹�Ž��ŽŽ�ŽŠ‰‰ˆˆŠŠˆ‰‰Š�Š€kSCD>B>@<=?<=;;;<=>;;<9<>::89;97:;:<<9<;99:<:;BSdx‡‡‰‡‹‰‡‡Œ†††ˆˆ�Š�ŽŽ�Ž���…ƒ†|nafo{~zr_YY\\XYYYVYUUJIKYekaTNTQJFDCEGIKHHIQQQRMHFHFNOPQQPRSYZbfmmknnheilnumsponiimsopldkgfaaa[VZVVVVOPQNOOOMONOPMJJLMOPMMQNOMLMLJLNKQORQUZ`b\UU\]_YZ\[ZYWSSKMJJšœ—šœœ›šš˜š˜˜š—˜’��““���ŠŒ���’”’“‘’�Š‹‡‚ƒ„ˆ‰‰…†~€…‰‹ˆ‹Ž•”•”•–•–•“••““’”–––™™™˜˜™™˜•“—‘“”‘••–——œ›™˜—™˜™“•—”��ŒŠ‹ˆ�Œ�ŽŽ��‹ˆŒŠ‡‡‚†Š†‹‡ŠŠ�Ž������ŠŠ‹Š‰‡‰ˆˆˆ…ˆ‡�Š�‹ŒŽ‹‹Œ‰Š‹†ˆ…ˆ‰‰‰‰‰‡……ˆˆ„†††…„�€€�€‡†…‚‚‰�‹‹�Ž�†ƒ€}€�€††‰ˆ�Š‹‹Ž��‹‹‹‰‡ŒˆŠ‰ˆˆ‹Š‹Œ���ŒŠ�ŒŠŠ‰†‰…‹Š‹‹�Š���ŽŒŒŠ‹‹‰ˆˆˆˆ†ŠŠ‚t`LCC>>@@?<:>=:;==<:;==;>=:;:;898;99:::7;7<99?I`s|……ˆˆˆ‰ŠŒ‰‹ŠˆŠŠŠ‰Œ�Œ‹‹‰‹†{~€zpq}}€zqebbfcgked_`[WJGHVfnaRQQNGDDCABGCAGIKGKIKHFHHJSQWSVXVX`cijjmmpnhmqvvuy{wunjpstwplikeccb]TXY^YWVSPMKQOKLNKMJGIIHIKJLQKKHGIIIILIILKMMS[][QOUZ[Z]bc`_ZYQHGII•™—™™˜™œœšœœ™�˜–”‘’‘�‹ŒŒ���‘––••��Љ‡ƒ�ƒ…‡‹‹‹‚}€�„…‹Œ”•••—••—™˜˜——–““•’�–—”—––š—™™–š”˜›––••——•–š—˜˜˜šœ———ŽŒˆ‰ŠˆŒ‹ˆŒ‹‹Œ‹Š���‰‰‹‹‰Œ‡ŠŠ‰ˆ‡‰‹ŠŠ‹�ŒŒ�‰‹ŒˆˆŠˆ…ƒ‡„‡ˆŠ‰Œ‹‹‹‹�ŒŒ‰‹�Œ‰†„…€ƒ„„†ˆ†ˆ‰……‚„�„„†€€�ƒŠ‰Š�ŒŠŠ„ƒ†‡‚‚‚ƒƒ�ƒˆ††Š‰�‹Ž‹��ŒŒŽ‹‰ŠŠ‡‰ˆ…ŠŠ‰ŽŒ��‹‹ŽŠ‹‹Š‡‹ˆŠˆ‹‹‰‹Š‹Ž‰‹Š�ŒˆŒˆ…‡‚‚kWCAAC>??@=@>9;;>;;:9<9;=;=;9896<::79:7999;;BSm„€ƒ†ƒ†ˆ…ˆŠ‹‹��Œ��‡‡ˆ‡„†‚{y{}}~€€‚‡„{sqrkhfnoieceeYNPM[lnfWSPJF>C??BBBCDJNLILQNNIGINNXQUWZ]bgdghinprkiry~€‚…„€snhorsrnnjda`a_YY_[`a]VRQNLNKLLJJIFGGGGFHIJFFHGDGEEIIGIFIKKKQPJGNKMNTZ__]YQOHDDB–•—š—–˜™šš›žœ—›—•–—”’‘‘’’“•�‘�ˆƒ�}€€~†…ŠŽŽ‘�ˆ†‚†‡ŠŒ�Ž’“’’”’”—‘”––˜˜’”•—“’•”••—“–—˜—˜™›œ›™š˜—™˜”˜–˜•–˜˜—•“�‹‰‹‹ŠŒ‡ŒˆŠ‰‡ˆŠ‹‹‹‰ŒŽ�ŒŽŠŠ�‹†Š‡ˆ‡Š‰‡‰ŒŠ�‰�‰�ІˆŠˆ†…†……„„ˆ‰†ˆŒ‹���Š‹‹‹‡…„ˆ„†„‡Šˆ‡�|‚‚…ˆ‡‚……††ˆŠ‹Œ‹‰Š�‡†‹…�€~{~‚‡…Љ‰ŠŠˆ‹‹�ŽŽŽŒ‹‹‰‰ŠŠ‰ŠˆŠŠŠ�ˆŠŠŒ��ˆ‹�‹Šˆ‰‰ˆˆˆˆ‰‰ŒŒ‹�‹Œ‰Š…†€xaND=?B@=@;><;>9<>;>:=<<;;:9:;<999:9:998;8<>=AADIMRQRZ[[YRSPLNNRRRTW_fieifikqlmu|€„„†ƒ{sllppqsqmga``[\]_chjea[OMILKKGHGFEGDEDHHIGFDFCDFEGFCGDFFIEGGGDCCDFDGMPQQRMHHCCCš–•™˜˜™™™˜š™™™™›�šš›˜˜—›——˜•’†|rrsswz€ƒ…‰������ŠŽ‘���“•���‘�����‘‘“”“š•————–˜–••’“•“——–š™œ—™››™™˜˜”“–‘Ž‹�Žˆ‹Ž‹�‹Ž���‹‹Šˆ‡…ˆˆ…‰ŠŒŒŽŒŒŠ�Š���‡�‰ŠŠ†ˆˆ‰Š‰‰‹��ŠŠ�Ї†…†„Š‚‡†‰‡ŠˆŽŠ�ŒŒˆ‹‡‡Š‡………‡…}|€„‡ˆŒŠ…Š‹ŠŒ‰‰‹‹‰‡ˆ†Š‡ˆ�€|w„‹‹ŒŠŠ‰Šˆ‡‹†‹‹Œ‰ŠŠ����Š�ˆ‰Š‡‡†‡‰ŠŽ‹�ŠŒ‹‹�ˆŒ†‹‡„‡†‡‰�‰‰�‹‹‹Šˆ‚s^RGCAA?=<>;;;<><>>;;:;8;;9:999:::;95998=:=H^sƒ‡ˆˆˆˆŠˆ‡ˆ‹ˆ‹ˆ‹Œˆˆˆ‚€pcapzzwvswy~„‚}�}qb`^VVZ_eg_^\ais|wombZNFCBDDEIMQU`\\bhkf_]UQORQNRPRV]djh_dlolnquz|ƒ�†ˆ‚{ssstxzyqnkffdaccgiijh_UNMMGHHDEECFCCCDHLIHHFEDDADD@CDEFGDCICCAFABDAFFFIEEFCCFF™›–™š˜™•š˜›——™™š››œ™›™œ›™™™—ކ€yyyuy{|~ƒ…‰‹ŒŽŠ‡ŒŽ�Ž“‘”��’�Ž‹�Œ�ŒŽ’“•–“—••™—–š˜–““–——”–’”•–——™–››š—––‘Œ„ƒ…ˆ†‹‰†Œ‹�‹ŽŒ���Œˆ‰‰‡ˆˆŠŠŒ�ŽŠŽ�‹��Ž‘�‹‰ŠŒ‹‡ˆ‡ƒ‰‰†Š‰ŽŒ†�‹ˆ‹ŒŠ‡‡†„ˆ†††‹‹ˆŠŠŒ‹ˆ‰ˆ†�†‡‚†ƒƒ„…ˆˆ…ŒˆŒ����މ‹†ˆ…‡‡†„}~~€‚…†‹‹�ŠŒ‰‰‰†‰‰‡ˆˆŠŒ��Œ��‹‹‰Šˆˆˆˆ‹‰ŠŠŠ‰Š‹‰Š‰�Œ�‰ˆˆ‹Š„†ŠŒ†‰‰ˆˆ…„ueZQJDCC@;>==;<=>;<=99<9;<:8<9:;;79;;8;:==<=;<<::>99>88:9:87==9=ENaw~‚�„‚…ˆˆŠŠŠ�����Љ„|k]WU]m|„†‡…‡„‡…„vkgfggcYYSWWYckne\Y]eow{}{rnkidgiiqtvpg^_c^Y^bdabnfa[XTRT^`dglpjdckmv{}……ˆ…�}z~�…‰…‡�…„„�{tkfYXVVXPLMIJHHFGFEHCGFGENQS]^aZQJKKOKMHHBDACGDGHEGIKHGHHIOOQPKD—•™™™šš–ššžš˜›Ÿ�›› ˜—™˜—“——–’����‘��Ž���”�’�ŒŠ‹�††ˆ‰ˆŽŒŽ‘��““”•˜“––‘••’�”‘’’––˜˜š™™—›˜š™™™”••—“Ž�Šƒ…„ˆˆ��ŽŽŽŽ���ŠŠ‹‰ˆŒˆŒˆŽ�ˆ‹ŒŽ��Ž‹�‘‡‡ˆ‰Šˆ�ŒŒŠŠ‹ŽŒ‹Œ‰�‰‡ˆ‹ˆˆˆ‡Šˆ‰‹‹‰‰Œ‹ŒŒ‰…ˆ…ˆ††ƒ…‡‡‰Š‰Š‰‰ŠŠŠˆ†„„„‰†‡‹ŠŠ‹�…ŠŠŽŒ‹‹‹‡€}y|~„ƒ…„ŠŒŒŽ�ŒŒ‰�ŠŠ‹‹‡‡�‰‹‡Š‹ŠŠŠŒ�Š�‰Š‰‡‡‰†ŒŠŒŒŒ���ŠŒ‰†‹‡ˆ……Š‹‹…~tga\^VUNG>?;><9?<;@:;:<:;;::99;89;:;;ABS_t†‚‚‚ˆ†‚ˆ‰‹ˆ�Ž�ŒŽ‹Œˆ�xmghip~‡ŠŠŠ‹‹Ž……pdgmswpiecYQRV_gcXUT]fpw}‚z{wopnquxzteWXVTPQY[^lijj^_ZYZZbckmrgaachty�‰�Šˆ‡…�…„ŒŠŠ‰‹Œ‹‹†�|ti\ZSRPMMGJGHGEGGIBJLDGIEOQYfim^VPVY^ZOHFHBCEGKPOUY\ZVXZ][_b_UI˜’™›–™š˜˜˜˜šœšžœ ›�œž———–˜•—’Œ����‘ŽŽ””�’’�“�‘‘���‘�����’‘�‘�“““”˜—•–—–––™—™––”™–”–˜˜–œ››šš˜™—“�Š�„‡†‡ŽŒŒ�Ž�Ž’Œ�ŽŽ‰Œ‡‹‰ˆˆŠŠŒŒ�Ž‘Ž���Œ�Œ‰‰‡‹‡ˆˆ…†ˆˆˆ‹Ž‹�‰ŒŒ‹ŒŠˆ‰‡‰‡Œ†‹ˆŠŠ‰‰Š‹‰‰ˆˆƒ��„„‡‡†ˆˆŒ‰‰ˆˆŠ‰†Š‰‰Œƒˆ‰……ˆŠ‹Œ�‹‹‰‹†„€€ƒ€}~~„…‰ŠŠ‹‹ŽŽŒŽ���‰Š‹‡ˆˆ‡ŠˆŒ‹Š���‹��Œ�Љ‰Š‡‹‹�ˆˆ‹‡Š‰ŠŠ†ˆ‹��Š…{pdebc_KC;:8=;:=9@:?9>:;;;=;8=6><:=:9:;;9;;::DMS]q€…‡†‰Œ‹‹‰Š‰‡ˆŠŠ‹Œˆ‹‰‡ˆ„…ƒ…ˆˆ�ˆ‡…‡…xnljlpqe]X[TLJHBLNPMFBDK]cnwx|tfdibgjrruh^YUYWOPKPVZURVRNRURPXakqrmnmjhr|„‡ˆƒ~�„Š‹Ž‹ŠŠ�‹…„~|ulff]]VPNKKJJIJMGHHGDCIDDCEBGIRXTSTSYYSQPNKJFMQV_bmwx€zvux{|~xdP–—˜˜šššš—›š–˜™�™›œ™œš•™—™–˜•—”’’’�‰’’’’““‘–��‘‘�Ž�‘’’””‘—˜–š–™–•–””•Ž�’”–™˜™›˜˜›™›š˜˜™˜––—”’“Œ†…ŽŠŽ�Ž�����ŠŠŠŒ�‹��ŽˆŒ�Œ��‘��‹ŠˆŒŠ‰Š‹�ŒŽ�ŽŒŒŒŒŽ‹�ŠŠ†‰…ƒˆ‡‡ŠŠ‡Š�‹�Œ�‰�‹�…†‚ˆ‚ƒ„‚ƒ„…‚„†‰‰‰‹‰…ˆ„…†ƒƒ††‹‰�‡ŠŒŒŽŠ‰‹ŠŒ‡ˆŠ‡‹†ˆ…‡…‡ƒ�~€‡‹ŒŒ‰‰‰ˆ‡ŠˆŠ‹‹Œ���‹�‰‹‰Š†‡„‡ˆ†Œ�ŠŠ�Œ�Š‹ŒŒŠˆˆˆ‡„‡ˆ„ŠŒ‘•�‹‡~uf\NA>@=>=>>=<9=<;;<8:;89<;6;=;:9>?JMS^n{ƒ…‚……ˆ‹ŒŒ‹�ŒŒ‰Š‰‡ƒ‡‰…†‡…‰Œ��Š„yiYX\_a_bZUQQSLOIJKGNGD@=;?=:==9=@::8>;>98;<8;=8:<<<;;<<=<<<::9;9:<8:;7<;BIOLQ]o�„‡…††‡‹‡Š‡‰ŒŒ��Œˆ�ŒŠ‹‹‰‡ˆ„zun_RWWR[_ilqsnd`beghif_VIFFBCC?@A@MMUNRS[]][fornd_fh`[URRMLNJKFCADBDBECGLWdioqz€~{{~�‡‡‡ˆˆ‚{{{{}��{sgdcfe^Z_[\\[RSNOOQJJIFFJGLHIJGGDDGFFGGKMRQQKIKP[ix€tdZRGHGF—˜›•šš™˜šš™˜˜�œš—˜”•‘”••™••—��Š‹‹‘’’���‘•“—–”—˜———•—“’”–”�“””““”�“��“••—’”˜––—–���”–”˜’�ˆ†…ƒˆ‡�‹‹‰ŠŠ‹ˆŒ‰ŒŒ��ŽŽ‘���ŽŠ‹‹ˆ‰‰ˆ‰Œ‰‰ˆŠŠŠ‡‹Œ�‹‹ˆ…‹…‡ˆ‡‰†Š‰‹ˆ‰ŠŒ‹ŠŒ�‹ŠŠŠˆŠ†‡†‡†ƒ†ƒƒ„�ƒ‡„ˆ‚‡‡„‚††�ƒˆ„‹ˆˆ‡‰ˆˆˆˆŠ�‰‰‰‡ˆ‡Š‰Š�‹Œ‰‡ƒ€~€„„„„‚†„‰ŠŠŠŠŒŒŒŠŠŒ�Š‹†Š‹ˆŠ†‹ˆ…‹Œ‰�‹’��ŒŒŒˆ‹‰…‰ˆ‡‰ˆˆ‹‹Œ‰ˆ‰���Œ‡„v\B=@>;>><=<:9=><899<;;;:;99=9>ELNPP\p{†‡‹Šˆ‰‹‡‰‡‰‹ˆ‰Š�ˆ‹‹Ž�Ž�‹…{rli`\^_bfnu|€|wuqvuywwqaQLPJGFECDLO[abY^^[]]cmvqmknqng`VUQSSNIFC?FDDAC?BDIPST_lv}‚„ƒ„…‚†‡‡‡‡†‚�€€ƒ‚†„{uuvwskhfic`[URPOQVVRKLQQNOSVPMHEHKFJGFGLNKOKGFHKUbktn^QOCEBA—˜™š˜™š™—Ÿ—››œ—š““”‘�’—”–—”’“““‘“‘•–’�“’�‘—•‘’’”••’••““•“”“��‘‘Ž‘ŒŠŒ�“”––•–˜š––�ŠŒ“”�‘‘ƒƒ{|……‹Œ����Œ�Š�Š‹ŒˆˆŠ��ŠŠ�‹‹�‘‹‹�‰ŒŒ‹‰‡�„‡‹‡††‹ˆˆ‹‰‰‹Š‰��Љ‚‡‡‡Šˆ‹ˆ‰�ŒŒ‹Œ‹ŠŠŠ‡†ƒx{z|~†……‡‰‡‰ƒ†…‡††„ƒ†…‚„ˆ‡Š‹ˆ‹ŒˆŒ‹‰‹‰‹‡‡‰Š‡†‡ƒ…�„†‡†‡‚~„ˆ‰‰…‡‰‰‰‹ˆŠ�Ž�Œ�ŒŒ‡‰‰‰†„‡‰‰‹‹Œ��‹����ЉЅƒ…ˆ‡‡ˆˆ…ˆ�‘”Œˆ‚hGB=??<>>=;;;79??>=;;:<8:=;;<:8<:CKRTNQ[m|„„ˆ‡‡ŠŒ�‹‰‰‰†ˆ‰‰‡‰‰‹Ž�Œ‹ˆ€wwrilpqx||…‡…ˆƒ„ƒ�…€�ƒpYUSTNJGOORZjsniebaY]ekpouuu{|sgXYVWXSGDEAEEB@CBBDAFGHI[ev}„†‡…†‡…‰‰Š‰Š‰††„†…„„~€‚‚€{ywsqjd]YUVZ\YVSTWUVX``ZSHFLJJLKKJIKJMGIEIHHPW_aZMHHDEC–˜šššŸœœœ›–��ššš––�ˆ…�Ž““Ž‘‘�”•“—š•—”–“–�”•“’””�‘’•“”‘“–‘“����‘‘’‘Ž‘‘��’’••™–—–Œ€…��Ž�‰‚z€„†‰‡‹Œ�Œ�ŽŽŒ�ŒŒ‹ˆ‹‹‰ˆˆˆ‹ŒŒ‹���‘‹ŠŒ‹‡Š††ƒ‰…ˆ†‡ˆŠŠ‹Ž‹ŒŒŒŒˆŠˆ‰‡ˆˆ‡‡‡‰‡†�‡‹‹Šˆ…ƒyvvx{{�‚……†ˆ……†ƒˆˆ‡‡„ˆ†�€…††‡‰ˆ‰‰Š‹�Œ�ŠŽŒŠŠ††ˆ…„…††††‚z}ƒˆ‰ŠŒ‰‰…‹†Š‡‰ŠŠ‹‹‰�Œ‹�Їˆ‡‰…‰‡�ˆ‹‹�Œ���ŒŠŠ‰……Šˆ„†…‰ŒŽ�މsMA?@=>>=9<==;:;;<:;9;;:;8;99<77>?IQRTPPXh{‚‡‰…‰†��Œ�ŒŒ�ŽˆŒŒ‡‡‰‹‹ŒŒ‹ˆ…†��{~�„‚ƒ„‹‰Œ‹…‡ŒŒŠ‹Š‰„yb[\]YPQY]Z_jmmihe\Z^elrtuy{|~yfVSTTTTIGBGEHBE@>B@AGHINP]iu~��}~}…‰�Š‹‹Œ‰…†„……‰ƒ†„‚{|rokja^``___ab```ejhZQMLPMJKLLJJKJKGHHIIILOQQIHHGDGš”–š™—�šœ�œžš›š™˜‘Š…‚ˆŠ��Œ‰‹Ž“’‘•”š˜—™—–š˜—•—•—•”™•—’’“”’’���•‘•••–•”‘’”“•’•”‘’�v}ˆ�މ†ƒ‚€‚„‡ˆ‰ˆ……†Š‰��‹��Œ�‹��ŒŠŠ…‹ŠŠ‰ŠŒŒŒŽŒŒ��‹Š�‹‰‰‰…‡…‡†‰Š‹ŒŽ‹‹�����Œ‰ˆ‡ƒ…€€…„‡ˆ‡……|wz|€€€ƒ‚†�ƒƒƒ‚ƒ‡††‡‡‡‰†‡†…‡‡ƒ…‚Œ‡‰ŽŒ���ŽŽŠŠŠˆ‡……„€�{vz‚„‹Š‹ŒŒŒŠ�ˆŠˆ‹ˆ‰‡ˆŠ‡Žˆ‹�‹Š��‰‹‹ˆ‰ˆŠŠŠŠˆ�‹‹ˆ‹�‡ŠŠ†…„���ŠzVB>B@=>?;>>:<=;::::;<;:9:<99:>:;=BKORRSN\m}ˆŠ†ˆˆˆ�ˆŠŠ‰‹Œ�Œ��ŒŒ‰‰�‹Œ‰‹‰‹‡…‡ƒ‡Š‹Œ‹Š‰‹‰Š‰Œ�ŠŒ‰ˆŠ{k`ji___ac`[[__^^Z\WYanuvuuuwzt]OJJMSNJGEDGHJHEEDFFKPRZY]gq{~zwusrru{‡‹Ž��ŽŒ‹ŠŒˆ‰Š…„„‰‚‚ƒ€yuyoonjjijnknmiknqgVPRXUQURSLNKLIKMKNMQPJNLJJHKKH–––š˜››—›šš�ššš›•‰„…ˆŒŒ�‰‡‡�”“‘�•–˜š––™—”˜•”–™•˜š–™™–˜š’•“”‘‘–‘––”“—–•——’˜™“”’Š|vy€…ˆ„‚�„‚‰‰‹ˆ�‹„ˆ‹Š…ˆ‰ŠŠ‹‹�ŽŽŽ���Š‹ŠˆˆŒ‰Œ‹‰‹Š‹‹‹�‹ŒŒŒŒˆ‹ˆˆ…‡ˆˆŒ‰ˆŠŠŽŒ�ŽŽŒŒŠ…‚€€ƒ„„…ƒ„…€}‚‚„††††ƒ€ƒ‚‚ƒ‚†„††ˆ†ŠŠˆ‡…„…‡Š‡Š‹‹������Œ�‰‡……€~utw}ƒ‰‰Š‰Ž‹Ž�Š‹ŒŠ‹ˆŠ‰Š„ˆ‰‰Š‹����‹ŒŠ�‹ˆˆ‹Œ‡‰ˆ‰‰‰‹‹ˆ�Љ‰Œ�‹‚`B?A?@@=>@:?=;9;=;<;9::::9;;;9;9:?GQROQPOZjЉЋ‹‹ŠŠŠ‰‹‹ˆ�ŽŒ‹��Œ����ŠŒ‰†‡Š…‡†ŽŠŒ�Š���ŒŠ‹‰‰‰ˆˆˆ|qrwohj`][VWSPTMKOSSQWemmjilspcPGDCFGCFFCFFGKKMQOPU[[diielpz}|zvysnou€…‹Š����ŠŠŠŽŽ‰‰‰‰†‰„…ƒ‚�€}yvvu{|z}yuzwynbZ]bc^`a]ZRRPPVVUTZWZTTOLJQSPL™™–š—™™•˜™œ•–••“�……‰‹Œ‹‹‹Œ�“˜”——”˜˜—––—Ž��‘‹•‘•—š�›šš–›˜˜˜—“–”’��’‘•‘••”——–•“�ˆxuw|‚||„††ŠŒ�Œ��ŒŒˆŠŒ‰‡…ƒ‹‹�Š��ŠŽ�Ž‹Ž���‹‹Š††‡‰‡Š�Š‹‰�ŽŠŽ�����Šˆ‹Š‰Š‹ŽŽ‹�‰ŠŒ‡†‡‰�††�‚€‚‚}}~€„…††ˆˆ‰ˆŠ…€‚ƒ€�„„„„„†ˆŒ‰‡ˆ‰‰Œ‡ŒŒŠˆŠ‹Œ†���ŽŠŠ‡ˆƒ|{vz€‚€…ˆ†ˆ‹‹‹‹�ŒŠŒŽŠŠŒ‰‰‰‰†Š‹ŠŠ‹�Š‹��Œ‡ŒŒ‡‰‰ˆ‡„ˆˆ‰Š‹‰Š�’�qJ;A?>=>????:>=>;==<9;<;<::::=7:=;8:==8<::;==<<>;9>9<9::?IPUXVRWTPWhy‡ˆŒ†‰Šˆ‰Š��Ž����‹Š‹Œ‡‹ˆ‹ŒŠŒŠ�‹‹��‹’Š‹ŒŠ‹ˆ„€|{ƒ}€}rgYTOLMJGHJHJJGMQQQNIHBBEFLLJIMJIHDFJIFHGHJIMKPUV_giqo{}�„„�„†ƒ†ˆ‰‡‡„‰†Ž‰ˆ‹‹‹ŽŒŒŒ‹‡ˆ†‹‹‰ˆ‹��‹ŠŽŠŠŠŠ‘‹Œ�‹‡Šƒ„‰„…€‡†‡ƒˆ„�xxu|€�‚~xxtnb]RQNNNI––˜˜™š™™š�˜™—š•“–””˜–”˜˜–—”˜—™˜˜˜——™—˜˜—˜––——–™–˜˜——•••’��‘”•––——–“–��…w}|{{}€|xv|…ƒˆˆŒŒ‹��Ї‡‰‡‡Š‰ŠŒŒŒŒŽ�ŽŽŒ��ŽŒ‰ˆ‰�Œ��Š�‹�Š„‰„ˆ‹Œ‰Œ‰…‡ŠŠ‹‰‰‹�Œ�����ŽŽŒŠ‰Š…‚„ƒƒ†�…†„„‡‹‡†‹ˆ††ƒ„ƒ„…„‚„…‚…ƒ…ƒƒ„‚ƒ‚‚„�ƒƒ…ˆ‰ŠŒŒ������Š��Œƒ��||€ƒ„†„‡Š‰‹‰‰‰†ˆ‡‰‡†ŠŒ‰‹ŽŠˆ��Š‹�ЉˆŽ‡ˆŠ‡Œ‡�‰��ŒŠ‰‹ˆˆ„‰‹~R@=B?@?;?===@;:98;::;<<;:?:<99=9AEOVQTRVSQKVf}ˆŒŠŠŠ†ˆ†ŠŠˆ‹‹�Ž�Œ���ŒŒŒŒ…ŠˆŒŠ�����’‘�ŠŒ‡zk]\_fcaeb[TRPLNNJLLIOGGHOQOQLKHFHIHIHHHKKGHGLLIPPU[W[[^\[XW]cdkpuz€‡†‰‡†Š‰Š‰‰‰ˆŽŽ‹Œ‹��ŽŒŒŠŠ‡‹‰‹ˆ†ˆŒŒŽŽ�Ž�Œ�‘‹‘�‹ˆ‚‚€ƒ†��ŠŒ���‹Šˆ…ƒ€ƒ…Œ†‰�~xqh_ULMGKG—š—™™šš™˜š˜š˜–›—•”–˜›™››—š˜š—˜•š›—•˜••––“—•™™–•š—››˜™˜••Ž’““—‘•‘�މ‰„„€‚‚†ˆ††ˆ„‚‚{x|€ƒƒ‡ˆ‹‹�‹��ŽŠ‹ŽŠ‰‰‰†Š‡„ˆŒŒ����Ž��Œ��މ‡ˆ…‰…}|tz‚ˆ�‹Œ‹ŒŠ‡Œ‡Šˆ…ŠŠŒ�‰Š‹����ŠŠˆƒ…‡†�„…‚ƒ…‡ˆ‰‰…І‰†ˆ†ˆ†ƒ€„��ƒ€~�„�‚ƒ†…†‰„ˆˆ‰‰ˆŠ‹Œˆ‹Œ���‹�ˆ……†„†‚€€€}‚‚ƒ†‰ˆ‰…‰Š‰‹‡Œ‡‰‹‰‰ŠŠŠŠ��‰��Šˆ‹‰‰ˆ††‹‡‰ˆŠŠ‰‰‰ˆˆŠnF>@B@>:<<<<:<;=:=::=>:<89<::;;;>DPVTVSURUPOTd{ˆ‹�ŒŒ‹ˆŒ‰Œˆˆ‡‹‰�‰‹ŒŽ�������‹‰�ŒŒ‹‹���І|bQLMNIIIONLQOPNNLHJNPKJJJNLNKIJGFKHKGEBFHLHIHIEJKVbfiinkmiea_aijkqw}€‡‰‰�ŒŒ‰�‹‡‡�‹‹ŠŠŽŠŽ‹ŽŽŠ�Œ‹ˆ‡ŠŠŠŠŠŠ���Œ‘�‘��Œˆ�|}��†ˆ‰ŒŒ‹��‰Š‡†‹‰ˆ‹‰Œ‡|tno_YRNLKK˜–—œ››™šš››™œ——’“•™–™–›šœš›™™——˜–�—”˜™–™”——˜”“—–”›œ˜™˜”“——••”“�‰†}||}…ˆ‰��‹‹Š‰‹†�~�‚ƒ„ˆ‡‰‰‹�‹���Œ‹��‹‹‰‚ƒ„†‹ˆŒŒ��‹�ŠŒ���†‡ˆ„~oc^hx‚†Š�ˆ‡�ŒŒŠ�މЋ‡††‡ŠˆˆŒ‹‹‹ˆˆˆ‹†„‡††„…‡ƒ‡†‚‡……‡Š‡‡†……ƒ†��~~{}ƒ}„…†‰ˆ†Ž‹�ŠŠ†Œˆ‹ŠŠ�Œ��‹‹‰ŒŒˆ‡„‚z||}�~€ƒ…„„†‰ˆŠŠ‹‹ŒŠŒˆ‹„Љ‡‹‰ˆ‹‹Š�Œ‰Š‰ŠˆŠˆ†‰ˆ‰‡ˆ†ˆZ@;>B=?>==><<;=<::;>=:><9==<<9;<<:;<:@;:;=?9;::=;9:==?HSXVSUUVYVQNVcw‡…†„†ˆ‰‰‘‹Œ‘ŒŽ�‹Œ‹‰‰Œ�‹ŠŠŒ��Œ‘�Ž�Ї„…sgc[VRKLOLLPWWVUMLJNOSSUQKPMRPPJJGHDFIJKFKNIHIHJIEBGLQUVSOTdmsnsz�€‚€}wz€‚‡ˆŠŠˆ‚}|„…‚€ƒ„ˆ„†‰‹‹‹ŒŽ�Ž��ŽŒŽŽŽ�ŠŽ‹���Ž��‡‚ƒ†}|xuy}‚€ytsu�ˆ„€€~xh^`flgbc_c`–—–—™™™š›˜››�›�›šš››™–˜–””’“�–”“˜—š•šš™ž˜–˜•———””“––•“‘’�Ž�ˆ€x{zz~ƒ�ƒ‚‚ˆ„�„„„……†�‚‚ƒˆŠ‹‹†ˆ‚†‡‡ˆ‡‡‹‰Œ‹ˆŠ‰ŠŠ‰��‰Š‹ˆŠ†‡ˆŠ‰‡…‚€n`WQMMWZfq~‚…„……ˆ‡�Œ‰Œ‰‰‰‡†‚ƒƒ…ƒ‚|�ƒ†‰ˆˆ‡„„…„ƒ‚‚ƒ�„ƒƒƒƒ‚‚ƒƒ~„�€€�}}‚�……††‰…‹Š‹Š‹Š‹�Š�Š�ˆŒ‡†Š…‹ˆ‰Š…ƒ„‚‚…„„�‚}€„�ˆ†‰Š‹�Œ�‰Œ‰††‰Šˆ„ˆˆˆ‰‹Š�Љ‹Œ‹‹‰ˆˆ|^@?C@>@=B>;><>;=;=;<:::;;:<;9=<@FRUUPSVVSRRQPQdv‚†‡ƒ†‡„‡ŒŠŒ‹‹‰���‹ŒŠŠŒŒŠ‰Œ‹��ŽŠŠŠ…Ї„uupke^YUZYZ`fjgZOOQTYae`SLQOPPKLMHJEGJGKILOJJGOIHGEABDIGEBEO]gjs{€„…ˆ„~€‚ˆ„…zsswurwx~€ƒ„…Œ‰‰ˆ‹�ŽŽ��ŽŽ�‘�Ž��ŽŽ�Ž�‰……„ƒ{qmmgjmnhe]bpqnikeeaYOQY_efgmpn™—•—™—š™™™šœ˜œœš››š›ššš˜—–”“•—”‘•˜•–˜—™˜”˜•—–“—––—–•‘”��‡}~xsuv{|€ƒ„……ˆ†ˆ…ˆ‡……‚€€|~�ŠŠŠˆ‹ˆ‡ˆŠŒ‰Š‰‰‰‡„„‡‡Š‹‹�Ž�‹‹Š���‰‡ˆ…�yo^ZZVSRUbhu€‚…‡ˆ…ˆ‡Š€„„„‡…„‚€‚��‚€ƒ€‚‚‡ƒ€�‚„��€„„ƒƒ†ˆ„„††€€~~}|x||�‚€„…†…‰††††ˆ‰††ŠŒ‰‹‰�‰��ŽŠŒŒ‡‰‹ƒ„„ˆƒ…ƒ…„……„„€‚||~�‚‚‡‰Š†�‰‰Š‹‹‹Š‡‰‰Š††Š‰†ˆŠˆ‹�ŽŠŠ†sR>AA?B>?>;;;>;<CCECBAAJW\ervv|€€„„€‚……‡…zvsqpopw|�…†‹ŠŒŽ‹�‹‹‹‹Š‹��‘�’Ž���Ž��‡„ƒ{pmbb[XV]ZSVQ[^\VTUTOLLGHRUZ^dnp—˜™™™›šš››œš˜�›š—›™››œš˜˜–™–š—”˜™—™•™——“••–“••˜•˜—•�Ї†‚{zzzy{|}…„†ˆˆ‰���ŒŠ‹…„�}€‚‚†ŠˆŠˆŠŒ‰ŠŠ‰Ž�‰ŠŠ‰‰ˆ†‰‡‹�ŒŒŒ‡‹��‹ŠˆŠ†ƒ{vlmihd``quz‚ƒ‡‡‹…ˆ‡ˆƒƒ�€€|€€„‚…„……ˆ†‰‡…~‚~�~€‚~„…�„�‡…ƒ…‚‚€€{xwz�„‚€‚…ˆ‡‰‡Š‡‡‰‰Šƒˆ‡‰††Š�‰ŠŒ�ŒŠ�‹‹‹‡‡†„ƒ„„‡…†‰ƒ…ƒ}}{{€ƒƒ„…„ˆ‡‡‰ŠŒ‰�‹‹‰ŒŒŠˆŠ…†‹…Љ‰ˆˆˆ‚nG>>CA=B>:?<<8<<;=::;::;8:;<<9@BCC<>?==:=::<<:=8<=;::;<;A@@B=>===@9><;;9=;;;;>:=;=DKPUSQRRUTQVSTTVTS\p�…‡‡…ˆŠˆ‹‹‹Ž‹‰‰��Œ‰‰�‰‰‹�Œˆ†}‚‡…‚|~€ƒ€‚‚l][VPVSSXcmxvtssvkZVRTWTOKOIKJLJGHGKLIHPQVONKQWUU\aYB?A?A?@>><>8<>;:;;==;;::<=BLSSVSRWVTSRRVSTQPOXp�ŠŒ‰ˆ††ˆŠ‰‹�‹‹�ŒŽŽ�‹�‹Œ��ˆ„vekrolntyywzmXMSRQINQRVbowz{{xpgZ\_[TONHMLJNIFHCLNJJJNOLLGQTUW[bWLAAB?C@>A?ADGKTVZ`eeknw|����…‚}‚~ˆ†ˆ‰‰‰‰ˆ‹Œ‹Œ�������‰ˆ||€{sh_WVRPKIJJHJYfmutolrvqcUNKDEGEBBEC–˜˜˜—œ˜™›–›œš˜˜˜™š™–š›˜œšžš™™›˜š“•‘‘‘‰‡Œ�”––”��‰ˆ†††„€~|zxx{wtvz{|‚€‚…„…‚�„ˆ…†ƒ�„‚�…ƒƒ‰†‰Š‹Œ‰Š�ŒŽŠŠ†‡Š‡‹Š‰ŠŠ�‹ŒŒŽŽ‹‹‰‡Œ‡‰ˆˆ†Š‡‡ƒ‡‡†ˆŠŠ†Š‡‰‰Š‡ˆŠ†††ˆŠ‹ˆ‡Ž‰Œˆ‡…„„{€|€‚~€…‚€}~~€~yz|w|z€…‡†‰ŠŠ†‹‰†„…‡ƒ†„‰‡‹‹���ŽŽ‹�‹ŒŠ‹Œ‡‡‡Š‰Šˆ†‹‡ˆ……†…~|€}„�{z~‚…„…‡‡ˆ‹Ž†‰‰‹ŠŠ‡†‡ˆ‡‡‡ˆ‰Šˆ‡‡yU@>?@@:>?<><=9=;=;;=;8<<9;=CKRTTSVSUWURVTWSVRRNYj‚‡‹ˆ‹Š‰‰‡Š‰Šˆ‡‹‡�‹Œ�Ž���ŒŒ€o]^ehglopnwtcSTZ_\STRVX_quz{zsj_XWYYRIIMLLJGHIGLJHKLGGIJJCGNUPQVXOF@D@@A=>@BEGJLRTVUZVX]ajlssx|whjjnpy€…‹Œˆˆˆ†�ˆŠŠŠ�ŽŽŽ�Œ‰‡‡‡‡€tc^YXTLHKKGLP]gs|~yrvyzte]OIBCEDBBB™™›š˜œ˜š˜šš››š–—œ–—–š�œ››�šŸšššœ˜•–””’��’�“��Šƒ‡„…†…ƒƒ‚�~~€|z{zvwuw~~|…†……ˆˆ†Š‡‡……‚…€€�†�ˆ†ˆ†‰ˆ�Œ�”ŠŽ‡�‰ˆ‰Œˆ‰‡‡‰ŒŽŠ��ŽŒŠ�Š�‰‰ˆ……�…�‡‡‰Š…‹†ŠŒ‰ŒŠŠ‡�‡‡‰†Š‚ŠŠ…ˆ‡Š†…‡�„‚ƒ�‚‚~{~�~~{‚|€�„}|||{{‚„„„„ƒ…‰„…ˆ…†Š‡ˆ‡ŒŠŠŠŠŠ‰Œ��‰Š‰‰ŠŒ�ŠŠ�ˆ�†‡‡†‚ƒƒ‚‚�‚…€~}��‚‚…†…‡‰‡Š‹ŠŠŠŒŠ‡…ˆ…††††‡„xQC=@==>B;?:?>;<9=;;;=9:;;?ELTTSRSTTRWWRUXTUYUPRYj}„‰‡ŠŠ‰ŠŒŠ�ŠˆŠˆˆ‰ŒŠŠŽ�‹�‹�‡zjfmtvuvotqmYPWdmeb[]^_bhrvqrg`ZQUSQPLIKIMHJJHJJJJHEEDJJHCFKUSPPRPJ@AAA>>>DFGNLKHMROJGEJLOVY`nphWZZYZbkw…„‚‚‰ˆ‡ŠŒŠ‰‰�ˆŒ�‹ŒŒ�‹‰zi`_]UNLGKLNQ^gruyuopu|wkZGDBCBBCD˜–˜˜˜˜››››š™›�›™››˜˜šš–˜›™š˜˜™œš——˜›—••‘’’�‹ˆ…‚„ƒ‚ƒ€~}€|}||z{{x{z}�„‚ƒ‡†ˆˆŠ‰„‚……€�„�„ƒ„…�„‰‰Œ����ЉŒ�Œ�‡Š†ˆ†‡‰ŠŠŽŒ‹‹ŒŒ‹ŠˆŠ‰‰††…†…‡ˆˆˆŠŒŠŽ‹‹ŠŠŽˆŠ‹‰Š…‰‡‡†‰ˆ†ƒ†ƒ�‚�‡}~€~€}|{{|}€{�„‚€}……ˆƒƒ„‚†„ˆƒ…ƒ†Š‡�ŽŒŒ‹Œ�‹Šˆˆˆ‰„†‡�Œ���ŒŒ�‹†††�…€„€}ƒ€€�~~€ƒˆƒ~�€�‡�†…†…‰‹‰‰Š‰‰Š††‡‡†‡…‡tRA>@@B=@>=BBAAEIQXRRNMMMMGCDDAEHN\[WPOOTMRVemttox‚†ˆ‡‹�ŠŠŒŒŠ‹ŠŒŽŽ�ˆ€se`a[PLNPOQUX[]ca^`[crv}tfSJ?ABAFC–—š–—™›–™š—žšžž››ž�›››šš™›—™—˜˜šš——˜•˜––���‘‹‡‰†…ƒ‚|z{yzyyzzwz|z~}€‚ƒ„‚„‚ƒ„€„†„��ƒ~€~�ƒ�…†Š‰‡‡‹‹‡‰Œ�‰Š‹�‰Ž‹Š‹��ŒŒŠ‹‰‹‡‰…І‰ŠŠ‡‹‹‡‡ˆˆŒ‹‹‰�‰‡††Š‹ˆˆŠŠ‹�‹‹Š‹ˆ‰‰†ƒ‡„„ƒ��}€€~�€€}}}w{}|}||ƒˆ†ˆ‰†ˆ‡………‡„…ˆ�‰Œ‹ŒŽŽ‹ŒŽ‹‹Šˆ‰‰ˆ‹†ŠŽˆŠˆŠŠ‰‡‰†‰‡„„|z}�€€|‚††€�~ƒ‰†„ƒ�………‰†‹‰‡‹†‰‰Šˆ‹‡‰†rRA<@@?AB?<>==9??:=;:<<>@A>?AA=;;9=>=;;;;;>AJPWY]YZZZ[ZZVWUZWVXVVTQRLbv…�…ˆ††ˆ……‰ˆŠŠ‹��ŽŽ’‘�‰Œ‰Šˆ…ƒzkbhn]U\h_RHEIOYdhv{ussx{€€tbY]de^]Y\]TUSXVTSLLLGHLIJMIGKRY`]X[TIDGCECFHRclsmkccg`RLE@BDCECDGEEILPLOY`b^[arz‰‰ŒŠŠ‹����Ž�’ŽŒ…{od\TSRUVUTNNOONUQRSHGLUWXUTNKHCEFššš˜˜˜››˜šš™—™š›››™�œœššž��™››˜œ–™•‘‘�‹�‰‹‹‰ŠŒ‰�ˆ†…„€ƒƒ…|zzwruxuvx{x}{~€{||w{€|€}||�„†ŠŠ���‹ŒŒ‹‹Š‡ƒ‡…†‰…‡Š‹Œ‹‹�‹ŒŽŠ‰‰‡‰„†ƒ…†„†ƒ†ˆ‰ˆŠŠŒ‹ŠŠ‰Œ‰…ˆˆ†‡ˆ…‡ˆ‡�ˆŠ‡†ˆ†�|}}��}~|~{}��ƒ„‚~~€}}y~€€„„ˆˆˆŠ‰ˆŠˆ‰‹ˆ‡ˆ„‰†ŒŠ�ŒŒŽ�ŽŒ‘Œ‹Œ‰‰Šƒ…„…‡‡†††�„„ƒ�„‚ƒƒ�|~ƒ„‚„‡†ŠŒ‰‹Š�І‡ˆƒ‡‡ˆ‡Š†rO>@C@A=B?@=<<>>8><>:>EPWWZZZZZ[ZYWYX]Z[YZWYTURLM]t†…ˆ…ˆŒˆ‡ˆˆˆŠ‡‰‰��Œ‹�‹�����‰‚o]UR]_SRUZVOIHLOVairvumms‚€ƒvc]^eidaaYXVTTXYTMOIMMKLMOKKHGKNNQTXYOMKFIKFLT_intoihnk[LFEEFEFDADCCJHJGKPVZ[[al|†ˆ‡Š‡‡Œ�ˆ���‘�‹„|maXUWSVVUQMKLOU[bf\OJFKEKKRRJIGGD–š˜˜šœ™›˜ž™œ™˜�›™›–™›˜™œ�›œ™Ÿ››˜š™™‘‘ŠŽ‰��‡‰‡‡‡††…ƒƒ€‚|{|vwvuuyvvwx|y}�|z{yy€‚„ˆƒ€„…„…„Ї‰‹ŒŠŠŒŽŒ�ˆŠˆ‡‡Š……‡‡ŠˆŠ‰‹ŠˆŒŒ�Š‰Šˆ…ƒ……ƒƒ�‡„…‡Š‰ˆˆ‰Œ‰‹Œˆ‡Šƒ„†‡…ˆ‰†�„‚„†��€€‚‚‚}{{z|~„~{}}‚‚�~€€‚~ƒƒ…‡‡„…†ˆ‰‰‰Šˆ‰ŒˆŠ‡‰ˆˆŠ‡ŠŠŒŠ�ŠŽŠŠ‰†‡‰‡…ƒƒ~~|‚~„…‡ƒ€„…€‚€€€„„…‡‡�‰‰��ˆˆ‹ˆ‡Š„ˆ…†„kK>A?A?@B>:;=;@9=9=:=GRWY[[[[YYXWVYVXTVY\XZUWWUOL^r‚‚‚…ˆˆ†ˆŠ‹ŽŠŒŠ‰�ŒŒ‰�Š�ŒŒŽŒ€hQSPUZXQRSXOKKKSY_afnunciw{~|n_b`a]]`dZVQQTYYTPLGLJJKMLHJNMHGGHHSOQPLNJMKKTZaelrqkjh[NGIDGDEECBFDCGCCCEIKPS[cr~„ˆ‹‡ŠŠ‰Šˆ†Œ���‡†}maXXZZXXTMLKPSX`qrt_NHHDGEGJIIHDG˜”–™—˜˜˜šžœœ›œœšœ›˜›š™™š˜˜™–—•™—š™™�Ž‹Ž�Ž�ŽŒˆŠ‡‚‚‚€xxxz{wytvrvy|€}~��‚ƒ}}xt{xƒˆ‡…ˆ‰Š‹‹ŒŽ†ŠŠˆ‡ŠˆŒŠŒŽ�ŒŒŒŒ‹Œ‹‰ˆˆ‰„ˆŠ††Š�ŠˆˆŠŠˆ‹Š‡…‡„…ƒ„„„ƒƒ…„‡ˆ‰‹‹Š‡†ŠŠŠ…‡��€|€€ƒ�€€„‡……‚�|}~€{~|}}��€‚…†„‚††…ƒ‡‡‚‚†„Іˆˆ‰‰ŒŒ‹�Š‹‹ˆˆ‡†‰ˆ‹‹‰Š‰†‡‡‹Š‡‡†€{w}~ƒ‚~…‡ƒ‚€€�„…ƒ„ƒ…ˆ„ŒˆŽ‰Š�ˆˆ‹ˆˆŠ‡‚nI>BAB@@>>>?<:@;<9>BIQWXZW]ZY]^ZZTYXWVXVWWYUYWXPJ_t�‚…ƒ††ƒˆŠ‹Œ‰‹��Ž�ŒŒŠ‹…‹‰Š†rULQS]fj^UTZTPPR^gkh^`eebhqzzukhdd]XX^_]ZTXX\XYVMGGKKLJKHJNILCCFAGJNKLLHKKIKVZ^die`_YRNEBCFDBFFCFCCEEEACBCDGMT`jvzƒ„ˆ�‹Š‡ƒŠ‹�Љ…}rb]^_Zb^ZOLOORYbo}zhTLIGGIDHFIGGF—™—™•›˜–�šœšš›˜ž�›�ž›��›˜››˜”—™—––”�‹‰‹�ŠŠ†ˆˆ††ƒ|{vzwvswqwtuv{‚‚‚Š„„‡€{xx|€€„„ˆ‡ˆ��‹Ž�Ž��ˆŒ†ˆˆˆŠˆ‡‹Œ‹Š‹Š‰ŒŠŒ�‰ˆ‡ˆ‡‡†…ˆ‡‰Š‰‡‹†‰Šˆˆˆ‡‡ƒ„„‚…�ƒ……ˆŠ†ˆ‰‹‹Šˆ…‚||��€}ƒƒ†„€€�ƒ}‚ƒ��€}€‚€~‚†††‡ˆ‰‰‰‰„†…„‡„‡…ˆ‡ŒŒ‹Š‹Œ‰�Œ�‹ŠˆŠ‰ˆ‰‰ˆ†‰‰†Š‰†ˆ†ƒ~€‚‡„�{|�ƒ‚~~�…ˆ‡†‡ˆ…‡‡†ˆ…‰Š‡‹ˆ‹ˆŠ‰ŠƒoG>@>BB>=?@9>;@<:?@LS\ZW]YY^[\\]ZWY[WWXSVYXUUWWLKZtˆ„‰‚‡…„ˆˆŽŒŠ�‰����‹ƒ~{„‰‹gVZ]aiu{nbag`UVcjrocRVRTSbltwyutrgYSSW]UVXXZXXVSOMKOOJKGIGJEHDDCHHGMOGIHHCEHOPNWXVQOONJFCCBDCABCDDBBCB@B>ACAGCKPYakww„‡‰ˆ‡ˆŒŠ‰‰ˆƒulfc`ffka]XUUUVWdotjUMKJHFFFFGFEC–—›™œ”š›™™š˜™›™š���œœœš¡��›››™š——”‰‡ˆˆŠ‡„…ƒ‚�…ƒ‚}{zz{wzvvtyrpw|~|€‚„†‡‡…�||~ˆ‚ƒ„…„ˆƒˆˆŒ���‹Ž�Š�Œ‡ŠŠˆ‰‡‡ˆ‡ˆˆ‰‹‹‹ŠŒŒŠŒˆ‰‰‡‡„…‡…ˆ…„ˆ‰�ˆ‹ŠŠŽ‰…ˆ††ƒ„‚ƒ…†„‡‰Šˆ†ˆ„‚‚…†ƒ€„……€€~ƒ‚ƒ€ƒ„‚…‚„ƒ~�~€„‚Š„†‰‡‰‰ˆŠŠŠ…‰ˆ‡„†ˆˆˆ‰‰‹Œ‹���ŽŽ‹�‰‹ˆ‡‚ˆ„‡‡†…‡‰„†„…ƒƒ„„�||€}ƒ{ƒƒ†‡‡ˆ„Š‹ˆ‰„ˆ†…‰‡†‡‹ˆŠˆ‡jF=BA@?A<>;>==?:<>;9<>DMWZ]\Y^^][]ZZZ[\YZXXWXYZXYYXXNBCUm�…‰‡ˆˆ‹‹ŒŽ�Šˆ„€sl`TKPc�ŠŽ‰‚wjpuuvw{zw}ysv{zt[GD?CCELOV`glbVLKIIHMFKLLFHIEJGJHILMRRSMKFDBAFCDDGFHEHHLRRPJIIOOMIKKGDIEDDABBCCADA@?BA>BBA>B@DDEEGOWcsu�‚ƒ‡‰Š‰…~ojgnrmmkmkd[VVXYSSMOOLJHDDECCE–˜™—™™š˜œ��œ›ž™›œš›œš›œš™˜™––”–”‹�‹†‰‡……€~{|xyxtpuquurwtwvxxyz~}„†‚…‡„„€y{�„ƒ�„‹ˆŠŠŠ�ŒŠ��…‹‰Š…‰ŒŠ‰‹ŒŽ��ŒŠ‰Š�‡Š‡‡‡‰†ŠŠ†‰Š‡‹ŠŠŠˆˆŠ‡‡‡‰…‡ƒ‡‰‡‰ˆŠ‰ˆ‰‡ˆˆ‡ˆ‡‡„‡Š‰‡…‡ˆˆ†„‡†‡ˆ„„„‡‚‚}‚ƒ€……€��‚†ˆ‰ˆˆˆˆ‡„†‡‡Š‰‡‡ŠŠŠŠˆŒŠ‹‡‰Š‹ŒŠŠ†Š�‰ŠŠ‰ˆ‰ˆ„‰„‡Œƒ‡ƒƒ††‚…„‡‡‚€}~€�‚ˆ€„€|}�‚ƒ€�€††‰…‡…‡ˆŠ…‚~`B?B>A??B;>?==BHKUY_[ZY^Y^Z[^^Z]]XYZXXWYVTXXWVM?@Sm‡…‡„…†‰��‹‹�„sc^XRMPdz‡Š‹„tafigehent}‚z_IBADGJGGJHOQRPLFKIHJJGJGJHFHIFEDGGOU[Z[VMIADD@HF?DDDKLNW[d^[ZTRVSOOIGIJEIGDFEGEDDABAABD@AA>ABFBCGFKLT\horuvƒ†‡ˆ†…}qilnllqqpfg^\XWUPQQRNIHIECBDG•—˜•š—›—š››�šš› œ››��žšœ—–—••��‰……ƒ‡…‚€}|||w{{rxusssnrsuuww||€„„…‡†Š‡…ƒƒ„‚„„‹‰ˆ‹Žˆ���ŒŒ�‰ˆˆ‰ˆƒ‰ŠŠ‰‹ŒŠŽŒ�Œ�Œ‹…ЉˆˆŠ‰†‹†‰Šˆ‹ŒŒŒ…‡‹‰‰‡Š†‰‰ƒ‡‡‰ˆˆ†‰‡‹‰‰ˆ‡‰Œ‡Šƒ„…‚„…††„ƒ�„††…ƒƒƒ€€„…ƒ�€††‰†ˆ‹‰ˆ‰ŠŠŠ‰†ˆ†‡…‡ˆ‹‰Š‹Ž‰ŠŒ�ŒŠŠ‡‰‰ˆ†Š„‡†‚…‡‡ˆ‰Šˆ‡‡…�…………€€z{z€…†…††‚~~‚„~~€~�…„…‚„‰‰‡Œˆ}\A>@AAA=?=??@ELOY^_\[]X[ZZ\Y`_][][Z]YYUYWTWUVUDB>Rn}І‡…†ŒŠˆˆŒŠŠ†{snkg_biv‚…‡zfTZb[[Z[bo€…ˆ†}kNDBEDHJLJGDIIKJLKINKLLOPKPOQQMTNMKQV^egccWHDDCGEDE@CHJTZYhojie`[]_XXTIHPLJMKHHFFDFFDABF@@CC?BADDEFHJKRY]gfinz‚‡…„„€zqlqlmqlppngd_]UTUUQMGIIHGEFD˜•™˜—•—™™™›™›œšš� œž��ž™››—–•‘‡‚{€€‚}{|z|v{zw{|xzwwwwttupuxw|{|€€€…„„��‚ƒ††‡„‡‰‡ˆŒˆŠ‹ŒŽŒŽ��‹ŒŒ‹ˆˆŒ‹‡‡Š‹Š‰ŒŒŒŒ��‰Œ‹��‰ŠŠˆ†…†‰ˆ‡ŠŠ†‹Š‰Š�����ŠŠˆ‡ˆ†ƒ†‡‰‰ˆˆ‰‡‹Œ‰‹Š‰ƒƒ…ƒ„‚‚‚„†ƒ€‚‚ƒ…„„‚†„†ƒ€ƒ�„…І‡ŠŽŠŠˆ�މ†‡‡ˆƒ‡‡Š‰‰‹‰Œ���Œ��ŠŠ‡‡…‡ƒƒƒ…‡‡Š‡ˆ‡‡ˆ†Šˆˆƒƒ{||�ƒ‚…†ˆ�‚…‚†„ƒ�€„„„€†…ˆ‹‹ˆ†|\D?BB@C?<>@Ni‚…ˆˆˆ‹ŠŠ†Š‹Š‹‹ˆ‡„{qnhglnnsspppvxrosu}‚Š……q[PKONOJHGGIHGIKFHGKQYfmjhmklqsnnmpupnsv|wzbQKIOMHFBDDDGNSZ^ZXXV\`^_`egc_WTUTUOJIBDECFEDFCEBICEGCHBEEDGJNQWVVYbmw��†††ƒ}|ywulhktutpkc\VQPPLLKLLGHE——˜˜–›™šš›�žš›š™œš™š›™™™™—”™˜’�‰‹…‚~~}~zwwvsvxptwssuuuu{z|�|‚��‚„‚€~}|~‚‚„„…†Œ‘‹Š�Œ�ŒŒ‰ŒŠŠ‡Šˆ‡‰…‹‹Š�Ž‹���‹‹‹‰ˆŠ„Š„ˆˆŠ�†‰ŠŒ‰ŠŠˆŠŠŠ‡‰‰†ˆ‹‡‰ŠŠŠŠ‹�ŒŒŠ‹‹ˆŠˆ†‡†…‰‰�ŠŒˆŠ…�„‚„„‚‚ƒ��~€€�ƒ€ƒ„……‡‰‡…††„‡ˆ………„……‰‡ˆ‹‰‹‡ŒŒŠŠŒˆ‹‰ˆŒ‡‰‰Œ‡‰ˆ‰‰ˆ††Š†‰‡„…„„ƒ…†ˆ‰„€z{~~|~€†„��…�‚ƒ††‡…ˆ‡ˆ‡Š…ˆ……yVA?C?A@B>@FR[_a`^_[`a[^_`\^a^_[YZZZ]Z[[VZY\_PG>:AMf}‡…ƒŠ†‹‹ˆŽ�Š‘‰‹‡}qhhhjlpooqu|||€‚‚„‚€‡…yiWWORQLNNINKGKGGDFCJQbn|{{{zywrquxymdfs|||jZMNJKJEGGJJIISVZ[VWW]aadekhkb\WTQSNMHIEDBBAABBBDGGFCHEEEFCEEINQQNQZfnyƒ†Š‡…‚‚„~xqlmtussmj`VXTSOMMJJKFE˜—•›——™›�š›››œ�››œ›››šš—•˜••””��ˆ{|~}y|xyxvztuvvsoqsutvx|€†ƒ…†…€‚…ƒ„�†ˆ†Š�Š‹‹����ŒŽŽŒ‹Š‹‰†‡‡…ˆŒ‰‰ŽŠ�Œ‹Œ‹�Š‹‡‡‰†ˆ‡Œˆ‰‰‰ŠŠŠŒ‰�މ�ˆŠŠ‰‡ˆˆ‰…†ŠŠŒŠŠ‹Š‰‹‡‡ˆˆ†‰††‡……„ƒ�„€~„„„��~�€€„„‡„‰‡ˆ…†�†„„„€‚€†ƒ…†ˆ†ˆ‰Œˆ���ŽŠ‹‰‰ˆ‰†‰……†ƒ…‡„…‹‰Š‰‡ˆ……ƒ‚ƒ„…~xuyy�~|ˆ……‚ƒ�€€€‚…†„…„…‡‡‡‡‡‡ƒtWABA?AB@@GR^cad`[_]^\__^]^a]`]Z_]Z_][[ZVX\YTMA><>Oi}………‡ˆ†‹Š������‡yrrrsxrvnkv|{|{ƒ‡Š‰Šˆˆ†{l^[RRPSRSNONNLHFFHEFHOcox~„€„‚�yunoraROUer}|p^RNGJHJLRUUSRSUZ[ZYWbbfhjkhkcVSNQQNJGHHIEEADBBDDDF@FGGEIDFFCGGMOOLRYelu|†ŠŠŠ‹‹‡„|ussrqprng_]WYRSMKKKEH”•˜—˜˜•˜™™—™ž›š›�žœ¡�ž™˜˜š“”‘’މxy|zxzzxz|w{zywwrrttvvw{y{z|yƒ~†�~�„‡‰ˆˆˆ‰‹ˆ…‹ˆ‰‰Š���ŒŽ��‹Œ�ŽŠˆ„„†ˆ…ˆŒˆŠ‹‡ŒŽ�‹Ž‹‰Š‰„ŠŠ…†‡Šˆ‡ŒŠŠ��ŒŒ�‹‰�ˆ‡‡ˆ†‡††Š…†‰ŠŠ‹‹Œ�‰‰†‡…‚�‚€~€‚~€€„�ƒ……�€„‚‚…‚�‚„†‡‡„ˆ‡‰…†……††‰‰‹�ŒŒ��‹‰ŠŒ‹‰„†€„€„€‡…‡‡ˆ†‰‡‡‡…†€€~{x€{€…ˆ„„‡…‚ƒ‚ƒ‚��ƒ„€†„……ƒ…�…}RB>BC@?@HU^acccb`_ag__^`Z\_Z[][[]]a_]]]YXVXUE=:=>Kg€Š‹‡‰‰ˆ‡‡ŒŽŠ�Š‹†€z€}€ztqv}€}~‚‹�‹Ž�Œ‹w[VRQRVSOPRQNQPHINNLJKOZblty{‚~|wopcQEGMXiu|uhXOKGHLT^egd_YWYYWUS]`cgjeed`UUPTNNJFHIDGDEEDEHBDDDDB@CGCFCEFKNNOLPR\bks�†ŒŒ�‹Š�…†{qrrrssja_`YWSPGMLHI—™š—›™š˜™™›˜š�˜š�›šœœ�š–˜••”••�‰{x{|xyytw{zvxzxxxsttzvxw{~zvx{z~}yy~€ƒ‡ˆˆ��ŠŒŒ‰Š‹‹Š†Š‹ˆ‹Œ‹‰Œ�‹ŒŠŠˆ‰‰‰‡ˆˆ‡‰†‰‰�Œ‰�‹‹Ž‹‡�Œ…‡…‡……ˆˆ‡Šˆ�‰ŒŒŒ‹‹�ŠŠ‰‡‡†ƒ‚‚†…‰†ˆˆ‰‡‡‡ƒ‚~ƒƒ€~|~~€|xvvxx�„‡…€‚‚‚‚~~~|{~€ƒƒ…„†Š�‰‰‰‡‡…‡†ˆŒˆˆˆ‡‹‹‹Œˆ‹�†††‚ƒƒƒƒƒ‡„„†ˆ„Љ†„„„‚��…ƒ�ƒƒ†…ˆˆ‰…‚„†……………„‚‚ƒ�‚ƒƒtS>AAD?ALYchbadbbabbf^a^a_[X]]X^[]][^a\ZZW\WLC;=;>Khƒ‹ŒŒŠˆ†††‰‹‰Š‰‰…‚……€~��vu|ƒ‚ƒƒ„�ŠŒŽ��…iSMNLOSTOQQRKKOJJMQLLOOPTZ_ggnosvqzmaSMRT\ku}{s]QGGKOTansoh_QTQOOTZ`^b_]^Y[[W]ZXVRJGHHFFFFEIFHGCDBCDAADHDBGGJKGMMQVXbo|‚„ˆ‰Š‹Ž�ˆ‡‚}zwx{rgbd_\YPPNMMNL——–˜›˜–œœ™›˜™š™›šš˜›™š—™’˜•’—‘�‡~|€|{yyywvvtvurvrsxx{z{x{}}|{w||€�†‡†Œ�‹���Œ���‹Œˆˆ‰‡‰ˆŠ‡ˆŒ‰‹‰Œ�ŒŒ‘ЋЇˆ‹Š†‰ˆ‰ŠŒŠŒŠ‰‰‹‹Š‡ˆˆ‡ˆˆˆ„ˆˆŒ‰���ЋЋ‰ŠŠ†‰…‡†‡†‚…�‚�~‚„ƒ…�‚‚€€‚ujqlny|�…~‚‚€~~|}x~€ƒ…‚‡…‡‰‡ˆ‹†ŠˆŒ�ŠŠ…††‡††„‡……‡††…‚‚†‡‚……„…†ƒ…„†‡„‡ˆ…ˆ‡‡‡‡ƒ…„„„ƒƒ��‚ƒ„ƒ†ˆ‡…‡…~ƒ€ƒ�sOB>?A@GXhnjeaecc^`_`a^_^V_X]]^\\Z]WY`ZV\\ZUH@==<=J`}„†‡‰††‡‡‰‹�Љ‚‚„ƒ€zxz}€}‚ˆ„‰‹…ŠŽˆ‹Ž‰|_QOPRXXURROMEIHEDIMMINNNQNPSX\Z`dhpph^Y\dju{€�wbMFHMKVZhpob[JLLILT[`a_]XUU[]`_dd_\SLNKHFEFDIDIFFEAFCCF?CC@HFGGHIKOOV]eux�‚†Œ‰�Š�ˆ‰ˆ„��rgedc]UUTRORQV’˜™—™˜–œ™››š��››Ÿ˜›››˜š˜–˜—•�Š‚‚€€}~{|z{zzxvuqsuvnvuvxx}|€}~~}{|�‚…‡…‰…‡‹‰‘Š�Œ��ŒŒŠ‹�†…Š‚…†‰‰‹‹ŽŒŒ‹‘����Š‹‰ˆ‹ˆˆ‡ˆŒ‹�Ž‰ŠŒŠŽ†ˆˆˆŠ‰„‡ˆ†Š‡Žˆˆ‰‹ˆŠŒ‡‰‹Š‡†ˆ…ƒ„ƒ‚~|�‚€‚†ƒ~�|vrsttz|‚�~{}|z{yzz‚‚…‚„„‡ƒˆ†„…І�Ž����‡Šˆˆ…€„ƒƒƒƒ…ƒ‡€ƒˆ‡Š‡‡‡Š…†„„€€€‚‡ˆ‡‡…‰ˆ†ƒ„‡‚†‚}„��„„„ƒ‰…ƒƒ€ˆ„†pO>?>@DUeqwlff_e\c__]\_]][^[]]][VVSSSUYXY\ZL??=>==Jaw†ˆ…‡‚„‡‡ŒŒ‹‹‰„~ƒ�‡„wty€„€€ƒƒŠ‰ŒŒŒŠ‡‡{r_X\abbc]VOLIEEBDCDDEIJHKKKNOOKJMQZ_kllimry{€€zoZMGHGLOSXY\RLGCFHLQX[a]YPMPU]\`]_daYTRQIICFFFDHCFCACBDBFEBEEEEEHFINJSS]gsyƒƒŒ‰‹ŠŒ‰Œ‹„ƒ…}shgfdb\ZZ_XVVX—™———™—˜š—™›œœš›�Ÿœ�™�œ›š›–Žƒ||{{ywxxxx{{zuvywwwuxv{{~}€€~€ƒ~|}}~„ƒ‰ˆ‰Š†ˆŠ‰‹‹‹��Ž‹ŠŠ�ŠˆŠˆŠ‹‹†Š‡‹Œ‰Š‹ŠŠŒŒ†…†…ŒŒŒ‹‰ŠŠ‰Š†‰ˆ‰…ˆ‹‡‰†‹Š‹‹‰‰‹ŠŒŒ‡†ˆ‰‡Š††Š‰‡Š‡Š‰‡„‰€‚}|€}{}~€~xzy{~‚�}vxvrxsuy~†‡‡…‡„„Œˆˆ…‹ˆˆ‹‹�‹ŒŒŠŒˆŠŒˆ„…�…�‚‚„‚‚†††…‰‡‰�‰‰‡ƒ{uz‚‚…ƒ…†ˆˆ†…€ƒ„†…‚ƒ‚‚€|ƒ€‚………ƒ„‡…†uN>:BBP`qtrjfegcdcac]]][`^\^Z\\[TJKKJTTZ\WTD=:<:>>Mf{ˆ‡††……„…‡‹Š‰‰‡…ŠŠ‹…�zƒ~tsu|�…ˆŠ‡Œ‹†|oh`ekqon\WKHEDF@CB@?FFEEFLIMGLJIIIOWdisuvvyzzohZQIDFIGFIKIIIDEIGHKLRTX[SNLPOSVTVXY_[RTPPOJKJKHCEECEGBDDEEHDICHGGFFHQNSW^gu{€‰‹‹ŠŠŠŒŒ‚…�}tmmnmi`dfc_YXV—™™—˜š™—™š™›˜™››��žž�œž›œ——ˆ{z{xywrwywtvuuttwwy|z{~~„†‡‡„ƒ��{wzz|‚‰„‡‹ˆ‹ˆŒ��Š‹ŒŠˆ‰‡„†…ˆ‹‹Š‹��Œ��Œ‰‹Œˆ‡ˆ…|qr‚ŠŽŒŒ�ŠŒ‰��„ˆ‰‡ˆ…ˆ‹Š‡ˆŒŠŠ‹Œ‰‹‹Š‰Šƒ‹††„…ƒ‡„……‰Š�††‡„‚~}||{{xqquzz~‚……ƒ€{xxrrrrsu…ƒ‡…ƒ‡‡ŠŠ‰Œˆ‹‹‰‹Š‹ŠˆŒ‰ˆˆˆˆƒ†…ƒ…ƒ‚ƒ…ƒ‚†�‰…‡ˆ‡‡‡Š„~|}€ˆ�†„……†„‚‚€�€………‡„ƒ�|€„„‚ƒ‚„„ƒqJ>>?O`rwuqgjfdee`caa^^__\`\]Z]YJD>AGOW[YYM?>8<:<>F_zˆŒˆŠ‰‰ˆ…†‡Š‰‹‰ˆŒ‹‹‹Œ„ˆƒvfgmpzƒ„�‚††„€xrggrwwqf\QKIGIEBBBABDDEGHLNMHHIIJOTZfuuupjfc]SSJFCEECDEHIIGFOQQTOOJLPRRNNMOMLNPRVXUSOOMMLRQRRHGHEGDFHHFDDFGEFGGIHKLROWYcov~……„†‰‹Š‰‰‚€‚xvtxutlkiicXWY–—•š™™š™—›š™››—ššœœ›œ™›�š“Œ|~‚zyzwxvwwsvvsqtpuzv~‚…ˆ‹Œˆ„„ƒ}zz{{{‚‚‡ˆˆ‹‰��Ž����‹‹Š…†„„……ˆ‡ŒŒ���Ž‹�ŽŽŠˆiZcy…ˆ‰Œ‰ŠŒ�Š�‹‹ŒŠˆ‰‰‰Š†ˆŠˆŒ†‹Š‹‹�‰ŽŠ�ŒŠˆ†…�‚ƒ„Šˆ‡………†‡‚|~|xumihpsvzzƒ…„}|zuuuvyzƒƒ‚ƒ‚…ˆ‹ˆˆŠ‹Š��Œ�‹‡‰‡Š…„‚‚„€…�ƒ‡…‡ˆ‡…………„„‚†ˆ‡ƒ†‚„……†„†‹„………ƒ€~}��†„†‡€‚�‚…ƒ€~ƒ€€fG=AH\r}woghdebc`ca_\c^_b__[[]WG??;<;:=?D\z…ŠŠŠ‰ˆ�ŠŠŒŠŠ‰‡‰ŒŠŠ‰Ž‡Š…{lmhry€€|�‡‚‚‚yomtw}vrf[PPPNGECB?=E>@GHMPKMGJIRQVX^nsmc]^XSRRNGCDBAEFKIKRV[``a]QGHIIOQMIMJNORSW[TPMIIMRY[\SNGKLHGKJFKIFDGFHJGIJLPONUZbiu{~‚�„‡‹�ЋЇ†‚~~~€{spjecXW\—™•™––œ˜™—�š—›˜œ›Ÿšš–—™˜“‰€{~�}|{xwzvyswturryvsxx|{‚„ƒ„‡…„ƒ‚€}{}{ƒƒ…‡†ˆ‰��Œ���ŽŽŠˆ‰‡‰‡ƒƒ†Š‹ŠŒ�Š�ŠŽ�‹„u`Y]s‡‰Š‡‡ŠŠŒŠŠ‹ŽŠŒŒŠŒ�‰‰†‡ŠŠ‡‰�ˆ‹†ŠŒ��ŠˆŠ‹Š‡‡††‰……�€ˆ…‚€�yvprotttqu��~�z{yyw~‚ƒ„�ƒ�ƒ�†Š…ƒ…‰ŠŠ��ŽŒŠ�ˆŠ‰ˆƒ€‚ƒ|}ƒ„‡€‰…‡ˆ†ƒ……ˆ‡…†ˆ„„„„‚‚‡‰„†ƒˆ„„„�}}……„ƒƒ……ƒ‚†‚„‚€�~bF>BTm|�xribffcd```a\b[a__a\^_ZK===@MSWVI?:?=;;>>?HQVQB=9;:<=;:EUq‚‡†‰…‡ˆŠŠ‹‹�‹ŽŠ��ŒŒŠ‡‹ˆ‹‡}‡ŠŠ‰ŠŠ‡€‚‡‡ˆ…�‡�…ƒwiii_XONHIEIJLLMVY^WWZX\][[\dnng`b]^b^YVRKHHKPNNRYeflquqiSJKFMKLKLKKTWfnspicZWW_ijdXRPLQJMLNKOKKHCIGFDBBEHGDDIUcpx€„ƒ†ƒ‡ˆ‡‹Œ�Žˆ�†Œ‰„}vrjjge`•›”•™˜˜—–š˜˜™ ›š�›žœ™™–‰~{~‚|{zxyxxvxsuxwxxxwzuxsvvvzx}}�€~ƒƒ„��€}€ƒ…ˆ††‹†‰‰ŒŠŠ‡‰ˆ‰‡ˆ‰‹ˆ‰ˆŠŠ‹‹Š��‹‡‡ˆˆ�~veTZiy†‰��Š‹ˆ‡Š‰‡Š†ˆˆ†‰…‹Š‹�ŒŽ‹Š‡ŠŠŠ‰ˆ†ˆˆ†ˆ‰‡‰†…‡‰‰„…„‡ƒ‚ƒ‚~||xtqnlopp||}{{|z~~€€„„…‚ˆˆ‰‰ŽŠŠ‡‰‰Œ‰‰ˆ‡†…‡†…ƒ‡„‚††ƒ…{~‡…ƒƒ„………‡„……‡Š‡ˆ†…………„…‚‚„‚ˆˆ‰Š†††„„†„‚~|‚�„†‚ƒ�…††‚dFG]p€„{vohgcdhdf`a__``^a`]^^_XK?;=AIVRG@=;9=:<>>BYq…‡‹‡„ˆ‡‡ˆ‰ˆŒ‰Š‹Œ��Œ‘���ŠŠ‰„ƒ…‚Šˆ�Œ‹|ˆŒŒ‹ˆ‡„…ˆŠ�wzskaa\\VX]YYZ^eeggaefabZ\_grtpmjife`^]XNKIQQNKW]e^dqtvoeYRMKKOS[UUV`mvysnqmfdlppdYTNLKKKIGHKLMGGFFDFCABCBBECGV]n}ƒ…�……Š…‰‹�Œ‰Š�Š…wsvtrpoi––—–”™•—šš—˜›››šššš—š“�ƒ€�‚}}|z{}ussssrsuyttwxsqwxzz|~‚ƒ„ˆ„†‡…�|}�„††ˆˆ‰ˆŠ�ŽŒ�Š�‰ˆ‡€ˆ‰‡…†‹‹‹‡ŒŒŒ�ŒŒ�‡‡�thf_gu€‡��‹Š‹‹‹‹‰Šˆ‰Š‡‡†‡ˆ„‹‹ŠˆŒŒ��Œ�ŽŠˆˆ„†…ƒ…ƒ…„†ƒ„†ˆˆ†‰‡ƒ€{wnmjnsqstwxz}}…ƒƒ‚…�ƒ†„†‡‡Šˆ…ƒ‰‰Ž��ˆ�†‰†ƒ„ƒ€„ƒ…†……ƒ…ˆ†‡†……†…„ƒƒ‚„†…ˆ�‡Š†‚‡…††ƒƒ†……†……†„„‡‡‡……‡†ƒ„„…ƒ‚‚€�}^IQj€†‡€zynifcgefdab``^dcaca_]_YH>?=?IQQA>;<<;;>;9AVo€ˆŒ‰Šˆˆˆ„ˆŒŠˆˆŒ‰ŒŒ�‘�Ž’���‰‡…}‡ŒŒ„zv€��‘‹�‹‹‰ˆ…‚„~troormkmmmmjmkmjifkfa_`acmrsspnefd__TPLMNRNLS\aZajsw{rd_\XW^`ihdaftzsplorjkrxq_[TMKKIHIHGFIHHFHGEFCGDECCCDDGWdxƒ€ƒ…‡‡ŒŒ‹Š‹ˆˆ†‚xspuuwppj˜˜š˜—™™—™š›››š™š™›˜’�ˆ…�ƒ�‚~€~}z}|zxutuswvvqutrpwwxz}}€‚‡†ŠŠŒ‡…‚|‚‚……ƒ…ˆˆ���Š�Š��‰‡‡‡ˆ‡„„ˆˆ…ЇŒŽ‹‹Œ�Š‹‚}{vvmt‡Šˆ‹ˆŒŠŒŠ�‰Ž‰‹Š‹ˆˆˆˆ‡…ˆˆˆ‰Š�Ž‹ŒˆŠŠ‡…†€…ƒ…‚‚‚„‚††‡†‚~|xsturvxuw{z~€‚‡‡‡‡……†Š‡†‡ˆ†„�€†ˆ‹Ž�‹‹‹‡ƒ…†…‚{‚…‡ˆƒ‡‚„„†‡Š‡†„‚�ƒ„„††…†ˆƒ„‰„ˆ†‰†„��ƒ„‡€|}‡‡‡ƒˆ‰†‰ƒ‡‡�…‚€€y[Max…Ї…{sifeegedea^`^ddbe`_`]ZF>9<@ILE>;;<>9>;=>BTk�‡‰‡‡‹ŠŠ‰ŒŒ‹‰‰‰‰‡‰ŒŒŠŒ�ŽŽ�Ž�„‚‚„ˆˆ�yv�ŠŒ�‘�‹�‘�‰Šˆ„‚€}‚||yzyxsqcdf]`bfa^]XTZ[_fjfb\`b`XPOJMNROJLUXOZct}€}tldgkjmswuoktzqdclhkeuxj`TQKIJIJGCDHDHFFDGGEGJEIGEFDDFL_rz}x……‰‹‹‹‹ˆ‰‡„~{vqsuqmjh”œ—–™˜”šššš›�™››››’‹��€ƒ€~|}}~~z}|||xyz{zwzyuusvvwx{z|…†…Œˆ‹……€�‚†ƒ……„††‰ˆˆ‰ˆ‡�‹‰�‹‹‹ŒŒ†‰‰‡‰„ˆ„Š�†‹‹Š‹††‚ƒƒ�…†‰Š‰……�ŠˆŠ‹Ž‰‹‹ŒŠ�Љ‡ˆ‹ˆˆ††ˆˆ‰Šˆ‰‡‡†…ˆ‚ˆ…„ƒ��~ƒ��{|}~xw|{~~|z{~‚�„‡…‰…†‰…‹‹Œˆ‹Šˆ„‚‰…†Š‹†‰‡†……‰‰‡€€‚„‡‡ƒƒ„‚€„†„ˆ…‡‡ˆ„‚ˆ…‡…‡„„„‚ƒ…†Š†ˆŠ‡…†ˆƒ€{�‚……„†‰†Š……‚…€�w`Si‚‰‰†„xtigkhiih`b]b_`b^``^b_\J?<<@BC=;;><:=?;:=ARm~†ˆ…‡ˆ‡ˆ‡Œ�ŒŒŽ‹Œ‹„ˆˆ†ŠŽ‰���‹Œ‹ˆ�Œ‡‰ƒ|„‡ŒŒ‘�Œ�Ž‘Œ��Š�„†ˆˆ~umohbYVTYRRXVTRTONPORYXSVVZZWQSPRPQOOHLSSSZlz~|xoinuxuy|~wswug\]klkmvshXQLJHFKLLGGBFHHBDDGEIGGHLGFHIIN]ny~~~�ƒˆŒ‹ˆ�ŠŠ‡ˆ„}zuspfc__™–—™–œ˜™˜˜œ™�››››™‘�‹„‡„„€€|z}zz|{{|yyx|xvyvwxxvxyy{y€‚‚„„ˆ‡††€ƒ�†ƒ†…‡†ˆˆ‰‰‰ˆ†‰ˆŠ‰�‰�ŽŒŠ��Š�Љˆ‹‡ˆˆ‰‡‹†Š‰‰…‡‡‡ŠŠ‡Œ‡…‰‰ˆ†‰ˆˆ‰‰ŠŒˆ‡ŠŠ‹�‰ˆ‡Š‡‡‡…†…‡‚„„ƒ†‰ƒˆ„„‚‚‚‚……‚{||{z}~}|€ƒ‚ƒ‡„„‡…�„„„……ˆˆ‡ŠŠ‹‹‰Œ…‡Š†…ˆ††„†††…‡ƒ……‡†‡‡……€‚‚„……†‡††ƒ†‰Œ‡ˆ‡†…„„€…†…ƒˆˆ…Љ†„…ƒ~~}‚ƒ„ƒ…ˆ‡‚ƒ‚‚�y`bw…‹‡‚‚~xrjgffiihfa_a]\a^_`^]][I<=@9<>;<;<9;?<:=;?Pi‚ˆ††„‡‡ˆˆ‹Š�Œ��Œ�ŠŒ‡‰Œ‰‡Š����Œ����Ž‹†‰ˆˆŠ‹ŠŠŒ��‹�����Œ…~xk_YWUSURRKKLPQONMPNNIJJMOMPPSSTTTLQROOGLOJNPZfioidgmy{{|x~wxroaVagpvxyxhZJNLJIJMOFIGGFFCCDEIDGGDKFJHMHOXgs�„„‰‡�Š‹‹‰ŒŒ‡„„}zumf`^`š™—˜—–˜š™š�š›™›š›˜˜’�ŽŒ‰Š†…}‚€}}}yzztstuwuttxvvz||~~~‚„„ƒ„‰‡ƒƒ~���ƒƒ†ˆŒ…ŠŠŽŠ‹ŒŠˆˆŠˆ‰‹ŠŠ�‰‹‹��‰ŒŒŽ‹Š‹‰ˆ‡ˆ…†‰…Љ‰�ŠŠŒŒŒŒ†Š‹Šˆ‡ˆ‰‡‡‰ˆˆŠ‰Šˆ‹ŠŠˆˆ†‚ƒ‚ƒƒˆ…„‚‚‚‚…ˆ……‰„�|~|~€�ƒ…‚…†‡‰†‹††‡†…………‚ƒ‡ˆ‹ŠŠ‹‹‹Šˆ‰‡ˆƒ…†„ƒ‚ƒ†…ƒ„‡†‰ˆ‡‡‡…†„†ƒ…ƒ€‚……Љ…†‰ˆ†‰„ˆ‡ƒƒ……†…‡„…‡…†~�‡„„„…ˆ†‚„‚��€zfk��‡†„|wqnffdgieebcdbca]]`]_YYJ<<:><==:<6><;>;=;@Nm€‹…Їˆ‰ˆ‡ˆ‰Š…‰ŠŠ�ŠŒŽ�ŽŒŒŒ‡�Ž‹���Œ��‰Š‡‹‡†ŠŠ‰ˆŒ…Œ�ŒŽ�Ž��saYUQPQTRMNNJIONLMOMMMMIJLLOJPPRRNJKLPPPLJILNNSPVUTUZ`omsooklpj`VX_gnwz~{kcVSNNRKPPMKGGDCDFFDDGGFHDFGDHIORao}…І‹‹ŒŒ‰‹‡ŠŠ†�~}xxnmhee—–—•˜˜™˜™œ›™œ˜˜™™––”“ŽŽŒ‰Œ…�‡‚~}}|xtutussuosqsvzy|~€�‚„…ƒ……ƒ�€}€ƒ†ˆŠ‰ˆ�ŒŒ��Ž��‰Š‡ˆ‡‰‹�†‹Š‰�Š�ŒŠ‹�ЉŒ‰‡„…ˆ„†ˆˆ†Š‹‰‰†Œ�‰Š‹‰ˆ‰‡ˆ„†„…‹‡Šˆ…‡‰††‡ƒ…ƒ„†„‚‚‚‚ƒƒ†‚‡Š‹‰‰‰………ˆ„‡……‚…ƒƒ…††ŠˆŠŒŒ‹‡‰„„��†‰‰ŠŠ‡‰‰‰ŠŠ‰‰Š‰…‡„…�…ƒ‚„‡ˆ†‡†Šˆ‡ŒŠˆ…„��„‡ˆ‰‡†…ˆ‹‡Š†Š……†„…„„„‡†‡‡‚‚‡ˆ‡ˆ‡‡‡†…ˆƒ„…�€thu‡�ŠŠˆ€€zslieadihgcdbc_b`a`\[ZYIA7===:<<===;:=;9:==<;;;@<:9<=;;=@Mc{„…†ˆˆŠŠ‹Œ‹Œˆ‹ˆ‰ŠŒ‰����ŠŽ‘�ŽŽŽ‘�‹‰‰„|tsv}‚ŠŒŽ�ŒŠ�‹�‰ƒ€o]PPSQROLLHQLNGKILHMHKJPLKQRPNRQNLGJEJLMKMJNLQNMGGICGCGIJKOKOMTUQQV[YXZ^gjjd]^^\_acbaXIIGHPROGGGGLHFHJGHEHINTez€„‡‡‰ˆˆˆ‰ˆ…‚€‚€zxxzp–——˜š˜—›šš™›�š››˜––“’�Šˆ‚ƒ~~~wxuyzvwvxyxwx{yw|v|z|‚€|}�€ƒ~‰‡‡ˆ‡Š�Œˆˆ†ˆˆˆŠŠˆŠ�‹‰‹ˆ��‡‰ˆˆˆˆ‰ˆ†‰‰‰‡ŠŠŠŠ‰‰‡‹‹‡‹ˆˆ‡‡†‡ˆˆˆ‡‹ŠŒ�‹‹‰Œ�ˆŠ‰†€‚…„ƒ�€„…‡…ˆ‡‰‡ˆ…ˆˆ†ƒ„„†‚‡‹‹…ŒŒ‡‡ŠŠ‡…†…ˆƒ‹………ŠŠˆ†…ŠŠ…ŠŒˆŠŠˆ†‰Šˆ†�†ˆˆŠ†‰‡†ˆ…„†�‚„€ƒ}z}…‰†…†ˆ‰‡ˆˆŠŠ†„†ƒƒƒƒ†€ƒ„ˆ†‡ˆŠˆˆ‰„…‚„„І‚…}Ї„ˆ„…z|‚Ž�‰„‚�zuqiffdggeddba_`a\_`]_`]J?=<<=:>=<<;9=>:@<===<<>;;;<=8@=;>Kezˆ‹‰……Šˆ…ˆ‡Œ‹Š�Œ‹Ž���ŽŠŠ‰Œ‡�„…��Š�Œ‹‰ˆ…ˆ�†‡†‹ŠˆŒ��„�ubXWYROSONQVRNPOPQIQTXWXWX[ZVLNKKKKPOTQTQJMGEJKEEGIIFGIEEHDDEBC@GFMMRROHJRX]XWQTSX\^^^YWRUYaf[WVXSNKFFGJ@CGFIQYgnntnsw€„„„�‚…ˆŠ‰‹†ƒ�‚x———–™—™šœ›œ�™š™™——’’�Œ††‚‚�~|yyzwuusnsqntuqvvx}€~€€|‚‚†����|€€€�ƒ‡†Š…ˆ‹����ŠŠŒŠ‰ˆˆ…‰……‹‹ŠŠŒ‰‰Š‹ŠŒŽŒŠ‡‰…†‡„ƒŠŠŠŠ‹‰ŒŒ‹‹�‹‹ˆ‹Š‹‰Š‡ˆˆŠŠ‡ŠŠ‹ŠŠ‡‡………†„ƒƒƒƒƒ�ƒ…„‚€€‚†…ŠŠ…†ˆ„…ƒ†…„‡†‡‰Œ‹ˆ‡ˆ„„…††…Šˆˆ…„†‡‰†‡‡ˆ‡…ˆˆ†‡„…„„…ƒ‚……ƒƒ†…~~~†ˆˆ‚~†…‚‡„‰‡Š‡„‚†‚|~„…ˆ†ƒ„„‚ˆ††‰‡ƒ‡�‰‡‰…€„‡ˆ„†‡„€ˆŽ”Ž�‰…yslideeecdgddecc_^^[^[_WK>:<>>>==;<;>=:<:;=Hb{‡‰‰Œ‡Š‹ŠŒ†…‰ˆŠŒŠ��ŽŽŽŒ�ŠŠ‡…‚„‰Œ��Š‹‘‹‹Œ‹Š‡Š…ƒƒƒ„�}|xsb`a]XZSOTYX[XYUVMMMYbb`[ej^YQQQMILNPSVPTPKHGGBGBGDDDHFGGKKGD@C@CACHGKFGDGMMQQSPKVQWPRTVQSY_f_adbcYQLLIHIBEFILV`djifow~……ƒ€‚ˆ‹�ŠŠŠ‹ˆ…~™˜—•—›—™™�š�ššš™™’Œ‰…�…‚~~{|z|{|wsuytusxtssuwwy�~|�€€…‚€€ƒ‚…†…„ˆ††Š‚ˆˆˆŠŠŠ‰‹��Œ�‹ˆŒŒŠŠ‰ˆˆ‡ˆ…‰†‰�‰Š‹‹ŒŽŒ‹‡ˆˆ‰Š†ˆˆ‡‹†Š‹�ŒŒŒŠŽ‹��ŒŠŠ‹‡ˆ†‡†Šˆ„„‚„„ˆ‡ƒ††„‚�€�}|{{ƒ…‡ˆˆ„ˆ‡ˆ‡„…„†‡„ˆˆ‡‰†€‚„‚ˆ‰Œ‹‡‹„„…ƒ‡‡…„……‡‡Š„„ˆ‡ˆ„„~‡ƒ„‚€‚ƒ‚€€…Їˆƒ†ˆŠ„……„……‚€„�‚€€ˆˆ‰‰‰…‰„„„…ƒ‡ƒ‰‰‡‹ˆˆ‡‡ˆ‰‡‡„ƒ~‚‡�’�Œ‰…„yqkhidhdcebbb`_```\_a]RB=9;>=<>?:;;?:?=9>>G_x…ˆŠ�ŒŒˆŒŒŒ‹ˆ‰‡‰ŒŠŠ��‹�Œ�‘Ž�‰‰ˆ�ŠŠŠ�‰ŠŽŠ‡ˆ|zokkikilsxtidjicb^WYZafcdb^VMNXbfX^bh^TXTVRPHJNNSMNLIJJGEFEFDAB?DIHMMKHGDEC@FGIGDCBCCGGMMPOPOPLLNQLJPU\]bfhbZTTQKHHHFELQSZbcigqx……††�‡‡‰‰�ˆŠ�ŠŠ†—•–™”™š—›››œœ™˜•‘�‡„…€€}z{|wx{|uyvswzxuvxyv|{~~|€€€�€�†�€€}�‡‡†Š‡Š�‹Š‹ŒŠ‡Šˆ‡‡ˆ‰‰‹‹‹‹���‹‹‹‰ˆ††ˆ‡‡…‹ˆ‹ŠŠ‡‹�†ŠŒŠ‰ŠˆˆˆŠ†‰ˆ‡Šˆ‹ˆŽ�‹‹ŒŠ‹‹‰‡„†‡„�{u|ƒ„€{x€ƒ…�„‚{}||~€‡„‡ƒ�†‡‡‡Œ‰‡‰‰…„‰†‰‚€„�…ˆŠŒˆˆˆƒ†ƒ…‚„…‚‚ƒ†„‚‚†‡ˆ‚…††…ƒ‚€{|€ƒƒ†ˆƒ‡†ˆŠ†‡‰†‡‡„‚‚‚‚†„„ƒˆ…ŠŠ…ŠŠ‡‰Š†ˆ†ˆ‰ˆ‰‡ŠˆŠˆ�‹Šˆ†…„Š“�Œ‰Š…�€xvpejdhfb^fddbb`Z^`_`UI?;=:;;=<>99;;<9?<;=EZw„‡ŠŠŠŠŠ‹Œ‹Š‹ˆŠŒ‰‹ŠŒ‹Œ����‘����ŒŽ�Œ�ŠŠŠ„ymeXRRPRPY[enljouuoke^cclrsptmfYQ^`][Yc^\VXWUZSOKILMJFFHIIKHEHIJDCCDKMILMINHMHLKIGHJBBBBFDGHIMNKLIGHJHGHLMPVZ\TQMSRMJHHDHLSQU]`bhnxƒ‡…ƒ„…‰ŒŽ���Ž‹‹Œ–˜––™šš›™˜›™›—•”��…†„ƒ‚|xz}vxyvttuqtrwvwyz}|€�ƒ„„‡†„ˆ„‚{~~„…ˆˆŒŠŠŒŒŒ�‹�‹‹‡ˆ…†Š‹ŒŠŠŒ‰‹‹ˆŠ�‰ŒŒ‡ˆˆ‡†‡‡‡‡ˆˆ†ˆ‡‹‹Š‹Œ‹‰Šˆˆ‰ˆˆ‰†ˆˆ‰�‡�ŒŒŠŠ‹Š‡…ƒplov€vnmv‚‚��€~€ƒ…�ƒ„„€…‰ˆ‹‡‡Š‰Š‰‡‹ˆƒ‡ƒ�‚ƒ‡‡‡‡………Š…‡ˆˆ„€€ƒ€€‚…ƒ‰‚…†‡……~~„‡…‡„…‚‡…ˆˆ‡‡ˆ†ˆ‰‹‚ƒƒˆ„‡…„ŠŠ„‡ˆŠ‹ŽŒ‹Œ‡‹‡‰‡‰ˆ‡‰‹�Š‹‰Œˆ‹Ž’ŽŒŠŠ…€~{rpkkefhfcdddab^^`a\VE?<=;==@9?=:;<:=;;@=?H\v†‡ˆŠ…ˆ‹‹‰‹‹‰‰�Œ�‹ŽŒŒ‹‡ŠŒŒˆŒ‹‹Ž���Œ�‹Œ„r[QMMNNKMGKLV]aelw|ywrnqpx||}€{vh_`cc_ZZ\VZXPX\\VLKIIDDABIGJGGKRRNNKLKNMILHKOPVQTMJJFFFFBGGCGEIGEFGHHJFCGHDIJIJJFIKIGEHDHHHQURTY^ahqzƒˆˆ‡‰ŠŽŽ�Ž�‹�‹�•›˜š˜–››™šœ™–•”�Š�ˆ‡ƒ„€~~wy}xvuuuosttw{x|€�…‹‰ˆŒŒ……~€}„†…†‡ˆˆŒ‡‹‹‹�‹�ˆŒ‹‡Š‰‹ŒŠ…‰‹ˆ‡ˆ‰ŠŠŠŠŠ‹Š‰ˆˆ‰††…‰‡ˆ†ˆ‰‰‰ŠŠ‹‡Š‹†‹‰ˆˆ†‰ˆ…‰‰ŒˆŠˆŠŠˆ†ˆ€qcbryseep{€„‚|z~€‚…†…‚…ƒ…ƒ††…„ˆ„„…ˆŠˆ‹Œˆˆ„„…‡„…†ƒ„…†…†‡„ƒ„‚‚�‚‚‚~�…†ƒ�‚‚€ƒƒ„†‡ƒ„†‡‚„†‰„†…ˆ†‹‡‡‡‹ˆ……ˆ„‡†‡ˆŠ‹Š‹�ŒŽŠŒˆŠŠˆŠŠ‹ŠˆˆŒ‡†‹‘““��‡‡€zxpnhifkggbbbecaa^`_SE>:?<;@;<==<;>:<8=;;=@C\x†‹ŠŠ…ˆ‰ˆ‰‰‰‰ˆŠŒŒ�ŽŒ��Š‹Š‹ŠŠ‹‹ŒŒ‘����ˆy[OLORPQMKIHEIKQTfr~„~|}}„„„‚ƒˆ|wkkqkd[ZWWVWTU^b^SEFG@?CCCEEEGPTUXWYRSSOLGIMRV\[XPPFGEGGGEHJEEFCCCCFCDEDEEFDFDFGCEEGFAEEEDGNLJMRTU]dpz€ƒ†…Š�‘��Ž�‘�‰––—˜˜™™›�™›š™””�Œ†††…†��|}y{x||vwvy|{y{}}}‚‚ˆ‡‡‰‡…ƒ~ƒ�†ˆ‡Š‹Œ‰†‰†‰ˆ‹‡Š�ЉЋ�ŠŒŒ‹�ŠŠŒˆ…†‡ŠŠ‰ŠŠˆ‰�ˆŠ‹Š‹ˆ‹‰†ˆ……‡ˆ††‡ˆˆ‹Šˆ�ŠˆŠ‰ˆ‡‰ˆˆˆ‰‡ˆ…†‡†ƒue^qywlbl{‚„|y{{€‚†ƒƒƒ…†……Œˆ†ˆ…ƒƒ~„�†ˆ‡‡†ˆˆ‡‰‰Šˆ‰†††ƒƒ†‚��€ƒ…~‚€€~}~„�€{~�ƒ„ƒƒ„ˆ‡†ƒ‰„†……‡„�€‚„ˆˆˆŠ‰‹‰ŠŠˆ‡…‡†‰ˆ‹ˆ‡�ЉŠ�Œ��‹‹ŠˆŠ‡‡‡†Š�����ˆ‰‚zqmggjifacabebea`_VF@==<>;@;=><<=BXsƒ‹‹ŠŠ‹‰Œˆ‰ˆˆ‰‹ŠŽ‡�ŒŽ��ŒŽ�����ŠŠŠ�‹ŒŒ‚pXNQWZZUMKIBDEEIJYdq|ƒ„‰‰…ˆ†‡ƒ‡„~okkswmc[VRXWXZakiVHDCCCFDDDBGORWZ][d_TOMMIIHSW\^\TNHGDCDGDGHIHDDDEFCFBAFECEDFDDCDFFFCEEDDDFEIGIHOKOVckr{v|�Œ�ŒŽ��‹…˜––˜™™™œ™žœ�šš’’‹††…„…~}}{{{|{}{z~~€€}€ƒƒ‚„‡†‡……�€€‚„„‹ŒŠŠŽ‰���ˆ�ЉŒŒ‡Š‹ˆŠŠŒŒ�Ž‹��ŒŒ‰‰‡…‰‡‰Š‰ŠŒ‰‹ˆŒ‹Œ‰ŠˆŠ†‰‰…‡ˆ…‡‡‰‡‰ŠŠ†‹‰‰Š‰‡‹Šˆ†ˆ„„„ƒxhep{~uglz†‡~€|‚€�€ƒ�„……„‡‹‹ˆ†€‚€…„…ƒ€€„‡‡ŠŠˆˆ‰ˆ‡‡ƒ‚‚ƒ{}{~€}y}{x}‚…‰€‚ƒ†ƒ‚…ˆ†ˆ†‡ƒ†ˆ‡‰‡……†„†ˆˆ‡‰‹‹‰‰ŒŒ‹ŠŠŠ�†ˆ‰‰�‡‹ŽŠŽ‰Œ‹ŒŽ‹‡‰†„‹���ŠŠŠ…‚}{smfmhfdcdcabcc`aTEA;@?9>;=;;>9;===<>;:9<;=><><;:=:=;:<=><::FXp…†‡ˆˆ†‰‰�‰ŠŠ�ŒŒ‘ˆŠŒŠ‹‰‰ŽŠŒ‘‘���‘Ž��ŠŠ‚qgkogSHDEBDGHCCCCGLUaqy„…ˆ……}{rg^Z]gmryrgbbhrsz}uj]]X]`_\TOIRYcdXUbg]SLJFFFHHONPNNPMFCDCDFDGFEBCEECHFFFFCFCD@CBECCECFGGGDGEFDFDEFCEFHMMTTW]k‡ŠŠ‹‡‚w˜––—˜š™˜›››—š–”����ˆˆ…€‚€€}z{{vxv||€ƒ~€…ƒƒ…ˆˆ‹‹ˆˆ…„„€‚ˆ‚…†Š‡ˆ‹ˆ‰‡ŒŽŒŠŽ‘���‰Œ‰‹ˆˆ‰‹ˆˆ�‰ŠŠ‰‰‰Š‹Š‹ŠŠ‹†‹Š‡‰‰†Š‰�‹ˆŒ�‰‰�‰Œˆ…Š…‰ˆƒ„…ƒˆ……ˆŠˆŠˆŠˆˆ‰�wy~ƒ{su~„……„‚ƒ„€‚ƒ�……ƒ„……‡†‰„‡‚………‚†‚€ƒ�…†„…ƒ†„‚~‚„{wvvxy€‚}wz|~„‡ƒ…††‰†‹‹‡Š�ˆˆŒˆˆ‰‡‰‰‰�ŠŠŠŠ�‹ŠŠŠŠ…Љ‰Œ‰Š…ŠŒŠŒ‹‹‰Ž‡ŠŠ‡‰Œˆ‰�ˆˆŠ‹ˆ‹�““‘‹‡Šƒ€}yrjfhgfgfbfcbc_VCA;@=<9<:>9?;:;>;;;==;=:;>AZp†ˆˆ‡‚„ˆ‡‰Šˆ‰ŠŒŽ�‹��‹Œ‹‰ŒŠŽŒ��‰�‘�‘‘��Š‚{xp_JDDGCGHEFBBDCFDNXapwƒ�~wqrpka`jpr~zvsspy|‚€toijhkojfd[YV`i`[RW_WPJEEFFGDIGHFGKDJDDAIFGEFBBDEECDDHFEDGDECECGADFEGEHDDEHEGGGDFDDHJKJOPSW]u€ŠŠŽˆ†—•—›˜™›�˜›�š˜–•�‹‰‰ˆ…ƒ‚~~~{{{v||€€…„‚ƒƒ…†ˆƒ„€�…‚‚ˆ‡…Š‰ŠŠ‰ˆ‡‰ŠŠ‰ŒŠ‹���Љ�ŠŠ‰ŒŒŒ‹‹‡‰†ˆ††‡‰‡‹ˆˆ‰��‹‡ŠŒŒ†„ˆ…‡‰ˆ…‰ˆ‰ˆ†ŒŠ‡�…Ї‡‡ƒˆ†‡„„Š‰Šˆ‰…ˆ„…|}zru‚…‚†‚ƒ…ƒ„‡‡‰„‰‡†…„„�‚ƒ„ƒ„„„…„‡†„ˆ†‰†‚ƒ|{sprxy�‚„‚‚††Š…ˆ„††‰†ŠŠŠ‹�ŽŠ‹‹‰Š‹‡†‰Šˆ‰Œ�‡ˆ‹‹Œ�‹Œ‰‰Š‡‡‡Š†ˆ‡‹‡ŒŒŒŒ‹‹‡‹Œˆ‹Š‡Œ‰ŠˆŠ‘•‘�ŒŒ†‚~yqkfchcebgbfc_QG>==?;=><:;>;>;>>>:>?9?:<=<@Ypƒ‹ˆ†ŠŠŠˆ‰‡Š‡ŠŠŒŒ‹ŽŽ��‹ŒŒŠ‹Ž‹‹‹��ŽŒ��Ž�ˆ†qVGGNNFHDEG@CCEECEHMZju|}uwvywmio||‚‚|||w}‚‚xtlnnkqsnrnhdcfji`URRUJFEBECEFICCD@HIGDHEHJGJFHGDEECCEFEGDDHDEHGIEGGGGEGFFFFGHHGGFFHJKNMOQ[VVct€…�‹‹…—š˜˜—›ššœ››˜™—•“‹Š†…ƒ‚€�€yz|yyz€„„„…‚‚„ƒ~€€{€‚ƒ††ŒŽˆŒ�Š�Š�ŠŒŠˆˆ‰‡Šˆ†ˆˆ‰‹ŒŒ��‰Š‰‹†††……‡ˆ††‰�‹‰Œ‰ŒŒ‹ŠŒŒ†‡……ƒ††ƒ††Š‰‰‰ŠˆŠ‹‰‡Œ‰†„…†††‰…ˆ‡ƒ„„}{yooy�…�…�…‚‡………‡‰‡ˆ„‡…ˆ……„…†„…ƒ„„€‚‡‡„‡„‰…‡‚€€�‚}|yqtx|„……‡‰‡‡Š‰‰‡‡ˆ†‡‡…Š‹ŠŒ‡‰Œ�Š‹ˆŠ‰ˆ‹‡‹‡‰†ŠŒ‡Œ���ŽˆŠ‹ŠŠŠˆ‰‡‹ŒŠŠŠ‹ˆˆ‹��‰‹Š‰…‡„‰�’‘��‰‡ƒ~yrjchefdbefd^SD?>@??=;;;>>=:::;;=<>;<:;?<=BRo}‚ˆŠˆŒŒ‹ˆ�‡ˆˆ‰‰Š‹‹‹���ŽŠ�����‹�Œ‰‹�Š�ދЄqWSX[RNDBJCDEGHGEGKIRau~wz}|row}ƒ„‚~€€}„€�}uoniiikmpjigggmoh\MKHHCB@BEFFGDD@BCEGGHFGKHEGGGHGFCGCCCFCFDEGHGGGFAEFGGGECFEEFGHHIKIRTOTTYYTWco|…‹�Œ—™––™›šš›šš™™–•�‹‹‡ˆƒ€~|{}wyxzzyz~}€~‚‚…�„‡ƒ€~€…~‚„„ˆ‹ŠŒŠ‹‹��Œ���Š‹‰‰Šˆ†ˆƒ‡…‰‰‹‡‰ˆ‹‰†‰†…‡…ˆ‰‡‡Š††‹‰‹ŠŽˆ�Š‰ŠŠ‰††‰ˆ†‡………‹‡‡Š‹ˆ‹ŒŒŒ‡‰ˆ‰ˆ‰…†„‰�‚}xtjozƒƒƒ„‚ˆ‡„……………ˆ†…ƒ…†ƒ……†ˆ‡ˆ†„�ƒ……ƒ„‚…†„…‚…„‚…ƒz{x|~|€…‡…††ˆ‰ŠŠ‰‹Š‰Œˆ†ˆ‰‰…ŒˆŠ‰�ŠŽŠŒ‰ŠŠŠ‰‡‡Œ‡Š‹‹‹‹Šˆ�‰Œ‰ŒŒŠ‰‰ŠˆŠ‡Œ†‰Œ�ˆ‹ŠŠŒ‹†‹���‹‰Š‡‚{zrjghgddabd`SBA@;?=<<==<==:;;<::;<@CCHFFHFDGGFIDHGGHDDEEEDDDAAEDHCDDIGIDHEEHGHFKKKNMPRRQXZ^WVZfv~†Š�™—œ™š›˜š›———–˜‘��†‰‡„‚ƒ||zzvsuy{yw}~€ƒ‚€€~�ƒ‡…‰‰‰‹ˆˆ‰Šˆˆ�ŠŠ����‰Š‹‹‰Š‹Šˆ††‰…‡…ƒ„„…‚…‡…ˆŠ‰ŒŒŒŠ‡‡ˆ†Š‰ŠŠ‡†‰ŒˆˆŠŠŠ‹ŠŠ„†‡ƒ†ˆˆ‹ˆˆ‰ŒŒŒ‰‰ˆ�‹ˆŠ†…ƒ‚|ywsy€ƒ{}ƒ…ˆ‰‡‡‡†„‡‡„†ƒ…ƒ�‡……„†ˆ………„†€‚„„‚†��~|‚„ƒ€€~z€€„�‚€‡†‰‡Š‰‰‰ŠŠŠŠ‹Š‡†‡‡ˆŠŠ‹ˆŒ‹Œ‰ŒˆŠŠŠˆ‰‡‰‹‰…‹ˆ‹ŒŒ��Š��Š‹ˆ‹‡…ŠŠŠ‡�ŠŠ‡‡ˆŠ“’��ˆ††}|usigggfdcd_PE??;@>:>=>;;>?;;;=;;;<:@<8=>;>CUl‡‰…‰…‰‰ˆŠˆˆ‹Š‹ŒŒ�‡�‰ŠŠˆ‹�Ž�Š�Ž���‹†�~„�wv||zpd`]`bbghhb^ehhip‚…††„„ƒ€}€‚†‡ˆ†„‚€„†††€yqg_koi[VXXWYbmoh^RKIDDCCDADDBD@D>BECICGGEFGDFEBEIEFIEEEDFBBAABBCCBHKGHEKLJGGILOOSOPQORPVZXY\ait……ˆ˜–™›ššš�›—˜–”’“‡‰ˆ„‹…€‚~zvvyy{{{{|z}€~~{zz~€…†…‹Ž‹��އ�‹Œˆ‹ˆ‹‹‹…‰‰ŒŠ�‹�‹��‹Š‡‰‡…ƒƒ†„�†…‡‹‰‰��Œˆ‹ˆ‹‰………„…†…‰‰‡Š‰‰‹ŠŒˆ‰‡‹…†‡ƒ…ЇˆˆŒ‰Š�‹ŠŠ‰‡‹‡‡†€�€~~{{ƒ†‰Š‰‡‡‰ˆˆ…†ƒ‚„‚„„ƒ€†‡ˆ‡ƒˆ†………†„‡‚€}uz€„†�~‚‚}€�€‚€}~�€„†‡Š‡ˆŠŠ‹Œ‰�‡‹‡‰‰‰ˆˆˆŒˆ‹ˆ‰‰��Š�ŠŠ‰‰‰‡ˆŠ‰‹Œ‰ŒŽ‹�ŠŒ�Šˆ‰Š‡‡‡Š‹‹…‰�•–��ˆ‹…xsojefgfge^PC@A=?;?;;<<8<<::=?=<;>=:?;=<;;>CWk„„ˆŠ‡‡†Šˆˆ…‡‰‹‰ŒŠ‹ŽŒŒ�‰Š‹ˆ�‰‹��ŒŠƒvkgimkhow|…€|wrqswsyxx{vw|~{}�‡ˆ‹‡„ƒ††„†‡ŠŠ‹ˆ‰…‚…‡…„}tha`gne^VUU[X`msslaZRMJKIHED?BC>B?CDB@GCFFDGEEEDDDDGDHHDDDKCFCECD@FGHHIILINGLLPNORQMLMMOSWX[Xaerw€ƒ™—™™œ™š�›˜—–—“�ˆ†…„‡�}|€€~y|}�}€��€€~|yw{z{ƒ…‰‰Ž‰�‹�ŠŒ��Œ�‹‰‹‹„†…‹ˆŠŒŠ�Œ�ŠŠ‰‡†Š†Š‡…‡‡‡‰„‹ˆˆ‰ŠŠŠŒŠˆ…‚†ˆˆ††‡‡‡ˆ…‹Š‰Š‡‰��Šˆˆ‡‡†……‡‰‰ˆˆˆˆ…‡‡‰‡‹ˆ‡…†„„€~}‚„…‡†„‡ˆˆŒˆ‡‡Š‡„‡�€„…‚„‡…‚ƒƒ‚†‡†…‚}{{y‚€„‚~ƒ��ƒ€�€}}~€‚‚………Šˆ‹‹Š‰‹‹‰�ˆŠ‹‰‡ˆˆ†…‡ˆ‰‰�Š‹�ŒŒ‹ˆ‰‡…‹‰‡ŠŠ‰Š‹ŒŒŒŒ‹ŠˆŒ‡Œˆ†‡‰Œ�“��Š�ˆƒ{tshhhghh_P>C<@>=>8>;;;>;9;;>7><9;><:<:=:;@BYmzƒˆˆ…Ї‰ˆ………ˆ†Š‡‰‰Š‡��ŽŠ‹‹‹Œ‹‰Š„ygVMJNNMT\fp|…‚€zwuxwuw{…ƒŠ‰……Š‹ŒŠ…|„ƒˆ}…ŽŒŽŒˆ††…„xj]VQVZ\XXQRUU\^lw||qjaZ]USMLFDCCC?CACBEDBDECCGFEDDCDFDFIFDDHHFHHHDFFGEGFFNNIIJKLMNNOQLMLJMSUUW]djt|}•˜•™˜™™š›š˜–”“�ŒŠ‹ˆ�‚||}~€z|ƒ€„„†……„„„‚‚}}y{|†ˆ‡‡‰‹‡‰‰‹ˆŒŒ‰��Ž��ŠŠŠˆŒŠˆ‰‡‡ˆŒ‰‰‡ˆ‰ŒˆŠŠ‹ˆŠ‰‹ˆ‡…‡‡†„‡ˆ…‰}}ƒ‡†ˆŠŠˆ‰††„ˆ‰‡ˆŠ‹Œ‹‰ˆŠ‹ˆˆŒ‰Šˆˆˆ………€„…†Šˆˆ‡ŠˆŠ‡ˆ……ƒ‡……ƒ…‡‰…†‰‡‡‰ˆ‡ˆ„„…ƒ†‚€„„�„„††…�€€ƒƒƒ‚‚~~€€��€�‚ƒƒƒ……‡„…‰‡ˆˆ‰‹ŠŠ‰��‹‰‰††Š†„‡Š‰‰‰Œ�‹‰‹Œ‹‹Œ‹‡‰ˆˆ‰‡ŠŠˆŒ‡Š�‰�‹ˆ‡ˆˆŒ‘��Œˆˆ„ƒ{wukihjddQD>>C<>==:?;?;;9><=<<=<:<9=;9;=<<@DWhz‚†ˆ„Љ†‹‰†‡ˆ‰Š‰‰‰‰†�‹ŒŽ‹ŽŽŒ�‰†ziXPICHDGBIPbr|‚{mfe``acis…‡‡ŠŠŠ��‹„||€}tu~‹‹��Œ‡‡|mXMHEGIKMKGIOPOYbpw~‚zpkghZ[UQIHHFFFDGEHHGFDDDAJDGBFDGDEFEGGFGIHFGFFCHIDEGHJJHIKILGKKKKLJLLRNWRY_gtu}™˜˜–˜š˜œ˜™—˜–‘��ŒŠˆƒ‚…}ƒ…„……‡„„‡…‡‡†„„‚��€‚ƒ‡‹‡‰Š‹‰ŠŠŠˆ†‰Š‰‹‹‹�‹‰ˆ�Š��Š‹‹‰‡‰‰…ˆŠ‰ˆˆŠŠŠŒ�‹�‹Ž‹Š…‚zz}€wmnvwsw~‡ˆŠ‰‡‰ˆˆ…†ˆˆ‹Šˆ†ˆŠ‡ˆ†‰‰Š‹†…†�‚�‚„‚ˆˆ‰ŠŠ‡Œ‡‰†‰‡‡‰‚†…„†…ŠŠ†Š…‡ŠŠŠ‡ƒ„…‚…‚~ƒ„‚€ƒƒƒ€‚‡…‡„…€€��~€�|ƒ‚�€„‚‚†‡„‰‡ˆˆ††ˆˆ‰‹ŠˆˆŠ�ŒŠˆŠ‡‰†Š††ŠŒŠ‹‰�ŠŒ‹ŒŠŒ‡Š‹ˆˆŠ‡‡‹‡‡ˆŒ‹Š‰‰†‹Œ’��‹ˆ„€€zwomijebQC>@<>>==>;=>:99<;;=?89;=::<:<9:=>ALUh|……„……‡‰‡‡‡ˆŠŠ‹‰‰‡ŠŠ�‹ŠŒ‹Ž�Œ�‰�rf_RJLIGEJJOYcpmbUPOOOKOTcr{„€‡…�‹‹�ˆ�~~uz{…‡‡‹ˆƒ�|xmXLIIFJGHDGGFGDJOXlx€†wsug_XQNJIIIGGGKKPPJIFEGDDDEDGGGEDFFIEEGHGGFDECEEGDEIJIIIGIKFFGHKGJLKMNUV[eks|™š™™™››šš›––•‘‘�ŽŒ‡ˆ†ˆŒŽ��‰Œ‰‡ˆˆ†‡†‚€‚x€�……‡ˆŠŠ‹Œ‹ŒŽŠŒŒ‹Š‹�ˆ‰†Š‡‡…‰‰‹ŒŽŒ‹ŒŠŠ�ˆˆŒˆˆ‰†ƒˆ‹��Š��‹‹„zhjolb]``^bcq|€‹‹ŠŠˆ‰ŒŒ‰†ˆ‰‡„…‰†‰‡‡‡ŠŠˆ‡„……‡‚€ƒ…ˆ…ƒ‡ˆŠ†‰‰ˆŠ‹ŠŠ‰‹Šˆ‡††††‡…‡ˆˆ„…„‡†ˆ†……�ƒƒ‚‚€…ƒ…„€����„~…‚…€|€€‚€„…‚„‡‚ˆˆ……‰ˆ‹‡†‡ˆ‰Š‰‹ˆˆŠ‹ŠŒ‹‡‡‰‹ˆˆ†ŠŠŠ‹‹‹‰��ŒŠŽ†ŒŒ‰‡…Š†Šˆˆ†ˆ‹‘’’�ЇƒƒzunmggeQB?=>??;>?;<>99=8?9;<==;>9;:=;<>9<=DMVj{ˆ‡…………†…„…‰ˆ‹‰Š�����Œ‹ŒŽ‰ŒŠŠ†|tqh_XYTRRTSZ`a`XTOJIGKGJO^my€�…††…†…€€„„‚†………‡‚|{vqe[VUSRQKFIDBBEAEGWgv}{xvpcWRLKJFKHGGGGLSPLMFDIGGEBGDDDDCEHFHIFFGDDFBD@DBGGDIJJKLFIEBFEDGGFGMMOOT[ap|š–™œ™›š™™˜—œ“”•�ŽŒ‰‹Ž�’“‘���ŠŠŒ‰Œ‰„€ƒ}||}�ˆ†ƒ‰ŠŠŠŒ�Œ‹ŒŒ��Ž�‹‡‰ˆ†„Љ‡Œ�‹�‹ŠŠ��‹ŠŒ‹Š†‹ˆŠ‹Š‡�‰Œ‹‡|kccb^ZVZ^_^blx�„ŒŠŠŠˆˆ�‹�Š‹ˆˆ‡‡…†…††‡‰‡„……ƒˆ„ƒ…Ї‹ˆˆ‰‡‹…‡‡…ˆˆŠŠŒ�‡Žˆ…Љˆ‡…†„„‚…†„„‡‚…ƒ€„„ƒ�…ƒ€€‚|‚†††‰‚ƒ€~‚~€€€�€†††‹‡‰Œ‹‰‰„ŠŠ‡‡‰ˆˆŠ‰ˆ�Š‹‹‹‹ŠˆŠ‡‰ˆˆˆˆ‰Œ�‰Ž‰ŠŠŒŠ‰‡‡†‡‡ˆ‡‡Ž”‘�ŽŠ‡ƒ‚~wqmffPE??>?<=><<=;>:::;<:;=<<:;<:8;8;<;;?HQVfy„‹ˆ‡Š†ˆ………‡ˆ…‰�‰ŒŽ‘���ˆ�ˆ†‡†�}wqhg^^aa]\aehd[NNNIHKKLNW]j|~�ƒ‚��ƒ……ƒ}ƒ‡‡„ˆ‡ˆ‰‡‰ƒ�|xxslcdaZ[NNKLGJFEEENWajiha\UMDJFEBEGEFEFHKLLIHHKKFEFFJHEGGEGFHECFGECCACBEAHDFGIHIIHHDHFHHIGHGGIIINOScn—˜›–›™�›˜™››––””��’�’����ŒŽ���‹ŒŠŠˆ‚ƒ‚€ƒ…ƒ††„„†ˆˆ‰…‰�‹‹ŒŒŒŒ�ŽŒŠˆ‰ŠŠ†Š‡ˆˆ�‰Š�‰ŒŽŒ‡ŽŒŒ�ŒŠŠ‹Šˆ††�vllmd[^cjknqwy|€„‡ˆŠ†‡ˆ‹‰‰�‹‰�…‰ˆ‡‡‰ƒ†……‚ƒ„„‚„‡ŠˆŒŠ‹‹‰†„†‡ƒ…ˆ„†‰‹‹�ˆŒ�Љ‹‰‰„……ƒ€……ƒ……„‚‚†‰……ˆ…‚ƒ€€}‚……‡„ƒ‡……„�ƒ‚‚~~~��‡‰…‰ˆŒ‰�‰��‰Š‰‰‰‰‡†ŠŠ‹‰Žˆ�‰�ŒŒ‰ˆ‰ˆ‰Š‰ˆ†‹‰ˆŠŒŠ‹‹‰Œˆ†…‡†Ž�‘ŽŠ‹‡‰ƒwqmdSA?>A;C==;@:;<<<<<<=8:<;::>::;;9=;;A@====><;;;?:<;<<<>8;9;=;:<9<:;;?FPNUap€…†‰‰‡ˆ‡�Ž‹‹‹‰‰Š‰††ƒ}xokqupe\SPLQSY]YY]__df_]XWUWY_bee`emyƒ„‰†……†‰„ƒ‚}~|€„ƒ„‚ƒˆ‡��€stuofaUQNVWVY_bch_[_bUSPQJDBBC@DCAEEEDGFGDCBDDAGDFGFJHJMS[a`ZYUUTPLGELIIKFEHGHIEEGKGMHNILHJKNPKOOJJHKM—™š™˜˜š—š˜–˜••’“•”“’�‹����‘ŒŠ†ˆ…‚…|ƒ}ƒ………‹�‹Š�‰‹‹ˆ†‹Šˆ€|€ƒ…‡‡‰ˆŒ�ŒŠ�‰��ŠŠŒ‡‡ˆ‡‹†‹‡Š‡‹‰ŠˆˆŠŠˆˆƒ……€}{|z�‚‡‡‡�ˆŽˆ‹ŠŠŠ‡‹ˆ††‡‡†ŒŠŠˆˆˆ‹‰††„†Š†……„‡…ˆ‰‡‡‚ˆŠ†ˆŒ‹�ŒŠ�ˆˆˆ‡†„ˆ…†‡„ˆ‡ˆˆ………ƒ„‚€‚€………�‚€„ƒ„„‡„…„†ƒ‚‚„‚„€†„„„€{{‡„~‚…�‰ˆ‹‰Šˆ‰‰��‹‰ŽŠ‹‰ŒŠˆ‡‡‡ˆ‡Š‡ˆŠ‹ŠŒ‹�ŠŒ‹ŠŠŠˆˆŠˆˆ‰Œ‹‰ŒŠˆ‰�–’�Šˆ…ƒ}wupVD>?A=?<>?<<<=;<8=>;;;;<<<:;;7;;9;<==?GRRQ^uƒ‡„ˆ‰†‰‹‹Œ‡�ŒŒ��‰…�|{ulioso[OJKKMW^b]X_deiggdeihlednspomrw~�„ƒ…‡…Љƒ}wty{|qrmiqz‚…{nqvtkcWMPWZaacmrqjjooga^]VHCCDDCACFFDFEIHHGGGEEFDGHDEFIHQ`gfg`gcaZWMMNRRPHFIRNOKIKLQRQNRKIMJLOTPSRQNHJ—™•››�œ˜š˜™š•–“’•—–“�”“—��‘�‹Œ‡‰‡�‚�|‚€‚Ї…ŒŒ‰ŒŒ���‹Š‰�uv€†Šˆ…†‡ŠŠŠˆŒŽŠŠ‰‡‰ˆ‰‰„‡…ƒƒ„ƒƒ†…‚…‰Š‡‹‰‰ˆ…‚ƒ€€€�‡‹„Šˆˆ†‹‰Š�Љ‡‰ˆ‰Š‡†‰†ˆ‰†‡††�†„‡ˆŠ…ˆ‰……†…ƒ„…†‡‡ŠŒ‡Š��‰‹ŠŠ‰‡…„ƒ‚ƒ†‚‡†‡‰…‰„…€†‚……ƒ‚€€ƒƒƒ………†‰…„�„�‚‚ƒ€……‚€~~€~€„†ŠŠ‹‰Š‡ˆˆˆ‰‡Š‹Š‡ˆŽŠ†ŠŠˆŠ‹†Šˆ‡Š‰‡‡Œ‹ŠŒ�‹Œ‡Œ�ˆ‡ˆ‹‰ˆ‰‰ŠŠ’’’ŽŒ‹ˆ…zwaI>=???>?<@?=>:<<:::=>:<:99;:>9:;<:7?@;@>;==<=?;;=<<;>;:<<=;=:;::====;;AGRTTS_s…‹ˆ‰ˆ‰‹�ˆˆ‹‹‹Šˆ†„‡ƒ‡‡…ˆ�zud[ZZ[bksyysrpopzz{€€�rmlkiv|‚€…†ˆ‡…x}{skZWUZ]YTNIINQ]hhiqw|uobVVcnwwxv|zzzzuqtrbRHHHDECDDCCDGFHJJMLLHIGKGEDGADJJMNUZ]_b\VSYZYSPR\de^]Zaeeijmge`UZRSTVTWWY]Z˜š–›˜—›œ™šš›—�‘�������’“��‘���††‡��€…„‚‡ˆˆ�‰ŠŒˆ†ŒˆŠˆ‡†ˆ…lkyˆ‹‡Š‰‰ˆ†Œ†‰…ˆ††‰‹…‹ˆ…‡†‰ˆ‰ˆˆ†‡†„…‚†‡ƒ‡ƒ††††ŠŠˆŠˆˆ‹‡ˆ†‡…†……Ї…ˆŠŒŒŠ‡Š�‰ˆ„†‡ƒ„„…ˆ…‡‡††…†‡‡‡‹‡‡ŠŠˆ†ƒ‰…‡‡†ŠŠ‰ˆ‹‡ˆˆ‰ƒ†€ˆ‚|vv€€€�„„ƒ‚„�„…†ƒ„……‚‚ƒ�‚ƒ…ƒ‚~…†ƒ�~�||~€ƒ……ˆ‡ˆ‹‹‹�‰Š‹‹ˆŠˆ‰‡Š‡ˆŒ‰‹Œ��ˆŽˆˆ‡ŠŠ‰‡ˆ‡Šˆ‹Šˆ‹Œ�Š�Œ‰‰‰�“�Œ‹Š„ƒ�rS=?>>B<>;;><==?=<;=<<:>=>B;:<=>=:@>8=8::=9<;<<9<=@KSVXRS_p€…‡‡‡‡‡‰‰Œ�ŒŽ‰Œ�‡Œˆˆˆ‡‡„|y{{{|~|‚ƒ~€�‡xvuumy‚‡‰‰…yukipwƒ{}‚€xsmne]TVUTPJKMKNQS^bly�~|ug_W\gq~‚ƒ}~zz~x]PQTXQMMFFDFFECHBEEFNKIJJHHDFHGHIHDIIHCFGGFFFEEGDIHGQW`fihgjwv{{}€}~|zvrikkbgkkp—˜—™�›š››™—”—‘’—–”””•’‘����‰Š†�€}……‡Š��ŠŠŒˆ����ŽŠ‰‹‰ƒukm{…ˆ‰ŠŠŠˆ‰ˆŠ‰ˆ‰‰††††„‚�„„†�†ˆ…‰Šˆ‰‡‰†‰‡†ƒ†ˆ…†„†ˆ‡�ŠŠ‰ŠŠ‰Œˆˆˆˆ†Š„ƒ„ˆ†‚†‰‰…‡ˆ�ˆ‹Š‰‰†………†Š…‡‡ˆ‡‹Œ‹Œ‰‹‡ˆ‰‹†ˆ‰…‰Š†‡„‰…†�xu{~‡‚|}‚‚„†………‡ƒ†ƒ‚„�‚‚{|~~€�€{}~…„„‚„„ˆ†Š‰‰‰‰ˆŠŠ�ŒŒ‡‹ŠŒŠ‡‰‡‰‰†‡‰‰‰ˆŠŽŠ�‹�ˆˆ‰‡Œ†…ŠŒŠ�ŒŒ“—“�‰‰‚~hG:=B>?@>?><=>==<;<<>:>:<=:>8<:<:==8;=9GPRVVTTYr€†Šˆ„…†ˆˆ‰‰�‹‹Ž‹‹�‹�ŠŠ‡‡…‚ƒ†„ƒ„ˆ‰ƒ€„…ƒ€|sccqz€‡‡ˆ†‚ƒywx~€u€�€zwsumfc_^ZWTRYZZ\^dkvy|€~vmechqy€ƒ„�|xurcOEDHOPNMFFGJFCCBBBHGHHHIJGEB@BIDFEIONPJGKKFGACADABDAAGNSX[\glpv}€€„…ˆˆ�€~|{xwx{}–˜—›š™›š››–•——™˜——”™’•�’�Œ�‹‡†„ƒ„��ƒ…†‡‰‡ˆˆ‹‹‡‹‡‹��Š�Œ‰‡|ro{„‹Œ†‰Š‚ˆ‡Š‚„‚}~ƒ…‚€}�€}{}}|ƒ†††‡‰Šˆ†ˆ‹‡ˆˆ†…†‰‡‡…ˆˆˆ†ŒŠ†‡Š‰‰ˆ„ˆ„††……‡…†‡‰‰ŠŽŒ‰Š‰‡‰‹‹††ƒ†„ˆŠ…‡‰�ŠŠ‹�ŠŒŠŠˆ‡‡„‡†ƒ‚…ƒ{z„…€€€‚‚€�ƒ„„€�‚ƒ‚�„„„†…†ƒ‚�€~{€~wzx}ƒ…„ˆ‡ˆ‡Š‡‹‰„‰ˆ…‹†ˆŠˆ‰ŠŽŽ‹ŠŠ‰‹‰‰†‡„Œ‰‹Š‹Ž‹�‹�‹ŠŠ†‹‰ŠŠ‹‡‹’”Ž�‹ŠƒuP>?<@?<>>?;?><>;=>;@;?<;8:=<9>;>8;<;:>=JRTQUVRYr€‡ŠŠ†ˆˆˆˆ‡‹‡Œ‹Š�‹���‰�‰�†‹…І‡ˆˆ‰…|syx€€zePWfmquz}„„†ƒ†‚…†…�†„„y}|xupjlljgchfjmjoquwz†‚€xtsuu{„‡��€}ugZKBCCHKPUQJHNHFACCGFGGHHGIJG@@CB?DIHLYXVMPKMJGBBB@@?D@BEEKOVW[dlux|€ƒˆ†ˆ…‡…„„€ƒ‡ˆ™™™›››››œ›˜™™™šœ™“—“–���Œ�ˆ†‡ƒƒ��……‰‹‹‰�†Š…ˆ‰ˆ‹‰‡‹Œ�І„~usuƒŠˆŠŠ‰‰ˆˆ‰‚{vqv{‚z}~~}‚~yyy{‚€ˆƒ…‡‰…†††ŠŠŠ†ˆŠ††„…ˆ†…‡ˆƒˆ†‡†…‰‡…‡†…‚‡…†„……„�†‡ˆ‡ˆŠ‰ŠŒŠŠ†††ˆ†„†ŠŠ‰‹‰‰Š‹Œ‰‡Šˆ†‡�†ƒ„€ƒ|}}„€‚‚……‚†„‡�ƒ€„‚„…ƒ†…‡†„†„ƒ~}}www|�…‡ˆ†‰Š‹ŠŒŠ�‹‹ŠŠˆ‰‰ˆˆŠŠŒ‹ˆŠ�‹ŠˆŠˆ‡‹‡Š‰‹‰‰ŠŠ‹Œ‹�ˆŠ‹‹‹‡†���‘Š�‡W@AA=@?;>>;=>>;:=<9=:<;;;;<7;;9;BKTTTRTVXk|…ŒŠŠŠŠŠ‹‰�‰‰‰†‹‹Œ‹�‹��‹�ŒŽ‹ˆ‡Š‰†{hZ[`mvnZJNUYZ[biru}}„Šˆ‰Š‹�Љƒ�€{yurrw|xstyz}{}{€~…†„„ƒ‚€‚ˆŠŠ†…€zj`SGHGJNWZ\UUVPJFFFCBGHIGJHHJFCDB@DFLNW\YRQOOMICEEHFDBDEADGJKROSYadow{x€ƒ�ƒ†ƒƒ‡‰‹Œ•—œ™›œ›™—›š˜˜›œš˜˜—“�‘�‰‹ƒ„€|„„…‡ŠŒŽŠ��‹�ŠŠ‰Š‰ˆ‰Š†‰ƒ€}vkv{‚‰‡ŠŠ‹‹‹Š†‚{ojt€�|€‚�~ƒ…~€zyƒ„‡„……„‚‚†…†‹‡‰Šˆ†„…ˆˆˆ‰ˆ„†„‚„ƒ…„…ƒ…„ˆ‡‡ˆŒ‹‹‰…ˆ‡‡…ˆ‡‡ˆ‡Š‡ŒŒ‡Œ‰Œ†‡‰ˆ‰‡‰†ˆ……ˆ††ˆˆ‡ˆˆ……‚„€||}|€�‚†„�І‰„…‚ƒƒ……€ƒƒ…‚ƒ†„‚�|~€~{||}‚‡‰†‡…‰‹‰�‰Œ��‹Š‹ŠˆŠˆˆ‡‰ˆ‡ŠŠ‰‰‹ŠŒŒŠ‹‰Šˆˆ‰‰‰Š�‹Œ‹�‡�‹‡ˆŒ�‘Ž‹‹„jA>?>A?@=>=>;=>=;;>>;;;>;==:?9;9;?:?:<::HRVWUVVSXi|…ˆˆ†‰‰ŠŽŠ��‹‹�Ї‹‰‰…‹‰Œ‹�‹Œ�Š‹‰‚qWFLR^caWONLQQQSXXbdq{‚‚‰Œ‹ŠŠ‡‡†~upuwz~€zz}}„†ˆ‡‡‰‡‡Šˆ††††……‡ƒŠ‹ˆ‚„tjcUNUV]`dgc`]ZTPROGEBHHLOPRRKMNIKONTRSWYYRNPNKFGKFKHFEDFFKJMMMNSUX\gjntzzw|}�‚ˆˆˆ˜˜™šš™�—šš™™˜™šš–—–’‘��‰‡�}}{}{€‚„…ˆŠ‰ŠŠŽŠŠ��‹‹Ž‹�‰Š†……‚|slnr||}‚„…ˆŒ‰‰‡xjnzƒ…��}zz|�€{w|‡‡‹ˆˆˆ…„……„††‰„ˆ…‚…‡ˆ‰‰†ˆ†‡†‚†‚ƒ‚‚‚€‡‡‰‹‰ŽŒŒŒ‰ˆ‰…ˆ‡„ƒ‡ˆ‡ŠŒ�…‰Š‰ŠŠ‹‰ŒŒ„…ˆ……�ƒ‚‚†ˆ‚€€…‚~~~€�‚‚€‚ƒƒ……ˆ„‡ƒ„‡……†„…„„€‚�‚{tz|~€‚€†„ˆ…‰ˆˆˆˆŒ‹‹‹ŠˆŒˆ‰Š‹‰�‡‡‰‰‰‹‹‹‰Œ�‹ŒŽŠ�Œ‡ˆŠŠŠ‡Š‹‰‰‹‰�†ˆ�“”��ˆzM>>??>?=@>;?==?=::><<<<<;9<;<;?:<:>9=9?AJUVTWWVTZk~……‡‡‚‡‡Š‰Œ‰‹‹�‰ŒŒ‰ŠŠˆŠ‹ŠŠ��Š��Š‚fNJMS[^\ZSRRQPMJOJRR^fjkv~…‡„…‚„„zojqy}}{{x€„‡‡‡…ˆŒŒ�ŠŠŠ†‡…„‚}zƒ€zzxzvo_Z`hmomqooh^ZZ[XQHGNMS[[^\]^][\a__WRT[[[VTPLFDGDLGGGBJGMOPMQSRNQW^binrtquwwƒ~~~›™šš›œ™™™›šš™–˜•”‘’’‘�Ї†‚�}~~ƒ‚І†ˆˆ‡‰Š‡ˆˆŠˆ‹‰ŠŒŒŠŒ„‰„„xidjospvv{€‚ˆ‹Š„qhl€ƒ‰ƒzwnmorssnrˆŠˆŠˆ�ˆ‹‰Š‰ˆˆˆ…ƒƒ‚‚€†„‡††‰‡†‡‡„……€‚‚‚…‡ˆ‡‡‡�‡ˆˆ†ˆŠ‰ˆˆ†‰‡†‰‰ˆ‡‰‡Œ‡‹‰Œˆ‹‰Šˆ‡‚„€…ƒƒ��ƒ����‚�……………€‚ƒ…‚‚ƒƒ†…„�†‡‰‡ƒ„…€zxwzz�ƒ�„„ˆˆ‰‰ŽŠ‰‹‰‰‡‰‰‡ˆ‡‹Š‰‹ŠŠŒ‹Œ†‹ŒŠ‡ˆˆˆ‡‰ŠŒ‰Š�ˆŠŠŒŠŠˆ‹‰ˆˆ„‡‹’““�…_>A@@?@>>==;;?==<<<=;<;>:<;<<<9<<<>:;;9@GPTTYTVVTZh}‡‰‰‡‡‡‰…‡‰‰‰Š‹‹���Š���Љˆ‹‰‹‹‹‡~cSS[]aab\YZYYUPLLILNZ`_bmx|}~�~‚wlgq}€€ƒy{y|ƒ†…€~…‰���‹Œ‹‰‹�ughlkkkeineXWdsz{twrnc\RWXVPKHPRYchpnpmmplpqmcUY_dggaYOJECDEFDEGIJSRVUVWYVSU]cgotvpqq{{vxx™›š—™š›—œ™š›™™›”“����ˆŠƒƒ‚€€ƒ‡„ŠŒŒŒ‰‰ŠŒ‰ˆ‡ŠŠ‰‰‡‡‡†ˆˆ†…~na]aipqimuw~…‡‡pdkx„‡oifefggbgq{€„„ˆ‰†‡‰ŠŠ‡‰ˆ†……ƒ„†€ƒ€„…‚†‡…ƒ‡‡„‚…ˆƒ‚„„„†„„…‡‡‚†…‡‡ˆ†Š‡…‰‰ˆˆ…Š…‡…ˆ„„‰‰�‡‡…Їƒƒ�ƒ„|}€ƒ~€‚ƒ‚€‚…‡„‰„ƒ�„‚€�‚�‚�„~€�ˆˆƒˆ‡ƒ�~~�€†ƒ‡…‡ŠŠ‰‹�‹‹Šˆ‹ˆˆ‰Š‰‰Šˆ‹Œ‡ŠŒ��‹�ŠŠˆˆˆ‰‰Œ‰Œ‰‹Š���Š‹�Œˆ‡…‡‹‘‘�‹nF>>>=><@;;<;??<:9<;?=<<;;::=?9;;?A=AC>>?;A;;<>>>>;9==;:;=<;;8=;<:<9?@?;=>:@:<:<>9=::<<:=:;;<:><;;<<=FPVXWZUWZUQSez…ˆ…†ˆˆ‹‹Š‹ŒŒŒŒŠ‹ŒŠ�Œ����ŽŒ����Œ‹ƒ„x{}€€|~€}~vyzuprrvxzvy|ƒ†‰Š�‹„††�€€�}wkjittsninqutsk_RSNGIGGEGGFJCFFHIW`][XWRLGGGEAAD@A>AER_mw�„‰‰‚}€�|��ƒƒ‚�r_WURXX^XURTU][\aenrvsxy}‚„„ƒ�€~|zsq˜˜–›—š›˜››œ—˜™™–•—–��މ‹„‡‡Š‰ŒŽ‰Š�ŒŠ‹Š‹ŒŽˆŠŠŠ‹�‰†‚€se`YT[couv{{}~…††‰ˆ‡…}qr|‚‚€ƒ|ƒysmu{€�ƒ……‹�ˆ‡Š‡†‡„…‡‡…†‡………Š…‡Š‡…††…‚���|‚…ƒƒ€€ƒ‰„ƒ……ƒ€€„‡ƒ††„‹‰‡ˆ…‰ˆ‡‡„‚…ƒ�‚~}ysqtuuu}zz€ƒ‰‚„„ƒ„~€ƒ‚‡„†‚„†‡ˆ†„„ƒ†ˆ…‡‰‚Š…†ˆ‡ˆ‰‰Š‡ŒŒ‰‡‰Š†ŠˆˆŒˆŠ†Š�‹Š�ŒŠŒ‹ˆ‰ˆ‰ŠˆŠˆ‰Œ‹�ŠŒ�Š�ŠŽŠŠŠ‡ˆˆŠ††‡‹”�|N?CA?<=;@><:==<=;>>;<<9;8?;<;;<;::=BA@@?B@?>;@=<:;>;<:=;;>=9;>;>9;8;=98<@JPUYWY[ZXWTQS`wˆ�Љ‡ŠŠŠ‡ƒˆˆ‹�‰Šˆ�‰‹ŠŠŠ‰‰ˆ‰�ŠŒ�ŒŽŽŒ�‹‹ŽŒŠ‰Šˆ‹†‡Šˆ‹‡‰‡ˆ�‰‹ŠŠˆ‰ˆ‰ˆŠŠŠˆƒ„zwzxqlb\VWZRVV\Y_kqrng^]`^SGEJHHNNKMQS_msrushZNHEDGFCCD@EFDKOS]eie_]aehs~„ˆƒ|ymXPKISRRKKIHFIHILOW^chiffmuxwulljieb–››–˜œ™™š�™ššš—–˜”’�Šˆ‡‡ŠƒˆŒ‹�Œ��Œ����ŠŠ‰Œ‰‰†Š‰„}€|uqkihmvyz|zy}�‚……�zwwwuz‚€€„ˆˆ††�{‡‚‰‡ˆƒƒ†‡‰†„†ˆŠ‡ˆ‹‹†ˆ†‡‰‚„ƒ…‚…�†…„€†‚‚~„‚€~�€ƒ�~€ƒ…†‚†‡ˆ‰ˆ‰Š�Љˆ…†„ƒ‚‚€�‚|tuwyxx‚„†ƒƒ€‚‡„‰‡…Šˆ‰†ˆ��‰Šˆˆ‰‡‰†‡‰ƒˆ‰†�Š‹Š�‰‰‰‡‡ˆˆ†…„ˆŠ�‡‹‰ŠŒ�ŠŠŠ‹‹‹Š‹ˆ†Š‰ŠŒŒŽ‹�Œ�ŒˆŠ�ˆ‹ŠŠ‹ˆˆ‡‰Š�ŠŒŒ��‹‰Š…‰Ž�wK>BAB@>>@?=?@;8::;:=;;==<9?9<=<<:<<:;8@GQVW]U[XXUWUSV`tƒŠ‰‡Š‰ŒŠ‰ˆ‰Š‰ŒˆŠ††††‚~€~|}ƒ„Š‹Š��ŒŒŠ��������Œ‰ŒŠ�‰‡‡‰ŽŒ‹��Œ�Œ‹ŠˆŒŒŒˆ…„}zzuri_WUPOX\\^[iuyvtpmpiTIIKKQPTVTV`dlw||}wfUHEFFEBDECFCHKPPTUVPUPQRQ^q��xujZRRRY][RIIEFEHBGHLPRXZZ^bikmimgdc`d•š™—˜——š™œš™—™˜š––•�Œˆˆ†‡ˆŒ‰‰ŒŽ��Œ‹Œ‘‹�‰ŽŒŒŒŠŽ�…†ƒ…~xxtxz{vzx|||�‡‡‡‚|yywwy~{|€‚…ˆ‡‡Š‡‹‰Š‡ˆ†Š‡‡…„†ˆˆ†‡†‰‰ˆ‰ˆˆˆ…ˆ……�„�„€‚€}|~�}€��}�~„ƒ‚ƒ„ƒ„†…‰ˆˆŠ‡‰‰‡ƒƒ�~�~€yvzxz}…ˆ†…ˆ‡‰„†ˆŠ‡ˆ‰†ˆ‡Š‰Š‹�‹‹‹ˆ‡‹‹ˆ†‡Š‰‡‡ˆˆ‹�‹‹ˆˆ‰‹ˆ‹‰‡†‰Œ‡‡‹‹ˆŠŠ‹�Œ‰ŒŒ‹ŠŠŠ‰Š‹�‹Š��‹�ŒŽŒ��‹‡Šˆ‹ˆŠ�‰‹Ž����Œ‹ŒŠ†eB=@B???>;A==>>:<;:9:;<;;=<=;<;;=>::::<@??>===;9===;><;;:8=9<::<=;=;>BJU[YWVXZV^U[WYW^t„ˆŠ‡†…ˆ‰ˆ‹‹ŠŠ�ŒŒŒ…|pjigidh`eiqtzˆŽŠ‹‹Š‡�ˆ��Œ��Œ�‘�ЋЉ‹†‹‹�ŽŠ�Ž�ŽŽŠ‰‰†}p_VOMMJMFHKLMOZcnxz}}ps]LORPQQOSVZ`irv|~|mTHONNKFFJGECFINNJNJIMJNNFIT[cgnog][dgjpqdTMMEEGGHCGGBHEILNVU^bgjgecc–š—™™›››™š›œ—›˜”˜–”ŽŒŒ��Œ�Ž‹��‹�‹Œ‰ŠŒ†‹‰ˆˆ��Š�Š‹‰†Š‰‡‰‰‡„ƒƒ†€ƒƒƒ†‡‡Š‹ˆ…‰Š†‰ˆŠ‰ˆ†…†Š…„ˆ†‰‡Š‡ˆŠ‰Š‰‹�ŒŒˆ‰†‡„‰…†ƒ‡‡‡…†ƒ††…†ƒ€~}~zz}}swst{tzz€z|€€�†�„ƒ……�„}qijs{{}€„„„†„ƒ‚†‡ƒˆ�‡ƒ‰‡‹‹‰‹ˆŒ‰‡‡‡ˆ‰‡‡‡‡‰‡‹Š�Š�Œ�‰‹Š‰‰‰‰†‡ŠŠŠŒ‹‹���‰Ž‹‰ˆ†ŒŠˆ‡Š‰‹Š�ŠŠ‹�‰ŒŒ‹Š†Š‹ˆˆˆ�‰ŠŒ‹Œ‹����‰‰‹‡Œ‹ˆ‡††hB:B@B@@>?<=>?><;;=::;:<;?:<8=6<::=<8<=JUXYXXWWUYZXWWUX^vˆŒ‰Š†‡Š†‡‰ˆ‡Šˆ‹�ކ�wvspqln__`gemz†Ž�‹‹Œƒzz‰ˆ‹Œ��ŽŠŽŒ‘ŠŒ�‹‡Š‹‰‹‰‰ŒŠŒ‰…‚‚~v`QOKNQOPOHJKEJLWcjssqicVNNLMJHIHPU\cmksmnhYOLOKKLHFDEGEEEHIKGJFKGIJHGLNRXacZUT\`^abZQJJJIDFFGEGDEBEDIKIPV^^`a^b›—™—š™–œ›�š™š�𙓔’�‰ŠŠŠŠ�ŽŒ���Œ��Œ��‹‰‹ŠŒ‰‡Š‡‹‡‡‡‡‰ˆŠŠ‹‰ˆ‹ˆ…‰†‡……ŒˆŠŠ‹‡‰‹Š‹ŠŠŠ‹ŒŒŒ‰†�‹Š†††††‰ˆ‰‰ŠŠ‰�‰‰ˆˆŽ…‡‡††‚‚‚ƒ€€�…‚‚‚‚�}~€€zsttuqtvvw|y€ƒ�„‰‡ˆ„‚‚€wqhsxz||�‚ˆ…Œ…ˆ‰‰ƒ„‡„…ƒ†††‡Šˆ‰‹��ŠŠŠ�ˆˆŠ‡‰‰ˆŒ‡‹‹Š‹‹�‹Š�‰‰�‡ŠŠˆ‰‰‰‰Š‰Š‹��Œ�‹Š‡ŠŠ†Šˆ‰Šˆˆˆ‹Š�‹‹Œ‹‰‰‰‰ˆ‡‡ŠŠ�Š�Œ‘�ŒŒŽŒ�‹†„‡|VA?B?B>A>?=?=:==:<;:<<<;9;<<:;;ENXXYZX[XV]ZZTUSS]tƒˆ�‹‹‹Š‰Š‡ŠŠ‡Œ‡‹�Љ‡‚ƒ~yvnkjnpuz‚Œ‰ŒŒ‹„}ƒ†Ž�‹‹��‰�Œ‹Œ�Œ���‹�…‡…„†�|x{tkaZUPTZZ^ZRSMHNLPQXf_\ZPNHMMHFHEGINRV[X[XUTQLJIIEECACBDCGCHDFEDGDFDEGFBGGLPONNOQQNMPPIGGIFIEGGGDEEBCCFGEGKQPSTXZ˜™•š™™›˜™œ���š›–——‘�‡‹‰‰‹‹‹Œ‹��Œ��Š���‹��ŒŒ‰ŠŠˆ‰‡„Šˆ…‹‹‹‹Š�‹‰ˆŠ„„‡��‰‰‰‡‡ˆˆ‹Šˆ�‹‹�ŒŠˆŒ‹‹Œ‹‹…‹Š‡‡„‡‹‡‡ŠŠ‰Šˆ‹‰‡‡„„‚‚�}ƒ€€}€‚~|€~|||xyutyt|z|€‚€†…‡††…}{vty|}€ƒ„……‡……ˆˆ‰ˆŠˆ†ˆ†…І†††‹ˆ‹Š‰‹‰ŽˆŠŠ‡Œ‹‡‡ˆ‹Œ‹‹‡Œ‹ŒŒ�Š�‰‹Œ‰†‡Œ‰ˆ‰Œ‹Š‹�‹�ŒˆŒŒŠ‹‰Š‡‰…ŒŠ‡ˆ‰ŠˆŒŠŽŒ‰‰‰‹‹‹ŠŒŒŒ‹ŒŽŒ�ŠŠŠ…„vL>?@DAD??@;?9::<<<<:;>:?=>:;=<<89?<9=GRP[VWU]U\ZZ\]XVPU_qƒ‡‰‰ˆ‰ŠŒŠ�Š�‰‹ˆŠŒŒ‹‰‹ˆˆ‚…€~y}}}~€‡‡‰‰‰†ƒ�…‡�•�ŒŒŠ‹‹Š‡‰��‰ŠŒ��Š||}…ƒ�||zqqlab[^emnghaZVWJJMQSRMNIIKHJMLFEFGKKKLNIIIIHJHHFBDDDD@ACDDACDA@FDCCG@DEADDHJIHDDHFDHIFEGDBEBFBGDCCDDGGFEHDEHJGNM˜˜˜›—˜™™™››šœœšš—”��‰ˆˆ����Ž�‹ŽŠ‹ˆ‰�ŽŒ�‰Ž�Ž�Œ�ŠŒŒˆ‰Šˆˆˆ‹‹‰‰‰‡Š‰‡Š‰ˆˆŒŠ‹�ŒŠŠŒŒ‰‡‡‡‡‹‡…‰ˆ‰‰��ŠŒ‹‰ˆ…‡ˆ†…………ˆ……„‡‡�ˆ†„„�€|‚}‚€€|x|{~{x||ƒ†�y�‚�ƒ…‡‡†€~‚~}~�}…�ƒƒ†ƒƒ……„ˆ†‹‡‡ˆ‹‡‰…‡ˆ†‰ˆˆ‰Šˆ‰��‹‹�‡ŠŒ�Šˆˆ‡‹ˆŠ†‹ŠŒ�‹�ŽŒŒ‹‰Š‡‰‰‹‡‰‹Œ�ˆ‹ŽŒŠ‹Š�‰‰‰ˆ‰…ˆ‰†††ˆ‹ŠŠ�ŠŒŒ‹Žˆ‹‹ˆ‰‹‹‹ŠŽŠ‡‡hB?CC@AB?=;>=>>:<=9=:>::8=>;<<<9:DKVZUWTYYXXWZ_[XWTR\oƒˆˆˆ„‹ˆ‹‰Š�‹ŒŽŠŒŠ�Š�‰ˆ‡…ˆ…ˆ„†ˆˆ‰Š‰Œ‰‹…|||‚‹����‘�Œ‰Š‰Š‰ŠŠ�ˆŒŠzƒƒˆ††‚~vxsqecgllpsnig`WLLGLPNKNGHHJJMLJHIFFKFHGFBEECFFGFECDFC@ED@@ABB@DEBCE@DEADCFDCCEBCFCGBGEDHFEFBFBAFBBGCDIFFFHFFEEGI˜™š™›š—œ™™›™šš——“Ž‹Œ�‰���’�‘���Œˆ†‹Š�Œˆ‰ŠŒ�ŒŽ�Œ�Œ����‹��Ї‰†‡ˆŠ‰‰†Š†‰‰‹ŒŒ���‹ˆ„�„†„……‡‡ˆŠŠ‰ŠŠ‰�ŠŠŠ�‰ˆ‚…ƒ…„ƒ~|�†„…€‚|}€ƒ}|z|€|}z}~z~}€‡ˆ‡ƒ„‚€…‚‡„†ˆ…ƒƒƒ‚€yƒ…�ƒ‚€ƒ†‚„„…‡‰‹ˆ‹ŠŠ‹ŠŠ‡‰ƒ…‡ˆ‡‹‡‹Œ‹‹Ž‰��ŒŠŠ�‰‰Š‰‹ˆ‹‹�Œ’�Œ‰‹‹Š‹‹‡ˆ‰Š‹Œ‹�‹‰ˆ‹�ŒŽŒŒŒ‹‰‰†„‡‰†Œ‹‹ŒŒ�Ž‹ŽŒŠˆŠ�‡‰‡Š‹ˆ‰�[=@G>D@C=>>>:@?==><>;;=;;<<:==>:<=>;@HR[[VYXUYZYZ][WXWTT\p�‹Šˆˆˆˆˆ‡Š‹ŽŠ‰�Ž�Ž�Ž�Œ†‡‹ˆ†�Š�‹Œ��‹Œ‹�xsurs€†�����ŒŒ‹��‹ŠŒ‰‰Šˆ†�…Љ‹‹�ˆ„„~wlkomnijouf_YMMNNMOPPIJLHKKIJLFIHHEFBCCADDCEGEFFCBDCDA@?AABABDFCDECFDFCEBBDDDBEABCBEECEFDDEBBADBCFEEFDIDEECGGJ—˜™—˜™ž›™�š›š›˜“�ŒˆŠŒ��‘“‘�’‘��ŒŽŽ‹�Š�ŒˆŒ‰�‡Œˆ‰Šˆ‹��Ž�Ž�‹Œ‹�Љ‡‡Œ‡†‰„‡‡Š‹‹ŽŠŠƒwtz‡ƒ…„ƒˆ†ƒ„�‡‡„‡‹Šˆˆˆˆˆ‰Š‡‚wqy…ƒ}‚|{z~~�~|}~€�{z{yx|…„ˆ†„ƒ…ƒ‡‰‡ˆŠˆˆ„†„ƒƒ�ƒx|ƒƒƒ}~z�…ƒƒ‚ƒƒ…„Їˆ‹ˆˆ�‹ˆŠ‹‡Š†ˆ‰ˆˆ‰‰Š‰ˆ„‰Ž‰‹ŽŒ‰ŒŠŠ‹ˆ‹†‰‹ŠŒ‰‰�Š‹ŠŽŠŽ�‰Š‹‹ˆ‰‡ˆ‡�Œ�ŽˆŒŽ‹‰ŒŠŠ…‰ˆˆ‡Š‹�Œ���ŽŠŽŒŒˆŠˆŠ†vO=?C@BC@@@@=;>>:=?9<<<;==9;@=<=<=:<;ESW[[TWXXZ^YZ[XXXWUU_p‚ˆŽŠ‹‹�‰‰‡ˆˆ‰Šˆ‹Œ‹��‹�‹‰‹‰‹ŠŒˆŽŒŽ‹Œ‹�ˆ}zxppz‚Œ‰‰‡Ž�Œ�‹�����‹Š‹‰‰ˆ‹�‰‹��Ž‹„{pnqqjjorrcUOQOOPPTUSPLKKIGMJKLIIJACCC?BFDBDEHGAFDCDGCBB@C?B=BCACBECCEEECCFEFBBGCDBDCCC@DCGEEBBBEGGAFDFCICDGII—›šš–˜šš››�œ›—š•�Œ‹Œ‘‘“�’�����ŒŽ������ŒŒ���‹‹‰†ˆ‹‰Œ‹ŠŒ‹�ˆŒŒŠŠŠ‹ŒŠˆ‰†…„‡‰‰Š‰…‚tbaovyzƒˆŒ……ƒ„…‚†„ˆ†Š‡‹ˆ‡‰‰„~miu�ƒ€~}zy|{~z|�|‚ƒ…€}{~~…ƒƒ††€„„„Љ†ˆ‰‹ˆ…†„ƒ€�‚‚{|yy€ƒ„�„€ƒ„††‰‡ˆ‡‰ŒŒˆˆ‰‹Š‹�‹‹Š‰‰‰‰„‡ŒˆˆŽ‰‹Š��Š‹ŠŒ‹ˆŒŒ…‹‰ŠŠŠŽ�‹‹�Œ�‹�‡‡ˆŠŠŒ‰‹‹�Š‹�‹‹Š�ˆŠŠˆ‡ˆŽ‹‹ŠŒ‹ŒŒŒ��ŽˆŠ‰ƒmG>DBC@@??;?;>@=>=;<<<=;<<;=<=<=<9<;BPWXYWWXVXZ[]\[ZZYXXQ^k‰�ŒŒŒŽŒ‹Š‰Š…ЇŒŠ�‹Ž������ŒŠŠŒŒŒ�‰‰�ŒŒ‡‚€|{…ŒŠ‡‹ŠŠŠ‹Œ���‘�����‹�ˆŽ�‹�ŠŠ‹ƒwnpqtqroxybSTQSORNSONMKJPIKLJLLOHKFDBBFEHEGFGFGCDBACCDE@A?@@@@?CCCA@DCCEEGDEGCFBEBE@DD@CBACEEGBCDGBCGFEBBDHIIG˜˜›—˜š—™™ššš››“•ŽŠ�‘‘“”•�‘����‹�ŒŒ���‹�����‹Ž�ˆŽ‰ŠŠŠ‡‡‡ƒ†…†…‰‡‡�‹Šˆ‰……‰‹Šˆƒƒ~dRR_bfn|„ˆŒŠ‰‰ˆ„‚…ˆ‡‰…‚ˆ„‡…‚€w^ew……‚€�|~|}||y|{}ƒ„„~€~„„……ˆ…„…„†„ˆ††‡†Š‹‡ƒ€ƒ…‚‚ƒ}{z{{{|€‚ƒ†‡‡‡Šˆ†‡‡‹‰‰ŒŠ‹‹‹‹Œ�Š‹Œ‹Š‡Š‡Š‰ˆ‰‡ŠŠ‹‰‹Œ��ŒˆŠ‰‹Š‡‡‡‹ŠŒŽ‹‰�‹Š‹ŒŒ‹ˆŠˆ‰‹�ˆ‹‡Œ‹‹‹‹ˆ‹�‹�‹‹‰‹Š�Œ‹�‹‹�ŠŽ�hG>BABB?>AA>?>=>=:;:;==:==<=;;;=;<=DNWW[XWXXZZZ[Z_Y\[YZWRZh€…†ˆŠŒŒŽ‹‹Š‹‹‹ˆ‹Ž‹‰Œ‹‹Œ��‹���ŒŒŽŽ‰‹Š‰‹‹‡…†�…‰ŽŽŽ�Œ�Ї‹�������Š„ˆ†ŠŒ�Œ‰‡†…wqinvuy}~�~gZTWPRPKMIGLNOPNLIMPOPPPNNKGIGIFIFFJIBFA@BACABBCABB@CDDABBEABCCCDEFDHBDFFEEAGACCDFEEAFGCEDDHEEFDFGDG˜š™š—š››œšš›—•“’‘�•’–™••”�’�Œ�ЉŒ‹Œ‹ˆ‹‡Š��ŒŒ��ŽŒŠ‹�ŒŠ†…‚„�€ƒƒ…ƒ†�†‡ƒ†ƒˆŒ†‰ƒtcRPPNUcm~…ЉŒŠ„‡…†Š‡…‡ˆ‚†……‚{nZbzƒ„ƒƒ€‚€‚}~€|{ƒ€„ƒ}ƒ€‡‰Š‰†ˆ………ˆ‰‡‡…ˆ†‚‡‚~}€ƒ……†ƒ‚}ƒ{ywx{{�……‹†‡‰Š‹Œˆ‡‰Šˆ‰‰Œ††‰Œ�Š�‰‹ŠŠ‰ˆŠ‰ˆ‹‰Œ�‰�Š�‹�ŒŽŠŒ‰ŠŠ‰Š‹Œ‰‹Œˆˆ‹ŒŒ�‰‹ŒŠŒŠˆ†‰‰�‡‰�‰�ŽŠ‹Œ�Œ‰Šˆ‰‡ŠŠˆˆ‹‚gE>@EB?>A?=@?>>@=8=;<<<><;<;;7>9<;?NWZ[XUZYY][]ZWZX]V^VVWYg~ˆ‰†‡‰ŠŒˆŠŠŠŒ�����‹‹‡ŽŒŒŠ‹‰�Œ�����Œ‹ŒŠ‡Œˆ‡ˆ�‹Œ��”Ž‘�ŠŽ�‹Ž�‹‹ˆ~wtv‚†ˆ‰‰ƒ{|snloxsu}{€|i\Y[QNKLHIFILMQPLMPUSPKOVUVRHJHIGFFGHEB@EBBAABCC?@?C?ACGDDCDDCDBCACACBBGDDGDEC@DECGBFFFEDFHDGDEGGGIF™˜˜˜š™šš›š�™›”‘�’‘™•–•–—•‘�’�������‹‡ˆˆ‡�ˆ†ŠŒŒŒŒŠ���Љ†ƒ…ƒ…ˆ…ƒ‡„„…†ƒ…†…ˆ‚~vjcZWWW]fq€…ˆˆ……€‚‡‡‰‡ˆˆ†ˆ‡�„|jZav„�‚‚€€……ƒ„ƒ�…†‚‚‚‚‚‚„ˆ†ƒ††‰ŒŠ‹‹‡‡ˆˆ„„…ƒ~~~‚………†‚‡��…}zxuwz��„€„…†Š‹‰‰ŠŒ‰†Š‡Š‡‰‹‹Š‹ŒŒŠ‹�‹�Љ†�ˆŠ‰‰ˆ‡‰�ŒŒŠŒ�‹‹‰ŒŒ‡ˆ‹ˆ‰‹‡‰‹ŒŠŒ‹Š��ŠŠŠŒˆ‡Ž‰ŒŠŠ�ŽŽŒ�‹‹Œ‹ˆˆŠŠˆ‡�bD>B@DA=A>?=>>=;9?=<:=9=;;?=:>=::DGZWZZT[Z\\^Y[Z\YXZZWYSUWg€ˆŒŠ‰Š†ˆ‰‰ˆˆ‹ŒŒŽŽ�Ž���’Šˆ‰‰‰ŒŒ�‹‹Œ�Œ�‹Š‰‰‡Š‰�ŒŒ����Œ�‹ŒŠŒ��‰„wlbfrx€‡ˆ~wvqnlnqmsqrpn`[XUOQQNNLIOPQOOMMQOROSPU^ZULJGDDGCHEBCDEDCFDAFF@A@CADBGBDF@FDBBCAACADBCECCBGEEEEFGCFGEEDFCFEDHEFIGH™™™š—š˜œœš�™—”•“•–—––“”•��‘”‘Ž�‘��‹�‹‰Ž‹�ŠŠˆŠ‹Š‰ŠŽ�‹ˆˆ„…ƒƒ…†…‹ˆŠ‡‰‡ˆƒ‚…ƒ€€}}zxsopkkmpy‚†‡‡Š�€……†‡ƒˆ†††…ˆ…qdet�‚€�‚€……ƒ……„††‡†…‡†ƒ„„„‡„„…‡ˆ‡ˆ‡ˆ‹Š�Љ„ˆ†„‡‚‚„€ƒ†„�„††…ƒ�~|xrv}|€„€€€†ˆˆ‡‹‰�‹‹ŒŒŠ‡†‹ˆ‡ŠŠŠ‡‹�‹�‹‹ŠŒˆ‰‰Š‰Š‡‰‰‰Šˆ‹ŒŒŒ‰�‹ˆŠ‡‰‡‡‹Š†Š‰�‹ˆŠ‹Œ�ŒˆŠ‹‹‰ŠŠ‡‰‹‰‹�‡�‹Œ‹‰‰Œ‡€^C>C@A@@<?<<=:=<<=>=99==>><@>@:==<=<<><:=:><><:;=CLU^^_[[VZZX^XVWX[\\YV]]SSRdw„Љ�ЉŒŒŒŒ‹�ŒŠ‡Š‹‰Œ�‹�‘ŒŽŽ��Š‹‰†Œˆ‰‹Š��Ž‘ŒŽ�Ž�Œ‹…††}qWZiy€†…„vsrrqs��ti^SURSUQQUSTQSPQLNQSQNURNPKLLIJLHKHHLMPMLEHKKKLJEEECDBBEAHIECAB@@ADCDCAACBEDFEGDDFEEBBBBBDB@CCEDFHFHGEFFGFDFIHEH™–››š�™™›˜™˜˜—š—›š›œ—”””‘�‘���Œ‹‹ŒŒ�‹�‰‘��‹Œ‹�Ž�Ž�ˆŠˆ†‡‡ˆ…‡‰‡‡‰‰Šˆ�‰‡ˆˆ†ˆ†ƒƒ…ˆ„„ƒ„„…„‡ˆŒŠ‰ŠŒ‡Šƒˆˆ‰†…‡…„„†…oelnmsu�‡ˆ‡‡…ƒƒ†‚…‚ƒ‚€„‚‡‡‡‡…ˆ„‡‹‹‡‰‹†‰…‰†ŒŒ‰‹‹Š‡Š†ƒ„ƒ„ƒ�€„�ƒƒƒ‚�„‰†……„„„��€‚‚‚‚‚†ˆ‰Š‹ŒŒŒŒˆ‰ˆˆ‹‹‰ŒŠŠ‹ŠŒŒŒ��І~u‚‡‡ˆˆ‡Œˆ‰Š‡ŠŒŠŠ‰‹ŠŠŒ‰ˆ‡Šˆ‹ŠŠŒ‰Ž�Ž�Љ‰‰ˆ‰‹‹Œˆˆ�ЇЂ[A@BCDA>>?A@=>=;;:;GGR[_a^\WY_Z[YYZU]\ZW[Y[XYUUbu„‰‰‰Š‰Œ‹ŠŒ��Œ�Š‹ˆ‡Œ‰Œ�Œ�ŠŽ���Œ��ŠŠ‡ŠŒ�Œ�ˆŽŒ��ŒŠˆ‡�|kVS]q|„ˆ†�€}|wx{�p]LPIIMMJKJKFLJSNNMTROKOINMKHIDILHGCEDFIGHEHIKOVRMMICDCGEFEEED?DDDADFCEDDBFEEFEIGDGHGCDDDECBA@BBCBFGDGEFFGCGJGFGJ˜š——˜™�™š�›”˜˜˜—šš˜™š—•—‘’”‘��‰�‰‹‹Œ‹ŠŠ�Љ‹‹‰�Œ�Œ��‹Ž‡ŒŒ�‰ŠŠ…‡ˆ††‡‹‡‰Š‰††‡Š‹ˆˆ‡‡…„†€„…„‡‡Š‹ˆˆ‰‡ˆŒ�‰‰‡…„……�~xjf`cfq|Š‹†Œ‡ˆ‡…ˆƒ‚‚ƒ}�……ƒ…ˆˆŠ��Œ‰ˆ‹‡‡‰„‰ˆŠŠŠŒˆ‡‰ˆ†�ˆ‡„„€�„…ƒ�„……‡„‡ˆˆ…„€}�…}~~€ƒ„‡ŠŠŠ‹ŠŠŽ‰Œ‰‰ŠˆŠˆ�‡ŠŠ‹�‹Ž‰€lnƒŒŠŠ„„…†…‡Š‹‡‹ˆˆ‹‰Š�‹‹�‹‰‹‡ˆ‰ŠˆŠ�‹Š�‹�Š�Љ‰‹Œˆ…Šˆ~WCBEC@A@B?;??=>?<=:><>;=@<=9>@IR[_^^`Z]Z^^\U\XYZZYZZZY[XVXdw‰‰‰‰…‰‰ŠŠ‰�Œ“�‰ŽŽŒŒ‹‰ŠŠŠ‹‹Ž‹�Š‹��‹‹‰�Œ�‹‰�‹Œ�ˆ‡…‚~{€tg`gs}‚‡‡„ˆƒ�w}„weSKHFHKIIHDIFFKNOORTTIHHMLGJGGJIJMGDEDDGDCGCFJQUWWTJFGGGDDAEE@C?BFEIHHGEDGECDEFDLGGIIBGFFGEDB@CC@FBGGBBFDFCHJGIKKš™™•œš—›››šœ—›šš™™––•–—‘”’’����‹���ދЋ‹ˆŠ‡ˆ…‹‹Š�‹‰‹Š�‹‹ŠŒ�Œˆ‹Š††‰ƒ‚…‡„ˆ†‰†ŠŠŒŠŠˆ€v|ƒ‰†ƒ‡‡†Š…�‡„‰‰‹‰Š‡‡Š†ˆƒ}zvjdhn|†„‰…†‰‰‹†ˆ†‚�ƒ€‚��‚€‡‡‰‹�‰�Œ�ˆŽŠˆ‰ˆ‡‰ˆŒˆ†ˆ‰‡†‡Š‡ˆ†„…ˆƒ„‚ƒ………‡‡ˆ…‚€€‡ƒ�ƒ„…†ˆ†‡ˆ�ŒŒ‰�ŒŠ‹Œ‰‹Š‹Œ‹‹Œ‹‡‰qWk‡‡„zz„‚ƒ‰‡Š‰Šˆ‰‹�‹�ŠŽ�ŽŠŠŠ‡ˆ‰Šˆ‰‰Š‹ŽŒŠŠ‹�Љ‹ˆ�‰�TC@EBB?@AAA?=>=@>?=?>>HRa]^]`]ZY[[ZZ^Z\]ZY]X[Y[^WVVcs†Œ‹‰‹�ˆŠ‡ŠŒ�‹‰‹Ž‹‹�‹�Œ�‰��‹��‹‹‹�‹��Ž‘Ž��Œ‰‹ˆ‰†…ƒ}€„€zv{‚ˆŠˆ‡‚……ƒ|{{qYOLFFGLJIGDJGHDJORRRRMIIHEGFFGIIKNGHHEDDDDCEEFLPZYSNFEEHAFEEGBBCDDFFFGGEEDEEBGBGJJKGDDFGEHGFDEEDCCGCBHECFGBHEFJHK˜˜™œššš›œ™–›˜šš›˜œ˜——•�“�”‘�����‹����ŽŽ�Œ‡ŒŠ‹Š†‡‡ˆ‡‹ŠŠ‰‹ŠŒŒŒ‹‹‹‹Š‰‹ˆ‹‰……‡‡†‡ˆ‰‰†ƒukx…Š…‡„‚‡‡€€~…‡‰…ˆ‰†…ŠŒŠƒ‰„�}wtz}�„†„„ˆŠˆ†ˆˆ„ˆ†ˆ…ˆƒ„‡ƒ„…†‰‡Š�ŽŒŒŒŠŒŠˆ‰‹Š†‡…І†„…‡‡†‰‡‡‡‡‰ˆ„†�„……ƒ„€‚…†ƒ…„‡‰„Œˆ†‡‰†Š‡ŽŠŒŠ‰�ˆ�Ž‘Œ‹ŠŒ‰ˆdWh|…„php~€~ƒ†‰‹‰‰„ˆ‡‰ˆ‰�Œ�‹‹‰�Šˆˆ‹‡ˆ…ŠŠˆ‰Š‹Š��ŒˆŽŽ‰|S@>BDB@=@=?@@@>>;=><;>@9=<>CHS_c``]][]Z]Z]\[\]^\^\]ZX[WVXVYr„‹‹‹Œ‡�‹Œ‹�‹‰‹‰ŒŠŒ�Š��ŒŒ�����Š‹‡ŠŠ…Ž��Ž�‘‘Ž��‡‰ˆ‡ƒ‚‰‡‡ƒ…ŠŠŠŽŽ‰…„‚�|zw]LKIJIGHKJIKKHHHLMPQRNNKMFIDIHHFKIJIFHIFCEFFEDDDMQSNJGCBEDFDEGDECCDEEFDGBGDDFFECGHMIGHDDFDDFCGIGEHEDHHDEFFEDEEFKIN™˜™–™š›š›�š™™œœ›ž˜™™–••“�‘‘���‹ŠŒŽŽŒ�ŽŒŽ‹‹Ž�‹ŠŠ‹ˆ‹‹�‰‡ŠŠˆˆŠŠŠŠ‹‰�‹‹Œ‰‰‰Šˆˆ†††‡Š€~nhr„‰†ƒxx€Š†~„‡†…„†„‰„ˆŠ‡‰„ˆ…„‚‚‡‚„„†‚…†ƒ††……‡ˆ‰‡†‡‡„††„„ˆ†‰ŠŠŠŒ‹ŒŒ…�‹Œ�‹‰‰‡‰‡‡ƒ‡�„ˆ†‡†Œ‰…‡ƒ„„‰†…‡‚„…ƒ‚‚‡„‡ˆŠ�ŒŒŠŒ‰Š‰‰Š‹ŠŠ‡‹Ž�Œ��‹Š‡~ndm|�yd\q|€{€…ЉŒŠ‹Š‹‡…‰‰‹ˆ�ŠŒŽ‰‡Š�‰ˆ‡‰‰‰‰Šˆ‰Šˆ�‹‹�‰|O?CCCD>B>>??=>>;>=>>?=@>=<=>>?A:?9>;@@LV_]c]c][[^\\^_XZW[[[\[]Z[WW]ZWQQi€‡ˆŠ‡†ˆ‹Ž‹Ž‹���Š�ŠŒ‰‰‰‹ŽŠ��‹���‹‰ŒŒ‹‹ŠŒ‹��Š����’�����Šˆ‰‰‚ƒ‡��Š‹�ˆ„w`QHNNMMKJGFGHLJKLIKNNOLGJKHFGFCFGHIHFGIGGGHKKKIFCFDFHIFCCBC@DDDAABCCDCFDDDADFCCEFEFJHEHGIHIGDDFGEBCDGDEGCHEEBHFIEJJ™š˜™™�™››œš››››œš˜˜•——•’”•�‘’‹ŒŒ��ŒŒˆˆŠˆ†…‰†…ŠŽ‰‹ŒŠŒ‹ŒŒ†‰ŠŠ‹ˆˆˆˆˆˆ‰‡‡‰…Šƒugn�ˆŒ†rgtƒ…€gWezƒˆ„…ˆ‰‰‰‡ˆ‰‹„‡…„…………ƒ†††„†‰…‰……†…‡Š„ˆ…„…ƒ„‡„†„…‰‰ŠŒ�‰ˆ‰‰ˆ‰†…‡ˆ‡ˆˆ‹‰‰ˆŠ‰…�…††…ƒ†„‚…ƒ„„†„ŒŠ†ˆ‡ƒ‡��‚€†‡ŠŠŠ‡‹ŠŒŒ��‰�Š‹ŠˆŒŠ‰Š‹‹‹‰‹†„…†€|xv{†‡‚‚†ŠŠˆŠ‹‹‹‹ŠŒŒŒ�Љ‰ˆ‰…‡ŠŒ‰‹�‹Œ���‹�ŠŠ‰ŠŒ‡tL@BBAA>DB>??>=>>>=>?@=9AEO[a_`a_a_[^\[]^]YYZX]^\XZZZ\ZXZSPSi‚�Šˆ‰‡Š…Œ‹ˆŽ�ŒŠŠŽ�Œ‰Ž‰‰�Š‹Œ‰‹��‹‹‹Œ���‹�ŠŠ�Š‹�ŽŒ“����މ‰ˆ†„†ŽŠŒ��Š…udZQPRPOKIDGEAGHKHJKLFJGGIJFIDGCCDJFFFDHDEFDIIIJECDFBFCECBCGCCFAC@ABFBBBBEBFEECBDCFHCGFCEGJGFBFJHDEEBD@CHDFFFCHHGGGI™—™š™�˜š— ›™�šžž˜™––—•‘‘”’Ž��ŽŽŽŽ��Œ�‹Š†…Ї‰‡‰Šˆ††‰Œˆ‡‰‹‰�‹ŠŒ‰‰Šˆ‰‡‹†…‰…x`Tcw†‹ƒ‚viq~p]Ucw€„‡‚…„‰Œ‡ˆˆˆˆ†ŒŠ‡ˆˆ…„‡„……„�…††††‰Š‹‰‰‡…‡‡„„‡†�‰„…ˆŠŠŠŒ‹Œˆ‹Š‡ˆˆ†…†‡ˆˆˆŠ†‰ˆŠƒ‚†ƒ‚ƒƒ‚‚ƒ‚…„…‡…………†…‡„†Š�ˆ†Š‡Š‰‡Šˆ‡‰�����Œ‹‰�ˆ‰‰Œ‰‡‹…ˆ‡…€ƒ…Œ‰‰ŠˆˆŠˆ‰…�†‹‹�‰�ˆ‹Ž�‹Š‰‰†‡‰ˆ‰ŒŠŠŠ‹‹‰ŽŒ��††rIBAAAA@@@<@?=>=>?=;>:@@?==>B<><=;==<ABBHABDBDDDCFCB?A>CA@GADBCACD@?A?BCDDBCDBDCBD>EBDHHFEFECGFFGEBHEGKFCGGBFCBDFCDBCCCCDHFHGFHF™•›–™œš˜œ››™–��ššš™š™––“““Ž�ŠŒŒŒŒ‰‰Š‡‰‰ˆ‰�‰ˆˆŠ‹‰Š‹ˆˆ‡‡ˆŠ‡‰ˆ†‰‰‡‡ˆ‹„Ї‘��ƒ{hbp|€€€yjbSNT`lx‚…ˆˆƒˆ†…†„�ƒ„…‰…‡†‡†‡‡ˆˆ‰„‰„„�†„††ƒ‡ˆ†††Š…†Œ‰‹ˆ‹Š‰‰‡ˆ…†……††…„ˆ‰ˆˆ‡Š‰ˆ……„†�{{ƒƒ„�€…„„ˆ†‡‰‡ƒ}€€…~…‡‡ŠŠ�Œ‹�‹‹‹Œ†‹ˆŒˆˆŠ‡ŒŠŠŒ�‰Œ��Љ…vlsz‰‰Š‰Ž‰‰‰Œ‹Œ‹Š‰Š‰‰‰ˆˆˆ‹ŠŠŠ‰�ŽŠˆŒŠ‡ŠŠŠ‰‹ŠŒ‰Œ‹…oFAFBABC=?D?>=A;;=>;<=DP[^b^_^[a]a_\]`^]]ZWXY[^\Y[[YY[^Y]XFK_~ˆ‡‡‰Š‹‡Œ‰ŽŽ‹ŽŠ‹�Šˆ‰‰ŠŽŽ�����Ž�“�މŒ�‹Ž‹‘‹ŒŽ�‘‘�”’�ŒŽ�‹’‹��‘����’’ŽŽŠ‡~vnYLJGEHHGJGBGBC@BC??A>?ABCDBGCEBCBCCCBGDEDBB>@B?AD@G@BDBDCDCHBHFEECDAH@FCGCFCHILJFCCDDCECCJBFDDECEEHGGIFG˜˜™–›™›™œ›››˜™›—›šš›—˜•—”’’�Ž‹‘ŒŒ‹‰Šƒˆ‰‡‰‡‡Š‡‡‰Š‹ˆ‹‰‰�ŠŠ†ˆ…‰†ˆ„„†„„†Š��ŽŒ†{qvƒ‚}|j_PIRXiv€†‰„…ˆ‡Š‡‡††�‡‡…‚ƒ…†††‡Š‡†‡†‚ˆ…‡ˆ†‰†…ƒ†„†……‹�‹‹�‹ˆŠŠ‡‡‡…†ƒ…ƒ€…ˆ…„‡†ˆ‰…‡…ˆ‡�||‚ƒ„„‚…�„†ˆˆŠ‹……ƒ„€‚€†„‹‰Š‹‹ŠŒ‹Š�ŒŠ‹‹‹Š‡ˆˆŠ�‡‹ŠŒ‰‰�†ogikuƒŒ‹‰ˆ‰ŠŠ‹�Œ�‰Œ‹Œ‰‹‰ˆŒ‡‡‰ˆ‰‰‰‹Œ�Š�‰�ЉЋ‹ŒŒ‰†iHA@ECBBBCB=@;=?<>>;FCDECFGGIBCCFBDAEDDHGIKLDGDCAB@DEEDGCDDDBFDHIEGF—™™—•˜˜˜›™�™›�›™™–˜—•—”’‘�‘’����‰‰‰‹‡‰Š‰†‡‡…ˆ‡‡‡ˆ…†‡Š‹ŽŠ‰‰ŠŠ‡ˆ‡…„€ˆ…‰Š�‹Œˆˆ|}�‚ƒ„�uhYWU\eq}‚†††‡‹ˆŠ‹ˆˆ†‰ˆˆ„‡�ƒƒƒƒ„„†‰ˆ„ƒ†‰Š�ˆ‡Š†Š††„ˆ‰†‰Š‹…†ˆŠ‡‡„‡ˆˆ‚„†„…‡ƒ†‚ƒ†ƒ„‡Š‰„†…‚‚„ƒ„„„‚„‚‹††„†ˆ‰„†„‡‡†Œˆˆ‰‰‡ŒˆŠˆ‹�ŠŽ‰‹�‡ŽŠˆ‡†‹‰ˆˆ~qloths„‹‹ˆ‰Š�‰‰ŠŒ‹ˆŠŒ‹ŒŠ�Š�…ЅЉ‹‡ˆŠŠ‰ŽŠŽŠ�‰���Œ‰‚kF?CCDBAB@CA>?@;><BABAA@@A>?=>=>;CIR\a_a_a_^^_c__a^__]Y[Z^XW\][]\YZ\X[_XK?H[z†‹ŒˆŠ‰ŠŒˆ‡‡†‡‹�ˆ‹ŒŠŽ�‘����Œ‡ˆ‰‰�Œ�‹‘�‘���Ž�Ž�Œ���Š����•Ž’’‘‘‘ŒŽ�Ž��ŽŒ���‰~struvlf]VSOPJMQQVX[[_ehc]\_ZQNKNNPKJLRTQPMIIGCDCBCBDDDDFFEABAEDAAFDDCEBEDFFECGDDFBDCFBBCDDGBGGEIGEEGFEGGGIG–—™™š˜–š™š››ššœ˜™š˜™—––•Ž����Š�‰ˆ‹‰Š‹‰Š�‘�ЉŒˆŠŠ‰ˆˆ‡Š‡Š†…ˆ‰Œ‹‹‰‰ŠŒŒŽ�ŠŽ…‡†‚„…ƒ‚‡„…‚ƒ€~y{{z…†‡�ˆ„†‡‚ƒƒ„€€�‰„‡‡ˆ‹‰ŠŠˆ†ˆˆˆ„„†Šˆ…‰Ž‡ŠŠŒŠ�Ї‹‰†ˆˆˆ††††„†‡‡‰‹„‰„†‡†…„‡‚„‡‡ƒƒ…�‚�†ƒ„���‚…ƒƒƒƒ…‡‰‰‡ˆŠŽŽ�‰ŠŠ‰‡‡ˆ‹‰†ˆ‰‹‰‹‰‹ŽŒŽŠ‹Šˆ‚{xuot‰‰Œ��ŒŒŒŒŒ‰ŒŠ‰„‰Šˆ‹ŠŒŒŒ���‹ˆ‰ŠŠ‹Œ‰‹‰�ŠŠ�Œ�‰„gE?CCDC?>>A=A@<=;AJY^`ebabc^]]a_ca_``ca[]\ZXY[XYZ[]]XZ\_YE:HXv‚ˆŒˆˆ‡†Ž‰‰Œ‹Š�Ї�‹ŠŠ�ŽŽŒ���‘Ž‹�‰ŒŠ�‹Œ���’�‘’����Љ�Œ��‹��‘‘‘‘‘‘���ŽŒ‹‹Œ�ˆˆ„„ƒƒ†�€zpf`TWQQQV^baacipkejnkd]YXVWQSPV^`YSOJHGGEFGFGECFDIFFEAECEDGCCABBG@CCCGEFEEDBDCBB@FFGCBJGHHGDHFHIJIKG™—˜–—š™š—š™›˜š›™˜›�˜–—•‘�’‘“Œ‹Œ‡‹‰Š‡‰ˆ‰‰ŒŒ†�‰ˆˆˆ�Žˆ‡Œ�‹‰‹ˆŠˆ‹ˆ‰‰‡�‹‹Œˆˆ‰ˆŠ‰ƒ‹‚‡„†€ˆ‡…ƒƒƒ€‚ˆˆ�‹†‰‹ƒ‡„�z|�…ˆˆˆˆ‹�ŠŠ‹Œ‰‹‰†ˆ…‡ˆƒ‡‰Š‰�ˆ‰‰Š†‰‹‹ŠŠ‡‡†‰††„…††ƒ‰†„‡†ˆ†‡†„†‚…ƒ„‚ƒ€ƒƒƒƒ†~{�‚ƒ„ƒ…††‡‡†‹Š‰‹‹‹ŒŠˆ‰ˆ‰‹Œ‰ˆ‰ˆŠˆ‡ŠŠ‹‹�‰‹ŒŒ†„�~‚€ƒˆŠ‰ŠŠ‰‹‹�‹ˆŽ‹‰Š‹‰ˆŠ‰�‡ŠŠ�‹�‹�Œ‹�Œ��‰Š�ŠŒŠ‹‹‚c?CDAF>@>@@?@<=??HXacddedb`^]_^___^]]```a][WZYYY[^[]YZ^]QD>AZs‡†ˆ‹ƒ…ЉŒˆŽ‹‹��Œ‹ŒŠˆ�‹‹ŒŒ‰‹��Œ‹‹��Š‹�‰‹�Ž�Š“Ž�‘�����”ŽŠ��ŽŒ��‘����‘‘�Š‹ŠŒ‰ˆˆŠŒˆ‰‰€}rcYSNNTSW[XSTYdcbfgrlddZVSSORY\YUXSOKMNHOKJHFDFFGJCGEGDDFCDF@CCHCGBDEEEGCDBFCCGFCBHCAFFEFBDHLHJILQI––———š˜œ™ž™›™š›˜™˜™—”–’‘‘’�”��Œ‹ŒŠ‹Š‹‰ˆ‡‰‡…ˆ‡‡ŠŠˆ‹‰‡‰‹�Œ‰Œˆ‹ˆ�‹‡††Ž‰…‰Š…‰‡…‹‹ˆ‡‡‰‹Š……‚‚„‚…†‡‰Š‡†‡‰ƒ~}‚ƒƒ‡‡ˆˆ„‰ˆ…Š„‡‡‡‰ˆ‰‰ŠŠŒ�‡ˆ‰‡ˆˆ…‡…‰‰‡Š†‰ŠŒŠ††…†„„„„„�†„††„ƒ†ŠŠƒ‡†€€€ƒ�zz„†‹ˆ†Šˆˆ‰ˆ‹‰ŒˆˆŠ…‡‰‹Š…Œ�ŒŒŒ‰ˆ‹Š‹ŠŠ‰�Šˆ‰‹‰ŠŠ†ˆŠŠ‡ŠˆˆŠ‰ˆ‹ˆŠˆ�ˆŠŒŒ��Œ�‹‹Š‹‹‹ˆŠŠ�‰Œ���Š�ŒŒ‹‹Š‰�ZB@BCCBBAA>=?=>BJWdead`ebc`ac_a^_b]]]^`]]][\[\X[Z^Y^YXZZN?;D\s‡‰Œ†„„ˆ‰ˆŠŒ�Œ��‰��ŒŒ‹ŠˆŒŠ‰‰���Œ�Š�’��Ž��‰Œ�Ž‹������“”��“‹�ŠŠ�‰�Š‘Ž��’�‹��‹��‹‹‰‡…|tqaWOLPRQNSOMINQWSUZ`b]YXONMOOMKKLONONPNRRUQNFEDFIHFGCEFHHGGDBDCD@FHBCCFCFDDDHGGDGCEE?EEBACAGGLILPRQ›˜—–˜™˜›˜››œ›��›šš—–““ŽŽ’�Ž���ŽŠ‹ŽŒ‹Œ‰ŠŠ…ˆ†‰‰…ˆƒ……††‰‹‡†‡…ˆ�‹Š�‹‡‡‰‰‰‡‡†‚ˆ„‡ˆ‰†…†‰‹‡‰‡…‡ˆ…‚‡‰‡ˆ…„…|€ˆ‡ˆˆ„††‚†�~~}‚‚„…ƒ†Š‡ˆ‹ŠŒ‡Š‡ˆ‡„ƒ…‡†‚‡ˆ‡ˆ†‰‰‰‰‰ˆˆ…‡‡‚‡ƒ„‚‚~…‡ˆ„†‚„�…|‚‚~~€‡†‰‰‡‰‰ŒˆŒ�ŒˆŠŠŠ†Š‹†‡‡Œ‹Š‹�‹ŠŒ‹ŽŒ�‰‰ˆ‰Š‡‰ŠŠ‹Š�ŒŒ‰‹‹Š†Š‰†ˆˆ‰Š‰‡�Ž�Š�‹�ŒŠŒŠ‰‡ˆŠŠŠŒ�‹Œ’�ŽŒ��ˆ‚]@>CC@BCA>@=B>CQXdi_fd`dbaacdcb_^``\[_^^\_[[\]ZYX\]ZZVZSH@@BXt‡Š‹Š„ЉЇˆˆŒŠŒŒ‹�ŠŽ�ŠŒŒ‹‹ŒˆŒˆ‹Œ�Œ�ŽŽ���ŽŽŽŠ�‰‹‹‹‹�Ž�‘�“Ž’“���‰ŠŒ�����‹�Ž“�’��Ї€€vniaSOMSPPMPMMJMJMHCJMNQOPJIKIIEHDDGEHLNQRSWTPKCEHGBHEEEFFMHOIHEGFFGGECCG?HCEDFFFFGDDDACBCCC@EDFIKQT[–š–—šš˜š™™š™˜››š™š——’��Œ�ŽŠŠŽ‹Š‰‹�‡‹�‹Œ‹‡‹ŠŠ‡Š†€‚�†„‡‚xrz�‡‰‰Œ‹�ŠŠ‰‡ˆ‰†‡„†………ƒ„„……†ˆŠ‰†�‹‡‰Š†Š†„„„€}~�‚†‹ˆ†ƒ�€‚‚‚‚…†~ƒ‡„„‰‰‰‡‰‰‹‡‰†‰ƒ‡„…„„„„‡‡‡ˆ†‰…‡…†…††„‚€ƒ‚„�‚�†€ƒ€†„ƒƒ†‰‡ˆ„ˆ…‡Š‹ŠŒ�Œ‹‹‹ˆŒŠ‹†‡‰ˆ††ŒŒˆ‹�Ž��Œ‹‹Š‰‰‰Š‡‰‰ŠŠˆ‰Š‰ŠŠ‹‰Š‰‰‰ˆ‰‰ŒŒŒŠ‹ŽŒ����މމ‰Š‰‹ŒŽŽ‹��‹Œ�Z@?EC>FAA?===BN\cffdfdda`_acba_b_a`]a__\^^\\X[YZ[Z^Y\YYRD>>BVt…Š‹‰‰Š�Š��‹ŠŠŠ‰ŒŒ‰‹�‹ŽŽ�‹ŒŽ�ŠŒ‰Š‹‹ŠŽŽ��Ž�����‹‹‰ŠŠ‰�‹Ž�“ŽŒ‘‘��Œ‹��ŒŠŽ‹���”’’’�‹ƒ|ysphYT\XYSMONQOMLHFCFGGOJJHKHLICCECD@BCIIMKNRQJGDDFCGFHGJMQTWTROJKOOPIEJHHGILHKDFFJDGCDDACCFDDAFHINWX—™™–—™™–™™››˜š�™™——™”�’‹�‹†‹†ˆ…‡‡ˆ…‰‡‡†Šˆ‡ˆ‡‡„‚€�‚ƒ~x]_n|ˆ††…ˆ‡‰‡‚‰‹‰Š‰ˆ†…‰„‚†„„…‰ƒ‡…‡‡‡ˆŠŒŠ‡ˆˆ‡‡„„‚‚…„„‚ƒ~‚„††‡Šˆ‰ˆ…‚€…‚�ˆ†ˆ†„†‰†‡………„��‚ƒƒ„�……†ƒ�„†…€ƒ…„ƒƒ€†��}…„‚„‚„†‡‡‡�ŠŠ‹‰†‰‡ŒŠ‰‰‡‡ˆŠŠŒŠ�Œ‰‡…‡ƒ…‰‰‡‡ŒŽ‹Œ���ŒŠ‹ŠŠŠ…†ˆ‹‡„ˆ‹ˆˆŠŽ‰Š†ŒŒ†ŠŠˆŠ‰ŠŠŒŒ��ŒŒ‹Œ‹��‰Ž‹�‰Š‰‹Š�Š}W>@D@DBA>?>>COX_ecfhfebcab_`a_b_^`^]^_]\`\\Y\^ZZ[[Y[X]YJ@B>ACRk„†„‰…ˆˆ‹‰Š‹ŒŠ��‹‹Š‰Œ‡ˆ‹‹‹ˆ�ŒŽŒˆŒ‘‹‹�‹�‰ŠŠ‹���‹…xos{wtrqo|…Š���Œ‰���‘��‹‹‹�ŒŠŒˆ‹ˆ‰ˆƒ~}x}tp`ZRTWPIFGKLMOQQOPMKCF@CEGEFFGFECGGEECCADAACEFGGRWcbhinjie_^X[V`dggbd[[VUPMLGCDBEEDGDCDEIGJG————˜›–™š›œœ›™�˜™—•‘”��ŽŽ�‹Š��‡‡‡†‡„‚�‚€}|}‚„ƒ€xo_QHVoƒ†††€‚‚„…ƒ‚„†€ƒƒƒ‡ˆ‹ˆ‹‹‹‰†…„†„ƒ†„……ƒ……‰Š‰‹‹�ŠŽ‰‹†ˆ‰††‡‡Œ‹Š‰�Ї‡†ˆ†ˆ‰„ƒ…ƒ…€~‚€‚}z|‚‡„‡„~„‡„�{€€ƒ�…�‚€�…†‡ˆ†‡‹‹†‡„ˆ†ˆ‡‡Š‰‰‰‡�Œ�Œ���ŠŠˆ……ˆ‹†‡†††‰‰‡‡Œ‹ˆ�Š‡ŠŠ‰‰‡‰Šˆ‰ˆ‰‹‹Š�‹‰ˆŠˆŠˆ‡ˆ�‰‰Š‹ˆ‹ŽŠŽ‹Š‰Ž‰ŠˆŠ�‹ˆ�Œ�ŽŒ�ŠŒ‰‹�‰†|P?BD@@BC??HKYehcgebdac_bda^b`c`b_`\`ZZZZ]YZ[^_^_Y`^Z\XMB?@>ANi€ŠŒ„†ˆ†Šˆ‹‹Œ‰ŠŠŠŒ�ŠˆŒˆ‹‡‹Œˆ‰‹‡…‹‹�Œ����Œ�‰�‡‹‡}f_gv{vnjdcdo~…„…‡‚ƒˆ†Š‹�ŒŒŒŽ‹ˆŒŠ‹�ŒŒ‰‰‡…„„‚~tmhbcZPPLQNRSV[[WMKHGDCBDGEGMJHCFFECDDG?>@?BDGELOU[]gniha_Z\WXZjsonpjca_[XSHCBBECEGCECDJBIG•˜˜–™––š™™�š™šœ˜š›’”��Œ�‹‰Š‰ŠŠˆ…ˆ‡…ˆ�ˆƒ|{xz{€‚€„{k]QIN`q€†ƒ‡‚„ƒ†„††„ˆ‡‚€€†„‡‡‰†‰‡†Š†‰‡‰Š‰‡‡�ƒ†‰‰†ŠŠŠ�ŽŽŒ‡�‹Œ‹‰‰Œ‡‹‹ˆƒ„†‰…„ˆ†…„„†€€€~‚€€z�…‚ˆ‚€„„‰‰†„„††‡‡…„„†‡‡†††‰Œ‡ŠˆŠˆˆˆˆ‡‰††‡‰‰Š‰Œ�‰ŠŒŠ‹‰ŠŠŠ†„…„‰‡‡ˆŠŠˆ‰ŽŽŠ‰‹�‰ˆ‰‹Šˆ‰…‰‹‹ŠŠ‰‹�‰‰‰‰‰‰ˆ‡‰‡‹�‰Š�Ž‹Œ‹�‹‹ŠŠŠŒ‡‹�ŒŽŠŠ‹Œ�‘ˆ‹zT?CCA@ABACO^hiegiheedcdc^b_b`bcada_\]Z[Z[YY\]Z^\Zaa\\WH<=@?CMf‹‹ˆ‰ˆŠŒŠ†ŠŒ†‹‰‹ˆ‡‰‰‰‰��ŒŒˆ‹‡„‡ŠŒŠŠ��Ž�Ž’‘‹�‹„{dVfv||sg\__lqw{|yytvzyw{€‰‰Š���‹�Šˆˆ‡‚…‡‡„†�yupjd`YUUVS`ab[OLMGEIFFEEHJOKKKFFFFDFFBCCDDACGJKMPW[\XXWQSPOT[enmpfehee_WLCDCCDDHFCDDDFEG—––—šš˜˜˜–›š™��—™—’’’‡ŒŽ�‹ˆ„ˆ†Š…„„„†‡„€zuwvuouz}€nbVQMUfs|€‚ƒƒ~~ƒˆ„‰‡„„…‚…„……ƒ†‡…†ƒ…‹Š‡‡‹ŠŒƒˆ…††ˆ‡‰ˆ†ŠŠ‹ŠŠˆŒ‰�ŒŒŒŒŽ‰Š„„�‚‚‚„ƒ…ƒ„€}||~‚€Š„†ˆ……ƒ†ƒƒ†ˆ…‡ˆ‰ˆ‰�‡‰‰†‰ˆ‰‡ˆˆˆ†‰ˆ‡‡‹ˆ‹‰‰�ˆ‰Œˆ†‡‰‡ŠŠˆ‡‰‰‡‹‹Œˆˆ‡…‹„ŠŠˆŒˆˆ‰‹‹�ŠŒŠ‹�Œ‹Šˆˆˆ‡ŠŠŠ�ŠŠŠ‹‰Œ‹ˆŠ‡†„‡ˆˆŠ‹‰Œ‹����ˆ��ŠŠŒŠ�ŒŒŠ��‹‹‹ŠyN@BAAC@@CO`gmieebffiddca`a```]abd^]b^[^^^[][aZX\Z^a]]QE>?Ig€ˆ‹…‹„††ŠŠŠŠ‹Œ��ŽŽŽ�‹‡‡‡‡‰ŠŒŒ‹‹��‰†ƒzjhikimy…�Šƒyz‰�†wl_SMOQILMIGIGINQ\dv��…‰‰‰Š‰‡ˆˆ‡‰ˆ�‰ˆ‰Šˆˆƒ„†„‚~{ycSKKJHEDHILJLEGGGOYUVOQNKSSTTSMICFCDDGDDDCFAFCFG@AFFGGIMJW_gqqh^Z[]_acjge]YQTT˜———˜›—™š™›››Ÿ›œ—–š“•’’�’�Š�ŒŒŒ‹Šˆ‡‰Š„„�€xjigz�}~{{rkf^^adv{l[aq~‚†�‚ƒ…ƒ‡‰‰„……†…‡„‡‰…„†‡††�ƒ†…„�ƒ‡Š‰‹‹‹‰‹‡‹‰Šˆ‡‡ˆŒ„…ƒƒ‚‚‚~yx~‚~mW[u�…Šƒ†ˆˆ††ˆ†ˆˆˆŠˆ‹†„‰‡…‡ˆ‡‰††…‡Š‰�ŠŒŠ‹�‹†ˆ‡‰ˆˆˆ‡ˆˆ�‹Œ‡Œˆ‹‹Šˆˆ‹‡‰†ŒŠ‹‰Œ‰‹ŠŽ‹ˆ�ŒŒŠŒˆˆŠ‡‹Šˆ„‹ŠŠ‡‰‹‹ˆˆˆ‰…ˆŠ…‰Š‡‹Œ��Ž‹���‹�ˆŒŠŠ‹Š�Š��Ž�‹Š�ˆ‡nIBBC>>IWpxyumgjjcgdadbccdf```cab_b`^]\[^\Ya\^Z[Z_[^\L???<>@?G`‰‰‹‰ˆ‰‰‹‡ˆ‰‰Œˆ�ŒŒ���‰Š‰�Š‹‰ˆ‰ŽŠˆ…|wnjokklqu€‡‰†‚‚}ƒ‡ˆ‚r`XRPPOOHHFFDDFJSdnxx{ƒƒ†‡„…ƒ‡…‹Š�Š‹�Љ‰†„ƒ€ƒ~p[IGIDDHAFDGJGGFBFGPPRLTS]bcdfaYJGHEFGDDDEGEEEDECCEC@DCEFFLMW]id_]`flnnvytqk_fa——–——ž—˜™—›š›�›˜š˜˜˜’”’’�‹‹ŠŠ��ŒŒˆ‹Š‡‹ˆ…ƒ…}|zz„€ƒ�}}{nnkmmu{ykgv|„‡„…Œ‚…�†ˆ††�„†„‹ƒ†‡…ˆ……††„‡†…€……‡‰ŠŠŠˆˆˆˆŠ�ЇˆŠŠ…‚„‚„„…ƒxx€}dQTiy„‰…†…ƒ‡ˆ„‡ˆˆ†‰‰‹‡Š‹‹ˆŒˆ‡ˆ‡†‡‡ŠŠ‹ŠŠŠˆ‰‹Šˆ‹‰Š††‡ˆˆŠ‰‰ˆˆ‰ŠŠ�Š‹�ˆˆ‰‹‰Œ‹ˆˆ‡ŠŒ‹ŽŒŠ�‰‰Š‰Š†Š‰‹…‹‡‡†Š��Ž�Š‹ˆŠ‹‰‡Š‡‹‰‡Œˆ‹���‰Ž‰�ŒˆŠŠ†‹‹‹‰Œ‹ŽŒŒ…qFBBB=JXjv{xrokjiihgdcddccba`bbab^`aa]]_\][]][Y\\Y^ZVF?;<;??=Ea}†‹Ž‰Š‹ŠŠ‰ŒˆŒŠ‰Š‹ŒŠŠˆ‹�Ž‹�Œ�‰‰Ž‹‰€zwxvx|{{{|‚…„†„…€~‚|laZVV[VQJDGDC?FJOV`gegmx{z}€}€|~‚‡ˆŒŠ‹Ž��Œ‰‚~{tl\NICGGCDGBDBHCGEDEFJHDJNVgmsppiYRJJGHFDGDGGHFE@AFCEADABACCDCGMRSTV[agot€‚€}wtut•–™–šššš˜›———š�–�————’’’�Ž‘ŽŽ�Œ‰Š‰ˆŠ…‰…ˆ„††‚ƒƒ„………†„†ƒ€zwzz{v}�‡ˆ‡ˆˆ‡ˆ‡ˆ‰…„‚††…‡„‡…ƒ…ˆƒ†„‰‰‡Š„ˆ†…Šˆˆ†…‡„‡‹‰…†ŠŠŠ‰…ˆŠ‡…ˆ†‚}{}ydTR]s†ˆ‰ˆ‰††‰‡†„ƒˆ‹…ˆ‰ˆ‹ŽˆŠˆŒˆˆˆ†‡‡†‡‡‡…ІЇŒŠˆ‹ˆ‹ˆ‰ˆŠ‡ˆ‡…Ї‰‰‹‰ŒˆŽŒŒŠ‹„ˆˆˆ‰‹‰Šˆ‹‹‡‹‹‹�ˆ‰ŠŠŠ‡…†‡‡ˆ‹ŠŠ�ŠŒŠŠŒ‹ˆ‰ˆ‰‰Šˆ�ŒŒˆ‹ŒŒŠŠ�Љ‰ŠŠŠŠ‰‡‹Š…nF>ACDVkx|zxrnihegghgchdded`ca^caacb_[[b\^^_^WZY[Z]VK>@=?=??=;?<>?E`w…ŠŠ‡‡‡‹‹ˆ‹ŒŒŠ�Œ‰ˆ…‡ˆˆŠˆŠ‹‰Œ�‹Ž���ˆŠ�‰‰‡†€†‚€††‚‡„‚€‚„|rijjjkqgWTNKHHKJLMMNNKNVUZ`akqghipnu‰…‰ˆ‡…zlbQOJGFG>BBCFCCHJCD?FDCFECCDFLRRRQNPSPNIEGJDFBEH>CDBCCGGGFDEIDFFBBFHIMJHOVfu{ywwz~€š–”—šššš››››››šš˜š™—’””’“�ŽŽŠ��‹ŒŒŒˆ‹ˆ‡„††‡ƒƒ„�†„†…†…ˆˆ……‰ˆ†Ž…‡†…††…†„‡‚†ˆˆ…………‹ˆ„‹„‚†…„ƒ„‚}ƒˆ††…�‹‰‰‰ˆˆ‹‹‡‡‡…‡ˆˆ…ˆ†‰‹ˆ‹Š‡ˆ†ƒ�u{tcZVbp€‡‡ƒ†ˆ…‡‹ŠŒ‹ˆ‰‰‰‰„ˆˆ††ˆˆŒŠˆŒŠŠ�Š‹‰ŠŠ†„ˆ…‡‡‹Šˆˆ�‹�ˆ�Š†ŠŠ„‰‡‡‰†‰‹‰‹ŠŽ�ˆŽˆ‹�ŠŒ‹ˆ‰‡‡‹‰Š‰‡�މŒ�‡Œ‰Š‡‰‡ŠŠŠŒ�Š‹ŽŽŠŽŒ�Œ‹ˆŒ‰‰Š‹‰Ž�‹����‰ŒŒ‹Š‚eD?>I\s~‡‚�xvqhchdcdbdb`dabebda`acac\]]^]][_]^[\`\WG?>>>=>>?==>=<>=BWt†ˆ‹‹ˆŠŠ‹‰ŠŠˆˆŠŠˆ‰‡‹‹�Œ�Œ‡‚Š‹‰�‹��ŠŒ‹ˆvns}|zuk[agw�‡„ƒ€y{wtxytiddc[UQOPKNIFDDGNJMTV\`bg`^fr{†ŠŠŠ€{vi]VPQNIGLGHIKJJIFADHFKDGBDAGCGFABGJJJIDGBEFGD?BBA?CDDILPKRXWVSKIGKNQSPPVaknsoomgjo———˜™™™™›˜›™™›—œš˜™“–’“‹��ŽŒˆ�Ї‹Š‹ˆŠŠ‹ˆŠ‡†Š„‡Š‡……†Š„‡„……††Œ†‡‰‰ˆ‡Š‰‰‰„ˆ‡ˆ‡‡…ƒ…‡„‡„†‚†Œˆˆ‰‰Š‰Š…‰„‰„ˆ…†Š‡‰ˆ…І†ˆ‡ˆ‡‰…‡††„†ƒƒ†…€{~~€vrjgixƒ€~„…„…‰‡†‰‡‡�ŒŠ��ŒŒŒ‰‰‰‹‰‹…†ˆˆ‹‹��‹ŠŠˆŒ�‡‰††‡ˆŒ‰‰ˆ�Š�‰Œ‰‹ˆ�‹Šˆ�Œ„‰‹ˆ‰ˆŠ�ŠŠŽŒŒ�‰‰‹ŠŠˆŒ‰‹Š�Љ“‰ŠŒ‹ŒŠŠŠˆ‹‰‡ˆ‰ŠŠ‹Ž‰��ŒŽ‰‹ŠŠ‹ŒŒ�ˆ‹�Œ‹…c@ANg{‰†…{zuoieeheccfdcd^f`d`^^a`cbaaa]_Y[[Z]X^aVH=>=>?;<>?=BYtƒ�Љˆ†�‰�‹ŒŠŽŠˆ‰‰ˆŠŠ‰ˆŠˆ€nzˆ’ŽŒˆŠ‹‡‡‚zffpsrkeVORev€€†�nntzz~€ukihme[YXSNIDD@GGILLLS[`kqpjfs„ˆ‡‰‚€yscdaaWSIKKJGJHFIIFFGIFHEDCDDDDAAFGFIHHEGECB@ACC=CDBBCGLLQTXXSLJHGMHLLILVcnxsuumpou™˜™–œ™—š™œ˜›™™™™›™™™—••‘����މ‰‹‡Š‰„‰‰‰‡ˆƒˆ‰†‡Š„ˆŠ††‹ˆˆˆƒ‡‡…†‡ˆƒ„…†Œ‡ˆŠŠŠ‰…‰„ˆ„„„…ƒƒƒ…‡ƒ‡ˆŠ‹‰Œ‹‹ˆŒˆ†‹ˆˆˆ‡‡„††ƒ�†…††‡‡Š‡†ˆƒ…†…€�||zsdX^p~�€€…‰„‡‡ŠˆˆŠ‰ˆŒŠŽ‹‹Œ‹ŒŠŒŠˆ‡‡…†‡‰�‰…ˆŠˆ‹�‹‹‰Š„ŠŠŠˆ‡‡ˆ‹ˆˆˆŒˆ�‰Œ��ˆŠ‡‰†‰ˆˆŠ‹Œ‰ŽŒŽ�Š��‹‰�‡‡‡ˆŠŒ‰‹‹‰�ŽŒŒŒ�‰ŠŠ‡‰‰‹‰‡Œ‹Œ�ŒŒŠ‘Š�‰�‰‹‡Šˆ�€ZAG_vˆŠ‰‚ƒ|zrngecebejbecebfaba_a````__`_[YSTVV][[P?=:=>?===??FTs‚‰Š‰„‡‰�‰‰ŒŒŽ�‹‰Š‡Š‡„�vwd^v‹���ˆ…‹ˆ|rjgbaaa[QHRhv~ƒƒnYZkt|€{zlbekf]\ZWSJDGCDDIGGNRY_msxtpx~ƒ„‰„ƒ|xunjng]XOJKFGGGGHGEGIDFDFFABDCBCEGDIJEFDIFHBDBB>>BDACDEFHNRRNKJHFHCGCCFFNWgpsxwxzyw——––™šš™››™›š›™›š—˜——••���“ŠŽŒŠŠ�ˆ‹†ˆ†‰ˆ††…†„‡ˆ…†„‰‡‰‡Š‰Š‰†„„‰‡„„†„„†ƒˆ‰‰ˆŠ„ˆ‡†††ˆˆ†††„„……‡ˆ‰‰†Š‹Œ�Ž‹ŠŠŠ„…††ƒ…ƒƒ�††ƒ„ˆ‡‡‡†‰„‡ƒ†€{{xkWP\ku||ƒƒƒŠ‰‡Ž‰Œˆˆ‹ŠŠ†ˆ†‡�‰ˆŠ‹‰‰‹‹‡ˆ‡ˆˆ††††ˆˆŠ„Šˆ‹Š‹‰‰‰ˆ†‰†‰‰Š‰Œ�‰ŒŒ�‰‰ŠŒ‰Œ‰…ˆŠ‰‡†ŠŠ‹‹�Š‹Œ�‹‹‹Šˆ‹Š‰‡‹ˆŠŒ�‹Ž�ŽŒ�Œ‹‹‹ˆˆ‰Š�‹��ŒŽŒ�ŠŒŒŠŒˆˆ}Z@PgƒŠ�‡ƒƒwvojcfface`bcgdbcbaa__\`^_^^^PLNMQU\]WG==>>;<@>;>BEGQX_N?=><>9=?>;;;?EOZWF<<=;>=<>==?=BMm€Ž‡ŠˆŠ‰Š‡‹‹Š…Œ‡ŠŠ‡yeemm\[_nv}ƒ{}ƒ€|xxmZQVabfnrjbWV^^WTPVYcbgZQNPOOVURMNPRRQSUPSNMFHHMMKNTW[_flicceeaY^_`YNMMMGHIKHGDGJHCBD@BBBCHJNRKMCGAHFDFGNSSS^^_]UONPMKIHEDFGHGGFEDECCBBHINSVXX]˜˜—˜›—™›œ—š™—ššššš—˜””’‘��Œ�‹‹‹Œ‹ˆˆ�ŠŠŒŠ�ˆ‹‰�‹‡ˆˆ‰ˆ‰†ˆˆ‡‰†Š„„ˆˆ†ŠŠ‰Š�‰‰†ˆŠ‡…†…„…ˆ…�‚…ƒ‰‡‚Š‹ŠˆŠ‰ˆŠƒˆ…„…ƒ„€‚‚†ˆ†‚‹†‹ˆ†ƒˆ�„ƒ„‚…‰‡…‚€�‚‡……€|ƒ‡ˆŠ‡ˆ‰‰Š‰‹‹ŠŠŒ‹‹‹Œ��ŠŠŠˆ‡…‰‰Š‰ˆ‰Š‰ˆˆŒˆ…ŒŒˆ‹……‹‰‡ˆ‹†‹�Љ‹‹‰‡‹ŠˆŠ‡ˆ††‹‹‰�Š��‹Œ‹ŽŒŒŠ‰‰Š‡‰‹‹‰ŠŠ�‹���ŒŒŒŠŒˆˆŒ‹‰ˆ‹‹��ŽŒ���‹Œ‰�‰�ŠŽ�ŠŒxX[xˆ–‹‹†ƒ€|ttofjhiighgdfcaeccadaa^_aa_cTD=?ADPXM?=:?>:==><;>:@Oh‰‡‡‡Š‡Œˆ‰ŠŒ‹ŠˆŠ„�nbfvzmjpuvy~rrlgh^VRQR]ahnomeU\WXRWUUV^`[PMQPRWYRGEIORXWUSPQPNHEJFGEGJLLQTURLORZ\\age^NJNNIIKHJMLMMMIEBBCDCFLPWYSNIHGAFCDELUV[dle`XWQQRKIFDGFGGFHHGDBDDEAGFFMNRST˜–—˜›˜›˜˜˜›�™š˜™�—”˜–”“‘‘‘‘Œ��‹‹‹‹‹�Šˆ‰‰‡ˆ†‡ˆ‰ˆŠŠŠŠˆ‰ˆŠ‡‰ˆˆ†‡†‡„††‡…‰‡††Š‰ˆ‡‰‡ˆŠ…††ƒ‚…ƒ…„‡‡ˆ‡Š‡‹ˆˆ‰ˆ‡ˆƒƒ„„ƒ†…ˆƒ…‡‡‡ƒƒƒ…ƒ‡„……~‡Š†„„„†‡‹ƒ…„Љ��ŒŠŠ‰Œˆ‰Š…ŠŠˆŠŠ�‰‹‹�ЉЋЇ‰‰‡ˆŠ‡†‰…‰‰‰‹�ˆ‰ŠŠ‰ˆˆŠ‡ˆ†ŠŠŠŒ‡‹Œ��ŒŠŒ‡†ŒŠ‡Œ�‹Š‹‹Œ�ŒŒ��Š‹Œ‰�†‹‰‡ŒŒ�Œ��‹�ŽŠ���‰‰Œˆ‹Š‹ŒŠŽ‘Œ�Ž�Ž�Š�Œ�ˆŠx^d}�‘�Š…†�€ztljdjhkihbebceigjbbc]a_^aa_X?B>>JQRC;;<;;>;=?<<<@>Qm€‰‰……†‡ˆˆˆŠŠŒŠŠ‹Š�trt�„y{{|||{qb_[b\WRLOT[bbg`b``]SNQZ[WWQYRKIQRVZVLFEIMS[QQLHHHIGGGIHBDEILGGHGECGMP\`jm]OJMPKGGKPRKPONPKGFFEIIKS[XSQJLGFGDDGIOWVbg^WSTOOMKIGGHHHFDGHGDFFFDCFGIJQQRU™–—˜˜›™—››š™�š™šš—™–—”’�’���‘��Œ�ŠŒ��†Œ…ˆˆ„�ˆŠ……†‡‹Š‹†‡‡Œˆ‰‡ˆ†ˆŒ………‡†„…‡‚†ˆ‡†‰‰…‡ˆ……‡†„‡‚‚‚†‰‰‹Š„‡ˆ‰‡…‡‰ƒˆ‡†ˆˆ…�…†€�ƒ~ƒƒƒ„„€po|‡‰Œˆ„‡…ˆ‡‡‡‰‰�‰Œ��‹ŠŠ�‡‰…‹ˆ‹ˆŠˆ†ˆ‹Š‡ˆŠ�Š‹‰‹‹ˆˆˆˆ†Š‡‰Š‹‰‰��Œ‰‡‹…‡ˆ‡ˆ‹Šˆ‹ŠŠŠ�ŒŒ‰‹�Š‹Œ�ŒŠŠ‰‰‰Š���ŒŽ�ŠŽ‹ŒˆŒŠ‹ŠŠŠŒŠŒ��Ž��’‹‹Š‹‰‹‰‹‹�‹Ž�����Œ�Œ�†zcqˆ���ˆ‰„…{vlkgigkhcfcbb`fdfcg`c`]a__aSD>==EIF?<<=;><:==:@?>AOfƒ‰Š…‰…†…ŠŠ‡ˆ‹ŠŒ�Їƒ‚ƒ‡ˆ‡‚�‚~uuh`SV\c\VPTPY\^ZWWS[^[NIUXZXUQMKLFLSTWSIGIKSVSOJEDB@DFBGCHCDGIIIE@A@?@EGKV^b\POPTKKKKMOMKJOOKMHJOJJRRXZQPOIIFFDICHIOS\XSOPMJHHJIGDFFGGFIEGCCDCCDAHELNQRX”—˜˜™—š–˜›ššœ�œ�™™˜–””“����Š�‹���ŒŠŒŽ‹‹Š‹ˆˆ‡†Š‡ˆ…ˆ‰…†„„‡Š‡ˆˆ…ŠˆŒŠ‰†ˆ††ˆ‚�††‡„„„†‰ˆ„†…ˆ†‰††…‡„…‡ˆ…‡„………†‡†‹ˆ‹ˆˆ„„ˆ†‚€~|~}}xwxc]o„‹‹�‰ŒŒ‡ŒŠ…ŠˆŒ‰‰‡ŠŒŠŒ��ŒŒŠŠ�‹‡ˆ‡…ˆ‰†‰‡Œ‹ŒŠŠ�Š‹‰‡‡ˆ†‡†‰ŠˆŠ‹‹ˆ‹ŒŠŒ‹‹�Šˆ‰…‰Š‹‹‹ŒŠ‰‹�ŽŽŒŒŒŠŠŠŠŠŒŒŒ�ˆ�‰���Œ�ŽŠŒ�ŠˆˆŒŽŽŒ���‘ŠŽŠŠ�މŠ�ŒŒŒŠŒ‹����Œ‹~mx‹�ŽŠ‡‰„�}wwqkhikkfggffbdecadcecdca]abXB=>>ADC;=>;>>>=<=?:==?Gg|‰‡‡Œ‹‰‰‹‡‡ˆŠˆŒ�ЉŒ†‰ŠŠ‰‰…„qk\MNT`f\TTTSW_[WNKJPVRKKSTUYWOHGIKPPWRNEHNQUTOJIFEADDCFCBCCDEHIIHDDCCCFBFGNWQNNRQOLOMLLIIKEGMKMKOOLOSWXQNHHGHJEHHGIKNQSMMKLJIJGGEFHHFGHIHDHCDDDECDGIGNPU•—˜š™›™™š˜•šš››œ˜˜™™™–�‘�ŒŠ‹Š‹�ŽŒ‡‹‹‹‰��‹Š†Š‹ˆ‰ˆ‡‰‡††‡…†ˆˆ…††‡‰Œ‡ˆ‰ˆŠ†…‡ˆ…ˆ„…ƒ……„„ˆ„‡‡ˆ‰Š‡Šˆˆ�ˆ‰‰†………‚„‰†‡„‡…………„‹€|zu{{ofqsdT_y‡�‰‹‰‹Œ‹ŠŒŠŠŠ‡Œ‹ŒŠ‰‰ŒŒˆ‰‹��Š‹‰‰‹†…‡‡‡‰‰‡ŠŠŠŠŠ‰Š�ˆ‰‹Šˆˆ‰ˆˆˆŠŒ‰Œ‹Œ‹�Œ�‰ŠŒŒ‡ŠŠ…‹��ЉŽ�Œ�����ŠŒ‹ˆŠ��‰‰Šˆ�Œ�Ž�ŒŒŒ‹‰Ž‰‰�ŽŒ�Œ�Œ�����‹ŒŽŠ�‰‹‰‹��‹‹}u€�“�Š�‡„ƒ|ytpifilhdjggabbhca`daea_]_e`XE=;==A><;=?@;>:=?:>He}‡‡ˆ‰‰‹ŒŒ‹ŒŠˆ‹‰‹Š‹�ˆ…„ƒˆ‰‡‡{tiSJKT`h^]WRQTXTLGFFKOURRTRRYZQIBFLOUSSHHMTVYSLIHIFIHHHGDCACBHGJIFHHIKIHGGGJJNMNPKHHLGHJIKLILIHMMOOLMNTQOIBCCGFHILGDEHIIJFKNLJGFFDGHIGFGGGDFDEGEFIDGHJGMT˜–—˜˜œš——œš›�–šš–™˜˜–‘’’���ŠŠ‹‹‹ŒˆŠ‰‡ˆ‰‹‹‡‡†ˆŠ‡‰‹ˆŠ‹†‡ˆ†‡‰…„„†ˆˆ‚…„‹‡ˆ†‡„ˆŒ‡……‚‡„„†„†…‰…‹††ˆ‹‡ŒŽ‰Œ‰‰Š†††ˆƒ„�„�{‚ˆ…xuszye_nvkU[p~„‰Š‡‰‡Œ‹�‹���ŠŠˆ†‰‰‹Š‹‰ŠŠ�‹�ŒŠ�‹‰‹ˆŠˆ†Š‰ˆ‡‡Š�Šˆ‰‰‰ŠŠˆ‰ŠŠˆ‰†ˆ‹‹ˆ†ŽŠŒŒŽ�Š�ŒˆˆŠŒ†ŠŠŒŒŒ‹Ž�ŽŽ���ŒŒŠŒ‰Œ…‡‰ŠŒ�‹��Œ‘‹�‹Ž‹�‰�ŠŠŽ‹��ŒŠ��Œ��Œ‹�ˆŒ‹Œ…}{‰“”ŽŽ�Œ†ƒ||rlgeghhgfgfgececcdcf`^_\ab`ZC<@<==>@::B9;>=<:=F^}„ˆˆ†‰‡‡ŠŠ��‹���‰‹�ˆ…ƒ…ƒŽ‡…|ugQKQXhhgZYPJUQLGACCJVY[\UTWXVMFEENPSTQIIS_`]SIFGGILQPKOIHCCFHKEIHHLNOOKMKKKLLNLMNHGFEGFHPKLMHIIINMLHHPLKKCABBGDGFDBEFFCFEJHMKIKFKFILIEGGEEHIKMJILMLOMJHS˜˜—š˜—™›››�›ššš�—™”˜‘’’‘Ž�‘��‹ŒŽ�Œˆ‰‰Šˆˆ‰ˆ�…ˆ‚‡‹‡‰‰ˆŠˆ‰‡Šˆ…ˆ‡ˆ‰…ˆ„†„††„ƒ††‡†††‰…‡††„‡„‡…†‡…‰‡‰‰Š�‹‰ŠŠˆŠŠ††„„�{y|‚}zuts~tb[lzs_]es~‚ІŒ‡‰Š†‰ŠŒ‘‹ˆ‰‹‹�‰ŠˆŠ‰‹‡‰‡Š‹Ž‹ŠŒŠŒŠ‰Œ‰‡‡…‰‡Œ‰‰‡Œ‡‹�ŠŠ‰‹ŠŠŠŒ‰‡ˆ‹‹ˆ‹�Ž‹‹�Œ�Œ‹‹‰‹ŒˆŒ‹‹�Š�ŒŒ�‹��‹�ŠŠŠŠ‰ŠŒ‹Ž�‹�‹�ŽŽŽŽ‹Œ‹‰Ž‹‹�Œ‰��������‹‹‹Š‰Š”‘�Œ‹ŠŠ�€yunififciddkef_aecdbe`a_``^^WG;=;?<==;=;;=<<><9>Ecy†‰…‰„‰‰‡‰ŠŒŒŽ�‘�Œ‹ˆƒ|„І€ykdZZ\`gmg[QKIKJHB@CGPX``[X[YVTIFHHKOQOJLJ\gjdUNGJKNTVVSVPNIKIQNNJIJMPOMLNNOOKKKMLMHFDBBHKINGMKHIFLMKKHJKMFC?A?CECGDBEGEDA@CFGJLIJGIKKJHLHHHISX]TRTWTTSNNS—˜–››™™™˜˜›™šš�œ›™——•”Ž�‹Œ���Š��ŽŽŠ‰‹�ŽŒŒƒ‡†…†…Šƒ…††††Š„ˆ‰‡†Šˆ‹‡†…Š…‡‡…„‚‡„………†ƒƒˆ…Љ‰†‡†‰ŠŠˆ‡‰‡‡ŒŠŠˆŠŠ‡ˆˆˆ‰ˆ€€ƒ‚uqqvzpccqyvhfhpyƒ‡ŠŒ‰…†…ˆŠŒ‰‰ŠŠ‹�ˆŒ‹Œ�‰ˆ‰ˆ‡‡Š‹‰Œ‹‹‹‰‰�‰�‰Šˆ‰‰‰‰…ˆ†‹ˆŒŠ‹‹Ž����ˆŠ‰Š‡ˆŒŽ‹‰Š�‹Š�‹�ŽŽŒ�‰‹Œ‰‹‡‹ŒŽ�‹Š��Ž�މŒŠ�†�ˆŠŠ�Š‹ŽŽ����‹‹ŽŠ���ŠŒŒ�Š���Ž�Ž„‚‡����‰‡Š„‚x{vnfgjecfggeieddb_acdcc``^__XE=>>=>>?>>>A;;Fe|†‹ŠŠŒˆˆ……‡�ˆŒŠŽ�‡ƒ€{su{ƒƒwi_a\afieifXQGGHCGAEGLXZ`USSTYUJGEEOOLKIIJOcmmaRPRVYX[_]X\WWUTQQROJGKOMLKJMNQJKGKKLNJFFEDGHHGGHJHHHNMMKLLIKGCC@@AFAECHGIIGFFCCJEJKIMKHIJJKLLHO[`a_Z]]^ZTXU[˜—š˜›˜›™ššš›™››œœ›—–“‘“�Ž�‹Ž‹‹�Љ��ŠŠ‹Œ�‰‡‡ˆ‡‡ˆ†††ˆƒ†…ƒ…І„‡Š‡ˆ„‹…‰ˆˆ‰†ˆ…ˆ‚ƒƒ€ƒ‚ƒ„ˆŠ…†ˆ‡Š‰�‰‰‰ˆŠ‹‡‡ˆ‡„ˆ‹ˆ†‡‡‡„…}yogmsurjhtxyspru‚‰�ŒŠ‡Š†Š‹‹‡‡Š‹‹†‹‰‹ŽŠ�‹�Љ††ˆŠ‰‰Š‹Š‰ŠŒ‹‰‹ˆŠŠ‰‰‰‰‰…‡Š‡ŠŠŠŒ‹Œ�ŽŒŒŠ‹‰ˆ�‰Š‹Š‹‹�ˆŽŽ��‹ŽŒ‹Œ�ŠŠ‹Œ�‹‰‹‹Ž���Ž��‹�‰‹‹ŒŠŠ�Œ‹�ŽŠ�‘�‹��ŒŒ‰�Š‹‹‹ŽŽŒ‹Š‡‹“‘Ž�‰‰ˆ�yztmijighieifdcccd_aa`c````a`ZD>;<>>=;==@====<=<9?:=F^x…ˆˆ‹‹‹‹ˆŠŠ‹ŠŠ‰‹�}upomeo€€sc_^a___emg^KHFDIGILS\\\VJKJOONJFGLPNOJGJKWgnjYQR]dlfkmfcc]aZVSSTLMFILJKHILPMJJGFHKPMKKGGHIFIEFGGILKKPNJIJIJJCD@EFGGIGGHIJIJHLFKKJLKKJGKLKMJLKZ_`b_a^[W^_^^˜———™˜š˜›˜›™”š—š˜˜—˜–—”’Ž‘ŒŠŠŠŠ‰‹‰‹ˆˆŠŒ��ˆ‰†Š‹…‰ˆ‰†„ˆ††‡ƒ†„Іƒ„…‡ƒ‡†‡ˆŠ‰‡Š…††ƒ‚‚‚}††„†……‰ŠŒ‹Š‹Š‰‰Š…‰‡‰††…‡†…„‡ˆ~tlhktruvt{|€{~z€ƒ„Š‹‹Œˆ�ŒŠ‰Œˆˆ‰…Šˆ†Š‡ˆŠ‰�Љ‹‡‹‰‡ŒˆˆˆŠ…‰Œ‡ˆˆŒŠŠ‰Š�Œ�‡†‹ˆŠ‡Š‡‰Œˆ‹ŒŒ�‹��‰ŒŒŒ‰‰ˆ‰Š��ŠŒ�Ž�Œ��ŒŒŽŽ�‰‰ŒŠ�ŒŒ��‰���‹��ŒŠ�ŒŠŒ‹�‹ŒŒ����‘މ�ŠŠŠŒŠ‹Š�†‡�–“’�‹ˆŠ…}xvnihegeiiihfcbdgbbaaccb\ebb\D<>>>;?;=>;?@9>?;=<=<>>=A:><=;>;><>=:FXs„‡…‚‰‰‹‹Œ‰�ŽŒˆ‚ynortohlw~{xuyqcffqvzgWQQQV^_aehZNMMHFDGCGFLHHMKOLIKW^\UZZa`n|‚�qgiha\ZTNNLJNKFKHHINMKNMINIKGGFGHDJGEIHHNMHJHDDDFGGGIEGEFJNMNKIIFEFGJLLOJMMLLKGGIJGEDEPKQSZ^^[[^fg_š——™•–›˜š˜›™š�™›˜™—“’•–‘�‘މŒŒŠŒ‹‹ˆˆŠŠŽ‡‹‰ˆ†ƒ„†…ƒˆ‚‚ƒƒ‚‡‰„†‰Š†…„�†�†…€„ƒ�‚ƒ„ƒ‡‡ˆ††‡�‰ˆˆ„„…‡ˆ†ˆŠ…‰‹‰‡‡ŠŠŠ‰ˆ‹ˆŠ†„…�|ytsrqsx|~€†‹Š†‡†‰‡‡††‰‰‰‡Œ‡Š�Š‹‰�‰�ŠˆŠŠ‹‹‹…‡‡ŠŠŠ‹‹‹�Œ‰Œ‹‹ˆŠˆ†‹‹‹ˆ‰‹Œ�‹Ž�‹Œ�Љˆ�‹†‹‰‹ŒŠŒŒŠ�����‹ˆ‹���‰�ˆŒŒ�����‹�‹�‹‹ˆ�‹���‹�Љ”Œ�������‰ŒŒŽ‡�Ž��Œ�ŒŒ��ŠˆŠ�”�‹‹�ˆ‡‚€€zurkgheeeeeebacgfecfc^ac`d^ZIB:==:===>B>:<<:<:;9<=>C[wˆ‰‰Š…‰‡††ŽˆŒŒ…|mls~tvxx||€ukqsu}y_V\`[bcf_fbTINLKFHIFGGIIDHGNLHMQVYV^fiiow~…ƒ€n_`dd^ZWTPRPKGJMGLIMMLLQOLHIFFFCFEDDGFGKKLLIIEDBCBCCE?DEDJNOLOLIGIIDFGHKKIJIIILLHMIHGFINMRUWVTVZd^_”š˜›—š˜™™œœ��ššœš™–”“”“�Ž��Œ‹�Ї‰‰‡‹‹‰‰�‹†‰‡ˆˆ…‚…‚ƒ€ƒ‚ƒ„ƒ‡‡…‡ˆˆ‡‚‡„†‡†‚‚‚‚‚�‡ƒ‰„ˆŠ‰Š‰ˆ†‡†ˆŠŠŠ‰ŠŠ‡…‡…†ˆ�‰ŠŠ‡Œ……„€}�zvsr{wvtwy…ˆ‰‡‹‡‰‡ˆ†Š‡ˆ„ˆˆ‡ŠŒŠŠŒŠ‹Œ�ŽŠŠ‹‡‰ˆŠŠˆŠ‰ˆ‹Š�‰��Œ‹‹�Š‹‰ˆ‹ˆˆ‹‹ˆ�‹‹Š�ŽŽ‹ŽŒ‡‹‹ŠŒ‡Š���Œ�Ž��Œ���ŽŠŠ‹ŒŒŠŽŠ�Ž‹��Š�‹ŽŒŠŠŒ�‰‰�Ž�‹��ŽŽ‹ŽŽ�ŒŠŒŠŒ��ŒŽ‹�ŒŒŒ���‘’“�‹‹††€„}zuskkihiiccdbbcdiebeace`aaWKB><=><@?===;:==>8><==<=CVs…Š�Šˆ‰‰‡‡ŠŒ‰…‚zmq}ƒŠ‰‚~y|�€€€xtvst{uYSape`fbde`QLQKIFFGGGJHHIGJIONNWY`_elquux€ˆ„hVW``_`XZSROLIIJMMKKIIOMLKIEECCFBAGEEGEHFJGGHFDDAC@BEFCDEHLMNDIJGIIEFFFDGDDGIEIJHIIJIKLPOONQOQRWZ[^‹™™˜š™˜˜™—œ•—š›™�›———–”��’�Œ�ˆŠˆ„‡†‹‡‰Š�‰‡�†‡ˆ†…„‚�„„��„†‚ƒ�‰„…ƒ„ˆ‰ˆ†‰„‚…‡ƒƒƒ‚ƒ„…‡…ˆ………‡†ˆ‰‰‰�ŒŒ‰‰‡‡„…ˆ‹……ˆŠ‚„‰��‚ƒ€zz}€{ojlr{�……ˆ„‰‡‰‹�‰‰‹…‰‰‰ˆˆ‰‹‰‡ˆŠ‰‰ŽŠŒŒŽ‰‡�І‡Œ‰…ŠŒˆ‹‹‹ŒŠŒ�‰��‰ŠˆŠ�‰ˆ��Š‹Œ��ŒŠŒŒ�Š�Š‹‹ˆŒŒ��ŠŽ���ŽŽ��Š�‰ˆ‹Œ‹ˆŽŒ���Ž��ŽŒŒŒŠŠŠ‰ŠŽ�‰‹�Ž�‹ŽŽ�‘ŒŠŠŒŠ‹ŠŠ‹�‹�’•‘‘‘‰‡‡€~~usrliijhgddhgggeebecf_`ba[K@>?=<=;:?==><;8<;<;=<=;==Sp„Š‡Šˆ‹ŠŠ�ŠŽ�†~zx{‡ŠŽ††}‚Š„�€€|zojxs]Tcoa\]acgaURMNHDEICDJMNGLMPUTW]bnmoxx}xz…‰†zaRRT][[XUTRKJHFKIIJHGHGKGGGCGAC@GFHIEFDCDDGGHJJDBEFEDEFGDHFJGGHBIIEFFGDCEG@BFEIDEKHKJLPQSRSNRTPSWX[€”ž–˜™˜š—�™›™™˜š›š–—˜’“�”Ž��Œ�‰‰Œ††…ƒ†††ƒ‡ˆ„†‡ƒƒ†„„…‡†‰‰„„…„‚…�€ƒ†ƒ„‡‡……†‚„„„„€„€�ƒ…„…ˆ‚ˆ†ˆŠŠŠ†ŒŒŒŒ‡‰‡Š‡ˆ…„��ƒƒ}{ƒ�~~{€€xpmmx{~zxƒ…Š‹‰‰‹Š�‰‹ŒŠ‰‰‰‡†‰ˆŠˆŠŒˆ‰ŠŒ‹Œ‹‰‰‹ˆŒ�ˆŠˆ‹‹�Œ‹��ŒŒŒ‰Š‹�‡ŠŠ‹‡Œ�ŒŒŠ‹��Š‘�‹ŠŠ�‹‹Š‹‹ŠŽ����‹�’�Œ‹Œ‹ˆŠŒŠŽ�‰Š�‹�ŽŽ��ŠŠŠ‹�‹‰ŠŠ‘Œ‹Ž�ŒŽŒŠ�‹ŒˆŠ‹‹‹‰Ž•–“‘�‹Œˆƒ€{uqqjhmkjdgcgifkhhcec_bd`XO@@@>==<@<=<;<=;=<<;?>;@=<@Qjƒ‡ˆŠ‹‡‰‹��ŒŒ‰„‚‡€ƒƒŠ�‰‰…‡Š†ƒ�ƒ‚{heyzmccnf^Z[fgeYUONFG@DDGGMNKNRWU`_alxz|}}{{ƒˆ~pWNQPQRQMPNKGEEDDFEDFADEGJEEGDCFKHFHJGHDAD@CCHJIEGHDFGNJFJFEJEGDEBEDDEEECE@BDDCBEHDKFIJNRUUXSYXXWV]_ˆ“™™—˜š—›—šššš˜•–••�•–‘‘��‘Ž�ŽŽ�‹ŠŒ†‡ƒ„‡�†‡†…ˆ…�……ƒ‡…†ˆ…‰ˆ†„„†€�…ƒ„‚†��~‚zz~€‚„††ƒ‡…‡‡†‡†‹‡…‰‰Š‰Œ‰‰ŠŠŠ†„|~‚‚zvvyz‚|…�{uuuwvjipz�‡‡ˆ†ˆ‰ŠŠŠ�‹�Šˆ‹‰Šˆ‡ˆŠ‰†ŠˆŠŠ�Š‹‹‹��‹�‰‹‰ŠŠŠ‰�މŒ�‹Œ�Ž‹‹Š�Ž‹Œ‰Š‹‹‹ŒŒ�Œ�����Ž�‰ˆ‹Ž�ŠŽŒ‹Œ�ŽŽ�‹Œ���Œ��ŒŠŒ‰�‹Œ��‘Œ���‹�ЉŠ�Š‹ŒŒŽ��Ž��Ž‹�Ž‹ˆ�’‘”Ž�Š‹ˆ…€}uvolhelehbggggfhife`acaZNA>>A==<>>@<<><>:=<==@;?Ok…ˆ�‹†Œ‰Œ‰‰ŠŒŒ‰ŠŒ�Œ�ŽŽ’�‹‹‰‚}u}†…us{‚ˆ„„‚{qhirskdXSPJGHGIDFJGLLPT^geinuwrx||ux|x`SJFJDFCHGGFFFDDDFDCDEIIKMJJHIJLNOIHGGKJDGIGKEHHHFCCFDEEJGGJFCEGHCEB?BBCDDEEEHCFFDDGGGIIIGKOV^`ac^^]]˜”˜š˜œ™™—š›™š—›™‘––‘’�’�”��‘‹�Œ‰�‰ˆˆŠŠ‹‰‡‰‡‰‡…„††„„†��ƒ„‚…ƒ‚ƒƒ‚‚‚ƒ„†Š†‚€wvssmceiqsutv„„ˆˆ‡‡…„…�†‡…‹††ˆ�Šˆ‡ƒ„…�utuqvwxuuvwxwsrhXTQX`p|�z|x}ƒ‚‰…Š…ˆŠ‰ŠŠŠ‹ˆ�ЉЉ‰ˆ‰‡‰ˆˆŠŠŠ‹‰ŒŠ�‰�‹Š‰�‰ŠŒ‹‹‹‰‰‰�‹�މ��Ž�Ї‹ˆ�Œ‰Š�Š��Œ���‹’�‹Š‰‹‰‹�‡Œ�Ž�‹‹�ŠŠ��Œ‹‰‰ŽŒ‹Œ‹‹‹ŒŒŒŠ��ŠŽ‹Œˆ‹Œ�‰‰Œ�Š�•––“�އˆˆƒ�zsqmigjiiegbced_cbcdc_aRB@>@>>=:;;;>;9::<:=??>=;<>=<>Qi‚‰‹ŠŠŠŒ��‰‹ŒŠˆ‡ŠŒŠŒ����Ž‘‰…yw‚†‚|{‚†�‹‰ˆsrw|rja[SMPLMIKIJOOLNX`he_dbffnv{vvwxdVQLGJFFHHIHIIIGHDHGHHJHNIJIJKKNNMGJDJJHFCFGGGHJHFFFFGCDGHHFFEBGGHDE@ADDECCCDDHDCBEHHIHMLLMLOWYY^YYVW—˜˜˜—˜—œ›šš›˜™™š•–””�‘’–”“��‰Ž‹Š‹‡‡ˆ‡Šˆ†‡ŠŠ‡‰†‡ˆ‡‡…‡…‚ƒ…�„ƒ€„…€…†‹‡‚‚|z|rcXXdebckq~~€ƒ†�‡ˆ‡�ˆ‰ˆˆˆ…ƒ†ƒ†�…~|{swruyuurvslh^VUSRR_imgfimu†††‰ˆ†ˆ‰‡‡ˆ‰‹‡‹ŒŠ‹ŠŒŠˆ‹ˆ‰‹‡‰‹Œ‰ŠŠŠŠŒˆ��‹Ž‹ˆ‰†ŠŠ‰‹ŠŠ‰Ž�Œ��Œ‰��Œ�‰ŠŒ‹ŒŒ‹�����Š��Š‹‹‰�Š‹Œ‰ŒŒ‹�������ŽŽ�ˆ‹��‹‹�‹‹��‹��ŒˆŠ�ˆ‰‹Œ�ŠŒ“™•‘‘�ŠŒ„€€xwpmifihjgffdge`ccd`b_OG@=>=>>;<=<=;9=<;:=:=9@Lg€‹Šˆ‰‰‹ŒŠ�Ž�‰‹Œ�Œ‰��‹����‹Š†„‰†Š‰‚�€„Œ‹ŒŠˆ�„‚�~ook\ORSOTSOQTYYWW`d\TVYVYgknqqvvod`[UOKKKIKIIIHJJGONJLGHFIHGJJONLGIELLKKHHCD@EJEIGIJKIIFIIHEGDFFFIFIGBGJJIDGGGCEEGEHFHJJLLNOQPPTUWOQO————˜›—œœ™›—›�š˜––““�‘“““‘“���ŽŠ�Љˆ†‰†…ˆ‹†…‡„†ˆ†††…„‡ƒ„†…„‚ƒ‚‚~�……�‚€€}‚rg[^cghekpwxzzƒƒ|}€ˆˆŠ‰Š…ˆˆ†„†€……ƒ€‚}xssstwxszyukmc^`\^^[_\YY[_ew‚…ƒˆˆ‰…††……Šˆ‡‰‰Š‰ŽŒŠŠ�ŒŒ‹‹Œˆ‹‹ˆ‡‰Š‡Š‹ŽŠŒ��ˆŠ‰‹Š‰‹ŠŒ‰ŒŒŽŠŽŒ�Œ����‹ŒŠŒ‹Œ��‹‹�����ŠŽ‰��‹‹‹‰‰Œ��‰���Š�Ž�‹���Š�‰�‹Œ‹�Ž‹���Š�Œ‹�ˆŒ•”“�Ž�ŒŒ‡†€|vrngiffggfffgdecdecaUD>=?=>><=?:<>;>><8>:>;<;<>;;>>>Lh€‰‹ˆ‡‡Œ‹�����ŒŒ��‹‹‹‰‹Œ��‹‹ˆ�Ž�Ž�‹Š…‡Š�‹ˆ‡Š…‡ˆ~yzsh[[SRWXTX`aa`cdcVPPTSX]cggeotunmnhd]RRKGDKEJIFKLNNLHEIHHHKJNLKHFHMKONNMGGFEEHIHHLMIKILJIIGIHGGGGJHHIIKGFMHJGCGIHFGILLOJSUVTQVTTNOK˜•——™˜•›�ššœ�˜ššœ™”–’�’“”“‘�‘‹���ŠŠŠˆˆ‹‡ˆ…‡„…‚„„…�ƒ†‚‚„„‚†‰………��…„ƒ†€{}‚€�€|yskjssusu{z||~|}ƒ‡„ƒ‡„ƒ…‡„†‚„…„„ƒ~ssuuwwyt{zxvwqrqrsqlhab_Z^_gs{}‚ˆˆ…„…†ƒ‰ˆ‰‡Š„ŠŠ‡ˆ‹‹ŽŽ�‰ŠŒ‹‰Š†ˆ‹‡ˆ‰Šˆ�‹‹Œ‰ŠŒŒŒ‹‹‡Š�Œ�Œ��‹���‘Ž�‹Ž‹ŒŠ�‹Œ‹Ž��Ž‹ŒŽ�ŒŒŽ�‰ŠŽŠŠ�‰�‹�Œ‹�‘‘���ŒŠŠ�Š���Žˆ��‹��‹��ˆŽ’””Ž�Œ‰Š‰…�zvsnjgfeggefece^ccacZFC=?=<;?;@<>>;;<;;;<<><;><=>Li�ˆŠˆ‡‰‰‰ŒŒ‹‹�Œ�‘�ŽŽ�ŽˆŠ�ŒŒŠ�ŒŒ���‘Œ‡†‹Œ‹‡Š‹‡‡ˆ„~wwmg`_Z]XS]efadfa^WSTSX``^[^bjjory~ysfVPIGEFIJMLLKKIJJHFDFGJGLKIGHGKKPJQMMMJIGJEIMLMIJKJLKKIJJILINIIKFJKIJLKIHJHHGKINNKMPY_^YUZYXPKI–—•—›–™™™˜š�›šš�›˜˜˜””“”‘�ŽŽŒŠ‰‹ˆ‡‹�‰Š‹‰Š†‰‚…€ˆ†ƒ„„€‚ƒ}�„�‚†……„ˆ……‚~€ƒƒ…€|x{}yz�z€ƒ�‚€ƒƒƒƒ€‚…€€||||€�‚„‡…‡…ƒwsuz{{yvyxzz~}}|{}xtuppl]^emtvytz{�‚‚‡‡‰Š†…†Šˆ‰ˆ‰†‹ŠˆŠ‹Œ‹‰‰Œ†‹†‰�‰‹Š�‰Š‹�ŒŽ�‡Š�ŠŠˆŠ�ŠŒŠŠ�Œ��Œ�����‰�‹�ŠŠˆŒ��ŠŒ�Ž�Œ��Œ��‰‡Š‹ŒŠŒŽ�Œ’Œ�ŽŽŠŒ�‹ŽŒˆŒŒŒŒ‰���Œ�’•’�ŽŽ‰‡†…{uunfgjhcggedec`cb]YMBA<:A?<@:<>>:<:;==><>9<;>;=:==<;?==;>;<==<9=;>>;==A<;:=<=<:>>>>><==:;<:<<=:=;;><=?:=Me~…‰ŒˆŠˆŒŽŽ�����ŠŠ�Œ‰ˆŒŒ�Ž�Œ�’ŽŽ�ŒŽˆŠ†ˆ‰‰ŽŒ�ŒŒŽ��„ƒƒ‡ƒ|~{qhbaY`ejellhlifZNLNLQRS^kvxp_XPIIPLPQONLIKKHJHJDCIBIGGMNNLIHGEEEIGHFGBEBGGFEEEGKFGFEEHFDFHKHNKMLOORPKJQMKIMSRNPVYYZRMKOHMHE—•™—™˜™››˜ž››™›šš–™–”•‘—���‹ŽŠ‹ˆ‡‹‰‰�‡‡ƒƒ„�……�}„‚ˆ‡‡‡‰„ƒ~ywtqtuz~~|z‚ƒ‚ƒ…†‚‚„………‚�€€{~~zvwwzz~~‚€|{z|{{w{{|xzx{{€€ƒƒˆ„ˆƒ�‚‚€{}}��~z^IVkt{she`[WYY_baadmpttszzusux~z|wy~||€€‚„…†‡‡‰†ˆ‰Š‹ˆˆˆŠˆŒŠŠŒ�ˆŠ�‹‘‹ˆŒŒŠ‹‹���ŠŠ�‹ŒŒ����‰�ŠŒˆˆ�Ž‹‹‹Ž�Œ����Ž�Œ‡‹ŠŠˆŒ�ŽŽ‰Ž�����ŽŒ���“�’ŽŽ‹‰‡ƒ|spkiieghhhkefd[M>?>>>>>=>>>;>:>>===;;=>;=>==;=>7<<<>;<>;;=Mc{Š‹‹‰Œ‡‰‰‰‡‹‰��‹ŒŽ��ŒŽŒŒ�Š�‹ŒŒ�Œ��Ž�����Œ��Š‹Œ�‰�Ž�“Ž��І‚yulgjpty‚q[PQPONLKJMRTTY[fnaQRVOOGGHFGIGJJLJFFGIHEDHHFHDDBFDCGIMNMIFBHGDDBBDDMEGEGJKJHGIFIGLIHFHHJJJHJOJORSXYVPPJIIFIFGF˜•–˜š˜–˜˜™š™™›š™›–™—˜•—‘‘��‹��‰ˆˆ‰Š‰ˆ‡‡‰†‰‰…ˆ…„…††‡„‚‚‚€…‚…�„€ƒ|ƒ…‚€€„†‚~€�„�}}ƒ�€}}€‚ƒ€}�z|yxvzxy~{~|~|{|‚|zz|€�~€�€‚}}{w}€ƒ„�€whMBM]lrvwzsswstttpqqqrqnonwwwvvwwwyz{}}}€��€x}€„…†……‡Š��ŽŒ‹ŒŒŒŒŠ†ŠŒŠ�ˆŠ‹Ž��‰�Œ‹‹‰Š�ŠŠ�‰����Ž��ŒŽˆ‹Ž‹Š‹ŠŠŠ‹�ŽŒ��‹Œ‹‰‹Š‹‰ŠŠŠ�ŒŒŒ‹�’—–”“�ŠŠ‡…}{wrnfhkgfhhdgb_LD>:@><:>?=@<=@<:=;==;?:>;@:=;=<=;9;<>Oa{ˆ‹ŒŠŒŽŠ‹‰‰Š�ˆˆŠ‹�����Ž�����‹‰��‹�Ž�Ž‘�‘�‘����މŒŒ�’Ž’Ž‹‹ˆ†}pmsvyw�ƒ€q\Y[ZQPNIKKJLGIO^e`SOOJIDFEFFGEFGIIFHECFDCGCDHFC?BEBBGNPNGHDKIGBBEGGGFGEGKKKKILJKHJHDGGCGFCFIIKPQY_[TQOLJICIGHG˜––—š™—˜›˜›—™˜›™˜˜—™”—•“�����Œ†‰‡„…†‡ƒ……„†ƒ„‡…‡†…ˆˆ„†…�†ƒ…�ˆ|„€ƒ„ƒ~€‚„‚�ƒƒƒƒƒ‚€|{€€€~€‚�€€�}|}yz€€�|~|xxw~{{{€�~�€ƒ}}}zyuus{~~~{eJDRdimuxvuwuww|{}{x|z|wuuv{}|{{|strw~€„€€~€}{ƒƒ€„†ƒ„‡ŠŠŽ‹�ŒŽŒ�‰‡‰�Ї‰‰ŒŠŠ�‹Œ‹�މ��‰�Š‹ˆ‹�‰‹�‘ŽŽ‹Ž�‹‹‰Œ‹ŠŠŒŠŒŒŽ‹ŽŒ�‹Œ�‹ˆŒ‰‹ŠŠŠ‰�“•“•”ŽŽ‰…ƒ~{wpjjegggcdjf`ND><>?9=;9>==>=?<:=;:;;A<=7<>;;;>?;<:<>;<<;<;==?::==><=9>:;=:;>;;><;=>GNaw…Їˆ‰ˆˆŽŒŠ�����‹Š�‰‰‰‹‹���’�’Ž��ŒŽŽŽŒŒ‹ŽŒ�‹���’�“”‹Ž�ŒŠŠƒ€xtv†ˆ‹‰‚€{vtob[YQOHHICBC@GPRNHEFHHIHFGHIDFAEHFD?DCAEDCEGAFCECEEECEFGDIFCCGCEIGGHGGEFEHDGJEHGIGMHHHGJECDHFJSSTYSSTOQMHLGG—–—˜˜”š˜•›™š›�ššš•—••”“��ŠŽ‹‰‹†ˆƒ…ƒˆŠ††ƒ…ƒ�„…�€ƒƒƒ„„‚‡ƒ‡…„ƒ†…ƒ…†ˆƒ€����‚�ƒ…€ƒ€‚‚ƒ€‚…‚€‚|}y�|y}}~}|}||�}|wxyzzuywy€ƒƒ|ztojrz|{|oZGQgvu}|}z{||{}{z|~yz~€}€|ƒ€‚†€upsx~��~|~€�ƒ„‚‚…†‡‡„…‹ˆ‹‹ˆŒŠ‹‰���‘ŠŠ��‰‹Š‰‰Œ�‰ŠŒ�‹‹Œ��Š��‰ŒŠŠ‰‰�Š��‹�ŠŒ‘‘‹ŒŒ‰ŒŒ‹Š�Œ�‹‹���ŒˆŠ‰�“•Œ‘��Љ‡�‚|vvnkhggkge[LD@@?@>=>=><<;=><==:>>=>:::?=A=;>@<>9;>=;>:>;=>;;;><<:::=;;=;;=BBCCCAB@>ABFEAFB>A?@E?DEGFHCGBCCJCCADEFAGAGHJKHKIJKJMVX]]]^WZ^a[S•–™——ž—™›šš›—œ›šœœ˜–•‘���Œ†Ž‰ƒˆ…†‚„†‡„‡ƒ�……ˆ‡ˆ„‰…‡‡„ƒ„€~~�~……‡…„…‡„†…‚†�ƒ‚‚�€€ƒ€‚…~}€~|}�}€€|}zwyxuqru}|yvz}{{{{xw{xwz{syz|y€€€~{|{vkSJVfmwzyy|{|}~|y€}|xzz€‚�€€�‚�…ƒƒ�~€€�}€…†�‹Š‹‹�‹��‰Œ‰‹Šˆ‰ŒŒ‰ˆ‹�Š‹ŽŽ�ŠŒŒŠ‰��ˆ‰Ž‹Œ�‹‹�ŒŠ‹Œ�‹‹‰‹Š��ŠŒŒ�‹Œ�����ˆŠŠ�‰‰‹‰‡�•“–��ŽŠ‰†€�yvpjmijjg`PD@>@=>9?=;>>:=<<;<9:<<:=<:<;=:=;=9@KU`s†‹‹�‹Œ��Ž�‹‹‹‹‹‹Œ�‹Ž���‘���ŒŽŠ‹ŠˆŠŽ�‹��“����ŽŽŒ�‹‰Œ���Ž��’’��ŒŒ„‚…‚†ŠˆŠ€sc\[`\XVTONNFJGV\\gi\KEHLFJGGF@FD?CFEGFGBBB?BBDGDAAECGFEEEBAC@BC@FBGBBFCBGCCCEECDAAC?EGLKKKHMJMR\b_d___dfaW––™•›–—›šš™œž™™˜˜™™–“‘�Œ�‹�‡‹‰‡„ƒƒ…„…€ƒ€…„„„‚‚ƒ„‡„„„………|sy{{|„�„�€ƒ„……ƒ†��††…‚}ƒ‚�‚€€||||}~{|~‚‚‚‚{zswvrwu}xvw~{yy{{tvuwywzzwy|~~}~|yvnXPS]fkqrvwx{}|~{|{z~z��€}{}}��~‚€~�~„ƒƒ€�€„€~€‚‡…‰†ŽŠ‡�‹ŒŽŽ��‹Œ�ŒŠŠ‹‹ˆ‰‰ŠŠ����Œ�ŒŒ‰Š‰‰�‰ˆ‹�ŒŽŽŠŒŽŽŠŠŠ‹‹Œ‰�‹Ž�Ž�‹�Œ���Œ�ŠŠ‰‹ˆŠ’•“‘�Ž�Œ‹Š€xsukmfjh^OC?@?>?@==?=:=:>=;=:=;8;><9==:;;<<:?<;FQX`o€Š‰ŒŠŽ�‹Œ���Œ‹ŠŒ‹‹ŒŒŠ�ŽŽ�‘�’Ž�Ž‹ŒŠŠ‹Ž‹�Ž���ŒŽŽ‘���‰ŒŒ����‘�Ž��Їˆ‹‹‡‹�‡„s\VY]VRQTPVY[UT]dnu{mWNQRROJGHHBB?CCDGGDDBGGCEEGCEFHGDGGBFEEDGFCDDDBA@ACBAAAB?DDABBBCDEGFCNJJJMQWa`aaaffnb]š—˜˜˜—–™—™š�š™›–™™–”‘ŒŒ‹�ŒŠ‹ŠŠ‹…ƒ†Šˆ†…ƒ€�†‚‚‚€€��~€‡…ƒ�|wluv~€�…‚�…€ƒ€ƒ�…�€„ƒ„ƒ„‡„ƒ„‚€{||z|wz~||ƒ�}||xxzuxz{{|y|uv|{zt{wyzw{{xtxz|�zzzuso[XZY]bhquzzvv||zwzz{z|€}}€€…ƒ}€|}{|}�ƒ…ƒ‚……‡„…ˆŒ‡‡Šˆ‹‰Œ‹�‹‹�‰�‹ŠŒŠ‹ˆ‹ŠˆŠ�ŠˆŠŽ‹Œ�Œ‹Ž�ŒŒ‹Š‹‹‹ŠŠŠŽŒŒŒŒ���ŠŠ‹ŽŠŒ��Œ�Š���Ž���ŽŒ‹�‘’�Ž�Œ�‰‹‰…xztnmigbO@A?=A@@@@<<>==><>;@<:;><<9<==:;=:>;;<<>>=?JSX^r‚‰‹„‰‡ˆŒŠ�ŽŒ�Œ’Œ�Ž�Ž�†�Ž��ŽŒ�‘��Ž��‹Œ�‰Œ‰ŽŠ���Ž“�‘‘�‘ŽŽŽ��‰ŠŽ�Œ��Ž�“�’�‡u]RRTMIILOXbgloqvz�vfX^YWULLLLCJDCIIGFIJDGHEFGGHKKIFDDDGCGGCDGCCABBE@C@@@@>?AAAACABCADCIIJJBFGKSZ\ZZ`emmeb––——˜——™™›–ššš›™™—–��ŒŠ‹ŠŒ†‡ˆ†……ˆƒ‡†‰…ˆ…†‡„ƒƒ�}~}€ƒ‚‚‚~uqrxƒƒ�„‚€ƒ…„ƒ‚†€|€‚€„€‚~~ƒƒƒ�‚}}|~|yy~{{z{xz|y}|�|||wwsyw{|{|wyyzxx|~{|zzuknpkeb^`agnwzww~zx{{{zz|{|{‚€ƒƒƒ€~y~�~{ƒ�‡‡ƒˆ†Š†‡‰ŽŠŠ‰ˆŠ‹‹‹ŠŠ�Šˆ†Œ‹‹‹ŽŒŒŠŽŠŒŠˆ‰†‹‰ŽŠ�Œ�Œ�Ž‹�ŽŠ‹‹ˆŒ‰‹Œ���‹Œ�Ž�ŒŒ‰‰‹ŠŠ‰‹‹���ŽŒŽŽ���”•Ž�‹‹Š†‡„{}tvmokaQD;C>=@???=:;?;<=>;;9<8=;9=9=9>;;==:9<<;>==CHRV[n�‰�‹Š‰‡ˆ‰‰Š‹Ž‹Ž���Ž���‹ŒŒ������ŽŽ‘‘��ŽŽ‹Œ‹‰‹ŒŒ�Œ��”�Ž’‘����Œ�‹‹��‘Ž’’‘’Žzk\RQILOOW[gq{�‚…ˆ‹Œ†veeb`XUPSOMNMRZQLGJJFHCGGFEHNILEDDEGEEBEDDEACDABB@@@@@>=@@??DABBCBCFKIEHEDDKTRUVadfgje––™™›˜™˜•�™š—�™—˜––��ŽŠ‹�‰‡ƒ†ƒ„ˆ„‚…ƒ‡ˆ……‰Š…„ƒ‚€€€‚�‚~€zxuzw€ƒ…‚‚€‚†…��ƒ€���€|yz|�†��ƒ�‚€€|~~xz|vz||~€{}|{xuwwu|}yzvvxx{}~v|woemxxookkinrwy{|~z{}�}||{€ƒ‚}|€~~‚€€…ˆ†‰ˆ…‰Š‡Š‰ˆŠŒŒŒŽŠŒ��‰Šˆ‰Š…‡Œ‹‹ŒŒŽŒŽŠŒ‹ˆŠ‰Œ‰‹ŠŠŠŒ‹‹‰Œ‹�‰‹�‹‰ŠŒ�‹‹ŠŠŠŒ‹�ŠŒŽ�ŒŒŠŠ‰�ŒŠ‰Œ��‹‘•—’��‰Š†…€{yvpoibUG>A@A====?===<9>BMSW[l‹�‰Ž‹�ŠŒ�Œ‰ŠŠ‰Ž�����Ž���‹��ŒŠ‹‰�Ž�ŽŽ’Ž�‹“���‹�‹�Œ�‹Ž‘�““���’��������‘�Ž‚{m^U[U^_bimv€†‡ŽŒ�ŽŒqkddZYTSQOQZce]PMMMICCFECGGKJMGFAHIIGEGGEBDBA@>B@A>><=?:>=>;<=;;>>=99==;:;;;::;=:<=9===>FOYUWi}ŠŠ‰‹��Ž‘��ŠŠ‰Œ�Š‹Œ�Ž�Œ�Ž�‹‘��ŠŽŽ‹Œ��������‘Œ�Ž�����‹ŽŒŽ��‘‘‘‘��‘‘Œ�‰��Žˆ„zlhgksvx||~€‡‰‹‰ŽŽ�„wedZZTQNOQT[dg`VOPNHGGKFDDGJLIIEEFJMNFKEFFDDB>B?B?@?=B????AEFHECBEFHHIEFEDHIGKOR\\__a“˜—™˜˜™˜•›˜™›�™•—”��ŽŽ�‘�‡‡‡‰…†‡ˆ……ˆ„‡‚…�€€‚��z{vz{xy€€†ƒ„ƒ‚‚ƒ�|zzx{~z|}~€~�ƒy{��}zwy~}~|€}�…~‚~€}‚~€|{{yxxzwyzvxx{xywyy|z{~{~{wj`dpmmw{}~}||y|€}…~‚€‚{{}|{�‡ƒ…ˆ…ˆˆŒŒŠŽ�ˆ‰ŒŠ‡‡‡‹ˆˆ�ˆˆ���‡‹��ŒŠ‹ˆŠˆŒ‹Š‰‰‹‹‹Œ�ŠŠ�‹Œ�‰‰Š‰ˆ‹Š‰Œ‰ŒŽŽ�ŒŒŒ‹ˆˆˆŠ‰Œ�‰‹‹��Œ‘��ŠŒˆˆŠ‹�“”�Ž�‹Šˆ„…|{qnfRHB<@?A@<=<==>;=;;<<;<;<=;<><;<::;:;=;;=7>7<>EKTVTZm€†ˆˆŠ�‹ŠŽ�ŠŽŽŒ��‹Œ��‰Ž‹�ŒŒ���‘���‘��Œ‹Œ‹‹�‹�‘Ž��“�Ž�Ž�Œ‹ŠŠŒ‘�‹�’’Ž��‘ŽŽ�ˆ‰�vsx{€„‰Œ‹Œ‹ŠŽŠ„†‰†~lZWWVMKNJLQW^bYUTQIGGKKFCEEKIHFGFEGJHJIHDHCDDA@A??=>>A>===>:==<9>;:;;>=>>>8=;9<=:>;;:9;:>9>>DOVWSTj~Š�‰ŠŠˆ‰ŠŠˆ����Œ�Ž‘�‹‹�ŒŒ‹�‹����“Ž’‘Ž��Š‹‰‹Œ�Ž�’��“���’�ŠŠ‹�‰Œ�Œ�‘‹’”’“�“Œ‡�‚††Š‹�“Œ�����‡€{n]SLMJLJGGGGQQVSOTPFGHGIFDEIFJEFFDDDEFDDFHECEDACBD?@?A@>>DDDECDEGIIIKJIFDBJIECDHHMRVYT––™›•š—–—–˜š››š˜“”‹Š�Œ��Їƒ…€‚†ƒ„…„…„‡ƒ„…‚‚„‚„{tloimqz€‚‚~~€ƒ}€�€~|zz€‚yxyyyz~}}~}|‚€‚~|}{{|}}€~}}||vwz||||~{€{{}}uuxyyu}xxx{|}zzdU[ZUdu€‚�|�‚ƒ|€}wvyw||~|}ƒˆ��Š‹Š�ŒŒŠ‰‰‰ˆ‰‰‹‹ŒˆŠŠŒŠ�ŒŠ‹‰‹ŠŒ‰‹‡Œ‹�Š‹ŒŠ�Œ��‰�ŠŠ��ˆ‰ŒŠ‰ŒŒŠ‹‹��‹ŒŠ‹Š‹‹�‹‹ŠŒ�‹Œ�Ž‹Œ��Œ‰‡‹Š‹ˆ‰ŠŠ�Œ†‘““��މ‰ˆˆ�~wn[G@@@B>;;>>:>;>;<;<<>=>9=@;;;;6<;:;<=<9;;==:>;?HPXRQXf€Œ‹ŠŒŒ‹‹‹�‹ˆ‹Ž�Ž‹��‘‘�‘ŽŒŒ�ŠŠŒŠ���‘�’�‘�ŒŽŽŒŒ�ŽŠ������’”���‹‹‹Œ��ŒŒ�“’�’”�Œ�‹��ŒŒ�ŒŽ����‰}upi\RKIJGEFCFDEIKIOJROEGIIHGFHGGIFFIEDBDAEDACC?BCBB@BBDE@>BADBDEBEEGIIHNIHFHFILGDCBGMOTVQ–—–˜š�–˜šš›–š›™š–“�“ŽŽ��‰ˆˆˆ†„†…€„�‚„„„…„…‚�…‚€|xyuuz{��z}||y€‚{{|€z|€|€}y|zy|yy{yy}„€{}|z}‚}zz{|xzw{yyzz||}}{}xxzzyz~vu}~y|~}}||cS`a\cz‚„€‚‚ƒ{z{tvx|€~~‚…ƒ…�„…‡‡‰ˆŽ�‰ŠŒŽŒŒ�ЋЋ‰‡‡‰‰���ŠŒŠ�‹Š�ˆ�ŠŠ�ˆˆ�Œ‹�ŠŒ���‰�Ž‹†Œ�‰‰‹‹ŒŠ‹‹‹ŽŠŽŽŒŒ�ˆ�‰‰‹Š‹‹ŒŒ‹ŒŽŒ‹�Š�‹�‰ˆŠŒŠ�ŠŒ“˜‘��ŠŠ‰…ƒ{v`I>?@>?=>>><>;<:>:>:<:>AJSWVUUd{†‹���ŠŒ�ŽŠŠ‰‹‹‹‹ŒŠ�‹�‘’�Œ��ŒŠŠŒ�ŽŒ‘Ž�‹��’��������‹Œ�Ž�‘��‘‘�‘�‘�‹‹ŽŒŽ�‘’�‘�‘”’��‘’�Œ�ŽŒ€mbUROJGKJGGCC@BDDDGDGKLIKINQPRRSOIDFEBECD@HGDB@AAA@B?CCCDC@DBEECGCCEGDHIKLLMIHJMKHGDJKRYUU˜•˜˜›—–œ›š›š˜™›–“‘“ŽŒŒ‘�Ž�Œ‹‰‹‡…„„‚‚�€ƒ�‚€€„�€‚‚|€|~…�„€{|€yxv{{x{€z}|}€}|yz{xwz|~{|z~wz|€{yw{|wzzzw|zwxy{{zwvv{€{|~|xt{€xy{||||zaOdocfz‚…ƒƒƒ„~yvvw€ƒ�…„ˆ‹ŠŠ‡‰‰‡‹†ˆŒˆ‹‹ŠŠ‹�‹�މˆŠ‹ˆˆŠ�ŠŠŠˆ‰���Š�ŽŽŒŽ�ŒŠˆ‰Œˆ‰ŒŒ�Š�Š‹Œ�ˆ‹ŒŒ‡Ž‰‰ŒŠ���Ž��ŒŠ‹‹ŒŠŠ‹‰ŠŠŠŠ‹��’ŒŒ�‰ŠŒˆŒˆˆ‹”““�Š�Œˆˆ…�~lL@>A>B>>>?=>:>:<==::8@;9<;;8;<<9:;;9;;;;<;;7?=;GR]WYTVcy†Š‰‰ŒŒŽ�Š�ŽŒ‹Ž‹‡ŒŠŒ�Œ��Ž���ŒŽ����ŠŽŽŒ‹�‘Ž�‘’��’�“Œ�ŽŒŒ‹‹Ž��Ž�”’‘�“���Œ�����’‘“‘•–“�ŽŽ�ŠyfZUPKIINIHAFD@DA?DACDDFFGNU^cfde_OFDF@ECCCFHDBFB@B?@AAADBCCBBCBGGCFFICDIGJKIICGJMLHJMVS\XU™———••™—˜˜›š—™˜˜–‘’�‹��ŒŒ‹�‰�ŠŠ†ˆ‰„‰‚ƒ…‚ƒ„}€|~}ƒ‚�|z�€~€‚{yvyww{zw}{|~||}~~}{{y|{|{yswyuztvsuuww{wy|yuruvsuuvxx{vx|{uz}}xwz|}~|]Mbmghx…ƒˆ‡�€}z}}�‚…†…†‰ŠŠ‹ŒŠ‹‰Š‰ˆŠ‡‰‹ˆ�ЉЋ‹�Œ�Œ�‹�‹‰Œ‰ŠŒŠ‹ŠŠŠ�ŠŽŽ��Š��Žˆ‹ŒŒŠŒ�Œ‹‰ŠŽ��‹��‡�Ї‰ŒŒˆŠŽ‹‹�Œ��‰‹ŠŠ‹Œ‹‹�‹���Š‹ˆ�‹ŒŒ‡��‘‘‘�‹‹‰……�pV?@A@C;<>=?>;:>><>>=;;7=<=:9;;=::;;;:=<:9<:;9;9ANSWXZUUdw††ˆ‡‡ŠŒŠ‹�Š�Ž��‹‹Š�‹ŒŒ�Œ�Ž��Œ‘��’���Œ‰‹ŒŒŒŒ’��‘‘‘�‘‹�‹�‹‹��Œ‘�’’’’’”Ž��Ž‹���‹�‘”“�“‘��Žqhb\VYUSQLCBDAABB>@AAA@DCMYgxyzxnXFGIHD@DBABDBC@BC??BAB@ECDDBGADDGGFIDCGFHHFEEDFIMLOORZZ]Z—–•™™™—–™™ššž™˜˜–“‘�Š‹ŒŒˆˆŠ€ˆŠ�†††ˆˆ……ƒ†„„�„‚€{{}}€„~{y|{�}‚€�|zxz{{{zyyzwzyz|~z|}{{zuwsttvpnojmqrruutwurusuvusvzytuxuu{}yx{}€€t]I]hkgq|ƒƒ‚€|�‚€|†„…‰‰‰‡ˆ‹ˆˆ‰‹ŠŠŒ�ŒŠŠŠˆ‹Š‡‰‹Š‰‹�ŒŒŠ‹Ž‹�ŒŠŒˆ‰‰‹‰Œˆ‹ŒŒŽŽŽ���Œ‰ŒŒŒŠ�ˆ‹ˆŠŒ�Ž�‹�‹Š‹‰ˆ‹Œˆˆ‰ŠŠŠŠ��‹ŽŒŒ�‰ŒŽŒˆ‹Š‹Š‰‰ŒŒ‹‰Ž‘‘�ŽŠˆ‰‡…~wVC>>A?A=;<>;?<=;:;<=<9=<<9<79;<:9>;;8;><<>:<::;=BOV\YRUXaw†��Ї‡†‰�‰�ŒŒ�ŒŒ�Œ‹Œ�ŽŒŒŒ�‹ŒŒŒŽ‘��““Œ���‹ŒŠ�Š���������‘�“��‹ŽŽ����’‘�Ž‘��������ŽŒ��‘���†€|umidea[NCA@DAAFCAB@B>BDHUevƒ‡�uXNSTTLCA>CAAB>@AB@>AAC@CEEGCADCDEIHGHFJCELEFEC?FFHLNTU]\f˜—˜™™˜›™š–™™š—š™–“’’���‹ˆŠ†‡‹‹‡‚„„„…ƒ„‚†ƒ„‰��‚ƒ~€|||x~|}w}z~~~xzz~{€|zwwuxyyvs{vuwsqsstsurlffikmkmmrstqwzyrrxz|yywwwx|}{yz}}~||uYHYfgdswvquyz€ƒ�…‡Š‡Š††‡ˆ‰…‰ˆ‹‡ŒŒŒŒŠ�ŠŠ‹‹‡‰ˆ†‰Œ�Œ‹ˆ‡‹�‰ŽŽ�‰�‰‰ŠŠ�†ŒŠŒŒŒŽŽŒ�Ž���މ‹‹ˆ‰‹‹�Œ‹Ž�ŒŽ‹�Œˆ‹�‰ˆ‰Š��Œ‹ŽŒ�‰�Š��‹Š‰�‹‰‰‹�ˆ‰�“˜’��Ї‡„{[D?@@E?=:=;<:;<9:=;;<99:==<=8=;::>:==<<>;:?FTUUXYPVat‡�‹Ž‹��Šˆ‰Š�ˆŠŠŽ‰‰Ž�����‹�‰‹Š‹ŒŒ�Ž��‘Ž�������‹‹‹�‰‹�‰‘“‘��‘����‹‹����Ž’��“�‘“’���Ž‹�‹‚…‚…‚€€{vsohUJCBCDFBABABC@CAGN^v†uc[`eZKDD@?AA>?B@C>@?BC?AFJDCFFDBDGFIGGGHHIFFEBHFCFKNUSZek—”˜˜™š—™œšœ›•™š—˜”””‘–Ž��‹‰…ІŒˆ…�†‚€€†‚…‚{|~€„ƒƒ�€||�|~{~usxuw{yv{zy|}xwwurqssqqospkmoquuvpiggljonmlqsprw|{vsx{}}~}|}zx{|yy{{v\PXcgcnnmklpy~‚‚ƒ‡‡‰Š‰‹‹ˆ†ˆŠ‡ˆ‡ˆŠ‹Šˆˆ‰Š‹�‹‹‹Šˆ‰Š‰Šˆ‹ˆ‰†�‹Œ�‹ŽŽ‹ŠŠŒ‹Œ‰Š‹Œ‹‹‹‹‹������ŒŠ‹�‰‰‹Š‹Š‹‹���ŠŒ�‰‹‡‹ŠŽˆ‰‡‹Œ�‹Œ�ŒŽŒ‹‹‹Œ‹‰‰ˆ‡�’’’�‘‰‹ŠƒfG>?AAA?=;>>=><=;9=;=;;:@;9:><;<<=<;=?9;;:=:=;=:<@NU]YXTWR^p…‹‹Š‹‹���‡ŠŠŠˆˆ†‰Šˆ‹‹‹�Œ�����Ž‹‹ŠˆŠŠ‹�ŒŽŽ�‘�‘��Ž�Œˆ‹‰ŠŒ‘�‘‘“�“����Œ��‹�����““‘•”���Š…yw{~~}~zxq_PKJIKJGEJJICHBDHV`p{�|tadjl[HDD@@A?B?AA@@?BA?CDFDFDCEEEECFCHHHMJLMCFECGFEGLSU[dh™•˜—™™™šš›—›™š—›™”’’‘–���Ž‹ŒŒŒ††‚€†‚��ƒ~}}{{zz‚…z{|y|}~zuvoptrryxxx{}zztvxsqopsmsnomlknqwutrropmqqnoprtqw{z{uyz~��€ƒ€~|{|€�€ve^^kfchklopx}€…ˆ…„†‰ˆ‰�‰ŠŠ‰‡Š‰‹Š‹�ˆˆ‹ˆŠŠŠŠŒ�‰ŽŒ�‘�‹‰ŠŠŠŠˆŒ‰Œ†Š‰‰�ŒŠ�‘‹ŠŒŠ‰ŒŠ‹ŒŒŒ‹�‹��ŽŽŽŠ‹ŠŠŠŠ‰‹‹ŒŠŠ‰ŒŽ��ŠŠŒŒ‹ŒŒŠ‹‰Œ�������Œ��‹‹ˆ�‘�”��’‰ˆnL?AADC>=>@==<>><<<8<=8<;::9<:<9;=;<>;>;<<:8;;;<:>FUWWXZYXV[p‚Ї‰ˆŠŒŒ‡‹ŒŠ�‹ˆŒˆ‰‰Š‰ˆ‹ŽŠ‰Š������ŠŠ�‹Š�Š��Ž��Ž�‘’�Ž��ˆ‹�ŒŒ����‘‘‘���‘Ž��‹���Ž‘‘�”‘�‘…urwxuxx|vprtj\[_VYUUOT\XVYOLU]kt}€ƒufgrnVCCDABB?@BB@DB>B@@AADBDDEAECFGBDIILKNMLKGBDCE@FMPSWS\—™˜——˜•�™™œ�˜™›™™””““��Š�Љ�ŒŠ…‚‚�€‚†‚ƒ€zzxvwzy€�~{|zx{yyyvwwvtrrrtw{ssyz{xussxvsptrvuvppmqpsvuusrttusnptrtzuzzw|}~€|~€€{€~�ƒƒ€}tlglrniiotz~€…ˆˆ‹Š‰‰‰‡ˆ‰†‡ˆ‰‰†�‹‹�‹ŒŒ�‡Š‹Š‡†‹ˆ‹‰‹��‹�ŒŒ‹Š‹ŠŠˆŠˆ…Œˆ�ŠŒ‘�Œ�Š�‹Œ‹Šˆ‹‰‹‹Œ‰‹����Œ��ŠŠˆˆŒ‰‰Œ�‰�Š‹ŠŒŽ���‹‹‹‡‹Š‰‰ŒŒŽ��ŒŒŒ‘Œ”�‘‹��‡zPA@CEABA><>=>9<<<;<=<>8<9<:9:7:;9<=<7>>:<7;=;:;;@@G@CBCACB??BB@?DBBDBCDHGKLMRQQOJIECCDGFIOINR—˜˜˜˜—™—š—šœš›œ›™–•”��ŒŒˆŠˆŠ†‡€€~||‚‚€€vwxvwy||}z{|yx{zwsqovxtqorvuxyxuz{wvvvuutsx|xxtwvuvuzxyuuuzwwtqqtuvuyz‚~||}€~z|zz�z{y€‚„~vossx€{vvw{ƒ††…Œˆ�‰‹‹Š‰ˆ††‰‡ˆ‡‰‹‹‹‰Ž�‹��‹†‰‹ŠˆˆŠŠŠŠŠ‰Œ�Œ‹ŠŽŒŒŠ‹ˆ‰Š‰Š‹�Œ‹ŒŒ�ŒŒŒ��‰�‰‰‡ŠˆŠ�‹��ŒŽŽŽ‹�ŒŒ‹‰ŠŠˆŠŒˆˆ����Ž����ŠŠ‰Š‹Œ‹ŽŠ‹ŒŒ�“”•Ž�ŽŠƒ]B>DB@@?C==?<><===:=<>;;=;@:;8=9<:99;;=<<;=;;:<=;>CTXYUWWUYU[n†�Ž‰ŠˆŠŠˆˆ…ŠˆŠ‹�Œ‰�ŒŒ�ŒŠ†Š‰‹‹‹ˆ��‘��’�Œ�Œ�‰ˆ‹‰�‰ŒŒŽŒ��ŒŽ�Š‹Ž�Š��Œ‹��“Ž�“�’‘Ž���Œ�Š��‚qlquzuwtsknooptxrrmeXl{ƒxpntv~‚ƒ‡ˆoouo]NICCA>@?BBAA>AABA>ACBD@>EBBCIDFMMOOUUXVSQLHFFFJGIGEJ–™—™—˜š›š›™š—™šš˜•–•�‘Œ‡ˆ‰‰‡……uz{€~zxqwywu~~€|x~{{wzxsqjlpqllkrty}{v||{{ww|xtrww|xxtw{xvx|{wt{|zxuqrvvuux~~|}�|z~{y…}zwwuv��|stry~†ˆƒ„€…‡…І‹ˆˆˆŠ‰ŠŠ‹Ž‹‰‡ˆˆ‡ˆ‰Š‰Œ‡�ŠŒŒˆŒŒ‰ŠŠ‡ŒŠ‰ˆŠ‡‹†ˆŒ�‹�Œ�‰ŒŠ�ˆ��ŠˆˆŒ‹�‹‹ŠŒŽŽ‹‹‹‰‰ˆŒŠŠŠ�‹‹Ž‰ŽŽŒ‹Œ‰Œ‹‹Œ‹Œ�ˆ�Š����‹Ž�ŒŒ‹�ˆ‹‹‰‰‹�“•–’���sH=>DDA@>BA<;===><:<;=<:9;;><::;;=:<:==7=;:8:7@8<>BNWYYUVUYVVZpƒŠŠ‰���Š�ˆ‰‰ŠŠ†‡‰‰‹�Œ����Œ�ЉЉ‹‰Š‹ŒŒ�ŽŽ����‹�‰Œ‹ŒŠŠ��‹‹Ž��Ž”�ŒŽŠ‹Š‹‹��Ž��Ž�’���Ž‘Šˆ€pppsx{||}y{yvz~~ywscWg‡„ƒ~z~ƒ„†ˆ…ˆ}mhs{rdXNJIGCJIEE?CCC@A@@AAABCBADFFGHJQPUSTWTTVQMIKHEGIECK–––˜——š—›™��š›š•–•�–’’�Š�ŒŠŠ‡ƒƒy€}|z{utzvxwx€~~xzxxwwwwsmknnmjjmrxzyzxz|yvw}{zyv|~ztxywtx|y|xzz||xvwrvvwww|}zz}wx~z|}�~€‚}}yvpv~yxu|}ƒˆˆ‰‹Š†‹†Œ„‡‡ˆ††Ž…‹ˆŠ�‰‹‰ˆˆ‰‰Šˆˆ‰†Š‰†‰ŒŠŒ‰‹‹Œ‹†‰Œ‡‰‡‡‹‹Š‹‹‹ŠŽ��ŠŒ�І‰‹Š‡Š‹‹Š�Œ���ŠŠ‹�ŽŒŠ‹ŠŠ‹�‰�‹Œ�‹‰Ž��‰Œ‹‰ˆ�Œˆ‹�ŒŽŒŠ��ŒŽŽ‰Š‰‹‹‘”’“Ž�ZA?AC=>>?@=>=:A:>@;>@<><;=:=9=;;8=:;=;==:::9=8=;<;KTZZXXWU[WU\m€‡‰�‰Œ�Š‹�Œ‹�‰ˆ‰ˆˆ�Š‹ŽŠŽ�ŒŒŽŽ��ˆ‹Œ‹�‰Š�Œ����ŽŽ�Š��Œ�‹ŠŒ‰Š�ŠŽ��ŽŒ�‘ŠŒ‹�Œ‹‡Ž��‘‘�’‘‘Ž‹†xvuuz‚…‡…„„€ƒ†‰�‚{m[e|†�‰‚€„ˆŒ‹�‹ˆ|c_u‚~yl`]\VZ\]XUMKHHFCA@BE@CCCHCGHJJSXXXSUVSNOTQONIKJEGEL™˜––˜–—–œ—™›™˜™œ™“‘“Œ��Š�ЇŒˆ„€„€‚‚‚~|{{~vvuz}wwysvttsvuxspruvoppow{xzvxywwpy{}|z~~|xyxvuvzy|x{xzzwvywzzwxx{zzxxr{xxyz€€‚€„€|~vux{|z|}€‚…†‹‰ˆ‰Š‹Š‹…‡‹ˆŠŠ‰ˆ‰ˆ‡ˆŠ‹ŠŒ‹‹‹‹�‹‹ŠˆŠ‡‰‰‡ŠŠˆŠŠŠ‹‰‹Œ�‰ŠŠ‡Š‡Œ‰�Œ�ŒŠŠŒ‹�ŠŠ‰ŒŒ‡ŠŒŽ‰Š�‹‹‹Œ��‹‰��ŠŠŒŠˆ‰‹Š‹‹Ž‹Ž�ŒŒŒŒ�Œ†ˆ‹‰‹Š‰ŽŠ‹Œ�ŠŒŠŠ‹Ž’”‘ŒˆjF??B=A?A>><:==:;;=7899;;<::=::;=:;98;:>BKYYYYZWV]WXZj€ˆŠ†Šˆ‰Š‰ˆ�ŒŽ��‹ŽŽŠŠŠ‰‰‹ŒŠ�Œ�Ž�‘�‘��Œ‰‹‡‹��ŒŽŽ�‘‘����Œ‰‰ŠŒ‹‹��‘�Ž���‘��ˆŠ�‹Œ��Ž���‘“އ‚}†‰‡‡‰Š‡‚‚„�ŽŒ‰‰|hm}ˆŒˆˆ‡…ŠŠŒŽ‘ˆw\_y„ˆxqnlmnqqnig__\TNLIFGEFBFDGLNOS[`a[RUTNOMTVOQNIMIIHKš”˜š—•™š—˜š›™š™—™“•��ŽŒŒŒ‹…‡„ƒ†ˆ‚…„„‚~~}{{wy{zxtrqtsuqstustzywtuuz{tyxxzywuwz{}}z}zz|{w{z||ysuuwsvuvyzyxz{{z|zy{xz|z}€|ƒ‚~|wv{€ƒ€…„‡‡ˆˆ‡ˆŠŠŒ‹‰‹‹ŠŠ��‰Š‡‹Šˆ‹ˆŠŒŠ‹Œ�Ž‹Š�‡ŒŠ‰Œ‰Š‡‡‹ˆŽˆŠ‹Ž‹Š�ŒŠŠ��‰ˆ‹Œ‰‰ŠŽ‰‹‰ŠŒ�ŒŒŒ‹ŠŽŒ‹‹‡‹‹‹ŽŒŒŒ‹Ž�ŠŽ‹‹‰Š‹Œ‡Œ‹ŒŒ��Ž��ŠŠ‹‰Š‹ˆŠ‹ˆ‹‹‹ˆ�Š‹‹“‘”“‹|T?;BC?@>>>B=<>>:;;=>:=;=:<=9<:;:8<:9>8=8999=;:<<:AGSWZZ[VYY\YV[k|Œ�Šˆ‰Š‡ŠŒ‹‰��‘��ŒŽ‹ŒŒ�ŠŠŒ‹ŒŠŒ‹ŒŽ�’Ž’Œ�ŒŒŠŒ‰Œ‰�‘�Œ���‹‹�ŒŠŒŒŠŒŠ�Š���‘�‘�Œ��‹ŠŒŠ‹‹�����ŒŒˆ‹Œ‹��…ˆ……†ŽŒ�Œ�‡zw���‹ˆ�ŠŠŒŒ�މoW`yŒŽ‡‚‚|~~€‚‚‚{{yxskja_][YSPPPSSUY^d`_ZQWSQMOV_SOQRQMPQT•———–˜š˜š–›–™™™˜™–•‘ŽŒŽ‹Œ†‚‡�ˆ…ƒ�„„��~~ƒ€x}wz€{wswuxywrxuqv|z{uz||zyz}~�€}{}}}z{|||~z€~{€|}}wssvrqxruwuxywu~{}~~‚}|~~~}{z{|�ƒ‡ˆ‰‹†ŠŠŠˆ‰‰ˆŠŠ‰Š‹‹‰Š�Š‹‹‹�‹ˆŠ‹ˆŠ‹ˆŠ‰‹ˆ‰Œ‹‹ŒŠŠˆ�‡�Љ‰‰‡��Љ‹‹Œ�Ž�‹Œ‹Œ‰Šˆ‹ˆ‰‹Š‰Š�‹����Š‹Œ‡‹‹Œˆ�‡ŒŒ‹ŽŽ�‰‹Œ‹�‹‹�ЉˆŒˆ��ŒŒ‘‹‹‹Š‰Ž‰†ˆŒ…�ŒŠ�’˜“’ˆb@CA?@D?B:==><=<=;=:<<<=:<<:<:6?9<<:;=<=::;89<;:=?EQZZZV[XW[VWTYgŒŽŒ��‹‹ˆ‡ˆ‡‰Œ‰‰Ž‹‹Œ‹�Ž��Ž‹ˆ‰Š‹ˆŠ�ŽŽŽŠ‘ŽŽŽŽŒ‰‹ˆ�‹ŽŠ‹‹‰�ŠŽŒ��Œ‰ŒŒŒ‹ŠŠ‰Š���‘����Œ�Œ‡‰Ž‰�‹‰‡�‹‹�‰Š„ƒ‚�†ƒ‡‡€zw„‹�����‹Š‰ŒŠ„eVcyŒ‘‘ŒŒ‹Œ‰‰‰ŠŠ…‡ˆ„‚{wvrnib_]cdbfijc]YVUZWTXYZZVWY[[\_a••–—˜˜š›š™›�›˜˜–—–•‘�’Ž‹„ƒ„‡ˆ‡ˆ��…ƒ€~~z~}}}}€~}xz}}x~|xwxy~yuz|~x{€€…‚…„€„}‚‚~„}€~‚‚~|}}|zxwswzvvwy|zyz~|}€„‚€€�‚ƒ�~€xz‚…†‡‰‰ˆ‹ˆ‹Ž‹‹‰‰‹‹ˆ†‰Š‡ˆ‰‹‡Š�Š’Ž‹ŠŒ‹ŒŠˆ‹‹ŠˆŒ‹ŒˆŠˆŒ‡ŒŠ‰�ЇЉ‡‰Š‹ˆ‹Š�‹Š‹�‹‹�ŠŠ‹‡‡ŠŠˆ‰ŠŒ‹Ž�Œ��ŠŒ‹Šˆ‰Š‰‰ŠŽ‰‰�‹Ž�ŽŒ�Œ�‹‡Šˆˆ‰‹ŠŠŒ���ŒŽ‹ŠŠ‡‰ŠŠ‹Š’•–�uN@B@C>?A@>>==>=;8:<=;8;<:;;9:;;9;99<:<9:<:9=:;99=>LVWY[[ZXZZVXWUe}†‹Œ‹�‹‰�Œ‹ŠŒ‰‹Š‰ˆŒ‰��‘ŒŽ��‹‹ŒŠ‡‰†‹�ŠŒ‹‹��‘Ž‹Œˆ�‹‰‡‰‰Š�Œ�ŒŽ���‹Ž�‰ŒŠ‰ˆ‰Œ�‹�ŽŒ���ŠŠŠ‰†…‚‚ƒ�€ƒƒ}}x|upruuyxsnpw‚‚……Œ‡‹‡‰Š†c_aq���”��‘‘��Œ��ЉŠ�ˆ�‰‡‡‡�{yxxwvvzuqhbfghfhda\^aeelnino•—˜—˜š—˜™›™›š›š™–’–’Œ�Ž‹†„„‰‹‡ˆ„‚†‚�ƒ{€|{|}{{€|{}€€ƒƒ‡{€€~{|~~xx~€ƒ‚……„†ƒƒ‡„�ƒƒ‚†ƒƒ|€~~|{~~|z{||{||‚|€€‚�~€ƒ��€…„�ƒƒ€‚ƒ„†‡ˆŠ‹Œ‡ˆŠˆŒ‹�‰ŠŒ‹Š�ЉЇ‰‹‡Š‹‹‰�‹‹�‰ŽŒŠŽ‹ŠŠˆˆ‹†‰‰‡‰ŠŠŒ�ŒŒ‰‰Š‡�‰‹ˆŒŠ†‹Š�‡Œ�‰‘ŒŒŠ‹‹‹‰…ˆŠŠŠŒ‹‹ŒŽŽŒŒ‹�‰‰Œ‰‰ŠŠ‹ŒŒŠ‹�ŒŽ�ŒŠŠŒ‰ŠŠ‹Š‹‰‹‹ŽŒŒŠ�Љ�‹�Œ’’‚_>@C?AA=>>=>>>><;;<<:;:;9<;:6<98::;7;;;::;;9<9::89CLXWZY[VZYYYTVZew…ŠŠ†ˆ‰ŠŠŒ‹Œ���ŽŒŠˆ‰Š‰�Œ‰�Š���ŽŽŠŠŒ‰‰‰†‹‰Š‹��Œ���Œ�Šˆˆ†ˆŠŠ���‹Œ�Œ�Ž‹‹Œ‹‰ˆˆ‰‡…†ˆ…ƒ„„…yuuwtppqkjjhh`a`jhmjde^ejops{{{~‚€�wb`caq€‰ŒŽ��������‘�Œ�‹ŒŽŒŒŽŽŒ‡ˆ…‹‡ˆ††‚~vsuuvx{vldhmuy|y{z|—˜˜˜˜™–˜š™™›�›–—”•’�‹‰†‡„‚…‡‡ˆŒ…‰‰‚‚��~|€€|zz|{}~~‚„‚€††�ƒ……„ƒ‚|~€„‚ƒ„„„…ƒ††‚„„‡‡††……�~|yƒ‚‚~€}…†…„ƒ„�…‚„��‚‚…‡‡‡‡‰ŠŒ‹��‰ˆ‰‰‰ˆŠŒˆ‹ŠŠŠŒŒŽŠŒ‹ˆŠŠˆˆ‹ˆ†ˆŒŠˆŠ��Œ‡Œ�‰ˆ†‰ŠŠ…ˆ‰‹‹ŠŒ‹Š�Œ‹‰Š‹‹ŠŠ…Љ‡Š‹�‰ŽŒ‹ŒŽ‰‰‡Š‹ˆŠŠˆ�Š‹Œ‹Œ‹Œ‹‹��Œ‹ŠŒŠŠ‰������Ž��Œ‰ˆ�‰Šˆ†�‹‰ŒŠ‹Ž‹�Œ‹�”ŒsH@@A@B==>?=>=>=?:<;<9<=::;;9<::::87;6;7<;;9;<=79<>PRRVXSUWXUXXYVWgy„�…†„‰‡‰‰Œˆ�Œ���މ�†‰‹‡‰ŠŠ‹Ž�Š‹‹���‹�‹ˆˆ‹Š‹‹‹Œ‰ŽŒŽ�މ‹†Š‰Š‡Š‹‰ˆ‰�‰‡ˆˆ„€}�~vwvwwuvwlfhmgfhhXZ]ccXX[a^a[c[YXYY]^_cjjhpsc][^Wbq~€€†ˆ‰ˆ‹†Ž�����ŽŒ�������Ž��ŽŽ‘�ŒŠ„„ƒ‚‡††„wilw‚ŠˆŠ‡ˆ†™š——™š—›˜˜™›ššš•“•“‹ŠŠ„„‚�…‹‡ˆ‹††…~ƒ‚‚�‚�~{€�~‚‚|†„ƒ„„‡……†…‚ƒ„†‡…„„‚…„‚�……�‚†ˆ‡ˆƒ}‚ƒ|~‚€†�€€��†ˆƒƒ|„…ˆ…‡ƒ†€„ƒ}}‚†ŠŠ‡‡…ˆ‹ˆ��Ž�Љ‰ŠŒ‰‰†‹Š‡Š‹Ž���ŒŽ‹�ŠŠ‰‰‰‰‰‡‹Š�ŠŠŒŒŒ‰��‰Œ‰‡‡‰ˆ‰ŠŠˆ‹‰Œ‰Ž‹�ˆŒŒ‰ŠˆŠ‰‡ˆ‹Œ‰‹‹��‰‰‹�Š�‡‰Š‰‰�‹Š�ŒŒ�’���ŽŠŒ‹‰Š‹‹�ŒŒŠ�‰ŒŒ�Œ‰Œ‹Šˆ‰‹‰Š‰Ž‡‰Œ““‡]?>C?B?><<=;>;>:;>=:;87=99;;;9=:8<9;99;=6<:9<=8;9?EOVWVXURTXUVVWWXc|‰Œ�ŠŒˆŠ‡Š‡ŠŒ‹‹�‹Œ‹‹Œ�‹ˆ‰ˆ‹‹‰‰ˆˆ‹‹‹��Œ‰�ˆŒˆŠ†‡……‰Š‡ŠŠ�‰‡ŠŠˆ„ƒ‚ƒ�ƒ…ƒyz|xprt{tpnlljmoogadhhef]UY^d^SUWYWYZZVVSTURPUSZ]ZaaYVYVQVejrty€{{yz…�‡‰‰„Š���‹�ŽŒŠŽŽ‹������ŠŠ�‹�ŒŒŠ|rly‡‘’�‹ŒŽ˜––™—•™šš›™™•™•–”‘’‹‹‰…†„ƒˆˆ‡Š…‡„~‚�€‚€‚‚„‚‚‚‚�‚‚�‚�‚…‚€†ˆ…†‰ˆ†Š‡†‡†ƒƒ…†…„††ƒ††…�}|€ƒ�‚‚Š…„†‚‚‚†…„€}‚„‡Šˆ‰‰‡„Ї…‡‡ˆ‡Š†ˆŠˆ‰‰ŠˆŽ‡‘Š�‹�‹ˆŠŠŠ‡‰�ˆˆŒŠ‡Œ��‹�‰‹‹ŒˆŠ†�‡‰‰Œ‰‰‰Š�ŒŒ�ˆŠ�І‰Š‰‰‰ˆ‰Š‡Ž‹�‹�ŠŠ‹‹‹†ŠŠŠ‰�‡�‹‹��ˆ‹ŠŽ�‹‹‹‰ŠˆŠ‰�ŽŒŠ���Œ��‹ˆ‹‰ˆŒ‹ˆŠŒ‹�ŒŠ‹Œ‰Š‡ŠˆˆŠŠ‰†‹�’wH:<7:::9><::::98::79:ANT]VZXVVXUWSXRVU_x‡ŠŒ‰ŒŒ‰‹‹Šˆˆ‰‹…‡‰Š‹‰ŽŠŒŒŒŠ�‰‰ŠŠ†ŒŠ‹�ˆŒ�‰Œ�‰Šˆ‡�‚„„‚ƒ�€€}|xvzyy}u}qokmmfdgsrorpniltmiafjhda_RW[gaVY\]XYZYSUUXZXOPRXXTZVTUTMPRRZ]ahtmkkjspvusux{€‚ƒ…„…І„…††Š‡Š���Ž‘�Œˆ~qpv†����”�š’™–—™—™›š˜›™™˜–—•‘Š‰ŠŠ‡†„Š‹…†‡„…„�‚ƒ~�{|‚‚}€€‚ƒ…€�€ƒƒ‚ƒƒƒ‡†€†‚„‡ˆ†Šƒ‰‡„„„‡ˆ‰‡ˆˆƒ‡†ƒ€xvxy~~€ƒ…‡‡……†„�„�‚~�‚„†‰‹ˆ‹‡ˆ‹‹‰‹Œ�‡Š‹ˆ‰Š…‡…Šˆ‰‰‹ŠŠŒŒ‰Œ�ŠŒ‰‡ˆ‰‹ˆ‰‰‹‰ŠŠ‰ŠŒŠ‹‰‹�‰‰‹†‰†‰‡‡‹†‹‹‹‹ŒŠŠ‰Œ‹ˆ�Šˆ†‹‡ˆŒŒŒ�‰’ŠŠ�‹‹‹�…‰‹ˆŽ‰†‡�‹Ž�‹ŒŠŒŠˆˆŠ‰�ˆ‰�ˆŽŽ��Š�ŠŽˆˆˆ‰ŠŠŠŠ‡Ž�ŒŠŒ‰‰�Œ‰‡‡‰�‰_?B@B@B@>@;><:<::<9<;:::=899::<8>8::98<=8;:<:7;79=HSXWWUWUWXXWWVWVQ_q€Š„‡‡‰‰Œ‹‰‹��Љ†ˆŠ…ˆŠ‡Œ‰Œ‹ŒŠ‹�‹‰Šˆ‰…‡†‡‡‡†ˆ…ƒ~|zzwuquqqqkmirusvusppnnk^]ckpsstljnouihehff`^Z]dif^afdjdab][\[`]YXV]]XXURQQNNNNNRXaijiggiimgbchmqqqswy|{yww~‚}…�…ŠŠ‰�ˆ€{wtu‚‹�Œ��‘—–—˜–˜•—™š™›š››–˜”‘�ŽŒ‰‹ˆˆ‹ˆ†ˆŠˆ†„ƒ‡„€�€~‚ƒ‚€~�~€†�ƒƒ‚„‡„ƒ…‰†ˆŠ‡‹…‡ƒƒˆˆ…„�ƒ…†‡††ˆ††‚€ƒ|zvswyy|{ƒ�„‚‚‚„€…„ƒ‚‚ƒ…††‡‡ˆ†Š‹ŠˆŒŠ‡Ž�ŠŠŠŽ‰‡ˆˆ‡†ˆŠ‰Š‰‹‰‹‹ˆ‹Œ�ˆˆ�‡‰ˆŠ‰‡‰ˆ‰…ŒŠŠ��Ћއˆ‹ˆ…ŠŠ‡ˆˆŠ‹‰Š‰Œ��ˆŒŒ‡‡‰Œ‡ˆ‰‰‹Œ�Œ‰‹ŒŒŽŠ‰ˆŒˆ‰…†‹ŒŠ‹ŒŒ‹Œ�ŠŠŒˆ‹†‹‹‰‰ŒŒŒŠ‹‰ŒŒ‹‹‹‰†‹ŒŠ‰Š�Œ‡ŠŒŒ�Œ‹‡ˆŒ�{J>@@A?>@<@=<<:;<=::<:999<;9:9=99:8:9;<698<8:;9:9=BQYUYVTYVWWWWVVZVUZs‚…‡„†…ˆ‰Š‰ŒŠ�Œ‹‡†‰‰†‡…‰„‡‡ˆ‡‰Œ‰‡…‚€�x{z{{twsqnqqiqnmmmieeknqsuuwsqsrn`Y]hmnrogckqutjlmnfecfhqurmhnsxvwtrminkldihiee]YVTSTOMIINT_kkjhgilifa_djfjjpnnssunoroxwzx{€‚…|swyvu{†‰ˆ‰Š�•—•–˜•š˜š™™š›š›œ™˜’�’ŒŒ‰Ž‡†…ˆˆ„Ї……„„„ƒ‚ƒ…„€€�€€ƒ€ƒ€�‡…ƒ…ˆŠ‹†‰‰‹‡„†Š‰„„€………„…ƒ~|„�€}}zy{{}z{{}€‚�€……†ƒ…‹‹‹‹ˆŠˆˆ�‡‡ˆˆ‡ˆ‰ˆ‹ŒŒ‰Œ‰‰‰‹Š‰†‰‰‰ˆˆ‰‰‰ŠŒŠˆŠŽ‰Œ�ŽŠŠ‡…†‰ˆŠ†‹‰��ˆŽŒ‡‹‹Š‹‰‡†‰Š‰Œˆ‹Š‹��‹‹ˆ‰�‰‹Š‡�Šˆ‰Š‡Š�‰ŽŠ‰�Š‹ˆ‰ˆ‹ˆŒŒˆŠŠ��‰Ž�‹‹Ž�Ž…‰Š‡‡ˆˆ‹Œ�‹Ž‹ˆ�‹‹Œ‹‹ˆˆ‡ˆŠ‹‰ŒˆŠ‹�gA==<<9>9:;;;99::8>7=;5:;89589:87:8::;9CKTVYTZVXQUUYYWTUVW]v‚І…†„Ї†‰‰‰‡‹‹Œ‡‡††…„‚�…ƒ|y}~tz{wxrnnrplllgjloomqxxsqpjchtsprtsvvutrd^djjnpmgbfrsuwuvzrmkpwz|{vrv{��ˆ†…||}zzxuutrnaad^aWLHHOS`gmjjolpmmifjmpkhplmnoonmklmqtsvwzxtqmpuljp{�‚�ˆ‡—”––”˜šš—™–™—˜šœš“”‘“��‹Œˆƒ„„‡„„†ƒ‚…€ƒ„„ƒ†‡…�„…ƒƒƒ„‚„‚‚„†ˆ…‡ˆ‡‹ŠŒ‡ˆ†Š‡‰„‡‚†…�€€|v|yzz|€€‚ƒ€z~ƒ„†€‚ƒ†‡‡‡‹ˆ‹ˆ‰��‹Š‹‹‡‡Œ‡‡ˆ�ŠŠ�‹ˆˆ‹‰Š��Œ‰Š�‰‡Œˆˆˆˆˆ‰‰‰ŒŒ�ŠŒŽ‹‰……ˆ††‰‰‰‹Š‰‡Œ�‹ŠŽŠ�ˆ‹‹ˆ‡ˆŒŠ‰‰�ŠŠ�Ž�‹��ˆŽ‰†ˆ‹ˆ‹ŠˆŒŠ‹Š��‡�‹��Œ�…‡ˆ‰ˆŠ�‹Œ‹‹�Œ‹�‹†‰‰†‡ŠŠ�Ž‹Œ�ŒŒ�ˆ‰‰Œ†ˆ‹�Œ‰…†�~V=@?AA?>===;?::999<9=;8:9;68>9;>5;<988::9988;9::?DRXWYZYWWWZRXZSZWVSZpƒ‹ˆˆ†Šˆ†ˆ……‚‚†€�|z}€yx{}xtmoklijmpoolmprpliioqsqqtzzuqkkkmrrtsrwvqvwvngoqqjnpspnv~~‚„�„€yw…Šˆ‡‚z€�†‹ŽŽŽ�‹‹�Šˆˆˆ…�€zysquohRKGPT_ckmjoouusogoqtqpsrnsqtlkngjquvtvvuskkoic]cmmpquw–––’˜š–šš˜œšœœ˜›”••�‘��ŒŒ†……†ƒ…„‡ƒ…‚…ƒ�„„€{€‚„…‚…‡ˆ„„††Š†††‡……‰ˆ�‡ˆ†ˆˆˆˆŠ‰ƒ„„�||{~xz~~�‚ƒ…ˆ………‰Š‡‡ˆ‡‡†ˆ†‡ˆˆŠŠ‹Š�ŒŒ��‹‹Š�Š‹ŠŠ‰‰ˆŠˆˆ‡ŽŽ‡ŒŽŠ���‹Š‹‰Š‹‹‰‰‰Œ�ŒŠ�ŠŒŠ‹ŠŒ‹‡‡†‡‡ŠŒˆ‰Œ‰��ˆ���‹Š‰‹ˆŠˆ‰ŠŠŠŒ‰Œ‰��ˆŒ‡ˆˆŒ‡ˆˆˆ‹‹ŒŒŠ‹Œ���ŠŒ‡�‡‹‰Š‹‡‹‰�Œ‹Œ�ŒŠŒ‹ˆ‰‰Ž�‹ˆ‰ŠŒŽ‹Œ�ŒŒˆ‹Œ‰ˆ‡‰„sD@B>B@>A=;>;9>;;:;;:<9;<9999<78<9;:9;7;;86::8;89CKPWWSWZZVYUZZZWYUVT[i~…€ƒƒˆƒƒƒ~€{{tvrkkmkksquvvpmnnebiknlinssvvtmmtutrrtxspmokntw{v{xz{{y||{{zystz|‚ƒƒ…‡ˆ‰‹ˆ��…‹��’�Šˆˆ‰Ž��‘���“’•�‘�‹Œ‰€�€~yp\OPMS[`loqvssqsljmotxtqssuwsnlkgituxzxuusvorjc\_bebcckš˜•–š–˜™˜šš››š›˜””–‘�‹�’Œˆ†‡Šˆ‹‡‹ƒ‡‚†…€€�‚|‚~�ƒ„ƒ‰†ˆ†‡‡‰Š‡Š‡‡ˆ‡‚†ˆ††††‰‡‰‡ƒ…ˆˆ†€‚…€wv~|�ƒ‰‰‰†‡‡‡Œ‰ˆ‹Š‰ŠŠ‹‰ˆŠ‡‹�…Љ‰ŒŠ‰�‹‹‹‹Œ‰��ˆ‹‰†Š‹‹‡‰‹‰ŒŒ�ŒŒ‹�‹‹Œˆ‹�‰�ˆŠ‹‹ŒŒŠ�ЉŒ‹ˆ†Š†‹ŠŠŠˆŒ‹Š‹ŒŒŠ�ŽŠ‹ŒˆŠŠŠ‡ŠŠ‰‰‹ŽŒ�Š‹�‹�ŠŠˆŠ‰‹Œ‡‹�‹Š�‹Œ�ŽŒ‹ŠŒ‰‹‡Š‹Š‰Œ�Š‹ŒŠŠŽŠ�Š�‹ŠŒ‰ŒŒ�ŠŽ‹ŒŽ‹‡‹‰ˆ„`?A>C@>=>@:=>9>=;8<99::9<;:8:;;8::89;7<:9:;;::;;AISVXSVXWWXWWXZWXVXXTWhsuuvt{yvsvtnslmha`aghkmqrqtrssjfmrnsnrrvuusssvzxywywwsursuz~�††‡†‡‹ƒˆ†‡‡‡ˆƒ}yzƒŽŠ���“‹�ŽŠ‹‰�Ž�“–’��‘’’“’‘�‘‘‘•”–‘’�”�‡ˆˆ…ugZXVQT^nz}{{}zxshooutprsutrskkgkksw|yvwutuvxvfafhfbbe_“˜š–™–˜˜˜˜�™™�œ›—–””���ŽŒ‰ŠˆŠˆ‹‡ˆˆ…ˆ„„„€ƒ€€~{{|€„†‚„…„‚‚††ˆ‹ˆ†‡Š…‡Š……†ˆƒ‡ƒ€……‡‡‡„‡‡„z{€�†ˆ††‡Š‡‰‡‹ˆ‰‰‹‹ŠŠŒŒŒŠ‹ˆ�ˆ†ˆ‰‹‹Œˆ‰Œ‹Œ‰‹ŒŒ���‰‹‹Šˆ‰Š‰‡Œ‹ŠŠ�ŒŠŽŽ‹‰Œ�‰‡ˆŠ‹ˆ‰‰‹‹‰‹Œ�‹ˆŠŠˆ‹‹ŒŠ‹‹‹ŠŒˆŒ������‹‹‹ŒŒ‰‰‹Œ‡‰ˆŒŒŽ‹‹‹��‹ŠŒŒ‰…ŠŠŠ‰‹‰‰�Œ��Œ‹�‹ŠŠ‡‰‰‰‹‹Ž�‹“��Œ�‹‹Š‹Œ‡ˆ‹‰��‹��‰‡|W>>DD@>>=??;?><;;=:97;::;99:<<::8:=8998:;;9:78=?ISXUVXXWYVVUVXWWWWZZUZbkqfgmpqqrroorrqofaaikloppqwsuvliqvwsqsutuvwuu}€~�‚�ƒ��ƒ~}„�†ŠŒ‘�Ž�‘�•’�ŒŽ…„|t}Š‘“•‘—’“”““���’�“‘‘’—”–˜““•�Ž’’�’‘�‘Ž‘�Š�†€{qph^VQ]l|ƒ‰…„ƒzqtyxstrtsupqnjniouz{yvwtuvv|xhhjpmnnkh–š˜—š•—›˜—™™™™œš——•”ŽŽ���‡‰‰…‡‚ˆ…†‡‡ƒƒ„€~‚~‚~}„…ƒ€‚‚{|€††ˆ‰‰ŠŒ††Š…‡‰ˆ„…~~€‚ƒƒƒ„…‚„€…Љ�ˆ‰ˆˆ‹Š‡……‰ŠˆŠ‰ŠŒ†ŽŽŠˆ�ŠŠ‹�‰‰‰††‹ŠŠ‰‹ŠŠ‡���ŒŒ‰�‹‹Šˆ‰‹Š‹Œ‹‰�Š‹ˆŒŽ�ŠŒ‰Š‰‹†ˆŠŠ‰‹ŠŠŠŒŒ�Š��‹‰Œ‰ŠŠˆ‰Œ‹Œ��������ˆ‹�‰Š‹‰‰Š‰ŒŒ‰‹Š��‹‰‹ŠŠŠŠˆ‰��Š�Š�Ž��’‰ŠŠ‹Œ‰Š‰‰‹Ž�����‹‹���Šˆ‰Œ�ˆ‹‹Œˆ‡rF=D>D@=?>@;=>=9;;:9:<;;:;8;7:::8=8:;7;999:8;59BDRXUUUWW[YYYXXT[ZVWYUUWbmmdimrusttstuvuxqehprrrsrrutwtonu}{{yzz~}}€‚…†…‰‰�‹Œ���‹‰Œ‰�Ž�Ž‘�””–“—”““’Œ�zo‹”•�•”––”•’’’‘‘‘Œ��”••——””—’“’–‘‘�Ž��ŽŒ‡‡…€€~xkbTXm|‰ŠŒŒ�…€�€�~z{wywwsvrorx{{|xvwxuvwynkmppsstq•–™™——˜šššš™™š˜˜–˜““‘�ŽŽ�ŠŠ‰††‡‚„††ƒ}~€€|~‚€€�~�„€€€ƒ€�y|~„„…ˆ…‹‹‡„„‹ŠŠ‰€‚�|ƒ{{‚„ƒ‚ƒ‚‚…ˆ‹‰�‹Š‹‡ŒŠŠ†ˆŠŠ†‰†‹ˆˆŒ�ˆ‰‹‹ŠŽ�‹‰‹‰‰‰‰‰‰‰�ЉŒŒŠ‰ŠŒ‹ŠŽ�Œ‹‹‹ˆ‹‰ŠŒ‹‰‹�‰‹‰ŒŒ��‡ˆ‹‰‹ˆ‹ˆˆ†‹Žˆ‹��‹ŒŒ�‹‰‰…‹ŠŠ‹ŠŒ‹Š�ŽŒ�‹Œ�ŒŠ‹‹‰Šˆ��‰‹�Š��Š��ŽŠˆ‹Œ‰‹Š�‹‹‰�ŽŽŒ‹���Œ‹‰‹�‰‰†��ŠŽŽ��‹ŠŒ�Œ‹ˆ‰‡Š†dB?EDAA=??><@<::;8<<9;:;::;9:8;;8<<89:;::<9;;7BB=<>>?;>8;>:=:;::7>8==:;89:9:6<8::::<9@B?C@=@@<=@:9:;9;9<999::8;;8<8:<::87::::8:=AIXVYUXWTVWXWYXYZXXXYZYVYVgs}zz……‡‡‹‰‹‹‰ŒŽ‹…‰„‡‰„ƒ€…~}…Œ‘ŒŽ��ŠŒ�‘��’“‘’””�“���ŽŒ�‘‘‘’‘””“”’”•��Ž���‘�‰zt�•™•”’’�’‘Ž‘‘••’”••––“—”“‘���“““““’‘•““�Š‹‰ˆ‹‰†t_cs…Ž”•“�‘Œ‹‹�ЇŠ��ŒŽ““”“�‰‰Š‹ŠŠŒˆŒ‹ŒŠ‡†‚pa[^_\™–——š˜™š–�—š›–—š™”’”‘�ŠŠŠ‰‹Š„‡…ƒ„ƒ�‚€‚��ƒ‚‡‡ˆ‡‚~||‚‚€€�…‡‹‰‹‰†ƒ„„„ˆ‡‚vnw~…„„…„„‰Š�‹��ŒŠˆ‰‰‰ˆ‰…ˆˆŠ‡ŠŒ‰���Š‹�‹�‰Š‰�ŠŠŒ‰‰‰ŒŠŒ�Œ�Š��ˆ�‰ŠŠŠ‰Š‰‹‡‰‰‹‰Š‰‰Ž�ŽŠ�Š‹‹ˆ‹‡‰‹ˆŠˆ‹‹ˆŒŠŒ�ŠŠŠŒ‡‡‰Š††ŠˆŒ‹��ŒŠ�ŒŒŒŠ‰ˆ‹�‰ŠŠŠ‹‹ŽŒ‰ŽŒ���‹ŒˆŒˆ‹‰Š‹‹����Œ‹Œ�Œ‹ˆˆˆŠ‹‹ŒŒ��Œ‹Œ�‹Œ‹ŠŒŠŠ‰Š‹ˆ…ŠŠ†sJ@BD@B><=@<@>::9;<7>:69;7::;95=;;7;<7:7<:87;?KRWUUXYUZZ\YV\V]USXXX[UXUXi‡ˆ…‡‰‡‰Š‹‰Œ�ŽŽŽ�‘‘��Œ‹�‰†ƒ€vs~ŠŽ‘����‘ŒŠ������“’‘�‘�‘�ŽŒ���ŒŽ���‘�‹‹††ˆ†‰Š‹Œ†{ju†Ž–”••“•‘�‘�”‘“‘’•’•™––•–••““•Ž‘‘“�•••••‘���‹�ˆu``i~‹“–’�‘�’��‡„…†……‰‘’”“�މ‰‘“��’Œ�Š‹‡…‡kZTMSS–•——™›•›—™™š–š™—–”’’‘��Œ‹‹‹‰‰‰…€ƒ„~{~‚………‡Š†‰ˆ‚~|„…†„‚†…ˆ‡Šˆˆ†�‚†‡‰†ƒ„€~|~ƒƒˆ†‡……Œ‹ˆ‰��Œ�Š�‰ŠŠ�‰‹‹‰ˆ‹‡‰‰Š‹ŒŒˆŒŽ��ŽŽ‹ŽŠŠ‡Œ‰‹‡Œ‡ŠŒ‘‰‹ŒŠŠŽ‹‰‹Œ†Š�‰†‡‹Š‡‹‹Ž�ŠŽˆŠ�‹ŒŠŠ‰‰†ˆ‹ˆˆŠŠŽ‹�Œˆ‹ŠŠ†‰Š…Š‹‹‰‰Žˆ�ŠŠŽŒŒ�ŠŒ‹Š†ˆŠ‰‰ŒŠ�ŒŒŽ���ŽŒˆ‰‰‹‹ˆŒŽ‰Œ�ŠŒ‰Œ‹�ŠŠŒˆˆŒŠŠ‹ˆŒŒŠ‰ŠŒŠ‹�‰……ƒ€„ƒmG=AA>A@@<====;;8:><<;::<=9;::5999=:9:89;8;?=FSSVRTVYUYXZZ]YZZXVW[XXZZUXi}ŽŽ�Œ�‹��ŠŠ‹Š‹‹�Ž‘Œ‘�’‘‘�‡…€vmn|‰‰‡ˆ�ŽŠ�ˆ�‡‡……„‹…‚†€~‚‡‡†Š�‡ˆƒ�~||y|oryx}‚ƒ„s^ft~†‹‰‹ˆŠŠ’�“Ž�‹Š†Ž�‘“�’””””••‘’�����‘“”’’‘‘�‘‘Œyc[iuˆ’’‘’Ž’�’�Šˆ‡‡„�ŠŽ��Œˆ‹‹“�”‘‘�‹‡…}z|taSPPLL”˜––˜˜™››››—˜™™˜–•“Ž�‘Ž‘�‹ŽŠŠˆ‡‚†‚~||‚…‚‰Š†‰…ˆ†„…ƒ‡‰‡…‡„ˆ‡‡„ˆ‚ƒ‚…†ƒ…‚…ƒ…�„‰‰ˆ‰‰ˆ‰Š‹‹Š�ŒŠ�‰‹ŽŽŒ‰�Œ‹Ž‹‰Š‰Š‰Šˆ�‰Š‹‹ŽŠ‹‘ŽŽ‰‹‹‹‹�ˆˆŒ‰�Љ‹Œ‡‹ˆŽ��‰Ž‰ˆˆŠˆŠ‰ˆŠŠˆŒ‹���ŒŠ‹�ŒŠˆŠˆ‰ˆˆŠŠŠŠ‹‹Š�ŒŒ‹‹‹Š‹Š‹‰‹Š‹‹‹Œ‹Œ��Œ�Œ�ˆˆ‹ˆˆŠˆ�ŠŒˆ���ŽŒŒŒ‹‰ŠŠ‹‡‰ŠŽ�ŽŒ‰�‹‹�Š‹Šˆ†‡Œˆ‡‰‰…‡‡‡ƒ�‚�wwtvpbCAAAC?@?;;><<:>99;=;9:<9<:8<;;599;;7=7:9:9=IQVZVTSTVZXX\ZUWZX[ZXX[VXWWWexŠŒ���ˆ‹‹†ŠŒ�‰Š‹Œˆ…Œ��‘�‰…‚|shcmwuyzƒ�|‚z~zyvuvwnnnhhorwwyz|zqoplmmjkacfipquwreVZakqzyvos|‚ƒ…ŠŠ�z{�†ƒ„ˆƒˆ‹Š�ˆŒŽŠŒ�ˆ‰�‡‹ŠŒ�‘��‘��}gZer��’Œ��‘‘��Œ‰Œ††……‰ŒŠŒ‰Œ�’“”’‘ŽŒ…znkj`WORJMQ–˜•˜—˜˜œ™™ššš››˜–”‘‘��’’���‹‹�ˆˆŠ‡��‚‚…ƒ�„†ƒ�„…†………Šˆˆˆ‰ŠˆŠ‰†‡€ƒ„„†ƒ~��…‚‡‡Š‹Œ�Œ‹��‹‰‰Œ‰ŠŠŠ†‹‰‰‰‹���ŠŒŒ�ŽŠŒ‹‹‹‰Š„Љ‹ŒŒ�Š�‰ˆŽŽŒ��ŠˆŠ‰‡ˆ‰Š‹‡�‰ŒŠŠ�Žˆ�Œ‰‰ŠˆŠ‰Š‰Š�‡‡ŠŒ‹ŒˆŒ‹‡Šˆ‰‡Š‰‡‰ŒŠŒ‡‹Ž�ŒŒŒ�‹‰‹‹�ˆŠŠ‹Œ�Љ‘ˆ��ŠŠ‰�‹†Š‰ŒŽ‡ˆŒŒŠ‹��‰‘ŠŒ‰Š‰‰ŠŠ‰‰ŠˆŠ‡‹Š‡ƒ‡……€€€||~|xutmjiqooWD>@B>@A=<=?;;;9;=7:<9:;7<<:<9:8<7:8=99:9:>ENT\WXUUV[XUUWTVWXW]ZXX]YWYZVas„ƒ‡ƒ�€„�ŽŽ���ˆ†}{…†�ŠŠ‚}z|xkcejikuzuvtqtqppkpkhhga_bfempqproqqnmqmmefgjmrrqmc\Ubckroo`eistvwzqmsxwzzuyuz}~|}~‚|{{€€‚…„…ƒƒ€ƒ†ƒ{iZ]ixˆ‘�������Œ�ŒŽŠŒŒ‰‹�‹‹ŽŽ�‘‘‘Ž�‘�€qhb]WRQNQPN˜•“—š–—˜˜›˜™››š�™˜“‘‘”•‘�Ž�Œ‰ŒŠŠ�‡†‡‡ˆ‰…‡„ˆ„�‚ˆ„‡‚ƒ„ˆƒ…ˆ‰‡‰‹‡ˆˆˆ‚‡Š…††‚„��…„‹�Š�‹‹��Š����Œ‡Š‹�†Š‰‹ˆ�Š‹ŠŠ�ŒŠŽ‹‹ˆ†„„……‰Š‹‰‰†ƒ‡ŒŒŽŽ‹�‰Œ�ˆŠŠ‰ˆŒ‹†��ŠŽŠŠ‹‹ŒŠ‹‹ŒŒ‹ˆŠ�ˆ‰‹Šˆ‰Œ�‡ŠŠŒˆŒŠ‡ŒˆŠ�ˆ‹‡Š‹Ž‰�Œ�ŠŒŽŒŠˆŒ�ˆŒŒŠŠŒ‹‹���‹Œ�‹ŒŠ‹ŠŒ‰‰ŠŠ�Œ‹‹‹Œ‰‹‰ˆ‡‡…ƒˆ�}‚€~{{€zzutsvtsornmahjpjTD@>@>?=@?@:=:9@<9:9:89;;;99<7:<9::9:99;9>DPXW[XYZUVY\VUXUVVVYWZUYYYYWXX^p�~‚~{}~„ˆ��Š�‹‚}€€ˆ†Š…€~|}zofjhry~|~vytywwuwpnuqkgnlmusswx|y|}|{}|{uxx{{y{vm]`dhosvrhiimnsprkkmnoussuvsvstvswwpopsxx€{{xtqsvzujVXer�Œ��‹�Ž����ŒŽŽ��‰��‘“���”��ŽŽ‘Ž„qf^ZUSNLNOL–––˜™š™š˜™™˜šš™›˜—••“’’Ž��ŒŠ‹‰Œ‰ˆ†‡‰†‡‡„‡‡Š‰ƒ‡ˆ†‚€}�€„€„�††‡‚…‡…‡‰‰†…ˆ…‡†††ŒŒ‰‹‹‰‹‹‹ŠŠ‹�‹Žˆ��Šˆ‹Š†‰‹ˆ„‰Œ�ŠŠˆŒ‹†‡…†~�†‰‰‡ƒŠ}�…‹‡Ž‹‹ˆŽŒ�Š�ŠŠ‹Œ‰†ˆŽ‡†‰Š‡Œ‹�‹Œ�މ�‹Š‰‹„Š‹‰‹‹ˆ‰ŠŠ‹‰ŠŒŒŠŠˆŠ‹‰Š�Œˆ‰��‰�ŽŠ��‰‰‹Œ‡�‰�‰ˆ‹Š���‡ŽŠ‰�ŒˆŠŠˆƒ…‚�ƒ„…ƒ„�€}|}zusyvurouutqvwvsyxssskchmqkSC??@>?@;@<<<:=;;;;<69:::9:;:7<8;;8:;;7;>CPR[WXYWWUXZVVWXT[TZYYVVVW\WZWW_q€‡……„�}~„…ˆ‹‰‹Šˆ……‹‹Œ��……„†€ƒ|slhp}ƒ†…†‚��€}‚}�|{|||z‚ƒ�‚‚ƒ‚ƒ‡……‰‰…‰…‡„ˆ‚ƒƒxpeknw{‚||xzvx{wvsrsqwxywy{~w}||wxwoqtswww{xxrpnmnuhYXaqŒ�ŒŽ�‘’������‹‡ˆŠ’Ž”’‘’•‘�‘�Ž�„saaa\ROMKII–’𙕙™›š››™››™›™˜•••—‘��‘�����†ŠŠ‡Š„…†ƒ„†††‹ŠŒˆ…€€€…��‚ƒ„…ˆ†‡ˆ‹ŒŠ‰ŠˆŽŒˆ‹�ŽŠ�‹ˆŠ‹‰‹ˆ†Ž�‹Ž��Ž�‹��‹‹�„ˆ‹Š†ŠˆŠ‡�€‰€€€‰‰…ƒ‡„„€…†ŠŠŒ‰Œ��‹���ŠŒ�ЉŒ‹‰Œ‰ˆ‰Š��ŠŒŽ‹�Œ�Š�‹‰ˆ‹‰ŠŠ‹ŠŠ�Œ‰ŠŽ‹Œ‹‹‹‹‹‹ˆŽ‰Šˆ‰‹Š����‹���‹ˆ�‰Œ‰Œ‹ˆŠ‰�ŽŒˆ…†€‚…vogiryvuuvtsqxuttyvtvoswtz|}�z~w~{vlggptnQDB@@??=@>:=;<9;>::<:99:;;9;8;9996:;:69BEMYVX\YZXTUUX[XYVYZV[WZYXVVYZZVZ]q…‹�Œ‹ˆ‰ˆ‰‡‰ŠˆŒŠˆŒ�‹�‘���‹‰‹‰‰�|qinw„ŠŠ�ŒŠ‰‡…‡†‚†‡ˆ…†…Š‹‹�Ž‹‰Š‹Œ‰ŠŠŠ’Œ‹�ŒŽŠ�‹ƒ{minx‚†‹…†ƒ…ˆ†ˆ‡�€~|ƒ�…„†ˆˆ‰‡…†~{~|||‚}|ytrsqss^X[jy‡ŒˆŽŽ‘‘�’‘Ž���ˆˆ‰��”�“”™“�“�Šˆ|iecc[UMMHHJš•–—–———š˜œ›œ™™�–˜••””���’��‹��ˆ‹ˆˆŠˆ‰„…„‚‚ƒ†‰‰ˆƒ€zx~„…†„‚‡…ˆ…‡ˆ‰‰‰‡Šˆ‹�ˆŠ‹����ŠŠ���‰Œ‰ŠŒ‹Š‡Œ��‰��‰Œ’‰Œ‰Œ��‡…ˆ|„‚„‚„††‡„…‡†ƒ„ˆ‹‡‹‰�‰ˆ‹‰Œ‹�‹‹‰Š�ŽˆŒ‡‰‹‹‹ˆˆŠ‰‹ˆ�ŠŠ���ŠŒŠŠŒŠŒ‰‹Š‰‡ˆ‹ˆ�ŒŽŒŒ‹�‹Š‹Š‰‹‹ŠŠ‹Œ�ŽŽŒ���‹�ˆ‹‰Œ‰ˆŠ‡ƒ{wxwx|sbWWalonknstqsxy|||}zxvyv|z�~~‚‚{}€|sqtvwrWD?@?>B=ALUUXXUY[XXTTXYW\YYYZVWWXZXYZX\\ZVWk€Š‹��‰���“��Ž����ŠŠ‰ŒŒ��‰���Ž���rgejvz‚ˆ‹Ž‹������“Ž��ŒŠˆŒŒ��’�‘�“�Œ�‹Šˆ„„‡‡‡……†zlju†‘�ŠŠ�‹ŒŽŒŽŽ�’��Ž‘Ž��Ž���’“�”����‘‘‰Š‡ˆƒƒ€…„|i\Xaq‚Š‹ŒŒŠŒŒ�Ž�ŽŒ�Œ�‘Ž���‘‹ƒ…€}wpeXSNONLHNFHJG•––˜š™›˜˜™™™šœš”™•˜•™’’���މ‹ˆŠ‡‰‰‰ŠŠ††‡‡‚~‚„…‚}yvzx€„†„„…€€†ŠŠ�‹Š�‰‹Ž‰ŠŠ‹Š�ЉŠ�ŒŽ‹ŠŽŽŠŒŠ‹ŒŒ�ŠŠˆŠˆŠ„Ї�ˆ‡Š‡‰ŠŠˆˆˆˆ††‡‚‚€|�ˆ‰ˆ†‹�ŒŒŒ‹‰�‰‰‰ˆŽ‡‹‰Šˆ‹���‰‹�Š‹‹Š‹�‹‰‰‰‰‡‰Šˆ‰Š‰‹�Œ‹Š‹‡‰‰�‰‡‰ŒˆŒ‹ŽŠ�ŒŽ‹‰Ž‡Š�‹�Œ‰ŒŒŒŒŒ�‹ŒŠŒ„qcgmswylYTVbq{rqz~€|y€ƒ‚…zx€ƒ„ˆ‰‡ˆ‡‡……ˆ‰‰…ˆŠ…ƒa@;FB@?<=;;?<9=;:;<9:;:;9::::8>:9<;6=BMRWXVXWWXVTUYUZYZ[XYY[WUVVVWZZ\\\VXhŒŽ‹ŠŠˆ‹ŽŒŠ��•��’Ž�ŒŽŠŠ‹‡Š‹�Ž�Ž‹|mhikx�……ˆŽ��Š��“‘‘”‘‘Š‹�ŒŠ‘��“��‘‹‰†ŠŠŠŠ‡…„……{ohsˆ••‘���ŒŽŠŒŒŒ����‘�’”�’��‘’Ž’Ž’“�‹Ž‘��‹‰…‹†ƒ|skXV^q‚‰�‹��Ž��‹�Š�Ž�’�’���‰€ohica\VMJJGGKEBHFGL••˜›—››™™™™˜š™š••š—–›�’���‹‰Š‰€}†„‰Š‡ƒˆˆ„€ƒ‰}€~}ƒ‚~�‚„ƒ…€€†�Š‹�ŽŽ‹Œ‹ŒŒ‹ŒŠ‹‰ŠŠ‰�ŽˆŒ‹Š�Œ�Œ����‹ŒŒ‹�Š‹†�„‰Š‡ŠŠ‹�Š‹ŠŠŠŠ……}y…Ї…ˆ‹Š‡‹ŠŠŒ��‹Š‰‹‹‹‹‰‡�Š‰Šˆ�ŠŠ�Š‹�Œ‹Œ‹ŠŠ‹‰‰‡ŒŠŠ‰‹ŒŒŒŒŒ‰�ŒŠ‰ŠˆŠ‹‹Š‹��‹�‹‰Œ�ŒŽ��‰ŠŠ‹‹‹‰ŒŠ�‹ƒmchowytpc^^hs}sq|ƒ„…‚}ƒ‰…„†€€„…ˆ����ŒŒŒ‹ŠŠŒ‰Œ‰Š‡a@>D@B@;>:=;:;:::<<:=9::;6=::<7;;9?:DLWVYZW]WVXVRWRZWYW\[Y[]VUWWUYYYW[]WSd{Š‹Œ�‹��‰Š‰�‘�Ž‘��‘Ž‘‘�Ž�ŠŠ‹‹��І{lglv€€‚‡ŠŽ‹��Ž“�‘�Ž“�Ž‘��‰��’�Š��„ˆ�����ŒŠ‰„ƒsfm�•‘Ž�‘���ŽŽ‹�������“”�““““’‘Ž��Ї…��“�Љˆˆ€od^ZV^p‚ŠŽ���’�ŽŒŒŠŒ���’�����hTSOQNMMGHLJGHIFFGGG˜—•˜™——šœ�˜›š›˜—•™”š•”–�”�Šˆ†ƒzv„‚ˆ…†………€y€†…„~‚………‡ƒ‚‡†„ƒƒ‡†Š�ЇŒ‹‹‰‰Ž�Œ���Š‹�Œˆ‹ŒˆŠŠŒ‰‹�Š�ŽŽ��Œ�‹‹‹„‡ˆ‹‰‡ŠŒ‹‰‹‹‹‹ˆŒ‡�ƒ…Ž‰ŠˆŠˆ‰Šˆ‰‹Š‹ŠŠŒŽŒŒ��ˆ�ŒŠŠŠ…‰‰‹‹Œ‹�Œ‰ŠŒ�‹Œˆ‰ˆŠ‰ˆ‹‹ŠŒ‰��ŒŠŒŒŒŠ�ˆŠ�Œ‹‹‰‹�ЉŽ�Š�Œ�‹�‹‰†‰‡‹�†odfhqtrnljirx|wz{„‹†‡†ŠˆŽŽŠŠ‰‡ŠŠŠ‘�Š���‘���Š‹‹‰Š‚_?>=:?:<99;;?:9?9:=8=9<9<9<9<@MVX[VV\ZZWZZXUVTWWXZXYY\XVYYX[ZW[]VTT^t�‹‰Œ����ŒŒŽ‹‹‹�Ž���Ž“‘���‘ŒŒ‹‹‹ˆ€vkmru{}‚†‡��Œ�’�‹Ž�Œ�‘Ž’””“’‘�Œ‰ŠŠ…ŠŽ‘Ž‘�‘�Œ�‹�mjrƒ��‘ŽŒ�Ž�‘������‘‰�‘�“’“““•’“�Œ„v{ƒ‰Ž‹…ƒƒˆyaWUZZah‚ˆ�Š���’‘�‹Ž�’�����‡�t_JFIIGHFJGIJJIIHIHGI——˜˜š•——›˜�™™œ™š–––——“�‘’Œˆƒ�~z}}�‚ˆˆ†ˆ�{~~€„�…„€‚……†„‚ƒ‡‹Š‹Šˆ‹ˆŒˆŒˆŠŠˆˆˆ‹�‹ˆ‹‹Œ��‹Œ‹�†‹ŠŒˆ‰ŒŒŠ���Œ�‹���‹Š‹‰‰‰ˆ‡‰‰‰ˆ‰‹‹‡‡‡‰�‹�І‹‰…‰ŠŠˆˆŠŠˆˆŠ����Œ‹ŒŒˆ†‡Šˆ‰Š‹‹ˆˆŽ‰��‹�ŒŠŠŒ‹ˆ‹ŠŠ‰ŠŒˆ‹‹‰����މ‡�Љ‰‹Šˆ‰Š‹Œ��Ž�ŽŒŠ‰�Œˆ�yja_djsuyww{y{|�‡„‡‹‰‹ŒŽ’�Œ������Œ‘‹Ž�Ž��ŽŽ��ŽŒ‹‚Z>D:9<9::;=8:;AJRXYUYW[ZXWXXWXUXWXZ[\WYYVXZWZW_[XYXQP[p„€ˆ�������’�‘��‰‹�Ž����’�‘‘ŽŽ�‹ˆ‚wplnow|€ƒ‹‰���Ž�‹Š�Š‹‘�’�’“”��“��‹‹�������‘��‰|mj{‰���‰ˆŒŽ����’“’Œ“�����Ž““’”Ž„�nnz‡Š‡}x||n_PPZ\^hwƒ�Œ�ŽŠ”’’ˆ‰��’‘�‹‰†{q_OFHGHIHFGIGIKHKLJMK•˜–˜˜–™š—˜˜–›™›™™—š•““”��Œƒ€‚}ƒ€�ŠŠˆ…€ƒ‚€€€ƒ‚�~�ƒ€��†��‰Œ‹Š��‹‹‹‡ŠŒ……ˆŠ‡ˆ‹‹‹‹�‹ŒŽŽ��ŠŒ�ˆˆŒŠŠŒˆŠ‹ˆ‹‹Œˆ��ŒŒ�‹‹Š‰ˆŠ…ˆ…‡‡ˆ‰‹‹ŒŠ�‹‰ŒŠ‰�ˆˆŠ‰†‡‰„�†‰Œ‹Œ�Œˆ‰Ž‹Š‹‰ŠˆŒ‰‰ŠŠŠ‹�ŠŒŒ‹‹�‹‰‹�‡‰‹‰ŠŒˆ�Š�ŠŠ�Š‹‰‹‰ŠŠŠŒŠ�‰‹Œ�Œ‰�‹Š‹}|nfffms|{€|~ƒ„ˆ„‡Š‡‰Šˆ�Œ�������’�Ž��‹‹‹Š�‹Ž�‹Ž‹~Y:;<=;=9;;9:=>9;6=??8<>><::@AB?@>:<<<>9>9::;<9:9::>8<:7=?JR[ZY]YZ\][ZV[VXYWVUVXZWZ\ZZYZ[TUZ]ZYYYOIQkuqru|€ˆ‹ŒŒŽ‹Œ��‹‘‘�•��‘‘�‹�‘‹�“�‘��‰„zyvssv{xz}ƒŽ��’�‘ŽŽ�ŽŽŽ�ŒŒ’�’�’’‘”’“•‘�’�Іq\`u‹Š†ƒ|ƒŠ�‰‚„†‡‡ƒ‰��Œˆ‚‹Š�…tddhfafnz}ub_\YZNS^YMKSh{Ž••“’“’”‘�‘‘Ž�…~€ynhhb\^^][WUSQRRUYRRM™“•”˜˜˜˜˜š››š›™–”˜––‘““‘��‘Œ‡‡‰‡ˆˆŒ†�~„€ƒƒ��ƒ‚ƒ�ƒˆˆ‡ŒŠ�‹ˆ‹�‹�‹‹Šˆ‹ˆŒŠ‡‹‹�Š�‹�Ž�‹Ž�ŠŠŠ‹ˆŠŒŠ‹ŒŒŒ�Š�‹ŒŒŽ�Œ‹ˆ‰ŠŠ‰…‰ŠŠˆ‰ˆŒ‹‰Š‹ŽŠŒ‰ˆŠˆ‰†‰‹Š‰�ŠŠŽŒŒ�Š��ŠŒŠ‡Š‰‰Š‹ˆ‹‹‰‹ŒŒ�‹‰Œ‹Š‹†ˆ‹‰ˆŒ‰ŠŠ‹ŠŽŒ�Š�‹Œ‹‹ˆŠ‡ŠŠŒ‡ˆ†ŽŽ��‹ŒŒŠˆŠ�‹‰ŠŠ‹‰Ž��‹��Ž‹ˆ‚ƒ|v{�€~‚„…ˆƒ„‚ƒ~‡……ƒ~†‡ƒ…�†Ž‹Š‡‰Š‰sM?=@@A?>?<;>>=9;:;::8;78;;;::?>>A@;?;<<=;:9:>9:9;99<:<;;APVa]aa^Y\[XW]Y[U[YZXWUXZYZW\\WVVXX[Y\ZZ\[KBN`fbgimox‚‹������‰ŒŽ‰‹‹�‘‘Ž���‘‘�ŽŠ‹�‰ŒŒ‡†„yqsuuuw�‹Œ‹Ž�†‰Š�‘�”�‘”’�‘��ŽŽŒ�‘�‘•”””Œ}g^gqjkqqprqulelrnejouyulemwyqb\]cYXX[_aZVONIHIOUNLNThyŠŽ’����“‘˜–˜“�|qw}€{y|{~{mjfljg]VVUSUVQ—•–˜š—˜™š˜˜˜™š�˜›™™•–”’‘�ŠŠ�~{��†ˆˆ€{‚‚~ƒˆ…�‚‚€~‚„ƒ………ˆ‹�Š‹�Œ�����Œ‹Ž�Œ�Š‹ˆˆˆˆ‰Š‹ŒŠ�ŽŠŒ��‰Š‹‰ŠŠŒŠ‰�‹‹†Š�ŠŒ‹��Š‹‹‡‰ŠŠŠ‹…†‰‰‰‰Œ‰‹Œ‹ŽŠ‹‹ˆŒ‹Š†�Љ„‹‹‰‹Š‹Œ��‹�Œ�ˆŠ‹‹‰‡Š†‹‹‹�‰ŒŠ�ŒŒ‰‡Š�†ŠŠŠ‰ŠŒŠ‹Œ��Œ��‹Œ‰‰‰Š‹ŒŒ‰�Š�ŒŒ�������‹‹�Œ����‘ŒŒŠ‡„€��|vsoiirxz~~„„‰ˆ‡‹‰‡†Š‹‹ŒŒŠ�ŠpH>B=>?=@=@<;<8>;9=98:?7::8<:FMV\^ca`]^[[ZZ[YZWVYWUWTWXX]XXZWWUVXW[[X\YXIDOhjddlgin|‰“‹ŽŒ�“Š���ˆ‹�Œ‹Ž‹���Ž�“�ŽŽ��‹‰Šˆƒzysutt������Š‹ŠŠŒŒ���‘’’�’�‘�ŒŽŒ��Ž‘���€refceglsokfi`Zdhd]ehnsma\cloeYWYZSS\RUVXULNIJIJMNINV`sƒ�Œ�ŠŠˆ‹�“‘’�…oflw|{y|‚‚{lbfkli]_WYZY\[˜•˜–šš˜�˜–œš˜˜š˜™ž––”•”�Œ‰††‚~‚ˆ…‚€|~€�|‚†ƒ‚ƒ‚ƒ……†„‚‚‰‰ŠŒŠˆŒ�ŽŒ�ŒŒ��Œ�ŽŠŽˆ‰‰Šˆ‡ˆ�‰ŠŒ�ŒŒ‹ŒŒ�Ž�Š�‡ŽŒˆˆŒŠˆ‡�ŠŒ��‰‰‹Š‹ŒŠˆŠˆ‹Š‡Š‡ˆŠ‹ˆŠŠŒ‹ŠŽ�‰Œ‹ŠŒ�ˆˆ‰‰‡‡Š‹Š�‹‹‹ŒŠŒŠ†ŒŠ‡ˆˆ�‰ŠŠŒ‹Ž‹Œ‰Ž�Œ‹Š‰ŠŒ‹†ŒŽŠ‹‹�Ž�ŒŒ�ŒŒŒŠ‹‹‹†‰ˆŽ�ŠŽ’��‘‹��‹�ŠŽŠ‚‚‚‚y{‚„�}upjlw{~vx€„„‡ˆ�ˆ‹‹Œ�‹ŒŠˆŠ‹…lG=E@AB>;>><;=::<9=<;::;98<9CNUY\aa___Z\[\_XYXZVYTUSSVZYVY\YYWYWTWXXVXZSEBPemqmnhfqz…‰‰Š‹‹Ž�‹���Ž�‹Œ‹ˆ…Œ…†‰�‰‹�Ž��‹��ƒ‚xpmmuˆ�ŒŽŽ‹ŽŽˆ…„‡……‹�‡ŠŠ��‰‰�‹ŒŠˆ}}~zud\fdgpxtkd`YY_acXafinh``bhicUSTQPPTTSPSRSPMGFGLIHIMUjy„ƒzzwy„‚†Š…‚q`X\gnjhv�}ypdchgc^_dbgec_—”–—–—™™š˜›™™˜š™™—˜–““’�‹†�ˆˆ…†‡‰†…‚‚€|€€ƒƒƒ…ƒƒ‚ƒƒ‡†‡†‹ˆ��‹‡‰ŒŠ‹‹ˆŠŽ�ŽŒ���ŽŠŠŒ‰‰ˆŒˆ‹‹‹‰ŠŒŠŠŒ��‹����ŠŠŠ‹‡ŒŠ‡‹‡‰Š‹‰Š‹ˆŽ�ŠŠ��‰ŒŠ‡‹‰Š†Œ‹‰Š‹ŠŒŒ‹Œ�ŽŠ‹‡Š‰ˆˆ‰‰‹‹Œ†Ž‹�Š‹Œ‹Š‹‰Š‰†�‡‡‰‹Œ‰ŠŒ‹�ŽŒŒ�‰ŒŠŠŠ�ˆ��‹Š�ŽŽ�Š�Š�‹�……‡‹�Œ‹Œ�Ž‹ŒŒ‰�‹„…€ty|wqu…‚„~|y{€„yw||}�ˆŒ‹�‹���Œ‹‹‡Š‚hD=?AC?>=?==<=;;:9>7=9<9::>ALYZ\YZa_Z\[Z`][[[]YZSTYTWVXYVXZXZ[XWXWYXVZVR@;A=<>;9:>=:<::=:;;CLW_a[[]^_Z\\Z\\_\Z^[XY[XWT]YWUV[[UZZUYVX[Y\XN=:>??B=:=<===9;;<:<;89=:@OW[_^]``^ZZ^[]_[]^ZYZZ[XZW\\YXZ[W[YZ[YWV\^[]VG=::=@CGKOUZX\_dimuwtlbcd]TMMKHEDCJQOGHLPYYU^cmgXSEFKKWaji^QLJIIJMWakpjZXSWUV[hpuqhfabYYYceuuz}yvssplnm_RVZSSOJJMQRRIJQQQSOKPOHHIIHEEHIIDBCDGILLLHJNKKLHLIIFEGEKIGIPQYaaa][W\aaeoqlc••–™—™˜™™™™š›ššš™––”–‘�Š�ŽŠ‹‡Šˆ‰‚€}{{~|ƒ…………‚�ƒ‰‡†Šˆˆ�‡�‡‹�‰�Œ�ˆŒ��ˆ‹ŽŠ�‹ŒŠ‡ˆŒˆ„Š‹ˆ‡Žˆ‰ŠŽŒ‰Ž‡�‹‰‰‰ŠŠŠŠ‹‹‹Œ‹Š†ŒŒ‹�މ‡�ˆŒ�ˆˆŠ†ˆŠ‹‰ŠŒ‹�ŒŠ�‰Š‰‹†‡ŠˆˆŠ‡‡‰‹ˆ‹‰‹‹Š‹‰Šˆ�‰‡‰Š‹Œˆ�‰�‹‹ˆ‹�‹Ž‹‰Œˆ‹ŠˆŠŠ��‰‰�����ŽŒŒ‹ŠŠ‰‹�ŒŠŠ��‹nsxusmu{€ˆˆŠ†ˆŠ�ŠŒŠ��ŽŠ‹…††„�€zpiigknvx€‰Š‡††ˆŠŒ‚]@>BD?<@==:>:@9:=?;=;;:=DLZ[^a_\\^^[^]Z]^\Z^ZYYU\XXYZXXYY]Y\X[]XV[[^Z[TD<:=CIDA?@FFFIGKNUZaeYNNNNJGD@?=?AMQPEBIQ_ccainnjZMBDHN\gcYPNLMRVTaltqcWY_dhgjr|{zqqqkkldlu{€�}|{xvsrlYSQSOOGGFGKMNKMPQQPTPNMJDGIHCFGMGF=BBHHGGGGHJHJFFIGGHEIEJFEJGHNUY^c]\^a``kpf`•š–—™—™š›˜š›™›™˜•–““•“��Ž’�Š�‡††…}}}€„„„„€ƒƒ……‡‰Š�ŠŠŠ‰ŠŠŒˆ‰�ˆŠ‹‹‹‹Š�Š��‹ŒŽ‹ˆ‡‹‡Š‰Š‰‰Š‰‹�‹Š�‹�ŒŒŠŠ‰‰ŒŒˆ‰‡‹Œ‡ˆ‰‰Š�ŽŒ‹�‰‹‹Š‹‰ˆ†‡Œ‡‡‹ˆ‰�‹‹‹‹ŒŒ‹‹Œ†‰ŠŠ†‡ŠŒŠˆ�ŽŠŠŽ‹Š‹Œ‰‹‰ŠŠ…�‰ŠŠŠŠ�‰ŠŽ‹ŒŠ‹ŒŠ‹‰†‹Š†Š���‘������‰‹‹‹‹Š‹‹ˆˆuhpwwvz|‚ˆ‰ŠŠ‰ŠˆŒ�‹������‹‡‰„xoimmopoy|„‡‰Š†ƒ„‰‰|ZAA@B>=B=A:;@;;=;:;;;9=GM_^]__a^^__[]_Z[[_\a]YVVZSVSTU[[YZZ[\Z]VY[X]^WSB5=BN\ZQA?>BB?><>EJX`[ME@MSUNJDCCQ[`]SMT`ltxxyy}ym]XOKS[elc\[[^gmiquwqf_ekrsw}‚‚„~}u{zxuwx|}‚|~||z|zp`ULLJHHEAEDFLIJKPTQURPPJMDIIIMFJJJEC?DCEFFAEFDGHFEFGHHFFFEEFGDFHNUZfgidbZ_aaaa—˜š–š•˜™˜˜šœš›˜œ”•Ž‘”’�’��‰‹Œˆ‚ˆ…ƒ€€~„€ƒ�~~……ˆŒŒŽŽŒˆ�Š��‡‰Œˆ‰‹‰Š‹‰�‹Œ����ЋЋˆŒŒ‹‰‹‰‰ˆˆ‰Š‹‹‹ŠŠŠŽŽŒŒ�ŒˆŠ�ˆ†ˆˆ„ˆ‹Š‰ˆŒŒŒŠ‹Œ‰�ˆ‹‹‡‡‡Œ††‰‰Š‡‹�ˆŒŒ‹ŽŒ‹‹‰Š‰‡‰ŠŠ‹‹ŒŒ‹‹‹ˆ�Œ‹��‰ˆŠŠŠ‰‹Œ‹‹Œ�Š��ŒŒ�Š�‰ˆ‹ŒŒ�‰���‰��Œ‹��‰��‰‰„tgqvy„…ŠŠ‰Š‰ŒŒŠŠŠŒ‹‹‹�Ž�ŽŒŒ‰…€uot|yyw~„‡†Š……~�†ˆuW>>BF>A???9>;:8;:?CSZ^_a__`a^__X^ZYW]Y]][WZWUVQMOQWZXY]\\YZX\Y]]^ZK@;?AUnneK<>@?><=>EP`jh^MJT`cfYUTYampnfcdgv�€�†‡…€qg_[^`jkfehikswx|zuplorv{|~ƒƒ‡�ƒ~{{|wzwwzwsqulmqzzn^OHHHGIABBBCDGJJMQOOPOQJMHJMMIIKPKGD@B@D@GCCDEGHGGIFFGDGGFFBDEDFFOVfstnh\YY_bd——˜”—˜—”š�™™›››š•��’�‹‘�Š…ƒ‰Š„�„‚…†‚���ƒ|�ƒŠ‰�ŠŠŠ‹‹��Š�ŒŒŠŠ‹‹ˆŠ‹‰‹‹�ˆ‰ŠŠŠŒ‹��‹‰‹�ŠŒ‹ˆŒ‰Š‡†ˆ‹‹Œ�‹Œ�Ž‹ŒŠŒ‹ŠˆˆŠŠŠˆŽˆŠŒ�‹‹��ŠŠ�‹‹Š�†‡ˆˆˆˆˆŠ‰ŒŠŽŠŒŒŒŒ‹ŠŠŠ‰‰ˆ‰‰‰‹‹ˆ‹Œ‹ŒŽ‹‰Š�‹‹Š��ŠŠ�‹Œ‹Ž‘ŒŠ�‘�‹Ž�‰‰ŠŒ‡ŒŒ��Ž‘Ž�ŽŽ�ŽŠ‡~pz{ƒ‰ˆ‰Š�‰‹�ŒŒŒŒ‹Š�‹‰�މˆ�Šˆ‹„|‚…‚‚€…ƒŠ…~vqtpxtgJ@??@=B=>@<=?9?=:=:>AFRY\``\`_a`a^`^\^ZZYZ[X^[WWQGDEGKRV]XZ[Z\[YWY[_ZYG@;>C]r}qU>;@A<=?ITfqyzma^^irxqmjqw~zzuvsz|�}ƒ…ƒ…zvmhkhieegkmmwv}~|{v}uvwvvz|~€|{zyusnmosliebXY_imhUNKGHGGBD=B?@DECHIJIOOMOILKOPJIMNNJDB?AB@AB@DCEEHGFFEDDIEGFDGGGDELR_qwuf_Z^bea“›—––––›˜˜™—›™˜——����Œ�Œ†}€ƒ‡ƒ�€ƒ…ƒ†€€‚‡‚ˆ‚„…ˆ†‡Š‰‰�Šˆ‹‰ˆ‰�‹Š��‰Œ�ŒŒ��‹‰ŠŠ‹ˆŠ‡Š‡Œ�‹�‰��ŒŽ���‹Š‡ˆ‰ŒˆŒŠŒ�‹‹�‹ŽŒ‹ŠŒŽ‹‹�‹Š‰‰‰‰‰ˆŠ†‰Ž‰�Œ�‹�‰�ˆ‰‡ˆŠ‰‰‡ˆŒ�‹Š�Љ‹ˆŒ‹‹‹ŠŒ‡ˆˆ‰‰‰Š‰‹Š‹�ŽŽŠ�‡‹‹‹‰ˆŒŒŠ‹ŒŒ�‘��ŒŠŽŠ�‰‹ŠŠ�Œ�ŠŽ‘�‹�Іˆ€ˆˆ‰‰‰‡‹�ŠŒŒ‹ŽŽ�‹Œ‹�‹Œ…†Šˆ‰‡„ƒ}„…‡€„‚�‚y`Y][X]\QDACB@???<>>;:==;=;>CFSYa_``[^^]_bbb`\Z]ZY\_ZZZVVMB=@@JRX^Z[[[TYXUX[\ZVD>:;E[v|_F@ABEEMVgs{~|~usqqvz}zxy}ƒ„€�|{~€}uzx{yzvsorjkhfiiihmmrvtywuvwxxtorvzv|wvwuojiljhpmfi^VTX\[ZTPJLKIGDABAB?@?BCEGGLJMOOPOPNKMKLPEC?@@B@@AB@CCEFDECHEFEKGGKDFDGEGKXhomeb^cieb—’—™—š™š™˜™—™˜˜”“�‘Œ��ŒŽ…ƒƒ†ˆ…{€‡„‚‰„‚ƒ‡‡ŠŠŠ‹‹ŠŒ�ŒŒŠ‹Š‰ˆ��Œˆ‰‹ŠŠ‰‰‹Œ�Œ‹Œ‹�‹‹‹‹‹ˆ‰Š�‡‹ŠŒŒŽ�Œ�Ž‹ŽŠ‰��Œ‡ŒŠŠŠŒŒ‹ŒŠŽ‡����Œ�Š�ˆ‹‡ˆŠˆŠ‰Š‰ŠŒ‹ŠŠŒŽ�‹‰�‰‰‡‹‰Œ‰ˆ‰ˆˆ‹ŠŒ�ŽŒ��Љ‹‰‰‹ˆŠ‹ŒŒ�‹���Ž�‹‹‡Ž‡‹ˆŒŽ‡Œ‹����ŽŒ��ŠŽˆŽŠŒ‰�ŽŽ�Š�‹Š‹ŒŒ�‹ŠŠ‡‹ˆŠŠˆ‰‹Œ�‹Œ‰Š‹ˆ†€�ƒxylmsqulmmsqZHGEDFGDFCABD>AA?<>;=:=:><:@KT]``^_c]`\]_[]`\_Z]]_^[]Z]\XF=;<>GRV\YV\]X\YVWaVXQ??:;D^s}jWSTTRUYhq{}‚~~{xz|z|{~€€€€~~|€}|suspoiqlqohfffgjokfomptmrpoupqnjmuxzvsuppkghijgklikibWVWXQPPRPKLGGC@ABC>@??BDGGLNMNNPRONNIJGGBB=CB???>?<:=;@<<:;9BGR[^^``__b^^]Z\\^]_[[[`\`\a[ZXG;;>@KPYXWZ\Y[[XYZ\[VI@8<=BXn~}sjfigbignwyvvywxz|}|}z}{v{{zxz{zutqpqkkgpmkiebegejkhmlpllpmijllljdkrwyvutqnmjkmkjgefimh^WWUOOQSNJJJHDCCFCC?>BDCBELJIKLKKKMLKEIG?C?B>@C??A=@EGEHGFGBEEGHHHFIIOLLMPXZY`dlmkh–––™”™™˜˜—š™šš˜—–��ˆ‡‡���‹Œ�Š„‚…ˆ‰��‹Š�Œ‹ˆ‹ŠŠ‹�Œ�‹�‹Œ�Ž‹Œ�Ž��ŠŠ�ˆŒŠˆ†‰‹‹‡ŠŒŠŠŒˆŽŽŽ‰�ŒŽŠ‹ˆŒŒ‹‰‹ŒŠ‹�ŒŽ‹��ŠŒŒŠ‰Š‹‹‹Šˆˆ‹�ˆ†ˆ�ŠŒ‹‹‰‹Šˆˆ�ˆƒŠŠ‰ŠŒˆŠˆ‹‹�‹Œ‹ŒŒ‡ˆŠŒˆˆŒ…‡‹�ŒˆŠŒŒ‹‹Š��‹�†ŠŒ‡‡‰‹ŒŠŒ‹‰ŒŠ�‹‰ŠŠˆˆ‡‡�~|„ŽŠ�Œ��Œ�‰ŒˆŠ‰ˆ‹‡‹‹Ž�‡ŠŒŒŒ‰‡„„…ƒ}l]_ZUPVQNKDEEEDFCDCEGBEDBB>@?AC?><=?=;><<;<>>:>EQ[]^__]^^aa`^[aa``_[[a^[Z^V\ZXG=;@AHPWYZY]Y[VYY[^YUD:;;:ARk|}vtrqtqqouxuqsqnnowwwzwyxxvtzsrotsjnimmlhfknlokefecbcikjmjglkfaceed`adoqrrqngmnllmkhf`bhjdYYSPLNMPIIHKFBAEIFH@@FHGBGHHGFIHFIFKIFGICDCBBDD@@?>BEBIJHIJFDGGGIFGIPUWRUVXWWZ_kqja•™•—š™™•™™™š›š˜›–•’Š…‡��‰‰Ž‰�‰ˆˆ…���ŠŽ‹�‹‹Š�‹ŒŠ‹‹‰ŒŠ‹�Š‹‹��ŒŠ����‰‹�†ŽŒ‹‹‡‡Š‹‰ˆˆ��Œ�ŒŒ���ŠŽ‹‹‰Š‰‹‹‹�ˆŠŒ‰Œ�‹�Œ‰Œ�‰„Œ‹‰Š„„‰Š‹‹ŠŠ�ŠŠˆ‹ŠŒ‹†Š‹‡€}І‹‰‡ŽŠˆ�ŠŠŒ�ŠŠ‹‡ˆŠŠˆˆ‹Š†‹ŠŠŽŽŽŽ‰ˆŒ‹ˆ‹‹Œˆ‹ŠŠ‡��ŒŒŒ‹Œ…x{ygk|‰ŠŒ‹ˆ‹�ŒŠ‹‹�‹‹ŠŠˆ……€}~€€ƒƒ€†~zcPJHFFDEBEDCC=DCD@@@C@CAFB>C;=EA@>A;;=>:9==:?;>EQZb`b^Z_b`]`_]`a_`_^`\_`YZZZXZ[G<<>CIRYV^Z[UYZZTXYVNC;:=>??==:;<;<>AC@@CB?=?AAFKUVQNNJAB=A;><;DDDGIIGGCA?=BCGD@=>?@MTSLLRQX[gnffgVA<=;=>=BO\gefbb___^_d`ab_``_[\][]^]]]]YZW[\I<;<=CNTYVYWXW[WY^ZI:;::7<@?>B;@@EADHDA>AGNRQIDCIP^ghdedhmowxyxs^?<@<<=>;==;BL^hgecg_ac^`^__``a_`^_\__][\\]YY]Z\XK?::>HPUWXYVVYZXZ\TB><;:::@A=B==;@<@?>FLQPMNW_gg^Z]`epz}wwyxx|~~|zbA>?=@>;>;<>JZgnjedde`bc```ba`]\__]]`Z`^`Y]]\YWZYI><:@EU\YZZWZVY][XM>>;::<9;==<>DHILMMPNKHJPMKBFB?DDHFHHGGEEGFEGHDFHFFFGCCDDEFJHHJLRPMNOMNPQY[[˜••˜˜—™™š™˜™——˜—›—”‘Ž�‘�’��Š���Š‹�ŽŽ‹Œ�����’�Ž���‹�Š�‹‰ŒŒ‡‰‹Š��‰‹����ŽŒŒŽ�ŠŒŠ‰�‡‹ˆ‹�ŒŠ���’Œ���‡ŒŠŒŠŽ�‹‰‹‰Š‹‹ˆ��ŽŠ�Ž�ˆ��‹‹ˆˆ‰‰‰„‰…‡ˆ†‚}taXW_^hs‚†‹Œˆˆ‰ŠŒŒ‹���ŒŒ�Œ�ŒŠŒŒŠ‰ˆ�ŽŠ‰Ž‹�����އ�gez…‰�ˆˆwm`UOIIGEIDCCFGCDDD@D??@?B@<?B@>@<>@=H[koogcad_bceacb__b]_^]]\aa\^Z\a][[ZZ`H=:>=GVYZZY[Y]ZXZSD9:<9;<:>@EKFHLPOOSSNIGHINMROMHJJICDADDIFMOHHDB@DEJGFGGHLDIIFGHGHGG?DFDGB@C@>A@FCGHDGCEFHCCBEHED>EA@GLPQJJIGA@BA??>=>A?;;DBCJGGLLKKJKMOJEF?BDFGGEFHGDEFFEDCHFHDFCCIDD?BEHFHHKMNNOIJKIKPST–™”——˜—–™™——™šš˜›–•’”‘“”–“�Œ‘Ž���ŒŽŽ�Œ�Š��ŒŽŒŽ��‹���Œ���Œ‹‰‰ŒŒ�ŠŠŠ�‹�Œ��ŒŽ‰�Ž‹�‹‰ŠŠˆŒŒ�‰Œ���ŠŽŒ��Š�Ž�ŽŒ‘ŠŠ‰�‹Œ‹Š‰‰Ž‰ŠŒ�Ž��‹ŒŒ‹…ˆƒ…‰‡��~k`__\gn{ˆŠŠ‡‰‹‡ˆ‹‰‹�‰Œ‹���‹���‹‰ŠŠ‹‹�‡Œ‹ŒŒŽŒŽ„gQYl||�wtj_QJLGFAEC?CBBBD>>B>@?>=B=@=:>>CCCADMV^afiqwxzzz€��}x|��€|‚‚‚„†‚€€}}xZ@>DB?A>;AFYhsrjfcaccbb`bcdcaa`ba_Z^^^Z^^^\\^\[[ZI>9=?DEEFACEFGDFFEGHKFGDEJKE@BB<>>ABHBFGEBBE@@@AFCAGB=BCCCJIGEHFCA@A;><9B>?@AEBCECGIOLIILMLKEHFFGGEEEEFGDGHHHDGGECFDFEBDGDFDFIGDKOJMHLIHHHLLN—˜•˜–—–—˜š›—œœ—›—•—•’”““““’‘’’‘�‘���Ž���ŒŠ‹‹Š�ŽŠŒ‹Œ���‹Œ�‹����ŽŒ‹ŠŒŠŠ‹�ŒŒ‰�ŽŽ�����‹��‹�‰�‹‹Š‹‹ŠŠ‰ˆ‹��ŽŒ��Œ�‹Œ‹ŒŠ‹‰‰ˆŒŠ‹‰ŒŒ�‰Œ�‡Œ‰‰‡‡��€rdghdfuz‡ŒŠ�Œˆ�‰ŠŠŒˆ‰Š‹‹‹‹ŒŒ��Ž����Š��ˆˆ‡�††~kPJJZae^_]LHDGDDD?B>AAAAB>=>A>>><>A=@?@DGLRSQXegnwsyw~€€€�ƒ…‡‚‚„€„€€€~ƒƒ€z€uR@?@B?@:;ABCGOOMRUPLGKCDCBDCABCCBFDCEFBGFF=A=>;=>CFFADDEEGFCEDGECGDIJEHCAB@=>@DAEBDHBACC@ACGEBA?B?ADBBGEIMFAHEB=<<>>???GEEIBDFNOOIFGKNHGDIJJHHFDGIEDFKHCFEHDFGFEECGGDGHDDHFIJJIJHIHHFGJK˜—–—˜˜˜—™š—šš�™œœ™—š––”’“‘�‘‘‘‘Ž‘�������‹‹�ŠŒŒŒŒŒ‰Š‰Œ�Œ��‹Ž�Ž’‘�‹�Œ‹ŽŒ‰‰�‰��Œ‹Ž��Ž��Ž‹ŽŽŠ�Ž‹Œ‰‡��‰‰ŒˆŒ�ŽŒ�Ž�Ž�Ž‹‰‹‹†‹‡�‰‹‹‡ŽŒ�‹ŠŠ�‹Š‚…„ulxxow{€‡‰�ŒŒŒŒŠ��ŒŒŠŒ‰‹‰�‹‹�‹‰†††‰‡…€€wnlnkdOEADHJLHIFFBFCED@A?@@?@?<==FUit{xooiefec_bb_^a`a_a_ab___a_]_]Z\^Z\\ZH@;<@HNUY\[ZVXUTJ;9=::;=<<=>@BEGDGKMNJIIJJIGFHFC?B>DGIDCDECCDA?=:>>>CHHFBGHIEB@CDDBCCGKDEBAAF?A@CA@DBBCCBB@CDHHD@A@@>ABF@AFDGMILLE>B=9FFGBCBBGFIGHHLLKOKHGEB@EMFCGFB>F?A?=>9>@CHIHOJIF@CAGIAACCIIEC@CBDC@?AGAB?DCB@CADDHJBDAC?@DD@DEBFDIKPPJ@A=A;@A@?HHOHOJNOJGOIGGEHGFFGJDGFCEHHFHIGHLJIGHGEGGGGHGDGGGEGGDDHIFDGHJDF˜˜“•—–˜—™—›—™™š”˜™š˜–˜•˜“•‘‘–�‘Œ‘��Ž����‹�Ž����‹�������Œ‹Œ‰ˆŠŒ‹ŒŽŒ���‰�Ž�ŽŠ��ŽŒŒŒŠ‹�Œ�ˆŠ‰��Ž��ˆŽŒ��މ�‹‹‰‰ŒˆŒ�Š�Š‹�Ž‘����‰Œ‰‹ŒŠ‹‹‰�‹Š‰†}€…†€€ƒ�ˆ„‹†Š‰‹ˆ�‰‰…�‚ƒ†‰†‹‹…mYQMTRXTUJEEGCGEEACBB>C@>@;@><:?=?ABAFGNNNUZ^`bkmmrurprsuswwuwxuyy|{z€‚~yxywttsssywxzzyussqrsqcI>BBA?BNgx€|yxpieddb`dbfbcccd^`_^]^`a[a_`\``]]]\WMDDDILQWWZ[YZZUK:>=;=<:=;=<=AFLGJNIBDBDFKJDC@CDID@BDDCAC?BB@@@CE@BBB?CEF@@BB=?BCA@GDCCGJMLECD@@=>DFGGKLKLLJLGOKHHHGGFFHHEBKCEDDGHFHJFHGHIHIFHLIFFDFFDFDDDEFCGCEGGGEE–š”———™—–šš™œœ˜˜™™–—––”•–—’‘“•“�Ž�Ž‘Ž���‰ŠŒŒ�ŽŽŒŽŽ�‘�Œ��ŒŒ�‡‹‹‰ŠŒŒŒ‰‹‹Œ‹ŒŽ��‹Ž‹Ž����ŠŠ‰Šˆˆˆ‰�ˆ‰��ŒŒŽ�Œ�‘ŽŠŠŽ��Š‹‹�ŒŒ���������Œ�‹�Š�Œ‹‡„€ƒˆ‡||y}‚…„‰Š‰‡ƒ…tiedfq|„‡Œ~eZKHICHFGDEDBCEDDB>BBB<@@=<@AC>@EGMNPRX_ablhhmmowwwwyvuuwy{tvursttursyz{utttqssmlpnrqpprplnmpmm[G>>B<<<@;:>=8;GFMQKQMIJMHKHB@GJRXZWTTVUNHGAE@=@ABCINNLGDEDFHKSQJEABDEACCECDDA>CDABA@EDEDBBAAF>>B?=?A@ADDC@DAFEEBDCBCABFECHGHGJJJHJJJIHHEGFGIDFECEEBGKGGFGIGFHHILHEGIHHGGGFFBCGEGDDFGGHKGB–˜—˜”˜•˜–›—šš››———™–˜•—“••’�•‘‘”‘�‘Ž�‘��’�‹�‹��Œ�‹‹�‘Ž��Œ‰�‹‹��Œ���‹Š‰ŽŠˆ‰Œ‹��Œ�Ž���Œ�Œ�‹‹Š‰‹†Š‰‡�Œ‹‹Œ�‘Œ�ŒŒ����‹‹�Љ‰ŒŒ‹ŽŽŠ���‘�Œ�‹Š‹…„…‰‚}sppqs{�„�xpq]TMJKMUakxy€sl^ULD@@CB@?@BBAA@>@CCDGHMRRX^baffknqtsvttusxxwystruwusstuttqpqnmpmrokmnpliiijlikijllghmfggUG?AA?DYnƒƒzutrmigbccedd_`bc``aaca`a`Z_]^][^^\\ZZVQTUUVXYYZZXZQG::=;===:;<:;;?BDBISVRSSRQRQKKIEFHSW]]__\YYXTPJF@@AOLMLMSQKEDLJPVQPKFCDHGGFCGJKLD?GCCC>DGHDA?AABBBCCB;B?=B@@G?@>>BCBCDEA@GEGFIIDKHHHHJIIGGCFGFGGHGEHCEEGGHHJGIFEIIJKHKIHHFGDFDEFDGDDC?CEFDFCH––™••—˜”˜—™•™�˜™™š˜—™–••—‘‘‘�‘’��Ž”�’‘‘��‘’Œ�Œ��މދ�ŒŽ‹ŠŒ‹Œ�Œ���ŽŽŽ‹�ŠŠŠ�‹ˆˆŽŒŒŠŽŽ�‘��‹�‹‰‘Œ‹�ŠŒŒˆˆŠ‹�ŽŒŽ‹�ŽŽŠŒ�‹�Š�Š‹�Šˆ�Œ�ŒŽŽ�ŽŽ��‰‹‹‰ˆƒyukgafdjpn^WUJEFCAEGJS[frusncJB=??;:;:?BHJLRSZRUVUZXXXTTUSZ`cZVa`_WSYZZMLDBJRVQLRY^SMHPVROOROJILLLJJJNRZWOHHGFBBEECABABDCCFFFCA>>=;>@@A;?>CDGDEGC@EGFGHHGJMFEJILHIFADBGKICIGHGDFKGIIIHIJDGJHNKEECGHHCGGFFGGGACCBDEEFCD––•–—•™–™™™—™™™™˜››”›—•˜”’“•�Ž’�Œ���‘���“�Ž��‘Ž��Œ��‹�Œ‹�ŠŠ‡�ŒŒŽŽŽŒ�ŒŽ�‹�ŒŒŠ‹‹��Š‹‹��Œ�‹�Š��Œ�Ž��ŠŠ‰ˆŽŒ‰‹�ˆŒŽŒ‹������Ž�‹�ŒŠ�Š�ŒŒ‰�‹Ž‹�ŒŒ�qkg^VRINR[TGGDEDGDB@DACDMYbfljUBBFEIJLQTUOOPMNRWZ^ffffmswssrusrqnpsvsvsqqsssrnmkmkpmjkngkgea_\^\_]cd`abc`aa_[Zdfjml``ZQPTNC=?DLez‚ˆ…|wsqifecddbebcd^__a^bba\`]^^a^]\]^\[\ZZTUXYZYXXWZYQE9@:;;<:>FRZZYZWYYVYY_`d]`bflqlZWY^WQOOTVVNEIOR\ZX[df]PLYZOLMYZQRSSOOSQOVcbVIJIIFHCHAAD?CCDFLIDC>?=>==?@GGEFFDABBFEHIGLNJGKIKJIFCDHIIFIGJGGGGHIIFGGGLGJGMIGGFDGGDCFCEEEHFCC@ABBADEC——”—”—™—–š——›š›˜˜™˜š”–—˜––•“�‘’�’���ŽŒŒŠ�ŽŠ�Ž�Ž�ŽŽ‹Œ������‹‹Š‹‹‰Œˆ�‹ˆ���‹�ŒŒ�Œ�ŽŽ‰ŒŒŒˆŽŒ‹‹�Š‹ŒŽ����ŠŒ���‹�‹‹Š‹ˆ‹�ˆŒ��Œ���Œ�ŽŒŒ‹‹Š�ŠŠŠŒ‰…zbVRSIHGBDGJFDEBDCFCBB@?==@GLV`dUKMR[]\]cfidd`ddfjklnrqqrwvquzvssuoopoqknomomklmjlkjjjhihd`_Z[X[\ZVX]`]a_^]]\b^_dhhjg^[UURVOA?>GZu‚І‡}}{zphic``cbcedd`acde`db^b^]\^]]^^[_\\WXZVWZVVVW[[SG?>;=9<:;=:<;9<>HWghb`cbd\_`gihddhruym^XRRVOGGISWQFGJQZ`abildXU`VRRZ`f[ZZYYYZSJUadTIJIIGMCCCDDDACHHGGD??@>>@DCFDA?>EEEFCEBCC@EFGGJJKMKKSMLIDGFFJHFDDHGHGHIIGGGIHHFIHLLFFDDFHCDCBFDBCDDAADBECCDF•–•–•˜“˜–›˜šš—˜™š›™š–“–”–––“”�—Ž�‘‘��‹���ŒŒŒŠˆŽ�‹Ž���ŽŽŽ����Ž�‹Š‹ŠŒ�ˆŽ�‹Š�ŠŠ‹�Œ�����ŒŒ�Љ��‰Š‡‹ˆ‹�ŒŒŽ�ŽŒŒ‹��‹�‰ŒŠŠ‹‹�ŠŒŽŽ�‹�’ŽŽ‹Œ‰Šƒ†‚zq[MFIDAEDDBCCCFCDD?BC?>@@@<>AEO]ca`cjlmppqxxwuwrswvuvxtutwustsuqrmnnlmpnmmjmlhkjfeheafchddcc]Z[[]ZZUOS\[]_ZZ]abjiddbdcbb^[WTMB=BUh}Šˆ‡‚€{yrmkgebecbcdhb^fceea_`b_\^ZY\\^]\Z]YZWXZYXVWW[UKC>=;<;:>;=;8<>;AFXliijknjhkikmmhhnsysmg^PIMMF>GSYUKFIPVZekmkicce]]binla]\baYSNGT^^SMKHEEFGBEJGIEEFFEBA;>;<>CIHIHEBB?BBBCA?C@@DCCCGHILMSWUPLCIKHEHFBEFIGHHJIDEGIIHIJIIGDFFGBCFEABAACDAA?F@CEBBDB“˜“–”–˜˜–™—œ˜™™š›˜š˜˜––”•“‘’�ޑޑޕ���Ž��Œ���ŠŠŒŒŒŒŠ��‹�‹Œ‰�‘Œ��‹Œ‡�Š�‹�‰ŽŠ…ŠŽŒ‰�Š���ŒŽ‘‹ŒŽ‰‰�‡‹‰Š‹ŠŒ�Œ������ŽŽŽ‹‹Œ‹ŠŒ‹‹‡ŠŠ�‹Ž�Š…ƒzsrncZRJKHCAFEBDDAE@DBFCJHIHG@BFGMO\gipru|z|zxxxv{zyyvxzxyxyyywwustpoohdihihmnnnljijh`_e][\^^d_bb`]]_[\YOKOQUY]VUZbjqh^W\aghjd]STI>?Qcxˆ†……ƒ�{wsskiedebgeaebca`dea_da]a_`^]\[^^\YV\VZYZZXWW[ZRE=:>;:=>;>:?<==<>H[dgiopsnpmnnqmmqvyuull_LDHGDDIY[[QLOSS^cjolokkpnnrvxmfbfi\VKKJPY^QMQKCCFDDBILG@DLBDB><>>?AFFHHFAABA@DA@ACC:BBA@DECIKRU__UOJFHHHEICDFIHIIFFGEFJHDIIGGGGCGECCG@@EBBCCACB@>BAD?DB“–––•™——šš—˜——–›šš˜™——›–“‘•“����Ž’���Ž�‘�Ž�‘�����ŠŽŠ‹Ž‡‹‹‹‹ŽŒŒ�ŽŽŽ�Œ�Œ����Š�Š‹ŒŒŠŠ‹Œ�Œ�ŽŽŠ�މ�‹ˆ��Š‹Œ‰‰Œ�‹‰��ŽŽŒ�Š‹�‹��Š‰Šˆ„ƒƒ|o`ZXWVOQRPOKGBB@AC>@?>ABLO\[`_ZWWX]aekswz||}�~xyy{z{wuyvuvvuwxxwwtusppgf^ccgfhklkhgkj[SXZYYVWY]X_d]]aZW]VIIGIQXa[^\]`cXPQYeikjfWOPG?I`x‰ŒŠŠ‡†}{wuqlgdefbbbfddaab_`_`]aa`c[^a^^a`]ZYWWXZVZWU[ZQID=9@<;:=7=>=:=>;@HYbhhquqnponmoorxxzxvph^KBDDDHR\a[USSY_cehpsrrssvy}|ytnnql[NKQY^]WLKWRMHCDEGHKD@BE@BBB>@>CAADCDBBC?AAABB>CC>@AAAABCIGNT]\]ZSHEEGIHCDEEGJEDECFIIEFDHEEEFECDFD@BBBCDB@?CB–”–“˜™••™™˜˜™š˜™—šš˜—š™““––��”“�‘‹‹ŒŒ‹���ŠŽŽ��Ž�Ž�‘��‹‹Œ�Љ‰Œ‹�Š‹ŒŽ�ŽŽŽ�Ž����‘Œ�ŠŒ‹‹‰�ŽŒˆ�Š�Œ���‘��Ž‘�Œ‹ˆˆŒŠ‡ˆŒ�‡„ˆ��Ž�‹…~xsoli]TIIIGFHJKKKJBBB=@>>?>>><:>8=9<<::=:B=I^gkqqttrpmhkmrtvxy|wl`UKDFFJPS[c[VVZgimiqvvwuptw||}y{zwyqcY\[img[MUZbXMCFIIMBB=>A@>BAAD?DBB@CC?@C>AB=E@?CBB@BCBE@BBFIKVX[_XIDCFFDEAEEHHDFGEGHIICFBFDEECCGFCBBAB@E>BB@B@BACA?BA—––•–˜—˜–———™š™š›˜———˜˜•––“’‘‘��’�Œ��ŽŠ’ŽŽŠŒŒ�Ž�‘’���Ž�‘��‹�ŒŠ�‰�ŒŒŠŠŠ‹ŒŽŒ��Ž�Œ��Œ�ŠŒ‘Œ‹‹�‹Š��Љ�Ž���Œ��Œ�‡|�„€oq|‚‡�}wpfZWTORLIGGFGC@EEBFCCEEDDECGGIR`mqwx{x|yxyz~|ƒ€�~{~|zzwwxxwzwxuspsmpnllnjgklmgeeehaffec_djePFFR_b[[]]ZY[ZWPKLNKKEHSXX[dbfbZSOLJRajqk`VVZRDJbx‡Šˆ‰‰……„~{yvnkgbcbbccfc_ba`b`^b`_[]^\^Z^^\[VZ\YXYUYTTWSC@:<;<:=;;:<:;<;==;Laprorwxrrliosssy|}|m]TKFEFKQ[[Y[WPT]jkoss{{y{xyv{zxvswywopqsz|we]^kocOA@HKKE>>>?=ABBBC@A@@>C>DA@?BAB??BBDB>CCBCBDBBADHMRWSLEFCFFDDEFGEFGDDDGLDFCCEBFBBBEDE@B@BAA=BACA?@BAB@AA’“”˜˜”–••––—™˜™™�™˜–›•˜•””��‘’“��“��������ŽŒ‹���‘�Ž‹��‘ŽŒŽŽ��Ž�Š��Œ�‹‹ŠŒ‹Šˆ‹Ž�����‘ŒŒ���ŒŽŒ��‰‡Š�Œ‹ŒŒŒ���…vllxuaX^ipmd_YSNOJIIJDHGKHBBD@BBHEJRVURQTZWWcq{{|x{}}zy{}}‚€‚~„‚|{zywzwxwuvutqsswqpmkhgfegfjhbbddgcebadmfOJQ[a`_[\a[WYUPMGELNGDMUXUWYdeh^[WSQXdlii]V[^QITrƒŒ‰‰‰‡€€€}ztuqjgjebc`cf`a_e_^_d^c`][\_\\[[[]YX\ZVZYXVVUIA=<=;:<<:;<<;<;=>:>?@@>@BABABBBA=?B><>?DDEC@B>>?@HLSQHGCDEEBEFDCDHGEFEFIGDDDCBGGBDDCCAB?@AC@B?AAC=@?@ABC•—•••—˜™–˜—›˜š˜™›˜›˜š——•—�••�’�‘��‹�”‘‘��‘����ŒŒŠ��‹ŽŽ‹‹‹��ŒŒŽ����ŒŒ�����‰Š�‰Š‹�ŒŒ��Ž���Ž�����ŠŒ��Љދ‹‰ƒw]X`bYPMQUUSOKIDKLIHCDD?CHFMIIMSQVW\fpmdgkikmrz|}|~~|€€~~€�~~�€~|{yzxxtvruurtquponnedddabbfb__b_^aaa_ek_MPZacb]_aaYVSROLJLQOHFIRUUUY^eegg`Y`ckiif`ehaOObŽ�ŽŠŠŠƒ‚}|ysqsilhgfadcdd_bb^^c]bc\]]^^_Z]ZXWZZZZWWYXXTJC<:<<<:;:<<:?<<><><>L^mjhjqwuslux€€€~€{vobXPMRW\kokf][TRS]fovxw{yyqw€€wmhjmnx~}~†‡…~od_[PF?@CD=@CA?>?CBA?@?@?@AA?@FFC>B?C@@=???;=?FFIHEGGECDFFFGFFFEFDFGHDDEEDDGCEBBAF@?@@B?DFAE?AA@ABA>–•““––——–˜˜•™™š™–—™š—–š”–“•�’��Ž��‹��‹�Ž��‹Ž‰’’Œ’‹Œ‘�ŒŒŒŠŒŒˆŒ‰ŽŒ�ŽŽ�‘ŒŽ���ŒŽŒŠŒ‡Š‹�‹‰Ž�Ž‹Ž���Ž��ŽŽŽ�Šˆ†uaQQVPKHKKJLGGCGHFFIDDGDAHEMVYX`efnrox{{tu{vqs{x~~ƒƒ~€ƒ‚�€}||zzy~zxzywxuyustprnoggikf_^d^a[`a^^\bZ_\]Y[adYJMWabfa]_a[UUVVROQUQLMNSUYXZgafiidaekqhlojkmbQVm†‘“���‡ˆƒ�|vrqpjghbfaddaebc`da_[`^\^^\\\]_][Y^Y]XW[VUVHF>;>;9>:;=:;::<9:=9<:DWifbdlklmsy}€~�|}yuvne]`]djruwpkc_Y_dnv|xvyyrjm|xofiopy}{{tw€~€s]QMMDDC>BCA??>>ACB?B@AC>?@@BB?C@>>D=@A><@@@@>A?A??>?C>>FBACBCCA=C>>•••“––––•—™™œ˜—˜˜š”—•›•˜•’•“““����Ž�������‹��Œ‘Ž‘ŠŽ�Ž��Š��‹‡‰Ž‡Š�ŒŒ‰�Œ���‘����ŒŒ‹Ž‹‹‰�‰Šˆ‹Œ‡‡�„…ˆ‡†…wqd\TMKIIGFGHGFDCDCACEFAGKKMQY]jmorsy{}{}‚zz|zvvxw€}{�€�„€€€z{wywwxxvvstwvuvrpnrnjf]^agb^Z`ZX[\a^c^^[^_[[Z[YQIGP]cac^``\YZZ\[ZRQOWX]]^_bkhhkiefakkooqpkplcV`zˆ�ŽŽŒ‰Š†�ƒ}xtsogfddbcddbaccced^e^^[a`_[][]_][\_[XZ[[VLC?9==>>::<7=;=:<:;;<;=CVee_bb\`mx|}{}}ypsuwrossuuw|}vuoplmtu{}xu{{q`fmsrfcmvvy||rtyoliYHCIAC?BB>@B@BA<@>??C>CA??@AA@BAB@>@B@@>>>AB>?A>?@AA@=B=>AACKLNLHDEGFEGFDGFEEGNGEFDEGCE@>BBB>@@>?B@B@?@A@@C@AA”“—••—–•–—™™š™™˜š—™——˜““””�’“•‘‘‘������‹�‘�Œ��‹‰ŒŒŒ��‹ŒŒ�����Œ��‹�‹ŠŒ‰ŒŒ�‹�Œ�‰�ŒŠ‹�Š„ƒ}�|{xjdkoolskh]VSNLJEGFEDCAA=A>@@AAGHJS[^_fiory{|z|}z{}}{€}~~|z~x|y||yy|~wywuxzyx{tqspusqvonoopigb_`ffcX[\WUX^b^eaZ[]a[]\ZPPIFPUada\\`^_`ca[XXOU\cgcchnkplomkecgmonieiih`Ykƒ�‘��Š�‡ƒ‚„|zyumiifcbbfba^baedc^aae`^a`]Z]\^Z]\^]ZY[[RFB>;<<:=;=:;;<@=?C@?>>AB@BAACCA@?=>?>???DDNNPMGCDGEHFDIDFEHHHDGEEHACB@D@@@@BA@C@C@B@@AAA@D@•—••–•–”˜•—™—�™š˜—™–™”•–”’‘�’�’����‘�‘��Ž�ŒŽŒ�Š‹‹‹Š‘Š‹�ŽŒŒ��‹Œ��ŽŽŒ��‹‹Š‰‰‡‰„„ƒ~zwtngg`bbb_VOKNRPNPMLGHJIDECDBEA?=A?@CDDIMP^^dnttvz}|€~|}{yzzyww~~~~z€ywyxtzxptuvvmpqvx{tyttpqrrrmiimjjegaagkgb]Y_UU\aceb_[W_c`abYQNOGNUZc[X[[_cceda^]TWaeffbefgjinkjeejkmb^`_Z]^czŒ�‘Ž�‡ˆ‚~€~yvsogfgcfbac`^bb``^c`d^`ba^\^\Y[ZYZ][\^ZTIC@<;=>;::?;8<:<:=<;:>9:DTbgea[PUf~‚‚z|{|yustty}}‚��„††„‚„‚||sfafkfXOOSRSNQS[^ZY]]`XMFGB@ABC>C>>A@>>B?AAB??>>>??B<>=B??BA@=>AELNTLFHBEGDEEFGIDGGHHJFEBBA?B@@@??>DCE?>@?C@D@>BBA••”–••–—•—š—™œš—˜š˜—˜——•””�’’“����ŽŽŽŒ’��‹”���‹‘�ŽŠ�‹ŒŒ‰‰‹‹ˆŒŒŒ�Ž���‹‹‰†~{wwqri__XYSKKPPMGMGDCBFDBCECBE?BDB?@?>A?@AEGTW[[[conswz{|~‚~~{}}wutywxt{vuuvwssrpsvsqjinmturrpvrnmrnmmhhjh_b_bcggb^]YV[^e^a_YVY[`ab`[SUUMJNY^^XUXZ_ebegfcadcd`^cb_^cedbbbgknn^YYVRVVh‚�‘�’Š�ˆ�……�zxvslgdgdedccecab``]_abb\_[__^[Y[[XY]Z_YSND:<;=;=;>;;=:<=:9;;;<=9=EP^e``XUMcx�}wyz~�yuvy||‚ƒ€„‰„€„~€€xvm`WWSWNHCFEJDCELLNLHIKQLBBDC?ABBB@>@?>>====>>?>>=A?>@<>><>BB@B??A@?BA@A@D?B?C?@@@CA>B>@EHKOPLHGEDEGHEHFJFEGGGJBACC@?>A?ABB?BBE?ACF>AABCCA––“•——˜—–›˜–™�™–œ–˜—›•–˜”‘””‘“���ŒŒŒŒŽŽŠ‹�Ž����Ž�Œ�ŽŠŒŒ�‰Ž‹‰�‰‡Œ‹Œˆ‰‚uk`\\XZ\RQGJIGDFHEBBA@@>???AB@@BA@BDEC@>BEGKRT_ijmrpswwz}w{z~||~||€{~}{{yyssvsrpnupqrropuuttlihnnnkknqrjjmmlnhggdd[^^X`a]]WVU^__WXRPUZ_ba__[TZ[UMRZ\\QPR[^acfijhegdda][][XZYZYX[cfoi^[VRRMWi�Œ’���Œˆˆ„…ƒ|zwpnhagdd^cddbeacb___^b]]]`][\\]Y\]^Z[YQC<:=:8==9><::=99:<7::=9:=?JVW\[WQUauzyqqqz�€{t{|‚…�}~woimjie_ZUPLJECB@<@B>>>>D@D@BB@FAAB?=>@AA<==?=><=<:<>>@>=>A>A@>?>@=B@A@AAA=AC??A>@A>>>BBBA=?@GDMMNKNKKIGEIGEEIGEFFGFC@AE>CA;?@C>A@AD@A@B@?BE@BA–—“•˜”–––—˜˜œš™˜˜˜—™—–”“–‘‘’“’�•Œ��‹�ŽŒ‹Š�‰Œ‹�Œ����ŒŽ‹Œ‹‡ˆŠˆŒ‹Š‰†{uoic\RNMLMSVVRNHBDFADEB>>>;<@CBDEDD@CIMNPQOLMTXY_gkswyv|z�|xy~x||ywy{xwz|zutwwxsomrpppimosqsprsiijiacinonfbejdggb_b]][XY]X[VQUX`\PMKIJU^c`ZTTTSU^ZYSZZUPSY_``eknhjedjg^YW_WYUSQSWX[_hbZUVVKNXr‹�‘ŒŠŠˆˆ†‚†~{xuljeeg^`bd^bda_``aab^`^^_a[\][][^a]ZUI@:==8<8<>=;;7<=8;;;9:8:;;?CNUWRSVU_uxnceoz{vszv~~ƒ~vn_UTRQPONFDFBAB>?<>><<<=A@?@ABBA<@=>>@=>:??;=;;;<<>;=>>=>@;?@>?A@??=??>??BC;A@AB@A;??@?A?@@?=BEHIINJQRRMHGIEEGFDFECBDDDC@A>C?C@?>ABAAAC@AB>BCEBC•”–•’š˜––š——š™š˜˜›˜˜–““–‘�‘•��”����Œ��������‹ŒŠŒˆŠ‹ŠŠ‰‰~qv|x{~|}naXVVXUQSQQNU\`[NHCBC?@BD?C>DBELOUUSLNNY[akhb^ajjjkrwvxysly{‚‚|{z{z{vwwwtpuvwptuxvxuuqupskimlnqkqrnliig\ankrmh__]]^\UVV\^a[^Z`XTRRRYQJDGKNUdfbRMNPQQ]e^YZZXU\^bbckmhglhlkh_[[\[VTNOPVV[]b\VSSPMJ[x‹“‘�Œˆ‰†‡‚‚~{xxqmhfedbaa_`ababb_a_ed`a_`^_]]]^^[^]TN>@=::;9;:<;:<9>6<:=:<;8::<>BJONPPVZ\diaZbpuxwwvwtuwznaRIBEAB?EB?>?A>??>=A;?A;=??>>=?;@;:?<;=>=???DA@@BB@@?AAB?@CE?AC@@@A@?C>B?CCC@’•“––——™––˜™–˜—™™š˜˜—•–“•�‘�’�‘�Œ�����‹��Ž�Œ��‰†‚~wxu`[]Y^ahfg`TLMR]^[^]YNRZ[TFDDCBEEGHKOONSXYbjhhabbhlqwrpqpxxry|yuwpifrw}}yyuzwz{y|yqqrsprssquvvvotvprppqqlkptplijeaelqmiie_a_^YRTY]_gceehbaVSSRKHFILS]cf^POSXYUakhcc^_adddcfhhedgfjpg\W\]]YNIJQQ[][XTQORJEJ[{‹”•�‘�‹ˆ‡„€}{wwoljgedbbd`dbb``c`b_e`_aaa`c]_[\\_[YKD=:?=:9:;:;?:9:=9;9=7=;7;;;9ELPPPSZWUSYSVbszuxzvohckhXJG@>>A?;A?;;?=>>>><=;@>>=>=A><>@=@=><=??=:=>@@C>>?A?B?@AABBC?ECCC>@@D?D>?=EB?=?=@??C?>>?BA@DCGEKMU[ZPFGD@FEECBGDGGCCBB@CB@AA@?BCB@B??A?B?CB>•‘—”—”••—˜™š——™™•𙕙–•“”“”‘Ž‘‘ŒŒŒ�Œ��Œ���ŒŒŠ…xlfcd_^]XNJFFGMNOXWMGGPW[^\]TNMQMLGDGIIQTV^dkfikqpx}~yytuxz{zvrsx{~wx{yy{rnkqw||yvosvvxw{yxzusvvuusnvssuppqstuprojlnsrkgfgciomingdfghcXPSY_emmogfekhWOVTMGU[X_eebZZZddacqqollkmhghfc__Z]]bonh\V[X[WIEGLRWXTRKIIFHBJ\zŒ—‘‘���‹ˆ†‚~z{somcebfccececdabacbe^d^\__ca`\`_Z\[KE?<=A=;;8=;<::=9:;<9=9:A:;9;>DVVYXaaYMLNMOdmmjnrqf[WVNI???B<>=>>A<>>=?;>=>?A?>=?=??<@=@@>@>>@C@B@=9@?A>??>AA@ADA@CABAABBB;@@@A@C?>D?@?>?@>>@@B>@@@AAABB@@?BA??’—”—”•––———˜™›™˜›™™—•–”•””’“�’މˆ‰ŒˆŒŠ‰‰�„„„|i[PKONINNHIEDCEDEEMMI@FHRPPXSRKNQVTTRVZ\cfllsutx|z~€„†‚���‚~~srqz|yyzyz{wtwwyz||mmorwyuuwx{vtu{vysmnponppnmuikkibgluqe_^cfkoc`d\bjpmdVOTV_ivoj_citiYU_ZXSbcb^aehidhknnptxtsmnmkgidZWRUUX_ghcXTQUUNGEFIMUVQGE@GHJGM`|��ŽŽ‰�‹Œ‡„‡{yzslfbbaeedcfbf`acfda__[]]^`^`^]]`^UH><:=;;:<:=;:;;==:;;<5:;;9;;<=L\g`aip[GFKJJUZVTZb`VMINJEA=@??>?>?=;??>A@@=@>>;>>A@@ECC?@A@BBA=BCDCBCCCCCCC>C???A>@@A>C@ABB@B>?@@@=C>AB=A@@?CAC@CA’’–—˜•”––™••˜™—š™—–—–•••‘“�“‰ˆ€quz~}}z|tnli\SHGGGFFCEFCBACECCDDBBIJQYTNNQR[]cfhiknrsvzzz}|€€„„‚††ƒ„…‚yyww{}}|xxoqvzzz|xumnszxvxzvvvwsvwsnimkmnokfha__`aX^gkk[UY`ikcZ[ZWclmocUOVZfnys_X_lpm`add[emha_ekpqtuuwvxuvsqidfffc\SNORQNYed\QKFJLEFIFIIMSLHBFNRQVXk„�‘“‹‹�Ї……‚z{wpnefadbae`bcb]_bdccd__^^]]_][^[\VH?<;<=:;<99;;<>;7==::;8;<=8:::@LgqjijjVKNJHGKKFAJNLICBGDE=?@B>>;<=<=?<:>;?==>=>C@>?@>>=@==@D>A@AE@@DG?AB?AAAB@@CD@AAAB????@B?B?>@>A?A>?C?@@@A@=BAA@AC?A”•–”—˜”™•–›•˜˜™–™™—’’‘ŒŒ…‡„zul^U]c^_cca_ZSTPKKFDHEDBBB?B>;@CBAAACOR]dke_[]aintqzz||~€|‚€„ƒƒ‚‚‚ƒ‚‚ƒ‚�‚†}}~{|~z{uojqyy{y{}|zoqnw}zzxwutuvsusmgdfekmmc_aXSXZ]VZfg_TWY]dg\[VZ[dfmpiWR]dkusjUR_jqnnmgbakjd`ehpv{|zyvzsumolbc``]^YPHNNMOQ`WRKGCBEEHHGJHPSTPOTZacd_o…‘”•��ŠŠˆ…ƒ€||{uvigdeecfe_bb_``ab`aaab^^^^`^`Z^XK?=?;:<;>::?9=:;;:8;<9;;><=8;;:CVkrf__^NMHNIGCB??@AE??@CGAA?C??<<=<=><<===?;<@@@==A=@<@>B<>><@=;@>A?@>CDAEFCEA?ADD?CCCC?@???A>BDBC??>?@@@=B?CB>A?AD>>???AA?DAJHJOTPRNLDGGCGIFDFAADBEBBD@?DE@BA??A>@;?BB>•’”“”––———™“šš”™–�‹ƒtvoklicYXOJHJLGIMGKLDCDADCEFHAB@??;=?BCFBBDIQZeoww~vqoz{|~‚€‚‚„€}{‚€„~�‚‚ƒŠƒ€€‚ƒƒ~|�{{||~}yokqqssvxzxusppsvzzzuzywwutsnkeeeeff^XYZVLS\[]_^[WVWW^_dcggb^_ainfWZ^gpvh\RPZfntzofbeiebdhqx~|wxmmmmghfdcaZZVVRLHKMKKMRPSMGBGDEGHHKSX]c`biikmkjs„“•’�‹Ž�ŠŠ„ƒ~{vrpmggccbhcbfbb^_c__d^_b^]^_`_[^VN@<=;<<<=?9=>9:==?99::;::<:;?9<:BQjm^WRQOHNNNHD<@?=>@A?=BB@B>BA>>=;>=>;:==?><;>?>=>>>=>@@>@@==A=@:?>>@=A=@@BDFIGDD@C>BBDDDDCD?CBC>BADA?B@A>@=<@>ACB@B@?@;==A:AA>>BCDIGJKPZ__SKGCDHHHDEEEF@DAAHABBA@CB=B??>>B??B““”•“—•“—————˜•’ƒvm`X[STTTPMJHEGGFDDFCD@BD@BCCDDD>A@=ABDFLOOIOQTaovw‚ƒ‚„€‚�ƒ„‚ƒ„……„�|z~~ƒw~€‚„ˆ†…‚‚�ƒ€ƒxx{{zvpiiosquv{utojousvtwsstzxwtppmgeggb_[VUVZRIT`c^_`[UZ[`^ghiknj_YW`e\SX[eipjbZUZfp|{scfiopkit{xxqib^bd`ccc^^[RSLPJGHFCFJORX[RORHGGIIU[emmprquqmrnu†Ž�����ŒŽ‰„„~~ztqjhdefbebciedbbb_`^^_`[]a_[Z^VRE?=:=;=;<;=<:=<<<8<:;;6<;<;;==:=APbfVSOOIJLPMHEA=>@B?BAC?B>>A@?@====>==;<>>9>;?==?==@@@;@AA===:?=?C>@ACBB??@@A?@AC>@@==?=@?A?@BEDFDIK]eh\PICDJGFEEAFECEEBDBAC?BDB?@AE?BBCBB•’”•—’•˜•š™›–—ˆyfYPJJKINLLIHIHEDFDEIKKJIGLNLFAA@?@@BFLSWY]bffchms||}…ˆ�…„………ˆ‚…„ˆ…ƒ…‚~€|zw„€�ƒ€‚‚€�‚…‚ƒ€}zzysqkfgsyusvvopmorvwvspilptrojbggdgff[TQLSZZNJQ__Y`^\Zaablmspqus^SSSUORZ_gonqsphdiou|zlmqy|zux�xjdbYVZ^_`\ZWXROILLIDBGBEJOX\abcg^XTUYcnsvz|wuspsspx‰‘‘Ž�‹�‹�‰„��~{uolhgcfdbcddcccd^dcab]\_^]aZ\YND><>>;===>8:=:>;==9:;:<==8;=7:><:=L[_TNPNLLNPLKIA>>??BABC@A>A?B?>>=>?==<@>>>=;?>>><>=>@>>?B=?<><==:?CCC@DFEBGJIGCE?HCBCGGFDGBB@E@ABB>DBA@CDB@@?@B@@ACA@@A>>@AB?AACBBFCDDDKP`hc^TIFFEFDDEDCEHEGDDCDBCCD?CA>CC@BEE”•“”–”™”–—š—–‡m\SKLIGGJIHKHDDCDCDKIU^`^ZY\`bUKGBDDFLU_fhlqt|wz{}€„…†………„‚„……‚€……„…†…„„�‚‚}|{yƒ|{ƒ{€‚ƒ€„„~|~wqqnnnuzwtrrmqnnsuyuqkmomnlgZX_b`bebVLKMTXYNOV\[[``_]ccgswxuw{sc[XOPNVallkmu{}|uux|}{vryzxxvz{sjba]VQU_^VSTRMJJKKLIDDEDFKP^ckmptsmcimt|~~€~vvruuvtŒ—”“ŽŒŒŠˆ†„ƒ~{xtkmehgfag`aaecbab_bbc]_a`_\^[QG??;;;?;>>9==KRUTOKJOIMLIOJC>CB@BCBDDA>??@@B@;A7><<>=A==?>=?>=>>=>@?>>@?@>BBEADFDFFHIKFAGABFHDFHGADABBGBCBA>@>@B@AAA?C?AADBBC>@BC@DD@DCCGCECF@DGJU_bebRIFCEEDBCEFCGBCCCFECHHEDB<@D@CEC“”•”“——™—˜””ˆkTNOJJGHHKGGEEAB?FCKR^gqwxtsqwwoe^TRVX[kowzz|€‚‚„†ƒˆŠ„ˆˆ‡…ˆ‚ƒ„ƒ�ƒ‚��„ƒ…„ƒ~{x�…~~€y||||€~‚€~{yswuyz{zzvvntnnmkospkfjmkkf`XZ[]^ajcUGLVUWVTPY^_^^]a`bejw||{{~tld`[YV`lysmnu~€�{~‚‚zqkmpjmrig`Z_YVOQXXQKFHCGEIHHHFFILIP[corx|}xw~„„ƒƒ{~vvvxssƒŽ•—“’�‹‹‰‡�{{usmiheedfeeebae`a_a___b_``c^[SHB;<;>9>;=>>;;;B9=;;9977:;;;<<=<;:;=BC<>==@<<9?>?=?>=><>A<=;??>?=>>><@@ECDECFBDBFLJGGCDBCDEEFECBABACCDBC>B@?@?CD@AB@D@EECCAB?CABCDCDCEFFGB@DFBEMU]ge[UNI@@ACCDCDDBDACDGDIMHDDBBBCFDE••“——˜–˜˜‘‹�qYOQMMHJHFEFJBBEHCHMXckz}}‚‚~�ƒ€‚}rjimkqy}‚ƒƒ‚ƒ„�…ƒ†‰‡†‡‹‡‡Š††……ƒƒ…„ƒƒƒ|�„„�|xx{���€}„‚{{|}}~{}~|w{zxz{~z~wunsrnnfikgcafhmi_YY[]`bii`QLQVWTQSSW]b]abbeefiqu|||yqkmheddgw}{wrw€€|€}ud`ccace_[WUVSLKLSQLIDEEEHIJHKMPQVX`eo{z}‚…‚‚‚�~‚‚�ƒƒƒ‚{x|z|„Ž””’��‘��†…‚}|wsnggbdhbbfccbbb`^abbaa__`]\WK??9?8;<:;:;;::?GQSLLHMMGBCFJMFA@EEIHFEA?@?>>AA?@;?=?::@;?>?>><;<=>>=?>>?@BBBEDHCCEC?BBIHFCBDCEEBFFCDDBBBD@BEDBA=A?@FFAC@DCCADDBDB>GAABEECBFDCCFAAECCDKV_c`[OGCEDEFDFEECB@CGDHHIGFFECHFGGH—“”––—•”�qi`OQPVKJHIIBDGJKRPQZans‚‡ƒ…„‡…‚……�}||€„…†ˆˆ‰…‚‚‡††††„„‹†ˆ†Œ…‡‰…‰„…†‡‚‚�‚€~{vvt}|€�}„†�~�}}{{|zy|zwtuxuvvqqppongiid]]achg`VTU^bmnf^WPX\\UOROQVX_efigkmoprwzukgnnkkkkt~�„~�‚|}}‚rl]VX^^]X[YQQLPKIDKMNMHFGLKORWXWYaghlot|‚„ƒ…‰‡‡„…ƒ}}}„„‚‚ƒ…†…��‘ŽŽŽ‹ŽŽ‰‡„„€{zuokcffecahcccacb`eccc_][`ZQHAA?:A=;><:>;<;=:;:;=:;;<9::<;7:=;=;:;LV]ZNNLNEBCFMJD>BHDJEHIAB@@>??=>>==@>?@?>?:>===:>=><@>@A?A@CFCCDFDCBCAEFHFFADAACDFFDDBCEACDBD?B@?>>DBCDDABECCFCCE>BCDDDGG@CGCGDDFCDDFBENX[\\UMEDDBCEDFBC?D@DGGIFGEGCCDHHJH�”——“•�ˆvkc^TSSX`XYYUNIKOQZcfgpr}€‡ˆ†Š††‡†ˆ†„‚€€ƒƒˆˆ‰ˆŠ‡Š‹‡„‰…ˆˆ††…ˆ………‡‡…††…†‰…‡ˆ‡ƒƒ€uoq{z~{{{�„|„€|~|€|z{yvwnmghstqnrwqhdgfd``X_fjaXSV_ekndf^]dcdZ[VUSNWagffgjqxs{|vpdclspspow€…‡‡‡Š‡††€�{sdZQRUXWWRUUQNGJHEDJMNOMJNR[]`ffhjpqu|z�‚„„„‡ˆ‹Š‰ˆ…‚{}{€}ƒ††��Œ�••–���ŠŠˆ‚†‚‚zuuniggecccb_cdd]bba`bd_[_\TED@===<>@;<>;>;9>;9;<8::<9:=8?<9>;<=;;?K\me_WROGCCGGJB@ADEHFFGFC=>>@@<@?<@>=;==;<=??ABB@CGGCBBCD@DFHCDHFCC@DCCB@CCCCDBDFCDBBB@>>@BCBBCDEGCADBFC@DBDDEGECCCCGBBFAFGCCDHPVX\WONHGEG?DEBCDFEGGGGGGCCCFDEFHI’–––‘€ymga^WUWYfovsukcY\belyz{‚ƒ‡…‰ŠŠŒ„…�†Š‡…�€~‚ˆ„„‰Š‰‡ˆ……‰ŒŠ‰‰Š…†ƒƒ‡ƒƒ‡ƒ�„††…†††…„‚ƒvssrwwz|‚{vy€€|~|~~~{}{vpe_dwwwuyvl]_dfjd^Z\`ng^^bifjjfhkqrnhjpgaZW]bljidmuy{~~yolmu|||z{}}ˆ…Šˆ‹‹‹Š†€neYPLPRSQLMNOKKICEGGMRPRTSV`fkppuw|„…†‡ˆ†ˆ‡‰……�‰‰Š†„�|z{„ˆ��Ž��‘˜•–‘��‹ˆ„�‚|yvqmkifhdfddb`fcabbb_e`_aZSIB>=:><<>9=>;?9::>:;9:<:9=8;<<;;:9<:;9;@KgwwmeaXOJEDKIAADBDDEAFFC>>B@A@C??>;;;>>@@>@CBB>?><<=:<>;>FBB?D?@A@CBBBABA?>E@CDEBBCBADDBACCCCEGED@ADBDBCEE?D?BCDLNRXXTROHCEECDDEHEJJGLHKHADGEDHFFI”“—”‡kf`_\XSW^ku‹‡‡‚{ssvx}†…‡‡‰‰†ˆŒŒŠ†ˆ‰‹Œ‰Š†„†€ƒ†ˆ…‡†„‡†…ƒŠŠ‡‰Œ‰†‡Š……‰ƒ‰‡…€‚„‡‚‡„ƒƒ}‚„{wpqqu|{{zwtyyy|{}{x||{~z|xnfm||z|wlbZbgkgfeb]cpmkkppmlddhpuuomqwtnjihntqkmms{~€|xxuz†‡…�…‚…ˆ‡†…�Šƒˆ~ka[RIMOLQIKJONLJJJHKMTYYZ_`eipv{|x€€‚‡‹‰‹Ž‰Š‡‰………ˆ‡ˆ‹Œ…‚†ƒ}�ŠŒ��Ž���––””‘ŽŽ‹‡†~�ztpnjgdigdgfggddba^`bc``YRHC>>@==?@ABABDBA?>::@=;>C@B@C@><>>;<<;>CFCGFBJBBA>AFDE?>BC>CBCDDABBCFGCDDCCAB>EABFBCAFFEHABBDACD?CEBBBBCFHLLOPRSSGGBDFDGKUXQOKKIGGDGFFIKHJM–”’Œsb]]Y[\Was}„Œ�‘“ŽŠˆƒˆˆ‰‹ŒŠ�‘ˆŠŠŠ‰Šˆ‡ˆ�‰Š†††‡‰„†‹ˆ‰„††‰…„†††ˆ†ˆŠŠ††ƒˆˆ‰Šˆ„ƒ‡„…„ƒ�~||€~€xsnkw{€|vwyy|{~zsyw}|{|zzyrz}„~{shbflswlntohlt{ssywvka]`lnsorw{{wwwzz||vrwz€|‚‚�|y€‰‰‰ˆ��…ˆˆ‰Š‹ˆ‡~iVUOJKGKJOLKPMOOMNRMW[]cejqqtw‚€~€‡‹Œ‹‰ˆˆ‰ˆ†Œ†‡Š„€„€~…‡Š�‘’”’��’Ž‘‘’‘�‘��‰Š�‚|vsqheggfdffefebcdbabb`[SI??>=<<>;<=:<<=>99:9=8<==99<8<<:;:;:;<<=?@FDBEBCFC=><=A;@A@BEB@>@A==@@:>?C?ACB??=@@AFGGCBBDDGCFBA>AB>CAF?AD@ADFFFECCEFCGEDFD?BC@DBBECBDBFBDADACB@CDDCFDFAGEHIHLPOMIFEDFGR]dg`[ROKKEEHFJJNPQP�‰…|i_]YY[aag�Œ•“•“���Œ�‹Ž‘����‹Ž�Š‹ŒŠˆˆ‰…ˆ‡††ˆ…‚†‡‡‹‹†Šˆ‰ˆ‡‹‡Š‡‡‡‡„†ƒ€‚ƒ…‡†ˆ……†�‡ƒ�}~ƒ€|{romyy~}yxx|}}~vvy}z}{|xy|{�~‚ƒ{rpkr{�yw{ywt|}tttxxse[]gkllrz|{x{|~{~‚}}�‚…ƒ‚†€…‰Š‡Žˆ‰ŠŒŒŽ�Š‚pWMPKJDFKJNJMQXWTTY\beekmqxz|�ˆƒˆ†…€€†‰���…‹„…„‡‹Š„€uqpx~‡‰Œ‘�‘••’–�”‘“���Ž‰ŠŠ†���yvplffjefffcdfcfedadb`RFC?=====;><<:<>=;:==7=>=:<8:<<<:<;:;8=<::;BFKR]cjt{uok_]Y[VOJEDBFBE@CB@DBBGCFCF@?;>@A>@D@BDA>A@A>>>?BB?DACA@=?>?AGCEFCCCEE@DAB>@AB@D?DACDFEIDICCBFFAFFGDE?B@?FAEEC?CBEF@D@EB?ACBAE@EBFCGCHFHRQQLIHEHLYfrnlbVTMMJHKMJSSURR‡wokg]X\`cpu{Š“”—•˜“”“��ŽŽ�Œ�������Œ‹Œˆ‹Œ‹ˆŠˆƒ…†…�ƒ†ƒŠŠ‰‰‰‡„‰Š‰ŠŠ„ŠŠ†‡€~~~€„„…ƒ…ƒ†‚†‚€~„€�|zwyyyywstv|€yzx|{}€‚€~z|~ƒ€‚‚}wvzz}†��‚�„ƒ€€zvnqvwukcfhilkqz|y|~€z€ƒ‚€€„‹‡†‰‡‰‚ƒ…„ˆŒŠˆ‰�Љ�‰‹†x]MHIFFGHKNQPOT]^ahiputwxz|ƒ†ƒƒ‡‰‰ˆ‰Š‰ˆˆˆˆƒ~……†~�~��ƒxljqz…ˆ��‘�’”�”�”˜”—•’�ŒŒ‡‡„…€zvqkdihfbhfccccdcccc_RHB@>;?;=9>:<<<=;;<====8==:;9;;9;<;:;>:<=9<:BGEBDKY\hjonnikni`UGCCDDBC?ACGDD?GECAB>?@@DBACBAGCAA@B@>AAEC@FCB?B@?E?BEEECIJEIGCD@DE@DADBCABBCCCEDDACDB@CBAADA@D??@CABDFEDEGOVZ[YTONMR^msolc[_WWUPQTR[Y\YPtkge_a]^hr„‡‡�––—–””““•‘‘’�‹���Ž��‹‹‹‹ŠŒŒŒ‰‹‡‡††„†ƒƒˆŠ…†ˆˆ…ˆ‹Š‰‹‹‰‰„ˆ†…‚€€�€��~|„…�ƒƒ‚€ƒ{‚}~~~xussw{|xxxw|�‚‚……�€�ƒƒ†„‚‚~xw{x~€€‚†…Š…}}|zxwx|}tpgnptnuz€‚�}ƒ„„‚†ƒ€ƒ„‡ˆˆŠŠŠŠ†…ˆ�ˆ‰‹‡Œˆ…Ї†wcPGHHIFJKPTTVXYbgmmsz}~{„‰††ˆƒ„†‚„„Œ‹Œ‹��ˆ†‡„�€ypv|~{qru„�‘•“ŽŽ��Ž‘’�•—–”‘”‘ŒˆŠ„�€{wumgciheghafcfc`abc^RGA===>:>=@=;=;=8=::<<<9====<7;::;<<88>=<=:;;EMF??@FIPZ_hfpv{ypeUKCDD?BBDEEFEBCGEBA?>@@C>ABBBDBDCCC@ACDCBDEFBBB@B@FEGHHEEABB@F@CCB>ECDBFFFJGIJGJFEABGBCB@CBBDCAFGEEECBA@BDD@@DB?CB>E@@CCCFCEGJW_hhkda[]Xamojdaa]`^_[ZU]_`_ZSmcb_efovw…�’•”—••––””’“—�ŽŽŒ‰‹�ŠŽŠŒŠŒŠŠ‡‹‰‹ˆ‡‡Žˆ‚‡ˆˆ‰‡…‡ˆ‡‡…‰„‡‹ˆˆˆ‡ƒ‰ˆŠ…ƒ„�‚€|ˆ€~ƒ‚}}€~|~ƒˆƒ€zv|z}|ywvsy|‚�‚ƒ�}�‚„‡………‚ƒ||y{xyzƒˆˆ�wx||���‚‡~{z{|{z~€�…‡‡ˆ‡‡ˆˆ‡††‡†ˆ‰Œ‰‰ˆˆ€‚Š�‹‰ŠŠ‡ˆˆƒtXQMEEDFIKLPYbffkmsw|�„~w‚‡�‹‹‰‰ƒƒz~†Œ‹Ž‰‹ŒŠŠ‰‰†‡|ppzƒ~‚ˆ�—’““•“�ŽŽ’’”’”–�’‘��‰…‡~|vsnhgghhffffffd`cd_SCD<=?=>;;<>;:?;;;<=<9<<<==;;=>=>7<889;<:=;:<@ELFB>AA=GIJQZgr|€{n_XUMFCHFIHGDD@EAD>?D>@A?@DA@B?DAAADAAEGBDGGGGCBCFDFGJGHHICA?FECBBCCHIIGJGHHHGHFFEGCEECABBBFAAGABDEBEBCCBBBAABC?B?DABBBA?BFCGITblquvuronjjqnhdddbc]][]]]baZYSi`^]aq…Œ‘“–•—˜——––‘“““‘��ŠŠ‰�ŽŽŽŒŒˆˆ�І‡Š‰†ˆ‡‡…ˆˆ‹ˆŒ‡ŠŠŒ‰ˆ†‰††‡„„ƒ…ƒ†‰†…Šƒ„…†‚‚……ƒ€~~}|}‚ƒ„��~~~~{}{zwz|€~y|�|€„‰…†„…zv{{z~ƒƒ‚|mqw}ƒ………†‡ƒ…‚ƒ‚��†‚‰‹„ˆŠ‰ˆ‹‹‹ŒŠˆ�‡ŒŠ……€w{„‰Œˆ„ˆ‰ˆ‡z[OLGCCDEHLMP]hqwwx‚��„„|zz‚‡��‹Š‹ˆˆ‚„‡……‡……‡ˆ‰†ŠˆŠ…~|ƒ…„ƒ€€~‚Ž”””•–’”’•‘’“““����Œ‹††‚~{sqiikgedddgefedg\OI?==<>9=;<:==>=:;<;<<9=<:<9:8;<;<;:9::;;::;9;>HJFC?>B@CBCGGXcpy}wige\SROSXUNIICEFECBAD@CCC@A>B?@=BBCC@FCDEBGACBDEEFHIIFDIFGDADECCCCDKIJEIHJGHEDCFDDCGACE@CACC?B@EBEC@CCEC@AAACCCGQ\gqvx|€|uxusvqinigb]VXW\Y[X\XTUlb_ciz�“‘””™š•–˜™™™”””“��ˆ‹‰ˆŒ����ŒŒ‰‹‡‹ˆ‰†ˆ‡†„†‡‡ŠŠ‡‰‰‰Œ‰…‰Š‰ˆ……†…„„‡†…ˆƒ„‰‰……†††…ƒ�ƒ~~{}~~ƒ„„‚‚~�{|x~{zy|€{|szzy|‚„ƒ‚‡†�|yu}~�‚†ˆ�zunu|€‚‚~‚…‡…ƒˆ……ˆ††ˆ‹ŠˆŠˆ‹�Œ�����Œˆ‚{xyƒˆ…€{€‡…~eLLKFDDBDIMMY\mz~€€‡ˆ†„€||x€ƒ†‰ˆ‡ˆˆŠ‰ˆŠ…|z~}�„„„„‰‡‡……‰†…ƒ}py‚‰‘“’””–“““”““’‘��‹ŒŠˆ‡„|yrmighfecfddfbd[PF?<@>:9<9>89;9;;98:@HGE@AAABBCB@@KOapyuprukddfikkd]USQLHG@@BBBDBAD?@AA?C>B@B@EEBDCBABDCCCDEBDAEGHC@CEAEEEDGHFGGFHHDFCDDDBDDDABB?B@@C?AA?FA?=B@?@B>@B>@A@ACB@DDBFFDKP]gr{z€�€~~}yuuusokf`VTZZXZTUTNOmkgnvƒ“—•“—––•———š—””•’‘ŒŒŠ…†‰�Š�މ‹Š�Œ‰Œˆ‰‰†ˆ†††ˆ‰†Š‰†‡‰††Œ‰…ˆˆˆŠ‰ˆ†ˆˆ…„…„ˆ…„‚‡‚‚……„�ƒ{{€„~ƒ…‡ƒ‚ƒƒ{zx}|xuy||}w{y{z|€�€�‚‚xvxy�‡�‚†‡†�}wxx{{~vv‚„…‚‡………ІЉЋ†ˆˆŠ†‰�Œ��ŒŽŠƒ||‰ˆƒ|zuiYKHHBDFGHMVX]kq{�‚……„�|z}{|‚‚‚‡…‚‡‹ˆŠ‰†zrw|||{z}}†ˆ‹„ˆˆ†††|ro{‚ˆŽ‘“Ž�“�”””–”“‘�ŽŠŠ…ƒ€‚{yvnjhkegfhdddcZMEA=?=<>8=:;=8<=;;==8;;8<8;;:9=?999<B@A?>AAB>?A?AABBABD?BBB@FBCCD@BBD@C@ECBDDEEDGDADDCDCEDDADEE>D@@B@@@B?DACA@=A>C?@>@?A@=CBCCBFHOOLJLQZjs|€ƒƒ‚€~wvusupnl_]Y`fc]TSOPLpmkt��—˜™—”˜–”™–˜˜–•“••”���Š‰ŠŠŠ‹‹…ˆˆŒ‰�‰‰ŠŠ‰ˆŠ‡‰‹‰‰‰‰‡†…†ƒˆ†…‰‹‡‹‡ˆ‡ƒ…‡ˆ‰ƒ†ˆˆ†„ƒ„‡ƒ„€{{�‚�‰ˆ‰††�~�{z|zusrnkpptuy~|‚ƒ�}}ypnszz‚}€…‰‰…x}{{w}|vq{‚��}‚€‚‡‹‹Œˆ‡†‡„‚††ˆ‰Œ‹‰€‚ƒ�‡‹ŠŠ�wg_\SGGDECFGPU\goz~„��…�vsw{~~€…„†ˆ……ƒƒ†‹‰‚zrxsolqus„‚††„‚‚„�zrqsw�‹�‘��Œ”��’’””‘’�Ž‹†‚‚~~tuqohffifhii_XLAB@>@=?==><=;;:::;<7==<;;<:::;:::<=896:<;<;9:<:>@DFAAC@@@@?@D=@ETjw}||ztusy�|{wyqqng`XSSNJIDAE@B@B?A??>B@@A=?B@?BBC>EAA?@A??DBCBABGADBD@@BCABFDBFBCBAA>@@@=AABBBB?@=>A>>?>?>AACBDBHNR^[WSVV]muz|�…ƒ†�ƒxwwtqspijagnooc^XSURuqeoƒ•˜––”™•™———••—“’‘–‘��’ŒŠ�Œ‰�Œˆ…‹‡‡‹Š…Šˆˆ‡ˆˆ‹ŠŠ‰ˆ‡‡ˆ……‰†‚‡‰…„†ˆ„€‚ƒƒ…†Š‹‰ˆ‰‰„†‰ƒ„†‚~‚�„…††‡……�~}xmf_[[Xaclpsz{{{ysjbis}‚�}…ˆ…†€{�{zz}{vv{~�~{{z�†…ˆƒ}~||ƒ‚‚‡……„z|�ƒ‡‹‰‡‚hUQYSIGAEEHKP[iv€„…‚~€zux}}�†ˆ‰‹Žˆ‰‡‡‰„‡…|zwpdgoquz€�€ˆ€|xtvrrwŠ‘”‘����Ž��‘“Ž�Ž�ˆ†‡�}ztqmhgdilhjbTMB??A@>;?;;<<=<><9=<:<<9==::=;:=8<:<;;=98;9<89<9:>ACC??@@A@>A?A>=FVl|~�~��€{zx{}z|x{xxzztmjjc[XQSMKIHDDAB>@@@@@@A@>>@>@>ABAC@E@?AAC?@>B??DH@DCACB>DB>AAECC@@@A?@==@>@AAA@>>=?>>?@CBDCCHLQaekf^a]bivwy~‚†…�~|vwupkkjnovqie`^a_€wei•—•˜•”™•—˜˜•–”’�‘“ŽŒ���ŒŒŽ�ŠŠˆ‹‹‡‡ˆ‰†ˆ†ˆˆ‡†‹‰…†Š‰Š‹‰ˆ…†…„ˆƒ†††„…�}ƒ�‡�‰ˆ‰ˆ‰ˆŒ‡ŠŠ…‚‚ƒ€}€�…€ƒƒƒxmeUNNMMOT\_hkggg`^SWbsz}|€z‚ƒƒ…}||zy{{|rt|~|}€|zz‚‚~ttqsr|z}�„‚�~zxuz€„‡†jTHOTMHHCEFLLVar}…ˆ€zrtx…�|y|~„†Šˆ†Š‡ŒŠˆ‰‹‡‚|uqhbgrovyuy|��ƒz~ssxzwqgp‰Œ‘�‘�����Ž��Œ���‰„‚~ywunkkkimjaWGCC??<;>?:::;<;:;;<9==;8;;<8=88:::;;=:;;<;:;::7:8;A>>BObq|€}€‚‚~z{}}w|w{}�|~||xtpmhd]^TTND>CA@A@B@BA=AB<@A>@CAC?AA?@B==BA@ABEB>A?ACBAB?@B@@B@@???B@@A>?B=?=A<@?;A<>>::;;><:;;9::>;:9;<::::88<8;9;89::<<::9;9:<>>;?A@<=?B@@FMZiz€{||�}€~��}€x€|ƒ�~~|{vqlkh^SFGIGED@>@@A>C@??A@@@BAAA@>ACE>BAA@>A>>>B>>??@@@A@A?B;<:==@>?BDHJKNHKIMT]ekgbgfklsuwwz}‚|}{y}x|{ywpspnhb____^f‹‰}€Œ’˜—”˜™˜‘—••���Š�’�ŒŠ‹‰‹‰‹‹‹Š†…Šˆ‰ŠŒ…„‹Œ‡‹Œ‰‰‰ˆ…„……†…�~‚ƒ‡†ˆ‰Š†Šˆˆ„†‚‚†ƒ‚„‡‡‡„‹ˆ‰‰Š†ƒ„‡……ƒ‚�|€}zuk`SLIDDDGHDLOILMLKIHHGNSTYV[]bjs||}xpmmnoh]`eebhqrqts}|zojmuxsy{soqoxzx{x|‚€wbSKHGHHFGLIJKVblw„‡†‡„}{y|…ˆˆ…„‚„„‹‰†‡ƒ���„{wplmrvtsuz}|}zzzx{|}~�€|riZY[jxƒ‹Ž�“‘’‘����Ї‡…‡……~{wsqqqsiXH?==?<<<=>:==:;<<:=::9<<<:<;<99=::=9<;=9<:8::8<=;<8>;;B=@?>>???@BFNamx€€‚‚|~~}ƒ�€�€~„��…€€€€‚�}€€zzrcYY]YTJGDD??@@==AB@B@@>@=?B@?A@CAABC?C@?A@A>CA=??>BA>C>B>?;A;>AAACFGLQRSTOMS]eeg`cgijlppqy{}xwxvuux}zwmple_]VVUT[^…‰�‹“•—––˜––•‘ŠŠ‚|†‹��‹‡ˆ…ˆŠ�ˆ‰ŠˆŠˆ‡„‰‹‡ˆˆ‰‡‹…ˆ‹‰ˆ„………„„‚‚…�„ƒ…‡‡‡Šˆˆ‹‰‰††……„†ˆƒ†ˆ‡„‰‰…„†…‹ˆ†„„�||saWPHFFCDEFFHPMGJMIFHHHIKHLJJJSVaiikgdbadbZSVWTQWZ^^afjqnfgouspvxkkfqz{yt|€‚zeRLHFGDEFHNPJKTgn|…‹‹‰ˆ††�‚‚ƒ‡†„‚‡‡ˆ‰‰Š‡€{€}ukjgnv{|}|€†„�|w}wy|€{}|vqibVT_mzƒŠŒ�ދމŒŒˆƒ†ƒˆŒˆ…„€xvrrspbJD<>=>:8?8>;<9;;:::<9<9:<:<8;8;;9;8;97;==9?:;=>=A?==>@?A=AJ^ow{ƒ‚‚‚€€‚€‚€|‚‚‚�€€€„„†ƒ„‚€ƒ~€|~ƒ~‚|tppsri`ZOLIHFFKEF?EEBCCCB@<@>>@??C@@?B>@@>?C?C<<=:>9>89>::=:9<9=8:67=<99>=:9=<8;:=<==;;>>@>@@?>>B?A?FQjx~€‚ƒ}~ƒ†…†‚…‚‚€€€ƒƒ†„ƒ‚ˆ‡ˆ„€€|}{ƒ‚€�‚ztoha][[[\RLIMMNQRMHKJGC@ADDDCBBB@A?>?B?>>>>A=>???;@>?BBACCEFJMJGGFJMLNPQW[`[[]aefmnjnpmkgggiutuwvsrssz|zoib\YUSPKNMMU‡Š�––”•——•‰|xj]\WZW\lnpvw||‚ŠˆŠ‡�ŒŒˆˆ‡‰ŒŠŠ„†ˆ€€€ˆ†‡ˆ…ˆ…‹‡‡ˆ‰Œ‡ŠƒŠ†‡‡ŠŠ„ˆ†Š†‰…†Œ†‹Œ‹‰‹‰‡Šˆ„†‡ˆƒ„‚zpncYSJCGDGIFIJMJJHHHGCCDDECDCDDBDDGDJHHGFFGFHKKJGDBBBDADGGHLFIORORY_begpwxqsxzrZGEFHD@@DHNRSTQV_m{�…ˆ†ŠŠ…‡‰………ƒƒ…€†…‡‡…{}tgghpx{|zzz~€}tov{z}yvv{z|sqnlXOSWdhw„…„�|~‚���Š���‘Œ�‡�†…{wbTPKFB=?<=?===<<9:999:<88==8<:<97<8:8><89::;;<>?<;?@?>AA@?BGYs‚€~{xwƒ…†……„††ƒ…†€‚ƒƒƒ�„‡ˆ…†…‚‚|€€ƒƒ‚~~‚€„|~wwropqmfYWXZ[dc_]]ZXQONPPQNGHHDBBAAAB>C@@B>AACBBBEB@DDEHHLHLOIILLSQSUVZ]_]^abfmpnppqqqnnhotxtprpquuzzqjdcXYWTOMNQP…�•–‘•–––‘z`^ZXRTPMMVYYaefkty}~‚ˆ†ˆ�†ŒŒ‹‹Ž†‰ˆ‚ƒ‰†ˆ†‹…†‰„†‰‰Š‰�‰ˆŒ‰…‰Š‡ˆ‰†‡‰†‚‰‰‰‰�Ї‹Ž‰ŠŠ†‰†Š‡…‚vl^RMIHCCEJNOIMNIJEFGDBDDBD>B?BECCCDDFIEBD>AAECDDB=AE?A=BB?EB@DBEFHHOS\^eprstxt`ODEEDEBCEKJPZ^aefm{„‚‚~ƒ„„‚‡�ƒ‚�„‚‚…€†€x{vhgjoww|tqmsrslkousrmnnzvtimppUGHRS\dnsmrpnuuz€††ŠŒ‹�ŽŽ‰�Š‹ˆ„wqk`ZSMIGC@>;>===>=9><8<<=<;;;:>;;>;<==>;;===>>>>>AA>@?=>;@=>?AABBDZoz{yz}ytmu{€‚‚‚ƒ‡†ƒ„„…†‚�……ƒƒƒ‚‡ƒ‚ƒ‚‡Š‚€|ƒ€…‚�‚€�vqiihlrsunqqjdfief^c[WVRJLNLLMEDFHLHGEEFHIEIGKHHLLMNOQJINQUVXVUXY[\ac_hlqrrnrustsrvwztqspqstwyroojd`a^]WPPQP…�—”—––••ˆeYX[[XTRJNNOKQNQU]eelqv|~€€†‹ŠŠŠŠ‹Š‡ˆ‰�†‡ˆˆˆˆ†‡‰ˆ‰ˆŠˆŠŠ‹‡ŠˆŠ‡ŠŠŠ…‰ˆŠ‡‰‡‹ˆ†‹‹‰ˆŠˆ‡…‰‡†„ynYPKJHCCGMPTLJJIHFEHGFB@CA@B@DADDBBCHGDCAB@>DBDAAB=B@BA;<<<>=9>==;>>;<>>=??;B?>=>A>>=C;??@?AA?BCSeopsploienvsuuuszƒˆ‡‰†„…ƒ‚‚€‚�„‚€‚…ˆ…„‚……†‚ƒ€‚|„ƒ…€}ytw||~{yzuvrsszssrphecZ^^]]YQMRVTPMMKKLNKLKHPMOMLMOQKLPVTVUUUVU\_b\`akrrkmrtqtuxuzzsvtruwvvvpikmibeidZXTWS‰”˜–—•–‘}aYY^b`TPKMJHGIDCHILPTXXafmu|…ˆŠ‹‡‹ˆ‹‰‡Œ‹‹‹Š‰�ƒ‰Œˆ‰…„ˆŠˆˆˆ‡‡†‡‹Œ‹ŠŠ‹Šˆ‰ˆˆ‰‰‡‰…Šˆ…ŠŠˆ…ˆ†ubUWVTPPLPRSOJFGFEDFGDDFFC@@BCCB@ACFFECED@?BCBB??@?@A?@?;A@9@=?B?@=BHEGOT[dcZVOQGBACDGGHIO]fywkcckgcckjpqqovy|w|{wqtsrtwpmjhljd][cee_UX]bfiqqkb^Zeggh]`mmTECFKNNURIIHIKNPZ[]egkmpvx|€„‰‡ˆˆ‰„ƒ€zzqhe]VQLKF@@=@????@;?<>?:=;>>???@>=@@@=?B??@=@>??C??>ABB>?@CQ[dfge]___cilkjijmtryx��||~……~���|z‚‚……ƒ‡ˆ†‚†„‚‚~€„‚„ƒ‚�ƒƒ‚}}~zz}z|{|vupmqnpmfa\``ad_SSV\WTQONPTPRMQQSONQXYWSXZXU[d`\]cjqnlmmvrrtqt{zwwxyzz{vupkmmfaefd^\^ZZy|�•˜˜–”�sh`ba_bYQPMLHECA@DDDGGGLOSXcr{†‰‰Šˆ‰ˆ‰‰‹ˆˆ‹ˆ‹ˆŒŠ�Œ�І‡‰‰†‰‡‰‡‡…ˆ‹�ˆŒŠŠˆŠ�ˆˆ�ˆ‡‹ˆˆˆˆ„‡…†ƒ{pieggcZ\XWRNJMFECCFDEHEFDBCBGABB@CFCFBED>A?BE>?>=AC??AC?=?<====AABBFEBGLQWUPLPNHHGFEEFGMV^ntrjc`^a\ccjqqlqqsswsnllnhhhilidelle`]dijbWY[_ciyufbaab_baV`jpWGDFEINSQHCBDACDFHHKPTSX_gglqvwz|€‚€„�~~xunfcZVNIBAB@>A@AB?A=?:?>@?=B=>=B@?@;@B>;<>A<=DB>>BBBA@?CKX_`bZTSY[^dcchacejkktpsuspvz~zz{z�~�‚„„ˆ…„ƒ†‚„‚€€|�…†�‚…†‚ƒ†ƒ…€€€€}z{|wyvt{{~wslgimonhccfje`^][Z_^XRVZXURW_]^Y_a[^agc]aejnmoovtuuwpyyyzzz}~‚„€usqmfcdcfa^^_\rv€�—˜–”„qfa^W\X[QVLKGGFBBC@BBBCG@BHPan{‡ˆ‰�‡‡Šˆˆ…Œ‡…Œ‰Š���‹‹‹ˆ‹‹ŠˆŒ‰ˆ‹‡‰‰‰ˆˆ††ŠŠ‹‹‰ŠŠ�‰Œˆ‹ˆ†‰‡††‚}zyzxvka]URIMMHHEBCDIHGCDB=CDC@?ADEB?EC>A@@>?D??CB@ABC>B@>?>;?=AADCHCCCCKNNHGNJOHKIIGHOU]kgjngie`badjnvrojnjmtohnqpid\cihejsofgfpqmc]]_bcptia^cia`]YV\nrfQDBFELMOIFABB@B@@BDDDDGGPORSW^^edhksxzz|€~z{xtmiXOFB=AB?DB??>?=?@C??@>=A?@?@?A>>@>>>>@@@;?BAE=A>DHQY_\YSTVTZ``]^Y_bcfkihejggmsqssnou|~‚‚�}��~{}ƒ„„„�‚ƒ„„…‚‚…‚„„„…„„ƒ…‚‚�‚wwy}€ƒ||ztyz}{xpsvvsuplkpqmkfeibb`^dffhklgcioicdfiimkntvv{vw|‚}~|z|~†…�yzvqiced`_c^^apnp‚�˜••|icaXSUQVVUSJIDGCBDC?@>B?A;@GQ`rƒˆŒŒ�‰Š‹Š‡ˆˆ‹…ЇˆŒˆ‡‰‰‰‹��ŽŠŠŒŒ‰ŠŒŠŠ‡……‰„‰††ˆ‰Š‹Œ‰ŽŒŒ‰Šˆ‡‡…‚€�}{r^RSLGIJGKFCBGHFEFCC@CCA<@CBD?@BBBB>?DDE@BDFDBBCDBB>B?BAACABDH@@CDHIHFDIIKNJLJKLV_ffb`eikkgggenuwtpfbgfqpmp|usi[]gkkswqjlmmnfd^b`fcmgb]cfc`\ZZVanvgNB@FDFJLFIBD?BBDCDBE@=ADBDDFEFJNKTVW^aglpssu{{yobXOEDD>A?A>?@BC@BA@AA>>>AA@?A>A=?@@C?@EBAB?>>BFMZ]][VXUU]\[XYVZY^`e_c`bcehimnrijsx€~|€~‚}~wwt{|€‚‚…€‚„‡ƒ…‡„ƒ‚‚�€„…‚„‡‡„ƒ…ƒ€z{||�€~}}……ˆ�~€}~~}xvw~vwvysnknkqsrsuqqryrnqnnkknqquwz|}€†ˆ………~{��†~xysmfiicbc_b]oc`q‡”—ŽslceUSSSRTTNHGCDABB?=>?>@@;=>CN^uˆ�‹ŠŽ�‹ŒŠ‹‰Œ…‰‹‹…‹†ˆ…ˆ‰‹Š�ˆˆŠ‹ŒŽ�‡‹ˆ‡Šˆ„†…„€‰‡Œ‹‹�Š‹Œ‰‹Š…‰…~zlVNLEAEFGCDECFCEEDDBDHD@CCDBCA?@B>B?ACDFFCHFA@ACEED>?DFGCFCDDB@?DCHGBBDDFJLNMKGNZ_igbdfjprprmmosyvqj\^gnrrv|wi]bkjvxxrjolea[^[]agbe`[_`b`^`][W^kqZGDKJHDFJHIDE@C@DDFEACCA>CC@A@?AC@CDEKIONUVX`bfia]UPF?@B@?A?D>B@>A=>AA@@<@=>?A>CA@CAC<=?:>>HMZ\^\YVU^``XVZWZW[_]V][__bffjlniirwxvxtyy~wpqoux{€{{€|„„…„ƒ„ƒ…„~‚~„‚ƒˆƒ†�~€ƒ��~~€‡�†…‰†‰††ˆ‡„…~z‚…€�ƒ…{|{{{~}{w}|||zyustvzxzzz}|�ˆŠ‹Œˆƒ„†…€{xqsngmhkccc_]jebcvŒ�…nmjdZWVTSRRLGBB=DBBB>A@=??;???COev‚‡ˆˆŒŒŠ�‹‹‰ŒŠŒ‰�Šˆ‰†Šˆ‡ˆ‰‰†††Œ‹�‹Š�ŠˆŠ‡‡}uouyz�…‹†ƒ‰†…‰‰‰…‚‚wrfTLGABCB?@AACCFBB?BCBFF@GCGECD?<=B?ABDHFJGKCC>DDDD?>EDDJHIIABA@ACBGB@>@CDKEHKJHP]ehligknspqrsjnsussg[bfpssy|{oebgelrxvpvplg^Z]][ac`[^bd`]`^b`YT`jkQBENLKFHGGEE@B?BGEEBEED?DA>D@@A?A??@BADDEEHHINOQLLGGA>??B@A@=@>@@>A???=>A=A=>@>@>BB@@=:@;=>FOYWZXSUX\b`\^^Z\\]]WXX\]^_cffmflhootqqlsssokojqtz{wvuwz|x|…~€�‚†„‚€ƒ„ƒ��ƒ…€„‚…€„ƒ�„„„„‡†ˆ‰Š�‹…‚~}ƒ€�…‡ˆ„‡„……‡†„„�€��„ƒ€}~…‚‚‚|~„……‰�‡‡„ˆŠ†‚zzvsqhjjdded^Xibbgoƒˆwlmfc][YXSVOHGBB@?>BB?AD?ACHUkz†‡ˆˆŠ‡ˆŠŒ‹Œ‹ˆŽŒ‰�‰ŒŠ‹ˆˆŠ†‰‡‰…‹Šƒ‹ˆ‰‰ˆvf\]_fgqyztrtxƒ€zz|umgYLLCD?=A??@@??B?=C@EBBDECEHCCB@@EAEDEHHGHHFF?>@ACD@@AEEGFJAABABACBB>>=;BFEFGGJKS\mopmknupjmrqmmljmmc_dlwy~}xmdghidddjlssqrlf]daY``\Z[`d^\[`f^SM^kbGAGPRPMKHDKEC@>CEFDGCFCACBB@BAACB=BBABBD>@BBBCBC@@>A<@@@@=>>????@=C?>B=??<@A?;==?@@==>?==<:9>AGKSRRSPUXZX[^^]Z]\cbWY_`[_^eaa_`_^cijicekhdhliabnlnjiimomjuxtz}�‚�{yz}€|€€‚€�€‚„…„€…‡…„ƒƒƒ†‡‡ŠŠ‰�ˆ‚‚„€|€ƒ…„‚‡„‡‹‹ˆ‹Œˆ‡‰ƒ†††Šƒ€‚‰ˆ‰‡ˆƒˆ„„†ˆˆŠ‹……†‰Š†‚„{{uunjjd`e`Xkfjn|‚znjnf`\Z[WTWOIGGA=D>AABEEAA=>>=BBCO[q€ˆ‰Œ‡‡Šˆ‰ŠŠ‡†‹‡‰ŠŠˆ‹Ž‹‹‰Œ‡�‰‹‹‰„Ї‡…‚o^WSPSU\bfg^_epszsifhecYSKIG?A>@?>==B>>@?=>AD>CEB?DDEECFDJGLKHGJIHFA?>C?B@ADBGEEBDB@CB?=@AA?==??GDAEGKITalnlceqqopprqnkbcfcchlq|€|teamkg_\Zbjvpnssljmec``ZXXZWWTZbbZLQ_m_FCHOPPNKGHKNG?CEFFFEFGECEAGAAECDC>ABDCA?BB@@BAD?AB>;=?>@@>@?<@@@=A>=?AC>?=?==CAA:??@C@?<<<8>89:;=@FHLMVQNTVOSTXZYUX\a\YZ^`]abfb[ZVVZ[aa]]]a\__g^WX`ge`bbfhdcmkiqx|zwvmoov|�}}€|~|€ƒ…ˆ‰‰„…‡ˆ‡‡……Ї†�†„ƒƒ‚†‚……„…‰„ŠŠˆŒˆˆŠˆˆŒŽ…ˆ††ˆŠŠŒ‰‹�‰ˆˆ�Š‹Šƒ‡ƒ‡…‡„‚‚‚€|zpnhkf_\ukr{…pmiig[[ZZXVPOJHKF@CDADBHGAA@:=@CEEISeu�‰ŒŠˆŒ‰Šˆ…„‡ˆ‰ˆˆŠˆŒŠŠ‹‹‹‹ŠˆŒŠ�‰ˆ††ƒvbVSUVTRRTWSIMN^bcZTX\]TUNJKFDB>?=?=;@@>>;>>?B>>A>C@BAHGHJJIKKHJJHGI@>=>>B@>CADDBAC?BBC?=B=A;=9=BADGCADJQ]djb]gnruwwsmha``ahkquvy{„ykccikd_[Z`kljhlqvtrid^^VTRSRSQSY]XRVaqaKHGMPMPLINW]IB=?=>B???:;=8;:6;:;@BHFKONTWSMNPSQPQRUWVQS[W`]cc^[VXSSX^WUQRTURX[ZPVY_]Z^a^b`_`_ejtssqm_bjjrvtow|w|yyx|z{€„„…†††‡Š„„…‰ƒ„‚‚ƒ„ƒˆˆ‡†‰†…†‚„‰ƒ†‡„‡‡ŒŒŠ‡ˆ……ˆ‡Š…Š‹�‰‰�‹Œ�Іˆ…†…†ƒ…�‚�ƒ}xrvpqmfrrzƒ‰~smhhh^[[WYTPMJOGEFCGBBEHFDB??@CDCDDGXcw…ŒŒ‡‰‰‰Š‡‰Š‰ˆ‰‡ˆ‰ˆ†ˆ‰‡‰‡‹‡Š‹�ˆ‹‹ˆ�wa\YVYZVRNLMEEJLPQNJOQSTVMMKIFA?B=>==@>=?@@>@@B=A<@@?BCEJIJHKKHIIJJHC??@=>@=AACAA@BACAC?@<=;;>9??>@A>BDGLUX\]\eq{|zxpe^ZZ_iouxyuty{ocahha`^^befdaciqsxlf__WSTVNSTUXW]__cjtjVIIOOPPJJYaeL@?@GCGDFEAFCBGFDFICCCCHGCDABBB?B?>>=@AA=@A;;>AA?>@A?>><:=:;<8=;<>AHEGGNQRORSSPSSTOOOOPPQOY[[YZVXWSUTZWOQNRORRSVPQVZZ]Z\^_b[Z[`fipljb^aeeljejosqppqmmmpxz|}��€…„€�ƒ�‚�ƒ„†„…Љ…†€„�„€�…‚††ŠŠ‡‡…ˆˆ‰‡‡‰†ˆˆ…Љ‡‹Œ‰‰‹‰‹†…„†}�€€~|y~}}zvpu‹��khidh`a\[[VSQMMHEIEHFEGGCCC?BGDJHFEGL[n}ƒ†‡Š‡‰Š‰‡‹‰‰‰‹ˆ�ˆˆ†‡Š…†‡ˆ‰‹ˆŠ‹�‰…vg_[]\\XPULLHDJHHIHGJKOQSMMMMKFDB???>@@:;?@CD@A@@@B@?BGEHGGDIHFIEJIIFCCA><<<>@=@@>D=?@@<>>;<=9<=A=;>>>@BCHHPYbkxz}xzh^YZ`giltzuoswofbba^Z]ajmi`\cimsyuk]]TSSTWSYXZ]ciiefqxo_GKNOQNMUcroR??FHBAB?B>@DEBDCEDD@CBDCGE@DBD@>@>??=?>>===A?B@A?@@@BD@ABBDA@@@B@=9>;:9<;=9==<@?EKDILOUSRUTRPSUKIMJJMKOQQSRPSUPQPTUTKOORMSQPSUQVXYVT\]][VTX]dedfcbgcbdbbdcfgehb^[^\`jpnoqttzwzu…‚†�{}‚…€„‚ƒ‚�‚‚�ƒ…}�‚‚ƒ…„„„†……‹Šˆ‰Š‡………‡†‡ˆŒŽŠŠ�‹……ƒ€ƒ{}€„ƒ„‚mm{Œ’ƒkbfbbb`^[]YYOSOKKHKHJGGHDADBCGILLHLNNRbqz{„„„‚‰‡‡†ˆ‰ˆŠˆŠŠŠˆŠ‹ˆŠ…‰Š†…‰‡ˆ‡sd^TV\[YVTOMJOIKJFFILLPKKKJKRTONDCGCCDA;>AABBF=D?@CAA@BHGEGFHGABDFGEFFCC?@;=>;=?==>@><@?><<;:;==??9?=<8?@?DIUcl~€~vl`X]jlfbkmkpqsfab__YZemnoe``jmwrwsg^WWVSVTTXb`dcjgdanspVEKNOLQMVk}vYA>DGBC?;DACAB=CDA@DFDBDDCA?>=>?<=><>B?@C?BA?@AC>BABA>@@>:8<::9:;9==@CFFIGMRTSOTTRQRQILKKLKMMLHNKNQRPQMSRSLLPSTQPSVRSWWZWZ[[\WVTW[cacb_`hfeacd``ccf`_UUQRW\cdceeirmghkt†ƒ�|x|€€|~~{{{z|}‚……�}~‚‚{�ƒ…ˆ‡†‰ŠŠˆ†Šƒƒ‚……ˆŠŠŠŒ‹‰‡…‰…ƒ„„ˆˆ…‡†now†Ž{gdecc_]ZZ\YUURQNOIMMFGGEKCE?CGIINMKNPV\cjsy}|€„……†‡‡…ˆŒ‰ˆ‰‰ŒŒŒ�‰‹�‰Š‰‡‚ygY\PTXVSRUMLOQORMIINMNNLJJJMNSTNHLHDIJEDDDEE@B>?=?A>@DEGGGGHHFB@ABDAA@DB@>>>>>?==>@:@:;;@97<:;9??=;=A:;>;??>>>A>ABBDAC@EBED>A>B:><=;@>B><>@@?=><=<<>??;?>A;::8<<66;8>>;BAGKINSNNQTSVQMLJKLMKJIKIJLKKQMNMNONNNLNTTRTSUSVTSXSQWVVSUX`aeagaX_bbZ`fc`_cgef^[QQMORXUW[]cg[WV^iy{yyuqx|~~zzyywqy}�€ƒ|~~�~{}~�‚ƒ�‡Šˆ†‡‹ˆ„„†…†ˆ‰‡Šˆ‰‡†‰Œ‹‰Œ‹�Š�‹rm{†‚wfijeb]\WVYWTORRPOHJJHHHJGHG@BDEHKJMJQRSS]flmlrw€†„��~€„‰…‡‡†‡‰ŠŽ‰‰Š‡Š‹‹�wfXTRRROMNOMHTTQTWRORRRNMKKGMMPRMMIHIMQOOOPLIC@>??>>>?CCGDGHDDGC>BCB>A@>BA;>@?@@=C><>=?;=;7<:<::=B;>@>><;;:;:::;;<<;;=:>>AA??AABFBB@?B@>@@><<=<;=<;;==;;;<<>>9;:7>>;=><>==99;::=99;<<>@GGHIHMOQRPVSTPHHLJNKKKLHKKNLRKLKIMMNMOSOVQUSTVWUVSSRNSPQOSZfiiibVZYVUZ]Y[^`ciljbWSPOORMRTW[^YOKU^klpkigptxxz{yvvuzy|}{{{z}~~|z€€��€ƒ€…†‡†††ˆˆˆˆˆ†‡…ƒ†�…ˆ‰��Ž‘�‘�ssw�}thkge`[YYVWTONOOPHEHGAFKFHEDDACDFICCGHGKIPVYXW]frxwtqv{‚†Š…‡‡ƒ…ˆ‡ˆˆˆ‰�‹‰…qdYVQQRFEGNKKQSUWUUPRKLPOLMKMNIKHKIIDGIQT[^UQCA@??=>@CDCEDDBBCBD=?D;?>9=>=??ADCCAB?>==>=<:=9:;;>ABD=@??DCGJO]ceimstuyzsqptk__hq{rpqtg^^hplmleif]UPSQUUX]_ihgVLQ\bc`abb][]ojLCGLPMNNJOZibNB>D@@><;:;<<9<>:7:;=9=;?7=?A>???=?:<;=89;8<999;::8:;:89>7=@:<<><<=:==8::;;8@FFEFDCDACCBJLJJGOV`dhjlns}…†‰‡††……‰‡†‚Ї‡ƒ~pbVXNQPGFIKMMRRTSRQNNHIKNNIJIKFHHLIACAEKOX`[UJDAEGGCGIIIBCBBA=@C??@@>:::<9=>ADDCCB@>?=<=::;9<=;DJNIJGGGGGHJTchnksvuvsmkbceb[ah|{vruqf^egheg[UZbSLPTRQWWX^cghWRU^faeghc]U^mgR?ELMOKNNJXiiI@AB===<:;<>8<;=7<8;=:8=9=8<>?C@@B??=?>><=::::;7:88;:;778997:<999;>==<<:@GJLJENLQSHHLOJNGJMJJLHKNHIHKHKJMIMLMMPPPNQLOKSRTOQSTQQINGJOS[Z]VTSSOQQTTTRRWdeide_]VTLNNPOVVQNLMOYYZVRTX\eghilostuvmqotuvswurqty|€‚‚ƒ~„€~‚‚~ƒ�‚†††‡ˆ‰‡††„…†…ˆ‰ˆ��moqvwypgja`\Z[[USNOHKFFDEHFEGDB@?@DEGIHJHG??D@@IF?DDKNTW`adky€…†ˆ‡†Š†ˆ‡‡†ˆˆ€wrd^SMMMIJHGJLMOLONLKLKELINHIGGFCGGJIFCC?EFLZ[YSLJQQRRRRMJFBB>@>?@>@@;;9::9::@BEEFCB>>@=9=::;;;A@???>>A;>9999<;;7:::::::799;89;;779B?;@=@><8;:888;;;;;??GNOLJLQNPHEEGJFKGFDKNIJNJIFLKMMLMOOOONQQOJMIKIKOQLRVVKMLOKJQTTQRRRUWQNRVSNPX]ddbcghbZSLNNOPRQPLQMSXXRTNWY^_[_egilnegccppoppmffhluzyyw}�‚†�‚‚‚€‚€~ƒ„…ƒ…ˆŠ…†††ˆ‡…‡‡…uonpwwshfcab[VTVOOMKHEIFJJIHDC?A=?ACFHGIIFDBF@ADBBCEDFMMPWVdku|}‚ƒ†Š‰‡Š‰‰ˆˆwfab[SJFJJLEIKOIMMJJNKJKELMOJIFECDDHIKFKDA>BGLUZXRSUYYWZVSPKFD@=:@;=?=::=9:==:?AFDCD@@<<;=98;7=<=APahi]QHNILQS`vz|zywomfVOMVYYU^glbY\_XWVZVMQNQPOUQSSVSW^a^_fmkfgklg\beXVVWbpxnWFKLMMIKThwhK@BC=A=<6;8;>;>>:<9:;;;:=9:;>;B?@@A>???>=:;799::78;:<=;<;<<=8=77:=;=@>>@A==:8:;8<:;8=??CIQLLKLNNJBEGFFEBFLGIJKJLIHKMOMMMMKPPOOQOLKKIIIJKOLSPLJMNONTQLRMRRZVQPNTUNRX__b^efjlbWQNLONNOORQSQUSSSPV[YZUV[`cda^[[cekhklc[X^disqsu{}~€„ƒ„„„�ƒ€‚‚…�‚„Šˆ…††‰‰‰‰Šˆ{klmpxtkifddYRRRROKMIGIHIKJHGCA=>A=A@GCDFFGGECDFFGGDHKIKMPRVbiox‚~„‰†‡ˆˆˆ‡€iTW]\UICBJJFMKJJLKJMNNKLIMSNLKEABEBHGGHHGA=?@HRQTRVXZZYZ\\\SOHBB:><:@CABDACGCA<@@>;9:;;7>9;BOY``VNJOLQVYglvupqtulbRKMVUWS\b^WRTRNRRQNNPQWX]]]]ZVY[diebchhefg_UUUTRRVT^oykPCKMOOLJ]qzfIBDBFA?::::9:9;<<99;=<99;<9::;=A@>?=C??>@9:=8::;99<=<==>>@@>:=<==;<>=<@>@=>:;<99>;89?>>EGMMHJLNLIIHKGFCGGHGHEGIJJHNJOOQOLMOOPPOOMOLHMHKNQKMJJIIONPRRMQQRZUUSMMPPMO[\ZZ[cfpsk`XTQLKMPNSRQUPNQPTTZ[WTRW\`aYVYYZ_bcgaXSXW^ccklnux{{{~{}���‚†…‡�„�‡‡…‚ˆ‡‡‡Œ�‹{rnnnstueemb][RPOSOOKJKIKJGIEDBB;B@=CHJKJNRSPTX\\`]POFDB<@@EF@DEBEEKJIEABC?@<>9<><:89=AEC@@;;;;;<>;8;<;9;6;9;9;;<:A>@@A?<?;;;8;=:;<>>>>:>@=>><9;:=<<>9<:>DHKMMKKHFJJGLMHGHHIIFGDGEGGIKLMLPLNNMPNNNNJLMMKNOMLKHHMNQPNRRQTSVX^YQNPQOLOSZXVU[equqkb_WOKLQTSVQQSQQPRSZWWQQWX_]ZSYXZd``[\YUV\]bceejmruurssouwz|€ƒ…‚„„ˆŠ……ƒ†„…„…‹‹{uqrnsxzohj`_VWQSTUNQOONKHHHDAGA=BC@:B@?GHKKQKGKKKLQOUOPLKKQQ[gz‚†ˆŠ„ˆ†„}lWRMS[WMGGGEGGEINKINNIOPIGNQLMIFDHIHIJGEEF@?=DDHPYPOOSQXX[`]YTPZZ]itzwdV\^[Y`aYTRYTROOOONLOOQVdhgjbec]fk\UURUQPROMSVU[ZaY[`vnPAEJQKNJN]twfIABBE=><=;<=><;:8:=:=:9:=99<9>?@;:<;<=?=>@@;<;<<;>>>>;=;<<@=@;>@<<8;;9;:=8=<>GHKNKHHHGJJKMIKFKKIIFJFFGBFFGKHJKKOOOQTOPRLLQOMJNLOIIILQRNNNMPTUZ]ZRTSPTTNQVYUUPXbirrqslbXTTUWXSOOSTVRRTVTVSSUX\WSSW][[bZ]WWYZ[\_]`]`clnrnmlknotry|z~�‡Š‹Š‡‰†…ƒƒ‰ˆ‰urxrjrvtjj^\ZZQWTVTPSSPJGGGEFEC>CCC>A@@DFFMPMOLIKMNNRLMMMMNLVes�„ˆ‰†ˆ‰ˆƒvh[YRQTSLGKGKJFGHLIGHEJNSKHLHIJHFFIJJHIIFFDCB=@=AA@A@DIIGEKHNKPOIINNUceg`ZNJLOQQHB=BA===?89=8=>GLOT^dVRSUY\\[WVQNR[^dlq|o_`_ebcii[ORURRONSUUUQMNUdgfb_`UW^`SPMQJQORKRZ^^]^_Y]hndFAEJQMOGKUipcJ@CB?@=:99<9;=;9;;;<:;8;;:;6=:;>=;@??=>?==>=:9<>=<>???>A7:;;8897=<@DGKHJHKGKLHGIILGGJLJHGJGFFEIIEFIKMKOPQQQQOLLMOMIIMNKHGKQOOKLILTY]\URSSZ[YSRWXYSOS\dgluwulgbc`[YXQPUUYRPSPTSPOQXXSOQWW[\\][\Z__`\__\[]_chjpkomlmmsrstww€‚…‰…‹‹‡‡Šˆ‰‰urtskmo€{m`Z[[TUVXWVRSPPLLJGHDCACGDDE@EC@>BIIMOMLMMLMOLKKNKKKOXgs~…‡‡‡‰†‚xfa[WNQPNJMMNHGGHFFDBBBIPKJHFIKHFDMIGHECBE@AB;>=?:@>AEEGBABEJKMNJEKNVekjh_VZZ[UK?=@@@><;;;;==>CLSV[dd`ZUY`_[XRPPZ`inlhllc^^fggjrh[TUSPMMSUY[\VTZ[\^\WVRMQWTQNOIPTVXQX\]_`]][_chYDDINOKLIJM_m_G?B??<>:=<:89<:<:8=;>;:::=>9<=>E>??AA=?;;<99>>;A>?@<=7<;8;>;==?>=;<<<;9:;;8<=@LKHFLKHIJKKDGGGEIIIIIGGCHJIFGFHEFKLLMQONMJLIPIHKKKJGHILMINJNNU[\URORW_^ZRYX]XPNR[\`hstsqqnpgd^XSV[]YUSORPPQPTTSNKPUUXVVV\^_a^^`b_]]]Zbbdgomomlpouqnpvu}{€Š‡†‡ŒŒŒŠwxsrmgm{wca]Y]UVT[WUPQQLNKLFACIABEDBDEDCD@@BDINLIKOOLLIMOPKNKJRXcr}�‚ˆˆ‚�vj`\WPPKNMNQMJHHEEBDA=@EFDGIHGMHHHHGHFF?>AAB@D@B@A>AADIF@B@CIINLFGGKMX[\\^__dcZJ>?>=<==<:;:=;CFMQT]aed_\ZZ^[VST[gqvuna[c]^\cdbfif_[XUNMNQQWY_`ae_[TSRQLKLQORROOUY^]YYTVY]]^Y]afVJJJJNONJJOcm\D@@??<;:;==88=8=99:7;;;<9::@@?=>>=>:9==>?@>@??>;>:=?=A9>?<;<;=<9;==>>9?:<9::::99=?AFHDEIIEIMMGHJHFIIIFKEFIEHKGCGHFFGFJJILKJKLJOINIKQNJIGGGIILLLPUXVRRQQV_]Z^[\ZWSS[___kpmjmryqk_[YPX_`_\WRSOQUPPZQQPQSVRRQUZab``^^bbeea^]`^giimkiirprrssxxwz‚‚„……‹‰x{{uukoyqa]^\VYUYWXUOOOJMNID@CE@CB??BECCB@@DD@EHILOONMFHNOPNLHLQWjy€†††…‚~mbY\NSOKMORKIHIHFBBC>>@>@CDFJGFCFFHFDB@C=ABCFBEGAABADCHDECGIHONJFEHGGKKLQY[_aVF?=?><:;9:;:=;BHMPU\biljbXQVXXZ]blswvi[Y\\[[[ZX^^^[^ZRKLMLOSZbdbc\TQMMJOIKOQQYSPWY\[WOQNV\]XUX^eaUJIMJQLIKWjp]A?=@=<=<9:;=9<7<:9:789999<>?>B>>A>B<<=?;:<;;==>?<>=@;;<;<===<:=<=87=89<9:<:::=AKLEBGEJGFJEIINGGJJFEGCEFHGHJHHFIHGGIGIIKHJHJJGIORNIJKIGEJMIHOTUSOQSYZ]_a__]`_]V`cecggfgkpztm]ZXUZZcc_XYVSSVOTZWSQTTXSRRU^__][X]a_dedf^^^bihjfbgknpmnuuvuz€{}}|ƒ†…z}€{syvn^\XZXXSZXVTPRMORJGFCBBB@>A?@DFEGDDDFDGDHKRPMNIKOOSSJJKKYix�ˆ‹ˆˆ†ƒwm`_[ROLPNOJJMFFHCIEA;>@:9<:9;:BELOTZZgkpqdTQVW\\]_biohb]^^^XXXSTUUSXXSNMLNLMU`ca]ZUQNLFKKKIKMX]YQRPQVNNMORVUQLR`iiVIHJLKKLP_ps[?@?@?<<:;:<;<<:;;<9;;699>9:=<@C?>A@>?@?==<8::>>B>=@>=<><<<:;=<:==<=:===BA?EE@CCGIMOQLLILJHHDAEFIHFGDGHFHKHACCFLRRIIHBB=>>=;8=;9<;DHMQXZZ`cejg`XXX]^^^WW\c]Y]^[^YZXRTQUQRRMNQQKQQ[^^VVURQIIIHMILKS\][NKKNLLOJJQTLILPamdNDILKLNLSbsv\B@@CA@=:9<;::;<79;;;7:99<:7;;=>>B?AA?@@9D:=::;?>>;<<<=:7::>::=::;8?=>??=;:;;8;8;<<:ADGKNKMJKHHFDEFGGDGFKFGGIHKGCGFEFFFGHKIHHDKGHIIIGINNNOOKDHHKHHNQQOHOOTV^dc^^dgfddid_[Z^`ceipnhdig]TSVUWYYWXZTYUUSQSY^^_X\dhbWXV^XXSWabfb_^baacbcegfdfilpor{‚|||†„~~€zzxyznc^^[ZZRTPSKNOLLRROHKFG@ECC=?ACDDCBGGIIJMNPY]]\bcd`^UTTZahs}„‰‰ˆŒ‰‰…pf]OMOOMHJGHJIILMICHAEDECD@>>C@BBEABFGHLQPKOLIKLFIEDDDG?CEDFDIIBA@AEORSIDFAB=<>?<=?<@CJRW]_c_`a^]e_YTZ^`_c]WSWWUU\\]`\\YQMPQOVSRSXWSQRTVVRQROLKGFLOOMRUYYPOJGNJOLLPMNJIKWgq`ECGOPKLORaru`B@BBD@<>;;<:;:=8<<9<=9;=89>:9=:>@A??@;@=C==:<;:;>:>9A<>@@<;<==;<:;8>;A@CAACIIIJMLLV^b[^cdfhd]Z[\`juz~„‰†‰Š‡„{ndXPJOMIJEHHGIIEJHKFHEHGIHBBBDDABEBDGEHMOKNNJIEKGKJFFCFCCDCCCGD=?=@BMRNHBCAA=<>>::>GIXainpqqiejeed]QRV]^Y^_VRUXVXaeeea_VNILPPTVX[_ZZUSUONONPKJGHINVXYSPQSOQLIJKIQOPNNOJL]kmRBCKNQPLLS\ovZC?@A@>=;>;=;99<;9::9=8;;;;;8?<=>AAA?@>>BA?:8=>?>:;:;8:::::>99>:;:@<;?@=<:9<8;>;:9>9>?DKPRQOOGFDHHFFFGGFDKLHJGDHEJJJLNECEGEEDGIGHHIGFNLLPRNLMRUWTMNNMMIHQRTTWPQW^^bbedc`[[[]^dbgabipurl_\VNNTRQTTW[TONW^`fgc]\_VUXW]ZRVZ[]\VXVTWXYX^bdceghmjkmntqqpmo{ƒƒ{wwspignmi_`Y\YVWVRNLNNLPSMJIICCEDB>A@@BB@EFJMJGLNRXZTQV]_caaY[bimrw€…‡‰ˆ…‚{p_YRILLGGEHDGGCEFFGFHCJLHHLIFFFDEFBCFIIILMJJJHEFHHIIKHGDHDDGGGCCA???@GIIG?AA>>8=;;=CNYgorzz}yuusqnk[KOUUWVVXSQY]`cknpndXPJJKOPSV]``^X\[WQOQJLHJJGNOXZZRLRLLMKMMIMOQKORPQU^mdOBDHQPRNNOYmoZC=C>>=;<;<:>::>;=9;8::<9=<9:=@BB@@@AA>A?=;=:;=>;;;7=9988:7>>>::8<:A@CDBCDEHKLHGGIJOQKKNKSTTVZ[`fltr~……‹Œ‡„{fVVQIIKCGDGEDECBECFD@CJLHMMJJKGIDCDBHIMKJPJJHIIGEGHIHGGIEGJFFJJAF@DE@FACC?:>>>::=<>FUfnwzx~||{x{wePKLPQNNSPORW^akrzvlZNKLJNOUVWW][Y[]b]VQMMOMLILLSTTUPKKRMNQRRMQRRRRTTQVcliVFGNNNRMMKVhqV@A=??;=;<<:9;<;8=;;:;>9:;:;;??BBCA>C@>A=;;;8:;>=8;;6<<<::<===>:::8=>@A?@B9::=9;<;;:=9>?@FLONPSSLIGGHMKFKGEINNGFGDFGHHLQOPHIIIIEDGGCECCCHIFMMQQQV[_\TNSNMQSVSWW[ZX]_b`d__ebYXVU^aae][Z\ekfcjc\[XSPPRTWSNNX[^^dc^__YVVTWXY\[WVXZWVXXRWRV[[^ab^aafhklieacks|{vrnnidbbhlnna^VRSURLNRTMOSOLJJGEGAAC@CEEEDCHHHGEFHGLFGKCFKMKKTV[`fiqx�…ŒŒˆ„xfUURKEGCEDDBCCDGCB?DBFCJFHIJJIHJEEDGGJKHPLKIIJJFHCGIGIFFDGHGCHEBCCHDDBB@C=>:<<:;::?JXdrv|x{}xuz|uiUNLNPPKPPRKTUYajntk]RHKLMRVXWX[VTVQZZZQRORQQQNOOPPOPRMSSQQYWSVWWUVTWVSTcnqbOIMOQPOHLZkkS@@A?==:==<<:;9;8=9<;::::=;7;7;8:;;:;=9><:@<<89@=@?;=;;::<<<9:CFCEDEFGIIIIFGGLILJOJILLHJHGIGIIHJFCGEFDCDDDDGADAB@B;9>>;;=>>>FT`knvz€~xqwwm`OHKMPKNRPMIRTV\`d`VSNLIJSSVZZaaTLKKNRNNNJOSTSTRRTPQTRSYZURVYWVY]XZ_VVT[ksxiRIIPSRONQarlO==CA>;<:;;9;;9;>7:<7:;:@ACE@?ABA?;>;7::?<<<::;6<:::=>><;>::==>>>;====>::9;7::==<:>AGGKQSSRVKMLMKPROFFGFIGJNUUQNQRQOMOQQTRKNJJHFADHGHGEFFDHLPRVVYVVTUONOMSSY^\`hojga[WPUQTVT[RRPLRTW^]befd]XPKMOORRTRVZ]XZUWXXZXY_c[XVVQONUUX[VUYYZc][\Z_adbcea\`fjzsrtkhhb`chq€{uiZ]YRNNRQLHNMJMONLLGDGEHNHLJPLMKDBDBDEFCFBDDFHKKJQXU[co{ƒ‡ƒ‚€u\ROOIGBGEFHFGGDGDAD@C@D@BDDDDGDJLEFJKLLJMGIIMGKKKHLJMJJKFEGDDAA=E>CC?A;B=><<<==CAADIT[bmru|yvsxsk^OMLKKMNNNJOT]^Z]XSNNLJKMORSW_d]RLIGJNHJLJLTUWQRTTTVXTWZZVTOQWWY\V[^ZY^js}xdNHLPUSNRZjzkJ@;AA?=<>:><;=;9:?7:;:998:;<<>>>CCB@>CCA=<;;;:;<::;<:<==>>;=@;A=>@=?>;::8;;:;<=<;>DFEJKROTTPMQMQSVRHGJHGKKPUQPSSTTQNNNSTQNNSNLDFGIFFHHGGBFGJJOOTQNQPPLJKNSV^Zahokc^\SWQROQSPOMJMLQQXZ`enha[VRNNNQOQRQWX\VUSUUWVZ\^ZVXURSNUQYVWVUVXXZ[]\_cdbccd`^ahq~sunddfcdeku„ˆ€ylaXUPROJMJGGKMMIMHJEDGIFFKPPMNHIHGGDJBAA?BBECJHILMSU\is‚‡……�waSKGGFFGIJJIJJIJFBGBAGCCAE@CCDGJGDKHKKOMPLJMHIHJGIKJNMLMJFJHDCB>CB=B?=<><=>8>89;?:9:<9<9;<;;;=<@@FABB@A????;;<=A@><<;<9<;<=>?@==<;?=B>=@?B>=>9;9;;=:;>==>CFIGHPPVXNTQRSXYRNNNOOKPNQPNNSVWWOMNLQRMTVWPKJJKFDHIGKDCCBGDKILKKIMNKIJRTV[bjnh^WTRTNMNNLNIJIHPNLVT[`egmidZTMNQIOQOQTUSPTVTYUXYZUTUUVQSOSTTQVTTPRYYY][```bijj^`covspj_^`^fhnw„ŽŠ‚uk\USSQMDGHFKJJJLIGGDCIJFKQRQOHMJJGKGHDA?>CBGIGFHLLLW_k|„†‹†znWIDFFDGIJILKJMKHFEHDAFBEIDD@GHIFJEKGLKORNMKIIOJHKHIJKNKNGHHFDCDD@?=?;?><;;=?@DLVTWZ]^aabhfkkikefabcbURWUQNNYdaZSPNKLMPOQOKKNQKPLMFHIHKMLMMJKOSOURUZ\YWXZWXUSRMRSQUV[Zdpw~ƒ�mXUSRRPUPZhqcL>BAC?@?===;=<<==;;;;=;=<7<:;;;<>:;:<:;8;=<>??=;;9=<:>?@A@><><7==;99<;9>?GKILLSUXWSTQTWXXSRSYXWUSRROPOOQYWQKHHJMPTVXQJRRLHAGHLFDDCDGGCGJFJHNNIEHRQU]agmiYOLPMMHLOKNIJIKNNOPPVX]fimkdYSPOKOPPLRNLPRYYVXXWWVSURQQPOMRRWRPRNVWXWZZZ]X`hmog]aqwssh`]Zagmp{ˆŒ“Š{oe[UTOHHHJJHKEGGEHIEFEJIJNQQLLMJLMMKGHDFCGFGLFDGGIIQYdx„†ˆ‹„lXFGIDEJIMIKLHMGHIGFCDGGJGDDFGHIGEHJJMJNOJJKLMNNMMGHKOLKKKGHGIDDB>=<@;:A;>>BAFHQRY[Z]__YV__cghd`\_fiiZV\VUPQ_baWQLLJHLSQVNLFJLKIMHIGEILKNPNLGQPUVVV^_]WZ\[\YUORLRUVSX\lvzw}�xki`[STSRR_k_M@>CA@>=<<>==<>;>9;9?8;>:>;<<;>=BDDBE@ABD>=>7?=>?;:;8=:8>9>:?C><;<9>=;=?:?9>;:997;9=<@DMMLRXXUUPUSTYWUVX]`aaZYVQUQPMMSPQGBFGHLQQRNMPQJECEFICECCEFFHEGJMMQPGHINRZ^aeheTHEHJIEMNNNIJNNQOSSNPTTajopj^YVLQPSQLLKILTYXUVWVSUTUPQOONJPQQQRRRWZXSTVVTW[biohZ`kyuqi_^\`kmxƒŒ–‘�zsgb]TRLKLJJJGHEDCHFHEGJGJPPOQLNIKHOLIKKLJMILOHFCFILQ[ct€…†Š}eOJGHHFLKMLGIIIIGFDDAGGGHHHGEHLJEIHFHHHKILJJJOMLKIIGLLMGKGCEFGCBB;B=9<;EEHPMUVSVZXTOPTW^_cdbZ]df^YUVSRWX__YRQLKLIJRWWLLFILNMOOJLJIHKMMKJIMKQVVZ]_^[]\\Y_VQMMNPQT]i{~ws{~zwzpcXRSRQ`j`J?@B=><=>===;8<=>:;=;<9<8<<9>==BBBCCD@@@?@:?=<>?>>=:;;9:9:<>@B@<<9<>9>>>??6?A@FKPXXTSPSSKRWSXSV^_gbb[[VXTMMOPRNEGEFIPPMMJMTPOFDDEDGACKGKJKFKMQSUSHIRQWZY]_a^PJGFHIEHPJPKMMQQRPOKRRU]cgjic_^XSRVRPIKHNRTXRSSUQUQTRPPQMMKROTORTWZ[VTWWTVYaijb]Vgt|vldabcmxƒ‹�”‘‡shhfb[STSOJJGFFBBCFDEDFFJFNNNNMIKGHINJRLJNMJMJIIHFHQVgm{�„†‡oUIJJIGHMNMINIEGGGDDADFDDJFEGJHLMGEHKGFIGIIGHGJOLLLHJLJFFFECCGGG??;9A;;<<>@BDKKRPSQOQRTPIHNOVY`fggc[VSOMLQRUZ^^VSLNLMKLQPPKGFKLRMPRPOQKJNNLJEIIGRSOX[_Zb`bc_[TNJMMMOUet‚‡{|vv€}taYQPVbkbH>>B=><>9<=<=<<<=<<;;=:8<;::CB@A?A@B@?A===<<>=>A>>=;>;:;9<>=>=B<<:>>=@A=B<@><;9<9::9><=>??ALSZUTSQSQMQPLPRPV^_accb`YROPTZVRNMMLWWWRPNQKUVNIHEEGDFIKKIIGKMTUUQITV_^]XTUWSNKHGFGEJRONOQNRNNNKJMOS[]ehhejj`aXZUMMJOOSSSQOPRLOTRPSSQQOPRRTQUTZYZRSX[X[]agedYVco„}oniknwƒŠ“•’Žxf\hfh`^^YXOKHFACC??@@A@CEHJLIKKKMHJMNNMKIINKIKEEHHN\epz…ˆˆeQJMKEGNHPLJKFDFFKIEAEGGGFIFGIHMNGFGLFJFJEJGFHKNJJHIEJIIDDFAAGECA>?===;==>AFNJNQPTMLNQSPMIIMNV[ciiaVRPKJINNR\b^SNJKKHMINOMMIJIMQSQPQLLKQOMKIHHFIKLRRW[\`cccf]RKHIHMQ[m|‚‰„„€wy‚…„}oaXRVcpaC?C?B=><=>>:;<;;><9>;:?8<<=:>;@@CB?C@BBB=<:9==<@>>9::<<;9=<=@@<=9=<@>>>B?@B=<;;>9=7:;=?>>>?DPQXURSSQRSPJKJLNUZ]bfe^XOQV_d_ZXZ[\`dc`]UQPVWSLLKHHBDJKFGKEFKNQMMMP[daXQNQQQNKJKIGINQNOPNQMMKKILKLSUY_dehmpmg`[VQNPOQTRTRQQPTNTOQORSUTPTYWYZYZ\YVTY`_]`dgie^[^n�…|tvz~„Œ�–’•‡i`agjleggb_VKIGFD@??A>@>?EKPRNQOPOJKMSQQOMLNT[ehi[VNJOHHKNQ_`\QKIILJNKOPPNJJHPNQLNJLMGLPSLKJPKKKMNQWVZ]aaaaWRMIKKL[iy|‚„€{|€†„…€vdX^kt]G@DAB?A?;<=>::<==;=<>;><>9=?AA@BA?B=><<9=;?C:?:9::;::=><>=?>;>A=>@B@>@?><=;;<;:;=8@===?AILOURRUURVQLMLLMPQYagc[RSS[cgfdefdjimmmhaRQWUTSRPKFGGGGIIFGHEILJJJLYZWVOMIQKMLLOKILOOOMOPNOLIJNDJLRPUW_]hqrwsib\UNORSPPOTTWTWQNLNMPNWQRVTVYY^YaZUVW_]_dfghlea^m‘�‰€€‰Š��““š‘‡ujknmonojlk^TMEHF@ABB>BBDEFGJFDFGGKIFKKMIKLMJGFGHOU_r‚…‡‚|k\QSSVRNHJPONIEBAECCICDEHEEHECGGLJIGIGHDDDFHIGDBEHIHIIII@FFGFFFFGCB>==:>@@@ELQQSMOLROLKMMOQQPTW[ccc`]VRRKIINKPY\ZPIJHGJORTTTPKHOOLOMJLHHKLNQLOQKNNIMOPSWUY[[Z]\TTNLLVeu‚~yuz€€{€‡‡…xmirs_E??B@A>>===;<><=<<7>>8==9;<>;><=@A>@?=??@=?;<=>??;8;99:;9:==@@??:><==??=?=>?>;:=<;:=:;@>==??BIJORVXTTWRTPRRQQRUZ^^YXRRV`dcfkiknpsqqrcZTRQTTVSMGGEGJHGHIJIJJMLJJQORLMJOMMLMNONKJMNNIMMKNLMPNHMMLJNPX[`qqssqoaZOROPOKPQUTXVSQPOLTTWUNRRRRU]Z_\VWZ`^`ehgfmh_`h‘�‘‹�’‘‘•”•”—�‚€€|zwyvnaUKHJHCGGCFDFFGIIGBCCAEGHGMPSSSRPPPRX_fpx�„ˆ…tcWOPQRNMHKLKGKGACDCECDEACDCACCBDEEHHFHKGGFEEGGD@C@GHJGEFDHBIJJDGGFD>=9=;;@CGKQQSNQNLSOMNNKMPNQUZfc\XXWVVWPNPPMPUUQRJKFJITY__YRINMQLMNNOJKILPNRTWPNNLNNNNTTTWYX[^\RPOW]nz‚ˆ„|rt}‚�|w‡ˆŠ‡~wzvaE@@BAC??==>;<;><<><=;:<<<<<><9=ABA>@@@@@??><;<;;9;<9=8?A?C@@=9<==<>>=>>@@><=@AEIPQPPSTVVT[VYVOVXXZ[RVNSU\\`gmkpqnonpg`YRPRQWUULIJKMIFIKJJNLPLMKLNJJJGNLJMLLOPKNLMLHIILKQRQOGOMMNGLOW\egekjll^TRVPPLMNQTXTPNPSV[]_UOPNMNRTXVXVW[Y]_egiloqd`l“’‘��’’”••”–’–�Ž�Œ‹‹…†ˆ†„zraQNVROOQKLKFHIHKHCF@CAGGIOSWZa^\`]dnox}‚‰ŠŒ�eVMNNOKHJHAFGIEIGDEFEGDBCECA?D>>?CEFIEHJJJEIFHIHBEBEFGDFCEEFIFEFGFIC?>:;:=BCHKNROPPQRQNQMMMNKNRQ[]WTPNTUQVVWYQNQTTMNHIHFKU^gi^SRLQTRQOQRRMLLNQUWYSQNNOJOPQPQTZ]`_ZSWV^fs{{‚†„zw{„‚|††ƒ|u_IBDE>>B=;<>=?=;=<;><<;B;=<=9>8@>>@BE?@AA>A><>;;@>;=<;:;=<:=;?;:@;=<=>>?@>B>><:<>==:?=?>@==ACGQPOLLPOXWZ\XXSX[^YYXTSNQTRZceejkllkkje^USLPW^XSPQRNKDEIHHMKKQMFJGJFHKKLNHHLNMOMOIOJJMDNLRMQMNNNKIMOPX^[^edef]UW[XSQONOQRRQNQV]eecXVUNKMMTSSVVWWY\`fijv}wmhm’’“–“’�’•”‘”˜”•’’��Œˆ‹Š�‹‹ƒrabdfcc]]WUMRLOHJHCBDGHMJU_choornrs|€ƒ‡ˆŒŒ‰eOKLNLJIGFFDEDGGEFFGDFJCDDBCCC>@=DAFGGGKDICGCHEEGEGCCEBCBAA@LBFBEDFB<>9<<<@GJIKMORRMRRQRPNRNKMKPPOONGJLLSTYacZVX\PJLIHDGMVejg_YV\ZWXVUVVVLJKLLTX]VPTQNUNLNNQPXXc`X[X^ivwyt}ƒ…‚~€|ƒ……„{ww†„†„|cIDD@@A=??<=;>>;=:<>=>?:<;>;=;=BDBDCAA@?<><;;>>;9=9;:=9<==B:>8>9:9==>>>?@?;:;;;=@>?>=>>GNLMKNQNTUWZYWY[[b[[[ZTRLJPS[_]aa``eikkb_VVU[\\UOVUNKFIEGHKFLMIJHJGJIGKLLHHIJNLMOKLKOHKJMONLNNKMOLNRORWVX\[]ZZY^aa[XSOOQPQORRUadfa]\YVQQNRSUSWVWYZchimvz|wuv�““””Ž’•””’—“—””‘��ŠŠ‰ŠŒŠ‹Ž~spwwwzuoieb_XXUNFEOGHLMMVbnv}�€}„…„‡ˆ‡ŠŒzaRJNQONKIHFCEBEGHCEFEIGCGDBADD@BBB@ECBIGEEDBBEGFDGFCBD@>?B?CDBADCDD>>?;=9>@FHINJJNJNQMSPPOOPPOONPKJMIGHGJP[cgb]]^SMIJFBINZ_e`ZWZ^\[[YYVVTOFHKRVZXZTWVRWVQMHLLVX]]WUXbl||wx{€ƒ�~�ƒ‡„~wz‚†…†}bNGCA==;8==;<::=:><=<@:B>ABBBB@@DC?=>;><<=@?:<=;;;:;=A=>?<<::;?=<>;=:>@<@=?=>=?FMNNLLNOWSXVVZXU]b[ZY\WTJKJQTWRZVYY`eknma_][^aZPPQSQJJLHHGKJJKFIGGGIKLJMHHGJIMLQMIMKOKIOPMMKNMPNMNPQSRNTX]YZY^Yaif^[XNPUNQQQOX\ba]]Z[VSQOQQUU[ZY]bcjennxxyz{’�‘’•’’–”“’“’•“‘’�’Љ…‡ˆ‡‹Š�~}‚€„……�‚|vtsjc]UQURTONT`is€ˆ‡‡‡…‡Š†„ˆ‡‹……sXNJPOPMKHHFGDGGGFDGEGEGCBDDBGDDCHBDEFDJGC>C?BCDDCGFDCA@@>AACFBDCCDA?<=9:=?BIHQJJJNMOOMOLQPNLORNQJNOKIGEFHO]fidacZSKJIIFKW[_YTVUYX[YYWYXXUOJOOQSYXUVVXZZVPPLKLUVXTVOU`ix�„~€z}€„|}|�„�|z|�‚…|kVOGGC>==?=<>>;<<8?>=?>@B>BDB@@@@>A9;;<><>;:<8:<;;==>>??=:;<;=>>>@A>=:=?=>>??=>>=<>AGLOPQQUTWVVWVZXZ\YUUZSQIKPMNNNQPPW[`jnpghbbed`VPLMQONNMKKMOQMMFJGEIFKIJDGHJJLKOLNLLNKKNLPNPOMMMOOSSSSORSZ\W^]]ajjg_[RNRPQORQR[]ZZX[VXSNOQURVY]^_gkilgkkqw|�”�’�‘“•’•”“”•“”‘’“’ŒŠŠ‰‰ˆŠ‰„||€†‹‹ŠŠƒ„}xwpbbb]YWNVcovƒ‹ˆ‡‚€€{~�‚}wgSPKKJKLJFFEAGEKGFIJGGIDCCDEFGDEFG?DGDHHCD@EACCCCCCCCDCE=CA@FACBG@DDB==<=9>FGLLKJLLSQPNPLMNPKNNPMNNONMNIJKS`jljacUOIIIHNU``^XSTVUXZUYWUWUYSRVRRUYYSWTW[WXSPPMQVWUSUOPRdm}‚ƒ„yy�ƒ…�wz�‚‚{wz~|lf]VQMD@>><;?==<;=:;:;>;><>@A?@DFFACAAA>;9=8>89=9<<9>>>>>;;=:??><=<;??@@;=C@=:==A>?>=EKNRSSRUTUSY\WXUZZVSSSOMKIDOKJLMTVW`hlqkhhdfmf`WOOROQSTNLPPOQMMJICHKJGKHJHIJKQNLOOIMJJMNOLORTOLQQUVURUPQVZ^]__`gmmiaTSNOMRPPSWZXXTXUSSONQRVZ]`bcjnplkdjq{€”’���”‘‘‘•’“‘“”’“—”‘��’�ŽŽ�‡ƒ†€v…ˆŠ‡„€„€{zypnkmdUPR`iny|}{vspmmnliibXQKJGGHFCBCADFFKDBGFGHIFFDCFFHHDGDAAGEGJGD?CBECDCADDCD?@@B@BDFAEEECFA;;><=CFGJLKKLSPTQNONPMLLMNMNOMNOOKMMRSbomjjcQIILGLVadf_[ZWVVSXXYWVVZXTVXV[W^WVWWVVVWWSNOSWZSTTONU\gnt€‚„xw{……�€�€€|wueYXVXTTLFD@=>@<;>===:<9=<>9;=;@<=>@@DGCB@BD?=;;9=<=<>:=;>?=?=>>A=;?;@?<>>>??=?CFNOQNORRPRUWX[[]YWVVLOPLIJHHIINRWWbknoonijhliga[XUXZXWSNPPRRPMNIMHNMKMJGGJKNNNNPRKPINOLNIPQQQMOQWWVSTQORY[\\\[`hmqj^PPMPMNMQOWTWVRTPSMQTVY_acfkpuqkchozƒƒ�“‘’•’“‘““••””–”••“•’’•“’“•Œ�‰‰�ƒƒˆ|z}xvvw|uwqjfTJMUYclpqtsnja_`aZWUWOOKCHFDCABCA@DDCDACFHEFFFCJHHJHDECB@FCDLGFDB>BCDDDCGB@B?CABDCGCADEADAA;@9?CHILNKLLMORQOLNROKKOPQQQRPMOJMGRXclmlmcSKFLIOZ`d`^[VUVSWU[][YXUVVZ\\YZ][XZVVXXTTUTPTXXTTXTWRZbgpx~uyy„†‡…ƒ�‚„|xeRMRNLPPHFC?B>;>:><:>;<=;=<=>>@;@BDAB?AAA@><:==>>;=;9::=9;=?@=><=;<;=@=<===>=?>A>?CJKLJNOOJSSYXZ[[[XYTRRROKGEEFJLRRVckpssqmiihkie`_Z\]`aYUQPPPRPOSPOOOPKJIJHJMKINNSMOONNIPKNORNNOTQUVRRVQSX]ZZRUXdgigaURRTOLMMOPTVUPNSOPSTXZbelpssspgcgs{‚‹Š‘�’“‘“”’’‘�—–””˜•–”—–””•—Ž““’‘�‹†‡|ytuzyrt|yxvpicOIFHPQW__dgkgi`c[VUSNLHACDDCA@@@CBB>BABCEDEDEECGHIIBBFBCBDDJFJFDCCAECCCE?@BABCCCFDHDIGDEFC:>;===CCDB@@CA??:===@?;=>9;9<::;=??>?;;>:;<>?><<<;<====@B@;@DCCDIHIIMOQRSX[[^YSSWYVQLGHJKNQR]fjnqusmkjgghid[X[acgb]YWWUTVYYZTVNPNKGHKLLLJLKRRPPMOLLLNOUOONMVSQSSTNXZWUSUMYZ]`c_]\a\VOKJINQVUSOMJOPTTW_npx~zoggjv|…Љ����‘�•”’”””’””•”–””•˜˜““”“�’�Œ‰ˆ€|uuy|ztx{u{xpo`LEEFLMNQTX^`dhgdbb[WQIG>D@CCBA>>@@B>A@@E?CBDAEEBDGF>AA@CGBAHHHEGFCCDGBCC>@BBAFBDBGGEJJGEEA?<;;@CFJKPMONPOSNNNJNLIONSX^[VWOPOJP[iqqme[ZNRRQQMRRTRNOILJKLQU`ZaZXWZ\^_^a\]YXSTUVZXWXTRRUVXZZXXWRX_gnu„ƒ|}€�‚†‚…€�…~oaTTQMQQLIHDEDDC@CDB@@=<:>=<@AAFACA@;@<@=<<>>>;;:<;<;=<;==<==>:=>;=<@>==><=>==@>>?:A;A?=>=?>===?=A?AEFCKKIJNPTSVXWTUXZWSPQSSUU[cedjkklklhigheb`XZacfcf__\^`\Y]^XYTPGNJGKPKLJLLLNQNOOJJNOQQRMRQRSOQSPTSZUOQNSOVXVYX]adc_RQLLOPUXUMONNOJQS`gs{~…xunvz|…‰‚”��’��’““”“””•“””––••–—•�“�Ž�Œ„‚�zrwy}{xz{xutsl]NGIHJNQPPTRW[_^_db`\TLFC?BB@@A?BB>=C?=AA@B?CBD?BCCA>?A>B@BCGDDFIGFIGFFE@@@ACBBACDFDGLJLGEB?;>>AAGINJMLOQTRONPNLNHKUXXZXTSSOMLR_npqg`ZWRTVVRMNMMNNLJIGGJNRUZ\ZZXX]Z_bgcdXTQSTXZY[VURWYVZ]][_VROSZcm††……ƒ€~€…�~{ka\XXXVYWRQOQNLNKGFADAB@ABB>=><@=@>=@:==@;<<;<;<=;:>:>9>:>;9?=<>@=;><@=>>A9?<===?>>=?@=?A???A;?A>?@@@DB@D=@A?@DAACFEHFHEHDB@DDACC?BBBCFJJHGDA>A>@???A??>AAB@B@<>A;>===;?;7<<<:><7=;=>><::;=?:<===;>@;<>>>;<===?==C;?A;<=@<:;;>>=:AAB@ADBBBGHHGIKMQWZa`dklnngffecjhlolggjecbec`ahiifgkhcXWXZYVTPLJIQNOMIOOSUSQNINMMNLLNKSQTQVRORUOQLNPQMPPQRUYalkic^ROILOVVXXURPKLR]benssz|ƒƒ†ˆ‰…�’’“‘‘“’�”’““’�—“–––”’ˆˆŒ��ˆ…‡‚|�ztqqqutrronpng[QHJPRW[]_jqlggZUUVQRQKHEB>@ABB>:@>>@AB@C?B>?C@@BCDACAECEGGFDCCAEBDCB?CDHFGECA@=@A@BIJJMMIMKLQQRPQMMLORW[WQPLNMMLUYaabab[]]YUZUWQQLMNNLNJIGGNOVXWW[ZUVZbgca[WVYVWZY[XVZ[Z[_Z\\ba\VJMRZemn{ƒ‡„€‚‚„‡ƒuYOLJLLOPMOORVZ^`ZXTOHHE?A@B>B@?B??AAAA=ADA?=>C=CC@@;===9<>:=<:<>9A?<<<=9=;>><<=>>=;?<>><==?:@A>;??;=>;<=;<;;:<<;=;<@?:>B?<@@CCIMV]`horqqmkmmlmqroqjijcedie`bjqiehif_VOTUVZWXQLLKLLMKMJOQURKILLLOLQNNUPPRSUQRSPPLMQOMQSRTSW_bfgji_ZMNSSZ^`\TOPUUYZceklmtz€…Š…„|}‘ŽŽ‘‘‘•”“‘“”“•–“•–“–‹€‡‡Š…{}}y|~vzssqvssrqmvpfZLINUZ\b]gvƒ{|rngaa\TOEFCABBAB?<@@>ADD@B>@CCCD@AA@ABD>?=BA<@@BBC@CDCBCBE@A?@ADA@CCDA@DIGDD??<<=@DEJOLJLLMLPMQQPQNMQOOUWRRQMLNQVT\YU[\ZVWXSZ[`[YOSQNJILEEHJORVY[ZYVTYb`bb]Y[Z^X^[XZUXZXY][XZZ^]WQNOTZ`cqy�‚�€ƒ„zk`XRSQOMMKJIOPQXXZXQONHFC@@BAB@BBBBB@D?@CCA>==>??BF@=?=>=:;<<>;==9;:C:==@><@>A=?>>=<@;@:>9<=:<::=><9=>;<=>=>;BECDGEBCBC>@B>>?>BDBA@CABAABAHBAA??@C=@BFEBDB@>><>CAIHOKKQNJLLQQSNLRPRNLUSQTPNORRSTTNPSXSQPRRY]`\]]UYRQKHGCHKLLUOVVXVXYa]bec^^]__][TTSW\XX\\TYZ][XXTTQVV^fov„‚~ra\]W\Z[XVQPSSQPNNLNRPJPKGEB@AADBBCAB@AAC?AA@@<<@CB@;A=><<::=:=<<;<;<<<@>@??????9?>@>@=>AB;=@<>::<===>8=<=><<;==:><<;:===@ACNYcjmomopquswy{vsokkdbgkkdbgg\Z_ca_YOQPSWVUPMMMHIKOKOMQNOJIGMQRTRPPQOMMPRQRPORMONQQVZSTMRVRWWbimqdWOZiom`WRUWTX\\hion{~‚†‚}spvŽ•‘‘�““Ž�‘‘‘””–’’‘‘ކ‚……€~|€}}{z{x|zvzzuz||r`NNW]^gnjs}††ŽŒ‡‰…†‚yhWRWZPFICGBCCDGGCFDFGGHGHKHEFFD>?@<@A@AA@?DAA?C?CEEA?>>>?A<<@=?>B@??CA<=@=BCGKIPIMMILNKWQLNQVRKLNOPOLSOPQRQNPPYQNNLLRSZY\[b_^VNOLGGJKMKOMQUUSV_^cggdb]``_ZVTSQUYX[]ZZ[\ZYYWVSTMQV_hp}ƒ‰ƒgVQMUTXWZUUUWWUUROMQMKGQJHGFCDCCBBC????CEB@>>>;??>>ECA>A?><@9;B;>;:>9=:9==>?@AA@?A@@>@=>AA>=?@><7>>=<;=;<>@>AGN[bhjllqqqpwwxztrmmhdkihe^]XRR[[]`XXRQVQROOIKGIIKMOONPMQKGGKMRRQOUNMNKQNPOPNROOMQQWYTOQOTTSS_eprdQP]pxwe[UUYYY^agmoww†ˆ†€xwv‘“‘�‘”’‘‘”“•“–•––“‘’�‡�ˆŠŽ‡…‹…‡‡‡‚ƒ‚„‚€}zy|„€vgQSZ\cmnv{ƒŠ‹Ž‰‰‹�‰‰‡zq__edSPMGFGEFHKKGGJILOIHJKKNJJCDC@AF>BCB?CA@AA@@CD@ACB=A@>?;>??=BCFKKMKKMJMJOKOONPQXUOQNNLNPLPMKMNOQQVUQLKOQTWTUY_c_SOMLOPSUQPSORTQSUZbehhecc`a\XXXSZXVY\\a^]]]ZZ[WSTSNOU]it�†ƒ‚pYMOINNNMNQTUUVXTVSZZTRSXPNOOMGBECCDAC@DCAA@?>===?BDBBDB@D@A:<==??;=;:=;?<?AA@???=>@<;B>=>?=?>;=;;=:>>:><==;=;8<<@;<=<><<>@DPSadimqqtquvuwsppmjgfege]ONOQRXZX^ZYUQSNNNKJJIGJHHNNQOOHHGMMRNQMLQNMNNPNPQOMLIMPRQWRNNQZZZ[chqeWJRbpxmd^\\Z]Z]cjnux|��ƒ‡…‚�}‘��‘‘“”““‘“�‘•”–•““‘”Ž�����‘�Ž������‹‹‹…}tr{€t`PRVZ`kq|‚‡��Ž����‹‡…xmecdcTOIIHFGFILKFGNIJJJJKOIIKHHCECGHAIEB?DFDBAA@ACBBBFCAC<<><==>==>>?>><>BDCKILKQKOKNPLKLOPRXWPOPNPQQLMPNNMNUSZ[QORSSXQRSV__XQKNORUYZWSWYWXYSWYdegigd``b`]^]^]YZZZ^[c\`\^[XYVUSJOLT]iqw{zl^UQPNMMMGHKKOJONQZ[]YZ[]VV[YSPGEDDACDAFCC@>B=?A???DFBGFHGECA:><>=;@;=?<@@C<=C<@=@>=;>>?;?9?:A;?9=:;>>:@A;=;<>>;>=>===<:<<:=?GLUYbinppqqtxqsopkgc`^bbULNLOQSVVXZXSMSOKNLQLIFEEHJLOQLIIJKOOOMKNOOJLPPNLQMKNLOQSQUMKNQ[_bgimfZLLTfjmhb_cccbaaelrxz€}„…ƒ�“�’�‘�”�–“’‘’˜–’”––”•“‘‘•”‘”’“�““‘“��’�‚yeakyuhUKQWV\io{…Š��’Ž‘’�ŽŒ‡}qkgb]TMNGEEIGJKIEJHHIHFCIFGEIFKNHHIKLJJHFIILHGAA?CCBIGFCD@><<<=?>=??>?==;>ADGGJJLNMLOILMQMRQURROONOPOOMQQTTRW]ab_\ZZQSRTTWY]WPPMOU^__WY\]]a]^`ddeikhdccbdefdda`][\ZZ[Z\_Y\Y[XWTTNPRQV\gh_^\\WWYXVQSQKMPJGILLSVVYYXQW\\UQMJFDDCADF@C@?B><@BCGJJHPQGB;?=;?;:>=<=@;@?>B>@>==?<;>?=@=>?=8;;==>>;><:;A<<>=8:8>;>@AJRX^dinllqspnnif_[UVZYTKKMTPQRSSVSSKPQJNNLJIHECIIMNLJIGJLMNPRIONMNKNNMPPNHJJSTWQSKLOZ_eljgbVOJLZ`e`bbhjkikgdipuz}~„€……†�}~’’’�’���’•”–“•••••–•”˜“•–•–“•“•“’Œ”�Ž’‰€pZU[ca]TMT[WYamv‡Š‹Œ�ŽŽ’’��ˆ„}xqg\VQOHHIFGHJHDGJEEFAADCEHFJHKJLOKJLJKIPLJMJFACFDHHEHECA;>=<;<;@@@?@<=>?A;DFDDGLIKPMNMNQQOUNOOQNOOOLNTV[__afhieigYLONVTVV[^UONSXbc[[[Y_cifhhliikjkeecffikfjfdda_^[]YZ^Z\^[^^ZXYVUQORYVMONQQVWY^YYVRUQLGHMMHKNQOKNNTSTPNJHB@@DADBBD=????9;ACBJEJNVQHD?=;>;<>;;:?<9?==>@B?BA=??>:>@<<>A:=@:==><>><=>=>>>;A>??==>>7?;=BDFFIIJJLJMLJILMHLOOMILFGHIFIHHIHAA><:=A@AA@=@>>>BCA@EDEHIJIJLOQOROKQOMONNNRU\aefghossun[MJOQNQQTUTSQTX^`XYYZcinkmnuqqqpprkiiflnkghc_ca_`]`\[[]`^Y`^ZbeXRSNWSDDFGIKPPRUSSUTSOJLPMQMKMIJHHJKLMLKIFGBCC@EB>A@=A??<=?@HDJIOQED?>?><;=>;;=:;:<>A?=B=;?><:>=?=;@;@<==><>==?><>=?>=:;<@;::>>;;;@;@BLST][`dgfab]WXVWPNONJMNKLMKNPLLNSVSRKNFHGEIGIKNILIFHJJMMNKKJMMOOOQMNLKIKNOSXWVX_fmmmc]RPONNRSWZ`nstzz~|vwwyyy………ˆˆ†„€‚‘‘��•““”’“’•••–”•‘“—””•—“’——–“•—�’•���ŠjXKHHKRTWbdedcix‡Œ�Ž�‹�Œ�‰Šˆ†‡…„wi_YTPSSNLORQPNLICD@@BDHKNKJLIJKGBPIGGRKJJHGEHHIGFIIIEBB@;=@AA@@C>@@?@ACC=AABEECGIJLLJMNMLTQPSWSSUZbdbjhluy{j[QONLKLOPOORRWV]]^VW^bgmmmpvxttsutqmjknkpgebZ`aa^[a]`_``_^`_]bgaXVV\VGCBACEEFGNHLGLMJMNLOTMQONLLOLNPLOLKLGFEEDCA>>A;@>@>>>@HGIJKFDB@A<=>;=<==<>A=BA=A?=;<>?<><;<<<>:>;>><:==??=??===?:>@:==;;>=;><=;==:>8=@>CIPSVZ\_\ZZYTTVRRNOIOMLPMOPLOKLPVVVRNJGECFIIHIMHJIIGIKIJKJHHHMMRSPRMQLKKKKRVTX_jovqeXVUWVTTRT\agswu{}€€}|~�~~‚}€�’�’‘�‘’’—’“•”–‘•�–—•“––•”•”•’•–�”˜’���„w]JIINS[`issolo{‹Œ�’��Œ��ŠŠ‰„„…�yi_URNTUOPTWTRUMIHFFCFILJGIJIIJIGGGIFHKGHGJGGGCDGGFGJIGFGCCD>?C>??BAA?@@@@D@C>DBBCABHBHGFGHJLRTU[Z\YVZ]]```cotrh_VTOLIIIMORTVRV^bbVWZ\cdggruvuzvzwskelkrlf_][_b]_^_bafbbbdcbafcc``a`ZNHCFCDABCADACGDAGCHHMKKQPMNTVUVWTUTSSMJKEAD?==>;@>>@>BGHLIIGD?A?=;=>>=>;?;==<9=>?====:=>=><<===<=?>>><>?>=>8;?=<8?<<===<<=>9:=<9<<;=CEHIMQRUVURTNNQNQNQLORPVYSRNJKOSVTOLLIFDHHKJELOHFIGKLLKHJKIKMOPQSSSPOMKKLSWXZhqwmdSRYchgb\``gnrtxvw{~~z‚€‚~|zuwzz~}{”‘“‘‘��‘“•’“•”�’“–™”–•”˜˜“–—‘•’•�•’‘�‘Œ†zYNJJS_gjs{{xtu~‰���ŽŒ‘��ŽŽ‰‚‡†�whYSPILOMSZVVROLHKNNMJHHJGFHGGGJEHFFCEHIGFHFFECCBDBFHHHINFFCDC?AB@CBBB?D>BA?@A@@CBCABCFEDE?GIPRV\ZWTRSVZWVW_gnjadd^SMHKKPPYTUVRY_]VSQT\abiprwwuutsrjccknja`^^``ZX[Za_adaaehheihhehefaYSLNLNHMIFFDC>>?BBADBFIJILKQRTZTYZXXYSSONHDA@>???=<<>ABFIJIFGD??><;:>>8:;<>>:BB?=>@:8=<<:=<>><>;?>;;><<>>@==@>:<>;==>;<>@<;=;>;<:<;=:=>;=;??CBGIMNNMNLLLQKQQNNQTXZYOKEJOPRQJLIIIFJFFILGLJLDHIJMMMKJKNOOOQQRTTTNQRUTY[bqwubQQRaoutkllmuyxxxxuyvv{|z|zz|wuuuy|zyy’•’‘‘’�’”–‘–””��”•—••“—–˜–•—”’’””’’���ŠzhRNPT[it{„„†‚��ƒ‹‹‹��Š�����†……‚ype]VPLHKRV\XQLGLJQSQSPGFIBCGEDIIGDFDADDDGGEGFECDCBDBDHHJLEEHEDEEC@F@ACBCDDA?@B?ACDAABCHDCBCDKKMTVTRQNPRTTQQV\gfeeke[PKLJKTYWPRRZ^YUQLLSZbdhoqnqnmqlh^acf``[\]]^XX[X[^^abbjjjggiiilhoghcb_[_\[^YWSJHCDDB@@BBCA>GAHGMNRUTTUXSYWROHCA<=A=?>?@=BBIIJHGD@B<>;<;=<:>;;;9>@<>>A@??=:<<:<=;@?;?=@;>======@<=;<>=><=?;;?:;:?<@:=<;><=:>;;>>B?CGBDEEMKNPMPNNQVYSQFJKNNLKGIKILIFIHLMMKJJJJMJNLJHJLJPNPRTTVUQRXVX_]dmvqcRNQ^rvzvxswz|}~}{{vzx{wyyzvsstnrv{||{{��•’‘”Ž�’•”““–�Š’™•––“––“–—–”–—’�”�‹�ƒyfWMMSX^mu‰……‡Š„��Š���Œ�Œ‹Ž�ˆ‰„�wrkgg\RPRU\`]SKEDIOOSXRHEDBBBEFCFECEA>@CDDGHIGIGCAD@CAFIJIBDHDDBGCDGCAEEGEDFDBBECCD>??B@FBA@BIIKMMMINIMORLMMPS[__ficWPPKMJSWQINQX]`YTKKU\^dfikknfhhjcZ___Y]]ZXYZUVWYYX_^adejgfgfehklpooqkjejnhliec`XPPIKLHIDFD?BCA?GHHHNMLONTVSNHD@=???<<>?>@DEIHFFC>?<><<=:=<>;99<<;=?>>?A==;<==;===;:;>;>:?A=>?:>;=::==:>:>>:<=9;?>;;;>=9>8><;>;<;:;9;9;;B>?ABDCGLHLPONMSOQJLJOMKKIKIJKILIHGILMLJKHKLQNMKFLGLPQQRVVWQPTYV[\_gihaWLPZmy|zzuwz|u{{~|}z{}{zxxuoqmlosvx|z|�‘�’‘’’’’�’‘–’’’�“˜’“‘”””�”•“•”��ŒŠ‚|pcSQMOUV\dmw€~z�„Š��Œ�ŽŠ‹�‹Œ‹�Š‡Šƒ{wvuoeb`bjjfSJE?IJMSYURGEG?DDFBC@?D?@@BDBEGGHHDACDDEBIIFFFCECDDHDGBCCIFFEDGDGFFECD>B>@@BC>BDHHKLJFHKOJQNFKJMPSVS]^\ZQRRVORUOGNPT[_]YTQ^]eehfijfdbdb_[[]X_]ZQSUTURVVXX_aabhfbbbbddeknnpttkllmnutvsmdb]XUVVVTPNNKILDFGCCCGDFIGKJJDB???@<;=?A;CBGGJFCD>?=;>@;;@=;<<:>;;=>?=@AA=:;>;;9>>==<><;=;=A=>=<=A:;=<>;<<9<>?A<<<::<<9>=7=;8<:99<=;=?=>?AGKGNOIPKMMLMJKMHJMNKGOLKIGHGIMGHIKMIPKKKGJKSRRRSUSVTTW[\fgb_ZQNR]mx{|}yzy{x{w{zu{|zy||xxtlmnosvvxwz‘‘’�ŽŽ‘‘’’�•“””�”–˜•��‘‹Š‹‹ŠŒŽ�ˆ†‚{sj^QNIIOSVVZaklijsz€ƒ‰‚‡�‹‹‹ŽŽ��Œ�‹‰…ƒ€€€zuurswsk\OGIJNOU][QNLHCHFGFBBBA=BBADDDEAIHCBGBAGBGIGGCDE@DDBCEECCEEEDBECHKIIHDBC>@DBE>DEGJHNIIIKIOPOKIILMONPRTSTPX\`_YWOMMPPUZ^\UZ`ghkikjha\^`__[[[_Y\WUQTQVWXWTV[]`^eaba`[^`ffijjqmkmijsx}zzsjh`a]]`__]\]XZ[YURNNLMHGEGHGECA>@>==>>;=>CCHGIGFDA@?=<=>;<=<@====:=><>??>=?<;=><>>:8<>><9==;>;=@<<<<;=9>8;?;>;<=<<@<<;;=>99?9;>9=;;:<;<8>9:<9;==??FDHHILLNNKGJHHKMIMLGINIHFHKIEHHJIJKLMQLLPQORQTPPUWTYY_eke^QLLPYlqwy{{||w||uxxxwqqsxvv{€|ytmhosuwuuxt‘�“‘��‘‘”‘’””•’’•”‘—‹†}xttqw|}~xzrgaXNLGDGNNSQQV\^X[bimtyty}‚‡ŠŠŒŽŒ���ŠŒ‹‡†Š†�€{{tl\UPTSXW^c`SSVWTPTQPMEB@>DEF?CAADEDB?CACGBFHGFGGDD?CEBHFDBEFFBBBADHMLHHDFBBCCB?BEEEGKGLIHJHNMJLMKONNOQSOOQY^gdea[XTSPTY\\Z]cikknohaZZZ`_]VV][[[VPOOZUYZUTXW[Z\\_\_^]^baehkikjkiikrv{yxrniebdfgghfddijosmdfa`^_YTJNLMHGED@>?<>>:@ABCHDFGDB=>;>><=>>?<;;>>><;<9>;=>>>:<=A=;<:=;<<=:;>=9====<:>@;=:==;8=;<<6;<<8=;<:<<8<<;<;<>>@CCEJJILHLHKKKLLHHGIICHHHKFDGJMHNOOUXRSTUSROMQWXX\aike[QLMQ^jnxvrtywz{wzwuyxqquqwvx|~~vtmjotwvxyuw‘’’’””‘�’’•””“”“•–”•‹wh`c___agkkgg]WQIGEBEIJQQQRVRRTUY[bb`jos{€„†‡„†‹ŒŠ�‰‰‹Ž‰‡ˆ…�wofaZYX``abebWZ[bab_a_UPF@?CHFFBC?CB?BBB?CEIGIKIDKDDCEBGGKCFHEECD@?BHIKMGFEGFFFBB@ECGGGEEJGGHKOJOKLNLOMPNPLMU_ahbgc][YWW^^XZaaknpmlhcTQTZZ[WTVYT\UQLRPY\[XXYXVVWXXZYZ]_bdclmgkgjigkvuuutpkhfjjmdffhghksx{wxwursonb[VYZUWSMGB>>;>>??BBGIFBBB>;?:@;==?;>;>?;;><>>???>;=<>>>=>:<=;?<:><>:===:?=<;>?<:>=>;==<:;?;;=9<;:=<8::;>:<;:<:>::=<:;;@9<>?DEGEIFHHJNKHGGCFDJJJJKEDFNFJLOXTVSQURQQOONW[^cikeYNQTWdnuvzvrsuxxxsrttyzspttxz€€€{wxmjpuxvwxxz�Ž‘�““�’�”’““�’•”•–�€e\WVTNLQRVX^\VPMGDD@DGJNONPOLJPLLNSTST]cjnsuxuz�}……„„‰†ˆ‰„|wkehc_foomimhadjmqsjdgcXMBDFGAE@BAAA?@A@@CGIIPKJMJJDBECIHEIDJHKFDD?CGGGHKGFJKIHICADEFEGDFGGGGILMPRLJNPLNOOIOTZZ^edfe\]]``a`^bgjporso`ULNRTTSSQTY[[TPRPSUXZZZ][WXX\[[X]]acefmhjjokjnoqmnmkheinijbgigiiisq|{{{‚{vjhjiifgbXOG?C9>A?A@FDEC@B@@>=???=<>>>?<=:<=>;?=?@=>>>===;;=<:;===><;===<:>:=:>>=>><<9:><<>:;>>;=;>;<9?98=;<9;>8;;;=;:9=<:;?=@ABEDCDHJHFGDHIHHHHJGIDGJHJPSWWWTTTQRSPNSUcgjmbWQO^bkrxz}twzz{yxxuosxuywupv}€„„�|}zuotvtstuv{’��Ž’“‘’’�”�‰‹‹“‘�Ž€q[YQUSMJLLLORPPOICCD?GLKLNNKHLHLGJKPJPOQT[[adfhjpkmsryyz{}~~zqkmsqnqxxuutpoqpsvvg`^bYPGDLFCCCC@@CB@BB?CGJNRONMKKIECGGGFCEHKHJGDEEGHIGJHIGGLIJEJDGDFFCCIGCFIHMRRQQSNLIKIKKQUV\`cfd_]_bde_]eiinsrsneWMNLNMQKORWZ[WOLOQSTVY]_Y]]\^_\UT]^aachhhefkkmnjgca__\a_`_d`bjgiomruuxwy€‚‚�|wtwvssqlgaSI@>??A?CDIED@>@>;>?<<=:<=<=<<>:B;<>:=?<=;<>;===;<@:=>9<=@=?9=<=<9;==:=<<<<99:::?=>;><;;?<<<;<::>@?A?BCDBFBGMJJGKHGHCGGKKPXWWTNNRSVPTRV]ajjdXSTbknww{{uzxx|~||vprprruuussw}„„€�€„|xuuxvwvvw‘�‘Ž”‘”‘“’Š�uq{ƒ„€uj^YUQUPNHJGHJJKIFB?CC?DNKPLGHEEGFIDHHIJJMMPMRSTRZ^YZ\_cghhijjjlkouvpsz|vswpwyvuumicXZSTMKJGBBDC>BBCB?=CEGKMNLLLLLGGGDDHDCDGHKGGCCFGGFGFHHDFGIGKLFFIFFDGFDCCIIKOOSUQNGFHIALQVSX\ceac_`^ec^^baahlnhidWOPKNLPNNPVVURMJGOTTU[]]]Z[bb_[WT]_c`aada[]`hgbd^^[TYZYVUY[^bhhkoqqrsvw{{~zx{zx|zxrng[OG@B@>A@FBBAC?>><>;>:@==?@<=<>?;<8@>:===<@=?;<@=>8;>=;<;?;?>;<@=>==;;<<<;?==9>>==<=><<<=;>?;<:8=:;9;><===;:=;;?=;=;>==;9<<@DDIMLGGHGHGFFDB@AFFEFHFCCCCBAEFDEEDEGIJHFEHEGECDDC@FFDDKOQQRLGD?C?HJLOQUYZ^^^_Z[XXYXZW\\\^[XTOQPPOTMOLTNKLKEHPUUVYUXX[]\]\TQRZ_ba^]^[XVZa]^]ZVXTVVVPPSWXcfglrpvmqs{|‚vxzyxzuw{{zutnn`WSNHBCBA?@@@@==>=<=>:<:;>><<<<<=;:<>;:<;>;?9==;<>;==>:8>?<===<:?<;>=<><;>=<>=><;9<8>>;;?<:<>;>;>:<=8;:;<<<:9=;<::<<;?<>AFHGHMGE@@DJJRPVNTOPKORWY\^dj_YQMN_r~‚„‚…‚~~~}{zxpmkjlloryy{{~�}|€†‡||z{}}Ž���”•�Œ„{f[WRSZ]]TXVQRNPKLJIIEIFFDCB>AABDGGKFBBEDDGDHGHHHHJIHHJJIGJMHLILLPONQOPPTRXVYWZ]VWXZZ]``^`fgdaY]ZZ[WSHCFCDFIEGA@AGDIIHECHCBDFHCDC@@IGDHDCEFBBAEC?E?BDFIJMIGECJHCEHDDFBCCBGLMOKDDDCDFGEHHJNLRZXXXUUWVRRRUTONPPNMRWVWZUNEIHLPIEESYZQTSSXWYVTSRSTV]_YX[]]Z[`Z^XXXYRSVTTPUZ\]ccilinpontw}~z{y{vxtwv{z{xxuutnkg^YRNHJCCD>>?>>@>>;=??<=;:?=;<<<;><=><<><:>:;;==;>=@>====:<=;<><:>9<<:==?>C=@>:=><><=9=>>>?>:<=::>;<;<>>:=<;:<<;<<=<@@ACHDA@DFIPRTQQTQNMSZ\cgike\LGMYmwƒ…†ˆ‡…‚„†‚~{wnjinlkmt|€‚}……‚………†„~~€~€€‚‚ƒŽ�’�‘’’…}paWWTUWY\S[WUPNQRPMPNIMMGGDHEFCCGGIMGEIGEHHGMLLJMJIOLILJMJOLLLNLLRMNOLMOQOROQOSVRSTOOSSSSV[[^^\]^Y\`ZPMIHIIJLGFEJIEHHFCBDBBDEBGHKGKIGLEHEIKEC?DBADCCDHIJIEHGIKIGIKBDIJDFECBMLGFEEDHHGEHIKIMSORQRTY]]ZZ^WRNQMOOQW[^^b[RLEKTZRQNW]^SUQRW^ZXQTTTSW]WTXT[]accaca[WZZRTSYWZ_fchgfkkjlpppv}|~€y{|~zx{{{ywzu{w{|xsrkjb]TWSQJLNQPLLJKFGCDCG@C???@@=B=?@@@@@AC?C>?A?AB>?@B??>==?A>??@>?CHDFCC@A@B??AD?CCA?CAA?@B>A<@?@?A>?@??B??@?E?=?@BB@EEBDCHLNRUUV[WXVY]eiorxobUOQZkv‚‡‰Š‰‰†…†‡Šˆˆ…ƒ~uuuxwr{€„‚†ˆ‹‹�ŽŠŒ‰‡‡‡‡ƒ�‡…†…’��’�‘�ƒ{qh]a]^[][Z\^WVPRTUVSVUUTRRTPMNLLOOOPUMPNPORNVTQUURVURSVWRTUSNVWPRTWTVTRXXWTXTSURZXUQOVRWSVTXZZ\^a\]ab[VVTUWOMRSPSUPNQPMIMHJHNGKQRVW^VVPNNPQPNNLKGKJKQQPNMNJOQRUUSSNSVRPRLLHJRKOONSSSNSUZZWS]XUVWZ[bgmojfc\_\\a`dfikpk[YV^gpi_]bh`aVV]]ae_[_]a^\a^^[^`innlinmkkgjccfcghnrmknjppstuqu}}|�‚~~…„‚„„…€ƒ|€‚€~�ƒ}~ztuqokkjkkjgihee^Z^\UVORPKKIMKLJJMNIGMMKJMJNLLNOOLMNNKMLMMKOJILMKLMIMKMMMOUQUPNPJLLQLNNOMONPLPJMKIMKNNJKPLKLLLKMKJLMNLKOMLNLPNNPPQUZ[\^`cdbmkjv|~�}nf^agp{‚‰Œ��Œ�‹‡‡ŠŒŽŒ‰ˆ………‚‚�ƒ†‡ˆ‰‰�ŽŽŽ�‘��ŠŽ�‹ŠŠ‰‹‹‰��”�’��Šƒ€|upsnnnplprnggiffhihhihcggdfgbceafhgdiiggjdjkkfkfgjgdjkjmkggkjjklikkilmjkokiijklqkgnhkillghmhkmonmposoqkqknimjgijhglhhecabdddbhipswtunhhhigklfeegifnnjgfcbchjknqnjmporkmleeheejnmkkllrxyxtqurppmpqv~‚�}~}|y}€~}|{~�~{usv~‚‚€}zxqprpuyvuyxz{yyyyxwvz}�‚‚‚‚„†„��|€z���€|€ƒ€„…‡„…‚ˆ‰Š‰Ž‰‰Š‹‹���ŒŽ���ŠŠ�‰Š‡‹‹�Ž‘�‹ŽŒŒˆ†…‡†‚‚ƒ‚‚~~€}}zwtqonmmjhnmjonkkomnponnmpmlpnjooopomnomomnjkkqkomnlottusqolpopjqmpoqpqmokoojnloploospnlrqnkkpjlkmpnmnspppkqqoqttvw|{~ƒƒƒ‡Œ‹Œ‰…}w{|…�Œ‘–’–’’��•��‘Ž‘Ž�����Š”’”’‘‘���‘���‘”‘�–’“•’‘’��”�’��Šƒ€|upsnnnplprnggiffhihhihcggdfgbceafhgdiiggjdjkkfkfgjgdjkjmkggkjjklikkilmjkokiijklqkgnhkillghmhkmonmposoqkqknimjgijhglhhecabdddbhipswtunhhhigklfeegifnnjgfcbchjknqnjmporkmleeheejnmkkllrxyxtqurppmpqv~‚�}~}|y}€~}|{~�~{usv~‚‚€}zxqprpuyvuyxz{yyyyxwvz}�‚‚‚‚„†„��|€z���€|€ƒ€„…‡„…‚ˆ‰Š‰Ž‰‰Š‹‹���ŒŽ���ŠŠ�‰Š‡‹‹�Ž‘�‹ŽŒŒˆ†…‡†‚‚ƒ‚‚~~€}}zwtqonmmjhnmjonkkomnponnmpmlpnjooopomnomomnjkkqkomnlottusqolpopjqmpoqpqmokoojnloploospnlrqnkkpjlkmpnmnspppkqqoqttvw|{~ƒƒƒ‡Œ‹Œ‰…}w{|…�Œ‘–’–’’��•��‘Ž‘Ž�����Š”’”’‘‘���‘���‘”‘�–’“•’‘’��”�’��Šƒ€|upsnnnplprnggiffhihhihcggdfgbceafhgdiiggjdjkkfkfgjgdjkjmkggkjjklikkilmjkokiijklqkgnhkillghmhkmonmposoqkqknimjgijhglhhecabdddbhipswtunhhhigklfeegifnnjgfcbchjknqnjmporkmleeheejnmkkllrxyxtqurppmpqv~‚�}~}|y}€~}|{~�~{usv~‚‚€}zxqprpuyvuyxz{yyyyxwvz}�‚‚‚‚„†„��|€z���€|€ƒ€„…‡„…‚ˆ‰Š‰Ž‰‰Š‹‹���ŒŽ���ŠŠ�‰Š‡‹‹�Ž‘�‹ŽŒŒˆ†…‡†‚‚ƒ‚‚~~€}}zwtqonmmjhnmjonkkomnponnmpmlpnjooopomnomomnjkkqkomnlottusqolpopjqmpoqpqmokoojnloploospnlrqnkkpjlkmpnmnspppkqqoqttvw|{~ƒƒƒ‡Œ‹Œ‰…}w{|…�Œ‘–’–’’��•��‘Ž‘Ž�����Š”’”’‘‘���‘���‘”‘�–’“•’‘’ \ No newline at end of file diff --git a/xie/xc/programs/xieperf/images/image.014 b/xie/xc/programs/xieperf/images/image.014 new file mode 100644 index 0000000..0a55e76 Binary files /dev/null and b/xie/xc/programs/xieperf/images/image.014 differ diff --git a/xie/xc/programs/xieperf/import.c b/xie/xc/programs/xieperf/import.c new file mode 100644 index 0000000..2340b0b --- /dev/null +++ b/xie/xc/programs/xieperf/import.c @@ -0,0 +1,873 @@ +/* $XConsortium: import.c,v 1.8 94/04/17 20:39:22 rws Exp $ */ + +/**** module import.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + import.c -- import flo element tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include + +static XiePhotomap XIEPhotomap; +static XiePhotomap XIEPhotomap2; +static XieRoi XIERoi; +static XieLut XIELut; +extern Window drawableWindow; +static Pixmap myPixmap; + +static unsigned char *lut; +static XieRectangle *rects; + +static int flo_notify; +static XiePhotoElement *flograph; +static int flo_elements; +static XiePhotoflo flo; + +extern Bool dontClear; + +int InitImportDrawablePixmap(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + flo = ( XiePhotoflo ) NULL; + flograph = ( XiePhotoElement * ) NULL; + + myPixmap = XCreatePixmap( xp->d, drawableWindow, WIDTH, HEIGHT, + xp->vinfo.depth ); + XFillRectangle( xp->d, myPixmap, xp->bggc, 0, 0, + WIDTH, HEIGHT ); + XSync( xp->d, 0 ); + GetXIEPixmap( xp, p, myPixmap, 1 ); + + flo_elements = 2; + flo_notify = False; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + + if ( reps ) + { + XieFloImportDrawable(&flograph[0], + myPixmap, + 0, + 0, + WIDTH, + HEIGHT, + 50, + False + ); + + XieFloExportDrawable(&flograph[flo_elements-1], + flo_elements-1, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + } + + if ( !reps ) + FreeImportDrawablePixmapStuff( xp, p ); + + return( reps ); +} + +int InitImportDrawableWindow(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + flo = ( XiePhotoflo ) NULL; + flograph = ( XiePhotoElement * ) NULL; + + flo_elements = 2; + flo_notify = False; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + + XieFloImportDrawable(&flograph[0], + xp->w, + 0, + 0, + WIDTH, + HEIGHT, + 50, + False + ); + + XieFloExportDrawable(&flograph[1], + 1, /* source phototag number */ + drawableWindow, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + if ( ( ( ImportParms * )p->ts )->obscure == Obscuring ) + XMoveWindow( xp->d, drawableWindow, 100, 100 ); + else if ( ( ( ImportParms * )p->ts )->obscure == Obscured ) + XMoveWindow( xp->d, drawableWindow, 400, 300 ); + else + XMoveWindow( xp->d, drawableWindow, WIDTH + 10, 0 ); + if ( ( ( ImportParms * )p->ts )->obscure == Obscured ) + { + XMapWindow( xp->d, drawableWindow ); + XLowerWindow( xp->d, drawableWindow ); + } + else + { + XMapRaised( xp->d, drawableWindow ); + } + + XSync( xp->d, 0 ); + GetXIEWindow( xp, p, xp->w, 1 ); + dontClear = True; + + flo = XieCreatePhotoflo( xp->d, flograph, 2 ); + } + + if ( !reps ) + { + dontClear = False; + FreeImportDrawableWindowStuff( xp, p ); + } + + return( reps ); +} + +int InitImportDrawablePlanePixmap(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int planes; + + flo = ( XiePhotoflo ) NULL; + flograph = ( XiePhotoElement * ) NULL; + + if ( xp->vinfo.depth == 1 ) + { + planes = 1; + } + else + planes = ( 1 << xp->vinfo.depth ) >> 1; + myPixmap = XCreatePixmap( xp->d, drawableWindow, WIDTH, HEIGHT, + xp->vinfo.depth ); + XFillRectangle( xp->d, myPixmap, xp->bggc, 0, 0, WIDTH, HEIGHT ); + XSync( xp->d, 0 ); + GetXIEPixmap( xp, p, myPixmap, 1 ); + + flo_elements = 2; + flo_notify = False; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + XieFloImportDrawablePlane(&flograph[0], + myPixmap, + 0, + 0, + WIDTH, + HEIGHT, + 0, + planes, + False + ); + + XieFloExportDrawablePlane(&flograph[flo_elements-1], + flo_elements-1, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + } + if ( !reps ) + { + FreeImportDrawablePixmapStuff( xp, p ); + } + return( reps ); +} + +int InitImportDrawablePlaneWindow(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int planes; + + flo = ( XiePhotoflo ) NULL; + flograph = ( XiePhotoElement * ) NULL; + + if ( xp->vinfo.depth == 1 ) + { + planes = 1; + } + else + { + planes = ( 1 << xp->vinfo.depth ) >> 1; + } + + flo_elements = 2; + flo_notify = False; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + XieFloImportDrawablePlane(&flograph[0], + xp->w, + 0, + 0, + WIDTH, + HEIGHT, + 0, + planes, + False + ); + + XieFloExportDrawablePlane(&flograph[flo_elements-1], + flo_elements-1, /* source phototag number */ + drawableWindow, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + if ( ( ( ImportParms * )p->ts )->obscure == Obscuring ) + XMoveWindow( xp->d, drawableWindow, 100, 100 ); + else if ( ( ( ImportParms * )p->ts )->obscure == Obscured ) + XMoveWindow( xp->d, drawableWindow, 400, 300 ); + else + XMoveWindow( xp->d, drawableWindow, WIDTH + 10, 0 ); + if ( ( ( ImportParms * )p->ts )->obscure == Obscured ) + { + XMapWindow( xp->d, drawableWindow ); + XLowerWindow( xp->d, drawableWindow ); + } + else + { + XMapRaised( xp->d, drawableWindow ); + } + + GetXIEWindow( xp, p, xp->w, 1 ); + + flo = XieCreatePhotoflo( xp->d, flograph, 2 ); + dontClear = True; + } + if ( !reps ) + { + dontClear = False; + FreeImportDrawableWindowStuff( xp, p ); + } + + return( reps ); +} + +int InitImportPhoto(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XieEncodeTechnique encode_tech=xieValEncodeServerChoice; + char *encode_params=NULL; + int decode_notify; + + XIEPhotomap = ( XiePhotomap ) NULL; + XIEPhotomap2 = ( XiePhotomap ) NULL; + flo = ( XiePhotoflo ) NULL; + flograph = ( XiePhotoElement * ) NULL; + + XIEPhotomap2 = XieCreatePhotomap( xp->d ); + if ( XIEPhotomap2 == ( XiePhotomap ) NULL ) + reps = 0; + else if ( ( XIEPhotomap = GetXIEPhotomap( xp, p, 1 ) ) == + ( XiePhotomap ) NULL ) + { + reps = 0; + } + else + { + decode_notify = False; + flo_elements = 2; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + XieFloImportPhotomap(&flograph[0], XIEPhotomap, + decode_notify); + + XieFloExportPhotomap(&flograph[1], + 1, /* source phototag number */ + XIEPhotomap2, + encode_tech, + encode_params + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + + flo_notify = False; + } + } + if ( !reps ) + { + FreeImportPhotoStuff( xp, p ); + } + return( reps ); +} + +int InitImportPhotoExportDrawable(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int decode_notify; + XIEimage *image; + + XIEPhotomap = ( XiePhotomap ) NULL; + flo = ( XiePhotoflo ) NULL; + flograph = ( XiePhotoElement * ) NULL; + image = p->finfo.image1; + + if ( xp->screenDepth != image->depth[ 0 ] ) + { + XIEPhotomap = GetXIEPointPhotomap( xp, p, 1, 1 << xp->screenDepth, False ); + } + else + { + XIEPhotomap = GetXIEPhotomap( xp, p, 1 ); + } + + if ( XIEPhotomap == ( XiePhotomap ) NULL ) + { + reps = 0; + } + else + { + decode_notify = False; + flo_elements = 2; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + XieFloImportPhotomap(&flograph[0], XIEPhotomap, + decode_notify); + + XieFloExportDrawable(&flograph[1], + 1, /* source phototag number */ + xp->w, + xp->fggc, + 0, + 0 + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + + flo_notify = False; + } + } + if ( !reps ) + { + FreeImportPhotoStuff( xp, p ); + } + return( reps ); +} + +int +InitImportLUT(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int lutSize, i; + Bool merge; + XieLTriplet start; + + flograph = ( XiePhotoElement * ) NULL; + lut = ( unsigned char * ) NULL; + flo = ( XiePhotoflo ) NULL; + XIELut = ( XieLut ) NULL; + + flo_elements = 2; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + lutSize = xp->vinfo.colormap_size * sizeof( unsigned char ); + lut = (unsigned char *)malloc( lutSize ); + if ( lut == ( unsigned char * ) NULL ) + { + reps = 0; + } + else + { + for ( i = 0; i < lutSize; i++ ) + { + if ( i % 5 == 0 ) + { + lut[ i ] = ( xp->vinfo.colormap_size - 1 ) - i; + } + else + { + lut[ i ] = i; + } + } + if ( ( XIELut = + GetXIELut( xp, p, lut, lutSize, lutSize ) ) == + ( XieLut ) NULL ) + { + reps = 0; + } + } + } + + if ( reps ) + { + + XieFloImportLUT(&flograph[0], XIELut ); + + merge = False; + start[ 0 ] = 0; + start[ 1 ] = 0; + start[ 2 ] = 0; + + XieFloExportLUT(&flograph[1], + 1, /* source phototag number */ + XIELut, + merge, + start + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + + flo_notify = False; + } + if ( !reps ) + { + FreeImportLUTStuff( xp, p ); + } + + return( reps ); +} + +int InitImportROI(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int rectsSize, i; + + flograph = ( XiePhotoElement * ) NULL; + rects = ( XieRectangle * ) NULL; + flo = ( XiePhotoflo ) NULL; + XIERoi = ( XieRoi ) NULL; + + flo_elements = 2; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + rectsSize = (( ImportParms * ) p->ts )->numROIs; + rects = (XieRectangle *) + malloc( rectsSize * sizeof( XieRectangle ) ); + if ( rects == ( XieRectangle * ) NULL ) + { + reps = 0; + } + else + { + /* who cares what the data is */ + + for ( i = 0; i < rectsSize; i++ ) + { + rects[ i ].x = i; + rects[ i ].y = i; + rects[ i ].width = i + 10; + rects[ i ].height = i + 10; + } + } + if ( ( XIERoi = + GetXIERoi( xp, p, rects, rectsSize ) ) == ( XieRoi ) NULL ) + { + reps = 0; + } + } + + if ( reps ) + { + + XieFloImportROI(&flograph[0], XIERoi ); + + XieFloExportROI(&flograph[1], + 1, /* source phototag number */ + XIERoi + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + flo_notify = False; + } + + if ( !reps ) + { + FreeImportROIStuff( xp, p ); + } + + return( reps ); +} + +void DoImportPhoto(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + } +} + +void DoImportDrawablePixmap(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + } +} + +void DoImportDrawableWindow(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + } + XClearWindow( xp->d, drawableWindow ); +} + +void DoImportDrawablePlanePixmap(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for ( i = 0; i < reps; i++ ) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + } +} + +void DoImportDrawablePlaneWindow(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + } + XClearWindow( xp->d, drawableWindow ); +} + +void DoImportLUT(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + } +} + +void DoImportROI(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + } +} + +void EndImportLUT(xp, p) + XParms xp; + Parms p; +{ + FreeImportLUTStuff( xp, p ); +} + +void EndImportPhoto(xp, p) + XParms xp; + Parms p; +{ + FreeImportPhotoStuff( xp, p ); +} + +void EndImportROI(xp, p) + XParms xp; + Parms p; +{ + FreeImportROIStuff( xp, p ); +} + +void EndImportDrawableWindow(xp, p) + XParms xp; + Parms p; +{ + XUnmapWindow( xp->d, drawableWindow ); + dontClear = False; + FreeImportDrawableWindowStuff( xp, p ); +} + +void EndImportDrawablePixmap(xp, p) + XParms xp; + Parms p; +{ + FreeImportDrawablePixmapStuff( xp, p ); +} + +int +FreeImportPhotoStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } + + if ( XIEPhotomap2 ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap2 ); + XIEPhotomap2 = ( XiePhotomap ) NULL; + } + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} + +int +FreeImportDrawableWindowStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} + +int +FreeImportDrawablePixmapStuff( xp, p ) +XParms xp; +Parms p; +{ + XFreePixmap( xp->d, myPixmap ); + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} + +int +FreeImportLUTStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + + if ( lut ) + { + free( lut ); + lut = ( unsigned char * ) NULL; + } + + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } +} + +int +FreeImportROIStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + + if ( rects ) + { + free( rects ); + rects = ( XieRectangle * ) NULL; + } + + if ( XIERoi ) + { + XieDestroyROI( xp->d, XIERoi ); + XIERoi = ( XieRoi ) NULL; + } +} + diff --git a/xie/xc/programs/xieperf/importcl.c b/xie/xc/programs/xieperf/importcl.c new file mode 100644 index 0000000..c394d48 --- /dev/null +++ b/xie/xc/programs/xieperf/importcl.c @@ -0,0 +1,695 @@ +/* $XConsortium: importcl.c,v 1.11 94/04/17 20:39:23 rws Exp $ */ + +/**** module importcl.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + importcl.c -- import client flo element tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include + +static XiePhotomap XIEPhotomap; +static XiePhotomap XIEPhotomap2; +static XieLut XIELut; +static XieRoi XIERoi; +static unsigned char *lut; +static int lutSize; +static XieRectangle *rects; +static int rectsSize; + +static XiePhotoflo flo; +static int flo_notify; +static XiePhotoElement *flograph; +static int flo_elements; + +int InitImportClientPhoto(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XIEimage *image; + int decode_notify; + char *encode_params=NULL; + XieLTriplet width, height, levels; + char *decode_params=NULL; + unsigned char pixel_stride[ 3 ]; + unsigned char left_pad[ 3 ]; + unsigned char scanline_pad[ 3 ]; + XieEncodeTechnique encode_tech=xieValEncodeServerChoice; + + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + XIEPhotomap2 = ( XiePhotomap ) NULL; + + image = p->finfo.image1; + if ( !image ) + { + reps = 0; + } + else + { + if ( TechniqueSupported( xp, xieValDecode, image->decode ) == False ) + return( XiePhotomap ) NULL; + + if (!GetImageData( xp, p, 1 )) + reps = 0; + } + if ( reps ) + { + XIEPhotomap = XieCreatePhotomap(xp->d); + XIEPhotomap2 = XieCreatePhotomap(xp->d); + } + if ( reps ) + { + decode_notify = False; + flo_elements = 2; + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else if ( image->decode == xieValDecodeUncompressedTriple ) + { + pixel_stride[ 0 ] = image->pixel_stride[ 0 ]; + pixel_stride[ 1 ] = image->pixel_stride[ 1 ]; + pixel_stride[ 2 ] = image->pixel_stride[ 2 ]; + left_pad[ 0 ] = image->left_pad[ 0 ]; + left_pad[ 1 ] = image->left_pad[ 1 ]; + left_pad[ 2 ] = image->left_pad[ 2 ]; + scanline_pad[ 0 ] = image->scanline_pad[ 0 ]; + scanline_pad[ 1 ] = image->scanline_pad[ 1 ]; + scanline_pad[ 2 ] = image->scanline_pad[ 2 ]; + + decode_params = ( char * ) XieTecDecodeUncompressedTriple( + image->fill_order, + xieValLSFirst, + xieValLSFirst, + xieValBandByPixel, + pixel_stride, + left_pad, + scanline_pad + ); + } + else if ( image->decode == xieValDecodeJPEGBaseline ) + { + decode_params = ( char * ) XieTecDecodeJPEGBaseline( + image->interleave, + image->band_order, + True + ); + } + else if ( image->decode == xieValDecodeJPEGLossless ) + { + decode_params = ( char * ) XieTecDecodeJPEGLossless( + image->interleave, + image->band_order + ); + } + else if ( image->decode == xieValDecodeG31D ) + { + decode_params = ( char * ) XieTecDecodeG31D( + image->fill_order, + True, + False + ); + } + else if ( image->decode == xieValDecodeG32D ) + { + decode_params = ( char * ) XieTecDecodeG32D( + image->fill_order, + True, + False + ); + } + else if ( image->decode == xieValDecodeG42D ) + { + decode_params = ( char * ) XieTecDecodeG42D( + image->fill_order, + True, + False + ); + } + else if ( image->decode == xieValDecodeTIFF2 ) + { + decode_params = ( char * ) XieTecDecodeTIFF2( + image->fill_order, + True, + False + ); + } + else if ( image->decode == xieValDecodeTIFFPackBits ) + { + decode_params = ( char * ) XieTecDecodeTIFFPackBits( + image->fill_order, + True + ); + } + else if ( image->decode == xieValDecodeUncompressedSingle ) + { + decode_params = ( char * ) XieTecDecodeUncompressedSingle( + image->fill_order, + image->pixel_order, + image->pixel_stride[ 0 ], + image->left_pad[ 0 ], + image->scanline_pad[ 0 ] + ); + } + if ( decode_params == ( char * ) NULL ) + { + reps = 0; + } + if ( reps ) + { + width[ 0 ] = image->width[ 0 ]; + width[ 1 ] = image->width[ 1 ]; + width[ 2 ] = image->width[ 2 ]; + height[ 0 ] = image->height[ 0 ]; + height[ 1 ] = image->height[ 1 ]; + height[ 2 ] = image->height[ 2 ]; + + levels[ 0 ] = image->levels[ 0 ]; + levels[ 1 ] = image->levels[ 1 ]; + levels[ 2 ] = image->levels[ 2 ]; + + XieFloImportClientPhoto(&flograph[0], + image->bandclass, + width, height, levels, + decode_notify, + image->decode, (char *)decode_params + ); + + XieFloExportPhotomap(&flograph[1], + 1, /* source phototag number */ + XIEPhotomap2, + encode_tech, + encode_params + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + flo_notify = True; + } + } + if ( decode_params ) + XFree( decode_params ); + if ( !reps ) + { + FreeImportClientPhotoStuff( xp, p ); + } + return( reps ); +} + +int InitImportClientPhotoExportDrawable(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XIEimage *image; + int decode_notify = 0; + XieProcessDomain domain; + XieLTriplet width, height, levels; + XieDecodeUncompressedSingleParam *decode_params=NULL; + int monoflag = 0; + int idx; + int cclass; + +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xp->vinfo.c_class; +#else + cclass = xp->vinfo.class; +#endif + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + XIELut = ( XieLut ) NULL; + + image = p->finfo.image1; + if (!GetImageData( xp, p, 1 )) + reps = 0; + else + XIEPhotomap = XieCreatePhotomap(xp->d); + if ( reps ) + { + if ( !image ) + { + reps = 0; + } + decode_notify = False; + flo_elements = 2; + monoflag = 0; + if ( IsTrueColorOrDirectColor( cclass ) || xp->screenDepth != image->depth[ 0 ] ) + { + monoflag = 1; + flo_elements+=2; + if ( ( XIELut = CreatePointLut( xp, p, + 1 << image->depth[ 0 ], + 1 << xp->screenDepth, False ) ) + == ( XieLut ) NULL ) + { + reps = 0; + } + } + } + if ( reps ) + { + if ( ( flograph = XieAllocatePhotofloGraph(flo_elements) ) + == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + + width[ 0 ] = image->width[ 0 ]; + height[ 0 ] = image->height[ 0 ]; + levels[ 0 ] = image->levels[ 0 ]; + + decode_params = XieTecDecodeUncompressedSingle( + image->fill_order, + image->pixel_order, + image->pixel_stride[ 0 ], + image->left_pad[ 0 ], + image->scanline_pad[ 0 ] + ); + + idx = 0; + XieFloImportClientPhoto(&flograph[idx], + image->bandclass, + width, height, levels, + decode_notify, + image->decode, (char *)decode_params + ); + idx++; + + if ( monoflag ) + { + XieFloImportLUT(&flograph[idx], XIELut ); + idx++; + + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + idx-1, + &domain, + idx, + 0x7 + ); + idx++; + } + + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, + 0 + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + flo_notify = True; + } + } + if ( decode_params ) + XFree( decode_params ); + if ( !reps ) + { + FreeImportClientPhotoStuff( xp, p ); + } + return( reps ); +} + +int InitImportClientLUT(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + XieOrientation band_order = xieValLSFirst; + XieDataClass cclass; + XieLTriplet start, length, levels; + Bool merge; + + XIELut = ( XieLut ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + lutSize = xp->vinfo.colormap_size * sizeof( unsigned char ); + lut = (unsigned char *) malloc( lutSize ); + + if ( lut == ( unsigned char * ) NULL ) + { + reps = 0; + } + else + { + for ( i = 0; i < lutSize; i++ ) + { + lut[ i ] = ( xp->vinfo.colormap_size - 1 ) - i; + } + + if ( ( XIELut = XieCreateLUT(xp->d) ) == ( XieLut ) NULL ) + reps = 0; + } + if ( reps ) + { + flo_elements = 2; + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + reps = 0; + } + else + { + cclass = xieValSingleBand; + band_order = xieValLSFirst; + length[ 0 ] = xp->vinfo.colormap_size; + length[ 1 ] = 0; + length[ 2 ] = 0; + levels[ 0 ] = xp->vinfo.colormap_size; + levels[ 1 ] = 0; + levels[ 2 ] = 0; + + XieFloImportClientLUT(&flograph[0], + cclass, + band_order, + length, + levels + ); + + merge = False; + start[ 0 ] = 0; + start[ 1 ] = 0; + start[ 2 ] = 0; + + XieFloExportLUT(&flograph[1], + 1, /* source phototag number */ + XIELut, + merge, + start + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + flo_notify = True; + } + } + if ( !reps ) + FreeImportClientLUTStuff( xp, p ); + return( reps ); +} + +int InitImportClientROI(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + XIERoi = ( XieRoi ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + rectsSize = (( ImportClParms * )p->ts)->numROIs; + rects = (XieRectangle *)malloc( rectsSize * sizeof( XieRectangle ) ); + if ( rects == ( XieRectangle * ) NULL ) + { + reps = 0; + } + else + { + /* who cares what the data is */ + + for ( i = 0; i < rectsSize; i++ ) + { + rects[ i ].x = i; + rects[ i ].y = i; + rects[ i ].width = i + 10; + rects[ i ].height = i + 10; + } + + if ( ( XIERoi = XieCreateROI( xp->d ) ) == ( XieRoi ) NULL ) + reps = 0; + } + + if ( reps ) + { + flo_elements = 2; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + XieFloImportClientROI(&flograph[0], rectsSize); + + XieFloExportROI(&flograph[1], + 1, /* source phototag number */ + XIERoi + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + + flo_notify = True; + } + } + if ( !reps ) + { + FreeImportClientROIStuff( xp, p ); + } + return( reps ); +} + +void DoImportClientPhoto(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + PumpTheClientData( xp, p, flo, 0, 1, + p->finfo.image1->data, p->finfo.image1->fsize, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + } +} + +void DoImportClientLUT(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + PumpTheClientData( xp, p, flo, 0, 1, + (char *)lut, lutSize, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + } +} + +void DoImportClientROI(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + PumpTheClientData( xp, p, flo, 0, 1, + (char *)rects, rectsSize * sizeof( XieRectangle ), 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + } +} + +void +EndImportClientLUT(xp, p) + XParms xp; + Parms p; +{ + FreeImportClientLUTStuff( xp, p ); +} + +int +FreeImportClientLUTStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + if ( lut ) + { + free( lut ); + lut = ( unsigned char * ) NULL; + } + + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } +} + +void +EndImportClientPhoto(xp, p) + XParms xp; + Parms p; +{ + FreeImportClientPhotoStuff( xp, p ); +} + +int +FreeImportClientPhotoStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + + if ( XIEPhotomap ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } + + if ( XIEPhotomap2 ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap2 ); + XIEPhotomap2 = ( XiePhotomap ) NULL; + } + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + +} + +void EndImportClientROI(xp, p) + XParms xp; + Parms p; +{ + FreeImportClientROIStuff( xp, p ); +} + +int +FreeImportClientROIStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + if ( rects ) + { + free( rects ); + rects = ( XieRectangle * ) NULL; + } + + if ( XIERoi ) + { + XieDestroyROI( xp->d, XIERoi ); + XIERoi = ( XieRoi ) NULL; + } +} diff --git a/xie/xc/programs/xieperf/logical.c b/xie/xc/programs/xieperf/logical.c new file mode 100644 index 0000000..cc58005 --- /dev/null +++ b/xie/xc/programs/xieperf/logical.c @@ -0,0 +1,366 @@ +/* $XConsortium: logical.c,v 1.8 94/04/17 20:39:24 rws Exp $ */ + +/**** module logical.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + logical.c -- logical flo element tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include + +static XiePhotomap XIEPhotomap1; +static XiePhotomap XIEPhotomap2; +static XiePhotomap ControlPlane; +static XieLut XIELut; +static XieRoi XIERoi; +static XIEimage *image1, *image2; + +static int monoflag = 0; + +static XiePhotoflo flo; +static int flo_notify; +static XiePhotoElement *flograph; +static int flo_elements; +static XieRectangle *rects; + +int InitLogical(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i, idx; + XieProcessDomain domain; + unsigned int bandMask; + int useDomain; + unsigned long logicalOp; + int numROIs, src1, src2; + XieConstant logicalConstant; + + XIELut = ( XieLut ) NULL; + useDomain = ( ( LogicalParms * )p->ts )->useDomain; + numROIs = ( ( LogicalParms * )p->ts )->numROIs; + bandMask = ( ( LogicalParms * )p->ts )->logicalBandMask; + logicalOp = ( ( LogicalParms * )p->ts )->logicalOp; + logicalConstant[ 0 ] = (( LogicalParms * )p->ts)->logicalConstant[ 0 ]; + logicalConstant[ 1 ] = (( LogicalParms * )p->ts)->logicalConstant[ 1 ]; + logicalConstant[ 2 ] = (( LogicalParms * )p->ts)->logicalConstant[ 2 ]; + + image1 = p->finfo.image1; + + /* we must have image1. image2, however, is optional ( dyadic only ) */ + + if ( !image1 ) + return( 0 ); + + image2 = p->finfo.image2; + + if ( image2 ) + flo_elements = 4; + else + flo_elements = 3; + + if ( useDomain == DomainROI || useDomain == DomainCtlPlane ) + flo_elements++; + + ControlPlane = ( XiePhotomap ) NULL; + monoflag = 0; + + if ( xp->screenDepth != image1->depth[ 0 ] ) + { + monoflag = 1; + flo_elements+=2; + if ( ( XIELut = CreatePointLut( xp, p, + 1 << image1->depth[ 0 ], 1 << xp->screenDepth, False ) ) + == ( XieLut ) NULL ) + { + return( 0 ); + } + } + + rects = ( XieRectangle * ) NULL; + if ( useDomain == DomainROI ) + { + rects = (XieRectangle *) + malloc( numROIs * sizeof( XieRectangle ) ); + if ( rects == ( XieRectangle * ) NULL ) + reps = 0; + else + { + for ( i = 0; i < numROIs; i++ ) + { + rects[ i ].x = i * 100; + rects[ i ].y = i * 100; + rects[ i ].width = 100; + rects[ i ].height = 100; + } + } + } + else if ( useDomain == DomainCtlPlane ) + { + ControlPlane = GetControlPlane( xp, 2 ); + if ( ControlPlane == ( XiePhotomap ) NULL ) + reps = 0; + } + + flograph = ( XiePhotoElement * ) NULL; + XIEPhotomap1 = XIEPhotomap2 = ( XiePhotomap ) NULL; + XIERoi = ( XieRoi ) NULL; + flo = ( XiePhotoflo ) NULL; + if ( reps ) + { + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else if ( ( XIEPhotomap1 = + GetXIEPhotomap( xp, p, 1 ) ) == ( XiePhotomap ) NULL ) + { + reps = 0; + } + else if ( image2 ) + { + if ( ( XIEPhotomap2 = GetXIEPhotomap( xp, p, 2 ) ) == + ( XiePhotomap ) NULL ) + { + reps = 0; + } + } + + if ( useDomain == DomainROI ) + { + if ( ( XIERoi = GetXIERoi( xp, p, rects, numROIs ) ) == + ( XieRoi ) NULL ) + { + reps = 0; + } + } + else if ( useDomain == DomainCtlPlane ) + { + ControlPlane = GetControlPlane( xp, 2 ); + if ( ControlPlane == ( XiePhotomap ) NULL ) + reps = 0; + } + } + if ( reps ) + { + idx = 0; + + domain.offset_x = 0; + domain.offset_y = 0; + + if ( useDomain == DomainROI ) + { + XieFloImportROI(&flograph[idx], XIERoi); + idx++; + domain.phototag = idx; + } + else if ( useDomain == DomainCtlPlane ) + { + XieFloImportPhotomap(&flograph[idx], ControlPlane, False +); + idx++; + domain.phototag = idx; + } + else + { + domain.phototag = 0; + } + + XieFloImportPhotomap(&flograph[idx], XIEPhotomap1, False ); + idx++; + src1 = idx; + + if ( image2 ) + { + XieFloImportPhotomap(&flograph[idx], XIEPhotomap2, + False ); + idx++; + src2 = idx; + } + else + src2 = 0; + + XieFloLogical(&flograph[idx], + src1, + src2, + &domain, + logicalConstant, + logicalOp, + bandMask + ); + idx++; + + if ( monoflag ) + { + XieFloImportLUT(&flograph[idx], XIELut ); + idx++; + + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + idx-1, + &domain, + idx, + 0x7 + ); + idx++; + } + + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + idx++; + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + flo_notify = True; + } + if ( !reps ) + { + FreeLogicalStuff( xp, p ); + } + return( reps ); +} + +void DoLogical(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + XSync( xp->d, 0 ); + } +} + +int EndLogical(xp, p) + XParms xp; + Parms p; +{ + FreeLogicalStuff( xp, p ); +} + +int +FreeLogicalStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIEPhotomap1 && IsPhotomapInCache( XIEPhotomap1 ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap1 ); + XIEPhotomap1 = ( XiePhotomap ) NULL; + } + if ( XIEPhotomap2 && IsPhotomapInCache( XIEPhotomap2 ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap2 ); + XIEPhotomap1 = ( XiePhotomap ) NULL; + } + if ( ControlPlane != ( XiePhotomap ) NULL && IsPhotomapInCache( ControlPlane ) == False ) + { + XieDestroyPhotomap( xp->d, ControlPlane ); + ControlPlane = ( XiePhotomap ) NULL; + } + + if ( rects ) + { + free( rects ); + rects = ( XieRectangle * ) NULL; + } + if ( XIERoi ) + { + XieDestroyROI( xp->d, XIERoi ); + XIERoi = ( XieRoi ) NULL; + } + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } +} diff --git a/xie/xc/programs/xieperf/math.c b/xie/xc/programs/xieperf/math.c new file mode 100644 index 0000000..a64e64d --- /dev/null +++ b/xie/xc/programs/xieperf/math.c @@ -0,0 +1,413 @@ +/* $XConsortium: math.c,v 1.6 94/04/17 20:39:25 rws Exp $ */ + +/**** module math.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + math.c -- math flo element tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include + +static XiePhotomap XIEPhotomap; +static XiePhotomap ControlPlane; +static XieRoi XIERoi; +static XieLut XIELut; + +static int flo_notify; +static XiePhotoElement *flograph; +static XiePhotoflo flo; +static int flo_elements; + +static XieClipScaleParam *parms; +static int monoflag; + +int +InitMath(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XieProcessDomain domain; + XieArithmeticOp *ops; + int nops; + unsigned int bandMask; + Bool useDomain; + Bool constrain; + XieConstrainTechnique constrainTech; + int idx; + XieRectangle rect; + int i; + XieLTriplet levels; + XieConstant in_low,in_high; + XieLTriplet out_low,out_high; + XIEimage *image; + int cclass; + +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xp->vinfo.c_class; +#else + cclass = xp->vinfo.class; +#endif + + monoflag = 0; + + useDomain = ( ( MathParms * )p->ts )->useDomain; + constrain = ( ( MathParms * )p->ts )->constrain; + constrainTech = ( ( MathParms * )p->ts )->constrainTech; + ops = ( ( MathParms * )p->ts )->ops; + nops = ( ( MathParms * )p->ts )->nops; + bandMask = ( ( MathParms * )p->ts )->bandMask; + in_low[ 0 ] = ( ( MathParms * )p->ts )->inLow; + in_high[ 0 ] = ( ( MathParms * )p->ts )->inHigh; + in_low[ 1 ] = in_low[ 2 ] = 0.0; + in_high[ 1 ] = in_high[ 2 ] = 0.0; + + XIELut = ( XieLut ) NULL; + XIERoi = ( XieRoi ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + ControlPlane = ( XiePhotomap ) NULL; + flo = ( XiePhotoflo ) NULL; + flograph = ( XiePhotoElement * ) NULL; + parms = ( XieClipScaleParam * ) NULL; + + for ( i = 0; i < nops; i++ ) + { + switch( ops[ i ] ) + { + case xieValExp: + case xieValLn: + case xieValLog2: + case xieValLog10: + case xieValSquare: + case xieValSqrt: + break; + default: + fprintf( stderr, "Invalid math op\n" ); + reps = 0; + break; + } + } + + if ( !reps ) + return( reps ); + + image = p->finfo.image1; + + if ( !image ) + return ( 0 ); + + if ( ( constrain == False && xp->screenDepth != image->depth[ 0 ] ) ) + { + monoflag = 1; + if ( ( XIELut = CreatePointLut( xp, p, + 1 << image->depth[ 0 ], 1 << xp->screenDepth, False ) ) + == ( XieLut ) NULL ) + { + reps = 0; + } + } + else if ( IsTrueColorOrDirectColor( cclass ) && constrain == True ) + { + monoflag = 1; + if ( ( XIELut = CreatePointLut( xp, p, + xp->vinfo.colormap_size, 1 << xp->screenDepth, False ) ) + == ( XieLut ) NULL ) + { + reps = 0; + } + } + + flo_elements = 2 + nops; + if ( useDomain == DomainROI || useDomain == DomainCtlPlane ) + flo_elements++; + if ( constrain == True ) + flo_elements += 2; + if ( monoflag ) + flo_elements += 2; + + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else if ( ( XIEPhotomap = + GetXIEPhotomap( xp, p, 1 ) ) == ( XiePhotomap ) NULL ) + { + reps = 0; + } + else if ( useDomain == DomainROI ) + { + rect.x = ( ( MathParms * )p->ts )->x; + rect.y = ( ( MathParms * )p->ts )->y; + rect.width = ( ( MathParms * )p->ts )->width; + rect.height = ( ( MathParms * )p->ts )->height; + + if ( ( XIERoi = GetXIERoi( xp, p, &rect, 1 ) ) == + ( XieRoi ) NULL ) + { + reps = 0; + } + } + else if ( useDomain == DomainCtlPlane ) + { + ControlPlane = GetControlPlane( xp, 13 ); + if ( ControlPlane == ( XiePhotomap ) NULL ) + reps = 0; + } + + if ( reps ) + { + idx = 0; + + domain.offset_x = 0; + domain.offset_y = 0; + + if ( useDomain == DomainROI ) + { + XieFloImportROI(&flograph[idx], XIERoi); + idx++; + domain.phototag = idx; + } + else if ( useDomain == DomainCtlPlane ) + { + XieFloImportPhotomap(&flograph[idx], ControlPlane, + False); + idx++; + domain.phototag = idx; + } + else + { + domain.phototag = 0; + } + + XieFloImportPhotomap(&flograph[idx], XIEPhotomap, False ); + idx++; + + if ( constrain == True ) + { + XieFloUnconstrain( &flograph[idx], idx ); + idx++; + } + + for ( i = 0; i < nops; i++ ) + { + XieFloMath(&flograph[idx], + idx, + &domain, + ops[ i ], + bandMask + ); + idx++; + } + + if ( constrain == True ) + { + levels[ 0 ] = xp->vinfo.colormap_size; + levels[ 1 ] = 0; + levels[ 2 ] = 0; + + if ( constrainTech == xieValConstrainHardClip ) + parms = ( XieClipScaleParam * ) NULL; + else if ( constrainTech == xieValConstrainClipScale ) + { + out_low[ 0 ] = 0; + out_high[ 0 ] = xp->vinfo.colormap_size - 1; + + parms = ( XieClipScaleParam * ) + XieTecClipScale( in_low, + in_high, out_low, out_high); + if ( parms == ( XieClipScaleParam * ) NULL ) + { + fprintf( stderr, "Trouble loading clipscale technique parameters\n" ); + reps = 0; + } + } + else + { + fprintf( stderr, + "Invalid technique for constrain\n" ); + reps = 0; + } + if ( reps ) + { + XieFloConstrain( &flograph[idx], + idx, + levels, + constrainTech, + ( char * ) parms + ); + idx++; + } + } + + if ( reps && monoflag ) + { + XieFloImportLUT(&flograph[idx], XIELut ); + idx++; + + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + idx-1, + &domain, + idx, + 0x7 + ); + idx++; + } + + if ( reps ) + { + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + idx++; + + flo = XieCreatePhotoflo( xp->d, flograph, + flo_elements ); + flo_notify = True; + } + } + if ( !reps ) + FreeMathStuff( xp, p ); + return( reps ); +} + +void +DoMath(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + } +} + +void +EndMath(xp, p) +XParms xp; +Parms p; +{ + FreeMathStuff( xp, p ); +} + +int +FreeMathStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( parms ) + { + XFree( parms ); + parms = ( XieClipScaleParam * ) NULL; + } + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + if ( XIERoi ) + { + XieDestroyROI( xp->d, XIERoi ); + XIERoi = ( XieRoi ) NULL; + } + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap(xp->d, XIEPhotomap); + XIEPhotomap = ( XiePhotomap ) NULL; + } + if ( ControlPlane != ( XiePhotomap ) NULL && IsPhotomapInCache( ControlPlane ) == False ) + { + XieDestroyPhotomap( xp->d, ControlPlane ); + ControlPlane = ( XiePhotomap ) NULL; + } + + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } +} diff --git a/xie/xc/programs/xieperf/modify.c b/xie/xc/programs/xieperf/modify.c new file mode 100644 index 0000000..c629c27 --- /dev/null +++ b/xie/xc/programs/xieperf/modify.c @@ -0,0 +1,1097 @@ +/* $XConsortium: modify.c,v 1.12 94/04/17 20:39:26 rws Exp $ */ + +/**** module modify.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + modify.c -- modify flo element tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include + +static int BuildModifyPointFlograph(); +static int BuildModifySimpleFlograph(); +static int BuildModifyROIFlograph(); +static int BuildModifyLong1Flograph(); +static int BuildModifyLong2Flograph(); + +static XiePhotomap XIEPhotomap; +static XieRoi XIERoi1, XIERoi2; +static XieLut XIELut1, XIELut2; +static XiePhotoElement *flograph; +static XiePhotoflo flo; +static int flo_elements; + +static XieLut XIELut; +static int monoflag = 0; +static XieRectangle *rects; +static unsigned char *lut; + +int InitModifyROI(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XIEimage *image; + int rectsSize, i; + + monoflag = 0; + XIELut = ( XieLut ) NULL; + rects = (XieRectangle *) NULL; + XIERoi1 = ( XieRoi ) NULL; + XIERoi2 = ( XieRoi ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + image = p->finfo.image1; + if ( !image ) + reps = 0; + else if ( xp->screenDepth != image->depth[ 0 ] ) + { + monoflag = 1; + if ( ( XIELut = CreatePointLut( xp, p, 1 << image->depth[ 0 ], + 1 << xp->screenDepth, False ) ) == ( XieLut ) NULL ) + { + reps = 0; + } + } + if ( reps ) + { + rectsSize = 4; + rects = (XieRectangle *) + malloc( rectsSize * sizeof( XieRectangle ) ); + if ( rects == ( XieRectangle * ) NULL ) + { + reps = 0; + } + else + { + for ( i = 0; i < rectsSize; i++ ) + { + rects[ i ].x = i * 100; + rects[ i ].y = i * 100; + rects[ i ].width = 50; + rects[ i ].height = 50; + } + if ( ( XIERoi1 = GetXIERoi( xp, p, rects, rectsSize ) ) + == ( XieRoi ) NULL ) + { + reps = 0; + } + else + { + for ( i = 0; i < rectsSize; i++ ) + { + rects[ i ].x = i * 100 + 50; + rects[ i ].y = i * 100 + 50; + rects[ i ].width = 50; + rects[ i ].height = 50; + } + if ( ( XIERoi2 = GetXIERoi( xp, p, rects, + rectsSize ) ) == ( XieRoi ) NULL ) + { + reps = 0; + } + } + } + } + if ( reps ) + { + if ( ( XIEPhotomap = GetXIEPhotomap( xp, p, 1 ) ) == + ( XiePhotomap ) NULL ) + { + reps = 0; + } + else if ( !BuildModifyROIFlograph( xp, p, &flograph ) ) + { + reps = 0; + } + } + if ( !reps ) + FreeModifyROIStuff( xp, p ); + return( reps ); +} + +static int +BuildModifyROIFlograph( xp, p, flograph ) +XParms xp; +Parms p; +XiePhotoElement **flograph; +{ + XieProcessDomain domain; + + if ( monoflag ) + flo_elements = 6; + else + flo_elements = 4; + *flograph = XieAllocatePhotofloGraph(flo_elements); + if ( *flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + return( 0 ); + } + + XieFloImportPhotomap(&(*flograph)[0], XIEPhotomap, False); + + XieFloImportROI(&(*flograph)[1], XIERoi1); /* as good a ROI as any */ + + domain.offset_x = 0; + domain.offset_y = 0; + domain.phototag = 2; + + XieFloLogical(&(*flograph)[2], + 1, + 0, + &domain, + ((ModifyParms * )p->ts)->constant, + ((ModifyParms * )p->ts)->op, + ((ModifyParms * )p->ts)->bandMask ); + + if ( monoflag ) + { + XieFloImportLUT(&(*flograph)[3], XIELut ); + + domain.phototag = 0; + XieFloPoint(&(*flograph)[4], + 3, + &domain, + 4, + 0x1 + ); + } + + XieFloExportDrawable(&(*flograph)[flo_elements - 1], + flo_elements - 1, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + flo = XieCreatePhotoflo( xp->d, *flograph, flo_elements ); + return( 1 ); +} + +void DoModifyROI(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + int flo_notify; + int toggle; + + flo_notify = False; + toggle = 0; + + for ( i = 0; i != reps; i++ ) + { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + if ( !toggle ) + { + toggle = 1; + XieFloImportROI(&flograph[1], XIERoi2); + } + else + { + toggle = 0; + XieFloImportROI(&flograph[1], XIERoi1); + } + XieModifyPhotoflo( xp->d, flo, 2, &flograph[1], 1 ); + XSync( xp->d, 0 ); + } +} + +int EndModifyROI(xp, p) + XParms xp; + Parms p; +{ + FreeModifyROIStuff( xp, p ); +} + +int +FreeModifyROIStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + if ( rects ) + { + free( rects ); + rects = (XieRectangle *) NULL; + } + if ( XIERoi1 ) + { + XieDestroyROI( xp->d, XIERoi1 ); + XIERoi1 = ( XieRoi ) NULL; + } + if ( XIERoi2 ) + { + XieDestroyROI( xp->d, XIERoi2 ); + XIERoi2 = ( XieRoi ) NULL; + } + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} + +int InitModifyPoint(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int lutSize, i; + XIEimage *image; + + lut = ( unsigned char * ) lut; + XIELut1 = ( XieLut ) NULL; + XIELut2 = ( XieLut ) NULL; + XIELut = ( XieLut ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + image = p->finfo.image1; + if ( !image ) + return( 0 ); + + lutSize = xp->vinfo.colormap_size; + lut = (unsigned char *)malloc( lutSize * sizeof( unsigned char ) ); + if ( lut == ( unsigned char * ) NULL ) + reps = 0; + else + { + for ( i = 0; i < lutSize; i++ ) + if ( i % 2 ) + lut[ i ] = 1; + else + lut[ i ] = 0; + if ( ( XIELut1 = GetXIELut( xp, p, lut, lutSize, 2 ) ) == + ( XieLut ) NULL ) + { + reps = 0; + } + else + { + for ( i = 0; i < lutSize; i++ ) + if ( i % 2 ) + lut[ i ] = 0; + else + lut[ i ] = 1; + if ( ( XIELut2 = GetXIELut( xp, p, lut, lutSize, 2 ) ) + == ( XieLut ) NULL ) + { + reps = 0; + } + } + } + + if ( reps ) + { + if ( image->depth[ 0 ] == xp->screenDepth ) + { + XIEPhotomap = GetXIEPhotomap( xp, p, 1 ); + } + else if ( !IsDISServer() ) + { + XIEPhotomap = GetXIEDitheredPhotomap( xp, p, 1, 2 ); + } + else + { + XIEPhotomap = GetXIEPointPhotomap( xp, p, 1, + xp->screenDepth, False ); + } + if ( XIEPhotomap == ( XiePhotomap ) NULL ) + { + reps = 0; + } + } + + if ( reps ) + { + if ( !BuildModifyPointFlograph( xp, p, &flograph ) ) + { + reps = 0; + } + } + + if ( !reps ) + { + FreeModifyPointStuff( xp, p ); + } + return( reps ); +} + +static int +BuildModifyPointFlograph( xp, p, flograph ) +XParms xp; +Parms p; +XiePhotoElement **flograph; +{ + XieProcessDomain domain; + int band_mask = 1; + + flo_elements = 4; + *flograph = XieAllocatePhotofloGraph(flo_elements); + if ( *flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + return( 0 ); + } + + XieFloImportPhotomap(&(*flograph)[0], XIEPhotomap, False); + + XieFloImportLUT(&(*flograph)[1], XIELut1); /* as good a LUT as any */ + + domain.offset_x = 0; + domain.offset_y = 0; + domain.phototag = 0; + + XieFloPoint(&(*flograph)[2], 1, &domain, 2, band_mask ); + + XieFloExportDrawablePlane(&(*flograph)[3], + 3, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + flo = XieCreatePhotoflo( xp->d, *flograph, flo_elements ); + return( 1 ); +} + +void DoModifyPoint(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + int flo_notify; + int toggle; + + flo_notify = False; + toggle = 0; + + for ( i = 0; i != reps; i++ ) + { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + if ( !toggle ) + { + toggle = 1; + XieFloImportLUT(&flograph[1], XIELut2); + } + else + { + toggle = 0; + XieFloImportLUT(&flograph[1], XIELut1); + } + XieModifyPhotoflo( xp->d, flo, 2, &flograph[1], 1 ); + XSync( xp->d, 0 ); + } +} + +int EndModifyPoint(xp, p) + XParms xp; + Parms p; +{ + FreeModifyPointStuff( xp, p ); +} + +int +FreeModifyPointStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( lut ) + { + free( lut ); + lut = ( unsigned char * ) NULL; + } + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } + if ( XIELut1 ) + { + XieDestroyLUT( xp->d, XIELut1 ); + XIELut1 = ( XieLut ) NULL; + } + if ( XIELut1 ) + { + XieDestroyLUT( xp->d, XIELut2 ); + XIELut2 = ( XieLut ) NULL; + } + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} + +int InitModifySimple(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XIEimage *image; + + monoflag = 0; + XIEPhotomap = ( XiePhotomap ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + XIELut = ( XieLut ) NULL; + + image = p->finfo.image1; + if ( !image ) + reps = 0; + else if ( xp->screenDepth != image->depth[ 0 ] ) + { + monoflag = 1; + if ( ( XIELut = CreatePointLut( xp, p, 1 << image->depth[ 0 ], + 1 << xp->screenDepth, False ) ) == ( XieLut ) NULL ) + { + reps = 0; + } + } + + if ( reps ) + { + if ( ( XIEPhotomap = GetXIEPhotomap( xp, p, 1 ) ) + == ( XiePhotomap ) NULL ) + { + reps = 0; + } + else if ( !BuildModifySimpleFlograph( xp, p, &flograph ) ) + { + reps = 0; + } + } + if ( !reps ) + FreeModifySimpleStuff( xp, p ); + return( reps ); +} + +static int +BuildModifySimpleFlograph( xp, p, flograph ) +XParms xp; +Parms p; +XiePhotoElement **flograph; +{ + XieProcessDomain domain; + + if ( monoflag ) + flo_elements = 4; + else + flo_elements = 2; + *flograph = XieAllocatePhotofloGraph(flo_elements); + if ( *flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + return( 0 ); + } + + XieFloImportPhotomap(&(*flograph)[0], XIEPhotomap, False); + + if ( monoflag ) + { + XieFloImportLUT(&(*flograph)[1], XIELut ); + + domain.offset_x = 0; + domain.offset_y = 0; + domain.phototag = 0; + + XieFloPoint(&(*flograph)[2], + 1, + &domain, + 2, + 0x1 + ); + } + + XieFloExportDrawable(&(*flograph)[flo_elements - 1], + flo_elements - 1, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + flo = XieCreatePhotoflo( xp->d, *flograph, flo_elements ); + return( 1 ); +} + +void DoModifySimple(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + int flo_notify; + int toggle; + + flo_notify = False; + toggle = 0; + + for ( i = 0; i != reps; i++ ) + { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + if ( !toggle ) + { + toggle = 1; + XieFloExportDrawable(&flograph[ flo_elements - 1], + flo_elements - 1, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + } + else + { + toggle = 0; + XieFloExportDrawable(&flograph[ flo_elements - 1], + flo_elements - 1, /* source phototag number */ + xp->w, + xp->fggc, + 100, /* x offset in window */ + 100 /* y offset in window */ + ); + } + XClearWindow( xp->d, xp->w ); + XieModifyPhotoflo( xp->d, flo, flo_elements, + &flograph[flo_elements - 1], 1 ); + XSync( xp->d, 0 ); + } +} + +int EndModifySimple(xp, p) + XParms xp; + Parms p; +{ + FreeModifySimpleStuff( xp, p ); +} + +int +FreeModifySimpleStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} + +int InitModifyLong1(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XIEimage *image; + GeometryParms gp; + + monoflag = 0; + XIEPhotomap = ( XiePhotomap ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + XIELut = ( XieLut ) NULL; + + image = p->finfo.image1; + if ( !image ) + reps = 0; + else if ( xp->screenDepth != image->depth[ 0 ] ) + { + monoflag = 1; + if ( ( XIELut = CreatePointLut( xp, p, 1 << image->depth[ 0 ], + 1 << xp->screenDepth, False ) ) == ( XieLut ) NULL ) + { + reps = 0; + } + } + + if ( reps ) + { + gp.geoType = GEO_TYPE_SCALE; + gp.geoHeight = 64; + gp.geoWidth = 128; + gp.geoXOffset = 0; + gp.geoYOffset = 0; + gp.geoTech = xieValGeomNearestNeighbor; + + if ( ( XIEPhotomap = GetXIEGeometryPhotomap( xp, p, &gp, 1 ) ) + == ( XiePhotomap ) NULL ) + { + reps = 0; + } + else if ( !BuildModifyLong1Flograph( xp, p, &flograph ) ) + { + reps = 0; + } + } + if ( !reps ) + FreeModifyLongStuff( xp, p ); + return( reps ); +} + +static int +BuildModifyLong1Flograph( xp, p, flograph ) +XParms xp; +Parms p; +XiePhotoElement **flograph; +{ + int i, idx; + XieProcessDomain domain; + XieConstant constant; + int band_mask; + + idx = 0; + band_mask = 7; + flo_elements = 10; + if ( monoflag ) + flo_elements+=2; + *flograph = XieAllocatePhotofloGraph(flo_elements); + if ( *flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + return( 0 ); + } + + XieFloImportPhotomap(&(*flograph)[idx], XIEPhotomap, False); + idx++; + + /* now, a bunch of silly monadic arithmetic elements */ + + domain.offset_x = 0; + domain.offset_y = 0; + domain.phototag = 0; + + /* just add 1 */ + + constant[ 0 ] = 1.0; + constant[ 1 ] = 0.0; + constant[ 2 ] = 0.0; + + for ( i = 0; i < flo_elements - 2 - ( monoflag ? 2 : 0 ); i++ ) + { + XieFloArithmetic(&(*flograph)[idx], + idx, + 0, + &domain, + constant, + xieValAdd, + band_mask + ); + idx++; + } + + if ( monoflag ) + { + XieFloImportLUT(&(*flograph)[idx], XIELut ); + idx++; + + XieFloPoint(&(*flograph)[idx], + idx - 1, + &domain, + idx, + 0x1 + ); + idx++; + } + XieFloExportDrawable(&(*flograph)[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + flo = XieCreatePhotoflo( xp->d, *flograph, flo_elements ); + return( 1 ); +} + +#ifdef WIN32 +#define RAND( x, y ) ( ( rand() / ((RAND_MAX + 1) / 2.0) ) * ( y - x ) + x ) +#else +#if defined(SYSV) || defined(SVR4) || defined(__osf__) +#define random lrand48 +#endif +#ifndef sgi +extern long random(); +#endif +#define RAND( x, y ) ( ( random() / 2147483648.0 ) * ( y - x ) + x ) +#endif + +void DoModifyLong1(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int x, y, i, flo_notify; + + flo_notify = False; + for ( i = 0; i != reps; i++ ) + { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + x = RAND( -64, WIDTH - 64 ); + y = RAND( -32, HEIGHT - 32 ); + XieFloExportDrawable(&flograph[flo_elements - 1], + flo_elements - 1, /* source phototag number */ + xp->w, + xp->fggc, + x, /* x offset in window */ + y /* y offset in window */ + ); + XieModifyPhotoflo( xp->d, flo, flo_elements, + &flograph[flo_elements - 1], 1 ); + XSync( xp->d, 0 ); + } +} + +int EndModifyLong(xp, p) + XParms xp; + Parms p; +{ + FreeModifyLongStuff( xp, p ); +} + +int +FreeModifyLongStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} + +int InitModifyLong2(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XIEimage *image; + + monoflag = 0; + XIEPhotomap = ( XiePhotomap ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + XIELut = ( XieLut ) NULL; + + image = p->finfo.image1; + if ( !image ) + reps = 0; + else if ( xp->screenDepth != image->depth[ 0 ] ) + { + monoflag = 1; + if ( ( XIELut = CreatePointLut( xp, p, 1 << image->depth[ 0 ], + 1 << xp->screenDepth, False ) ) == ( XieLut ) NULL ) + { + reps = 0; + } + } + + if ( reps ) + { + if ( ( XIEPhotomap = GetXIEPhotomap( xp, p, 1 ) ) + == ( XiePhotomap ) NULL ) + { + reps = 0; + } + else if ( !BuildModifyLong2Flograph( xp, p, &flograph ) ) + { + reps = 0; + } + } + if ( !reps ) + FreeModifyLongStuff( xp, p ); + return( reps ); +} + +static int +BuildModifyLong2Flograph( xp, p, flograph ) +XParms xp; +Parms p; +XiePhotoElement **flograph; +{ + int i, idx; + XieProcessDomain domain; + XieConstant constant; + float coeffs[ 6 ]; + int band_mask; + GeometryParms gp; + + idx = 0; + band_mask = 7; + flo_elements = 11; + if ( monoflag ) + flo_elements+=2; + *flograph = XieAllocatePhotofloGraph(flo_elements); + if ( *flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + return( 0 ); + } + + XieFloImportPhotomap(&(*flograph)[idx], XIEPhotomap, False); + idx++; + + /* now, a bunch of silly monadic arithmetic elements */ + + domain.offset_x = 0; + domain.offset_y = 0; + domain.phototag = 0; + + /* just add 1 */ + + constant[ 0 ] = 1.0; + constant[ 1 ] = 0.0; + constant[ 2 ] = 0.0; + + for ( i = 0; i < flo_elements - 3 - ( monoflag ? 2 : 0 ); i++ ) + { + XieFloArithmetic(&(*flograph)[idx], + idx, + 0, + &domain, + constant, + xieValAdd, + band_mask + ); + idx++; + } + + if ( monoflag ) + { + XieFloImportLUT(&(*flograph)[idx], XIELut ); + idx++; + + XieFloPoint(&(*flograph)[idx], + idx - 1, + &domain, + idx, + 0x1 + ); + idx++; + } + + constant[ 0 ] = 0.0; + constant[ 1 ] = 0.0; + constant[ 2 ] = 0.0; + + gp.geoType = GEO_TYPE_CROP; + gp.geoHeight = 64; + gp.geoWidth = 128; + gp.geoXOffset = 0; + gp.geoYOffset = 0; + gp.geoTech = xieValGeomNearestNeighbor; + + SetCoefficients( xp, p, 1, &gp, coeffs ); + XieFloGeometry(&(*flograph)[idx], + idx, + gp.geoWidth, + gp.geoHeight, + coeffs, + constant, + 7, + gp.geoTech, + ( char * ) NULL + ); + idx++; + + XieFloExportDrawable(&(*flograph)[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + flo = XieCreatePhotoflo( xp->d, *flograph, flo_elements ); + return( 1 ); +} + +void DoModifyLong2(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int x, y, i, flo_notify; + GeometryParms gp; + XieConstant constant; + float coeffs[ 6 ]; + + constant[ 0 ] = 0.0; + constant[ 1 ] = 0.0; + constant[ 2 ] = 0.0; + + gp.geoType = GEO_TYPE_CROP; + gp.geoWidth = 128; + gp.geoHeight = 64; + gp.geoTech = xieValGeomNearestNeighbor; + + flo_notify = False; + for ( i = 0; i != reps; i++ ) + { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + x = ( ( int ) RAND( 0, WIDTH ) >> 7 ) << 7; + y = ( ( int ) RAND( 0, HEIGHT ) >> 6 ) << 6; + + gp.geoXOffset = x; + gp.geoYOffset = y; + + SetCoefficients( xp, p, 1, &gp, coeffs ); + XieFloGeometry(&flograph[flo_elements - 2], + flo_elements - 2, + gp.geoWidth, + gp.geoHeight, + coeffs, + constant, + 7, + gp.geoTech, + ( char * ) NULL + ); + + XieFloExportDrawable(&flograph[flo_elements - 1], + flo_elements - 1, /* source phototag number */ + xp->w, + xp->fggc, + x, /* x offset in window */ + y /* y offset in window */ + ); + XieModifyPhotoflo( xp->d, flo, flo_elements - 1, + &flograph[flo_elements - 2], 2 ); + XSync( xp->d, 0 ); + } +} + + diff --git a/xie/xc/programs/xieperf/mtchhist.c b/xie/xc/programs/xieperf/mtchhist.c new file mode 100644 index 0000000..78eb492 --- /dev/null +++ b/xie/xc/programs/xieperf/mtchhist.c @@ -0,0 +1,440 @@ +/* $XConsortium: mtchhist.c,v 1.6 94/04/17 20:39:27 rws Exp $ */ + +/**** module mtchhist.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + mtchhist.c -- match histogram flo element tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ + +#include "xieperf.h" +#include + +static XiePhotomap XIEPhotomap; +static XieRoi XIERoi; +static XieLut XIELut; +static XiePhotomap ControlPlane; + +static XIEimage *image; +static int flo_notify; +static XiePhotoElement *flograph; +static XiePhotoflo flo; +static char *shape_parms; +static XieHistogramData *histos; +static int flo_elements; +static int histo1, histo2; + +extern Window monitorWindow; +extern Window monitor2Window; +extern Window drawableWindow; +extern Bool dontClear; + +int +InitMatchHistogram(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XieProcessDomain domain; + XieHistogramShape shape; + double mean, sigma; + double constant; + Bool shape_factor; + int useDomain; + XieRectangle rect; + int idx; + int src1, src2; + int monoflag; + + XIEPhotomap = ( XiePhotomap ) NULL; + ControlPlane = ( XiePhotomap ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + XIELut = ( XieLut ) NULL; + XIERoi = ( XieRoi ) NULL; + histos = ( XieHistogramData * ) NULL; + shape_parms = ( char * ) NULL; + monoflag = 0; + + useDomain = ( ( MatchHistogramParms * )p->ts )->useDomain; + shape = ( ( MatchHistogramParms * )p->ts )->shape; + + image = p->finfo.image1; + flo_elements = 6; + if ( !image ) + reps = 0; + else + { + histos = ( XieHistogramData * ) + malloc( sizeof( XieHistogramData ) * + ( 1 << image->depth[ 0 ] ) ); + if ( histos == ( XieHistogramData * ) NULL ) + reps = 0; + } + if ( reps ) + { + if ( xp->screenDepth != image->depth[ 0 ] ) + { + flo_elements += 4; + monoflag = 1; + if ( ( XIELut = CreatePointLut( xp, p, + 1 << image->depth[0], + 1 << xp->screenDepth, False ) ) + == ( XieLut ) NULL ) + { + reps = 0; + } + } + } + if ( reps ) + { + if ( useDomain == DomainROI ) + { + flo_elements++; + rect.x = (( MatchHistogramParms *)p->ts )->x; + rect.y = (( MatchHistogramParms *)p->ts )->y; + rect.width = (( MatchHistogramParms *)p->ts )->width; + rect.height = (( MatchHistogramParms *)p->ts )->height; + if ( ( XIERoi = GetXIERoi( xp, p, &rect, 1 ) ) == + ( XieRoi ) NULL ) + { + reps = 0; + } + } + else if ( useDomain == DomainCtlPlane ) + { + flo_elements++; + ControlPlane = GetControlPlane( xp, 2 ); + if ( ControlPlane == ( XiePhotomap ) NULL ) + reps = 0; + } + } + if ( reps ) + { + if ( shape == xieValHistogramFlat ) + shape_parms = ( char * ) NULL; + else if ( shape == xieValHistogramGaussian ) + { + mean = ( ( MatchHistogramParms * )p->ts )->mean; + sigma = ( ( MatchHistogramParms * )p->ts )->sigma; + shape_parms = + (char *)XieTecHistogramGaussian(mean,sigma); + if ( !shape_parms ) + { + fprintf( stderr, "NULL value returned by XieTecHistogramGaussian\n" ); + reps = 0; + } + } + else if ( shape == xieValHistogramHyperbolic ) + { + constant = ( ( MatchHistogramParms * )p->ts )->constant; + shape_factor = + ((MatchHistogramParms *)p->ts)->shape_factor; + shape_parms = (char *) XieTecHistogramHyperbolic( + constant,shape_factor); + if ( !shape_parms ) + { + fprintf( stderr, "NULL value returned by XieTecHistogramGaussian\n" ); + reps = 0; + } + } + else + { + fprintf( stderr, "Invalid histogram technique\n" ); + reps = 0; + } + } + + if ( reps ) + { + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else if ( ( XIEPhotomap = + GetXIEPhotomap( xp, p, 1 ) ) == ( XiePhotomap ) NULL ) + { + reps = 0; + } + else + { + idx = 0; + + domain.offset_x = 0; + domain.offset_y = 0; + domain.phototag = 0; + if ( useDomain == DomainROI ) + { + XieFloImportROI(&flograph[idx], XIERoi); + idx++; + domain.phototag = idx; + } + else if ( useDomain == DomainCtlPlane ) + { + XieFloImportPhotomap(&flograph[idx], + ControlPlane, False); + idx++; + domain.phototag = idx; + } + + XieFloImportPhotomap(&flograph[idx], + XIEPhotomap, False ); + idx++; + src1 = idx; + + XieFloMatchHistogram(&flograph[idx], + src1, + &domain, + shape, + shape_parms + ); + idx++; + src2 = idx; + + XieFloExportClientHistogram(&flograph[idx], + src2, /* source phototag number */ + &domain, + xieValNewData + ); + idx++; + histo1 = idx; + + XieFloExportClientHistogram(&flograph[idx], + src1, /* source phototag number */ + &domain, + xieValNewData + ); + idx++; + histo2 = idx; + + if ( monoflag ) + { + XieFloImportLUT(&flograph[idx], XIELut ); + idx++; + + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + src1, + &domain, + idx, + 0x7 + ); + idx++; + src1 = idx; + } + + if ( monoflag ) + { + XieFloImportLUT(&flograph[idx], XIELut ); + idx++; + + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + src2, + &domain, + idx, + 0x7 + ); + idx++; + src2 = idx; + } + + XieFloExportDrawable(&flograph[idx], + src1, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + idx++; + + XieFloExportDrawable(&flograph[idx], + src2, /* source phototag number */ + drawableWindow, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + idx++; + + flo = XieCreatePhotoflo(xp->d, flograph, flo_elements); + flo_notify = True; + } + } + if ( reps ) + { + XMoveWindow( xp->d, drawableWindow, WIDTH + 10, 0 ); + XMoveWindow( xp->d, monitorWindow, 0, HEIGHT - MONHEIGHT ); + XMoveWindow( xp->d, monitor2Window, WIDTH + 10, + HEIGHT - MONHEIGHT ); + XMapRaised( xp->d, drawableWindow ); + XMapRaised( xp->d, monitor2Window ); + XMapRaised( xp->d, monitorWindow ); + XSync( xp->d, 0 ); + dontClear = True; + } + else + FreeMatchHistogramStuff( xp, p ); + return( reps ); +} + +void +DoMatchHistogram(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ + int i, done, numHistos; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + numHistos = ReadNotifyExportData( xp, p, 0, flo, histo2, + sizeof( XieHistogramData ), 0, (char **) &histos, + &done ) / sizeof( XieHistogramData ); + DrawHistogram( xp, monitorWindow, + ( XieHistogramData * ) histos, + numHistos, 1<< xp->vinfo.depth ); + numHistos = ReadNotifyExportData( xp, p, 0, flo, histo1, + sizeof( XieHistogramData ), 0, (char **) &histos, + &done ) / sizeof( XieHistogramData ); + DrawHistogram( xp, monitor2Window, + ( XieHistogramData * ) histos, + numHistos, 1 << xp->vinfo.depth ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + } +} + +void +EndMatchHistogram(xp, p) +XParms xp; +Parms p; +{ + XUnmapWindow( xp->d, monitorWindow ); + XUnmapWindow( xp->d, monitor2Window ); + XUnmapWindow( xp->d, drawableWindow ); + dontClear = False; + FreeMatchHistogramStuff( xp, p ); +} + +int +FreeMatchHistogramStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } + + if ( ControlPlane != ( XiePhotomap ) NULL && IsPhotomapInCache( ControlPlane ) == False ) + { + XieDestroyPhotomap( xp->d, ControlPlane ); + ControlPlane = ( XiePhotomap ) NULL; + } + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + if ( XIERoi ) + { + XieDestroyROI( xp->d, XIERoi ); + XIERoi = ( XieRoi ) NULL; + } + if ( histos ) + { + free( histos ); + histos = ( XieHistogramData * ) NULL; + } + if ( shape_parms ) + { + XFree( shape_parms ); + shape_parms = ( char * ) NULL; + } +} + diff --git a/xie/xc/programs/xieperf/pasteup.c b/xie/xc/programs/xieperf/pasteup.c new file mode 100644 index 0000000..b98b9d0 --- /dev/null +++ b/xie/xc/programs/xieperf/pasteup.c @@ -0,0 +1,525 @@ +/* $XConsortium: pasteup.c,v 1.9 94/04/17 20:39:27 rws Exp $ */ + +/**** module pasteup.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + pasteup.c -- pasteup flo element tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include + +#define NTILES 16 /* has an integer square root and be a power of 2 */ +#define SPLIT 4 /* square root of NTILES */ + +static int BuildPasteUpFlograph(); + +static XieLut XIELut; +static XiePhotomap XIEPhotomap; +static XiePhotomap segments[NTILES]; +static XieTile tiles[NTILES]; +static XiePhotoElement *flograph; +static XiePhotoflo flo; +static int flo_elements; +static XieConstant constant = { 0.0, 0.0, 0.0 }; + +static int monoflag = 0; + +static int pasteUpIdx; + +int InitPasteUp(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XIEimage *image; + + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + XIELut = ( XieLut ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + InitSegments(); + + image = p->finfo.image1; + if ( !image ) + reps = 0; + + if ( reps ) + { + monoflag = 0; + if ( xp->screenDepth != image->depth[ 0 ] ) + { + monoflag = 1; + if ( ( XIELut = CreatePointLut( xp, p, + 1 << image->depth[0], + 1 << xp->screenDepth, False ) ) + == ( XieLut ) NULL ) + { + reps = 0; + } + } + } + if ( reps ) + { + if ( ( XIEPhotomap = GetXIEPhotomap( xp, p, 1 ) ) == + ( XiePhotomap ) NULL ) + { + reps = 0; + } + + else if ( !SegmentPhotomap( xp, p, XIEPhotomap, + segments, NTILES, SPLIT, image->width[ 0 ], + image->height[ 0 ] ) ) + { + reps = 0; + } + + else if ( !BuildPasteUpFlograph( xp, p, + &flograph, segments, NTILES, SPLIT, image->width[ 0 ], + image->height[ 0 ] ) ) + { + reps = 0; + } + } + if ( !reps ) + FreePasteUpStuff( xp, p ); + return( reps ); +} + +/* cut a photoflo into "size" little pieces. Assumption is that the values + width and height are each congruent to 0 mod size. Caller allocates segvec */ + +int +InitSegments() +{ + int i; + + for ( i = 0; i < NTILES; i++ ) + { + segments[ i ] = ( XiePhotomap ) NULL; + } +} + +int +CloseSegments( xp, p ) +XParms xp; +Parms p; +{ + int i; + + for ( i = 0; i < NTILES; i++ ) + { + if ( segments[ i ] != ( XiePhotomap ) NULL ) + { + XieDestroyPhotomap( xp->d, segments[ i ] ); + segments[ i ] = ( XiePhotomap ) NULL; + } + } +} + +int +SegmentPhotomap( xp, p, pm, segvec, size, split, width, height ) +XParms xp; +Parms p; +XiePhotomap pm; +XiePhotomap segvec[]; +int size; +int split; +int width; +int height; +{ + int xoff, yoff; + int flo_elements; + XiePhotoElement *flograph; + int segidx; + XiePhotospace photospace; + XieEncodeTechnique encode_tech=xieValEncodeServerChoice; + char *encode_param=NULL; + float coefficients[ 6 ]; + int i, retval; + XieGeometryTechnique sample_tech = xieValGeomNearestNeighbor; + char *sample_param = NULL; + unsigned long flo_id; + int piecewide, piecehigh; + + retval = 1; + piecehigh = height / split; + piecewide = width / split; + photospace = XieCreatePhotospace(xp->d); + flo_elements = 3; + flograph = XieAllocatePhotofloGraph(flo_elements); + + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + retval = 0; + } + + /* build the photomaps */ + + if ( retval ) + { + for ( i = 0; i < size; i++ ) + { + if ( ( segments[ i ] = XieCreatePhotomap( xp->d ) ) == + ( XiePhotomap ) NULL ) + { + fprintf( stderr,"XieCreatePhotomap failed\n" ); + retval = 0; + } + } + } + if ( retval ) + { + segidx = 0; + coefficients[ 0 ] = 1.0; + coefficients[ 1 ] = 0.0; + coefficients[ 2 ] = 0.0; + coefficients[ 3 ] = 1.0; + flo_id = 1; + for ( xoff = 0; xoff < width; xoff+= piecewide ) + { + for (yoff = 0;yoff < width;yoff += piecehigh) + { + XieFloImportPhotomap( &flograph[ 0 ], + pm, + False ); + coefficients[ 4 ] = (float) xoff; + coefficients[ 5 ] = (float) yoff; + XieFloGeometry( &flograph[ 1 ], + 1, + piecewide, + piecehigh, + coefficients, + constant, + 7, + sample_tech, + sample_param + ); + XieFloExportPhotomap( &flograph[ 2 ], + 2, + segvec[ segidx++ ], + encode_tech, + encode_param + ); + XieExecuteImmediate(xp->d, photospace, + flo_id, + True, + flograph, /* photoflo specification */ + flo_elements/* number of elements */ + ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, + flo_id, 0, False ); + flo_id++; + } + } + XieFreePhotofloGraph(flograph, flo_elements); + XieDestroyPhotospace(xp->d, photospace); + } + return( retval ); +} + +static int +BuildPasteUpFlograph( xp, p, flograph, segments, size, split, width, height ) +XParms xp; +Parms p; +XiePhotoElement **flograph; +XiePhotomap segments[]; +int size; +int split; +int width; +int height; +{ + int i, flo_elements; + int tile_width, tile_height; + XieProcessDomain domain; + + tile_width = width / split; + tile_height = height / split; + + flo_elements = size + 2; + if ( monoflag ) + flo_elements+=2; + + *flograph = XieAllocatePhotofloGraph(flo_elements); + if ( *flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + return( 0 ); + } + + /* do all of the import photo elements */ + + for ( i = 0; i < size; i++ ) + { + XieFloImportPhotomap(&(*flograph)[i], segments[ i ], False); + } + + /* build all of the tiles, with initial dst_x and dst_y */ + + if ( !BuildMeSomeTiles( tiles, split, tile_width, tile_height, 1, + ( ( PasteUpParms * ) p->ts )->overlap ) ) + return( 0 ); + + /* gee, that was easy */ + + /* now, for the pasteup element */ + + pasteUpIdx = size; + XieFloPasteUp( &(*flograph)[ size ], width, height, constant, tiles, + size ); + + if ( monoflag ) + { + XieFloImportLUT(&(*flograph)[size + 1], XIELut ); + + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&(*flograph)[size + 2], + size + 1, + &domain, + size + 2, + 0x7 + ); + } + + XieFloExportDrawable(&(*flograph)[flo_elements - 1], + flo_elements - 1, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + flo = XieCreatePhotoflo( xp->d, *flograph, flo_elements ); + return( 1 ); +} + +int +BuildMeSomeTiles( tiles, split, width, height, method, overlap ) +XieTile tiles[]; +int split; +int width; +int height; +int method; +int overlap; +{ + int i, j, idx; + + SetTileXY( tiles, split, width, height, method, overlap ); + + idx = 0; + for ( i = 0; i < split; i++ ) + { + for ( j = 0; j < split; j++ ) + { + tiles[ idx ].src = idx + 1; + idx++; + } + } + return( 1 ); +} + +int +SetTileXY( tiles, split, width, height, method, overlap ) +XieTile tiles[]; +int split; +int width; +int height; +int method; +int overlap; +{ + int i, j, idx; + + idx = 0; + if ( method == 0 ) + { + for ( i = 0; i < split; i++ ) + { + for ( j = 0; j < split; j++ ) + { + if ( overlap == Overlap && i == j ) + { + tiles[ idx ].dst_x = i * width - ( width / 2 ); + tiles[ idx ].dst_y = j * height - ( height / 2 ); + } + else + { + tiles[ idx ].dst_x = i * width; + tiles[ idx ].dst_y = j * height; + } + idx++; + } + } + } + else if ( method == 1 ) + { + for ( i = 0; i < split; i++ ) + { + for ( j = 0; j < split; j++ ) + { + if ( overlap == Overlap && i == j ) + { + tiles[ idx ].dst_x = j * width - ( width / 2 ); + tiles[ idx ].dst_y = i * height - ( height / 2 ); + } + else + { + tiles[ idx ].dst_x = j * width; + tiles[ idx ].dst_y = i * height; + } + idx++; + } + } + } +} + +void DoPasteUp(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i, method; + int flo_notify; + XIEimage *image; + int width, height, overlap; + + flo_notify = True; + image = p->finfo.image1; + if ( !image ) + return; + method = 0; + width = image->width[ 0 ]; + height = image->height[ 0 ]; + overlap = ( ( PasteUpParms * ) p->ts )->overlap; + for ( i = 0; i != reps; i++ ) + { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo, 0, False ); + XSync( xp->d, 0 ); + + if ( i < reps ) + { + XieFreePasteUpTiles(&flograph[ pasteUpIdx ] ); + BuildMeSomeTiles( tiles, SPLIT, width / SPLIT, + height / SPLIT, method++, overlap ); + if ( method == 2 ) + method = 0; + XieFloPasteUp( &flograph[ pasteUpIdx ], width, height, + constant, tiles, NTILES ); + XieModifyPhotoflo( xp->d, flo, pasteUpIdx + 1, + &flograph[pasteUpIdx], 1 ); + XSync( xp->d, 0 ); + } + } +} + +int +EndPasteUp(xp, p) + XParms xp; + Parms p; +{ + FreePasteUpStuff( xp, p ); +} + +int +FreePasteUpStuff( xp, p ) +XParms xp; +Parms p; +{ + XieFreePasteUpTiles(&flograph[ pasteUpIdx ] ); + + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } + + CloseSegments( xp, p ); + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} + diff --git a/xie/xc/programs/xieperf/point.c b/xie/xc/programs/xieperf/point.c new file mode 100644 index 0000000..48c89dc --- /dev/null +++ b/xie/xc/programs/xieperf/point.c @@ -0,0 +1,641 @@ +/* $XConsortium: point.c,v 1.10 94/04/17 20:39:28 rws Exp $ */ + +/**** module point.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + point.c -- point flo element tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ + +#include "xieperf.h" +#include + +static int monoflag = 0; + +static XiePhotomap XIEPhotomap; +static XiePhotomap XIEPhotomap2; +static XiePhotomap ControlPlane; +static XieLut XIELut; +static XieLut ClipLut; +static XieRoi XIERoi; + +static int flo_notify; +static XiePhotoElement *flograph; +static XiePhotoflo flo; +static int flo_elements; +static unsigned char *lut; +static XStandardColormap stdCmap; + +int InitPoint(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int lutSize, i, idx; + int src1, src2, levelsIn, levelsOut; + XieEncodeTechnique encode_tech=xieValEncodeServerChoice; + char *encode_params=NULL; + Bool photoDest; + int useDomain; + XieRectangle rect; + unsigned int bandMask; + XieProcessDomain domain; + int decode_notify; + + photoDest = ( ( PointParms * )p->ts )->photoDest; + useDomain = ( ( PointParms * )p->ts )->useDomain; + bandMask = ( ( PointParms * )p->ts )->bandMask; + + flograph = ( XiePhotoElement * ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + XIEPhotomap2 = ( XiePhotomap ) NULL; + ControlPlane = ( XiePhotomap ) NULL; + XIERoi = ( XieRoi ) NULL; + XIELut = ClipLut = ( XieLut ) NULL; + flo = ( XiePhotoflo ) NULL; + + XIEPhotomap2 = XieCreatePhotomap( xp->d ); + if ( XIEPhotomap2 == ( XiePhotomap ) NULL ) + return( 0 ); + monoflag = 0; + levelsIn = (( PointParms * ) p->ts )->levelsIn; + levelsOut = (( PointParms * ) p->ts )->levelsOut; + if ( xp->screenDepth != levelsOut && photoDest == False ) + { + monoflag = 1; + if ( ( ClipLut = CreatePointLut( xp, p, 1 << levelsOut, + 1 << xp->screenDepth, False ) ) == ( XieLut ) NULL ) + { + reps = 0; + } + } + + if ( reps ) + { + flo_elements = 4; + if ( useDomain == DomainROI || useDomain == DomainCtlPlane ) + flo_elements++; + if ( monoflag ) + flo_elements+=2; + + if ( useDomain == DomainROI && levelsIn != levelsOut ) + { + fprintf( stderr, + "levelsIn must equal levelsOut with ROIs\n" ); + reps = 0; + } + } + + lutSize = 1 << levelsIn; + if ( reps ) + { + lut = (unsigned char *) + malloc( lutSize * sizeof( unsigned char ) ); + if ( lut == ( unsigned char * ) NULL ) + reps = 0; + else if ( levelsIn == 1 && levelsOut == 8 ) + { + lut[ 0 ] = 0; + lut[ 1 ] = 255; + } + else if ( levelsIn == 8 && levelsOut == 1 ) + { + for ( i = 0; i < lutSize / 2; i++ ) + { + lut[ i ] = 0; + } + + for ( i = lutSize / 2; i < lutSize; i++ ) + { + lut[ i ] = 1; + } + } + else if ( levelsIn == 8 && levelsOut == 8 ) + { + for ( i = 0; i < lutSize; i++ ) + { + lut[ i ] = ( ( 1 << levelsIn ) - 1 ) - i; + } + } + } + if ( reps ) + { + if ( levelsIn == 1 && IsDISServer() ) + { + XIEPhotomap = GetXIEPointPhotomap( xp, p, 1, 2, False ); + } + else if ( levelsIn == 1 ) + { + XIEPhotomap = GetXIEDitheredPhotomap( xp, p, 1, 2 ); + } + else + { + XIEPhotomap = GetXIEPhotomap( xp, p, 1 ); + } + if ( XIEPhotomap == ( XiePhotomap ) NULL ) + { + reps = 0; + } + } + + if ( reps != 0 ) + { + if ( ( XIELut = GetXIELut( xp, p, lut, lutSize, 1 << levelsOut ) ) + == ( XieLut ) NULL ) + { + reps = 0; + } + } + if ( reps ) + { + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + if ( useDomain == DomainROI ) + { + rect.x = ( ( PointParms * )p->ts )->x; + rect.y = ( ( PointParms * )p->ts )->y; + rect.width = ( ( PointParms * )p->ts )->width; + rect.height = ( ( PointParms * )p->ts )->height; + + if ( ( XIERoi = GetXIERoi( xp, p, &rect, 1 ) ) + == ( XieRoi ) NULL ) + { + reps = 0; + } + } + else if ( useDomain == DomainCtlPlane ) + { + ControlPlane = GetControlPlane( xp, 2 ); + if ( ControlPlane == ( XiePhotomap ) NULL ) + reps = 0; + } + } + } + if ( reps ) + { + idx = 0; + + decode_notify = False; + XieFloImportPhotomap(&flograph[idx], XIEPhotomap, decode_notify); + idx++; + src1 = idx; + + domain.offset_x = 0; + domain.offset_y = 0; + + if ( useDomain == DomainROI ) + { + XieFloImportROI(&flograph[idx], XIERoi); + idx++; + domain.phototag = idx; + } + else if ( useDomain == DomainCtlPlane ) + { + XieFloImportPhotomap(&flograph[idx], ControlPlane, False +); + idx++; + domain.phototag = idx; + } + else + { + domain.phototag = 0; + } + + XieFloImportLUT(&flograph[idx], XIELut ); + idx++; + src2 = idx; + + XieFloPoint(&flograph[idx], + src1, + &domain, + src2, + bandMask + ); + idx++; + + if ( photoDest == False ) + { + if ( monoflag ) + { + /* Point-to-point protocol :-) */ + + XieFloImportLUT(&flograph[idx], ClipLut ); + idx++; + + domain.phototag = 0; + + XieFloPoint(&flograph[idx], + idx - 1, + &domain, + idx, + bandMask + ); + idx++; + } + + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + } + else + { + XieFloExportPhotomap(&flograph[idx], + idx, /* source phototag number */ + XIEPhotomap2, + encode_tech, + encode_params + ); + idx++; + } + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + flo_notify = False; + } + if ( !reps ) + FreePointStuff( xp, p ); + return( reps ); +} + +void DoPoint(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + } +} + +void EndPoint(xp, p) + XParms xp; + Parms p; +{ + FreePointStuff( xp, p ); +} + +int +FreePointStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } + + if ( ControlPlane != ( XiePhotomap ) NULL && IsPhotomapInCache( ControlPlane ) == False ) + { + XieDestroyPhotomap( xp->d, ControlPlane ); + ControlPlane = ( XiePhotomap ) NULL; + } + + if ( XIEPhotomap2 ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap2 ); + XIEPhotomap2 = ( XiePhotomap ) NULL; + } + + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + if ( ClipLut ) + { + XieDestroyLUT( xp->d, ClipLut ); + ClipLut = ( XieLut ) NULL; + } + if ( flograph ) + { + XieFreePhotofloGraph( flograph, flo_elements ); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + if ( lut ) + { + free( lut ); + lut = ( unsigned char * ) NULL; + } +} + +int InitTriplePoint(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int lutSize, idx; + int i, src1, src2; + int useDomain; + XieRectangle rect; + unsigned int bandMask; + XieProcessDomain domain; + int decode_notify; + XieLTriplet levels; + int cclass, ditherTech; + int threshold; + Atom atom; + +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xp->vinfo.c_class; +#else + cclass = xp->vinfo.class; +#endif + if ( cclass != PseudoColor ) + return( 0 ); + if ( xp->vinfo.depth == 1 ) + return( 0 ); + + atom = ( ( TriplePointParms * )p->ts )->atom; + if ( GetStandardColormap( xp, &stdCmap, atom ) == False ) + { + fprintf( stderr, "Couldn't get a standard colormap\n" ); + fflush( stderr ); + return( 0 ); + } + + fprintf( stderr, "Standard cmap found: dithering input to levels %d, %d, %d\n", stdCmap.red_max + 1, stdCmap.green_max + 1, stdCmap.blue_max + 1 ); + fflush( stderr ); + useDomain = ( ( TriplePointParms * )p->ts )->useDomain; + bandMask = ( ( TriplePointParms * )p->ts )->bandMask; + levels[ 0 ] = stdCmap.red_max + 1; + levels[ 1 ] = stdCmap.green_max + 1; + levels[ 2 ] = stdCmap.blue_max + 1; + ditherTech = ( ( TriplePointParms * )p->ts )->ditherTech; + threshold = ( ( TriplePointParms * )p->ts )->threshold; + + flograph = ( XiePhotoElement * ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + ControlPlane = ( XiePhotomap ) NULL; + XIERoi = ( XieRoi ) NULL; + XIELut = ( XieLut ) NULL; + flo = ( XiePhotoflo ) NULL; + + flo_elements = 4; + if ( useDomain == DomainROI || useDomain == DomainCtlPlane ) + flo_elements++; + + lutSize = 1 << xp->vinfo.depth; + if ( reps ) + { + lut = (unsigned char *) + malloc( lutSize * sizeof( unsigned char ) ); + if ( lut == ( unsigned char * ) NULL ) + reps = 0; + + /* build a grayscale ramp lut */ + + for (i=0; its )->x; + rect.y = ( ( TriplePointParms * )p->ts )->y; + rect.width = ( ( TriplePointParms * )p->ts )->width; + rect.height = ( ( TriplePointParms * )p->ts )->height; + + if ( ( XIERoi = GetXIERoi( xp, p, &rect, 1 ) ) + == ( XieRoi ) NULL ) + { + reps = 0; + } + } + else if ( useDomain == DomainCtlPlane ) + { + ControlPlane = GetControlPlane( xp, 2 ); + if ( ControlPlane == ( XiePhotomap ) NULL ) + reps = 0; + } + } + } + if ( reps ) + { + idx = 0; + + decode_notify = False; + XieFloImportPhotomap(&flograph[idx], XIEPhotomap, decode_notify); + idx++; + src1 = idx; + + domain.offset_x = 0; + domain.offset_y = 0; + + if ( useDomain == DomainROI ) + { + XieFloImportROI(&flograph[idx], XIERoi); + idx++; + domain.phototag = idx; + } + else if ( useDomain == DomainCtlPlane ) + { + XieFloImportPhotomap(&flograph[idx], + ControlPlane, False); + idx++; + domain.phototag = idx; + } + else + { + domain.phototag = 0; + } + + XieFloImportLUT(&flograph[idx], XIELut ); + idx++; + src2 = idx; + + XieFloPoint(&flograph[idx], + src1, + &domain, + src2, + bandMask + ); + idx++; + + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + flo_notify = False; + } + if ( !reps ) + FreeTriplePointStuff( xp, p ); + else + InstallThisColormap( xp, stdCmap.colormap ); + return( reps ); +} + +void DoTriplePoint(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + } +} + +void EndTriplePoint(xp, p) + XParms xp; + Parms p; +{ + InstallGrayColormap( xp ); + FreeTriplePointStuff( xp, p ); +} + +int +FreeTriplePointStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } + + if ( ControlPlane != ( XiePhotomap ) NULL && IsPhotomapInCache( ControlPlane ) == False ) + { + XieDestroyPhotomap( xp->d, ControlPlane ); + ControlPlane = ( XiePhotomap ) NULL; + } + + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + if ( flograph ) + { + XieFreePhotofloGraph( flograph, flo_elements ); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + if ( lut ) + { + free( lut ); + lut = ( unsigned char * ) NULL; + } +} diff --git a/xie/xc/programs/xieperf/purgecolst.c b/xie/xc/programs/xieperf/purgecolst.c new file mode 100644 index 0000000..ad8c29d --- /dev/null +++ b/xie/xc/programs/xieperf/purgecolst.c @@ -0,0 +1,116 @@ +/* $XConsortium: purgecolst.c,v 1.5 94/04/17 20:39:29 rws Exp $ */ + +/**** module purgecolst.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + purgecolst.c -- purge color list test + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include + +static XieColorList XIEColorList; + +int InitPurgeColorList(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + /* allocate a color list */ + + if ( !(XIEColorList = XieCreateColorList( xp->d ) ) ) + { + fprintf( stderr, "XieCreateColorList failed\n" ); + reps = 0; + } + return reps; +} + +void DoPurgeColorList(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for ( i = 0; i < reps; i++ ) + { + /* purge the colorlist */ + + XiePurgeColorList( xp->d, XIEColorList ); + } +} + +int EndPurgeColorList(xp, p) + XParms xp; + Parms p; +{ + XieDestroyColorList( xp->d, XIEColorList ); +} + diff --git a/xie/xc/programs/xieperf/query.c b/xie/xc/programs/xieperf/query.c new file mode 100644 index 0000000..36543b7 --- /dev/null +++ b/xie/xc/programs/xieperf/query.c @@ -0,0 +1,447 @@ +/* $XConsortium: query.c,v 1.10 94/04/17 20:39:30 rws Exp $ */ + +/**** module query.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + query.c -- query flo element test + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ + +#include "xieperf.h" +#include + +static XiePhotomap XIEPhotomap; +static XieLut PhotofloTestLut1, PhotofloTestLut2; +static XieColorList XIEColorList; + +static int flo_elements; +static XiePhotoElement *flograph; +static XiePhotoflo flo; + +int InitQueryTechniques(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + return reps; +} + +int InitQueryColorList(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + /* allocate a color list */ + + if ( !(XIEColorList = XieCreateColorList( xp->d ) ) ) + { + fprintf( stderr, "XieCreateColorList failed\n" ); + reps = 0; + } + return reps; +} + +int InitQueryPhotomap(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + if ( ( XIEPhotomap = + GetXIEPhotomap( xp, p, 1 ) ) == ( XiePhotomap ) NULL ) + { + reps = 0; + } + return reps; +} + +int InitQueryPhotoflo(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int lutSize, lutLevels; + unsigned char *lut1, *lut2; + Bool merge; + XieLTriplet start; + + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + lut1 = lut2 = ( unsigned char * ) NULL; + PhotofloTestLut1 = PhotofloTestLut2 = ( XieLut ) NULL; + + flo_elements = 2; + flograph = XieAllocatePhotofloGraph(flo_elements); + lutSize = ( ( QueryParms * ) p->ts )->lutSize; + lutLevels = ( ( QueryParms * ) p->ts )->lutLevels; + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + else + { + lut1 = (unsigned char *) + malloc( lutSize * sizeof( unsigned char ) ); + if ( lut1 == ( unsigned char * ) NULL ) + reps = 0; + else + { + lut2 = (unsigned char *) + malloc( lutSize * sizeof( unsigned char ) ); + if ( lut2 == ( unsigned char * ) NULL ) + { + reps = 0; + } + } + } + + if ( reps ) + { + if ( ( PhotofloTestLut1 = GetXIELut( xp, p, lut1, lutSize, + lutLevels ) ) == ( XieLut ) NULL ) + { + reps = 0; + } + else if ( ( PhotofloTestLut2 = GetXIELut( xp, p, lut2, lutSize, + lutLevels ) ) == ( XieLut ) NULL ) + { + reps = 0; + } + } + + if ( reps ) + { + + XieFloImportLUT(&flograph[0], PhotofloTestLut1 ); + + merge = False; + start[ 0 ] = 0; + start[ 1 ] = 0; + start[ 2 ] = 0; + + XieFloExportLUT(&flograph[1], + 1, /* source phototag number */ + PhotofloTestLut2, + merge, + start + ); + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + } + + if ( !reps ) + FreeQueryPhotofloStuff( xp, p ); + + if ( lut1 ) + free( lut1 ); + if ( lut2 ) + free( lut2 ); + + return reps; +} + +void DoQueryTechniques(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XieTechniqueGroup techGroup; + XieTechnique *techVector; + int j, i, numTech; + + techGroup = ( ( QueryParms * ) p->ts )->techGroup; + + for ( i = 0; i < reps; i++ ) + { + if ( !XieQueryTechniques( xp->d, techGroup, &numTech, + &techVector ) ) + { + fprintf( stderr, "XieQueryTechniques: failed\n" ); + break; + } + + /* this bites */ + + for ( j = 0; j < numTech; j++ ) + { + if ( techVector[ j ].name ) + XFree( techVector[ j ].name ); + } + if ( techVector ) + { + XFree( techVector ); + techVector = ( XieTechnique * ) NULL; + } + } +} + +void DoQueryColorList(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + Colormap cmap; + unsigned int ncolors; + unsigned long *colors; + + for ( i = 0; i < reps; i++ ) + { + colors = ( unsigned long * ) NULL; + if ( !XieQueryColorList( xp->d, XIEColorList, &cmap, + &ncolors, &colors ) ) + { + fprintf( stderr, "XieQueryColorList failed\n" ); + break; + } + + /* for alpha, the colorlist is empty. This will change + later */ + + if ( cmap != ( Colormap ) 0 ) + { + fprintf( stderr, "XieQueryColorList returned non-zero colormap\n" ); + break; + } + if ( ncolors != 0 ) + { + fprintf( stderr, "XieQueryColorList returned non-zero ncolors\n" ); + break; + } + if ( colors != ( unsigned long * ) NULL ) + { + fprintf( stderr, "XieQueryColorList returned non-NULL colorlist\n" ); + break; + } + } +} + +void DoQueryPhotomap(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + XieLTriplet width; + XieLTriplet height; + XieLTriplet levels; + XieDataType data_type; + XieDataClass cclass; + Bool pop, error; + XieDecodeTechnique decode; + XIEimage *image; + + image = p->finfo.image1; + if ( !image ) + return; + + error = False; + for ( i = 0; i < reps && error == False; i++ ) + { + if ( !XieQueryPhotomap( xp->d, XIEPhotomap, &pop, &data_type, + &cclass, &decode, width, height, levels ) ) + { + fprintf( stderr, "XieQueryPhotomap failed\n" ); + fflush( stderr ); + error = True; + } + if ( levels[ 0 ] != image->levels[ 0 ] ) + { + fprintf( stderr, "XieQueryPhotomap levels return invalid should be 0x%x got 0x%x\n", image->levels[ 0 ], levels[ 0 ] ); + fflush( stderr ); + error = True; + } + if ( width[ 0 ] != image->width[ 0 ] ) + { + fprintf( stderr, "XieQueryPhotomap width return invalid should be 0x%x got 0x%x\n", image->width[ 0 ], width[ 0 ] ); + fflush( stderr ); + error = True; + } + if ( height[ 0 ] != image->height[ 0 ] ) + { + fprintf( stderr, "XieQueryPhotomap height return invalid should be 0x%x got 0x%x\n", image->height[ 0 ], height[ 0 ] ); + fflush( stderr ); + error = True; + } + } +} + +void DoQueryPhotoflo(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + XiePhotofloState state; + XiePhototag *expected, *avail; + unsigned int nexpected, navail; + + for ( i = 0; i < reps; i++ ) + { + if ( !XieQueryPhotoflo( xp->d, 0, flo, &state, &expected, + &nexpected, &avail, &navail ) ) + { + fprintf( stderr, "XieQueryPhotoflo failed\n" ); + } + if ( expected ) + { + XFree( expected ); + } + if ( avail ) + { + XFree( avail ); + } + } +} + +int +EndQueryTechniques(xp, p) + XParms xp; + Parms p; +{ +} + +int +EndQueryColorList(xp, p) + XParms xp; + Parms p; +{ + FreeQueryColorListStuff( xp, p ); +} + +int +FreeQueryColorListStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIEColorList ) + { + XieDestroyColorList( xp->d, XIEColorList ); + XIEColorList = ( XieColorList ) NULL; + } +} + +int +EndQueryPhotomap(xp, p) + XParms xp; + Parms p; +{ + FreeQueryPhotomapStuff( xp, p ); +} + +int +FreeQueryPhotomapStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } +} + +int +EndQueryPhotoflo(xp, p) + XParms xp; + Parms p; +{ + FreeQueryPhotofloStuff( xp, p ); +} + +int +FreeQueryPhotofloStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( PhotofloTestLut1 ) + { + XieDestroyLUT( xp->d, PhotofloTestLut1 ); + PhotofloTestLut1 = ( XieLut ) NULL; + } + + if ( PhotofloTestLut2 ) + { + XieDestroyLUT( xp->d, PhotofloTestLut2 ); + PhotofloTestLut2 = ( XieLut ) NULL; + } + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} + + diff --git a/xie/xc/programs/xieperf/redefine.c b/xie/xc/programs/xieperf/redefine.c new file mode 100644 index 0000000..6a37ccb --- /dev/null +++ b/xie/xc/programs/xieperf/redefine.c @@ -0,0 +1,254 @@ +/* $XConsortium: redefine.c,v 1.8 94/04/17 20:39:31 rws Exp $ */ + +/**** module redefine.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + redefine.c -- redefine flo element test + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include + +static int BuildRedefineFlograph(); + +static XiePhotomap XIEPhotomap; +XieLut XIELut; +static int monoflag = 0; +static XiePhotoElement *flograph1; +static XiePhotoElement *flograph2; +static XiePhotoflo flo; +static int flo_elements; +extern Bool dontClear; + +int InitRedefine(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + XIEimage *image; + + XIELut = ( XieLut ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + flo = ( XiePhotoflo ) NULL; + flograph1 = ( XiePhotoElement * ) NULL; + flograph2 = ( XiePhotoElement * ) NULL; + + image = p->finfo.image1; + if ( !image ) + reps = 0; + else + { + monoflag = 0; + if ( xp->screenDepth != image->depth[ 0 ] ) + { + flo_elements = 4; + monoflag = 1; + if ( ( XIELut = CreatePointLut( xp, p, + 1 << image->depth[ 0 ], + 1 << xp->screenDepth, False ) ) == ( XieLut ) NULL ) + { + reps = 0; + } + } + else + flo_elements = 2; + } + if ( reps ) + { + if ( ( XIEPhotomap = + GetXIEPhotomap( xp, p, 1 ) ) == ( XiePhotomap ) NULL ) + reps = 0; + else if ( !BuildRedefineFlograph( xp, p, &flograph1, 0 ) ) + { + reps = 0; + } + else if ( !BuildRedefineFlograph( xp, p, &flograph2, 1 ) ) + { + reps = 0; + } + + /* start off with flograph 1 */ + + flo = XieCreatePhotoflo( xp->d, flograph1, flo_elements ); + } + if ( !reps ) + FreeRedefineStuff( xp, p ); + else + dontClear = False; + return( reps ); +} + +static int +BuildRedefineFlograph( xp, p, flograph, which ) +XParms xp; +Parms p; +XiePhotoElement **flograph; +int which; +{ + XieProcessDomain domain; + + *flograph = XieAllocatePhotofloGraph(flo_elements); + if ( *flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + return( 0 ); + } + + XieFloImportPhotomap(&(*flograph)[0], XIEPhotomap, False); + + domain.offset_x = 0; + domain.offset_y = 0; + domain.phototag = 0; + + if ( monoflag ) + { + XieFloImportLUT(&(*flograph)[1], XIELut ); + + XieFloPoint(&(*flograph)[2], + 1, + &domain, + 2, + 0x1 + ); + } + XieFloExportDrawable(&(*flograph)[flo_elements - 1], + flo_elements - 1, /* source phototag number */ + xp->w, + xp->fggc, + ( which ? 0 : 100 ), /* x offset in window */ + ( which ? 100 : 0 ) /* y offset in window */ + ); + return( 1 ); +} + +void DoRedefine(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + int toggle; + + toggle = 0; + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, False ); + if ( toggle == 0 ) + { + XieRedefinePhotoflo( xp->d, flo, flograph1, flo_elements ); + toggle = 1; + } + else + { + XieRedefinePhotoflo( xp->d, flo, flograph2, flo_elements ); + toggle = 0; + } + XSync( xp->d, 0 ); + } +} + +int +EndRedefine(xp, p) + XParms xp; + Parms p; +{ + dontClear = True; + FreeRedefineStuff( xp, p ); +} + +int +FreeRedefineStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap( xp->d, XIEPhotomap ); + XIEPhotomap = ( XiePhotomap ) NULL; + } + if ( XIELut ) + { + XieDestroyLUT( xp->d, XIELut ); + XIELut = ( XieLut ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + if ( flograph1 ) + { + XieFreePhotofloGraph(flograph1,flo_elements); + flograph1 = ( XiePhotoElement * ) NULL; + } + if ( flograph2 ) + { + XieFreePhotofloGraph(flograph2,flo_elements); + flograph2 = ( XiePhotoElement * ) NULL; + } +} diff --git a/xie/xc/programs/xieperf/rgb.c b/xie/xc/programs/xieperf/rgb.c new file mode 100644 index 0000000..94c9fa4 --- /dev/null +++ b/xie/xc/programs/xieperf/rgb.c @@ -0,0 +1,493 @@ +/* $XConsortium: rgb.c,v 1.7 94/04/17 20:39:31 rws Exp $ */ + +/**** module rgb.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + rgb.c -- ConvertToRGB/ConvertFromRGB flo element tests + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include "xieperf.h" +#include +#include +#include +#include + +static XiePhotomap XIEPhotomap; + +static XiePhotoElement *flograph; +static int flo_notify; +static XiePhotoflo flo; +static int flo_elements; +static int cclass; +static XStandardColormap stdCmap; +static int imageLevels; + +int +InitRGB(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ + static XIEimage *image; + int atom; + + +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xp->vinfo.c_class; +#else + cclass = xp->vinfo.class; +#endif + + if ( xp->screenDepth == 1 ) + return( 0 ); + + /* for now, do this */ + + image = p->finfo.image1; + imageLevels = image->levels[ 0 ]; + + XIEPhotomap = ( XiePhotomap ) NULL; + flograph = ( XiePhotoElement * ) NULL; + flo = ( XiePhotoflo ) NULL; + + if ( IsGrayVisual( cclass ) ) + atom = XA_RGB_GRAY_MAP; + else + atom = XA_RGB_BEST_MAP; + if ( !IsStaticVisual( cclass ) && !IsTrueColorOrDirectColor( cclass ) ) + { + if ( !GetStandardColormap( xp, &stdCmap, atom ) ) + reps = 0; + else + InstallThisColormap( xp, stdCmap.colormap ); + } + else + { + if ( !IsStaticVisual( cclass ) ) + InstallColorColormap( xp ); + CreateStandardColormap( xp, &stdCmap, atom ); + } + + if ( reps ) + { + XIEPhotomap = GetXIETriplePhotomap( xp, p, 1 ); + + if ( XIEPhotomap == ( XiePhotomap ) NULL ) + { + reps = 0; + } + } + if ( reps ) + { + if ( !CreateRGBFlo( xp, p ) ) + { + fprintf( stderr, "Could not create RGB flo\n" ); + reps = 0; + } + } + + if ( !reps ) + { + if ( !IsStaticVisual( cclass ) ) + InstallGrayColormap( xp ); + FreeRGBStuff( xp, p ); + } + return( reps ); +} + +int +CreateRGBFlo( xp, p ) +XParms xp; +Parms p; +{ + RGBParms *rgb = ( RGBParms * )p->ts; + int idx, decode_notify; + int cube; + char *techParms, *colorParm1, *colorParm2; + char *whiteAdjustParm, *gamutParm; + XieRGBToCIELabParam *RGBToCIELabParm; + XieRGBToCIEXYZParam *RGBToCIEXYZParm; + XieRGBToYCbCrParam *RGBToYCbCrParm; + XieRGBToYCCParam *RGBToYCCParm; + XieCIELabToRGBParam *CIELabToRGBParm; + XieCIEXYZToRGBParam *CIEXYZToRGBParm; + XieYCbCrToRGBParam *YCbCrToRGBParm; + XieYCCToRGBParam *YCCToRGBParm; + XieColorspace colorSpace; + XieMatrix toMatrix, fromMatrix; + XieWhiteAdjustTechnique whiteAdjust; + double ycc_scale = 1.402; + XieGamutTechnique gamut; + XieLTriplet levels, hclevels, rgblevels; + XieConstant in_low,in_high; + XieLTriplet out_low,out_high; + char *ditherTech; + int retval; + XieConstant c1; + float bias; + + retval = 1; + idx = 0; + levels[ 0 ] = xp->vinfo.colormap_size; + levels[ 1 ] = xp->vinfo.colormap_size; + levels[ 2 ] = xp->vinfo.colormap_size; + colorSpace = rgb->colorspace; + memcpy( toMatrix, rgb->toMatrix, sizeof( XieMatrix ) ); + memcpy( fromMatrix, rgb->fromMatrix, sizeof( XieMatrix ) ); + whiteAdjust = rgb->whiteAdjust; + gamut = rgb->gamut; + cube = icbrt( xp->vinfo.colormap_size ); + + whiteAdjustParm = ( char * ) NULL; + gamutParm = ( char * ) NULL; + colorParm1 = ( char * ) NULL; + colorParm2 = ( char * ) NULL; + techParms = ( char * ) NULL; + ditherTech = ( char * ) NULL; + + switch (rgb->which) { + case RGB_FF: flo_elements = 8; break; /* + unconstrain, hardclip */ + case RGB_IF: flo_elements = 7; break; /* + clipscale */ + case RGB_II: flo_elements = 6; break; /* baseline */ + } + + flograph = XieAllocatePhotofloGraph( flo_elements ); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + return( 0 ); + } + if ( whiteAdjust ) + { + whiteAdjustParm = (char *) + XieTecWhiteAdjustCIELabShift (rgb->whitePoint); + } + + switch ( colorSpace ) + { + case xieValRGBToCIELab: + RGBToCIELabParm = XieTecRGBToCIELab( + toMatrix, + whiteAdjust, + whiteAdjustParm ); + colorParm1 = ( char * ) RGBToCIELabParm; + break; + case xieValRGBToCIEXYZ: + RGBToCIEXYZParm = XieTecRGBToCIEXYZ( + toMatrix, + whiteAdjust, + whiteAdjustParm ); + colorParm1 = ( char * ) RGBToCIEXYZParm; + break; + case xieValRGBToYCbCr: + rgblevels[0] = rgb->RGBLevels[0]; + rgblevels[1] = rgb->RGBLevels[1]; + rgblevels[2] = rgb->RGBLevels[2]; + RGBToYCbCrParm = XieTecRGBToYCbCr( + /* rgb->RGBLevels */ rgblevels, + (double) rgb->luma[ 0 ], + (double) rgb->luma[ 1 ], + (double) rgb->luma[ 2 ], + rgb->bias ); + colorParm1 = ( char * ) RGBToYCbCrParm; + break; + case xieValRGBToYCC: + rgblevels[0] = rgb->RGBLevels[0]; + rgblevels[1] = rgb->RGBLevels[1]; + rgblevels[2] = rgb->RGBLevels[2]; + RGBToYCCParm = XieTecRGBToYCC( + /* rgb->RGBLevels */ rgblevels, + (double) rgb->luma[ 0 ], + (double) rgb->luma[ 1 ], + (double) rgb->luma[ 2 ], + (double) rgb->scale); + colorParm1 = ( char * ) RGBToYCCParm; + break; + default: + fprintf( stderr, "Unknown colorspace\n" ); + fflush( stderr ); + return( 0 ); + } + + decode_notify = False; + + XieFloImportPhotomap(&flograph[idx],XIEPhotomap,decode_notify); + idx++; + + if (rgb->which == RGB_FF) + { + XieFloUnconstrain( &flograph[idx], idx ); + idx++; + } + + XieFloConvertFromRGB( &flograph[idx], + idx, + colorSpace, + colorParm1 + ); + idx++; + + switch( colorSpace ) + { + case xieValCIELabToRGB: + CIELabToRGBParm = XieTecCIELabToRGB( + fromMatrix, + whiteAdjust, + whiteAdjustParm, + gamut, + gamutParm ); + colorParm2 = ( char * ) CIELabToRGBParm; + break; + case xieValCIEXYZToRGB: + CIEXYZToRGBParm = XieTecCIEXYZToRGB( + fromMatrix, + whiteAdjust, + whiteAdjustParm, + gamut, + gamutParm ); + colorParm2 = ( char * ) CIEXYZToRGBParm; + break; + case xieValYCbCrToRGB: + YCbCrToRGBParm = XieTecYCbCrToRGB( + levels, + (double) rgb->luma[ 0 ], + (double) rgb->luma[ 1 ], + (double) rgb->luma[ 2 ], + rgb->bias, + gamut, + gamutParm ); + colorParm2 = ( char * ) YCbCrToRGBParm; + break; + case xieValYCCToRGB: + YCCToRGBParm = XieTecYCCToRGB( + levels, + (double) rgb->luma[ 0 ], + (double) rgb->luma[ 1 ], + (double) rgb->luma[ 2 ], + ycc_scale, + gamut, + gamutParm ); + colorParm2 = ( char * ) YCCToRGBParm; + break; + default: + fprintf( stderr, "Unknown colorspace\n" ); + fflush( stderr ); + retval = 0; + goto out; + } + + XieFloConvertToRGB( &flograph[idx], + idx, + colorSpace, + colorParm2 + ); + idx++; + + techParms = ( char * ) NULL; + if (rgb->which == RGB_FF ) + { + /* or perhaps clipscale with in_high == 255.0 */ + + hclevels[ 0 ] = imageLevels; + hclevels[ 1 ] = imageLevels; + hclevels[ 2 ] = imageLevels; + + XieFloConstrain( &flograph[idx], + idx, + hclevels, + xieValConstrainHardClip, + techParms + ); + idx++; + } + else if (rgb->which == RGB_IF) + { + in_low[ 0 ] = in_low[ 1 ] = in_low[ 2 ] = 0.0; + in_high[ 0 ] = in_high[ 1 ] = in_high[ 2 ] = 1.0; + out_low[ 0 ] = out_low[ 1 ] = out_low[ 2 ] = 0; + + out_high[ 0 ] = ( xp->vinfo.colormap_size ) - 1; + out_high[ 1 ] = ( xp->vinfo.colormap_size ) - 1; + out_high[ 2 ] = ( xp->vinfo.colormap_size ) - 1; + + techParms = (char *) ( XieClipScaleParam * ) + XieTecClipScale( in_low, in_high, out_low, out_high); + + hclevels[ 0 ] = out_high[ 0 ] + 1; + hclevels[ 1 ] = out_high[ 1 ] + 1; + hclevels[ 2 ] = out_high[ 2 ] + 1; + XieFloConstrain( &flograph[idx], + idx, + hclevels, + xieValConstrainClipScale, + techParms + ); + idx++; + } + + if ( IsTrueColorOrDirectColor( cclass ) ) + { + levels[ 0 ] = TripleTrueOrDirectLevels( xp ); + levels[ 1 ] = levels[ 2 ] = levels[ 0 ]; + } + else + { + levels[ 0 ] = stdCmap.red_max + 1; + levels[ 1 ] = stdCmap.green_max + 1; + levels[ 2 ] = stdCmap.blue_max + 1; + } + + ditherTech = ( char * ) NULL; + XieFloDither( &flograph[ idx ], + idx, + 0x7, + levels, + xieValDitherErrorDiffusion, + ( char * ) ditherTech + ); + idx++; + + c1[ 0 ] = stdCmap.red_mult; + c1[ 1 ] = stdCmap.green_mult; + c1[ 2 ] = stdCmap.blue_mult; + bias = ( float ) stdCmap.base_pixel; + + XieFloBandExtract(&flograph[idx], idx, 1 << xp->vinfo.depth, bias, c1); + idx++; + + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + idx++; + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + XSync( xp->d, 0 ); +out: + if ( whiteAdjustParm ) + XFree( whiteAdjustParm ); + if ( colorParm1 ) + XFree( colorParm1 ); + if ( colorParm2 ) + XFree( colorParm2 ); + if ( techParms ) + XFree( techParms ); + if ( ditherTech ) + XFree( ditherTech ); + flo_notify = False; + return( retval ); +} + +void +DoRGB(xp, p, reps) +XParms xp; +Parms p; +int reps; +{ + int i; + + for ( i = 0; i < reps; i++ ) + { + XieExecutePhotoflo(xp->d, flo, flo_notify ); + } +} + +void EndRGB(xp, p) +XParms xp; +Parms p; +{ + InstallGrayColormap( xp ); + FreeRGBStuff( xp, p ); +} + +int +FreeRGBStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap(xp->d, XIEPhotomap); + XIEPhotomap = ( XiePhotomap ) NULL; + } + + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } +} diff --git a/xie/xc/programs/xieperf/tests.c b/xie/xc/programs/xieperf/tests.c new file mode 100644 index 0000000..c542357 --- /dev/null +++ b/xie/xc/programs/xieperf/tests.c @@ -0,0 +1,3860 @@ +/* $XConsortium: tests.c,v 1.14 94/04/17 20:39:34 rws Exp $ */ + +/**** module tests.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + tests.c -- test configuration + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ +#include /* for stderr */ +#include "xieperf.h" + +extern Bool InitImportPhoto(); +extern Bool InitImportPhotoExportDrawable(); +extern Bool InitConvertToIndex(); +extern Bool InitImportLUT(); +extern Bool InitImportROI(); +extern Bool InitPurgeColorList(); +extern Bool InitDither(); +extern Bool InitImportDrawablePixmap(); +extern Bool InitImportDrawableWindow(); +extern Bool InitImportDrawablePlanePixmap(); +extern Bool InitImportDrawablePlaneWindow(); +extern Bool InitQueryTechniques(); +extern Bool InitQueryColorList(); +extern Bool InitQueryPhotomap(); +extern Bool InitQueryPhotoflo(); +extern Bool InitPasteUp(); +extern Bool InitGeometry(); +extern Bool InitGeometryFAX(); +extern Bool InitAbort(); +extern Bool InitAwait(); +extern Bool InitMatchHistogram(); +extern Bool InitCreateDestroyPhotoflo(); +extern Bool InitCreateDestroy(); +extern Bool InitConstrain(); +extern Bool InitUnconstrain(); +extern Bool InitFunnyEncode(); +extern Bool InitPoint(); +extern Bool InitTriplePoint(); +extern Bool InitModifyLong1(); +extern Bool InitModifyLong2(); +extern Bool InitModifyROI(); +extern Bool InitModifyPoint(); +extern Bool InitModifySimple(); +extern Bool InitRedefine(); +extern Bool InitBlend(); +extern Bool InitLogical(); +extern Bool InitImportClientPhoto(); +extern Bool InitImportClientPhotoExportDrawable(); +extern Bool InitImportClientLUT(); +extern Bool InitImportClientROI(); +extern Bool InitExportClientPhoto(); +extern Bool InitExportClientLUT(); +extern Bool InitExportClientROI(); +extern Bool InitExportClientHistogram(); +extern Bool InitRGB(); +extern Bool InitCompare(); +extern Bool InitEvents(); +extern Bool InitErrors(); +extern Bool InitCoreErrors(); +extern Bool InitFloErrors(); +extern Bool InitArithmetic(); +extern Bool InitMath(); +extern Bool InitConvolve(); +extern Bool InitBandSelectExtract(); +extern Bool InitBandCombine(); +extern Bool InitBandColormap(); +extern Bool InitEncodePhotomap(); +extern Bool InitComplex(); +extern void DoConvertToIndex(); +extern void DoCreateDestroyColorList(); +extern void DoCreateDestroyLUT(); +extern void DoCreateDestroyPhotomap(); +extern void DoCreateDestroyROI(); +extern void DoCreateDestroyPhotospace(); +extern void DoCreateDestroyPhotoflo(); +extern void DoRGB(); +extern void DoCompare(); +extern void DoMath(); +extern void DoImportObscuredEvent(); +extern void DoDecodeNotifyEvent(); +extern void DoExportAvailableEvent(); +extern void DoPhotofloDoneEvent(); +extern void DoColorAllocEvent(); +extern void DoArithmetic(); +extern void DoConvolve(); +extern void DoMatchHistogram(); +extern void DoAbort(); +extern void DoAwait(); +extern void DoGeometry(); +extern void DoGeometryFAX(); +extern void DoPasteUp(); +extern void DoUnconstrain(); +extern void DoConstrain(); +extern void DoDither(); +extern void DoFunnyEncode(); +extern void DoPoint(); +extern void DoTriplePoint(); +extern void DoBlend(); +extern void DoLogical(); +extern void DoImportPhoto(); +extern void DoImportLUT(); +extern void DoImportROI(); +extern void DoExportClientPhotoCSum(); +extern void DoExportClientPhoto(); +extern void DoExportClientHistogram(); +extern void DoExportClientLUT(); +extern void DoExportClientROI(); +extern void DoImportDrawablePixmap(); +extern void DoImportDrawableWindow(); +extern void DoImportDrawablePlanePixmap(); +extern void DoImportDrawablePlaneWindow(); +extern void DoImportClientPhoto(); +extern void DoImportClientLUT(); +extern void DoImportClientROI(); +extern void DoQueryTechniques(); +extern void DoQueryColorList(); +extern void DoQueryPhotomap(); +extern void DoQueryPhotoflo(); +extern void DoPurgeColorList(); +extern void DoModifyLong1(); +extern void DoModifyLong2(); +extern void DoModifyROI(); +extern void DoModifyPoint(); +extern void DoModifySimple(); +extern void DoRedefine(); +extern void DoBand(); +extern void DoErrors(); +extern void DoBadValueError(); +extern void DoFloElementError(); +extern void DoFloTechniqueError(); +extern void DoLUTError(); +extern void DoPhotomapError(); +extern void DoROIError(); +extern void DoPhotospaceError(); +extern void DoFloIDError(); +extern void DoFloErrorImmediate(); +extern void DoColorListError(); +extern void DoEncodePhotomap(); +extern void DoEncodeClientPhotomap(); +extern void DoComplex(); +extern void EndConvertToIndex(); +extern void EndRGB(); +extern void EndConvolve(); +extern void EndCompare(); +extern void EndMath(); +extern void EndArithmetic(); +extern void EndPasteUp(); +extern void EndGeometry(); +extern void EndGeometryFAX(); +extern void EndConstrain(); +extern void EndUnconstrain(); +extern void EndFunnyEncode(); +extern void EndPoint(); +extern void EndTriplePoint(); +extern void EndEvents(); +extern void EndFloErrors(); +extern void EndCoreErrors(); +extern void EndErrors(); +extern void EndBlend(); +extern void EndLogical(); +extern void EndImportClientPhoto(); +extern void EndImportClientLUT(); +extern void EndImportClientROI(); +extern void EndExportClientHistogram(); +extern void EndExportClientPhoto(); +extern void EndExportClientLUT(); +extern void EndExportClientROI(); +extern void EndImportPhoto(); +extern void EndImportLUT(); +extern void EndImportROI(); +extern void EndDither(); +extern void EndCreateDestroy(); +extern void EndCreateDestroyPhotoflo(); +extern void EndImportDrawablePixmap(); +extern void EndImportDrawableWindow(); +extern void EndQueryTechniques(); +extern void EndQueryColorList(); +extern void EndQueryPhotomap(); +extern void EndQueryPhotoflo(); +extern void EndPurgeColorList(); +extern void EndMatchHistogram(); +extern void EndAbort(); +extern void EndAwait(); +extern void EndModifyLong(); +extern void EndModifyROI(); +extern void EndModifyPoint(); +extern void EndModifySimple(); +extern void EndRedefine(); +extern void EndBandSelectExtract(); +extern void EndBandCombine(); +extern void EndBandColormap(); +extern void EndEncodePhotomap(); +extern void EndComplex(); + +static XIEimage ImageInfo[] = { + { "image.001", 0, xieValSingleBand, { 512, 0, 0 }, + { 512, 0, 0 }, { 8, 0, 0 }, { 256, 0, 0 }, + xieValDecodeUncompressedSingle, + xieValLSFirst, xieValLSFirst, { 8, 0, 0 }, { 4, 0, 0 }, + { 0, 0, 0 }, 0, 0, 0, ( char * ) NULL }, + { "image.002", 0, xieValSingleBand, { 512, 0, 0 }, + { 512, 0, 0 }, { 8, 0, 0 }, { 256, 0, 0 }, + xieValDecodeUncompressedSingle, + xieValLSFirst, xieValLSFirst, { 8, 0, 0 }, { 4, 0, 0 }, + { 0, 0, 0 }, 0, 0, 0, ( char * ) NULL }, + { "image.003", 0, xieValSingleBand, { 512, 0, 0 }, + { 512, 0, 0 }, { 8, 0, 0 }, { 256, 0, 0 }, + xieValDecodeUncompressedSingle, + xieValLSFirst, xieValLSFirst, { 8, 0, 0 }, { 4, 0, 0 }, + { 0, 0, 0 }, 0, 0, 0, ( char * ) NULL }, + { "image.004", 0, xieValTripleBand, { 336, 336, 336 }, + { 270, 270, 270 }, { 8, 8, 8 }, { 256, 256, 256 }, + xieValDecodeUncompressedTriple, + xieValLSFirst, xieValLSFirst, { 24, 24, 24 }, { 0, 0, 0 }, + { 0, 0, 0 }, xieValBandByPixel, 0, 0, ( char * ) NULL }, + { "image.005", 0, xieValSingleBand, { 2560, 0, 0 }, + { 3300, 0, 0 }, { 1, 0, 0 }, { 2, 0, 0 }, xieValDecodeG42D, + xieValLSFirst, xieValLSFirst, { 8, 0, 0 }, { 4, 0, 0 }, + { 0, 0, 0 }, 0, 0, 0, ( char * ) NULL }, + { "image.006", 0, xieValSingleBand, { 512, 0, 0 }, { 512, 0, 0 }, + { 8, 0, 0 }, { 256, 0, 0 }, xieValDecodeUncompressedSingle, + xieValLSFirst, xieValLSFirst, { 8, 0, 0 }, { 4, 0, 0 }, + { 0, 0, 0 }, 0, 0, 0, ( char * ) NULL }, + { "image.007", 0, xieValSingleBand, { 1728, 0, 0 }, { 2180, 0, 0 }, + { 1, 0, 0 }, { 2, 0, 0 }, xieValDecodeG32D, + xieValMSFirst, xieValLSFirst, { 1, 0, 0 }, { 0, 0, 0 }, + { 0, 0, 0 }, 0, 0, 0, ( char * ) NULL }, + { "image.008", 0, xieValSingleBand, { 1728, 0, 0 }, + { 2180, 0, 0 }, { 1, 0, 0 }, { 2, 0, 0 }, + xieValDecodeG31D, xieValMSFirst, xieValLSFirst, + { 1, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, + 0, 0, 0, ( char * ) NULL }, + { "image.009", 0, xieValSingleBand, { 1728, 0, 0 }, { 2180, 0, 0 }, + { 1, 0, 0 }, { 2, 0, 0 }, xieValDecodeTIFFPackBits, + xieValMSFirst, xieValLSFirst, { 1, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, + 0, 0, 0, ( char * ) NULL }, + { "image.010", 0, xieValSingleBand, { 1728, 0, 0 }, { 2180, 0, 0 }, + { 1, 0, 0 }, { 2, 0, 0 }, xieValDecodeTIFF2, + xieValMSFirst, xieValLSFirst, { 1, 0, 0 }, { 0, 0, 0 }, + { 0, 0, 0 }, 0, 0, 0, ( char * ) NULL }, + { "image.011", 0, xieValTripleBand, { 270, 270, 270 }, + { 450, 450, 450 }, { 8, 8, 8 }, { 256, 256, 256 }, + xieValDecodeUncompressedTriple, xieValLSFirst, xieValLSFirst, + { 24, 24, 24 }, { 0, 0, 0 }, { 0, 0, 0 }, + xieValBandByPixel, xieValLSFirst, 0, ( char * ) NULL }, + { "image.012", 0, xieValTripleBand, { 512, 512, 512 }, + { 512, 512, 512 }, { 8, 8, 8 }, { 256, 256, 256 }, + xieValDecodeUncompressedTriple, xieValLSFirst, xieValLSFirst, + { 8, 8, 8 }, { 0, 0, 0 }, { 0, 0, 0 }, + xieValBandByPlane, xieValLSFirst, 0, ( char * ) NULL }, + { "image.013", 0, xieValSingleBand, { 512, 0, 0 }, + { 512, 0, 0 }, { 8, 0, 0 }, { 256, 0, 0 }, + xieValDecodeUncompressedSingle, + xieValLSFirst, xieValLSFirst, { 8, 0, 0 }, { 4, 0, 0 }, + { 0, 0, 0 }, 0, 0, 0, ( char * ) NULL }, + { "image.014", 0, xieValSingleBand, { 1728, 0, 0 }, + { 2180, 0, 0 }, { 1, 0, 0 }, { 2, 0, 0 }, + xieValDecodeG32D, xieValMSFirst, xieValLSFirst, + { 1, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, + 0, 0, 0, ( char * ) NULL }, +}; + +XIEimage * +GetImageStruct( which ) +int which; +{ + int size; + + size = sizeof( ImageInfo ) / sizeof( XIEimage ); + if ( which > size || which <= 0 ) + { + fprintf( stderr, "GetImageData: invalid ``which''\n" ); + fflush( stderr ); + return( ( XIEimage * ) NULL ); + } + else + { + return( &ImageInfo[ which - 1 ] ); + } +} + +void +ReclaimPhotomapMemory() +{ + int i; + + for ( i = 0; i < sizeof( ImageInfo ) / sizeof( XIEimage ); i++ ) + if ( ImageInfo[ i ].data != ( char * ) NULL ) + { + free( ImageInfo[ i ].data ); + ImageInfo[ i ].data = ( char * ) NULL; + } +} + +static MatchHistogramParms MatchHistogramParmVec[] = + { +/* tech, mean, sigma, constant, shape_factor, followed by ROI stuff */ + { xieValHistogramFlat, 0.0, 0.0, 0.0, True, DomainNone, 0, 0, 0, 0 }, + { xieValHistogramGaussian, 63.0, 32.0, 0.0, True, DomainNone, 0, 0, 0, 0 }, + { xieValHistogramGaussian, 128.0, 64.0, 0.0, True, DomainNone, 0, 0, 0, 0 }, + { xieValHistogramGaussian, 192.0, 32.0, 0.0, True, DomainNone, 0, 0, 0, 0 }, + { xieValHistogramHyperbolic, 0.0, 0.0, 64.0, True, DomainNone, 0, 0, 0, 0 }, + { xieValHistogramHyperbolic, 0.0, 0.0, 64.0, False, DomainNone, 0, 0, 0, 0 }, + { xieValHistogramFlat, 0.0, 0.0, 0.0, True, DomainROI, 50, 50, 150, 150 }, + { xieValHistogramGaussian, 63.0, 32.0, 0.0, True, DomainROI, 50, 50, 150, 150 }, + { xieValHistogramGaussian, 128.0, 64.0, 0.0, True, DomainROI, 50, 50, 150, 150 }, + { xieValHistogramGaussian, 192.0, 32.0, 0.0, True, DomainROI, 50, 50, 150, 150 }, + { xieValHistogramHyperbolic, 0.0, 0.0, 64.0, True, DomainROI, 50, 50, 150, 150 }, + { xieValHistogramHyperbolic, 0.0, 0.0, 64.0, False, DomainROI, 50, 50, 150, 150 }, + { xieValHistogramFlat, 0.0, 0.0, 0.0, True, DomainCtlPlane, 0, 0, 0, 0 }, + { xieValHistogramGaussian, 63.0, 32.0, 0.0, True, DomainCtlPlane, 0, 0, 0, 0 }, + { xieValHistogramGaussian, 128.0, 64.0, 0.0, True, DomainCtlPlane, 0, 0, 0, 0 }, + { xieValHistogramGaussian, 192.0, 32.0, 0.0, True, DomainCtlPlane, 0, 0, 0, 0 }, + { xieValHistogramHyperbolic, 0.0, 0.0, 64.0, True, DomainCtlPlane, 0, 0, 0, 0 }, + { xieValHistogramHyperbolic, 0.0, 0.0, 64.0, False, DomainCtlPlane, 0, 0, 0, 0 }, + }; + +static RedefineParms RedefineParmVec[] = { + { { 0.0, 0.0, 0.0 }, 7, GXor, GXnor } + }; + +static ModifyParms ModifyParmVec[] = { + { { 0.0, 0.0, 0.0 }, 7, GXinvert } + }; + +static CvtToIndexParms CvtToIndexParmVec[] = { + { xieValDitherDefault, True, False, False }, + { xieValDitherDefault, True, False, True } + }; + +static ImportClParms ImportClParmVec[] = { + { 10 }, + { 100 } + }; + +static ErrorParms ErrorParmVec[] = { + { xieErrNoLUT }, + { xieErrNoPhotoflo }, + { xieErrNoFloLUT }, + { xieErrNoPhotomap }, + { xieErrNoROI }, + { xieErrNoColorList }, + { xieErrNoPhotospace }, + { xieErrNoFloAccess }, + { BadAccess }, + { BadAlloc }, + { BadIDChoice }, + { BadValue }, + { xieErrNoFloROI }, + { xieErrNoFloID }, + { xieErrNoFloOperator }, + { xieErrNoFloSource }, + { xieErrNoFloPhotomap }, + { xieErrNoFloDrawable }, + { xieErrNoFloGC }, + { xieErrNoFloElement }, + { xieErrNoFloColorList }, + { xieErrNoFloDomain }, + { xieErrNoFloColormap }, + { xieErrNoFloMatch }, + { xieErrNoFloTechnique }, + { xieErrNoFloValue }, + }; + +static EventParms EventParmVec[] = { + { xieEvnNoColorAlloc }, + { xieEvnNoDecodeNotify }, + { xieEvnNoImportObscured }, + { xieEvnNoPhotofloDone }, + { xieEvnNoExportAvailable } + }; + +static ExportClParms ExportClParmVec[] = { + { 10, DomainNone, 0, 0, 0, 0 }, + { 100, DomainNone, 0, 0, 0, 0 }, + { 0, DomainROI, 50, 50, 100, 100 }, + { 0, DomainCtlPlane, 0, 0, 0, 0 }, + }; + +#define GAMUT_NULL (XieGamutTechnique)NULL +#define WHITE_NONE (XieWhiteAdjustTechnique)xieValWhiteAdjustNone +#define WHITE_DEFAULT (XieWhiteAdjustTechnique)xieValWhiteAdjustDefault +#define WHITE_LAB (XieWhiteAdjustTechnique)xieValWhiteAdjustCIELabShift +#define LUMA_CCIR601_1 { 0.299 , 0.587 , 0.114 } +#define LUMA_CCIR709 { 0.2125, 0.7154, 0.0721 } +#define LUMA_IGNORE { 0.0 , 0.0 , 0.0 } +#define LUMA_ONES { 1.0 , 1.0 , 1.0 } +#define WP_IGNORE { 0.0 , 0.0 , 0.0 } +#define WP_BUNCH { 0.8 , 0.9 , 1.2 } +#define BIAS_NONE { 0.0 , 0.0 , 0.0 } +#define BIAS_SANE { 0.0 , 127.0 , 127.0 } +#define BIAS_CRAZY { 0.0 , 31.0 , 7.0 } +#define LEVEL_SANE { 256, 256, 256 } +#define LEVEL_CRAZY { 1024, 64, 16 } +#define YCC_SCALE1 1.402 +#define YCC_SCALE2 1.3584 +#define MAT_IGNORE { 0.0, 0.0, 0.0, \ + 0.0, 0.0, 0.0, \ + 0.0, 0.0, 0.0 } +#define MAT_TOXYZ { 0.49, 0.31, 0.20, \ + 0.177, 0.813, 0.011, \ + 0.0, 0.010, 0.99 } +#define MAT_TORGB { 2.364022, -0.896193, -0.467304, \ + -0.514743, 1.426476, 0.088548, \ + 0.005399, -0.014571, 1.009324 } + +static RGBParms RGBParmVec[] = { +{ xieValCIELabToRGB, RGB_FF, + MAT_TOXYZ, MAT_TORGB, WHITE_NONE, WP_IGNORE, xieValGamutNone, + LEVEL_SANE, LUMA_IGNORE, BIAS_NONE, YCC_SCALE1 }, + +{ xieValCIELabToRGB, RGB_FF, + MAT_TOXYZ, MAT_TORGB, WHITE_LAB, WP_BUNCH, xieValGamutNone, + LEVEL_SANE, LUMA_IGNORE, BIAS_NONE, YCC_SCALE1 }, + +{ xieValCIELabToRGB, RGB_IF, + MAT_TOXYZ, MAT_TORGB, WHITE_NONE, WP_IGNORE, xieValGamutNone, + LEVEL_SANE, LUMA_IGNORE, BIAS_NONE, YCC_SCALE1 }, + +{ xieValCIELabToRGB, RGB_IF, + MAT_TOXYZ, MAT_TORGB, WHITE_LAB, WP_BUNCH, xieValGamutNone, + LEVEL_SANE, LUMA_IGNORE, BIAS_NONE, YCC_SCALE1 }, + +{ xieValCIEXYZToRGB, RGB_FF, + MAT_TOXYZ, MAT_TORGB, WHITE_NONE, WP_IGNORE, xieValGamutNone, + LEVEL_SANE, LUMA_IGNORE, BIAS_NONE, YCC_SCALE1 }, + +{ xieValCIEXYZToRGB, RGB_FF, + MAT_TOXYZ, MAT_TORGB, WHITE_LAB, WP_BUNCH, xieValGamutNone, + LEVEL_SANE, LUMA_IGNORE, BIAS_NONE, YCC_SCALE1 }, + +{ xieValCIEXYZToRGB, RGB_IF, + MAT_TOXYZ, MAT_TORGB, WHITE_NONE, WP_IGNORE, xieValGamutNone, + LEVEL_SANE, LUMA_IGNORE, BIAS_NONE, YCC_SCALE1 }, + +{ xieValCIEXYZToRGB, RGB_IF, + MAT_TOXYZ, MAT_TORGB, WHITE_LAB, WP_BUNCH, xieValGamutNone, + LEVEL_SANE, LUMA_IGNORE, BIAS_NONE, YCC_SCALE1 }, + +{ xieValYCbCrToRGB, RGB_FF, + MAT_IGNORE, MAT_IGNORE, WHITE_NONE, WP_IGNORE, xieValGamutNone, + LEVEL_SANE, LUMA_CCIR601_1, BIAS_NONE, YCC_SCALE1 }, + +{ xieValYCbCrToRGB, RGB_II, + MAT_IGNORE, MAT_IGNORE, WHITE_NONE, WP_IGNORE, xieValGamutNone, + LEVEL_SANE, LUMA_CCIR601_1, BIAS_SANE, YCC_SCALE1 }, + +{ xieValYCbCrToRGB, RGB_II, + MAT_IGNORE, MAT_IGNORE, WHITE_NONE, WP_IGNORE, xieValGamutNone, + LEVEL_CRAZY, LUMA_CCIR601_1, BIAS_CRAZY, YCC_SCALE1 }, + +{ xieValYCbCrToRGB, RGB_II, + MAT_IGNORE, MAT_IGNORE, WHITE_NONE, WP_IGNORE, xieValGamutNone, + LEVEL_SANE, LUMA_CCIR709, BIAS_SANE, YCC_SCALE1 }, + +{ xieValYCCToRGB, RGB_FF, + MAT_IGNORE, MAT_IGNORE, WHITE_NONE, WP_IGNORE, xieValGamutNone, + LEVEL_SANE, LUMA_CCIR601_1, BIAS_NONE, YCC_SCALE1 }, + +{ xieValYCCToRGB, RGB_II, + MAT_IGNORE, MAT_IGNORE, WHITE_NONE, WP_IGNORE, xieValGamutNone, + LEVEL_SANE, LUMA_CCIR601_1, BIAS_NONE, YCC_SCALE1 }, + +{ xieValYCCToRGB, RGB_II, + MAT_IGNORE, MAT_IGNORE, WHITE_NONE, WP_IGNORE, xieValGamutNone, + LEVEL_CRAZY, LUMA_CCIR601_1, BIAS_NONE, YCC_SCALE1 }, + +{ xieValYCCToRGB, RGB_II, + MAT_IGNORE, MAT_IGNORE, WHITE_NONE, WP_IGNORE, xieValGamutNone, + LEVEL_SANE, LUMA_CCIR601_1, BIAS_NONE, YCC_SCALE2 }, + + }; + +static UnconstrainParms UnconstrainParmVec[] = { + { xieValConstrainClipScale } + }; + +static BandParms BandParmVec[] = { +{ { 1.0, 0.0, 0.0 }, { 0.0, 1.0, 0.0 }, { 0.0, 0.0, 1.0 }, BandSelect, 0.0, ( Atom ) NULL, False }, +{ LUMA_CCIR601_1, LUMA_CCIR601_1, LUMA_CCIR601_1, BandExtract, 0.0, ( Atom ) NULL, False }, +{ LUMA_CCIR601_1, LUMA_CCIR601_1, LUMA_CCIR601_1, BandExtract, 0.0, ( Atom ) NULL, False }, +{ LUMA_CCIR601_1, LUMA_CCIR601_1, LUMA_CCIR601_1, BandExtract, 0.0, ( Atom ) NULL, False }, +{ { 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0 }, BandExtract, 0.0, ( Atom ) XA_RGB_BEST_MAP, True }, +{ { 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0 }, BandExtract, 0.0, ( Atom ) XA_RGB_DEFAULT_MAP, True }, + }; + +static CompareParms CompareParmVec[] = { + { xieValLT, { 128.0, 0.0, 0.0 }, True, 7, DomainNone, 0, 0, 0, 0 }, + { xieValLE, { 128.0, 0.0, 0.0 }, True, 7, DomainNone, 0, 0, 0, 0 }, + { xieValEQ, { 128.0, 0.0, 0.0 }, True, 7, DomainNone, 0, 0, 0, 0 }, + { xieValNE, { 128.0, 0.0, 0.0 }, True, 7, DomainNone, 0, 0, 0, 0 }, + { xieValGE, { 128.0, 0.0, 0.0 }, True, 7, DomainNone, 0, 0, 0, 0 }, + { xieValGT, { 128.0, 0.0, 0.0 }, True, 7, DomainNone, 0, 0, 0, 0 }, + { xieValLT, { 128.0, 0.0, 0.0 }, True, 7, DomainROI, 100, 100, 256, 256 }, + { xieValLE, { 128.0, 0.0, 0.0 }, True, 7, DomainROI, 100, 100, 256, 256 }, + { xieValEQ, { 128.0, 0.0, 0.0 }, True, 7, DomainROI, 100, 100, 256, 256 }, + { xieValNE, { 128.0, 0.0, 0.0 }, True, 7, DomainROI, 100, 100, 256, 256 }, + { xieValGE, { 128.0, 0.0, 0.0 }, True, 7, DomainROI, 100, 100, 256, 256 }, + { xieValGT, { 128.0, 0.0, 0.0 }, True, 7, DomainROI, 100, 100, 256, 256 }, + { xieValLT, { 128.0, 0.0, 0.0 }, True, 7, DomainCtlPlane, 0, 0, 0, 0 }, + { xieValLE, { 128.0, 0.0, 0.0 }, True, 7, DomainCtlPlane, 0, 0, 0, 0 }, + { xieValEQ, { 128.0, 0.0, 0.0 }, True, 7, DomainCtlPlane, 0, 0, 0, 0 }, + { xieValNE, { 128.0, 0.0, 0.0 }, True, 7, DomainCtlPlane, 0, 0, 0, 0 }, + { xieValGE, { 128.0, 0.0, 0.0 }, True, 7, DomainCtlPlane, 0, 0, 0, 0 }, + { xieValGT, { 128.0, 0.0, 0.0 }, True, 7, DomainCtlPlane, 0, 0, 0, 0 }, + }; + +static ArithmeticParms ArithmeticParmVec[] = { +/* constrained */ +{ xieValAdd, { 64.0, 0.0, 0.0 }, 7, DomainNone, 0, 0, 0, 0, False, 0, 0.0, 0.0 }, +{ xieValSub, { 64.0, 0.0, 0.0 }, 7, DomainNone, 0, 0, 0, 0, False, 0, 0.0, 0.0 }, +{ xieValSubRev, { 255.0, 0.0, 0.0 }, 7, DomainNone, 0, 0, 0, 0, False, 0, 0.0, 0.0 }, +{ xieValMul, { 0.66, 0.0, 0.0 }, 7, DomainNone, 0, 0, 0, 0, False, 0, 0.0, 0.0 }, +{ xieValDiv, { 1.5, 0.0, 0.0 }, 7, DomainNone, 0, 0, 0, 0, False, 0, 0.0, 0.0 }, +{ xieValDivRev, { 25500.0, 0.0, 0.0 }, 7, DomainNone, 0, 0, 0, 0, False, 0, 0.0, 0.0 }, +{ xieValMin, { 128.0, 0.0, 0.0 }, 7, DomainNone, 0, 0, 0, 0, False, 0, 0.0, 0.0 }, +{ xieValMax, { 128.0, 0.0, 0.0 }, 7, DomainNone, 0, 0, 0, 0, False, 0, 0.0, 0.0 }, +{ xieValGamma, { 1.1, 0.0, 0.0 }, 7, DomainNone, 0, 0, 0, 0, False, 0, 0.0, 0.0 }, +{ xieValAdd, { 64.0, 0.0, 0.0 }, 7, DomainROI, 0, 0, 512, 256, False, 0, 0.0, 0.0 }, +{ xieValSub, { 64.0, 0.0, 0.0 }, 7, DomainROI, 0, 0, 512, 256, False, 0, 0.0, 0.0 }, +{ xieValSubRev, { 255.0, 0.0, 0.0 }, 7, DomainROI, 0, 0, 512, 256, False, 0, 0.0, 0.0 }, +{ xieValMul, { 0.66, 0.0, 0.0 }, 7, DomainROI, 0, 0, 512, 256, False, 0, 0.0, 0.0 }, +{ xieValDiv, { 1.5, 0.0, 0.0 }, 7, DomainROI, 0, 0, 512, 256, False, 0, 0.0, 0.0 }, +{ xieValDivRev, { 25500.0, 0.0, 0.0 }, 7, DomainROI, 0, 0, 512, 256, False, 0, 0.0, 0.0 }, +{ xieValMin, { 128.0, 0.0, 0.0 }, 7, DomainROI, 0, 0, 512, 256, False, 0, 0.0, 0.0 }, +{ xieValMax, { 128.0, 0.0, 0.0 }, 7, DomainROI, 0, 0, 512, 256, False, 0, 0.0, 0.0 }, +{ xieValGamma, { 1.1, 0.0, 0.0 }, 7, DomainROI, 0, 0, 512, 256, False, 0, 0.0, 0.0 }, +/* unconstrained */ +{ xieValAdd, { 64.0, 0.0, 0.0 }, 7, DomainNone, 0, 0, 0, 0, True, xieValConstrainClipScale, 0.0, 255.0 }, +{ xieValSub, { 64.0, 0.0, 0.0 }, 7, DomainNone, 0, 0, 0, 0, True, xieValConstrainClipScale, 0.0, 255.0 }, +{ xieValSubRev, { 255.0, 0.0, 0.0 }, 7, DomainNone, 0, 0, 0, 0, True, xieValConstrainClipScale, 0.0, 255.0 }, +{ xieValMul, { 0.66, 0.0, 0.0 }, 7, DomainNone, 0, 0, 0, 0, True, xieValConstrainClipScale, 0.0, 255.0 }, +{ xieValDiv, { 1.5, 0.0, 0.0 }, 7, DomainNone, 0, 0, 0, 0, True, xieValConstrainClipScale, 0.0, 255.0 }, +{ xieValDivRev, { 25500.0, 0.0, 0.0 }, 7, DomainNone, 0, 0, 0, 0, True, xieValConstrainClipScale, 0.0, 255.0 }, +{ xieValMin, { 128.0, 0.0, 0.0 }, 7, DomainNone, 0, 0, 0, 0, True, xieValConstrainClipScale, 0.0, 255.0 }, +{ xieValMax, { 128.0, 0.0, 0.0 }, 7, DomainNone, 0, 0, 0, 0, True, xieValConstrainClipScale, 0.0, 255.0 }, +{ xieValGamma, { 1.1, 0.0, 0.0 }, 7, DomainNone, 0, 0, 0, 0, True, xieValConstrainClipScale, 0.0, 255.0 }, +{ xieValAdd, { 64.0, 0.0, 0.0 }, 7, DomainROI, 0, 0, 512, 256, True, xieValConstrainClipScale, 0.0, 255.0 }, +{ xieValSub, { 64.0, 0.0, 0.0 }, 7, DomainROI, 0, 0, 512, 256, True, xieValConstrainClipScale, 0.0, 255.0 }, +{ xieValSubRev, { 255.0, 0.0, 0.0 }, 7, DomainROI, 0, 0, 512, 256, True, xieValConstrainClipScale, 0.0, 255.0 }, +{ xieValMul, { 0.66, 0.0, 0.0 }, 7, DomainROI, 0, 0, 512, 256, True, xieValConstrainClipScale, 0.0, 255.0 }, +{ xieValDiv, { 1.5, 0.0, 0.0 }, 7, DomainROI, 0, 0, 512, 256, True, xieValConstrainClipScale, 0.0, 255.0 }, +{ xieValDivRev, { 25500.0, 0.0, 0.0 }, 7, DomainROI, 0, 0, 512, 256, True, xieValConstrainClipScale, 0.0, 255.0 }, +{ xieValMin, { 128.0, 0.0, 0.0 }, 7, DomainROI, 0, 0, 512, 256, True, xieValConstrainClipScale, 0.0, 255.0 }, +{ xieValMax, { 128.0, 0.0, 0.0 }, 7, DomainROI, 0, 0, 512, 256, True, xieValConstrainClipScale, 0.0, 255.0 }, +{ xieValGamma, { 1.1, 0.0, 0.0 }, 7, DomainROI, 0, 0, 512, 256, True, xieValConstrainClipScale, 0.0, 255.0 }, +{ xieValAdd, { 64.0, 0.0, 0.0 }, 7, DomainROI, 0, 0, 512, 256, False, 0, 0.0, 0.0 }, +/* Constrained, Control Planes */ +{ xieValAdd, { 64.0, 0.0, 0.0 }, 7, DomainCtlPlane, 0, 0, 512, 256, False, 0, 0.0, 0.0 }, +{ xieValSub, { 64.0, 0.0, 0.0 }, 7, DomainCtlPlane, 0, 0, 512, 256, False, 0, 0.0, 0.0 }, +{ xieValSubRev, { 255.0, 0.0, 0.0 }, 7, DomainCtlPlane, 0, 0, 512, 256, False, 0, 0.0, 0.0 }, +{ xieValMul, { 0.66, 0.0, 0.0 }, 7, DomainCtlPlane, 0, 0, 512, 256, False, 0, 0.0, 0.0 }, +{ xieValDiv, { 1.5, 0.0, 0.0 }, 7, DomainCtlPlane, 0, 0, 512, 256, False, 0, 0.0, 0.0 }, +{ xieValDivRev, { 25500.0, 0.0, 0.0 }, 7, DomainCtlPlane, 0, 0, 512, 256, False, 0, 0.0, 0.0 }, +{ xieValMin, { 128.0, 0.0, 0.0 }, 7, DomainCtlPlane, 0, 0, 512, 256, False, 0, 0.0, 0.0 }, +{ xieValMax, { 128.0, 0.0, 0.0 }, 7, DomainCtlPlane, 0, 0, 512, 256, False, 0, 0.0, 0.0 }, +{ xieValGamma, { 1.1, 0.0, 0.0 }, 7, DomainCtlPlane, 0, 0, 512, 256, False, 0, 0.0, 0.0 }, +}; + +/* The math test ( math.c ) can build arbitrarily long flos of math elements + strung together. If the flo has two math elements, pass a pointer to + the ith element in doubleOpsVec, for example, and the value 2. If you + want to make a tripleOpsVec, for example, you can do that too. */ + +static XieMathOp singleOpVec[] = { xieValExp, xieValLn, xieValLog2, + xieValLog10, xieValSquare, xieValSqrt +}; + +static XieMathOp doubleOpsVec[][ 2 ] = { + { xieValSqrt, xieValSquare }, + { xieValSquare, xieValSqrt }, + { xieValExp, xieValLn }, + { xieValLn, xieValExp }, +}; + +static MathParms MathParmVec[] = { +{ doubleOpsVec[ 0 ], 2, 7, DomainNone, 0, 0, 0, 0, True, xieValConstrainHardClip, 0.0, 0.0 }, +{ doubleOpsVec[ 1 ], 2, 7, DomainNone, 0, 0, 0, 0, True, xieValConstrainHardClip, 0.0, 0.0 }, +{ doubleOpsVec[ 2 ], 2, 7, DomainNone, 0, 0, 0, 0, True, xieValConstrainHardClip, 0.0, 0.0 }, +{ doubleOpsVec[ 3 ], 2, 7, DomainNone, 0, 0, 0, 0, True, xieValConstrainHardClip, 0.0, 0.0 }, +{ &singleOpVec[ 2 ], 1, 7, DomainNone, 0, 0, 0, 0, True, xieValConstrainClipScale, 0.0, 8.0 }, +{ &singleOpVec[ 3 ], 1, 7, DomainNone, 0, 0, 0, 0, True, xieValConstrainClipScale, 0.0, 2.41 }, +{ doubleOpsVec[ 0 ], 2, 7, DomainNone, 0, 0, 0, 0, False, 0, 0.0, 0.0 }, +{ doubleOpsVec[ 0 ], 2, 7, DomainROI, 100, 100, 256, 256, True, xieValConstrainHardClip, 0.0, 0.0 }, +{ doubleOpsVec[ 1 ], 2, 7, DomainROI, 100, 100, 256, 256, True, xieValConstrainHardClip, 0.0, 0.0 }, +{ doubleOpsVec[ 2 ], 2, 7, DomainROI, 100, 100, 256, 256, True, xieValConstrainHardClip, 0.0, 0.0 }, +{ doubleOpsVec[ 3 ], 2, 7, DomainROI, 100, 100, 256, 256, True, xieValConstrainHardClip, 0.0, 0.0 }, +{ &singleOpVec[ 2 ], 1, 7, DomainROI, 100, 100, 256, 256, True, xieValConstrainClipScale, 0.0, 8.0 }, +{ &singleOpVec[ 3 ], 1, 7, DomainROI, 100, 100, 256, 256, True, xieValConstrainClipScale, 0.0, 2.41 }, +{ doubleOpsVec[ 0 ], 2, 7, DomainROI, 100, 100, 256, 256, False, 0, 0.0, 0.0 }, +{ doubleOpsVec[ 0 ], 2, 7, DomainCtlPlane, 0, 0, 0, 0, True, xieValConstrainHardClip, 0.0, 0.0 }, +{ doubleOpsVec[ 1 ], 2, 7, DomainCtlPlane, 0, 0, 0, 0, True, xieValConstrainHardClip, 0.0, 0.0 }, +{ doubleOpsVec[ 2 ], 2, 7, DomainCtlPlane, 0, 0, 0, 0, True, xieValConstrainHardClip, 0.0, 0.0 }, +{ doubleOpsVec[ 3 ], 2, 7, DomainCtlPlane, 0, 0, 0, 0, True, xieValConstrainHardClip, 0.0, 0.0 }, +{ &singleOpVec[ 2 ], 1, 7, DomainCtlPlane, 0, 0, 0, 0, True, xieValConstrainClipScale, 0.0, 8.0 }, +{ &singleOpVec[ 3 ], 1, 7, DomainCtlPlane, 0, 0, 0, 0, True, xieValConstrainClipScale, 0.0, 2.41 }, +{ doubleOpsVec[ 0 ], 2, 7, DomainCtlPlane, 0, 0, 0, 0, False, 0, 0.0, 0.0 }, +}; + +static BlendParms BlendParmVec[] = { + { { 0.1, 0.0, 0.0 }, 0.5, 7, DomainNone, 0 }, + { { 220.0, 0.0, 0.0 }, 255.0, 7, DomainNone, 0 }, + { { 0.0, 0.0, 0.0 }, 250.0, 7, DomainNone, 0 }, + { { 0.1, 0.0, 0.0 }, 0.5, 7, DomainROI, 5 }, + { { 220.0, 0.0, 0.0 }, 255.0, 7, DomainROI, 5 }, + { { 0.0, 0.0, 0.0 }, 250.0, 7, DomainROI, 5 }, + { { 0.1, 0.0, 0.0 }, 0.5, 7, DomainCtlPlane, 0 }, + }; + +int Boxcar3(); +int Boxcar5(); +int LaPlacian3(); +int LaPlacian5(); + +static ConvolveParms ConvolveParmVec[] = { +{ False, 7, DomainNone, 0, 0, 0, 0, xieValConvolveDefault, { 0.0, 0.0, 0.0 }, Boxcar3 }, +{ False, 7, DomainNone, 0, 0, 0, 0, xieValConvolveDefault, { 0.0, 0.0, 0.0 }, Boxcar5 }, +{ False, 7, DomainNone, 0, 0, 0, 0, xieValConvolveDefault, { 0.0, 0.0, 0.0 }, LaPlacian3 }, +{ False, 7, DomainNone, 0, 0, 0, 0, xieValConvolveDefault, { 0.0, 0.0, 0.0 }, LaPlacian5 }, +{ False, 7, DomainROI, 100, 100, 256, 256, xieValConvolveDefault, { 0.0, 0.0, 0.0 }, LaPlacian3 }, +{ False, 7, DomainROI, 100, 100, 256, 256, xieValConvolveDefault, { 0.0, 0.0, 0.0 }, LaPlacian5 }, +{ False, 7, DomainCtlPlane, 0, 0, 0, 0, xieValConvolveDefault, { 0.0, 0.0, 0.0 }, LaPlacian3 }, +{ False, 7, DomainCtlPlane, 0, 0, 0, 0, xieValConvolveDefault, { 0.0, 0.0, 0.0 }, LaPlacian5 }, + }; + +static ConstrainParms ConstrainParmVec[] = { + { False, xieValConstrainHardClip, ( int ) NULL }, + { False, xieValConstrainClipScale, ( int ) ClampInputs }, + { False, xieValConstrainClipScale, ( int ) NULL }, + { True, xieValConstrainHardClip, ( int ) NULL }, + { True, xieValConstrainClipScale, ( int ) ClampInputs }, + { True, xieValConstrainClipScale, ( int ) NULL }, + }; + +static DitherParms DitherParmVec[] = { + { xieValDitherErrorDiffusion, Drawable, 0, 1 }, + { xieValDitherErrorDiffusion, DrawablePlane, 0, 1 }, + { xieValDitherOrdered, Drawable, 4, 1 }, + { xieValDitherOrdered, DrawablePlane, 4, 1 }, + { xieValDitherOrdered, Drawable, 8, 1 }, + { xieValDitherOrdered, DrawablePlane, 8, 1 }, + { xieValDitherDefault, Drawable, 0, 1 }, + { xieValDitherDefault, DrawablePlane, 0, 1 } +}; + +static GeometryParms GeometryParmVec[] = { +{ GEO_TYPE_ROTATE, 512, 512, 0, 0, xieValGeomNearestNeighbor, 12, True }, +{ GEO_TYPE_ROTATE, 512, 512, 0, 0, xieValGeomNearestNeighbor, 147, True }, +{ GEO_TYPE_ROTATE, 512, 512, 0, 0, xieValGeomNearestNeighbor, 193, True }, +{ GEO_TYPE_ROTATE, 512, 512, 0, 0, xieValGeomNearestNeighbor, 311, True }, +{ GEO_TYPE_MIRRORX, 512, 512, 0, 0, xieValGeomNearestNeighbor, 0, True }, +{ GEO_TYPE_MIRRORY, 512, 512, 0, 0, xieValGeomNearestNeighbor, 0, True }, +{ GEO_TYPE_MIRRORXY, 512, 512, 0, 0, xieValGeomNearestNeighbor, 0, True }, +{ GEO_TYPE_CROP, 256, 256, 256, 256, xieValGeomNearestNeighbor, 0, True }, +{ GEO_TYPE_SCALE, 128, 128, 0, 0, xieValGeomNearestNeighbor, 0, True }, +{ GEO_TYPE_SCALE, 256, 256, 0, 0, xieValGeomNearestNeighbor, 0, True }, +{ GEO_TYPE_SCALE, 256, 512, 0, 0, xieValGeomNearestNeighbor, 0, True }, +{ GEO_TYPE_SCALE, 512, 128, 0, 0, xieValGeomNearestNeighbor, 0, True }, +{ GEO_TYPE_SCALE, 256, 768, 0, 0, xieValGeomNearestNeighbor, 0, True }, +{ GEO_TYPE_SCALE, 128, 768, 0, 0, xieValGeomNearestNeighbor, 0, True }, +{ GEO_TYPE_ROTATE, 512, 512, 0, 0, xieValGeomAntialias, 12, True }, +{ GEO_TYPE_ROTATE, 512, 512, 0, 0, xieValGeomAntialias, 147, True }, +{ GEO_TYPE_ROTATE, 512, 512, 0, 0, xieValGeomAntialias, 193, True }, +{ GEO_TYPE_ROTATE, 512, 512, 0, 0, xieValGeomAntialias, 311, True }, +{ GEO_TYPE_MIRRORX, 512, 512, 0, 0, xieValGeomAntialias, 0, True }, +{ GEO_TYPE_MIRRORY, 512, 512, 0, 0, xieValGeomAntialias, 0, True }, +{ GEO_TYPE_MIRRORXY, 512, 512, 0, 0, xieValGeomAntialias, 0, True }, +{ GEO_TYPE_CROP, 256, 256, 256, 256, xieValGeomAntialias, 0, True }, +{ GEO_TYPE_SCALE, 128, 128, 0, 0, xieValGeomAntialias, 0, True }, +{ GEO_TYPE_SCALE, 256, 256, 0, 0, xieValGeomAntialias, 0, True }, +{ GEO_TYPE_SCALE, 256, 512, 0, 0, xieValGeomAntialias, 0, True }, +{ GEO_TYPE_SCALE, 512, 128, 0, 0, xieValGeomAntialias, 0, True }, +{ GEO_TYPE_SCALE, 256, 768, 0, 0, xieValGeomAntialias, 0, True }, +{ GEO_TYPE_SCALE, 128, 768, 0, 0, xieValGeomAntialias, 0, True }, +{ GEO_TYPE_SCALE, 512, 512, 0,0, xieValGeomNearestNeighbor, 0, True }, +{ GEO_TYPE_SCALE, 512, 512, 0,0, xieValGeomAntialias, 0, True }, +{ GEO_TYPE_SCALE, 512, 512, 0,0, xieValGeomNearestNeighbor, 0, True }, +{ GEO_TYPE_SCALE, 512, 512, 0,0, xieValGeomAntialias, 0, True }, +{ GEO_TYPE_SCALEDROTATE, 512, 512, 0,0,xieValGeomNearestNeighbor, 12, True }, +{ GEO_TYPE_SCALEDROTATE, 512, 512, 0,0,xieValGeomNearestNeighbor, 147, True }, +{ GEO_TYPE_SCALEDROTATE, 512, 512, 0,0,xieValGeomNearestNeighbor, 193, True }, +{ GEO_TYPE_SCALEDROTATE, 512, 512, 0,0,xieValGeomNearestNeighbor, 311, True }, +{ GEO_TYPE_SCALEDROTATE, 512, 512, 0,0,xieValGeomAntialias, 12, True }, +{ GEO_TYPE_SCALEDROTATE, 512, 512, 0,0,xieValGeomAntialias, 147, True }, +{ GEO_TYPE_SCALEDROTATE, 512, 512, 0,0,xieValGeomAntialias, 193, True }, +{ GEO_TYPE_SCALEDROTATE, 512, 512, 0,0,xieValGeomAntialias, 311, True }, +{ GEO_TYPE_ROTATE, 512, 512, 0, 0, xieValGeomBilinearInterp, 12, True }, +{ GEO_TYPE_ROTATE, 512, 512, 0, 0, xieValGeomBilinearInterp, 147, True }, +{ GEO_TYPE_ROTATE, 512, 512, 0, 0, xieValGeomBilinearInterp, 193, True }, +{ GEO_TYPE_ROTATE, 512, 512, 0, 0, xieValGeomBilinearInterp, 311, True }, +{ GEO_TYPE_MIRRORX, 512, 512, 0, 0, xieValGeomBilinearInterp, 0, True }, +{ GEO_TYPE_MIRRORY, 512, 512, 0, 0, xieValGeomBilinearInterp, 0, True }, +{ GEO_TYPE_MIRRORXY, 512, 512, 0, 0, xieValGeomBilinearInterp, 0, True }, +{ GEO_TYPE_CROP, 256, 256, 256, 256, xieValGeomBilinearInterp, 0, True }, +{ GEO_TYPE_SCALE, 128, 128, 0, 0, xieValGeomBilinearInterp, 0, True }, +{ GEO_TYPE_SCALE, 256, 256, 0, 0, xieValGeomBilinearInterp, 0, True }, +{ GEO_TYPE_SCALE, 256, 512, 0, 0, xieValGeomBilinearInterp, 0, True }, +{ GEO_TYPE_SCALE, 512, 128, 0, 0, xieValGeomBilinearInterp, 0, True }, +{ GEO_TYPE_SCALE, 256, 768, 0, 0, xieValGeomBilinearInterp, 0, True }, +{ GEO_TYPE_SCALE, 128, 768, 0, 0, xieValGeomBilinearInterp, 0, True }, +{ GEO_TYPE_SCALE, 512, 512, 0,0,xieValGeomAntialias, 0, False }, +}; + +static AbortParms AbortParmVec[] = { + { 256, 256 } + }; + +static AwaitParms AwaitParmVec[] = { + { 256, 256 } + }; + +static PasteUpParms PasteUpParmVec[] = { + { NoOverlap }, + { Overlap } + }; + +/* SingleBand Parameters for FunnyEncode tests with three EP elements */ + +XieOrientation SingleFillOrderThreeVec[ 3 ] = { xieValLSFirst, xieValMSFirst, xieValLSFirst }; +XieOrientation SinglePixelOrderThreeVec[ 3 ] = { xieValMSFirst, xieValLSFirst, xieValMSFirst }; +unsigned char SinglePixelStrideThreeVec[ 3 ] = { 8, 11, 13 }; +unsigned char SingleScanlinePadThreeVec[ 3 ] = { 0, 8, 16 }; + +/* TripleBand Parameters for FunnyEncode tests with three EP elements */ + +XieOrientation TripleFillOrderThreeVec[ 3 ] = { xieValLSFirst, xieValMSFirst, xieValLSFirst }; +XieOrientation TriplePixelOrderThreeVec[ 3 ] = { xieValMSFirst, xieValLSFirst, xieValMSFirst }; +unsigned char TriplePixelStrideThreeVec[ 9 ] = { 35, 37, 36, 37, 39, 41, 36, 35, 41 }; +unsigned char TripleScanlinePadThreeVec[ 9 ] = { 0, 8, 16, 16, 8, 8, 8, 8, 8 }; +XieOrientation TripleBandOrderThreeVec[ 3 ] = { xieValLSFirst, xieValMSFirst, xieValLSFirst }; +XieInterleave TripleInterleaveThreeVec[ 3 ] = { xieValBandByPixel, xieValBandByPlane, xieValBandByPixel }; + +static FunnyEncodeParms FunnyEncodeParmVec[] = { + { 3, SingleFillOrderThreeVec, SinglePixelOrderThreeVec, SinglePixelStrideThreeVec, SingleScanlinePadThreeVec, ( XieOrientation * ) NULL, ( XieInterleave * ) NULL, False, { 0, 0, 0 } }, + { 3, TripleFillOrderThreeVec, TriplePixelOrderThreeVec, ( unsigned char * ) TriplePixelStrideThreeVec, ( unsigned char * ) TripleScanlinePadThreeVec, ( XieOrientation * ) TripleBandOrderThreeVec, ( XieInterleave * ) TripleInterleaveThreeVec, False, { 0, 0, 0 } }, + { 3, TripleFillOrderThreeVec, TriplePixelOrderThreeVec, ( unsigned char * ) TriplePixelStrideThreeVec, ( unsigned char * ) TripleScanlinePadThreeVec, ( XieOrientation * ) TripleBandOrderThreeVec, ( XieInterleave * ) TripleInterleaveThreeVec, True, { 5, 10, 7 } }, + { 3, TripleFillOrderThreeVec, TriplePixelOrderThreeVec, ( unsigned char * ) TriplePixelStrideThreeVec, ( unsigned char * ) TripleScanlinePadThreeVec, ( XieOrientation * ) TripleBandOrderThreeVec, ( XieInterleave * ) TripleInterleaveThreeVec, True, { 7, 13, 11 } }, + { 3, SingleFillOrderThreeVec, SinglePixelOrderThreeVec, SinglePixelStrideThreeVec, SingleScanlinePadThreeVec, ( XieOrientation * ) NULL, ( XieInterleave * ) NULL, True, { 3, 0, 0 } }, +}; + +static PointParms PointParmVec[] = { + { False, 8, 8, DomainNone, 0, 0, 0, 0, 7 }, + { False, 1, 8, DomainNone, 0, 0, 0, 0, 7 }, + { False, 8, 1, DomainNone, 0, 0, 0, 0, 7 }, + { False, 8, 8, DomainROI, 100, 100, 256, 256, 7 }, + { True, 8, 8, DomainNone, 0, 0, 0, 0, 7 }, + { True, 1, 8, DomainNone, 0, 0, 0, 0, 7 }, + { True, 8, 1, DomainNone, 0, 0, 0, 0, 7 }, + { True, 8, 8, DomainROI, 100, 100, 256, 256, 7 }, + { False, 8, 8, DomainCtlPlane, 0, 0, 0, 0, 7 }, + { True, 8, 8, DomainCtlPlane, 0, 0, 0, 0, 7 }, + }; + +static TriplePointParms TriplePointParmVec[] = { + { DomainNone, 0, 0, 0, 0, XA_RGB_BEST_MAP, 0x7, xieValDitherDefault, 0 }, + { DomainNone, 0, 0, 0, 0, XA_RGB_DEFAULT_MAP, 0x7, xieValDitherDefault, 0 }, + }; + +/* Encode test configuration */ + +static XieEncodeUncompressedSingleParam encodeSingleParms[] = { + { xieValLSFirst, xieValLSFirst, 8, 0 } + }; + +static XieEncodeUncompressedTripleParam encodeTripleParms[] = { + { { 24, 24, 24 }, xieValLSFirst, { 0, 0, 0 }, xieValLSFirst, + xieValLSFirst, xieValBandByPixel } + }; + +static XieEncodeG31DParam encodeG31DParms[] = { + { True, True, xieValMSFirst } + }; + +static XieEncodeG32DParam encodeG32DParms[] = { + { False, False, True, xieValMSFirst, 2 } + }; + +static XieEncodeG42DParam encodeG42DParms[] = { + { False, True, xieValMSFirst } + }; + +static XieEncodeServerChoiceParam encodeChoiceParms[] = { + { xieValPreferDefault }, + { xieValPreferSpace }, + { xieValPreferTime }, + }; + +static unsigned char q_table[] = { + 16, 11, 10, 16, 24, 40, 51, 61, + 12, 12, 14, 19, 26, 58, 60, 55, + 14, 13, 16, 24, 40, 57, 69, 56, + 14, 17, 22, 29, 51, 87, 80, 62, + 18, 22, 37, 56, 68, 109, 103, 77, + 24, 35, 55, 64, 81, 104, 113, 92, + 49, 64, 78, 87, 103, 121, 120, 101, + 72, 92, 95, 98, 112, 100, 103, 99, + + 17, 18, 24, 47, 99, 99, 99, 99, + 18, 21, 26, 66, 99, 99, 99, 99, + 24, 26, 56, 99, 99, 99, 99, 99, + 47, 66, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99 + }; + +#define NQ_TABLE 128 + +static unsigned char dc_table[] = { + 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + + 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 + }; + +#define NDC_TABLE 56 + +static unsigned char ac_table[] = { + 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d, + 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, + 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, + 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, + 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, + 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, + 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, + 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, + 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, + 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, + 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, + 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa, + + 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77, + 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, + 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, + 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, + 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, + 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, + 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, + 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, + 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, + 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, + 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, + 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, + 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, + 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, + 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa + }; + +#define NAC_TABLE 356 + +static XieEncodeJPEGBaselineParam encodeJPEGBaselineParms[] = { + { xieValBandByPixel, xieValLSFirst, { 1, 1, 1 }, { 1, 1, 1 }, ( char * ) NULL, 0, ( char * ) NULL, + 0, ( char * ) NULL, 0 }, + { xieValBandByPixel, xieValMSFirst, { 1, 1, 1 }, { 1, 1, 1 }, ( char * ) q_table, NQ_TABLE, + ( char * ) ac_table, NAC_TABLE, ( char * ) dc_table, + NDC_TABLE }, + { xieValBandByPlane, xieValLSFirst, { 1, 1, 1 }, { 1, 1, 1 }, ( char * ) NULL, 0, ( char * ) NULL, + 0, ( char * ) NULL, 0 } + }; + +static XieEncodeTIFF2Param encodeTIFF2Parms[] = { + { xieValMSFirst, False } + }; + +static XieEncodeTIFFPackBitsParam encodeTIFFPackBitsParms[] = { + { xieValMSFirst } + }; + +static EncodeParms EncodeParmVec[] = { + { xieValEncodeG31D, ( char * ) &encodeG31DParms[0], False, 0 }, + { xieValEncodeG32D, ( char * ) &encodeG32DParms[0], False, 0 }, + { xieValEncodeG42D, ( char * ) &encodeG42DParms[0], False, 0 }, + { xieValEncodeTIFF2, ( char * ) &encodeTIFF2Parms[0], False, 0 }, + { xieValEncodeTIFFPackBits, ( char * ) &encodeTIFFPackBitsParms[0], False, 0 }, + { xieValEncodeUncompressedSingle, ( char * ) &encodeSingleParms[0], False, 0 }, + { xieValEncodeUncompressedTriple, ( char * ) &encodeTripleParms[0], False, 0 }, + { xieValEncodeJPEGBaseline, ( char * ) &encodeJPEGBaselineParms[0], False, 0 }, + { xieValEncodeG31D, ( char * ) &encodeG31DParms[0], True, 0 }, + { xieValEncodeG32D, ( char * ) &encodeG32DParms[0], True, 0 }, + { xieValEncodeG42D, ( char * ) &encodeG42DParms[0], True, 0 }, + { xieValEncodeTIFF2, ( char * ) &encodeTIFF2Parms[0], True, 0 }, + { xieValEncodeTIFFPackBits, ( char * ) &encodeTIFFPackBitsParms[0], True, 0 }, + { xieValEncodeUncompressedSingle, ( char * ) &encodeSingleParms[0], True, 0 }, + { xieValEncodeUncompressedTriple, ( char * ) &encodeTripleParms[0], True, 0 }, + { xieValEncodeJPEGBaseline, ( char * ) &encodeJPEGBaselineParms[0], True, 0 }, + { xieValEncodeJPEGBaseline, ( char * ) &encodeJPEGBaselineParms[2], True, 30 }, + { xieValEncodeJPEGBaseline, ( char * ) &encodeJPEGBaselineParms[2], False, 30 }, + { xieValEncodeJPEGBaseline, ( char * ) &encodeJPEGBaselineParms[1], True, 30 }, + { xieValEncodeJPEGBaseline, ( char * ) &encodeJPEGBaselineParms[1], False, 30 }, + { xieValEncodeServerChoice, ( char * ) &encodeChoiceParms[0], False, 0 }, + { xieValEncodeServerChoice, ( char * ) &encodeChoiceParms[1], False, 0 }, + { xieValEncodeServerChoice, ( char * ) &encodeChoiceParms[2], False, 0 } +}; + +static ImportParms ImportParmVec[] = { + { NoObscure, 0 }, + { Obscuring, 0 }, + { Obscured, 0 }, + { ( int ) NULL, 10 }, /* ROIs */ + { ( int ) NULL, 100 }, + }; + +static LogicalParms LogicalParmVec[] = { + { { 0.0, 0.0, 0.0 }, GXclear, 7, DomainNone, 0 }, + { { 0.0, 0.0, 0.0 }, GXand, 7, DomainNone, 0 }, + { { 0.0, 0.0, 0.0 }, GXandReverse, 7, DomainNone, 0 }, + { { 0.0, 0.0, 0.0 }, GXcopy, 7, DomainNone, 0 }, + { { 0.0, 0.0, 0.0 }, GXandInverted, 7, DomainNone, 0 }, + { { 0.0, 0.0, 0.0 }, GXnoop, 7, DomainNone, 0 }, + { { 0.0, 0.0, 0.0 }, GXxor, 7, DomainNone, 0 }, + { { 0.0, 0.0, 0.0 }, GXor, 7, DomainNone, 0 }, + { { 0.0, 0.0, 0.0 }, GXnor, 7, DomainNone, 0 }, + { { 0.0, 0.0, 0.0 }, GXequiv, 7, DomainNone, 0 }, + { { 0.0, 0.0, 0.0 }, GXinvert, 7, DomainNone, 0 }, + { { 0.0, 0.0, 0.0 }, GXorReverse, 7, DomainNone, 0 }, + { { 0.0, 0.0, 0.0 }, GXcopyInverted, 7, DomainNone, 0 }, + { { 0.0, 0.0, 0.0 }, GXorInverted, 7, DomainNone, 0 }, + { { 0.0, 0.0, 0.0 }, GXnand, 7, DomainNone, 0 }, + { { 0.0, 0.0, 0.0 }, GXset, 7, DomainNone, 0 }, + { { 0.0, 0.0, 0.0 }, GXclear, 7, DomainROI, 5 }, + { { 0.0, 0.0, 0.0 }, GXand, 7, DomainROI, 5 }, + { { 0.0, 0.0, 0.0 }, GXandReverse, 7, DomainROI, 5 }, + { { 0.0, 0.0, 0.0 }, GXcopy, 7, DomainROI, 5 }, + { { 0.0, 0.0, 0.0 }, GXandInverted, 7, DomainROI, 5 }, + { { 0.0, 0.0, 0.0 }, GXnoop, 7, DomainROI, 5 }, + { { 0.0, 0.0, 0.0 }, GXxor, 7, DomainROI, 5 }, + { { 0.0, 0.0, 0.0 }, GXor, 7, DomainROI, 5 }, + { { 0.0, 0.0, 0.0 }, GXnor, 7, DomainROI, 5 }, + { { 0.0, 0.0, 0.0 }, GXequiv, 7, DomainROI, 5 }, + { { 0.0, 0.0, 0.0 }, GXinvert, 7, DomainROI, 5 }, + { { 0.0, 0.0, 0.0 }, GXorReverse, 7, DomainROI, 5 }, + { { 0.0, 0.0, 0.0 }, GXcopyInverted, 7, DomainROI, 5 }, + { { 0.0, 0.0, 0.0 }, GXorInverted, 7, DomainROI, 5 }, + { { 0.0, 0.0, 0.0 }, GXnand, 7, DomainROI, 5 }, + { { 0.0, 0.0, 0.0 }, GXset, 7, DomainROI, 5 }, + { { 0.0, 0.0, 0.0 }, GXclear, 7, DomainCtlPlane, 0 }, + { { 0.0, 0.0, 0.0 }, GXand, 7, DomainCtlPlane, 0 }, + { { 0.0, 0.0, 0.0 }, GXandReverse, 7, DomainCtlPlane, 0 }, + { { 0.0, 0.0, 0.0 }, GXcopy, 7, DomainCtlPlane, 0 }, + { { 0.0, 0.0, 0.0 }, GXandInverted, 7, DomainCtlPlane, 0 }, + { { 0.0, 0.0, 0.0 }, GXnoop, 7, DomainCtlPlane, 0 }, + { { 0.0, 0.0, 0.0 }, GXxor, 7, DomainCtlPlane, 0 }, + { { 0.0, 0.0, 0.0 }, GXor, 7, DomainCtlPlane, 0 }, + { { 0.0, 0.0, 0.0 }, GXnor, 7, DomainCtlPlane, 0 }, + { { 0.0, 0.0, 0.0 }, GXequiv, 7, DomainCtlPlane, 0 }, + { { 0.0, 0.0, 0.0 }, GXinvert, 7, DomainCtlPlane, 0 }, + { { 0.0, 0.0, 0.0 }, GXorReverse, 7, DomainCtlPlane, 0 }, + { { 0.0, 0.0, 0.0 }, GXcopyInverted, 7, DomainCtlPlane, 0 }, + { { 0.0, 0.0, 0.0 }, GXorInverted, 7, DomainCtlPlane, 0 }, + { { 0.0, 0.0, 0.0 }, GXnand, 7, DomainCtlPlane, 0 }, + { { 0.0, 0.0, 0.0 }, GXset, 7, DomainCtlPlane, 0 }, +}; + +static QueryParms QueryParmVec[] = { + { 0, 0, xieValDefault }, + { 0, 0, xieValAll }, + { 0, 0, xieValColorAlloc }, + { 0, 0, xieValConstrain }, + { 0, 0, xieValConvertFromRGB }, + { 0, 0, xieValConvertToRGB }, + { 0, 0, xieValConvolve }, + { 0, 0, xieValDecode }, + { 0, 0, xieValDither }, + { 0, 0, xieValEncode }, + { 0, 0, xieValGamut }, + { 0, 0, xieValGeometry }, + { 0, 0, xieValHistogram }, + { 0, 0, xieValWhiteAdjust }, + { 256, 256, ( XieTechniqueGroup ) NULL } +}; + +Test test[] = { + {"-ImportObscuredEvent","ImportObscured event", + InitEvents, DoImportObscuredEvent, NullProc, + EndEvents, VALL, 0, 0, + {1, CAPA_EVENT, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &EventParmVec[ 2 ] } }, + {"-ColorAllocEvent","ColorAlloc event", + InitEvents, DoColorAllocEvent, NullProc, + EndEvents, VALL, 0, 0, + {1, SUBSET_FULL | CAPA_EVENT, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &EventParmVec[ 0 ] } }, + {"-PhotofloDoneEvent","PhotofloDone event", + InitEvents, DoPhotofloDoneEvent, NullProc, + EndEvents, VALL, 0, 0, + {1, CAPA_EVENT, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &EventParmVec[ 3 ] } }, + {"-DecodeNotifyEvent","DecodeNotify event", + InitEvents, DoDecodeNotifyEvent, NullProc, + EndEvents, VALL, 0, 0, + {1, CAPA_EVENT, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &EventParmVec[ 1 ] } }, + {"-ExportAvailable","ExportAvailable event", + InitEvents, DoExportAvailableEvent, NullProc, + EndEvents, VALL, 0, 0, + {1, CAPA_EVENT, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &EventParmVec[ 4 ] } }, + {"-BadValue","BadValue error event", + InitErrors, DoBadValueError, NullProc, + EndErrors, VALL, 0, 0, + {1, CAPA_ERROR, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 11 ] } }, + {"-LUTError","LUT error event", + InitErrors, DoLUTError, NullProc, + EndErrors, VALL, 0, 0, + {1, CAPA_ERROR, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 0 ] } }, + {"-FloLUTError","FloLUT error event", + InitFloErrors, DoErrors, NullProc, + EndFloErrors, VALL, 0, 0, + {1, CAPA_ERROR, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 2 ] } }, + {"-PhotomapError","Photomap error event", + InitErrors, DoPhotomapError, NullProc, + EndErrors, VALL, 0, 0, + {1, CAPA_ERROR, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 3 ] } }, + {"-ROIError","ROI error event", + InitErrors, DoROIError, NullProc, + EndErrors, VALL, 0, 0, + {1, SUBSET_FULL | CAPA_ERROR, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 4 ] } }, + {"-ColorListError","ColorList error event", + InitErrors, DoColorListError, NullProc, + EndErrors, VALL, 0, 0, + {1, CAPA_ERROR | SUBSET_FULL, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 5 ] } }, + {"-PhotospaceError","Photospace error event", + InitErrors, DoPhotospaceError, NullProc, + EndErrors, VALL, 0, 0, + {1, CAPA_ERROR, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 6 ] } }, + {"-FloROIError","FloROI error event", + InitFloErrors, DoErrors, NullProc, + EndFloErrors, VALL, 0, 0, + {1, CAPA_ERROR | SUBSET_FULL, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 12 ] } }, + {"-FloIDError","FloID error event", + InitFloErrors, DoFloIDError, NullProc, + EndFloErrors, VALL, 0, 0, + {1, CAPA_ERROR, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 13 ] } }, + {"-FloOperatorError","FloOperator error event", + InitFloErrors, DoErrors, NullProc, + EndFloErrors, VALL, 0, 0, + {1, CAPA_ERROR, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 14 ] } }, + {"-FloSourceError","FloSource error event", + InitFloErrors, DoFloErrorImmediate, NullProc, + EndFloErrors, VALL, 0, 0, + {1, CAPA_ERROR, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 15 ] } }, + {"-FloPhotomapError","FloPhotomap error event", + InitFloErrors, DoErrors, NullProc, + EndFloErrors, VALL, 0, 0, + {1, CAPA_ERROR, 2048, + { NULL, NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 16 ] } }, + {"-FloDrawableError","FloDrawable error event", + InitFloErrors, DoErrors, NullProc, + EndFloErrors, VALL, 0, 0, + {1, CAPA_ERROR, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 17 ] } }, + {"-FloGCError","FloGC error event", + InitFloErrors, DoErrors, NullProc, + EndFloErrors, VALL, 0, 0, + {1, CAPA_ERROR, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 18 ] } }, + {"-FloElementError","FloElement error event", + InitFloErrors, DoFloElementError, NullProc, + EndFloErrors, VALL, 0, 0, + {1, CAPA_ERROR, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 19 ] } }, + {"-FloColorListError","FloColorList error event", + InitFloErrors, DoErrors, NullProc, + EndFloErrors, VALL, 0, 0, + {1, CAPA_ERROR | SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 20 ] } }, + {"-FloDomainError","FloDomain error event", + InitFloErrors, DoErrors, NullProc, + EndFloErrors, VALL, 0, 0, + {1, CAPA_ERROR, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 21 ] } }, + {"-FloColormapError","FloColormap error event", + InitFloErrors, DoErrors, NullProc, + EndFloErrors, VALL, 0, 0, + {1, CAPA_ERROR | SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 22 ] } }, + {"-FloAccessError","FloAccess error event", + InitFloErrors, DoErrors, NullProc, + EndFloErrors, VALL, 0, 0, + {1, CAPA_ERROR, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 7 ] } }, + {"-FloMatchError","FloMatch error event", + InitFloErrors, DoErrors, NullProc, + EndFloErrors, VALL, 0, 0, + {1, CAPA_ERROR, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 23 ] } }, + {"-FloTechniqueError","FloTechnique error event", + InitFloErrors, DoFloErrorImmediate, NullProc, + EndFloErrors, VALL, 0, 0, + {1, CAPA_ERROR, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 24 ] } }, + {"-FloValueError","FloValue error event", + InitFloErrors, DoErrors, NullProc, + EndFloErrors, VALL, 0, 0, + {1, CAPA_ERROR, 2048, + { NULL, NULL, NULL, NULL }, + ( XPointer ) &ErrorParmVec[ 25 ] } }, + {"-ColorList","XieCreateColorList/XieDestroyColorList", + InitCreateDestroy, DoCreateDestroyColorList, NullProc, + EndCreateDestroy, VALL, 0, 0, + {1, SUBSET_FULL, 0, + { NULL, NULL, NULL, NULL }, ( XPointer ) NULL } }, + {"-LUT","XieCreateLUT/XieDestroyLUT", + InitCreateDestroy, DoCreateDestroyLUT, NullProc, + EndCreateDestroy, VALL, 0, 0, + {1, 0, 0, + { NULL, NULL, NULL, NULL }, ( XPointer ) NULL } }, + {"-Photomap","XieCreatePhotomap/XieDestroyPhotomap", + InitCreateDestroy, DoCreateDestroyPhotomap, NullProc, + EndCreateDestroy, VALL, 0, 0, + {1, 0, 0, + { NULL, NULL, NULL, NULL }, ( XPointer ) NULL } }, + {"-ROI","XieCreateROI/XieDestroyROI", + InitCreateDestroy, DoCreateDestroyROI, NullProc, + EndCreateDestroy, VALL, 0, 0, + {1, SUBSET_FULL, 0, + { NULL, NULL, NULL, NULL }, ( XPointer ) NULL } }, + {"-Photospace","XieCreatePhotospace/XieDestroyPhotospace", + InitCreateDestroy, DoCreateDestroyPhotospace, NullProc, + EndCreateDestroy, VALL, 0, 0, + {1, 0, 0, + { NULL, NULL, NULL, NULL }, ( XPointer ) NULL } }, + {"-Photoflo","XieCreatePhotoflo/XieDestroyPhotoflo size 2", + InitCreateDestroyPhotoflo, DoCreateDestroyPhotoflo, NullProc, + EndCreateDestroyPhotoflo, VALL, 0, 0, + {1, 0, 2048, + { NULL, NULL, NULL, NULL }, ( XPointer ) NULL } }, + {"-QueryPhotomap","XieQueryPhotomap", + InitQueryPhotomap, DoQueryPhotomap, NullProc, + EndQueryPhotomap, VALL, 0, 0, + {1, 0, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, ( XPointer ) NULL } }, + {"-QueryColorList","XieQueryColorList", + InitQueryColorList, DoQueryColorList, NullProc, + EndQueryColorList, VALL, 0, 0, + {1, SUBSET_FULL, 0, + { NULL, NULL, NULL, NULL }, ( XPointer ) NULL } }, + {"-QueryTechniquesDefault","XieQueryTechniques Default", + InitQueryTechniques, DoQueryTechniques, NullProc, + EndQueryTechniques, VALL, 0, 0, + {1, 0, 0, { NULL, NULL, NULL, NULL }, + ( XPointer ) &QueryParmVec[ 0 ] } }, + {"-QueryTechniquesAll","XieQueryTechniques All", + InitQueryTechniques, DoQueryTechniques, NullProc, + EndQueryTechniques, VALL, 0, 0, + {1, 0, 0, { NULL, NULL, NULL, NULL }, + ( XPointer ) &QueryParmVec[ 1 ] } }, + {"-QueryTechniquesColorAlloc","XieQueryTechniques ColorAlloc", + InitQueryTechniques, DoQueryTechniques, NullProc, + EndQueryTechniques, VALL, 0, 0, + {1, SUBSET_FULL, 0, { NULL, NULL, NULL, NULL }, + ( XPointer ) &QueryParmVec[ 2 ] } }, + {"-QueryTechniquesConstrain","XieQueryTechniques Constrain", + InitQueryTechniques, DoQueryTechniques, NullProc, + EndQueryTechniques, VALL, 0, 0, + {1, SUBSET_FULL, 0, { NULL, NULL, NULL, NULL }, + ( XPointer ) &QueryParmVec[ 3 ] } }, + {"-QueryTechniquesConvertFromRGB","XieQueryTechniques ConvertFromRGB", + InitQueryTechniques, DoQueryTechniques, NullProc, + EndQueryTechniques, VALL, 0, 0, + {1, SUBSET_FULL, 0, { NULL, NULL, NULL, NULL }, + ( XPointer ) &QueryParmVec[ 4 ] } }, + {"-QueryTechniquesConvertToRGB","XieQueryTechniques ConvertToRGB", + InitQueryTechniques, DoQueryTechniques, NullProc, + EndQueryTechniques, VALL, 0, 0, + {1, SUBSET_FULL, 0, { NULL, NULL, NULL, NULL }, + ( XPointer ) &QueryParmVec[ 5 ] } }, + {"-QueryTechniquesConvolve","XieQueryTechniques Convolve", + InitQueryTechniques, DoQueryTechniques, NullProc, + EndQueryTechniques, VALL, 0, 0, + {1, SUBSET_FULL, 0, { NULL, NULL, NULL, NULL }, + ( XPointer ) &QueryParmVec[ 6 ] } }, + {"-QueryTechniquesDecode","XieQueryTechniques Decode", + InitQueryTechniques, DoQueryTechniques, NullProc, + EndQueryTechniques, VALL, 0, 0, + {1, 0, 0, { NULL, NULL, NULL, NULL }, + ( XPointer ) &QueryParmVec[ 7 ] } }, + {"-QueryTechniquesDither","XieQueryTechniques Dither", + InitQueryTechniques, DoQueryTechniques, NullProc, + EndQueryTechniques, VALL, 0, 0, + {1, SUBSET_FULL, 0, { NULL, NULL, NULL, NULL }, + ( XPointer ) &QueryParmVec[ 8 ] } }, + {"-QueryTechniquesEncode","XieQueryTechniques Encode", + InitQueryTechniques, DoQueryTechniques, NullProc, + EndQueryTechniques, VALL, 0, 0, + {1, 0, 0, { NULL, NULL, NULL, NULL }, + ( XPointer ) &QueryParmVec[ 9 ] } }, + {"-QueryTechniquesGamut","XieQueryTechniques Gamut", + InitQueryTechniques, DoQueryTechniques, NullProc, + EndQueryTechniques, VALL, 0, 0, + {1, SUBSET_FULL, 0, { NULL, NULL, NULL, NULL }, + ( XPointer ) &QueryParmVec[ 10 ] } }, + {"-QueryTechniquesGeometry","XieQueryTechniques Geometry", + InitQueryTechniques, DoQueryTechniques, NullProc, + EndQueryTechniques, VALL, 0, 0, + {1, 0, 0, { NULL, NULL, NULL, NULL }, + ( XPointer ) &QueryParmVec[ 11 ] } }, + {"-QueryTechniquesHistogram","XieQueryTechniques Histogram", + InitQueryTechniques, DoQueryTechniques, NullProc, + EndQueryTechniques, VALL, 0, 0, + {1, SUBSET_FULL, 0, { NULL, NULL, NULL, NULL }, + ( XPointer ) &QueryParmVec[ 12 ] } }, + {"-QueryTechniquesWhiteAdjust","XieQueryTechniques WhiteAdjust", + InitQueryTechniques, DoQueryTechniques, NullProc, + EndQueryTechniques, VALL, 0, 0, + {1, SUBSET_FULL, 0, { NULL, NULL, NULL, NULL }, + ( XPointer ) &QueryParmVec[ 13 ] } }, + {"-QueryPhotoflo","XieQueryPhotoflo", + InitQueryPhotoflo, DoQueryPhotoflo, NullProc, + EndQueryPhotoflo, VALL, 0, 0, + {1, 0, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) &QueryParmVec[ 14 ] } }, + {"-PurgeColorList","XiePurgeColorList", + InitPurgeColorList, DoPurgeColorList, NullProc, + EndPurgeColorList, VALL, 0, 0, + {1, SUBSET_FULL, 0, { NULL, NULL, NULL, NULL }, + ( XPointer ) NULL } }, + {"-Abort","XieAbort", + InitAbort, DoAbort, NullProc, + EndAbort, VALL, 0, 0, + {1, 0, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) &AbortParmVec[ 0 ] } }, + {"-Await","XieAwait", + InitAwait, DoAwait, NullProc, + EndAwait, VALL, 0, 0, + {1, 0, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) &AwaitParmVec[ 0 ] } }, + {"-importclientlut1","ICL/EL", + InitImportClientLUT, DoImportClientLUT, NullProc, + EndImportClientLUT, VALL, 0, 0, + {1, 0, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) NULL } }, + {"-importclientphoto1","ICP/EP UncompressedSingle", + InitImportClientPhoto, DoImportClientPhoto, NullProc, + EndImportClientPhoto, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) NULL } }, + {"-importclientphoto3","ICP/EP UncompressedTriple", + InitImportClientPhoto, DoImportClientPhoto, NullProc, + EndImportClientPhoto, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) NULL } }, + {"-importclientphoto4","ICP/EP G31D", + InitImportClientPhoto, DoImportClientPhoto, NullProc, + EndImportClientPhoto, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 7 ], NULL, NULL, NULL }, + ( XPointer ) NULL } }, + {"-importclientphoto5","ICP/EP G32D", + InitImportClientPhoto, DoImportClientPhoto, NullProc, + EndImportClientPhoto, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 6 ], NULL, NULL, NULL }, + ( XPointer ) NULL } }, + {"-importclientphoto6","ICP/EP G42D", + InitImportClientPhoto, DoImportClientPhoto, NullProc, + EndImportClientPhoto, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 4 ], NULL, NULL, NULL }, + ( XPointer ) NULL } }, + {"-importclientphoto7","ICP/EP TIFF2", + InitImportClientPhoto, DoImportClientPhoto, NullProc, + EndImportClientPhoto, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 9 ], NULL, NULL, NULL }, + ( XPointer ) NULL } }, + {"-importclientphoto8","ICP/EP TIFFPackBits", + InitImportClientPhoto, DoImportClientPhoto, NullProc, + EndImportClientPhoto, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 8 ], NULL, NULL, NULL }, + ( XPointer ) NULL } }, + {"-importclientphoto9","ICP/ED UncompressedSingle", + InitImportClientPhotoExportDrawable, DoImportClientPhoto, + NullProc, EndImportClientPhoto, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) NULL } }, + {"-importclientroi1","ICR/ER 10 rectangles", + InitImportClientROI, DoImportClientROI, NullProc, + EndImportClientROI, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) &ImportClParmVec[0] } }, + {"-importclientroi2","ICR/ER 100 rectangles", + InitImportClientROI, DoImportClientROI, NullProc, + EndImportClientROI, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) &ImportClParmVec[1] } }, + {"-encodephoto1","IP/EP IP/(BC)/ED G31D", + InitEncodePhotomap, DoEncodePhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 13 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 0 ] } }, + {"-encodephoto2","IP/EP IP/(BC)/ED G32D", + InitEncodePhotomap, DoEncodePhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 13 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 1 ] } }, + {"-encodephoto3","IP/EP IP/(BC)/ED G42D", + InitEncodePhotomap, DoEncodePhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 13 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 2 ] } }, + {"-encodephoto4","IP/EP IP/(BC)/ED TIFF2", + InitEncodePhotomap, DoEncodePhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 13 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 3 ] } }, + {"-encodephoto5","IP/EP IP/(BC)/ED TiffPackbits", + InitEncodePhotomap, DoEncodePhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 13 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 4 ] } }, + {"-encodephoto6","IP/EP IP/(BC)/ED UncompressedSingle", + InitEncodePhotomap, DoEncodePhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 5 ] } }, + {"-encodephoto7","IP/EP IP/(BC)/ED UncompressedTriple", + InitEncodePhotomap, DoEncodePhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 10 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 6 ] } }, + {"-encodephoto8","IP/EP IP/(BC)/ED JPEG TripleBand", + InitEncodePhotomap, DoEncodePhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 10 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 7 ] } }, + {"-encodephoto9","IP/EP IP/(BC)/ED JPEG SingleBand", + InitEncodePhotomap, DoEncodePhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 1 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 7 ] } }, + {"-encodephoto10","IP/EP IP/(BC)/ED JPEG TripleBand Tables", + InitEncodePhotomap, DoEncodePhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 10 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 19 ] } }, + {"-encodephoto11","IP/EP IP/(BC)/ED JPEG SingleBand Tables", + InitEncodePhotomap, DoEncodePhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 1 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 19 ] } }, + {"-encodephoto12","IP/EP IP/(BC)/ED ServerChoice Default", + InitEncodePhotomap, DoEncodePhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 13 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 20 ] } }, + {"-encodephoto13","IP/EP IP/(BC)/ED ServerChoice Space", + InitEncodePhotomap, DoEncodePhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 13 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 21 ] } }, + {"-encodephoto14","IP/EP IP/(BC)/ED ServerChoice Time", + InitEncodePhotomap, DoEncodePhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 13 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 22 ] } }, + {"-encodeclientphoto1","IP/ECP ICP/(BC)/ED G31D", + InitEncodePhotomap, DoEncodeClientPhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 13 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 8 ] } }, + {"-encodeclientphoto2","IP/ECP ICP/(BC)/ED G32D", + InitEncodePhotomap, DoEncodeClientPhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 13 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 9 ] } }, + {"-encodeclientphoto3","IP/ECP ICP/(BC)/ED G42D", + InitEncodePhotomap, DoEncodeClientPhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 13 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 10 ] } }, + {"-encodeclientphoto4","IP/ECP ICP/(BC)/ED TIFF2", + InitEncodePhotomap, DoEncodeClientPhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 13 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 11 ] } }, + {"-encodeclientphoto5","IP/ECP ICP/(BC)/ED TiffPackbits", + InitEncodePhotomap, DoEncodeClientPhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 13 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 12 ] } }, + {"-encodeclientphoto6","IP/ECP ICP/(BC)/ED UncompressedSingle", + InitEncodePhotomap, DoEncodeClientPhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 13 ] } }, + {"-encodeclientphoto7","IP/ECP ICP/(BC)/ED UncompressedTriple", + InitEncodePhotomap, DoEncodeClientPhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 10 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 14 ] } }, + {"-encodeclientphoto8","IP/ECP ICP/(BC)/ED JPEG TripleBand ByPixel", + InitEncodePhotomap, DoEncodeClientPhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 10 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 15 ] } }, + {"-encodeclientphoto9","IP/ECP ICP/(BC)/ED JPEG SingleBand", + InitEncodePhotomap, DoEncodeClientPhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 1 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 16 ] } }, + {"-encodeclientphoto10","IP/ECP ICP/(BC)/ED JPEG TripleBand ByPixel Tables", + InitEncodePhotomap, DoEncodeClientPhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 10 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 18 ] } }, + {"-encodeclientphoto11","IP/ECP ICP/(BC)/ED JPEG SingleBand Tables", + InitEncodePhotomap, DoEncodeClientPhotomap, NullProc, + EndEncodePhotomap, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 1 ], NULL, NULL, NULL }, + ( XPointer ) &EncodeParmVec[ 18 ] } }, + {"-exportclientlut1","IL/ECL", + InitExportClientLUT, DoExportClientLUT, NullProc, + EndExportClientLUT, VALL, 0, 0, + {1, 0, 2048, { NULL, NULL, NULL, NULL }, ( XPointer ) NULL } }, + {"-exportclientroi1","IR/ECR 10 rectangles", + InitExportClientROI, DoExportClientROI, NullProc, + EndExportClientROI, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) &ExportClParmVec[0] } }, + {"-exportclientroi2","IR/ECR 100 rectangles", + InitExportClientROI, DoExportClientROI, NullProc, + EndExportClientROI, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) &ExportClParmVec[1] } }, + {"-exportclienthistogram1","IP/ECH Image 1", + InitExportClientHistogram, DoExportClientHistogram, NullProc, + EndExportClientHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) NULL } }, + {"-exportclienthistogram2","IP/ECH Image 2", + InitExportClientHistogram, DoExportClientHistogram, NullProc, + EndExportClientHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) NULL } }, + {"-exportclienthistogram3","IP/ECH Image 3", + InitExportClientHistogram, DoExportClientHistogram, NullProc, + EndExportClientHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL, NULL }, + ( XPointer ) NULL } }, + {"-exportclienthistogram4","IP/ECH Image 4", + InitExportClientHistogram, DoExportClientHistogram, NullProc, + EndExportClientHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 5 ], NULL, NULL, NULL }, + ( XPointer ) NULL } }, + {"-exportclienthistogramroi1","IP/IR/ECH ROI Image 1", + InitExportClientHistogram, DoExportClientHistogram, NullProc, + EndExportClientHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ExportClParmVec[ 2 ] } }, + {"-exportclienthistogramroi2","IP/IR/ECH ROI Image 2", + InitExportClientHistogram, DoExportClientHistogram, NullProc, + EndExportClientHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &ExportClParmVec[ 2 ] } }, + {"-exportclienthistogramroi3","IP/IR/ECH ROI Image 3", + InitExportClientHistogram, DoExportClientHistogram, NullProc, + EndExportClientHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL, NULL }, + ( XPointer ) &ExportClParmVec[ 2 ] } }, + {"-exportclienthistogramroi4","IP/IR/ECH ROI Image 4", + InitExportClientHistogram, DoExportClientHistogram, NullProc, + EndExportClientHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 5 ], NULL, NULL, NULL }, + ( XPointer ) &ExportClParmVec[ 2 ] } }, + {"-exportclienthistogramcplane1","IP/IP/ECH Control Plane Image 1", + InitExportClientHistogram, DoExportClientHistogram, NullProc, + EndExportClientHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ExportClParmVec[ 3 ] } }, + {"-exportclienthistogramcplane2","IP/IR/ECH Control Plane Image 2", + InitExportClientHistogram, DoExportClientHistogram, NullProc, + EndExportClientHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &ExportClParmVec[ 3 ] } }, + {"-exportclienthistogramcplane3","IP/IR/ECH Control Plane Image 3", + InitExportClientHistogram, DoExportClientHistogram, NullProc, + EndExportClientHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL, NULL }, + ( XPointer ) &ExportClParmVec[ 3 ] } }, + {"-exportclienthistogramcplane4","IP/IR/ECH Control Plane Image 4", + InitExportClientHistogram, DoExportClientHistogram, NullProc, + EndExportClientHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 5 ], NULL, NULL, NULL }, + ( XPointer ) &ExportClParmVec[ 3 ] } }, + {"-importlut1","IL/EL src = dest", + InitImportLUT, DoImportLUT, NullProc, + EndImportLUT, VALL, 0, 0, + {1, 0, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) NULL } }, + {"-importphoto1","IP/EP 512x512x8 src = dest", + InitImportPhoto, DoImportPhoto, NullProc, + EndImportPhoto, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) NULL } }, + {"-importphoto2","IP/ED 512x512x8", + InitImportPhotoExportDrawable, DoImportPhoto, NullProc, + EndImportPhoto, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) NULL } }, + {"-importroi1","IR/ER 10 rectangles src = dest", + InitImportROI, DoImportROI, NullProc, + EndImportROI, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) &ImportParmVec[ 3 ] } }, + {"-importroi2","IR/ER 100 rectangles src = dest", + InitImportROI, DoImportROI, NullProc, + EndImportROI, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { NULL, NULL, NULL, NULL }, + ( XPointer ) &ImportParmVec[ 4 ] } }, + {"-importdrawable1","ID/ED 600x600x8 - Pixmap src, window dest", + InitImportDrawablePixmap, DoImportDrawablePixmap, NullProc, + EndImportDrawablePixmap, VALL, 0, 0, + {1, 0, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ImportParmVec[0] } }, + {"-importdrawable2","ID/ED 600x600x8 src = dest, Window", + InitImportDrawableWindow, DoImportDrawableWindow, NullProc, + EndImportDrawableWindow, VALL, 0, 0, + {1, 0, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ImportParmVec[0] } }, + {"-importdrawable3","ID/ED 600x600x8 - Window src, dest obscuring", + InitImportDrawableWindow, DoImportDrawableWindow, NullProc, + EndImportDrawableWindow, VALL, 0, 0, + {1, 0, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ImportParmVec[2] } }, + {"-importdrawable4","ID/ED 600x600x8 - Window src, dest obscured", + InitImportDrawableWindow, DoImportDrawableWindow, NullProc, + EndImportDrawableWindow, VALL, 0, 0, + {1, 0, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ImportParmVec[1] } }, + {"-importdrawable5","IDP/EDP 600x600x8 src = dest, Pixmap src", + InitImportDrawablePlanePixmap, DoImportDrawablePlanePixmap, + NullProc, EndImportDrawablePixmap, VALL, 0, 0, + {1, 0, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ImportParmVec[0] } }, + {"-importdrawable6","IDP/EDP 600x600x8 src = dest, Window src", + InitImportDrawablePlaneWindow, DoImportDrawablePlaneWindow, + NullProc, EndImportDrawableWindow, VALL, 0, 0, + {1, 0, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ImportParmVec[0] } }, + {"-importdrawable7","IDP/EDP 600x600x8 - Window src, dest obscuring", + InitImportDrawablePlaneWindow, DoImportDrawablePlaneWindow, + NullProc, EndImportDrawableWindow, VALL, 0, 0, + {1, 0, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ImportParmVec[2] } }, + {"-importdrawable8","IDP/EDP 600x600x8 - Window src, dest obscured", + InitImportDrawablePlaneWindow, DoImportDrawablePlaneWindow, + NullProc, EndImportDrawableWindow, VALL, 0, 0, + {1, 0, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ImportParmVec[1] } }, + {"-constrain1","Constrain HardClip IP/C/ED 512x512x8", + InitConstrain, DoConstrain, NullProc, + EndConstrain, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ConstrainParmVec[0] } }, + {"-constrain2","Constrain ClipScale IP/C/ED 512x512x8", + InitConstrain, DoConstrain, NullProc, + EndConstrain, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ConstrainParmVec[1] } }, + {"-constrainphoto1","Constrain HardClip IP/C/EP 512x512x8", + InitConstrain, DoConstrain, NullProc, + EndConstrain, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ConstrainParmVec[3] } }, + {"-constrainphoto2","Constrain ClipScale IP/C/EP 512x512x8", + InitConstrain, DoConstrain, NullProc, + EndConstrain, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ConstrainParmVec[4] } }, + {"-convolve1","Convolve IP/C/ED Boxcar 3x3 Default Technique", + InitConvolve, DoConvolve, NullProc, + EndConvolve, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ConvolveParmVec[0] } }, + {"-convolve2","Convolve IP/C/ED Boxcar 5x5 Default Technique", + InitConvolve, DoConvolve, NullProc, + EndConvolve, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ConvolveParmVec[1] } }, + {"-convolve3","Convolve IP/C/ED LaPlacian 3x3 Default Technique", + InitConvolve, DoConvolve, NullProc, + EndConvolve, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ConvolveParmVec[2] } }, + {"-convolve4","Convolve IP/C/ED LaPlacian 5x5 Default Technique", + InitConvolve, DoConvolve, NullProc, + EndConvolve, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ConvolveParmVec[3] } }, + {"-convolveroi1","Convolve IP/C/ED ROI LaPlacian 3x3 Default Technique", + InitConvolve, DoConvolve, NullProc, + EndConvolve, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ConvolveParmVec[4] } }, + {"-convolveroi2","Convolve IP/C/ED ROI LaPlacian 5x5 Default Technique", + InitConvolve, DoConvolve, NullProc, + EndConvolve, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ConvolveParmVec[5] } }, + {"-convolvectlplane1","Convolve IP/C/ED ControlPlane LaPlacian 3x3 Default Technique", + InitConvolve, DoConvolve, NullProc, + EndConvolve, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ConvolveParmVec[6] } }, + {"-convolvectlplane2","Convolve IP/C/ED ControlPlane LaPlacian 5x5 Default Technique", + InitConvolve, DoConvolve, NullProc, + EndConvolve, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ConvolveParmVec[7] } }, + {"-math1","Math IP/U/M/M/C/ED HardClip sqrt, square", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[0] } }, + {"-math2","Math IP/U/M/M/C/ED HardClip square, sqrt", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[1] } }, + {"-math3","Math IP/U/M/M/C/ED HardClip exp, ln", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[2] } }, + {"-math4","Math IP/U/M/M/C/ED HardClip ln, exp", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[3] } }, + {"-math5","Math IP/U/M/C/ED ClipScale log2", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[4] } }, + {"-math6","Math IP/U/M/C/ED ClipScale log10", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[5] } }, + {"-math7","Math IP/M/M/ED No Clip sqrt, square", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[6] } }, + {"-mathroi1","Math ROI IP/IR/U/M/M/C/ED HardClip sqrt, square", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[7] } }, + {"-mathroi2","Math ROI IP/IR/U/M/M/C/ED HardClip square, sqrt", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[8] } }, + {"-mathroi3","Math ROI IP/IR/U/M/M/C/ED HardClip exp, ln", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[9] } }, + {"-mathroi4","Math ROI IP/IR/U/M/M/C/ED HardClip ln, exp", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[10] } }, + {"-mathroi5","Math ROI IP/IR/U/M/C/ED ClipScale log2", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[11] } }, + {"-mathroi6","Math ROI IP/IR/U/M/C/ED ClipScale log10", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[12] } }, + {"-mathroi7","Math ROI IP/IR/M/M/ED No Clip sqrt, square", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[13] } }, + {"-mathcplane1","Math Control Plane IP/IP/U/M/M/C/ED HardClip sqrt, square", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[14] } }, + {"-mathcplane2","Math Control Plane IP/IP/U/M/M/C/ED HardClip square, sqrt", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[15] } }, + {"-mathcplane3","Math Control Plane IP/IP/U/M/M/C/ED HardClip exp, ln", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[16] } }, + {"-mathcplane4","Math Control Plane IP/IP/U/M/M/C/ED HardClip ln, exp", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[17] } }, + {"-mathcplane5","Math Control Plane IP/IP/U/M/C/ED ClipScale log2", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[18] } }, + {"-mathcplane6","Math Control Plane IP/IP/U/M/C/ED ClipScale log10", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[19] } }, + {"-mathcplane7","Math Control Plane IP/IP/M/M/ED No Clip sqrt, square", + InitMath, DoMath, NullProc, + EndMath, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &MathParmVec[20] } }, + {"-arithmeticdyadic1","Arithmetic IP/A/ED Dyadic Add", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[0] } }, + {"-arithmeticdyadic2","Arithmetic IP/A/ED Dyadic Sub", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[1] } }, + {"-arithmeticdyadic3","Arithmetic IP/A/ED Dyadic SubRev", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[2] } }, + {"-arithmeticdyadic4","Arithmetic IP/A/ED Dyadic Min", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[6] } }, + {"-arithmeticdyadic5","Arithmetic IP/A/ED Dyadic Max", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[7] } }, + {"-arithmeticmonadic1","Arithmetic IP/A/ED Monadic Add 64", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[0] } }, + {"-arithmeticmonadic2","Arithmetic IP/A/ED Monadic Sub 64", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[1] } }, + {"-arithmeticmonadic3","Arithmetic IP/A/ED Monadic SubRev 250", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[2] } }, + {"-arithmeticmonadic4","Arithmetic IP/A/ED Monadic Mul 0.66", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[3] } }, + {"-arithmeticmonadic5","Arithmetic IP/A/ED Monadic Div 1.5", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[4] } }, + {"-arithmeticmonadic6","Arithmetic IP/A/ED Monadic DivRev 25500", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[5] } }, + {"-arithmeticmonadic7","Arithmetic IP/A/ED Monadic Min 128", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[6] } }, + {"-arithmeticmonadic8","Arithmetic IP/A/ED Monadic Max 128", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[7] } }, + {"-arithmeticmonadic9","Arithmetic IP/A/ED Monadic Gamma 1.1", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[8] } }, + {"-arithmeticdyadicroi1","Arithmetic IP/A/ED ROI Dyadic Add", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[9] } }, + {"-arithmeticdyadicroi2","Arithmetic IP/A/ED ROI Dyadic Sub", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[10] } }, + {"-arithmeticdyadicroi3","Arithmetic IP/A/ED ROI Dyadic SubRev", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[11] } }, + {"-arithmeticdyadicroi4","Arithmetic IP/A/ED ROI Dyadic Min", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[15] } }, + {"-arithmeticdyadicroi5","Arithmetic IP/A/ED ROI Dyadic Max", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[16] } }, + {"-arithmeticmonadicroi1","Arithmetic IP/A/ED ROI Monadic Add 64", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[9] } }, + {"-arithmeticmonadicroi2","Arithmetic IP/A/ED ROI Monadic Sub 64", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[10] } }, + {"-arithmeticmonadicroi3","Arithmetic IP/A/ED ROI Monadic SubRev 250", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[11] } }, + {"-arithmeticmonadicroi4","Arithmetic IP/A/ED ROI Monadic Mul 0.66", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[12] } }, + {"-arithmeticmonadicroi5","Arithmetic IP/A/ED ROI Monadic Div 1.5", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[13] } }, + {"-arithmeticmonadicroi6","Arithmetic IP/A/ED ROI Monadic DivRev 25500", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[14] } }, + {"-arithmeticmonadicroi7","Arithmetic IP/A/ED ROI Monadic Min 128", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[15] } }, + {"-arithmeticmonadicroi8","Arithmetic IP/A/ED ROI Monadic Max 128", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[16] } }, + {"-arithmeticmonadicroi9","Arithmetic IP/A/ED ROI Monadic Gamma 1.1", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[17] } }, + {"-arithmeticdyadiccplane1","Arithmetic IP/A/ED Control Plane Dyadic Add", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[37] } }, + {"-arithmeticdyadiccplane2","Arithmetic IP/A/ED Control Plane Dyadic Sub", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[38] } }, + {"-arithmeticdyadiccplane3","Arithmetic IP/A/ED Control Plane Dyadic SubRev", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[39] } }, + {"-arithmeticdyadiccplane4","Arithmetic IP/A/ED Control Plane Dyadic Min", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[43] } }, + {"-arithmeticdyadiccplane5","Arithmetic IP/A/ED Control Plane Dyadic Max", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[44] } }, + {"-arithmeticmonadiccplane1","Arithmetic IP/A/ED Control Plane Monadic Add 64", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[37] } }, + {"-arithmeticmonadiccplane2","Arithmetic IP/A/ED Control Plane Monadic Sub 64", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[38] } }, + {"-arithmeticmonadiccplane3","Arithmetic IP/A/ED Control Plane Monadic SubRev 250", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[39] } }, + {"-arithmeticmonadiccplane4","Arithmetic IP/A/ED Control Plane Monadic Mul 0.66", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[40] } }, + {"-arithmeticmonadiccplane5","Arithmetic IP/A/ED Control Plane Monadic Div 1.5", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[41] } }, + {"-arithmeticmonadiccplane6","Arithmetic IP/A/ED Control Plane Monadic DivRev 25500", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[42] } }, + {"-arithmeticmonadiccplane7","Arithmetic IP/A/ED Control Plane Monadic Min 128", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[43] } }, + {"-arithmeticmonadiccplane8","Arithmetic IP/A/ED Control Plane Monadic Max 128", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[44] } }, + {"-arithmeticmonadiccplane9","Arithmetic IP/A/ED Control Plane Monadic Gamma 1.1", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[45] } }, + {"-arithmeticfloatdyadic1","Arithmetic Unconstrained IP/U/A/C/ED Dyadic Add", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[18] } }, + {"-arithmeticfloatdyadic2","Arithmetic Unconstrained IP/U/A/C/ED Dyadic Sub", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[19] } }, + {"-arithmeticfloatdyadic3","Arithmetic Unconstrained IP/U/A/C/ED Dyadic SubRev", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[20] } }, + {"-arithmeticfloatdyadic4","Arithmetic Unconstrained IP/U/A/C/ED Dyadic Min", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[24] } }, + {"-arithmeticfloatdyadic5","Arithmetic Unconstrained IP/U/A/C/ED Dyadic Max", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[25] } }, + {"-arithmeticfloatmonadic1","Arithmetic Unconstrained IP/U/A/C/ED Monadic Add 64", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[18] } }, + {"-arithmeticfloatmonadic2","Arithmetic Unconstrained IP/U/A/C/ED Monadic Sub 64", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[19] } }, + {"-arithmeticfloatmonadic3","Arithmetic Unconstrained IP/U/A/C/ED Monadic SubRev 250", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[20] } }, + {"-arithmeticfloatmonadic4","Arithmetic Unconstrained IP/U/A/C/ED Monadic Mul 0.66", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[21] } }, + {"-arithmeticfloatmonadic5","Arithmetic Unconstrained IP/U/A/C/ED Monadic Div 1.5", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[22] } }, + {"-arithmeticfloatmonadic6","Arithmetic Unconstrained IP/U/A/C/ED Monadic DivRev 25500", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[23] } }, + {"-arithmeticfloatmonadic7","Arithmetic Unconstrained IP/U/A/C/ED Monadic Min 128", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[24] } }, + {"-arithmeticfloatmonadic8","Arithmetic Unconstrained IP/U/A/C/ED Monadic Max 128", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[25] } }, + {"-arithmeticfloatmonadic9","Arithmetic Unconstrained IP/U/A/C/ED Monadic Gamma 1.1", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[26] } }, + {"-arithmeticroifloatdyadic1","Arithmetic Unconstrained IP/U/A/C/ED ROI Dyadic Add", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[27] } }, + {"-arithmeticroifloatdyadic2","Arithmetic Unconstrained IP/U/A/C/ED ROI Dyadic Sub", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[28] } }, + {"-arithmeticroifloatdyadic3","Arithmetic Unconstrained IP/U/A/C/ED ROI Dyadic SubRev", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[29] } }, + {"-arithmeticroifloatdyadic4","Arithmetic Unconstrained IP/U/A/C/ED ROI Dyadic Min", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[33] } }, + {"-arithmeticroifloatdyadic5","Arithmetic Unconstrained IP/U/A/C/ED ROI Dyadic Max", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[34] } }, + {"-arithmeticroifloatmonadic1","Arithmetic Unconstrained IP/U/A/C/ED ROI Monadic Add 64", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[27] } }, + {"-arithmeticroifloatmonadic2","Arithmetic Unconstrained IP/U/A/C/ED ROI Monadic Sub 64", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[28] } }, + {"-arithmeticroifloatmonadic3","Arithmetic Unconstrained IP/U/A/C/ED ROI Monadic SubRev 250", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[29] } }, + {"-arithmeticroifloatmonadic4","Arithmetic Unconstrained IP/U/A/C/ED ROI Monadic Mul 0.66", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[30] } }, + {"-arithmeticroifloatmonadic5","Arithmetic Unconstrained IP/U/A/C/ED ROI Monadic Div 1.5", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[31] } }, + {"-arithmeticroifloatmonadic6","Arithmetic Unconstrained IP/U/A/C/ED ROI Monadic DivRev 25500", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[32] } }, + {"-arithmeticroifloatmonadic7","Arithmetic Unconstrained IP/U/A/C/ED ROI Monadic Min 128", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[33] } }, + {"-arithmeticroifloatmonadic8","Arithmetic Unconstrained IP/U/A/C/ED ROI Monadic Max 128", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[34] } }, + {"-arithmeticroifloatmonadic9","Arithmetic Unconstrained IP/U/A/C/ED ROI Monadic Gamma 1.1", + InitArithmetic, DoArithmetic, NullProc, + EndArithmetic, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ArithmeticParmVec[35] } }, + {"-band1","BandSelect IP/BS/BS/BS/BC/BE/ED Color visual, or IP/BS/D/ED Gray visual 1", + InitBandSelectExtract, DoBand, NullProc, + EndBandSelectExtract, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &BandParmVec[0] } }, + {"-band2","BandCombine IP/IP/IP/BC/BE/ED, BE coeffs = CCIR 601-1", + InitBandCombine, DoBand, NullProc, + EndBandCombine, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], &ImageInfo[ 5 ], NULL }, + ( XPointer ) &BandParmVec[2] } }, + {"-band3","BandExtract IP/BE/ED, Gray ramp, BE coeffs = CCIR 601-1", + InitBandColormap, DoBand, NullProc, + EndBandColormap, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &BandParmVec[3] } }, + {"-band4","BandExtract IP/BE/ED, RGB_BEST_MAP ( or RGB_GRAY_MAP )", + InitBandColormap, DoBand, NullProc, + EndBandColormap, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &BandParmVec[4] } }, + {"-band5","BandExtract IP/BE/ED, RGB_DEFAULT_MAP ( or RGB_GRAY_MAP )", + InitBandColormap, DoBand, NullProc, + EndBandColormap, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &BandParmVec[5] } }, + {"-comparedyadic1","Compare IP/CMP/EDP Dyadic LT", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &CompareParmVec[0] } }, + {"-comparedyadic2","Compare IP/CMP/EDP Dyadic LE", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &CompareParmVec[1] } }, + {"-comparedyadic3","Compare IP/CMP/EDP Dyadic EQ", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &CompareParmVec[2] } }, + {"-comparedyadic4","Compare IP/CMP/EDP Dyadic NE", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &CompareParmVec[3] } }, + {"-comparedyadic5","Compare IP/CMP/EDP Dyadic GE", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &CompareParmVec[4] } }, + {"-comparedyadic6","Compare IP/CMP/EDP Dyadic GT", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &CompareParmVec[5] } }, + {"-comparemonadic1","Compare IP/CMP/EDP Monadic LT 128", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &CompareParmVec[0] } }, + {"-comparemonadic2","Compare IP/CMP/EDP Monadic LE 128", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &CompareParmVec[1] } }, + {"-comparemonadic3","Compare IP/CMP/EDP Monadic EQ 128", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &CompareParmVec[2] } }, + {"-comparemonadic4","Compare IP/CMP/EDP Monadic NE 128", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &CompareParmVec[3] } }, + {"-comparemonadic5","Compare IP/CMP/EDP Monadic GE 128", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &CompareParmVec[4] } }, + {"-comparemonadic6","Compare IP/CMP/EDP Monadic GT 128", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &CompareParmVec[5] } }, + {"-compareroidyadic1","Compare ROI IP/CMP/EDP Dyadic LT", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &CompareParmVec[6] } }, + {"-compareroidyadic2","Compare ROI IP/CMP/EDP Dyadic LE", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &CompareParmVec[7] } }, + {"-compareroidyadic3","Compare ROI IP/CMP/EDP Dyadic EQ", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &CompareParmVec[8] } }, + {"-compareroidyadic4","Compare ROI IP/CMP/EDP Dyadic NE", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &CompareParmVec[9] } }, + {"-compareroidyadic5","Compare ROI IP/CMP/EDP Dyadic GE", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &CompareParmVec[10] } }, + {"-compareroidyadic6","Compare ROI IP/CMP/EDP Dyadic GT", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &CompareParmVec[11] } }, + {"-compareroimonadic1","Compare ROI IP/CMP/EDP Monadic 128 LT", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &CompareParmVec[6] } }, + {"-compareroimonadic2","Compare ROI IP/CMP/EDP Monadic 128 LE", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &CompareParmVec[7] } }, + {"-compareroimonadic3","Compare ROI IP/CMP/EDP Monadic 128 EQ", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &CompareParmVec[8] } }, + {"-compareroimonadic4","Compare ROI IP/CMP/EDP Monadic 128 NE", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &CompareParmVec[9] } }, + {"-compareroimonadic5","Compare ROI IP/CMP/EDP Monadic 128 GE", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &CompareParmVec[10] } }, + {"-compareroimonadic6","Compare ROI IP/CMP/EDP Monadic 128 GT", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &CompareParmVec[11] } }, + {"-comparecplanedyadic1","Compare Control Plane IP/CMP/EDP Dyadic LT", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &CompareParmVec[12] } }, + {"-comparecplanedyadic2","Compare Control Plane IP/CMP/EDP Dyadic LE", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &CompareParmVec[13] } }, + {"-comparecplanedyadic3","Compare Control Plane IP/CMP/EDP Dyadic EQ", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &CompareParmVec[14] } }, + {"-comparecplanedyadic4","Compare Control Plane IP/CMP/EDP Dyadic NE", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &CompareParmVec[15] } }, + {"-comparecplanedyadic5","Compare Control Plane IP/CMP/EDP Dyadic GE", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &CompareParmVec[16] } }, + {"-comparecplanedyadic6","Compare Control Plane IP/CMP/EDP Dyadic GT", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &CompareParmVec[17] } }, + {"-comparecplanemonadic1","Compare Control Plane IP/CMP/EDP Monadic 128 LT", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &CompareParmVec[12] } }, + {"-comparecplanemonadic2","Compare Control Plane IP/CMP/EDP Monadic 128 LE", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &CompareParmVec[13] } }, + {"-comparecplanemonadic3","Compare Control Plane IP/CMP/EDP Monadic 128 EQ", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &CompareParmVec[14] } }, + {"-comparecplanemonadic4","Compare Control Plane IP/CMP/EDP Monadic 128 NE", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &CompareParmVec[15] } }, + {"-comparecplanemonadic5","Compare Control Plane IP/CMP/EDP Monadic 128 GE", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &CompareParmVec[16] } }, + {"-comparecplanemonadic6","Compare Control Plane IP/CMP/EDP Monadic 128 GT", + InitCompare, DoCompare, NullProc, + EndCompare, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &CompareParmVec[17] } }, + {"-matchhistogram1","MatchHistogram IP/ED/MH/ED/ECH Flat Image 1", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[0] } }, + {"-matchhistogram2","MatchHistogram IP/ED/MH/ED/ECH Flat Image 2", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[0] } }, + {"-matchhistogram3","MatchHistogram IP/ED/MH/ED/ECH Flat Image 3", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL , NULL}, + ( XPointer ) &MatchHistogramParmVec[0] } }, + {"-matchhistogram4","MatchHistogram IP/ED/MH/ED/ECH Gaussian mean 64 sigma 32 Image 1", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[1] } }, + {"-matchhistogram5","MatchHistogram IP/ED/MH/ED/ECH Gaussian mean 64 sigma 32 Image 2", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[1] } }, + {"-matchhistogram6","MatchHistogram IP/ED/MH/ED/ECH Gaussian mean 64 sigma 32 Image 3", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[1] } }, + {"-matchhistogram7","MatchHistogram IP/ED/MH/ED/ECH Gaussian mean 128 sigma 64 Image 1", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[2] } }, + {"-matchhistogram8","MatchHistogram IP/ED/MH/ED/ECH Gaussian mean 128 sigma 64 Image 2", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[2] } }, + {"-matchhistogram9","MatchHistogram IP/ED/MH/ED/ECH Gaussian mean 128 sigma 64 Image 3", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[2] } }, + {"-matchhistogram10","MatchHistogram IP/ED/MH/ED/ECH Gaussian mean 192 sigma 32 Image 1", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[3] } }, + {"-matchhistogram11","MatchHistogram IP/ED/MH/ED/ECH Gaussian mean 192 sigma 32 Image 2", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[3] } }, + {"-matchhistogram12","MatchHistogram IP/ED/MH/ED/ECH Gaussian mean 192 sigma 32 Image 3", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[3] } }, + {"-matchhistogram13","MatchHistogram IP/ED/MH/ED/ECH Hyperbolic const 64 True Image 1", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[4] } }, + {"-matchhistogram14","MatchHistogram IP/ED/MH/ED/ECH Hyperbolic const 64 True Image 2", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[4] } }, + {"-matchhistogram15","MatchHistogram IP/ED/MH/ED/ECH Hyperbolic const 64 True Image 3", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL, NULL}, + ( XPointer ) &MatchHistogramParmVec[4] } }, + {"-matchhistogram16","MatchHistogram IP/ED/MH/ED/ECH Hyperbolic const 64 False Image 1", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[5] } }, + {"-matchhistogram17","MatchHistogram IP/ED/MH/ED/ECH Hyperbolic const 64 False Image 2", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[5] } }, + {"-matchhistogram18","MatchHistogram IP/ED/MH/ED/ECH Hyperbolic const 64 False Image 3", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[5] } }, + {"-matchhistogramroi1","MatchHistogram ROI IP/ED/MH/ED/ECH Flat Image 3", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[6] } }, + {"-matchhistogramroi2","MatchHistogram ROI IP/ED/MH/ED/ECH Gaussian mean 64 sigma 32 Image 3", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[7] } }, + {"-matchhistogramroi3","MatchHistogram ROI IP/ED/MH/ED/ECH Gaussian mean 128 sigma 64 Image 3", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[8] } }, + {"-matchhistogramroi4","MatchHistogram ROI IP/ED/MH/ED/ECH Gaussian mean 192 sigma 32 Image 3", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[9] } }, + {"-matchhistogramroi5","MatchHistogram ROI IP/ED/MH/ED/ECH Hyperbolic const 64 True Image 3", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[10] } }, + {"-matchhistogramroi6","MatchHistogram ROI IP/ED/MH/ED/ECH Hyperbolic const 64 True Image 3", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[11] } }, + {"-matchhistogramcplane1","MatchHistogram Control Plane IP/ED/MH/ED/ECH Flat Image 3", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[12] } }, + {"-matchhistogramcplane2","MatchHistogram Control Plane IP/ED/MH/ED/ECH Gaussian mean 64 sigma 32 Image 3", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[13] } }, + {"-matchhistogramcplane3","MatchHistogram Control Plane IP/ED/MH/ED/ECH Gaussian mean 128 sigma 64 Image 3", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[14] } }, + {"-matchhistogramcplane4","MatchHistogram Control Plane IP/ED/MH/ED/ECH Gaussian mean 192 sigma 32 Image 3", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[15] } }, + {"-matchhistogramcplane5","MatchHistogram Control Plane IP/ED/MH/ED/ECH Hyperbolic const 64 True Image 3", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[16] } }, + {"-matchhistogramcplane6","MatchHistogram Control Plane IP/ED/MH/ED/ECH Hyperbolic const 64 True Image 3", + InitMatchHistogram, DoMatchHistogram, NullProc, + EndMatchHistogram, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 2 ], NULL, NULL, NULL }, + ( XPointer ) &MatchHistogramParmVec[17] } }, + {"-unconstrain1","Unconstrain/Constrain ClipScale IP/UC/C/ED 512x512x8", + InitUnconstrain, DoUnconstrain, NullProc, + EndUnconstrain, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL}, + ( XPointer ) &UnconstrainParmVec[0] } }, + {"-pasteup1","PasteUp IP/P/ED 512x512x8", + InitPasteUp, DoPasteUp, NullProc, + EndPasteUp, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 1 ], NULL, NULL, NULL }, + ( XPointer ) &PasteUpParmVec[0] } }, + {"-pasteup2","PasteUp Overlapping tiles with constant fill IP/P/ED 512x512x8", + InitPasteUp, DoPasteUp, NullProc, + EndPasteUp, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 1 ], NULL, NULL, NULL }, + ( XPointer ) &PasteUpParmVec[1] } }, + {"-geometry1","Geometry Rotate 12 degrees NearestNeighbor IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[0] } }, + {"-geometry2","Geometry Rotate 147 degrees NearestNeighbor IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[1] } }, + {"-geometry3","Geometry Rotate 193 degrees Nearest Neighbor IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[2] } }, + {"-geometry4","Geometry Rotate 311 degrees Nearest Neighbor IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[3] } }, + {"-geometry5","Geometry Mirror X Nearest Neighbor IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[4] } }, + {"-geometry6","Geometry Mirror Y Nearest Neighbor IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[5] } }, + {"-geometry7","Geometry Mirror XY NearestNeighbor IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[6] } }, + {"-geometry8","Crop x=256, y=256, w=256, h=256 NearestNeighbor IP/G/ED", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[7] } }, + {"-geometry9","Scale NearestNeighbor 128x128 IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[8] } }, + {"-geometry10","Scale NearestNeighbor 256x256 IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[9] } }, + {"-geometry11","Scale NearestNeighbor 256x512 IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[10] } }, + {"-geometry12","Scale NearestNeighbor 512x128 IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[11] } }, + {"-geometry13","Scale NearestNeighbor 256x768 IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[12] } }, + {"-geometry14","Scale NearestNeighbor 768x128 IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[13] } }, + {"-geometry15","Geometry Rotate 12 degrees Antialias IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[14] } }, + {"-geometry16","Geometry Rotate 147 degrees Antialias IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[15] } }, + {"-geometry17","Geometry Rotate 193 degrees Antialias IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[16] } }, + {"-geometry18","Geometry Rotate 311 degrees Antialias IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[17] } }, + {"-geometry19","Geometry Mirror X Antialias IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[18] } }, + {"-geometry20","Geometry Mirror Y Antialias IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[19] } }, + {"-geometry21","Geometry Mirror XY Antialias IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[20] } }, + {"-geometry22","Crop x=256, y=256, w=256, h=256 Antialias IP/G/ED", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[21] } }, + {"-geometry23","Scale Antialias 128x128 IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[22] } }, + {"-geometry24","Scale Antialias 256x256 IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[23] } }, + {"-geometry25","Scale Antialias 256x512 IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[24] } }, + {"-geometry26","Scale Antialias 512x128 IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[25] } }, + {"-geometry27","Scale Antialias 256x768 IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[26] } }, + {"-geometry28","Scale Antialias 768x128 IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[27] } }, + {"-geometry29","Geometry Rotate 12 degrees Bilinear Interp IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[40] } }, + {"-geometry30","Geometry Rotate 147 degrees Bilinear Interp IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[41] } }, + {"-geometry31","Geometry Rotate 193 degrees Bilinear Interp IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[42] } }, + {"-geometry32","Geometry Rotate 311 degrees Bilinear Interp IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[43] } }, + {"-geometry33","Geometry Mirror X Bilinear Interp IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[44] } }, + {"-geometry34","Geometry Mirror Y Bilinear Interp IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[45] } }, + {"-geometry35","Geometry Mirror XY Bilinear Interp IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[46] } }, + {"-geometry36","Crop x=256, y=256, w=256, h=256 Bilinear Interp IP/G/ED", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[47] } }, + {"-geometry37","Scale Bilinear Interp 128x128 IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[48] } }, + {"-geometry38","Scale Bilinear Interp 256x256 IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[49] } }, + {"-geometry39","Scale Bilinear Interp 256x512 IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[50] } }, + {"-geometry40","Scale Bilinear Interp 512x128 IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[51] } }, + {"-geometry41","Scale Bilinear Interp 256x768 IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[52] } }, + {"-geometry42","Scale Bilinear Interp 768x128 IP/G/ED 512x512x8", + InitGeometry, DoGeometry, NullProc, + EndGeometry, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 12 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[53] } }, + {"-geomg31dscale1","Geometry Scaled G31D FAX NearestNeighbor IP/G/ED 1728x1102", + InitGeometryFAX, DoGeometryFAX, NullProc, + EndGeometryFAX, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 7 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[28] } }, + {"-geomg31dscale2","Geometry Scaled G31D FAX AntiAlias IP/G/ED 1728x1102", + InitGeometryFAX, DoGeometryFAX, NullProc, + EndGeometryFAX, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 7 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[29] } }, + {"-geomtiffpbscale1","Geometry Scaled TIFFPackBits FAX NearestNeighbor IP/G/ED 1728x2132", + InitGeometryFAX, DoGeometryFAX, NullProc, + EndGeometryFAX, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 8 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[28] } }, + {"-geomtiffpbscale2","Geometry Scaled TIFFPackBits FAX AntiAlias IP/G/ED 1728x2132", + InitGeometryFAX, DoGeometryFAX, NullProc, + EndGeometryFAX, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 8 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[29] } }, + {"-geomtiff2scale1","Geometry Scaled TIFF2 FAX NearestNeighbor IP/G/ED 1728x2132", + InitGeometryFAX, DoGeometryFAX, NullProc, + EndGeometryFAX, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 9 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[28] } }, + {"-geomtiff2scale2","Geometry Scaled TIFF2 FAX AntiAlias IP/G/ED 1728x2132", + InitGeometryFAX, DoGeometryFAX, NullProc, + EndGeometryFAX, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 9 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[29] } }, + {"-geomg32dscale1","Geometry Scaled G32D FAX NearestNeighbor IP/G/ED 1728x2100", + InitGeometryFAX, DoGeometryFAX, NullProc, + EndGeometryFAX, VALL, 0, 0, + {1, 0, 2048, + { &ImageInfo[ 6 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[28] } }, + {"-geomg32dscale2","Geometry Scaled G32D FAX AntiAlias IP/G/ED 1728x2100", + InitGeometryFAX, DoGeometryFAX, NullProc, + EndGeometryFAX, VALL, 0, 0, + {1, 0, 2048, + { &ImageInfo[ 6 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[29] } }, + {"-geomg4scale1","Geometry Scaled G42D FAX NearestNeighbor IP/G/ED 2560x3300", + InitGeometryFAX, DoGeometryFAX, NullProc, + EndGeometryFAX, VALL, 0, 0, + {1, 0, 2048, + { &ImageInfo[ 4 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[30] } }, + {"-geomg4scale2","Geometry Scaled G42D FAX AntiAlias IP/G/ED 2560x3300", + InitGeometryFAX, DoGeometryFAX, NullProc, + EndGeometryFAX, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 4 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[31] } }, + {"-geometryfax1","Geometry Scaled Rotate 12 degrees G42D FAX NearestNeighbor IP/G/ED 2560x3300", + InitGeometryFAX, DoGeometryFAX, NullProc, + EndGeometryFAX, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 4 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[32] } }, + {"-geometryfax2","Geometry Scaled Rotate 12 degrees G42D FAX Antialias IP/G/ED 2560x3300", + InitGeometryFAX, DoGeometryFAX, NullProc, + EndGeometryFAX, VALL, 0, 0, + {1, 0, 2048, + { &ImageInfo[ 4 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[36] } }, + {"-geometryfaxradio1","Geometry Scaled G42D Antialias IP/G/ED 2560x3300 radio True", + InitGeometryFAX, DoGeometryFAX, NullProc, + EndGeometryFAX, VALL, 0, 0, + {1, 0, 2048, + { &ImageInfo[ 4 ], NULL, NULL, NULL }, + ( XPointer ) &GeometryParmVec[54] } }, + {"-dither1","Dither diffusion IP/D/ED 512x512x8", + InitDither, DoDither, NullProc, + EndDither, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &DitherParmVec[ 0 ] } }, + {"-dither2","Dither diffusion IP/D/EDP 512x512x8", + InitDither, DoDither, NullProc, + EndDither, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &DitherParmVec[ 1 ] } }, + {"-dither3","Dither Ordered(4) IP/D/ED 512x512x8", + InitDither, DoDither, NullProc, + EndDither, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &DitherParmVec[ 2 ] } }, + {"-dither4","Dither Ordered(4) IP/D/EDP 512x512x8", + InitDither, DoDither, NullProc, + EndDither, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &DitherParmVec[ 3 ] } }, + {"-dither5","Dither Ordered(8) IP/D/ED 512x512x8", + InitDither, DoDither, NullProc, + EndDither, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &DitherParmVec[ 4 ] } }, + {"-dither6","Dither Ordered(8) IP/D/EDP 512x512x8", + InitDither, DoDither, NullProc, + EndDither, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &DitherParmVec[ 5 ] } }, + {"-dither7","Dither default IP/D/ED 512x512x8", + InitDither, DoDither, NullProc, + EndDither, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &DitherParmVec[ 6 ] } }, + {"-dither8","Dither default IP/D/EDP 512x512x8", + InitDither, DoDither, + NullProc, EndDither, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &DitherParmVec[ 7 ] } }, + {"-logicalmonadic1","Logical IP/L/ED Monadic Clear ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 0 ] } }, + {"-logicalmonadic2","Logical IP/L/ED Monadic And ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 1 ] } }, + {"-logicalmonadic3","Logical IP/L/ED Monadic AndReverse ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 2 ] } }, + {"-logicalmonadic4","Logical IP/L/ED Monadic Copy ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 3 ] } }, + {"-logicalmonadic5","Logical IP/L/ED Monadic AndInverted ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 4 ] } }, + {"-logicalmonadic6","Logical IP/L/ED Monadic NoOp ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 5 ] } }, + {"-logicalmonadic7","Logical IP/L/ED Monadic Xor ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 6 ] } }, + {"-logicalmonadic8","Logical IP/L/ED Monadic Or ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 7 ] } }, + {"-logicalmonadic9","Logical IP/L/ED Monadic Nor ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 8 ] } }, + {"-logicalmonadic10","Logical IP/L/ED Monadic Equiv ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 9 ] } }, + {"-logicalmonadic11","Logical IP/L/ED Monadic Invert ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 10 ] } }, + {"-logicalmonadic12","Logical IP/L/ED Monadic OrReverse ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 11 ] } }, + {"-logicalmonadic13","Logical IP/L/ED Monadic CopyInverted ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 12 ] } }, + {"-logicalmonadic14","Logical IP/L/ED Monadic OrInverted ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 13 ] } }, + {"-logicalmonadic15","Logical IP/L/ED Monadic Nand ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 14 ] } }, + {"-logicalmonadic16","Logical IP/L/ED Monadic Set ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 15 ] } }, + {"-logicaldyadic1","Logical IP/L/ED Dyadic Clear ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 0 ] } }, + {"-logicaldyadic2","Logical IP/L/ED Dyadic And ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 1 ] } }, + {"-logicaldyadic3","Logical IP/L/ED Dyadic AndReverse ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 2 ] } }, + {"-logicaldyadic4","Logical IP/L/ED Dyadic Copy ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 3 ] } }, + {"-logicaldyadic5","Logical IP/L/ED Dyadic AndInverted ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 4 ] } }, + {"-logicaldyadic6","Logical IP/L/ED Dyadic NoOp ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 5 ] } }, + {"-logicaldyadic7","Logical IP/L/ED Dyadic Xor ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 6 ] } }, + {"-logicaldyadic8","Logical IP/L/ED Dyadic Or ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 7 ] } }, + {"-logicaldyadic9","Logical IP/L/ED Dyadic Nor ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 8 ] } }, + {"-logicaldyadic10","Logical IP/L/ED Dyadic Equiv ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 9 ] } }, + {"-logicaldyadic11","Logical IP/L/ED Dyadic Invert ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 10 ] } }, + {"-logicaldyadic12","Logical IP/L/ED Dyadic OrReverse ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 11 ] } }, + {"-logicaldyadic13","Logical IP/L/ED Dyadic CopyInverted ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 12 ] } }, + {"-logicaldyadic14","Logical IP/L/ED Dyadic OrInverted ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 13 ] } }, + {"-logicaldyadic15","Logical IP/L/ED Dyadic Nand ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 14 ] } }, + {"-logicaldyadic16","Logical IP/L/ED Dyadic Set ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 15 ] } }, + {"-logicalmonadicroi1","ROI Logical IP/IR/L/ED Monadic Clear ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 16 ] } }, + {"-logicalmonadicroi2","ROI Logical IP/IR/L/ED Monadic And ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 17 ] } }, + {"-logicalmonadicroi3","ROI Logical IP/IR/L/ED Monadic AndReverse ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 18 ] } }, + {"-logicalmonadicroi4","ROI Logical IP/IR/L/ED Monadic Copy ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 19 ] } }, + {"-logicalmonadicroi5","ROI Logical IP/IR/L/ED Monadic AndInverted ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 20 ] } }, + {"-logicalmonadicroi6","ROI Logical IP/IR/L/ED Monadic NoOp ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 21 ] } }, + {"-logicalmonadicroi7","ROI Logical IP/IR/L/ED Monadic Xor ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 22 ] } }, + {"-logicalmonadicroi8","ROI Logical IP/IR/L/ED Monadic Or ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 23 ] } }, + {"-logicalmonadicroi9","ROI Logical IP/IR/L/ED Monadic Nor ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 24 ] } }, + {"-logicalmonadicroi10","ROI Logical IP/IR/L/ED Monadic Equiv ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 25 ] } }, + {"-logicalmonadicroi11","ROI Logical IP/IR/L/ED Monadic Invert ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 26 ] } }, + {"-logicalmonadicroi12","ROI Logical IP/IR/L/ED Monadic OrReverse ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 27 ] } }, + {"-logicalmonadicroi13","ROI Logical IP/IR/L/ED Monadic CopyInverted ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 28 ] } }, + {"-logicalmonadicroi14","ROI Logical IP/IR/L/ED Monadic OrInverted ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 29 ] } }, + {"-logicalmonadicroi15","ROI Logical IP/IR/L/ED Monadic Nand ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 30 ] } }, + {"-logicalmonadicroi16","ROI Logical IP/IR/L/ED Monadic Set ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 31 ] } }, + {"-logicaldyadicroi1","ROI Logical IP/IR/L/ED Dyadic Clear ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 16 ] } }, + {"-logicaldyadicroi2","ROI Logical IP/IR/L/ED Dyadic And ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 17 ] } }, + {"-logicaldyadicroi3","ROI Logical IP/IR/L/ED Dyadic AndReverse ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 18 ] } }, + {"-logicaldyadicroi4","ROI Logical IP/IR/L/ED Dyadic Copy ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 19 ] } }, + {"-logicaldyadicroi5","ROI Logical IP/IR/L/ED Dyadic AndInverted ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 20 ] } }, + {"-logicaldyadicroi6","ROI Logical IP/IR/L/ED Dyadic NoOp ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 21 ] } }, + {"-logicaldyadicroi7","ROI Logical IP/IR/L/ED Dyadic Xor ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 22 ] } }, + {"-logicaldyadicroi8","ROI Logical IP/IR/L/ED Dyadic Or ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 23 ] } }, + {"-logicaldyadicroi9","ROI Logical IP/IR/L/ED Dyadic Nor ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 24 ] } }, + {"-logicaldyadicroi10","ROI Logical IP/IR/L/ED Dyadic Equiv ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 25 ] } }, + {"-logicaldyadicroi11","ROI Logical IP/IR/L/ED Dyadic Invert ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 26 ] } }, + {"-logicaldyadicroi12","ROI Logical IP/IR/L/ED Dyadic OrReverse ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 27 ] } }, + {"-logicaldyadicroi13","ROI Logical IP/IR/L/ED Dyadic CopyInverted ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 28 ] } }, + {"-logicaldyadicroi14","ROI Logical IP/IR/L/ED Dyadic OrInverted ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 29 ] } }, + {"-logicaldyadicroi15","ROI Logical IP/IR/L/ED Dyadic Nand ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 30 ] } }, + {"-logicaldyadicroi16","ROI Logical IP/IR/L/ED Dyadic Set ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 31 ] } }, + {"-logicalmonadiccplane1","Control Plane Logical IP/IR/L/ED Monadic Clear ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 32 ] } }, + {"-logicalmonadiccplane2","Control Plane Logical IP/IR/L/ED Monadic And ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 33 ] } }, + {"-logicalmonadiccplane3","Control Plane Logical IP/IR/L/ED Monadic AndReverse ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 34 ] } }, + {"-logicalmonadiccplane4","Control Plane Logical IP/IR/L/ED Monadic Copy ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 35 ] } }, + {"-logicalmonadiccplane5","Control Plane Logical IP/IR/L/ED Monadic AndInverted ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 36 ] } }, + {"-logicalmonadiccplane6","Control Plane Logical IP/IR/L/ED Monadic NoOp ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 37 ] } }, + {"-logicalmonadiccplane7","Control Plane Logical IP/IR/L/ED Monadic Xor ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 38 ] } }, + {"-logicalmonadiccplane8","Control Plane Logical IP/IR/L/ED Monadic Or ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 39 ] } }, + {"-logicalmonadiccplane9","Control Plane Logical IP/IR/L/ED Monadic Nor ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 40 ] } }, + {"-logicalmonadiccplane10","Control Plane Logical IP/IR/L/ED Monadic Equiv ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 41 ] } }, + {"-logicalmonadiccplane11","Control Plane Logical IP/IR/L/ED Monadic Invert ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 42 ] } }, + {"-logicalmonadiccplane12","Control Plane Logical IP/IR/L/ED Monadic OrReverse ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 43 ] } }, + {"-logicalmonadiccplane13","Control Plane Logical IP/IR/L/ED Monadic CopyInverted ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 44 ] } }, + {"-logicalmonadiccplane14","Control Plane Logical IP/IR/L/ED Monadic OrInverted ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 45 ] } }, + {"-logicalmonadiccplane15","Control Plane Logical IP/IR/L/ED Monadic Nand ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 46 ] } }, + {"-logicalmonadiccplane16","Control Plane Logical IP/IR/L/ED Monadic Set ( 0 constant ) ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 47 ] } }, + {"-logicaldyadiccplane1","Control Plane Logical IP/IR/L/ED Dyadic Clear ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 32 ] } }, + {"-logicaldyadiccplane2","Control Plane Logical IP/IR/L/ED Dyadic And ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 33 ] } }, + {"-logicaldyadiccplane3","Control Plane Logical IP/IR/L/ED Dyadic AndReverse ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 34 ] } }, + {"-logicaldyadiccplane4","Control Plane Logical IP/IR/L/ED Dyadic Copy ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 35 ] } }, + {"-logicaldyadiccplane5","Control Plane Logical IP/IR/L/ED Dyadic AndInverted ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 36 ] } }, + {"-logicaldyadiccplane6","Control Plane Logical IP/IR/L/ED Dyadic NoOp ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 37 ] } }, + {"-logicaldyadiccplane7","Control Plane Logical IP/IR/L/ED Dyadic Xor ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 38 ] } }, + {"-logicaldyadiccplane8","Control Plane Logical IP/IR/L/ED Dyadic Or ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 39 ] } }, + {"-logicaldyadiccplane9","Control Plane Logical IP/IR/L/ED Dyadic Nor ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 40 ] } }, + {"-logicaldyadiccplane10","Control Plane Logical IP/IR/L/ED Dyadic Equiv ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 41 ] } }, + {"-logicaldyadiccplane11","Control Plane Logical IP/IR/L/ED Dyadic Invert ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 42 ] } }, + {"-logicaldyadiccplane12","Control Plane Logical IP/IR/L/ED Dyadic OrReverse ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 43 ] } }, + {"-logicaldyadiccplane13","Control Plane Logical IP/IR/L/ED Dyadic CopyInverted ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 44 ] } }, + {"-logicaldyadiccplane14","Control Plane Logical IP/IR/L/ED Dyadic OrInverted ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 45 ] } }, + {"-logicaldyadiccplane15","Control Plane Logical IP/IR/L/ED Dyadic Nand ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 46 ] } }, + {"-logicaldyadiccplane16","Control Plane Logical IP/IR/L/ED Dyadic Set ", + InitLogical, DoLogical, NullProc, + EndLogical, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[1], NULL, NULL }, + ( XPointer ) &LogicalParmVec[ 47 ] } }, + {"-blend1","Blend monadic src constant 0.1 alpha constant 0.5 IP/B/ED 512x512", + InitBlend, DoBlend, NullProc, + EndBlend, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &BlendParmVec[ 0 ] } }, + {"-blend2","Blend dyadic alpha constant 0.5 IP/IP/B/ED 512x512", + InitBlend, DoBlend, NullProc, + EndBlend, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &BlendParmVec[ 0 ] } }, + {"-blendroi1","Blend monadic ROI src constant 0.1 alpha constant 0.5 IP/B/ED 512x512", + InitBlend, DoBlend, NullProc, + EndBlend, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &BlendParmVec[ 3 ] } }, + {"-blendroi2","Blend dyadic ROI alpha constant 0.5 IP/IP/B/ED 512x512", + InitBlend, DoBlend, NullProc, + EndBlend, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &BlendParmVec[ 3 ] } }, + {"-blendcplane1","Blend monadic Control Plane src constant 0.1 alpha constant 0.5 IP/B/ED 512x512", + InitBlend, DoBlend, NullProc, + EndBlend, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &BlendParmVec[ 6 ] } }, + {"-blendcplane2","Blend dyadic Control Plane alpha constant 0.5 IP/IP/B/ED 512x512", + InitBlend, DoBlend, NullProc, + EndBlend, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL, NULL }, + ( XPointer ) &BlendParmVec[ 6 ] } }, + {"-blendalpha1","Blend monadic src constant 220 alpha plane brains IP/IP/B/ED 512x512", + InitBlend, DoBlend, NullProc, + EndBlend, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, &ImageInfo[ 5 ], NULL }, + ( XPointer ) &BlendParmVec[ 1 ] } }, + {"-blendalpha2","Blend dyadic alpha plane alpha constant 250 IP/IP/IP/B/ED 512x512", + InitBlend, DoBlend, NullProc, + EndBlend, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 5 ], &ImageInfo[ 1 ], &ImageInfo[ 0 ], NULL }, + ( XPointer ) &BlendParmVec[ 2 ] } }, + {"-blendalpharoi1","Blend monadic ROI src constant 220 alpha plane brains IP/B/ED 512x512", + InitBlend, DoBlend, NullProc, + EndBlend, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 2 ], NULL, &ImageInfo[ 5 ], NULL }, + ( XPointer ) &BlendParmVec[ 4 ] } }, + {"-blendalpharoi2","Blend dyadic ROI alpha plane alpha constant 250 bird IP/IP/IP/B/ED 512x512", + InitBlend, DoBlend, NullProc, + EndBlend, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 2 ], &ImageInfo[ 0 ], &ImageInfo[ 1 ], NULL }, + ( XPointer ) &BlendParmVec[ 5 ] } }, + {"-triplepoint1","TripleBand Point IP/IL/P/ED 512x512 RGB_BEST_MAP, DitherDefault", + InitTriplePoint, DoTriplePoint, NullProc, + EndTriplePoint, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &TriplePointParmVec[ 0 ] } }, + {"-triplepoint2","TripleBand Point IP/IL/P/ED 512x512 RGB_DEFAULT_MAP, DitherDefault", + InitTriplePoint, DoTriplePoint, NullProc, + EndTriplePoint, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &TriplePointParmVec[ 1 ] } }, + {"-funnyencode1","Funny Encode, SingleBand, 3 Encode steps", + InitFunnyEncode, DoFunnyEncode, NullProc, + EndFunnyEncode, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &FunnyEncodeParmVec[ 0 ] } }, + {"-funnyencode2","Funny Encode, SingleBand, 3 Encode steps, 3 bits", + InitFunnyEncode, DoFunnyEncode, NullProc, + EndFunnyEncode, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &FunnyEncodeParmVec[ 4 ] } }, + {"-funnyencode3","Funny Encode Pixel, TripleBand, 3 Encode steps", + InitFunnyEncode, DoFunnyEncode, NullProc, + EndFunnyEncode, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &FunnyEncodeParmVec[ 1 ] } }, + {"-funnyencode4","Funny Encode Pixel, TripleBand, 3 Encode, 5, 10, 7 bits", + InitFunnyEncode, DoFunnyEncode, NullProc, + EndFunnyEncode, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &FunnyEncodeParmVec[ 2 ] } }, + {"-funnyencode5","Funny Encode Pixel, TripleBand, 3 Encode, 7, 13, 11 bits", + InitFunnyEncode, DoFunnyEncode, NullProc, + EndFunnyEncode, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &FunnyEncodeParmVec[ 3 ] } }, + {"-funnyencode6","Funny Encode Plane, TripleBand, 3 Encode steps", + InitFunnyEncode, DoFunnyEncode, NullProc, + EndFunnyEncode, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 11 ], NULL, NULL, NULL }, + ( XPointer ) &FunnyEncodeParmVec[ 1 ] } }, + {"-funnyencode7","Funny Encode Plane, TripleBand, 3 Encode, 5, 10, 7 bits", + InitFunnyEncode, DoFunnyEncode, NullProc, + EndFunnyEncode, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 11 ], NULL, NULL, NULL }, + ( XPointer ) &FunnyEncodeParmVec[ 2 ] } }, + {"-funnyencode8","Funny Encode Plane, TripleBand, 3 Encode, 7, 13, 11 bits", + InitFunnyEncode, DoFunnyEncode, NullProc, + EndFunnyEncode, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 11 ], NULL, NULL, NULL }, + ( XPointer ) &FunnyEncodeParmVec[ 3 ] } }, + {"-point1","Point IP/IL/P/ED 512x512 8 to 8", + InitPoint, DoPoint, NullProc, + EndPoint, VALL, 0, 0, + {1, 0, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &PointParmVec[ 0 ] } }, + {"-point2","Point IP/IL/P/ED 512x512 1 to 8", + InitPoint, DoPoint, NullProc, + EndPoint, VALL, 0, 0, + {1, 0, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &PointParmVec[ 1 ] } }, + {"-point3","Point IP/IL/P/ED 512x512 8 to 1", + InitPoint, DoPoint, NullProc, + EndPoint, VALL, 0, 0, + {1, 0, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &PointParmVec[ 2 ] } }, + {"-pointroi1","Point IP/IL/P/ED ROI 512x512 8 to 8", + InitPoint, DoPoint, NullProc, + EndPoint, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &PointParmVec[ 3 ] } }, + {"-pointcplane1","Point IP/IL/P/ED Control Plane 512x512 8 to 8", + InitPoint, DoPoint, NullProc, + EndPoint, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &PointParmVec[ 8 ] } }, + {"-pointphoto1","Point IP/IL/P/EP 512x512 8 to 8", + InitPoint, DoPoint, NullProc, + EndPoint, VALL, 0, 0, + {1, 0, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &PointParmVec[ 4 ] } }, + {"-pointroiphoto1","Point IP/IL/P/EP ROI 512x512 8 to 8", + InitPoint, DoPoint, NullProc, + EndPoint, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &PointParmVec[ 7 ] } }, + {"-pointcplanephoto1","Point IP/IL/P/EP Control Plane 512x512 8 to 8", + InitPoint, DoPoint, NullProc, + EndPoint, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &PointParmVec[ 9 ] } }, + {"-redefine","RedefinePhotoflo", + InitRedefine, DoRedefine, NullProc, + EndRedefine, VALL, 0, 0, + {1, 0, 2048, { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &RedefineParmVec[ 0 ] } }, + {"-modify1","ModifyPhotoflo change ROI offsets and size", + InitModifyROI, DoModifyROI, NullProc, + EndModifyROI, VALL, 0, 0, + {1, SUBSET_FULL | 0, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, + ( XPointer ) &ModifyParmVec[ 0 ] } }, + {"-modify2","ModifyPhotoflo change point element LUT", + InitModifyPoint, DoModifyPoint, NullProc, + EndModifyPoint, VALL, 0, 0, + {1, 0, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, ( XPointer ) NULL } }, + {"-modify3","ModifyPhotoflo change export drawable x,y location", + InitModifySimple, DoModifySimple, NullProc, + EndModifySimple, VALL, 0, 0, + {1, 0, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, ( XPointer ) NULL } }, + {"-modify4","ModifyPhotoflo long flo, low data, random drawable x,y location", + InitModifyLong1, DoModifyLong1, NullProc, + EndModifyLong, VALL, 0, 0, + {1, SUBSET_FULL | 0, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, ( XPointer ) NULL } }, + {"-modify5","ModifyPhotoflo long flo, low data, geo crop, random drawable x,y location", + InitModifyLong2, DoModifyLong2, NullProc, + EndModifyLong, VALL, 0, 0, + {1, SUBSET_FULL | 0, 2048, + { &ImageInfo[ 0 ], NULL, NULL, NULL }, ( XPointer ) NULL } }, + {"-rgb1","IP/U/CFRGB/CTRGB/HC/ED CIELab, Floats", + InitRGB, DoRGB, NullProc, EndRGB, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &RGBParmVec[ 0 ] } }, + {"-rgb2","IP/U/CFRGB/CTRGB/HC/ED CIELab, Floats, WhiteAdjust", + InitRGB, DoRGB, NullProc, EndRGB, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &RGBParmVec[ 1 ] } }, + {"-rgb3","IP/CFRGB/CTRGB/CS/ED CIELab, Ints->Floats", + InitRGB, DoRGB, NullProc, EndRGB, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &RGBParmVec[ 2 ] } }, + {"-rgb4","IP/CFRGB/CTRGB/CS/ED CIELab, Ints->Floats, WhiteAdjust", + InitRGB, DoRGB, NullProc, EndRGB, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &RGBParmVec[ 3 ] } }, + {"-rgb5","IP/U/CFRGB/CTRGB/HC/ED CIEXYZ, Floats", + InitRGB, DoRGB, NullProc, EndRGB, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &RGBParmVec[ 4 ] } }, + {"-rgb6","IP/U/CFRGB/CTRGB/HC/ED CIEXYZ, Floats, WhiteAdjust", + InitRGB, DoRGB, NullProc, EndRGB, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &RGBParmVec[ 5 ] } }, + {"-rgb7","IP/CFRGB/CTRGB/CS/ED CIEXYZ, Ints->Floats", + InitRGB, DoRGB, NullProc, EndRGB, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &RGBParmVec[ 6 ] } }, + {"-rgb8","IP/CFRGB/CTRGB/CS/ED CIEXYZ, Ints->Floats, WhiteAdjust", + InitRGB, DoRGB, NullProc, EndRGB, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &RGBParmVec[ 7 ] } }, + {"-rgb9","IP/U/CFRGB/CTRGB/HC/ED YCbCr, Floats", + InitRGB, DoRGB, NullProc, EndRGB, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &RGBParmVec[ 8 ] } }, + {"-rgb10","IP/CFRGB/CTRGB/ED YCbCr, Integers", + InitRGB, DoRGB, NullProc, EndRGB, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &RGBParmVec[ 9 ] } }, + {"-rgb11","IP/CFRGB/CTRGB/ED YCbCr, Integers, Levels(1024,64,16)", + InitRGB, DoRGB, NullProc, EndRGB, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &RGBParmVec[ 10 ] } }, + {"-rgb12","IP/CFRGB/CTRGB/ED YCbCr, Integers, Luma Shift", + InitRGB, DoRGB, NullProc, EndRGB, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &RGBParmVec[ 11 ] } }, + {"-rgb13","IP/U/CFRGB/CTRGB/HC/ED YCC, Floats", + InitRGB, DoRGB, NullProc, EndRGB, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &RGBParmVec[ 12 ] } }, + {"-rgb14","IP/CFRGB/CTRGB/ED YCC, Integers", + InitRGB, DoRGB, NullProc, EndRGB, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &RGBParmVec[ 13 ] } }, + {"-rgb15","IP/CFRGB/CTRGB/ED YCC, Integers, Levels(1024,64,16)", + InitRGB, DoRGB, NullProc, EndRGB, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &RGBParmVec[ 14 ] } }, + {"-rgb16","IP/CFRGB/CTRGB/ED YCC, Integers, Scale Shift", + InitRGB, DoRGB, NullProc, EndRGB, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &RGBParmVec[ 15 ] } }, + {"-converttoindexpixel","Convert to index BandByPixel IP/CTI/ED", + InitConvertToIndex, DoConvertToIndex, NullProc, + EndConvertToIndex, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 10 ], NULL, NULL, NULL }, + ( XPointer ) &CvtToIndexParmVec[ 0 ] } }, + {"-converttoindexplane","Convert to index BandByPlane IP/CTI/ED", + InitConvertToIndex, DoConvertToIndex, NullProc, + EndConvertToIndex, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 11 ], NULL, NULL, NULL }, + ( XPointer ) &CvtToIndexParmVec[ 0 ] } }, + {"-convertfromindex","Convert from index ID/CFI/CTI/ED", + InitConvertToIndex, DoConvertToIndex, NullProc, + EndConvertToIndex, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 3 ], NULL, NULL, NULL }, + ( XPointer ) &CvtToIndexParmVec[ 1 ] } }, + {"-complex","Complicated Flo", + InitComplex, DoComplex, NullProc, + EndComplex, VALL, 0, 0, + {1, SUBSET_FULL, 2048, + { &ImageInfo[ 0 ], &ImageInfo[ 1 ], &ImageInfo[ 2 ], + &ImageInfo[ 12 ] }, ( XPointer ) NULL } }, + {(char * )NULL,(char * )NULL,NULL,NULL, NULL, NULL,(int)NULL, 0, 0, + {1, (int) NULL, 0, { NULL, NULL, NULL, NULL }, + ( XPointer ) NULL } }, +}; diff --git a/xie/xc/programs/xieperf/uconstrain.c b/xie/xc/programs/xieperf/uconstrain.c new file mode 100644 index 0000000..c81c294 --- /dev/null +++ b/xie/xc/programs/xieperf/uconstrain.c @@ -0,0 +1,290 @@ +/* $XConsortium: uconstrain.c,v 1.8 94/04/17 20:39:38 rws Exp $ */ + +/**** module uconstrain.c ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + uconstrain.c -- unconstrain flo element test + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ + +#include "xieperf.h" +#include + +static XiePhotomap XIEPhotomap; +static XieLut XIELut; +static int flo_notify; +static XiePhotoElement *flograph; +static XiePhotoflo flo; +static XieClipScaleParam *parms; +static int flo_elements; + +int InitUnconstrain(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int decode_notify = 0; + XieLTriplet levels; + XieProcessDomain domain; + XieConstrainTechnique tech = ( XieConstrainTechnique ) NULL; + char *tech_parms=NULL; + XieConstant in_low,in_high; + XieLTriplet out_low,out_high; + XIEimage *image; + Bool pointFlag = False; + int cclass; + int idx = 0; + + image = p->finfo.image1; + +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xp->vinfo.c_class; +#else + cclass = xp->vinfo.class; +#endif + + flo = ( XiePhotoflo ) NULL; + flograph = ( XiePhotoElement * ) NULL; + parms = ( XieClipScaleParam * ) NULL; + XIEPhotomap = ( XiePhotomap ) NULL; + + if ( ( XIEPhotomap = GetXIEPhotomap( xp, p, 1 ) ) == ( XiePhotomap ) NULL ) + reps = 0; + else + { + tech = ( ( UnconstrainParms * )p->ts )->constrain; + decode_notify = False; + + if ( xp->screenDepth != image->depth[ 0 ] ) + { + pointFlag = True; + } + + levels[ 0 ] = 1 << image->depth[ 0 ]; + levels[ 1 ] = levels[ 2 ] = levels[ 0 ]; + + in_low[ 0 ] = 0.0; + in_low[ 1 ] = 0.0; + in_low[ 2 ] = 0.0; + in_high[ 0 ] = (levels[ 0 ]) - 1.0; + in_high[ 1 ] = (levels[ 1 ]) - 1.0; + in_high[ 2 ] = (levels[ 2 ]) - 1.0; + out_low[ 0 ] = 0; + out_low[ 1 ] = 0; + out_low[ 2 ] = 0; + out_high[ 0 ] = levels[ 0 ] - 1; + out_high[ 1 ] = levels[ 1 ] - 1; + out_high[ 2 ] = levels[ 2 ] - 1; + + if ( tech == xieValConstrainHardClip ) + { + tech_parms = ( char * ) NULL; + } + else + { + parms = XieTecClipScale( in_low, in_high, out_low, out_high); + tech_parms = ( char * ) parms; + if ( tech_parms == ( char * ) NULL ) + { + fprintf( stderr, + "Trouble loading clipscale technique parameters\n" ); + reps = 0; + } + } + } + if ( reps ) + { + if ( pointFlag ) + flo_elements = 6; + else + flo_elements = 4; + + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "XieAllocatePhotofloGraph failed\n" ); + reps = 0; + } + } + if ( reps ) + { + XieFloImportPhotomap(&flograph[idx],XIEPhotomap,decode_notify); + idx++; + + XieFloUnconstrain(&flograph[idx], idx ); + idx++; + + } + if ( reps ) + { + XieFloConstrain( &flograph[idx], + idx, + levels, + tech, + tech_parms + ); + idx++; + + if ( pointFlag ) + { + if ((XIELut = CreatePointLut(xp, p, levels[ 0 ], + 1 << xp->screenDepth, False)) == (XieLut) NULL) + { + reps = 0; + } + else + { + XieFloImportLUT(&flograph[idx], XIELut ); + idx++; + + domain.phototag = 0; + domain.offset_x = 0; + domain.offset_y = 0; + XieFloPoint(&flograph[idx], + idx - 1, + &domain, + idx, + 0x7 + ); + idx++; + } + } + } + + if ( reps ) + { + XieFloExportDrawable(&flograph[idx], + idx, /* source phototag number */ + xp->w, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + idx++; + + flo = XieCreatePhotoflo( xp->d, flograph, flo_elements ); + + flo_notify = False; + } + if ( !reps ) + FreeUnconstrainStuff( xp, p ); + return( reps ); +} + +void DoUnconstrain(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + XieExecutePhotoflo( xp->d, flo, flo_notify ); + XSync( xp->d, 0 ); + } +} + +void EndUnconstrain(xp, p) + XParms xp; + Parms p; +{ + FreeUnconstrainStuff( xp, p ); +} + +int +FreeUnconstrainStuff( xp, p ) +XParms xp; +Parms p; +{ + if ( parms ) + { + XFree( parms ); + parms = ( XieClipScaleParam * ) NULL; + } + if ( flo ) + { + XieDestroyPhotoflo( xp->d, flo ); + flo = ( XiePhotoflo ) NULL; + } + if ( flograph ) + { + XieFreePhotofloGraph(flograph,flo_elements); + flograph = ( XiePhotoElement * ) NULL; + } + if ( XIELut ) + { + XieDestroyLUT(xp->d, XIELut); + XIELut = ( XieLut ) NULL; + } + if ( XIEPhotomap && IsPhotomapInCache( XIEPhotomap ) == False ) + { + XieDestroyPhotomap(xp->d, XIEPhotomap); + XIEPhotomap = ( XiePhotomap ) NULL; + } +} diff --git a/xie/xc/programs/xieperf/xieperf.c b/xie/xc/programs/xieperf/xieperf.c new file mode 100644 index 0000000..e02b0c1 --- /dev/null +++ b/xie/xc/programs/xieperf/xieperf.c @@ -0,0 +1,4880 @@ +/* $XConsortium: xieperf.c,v 1.38 94/04/17 20:39:40 gildea Exp $ */ + +/**** module xieperf.c ****/ +/**************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + xieperf.c -- xieperf main module ( looks a lot like x11perf.c ) + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ + +#include +#include +#include +#include +#include +#include "xieperf.h" +#include +#ifdef X_NOT_STDC_ENV +extern int errno; +#define Time_t long +extern Time_t time (); +#else +#include +#define Time_t time_t +#endif +#ifndef O_BINARY +#define O_BINARY 0 +#endif +#define lowbit(x) ((x) & (~(x) + 1)) + +/* Only for working on ``fake'' servers, for hardware that doesn't exist */ +static Bool drawToFakeServer = False; +static Pixmap tileToQuery = None; + +static Bool labels = False; +static Bool loadTests = False; +static char *loadTestsFile; +#define DEFAULT_REPEAT 2 +static int repeat = DEFAULT_REPEAT; +static int seconds = 5; +Bool dontClear; +unsigned short capabilities = 0; +unsigned short class_request = SUBSET_FULL; +extern int CacheSizeMax; +static FILE *fp = ( FILE * ) NULL; +static Bool RGB_BESTStandardColormapObtained = False; + +char *imagepath = "./images"; + +static Window status; /* Status window and GC */ +static GC tgc; + +static double syncTime = 0.0; + +static int saveargc; +static char **saveargv; + +static char *foreground = NULL; +static char *background = NULL; + +static int fixedReps = 0; + +static Bool sigBail = False; +static Bool *doit; +Bool WMSafe = False; +static Bool loCal = False; +Bool showErrors = False; +static Bool runErrors = False; +static Bool runEvents = False; +static Bool showLabels = False; /* Hear me now and believe me later, + when 'True', is helpful if test + dies in calibration */ +static Bool showTechs = False; +static int visualClass = -1; + +static XRectangle ws[] = { /* Clip rectangles */ + {195, 195, 120, 120}, + { 45, 145, 120, 120}, + {345, 245, 120, 120} + +}; +#define MAXCLIP (sizeof(ws) / sizeof(ws[0])) +static Window clipWindows[MAXCLIP]; +static Colormap cmap, colorcmap, graycmap, emptycmap; +static int depth = -1; /* -1 means use default depth */ +Window drawableWindow; +Window monitorWindow; +Window monitor2Window; +static unsigned long whiteidx, blackidx; +unsigned long DCRedMask, DCGreenMask, DCBlueMask; +static unsigned char rbits, gbits, bbits; + +Window CreateXIEParent(); +void AllocateGrayMapColors(); +void AllocateColorMapColors(); +XieLut CreatePointLut(); + +/* ScreenSaver state */ +static XParmRec xparms; +static int ssTimeout, ssInterval, ssPreferBlanking, ssAllowExposures; + +/************************************************ +* time related stuff * +************************************************/ + +#ifdef VMS + +typedef struct _vms_time { + unsigned long low; + unsigned long high; +}vms_time; + +struct timeval { + long tv_sec; /* seconds since Jan. 1, 1970 */ + long tv_usec; /* and microseconds */ +}; + +struct timezone { + int tz_minuteswest; /* of Greenwich */ + int tz_dsttime; /* type of dst correction to apply */ +}; + + +static int firsttime = True; +static vms_time basetime; + +int gettimeofday(tp) + struct timeval *tp; +{ + vms_time current_time, resultant; + unsigned long mumble, foo; + int status; + + if (firsttime) { + sys$gettim(&basetime); + firsttime = False; + } + sys$gettim(¤t_time); + resultant.high = current_time.high - basetime.high; + resultant.low = current_time.low - basetime.low; + if (current_time.low < basetime.low) { + resultant.high -= 1; + } + status = lib$ediv( &(10000000), &resultant, &tp->tv_sec, &tp->tv_usec); + tp->tv_usec /= 10; + return 0; +} + +#endif + +static struct timeval start; + +void PrintTime() +{ + Time_t t; + + t = time((Time_t *)NULL); + printf("%s\n", ctime(&t)); +} + +void InitTimes () +{ + X_GETTIMEOFDAY(&start); +} + +double ElapsedTime(correction) + double correction; +{ + struct timeval stop; + + X_GETTIMEOFDAY(&stop); + if (stop.tv_usec < start.tv_usec) { + stop.tv_usec += 1000000; + stop.tv_sec -= 1; + } + return (double)(stop.tv_usec - start.tv_usec) + + (1000000.0 * (double)(stop.tv_sec - start.tv_sec)) - correction; +} + +double RoundTo3Digits(d) + double d; +{ + /* It's kind of silly to print out things like ``193658.4/sec'' so just + junk all but 3 most significant digits. */ + + double exponent, sign; + + exponent = 1.0; + /* the code below won't work if d should happen to be non-positive. */ + if (d < 0.0) { + d = -d; + sign = -1.0; + } else + sign = 1.0; + if (d >= 1000.0) { + do { + exponent *= 10.0; + } while (d/exponent >= 1000.0); + d = (double)((int) (d/exponent + 0.5)); + d *= exponent; + } else { + if (d != 0.0) { + while (d*exponent < 100.0) { + exponent *= 10.0; + } + } + d = (double)((int) (d*exponent + 0.5)); + d /= exponent; + } + return d * sign; +} + + +void ReportTimes(usecs, n, str, average) + double usecs; + int n; + char *str; +{ + double msecsperobj, objspersec; + + if ( n != 0 ) + { + if(usecs != 0.0) + { + msecsperobj = usecs / (1000.0 * (double)n); + objspersec = (double) n * 1000000.0 / usecs; + + /* Round obj/sec to 3 significant digits. Leave msec untouched, to + allow averaging results from several repetitions. */ + objspersec = RoundTo3Digits(objspersec); + + if (average) { + printf("%6d trep @ %7.4f msec (%6.1f/sec): %s\n", + n, msecsperobj, objspersec, str); + } else { + printf("%6d reps @ %7.4f msec (%6.1f/sec): %s\n", + n, msecsperobj, objspersec, str); + } + } else { + printf("%6d %sreps @ 0.0 msec (unmeasurably fast): %s\n", + n, average ? "t" : "", str); + } + } + else + { + printf("0 reps @ 0.0 msec (test initialization failed): %s\n", str); + } +} + +/************************************************ +* Generic X stuff * +************************************************/ + +static char *program_name; +void usage(); + +Display * +GetDisplay() +{ + return( xparms.d ); +} + +/* + * Get_Display_Name (argc, argv) Look for -display, -d, or host:dpy (obselete) + * If found, remove it from command line. Don't go past a lone -. + */ +char *Get_Display_Name(pargc, argv) + int *pargc; /* MODIFIED */ + char **argv; /* MODIFIED */ +{ + int argc = *pargc; + char **pargv = argv+1; + char *displayname = NULL; + int i; + + for (i = 1; i != argc; i++) { + char *arg = argv[i]; + + if (!strcmp (arg, "-display") || !strcmp (arg, "-d")) { + if (++i >= argc) usage (); + + displayname = argv[i]; + *pargc -= 2; + continue; + } + if (!strcmp(arg,"-")) { + while (i the XIE server to contact", +" -images path to images supplied with this software,", +" defaults to ./images if flag not specified", +" -timeout timeout value for certain tests (default=60 secs)", +" -sync do the tests in synchronous mode", +" -script file read tests from a file, ``-'' to use console", +" -repeat do tests times (outer loop) (default = 2)", +" -time do tests for seconds each (default = 5)", +" -depth use a visual with planes per pixel", +" -GrayScale use a GrayScale visual", +" -StaticGray use a StaticGray visual", +" -StaticColor use a StaticColor visual", +" -PseudoColor use a PseudoColor visual", +" -TrueColor use a TrueColor visual", +" -DirectColor use a DirectColor visual", +" -WMSafe let window manager install colormap", +" -showtechs print supported techniques", +" -showlabels print test label to screen before calibration", +" -showevents for error and event tests, display as received", +" -events include event tests", +" -errors include error tests", +" -loCal no calibration, fix reps to 5 ( -reps overrides this )", +" -all do all tests", +" -tests generate a list of all tests", +" -mkscript generate script file to stderr ( recognizes -repeat and -reps )", +" -cache cache up to n photomaps in server", +" -labels print test labels ( use -all or -range to specify tests )", +" -DIS run DIS subset tests only ( use -all or -range to specify tests )", +" -range [,] like all, but do to ", +" -reps fix the inner loop rep count (default = auto scale)", +NULL}; + + fflush(stdout); + fprintf(stderr, "usage: %s [-options ...]\n", program_name); + for (cpp = help_message; *cpp; cpp++) { + fprintf(stderr, "%s\n", *cpp); + } + + fprintf(stderr, "\n"); + + /* Print out original command line as the above usage message is so long */ + for (i = 0; i != saveargc; i++) { + fprintf(stderr, "%s ", saveargv[i]); + } + fprintf(stderr, "\n\n"); + exit (1); +} + +void NullProc(xp, p) + XParms xp; + Parms p; +{ +} + +Bool NullInitProc(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + return reps; +} + + +void HardwareSync(xp) + XParms xp; +{ + /* + * Some graphics hardware allows the server to claim it is done, + * while in reality the hardware is busily working away. So fetch + * a pixel from the window that was drawn to, which should be + * enough to make the server wait for the graphics hardware. + */ + XImage *image; + + image = XGetImage(xp->d, xp->w, 0, 0, 1, 1, ~0, ZPixmap); + XDestroyImage(image); +} + +void DoHardwareSync(xp, p, reps) + XParms xp; + Parms p; + int reps; +{ + int i; + + for (i = 0; i != reps; i++) { + HardwareSync(xp); + } +} + +static Test syncTest = { + "syncTime", "Internal test for finding how long HardwareSync takes", + NullInitProc, DoHardwareSync, NullProc, NullProc, + VALL, 0, 0, + {1} +}; + + +Window CreatePerfWindow(xp, x, y, width, height) + XParms xp; + int width, height, x, y; +{ + XSetWindowAttributes xswa; + Window w; + unsigned long value_mask; + + xswa.background_pixel = xp->background; + xswa.border_pixel = xp->foreground; + if ( WMSafe == False ) + xswa.override_redirect = True; + else + xswa.override_redirect = False; + xswa.backing_store = False; + xswa.save_under = False; + xswa.colormap = cmap; + value_mask = CWBackPixel | CWBorderPixel | CWColormap | + CWOverrideRedirect |CWBackingStore | CWSaveUnder; + + w = XCreateWindow(xp->d, xp->p, x, y, width, height, 1, + xp->vinfo.depth, CopyFromParent, xp->vinfo.visual, + value_mask, &xswa); + XMapWindow (xp->d, w); + return w; +} + +Window CreatePerfWindowUnmapped(xp, x, y, width, height) + XParms xp; + int width, height, x, y; +{ + XSetWindowAttributes xswa; + Window w; + unsigned long value_mask; + + xswa.background_pixel = xp->background; + xswa.border_pixel = xp->foreground; + xswa.colormap = cmap; + if ( WMSafe == False ) + xswa.override_redirect = True; + else + xswa.override_redirect = False; + xswa.backing_store = False; + xswa.save_under = False; + value_mask = CWBackPixel | CWBorderPixel | CWColormap | + CWOverrideRedirect |CWBackingStore | CWSaveUnder; + w = XCreateWindow(xp->d, xp->p, x, y, width, height, 1, + xp->vinfo.depth, CopyFromParent, xp->vinfo.visual, value_mask, &xswa); + return w; +} + +void +InstallThisColormap( xp, newcmap ) +XParms xp; +Colormap newcmap; +{ + if ( WMSafe == False ) + { + XSetWindowColormap( xp->d, xp->w, newcmap ); + XFlush( xp->d ); + XSetWindowColormap( xp->d, drawableWindow, newcmap ); + XFlush( xp->d ); + XInstallColormap( xp->d, newcmap ); + XFlush( xp->d ); + } + else + { + XSetWindowColormap( xp->d, xp->p, newcmap ); + XFlush( xp->d ); + } + cmap = newcmap; +} + +void +InstallDefaultColormap( xp ) +XParms xp; +{ + InstallThisColormap( xp, + DefaultColormap( xp->d, DefaultScreen( xp->d ) ) ); + XFlush( xp->d ); +} + +void +InstallGrayColormap( xp ) +XParms xp; +{ + cmap = graycmap; + InstallThisColormap( xp, cmap ); +} + +void +InstallEmptyColormap( xp ) +XParms xp; +{ + cmap = emptycmap; + InstallThisColormap( xp, cmap ); +} + +void +InstallColorColormap( xp ) +XParms xp; +{ + cmap = colorcmap; + InstallThisColormap( xp, cmap ); +} + +void CreateClipWindows(xp, clips) + XParms xp; + int clips; +{ + int j; + XWindowAttributes xwa; + + (void) XGetWindowAttributes(xp->d, xp->w, &xwa); + if (clips > MAXCLIP) clips = MAXCLIP; + for (j = 0; j != clips; j++) { + clipWindows[j] = CreatePerfWindow(xp, xwa.x + ws[j].x, + xwa.y + ws[j].y, ws[j].width, ws[j].height); + } +} /* CreateClipWindows */ + + +void DestroyClipWindows(xp, clips) + XParms xp; + int clips; +{ + int j; + + if (clips > MAXCLIP) clips = MAXCLIP; + for (j = 0; j != clips; j++) { + XDestroyWindow(xp->d, clipWindows[j]); + } +} /* DestroyClipWindows */ + + +double DoTest(xp, test, reps) + XParms xp; + Test *test; + int reps; +{ + double time; + unsigned int ret_width, ret_height; + + /* Tell screen-saver to restart counting again. See comments below for the + XSetScreenSaver call. */ + XForceScreenSaver(xp->d, ScreenSaverReset); + if ( dontClear == False ) + XClearWindow( xp->d, xp->w ); + HardwareSync (xp); + InitTimes (); + (*test->proc) (xp, &test->parms, reps); + HardwareSync(xp); + + time = ElapsedTime(syncTime); + if (drawToFakeServer) + XQueryBestSize(xp->d, TileShape, tileToQuery, + 32, 32, &ret_width, &ret_height); + (*test->passCleanup) (xp, &test->parms); + return time; +} + + +int CalibrateTest(xp, test, seconds, usecperobj) + XParms xp; + Test *test; + int seconds; + double *usecperobj; +{ +#define goal 2500000.0 /* Try to get up to 2.5 seconds */ +#define enough 2000000.0 /* But settle for 2.0 seconds */ +#define tick 10000.0 /* Assume clock not faster than .01 seconds */ + + double usecs; + int reps, didreps; /* Reps desired, reps performed */ + int exponent; + + /* Attempt to get an idea how long each rep lasts by getting enough + reps to last more tan enough. Then scale that up to the number of + seconds desired. + + If init call to test ever fails, return False and test will be skipped. + */ + + if (fixedReps != 0) { + return fixedReps; + } + reps = 1; + for (;;) { + XDestroySubwindows(xp->d, xp->w); + XClearWindow(xp->d, xp->w); + didreps = (*test->init) (xp, &test->parms, reps); + if (didreps == 0) { + return 0; + } + /* Create clip windows if requested */ + CreateClipWindows(xp, test->clips); + if ( dontClear == False ) + XClearWindow( xp->d, xp->w ); + HardwareSync(xp); + InitTimes(); + (*test->proc) (xp, &test->parms, reps); + HardwareSync(xp); + usecs = ElapsedTime(syncTime); + (*test->cleanup) (xp, &test->parms); + DestroyClipWindows(xp, test->clips); + + if (didreps != reps) { + /* The test can't do the number of reps as we asked for. + Give up */ + *usecperobj = + usecs / (double)(didreps * test->parms.objects); + return didreps; + } + /* Did we go long enough? */ + if (usecs >= enough) break; + + /* Don't let too short a clock make new reps wildly high */ + if (usecs < tick) usecs = tick; + + /* Try to get up to goal seconds. */ + reps = (int) (goal * (double)reps / usecs) + 1; + } + + *usecperobj = usecs / (double) (reps * test->parms.objects); + reps = (int) ((double)seconds * 1000000.0 * (double)reps / usecs) + 1; + + /* Now round reps up to 1 digit accuracy, so we don't get stupid-looking + numbers of repetitions. */ + reps--; + exponent = 1; + while (reps > 9) { + reps /= 10; + exponent *= 10; + } + reps = (reps + 1) * exponent; + return reps; +} /* CalibrateTest */ + +void CreatePerfGCs(xp, func, pm) + XParms xp; + int func; + unsigned long pm; +{ + XGCValues gcvfg, gcvbg; + unsigned long fg, bg; + + fg = xp->foreground; + bg = xp->background; + gcvfg.graphics_exposures = False; + gcvbg.graphics_exposures = False; + gcvfg.plane_mask = pm; + gcvbg.plane_mask = pm; + gcvfg.function = func; + gcvbg.function = func; + + if (func == GXxor) { + /* Make test look good visually if possible */ + gcvbg.foreground = gcvfg.foreground = bg ^ fg; + gcvbg.background = gcvfg.background = bg; + } else { + gcvfg.foreground = fg; + gcvfg.background = bg; + gcvbg.foreground = bg; + gcvbg.background = fg; + } + xp->fggc = XCreateGC(xp->d, xp->w, + GCForeground | GCBackground | GCGraphicsExposures + | GCFunction | GCPlaneMask, &gcvfg); + xp->bggc = XCreateGC(xp->d, xp->w, + GCForeground | GCBackground | GCGraphicsExposures + | GCFunction | GCPlaneMask, &gcvbg); + +} + +void DestroyPerfGCs(xp) +XParms xp; +{ + XFreeGC(xp->d, xp->fggc); + XFreeGC(xp->d, xp->bggc); +} + +void DisplayStatus(d, message, test, try) + Display *d; + char *message; + char *test; + int try; +{ + char s[500]; + + XClearWindow(d, status); + sprintf(s, "%d %s %s", try, message, test); + /* We should really look at the height, descent of the font, etc. but + who cares. This works. */ + XDrawString(d, status, tgc, 10, 13, s, strlen(s)); +} + + +void ProcessTest(xp, test, func, pm, label, locreps) + XParms xp; + Test *test; + int func; + unsigned long pm; + char *label; + int locreps; +{ + double time, totalTime; + int reps; + int j; + + CreatePerfGCs(xp, func, pm); + if ( showLabels == True ) + { + fprintf( stderr, "'%s'\n", label ); + fflush( stderr ); + } + if ( loCal == False ) + { + DisplayStatus(xp->d, "Calibrating", label, 0); + reps = CalibrateTest(xp, test, seconds, &time); + } + else + { + if (fixedReps != 0) + reps = fixedReps; + else + reps = 5; + } + if ( locreps != -1 ) + reps = locreps; + if (reps != 0) { + XDestroySubwindows(xp->d, xp->w); + XClearWindow(xp->d, xp->w); + + /* scale down the reps if needed */ + + reps = (*test->init) (xp, &test->parms, reps); + /* Create clip windows if requested */ + CreateClipWindows(xp, test->clips); + + totalTime = 0.0; + for (j = 0; j != repeat; j++) { + if ( sigBail == True ) + break; + DisplayStatus(xp->d, "Testing", label, j+1); + time = DoTest(xp, test, reps); + totalTime += time; + ReportTimes (time, reps * test->parms.objects, + label, False); + } + if (repeat > 1) { + ReportTimes(totalTime, + repeat * reps * test->parms.objects, + label, True); + } + (*test->cleanup) (xp, &test->parms); + DestroyClipWindows(xp, test->clips); + } else { + /* Test failed to initialize properly */ + } + printf ("\n"); + fflush(stdout); + DestroyPerfGCs(xp); +} /* ProcessTest */ + + +main(argc, argv) + int argc; + char **argv; + +{ + int i, j, n; + int numTests; /* Even though the linker knows, we don't. */ + char hostname[100]; + char *displayName; + Bool foundOne = False; + Bool synchronous = False; + XGCValues tgcv; + int screen; + XVisualInfo *vinfolist, vinfotempl; + unsigned long vmask; + XieExtensionInfo *xieInfo; + XWindowAttributes attribs; + XEvent event; + int done, cclass, timeout; + int listTests = 0; + + CacheInit(); + dontClear = False; + /* Save away argv, argc, for usage to print out */ + saveargc = argc; + saveargv = (char **) malloc(argc * sizeof(char *)); + for (i = 0; i != argc; i++) { + saveargv[i] = argv[i]; + } + + xparms.pack = False; + xparms.version = 1; + + /* Count number of tests */ + ForEachTest(numTests); + doit = (Bool *)calloc(numTests, sizeof(Bool)); + + /* Parse arguments */ + program_name = argv[0]; + xparms.displayName = displayName = Get_Display_Name (&argc, argv); + for (i = 1; i != argc; i++) { + if (strcmp (argv[i], "-all") == 0) { + ForEachTest (j) + doit[j] = True; + foundOne = True; + } else if (strcmp (argv[i], "-labels") == 0) { + labels = True; + } else if (strcmp(argv[i], "-range") == 0) { + char *cp1; + char *cp2; + + if (argc <= ++i) + usage(); + cp1 = argv[i]; + if (*cp1 == '-') + cp1++; + for (cp2 = cp1; *cp2 != '\0' && *cp2 != ','; cp2++) {}; + if (*cp2 == ',') { + *cp2++ = '\0'; + if (*cp2 == '-') + cp2++; + } else { + cp2 = "-"; + } + ForEachTest (j) { + if (strcmp (cp1, (test[j].option) + 1) == 0 && + (test[j].versions & xparms.version)) { + int k = j; + do { + doit[k] = True; + } while (strcmp(cp2, (test[k].option + 1)) != 0 && + (test[k].versions & xparms.version) && + test[++k].option != NULL); + if (*cp2 != '-' && test[k].option == NULL) + usage(); + break; + } + } + if (test[j].option == NULL) + usage(); + foundOne = True; + } else if (strcmp (argv[i], "-sync") == 0) { + synchronous = True; + } else if (strcmp (argv[i], "-images") == 0) { + i++; + if (argc <= i ) + usage(); + imagepath = argv[i]; + } else if (strcmp (argv[i], "-timeout") == 0) { + i++; + if (argc <= i) + usage (); + timeout = atoi (argv[i]); + if (timeout < 0) + usage (); + else + SetTimeout( timeout ); + + } else if (strcmp (argv[i], "-repeat") == 0) { + i++; + if (argc <= i) + usage (); + repeat = atoi (argv[i]); + if (repeat <= 0) + usage (); + } else if (strcmp (argv[i], "-time") == 0) { + i++; + if (argc <= i) + usage (); + seconds = atoi (argv[i]); + if (seconds <= 0) + usage (); + } else if (strcmp(argv[i], "-reps") == 0) { + i++; + if (argc <= i) + usage (); + fixedReps = atoi (argv[i]); + if (fixedReps <= 0) + usage (); + } else if (strcmp(argv[i], "-depth") == 0) { + i++; + if (argc <= i) + usage (); + depth = atoi(argv[i]); + if (depth <= 0) + usage (); + } else if (strcmp(argv[i], "-script") == 0) { + i++; + loadTests = True; + if (argc <= i) + usage(); + loadTestsFile = argv[i]; + foundOne = True; + } else if (strcmp(argv[i], "-cache") == 0) { + int val; + i++; + if (argc <= i) + usage (); + val = atoi(argv[i]); + if ( val < 0 ) + usage(); + if ( val < CacheSizeMax ) + val = CacheSizeMax; + CacheSizeMax = val; + } else if (strcmp(argv[i], "-loCal") == 0) { + loCal = True; + } else if (strcmp(argv[i], "-showtechs") == 0) { + showTechs = True; + } else if (strcmp(argv[i], "-showlabels") == 0) { + showLabels = True; + } else if (strcmp(argv[i], "-events") == 0) { + runEvents = True; + } else if (strcmp(argv[i], "-errors") == 0) { + runErrors = True; + } else if (strcmp(argv[i], "-showevents") == 0) { + showErrors = True; + } else if (strcmp(argv[i], "-GrayScale") == 0) { + visualClass = GrayScale; + } else if (strcmp(argv[i], "-StaticGray") == 0) { + visualClass = StaticGray; + } else if (strcmp(argv[i], "-PseudoColor") == 0) { + visualClass = PseudoColor; + } else if (strcmp(argv[i], "-StaticColor") == 0) { + visualClass = StaticColor; + } else if (strcmp(argv[i], "-DirectColor") == 0) { + visualClass = DirectColor; + } else if (strcmp(argv[i], "-TrueColor") == 0) { + visualClass = TrueColor; + } else if (strcmp(argv[i], "-DIS") == 0) { + class_request = SUBSET_DIS; + } else if (strcmp(argv[i], "-WMSafe") == 0) { + WMSafe = True; + } else if (strcmp(argv[i], "-tests") == 0) { + j = 0; + while (test[j].option != NULL) { + fprintf(stderr, " %-24s %s\n", + test[j].option, test[j].label); + j++; + } + exit(0); + } else if (strcmp(argv[i], "-mkscript") == 0) { + listTests = 1; + } else { + ForEachTest (j) { + if (strcmp (argv[i], test[j].option) == 0 && + (test[j].versions & xparms.version)) { + doit[j] = True; + goto LegalOption; + } + } + usage (); + LegalOption: + foundOne = True; + } + } + + if ( listTests ) + { + j = 0; + while (test[j].option != NULL) { + if ( fixedReps && repeat != DEFAULT_REPEAT ) + fprintf(stderr, "%-30s -repeat %d -reps %d\n", + &test[j].option[ 1 ], repeat, fixedReps ); + else if ( repeat != DEFAULT_REPEAT ) + fprintf(stderr, "%-30s -repeat %d\n", + &test[j].option[ 1 ], repeat ); + else + fprintf(stderr, "%-30s\n", &test[j].option[ 1 ] ); + + j++; + } + exit(0); + } + + if (labels) { + /* Just print out list of tests for use with .sh programs that + assemble data from different xieperf runs into a nice format */ + ForEachTest (i) { + if (doit[i] && (test[i].versions & xparms.version)) { + printf ("%s\n", test[i].label); + } + } + exit(0); + } + + if (!foundOne) + usage (); + if ( loadTests == True ) + { + if ( !strcmp( loadTestsFile, "-" ) ) + fp = stdin; + else + fp = fopen( loadTestsFile, "r" ); + if ( fp == ( FILE * ) NULL ) + { + fprintf( stderr, "Couldn't open script file '%s'\n", + loadTestsFile ); + fprintf( stderr, "script argument will be ignored\n" ); + loadTests = False; + } + } + + xparms.d = Open_Display (displayName); + screen = DefaultScreen(xparms.d); + + /* check for presence of XIE */ + + printf("xieperf - XIE performance program, version 1.0\n"); + if ( !XieInitialize(xparms.d, &xieInfo ) ) { + printf("\nXIE not supported on this display!\n"); + exit(1); + } + printf("\nXIE V%d.%d\n", xieInfo->server_major_rev, + xieInfo->server_minor_rev); + + capabilities = ( xieInfo->service_class << 8 ); + if ( IsDIS( capabilities ) ) + printf( "DIS server\n" ); + else + printf( "FULL server\n" ); + + if ( IsFull( capabilities ) && IsDIS( class_request ) ) + { + printf( "Service class is DIS - running DIS tests only\n" ); + capabilities = SUBSET_DIS; + } + + InitEventInfo( xparms.d, xieInfo ); + /* get visual info of default visual */ + vmask = VisualIDMask | VisualScreenMask; + vinfotempl.visualid = XVisualIDFromVisual(XDefaultVisual(xparms.d, screen)); + vinfotempl.screen = screen; + vinfolist = XGetVisualInfo(xparms.d, vmask, &vinfotempl, &n); + if (!vinfolist || n != 1) { + fprintf (stderr, "%s: can't get visual info of default visual\n", + program_name); + exit(1); + } + + if (depth == -1 && visualClass == -1) { + /* use the default visual and colormap */ + xparms.vinfo = *vinfolist; + XFree( vinfolist ); + } else { + /* find the specified visual */ + vmask = VisualScreenMask; + vinfotempl.screen = screen; + if ( depth != -1 ) + { + vmask |= VisualDepthMask; + vinfotempl.depth = depth; + } + if ( visualClass != -1 ) + { + vmask |= VisualClassMask; +#if defined(__cplusplus) || defined(c_plusplus) + vinfotempl.c_class = visualClass; +#else + vinfotempl.class = visualClass; +#endif + } + if ( vinfolist ) + XFree( vinfolist ); + vinfolist = XGetVisualInfo(xparms.d, vmask, &vinfotempl, &n); + if (!vinfolist) { + fprintf (stderr, + "%s: can't find an appropriate visual for requested depth and/or class\n", program_name); + exit(1); + } + xparms.vinfo = *vinfolist; /* use the first one in list */ + XFree( vinfolist ); + } + +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xparms.vinfo.c_class; +#else + cclass = xparms.vinfo.class; +#endif + printf( "Screen visual class is " ); + switch( cclass ) + { + case GrayScale: + printf( "GrayScale\n" ); + break; + case StaticGray: + printf( "StaticGray\n" ); + break; + case PseudoColor: + printf( "PseudoColor\n" ); + break; + case StaticColor: + printf( "StaticColor\n" ); + break; + case TrueColor: + printf( "TrueColor\n" ); + break; + case DirectColor: + printf( "DirectColor\n" ); + break; + default: + printf( "Unknown\n" ); + break; + } + + if ( cclass == GrayScale || cclass == PseudoColor || cclass == DirectColor ) + { + cmap = graycmap = XCreateColormap(xparms.d, DefaultRootWindow(xparms.d), + xparms.vinfo.visual, AllocAll ); + colorcmap = XCreateColormap(xparms.d, DefaultRootWindow(xparms.d), + xparms.vinfo.visual, AllocAll ); + emptycmap = XCreateColormap(xparms.d, DefaultRootWindow(xparms.d), + xparms.vinfo.visual, AllocNone ); + } + else + { + cmap = graycmap = XCreateColormap(xparms.d, DefaultRootWindow(xparms.d), + xparms.vinfo.visual, AllocNone ); + colorcmap = XCreateColormap(xparms.d, DefaultRootWindow(xparms.d), + xparms.vinfo.visual, AllocNone ); + } + + if ( WMSafe == False ) + XInstallColormap( xparms.d, cmap ); + if ( cclass == GrayScale || cclass == PseudoColor || cclass == DirectColor ) + { + AllocateGrayMapColors( &xparms ); + xparms.foreground = blackidx; + xparms.background = whiteidx; + AllocateColorMapColors( &xparms ); + } + else + { + XColor color; + + color.red = 65535; color.green = 65535; color.blue = 65535; + XAllocColor( xparms.d, cmap, &color ); + xparms.background = color.pixel; + color.red = 0; color.green = 0; color.blue = 0; + XAllocColor( xparms.d, cmap, &color ); + xparms.foreground = color.pixel; + if ( cclass == TrueColor ) + { + int n_colors; + + SetDirectTrueColorStuff( &xparms, &n_colors ); + } + else + { + xparms.screenDepth = DepthFromLevels( xparms.vinfo.colormap_size ); + } + } + + printf( "Colormap has %d entries\n", xparms.vinfo.colormap_size ); + printf( "Effective depth is %d-bit\n\n", xparms.screenDepth ); + if (!foreground) foreground = "Black"; + if (!background) background = "White"; + + XmuGetHostname (hostname, 100); + printf ("%s server version %d on %s\nfrom %s\n", + ServerVendor (xparms.d), VendorRelease (xparms.d), + DisplayString (xparms.d), hostname); + PrintTime (); + + /* Force screen out of screen-saver mode, grab current data, and set + time to blank to 8 hours. We should just be able to turn the screen- + saver off, but this causes problems on some servers. We also reset + the screen-saver timer each test, as 8 hours is about the maximum time + we can use, and that isn't long enough for some X terminals using a + serial protocol to finish all the tests. As long as the tests run to + completion, the old screen-saver values are restored. */ + XForceScreenSaver(xparms.d, ScreenSaverReset); + XGetScreenSaver(xparms.d, &ssTimeout, &ssInterval, &ssPreferBlanking, + &ssAllowExposures); + (void) signal(SIGINT, Cleanup); /* ^C */ +#ifdef SIGQUIT + (void) signal(SIGQUIT, Cleanup); +#endif + (void) signal(SIGTERM, Cleanup); +#ifdef SIGHUP + (void) signal(SIGHUP, Cleanup); +#endif + XSetScreenSaver(xparms.d, 8 * 3600, ssInterval, ssPreferBlanking, + ssAllowExposures); + + if (drawToFakeServer) { + tileToQuery = + XCreatePixmap(xparms.d, DefaultRootWindow (xparms.d), 32, 32, 1); + } + if ( WMSafe == True ) + { + xparms.p = CreateXIEParent( &xparms ); + XSetTransientForHint( xparms.d, xparms.p, DefaultRootWindow (xparms.d) ); + XMapRaised( xparms.d, xparms.p ); + } + else + xparms.p = DefaultRootWindow( xparms.d ); + xparms.w = CreatePerfWindowUnmapped(&xparms, 2, 2, WIDTH, HEIGHT); + if ( WMSafe == True ) + XSetTransientForHint( xparms.d, xparms.w, xparms.p ); + monitorWindow = CreatePerfWindowUnmapped(&xparms, WIDTH - 100, + HEIGHT - 100, MONWIDTH, MONHEIGHT); + if ( WMSafe == True ) + XSetTransientForHint( xparms.d, monitorWindow, xparms.p ); + monitor2Window = CreatePerfWindowUnmapped(&xparms, WIDTH - 100, + HEIGHT - 100, MONWIDTH, MONHEIGHT); + if ( WMSafe == True ) + XSetTransientForHint( xparms.d, monitor2Window, xparms.p ); + + drawableWindow = CreatePerfWindowUnmapped(&xparms, 610, 0, + WIDTH, HEIGHT); + if ( WMSafe == True ) + XSetTransientForHint( xparms.d, drawableWindow, xparms.p ); + status = CreatePerfWindowUnmapped(&xparms, 2, HEIGHT+5, WIDTH, 20); + if ( WMSafe == True ) + XSetTransientForHint( xparms.d, status, xparms.p ); + tgcv.foreground = xparms.foreground; + tgcv.background = xparms.background; + tgc = XCreateGC(xparms.d, status, GCForeground | GCBackground, &tgcv); + + if (synchronous) + XSynchronize (xparms.d, True); + + /* Get mouse pointer out of the way of the performance window. On + software cursor machines it will slow graphics performance. On + all current MIT-derived servers it will slow window + creation/configuration performance. */ + XGetWindowAttributes( xparms.d, DefaultRootWindow( xparms.d ), &attribs ); + XSync( xparms.d, 0 ); + + /* wait for first expose event before we trudge forward */ + + XSelectInput( xparms.d, xparms.w, ExposureMask ); + XSync( xparms.d, 0 ); + XMapWindow( xparms.d, xparms.w ); + XMapWindow( xparms.d, status ); + + done = 0; + while( done == 0 ) + { + XNextEvent( xparms.d, &event ); + switch( event.type ) + { + case Expose: + done = 1; + break; + } + } + + if ( WMSafe == True ) + XWarpPointer(xparms.d, None, xparms.p, 0, 0, 0, 0, 10, HEIGHT+30); + else + XWarpPointer(xparms.d, None, DefaultRootWindow( xparms.d ), + 0, 0, 0, 0, 10, HEIGHT+30); + + /* Figure out how long to call HardwareSync, so we can adjust for that + in our total elapsed time */ + + (void) CalibrateTest(&xparms, &syncTest, 1, &syncTime); + printf("Sync time adjustment is %6.4f msecs.\n\n", syncTime/1000); + + if (showTechs) + ListAllTechs( &xparms ); + + if ( loadTests == False ) + { + ForEachTest (i) { + + char label[200]; + + if ( !EventOrErrorValid( test[ i ].parms.description ) ) + continue; + if (doit[i] && (test[i].versions & xparms.version) && ServerIsCapable( test[ i ].parms.description ) ) { + strcpy (label, test[i].label); + ProcessTest(&xparms, &test[i], GXcopy, ~((unsigned long)0), label, -1); + if ( sigBail == True ) + break; + } /* if doit */ + } /* ForEachTest */ + } + else + { + Bool done; + int repeattmp, + repeatsave; + int reps; + done = False; + + while ( done == False ) + { + if ( sigBail == True ) + break; + repeattmp = repeatsave = -1; + if ( ( i = GetNextTest( fp, &repeattmp, &reps ) ) < 0 ) + done = True; + else + { + char label[200]; + + if ( !EventOrErrorValid( test[ i ].parms.description ) ) + continue; + if ((test[i].versions & xparms.version) && + ServerIsCapable( test[ i ].parms.description ) ) + { + strcpy (label, test[i].label); + if ( repeattmp != -1 ) + { + repeatsave = repeat; + repeat = repeattmp; + } + ProcessTest(&xparms, + &test[i], GXcopy, ~0L, label, reps); + if ( repeattmp != -1 ) + repeat = repeatsave; + } + } + } + } + + if ( fp != ( FILE * ) NULL ) + fclose( fp ); + ReclaimPhotomapMemory(); /* shut up Purify :-) */ + + if ( WMSafe == True ) + { + XUnmapWindow(xparms.d, xparms.p ); + XSync( xparms.d, 0 ); + XDestroyWindow(xparms.d, xparms.p ); + } + else + XDestroyWindow(xparms.d, xparms.w); + /* Restore ScreenSaver to original state. */ + XSetScreenSaver(xparms.d, ssTimeout, ssInterval, ssPreferBlanking, + ssAllowExposures); + if ( RGB_BESTStandardColormapObtained == True ) + XmuDeleteStandardColormap( xparms.d, DefaultScreen( xparms.d ), + XA_RGB_BEST_MAP ); + XCloseDisplay(xparms.d); +} + +int +TestIndex ( testname ) +char *testname; +{ + int j, found; + + found = -1; + ForEachTest (j) + { + if (strcmp (testname, (test[j].option) + 1) == 0 ) + { + found = j; + break; + } + } + return( found ); +} + +Window +CreateXIEParent( xp ) +XParms xp; +{ + Window root, ret; + unsigned int width, height, border_width, depth; + XSetWindowAttributes xswa; + int x, y; + int hasBS; + unsigned long value_mask; + +/* + Time for a little explaining... + + Xieperf puts up windows, moves them around, and associates + colormaps with windows. If no window manager is running, then + things are fine - I don't even call this function. I just set + the window attribute override_redirect = True at window creation + time, and associate my grayscale colormap with the window at + creation time also. + + If a window manager is running, I need to be nice. Nice means + allow the window manager to install colormaps as my windows + gain focus, and let the manager control any geometry changes + that I issue. + + The user, when a window manager is running, is required to use + the -WMSafe argument to xieperf to indicate to me that a window + manager is running. If this arg is given, then I do the following: + + I make a child window of the root window which acts as the parent + window for xieperf's windows. I use XSetTransientForHint() to tell + the window manager essentially that each child window of this + parent is a transient window so please don't mess with my geometry + requests and please install the colormap associated with each + child window as that window gains focus. + + Since the parent window has dimensions equal to the root window, + the app will have focus and my colormap ( which is also the color + map of the parent window ) will be installed ( assuming the + graciousness of the window manager ). Also, any child windows will + appear, disappear, and be moved at my command. Finally, it was + my goal to make the parent window transparent, so it has the usual + root window appearance. This could be done by calling the function + XSetWindowBackgroundPixmap(), and specifying ParentRelative as its + final argument. + + But I ran into problems. I got the desired effects - namely window + placement, colormap handling, and the transparency thing all seemed + o.k., but under twm my parent window would not clear itself when + child windows were unmapped, nor would it respond to XClearWindow() + calls. Turning backing store on for the parent window fixed the + problem, but that is not a viable solution since backing store isn't + always around to help. And, when running under mwm, bizarro effects + like side-by-side mirror images of a child window would appear. It + was dazzling, but unappreciated... + + My solution was simple. If this function is called, and the server + currently supports backing store, I use that, go for the transparent + window, and things are happy. + + If this function is called and there is no backing store support, + instead of having a transparent parent window, the parent window is + created with a background pixel of BlackPixel ( also it was shown + that while the transparent version of the parent window never cleared + either on its own or explicitly via XClearWindow(), windows that had + normal pixel-based backgrounds would clear themselves whenever the + child windows were unmapped ). + + Comments would be appreciated... there should be a way to do this + that isn't too painful. The Xlib Programming Manual ( O'Reilly + Volume 1, p 96 ) states that if ParentRelative is used as a + backround pixmap, the backgrounds are automatically repainted on + exposure. As the above states, they aren't. My feeling is that there + is a bug in the R5 cfb code or... +*/ + + hasBS = DoesBackingStore( DefaultScreenOfDisplay( xp->d ) ); + XGetGeometry( xp->d, DefaultRootWindow( xp->d ), &root, &x, &y, + &width, &height, &border_width, &depth ); + + xswa.colormap = cmap; + if ( hasBS ) + { + xswa.backing_store = WhenMapped; + } + else + { + xswa.background_pixel = + BlackPixel( xp->d, DefaultScreen( xp->d ) ); + } + value_mask = CWColormap | ( hasBS ? CWBackingStore : CWBackPixel ); + ret = XCreateWindow( xp->d, DefaultRootWindow( xp->d ), + x, y, width, height, border_width, xp->vinfo.depth, + CopyFromParent, xp->vinfo.visual, + value_mask, &xswa ); + + if ( hasBS ) + { + /* make it transparent */ + + XSetWindowBackgroundPixmap( xp->d, ret, ParentRelative ); + } + return( ret ); +} + +void +AllocateGrayMapColors( xp ) +XParms xp; +{ + int i, n_colors; + long intensity, rintensity, gintensity, bintensity; + XColor *gray = ( XColor * ) NULL; + int cclass; + int maxcoloridx; + + /* get what we can, and remember it. we should get all since + we created the colormap */ + + gray = ( XColor * ) malloc(sizeof( XColor ) * xp->vinfo.colormap_size); + if ( gray == ( XColor * ) NULL ) + { + fprintf( stderr, "Couldn't allocate XColor vector for XAllocColorCells\n" ); + exit( 1 ); + } + + n_colors = 0; +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xp->vinfo.c_class; +#else + cclass = xp->vinfo.class; +#endif + + if ( cclass == DirectColor ) + { + SetDirectTrueColorStuff( xp, &n_colors ); + } + else + { + n_colors = xp->vinfo.colormap_size; + xp->screenDepth = DepthFromLevels( n_colors ); + } + + /* do a grey scale ramp */ + + maxcoloridx = n_colors - 1; + + if ( cclass == DirectColor ) + { + for (i=0; id,graycmap,gray,n_colors); + XSync(xp->d,0); + } + else + { + fprintf( stderr, "Couldn't allocate colors in colormap\n" ); + if ( gray ) + free( gray ); + exit( 0 ); + } + if ( gray ) + free( gray ); +} + +void +AllocateColorMapColors( xp ) +XParms xp; +{ + int i, n_colors; + long intensity, rintensity, gintensity, bintensity; + XColor *gray = ( XColor * ) NULL; + int cclass; + int maxcoloridx; + + /* get what we can, and remember it. we should get all since + we created the colormap */ + + gray = ( XColor * ) malloc(sizeof( XColor ) * xp->vinfo.colormap_size); + if ( gray == ( XColor * ) NULL ) + { + fprintf( stderr, "Couldn't allocate XColor vector for XAllocColorCells\n" ); + exit( 1 ); + } + + n_colors = 0; +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xp->vinfo.c_class; +#else + cclass = xp->vinfo.class; +#endif + + if ( cclass == DirectColor ) + { + SetDirectTrueColorStuff( xp, &n_colors ); + } + else + { + n_colors = xp->vinfo.colormap_size; + xp->screenDepth = DepthFromLevels( n_colors ); + } + + /* do a grey scale ramp */ + + maxcoloridx = n_colors - 1; + + if ( cclass == DirectColor ) + { + for (i=0; id,colorcmap,gray,n_colors); + XSync(xp->d,0); + } + else + { + fprintf( stderr, "Couldn't allocate colors in colormap\n" ); + if ( gray ) + free( gray ); + exit( 0 ); + } + if ( gray ) + free( gray ); +} + +int +SetDirectTrueColorStuff( xp, n_colors ) +XParms xp; +int *n_colors; +{ + unsigned long mask; + + DCRedMask = xp->vinfo.red_mask; + DCGreenMask = xp->vinfo.green_mask; + DCBlueMask = xp->vinfo.blue_mask; + + mask = 1L << ( ( sizeof( long ) << 3 ) - 1 ); + rbits = gbits = bbits = 0; + + while ( mask ) + { + if ( mask & DCRedMask ) rbits+=1; + else if ( mask & DCGreenMask ) gbits+=1; + else if ( mask & DCBlueMask ) bbits+=1; + mask = mask >> 1; + } + xp->screenDepth = MIN( rbits, MIN( gbits, bbits ) ); + if ( xp->screenDepth == rbits && xp->screenDepth == gbits && + xp->screenDepth == bbits ) + { + xp->screenDepth = rbits + gbits + bbits; + *n_colors = 1 << rbits; + } + else + { + *n_colors = 1 << xp->screenDepth; + } +} + +int +GetWords (argi, argc, argv, wordsp, nump) + int argi; + int argc; + char **argv; + char **wordsp; + int *nump; +{ + int count; + + if (argc <= argi) + usage(); + count = 0; + while (argv[argi] && *(argv[argi]) != '-') { + *wordsp++ = argv[argi]; + ++argi; + count++; + } + *nump = count; + return count; +} + +static int +atox (s) + char *s; +{ + int v, c; + + v = c = 0; + while (*s) { + if ('0' <= *s && *s <= '9') + c = *s - '0'; + else if ('a' <= *s && *s <= 'f') + c = *s - 'a' + 10; + else if ('A' <= *s && *s <= 'F') + c = *s - 'A' + 10; + v = v * 16 + c; + s++; + } + return v; +} + +int GetNumbers (argi, argc, argv, intsp, nump) + int argi; + int argc; + char **argv; + int *intsp; + int *nump; +{ + char *words[256]; + int count; + int i; + int flip; + + count = GetWords (argi, argc, argv, words, nump); + for (i = 0; i < count; i++) { + flip = 0; + if (!strncmp (words[i], "~", 1)) { + words[i]++; + flip = ~0; + } + if (!strncmp (words[i], "0x", 2)) + intsp[i] = atox(words[i] + 2) ^ flip; + else + intsp[i] = atoi (words[i]) ^ flip; + } + return count; +} + +int +SendTripleBandPlaneDataSequential( xp, p, flo_id, photospace, element, data, + size, pixel_stride, left_pad, scanline_pad, width, height ) +XParms xp; +Parms p; +int flo_id; +XiePhotospace photospace; +int element; +char *data; +int size; +unsigned char pixel_stride[ 3 ]; +unsigned char left_pad[ 3 ]; +unsigned char scanline_pad[ 3 ]; +XieLTriplet width, height; +{ + void ScanlinePad(); + int band1, band2, band3; + + /* calculate band sizes */ + + band1 = ( ( left_pad[ 0 ] >> 3 ) + + ( width[ 0 ] * ( pixel_stride[ 0 ] >> 3 ) ) ) * height[ 0 ]; + ScanlinePad( &band1, scanline_pad[ 0 ] ); + band2 = ( ( left_pad[ 1 ] >> 3 ) + + ( width[ 1 ] * ( pixel_stride[ 1 ] >> 3 ) ) ) * height[ 1 ]; + ScanlinePad( &band2, scanline_pad[ 1 ] ); + band3 = ( ( left_pad[ 2 ] >> 3 ) + + ( width[ 2 ] * ( pixel_stride[ 2 ] >> 3 ) ) ) * height[ 2 ]; + ScanlinePad( &band3, scanline_pad[ 0 ] ); + + /* fire away! */ + + PumpTheClientData( xp, p, flo_id, photospace, element, data, band1, 0 ); + data += band1; + PumpTheClientData( xp, p, flo_id, photospace, element, data, band2, 1 ); + data += band2; + PumpTheClientData( xp, p, flo_id, photospace, element, data, band3, 2 ); + data += band3; +} + +void +ScanlinePad( value, pad ) +int *value; +int pad; +{ + int newval; + + if ( !( *value == 0 || pad == 0 || pad == 1 ) ) + { + if ( ( *value % pad ) != 0 ) + { + if ( *value < pad ) + { + *value = pad; + } + else + { + newval = pad; + while ( newval < *value ) + newval += pad; + *value = newval; + } + } + } +} + +int +PumpTheClientData( xp, p, flo_id, photospace, element, data, size, band_number ) +XParms xp; +Parms p; +int flo_id; +XiePhotospace photospace; +int element; +char *data; +int size; +int band_number; +{ + int bytes_left, final, nbytes; + + final = 0; + bytes_left = size; + while (bytes_left > 0) { + nbytes = (bytes_left > p->buffer_size) ? + p->buffer_size: bytes_left; + if (nbytes >= bytes_left) + final = 1; + XiePutClientData ( + xp->d, + photospace, + flo_id, + element, /* element */ + final, /* signal that this is all the data */ + band_number, /* 0 for all but triple band data + BandByPlane, which then may be + 0, 1, or 2 */ + (unsigned char *) data, + nbytes + ); + bytes_left -= nbytes; + data += nbytes; + } +} + +int +ReadNotifyExportData( xp, p, namespace, flo_id, element, elementsz, + numels, data, done ) +XParms xp; +Parms p; +unsigned long namespace; +int flo_id; +XiePhototag element; +unsigned int elementsz; +unsigned int numels; +char **data; +int *done; +{ + char *cp, *ptr; + Bool terminate = False; + XieExportState new_state_ret; + unsigned int nbytes; + unsigned int nbytes_ret; + Bool no_errors, reallocFlag; + unsigned int cnt; + int bytes; + + *done = 0; + if ( numels == 0 ) + { + numels = WaitForXIEEvent( xp, xieEvnNoExportAvailable, + flo_id, element, False ); + if ( numels == 0 ) + return( -1 ); + } + + nbytes = numels * elementsz; + bytes = nbytes; + no_errors = True; + reallocFlag = False; + cnt = 0; + if ( *data == ( char * ) NULL ) + { + if ( ( *data = ( char * ) malloc( nbytes ) ) == ( char * ) NULL ) + { + fprintf( stderr, "ReadNotifyExportData: couldn't allocate data\n" ); + return( 0 ); + } + } + ptr = *data; + while ( 1 ) + { + XieGetClientData ( xp->d, namespace, flo_id, element, + bytes > 2048 ? 2048 : bytes, terminate, 0, + &new_state_ret, (unsigned char **)&cp, &nbytes_ret ); + + if ( nbytes_ret && reallocFlag ) + { + *data = realloc( *data, cnt + nbytes_ret ); + if ( *data == ( char * ) NULL ) + { + /* oh no */ + + fprintf( stderr, "ReadNotifyExportData: realloc failed\n" ); + no_errors = False; + break; + } + ptr = *data + cnt; + } + +/* this rots */ + + memcpy( ptr, cp, nbytes_ret * sizeof( char ) ); + ptr += nbytes_ret * sizeof( char ); + XFree( cp ); + + cnt += nbytes_ret; + bytes -= nbytes_ret; + if ( new_state_ret == xieValExportEmpty ) + WaitForXIEEvent( xp, xieEvnNoExportAvailable, + flo_id, element, False ); + else if ( new_state_ret == xieValExportMore ) + { + if ( bytes <= 0 ) + { + reallocFlag = True; + bytes = 2048; + } + } + else if ( new_state_ret == xieValExportDone ) + { + *done = 1; + break; + } + else if ( new_state_ret == xieValExportError ) + { + fprintf( stderr, "ReadNotifyExportData: xieValExportError received from XieGetClientData\n" ); + no_errors = False; + break; + } + + if ( bytes <= 0 && reallocFlag == False ) + { + /* if we get here, we didn't get an ExportDone, + and we have no buffer space left. So turn on + the realloc flag. Also, server could be not + sending the ExportDone for some reason... + if so XIE or xieperf or both may be broken. */ + + bytes = 2048; + reallocFlag = True; + } + } + if ( no_errors == False ) + { + return( -1 ); + } + return( cnt ); +} + +int +ReadNotifyExportTripleData( xp, p, namespace, flo_id, element, elementsz, + numels, data, done ) +XParms xp; +Parms p; +unsigned long namespace; +int flo_id; +XiePhototag element; +unsigned int elementsz; +unsigned int numels; +char **data; +int *done; +{ + char *cp, *ptr; + Bool terminate = False; + XieExportState new_state_ret; + unsigned int nbytes; + unsigned int nbytes_ret; + Bool no_errors, reallocFlag; + unsigned int cnt; + int bytes; + int band; + + *done = 0; + if ( numels == 0 ) + { + numels = WaitForXIEEvent( xp, xieEvnNoExportAvailable, + flo_id, element, False ); + if ( numels == 0 ) + return( -1 ); + fprintf( stderr, "There are %d elements available\n", numels ); + } + + nbytes = numels * elementsz; + bytes = nbytes; + no_errors = True; + reallocFlag = False; + cnt = 0; + if ( *data == ( char * ) NULL ) + { + if ( ( *data = ( char * ) malloc( nbytes ) ) == ( char * ) NULL ) + { + fprintf( stderr, "ReadNotifyExportTripleData: couldn't allocate data\n" ); + return( 0 ); + } + } + ptr = *data; + for ( band = 0; band < 3; band++ ) + { + while ( 1 ) + { + XieGetClientData ( xp->d, namespace, flo_id, element, + bytes > 2048 ? 2048 : bytes, terminate, band, + &new_state_ret, (unsigned char **)&cp, + &nbytes_ret ); + + if ( nbytes_ret && reallocFlag ) + { + *data = realloc( *data, cnt + nbytes_ret ); + if ( *data == ( char * ) NULL ) + { + /* oh no */ + + fprintf( stderr, "ReadNotifyExportTripleData: realloc failed\n" ); + no_errors = False; + break; + } + ptr = *data + cnt; + } + + memcpy( ptr, cp, nbytes_ret * sizeof( char ) ); + ptr += nbytes_ret * sizeof( char ); + XFree( cp ); + + cnt += nbytes_ret; + bytes -= nbytes_ret; + if ( new_state_ret == xieValExportEmpty ) + WaitForXIEEvent( xp, xieEvnNoExportAvailable, + flo_id, element, False ); + else if ( new_state_ret == xieValExportMore ) + { + if ( bytes <= 0 ) + reallocFlag = True; + bytes = 2048; + } + else if ( new_state_ret == xieValExportDone ) + { + *done = 1; + break; + } + else if ( new_state_ret == xieValExportError ) + { + fprintf( stderr, "ReadNotifyExportTripleData: xieValExportError received from XieGetClientData\n" ); + no_errors = False; + break; + } + if ( bytes <= 0 && reallocFlag == False ) + { + bytes = 2048; + reallocFlag = True; + } + } + } + if ( no_errors == False ) + { + return( -1 ); + } + return( cnt ); +} + +unsigned int +CheckSum( data, size ) +char *data; +unsigned int size; +{ + unsigned int sum, i; + + sum = 0; + for ( i = 0; i < size; i++ ) + { + sum += *(data++); + } + return( sum ); +} + +XiePhotomap +GetXIEFAXPhotomap( xp, p, which, radiometric ) +XParms xp; +Parms p; +int which; +Bool radiometric; +{ + XIEimage *image = ( XIEimage * ) NULL; + XiePhotospace photospace; + int flo_id, flo_notify; + XiePhotoElement *flograph; + XieDecodeG42DParam *g42d_decode_params=NULL; + XieDecodeG32DParam *g32d_decode_params=NULL; + XieDecodeG31DParam *g31d_decode_params=NULL; + XieDecodeTIFF2Param *tiff2_decode_params=NULL; + XieDecodeTIFFPackBitsParam *tiffpb_decode_params=NULL; + char *decode_params; + XieEncodeTechnique encode_tech=xieValEncodeServerChoice; + char *encode_params=NULL; + XieLTriplet width, height, levels; + XiePhotomap tmp; + int size; + + if ( which == 1 ) + { + image = p->finfo.image1; + + } + else if ( which == 2 ) + { + image = p->finfo.image2; + + } + else if ( which == 3 ) + { + image = p->finfo.image3; + } + else if ( which == 4 ) + { + image = p->finfo.image4; + } + if ( !image ) + return( XiePhotomap ) NULL; + + if ( IsImageInCache( image ) == True ) + { + return( PhotomapOfImage( image ) ); + } + + if ( !GetImageData( xp, p, which ) ) + return( ( XiePhotomap ) NULL ); + + if ( TechniqueSupported( xp, xieValDecode, image->decode ) == False ) + return( XiePhotomap ) NULL; + + size = image->fsize; + image->chksum = CheckSum( image->data, size ); + width[ 0 ] = image->width[ 0 ]; + height[ 0 ] = image->height[ 0 ]; + levels[ 0 ] = image->levels[ 0 ]; + + /* create a photomap */ + + tmp = XieCreatePhotomap(xp->d); + + /* get the data from the client into the photomap */ + + photospace = XieCreatePhotospace(xp->d); + + if ( image->decode == xieValDecodeG42D ) { + g42d_decode_params = XieTecDecodeG42D( + image->fill_order, + True, + radiometric + ); + decode_params = (char *) g42d_decode_params; + } + else if ( image->decode == xieValDecodeG32D ) { + g32d_decode_params = XieTecDecodeG32D( + image->fill_order, + True, + radiometric + ); + decode_params = (char *) g32d_decode_params; + } + else if ( image->decode == xieValDecodeTIFF2 ) { + tiff2_decode_params = XieTecDecodeTIFF2( + image->fill_order, + True, + radiometric + ); + decode_params = (char *) tiff2_decode_params; + } + else if ( image->decode == xieValDecodeTIFFPackBits ) { + tiffpb_decode_params = XieTecDecodeTIFFPackBits( + image->fill_order, + True + ); + decode_params = (char *) tiffpb_decode_params; + } + else if ( image->decode == xieValDecodeG31D ) { + g31d_decode_params = XieTecDecodeG31D( + image->fill_order, + True, + radiometric + ); + decode_params = (char *) g31d_decode_params; + } + else { + return( XiePhotomap ) NULL; + } + + flograph = XieAllocatePhotofloGraph(2); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "GetXIEFAXPhotomap: XieAllocatePhotofloGraph failed\n" ); + XieDestroyPhotomap( xp->d, tmp ); + if ( decode_params ) + XFree( decode_params ); + return( XiePhotomap ) NULL; + } + + XieFloImportClientPhoto(&flograph[0], + image->bandclass, + width, height, levels, + False, + image->decode, (char *)decode_params + ); + + XieFloExportPhotomap(&flograph[1], + 1, /* source phototag number */ + tmp, + encode_tech, + encode_params + ); + + flo_id = 1; + flo_notify = True; + XieExecuteImmediate(xp->d, photospace, + flo_id, + flo_notify, + flograph, /* photoflo specification */ + 2 /* number of elements */ + ); + XSync( xp->d, 0 ); + PumpTheClientData( xp, p, flo_id, photospace, 1, image->data, size, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo_id, 0, False ); + XieFreePhotofloGraph(flograph,2); + XieDestroyPhotospace(xp->d, photospace); + XFree( decode_params ); + AddToCache( image, tmp ); + return tmp; +} + +XiePhotomap +GetXIETriplePhotomap( xp, p, which ) +XParms xp; +Parms p; +int which; +{ + XIEimage *image = ( XIEimage * ) NULL; + XiePhotospace photospace; + int flo_id, flo_notify; + XiePhotoElement *flograph; + char *decode_params=NULL; + XieEncodeTechnique encode_tech=xieValEncodeServerChoice; + char *encode_params=NULL; + XieLTriplet width, height, levels; + unsigned char pixel_stride[ 3 ]; + unsigned char left_pad[ 3 ]; + unsigned char scanline_pad[ 3 ]; + XiePhotomap tmp; + int size; + + if ( which == 1 ) + { + image = p->finfo.image1; + } + else if ( which == 2 ) + { + image = p->finfo.image2; + } + else if ( which == 3 ) + { + image = p->finfo.image3; + } + else if ( which == 4 ) + { + image = p->finfo.image4; + } + if ( !image ) + return( XiePhotomap ) NULL; + + if ( IsImageInCache( image ) == True ) + { + TouchImage( image ); + return( PhotomapOfImage( image ) ); + } + + if ( !GetImageData( xp, p, which ) ) + return( ( XiePhotomap ) NULL ); + + if ( TechniqueSupported( xp, xieValDecode, image->decode ) == False ) + return( XiePhotomap ) NULL; + + size = image->fsize; + image->chksum = CheckSum( image->data, size ); + + /* create a photomap */ + + tmp = XieCreatePhotomap(xp->d); + + /* get the data from the client into the photomap */ + + photospace = XieCreatePhotospace(xp->d); + + width[ 0 ] = image->width[ 0 ]; + width[ 1 ] = image->width[ 1 ]; + width[ 2 ] = image->width[ 2 ]; + height[ 0 ] = image->height[ 0 ]; + height[ 1 ] = image->height[ 1 ]; + height[ 2 ] = image->height[ 2 ]; + levels[ 0 ] = image->levels[ 0 ]; + levels[ 1 ] = image->levels[ 1 ]; + levels[ 2 ] = image->levels[ 2 ]; + + if ( image->decode == xieValDecodeUncompressedTriple ) + { + pixel_stride[ 0 ] = image->pixel_stride[ 0 ]; + pixel_stride[ 1 ] = image->pixel_stride[ 1 ]; + pixel_stride[ 2 ] = image->pixel_stride[ 2 ]; + left_pad[ 0 ] = image->left_pad[ 0 ]; + left_pad[ 1 ] = image->left_pad[ 1 ]; + left_pad[ 2 ] = image->left_pad[ 2 ]; + scanline_pad[ 0 ] = image->scanline_pad[ 0 ]; + scanline_pad[ 1 ] = image->scanline_pad[ 1 ]; + scanline_pad[ 2 ] = image->scanline_pad[ 2 ]; + + decode_params = ( char * ) XieTecDecodeUncompressedTriple( + image->fill_order, + xieValLSFirst, + xieValLSFirst, + image->interleave, + pixel_stride, + left_pad, + scanline_pad + ); + } + else if ( image->decode == xieValDecodeJPEGBaseline ) + { + decode_params = ( char * ) XieTecDecodeJPEGBaseline( + image->interleave, + image->band_order, + True + ); + } + else if ( image->decode == xieValDecodeJPEGLossless ) + { + decode_params = ( char * ) XieTecDecodeJPEGLossless( + image->interleave, + image->band_order + ); + } + else + { + fprintf( stderr, "GetXIETriplePhotomap: invalid decode technique\n" ); + XieDestroyPhotomap( xp->d, tmp ); + return( XiePhotomap ) NULL; + } + + flograph = XieAllocatePhotofloGraph(2); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "GetXIETriplePhotomap: XieAllocatePhotofloGraph failed\n" ); + XieDestroyPhotomap( xp->d, tmp ); + return( XiePhotomap ) NULL; + } + + XieFloImportClientPhoto(&flograph[0], + image->bandclass, + width, height, levels, + False, + image->decode, (char *)decode_params + ); + + XieFloExportPhotomap(&flograph[1], + 1, /* source phototag number */ + tmp, + encode_tech, + encode_params + ); + + flo_id = 1; + flo_notify = True; + XieExecuteImmediate(xp->d, photospace, + flo_id, + flo_notify, + flograph, /* photoflo specification */ + 2 /* number of elements */ + ); + XSync( xp->d, 0 ); + if ( image->interleave == xieValBandByPixel ) + { + PumpTheClientData( xp, p, flo_id, photospace, + 1, image->data, size, 0 ); + } + else + { + SendTripleBandPlaneDataSequential( xp, p, flo_id, photospace, + 1, image->data, size, pixel_stride, + left_pad, scanline_pad, width, height ); + } + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo_id, 0, False ); + XieFreePhotofloGraph(flograph,2); + XieDestroyPhotospace(xp->d, photospace); + if ( decode_params ) + XFree( decode_params ); + AddToCache( image, tmp ); + return tmp; +} + +XiePhotomap +GetXIEPhotomap( xp, p, which ) +XParms xp; +Parms p; +int which; +{ + XIEimage *image = ( XIEimage * ) NULL; + XiePhotospace photospace; + int flo_id, flo_notify; + XiePhotoElement *flograph; + XieDecodeUncompressedSingleParam *decode_params=NULL; + XieEncodeTechnique encode_tech=xieValEncodeServerChoice; + char *encode_params=NULL; + XieLTriplet width, height, levels; + XiePhotomap tmp; + int size; + + if ( which == 1 ) + { + image = p->finfo.image1; + } + else if ( which == 2 ) + { + image = p->finfo.image2; + } + else if ( which == 3 ) + { + image = p->finfo.image3; + } + else if ( which == 4 ) + { + image = p->finfo.image4; + } + + if ( !image ) + return( XiePhotomap ) NULL; + + if ( IsImageInCache( image ) == True ) + { + TouchImage( image ); + return( PhotomapOfImage( image ) ); + } + + if ( !GetImageData( xp, p, which ) ) + return( ( XiePhotomap ) NULL ); + + size = image->fsize; + image->chksum = CheckSum( image->data, size ); + + width[ 0 ] = width[ 1 ] = width[ 2 ] = image->width[ 0 ]; + height[ 0 ] = height[ 1 ] = height[ 2 ] = image->height[ 0 ]; + levels[ 0 ] = levels[ 1 ] = levels[ 2 ] = image->levels[ 0 ]; + + /* create a photomap */ + + tmp = XieCreatePhotomap(xp->d); + + /* get the data from the client into the photomap */ + + photospace = XieCreatePhotospace(xp->d); + + decode_params = XieTecDecodeUncompressedSingle( + image->fill_order, + image->pixel_order, + image->pixel_stride[ 0 ], + image->left_pad[ 0 ], + image->scanline_pad[ 0 ] + ); + + flograph = XieAllocatePhotofloGraph(2); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "GetXIEPhotomap: XieAllocatePhotofloGraph failed\n" ); + XieDestroyPhotomap( xp->d, tmp ); + return( XiePhotomap ) NULL; + } + + XieFloImportClientPhoto(&flograph[0], + image->bandclass, + width, height, levels, + False, + image->decode, (char *)decode_params + ); + + XieFloExportPhotomap(&flograph[1], + 1, /* source phototag number */ + tmp, + encode_tech, + encode_params + ); + + flo_id = 1; + flo_notify = True; + XieExecuteImmediate(xp->d, photospace, + flo_id, + flo_notify, + flograph, /* photoflo specification */ + 2 /* number of elements */ + ); + XSync( xp->d, 0 ); + PumpTheClientData( xp, p, flo_id, photospace, 1, image->data, size, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo_id, 0, False ); + XieFreePhotofloGraph(flograph,2); + XieDestroyPhotospace(xp->d, photospace); + if ( decode_params ) + XFree( decode_params ); + AddToCache( image, tmp ); + return tmp; +} + +XiePhotomap +GetXIEPointPhotomap( xp, p, which, inlevels, useLevels ) +XParms xp; +Parms p; +int which; +int inlevels; +Bool useLevels; +{ + XIEimage *image = ( XIEimage * ) NULL; + XieEncodeTechnique encode_tech=xieValEncodeServerChoice; + char *encode_params=NULL; + XiePhotospace photospace; + int flo_id, flo_notify; + XiePhotoElement *flograph; + XiePhotomap XIEPhotomap, tmp; + XieLut XIELut; + XieProcessDomain domain; + + tmp = GetXIEPhotomap( xp, p, which ); + + if ( which == 1 ) + image = p->finfo.image1; + else if ( which == 2 ) + image = p->finfo.image2; + else if ( which == 3 ) + image = p->finfo.image3; + else if ( which == 4 ) + image = p->finfo.image4; + + if ( tmp == ( XiePhotomap ) NULL ) + return( tmp ); + + XIELut = CreatePointLut( xp, p, 1 << image->depth[ 0 ], inlevels, + useLevels ); + if ( XIELut == ( XieLut ) NULL ) + return( ( XiePhotomap ) NULL ); + + XIEPhotomap = XieCreatePhotomap(xp->d); + + /* get the data from the client into the photomap */ + + photospace = XieCreatePhotospace(xp->d); + + flograph = XieAllocatePhotofloGraph(4); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "GetXIEPointPhotomap: XieAllocatePhotofloGraph failed\n" ); + XieDestroyPhotomap( xp->d, XIEPhotomap ); + return( XiePhotomap ) NULL; + } + + XieFloImportPhotomap(&flograph[0], + tmp, + False + ); + + XieFloImportLUT(&flograph[1], XIELut ); + + domain.offset_x = 0; + domain.offset_y = 0; + domain.phototag = 0; + + XieFloPoint(&flograph[2], + 1, + &domain, + 2, + 0x1 + ); + + XieFloExportPhotomap(&flograph[3], + 3, /* source phototag number */ + XIEPhotomap, + encode_tech, + encode_params + ); + + flo_id = 1; + flo_notify = True; + XieExecuteImmediate(xp->d, photospace, + flo_id, + flo_notify, + flograph, /* photoflo specification */ + 4 /* number of elements */ + ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo_id, 0, False ); + XieFreePhotofloGraph(flograph,4); + XieDestroyPhotospace(xp->d, photospace); + if ( XIELut ) + XieDestroyLUT( xp->d, XIELut ); + return XIEPhotomap; +} + +XiePhotomap +GetXIEGeometryPhotomap( xp, p, geo, which ) +XParms xp; +Parms p; +GeometryParms *geo; +int which; +{ + XiePhotospace photospace; + int flo_id, flo_notify; + XiePhotoElement *flograph; + + static XieConstant constant = { 0.0, 0.0, 0.0 }; + XieEncodeTechnique encode_tech=xieValEncodeServerChoice; + char *encode_params=NULL; + float coeffs[ 6 ]; + XiePhotomap tmp, XIEPhotomap; + + tmp = GetXIEPhotomap( xp, p, which ); + + /* create a photomap */ + + XIEPhotomap = XieCreatePhotomap(xp->d); + + if ( XIEPhotomap == ( XiePhotomap ) NULL ) + return( ( XiePhotomap ) NULL ); + + photospace = XieCreatePhotospace(xp->d); + + flograph = XieAllocatePhotofloGraph(3); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "GetXIEGeometryPhotomap: XieAllocatePhotofloGraph failed\n" ); + XieDestroyPhotomap( xp->d, XIEPhotomap ); + return( XiePhotomap ) NULL; + } + + XieFloImportPhotomap(&flograph[0], + tmp, + False + ); + + SetCoefficients( xp, p, 1, geo, coeffs ); + + XieFloGeometry(&flograph[1], + 1, + geo->geoWidth, + geo->geoHeight, + coeffs, + constant, + 7, + geo->geoTech, + ( char * ) NULL + ); + + XieFloExportPhotomap(&flograph[2], + 2, /* source phototag number */ + XIEPhotomap, + encode_tech, + encode_params + ); + + flo_id = 1; + flo_notify = True; + XieExecuteImmediate(xp->d, photospace, + flo_id, + flo_notify, + flograph, /* photoflo specification */ + 3 /* number of elements */ + ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo_id, 0, False ); + XieFreePhotofloGraph(flograph,3); + XieDestroyPhotospace(xp->d, photospace); + return XIEPhotomap; +} + +int +GetXIEGeometryWindow( xp, p, w, geo, which ) +XParms xp; +Parms p; +Window w; +GeometryParms *geo; +int which; +{ + XIEimage *image; + XiePhotospace photospace; + int flo_id, flo_notify; + XiePhotoElement *flograph; + float coeffs[ 6 ]; + static XieConstant constant = { 0.0, 0.0, 0.0 }; + XieLut XIELut; + XieProcessDomain domain; + XiePhotomap tmp; + + switch( which ) + { + case 1: + image = p->finfo.image1; + break; + case 2: + image = p->finfo.image2; + break; + case 3: + image = p->finfo.image3; + break; + case 4: + image = p->finfo.image4; + break; + default: + fprintf( stderr, "Invalid image\n" ); + return( 0 ); + }; + + tmp = GetXIEPhotomap( xp, p, which ); + + if ( ( XIELut = CreatePointLut( xp, p, 1 << image->depth[ 0 ], + 1 << xp->screenDepth, False ) ) == ( XieLut ) NULL ) + { + return( 0 ); + } + + photospace = XieCreatePhotospace(xp->d); + + flograph = XieAllocatePhotofloGraph(5); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "GetXIEGeometryPhotomap: XieAllocatePhotofloGraph failed\n" ); + return( 0 ); + } + + XieFloImportPhotomap(&flograph[0], + tmp, + False + ); + + SetCoefficients( xp, p, 1, geo, coeffs ); + + XieFloGeometry(&flograph[1], + 1, + geo->geoWidth, + geo->geoHeight, + coeffs, + constant, + 7, + geo->geoTech, + ( char * ) NULL + ); + + XieFloImportLUT(&flograph[2], XIELut ); + + domain.offset_x = 0; + domain.offset_y = 0; + domain.phototag = 0; + + XieFloPoint(&flograph[3], + 2, + &domain, + 3, + 0x7 + ); + + XieFloExportDrawable(&flograph[4], + 4, /* source phototag number */ + w, + xp->fggc, + 0, + 0 + ); + + flo_id = 1; + flo_notify = True; + XieExecuteImmediate(xp->d, photospace, + flo_id, + flo_notify, + flograph, /* photoflo specification */ + 5 /* number of elements */ + ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo_id, 0, False ); + XieFreePhotofloGraph(flograph,5); + XieDestroyPhotospace(xp->d, photospace); + XieDestroyLUT( xp->d, XIELut ); + return( 1 ); +} + +int +GetXIEPixmap( xp, p, pixmap, which ) +XParms xp; +Parms p; +Pixmap pixmap; +int which; +{ + XIEimage *image; + XiePhotospace photospace; + int flo_elements, flo_id, flo_notify; + XiePhotoElement *flograph; + XieLut XIELut; + XiePhotomap XIEPhotomap; + XieProcessDomain domain; + + XIEPhotomap = GetXIEPhotomap( xp, p, which ); + if ( XIEPhotomap == ( XiePhotomap ) NULL ) + return( 0 ); + + switch( which ) + { + case 1: + image = p->finfo.image1; + break; + case 2: + image = p->finfo.image2; + break; + case 3: + image = p->finfo.image3; + break; + case 4: + image = p->finfo.image4; + break; + default: + image = ( XIEimage * ) NULL; + break; + } + + if ( image == ( XIEimage * ) NULL ) + return( 0 ); + + if ( ( XIELut = CreatePointLut( xp, p, 1 << image->depth[ 0 ], + 1 << xp->screenDepth, False ) ) == ( XieLut ) NULL ) + { + return 0; + } + + photospace = XieCreatePhotospace(xp->d); + + flo_elements = 4; + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "GetXIEPixmap: XieAllocatePhotofloGraph failed\n" ); + if ( XIELut ) + XieDestroyLUT( xp->d, XIELut ); + return( 0 ); + } + + XieFloImportPhotomap(&flograph[0], + XIEPhotomap, + False + ); + + XieFloImportLUT(&flograph[1], XIELut ); + + domain.offset_x = 0; + domain.offset_y = 0; + domain.phototag = 0; + + XieFloPoint(&flograph[2], + 1, + &domain, + 2, + 0x1 + ); + + XieFloExportDrawable(&flograph[flo_elements - 1], + flo_elements - 1, /* source phototag number */ + pixmap, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + flo_id = 1; + flo_notify = True; + XieExecuteImmediate(xp->d, photospace, + flo_id, + flo_notify, + flograph, /* photoflo specification */ + flo_elements /* number of elements */ + ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo_id, 0, False ); + XieFreePhotofloGraph(flograph,flo_elements); + XieDestroyPhotospace( xp->d, photospace ); + if ( XIELut ) + XieDestroyLUT( xp->d, XIELut ); + return 1; +} + +int +GetXIEWindow( xp, p, window, which ) +XParms xp; +Parms p; +Window window; +int which; +{ + XiePhotospace photospace; + int flo_elements, flo_id, flo_notify; + XiePhotoElement *flograph; + XieLut XIELut; + XIEimage *image; + XiePhotomap XIEPhotomap; + XieProcessDomain domain; + + switch( which ) + { + case 1: + image = p->finfo.image1; + break; + case 2: + image = p->finfo.image2; + break; + case 3: + image = p->finfo.image3; + break; + case 4: + image = p->finfo.image4; + break; + default: + image = ( XIEimage * ) NULL; + break; + } + + XIEPhotomap = GetXIEPhotomap( xp, p, which ); + if ( XIEPhotomap == ( XiePhotomap ) NULL ) + return( 0 ); + + if ( ( XIELut = CreatePointLut( xp, p, 1 << image->depth[ 0 ], + 1 << xp->screenDepth, False ) ) == ( XieLut ) NULL ) + { + return 0; + } + + photospace = XieCreatePhotospace(xp->d); + + flo_elements = 4; + + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "GetXIEWindow: XieAllocatePhotofloGraph failed\n" ); + if ( XIELut ) + XieDestroyLUT( xp->d, XIELut ); + return( 0 ); + } + + XieFloImportPhotomap(&flograph[0], + XIEPhotomap, + False + ); + + XieFloImportLUT(&flograph[1], XIELut ); + + domain.offset_x = 0; + domain.offset_y = 0; + domain.phototag = 0; + + XieFloPoint(&flograph[2], + 1, + &domain, + 2, + 0x1 + ); + + XieFloExportDrawable(&flograph[3], + 3, /* source phototag number */ + window, + xp->fggc, + 0, /* x offset in window */ + 0 /* y offset in window */ + ); + + flo_id = 1; + flo_notify = True; + XieExecuteImmediate(xp->d, photospace, + flo_id, + flo_notify, + flograph, /* photoflo specification */ + flo_elements /* number of elements */ + ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo_id, 0, False ); + XieFreePhotofloGraph(flograph,flo_elements); + XieDestroyPhotospace( xp->d, photospace ); + + if ( XIELut ) + XieDestroyLUT( xp->d, XIELut ); + return 1; +} + +int +GetXIEDitheredWindow( xp, p, window, which, level ) +XParms xp; +Parms p; +Window window; +int which; +int level; +{ + XiePhotospace photospace; + int flo_id, flo_notify; + XiePhotoElement *flograph; + char *tech_parms=NULL; + XieLut XIELut; + XieLTriplet levels; + XiePhotomap tmp; + XieProcessDomain domain; + XIEimage *image; + + switch( which ) + { + case 1: + image = p->finfo.image1; + break; + case 2: + image = p->finfo.image2; + break; + case 3: + image = p->finfo.image3; + break; + case 4: + image = p->finfo.image4; + break; + } + + tmp = GetXIEPhotomap( xp, p, which ); + if ( tmp == ( XiePhotomap ) NULL ) + return( 0 ); + + photospace = XieCreatePhotospace(xp->d); + + flograph = XieAllocatePhotofloGraph(5); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "GetXIEDitheredWindow: XieAllocatePhotofloGraph failed\n" ); + return ( 0 ); + } + + if ( ( XIELut = CreatePointLut( xp, p, level, + 1 << xp->screenDepth, False ) ) == ( XieLut ) NULL ) + { + return 0; + } + + XieFloImportPhotomap(&flograph[0], + tmp, + False + ); + + levels[ 0 ] = level; + levels[ 1 ] = 0; + levels[ 2 ] = 0; + + tech_parms = ( char * ) NULL; + + XieFloDither(&flograph[ 1 ], + 1, + 1, + levels, + xieValDitherDefault, + tech_parms + ); + + XieFloImportLUT(&flograph[2], XIELut ); + + domain.offset_x = 0; + domain.offset_y = 0; + domain.phototag = 0; + + XieFloPoint(&flograph[3], + 2, + &domain, + 3, + 0x1 + ); + + XieFloExportDrawable(&flograph[4], + 4, /* source phototag number */ + xp->w, + xp->fggc, + 0, + 0 + ); + + flo_id = 1; + flo_notify = True; + XieExecuteImmediate(xp->d, photospace, + flo_id, + flo_notify, + flograph, /* photoflo specification */ + 5 /* number of elements */ + ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo_id, 0, False ); + XieFreePhotofloGraph(flograph,5); + XieDestroyLUT( xp->d, XIELut ); + return 1; +} + +XiePhotomap +GetXIEDitheredPhotomap( xp, p, which, level ) +XParms xp; +Parms p; +int which; +int level; +{ + XiePhotospace photospace; + int flo_id, flo_notify; + XiePhotoElement *flograph; + XieEncodeTechnique encode_tech=xieValEncodeServerChoice; + char *encode_params=NULL; + XieLTriplet levels; + char *tech_parms=NULL; + XiePhotomap tmp, XIEPhotomap; + + tmp = GetXIEPhotomap( xp, p, which ); + if ( tmp == ( XiePhotomap ) NULL ) + return( ( XiePhotomap ) NULL ); + + /* create a photomap */ + + XIEPhotomap = XieCreatePhotomap(xp->d); + + /* get the data from the client into the photomap */ + + photospace = XieCreatePhotospace(xp->d); + + flograph = XieAllocatePhotofloGraph(3); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "GetXIEDitheredPhotomap: XieAllocatePhotofloGraph failed\n" ); + XieDestroyPhotomap( xp->d, XIEPhotomap ); + return ( XiePhotomap ) NULL; + } + + XieFloImportPhotomap(&flograph[0], + tmp, + False + ); + + levels[ 0 ] = level; + levels[ 1 ] = 0; + levels[ 2 ] = 0; + + tech_parms = ( char * ) NULL; + + XieFloDither(&flograph[ 1 ], + 1, + 1, + levels, + xieValDitherDefault, + tech_parms + ); + + XieFloExportPhotomap(&flograph[2], + 2, /* source phototag number */ + XIEPhotomap, + encode_tech, + encode_params + ); + + flo_id = 1; + flo_notify = True; + XieExecuteImmediate(xp->d, photospace, + flo_id, + flo_notify, + flograph, /* photoflo specification */ + 3 /* number of elements */ + ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo_id, 0, False ); + XieFreePhotofloGraph(flograph,3); + return XIEPhotomap; +} + +XiePhotomap +GetXIEDitheredTriplePhotomap( xp, p, which, ditherTech, threshold, levels ) +XParms xp; +Parms p; +int which; +int ditherTech; +int threshold; +XieLTriplet levels; +{ + XiePhotomap tmp; + XiePhotomap triple; + XiePhotospace photospace; + XiePhotoElement *flograph; + char *dithertech_parms=NULL; + static XieEncodeTechnique encode_tech = xieValEncodeServerChoice; + char *encode_param = ( char * ) NULL; + int flo_id, flo_notify; + + if ( ( triple = GetXIETriplePhotomap( xp, p, which ) ) == + ( XiePhotomap ) NULL ) + { + return( ( XiePhotomap ) NULL ); + } + + /* create a photomap */ + + tmp = XieCreatePhotomap(xp->d); + if ( tmp == ( XiePhotomap ) NULL ) + { + XieDestroyPhotomap( xp->d, triple ); + return( ( XiePhotomap ) NULL ); + } + + /* get the data from the client into the photomap */ + + photospace = XieCreatePhotospace(xp->d); + + flograph = XieAllocatePhotofloGraph(3); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "GetXIEDitheredTriplePhotomap: XieAllocatePhotofloGraph failed\n" ); + XieDestroyPhotomap( xp->d, tmp ); + XieDestroyPhotomap( xp->d, triple ); + return ( XiePhotomap ) NULL; + } + + XieFloImportPhotomap(&flograph[0], triple, False); + + dithertech_parms = ( char * ) NULL; + if ( ditherTech == xieValDitherOrdered ) + { + dithertech_parms = ( char * ) + XieTecDitherOrderedParam(threshold); + if ( dithertech_parms == ( char * ) NULL ) + { + fprintf( stderr, + "Trouble loading dither technique parameters\n" ); + XieFreePhotofloGraph(flograph,3); + XieDestroyPhotospace( xp->d, photospace ); + XieDestroyPhotomap( xp->d, tmp ); + XieDestroyPhotomap( xp->d, triple ); + return( 0 ); + } + } + + XieFloDither( &flograph[ 1 ], + 1, + 0x7, + levels, + ditherTech, + dithertech_parms + ); + + XieFloExportPhotomap(&flograph[2], + 2, /* source phototag number */ + tmp, + encode_tech, + encode_param + ); + + flo_id = 1; + flo_notify = True; + + XieExecuteImmediate(xp->d, photospace, + flo_id, + flo_notify, + flograph, /* photoflo specification */ + 3 /* number of elements */ + ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo_id, 0, False ); + XieFreePhotofloGraph(flograph,3); + XieDestroyPhotospace( xp->d, photospace ); + if ( dithertech_parms ) + XFree( dithertech_parms ); + return tmp; +} + +XiePhotomap +GetXIEConstrainedPhotomap( xp, p, which, cliplevels, cliptype, + in_low, in_high, out_low, out_high ) +XParms xp; +Parms p; +int which; +XieLTriplet cliplevels; +int cliptype; +XieConstant in_low,in_high; +XieLTriplet out_low,out_high; +{ + XiePhotospace photospace; + int flo_id, flo_notify; + XiePhotoElement *flograph; + XieEncodeTechnique encode_tech=xieValEncodeServerChoice; + char *encode_params=NULL; + char *tech_parms=NULL; + XiePhotomap tmp, XIEPhotomap; + + tmp = GetXIEPhotomap( xp, p, which ); + if ( tmp == ( XiePhotomap ) NULL ) + return( ( XiePhotomap ) NULL ); + + /* create a photomap */ + + XIEPhotomap = XieCreatePhotomap(xp->d); + + /* get the data from the client into the photomap */ + + photospace = XieCreatePhotospace(xp->d); + + flograph = XieAllocatePhotofloGraph(3); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "GetXIEConstrainedPhotomap: XieAllocatePhotofloGraph failed\n" ); + XieDestroyPhotomap( xp->d, XIEPhotomap ); + return ( XiePhotomap ) NULL; + } + + XieFloImportPhotomap(&flograph[0], + tmp, + False + ); + + if ( cliptype == xieValConstrainHardClip ) + { + tech_parms = ( char * ) NULL; + } + else + { + tech_parms = ( char * ) XieTecClipScale( in_low, in_high, + out_low, out_high); + if ( tech_parms == ( char * ) NULL ) + { + fprintf( stderr, + "GetXIEConstrainedPhotomap: Trouble loading ClipScale technique parameters\n" ); + fprintf( stderr, "Reverting to HardClip technique\n" ); + cliptype = xieValConstrainHardClip; + } + } + + XieFloConstrain( &flograph[1], + 1, + cliplevels, + cliptype, + tech_parms + ); + + XieFloExportPhotomap(&flograph[2], + 2, + XIEPhotomap, + encode_tech, + encode_params + ); + + flo_id = 1; + flo_notify = True; + XieExecuteImmediate(xp->d, photospace, + flo_id, + flo_notify, + flograph, /* photoflo specification */ + 3 /* number of elements */ + ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo_id, 0, False ); + XieFreePhotofloGraph(flograph,3); + if ( tech_parms ) + XFree( tech_parms ); + return XIEPhotomap; +} + +XiePhotomap +GetXIEConstrainedTriplePhotomap( xp, p, which, cliplevels, cliptype, + in_low, in_high, out_low, out_high ) +XParms xp; +Parms p; +int which; +XieLTriplet cliplevels; +int cliptype; +XieConstant in_low,in_high; +XieLTriplet out_low,out_high; +{ + XiePhotomap tmp, XIEPhotomap; + XiePhotospace photospace; + XiePhotoElement *flograph; + char *tech_parms = ( char * ) NULL; + static XieEncodeTechnique encode_tech = xieValEncodeServerChoice; + char *encode_params = ( char * ) NULL; + int flo_id, flo_notify; + + if ( ( tmp = GetXIETriplePhotomap( xp, p, which ) ) == + ( XiePhotomap ) NULL ) + { + return( ( XiePhotomap ) NULL ); + } + + /* create a photomap */ + + XIEPhotomap = XieCreatePhotomap(xp->d); + if ( XIEPhotomap == ( XiePhotomap ) NULL ) + { + return( ( XiePhotomap ) NULL ); + } + + /* get the data from the client into the photomap */ + + photospace = XieCreatePhotospace(xp->d); + + flograph = XieAllocatePhotofloGraph(3); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "GetXIEConstrainedTriplePhotomap: XieAllocatePhotofloGraph failed\n" ); + XieDestroyPhotomap( xp->d, XIEPhotomap ); + return ( XiePhotomap ) NULL; + } + + XieFloImportPhotomap(&flograph[0], tmp, False); + + if ( cliptype == xieValConstrainHardClip ) + { + tech_parms = ( char * ) NULL; + } + else + { + tech_parms = ( char * ) XieTecClipScale( in_low, in_high, + out_low, out_high); + if ( tech_parms == ( char * ) NULL ) + { + fprintf( stderr, + "GetXIEConstrainedPhotomap: Trouble loading ClipScale technique parameters\n" ); + fprintf( stderr, "Reverting to HardClip technique\n" ); + cliptype = xieValConstrainHardClip; + } + } + + XieFloConstrain( &flograph[1], + 1, + cliplevels, + cliptype, + tech_parms + ); + + XieFloExportPhotomap(&flograph[2], + 2, /* source phototag number */ + XIEPhotomap, + encode_tech, + encode_params + ); + + flo_id = 1; + flo_notify = True; + + XieExecuteImmediate(xp->d, photospace, + flo_id, + flo_notify, + flograph, /* photoflo specification */ + 3 /* number of elements */ + ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo_id, 0, False ); + XieFreePhotofloGraph(flograph,3); + XieDestroyPhotospace( xp->d, photospace ); + if ( tech_parms ) + XFree( tech_parms ); + return XIEPhotomap; +} + +XiePhotomap +GetXIEConstrainedGeometryTriplePhotomap( xp, p, which, cliplevels, cliptype, + in_low, in_high, out_low, out_high, geo ) +XParms xp; +Parms p; +int which; +XieLTriplet cliplevels; +int cliptype; +XieConstant in_low,in_high; +XieLTriplet out_low,out_high; +GeometryParms *geo; +{ + XiePhotomap tmp, XIEPhotomap; + XiePhotospace photospace; + XiePhotoElement *flograph; + char *tech_parms = ( char * ) NULL; + static XieEncodeTechnique encode_tech = xieValEncodeServerChoice; + char *encode_params = ( char * ) NULL; + int flo_id, flo_notify; + float coeffs[ 6 ]; + static XieConstant constant = { 0.0, 0.0, 0.0 }; + + if ( ( tmp = GetXIETriplePhotomap( xp, p, which ) ) == + ( XiePhotomap ) NULL ) + { + return( ( XiePhotomap ) NULL ); + } + + /* create a photomap */ + + XIEPhotomap = XieCreatePhotomap(xp->d); + if ( XIEPhotomap == ( XiePhotomap ) NULL ) + { + return( ( XiePhotomap ) NULL ); + } + + /* get the data from the client into the photomap */ + + photospace = XieCreatePhotospace(xp->d); + + flograph = XieAllocatePhotofloGraph(4); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "GetXIEConstrainedTriplePhotomap: XieAllocatePhotofloGraph failed\n" ); + XieDestroyPhotomap( xp->d, XIEPhotomap ); + return ( XiePhotomap ) NULL; + } + + XieFloImportPhotomap(&flograph[0], tmp, False); + + SetCoefficients( xp, p, 1, geo, coeffs ); + + XieFloGeometry(&flograph[1], + 1, + geo->geoWidth, + geo->geoHeight, + coeffs, + constant, + 7, + geo->geoTech, + ( char * ) NULL + ); + + if ( cliptype == xieValConstrainHardClip ) + { + tech_parms = ( char * ) NULL; + } + else + { + tech_parms = ( char * ) XieTecClipScale( in_low, in_high, + out_low, out_high); + if ( tech_parms == ( char * ) NULL ) + { + fprintf( stderr, + "GetXIEConstrainedPhotomap: Trouble loading ClipScale technique parameters\n" ); + fprintf( stderr, "Reverting to HardClip technique\n" ); + cliptype = xieValConstrainHardClip; + } + } + + XieFloConstrain( &flograph[2], + 2, + cliplevels, + cliptype, + tech_parms + ); + + XieFloExportPhotomap(&flograph[3], + 3, /* source phototag number */ + XIEPhotomap, + encode_tech, + encode_params + ); + + flo_id = 1; + flo_notify = True; + + XieExecuteImmediate(xp->d, photospace, + flo_id, + flo_notify, + flograph, /* photoflo specification */ + 4 /* number of elements */ + ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo_id, 0, False ); + XieFreePhotofloGraph(flograph,4); + XieDestroyPhotospace( xp->d, photospace ); + if ( tech_parms ) + XFree( tech_parms ); + return XIEPhotomap; +} + +XiePhotomap +GetXIEGeometryTriplePhotomap( xp, p, which, geo ) +XParms xp; +Parms p; +int which; +GeometryParms *geo; +{ + XiePhotomap tmp, XIEPhotomap; + XiePhotospace photospace; + XiePhotoElement *flograph; + char *tech_parms = ( char * ) NULL; + static XieEncodeTechnique encode_tech = xieValEncodeServerChoice; + char *encode_params = ( char * ) NULL; + int flo_id, flo_notify; + float coeffs[ 6 ]; + static XieConstant constant = { 0.0, 0.0, 0.0 }; + + if ( ( tmp = GetXIETriplePhotomap( xp, p, which ) ) == + ( XiePhotomap ) NULL ) + { + return( ( XiePhotomap ) NULL ); + } + + /* create a photomap */ + + XIEPhotomap = XieCreatePhotomap(xp->d); + if ( XIEPhotomap == ( XiePhotomap ) NULL ) + { + return( ( XiePhotomap ) NULL ); + } + + /* get the data from the client into the photomap */ + + photospace = XieCreatePhotospace(xp->d); + + flograph = XieAllocatePhotofloGraph(3); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "GetXIEGeometryTriplePhotomap: XieAllocatePhotofloGraph failed\n" ); + XieDestroyPhotomap( xp->d, XIEPhotomap ); + return ( XiePhotomap ) NULL; + } + + XieFloImportPhotomap(&flograph[0], tmp, False); + + SetCoefficients( xp, p, 1, geo, coeffs ); + + XieFloGeometry(&flograph[1], + 1, + geo->geoWidth, + geo->geoHeight, + coeffs, + constant, + 7, + geo->geoTech, + ( char * ) NULL + ); + + XieFloExportPhotomap(&flograph[2], + 2, /* source phototag number */ + XIEPhotomap, + encode_tech, + encode_params + ); + + flo_id = 1; + flo_notify = True; + + XieExecuteImmediate(xp->d, photospace, + flo_id, + flo_notify, + flograph, /* photoflo specification */ + 3 /* number of elements */ + ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo_id, 0, False ); + XieFreePhotofloGraph(flograph,3); + XieDestroyPhotospace( xp->d, photospace ); + if ( tech_parms ) + XFree( tech_parms ); + return XIEPhotomap; +} + +int +GetXIEDitheredTripleWindow( xp, p, w, which, ditherTech, threshold, levels ) +XParms xp; +Parms p; +Window w; +int which; +int ditherTech; +int threshold; +XieLTriplet levels; +{ + XiePhotomap ditheredPhoto; + XiePhotospace photospace; + XiePhotoElement *flograph; + int flo_id, flo_notify; + XieColorList clist; + XWindowAttributes xwa; + XieColorAllocAllParam *color_parm; + int flo_elements, idx; + + flo_elements = 3; + color_parm = ( XieColorAllocAllParam * ) NULL; + clist = ( XieColorList ) NULL; + color_parm = XieTecColorAllocAll( 123 ); + if ( color_parm == ( XieColorAllocAllParam * ) NULL ) + { + return( 0 ); + } + + if ( ( clist = XieCreateColorList( xp->d ) ) == ( XieColorList ) NULL ) + { + if ( color_parm ) + XFree( color_parm ); + return( 0 ); + } + + if ( ( ditheredPhoto = GetXIEDitheredTriplePhotomap( xp, p, which, + ditherTech, threshold, levels ) ) == ( XiePhotomap ) NULL ) + { + if ( clist ) + XieDestroyColorList( xp->d, clist ); + if ( color_parm ) + XFree( color_parm ); + return( 0 ); + } + + photospace = XieCreatePhotospace(xp->d); + + flograph = XieAllocatePhotofloGraph(flo_elements); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "GetXIEDitheredTripleWindow: XieAllocatePhotofloGraph failed\n" ); + if ( color_parm ) + XFree( color_parm ); + if ( clist ) + XieDestroyColorList( xp->d, clist ); + return( 0 ); + } + + idx = 0; + XieFloImportPhotomap(&flograph[idx], ditheredPhoto, False); + idx++; + + XGetWindowAttributes( xp->d, xp->w, &xwa ); + XieFloConvertToIndex(&flograph[idx], + idx, + xwa.colormap, + clist, + False, + xieValColorAllocAll, + (char *)color_parm + ); + idx++; + + XieFloExportDrawable(&flograph[idx], + 2, /* source phototag number */ + xp->w, + xp->fggc, + 0, + 0 + ); + + flo_id = 1; + flo_notify = True; + + XieExecuteImmediate(xp->d, photospace, + flo_id, + flo_notify, + flograph, /* photoflo specification */ + flo_elements /* number of elements */ + ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo_id, 0, False ); + XieFreePhotofloGraph(flograph,3); + XieDestroyPhotospace( xp->d, photospace ); + + if ( clist ) + XieDestroyColorList( xp->d, clist ); + if ( color_parm ) + XFree( color_parm ); + return( 1 ); +} + +int +GetXIEDitheredStdTripleWindow( xp, p, w, which, ditherTech, threshold, levels, + stdCmap ) +XParms xp; +Parms p; +Window w; +int which; +int ditherTech; +int threshold; +XieLTriplet levels; +XStandardColormap *stdCmap; +{ + XiePhotomap ditheredPhoto; + XiePhotospace photospace; + XiePhotoElement *flograph; + int flo_id, flo_notify; + XieConstant c1; + float bias; + + if ( ( ditheredPhoto = GetXIEDitheredTriplePhotomap( xp, p, which, + ditherTech, threshold, levels ) ) == ( XiePhotomap ) NULL ) + { + return( 0 ); + } + + photospace = XieCreatePhotospace(xp->d); + + flograph = XieAllocatePhotofloGraph(3); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf( stderr, "GetXIEDitheredStdTripleWindow: XieAllocatePhotofloGraph failed\n" ); + return( 0 ); + } + + XieFloImportPhotomap(&flograph[0], ditheredPhoto, False); + + c1[ 0 ] = stdCmap->red_mult; + c1[ 1 ] = stdCmap->green_mult; + c1[ 2 ] = stdCmap->blue_mult; + bias = ( float ) stdCmap->base_pixel; + + XieFloBandExtract( &flograph[1], 1, 1 << xp->vinfo.depth, bias, c1 ); + + XieFloExportDrawable(&flograph[2], + 2, /* source phototag number */ + xp->w, + xp->fggc, + 0, + 0 + ); + + flo_id = 1; + flo_notify = True; + + XieExecuteImmediate(xp->d, photospace, + flo_id, + flo_notify, + flograph, /* photoflo specification */ + 3 /* number of elements */ + ); + XSync( xp->d, 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo_id, 0, False ); + XieFreePhotofloGraph(flograph,3); + XieDestroyPhotospace( xp->d, photospace ); + XieDestroyPhotomap( xp->d, ditheredPhoto ); + return( 1 ); +} + +int +GetFileSize( path ) +char *path; +{ + int size; + struct stat _Stat_Buffer; +#define file_size(path) ( stat(path,&_Stat_Buffer)== 0 ? \ + _Stat_Buffer.st_size : -1) + + /* open the file */ + + if ( ( size = file_size( path ) ) < 0 ) + { + fprintf( stderr, "Couldn't stat %s\n", path ); + return 0; + } + return( size ); +} + +int +GetImageData( xp, p, which ) +XParms xp; +Parms p; +int which; +{ + int fd; + int *size; + XIEimage *image = ( XIEimage * ) NULL; + char *name; + char buf[ 64 ]; + + if ( which == 1 ) + { + image = p->finfo.image1; + } + else if ( which == 2 ) + { + image = p->finfo.image2; + } + else if ( which == 3 ) + { + image = p->finfo.image3; + } + else if ( which == 4 ) + { + image = p->finfo.image4; + } + + if (!image) + return( 0 ); + + if ( p->buffer_size <= 0 ) + { + fprintf( stderr, "buffer_size is invalid\n" ); + return 0; + } + + size = &image->fsize; + name = image->fname; + sprintf( buf, "%s/%s", imagepath, name ); + + *size = GetFileSize( buf ); + + if ( *size == 0 ) + return( 0 ); + + if ( ( fd = open( buf, O_RDONLY|O_BINARY ) ) == -1 ) + { + fprintf( stderr, "Couldn't open %s\n", buf ); + goto out; + } + + /* allocate the data buffer */ + + if ( image->data == ( char * ) NULL ) + { + if ( ( image->data = + (char *)malloc( *size ) ) == ( char * ) NULL ) + { + fprintf( stderr, "Couldn't allocate buffer\n" ); + goto out; + } + } + + /* read the data */ + + if ( read( fd, image->data, *size ) != *size ) + { + fprintf( stderr, "Couldn't read data\n" ); + goto out; + } + + /* close the file */ + + close( fd ); + return( 1 ); + +out: if ( fd ) + { + close( fd ); + } + return 0; +} + +XieLut +GetXIELut( xp, p, lut, lutSize, lutLevels ) +XParms xp; +Parms p; +unsigned char *lut; +int lutSize; +int lutLevels; +{ + XiePhotospace photospace; + int flo_id, flo_notify; + XiePhotoElement *flograph; + XieDataClass cclass; + XieOrientation band_order; + XieLTriplet length, levels; + Bool merge; + XieLTriplet start; + XieLut tmp; + + /* create a LUT for starters */ + + tmp = XieCreateLUT(xp->d); + + photospace = XieCreatePhotospace(xp->d); + + flograph = XieAllocatePhotofloGraph(2); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf(stderr,"GetXIELut: XieAllocatePhotofloGraph failed\n"); + XieDestroyLUT( xp->d, tmp ); + return ( XieLut ) NULL; + } + + cclass = xieValSingleBand; + band_order = xieValMSFirst; + length[ 0 ] = lutSize; + length[ 1 ] = 0; + length[ 2 ] = 0; + levels[ 0 ] = lutLevels; + levels[ 1 ] = 0; + levels[ 2 ] = 0; + + XieFloImportClientLUT(&flograph[0], + cclass, + band_order, + length, + levels + ); + + merge = False; + start[ 0 ] = 0; + start[ 1 ] = 0; + start[ 2 ] = 0; + + XieFloExportLUT(&flograph[1], + 1, /* source phototag number */ + tmp, + merge, + start + ); + + flo_id = 1; + flo_notify = True; + XieExecuteImmediate(xp->d, photospace, + flo_id, + flo_notify, + flograph, /* photoflo specification */ + 2 /* number of elements */ + ); + XSync( xp->d, 0 ); + PumpTheClientData( xp, p, flo_id, photospace, 1, (char *)lut, lutSize, + 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo_id, 0, False ); + XieFreePhotofloGraph(flograph,2); + return tmp; +} + +XieRoi +GetXIERoi( xp, p, rects, rectsSize ) +XParms xp; +Parms p; +XieRectangle *rects; +int rectsSize; +{ + XiePhotospace photospace; + int flo_id, flo_notify; + XiePhotoElement *flograph; + XieRoi tmp; + + /* create an ROI */ + + tmp = XieCreateROI(xp->d); + + photospace = XieCreatePhotospace(xp->d); + + flograph = XieAllocatePhotofloGraph(2); + if ( flograph == ( XiePhotoElement * ) NULL ) + { + fprintf(stderr,"GetXIERoi: XieAllocatePhotofloGraph failed\n"); + XieDestroyROI( xp->d, tmp ); + return ( XieRoi ) NULL; + } + + XieFloImportClientROI(&flograph[0], + rectsSize + ); + + XieFloExportROI(&flograph[1], + 1, /* source phototag number */ + tmp + ); + + flo_id = 1; + flo_notify = True; + XieExecuteImmediate(xp->d, photospace, + flo_id, + flo_notify, + flograph, /* photoflo specification */ + 2 /* number of elements */ + ); + XSync( xp->d, 0 ); + PumpTheClientData( xp, p, flo_id, photospace, 1, (char *)rects, + rectsSize * sizeof( XieRectangle ), 0 ); + WaitForXIEEvent( xp, xieEvnNoPhotofloDone, flo_id, 0, False ); + + XieFreePhotofloGraph(flograph,2); + return tmp; +} + +int +EventOrErrorValid( testcp ) +unsigned short testcp; +{ + if ( IsEvent( testcp ) && runEvents == False ) + return( 0 ); + else if ( IsError( testcp ) && runErrors == False ) + return( 0 ); + return( 1 ); +} + +int +IsDISServer() +{ + return( IsDIS( capabilities ) ); +} + +int +ServerIsCapable( testcp ) +unsigned short testcp; +{ + if ( IsFull( testcp ) && IsDIS( capabilities ) ) + return( 0 ); + return( 1 ); +} + +Bool +TechniqueSupported( xp, group, tech ) +XParms xp; +XieTechniqueGroup group; +unsigned int tech; +{ + XieTechnique *techVector; + int numTech, i; + Bool gotIt; + + gotIt = False; + if ( !XieQueryTechniques( xp->d, group, &numTech, &techVector ) ) + { + fprintf( stderr, + "TechniqueSupported: XieQueryTechniques failed\n" ); + } + else + { + /* search for it */ + + for ( i = 0; i < numTech; i++ ) + { + if ( tech == techVector[ i ].number ) + { + gotIt = True; + } + if ( techVector[ i ].name ) + XFree( techVector[ i ].name ); + } + if ( techVector ) + XFree( techVector ); + } + + return( gotIt ); +} + +/* list all of the techniques supported. this isn't used by xieperf, but was + used to validate TechniqueSupported() */ + +struct _tech { + char *name; + unsigned int tech; +}; + +struct _class { + char *name; + Bool full; + XieTechniqueGroup group; + struct _tech *techs; + int n; +}; + +static struct _tech ColorAllocTechs[] = { + { "ColorAllocAll", xieValColorAllocAll }, + { "ColorAllocMatch", xieValColorAllocMatch }, + { "ColorAllocRequantize", xieValColorAllocRequantize } }; + +static struct _tech ConstrainTechs[] = { + { "ConstrainClipScale", xieValConstrainClipScale }, + { "ConstrainHardClip", xieValConstrainHardClip } }; + +static struct _tech ConvolveTechs[] = { + { "ConvolveConstant", xieValConvolveConstant }, + { "ConvolveReplicate", xieValConvolveReplicate } }; + +static struct _tech DecodeTechs[] = { + { "DecodeUncompressedSingle", xieValDecodeUncompressedSingle }, + { "DecodeUncompressedTriple", xieValDecodeUncompressedTriple }, + { "DecodeG31D", xieValDecodeG31D }, + { "DecodeG32D", xieValDecodeG32D }, + { "DecodeG42D", xieValDecodeG42D }, + { "DecodeJPEGBaseline", xieValDecodeJPEGBaseline }, + { "DecodeJPEGLossless", xieValDecodeJPEGLossless }, + { "DecodeTIFF2", xieValDecodeTIFF2 }, + { "DecodeTIFFPackBits", xieValDecodeTIFFPackBits } }; + +static struct _tech DitherTechs[] = { + { "DitherErrorDiffusion", xieValDitherErrorDiffusion }, + { "DitherOrdered", xieValDitherOrdered } }; + +static struct _tech ColorspaceTechs[] = { + { "CIELab", xieValCIELabToRGB }, + { "CIEXYZ", xieValCIEXYZToRGB }, + { "YCbCr", xieValYCbCrToRGB }, + { "YCC", xieValYCCToRGB } }; + +static struct _tech EncodeTechs[] = { + { "EncodeUncompressedSingle", xieValEncodeUncompressedSingle }, + { "EncodeUncompressedTriple", xieValEncodeUncompressedTriple }, + { "EncodeG31D", xieValEncodeG31D }, + { "EncodeG32D", xieValEncodeG32D }, + { "EncodeG42D", xieValEncodeG42D }, + { "EncodeJPEGBaseline", xieValEncodeJPEGBaseline }, + { "EncodeJPEGLossless", xieValEncodeJPEGLossless }, + { "EncodeTIFF2", xieValEncodeTIFF2 }, + { "EncodeTIFFPackBits", xieValEncodeTIFFPackBits } }; + +static struct _tech GeometryTechs[] = { + { "GeometryAntialias", xieValGeomAntialias }, + { "GeometryAntialiasByArea", xieValGeomAntialiasByArea }, + { "GeometryAntialiasByLowpass", xieValGeomAntialiasByLPF }, + { "GeometryBilinearInterpolation", xieValGeomBilinearInterp }, + { "GeometryGaussian", xieValGeomGaussian }, + { "GeometryNearestNeighbor", xieValGeomNearestNeighbor } }; + +static struct _tech GamutTechs[] = { + { "GamutNone", xieValGamutNone }, + { "GamutClipRGB", xieValGamutClipRGB } }; + +static struct _tech HistogramTechs[] = { + { "HistogramFlat", xieValHistogramFlat }, + { "HistogramGaussian", xieValHistogramGaussian }, + { "HistogramHyperbolic", xieValHistogramHyperbolic } }; + +static struct _tech WhiteAdjustTechs[] = { + { "WhiteAdjustNone", xieValWhiteAdjustNone }, + { "WhiteAdjustCIELabShift", xieValWhiteAdjustCIELabShift } }; + +static struct _class classes[] = { + { "ColorAlloc", True, xieValColorAlloc, ColorAllocTechs, + sizeof( ColorAllocTechs ) / sizeof( struct _tech ) }, + { "Constrain", True, xieValConstrain, ConstrainTechs, + sizeof( ConstrainTechs ) / sizeof( struct _tech ) }, + { "Convolve", True, xieValConvolve, ConvolveTechs, + sizeof( ConvolveTechs ) / sizeof( struct _tech ) }, + { "ConvertFromRGB", True, xieValConvertFromRGB, ColorspaceTechs, + sizeof( ColorspaceTechs ) / sizeof( struct _tech ) }, + { "ConvertToRGB", True, xieValConvertToRGB, ColorspaceTechs, + sizeof( ColorspaceTechs ) / sizeof( struct _tech ) }, + { "Decode", False, xieValDecode, DecodeTechs, + sizeof( DecodeTechs ) / sizeof( struct _tech ) }, + { "Dither", True, xieValDither, DitherTechs, + sizeof( DitherTechs ) / sizeof( struct _tech ) }, + { "Encode", False, xieValEncode, EncodeTechs, + sizeof( EncodeTechs ) / sizeof( struct _tech ) }, + { "Gamut", True, xieValGamut, GamutTechs, + sizeof( GamutTechs ) / sizeof( struct _tech ) }, + { "Geometry", False, xieValGeometry, GeometryTechs, + sizeof( GeometryTechs ) / sizeof( struct _tech ) }, + { "Histogram", True, xieValHistogram, HistogramTechs, + sizeof( HistogramTechs ) / sizeof( struct _tech ) }, + { "WhiteAdjust", True, xieValWhiteAdjust, WhiteAdjustTechs, + sizeof( WhiteAdjustTechs ) / sizeof( struct _tech ) } }; + +int +ListAllTechs( xp ) +XParms xp; +{ + int i, j; + + for ( i = 0; i < sizeof( classes ) / sizeof( struct _class ); i++ ) + { + printf( "Class name: %s\n", classes[ i ].name ); + for ( j = 0; j < classes[ i ].n; j++ ) + { + printf( "\tTechnique %s:", classes[ i ].techs[ j ].name ); + if (classes[ i ].full==True && IsDIS( capabilities )) + { + printf( " is not supported\n" ); + } + else if ( TechniqueSupported( xp, classes[ i ].group, + classes[ i ].techs[ j ].tech ) == True ) + { + printf( " is supported\n" ); + } + else + { + printf( " is not supported\n" ); + } + } + } + printf( "\n" ); +} + +void +FillHisto( histos, size, levels ) +XieHistogramData histos[]; +int size; +int levels; +{ + int i; + int sy; + + sy = levels / size; + for ( i = 0; i < size; i++ ) + { + histos[ i ].value = i + 40; + histos[ i ].count = i * sy; + } +} + +void +DrawHistogram( xp, w, histos, size, levels ) +XParms xp; +Window w; +XieHistogramData histos[]; +int size; +unsigned long levels; +{ + unsigned long maxcount; + int i; + float sx, sy; + XRectangle *rects; + short yadd, xadd; + char buf[ 32 ]; + + maxcount = 0; + levels = 0; + for ( i = 0; i < size; i++ ) + { + if ( histos[ i ].count > maxcount ) + maxcount = histos[ i ].count; + if ( histos[ i ].value > levels ) + levels = histos[ i ].value; + } + + if ( maxcount == 0 ) + return; + + xadd = ( short ) ( ( float ) MONWIDTH * 0.15 ); + yadd = xadd; + + sx = ( float ) ( MONWIDTH - xadd ) / ( float ) ( levels + 1 ); + sy = ( float ) ( MONHEIGHT - yadd ) / ( float ) maxcount; + + XClearWindow( xp->d, w ); + + /* label x */ + + XDrawImageString( xp->d, w, tgc, xadd, + MONHEIGHT - 3, "0", 1 ); + sprintf( buf, "%d", levels ); + XDrawImageString( xp->d, w, tgc, MONWIDTH - + strlen( buf ) * 14, MONHEIGHT - 3, buf, strlen( buf ) ); + + /* label y */ + + sprintf( buf, "%d", maxcount ); + XDrawImageString( xp->d, w, tgc, 3, + 20, buf, strlen( buf ) ); + XDrawImageString( xp->d, w, tgc, 3, + MONHEIGHT - yadd, "0", 1 ); + + /* y axis */ + + XDrawLine( xp->d, w, tgc, xadd, MONHEIGHT - yadd, + xadd, 0 ); + + /* x axis */ + + XDrawLine( xp->d, w, tgc, xadd, MONHEIGHT - yadd, + MONWIDTH, MONHEIGHT - yadd ); + + rects = ( XRectangle * ) malloc( sizeof( XRectangle ) * size ); + if ( rects == ( XRectangle * ) NULL ) + return; + + /* create the rectangles */ + + for ( i = 0; i < size; i++ ) + { + rects[ i ].width = ( short ) ceil( sx ); + rects[ i ].height = ( short ) ( sy * histos[ i ].count ); + rects[ i ].x = xadd + ( short ) ( sx * histos[ i ].value ); + rects[ i ].y = ( short ) MONHEIGHT - yadd - rects[ i ].height; + } + + /* draw it */ + + XFillRectangles( xp->d, w, tgc, rects, size ); + XSync( xp->d, 0 ); + + free( rects ); +} + +int +GetStandardColormap( xp, stdColormap, atom ) +XParms xp; +XStandardColormap *stdColormap; +Atom atom; +{ + int status, i; + int numberColormaps; + XStandardColormap *colormapsReturned; + VisualID visualId; + + visualId = XVisualIDFromVisual( xp->vinfo.visual ); + if ( !XGetRGBColormaps(xp->d, RootWindow(xp->d, DefaultScreen( xp->d )), + &colormapsReturned, &numberColormaps, atom ) ) + { + status = XmuLookupStandardColormap( xp->d, + DefaultScreen( xp->d ), + visualId, + xp->vinfo.depth, + atom, + True, /* Don't replace existing cmap */ + True ); + if ( status != 0 ) + { + status = XGetRGBColormaps( xp->d, + RootWindow( xp->d, DefaultScreen( xp->d ) ), + &colormapsReturned, + &numberColormaps, + atom ); + } + } + else + status = 1; + if ( status != 0 ) + { + for ( i = 0; i < numberColormaps; i++ ) + { + if (visualId == colormapsReturned[i].visualid) + { + memcpy( ( char * ) stdColormap, + ( char * ) &colormapsReturned[ i ], + sizeof( XStandardColormap ) ); + XFree( colormapsReturned ); + if ( atom == XA_RGB_BEST_MAP ) + RGB_BESTStandardColormapObtained = True; + return( True ); + } + } + XFree( colormapsReturned ); + } + return( False ); +} + +#define SETLUT if ( lutCellSize == sizeof( char ) ) {\ + *( ( unsigned char * ) ptr ) = val; \ + ptr+=sizeof(char); } \ +else if ( lutCellSize == sizeof( short ) ) { \ + *( ( unsigned short * ) ptr ) = val; \ + ptr+=sizeof(short); } \ +else if ( lutCellSize == sizeof( int ) ) { \ + *( ( unsigned int * ) ptr ) = val; \ + ptr+=sizeof(int); } \ +else { \ + *( ( unsigned long * ) ptr) = val; \ + ptr+=sizeof(long); } + +#define SETTDLUT if ( lutCellSize == sizeof( char ) ) {\ + *( ( unsigned char * ) ptr ) = val * lowbit( DCRedMask ); \ + *( ( unsigned char * ) ptr ) |= val * lowbit( DCGreenMask ); \ + *( ( unsigned char * ) ptr ) |= val * lowbit( DCBlueMask ); \ + ptr+=sizeof(char); } \ +else if ( lutCellSize == sizeof( short ) ) { \ + *( ( unsigned short * ) ptr ) = val * lowbit( DCRedMask ); \ + *( ( unsigned short * ) ptr ) |= val * lowbit( DCGreenMask ); \ + *( ( unsigned short * ) ptr ) |= val * lowbit( DCBlueMask ); \ + ptr+=sizeof(short); } \ +else if ( lutCellSize == sizeof( int ) ) { \ + *( ( unsigned int * ) ptr ) = val * lowbit( DCRedMask ); \ + *( ( unsigned int * ) ptr ) |= val * lowbit( DCGreenMask ); \ + *( ( unsigned int * ) ptr ) |= val * lowbit( DCBlueMask ); \ + ptr+=sizeof(int); } \ +else { \ + *( ( unsigned long * ) ptr ) = val * lowbit( DCRedMask ); \ + *( ( unsigned long * ) ptr ) |= val * lowbit( DCGreenMask ); \ + *( ( unsigned long * ) ptr ) |= val * lowbit( DCBlueMask ); \ + ptr+=sizeof(long); } + +int +DepthFromLevels( levels ) +int levels; +{ + unsigned int mask; + int bp; + + bp = ( sizeof( int ) << 3 ) - 1; + mask = 1 << bp; + while ( mask && !( mask & levels ) ) + { + bp--; + mask = ( ( mask >> 1 ) & ~mask ); + } + return( bp ); +} + +int +TDLutCellSize( xp ) +XParms xp; +{ + int bp, max; + + max = 0; + bp = DepthFromLevels( DCRedMask ); + if ( bp > max ) + max = bp; + bp = DepthFromLevels( DCGreenMask ); + if ( bp > max ) + max = bp; + bp = DepthFromLevels( DCBlueMask ); + if ( bp > max ) + max = bp; + max++; + return( LutCellSize( max ) ); +} + +int +LutCellSize( depth ) +int depth; +{ + if ( depth >= 0 && depth <= 7 ) + depth = 8; + else if ( depth > 8 && depth <= 15 ) + depth = 16; + else if ( depth > 16 && depth <= 31 ) + depth = 32; + return( ( depth + 7 ) >> 3 ); +} + +XieLut +CreatePointLut( xp, p, inlevels, outlevels, computeLutFromLevels ) +XParms xp; +Parms p; +int inlevels; +int outlevels; +Bool computeLutFromLevels; +{ + unsigned char *lut, *ptr; + int lutSize; + int lutCellSize; + int i, j, val, cclass; + int step, increment; + int outdepth; + XieLut retval; + +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xp->vinfo.c_class; +#else + cclass = xp->vinfo.class; +#endif + + lutSize = inlevels; + outdepth = DepthFromLevels( outlevels ); + if ( ( cclass == DirectColor || cclass == TrueColor ) && + computeLutFromLevels == False ) + { + lutCellSize = TDLutCellSize( xp ); + } + else + { + lutCellSize = LutCellSize( outdepth ); + } + + if ( lutCellSize != sizeof( char ) && lutCellSize != sizeof( short ) + && lutCellSize != sizeof( int ) && lutCellSize != sizeof( long ) ) + { + fprintf( stderr, "CreatePointLut: cell size not supported\n" ); + return( ( XieLut ) NULL ); + } + + if ( inlevels == outlevels ) + { + increment = 1; + step = 1; + } + else if ( inlevels > outlevels ) + { + increment = 1; + step = inlevels / outlevels; + } + else /* outlevels > inlevels */ + { + increment = (outlevels - 1) / (inlevels - 1); + step = 1; + } + + lut = (unsigned char *) malloc( lutSize * lutCellSize ); + ptr = lut; + if ( lut == ( unsigned char * ) NULL ) + { + fprintf( stderr, "CreatePointLut: malloc failed allocating lut\n" ); + return( ( XieLut ) NULL ); + } + + /* initialize the lut */ + + val = 0; + j = 0; + for ( i = 0; i < lutSize; i++ ) + { + if ( cclass != DirectColor && cclass != TrueColor ) + SETLUT + else + SETTDLUT + j++; + if ( j == step ) + { + j = 0; + val += increment; + } + } + + if ( ( cclass == DirectColor || cclass == TrueColor ) && + computeLutFromLevels == False ) + { + outlevels = TrueOrDirectLevels( xp ); + } + + retval = GetXIELut( xp, p, lut, lutSize * lutCellSize, + outlevels ); + free( lut ); + return( retval ); +} + +int +TrueOrDirectLevels( xp ) +XParms xp; +{ + int depth = xp->screenDepth; + + if ( rbits != gbits || gbits != bbits ) + { + return( 1 << ( rbits + gbits + bbits ) ); + } + else + { + return( 1 << depth ); + } +} + +int +TripleTrueOrDirectLevels( xp ) +XParms xp; +{ + int depth = xp->screenDepth; + + if ( rbits != gbits || gbits != bbits ) + { + return( 1 << depth ); + } + else + { + return( xp->vinfo.colormap_size ); + } +} + +/* generate red_mult, green_mult, and blue_mult, and red_max, green_max, + blue_max, like in StandardColormaps */ + +int +CreateStandardColormap( xp, stdCmap, atom ) +XParms xp; +XStandardColormap *stdCmap; +int atom; +{ + XWindowAttributes xwa; + unsigned long mask; + int i, cclass; + int r_mask, g_mask, b_mask; + +#if defined(__cplusplus) || defined(c_plusplus) + cclass = xp->vinfo.c_class; +#else + cclass = xp->vinfo.class; +#endif + + XGetWindowAttributes( xp->d, xp->w, &xwa ); + stdCmap->colormap = xwa.colormap; + + if ( IsTrueColorOrDirectColor( cclass ) ) + { + stdCmap->red_max = ( 1 << rbits ) - 1; + stdCmap->green_max = ( 1 << gbits ) - 1; + stdCmap->blue_max = ( 1 << bbits ) - 1; + } + else + { + XmuGetColormapAllocation(xp->vinfo, atom, + &stdCmap->red_max, + &stdCmap->green_max, + &stdCmap->blue_max); + } + + r_mask = xp->vinfo.red_mask; + g_mask = xp->vinfo.green_mask; + b_mask = xp->vinfo.blue_mask; + + if ( r_mask ) + { + mask = 1; i = 0; + while ( !( mask & r_mask ) ) { i+=1; mask = mask << 1; } + stdCmap->red_mult = 1 << i; + } + else + { + stdCmap->red_mult = 1; + } + + if ( g_mask ) + { + mask = 1; i = 0; + while ( !( mask & g_mask ) ) { i+=1; mask = mask << 1; } + stdCmap->green_mult = 1 << i; + } + else + { + stdCmap->green_mult = 1; + } + + if ( b_mask ) + { + mask = 1; i = 0; + while ( !( mask & b_mask ) ) { i+=1; mask = mask << 1; } + stdCmap->blue_mult = 1 << i; + } + else + { + stdCmap->blue_mult = 1; + } + + return( 1 ); +} + +XiePhotomap +GetControlPlane( xp, which ) +XParms xp; +int which; +{ + ParmRec p; + XiePhotomap ControlPlane; + + ControlPlane = ( XiePhotomap ) NULL; + p.finfo.image1 = ( XIEimage * ) GetImageStruct( which ); + p.buffer_size = 2048; + if ( p.finfo.image1 != ( XIEimage * ) NULL ) + { + ControlPlane = GetXIEPointPhotomap( xp, &p, 1, 2, True ); + } + return( ControlPlane ); +} + +/* + * integer cube roots by Newton's method + * + * Stephen Gildea, MIT X Consortium, July 1991 + */ + +/* Newton's Method: x_n+1 = x_n - ( f(x_n) / f'(x_n) ) */ + +/* for cube roots, x^3 - a = 0, x_new = x - 1/3 (x - a/x^2) */ + +/* + * Quick and dirty cube roots. Nothing fancy here, just Newton's method. + * Only works for positive integers (since that's all we need). + * We actually return floor(cbrt(a)) because that's what we need here, too. + */ + +static int icbrt_with_guess(a, guess) + int a, guess; +{ + register int delta; + + if (a <= 0) + return 0; + if (guess < 1) + guess = 1; + + do { + delta = (guess - a/(guess*guess))/3; + guess -= delta; + } while (delta != 0); + + if (guess*guess*guess > a) + guess--; + + return guess; +} + +static int icbrt_with_bits(a, bits) + int a; + int bits; /* log 2 of a */ +{ + return icbrt_with_guess(a, a>>2*bits/3); +} + +int icbrt(a) /* integer cube root */ + int a; +{ + register int bits = 0; + register unsigned n = a; + + while (n) + { + bits++; + n >>= 1; + } + return icbrt_with_bits(a, bits); +} diff --git a/xie/xc/programs/xieperf/xieperf.h b/xie/xc/programs/xieperf/xieperf.h new file mode 100644 index 0000000..2dd04db --- /dev/null +++ b/xie/xc/programs/xieperf/xieperf.h @@ -0,0 +1,572 @@ +/* $XConsortium: xieperf.h,v 1.16 94/04/17 20:39:42 rws Exp $ */ + +/**** module xieperf.h ****/ +/****************************************************************************** + +Copyright (c) 1993, 1994 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + + + NOTICE + +This software is being provided by AGE Logic, Inc. under the +following license. By obtaining, using and/or copying this software, +you agree that you have read, understood, and will comply with these +terms and conditions: + + Permission to use, copy, modify, distribute and sell this + software and its documentation for any purpose and without + fee or royalty and to grant others any or all rights granted + herein is hereby granted, provided that you agree to comply + with the following copyright notice and statements, including + the disclaimer, and that the same appears on all copies and + derivative works of the software and documentation you make. + + "Copyright 1993, 1994 by AGE Logic, Inc." + + THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of + example, but not limitation, AGE LOGIC MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS + FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT + INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC + SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO + EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, + INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS + OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR + ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR + BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES + HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + The name of AGE Logic, Inc. may not be used in + advertising or publicity pertaining to this software without + specific, written prior permission from AGE Logic. + + Title to this software shall at all times remain with AGE + Logic, Inc. +***************************************************************************** + + xieperf.h -- xieperf header file + + Syd Logan -- AGE Logic, Inc. + +*****************************************************************************/ + +#ifndef VMS +#include +#include +#else +#include +#endif + +#ifndef VMS +#include +#include +#else +#include +#include +#endif +#include +#include + +#ifndef NULL +#define NULL 0 +#endif + +#include +#include +#ifndef X_NOT_STDC_ENV +#include +#else +char *malloc(); +char *realloc(); +#endif +#include + + +#define WIDTH 600 /* Size of large window to work within */ +#define HEIGHT 600 + +#define MONWIDTH 350 +#define MONHEIGHT 200 + +typedef Bool (*InitProc) (/* XParms xp; Parms p */); +typedef void (*Proc) (/* XParms xp; Parms p */); + +extern void NullProc (/* XParms xp; Parms p */); +extern Bool NullInitProc (/* XParms xp; Parms p */); + +#define VALL 1 /* future use - see x11perf.h */ + +typedef unsigned char Version; /* ditto */ + +#define ClampInputs 1 +#define ClampOutputs 2 + +#define Drawable 1 +#define DrawablePlane 2 + +#define NoObscure 0 +#define Obscured 1 +#define Obscuring 2 + +#define Overlap 1 +#define NoOverlap 2 + +/* geometry stuff */ + +#define GEO_TYPE_CROP 1 +#define GEO_TYPE_SCALE 2 +#define GEO_TYPE_MIRRORX 3 +#define GEO_TYPE_MIRRORY 4 +#define GEO_TYPE_MIRRORXY 5 +#define GEO_TYPE_ROTATE 6 +#define GEO_TYPE_DEFAULT 7 +#define GEO_TYPE_SCALEDROTATE 8 + +/* for the tests which can have ROIs and control planes, these are the + options. Cannot support ROIs and Control Planes at same time, so these + are mutually exclusive choices */ + +#define DomainNone 0 +#define DomainROI 1 +#define DomainCtlPlane 2 + +/* capabilities masks */ + +/* the low 8 bits of the short are for test requirements. Bit positions not + defined below are reserved for future expansion */ + +#define CAPA_EVENT ( 1 << 0 ) +#define CAPA_ERROR ( 1 << 1 ) + +#define CAPA_MASK 0x00ff + +#define IsEvent(x) ( x & CAPA_EVENT ? 1 : 0 ) +#define IsError(x) ( x & CAPA_ERROR ? 1 : 0 ) + +#define IsFaxImage( x ) ( x == xieValDecodeG42D || \ + x == xieValDecodeG32D || \ + x == xieValDecodeTIFFPackBits || \ + x == xieValDecodeTIFF2 || \ + x == xieValDecodeG31D ) + +#define IsColorVisual( visclass ) ( visclass == StaticColor || visclass == \ + PseudoColor || visclass == DirectColor || visclass == TrueColor ? 1 : 0 ) + +#define IsTrueColorOrDirectColor( visclass ) ( visclass == TrueColor || \ + visclass == DirectColor ) + +#define IsGrayVisual( visclass ) ( !IsColorVisual( visclass ) ) + +#define IsStaticVisual( visclass ) ( visclass == StaticColor || visclass == TrueColor\ + || visclass == StaticGray ) + +#define IsDynamicVisual( visclass ) ( !IsStaticVisual( visclass ) ) + +/* protocol subset masks */ + +/* the high 8 bits of the short are for XIE subsets. Again, those bits not + defined are reserved for future use */ + +#define SUBSET_MASK 0xff00 +#define SUBSET_FULL ( xieValFull << 8 ) +#define SUBSET_DIS ( xieValDIS << 8 ) + +#ifndef MAX +#define MAX( a, b ) ( a > b ? a : b ) +#endif +#ifndef MIN +#define MIN( a, b ) ( a < b ? a : b ) +#endif + +#define IsFull( x ) ( x & SUBSET_FULL ? 1 : 0 ) +#define IsDIS( x ) ( x & SUBSET_DIS ? 1 : 0 ) +#define IsDISAndFull( x ) ( IsFullTest( x ) && IsDISTest( x ) ) + +/* + * configuration shared by all tests + */ + +/* image configuration - could be nicer, but put info for all + decode techniques in this one struct */ + +typedef struct _Image { + char *fname; /* filename */ + int fsize; /* size in bytes. set in init function */ + int bandclass; /* singleband or tripleband */ + int width[ 3 ]; /* width of image */ + int height[ 3 ]; /* height of image */ + int depth[ 3 ]; /* pixel depth */ + unsigned long levels[ 3 ]; /* 1 << depth */ + int decode; /* decode method */ + int fill_order; + int pixel_order; + int pixel_stride[ 3 ]; + int scanline_pad[ 3 ]; + int left_pad[ 3 ]; + int interleave; + int band_order; + unsigned int chksum; + char *data; /* image data */ +} XIEimage; + +/* a file represents an image. 4 files per test are supported */ + +typedef struct _XIEfile { + XIEimage *image1; + XIEimage *image2; + XIEimage *image3; + XIEimage *image4; +} XIEifile; + +/* test parameters */ + +typedef struct _Parms { + /* Required fields */ + int objects; /* Number of objects to process in one X call */ + /* Optional fields */ + int description; /* server requirements flags */ + int buffer_size; /* size when sending/reading data from xie */ + XIEifile finfo; /* image file info */ + XPointer ts; /* test specifics */ +} ParmRec, *Parms; + +/* + * test specific configuration. One structure per C source file. + */ + +typedef struct _abortParms { + int lutSize; + int lutLevels; +} AbortParms; + +typedef struct _encodeParms { + int encode; /* encode technique */ + char *parms; /* encode technique structs */ + Bool exportClient; /* if True, ECP. Else, EP */ + unsigned char scale; /* For JPEG q_table scaling */ +} EncodeParms; + +typedef struct _eventParms { + int event; +} EventParms; + +typedef struct _rgbParms { + int colorspace; + int which; +#define RGB_FF 1 +#define RGB_IF 2 +#define RGB_II 3 + XieMatrix toMatrix; + XieMatrix fromMatrix; + XieWhiteAdjustTechnique whiteAdjust; + XieConstant whitePoint; + XieGamutTechnique gamut; + XieLTriplet RGBLevels; + XieConstant luma; + XieConstant bias; + XieFloat scale; +} RGBParms; + +typedef struct _errorParms { + int error; +} ErrorParms; + +typedef struct _awaitParms { + int lutSize; + int lutLevels; +} AwaitParms; + +#define BandExtract 1 +#define BandSelect 2 + +typedef struct _bandParms { + XieConstant c1; + XieConstant c2; + XieConstant c3; + int which; /* BandExtract or BandSelect */ + float bias; + Atom atom; + Bool useStdCmap; +} BandParms; + +typedef struct _blendParms { + XieConstant constant; + XieFloat alphaConstant; + int bandMask; + int useDomain; + int numROIs; +} BlendParms; + +typedef struct _constrainParms { + Bool photoDest; + int constrain; + int clamp; +} ConstrainParms; + +typedef struct _creatDstryParms { + int dummy; +} CreateDestroyParms; + +typedef struct _cvtToIndexParms { + int dither; + Bool useDefaultCmap; + Bool flo_notify; + Bool addCvtFromIndex; +} CvtToIndexParms; + +typedef struct _ditherParms { + int dither; + int drawable; + float threshold; + int bandMask; +} DitherParms; + +typedef struct _exportClParms { + int numROIs; /* ExportClientROI */ + + /* following are for ExportClientHistogram with ROIs */ + + int useDomain; + short x; + short y; + short width; + short height; +} ExportClParms; + +typedef struct _geometryParms { + int geoType; + int geoHeight; + int geoWidth; + int geoXOffset; + int geoYOffset; + XieGeometryTechnique geoTech; + int geoAngle; + Bool radiometric; +} GeometryParms; + +typedef struct _logicalParms { + XieConstant logicalConstant; + unsigned long logicalOp; + int logicalBandMask; + int useDomain; + int numROIs; +} LogicalParms; + +typedef struct _importParms { + int obscure; + int numROIs; +} ImportParms; + +typedef struct _importClParms { + int numROIs; +} ImportClParms; + +typedef struct _pasteUpParms { + int overlap; +} PasteUpParms; + +typedef struct _redefineParms { + XieConstant constant; + int bandMask; + unsigned long op1; + unsigned long op2; +} RedefineParms; + +typedef struct _modifyParms { + XieConstant constant; + int bandMask; + unsigned long op; +} ModifyParms; + +typedef struct _pointParms { + Bool photoDest; + int levelsIn; + int levelsOut; + int useDomain; + short x; + short y; + short width; + short height; + int bandMask; +} PointParms; + +typedef struct _funnyEncodeParms { + int floElements; + XieOrientation *fillOrder; + XieOrientation *pixelOrder; + unsigned char *pixelStride; + unsigned char *scanlinePad; + XieOrientation *bandOrder; + XieInterleave *interleave; + Bool useMyLevelsPlease; + XieLTriplet myBits; +} FunnyEncodeParms; + +typedef struct _triplePointParms { + int useDomain; + short x; + short y; + short width; + short height; + Atom atom; + int bandMask; + int ditherTech; + int threshold; +} TriplePointParms; + +typedef struct _unconstrainParms { + int constrain; +} UnconstrainParms; + +typedef struct _purgeColStParms { + int dummy; +} PurgeColStParms; + +typedef struct _compareParms { + XieCompareOp op; + XieConstant constant; + Bool combine; + unsigned int bandMask; + int useDomain; + short x; + short y; + short width; + short height; +} CompareParms; + +typedef struct _arithmeticParms { + XieArithmeticOp op; + XieConstant constant; + unsigned int bandMask; + int useDomain; + short x; + short y; + short width; + short height; + Bool constrain; + XieConstrainTechnique constrainTech; + float inLow; + float inHigh; +} ArithmeticParms; + +typedef struct _mathParms { + XieMathOp *ops; + int nops; + unsigned int bandMask; + int useDomain; + short x; + short y; + short width; + short height; + Bool constrain; + XieConstrainTechnique constrainTech; + float inLow; + float inHigh; +} MathParms; + +typedef struct _convolveParms { + Bool photoDest; + unsigned int bandMask; + int useDomain; + short x; + short y; + short width; + short height; + XieConvolveTechnique tech; + XieConstant constant; + int ( * kfunc )(); +} ConvolveParms; + +typedef struct _queryParms { + int lutSize; + int lutLevels; + XieTechniqueGroup techGroup; +} QueryParms; + +typedef struct _matchHistogramParms { + XieHistogramShape shape; + double mean; + double sigma; + double constant; + Bool shape_factor; + int useDomain; + short x; + short y; + short width; + short height; +} MatchHistogramParms; + +typedef struct _XParms { + Display *d; + char *displayName; /* see do_await.c */ + Window w; + Window p; + GC fggc; + GC bggc; + unsigned long foreground; + unsigned long background; + XVisualInfo vinfo; + Bool pack; + Version version; + int screenDepth; /* effective depth of drawables */ +} XParmRec, *XParms; + +typedef int TestType; + +typedef struct _Test { + char *option; /* Name to use in prompt line */ + char *label; /* Fuller description of test */ + InitProc init; /* Initialization procedure */ + Proc proc; /* Timed benchmark procedure */ + Proc passCleanup;/* Cleanup between repetitions of same test */ + Proc cleanup; /* Cleanup after test */ + Version versions; /* future expansion */ + TestType testType; /* future expansion */ + int clips; /* Number of obscuring windows to force clipping*/ + ParmRec parms; /* Parameters passed to test procedures */ +} Test; + +extern Test test[]; + +#define ForEachTest(x) for (x = 0; test[x].option != NULL; x++) + +XiePhotomap GetXIEPhotomap(); +XieRoi GetXIERoi(); +XieLut GetXIELut(); +Display *GetDisplay(); + +/***************************************************************************** + +For repeatable results, XIEperf should be run using a local connection on a +freshly-started server. The default configuration runs each test 5 times, in +order to see if each trial takes approximately the same amount of time. +Strange glitches should be examined; if non-repeatable I chalk them up to +daemons and network traffic. Each trial is run for 5 seconds, in order to +reduce random time differences. The number of objects processed per second is +displayed to 3 significant digits, but you'll be lucky on most UNIX system if +the numbers are actually consistent to 2 digits. + +******************************************************************************/ diff --git a/xie/xc/programs/xieperf/xieperf.man b/xie/xc/programs/xieperf/xieperf.man new file mode 100644 index 0000000..1f81498 --- /dev/null +++ b/xie/xc/programs/xieperf/xieperf.man @@ -0,0 +1,793 @@ +.\" $XConsortium: xieperf.man /main/7 1995/12/15 14:04:04 gildea $ +.\" Copyright (c) 1993, 1994 X Consortium +.\" +.\" Permission is hereby granted, free of charge, to any person obtaining +.\" a copy of this software and associated documentation files (the +.\" "Software"), to deal in the Software without restriction, including +.\" without limitation the rights to use, copy, modify, merge, publish, +.\" distribute, sublicense, and/or sell copies of the Software, and to +.\" permit persons to whom the Software is furnished to do so, subject to +.\" the following conditions: +.\" +.\" The above copyright notice and this permission notice shall be included +.\" in all copies or substantial portions of the Software. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +.\" OTHER DEALINGS IN THE SOFTWARE. +.\" +.\" Except as contained in this notice, the name of the X Consortium shall +.\" not be used in advertising or otherwise to promote the sale, use or +.\" other dealings in this Software without prior written authorization +.\" from the X Consortium. +.\" +.\" +.\" NOTICE +.\" +.\" This software is being provided by AGE Logic, Inc. under the +.\" following license. By obtaining, using and/or copying this software, +.\" you agree that you have read, understood, and will comply with these +.\" terms and conditions: +.\" +.\" Permission to use, copy, modify, distribute and sell this +.\" software and its documentation for any purpose and without +.\" fee or royalty and to grant others any or all rights granted +.\" herein is hereby granted, provided that you agree to comply +.\" with the following copyright notice and statements, including +.\" the disclaimer, and that the same appears on all copies and +.\" derivative works of the software and documentation you make. +.\" +.\" "Copyright 1993, 1994 by AGE Logic, Inc." +.\" +.\" THIS SOFTWARE IS PROVIDED "AS IS". AGE LOGIC MAKES NO +.\" REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. By way of +.\" example, but not limitation, AGE LOGIC MAKE NO +.\" REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS +.\" FOR ANY PARTICULAR PURPOSE OR THAT THE SOFTWARE DOES NOT +.\" INFRINGE THIRD-PARTY PROPRIETARY RIGHTS. AGE LOGIC +.\" SHALL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE. IN NO +.\" EVENT SHALL EITHER PARTY BE LIABLE FOR ANY INDIRECT, +.\" INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOSS +.\" OF PROFITS, REVENUE, DATA OR USE, INCURRED BY EITHER PARTY OR +.\" ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT OR +.\" BASED ON A WARRANTY, EVEN IF AGE LOGIC LICENSEES +.\" HEREUNDER HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH +.\" DAMAGES. +.\" +.\" The name of AGE Logic, Inc. may not be used in +.\" advertising or publicity pertaining to this software without +.\" specific, written prior permission from AGE Logic. +.\" +.\" Title to this software shall at all times remain with AGE +.\" Logic, Inc. +.TH xieperf 1 "Release 6.1" "X Version 11" +.SH NAME +xieperf - XIE server extension test and demo program +.SH SYNTAX +.B xieperf +[-option ...] +.SH DESCRIPTION +The +.I xieperf +program is based upon R5 +.I x11perf(1) +, and while not entirely comprehensive in its coverage of the XIE +protocol (see BUGS, below), it is intended to be useful in the evaluation of +XIE implementations in the areas of protocol adherance and performance. +The +.I xieperf +program includes tests which execute each of the protocol requests and photoflo +elements specified by revision 5.0 of the XIE protocol. In addition, +.I xieperf +provides a set of tests which can be used to validate the detection and +transmission of XIE protocol request errors, such as FloMatch, FloValue, and +so forth. Finally, +.I xieperf +provides a customizable demonstration program for XIE. +.PP +A test is made up of three components executed in sequence - an +initialization function, a test function, and an end function. The +initialization function is responsible for allocating and populating test +resources, such as photomaps and LUTs, and for creating a stored photoflo +which will be executed by the test function. The test function, in most cases, +simply executes the stored photoflo for a specified number of repetitions. +The end function, which is called following the test function, is used +primarily to destroy any non-cachable server resources used by the test, and +to free any memory which was dynamically allocated by the client. Some tests, +such as -modify1, -await, -abort, and -redefine, perform additional steps +within the test function inner loop, as required by the element being tested, +or in an attempt to make the test more visually appealing. +.PP +Evaluating the performance of individual XIE elements is not +as simple as measuring Core X drawing times. The XIE +protocol requires elements to be embedded within photoflos +in order to be exercised, and the minimum possible photoflo +size is two. This implies that it is impossible to measure +performance of a single element in isolation - the time it +takes to run the flo depends on what other elements exist in +the flo. Extrapolating performance of a single elment +(or technique) in a flo must be done carefully, on a case-by-case +basis, since in general measured element performance depends on +input image size, data type, and other factors, all of which can +be influenced by upstream flo elements. Note further that the +number and type of elements in a flo can be influenced by the +visuals available on the display, so even flo-flo comparisons +on machines with different visuals must be done with caution. +.PP +Many test labels contain an abbreviated pipeline description. For +instance. IP/IL/P/ED indicates ImportPhotomap, ImportLUT, Point, and +ExportDrawable. Pipelines ending in ED (ExportDrawable) often include +hidden elements such as BandExtract, ConvertToIndex, Dither, or Point +to match the flo output to the screen visual. Pipelines ending in EP +(ExportPhotomap) will result in a blank window. +.PP +.I xieperf +is compatible with +.I x11perfcomp(1), +which is used to compare the outputs of different +.I xieperf +and +.I x11perf +runs in a nice, tabular format. In +.I xieperf +you will need to use the -labels option (see OPTIONS, below), and provide +the resulting labels file to +.I x11perfcomp(1) +to obtain correct output. See the +.I x11perfcomp(1) +man pages for more details on this. +.SH OPTIONS +.I xieperf +accepts the options listed below: +.TP 14 +.B \-display host:dpy +Specifies which display to use. +.TP 14 +.B \-images \fI\fP +Normally, +.I xieperf +references image files located in the directory ``images'', which +.I xieperf +assumes is located in your current directory. If the ``images'' directory is +not in your current directory, or the file has been renamed, use this option +to specify its location. +.TP 14 +.B \-timeout \fI\fP +Some tests require the reception of an event such as FloNotify to continue, and +may cause +.I xieperf +to hang should these events not be received. This option allows the user to +specify a timeout value which, if exceeded, will cause +.I xieperf +to give up waiting for an event, and continue on with the next test in sequence. +Should an event timeout, a warning message will be printed to stderr. The +default timeout value is 60 seconds. +.TP 14 +.B \-sync +Runs the tests in synchronous mode. +.TP 14 +.B \-script \fI\fP +Using this option gives the user the ability to run a subset of the available +tests and control the number of times the tests are executed on an individual +basis. This is thought to be especially useful for those running +.I xieperf +for demonstration purposes. Using this option causes +.I xieperf +to read commands specified in a script file, or from stdin if \fI\fP is +``-''. Tests are specified by newline-terminated input lines of the form +"command [-reps n ] [ -repeat m ]". Characters following and including "#" +are treated as comments. See the -mkscript option. +.TP 14 +.B \-repeat \fI\fP +Repeats each test +.I n +times (by default each test is run 2 times). This option may be used in +script files also, in which case the script file -repeat overrides the +command line option. +.TP 14 +.B \-time \fI\fP +Specifies how long in seconds each test should be run (default 5 seconds). +.TP 14 +.B \-depth +Use a visual with planes per pixel (default is the default +visual). +.TP 14 +.B \-GrayScale +Use a GrayScale visual (default is the default visual). +.TP 14 +.B \-PseudoColor +Use a PseudoColor visual (default is the default visual). +.TP 14 +.B \-StaticGray +Use a StaticGray visual (default is the default visual). +.TP 14 +.B \-StaticColor +Use a StaticColor visual (default is the default visual). +.TP 14 +.B \-TrueColor +Use a TrueColor visual (default is the default visual). +.TP 14 +.B \-DirectColor +Use a DirectColor visual (default is the default visual). +.TP 14 +.B \-WMSafe +If +.I xieperf +must be run in a window manager environment, use this flag to make +.I xieperf +aware of this. If specified, +.I xieperf +will create a window, identical to the size of the root window, and all +further windows created by +.I xieperf +will be transient popup children of this window. If this flag is omitted, +.I xieperf +will set the override_redirect attribute of all windows to ``True'' +and will also do evil things such as calling XInstallColormap. +Using this option will cause the window +manager to (hopefully) obey window geometry hints specified by +.I xieperf +.TP 14 +.B \-showtechs +Display a comprehensive list of techniques, by category, indicating which of +the techniques are supported by the XIE server. +.TP 14 +.B \-showlabels +Print test label to screen prior to calling any of the test code. This allows +the user to know which test is executing in case the test hangs for some reason. +.TP 14 +.B \-showevents +Be verbose when running event and error tests. Also, can be used to catch and +display information on any signals received during execution of +.I xieperf +. Note that this flag is best used in a debugging situation, or to validate +that the error events received by +.I xieperf +are valid the first time the tests are executed on a new platform. +.TP 14 +.B \-events +Run tests which test for event generation. +.TP 14 +.B \-errors +Run tests which test for error event generation. +.TP 14 +.B \-loCal +Skip test calibration. This may be used when running +.I xieperf +in situations where execution timing is not important. Execution times will +not be reported by +.I xieperf +when this option is enabled. The inner loop repeat count, additionally, is +set to a value of 5 (but can be overridden by the -reps option). +.TP 14 +.B \-all +Runs all tests. This may take a while, depending on the speed of your machine, +and its floating point capabilities. This option is ignored if a script file +is used. +.TP 14 +.B \-tests +Generate a list of the available tests for the +.I xieperf +program. In +.I x11perf +, this list is normally displayed in the usage statement. It was yanked from +the usage of +.I xieperf +because it was too lengthy. +.TP 14 +.B \-mkscript +Generate a script file suitable for use with the script option. If -repeat +or -reps are also specified, they will be automatically placed at the end +of each command in the script. The script is generated to stderr. See the +-script command, above. +.TP 14 +.B \-cache \fI\fP +Most test flos utilize a photomap resource for a source. A photomap cache +of up to n entries is controlled by +.I xieperf +to avoid having to constantly reload these images during test initialization. +The default cache size is 4. If a value less than the default is specified, the cache size will be set to the default. +.TP 14 +.B \-labels +Generates just the descriptive labels for each test specified. Use -all or +-range to specify which tests are included. See +.I x11perfcomp(1) +for more details. +.TP 14 +.B \-DIS +Pretend we are running +.I xieperf +while connected to a DIS-only capable implementation of XIE. This will cause +.I xieperf +to execute those tests which only use protocol requests found in the DIS subset of +XIE, and bypass those which are not DIS compatible. If +.I xieperf +detects a DIS server, it will do this automatically, and this option is ignored. +Use -all or -range to specify the initial range of tests. +.TP 14 +.B \-range \fI\fP[,\fI\fP] +Runs all the tests starting from the specified name \fItest1\fP until +the name \fItest2\fP, including both the specified tests. Some tests, +like the event and error tests, also require the -errors or -events +options to specified. This option is ignored if a script it used. +.TP 14 +.B \-reps \fI\fP +Fix the inner loop repetitions to n. This indicates how many time the photoflo +will be executed each time the test is run. This option is overridden on a +per-test basis if specified in a script. Typically, +.I xieperf +determines the ideal number of reps during each test's calibration period. +.TP 14 +.B \-ImportObscuredEvent through \-ExportAvailable +Test generation of events. Requires -events flag. +.TP 14 +.B \-BadValue through \-FloValueError +Test generation of errors. Requires -errors flag. +.B \-ColorList +Create and destroy ColorList resource test. +.TP 14 +.B \-LUT +Create and destroy LUT resource test. +.TP 14 +.B \-Photomap +Create and destroy Photomap resource test. +.TP 14 +.B \-ROI +Create and destroy ROI resource test. +.TP 14 +.B \-Photospace +Create and destroy Photospace test. +.TP 14 +.B \-Photoflo +Create and destroy Photoflo test. +.TP 14 +.B \-QueryPhotomap +Query Photomap resource test. +.TP 14 +.B \-QueryColorList +Query ColorList resource test. +.TP 14 +.B \-QueryTechniquesDefault through \-QueryTechniquesWhiteAdjust +Query techniques as specified by test name. +.TP 14 +.B \-QueryPhotoflo +Query photoflo test. +.TP 14 +.B \-PurgeColorList +PurgeColorList test. +.TP 14 +.B \-Abort +This tests creates a photoflo which is started and blocks for data provided by +PutClientData(). Instead of sending the data, the test uses XieAbort() to +stop the photoflo, and then waits for PhotofloDone event to be send by the +server. If the test times out waiting for the event, a error message is sent +to stderr. +.TP 14 +.B \-Await +This test creates a flo of the form ImportClientLUT -> ExportLUT, and starts +the flo executing. +.I xieperf +then forks, and the child process streams the LUT data to the flo using +PutClientData, while the parent blocks in XieAwait. If the flo successfully +finishes, XieAwait will return and the flo state, after query, will indicate +that it has completed. If XieAwait does not complete naturally, or after return +from XieAwait the flo is still active, an error is reported to stderr. Note, on +a really slow machine, it is possible that XieAwait will return before the +flo has a chance to finish. In this case, use the -timeout option to increase +the timeout for this test. +.TP 14 +.B \-importclientlut1 +ImportClientLUT -> ExportLUT test. +.TP 14 +.B \-importclientphoto1 through \-importclientphoto9 +Flos of the form ImportClientPhoto -> ExportPhotomap using various +decode techniques, e.g. G32D, TIFF2, UncompressedTriple, and so forth. +.TP 14 +.B \-importclientroi1 +ImportClientROI with 10 rectangles. +.TP 14 +.B \-importclientroi2 +ImportClientROI with 100 rectangles. +.TP 14 +.B \-encodephoto1 through \-encodephoto14 +Flos of the form ImportPhotomap -> ExportPhotomap using various +encode techniques, e.g. G32D, TIFF2, UncompressedTriple, and so forth. +Original encoding is shown in left window, image after encoding is +shown in right window. +.TP 14 +.B \-encodeclientphoto1 through \-encodeclientphoto11 +Two flos, one of the form ImportPhotomap -> ExportClientPhoto, and the +other of the form ImportClientPhoto -> ExportPhotomap, where ExportClientPhoto +in the first flo uses various encode techniques, e.g. G32D, TIFF2, +UncompressedTriple, and so forth. The image before encoding is displayed in +the left window, while the right window shows the image which was encoded +in the first flo and read back in the second flo. +.TP 14 +.B \-exportclientlut1 +ExportClientLUT test. LUT is displayed in a histogram window. +.TP 14 +.B \-exportclientroi1 +ExportClientROI test, 10 ROIs. The ROIs which are sent to the server are +represented by the filled rectangles. The ROIs which are received back from +the server by the client are drawn as white bordered non-filled rectangles. +The resulting output illustrates how the server combined the rectangles sent +to it. +.TP 14 +.B \-exportclientroi2 +Same as exportclientroi1, except using 100 rectangles. +.TP 14 +.B \-exportclienthistogram1 through \-exportclienthistogram4 +ExportClientHistogram tests using various images. The histogram is displayed +in a window which overlaps the image. +.TP 14 +.B \-exportclienthistogramroi1 through \-exportclienthistogramroi4 +Same as the ExportClientHistogram test, but using a ROI to identify the area +of interest. +.TP 14 +.B \-exportclienthistogramcplane1 through \-exportclienthistogramcplane4 +Same as the ExportClientHistogram test, but using a Control Plane to identify the area of interest. +.TP 14 +.B \-importlut1 +Test ImportLUT element, LUT size is 256. +.TP 14 +.B \-importphoto1 +ImportPhotomap -> ExportPhotomap, with source and destination equal. +.TP 14 +.B \-importphoto2 +ImportPhotomap -> ExportDrawable, window destination. +.TP 14 +.B \-importroi1 +ImportROI -> ExportROI, 10 rectangles, source and destination ROIs equal. +.TP 14 +.B \-importroi2 +ImportROI -> ExportROI, 100 rectangles, source and destination ROIs equal. +.TP 14 +.B \-importdrawable1 +ImportDrawable -> ExportDrawable, Source is pixmap, destination is window. +.TP 14 +.B \-importdrawable2 +ImportDrawable -> ExportDrawable, Source and destination is window. +.TP 14 +.B \-importdrawable3 +ImportDrawable -> ExportDrawable, Destination window obscured by source window. +.TP 14 +.B \-importdrawable4 +ImportDrawable -> ExportDrawable, Source window obscured by destination window. +.TP 14 +.B \-importdrawable5 +ImportDrawablePlane -> ExportDrawablePlane, pixmap, source = destination. +.TP 14 +.B \-importdrawable6 +ImportDrawablePlane -> ExportDrawablePlane, window, source = destination. +.TP 14 +.B \-importdrawable7 +ImportDrawablePlane -> ExportDrawablePlane, window, source obscures destination. +.TP 14 +.B \-importdrawable8 +ImportDrawablePlane -> ExportDrawablePlane, window, destination obscures source. +.TP 14 +.B \-constrain1 +Constrain HardClip technique test, drawable destination. +.TP 14 +.B \-constrain2 +Constrain ClipScale technique test, drawable destination. +.TP 14 +.B \-constrainphoto1 +Constrain HardClip technique test, photomap destination. +.TP 14 +.B \-constrainphoto2 +Constrain ClipScale technique test, photomap destination. +.TP 14 +.B \-convolve1 +Boxcar 3x3 convolution test. Smoothing or lowpass filter. +.TP 14 +.B \-convolve2 +Boxcar 5x5 convolution test. Smoothing or lowpass filter. +.TP 14 +.B \-convolve3 +LaPlacian 3x3 convolution test. Edge or highpass filter. +.TP 14 +.B \-convolve4 +LaPlacian 5x5 convolution test. Edge or highpass filter. +.TP 14 +.B \-convolveroi1 +LaPlacian 3x3 convolution test, with ROI. +.TP 14 +.B \-convolveroi2 +LaPlacian 5x5 convolution test, with ROI. +.TP 14 +.B \-convolvecplane1 +LaPlacian 3x3 convolution test, with Control Plane. +.TP 14 +.B \-convolvecplane2 +LaPlacian 5x5 convolution test, with Control Plane. +.TP 14 +.B \-math1 through \-mathcplane7 +Various tests which exercise the Math element, some tests using ROIs and control planes. +.TP 14 +.B \-arithmeticdyadic1 through \-arithmeticdyadic5 +Arithmetic element tests, using photomaps as the operands. +.TP 14 +.B \-arithmeticmonadic1 through \-arithmeticmonadic9 +Arithmetic element tests, photomap and constant operands. +.TP 14 +.B \-arithmeticdyadicroi1 through \-arithmeticdyadicroi5 +Arithmetic element tests, using photomaps as the operands, with ROIs. +.TP 14 +.B \-arithmeticmonadicroi1 through \-arithmeticmonadicroi9 +Arithmetic element tests, photomap and constant operands, with ROIs. +.TP 14 +.B \-arithmeticdyadiccplane1 through \-arithmeticdyadiccplane5 +Arithmetic element tests, using photomaps as the operands, with Control Planes. +.TP 14 +.B \-arithmeticmonadiccplane1 through \-arithmeticmonadiccplane9 +Arithmetic element tests, photomap and constant operands, with Control Planes. +.TP 14 +.B \-arithmeticfloatdyadic1 though \-arithmeticfloatdyadic5 +Arithmetic element tests, using photomaps as the operands, unconstrained. +.TP 14 +.B \-arithmeticfloatmonadic1 though \-arithmeticfloatmonadic9 +Arithmetic element tests, photomap and constant operands, unconstrained. +.TP 14 +.B \-arithmeticroifloatdyadic1 to \-arithmeticroifloatdyadic5 +Arithmetic element tests, photomaps as the operands, ROIs, unconstrained. +.TP 14 +.B \-arithmeticroifloatmonadic1 to -\arithmeticroifloatmonadic9 +Arithmetic element tests, photomap and constant operands, ROIs, unconstrained. +.TP 14 +.B \-band1 +BandSelect element test. Image input is triple band. If visual of +.I xieperf +window is a color visual, then three BandSelect elements are used to extract +the indivudual bands, they are combined once again using BandCombine, and +displayed using ConvertToIndex. If the visual is not color, e.g. GrayScale or +StaticGray, then the flo simply uses one BandSelect element to extract a single +band for display. +.TP 14 +.B \-band2 +BandCombine test. Input bands are made of of three separate single band +photomaps. These are combined using a BandCombine element, which is +followed by a BandExtract and ExportDrawable. CCIR 601-1 coefficients. +.TP 14 +.B \-band3 +BandExtract test. Input is a triple band photomap. CCIR 601-1 coefficients. +Destination window colormap is gray ramp. +.TP 14 +.B \-band4 +BandExtract test. Input is a triple band photomap. CCIR 601-1 coefficients. +Destination window colormap is RGB_BEST_MAP standard colormap. +.TP 14 +.B \-band5 +BandExtract test. Input is a triple band photomap. CCIR 601-1 coefficients. +Destination window colormap is RGB_DEFAULT_MAP standard colormap. +.TP 14 +.B \-comparedyadic1 through \-comparedyadic6 +Test various Compare operators with dyadic photomap operands. +.TP 14 +.B \-comparemonadic1 through \-comparemonadic6 +Test various compare operators with photomap, constant operands. +.TP 14 +.B \-compareroidyadic1 through \-compareroidyadic6 +Test various Compare operators with dyadic photomap operands, using ROIs. +.TP 14 +.B \-compareroimonadic1 through \-compareroimonadic6 +Test various compare operators with photomap, constant operands, using ROIs. +.TP 14 +.B \-comparecplanedyadic1 through \-comparecplanedyadic6 +Test various Compare operators with dyadic photomap operands, Control Planes. +.TP 14 +.B \-comparecplanemonadic1 through \-comparecplanemonadic6 +Test various compare operators with photomap, constant operands, Control Planes. +.TP 14 +.B \-matchhistogram1 through \-matchhistogram18 +MatchHistogram element tests, using various images and histogram matching techniques. +.TP 14 +.B \-matchhistogramroi1 through \-matchhistogramroi6 +A selection of MatchHistogram element tests, with ROIs. +.TP 14 +.B \-matchhistogramcplane1 through \-matchhistogramcplane6 +A selection of MatchHistogram element tests, with Control Planes. +.TP 14 +.B \-unconstrain1 +ImportPhotomap, Unconstrain, Constrain(ClipScale), ExportDrawable test. +.TP 14 +.B \-pasteup1 through \-pasteup2 +PasteUp element tests. +.TP 14 +.B \-geometry1 through \-geometry14 +Geometry element tests, including rotations, scales, and mirroring. +NearestNeighbor technique. +.TP 14 +.B \-geometry15 through \-geometry28 +Geometry element tests, including rotations, scales, and mirroring. +AntiAlias technique. +.TP 14 +.B \-geometry29 through \-geometry42 +Geometry element tests, including rotations, scales, and mirroring. +BilinearInterpolation technique. +.TP 14 +.B \-geomg31dscale1 through \-geometryfaxradio1 +Tests to exercise the various FAX decoders and the Geometry element. +.TP 14 +.B \-dither1 +Dither test, ErrorDiffusion dither technique, ExportDrawable. +.TP 14 +.B \-dither2 +Dither test, ErrorDiffusion dither technique, ExportDrawablePlane. +.TP 14 +.B \-dither3 +Dither test, Ordered(4) dither technique, ExportDrawable. +.TP 14 +.B \-dither4 +Dither test, Ordered(4) dither technique, ExportDrawablePlane. +.TP 14 +.B \-dither5 +Dither test, Ordered(8) dither technique, ExportDrawable. +.TP 14 +.B \-dither6 +Dither test, Ordered(8) dither technique, ExportDrawablePlane. +.TP 14 +.B \-dither7 +Dither test, Default dither technique, ExportDrawable. +.TP 14 +.B \-dither8 +Dither test, Default dither technique, ExportDrawablePlane. +.TP 14 +.B \-logicalmonadic1 through \-logicalmonadic16 +Logical element, photomap and a constant of 0 as operands, various operators. +.TP 14 +.B \-logicaldyadic1 through \-logicaldyadic16 +Logical element tests, dyadic photomaps as operands, various operators. +.TP 14 +.B \-logicalmonadicroi1 through \-logicalmonadicroi16 +Logical element, photomap and constant of 0 operands, various operators, ROIs. +.TP 14 +.B \-logicaldyadicroi1 through \-logicaldyadicroi16 +Logical element, dyadic photomaps as operands, various operators, ROIs. +.TP 14 +.B \-logicalmonadiccplane1 through \-logicalmonadiccplane16 +Logical element, photomap and constant of 0 operands, various operators, Control Planes. +.TP 14 +.B \-logicaldyadiccplane1 through \-logicaldyadiccplane16 +Logical element, dyadic photomaps as operands, various operators, Control Planes. +.TP 14 +.B \-blend1 +Blend element test. Monadic source, 0.1 source constant. Alpha constant of 0.5. +.TP 14 +.B \-blend2 +Blend element test. Dyadic sources. Alpha constant of 0.5. +.TP 14 +.B \-blendroi1 +Blend test. Monadic source, 0.1 source constant. Alpha constant of 0.5. ROIs. +.TP 14 +.B \-blendroi2 +Blend element test. Dyadic sources. Alpha constant of 0.5. Uses ROIs. +.TP 14 +.B \-blendcplane1 +Blend test. Monadic source, 0.1 source constant. Alpha constant of 0.5. Control Plane. +.TP 14 +.B \-blendcplane2 +Blend element test. Dyadic sources. Alpha constant of 0.5. Control Plane. +.TP 14 +.B \-blendalpha1 +Blend test. Monadic source, 220 source constant. Alpha plane is a photomap. +.TP 14 +.B \-blendalpha2 +Blend test. Dyadic sources. Alpha plane is a constant 220. +.TP 14 +.B \-blendalpharoi1 +Blend test. Monadic source, 220 source constant. Alpha plane photomap. ROIs. +.TP 14 +.B \-blendalpharoi2 +Blend test. Dyadic sources. Alpha plane is a constant 220. ROIs. +.TP 14 +.B \-triplepoint1 through \-triplepoint2 +Illustrate use of point and Standard colormaps for rendering triple band images. +.TP 14 +.B \-funnyencode1 through \-funnyencode8 +These tests are design to perform limited exercising of XIE's capability of +dealing with various encodings of flo source data. The test init function +obtains a photomap using ICP -> EP. A series of independent permanent flo pairs, +one of the form IP -> EP, and the other of the basic form IP -> ED, are +constructed. The encoding parameters for the ExportPhotomap (EP) element +in the first flo are derived from test configuration. The number of flo +pairs created is also dependent upon test configuration. The tests can +be configured so that the test init function will constrain the input +photomap to a specified number of levels, on a per-band basis, so that +word-sized and quad-sized pixels are passed through the flos. Some tests +below take advantage of this. See tests.c for test configuration, and +hints on how to add similar tests. +.TP 14 +.B \-point1 through \-point3 +Simple Point element tests. Drawable destination. +.B \-pointroi1 +Simple Point element test which uses ROIs. Drawable destination. +.TP 14 +.B \-pointcplane1 +Simple Point element test which uses a Control Plane. Drawable destination. +.TP 14 +.B \-pointphoto1 +Simple Point element test. Photomap destination. +.TP 14 +.B \-pointroiphoto1 +Simple Point element test which uses a ROIs. Photomap destination. +.TP 14 +.B \-pointcplanephoto1 +Simple Point element test which uses a Control Plane. Photomap destination. +.TP 14 +.B \-redefine +Two flographs are created which are the same in structure, expect for the +x and y offsets specified for the ExportDrawable flo elements. The test +init function creates a photoflo based upon one of the two flographs. +The inner loop of the test function uses XieRedefinePhotoflo() to alternate +between each of the flographs. Make sure that your ineer loop reps are +2 or greater in order to exercise this test fully (see -reps). +.TP 14 +.B \-modify1 +Test XieModifyPhotoflo() by adjust ROI offsets and size. +.TP 14 +.B \-modify2 +Test XieModifyPhotoflo() by changing the LUT input to a Point element. +.TP 14 +.B \-modify3 +Test XieModifyPhotoflo() by changing ExportDrawable x and y offsets. +.TP 14 +.B \-modify4 +This test creates a rather long flo of arithmetic elements, each which does +nothing more than add 1 to a small image. The test init function +scales the input photomap. The ExportDrawable x and y offset is modified +randomly during each iteration of the test function inner loop. +.TP 14 +.B \-modify5 +This test creates a rather long flo of arithmetic elements, each which does +nothing more than add 1 to a large image. Each rep, the Geometry +and ExportDrawable elements at the end of the flo are modifed to +crop a small piece of the +input into its appropriate place in the larger image. +.TP 14 +.B \-rgb1 through \-rgb16 +These tests all basically take an UncompressedTriple image as input, send it +to ConvertFromRGB which converts the image to some configured colorspace, +and then send the converted image on to ConvertToRGB prior to display. The +original image is displayed in the lefthand window, and the image which has +passed through the flo is shown in the righthand window. The goal of these +test is to show that ConvertFromRGB -> ConvertToRGB is lossless. +.TP 14 +.B \-converttoindexpixel +ConvertToIndex test, TripleBand BandByPixel. +.TP 14 +.B \-converttoindexplane +ConvertToIndex test, TripleBand BandByPlane. +.TP 14 +.B \-convertfromindex +The test init function uses a flo containing ConvertToIndex to display an +image in the left window. The test function uses this drawable as input +to a flo which does ConvertFromIndex -> ConvertToIndex and sends the +resulting image to the right window. The result should be lossless. +.TP 14 +.B \-complex +A somewhat large flo which uses control planes, LUTs, Point, PasteUp, Logical, Constrain, Dither, Geometry, MatchHistogram, BandCombine, and BandSelect elements. See the Postscript file ''complex.ps'' for a rendition of the photoflo which is executed. +.SH X DEFAULTS +There are no X defaults used by this program. +.SH "SEE ALSO" +X(1), x11perf(1), x11perfcomp(1) +.SH BUGS +There should be a IMAGES environment variable to augment the -images option. +.PP +Many tests only scratch the surface of possible test cases. +Some of the options available for certain flo elements are either inadequately +tested, or ignored altogether. +There are insufficent tests for bitonal, large pixel, or triple band tests. +.PP +Some of the test names are inconsistently cased, e.g. -Abort and -dither1. +.PP +Some tests are hopelessly slow when run against machines with slow FPUs. +.PP +Bitonal images are for the most part displayed using the ExportDrawable flo +element, however, ExportDrawablePlane would be a better choice. +.SH AUTHOR +Syd Logan, AGE Logic, Inc. diff --git a/xie/xiectl23.py b/xie/xiectl23.py new file mode 100755 index 0000000..3ef0fc2 --- /dev/null +++ b/xie/xiectl23.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 +"""Validate the proposed minimal XIE 2.3 client sequence on one connection: + INIT_SESSION(1) -> QUERY_OP_DEFAULTS(3) -> QUERY_EVENTS(6) -> TERM_SESSION(2) +""" +import os, sys, struct +sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "evidence")) +import xie_raw as X + +s = X.socket.create_connection((X.HOST, X.PORT), timeout=5) +s.settimeout(5.0) +try: + X.setup(s) + present, opcode, ev, er = X.query_extension(s, "Xie") + print("extension present=%d opcode=%d first_event=%d first_error=%d" % (present, opcode, ev, er)) + + def send(minor, payload=b"", words=None): + if words is None: + words = 1 + len(payload) // 4 + data = payload.ljust((words * 4) - 4, b"\0") + s.sendall(struct.pack(" +#include +#include +#include +#include +#include +#include + +static int bpl_for(int w) { return ((w + 31) / 32) * 4; } + +static void set_pixel(unsigned char *data, int bpl, int x, int y, int on) +{ + unsigned char *p = data + y * bpl + (x >> 3); + unsigned char bit = 1u << (x & 7); /* LSBFirst */ + if (on) + *p |= bit; + else + *p &= (unsigned char)~bit; +} + +static void pattern(unsigned char *data, int w, int h, int bpl, const char *kind) +{ + int x, y; + memset(data, 0, (size_t)bpl * h); + if (strcmp(kind, "solid") == 0) { + for (y = 0; y < h; y++) + for (x = 0; x < w; x++) + set_pixel(data, bpl, x, y, 1); + } else if (strcmp(kind, "gradient") == 0) { + for (y = 0; y < h; y++) + for (x = 0; x < w; x++) + set_pixel(data, bpl, x, y, ((x * 16 / w) ^ (y * 16 / h)) & 1); + } else if (strcmp(kind, "rings") == 0) { + int cx = w / 2, cy = h / 2; + for (y = 0; y < h; y++) + for (x = 0; x < w; x++) { + int dx = x - cx, dy = y - cy; + int d = (dx * dx + dy * dy) / 64; + set_pixel(data, bpl, x, y, (d / 16) & 1); + } + } else { /* checker */ + int cell = w / 16; + if (cell < 4) cell = 4; + for (y = 0; y < h; y++) + for (x = 0; x < w; x++) + set_pixel(data, bpl, x, y, ((x / cell) + (y / cell)) & 1); + } +} + +int main(int argc, char **argv) +{ + const char *display = "192.168.99.2:0"; + const char *kind = "checker"; + int w = 640, h = 480, seconds = 30; + int i; + + for (i = 1; i < argc; i++) { + if (!strcmp(argv[i], "-display") && i + 1 < argc) display = argv[++i]; + else if (!strcmp(argv[i], "-width") && i + 1 < argc) w = atoi(argv[++i]); + else if (!strcmp(argv[i], "-height") && i + 1 < argc) h = atoi(argv[++i]); + else if (!strcmp(argv[i], "-seconds") && i + 1 < argc) seconds = atoi(argv[++i]); + else if (!strcmp(argv[i], "-pattern") && i + 1 < argc) kind = argv[++i]; + else { + fprintf(stderr, "usage: %s [-display host:0] [-width N] [-height N] " + "[-seconds N] [-pattern checker|gradient|rings|solid]\n", argv[0]); + return 2; + } + } + + Display *dpy = XOpenDisplay(display); + if (!dpy) { + fprintf(stderr, "xshow: cannot open %s\n", display); + return 1; + } + + int scr = DefaultScreen(dpy); + Visual *vis = DefaultVisual(dpy, scr); + int depth = DefaultDepth(dpy, scr); + if (depth != 1) + fprintf(stderr, "xshow: warning: depth is %d, expected 1\n", depth); + + int bpl = bpl_for(w); + unsigned char *data = calloc((size_t)bpl, (size_t)h); + if (!data) return 1; + pattern(data, w, h, bpl, kind); + + Window win = XCreateSimpleWindow(dpy, RootWindow(dpy, scr), 20, 20, + (unsigned)w, (unsigned)h, 0, + BlackPixel(dpy, scr), WhitePixel(dpy, scr)); + XStoreName(dpy, win, "xshow: core X fallback (not XIE)"); + XSelectInput(dpy, win, ExposureMask | KeyPressMask | ButtonPressMask | + StructureNotifyMask); + GC gc = XCreateGC(dpy, win, 0, NULL); + XSetForeground(dpy, gc, BlackPixel(dpy, scr)); + XSetBackground(dpy, gc, WhitePixel(dpy, scr)); + + XImage *img = XCreateImage(dpy, vis, (unsigned)depth, XYBitmap, 0, + (char *)data, (unsigned)w, (unsigned)h, 32, bpl); + if (!img) { + fprintf(stderr, "xshow: XCreateImage failed\n"); + return 1; + } + img->byte_order = LSBFirst; + img->bitmap_bit_order = LSBFirst; + + XMapWindow(dpy, win); + XPutImage(dpy, win, gc, img, 0, 0, 0, 0, (unsigned)w, (unsigned)h); + XSync(dpy, False); + + /* Verify by reading the window back. A 1-bit XGetImage returns one + * bit per pixel in the server's bit order; compare the on-pixel count + * against the source rather than raw bytes. */ + XImage *got = XGetImage(dpy, win, 0, 0, (unsigned)w, (unsigned)h, + AllPlanes, ZPixmap); + long src_on = 0, got_on = 0; + int x, y; + for (y = 0; y < h; y++) + for (x = 0; x < w; x++) { + unsigned char *p = data + y * bpl + (x >> 3); + if (p[0] & (1u << (x & 7))) src_on++; + if (got && XGetPixel(got, x, y)) got_on++; + } + + if (!got) { + printf("xshow: displayed %dx%d %s on %s, but XGetImage failed\n", + w, h, kind, display); + } else { + printf("xshow: displayed %dx%d %s on %s; source on-pixels=%ld " + "window on-pixels=%ld %s\n", w, h, kind, display, src_on, got_on, + (src_on == got_on) ? "MATCH" : "MISMATCH"); + XDestroyImage(got); + } + printf("xshow: core X fallback window; XIE 2.3 export path is separate\n"); + fflush(stdout); + + time_t end = time(NULL) + seconds; + while (time(NULL) < end) { + while (XPending(dpy)) { + XEvent ev; + XNextEvent(dpy, &ev); + if (ev.type == KeyPress || ev.type == ButtonPress) { + end = 0; + break; + } + } + usleep(100000); + } + + XDestroyImage(img); /* also frees data */ + XFreeGC(dpy, gc); + XDestroyWindow(dpy, win); + XCloseDisplay(dpy); + return 0; +}